diff --git a/.config/lingua.dic b/.config/lingua.dic new file mode 100644 index 000000000000..0ef7f9bef73e --- /dev/null +++ b/.config/lingua.dic @@ -0,0 +1,247 @@ +90 + +&& +1KB +1MB +5MB += +API/SM +APIs +AccountId/MS +Apache-2.0/M +Autogenerated +BFT/M +BTC/S +Best/MS +BlockId +BlockNumber +BridgeStorage +AssetHub +AssetHubKusama +AssetHubPolkadot +AssetHubRococo +AssetHubWococo +AssetHubWestend +BridgeHub +BridgeHubRococo +BridgeHubWococo +BridgeHubKusama +BridgeHubWestend +BridgeHubPolkadot +CLI/MS +Chain1 +Chain2 +ChainSpec +ChainTime +DOT/S +ERC-20 +Ethereum +FN +FinalizationError +GPL/M +GPLv3/M +GiB/S +Handler/MS +Hasher +HeaderA +HeaderId +InitiateChange +Instance1 +Instance2 +Instance42 +KSM/S +KYC/M +KeyPair +Kovan +Lane1 +Lane2 +Lane3 +LaneId +MIN_SIZE +MIT/M +MMR +MaxUnrewardedRelayerEntriesAtInboundLane +MaybeExtra +MaybeOrphan +Merklized +MessageNonce +MessageNonces +MessagePayload +MetricsParams +OldHeader +OutboundMessages +PoA +PoV/MS +Pre +RLP +RPC/MS +Relayer/MS +Runtime1 +Runtime2 +SIZE_FACTOR +SS58 +SS58Prefix +STALL_SYNC_TIMEOUT +SURI +ServiceFactory/MS +SignedExtension +Stringified +Submitter1 +S|N +TCP +ThisChain +TODO +U256 +Unparsed +Vec +WND/S +Westend/MS +Wococo/MS +XCM/S +XCMP/M +annualised/MS +api/SM +aren +arg +args +async +auth +auths/SM +backoff +benchmarking/MS +best_substrate_header +bitfield/MS +blake2/MS +blockchain/MS +borked +chain_getBlock +choosen +config/MS +crypto/MS +customizable/B +debian/M +decodable/MS +delivery_and_dispatch_fee +dev +dispatchable +dispatchables +doesn +ed25519 +enum/MS +entrypoint/MS +ethereum/MS +externality/MS +extrinsic/MS +extrinsics +fedora/M +functor +fuzzer +hasher +hardcoded +https +implementers +include/BG +inherent/MS +initialize/RG +instantiate/B +intrinsic/MS +invariant/MS +invariants +io +isn +isolate/BG +js +jsonrpsee +keccak +keccak256/M +keyring +keystore/MS +kusama/S +lane +malus +max_value +merkle/MS +metadata +misbehavior/SM +misbehaviors +multivalidator/SM +natively +no_std +nonces +number +ok +oneshot/MS +others' +pallet_bridge_grandpa +pallet_bridge_messages +pallet_message_lane +parablock/MS +parachain/MS +param/MS +parameterize/D +plancks +polkadot/MS +pov-block/MS +precommit +promethius +promethius' +provisioner/MS +probabilistically +prune_depth +prune_end +receival +reconnection +redhat/M +repo/MS +runtime/MS +rustc/MS +relayer/MS +shouldn +source_at_target +source_latest_confirmed +source_latest_generated +sp_consensus_grandpa +spawner +sr25519 +src +stringified +struct/MS +submitters/MS +subsystem/MS +subsystems' +subcommand/MS +synchronizer +target_at_source +target_latest_confirmed +target_latest_received +taskmanager/MS +teleport/RG +teleportation/SM +teleporter/SM +teleporters +testnet/MS +timeframe +tokio +timestamp +trie/MS +trustless/Y +tuple +u32 +ubuntu/M +undeliverable +unfinalized +union/MSG +unpruned +unservable/B +unsynced +updatable +validator/SM +ve +vec +verifier +w3f/MS +wakeup +wasm/M +websocket +x2 +~ diff --git a/.config/spellcheck.toml b/.config/spellcheck.toml new file mode 100644 index 000000000000..e061c29ac222 --- /dev/null +++ b/.config/spellcheck.toml @@ -0,0 +1,13 @@ +[hunspell] +lang = "en_US" +search_dirs = ["."] +extra_dictionaries = ["lingua.dic"] +skip_os_lookups = true +use_builtin = true + +[hunspell.quirks] +# `Type`'s +# 5x +transform_regex = ["^'([^\\s])'$", "^[0-9]+(?:\\.[0-9]*)?x$", "^'s$", "^\\+$", "[><+-]"] +allow_concatenation = true +allow_dashes = true diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000000..f4ceea785605 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +**/target/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000000..e2375881ea06 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true +[*] +indent_style=tab +indent_size=tab +tab_width=4 +end_of_line=lf +charset=utf-8 +trim_trailing_whitespace=true +max_line_length=100 +insert_final_newline=true + +[*.{yml,md,yaml,sh}] +indent_style=space +indent_size=2 +tab_width=8 +end_of_line=lf + +[*.md] +max_line_length=80 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..c0c8ea648020 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,62 @@ +version: 2 +updates: +- package-ecosystem: cargo + directory: "/" + schedule: + interval: weekly + time: "03:00" + timezone: Europe/Berlin + open-pull-requests-limit: 20 + ignore: + # Substrate (+ Polkadot/Cumulus pallets) dependencies + - dependency-name: beefy-* + versions: + - ">= 0" + - dependency-name: frame-* + versions: + - ">= 0" + - dependency-name: fork-tree + versions: + - ">= 0" + - dependency-name: mmr-* + versions: + - ">= 0" + - dependency-name: node-inspect + versions: + - ">= 0" + - dependency-name: pallet-* + versions: + - ">= 0" + - dependency-name: sc-* + versions: + - ">= 0" + - dependency-name: sp-* + versions: + - ">= 0" + - dependency-name: substrate-* + versions: + - ">= 0" + - dependency-name: try-runtime-cli + versions: + - ">= 0" + - dependency-name: binary-merkle-tree + versions: + - ">= 0" + # Polkadot dependencies + - dependency-name: kusama-* + versions: + - ">= 0" + - dependency-name: polkadot-* + versions: + - ">= 0" + - dependency-name: xcm* + versions: + - ">= 0" + # Cumulus dependencies + - dependency-name: cumulus-* + versions: + - ">= 0" + - dependency-name: parachain-info + versions: + - ">= 0" + rebase-strategy: disabled diff --git a/.github/workflows/gitspiegel-trigger.yml b/.github/workflows/gitspiegel-trigger.yml new file mode 100644 index 000000000000..dce3aaf2feca --- /dev/null +++ b/.github/workflows/gitspiegel-trigger.yml @@ -0,0 +1,22 @@ +name: gitspiegel sync + +# This workflow doesn't do anything, it's only use is to trigger "workflow_run" +# webhook, that'll be consumed by gitspiegel +# This way, gitspiegel won't do mirroring, unless this workflow runs, +# and running the workflow is protected by GitHub + +on: + pull_request: + types: + - opened + - synchronize + - unlocked + - ready_for_review + - reopened + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - name: Do nothing + run: echo "let's go" diff --git a/cumulus/bridges/.gitignore b/.gitignore similarity index 100% rename from cumulus/bridges/.gitignore rename to .gitignore diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000000..6c3cf7e16cb8 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,402 @@ +stages: + - test + - build + - publish + - publish-docker-description + - deploy + +variables: + GIT_STRATEGY: fetch + GIT_DEPTH: 100 + CARGO_INCREMENTAL: 0 + ARCH: "x86_64" + CI_IMAGE: "paritytech/bridges-ci:production" + RUST_BACKTRACE: full + BUILDAH_IMAGE: "quay.io/buildah/stable:v1.29" + BUILDAH_COMMAND: "buildah --storage-driver overlay2" + +default: + cache: {} + interruptible: true + retry: + max: 2 + when: + - runner_system_failure + - unknown_failure + - api_failure + +.collect-artifacts: &collect-artifacts + artifacts: + name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" + when: on_success + expire_in: 7 days + paths: + - artifacts/ + +.kubernetes-build: &kubernetes-build + tags: + - kubernetes-parity-build + +.docker-env: &docker-env + image: "${CI_IMAGE}" + before_script: + - rustup show + - cargo --version + - rustup +nightly show + - cargo +nightly --version + tags: + - linux-docker-vm-c2 + +.test-refs: &test-refs + rules: + - if: $CI_PIPELINE_SOURCE == "pipeline" + - if: $CI_PIPELINE_SOURCE == "web" + - if: $CI_PIPELINE_SOURCE == "schedule" + - if: $CI_COMMIT_REF_NAME == "master" + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + +.test-only-refs: &test-only-refs + rules: + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs + +.publish-refs: &publish-refs + rules: + # won't run on the CI image update pipeline + - if: $CI_PIPELINE_SOURCE == "pipeline" + when: never + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]{4}-[0-9]{2}-[0-9]{2}.*$/ # i.e. v2021-09-27, v2021-09-27-1 + # there are two types of nightly pipelines: + # 1. this one is triggered by the schedule with $PIPELINE == "nightly", it's for releasing. + # this job runs only on nightly pipeline with the mentioned variable, against `master` branch + - if: $CI_PIPELINE_SOURCE == "schedule" && $PIPELINE == "nightly" + +.nightly-test: &nightly-test + rules: + # 2. another is triggered by scripts repo $CI_PIPELINE_SOURCE == "pipeline" it's for the CI image + # update, it also runs all the nightly checks. + - if: $CI_PIPELINE_SOURCE == "pipeline" + +.deploy-refs: &deploy-refs + rules: + - if: $CI_PIPELINE_SOURCE == "pipeline" + when: never + - if: $SCHEDULED_JOB + when: never + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + when: manual + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]{4}-[0-9]{2}-[0-9]{2}.*$/ # i.e. v2021-09-27, v2021-09-27-1 + when: manual + + + +#### stage: test + +clippy-nightly: + stage: test + <<: *docker-env + <<: *test-refs + variables: + RUSTFLAGS: "-D warnings" + script: + # clippy currently is raising `derive-partial-eq-without-eq` warning even if `Eq` is actually derived + - SKIP_WASM_BUILD=1 cargo +nightly clippy --all-targets -- -A clippy::redundant_closure -A clippy::derive-partial-eq-without-eq -A clippy::or_fun_call + +fmt: + stage: test + <<: *docker-env + <<: *test-refs + script: + - cargo +nightly fmt --all -- --check + +spellcheck: + stage: test + <<: *docker-env + <<: *test-refs + script: + - cargo spellcheck check --cfg=.config/spellcheck.toml --checkers hunspell -m 1 $(find . -type f -name '*.rs' ! -path "./target/*" ! -name 'codegen_runtime.rs' ! -name 'weights.rs') + +check: + stage: test + <<: *docker-env + <<: *test-refs + script: &check-script + - SKIP_WASM_BUILD=1 time cargo check --locked --verbose --workspace --features runtime-benchmarks + +check-nightly: + stage: test + <<: *docker-env + <<: *nightly-test + script: + - rustup default nightly + - *check-script + +test: + stage: test + <<: *docker-env + <<: *test-refs +# variables: +# RUSTFLAGS: "-D warnings" + script: &test-script + - time cargo fetch + # Enable this, when you see: "`cargo metadata` can not fail on project `Cargo.toml`" + #- time cargo fetch --manifest-path=`cargo metadata --format-version=1 | jq --compact-output --raw-output ".packages[] | select(.name == \"polkadot-runtime\").manifest_path"` + #- time cargo fetch --manifest-path=`cargo metadata --format-version=1 | jq --compact-output --raw-output ".packages[] | select(.name == \"kusama-runtime\").manifest_path"` + - CARGO_NET_OFFLINE=true SKIP_WASM_BUILD=1 time cargo test --verbose --workspace --features runtime-benchmarks + +test-nightly: + stage: test + <<: *docker-env + <<: *nightly-test + script: + - rustup default nightly + - *test-script + +deny: + stage: test + <<: *docker-env + <<: *nightly-test + <<: *collect-artifacts + script: + - cargo deny check advisories --hide-inclusion-graph + - cargo deny check bans sources --hide-inclusion-graph + after_script: + - mkdir -p ./artifacts + - echo "___Complete logs can be found in the artifacts___" + - cargo deny check advisories 2> advisories.log + - cargo deny check bans sources 2> bans_sources.log + # this job is allowed to fail, only licenses check is important + allow_failure: true + +deny-licenses: + stage: test + <<: *docker-env + <<: *test-refs + <<: *collect-artifacts + script: + - cargo deny check licenses --hide-inclusion-graph + after_script: + - mkdir -p ./artifacts + - echo "___Complete logs can be found in the artifacts___" + - cargo deny check licenses 2> licenses.log + +check-rustdoc: + stage: test + <<: *docker-env + <<: *test-refs + variables: + SKIP_WASM_BUILD: 1 + RUSTDOCFLAGS: "-Dwarnings" + script: + - time cargo +nightly doc --workspace --verbose --no-deps --all-features + +partial-repo-pallets-build-test: + stage: test + <<: *docker-env + <<: *nightly-test + script: + - ./scripts/verify-pallets-build.sh --no-revert + # we may live with failing partial repo build, it is just a signal for us + allow_failure: true + +build: + stage: test + rules: + # won't run on the CI image update pipeline + - if: $CI_PIPELINE_SOURCE == "pipeline" + when: never + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]{4}-[0-9]{2}-[0-9]{2}.*$/ # i.e. v2021-09-27, v2021-09-27-1 + - if: $CI_PIPELINE_SOURCE == "schedule" && $PIPELINE == "nightly" + - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs + <<: *docker-env + <<: *collect-artifacts + # master + script: &build-script + - time cargo fetch + # Enable this, when you see: "`cargo metadata` can not fail on project `Cargo.toml`" + #- time cargo fetch --manifest-path=`cargo metadata --format-version=1 | jq --compact-output --raw-output ".packages[] | select(.name == \"polkadot-runtime\").manifest_path"` + #- time cargo fetch --manifest-path=`cargo metadata --format-version=1 | jq --compact-output --raw-output ".packages[] | select(.name == \"kusama-runtime\").manifest_path"` + - CARGO_NET_OFFLINE=true time cargo build --release --verbose --workspace + after_script: + # Prepare artifacts + - mkdir -p ./artifacts + - strip ./target/release/substrate-relay + - mv -v ./target/release/substrate-relay ./artifacts/ + - mv -v ./deployments/local-scripts/bridge-entrypoint.sh ./artifacts/ + - mv -v ./ci.Dockerfile ./artifacts/ + +build-nightly: + stage: build + <<: *docker-env + <<: *collect-artifacts + <<: *nightly-test + script: + - rustup default nightly + - *build-script + +#### stage: publish + +# check that images can be built +.build-image: &build-image + <<: *kubernetes-build + image: $BUILDAH_IMAGE + <<: *test-only-refs + variables: &build-image-variables + GIT_STRATEGY: none + DOCKERFILE: ci.Dockerfile + needs: + - job: build + artifacts: true + script: + # trim "-build-docker" from job name + - export DOCKER_IMAGE_NAME="${CI_JOB_NAME::-13}" + - if [[ "${CI_JOB_NAME::-13}" == "bridges-common-relay" ]]; then + export BRIDGES_PROJECT="substrate-relay"; + else + export BRIDGES_PROJECT="${CI_JOB_NAME::-13}"; + fi + - export IMAGE_NAME=docker.io/paritytech/${DOCKER_IMAGE_NAME} + - echo "Building ${IMAGE_NAME}" + - cd ./artifacts + - $BUILDAH_COMMAND build + --format=docker + --build-arg VCS_REF="${CI_COMMIT_SHORT_SHA}" + --build-arg BUILD_DATE="$(date +%d-%m-%Y)" + --build-arg PROJECT="${BRIDGES_PROJECT}" + --build-arg VERSION="${VERSION}" + --tag "${IMAGE_NAME}:latest" + --file "${DOCKERFILE}" . + +substrate-relay-build-docker: + stage: publish + <<: *build-image + +bridges-common-relay-build-docker: + stage: publish + <<: *build-image + variables: + <<: *build-image-variables + BRIDGES_PROJECT: substrate-relay + DOCKER_IMAGE_NAME: bridges-common-relay + +# build and publish images +.build-push-image: &build-push-image + <<: *kubernetes-build + image: $BUILDAH_IMAGE + <<: *publish-refs + variables: &image-variables + GIT_STRATEGY: none + DOCKERFILE: ci.Dockerfile + BRIDGES_PROJECT: "${CI_JOB_NAME}" + DOCKER_IMAGE_NAME: "${CI_JOB_NAME}" + IMAGE_NAME: docker.io/paritytech/$DOCKER_IMAGE_NAME + needs: + - job: build + artifacts: true + before_script: + - echo "Starting docker image build/push with name '${IMAGE_NAME}' for '${BRIDGES_PROJECT}' with Dockerfile = '${DOCKERFILE}'" + - if [[ "${CI_COMMIT_TAG}" ]]; then + VERSION=${CI_COMMIT_TAG}; + elif [[ "${CI_COMMIT_REF_NAME}" ]]; then + VERSION=$(echo ${CI_COMMIT_REF_NAME} | sed -r 's#/+#-#g'); + fi + # When building from version tags (v1.0, v2.1rc1, ...) we'll use "production" to tag + # docker image. In all other cases, it'll be "latest". + - if [[ $CI_COMMIT_REF_NAME =~ ^v[0-9]+\.[0-9]+.*$ ]]; then + FLOATING_TAG="production"; + else + FLOATING_TAG="latest"; + fi + - echo "Effective tags = ${VERSION} sha-${CI_COMMIT_SHORT_SHA} ${FLOATING_TAG}" + - echo "Full docker image name = ${IMAGE_NAME}" + script: + - test "${Docker_Hub_User_Parity}" -a "${Docker_Hub_Pass_Parity}" || + ( echo "no docker credentials provided"; exit 1 ) + - cd ./artifacts + - $BUILDAH_COMMAND build + --format=docker + --build-arg VCS_REF="${CI_COMMIT_SHORT_SHA}" + --build-arg BUILD_DATE="$(date +%d-%m-%Y)" + --build-arg PROJECT="${BRIDGES_PROJECT}" + --build-arg VERSION="${VERSION}" + --tag "${IMAGE_NAME}:${VERSION}" + --tag "${IMAGE_NAME}:sha-${CI_COMMIT_SHORT_SHA}" + --tag "${IMAGE_NAME}:${FLOATING_TAG}" + --file "${DOCKERFILE}" . + # The job will success only on the protected branch + - echo "${Docker_Hub_Pass_Parity}" | + buildah login --username "${Docker_Hub_User_Parity}" --password-stdin docker.io + - $BUILDAH_COMMAND info + - $BUILDAH_COMMAND push --format=v2s2 "${IMAGE_NAME}:${VERSION}" + - $BUILDAH_COMMAND push --format=v2s2 "${IMAGE_NAME}:sha-${CI_COMMIT_SHORT_SHA}" + - $BUILDAH_COMMAND push --format=v2s2 "${IMAGE_NAME}:${FLOATING_TAG}" + after_script: + - env REGISTRY_AUTH_FILE= buildah logout --all + +substrate-relay: + stage: publish + <<: *build-push-image + +bridges-common-relay: + stage: publish + <<: *build-push-image + variables: + <<: *image-variables + BRIDGES_PROJECT: substrate-relay + DOCKER_IMAGE_NAME: bridges-common-relay + +# Publish Docker images description to hub.docker.com + +.publish-docker-image-description: + stage: publish-docker-description + image: paritytech/dockerhub-description + variables: + DOCKER_USERNAME: $Docker_Hub_User_Parity + DOCKER_PASSWORD: $Docker_Hub_Pass_Parity + README_FILEPATH: $CI_PROJECT_DIR/docs/${CI_JOB_NAME}.README.md + rules: + - if: $CI_COMMIT_REF_NAME == "master" + changes: + - docs/${CI_JOB_NAME}.README.md + script: + - export DOCKERHUB_REPOSITORY="paritytech/${CI_JOB_NAME:10}" + - cd / && sh entrypoint.sh + tags: + - kubernetes-parity-build + +dockerhub-substrate-relay: + extends: .publish-docker-image-description + variables: + SHORT_DESCRIPTION: "substrate-relay" + +dockerhub-bridges-common-relay: + extends: .publish-docker-image-description + variables: + SHORT_DESCRIPTION: "bridges-common-relay" + +# FIXME: publish binaries + +deploy-bridges-common-relay-testnet: + <<: *deploy-refs + <<: *kubernetes-build + needs: + - job: bridges-common-relay + stage: deploy + image: argoproj/argocd:v2.5.5 + environment: parity-testnet + variables: + ARGOCD_OPTS: --grpc-web --grpc-web-root-path /parity-testnet + APP: bridges-common-relay + before_script: + - if [[ "${CI_COMMIT_TAG}" ]]; then + VERSION=${CI_COMMIT_TAG}; + elif [[ "${CI_COMMIT_REF_NAME}" ]]; then + VERSION=$(echo ${CI_COMMIT_REF_NAME} | sed -r 's#/+#-#g'); + fi + script: + - echo "Starting deploy version=${VERSION}" + - argocd app list + - argocd app set $APP --helm-set bridges-common-relay.image.tag=$VERSION + - argocd app sync $APP --async diff --git a/.maintain/bridge-weight-template.hbs b/.maintain/bridge-weight-template.hbs new file mode 100644 index 000000000000..ff70b55aa2c1 --- /dev/null +++ b/.maintain/bridge-weight-template.hbs @@ -0,0 +1,138 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated weights for {{pallet}} +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION {{version}} +//! DATE: {{date}}, STEPS: `{{cmd.steps}}`, REPEAT: `{{cmd.repeat}}`, LOW RANGE: `{{cmd.lowest_range_values}}`, HIGH RANGE: `{{cmd.highest_range_values}}` +//! WORST CASE MAP SIZE: `{{cmd.worst_case_map_values}}` +//! HOSTNAME: `{{hostname}}`, CPU: `{{cpuname}}` +//! EXECUTION: {{cmd.execution}}, WASM-EXECUTION: {{cmd.wasm_execution}}, CHAIN: {{cmd.chain}}, DB CACHE: {{cmd.db_cache}} + +// Executed Command: +{{#each args as |arg|}} +// {{arg}} +{{/each}} + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for {{pallet}}. +pub trait WeightInfo { + {{#each benchmarks as |benchmark|}} + fn {{benchmark.name~}} + ( + {{~#each benchmark.components as |c| ~}} + {{c.name}}: u32, {{/each~}} + ) -> Weight; + {{/each}} +} + +/// Weights for `{{pallet}}` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + {{#each benchmarks as |benchmark|}} + {{#each benchmark.comments as |comment|}} + /// {{comment}} + /// + {{/each}} + {{#each benchmark.component_ranges as |range|}} + /// The range of component `{{range.name}}` is `[{{range.min}}, {{range.max}}]`. + /// + {{/each}} + fn {{benchmark.name~}} + ( + {{~#each benchmark.components as |c| ~}} + {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} + ) -> Weight { + // Proof Size summary in bytes: + // Measured: `{{benchmark.base_recorded_proof_size}}{{#each benchmark.component_recorded_proof_size as |cp|}} + {{cp.name}} * ({{cp.slope}} ±{{underscore cp.error}}){{/each}}` + // Estimated: `{{benchmark.base_calculated_proof_size}}{{#each benchmark.component_calculated_proof_size as |cp|}} + {{cp.name}} * ({{cp.slope}} ±{{underscore cp.error}}){{/each}}` + // Minimum execution time: {{underscore benchmark.min_execution_time}} nanoseconds. + Weight::from_parts({{underscore benchmark.base_weight}}, {{benchmark.base_calculated_proof_size}}) + {{#each benchmark.component_weight as |cw|}} + // Standard Error: {{underscore cw.error}} + .saturating_add(Weight::from_parts({{underscore cw.slope}}, 0).saturating_mul({{cw.name}}.into())) + {{/each}} + {{#if (ne benchmark.base_reads "0")}} + .saturating_add(T::DbWeight::get().reads({{benchmark.base_reads}}_u64)) + {{/if}} + {{#each benchmark.component_reads as |cr|}} + .saturating_add(T::DbWeight::get().reads(({{cr.slope}}_u64).saturating_mul({{cr.name}}.into()))) + {{/each}} + {{#if (ne benchmark.base_writes "0")}} + .saturating_add(T::DbWeight::get().writes({{benchmark.base_writes}}_u64)) + {{/if}} + {{#each benchmark.component_writes as |cw|}} + .saturating_add(T::DbWeight::get().writes(({{cw.slope}}_u64).saturating_mul({{cw.name}}.into()))) + {{/each}} + {{#each benchmark.component_calculated_proof_size as |cp|}} + .saturating_add(Weight::from_parts(0, {{cp.slope}}).saturating_mul({{cp.name}}.into())) + {{/each}} + } + {{/each}} +} + +// For backwards compatibility and tests +impl WeightInfo for () { + {{#each benchmarks as |benchmark|}} + {{#each benchmark.comments as |comment|}} + /// {{comment}} + /// + {{/each}} + {{#each benchmark.component_ranges as |range|}} + /// The range of component `{{range.name}}` is `[{{range.min}}, {{range.max}}]`. + /// + {{/each}} + fn {{benchmark.name~}} + ( + {{~#each benchmark.components as |c| ~}} + {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} + ) -> Weight { + // Proof Size summary in bytes: + // Measured: `{{benchmark.base_recorded_proof_size}}{{#each benchmark.component_recorded_proof_size as |cp|}} + {{cp.name}} * ({{cp.slope}} ±{{underscore cp.error}}){{/each}}` + // Estimated: `{{benchmark.base_calculated_proof_size}}{{#each benchmark.component_calculated_proof_size as |cp|}} + {{cp.name}} * ({{cp.slope}} ±{{underscore cp.error}}){{/each}}` + // Minimum execution time: {{underscore benchmark.min_execution_time}} nanoseconds. + Weight::from_parts({{underscore benchmark.base_weight}}, {{benchmark.base_calculated_proof_size}}) + {{#each benchmark.component_weight as |cw|}} + // Standard Error: {{underscore cw.error}} + .saturating_add(Weight::from_parts({{underscore cw.slope}}, 0).saturating_mul({{cw.name}}.into())) + {{/each}} + {{#if (ne benchmark.base_reads "0")}} + .saturating_add(RocksDbWeight::get().reads({{benchmark.base_reads}}_u64)) + {{/if}} + {{#each benchmark.component_reads as |cr|}} + .saturating_add(RocksDbWeight::get().reads(({{cr.slope}}_u64).saturating_mul({{cr.name}}.into()))) + {{/each}} + {{#if (ne benchmark.base_writes "0")}} + .saturating_add(RocksDbWeight::get().writes({{benchmark.base_writes}}_u64)) + {{/if}} + {{#each benchmark.component_writes as |cw|}} + .saturating_add(RocksDbWeight::get().writes(({{cw.slope}}_u64).saturating_mul({{cw.name}}.into()))) + {{/each}} + {{#each benchmark.component_calculated_proof_size as |cp|}} + .saturating_add(Weight::from_parts(0, {{cp.slope}}).saturating_mul({{cp.name}}.into())) + {{/each}} + } + {{/each}} +} diff --git a/cumulus/CODEOWNERS b/CODEOWNERS similarity index 79% rename from cumulus/CODEOWNERS rename to CODEOWNERS index 3e5e8bd062dd..3941ba8451a1 100644 --- a/cumulus/CODEOWNERS +++ b/CODEOWNERS @@ -11,13 +11,11 @@ # - Glob syntax is git-like, e.g. `/core` means the core directory in the root, unlike `core` # which can be everywhere. # - Multiple owners are supported. -# - Either handle (e.g, @github_user or @github/team) or email can be used. Keep in mind, +# - Either handle (e.g, @github_user or @github_org/team) or email can be used. Keep in mind, # that handles might work better because they are more recognizable on GitHub, # eyou can use them for mentioning unlike an email. # - The latest matching rule, if multiple, takes precedence. # CI -/.github/ @paritytech/ci @paritytech/release-engineering +/.github/ @paritytech/ci /.gitlab-ci.yml @paritytech/ci -/scripts/ci/ @paritytech/ci @paritytech/release-engineering - diff --git a/cumulus/bridges/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md similarity index 96% rename from cumulus/bridges/CODE_OF_CONDUCT.md rename to CODE_OF_CONDUCT.md index 70541fb72fa2..23411da2e048 100644 --- a/cumulus/bridges/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,9 +34,9 @@ of preference. We see that blockchains are naturally community platforms with u ultimate decision makers. We assert that good software will maximise user agency by facilitate user-expression on the network. As such: -- This project will strive to give users as much choice as is both reasonable and possible over what +* This project will strive to give users as much choice as is both reasonable and possible over what protocol they adhere to; but -- use of the project's technical forums, commenting systems, pull requests and issue trackers as a +* use of the project's technical forums, commenting systems, pull requests and issue trackers as a means to express individual protocol preferences is forbidden. ## Our Responsibilities diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000000..db7e3bb744c4 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,11562 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +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 = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", +] + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array 0.14.7", +] + +[[package]] +name = "aes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" +dependencies = [ + "aes-soft", + "aesni", + "cipher 0.2.5", +] + +[[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 0.3.0", +] + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.4.4", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "cipher 0.3.0", + "ctr 0.8.0", + "ghash 0.4.4", + "subtle 2.4.1", +] + +[[package]] +name = "aes-gcm" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209b47e8954a928e1d72e86eca7000ebb6655fe1436d33eefc2201cad027e237" +dependencies = [ + "aead 0.5.2", + "aes 0.8.3", + "cipher 0.4.4", + "ctr 0.9.2", + "ghash 0.5.0", + "subtle 2.4.1", +] + +[[package]] +name = "aes-soft" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" +dependencies = [ + "cipher 0.2.5", + "opaque-debug 0.3.0", +] + +[[package]] +name = "aesni" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" +dependencies = [ + "cipher 0.2.5", + "opaque-debug 0.3.0", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom 0.2.10", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if 1.0.0", + "getrandom 0.2.10", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "aquamarine" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df752953c49ce90719c7bf1fc587bc8227aed04732ea0c0f85e5397d7fdbd1a1" +dependencies = [ + "include_dir", + "itertools", + "proc-macro-error", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + +[[package]] +name = "ark-bls12-377" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bls12-377-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c7021f180a0cbea0380eba97c2af3c57074cdaffe0eef7e840e1c9f2841e55" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-bls12-381-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1dc4b3d08f19e8ec06e949712f95b8361e43f1391d94f65e4234df03480631c" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-models-ext", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-bw6-761" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0605daf0cc5aa2034b78d008aaf159f56901d92a52ee4f6ecdfdac4f426700" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bw6-761-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccee5fba47266f460067588ee1bf070a9c760bf2050c1c509982c5719aadb4f2" +dependencies = [ + "ark-bw6-761", + "ark-ec", + "ark-ff", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ed-on-bls12-377" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b10d901b9ac4b38f9c32beacedfadcdd64e46f8d7f8e88c1ae1060022cf6f6c6" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ed-on-bls12-377-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524a4fb7540df2e1a8c2e67a83ba1d1e6c3947f4f9342cc2359fc2e789ad731d" +dependencies = [ + "ark-ec", + "ark-ed-on-bls12-377", + "ark-ff", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-ed-on-bls12-381-bandersnatch" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cde0f2aa063a2a5c28d39b47761aa102bda7c13c84fc118a61b87c7b2f785c" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ed-on-bls12-381-bandersnatch-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15185f1acb49a07ff8cbe5f11a1adc5a93b19e211e325d826ae98e98e124346" +dependencies = [ + "ark-ec", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ff", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "ark-models-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e9eab5d4b5ff2f228b763d38442adc9b084b0a465409b059fac5c2308835ec2" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-scale" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bd73bb6ddb72630987d37fa963e99196896c0d0ea81b7c894567e74a2f83af" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "ark-secret-scalar" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=2019248#2019248785389b3246d55b1c3b0e9bdef4454cb7" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "ark-transcript", + "digest 0.10.7", + "getrandom_or_panic", + "zeroize", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", + "rayon", +] + +[[package]] +name = "ark-transcript" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=2019248#2019248785389b3246d55b1c3b0e9bdef4454cb7" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "digest 0.10.7", + "rand_core 0.6.4", + "sha3", +] + +[[package]] +name = "array-bytes" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" + +[[package]] +name = "array-bytes" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" +dependencies = [ + "nodrop", +] + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "asn1-rs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" +dependencies = [ + "asn1-rs-derive 0.1.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.30", +] + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive 0.4.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.30", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", + "synstructure", +] + +[[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.69", + "quote 1.0.33", + "syn 1.0.109", + "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.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-executor" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand 1.9.0", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock", + "autocfg", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock", + "autocfg", + "cfg-if 1.0.0", + "concurrent-queue", + "futures-lite", + "log", + "parking", + "polling", + "rustix 0.37.27", + "slab", + "socket2 0.4.9", + "waker-fn", +] + +[[package]] +name = "async-lock" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-net" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e67316bc7eff608fe723df5d32ed639946adcd69e07df41fd42a7b411f1f" +dependencies = [ + "async-io", + "autocfg", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +dependencies = [ + "async-io", + "async-lock", + "autocfg", + "blocking", + "cfg-if 1.0.0", + "event-listener", + "futures-lite", + "rustix 0.37.27", + "signal-hook", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite 0.2.12", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" + +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "asynchronous-codec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite 0.2.12", +] + +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + +[[package]] +name = "atomic-waker" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" + +[[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", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.10", + "instant", + "rand 0.8.5", +] + +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line 0.20.0", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object 0.31.1", + "rustc-demangle", +] + +[[package]] +name = "bandersnatch_vrfs" +version = "0.0.4" +source = "git+https://github.com/w3f/ring-vrf?rev=2019248#2019248785389b3246d55b1c3b0e9bdef4454cb7" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ff", + "ark-serialize", + "ark-std", + "dleq_vrf", + "fflonk", + "merlin 3.0.0", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "ring 0.1.0", + "sha2 0.10.7", + "sp-ark-bls12-381", + "sp-ark-ed-on-bls12-381-bandersnatch", + "zeroize", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + +[[package]] +name = "binary-merkle-tree" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "hash-db", + "log", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bip39" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "rand_core 0.6.4", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "serde", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" +dependencies = [ + "byte-tools", + "crypto-mac 0.7.0", + "digest 0.8.1", + "opaque-debug 0.2.3", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake2-rfc" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" +dependencies = [ + "arrayvec 0.4.12", + "constant_time_eq 0.1.5", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "constant_time_eq 0.2.6", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding 0.1.5", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-modes" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" +dependencies = [ + "block-padding 0.2.1", + "cipher 0.2.5", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "blocking" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +dependencies = [ + "async-channel", + "async-lock", + "async-task", + "atomic-waker", + "fastrand 1.9.0", + "futures-lite", + "log", +] + +[[package]] +name = "bounded-collections" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b05133427c07c4776906f673ccf36c21b102c9829c641a5b56bd151d44fd6" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "bp-asset-hub-rococo" +version = "0.1.0" +dependencies = [ + "bp-xcm-bridge-hub-router", + "frame-support", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "bp-asset-hub-westend" +version = "0.1.0" +dependencies = [ + "bp-xcm-bridge-hub-router", + "frame-support", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "bp-beefy" +version = "0.1.0" +dependencies = [ + "binary-merkle-tree", + "bp-runtime", + "frame-support", + "pallet-beefy-mmr", + "pallet-mmr", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-bridge-hub-cumulus" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "frame-system", + "polkadot-primitives", + "sp-api", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-bridge-hub-kusama" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-bridge-hub-polkadot" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-bridge-hub-rococo" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-bridge-hub-westend" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", + "sp-api", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-header-chain" +version = "0.1.0" +dependencies = [ + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-support", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-kusama" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-messages" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-runtime", + "frame-support", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-parachains" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-polkadot" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-polkadot-bulletin" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-polkadot-core" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-support", + "frame-system", + "hex", + "parity-scale-codec", + "parity-util-mem", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-relayers" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "frame-support", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-rococo" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-runtime" +version = "0.1.0" +dependencies = [ + "frame-support", + "frame-system", + "hash-db", + "hex-literal", + "impl-trait-for-tuples", + "log", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "trie-db", +] + +[[package]] +name = "bp-test-utils" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "ed25519-dalek", + "finality-grandpa", + "parity-scale-codec", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", +] + +[[package]] +name = "bp-westend" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-polkadot-core", + "bp-runtime", + "frame-support", + "sp-api", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-xcm-bridge-hub" +version = "0.1.0" +dependencies = [ + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "bp-xcm-bridge-hub-router" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "bridge-runtime-common" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-runtime", + "bp-test-utils", + "bp-xcm-bridge-hub", + "bp-xcm-bridge-hub-router", + "frame-support", + "frame-system", + "hash-db", + "log", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-bridge-relayers", + "pallet-transaction-payment", + "pallet-utility", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "staging-xcm", + "staging-xcm-builder", + "static_assertions", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[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 = "c2-chacha" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27dae93fe7b1e0424dc57179ac396908c26b035a87234809f5c4dfd1b47dc80" +dependencies = [ + "cipher 0.2.5", + "ppv-lite86", +] + +[[package]] +name = "castaway" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + +[[package]] +name = "ccm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" +dependencies = [ + "aead 0.3.2", + "cipher 0.2.5", + "subtle 2.4.1", +] + +[[package]] +name = "cfg-expr" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" +dependencies = [ + "smallvec", +] + +[[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 = "chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf3c081b5fba1e5615640aae998e0fbd10c24cbd897ee39ed754a77601a4862" +dependencies = [ + "byteorder", + "keystream", +] + +[[package]] +name = "chacha20" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.3.0", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +dependencies = [ + "aead 0.4.3", + "chacha20", + "cipher 0.3.0", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "time 0.1.45", + "wasm-bindgen", + "windows-targets 0.48.1", +] + +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "ckb-merkle-mountain-range" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f061f97d64fd1822664bdfb722f7ae5469a97b77567390f7442be5b5dc82a5b" +dependencies = [ + "cfg-if 0.1.10", +] + +[[package]] +name = "ckb-merkle-mountain-range" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "common" +version = "0.1.0" +source = "git+https://github.com/w3f/ring-proof#61e7b528bc0170d6bf541be32440d569b784425d" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "fflonk", + "getrandom_or_panic", + "merlin 3.0.0", + "rand_chacha 0.3.1", +] + +[[package]] +name = "common-path" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" + +[[package]] +name = "concurrent-queue" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" + +[[package]] +name = "const-random" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" +dependencies = [ + "const-random-macro", + "proc-macro-hack", +] + +[[package]] +name = "const-random-macro" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" +dependencies = [ + "getrandom 0.2.10", + "once_cell", + "proc-macro-hack", + "tiny-keccak", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "constant_time_eq" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" + +[[package]] +name = "constcat" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli", + "hashbrown 0.13.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" + +[[package]] +name = "cranelift-entity" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" + +[[package]] +name = "cranelift-native" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff3220489a3d928ad91e59dd7aeaa8b3de18afb554a6211213673a71c90737ac" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +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-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +dependencies = [ + "generic-array 0.12.4", + "subtle 1.0.0", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.7", + "subtle 2.4.1", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.7", + "subtle 2.4.1", +] + +[[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 = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher 0.4.4", +] + +[[package]] +name = "curl" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" +dependencies = [ + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2 0.4.9", + "winapi", +] + +[[package]] +name = "curl-sys" +version = "0.4.63+curl-8.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb0fef7046022a1e2ad67a004978f0e3cacb9e3123dc62ce768f92197b771dc" +dependencies = [ + "cc", + "libc", + "libnghttp2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "winapi", +] + +[[package]] +name = "curve25519-dalek" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +dependencies = [ + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core 0.20.3", + "darling_macro 0.20.3", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.69", + "quote 1.0.33", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.69", + "quote 1.0.33", + "strsim 0.10.0", + "syn 2.0.39", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core 0.14.4", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core 0.20.3", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + +[[package]] +name = "data-encoding-macro" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" +dependencies = [ + "asn1-rs 0.3.1", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs 0.5.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "derive-syn-parse" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" +dependencies = [ + "darling 0.14.4", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder_macro" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" +dependencies = [ + "derive_builder_core", + "syn 1.0.109", +] + +[[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.69", + "quote 1.0.33", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle 2.4.1", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +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", +] + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "dleq_vrf" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=2019248#2019248785389b3246d55b1c3b0e9bdef4454cb7" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-scale", + "ark-secret-scalar", + "ark-serialize", + "ark-std", + "ark-transcript", + "arrayvec 0.7.4", + "zeroize", +] + +[[package]] +name = "docify" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4235e9b248e2ba4b92007fe9c646f3adf0ffde16dc74713eacc92b8bc58d8d2f" +dependencies = [ + "docify_macros", +] + +[[package]] +name = "docify_macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47020e12d7c7505670d1363dd53d6c23724f71a90a3ae32ff8eba40de8404626" +dependencies = [ + "common-path", + "derive-syn-parse", + "once_cell", + "proc-macro2 1.0.69", + "quote 1.0.33", + "regex", + "syn 2.0.39", + "termcolor", + "toml 0.7.6", + "walkdir", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "dyn-clone" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + +[[package]] +name = "ecdsa" +version = "0.16.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" +dependencies = [ + "der 0.7.7", + "digest 0.10.7", + "elliptic-curve 0.13.5", + "rfc6979 0.4.0", + "signature 2.1.0", + "spki 0.7.2", +] + +[[package]] +name = "ed25519" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" +dependencies = [ + "pkcs8 0.10.2", + "signature 2.1.0", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" +dependencies = [ + "curve25519-dalek 4.0.0", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2 0.10.7", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array 0.14.7", + "group 0.12.1", + "hkdf", + "pem-rfc7468", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.2", + "digest 0.10.7", + "ff 0.13.0", + "generic-array 0.14.7", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", + "subtle 2.4.1", + "zeroize", +] + +[[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-as-inner" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "env_logger" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "environmental" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "equivocation-detector" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-header-chain", + "finality-relay", + "frame-support", + "futures", + "log", + "num-traits", + "relay-utils", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[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 = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-rlp", + "impl-serde", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-rlp", + "impl-serde", + "primitive-types", + "uint", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "expander" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" +dependencies = [ + "blake2 0.10.6", + "fs-err", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle 2.4.1", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle 2.4.1", +] + +[[package]] +name = "fflonk" +version = "0.1.0" +source = "git+https://github.com/w3f/fflonk#95f3a57d1f4252fe95310c1567d153f25f3066b4" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "merlin 3.0.0", +] + +[[package]] +name = "fiat-crypto" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" + +[[package]] +name = "file-per-thread-logger" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "finality-grandpa" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" +dependencies = [ + "either", + "futures", + "futures-timer", + "log", + "num-traits", + "parity-scale-codec", + "parking_lot 0.12.1", + "scale-info", +] + +[[package]] +name = "finality-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "backoff", + "bp-header-chain", + "futures", + "log", + "num-traits", + "parking_lot 0.12.1", + "relay-utils", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[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.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "libz-sys", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "frame-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-support", + "frame-support-procedural", + "frame-system", + "linregress", + "log", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-runtime", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "static_assertions", +] + +[[package]] +name = "frame-metadata" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" +dependencies = [ + "cfg-if 1.0.0", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "frame-metadata" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" +dependencies = [ + "cfg-if 1.0.0", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "frame-support" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "aquamarine", + "array-bytes 6.1.0", + "bitflags 1.3.2", + "docify", + "environmental", + "frame-metadata 16.0.0", + "frame-support-procedural", + "impl-trait-for-tuples", + "k256", + "log", + "macro_magic", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "serde_json", + "smallvec", + "sp-api", + "sp-arithmetic", + "sp-core", + "sp-core-hashing-proc-macro", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-metadata-ir", + "sp-runtime", + "sp-staking", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-tracing 10.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-weights", + "static_assertions", + "tt-call", +] + +[[package]] +name = "frame-support-procedural" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "Inflector", + "cfg-expr", + "derive-syn-parse", + "expander", + "frame-support-procedural-tools", + "itertools", + "macro_magic", + "proc-macro-warning", + "proc-macro2 1.0.69", + "quote 1.0.33", + "sp-core-hashing 9.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "syn 2.0.39", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-support-procedural-tools-derive", + "proc-macro-crate 2.0.0", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "frame-support-procedural-tools-derive" +version = "3.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "frame-system" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "cfg-if 1.0.0", + "docify", + "frame-support", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-version", + "sp-weights", +] + +[[package]] +name = "fs-err" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-executor" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite 0.2.12", + "waker-fn", +] + +[[package]] +name = "futures-macro" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "futures-rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +dependencies = [ + "futures-io", + "rustls 0.20.8", + "webpki 0.22.2", +] + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite 0.2.12", + "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.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[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", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom_or_panic" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" +dependencies = [ + "rand 0.8.5", + "rand_core 0.6.4", +] + +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug 0.3.0", + "polyval 0.5.3", +] + +[[package]] +name = "ghash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +dependencies = [ + "opaque-debug 0.3.0", + "polyval 0.6.1", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +dependencies = [ + "fallible-iterator", + "indexmap 1.9.3", + "stable_deref_trait", +] + +[[package]] +name = "globset" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle 2.4.1", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", + "rand_core 0.6.4", + "subtle 2.4.1", +] + +[[package]] +name = "h2" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 1.9.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash 0.8.3", + "allocator-api2", + "serde", +] + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.0", +] + +[[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.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "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.7", +] + +[[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 0.14.7", + "hmac 0.8.1", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[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 0.2.12", +] + +[[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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite 0.2.12", + "socket2 0.4.9", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls 0.21.5", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows 0.48.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if-addrs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "if-watch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9465340214b296cd17a0009acdb890d6160010b8adf8f78a00d0d7ab270f79f" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "tokio", + "windows 0.34.0", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "include_dir" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array 0.14.7", +] + +[[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 = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "interceptor" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" +dependencies = [ + "async-trait", + "bytes", + "log", + "rand 0.8.5", + "rtcp", + "rtp", + "thiserror", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "intx" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f38a50a899dc47a6d0ed5508e7f601a2e34c3a85303514b5d137f3c10a0c75" + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.2", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ip_network" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.5", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + +[[package]] +name = "ipnet" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi 0.3.2", + "rustix 0.38.21", + "windows-sys 0.48.0", +] + +[[package]] +name = "isahc" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" +dependencies = [ + "async-channel", + "castaway", + "crossbeam-utils", + "curl", + "curl-sys", + "encoding_rs", + "event-listener", + "futures-lite", + "http", + "log", + "mime", + "once_cell", + "polling", + "slab", + "sluice", + "tracing", + "tracing-futures", + "url", + "waker-fn", +] + +[[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 = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonpath_lib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +dependencies = [ + "log", + "serde", + "serde_json", +] + +[[package]] +name = "jsonrpsee" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" +dependencies = [ + "jsonrpsee-core 0.16.2", + "jsonrpsee-proc-macros 0.16.2", + "jsonrpsee-server", + "jsonrpsee-types 0.16.2", + "tracing", +] + +[[package]] +name = "jsonrpsee" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b971ce0f6cd1521ede485afc564b95b2c8e7079b9da41d4273bd9b55140a55d" +dependencies = [ + "jsonrpsee-core 0.17.1", + "jsonrpsee-proc-macros 0.17.1", + "jsonrpsee-types 0.17.1", + "jsonrpsee-ws-client", + "tracing", +] + +[[package]] +name = "jsonrpsee" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ad9b31183a8bcbe843e32ca8554ad2936633548d95a7bb6a8e14c767dea6b05" +dependencies = [ + "jsonrpsee-client-transport 0.20.1", + "jsonrpsee-core 0.20.1", + "jsonrpsee-http-client", + "jsonrpsee-types 0.20.1", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca00d975eda834826b04ad57d4e690c67439bb51b02eb0f8b7e4c30fcef8ab9" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core 0.17.1", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97f2743cad51cc86b0dbfe316309eeb87a9d96a3d7f4dd7a99767c4b5f065335" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core 0.20.1", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e70b4439a751a5de7dd5ed55eacff78ebf4ffe0fc009cb1ebb11417f5b536b" +dependencies = [ + "anyhow", + "arrayvec 0.7.4", + "async-trait", + "beef", + "futures-channel", + "futures-util", + "globset", + "hyper", + "jsonrpsee-types 0.16.2", + "parking_lot 0.12.1", + "rand 0.8.5", + "rustc-hash", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b83cca7a5a7899eed8b2935d5f755c8c4052ad66ab5b328bd34ac2b3ffd3515f" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "jsonrpsee-types 0.17.1", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35dc957af59ce98373bcdde0c1698060ca6c2d2e9ae357b459c7158b6df33330" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types 0.20.1", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd865d0072764cb937b0110a92b5f53e995f7101cb346beca03d93a2dea79de" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core 0.20.1", + "jsonrpsee-types 0.20.1", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa6da1e4199c10d7b1d0a6e5e8bd8e55f351163b6f4b3cbb044672a69bd4c1c" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d814a21d9a819f8de1a41b819a263ffd68e4bb5f043d936db1c49b54684bde0a" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb69dad85df79527c019659a992498d03f8495390496da2f07e6c24c2b356fc" +dependencies = [ + "futures-channel", + "futures-util", + "http", + "hyper", + "jsonrpsee-core 0.16.2", + "jsonrpsee-types 0.16.2", + "serde", + "serde_json", + "soketto", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd522fe1ce3702fd94812965d7bb7a3364b1c9aba743944c5a00529aae80f8c" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd301ccc3e08718393432d1961539d78c4580dcca86014dfe6769c308b2c08b2" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9e25aec855b2a7d3ed90fded6c41e8c3fb72b63f071e1be3f0004eba19b625" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a69852133d549b07cb37ff2d0ec540eae0d20abb75ae923f5d39bc7536d987" +dependencies = [ + "http", + "jsonrpsee-client-transport 0.17.1", + "jsonrpsee-core 0.17.1", + "jsonrpsee-types 0.17.1", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa 0.16.7", + "elliptic-curve 0.13.5", + "once_cell", + "sha2 0.10.7", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keystream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "kvdb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d770dcb02bf6835887c3a979b5107a04ff4bbde97a5f0928d27404a155add9" +dependencies = [ + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" + +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + +[[package]] +name = "libnghttp2-sys" +version = "0.1.7+1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libp2p" +version = "0.51.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f210d259724eae82005b5c48078619b7745edb7b76de370b03f8ba59ea103097" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "getrandom 0.2.10", + "instant", + "libp2p-allow-block-list", + "libp2p-connection-limits", + "libp2p-core", + "libp2p-dns", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-noise", + "libp2p-ping", + "libp2p-quic", + "libp2p-request-response", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-wasm-ext", + "libp2p-webrtc", + "libp2p-websocket", + "libp2p-yamux", + "multiaddr", + "pin-project", +] + +[[package]] +name = "libp2p-allow-block-list" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510daa05efbc25184458db837f6f9a5143888f1caa742426d92e1833ddd38a50" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-connection-limits" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4caa33f1d26ed664c4fe2cca81a08c8e07d4c1c04f2f4ac7655c2dd85467fda0" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-core" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-identity", + "log", + "multiaddr", + "multihash", + "multistream-select", + "once_cell", + "parking_lot 0.12.1", + "pin-project", + "quick-protobuf", + "rand 0.8.5", + "rw-stream-sink", + "smallvec", + "thiserror", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-dns" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554" +dependencies = [ + "futures", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "smallvec", + "trust-dns-resolver", +] + +[[package]] +name = "libp2p-identify" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5455f472243e63b9c497ff320ded0314254a9eb751799a39c283c6f20b793f3c" +dependencies = [ + "asynchronous-codec", + "either", + "futures", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "log", + "lru 0.10.1", + "quick-protobuf", + "quick-protobuf-codec", + "smallvec", + "thiserror", + "void", +] + +[[package]] +name = "libp2p-identity" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276bb57e7af15d8f100d3c11cbdd32c6752b7eef4ba7a18ecf464972c07abcce" +dependencies = [ + "bs58 0.4.0", + "ed25519-dalek", + "log", + "multiaddr", + "multihash", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.7", + "thiserror", + "zeroize", +] + +[[package]] +name = "libp2p-kad" +version = "0.43.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39d5ef876a2b2323d63c258e63c2f8e36f205fe5a11f0b3095d59635650790ff" +dependencies = [ + "arrayvec 0.7.4", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "log", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.7", + "smallvec", + "thiserror", + "uint", + "unsigned-varint", + "void", +] + +[[package]] +name = "libp2p-mdns" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19983e1f949f979a928f2c603de1cf180cc0dc23e4ac93a62651ccb18341460b" +dependencies = [ + "data-encoding", + "futures", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "log", + "rand 0.8.5", + "smallvec", + "socket2 0.4.9", + "tokio", + "trust-dns-proto", + "void", +] + +[[package]] +name = "libp2p-metrics" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46" +dependencies = [ + "libp2p-core", + "libp2p-identify", + "libp2p-kad", + "libp2p-ping", + "libp2p-swarm", + "prometheus-client", +] + +[[package]] +name = "libp2p-noise" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3673da89d29936bc6435bafc638e2f184180d554ce844db65915113f86ec5e" +dependencies = [ + "bytes", + "curve25519-dalek 3.2.0", + "futures", + "libp2p-core", + "libp2p-identity", + "log", + "once_cell", + "quick-protobuf", + "rand 0.8.5", + "sha2 0.10.7", + "snow", + "static_assertions", + "thiserror", + "x25519-dalek 1.1.1", + "zeroize", +] + +[[package]] +name = "libp2p-ping" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202" +dependencies = [ + "either", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "void", +] + +[[package]] +name = "libp2p-quic" +version = "0.7.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6b26abd81cd2398382a1edfe739b539775be8a90fa6914f39b2ab49571ec735" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-tls", + "log", + "parking_lot 0.12.1", + "quinn-proto", + "rand 0.8.5", + "rustls 0.20.8", + "thiserror", + "tokio", +] + +[[package]] +name = "libp2p-request-response" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffdb374267d42dc5ed5bc53f6e601d4a64ac5964779c6e40bb9e4f14c1e30d5" +dependencies = [ + "async-trait", + "futures", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand 0.8.5", + "smallvec", +] + +[[package]] +name = "libp2p-swarm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "903b3d592d7694e56204d211f29d31bc004be99386644ba8731fc3e3ef27b296" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm-derive", + "log", + "rand 0.8.5", + "smallvec", + "tokio", + "void", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" +dependencies = [ + "heck 0.4.1", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "libp2p-tcp" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "log", + "socket2 0.4.9", + "tokio", +] + +[[package]] +name = "libp2p-tls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781" +dependencies = [ + "futures", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "rcgen 0.10.0", + "ring 0.16.20", + "rustls 0.20.8", + "thiserror", + "webpki 0.22.2", + "x509-parser 0.14.0", + "yasna", +] + +[[package]] +name = "libp2p-wasm-ext" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77dff9d32353a5887adb86c8afc1de1a94d9e8c3bc6df8b2201d7cdf5c848f43" +dependencies = [ + "futures", + "js-sys", + "libp2p-core", + "parity-send-wrapper", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "libp2p-webrtc" +version = "0.4.0-alpha.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dba48592edbc2f60b4bc7c10d65445b0c3964c07df26fdf493b6880d33be36f8" +dependencies = [ + "async-trait", + "asynchronous-codec", + "bytes", + "futures", + "futures-timer", + "hex", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-noise", + "log", + "multihash", + "quick-protobuf", + "quick-protobuf-codec", + "rand 0.8.5", + "rcgen 0.9.3", + "serde", + "stun", + "thiserror", + "tinytemplate", + "tokio", + "tokio-util", + "webrtc", +] + +[[package]] +name = "libp2p-websocket" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111273f7b3d3510524c752e8b7a5314b7f7a1fee7e68161c01a7d72cbb06db9f" +dependencies = [ + "either", + "futures", + "futures-rustls", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "quicksink", + "rw-stream-sink", + "soketto", + "url", + "webpki-roots", +] + +[[package]] +name = "libp2p-yamux" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd21d950662700a385d4c6d68e2f5f54d778e97068cdd718522222ef513bda" +dependencies = [ + "futures", + "libp2p-core", + "log", + "thiserror", + "yamux", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle 2.4.1", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libz-sys" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linregress" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de0b5f52a9f84544d268f5fabb71b38962d6aa3c6600b8bcd27d44ccf9c9c45" +dependencies = [ + "nalgebra", +] + +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" + +[[package]] +name = "lioness" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae926706ba42c425c9457121178330d75e273df2e82e28b758faf3de3a9acb9" +dependencies = [ + "arrayref", + "blake2 0.8.1", + "chacha", + "keystream", +] + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +dependencies = [ + "value-bag", +] + +[[package]] +name = "lru" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" +dependencies = [ + "hashbrown 0.13.2", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "macro_magic" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "macro_magic_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" +dependencies = [ + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" +dependencies = [ + "macro_magic_core", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matrixmultiply" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memfd" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +dependencies = [ + "rustix 0.37.27", +] + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-db" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +dependencies = [ + "hash-db", +] + +[[package]] +name = "merlin" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + +[[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 = "messages-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-messages", + "env_logger", + "finality-relay", + "futures", + "hex", + "log", + "num-traits", + "parking_lot 0.12.1", + "relay-utils", + "sp-arithmetic", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[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.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mixnet" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa3eb39495d8e2e2947a1d862852c90cc6a4a8845f8b41c8829cb9fcc047f4a" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "bitflags 1.3.2", + "blake2 0.10.6", + "c2-chacha", + "curve25519-dalek 4.0.0", + "either", + "hashlink", + "lioness", + "log", + "parking_lot 0.12.1", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_distr", + "subtle 2.4.1", + "thiserror", + "zeroize", +] + +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if 1.0.0", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if 1.0.0", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "multiaddr" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "log", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +dependencies = [ + "core2", + "digest 0.10.7", + "multihash-derive", + "sha2 0.10.7", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multistream-select" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint", +] + +[[package]] +name = "nalgebra" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if 1.0.0", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[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 = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[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.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.4", + "itoa", +] + +[[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-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.2", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "object" +version = "0.30.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +dependencies = [ + "crc32fast", + "hashbrown 0.13.2", + "indexmap 1.9.3", + "memchr", +] + +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" +dependencies = [ + "asn1-rs 0.3.1", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs 0.5.2", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.7", +] + +[[package]] +name = "p384" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" +dependencies = [ + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.7", +] + +[[package]] +name = "pallet-authorship" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-balances" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-beefy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-beefy-mmr" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "array-bytes 6.1.0", + "binary-merkle-tree", + "frame-support", + "frame-system", + "log", + "pallet-beefy", + "pallet-mmr", + "pallet-session", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-consensus-beefy", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-bridge-beefy" +version = "0.1.0" +dependencies = [ + "bp-beefy", + "bp-runtime", + "bp-test-utils", + "ckb-merkle-mountain-range 0.3.2", + "frame-support", + "frame-system", + "log", + "pallet-beefy-mmr", + "pallet-mmr", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-bridge-grandpa" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-messages" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-runtime", + "bp-test-utils", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "num-traits", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-bridge-parachains" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "bp-test-utils", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-bridge-grandpa", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", +] + +[[package]] +name = "pallet-bridge-relayers" +version = "0.1.0" +dependencies = [ + "bp-messages", + "bp-relayers", + "bp-runtime", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-balances", + "pallet-bridge-messages", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-grandpa" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec", + "scale-info", + "sp-application-crypto", + "sp-consensus-grandpa", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-mmr" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-mmr-primitives", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-session" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-session", + "sp-staking", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", +] + +[[package]] +name = "pallet-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-timestamp", +] + +[[package]] +name = "pallet-transaction-payment" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-transaction-payment-rpc-runtime-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "pallet-transaction-payment", + "parity-scale-codec", + "sp-api", + "sp-runtime", + "sp-weights", +] + +[[package]] +name = "pallet-utility" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "pallet-xcm-bridge-hub-router" +version = "0.1.0" +dependencies = [ + "bp-xcm-bridge-hub-router", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "staging-xcm", + "staging-xcm-builder", +] + +[[package]] +name = "parachains-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-polkadot-core", + "futures", + "log", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + +[[package]] +name = "parity-scale-codec" +version = "3.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" +dependencies = [ + "arrayvec 0.7.4", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a296c3079b5fefbc499e1de58dc26c09b1b9a5952d26694ee89f04a43ebbb3e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" + +[[package]] +name = "parity-util-mem" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" +dependencies = [ + "cfg-if 1.0.0", + "ethereum-types", + "hashbrown 0.12.3", + "impl-trait-for-tuples", + "lru 0.8.1", + "parity-util-mem-derive", + "parking_lot 0.12.1", + "primitive-types", + "smallvec", + "winapi", +] + +[[package]] +name = "parity-util-mem-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" +dependencies = [ + "proc-macro2 1.0.69", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "parity-wasm" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" + +[[package]] +name = "parking" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" + +[[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.8", +] + +[[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 0.2.16", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets 0.48.1", +] + +[[package]] +name = "partial_sort" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156" + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", +] + +[[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 = "pem-rfc7468" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap 1.9.3", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" + +[[package]] +name = "pin-project-lite" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.7", + "spki 0.7.2", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "platforms" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" + +[[package]] +name = "polkadot-core-primitives" +version = "1.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "polkadot-parachain-primitives" +version = "1.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "bounded-collections", + "derive_more", + "parity-scale-codec", + "polkadot-core-primitives", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-weights", +] + +[[package]] +name = "polkadot-primitives" +version = "1.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "bitvec", + "hex-literal", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-arithmetic", + "sp-authority-discovery", + "sp-consensus-slots", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if 1.0.0", + "concurrent-queue", + "libc", + "log", + "pin-project-lite 0.2.12", + "windows-sys 0.48.0", +] + +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash 0.4.1", +] + +[[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 0.3.0", + "universal-hash 0.4.1", +] + +[[package]] +name = "polyval" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash 0.5.1", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2 1.0.69", + "syn 1.0.109", +] + +[[package]] +name = "primitive-types" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.14", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", +] + +[[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.69", + "quote 1.0.33", + "syn 1.0.109", + "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.69", + "quote 1.0.33", + "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-macro-warning" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[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.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +dependencies = [ + "cfg-if 1.0.0", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.1", + "thiserror", +] + +[[package]] +name = "prometheus-client" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" +dependencies = [ + "dtoa", + "itoa", + "parking_lot 0.12.1", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck 0.4.1", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1693116345026436eb2f10b677806169c1a1260c1c60eaaffe3fb5a29ae23d8b" +dependencies = [ + "asynchronous-codec", + "bytes", + "quick-protobuf", + "thiserror", + "unsigned-varint", +] + +[[package]] +name = "quicksink" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project-lite 0.1.12", +] + +[[package]] +name = "quinn-proto" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c10f662eee9c94ddd7135043e544f3c82fa839a1e7b865911331961b53186c" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls 0.20.8", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki 0.22.2", +] + +[[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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2 1.0.69", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[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", +] + +[[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.10", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[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 = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "rbtag" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c64936fcc0b811890a9d90020f3df5cec9c604efde88af7db6a35d365132a3" +dependencies = [ + "rbtag_derive", +] + +[[package]] +name = "rbtag_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75511b710ccca8adbb211e04763bd8c78fed585b0ec188a20ed9b0dd95567c4" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "rcgen" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +dependencies = [ + "pem", + "ring 0.16.20", + "time 0.3.30", + "x509-parser 0.13.2", + "yasna", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring 0.16.20", + "time 0.3.30", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.10", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1641819477c319ef452a075ac34a4be92eb9ba09f6841f62d594d50fdcf0bf6b" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bf53dad9b6086826722cdc99140793afd9f62faa14a1ad07eb4f955e7a7216" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "regalloc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "relay-bridge-hub-kusama-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-kusama", + "bp-bridge-hub-polkadot", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "relay-bridge-hub-polkadot-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-kusama", + "bp-bridge-hub-polkadot", + "bp-header-chain", + "bp-kusama", + "bp-messages", + "bp-parachains", + "bp-polkadot-bulletin", + "bp-polkadot-core", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "relay-bridge-hub-rococo-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-rococo", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-core", + "sp-runtime", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-bridge-hub-westend-client" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-rococo", + "bp-bridge-hub-westend", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-rococo", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-kusama-client" +version = "0.1.0" +dependencies = [ + "bp-kusama", + "bp-polkadot-core", + "bp-runtime", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-session", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-polkadot-bulletin-client" +version = "0.1.0" +dependencies = [ + "bp-header-chain", + "bp-messages", + "bp-polkadot-bulletin", + "bp-polkadot-core", + "bp-runtime", + "bridge-runtime-common", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-session", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-polkadot-client" +version = "0.1.0" +dependencies = [ + "bp-polkadot", + "bp-polkadot-core", + "bp-runtime", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-session", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-rococo-client" +version = "0.1.0" +dependencies = [ + "bp-polkadot-core", + "bp-rococo", + "bp-runtime", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-session", + "sp-weights", + "subxt", +] + +[[package]] +name = "relay-substrate-client" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-header-chain", + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "finality-relay", + "frame-support", + "frame-system", + "futures", + "jsonrpsee 0.17.1", + "log", + "num-traits", + "pallet-balances", + "pallet-bridge-messages", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "parity-scale-codec", + "rand 0.8.5", + "relay-utils", + "sc-chain-spec", + "sc-rpc-api", + "sc-transaction-pool-api", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "sp-version", + "staging-xcm", + "thiserror", + "tokio", +] + +[[package]] +name = "relay-utils" +version = "0.1.0" +dependencies = [ + "ansi_term", + "anyhow", + "async-std", + "async-trait", + "backoff", + "bp-runtime", + "env_logger", + "futures", + "isahc", + "jsonpath_lib", + "log", + "num-traits", + "serde_json", + "sp-runtime", + "substrate-prometheus-endpoint", + "sysinfo", + "thiserror", + "time 0.3.30", + "tokio", +] + +[[package]] +name = "relay-westend-client" +version = "0.1.0" +dependencies = [ + "bp-polkadot-core", + "bp-runtime", + "bp-westend", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "sp-session", + "sp-weights", + "subxt", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac 0.12.1", + "zeroize", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle 2.4.1", +] + +[[package]] +name = "ring" +version = "0.1.0" +source = "git+https://github.com/w3f/ring-proof#61e7b528bc0170d6bf541be32440d569b784425d" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "blake2 0.10.6", + "common", + "fflonk", + "merlin 3.0.0", +] + +[[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", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rtcp" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" +dependencies = [ + "bytes", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", + "tokio", +] + +[[package]] +name = "rtp" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" +dependencies = [ + "async-trait", + "bytes", + "rand 0.8.5", + "serde", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c37f1bd5ef1b5422177b7646cba67430579cfe2ace80f284fee876bca52ad941" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys 0.4.10", + "windows-sys 0.48.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 0.16.20", + "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 0.16.20", + "sct 0.7.0", + "webpki 0.22.2", +] + +[[package]] +name = "rustls" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" +dependencies = [ + "log", + "ring 0.16.20", + "rustls-webpki", + "sct 0.7.0", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.2", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +dependencies = [ + "ring 0.16.20", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ruzstd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3ffab8f9715a0d455df4bbb9d21e91135aab3cd3ca187af0cd0c3c3f868fdc" +dependencies = [ + "byteorder", + "thiserror-core", + "twox-hash", +] + +[[package]] +name = "rw-stream-sink" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "safe_arch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +dependencies = [ + "bytemuck", +] + +[[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 = "sc-allocator" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "log", + "sp-core", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "sc-chain-spec" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "array-bytes 6.1.0", + "docify", + "log", + "memmap2", + "parity-scale-codec", + "sc-chain-spec-derive", + "sc-client-api", + "sc-executor", + "sc-network", + "sc-telemetry", + "serde", + "serde_json", + "sp-blockchain", + "sp-core", + "sp-genesis-builder", + "sp-io", + "sp-runtime", + "sp-state-machine", +] + +[[package]] +name = "sc-chain-spec-derive" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "proc-macro-crate 2.0.0", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "sc-client-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "fnv", + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor", + "sc-transaction-pool-api", + "sc-utils", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-database", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-runtime", + "sp-state-machine", + "sp-statement-store", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "substrate-prometheus-endpoint", +] + +[[package]] +name = "sc-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "libp2p-identity", + "log", + "mockall", + "parking_lot 0.12.1", + "sc-client-api", + "sc-utils", + "serde", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "sp-state-machine", + "substrate-prometheus-endpoint", + "thiserror", +] + +[[package]] +name = "sc-executor" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-executor-common", + "sc-executor-wasmtime", + "schnellru", + "sp-api", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "sp-version", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "tracing", +] + +[[package]] +name = "sc-executor-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "sc-allocator", + "sp-maybe-compressed-blob", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", + "wasm-instrument", +] + +[[package]] +name = "sc-executor-wasmtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "anyhow", + "cfg-if 1.0.0", + "libc", + "log", + "parking_lot 0.12.1", + "rustix 0.36.15", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "wasmtime", +] + +[[package]] +name = "sc-mixnet" +version = "0.1.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "array-bytes 4.2.0", + "arrayvec 0.7.4", + "blake2 0.10.6", + "bytes", + "futures", + "futures-timer", + "libp2p-identity", + "log", + "mixnet", + "multiaddr", + "parity-scale-codec", + "parking_lot 0.12.1", + "sc-client-api", + "sc-network", + "sc-transaction-pool-api", + "sp-api", + "sp-consensus", + "sp-core", + "sp-keystore", + "sp-mixnet", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-network" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "array-bytes 6.1.0", + "async-channel", + "async-trait", + "asynchronous-codec", + "bytes", + "either", + "fnv", + "futures", + "futures-timer", + "ip_network", + "libp2p", + "linked_hash_set", + "log", + "mockall", + "parity-scale-codec", + "parking_lot 0.12.1", + "partial_sort", + "pin-project", + "rand 0.8.5", + "sc-client-api", + "sc-network-common", + "sc-utils", + "serde", + "serde_json", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-core", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "tokio", + "tokio-stream", + "unsigned-varint", + "wasm-timer", + "zeroize", +] + +[[package]] +name = "sc-network-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "futures", + "libp2p-identity", + "parity-scale-codec", + "prost-build", + "sc-consensus", + "sp-consensus", + "sp-consensus-grandpa", + "sp-runtime", +] + +[[package]] +name = "sc-rpc-api" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "jsonrpsee 0.16.2", + "parity-scale-codec", + "sc-chain-spec", + "sc-mixnet", + "sc-transaction-pool-api", + "scale-info", + "serde", + "serde_json", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-version", + "thiserror", +] + +[[package]] +name = "sc-telemetry" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "chrono", + "futures", + "libp2p", + "log", + "parking_lot 0.12.1", + "pin-project", + "rand 0.8.5", + "sc-utils", + "serde", + "serde_json", + "thiserror", + "wasm-timer", +] + +[[package]] +name = "sc-transaction-pool-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "async-trait", + "futures", + "log", + "parity-scale-codec", + "serde", + "sp-blockchain", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-utils" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "async-channel", + "futures", + "futures-timer", + "lazy_static", + "log", + "parking_lot 0.12.1", + "prometheus", + "sp-arithmetic", +] + +[[package]] +name = "scale-bits" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "scale-decode" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7789f5728e4e954aaa20cadcc370b99096fb8645fca3c9333ace44bb18f30095" +dependencies = [ + "derive_more", + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-decode-derive", + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-decode-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27873eb6005868f8cc72dcfe109fae664cf51223d35387bc2f28be4c28d94c47" +dependencies = [ + "darling 0.14.4", + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "scale-encode" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5" +dependencies = [ + "derive_more", + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-encode-derive", + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-encode-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" +dependencies = [ + "darling 0.14.4", + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "scale-info" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +dependencies = [ + "bitvec", + "cfg-if 1.0.0", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "scale-value" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6538d1cc1af9c0baf401c57da8a6d4730ef582db0d330d2efa56ec946b5b0283" +dependencies = [ + "base58", + "blake2 0.10.6", + "derive_more", + "either", + "frame-metadata 15.1.0", + "parity-scale-codec", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "serde", + "yap", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "schnellru" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +dependencies = [ + "ahash 0.8.3", + "cfg-if 1.0.0", + "hashbrown 0.13.2", +] + +[[package]] +name = "schnorrkel" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "curve25519-dalek 2.1.3", + "getrandom 0.1.16", + "merlin 2.0.1", + "rand 0.7.3", + "rand_core 0.5.1", + "sha2 0.8.2", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "schnorrkel" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "844b7645371e6ecdf61ff246ba1958c29e802881a749ae3fb1993675d210d28d" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "curve25519-dalek-ng", + "merlin 3.0.0", + "rand_core 0.6.4", + "sha2 0.9.9", + "subtle-ng", + "zeroize", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring 0.16.20", + "untrusted", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring 0.16.20", + "untrusted", +] + +[[package]] +name = "sdp" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" +dependencies = [ + "rand 0.8.5", + "substring", + "thiserror", + "url", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array 0.14.7", + "pkcs8 0.9.0", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.7", + "generic-array 0.14.7", + "pkcs8 0.10.2", + "subtle 2.4.1", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acea373acb8c21ecb5a23741452acd2593ed44ee3d343e72baaa143bc89d0d5" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e67c467c38fd24bd5499dc9a18183b31575c12ee549197e3e20d57aa4fe3b7" +dependencies = [ + "cc", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "indexmap 2.0.0", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + +[[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 0.3.0", +] + +[[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.7", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[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 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "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 = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-async-std" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4aa94397e2023af5b7cff5b8d4785e935cfb77f0e4aab0cae3b26258ace556" +dependencies = [ + "async-io", + "futures-lite", + "libc", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simple-mermaid" +version = "0.1.0" +source = "git+https://github.com/kianenigma/simple-mermaid.git?branch=main#e48b187bcfd5cc75111acd9d241f1bd36604344b" + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel", + "futures-core", + "futures-io", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "smol" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096ec6987a1" +dependencies = [ + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", +] + +[[package]] +name = "smoldot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cce5e2881b30bad7ef89f383a816ad0b22c45915911f28499026de4a76d20ee" +dependencies = [ + "arrayvec 0.7.4", + "async-lock", + "atomic", + "base64 0.21.2", + "bip39", + "blake2-rfc", + "bs58 0.5.0", + "crossbeam-queue", + "derive_more", + "ed25519-zebra", + "either", + "event-listener", + "fnv", + "futures-channel", + "futures-util", + "hashbrown 0.14.0", + "hex", + "hmac 0.12.1", + "itertools", + "libsecp256k1", + "merlin 3.0.0", + "no-std-net", + "nom", + "num-bigint", + "num-rational", + "num-traits", + "pbkdf2 0.12.2", + "pin-project", + "rand 0.8.5", + "rand_chacha 0.3.1", + "ruzstd", + "schnorrkel 0.10.2", + "serde", + "serde_json", + "sha2 0.10.7", + "siphasher", + "slab", + "smallvec", + "smol", + "snow", + "soketto", + "tiny-keccak", + "twox-hash", + "wasmi", +] + +[[package]] +name = "smoldot-light" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2f7b4687b83ff244ef6137735ed5716ad37dcdf3ee16c4eb1a32fb9808fa47" +dependencies = [ + "async-lock", + "blake2-rfc", + "derive_more", + "either", + "event-listener", + "fnv", + "futures-channel", + "futures-util", + "hashbrown 0.14.0", + "hex", + "itertools", + "log", + "lru 0.10.1", + "parking_lot 0.12.1", + "rand 0.8.5", + "serde", + "serde_json", + "siphasher", + "slab", + "smol", + "smoldot", +] + +[[package]] +name = "snow" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9d1425eb528a21de2755c75af4c9b5d57f50a0d4c3b7f1828a4cd03f8ba155" +dependencies = [ + "aes-gcm 0.9.4", + "blake2 0.10.6", + "chacha20poly1305", + "curve25519-dalek 4.0.0", + "rand_core 0.6.4", + "ring 0.16.20", + "rustc_version", + "sha2 0.10.7", + "subtle 2.4.1", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[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", + "flate2", + "futures", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + +[[package]] +name = "sp-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "scale-info", + "sp-api-proc-macro", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-metadata-ir", + "sp-runtime", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "sp-version", + "thiserror", +] + +[[package]] +name = "sp-api-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "Inflector", + "blake2 0.10.6", + "expander", + "proc-macro-crate 2.0.0", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "sp-application-crypto" +version = "23.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-arithmetic" +version = "16.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "static_assertions", +] + +[[package]] +name = "sp-ark-bls12-381" +version = "0.4.2" +source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" +dependencies = [ + "ark-bls12-381-ext", + "sp-crypto-ec-utils", +] + +[[package]] +name = "sp-ark-ed-on-bls12-381-bandersnatch" +version = "0.4.2" +source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" +dependencies = [ + "ark-ed-on-bls12-381-bandersnatch-ext", + "sp-crypto-ec-utils", +] + +[[package]] +name = "sp-authority-discovery" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-blockchain" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "futures", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "schnellru", + "sp-api", + "sp-consensus", + "sp-database", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sp-consensus" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "async-trait", + "futures", + "log", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "thiserror", +] + +[[package]] +name = "sp-consensus-beefy" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "lazy_static", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-io", + "sp-mmr-primitives", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "strum 0.24.1", +] + +[[package]] +name = "sp-consensus-grandpa" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "finality-grandpa", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-consensus-slots" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-timestamp", +] + +[[package]] +name = "sp-core" +version = "21.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "array-bytes 6.1.0", + "bandersnatch_vrfs", + "bip39", + "bitflags 1.3.2", + "blake2 0.10.6", + "bounded-collections", + "bs58 0.5.0", + "dyn-clonable", + "ed25519-zebra", + "futures", + "hash-db", + "hash256-std-hasher", + "impl-serde", + "itertools", + "libsecp256k1", + "log", + "merlin 2.0.1", + "parity-scale-codec", + "parking_lot 0.12.1", + "paste", + "primitive-types", + "rand 0.8.5", + "scale-info", + "schnorrkel 0.9.1", + "secp256k1", + "secrecy", + "serde", + "sp-core-hashing 9.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tracing", + "w3f-bls", + "zeroize", +] + +[[package]] +name = "sp-core-hashing" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee599a8399448e65197f9a6cee338ad192e9023e35e31f22382964c3c174c68" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.7", + "sha3", + "sp-std 8.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing" +version = "9.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.7", + "sha3", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing-proc-macro" +version = "9.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "quote 1.0.33", + "sp-core-hashing 9.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "syn 2.0.39", +] + +[[package]] +name = "sp-crypto-ec-utils" +version = "0.4.1" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "ark-bls12-377", + "ark-bls12-377-ext", + "ark-bls12-381", + "ark-bls12-381-ext", + "ark-bw6-761", + "ark-bw6-761-ext", + "ark-ec", + "ark-ed-on-bls12-377", + "ark-ed-on-bls12-377-ext", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ed-on-bls12-381-bandersnatch-ext", + "ark-scale", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", +] + +[[package]] +name = "sp-database" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "kvdb", + "parking_lot 0.12.1", +] + +[[package]] +name = "sp-debug-derive" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "sp-debug-derive" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "sp-externalities" +version = "0.19.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-externalities" +version = "0.19.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk)", +] + +[[package]] +name = "sp-genesis-builder" +version = "0.1.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "serde_json", + "sp-api", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-inherents" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "async-trait", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-io" +version = "23.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "bytes", + "ed25519-dalek", + "libsecp256k1", + "log", + "parity-scale-codec", + "rustversion", + "secp256k1", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-keystore", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-tracing 10.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keyring" +version = "24.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "lazy_static", + "sp-core", + "sp-runtime", + "strum 0.24.1", +] + +[[package]] +name = "sp-keystore" +version = "0.27.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "parking_lot 0.12.1", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-maybe-compressed-blob" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "thiserror", + "zstd 0.12.4", +] + +[[package]] +name = "sp-metadata-ir" +version = "0.1.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-metadata 16.0.0", + "parity-scale-codec", + "scale-info", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-mixnet" +version = "0.1.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-mmr-primitives" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "ckb-merkle-mountain-range 0.5.2", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-api", + "sp-core", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-panic-handler" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "backtrace", + "lazy_static", + "regex", +] + +[[package]] +name = "sp-rpc" +version = "6.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "rustc-hash", + "serde", + "sp-core", +] + +[[package]] +name = "sp-runtime" +version = "24.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "docify", + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "paste", + "rand 0.8.5", + "scale-info", + "serde", + "simple-mermaid", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-weights", +] + +[[package]] +name = "sp-runtime-interface" +version = "17.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-runtime-interface-proc-macro 11.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-tracing 10.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface" +version = "17.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-runtime-interface-proc-macro 11.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-tracing 10.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "11.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "Inflector", + "expander", + "proc-macro-crate 2.0.0", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "11.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "Inflector", + "expander", + "proc-macro-crate 2.0.0", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "sp-session" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-core", + "sp-keystore", + "sp-runtime", + "sp-staking", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-staking" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-state-machine" +version = "0.28.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "smallvec", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-panic-handler", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "thiserror", + "tracing", + "trie-db", +] + +[[package]] +name = "sp-statement-store" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "aes-gcm 0.10.2", + "curve25519-dalek 4.0.0", + "ed25519-dalek", + "hkdf", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "sha2 0.10.7", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-runtime", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", + "x25519-dalek 2.0.0", +] + +[[package]] +name = "sp-std" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53458e3c57df53698b3401ec0934bea8e8cfce034816873c0b0abbd83d7bac0d" + +[[package]] +name = "sp-std" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" + +[[package]] +name = "sp-std" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" + +[[package]] +name = "sp-storage" +version = "13.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-storage" +version = "13.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", +] + +[[package]] +name = "sp-timestamp" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "async-trait", + "parity-scale-codec", + "sp-inherents", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-tracing" +version = "10.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sp-tracing" +version = "10.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sp-trie" +version = "22.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "ahash 0.8.3", + "hash-db", + "hashbrown 0.13.2", + "lazy_static", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot 0.12.1", + "rand 0.8.5", + "scale-info", + "schnellru", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-version" +version = "22.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "parity-wasm", + "scale-info", + "serde", + "sp-core-hashing-proc-macro", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-version-proc-macro", + "thiserror", +] + +[[package]] +name = "sp-version-proc-macro" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "sp-wasm-interface" +version = "14.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "wasmtime", +] + +[[package]] +name = "sp-wasm-interface" +version = "14.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "wasmtime", +] + +[[package]] +name = "sp-weights" +version = "20.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic", + "sp-core", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der 0.7.7", +] + +[[package]] +name = "ss58-registry" +version = "1.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfc443bad666016e012538782d9e3006213a7db43e9fb1dda91657dc06a6fa08" +dependencies = [ + "Inflector", + "num-format", + "proc-macro2 1.0.69", + "quote 1.0.33", + "serde", + "serde_json", + "unicode-xid 0.2.4", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "staging-xcm" +version = "1.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "bounded-collections", + "derivative", + "environmental", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-weights", + "xcm-procedural", +] + +[[package]] +name = "staging-xcm-builder" +version = "1.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "pallet-transaction-payment", + "parity-scale-codec", + "polkadot-parachain-primitives", + "scale-info", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-weights", + "staging-xcm", + "staging-xcm-executor", +] + +[[package]] +name = "staging-xcm-executor" +version = "1.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "environmental", + "frame-benchmarking", + "frame-support", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-weights", + "staging-xcm", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros 0.25.2", +] + +[[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.69", + "quote 1.0.33", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "strum_macros" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.69", + "quote 1.0.33", + "rustversion", + "syn 2.0.39", +] + +[[package]] +name = "stun" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" +dependencies = [ + "base64 0.13.1", + "crc", + "lazy_static", + "md-5", + "rand 0.8.5", + "ring 0.16.20", + "subtle 2.4.1", + "thiserror", + "tokio", + "url", + "webrtc-util", +] + +[[package]] +name = "substrate-bip39" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" +dependencies = [ + "hmac 0.11.0", + "pbkdf2 0.8.0", + "schnorrkel 0.9.1", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "substrate-prometheus-endpoint" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "hyper", + "log", + "prometheus", + "thiserror", + "tokio", +] + +[[package]] +name = "substrate-relay" +version = "1.0.1" +dependencies = [ + "anyhow", + "async-std", + "async-trait", + "bp-bridge-hub-polkadot", + "bp-bridge-hub-rococo", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot", + "bp-polkadot-bulletin", + "bp-polkadot-core", + "bp-rococo", + "bp-runtime", + "bp-test-utils", + "bridge-runtime-common", + "env_logger", + "finality-grandpa", + "frame-support", + "futures", + "hex", + "hex-literal", + "log", + "num-format", + "num-traits", + "pallet-bridge-parachains", + "parachains-relay", + "parity-scale-codec", + "rbtag", + "relay-bridge-hub-kusama-client", + "relay-bridge-hub-polkadot-client", + "relay-bridge-hub-rococo-client", + "relay-bridge-hub-westend-client", + "relay-kusama-client", + "relay-polkadot-bulletin-client", + "relay-polkadot-client", + "relay-rococo-client", + "relay-substrate-client", + "relay-utils", + "relay-westend-client", + "signal-hook", + "signal-hook-async-std", + "sp-core", + "sp-keyring", + "sp-runtime", + "structopt", + "strum 0.25.0", + "substrate-relay-helper", + "tempfile", +] + +[[package]] +name = "substrate-relay-helper" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-std", + "async-trait", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-rococo", + "bp-runtime", + "bridge-runtime-common", + "equivocation-detector", + "finality-grandpa", + "finality-relay", + "frame-support", + "frame-system", + "futures", + "hex", + "log", + "messages-relay", + "num-traits", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-grandpa", + "pallet-transaction-payment", + "parachains-relay", + "parity-scale-codec", + "relay-bridge-hub-rococo-client", + "relay-bridge-hub-westend-client", + "relay-rococo-client", + "relay-substrate-client", + "relay-utils", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + +[[package]] +name = "subxt" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "588b8ce92699eeb06290f4fb02dad4f7e426c4e6db4d53889c6bcbc808cf24ac" +dependencies = [ + "async-trait", + "base58", + "blake2 0.10.6", + "derivative", + "either", + "frame-metadata 16.0.0", + "futures", + "hex", + "impl-serde", + "jsonrpsee 0.20.1", + "parity-scale-codec", + "primitive-types", + "scale-bits", + "scale-decode", + "scale-encode", + "scale-info", + "scale-value", + "serde", + "serde_json", + "sp-core-hashing 9.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subxt-lightclient", + "subxt-macro", + "subxt-metadata", + "thiserror", + "tracing", +] + +[[package]] +name = "subxt-codegen" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98f5a534c8d475919e9c845d51fc2316da4fcadd04fe17552d932d2106de930e" +dependencies = [ + "frame-metadata 16.0.0", + "heck 0.4.1", + "hex", + "jsonrpsee 0.20.1", + "parity-scale-codec", + "proc-macro2 1.0.69", + "quote 1.0.33", + "scale-info", + "subxt-metadata", + "syn 2.0.39", + "thiserror", + "tokio", +] + +[[package]] +name = "subxt-lightclient" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10fd0ac9b091211f962b6ae19e26cd08e0b86efa064dfb7fac69c8f79f122329" +dependencies = [ + "futures", + "futures-util", + "serde", + "serde_json", + "smoldot-light", + "thiserror", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "subxt-macro" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12e8be9ab6fe88b8c13edbe15911e148482cfb905a8b8d5b8d766a64c54be0bd" +dependencies = [ + "darling 0.20.3", + "proc-macro-error", + "subxt-codegen", + "syn 2.0.39", +] + +[[package]] +name = "subxt-metadata" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6898275765d36a37e5ef564358e0341cf41b5f3a91683d7d8b859381b65ac8a" +dependencies = [ + "frame-metadata 16.0.0", + "parity-scale-codec", + "scale-info", + "sp-core-hashing 9.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror", +] + +[[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.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", + "unicode-xid 0.2.4", +] + +[[package]] +name = "sysinfo" +version = "0.29.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" +dependencies = [ + "cfg-if 1.0.0", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "winapi", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2faeef5759ab89935255b1a4cd98e0baf99d1085e37d36599c625dac49ae8e" + +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if 1.0.0", + "fastrand 2.0.0", + "redox_syscall 0.4.1", + "rustix 0.38.21", + "windows-sys 0.48.0", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + +[[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.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-core" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d97345f6437bb2004cd58819d8a9ef8e36cdd7661c2abc4bbde0a7c40d9f497" +dependencies = [ + "thiserror-core-impl", +] + +[[package]] +name = "thiserror-core-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ac1c5050e43014d16b2f94d0d2ce79e65ffdd8b38d8048f9c8f6a8a6da62ac" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + +[[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", +] + +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "itoa", + "libc", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[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.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite 0.2.12", + "signal-hook-registry", + "socket2 0.5.5", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.5", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite 0.2.12", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite 0.2.12", + "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" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.14", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.0.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite 0.2.12", + "tower-layer", + "tower-service", + "tracing", +] + +[[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 0.2.12", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +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-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "trie-db" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff28e0f815c2fea41ebddf148e008b077d2faddb026c9555b29696114d602642" +dependencies = [ + "hash-db", + "hashbrown 0.13.2", + "log", + "rustc-hex", + "smallvec", +] + +[[package]] +name = "trie-root" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" +dependencies = [ + "hash-db", +] + +[[package]] +name = "trust-dns-proto" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" +dependencies = [ + "async-trait", + "cfg-if 1.0.0", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "rand 0.8.5", + "smallvec", + "socket2 0.4.9", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" +dependencies = [ + "cfg-if 1.0.0", + "futures-util", + "ipconfig", + "lazy_static", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", + "trust-dns-proto", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "tt-call" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" + +[[package]] +name = "turn" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" +dependencies = [ + "async-trait", + "base64 0.13.1", + "futures", + "log", + "md-5", + "rand 0.8.5", + "ring 0.16.20", + "stun", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if 1.0.0", + "digest 0.10.7", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[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 0.14.7", + "subtle 2.4.1", +] + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle 2.4.1", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures-io", + "futures-util", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +dependencies = [ + "form_urlencoded", + "idna 0.4.0", + "percent-encoding", +] + +[[package]] +name = "uuid" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +dependencies = [ + "getrandom 0.2.10", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "value-bag" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" + +[[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 = "w3f-bls" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" +dependencies = [ + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-serialize-derive", + "arrayref", + "constcat", + "digest 0.10.7", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "sha2 0.10.7", + "sha3", + "thiserror", + "zeroize", +] + +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "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.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote 1.0.33", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "wasm-instrument" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmi" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51fb5c61993e71158abf5bb863df2674ca3ec39ed6471c64f07aeaf751d67b4" +dependencies = [ + "intx", + "smallvec", + "spin 0.9.8", + "wasmi_arena", + "wasmi_core", + "wasmparser-nostd", +] + +[[package]] +name = "wasmi_arena" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "401c1f35e413fac1846d4843745589d9ec678977ab35a384db8ae7830525d468" + +[[package]] +name = "wasmi_core" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624e6333e861ef49095d2d678b76ebf30b06bf37effca845be7e5b87c90071b7" +dependencies = [ + "downcast-rs", + "libm", + "num-traits", + "paste", +] + +[[package]] +name = "wasmparser" +version = "0.102.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +dependencies = [ + "indexmap 1.9.3", + "url", +] + +[[package]] +name = "wasmparser-nostd" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" +dependencies = [ + "indexmap-nostd", +] + +[[package]] +name = "wasmtime" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" +dependencies = [ + "anyhow", + "bincode", + "cfg-if 1.0.0", + "indexmap 1.9.3", + "libc", + "log", + "object 0.30.4", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "wasmtime-cache" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86437fa68626fe896e5afc69234bb2b5894949083586535f200385adfd71213" +dependencies = [ + "anyhow", + "base64 0.21.2", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix 0.36.15", + "serde", + "sha2 0.10.7", + "toml 0.5.11", + "windows-sys 0.45.0", + "zstd 0.11.2+zstd.1.5.2", +] + +[[package]] +name = "wasmtime-cranelift" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1cefde0cce8cb700b1b21b6298a3837dba46521affd7b8c38a9ee2c869eee04" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli", + "log", + "object 0.30.4", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-cranelift-shared", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-cranelift-shared" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd041e382ef5aea1b9fc78442394f1a4f6d676ce457e7076ca4cb3f397882f8b" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-native", + "gimli", + "object 0.30.4", + "target-lexicon", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli", + "indexmap 1.9.3", + "log", + "object 0.30.4", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" +dependencies = [ + "addr2line 0.19.0", + "anyhow", + "bincode", + "cfg-if 1.0.0", + "cpp_demangle", + "gimli", + "log", + "object 0.30.4", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" +dependencies = [ + "object 0.30.4", + "once_cell", + "rustix 0.36.15", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" +dependencies = [ + "anyhow", + "cc", + "cfg-if 1.0.0", + "indexmap 1.9.3", + "libc", + "log", + "mach", + "memfd", + "memoffset 0.8.0", + "paste", + "rand 0.8.5", + "rustix 0.36.15", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-types" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +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 0.16.20", + "untrusted", +] + +[[package]] +name = "webpki" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ecc0cd7cac091bf682ec5efa18b1cff79d617b84181f38b3951dbe135f607f" +dependencies = [ + "ring 0.16.20", + "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.2", +] + +[[package]] +name = "webrtc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "hex", + "interceptor", + "lazy_static", + "log", + "rand 0.8.5", + "rcgen 0.9.3", + "regex", + "ring 0.16.20", + "rtcp", + "rtp", + "rustls 0.19.1", + "sdp", + "serde", + "serde_json", + "sha2 0.10.7", + "stun", + "thiserror", + "time 0.3.30", + "tokio", + "turn", + "url", + "waitgroup", + "webrtc-data", + "webrtc-dtls", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-data" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" +dependencies = [ + "bytes", + "derive_builder", + "log", + "thiserror", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-dtls" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942be5bd85f072c3128396f6e5a9bfb93ca8c1939ded735d177b7bcba9a13d05" +dependencies = [ + "aes 0.6.0", + "aes-gcm 0.10.2", + "async-trait", + "bincode", + "block-modes", + "byteorder", + "ccm", + "curve25519-dalek 3.2.0", + "der-parser 8.2.0", + "elliptic-curve 0.12.3", + "hkdf", + "hmac 0.12.1", + "log", + "oid-registry 0.6.1", + "p256", + "p384", + "rand 0.8.5", + "rand_core 0.6.4", + "rcgen 0.9.3", + "ring 0.16.20", + "rustls 0.19.1", + "sec1 0.3.0", + "serde", + "sha1", + "sha2 0.10.7", + "signature 1.6.4", + "subtle 2.4.1", + "thiserror", + "tokio", + "webpki 0.21.4", + "webrtc-util", + "x25519-dalek 2.0.0", + "x509-parser 0.13.2", +] + +[[package]] +name = "webrtc-ice" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a03cc11e9a7d7b4f9f99870558fe37a102b65b93f8045392fef7c67b39e80" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "rand 0.8.5", + "serde", + "serde_json", + "stun", + "thiserror", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" +dependencies = [ + "log", + "socket2 0.4.9", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f72e1650a8ae006017d1a5280efb49e2610c19ccc3c0905b03b648aee9554991" +dependencies = [ + "byteorder", + "bytes", + "rand 0.8.5", + "rtp", + "thiserror", +] + +[[package]] +name = "webrtc-sctp" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "rand 0.8.5", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "aes-gcm 0.9.4", + "async-trait", + "byteorder", + "bytes", + "ctr 0.8.0", + "hmac 0.11.0", + "log", + "rtcp", + "rtp", + "sha-1", + "subtle 2.4.1", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "cc", + "ipnet", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "thiserror", + "tokio", + "winapi", +] + +[[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 = "wide" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa469ffa65ef7e0ba0f164183697b89b854253fd31aeb92358b7b6155177d62f" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + +[[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-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", +] + +[[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" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" +dependencies = [ + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if 1.0.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x25519-dalek" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" +dependencies = [ + "curve25519-dalek 4.0.0", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" +dependencies = [ + "asn1-rs 0.3.1", + "base64 0.13.1", + "data-encoding", + "der-parser 7.0.0", + "lazy_static", + "nom", + "oid-registry 0.4.0", + "ring 0.16.20", + "rusticata-macros", + "thiserror", + "time 0.3.30", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs 0.5.2", + "base64 0.13.1", + "data-encoding", + "der-parser 8.2.0", + "lazy_static", + "nom", + "oid-registry 0.6.1", + "rusticata-macros", + "thiserror", + "time 0.3.30", +] + +[[package]] +name = "xcm-procedural" +version = "1.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#756a12d57134c3318c0dd3b5d9b9a304026b4aa7" +dependencies = [ + "Inflector", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "yamux" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" +dependencies = [ + "futures", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "yap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4524214bc4629eba08d78ceb1d6507070cc0bcbbed23af74e19e6e924a24cf" + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time 0.3.30", +] + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.39", +] + +[[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 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +dependencies = [ + "zstd-safe 6.0.5+zstd.1.5.4", +] + +[[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-safe" +version = "6.0.5+zstd.1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000000..ffa9e337c198 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,56 @@ +[workspace.package] +authors = ["Parity Technologies "] +edition = "2021" +repository = "https://github.com/paritytech/parity-bridges-common.git" +license = "GPL-3.0-only" + +[workspace] +resolver = "2" + +members = [ + "bin/runtime-common", + "modules/beefy", + "modules/grandpa", + "modules/messages", + "modules/parachains", + "modules/relayers", + "modules/xcm-bridge-hub-router", + "primitives/beefy", + "primitives/chain-asset-hub-rococo", + "primitives/chain-asset-hub-westend", + "primitives/chain-bridge-hub-cumulus", + "primitives/chain-bridge-hub-kusama", + "primitives/chain-bridge-hub-polkadot", + "primitives/chain-bridge-hub-rococo", + "primitives/chain-bridge-hub-westend", + "primitives/chain-kusama", + "primitives/chain-polkadot", + "primitives/chain-polkadot-bulletin", + "primitives/chain-rococo", + "primitives/chain-westend", + "primitives/header-chain", + "primitives/messages", + "primitives/parachains", + "primitives/polkadot-core", + "primitives/relayers", + "primitives/runtime", + "primitives/test-utils", + "primitives/xcm-bridge-hub-router", + "relays/bin-substrate", + "relays/client-bridge-hub-kusama", + "relays/client-bridge-hub-polkadot", + "relays/client-bridge-hub-rococo", + "relays/client-bridge-hub-westend", + "relays/client-kusama", + "relays/client-polkadot", + "relays/client-polkadot-bulletin", + "relays/client-rococo", + "relays/client-substrate", + "relays/client-westend", + "relays/equivocation", + "relays/finality", + "relays/lib-substrate-relay", + "relays/messages", + "relays/parachains", + "relays/utils", +] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000000..99831af410d6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,72 @@ +# Builds images used by the bridge. +# +# In particular, it can be used to build Substrate nodes and bridge relayers. The binary that gets +# built can be specified with the `PROJECT` build-arg. For example, to build the `substrate-relay` +# you would do the following: +# +# `docker build . -t local/substrate-relay --build-arg=PROJECT=substrate-relay` +# +# See the `deployments/README.md` for all the available `PROJECT` values. + +FROM docker.io/paritytech/bridges-ci:production as builder +USER root +WORKDIR /parity-bridges-common + +COPY . . + +ARG PROJECT=substrate-relay +RUN cargo build --release --verbose -p ${PROJECT} && \ + strip ./target/release/${PROJECT} + +# In this final stage we copy over the final binary and do some checks +# to make sure that everything looks good. +FROM docker.io/library/ubuntu:20.04 as runtime + +# show backtraces +ENV RUST_BACKTRACE 1 +ENV DEBIAN_FRONTEND=noninteractive + +RUN set -eux; \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + curl ca-certificates libssl-dev && \ + update-ca-certificates && \ + groupadd -g 1000 user && \ + useradd -u 1000 -g user -s /bin/sh -m user && \ + # apt clean up + apt-get autoremove -y && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# switch to non-root user +USER user + +WORKDIR /home/user + +ARG PROJECT=substrate-relay + +COPY --chown=user:user --from=builder /parity-bridges-common/target/release/${PROJECT}* ./ +COPY --chown=user:user --from=builder /parity-bridges-common/deployments/local-scripts/bridge-entrypoint.sh ./ + +# check if executable works in this container +RUN ./${PROJECT} --version + +ENV PROJECT=$PROJECT +ENTRYPOINT ["/home/user/bridge-entrypoint.sh"] + +# metadata +ARG VCS_REF=master +ARG BUILD_DATE="" +ARG VERSION="" + +LABEL org.opencontainers.image.title="${PROJECT}" \ + org.opencontainers.image.description="${PROJECT} - component of Parity Bridges Common" \ + org.opencontainers.image.source="https://github.com/paritytech/parity-bridges-common/blob/${VCS_REF}/Dockerfile" \ + org.opencontainers.image.url="https://github.com/paritytech/parity-bridges-common/blob/${VCS_REF}/Dockerfile" \ + org.opencontainers.image.documentation="https://github.com/paritytech/parity-bridges-common/blob/${VCS_REF}/README.md" \ + org.opencontainers.image.created="${BUILD_DATE}" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.revision="${VCS_REF}" \ + org.opencontainers.image.authors="devops-team@parity.io" \ + org.opencontainers.image.vendor="Parity Technologies" \ + org.opencontainers.image.licenses="GPL-3.0 License" diff --git a/cumulus/LICENSE b/LICENSE similarity index 100% rename from cumulus/LICENSE rename to LICENSE diff --git a/README.md b/README.md new file mode 100644 index 000000000000..a2ce213d2541 --- /dev/null +++ b/README.md @@ -0,0 +1,116 @@ +# Parity Bridges Common + +This is a collection of components for building bridges. + +These components include Substrate pallets for syncing headers, passing arbitrary messages, as well as libraries for +building relayers to provide cross-chain communication capabilities. + +Three bridge nodes are also available. The nodes can be used to run test networks which bridge other Substrate chains. + +🚧 The bridges are currently under construction - a hardhat is recommended beyond this point 🚧 + +## Contents + +- [Installation](#installation) +- [High-Level Architecture](#high-level-architecture) +- [Project Layout](#project-layout) +- [Running the Bridge](#running-the-bridge) +- [How to send a message](#how-to-send-a-message) +- [Community](#community) + +## Installation + +To get up and running you need both stable and nightly Rust. Rust nightly is used to build the Web Assembly (WASM) +runtime for the node. You can configure the WASM support as so: + +```bash +rustup install nightly +rustup target add wasm32-unknown-unknown --toolchain nightly +``` + +Once this is configured you can build and test the repo as follows: + +``` +git clone https://github.com/paritytech/parity-bridges-common.git +cd parity-bridges-common +cargo build --all +cargo test --all +``` + +Also you can build the repo with [Parity CI Docker +image](https://github.com/paritytech/scripts/tree/master/dockerfiles/bridges-ci): + +```bash +docker pull paritytech/bridges-ci:production +mkdir ~/cache +chown 1000:1000 ~/cache #processes in the container runs as "nonroot" user with UID 1000 +docker run --rm -it -w /shellhere/parity-bridges-common \ + -v /home/$(whoami)/cache/:/cache/ \ + -v "$(pwd)":/shellhere/parity-bridges-common \ + -e CARGO_HOME=/cache/cargo/ \ + -e SCCACHE_DIR=/cache/sccache/ \ + -e CARGO_TARGET_DIR=/cache/target/ paritytech/bridges-ci:production cargo build --all +#artifacts can be found in ~/cache/target +``` + +If you want to reproduce other steps of CI process you can use the following +[guide](https://github.com/paritytech/scripts#reproduce-ci-locally). + +If you need more information about setting up your development environment [Substrate's Installation +page](https://docs.substrate.io/main-docs/install/) is a good resource. + +## High-Level Architecture + +This repo has support for bridging foreign chains together using a combination of Substrate pallets and external +processes called relayers. A bridge chain is one that is able to follow the consensus of a foreign chain independently. +For example, consider the case below where we want to bridge two Substrate based chains. + +``` ++---------------+ +---------------+ +| | | | +| Rococo | | Westend | +| | | | ++-------+-------+ +-------+-------+ + ^ ^ + | +---------------+ | + | | | | + +-----> | Bridge Relay | <-------+ + | | + +---------------+ +``` + +The Rococo chain must be able to accept Westend headers and verify their integrity. It does this by using a runtime +module designed to track GRANDPA finality. Since two blockchains can't interact directly they need an external service, +called a relayer, to communicate. The relayer will subscribe to new Rococo headers via RPC and submit them to the Westend +chain for verification. + +Take a look at [Bridge High Level Documentation](./docs/high-level-overview.md) for more in-depth description of the +bridge interaction. + +## Project Layout + +Here's an overview of how the project is laid out. The main bits are the `bin`, which is the actual "blockchain", the +`modules` which are used to build the blockchain's logic (a.k.a the runtime) and the `relays` which are used to pass +messages between chains. + +``` +├── modules // Substrate Runtime Modules (a.k.a Pallets) +│ ├── beefy // On-Chain BEEFY Light Client (in progress) +│ ├── grandpa // On-Chain GRANDPA Light Client +│ ├── messages // Cross Chain Message Passing +│ ├── parachains // On-Chain Parachains Light Client +│ ├── relayers // Relayer Rewards Registry +│ ├── xcm-bridge-hub // Multiple Dynamic Bridges Support +│ ├── xcm-bridge-hub-router // XCM Router that may be used to Connect to XCM Bridge Hub +├── primitives // Code shared between modules, runtimes, and relays +│ └── ... +├── relays // Application for sending finality proofs and messages between chains +│ └── ... +└── scripts // Useful development and maintenance scripts +``` + +## Running the Bridge + +Apart from live Rococo <> Westend bridge, you may spin up local networks and test see how it works locally. More +details may be found in +[this document](https://github.com/paritytech/polkadot-sdk/tree/master//cumulus/parachains/runtimes/bridge-hubs/README.md). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000000..9f215c887654 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,18 @@ +# Security Policy + +Thanks for helping make the Parity ecosystem more secure. Security is one of our first priorities. + +## Reporting a vulnerability + +If you find something that can be treated as a security vulnerability, please do not use the issue tracker or discuss it +in the public forum as it can cause more damage, rather than giving real help to the ecosystem. + +Security vulnerabilities should be reported by the [contact form](https://security-submission.parity.io/). + +If you think that your report might be eligible for the Bug Bounty Program, please mark this during the submission. +Please check up-to-date [Parity Bug Bounty Program rules](https://www.parity.io/bug-bounty) to find out the information +about our Bug Bounty Program. + +**Warning**: This is an unified SECURITY.md file for Paritytech GitHub Organization. The presence of this file does not +mean that this repository is covered by the Bug Bounty program. Please always check the Bug Bounty Program scope for +information. diff --git a/cumulus/scripts/ci/changelog/digests/.gitkeep b/bin/.keep similarity index 100% rename from cumulus/scripts/ci/changelog/digests/.gitkeep rename to bin/.keep diff --git a/bin/runtime-common/Cargo.toml b/bin/runtime-common/Cargo.toml new file mode 100644 index 000000000000..1b8191943414 --- /dev/null +++ b/bin/runtime-common/Cargo.toml @@ -0,0 +1,97 @@ +[package] +name = "bridge-runtime-common" +version = "0.1.0" +description = "Common types and functions that may be used by substrate-based runtimes of all bridged chains" +authors.workspace = true +edition.workspace = true +repository.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +hash-db = { version = "0.16.0", default-features = false } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +static_assertions = { version = "1.1", optional = true } + +# Bridge dependencies + +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-parachains = { path = "../../primitives/parachains", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-relayers = { path = "../../primitives/relayers", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-xcm-bridge-hub = { path = "../../primitives/xcm-bridge-hub", default-features = false } +bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } +pallet-bridge-grandpa = { path = "../../modules/grandpa", default-features = false } +pallet-bridge-messages = { path = "../../modules/messages", default-features = false } +pallet-bridge-parachains = { path = "../../modules/parachains", default-features = false } +pallet-bridge-relayers = { path = "../../modules/relayers", default-features = false } + +# Substrate dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +pallet-transaction-payment = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +pallet-utility = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +# Polkadot dependencies +xcm = { package = "staging-xcm", git = "https://github.com/paritytech/polkadot-sdk", default-features = false , branch = "master" } +xcm-builder = { package = "staging-xcm-builder", git = "https://github.com/paritytech/polkadot-sdk", default-features = false , branch = "master" } + +[dev-dependencies] +bp-test-utils = { path = "../../primitives/test-utils" } +pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-messages/std", + "bp-parachains/std", + "bp-polkadot-core/std", + "bp-relayers/std", + "bp-runtime/std", + "bp-xcm-bridge-hub/std", + "bp-xcm-bridge-hub-router/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "hash-db/std", + "log/std", + "pallet-bridge-grandpa/std", + "pallet-bridge-messages/std", + "pallet-bridge-parachains/std", + "pallet-bridge-relayers/std", + "pallet-transaction-payment/std", + "pallet-utility/std", + "scale-info/std", + "sp-api/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", + "xcm-builder/std", + "xcm/std", +] +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-bridge-grandpa/runtime-benchmarks", + "pallet-bridge-messages/runtime-benchmarks", + "pallet-bridge-parachains/runtime-benchmarks", + "pallet-bridge-relayers/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] +integrity-test = ["static_assertions"] diff --git a/cumulus/bridges/bin/runtime-common/src/integrity.rs b/bin/runtime-common/src/integrity.rs similarity index 96% rename from cumulus/bridges/bin/runtime-common/src/integrity.rs rename to bin/runtime-common/src/integrity.rs index a0af3b981f30..d3827a14dd6c 100644 --- a/cumulus/bridges/bin/runtime-common/src/integrity.rs +++ b/bin/runtime-common/src/integrity.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -27,7 +27,6 @@ use codec::Encode; use frame_support::{storage::generator::StorageValue, traits::Get, weights::Weight}; use frame_system::limits; use pallet_bridge_messages::WeightInfoExt as _; -use sp_runtime::traits::SignedExtension; /// Macro that ensures that the runtime configuration and chain primitives crate are sharing /// the same types (nonce, block number, hash, hasher, account id and header). @@ -347,15 +346,3 @@ pub fn check_message_lane_weights< ); } } - -/// Check that the `AdditionalSigned` type of a wrapped runtime is the same as the one of the -/// corresponding actual runtime. -/// -/// This method doesn't perform any `assert`. If the condition is not true it will generate a -/// compile-time error. -pub fn check_additional_signed() -where - SignedExt: SignedExtension, - IndirectSignedExt: SignedExtension, -{ -} diff --git a/bin/runtime-common/src/lib.rs b/bin/runtime-common/src/lib.rs new file mode 100644 index 000000000000..d3b3b21061d0 --- /dev/null +++ b/bin/runtime-common/src/lib.rs @@ -0,0 +1,222 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Common types/functions that may be used by runtimes of all bridged chains. + +#![cfg_attr(not(feature = "std"), no_std)] + +use crate::messages_call_ext::MessagesCallSubType; +use pallet_bridge_grandpa::CallSubType as GrandpaCallSubType; +use pallet_bridge_parachains::CallSubType as ParachainsCallSubtype; +use sp_runtime::transaction_validity::TransactionValidity; + +pub mod messages; +pub mod messages_api; +pub mod messages_benchmarking; +pub mod messages_call_ext; +pub mod messages_generation; +pub mod messages_xcm_extension; +pub mod parachains_benchmarking; +pub mod priority_calculator; +pub mod refund_relayer_extension; + +mod mock; + +#[cfg(feature = "integrity-test")] +pub mod integrity; + +const LOG_TARGET_BRIDGE_DISPATCH: &str = "runtime::bridge-dispatch"; + +/// A duplication of the `FilterCall` trait. +/// +/// We need this trait in order to be able to implement it for the messages pallet, +/// since the implementation is done outside of the pallet crate. +pub trait BridgeRuntimeFilterCall { + /// Checks if a runtime call is valid. + fn validate(call: &Call) -> TransactionValidity; +} + +impl BridgeRuntimeFilterCall for pallet_bridge_grandpa::Pallet +where + T: pallet_bridge_grandpa::Config, + T::RuntimeCall: GrandpaCallSubType, +{ + fn validate(call: &T::RuntimeCall) -> TransactionValidity { + GrandpaCallSubType::::check_obsolete_submit_finality_proof(call) + } +} + +impl BridgeRuntimeFilterCall + for pallet_bridge_parachains::Pallet +where + T: pallet_bridge_parachains::Config, + T::RuntimeCall: ParachainsCallSubtype, +{ + fn validate(call: &T::RuntimeCall) -> TransactionValidity { + ParachainsCallSubtype::::check_obsolete_submit_parachain_heads(call) + } +} + +impl, I: 'static> BridgeRuntimeFilterCall + for pallet_bridge_messages::Pallet +where + T::RuntimeCall: MessagesCallSubType, +{ + /// Validate messages in order to avoid "mining" messages delivery and delivery confirmation + /// transactions, that are delivering outdated messages/confirmations. Without this validation, + /// even honest relayers may lose their funds if there are multiple relays running and + /// submitting the same messages/confirmations. + fn validate(call: &T::RuntimeCall) -> TransactionValidity { + call.check_obsolete_call() + } +} + +/// Declares a runtime-specific `BridgeRejectObsoleteHeadersAndMessages` signed extension. +/// +/// ## Example +/// +/// ```nocompile +/// generate_bridge_reject_obsolete_headers_and_messages!{ +/// Call, AccountId +/// BridgeRococoGrandpa, BridgeRococoMessages, +/// BridgeRococoParachains +/// } +/// ``` +/// +/// The goal of this extension is to avoid "mining" transactions that provide outdated bridged +/// headers and messages. Without that extension, even honest relayers may lose their funds if +/// there are multiple relays running and submitting the same information. +#[macro_export] +macro_rules! generate_bridge_reject_obsolete_headers_and_messages { + ($call:ty, $account_id:ty, $($filter_call:ty),*) => { + #[derive(Clone, codec::Decode, Default, codec::Encode, Eq, PartialEq, sp_runtime::RuntimeDebug, scale_info::TypeInfo)] + pub struct BridgeRejectObsoleteHeadersAndMessages; + impl sp_runtime::traits::SignedExtension for BridgeRejectObsoleteHeadersAndMessages { + const IDENTIFIER: &'static str = "BridgeRejectObsoleteHeadersAndMessages"; + type AccountId = $account_id; + type Call = $call; + type AdditionalSigned = (); + type Pre = (); + + fn additional_signed(&self) -> sp_std::result::Result< + (), + sp_runtime::transaction_validity::TransactionValidityError, + > { + Ok(()) + } + + fn validate( + &self, + _who: &Self::AccountId, + call: &Self::Call, + _info: &sp_runtime::traits::DispatchInfoOf, + _len: usize, + ) -> sp_runtime::transaction_validity::TransactionValidity { + let valid = sp_runtime::transaction_validity::ValidTransaction::default(); + $( + let valid = valid + .combine_with(<$filter_call as $crate::BridgeRuntimeFilterCall<$call>>::validate(call)?); + )* + Ok(valid) + } + + fn pre_dispatch( + self, + who: &Self::AccountId, + call: &Self::Call, + info: &sp_runtime::traits::DispatchInfoOf, + len: usize, + ) -> Result { + self.validate(who, call, info, len).map(drop) + } + } + }; +} + +#[cfg(test)] +mod tests { + use crate::BridgeRuntimeFilterCall; + use frame_support::{assert_err, assert_ok}; + use sp_runtime::{ + traits::SignedExtension, + transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + }; + + pub struct MockCall { + data: u32, + } + + impl sp_runtime::traits::Dispatchable for MockCall { + type RuntimeOrigin = (); + type Config = (); + type Info = (); + type PostInfo = (); + + fn dispatch( + self, + _origin: Self::RuntimeOrigin, + ) -> sp_runtime::DispatchResultWithInfo { + unimplemented!() + } + } + + struct FirstFilterCall; + impl BridgeRuntimeFilterCall for FirstFilterCall { + fn validate(call: &MockCall) -> TransactionValidity { + if call.data <= 1 { + return InvalidTransaction::Custom(1).into() + } + + Ok(ValidTransaction { priority: 1, ..Default::default() }) + } + } + + struct SecondFilterCall; + impl BridgeRuntimeFilterCall for SecondFilterCall { + fn validate(call: &MockCall) -> TransactionValidity { + if call.data <= 2 { + return InvalidTransaction::Custom(2).into() + } + + Ok(ValidTransaction { priority: 2, ..Default::default() }) + } + } + + #[test] + fn test() { + generate_bridge_reject_obsolete_headers_and_messages!( + MockCall, + (), + FirstFilterCall, + SecondFilterCall + ); + + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 1 }, &(), 0), + InvalidTransaction::Custom(1) + ); + + assert_err!( + BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 2 }, &(), 0), + InvalidTransaction::Custom(2) + ); + + assert_ok!( + BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 3 }, &(), 0), + ValidTransaction { priority: 3, ..Default::default() } + ) + } +} diff --git a/bin/runtime-common/src/messages.rs b/bin/runtime-common/src/messages.rs new file mode 100644 index 000000000000..ac66adae6614 --- /dev/null +++ b/bin/runtime-common/src/messages.rs @@ -0,0 +1,738 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types that allow runtime to act as a source/target endpoint of message lanes. +//! +//! Messages are assumed to be encoded `Call`s of the target chain. Call-dispatch +//! pallet is used to dispatch incoming messages. Message identified by a tuple +//! of to elements - message lane id and message nonce. + +pub use bp_runtime::{RangeInclusiveExt, UnderlyingChainOf, UnderlyingChainProvider}; + +use bp_header_chain::HeaderChain; +use bp_messages::{ + source_chain::{LaneMessageVerifier, TargetHeaderChain}, + target_chain::{ProvedLaneMessages, ProvedMessages, SourceHeaderChain}, + InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, + VerificationError, +}; +use bp_runtime::{Chain, RawStorageProof, Size, StorageProofChecker}; +use codec::{Decode, Encode}; +use frame_support::{traits::Get, weights::Weight}; +use hash_db::Hasher; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; +use sp_std::{convert::TryFrom, marker::PhantomData, vec::Vec}; + +/// Bidirectional message bridge. +pub trait MessageBridge { + /// Name of the paired messages pallet instance at the Bridged chain. + /// + /// Should be the name that is used in the `construct_runtime!()` macro. + const BRIDGED_MESSAGES_PALLET_NAME: &'static str; + + /// This chain in context of message bridge. + type ThisChain: ThisChainWithMessages; + /// Bridged chain in context of message bridge. + type BridgedChain: BridgedChainWithMessages; + /// Bridged header chain. + type BridgedHeaderChain: HeaderChain>; +} + +/// This chain that has `pallet-bridge-messages` module. +pub trait ThisChainWithMessages: UnderlyingChainProvider { + /// Call origin on the chain. + type RuntimeOrigin; +} + +/// Bridged chain that has `pallet-bridge-messages` module. +pub trait BridgedChainWithMessages: UnderlyingChainProvider {} + +/// This chain in context of message bridge. +pub type ThisChain = ::ThisChain; +/// Bridged chain in context of message bridge. +pub type BridgedChain = ::BridgedChain; +/// Hash used on the chain. +pub type HashOf = bp_runtime::HashOf<::Chain>; +/// Hasher used on the chain. +pub type HasherOf = bp_runtime::HasherOf>; +/// Account id used on the chain. +pub type AccountIdOf = bp_runtime::AccountIdOf>; +/// Type of balances that is used on the chain. +pub type BalanceOf = bp_runtime::BalanceOf>; + +/// Sub-module that is declaring types required for processing This -> Bridged chain messages. +pub mod source { + use super::*; + + /// Message payload for This -> Bridged chain messages. + pub type FromThisChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; + + /// Maximal size of outbound message payload. + pub struct FromThisChainMaximalOutboundPayloadSize(PhantomData); + + impl Get for FromThisChainMaximalOutboundPayloadSize { + fn get() -> u32 { + maximal_message_size::() + } + } + + /// Messages delivery proof from bridged chain: + /// + /// - hash of finalized header; + /// - storage proof of inbound lane state; + /// - lane id. + #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] + pub struct FromBridgedChainMessagesDeliveryProof { + /// Hash of the bridge header the proof is for. + pub bridged_header_hash: BridgedHeaderHash, + /// Storage trie proof generated for [`Self::bridged_header_hash`]. + pub storage_proof: RawStorageProof, + /// Lane id of which messages were delivered and the proof is for. + pub lane: LaneId, + } + + impl Size for FromBridgedChainMessagesDeliveryProof { + fn size(&self) -> u32 { + u32::try_from( + self.storage_proof + .iter() + .fold(0usize, |sum, node| sum.saturating_add(node.len())), + ) + .unwrap_or(u32::MAX) + } + } + + /// 'Parsed' message delivery proof - inbound lane id and its state. + pub type ParsedMessagesDeliveryProofFromBridgedChain = + (LaneId, InboundLaneData>>); + + /// Message verifier that is doing all basic checks. + /// + /// This verifier assumes following: + /// + /// - all message lanes are equivalent, so all checks are the same; + /// + /// Following checks are made: + /// + /// - message is rejected if its lane is currently blocked; + /// - message is rejected if there are too many pending (undelivered) messages at the outbound + /// lane; + /// - check that the sender has rights to dispatch the call on target chain using provided + /// dispatch origin; + /// - check that the sender has paid enough funds for both message delivery and dispatch. + #[derive(RuntimeDebug)] + pub struct FromThisChainMessageVerifier(PhantomData); + + impl LaneMessageVerifier for FromThisChainMessageVerifier + where + B: MessageBridge, + { + fn verify_message( + _lane: &LaneId, + _lane_outbound_data: &OutboundLaneData, + _payload: &FromThisChainMessagePayload, + ) -> Result<(), VerificationError> { + // IMPORTANT: any error that is returned here is fatal for the bridge, because + // this code is executed at the bridge hub and message sender actually lives + // at some sibling parachain. So we are failing **after** the message has been + // sent and we can't report it back to sender (unless error report mechanism is + // embedded into message and its dispatcher). + + Ok(()) + } + } + + /// Return maximal message size of This -> Bridged chain message. + pub fn maximal_message_size() -> u32 { + super::target::maximal_incoming_message_size( + UnderlyingChainOf::>::max_extrinsic_size(), + ) + } + + /// `TargetHeaderChain` implementation that is using default types and perform default checks. + pub struct TargetHeaderChainAdapter(PhantomData); + + impl TargetHeaderChain>> + for TargetHeaderChainAdapter + { + type MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>>; + + fn verify_message(payload: &FromThisChainMessagePayload) -> Result<(), VerificationError> { + verify_chain_message::(payload) + } + + fn verify_messages_delivery_proof( + proof: Self::MessagesDeliveryProof, + ) -> Result<(LaneId, InboundLaneData>>), VerificationError> { + verify_messages_delivery_proof::(proof) + } + } + + /// Do basic Bridged-chain specific verification of This -> Bridged chain message. + /// + /// Ok result from this function means that the delivery transaction with this message + /// may be 'mined' by the target chain. But the lane may have its own checks (e.g. fee + /// check) that would reject message (see `FromThisChainMessageVerifier`). + pub fn verify_chain_message( + payload: &FromThisChainMessagePayload, + ) -> Result<(), VerificationError> { + // IMPORTANT: any error that is returned here is fatal for the bridge, because + // this code is executed at the bridge hub and message sender actually lives + // at some sibling parachain. So we are failing **after** the message has been + // sent and we can't report it back to sender (unless error report mechanism is + // embedded into message and its dispatcher). + + // apart from maximal message size check (see below), we should also check the message + // dispatch weight here. But we assume that the bridged chain will just push the message + // to some queue (XCMP, UMP, DMP), so the weight is constant and fits the block. + + // The maximal size of extrinsic at Substrate-based chain depends on the + // `frame_system::Config::MaximumBlockLength` and + // `frame_system::Config::AvailableBlockRatio` constants. This check is here to be sure that + // the lane won't stuck because message is too large to fit into delivery transaction. + // + // **IMPORTANT NOTE**: the delivery transaction contains storage proof of the message, not + // the message itself. The proof is always larger than the message. But unless chain state + // is enormously large, it should be several dozens/hundreds of bytes. The delivery + // transaction also contains signatures and signed extensions. Because of this, we reserve + // 1/3 of the the maximal extrinsic size for this data. + if payload.len() > maximal_message_size::() as usize { + return Err(VerificationError::MessageTooLarge) + } + + Ok(()) + } + + /// Verify proof of This -> Bridged chain messages delivery. + /// + /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged + /// parachains, please use the `verify_messages_delivery_proof_from_parachain`. + pub fn verify_messages_delivery_proof( + proof: FromBridgedChainMessagesDeliveryProof>>, + ) -> Result, VerificationError> { + let FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } = + proof; + let mut storage = + B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) + .map_err(VerificationError::HeaderChain)?; + // Messages delivery proof is just proof of single storage key read => any error + // is fatal. + let storage_inbound_lane_data_key = bp_messages::storage_keys::inbound_lane_data_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + &lane, + ); + let inbound_lane_data = storage + .read_and_decode_mandatory_value(storage_inbound_lane_data_key.0.as_ref()) + .map_err(VerificationError::InboundLaneStorage)?; + + // check that the storage proof doesn't have any untouched trie nodes + storage.ensure_no_unused_nodes().map_err(VerificationError::StorageProof)?; + + Ok((lane, inbound_lane_data)) + } +} + +/// Sub-module that is declaring types required for processing Bridged -> This chain messages. +pub mod target { + use super::*; + + /// Decoded Bridged -> This message payload. + pub type FromBridgedChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; + + /// Messages proof from bridged chain: + /// + /// - hash of finalized header; + /// - storage proof of messages and (optionally) outbound lane state; + /// - lane id; + /// - nonces (inclusive range) of messages which are included in this proof. + #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] + pub struct FromBridgedChainMessagesProof { + /// Hash of the finalized bridged header the proof is for. + pub bridged_header_hash: BridgedHeaderHash, + /// A storage trie proof of messages being delivered. + pub storage_proof: RawStorageProof, + /// Messages in this proof are sent over this lane. + pub lane: LaneId, + /// Nonce of the first message being delivered. + pub nonces_start: MessageNonce, + /// Nonce of the last message being delivered. + pub nonces_end: MessageNonce, + } + + impl Size for FromBridgedChainMessagesProof { + fn size(&self) -> u32 { + u32::try_from( + self.storage_proof + .iter() + .fold(0usize, |sum, node| sum.saturating_add(node.len())), + ) + .unwrap_or(u32::MAX) + } + } + + /// Return maximal dispatch weight of the message we're able to receive. + pub fn maximal_incoming_message_dispatch_weight(maximal_extrinsic_weight: Weight) -> Weight { + maximal_extrinsic_weight / 2 + } + + /// Return maximal message size given maximal extrinsic size. + pub fn maximal_incoming_message_size(maximal_extrinsic_size: u32) -> u32 { + maximal_extrinsic_size / 3 * 2 + } + + /// `SourceHeaderChain` implementation that is using default types and perform default checks. + pub struct SourceHeaderChainAdapter(PhantomData); + + impl SourceHeaderChain for SourceHeaderChainAdapter { + type MessagesProof = FromBridgedChainMessagesProof>>; + + fn verify_messages_proof( + proof: Self::MessagesProof, + messages_count: u32, + ) -> Result, VerificationError> { + verify_messages_proof::(proof, messages_count) + } + } + + /// Verify proof of Bridged -> This chain messages. + /// + /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged + /// parachains, please use the `verify_messages_proof_from_parachain`. + /// + /// The `messages_count` argument verification (sane limits) is supposed to be made + /// outside of this function. This function only verifies that the proof declares exactly + /// `messages_count` messages. + pub fn verify_messages_proof( + proof: FromBridgedChainMessagesProof>>, + messages_count: u32, + ) -> Result, VerificationError> { + let FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane, + nonces_start, + nonces_end, + } = proof; + let storage = + B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) + .map_err(VerificationError::HeaderChain)?; + let mut parser = StorageProofCheckerAdapter::<_, B> { storage, _dummy: Default::default() }; + let nonces_range = nonces_start..=nonces_end; + + // receiving proofs where end < begin is ok (if proof includes outbound lane state) + let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0); + if messages_in_the_proof != MessageNonce::from(messages_count) { + return Err(VerificationError::MessagesCountMismatch) + } + + // Read messages first. All messages that are claimed to be in the proof must + // be in the proof. So any error in `read_value`, or even missing value is fatal. + // + // Mind that we allow proofs with no messages if outbound lane state is proved. + let mut messages = Vec::with_capacity(messages_in_the_proof as _); + for nonce in nonces_range { + let message_key = MessageKey { lane_id: lane, nonce }; + let message_payload = parser.read_and_decode_message_payload(&message_key)?; + messages.push(Message { key: message_key, payload: message_payload }); + } + + // Now let's check if proof contains outbound lane state proof. It is optional, so + // we simply ignore `read_value` errors and missing value. + let proved_lane_messages = ProvedLaneMessages { + lane_state: parser.read_and_decode_outbound_lane_data(&lane)?, + messages, + }; + + // Now we may actually check if the proof is empty or not. + if proved_lane_messages.lane_state.is_none() && proved_lane_messages.messages.is_empty() { + return Err(VerificationError::EmptyMessageProof) + } + + // check that the storage proof doesn't have any untouched trie nodes + parser + .storage + .ensure_no_unused_nodes() + .map_err(VerificationError::StorageProof)?; + + // We only support single lane messages in this generated_schema + let mut proved_messages = ProvedMessages::new(); + proved_messages.insert(lane, proved_lane_messages); + + Ok(proved_messages) + } + + struct StorageProofCheckerAdapter { + storage: StorageProofChecker, + _dummy: sp_std::marker::PhantomData, + } + + impl StorageProofCheckerAdapter { + fn read_and_decode_outbound_lane_data( + &mut self, + lane_id: &LaneId, + ) -> Result, VerificationError> { + let storage_outbound_lane_data_key = bp_messages::storage_keys::outbound_lane_data_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + lane_id, + ); + + self.storage + .read_and_decode_opt_value(storage_outbound_lane_data_key.0.as_ref()) + .map_err(VerificationError::OutboundLaneStorage) + } + + fn read_and_decode_message_payload( + &mut self, + message_key: &MessageKey, + ) -> Result { + let storage_message_key = bp_messages::storage_keys::message_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + &message_key.lane_id, + message_key.nonce, + ); + self.storage + .read_and_decode_mandatory_value(storage_message_key.0.as_ref()) + .map_err(VerificationError::MessageStorage) + } + } +} + +/// The `BridgeMessagesCall` used by a chain. +pub type BridgeMessagesCallOf = bp_messages::BridgeMessagesCall< + bp_runtime::AccountIdOf, + target::FromBridgedChainMessagesProof>, + source::FromBridgedChainMessagesDeliveryProof>, +>; + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + messages_generation::{ + encode_all_messages, encode_lane_data, prepare_messages_storage_proof, + }, + mock::*, + }; + use bp_header_chain::{HeaderChainError, StoredHeaderDataBuilder}; + use bp_runtime::{HeaderId, StorageProofError}; + use codec::Encode; + use sp_core::H256; + use sp_runtime::traits::Header as _; + + #[test] + fn verify_chain_message_rejects_message_with_too_large_declared_weight() { + assert!(source::verify_chain_message::(&vec![ + 42; + BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT - + 1 + ]) + .is_err()); + } + + #[test] + fn verify_chain_message_rejects_message_too_large_message() { + assert!(source::verify_chain_message::(&vec![ + 0; + source::maximal_message_size::() + as usize + 1 + ],) + .is_err()); + } + + #[test] + fn verify_chain_message_accepts_maximal_message() { + assert_eq!( + source::verify_chain_message::(&vec![ + 0; + source::maximal_message_size::() + as _ + ],), + Ok(()), + ); + } + + fn using_messages_proof( + nonces_end: MessageNonce, + outbound_lane_data: Option, + encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, + encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, + test: impl Fn(target::FromBridgedChainMessagesProof) -> R, + ) -> R { + let (state_root, storage_proof) = prepare_messages_storage_proof::( + TEST_LANE_ID, + 1..=nonces_end, + outbound_lane_data, + bp_runtime::StorageProofSize::Minimal(0), + vec![42], + encode_message, + encode_outbound_lane_data, + ); + + sp_io::TestExternalities::new(Default::default()).execute_with(move || { + let bridged_header = BridgedChainHeader::new( + 0, + Default::default(), + state_root, + Default::default(), + Default::default(), + ); + let bridged_header_hash = bridged_header.hash(); + + pallet_bridge_grandpa::BestFinalized::::put(HeaderId( + 0, + bridged_header_hash, + )); + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + bridged_header.build(), + ); + test(target::FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane: TEST_LANE_ID, + nonces_start: 1, + nonces_end, + }) + }) + } + + #[test] + fn messages_proof_is_rejected_if_declared_less_than_actual_number_of_messages() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + target::verify_messages_proof::(proof, 5) + }), + Err(VerificationError::MessagesCountMismatch), + ); + } + + #[test] + fn messages_proof_is_rejected_if_declared_more_than_actual_number_of_messages() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + target::verify_messages_proof::(proof, 15) + }), + Err(VerificationError::MessagesCountMismatch), + ); + } + + #[test] + fn message_proof_is_rejected_if_header_is_missing_from_the_chain() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + let bridged_header_hash = + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; + pallet_bridge_grandpa::ImportedHeaders::::remove(bridged_header_hash); + target::verify_messages_proof::(proof, 10) + }), + Err(VerificationError::HeaderChain(HeaderChainError::UnknownHeader)), + ); + } + + #[test] + fn message_proof_is_rejected_if_header_state_root_mismatches() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { + let bridged_header_hash = + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; + pallet_bridge_grandpa::ImportedHeaders::::insert( + bridged_header_hash, + BridgedChainHeader::new( + 0, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ) + .build(), + ); + target::verify_messages_proof::(proof, 10) + }), + Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( + StorageProofError::StorageRootMismatch + ))), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_has_duplicate_trie_nodes() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { + let node = proof.storage_proof.pop().unwrap(); + proof.storage_proof.push(node.clone()); + proof.storage_proof.push(node); + target::verify_messages_proof::(proof, 10) + },), + Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( + StorageProofError::DuplicateNodesInProof + ))), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_has_unused_trie_nodes() { + assert_eq!( + using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { + proof.storage_proof.push(vec![42]); + target::verify_messages_proof::(proof, 10) + },), + Err(VerificationError::StorageProof(StorageProofError::UnusedNodesInTheProof)), + ); + } + + #[test] + fn message_proof_is_rejected_if_required_message_is_missing() { + matches!( + using_messages_proof( + 10, + None, + |n, m| if n != 5 { Some(m.encode()) } else { None }, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 10) + ), + Err(VerificationError::MessageStorage(StorageProofError::StorageValueEmpty)), + ); + } + + #[test] + fn message_proof_is_rejected_if_message_decode_fails() { + matches!( + using_messages_proof( + 10, + None, + |n, m| { + let mut m = m.encode(); + if n == 5 { + m = vec![42] + } + Some(m) + }, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 10), + ), + Err(VerificationError::MessageStorage(StorageProofError::StorageValueDecodeFailed(_))), + ); + } + + #[test] + fn message_proof_is_rejected_if_outbound_lane_state_decode_fails() { + matches!( + using_messages_proof( + 10, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + |d| { + let mut d = d.encode(); + d.truncate(1); + d + }, + |proof| target::verify_messages_proof::(proof, 10), + ), + Err(VerificationError::OutboundLaneStorage( + StorageProofError::StorageValueDecodeFailed(_) + )), + ); + } + + #[test] + fn message_proof_is_rejected_if_it_is_empty() { + assert_eq!( + using_messages_proof(0, None, encode_all_messages, encode_lane_data, |proof| { + target::verify_messages_proof::(proof, 0) + },), + Err(VerificationError::EmptyMessageProof), + ); + } + + #[test] + fn non_empty_message_proof_without_messages_is_accepted() { + assert_eq!( + using_messages_proof( + 0, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 0), + ), + Ok(vec![( + TEST_LANE_ID, + ProvedLaneMessages { + lane_state: Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + messages: Vec::new(), + }, + )] + .into_iter() + .collect()), + ); + } + + #[test] + fn non_empty_message_proof_is_accepted() { + assert_eq!( + using_messages_proof( + 1, + Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + encode_all_messages, + encode_lane_data, + |proof| target::verify_messages_proof::(proof, 1), + ), + Ok(vec![( + TEST_LANE_ID, + ProvedLaneMessages { + lane_state: Some(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 1, + latest_generated_nonce: 1, + }), + messages: vec![Message { + key: MessageKey { lane_id: TEST_LANE_ID, nonce: 1 }, + payload: vec![42], + }], + }, + )] + .into_iter() + .collect()), + ); + } + + #[test] + fn verify_messages_proof_does_not_panic_if_messages_count_mismatches() { + assert_eq!( + using_messages_proof(1, None, encode_all_messages, encode_lane_data, |mut proof| { + proof.nonces_end = u64::MAX; + target::verify_messages_proof::(proof, u32::MAX) + },), + Err(VerificationError::MessagesCountMismatch), + ); + } +} diff --git a/cumulus/bridges/bin/runtime-common/src/messages_api.rs b/bin/runtime-common/src/messages_api.rs similarity index 97% rename from cumulus/bridges/bin/runtime-common/src/messages_api.rs rename to bin/runtime-common/src/messages_api.rs index 199e062fe982..ccf1c754041e 100644 --- a/cumulus/bridges/bin/runtime-common/src/messages_api.rs +++ b/bin/runtime-common/src/messages_api.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify diff --git a/bin/runtime-common/src/messages_benchmarking.rs b/bin/runtime-common/src/messages_benchmarking.rs new file mode 100644 index 000000000000..e7e7891461b2 --- /dev/null +++ b/bin/runtime-common/src/messages_benchmarking.rs @@ -0,0 +1,314 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Everything required to run benchmarks of messages module, based on +//! `bridge_runtime_common::messages` implementation. + +#![cfg(feature = "runtime-benchmarks")] + +use crate::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + AccountIdOf, BridgedChain, HashOf, MessageBridge, ThisChain, + }, + messages_generation::{ + encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, + prepare_messages_storage_proof, + }, +}; + +use bp_messages::MessagePayload; +use bp_polkadot_core::parachains::ParaHash; +use bp_runtime::{Chain, Parachain, StorageProofSize, UnderlyingChainOf}; +use codec::Encode; +use frame_support::weights::Weight; +use pallet_bridge_messages::benchmarking::{MessageDeliveryProofParams, MessageProofParams}; +use sp_runtime::traits::{Header, Zero}; +use sp_std::prelude::*; +use xcm::v3::prelude::*; + +/// Prepare inbound bridge message according to given message proof parameters. +fn prepare_inbound_message( + params: &MessageProofParams, + successful_dispatch_message_generator: impl Fn(usize) -> MessagePayload, +) -> MessagePayload { + // we only care about **this** message size when message proof needs to be `Minimal` + let expected_size = match params.size { + StorageProofSize::Minimal(size) => size as usize, + _ => 0, + }; + + // if we don't need a correct message, then we may just return some random blob + if !params.is_successful_dispatch_expected { + return vec![0u8; expected_size] + } + + // else let's prepare successful message. + let msg = successful_dispatch_message_generator(expected_size); + assert!( + msg.len() >= expected_size, + "msg.len(): {} does not match expected_size: {}", + expected_size, + msg.len() + ); + msg +} + +/// Prepare proof of messages for the `receive_messages_proof` call. +/// +/// In addition to returning valid messages proof, environment is prepared to verify this message +/// proof. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses GRANDPA finality. For parachains, please use the `prepare_message_proof_from_parachain` +/// function. +pub fn prepare_message_proof_from_grandpa_chain( + params: MessageProofParams, + message_generator: impl Fn(usize) -> MessagePayload, +) -> (FromBridgedChainMessagesProof>>, Weight) +where + R: pallet_bridge_grandpa::Config>>, + FI: 'static, + B: MessageBridge, +{ + // prepare storage proof + let (state_root, storage_proof) = prepare_messages_storage_proof::( + params.lane, + params.message_nonces.clone(), + params.outbound_lane_data.clone(), + params.size, + prepare_inbound_message(¶ms, message_generator), + encode_all_messages, + encode_lane_data, + ); + + // update runtime storage + let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); + + ( + FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane: params.lane, + nonces_start: *params.message_nonces.start(), + nonces_end: *params.message_nonces.end(), + }, + Weight::MAX / 1000, + ) +} + +/// Prepare proof of messages for the `receive_messages_proof` call. +/// +/// In addition to returning valid messages proof, environment is prepared to verify this message +/// proof. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses parachain finality. For GRANDPA chains, please use the +/// `prepare_message_proof_from_grandpa_chain` function. +pub fn prepare_message_proof_from_parachain( + params: MessageProofParams, + message_generator: impl Fn(usize) -> MessagePayload, +) -> (FromBridgedChainMessagesProof>>, Weight) +where + R: pallet_bridge_parachains::Config, + PI: 'static, + B: MessageBridge, + UnderlyingChainOf>: Chain + Parachain, +{ + // prepare storage proof + let (state_root, storage_proof) = prepare_messages_storage_proof::( + params.lane, + params.message_nonces.clone(), + params.outbound_lane_data.clone(), + params.size, + prepare_inbound_message(¶ms, message_generator), + encode_all_messages, + encode_lane_data, + ); + + // update runtime storage + let (_, bridged_header_hash) = + insert_header_to_parachains_pallet::>>(state_root); + + ( + FromBridgedChainMessagesProof { + bridged_header_hash, + storage_proof, + lane: params.lane, + nonces_start: *params.message_nonces.start(), + nonces_end: *params.message_nonces.end(), + }, + Weight::MAX / 1000, + ) +} + +/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses GRANDPA finality. For parachains, please use the +/// `prepare_message_delivery_proof_from_parachain` function. +pub fn prepare_message_delivery_proof_from_grandpa_chain( + params: MessageDeliveryProofParams>>, +) -> FromBridgedChainMessagesDeliveryProof>> +where + R: pallet_bridge_grandpa::Config>>, + FI: 'static, + B: MessageBridge, +{ + // prepare storage proof + let lane = params.lane; + let (state_root, storage_proof) = prepare_message_delivery_storage_proof::( + params.lane, + params.inbound_lane_data, + params.size, + ); + + // update runtime storage + let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); + + FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: bridged_header_hash.into(), + storage_proof, + lane, + } +} + +/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. +/// +/// This method is intended to be used when benchmarking pallet, linked to the chain that +/// uses parachain finality. For GRANDPA chains, please use the +/// `prepare_message_delivery_proof_from_grandpa_chain` function. +pub fn prepare_message_delivery_proof_from_parachain( + params: MessageDeliveryProofParams>>, +) -> FromBridgedChainMessagesDeliveryProof>> +where + R: pallet_bridge_parachains::Config, + PI: 'static, + B: MessageBridge, + UnderlyingChainOf>: Chain + Parachain, +{ + // prepare storage proof + let lane = params.lane; + let (state_root, storage_proof) = prepare_message_delivery_storage_proof::( + params.lane, + params.inbound_lane_data, + params.size, + ); + + // update runtime storage + let (_, bridged_header_hash) = + insert_header_to_parachains_pallet::>>(state_root); + + FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: bridged_header_hash.into(), + storage_proof, + lane, + } +} + +/// Insert header to the bridge GRANDPA pallet. +pub(crate) fn insert_header_to_grandpa_pallet( + state_root: bp_runtime::HashOf, +) -> (bp_runtime::BlockNumberOf, bp_runtime::HashOf) +where + R: pallet_bridge_grandpa::Config, + GI: 'static, + R::BridgedChain: bp_runtime::Chain, +{ + let bridged_block_number = Zero::zero(); + let bridged_header = bp_runtime::HeaderOf::::new( + bridged_block_number, + Default::default(), + state_root, + Default::default(), + Default::default(), + ); + let bridged_header_hash = bridged_header.hash(); + pallet_bridge_grandpa::initialize_for_benchmarks::(bridged_header); + (bridged_block_number, bridged_header_hash) +} + +/// Insert header to the bridge parachains pallet. +pub(crate) fn insert_header_to_parachains_pallet( + state_root: bp_runtime::HashOf, +) -> (bp_runtime::BlockNumberOf, bp_runtime::HashOf) +where + R: pallet_bridge_parachains::Config, + PI: 'static, + PC: Chain + Parachain, +{ + let bridged_block_number = Zero::zero(); + let bridged_header = bp_runtime::HeaderOf::::new( + bridged_block_number, + Default::default(), + state_root, + Default::default(), + Default::default(), + ); + let bridged_header_hash = bridged_header.hash(); + pallet_bridge_parachains::initialize_for_benchmarks::(bridged_header); + (bridged_block_number, bridged_header_hash) +} + +/// Returns callback which generates `BridgeMessage` from Polkadot XCM builder based on +/// `expected_message_size` for benchmark. +pub fn generate_xcm_builder_bridge_message_sample( + destination: InteriorMultiLocation, +) -> impl Fn(usize) -> MessagePayload { + move |expected_message_size| -> MessagePayload { + // For XCM bridge hubs, it is the message that + // will be pushed further to some XCM queue (XCMP/UMP) + let location = xcm::VersionedInteriorMultiLocation::V3(destination); + let location_encoded_size = location.encoded_size(); + + // we don't need to be super-precise with `expected_size` here + let xcm_size = expected_message_size.saturating_sub(location_encoded_size); + let xcm_data_size = xcm_size.saturating_sub( + // minus empty instruction size + xcm::v3::Instruction::<()>::ExpectPallet { + index: 0, + name: vec![], + module_name: vec![], + crate_major: 0, + min_crate_minor: 0, + } + .encoded_size(), + ); + + log::trace!( + target: "runtime::bridge-benchmarks", + "generate_xcm_builder_bridge_message_sample with expected_message_size: {}, location_encoded_size: {}, xcm_size: {}, xcm_data_size: {}", + expected_message_size, location_encoded_size, xcm_size, xcm_data_size, + ); + + let xcm = xcm::VersionedXcm::<()>::V3( + vec![xcm::v3::Instruction::<()>::ExpectPallet { + index: 0, + name: vec![42; xcm_data_size], + module_name: vec![], + crate_major: 0, + min_crate_minor: 0, + }] + .into(), + ); + + // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor + // or public fields, so just tuple + // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed + // to the storage) + (location, xcm).encode().encode() + } +} diff --git a/cumulus/bridges/bin/runtime-common/src/messages_call_ext.rs b/bin/runtime-common/src/messages_call_ext.rs similarity index 94% rename from cumulus/bridges/bin/runtime-common/src/messages_call_ext.rs rename to bin/runtime-common/src/messages_call_ext.rs index 0a1d7243620c..5303fcb7ba03 100644 --- a/cumulus/bridges/bin/runtime-common/src/messages_call_ext.rs +++ b/bin/runtime-common/src/messages_call_ext.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -18,13 +18,13 @@ use crate::messages::{ source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, }; use bp_messages::{target_chain::MessageDispatch, InboundLaneData, LaneId, MessageNonce}; +use bp_runtime::OwnedBridgeModule; use frame_support::{ dispatch::CallableCallFor, traits::{Get, IsSubType}, - RuntimeDebug, }; use pallet_bridge_messages::{Config, Pallet}; -use sp_runtime::transaction_validity::TransactionValidity; +use sp_runtime::{transaction_validity::TransactionValidity, RuntimeDebug}; use sp_std::ops::RangeInclusive; /// Generic info about a messages delivery/confirmation proof. @@ -188,8 +188,22 @@ pub trait MessagesCallSubType, I: 'static>: /// or a `ReceiveMessagesDeliveryProof` call, if the call is for the provided lane. fn call_info_for(&self, lane_id: LaneId) -> Option; - /// Check that a `ReceiveMessagesProof` or a `ReceiveMessagesDeliveryProof` call is trying - /// to deliver/confirm at least some messages that are better than the ones we know of. + /// Ensures that a `ReceiveMessagesProof` or a `ReceiveMessagesDeliveryProof` call: + /// + /// - does not deliver already delivered messages. We require all messages in the + /// `ReceiveMessagesProof` call to be undelivered; + /// + /// - does not submit empty `ReceiveMessagesProof` call with zero messages, unless the lane + /// needs to be unblocked by providing relayer rewards proof; + /// + /// - brings no new delivery confirmations in a `ReceiveMessagesDeliveryProof` call. We require + /// at least one new delivery confirmation in the unrewarded relayers set; + /// + /// - does not violate some basic (easy verifiable) messages pallet rules obsolete (like + /// submitting a call when a pallet is halted or delivering messages when a dispatcher is + /// inactive). + /// + /// If one of above rules is violated, the transaction is treated as invalid. fn check_obsolete_call(&self) -> TransactionValidity; } @@ -279,7 +293,17 @@ impl< } fn check_obsolete_call(&self) -> TransactionValidity { + let is_pallet_halted = Pallet::::ensure_not_halted().is_err(); match self.call_info() { + Some(proof_info) if is_pallet_halted => { + log::trace!( + target: pallet_bridge_messages::LOG_TARGET, + "Rejecting messages transaction on halted pallet: {:?}", + proof_info + ); + + return sp_runtime::transaction_validity::InvalidTransaction::Call.into() + }, Some(CallInfo::ReceiveMessagesProof(proof_info)) if proof_info.is_obsolete(T::MessageDispatch::is_active()) => { diff --git a/bin/runtime-common/src/messages_generation.rs b/bin/runtime-common/src/messages_generation.rs new file mode 100644 index 000000000000..c37aaa5d4d53 --- /dev/null +++ b/bin/runtime-common/src/messages_generation.rs @@ -0,0 +1,150 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Helpers for generating message storage proofs, that are used by tests and by benchmarks. + +use crate::messages::{AccountIdOf, BridgedChain, HashOf, HasherOf, MessageBridge, ThisChain}; + +use bp_messages::{ + storage_keys, InboundLaneData, LaneId, MessageKey, MessageNonce, MessagePayload, + OutboundLaneData, +}; +use bp_runtime::{record_all_trie_keys, RawStorageProof, StorageProofSize}; +use codec::Encode; +use sp_std::{ops::RangeInclusive, prelude::*}; +use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; + +/// Simple and correct message data encode function. +pub fn encode_all_messages(_: MessageNonce, m: &MessagePayload) -> Option> { + Some(m.encode()) +} + +/// Simple and correct outbound lane data encode function. +pub fn encode_lane_data(d: &OutboundLaneData) -> Vec { + d.encode() +} + +/// Prepare storage proof of given messages. +/// +/// Returns state trie root and nodes with prepared messages. +pub fn prepare_messages_storage_proof( + lane: LaneId, + message_nonces: RangeInclusive, + outbound_lane_data: Option, + size: StorageProofSize, + message_payload: MessagePayload, + encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, + encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, +) -> (HashOf>, RawStorageProof) +where + B: MessageBridge, + HashOf>: Copy + Default, +{ + // prepare Bridged chain storage with messages and (optionally) outbound lane state + let message_count = message_nonces.end().saturating_sub(*message_nonces.start()) + 1; + let mut storage_keys = Vec::with_capacity(message_count as usize + 1); + let mut root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = + TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); + + // insert messages + for (i, nonce) in message_nonces.into_iter().enumerate() { + let message_key = MessageKey { lane_id: lane, nonce }; + let message_payload = match encode_message(nonce, &message_payload) { + Some(message_payload) => + if i == 0 { + grow_trie_leaf_value(message_payload, size) + } else { + message_payload + }, + None => continue, + }; + let storage_key = storage_keys::message_key( + B::BRIDGED_MESSAGES_PALLET_NAME, + &message_key.lane_id, + message_key.nonce, + ) + .0; + trie.insert(&storage_key, &message_payload) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + storage_keys.push(storage_key); + } + + // insert outbound lane state + if let Some(outbound_lane_data) = outbound_lane_data.as_ref().map(encode_outbound_lane_data) + { + let storage_key = + storage_keys::outbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, &lane).0; + trie.insert(&storage_key, &outbound_lane_data) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + storage_keys.push(storage_key); + } + } + + // generate storage proof to be delivered to This chain + let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + (root, storage_proof) +} + +/// Prepare storage proof of given messages delivery. +/// +/// Returns state trie root and nodes with prepared messages. +pub fn prepare_message_delivery_storage_proof( + lane: LaneId, + inbound_lane_data: InboundLaneData>>, + size: StorageProofSize, +) -> (HashOf>, RawStorageProof) +where + B: MessageBridge, +{ + // prepare Bridged chain storage with inbound lane state + let storage_key = storage_keys::inbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, &lane).0; + let mut root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = + TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); + let inbound_lane_data = grow_trie_leaf_value(inbound_lane_data.encode(), size); + trie.insert(&storage_key, &inbound_lane_data) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in benchmarks"); + } + + // generate storage proof to be delivered to This chain + let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + + (root, storage_proof) +} + +/// Add extra data to the trie leaf value so that it'll be of given size. +pub fn grow_trie_leaf_value(mut value: Vec, size: StorageProofSize) -> Vec { + match size { + StorageProofSize::Minimal(_) => (), + StorageProofSize::HasLargeLeaf(size) if size as usize > value.len() => { + value.extend(sp_std::iter::repeat(42u8).take(size as usize - value.len())); + }, + StorageProofSize::HasLargeLeaf(_) => (), + } + value +} diff --git a/cumulus/bridges/bin/runtime-common/src/messages_xcm_extension.rs b/bin/runtime-common/src/messages_xcm_extension.rs similarity index 84% rename from cumulus/bridges/bin/runtime-common/src/messages_xcm_extension.rs rename to bin/runtime-common/src/messages_xcm_extension.rs index 44e554ecb24f..0159ede64813 100644 --- a/cumulus/bridges/bin/runtime-common/src/messages_xcm_extension.rs +++ b/bin/runtime-common/src/messages_xcm_extension.rs @@ -1,4 +1,4 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -22,26 +22,23 @@ //! `XcmRouter` <- `MessageDispatch` <- `InboundMessageQueue` use bp_messages::{ - source_chain::{MessagesBridge, OnMessagesDelivered}, + source_chain::OnMessagesDelivered, target_chain::{DispatchMessage, MessageDispatch}, LaneId, MessageNonce, }; use bp_runtime::messages::MessageDispatchResult; +pub use bp_xcm_bridge_hub::XcmAsPlainPayload; use bp_xcm_bridge_hub_router::XcmChannelStatusProvider; use codec::{Decode, Encode}; -use frame_support::{dispatch::Weight, traits::Get, CloneNoBound, EqNoBound, PartialEqNoBound}; +use frame_support::{traits::Get, weights::Weight, CloneNoBound, EqNoBound, PartialEqNoBound}; use pallet_bridge_messages::{ - Config as MessagesConfig, OutboundLanesCongestedSignals, Pallet as MessagesPallet, - WeightInfoExt as MessagesPalletWeights, + Config as MessagesConfig, OutboundLanesCongestedSignals, WeightInfoExt as MessagesPalletWeights, }; use scale_info::TypeInfo; use sp_runtime::SaturatedConversion; use sp_std::{fmt::Debug, marker::PhantomData}; use xcm::prelude::*; -use xcm_builder::{DispatchBlob, DispatchBlobError, HaulBlob, HaulBlobError}; - -/// Plain "XCM" payload, which we transfer through bridge -pub type XcmAsPlainPayload = sp_std::prelude::Vec; +use xcm_builder::{DispatchBlob, DispatchBlobError}; /// Message dispatch result type for single message #[derive(CloneNoBound, EqNoBound, PartialEqNoBound, Encode, Decode, Debug, TypeInfo)] @@ -123,6 +120,7 @@ impl< /// A pair of sending chain location and message lane, used by this chain to send messages /// over the bridge. +#[cfg_attr(feature = "std", derive(Debug, Eq, PartialEq))] pub struct SenderAndLane { /// Sending chain relative location. pub location: MultiLocation, @@ -144,8 +142,6 @@ pub trait XcmBlobHauler { type Runtime: MessagesConfig; /// Instance of the messages pallet that is used to send messages. type MessagesInstance: 'static; - /// Returns lane used by this hauler. - type SenderAndLane: Get; /// Actual XCM message sender (`HRMP` or `UMP`) to the source chain /// location (`Self::SenderAndLane::get().location`). @@ -166,54 +162,25 @@ pub trait XcmBlobHauler { /// makes sure that XCM blob is sent to the outbound lane to be relayed. /// /// It needs to be used at the source bridge hub. -pub struct XcmBlobHaulerAdapter(sp_std::marker::PhantomData); +pub struct XcmBlobHaulerAdapter( + sp_std::marker::PhantomData<(XcmBlobHauler, Lanes)>, +); -impl HaulBlob for XcmBlobHaulerAdapter -where - H::Runtime: MessagesConfig, +impl< + H: XcmBlobHauler, + Lanes: Get>, + > OnMessagesDelivered for XcmBlobHaulerAdapter { - fn haul_blob(blob: sp_std::prelude::Vec) -> Result<(), HaulBlobError> { - let sender_and_lane = H::SenderAndLane::get(); - MessagesPallet::::send_message(sender_and_lane.lane, blob) - .map(|artifacts| { - log::info!( - target: crate::LOG_TARGET_BRIDGE_DISPATCH, - "haul_blob result - ok: {:?} on lane: {:?}. Enqueued messages: {}", - artifacts.nonce, - sender_and_lane.lane, - artifacts.enqueued_messages, - ); - - // notify XCM queue manager about updated lane state - LocalXcmQueueManager::::on_bridge_message_enqueued( - &sender_and_lane, - artifacts.enqueued_messages, - ); - }) - .map_err(|error| { - log::error!( - target: crate::LOG_TARGET_BRIDGE_DISPATCH, - "haul_blob result - error: {:?} on lane: {:?}", - error, - sender_and_lane.lane, - ); - HaulBlobError::Transport("MessageSenderError") - }) - } -} - -impl OnMessagesDelivered for XcmBlobHaulerAdapter { fn on_messages_delivered(lane: LaneId, enqueued_messages: MessageNonce) { - let sender_and_lane = H::SenderAndLane::get(); - if sender_and_lane.lane != lane { - return + if let Some(sender_and_lane) = + Lanes::get().iter().find(|link| link.0.lane == lane).map(|link| &link.0) + { + // notify XCM queue manager about updated lane state + LocalXcmQueueManager::::on_bridge_messages_delivered( + sender_and_lane, + enqueued_messages, + ); } - - // notify XCM queue manager about updated lane state - LocalXcmQueueManager::::on_bridge_messages_delivered( - &sender_and_lane, - enqueued_messages, - ); } } @@ -356,6 +323,9 @@ mod tests { location: MultiLocation::new(1, X1(Parachain(1000))), lane: TEST_LANE_ID, }; + pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ + (TestSenderAndLane::get(), (NetworkId::ByGenesis([0; 32]), InteriorMultiLocation::Here)) + ]; pub DummyXcmMessage: Xcm<()> = Xcm::new(); } @@ -389,37 +359,44 @@ mod tests { impl XcmBlobHauler for TestBlobHauler { type Runtime = TestRuntime; type MessagesInstance = (); - type SenderAndLane = TestSenderAndLane; type ToSourceChainSender = DummySendXcm; type CongestedMessage = DummyXcmMessage; type UncongestedMessage = DummyXcmMessage; } - type TestBlobHaulerAdapter = XcmBlobHaulerAdapter; + type TestBlobHaulerAdapter = XcmBlobHaulerAdapter; - fn fill_up_lane_to_congestion() { + fn fill_up_lane_to_congestion() -> MessageNonce { + let latest_generated_nonce = OUTBOUND_LANE_CONGESTED_THRESHOLD; OutboundLanes::::insert( TEST_LANE_ID, OutboundLaneData { oldest_unpruned_nonce: 0, latest_received_nonce: 0, - latest_generated_nonce: OUTBOUND_LANE_CONGESTED_THRESHOLD, + latest_generated_nonce, }, ); + latest_generated_nonce } #[test] fn congested_signal_is_not_sent_twice() { run_test(|| { - fill_up_lane_to_congestion(); + let enqueued = fill_up_lane_to_congestion(); // next sent message leads to congested signal - TestBlobHaulerAdapter::haul_blob(vec![42]).unwrap(); + LocalXcmQueueManager::::on_bridge_message_enqueued( + &TestSenderAndLane::get(), + enqueued + 1, + ); assert_eq!(DummySendXcm::messages_sent(), 1); // next sent message => we don't sent another congested signal - TestBlobHaulerAdapter::haul_blob(vec![42]).unwrap(); + LocalXcmQueueManager::::on_bridge_message_enqueued( + &TestSenderAndLane::get(), + enqueued, + ); assert_eq!(DummySendXcm::messages_sent(), 1); }); } @@ -427,7 +404,10 @@ mod tests { #[test] fn congested_signal_is_not_sent_when_outbound_lane_is_not_congested() { run_test(|| { - TestBlobHaulerAdapter::haul_blob(vec![42]).unwrap(); + LocalXcmQueueManager::::on_bridge_message_enqueued( + &TestSenderAndLane::get(), + 1, + ); assert_eq!(DummySendXcm::messages_sent(), 0); }); } @@ -435,10 +415,13 @@ mod tests { #[test] fn congested_signal_is_sent_when_outbound_lane_is_congested() { run_test(|| { - fill_up_lane_to_congestion(); + let enqueued = fill_up_lane_to_congestion(); // next sent message leads to congested signal - TestBlobHaulerAdapter::haul_blob(vec![42]).unwrap(); + LocalXcmQueueManager::::on_bridge_message_enqueued( + &TestSenderAndLane::get(), + enqueued + 1, + ); assert_eq!(DummySendXcm::messages_sent(), 1); assert!(LocalXcmQueueManager::::is_congested_signal_sent(TEST_LANE_ID)); }); diff --git a/bin/runtime-common/src/mock.rs b/bin/runtime-common/src/mock.rs new file mode 100644 index 000000000000..bd47d37fc07d --- /dev/null +++ b/bin/runtime-common/src/mock.rs @@ -0,0 +1,421 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! A mock runtime for testing different stuff in the crate. + +#![cfg(test)] + +use crate::messages::{ + source::{ + FromThisChainMaximalOutboundPayloadSize, FromThisChainMessagePayload, + FromThisChainMessageVerifier, TargetHeaderChainAdapter, + }, + target::{FromBridgedChainMessagePayload, SourceHeaderChainAdapter}, + BridgedChainWithMessages, HashOf, MessageBridge, ThisChainWithMessages, +}; + +use bp_header_chain::{ChainWithGrandpa, HeaderChain}; +use bp_messages::{ + target_chain::{DispatchMessage, MessageDispatch}, + LaneId, MessageNonce, +}; +use bp_parachains::SingleParaStoredHeaderDataBuilder; +use bp_relayers::PayRewardFromAccount; +use bp_runtime::{ + messages::MessageDispatchResult, Chain, ChainId, Parachain, UnderlyingChainProvider, +}; +use codec::{Decode, Encode}; +use frame_support::{ + derive_impl, parameter_types, + weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight}, +}; +use pallet_transaction_payment::Multiplier; +use sp_runtime::{ + testing::H256, + traits::{BlakeTwo256, ConstU32, ConstU64, ConstU8}, + FixedPointNumber, Perquintill, +}; + +/// Account identifier at `ThisChain`. +pub type ThisChainAccountId = u64; +/// Balance at `ThisChain`. +pub type ThisChainBalance = u64; +/// Block number at `ThisChain`. +pub type ThisChainBlockNumber = u32; +/// Hash at `ThisChain`. +pub type ThisChainHash = H256; +/// Hasher at `ThisChain`. +pub type ThisChainHasher = BlakeTwo256; +/// Runtime call at `ThisChain`. +pub type ThisChainRuntimeCall = RuntimeCall; +/// Runtime call origin at `ThisChain`. +pub type ThisChainCallOrigin = RuntimeOrigin; +/// Header of `ThisChain`. +pub type ThisChainHeader = sp_runtime::generic::Header; +/// Block of `ThisChain`. +pub type ThisChainBlock = frame_system::mocking::MockBlockU32; + +/// Account identifier at the `BridgedChain`. +pub type BridgedChainAccountId = u128; +/// Balance at the `BridgedChain`. +pub type BridgedChainBalance = u128; +/// Block number at the `BridgedChain`. +pub type BridgedChainBlockNumber = u32; +/// Hash at the `BridgedChain`. +pub type BridgedChainHash = H256; +/// Hasher at the `BridgedChain`. +pub type BridgedChainHasher = BlakeTwo256; +/// Header of the `BridgedChain`. +pub type BridgedChainHeader = + sp_runtime::generic::Header; + +/// Rewards payment procedure. +pub type TestPaymentProcedure = PayRewardFromAccount; +/// Stake that we are using in tests. +pub type TestStake = ConstU64<5_000>; +/// Stake and slash mechanism to use in tests. +pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< + ThisChainAccountId, + ThisChainBlockNumber, + Balances, + ReserveId, + TestStake, + ConstU32<8>, +>; + +/// Message lane used in tests. +pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 0]); +/// Bridged chain id used in tests. +pub const TEST_BRIDGED_CHAIN_ID: ChainId = *b"brdg"; +/// Maximal extrinsic weight at the `BridgedChain`. +pub const BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT: usize = 2048; +/// Maximal extrinsic size at the `BridgedChain`. +pub const BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE: u32 = 1024; + +frame_support::construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Utility: pallet_utility, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event}, + BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event}, + BridgeGrandpa: pallet_bridge_grandpa::{Pallet, Call, Storage, Event}, + BridgeParachains: pallet_bridge_parachains::{Pallet, Call, Storage, Event}, + BridgeMessages: pallet_bridge_messages::{Pallet, Call, Storage, Event, Config}, + } +} + +crate::generate_bridge_reject_obsolete_headers_and_messages! { + ThisChainRuntimeCall, ThisChainAccountId, + BridgeGrandpa, BridgeParachains, BridgeMessages +} + +parameter_types! { + pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID]; + pub const BridgedChainId: ChainId = TEST_BRIDGED_CHAIN_ID; + pub const BridgedParasPalletName: &'static str = "Paras"; + pub const ExistentialDeposit: ThisChainBalance = 500; + pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; + pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); + pub const TransactionBaseFee: ThisChainBalance = 0; + pub const TransactionByteFee: ThisChainBalance = 1; + pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000); + pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000u128); + pub MaximumMultiplier: Multiplier = sp_runtime::traits::Bounded::max_value(); + pub const MaxUnrewardedRelayerEntriesAtInboundLane: MessageNonce = 16; + pub const MaxUnconfirmedMessagesAtInboundLane: MessageNonce = 1_000; + pub const ReserveId: [u8; 8] = *b"brdgrlrs"; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Hash = ThisChainHash; + type Hashing = ThisChainHasher; + type AccountId = ThisChainAccountId; + type Block = ThisChainBlock; + type AccountData = pallet_balances::AccountData; + type BlockHashCount = ConstU32<250>; +} + +impl pallet_utility::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = (); +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +impl pallet_balances::Config for TestRuntime { + type ReserveIdentifier = [u8; 8]; + type AccountStore = System; +} + +impl pallet_transaction_payment::Config for TestRuntime { + type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = IdentityFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = pallet_transaction_payment::TargetedFeeAdjustment< + TestRuntime, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + MaximumMultiplier, + >; + type RuntimeEvent = RuntimeEvent; +} + +impl pallet_bridge_grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = BridgedUnderlyingChain; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type HeadersToKeep = ConstU32<8>; + type WeightInfo = pallet_bridge_grandpa::weights::BridgeWeight; +} + +impl pallet_bridge_parachains::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgesGrandpaPalletInstance = (); + type ParasPalletName = BridgedParasPalletName; + type ParaStoredHeaderDataBuilder = + SingleParaStoredHeaderDataBuilder; + type HeadsToKeep = ConstU32<8>; + type MaxParaHeadDataSize = ConstU32<1024>; + type WeightInfo = pallet_bridge_parachains::weights::BridgeWeight; +} + +impl pallet_bridge_messages::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_bridge_messages::weights::BridgeWeight; + type ActiveOutboundLanes = ActiveOutboundLanes; + type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; + + type MaximalOutboundPayloadSize = FromThisChainMaximalOutboundPayloadSize; + type OutboundPayload = FromThisChainMessagePayload; + + type InboundPayload = FromBridgedChainMessagePayload; + type InboundRelayer = BridgedChainAccountId; + type DeliveryPayments = (); + + type TargetHeaderChain = TargetHeaderChainAdapter; + type LaneMessageVerifier = FromThisChainMessageVerifier; + type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< + TestRuntime, + (), + ConstU64<100_000>, + >; + type OnMessagesDelivered = (); + + type SourceHeaderChain = SourceHeaderChainAdapter; + type MessageDispatch = DummyMessageDispatch; + type BridgedChainId = BridgedChainId; +} + +impl pallet_bridge_relayers::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type Reward = ThisChainBalance; + type PaymentProcedure = TestPaymentProcedure; + type StakeAndSlash = TestStakeAndSlash; + type WeightInfo = (); +} + +/// Dummy message dispatcher. +pub struct DummyMessageDispatch; + +impl DummyMessageDispatch { + pub fn deactivate() { + frame_support::storage::unhashed::put(&b"inactive"[..], &false); + } +} + +impl MessageDispatch for DummyMessageDispatch { + type DispatchPayload = Vec; + type DispatchLevelResult = (); + + fn is_active() -> bool { + frame_support::storage::unhashed::take::(&b"inactive"[..]) != Some(false) + } + + fn dispatch_weight(_message: &mut DispatchMessage) -> Weight { + Weight::zero() + } + + fn dispatch( + _: DispatchMessage, + ) -> MessageDispatchResult { + MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result: () } + } +} + +/// Bridge that is deployed on `ThisChain` and allows sending/receiving messages to/from +/// `BridgedChain`. +#[derive(Debug, PartialEq, Eq)] +pub struct OnThisChainBridge; + +impl MessageBridge for OnThisChainBridge { + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; + + type ThisChain = ThisChain; + type BridgedChain = BridgedChain; + type BridgedHeaderChain = pallet_bridge_grandpa::GrandpaChainHeaders; +} + +/// Bridge that is deployed on `BridgedChain` and allows sending/receiving messages to/from +/// `ThisChain`. +#[derive(Debug, PartialEq, Eq)] +pub struct OnBridgedChainBridge; + +impl MessageBridge for OnBridgedChainBridge { + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; + + type ThisChain = BridgedChain; + type BridgedChain = ThisChain; + type BridgedHeaderChain = ThisHeaderChain; +} + +/// Dummy implementation of `HeaderChain` for `ThisChain` at the `BridgedChain`. +pub struct ThisHeaderChain; + +impl HeaderChain for ThisHeaderChain { + fn finalized_header_state_root(_hash: HashOf) -> Option> { + unreachable!() + } +} + +/// Call origin at `BridgedChain`. +#[derive(Clone, Debug)] +pub struct BridgedChainOrigin; + +impl From + for Result, BridgedChainOrigin> +{ + fn from( + _origin: BridgedChainOrigin, + ) -> Result, BridgedChainOrigin> { + unreachable!() + } +} + +/// Underlying chain of `ThisChain`. +pub struct ThisUnderlyingChain; + +impl Chain for ThisUnderlyingChain { + type BlockNumber = ThisChainBlockNumber; + type Hash = ThisChainHash; + type Hasher = ThisChainHasher; + type Header = ThisChainHeader; + type AccountId = ThisChainAccountId; + type Balance = ThisChainBalance; + type Nonce = u32; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE + } + + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +/// The chain where we are in tests. +pub struct ThisChain; + +impl UnderlyingChainProvider for ThisChain { + type Chain = ThisUnderlyingChain; +} + +impl ThisChainWithMessages for ThisChain { + type RuntimeOrigin = ThisChainCallOrigin; +} + +impl BridgedChainWithMessages for ThisChain {} + +/// Underlying chain of `BridgedChain`. +pub struct BridgedUnderlyingChain; +/// Some parachain under `BridgedChain` consensus. +pub struct BridgedUnderlyingParachain; +/// Runtime call of the `BridgedChain`. +#[derive(Decode, Encode)] +pub struct BridgedChainCall; + +impl Chain for BridgedUnderlyingChain { + type BlockNumber = BridgedChainBlockNumber; + type Hash = BridgedChainHash; + type Hasher = BridgedChainHasher; + type Header = BridgedChainHeader; + type AccountId = BridgedChainAccountId; + type Balance = BridgedChainBalance; + type Nonce = u32; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl ChainWithGrandpa for BridgedUnderlyingChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = 16; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_MANDATORY_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE: u32 = 64; +} + +impl Chain for BridgedUnderlyingParachain { + type BlockNumber = BridgedChainBlockNumber; + type Hash = BridgedChainHash; + type Hasher = BridgedChainHasher; + type Header = BridgedChainHeader; + type AccountId = BridgedChainAccountId; + type Balance = BridgedChainBalance; + type Nonce = u32; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for BridgedUnderlyingParachain { + const PARACHAIN_ID: u32 = 42; +} + +/// The other, bridged chain, used in tests. +pub struct BridgedChain; + +impl UnderlyingChainProvider for BridgedChain { + type Chain = BridgedUnderlyingChain; +} + +impl ThisChainWithMessages for BridgedChain { + type RuntimeOrigin = BridgedChainOrigin; +} + +impl BridgedChainWithMessages for BridgedChain {} + +/// Run test within test externalities. +pub fn run_test(test: impl FnOnce()) { + sp_io::TestExternalities::new(Default::default()).execute_with(test) +} diff --git a/cumulus/bridges/bin/runtime-common/src/parachains_benchmarking.rs b/bin/runtime-common/src/parachains_benchmarking.rs similarity index 98% rename from cumulus/bridges/bin/runtime-common/src/parachains_benchmarking.rs rename to bin/runtime-common/src/parachains_benchmarking.rs index aad53673c3ad..63dc78385e46 100644 --- a/cumulus/bridges/bin/runtime-common/src/parachains_benchmarking.rs +++ b/bin/runtime-common/src/parachains_benchmarking.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify diff --git a/cumulus/bridges/bin/runtime-common/src/priority_calculator.rs b/bin/runtime-common/src/priority_calculator.rs similarity index 96% rename from cumulus/bridges/bin/runtime-common/src/priority_calculator.rs rename to bin/runtime-common/src/priority_calculator.rs index 590de05fb1c6..a597fb9e2f49 100644 --- a/cumulus/bridges/bin/runtime-common/src/priority_calculator.rs +++ b/bin/runtime-common/src/priority_calculator.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -27,6 +27,7 @@ use frame_support::traits::Get; use sp_runtime::transaction_validity::TransactionPriority; // reexport everything from `integrity_tests` module +#[allow(unused_imports)] pub use integrity_tests::*; /// Compute priority boost for message delivery transaction that delivers @@ -38,7 +39,7 @@ where PriorityBoostPerMessage: Get, { // we don't want any boost for transaction with single message => minus one - PriorityBoostPerMessage::get().saturating_mul(messages - 1) + PriorityBoostPerMessage::get().saturating_mul(messages.saturating_sub(1)) } #[cfg(not(feature = "integrity-test"))] @@ -51,13 +52,13 @@ mod integrity_tests { use bp_messages::MessageNonce; use bp_runtime::PreComputedSize; use frame_support::{ - dispatch::{DispatchClass, DispatchInfo, Dispatchable, Pays, PostDispatchInfo}, + dispatch::{DispatchClass, DispatchInfo, Pays, PostDispatchInfo}, traits::Get, }; use pallet_bridge_messages::WeightInfoExt; use pallet_transaction_payment::OnChargeTransaction; use sp_runtime::{ - traits::{UniqueSaturatedInto, Zero}, + traits::{Dispatchable, UniqueSaturatedInto, Zero}, transaction_validity::TransactionPriority, FixedPointOperand, SaturatedConversion, Saturating, }; diff --git a/bin/runtime-common/src/refund_relayer_extension.rs b/bin/runtime-common/src/refund_relayer_extension.rs new file mode 100644 index 000000000000..6d8b21148085 --- /dev/null +++ b/bin/runtime-common/src/refund_relayer_extension.rs @@ -0,0 +1,2321 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Signed extension that refunds relayer if he has delivered some new messages. +//! It also refunds transaction cost if the transaction is an `utility.batchAll()` +//! with calls that are: delivering new messsage and all necessary underlying headers +//! (parachain or relay chain). + +use crate::messages_call_ext::{ + CallHelper as MessagesCallHelper, CallInfo as MessagesCallInfo, MessagesCallSubType, +}; +use bp_messages::{LaneId, MessageNonce}; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::{Chain, Parachain, ParachainIdOf, RangeInclusiveExt, StaticStrProvider}; +use codec::{Codec, Decode, Encode}; +use frame_support::{ + dispatch::{CallableCallFor, DispatchInfo, PostDispatchInfo}, + traits::IsSubType, + weights::Weight, + CloneNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound, +}; +use pallet_bridge_grandpa::{ + CallSubType as GrandpaCallSubType, Config as GrandpaConfig, SubmitFinalityProofHelper, + SubmitFinalityProofInfo, +}; +use pallet_bridge_messages::Config as MessagesConfig; +use pallet_bridge_parachains::{ + BoundedBridgeGrandpaConfig, CallSubType as ParachainsCallSubType, Config as ParachainsConfig, + RelayBlockNumber, SubmitParachainHeadsHelper, SubmitParachainHeadsInfo, +}; +use pallet_bridge_relayers::{ + Config as RelayersConfig, Pallet as RelayersPallet, WeightInfoExt as _, +}; +use pallet_transaction_payment::{Config as TransactionPaymentConfig, OnChargeTransaction}; +use pallet_utility::{Call as UtilityCall, Config as UtilityConfig, Pallet as UtilityPallet}; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::{DispatchInfoOf, Dispatchable, Get, PostDispatchInfoOf, SignedExtension, Zero}, + transaction_validity::{ + TransactionPriority, TransactionValidity, TransactionValidityError, ValidTransactionBuilder, + }, + DispatchResult, FixedPointOperand, RuntimeDebug, +}; +use sp_std::{marker::PhantomData, vec, vec::Vec}; + +type AccountIdOf = ::AccountId; +// without this typedef rustfmt fails with internal err +type BalanceOf = + <::OnChargeTransaction as OnChargeTransaction>::Balance; +type CallOf = ::RuntimeCall; + +/// Trait identifying a bridged parachain. A relayer might be refunded for delivering messages +/// coming from this parachain. +pub trait RefundableParachainId { + /// The instance of the bridge parachains pallet. + type Instance; + /// The parachain Id. + type Id: Get; +} + +/// Default implementation of `RefundableParachainId`. +pub struct DefaultRefundableParachainId(PhantomData<(Instance, Id)>); + +impl RefundableParachainId for DefaultRefundableParachainId +where + Id: Get, +{ + type Instance = Instance; + type Id = Id; +} + +/// Implementation of `RefundableParachainId` for `trait Parachain`. +pub struct RefundableParachain(PhantomData<(Instance, Para)>); + +impl RefundableParachainId for RefundableParachain +where + Para: Parachain, +{ + type Instance = Instance; + type Id = ParachainIdOf; +} + +/// Trait identifying a bridged messages lane. A relayer might be refunded for delivering messages +/// coming from this lane. +pub trait RefundableMessagesLaneId { + /// The instance of the bridge messages pallet. + type Instance: 'static; + /// The messages lane id. + type Id: Get; +} + +/// Default implementation of `RefundableMessagesLaneId`. +pub struct RefundableMessagesLane(PhantomData<(Instance, Id)>); + +impl RefundableMessagesLaneId for RefundableMessagesLane +where + Instance: 'static, + Id: Get, +{ + type Instance = Instance; + type Id = Id; +} + +/// Refund calculator. +pub trait RefundCalculator { + // The underlying integer type in which the refund is calculated. + type Balance; + + /// Compute refund for given transaction. + fn compute_refund( + info: &DispatchInfo, + post_info: &PostDispatchInfo, + len: usize, + tip: Self::Balance, + ) -> Self::Balance; +} + +/// `RefundCalculator` implementation which refunds the actual transaction fee. +pub struct ActualFeeRefund(PhantomData); + +impl RefundCalculator for ActualFeeRefund +where + R: TransactionPaymentConfig, + CallOf: Dispatchable, + BalanceOf: FixedPointOperand, +{ + type Balance = BalanceOf; + + fn compute_refund( + info: &DispatchInfo, + post_info: &PostDispatchInfo, + len: usize, + tip: BalanceOf, + ) -> BalanceOf { + pallet_transaction_payment::Pallet::::compute_actual_fee(len as _, info, post_info, tip) + } +} + +/// Data that is crafted in `pre_dispatch` method and used at `post_dispatch`. +#[cfg_attr(test, derive(Debug, PartialEq))] +pub struct PreDispatchData { + /// Transaction submitter (relayer) account. + relayer: AccountId, + /// Type of the call. + call_info: CallInfo, +} + +/// Type of the call that the extension recognizes. +#[derive(RuntimeDebugNoBound, PartialEq)] +pub enum CallInfo { + /// Relay chain finality + parachain finality + message delivery/confirmation calls. + AllFinalityAndMsgs( + SubmitFinalityProofInfo, + SubmitParachainHeadsInfo, + MessagesCallInfo, + ), + /// Relay chain finality + message delivery/confirmation calls. + RelayFinalityAndMsgs(SubmitFinalityProofInfo, MessagesCallInfo), + /// Parachain finality + message delivery/confirmation calls. + /// + /// This variant is used only when bridging with parachain. + ParachainFinalityAndMsgs(SubmitParachainHeadsInfo, MessagesCallInfo), + /// Standalone message delivery/confirmation call. + Msgs(MessagesCallInfo), +} + +impl CallInfo { + /// Returns true if call is a message delivery call (with optional finality calls). + fn is_receive_messages_proof_call(&self) -> bool { + match self.messages_call_info() { + MessagesCallInfo::ReceiveMessagesProof(_) => true, + MessagesCallInfo::ReceiveMessagesDeliveryProof(_) => false, + } + } + + /// Returns the pre-dispatch `finality_target` sent to the `SubmitFinalityProof` call. + fn submit_finality_proof_info(&self) -> Option> { + match *self { + Self::AllFinalityAndMsgs(info, _, _) => Some(info), + Self::RelayFinalityAndMsgs(info, _) => Some(info), + _ => None, + } + } + + /// Returns the pre-dispatch `SubmitParachainHeadsInfo`. + fn submit_parachain_heads_info(&self) -> Option<&SubmitParachainHeadsInfo> { + match self { + Self::AllFinalityAndMsgs(_, info, _) => Some(info), + Self::ParachainFinalityAndMsgs(info, _) => Some(info), + _ => None, + } + } + + /// Returns the pre-dispatch `ReceiveMessagesProofInfo`. + fn messages_call_info(&self) -> &MessagesCallInfo { + match self { + Self::AllFinalityAndMsgs(_, _, info) => info, + Self::RelayFinalityAndMsgs(_, info) => info, + Self::ParachainFinalityAndMsgs(_, info) => info, + Self::Msgs(info) => info, + } + } +} + +/// The actions on relayer account that need to be performed because of his actions. +#[derive(RuntimeDebug, PartialEq)] +pub enum RelayerAccountAction { + /// Do nothing with relayer account. + None, + /// Reward the relayer. + Reward(AccountId, RewardsAccountParams, Reward), + /// Slash the relayer. + Slash(AccountId, RewardsAccountParams), +} + +/// Everything common among our refund signed extensions. +pub trait RefundSignedExtension: + 'static + Clone + Codec + sp_std::fmt::Debug + Default + Eq + PartialEq + Send + Sync + TypeInfo +where + >::BridgedChain: + Chain, +{ + /// This chain runtime. + type Runtime: UtilityConfig> + + GrandpaConfig + + MessagesConfig<::Instance> + + RelayersConfig; + /// Grandpa pallet reference. + type GrandpaInstance: 'static; + /// Messages pallet and lane reference. + type Msgs: RefundableMessagesLaneId; + /// Refund amount calculator. + type Refund: RefundCalculator::Reward>; + /// Priority boost calculator. + type Priority: Get; + /// Signed extension unique identifier. + type Id: StaticStrProvider; + + /// Unpack batch runtime call. + fn expand_call(call: &CallOf) -> Vec<&CallOf>; + + /// Given runtime call, check if it has supported format. Additionally, check if any of + /// (optionally batched) calls are obsolete and we shall reject the transaction. + fn parse_and_check_for_obsolete_call( + call: &CallOf, + ) -> Result, TransactionValidityError>; + + /// Check if parsed call is already obsolete. + fn check_obsolete_parsed_call( + call: &CallOf, + ) -> Result<&CallOf, TransactionValidityError>; + + /// Called from post-dispatch and shall perform additional checks (apart from relay + /// chain finality and messages transaction finality) of given call result. + fn additional_call_result_check( + relayer: &AccountIdOf, + call_info: &CallInfo, + ) -> bool; + + /// Given post-dispatch information, analyze the outcome of relayer call and return + /// actions that need to be performed on relayer account. + fn analyze_call_result( + pre: Option>>>, + info: &DispatchInfo, + post_info: &PostDispatchInfo, + len: usize, + result: &DispatchResult, + ) -> RelayerAccountAction, ::Reward> + { + let mut extra_weight = Weight::zero(); + let mut extra_size = 0; + + // We don't refund anything for transactions that we don't support. + let (relayer, call_info) = match pre { + Some(Some(pre)) => (pre.relayer, pre.call_info), + _ => return RelayerAccountAction::None, + }; + + // now we know that the relayer either needs to be rewarded, or slashed + // => let's prepare the correspondent account that pays reward/receives slashed amount + let reward_account_params = + RewardsAccountParams::new( + ::Id::get(), + ::Instance, + >>::BridgedChainId::get(), + if call_info.is_receive_messages_proof_call() { + RewardsAccountOwner::ThisChain + } else { + RewardsAccountOwner::BridgedChain + }, + ); + + // prepare return value for the case if the call has failed or it has not caused + // expected side effects (e.g. not all messages have been accepted) + // + // we are not checking if relayer is registered here - it happens during the slash attempt + // + // there are couple of edge cases here: + // + // - when the relayer becomes registered during message dispatch: this is unlikely + relayer + // should be ready for slashing after registration; + // + // - when relayer is registered after `validate` is called and priority is not boosted: + // relayer should be ready for slashing after registration. + let may_slash_relayer = + Self::bundled_messages_for_priority_boost(Some(&call_info)).is_some(); + let slash_relayer_if_delivery_result = may_slash_relayer + .then(|| RelayerAccountAction::Slash(relayer.clone(), reward_account_params)) + .unwrap_or(RelayerAccountAction::None); + + // We don't refund anything if the transaction has failed. + if let Err(e) = result { + log::trace!( + target: "runtime::bridge", + "{} via {:?}: relayer {:?} has submitted invalid messages transaction: {:?}", + Self::Id::STR, + ::Id::get(), + relayer, + e, + ); + return slash_relayer_if_delivery_result + } + + // check if relay chain state has been updated + if let Some(finality_proof_info) = call_info.submit_finality_proof_info() { + if !SubmitFinalityProofHelper::::was_successful( + finality_proof_info.block_number, + ) { + // we only refund relayer if all calls have updated chain state + log::trace!( + target: "runtime::bridge", + "{} via {:?}: relayer {:?} has submitted invalid relay chain finality proof", + Self::Id::STR, + ::Id::get(), + relayer, + ); + return slash_relayer_if_delivery_result + } + + // there's a conflict between how bridge GRANDPA pallet works and a `utility.batchAll` + // transaction. If relay chain header is mandatory, the GRANDPA pallet returns + // `Pays::No`, because such transaction is mandatory for operating the bridge. But + // `utility.batchAll` transaction always requires payment. But in both cases we'll + // refund relayer - either explicitly here, or using `Pays::No` if he's choosing + // to submit dedicated transaction. + + // submitter has means to include extra weight/bytes in the `submit_finality_proof` + // call, so let's subtract extra weight/size to avoid refunding for this extra stuff + extra_weight = finality_proof_info.extra_weight; + extra_size = finality_proof_info.extra_size; + } + + // Check if the `ReceiveMessagesProof` call delivered at least some of the messages that + // it contained. If this happens, we consider the transaction "helpful" and refund it. + let msgs_call_info = call_info.messages_call_info(); + if !MessagesCallHelper::::Instance>::was_successful(msgs_call_info) { + log::trace!( + target: "runtime::bridge", + "{} via {:?}: relayer {:?} has submitted invalid messages call", + Self::Id::STR, + ::Id::get(), + relayer, + ); + return slash_relayer_if_delivery_result + } + + // do additional check + if !Self::additional_call_result_check(&relayer, &call_info) { + return slash_relayer_if_delivery_result + } + + // regarding the tip - refund that happens here (at this side of the bridge) isn't the whole + // relayer compensation. He'll receive some amount at the other side of the bridge. It shall + // (in theory) cover the tip there. Otherwise, if we'll be compensating tip here, some + // malicious relayer may use huge tips, effectively depleting account that pay rewards. The + // cost of this attack is nothing. Hence we use zero as tip here. + let tip = Zero::zero(); + + // decrease post-dispatch weight/size using extra weight/size that we know now + let post_info_len = len.saturating_sub(extra_size as usize); + let mut post_info_weight = + post_info.actual_weight.unwrap_or(info.weight).saturating_sub(extra_weight); + + // let's also replace the weight of slashing relayer with the weight of rewarding relayer + if call_info.is_receive_messages_proof_call() { + post_info_weight = post_info_weight.saturating_sub( + ::WeightInfo::extra_weight_of_successful_receive_messages_proof_call(), + ); + } + + // compute the relayer refund + let mut post_info = *post_info; + post_info.actual_weight = Some(post_info_weight); + let refund = Self::Refund::compute_refund(info, &post_info, post_info_len, tip); + + // we can finally reward relayer + RelayerAccountAction::Reward(relayer, reward_account_params, refund) + } + + /// Returns number of bundled messages `Some(_)`, if the given call info is a: + /// + /// - message delivery transaction; + /// + /// - with reasonable bundled messages that may be accepted by the messages pallet. + /// + /// This function is used to check whether the transaction priority should be + /// virtually boosted. The relayer registration (we only boost priority for registered + /// relayer transactions) must be checked outside. + fn bundled_messages_for_priority_boost(call_info: Option<&CallInfo>) -> Option { + // we only boost priority of message delivery transactions + let parsed_call = match call_info { + Some(parsed_call) if parsed_call.is_receive_messages_proof_call() => parsed_call, + _ => return None, + }; + + // compute total number of messages in transaction + let bundled_messages = parsed_call.messages_call_info().bundled_messages().saturating_len(); + + // a quick check to avoid invalid high-priority transactions + let max_unconfirmed_messages_in_confirmation_tx = ::Instance, + >>::MaxUnconfirmedMessagesAtInboundLane::get( + ); + if bundled_messages > max_unconfirmed_messages_in_confirmation_tx { + return None + } + + Some(bundled_messages) + } +} + +/// Adapter that allow implementing `sp_runtime::traits::SignedExtension` for any +/// `RefundSignedExtension`. +#[derive( + DefaultNoBound, + CloneNoBound, + Decode, + Encode, + EqNoBound, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, +)] +pub struct RefundSignedExtensionAdapter(T) +where + >::BridgedChain: + Chain; + +impl SignedExtension for RefundSignedExtensionAdapter +where + >::BridgedChain: + Chain, + CallOf: Dispatchable + + IsSubType, T::Runtime>> + + GrandpaCallSubType + + MessagesCallSubType::Instance>, +{ + const IDENTIFIER: &'static str = T::Id::STR; + type AccountId = AccountIdOf; + type Call = CallOf; + type AdditionalSigned = (); + type Pre = Option>>; + + fn additional_signed(&self) -> Result<(), TransactionValidityError> { + Ok(()) + } + + fn validate( + &self, + who: &Self::AccountId, + call: &Self::Call, + _info: &DispatchInfoOf, + _len: usize, + ) -> TransactionValidity { + // this is the only relevant line of code for the `pre_dispatch` + // + // we're not calling `validate` from `pre_dispatch` directly because of performance + // reasons, so if you're adding some code that may fail here, please check if it needs + // to be added to the `pre_dispatch` as well + let parsed_call = T::parse_and_check_for_obsolete_call(call)?; + + // the following code just plays with transaction priority and never returns an error + + // we only boost priority of presumably correct message delivery transactions + let bundled_messages = match T::bundled_messages_for_priority_boost(parsed_call.as_ref()) { + Some(bundled_messages) => bundled_messages, + None => return Ok(Default::default()), + }; + + // we only boost priority if relayer has staked required balance + if !RelayersPallet::::is_registration_active(who) { + return Ok(Default::default()) + } + + // compute priority boost + let priority_boost = + crate::priority_calculator::compute_priority_boost::(bundled_messages); + let valid_transaction = ValidTransactionBuilder::default().priority(priority_boost); + + log::trace!( + target: "runtime::bridge", + "{} via {:?} has boosted priority of message delivery transaction \ + of relayer {:?}: {} messages -> {} priority", + Self::IDENTIFIER, + ::Id::get(), + who, + bundled_messages, + priority_boost, + ); + + valid_transaction.build() + } + + fn pre_dispatch( + self, + who: &Self::AccountId, + call: &Self::Call, + _info: &DispatchInfoOf, + _len: usize, + ) -> Result { + // this is a relevant piece of `validate` that we need here (in `pre_dispatch`) + let parsed_call = T::parse_and_check_for_obsolete_call(call)?; + + Ok(parsed_call.map(|call_info| { + log::trace!( + target: "runtime::bridge", + "{} via {:?} parsed bridge transaction in pre-dispatch: {:?}", + Self::IDENTIFIER, + ::Id::get(), + call_info, + ); + PreDispatchData { relayer: who.clone(), call_info } + })) + } + + fn post_dispatch( + pre: Option, + info: &DispatchInfoOf, + post_info: &PostDispatchInfoOf, + len: usize, + result: &DispatchResult, + ) -> Result<(), TransactionValidityError> { + let call_result = T::analyze_call_result(pre, info, post_info, len, result); + + match call_result { + RelayerAccountAction::None => (), + RelayerAccountAction::Reward(relayer, reward_account, reward) => { + RelayersPallet::::register_relayer_reward( + reward_account, + &relayer, + reward, + ); + + log::trace!( + target: "runtime::bridge", + "{} via {:?} has registered reward: {:?} for {:?}", + Self::IDENTIFIER, + ::Id::get(), + reward, + relayer, + ); + }, + RelayerAccountAction::Slash(relayer, slash_account) => + RelayersPallet::::slash_and_deregister(&relayer, slash_account), + } + + Ok(()) + } +} + +/// Signed extension that refunds a relayer for new messages coming from a parachain. +/// +/// Also refunds relayer for successful finality delivery if it comes in batch (`utility.batchAll`) +/// with message delivery transaction. Batch may deliver either both relay chain header and +/// parachain head, or just parachain head. Corresponding headers must be used in messages +/// proof verification. +/// +/// Extension does not refund transaction tip due to security reasons. +#[derive( + DefaultNoBound, + CloneNoBound, + Decode, + Encode, + EqNoBound, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, +)] +#[scale_info(skip_type_params(Runtime, Para, Msgs, Refund, Priority, Id))] +pub struct RefundBridgedParachainMessages( + PhantomData<( + // runtime with `frame-utility`, `pallet-bridge-grandpa`, `pallet-bridge-parachains`, + // `pallet-bridge-messages` and `pallet-bridge-relayers` pallets deployed + Runtime, + // implementation of `RefundableParachainId` trait, which specifies the instance of + // the used `pallet-bridge-parachains` pallet and the bridged parachain id + Para, + // implementation of `RefundableMessagesLaneId` trait, which specifies the instance of + // the used `pallet-bridge-messages` pallet and the lane within this pallet + Msgs, + // implementation of the `RefundCalculator` trait, that is used to compute refund that + // we give to relayer for his transaction + Refund, + // getter for per-message `TransactionPriority` boost that we give to message + // delivery transactions + Priority, + // the runtime-unique identifier of this signed extension + Id, + )>, +); + +impl RefundSignedExtension + for RefundBridgedParachainMessages +where + Self: 'static + Send + Sync, + Runtime: UtilityConfig> + + BoundedBridgeGrandpaConfig + + ParachainsConfig + + MessagesConfig + + RelayersConfig, + Para: RefundableParachainId, + Msgs: RefundableMessagesLaneId, + Refund: RefundCalculator, + Priority: Get, + Id: StaticStrProvider, + CallOf: Dispatchable + + IsSubType, Runtime>> + + GrandpaCallSubType + + ParachainsCallSubType + + MessagesCallSubType, +{ + type Runtime = Runtime; + type GrandpaInstance = Runtime::BridgesGrandpaPalletInstance; + type Msgs = Msgs; + type Refund = Refund; + type Priority = Priority; + type Id = Id; + + fn expand_call(call: &CallOf) -> Vec<&CallOf> { + match call.is_sub_type() { + Some(UtilityCall::::batch_all { ref calls }) if calls.len() <= 3 => + calls.iter().collect(), + Some(_) => vec![], + None => vec![call], + } + } + + fn parse_and_check_for_obsolete_call( + call: &CallOf, + ) -> Result, TransactionValidityError> { + let calls = Self::expand_call(call); + let total_calls = calls.len(); + let mut calls = calls.into_iter().map(Self::check_obsolete_parsed_call).rev(); + + let msgs_call = calls.next().transpose()?.and_then(|c| c.call_info_for(Msgs::Id::get())); + let para_finality_call = calls + .next() + .transpose()? + .and_then(|c| c.submit_parachain_heads_info_for(Para::Id::get())); + let relay_finality_call = + calls.next().transpose()?.and_then(|c| c.submit_finality_proof_info()); + + Ok(match (total_calls, relay_finality_call, para_finality_call, msgs_call) { + (3, Some(relay_finality_call), Some(para_finality_call), Some(msgs_call)) => Some( + CallInfo::AllFinalityAndMsgs(relay_finality_call, para_finality_call, msgs_call), + ), + (2, None, Some(para_finality_call), Some(msgs_call)) => + Some(CallInfo::ParachainFinalityAndMsgs(para_finality_call, msgs_call)), + (1, None, None, Some(msgs_call)) => Some(CallInfo::Msgs(msgs_call)), + _ => None, + }) + } + + fn check_obsolete_parsed_call( + call: &CallOf, + ) -> Result<&CallOf, TransactionValidityError> { + call.check_obsolete_submit_finality_proof()?; + call.check_obsolete_submit_parachain_heads()?; + call.check_obsolete_call()?; + Ok(call) + } + + fn additional_call_result_check(relayer: &Runtime::AccountId, call_info: &CallInfo) -> bool { + // check if parachain state has been updated + if let Some(para_proof_info) = call_info.submit_parachain_heads_info() { + if !SubmitParachainHeadsHelper::::was_successful( + para_proof_info, + ) { + // we only refund relayer if all calls have updated chain state + log::trace!( + target: "runtime::bridge", + "{} from parachain {} via {:?}: relayer {:?} has submitted invalid parachain finality proof", + Id::STR, + Para::Id::get(), + Msgs::Id::get(), + relayer, + ); + return false + } + } + + true + } +} + +/// Signed extension that refunds a relayer for new messages coming from a standalone (GRANDPA) +/// chain. +/// +/// Also refunds relayer for successful finality delivery if it comes in batch (`utility.batchAll`) +/// with message delivery transaction. Batch may deliver either both relay chain header and +/// parachain head, or just parachain head. Corresponding headers must be used in messages +/// proof verification. +/// +/// Extension does not refund transaction tip due to security reasons. +#[derive( + DefaultNoBound, + CloneNoBound, + Decode, + Encode, + EqNoBound, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, +)] +#[scale_info(skip_type_params(Runtime, GrandpaInstance, Msgs, Refund, Priority, Id))] +pub struct RefundBridgedGrandpaMessages( + PhantomData<( + // runtime with `frame-utility`, `pallet-bridge-grandpa`, + // `pallet-bridge-messages` and `pallet-bridge-relayers` pallets deployed + Runtime, + // bridge GRANDPA pallet instance, used to track bridged chain state + GrandpaInstance, + // implementation of `RefundableMessagesLaneId` trait, which specifies the instance of + // the used `pallet-bridge-messages` pallet and the lane within this pallet + Msgs, + // implementation of the `RefundCalculator` trait, that is used to compute refund that + // we give to relayer for his transaction + Refund, + // getter for per-message `TransactionPriority` boost that we give to message + // delivery transactions + Priority, + // the runtime-unique identifier of this signed extension + Id, + )>, +); + +impl RefundSignedExtension + for RefundBridgedGrandpaMessages +where + Self: 'static + Send + Sync, + Runtime: UtilityConfig> + + BoundedBridgeGrandpaConfig + + MessagesConfig + + RelayersConfig, + GrandpaInstance: 'static, + Msgs: RefundableMessagesLaneId, + Refund: RefundCalculator, + Priority: Get, + Id: StaticStrProvider, + CallOf: Dispatchable + + IsSubType, Runtime>> + + GrandpaCallSubType + + MessagesCallSubType, +{ + type Runtime = Runtime; + type GrandpaInstance = GrandpaInstance; + type Msgs = Msgs; + type Refund = Refund; + type Priority = Priority; + type Id = Id; + + fn expand_call(call: &CallOf) -> Vec<&CallOf> { + match call.is_sub_type() { + Some(UtilityCall::::batch_all { ref calls }) if calls.len() <= 2 => + calls.iter().collect(), + Some(_) => vec![], + None => vec![call], + } + } + + fn parse_and_check_for_obsolete_call( + call: &CallOf, + ) -> Result, TransactionValidityError> { + let calls = Self::expand_call(call); + let total_calls = calls.len(); + let mut calls = calls.into_iter().map(Self::check_obsolete_parsed_call).rev(); + + let msgs_call = calls.next().transpose()?.and_then(|c| c.call_info_for(Msgs::Id::get())); + let relay_finality_call = + calls.next().transpose()?.and_then(|c| c.submit_finality_proof_info()); + + Ok(match (total_calls, relay_finality_call, msgs_call) { + (2, Some(relay_finality_call), Some(msgs_call)) => + Some(CallInfo::RelayFinalityAndMsgs(relay_finality_call, msgs_call)), + (1, None, Some(msgs_call)) => Some(CallInfo::Msgs(msgs_call)), + _ => None, + }) + } + + fn check_obsolete_parsed_call( + call: &CallOf, + ) -> Result<&CallOf, TransactionValidityError> { + call.check_obsolete_submit_finality_proof()?; + call.check_obsolete_call()?; + Ok(call) + } + + fn additional_call_result_check(_relayer: &Runtime::AccountId, _call_info: &CallInfo) -> bool { + true + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + }, + messages_call_ext::{ + BaseMessagesProofInfo, ReceiveMessagesDeliveryProofInfo, ReceiveMessagesProofInfo, + UnrewardedRelayerOccupation, + }, + mock::*, + }; + use bp_messages::{ + DeliveredMessages, InboundLaneData, MessageNonce, MessagesOperatingMode, OutboundLaneData, + UnrewardedRelayer, UnrewardedRelayersState, + }; + use bp_parachains::{BestParaHeadHash, ParaInfo}; + use bp_polkadot_core::parachains::{ParaHeadsProof, ParaId}; + use bp_runtime::{BasicOperatingMode, HeaderId}; + use bp_test_utils::{make_default_justification, test_keyring}; + use frame_support::{ + assert_storage_noop, parameter_types, + traits::{fungible::Mutate, ReservableCurrency}, + weights::Weight, + }; + use pallet_bridge_grandpa::{Call as GrandpaCall, Pallet as GrandpaPallet, StoredAuthoritySet}; + use pallet_bridge_messages::{Call as MessagesCall, Pallet as MessagesPallet}; + use pallet_bridge_parachains::{ + Call as ParachainsCall, Pallet as ParachainsPallet, RelayBlockHash, + }; + use sp_runtime::{ + traits::{ConstU64, Header as HeaderT}, + transaction_validity::{InvalidTransaction, ValidTransaction}, + DispatchError, + }; + + parameter_types! { + TestParachain: u32 = 1000; + pub TestLaneId: LaneId = TEST_LANE_ID; + pub MsgProofsRewardsAccount: RewardsAccountParams = RewardsAccountParams::new( + TEST_LANE_ID, + TEST_BRIDGED_CHAIN_ID, + RewardsAccountOwner::ThisChain, + ); + pub MsgDeliveryProofsRewardsAccount: RewardsAccountParams = RewardsAccountParams::new( + TEST_LANE_ID, + TEST_BRIDGED_CHAIN_ID, + RewardsAccountOwner::BridgedChain, + ); + } + + bp_runtime::generate_static_str_provider!(TestExtension); + + type TestGrandpaExtensionProvider = RefundBridgedGrandpaMessages< + TestRuntime, + (), + RefundableMessagesLane<(), TestLaneId>, + ActualFeeRefund, + ConstU64<1>, + StrTestExtension, + >; + type TestGrandpaExtension = RefundSignedExtensionAdapter; + type TestExtensionProvider = RefundBridgedParachainMessages< + TestRuntime, + DefaultRefundableParachainId<(), TestParachain>, + RefundableMessagesLane<(), TestLaneId>, + ActualFeeRefund, + ConstU64<1>, + StrTestExtension, + >; + type TestExtension = RefundSignedExtensionAdapter; + + fn initial_balance_of_relayer_account_at_this_chain() -> ThisChainBalance { + let test_stake: ThisChainBalance = TestStake::get(); + ExistentialDeposit::get().saturating_add(test_stake * 100) + } + + // in tests, the following accounts are equal (because of how `into_sub_account_truncating` + // works) + + fn delivery_rewards_account() -> ThisChainAccountId { + TestPaymentProcedure::rewards_account(MsgProofsRewardsAccount::get()) + } + + fn confirmation_rewards_account() -> ThisChainAccountId { + TestPaymentProcedure::rewards_account(MsgDeliveryProofsRewardsAccount::get()) + } + + fn relayer_account_at_this_chain() -> ThisChainAccountId { + 0 + } + + fn relayer_account_at_bridged_chain() -> BridgedChainAccountId { + 0 + } + + fn initialize_environment( + best_relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) { + let authorities = test_keyring().into_iter().map(|(a, w)| (a.into(), w)).collect(); + let best_relay_header = HeaderId(best_relay_header_number, RelayBlockHash::default()); + pallet_bridge_grandpa::CurrentAuthoritySet::::put( + StoredAuthoritySet::try_new(authorities, 0).unwrap(), + ); + pallet_bridge_grandpa::BestFinalized::::put(best_relay_header); + + let para_id = ParaId(TestParachain::get()); + let para_info = ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: parachain_head_at_relay_header_number, + head_hash: [parachain_head_at_relay_header_number as u8; 32].into(), + }, + next_imported_hash_position: 0, + }; + pallet_bridge_parachains::ParasInfo::::insert(para_id, para_info); + + let lane_id = TestLaneId::get(); + let in_lane_data = + InboundLaneData { last_confirmed_nonce: best_message, ..Default::default() }; + pallet_bridge_messages::InboundLanes::::insert(lane_id, in_lane_data); + + let out_lane_data = + OutboundLaneData { latest_received_nonce: best_message, ..Default::default() }; + pallet_bridge_messages::OutboundLanes::::insert(lane_id, out_lane_data); + + Balances::mint_into(&delivery_rewards_account(), ExistentialDeposit::get()).unwrap(); + Balances::mint_into(&confirmation_rewards_account(), ExistentialDeposit::get()).unwrap(); + Balances::mint_into( + &relayer_account_at_this_chain(), + initial_balance_of_relayer_account_at_this_chain(), + ) + .unwrap(); + } + + fn submit_relay_header_call(relay_header_number: RelayBlockNumber) -> RuntimeCall { + let relay_header = BridgedChainHeader::new( + relay_header_number, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); + let relay_justification = make_default_justification(&relay_header); + + RuntimeCall::BridgeGrandpa(GrandpaCall::submit_finality_proof { + finality_target: Box::new(relay_header), + justification: relay_justification, + }) + } + + fn submit_parachain_head_call( + parachain_head_at_relay_header_number: RelayBlockNumber, + ) -> RuntimeCall { + RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { + at_relay_block: (parachain_head_at_relay_header_number, RelayBlockHash::default()), + parachains: vec![( + ParaId(TestParachain::get()), + [parachain_head_at_relay_header_number as u8; 32].into(), + )], + parachain_heads_proof: ParaHeadsProof(vec![]), + }) + } + + fn message_delivery_call(best_message: MessageNonce) -> RuntimeCall { + RuntimeCall::BridgeMessages(MessagesCall::receive_messages_proof { + relayer_id_at_bridged_chain: relayer_account_at_bridged_chain(), + proof: FromBridgedChainMessagesProof { + bridged_header_hash: Default::default(), + storage_proof: vec![], + lane: TestLaneId::get(), + nonces_start: pallet_bridge_messages::InboundLanes::::get( + TEST_LANE_ID, + ) + .last_delivered_nonce() + + 1, + nonces_end: best_message, + }, + messages_count: 1, + dispatch_weight: Weight::zero(), + }) + } + + fn message_confirmation_call(best_message: MessageNonce) -> RuntimeCall { + RuntimeCall::BridgeMessages(MessagesCall::receive_messages_delivery_proof { + proof: FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: Default::default(), + storage_proof: vec![], + lane: TestLaneId::get(), + }, + relayers_state: UnrewardedRelayersState { + last_delivered_nonce: best_message, + ..Default::default() + }, + }) + } + + fn parachain_finality_and_delivery_batch_call( + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_delivery_call(best_message), + ], + }) + } + + fn parachain_finality_and_confirmation_batch_call( + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_confirmation_call(best_message), + ], + }) + } + + fn relay_finality_and_delivery_batch_call( + relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call(relay_header_number), + message_delivery_call(best_message), + ], + }) + } + + fn relay_finality_and_confirmation_batch_call( + relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call(relay_header_number), + message_confirmation_call(best_message), + ], + }) + } + + fn all_finality_and_delivery_batch_call( + relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call(relay_header_number), + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_delivery_call(best_message), + ], + }) + } + + fn all_finality_and_confirmation_batch_call( + relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call(relay_header_number), + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_confirmation_call(best_message), + ], + }) + } + + fn all_finality_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::AllFinalityAndMsgs( + SubmitFinalityProofInfo { + block_number: 200, + extra_weight: Weight::zero(), + extra_size: 0, + }, + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), + free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }), + ), + } + } + + fn all_finality_confirmation_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::AllFinalityAndMsgs( + SubmitFinalityProofInfo { + block_number: 200, + extra_weight: Weight::zero(), + extra_size: 0, + }, + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( + BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + )), + ), + } + } + + fn relay_finality_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::RelayFinalityAndMsgs( + SubmitFinalityProofInfo { + block_number: 200, + extra_weight: Weight::zero(), + extra_size: 0, + }, + MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), + free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }), + ), + } + } + + fn relay_finality_confirmation_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::RelayFinalityAndMsgs( + SubmitFinalityProofInfo { + block_number: 200, + extra_weight: Weight::zero(), + extra_size: 0, + }, + MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( + BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + )), + ), + } + } + + fn parachain_finality_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::ParachainFinalityAndMsgs( + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), + free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }), + ), + } + } + + fn parachain_finality_confirmation_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::ParachainFinalityAndMsgs( + SubmitParachainHeadsInfo { + at_relay_block_number: 200, + para_id: ParaId(TestParachain::get()), + para_head_hash: [200u8; 32].into(), + }, + MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( + BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + )), + ), + } + } + + fn delivery_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::Msgs(MessagesCallInfo::ReceiveMessagesProof( + ReceiveMessagesProofInfo { + base: BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }, + unrewarded_relayers: UnrewardedRelayerOccupation { + free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), + free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), + }, + }, + )), + } + } + + fn confirmation_pre_dispatch_data() -> PreDispatchData { + PreDispatchData { + relayer: relayer_account_at_this_chain(), + call_info: CallInfo::Msgs(MessagesCallInfo::ReceiveMessagesDeliveryProof( + ReceiveMessagesDeliveryProofInfo(BaseMessagesProofInfo { + lane_id: TEST_LANE_ID, + bundled_range: 101..=200, + best_stored_nonce: 100, + }), + )), + } + } + + fn set_bundled_range_end( + mut pre_dispatch_data: PreDispatchData, + end: MessageNonce, + ) -> PreDispatchData { + let msg_info = match pre_dispatch_data.call_info { + CallInfo::AllFinalityAndMsgs(_, _, ref mut info) => info, + CallInfo::RelayFinalityAndMsgs(_, ref mut info) => info, + CallInfo::ParachainFinalityAndMsgs(_, ref mut info) => info, + CallInfo::Msgs(ref mut info) => info, + }; + + if let MessagesCallInfo::ReceiveMessagesProof(ref mut msg_info) = msg_info { + msg_info.base.bundled_range = *msg_info.base.bundled_range.start()..=end + } + + pre_dispatch_data + } + + fn run_validate(call: RuntimeCall) -> TransactionValidity { + let extension: TestExtension = + RefundSignedExtensionAdapter(RefundBridgedParachainMessages(PhantomData)); + extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + + fn run_grandpa_validate(call: RuntimeCall) -> TransactionValidity { + let extension: TestGrandpaExtension = + RefundSignedExtensionAdapter(RefundBridgedGrandpaMessages(PhantomData)); + extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + + fn run_validate_ignore_priority(call: RuntimeCall) -> TransactionValidity { + run_validate(call).map(|mut tx| { + tx.priority = 0; + tx + }) + } + + fn run_pre_dispatch( + call: RuntimeCall, + ) -> Result>, TransactionValidityError> { + let extension: TestExtension = + RefundSignedExtensionAdapter(RefundBridgedParachainMessages(PhantomData)); + extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + + fn run_grandpa_pre_dispatch( + call: RuntimeCall, + ) -> Result>, TransactionValidityError> { + let extension: TestGrandpaExtension = + RefundSignedExtensionAdapter(RefundBridgedGrandpaMessages(PhantomData)); + extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) + } + + fn dispatch_info() -> DispatchInfo { + DispatchInfo { + weight: Weight::from_parts( + frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, + 0, + ), + class: frame_support::dispatch::DispatchClass::Normal, + pays_fee: frame_support::dispatch::Pays::Yes, + } + } + + fn post_dispatch_info() -> PostDispatchInfo { + PostDispatchInfo { actual_weight: None, pays_fee: frame_support::dispatch::Pays::Yes } + } + + fn run_post_dispatch( + pre_dispatch_data: Option>, + dispatch_result: DispatchResult, + ) { + let post_dispatch_result = TestExtension::post_dispatch( + Some(pre_dispatch_data), + &dispatch_info(), + &post_dispatch_info(), + 1024, + &dispatch_result, + ); + assert_eq!(post_dispatch_result, Ok(())); + } + + fn expected_delivery_reward() -> ThisChainBalance { + let mut post_dispatch_info = post_dispatch_info(); + let extra_weight = ::WeightInfo::extra_weight_of_successful_receive_messages_proof_call(); + post_dispatch_info.actual_weight = + Some(dispatch_info().weight.saturating_sub(extra_weight)); + pallet_transaction_payment::Pallet::::compute_actual_fee( + 1024, + &dispatch_info(), + &post_dispatch_info, + Zero::zero(), + ) + } + + fn expected_confirmation_reward() -> ThisChainBalance { + pallet_transaction_payment::Pallet::::compute_actual_fee( + 1024, + &dispatch_info(), + &post_dispatch_info(), + Zero::zero(), + ) + } + + #[test] + fn validate_doesnt_boost_transaction_priority_if_relayer_is_not_registered() { + run_test(|| { + initialize_environment(100, 100, 100); + Balances::set_balance(&relayer_account_at_this_chain(), ExistentialDeposit::get()); + + // message delivery is failing + assert_eq!(run_validate(message_delivery_call(200)), Ok(Default::default()),); + assert_eq!( + run_validate(parachain_finality_and_delivery_batch_call(200, 200)), + Ok(Default::default()), + ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(200, 200, 200)), + Ok(Default::default()), + ); + // message confirmation validation is passing + assert_eq!( + run_validate_ignore_priority(message_confirmation_call(200)), + Ok(Default::default()), + ); + assert_eq!( + run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( + 200, 200 + )), + Ok(Default::default()), + ); + assert_eq!( + run_validate_ignore_priority(all_finality_and_confirmation_batch_call( + 200, 200, 200 + )), + Ok(Default::default()), + ); + }); + } + + #[test] + fn validate_boosts_priority_of_message_delivery_transactons() { + run_test(|| { + initialize_environment(100, 100, 100); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + let priority_of_100_messages_delivery = + run_validate(message_delivery_call(200)).unwrap().priority; + let priority_of_200_messages_delivery = + run_validate(message_delivery_call(300)).unwrap().priority; + assert!( + priority_of_200_messages_delivery > priority_of_100_messages_delivery, + "Invalid priorities: {} for 200 messages vs {} for 100 messages", + priority_of_200_messages_delivery, + priority_of_100_messages_delivery, + ); + + let priority_of_100_messages_confirmation = + run_validate(message_confirmation_call(200)).unwrap().priority; + let priority_of_200_messages_confirmation = + run_validate(message_confirmation_call(300)).unwrap().priority; + assert_eq!( + priority_of_100_messages_confirmation, + priority_of_200_messages_confirmation + ); + }); + } + + #[test] + fn validate_does_not_boost_priority_of_message_delivery_transactons_with_too_many_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + let priority_of_max_messages_delivery = run_validate(message_delivery_call( + 100 + MaxUnconfirmedMessagesAtInboundLane::get(), + )) + .unwrap() + .priority; + let priority_of_more_than_max_messages_delivery = run_validate(message_delivery_call( + 100 + MaxUnconfirmedMessagesAtInboundLane::get() + 1, + )) + .unwrap() + .priority; + + assert!( + priority_of_max_messages_delivery > priority_of_more_than_max_messages_delivery, + "Invalid priorities: {} for MAX messages vs {} for MAX+1 messages", + priority_of_max_messages_delivery, + priority_of_more_than_max_messages_delivery, + ); + }); + } + + #[test] + fn validate_allows_non_obsolete_transactions() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_validate_ignore_priority(message_delivery_call(200)), + Ok(ValidTransaction::default()), + ); + assert_eq!( + run_validate_ignore_priority(message_confirmation_call(200)), + Ok(ValidTransaction::default()), + ); + + assert_eq!( + run_validate_ignore_priority(parachain_finality_and_delivery_batch_call(200, 200)), + Ok(ValidTransaction::default()), + ); + assert_eq!( + run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( + 200, 200 + )), + Ok(ValidTransaction::default()), + ); + + assert_eq!( + run_validate_ignore_priority(all_finality_and_delivery_batch_call(200, 200, 200)), + Ok(ValidTransaction::default()), + ); + assert_eq!( + run_validate_ignore_priority(all_finality_and_confirmation_batch_call( + 200, 200, 200 + )), + Ok(ValidTransaction::default()), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_obsolete_relay_chain_header() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(100, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(100, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_obsolete_parachain_head() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(101, 100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(101, 100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(parachain_finality_and_delivery_batch_call(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_obsolete_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_validate(all_finality_and_delivery_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(all_finality_and_confirmation_batch_call(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_validate(parachain_finality_and_delivery_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_validate(parachain_finality_and_confirmation_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_grandpa_finality_proof_when_grandpa_pallet_is_halted() { + run_test(|| { + initialize_environment(100, 100, 100); + + GrandpaPallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Halted, + ) + .unwrap(); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + }); + } + + #[test] + fn ext_rejects_batch_with_parachain_finality_proof_when_parachains_pallet_is_halted() { + run_test(|| { + initialize_environment(100, 100, 100); + + ParachainsPallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Halted, + ) + .unwrap(); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + assert_eq!( + run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + }); + } + + #[test] + fn ext_rejects_transaction_when_messages_pallet_is_halted() { + run_test(|| { + initialize_environment(100, 100, 100); + + MessagesPallet::::set_operating_mode( + RuntimeOrigin::root(), + MessagesOperatingMode::Basic(BasicOperatingMode::Halted), + ) + .unwrap(); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + assert_eq!( + run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + + assert_eq!( + run_pre_dispatch(message_delivery_call(200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + assert_eq!( + run_pre_dispatch(message_confirmation_call(200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); + }); + } + + #[test] + fn pre_dispatch_parses_batch_with_relay_chain_and_parachain_headers() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), + Ok(Some(all_finality_pre_dispatch_data())), + ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), + Ok(Some(all_finality_confirmation_pre_dispatch_data())), + ); + }); + } + + #[test] + fn pre_dispatch_parses_batch_with_parachain_header() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 200)), + Ok(Some(parachain_finality_pre_dispatch_data())), + ); + assert_eq!( + run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 200)), + Ok(Some(parachain_finality_confirmation_pre_dispatch_data())), + ); + }); + } + + #[test] + fn pre_dispatch_fails_to_parse_batch_with_multiple_parachain_headers() { + run_test(|| { + initialize_environment(100, 100, 100); + + let call = RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { + at_relay_block: (100, RelayBlockHash::default()), + parachains: vec![ + (ParaId(TestParachain::get()), [1u8; 32].into()), + (ParaId(TestParachain::get() + 1), [1u8; 32].into()), + ], + parachain_heads_proof: ParaHeadsProof(vec![]), + }), + message_delivery_call(200), + ], + }); + + assert_eq!(run_pre_dispatch(call), Ok(None),); + }); + } + + #[test] + fn pre_dispatch_parses_message_transaction() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_pre_dispatch(message_delivery_call(200)), + Ok(Some(delivery_pre_dispatch_data())), + ); + assert_eq!( + run_pre_dispatch(message_confirmation_call(200)), + Ok(Some(confirmation_pre_dispatch_data())), + ); + }); + } + + #[test] + fn post_dispatch_ignores_unknown_transaction() { + run_test(|| { + assert_storage_noop!(run_post_dispatch(None, Ok(()))); + }); + } + + #[test] + fn post_dispatch_ignores_failed_transaction() { + run_test(|| { + assert_storage_noop!(run_post_dispatch( + Some(all_finality_pre_dispatch_data()), + Err(DispatchError::BadOrigin) + )); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_updated_relay_chain_state() { + run_test(|| { + initialize_environment(100, 200, 200); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_updated_parachain_state() { + run_test(|| { + initialize_environment(200, 100, 200); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_pre_dispatch_data()), + Ok(()) + )); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_delivered_any_messages() { + run_test(|| { + initialize_environment(200, 200, 100); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(()))); + + assert_storage_noop!(run_post_dispatch( + Some(all_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(()))); + }); + } + + #[test] + fn post_dispatch_ignores_transaction_that_has_not_delivered_all_messages() { + run_test(|| { + initialize_environment(200, 200, 150); + + assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(()))); + + assert_storage_noop!(run_post_dispatch( + Some(all_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch( + Some(parachain_finality_confirmation_pre_dispatch_data()), + Ok(()) + )); + assert_storage_noop!(run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(()))); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_all_finality_batch_with_extra_weight() { + run_test(|| { + initialize_environment(200, 200, 200); + + let mut dispatch_info = dispatch_info(); + dispatch_info.weight = Weight::from_parts( + frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND * 2, + 0, + ); + + // without any size/weight refund: we expect regular reward + let pre_dispatch_data = all_finality_pre_dispatch_data(); + let regular_reward = expected_delivery_reward(); + run_post_dispatch(Some(pre_dispatch_data), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(regular_reward), + ); + + // now repeat the same with size+weight refund: we expect smaller reward + let mut pre_dispatch_data = all_finality_pre_dispatch_data(); + match pre_dispatch_data.call_info { + CallInfo::AllFinalityAndMsgs(ref mut info, ..) => { + info.extra_weight.set_ref_time( + frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, + ); + info.extra_size = 32; + }, + _ => unreachable!(), + } + run_post_dispatch(Some(pre_dispatch_data), Ok(())); + let reward_after_two_calls = RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get(), + ) + .unwrap(); + assert!( + reward_after_two_calls < 2 * regular_reward, + "{} must be < 2 * {}", + reward_after_two_calls, + 2 * regular_reward, + ); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_all_finality_batch() { + run_test(|| { + initialize_environment(200, 200, 200); + + run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(expected_delivery_reward()), + ); + + run_post_dispatch(Some(all_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgDeliveryProofsRewardsAccount::get() + ), + Some(expected_confirmation_reward()), + ); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_parachain_finality_batch() { + run_test(|| { + initialize_environment(200, 200, 200); + + run_post_dispatch(Some(parachain_finality_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(expected_delivery_reward()), + ); + + run_post_dispatch(Some(parachain_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgDeliveryProofsRewardsAccount::get() + ), + Some(expected_confirmation_reward()), + ); + }); + } + + #[test] + fn post_dispatch_refunds_relayer_in_message_transaction() { + run_test(|| { + initialize_environment(200, 200, 200); + + run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + Some(expected_delivery_reward()), + ); + + run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(())); + assert_eq!( + RelayersPallet::::relayer_reward( + relayer_account_at_this_chain(), + MsgDeliveryProofsRewardsAccount::get() + ), + Some(expected_confirmation_reward()), + ); + }); + } + + #[test] + fn post_dispatch_slashing_relayer_stake() { + run_test(|| { + initialize_environment(200, 200, 100); + + let delivery_rewards_account_balance = + Balances::free_balance(delivery_rewards_account()); + + let test_stake: ThisChainBalance = TestStake::get(); + Balances::set_balance( + &relayer_account_at_this_chain(), + ExistentialDeposit::get() + test_stake * 10, + ); + + // slashing works for message delivery calls + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); + assert_eq!( + delivery_rewards_account_balance + test_stake, + Balances::free_balance(delivery_rewards_account()) + ); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + run_post_dispatch(Some(parachain_finality_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); + assert_eq!( + delivery_rewards_account_balance + test_stake * 2, + Balances::free_balance(delivery_rewards_account()) + ); + + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); + assert_eq!( + delivery_rewards_account_balance + test_stake * 3, + Balances::free_balance(delivery_rewards_account()) + ); + + // reserve doesn't work for message confirmation calls + let confirmation_rewards_account_balance = + Balances::free_balance(confirmation_rewards_account()); + + Balances::reserve(&relayer_account_at_this_chain(), test_stake).unwrap(); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + assert_eq!( + confirmation_rewards_account_balance, + Balances::free_balance(confirmation_rewards_account()) + ); + run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + run_post_dispatch(Some(parachain_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + run_post_dispatch(Some(all_finality_confirmation_pre_dispatch_data()), Ok(())); + assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); + + // check that unreserve has happened, not slashing + assert_eq!( + delivery_rewards_account_balance + test_stake * 3, + Balances::free_balance(delivery_rewards_account()) + ); + assert_eq!( + confirmation_rewards_account_balance, + Balances::free_balance(confirmation_rewards_account()) + ); + }); + } + + fn run_analyze_call_result( + pre_dispatch_data: PreDispatchData, + dispatch_result: DispatchResult, + ) -> RelayerAccountAction { + TestExtensionProvider::analyze_call_result( + Some(Some(pre_dispatch_data)), + &dispatch_info(), + &post_dispatch_info(), + 1024, + &dispatch_result, + ) + } + + #[test] + fn analyze_call_result_shall_not_slash_for_transactions_with_too_many_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + // the `analyze_call_result` should return slash if number of bundled messages is + // within reasonable limits + assert_eq!( + run_analyze_call_result(all_finality_pre_dispatch_data(), Ok(())), + RelayerAccountAction::Slash( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + ); + assert_eq!( + run_analyze_call_result(parachain_finality_pre_dispatch_data(), Ok(())), + RelayerAccountAction::Slash( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + ); + assert_eq!( + run_analyze_call_result(delivery_pre_dispatch_data(), Ok(())), + RelayerAccountAction::Slash( + relayer_account_at_this_chain(), + MsgProofsRewardsAccount::get() + ), + ); + + // the `analyze_call_result` should not return slash if number of bundled messages is + // larger than the + assert_eq!( + run_analyze_call_result( + set_bundled_range_end(all_finality_pre_dispatch_data(), 1_000_000), + Ok(()) + ), + RelayerAccountAction::None, + ); + assert_eq!( + run_analyze_call_result( + set_bundled_range_end(parachain_finality_pre_dispatch_data(), 1_000_000), + Ok(()) + ), + RelayerAccountAction::None, + ); + assert_eq!( + run_analyze_call_result( + set_bundled_range_end(delivery_pre_dispatch_data(), 1_000_000), + Ok(()) + ), + RelayerAccountAction::None, + ); + }); + } + + #[test] + fn grandpa_ext_only_parses_valid_batches() { + run_test(|| { + initialize_environment(100, 100, 100); + + // relay + parachain + message delivery calls batch is ignored + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_delivery_batch_call(200, 200, 200) + ), + Ok(None), + ); + + // relay + parachain + message confirmation calls batch is ignored + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_confirmation_batch_call(200, 200, 200) + ), + Ok(None), + ); + + // parachain + message delivery call batch is ignored + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + ¶chain_finality_and_delivery_batch_call(200, 200) + ), + Ok(None), + ); + + // parachain + message confirmation call batch is ignored + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + ¶chain_finality_and_confirmation_batch_call(200, 200) + ), + Ok(None), + ); + + // relay + message delivery call batch is accepted + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_delivery_batch_call(200, 200) + ), + Ok(Some(relay_finality_pre_dispatch_data().call_info)), + ); + + // relay + message confirmation call batch is accepted + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_confirmation_batch_call(200, 200) + ), + Ok(Some(relay_finality_confirmation_pre_dispatch_data().call_info)), + ); + + // message delivery call batch is accepted + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &message_delivery_call(200) + ), + Ok(Some(delivery_pre_dispatch_data().call_info)), + ); + + // message confirmation call batch is accepted + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &message_confirmation_call(200) + ), + Ok(Some(confirmation_pre_dispatch_data().call_info)), + ); + }); + } + + #[test] + fn grandpa_ext_rejects_batch_with_obsolete_relay_chain_header() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_grandpa_validate(relay_finality_and_delivery_batch_call(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn grandpa_ext_rejects_calls_with_obsolete_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_confirmation_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_grandpa_validate(relay_finality_and_delivery_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_grandpa_validate(relay_finality_and_confirmation_batch_call(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_grandpa_pre_dispatch(message_delivery_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_grandpa_pre_dispatch(message_confirmation_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + + assert_eq!( + run_grandpa_validate(message_delivery_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + assert_eq!( + run_grandpa_validate(message_confirmation_call(100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); + }); + } + + #[test] + fn grandpa_ext_accepts_calls_with_new_messages() { + run_test(|| { + initialize_environment(100, 100, 100); + + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call(200, 200)), + Ok(Some(relay_finality_pre_dispatch_data()),) + ); + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_confirmation_batch_call(200, 200)), + Ok(Some(relay_finality_confirmation_pre_dispatch_data())), + ); + + assert_eq!( + run_grandpa_validate(relay_finality_and_delivery_batch_call(200, 200)), + Ok(Default::default()), + ); + assert_eq!( + run_grandpa_validate(relay_finality_and_confirmation_batch_call(200, 200)), + Ok(Default::default()), + ); + + assert_eq!( + run_grandpa_pre_dispatch(message_delivery_call(200)), + Ok(Some(delivery_pre_dispatch_data())), + ); + assert_eq!( + run_grandpa_pre_dispatch(message_confirmation_call(200)), + Ok(Some(confirmation_pre_dispatch_data())), + ); + + assert_eq!(run_grandpa_validate(message_delivery_call(200)), Ok(Default::default()),); + assert_eq!( + run_grandpa_validate(message_confirmation_call(200)), + Ok(Default::default()), + ); + }); + } + + #[test] + fn does_not_panic_on_boosting_priority_of_empty_message_delivery_transaction() { + run_test(|| { + let best_delivered_message = MaxUnconfirmedMessagesAtInboundLane::get(); + initialize_environment(100, 100, best_delivered_message); + + // register relayer so it gets priority boost + BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) + .unwrap(); + + // allow empty message delivery transactions + let lane_id = TestLaneId::get(); + let in_lane_data = InboundLaneData { + last_confirmed_nonce: 0, + relayers: vec![UnrewardedRelayer { + relayer: relayer_account_at_bridged_chain(), + messages: DeliveredMessages { begin: 1, end: best_delivered_message }, + }] + .into(), + }; + pallet_bridge_messages::InboundLanes::::insert(lane_id, in_lane_data); + + // now check that the priority of empty tx is the same as priority of 1-message tx + let priority_of_zero_messages_delivery = + run_validate(message_delivery_call(best_delivered_message)).unwrap().priority; + let priority_of_one_messages_delivery = + run_validate(message_delivery_call(best_delivered_message + 1)) + .unwrap() + .priority; + + assert_eq!(priority_of_zero_messages_delivery, priority_of_one_messages_delivery); + }); + } +} diff --git a/ci.Dockerfile b/ci.Dockerfile new file mode 100644 index 000000000000..b419f6be54d2 --- /dev/null +++ b/ci.Dockerfile @@ -0,0 +1,53 @@ +# This file is a "runtime" part from a builder-pattern in Dockerfile, it's used in CI. +# The only different part is that the compilation happens externally, +# so COPY has a different source. +FROM docker.io/library/ubuntu:20.04 + +# show backtraces +ENV RUST_BACKTRACE 1 +ENV DEBIAN_FRONTEND=noninteractive + +RUN set -eux; \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + curl ca-certificates libssl-dev && \ + update-ca-certificates && \ + groupadd -g 1000 user && \ + useradd -u 1000 -g user -s /bin/sh -m user && \ + # apt clean up + apt-get autoremove -y && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# switch to non-root user +USER user + +WORKDIR /home/user + +ARG PROJECT=substrate-relay + +COPY --chown=user:user ./${PROJECT} ./ +COPY --chown=user:user ./bridge-entrypoint.sh ./ + +# check if executable works in this container +RUN ./${PROJECT} --version + +ENV PROJECT=$PROJECT +ENTRYPOINT ["/home/user/bridge-entrypoint.sh"] + +# metadata +ARG VCS_REF=master +ARG BUILD_DATE="" +ARG VERSION="" + +LABEL org.opencontainers.image.title="${PROJECT}" \ + org.opencontainers.image.description="${PROJECT} - component of Parity Bridges Common" \ + org.opencontainers.image.source="https://github.com/paritytech/parity-bridges-common/blob/${VCS_REF}/ci.Dockerfile" \ + org.opencontainers.image.url="https://github.com/paritytech/parity-bridges-common/blob/${VCS_REF}/ci.Dockerfile" \ + org.opencontainers.image.documentation="https://github.com/paritytech/parity-bridges-common/blob/${VCS_REF}/README.md" \ + org.opencontainers.image.created="${BUILD_DATE}" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.revision="${VCS_REF}" \ + org.opencontainers.image.authors="devops-team@parity.io" \ + org.opencontainers.image.vendor="Parity Technologies" \ + org.opencontainers.image.licenses="GPL-3.0 License" diff --git a/cumulus/.cargo/config.toml b/cumulus/.cargo/config.toml deleted file mode 100644 index 4796a2c26965..000000000000 --- a/cumulus/.cargo/config.toml +++ /dev/null @@ -1,33 +0,0 @@ -# -# An auto defined `clippy` feature was introduced, -# but it was found to clash with user defined features, -# so was renamed to `cargo-clippy`. -# -# If you want standard clippy run: -# RUSTFLAGS= cargo clippy -[target.'cfg(feature = "cargo-clippy")'] -rustflags = [ - "-Aclippy::all", - "-Dclippy::correctness", - "-Aclippy::if-same-then-else", - "-Aclippy::clone-double-ref", - "-Dclippy::complexity", - "-Aclippy::zero-prefixed-literal", # 00_1000_000 - "-Aclippy::type_complexity", # raison d'etre - "-Aclippy::nonminimal-bool", # maybe - "-Aclippy::borrowed-box", # Reasonable to fix this one - "-Aclippy::too-many-arguments", # (Turning this on would lead to) - "-Aclippy::unnecessary_cast", # Types may change - "-Aclippy::identity-op", # One case where we do 0 + - "-Aclippy::useless_conversion", # Types may change - "-Aclippy::unit_arg", # styalistic. - "-Aclippy::option-map-unit-fn", # styalistic - "-Aclippy::bind_instead_of_map", # styalistic - "-Aclippy::erasing_op", # E.g. 0 * DOLLARS - "-Aclippy::eq_op", # In tests we test equality. - "-Aclippy::while_immutable_condition", # false positives - "-Aclippy::needless_option_as_deref", # false positives - "-Aclippy::derivable_impls", # false positives - "-Aclippy::stable_sort_primitive", # prefer stable sort - "-Aclippy::extra-unused-type-parameters", # stylistic -] diff --git a/cumulus/.dockerignore b/cumulus/.dockerignore deleted file mode 100644 index e03824c3bbf4..000000000000 --- a/cumulus/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -.git -**/target/ -**/*.txt -**/*.md -/docker/ -!/target/release-artifacts/**/* - -# dotfiles in the repo root -/.* diff --git a/cumulus/.editorconfig b/cumulus/.editorconfig deleted file mode 100644 index e8ff2027ca4e..000000000000 --- a/cumulus/.editorconfig +++ /dev/null @@ -1,29 +0,0 @@ -root = true -[*] -indent_style=tab -indent_size=tab -tab_width=4 -end_of_line=lf -charset=utf-8 -trim_trailing_whitespace=true -max_line_length=100 -insert_final_newline=true - -[*.yml] -indent_style=space -indent_size=2 -tab_width=8 -end_of_line=lf - -[*.sh] -indent_style=space -indent_size=4 -tab_width=8 -end_of_line=lf - -[*.json] -indent_style=space -indent_size=2 -tab_width=8 -end_of_line=lf - diff --git a/cumulus/.gitattributes b/cumulus/.gitattributes deleted file mode 100644 index 2ea1ab2d6b9c..000000000000 --- a/cumulus/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -/.gitlab-ci.yml filter=ci-prettier -/scripts/ci/gitlab/pipeline/*.yml filter=ci-prettier diff --git a/cumulus/.github/ISSUE_TEMPLATE/blank.md b/cumulus/.github/ISSUE_TEMPLATE/blank.md deleted file mode 100644 index 2a9137e72802..000000000000 --- a/cumulus/.github/ISSUE_TEMPLATE/blank.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -name: New blank issue -about: New blank issue ---- diff --git a/cumulus/.github/ISSUE_TEMPLATE/release-client.md b/cumulus/.github/ISSUE_TEMPLATE/release-client.md deleted file mode 100644 index bb7f20615767..000000000000 --- a/cumulus/.github/ISSUE_TEMPLATE/release-client.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Release Checklist for Client -about: Release Checklist for Client -title: Release Checklist for Client {{ env.VERSION }} ---- - -# Release Checklist - Client - -### Client Release - -- [ ] build a new `polkadot-parachain` binary and publish it to S3 -- [ ] new `polkadot-parachain` version has [run on the network](../../docs/release.md#burnin) - without issue for at least 12h -- [ ] a draft release has been created in the [Github Releases page](https://github.com/paritytech/cumulus/releases) with the relevant release-notes -- [ ] the [build artifacts](../../docs/release.md#build-artifacts) have been added to the - draft-release. - ---- - -Read more about the [release documentation](../../docs/release.md). diff --git a/cumulus/.github/ISSUE_TEMPLATE/release-runtime.md b/cumulus/.github/ISSUE_TEMPLATE/release-runtime.md deleted file mode 100644 index 0f3543759afd..000000000000 --- a/cumulus/.github/ISSUE_TEMPLATE/release-runtime.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -name: Release Checklist for Runtime -about: Release Checklist for Runtime -title: Release Checklist for Runtime {{ env.VERSION }} ---- - -# Release Checklist - Runtimes - -**All** following checks must be completed before publishing a new release. -The release process is owned and led by @paritytech/release-engineering team. -The checks marked with :crab: are meant to be checked by [a runtime engineer](https://github.com/paritytech/cumulus/issues/1761). - -## Runtimes Release - -### Codebase -These checks should be performed on the codebase. - -- [ ] the [`spec_version`](https://github.com/paritytech/cumulus/blob/master/docs/release.md#spec-version) has been incremented since the - last release for any native runtimes from any existing use on public (non-private/test) networks -- [ ] :crab: previously [completed migrations](https://github.com/paritytech/cumulus/blob/master/docs/release.md#old-migrations-removed) are removed for any public (non-private/test) networks -- [ ] pallet and [extrinsic ordering](https://github.com/paritytech/cumulus/blob/master/docs/release.md#extrinsic-ordering--storage) as well as `SignedExtension`s have stayed - the same. Bump `transaction_version` otherwise -- [ ] the [benchmarks](https://github.com/paritytech/ci_cd/wiki/Benchmarks:-cumulus) ran -- [ ] the weights have been updated for any modified runtime logic -- [ ] :crab: the new weights are sane, there are no significant (>50%) drops or rises with no reason -- [ ] :crab: XCM config is compatible with the configurations and versions of relevant interlocutors, like the Relay Chain. - -### On the release branch - -The following checks can be performed after we have forked off to the release-candidate branch or started an additional release candidate branch (rc-2, rc-3, etc) - -- [ ] Verify [new migrations](https://github.com/paritytech/cumulus/blob/master/docs/release.md#new-migrations) complete successfully, and the - runtime state is correctly updated for any public (non-private/test) - networks -- [ ] Run [integration tests](https://github.com/paritytech/cumulus/blob/master/docs/release.md#integration-tests), and make sure they pass. -- [ ] Push runtime upgrade to Asset Hub Westend and verify network stability -- [ ] Push runtime upgrade to Collectives and verify network stability -- [ ] Push runtime upgrade to Bridge-Hub-Kusama and verify network stability - - -### Github - -- [ ] Check that a draft release has been created at the [Github Releases page](https://github.com/paritytech/cumulus/releases) with relevant [release - notes](https://github.com/paritytech/cumulus/blob/master/docs/release.md#release-notes) -- [ ] Check that [build artifacts](https://github.com/paritytech/cumulus/blob/master/docs/release.md#build-artifacts) have been added to the - draft-release. - -# Post release - -- [ ] :crab: all commits (runtime version bumps, fixes) on this release branch have been merged back to master. - ---- - -Read more about the [release documentation](https://github.com/paritytech/cumulus/blob/master/docs/release.md). diff --git a/cumulus/.github/dependabot.yml b/cumulus/.github/dependabot.yml deleted file mode 100644 index 349a34690d4e..000000000000 --- a/cumulus/.github/dependabot.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "cargo" - directory: "/" - labels: ["A2-insubstantial", "B0-silent", "C1-low"] - # Handle updates for crates from github.com/paritytech/substrate manually. - ignore: - - dependency-name: "substrate-*" - - dependency-name: "sc-*" - - dependency-name: "sp-*" - - dependency-name: "frame-*" - - dependency-name: "fork-tree" - - dependency-name: "frame-remote-externalities" - - dependency-name: "pallet-*" - - dependency-name: "beefy-*" - - dependency-name: "try-runtime-*" - - dependency-name: "test-runner" - - dependency-name: "generate-bags" - - dependency-name: "sub-tokens" - - dependency-name: "polkadot-*" - - dependency-name: "xcm*" - - dependency-name: "kusama-*" - - dependency-name: "westend-*" - - dependency-name: "rococo-*" - schedule: - interval: "daily" - - package-ecosystem: github-actions - directory: '/' - labels: ["A2-insubstantial", "B0-silent", "C1-low", "E2-dependencies"] - schedule: - interval: daily diff --git a/cumulus/.github/pr-custom-review.yml b/cumulus/.github/pr-custom-review.yml deleted file mode 100644 index fc26ee677f06..000000000000 --- a/cumulus/.github/pr-custom-review.yml +++ /dev/null @@ -1,48 +0,0 @@ -# 🔒 PROTECTED: Changes to locks-review-team should be approved by the current locks-review-team -locks-review-team: cumulus-locks-review -team-leads-team: polkadot-review -action-review-team: ci - -rules: - - name: Runtime files - check_type: changed_files - condition: ^parachains/runtimes/assets/(asset-hub-kusama|asset-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/bridge-hubs/(bridge-hub-kusama|bridge-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/collectives/collectives-polkadot/src/[^/]+\.rs$|^parachains/common/src/[^/]+\.rs$ - all_distinct: - - min_approvals: 1 - teams: - - cumulus-locks-review - - min_approvals: 1 - teams: - - polkadot-review - - - name: Core developers - check_type: changed_files - condition: - include: .* - # excluding files from 'Runtime files' and 'CI files' rules and `Bridges subtree files` - exclude: ^parachains/runtimes/assets/(asset-hub-kusama|asset-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/bridge-hubs/(bridge-hub-kusama|bridge-hub-polkadot)/src/[^/]+\.rs$|^parachains/runtimes/collectives/collectives-polkadot/src/[^/]+\.rs$|^parachains/common/src/[^/]+\.rs$|^\.gitlab-ci\.yml|^scripts/ci/.*|^\.github/.* - min_approvals: 2 - teams: - - core-devs - - # if there are any changes in the bridges subtree (in case of backport changes back to bridges repo) - - name: Bridges subtree files - check_type: changed_files - condition: ^bridges/.* - min_approvals: 1 - teams: - - bridges-core - - - name: CI files - check_type: changed_files - condition: - include: ^\.gitlab-ci\.yml|^scripts/ci/.*|^\.github/.* - exclude: ^scripts/ci/gitlab/pipeline/zombienet.yml$ - min_approvals: 2 - teams: - - ci - - release-engineering - -prevent-review-request: - teams: - - core-devs diff --git a/cumulus/.github/workflows/check-D-labels.yml b/cumulus/.github/workflows/check-D-labels.yml deleted file mode 100644 index 910627209310..000000000000 --- a/cumulus/.github/workflows/check-D-labels.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Check D labels - -on: - pull_request: - types: [labeled, opened, synchronize, unlabeled] - paths: - - primitives/** - -jobs: - check-labels: - runs-on: ubuntu-latest - steps: - - name: Pull image - env: - IMAGE: paritytech/ruled_labels:0.4.0 - run: docker pull $IMAGE - - - name: Check labels - env: - IMAGE: paritytech/ruled_labels:0.4.0 - MOUNT: /work - GITHUB_PR: ${{ github.event.pull_request.number }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - API_BASE: https://api.github.com/repos - REPO: ${{ github.repository }} - RULES_PATH: labels/ruled_labels - CHECK_SPECS: specs_cumulus.yaml - run: | - echo "REPO: ${REPO}" - echo "GITHUB_PR: ${GITHUB_PR}" - # Clone repo with labels specs - git clone https://github.com/paritytech/labels - # Fetch the labels for the PR under test - labels=$( curl -H "Authorization: token ${GITHUB_TOKEN}" -s "$API_BASE/${REPO}/pulls/${GITHUB_PR}" | jq '.labels | .[] | .name' | tr "\n" ",") - - if [ -z "${labels}" ]; then - docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --tags audit --no-label - fi - - labels_args=${labels: :-1} - printf "Checking labels: %s\n" "${labels_args}" - - # Prevent the shell from splitting labels with spaces - IFS="," - - # --dev is more useful to debug mode to debug - docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --labels ${labels_args} --dev --tags audit diff --git a/cumulus/.github/workflows/check-labels.yml b/cumulus/.github/workflows/check-labels.yml deleted file mode 100644 index 004271d7788a..000000000000 --- a/cumulus/.github/workflows/check-labels.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Check labels - -on: - pull_request: - types: [labeled, opened, synchronize, unlabeled] - -jobs: - check-labels: - runs-on: ubuntu-latest - steps: - - name: Pull image - env: - IMAGE: paritytech/ruled_labels:0.4.0 - run: docker pull $IMAGE - - - name: Check labels - env: - IMAGE: paritytech/ruled_labels:0.4.0 - MOUNT: /work - GITHUB_PR: ${{ github.event.pull_request.number }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - API_BASE: https://api.github.com/repos - REPO: ${{ github.repository }} - RULES_PATH: labels/ruled_labels - CHECK_SPECS: specs_cumulus.yaml - run: | - echo "REPO: ${REPO}" - echo "GITHUB_PR: ${GITHUB_PR}" - # Clone repo with labels specs - git clone https://github.com/paritytech/labels - # Fetch the labels for the PR under test - labels=$( curl -H "Authorization: token ${GITHUB_TOKEN}" -s "$API_BASE/${REPO}/pulls/${GITHUB_PR}" | jq '.labels | .[] | .name' | tr "\n" ",") - - if [ -z "${labels}" ]; then - docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --tags audit --no-label - fi - - labels_args=${labels: :-1} - printf "Checking labels: %s\n" "${labels_args}" - - # Prevent the shell from splitting labels with spaces - IFS="," - - # --dev is more useful to debug mode to debug - docker run --rm -i -v $PWD/${RULES_PATH}/:$MOUNT $IMAGE check $MOUNT/$CHECK_SPECS --labels ${labels_args} --dev --tags PR diff --git a/cumulus/.github/workflows/docs.yml b/cumulus/.github/workflows/docs.yml deleted file mode 100644 index 70aef69e1cc0..000000000000 --- a/cumulus/.github/workflows/docs.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Publish Rust Docs - -on: - push: - branches: - - master - -jobs: - deploy-docs: - name: Deploy docs - runs-on: ubuntu-latest - - steps: - - name: Install tooling - run: | - sudo apt-get install -y protobuf-compiler - protoc --version - - - name: Checkout repository - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Rust versions - run: rustup show - - - name: Rust cache - uses: Swatinem/rust-cache@578b235f6e5f613f7727f1c17bd3305b4d4d4e1f # v2.6.1 - - - name: Build rustdocs - run: SKIP_WASM_BUILD=1 cargo doc --all --no-deps - - - name: Make index.html - run: echo "" > ./target/doc/index.html - - - name: Deploy documentation - uses: peaceiris/actions-gh-pages@373f7f263a76c20808c831209c920827a82a2847 # v3.9.3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_branch: gh-pages - publish_dir: ./target/doc diff --git a/cumulus/.github/workflows/fmt-check.yml b/cumulus/.github/workflows/fmt-check.yml deleted file mode 100644 index 7571c51116be..000000000000 --- a/cumulus/.github/workflows/fmt-check.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Rustfmt check - -on: - push: - branches: - - master - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - -jobs: - quick_check: - strategy: - matrix: - os: ["ubuntu-latest"] - runs-on: ${{ matrix.os }} - container: - image: paritytech/ci-linux:production - steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Cargo fmt - run: cargo +nightly fmt --all -- --check diff --git a/cumulus/.github/workflows/pr-custom-review.yml b/cumulus/.github/workflows/pr-custom-review.yml deleted file mode 100644 index 8e40c9ee7298..000000000000 --- a/cumulus/.github/workflows/pr-custom-review.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Assign reviewers - -on: - pull_request: - branches: - - master - - main - types: - - opened - - reopened - - synchronize - - review_requested - - review_request_removed - - ready_for_review - - converted_to_draft - pull_request_review: - -jobs: - pr-custom-review: - runs-on: ubuntu-latest - steps: - - name: Skip if pull request is in Draft - # `if: github.event.pull_request.draft == true` should be kept here, at - # the step level, rather than at the job level. The latter is not - # recommended because when the PR is moved from "Draft" to "Ready to - # review" the workflow will immediately be passing (since it was skipped), - # even though it hasn't actually ran, since it takes a few seconds for - # the workflow to start. This is also disclosed in: - # https://github.community/t/dont-run-actions-on-draft-pull-requests/16817/17 - # That scenario would open an opportunity for the check to be bypassed: - # 1. Get your PR approved - # 2. Move it to Draft - # 3. Push whatever commits you want - # 4. Move it to "Ready for review"; now the workflow is passing (it was - # skipped) and "Check reviews" is also passing (it won't be updated - # until the workflow is finished) - if: github.event.pull_request.draft == true - run: exit 1 - - name: pr-custom-review - uses: paritytech/pr-custom-review@action-v3 - with: - checks-reviews-api: http://pcr.parity-prod.parity.io/api/v1/check_reviews diff --git a/cumulus/.github/workflows/release-01_branch-check.yml b/cumulus/.github/workflows/release-01_branch-check.yml deleted file mode 100644 index afcd4580f176..000000000000 --- a/cumulus/.github/workflows/release-01_branch-check.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Release branch check -on: - push: - branches: - - release-**v[0-9]+.[0-9]+.[0-9]+ # client - - release-**v[0-9]+ # runtimes - - polkadot-v[0-9]+.[0-9]+.[0-9]+ # cumulus code - - workflow_dispatch: - -jobs: - check_branch: - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - fetch-depth: 0 - - - name: Run check - shell: bash - run: ./scripts/ci/github/check-rel-br diff --git a/cumulus/.github/workflows/release-10_rc-automation.yml b/cumulus/.github/workflows/release-10_rc-automation.yml deleted file mode 100644 index d1795faef096..000000000000 --- a/cumulus/.github/workflows/release-10_rc-automation.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: Release - RC automation -on: - push: - branches: - - release-v[0-9]+.[0-9]+.[0-9]+ - - release-parachains-v[0-9]+ - workflow_dispatch: - -jobs: - tag_rc: - runs-on: ubuntu-latest - strategy: - matrix: - channel: - - name: 'RelEng: Cumulus Release Coordination' - room: '!NAEMyPAHWOiOQHsvus:parity.io' - pre-releases: true - steps: - - name: Checkout sources - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - fetch-depth: 0 - - id: compute_tag - name: Compute next rc tag - shell: bash - run: | - # Get last rc tag if exists, else set it to {version}-rc1 - version=${GITHUB_REF#refs/heads/release-} - echo "$version" - echo "version=$version" >> $GITHUB_OUTPUT - git tag -l - last_rc=$(git tag -l "$version-rc*" | sort -V | tail -n 1) - if [ -n "$last_rc" ]; then - suffix=$(echo "$last_rc" | grep -Eo '[0-9]+$') - echo $suffix - ((suffix++)) - echo $suffix - echo "new_tag=$version-rc$suffix" >> $GITHUB_OUTPUT - echo "first_rc=false" >> $GITHUB_OUTPUT - else - echo "new_tag=$version-rc1" >> $GITHUB_OUTPUT - echo "first_rc=true" >> $GITHUB_OUTPUT - fi - - - name: Apply new tag - uses: tvdias/github-tagger@ed7350546e3e503b5e942dffd65bc8751a95e49d # v0.0.2 - with: - # We can't use the normal GITHUB_TOKEN for the following reason: - # https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token - # RELEASE_BRANCH_TOKEN requires public_repo OAuth scope - repo-token: "${{ secrets.RELEASE_BRANCH_TOKEN }}" - tag: ${{ steps.compute_tag.outputs.new_tag }} - - - id: create-issue-checklist-client - uses: JasonEtco/create-an-issue@e27dddc79c92bc6e4562f268fffa5ed752639abd # v2.9.1 - # Only create the issue if it's the first release candidate - if: steps.compute_tag.outputs.first_rc == 'true' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - VERSION: ${{ steps.compute_tag.outputs.version }} - with: - assignees: EgorPopelyaev, coderobe, chevdor - filename: .github/ISSUE_TEMPLATE/release-client.md - - - id: create-issue-checklist-runtime - uses: JasonEtco/create-an-issue@e27dddc79c92bc6e4562f268fffa5ed752639abd # v2.9.1 - # Only create the issue if it's the first release candidate - if: steps.compute_tag.outputs.first_rc == 'true' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - VERSION: ${{ steps.compute_tag.outputs.version }} - with: - assignees: EgorPopelyaev, coderobe, chevdor - filename: .github/ISSUE_TEMPLATE/release-runtime.md - - - name: Matrix notification to ${{ matrix.channel.name }} - uses: s3krit/matrix-message-action@70ad3fb812ee0e45ff8999d6af11cafad11a6ecf # v0.0.3 - if: steps.create-issue-checklist-client.outputs.url != '' && steps.create-issue-checklist-runtime.outputs.url != '' - with: - room_id: ${{ matrix.channel.room }} - access_token: ${{ secrets.RELEASENOTES_MATRIX_V2_ACCESS_TOKEN }} - server: "m.parity.io" - message: | - The Release Process for Cumulus ${{ steps.compute_tag.outputs.version }} has been started.
- Tracking issues: - - client: ${{ steps.create-issue-checklist-client.outputs.url }}" - - runtime: ${{ steps.create-issue-checklist-runtime.outputs.url }}" diff --git a/cumulus/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml b/cumulus/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml deleted file mode 100644 index d902e57ac9e7..000000000000 --- a/cumulus/.github/workflows/release-20_extrinsic-ordering-check-from-bin.yml +++ /dev/null @@ -1,86 +0,0 @@ -# This workflow performs the Extrinsic Ordering Check on demand using a binary - -name: Release - Extrinsic Ordering Check from Binary -on: - workflow_dispatch: - inputs: - reference_url: - description: The WebSocket url of the reference node - default: wss://kusama-asset-hub-rpc.polkadot.io - required: true - binary_url: - description: A url to a Linux binary for the node containing the runtime to test - default: https://releases.parity.io/cumulus/polkadot-v0.9.21/polkadot-parachain - required: true - chain: - description: The name of the chain under test. Usually, you would pass a local chain - default: asset-hub-kusama-local - required: true - -jobs: - check: - name: Run check - runs-on: ubuntu-latest - env: - CHAIN: ${{github.event.inputs.chain}} - BIN: node-bin - BIN_PATH: ./tmp/$BIN - BIN_URL: ${{github.event.inputs.binary_url}} - REF_URL: ${{github.event.inputs.reference_url}} - - steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Fetch binary - run: | - echo Creating a temp dir to download and run binary - mkdir -p tmp - echo Fetching $BIN_URL - wget $BIN_URL -O $BIN_PATH - chmod a+x $BIN_PATH - $BIN_PATH --version - - - name: Start local node - run: | - echo Running on $CHAIN - $BIN_PATH --chain=$CHAIN -- --chain polkadot-local & - - - name: Prepare output - run: | - VERSION=$($BIN_PATH --version) - echo "Metadata comparison:" >> output.txt - echo "Date: $(date)" >> output.txt - echo "Reference: $REF_URL" >> output.txt - echo "Target version: $VERSION" >> output.txt - echo "Chain: $CHAIN" >> output.txt - echo "----------------------------------------------------------------------" >> output.txt - - - name: Pull polkadot-js-tools image - run: docker pull jacogr/polkadot-js-tools - - - name: Compare the metadata - run: | - CMD="docker run --pull always --network host jacogr/polkadot-js-tools metadata $REF_URL ws://localhost:9944" - echo -e "Running:\n$CMD" - $CMD >> output.txt - sed -z -i 's/\n\n/\n/g' output.txt - cat output.txt | egrep -n -i '' - SUMMARY=$(./scripts/ci/github/extrinsic-ordering-filter.sh output.txt) - echo -e $SUMMARY - echo -e $SUMMARY >> output.txt - - - name: Show result - run: | - cat output.txt - - - name: Stop our local node - run: | - pkill $BIN - continue-on-error: true - - - name: Save output as artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: ${{ env.CHAIN }} - path: | - output.txt diff --git a/cumulus/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml b/cumulus/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml deleted file mode 100644 index 93c0050ff6f2..000000000000 --- a/cumulus/.github/workflows/release-21_extrinsic-ordering-check-from-two.yml +++ /dev/null @@ -1,120 +0,0 @@ -# This workflow performs the Extrinsic Ordering Check on demand using two reference binaries - -name: Release - Extrinsic API Check with reference bins -on: - workflow_dispatch: - inputs: - reference_binary_url: - description: A url to a Linux binary for the node containing the reference runtime to test against - default: https://releases.parity.io/cumulus/v0.9.230/polkadot-parachain - required: true - binary_url: - description: A url to a Linux binary for the node containing the runtime to test - default: https://releases.parity.io/cumulus/v0.9.270-rc7/polkadot-parachain - required: true - -jobs: - check: - name: Run check - runs-on: ubuntu-latest - timeout-minutes: 10 - env: - REF_URL: ${{github.event.inputs.reference_binary_url}} - BIN_REF: polkadot-parachain-ref - BIN_URL: ${{github.event.inputs.binary_url}} - BIN_BASE: polkadot-parachain - TMP: ./tmp - strategy: - fail-fast: false - matrix: - include: - - runtime: asset-hub-kusama - local: asset-hub-kusama-local - relay: kusama-local - - runtime: asset-hub-polkadot - local: asset-hub-polkadot-local - relay: polkadot-local - - runtime: asset-hub-westend - local: asset-hub-westend-local - relay: polkadot-local - - runtime: contracts-rococo - local: contracts-rococo-local - relay: polkadot-local - - steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - - name: Create tmp dir - run: | - mkdir -p $TMP - pwd - - - name: Fetch reference binary for ${{ matrix.runtime }} - run: | - echo Fetching $REF_URL - curl $REF_URL -o $TMP/$BIN_REF - chmod a+x $TMP/$BIN_REF - $TMP/$BIN_REF --version - - - name: Fetch test binary for ${{ matrix.runtime }} - run: | - echo Fetching $BIN_URL - curl $BIN_URL -o $TMP/$BIN_BASE - chmod a+x $TMP/$BIN_BASE - $TMP/$BIN_BASE --version - - - name: Start local reference node for ${{ matrix.runtime }} - run: | - echo Running reference on ${{ matrix.local }} - $TMP/$BIN_REF --chain=${{ matrix.local }} --ws-port=9954 --tmp -- --chain ${{ matrix.relay }} & - sleep 15 - - - name: Start local test node for ${{ matrix.runtime }} - run: | - echo Running test on ${{ matrix.local }} - $TMP/$BIN_BASE --chain=${{ matrix.local }} --ws-port=9944 --tmp -- --chain ${{ matrix.relay }} & - sleep 15 - - - name: Prepare output - run: | - REF_VERSION=$($TMP/$BIN_REF --version) - BIN_VERSION=$($TMP/$BIN_BASE --version) - echo "Metadata comparison:" >> output.txt - echo "Date: $(date)" >> output.txt - echo "Ref. binary: $REF_URL" >> output.txt - echo "Test binary: $BIN_URL" >> output.txt - echo "Ref. version: $REF_VERSION" >> output.txt - echo "Test version: $BIN_VERSION" >> output.txt - echo "Chain: ${{ matrix.local }}" >> output.txt - echo "Relay: ${{ matrix.relay }}" >> output.txt - echo "----------------------------------------------------------------------" >> output.txt - - - name: Pull polkadot-js-tools image - run: docker pull jacogr/polkadot-js-tools - - - name: Compare the metadata - run: | - CMD="docker run --pull always --network host jacogr/polkadot-js-tools metadata ws://localhost:9954 ws://localhost:9944" - echo -e "Running:\n$CMD" - $CMD >> output.txt - sed -z -i 's/\n\n/\n/g' output.txt - cat output.txt | egrep -n -i '' - SUMMARY=$(./scripts/ci/github/extrinsic-ordering-filter.sh output.txt) - echo -e $SUMMARY - echo -e $SUMMARY >> output.txt - - - name: Show result - run: | - cat output.txt - - - name: Save output as artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: ${{ matrix.runtime }} - path: | - output.txt - - - name: Stop our local nodes - run: | - pkill $BIN_REF || true - pkill $BIN_BASE || true diff --git a/cumulus/.github/workflows/release-30_create-draft.yml b/cumulus/.github/workflows/release-30_create-draft.yml deleted file mode 100644 index 2d11dfe18cec..000000000000 --- a/cumulus/.github/workflows/release-30_create-draft.yml +++ /dev/null @@ -1,311 +0,0 @@ -name: Release - Create draft - -on: - workflow_dispatch: - inputs: - ref1: - description: The 'from' tag to use for the diff - default: parachains-v9.0.0 - required: true - ref2: - description: The 'to' tag to use for the diff - default: release-parachains-v10.0.0 - required: true - release_type: - description: Pass "client" for client releases, leave empty otherwise - required: false - pre_release: - description: For pre-releases - default: "true" - required: true - notification: - description: Whether or not to notify over Matrix - default: "true" - required: true - -jobs: - get-rust-versions: - runs-on: ubuntu-latest - container: - image: paritytech/ci-linux:production - outputs: - rustc-stable: ${{ steps.get-rust-versions.outputs.stable }} - rustc-nightly: ${{ steps.get-rust-versions.outputs.nightly }} - steps: - - id: get-rust-versions - run: | - echo "stable=$(rustc +stable --version)" >> $GITHUB_OUTPUT - echo "nightly=$(rustc +nightly --version)" >> $GITHUB_OUTPUT - - # We do not skip the entire job for client builds (although we don't need it) - # because it is a dep of the next job. However we skip the time consuming steps. - build-runtimes: - runs-on: ubuntu-latest - strategy: - matrix: - include: - - category: assets - runtime: asset-hub-kusama - - category: assets - runtime: asset-hub-polkadot - - category: assets - runtime: asset-hub-westend - - category: bridge-hubs - runtime: bridge-hub-polkadot - - category: bridge-hubs - runtime: bridge-hub-kusama - - category: bridge-hubs - runtime: bridge-hub-rococo - - category: collectives - runtime: collectives-polkadot - - category: contracts - runtime: contracts-rococo - - category: starters - runtime: seedling - - category: starters - runtime: shell - - category: testing - runtime: rococo-parachain - steps: - - name: Checkout sources - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - ref: ${{ github.event.inputs.ref2 }} - - - name: Cache target dir - if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 - with: - path: "${{ github.workspace }}/runtime/${{ matrix.runtime }}/target" - key: srtool-target-${{ matrix.runtime }}-${{ github.sha }} - restore-keys: | - srtool-target-${{ matrix.runtime }}- - srtool-target- - - - name: Build ${{ matrix.runtime }} runtime - if: ${{ github.event.inputs.release_type != 'client' }} - id: srtool_build - uses: chevdor/srtool-actions@v0.7.0 - with: - image: paritytech/srtool - chain: ${{ matrix.runtime }} - runtime_dir: parachains/runtimes/${{ matrix.category }}/${{ matrix.runtime }} - - - name: Store srtool digest to disk - if: ${{ github.event.inputs.release_type != 'client' }} - run: | - echo '${{ steps.srtool_build.outputs.json }}' | \ - jq > ${{ matrix.runtime }}-srtool-digest.json - - - name: Upload ${{ matrix.runtime }} srtool json - if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: ${{ matrix.runtime }}-srtool-json - path: ${{ matrix.runtime }}-srtool-digest.json - - - name: Upload ${{ matrix.runtime }} runtime - if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: ${{ matrix.runtime }}-runtime - path: | - ${{ steps.srtool_build.outputs.wasm_compressed }} - - publish-draft-release: - runs-on: ubuntu-latest - needs: ["get-rust-versions", "build-runtimes"] - outputs: - release_url: ${{ steps.create-release.outputs.html_url }} - asset_upload_url: ${{ steps.create-release.outputs.upload_url }} - steps: - - name: Checkout sources - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - fetch-depth: 0 - path: cumulus - ref: ${{ github.event.inputs.ref2 }} - - - uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0 - with: - ruby-version: 3.0.0 - - - name: Download srtool json output - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - - - name: Prepare tooling - run: | - cd cumulus/scripts/ci/changelog - gem install bundler changelogerator:0.9.1 - bundle install - changelogerator --help - - URL=https://github.com/chevdor/tera-cli/releases/download/v0.2.1/tera-cli_linux_amd64.deb - wget $URL -O tera.deb - sudo dpkg -i tera.deb - tera --version - - - name: Generate release notes - env: - RUSTC_STABLE: ${{ needs.get-rust-versions.outputs.rustc-stable }} - RUSTC_NIGHTLY: ${{ needs.get-rust-versions.outputs.rustc-nightly }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NO_CACHE: 1 - DEBUG: 1 - SHELL_DIGEST: ${{ github.workspace}}/shell-srtool-json/shell-srtool-digest.json - ASSET_HUB_WESTEND_DIGEST: ${{ github.workspace}}/asset-hub-westend-srtool-json/asset-hub-westend-srtool-digest.json - ASSET_HUB_KUSAMA_DIGEST: ${{ github.workspace}}/asset-hub-kusama-srtool-json/asset-hub-kusama-srtool-digest.json - ASSET_HUB_POLKADOT_DIGEST: ${{ github.workspace}}/asset-hub-polkadot-srtool-json/asset-hub-polkadot-srtool-digest.json - BRIDGE_HUB_ROCOCO_DIGEST: ${{ github.workspace}}/bridge-hub-rococo-srtool-json/bridge-hub-rococo-srtool-digest.json - BRIDGE_HUB_KUSAMA_DIGEST: ${{ github.workspace}}/bridge-hub-kusama-srtool-json/bridge-hub-kusama-srtool-digest.json - BRIDGE_HUB_POLKADOT_DIGEST: ${{ github.workspace}}/bridge-hub-polkadot-srtool-json/bridge-hub-polkadot-srtool-digest.json - COLLECTIVES_POLKADOT_DIGEST: ${{ github.workspace}}/collectives-polkadot-srtool-json/collectives-polkadot-srtool-digest.json - ROCOCO_PARA_DIGEST: ${{ github.workspace}}/rococo-parachain-srtool-json/rococo-parachain-srtool-digest.json - CANVAS_KUSAMA_DIGEST: ${{ github.workspace}}/contracts-rococo-srtool-json/contracts-rococo-srtool-digest.json - REF1: ${{ github.event.inputs.ref1 }} - REF2: ${{ github.event.inputs.ref2 }} - PRE_RELEASE: ${{ github.event.inputs.pre_release }} - RELEASE_TYPE: ${{ github.event.inputs.release_type }} - run: | - find ${{env.GITHUB_WORKSPACE}} -type f -name "*-srtool-digest.json" - - if [ "$RELEASE_TYPE" != "client" ]; then - ls -al $SHELL_DIGEST || true - ls -al $ASSET_HUB_WESTEND_DIGEST || true - ls -al $ASSET_HUB_KUSAMA_DIGEST || true - ls -al $ASSET_HUB_POLKADOT_DIGEST || true - ls -al $BRIDGE_HUB_ROCOCO_DIGEST || true - ls -al $BRIDGE_HUB_KUSAMA_DIGEST || true - ls -al $BRIDGE_HUB_POLKADOT_DIGEST || true - ls -al $COLLECTIVES_POLKADOT_DIGEST || true - ls -al $ROCOCO_PARA_DIGEST || true - ls -al $CANVAS_KUSAMA_DIGEST || true - fi - - echo "The diff will be computed from $REF1 to $REF2" - cd cumulus/scripts/ci/changelog - ./bin/changelog $REF1 $REF2 release-notes.md - ls -al {release-notes.md,context.json} || true - - - name: Archive srtool json - if: ${{ github.event.inputs.release_type != 'client' }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: srtool-json - path: | - **/*-srtool-digest.json - - - name: Archive context artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: release-notes-context - path: | - cumulus/scripts/ci/changelog/context.json - - - name: Create draft release - id: create-release - uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e # v1.1.4 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - body_path: ./cumulus/scripts/ci/changelog/release-notes.md - tag_name: ${{ github.event.inputs.ref2 }} - release_name: ${{ github.event.inputs.ref2 }} - draft: true - - publish-runtimes: - if: ${{ github.event.inputs.release_type != 'client' }} - runs-on: ubuntu-latest - needs: ["publish-draft-release"] - env: - RUNTIME_DIR: parachains/runtimes - strategy: - matrix: - include: - - category: assets - runtime: asset-hub-kusama - - category: assets - runtime: asset-hub-polkadot - - category: assets - runtime: asset-hub-westend - - category: bridge-hubs - runtime: bridge-hub-polkadot - - category: bridge-hubs - runtime: bridge-hub-kusama - - category: bridge-hubs - runtime: bridge-hub-rococo - - category: collectives - runtime: collectives-polkadot - - category: contracts - runtime: contracts-rococo - - category: starters - runtime: seedling - - category: starters - runtime: shell - - category: testing - runtime: rococo-parachain - steps: - - name: Checkout sources - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - ref: ${{ github.event.inputs.ref2 }} - - - name: Download artifacts - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 - - - uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0 - with: - ruby-version: 3.0.0 - - - name: Get runtime version for ${{ matrix.runtime }} - id: get-runtime-ver - run: | - echo "require './scripts/ci/github/runtime-version.rb'" > script.rb - echo "puts get_runtime(runtime: \"${{ matrix.runtime }}\", runtime_dir: \"$RUNTIME_DIR/${{ matrix.category }}\")" >> script.rb - - echo "Current folder: $PWD" - ls "$RUNTIME_DIR/${{ matrix.category }}/${{ matrix.runtime }}" - runtime_ver=$(ruby script.rb) - echo "Found version: >$runtime_ver<" - echo "runtime_ver=$runtime_ver" >> $GITHUB_OUTPUT - - - name: Fix runtime name - id: fix-runtime-path - run: | - cd "${{ matrix.runtime }}-runtime/" - mv "$(sed -E 's/- */_/g' <<< ${{ matrix.runtime }})_runtime.compact.compressed.wasm" "${{ matrix.runtime }}_runtime.compact.compressed.wasm" || true - - - name: Upload compressed ${{ matrix.runtime }} wasm - uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 # v1.0.2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ needs.publish-draft-release.outputs.asset_upload_url }} - asset_path: "${{ matrix.runtime }}-runtime/${{ matrix.runtime }}_runtime.compact.compressed.wasm" - asset_name: ${{ matrix.runtime }}_runtime-v${{ steps.get-runtime-ver.outputs.runtime_ver }}.compact.compressed.wasm - asset_content_type: application/wasm - - post_to_matrix: - if: ${{ github.event.inputs.notification == 'true' }} - runs-on: ubuntu-latest - needs: publish-draft-release - strategy: - matrix: - channel: - - name: 'RelEng: Cumulus Release Coordination' - room: '!NAEMyPAHWOiOQHsvus:parity.io' - pre-releases: true - steps: - - name: Matrix notification to ${{ matrix.channel.name }} - uses: s3krit/matrix-message-action@70ad3fb812ee0e45ff8999d6af11cafad11a6ecf # v0.0.3 - with: - room_id: ${{ matrix.channel.room }} - access_token: ${{ secrets.RELEASENOTES_MATRIX_V2_ACCESS_TOKEN }} - server: "m.parity.io" - message: | - **New draft for ${{ github.repository }}**: ${{ github.event.inputs.ref2 }}
- - Draft release created: [draft](${{ needs.publish-draft-release.outputs.release_url }}) - - NOTE: The link above will no longer be valid if the draft is edited. You can then use the following link: - [${{ github.server_url }}/${{ github.repository }}/releases](${{ github.server_url }}/${{ github.repository }}/releases) diff --git a/cumulus/.github/workflows/release-50_docker-manual.yml b/cumulus/.github/workflows/release-50_docker-manual.yml deleted file mode 100644 index ac564e837469..000000000000 --- a/cumulus/.github/workflows/release-50_docker-manual.yml +++ /dev/null @@ -1,156 +0,0 @@ -name: Release - Docker (Manual) - -# This workflow fetches the binaries, checks sha256 and GPG -# signatures, then builds an injected docker -# image and publishes it. - -on: - workflow_dispatch: - inputs: - tag: - description: release tag to build image for - default: v0.9.230 - required: true - prerelease: - description: is prerelease - default: "false" - required: true - -jobs: - docker_build_publish: - env: - BINARY: polkadot-parachain - runs-on: ubuntu-latest - - steps: - - name: Checkout sources - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - ref: ${{ github.event.release.tag_name }} - - - name: Prepare temp folder - run: | - TMP=$(mktemp -d) - echo "TMP folder: $TMP" - echo "TMP=$TMP" >> $GITHUB_ENV - pwd - ls -al "$TMP" - - - name: Fetch files from release - working-directory: ${{ env.TMP }} - run: | - echo "Repo: ${{ github.event.repository.full_name }}" - echo "Working from folder $(pwd)" - ls -al - - for f in $BINARY $BINARY.asc $BINARY.sha256; do - URL="https://github.com/${{ github.event.repository.full_name }}/releases/download/${{ github.event.inputs.tag }}/$f" - echo " - Fetching $f from $URL" - wget "$URL" -O "$f" - done - chmod a+x $BINARY - ls -al - - - name: Check SHA256 - working-directory: ${{ env.TMP }} - run: | - ls -al *$BINARY* - shasum -a 256 -c $BINARY.sha256 - sha_result=$? - - echo sha_result: $sha_result - - if [[ $sha_result -ne 0 ]]; then - echo "SHA256 check failed, exiting with error" - exit 1 - else - echo "SHA256 check passed" - fi - - - name: Check GPG - working-directory: ${{ env.TMP }} - run: | - KEY_PARITY_SEC=9D4B2B6EB8F97156D19669A9FF0812D491B96798 - KEY_CHEVDOR=2835EAF92072BC01D188AF2C4A092B93E97CE1E2 - KEY_EGOR=E6FC4D4782EB0FA64A4903CCDB7D3555DD3932D3 - KEYSERVER=keyserver.ubuntu.com - - gpg --keyserver $KEYSERVER --receive-keys $KEY_PARITY_SEC - echo -e "5\ny\n" | gpg --no-tty --command-fd 0 --expert --edit-key $KEY_PARITY_SEC trust; - - if [[ "${{ github.event.release.prerelease }}" == "true" ]]; then - for key in $KEY_CHEVDOR $KEY_EGOR; do - ( - echo "Importing GPG key $key" - gpg --no-tty --quiet --keyserver $GPG_KEYSERVER --recv-keys $key - echo -e "4\ny\n" | gpg --no-tty --command-fd 0 --expert --edit-key $key trust; - ) & - done - wait - fi - - gpg --no-tty --verify $BINARY.asc - gpg_result=$? - - echo gpg_result: $gpg_result - - if [[ $gpg_result -ne 0 ]]; then - echo "GPG check failed, exiting with error" - exit 1 - else - echo "GPG check passed" - fi - - - name: Build injected image - env: - DOCKERHUB_ORG: parity - OWNER: ${{ env.DOCKERHUB_ORG }} - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - IMAGE_NAME: polkadot-parachain - run: | - mkdir -p target/release-artifacts - cp -f ${TMP}/$BINARY* target/release-artifacts/ - ./docker/scripts/build-injected-image.sh - - - name: Login to Dockerhub - uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Tag and Publish - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_ORG: parity - run: | - docker run --pull never --rm $DOCKERHUB_ORG/$BINARY --version - VERSION=$(docker run --pull never --rm $DOCKERHUB_ORG/$BINARY --version | awk '{ print $2 }' ) - SEMVER=$( echo $VERSION | cut -f1 -d- ) - GITREF=$( echo $VERSION | cut -f2 -d- ) - PRE=${{ github.event.inputs.prerelease }} - PRE_STR="" - - echo "SEMVER=$SEMVER" - echo "GITREF=$GITREF" - echo "PRE=$PRE" - - # Build a tag such as: - # 1.2.3-8a1201273 or - # 1.2.3-pre-8a1201273 for pre-releases - [[ $PRE == "true" ]] && PRE_STR="-pre" - TAG=${SEMVER}${PRE_STR}-${GITREF} - echo "PRE_STR=$PRE_STR" - echo "TAG=$TAG" - - docker tag $DOCKERHUB_ORG/$BINARY $DOCKERHUB_ORG/$BINARY:$TAG - docker push $DOCKERHUB_ORG/$BINARY:$TAG - - if [[ $PRE != "true" ]]; then - docker tag $DOCKERHUB_ORG/$BINARY $DOCKERHUB_ORG/$BINARY:latest - docker tag $DOCKERHUB_ORG/$BINARY $DOCKERHUB_ORG/$BINARY:$SEMVER - - docker push $DOCKERHUB_ORG/$BINARY:latest - docker push $DOCKERHUB_ORG/$BINARY:$SEMVER - fi - - docker images diff --git a/cumulus/.github/workflows/release-50_docker.yml b/cumulus/.github/workflows/release-50_docker.yml deleted file mode 100644 index d6d79cc12fb5..000000000000 --- a/cumulus/.github/workflows/release-50_docker.yml +++ /dev/null @@ -1,154 +0,0 @@ -name: Release - Docker - -# This workflow listens to pubished releases. -# It includes releases and pre-releases. -# It fetches the binaries, checks sha256 and GPG -# signatures, then builds an injected docker -# image and publishes it. - -on: - release: - types: - - published - -jobs: - docker_build_publish: - env: - BINARY: polkadot-parachain - runs-on: ubuntu-latest - - steps: - - name: Checkout sources - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - ref: ${{ github.event.release.tag_name }} - - - name: Prepare temp folder - run: | - TMP=$(mktemp -d) - echo "TMP=$TMP" >> "$GITHUB_ENV" - pwd - ls -al "$TMP" - - - name: Fetch files from release - working-directory: ${{ env.TMP }} - run: | - echo "Repo: ${{ github.event.repository.full_name }}" - - echo "Name: ${{ github.event.release.name }}" - echo "Tag: ${{ github.event.release.tag_name }}" - echo "Draft: ${{ github.event.release.draft }}" - echo "Prerelease: ${{ github.event.release.prerelease }}" - echo "Assets: ${{ github.event.release.assets }}" - - for f in $BINARY $BINARY.asc $BINARY.sha256; do - URL="https://github.com/${{ github.event.repository.full_name }}/releases/download/${{ github.event.release.tag_name }}/$f" - echo " - Fetching $f from $URL" - wget "$URL" -O "$f" - done - chmod a+x $BINARY - ls -al - - - name: Check SHA256 - working-directory: ${{ env.TMP }} - run: | - ls -al *$BINARY* - shasum -a 256 -c $BINARY.sha256 - sha_result=$? - - echo sha_result: $sha_result - - if [[ $sha_result -ne 0 ]]; then - echo "SHA256 check failed, exiting with error" - exit 1 - else - echo "SHA256 check passed" - fi - - - name: Check GPG - working-directory: ${{ env.TMP }} - run: | - KEY_PARITY_SEC=9D4B2B6EB8F97156D19669A9FF0812D491B96798 - KEY_CHEVDOR=2835EAF92072BC01D188AF2C4A092B93E97CE1E2 - KEY_EGOR=E6FC4D4782EB0FA64A4903CCDB7D3555DD3932D3 - KEYSERVER=keyserver.ubuntu.com - - gpg --keyserver $KEYSERVER --receive-keys $KEY_PARITY_SEC - echo -e "5\ny\n" | gpg --no-tty --command-fd 0 --expert --edit-key $KEY_PARITY_SEC trust; - - if [[ "${{ github.event.release.prerelease }}" == "true" ]]; then - for key in $KEY_CHEVDOR $KEY_EGOR; do - ( - echo "Importing GPG key $key" - gpg --no-tty --quiet --keyserver $GPG_KEYSERVER --recv-keys $key - echo -e "4\ny\n" | gpg --no-tty --command-fd 0 --expert --edit-key $key trust; - ) & - done - wait - fi - - gpg --no-tty --verify $BINARY.asc - gpg_result=$? - - echo gpg_result: $gpg_result - - if [[ $gpg_result -ne 0 ]]; then - echo "GPG check failed, exiting with error" - exit 1 - else - echo "GPG check passed" - fi - - - name: Build injected image - env: - DOCKERHUB_ORG: parity - OWNER: ${{ env.DOCKERHUB_ORG }} - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - IMAGE_NAME: polkadot-parachain - run: | - mkdir -p target/release-artifacts - cp -f ${TMP}/$BINARY* target/release-artifacts/ - ./docker/scripts/build-injected-image.sh - - - name: Login to Dockerhub - uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Tag and Publish - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_ORG: parity - run: | - docker run --pull never --rm $DOCKERHUB_ORG/$BINARY --version - VERSION=$(docker run --pull never --rm $DOCKERHUB_ORG/$BINARY --version | awk '{ print $2 }' ) - SEMVER=$( echo $VERSION | cut -f1 -d- ) - GITREF=$( echo $VERSION | cut -f2 -d- ) - PRE=${{ github.event.release.prerelease }} - PRE_STR="" - - echo "SEMVER=$SEMVER" - echo "GITREF=$GITREF" - echo "PRE=$PRE" - - # Build a tag such as: - # 1.2.3-8a1201273 or - # 1.2.3-pre-8a1201273 for pre-releases - [[ $PRE == "true" ]] && PRE_STR="-pre" - TAG=${SEMVER}${PRE_STR}-${GITREF} - echo "PRE_STR=$PRE_STR" - echo "TAG=$TAG" - - docker tag $DOCKERHUB_ORG/$BINARY $DOCKERHUB_ORG/$BINARY:$TAG - docker push $DOCKERHUB_ORG/$BINARY:$TAG - - if [[ $PRE != "true" ]]; then - docker tag $DOCKERHUB_ORG/$BINARY $DOCKERHUB_ORG/$BINARY:latest - docker tag $DOCKERHUB_ORG/$BINARY $DOCKERHUB_ORG/$BINARY:$SEMVER - - docker push $DOCKERHUB_ORG/$BINARY:latest - docker push $DOCKERHUB_ORG/$BINARY:$SEMVER - fi - - docker images diff --git a/cumulus/.github/workflows/release-99_bot-announce.yml b/cumulus/.github/workflows/release-99_bot-announce.yml deleted file mode 100644 index 5c2604924c4c..000000000000 --- a/cumulus/.github/workflows/release-99_bot-announce.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Release - Pushes release notes to a Matrix room -on: - release: - types: - - published - -jobs: - ping_matrix: - runs-on: ubuntu-latest - strategy: - matrix: - channel: - - name: 'RelEng: Cumulus Release Coordination' - room: '!NAEMyPAHWOiOQHsvus:parity.io' - pre-releases: true - - name: 'Ledger <> Polkadot Coordination' - room: '!EoIhaKfGPmFOBrNSHT:web3.foundation' - pre-release: true - - name: 'General: Rust, Polkadot, Substrate' - room: '!aJymqQYtCjjqImFLSb:parity.io' - pre-release: false - - name: 'Team: DevOps' - room: '!lUslSijLMgNcEKcAiE:parity.io' - pre-release: true - - steps: - - name: Matrix notification to ${{ matrix.channel.name }} - uses: s3krit/matrix-message-action@70ad3fb812ee0e45ff8999d6af11cafad11a6ecf # v0.0.3 - with: - room_id: ${{ matrix.channel.room }} - access_token: ${{ secrets.RELEASENOTES_MATRIX_V2_ACCESS_TOKEN }} - server: "m.parity.io" - message: | - A (pre)release has been ${{github.event.action}} in **${{github.event.repository.full_name}}:**
- Release version: [${{github.event.release.tag_name}}](${{github.event.release.html_url}}) - - ----- - - ${{github.event.release.body}} diff --git a/cumulus/.github/workflows/srtool.yml b/cumulus/.github/workflows/srtool.yml deleted file mode 100644 index ae473b481370..000000000000 --- a/cumulus/.github/workflows/srtool.yml +++ /dev/null @@ -1,122 +0,0 @@ -name: Srtool build - -env: - SUBWASM_VERSION: 0.20.0 - -on: - push: - tags: - - "*" - - # paths-ignore: - # - "docker" - # - "docs" - # - "scripts" - # - "test" - # - "client" - paths: - - parachains/runtimes/**/* - - branches: - - "release*" - - schedule: - - cron: "00 02 * * 1" # 2AM weekly on monday - - workflow_dispatch: - -jobs: - srtool: - runs-on: ubuntu-latest - strategy: - matrix: - include: - - category: assets - runtime: asset-hub-kusama - - category: assets - runtime: asset-hub-polkadot - - category: assets - runtime: asset-hub-westend - - category: bridge-hubs - runtime: bridge-hub-polkadot - - category: bridge-hubs - runtime: bridge-hub-kusama - - category: bridge-hubs - runtime: bridge-hub-rococo - - category: collectives - runtime: collectives-polkadot - - category: contracts - runtime: contracts-rococo - - category: starters - runtime: seedling - - category: starters - runtime: shell - - category: testing - runtime: rococo-parachain - steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - with: - fetch-depth: 0 - - - name: Srtool build - id: srtool_build - uses: chevdor/srtool-actions@v0.7.0 - with: - chain: ${{ matrix.runtime }} - runtime_dir: parachains/runtimes/${{ matrix.category }}/${{ matrix.runtime }} - - - name: Summary - run: | - echo '${{ steps.srtool_build.outputs.json }}' | jq > ${{ matrix.runtime }}-srtool-digest.json - cat ${{ matrix.runtime }}-srtool-digest.json - echo "Compact Runtime: ${{ steps.srtool_build.outputs.wasm }}" - echo "Compressed Runtime: ${{ steps.srtool_build.outputs.wasm_compressed }}" - - # it takes a while to build the runtime, so let's save the artifact as soon as we have it - - name: Archive Artifacts for ${{ matrix.runtime }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: ${{ matrix.runtime }}-runtime - path: | - ${{ steps.srtool_build.outputs.wasm }} - ${{ steps.srtool_build.outputs.wasm_compressed }} - ${{ matrix.runtime }}-srtool-digest.json - - # We now get extra information thanks to subwasm - - name: Install subwasm - run: | - wget https://github.com/chevdor/subwasm/releases/download/v${{ env.SUBWASM_VERSION }}/subwasm_linux_amd64_v${{ env.SUBWASM_VERSION }}.deb - sudo dpkg -i subwasm_linux_amd64_v${{ env.SUBWASM_VERSION }}.deb - subwasm --version - - - name: Show Runtime information - shell: bash - run: | - subwasm info ${{ steps.srtool_build.outputs.wasm }} - subwasm info ${{ steps.srtool_build.outputs.wasm_compressed }} - subwasm --json info ${{ steps.srtool_build.outputs.wasm }} > ${{ matrix.runtime }}-info.json - subwasm --json info ${{ steps.srtool_build.outputs.wasm_compressed }} > ${{ matrix.runtime }}-compressed-info.json - - - name: Extract the metadata - shell: bash - run: | - subwasm meta ${{ steps.srtool_build.outputs.wasm }} - subwasm --json meta ${{ steps.srtool_build.outputs.wasm }} > ${{ matrix.runtime }}-metadata.json - - - name: Check the metadata diff - shell: bash - # the following subwasm call will error for chains that are not known and/or live, that includes shell for instance - run: | - subwasm diff ${{ steps.srtool_build.outputs.wasm }} --chain-b ${{ matrix.runtime }} || \ - echo "Subwasm call failed, check the logs. This is likely because ${{ matrix.runtime }} is not known by subwasm" | \ - tee ${{ matrix.runtime }}-diff.txt - - - name: Archive Subwasm results - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: ${{ matrix.runtime }}-runtime - path: | - ${{ matrix.runtime }}-info.json - ${{ matrix.runtime }}-compressed-info.json - ${{ matrix.runtime }}-metadata.json - ${{ matrix.runtime }}-diff.txt diff --git a/cumulus/.gitignore b/cumulus/.gitignore deleted file mode 100644 index 225be8577458..000000000000 --- a/cumulus/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -**/target/ -.idea -.vscode -.DS_Store -/.cargo/config -polkadot_argument_parsing -**/node_modules -**/chains/ -*.iml -.env -**/._* diff --git a/cumulus/.gitlab-ci.yml b/cumulus/.gitlab-ci.yml deleted file mode 100644 index f032901c6f47..000000000000 --- a/cumulus/.gitlab-ci.yml +++ /dev/null @@ -1,201 +0,0 @@ -# .gitlab-ci.yml -# -# cumulus -# -# pipelines can be triggered manually in the web - -stages: - - test - - build - # used for manual job run for regenerate weights for release-* branches (not needed anymore, just leave it here for a while as PlanB) - - benchmarks-build - # used for manual job run for regenerate weights for release-* branches (not needed anymore, just leave it here for a while as PlanB) - - benchmarks-run - - publish - - integration-tests - - zombienet - - short-benchmarks - -default: - interruptible: true - retry: - max: 2 - when: - - runner_system_failure - - unknown_failure - - api_failure - -variables: - GIT_STRATEGY: fetch - GIT_DEPTH: 100 - CARGO_INCREMENTAL: 0 - CI_IMAGE: !reference [.ci-unified, variables, CI_IMAGE] - DOCKER_OS: "debian:stretch" - ARCH: "x86_64" - ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.55" - BUILDAH_IMAGE: "quay.io/buildah/stable:v1.29" - BUILDAH_COMMAND: "buildah --storage-driver overlay2" - -.common-before-script: - before_script: - - !reference [.job-switcher, before_script] - - !reference [.timestamp, before_script] - -.collect-artifacts: - artifacts: - name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" - when: on_success - expire_in: 1 days - paths: - - ./artifacts/ - -# collecting vars for pipeline stopper -# they will be used if the job fails -.pipeline-stopper-vars: - before_script: - - echo "FAILED_JOB_URL=${CI_JOB_URL}" > pipeline-stopper.env - - echo "FAILED_JOB_NAME=${CI_JOB_NAME}" >> pipeline-stopper.env - - echo "FAILED_JOB_NAME=${CI_JOB_NAME}" >> pipeline-stopper.env - - echo "PR_NUM=${CI_COMMIT_REF_NAME}" >> pipeline-stopper.env - -.pipeline-stopper-artifacts: - artifacts: - reports: - dotenv: pipeline-stopper.env - -.common-refs: - # these jobs run always* - rules: - - if: $CI_PIPELINE_SOURCE == "schedule" - - if: $CI_COMMIT_REF_NAME == "master" - - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs - - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 - - if: $CI_COMMIT_REF_NAME =~ /^release-parachains-v[0-9].*$/ # i.e. release-parachains-v1.0, release-parachains-v2.1rc1, release-parachains-v3000 - - if: $CI_COMMIT_REF_NAME =~ /^polkadot-v[0-9]+\.[0-9]+.*$/ # i.e. polkadot-v1.0.99, polkadot-v2.1rc1 - -.pr-refs: - # these jobs run always* - rules: - - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs - -.publish-refs: - rules: - - if: $CI_COMMIT_REF_NAME == "master" - - if: $CI_PIPELINE_SOURCE == "schedule" - - if: $CI_COMMIT_REF_NAME =~ /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 - -# run benchmarks manually only on release-parachains-v* branch -.benchmarks-manual-refs: - rules: - - if: $CI_COMMIT_REF_NAME =~ /^release-parachains-v[0-9].*$/ # i.e. release-parachains-v1.0, release-parachains-v2.1rc1, release-parachains-v3000 - when: manual - -# run benchmarks only on release-parachains-v* branch -.benchmarks-refs: - rules: - - if: $CI_COMMIT_REF_NAME =~ /^release-parachains-v[0-9].*$/ # i.e. release-parachains-v1.0, release-parachains-v2.1rc1, release-parachains-v3000 - -.zombienet-refs: - rules: - - if: $CI_PIPELINE_SOURCE == "pipeline" - when: never - - if: $CI_PIPELINE_SOURCE == "schedule" - when: never - - if: $CI_COMMIT_REF_NAME == "master" - - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs - -.job-switcher: - before_script: - - if echo "$CI_DISABLED_JOBS" | grep -xF "$CI_JOB_NAME"; then echo "The job has been cancelled in CI settings"; exit 0; fi - -.docker-env: - image: "${CI_IMAGE}" - before_script: - - !reference [.common-before-script, before_script] - - rustup show - - cargo --version - - bash --version - tags: - - linux-docker-vm-c2 - -.kubernetes-env: - image: "${CI_IMAGE}" - before_script: - - !reference [.common-before-script, before_script] - tags: - - kubernetes-parity-build - -.git-commit-push: - script: - - git status - # Set git config - - rm -rf .git/config - - git config --global user.email "${GITHUB_EMAIL}" - - git config --global user.name "${GITHUB_USER}" - - git config remote.origin.url "https://${GITHUB_USER}:${GITHUB_TOKEN}@github.com/paritytech/${CI_PROJECT_NAME}.git" - - git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" - # push results to github - - git checkout -b $BRANCHNAME - - git add parachains/* - - git commit -m "[benchmarks] pr with weights" - - git push origin $BRANCHNAME - -include: - # test jobs - - scripts/ci/gitlab/pipeline/test.yml - # # build jobs - - scripts/ci/gitlab/pipeline/build.yml - # short-benchmarks jobs - - scripts/ci/gitlab/pipeline/short-benchmarks.yml - # # benchmarks jobs - # # used for manual job run for regenerate weights for release-* branches (not needed anymore, just leave it here for a while as PlanB) - - scripts/ci/gitlab/pipeline/benchmarks.yml - # # publish jobs - - scripts/ci/gitlab/pipeline/publish.yml - # zombienet jobs - - scripts/ci/gitlab/pipeline/zombienet.yml - # timestamp handler - - project: parity/infrastructure/ci_cd/shared - ref: main - file: /common/timestamp.yml - - project: parity/infrastructure/ci_cd/shared - ref: main - file: /common/ci-unified.yml - - -#### stage: .post - -# This job cancels the whole pipeline if any of provided jobs fail. -# In a DAG, every jobs chain is executed independently of others. The `fail_fast` principle suggests -# to fail the pipeline as soon as possible to shorten the feedback loop. -cancel-pipeline: - stage: .post - needs: - - job: test-linux-stable - rules: - - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs - when: on_failure - variables: - PROJECT_ID: "${CI_PROJECT_ID}" - PROJECT_NAME: "${CI_PROJECT_NAME}" - PIPELINE_ID: "${CI_PIPELINE_ID}" - FAILED_JOB_URL: "${FAILED_JOB_URL}" - FAILED_JOB_NAME: "${FAILED_JOB_NAME}" - PR_NUM: "${PR_NUM}" - trigger: - project: "parity/infrastructure/ci_cd/pipeline-stopper" - branch: "as-improve" - -remove-cancel-pipeline-message: - stage: .post - rules: - - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs - variables: - PROJECT_ID: "${CI_PROJECT_ID}" - PROJECT_NAME: "${CI_PROJECT_NAME}" - PIPELINE_ID: "${CI_PIPELINE_ID}" - FAILED_JOB_URL: "https://gitlab.com" - FAILED_JOB_NAME: "nope" - PR_NUM: "${CI_COMMIT_REF_NAME}" - trigger: - project: "parity/infrastructure/ci_cd/pipeline-stopper" diff --git a/cumulus/.rustfmt.toml b/cumulus/.rustfmt.toml deleted file mode 100644 index e2c4a037f37f..000000000000 --- a/cumulus/.rustfmt.toml +++ /dev/null @@ -1,28 +0,0 @@ -# Basic -edition = "2021" -hard_tabs = true -max_width = 100 -use_small_heuristics = "Max" - -# Imports -imports_granularity = "Crate" -reorder_imports = true - -# Consistency -newline_style = "Unix" - -# Format comments -comment_width = 100 -wrap_comments = true - -# Misc -chain_width = 80 -spaces_around_ranges = false -binop_separator = "Back" -reorder_impl_items = false -match_arm_leading_pipes = "Preserve" -match_arm_blocks = false -match_block_trailing_comma = true -trailing_comma = "Vertical" -trailing_semicolon = false -use_field_init_shorthand = true diff --git a/cumulus/BRIDGES.md b/cumulus/BRIDGES.md deleted file mode 100644 index 8766de92c17e..000000000000 --- a/cumulus/BRIDGES.md +++ /dev/null @@ -1,91 +0,0 @@ -# Using Parity Bridges Common dependency (`git subtree`). - -In `./bridges` sub-directory you can find a `git subtree` imported version of: -[parity-bridges-common](https://github.com/paritytech/parity-bridges-common/) repository. - -(For regular Cumulus contributor 1. is relevant) \ -(For Cumulus maintainer 1. and 2. are relevant) \ -(For Bridges team 1. and 2. and 3. are relevant) - -# 1. How to fix broken Bridges code? - -To fix Bridges code simply create a commit in current (`Cumulus`) repo. Best if -the commit is isolated to changes in `./bridges` sub-directory, because it makes -it easier to import that change back to upstream repo. - -(Any changes to `bridges` subtree require Bridges team approve and they should manage backport to Bridges repo) - - -# 2. How to pull latest Bridges code to the `bridges` subtree -(in practice) - -The `bridges` repo has a stabilized branch `polkadot-staging` dedicated for releasing. - -``` -cd - -# this will update new git branches from bridges repo -# there could be unresolved conflicts, but dont worry, -# lots of them are caused because of removed unneeded files with patch step, -BRANCH=polkadot-staging ./scripts/bridges_update_subtree.sh fetch - -# so, after fetch and before solving conflicts just run patch, -# this will remove unneeded files and checks if subtree modules compiles -./scripts/bridges_update_subtree.sh patch - -# if there are conflicts, this could help, -# this removes locally deleted files at least (move changes to git stash for commit) -./scripts/bridges_update_subtree.sh merge - -# (optional) when conflicts resolved, you can check build again - should pass -# also important: this updates global Cargo.lock -./scripts/bridges_update_subtree.sh patch - -# add changes to the commit, first command `fetch` starts merge, -# so after all conflicts are solved and patch passes and compiles, -# then we need to finish merge with: -git merge --continue -```` - -# 3. How to pull latest Bridges code or contribute back? -(in theory) - -Note that it's totally fine to ping the **Bridges Team** to do that for you. The point -of adding the code as `git subtree` is to **reduce maintenance cost** for Cumulus/Polkadot -developers. - -If you still would like to either update the code to match latest code from the repo -or create an upstream PR read below. The following commands should be run in the -current (`polkadot`) repo. - -1. Add Bridges repo as a local remote: -``` -$ git remote add -f bridges git@github.com:paritytech/parity-bridges-common.git -``` - -If you plan to contribute back, consider forking the repository on Github and adding -your personal fork as a remote as well. -``` -$ git remote add -f my-bridges git@github.com:tomusdrw/parity-bridges-common.git -``` - -2. To update Bridges: -``` -$ git fetch bridges polkadot-staging -$ git subtree pull --prefix=bridges bridges polkadot-staging --squash -```` - -We use `--squash` to avoid adding individual commits and rather squashing them -all into one. - -3. Clean unneeded files here: -``` -./bridges/scripts/verify-pallets-build.sh --ignore-git-state --no-revert -``` - -4. Contributing back to Bridges (creating upstream PR) -``` -$ git subtree push --prefix=bridges my-bridges polkadot-staging -``` -This command will push changes to your personal fork of Bridges repo, from where -you can simply create a PR to the main repo. diff --git a/cumulus/Cargo.lock b/cumulus/Cargo.lock deleted file mode 100644 index 13016948621b..000000000000 --- a/cumulus/Cargo.lock +++ /dev/null @@ -1,17026 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -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 = "addr2line" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "aead" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" -dependencies = [ - "generic-array 0.14.6", - "rand_core 0.6.4", -] - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array 0.14.6", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if", - "cipher 0.3.0", - "cpufeatures", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher 0.4.4", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "cipher 0.3.0", - "ctr 0.8.0", - "ghash 0.4.4", - "subtle", -] - -[[package]] -name = "aes-gcm" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209b47e8954a928e1d72e86eca7000ebb6655fe1436d33eefc2201cad027e237" -dependencies = [ - "aead 0.5.2", - "aes 0.8.3", - "cipher 0.4.4", - "ctr 0.9.2", - "ghash 0.5.0", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - -[[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 = "ahash" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf6ccdb167abbf410dcb915cabd428929d7f6a04980b54a11f26a39f1c7f7107" -dependencies = [ - "cfg-if", - "getrandom 0.2.8", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "always-assert" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf688625d06217d5b1bb0ea9d9c44a1635fd0ee3534466388d18203174f4d11" - -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - -[[package]] -name = "anstream" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e579a7752471abc2a8268df8b20005e3eadd975f585398f17efcfd8d4927371" -dependencies = [ - "anstyle 1.0.0", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is-terminal", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba0b55c2201aa802adb684e7963ce2c3191675629e7df899774331e3ac747cf" - -[[package]] -name = "anstyle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" - -[[package]] -name = "anstyle-parse" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "anstyle-wincon" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcd8291a340dd8ac70e18878bc4501dd7b4ff970cfa21c207d36ece51ea88fd" -dependencies = [ - "anstyle 1.0.0", - "windows-sys 0.48.0", -] - -[[package]] -name = "anyhow" -version = "1.0.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6f84b74db2535ebae81eede2f39b947dcbf01d093ae5f791e5dd414a1bf289" - -[[package]] -name = "approx" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "072df7202e63b127ab55acfe16ce97013d5b97bf160489336d3f1840fd78e99e" -dependencies = [ - "num-traits", -] - -[[package]] -name = "aquamarine" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df752953c49ce90719c7bf1fc587bc8227aed04732ea0c0f85e5397d7fdbd1a1" -dependencies = [ - "include_dir", - "itertools", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "arc-swap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" - -[[package]] -name = "ark-bls12-381" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ed-on-bls12-381-bandersnatch" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cde0f2aa063a2a5c28d39b47761aa102bda7c13c84fc118a61b87c7b2f785c" -dependencies = [ - "ark-bls12-381", - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest 0.10.7", - "itertools", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.0", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-secret-scalar" -version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=c86ebd4#c86ebd4114d3165d05f9ce28c1d9e8d7a9a4e801" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", - "ark-transcript", - "digest 0.10.7", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-transcript" -version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=c86ebd4#c86ebd4114d3165d05f9ce28c1d9e8d7a9a4e801" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "digest 0.10.7", - "rand_core 0.6.4", - "sha3", -] - -[[package]] -name = "array-bytes" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "asn1-rs" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" -dependencies = [ - "asn1-rs-derive 0.1.0", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time 0.3.25", -] - -[[package]] -name = "asn1-rs" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" -dependencies = [ - "asn1-rs-derive 0.4.0", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time 0.3.25", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "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", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "assert_cmd" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6" -dependencies = [ - "anstyle 1.0.0", - "bstr 1.1.0", - "doc-comment", - "predicates 3.0.1", - "predicates-core", - "predicates-tree", - "wait-timeout", -] - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "asset-hub-kusama-integration-tests" -version = "1.0.0" -dependencies = [ - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "frame-support", - "frame-system", - "integration-tests-common", - "pallet-assets", - "pallet-balances", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime", - "polkadot-runtime-parachains", - "sp-core", - "sp-runtime", - "sp-weights", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "asset-hub-kusama-runtime" -version = "0.9.420" -dependencies = [ - "asset-test-utils", - "assets-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "kusama-runtime-constants", - "log", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-nft-fractionalization", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-proxy", - "pallet-session", - "pallet-state-trie-migration", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-uniques", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "sp-weights", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "asset-hub-polkadot-integration-tests" -version = "1.0.0" -dependencies = [ - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "frame-support", - "frame-system", - "integration-tests-common", - "pallet-assets", - "pallet-balances", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime", - "polkadot-runtime-parachains", - "sp-core", - "sp-runtime", - "sp-weights", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "asset-hub-polkadot-runtime" -version = "0.9.420" -dependencies = [ - "asset-test-utils", - "assets-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-proxy", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-uniques", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "polkadot-runtime-constants", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "sp-weights", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "asset-hub-westend-integration-tests" -version = "1.0.0" -dependencies = [ - "assert_matches", - "asset-hub-westend-runtime", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "frame-support", - "frame-system", - "integration-tests-common", - "pallet-asset-conversion", - "pallet-assets", - "pallet-balances", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime", - "polkadot-runtime-parachains", - "sp-core", - "sp-runtime", - "sp-weights", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "asset-hub-westend-runtime" -version = "0.9.420" -dependencies = [ - "asset-test-utils", - "assets-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-asset-conversion", - "pallet-asset-conversion-tx-payment", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-nft-fractionalization", - "pallet-nfts", - "pallet-nfts-runtime-api", - "pallet-proxy", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-uniques", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "primitive-types", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "westend-runtime-constants", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "asset-test-utils" -version = "1.0.0" -dependencies = [ - "assets-common", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-test-relay-sproof-builder", - "frame-support", - "frame-system", - "hex-literal", - "pallet-assets", - "pallet-balances", - "pallet-collator-selection", - "pallet-session", - "pallet-xcm", - "parachain-info", - "parachains-common", - "parachains-runtimes-test-utils", - "parity-scale-codec", - "polkadot-parachain", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "substrate-wasm-builder", - "xcm", - "xcm-executor", -] - -[[package]] -name = "assets-common" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "impl-trait-for-tuples", - "log", - "pallet-asset-conversion", - "pallet-asset-tx-payment", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "async-channel" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" -dependencies = [ - "concurrent-queue 2.1.0", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue 1.2.2", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2 0.4.9", - "waker-fn", - "winapi", -] - -[[package]] -name = "async-lock" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-recursion" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "async-trait" -version = "0.1.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "asynchronous-codec" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" -dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite 0.2.12", -] - -[[package]] -name = "atomic-waker" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" - -[[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", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide 0.6.2", - "object", - "rustc-demangle", -] - -[[package]] -name = "bandersnatch_vrfs" -version = "0.0.1" -source = "git+https://github.com/w3f/ring-vrf?rev=c86ebd4#c86ebd4114d3165d05f9ce28c1d9e8d7a9a4e801" -dependencies = [ - "ark-bls12-381", - "ark-ec", - "ark-ed-on-bls12-381-bandersnatch", - "ark-ff", - "ark-serialize", - "ark-std", - "dleq_vrf", - "fflonk", - "merlin 3.0.0", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "ring 0.1.0", - "sha2 0.10.7", - "zeroize", -] - -[[package]] -name = "base-x" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "base64" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1e31e207a6b8fb791a38ea3105e6cb541f55e4d029902d3039a4ad07cc4105" - -[[package]] -name = "base64ct" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474" - -[[package]] -name = "beef" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed554bd50246729a1ec158d08aa3235d1b69d94ad120ebe187e28894787e736" -dependencies = [ - "serde", -] - -[[package]] -name = "binary-merkle-tree" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "hash-db", - "log", -] - -[[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.65.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.28", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" -dependencies = [ - "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.2.4", -] - -[[package]] -name = "blake2s_simd" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db539cc2b5f6003621f1cd9ef92d7ded8ea5232c7de0f9faa2de251cd98730d4" -dependencies = [ - "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.1.5", -] - -[[package]] -name = "blake3" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" -dependencies = [ - "arrayref", - "arrayvec 0.7.4", - "cc", - "cfg-if", - "constant_time_eq 0.1.5", - "digest 0.10.7", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "block-buffer" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d36a02058e76b040de25a4464ba1c80935655595b661505c8b39b664828b95" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding 0.2.1", - "cipher 0.2.5", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "bounded-collections" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b05133427c07c4776906f673ccf36c21b102c9829c641a5b56bd151d44fd6" -dependencies = [ - "log", - "parity-scale-codec", - "scale-info", - "serde", -] - -[[package]] -name = "bounded-vec" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68534a48cbf63a4b1323c433cf21238c9ec23711e0df13b08c33e5c2082663ce" -dependencies = [ - "thiserror", -] - -[[package]] -name = "bp-bridge-hub-cumulus" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "frame-system", - "polkadot-primitives", - "sp-api", - "sp-std", -] - -[[package]] -name = "bp-bridge-hub-rococo" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std", -] - -[[package]] -name = "bp-bridge-hub-wococo" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-cumulus", - "bp-messages", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std", -] - -[[package]] -name = "bp-header-chain" -version = "0.1.0" -dependencies = [ - "bp-runtime", - "bp-test-utils", - "finality-grandpa", - "frame-support", - "hex", - "hex-literal", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "bp-messages" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-runtime", - "frame-support", - "hex", - "hex-literal", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-std", -] - -[[package]] -name = "bp-parachains" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "bp-polkadot-core" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-runtime", - "frame-support", - "frame-system", - "hex", - "parity-scale-codec", - "parity-util-mem", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "bp-relayers" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-runtime", - "frame-support", - "hex", - "hex-literal", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "bp-rococo" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std", -] - -[[package]] -name = "bp-runtime" -version = "0.1.0" -dependencies = [ - "frame-support", - "frame-system", - "hash-db", - "hex-literal", - "impl-trait-for-tuples", - "num-traits", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", - "trie-db", -] - -[[package]] -name = "bp-test-utils" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "ed25519-dalek", - "finality-grandpa", - "parity-scale-codec", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "sp-std", - "sp-trie", -] - -[[package]] -name = "bp-wococo" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-polkadot-core", - "bp-rococo", - "bp-runtime", - "frame-support", - "sp-api", - "sp-std", -] - -[[package]] -name = "bp-xcm-bridge-hub-router" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "bridge-hub-kusama-runtime" -version = "0.1.0" -dependencies = [ - "bridge-hub-test-utils", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "kusama-runtime-constants", - "log", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "bridge-hub-polkadot-runtime" -version = "0.1.0" -dependencies = [ - "bridge-hub-test-utils", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-multisig", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "polkadot-runtime-constants", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "bridge-hub-rococo-integration-tests" -version = "1.0.0" -dependencies = [ - "bp-messages", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "frame-support", - "frame-system", - "integration-tests-common", - "pallet-assets", - "pallet-balances", - "pallet-bridge-messages", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime", - "polkadot-runtime-parachains", - "sp-core", - "sp-runtime", - "sp-weights", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "bridge-hub-rococo-runtime" -version = "0.1.0" -dependencies = [ - "bp-bridge-hub-rococo", - "bp-bridge-hub-wococo", - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-relayers", - "bp-rococo", - "bp-runtime", - "bp-wococo", - "bridge-hub-test-utils", - "bridge-runtime-common", - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-collator-selection", - "pallet-multisig", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "rococo-runtime-constants", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "bridge-hub-test-utils" -version = "0.1.0" -dependencies = [ - "assert_matches", - "asset-test-utils", - "bp-bridge-hub-rococo", - "bp-bridge-hub-wococo", - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-relayers", - "bp-runtime", - "bp-test-utils", - "bridge-runtime-common", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-collator-selection", - "pallet-session", - "pallet-utility", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parachain-info", - "parachains-runtimes-test-utils", - "parity-scale-codec", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "bridge-runtime-common" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-messages", - "bp-parachains", - "bp-polkadot-core", - "bp-relayers", - "bp-runtime", - "bp-test-utils", - "bp-xcm-bridge-hub-router", - "frame-support", - "frame-system", - "hash-db", - "log", - "pallet-balances", - "pallet-bridge-grandpa", - "pallet-bridge-messages", - "pallet-bridge-parachains", - "pallet-bridge-relayers", - "pallet-transaction-payment", - "pallet-utility", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-trie", - "static_assertions", - "xcm", - "xcm-builder", -] - -[[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 = [ - "memchr", -] - -[[package]] -name = "bstr" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45ea9b00a7b3f2988e9a65ad3917e62123c38dba709b666506207be96d1790b" -dependencies = [ - "memchr", - "once_cell", - "regex-automata", - "serde", -] - -[[package]] -name = "build-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" -dependencies = [ - "semver 0.6.0", -] - -[[package]] -name = "bumpalo" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "bytemuck" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" - -[[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-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 = "cache-padded" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" - -[[package]] -name = "camino" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77df041dc383319cc661b428b6961a005db4d6808d5e12536931b1ca9556055" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.16", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cc" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" -dependencies = [ - "jobserver", -] - -[[package]] -name = "ccm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" -dependencies = [ - "aead 0.3.2", - "cipher 0.2.5", - "subtle", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-expr" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8790cf1286da485c72cf5fc7aeba308438800036ec67d89425924c4807268c9" -dependencies = [ - "smallvec", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "chacha20" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" -dependencies = [ - "cfg-if", - "cipher 0.3.0", - "cpufeatures", - "zeroize", -] - -[[package]] -name = "chacha20poly1305" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" -dependencies = [ - "aead 0.4.3", - "chacha20", - "cipher 0.3.0", - "poly1305", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time 0.1.44", - "winapi", -] - -[[package]] -name = "ciborium" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" - -[[package]] -name = "ciborium-ll" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "cid" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b68e3193982cd54187d71afdb2a271ad4cf8af157858e9cb911b91321de143" -dependencies = [ - "core2", - "multibase", - "multihash", - "serde", - "unsigned-varint", -] - -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "ckb-merkle-mountain-range" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ccb671c5921be8a84686e6212ca184cb1d7c51cadcdbfcbd1cc3f042f5dfb8" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "clang-sys" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66045b9cb23c2e9c1520732030608b02ee07e5cfaa5a521ec15ded7fa24c90" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c27cdf28c0f604ba3f512b0c9a409f8de8513e4816705deb0498b627e7c3a3fd" -dependencies = [ - "clap_builder", - "clap_derive", - "once_cell", -] - -[[package]] -name = "clap_builder" -version = "4.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a9f1ab5e9f01a9b81f202e8562eb9a10de70abf9eaeac1be465c28b75aa4aa" -dependencies = [ - "anstream", - "anstyle 1.0.0", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "clap_lex" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" - -[[package]] -name = "coarsetime" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "454038500439e141804c655b4cd1bc6a70bcb95cd2bc9463af5661b6956f0e46" -dependencies = [ - "libc", - "once_cell", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[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 = "collectives-polkadot-integration-tests" -version = "0.1.0" -dependencies = [ - "asset-hub-polkadot-runtime", - "collectives-polkadot-runtime", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "frame-support", - "frame-system", - "integration-tests-common", - "pallet-assets", - "pallet-balances", - "pallet-core-fellowship", - "pallet-salary", - "pallet-xcm", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime", - "polkadot-runtime-parachains", - "sp-core", - "sp-runtime", - "sp-weights", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "collectives-polkadot-runtime" -version = "1.0.0" -dependencies = [ - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-alliance", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-collective", - "pallet-core-fellowship", - "pallet-multisig", - "pallet-preimage", - "pallet-proxy", - "pallet-ranked-collective", - "pallet-referenda", - "pallet-salary", - "pallet-scheduler", - "pallet-session", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "pallet-xcm", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "polkadot-runtime-constants", - "scale-info", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "color-print" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2a5e6504ed8648554968650feecea00557a3476bc040d0ffc33080e66b646d0" -dependencies = [ - "color-print-proc-macro", -] - -[[package]] -name = "color-print-proc-macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51beaa537d73d2d1ff34ee70bc095f170420ab2ec5d687ecd3ec2b0d092514b" -dependencies = [ - "nom", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "comfy-table" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e1f7e5d046697d34b593bdba8ee31f4649366e452a2ccabb3baf3511e503d1" -dependencies = [ - "strum", - "strum_macros", - "unicode-width", -] - -[[package]] -name = "common" -version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#0e948f3c28cbacecdd3020403c4841c0eb339213" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "fflonk", - "merlin 3.0.0", -] - -[[package]] -name = "common-path" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" - -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "concurrent-queue" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" -dependencies = [ - "crossbeam-utils", -] - -[[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 = "const-oid" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" - -[[package]] -name = "const-random" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" -dependencies = [ - "const-random-macro", - "proc-macro-hack", -] - -[[package]] -name = "const-random-macro" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" -dependencies = [ - "getrandom 0.2.8", - "once_cell", - "proc-macro-hack", - "tiny-keccak", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "constant_time_eq" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" - -[[package]] -name = "contracts-rococo-runtime" -version = "0.2.0" -dependencies = [ - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "kusama-runtime-constants", - "log", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-insecure-randomness-collective-flip", - "pallet-multisig", - "pallet-session", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility", - "pallet-xcm", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-runtime-common", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" -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 = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "cpp_demangle" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "cpu-time" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "cpufeatures" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" -dependencies = [ - "libc", -] - -[[package]] -name = "cranelift-bforest" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" -dependencies = [ - "cranelift-entity", -] - -[[package]] -name = "cranelift-codegen" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" -dependencies = [ - "bumpalo", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-entity", - "cranelift-isle", - "gimli", - "hashbrown 0.13.2", - "log", - "regalloc2", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" -dependencies = [ - "cranelift-codegen-shared", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" - -[[package]] -name = "cranelift-entity" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" -dependencies = [ - "serde", -] - -[[package]] -name = "cranelift-frontend" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" - -[[package]] -name = "cranelift-native" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", -] - -[[package]] -name = "cranelift-wasm" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff3220489a3d928ad91e59dd7aeaa8b3de18afb554a6211213673a71c90737ac" -dependencies = [ - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "itertools", - "log", - "smallvec", - "wasmparser", - "wasmtime-types", -] - -[[package]] -name = "crc" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" - -[[package]] -name = "crc32fast" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "criterion" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "futures", - "is-terminal", - "itertools", - "num-traits", - "once_cell", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "tokio", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "lazy_static", - "memoffset 0.6.5", - "scopeguard", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.6", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" -dependencies = [ - "generic-array 0.14.6", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array 0.14.6", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.6", - "subtle", -] - -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array 0.14.6", - "subtle", -] - -[[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 = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher 0.4.4", -] - -[[package]] -name = "cumulus-client-cli" -version = "0.1.0" -dependencies = [ - "clap", - "parity-scale-codec", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-service", - "sp-core", - "sp-runtime", - "url", -] - -[[package]] -name = "cumulus-client-collator" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-client-consensus-common", - "cumulus-client-network", - "cumulus-primitives-core", - "cumulus-test-client", - "cumulus-test-runtime", - "futures", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-test-helpers", - "polkadot-overseer", - "polkadot-primitives", - "sc-client-api", - "sp-api", - "sp-consensus", - "sp-core", - "sp-maybe-compressed-blob", - "sp-runtime", - "sp-state-machine", - "sp-tracing", - "tracing", -] - -[[package]] -name = "cumulus-client-consensus-aura" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-client-collator", - "cumulus-client-consensus-common", - "cumulus-client-consensus-proposer", - "cumulus-primitives-aura", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-relay-chain-interface", - "futures", - "lru 0.10.0", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-overseer", - "polkadot-primitives", - "sc-client-api", - "sc-consensus", - "sc-consensus-aura", - "sc-consensus-babe", - "sc-consensus-slots", - "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "substrate-prometheus-endpoint", - "tracing", -] - -[[package]] -name = "cumulus-client-consensus-common" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-client-pov-recovery", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-test-client", - "dyn-clone", - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "polkadot-primitives", - "sc-client-api", - "sc-consensus", - "sc-consensus-babe", - "schnellru", - "sp-blockchain", - "sp-consensus", - "sp-consensus-slots", - "sp-core", - "sp-runtime", - "sp-timestamp", - "sp-tracing", - "sp-trie", - "substrate-prometheus-endpoint", - "tracing", -] - -[[package]] -name = "cumulus-client-consensus-proposer" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "cumulus-primitives-parachain-inherent", - "sp-consensus", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "cumulus-client-consensus-relay-chain" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-client-consensus-common", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "futures", - "parking_lot 0.12.1", - "sc-consensus", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "substrate-prometheus-endpoint", - "tracing", -] - -[[package]] -name = "cumulus-client-network" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-inprocess-interface", - "cumulus-relay-chain-interface", - "cumulus-test-service", - "futures", - "futures-timer", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-primitives", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-test-client", - "portpicker", - "sc-cli", - "sc-client-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-keyring", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "substrate-test-utils", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "cumulus-client-pov-recovery" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-test-service", - "futures", - "futures-timer", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "portpicker", - "rand 0.8.5", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sp-consensus", - "sp-maybe-compressed-blob", - "sp-runtime", - "substrate-test-utils", - "tokio", - "tracing", -] - -[[package]] -name = "cumulus-client-service" -version = "0.1.0" -dependencies = [ - "cumulus-client-cli", - "cumulus-client-collator", - "cumulus-client-consensus-common", - "cumulus-client-network", - "cumulus-client-pov-recovery", - "cumulus-primitives-core", - "cumulus-relay-chain-inprocess-interface", - "cumulus-relay-chain-interface", - "cumulus-relay-chain-minimal-node", - "futures", - "polkadot-primitives", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-sync", - "sc-network-transactions", - "sc-rpc", - "sc-service", - "sc-sysinfo", - "sc-telemetry", - "sc-transaction-pool", - "sc-utils", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-transaction-pool", -] - -[[package]] -name = "cumulus-pallet-aura-ext" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-parachain-system", - "frame-support", - "frame-system", - "pallet-aura", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "cumulus-pallet-dmp-queue" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", - "xcm", -] - -[[package]] -name = "cumulus-pallet-parachain-system" -version = "0.1.0" -dependencies = [ - "bytes", - "cumulus-pallet-parachain-system-proc-macro", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-test-client", - "cumulus-test-relay-sproof-builder", - "environmental", - "frame-support", - "frame-system", - "hex-literal", - "impl-trait-for-tuples", - "lazy_static", - "log", - "parity-scale-codec", - "polkadot-parachain", - "sc-client-api", - "scale-info", - "sp-core", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-trie", - "sp-version", - "trie-db", - "xcm", -] - -[[package]] -name = "cumulus-pallet-parachain-system-proc-macro" -version = "0.1.0" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "cumulus-pallet-session-benchmarking" -version = "3.0.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "cumulus-pallet-solo-to-para" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-parachain-system", - "frame-support", - "frame-system", - "pallet-sudo", - "parity-scale-codec", - "polkadot-primitives", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "cumulus-pallet-xcm" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", -] - -[[package]] -name = "cumulus-pallet-xcmp-queue" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-parachain-system", - "cumulus-primitives-core", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "polkadot-runtime-common", - "rand_chacha 0.3.1", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "cumulus-ping" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-xcm", - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", - "xcm", -] - -[[package]] -name = "cumulus-primitives-aura" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-primitives", - "sp-api", - "sp-consensus-aura", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "cumulus-primitives-core" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-primitives", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std", - "sp-trie", - "xcm", -] - -[[package]] -name = "cumulus-primitives-parachain-inherent" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-test-relay-sproof-builder", - "parity-scale-codec", - "sc-client-api", - "scale-info", - "sp-api", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-storage", - "sp-trie", - "tracing", -] - -[[package]] -name = "cumulus-primitives-timestamp" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "cumulus-test-client", - "cumulus-test-relay-sproof-builder", - "futures", - "parity-scale-codec", - "sp-consensus", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-timestamp", - "sp-tracing", -] - -[[package]] -name = "cumulus-primitives-utility" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "log", - "parity-scale-codec", - "polkadot-runtime-common", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "cumulus-relay-chain-inprocess-interface" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-test-service", - "futures", - "futures-timer", - "polkadot-cli", - "polkadot-primitives", - "polkadot-service", - "polkadot-test-client", - "prioritized-metered-channel", - "sc-cli", - "sc-client-api", - "sc-sysinfo", - "sc-telemetry", - "sc-tracing", - "sp-api", - "sp-consensus", - "sp-core", - "sp-keyring", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "cumulus-relay-chain-interface" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "futures", - "jsonrpsee-core", - "parity-scale-codec", - "polkadot-overseer", - "sc-client-api", - "sp-api", - "sp-blockchain", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "cumulus-relay-chain-minimal-node" -version = "0.1.0" -dependencies = [ - "array-bytes", - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-relay-chain-rpc-interface", - "futures", - "lru 0.11.0", - "polkadot-availability-recovery", - "polkadot-collator-protocol", - "polkadot-core-primitives", - "polkadot-network-bridge", - "polkadot-node-collation-generation", - "polkadot-node-core-runtime-api", - "polkadot-node-network-protocol", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sc-authority-discovery", - "sc-client-api", - "sc-network", - "sc-network-common", - "sc-service", - "sc-tracing", - "sc-utils", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-runtime", - "tokio", - "tracing", -] - -[[package]] -name = "cumulus-relay-chain-rpc-interface" -version = "0.1.0" -dependencies = [ - "async-trait", - "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "futures", - "futures-timer", - "jsonrpsee", - "lru 0.11.0", - "parity-scale-codec", - "polkadot-overseer", - "sc-client-api", - "sc-rpc-api", - "sc-service", - "serde", - "serde_json", - "sp-api", - "sp-authority-discovery", - "sp-consensus-babe", - "sp-core", - "sp-state-machine", - "sp-storage", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "cumulus-test-client" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-test-relay-sproof-builder", - "cumulus-test-runtime", - "cumulus-test-service", - "frame-system", - "pallet-balances", - "pallet-transaction-payment", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "sc-block-builder", - "sc-consensus", - "sc-executor", - "sc-executor-common", - "sc-service", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-timestamp", - "substrate-test-client", -] - -[[package]] -name = "cumulus-test-relay-sproof-builder" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "parity-scale-codec", - "polkadot-primitives", - "sp-runtime", - "sp-state-machine", - "sp-std", -] - -[[package]] -name = "cumulus-test-relay-validation-worker-provider" -version = "0.1.0" -dependencies = [ - "polkadot-node-core-pvf", - "toml 0.7.6", -] - -[[package]] -name = "cumulus-test-runtime" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-parachain-system", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "pallet-balances", - "pallet-glutton", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", -] - -[[package]] -name = "cumulus-test-service" -version = "0.1.0" -dependencies = [ - "async-trait", - "clap", - "criterion", - "cumulus-client-cli", - "cumulus-client-consensus-common", - "cumulus-client-consensus-relay-chain", - "cumulus-client-pov-recovery", - "cumulus-client-service", - "cumulus-pallet-parachain-system", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-relay-chain-inprocess-interface", - "cumulus-relay-chain-interface", - "cumulus-relay-chain-minimal-node", - "cumulus-test-client", - "cumulus-test-relay-sproof-builder", - "cumulus-test-relay-validation-worker-provider", - "cumulus-test-runtime", - "frame-system", - "frame-system-rpc-runtime-api", - "futures", - "jsonrpsee", - "pallet-im-online", - "pallet-timestamp", - "pallet-transaction-payment", - "parachains-common", - "parity-scale-codec", - "polkadot-cli", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "polkadot-service", - "polkadot-test-service", - "portpicker", - "rand 0.8.5", - "rococo-parachain-runtime", - "sc-basic-authorship", - "sc-block-builder", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-executor", - "sc-executor-common", - "sc-executor-wasmtime", - "sc-network", - "sc-service", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "sc-transaction-pool-api", - "serde", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "sp-tracing", - "sp-trie", - "substrate-test-client", - "substrate-test-utils", - "tempfile", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "curve25519-dalek" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" -dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "4.0.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16" -dependencies = [ - "cfg-if", - "fiat-crypto", - "packed_simd_2", - "platforms", - "subtle", - "zeroize", -] - -[[package]] -name = "cxx" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7d4e43b25d3c994662706a1d4fcfc32aaa6afd287502c111b237093bb23f3a" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f8829ddc213e2c1368e51a2564c552b65a8cb6a28f31e576270ac81d5e5827" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 1.0.109", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72537424b474af1460806647c41d4b6d35d09ef7fe031c5c2fa5766047cc56a" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "data-encoding" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "data-encoding-macro" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" -dependencies = [ - "data-encoding", - "data-encoding-macro-internal", -] - -[[package]] -name = "data-encoding-macro-internal" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" -dependencies = [ - "data-encoding", - "syn 1.0.109", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "der" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "der-parser" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" -dependencies = [ - "asn1-rs 0.3.1", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "der-parser" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" -dependencies = [ - "asn1-rs 0.5.2", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive-syn-parse" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder_macro" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" -dependencies = [ - "derive_builder_core", - "syn 1.0.109", -] - -[[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", - "quote", - "rustc_version 0.4.0", - "syn 1.0.109", -] - -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.0", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "directories" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[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", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "dleq_vrf" -version = "0.0.2" -source = "git+https://github.com/w3f/ring-vrf?rev=c86ebd4#c86ebd4114d3165d05f9ce28c1d9e8d7a9a4e801" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-secret-scalar", - "ark-serialize", - "ark-std", - "ark-transcript", - "arrayvec 0.7.4", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "docify" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029de870d175d11969524d91a3fb2cbf6d488b853bff99d41cf65e533ac7d9d2" -dependencies = [ - "docify_macros", -] - -[[package]] -name = "docify_macros" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac43324656a1b05eb0186deb51f27d2d891c704c37f34de281ef6297ba193e5" -dependencies = [ - "common-path", - "derive-syn-parse", - "once_cell", - "proc-macro2", - "quote", - "regex", - "syn 2.0.28", - "termcolor", - "toml 0.7.6", - "walkdir", -] - -[[package]] -name = "downcast" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "dtoa" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5caaa75cbd2b960ff1e5392d2cfb1f44717fffe12fc1f32b7b5d1267f99732a6" - -[[package]] -name = "dyn-clonable" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" -dependencies = [ - "dyn-clonable-impl", - "dyn-clone", -] - -[[package]] -name = "dyn-clonable-impl" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "dyn-clone" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - -[[package]] -name = "ecdsa" -version = "0.16.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" -dependencies = [ - "der 0.7.7", - "digest 0.10.7", - "elliptic-curve 0.13.5", - "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519", - "rand 0.7.3", - "serde", - "sha2 0.9.8", - "zeroize", -] - -[[package]] -name = "ed25519-zebra" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" -dependencies = [ - "curve25519-dalek 3.2.0", - "hashbrown 0.12.3", - "hex", - "rand_core 0.6.4", - "sha2 0.9.8", - "zeroize", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array 0.14.6", - "group 0.12.1", - "hkdf", - "pem-rfc7468", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.2", - "digest 0.10.7", - "ff 0.13.0", - "generic-array 0.14.6", - "group 0.13.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.1", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "enum-as-inner" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "enumflags2" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" -dependencies = [ - "enumflags2_derive", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "enumn" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48016319042fb7c87b78d2993084a831793a897a5cd1a2a67cab9d1eeb4b7d76" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "env_logger" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" -dependencies = [ - "atty", - "humantime 2.1.0", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "environmental" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" - -[[package]] -name = "equivalent" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" - -[[package]] -name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - -[[package]] -name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[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 = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-rlp", - "impl-serde", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-rlp", - "impl-serde", - "primitive-types", - "uint", -] - -[[package]] -name = "event-listener" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" - -[[package]] -name = "exit-future" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" -dependencies = [ - "futures", -] - -[[package]] -name = "expander" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a718c0675c555c5f976fff4ea9e2c150fa06cefa201cadef87cfbf9324075881" -dependencies = [ - "blake3", - "fs-err", - "proc-macro2", - "quote", -] - -[[package]] -name = "expander" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3774182a5df13c3d1690311ad32fbe913feef26baba609fa2dd5f72042bd2ab6" -dependencies = [ - "blake2", - "fs-err", - "proc-macro2", - "quote", -] - -[[package]] -name = "expander" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" -dependencies = [ - "blake2", - "fs-err", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "fastrand" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" - -[[package]] -name = "fatality" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad875162843b0d046276327afe0136e9ed3a23d5a754210fb6f1f33610d39ab" -dependencies = [ - "fatality-proc-macro", - "thiserror", -] - -[[package]] -name = "fatality-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5aa1e3ae159e592ad222dc90c5acbad632b527779ba88486abe92782ab268bd" -dependencies = [ - "expander 0.0.4", - "indexmap 1.9.1", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", - "thiserror", -] - -[[package]] -name = "fdlimit" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" -dependencies = [ - "libc", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fflonk" -version = "0.1.0" -source = "git+https://github.com/w3f/fflonk#26a5045b24e169cffc1f9328ca83d71061145c40" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "merlin 3.0.0", -] - -[[package]] -name = "fiat-crypto" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" - -[[package]] -name = "file-per-thread-logger" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fdbe0d94371f9ce939b555dd342d0686cc4c0cadbcd4b61d70af5ff97eb4126" -dependencies = [ - "env_logger 0.7.1", - "log", -] - -[[package]] -name = "filetime" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.2.10", - "winapi", -] - -[[package]] -name = "finality-grandpa" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36530797b9bf31cd4ff126dcfee8170f86b00cfdcea3269d73133cc0415945c3" -dependencies = [ - "either", - "futures", - "futures-timer", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot 0.12.1", - "scale-info", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "398ea4fabe40b9b0d885340a2a991a44c8a645624075ad966d21f88688e2b69e" - -[[package]] -name = "flate2" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af" -dependencies = [ - "cfg-if", - "crc32fast", - "libc", - "libz-sys", - "miniz_oxide 0.5.4", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "fork-tree" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - -[[package]] -name = "frame-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-support-procedural", - "frame-system", - "linregress", - "log", - "parity-scale-codec", - "paste", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-runtime-interface", - "sp-std", - "sp-storage", - "static_assertions", -] - -[[package]] -name = "frame-benchmarking-cli" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "Inflector", - "array-bytes", - "chrono", - "clap", - "comfy-table", - "frame-benchmarking", - "frame-support", - "frame-system", - "gethostname", - "handlebars", - "itertools", - "lazy_static", - "linked-hash-map", - "log", - "parity-scale-codec", - "rand 0.8.5", - "rand_pcg", - "sc-block-builder", - "sc-cli", - "sc-client-api", - "sc-client-db", - "sc-executor", - "sc-service", - "sc-sysinfo", - "serde", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-database", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-state-machine", - "sp-storage", - "sp-trie", - "sp-wasm-interface", - "thiserror", - "thousands", -] - -[[package]] -name = "frame-election-provider-solution-type" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "frame-election-provider-support" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-election-provider-solution-type", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-npos-elections", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "frame-executive" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "frame-try-runtime", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-tracing", -] - -[[package]] -name = "frame-metadata" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "scale-info", - "serde", -] - -[[package]] -name = "frame-remote-externalities" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-recursion", - "futures", - "indicatif", - "jsonrpsee", - "log", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "spinners", - "substrate-rpc-client", - "tokio", - "tokio-retry", -] - -[[package]] -name = "frame-support" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "aquamarine", - "bitflags 1.3.2", - "docify", - "environmental", - "frame-metadata", - "frame-support-procedural", - "impl-trait-for-tuples", - "k256", - "log", - "macro_magic", - "parity-scale-codec", - "paste", - "scale-info", - "serde", - "serde_json", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-core-hashing-proc-macro", - "sp-debug-derive", - "sp-genesis-builder", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-weights", - "tt-call", -] - -[[package]] -name = "frame-support-procedural" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "Inflector", - "cfg-expr", - "derive-syn-parse", - "expander 2.0.0", - "frame-support-procedural-tools", - "itertools", - "macro_magic", - "proc-macro-warning", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "frame-support-procedural-tools" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support-procedural-tools-derive", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "frame-support-procedural-tools-derive" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "frame-system" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "cfg-if", - "frame-support", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", - "sp-weights", -] - -[[package]] -name = "frame-system-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "frame-system-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "frame-try-runtime" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "fs-err" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ebd3504ad6116843b8375ad70df74e7bfe83cac77a1f3fe73200c844d43bfe0" - -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "fs4" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea55201cc351fdb478217c0fb641b59813da9b4efe4c414a9d8f989a657d149" -dependencies = [ - "libc", - "rustix 0.35.13", - "winapi", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand 1.7.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite 0.2.12", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "futures-rustls" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" -dependencies = [ - "futures-io", - "rustls 0.20.7", - "webpki 0.22.0", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite 0.2.12", - "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.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" -dependencies = [ - "opaque-debug 0.3.0", - "polyval 0.5.3", -] - -[[package]] -name = "ghash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug 0.3.0", - "polyval 0.6.1", -] - -[[package]] -name = "gimli" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec7af912d60cdbd3677c1af9352ebae6fb8394d165568a2234df0fa00f87793" -dependencies = [ - "fallible-iterator", - "indexmap 1.9.1", - "stable_deref_trait", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "globset" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" -dependencies = [ - "aho-corasick", - "bstr 0.2.17", - "fnv", - "log", - "regex", -] - -[[package]] -name = "glutton-runtime" -version = "1.0.0" -dependencies = [ - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcm", - "cumulus-primitives-core", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "pallet-glutton", - "pallet-sudo", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.0", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.1", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "handlebars" -version = "4.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d6a30320f094710245150395bc763ad23128d6a1ebbad7594dc4164b62c56b" -dependencies = [ - "log", - "pest", - "pest_derive", - "quick-error 2.0.1", - "serde", - "serde_json", -] - -[[package]] -name = "hash-db" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" - -[[package]] -name = "hash256-std-hasher" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" -dependencies = [ - "crunchy", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.6", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.2", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" -dependencies = [ - "ahash 0.8.2", - "allocator-api2", -] - -[[package]] -name = "heck" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" - -[[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 = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hkdf" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" -dependencies = [ - "hmac 0.12.1", -] - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.1", - "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.7", -] - -[[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 0.14.6", - "hmac 0.8.1", -] - -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - -[[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.4", -] - -[[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 0.2.12", -] - -[[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.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error 1.2.3", -] - -[[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.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa 0.4.8", - "pin-project-lite 0.2.12", - "socket2 0.4.9", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" -dependencies = [ - "http", - "hyper", - "log", - "rustls 0.20.7", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.23.2", - "webpki-roots", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" -dependencies = [ - "http", - "hyper", - "log", - "rustls 0.21.1", - "rustls-native-certs", - "tokio", - "tokio-rustls 0.24.1", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "if-addrs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "if-watch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9465340214b296cd17a0009acdb890d6160010b8adf8f78a00d0d7ab270f79f" -dependencies = [ - "async-io", - "core-foundation", - "fnv", - "futures", - "if-addrs", - "ipnet", - "log", - "rtnetlink", - "system-configuration", - "tokio", - "windows", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-num-traits" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" -dependencies = [ - "integer-sqrt", - "num-traits", - "uint", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "include_dir" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "indexmap" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "indexmap-nostd" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" - -[[package]] -name = "indicatif" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" -dependencies = [ - "console", - "number_prefix", - "portable-atomic", - "unicode-width", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array 0.14.6", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer-encoding" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90c11140ffea82edce8dcd74137ce9324ec24b3cf0175fc9d7e29164da9915b8" - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "integration-tests-common" -version = "1.0.0" -dependencies = [ - "asset-hub-kusama-runtime", - "asset-hub-polkadot-runtime", - "asset-hub-westend-runtime", - "bp-messages", - "bp-runtime", - "bridge-hub-kusama-runtime", - "bridge-hub-polkadot-runtime", - "bridge-hub-rococo-runtime", - "bridge-runtime-common", - "collectives-polkadot-runtime", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "frame-support", - "frame-system", - "kusama-runtime", - "kusama-runtime-constants", - "lazy_static", - "pallet-assets", - "pallet-balances", - "pallet-bridge-messages", - "pallet-im-online", - "pallet-message-queue", - "pallet-staking", - "pallet-xcm", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "paste", - "penpal-runtime", - "polkadot-core-primitives", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime", - "polkadot-runtime-constants", - "polkadot-runtime-parachains", - "polkadot-service", - "rococo-runtime", - "rococo-runtime-constants", - "sc-consensus-grandpa", - "sp-authority-discovery", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-runtime", - "sp-weights", - "westend-runtime", - "westend-runtime-constants", - "xcm", - "xcm-emulator", - "xcm-executor", -] - -[[package]] -name = "interceptor" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" -dependencies = [ - "async-trait", - "bytes", - "log", - "rand 0.8.5", - "rtcp", - "rtp", - "thiserror", - "tokio", - "waitgroup", - "webrtc-srtp", - "webrtc-util", -] - -[[package]] -name = "intx" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f38a50a899dc47a6d0ed5508e7f601a2e34c3a85303514b5d137f3c10a0c75" - -[[package]] -name = "io-lifetimes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074" - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ip_network" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" - -[[package]] -name = "ipconfig" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723519edce41262b05d4143ceb95050e4c614f483e78e9fd9e39a8275a84ad98" -dependencies = [ - "socket2 0.4.9", - "widestring", - "winapi", - "winreg", -] - -[[package]] -name = "ipnet" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" - -[[package]] -name = "is-terminal" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes 1.0.11", - "rustix 0.37.19", - "windows-sys 0.48.0", -] - -[[package]] -name = "is_executable" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8" -dependencies = [ - "winapi", -] - -[[package]] -name = "itertools" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" -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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" - -[[package]] -name = "jobserver" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonrpsee" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d291e3a5818a2384645fd9756362e6d89cf0541b0b916fa7702ea4a9833608e" -dependencies = [ - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-proc-macros", - "jsonrpsee-server", - "jsonrpsee-types", - "jsonrpsee-ws-client", - "tracing", -] - -[[package]] -name = "jsonrpsee-client-transport" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965de52763f2004bc91ac5bcec504192440f0b568a5d621c59d9dbd6f886c3fb" -dependencies = [ - "futures-util", - "http", - "jsonrpsee-core", - "jsonrpsee-types", - "pin-project", - "rustls-native-certs", - "soketto", - "thiserror", - "tokio", - "tokio-rustls 0.23.2", - "tokio-util", - "tracing", - "webpki-roots", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e70b4439a751a5de7dd5ed55eacff78ebf4ffe0fc009cb1ebb11417f5b536b" -dependencies = [ - "anyhow", - "arrayvec 0.7.4", - "async-lock", - "async-trait", - "beef", - "futures-channel", - "futures-timer", - "futures-util", - "globset", - "hyper", - "jsonrpsee-types", - "parking_lot 0.12.1", - "rand 0.8.5", - "rustc-hash", - "serde", - "serde_json", - "soketto", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc345b0a43c6bc49b947ebeb936e886a419ee3d894421790c969cc56040542ad" -dependencies = [ - "async-trait", - "hyper", - "hyper-rustls 0.23.0", - "jsonrpsee-core", - "jsonrpsee-types", - "rustc-hash", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa6da1e4199c10d7b1d0a6e5e8bd8e55f351163b6f4b3cbb044672a69bd4c1c" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb69dad85df79527c019659a992498d03f8495390496da2f07e6c24c2b356fc" -dependencies = [ - "futures-channel", - "futures-util", - "http", - "hyper", - "jsonrpsee-core", - "jsonrpsee-types", - "serde", - "serde_json", - "soketto", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd522fe1ce3702fd94812965d7bb7a3364b1c9aba743944c5a00529aae80f8c" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "jsonrpsee-ws-client" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b83daeecfc6517cfe210df24e570fb06213533dfb990318fae781f4c7119dd9" -dependencies = [ - "http", - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-types", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if", - "ecdsa 0.16.7", - "elliptic-curve 0.13.5", - "once_cell", - "sha2 0.10.7", -] - -[[package]] -name = "keccak" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" - -[[package]] -name = "kusama-runtime" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "kusama-runtime-constants", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-bounties", - "pallet-child-bounties", - "pallet-collective", - "pallet-conviction-voting", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-message-queue", - "pallet-multisig", - "pallet-nis", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-preimage", - "pallet-proxy", - "pallet-ranked-collective", - "pallet-recovery", - "pallet-referenda", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-society", - "pallet-staking", - "pallet-staking-runtime-api", - "pallet-state-trie-migration", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-whitelist", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "kusama-runtime-constants" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "kvdb" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d770dcb02bf6835887c3a979b5107a04ff4bbde97a5f0928d27404a155add9" -dependencies = [ - "smallvec", -] - -[[package]] -name = "kvdb-memorydb" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" -dependencies = [ - "kvdb", - "parking_lot 0.12.1", -] - -[[package]] -name = "kvdb-rocksdb" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b644c70b92285f66bfc2032922a79000ea30af7bc2ab31902992a5dcb9b434f6" -dependencies = [ - "kvdb", - "num_cpus", - "parking_lot 0.12.1", - "regex", - "rocksdb", - "smallvec", -] - -[[package]] -name = "landlock" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520baa32708c4e957d2fc3a186bc5bd8d26637c33137f399ddfc202adb240068" -dependencies = [ - "enumflags2", - "libc", - "thiserror", -] - -[[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.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "libloading" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe203d669ec979b7128619bae5a63b7b42e9203c1b29146079ee05e2f604b52" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libm" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" - -[[package]] -name = "libm" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" - -[[package]] -name = "libp2p" -version = "0.51.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f210d259724eae82005b5c48078619b7745edb7b76de370b03f8ba59ea103097" -dependencies = [ - "bytes", - "futures", - "futures-timer", - "getrandom 0.2.8", - "instant", - "libp2p-allow-block-list", - "libp2p-connection-limits", - "libp2p-core", - "libp2p-dns", - "libp2p-identify", - "libp2p-identity", - "libp2p-kad", - "libp2p-mdns", - "libp2p-metrics", - "libp2p-noise", - "libp2p-ping", - "libp2p-quic", - "libp2p-request-response", - "libp2p-swarm", - "libp2p-tcp", - "libp2p-wasm-ext", - "libp2p-webrtc", - "libp2p-websocket", - "libp2p-yamux", - "multiaddr", - "pin-project", -] - -[[package]] -name = "libp2p-allow-block-list" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510daa05efbc25184458db837f6f9a5143888f1caa742426d92e1833ddd38a50" -dependencies = [ - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "void", -] - -[[package]] -name = "libp2p-connection-limits" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4caa33f1d26ed664c4fe2cca81a08c8e07d4c1c04f2f4ac7655c2dd85467fda0" -dependencies = [ - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "void", -] - -[[package]] -name = "libp2p-core" -version = "0.39.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c1df63c0b582aa434fb09b2d86897fa2b419ffeccf934b36f87fcedc8e835c2" -dependencies = [ - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-identity", - "log", - "multiaddr", - "multihash", - "multistream-select", - "once_cell", - "parking_lot 0.12.1", - "pin-project", - "quick-protobuf", - "rand 0.8.5", - "rw-stream-sink", - "smallvec", - "thiserror", - "unsigned-varint", - "void", -] - -[[package]] -name = "libp2p-dns" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554" -dependencies = [ - "futures", - "libp2p-core", - "log", - "parking_lot 0.12.1", - "smallvec", - "trust-dns-resolver", -] - -[[package]] -name = "libp2p-identify" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5455f472243e63b9c497ff320ded0314254a9eb751799a39c283c6f20b793f3c" -dependencies = [ - "asynchronous-codec", - "either", - "futures", - "futures-timer", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "log", - "lru 0.10.0", - "quick-protobuf", - "quick-protobuf-codec", - "smallvec", - "thiserror", - "void", -] - -[[package]] -name = "libp2p-identity" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e2d584751cecb2aabaa56106be6be91338a60a0f4e420cf2af639204f596fc1" -dependencies = [ - "bs58", - "ed25519-dalek", - "log", - "multiaddr", - "multihash", - "quick-protobuf", - "rand 0.8.5", - "sha2 0.10.7", - "thiserror", - "zeroize", -] - -[[package]] -name = "libp2p-kad" -version = "0.43.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39d5ef876a2b2323d63c258e63c2f8e36f205fe5a11f0b3095d59635650790ff" -dependencies = [ - "arrayvec 0.7.4", - "asynchronous-codec", - "bytes", - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "log", - "quick-protobuf", - "rand 0.8.5", - "sha2 0.10.7", - "smallvec", - "thiserror", - "uint", - "unsigned-varint", - "void", -] - -[[package]] -name = "libp2p-mdns" -version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19983e1f949f979a928f2c603de1cf180cc0dc23e4ac93a62651ccb18341460b" -dependencies = [ - "data-encoding", - "futures", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "log", - "rand 0.8.5", - "smallvec", - "socket2 0.4.9", - "tokio", - "trust-dns-proto", - "void", -] - -[[package]] -name = "libp2p-metrics" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46" -dependencies = [ - "libp2p-core", - "libp2p-identify", - "libp2p-kad", - "libp2p-ping", - "libp2p-swarm", - "prometheus-client", -] - -[[package]] -name = "libp2p-noise" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3673da89d29936bc6435bafc638e2f184180d554ce844db65915113f86ec5e" -dependencies = [ - "bytes", - "curve25519-dalek 3.2.0", - "futures", - "libp2p-core", - "libp2p-identity", - "log", - "once_cell", - "quick-protobuf", - "rand 0.8.5", - "sha2 0.10.7", - "snow", - "static_assertions", - "thiserror", - "x25519-dalek 1.1.1", - "zeroize", -] - -[[package]] -name = "libp2p-ping" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202" -dependencies = [ - "either", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-swarm", - "log", - "rand 0.8.5", - "void", -] - -[[package]] -name = "libp2p-quic" -version = "0.7.0-alpha.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b26abd81cd2398382a1edfe739b539775be8a90fa6914f39b2ab49571ec735" -dependencies = [ - "bytes", - "futures", - "futures-timer", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-tls", - "log", - "parking_lot 0.12.1", - "quinn-proto", - "rand 0.8.5", - "rustls 0.20.7", - "thiserror", - "tokio", -] - -[[package]] -name = "libp2p-request-response" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffdb374267d42dc5ed5bc53f6e601d4a64ac5964779c6e40bb9e4f14c1e30d5" -dependencies = [ - "async-trait", - "futures", - "instant", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm", - "rand 0.8.5", - "smallvec", -] - -[[package]] -name = "libp2p-swarm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903b3d592d7694e56204d211f29d31bc004be99386644ba8731fc3e3ef27b296" -dependencies = [ - "either", - "fnv", - "futures", - "futures-timer", - "instant", - "libp2p-core", - "libp2p-identity", - "libp2p-swarm-derive", - "log", - "rand 0.8.5", - "smallvec", - "tokio", - "void", -] - -[[package]] -name = "libp2p-swarm-derive" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" -dependencies = [ - "heck", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "libp2p-tcp" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf" -dependencies = [ - "futures", - "futures-timer", - "if-watch", - "libc", - "libp2p-core", - "log", - "socket2 0.4.9", - "tokio", -] - -[[package]] -name = "libp2p-tls" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08d13d0dc66e5e9ba6279c1de417b84fa0d0adc3b03e5732928c180ec02781" -dependencies = [ - "futures", - "futures-rustls", - "libp2p-core", - "libp2p-identity", - "rcgen 0.10.0", - "ring 0.16.20", - "rustls 0.20.7", - "thiserror", - "webpki 0.22.0", - "x509-parser 0.14.0", - "yasna", -] - -[[package]] -name = "libp2p-wasm-ext" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77dff9d32353a5887adb86c8afc1de1a94d9e8c3bc6df8b2201d7cdf5c848f43" -dependencies = [ - "futures", - "js-sys", - "libp2p-core", - "parity-send-wrapper", - "wasm-bindgen", - "wasm-bindgen-futures", -] - -[[package]] -name = "libp2p-webrtc" -version = "0.4.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba48592edbc2f60b4bc7c10d65445b0c3964c07df26fdf493b6880d33be36f8" -dependencies = [ - "async-trait", - "asynchronous-codec", - "bytes", - "futures", - "futures-timer", - "hex", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-noise", - "log", - "multihash", - "quick-protobuf", - "quick-protobuf-codec", - "rand 0.8.5", - "rcgen 0.9.3", - "serde", - "stun", - "thiserror", - "tinytemplate", - "tokio", - "tokio-util", - "webrtc", -] - -[[package]] -name = "libp2p-websocket" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111273f7b3d3510524c752e8b7a5314b7f7a1fee7e68161c01a7d72cbb06db9f" -dependencies = [ - "either", - "futures", - "futures-rustls", - "libp2p-core", - "log", - "parking_lot 0.12.1", - "quicksink", - "rw-stream-sink", - "soketto", - "url", - "webpki-roots", -] - -[[package]] -name = "libp2p-yamux" -version = "0.43.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd21d950662700a385d4c6d68e2f5f54d778e97068cdd718522222ef513bda" -dependencies = [ - "futures", - "libp2p-core", - "log", - "thiserror", - "yamux", -] - -[[package]] -name = "librocksdb-sys" -version = "0.11.0+8.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e" -dependencies = [ - "bindgen", - "bzip2-sys", - "cc", - "glob", - "libc", - "libz-sys", - "tikv-jemalloc-sys", -] - -[[package]] -name = "libsecp256k1" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0452aac8bab02242429380e9b2f94ea20cea2b37e2c1777a1358799bbe97f37" -dependencies = [ - "arrayref", - "base64 0.13.0", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.8.5", - "serde", - "sha2 0.9.8", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libz-sys" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "link-cplusplus" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" -dependencies = [ - "cc", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" - -[[package]] -name = "linked_hash_set" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "linregress" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475015a7f8f017edb28d2e69813be23500ad4b32cfe3421c4148efc97324ee52" -dependencies = [ - "nalgebra", -] - -[[package]] -name = "linux-raw-sys" -version = "0.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" - -[[package]] -name = "linux-raw-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f9f08d8963a6c613f4b1a78f4f4a4dbfadf8e6545b2d72861731e4858b8b47f" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" - -[[package]] -name = "lock_api" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "lru" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" -dependencies = [ - "hashbrown 0.12.3", -] - -[[package]] -name = "lru" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" -dependencies = [ - "hashbrown 0.13.2", -] - -[[package]] -name = "lru" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eedb2bdbad7e0634f83989bf596f497b070130daaa398ab22d84c39e266deec5" -dependencies = [ - "hashbrown 0.14.0", -] - -[[package]] -name = "lru-cache" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] - -[[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 = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - -[[package]] -name = "macro_magic" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aee866bfee30d2d7e83835a4574aad5b45adba4cc807f2a3bbba974e5d4383c9" -dependencies = [ - "macro_magic_core", - "macro_magic_macros", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "macro_magic_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e766a20fd9c72bab3e1e64ed63f36bd08410e75803813df210d1ce297d7ad00" -dependencies = [ - "const-random", - "derive-syn-parse", - "macro_magic_core_macros", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "macro_magic_core_macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12469fc165526520dff2807c2975310ab47cf7190a45b99b49a7dc8befab17b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "macro_magic_macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fb85ec1620619edf2984a7693497d4ec88a9665d8b87e942856884c92dbf2a" -dependencies = [ - "macro_magic_core", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "matrixmultiply" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" -dependencies = [ - "rawpointer", -] - -[[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - -[[package]] -name = "memfd" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b20a59d985586e4a5aef64564ac77299f8586d8be6cf9106a5a40207e8908efb" -dependencies = [ - "rustix 0.36.7", -] - -[[package]] -name = "memmap2" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4647a11b578fead29cdbb34d4adef8dd3dc35b876c9c6d5240d83f205abfe96e" -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 = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memory-db" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" -dependencies = [ - "hash-db", -] - -[[package]] -name = "merlin" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.5.1", - "zeroize", -] - -[[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 = "mick-jaeger" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532" -dependencies = [ - "futures", - "rand 0.8.5", - "thrift", -] - -[[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.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" -dependencies = [ - "adler", -] - -[[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.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "mmr-gadget" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "log", - "parity-scale-codec", - "sc-client-api", - "sc-offchain", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-consensus-beefy", - "sp-core", - "sp-mmr-primitives", - "sp-runtime", -] - -[[package]] -name = "mmr-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "anyhow", - "jsonrpsee", - "parity-scale-codec", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-mmr-primitives", - "sp-runtime", -] - -[[package]] -name = "mockall" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4a1c770583dac7ab5e2f6c139153b783a53a1bbee9729613f193e59828326" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "lazy_static", - "mockall_derive", - "predicates 2.1.1", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832663583d5fa284ca8810bf7015e46c9fff9622d3cf34bd1eea5003fec06dd0" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "multiaddr" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" -dependencies = [ - "arrayref", - "byteorder", - "data-encoding", - "log", - "multibase", - "multihash", - "percent-encoding", - "serde", - "static_assertions", - "unsigned-varint", - "url", -] - -[[package]] -name = "multibase" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" -dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", -] - -[[package]] -name = "multihash" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" -dependencies = [ - "blake2b_simd", - "blake2s_simd", - "blake3", - "core2", - "digest 0.10.7", - "multihash-derive", - "sha2 0.10.7", - "sha3", - "unsigned-varint", -] - -[[package]] -name = "multihash-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" -dependencies = [ - "proc-macro-crate", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - -[[package]] -name = "multistream-select" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" -dependencies = [ - "bytes", - "futures", - "log", - "pin-project", - "smallvec", - "unsigned-varint", -] - -[[package]] -name = "nalgebra" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6515c882ebfddccaa73ead7320ca28036c4bc84c9bcca3cc0cbba8efe89223a" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232c68884c0c99810a5a4d333ef7e47689cfd0edc85efc9e54e1e6bf5212766" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "names" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" -dependencies = [ - "rand 0.8.5", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" - -[[package]] -name = "netlink-packet-core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" -dependencies = [ - "anyhow", - "byteorder", - "libc", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-route" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" -dependencies = [ - "anyhow", - "bitflags 1.3.2", - "byteorder", - "libc", - "netlink-packet-core", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-utils" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25af9cf0dc55498b7bd94a1508af7a78706aa0ab715a73c5169273e03c84845e" -dependencies = [ - "anyhow", - "byteorder", - "paste", - "thiserror", -] - -[[package]] -name = "netlink-proto" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" -dependencies = [ - "bytes", - "futures", - "log", - "netlink-packet-core", - "netlink-sys", - "thiserror", - "tokio", -] - -[[package]] -name = "netlink-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b654097027250401127914afb37cb1f311df6610a9891ff07a757e94199027" -dependencies = [ - "bytes", - "futures", - "libc", - "log", - "tokio", -] - -[[package]] -name = "nix" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "pin-utils", - "static_assertions", -] - -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - -[[package]] -name = "nom" -version = "7.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" -dependencies = [ - "memchr", - "minimal-lexical", - "version_check", -] - -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - -[[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-format" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b862ff8df690cf089058c98b183676a7ed0f974cc08b426800093227cbff3b" -dependencies = [ - "arrayvec 0.7.4", - "itoa 1.0.4", -] - -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -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 = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "object" -version = "0.30.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" -dependencies = [ - "crc32fast", - "hashbrown 0.13.2", - "indexmap 1.9.1", - "memchr", -] - -[[package]] -name = "oid-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" -dependencies = [ - "asn1-rs 0.3.1", -] - -[[package]] -name = "oid-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" -dependencies = [ - "asn1-rs 0.5.2", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "oorandom" -version = "11.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl-probe" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" - -[[package]] -name = "orchestra" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227585216d05ba65c7ab0a0450a3cf2cbd81a98862a54c4df8e14d5ac6adb015" -dependencies = [ - "async-trait", - "dyn-clonable", - "futures", - "futures-timer", - "orchestra-proc-macro", - "pin-project", - "prioritized-metered-channel", - "thiserror", - "tracing", -] - -[[package]] -name = "orchestra-proc-macro" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2871aadd82a2c216ee68a69837a526dfe788ecbe74c4c5038a6acdbff6653066" -dependencies = [ - "expander 0.0.6", - "itertools", - "petgraph", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ordered-float" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" -dependencies = [ - "num-traits", -] - -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.7", -] - -[[package]] -name = "p384" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.7", -] - -[[package]] -name = "packed_simd_2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" -dependencies = [ - "cfg-if", - "libm 0.1.4", -] - -[[package]] -name = "pallet-alliance" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-collective", - "pallet-identity", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-core-hashing", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-asset-conversion" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-asset-conversion-tx-payment" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "pallet-asset-conversion", - "pallet-transaction-payment", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-asset-tx-payment" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-transaction-payment", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-assets" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-aura" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-aura", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-authority-discovery" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-authority-discovery", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-authorship" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-babe" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-babe", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-bags-list" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "aquamarine", - "docify", - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-tracing", -] - -[[package]] -name = "pallet-balances" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-beefy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-consensus-beefy", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-beefy-mmr" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "binary-merkle-tree", - "frame-support", - "frame-system", - "log", - "pallet-beefy", - "pallet-mmr", - "pallet-session", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-consensus-beefy", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-bounties" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-bridge-grandpa" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-runtime", - "bp-test-utils", - "finality-grandpa", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-trie", -] - -[[package]] -name = "pallet-bridge-messages" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-runtime", - "bp-test-utils", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "num-traits", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-bridge-parachains" -version = "0.1.0" -dependencies = [ - "bp-header-chain", - "bp-parachains", - "bp-polkadot-core", - "bp-runtime", - "bp-test-utils", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-bridge-grandpa", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-trie", -] - -[[package]] -name = "pallet-bridge-relayers" -version = "0.1.0" -dependencies = [ - "bp-messages", - "bp-relayers", - "bp-runtime", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-balances", - "pallet-bridge-messages", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-child-bounties" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-bounties", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-collator-selection" -version = "3.0.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-session", - "pallet-timestamp", - "parity-scale-codec", - "rand 0.8.5", - "scale-info", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", - "sp-tracing", -] - -[[package]] -name = "pallet-collective" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-contracts" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "bitflags 1.3.2", - "environmental", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-balances", - "pallet-contracts-primitives", - "pallet-contracts-proc-macro", - "parity-scale-codec", - "rand 0.8.5", - "rand_pcg", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "wasm-instrument 0.4.0", - "wasmi", -] - -[[package]] -name = "pallet-contracts-primitives" -version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "bitflags 1.3.2", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", - "sp-weights", -] - -[[package]] -name = "pallet-contracts-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "pallet-conviction-voting" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "assert_matches", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-core-fellowship" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-democracy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-election-provider-multi-phase" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-election-provider-support-benchmarking", - "parity-scale-codec", - "rand 0.8.5", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-std", - "strum", -] - -[[package]] -name = "pallet-election-provider-support-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-system", - "parity-scale-codec", - "sp-npos-elections", - "sp-runtime", -] - -[[package]] -name = "pallet-elections-phragmen" -version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-fast-unstake" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-glutton" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "blake2", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-consensus-grandpa", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-identity" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "enumflags2", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-im-online" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "parity-scale-codec", - "scale-info", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-indices" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-insecure-randomness-collective-flip" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "safe-mix", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-membership" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-message-queue" -version = "7.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-weights", -] - -[[package]] -name = "pallet-mmr" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-mmr-primitives", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-multisig" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-nft-fractionalization" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-assets", - "pallet-nfts", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-nfts" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "enumflags2", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-nfts-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "pallet-nfts", - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "pallet-nis" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-nomination-pools" -version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", - "sp-tracing", -] - -[[package]] -name = "pallet-nomination-pools-benchmarking" -version = "1.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "pallet-bags-list", - "pallet-nomination-pools", - "pallet-staking", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-runtime-interface", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-nomination-pools-runtime-api" -version = "1.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "pallet-nomination-pools", - "parity-scale-codec", - "sp-api", - "sp-std", -] - -[[package]] -name = "pallet-offences" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "log", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-offences-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-babe", - "pallet-balances", - "pallet-grandpa", - "pallet-im-online", - "pallet-offences", - "pallet-session", - "pallet-staking", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-parachain-template" -version = "0.1.0" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", -] - -[[package]] -name = "pallet-preimage" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-proxy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-ranked-collective" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-recovery" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-referenda" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "assert_matches", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-salary" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-scheduler" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "docify", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", - "sp-weights", -] - -[[package]] -name = "pallet-session" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-timestamp", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-trie", -] - -[[package]] -name = "pallet-session-benchmarking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-session", - "pallet-staking", - "rand 0.8.5", - "sp-runtime", - "sp-session", - "sp-std", -] - -[[package]] -name = "pallet-society" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "rand_chacha 0.2.2", - "scale-info", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-staking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "log", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "rand_chacha 0.2.2", - "scale-info", - "serde", - "sp-application-crypto", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-staking-reward-curve" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "pallet-staking-reward-fn" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "log", - "sp-arithmetic", -] - -[[package]] -name = "pallet-staking-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "pallet-state-trie-migration" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-sudo" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-std", - "sp-timestamp", -] - -[[package]] -name = "pallet-tips" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-treasury", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-transaction-payment" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-transaction-payment-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "jsonrpsee", - "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "pallet-transaction-payment-rpc-runtime-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "pallet-transaction-payment", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "pallet-treasury" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "pallet-balances", - "parity-scale-codec", - "scale-info", - "serde", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-uniques" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-utility" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-vesting" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-whitelist" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-xcm" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bounded-collections", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", - "xcm-executor", -] - -[[package]] -name = "pallet-xcm-benchmarks" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "parity-scale-codec", - "scale-info", - "sp-io", - "sp-runtime", - "sp-std", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "parachain-info" -version = "0.1.0" -dependencies = [ - "cumulus-primitives-core", - "frame-support", - "frame-system", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "parachain-template-node" -version = "0.1.0" -dependencies = [ - "clap", - "color-print", - "cumulus-client-cli", - "cumulus-client-consensus-aura", - "cumulus-client-consensus-common", - "cumulus-client-service", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-relay-chain-interface", - "frame-benchmarking", - "frame-benchmarking-cli", - "futures", - "jsonrpsee", - "log", - "pallet-transaction-payment-rpc", - "parachain-template-runtime", - "parity-scale-codec", - "polkadot-cli", - "polkadot-primitives", - "sc-basic-authorship", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-executor", - "sc-network", - "sc-network-sync", - "sc-offchain", - "sc-rpc", - "sc-service", - "sc-sysinfo", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "sc-transaction-pool-api", - "serde", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-timestamp", - "substrate-build-script-utils", - "substrate-frame-rpc-system", - "substrate-prometheus-endpoint", - "try-runtime-cli", - "xcm", -] - -[[package]] -name = "parachain-template-runtime" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-parachain-template", - "pallet-session", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-xcm", - "parachain-info", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-runtime-common", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "parachains-common" -version = "1.0.0" -dependencies = [ - "cumulus-primitives-core", - "cumulus-primitives-utility", - "frame-support", - "frame-system", - "num-traits", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "parity-scale-codec", - "polkadot-primitives", - "scale-info", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "parachains-runtimes-test-utils" -version = "1.0.0" -dependencies = [ - "assets-common", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-test-relay-sproof-builder", - "frame-support", - "frame-system", - "hex-literal", - "pallet-assets", - "pallet-balances", - "pallet-collator-selection", - "pallet-session", - "pallet-xcm", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-parachain", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "substrate-wasm-builder", - "xcm", - "xcm-executor", -] - -[[package]] -name = "parity-db" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4890dcb9556136a4ec2b0c51fa4a08c8b733b829506af8fff2e853f3a065985b" -dependencies = [ - "blake2", - "crc32fast", - "fs2", - "hex", - "libc", - "log", - "lz4", - "memmap2", - "parking_lot 0.12.1", - "rand 0.8.5", - "siphasher", - "snap", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" -dependencies = [ - "arrayvec 0.7.4", - "bitvec", - "byte-slice-cast", - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a296c3079b5fefbc499e1de58dc26c09b1b9a5952d26694ee89f04a43ebbb3e" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parity-send-wrapper" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" - -[[package]] -name = "parity-util-mem" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d32c34f4f5ca7f9196001c0aba5a1f9a5a12382c8944b8b0f90233282d1e8f8" -dependencies = [ - "cfg-if", - "ethereum-types", - "hashbrown 0.12.3", - "impl-trait-for-tuples", - "lru 0.8.1", - "parity-util-mem-derive", - "parking_lot 0.12.1", - "primitive-types", - "smallvec", - "winapi", -] - -[[package]] -name = "parity-util-mem-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" -dependencies = [ - "proc-macro2", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - -[[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.5", -] - -[[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.1", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.10", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.2.10", - "smallvec", - "windows-sys 0.32.0", -] - -[[package]] -name = "partial_sort" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156" - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pbkdf2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" -dependencies = [ - "crypto-mac 0.11.1", -] - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[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.0", -] - -[[package]] -name = "pem-rfc7468" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" -dependencies = [ - "base64ct", -] - -[[package]] -name = "penpal-runtime" -version = "0.9.27" -dependencies = [ - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-asset-tx-payment", - "pallet-assets", - "pallet-aura", - "pallet-authorship", - "pallet-balances", - "pallet-collator-selection", - "pallet-session", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-xcm", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "scale-info", - "smallvec", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1 0.8.2", -] - -[[package]] -name = "petgraph" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" -dependencies = [ - "fixedbitset", - "indexmap 1.9.1", -] - -[[package]] -name = "pin-project" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - -[[package]] -name = "pin-project-lite" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" - -[[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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.7", - "spki 0.7.2", -] - -[[package]] -name = "pkg-config" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" - -[[package]] -name = "platforms" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" - -[[package]] -name = "plotters" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" - -[[package]] -name = "plotters-svg" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "polkadot-approval-distribution" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "futures-timer", - "polkadot-node-jaeger", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "tracing-gum", -] - -[[package]] -name = "polkadot-availability-bitfield-distribution" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "futures-timer", - "polkadot-node-network-protocol", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "tracing-gum", -] - -[[package]] -name = "polkadot-availability-distribution" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "derive_more", - "fatality", - "futures", - "lru 0.11.0", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "sp-core", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-availability-recovery" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "fatality", - "futures", - "lru 0.11.0", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "sc-network", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-cli" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "clap", - "frame-benchmarking-cli", - "futures", - "log", - "polkadot-node-metrics", - "polkadot-performance-test", - "polkadot-service", - "sc-cli", - "sc-executor", - "sc-service", - "sc-storage-monitor", - "sc-sysinfo", - "sc-tracing", - "sp-core", - "sp-io", - "sp-keyring", - "sp-maybe-compressed-blob", - "substrate-build-script-utils", - "thiserror", - "try-runtime-cli", -] - -[[package]] -name = "polkadot-collator-protocol" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "always-assert", - "bitvec", - "fatality", - "futures", - "futures-timer", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-core", - "sp-keystore", - "sp-runtime", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-core-primitives" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "polkadot-dispute-distribution" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "derive_more", - "fatality", - "futures", - "futures-timer", - "indexmap 1.9.1", - "lru 0.11.0", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sc-network", - "sp-application-crypto", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-erasure-coding" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-primitives", - "reed-solomon-novelpoly", - "sp-core", - "sp-trie", - "thiserror", -] - -[[package]] -name = "polkadot-gossip-support" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "futures-timer", - "polkadot-node-network-protocol", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "rand 0.8.5", - "rand_chacha 0.3.1", - "sc-network", - "sc-network-common", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "tracing-gum", -] - -[[package]] -name = "polkadot-network-bridge" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "always-assert", - "async-trait", - "bytes", - "fatality", - "futures", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "sc-network", - "sp-consensus", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-collation-generation" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-core", - "sp-maybe-compressed-blob", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-approval-voting" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "derive_more", - "futures", - "futures-timer", - "kvdb", - "lru 0.11.0", - "merlin 2.0.1", - "parity-scale-codec", - "polkadot-node-jaeger", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sc-keystore", - "schnorrkel", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-runtime", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-av-store" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "futures", - "futures-timer", - "kvdb", - "parity-scale-codec", - "polkadot-erasure-coding", - "polkadot-node-jaeger", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sp-consensus", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-backing" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "fatality", - "futures", - "polkadot-erasure-coding", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "polkadot-statement-table", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-bitfield-signing" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-keystore", - "thiserror", - "tracing-gum", - "wasm-timer", -] - -[[package]] -name = "polkadot-node-core-candidate-validation" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "parity-scale-codec", - "polkadot-node-core-pvf", - "polkadot-node-metrics", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-parachain", - "polkadot-primitives", - "sp-maybe-compressed-blob", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-chain-api" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "polkadot-node-metrics", - "polkadot-node-subsystem", - "polkadot-primitives", - "sc-client-api", - "sc-consensus-babe", - "sp-blockchain", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-chain-selection" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "futures-timer", - "kvdb", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-dispute-coordinator" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "fatality", - "futures", - "kvdb", - "lru 0.11.0", - "parity-scale-codec", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sc-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-parachains-inherent" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "sp-blockchain", - "sp-inherents", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-provisioner" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "fatality", - "futures", - "futures-timer", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "always-assert", - "futures", - "futures-timer", - "libc", - "parity-scale-codec", - "pin-project", - "polkadot-core-primitives", - "polkadot-node-core-pvf-common", - "polkadot-node-core-pvf-execute-worker", - "polkadot-node-core-pvf-prepare-worker", - "polkadot-node-metrics", - "polkadot-node-primitives", - "polkadot-parachain", - "polkadot-primitives", - "rand 0.8.5", - "slotmap", - "sp-core", - "sp-maybe-compressed-blob", - "sp-tracing", - "sp-wasm-interface", - "substrate-build-script-utils", - "tempfile", - "tokio", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf-checker" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-primitives", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf-common" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "cpu-time", - "futures", - "landlock", - "libc", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "sc-executor", - "sc-executor-common", - "sc-executor-wasmtime", - "sp-core", - "sp-externalities", - "sp-io", - "tokio", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf-execute-worker" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "cpu-time", - "futures", - "parity-scale-codec", - "polkadot-node-core-pvf-common", - "polkadot-parachain", - "polkadot-primitives", - "rayon", - "sp-core", - "sp-maybe-compressed-blob", - "sp-tracing", - "tikv-jemalloc-ctl", - "tokio", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-pvf-prepare-worker" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "libc", - "parity-scale-codec", - "polkadot-node-core-pvf-common", - "polkadot-parachain", - "polkadot-primitives", - "rayon", - "sc-executor", - "sc-executor-common", - "sc-executor-wasmtime", - "sp-io", - "sp-maybe-compressed-blob", - "sp-tracing", - "tikv-jemalloc-ctl", - "tokio", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-core-runtime-api" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "futures", - "lru 0.11.0", - "polkadot-node-metrics", - "polkadot-node-subsystem", - "polkadot-node-subsystem-types", - "polkadot-primitives", - "sp-consensus-babe", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-jaeger" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "lazy_static", - "log", - "mick-jaeger", - "parity-scale-codec", - "parking_lot 0.12.1", - "polkadot-node-primitives", - "polkadot-primitives", - "sc-network", - "sp-core", - "thiserror", - "tokio", -] - -[[package]] -name = "polkadot-node-metrics" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bs58", - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "polkadot-primitives", - "prioritized-metered-channel", - "sc-cli", - "sc-service", - "sc-tracing", - "substrate-prometheus-endpoint", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-network-protocol" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-channel", - "async-trait", - "derive_more", - "fatality", - "futures", - "hex", - "parity-scale-codec", - "polkadot-node-jaeger", - "polkadot-node-primitives", - "polkadot-primitives", - "rand 0.8.5", - "sc-authority-discovery", - "sc-network", - "strum", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-node-primitives" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bounded-vec", - "futures", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "schnorrkel", - "serde", - "sp-application-crypto", - "sp-consensus-babe", - "sp-core", - "sp-keystore", - "sp-maybe-compressed-blob", - "sp-runtime", - "thiserror", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "polkadot-node-subsystem" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "polkadot-node-jaeger", - "polkadot-node-subsystem-types", - "polkadot-overseer", -] - -[[package]] -name = "polkadot-node-subsystem-test-helpers" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-trait", - "futures", - "parking_lot 0.12.1", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sc-keystore", - "sp-application-crypto", - "sp-core", - "sp-keyring", - "sp-keystore", -] - -[[package]] -name = "polkadot-node-subsystem-types" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-trait", - "derive_more", - "futures", - "orchestra", - "polkadot-node-jaeger", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-primitives", - "polkadot-statement-table", - "sc-network", - "sc-transaction-pool-api", - "smallvec", - "sp-api", - "sp-authority-discovery", - "sp-consensus-babe", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "polkadot-node-subsystem-util" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-trait", - "derive_more", - "fatality", - "futures", - "futures-channel", - "itertools", - "kvdb", - "lru 0.11.0", - "parity-db", - "parity-scale-codec", - "parking_lot 0.11.2", - "pin-project", - "polkadot-node-jaeger", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-primitives", - "prioritized-metered-channel", - "rand 0.8.5", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-overseer" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "lru 0.11.0", - "orchestra", - "parking_lot 0.12.1", - "polkadot-node-metrics", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem-types", - "polkadot-primitives", - "sc-client-api", - "sp-api", - "sp-core", - "tikv-jemalloc-ctl", - "tracing-gum", -] - -[[package]] -name = "polkadot-parachain" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bounded-collections", - "derive_more", - "frame-support", - "parity-scale-codec", - "polkadot-core-primitives", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "polkadot-parachain-bin" -version = "0.9.430" -dependencies = [ - "assert_cmd", - "asset-hub-kusama-runtime", - "asset-hub-polkadot-runtime", - "asset-hub-westend-runtime", - "async-trait", - "bridge-hub-kusama-runtime", - "bridge-hub-polkadot-runtime", - "bridge-hub-rococo-runtime", - "clap", - "collectives-polkadot-runtime", - "color-print", - "contracts-rococo-runtime", - "cumulus-client-cli", - "cumulus-client-consensus-aura", - "cumulus-client-consensus-common", - "cumulus-client-consensus-relay-chain", - "cumulus-client-service", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-relay-chain-interface", - "frame-benchmarking", - "frame-benchmarking-cli", - "futures", - "glutton-runtime", - "hex-literal", - "jsonrpsee", - "log", - "nix 0.26.2", - "pallet-transaction-payment-rpc", - "parachains-common", - "parity-scale-codec", - "penpal-runtime", - "polkadot-cli", - "polkadot-primitives", - "polkadot-service", - "rococo-parachain-runtime", - "sc-basic-authorship", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-executor", - "sc-network", - "sc-network-sync", - "sc-rpc", - "sc-service", - "sc-sysinfo", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "sc-transaction-pool-api", - "seedling-runtime", - "serde", - "serde_json", - "shell-runtime", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus-aura", - "sp-core", - "sp-io", - "sp-keystore", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-timestamp", - "sp-transaction-pool", - "substrate-build-script-utils", - "substrate-frame-rpc-system", - "substrate-prometheus-endpoint", - "substrate-state-trie-migration-rpc", - "tempfile", - "tokio", - "try-runtime-cli", - "wait-timeout", - "xcm", -] - -[[package]] -name = "polkadot-performance-test" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "env_logger 0.9.0", - "kusama-runtime", - "log", - "polkadot-erasure-coding", - "polkadot-node-core-pvf-prepare-worker", - "polkadot-node-primitives", - "polkadot-primitives", - "quote", - "sc-executor-common", - "sp-maybe-compressed-blob", - "thiserror", -] - -[[package]] -name = "polkadot-primitives" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "hex-literal", - "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-authority-discovery", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "polkadot-rpc" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "jsonrpsee", - "mmr-rpc", - "pallet-transaction-payment-rpc", - "polkadot-primitives", - "sc-chain-spec", - "sc-client-api", - "sc-consensus-babe", - "sc-consensus-babe-rpc", - "sc-consensus-beefy", - "sc-consensus-beefy-rpc", - "sc-consensus-epochs", - "sc-consensus-grandpa", - "sc-consensus-grandpa-rpc", - "sc-rpc", - "sc-sync-state-rpc", - "sc-transaction-pool-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-keystore", - "sp-runtime", - "substrate-frame-rpc-system", - "substrate-state-trie-migration-rpc", -] - -[[package]] -name = "polkadot-runtime" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-bounties", - "pallet-child-bounties", - "pallet-collective", - "pallet-conviction-voting", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-message-queue", - "pallet-multisig", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-preimage", - "pallet-proxy", - "pallet-referenda", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-runtime-api", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-whitelist", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-constants", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-arithmetic", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "polkadot-runtime-common" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "libsecp256k1", - "log", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-election-provider-multi-phase", - "pallet-fast-unstake", - "pallet-session", - "pallet-staking", - "pallet-staking-reward-fn", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-treasury", - "pallet-vesting", - "parity-scale-codec", - "polkadot-primitives", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "slot-range-helper", - "sp-api", - "sp-core", - "sp-inherents", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "static_assertions", - "xcm", -] - -[[package]] -name = "polkadot-runtime-constants" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "polkadot-runtime-metrics" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bs58", - "parity-scale-codec", - "polkadot-primitives", - "sp-std", - "sp-tracing", -] - -[[package]] -name = "polkadot-runtime-parachains" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitflags 1.3.2", - "bitvec", - "derive_more", - "frame-benchmarking", - "frame-support", - "frame-system", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-message-queue", - "pallet-session", - "pallet-staking", - "pallet-timestamp", - "pallet-vesting", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-metrics", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rustc-hex", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "static_assertions", - "xcm", - "xcm-executor", -] - -[[package]] -name = "polkadot-service" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "async-trait", - "frame-benchmarking", - "frame-benchmarking-cli", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "futures", - "hex-literal", - "is_executable", - "kusama-runtime", - "kvdb", - "kvdb-rocksdb", - "log", - "lru 0.11.0", - "mmr-gadget", - "pallet-babe", - "pallet-im-online", - "pallet-staking", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "parity-db", - "parity-scale-codec", - "polkadot-approval-distribution", - "polkadot-availability-bitfield-distribution", - "polkadot-availability-distribution", - "polkadot-availability-recovery", - "polkadot-collator-protocol", - "polkadot-core-primitives", - "polkadot-dispute-distribution", - "polkadot-gossip-support", - "polkadot-network-bridge", - "polkadot-node-collation-generation", - "polkadot-node-core-approval-voting", - "polkadot-node-core-av-store", - "polkadot-node-core-backing", - "polkadot-node-core-bitfield-signing", - "polkadot-node-core-candidate-validation", - "polkadot-node-core-chain-api", - "polkadot-node-core-chain-selection", - "polkadot-node-core-dispute-coordinator", - "polkadot-node-core-parachains-inherent", - "polkadot-node-core-provisioner", - "polkadot-node-core-pvf", - "polkadot-node-core-pvf-checker", - "polkadot-node-core-runtime-api", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-types", - "polkadot-node-subsystem-util", - "polkadot-overseer", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-rpc", - "polkadot-runtime", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "polkadot-statement-distribution", - "rococo-runtime", - "rococo-runtime-constants", - "sc-authority-discovery", - "sc-basic-authorship", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-consensus-babe", - "sc-consensus-beefy", - "sc-consensus-grandpa", - "sc-consensus-slots", - "sc-executor", - "sc-keystore", - "sc-network", - "sc-network-common", - "sc-network-sync", - "sc-offchain", - "sc-service", - "sc-sync-state-rpc", - "sc-sysinfo", - "sc-telemetry", - "sc-transaction-pool", - "sc-transaction-pool-api", - "serde", - "serde_json", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-keystore", - "sp-mmr-primitives", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-storage", - "sp-timestamp", - "sp-transaction-pool", - "sp-trie", - "sp-version", - "sp-weights", - "substrate-prometheus-endpoint", - "thiserror", - "tracing-gum", - "westend-runtime", -] - -[[package]] -name = "polkadot-statement-distribution" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "arrayvec 0.5.2", - "fatality", - "futures", - "futures-timer", - "indexmap 1.9.1", - "parity-scale-codec", - "polkadot-node-network-protocol", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-node-subsystem-util", - "polkadot-primitives", - "sp-keystore", - "sp-staking", - "thiserror", - "tracing-gum", -] - -[[package]] -name = "polkadot-statement-table" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "parity-scale-codec", - "polkadot-primitives", - "sp-core", -] - -[[package]] -name = "polkadot-test-client" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-benchmarking", - "parity-scale-codec", - "polkadot-node-subsystem", - "polkadot-primitives", - "polkadot-test-runtime", - "polkadot-test-service", - "sc-block-builder", - "sc-consensus", - "sc-offchain", - "sc-service", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "substrate-test-client", -] - -[[package]] -name = "polkadot-test-runtime" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-grandpa", - "pallet-indices", - "pallet-offences", - "pallet-session", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-vesting", - "pallet-xcm", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "test-runtime-constants", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "polkadot-test-service" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-system", - "futures", - "hex", - "pallet-balances", - "pallet-staking", - "pallet-transaction-payment", - "polkadot-node-primitives", - "polkadot-node-subsystem", - "polkadot-overseer", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-rpc", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "polkadot-service", - "polkadot-test-runtime", - "rand 0.8.5", - "sc-authority-discovery", - "sc-chain-spec", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-consensus-babe", - "sc-consensus-grandpa", - "sc-network", - "sc-service", - "sc-tracing", - "sc-transaction-pool", - "sp-arithmetic", - "sp-authority-discovery", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-keyring", - "sp-runtime", - "sp-state-machine", - "substrate-test-client", - "tempfile", - "test-runtime-constants", - "tokio", - "tracing-gum", -] - -[[package]] -name = "polling" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" -dependencies = [ - "cfg-if", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "poly1305" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" -dependencies = [ - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.4.1", -] - -[[package]] -name = "polyval" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.4.1", -] - -[[package]] -name = "polyval" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug 0.3.0", - "universal-hash 0.5.1", -] - -[[package]] -name = "portable-atomic" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b" - -[[package]] -name = "portpicker" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be97d76faf1bfab666e1375477b23fde79eccf0276e9b63b92a39d676a889ba9" -dependencies = [ - "rand 0.8.5", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" - -[[package]] -name = "predicates" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" -dependencies = [ - "difflib", - "float-cmp", - "itertools", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba7d6ead3e3966038f68caa9fc1f860185d95a793180bbcfe0d0da47b3961ed" -dependencies = [ - "anstyle 0.3.4", - "difflib", - "itertools", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" - -[[package]] -name = "predicates-tree" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338c7be2905b732ae3984a2f40032b5e94fd8f52505b186c7d4d68d193445df7" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "prettyplease" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ceca8aaf45b5c46ec7ed39fff75f57290368c1846d33d24a122ca81416ab058" -dependencies = [ - "proc-macro2", - "syn 2.0.28", -] - -[[package]] -name = "primitive-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-num-traits", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "prioritized-metered-channel" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382698e48a268c832d0b181ed438374a6bb708a82a8ca273bb0f61c74cf209c4" -dependencies = [ - "coarsetime", - "crossbeam-queue", - "derive_more", - "futures", - "futures-timer", - "nanorand", - "thiserror", - "tracing", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -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", - "quote", - "syn 1.0.109", - "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", - "quote", - "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-macro-warning" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70550716265d1ec349c41f70dd4f964b4fd88394efe4405f0c1da679c4799a07" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prometheus" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f64969ffd5dd8f39bd57a68ac53c163a095ed9d0fb707146da1b27025a3504" -dependencies = [ - "cfg-if", - "fnv", - "lazy_static", - "memchr", - "parking_lot 0.11.2", - "thiserror", -] - -[[package]] -name = "prometheus-client" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" -dependencies = [ - "dtoa", - "itoa 1.0.4", - "parking_lot 0.12.1", - "prometheus-client-derive-encode", -] - -[[package]] -name = "prometheus-client-derive-encode" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "prost" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399c3c31cdec40583bb68f0b18403400d01ec4289c383aa047560439952c4dd7" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f835c582e6bd972ba8347313300219fed5bfa52caf175298d860b61ff6069bb" -dependencies = [ - "bytes", - "heck", - "itertools", - "lazy_static", - "log", - "multimap", - "petgraph", - "prost", - "prost-types", - "regex", - "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7345d5f0e08c0536d7ac7229952590239e77abf0a0100a1b1d890add6ea96364" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "prost-types" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dfaa718ad76a44b3415e6c4d53b17c8f99160dcb3a99b10470fce8ad43f6e3e" -dependencies = [ - "bytes", - "prost", -] - -[[package]] -name = "psm" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd136ff4382c4753fc061cb9e4712ab2af263376b95bbd5bd8cd50c020b78e69" -dependencies = [ - "cc", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quick-protobuf" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" -dependencies = [ - "byteorder", -] - -[[package]] -name = "quick-protobuf-codec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1693116345026436eb2f10b677806169c1a1260c1c60eaaffe3fb5a29ae23d8b" -dependencies = [ - "asynchronous-codec", - "bytes", - "quick-protobuf", - "thiserror", - "unsigned-varint", -] - -[[package]] -name = "quicksink" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" -dependencies = [ - "futures-core", - "futures-sink", - "pin-project-lite 0.1.12", -] - -[[package]] -name = "quinn-proto" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31999cfc7927c4e212e60fd50934ab40e8e8bfd2d493d6095d2d306bc0764d9" -dependencies = [ - "bytes", - "rand 0.8.5", - "ring 0.16.20", - "rustc-hash", - "rustls 0.20.7", - "slab", - "thiserror", - "tinyvec", - "tracing", - "webpki 0.22.0", -] - -[[package]] -name = "quote" -version = "1.0.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[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", -] - -[[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.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -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 0.16.20", - "time 0.3.25", - "x509-parser 0.13.2", - "yasna", -] - -[[package]] -name = "rcgen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" -dependencies = [ - "pem", - "ring 0.16.20", - "time 0.3.25", - "yasna", -] - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" -dependencies = [ - "getrandom 0.2.8", - "redox_syscall 0.2.10", -] - -[[package]] -name = "reed-solomon-novelpoly" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd8f48b2066e9f69ab192797d66da804d1935bf22763204ed3675740cb0f221" -dependencies = [ - "derive_more", - "fs-err", - "itertools", - "static_init 0.5.2", - "thiserror", -] - -[[package]] -name = "ref-cast" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "regalloc2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" -dependencies = [ - "fxhash", - "log", - "slice-group-by", - "smallvec", -] - -[[package]] -name = "regex" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" -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" -dependencies = [ - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" - -[[package]] -name = "resolv-conf" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error 1.2.3", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle", -] - -[[package]] -name = "ring" -version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#0e948f3c28cbacecdd3020403c4841c0eb339213" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "common", - "fflonk", - "merlin 3.0.0", -] - -[[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", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "rocksdb" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe" -dependencies = [ - "libc", - "librocksdb-sys", -] - -[[package]] -name = "rococo-parachain-runtime" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-aura-ext", - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-ping", - "cumulus-primitives-core", - "cumulus-primitives-timestamp", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "pallet-assets", - "pallet-aura", - "pallet-balances", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-xcm", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "polkadot-parachain", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "rococo-runtime" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "binary-merkle-tree", - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-beefy", - "pallet-beefy-mmr", - "pallet-bounties", - "pallet-child-bounties", - "pallet-collective", - "pallet-democracy", - "pallet-elections-phragmen", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-message-queue", - "pallet-mmr", - "pallet-multisig", - "pallet-nis", - "pallet-offences", - "pallet-preimage", - "pallet-proxy", - "pallet-recovery", - "pallet-scheduler", - "pallet-session", - "pallet-society", - "pallet-staking", - "pallet-state-trie-migration", - "pallet-sudo", - "pallet-timestamp", - "pallet-tips", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rococo-runtime-constants", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "rococo-runtime-constants" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "rpassword" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b763cb66df1c928432cc35053f8bd4cec3335d8559fc16010017d16b3c1680" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "rtcp" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" -dependencies = [ - "bytes", - "thiserror", - "webrtc-util", -] - -[[package]] -name = "rtnetlink" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" -dependencies = [ - "futures", - "log", - "netlink-packet-route", - "netlink-proto", - "nix 0.24.2", - "thiserror", - "tokio", -] - -[[package]] -name = "rtp" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" -dependencies = [ - "async-trait", - "bytes", - "rand 0.8.5", - "serde", - "thiserror", - "webrtc-util", -] - -[[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.35.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9" -dependencies = [ - "bitflags 1.3.2", - "errno 0.2.8", - "io-lifetimes 0.7.5", - "libc", - "linux-raw-sys 0.0.46", - "windows-sys 0.42.0", -] - -[[package]] -name = "rustix" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" -dependencies = [ - "bitflags 1.3.2", - "errno 0.2.8", - "io-lifetimes 1.0.11", - "libc", - "linux-raw-sys 0.1.3", - "windows-sys 0.42.0", -] - -[[package]] -name = "rustix" -version = "0.37.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" -dependencies = [ - "bitflags 1.3.2", - "errno 0.3.1", - "io-lifetimes 1.0.11", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" -dependencies = [ - "bitflags 2.3.3", - "errno 0.3.1", - "libc", - "linux-raw-sys 0.4.3", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.0", - "log", - "ring 0.16.20", - "sct 0.6.1", - "webpki 0.21.4", -] - -[[package]] -name = "rustls" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" -dependencies = [ - "log", - "ring 0.16.20", - "sct 0.7.0", - "webpki 0.22.0", -] - -[[package]] -name = "rustls" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e" -dependencies = [ - "log", - "ring 0.16.20", - "rustls-webpki", - "sct 0.7.0", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca9ebdfa27d3fc180e42879037b5338ab1c040c06affd00d8338598e7800943" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "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.0", -] - -[[package]] -name = "rustls-webpki" -version = "0.100.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" -dependencies = [ - "ring 0.16.20", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" - -[[package]] -name = "rw-stream-sink" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" -dependencies = [ - "futures", - "pin-project", - "static_assertions", -] - -[[package]] -name = "ryu" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" - -[[package]] -name = "safe-mix" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" -dependencies = [ - "rustc_version 0.2.3", -] - -[[package]] -name = "safe_arch" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529" -dependencies = [ - "bytemuck", -] - -[[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 = "sc-allocator" -version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "log", - "sp-core", - "sp-wasm-interface", - "thiserror", -] - -[[package]] -name = "sc-authority-discovery" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "ip_network", - "libp2p", - "log", - "multihash", - "parity-scale-codec", - "prost", - "prost-build", - "rand 0.8.5", - "sc-client-api", - "sc-network", - "sp-api", - "sp-authority-discovery", - "sp-blockchain", - "sp-core", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-basic-authorship" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "sc-block-builder", - "sc-client-api", - "sc-proposer-metrics", - "sc-telemetry", - "sc-transaction-pool-api", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-block-builder" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "sc-client-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", - "sp-inherents", - "sp-runtime", -] - -[[package]] -name = "sc-chain-spec" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "memmap2", - "sc-chain-spec-derive", - "sc-client-api", - "sc-executor", - "sc-network", - "sc-telemetry", - "serde", - "serde_json", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "sc-chain-spec-derive" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "sc-cli" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "chrono", - "clap", - "fdlimit", - "futures", - "libp2p-identity", - "log", - "names", - "parity-scale-codec", - "rand 0.8.5", - "regex", - "rpassword", - "sc-client-api", - "sc-client-db", - "sc-keystore", - "sc-network", - "sc-service", - "sc-telemetry", - "sc-tracing", - "sc-utils", - "serde", - "serde_json", - "sp-blockchain", - "sp-core", - "sp-keyring", - "sp-keystore", - "sp-panic-handler", - "sp-runtime", - "sp-version", - "thiserror", - "tiny-bip39", - "tokio", -] - -[[package]] -name = "sc-client-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "fnv", - "futures", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-executor", - "sc-transaction-pool-api", - "sc-utils", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-database", - "sp-externalities", - "sp-runtime", - "sp-state-machine", - "sp-statement-store", - "sp-storage", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-client-db" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "hash-db", - "kvdb", - "kvdb-memorydb", - "kvdb-rocksdb", - "linked-hash-map", - "log", - "parity-db", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-state-db", - "schnellru", - "sp-arithmetic", - "sp-blockchain", - "sp-core", - "sp-database", - "sp-runtime", - "sp-state-machine", - "sp-trie", -] - -[[package]] -name = "sc-consensus" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "libp2p-identity", - "log", - "mockall", - "parking_lot 0.12.1", - "sc-client-api", - "sc-utils", - "serde", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-state-machine", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-aura" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "futures", - "log", - "parity-scale-codec", - "sc-block-builder", - "sc-client-api", - "sc-consensus", - "sc-consensus-slots", - "sc-telemetry", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-aura", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-babe" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "fork-tree", - "futures", - "log", - "num-bigint", - "num-rational", - "num-traits", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-consensus", - "sc-consensus-epochs", - "sc-consensus-slots", - "sc-telemetry", - "sc-transaction-pool-api", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-babe-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "jsonrpsee", - "sc-consensus-babe", - "sc-consensus-epochs", - "sc-rpc-api", - "serde", - "sp-api", - "sp-application-crypto", - "sp-blockchain", - "sp-consensus", - "sp-consensus-babe", - "sp-core", - "sp-keystore", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-consensus-beefy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "async-channel", - "async-trait", - "fnv", - "futures", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-gossip", - "sc-network-sync", - "sc-utils", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-beefy", - "sp-core", - "sp-keystore", - "sp-mmr-primitives", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", - "wasm-timer", -] - -[[package]] -name = "sc-consensus-beefy-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "jsonrpsee", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-consensus-beefy", - "sc-rpc", - "serde", - "sp-consensus-beefy", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-consensus-epochs" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "fork-tree", - "parity-scale-codec", - "sc-client-api", - "sc-consensus", - "sp-blockchain", - "sp-runtime", -] - -[[package]] -name = "sc-consensus-grandpa" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "ahash 0.8.2", - "array-bytes", - "async-trait", - "dyn-clone", - "finality-grandpa", - "fork-tree", - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-common", - "sc-network-gossip", - "sc-telemetry", - "sc-transaction-pool-api", - "sc-utils", - "serde_json", - "sp-api", - "sp-application-crypto", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-core", - "sp-keystore", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-consensus-grandpa-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "finality-grandpa", - "futures", - "jsonrpsee", - "log", - "parity-scale-codec", - "sc-client-api", - "sc-consensus-grandpa", - "sc-rpc", - "serde", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-consensus-slots" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "log", - "parity-scale-codec", - "sc-client-api", - "sc-consensus", - "sc-telemetry", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "sc-executor" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-executor-common", - "sc-executor-wasmtime", - "schnellru", - "sp-api", - "sp-core", - "sp-externalities", - "sp-io", - "sp-panic-handler", - "sp-runtime-interface", - "sp-trie", - "sp-version", - "sp-wasm-interface", - "tracing", -] - -[[package]] -name = "sc-executor-common" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "sc-allocator", - "sp-maybe-compressed-blob", - "sp-wasm-interface", - "thiserror", - "wasm-instrument 0.3.0", -] - -[[package]] -name = "sc-executor-wasmtime" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "anyhow", - "cfg-if", - "libc", - "log", - "rustix 0.36.7", - "sc-allocator", - "sc-executor-common", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmtime", -] - -[[package]] -name = "sc-informant" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "ansi_term", - "futures", - "futures-timer", - "log", - "sc-client-api", - "sc-network", - "sc-network-common", - "sp-blockchain", - "sp-runtime", -] - -[[package]] -name = "sc-keystore" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "parking_lot 0.12.1", - "serde_json", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "thiserror", -] - -[[package]] -name = "sc-network" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "async-channel", - "async-trait", - "asynchronous-codec", - "bytes", - "either", - "fnv", - "futures", - "futures-timer", - "ip_network", - "libp2p", - "linked_hash_set", - "log", - "mockall", - "parity-scale-codec", - "parking_lot 0.12.1", - "partial_sort", - "pin-project", - "rand 0.8.5", - "sc-client-api", - "sc-network-common", - "sc-utils", - "serde", - "serde_json", - "smallvec", - "sp-arithmetic", - "sp-blockchain", - "sp-core", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", - "unsigned-varint", - "wasm-timer", - "zeroize", -] - -[[package]] -name = "sc-network-bitswap" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-channel", - "cid", - "futures", - "libp2p-identity", - "log", - "prost", - "prost-build", - "sc-client-api", - "sc-network", - "sp-blockchain", - "sp-runtime", - "thiserror", - "unsigned-varint", -] - -[[package]] -name = "sc-network-common" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "bitflags 1.3.2", - "futures", - "libp2p-identity", - "parity-scale-codec", - "prost-build", - "sc-consensus", - "sp-consensus", - "sp-consensus-grandpa", - "sp-runtime", -] - -[[package]] -name = "sc-network-gossip" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "ahash 0.8.2", - "futures", - "futures-timer", - "libp2p", - "log", - "sc-network", - "sc-network-common", - "schnellru", - "sp-runtime", - "substrate-prometheus-endpoint", - "tracing", -] - -[[package]] -name = "sc-network-light" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "async-channel", - "futures", - "libp2p-identity", - "log", - "parity-scale-codec", - "prost", - "prost-build", - "sc-client-api", - "sc-network", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-network-sync" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "async-channel", - "async-trait", - "fork-tree", - "futures", - "futures-timer", - "libp2p", - "log", - "mockall", - "parity-scale-codec", - "prost", - "prost-build", - "sc-client-api", - "sc-consensus", - "sc-network", - "sc-network-common", - "sc-utils", - "schnellru", - "smallvec", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-consensus-grandpa", - "sp-core", - "sp-runtime", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-network-transactions" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "futures", - "libp2p", - "log", - "parity-scale-codec", - "sc-network", - "sc-network-common", - "sc-utils", - "sp-consensus", - "sp-runtime", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-offchain" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "bytes", - "fnv", - "futures", - "futures-timer", - "hyper", - "hyper-rustls 0.24.0", - "libp2p", - "log", - "num_cpus", - "once_cell", - "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", - "sc-client-api", - "sc-network", - "sc-network-common", - "sc-transaction-pool-api", - "sc-utils", - "sp-api", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-offchain", - "sp-runtime", - "threadpool", - "tracing", -] - -[[package]] -name = "sc-proposer-metrics" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "log", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "jsonrpsee", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-rpc-api", - "sc-tracing", - "sc-transaction-pool-api", - "sc-utils", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-keystore", - "sp-offchain", - "sp-rpc", - "sp-runtime", - "sp-session", - "sp-statement-store", - "sp-version", - "tokio", -] - -[[package]] -name = "sc-rpc-api" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "jsonrpsee", - "parity-scale-codec", - "sc-chain-spec", - "sc-transaction-pool-api", - "scale-info", - "serde", - "serde_json", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-version", - "thiserror", -] - -[[package]] -name = "sc-rpc-server" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "http", - "jsonrpsee", - "log", - "serde_json", - "substrate-prometheus-endpoint", - "tokio", - "tower", - "tower-http", -] - -[[package]] -name = "sc-rpc-spec-v2" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "futures", - "futures-util", - "hex", - "jsonrpsee", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-chain-spec", - "sc-client-api", - "sc-transaction-pool-api", - "sc-utils", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-version", - "thiserror", - "tokio", - "tokio-stream", -] - -[[package]] -name = "sc-service" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "directories", - "exit-future", - "futures", - "futures-timer", - "jsonrpsee", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-executor", - "sc-informant", - "sc-keystore", - "sc-network", - "sc-network-bitswap", - "sc-network-common", - "sc-network-light", - "sc-network-sync", - "sc-network-transactions", - "sc-rpc", - "sc-rpc-server", - "sc-rpc-spec-v2", - "sc-sysinfo", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "sc-transaction-pool-api", - "sc-utils", - "serde", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-storage", - "sp-transaction-pool", - "sp-transaction-storage-proof", - "sp-trie", - "sp-version", - "static_init 1.0.3", - "substrate-prometheus-endpoint", - "tempfile", - "thiserror", - "tokio", - "tracing", - "tracing-futures", -] - -[[package]] -name = "sc-state-db" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sp-core", -] - -[[package]] -name = "sc-storage-monitor" -version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "clap", - "fs4", - "log", - "sc-client-db", - "sp-core", - "thiserror", - "tokio", -] - -[[package]] -name = "sc-sync-state-rpc" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "jsonrpsee", - "parity-scale-codec", - "sc-chain-spec", - "sc-client-api", - "sc-consensus-babe", - "sc-consensus-epochs", - "sc-consensus-grandpa", - "serde", - "serde_json", - "sp-blockchain", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-sysinfo" -version = "6.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "libc", - "log", - "rand 0.8.5", - "rand_pcg", - "regex", - "sc-telemetry", - "serde", - "serde_json", - "sp-core", - "sp-io", - "sp-std", -] - -[[package]] -name = "sc-telemetry" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "chrono", - "futures", - "libp2p", - "log", - "parking_lot 0.12.1", - "pin-project", - "rand 0.8.5", - "sc-utils", - "serde", - "serde_json", - "thiserror", - "wasm-timer", -] - -[[package]] -name = "sc-tracing" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "ansi_term", - "atty", - "chrono", - "lazy_static", - "libc", - "log", - "parking_lot 0.12.1", - "regex", - "rustc-hash", - "sc-client-api", - "sc-tracing-proc-macro", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-tracing", - "thiserror", - "tracing", - "tracing-log", - "tracing-subscriber", -] - -[[package]] -name = "sc-tracing-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "sc-transaction-pool" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "futures", - "futures-timer", - "linked-hash-map", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "sc-client-api", - "sc-transaction-pool-api", - "sc-utils", - "serde", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-tracing", - "sp-transaction-pool", - "substrate-prometheus-endpoint", - "thiserror", -] - -[[package]] -name = "sc-transaction-pool-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "futures", - "log", - "parity-scale-codec", - "serde", - "sp-blockchain", - "sp-core", - "sp-runtime", - "thiserror", -] - -[[package]] -name = "sc-utils" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-channel", - "futures", - "futures-timer", - "lazy_static", - "log", - "parking_lot 0.12.1", - "prometheus", - "sp-arithmetic", -] - -[[package]] -name = "scale-info" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" -dependencies = [ - "bitvec", - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", - "serde", -] - -[[package]] -name = "scale-info-derive" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "schannel" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -dependencies = [ - "lazy_static", - "winapi", -] - -[[package]] -name = "schnellru" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" -dependencies = [ - "ahash 0.8.2", - "cfg-if", - "hashbrown 0.13.2", -] - -[[package]] -name = "schnorrkel" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.3", - "getrandom 0.1.16", - "merlin 2.0.1", - "rand 0.7.3", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle", - "zeroize", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" - -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring 0.16.20", - "untrusted", -] - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring 0.16.20", - "untrusted", -] - -[[package]] -name = "sdp" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" -dependencies = [ - "rand 0.8.5", - "substring", - "thiserror", - "url", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.6", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48518a2b5775ba8ca5b46596aae011caa431e6ce7e4a67ead66d92f08884220e" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.7", - "generic-array 0.14.6", - "pkcs8 0.10.2", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9512ffd81e3a3503ed401f79c33168b9148c75038956039166cd750eaa037c3" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7058dc8eaf3f2810d7828680320acda0b25a288f6d288e19278e249bbf74226b" -dependencies = [ - "cc", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "seedling-runtime" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-parachain-system", - "cumulus-pallet-solo-to-para", - "cumulus-primitives-core", - "frame-executive", - "frame-support", - "frame-system", - "pallet-balances", - "pallet-sudo", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", -] - -[[package]] -name = "semver" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" -dependencies = [ - "semver-parser", -] - -[[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.183" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.183" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "serde_json" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" -dependencies = [ - "itoa 1.0.4", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "serde", -] - -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - -[[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", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha2" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" -dependencies = [ - "digest 0.10.7", - "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-runtime" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcm", - "cumulus-primitives-core", - "frame-executive", - "frame-support", - "frame-system", - "frame-try-runtime", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-block-builder", - "sp-core", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[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" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simba" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50582927ed6f77e4ac020c057f37a268fc6aebc29225050365aacbb9deeeddc4" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - -[[package]] -name = "siphasher" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" - -[[package]] -name = "slab" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" - -[[package]] -name = "slice-group-by" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b634d87b960ab1a38c4fe143b508576f075e7c978bfad18217645ebfdfa2ec" - -[[package]] -name = "slot-range-helper" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "enumn", - "parity-scale-codec", - "paste", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "slotmap" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "snap" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451" - -[[package]] -name = "snow" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ccba027ba85743e09d15c03296797cad56395089b832b48b5a5217880f57733" -dependencies = [ - "aes-gcm 0.9.4", - "blake2", - "chacha20poly1305", - "curve25519-dalek 4.0.0-rc.1", - "rand_core 0.6.4", - "ring 0.16.20", - "rustc_version 0.4.0", - "sha2 0.10.7", - "subtle", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "soketto" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" -dependencies = [ - "base64 0.13.0", - "bytes", - "flate2", - "futures", - "http", - "httparse", - "log", - "rand 0.8.5", - "sha-1 0.9.8", -] - -[[package]] -name = "sp-api" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "hash-db", - "log", - "parity-scale-codec", - "scale-info", - "sp-api-proc-macro", - "sp-core", - "sp-externalities", - "sp-metadata-ir", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", - "sp-version", - "thiserror", -] - -[[package]] -name = "sp-api-proc-macro" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "Inflector", - "blake2", - "expander 2.0.0", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "sp-application-crypto" -version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-io", - "sp-std", -] - -[[package]] -name = "sp-arithmetic" -version = "16.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "integer-sqrt", - "num-traits", - "parity-scale-codec", - "scale-info", - "serde", - "sp-std", - "static_assertions", -] - -[[package]] -name = "sp-authority-discovery" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-block-builder" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-blockchain" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "schnellru", - "sp-api", - "sp-consensus", - "sp-database", - "sp-runtime", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "sp-consensus" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "futures", - "log", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "thiserror", -] - -[[package]] -name = "sp-consensus-aura" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-application-crypto", - "sp-consensus-slots", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-babe" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-consensus-slots", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-beefy" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "lazy_static", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-mmr-primitives", - "sp-runtime", - "sp-std", - "strum", -] - -[[package]] -name = "sp-consensus-grandpa" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "finality-grandpa", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-consensus-slots" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-std", - "sp-timestamp", -] - -[[package]] -name = "sp-core" -version = "21.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "arrayvec 0.7.4", - "bandersnatch_vrfs", - "bitflags 1.3.2", - "blake2", - "bounded-collections", - "bs58", - "dyn-clonable", - "ed25519-zebra", - "futures", - "hash-db", - "hash256-std-hasher", - "impl-serde", - "lazy_static", - "libsecp256k1", - "log", - "merlin 2.0.1", - "parity-scale-codec", - "parking_lot 0.12.1", - "paste", - "primitive-types", - "rand 0.8.5", - "regex", - "scale-info", - "schnorrkel", - "secp256k1", - "secrecy", - "serde", - "sp-core-hashing", - "sp-debug-derive", - "sp-externalities", - "sp-runtime-interface", - "sp-std", - "sp-storage", - "ss58-registry", - "substrate-bip39", - "thiserror", - "tiny-bip39", - "tracing", - "zeroize", -] - -[[package]] -name = "sp-core-hashing" -version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "blake2b_simd", - "byteorder", - "digest 0.10.7", - "sha2 0.10.7", - "sha3", - "twox-hash", -] - -[[package]] -name = "sp-core-hashing-proc-macro" -version = "9.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "quote", - "sp-core-hashing", - "syn 2.0.28", -] - -[[package]] -name = "sp-database" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "kvdb", - "parking_lot 0.12.1", -] - -[[package]] -name = "sp-debug-derive" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "sp-externalities" -version = "0.19.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "environmental", - "parity-scale-codec", - "sp-std", - "sp-storage", -] - -[[package]] -name = "sp-genesis-builder" -version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "serde_json", - "sp-api", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-inherents" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "sp-runtime", - "sp-std", - "thiserror", -] - -[[package]] -name = "sp-io" -version = "23.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "bytes", - "ed25519", - "ed25519-dalek", - "libsecp256k1", - "log", - "parity-scale-codec", - "rustversion", - "secp256k1", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime-interface", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-trie", - "tracing", - "tracing-core", -] - -[[package]] -name = "sp-keyring" -version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "lazy_static", - "sp-core", - "sp-runtime", - "strum", -] - -[[package]] -name = "sp-keystore" -version = "0.27.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "parking_lot 0.12.1", - "sp-core", - "sp-externalities", - "thiserror", -] - -[[package]] -name = "sp-maybe-compressed-blob" -version = "4.1.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "thiserror", - "zstd 0.12.3+zstd.1.5.2", -] - -[[package]] -name = "sp-metadata-ir" -version = "0.1.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-metadata", - "parity-scale-codec", - "scale-info", - "sp-std", -] - -[[package]] -name = "sp-mmr-primitives" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "ckb-merkle-mountain-range", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-api", - "sp-core", - "sp-debug-derive", - "sp-runtime", - "sp-std", - "thiserror", -] - -[[package]] -name = "sp-npos-elections" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "sp-arithmetic", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-offchain" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "sp-api", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "sp-panic-handler" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "backtrace", - "lazy_static", - "regex", -] - -[[package]] -name = "sp-rpc" -version = "6.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "rustc-hash", - "serde", - "sp-core", -] - -[[package]] -name = "sp-runtime" -version = "24.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "either", - "hash256-std-hasher", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "paste", - "rand 0.8.5", - "scale-info", - "serde", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-std", - "sp-weights", -] - -[[package]] -name = "sp-runtime-interface" -version = "17.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec", - "primitive-types", - "sp-externalities", - "sp-runtime-interface-proc-macro", - "sp-std", - "sp-storage", - "sp-tracing", - "sp-wasm-interface", - "static_assertions", -] - -[[package]] -name = "sp-runtime-interface-proc-macro" -version = "11.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "Inflector", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "sp-session" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "scale-info", - "sp-api", - "sp-core", - "sp-keystore", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "sp-staking" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-state-machine" -version = "0.28.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "hash-db", - "log", - "parity-scale-codec", - "parking_lot 0.12.1", - "rand 0.8.5", - "smallvec", - "sp-core", - "sp-externalities", - "sp-panic-handler", - "sp-std", - "sp-trie", - "thiserror", - "tracing", - "trie-db", -] - -[[package]] -name = "sp-statement-store" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "aes-gcm 0.10.2", - "curve25519-dalek 3.2.0", - "ed25519-dalek", - "hkdf", - "parity-scale-codec", - "rand 0.8.5", - "scale-info", - "sha2 0.10.7", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-externalities", - "sp-runtime", - "sp-runtime-interface", - "sp-std", - "thiserror", - "x25519-dalek 2.0.0-pre.1", -] - -[[package]] -name = "sp-std" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" - -[[package]] -name = "sp-storage" -version = "13.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "ref-cast", - "serde", - "sp-debug-derive", - "sp-std", -] - -[[package]] -name = "sp-timestamp" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "sp-std", - "thiserror", -] - -[[package]] -name = "sp-tracing" -version = "10.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "sp-std", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "sp-transaction-pool" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "sp-api", - "sp-runtime", -] - -[[package]] -name = "sp-transaction-storage-proof" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "parity-scale-codec", - "scale-info", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-trie", -] - -[[package]] -name = "sp-trie" -version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "ahash 0.8.2", - "hash-db", - "hashbrown 0.13.2", - "lazy_static", - "memory-db", - "nohash-hasher", - "parity-scale-codec", - "parking_lot 0.12.1", - "scale-info", - "schnellru", - "sp-core", - "sp-std", - "thiserror", - "tracing", - "trie-db", - "trie-root", -] - -[[package]] -name = "sp-version" -version = "22.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "parity-wasm", - "scale-info", - "serde", - "sp-core-hashing-proc-macro", - "sp-runtime", - "sp-std", - "sp-version-proc-macro", - "thiserror", -] - -[[package]] -name = "sp-version-proc-macro" -version = "8.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "sp-wasm-interface" -version = "14.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "anyhow", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "sp-std", - "wasmtime", -] - -[[package]] -name = "sp-weights" -version = "20.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "parity-scale-codec", - "scale-info", - "serde", - "smallvec", - "sp-arithmetic", - "sp-core", - "sp-debug-derive", - "sp-std", -] - -[[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 = "spinners" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08615eea740067d9899969bc2891c68a19c315cb1f66640af9a9ecb91b13bcab" -dependencies = [ - "lazy_static", - "maplit", - "strum", -] - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der 0.7.7", -] - -[[package]] -name = "ss58-registry" -version = "1.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a9821878e1f13aba383aa40a86fb1b33c7265774ec91e32563cb1dd1577496" -dependencies = [ - "Inflector", - "num-format", - "proc-macro2", - "quote", - "serde", - "serde_json", - "unicode-xid", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "static_init" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b73400442027c4adedda20a9f9b7945234a5bd8d5f7e86da22bd5d0622369c" -dependencies = [ - "cfg_aliases", - "libc", - "parking_lot 0.11.2", - "static_init_macro 0.5.0", -] - -[[package]] -name = "static_init" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" -dependencies = [ - "bitflags 1.3.2", - "cfg_aliases", - "libc", - "parking_lot 0.11.2", - "parking_lot_core 0.8.5", - "static_init_macro 1.0.2", - "winapi", -] - -[[package]] -name = "static_init_macro" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2261c91034a1edc3fc4d1b80e89d82714faede0515c14a75da10cb941546bbf" -dependencies = [ - "cfg_aliases", - "memchr", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "static_init_macro" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" -dependencies = [ - "cfg_aliases", - "memchr", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[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.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "stun" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" -dependencies = [ - "base64 0.13.0", - "crc", - "lazy_static", - "md-5", - "rand 0.8.5", - "ring 0.16.20", - "subtle", - "thiserror", - "tokio", - "url", - "webrtc-util", -] - -[[package]] -name = "substrate-bip39" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" -dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", - "schnorrkel", - "sha2 0.9.8", - "zeroize", -] - -[[package]] -name = "substrate-build-script-utils" -version = "3.0.0" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" - -[[package]] -name = "substrate-frame-rpc-system" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "frame-system-rpc-runtime-api", - "futures", - "jsonrpsee", - "log", - "parity-scale-codec", - "sc-rpc-api", - "sc-transaction-pool-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "substrate-prometheus-endpoint" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "hyper", - "log", - "prometheus", - "thiserror", - "tokio", -] - -[[package]] -name = "substrate-rpc-client" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "jsonrpsee", - "log", - "sc-rpc-api", - "serde", - "sp-runtime", -] - -[[package]] -name = "substrate-state-trie-migration-rpc" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "jsonrpsee", - "parity-scale-codec", - "sc-client-api", - "sc-rpc-api", - "serde", - "sp-core", - "sp-runtime", - "sp-state-machine", - "sp-trie", - "trie-db", -] - -[[package]] -name = "substrate-test-client" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "array-bytes", - "async-trait", - "futures", - "parity-scale-codec", - "sc-client-api", - "sc-client-db", - "sc-consensus", - "sc-executor", - "sc-offchain", - "sc-service", - "serde", - "serde_json", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-keyring", - "sp-keystore", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "substrate-test-utils" -version = "4.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "futures", - "substrate-test-utils-derive", - "tokio", -] - -[[package]] -name = "substrate-test-utils-derive" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "substrate-wasm-builder" -version = "5.0.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "ansi_term", - "build-helper", - "cargo_metadata", - "filetime", - "parity-wasm", - "sp-maybe-compressed-blob", - "strum", - "tempfile", - "toml 0.7.6", - "walkdir", - "wasm-opt", -] - -[[package]] -name = "substring" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" -dependencies = [ - "autocfg", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - -[[package]] -name = "system-configuration" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "target-lexicon" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9410d0f6853b1d94f0e519fb95df60f29d2c1eff2d921ffdf01a4c8a3b54f12d" - -[[package]] -name = "tempfile" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" -dependencies = [ - "cfg-if", - "fastrand 2.0.0", - "redox_syscall 0.3.5", - "rustix 0.38.4", - "windows-sys 0.48.0", -] - -[[package]] -name = "termcolor" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "termtree" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13a4ec180a2de59b57434704ccfad967f789b12737738798fa08798cd5824c16" - -[[package]] -name = "test-runtime-constants" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "thiserror" -version = "1.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9207952ae1a003f42d3d5e892dac3c6ba42aa6ac0c79a6a91a2b5cb4253e75c" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1728216d3244de4f14f14f8c15c79be1a7c67867d28d69b719690e2a19fb445" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "thousands" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" - -[[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 = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "thrift" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b82ca8f46f95b3ce96081fe3dd89160fdea970c254bb72925255d1b62aae692e" -dependencies = [ - "byteorder", - "integer-encoding", - "log", - "ordered-float", - "threadpool", -] - -[[package]] -name = "tikv-jemalloc-ctl" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e37706572f4b151dff7a0146e040804e9c26fe3a3118591112f05cf12a4216c1" -dependencies = [ - "libc", - "paste", - "tikv-jemalloc-sys", -] - -[[package]] -name = "tikv-jemalloc-sys" -version = "0.5.2+5.3.0-patched" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec45c14da997d0925c7835883e4d5c181f196fa142f8c19d7643d1e9af2592c3" -dependencies = [ - "cc", - "fs_extra", - "libc", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fdd63d58b18d663fbdf70e049f00a22c8e42be082203be7f26589213cd75ea" -dependencies = [ - "deranged", - "itoa 1.0.4", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" -dependencies = [ - "time-core", -] - -[[package]] -name = "tiny-bip39" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" -dependencies = [ - "anyhow", - "hmac 0.12.1", - "once_cell", - "pbkdf2 0.11.0", - "rand 0.8.5", - "rustc-hash", - "sha2 0.10.7", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[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.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40de3a2ba249dcb097e01be5e67a5ff53cf250397715a071a81543e8a832a920" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite 0.2.12", - "signal-hook-registry", - "socket2 0.5.3", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "tokio-retry" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" -dependencies = [ - "pin-project", - "rand 0.8.5", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27d5f2b839802bd8267fa19b0530f5a08b9c08cd417976be2a65d130fe1c11b" -dependencies = [ - "rustls 0.20.7", - "tokio", - "webpki 0.22.0", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.1", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" -dependencies = [ - "futures-core", - "pin-project-lite 0.2.12", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite 0.2.12", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78" -dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658" -dependencies = [ - "bitflags 1.3.2", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-range-header", - "pin-project-lite 0.2.12", - "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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "log", - "pin-project-lite 0.2.12", - "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", - "quote", - "syn 1.0.109", -] - -[[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-gum" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "coarsetime", - "polkadot-node-jaeger", - "polkadot-primitives", - "tracing", - "tracing-gum-proc-macro", -] - -[[package]] -name = "tracing-gum-proc-macro" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "expander 2.0.0", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-serde" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "ansi_term", - "chrono", - "lazy_static", - "matchers", - "parking_lot 0.11.2", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "trie-db" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "767abe6ffed88a1889671a102c2861ae742726f52e0a5a425b92c9fbfa7e9c85" -dependencies = [ - "hash-db", - "hashbrown 0.13.2", - "log", - "rustc-hex", - "smallvec", -] - -[[package]] -name = "trie-root" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" -dependencies = [ - "hash-db", -] - -[[package]] -name = "trust-dns-proto" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "rand 0.8.5", - "smallvec", - "socket2 0.4.9", - "thiserror", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" -dependencies = [ - "cfg-if", - "futures-util", - "ipconfig", - "lazy_static", - "lru-cache", - "parking_lot 0.12.1", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "tracing", - "trust-dns-proto", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "try-runtime-cli" -version = "0.10.0-dev" -source = "git+https://github.com/paritytech/substrate?branch=master#e53cf32cce1f1f9416e09183b2b0dbdb0a50367d" -dependencies = [ - "async-trait", - "clap", - "frame-remote-externalities", - "frame-try-runtime", - "hex", - "log", - "parity-scale-codec", - "sc-cli", - "sc-executor", - "serde", - "serde_json", - "sp-api", - "sp-consensus-aura", - "sp-consensus-babe", - "sp-core", - "sp-debug-derive", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-rpc", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "sp-transaction-storage-proof", - "sp-version", - "sp-weights", - "substrate-rpc-client", - "zstd 0.12.3+zstd.1.5.2", -] - -[[package]] -name = "tt-call" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e66dcbec4290c69dd03c57e76c2469ea5c7ce109c6dd4351c13055cf71ea055" - -[[package]] -name = "turn" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" -dependencies = [ - "async-trait", - "base64 0.13.0", - "futures", - "log", - "md-5", - "rand 0.8.5", - "ring 0.16.20", - "stun", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "digest 0.10.7", - "rand 0.8.5", - "static_assertions", -] - -[[package]] -name = "typenum" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" - -[[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-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array 0.14.6", - "subtle", -] - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unsigned-varint" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" -dependencies = [ - "asynchronous-codec", - "bytes", - "futures-io", - "futures-util", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" -dependencies = [ - "form_urlencoded", - "idna 0.4.0", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" -dependencies = [ - "getrandom 0.2.8", -] - -[[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 = "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 = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waitgroup" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" -dependencies = [ - "atomic-waker", -] - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi", - "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.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.28", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "wasm-instrument" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" -dependencies = [ - "parity-wasm", -] - -[[package]] -name = "wasm-instrument" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a47ecb37b9734d1085eaa5ae1a81e60801fd8c28d4cabdd8aedb982021918bc" -dependencies = [ - "parity-wasm", -] - -[[package]] -name = "wasm-opt" -version = "0.114.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d005a95f934878a1fb446a816d51c3601a0120ff929005ba3bab3c749cfd1c7" -dependencies = [ - "anyhow", - "libc", - "strum", - "strum_macros", - "tempfile", - "thiserror", - "wasm-opt-cxx-sys", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-cxx-sys" -version = "0.114.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d04e240598162810fad3b2e96fa0dec6dba1eb65a03f3bd99a9248ab8b56caa" -dependencies = [ - "anyhow", - "cxx", - "cxx-build", - "wasm-opt-sys", -] - -[[package]] -name = "wasm-opt-sys" -version = "0.114.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efd2aaca519d64098c4faefc8b7433a97ed511caf4c9e516384eb6aef1ff4f9" -dependencies = [ - "anyhow", - "cc", - "cxx", - "cxx-build", -] - -[[package]] -name = "wasm-timer" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" -dependencies = [ - "futures", - "js-sys", - "parking_lot 0.11.2", - "pin-utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmi" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51fb5c61993e71158abf5bb863df2674ca3ec39ed6471c64f07aeaf751d67b4" -dependencies = [ - "intx", - "smallvec", - "spin 0.9.4", - "wasmi_arena", - "wasmi_core", - "wasmparser-nostd", -] - -[[package]] -name = "wasmi_arena" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401c1f35e413fac1846d4843745589d9ec678977ab35a384db8ae7830525d468" - -[[package]] -name = "wasmi_core" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624e6333e861ef49095d2d678b76ebf30b06bf37effca845be7e5b87c90071b7" -dependencies = [ - "downcast-rs", - "libm 0.2.1", - "num-traits", - "paste", -] - -[[package]] -name = "wasmparser" -version = "0.102.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" -dependencies = [ - "indexmap 1.9.1", - "url", -] - -[[package]] -name = "wasmparser-nostd" -version = "0.100.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" -dependencies = [ - "indexmap-nostd", -] - -[[package]] -name = "wasmtime" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" -dependencies = [ - "anyhow", - "bincode", - "cfg-if", - "indexmap 1.9.1", - "libc", - "log", - "object", - "once_cell", - "paste", - "psm", - "rayon", - "serde", - "target-lexicon", - "wasmparser", - "wasmtime-cache", - "wasmtime-cranelift", - "wasmtime-environ", - "wasmtime-jit", - "wasmtime-runtime", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-asm-macros" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "wasmtime-cache" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86437fa68626fe896e5afc69234bb2b5894949083586535f200385adfd71213" -dependencies = [ - "anyhow", - "base64 0.21.1", - "bincode", - "directories-next", - "file-per-thread-logger", - "log", - "rustix 0.36.7", - "serde", - "sha2 0.10.7", - "toml 0.5.10", - "windows-sys 0.45.0", - "zstd 0.11.2+zstd.1.5.2", -] - -[[package]] -name = "wasmtime-cranelift" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cefde0cce8cb700b1b21b6298a3837dba46521affd7b8c38a9ee2c869eee04" -dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "cranelift-wasm", - "gimli", - "log", - "object", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-cranelift-shared", - "wasmtime-environ", -] - -[[package]] -name = "wasmtime-cranelift-shared" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd041e382ef5aea1b9fc78442394f1a4f6d676ce457e7076ca4cb3f397882f8b" -dependencies = [ - "anyhow", - "cranelift-codegen", - "cranelift-native", - "gimli", - "object", - "target-lexicon", - "wasmtime-environ", -] - -[[package]] -name = "wasmtime-environ" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" -dependencies = [ - "anyhow", - "cranelift-entity", - "gimli", - "indexmap 1.9.1", - "log", - "object", - "serde", - "target-lexicon", - "thiserror", - "wasmparser", - "wasmtime-types", -] - -[[package]] -name = "wasmtime-jit" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" -dependencies = [ - "addr2line", - "anyhow", - "bincode", - "cfg-if", - "cpp_demangle", - "gimli", - "log", - "object", - "rustc-demangle", - "serde", - "target-lexicon", - "wasmtime-environ", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-jit-debug" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" -dependencies = [ - "object", - "once_cell", - "rustix 0.36.7", -] - -[[package]] -name = "wasmtime-jit-icache-coherence" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" -dependencies = [ - "cfg-if", - "libc", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-runtime" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" -dependencies = [ - "anyhow", - "cc", - "cfg-if", - "indexmap 1.9.1", - "libc", - "log", - "mach", - "memfd", - "memoffset 0.8.0", - "paste", - "rand 0.8.5", - "rustix 0.36.7", - "wasmtime-asm-macros", - "wasmtime-environ", - "wasmtime-jit-debug", - "windows-sys 0.45.0", -] - -[[package]] -name = "wasmtime-types" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" -dependencies = [ - "cranelift-entity", - "serde", - "thiserror", - "wasmparser", -] - -[[package]] -name = "web-sys" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" -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 0.16.20", - "untrusted", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring 0.16.20", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552ceb903e957524388c4d3475725ff2c8b7960922063af6ce53c9a43da07449" -dependencies = [ - "webpki 0.22.0", -] - -[[package]] -name = "webrtc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "hex", - "interceptor", - "lazy_static", - "log", - "rand 0.8.5", - "rcgen 0.9.3", - "regex", - "ring 0.16.20", - "rtcp", - "rtp", - "rustls 0.19.1", - "sdp", - "serde", - "serde_json", - "sha2 0.10.7", - "stun", - "thiserror", - "time 0.3.25", - "tokio", - "turn", - "url", - "waitgroup", - "webrtc-data", - "webrtc-dtls", - "webrtc-ice", - "webrtc-mdns", - "webrtc-media", - "webrtc-sctp", - "webrtc-srtp", - "webrtc-util", -] - -[[package]] -name = "webrtc-data" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" -dependencies = [ - "bytes", - "derive_builder", - "log", - "thiserror", - "tokio", - "webrtc-sctp", - "webrtc-util", -] - -[[package]] -name = "webrtc-dtls" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942be5bd85f072c3128396f6e5a9bfb93ca8c1939ded735d177b7bcba9a13d05" -dependencies = [ - "aes 0.6.0", - "aes-gcm 0.10.2", - "async-trait", - "bincode", - "block-modes", - "byteorder", - "ccm", - "curve25519-dalek 3.2.0", - "der-parser 8.2.0", - "elliptic-curve 0.12.3", - "hkdf", - "hmac 0.12.1", - "log", - "oid-registry 0.6.1", - "p256", - "p384", - "rand 0.8.5", - "rand_core 0.6.4", - "rcgen 0.9.3", - "ring 0.16.20", - "rustls 0.19.1", - "sec1 0.3.0", - "serde", - "sha1", - "sha2 0.10.7", - "signature 1.6.4", - "subtle", - "thiserror", - "tokio", - "webpki 0.21.4", - "webrtc-util", - "x25519-dalek 2.0.0-pre.1", - "x509-parser 0.13.2", -] - -[[package]] -name = "webrtc-ice" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a03cc11e9a7d7b4f9f99870558fe37a102b65b93f8045392fef7c67b39e80" -dependencies = [ - "arc-swap", - "async-trait", - "crc", - "log", - "rand 0.8.5", - "serde", - "serde_json", - "stun", - "thiserror", - "tokio", - "turn", - "url", - "uuid", - "waitgroup", - "webrtc-mdns", - "webrtc-util", -] - -[[package]] -name = "webrtc-mdns" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" -dependencies = [ - "log", - "socket2 0.4.9", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-media" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f72e1650a8ae006017d1a5280efb49e2610c19ccc3c0905b03b648aee9554991" -dependencies = [ - "byteorder", - "bytes", - "rand 0.8.5", - "rtp", - "thiserror", -] - -[[package]] -name = "webrtc-sctp" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "crc", - "log", - "rand 0.8.5", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-srtp" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "aes-gcm 0.9.4", - "async-trait", - "byteorder", - "bytes", - "ctr 0.8.0", - "hmac 0.11.0", - "log", - "rtcp", - "rtp", - "sha-1 0.9.8", - "subtle", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-util" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" -dependencies = [ - "async-trait", - "bitflags 1.3.2", - "bytes", - "cc", - "ipnet", - "lazy_static", - "libc", - "log", - "nix 0.24.2", - "rand 0.8.5", - "thiserror", - "tokio", - "winapi", -] - -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - -[[package]] -name = "westend-runtime" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bitvec", - "frame-benchmarking", - "frame-election-provider-support", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-bags-list", - "pallet-balances", - "pallet-collective", - "pallet-democracy", - "pallet-election-provider-multi-phase", - "pallet-election-provider-support-benchmarking", - "pallet-elections-phragmen", - "pallet-fast-unstake", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-message-queue", - "pallet-multisig", - "pallet-nomination-pools", - "pallet-nomination-pools-benchmarking", - "pallet-nomination-pools-runtime-api", - "pallet-offences", - "pallet-offences-benchmarking", - "pallet-preimage", - "pallet-proxy", - "pallet-recovery", - "pallet-scheduler", - "pallet-session", - "pallet-session-benchmarking", - "pallet-society", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-staking-runtime-api", - "pallet-state-trie-migration", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "pallet-xcm", - "pallet-xcm-benchmarks", - "parity-scale-codec", - "polkadot-parachain", - "polkadot-primitives", - "polkadot-runtime-common", - "polkadot-runtime-parachains", - "rustc-hex", - "scale-info", - "serde", - "serde_derive", - "smallvec", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-consensus-beefy", - "sp-core", - "sp-inherents", - "sp-io", - "sp-mmr-primitives", - "sp-npos-elections", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", - "westend-runtime-constants", - "xcm", - "xcm-builder", - "xcm-executor", -] - -[[package]] -name = "westend-runtime-constants" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-support", - "polkadot-primitives", - "polkadot-runtime-common", - "smallvec", - "sp-core", - "sp-runtime", - "sp-weights", -] - -[[package]] -name = "which" -version = "4.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea187a8ef279bc014ec368c27a920da2024d2a711109bfbe3440585d5cf27ad9" -dependencies = [ - "either", - "lazy_static", - "libc", -] - -[[package]] -name = "wide" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feff0a412894d67223777b6cc8d68c0dab06d52d95e9890d5f2d47f10dd9366c" -dependencies = [ - "bytemuck", - "safe_arch", -] - -[[package]] -name = "widestring" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" - -[[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-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", -] - -[[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" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" -dependencies = [ - "windows_aarch64_msvc 0.34.0", - "windows_i686_gnu 0.34.0", - "windows_i686_msvc 0.34.0", - "windows_x86_64_gnu 0.34.0", - "windows_x86_64_msvc 0.34.0", -] - -[[package]] -name = "windows-sys" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" -dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" - -[[package]] -name = "windows_i686_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" - -[[package]] -name = "windows_i686_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winnow" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" -dependencies = [ - "winapi", -] - -[[package]] -name = "wyz" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" -dependencies = [ - "tap", -] - -[[package]] -name = "x25519-dalek" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" -dependencies = [ - "curve25519-dalek 3.2.0", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "x25519-dalek" -version = "2.0.0-pre.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df" -dependencies = [ - "curve25519-dalek 3.2.0", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "x509-parser" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" -dependencies = [ - "asn1-rs 0.3.1", - "base64 0.13.0", - "data-encoding", - "der-parser 7.0.0", - "lazy_static", - "nom", - "oid-registry 0.4.0", - "ring 0.16.20", - "rusticata-macros", - "thiserror", - "time 0.3.25", -] - -[[package]] -name = "x509-parser" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" -dependencies = [ - "asn1-rs 0.5.2", - "base64 0.13.0", - "data-encoding", - "der-parser 8.2.0", - "lazy_static", - "nom", - "oid-registry 0.6.1", - "rusticata-macros", - "thiserror", - "time 0.3.25", -] - -[[package]] -name = "xcm" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "bounded-collections", - "derivative", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "scale-info", - "serde", - "sp-weights", - "xcm-procedural", -] - -[[package]] -name = "xcm-builder" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-transaction-payment", - "parity-scale-codec", - "polkadot-parachain", - "scale-info", - "sp-arithmetic", - "sp-io", - "sp-runtime", - "sp-std", - "sp-weights", - "xcm", - "xcm-executor", -] - -[[package]] -name = "xcm-emulator" -version = "0.1.0" -dependencies = [ - "cumulus-pallet-dmp-queue", - "cumulus-pallet-parachain-system", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", - "cumulus-test-relay-sproof-builder", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "lazy_static", - "log", - "pallet-balances", - "pallet-message-queue", - "parachain-info", - "parachains-common", - "parity-scale-codec", - "paste", - "polkadot-primitives", - "polkadot-runtime-parachains", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-trie", - "xcm", - "xcm-executor", -] - -[[package]] -name = "xcm-executor" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "environmental", - "frame-benchmarking", - "frame-support", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "sp-arithmetic", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-weights", - "xcm", -] - -[[package]] -name = "xcm-procedural" -version = "0.9.43" -source = "git+https://github.com/paritytech/polkadot?branch=master#39397a5a82ff6ab77ce39e7af9113c7c9cbd4c1e" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "syn 2.0.28", -] - -[[package]] -name = "yamux" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" -dependencies = [ - "futures", - "log", - "nohash-hasher", - "parking_lot 0.12.1", - "rand 0.8.5", - "static_assertions", -] - -[[package]] -name = "yasna" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" -dependencies = [ - "time 0.3.25", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "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 5.0.2+zstd.1.5.2", -] - -[[package]] -name = "zstd" -version = "0.12.3+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" -dependencies = [ - "zstd-safe 6.0.5+zstd.1.5.4", -] - -[[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-safe" -version = "6.0.5+zstd.1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" -dependencies = [ - "cc", - "libc", - "pkg-config", -] diff --git a/cumulus/Cargo.toml b/cumulus/Cargo.toml deleted file mode 100644 index 4ae4ea191ae9..000000000000 --- a/cumulus/Cargo.toml +++ /dev/null @@ -1,82 +0,0 @@ -[workspace] -resolver = "2" - -members = [ - "bridges/bin/runtime-common", - "bridges/modules/grandpa", - "bridges/modules/messages", - "bridges/modules/parachains", - "bridges/modules/relayers", - "client/cli", - "client/collator", - "client/consensus/aura", - "client/consensus/common", - "client/consensus/proposer", - "client/consensus/relay-chain", - "client/network", - "client/pov-recovery", - "client/relay-chain-inprocess-interface", - "client/relay-chain-interface", - "client/relay-chain-minimal-node", - "client/relay-chain-rpc-interface", - "client/service", - "pallets/aura-ext", - "pallets/collator-selection", - "pallets/dmp-queue", - "pallets/parachain-system", - "pallets/parachain-system/proc-macro", - "pallets/session-benchmarking", - "pallets/solo-to-para", - "pallets/xcm", - "pallets/xcmp-queue", - "parachain-template/node", - "parachain-template/pallets/template", - "parachain-template/runtime", - "parachains/common", - "parachains/integration-tests/emulated/assets/asset-hub-kusama", - "parachains/integration-tests/emulated/assets/asset-hub-polkadot", - "parachains/integration-tests/emulated/assets/asset-hub-westend", - "parachains/integration-tests/emulated/bridges/bridge-hub-rococo", - "parachains/integration-tests/emulated/collectives/collectives-polkadot", - "parachains/integration-tests/emulated/common", - "parachains/pallets/parachain-info", - "parachains/pallets/ping", - "parachains/runtimes/assets/asset-hub-kusama", - "parachains/runtimes/assets/asset-hub-polkadot", - "parachains/runtimes/assets/asset-hub-westend", - "parachains/runtimes/assets/common", - "parachains/runtimes/assets/test-utils", - "parachains/runtimes/bridge-hubs/bridge-hub-kusama", - "parachains/runtimes/bridge-hubs/bridge-hub-polkadot", - "parachains/runtimes/bridge-hubs/bridge-hub-rococo", - "parachains/runtimes/bridge-hubs/test-utils", - "parachains/runtimes/collectives/collectives-polkadot", - "parachains/runtimes/contracts/contracts-rococo", - "parachains/runtimes/glutton/glutton-kusama", - "parachains/runtimes/starters/seedling", - "parachains/runtimes/starters/shell", - "parachains/runtimes/test-utils", - "parachains/runtimes/testing/penpal", - "parachains/runtimes/testing/rococo-parachain", - "polkadot-parachain", - "primitives/aura", - "primitives/core", - "primitives/parachain-inherent", - "primitives/timestamp", - "primitives/utility", - "test/client", - "test/relay-sproof-builder", - "test/relay-validation-worker-provider", - "test/runtime", - "test/service", - "xcm/xcm-emulator", -] - -[profile.release] -panic = "unwind" -opt-level = 3 - -[profile.production] -inherits = "release" -lto = true -codegen-units = 1 diff --git a/cumulus/README.md b/cumulus/README.md deleted file mode 100644 index c4dfa4e0ba47..000000000000 --- a/cumulus/README.md +++ /dev/null @@ -1,244 +0,0 @@ -# Cumulus ☁️ - -[![Doc](https://img.shields.io/badge/cumulus%20docs-master-brightgreen)](https://paritytech.github.io/cumulus/) - -This repository contains both the Cumulus SDK and also specific chains implemented -on top of this SDK. - -If you only want to run a **Polkadot Parachain Node**, check out our [container section](./docs/container.md). - -## Cumulus SDK - -A set of tools for writing [Substrate](https://substrate.io/)-based -[Polkadot](https://wiki.polkadot.network/en/) -[parachains](https://wiki.polkadot.network/docs/en/learn-parachains). Refer to the included -[overview](docs/overview.md) for architectural details, and the -[Connect to a relay chain how-to guide](https://docs.substrate.io/reference/how-to-guides/parachains/connect-to-a-relay-chain/) for a -guided walk-through of using these tools. - -It's easy to write blockchains using Substrate, and the overhead of writing parachains' -distribution, p2p, database, and synchronization layers should be just as low. This project aims to -make it easy to write parachains for Polkadot by leveraging the power of Substrate. - -Cumulus clouds are shaped sort of like dots; together they form a system that is intricate, -beautiful and functional. - -### Consensus - -[`parachain-consensus`](https://github.com/paritytech/cumulus/blob/master/client/consensus/common/src/parachain_consensus.rs) is a -[consensus engine](https://docs.substrate.io/v3/advanced/consensus) for Substrate -that follows a Polkadot -[relay chain](https://wiki.polkadot.network/docs/en/learn-architecture#relay-chain). This will run -a Polkadot node internally, and dictate to the client and synchronization algorithms which chain -to follow, -[finalize](https://wiki.polkadot.network/docs/en/learn-consensus#probabilistic-vs-provable-finality), -and treat as best. - -### Collator - -A Polkadot [collator](https://wiki.polkadot.network/docs/en/learn-collator) for the parachain is -implemented by the `polkadot-parachain` binary (previously called `polkadot-collator`). - -You may run `polkadot-parachain` locally after building it or using one of the container option described [here](./docs/container.md). - -### Relay Chain Interaction -To operate a parachain node, a connection to the corresponding relay chain is necessary. This can be -achieved in one of two ways: -1. Run a full relay chain node within the parachain node (default) -2. Connect to an external relay chain node via WebSocket RPC - -#### In-process Relay Chain Node -If an external relay chain node is not specified (default behavior), then a full relay chain node is -spawned within the same process. - -This node has all of the typical components of a regular Polkadot node and will have to fully sync -with the relay chain to work. - -##### Example command -```shell= -polkadot-parachain \ - --chain parachain-chainspec.json \ - --tmp \ - -- \ - --chain relaychain-chainspec.json -``` - -#### External Relay Chain Node -An external relay chain node is connected via WebsSocket RPC by using the `--relay-chain-rpc-urls` -command line argument. This option accepts one or more space-separated WebSocket URLs to a full relay -chain node. By default, only the first URL will be used, with the rest as a backup in case the -connection to the first node is lost. - -Parachain nodes using this feature won't have to fully sync with the relay chain to work, so in general -they will use fewer system resources. - -**Note:** At this time, any parachain nodes using this feature will still spawn a significantly cut-down -relay chain node in-process. Even though they lack the majority of normal Polkadot subsystems, they -will still need to connect directly to the relay chain network. -##### Example command -```shell= -polkadot-parachain \ - --chain parachain-chainspec.json \ - --tmp \ - --relay-chain-rpc-urls \ - "ws://relaychain-rpc-endpoint:9944" \ - "ws://relaychain-rpc-endpoint-backup:9944" \ - -- \ - --chain relaychain-chainspec.json -``` - -## Installation and Setup -Before building Cumulus SDK based nodes / runtimes prepare your environment by following Substrate -[installation instructions](https://docs.substrate.io/main-docs/install/). - -To launch a local network, you can use [zombienet](https://github.com/paritytech/zombienet) for -quick setup and experimentation or follow the [manual setup](#manual-setup). - -### Zombienet -We use Zombienet to spin up networks for integration tests and local networks. -Follow [these installation steps](https://github.com/paritytech/zombienet#requirements-by-provider) -to set it up on your machine. A simple network specification with two relay chain nodes and one collator is -located at [zombienet/examples/small_network.toml](zombienet/examples/small_network.toml). - - -#### Which provider should I use? -Zombienet offers multiple providers to run networks. Choose the one that best fits your needs: -- **Podman:** Choose this if you want to spin up a network quick and easy. -- **Native:** Choose this if you want to develop and deploy your changes. Requires compilation -of the binaries. -- **Kubernetes:** Choose this for advanced use-cases or running on cloud-infrastructure. - -#### How to run -To run the example network, use the following commands: - -```bash -# Podman provider -zombienet --provider podman spawn ./zombienet/examples/small_network.toml - -# Native provider, assumes polkadot and polkadot-parachains binary in $PATH -zombienet --provider native spawn ./zombienet/examples/small_network.toml -``` - -### Manual Setup -#### Launch the Relay Chain - -```bash -# Clone -git clone https://github.com/paritytech/polkadot -cd polkadot - -# Compile Polkadot with the real overseer feature -cargo build --release --bin polkadot - -# Generate a raw chain spec -./target/release/polkadot build-spec --chain rococo-local --disable-default-bootnode --raw > rococo-local-cfde.json - -# Alice -./target/release/polkadot --chain rococo-local-cfde.json --alice --tmp - -# Bob (In a separate terminal) -./target/release/polkadot --chain rococo-local-cfde.json --bob --tmp --port 30334 -``` - -#### Launch the Parachain - -```bash -# Clone -git clone https://github.com/paritytech/cumulus -cd cumulus - -# Compile -cargo build --release --bin polkadot-parachain - -# Export genesis state -./target/release/polkadot-parachain export-genesis-state > genesis-state - -# Export genesis wasm -./target/release/polkadot-parachain export-genesis-wasm > genesis-wasm - -# Collator1 -./target/release/polkadot-parachain --collator --alice --force-authoring --tmp --port 40335 --rpc-port 9946 -- --chain ../polkadot/rococo-local-cfde.json --port 30335 - -# Collator2 -./target/release/polkadot-parachain --collator --bob --force-authoring --tmp --port 40336 --rpc-port 9947 -- --chain ../polkadot/rococo-local-cfde.json --port 30336 - -# Parachain Full Node 1 -./target/release/polkadot-parachain --tmp --port 40337 --rpc-port 9948 -- --chain ../polkadot/rococo-local-cfde.json --port 30337 -``` - -#### Register the parachain - -![image](https://user-images.githubusercontent.com/2915325/99548884-1be13580-2987-11eb-9a8b-20be658d34f9.png) - - -## Asset Hub 🪙 - -This repository also contains the Asset Hub runtimes. Asset Hub is a system parachain providing an -asset store for the Polkadot ecosystem. - -### Build & Launch a Node - -To run an Asset Hub node, you will need to compile the `polkadot-parachain` binary: - -```bash -cargo build --release --locked --bin polkadot-parachain -``` - -Once the executable is built, launch the parachain node via: - -```bash -CHAIN=asset-hub-westend # or asset-hub-kusama -./target/release/polkadot-parachain --chain $CHAIN -``` - -Refer to the [setup instructions](#manual-setup) to run a local network for development. - -## Contracts 📝 - -See [the `contracts-rococo` readme](parachains/runtimes/contracts/contracts-rococo/README.md) for details. - -## Bridge-hub 📝 - -See [the `bridge-hubs` readme](parachains/runtimes/bridge-hubs/README.md) for details. - -## Rococo 👑 - -[Rococo](https://polkadot.js.org/apps/?rpc=wss://rococo-rpc.polkadot.io) is becoming a -[Community Parachain Testbed](https://polkadot.network/blog/rococo-revamp-becoming-a-community-parachain-testbed/) -for parachain teams in the Polkadot ecosystem. It supports multiple parachains with the -differentiation of long-term connections and recurring short-term connections, to see which -parachains are currently connected and how long they will be connected for -[see here](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-rpc.polkadot.io#/parachains). - -Rococo is an elaborate style of design and the name describes the painstaking effort that has gone -into this project. - -### Build & Launch Rococo Collators - -Collators are similar to validators in the relay chain. These nodes build the blocks that will -eventually be included by the relay chain for a parachain. - -To run a Rococo collator you will need to compile the following binary: - -```bash -cargo build --release --locked --bin polkadot-parachain -``` - -Once the executable is built, launch collators for each parachain (repeat once each for chain -`tick`, `trick`, `track`): - -```bash -./target/release/polkadot-parachain --chain $CHAIN --validator -``` - -You can also build [using a container](./docs/container.md). - -### Parachains - -* [Asset Hub](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-statemint-rpc.polkadot.io#/explorer) -* [Contracts on Rococo](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-contracts-rpc.polkadot.io#/explorer) -* [RILT](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo.kilt.io#/explorer) - -The network uses horizontal message passing (HRMP) to enable communication between parachains and -the relay chain and, in turn, between parachains. This means that every message is sent to the relay -chain, and from the relay chain to its destination parachain. diff --git a/cumulus/bridges/LICENSE b/cumulus/bridges/LICENSE deleted file mode 100644 index 733c072369ca..000000000000 --- a/cumulus/bridges/LICENSE +++ /dev/null @@ -1,675 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - diff --git a/cumulus/bridges/README.md b/cumulus/bridges/README.md deleted file mode 100644 index 2f8c5ca9abb2..000000000000 --- a/cumulus/bridges/README.md +++ /dev/null @@ -1,259 +0,0 @@ -# Parity Bridges Common - -This is a collection of components for building bridges. - -These components include Substrate pallets for syncing headers, passing arbitrary messages, as well -as libraries for building relayers to provide cross-chain communication capabilities. - -Three bridge nodes are also available. The nodes can be used to run test networks which bridge other -Substrate chains. - -🚧 The bridges are currently under construction - a hardhat is recommended beyond this point 🚧 - -## Contents - -- [Installation](#installation) -- [High-Level Architecture](#high-level-architecture) -- [Project Layout](#project-layout) -- [Running the Bridge](#running-the-bridge) -- [How to send a message](#how-to-send-a-message) -- [Community](#community) - -## Installation - -To get up and running you need both stable and nightly Rust. Rust nightly is used to build the Web -Assembly (WASM) runtime for the node. You can configure the WASM support as so: - -```bash -rustup install nightly -rustup target add wasm32-unknown-unknown --toolchain nightly -``` - -Once this is configured you can build and test the repo as follows: - -``` -git clone https://github.com/paritytech/parity-bridges-common.git -cd parity-bridges-common -cargo build --all -cargo test --all -``` - -Also you can build the repo with -[Parity CI Docker image](https://github.com/paritytech/scripts/tree/master/dockerfiles/bridges-ci): - -```bash -docker pull paritytech/bridges-ci:production -mkdir ~/cache -chown 1000:1000 ~/cache #processes in the container runs as "nonroot" user with UID 1000 -docker run --rm -it -w /shellhere/parity-bridges-common \ - -v /home/$(whoami)/cache/:/cache/ \ - -v "$(pwd)":/shellhere/parity-bridges-common \ - -e CARGO_HOME=/cache/cargo/ \ - -e SCCACHE_DIR=/cache/sccache/ \ - -e CARGO_TARGET_DIR=/cache/target/ paritytech/bridges-ci:production cargo build --all -#artifacts can be found in ~/cache/target -``` - -If you want to reproduce other steps of CI process you can use the following -[guide](https://github.com/paritytech/scripts#reproduce-ci-locally). - -If you need more information about setting up your development environment [Substrate's -Installation page](https://docs.substrate.io/main-docs/install/) is a good -resource. - -## High-Level Architecture - -This repo has support for bridging foreign chains together using a combination of Substrate pallets -and external processes called relayers. A bridge chain is one that is able to follow the consensus -of a foreign chain independently. For example, consider the case below where we want to bridge two -Substrate based chains. - -``` -+---------------+ +---------------+ -| | | | -| Rialto | | Millau | -| | | | -+-------+-------+ +-------+-------+ - ^ ^ - | +---------------+ | - | | | | - +-----> | Bridge Relay | <-------+ - | | - +---------------+ -``` - -The Millau chain must be able to accept Rialto headers and verify their integrity. It does this by -using a runtime module designed to track GRANDPA finality. Since two blockchains can't interact -directly they need an external service, called a relayer, to communicate. The relayer will subscribe -to new Rialto headers via RPC and submit them to the Millau chain for verification. - -Take a look at [Bridge High Level Documentation](./docs/high-level-overview.md) for more in-depth -description of the bridge interaction. - -## Project Layout - -Here's an overview of how the project is laid out. The main bits are the `bin`, which is the actual -"blockchain", the `modules` which are used to build the blockchain's logic (a.k.a the runtime) and -the `relays` which are used to pass messages between chains. - -``` -├── bin // Node and Runtime for the various Substrate chains -│ └── ... -├── deployments // Useful tools for deploying test networks -│ └── ... -├── modules // Substrate Runtime Modules (a.k.a Pallets) -│ ├── beefy // On-Chain BEEFY Light Client (in progress) -│ ├── grandpa // On-Chain GRANDPA Light Client -│ ├── messages // Cross Chain Message Passing -│ ├── parachains // On-Chain Parachains Light Client -│ ├── relayers // Relayer rewards registry -│ └── ... -├── primitives // Code shared between modules, runtimes, and relays -│ └── ... -├── relays // Application for sending finality proofs and messages between chains -│ └── ... -└── scripts // Useful development and maintenance scripts -``` - -## Running the Bridge - -To run the Bridge you need to be able to connect the bridge relay node to the RPC interface of nodes -on each side of the bridge (source and target chain). - -There are 2 ways to run the bridge, described below: - -- building & running from source: with this option, you'll be able to run the bridge between two standalone -chains that are running GRANDPA finality gadget to achieve finality; - -- running a Docker Compose setup: this is a recommended option, where you'll see bridges with parachains, -complex relays and more. - -### Using the Source - -First you'll need to build the bridge nodes and relay. This can be done as follows: - -```bash -# In `parity-bridges-common` folder -cargo build -p rialto-bridge-node -cargo build -p millau-bridge-node -cargo build -p substrate-relay -``` - -### Running a Dev network - -We will launch a dev network to demonstrate how to relay a message between two Substrate based -chains (named Rialto and Millau). - -To do this we will need two nodes, two relayers which will relay headers, and two relayers which -will relay messages. - -#### Running from local scripts - -To run a simple dev network you can use the scripts located in the -[`deployments/local-scripts` folder](./deployments/local-scripts). - -First, we must run the two Substrate nodes. - -```bash -# In `parity-bridges-common` folder -./deployments/local-scripts/run-rialto-node.sh -./deployments/local-scripts/run-millau-node.sh -``` - -After the nodes are up we can run the header relayers. - -```bash -./deployments/local-scripts/relay-millau-to-rialto.sh -./deployments/local-scripts/relay-rialto-to-millau.sh -``` - -At this point you should see the relayer submitting headers from the Millau Substrate chain to the -Rialto Substrate chain. - -``` -# Header Relayer Logs -[Millau_to_Rialto_Sync] [date] DEBUG bridge Going to submit finality proof of Millau header #147 to Rialto -[...] [date] INFO bridge Synced 147 of 147 headers -[...] [date] DEBUG bridge Going to submit finality proof of Millau header #148 to Rialto -[...] [date] INFO bridge Synced 148 of 149 headers -``` - -Finally, we can run the message relayers. - -```bash -./deployments/local-scripts/relay-messages-millau-to-rialto.sh -./deployments/local-scripts/relay-messages-rialto-to-millau.sh -``` - -You will also see the message lane relayers listening for new messages. - -``` -# Message Relayer Logs -[Millau_to_Rialto_MessageLane_00000000] [date] DEBUG bridge Asking Millau::ReceivingConfirmationsDelivery about best message nonces -[...] [date] INFO bridge Synced Some(2) of Some(3) nonces in Millau::MessagesDelivery -> Rialto::MessagesDelivery race -[...] [date] DEBUG bridge Asking Millau::MessagesDelivery about message nonces -[...] [date] DEBUG bridge Received best nonces from Millau::ReceivingConfirmationsDelivery: TargetClientNonces { latest_nonce: 0, nonces_data: () } -[...] [date] DEBUG bridge Asking Millau::ReceivingConfirmationsDelivery about finalized message nonces -[...] [date] DEBUG bridge Received finalized nonces from Millau::ReceivingConfirmationsDelivery: TargetClientNonces { latest_nonce: 0, nonces_data: () } -[...] [date] DEBUG bridge Received nonces from Millau::MessagesDelivery: SourceClientNonces { new_nonces: {}, confirmed_nonce: Some(0) } -[...] [date] DEBUG bridge Asking Millau node about its state -[...] [date] DEBUG bridge Received state from Millau node: ClientState { best_self: HeaderId(1593, 0xacac***), best_finalized_self: HeaderId(1590, 0x0be81d...), best_finalized_peer_at_best_self: HeaderId(0, 0xdcdd89...) } -``` - -To send a message see the ["How to send a message" section](#how-to-send-a-message). - -### How to send a message - -In this section we'll show you how to quickly send a bridge message. The message is just an encoded XCM -`Trap(43)` message. - -```bash -# In `parity-bridges-common` folder -./scripts/send-message-from-millau-rialto.sh -``` - -After sending a message you will see the following logs showing a message was successfully sent: - -``` -INFO bridge Sending message to Rialto. Size: 11. -TRACE bridge Sent transaction to Millau node: 0x5e68... -``` - -And at the Rialto node logs you'll something like this: - -``` -... runtime::bridge-messages: Received messages: total=1, valid=1. Weight used: Weight(ref_time: 1215065371, proof_size: 48559)/Weight(ref_time: 1215065371, proof_size: 54703). -``` - -It means that the message has been delivered and dispatched. Message may be dispatched with an -error, though - the goal of our test bridge is to ensure that messages are successfully delivered -and all involved components are working. - -## Full Network Docker Compose Setup - -For a more sophisticated deployment which includes bidirectional header sync, message passing, -monitoring dashboards, etc. see the [Deployments README](./deployments/README.md). - -You should note that you can find images for all the bridge components published on -[Docker Hub](https://hub.docker.com/u/paritytech). - -To run a Rialto node for example, you can use the following command: - -```bash -docker run -p 30333:30333 -p 9933:9933 -p 9944:9944 \ - -it paritytech/rialto-bridge-node --dev --tmp \ - --rpc-cors=all --unsafe-rpc-external -``` - -## Community - -Main hangout for the community is [Element](https://element.io/) (formerly Riot). Element is a chat -server like, for example, Discord. Most discussions around Polkadot and Substrate happen -in various Element "rooms" (channels). So, joining Element might be a good idea, anyway. - -If you are interested in information exchange and development of Polkadot related bridges please -feel free to join the [Polkadot Bridges](https://app.element.io/#/room/#bridges:web3.foundation) -Element channel. - -The [Substrate Technical](https://app.element.io/#/room/#substrate-technical:matrix.org) Element -channel is most suited for discussions regarding Substrate itself. diff --git a/cumulus/bridges/SECURITY.md b/cumulus/bridges/SECURITY.md deleted file mode 100644 index 65f2f3bff05d..000000000000 --- a/cumulus/bridges/SECURITY.md +++ /dev/null @@ -1,14 +0,0 @@ -# Security Policy - -Thanks for helping make the Parity ecosystem more secure. Security is one of our first priorities. - -## Reporting a vulnerability - -If you find something that can be treated as a security vulnerability, please do not use the issue tracker or discuss it in the public forum as it can cause more damage, rather than giving real help to the ecosystem. - -Security vulnerabilities should be reported by the [contact form](https://security-submission.parity.io/). - -If you think that your report might be eligible for the Bug Bounty Program, please mark this during the submission. Please check up-to-date [Parity Bug Bounty Program rules](https://www.parity.io/bug-bounty) to find out the information about our Bug Bounty Program. - -**Warning**: This is an unified SECURITY.md file for Paritytech GitHub Organization. The presence of this file does not mean that this repository is covered by the Bug Bounty program. Please always check the Bug Bounty Program scope for information. - diff --git a/cumulus/bridges/bin/runtime-common/Cargo.toml b/cumulus/bridges/bin/runtime-common/Cargo.toml deleted file mode 100644 index 5fb75f3887f1..000000000000 --- a/cumulus/bridges/bin/runtime-common/Cargo.toml +++ /dev/null @@ -1,90 +0,0 @@ -[package] -name = "bridge-runtime-common" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -repository = "https://github.com/paritytech/parity-bridges-common/" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -hash-db = { version = "0.16.0", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -static_assertions = { version = "1.1", optional = true } - -# Bridge dependencies - -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-parachains = { path = "../../primitives/parachains", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-relayers = { path = "../../primitives/relayers", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } -pallet-bridge-grandpa = { path = "../../modules/grandpa", default-features = false } -pallet-bridge-messages = { path = "../../modules/messages", default-features = false } -pallet-bridge-parachains = { path = "../../modules/parachains", default-features = false } -pallet-bridge-relayers = { path = "../../modules/relayers", default-features = false } - -# Substrate dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -# Polkadot dependencies -xcm = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } -xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } - -[dev-dependencies] -bp-test-utils = { path = "../../primitives/test-utils" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-messages/std", - "bp-parachains/std", - "bp-polkadot-core/std", - "bp-runtime/std", - "bp-xcm-bridge-hub-router/std", - "codec/std", - "frame-support/std", - "frame-system/std", - "hash-db/std", - "log/std", - "pallet-bridge-grandpa/std", - "pallet-bridge-messages/std", - "pallet-bridge-parachains/std", - "pallet-bridge-relayers/std", - "pallet-transaction-payment/std", - "pallet-utility/std", - "scale-info/std", - "sp-api/std", - "sp-core/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "sp-trie/std", - "xcm/std", - "xcm-builder/std", -] -runtime-benchmarks = [ - "pallet-bridge-grandpa/runtime-benchmarks", - "pallet-bridge-messages/runtime-benchmarks", - "pallet-bridge-parachains/runtime-benchmarks", - "pallet-bridge-relayers/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", -] -integrity-test = [ - "static_assertions", -] diff --git a/cumulus/bridges/bin/runtime-common/src/lib.rs b/cumulus/bridges/bin/runtime-common/src/lib.rs deleted file mode 100644 index 546d4388471c..000000000000 --- a/cumulus/bridges/bin/runtime-common/src/lib.rs +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Common types/functions that may be used by runtimes of all bridged chains. - -#![cfg_attr(not(feature = "std"), no_std)] - -use crate::messages_call_ext::MessagesCallSubType; -use pallet_bridge_grandpa::CallSubType as GrandpaCallSubType; -use pallet_bridge_parachains::CallSubType as ParachainsCallSubtype; -use sp_runtime::transaction_validity::TransactionValidity; -use xcm::v3::NetworkId; - -pub mod messages; -pub mod messages_api; -pub mod messages_benchmarking; -pub mod messages_call_ext; -pub mod messages_generation; -pub mod messages_xcm_extension; -pub mod parachains_benchmarking; -pub mod priority_calculator; -pub mod refund_relayer_extension; - -mod mock; - -#[cfg(feature = "integrity-test")] -pub mod integrity; - -const LOG_TARGET_BRIDGE_DISPATCH: &str = "runtime::bridge-dispatch"; - -/// A duplication of the `FilterCall` trait. -/// -/// We need this trait in order to be able to implement it for the messages pallet, -/// since the implementation is done outside of the pallet crate. -pub trait BridgeRuntimeFilterCall { - /// Checks if a runtime call is valid. - fn validate(call: &Call) -> TransactionValidity; -} - -impl BridgeRuntimeFilterCall for pallet_bridge_grandpa::Pallet -where - T: pallet_bridge_grandpa::Config, - T::RuntimeCall: GrandpaCallSubType, -{ - fn validate(call: &T::RuntimeCall) -> TransactionValidity { - GrandpaCallSubType::::check_obsolete_submit_finality_proof(call) - } -} - -impl BridgeRuntimeFilterCall - for pallet_bridge_parachains::Pallet -where - T: pallet_bridge_parachains::Config, - T::RuntimeCall: ParachainsCallSubtype, -{ - fn validate(call: &T::RuntimeCall) -> TransactionValidity { - ParachainsCallSubtype::::check_obsolete_submit_parachain_heads(call) - } -} - -impl, I: 'static> BridgeRuntimeFilterCall - for pallet_bridge_messages::Pallet -where - T::RuntimeCall: MessagesCallSubType, -{ - /// Validate messages in order to avoid "mining" messages delivery and delivery confirmation - /// transactions, that are delivering outdated messages/confirmations. Without this validation, - /// even honest relayers may lose their funds if there are multiple relays running and - /// submitting the same messages/confirmations. - fn validate(call: &T::RuntimeCall) -> TransactionValidity { - call.check_obsolete_call() - } -} - -/// Declares a runtime-specific `BridgeRejectObsoleteHeadersAndMessages` signed extension. -/// -/// ## Example -/// -/// ```nocompile -/// generate_bridge_reject_obsolete_headers_and_messages!{ -/// Call, AccountId -/// BridgeRialtoGrandpa, BridgeWestendGrandpa, -/// BridgeRialtoParachains -/// } -/// ``` -/// -/// The goal of this extension is to avoid "mining" transactions that provide outdated bridged -/// headers and messages. Without that extension, even honest relayers may lose their funds if -/// there are multiple relays running and submitting the same information. -#[macro_export] -macro_rules! generate_bridge_reject_obsolete_headers_and_messages { - ($call:ty, $account_id:ty, $($filter_call:ty),*) => { - #[derive(Clone, codec::Decode, Default, codec::Encode, Eq, PartialEq, frame_support::RuntimeDebug, scale_info::TypeInfo)] - pub struct BridgeRejectObsoleteHeadersAndMessages; - impl sp_runtime::traits::SignedExtension for BridgeRejectObsoleteHeadersAndMessages { - const IDENTIFIER: &'static str = "BridgeRejectObsoleteHeadersAndMessages"; - type AccountId = $account_id; - type Call = $call; - type AdditionalSigned = (); - type Pre = (); - - fn additional_signed(&self) -> sp_std::result::Result< - (), - sp_runtime::transaction_validity::TransactionValidityError, - > { - Ok(()) - } - - fn validate( - &self, - _who: &Self::AccountId, - call: &Self::Call, - _info: &sp_runtime::traits::DispatchInfoOf, - _len: usize, - ) -> sp_runtime::transaction_validity::TransactionValidity { - let valid = sp_runtime::transaction_validity::ValidTransaction::default(); - $( - let valid = valid - .combine_with(<$filter_call as $crate::BridgeRuntimeFilterCall<$call>>::validate(call)?); - )* - Ok(valid) - } - - fn pre_dispatch( - self, - who: &Self::AccountId, - call: &Self::Call, - info: &sp_runtime::traits::DispatchInfoOf, - len: usize, - ) -> Result { - self.validate(who, call, info, len).map(drop) - } - } - }; -} - -/// A mapping over `NetworkId`. -/// Since `NetworkId` doesn't include `Millau`, `Rialto` and `RialtoParachain`, we create some -/// synthetic associations between these chains and `NetworkId` chains. -pub enum CustomNetworkId { - /// The Millau network ID, associated with Kusama. - Millau, - /// The Rialto network ID, associated with Polkadot. - Rialto, - /// The RialtoParachain network ID, associated with Westend. - RialtoParachain, -} - -impl TryFrom for CustomNetworkId { - type Error = (); - - fn try_from(chain: bp_runtime::ChainId) -> Result { - Ok(match chain { - bp_runtime::MILLAU_CHAIN_ID => Self::Millau, - bp_runtime::RIALTO_CHAIN_ID => Self::Rialto, - bp_runtime::RIALTO_PARACHAIN_CHAIN_ID => Self::RialtoParachain, - _ => return Err(()), - }) - } -} - -impl CustomNetworkId { - /// Converts self to XCM' network id. - pub const fn as_network_id(&self) -> NetworkId { - match *self { - CustomNetworkId::Millau => NetworkId::Kusama, - CustomNetworkId::Rialto => NetworkId::Polkadot, - CustomNetworkId::RialtoParachain => NetworkId::Westend, - } - } -} - -#[cfg(test)] -mod tests { - use crate::BridgeRuntimeFilterCall; - use frame_support::{assert_err, assert_ok}; - use sp_runtime::{ - traits::SignedExtension, - transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, - }; - - pub struct MockCall { - data: u32, - } - - impl sp_runtime::traits::Dispatchable for MockCall { - type RuntimeOrigin = (); - type Config = (); - type Info = (); - type PostInfo = (); - - fn dispatch( - self, - _origin: Self::RuntimeOrigin, - ) -> sp_runtime::DispatchResultWithInfo { - unimplemented!() - } - } - - struct FirstFilterCall; - impl BridgeRuntimeFilterCall for FirstFilterCall { - fn validate(call: &MockCall) -> TransactionValidity { - if call.data <= 1 { - return InvalidTransaction::Custom(1).into() - } - - Ok(ValidTransaction { priority: 1, ..Default::default() }) - } - } - - struct SecondFilterCall; - impl BridgeRuntimeFilterCall for SecondFilterCall { - fn validate(call: &MockCall) -> TransactionValidity { - if call.data <= 2 { - return InvalidTransaction::Custom(2).into() - } - - Ok(ValidTransaction { priority: 2, ..Default::default() }) - } - } - - #[test] - fn test() { - generate_bridge_reject_obsolete_headers_and_messages!( - MockCall, - (), - FirstFilterCall, - SecondFilterCall - ); - - assert_err!( - BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 1 }, &(), 0), - InvalidTransaction::Custom(1) - ); - - assert_err!( - BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 2 }, &(), 0), - InvalidTransaction::Custom(2) - ); - - assert_ok!( - BridgeRejectObsoleteHeadersAndMessages.validate(&(), &MockCall { data: 3 }, &(), 0), - ValidTransaction { priority: 3, ..Default::default() } - ) - } -} diff --git a/cumulus/bridges/bin/runtime-common/src/messages.rs b/cumulus/bridges/bin/runtime-common/src/messages.rs deleted file mode 100644 index 316c4d3cad92..000000000000 --- a/cumulus/bridges/bin/runtime-common/src/messages.rs +++ /dev/null @@ -1,737 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Types that allow runtime to act as a source/target endpoint of message lanes. -//! -//! Messages are assumed to be encoded `Call`s of the target chain. Call-dispatch -//! pallet is used to dispatch incoming messages. Message identified by a tuple -//! of to elements - message lane id and message nonce. - -pub use bp_runtime::{RangeInclusiveExt, UnderlyingChainOf, UnderlyingChainProvider}; - -use bp_header_chain::HeaderChain; -use bp_messages::{ - source_chain::{LaneMessageVerifier, TargetHeaderChain}, - target_chain::{ProvedLaneMessages, ProvedMessages, SourceHeaderChain}, - InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, - VerificationError, -}; -use bp_runtime::{Chain, RawStorageProof, Size, StorageProofChecker}; -use codec::{Decode, Encode}; -use frame_support::{traits::Get, weights::Weight, RuntimeDebug}; -use hash_db::Hasher; -use scale_info::TypeInfo; -use sp_std::{convert::TryFrom, marker::PhantomData, vec::Vec}; - -/// Bidirectional message bridge. -pub trait MessageBridge { - /// Name of the paired messages pallet instance at the Bridged chain. - /// - /// Should be the name that is used in the `construct_runtime!()` macro. - const BRIDGED_MESSAGES_PALLET_NAME: &'static str; - - /// This chain in context of message bridge. - type ThisChain: ThisChainWithMessages; - /// Bridged chain in context of message bridge. - type BridgedChain: BridgedChainWithMessages; - /// Bridged header chain. - type BridgedHeaderChain: HeaderChain>; -} - -/// This chain that has `pallet-bridge-messages` module. -pub trait ThisChainWithMessages: UnderlyingChainProvider { - /// Call origin on the chain. - type RuntimeOrigin; -} - -/// Bridged chain that has `pallet-bridge-messages` module. -pub trait BridgedChainWithMessages: UnderlyingChainProvider {} - -/// This chain in context of message bridge. -pub type ThisChain = ::ThisChain; -/// Bridged chain in context of message bridge. -pub type BridgedChain = ::BridgedChain; -/// Hash used on the chain. -pub type HashOf = bp_runtime::HashOf<::Chain>; -/// Hasher used on the chain. -pub type HasherOf = bp_runtime::HasherOf>; -/// Account id used on the chain. -pub type AccountIdOf = bp_runtime::AccountIdOf>; -/// Type of balances that is used on the chain. -pub type BalanceOf = bp_runtime::BalanceOf>; - -/// Sub-module that is declaring types required for processing This -> Bridged chain messages. -pub mod source { - use super::*; - - /// Message payload for This -> Bridged chain messages. - pub type FromThisChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; - - /// Maximal size of outbound message payload. - pub struct FromThisChainMaximalOutboundPayloadSize(PhantomData); - - impl Get for FromThisChainMaximalOutboundPayloadSize { - fn get() -> u32 { - maximal_message_size::() - } - } - - /// Messages delivery proof from bridged chain: - /// - /// - hash of finalized header; - /// - storage proof of inbound lane state; - /// - lane id. - #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] - pub struct FromBridgedChainMessagesDeliveryProof { - /// Hash of the bridge header the proof is for. - pub bridged_header_hash: BridgedHeaderHash, - /// Storage trie proof generated for [`Self::bridged_header_hash`]. - pub storage_proof: RawStorageProof, - /// Lane id of which messages were delivered and the proof is for. - pub lane: LaneId, - } - - impl Size for FromBridgedChainMessagesDeliveryProof { - fn size(&self) -> u32 { - u32::try_from( - self.storage_proof - .iter() - .fold(0usize, |sum, node| sum.saturating_add(node.len())), - ) - .unwrap_or(u32::MAX) - } - } - - /// 'Parsed' message delivery proof - inbound lane id and its state. - pub type ParsedMessagesDeliveryProofFromBridgedChain = - (LaneId, InboundLaneData>>); - - /// Message verifier that is doing all basic checks. - /// - /// This verifier assumes following: - /// - /// - all message lanes are equivalent, so all checks are the same; - /// - /// Following checks are made: - /// - /// - message is rejected if its lane is currently blocked; - /// - message is rejected if there are too many pending (undelivered) messages at the outbound - /// lane; - /// - check that the sender has rights to dispatch the call on target chain using provided - /// dispatch origin; - /// - check that the sender has paid enough funds for both message delivery and dispatch. - #[derive(RuntimeDebug)] - pub struct FromThisChainMessageVerifier(PhantomData); - - impl LaneMessageVerifier for FromThisChainMessageVerifier - where - B: MessageBridge, - { - fn verify_message( - _lane: &LaneId, - _lane_outbound_data: &OutboundLaneData, - _payload: &FromThisChainMessagePayload, - ) -> Result<(), VerificationError> { - // IMPORTANT: any error that is returned here is fatal for the bridge, because - // this code is executed at the bridge hub and message sender actually lives - // at some sibling parachain. So we are failing **after** the message has been - // sent and we can't report it back to sender (unless error report mechanism is - // embedded into message and its dispatcher). - - Ok(()) - } - } - - /// Return maximal message size of This -> Bridged chain message. - pub fn maximal_message_size() -> u32 { - super::target::maximal_incoming_message_size( - UnderlyingChainOf::>::max_extrinsic_size(), - ) - } - - /// `TargetHeaderChain` implementation that is using default types and perform default checks. - pub struct TargetHeaderChainAdapter(PhantomData); - - impl TargetHeaderChain>> - for TargetHeaderChainAdapter - { - type MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>>; - - fn verify_message(payload: &FromThisChainMessagePayload) -> Result<(), VerificationError> { - verify_chain_message::(payload) - } - - fn verify_messages_delivery_proof( - proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData>>), VerificationError> { - verify_messages_delivery_proof::(proof) - } - } - - /// Do basic Bridged-chain specific verification of This -> Bridged chain message. - /// - /// Ok result from this function means that the delivery transaction with this message - /// may be 'mined' by the target chain. But the lane may have its own checks (e.g. fee - /// check) that would reject message (see `FromThisChainMessageVerifier`). - pub fn verify_chain_message( - payload: &FromThisChainMessagePayload, - ) -> Result<(), VerificationError> { - // IMPORTANT: any error that is returned here is fatal for the bridge, because - // this code is executed at the bridge hub and message sender actually lives - // at some sibling parachain. So we are failing **after** the message has been - // sent and we can't report it back to sender (unless error report mechanism is - // embedded into message and its dispatcher). - - // apart from maximal message size check (see below), we should also check the message - // dispatch weight here. But we assume that the bridged chain will just push the message - // to some queue (XCMP, UMP, DMP), so the weight is constant and fits the block. - - // The maximal size of extrinsic at Substrate-based chain depends on the - // `frame_system::Config::MaximumBlockLength` and - // `frame_system::Config::AvailableBlockRatio` constants. This check is here to be sure that - // the lane won't stuck because message is too large to fit into delivery transaction. - // - // **IMPORTANT NOTE**: the delivery transaction contains storage proof of the message, not - // the message itself. The proof is always larger than the message. But unless chain state - // is enormously large, it should be several dozens/hundreds of bytes. The delivery - // transaction also contains signatures and signed extensions. Because of this, we reserve - // 1/3 of the the maximal extrinsic size for this data. - if payload.len() > maximal_message_size::() as usize { - return Err(VerificationError::MessageTooLarge) - } - - Ok(()) - } - - /// Verify proof of This -> Bridged chain messages delivery. - /// - /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged - /// parachains, please use the `verify_messages_delivery_proof_from_parachain`. - pub fn verify_messages_delivery_proof( - proof: FromBridgedChainMessagesDeliveryProof>>, - ) -> Result, VerificationError> { - let FromBridgedChainMessagesDeliveryProof { bridged_header_hash, storage_proof, lane } = - proof; - let mut storage = - B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) - .map_err(VerificationError::HeaderChain)?; - // Messages delivery proof is just proof of single storage key read => any error - // is fatal. - let storage_inbound_lane_data_key = bp_messages::storage_keys::inbound_lane_data_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - &lane, - ); - let inbound_lane_data = storage - .read_and_decode_mandatory_value(storage_inbound_lane_data_key.0.as_ref()) - .map_err(VerificationError::InboundLaneStorage)?; - - // check that the storage proof doesn't have any untouched trie nodes - storage.ensure_no_unused_nodes().map_err(VerificationError::StorageProof)?; - - Ok((lane, inbound_lane_data)) - } -} - -/// Sub-module that is declaring types required for processing Bridged -> This chain messages. -pub mod target { - use super::*; - - /// Decoded Bridged -> This message payload. - pub type FromBridgedChainMessagePayload = crate::messages_xcm_extension::XcmAsPlainPayload; - - /// Messages proof from bridged chain: - /// - /// - hash of finalized header; - /// - storage proof of messages and (optionally) outbound lane state; - /// - lane id; - /// - nonces (inclusive range) of messages which are included in this proof. - #[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] - pub struct FromBridgedChainMessagesProof { - /// Hash of the finalized bridged header the proof is for. - pub bridged_header_hash: BridgedHeaderHash, - /// A storage trie proof of messages being delivered. - pub storage_proof: RawStorageProof, - /// Messages in this proof are sent over this lane. - pub lane: LaneId, - /// Nonce of the first message being delivered. - pub nonces_start: MessageNonce, - /// Nonce of the last message being delivered. - pub nonces_end: MessageNonce, - } - - impl Size for FromBridgedChainMessagesProof { - fn size(&self) -> u32 { - u32::try_from( - self.storage_proof - .iter() - .fold(0usize, |sum, node| sum.saturating_add(node.len())), - ) - .unwrap_or(u32::MAX) - } - } - - /// Return maximal dispatch weight of the message we're able to receive. - pub fn maximal_incoming_message_dispatch_weight(maximal_extrinsic_weight: Weight) -> Weight { - maximal_extrinsic_weight / 2 - } - - /// Return maximal message size given maximal extrinsic size. - pub fn maximal_incoming_message_size(maximal_extrinsic_size: u32) -> u32 { - maximal_extrinsic_size / 3 * 2 - } - - /// `SourceHeaderChain` implementation that is using default types and perform default checks. - pub struct SourceHeaderChainAdapter(PhantomData); - - impl SourceHeaderChain for SourceHeaderChainAdapter { - type MessagesProof = FromBridgedChainMessagesProof>>; - - fn verify_messages_proof( - proof: Self::MessagesProof, - messages_count: u32, - ) -> Result, VerificationError> { - verify_messages_proof::(proof, messages_count) - } - } - - /// Verify proof of Bridged -> This chain messages. - /// - /// This function is used when Bridged chain is directly using GRANDPA finality. For Bridged - /// parachains, please use the `verify_messages_proof_from_parachain`. - /// - /// The `messages_count` argument verification (sane limits) is supposed to be made - /// outside of this function. This function only verifies that the proof declares exactly - /// `messages_count` messages. - pub fn verify_messages_proof( - proof: FromBridgedChainMessagesProof>>, - messages_count: u32, - ) -> Result, VerificationError> { - let FromBridgedChainMessagesProof { - bridged_header_hash, - storage_proof, - lane, - nonces_start, - nonces_end, - } = proof; - let storage = - B::BridgedHeaderChain::storage_proof_checker(bridged_header_hash, storage_proof) - .map_err(VerificationError::HeaderChain)?; - let mut parser = StorageProofCheckerAdapter::<_, B> { storage, _dummy: Default::default() }; - let nonces_range = nonces_start..=nonces_end; - - // receiving proofs where end < begin is ok (if proof includes outbound lane state) - let messages_in_the_proof = nonces_range.checked_len().unwrap_or(0); - if messages_in_the_proof != MessageNonce::from(messages_count) { - return Err(VerificationError::MessagesCountMismatch) - } - - // Read messages first. All messages that are claimed to be in the proof must - // be in the proof. So any error in `read_value`, or even missing value is fatal. - // - // Mind that we allow proofs with no messages if outbound lane state is proved. - let mut messages = Vec::with_capacity(messages_in_the_proof as _); - for nonce in nonces_range { - let message_key = MessageKey { lane_id: lane, nonce }; - let message_payload = parser.read_and_decode_message_payload(&message_key)?; - messages.push(Message { key: message_key, payload: message_payload }); - } - - // Now let's check if proof contains outbound lane state proof. It is optional, so - // we simply ignore `read_value` errors and missing value. - let proved_lane_messages = ProvedLaneMessages { - lane_state: parser.read_and_decode_outbound_lane_data(&lane)?, - messages, - }; - - // Now we may actually check if the proof is empty or not. - if proved_lane_messages.lane_state.is_none() && proved_lane_messages.messages.is_empty() { - return Err(VerificationError::EmptyMessageProof) - } - - // check that the storage proof doesn't have any untouched trie nodes - parser - .storage - .ensure_no_unused_nodes() - .map_err(VerificationError::StorageProof)?; - - // We only support single lane messages in this generated_schema - let mut proved_messages = ProvedMessages::new(); - proved_messages.insert(lane, proved_lane_messages); - - Ok(proved_messages) - } - - struct StorageProofCheckerAdapter { - storage: StorageProofChecker, - _dummy: sp_std::marker::PhantomData, - } - - impl StorageProofCheckerAdapter { - fn read_and_decode_outbound_lane_data( - &mut self, - lane_id: &LaneId, - ) -> Result, VerificationError> { - let storage_outbound_lane_data_key = bp_messages::storage_keys::outbound_lane_data_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - lane_id, - ); - - self.storage - .read_and_decode_opt_value(storage_outbound_lane_data_key.0.as_ref()) - .map_err(VerificationError::OutboundLaneStorage) - } - - fn read_and_decode_message_payload( - &mut self, - message_key: &MessageKey, - ) -> Result { - let storage_message_key = bp_messages::storage_keys::message_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - &message_key.lane_id, - message_key.nonce, - ); - self.storage - .read_and_decode_mandatory_value(storage_message_key.0.as_ref()) - .map_err(VerificationError::MessageStorage) - } - } -} - -/// The `BridgeMessagesCall` used by a chain. -pub type BridgeMessagesCallOf = bp_messages::BridgeMessagesCall< - bp_runtime::AccountIdOf, - target::FromBridgedChainMessagesProof>, - source::FromBridgedChainMessagesDeliveryProof>, ->; - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - messages_generation::{ - encode_all_messages, encode_lane_data, prepare_messages_storage_proof, - }, - mock::*, - }; - use bp_header_chain::{HeaderChainError, StoredHeaderDataBuilder}; - use bp_runtime::{HeaderId, StorageProofError}; - use codec::Encode; - use sp_core::H256; - use sp_runtime::traits::Header as _; - - #[test] - fn verify_chain_message_rejects_message_with_too_large_declared_weight() { - assert!(source::verify_chain_message::(&vec![ - 42; - BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT - - 1 - ]) - .is_err()); - } - - #[test] - fn verify_chain_message_rejects_message_too_large_message() { - assert!(source::verify_chain_message::(&vec![ - 0; - source::maximal_message_size::() - as usize + 1 - ],) - .is_err()); - } - - #[test] - fn verify_chain_message_accepts_maximal_message() { - assert_eq!( - source::verify_chain_message::(&vec![ - 0; - source::maximal_message_size::() - as _ - ],), - Ok(()), - ); - } - - fn using_messages_proof( - nonces_end: MessageNonce, - outbound_lane_data: Option, - encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, - encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, - test: impl Fn(target::FromBridgedChainMessagesProof) -> R, - ) -> R { - let (state_root, storage_proof) = prepare_messages_storage_proof::( - TEST_LANE_ID, - 1..=nonces_end, - outbound_lane_data, - bp_runtime::StorageProofSize::Minimal(0), - vec![42], - encode_message, - encode_outbound_lane_data, - ); - - sp_io::TestExternalities::new(Default::default()).execute_with(move || { - let bridged_header = BridgedChainHeader::new( - 0, - Default::default(), - state_root, - Default::default(), - Default::default(), - ); - let bridged_header_hash = bridged_header.hash(); - - pallet_bridge_grandpa::BestFinalized::::put(HeaderId( - 0, - bridged_header_hash, - )); - pallet_bridge_grandpa::ImportedHeaders::::insert( - bridged_header_hash, - bridged_header.build(), - ); - test(target::FromBridgedChainMessagesProof { - bridged_header_hash, - storage_proof, - lane: TEST_LANE_ID, - nonces_start: 1, - nonces_end, - }) - }) - } - - #[test] - fn messages_proof_is_rejected_if_declared_less_than_actual_number_of_messages() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - target::verify_messages_proof::(proof, 5) - }), - Err(VerificationError::MessagesCountMismatch), - ); - } - - #[test] - fn messages_proof_is_rejected_if_declared_more_than_actual_number_of_messages() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - target::verify_messages_proof::(proof, 15) - }), - Err(VerificationError::MessagesCountMismatch), - ); - } - - #[test] - fn message_proof_is_rejected_if_header_is_missing_from_the_chain() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - let bridged_header_hash = - pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; - pallet_bridge_grandpa::ImportedHeaders::::remove(bridged_header_hash); - target::verify_messages_proof::(proof, 10) - }), - Err(VerificationError::HeaderChain(HeaderChainError::UnknownHeader)), - ); - } - - #[test] - fn message_proof_is_rejected_if_header_state_root_mismatches() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |proof| { - let bridged_header_hash = - pallet_bridge_grandpa::BestFinalized::::get().unwrap().1; - pallet_bridge_grandpa::ImportedHeaders::::insert( - bridged_header_hash, - BridgedChainHeader::new( - 0, - Default::default(), - Default::default(), - Default::default(), - Default::default(), - ) - .build(), - ); - target::verify_messages_proof::(proof, 10) - }), - Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( - StorageProofError::StorageRootMismatch - ))), - ); - } - - #[test] - fn message_proof_is_rejected_if_it_has_duplicate_trie_nodes() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { - let node = proof.storage_proof.pop().unwrap(); - proof.storage_proof.push(node.clone()); - proof.storage_proof.push(node); - target::verify_messages_proof::(proof, 10) - },), - Err(VerificationError::HeaderChain(HeaderChainError::StorageProof( - StorageProofError::DuplicateNodesInProof - ))), - ); - } - - #[test] - fn message_proof_is_rejected_if_it_has_unused_trie_nodes() { - assert_eq!( - using_messages_proof(10, None, encode_all_messages, encode_lane_data, |mut proof| { - proof.storage_proof.push(vec![42]); - target::verify_messages_proof::(proof, 10) - },), - Err(VerificationError::StorageProof(StorageProofError::UnusedNodesInTheProof)), - ); - } - - #[test] - fn message_proof_is_rejected_if_required_message_is_missing() { - matches!( - using_messages_proof( - 10, - None, - |n, m| if n != 5 { Some(m.encode()) } else { None }, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 10) - ), - Err(VerificationError::MessageStorage(StorageProofError::StorageValueEmpty)), - ); - } - - #[test] - fn message_proof_is_rejected_if_message_decode_fails() { - matches!( - using_messages_proof( - 10, - None, - |n, m| { - let mut m = m.encode(); - if n == 5 { - m = vec![42] - } - Some(m) - }, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 10), - ), - Err(VerificationError::MessageStorage(StorageProofError::StorageValueDecodeFailed(_))), - ); - } - - #[test] - fn message_proof_is_rejected_if_outbound_lane_state_decode_fails() { - matches!( - using_messages_proof( - 10, - Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - encode_all_messages, - |d| { - let mut d = d.encode(); - d.truncate(1); - d - }, - |proof| target::verify_messages_proof::(proof, 10), - ), - Err(VerificationError::OutboundLaneStorage( - StorageProofError::StorageValueDecodeFailed(_) - )), - ); - } - - #[test] - fn message_proof_is_rejected_if_it_is_empty() { - assert_eq!( - using_messages_proof(0, None, encode_all_messages, encode_lane_data, |proof| { - target::verify_messages_proof::(proof, 0) - },), - Err(VerificationError::EmptyMessageProof), - ); - } - - #[test] - fn non_empty_message_proof_without_messages_is_accepted() { - assert_eq!( - using_messages_proof( - 0, - Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - encode_all_messages, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 0), - ), - Ok(vec![( - TEST_LANE_ID, - ProvedLaneMessages { - lane_state: Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - messages: Vec::new(), - }, - )] - .into_iter() - .collect()), - ); - } - - #[test] - fn non_empty_message_proof_is_accepted() { - assert_eq!( - using_messages_proof( - 1, - Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - encode_all_messages, - encode_lane_data, - |proof| target::verify_messages_proof::(proof, 1), - ), - Ok(vec![( - TEST_LANE_ID, - ProvedLaneMessages { - lane_state: Some(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 1, - latest_generated_nonce: 1, - }), - messages: vec![Message { - key: MessageKey { lane_id: TEST_LANE_ID, nonce: 1 }, - payload: vec![42], - }], - }, - )] - .into_iter() - .collect()), - ); - } - - #[test] - fn verify_messages_proof_does_not_panic_if_messages_count_mismatches() { - assert_eq!( - using_messages_proof(1, None, encode_all_messages, encode_lane_data, |mut proof| { - proof.nonces_end = u64::MAX; - target::verify_messages_proof::(proof, u32::MAX) - },), - Err(VerificationError::MessagesCountMismatch), - ); - } -} diff --git a/cumulus/bridges/bin/runtime-common/src/messages_benchmarking.rs b/cumulus/bridges/bin/runtime-common/src/messages_benchmarking.rs deleted file mode 100644 index b067523c305b..000000000000 --- a/cumulus/bridges/bin/runtime-common/src/messages_benchmarking.rs +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Everything required to run benchmarks of messages module, based on -//! `bridge_runtime_common::messages` implementation. - -#![cfg(feature = "runtime-benchmarks")] - -use crate::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - AccountIdOf, BridgedChain, HashOf, HasherOf, MessageBridge, ThisChain, - }, - messages_generation::{ - encode_all_messages, encode_lane_data, grow_trie_leaf_value, prepare_messages_storage_proof, - }, -}; - -use bp_messages::storage_keys; -use bp_polkadot_core::parachains::ParaHash; -use bp_runtime::{ - record_all_trie_keys, Chain, Parachain, RawStorageProof, StorageProofSize, UnderlyingChainOf, -}; -use codec::Encode; -use frame_support::weights::Weight; -use pallet_bridge_messages::benchmarking::{MessageDeliveryProofParams, MessageProofParams}; -use sp_runtime::traits::{Header, Zero}; -use sp_std::prelude::*; -use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; -use xcm::v3::prelude::*; - -/// Prepare inbound bridge message according to given message proof parameters. -fn prepare_inbound_message( - params: &MessageProofParams, - destination: InteriorMultiLocation, -) -> Vec { - // we only care about **this** message size when message proof needs to be `Minimal` - let expected_size = match params.size { - StorageProofSize::Minimal(size) => size as usize, - _ => 0, - }; - - // if we don't need a correct message, then we may just return some random blob - if !params.is_successful_dispatch_expected { - return vec![0u8; expected_size] - } - - // else let's prepare successful message. For XCM bridge hubs, it is the message that - // will be pushed further to some XCM queue (XCMP/UMP) - let location = xcm::VersionedInteriorMultiLocation::V3(destination); - let location_encoded_size = location.encoded_size(); - - // we don't need to be super-precise with `expected_size` here - let xcm_size = expected_size.saturating_sub(location_encoded_size); - let xcm = xcm::VersionedXcm::<()>::V3(vec![Instruction::ClearOrigin; xcm_size].into()); - - // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor - // or public fields, so just tuple - // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed - // to the storage) - (location, xcm).encode().encode() -} - -/// Prepare proof of messages for the `receive_messages_proof` call. -/// -/// In addition to returning valid messages proof, environment is prepared to verify this message -/// proof. -/// -/// This method is intended to be used when benchmarking pallet, linked to the chain that -/// uses GRANDPA finality. For parachains, please use the `prepare_message_proof_from_parachain` -/// function. -pub fn prepare_message_proof_from_grandpa_chain( - params: MessageProofParams, - message_destination: InteriorMultiLocation, -) -> (FromBridgedChainMessagesProof>>, Weight) -where - R: pallet_bridge_grandpa::Config>>, - FI: 'static, - B: MessageBridge, -{ - // prepare storage proof - let (state_root, storage_proof) = prepare_messages_storage_proof::( - params.lane, - params.message_nonces.clone(), - params.outbound_lane_data.clone(), - params.size, - prepare_inbound_message(¶ms, message_destination), - encode_all_messages, - encode_lane_data, - ); - - // update runtime storage - let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); - - ( - FromBridgedChainMessagesProof { - bridged_header_hash, - storage_proof, - lane: params.lane, - nonces_start: *params.message_nonces.start(), - nonces_end: *params.message_nonces.end(), - }, - Weight::MAX / 1000, - ) -} - -/// Prepare proof of messages for the `receive_messages_proof` call. -/// -/// In addition to returning valid messages proof, environment is prepared to verify this message -/// proof. -/// -/// This method is intended to be used when benchmarking pallet, linked to the chain that -/// uses parachain finality. For GRANDPA chains, please use the -/// `prepare_message_proof_from_grandpa_chain` function. -pub fn prepare_message_proof_from_parachain( - params: MessageProofParams, - message_destination: InteriorMultiLocation, -) -> (FromBridgedChainMessagesProof>>, Weight) -where - R: pallet_bridge_parachains::Config, - PI: 'static, - B: MessageBridge, - UnderlyingChainOf>: Chain + Parachain, -{ - // prepare storage proof - let (state_root, storage_proof) = prepare_messages_storage_proof::( - params.lane, - params.message_nonces.clone(), - params.outbound_lane_data.clone(), - params.size, - prepare_inbound_message(¶ms, message_destination), - encode_all_messages, - encode_lane_data, - ); - - // update runtime storage - let (_, bridged_header_hash) = - insert_header_to_parachains_pallet::>>(state_root); - - ( - FromBridgedChainMessagesProof { - bridged_header_hash, - storage_proof, - lane: params.lane, - nonces_start: *params.message_nonces.start(), - nonces_end: *params.message_nonces.end(), - }, - Weight::MAX / 1000, - ) -} - -/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. -/// -/// This method is intended to be used when benchmarking pallet, linked to the chain that -/// uses GRANDPA finality. For parachains, please use the -/// `prepare_message_delivery_proof_from_parachain` function. -pub fn prepare_message_delivery_proof_from_grandpa_chain( - params: MessageDeliveryProofParams>>, -) -> FromBridgedChainMessagesDeliveryProof>> -where - R: pallet_bridge_grandpa::Config>>, - FI: 'static, - B: MessageBridge, -{ - // prepare storage proof - let lane = params.lane; - let (state_root, storage_proof) = prepare_message_delivery_proof::(params); - - // update runtime storage - let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::(state_root); - - FromBridgedChainMessagesDeliveryProof { - bridged_header_hash: bridged_header_hash.into(), - storage_proof, - lane, - } -} - -/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call. -/// -/// This method is intended to be used when benchmarking pallet, linked to the chain that -/// uses parachain finality. For GRANDPA chains, please use the -/// `prepare_message_delivery_proof_from_grandpa_chain` function. -pub fn prepare_message_delivery_proof_from_parachain( - params: MessageDeliveryProofParams>>, -) -> FromBridgedChainMessagesDeliveryProof>> -where - R: pallet_bridge_parachains::Config, - PI: 'static, - B: MessageBridge, - UnderlyingChainOf>: Chain + Parachain, -{ - // prepare storage proof - let lane = params.lane; - let (state_root, storage_proof) = prepare_message_delivery_proof::(params); - - // update runtime storage - let (_, bridged_header_hash) = - insert_header_to_parachains_pallet::>>(state_root); - - FromBridgedChainMessagesDeliveryProof { - bridged_header_hash: bridged_header_hash.into(), - storage_proof, - lane, - } -} - -/// Prepare in-memory message delivery proof, without inserting anything to the runtime storage. -fn prepare_message_delivery_proof( - params: MessageDeliveryProofParams>>, -) -> (HashOf>, RawStorageProof) -where - B: MessageBridge, -{ - // prepare Bridged chain storage with inbound lane state - let storage_key = - storage_keys::inbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, ¶ms.lane).0; - let mut root = Default::default(); - let mut mdb = MemoryDB::default(); - { - let mut trie = - TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); - let inbound_lane_data = - grow_trie_leaf_value(params.inbound_lane_data.encode(), params.size); - trie.insert(&storage_key, &inbound_lane_data) - .map_err(|_| "TrieMut::insert has failed") - .expect("TrieMut::insert should not fail in benchmarks"); - } - - // generate storage proof to be delivered to This chain - let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) - .map_err(|_| "record_all_trie_keys has failed") - .expect("record_all_trie_keys should not fail in benchmarks"); - - (root, storage_proof) -} - -/// Insert header to the bridge GRANDPA pallet. -pub(crate) fn insert_header_to_grandpa_pallet( - state_root: bp_runtime::HashOf, -) -> (bp_runtime::BlockNumberOf, bp_runtime::HashOf) -where - R: pallet_bridge_grandpa::Config, - GI: 'static, - R::BridgedChain: bp_runtime::Chain, -{ - let bridged_block_number = Zero::zero(); - let bridged_header = bp_runtime::HeaderOf::::new( - bridged_block_number, - Default::default(), - state_root, - Default::default(), - Default::default(), - ); - let bridged_header_hash = bridged_header.hash(); - pallet_bridge_grandpa::initialize_for_benchmarks::(bridged_header); - (bridged_block_number, bridged_header_hash) -} - -/// Insert header to the bridge parachains pallet. -pub(crate) fn insert_header_to_parachains_pallet( - state_root: bp_runtime::HashOf, -) -> (bp_runtime::BlockNumberOf, bp_runtime::HashOf) -where - R: pallet_bridge_parachains::Config, - PI: 'static, - PC: Chain + Parachain, -{ - let bridged_block_number = Zero::zero(); - let bridged_header = bp_runtime::HeaderOf::::new( - bridged_block_number, - Default::default(), - state_root, - Default::default(), - Default::default(), - ); - let bridged_header_hash = bridged_header.hash(); - pallet_bridge_parachains::initialize_for_benchmarks::(bridged_header); - (bridged_block_number, bridged_header_hash) -} diff --git a/cumulus/bridges/bin/runtime-common/src/messages_generation.rs b/cumulus/bridges/bin/runtime-common/src/messages_generation.rs deleted file mode 100644 index 8dbf3abd683c..000000000000 --- a/cumulus/bridges/bin/runtime-common/src/messages_generation.rs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2019-2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Helpers for generating message storage proofs, that are used by tests and by benchmarks. - -use crate::messages::{BridgedChain, HashOf, HasherOf, MessageBridge}; - -use bp_messages::{ - storage_keys, LaneId, MessageKey, MessageNonce, MessagePayload, OutboundLaneData, -}; -use bp_runtime::{record_all_trie_keys, RawStorageProof, StorageProofSize}; -use codec::Encode; -use sp_std::{ops::RangeInclusive, prelude::*}; -use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; - -/// Simple and correct message data encode function. -pub fn encode_all_messages(_: MessageNonce, m: &MessagePayload) -> Option> { - Some(m.encode()) -} - -/// Simple and correct outbound lane data encode function. -pub fn encode_lane_data(d: &OutboundLaneData) -> Vec { - d.encode() -} - -/// Prepare storage proof of given messages. -/// -/// Returns state trie root and nodes with prepared messages. -pub fn prepare_messages_storage_proof( - lane: LaneId, - message_nonces: RangeInclusive, - outbound_lane_data: Option, - size: StorageProofSize, - message_payload: MessagePayload, - encode_message: impl Fn(MessageNonce, &MessagePayload) -> Option>, - encode_outbound_lane_data: impl Fn(&OutboundLaneData) -> Vec, -) -> (HashOf>, RawStorageProof) -where - B: MessageBridge, - HashOf>: Copy + Default, -{ - // prepare Bridged chain storage with messages and (optionally) outbound lane state - let message_count = message_nonces.end().saturating_sub(*message_nonces.start()) + 1; - let mut storage_keys = Vec::with_capacity(message_count as usize + 1); - let mut root = Default::default(); - let mut mdb = MemoryDB::default(); - { - let mut trie = - TrieDBMutBuilderV1::>>::new(&mut mdb, &mut root).build(); - - // insert messages - for (i, nonce) in message_nonces.into_iter().enumerate() { - let message_key = MessageKey { lane_id: lane, nonce }; - let message_payload = match encode_message(nonce, &message_payload) { - Some(message_payload) => - if i == 0 { - grow_trie_leaf_value(message_payload, size) - } else { - message_payload - }, - None => continue, - }; - let storage_key = storage_keys::message_key( - B::BRIDGED_MESSAGES_PALLET_NAME, - &message_key.lane_id, - message_key.nonce, - ) - .0; - trie.insert(&storage_key, &message_payload) - .map_err(|_| "TrieMut::insert has failed") - .expect("TrieMut::insert should not fail in benchmarks"); - storage_keys.push(storage_key); - } - - // insert outbound lane state - if let Some(outbound_lane_data) = outbound_lane_data.as_ref().map(encode_outbound_lane_data) - { - let storage_key = - storage_keys::outbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, &lane).0; - trie.insert(&storage_key, &outbound_lane_data) - .map_err(|_| "TrieMut::insert has failed") - .expect("TrieMut::insert should not fail in benchmarks"); - storage_keys.push(storage_key); - } - } - - // generate storage proof to be delivered to This chain - let storage_proof = record_all_trie_keys::>>, _>(&mdb, &root) - .map_err(|_| "record_all_trie_keys has failed") - .expect("record_all_trie_keys should not fail in benchmarks"); - (root, storage_proof) -} - -/// Add extra data to the trie leaf value so that it'll be of given size. -pub fn grow_trie_leaf_value(mut value: Vec, size: StorageProofSize) -> Vec { - match size { - StorageProofSize::Minimal(_) => (), - StorageProofSize::HasLargeLeaf(size) if size as usize > value.len() => { - value.extend(sp_std::iter::repeat(42u8).take(size as usize - value.len())); - }, - StorageProofSize::HasLargeLeaf(_) => (), - } - value -} diff --git a/cumulus/bridges/bin/runtime-common/src/mock.rs b/cumulus/bridges/bin/runtime-common/src/mock.rs deleted file mode 100644 index 9c41d17fa995..000000000000 --- a/cumulus/bridges/bin/runtime-common/src/mock.rs +++ /dev/null @@ -1,452 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! A mock runtime for testing different stuff in the crate. We've been using Millau -//! runtime for that before, but it has two drawbacks: -//! -//! - circular dependencies between this crate and Millau runtime; -//! -//! - we can't use (e.g. as git subtree or by copying) this crate in repo without Millau. - -#![cfg(test)] - -use crate::messages::{ - source::{ - FromThisChainMaximalOutboundPayloadSize, FromThisChainMessagePayload, - FromThisChainMessageVerifier, TargetHeaderChainAdapter, - }, - target::{FromBridgedChainMessagePayload, SourceHeaderChainAdapter}, - BridgedChainWithMessages, HashOf, MessageBridge, ThisChainWithMessages, -}; - -use bp_header_chain::{ChainWithGrandpa, HeaderChain}; -use bp_messages::{ - target_chain::{DispatchMessage, MessageDispatch}, - LaneId, MessageNonce, -}; -use bp_parachains::SingleParaStoredHeaderDataBuilder; -use bp_relayers::PayRewardFromAccount; -use bp_runtime::{ - messages::MessageDispatchResult, Chain, ChainId, Parachain, UnderlyingChainProvider, -}; -use codec::{Decode, Encode}; -use frame_support::{ - parameter_types, - weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight}, -}; -use pallet_transaction_payment::Multiplier; -use sp_runtime::{ - testing::H256, - traits::{BlakeTwo256, ConstU32, ConstU64, ConstU8, IdentityLookup}, - FixedPointNumber, Perquintill, -}; - -/// Account identifier at `ThisChain`. -pub type ThisChainAccountId = u64; -/// Balance at `ThisChain`. -pub type ThisChainBalance = u64; -/// Block number at `ThisChain`. -pub type ThisChainBlockNumber = u32; -/// Hash at `ThisChain`. -pub type ThisChainHash = H256; -/// Hasher at `ThisChain`. -pub type ThisChainHasher = BlakeTwo256; -/// Runtime call at `ThisChain`. -pub type ThisChainRuntimeCall = RuntimeCall; -/// Runtime call origin at `ThisChain`. -pub type ThisChainCallOrigin = RuntimeOrigin; -/// Header of `ThisChain`. -pub type ThisChainHeader = sp_runtime::generic::Header; -/// Block of `ThisChain`. -pub type ThisChainBlock = frame_system::mocking::MockBlockU32; - -/// Account identifier at the `BridgedChain`. -pub type BridgedChainAccountId = u128; -/// Balance at the `BridgedChain`. -pub type BridgedChainBalance = u128; -/// Block number at the `BridgedChain`. -pub type BridgedChainBlockNumber = u32; -/// Hash at the `BridgedChain`. -pub type BridgedChainHash = H256; -/// Hasher at the `BridgedChain`. -pub type BridgedChainHasher = BlakeTwo256; -/// Header of the `BridgedChain`. -pub type BridgedChainHeader = - sp_runtime::generic::Header; - -/// Rewards payment procedure. -pub type TestPaymentProcedure = PayRewardFromAccount; -/// Stake that we are using in tests. -pub type TestStake = ConstU64<5_000>; -/// Stake and slash mechanism to use in tests. -pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< - ThisChainAccountId, - ThisChainBlockNumber, - Balances, - ReserveId, - TestStake, - ConstU32<8>, ->; - -/// Message lane used in tests. -pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 0]); -/// Bridged chain id used in tests. -pub const TEST_BRIDGED_CHAIN_ID: ChainId = *b"brdg"; -/// Maximal extrinsic weight at the `BridgedChain`. -pub const BRIDGED_CHAIN_MAX_EXTRINSIC_WEIGHT: usize = 2048; -/// Maximal extrinsic size at the `BridgedChain`. -pub const BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE: u32 = 1024; - -frame_support::construct_runtime! { - pub enum TestRuntime - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Utility: pallet_utility, - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event}, - BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event}, - BridgeGrandpa: pallet_bridge_grandpa::{Pallet, Call, Storage, Event}, - BridgeParachains: pallet_bridge_parachains::{Pallet, Call, Storage, Event}, - BridgeMessages: pallet_bridge_messages::{Pallet, Call, Storage, Event, Config}, - } -} - -crate::generate_bridge_reject_obsolete_headers_and_messages! { - ThisChainRuntimeCall, ThisChainAccountId, - BridgeGrandpa, BridgeParachains, BridgeMessages -} - -parameter_types! { - pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID]; - pub const BridgedChainId: ChainId = TEST_BRIDGED_CHAIN_ID; - pub const BridgedParasPalletName: &'static str = "Paras"; - pub const ExistentialDeposit: ThisChainBalance = 500; - pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; - pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); - pub const TransactionBaseFee: ThisChainBalance = 0; - pub const TransactionByteFee: ThisChainBalance = 1; - pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000); - pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000u128); - pub MaximumMultiplier: Multiplier = sp_runtime::traits::Bounded::max_value(); - pub const MaxUnrewardedRelayerEntriesAtInboundLane: MessageNonce = 16; - pub const MaxUnconfirmedMessagesAtInboundLane: MessageNonce = 1_000; - pub const ReserveId: [u8; 8] = *b"brdgrlrs"; -} - -impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = ThisChainHash; - type Hashing = ThisChainHasher; - type AccountId = ThisChainAccountId; - type Lookup = IdentityLookup; - type Block = ThisChainBlock; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU32<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = (); - type BlockLength = (); - type DbWeight = DbWeight; - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_utility::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = (); -} - -impl pallet_balances::Config for TestRuntime { - type Balance = ThisChainBalance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = ConstU32<50>; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -impl pallet_transaction_payment::Config for TestRuntime { - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type OperationalFeeMultiplier = ConstU8<5>; - type WeightToFee = IdentityFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = pallet_transaction_payment::TargetedFeeAdjustment< - TestRuntime, - TargetBlockFullness, - AdjustmentVariable, - MinimumMultiplier, - MaximumMultiplier, - >; - type RuntimeEvent = RuntimeEvent; -} - -impl pallet_bridge_grandpa::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type BridgedChain = BridgedUnderlyingChain; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; - type HeadersToKeep = ConstU32<8>; - type WeightInfo = pallet_bridge_grandpa::weights::BridgeWeight; -} - -impl pallet_bridge_parachains::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type BridgesGrandpaPalletInstance = (); - type ParasPalletName = BridgedParasPalletName; - type ParaStoredHeaderDataBuilder = - SingleParaStoredHeaderDataBuilder; - type HeadsToKeep = ConstU32<8>; - type MaxParaHeadDataSize = ConstU32<1024>; - type WeightInfo = pallet_bridge_parachains::weights::BridgeWeight; -} - -impl pallet_bridge_messages::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = pallet_bridge_messages::weights::BridgeWeight; - type ActiveOutboundLanes = ActiveOutboundLanes; - type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - - type MaximalOutboundPayloadSize = FromThisChainMaximalOutboundPayloadSize; - type OutboundPayload = FromThisChainMessagePayload; - - type InboundPayload = FromBridgedChainMessagePayload; - type InboundRelayer = BridgedChainAccountId; - type DeliveryPayments = (); - - type TargetHeaderChain = TargetHeaderChainAdapter; - type LaneMessageVerifier = FromThisChainMessageVerifier; - type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< - TestRuntime, - (), - ConstU64<100_000>, - >; - type OnMessagesDelivered = (); - - type SourceHeaderChain = SourceHeaderChainAdapter; - type MessageDispatch = DummyMessageDispatch; - type BridgedChainId = BridgedChainId; -} - -impl pallet_bridge_relayers::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type Reward = ThisChainBalance; - type PaymentProcedure = TestPaymentProcedure; - type StakeAndSlash = TestStakeAndSlash; - type WeightInfo = (); -} - -/// Dummy message dispatcher. -pub struct DummyMessageDispatch; - -impl DummyMessageDispatch { - pub fn deactivate() { - frame_support::storage::unhashed::put(&b"inactive"[..], &false); - } -} - -impl MessageDispatch for DummyMessageDispatch { - type DispatchPayload = Vec; - type DispatchLevelResult = (); - - fn is_active() -> bool { - frame_support::storage::unhashed::take::(&b"inactive"[..]) != Some(false) - } - - fn dispatch_weight(_message: &mut DispatchMessage) -> Weight { - Weight::zero() - } - - fn dispatch( - _: DispatchMessage, - ) -> MessageDispatchResult { - MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result: () } - } -} - -/// Bridge that is deployed on `ThisChain` and allows sending/receiving messages to/from -/// `BridgedChain`. -#[derive(Debug, PartialEq, Eq)] -pub struct OnThisChainBridge; - -impl MessageBridge for OnThisChainBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; - - type ThisChain = ThisChain; - type BridgedChain = BridgedChain; - type BridgedHeaderChain = pallet_bridge_grandpa::GrandpaChainHeaders; -} - -/// Bridge that is deployed on `BridgedChain` and allows sending/receiving messages to/from -/// `ThisChain`. -#[derive(Debug, PartialEq, Eq)] -pub struct OnBridgedChainBridge; - -impl MessageBridge for OnBridgedChainBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; - - type ThisChain = BridgedChain; - type BridgedChain = ThisChain; - type BridgedHeaderChain = ThisHeaderChain; -} - -/// Dummy implementation of `HeaderChain` for `ThisChain` at the `BridgedChain`. -pub struct ThisHeaderChain; - -impl HeaderChain for ThisHeaderChain { - fn finalized_header_state_root(_hash: HashOf) -> Option> { - unreachable!() - } -} - -/// Call origin at `BridgedChain`. -#[derive(Clone, Debug)] -pub struct BridgedChainOrigin; - -impl From - for Result, BridgedChainOrigin> -{ - fn from( - _origin: BridgedChainOrigin, - ) -> Result, BridgedChainOrigin> { - unreachable!() - } -} - -/// Underlying chain of `ThisChain`. -pub struct ThisUnderlyingChain; - -impl Chain for ThisUnderlyingChain { - type BlockNumber = ThisChainBlockNumber; - type Hash = ThisChainHash; - type Hasher = ThisChainHasher; - type Header = ThisChainHeader; - type AccountId = ThisChainAccountId; - type Balance = ThisChainBalance; - type Nonce = u32; - type Signature = sp_runtime::MultiSignature; - - fn max_extrinsic_size() -> u32 { - BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE - } - - fn max_extrinsic_weight() -> Weight { - Weight::zero() - } -} - -/// The chain where we are in tests. -pub struct ThisChain; - -impl UnderlyingChainProvider for ThisChain { - type Chain = ThisUnderlyingChain; -} - -impl ThisChainWithMessages for ThisChain { - type RuntimeOrigin = ThisChainCallOrigin; -} - -impl BridgedChainWithMessages for ThisChain {} - -/// Underlying chain of `BridgedChain`. -pub struct BridgedUnderlyingChain; -/// Some parachain under `BridgedChain` consensus. -pub struct BridgedUnderlyingParachain; -/// Runtime call of the `BridgedChain`. -#[derive(Decode, Encode)] -pub struct BridgedChainCall; - -impl Chain for BridgedUnderlyingChain { - type BlockNumber = BridgedChainBlockNumber; - type Hash = BridgedChainHash; - type Hasher = BridgedChainHasher; - type Header = BridgedChainHeader; - type AccountId = BridgedChainAccountId; - type Balance = BridgedChainBalance; - type Nonce = u32; - type Signature = sp_runtime::MultiSignature; - - fn max_extrinsic_size() -> u32 { - BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE - } - fn max_extrinsic_weight() -> Weight { - Weight::zero() - } -} - -impl ChainWithGrandpa for BridgedUnderlyingChain { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; - const MAX_AUTHORITIES_COUNT: u32 = 16; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; - const MAX_HEADER_SIZE: u32 = 256; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; -} - -impl Chain for BridgedUnderlyingParachain { - type BlockNumber = BridgedChainBlockNumber; - type Hash = BridgedChainHash; - type Hasher = BridgedChainHasher; - type Header = BridgedChainHeader; - type AccountId = BridgedChainAccountId; - type Balance = BridgedChainBalance; - type Nonce = u32; - type Signature = sp_runtime::MultiSignature; - - fn max_extrinsic_size() -> u32 { - BRIDGED_CHAIN_MAX_EXTRINSIC_SIZE - } - fn max_extrinsic_weight() -> Weight { - Weight::zero() - } -} - -impl Parachain for BridgedUnderlyingParachain { - const PARACHAIN_ID: u32 = 42; -} - -/// The other, bridged chain, used in tests. -pub struct BridgedChain; - -impl UnderlyingChainProvider for BridgedChain { - type Chain = BridgedUnderlyingChain; -} - -impl ThisChainWithMessages for BridgedChain { - type RuntimeOrigin = BridgedChainOrigin; -} - -impl BridgedChainWithMessages for BridgedChain {} - -/// Run test within test externalities. -pub fn run_test(test: impl FnOnce()) { - sp_io::TestExternalities::new(Default::default()).execute_with(test) -} diff --git a/cumulus/bridges/bin/runtime-common/src/refund_relayer_extension.rs b/cumulus/bridges/bin/runtime-common/src/refund_relayer_extension.rs deleted file mode 100644 index f611686420c2..000000000000 --- a/cumulus/bridges/bin/runtime-common/src/refund_relayer_extension.rs +++ /dev/null @@ -1,1740 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Signed extension that refunds relayer if he has delivered some new messages. -//! It also refunds transaction cost if the transaction is an `utility.batchAll()` -//! with calls that are: delivering new messsage and all necessary underlying headers -//! (parachain or relay chain). - -use crate::messages_call_ext::{ - CallHelper as MessagesCallHelper, CallInfo as MessagesCallInfo, MessagesCallSubType, -}; -use bp_messages::{LaneId, MessageNonce}; -use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{Parachain, ParachainIdOf, RangeInclusiveExt, StaticStrProvider}; -use codec::{Decode, Encode}; -use frame_support::{ - dispatch::{CallableCallFor, DispatchInfo, Dispatchable, PostDispatchInfo}, - traits::IsSubType, - weights::Weight, - CloneNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound, RuntimeDebug, RuntimeDebugNoBound, -}; -use pallet_bridge_grandpa::{ - CallSubType as GrandpaCallSubType, SubmitFinalityProofHelper, SubmitFinalityProofInfo, -}; -use pallet_bridge_messages::Config as MessagesConfig; -use pallet_bridge_parachains::{ - BoundedBridgeGrandpaConfig, CallSubType as ParachainsCallSubType, Config as ParachainsConfig, - RelayBlockNumber, SubmitParachainHeadsHelper, SubmitParachainHeadsInfo, -}; -use pallet_bridge_relayers::{ - Config as RelayersConfig, Pallet as RelayersPallet, WeightInfoExt as _, -}; -use pallet_transaction_payment::{Config as TransactionPaymentConfig, OnChargeTransaction}; -use pallet_utility::{Call as UtilityCall, Config as UtilityConfig, Pallet as UtilityPallet}; -use scale_info::TypeInfo; -use sp_runtime::{ - traits::{DispatchInfoOf, Get, PostDispatchInfoOf, SignedExtension, Zero}, - transaction_validity::{ - TransactionPriority, TransactionValidity, TransactionValidityError, ValidTransactionBuilder, - }, - DispatchResult, FixedPointOperand, -}; -use sp_std::{marker::PhantomData, vec, vec::Vec}; - -type AccountIdOf = ::AccountId; -// without this typedef rustfmt fails with internal err -type BalanceOf = - <::OnChargeTransaction as OnChargeTransaction>::Balance; -type CallOf = ::RuntimeCall; - -/// Trait identifying a bridged parachain. A relayer might be refunded for delivering messages -/// coming from this parachain. -pub trait RefundableParachainId { - /// The instance of the bridge parachains pallet. - type Instance; - /// The parachain Id. - type Id: Get; -} - -/// Default implementation of `RefundableParachainId`. -pub struct DefaultRefundableParachainId(PhantomData<(Instance, Id)>); - -impl RefundableParachainId for DefaultRefundableParachainId -where - Id: Get, -{ - type Instance = Instance; - type Id = Id; -} - -/// Implementation of `RefundableParachainId` for `trait Parachain`. -pub struct RefundableParachain(PhantomData<(Instance, Para)>); - -impl RefundableParachainId for RefundableParachain -where - Para: Parachain, -{ - type Instance = Instance; - type Id = ParachainIdOf; -} - -/// Trait identifying a bridged messages lane. A relayer might be refunded for delivering messages -/// coming from this lane. -pub trait RefundableMessagesLaneId { - /// The instance of the bridge messages pallet. - type Instance; - /// The messages lane id. - type Id: Get; -} - -/// Default implementation of `RefundableMessagesLaneId`. -pub struct RefundableMessagesLane(PhantomData<(Instance, Id)>); - -impl RefundableMessagesLaneId for RefundableMessagesLane -where - Id: Get, -{ - type Instance = Instance; - type Id = Id; -} - -/// Refund calculator. -pub trait RefundCalculator { - // The underlying integer type in which the refund is calculated. - type Balance; - - /// Compute refund for given transaction. - fn compute_refund( - info: &DispatchInfo, - post_info: &PostDispatchInfo, - len: usize, - tip: Self::Balance, - ) -> Self::Balance; -} - -/// `RefundCalculator` implementation which refunds the actual transaction fee. -pub struct ActualFeeRefund(PhantomData); - -impl RefundCalculator for ActualFeeRefund -where - R: TransactionPaymentConfig, - CallOf: Dispatchable, - BalanceOf: FixedPointOperand, -{ - type Balance = BalanceOf; - - fn compute_refund( - info: &DispatchInfo, - post_info: &PostDispatchInfo, - len: usize, - tip: BalanceOf, - ) -> BalanceOf { - pallet_transaction_payment::Pallet::::compute_actual_fee(len as _, info, post_info, tip) - } -} - -/// Data that is crafted in `pre_dispatch` method and used at `post_dispatch`. -#[cfg_attr(test, derive(Debug, PartialEq))] -pub struct PreDispatchData { - /// Transaction submitter (relayer) account. - relayer: AccountId, - /// Type of the call. - call_info: CallInfo, -} - -/// Type of the call that the extension recognizes. -#[derive(RuntimeDebugNoBound, PartialEq)] -pub enum CallInfo { - /// Relay chain finality + parachain finality + message delivery/confirmation calls. - AllFinalityAndMsgs( - SubmitFinalityProofInfo, - SubmitParachainHeadsInfo, - MessagesCallInfo, - ), - /// Parachain finality + message delivery/confirmation calls. - ParachainFinalityAndMsgs(SubmitParachainHeadsInfo, MessagesCallInfo), - /// Standalone message delivery/confirmation call. - Msgs(MessagesCallInfo), -} - -impl CallInfo { - /// Returns true if call is a message delivery call (with optional finality calls). - fn is_receive_messages_proof_call(&self) -> bool { - match self.messages_call_info() { - MessagesCallInfo::ReceiveMessagesProof(_) => true, - MessagesCallInfo::ReceiveMessagesDeliveryProof(_) => false, - } - } - - /// Returns the pre-dispatch `finality_target` sent to the `SubmitFinalityProof` call. - fn submit_finality_proof_info(&self) -> Option> { - match *self { - Self::AllFinalityAndMsgs(info, _, _) => Some(info), - _ => None, - } - } - - /// Returns the pre-dispatch `SubmitParachainHeadsInfo`. - fn submit_parachain_heads_info(&self) -> Option<&SubmitParachainHeadsInfo> { - match self { - Self::AllFinalityAndMsgs(_, info, _) => Some(info), - Self::ParachainFinalityAndMsgs(info, _) => Some(info), - _ => None, - } - } - - /// Returns the pre-dispatch `ReceiveMessagesProofInfo`. - fn messages_call_info(&self) -> &MessagesCallInfo { - match self { - Self::AllFinalityAndMsgs(_, _, info) => info, - Self::ParachainFinalityAndMsgs(_, info) => info, - Self::Msgs(info) => info, - } - } -} - -/// The actions on relayer account that need to be performed because of his actions. -#[derive(RuntimeDebug, PartialEq)] -enum RelayerAccountAction { - /// Do nothing with relayer account. - None, - /// Reward the relayer. - Reward(AccountId, RewardsAccountParams, Reward), - /// Slash the relayer. - Slash(AccountId, RewardsAccountParams), -} - -/// Signed extension that refunds a relayer for new messages coming from a parachain. -/// -/// Also refunds relayer for successful finality delivery if it comes in batch (`utility.batchAll`) -/// with message delivery transaction. Batch may deliver either both relay chain header and -/// parachain head, or just parachain head. Corresponding headers must be used in messages -/// proof verification. -/// -/// Extension does not refund transaction tip due to security reasons. -#[derive( - DefaultNoBound, - CloneNoBound, - Decode, - Encode, - EqNoBound, - PartialEqNoBound, - RuntimeDebugNoBound, - TypeInfo, -)] -#[scale_info(skip_type_params(Runtime, Para, Msgs, Refund, Priority, Id))] -pub struct RefundBridgedParachainMessages( - PhantomData<( - // runtime with `frame-utility`, `pallet-bridge-grandpa`, `pallet-bridge-parachains`, - // `pallet-bridge-messages` and `pallet-bridge-relayers` pallets deployed - Runtime, - // implementation of `RefundableParachainId` trait, which specifies the instance of - // the used `pallet-bridge-parachains` pallet and the bridged parachain id - Para, - // implementation of `RefundableMessagesLaneId` trait, which specifies the instance of - // the used `pallet-bridge-messages` pallet and the lane within this pallet - Msgs, - // implementation of the `RefundCalculator` trait, that is used to compute refund that - // we give to relayer for his transaction - Refund, - // getter for per-message `TransactionPriority` boost that we give to message - // delivery transactions - Priority, - // the runtime-unique identifier of this signed extension - Id, - )>, -); - -impl - RefundBridgedParachainMessages -where - Self: 'static + Send + Sync, - Runtime: UtilityConfig> - + BoundedBridgeGrandpaConfig - + ParachainsConfig - + MessagesConfig - + RelayersConfig, - Para: RefundableParachainId, - Msgs: RefundableMessagesLaneId, - Refund: RefundCalculator, - Priority: Get, - Id: StaticStrProvider, - CallOf: Dispatchable - + IsSubType, Runtime>> - + GrandpaCallSubType - + ParachainsCallSubType - + MessagesCallSubType, -{ - fn expand_call<'a>(&self, call: &'a CallOf) -> Vec<&'a CallOf> { - match call.is_sub_type() { - Some(UtilityCall::::batch_all { ref calls }) if calls.len() <= 3 => - calls.iter().collect(), - Some(_) => vec![], - None => vec![call], - } - } - - fn parse_and_check_for_obsolete_call( - &self, - call: &CallOf, - ) -> Result, TransactionValidityError> { - let calls = self.expand_call(call); - let total_calls = calls.len(); - let mut calls = calls.into_iter().map(Self::check_obsolete_call).rev(); - - let msgs_call = calls.next().transpose()?.and_then(|c| c.call_info_for(Msgs::Id::get())); - let para_finality_call = calls - .next() - .transpose()? - .and_then(|c| c.submit_parachain_heads_info_for(Para::Id::get())); - let relay_finality_call = - calls.next().transpose()?.and_then(|c| c.submit_finality_proof_info()); - - Ok(match (total_calls, relay_finality_call, para_finality_call, msgs_call) { - (3, Some(relay_finality_call), Some(para_finality_call), Some(msgs_call)) => Some( - CallInfo::AllFinalityAndMsgs(relay_finality_call, para_finality_call, msgs_call), - ), - (2, None, Some(para_finality_call), Some(msgs_call)) => - Some(CallInfo::ParachainFinalityAndMsgs(para_finality_call, msgs_call)), - (1, None, None, Some(msgs_call)) => Some(CallInfo::Msgs(msgs_call)), - _ => None, - }) - } - - fn check_obsolete_call( - call: &CallOf, - ) -> Result<&CallOf, TransactionValidityError> { - call.check_obsolete_submit_finality_proof()?; - call.check_obsolete_submit_parachain_heads()?; - call.check_obsolete_call()?; - Ok(call) - } - - /// Given post-dispatch information, analyze the outcome of relayer call and return - /// actions that need to be performed on relayer account. - fn analyze_call_result( - pre: Option>>, - info: &DispatchInfo, - post_info: &PostDispatchInfo, - len: usize, - result: &DispatchResult, - ) -> RelayerAccountAction, Runtime::Reward> { - let mut extra_weight = Weight::zero(); - let mut extra_size = 0; - - // We don't refund anything for transactions that we don't support. - let (relayer, call_info) = match pre { - Some(Some(pre)) => (pre.relayer, pre.call_info), - _ => return RelayerAccountAction::None, - }; - - // now we know that the relayer either needs to be rewarded, or slashed - // => let's prepare the correspondent account that pays reward/receives slashed amount - let reward_account_params = RewardsAccountParams::new( - Msgs::Id::get(), - Runtime::BridgedChainId::get(), - if call_info.is_receive_messages_proof_call() { - RewardsAccountOwner::ThisChain - } else { - RewardsAccountOwner::BridgedChain - }, - ); - - // prepare return value for the case if the call has failed or it has not caused - // expected side effects (e.g. not all messages have been accepted) - // - // we are not checking if relayer is registered here - it happens during the slash attempt - // - // there are couple of edge cases here: - // - // - when the relayer becomes registered during message dispatch: this is unlikely + relayer - // should be ready for slashing after registration; - // - // - when relayer is registered after `validate` is called and priority is not boosted: - // relayer should be ready for slashing after registration. - let may_slash_relayer = - Self::bundled_messages_for_priority_boost(Some(&call_info)).is_some(); - let slash_relayer_if_delivery_result = may_slash_relayer - .then(|| RelayerAccountAction::Slash(relayer.clone(), reward_account_params)) - .unwrap_or(RelayerAccountAction::None); - - // We don't refund anything if the transaction has failed. - if let Err(e) = result { - log::trace!( - target: "runtime::bridge", - "{} from parachain {} via {:?}: relayer {:?} has submitted invalid messages transaction: {:?}", - Self::IDENTIFIER, - Para::Id::get(), - Msgs::Id::get(), - relayer, - e, - ); - return slash_relayer_if_delivery_result - } - - // check if relay chain state has been updated - if let Some(finality_proof_info) = call_info.submit_finality_proof_info() { - if !SubmitFinalityProofHelper::::was_successful( - finality_proof_info.block_number, - ) { - // we only refund relayer if all calls have updated chain state - log::trace!( - target: "runtime::bridge", - "{} from parachain {} via {:?}: relayer {:?} has submitted invalid relay chain finality proof", - Self::IDENTIFIER, - Para::Id::get(), - Msgs::Id::get(), - relayer, - ); - return slash_relayer_if_delivery_result; - } - - // there's a conflict between how bridge GRANDPA pallet works and a `utility.batchAll` - // transaction. If relay chain header is mandatory, the GRANDPA pallet returns - // `Pays::No`, because such transaction is mandatory for operating the bridge. But - // `utility.batchAll` transaction always requires payment. But in both cases we'll - // refund relayer - either explicitly here, or using `Pays::No` if he's choosing - // to submit dedicated transaction. - - // submitter has means to include extra weight/bytes in the `submit_finality_proof` - // call, so let's subtract extra weight/size to avoid refunding for this extra stuff - extra_weight = finality_proof_info.extra_weight; - extra_size = finality_proof_info.extra_size; - } - - // check if parachain state has been updated - if let Some(para_proof_info) = call_info.submit_parachain_heads_info() { - if !SubmitParachainHeadsHelper::::was_successful( - para_proof_info, - ) { - // we only refund relayer if all calls have updated chain state - log::trace!( - target: "runtime::bridge", - "{} from parachain {} via {:?}: relayer {:?} has submitted invalid parachain finality proof", - Self::IDENTIFIER, - Para::Id::get(), - Msgs::Id::get(), - relayer, - ); - return slash_relayer_if_delivery_result - } - } - - // Check if the `ReceiveMessagesProof` call delivered at least some of the messages that - // it contained. If this happens, we consider the transaction "helpful" and refund it. - let msgs_call_info = call_info.messages_call_info(); - if !MessagesCallHelper::::was_successful(msgs_call_info) { - log::trace!( - target: "runtime::bridge", - "{} from parachain {} via {:?}: relayer {:?} has submitted invalid messages call", - Self::IDENTIFIER, - Para::Id::get(), - Msgs::Id::get(), - relayer, - ); - return slash_relayer_if_delivery_result - } - - // regarding the tip - refund that happens here (at this side of the bridge) isn't the whole - // relayer compensation. He'll receive some amount at the other side of the bridge. It shall - // (in theory) cover the tip there. Otherwise, if we'll be compensating tip here, some - // malicious relayer may use huge tips, effectively depleting account that pay rewards. The - // cost of this attack is nothing. Hence we use zero as tip here. - let tip = Zero::zero(); - - // decrease post-dispatch weight/size using extra weight/size that we know now - let post_info_len = len.saturating_sub(extra_size as usize); - let mut post_info_weight = - post_info.actual_weight.unwrap_or(info.weight).saturating_sub(extra_weight); - - // let's also replace the weight of slashing relayer with the weight of rewarding relayer - if call_info.is_receive_messages_proof_call() { - post_info_weight = post_info_weight.saturating_sub( - ::WeightInfo::extra_weight_of_successful_receive_messages_proof_call(), - ); - } - - // compute the relayer refund - let mut post_info = *post_info; - post_info.actual_weight = Some(post_info_weight); - let refund = Refund::compute_refund(info, &post_info, post_info_len, tip); - - // we can finally reward relayer - RelayerAccountAction::Reward(relayer, reward_account_params, refund) - } - - /// Returns number of bundled messages `Some(_)`, if the given call info is a: - /// - /// - message delivery transaction; - /// - /// - with reasonable bundled messages that may be accepted by the messages pallet. - /// - /// This function is used to check whether the transaction priority should be - /// virtually boosted. The relayer registration (we only boost priority for registered - /// relayer transactions) must be checked outside. - fn bundled_messages_for_priority_boost(call_info: Option<&CallInfo>) -> Option { - // we only boost priority of message delivery transactions - let parsed_call = match call_info { - Some(parsed_call) if parsed_call.is_receive_messages_proof_call() => parsed_call, - _ => return None, - }; - - // compute total number of messages in transaction - let bundled_messages = parsed_call.messages_call_info().bundled_messages().saturating_len(); - - // a quick check to avoid invalid high-priority transactions - if bundled_messages > Runtime::MaxUnconfirmedMessagesAtInboundLane::get() { - return None - } - - Some(bundled_messages) - } -} - -impl SignedExtension - for RefundBridgedParachainMessages -where - Self: 'static + Send + Sync, - Runtime: UtilityConfig> - + BoundedBridgeGrandpaConfig - + ParachainsConfig - + MessagesConfig - + RelayersConfig, - Para: RefundableParachainId, - Msgs: RefundableMessagesLaneId, - Refund: RefundCalculator, - Priority: Get, - Id: StaticStrProvider, - CallOf: Dispatchable - + IsSubType, Runtime>> - + GrandpaCallSubType - + ParachainsCallSubType - + MessagesCallSubType, -{ - const IDENTIFIER: &'static str = Id::STR; - type AccountId = Runtime::AccountId; - type Call = CallOf; - type AdditionalSigned = (); - type Pre = Option>; - - fn additional_signed(&self) -> Result<(), TransactionValidityError> { - Ok(()) - } - - fn validate( - &self, - who: &Self::AccountId, - call: &Self::Call, - _info: &DispatchInfoOf, - _len: usize, - ) -> TransactionValidity { - // this is the only relevant line of code for the `pre_dispatch` - // - // we're not calling `validate` from `pre_dispatch` directly because of performance - // reasons, so if you're adding some code that may fail here, please check if it needs - // to be added to the `pre_dispatch` as well - let parsed_call = self.parse_and_check_for_obsolete_call(call)?; - - // the following code just plays with transaction priority and never returns an error - - // we only boost priority of presumably correct message delivery transactions - let bundled_messages = match Self::bundled_messages_for_priority_boost(parsed_call.as_ref()) - { - Some(bundled_messages) => bundled_messages, - None => return Ok(Default::default()), - }; - - // we only boost priority if relayer has staked required balance - if !RelayersPallet::::is_registration_active(who) { - return Ok(Default::default()) - } - - // compute priority boost - let priority_boost = - crate::priority_calculator::compute_priority_boost::(bundled_messages); - let valid_transaction = ValidTransactionBuilder::default().priority(priority_boost); - - log::trace!( - target: "runtime::bridge", - "{} from parachain {} via {:?} has boosted priority of message delivery transaction \ - of relayer {:?}: {} messages -> {} priority", - Self::IDENTIFIER, - Para::Id::get(), - Msgs::Id::get(), - who, - bundled_messages, - priority_boost, - ); - - valid_transaction.build() - } - - fn pre_dispatch( - self, - who: &Self::AccountId, - call: &Self::Call, - _info: &DispatchInfoOf, - _len: usize, - ) -> Result { - // this is a relevant piece of `validate` that we need here (in `pre_dispatch`) - let parsed_call = self.parse_and_check_for_obsolete_call(call)?; - - Ok(parsed_call.map(|call_info| { - log::trace!( - target: "runtime::bridge", - "{} from parachain {} via {:?} parsed bridge transaction in pre-dispatch: {:?}", - Self::IDENTIFIER, - Para::Id::get(), - Msgs::Id::get(), - call_info, - ); - PreDispatchData { relayer: who.clone(), call_info } - })) - } - - fn post_dispatch( - pre: Option, - info: &DispatchInfoOf, - post_info: &PostDispatchInfoOf, - len: usize, - result: &DispatchResult, - ) -> Result<(), TransactionValidityError> { - let call_result = Self::analyze_call_result(pre, info, post_info, len, result); - - match call_result { - RelayerAccountAction::None => (), - RelayerAccountAction::Reward(relayer, reward_account, reward) => { - RelayersPallet::::register_relayer_reward( - reward_account, - &relayer, - reward, - ); - - log::trace!( - target: "runtime::bridge", - "{} from parachain {} via {:?} has registered reward: {:?} for {:?}", - Self::IDENTIFIER, - Para::Id::get(), - Msgs::Id::get(), - reward, - relayer, - ); - }, - RelayerAccountAction::Slash(relayer, slash_account) => - RelayersPallet::::slash_and_deregister(&relayer, slash_account), - } - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - }, - messages_call_ext::{ - BaseMessagesProofInfo, ReceiveMessagesDeliveryProofInfo, ReceiveMessagesProofInfo, - UnrewardedRelayerOccupation, - }, - mock::*, - }; - use bp_messages::{InboundLaneData, MessageNonce, OutboundLaneData, UnrewardedRelayersState}; - use bp_parachains::{BestParaHeadHash, ParaInfo}; - use bp_polkadot_core::parachains::{ParaHeadsProof, ParaId}; - use bp_runtime::HeaderId; - use bp_test_utils::{make_default_justification, test_keyring}; - use frame_support::{ - assert_storage_noop, parameter_types, - traits::{fungible::Mutate, ReservableCurrency}, - weights::Weight, - }; - use pallet_bridge_grandpa::{Call as GrandpaCall, StoredAuthoritySet}; - use pallet_bridge_messages::Call as MessagesCall; - use pallet_bridge_parachains::{Call as ParachainsCall, RelayBlockHash}; - use sp_runtime::{ - traits::{ConstU64, Header as HeaderT}, - transaction_validity::{InvalidTransaction, ValidTransaction}, - DispatchError, - }; - - parameter_types! { - TestParachain: u32 = 1000; - pub TestLaneId: LaneId = TEST_LANE_ID; - pub MsgProofsRewardsAccount: RewardsAccountParams = RewardsAccountParams::new( - TEST_LANE_ID, - TEST_BRIDGED_CHAIN_ID, - RewardsAccountOwner::ThisChain, - ); - pub MsgDeliveryProofsRewardsAccount: RewardsAccountParams = RewardsAccountParams::new( - TEST_LANE_ID, - TEST_BRIDGED_CHAIN_ID, - RewardsAccountOwner::BridgedChain, - ); - } - - bp_runtime::generate_static_str_provider!(TestExtension); - type TestExtension = RefundBridgedParachainMessages< - TestRuntime, - DefaultRefundableParachainId<(), TestParachain>, - RefundableMessagesLane<(), TestLaneId>, - ActualFeeRefund, - ConstU64<1>, - StrTestExtension, - >; - - fn initial_balance_of_relayer_account_at_this_chain() -> ThisChainBalance { - let test_stake: ThisChainBalance = TestStake::get(); - ExistentialDeposit::get().saturating_add(test_stake * 100) - } - - // in tests, the following accounts are equal (because of how `into_sub_account_truncating` - // works) - - fn delivery_rewards_account() -> ThisChainAccountId { - TestPaymentProcedure::rewards_account(MsgProofsRewardsAccount::get()) - } - - fn confirmation_rewards_account() -> ThisChainAccountId { - TestPaymentProcedure::rewards_account(MsgDeliveryProofsRewardsAccount::get()) - } - - fn relayer_account_at_this_chain() -> ThisChainAccountId { - 0 - } - - fn relayer_account_at_bridged_chain() -> BridgedChainAccountId { - 0 - } - - fn initialize_environment( - best_relay_header_number: RelayBlockNumber, - parachain_head_at_relay_header_number: RelayBlockNumber, - best_message: MessageNonce, - ) { - let authorities = test_keyring().into_iter().map(|(a, w)| (a.into(), w)).collect(); - let best_relay_header = HeaderId(best_relay_header_number, RelayBlockHash::default()); - pallet_bridge_grandpa::CurrentAuthoritySet::::put( - StoredAuthoritySet::try_new(authorities, 0).unwrap(), - ); - pallet_bridge_grandpa::BestFinalized::::put(best_relay_header); - - let para_id = ParaId(TestParachain::get()); - let para_info = ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: parachain_head_at_relay_header_number, - head_hash: [parachain_head_at_relay_header_number as u8; 32].into(), - }, - next_imported_hash_position: 0, - }; - pallet_bridge_parachains::ParasInfo::::insert(para_id, para_info); - - let lane_id = TestLaneId::get(); - let in_lane_data = - InboundLaneData { last_confirmed_nonce: best_message, ..Default::default() }; - pallet_bridge_messages::InboundLanes::::insert(lane_id, in_lane_data); - - let out_lane_data = - OutboundLaneData { latest_received_nonce: best_message, ..Default::default() }; - pallet_bridge_messages::OutboundLanes::::insert(lane_id, out_lane_data); - - Balances::mint_into(&delivery_rewards_account(), ExistentialDeposit::get()).unwrap(); - Balances::mint_into(&confirmation_rewards_account(), ExistentialDeposit::get()).unwrap(); - Balances::mint_into( - &relayer_account_at_this_chain(), - initial_balance_of_relayer_account_at_this_chain(), - ) - .unwrap(); - } - - fn submit_relay_header_call(relay_header_number: RelayBlockNumber) -> RuntimeCall { - let relay_header = BridgedChainHeader::new( - relay_header_number, - Default::default(), - Default::default(), - Default::default(), - Default::default(), - ); - let relay_justification = make_default_justification(&relay_header); - - RuntimeCall::BridgeGrandpa(GrandpaCall::submit_finality_proof { - finality_target: Box::new(relay_header), - justification: relay_justification, - }) - } - - fn submit_parachain_head_call( - parachain_head_at_relay_header_number: RelayBlockNumber, - ) -> RuntimeCall { - RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { - at_relay_block: (parachain_head_at_relay_header_number, RelayBlockHash::default()), - parachains: vec![( - ParaId(TestParachain::get()), - [parachain_head_at_relay_header_number as u8; 32].into(), - )], - parachain_heads_proof: ParaHeadsProof(vec![]), - }) - } - - fn message_delivery_call(best_message: MessageNonce) -> RuntimeCall { - RuntimeCall::BridgeMessages(MessagesCall::receive_messages_proof { - relayer_id_at_bridged_chain: relayer_account_at_bridged_chain(), - proof: FromBridgedChainMessagesProof { - bridged_header_hash: Default::default(), - storage_proof: vec![], - lane: TestLaneId::get(), - nonces_start: pallet_bridge_messages::InboundLanes::::get( - TEST_LANE_ID, - ) - .last_delivered_nonce() + - 1, - nonces_end: best_message, - }, - messages_count: 1, - dispatch_weight: Weight::zero(), - }) - } - - fn message_confirmation_call(best_message: MessageNonce) -> RuntimeCall { - RuntimeCall::BridgeMessages(MessagesCall::receive_messages_delivery_proof { - proof: FromBridgedChainMessagesDeliveryProof { - bridged_header_hash: Default::default(), - storage_proof: vec![], - lane: TestLaneId::get(), - }, - relayers_state: UnrewardedRelayersState { - last_delivered_nonce: best_message, - ..Default::default() - }, - }) - } - - fn parachain_finality_and_delivery_batch_call( - parachain_head_at_relay_header_number: RelayBlockNumber, - best_message: MessageNonce, - ) -> RuntimeCall { - RuntimeCall::Utility(UtilityCall::batch_all { - calls: vec![ - submit_parachain_head_call(parachain_head_at_relay_header_number), - message_delivery_call(best_message), - ], - }) - } - - fn parachain_finality_and_confirmation_batch_call( - parachain_head_at_relay_header_number: RelayBlockNumber, - best_message: MessageNonce, - ) -> RuntimeCall { - RuntimeCall::Utility(UtilityCall::batch_all { - calls: vec![ - submit_parachain_head_call(parachain_head_at_relay_header_number), - message_confirmation_call(best_message), - ], - }) - } - - fn all_finality_and_delivery_batch_call( - relay_header_number: RelayBlockNumber, - parachain_head_at_relay_header_number: RelayBlockNumber, - best_message: MessageNonce, - ) -> RuntimeCall { - RuntimeCall::Utility(UtilityCall::batch_all { - calls: vec![ - submit_relay_header_call(relay_header_number), - submit_parachain_head_call(parachain_head_at_relay_header_number), - message_delivery_call(best_message), - ], - }) - } - - fn all_finality_and_confirmation_batch_call( - relay_header_number: RelayBlockNumber, - parachain_head_at_relay_header_number: RelayBlockNumber, - best_message: MessageNonce, - ) -> RuntimeCall { - RuntimeCall::Utility(UtilityCall::batch_all { - calls: vec![ - submit_relay_header_call(relay_header_number), - submit_parachain_head_call(parachain_head_at_relay_header_number), - message_confirmation_call(best_message), - ], - }) - } - - fn all_finality_pre_dispatch_data() -> PreDispatchData { - PreDispatchData { - relayer: relayer_account_at_this_chain(), - call_info: CallInfo::AllFinalityAndMsgs( - SubmitFinalityProofInfo { - block_number: 200, - extra_weight: Weight::zero(), - extra_size: 0, - }, - SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), - para_head_hash: [200u8; 32].into(), - }, - MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { - base: BaseMessagesProofInfo { - lane_id: TEST_LANE_ID, - bundled_range: 101..=200, - best_stored_nonce: 100, - }, - unrewarded_relayers: UnrewardedRelayerOccupation { - free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), - free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), - }, - }), - ), - } - } - - fn all_finality_confirmation_pre_dispatch_data() -> PreDispatchData { - PreDispatchData { - relayer: relayer_account_at_this_chain(), - call_info: CallInfo::AllFinalityAndMsgs( - SubmitFinalityProofInfo { - block_number: 200, - extra_weight: Weight::zero(), - extra_size: 0, - }, - SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), - para_head_hash: [200u8; 32].into(), - }, - MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( - BaseMessagesProofInfo { - lane_id: TEST_LANE_ID, - bundled_range: 101..=200, - best_stored_nonce: 100, - }, - )), - ), - } - } - - fn parachain_finality_pre_dispatch_data() -> PreDispatchData { - PreDispatchData { - relayer: relayer_account_at_this_chain(), - call_info: CallInfo::ParachainFinalityAndMsgs( - SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), - para_head_hash: [200u8; 32].into(), - }, - MessagesCallInfo::ReceiveMessagesProof(ReceiveMessagesProofInfo { - base: BaseMessagesProofInfo { - lane_id: TEST_LANE_ID, - bundled_range: 101..=200, - best_stored_nonce: 100, - }, - unrewarded_relayers: UnrewardedRelayerOccupation { - free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), - free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), - }, - }), - ), - } - } - - fn parachain_finality_confirmation_pre_dispatch_data() -> PreDispatchData { - PreDispatchData { - relayer: relayer_account_at_this_chain(), - call_info: CallInfo::ParachainFinalityAndMsgs( - SubmitParachainHeadsInfo { - at_relay_block_number: 200, - para_id: ParaId(TestParachain::get()), - para_head_hash: [200u8; 32].into(), - }, - MessagesCallInfo::ReceiveMessagesDeliveryProof(ReceiveMessagesDeliveryProofInfo( - BaseMessagesProofInfo { - lane_id: TEST_LANE_ID, - bundled_range: 101..=200, - best_stored_nonce: 100, - }, - )), - ), - } - } - - fn delivery_pre_dispatch_data() -> PreDispatchData { - PreDispatchData { - relayer: relayer_account_at_this_chain(), - call_info: CallInfo::Msgs(MessagesCallInfo::ReceiveMessagesProof( - ReceiveMessagesProofInfo { - base: BaseMessagesProofInfo { - lane_id: TEST_LANE_ID, - bundled_range: 101..=200, - best_stored_nonce: 100, - }, - unrewarded_relayers: UnrewardedRelayerOccupation { - free_relayer_slots: MaxUnrewardedRelayerEntriesAtInboundLane::get(), - free_message_slots: MaxUnconfirmedMessagesAtInboundLane::get(), - }, - }, - )), - } - } - - fn confirmation_pre_dispatch_data() -> PreDispatchData { - PreDispatchData { - relayer: relayer_account_at_this_chain(), - call_info: CallInfo::Msgs(MessagesCallInfo::ReceiveMessagesDeliveryProof( - ReceiveMessagesDeliveryProofInfo(BaseMessagesProofInfo { - lane_id: TEST_LANE_ID, - bundled_range: 101..=200, - best_stored_nonce: 100, - }), - )), - } - } - - fn set_bundled_range_end( - mut pre_dispatch_data: PreDispatchData, - end: MessageNonce, - ) -> PreDispatchData { - let msg_info = match pre_dispatch_data.call_info { - CallInfo::AllFinalityAndMsgs(_, _, ref mut info) => info, - CallInfo::ParachainFinalityAndMsgs(_, ref mut info) => info, - CallInfo::Msgs(ref mut info) => info, - }; - - if let MessagesCallInfo::ReceiveMessagesProof(ref mut msg_info) = msg_info { - msg_info.base.bundled_range = *msg_info.base.bundled_range.start()..=end - } - - pre_dispatch_data - } - - fn run_validate(call: RuntimeCall) -> TransactionValidity { - let extension: TestExtension = RefundBridgedParachainMessages(PhantomData); - extension.validate(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) - } - - fn run_validate_ignore_priority(call: RuntimeCall) -> TransactionValidity { - run_validate(call).map(|mut tx| { - tx.priority = 0; - tx - }) - } - - fn run_pre_dispatch( - call: RuntimeCall, - ) -> Result>, TransactionValidityError> { - let extension: TestExtension = RefundBridgedParachainMessages(PhantomData); - extension.pre_dispatch(&relayer_account_at_this_chain(), &call, &DispatchInfo::default(), 0) - } - - fn dispatch_info() -> DispatchInfo { - DispatchInfo { - weight: Weight::from_parts( - frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, - 0, - ), - class: frame_support::dispatch::DispatchClass::Normal, - pays_fee: frame_support::dispatch::Pays::Yes, - } - } - - fn post_dispatch_info() -> PostDispatchInfo { - PostDispatchInfo { actual_weight: None, pays_fee: frame_support::dispatch::Pays::Yes } - } - - fn run_post_dispatch( - pre_dispatch_data: Option>, - dispatch_result: DispatchResult, - ) { - let post_dispatch_result = TestExtension::post_dispatch( - Some(pre_dispatch_data), - &dispatch_info(), - &post_dispatch_info(), - 1024, - &dispatch_result, - ); - assert_eq!(post_dispatch_result, Ok(())); - } - - fn expected_delivery_reward() -> ThisChainBalance { - let mut post_dispatch_info = post_dispatch_info(); - let extra_weight = ::WeightInfo::extra_weight_of_successful_receive_messages_proof_call(); - post_dispatch_info.actual_weight = - Some(dispatch_info().weight.saturating_sub(extra_weight)); - pallet_transaction_payment::Pallet::::compute_actual_fee( - 1024, - &dispatch_info(), - &post_dispatch_info, - Zero::zero(), - ) - } - - fn expected_confirmation_reward() -> ThisChainBalance { - pallet_transaction_payment::Pallet::::compute_actual_fee( - 1024, - &dispatch_info(), - &post_dispatch_info(), - Zero::zero(), - ) - } - - #[test] - fn validate_doesnt_boost_transaction_priority_if_relayer_is_not_registered() { - run_test(|| { - initialize_environment(100, 100, 100); - Balances::set_balance(&relayer_account_at_this_chain(), ExistentialDeposit::get()); - - // message delivery is failing - assert_eq!(run_validate(message_delivery_call(200)), Ok(Default::default()),); - assert_eq!( - run_validate(parachain_finality_and_delivery_batch_call(200, 200)), - Ok(Default::default()), - ); - assert_eq!( - run_validate(all_finality_and_delivery_batch_call(200, 200, 200)), - Ok(Default::default()), - ); - // message confirmation validation is passing - assert_eq!( - run_validate_ignore_priority(message_confirmation_call(200)), - Ok(Default::default()), - ); - assert_eq!( - run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( - 200, 200 - )), - Ok(Default::default()), - ); - assert_eq!( - run_validate_ignore_priority(all_finality_and_confirmation_batch_call( - 200, 200, 200 - )), - Ok(Default::default()), - ); - }); - } - - #[test] - fn validate_boosts_priority_of_message_delivery_transactons() { - run_test(|| { - initialize_environment(100, 100, 100); - - BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) - .unwrap(); - - let priority_of_100_messages_delivery = - run_validate(message_delivery_call(200)).unwrap().priority; - let priority_of_200_messages_delivery = - run_validate(message_delivery_call(300)).unwrap().priority; - assert!( - priority_of_200_messages_delivery > priority_of_100_messages_delivery, - "Invalid priorities: {} for 200 messages vs {} for 100 messages", - priority_of_200_messages_delivery, - priority_of_100_messages_delivery, - ); - - let priority_of_100_messages_confirmation = - run_validate(message_confirmation_call(200)).unwrap().priority; - let priority_of_200_messages_confirmation = - run_validate(message_confirmation_call(300)).unwrap().priority; - assert_eq!( - priority_of_100_messages_confirmation, - priority_of_200_messages_confirmation - ); - }); - } - - #[test] - fn validate_does_not_boost_priority_of_message_delivery_transactons_with_too_many_messages() { - run_test(|| { - initialize_environment(100, 100, 100); - - BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) - .unwrap(); - - let priority_of_max_messages_delivery = run_validate(message_delivery_call( - 100 + MaxUnconfirmedMessagesAtInboundLane::get(), - )) - .unwrap() - .priority; - let priority_of_more_than_max_messages_delivery = run_validate(message_delivery_call( - 100 + MaxUnconfirmedMessagesAtInboundLane::get() + 1, - )) - .unwrap() - .priority; - - assert!( - priority_of_max_messages_delivery > priority_of_more_than_max_messages_delivery, - "Invalid priorities: {} for MAX messages vs {} for MAX+1 messages", - priority_of_max_messages_delivery, - priority_of_more_than_max_messages_delivery, - ); - }); - } - - #[test] - fn validate_allows_non_obsolete_transactions() { - run_test(|| { - initialize_environment(100, 100, 100); - - assert_eq!( - run_validate_ignore_priority(message_delivery_call(200)), - Ok(ValidTransaction::default()), - ); - assert_eq!( - run_validate_ignore_priority(message_confirmation_call(200)), - Ok(ValidTransaction::default()), - ); - - assert_eq!( - run_validate_ignore_priority(parachain_finality_and_delivery_batch_call(200, 200)), - Ok(ValidTransaction::default()), - ); - assert_eq!( - run_validate_ignore_priority(parachain_finality_and_confirmation_batch_call( - 200, 200 - )), - Ok(ValidTransaction::default()), - ); - - assert_eq!( - run_validate_ignore_priority(all_finality_and_delivery_batch_call(200, 200, 200)), - Ok(ValidTransaction::default()), - ); - assert_eq!( - run_validate_ignore_priority(all_finality_and_confirmation_batch_call( - 200, 200, 200 - )), - Ok(ValidTransaction::default()), - ); - }); - } - - #[test] - fn ext_rejects_batch_with_obsolete_relay_chain_header() { - run_test(|| { - initialize_environment(100, 100, 100); - - assert_eq!( - run_pre_dispatch(all_finality_and_delivery_batch_call(100, 200, 200)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - - assert_eq!( - run_validate(all_finality_and_delivery_batch_call(100, 200, 200)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - }); - } - - #[test] - fn ext_rejects_batch_with_obsolete_parachain_head() { - run_test(|| { - initialize_environment(100, 100, 100); - - assert_eq!( - run_pre_dispatch(all_finality_and_delivery_batch_call(101, 100, 200)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - assert_eq!( - run_validate(all_finality_and_delivery_batch_call(101, 100, 200)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - - assert_eq!( - run_pre_dispatch(parachain_finality_and_delivery_batch_call(100, 200)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - assert_eq!( - run_validate(parachain_finality_and_delivery_batch_call(100, 200)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - }); - } - - #[test] - fn ext_rejects_batch_with_obsolete_messages() { - run_test(|| { - initialize_environment(100, 100, 100); - - assert_eq!( - run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - assert_eq!( - run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - - assert_eq!( - run_validate(all_finality_and_delivery_batch_call(200, 200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - assert_eq!( - run_validate(all_finality_and_confirmation_batch_call(200, 200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - - assert_eq!( - run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - assert_eq!( - run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - - assert_eq!( - run_validate(parachain_finality_and_delivery_batch_call(200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - assert_eq!( - run_validate(parachain_finality_and_confirmation_batch_call(200, 100)), - Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), - ); - }); - } - - #[test] - fn pre_dispatch_parses_batch_with_relay_chain_and_parachain_headers() { - run_test(|| { - initialize_environment(100, 100, 100); - - assert_eq!( - run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), - Ok(Some(all_finality_pre_dispatch_data())), - ); - assert_eq!( - run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), - Ok(Some(all_finality_confirmation_pre_dispatch_data())), - ); - }); - } - - #[test] - fn pre_dispatch_parses_batch_with_parachain_header() { - run_test(|| { - initialize_environment(100, 100, 100); - - assert_eq!( - run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 200)), - Ok(Some(parachain_finality_pre_dispatch_data())), - ); - assert_eq!( - run_pre_dispatch(parachain_finality_and_confirmation_batch_call(200, 200)), - Ok(Some(parachain_finality_confirmation_pre_dispatch_data())), - ); - }); - } - - #[test] - fn pre_dispatch_fails_to_parse_batch_with_multiple_parachain_headers() { - run_test(|| { - initialize_environment(100, 100, 100); - - let call = RuntimeCall::Utility(UtilityCall::batch_all { - calls: vec![ - RuntimeCall::BridgeParachains(ParachainsCall::submit_parachain_heads { - at_relay_block: (100, RelayBlockHash::default()), - parachains: vec![ - (ParaId(TestParachain::get()), [1u8; 32].into()), - (ParaId(TestParachain::get() + 1), [1u8; 32].into()), - ], - parachain_heads_proof: ParaHeadsProof(vec![]), - }), - message_delivery_call(200), - ], - }); - - assert_eq!(run_pre_dispatch(call), Ok(None),); - }); - } - - #[test] - fn pre_dispatch_parses_message_transaction() { - run_test(|| { - initialize_environment(100, 100, 100); - - assert_eq!( - run_pre_dispatch(message_delivery_call(200)), - Ok(Some(delivery_pre_dispatch_data())), - ); - assert_eq!( - run_pre_dispatch(message_confirmation_call(200)), - Ok(Some(confirmation_pre_dispatch_data())), - ); - }); - } - - #[test] - fn post_dispatch_ignores_unknown_transaction() { - run_test(|| { - assert_storage_noop!(run_post_dispatch(None, Ok(()))); - }); - } - - #[test] - fn post_dispatch_ignores_failed_transaction() { - run_test(|| { - assert_storage_noop!(run_post_dispatch( - Some(all_finality_pre_dispatch_data()), - Err(DispatchError::BadOrigin) - )); - }); - } - - #[test] - fn post_dispatch_ignores_transaction_that_has_not_updated_relay_chain_state() { - run_test(|| { - initialize_environment(100, 200, 200); - - assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); - }); - } - - #[test] - fn post_dispatch_ignores_transaction_that_has_not_updated_parachain_state() { - run_test(|| { - initialize_environment(200, 100, 200); - - assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); - assert_storage_noop!(run_post_dispatch( - Some(parachain_finality_pre_dispatch_data()), - Ok(()) - )); - }); - } - - #[test] - fn post_dispatch_ignores_transaction_that_has_not_delivered_any_messages() { - run_test(|| { - initialize_environment(200, 200, 100); - - assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); - assert_storage_noop!(run_post_dispatch( - Some(parachain_finality_pre_dispatch_data()), - Ok(()) - )); - assert_storage_noop!(run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(()))); - - assert_storage_noop!(run_post_dispatch( - Some(all_finality_confirmation_pre_dispatch_data()), - Ok(()) - )); - assert_storage_noop!(run_post_dispatch( - Some(parachain_finality_confirmation_pre_dispatch_data()), - Ok(()) - )); - assert_storage_noop!(run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(()))); - }); - } - - #[test] - fn post_dispatch_ignores_transaction_that_has_not_delivered_all_messages() { - run_test(|| { - initialize_environment(200, 200, 150); - - assert_storage_noop!(run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(()))); - assert_storage_noop!(run_post_dispatch( - Some(parachain_finality_pre_dispatch_data()), - Ok(()) - )); - assert_storage_noop!(run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(()))); - - assert_storage_noop!(run_post_dispatch( - Some(all_finality_confirmation_pre_dispatch_data()), - Ok(()) - )); - assert_storage_noop!(run_post_dispatch( - Some(parachain_finality_confirmation_pre_dispatch_data()), - Ok(()) - )); - assert_storage_noop!(run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(()))); - }); - } - - #[test] - fn post_dispatch_refunds_relayer_in_all_finality_batch_with_extra_weight() { - run_test(|| { - initialize_environment(200, 200, 200); - - let mut dispatch_info = dispatch_info(); - dispatch_info.weight = Weight::from_parts( - frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND * 2, - 0, - ); - - // without any size/weight refund: we expect regular reward - let pre_dispatch_data = all_finality_pre_dispatch_data(); - let regular_reward = expected_delivery_reward(); - run_post_dispatch(Some(pre_dispatch_data), Ok(())); - assert_eq!( - RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get() - ), - Some(regular_reward), - ); - - // now repeat the same with size+weight refund: we expect smaller reward - let mut pre_dispatch_data = all_finality_pre_dispatch_data(); - match pre_dispatch_data.call_info { - CallInfo::AllFinalityAndMsgs(ref mut info, ..) => { - info.extra_weight.set_ref_time( - frame_support::weights::constants::WEIGHT_REF_TIME_PER_SECOND, - ); - info.extra_size = 32; - }, - _ => unreachable!(), - } - run_post_dispatch(Some(pre_dispatch_data), Ok(())); - let reward_after_two_calls = RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get(), - ) - .unwrap(); - assert!( - reward_after_two_calls < 2 * regular_reward, - "{} must be < 2 * {}", - reward_after_two_calls, - 2 * regular_reward, - ); - }); - } - - #[test] - fn post_dispatch_refunds_relayer_in_all_finality_batch() { - run_test(|| { - initialize_environment(200, 200, 200); - - run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(())); - assert_eq!( - RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get() - ), - Some(expected_delivery_reward()), - ); - - run_post_dispatch(Some(all_finality_confirmation_pre_dispatch_data()), Ok(())); - assert_eq!( - RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgDeliveryProofsRewardsAccount::get() - ), - Some(expected_confirmation_reward()), - ); - }); - } - - #[test] - fn post_dispatch_refunds_relayer_in_parachain_finality_batch() { - run_test(|| { - initialize_environment(200, 200, 200); - - run_post_dispatch(Some(parachain_finality_pre_dispatch_data()), Ok(())); - assert_eq!( - RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get() - ), - Some(expected_delivery_reward()), - ); - - run_post_dispatch(Some(parachain_finality_confirmation_pre_dispatch_data()), Ok(())); - assert_eq!( - RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgDeliveryProofsRewardsAccount::get() - ), - Some(expected_confirmation_reward()), - ); - }); - } - - #[test] - fn post_dispatch_refunds_relayer_in_message_transaction() { - run_test(|| { - initialize_environment(200, 200, 200); - - run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(())); - assert_eq!( - RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get() - ), - Some(expected_delivery_reward()), - ); - - run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(())); - assert_eq!( - RelayersPallet::::relayer_reward( - relayer_account_at_this_chain(), - MsgDeliveryProofsRewardsAccount::get() - ), - Some(expected_confirmation_reward()), - ); - }); - } - - #[test] - fn post_dispatch_slashing_relayer_stake() { - run_test(|| { - initialize_environment(200, 200, 100); - - let delivery_rewards_account_balance = - Balances::free_balance(delivery_rewards_account()); - - let test_stake: ThisChainBalance = TestStake::get(); - Balances::set_balance( - &relayer_account_at_this_chain(), - ExistentialDeposit::get() + test_stake * 10, - ); - - // slashing works for message delivery calls - BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) - .unwrap(); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); - run_post_dispatch(Some(delivery_pre_dispatch_data()), Ok(())); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); - assert_eq!( - delivery_rewards_account_balance + test_stake, - Balances::free_balance(delivery_rewards_account()) - ); - - BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) - .unwrap(); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); - run_post_dispatch(Some(parachain_finality_pre_dispatch_data()), Ok(())); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); - assert_eq!( - delivery_rewards_account_balance + test_stake * 2, - Balances::free_balance(delivery_rewards_account()) - ); - - BridgeRelayers::register(RuntimeOrigin::signed(relayer_account_at_this_chain()), 1000) - .unwrap(); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); - run_post_dispatch(Some(all_finality_pre_dispatch_data()), Ok(())); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), 0); - assert_eq!( - delivery_rewards_account_balance + test_stake * 3, - Balances::free_balance(delivery_rewards_account()) - ); - - // reserve doesn't work for message confirmation calls - let confirmation_rewards_account_balance = - Balances::free_balance(confirmation_rewards_account()); - - Balances::reserve(&relayer_account_at_this_chain(), test_stake).unwrap(); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); - - assert_eq!( - confirmation_rewards_account_balance, - Balances::free_balance(confirmation_rewards_account()) - ); - run_post_dispatch(Some(confirmation_pre_dispatch_data()), Ok(())); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); - - run_post_dispatch(Some(parachain_finality_confirmation_pre_dispatch_data()), Ok(())); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); - - run_post_dispatch(Some(all_finality_confirmation_pre_dispatch_data()), Ok(())); - assert_eq!(Balances::reserved_balance(relayer_account_at_this_chain()), test_stake); - - // check that unreserve has happened, not slashing - assert_eq!( - delivery_rewards_account_balance + test_stake * 3, - Balances::free_balance(delivery_rewards_account()) - ); - assert_eq!( - confirmation_rewards_account_balance, - Balances::free_balance(confirmation_rewards_account()) - ); - }); - } - - fn run_analyze_call_result( - pre_dispatch_data: PreDispatchData, - dispatch_result: DispatchResult, - ) -> RelayerAccountAction { - TestExtension::analyze_call_result( - Some(Some(pre_dispatch_data)), - &dispatch_info(), - &post_dispatch_info(), - 1024, - &dispatch_result, - ) - } - - #[test] - fn analyze_call_result_shall_not_slash_for_transactions_with_too_many_messages() { - run_test(|| { - initialize_environment(100, 100, 100); - - // the `analyze_call_result` should return slash if number of bundled messages is - // within reasonable limits - assert_eq!( - run_analyze_call_result(all_finality_pre_dispatch_data(), Ok(())), - RelayerAccountAction::Slash( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get() - ), - ); - assert_eq!( - run_analyze_call_result(parachain_finality_pre_dispatch_data(), Ok(())), - RelayerAccountAction::Slash( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get() - ), - ); - assert_eq!( - run_analyze_call_result(delivery_pre_dispatch_data(), Ok(())), - RelayerAccountAction::Slash( - relayer_account_at_this_chain(), - MsgProofsRewardsAccount::get() - ), - ); - - // the `analyze_call_result` should not return slash if number of bundled messages is - // larger than the - assert_eq!( - run_analyze_call_result( - set_bundled_range_end(all_finality_pre_dispatch_data(), 1_000_000), - Ok(()) - ), - RelayerAccountAction::None, - ); - assert_eq!( - run_analyze_call_result( - set_bundled_range_end(parachain_finality_pre_dispatch_data(), 1_000_000), - Ok(()) - ), - RelayerAccountAction::None, - ); - assert_eq!( - run_analyze_call_result( - set_bundled_range_end(delivery_pre_dispatch_data(), 1_000_000), - Ok(()) - ), - RelayerAccountAction::None, - ); - }); - } -} diff --git a/cumulus/bridges/docs/high-level-overview.md b/cumulus/bridges/docs/high-level-overview.md deleted file mode 100644 index 449224124afd..000000000000 --- a/cumulus/bridges/docs/high-level-overview.md +++ /dev/null @@ -1,181 +0,0 @@ -# High-Level Bridge Documentation - -This document gives a brief, abstract description of main components that may be found in this repository. -If you want to see how we're using them to build Rococo <> Wococo (Kusama <> Polkadot) bridge, please -refer to the [Polkadot <> Kusama Bridge](./polkadot-kusama-bridge-overview.md). - -## Purpose - -This repo contains all components required to build a trustless connection between standalone Substrate chains, -that are using GRANDPA finality, their parachains or any combination of those. On top of this connection, we -offer a messaging pallet that provides means to organize messages exchange. - -On top of that layered infrastructure, anyone may build their own bridge applications - e.g. [XCM messaging](./polkadot-kusama-bridge-overview.md), -[encoded calls messaging](https://github.com/paritytech/parity-bridges-common/releases/tag/encoded-calls-messaging) and so on. - -## Terminology - -Even though we support (and require) two-way bridging, the documentation will generally talk about -a one-sided interaction. That's to say, we will only talk about syncing finality proofs and messages -from a _source_ chain to a _target_ chain. This is because the two-sided interaction is really just the -one-sided interaction with the source and target chains switched. - -The bridge has both on-chain (pallets) and offchain (relayers) components. - -## On-chain components - -On-chain bridge components are pallets that are deployed at the chain runtime. Finality pallets require -deployment at the target chain, while messages pallet needs to be deployed at both, source -and target chains. - -### Bridge GRANDPA Finality Pallet - -A GRANDPA light client of the source chain built into the target chain's runtime. It provides a "source of truth" -about the source chain headers which have been finalized. This is useful for higher level applications. - -The pallet tracks current GRANDPA authorities set and only accepts finality proofs (GRANDPA justifications), -generated by the current authorities set. The GRANDPA protocol itself requires current authorities set to -generate explicit justification for the header that enacts next authorities set. Such headers and their finality -proofs are called mandatory in the pallet and relayer pays no fee for such headers submission. - -The pallet does not require all headers to be imported or provided. The relayer itself chooses which headers -he wants to submit (with the exception of mandatory headers). - -More: [pallet level documentation and code](../modules/grandpa/). - -### Bridge Parachains Finality Pallet - -Parachains are not supposed to have their own finality, so we can't use bridge GRANDPA pallet to verify their -finality proofs. Instead, they rely on their relay chain finality. The parachain header is considered final, -when it is accepted by the [`paras` pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras) -at its relay chain. Obviously, the relay chain block, where it is accepted, must also be finalized by the relay -chain GRANDPA gadget. - -That said, the bridge parachains pallet accepts storage proof of one or several parachain heads, inserted to the -[`Heads`](https://github.com/paritytech/polkadot/blob/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras/mod.rs#L642) -map of the [`paras` pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras). -To verify this storage proof, the pallet uses relay chain header, imported earlier by the bridge GRANDPA pallet. - -The pallet may track multiple parachains at once and those parachains may use different primitives. So the -parachain header decoding never happens at the pallet level. For maintaining the headers order, the pallet -uses relay chain header number. - -More: [pallet level documentation and code](../modules/parachains/). - -### Bridge Messages Pallet - -The pallet is responsible for queuing messages at the source chain and receiving the messages proofs at the -target chain. The messages are sent to the particular _lane_, where they are guaranteed to be received in the -same order they are sent. The pallet supports many lanes. - -The lane has two ends. Outbound lane end is storing number of messages that have been sent and the number of -messages that have been received. Inbound lane end stores the number of messages that have been received and -also a map that maps messages to relayers that have delivered those messages to the target chain. - -The pallet has three main entrypoints: -- the `send_message` may be used by the other runtime pallets to send the messages; -- the `receive_messages_proof` is responsible for parsing the messages proof and handing messages over to the -dispatch code; -- the `receive_messages_delivery_proof` is responsible for parsing the messages delivery proof and rewarding -relayers that have delivered the message. - -Many things are abstracted by the pallet: -- the message itself may mean anything, the pallet doesn't care about its content; -- the message dispatch happens during delivery, but it is decoupled from the pallet code; -- the messages proof and messages delivery proof are verified outside of the pallet; -- the relayers incentivization scheme is defined outside of the pallet. - -Outside of the messaging pallet, we have a set of adapters, where messages and delivery proofs are regular -storage proofs. The proofs are generated at the bridged chain and require bridged chain finality. So messages -pallet, in this case, depends on one of the finality pallets. The messages are XCM messages and we are using -XCM executor to dispatch them on receival. You may find more info in [Polkadot <> Kusama Bridge](./polkadot-kusama-bridge-overview.md) -document. - -More: [pallet level documentation and code](../modules/messages/). - -### Bridge Relayers Pallet - -The pallet is quite simple. It just registers relayer rewards and has an entrypoint to collect them. When -the rewards are registered and the reward amount is configured outside of the pallet. - -More: [pallet level documentation and code](../modules/relayers/). - -## Offchain Components - -Offchain bridge components are separate processes, called relayers. Relayers are connected both to the -source chain and target chain nodes. Relayers are reading state of the source chain, compare it to the -state of the target chain and, if state at target chain needs to be updated, submits target chain -transaction. - -### GRANDPA Finality Relay - -The task of relay is to submit source chain GRANDPA justifications and their corresponding headers to -the Bridge GRANDPA Finality Pallet, deployed at the target chain. For that, the relay subscribes to -the source chain GRANDPA justifications stream and submits every new justification it sees to the -target chain GRANDPA light client. In addition, relay is searching for mandatory headers and -submits their justifications - without that the pallet will be unable to move forward. - -More: [GRANDPA Finality Relay Sequence Diagram](./grandpa-finality-relay.html), [pallet level documentation and code](../relays/finality/). - -### Parachains Finality Relay - -The relay connects to the source _relay_ chain and the target chain nodes. It doesn't need to connect to the -tracked parachain nodes. The relay looks at the [`Heads`](https://github.com/paritytech/polkadot/blob/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras/mod.rs#L642) -map of the [`paras` pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras) -in source chain, and compares the value with the best parachain head, stored in the bridge parachains pallet at -the target chain. If new parachain head appears at the relay chain block `B`, the relay process **waits** -until header `B` or one of its ancestors appears at the target chain. Once it is available, the storage -proof of the map entry is generated and is submitted to the target chain. - -As its on-chain component (which requires bridge GRANDPA pallet to be deployed nearby), the parachains -finality relay requires GRANDPA finality relay to be running in parallel. Without it, the header `B` or -any of its children's finality at source won't be relayed at target, and target chain -won't be able to verify generated storage proof. - -More: [Parachains Finality Relay Sequence Diagram](./parachains-finality-relay.html), [code](../relays/parachains/). - -### Messages Relay - -Messages relay is actually two relays that are running in a single process: messages delivery relay and -delivery confirmation relay. Even though they are more complex and have many caveats, the overall algorithm -is the same as in other relays. - -Message delivery relay connects to the source chain and looks at the outbound lane end, waiting until new -messages are queued there. Once they appear at the source block `B`, the relay start waiting for the block -`B` or its descendant appear at the target chain. Then the messages storage proof is generated and submitted -to the bridge messages pallet at the target chain. In addition, the transaction may include the storage proof -of the outbound lane state - that proves that relayer rewards have been paid and this data (map of relay -accounts to the delivered messages) may be pruned from the inbound lane state at the target chain. - -Delivery confirmation relay connects to the target chain and starts watching the inbound lane end. When new -messages are delivered to the target chain, the corresponding _source chain account_ is inserted to the -map in the inbound lane data. Relay detects that, say, at the target chain block `B` and waits until that -block or its descendant appears at the source chain. Once that happens, the relay crafts a storage proof of -that data and sends it to the messages pallet, deployed at the source chain. - -As you can see, the messages relay also requires finality relay to be operating in parallel. Since messages -relay submits transactions to both source and target chains, it requires both _source-to-target_ and -_target-to-source_ finality relays. They can be GRANDPA finality relays or GRANDPA+parachains finality relays, -depending on the type of connected chain. - -More: [Messages Relay Sequence Diagram](./messages-relay.html), [pallet level documentation and code](../relays/messages/). - -### Complex Relay - -Every relay transaction has its cost. The only transaction, that is "free" to relayer is when the mandatory -GRANDPA header is submitted. The relay that feeds the bridge with every relay chain and/or parachain head it -sees, will have to pay a (quite large) cost. And if no messages are sent through the bridge, that is just -waste of money. - -We have a special relay mode, called _complex relay_, where relay mostly sleeps and only submits transactions -that are required for the messages/confirmations delivery. This mode starts two message relays (in both -directions). All required finality relays are also started in a special _on-demand_ mode. In this mode they -do not submit any headers without special request. As always, the only exception is when GRANDPA finality -relay sees the mandatory header - it is submitted without such request. - -The message relays are watching their lanes and when, at some block `B`, they see new messages/confirmations -to be delivered, they are asking on-demand relays to relay this block `B`. On-demand relays does that and -then message relay may perform its job. If on-demand relay is a parachain finality relay, it also runs its -own on-demand GRANDPA relay, which is used to relay required relay chain headers. - -More: [Complex Relay Sequence Diagram](./complex-relay.html), [code](../relays/bin-substrate/src/cli/relay_headers_and_messages/). diff --git a/cumulus/bridges/docs/polkadot-kusama-bridge-overview.md b/cumulus/bridges/docs/polkadot-kusama-bridge-overview.md deleted file mode 100644 index b469720f65b2..000000000000 --- a/cumulus/bridges/docs/polkadot-kusama-bridge-overview.md +++ /dev/null @@ -1,132 +0,0 @@ -# Polkadot <> Kusama Bridge Overview - -This document describes how we use all components, described in the [High-Level Bridge Documentation](./high-level-overview.md), -to build the XCM bridge between Kusama and Polkadot. In this case, our components merely work as a XCM transport -(like XCMP/UMP/HRMP), between chains that are not a part of the same consensus system. - -The overall architecture may be seen in [this diagram](./polkadot-kusama-bridge.html). - -## Bridge Hubs - -All operations at relay chain are expensive. Ideally all non-mandatory transactions must happen on parachains. -That's why we are planning to have two parachains - Polkadot Bridge Hub under Polkadot consensus and Kusama -Bridge Hub under Kusama consensus. - -The Bridge Hub will have all required bridge pallets in its runtime. We hope that later, other teams will be able to -use our bridge hubs too and have their pallets there. - -The Bridge Hub will use the base token of the ecosystem - KSM at Kusama Bridge Hub and DOT at Polkadot Bridge Hub. -The runtime will have minimal set of non-bridge pallets, so there's not much you can do directly on bridge hubs. - -## Connecting Parachains - -You won't be able to directly use bridge hub transactions to send XCM messages over the bridge. Instead, you'll need -to use other parachains transactions, which will use HRMP to deliver messages to the Bridge Hub. The Bridge Hub will -just queue these messages in its outbound lane, which is dedicated to deliver messages between two parachains. - -Our first planned bridge will connect the Polkadot and Kusama Asset Hubs. A bridge between those two -parachains would allow Asset Hub Polkadot accounts to hold wrapped KSM tokens and Asset Hub Kusama -accounts to hold wrapped DOT tokens. - -For that bridge (pair of parachains under different consensus systems) we'll be using the lane 00000000. Later, -when other parachains will join the bridge, they will be using other lanes for their messages. - -## Running Relayers - -We are planning to run our own complex relayer for the lane 00000000. The relayer will relay Kusama/Polkadot GRANDPA -justifications to the bridge hubs at the other side. It'll also relay finalized Kusama Bridge Hub and Polkadot Bridge -Hub heads. This will only happen when messages will be queued at hubs. So most of time relayer will be idle. - -There's no any active relayer sets, or something like that. Anyone may start its own relayer and relay queued messages. -We are not against that and, as always, appreciate any community efforts. Of course, running relayer has the cost. -Apart from paying for the CPU and network, the relayer pays for transactions at both sides of the bridge. We have -a mechanism for rewarding relayers. - -### Compensating the Cost of Message Delivery Transactions - -One part of our rewarding scheme is that the cost of message delivery, for honest relayer, is zero. The honest relayer -is the relayer, which is following our rules: - -- we do not reward relayers for submitting GRANDPA finality transactions. The only exception is submitting mandatory - headers (headers which are changing the GRANDPA authorities set) - the cost of such transaction is zero. The relayer - will pay the full cost for submitting all other headers; - -- we do not reward relayers for submitting parachain finality transactions. The relayer will pay the full cost for - submitting parachain finality transactions; - -- we compensate the cost of message delivery transactions that have actually delivered the messages. So if your - transaction has claimed to deliver messages `[42, 43, 44]`, but, because of some reasons, has actually delivered - messages `[42, 43]`, the transaction will be free for relayer. If it has not delivered any messages, then - the relayer pays the full cost of the transaction; - -- we compensate the cost of message delivery and all required finality calls, if they are part of the same - [`frame_utility::batch_all`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326) - transaction. Of course, the calls inside the batch must be linked - e.g. the submitted parachain head must be used - to prove messages. Relay header must be used to prove parachain head finality. If one of calls fails, or if they - are not linked together, the relayer pays the full transaction cost. - -Please keep in mind that the fee of "zero-cost" transactions is still withdrawn from the relayer account. But the -compensation is registered in the `pallet_bridge_relayers::RelayerRewards` map at the target bridge hub. The relayer -may later claim all its rewards later, using the `pallet_bridge_relayers::claim_rewards` call. - -*A side note*: why we don't simply set the cost of useful transactions to zero? That's because the bridge has its cost. -If we won't take any fees, it would mean that the sender is not obliged to pay for its messages. And Bridge Hub -collators (and, maybe, "treasury") are not receiving any payment for including transactions. More about this later, -in the [Who is Rewarding Relayers](#who-is-rewarding-relayers) section. - -### Message Delivery Confirmation Rewards - -In addition to the "zero-cost" message delivery transactions, the relayer is also rewarded for: - -- delivering every message. The reward is registered during delivery confirmation transaction at the Source Bridge - Hub.; - -- submitting delivery confirmation transaction. The relayer may submit delivery confirmation that e.g. confirms - delivery of four messages, of which the only one (or zero) messages is actually delivered by this relayer. It - receives some fee for confirming messages, delivered by other relayers. - -Both rewards may be claimed using the `pallet_bridge_relayers::claim_rewards` call at the Source Bridge Hub. - -### Who is Rewarding Relayers - -Obviously, there should be someone who is paying relayer rewards. We want bridge transactions to have a cost, so we -can't use fees for rewards. Instead, the parachains using the bridge, use sovereign accounts on both sides -of the bridge to cover relayer rewards. - -Bridged Parachains will have sovereign accounts at bridge hubs. For example, the Kusama Asset Hub will -have an account at the Polkadot Bridge Hub. The Polkadot Asset Hub will have an account at the Kusama -Bridge Hub. The sovereign accounts are used as a source of funds when the relayer is calling the -`pallet_bridge_relayers::claim_rewards`. - -Since messages lane is only used by the pair of parachains, there's no collision between different bridges. E.g. -Kusama Asset Hub will only reward relayers that are delivering messages from Kusama Asset Hub. The Kusama Asset Hub sovereign account -is not used to cover rewards of bridging with some other Polkadot Parachain. - -### Multiple Relayers and Rewards - -Our goal is to incentivize running honest relayers. But we have no relayers sets, so at any time anyone may submit -message delivery transaction, hoping that the cost of this transaction will be compensated. So what if some message is -currently queued and two relayers are submitting two identical message delivery transactions at once? Without any -special means, the cost of first included transaction will be compensated and the cost of the other one won't. A honest, -but unlucky relayer will lose some money. In addition, we'll waste some portion of block size and weight, which -may be used by other useful transactions. - -To solve the problem, we have two signed extensions ([generate_bridge_reject_obsolete_headers_and_messages! {}](../bin/runtime-common/src/lib.rs) -and [RefundRelayerForMessagesFromParachain](../bin/runtime-common/src/refund_relayer_extension.rs)), that are -preventing bridge transactions with obsolete data from including into the block. We are rejecting following -transactions: - -- transactions, that are submitting the GRANDPA justification for the best finalized header, or one of its ancestors; - -- transactions, that are submitting the proof of the current best parachain head, or one of its ancestors; - -- transactions, that are delivering already delivered messages. If at least one of messages is not yet delivered, - the transaction is not rejected; - -- transactions, that are confirming delivery of already confirmed messages. If at least one of confirmations is new, - the transaction is not rejected; - -- [`frame_utility::batch_all`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326) - transactions, that have both finality and message delivery calls. All restrictions from the - [Compensating the Cost of Message Delivery Transactions](#compensating-the-cost-of-message-delivery-transactions) - are applied. diff --git a/cumulus/bridges/modules/grandpa/Cargo.toml b/cumulus/bridges/modules/grandpa/Cargo.toml deleted file mode 100644 index 0bd62beeaad4..000000000000 --- a/cumulus/bridges/modules/grandpa/Cargo.toml +++ /dev/null @@ -1,63 +0,0 @@ -[package] -name = "pallet-bridge-grandpa" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -finality-grandpa = { version = "0.16.2", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Bridge Dependencies - -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } - -# Substrate Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -# Optional Benchmarking Dependencies -bp-test-utils = { path = "../../primitives/test-utils", default-features = false, optional = true } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } - -[dev-dependencies] -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-runtime/std", - "bp-test-utils/std", - "codec/std", - "finality-grandpa/std", - "frame-support/std", - "frame-system/std", - "frame-benchmarking/std", - "log/std", - "scale-info/std", - "sp-consensus-grandpa/std", - "sp-runtime/std", - "sp-std/std", - "sp-trie/std", -] -runtime-benchmarks = [ - "bp-test-utils", - "frame-benchmarking/runtime-benchmarks", -] -try-runtime = [ - "frame-support/try-runtime", - "frame-system/try-runtime", -] diff --git a/cumulus/bridges/modules/grandpa/src/benchmarking.rs b/cumulus/bridges/modules/grandpa/src/benchmarking.rs deleted file mode 100644 index aa222d6e4de6..000000000000 --- a/cumulus/bridges/modules/grandpa/src/benchmarking.rs +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Benchmarks for the GRANDPA Pallet. -//! -//! The main dispatchable for the GRANDPA pallet is `submit_finality_proof`, so these benchmarks are -//! based around that. There are to main factors which affect finality proof verification: -//! -//! 1. The number of `votes-ancestries` in the justification -//! 2. The number of `pre-commits` in the justification -//! -//! Vote ancestries are the headers between (`finality_target`, `head_of_chain`], where -//! `header_of_chain` is a descendant of `finality_target`. -//! -//! Pre-commits are messages which are signed by validators at the head of the chain they think is -//! the best. -//! -//! Consider the following: -//! -//! / B <- C' -//! A <- B <- C -//! -//! The common ancestor of both forks is block A, so this is what GRANDPA will finalize. In order to -//! verify this we will have vote ancestries of `[B, C, B', C']` and pre-commits `[C, C']`. -//! -//! Note that the worst case scenario here would be a justification where each validator has it's -//! own fork which is `SESSION_LENGTH` blocks long. - -use crate::*; - -use bp_header_chain::justification::required_justification_precommits; -use bp_runtime::BasicOperatingMode; -use bp_test_utils::{ - accounts, make_justification_for_header, JustificationGeneratorParams, TEST_GRANDPA_ROUND, - TEST_GRANDPA_SET_ID, -}; -use frame_benchmarking::{benchmarks_instance_pallet, whitelisted_caller}; -use frame_system::RawOrigin; -use sp_consensus_grandpa::AuthorityId; -use sp_runtime::traits::{One, Zero}; -use sp_std::vec::Vec; - -/// The maximum number of vote ancestries to include in a justification. -/// -/// In practice this would be limited by the session length (number of blocks a single authority set -/// can produce) of a given chain. -const MAX_VOTE_ANCESTRIES: u32 = 1000; - -// `1..MAX_VOTE_ANCESTRIES` is too large && benchmarks are running for almost 40m (steps=50, -// repeat=20) on a decent laptop, which is too much. Since we're building linear function here, -// let's just select some limited subrange for benchmarking. -const MAX_VOTE_ANCESTRIES_RANGE_BEGIN: u32 = MAX_VOTE_ANCESTRIES / 20; -const MAX_VOTE_ANCESTRIES_RANGE_END: u32 = - MAX_VOTE_ANCESTRIES_RANGE_BEGIN + MAX_VOTE_ANCESTRIES_RANGE_BEGIN; - -// the same with validators - if there are too much validators, let's run benchmarks on subrange -fn precommits_range_end, I: 'static>() -> u32 { - let max_bridged_authorities = T::BridgedChain::MAX_AUTHORITIES_COUNT; - if max_bridged_authorities > 128 { - sp_std::cmp::max(128, max_bridged_authorities / 5) - } else { - max_bridged_authorities - }; - required_justification_precommits(max_bridged_authorities) -} - -/// Prepare header and its justification to submit using `submit_finality_proof`. -fn prepare_benchmark_data, I: 'static>( - precommits: u32, - ancestors: u32, -) -> (BridgedHeader, GrandpaJustification>) { - // going from precommits to total authorities count - let total_authorities_count = (3 * precommits - 1) / 2; - - let authority_list = accounts(total_authorities_count as u16) - .iter() - .map(|id| (AuthorityId::from(*id), 1)) - .collect::>(); - - let genesis_header: BridgedHeader = bp_test_utils::test_header(Zero::zero()); - let genesis_hash = genesis_header.hash(); - let init_data = InitializationData { - header: Box::new(genesis_header), - authority_list, - set_id: TEST_GRANDPA_SET_ID, - operating_mode: BasicOperatingMode::Normal, - }; - - bootstrap_bridge::(init_data); - assert!(>::contains_key(genesis_hash)); - - let header: BridgedHeader = bp_test_utils::test_header(One::one()); - let params = JustificationGeneratorParams { - header: header.clone(), - round: TEST_GRANDPA_ROUND, - set_id: TEST_GRANDPA_SET_ID, - authorities: accounts(precommits as u16).iter().map(|k| (*k, 1)).collect::>(), - ancestors, - forks: 1, - }; - let justification = make_justification_for_header(params); - (header, justification) -} - -benchmarks_instance_pallet! { - // This is the "gold standard" benchmark for this extrinsic, and it's what should be used to - // annotate the weight in the pallet. - submit_finality_proof { - let p in 1 .. precommits_range_end::(); - let v in MAX_VOTE_ANCESTRIES_RANGE_BEGIN..MAX_VOTE_ANCESTRIES_RANGE_END; - let caller: T::AccountId = whitelisted_caller(); - let (header, justification) = prepare_benchmark_data::(p, v); - }: submit_finality_proof(RawOrigin::Signed(caller), Box::new(header), justification) - verify { - let genesis_header: BridgedHeader = bp_test_utils::test_header(Zero::zero()); - let header: BridgedHeader = bp_test_utils::test_header(One::one()); - let expected_hash = header.hash(); - - // check that the header#1 has been inserted - assert_eq!(>::get().unwrap().1, expected_hash); - assert!(>::contains_key(expected_hash)); - - // check that the header#0 has been pruned - assert!(!>::contains_key(genesis_header.hash())); - } - - impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) -} diff --git a/cumulus/bridges/modules/grandpa/src/call_ext.rs b/cumulus/bridges/modules/grandpa/src/call_ext.rs deleted file mode 100644 index c83e88b7b562..000000000000 --- a/cumulus/bridges/modules/grandpa/src/call_ext.rs +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -use crate::{weights::WeightInfo, BridgedBlockNumber, BridgedHeader, Config, Error, Pallet}; -use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; -use bp_runtime::BlockNumberOf; -use codec::Encode; -use frame_support::{dispatch::CallableCallFor, traits::IsSubType, weights::Weight, RuntimeDebug}; -use sp_runtime::{ - traits::{Header, Zero}, - transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, - SaturatedConversion, -}; - -/// Info about a `SubmitParachainHeads` call which tries to update a single parachain. -#[derive(Copy, Clone, PartialEq, RuntimeDebug)] -pub struct SubmitFinalityProofInfo { - /// Number of the finality target. - pub block_number: N, - /// Extra weight that we assume is included in the call. - /// - /// We have some assumptions about headers and justifications of the bridged chain. - /// We know that if our assumptions are correct, then the call must not have the - /// weight above some limit. The fee paid for weight above that limit, is never refunded. - pub extra_weight: Weight, - /// Extra size (in bytes) that we assume are included in the call. - /// - /// We have some assumptions about headers and justifications of the bridged chain. - /// We know that if our assumptions are correct, then the call must not have the - /// weight above some limit. The fee paid for bytes above that limit, is never refunded. - pub extra_size: u32, -} - -impl SubmitFinalityProofInfo { - /// Returns `true` if call size/weight is below our estimations for regular calls. - pub fn fits_limits(&self) -> bool { - self.extra_weight.is_zero() && self.extra_size.is_zero() - } -} - -/// Helper struct that provides methods for working with the `SubmitFinalityProof` call. -pub struct SubmitFinalityProofHelper, I: 'static> { - _phantom_data: sp_std::marker::PhantomData<(T, I)>, -} - -impl, I: 'static> SubmitFinalityProofHelper { - /// Check that the GRANDPA head provided by the `SubmitFinalityProof` is better than the best - /// one we know. - pub fn check_obsolete( - finality_target: BlockNumberOf, - ) -> Result<(), Error> { - let best_finalized = crate::BestFinalized::::get().ok_or_else(|| { - log::trace!( - target: crate::LOG_TARGET, - "Cannot finalize header {:?} because pallet is not yet initialized", - finality_target, - ); - >::NotInitialized - })?; - - if best_finalized.number() >= finality_target { - log::trace!( - target: crate::LOG_TARGET, - "Cannot finalize obsolete header: bundled {:?}, best {:?}", - finality_target, - best_finalized, - ); - - return Err(Error::::OldHeader) - } - - Ok(()) - } - - /// Check if the `SubmitFinalityProof` was successfully executed. - pub fn was_successful(finality_target: BlockNumberOf) -> bool { - match crate::BestFinalized::::get() { - Some(best_finalized) => best_finalized.number() == finality_target, - None => false, - } - } -} - -/// Trait representing a call that is a sub type of this pallet's call. -pub trait CallSubType, I: 'static>: - IsSubType, T>> -{ - /// Extract finality proof info from a runtime call. - fn submit_finality_proof_info( - &self, - ) -> Option>> { - if let Some(crate::Call::::submit_finality_proof { finality_target, justification }) = - self.is_sub_type() - { - return Some(submit_finality_proof_info_from_args::( - finality_target, - justification, - )) - } - - None - } - - /// Validate Grandpa headers in order to avoid "mining" transactions that provide outdated - /// bridged chain headers. Without this validation, even honest relayers may lose their funds - /// if there are multiple relays running and submitting the same information. - fn check_obsolete_submit_finality_proof(&self) -> TransactionValidity - where - Self: Sized, - { - let finality_target = match self.submit_finality_proof_info() { - Some(finality_proof) => finality_proof, - _ => return Ok(ValidTransaction::default()), - }; - - match SubmitFinalityProofHelper::::check_obsolete(finality_target.block_number) { - Ok(_) => Ok(ValidTransaction::default()), - Err(Error::::OldHeader) => InvalidTransaction::Stale.into(), - Err(_) => InvalidTransaction::Call.into(), - } - } -} - -impl, I: 'static> CallSubType for T::RuntimeCall where - T::RuntimeCall: IsSubType, T>> -{ -} - -/// Extract finality proof info from the submitted header and justification. -pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( - finality_target: &BridgedHeader, - justification: &GrandpaJustification>, -) -> SubmitFinalityProofInfo> { - let block_number = *finality_target.number(); - - // the `submit_finality_proof` call will reject justifications with invalid, duplicate, - // unknown and extra signatures. It'll also reject justifications with less than necessary - // signatures. So we do not care about extra weight because of additional signatures here. - let precommits_len = justification.commit.precommits.len().saturated_into(); - let required_precommits = precommits_len; - - // We do care about extra weight because of more-than-expected headers in the votes - // ancestries. But we have problems computing extra weight for additional headers (weight of - // additional header is too small, so that our benchmarks aren't detecting that). So if there - // are more than expected headers in votes ancestries, we will treat the whole call weight - // as an extra weight. - let votes_ancestries_len = justification.votes_ancestries.len().saturated_into(); - let extra_weight = - if votes_ancestries_len > T::BridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY { - T::WeightInfo::submit_finality_proof(precommits_len, votes_ancestries_len) - } else { - Weight::zero() - }; - - // we can estimate extra call size easily, without any additional significant overhead - let actual_call_size: u32 = finality_target - .encoded_size() - .saturating_add(justification.encoded_size()) - .saturated_into(); - let max_expected_call_size = max_expected_call_size::(required_precommits); - let extra_size = actual_call_size.saturating_sub(max_expected_call_size); - - SubmitFinalityProofInfo { block_number, extra_weight, extra_size } -} - -/// Returns maximal expected size of `submit_finality_proof` call arguments. -fn max_expected_call_size, I: 'static>(required_precommits: u32) -> u32 { - let max_expected_justification_size = - GrandpaJustification::>::max_reasonable_size::( - required_precommits, - ); - - // call arguments are header and justification - T::BridgedChain::MAX_HEADER_SIZE.saturating_add(max_expected_justification_size) -} - -#[cfg(test)] -mod tests { - use crate::{ - call_ext::CallSubType, - mock::{run_test, test_header, RuntimeCall, TestBridgedChain, TestNumber, TestRuntime}, - BestFinalized, Config, WeightInfo, - }; - use bp_header_chain::ChainWithGrandpa; - use bp_runtime::HeaderId; - use bp_test_utils::{ - make_default_justification, make_justification_for_header, JustificationGeneratorParams, - }; - use frame_support::weights::Weight; - use sp_runtime::{testing::DigestItem, traits::Header as _, SaturatedConversion}; - - fn validate_block_submit(num: TestNumber) -> bool { - let bridge_grandpa_call = crate::Call::::submit_finality_proof { - finality_target: Box::new(test_header(num)), - justification: make_default_justification(&test_header(num)), - }; - RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( - bridge_grandpa_call, - )) - .is_ok() - } - - fn sync_to_header_10() { - let header10_hash = sp_core::H256::default(); - BestFinalized::::put(HeaderId(10, header10_hash)); - } - - #[test] - fn extension_rejects_obsolete_header() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#5 => tx is - // rejected - sync_to_header_10(); - assert!(!validate_block_submit(5)); - }); - } - - #[test] - fn extension_rejects_same_header() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#10 => tx is - // rejected - sync_to_header_10(); - assert!(!validate_block_submit(10)); - }); - } - - #[test] - fn extension_accepts_new_header() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#15 => tx is - // accepted - sync_to_header_10(); - assert!(validate_block_submit(15)); - }); - } - - #[test] - fn extension_returns_correct_extra_size_if_call_arguments_are_too_large() { - // when call arguments are below our limit => no refund - let small_finality_target = test_header(1); - let justification_params = JustificationGeneratorParams { - header: small_finality_target.clone(), - ..Default::default() - }; - let small_justification = make_justification_for_header(justification_params); - let small_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { - finality_target: Box::new(small_finality_target), - justification: small_justification, - }); - assert_eq!(small_call.submit_finality_proof_info().unwrap().extra_size, 0); - - // when call arguments are too large => partial refund - let mut large_finality_target = test_header(1); - large_finality_target - .digest_mut() - .push(DigestItem::Other(vec![42u8; 1024 * 1024])); - let justification_params = JustificationGeneratorParams { - header: large_finality_target.clone(), - ..Default::default() - }; - let large_justification = make_justification_for_header(justification_params); - let large_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { - finality_target: Box::new(large_finality_target), - justification: large_justification, - }); - assert_ne!(large_call.submit_finality_proof_info().unwrap().extra_size, 0); - } - - #[test] - fn extension_returns_correct_extra_weight_if_there_are_too_many_headers_in_votes_ancestry() { - let finality_target = test_header(1); - let mut justification_params = JustificationGeneratorParams { - header: finality_target.clone(), - ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY, - ..Default::default() - }; - - // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY` headers => no refund - let justification = make_justification_for_header(justification_params.clone()); - let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { - finality_target: Box::new(finality_target.clone()), - justification, - }); - assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, Weight::zero()); - - // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1` headers => full refund - justification_params.ancestors += 1; - let justification = make_justification_for_header(justification_params); - let call_weight = ::WeightInfo::submit_finality_proof( - justification.commit.precommits.len().saturated_into(), - justification.votes_ancestries.len().saturated_into(), - ); - let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { - finality_target: Box::new(finality_target), - justification, - }); - assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, call_weight); - } -} diff --git a/cumulus/bridges/modules/grandpa/src/lib.rs b/cumulus/bridges/modules/grandpa/src/lib.rs deleted file mode 100644 index 425712ad9a20..000000000000 --- a/cumulus/bridges/modules/grandpa/src/lib.rs +++ /dev/null @@ -1,1462 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Substrate GRANDPA Pallet -//! -//! This pallet is an on-chain GRANDPA light client for Substrate based chains. -//! -//! This pallet achieves this by trustlessly verifying GRANDPA finality proofs on-chain. Once -//! verified, finalized headers are stored in the pallet, thereby creating a sparse header chain. -//! This sparse header chain can be used as a source of truth for other higher-level applications. -//! -//! The pallet is responsible for tracking GRANDPA validator set hand-offs. We only import headers -//! with justifications signed by the current validator set we know of. The header is inspected for -//! a `ScheduledChanges` digest item, which is then used to update to next validator set. -//! -//! Since this pallet only tracks finalized headers it does not deal with forks. Forks can only -//! occur if the GRANDPA validator set on the bridged chain is either colluding or there is a severe -//! bug causing resulting in an equivocation. Such events are outside the scope of this pallet. -//! Shall the fork occur on the bridged chain governance intervention will be required to -//! re-initialize the bridge and track the right fork. - -#![cfg_attr(not(feature = "std"), no_std)] -// Runtime-generated enums -#![allow(clippy::large_enum_variant)] - -pub use storage_types::StoredAuthoritySet; - -use bp_header_chain::{ - justification::GrandpaJustification, AuthoritySet, ChainWithGrandpa, GrandpaConsensusLogReader, - HeaderChain, InitializationData, StoredHeaderData, StoredHeaderDataBuilder, - StoredHeaderGrandpaInfo, -}; -use bp_runtime::{BlockNumberOf, HashOf, HasherOf, HeaderId, HeaderOf, OwnedBridgeModule}; -use frame_support::{dispatch::PostDispatchInfo, ensure, DefaultNoBound}; -use sp_runtime::{ - traits::{Header as HeaderT, Zero}, - SaturatedConversion, -}; -use sp_std::{boxed::Box, convert::TryInto, prelude::*}; - -mod call_ext; -#[cfg(test)] -mod mock; -mod storage_types; - -/// Module, containing weights for this pallet. -pub mod weights; - -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarking; - -// Re-export in crate namespace for `construct_runtime!` -pub use call_ext::*; -pub use pallet::*; -pub use weights::WeightInfo; - -/// The target that will be used when publishing logs related to this pallet. -pub const LOG_TARGET: &str = "runtime::bridge-grandpa"; - -/// Bridged chain from the pallet configuration. -pub type BridgedChain = >::BridgedChain; -/// Block number of the bridged chain. -pub type BridgedBlockNumber = BlockNumberOf<>::BridgedChain>; -/// Block hash of the bridged chain. -pub type BridgedBlockHash = HashOf<>::BridgedChain>; -/// Block id of the bridged chain. -pub type BridgedBlockId = HeaderId, BridgedBlockNumber>; -/// Hasher of the bridged chain. -pub type BridgedBlockHasher = HasherOf<>::BridgedChain>; -/// Header of the bridged chain. -pub type BridgedHeader = HeaderOf<>::BridgedChain>; -/// Header data of the bridged chain that is stored at this chain by this pallet. -pub type BridgedStoredHeaderData = - StoredHeaderData, BridgedBlockHash>; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use bp_runtime::BasicOperatingMode; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> - + IsType<::RuntimeEvent>; - - /// The chain we are bridging to here. - type BridgedChain: ChainWithGrandpa; - - /// Maximal number of "free" mandatory header transactions per block. - /// - /// To be able to track the bridged chain, the pallet requires all headers that are - /// changing GRANDPA authorities set at the bridged chain (we call them mandatory). - /// So it is a common good deed to submit mandatory headers to the pallet. However, if the - /// bridged chain gets compromised, its validators may generate as many mandatory headers - /// as they want. And they may fill the whole block (at this chain) for free. This constants - /// limits number of calls that we may refund in a single block. All calls above this - /// limit are accepted, but are not refunded. - #[pallet::constant] - type MaxFreeMandatoryHeadersPerBlock: Get; - - /// Maximal number of finalized headers to keep in the storage. - /// - /// The setting is there to prevent growing the on-chain state indefinitely. Note - /// the setting does not relate to block numbers - we will simply keep as much items - /// in the storage, so it doesn't guarantee any fixed timeframe for finality headers. - /// - /// Incautious change of this constant may lead to orphan entries in the runtime storage. - #[pallet::constant] - type HeadersToKeep: Get; - - /// Weights gathered through benchmarking. - type WeightInfo: WeightInfo; - } - - #[pallet::pallet] - pub struct Pallet(PhantomData<(T, I)>); - - #[pallet::hooks] - impl, I: 'static> Hooks> for Pallet { - fn on_initialize(_n: BlockNumberFor) -> Weight { - FreeMandatoryHeadersRemaining::::put(T::MaxFreeMandatoryHeadersPerBlock::get()); - Weight::zero() - } - - fn on_finalize(_n: BlockNumberFor) { - FreeMandatoryHeadersRemaining::::kill(); - } - } - - impl, I: 'static> OwnedBridgeModule for Pallet { - const LOG_TARGET: &'static str = LOG_TARGET; - type OwnerStorage = PalletOwner; - type OperatingMode = BasicOperatingMode; - type OperatingModeStorage = PalletOperatingMode; - } - - #[pallet::call] - impl, I: 'static> Pallet { - /// Verify a target header is finalized according to the given finality proof. - /// - /// It will use the underlying storage pallet to fetch information about the current - /// authorities and best finalized header in order to verify that the header is finalized. - /// - /// If successful in verification, it will write the target header to the underlying storage - /// pallet. - /// - /// The call fails if: - /// - /// - the pallet is halted; - /// - /// - the pallet knows better header than the `finality_target`; - /// - /// - verification is not optimized or invalid; - /// - /// - header contains forced authorities set change or change with non-zero delay. - #[pallet::call_index(0)] - #[pallet::weight(::submit_finality_proof( - justification.commit.precommits.len().saturated_into(), - justification.votes_ancestries.len().saturated_into(), - ))] - pub fn submit_finality_proof( - origin: OriginFor, - finality_target: Box>, - justification: GrandpaJustification>, - ) -> DispatchResultWithPostInfo { - Self::ensure_not_halted().map_err(Error::::BridgeModule)?; - ensure_signed(origin)?; - - let (hash, number) = (finality_target.hash(), *finality_target.number()); - log::trace!( - target: LOG_TARGET, - "Going to try and finalize header {:?}", - finality_target - ); - - SubmitFinalityProofHelper::::check_obsolete(number)?; - - let authority_set = >::get(); - let unused_proof_size = authority_set.unused_proof_size(); - let set_id = authority_set.set_id; - let authority_set: AuthoritySet = authority_set.into(); - verify_justification::(&justification, hash, number, authority_set)?; - - let maybe_new_authority_set = - try_enact_authority_change::(&finality_target, set_id)?; - let may_refund_call_fee = maybe_new_authority_set.is_some() && - // if we have seen too many mandatory headers in this block, we don't want to refund - Self::free_mandatory_headers_remaining() > 0 && - // if arguments out of expected bounds, we don't want to refund - submit_finality_proof_info_from_args::(&finality_target, &justification) - .fits_limits(); - if may_refund_call_fee { - FreeMandatoryHeadersRemaining::::mutate(|count| { - *count = count.saturating_sub(1) - }); - } - insert_header::(*finality_target, hash); - log::info!( - target: LOG_TARGET, - "Successfully imported finalized header with hash {:?}!", - hash - ); - - // mandatory header is a header that changes authorities set. The pallet can't go - // further without importing this header. So every bridge MUST import mandatory headers. - // - // We don't want to charge extra costs for mandatory operations. So relayer is not - // paying fee for mandatory headers import transactions. - // - // If size/weight of the call is exceeds our estimated limits, the relayer still needs - // to pay for the transaction. - let pays_fee = if may_refund_call_fee { Pays::No } else { Pays::Yes }; - - // the proof size component of the call weight assumes that there are - // `MaxBridgedAuthorities` in the `CurrentAuthoritySet` (we use `MaxEncodedLen` - // estimation). But if their number is lower, then we may "refund" some `proof_size`, - // making proof smaller and leaving block space to other useful transactions - let pre_dispatch_weight = T::WeightInfo::submit_finality_proof( - justification.commit.precommits.len().saturated_into(), - justification.votes_ancestries.len().saturated_into(), - ); - let actual_weight = pre_dispatch_weight - .set_proof_size(pre_dispatch_weight.proof_size().saturating_sub(unused_proof_size)); - - Self::deposit_event(Event::UpdatedBestFinalizedHeader { - number, - hash, - grandpa_info: StoredHeaderGrandpaInfo { - finality_proof: justification, - new_verification_context: maybe_new_authority_set, - }, - }); - - Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee }) - } - - /// Bootstrap the bridge pallet with an initial header and authority set from which to sync. - /// - /// The initial configuration provided does not need to be the genesis header of the bridged - /// chain, it can be any arbitrary header. You can also provide the next scheduled set - /// change if it is already know. - /// - /// This function is only allowed to be called from a trusted origin and writes to storage - /// with practically no checks in terms of the validity of the data. It is important that - /// you ensure that valid data is being passed in. - #[pallet::call_index(1)] - #[pallet::weight((T::DbWeight::get().reads_writes(2, 5), DispatchClass::Operational))] - pub fn initialize( - origin: OriginFor, - init_data: super::InitializationData>, - ) -> DispatchResultWithPostInfo { - Self::ensure_owner_or_root(origin)?; - - let init_allowed = !>::exists(); - ensure!(init_allowed, >::AlreadyInitialized); - initialize_bridge::(init_data.clone())?; - - log::info!( - target: LOG_TARGET, - "Pallet has been initialized with the following parameters: {:?}", - init_data - ); - - Ok(().into()) - } - - /// Change `PalletOwner`. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(2)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { - >::set_owner(origin, new_owner) - } - - /// Halt or resume all pallet operations. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(3)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_operating_mode( - origin: OriginFor, - operating_mode: BasicOperatingMode, - ) -> DispatchResult { - >::set_operating_mode(origin, operating_mode) - } - } - - /// Number mandatory headers that we may accept in the current block for free (returning - /// `Pays::No`). - /// - /// If the `FreeMandatoryHeadersRemaining` hits zero, all following mandatory headers in the - /// current block are accepted with fee (`Pays::Yes` is returned). - /// - /// The `FreeMandatoryHeadersRemaining` is an ephemeral value that is set to - /// `MaxFreeMandatoryHeadersPerBlock` at each block initialization and is killed on block - /// finalization. So it never ends up in the storage trie. - #[pallet::storage] - #[pallet::whitelist_storage] - #[pallet::getter(fn free_mandatory_headers_remaining)] - pub(super) type FreeMandatoryHeadersRemaining, I: 'static = ()> = - StorageValue<_, u32, ValueQuery>; - - /// Hash of the header used to bootstrap the pallet. - #[pallet::storage] - pub(super) type InitialHash, I: 'static = ()> = - StorageValue<_, BridgedBlockHash, ValueQuery>; - - /// Hash of the best finalized header. - #[pallet::storage] - #[pallet::getter(fn best_finalized)] - pub type BestFinalized, I: 'static = ()> = - StorageValue<_, BridgedBlockId, OptionQuery>; - - /// A ring buffer of imported hashes. Ordered by the insertion time. - #[pallet::storage] - pub(super) type ImportedHashes, I: 'static = ()> = StorageMap< - Hasher = Identity, - Key = u32, - Value = BridgedBlockHash, - QueryKind = OptionQuery, - OnEmpty = GetDefault, - MaxValues = MaybeHeadersToKeep, - >; - - /// Current ring buffer position. - #[pallet::storage] - pub(super) type ImportedHashesPointer, I: 'static = ()> = - StorageValue<_, u32, ValueQuery>; - - /// Relevant fields of imported headers. - #[pallet::storage] - pub type ImportedHeaders, I: 'static = ()> = StorageMap< - Hasher = Identity, - Key = BridgedBlockHash, - Value = BridgedStoredHeaderData, - QueryKind = OptionQuery, - OnEmpty = GetDefault, - MaxValues = MaybeHeadersToKeep, - >; - - /// The current GRANDPA Authority set. - #[pallet::storage] - pub type CurrentAuthoritySet, I: 'static = ()> = - StorageValue<_, StoredAuthoritySet, ValueQuery>; - - /// Optional pallet owner. - /// - /// Pallet owner has a right to halt all pallet operations and then resume it. If it is - /// `None`, then there are no direct ways to halt/resume pallet operations, but other - /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt - /// flag directly or call the `halt_operations`). - #[pallet::storage] - pub type PalletOwner, I: 'static = ()> = - StorageValue<_, T::AccountId, OptionQuery>; - - /// The current operating mode of the pallet. - /// - /// Depending on the mode either all, or no transactions will be allowed. - #[pallet::storage] - pub type PalletOperatingMode, I: 'static = ()> = - StorageValue<_, BasicOperatingMode, ValueQuery>; - - #[pallet::genesis_config] - #[derive(DefaultNoBound)] - pub struct GenesisConfig, I: 'static = ()> { - /// Optional module owner account. - pub owner: Option, - /// Optional module initialization data. - pub init_data: Option>>, - } - - #[pallet::genesis_build] - impl, I: 'static> BuildGenesisConfig for GenesisConfig { - fn build(&self) { - if let Some(ref owner) = self.owner { - >::put(owner); - } - - if let Some(init_data) = self.init_data.clone() { - initialize_bridge::(init_data).expect("genesis config is correct; qed"); - } else { - // Since the bridge hasn't been initialized we shouldn't allow anyone to perform - // transactions. - >::put(BasicOperatingMode::Halted); - } - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event, I: 'static = ()> { - /// Best finalized chain header has been updated to the header with given number and hash. - UpdatedBestFinalizedHeader { - number: BridgedBlockNumber, - hash: BridgedBlockHash, - /// The Grandpa info associated to the new best finalized header. - grandpa_info: StoredHeaderGrandpaInfo>, - }, - } - - #[pallet::error] - pub enum Error { - /// The given justification is invalid for the given header. - InvalidJustification, - /// The authority set from the underlying header chain is invalid. - InvalidAuthoritySet, - /// The header being imported is older than the best finalized header known to the pallet. - OldHeader, - /// The scheduled authority set change found in the header is unsupported by the pallet. - /// - /// This is the case for non-standard (e.g forced) authority set changes. - UnsupportedScheduledChange, - /// The pallet is not yet initialized. - NotInitialized, - /// The pallet has already been initialized. - AlreadyInitialized, - /// Too many authorities in the set. - TooManyAuthoritiesInSet, - /// Error generated by the `OwnedBridgeModule` trait. - BridgeModule(bp_runtime::OwnedBridgeModuleError), - } - - /// Check the given header for a GRANDPA scheduled authority set change. If a change - /// is found it will be enacted immediately. - /// - /// This function does not support forced changes, or scheduled changes with delays - /// since these types of changes are indicative of abnormal behavior from GRANDPA. - /// - /// Returned value will indicate if a change was enacted or not. - pub(crate) fn try_enact_authority_change, I: 'static>( - header: &BridgedHeader, - current_set_id: sp_consensus_grandpa::SetId, - ) -> Result, DispatchError> { - // We don't support forced changes - at that point governance intervention is required. - ensure!( - GrandpaConsensusLogReader::>::find_forced_change( - header.digest() - ) - .is_none(), - >::UnsupportedScheduledChange - ); - - if let Some(change) = - GrandpaConsensusLogReader::>::find_scheduled_change( - header.digest(), - ) { - // GRANDPA only includes a `delay` for forced changes, so this isn't valid. - ensure!(change.delay == Zero::zero(), >::UnsupportedScheduledChange); - - // TODO [#788]: Stop manually increasing the `set_id` here. - let next_authorities = StoredAuthoritySet:: { - authorities: change - .next_authorities - .try_into() - .map_err(|_| Error::::TooManyAuthoritiesInSet)?, - set_id: current_set_id + 1, - }; - - // Since our header schedules a change and we know the delay is 0, it must also enact - // the change. - >::put(&next_authorities); - - log::info!( - target: LOG_TARGET, - "Transitioned from authority set {} to {}! New authorities are: {:?}", - current_set_id, - current_set_id + 1, - next_authorities, - ); - - return Ok(Some(next_authorities.into())) - }; - - Ok(None) - } - - /// Verify a GRANDPA justification (finality proof) for a given header. - /// - /// Will use the GRANDPA current authorities known to the pallet. - /// - /// If successful it returns the decoded GRANDPA justification so we can refund any weight which - /// was overcharged in the initial call. - pub(crate) fn verify_justification, I: 'static>( - justification: &GrandpaJustification>, - hash: BridgedBlockHash, - number: BridgedBlockNumber, - authority_set: bp_header_chain::AuthoritySet, - ) -> Result<(), sp_runtime::DispatchError> { - use bp_header_chain::justification::verify_justification; - - Ok(verify_justification::>( - (hash, number), - &authority_set.try_into().map_err(|_| >::InvalidAuthoritySet)?, - justification, - ) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "Received invalid justification for {:?}: {:?}", - hash, - e, - ); - >::InvalidJustification - })?) - } - - /// Import a previously verified header to the storage. - /// - /// Note this function solely takes care of updating the storage and pruning old entries, - /// but does not verify the validity of such import. - pub(crate) fn insert_header, I: 'static>( - header: BridgedHeader, - hash: BridgedBlockHash, - ) { - let index = >::get(); - let pruning = >::try_get(index); - >::put(HeaderId(*header.number(), hash)); - >::insert(hash, header.build()); - >::insert(index, hash); - - // Update ring buffer pointer and remove old header. - >::put((index + 1) % T::HeadersToKeep::get()); - if let Ok(hash) = pruning { - log::debug!(target: LOG_TARGET, "Pruning old header: {:?}.", hash); - >::remove(hash); - } - } - - /// Since this writes to storage with no real checks this should only be used in functions that - /// were called by a trusted origin. - pub(crate) fn initialize_bridge, I: 'static>( - init_params: super::InitializationData>, - ) -> Result<(), Error> { - let super::InitializationData { header, authority_list, set_id, operating_mode } = - init_params; - let authority_set_length = authority_list.len(); - let authority_set = StoredAuthoritySet::::try_new(authority_list, set_id) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "Failed to initialize bridge. Number of authorities in the set {} is larger than the configured value {}", - authority_set_length, - T::BridgedChain::MAX_AUTHORITIES_COUNT, - ); - - e - })?; - let initial_hash = header.hash(); - - >::put(initial_hash); - >::put(0); - insert_header::(*header, initial_hash); - - >::put(authority_set); - - >::put(operating_mode); - - Ok(()) - } - - /// Adapter for using `Config::HeadersToKeep` as `MaxValues` bound in our storage maps. - pub struct MaybeHeadersToKeep(PhantomData<(T, I)>); - - // this implementation is required to use the struct as `MaxValues` - impl, I: 'static> Get> for MaybeHeadersToKeep { - fn get() -> Option { - Some(T::HeadersToKeep::get()) - } - } - - /// Initialize pallet so that it is ready for inserting new header. - /// - /// The function makes sure that the new insertion will cause the pruning of some old header. - /// - /// Returns parent header for the new header. - #[cfg(feature = "runtime-benchmarks")] - pub(crate) fn bootstrap_bridge, I: 'static>( - init_params: super::InitializationData>, - ) -> BridgedHeader { - let start_header = init_params.header.clone(); - initialize_bridge::(init_params).expect("benchmarks are correct"); - - // the most obvious way to cause pruning during next insertion would be to insert - // `HeadersToKeep` headers. But it'll make our benchmarks slow. So we will just play with - // our pruning ring-buffer. - assert_eq!(ImportedHashesPointer::::get(), 1); - ImportedHashesPointer::::put(0); - - *start_header - } -} - -impl, I: 'static> Pallet -where - ::RuntimeEvent: TryInto>, -{ - /// Get the GRANDPA justifications accepted in the current block. - pub fn synced_headers_grandpa_info() -> Vec>> { - frame_system::Pallet::::read_events_no_consensus() - .filter_map(|event| { - if let Event::::UpdatedBestFinalizedHeader { grandpa_info, .. } = - event.event.try_into().ok()? - { - return Some(grandpa_info) - } - None - }) - .collect() - } -} - -/// Bridge GRANDPA pallet as header chain. -pub type GrandpaChainHeaders = Pallet; - -impl, I: 'static> HeaderChain> for GrandpaChainHeaders { - fn finalized_header_state_root( - header_hash: HashOf>, - ) -> Option>> { - ImportedHeaders::::get(header_hash).map(|h| h.state_root) - } -} - -/// (Re)initialize bridge with given header for using it in `pallet-bridge-messages` benchmarks. -#[cfg(feature = "runtime-benchmarks")] -pub fn initialize_for_benchmarks, I: 'static>(header: BridgedHeader) { - initialize_bridge::(InitializationData { - header: Box::new(header), - authority_list: sp_std::vec::Vec::new(), /* we don't verify any proofs in external - * benchmarks */ - set_id: 0, - operating_mode: bp_runtime::BasicOperatingMode::Normal, - }) - .expect("only used from benchmarks; benchmarks are correct; qed"); -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::mock::{ - run_test, test_header, RuntimeEvent as TestEvent, RuntimeOrigin, System, TestBridgedChain, - TestHeader, TestNumber, TestRuntime, MAX_BRIDGED_AUTHORITIES, - }; - use bp_header_chain::BridgeGrandpaCall; - use bp_runtime::BasicOperatingMode; - use bp_test_utils::{ - authority_list, generate_owned_bridge_module_tests, make_default_justification, - make_justification_for_header, JustificationGeneratorParams, ALICE, BOB, - }; - use codec::Encode; - use frame_support::{ - assert_err, assert_noop, assert_ok, - dispatch::{Pays, PostDispatchInfo}, - storage::generator::StorageValue, - }; - use frame_system::{EventRecord, Phase}; - use sp_consensus_grandpa::{ConsensusLog, GRANDPA_ENGINE_ID}; - use sp_core::Get; - use sp_runtime::{Digest, DigestItem, DispatchError}; - - fn initialize_substrate_bridge() { - System::set_block_number(1); - System::reset_events(); - - assert_ok!(init_with_origin(RuntimeOrigin::root())); - } - - fn init_with_origin( - origin: RuntimeOrigin, - ) -> Result< - InitializationData, - sp_runtime::DispatchErrorWithPostInfo, - > { - let genesis = test_header(0); - - let init_data = InitializationData { - header: Box::new(genesis), - authority_list: authority_list(), - set_id: 1, - operating_mode: BasicOperatingMode::Normal, - }; - - Pallet::::initialize(origin, init_data.clone()).map(|_| init_data) - } - - fn submit_finality_proof(header: u8) -> frame_support::dispatch::DispatchResultWithPostInfo { - let header = test_header(header.into()); - let justification = make_default_justification(&header); - - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification, - ) - } - - fn submit_finality_proof_with_set_id( - header: u8, - set_id: u64, - ) -> frame_support::dispatch::DispatchResultWithPostInfo { - let header = test_header(header.into()); - let justification = make_justification_for_header(JustificationGeneratorParams { - header: header.clone(), - set_id, - ..Default::default() - }); - - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification, - ) - } - - fn submit_mandatory_finality_proof( - number: u8, - set_id: u64, - ) -> frame_support::dispatch::DispatchResultWithPostInfo { - let mut header = test_header(number.into()); - // to ease tests that are using `submit_mandatory_finality_proof`, we'll be using the - // same set for all sessions - let consensus_log = - ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { - next_authorities: authority_list(), - delay: 0, - }); - header.digest = - Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] }; - let justification = make_justification_for_header(JustificationGeneratorParams { - header: header.clone(), - set_id, - ..Default::default() - }); - - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification, - ) - } - - fn next_block() { - use frame_support::traits::OnInitialize; - - let current_number = frame_system::Pallet::::block_number(); - frame_system::Pallet::::set_block_number(current_number + 1); - let _ = Pallet::::on_initialize(current_number); - } - - fn change_log(delay: u64) -> Digest { - let consensus_log = - ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { - next_authorities: vec![(ALICE.into(), 1), (BOB.into(), 1)], - delay, - }); - - Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } - } - - fn forced_change_log(delay: u64) -> Digest { - let consensus_log = ConsensusLog::::ForcedChange( - delay, - sp_consensus_grandpa::ScheduledChange { - next_authorities: vec![(ALICE.into(), 1), (BOB.into(), 1)], - delay, - }, - ); - - Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } - } - - fn many_authorities_log() -> Digest { - let consensus_log = - ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { - next_authorities: std::iter::repeat((ALICE.into(), 1)) - .take(MAX_BRIDGED_AUTHORITIES as usize + 1) - .collect(), - delay: 0, - }); - - Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } - } - - #[test] - fn init_root_or_owner_origin_can_initialize_pallet() { - run_test(|| { - assert_noop!(init_with_origin(RuntimeOrigin::signed(1)), DispatchError::BadOrigin); - assert_ok!(init_with_origin(RuntimeOrigin::root())); - - // Reset storage so we can initialize the pallet again - BestFinalized::::kill(); - PalletOwner::::put(2); - assert_ok!(init_with_origin(RuntimeOrigin::signed(2))); - }) - } - - #[test] - fn init_storage_entries_are_correctly_initialized() { - run_test(|| { - assert_eq!(BestFinalized::::get(), None,); - assert_eq!(Pallet::::best_finalized(), None); - assert_eq!(PalletOperatingMode::::try_get(), Err(())); - - let init_data = init_with_origin(RuntimeOrigin::root()).unwrap(); - - assert!(>::contains_key(init_data.header.hash())); - assert_eq!(BestFinalized::::get().unwrap().1, init_data.header.hash()); - assert_eq!( - CurrentAuthoritySet::::get().authorities, - init_data.authority_list - ); - assert_eq!( - PalletOperatingMode::::try_get(), - Ok(BasicOperatingMode::Normal) - ); - }) - } - - #[test] - fn init_can_only_initialize_pallet_once() { - run_test(|| { - initialize_substrate_bridge(); - assert_noop!( - init_with_origin(RuntimeOrigin::root()), - >::AlreadyInitialized - ); - }) - } - - #[test] - fn init_fails_if_there_are_too_many_authorities_in_the_set() { - run_test(|| { - let genesis = test_header(0); - let init_data = InitializationData { - header: Box::new(genesis), - authority_list: std::iter::repeat(authority_list().remove(0)) - .take(MAX_BRIDGED_AUTHORITIES as usize + 1) - .collect(), - set_id: 1, - operating_mode: BasicOperatingMode::Normal, - }; - - assert_noop!( - Pallet::::initialize(RuntimeOrigin::root(), init_data), - Error::::TooManyAuthoritiesInSet, - ); - }); - } - - #[test] - fn pallet_rejects_transactions_if_halted() { - run_test(|| { - initialize_substrate_bridge(); - - assert_ok!(Pallet::::set_operating_mode( - RuntimeOrigin::root(), - BasicOperatingMode::Halted - )); - assert_noop!( - submit_finality_proof(1), - Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted) - ); - - assert_ok!(Pallet::::set_operating_mode( - RuntimeOrigin::root(), - BasicOperatingMode::Normal - )); - assert_ok!(submit_finality_proof(1)); - }) - } - - #[test] - fn pallet_rejects_header_if_not_initialized_yet() { - run_test(|| { - assert_noop!(submit_finality_proof(1), Error::::NotInitialized); - }); - } - - #[test] - fn succesfully_imports_header_with_valid_finality() { - run_test(|| { - initialize_substrate_bridge(); - - let header_number = 1; - let header = test_header(header_number.into()); - let justification = make_default_justification(&header); - - let pre_dispatch_weight = ::WeightInfo::submit_finality_proof( - justification.commit.precommits.len().try_into().unwrap_or(u32::MAX), - justification.votes_ancestries.len().try_into().unwrap_or(u32::MAX), - ); - - let result = submit_finality_proof(header_number); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - // our test config assumes 2048 max authorities and we are just using couple - let pre_dispatch_proof_size = pre_dispatch_weight.proof_size(); - let actual_proof_size = result.unwrap().actual_weight.unwrap().proof_size(); - assert!(actual_proof_size > 0); - assert!( - actual_proof_size < pre_dispatch_proof_size, - "Actual proof size {actual_proof_size} must be less than the pre-dispatch {pre_dispatch_proof_size}", - ); - - let header = test_header(1); - assert_eq!(>::get().unwrap().1, header.hash()); - assert!(>::contains_key(header.hash())); - - assert_eq!( - System::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Grandpa(Event::UpdatedBestFinalizedHeader { - number: *header.number(), - hash: header.hash(), - grandpa_info: StoredHeaderGrandpaInfo { - finality_proof: justification.clone(), - new_verification_context: None, - }, - }), - topics: vec![], - }], - ); - assert_eq!( - Pallet::::synced_headers_grandpa_info(), - vec![StoredHeaderGrandpaInfo { - finality_proof: justification, - new_verification_context: None - }] - ); - }) - } - - #[test] - fn rejects_justification_that_skips_authority_set_transition() { - run_test(|| { - initialize_substrate_bridge(); - - let header = test_header(1); - - let params = - JustificationGeneratorParams:: { set_id: 2, ..Default::default() }; - let justification = make_justification_for_header(params); - - assert_err!( - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification, - ), - >::InvalidJustification - ); - }) - } - - #[test] - fn does_not_import_header_with_invalid_finality_proof() { - run_test(|| { - initialize_substrate_bridge(); - - let header = test_header(1); - let mut justification = make_default_justification(&header); - justification.round = 42; - - assert_err!( - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification, - ), - >::InvalidJustification - ); - }) - } - - #[test] - fn disallows_invalid_authority_set() { - run_test(|| { - let genesis = test_header(0); - - let invalid_authority_list = vec![(ALICE.into(), u64::MAX), (BOB.into(), u64::MAX)]; - let init_data = InitializationData { - header: Box::new(genesis), - authority_list: invalid_authority_list, - set_id: 1, - operating_mode: BasicOperatingMode::Normal, - }; - - assert_ok!(Pallet::::initialize(RuntimeOrigin::root(), init_data)); - - let header = test_header(1); - let justification = make_default_justification(&header); - - assert_err!( - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification, - ), - >::InvalidAuthoritySet - ); - }) - } - - #[test] - fn importing_header_ensures_that_chain_is_extended() { - run_test(|| { - initialize_substrate_bridge(); - - assert_ok!(submit_finality_proof(4)); - assert_err!(submit_finality_proof(3), Error::::OldHeader); - assert_ok!(submit_finality_proof(5)); - }) - } - - #[test] - fn importing_header_enacts_new_authority_set() { - run_test(|| { - initialize_substrate_bridge(); - - let next_set_id = 2; - let next_authorities = vec![(ALICE.into(), 1), (BOB.into(), 1)]; - - // Need to update the header digest to indicate that our header signals an authority set - // change. The change will be enacted when we import our header. - let mut header = test_header(2); - header.digest = change_log(0); - - // Create a valid justification for the header - let justification = make_default_justification(&header); - - // Let's import our test header - let result = Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header.clone()), - justification.clone(), - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::No); - - // Make sure that our header is the best finalized - assert_eq!(>::get().unwrap().1, header.hash()); - assert!(>::contains_key(header.hash())); - - // Make sure that the authority set actually changed upon importing our header - assert_eq!( - >::get(), - StoredAuthoritySet::::try_new(next_authorities, next_set_id) - .unwrap(), - ); - - // Here - assert_eq!( - System::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Grandpa(Event::UpdatedBestFinalizedHeader { - number: *header.number(), - hash: header.hash(), - grandpa_info: StoredHeaderGrandpaInfo { - finality_proof: justification.clone(), - new_verification_context: Some( - >::get().into() - ), - }, - }), - topics: vec![], - }], - ); - assert_eq!( - Pallet::::synced_headers_grandpa_info(), - vec![StoredHeaderGrandpaInfo { - finality_proof: justification, - new_verification_context: Some( - >::get().into() - ), - }] - ); - }) - } - - #[test] - fn relayer_pays_tx_fee_when_submitting_huge_mandatory_header() { - run_test(|| { - initialize_substrate_bridge(); - - // let's prepare a huge authorities change header, which is definitely above size limits - let mut header = test_header(2); - header.digest = change_log(0); - header.digest.push(DigestItem::Other(vec![42u8; 1024 * 1024])); - let justification = make_default_justification(&header); - - // without large digest item ^^^ the relayer would have paid zero transaction fee - // (`Pays::No`) - let result = Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header.clone()), - justification, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - - // Make sure that our header is the best finalized - assert_eq!(>::get().unwrap().1, header.hash()); - assert!(>::contains_key(header.hash())); - }) - } - - #[test] - fn relayer_pays_tx_fee_when_submitting_justification_with_long_ancestry_votes() { - run_test(|| { - initialize_substrate_bridge(); - - // let's prepare a huge authorities change header, which is definitely above weight - // limits - let mut header = test_header(2); - header.digest = change_log(0); - let justification = make_justification_for_header(JustificationGeneratorParams { - header: header.clone(), - ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1, - ..Default::default() - }); - - // without many headers in votes ancestries ^^^ the relayer would have paid zero - // transaction fee (`Pays::No`) - let result = Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header.clone()), - justification, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - - // Make sure that our header is the best finalized - assert_eq!(>::get().unwrap().1, header.hash()); - assert!(>::contains_key(header.hash())); - }) - } - - #[test] - fn importing_header_rejects_header_with_scheduled_change_delay() { - run_test(|| { - initialize_substrate_bridge(); - - // Need to update the header digest to indicate that our header signals an authority set - // change. However, the change doesn't happen until the next block. - let mut header = test_header(2); - header.digest = change_log(1); - - // Create a valid justification for the header - let justification = make_default_justification(&header); - - // Should not be allowed to import this header - assert_err!( - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification - ), - >::UnsupportedScheduledChange - ); - }) - } - - #[test] - fn importing_header_rejects_header_with_forced_changes() { - run_test(|| { - initialize_substrate_bridge(); - - // Need to update the header digest to indicate that it signals a forced authority set - // change. - let mut header = test_header(2); - header.digest = forced_change_log(0); - - // Create a valid justification for the header - let justification = make_default_justification(&header); - - // Should not be allowed to import this header - assert_err!( - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification - ), - >::UnsupportedScheduledChange - ); - }) - } - - #[test] - fn importing_header_rejects_header_with_too_many_authorities() { - run_test(|| { - initialize_substrate_bridge(); - - // Need to update the header digest to indicate that our header signals an authority set - // change. However, the change doesn't happen until the next block. - let mut header = test_header(2); - header.digest = many_authorities_log(); - - // Create a valid justification for the header - let justification = make_default_justification(&header); - - // Should not be allowed to import this header - assert_err!( - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification - ), - >::TooManyAuthoritiesInSet - ); - }); - } - - #[test] - fn parse_finalized_storage_proof_rejects_proof_on_unknown_header() { - run_test(|| { - assert_noop!( - Pallet::::storage_proof_checker(Default::default(), vec![],) - .map(|_| ()), - bp_header_chain::HeaderChainError::UnknownHeader, - ); - }); - } - - #[test] - fn parse_finalized_storage_accepts_valid_proof() { - run_test(|| { - let (state_root, storage_proof) = bp_runtime::craft_valid_storage_proof(); - - let mut header = test_header(2); - header.set_state_root(state_root); - - let hash = header.hash(); - >::put(HeaderId(2, hash)); - >::insert(hash, header.build()); - - assert_ok!( - Pallet::::storage_proof_checker(hash, storage_proof).map(|_| ()) - ); - }); - } - - #[test] - fn rate_limiter_disallows_free_imports_once_limit_is_hit_in_single_block() { - run_test(|| { - initialize_substrate_bridge(); - - let result = submit_mandatory_finality_proof(1, 1); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(2, 2); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(3, 3); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - }) - } - - #[test] - fn rate_limiter_invalid_requests_do_not_count_towards_request_count() { - run_test(|| { - let submit_invalid_request = || { - let mut header = test_header(1); - header.digest = change_log(0); - let mut invalid_justification = make_default_justification(&header); - invalid_justification.round = 42; - - Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - invalid_justification, - ) - }; - - initialize_substrate_bridge(); - - for _ in 0..::MaxFreeMandatoryHeadersPerBlock::get() + 1 { - assert_err!(submit_invalid_request(), >::InvalidJustification); - } - - // Can still submit free mandatory headers afterwards - let result = submit_mandatory_finality_proof(1, 1); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(2, 2); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(3, 3); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - }) - } - - #[test] - fn rate_limiter_allows_request_after_new_block_has_started() { - run_test(|| { - initialize_substrate_bridge(); - - let result = submit_mandatory_finality_proof(1, 1); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(2, 2); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(3, 3); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - - next_block(); - - let result = submit_mandatory_finality_proof(4, 4); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(5, 5); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_mandatory_finality_proof(6, 6); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - }) - } - - #[test] - fn rate_limiter_ignores_non_mandatory_headers() { - run_test(|| { - initialize_substrate_bridge(); - - let result = submit_finality_proof(1); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - - let result = submit_mandatory_finality_proof(2, 1); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_finality_proof_with_set_id(3, 2); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - - let result = submit_mandatory_finality_proof(4, 2); - assert_eq!(result.expect("call failed").pays_fee, Pays::No); - - let result = submit_finality_proof_with_set_id(5, 3); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - - let result = submit_mandatory_finality_proof(6, 3); - assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); - }) - } - - #[test] - fn should_prune_headers_over_headers_to_keep_parameter() { - run_test(|| { - initialize_substrate_bridge(); - assert_ok!(submit_finality_proof(1)); - let first_header_hash = Pallet::::best_finalized().unwrap().hash(); - next_block(); - - assert_ok!(submit_finality_proof(2)); - next_block(); - assert_ok!(submit_finality_proof(3)); - next_block(); - assert_ok!(submit_finality_proof(4)); - next_block(); - assert_ok!(submit_finality_proof(5)); - next_block(); - - assert_ok!(submit_finality_proof(6)); - - assert!( - !ImportedHeaders::::contains_key(first_header_hash), - "First header should be pruned.", - ); - }) - } - - #[test] - fn storage_keys_computed_properly() { - assert_eq!( - PalletOperatingMode::::storage_value_final_key().to_vec(), - bp_header_chain::storage_keys::pallet_operating_mode_key("Grandpa").0, - ); - - assert_eq!( - CurrentAuthoritySet::::storage_value_final_key().to_vec(), - bp_header_chain::storage_keys::current_authority_set_key("Grandpa").0, - ); - - assert_eq!( - BestFinalized::::storage_value_final_key().to_vec(), - bp_header_chain::storage_keys::best_finalized_key("Grandpa").0, - ); - } - - #[test] - fn test_bridge_grandpa_call_is_correctly_defined() { - let header = test_header(0); - let init_data = InitializationData { - header: Box::new(header.clone()), - authority_list: authority_list(), - set_id: 1, - operating_mode: BasicOperatingMode::Normal, - }; - let justification = make_default_justification(&header); - - let direct_initialize_call = - Call::::initialize { init_data: init_data.clone() }; - let indirect_initialize_call = BridgeGrandpaCall::::initialize { init_data }; - assert_eq!(direct_initialize_call.encode(), indirect_initialize_call.encode()); - - let direct_submit_finality_proof_call = Call::::submit_finality_proof { - finality_target: Box::new(header.clone()), - justification: justification.clone(), - }; - let indirect_submit_finality_proof_call = - BridgeGrandpaCall::::submit_finality_proof { - finality_target: Box::new(header), - justification, - }; - assert_eq!( - direct_submit_finality_proof_call.encode(), - indirect_submit_finality_proof_call.encode() - ); - } - - generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); - - #[test] - fn maybe_headers_to_keep_returns_correct_value() { - assert_eq!(MaybeHeadersToKeep::::get(), Some(mock::HeadersToKeep::get())); - } - - #[test] - fn submit_finality_proof_requires_signed_origin() { - run_test(|| { - initialize_substrate_bridge(); - - let header = test_header(1); - let justification = make_default_justification(&header); - - assert_noop!( - Pallet::::submit_finality_proof( - RuntimeOrigin::root(), - Box::new(header), - justification, - ), - DispatchError::BadOrigin, - ); - }) - } -} diff --git a/cumulus/bridges/modules/grandpa/src/mock.rs b/cumulus/bridges/modules/grandpa/src/mock.rs deleted file mode 100644 index bd305dfef9dc..000000000000 --- a/cumulus/bridges/modules/grandpa/src/mock.rs +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -// From construct_runtime macro -#![allow(clippy::from_over_into)] - -use bp_header_chain::ChainWithGrandpa; -use bp_runtime::Chain; -use frame_support::{ - construct_runtime, parameter_types, - traits::{ConstU32, ConstU64, Hooks}, - weights::Weight, -}; -use sp_core::sr25519::Signature; -use sp_runtime::{ - testing::H256, - traits::{BlakeTwo256, IdentityLookup}, - Perbill, -}; - -pub type AccountId = u64; -pub type TestHeader = sp_runtime::testing::Header; -pub type TestNumber = u64; - -type Block = frame_system::mocking::MockBlock; - -pub const MAX_BRIDGED_AUTHORITIES: u32 = 5; - -use crate as grandpa; - -construct_runtime! { - pub enum TestRuntime - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Grandpa: grandpa::{Pallet, Call, Event}, - } -} - -parameter_types! { - pub const MaximumBlockWeight: Weight = Weight::from_parts(1024, 0); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); -} - -impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type DbWeight = (); - type BlockWeights = (); - type BlockLength = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; -} - -parameter_types! { - pub const MaxFreeMandatoryHeadersPerBlock: u32 = 2; - pub const HeadersToKeep: u32 = 5; - pub const SessionLength: u64 = 5; - pub const NumValidators: u32 = 5; -} - -impl grandpa::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type BridgedChain = TestBridgedChain; - type MaxFreeMandatoryHeadersPerBlock = MaxFreeMandatoryHeadersPerBlock; - type HeadersToKeep = HeadersToKeep; - type WeightInfo = (); -} - -#[derive(Debug)] -pub struct TestBridgedChain; - -impl Chain for TestBridgedChain { - type BlockNumber = TestNumber; - type Hash = ::Hash; - type Hasher = ::Hashing; - type Header = TestHeader; - - type AccountId = AccountId; - type Balance = u64; - type Nonce = u64; - type Signature = Signature; - - fn max_extrinsic_size() -> u32 { - unreachable!() - } - fn max_extrinsic_weight() -> Weight { - unreachable!() - } -} - -impl ChainWithGrandpa for TestBridgedChain { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; - const MAX_AUTHORITIES_COUNT: u32 = MAX_BRIDGED_AUTHORITIES; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; - const MAX_HEADER_SIZE: u32 = 256; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; -} - -/// Return test externalities to use in tests. -pub fn new_test_ext() -> sp_io::TestExternalities { - sp_io::TestExternalities::new(Default::default()) -} - -/// Return test within default test externalities context. -pub fn run_test(test: impl FnOnce() -> T) -> T { - new_test_ext().execute_with(|| { - let _ = Grandpa::on_initialize(0); - test() - }) -} - -/// Return test header with given number. -pub fn test_header(num: TestNumber) -> TestHeader { - // We wrap the call to avoid explicit type annotations in our tests - bp_test_utils::test_header(num) -} diff --git a/cumulus/bridges/modules/grandpa/src/storage_types.rs b/cumulus/bridges/modules/grandpa/src/storage_types.rs deleted file mode 100644 index 59fcb5d3f077..000000000000 --- a/cumulus/bridges/modules/grandpa/src/storage_types.rs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Wrappers for public types that are implementing `MaxEncodedLen` - -use crate::{Config, Error}; - -use bp_header_chain::{AuthoritySet, ChainWithGrandpa}; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{traits::Get, BoundedVec, CloneNoBound, RuntimeDebugNoBound}; -use scale_info::TypeInfo; -use sp_consensus_grandpa::{AuthorityId, AuthorityList, AuthorityWeight, SetId}; -use sp_std::marker::PhantomData; - -/// A bounded list of Grandpa authorities with associated weights. -pub type StoredAuthorityList = - BoundedVec<(AuthorityId, AuthorityWeight), MaxBridgedAuthorities>; - -/// Adapter for using `T::BridgedChain::MAX_BRIDGED_AUTHORITIES` in `BoundedVec`. -pub struct StoredAuthorityListLimit(PhantomData<(T, I)>); - -impl, I: 'static> Get for StoredAuthorityListLimit { - fn get() -> u32 { - T::BridgedChain::MAX_AUTHORITIES_COUNT - } -} - -/// A bounded GRANDPA Authority List and ID. -#[derive(CloneNoBound, Decode, Encode, Eq, TypeInfo, MaxEncodedLen, RuntimeDebugNoBound)] -#[scale_info(skip_type_params(T, I))] -pub struct StoredAuthoritySet, I: 'static> { - /// List of GRANDPA authorities for the current round. - pub authorities: StoredAuthorityList>, - /// Monotonic identifier of the current GRANDPA authority set. - pub set_id: SetId, -} - -impl, I: 'static> StoredAuthoritySet { - /// Try to create a new bounded GRANDPA Authority Set from unbounded list. - /// - /// Returns error if number of authorities in the provided list is too large. - pub fn try_new(authorities: AuthorityList, set_id: SetId) -> Result> { - Ok(Self { - authorities: TryFrom::try_from(authorities) - .map_err(|_| Error::TooManyAuthoritiesInSet)?, - set_id, - }) - } - - /// Returns number of bytes that may be subtracted from the PoV component of - /// `submit_finality_proof` call, because the actual authorities set is smaller than the maximal - /// configured. - /// - /// Maximal authorities set size is configured by the `MaxBridgedAuthorities` constant from - /// the pallet configuration. The PoV of the call includes the size of maximal authorities - /// count. If the actual size is smaller, we may subtract extra bytes from this component. - pub fn unused_proof_size(&self) -> u64 { - // we can only safely estimate bytes that are occupied by the authority data itself. We have - // no means here to compute PoV bytes, occupied by extra trie nodes or extra bytes in the - // whole set encoding - let single_authority_max_encoded_len = - <(AuthorityId, AuthorityWeight)>::max_encoded_len() as u64; - let extra_authorities = - T::BridgedChain::MAX_AUTHORITIES_COUNT.saturating_sub(self.authorities.len() as _); - single_authority_max_encoded_len.saturating_mul(extra_authorities as u64) - } -} - -impl, I: 'static> PartialEq for StoredAuthoritySet { - fn eq(&self, other: &Self) -> bool { - self.set_id == other.set_id && self.authorities == other.authorities - } -} - -impl, I: 'static> Default for StoredAuthoritySet { - fn default() -> Self { - StoredAuthoritySet { authorities: BoundedVec::default(), set_id: 0 } - } -} - -impl, I: 'static> From> for AuthoritySet { - fn from(t: StoredAuthoritySet) -> Self { - AuthoritySet { authorities: t.authorities.into(), set_id: t.set_id } - } -} - -#[cfg(test)] -mod tests { - use crate::mock::{TestRuntime, MAX_BRIDGED_AUTHORITIES}; - use bp_test_utils::authority_list; - - type StoredAuthoritySet = super::StoredAuthoritySet; - - #[test] - fn unused_proof_size_works() { - let authority_entry = authority_list().pop().unwrap(); - - // when we have exactly `MaxBridgedAuthorities` authorities - assert_eq!( - StoredAuthoritySet::try_new( - vec![authority_entry.clone(); MAX_BRIDGED_AUTHORITIES as usize], - 0, - ) - .unwrap() - .unused_proof_size(), - 0, - ); - - // when we have less than `MaxBridgedAuthorities` authorities - assert_eq!( - StoredAuthoritySet::try_new( - vec![authority_entry; MAX_BRIDGED_AUTHORITIES as usize - 1], - 0, - ) - .unwrap() - .unused_proof_size(), - 40, - ); - - // and we can't have more than `MaxBridgedAuthorities` authorities in the bounded vec, so - // no test for this case - } -} diff --git a/cumulus/bridges/modules/grandpa/src/weights.rs b/cumulus/bridges/modules/grandpa/src/weights.rs deleted file mode 100644 index 4b94f7adfe73..000000000000 --- a/cumulus/bridges/modules/grandpa/src/weights.rs +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Autogenerated weights for pallet_bridge_grandpa -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 - -// Executed Command: -// target/release/millau-bridge-node -// benchmark -// pallet -// --chain=dev -// --steps=50 -// --repeat=20 -// --pallet=pallet_bridge_grandpa -// --extrinsic=* -// --execution=wasm -// --wasm-execution=Compiled -// --heap-pages=4096 -// --output=./modules/grandpa/src/weights.rs -// --template=./.maintain/bridge-weight-template.hbs - -#![allow(clippy::all)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_bridge_grandpa. -pub trait WeightInfo { - fn submit_finality_proof(p: u32, v: u32) -> Weight; -} - -/// Weights for `pallet_bridge_grandpa` that are generated using one of the Bridge testnets. -/// -/// Those weights are test only and must never be used in production. -pub struct BridgeWeight(PhantomData); -impl WeightInfo for BridgeWeight { - /// Storage: BridgeRialtoGrandpa PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa RequestCount (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa RequestCount (max_values: Some(1), max_size: Some(4), added: 499, - /// mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa BestFinalized (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: - /// 531, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa CurrentAuthoritySet (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(209), - /// added: 704, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHashesPointer (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), - /// added: 499, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa ImportedHashes (max_values: Some(14400), max_size: Some(36), - /// added: 2016, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:0 w:2) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// The range of component `p` is `[1, 4]`. - /// - /// The range of component `v` is `[50, 100]`. - fn submit_finality_proof(p: u32, v: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `394 + p * (60 ±0)` - // Estimated: `4745` - // Minimum execution time: 228_072 nanoseconds. - Weight::from_parts(57_853_228, 4745) - // Standard Error: 149_421 - .saturating_add(Weight::from_parts(36_708_702, 0).saturating_mul(p.into())) - // Standard Error: 10_625 - .saturating_add(Weight::from_parts(1_469_032, 0).saturating_mul(v.into())) - .saturating_add(T::DbWeight::get().reads(6_u64)) - .saturating_add(T::DbWeight::get().writes(6_u64)) - } -} - -// For backwards compatibility and tests -impl WeightInfo for () { - /// Storage: BridgeRialtoGrandpa PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa RequestCount (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa RequestCount (max_values: Some(1), max_size: Some(4), added: 499, - /// mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa BestFinalized (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: - /// 531, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa CurrentAuthoritySet (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(209), - /// added: 704, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHashesPointer (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), - /// added: 499, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoGrandpa ImportedHashes (max_values: Some(14400), max_size: Some(36), - /// added: 2016, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:0 w:2) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// The range of component `p` is `[1, 4]`. - /// - /// The range of component `v` is `[50, 100]`. - fn submit_finality_proof(p: u32, v: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `394 + p * (60 ±0)` - // Estimated: `4745` - // Minimum execution time: 228_072 nanoseconds. - Weight::from_parts(57_853_228, 4745) - // Standard Error: 149_421 - .saturating_add(Weight::from_parts(36_708_702, 0).saturating_mul(p.into())) - // Standard Error: 10_625 - .saturating_add(Weight::from_parts(1_469_032, 0).saturating_mul(v.into())) - .saturating_add(RocksDbWeight::get().reads(6_u64)) - .saturating_add(RocksDbWeight::get().writes(6_u64)) - } -} diff --git a/cumulus/bridges/modules/messages/Cargo.toml b/cumulus/bridges/modules/messages/Cargo.toml deleted file mode 100644 index 8db52acefc0b..000000000000 --- a/cumulus/bridges/modules/messages/Cargo.toml +++ /dev/null @@ -1,56 +0,0 @@ -[package] -name = "pallet-bridge-messages" -description = "Module that allows bridged chains to exchange messages using lane concept." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } -num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Bridge dependencies - -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } - -# Substrate Dependencies - -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[dev-dependencies] -bp-test-utils = { path = "../../primitives/test-utils" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "bp-messages/std", - "bp-runtime/std", - "codec/std", - "frame-support/std", - "frame-system/std", - "frame-benchmarking/std", - "log/std", - "num-traits/std", - "scale-info/std", - "sp-core/std", - "sp-runtime/std", - "sp-std/std", -] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", -] -try-runtime = [ - "frame-support/try-runtime", - "frame-system/try-runtime", -] diff --git a/cumulus/bridges/modules/messages/README.md b/cumulus/bridges/modules/messages/README.md deleted file mode 100644 index b5250d0dca0b..000000000000 --- a/cumulus/bridges/modules/messages/README.md +++ /dev/null @@ -1,242 +0,0 @@ -# Bridge Messages Pallet - -The messages pallet is used to deliver messages from source chain to target chain. Message is -(almost) opaque to the module and the final goal is to hand message to the message dispatch -mechanism. - -## Contents - -- [Overview](#overview) -- [Message Workflow](#message-workflow) -- [Integrating Message Lane Module into Runtime](#integrating-messages-module-into-runtime) -- [Non-Essential Functionality](#non-essential-functionality) -- [Weights of Module Extrinsics](#weights-of-module-extrinsics) - -## Overview - -Message lane is an unidirectional channel, where messages are sent from source chain to the target -chain. At the same time, a single instance of messages module supports both outbound lanes and -inbound lanes. So the chain where the module is deployed (this chain), may act as a source chain for -outbound messages (heading to a bridged chain) and as a target chain for inbound messages (coming -from a bridged chain). - -Messages module supports multiple message lanes. Every message lane is identified with a 4-byte -identifier. Messages sent through the lane are assigned unique (for this lane) increasing integer -value that is known as nonce ("number that can only be used once"). Messages that are sent over the -same lane are guaranteed to be delivered to the target chain in the same order they're sent from -the source chain. In other words, message with nonce `N` will be delivered right before delivering a -message with nonce `N+1`. - -Single message lane may be seen as a transport channel for single application (onchain, offchain or -mixed). At the same time the module itself never dictates any lane or message rules. In the end, it -is the runtime developer who defines what message lane and message mean for this runtime. - -In our [Kusama<>Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md) we are using lane -as a channel of communication between two parachains of different relay chains. For example, lane -`[0, 0, 0, 0]` is used for Polkadot <> Kusama Asset Hub communications. Other lanes may be used to -bridge other parachains. - -## Message Workflow - -The pallet is not intended to be used by end users and provides no public calls to send the message. -Instead, it provides runtime-internal method that allows other pallets (or other runtime code) to queue -outbound messages. - -The message "appears" when some runtime code calls the `send_message()` method of the pallet. -The submitter specifies the lane that they're willing to use and the message itself. If some fee must -be paid for sending the message, it must be paid outside of the pallet. If a message passes all checks -(that include, for example, message size check, disabled lane check, ...), the nonce is assigned and -the message is stored in the module storage. The message is in an "undelivered" state now. - -We assume that there are external, offchain actors, called relayers, that are submitting module -related transactions to both target and source chains. The pallet itself has no assumptions about -relayers incentivization scheme, but it has some callbacks for paying rewards. See -[Integrating Messages Module into runtime](#Integrating-Messages-Module-into-runtime) -for details. - -Eventually, some relayer would notice this message in the "undelivered" state and it would decide to -deliver this message. Relayer then crafts `receive_messages_proof()` transaction (aka delivery -transaction) for the messages module instance, deployed at the target chain. Relayer provides -its account id at the source chain, the proof of message (or several messages), the number of -messages in the transaction and their cumulative dispatch weight. Once a transaction is mined, the -message is considered "delivered". - -Once a message is delivered, the relayer may want to confirm delivery back to the source chain. -There are two reasons why it would want to do that. The first is that we intentionally limit number -of "delivered", but not yet "confirmed" messages at inbound lanes -(see [What about other Constants in the Messages Module Configuration Trait](#What-about-other-Constants-in-the-Messages-Module-Configuration-Trait) for explanation). -So at some point, the target chain may stop accepting new messages until relayers confirm some of -these. The second is that if the relayer wants to be rewarded for delivery, it must prove the fact -that it has actually delivered the message. And this proof may only be generated after the delivery -transaction is mined. So relayer crafts the `receive_messages_delivery_proof()` transaction (aka -confirmation transaction) for the messages module instance, deployed at the source chain. Once -this transaction is mined, the message is considered "confirmed". - -The "confirmed" state is the final state of the message. But there's one last thing related to the -message - the fact that it is now "confirmed" and reward has been paid to the relayer (or at least -callback for this has been called), must be confirmed to the target chain. Otherwise, we may reach -the limit of "unconfirmed" messages at the target chain and it will stop accepting new messages. So -relayer sometimes includes a nonce of the latest "confirmed" message in the next -`receive_messages_proof()` transaction, proving that some messages have been confirmed. - -## Integrating Messages Module into Runtime - -As it has been said above, the messages module supports both outbound and inbound message lanes. -So if we will integrate a module in some runtime, it may act as the source chain runtime for -outbound messages and as the target chain runtime for inbound messages. In this section, we'll -sometimes refer to the chain we're currently integrating with, as "this chain" and the other -chain as "bridged chain". - -Messages module doesn't simply accept transactions that are claiming that the bridged chain has -some updated data for us. Instead of this, the module assumes that the bridged chain is able to -prove that updated data in some way. The proof is abstracted from the module and may be of any kind. -In our Substrate-to-Substrate bridge we're using runtime storage proofs. Other bridges may use -transaction proofs, Substrate header digests or anything else that may be proved. - -**IMPORTANT NOTE**: everything below in this chapter describes details of the messages module -configuration. But if you're interested in well-probed and relatively easy integration of two -Substrate-based chains, you may want to look at the -[bridge-runtime-common](../../bin/runtime-common/) crate. This crate is providing a lot of -helpers for integration, which may be directly used from within your runtime. Then if you'll decide -to change something in this scheme, get back here for detailed information. - -### General Information - -The messages module supports instances. Every module instance is supposed to bridge this chain -and some bridged chain. To bridge with another chain, using another instance is suggested (this -isn't forced anywhere in the code, though). Keep in mind, that the pallet may be used to build -virtual channels between multiple chains, as we do in our [Polkadot <> Kusama bridge](../../docs/polkadot-kusama-bridge-overview.md). -There, the pallet actually bridges only two parachains - Kusama Bridge Hub and Polkadot -Bridge Hub. However, other Kusama and Polkadot parachains are able to send (XCM) messages to their -Bridge Hubs. The messages will be delivered to the other side of the bridge and routed to the proper -destination parachain within the bridged chain consensus. - -Message submitters may track message progress by inspecting module events. When Message is accepted, -the `MessageAccepted` event is emitted. The event contains both message lane identifier and nonce that -has been assigned to the message. When a message is delivered to the target chain, the `MessagesDelivered` -event is emitted from the `receive_messages_delivery_proof()` transaction. The `MessagesDelivered` contains -the message lane identifier and inclusive range of delivered message nonces. - -The pallet provides no means to get the result of message dispatch at the target chain. If that is -required, it must be done outside of the pallet. For example, XCM messages, when dispatched, have -special instructions to send some data back to the sender. Other dispatchers may use similar -mechanism for that. -### How to plug-in Messages Module to Send Messages to the Bridged Chain? - -The `pallet_bridge_messages::Config` trait has 3 main associated types that are used to work with -outbound messages. The `pallet_bridge_messages::Config::TargetHeaderChain` defines how we see the -bridged chain as the target for our outbound messages. It must be able to check that the bridged -chain may accept our message - like that the message has size below maximal possible transaction -size of the chain and so on. And when the relayer sends us a confirmation transaction, this -implementation must be able to parse and verify the proof of messages delivery. Normally, you would -reuse the same (configurable) type on all chains that are sending messages to the same bridged -chain. - -The `pallet_bridge_messages::Config::LaneMessageVerifier` defines a single callback to verify outbound -messages. The simplest callback may just accept all messages. But in this case you'll need to answer -many questions first. Who will pay for the delivery and confirmation transaction? Are we sure that -someone will ever deliver this message to the bridged chain? Are we sure that we don't bloat our -runtime storage by accepting this message? What if the message is improperly encoded or has some -fields set to invalid values? Answering all those (and similar) questions would lead to correct -implementation. - -There's another thing to consider when implementing type for use in -`pallet_bridge_messages::Config::LaneMessageVerifier`. It is whether we treat all message lanes -identically, or they'll have different sets of verification rules? For example, you may reserve -lane#1 for messages coming from some 'wrapped-token' pallet - then you may verify in your -implementation that the origin is associated with this pallet. Lane#2 may be reserved for 'system' -messages and you may charge zero fee for such messages. You may have some rate limiting for messages -sent over the lane#3. Or you may just verify the same rules set for all outbound messages - it is -all up to the `pallet_bridge_messages::Config::LaneMessageVerifier` implementation. - -The last type is the `pallet_bridge_messages::Config::DeliveryConfirmationPayments`. When confirmation -transaction is received, we call the `pay_reward()` method, passing the range of delivered messages. -You may use the [`pallet-bridge-relayers`](../relayers/) pallet and its -[`DeliveryConfirmationPaymentsAdapter`](../relayers/src/payment_adapter.rs) adapter as a possible -implementation. It allows you to pay fixed reward for relaying the message and some of its portion -for confirming delivery. - -### I have a Messages Module in my Runtime, but I Want to Reject all Outbound Messages. What shall I do? - -You should be looking at the `bp_messages::source_chain::ForbidOutboundMessages` structure -[`bp_messages::source_chain`](../../primitives/messages/src/source_chain.rs). It implements -all required traits and will simply reject all transactions, related to outbound messages. - -### How to plug-in Messages Module to Receive Messages from the Bridged Chain? - -The `pallet_bridge_messages::Config` trait has 2 main associated types that are used to work with -inbound messages. The `pallet_bridge_messages::Config::SourceHeaderChain` defines how we see the -bridged chain as the source of our inbound messages. When relayer sends us a delivery transaction, -this implementation must be able to parse and verify the proof of messages wrapped in this -transaction. Normally, you would reuse the same (configurable) type on all chains that are sending -messages to the same bridged chain. - -The `pallet_bridge_messages::Config::MessageDispatch` defines a way on how to dispatch delivered -messages. Apart from actually dispatching the message, the implementation must return the correct -dispatch weight of the message before dispatch is called. - -### I have a Messages Module in my Runtime, but I Want to Reject all Inbound Messages. What shall I do? - -You should be looking at the `bp_messages::target_chain::ForbidInboundMessages` structure from -the [`bp_messages::target_chain`](../../primitives/messages/src/target_chain.rs) module. It -implements all required traits and will simply reject all transactions, related to inbound messages. - -### What about other Constants in the Messages Module Configuration Trait? - -Two settings that are used to check messages in the `send_message()` function. The -`pallet_bridge_messages::Config::ActiveOutboundLanes` is an array of all message lanes, that -may be used to send messages. All messages sent using other lanes are rejected. All messages that have -size above `pallet_bridge_messages::Config::MaximalOutboundPayloadSize` will also be rejected. - -To be able to reward the relayer for delivering messages, we store a map of message nonces range => -identifier of the relayer that has delivered this range at the target chain runtime storage. If a -relayer delivers multiple consequent ranges, they're merged into single entry. So there may be more -than one entry for the same relayer. Eventually, this whole map must be delivered back to the source -chain to confirm delivery and pay rewards. So to make sure we are able to craft this confirmation -transaction, we need to: (1) keep the size of this map below a certain limit and (2) make sure that -the weight of processing this map is below a certain limit. Both size and processing weight mostly -depend on the number of entries. The number of entries is limited with the -`pallet_bridge_messages::ConfigMaxUnrewardedRelayerEntriesAtInboundLane` parameter. Processing weight -also depends on the total number of messages that are being confirmed, because every confirmed -message needs to be read. So there's another -`pallet_bridge_messages::Config::MaxUnconfirmedMessagesAtInboundLane` parameter for that. - -When choosing values for these parameters, you must also keep in mind that if proof in your scheme -is based on finality of headers (and it is the most obvious option for Substrate-based chains with -finality notion), then choosing too small values for these parameters may cause significant delays -in message delivery. That's because there are too many actors involved in this scheme: 1) authorities -that are finalizing headers of the target chain need to finalize header with non-empty map; 2) the -headers relayer then needs to submit this header and its finality proof to the source chain; 3) the -messages relayer must then send confirmation transaction (storage proof of this map) to the source -chain; 4) when the confirmation transaction will be mined at some header, source chain authorities -must finalize this header; 5) the headers relay then needs to submit this header and its finality -proof to the target chain; 6) only now the messages relayer may submit new messages from the source -to target chain and prune the entry from the map. - -Delivery transaction requires the relayer to provide both number of entries and total number of -messages in the map. This means that the module never charges an extra cost for delivering a map - -the relayer would need to pay exactly for the number of entries+messages it has delivered. So the -best guess for values of these parameters would be the pair that would occupy `N` percent of the -maximal transaction size and weight of the source chain. The `N` should be large enough to process -large maps, at the same time keeping reserve for future source chain upgrades. - -## Non-Essential Functionality - -There may be a special account in every runtime where the messages module is deployed. This -account, named 'module owner', is like a module-level sudo account - he's able to halt and -resume all module operations without requiring runtime upgrade. Calls that are related to this -account are: -- `fn set_owner()`: current module owner may call it to transfer "ownership" to another account; -- `fn halt_operations()`: the module owner (or sudo account) may call this function to stop all - module operations. After this call, all message-related transactions will be rejected until - further `resume_operations` call'. This call may be used when something extraordinary happens with - the bridge; -- `fn resume_operations()`: module owner may call this function to resume bridge operations. The - module will resume its regular operations after this call. - -If pallet owner is not defined, the governance may be used to make those calls. - -## Messages Relay - -We have an offchain actor, who is watching for new messages and submits them to the bridged chain. -It is the messages relay - you may look at the [crate level documentation and the code](../../relays/messages/). diff --git a/cumulus/bridges/modules/messages/src/benchmarking.rs b/cumulus/bridges/modules/messages/src/benchmarking.rs deleted file mode 100644 index 04f64b53b305..000000000000 --- a/cumulus/bridges/modules/messages/src/benchmarking.rs +++ /dev/null @@ -1,461 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Messages pallet benchmarking. - -use crate::{ - inbound_lane::InboundLaneStorage, outbound_lane, weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH, - Call, OutboundLanes, RuntimeInboundLaneStorage, -}; - -use bp_messages::{ - source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, DeliveredMessages, - InboundLaneData, LaneId, MessageNonce, OutboundLaneData, UnrewardedRelayer, - UnrewardedRelayersState, -}; -use bp_runtime::StorageProofSize; -use codec::Decode; -use frame_benchmarking::{account, benchmarks_instance_pallet}; -use frame_support::weights::Weight; -use frame_system::RawOrigin; -use sp_runtime::traits::TrailingZeroInput; -use sp_std::{ops::RangeInclusive, prelude::*}; - -const SEED: u32 = 0; - -/// Pallet we're benchmarking here. -pub struct Pallet, I: 'static = ()>(crate::Pallet); - -/// Benchmark-specific message proof parameters. -#[derive(Debug)] -pub struct MessageProofParams { - /// Id of the lane. - pub lane: LaneId, - /// Range of messages to include in the proof. - pub message_nonces: RangeInclusive, - /// If `Some`, the proof needs to include this outbound lane data. - pub outbound_lane_data: Option, - /// If `true`, the caller expects that the proof will contain correct messages that will - /// be successfully dispatched. This is only called from the "optional" - /// `receive_single_message_proof_with_dispatch` benchmark. If you don't need it, just - /// return `true` from the `is_message_successfully_dispatched`. - pub is_successful_dispatch_expected: bool, - /// Proof size requirements. - pub size: StorageProofSize, -} - -/// Benchmark-specific message delivery proof parameters. -#[derive(Debug)] -pub struct MessageDeliveryProofParams { - /// Id of the lane. - pub lane: LaneId, - /// The proof needs to include this inbound lane data. - pub inbound_lane_data: InboundLaneData, - /// Proof size requirements. - pub size: StorageProofSize, -} - -/// Trait that must be implemented by runtime. -pub trait Config: crate::Config { - /// Lane id to use in benchmarks. - /// - /// By default, lane 00000000 is used. - fn bench_lane_id() -> LaneId { - LaneId([0, 0, 0, 0]) - } - - /// Return id of relayer account at the bridged chain. - /// - /// By default, zero account is returned. - fn bridged_relayer_id() -> Self::InboundRelayer { - Self::InboundRelayer::decode(&mut TrailingZeroInput::zeroes()).unwrap() - } - - /// Create given account and give it enough balance for test purposes. Used to create - /// relayer account at the target chain. Is strictly necessary when your rewards scheme - /// assumes that the relayer account must exist. - /// - /// Does nothing by default. - fn endow_account(_account: &Self::AccountId) {} - - /// Prepare messages proof to receive by the module. - fn prepare_message_proof( - params: MessageProofParams, - ) -> (::MessagesProof, Weight); - /// Prepare messages delivery proof to receive by the module. - fn prepare_message_delivery_proof( - params: MessageDeliveryProofParams, - ) -> >::MessagesDeliveryProof; - - /// Returns true if message has been successfully dispatched or not. - fn is_message_successfully_dispatched(_nonce: MessageNonce) -> bool { - true - } - - /// Returns true if given relayer has been rewarded for some of its actions. - fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool; -} - -benchmarks_instance_pallet! { - // - // Benchmarks that are used directly by the runtime calls weight formulae. - // - - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: - // * proof does not include outbound lane state proof; - // * inbound lane already has state, so it needs to be read and decoded; - // * message is dispatched (reminder: dispatch weight should be minimal); - // * message requires all heavy checks done by dispatcher. - // - // This is base benchmark for all other message delivery benchmarks. - receive_single_message_proof { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - - let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { - lane: T::bench_lane_id(), - message_nonces: 21..=21, - outbound_lane_data: None, - is_successful_dispatch_expected: false, - size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), - }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, - ); - } - - // Benchmark `receive_messages_proof` extrinsic with two minimal-weight messages and following conditions: - // * proof does not include outbound lane state proof; - // * inbound lane already has state, so it needs to be read and decoded; - // * message is dispatched (reminder: dispatch weight should be minimal); - // * message requires all heavy checks done by dispatcher. - // - // The weight of single message delivery could be approximated as - // `weight(receive_two_messages_proof) - weight(receive_single_message_proof)`. - // This won't be super-accurate if message has non-zero dispatch weight, but estimation should - // be close enough to real weight. - receive_two_messages_proof { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - - let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { - lane: T::bench_lane_id(), - message_nonces: 21..=22, - outbound_lane_data: None, - is_successful_dispatch_expected: false, - size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), - }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 2, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 22, - ); - } - - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: - // * proof includes outbound lane state proof; - // * inbound lane already has state, so it needs to be read and decoded; - // * message is successfully dispatched (reminder: dispatch weight should be minimal); - // * message requires all heavy checks done by dispatcher. - // - // The weight of outbound lane state delivery would be - // `weight(receive_single_message_proof_with_outbound_lane_state) - weight(receive_single_message_proof)`. - // This won't be super-accurate if message has non-zero dispatch weight, but estimation should - // be close enough to real weight. - receive_single_message_proof_with_outbound_lane_state { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - - let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { - lane: T::bench_lane_id(), - message_nonces: 21..=21, - outbound_lane_data: Some(OutboundLaneData { - oldest_unpruned_nonce: 21, - latest_received_nonce: 20, - latest_generated_nonce: 21, - }), - is_successful_dispatch_expected: false, - size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), - }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - let lane_state = crate::InboundLanes::::get(&T::bench_lane_id()); - assert_eq!(lane_state.last_delivered_nonce(), 21); - assert_eq!(lane_state.last_confirmed_nonce, 20); - } - - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: - // * the proof has large leaf with total size of approximately 1KB; - // * proof does not include outbound lane state proof; - // * inbound lane already has state, so it needs to be read and decoded; - // * message is dispatched (reminder: dispatch weight should be minimal); - // * message requires all heavy checks done by dispatcher. - // - // With single KB of messages proof, the weight of the call is increased (roughly) by - // `(receive_single_message_proof_16KB - receive_single_message_proof_1_kb) / 15`. - receive_single_message_proof_1_kb { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - - let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { - lane: T::bench_lane_id(), - message_nonces: 21..=21, - outbound_lane_data: None, - is_successful_dispatch_expected: false, - size: StorageProofSize::HasLargeLeaf(1024), - }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, - ); - } - - // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: - // * the proof has large leaf with total size of approximately 16KB; - // * proof does not include outbound lane state proof; - // * inbound lane already has state, so it needs to be read and decoded; - // * message is dispatched (reminder: dispatch weight should be minimal); - // * message requires all heavy checks done by dispatcher. - // - // Size of proof grows because it contains extra trie nodes in it. - // - // With single KB of messages proof, the weight of the call is increased (roughly) by - // `(receive_single_message_proof_16KB - receive_single_message_proof) / 15`. - receive_single_message_proof_16_kb { - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - - let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { - lane: T::bench_lane_id(), - message_nonces: 21..=21, - outbound_lane_data: None, - is_successful_dispatch_expected: false, - size: StorageProofSize::HasLargeLeaf(16 * 1024), - }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, - ); - } - - // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: - // * single relayer is rewarded for relaying single message; - // * relayer account does not exist (in practice it needs to exist in production environment). - // - // This is base benchmark for all other confirmations delivery benchmarks. - receive_delivery_proof_for_single_message { - let relayer_id: T::AccountId = account("relayer", 0, SEED); - - // send message that we're going to confirm - send_regular_message::(); - - let relayers_state = UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }; - let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { - lane: T::bench_lane_id(), - inbound_lane_data: InboundLaneData { - relayers: vec![UnrewardedRelayer { - relayer: relayer_id.clone(), - messages: DeliveredMessages::new(1), - }].into_iter().collect(), - last_confirmed_nonce: 0, - }, - size: StorageProofSize::Minimal(0), - }); - }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) - verify { - assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 1); - assert!(T::is_relayer_rewarded(&relayer_id)); - } - - // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: - // * single relayer is rewarded for relaying two messages; - // * relayer account does not exist (in practice it needs to exist in production environment). - // - // Additional weight for paying single-message reward to the same relayer could be computed - // as `weight(receive_delivery_proof_for_two_messages_by_single_relayer) - // - weight(receive_delivery_proof_for_single_message)`. - receive_delivery_proof_for_two_messages_by_single_relayer { - let relayer_id: T::AccountId = account("relayer", 0, SEED); - - // send message that we're going to confirm - send_regular_message::(); - send_regular_message::(); - - let relayers_state = UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 2, - total_messages: 2, - last_delivered_nonce: 2, - }; - let mut delivered_messages = DeliveredMessages::new(1); - delivered_messages.note_dispatched_message(); - let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { - lane: T::bench_lane_id(), - inbound_lane_data: InboundLaneData { - relayers: vec![UnrewardedRelayer { - relayer: relayer_id.clone(), - messages: delivered_messages, - }].into_iter().collect(), - last_confirmed_nonce: 0, - }, - size: StorageProofSize::Minimal(0), - }); - }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) - verify { - assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); - assert!(T::is_relayer_rewarded(&relayer_id)); - } - - // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: - // * two relayers are rewarded for relaying single message each; - // * relayer account does not exist (in practice it needs to exist in production environment). - // - // Additional weight for paying reward to the next relayer could be computed - // as `weight(receive_delivery_proof_for_two_messages_by_two_relayers) - // - weight(receive_delivery_proof_for_two_messages_by_single_relayer)`. - receive_delivery_proof_for_two_messages_by_two_relayers { - let relayer1_id: T::AccountId = account("relayer1", 1, SEED); - let relayer2_id: T::AccountId = account("relayer2", 2, SEED); - - // send message that we're going to confirm - send_regular_message::(); - send_regular_message::(); - - let relayers_state = UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - messages_in_oldest_entry: 1, - total_messages: 2, - last_delivered_nonce: 2, - }; - let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { - lane: T::bench_lane_id(), - inbound_lane_data: InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: relayer1_id.clone(), - messages: DeliveredMessages::new(1), - }, - UnrewardedRelayer { - relayer: relayer2_id.clone(), - messages: DeliveredMessages::new(2), - }, - ].into_iter().collect(), - last_confirmed_nonce: 0, - }, - size: StorageProofSize::Minimal(0), - }); - }: receive_messages_delivery_proof(RawOrigin::Signed(relayer1_id.clone()), proof, relayers_state) - verify { - assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); - assert!(T::is_relayer_rewarded(&relayer1_id)); - assert!(T::is_relayer_rewarded(&relayer2_id)); - } - - // - // Benchmarks that the runtime developers may use for proper pallet configuration. - // - - // This benchmark is optional and may be used when runtime developer need a way to compute - // message dispatch weight. In this case, he needs to provide messages that can go the whole - // dispatch - // - // Benchmark `receive_messages_proof` extrinsic with single message and following conditions: - // - // * proof does not include outbound lane state proof; - // * inbound lane already has state, so it needs to be read and decoded; - // * message is **SUCCESSFULLY** dispatched; - // * message requires all heavy checks done by dispatcher. - receive_single_message_proof_with_dispatch { - // maybe dispatch weight relies on the message size too? - let i in EXPECTED_DEFAULT_MESSAGE_LENGTH .. EXPECTED_DEFAULT_MESSAGE_LENGTH * 16; - - let relayer_id_on_source = T::bridged_relayer_id(); - let relayer_id_on_target = account("relayer", 0, SEED); - T::endow_account(&relayer_id_on_target); - - // mark messages 1..=20 as delivered - receive_messages::(20); - - let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { - lane: T::bench_lane_id(), - message_nonces: 21..=21, - outbound_lane_data: None, - is_successful_dispatch_expected: true, - size: StorageProofSize::Minimal(i), - }); - }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) - verify { - assert_eq!( - crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), - 21, - ); - assert!(T::is_message_successfully_dispatched(21)); - } - - impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) -} - -fn send_regular_message, I: 'static>() { - let mut outbound_lane = outbound_lane::(T::bench_lane_id()); - outbound_lane.send_message(vec![]).expect("We craft valid messages"); -} - -fn receive_messages, I: 'static>(nonce: MessageNonce) { - let mut inbound_lane_storage = - RuntimeInboundLaneStorage::::from_lane_id(T::bench_lane_id()); - inbound_lane_storage.set_data(InboundLaneData { - relayers: vec![UnrewardedRelayer { - relayer: T::bridged_relayer_id(), - messages: DeliveredMessages::new(nonce), - }] - .into_iter() - .collect(), - last_confirmed_nonce: 0, - }); -} diff --git a/cumulus/bridges/modules/messages/src/lib.rs b/cumulus/bridges/modules/messages/src/lib.rs deleted file mode 100644 index 67c6fb23cf16..000000000000 --- a/cumulus/bridges/modules/messages/src/lib.rs +++ /dev/null @@ -1,2128 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Runtime module that allows sending and receiving messages using lane concept: -//! -//! 1) the message is sent using `send_message()` call; -//! 2) every outbound message is assigned nonce; -//! 3) the messages are stored in the storage; -//! 4) external component (relay) delivers messages to bridged chain; -//! 5) messages are processed in order (ordered by assigned nonce); -//! 6) relay may send proof-of-delivery back to this chain. -//! -//! Once message is sent, its progress can be tracked by looking at module events. -//! The assigned nonce is reported using `MessageAccepted` event. When message is -//! delivered to the the bridged chain, it is reported using `MessagesDelivered` event. -//! -//! **IMPORTANT NOTE**: after generating weights (custom `WeighInfo` implementation) for -//! your runtime (where this module is plugged to), please add test for these weights. -//! The test should call the `ensure_weights_are_correct` function from this module. -//! If this test fails with your weights, then either weights are computed incorrectly, -//! or some benchmarks assumptions are broken for your runtime. - -#![cfg_attr(not(feature = "std"), no_std)] -// Generated by `decl_event!` -#![allow(clippy::unused_unit)] - -pub use inbound_lane::StoredInboundLaneData; -pub use outbound_lane::StoredMessagePayload; -pub use weights::WeightInfo; -pub use weights_ext::{ - ensure_able_to_receive_confirmation, ensure_able_to_receive_message, - ensure_weights_are_correct, WeightInfoExt, EXPECTED_DEFAULT_MESSAGE_LENGTH, - EXTRA_STORAGE_PROOF_SIZE, -}; - -use crate::{ - inbound_lane::{InboundLane, InboundLaneStorage}, - outbound_lane::{OutboundLane, OutboundLaneStorage, ReceivalConfirmationError}, -}; - -use bp_messages::{ - source_chain::{ - DeliveryConfirmationPayments, LaneMessageVerifier, OnMessagesDelivered, - SendMessageArtifacts, TargetHeaderChain, - }, - target_chain::{ - DeliveryPayments, DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages, - SourceHeaderChain, - }, - DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, MessageKey, MessageNonce, - MessagePayload, MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails, - UnrewardedRelayersState, VerificationError, -}; -use bp_runtime::{ - BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize, RangeInclusiveExt, Size, -}; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get, DefaultNoBound}; -use sp_runtime::traits::UniqueSaturatedFrom; -use sp_std::{marker::PhantomData, prelude::*}; - -mod inbound_lane; -mod outbound_lane; -mod weights_ext; - -pub mod weights; - -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarking; - -#[cfg(test)] -mod mock; - -pub use pallet::*; - -/// The target that will be used when publishing logs related to this pallet. -pub const LOG_TARGET: &str = "runtime::bridge-messages"; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use bp_messages::{ReceivalResult, ReceivedMessages}; - use bp_runtime::RangeInclusiveExt; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::config] - pub trait Config: frame_system::Config { - // General types - - /// The overarching event type. - type RuntimeEvent: From> - + IsType<::RuntimeEvent>; - /// Benchmarks results from runtime we're plugged into. - type WeightInfo: WeightInfoExt; - - /// Gets the chain id value from the instance. - #[pallet::constant] - type BridgedChainId: Get; - - /// Get all active outbound lanes that the message pallet is serving. - type ActiveOutboundLanes: Get<&'static [LaneId]>; - /// Maximal number of unrewarded relayer entries at inbound lane. Unrewarded means that the - /// relayer has delivered messages, but either confirmations haven't been delivered back to - /// the source chain, or we haven't received reward confirmations yet. - /// - /// This constant limits maximal number of entries in the `InboundLaneData::relayers`. Keep - /// in mind that the same relayer account may take several (non-consecutive) entries in this - /// set. - type MaxUnrewardedRelayerEntriesAtInboundLane: Get; - /// Maximal number of unconfirmed messages at inbound lane. Unconfirmed means that the - /// message has been delivered, but either confirmations haven't been delivered back to the - /// source chain, or we haven't received reward confirmations for these messages yet. - /// - /// This constant limits difference between last message from last entry of the - /// `InboundLaneData::relayers` and first message at the first entry. - /// - /// There is no point of making this parameter lesser than - /// MaxUnrewardedRelayerEntriesAtInboundLane, because then maximal number of relayer entries - /// will be limited by maximal number of messages. - /// - /// This value also represents maximal number of messages in single delivery transaction. - /// Transaction that is declaring more messages than this value, will be rejected. Even if - /// these messages are from different lanes. - type MaxUnconfirmedMessagesAtInboundLane: Get; - - /// Maximal encoded size of the outbound payload. - #[pallet::constant] - type MaximalOutboundPayloadSize: Get; - /// Payload type of outbound messages. This payload is dispatched on the bridged chain. - type OutboundPayload: Parameter + Size; - - /// Payload type of inbound messages. This payload is dispatched on this chain. - type InboundPayload: Decode; - /// Identifier of relayer that deliver messages to this chain. Relayer reward is paid on the - /// bridged chain. - type InboundRelayer: Parameter + MaxEncodedLen; - /// Delivery payments. - type DeliveryPayments: DeliveryPayments; - - // Types that are used by outbound_lane (on source chain). - - /// Target header chain. - type TargetHeaderChain: TargetHeaderChain; - /// Message payload verifier. - type LaneMessageVerifier: LaneMessageVerifier; - /// Delivery confirmation payments. - type DeliveryConfirmationPayments: DeliveryConfirmationPayments; - /// Delivery confirmation callback. - type OnMessagesDelivered: OnMessagesDelivered; - - // Types that are used by inbound_lane (on target chain). - - /// Source header chain, as it is represented on target chain. - type SourceHeaderChain: SourceHeaderChain; - /// Message dispatch. - type MessageDispatch: MessageDispatch; - } - - /// Shortcut to messages proof type for Config. - pub type MessagesProofOf = - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof; - /// Shortcut to messages delivery proof type for Config. - pub type MessagesDeliveryProofOf = - <>::TargetHeaderChain as TargetHeaderChain< - >::OutboundPayload, - ::AccountId, - >>::MessagesDeliveryProof; - - #[pallet::pallet] - pub struct Pallet(PhantomData<(T, I)>); - - impl, I: 'static> OwnedBridgeModule for Pallet { - const LOG_TARGET: &'static str = LOG_TARGET; - type OwnerStorage = PalletOwner; - type OperatingMode = MessagesOperatingMode; - type OperatingModeStorage = PalletOperatingMode; - } - - #[pallet::hooks] - impl, I: 'static> Hooks> for Pallet - where - u32: TryFrom>, - { - fn on_idle(_block: BlockNumberFor, remaining_weight: Weight) -> Weight { - // we'll need at least to read outbound lane state, kill a message and update lane state - let db_weight = T::DbWeight::get(); - if !remaining_weight.all_gte(db_weight.reads_writes(1, 2)) { - return Weight::zero() - } - - // messages from lane with index `i` in `ActiveOutboundLanes` are pruned when - // `System::block_number() % lanes.len() == i`. Otherwise we need to read lane states on - // every block, wasting the whole `remaining_weight` for nothing and causing starvation - // of the last lane pruning - let active_lanes = T::ActiveOutboundLanes::get(); - let active_lanes_len = (active_lanes.len() as u32).into(); - let active_lane_index = u32::unique_saturated_from( - frame_system::Pallet::::block_number() % active_lanes_len, - ); - let active_lane_id = active_lanes[active_lane_index as usize]; - - // first db read - outbound lane state - let mut active_lane = outbound_lane::(active_lane_id); - let mut used_weight = db_weight.reads(1); - // and here we'll have writes - used_weight += active_lane.prune_messages(db_weight, remaining_weight - used_weight); - - // we already checked we have enough `remaining_weight` to cover this `used_weight` - used_weight - } - } - - #[pallet::call] - impl, I: 'static> Pallet { - /// Change `PalletOwner`. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(0)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { - >::set_owner(origin, new_owner) - } - - /// Halt or resume all/some pallet operations. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(1)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_operating_mode( - origin: OriginFor, - operating_mode: MessagesOperatingMode, - ) -> DispatchResult { - >::set_operating_mode(origin, operating_mode) - } - - /// Receive messages proof from bridged chain. - /// - /// The weight of the call assumes that the transaction always brings outbound lane - /// state update. Because of that, the submitter (relayer) has no benefit of not including - /// this data in the transaction, so reward confirmations lags should be minimal. - /// - /// The call fails if: - /// - /// - the pallet is halted; - /// - /// - the call origin is not `Signed(_)`; - /// - /// - there are too many messages in the proof; - /// - /// - the proof verification procedure returns an error - e.g. because header used to craft - /// proof is not imported by the associated finality pallet; - /// - /// - the `dispatch_weight` argument is not sufficient to dispatch all bundled messages. - /// - /// The call may succeed, but some messages may not be delivered e.g. if they are not fit - /// into the unrewarded relayers vector. - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::receive_messages_proof_weight(proof, *messages_count, *dispatch_weight))] - pub fn receive_messages_proof( - origin: OriginFor, - relayer_id_at_bridged_chain: T::InboundRelayer, - proof: MessagesProofOf, - messages_count: u32, - dispatch_weight: Weight, - ) -> DispatchResultWithPostInfo { - Self::ensure_not_halted().map_err(Error::::BridgeModule)?; - let relayer_id_at_this_chain = ensure_signed(origin)?; - - // reject transactions that are declaring too many messages - ensure!( - MessageNonce::from(messages_count) <= T::MaxUnconfirmedMessagesAtInboundLane::get(), - Error::::TooManyMessagesInTheProof - ); - - // if message dispatcher is currently inactive, we won't accept any messages - ensure!(T::MessageDispatch::is_active(), Error::::MessageDispatchInactive); - - // why do we need to know the weight of this (`receive_messages_proof`) call? Because - // we may want to return some funds for not-dispatching (or partially dispatching) some - // messages to the call origin (relayer). And this is done by returning actual weight - // from the call. But we only know dispatch weight of every messages. So to refund - // relayer because we have not dispatched Message, we need to: - // - // ActualWeight = DeclaredWeight - Message.DispatchWeight - // - // The DeclaredWeight is exactly what's computed here. Unfortunately it is impossible - // to get pre-computed value (and it has been already computed by the executive). - let declared_weight = T::WeightInfo::receive_messages_proof_weight( - &proof, - messages_count, - dispatch_weight, - ); - let mut actual_weight = declared_weight; - - // verify messages proof && convert proof into messages - let messages = verify_and_decode_messages_proof::< - T::SourceHeaderChain, - T::InboundPayload, - >(proof, messages_count) - .map_err(|err| { - log::trace!(target: LOG_TARGET, "Rejecting invalid messages proof: {:?}", err,); - - Error::::InvalidMessagesProof - })?; - - // dispatch messages and (optionally) update lane(s) state(s) - let mut total_messages = 0; - let mut valid_messages = 0; - let mut messages_received_status = Vec::with_capacity(messages.len()); - let mut dispatch_weight_left = dispatch_weight; - for (lane_id, lane_data) in messages { - let mut lane = inbound_lane::(lane_id); - - // subtract extra storage proof bytes from the actual PoV size - there may be - // less unrewarded relayers than the maximal configured value - let lane_extra_proof_size_bytes = lane.storage_mut().extra_proof_size_bytes(); - actual_weight = actual_weight.set_proof_size( - actual_weight.proof_size().saturating_sub(lane_extra_proof_size_bytes), - ); - - if let Some(lane_state) = lane_data.lane_state { - let updated_latest_confirmed_nonce = lane.receive_state_update(lane_state); - if let Some(updated_latest_confirmed_nonce) = updated_latest_confirmed_nonce { - log::trace!( - target: LOG_TARGET, - "Received lane {:?} state update: latest_confirmed_nonce={}. Unrewarded relayers: {:?}", - lane_id, - updated_latest_confirmed_nonce, - UnrewardedRelayersState::from(&lane.storage_mut().get_or_init_data()), - ); - } - } - - let mut lane_messages_received_status = - ReceivedMessages::new(lane_id, Vec::with_capacity(lane_data.messages.len())); - for mut message in lane_data.messages { - debug_assert_eq!(message.key.lane_id, lane_id); - total_messages += 1; - - // ensure that relayer has declared enough weight for dispatching next message - // on this lane. We can't dispatch lane messages out-of-order, so if declared - // weight is not enough, let's move to next lane - let message_dispatch_weight = T::MessageDispatch::dispatch_weight(&mut message); - if message_dispatch_weight.any_gt(dispatch_weight_left) { - log::trace!( - target: LOG_TARGET, - "Cannot dispatch any more messages on lane {:?}. Weight: declared={}, left={}", - lane_id, - message_dispatch_weight, - dispatch_weight_left, - ); - - fail!(Error::::InsufficientDispatchWeight); - } - - let receival_result = lane.receive_message::( - &relayer_id_at_bridged_chain, - message.key.nonce, - message.data, - ); - - // note that we're returning unspent weight to relayer even if message has been - // rejected by the lane. This allows relayers to submit spam transactions with - // e.g. the same set of already delivered messages over and over again, without - // losing funds for messages dispatch. But keep in mind that relayer pays base - // delivery transaction cost anyway. And base cost covers everything except - // dispatch, so we have a balance here. - let unspent_weight = match &receival_result { - ReceivalResult::Dispatched(dispatch_result) => { - valid_messages += 1; - dispatch_result.unspent_weight - }, - ReceivalResult::InvalidNonce | - ReceivalResult::TooManyUnrewardedRelayers | - ReceivalResult::TooManyUnconfirmedMessages => message_dispatch_weight, - }; - lane_messages_received_status.push(message.key.nonce, receival_result); - - let unspent_weight = unspent_weight.min(message_dispatch_weight); - dispatch_weight_left -= message_dispatch_weight - unspent_weight; - actual_weight = actual_weight.saturating_sub(unspent_weight); - } - - messages_received_status.push(lane_messages_received_status); - } - - // let's now deal with relayer payments - T::DeliveryPayments::pay_reward( - relayer_id_at_this_chain, - total_messages, - valid_messages, - actual_weight, - ); - - log::debug!( - target: LOG_TARGET, - "Received messages: total={}, valid={}. Weight used: {}/{}.", - total_messages, - valid_messages, - actual_weight, - declared_weight, - ); - - Self::deposit_event(Event::MessagesReceived(messages_received_status)); - - Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) - } - - /// Receive messages delivery proof from bridged chain. - #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::receive_messages_delivery_proof_weight( - proof, - relayers_state, - ))] - pub fn receive_messages_delivery_proof( - origin: OriginFor, - proof: MessagesDeliveryProofOf, - mut relayers_state: UnrewardedRelayersState, - ) -> DispatchResultWithPostInfo { - Self::ensure_not_halted().map_err(Error::::BridgeModule)?; - - let proof_size = proof.size(); - let confirmation_relayer = ensure_signed(origin)?; - let (lane_id, lane_data) = T::TargetHeaderChain::verify_messages_delivery_proof(proof) - .map_err(|err| { - log::trace!( - target: LOG_TARGET, - "Rejecting invalid messages delivery proof: {:?}", - err, - ); - - Error::::InvalidMessagesDeliveryProof - })?; - ensure!( - relayers_state.is_valid(&lane_data), - Error::::InvalidUnrewardedRelayersState - ); - - // mark messages as delivered - let mut lane = outbound_lane::(lane_id); - let last_delivered_nonce = lane_data.last_delivered_nonce(); - let confirmed_messages = lane - .confirm_delivery( - relayers_state.total_messages, - last_delivered_nonce, - &lane_data.relayers, - ) - .map_err(Error::::ReceivalConfirmation)?; - - if let Some(confirmed_messages) = confirmed_messages { - // emit 'delivered' event - let received_range = confirmed_messages.begin..=confirmed_messages.end; - Self::deposit_event(Event::MessagesDelivered { - lane_id, - messages: confirmed_messages, - }); - - // if some new messages have been confirmed, reward relayers - let actually_rewarded_relayers = T::DeliveryConfirmationPayments::pay_reward( - lane_id, - lane_data.relayers, - &confirmation_relayer, - &received_range, - ); - - // update relayers state with actual numbers to compute actual weight below - relayers_state.unrewarded_relayer_entries = sp_std::cmp::min( - relayers_state.unrewarded_relayer_entries, - actually_rewarded_relayers, - ); - relayers_state.total_messages = sp_std::cmp::min( - relayers_state.total_messages, - received_range.checked_len().unwrap_or(MessageNonce::MAX), - ); - }; - - log::trace!( - target: LOG_TARGET, - "Received messages delivery proof up to (and including) {} at lane {:?}", - last_delivered_nonce, - lane_id, - ); - - // notify others about messages delivery - T::OnMessagesDelivered::on_messages_delivered( - lane_id, - lane.data().queued_messages().saturating_len(), - ); - - // because of lags, the inbound lane state (`lane_data`) may have entries for - // already rewarded relayers and messages (if all entries are duplicated, then - // this transaction must be filtered out by our signed extension) - let actual_weight = T::WeightInfo::receive_messages_delivery_proof_weight( - &PreComputedSize(proof_size as usize), - &relayers_state, - ); - - Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event, I: 'static = ()> { - /// Message has been accepted and is waiting to be delivered. - MessageAccepted { lane_id: LaneId, nonce: MessageNonce }, - /// Messages have been received from the bridged chain. - MessagesReceived( - Vec::DispatchLevelResult>>, - ), - /// Messages in the inclusive range have been delivered to the bridged chain. - MessagesDelivered { lane_id: LaneId, messages: DeliveredMessages }, - } - - #[pallet::error] - pub enum Error { - /// Pallet is not in Normal operating mode. - NotOperatingNormally, - /// The outbound lane is inactive. - InactiveOutboundLane, - /// The inbound message dispatcher is inactive. - MessageDispatchInactive, - /// Message has been treated as invalid by chain verifier. - MessageRejectedByChainVerifier(VerificationError), - /// Message has been treated as invalid by lane verifier. - MessageRejectedByLaneVerifier(VerificationError), - /// Message has been treated as invalid by the pallet logic. - MessageRejectedByPallet(VerificationError), - /// Submitter has failed to pay fee for delivering and dispatching messages. - FailedToWithdrawMessageFee, - /// The transaction brings too many messages. - TooManyMessagesInTheProof, - /// Invalid messages has been submitted. - InvalidMessagesProof, - /// Invalid messages delivery proof has been submitted. - InvalidMessagesDeliveryProof, - /// The relayer has declared invalid unrewarded relayers state in the - /// `receive_messages_delivery_proof` call. - InvalidUnrewardedRelayersState, - /// The cumulative dispatch weight, passed by relayer is not enough to cover dispatch - /// of all bundled messages. - InsufficientDispatchWeight, - /// The message someone is trying to work with (i.e. increase fee) is not yet sent. - MessageIsNotYetSent, - /// Error confirming messages receival. - ReceivalConfirmation(ReceivalConfirmationError), - /// Error generated by the `OwnedBridgeModule` trait. - BridgeModule(bp_runtime::OwnedBridgeModuleError), - } - - /// Optional pallet owner. - /// - /// Pallet owner has a right to halt all pallet operations and then resume it. If it is - /// `None`, then there are no direct ways to halt/resume pallet operations, but other - /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt - /// flag directly or call the `halt_operations`). - #[pallet::storage] - #[pallet::getter(fn module_owner)] - pub type PalletOwner, I: 'static = ()> = StorageValue<_, T::AccountId>; - - /// The current operating mode of the pallet. - /// - /// Depending on the mode either all, some, or no transactions will be allowed. - #[pallet::storage] - #[pallet::getter(fn operating_mode)] - pub type PalletOperatingMode, I: 'static = ()> = - StorageValue<_, MessagesOperatingMode, ValueQuery>; - - /// Map of lane id => inbound lane data. - #[pallet::storage] - pub type InboundLanes, I: 'static = ()> = - StorageMap<_, Blake2_128Concat, LaneId, StoredInboundLaneData, ValueQuery>; - - /// Map of lane id => outbound lane data. - #[pallet::storage] - pub type OutboundLanes, I: 'static = ()> = StorageMap< - Hasher = Blake2_128Concat, - Key = LaneId, - Value = OutboundLaneData, - QueryKind = ValueQuery, - OnEmpty = GetDefault, - MaxValues = MaybeOutboundLanesCount, - >; - - /// Map of lane id => is congested signal sent. It is managed by the - /// `bridge_runtime_common::LocalXcmQueueManager`. - /// - /// **bridges-v1**: this map is a temporary hack and will be dropped in the `v2`. We can emulate - /// a storage map using `sp_io::unhashed` storage functions, but then benchmarks are not - /// accounting its `proof_size`, so it is missing from the final weights. So we need to make it - /// a map inside some pallet. We could use a simply value instead of map here, because - /// in `v1` we'll only have a single lane. But in the case of adding another lane before `v2`, - /// it'll be easier to deal with the isolated storage map instead. - #[pallet::storage] - pub type OutboundLanesCongestedSignals, I: 'static = ()> = StorageMap< - Hasher = Blake2_128Concat, - Key = LaneId, - Value = bool, - QueryKind = ValueQuery, - OnEmpty = GetDefault, - MaxValues = MaybeOutboundLanesCount, - >; - - /// All queued outbound messages. - #[pallet::storage] - pub type OutboundMessages, I: 'static = ()> = - StorageMap<_, Blake2_128Concat, MessageKey, StoredMessagePayload>; - - #[pallet::genesis_config] - #[derive(DefaultNoBound)] - pub struct GenesisConfig, I: 'static = ()> { - /// Initial pallet operating mode. - pub operating_mode: MessagesOperatingMode, - /// Initial pallet owner. - pub owner: Option, - /// Dummy marker. - pub phantom: sp_std::marker::PhantomData, - } - - #[pallet::genesis_build] - impl, I: 'static> BuildGenesisConfig for GenesisConfig { - fn build(&self) { - PalletOperatingMode::::put(self.operating_mode); - if let Some(ref owner) = self.owner { - PalletOwner::::put(owner); - } - } - } - - impl, I: 'static> Pallet { - /// Get stored data of the outbound message with given nonce. - pub fn outbound_message_data(lane: LaneId, nonce: MessageNonce) -> Option { - OutboundMessages::::get(MessageKey { lane_id: lane, nonce }).map(Into::into) - } - - /// Prepare data, related to given inbound message. - pub fn inbound_message_data( - lane: LaneId, - payload: MessagePayload, - outbound_details: OutboundMessageDetails, - ) -> InboundMessageDetails { - let mut dispatch_message = DispatchMessage { - key: MessageKey { lane_id: lane, nonce: outbound_details.nonce }, - data: payload.into(), - }; - InboundMessageDetails { - dispatch_weight: T::MessageDispatch::dispatch_weight(&mut dispatch_message), - } - } - - /// Return outbound lane data. - pub fn outbound_lane_data(lane: LaneId) -> OutboundLaneData { - OutboundLanes::::get(lane) - } - - /// Return inbound lane data. - pub fn inbound_lane_data(lane: LaneId) -> InboundLaneData { - InboundLanes::::get(lane).0 - } - } - - /// Get-parameter that returns number of active outbound lanes that the pallet maintains. - pub struct MaybeOutboundLanesCount(PhantomData<(T, I)>); - - impl, I: 'static> Get> for MaybeOutboundLanesCount { - fn get() -> Option { - Some(T::ActiveOutboundLanes::get().len() as u32) - } - } -} - -impl bp_messages::source_chain::MessagesBridge for Pallet -where - T: Config, - I: 'static, -{ - type Error = sp_runtime::DispatchErrorWithPostInfo; - - fn send_message( - lane: LaneId, - message: T::OutboundPayload, - ) -> Result { - crate::send_message::(lane, message) - } -} - -/// Function that actually sends message. -fn send_message, I: 'static>( - lane_id: LaneId, - payload: T::OutboundPayload, -) -> sp_std::result::Result< - SendMessageArtifacts, - sp_runtime::DispatchErrorWithPostInfo, -> { - ensure_normal_operating_mode::()?; - - // let's check if outbound lane is active - ensure!(T::ActiveOutboundLanes::get().contains(&lane_id), Error::::InactiveOutboundLane,); - - // let's first check if message can be delivered to target chain - T::TargetHeaderChain::verify_message(&payload).map_err(|err| { - log::trace!( - target: LOG_TARGET, - "Message to lane {:?} is rejected by target chain: {:?}", - lane_id, - err, - ); - - Error::::MessageRejectedByChainVerifier(err) - })?; - - // now let's enforce any additional lane rules - let mut lane = outbound_lane::(lane_id); - T::LaneMessageVerifier::verify_message(&lane_id, &lane.data(), &payload).map_err(|err| { - log::trace!( - target: LOG_TARGET, - "Message to lane {:?} is rejected by lane verifier: {:?}", - lane_id, - err, - ); - - Error::::MessageRejectedByLaneVerifier(err) - })?; - - // finally, save message in outbound storage and emit event - let encoded_payload = payload.encode(); - let encoded_payload_len = encoded_payload.len(); - let nonce = lane - .send_message(encoded_payload) - .map_err(Error::::MessageRejectedByPallet)?; - - // return number of messages in the queue to let sender know about its state - let enqueued_messages = lane.data().queued_messages().saturating_len(); - - log::trace!( - target: LOG_TARGET, - "Accepted message {} to lane {:?}. Message size: {:?}", - nonce, - lane_id, - encoded_payload_len, - ); - - Pallet::::deposit_event(Event::MessageAccepted { lane_id, nonce }); - - Ok(SendMessageArtifacts { nonce, enqueued_messages }) -} - -/// Ensure that the pallet is in normal operational mode. -fn ensure_normal_operating_mode, I: 'static>() -> Result<(), Error> { - if PalletOperatingMode::::get() == - MessagesOperatingMode::Basic(BasicOperatingMode::Normal) - { - return Ok(()) - } - - Err(Error::::NotOperatingNormally) -} - -/// Creates new inbound lane object, backed by runtime storage. -fn inbound_lane, I: 'static>( - lane_id: LaneId, -) -> InboundLane> { - InboundLane::new(RuntimeInboundLaneStorage::from_lane_id(lane_id)) -} - -/// Creates new outbound lane object, backed by runtime storage. -fn outbound_lane, I: 'static>( - lane_id: LaneId, -) -> OutboundLane> { - OutboundLane::new(RuntimeOutboundLaneStorage { lane_id, _phantom: Default::default() }) -} - -/// Runtime inbound lane storage. -struct RuntimeInboundLaneStorage, I: 'static = ()> { - lane_id: LaneId, - cached_data: Option>, - _phantom: PhantomData, -} - -impl, I: 'static> RuntimeInboundLaneStorage { - /// Creates new runtime inbound lane storage. - fn from_lane_id(lane_id: LaneId) -> RuntimeInboundLaneStorage { - RuntimeInboundLaneStorage { lane_id, cached_data: None, _phantom: Default::default() } - } -} - -impl, I: 'static> RuntimeInboundLaneStorage { - /// Returns number of bytes that may be subtracted from the PoV component of - /// `receive_messages_proof` call, because the actual inbound lane state is smaller than the - /// maximal configured. - /// - /// Maximal inbound lane state set size is configured by the - /// `MaxUnrewardedRelayerEntriesAtInboundLane` constant from the pallet configuration. The PoV - /// of the call includes the maximal size of inbound lane state. If the actual size is smaller, - /// we may subtract extra bytes from this component. - pub fn extra_proof_size_bytes(&mut self) -> u64 { - let max_encoded_len = StoredInboundLaneData::::max_encoded_len(); - let relayers_count = self.get_or_init_data().relayers.len(); - let actual_encoded_len = - InboundLaneData::::encoded_size_hint(relayers_count) - .unwrap_or(usize::MAX); - max_encoded_len.saturating_sub(actual_encoded_len) as _ - } -} - -impl, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage { - type Relayer = T::InboundRelayer; - - fn id(&self) -> LaneId { - self.lane_id - } - - fn max_unrewarded_relayer_entries(&self) -> MessageNonce { - T::MaxUnrewardedRelayerEntriesAtInboundLane::get() - } - - fn max_unconfirmed_messages(&self) -> MessageNonce { - T::MaxUnconfirmedMessagesAtInboundLane::get() - } - - fn get_or_init_data(&mut self) -> InboundLaneData { - match self.cached_data { - Some(ref data) => data.clone(), - None => { - let data: InboundLaneData = - InboundLanes::::get(self.lane_id).into(); - self.cached_data = Some(data.clone()); - data - }, - } - } - - fn set_data(&mut self, data: InboundLaneData) { - self.cached_data = Some(data.clone()); - InboundLanes::::insert(self.lane_id, StoredInboundLaneData::(data)) - } -} - -/// Runtime outbound lane storage. -struct RuntimeOutboundLaneStorage { - lane_id: LaneId, - _phantom: PhantomData<(T, I)>, -} - -impl, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorage { - fn id(&self) -> LaneId { - self.lane_id - } - - fn data(&self) -> OutboundLaneData { - OutboundLanes::::get(self.lane_id) - } - - fn set_data(&mut self, data: OutboundLaneData) { - OutboundLanes::::insert(self.lane_id, data) - } - - #[cfg(test)] - fn message(&self, nonce: &MessageNonce) -> Option { - OutboundMessages::::get(MessageKey { lane_id: self.lane_id, nonce: *nonce }) - .map(Into::into) - } - - fn save_message( - &mut self, - nonce: MessageNonce, - message_payload: MessagePayload, - ) -> Result<(), VerificationError> { - OutboundMessages::::insert( - MessageKey { lane_id: self.lane_id, nonce }, - StoredMessagePayload::::try_from(message_payload) - .map_err(|_| VerificationError::MessageTooLarge)?, - ); - Ok(()) - } - - fn remove_message(&mut self, nonce: &MessageNonce) { - OutboundMessages::::remove(MessageKey { lane_id: self.lane_id, nonce: *nonce }); - } -} - -/// Verify messages proof and return proved messages with decoded payload. -fn verify_and_decode_messages_proof( - proof: Chain::MessagesProof, - messages_count: u32, -) -> Result>, VerificationError> { - // `receive_messages_proof` weight formula and `MaxUnconfirmedMessagesAtInboundLane` check - // guarantees that the `message_count` is sane and Vec may be allocated. - // (tx with too many messages will either be rejected from the pool, or will fail earlier) - Chain::verify_messages_proof(proof, messages_count).map(|messages_by_lane| { - messages_by_lane - .into_iter() - .map(|(lane, lane_data)| { - ( - lane, - ProvedLaneMessages { - lane_state: lane_data.lane_state, - messages: lane_data.messages.into_iter().map(Into::into).collect(), - }, - ) - }) - .collect() - }) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - mock::{ - inbound_unrewarded_relayers_state, message, message_payload, run_test, - unrewarded_relayer, AccountId, DbWeight, RuntimeEvent as TestEvent, RuntimeOrigin, - TestDeliveryConfirmationPayments, TestDeliveryPayments, TestMessageDispatch, - TestMessagesDeliveryProof, TestMessagesProof, TestOnMessagesDelivered, TestRelayer, - TestRuntime, TestWeightInfo, MAX_OUTBOUND_PAYLOAD_SIZE, - PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_LANE_ID_2, - TEST_LANE_ID_3, TEST_RELAYER_A, TEST_RELAYER_B, - }, - outbound_lane::ReceivalConfirmationError, - }; - use bp_messages::{BridgeMessagesCall, UnrewardedRelayer, UnrewardedRelayersState}; - use bp_test_utils::generate_owned_bridge_module_tests; - use frame_support::{ - assert_noop, assert_ok, - dispatch::Pays, - storage::generator::{StorageMap, StorageValue}, - traits::Hooks, - weights::Weight, - }; - use frame_system::{EventRecord, Pallet as System, Phase}; - use sp_runtime::DispatchError; - - fn get_ready_for_events() { - System::::set_block_number(1); - System::::reset_events(); - } - - fn send_regular_message() { - get_ready_for_events(); - - let outbound_lane = outbound_lane::(TEST_LANE_ID); - let message_nonce = outbound_lane.data().latest_generated_nonce + 1; - let prev_enqueud_messages = outbound_lane.data().queued_messages().saturating_len(); - let artifacts = send_message::(TEST_LANE_ID, REGULAR_PAYLOAD) - .expect("send_message has failed"); - assert_eq!(artifacts.enqueued_messages, prev_enqueud_messages + 1); - - // check event with assigned nonce - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Messages(Event::MessageAccepted { - lane_id: TEST_LANE_ID, - nonce: message_nonce - }), - topics: vec![], - }], - ); - } - - fn receive_messages_delivery_proof() { - System::::set_block_number(1); - System::::reset_events(); - - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![UnrewardedRelayer { - relayer: 0, - messages: DeliveredMessages::new(1), - }] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - )); - - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Messages(Event::MessagesDelivered { - lane_id: TEST_LANE_ID, - messages: DeliveredMessages::new(1), - }), - topics: vec![], - }], - ); - } - - #[test] - fn pallet_rejects_transactions_if_halted() { - run_test(|| { - // send message first to be able to check that delivery_proof fails later - send_regular_message(); - - PalletOperatingMode::::put(MessagesOperatingMode::Basic( - BasicOperatingMode::Halted, - )); - - assert_noop!( - send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,), - Error::::NotOperatingNormally, - ); - - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(2, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - ), - Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), - ); - - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - ), - Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), - ); - }); - } - - #[test] - fn pallet_rejects_new_messages_in_rejecting_outbound_messages_operating_mode() { - run_test(|| { - // send message first to be able to check that delivery_proof fails later - send_regular_message(); - - PalletOperatingMode::::put( - MessagesOperatingMode::RejectingOutboundMessages, - ); - - assert_noop!( - send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,), - Error::::NotOperatingNormally, - ); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - ),); - - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - )); - }); - } - - #[test] - fn send_message_works() { - run_test(|| { - send_regular_message(); - }); - } - - #[test] - fn send_message_rejects_too_large_message() { - run_test(|| { - let mut message_payload = message_payload(1, 0); - // the payload isn't simply extra, so it'll definitely overflow - // `MAX_OUTBOUND_PAYLOAD_SIZE` if we add `MAX_OUTBOUND_PAYLOAD_SIZE` bytes to extra - message_payload - .extra - .extend_from_slice(&[0u8; MAX_OUTBOUND_PAYLOAD_SIZE as usize]); - assert_noop!( - send_message::(TEST_LANE_ID, message_payload.clone(),), - Error::::MessageRejectedByPallet( - VerificationError::MessageTooLarge - ), - ); - - // let's check that we're able to send `MAX_OUTBOUND_PAYLOAD_SIZE` messages - while message_payload.encoded_size() as u32 > MAX_OUTBOUND_PAYLOAD_SIZE { - message_payload.extra.pop(); - } - assert_eq!(message_payload.encoded_size() as u32, MAX_OUTBOUND_PAYLOAD_SIZE); - assert_ok!(send_message::(TEST_LANE_ID, message_payload,),); - }) - } - - #[test] - fn chain_verifier_rejects_invalid_message_in_send_message() { - run_test(|| { - // messages with this payload are rejected by target chain verifier - assert_noop!( - send_message::(TEST_LANE_ID, PAYLOAD_REJECTED_BY_TARGET_CHAIN,), - Error::::MessageRejectedByChainVerifier(VerificationError::Other( - mock::TEST_ERROR - )), - ); - }); - } - - #[test] - fn lane_verifier_rejects_invalid_message_in_send_message() { - run_test(|| { - // messages with zero fee are rejected by lane verifier - let mut message = REGULAR_PAYLOAD; - message.reject_by_lane_verifier = true; - assert_noop!( - send_message::(TEST_LANE_ID, message,), - Error::::MessageRejectedByLaneVerifier(VerificationError::Other( - mock::TEST_ERROR - )), - ); - }); - } - - #[test] - fn receive_messages_proof_works() { - run_test(|| { - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - )); - - assert_eq!(InboundLanes::::get(TEST_LANE_ID).0.last_delivered_nonce(), 1); - - assert!(TestDeliveryPayments::is_reward_paid(1)); - }); - } - - #[test] - fn receive_messages_proof_updates_confirmed_message_nonce() { - run_test(|| { - // say we have received 10 messages && last confirmed message is 8 - InboundLanes::::insert( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 8, - relayers: vec![ - unrewarded_relayer(9, 9, TEST_RELAYER_A), - unrewarded_relayer(10, 10, TEST_RELAYER_B), - ] - .into_iter() - .collect(), - }, - ); - assert_eq!( - inbound_unrewarded_relayers_state(TEST_LANE_ID), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - messages_in_oldest_entry: 1, - total_messages: 2, - last_delivered_nonce: 10, - }, - ); - - // message proof includes outbound lane state with latest confirmed message updated to 9 - let mut message_proof: TestMessagesProof = - Ok(vec![message(11, REGULAR_PAYLOAD)]).into(); - message_proof.result.as_mut().unwrap()[0].1.lane_state = - Some(OutboundLaneData { latest_received_nonce: 9, ..Default::default() }); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - message_proof, - 1, - REGULAR_PAYLOAD.declared_weight, - )); - - assert_eq!( - InboundLanes::::get(TEST_LANE_ID).0, - InboundLaneData { - last_confirmed_nonce: 9, - relayers: vec![ - unrewarded_relayer(10, 10, TEST_RELAYER_B), - unrewarded_relayer(11, 11, TEST_RELAYER_A) - ] - .into_iter() - .collect(), - }, - ); - assert_eq!( - inbound_unrewarded_relayers_state(TEST_LANE_ID), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - messages_in_oldest_entry: 1, - total_messages: 2, - last_delivered_nonce: 11, - }, - ); - }); - } - - #[test] - fn receive_messages_fails_if_dispatcher_is_inactive() { - run_test(|| { - TestMessageDispatch::deactivate(); - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - REGULAR_PAYLOAD.declared_weight, - ), - Error::::MessageDispatchInactive, - ); - }); - } - - #[test] - fn receive_messages_proof_does_not_accept_message_if_dispatch_weight_is_not_enough() { - run_test(|| { - let mut declared_weight = REGULAR_PAYLOAD.declared_weight; - *declared_weight.ref_time_mut() -= 1; - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - 1, - declared_weight, - ), - Error::::InsufficientDispatchWeight - ); - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); - }); - } - - #[test] - fn receive_messages_proof_rejects_invalid_proof() { - run_test(|| { - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Err(()).into(), - 1, - Weight::zero(), - ), - Error::::InvalidMessagesProof, - ); - }); - } - - #[test] - fn receive_messages_proof_rejects_proof_with_too_many_messages() { - run_test(|| { - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), - u32::MAX, - Weight::zero(), - ), - Error::::TooManyMessagesInTheProof, - ); - }); - } - - #[test] - fn receive_messages_delivery_proof_works() { - run_test(|| { - send_regular_message(); - receive_messages_delivery_proof(); - - assert_eq!( - OutboundLanes::::get(TEST_LANE_ID).latest_received_nonce, - 1, - ); - }); - } - - #[test] - fn receive_messages_delivery_proof_rewards_relayers() { - run_test(|| { - assert_ok!(send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,)); - assert_ok!(send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,)); - - // this reports delivery of message 1 => reward is paid to TEST_RELAYER_A - let single_message_delivery_proof = TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into_iter().collect(), - ..Default::default() - }, - ))); - let single_message_delivery_proof_size = single_message_delivery_proof.size(); - let result = Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - single_message_delivery_proof, - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - ); - assert_ok!(result); - assert_eq!( - result.unwrap().actual_weight.unwrap(), - TestWeightInfo::receive_messages_delivery_proof_weight( - &PreComputedSize(single_message_delivery_proof_size as _), - &UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 1, - ..Default::default() - }, - ) - ); - assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); - assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); - assert_eq!(TestOnMessagesDelivered::call_arguments(), Some((TEST_LANE_ID, 1))); - - // this reports delivery of both message 1 and message 2 => reward is paid only to - // TEST_RELAYER_B - let two_messages_delivery_proof = TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B), - ] - .into_iter() - .collect(), - ..Default::default() - }, - ))); - let two_messages_delivery_proof_size = two_messages_delivery_proof.size(); - let result = Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - two_messages_delivery_proof, - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - messages_in_oldest_entry: 1, - total_messages: 2, - last_delivered_nonce: 2, - }, - ); - assert_ok!(result); - // even though the pre-dispatch weight was for two messages, the actual weight is - // for single message only - assert_eq!( - result.unwrap().actual_weight.unwrap(), - TestWeightInfo::receive_messages_delivery_proof_weight( - &PreComputedSize(two_messages_delivery_proof_size as _), - &UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 1, - ..Default::default() - }, - ) - ); - assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); - assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); - assert_eq!(TestOnMessagesDelivered::call_arguments(), Some((TEST_LANE_ID, 0))); - }); - } - - #[test] - fn receive_messages_delivery_proof_rejects_invalid_proof() { - run_test(|| { - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Err(())), - Default::default(), - ), - Error::::InvalidMessagesDeliveryProof, - ); - }); - } - - #[test] - fn receive_messages_delivery_proof_rejects_proof_if_declared_relayers_state_is_invalid() { - run_test(|| { - // when number of relayers entries is invalid - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B) - ] - .into_iter() - .collect(), - ..Default::default() - } - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 2, - last_delivered_nonce: 2, - ..Default::default() - }, - ), - Error::::InvalidUnrewardedRelayersState, - ); - - // when number of messages is invalid - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B) - ] - .into_iter() - .collect(), - ..Default::default() - } - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - total_messages: 1, - last_delivered_nonce: 2, - ..Default::default() - }, - ), - Error::::InvalidUnrewardedRelayersState, - ); - - // when last delivered nonce is invalid - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - relayers: vec![ - unrewarded_relayer(1, 1, TEST_RELAYER_A), - unrewarded_relayer(2, 2, TEST_RELAYER_B) - ] - .into_iter() - .collect(), - ..Default::default() - } - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 2, - total_messages: 2, - last_delivered_nonce: 8, - ..Default::default() - }, - ), - Error::::InvalidUnrewardedRelayersState, - ); - }); - } - - #[test] - fn receive_messages_accepts_single_message_with_invalid_payload() { - run_test(|| { - let mut invalid_message = message(1, REGULAR_PAYLOAD); - invalid_message.payload = Vec::new(); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok(vec![invalid_message]).into(), - 1, - Weight::zero(), /* weight may be zero in this case (all messages are - * improperly encoded) */ - ),); - - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 1,); - }); - } - - #[test] - fn receive_messages_accepts_batch_with_message_with_invalid_payload() { - run_test(|| { - let mut invalid_message = message(2, REGULAR_PAYLOAD); - invalid_message.payload = Vec::new(); - - assert_ok!(Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - Ok( - vec![message(1, REGULAR_PAYLOAD), invalid_message, message(3, REGULAR_PAYLOAD),] - ) - .into(), - 3, - REGULAR_PAYLOAD.declared_weight + REGULAR_PAYLOAD.declared_weight, - ),); - - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 3,); - }); - } - - #[test] - fn actual_dispatch_weight_does_not_overlow() { - run_test(|| { - let message1 = message(1, message_payload(0, u64::MAX / 2)); - let message2 = message(2, message_payload(0, u64::MAX / 2)); - let message3 = message(3, message_payload(0, u64::MAX / 2)); - - assert_noop!( - Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - // this may cause overflow if source chain storage is invalid - Ok(vec![message1, message2, message3]).into(), - 3, - Weight::MAX, - ), - Error::::InsufficientDispatchWeight - ); - assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); - }); - } - - #[test] - fn ref_time_refund_from_receive_messages_proof_works() { - run_test(|| { - fn submit_with_unspent_weight( - nonce: MessageNonce, - unspent_weight: u64, - ) -> (Weight, Weight) { - let mut payload = REGULAR_PAYLOAD; - *payload.dispatch_result.unspent_weight.ref_time_mut() = unspent_weight; - let proof = Ok(vec![message(nonce, payload)]).into(); - let messages_count = 1; - let pre_dispatch_weight = - ::WeightInfo::receive_messages_proof_weight( - &proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ); - let result = Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ) - .expect("delivery has failed"); - let post_dispatch_weight = - result.actual_weight.expect("receive_messages_proof always returns Some"); - - // message delivery transactions are never free - assert_eq!(result.pays_fee, Pays::Yes); - - (pre_dispatch_weight, post_dispatch_weight) - } - - // when dispatch is returning `unspent_weight < declared_weight` - let (pre, post) = submit_with_unspent_weight(1, 1); - assert_eq!(post.ref_time(), pre.ref_time() - 1); - - // when dispatch is returning `unspent_weight = declared_weight` - let (pre, post) = - submit_with_unspent_weight(2, REGULAR_PAYLOAD.declared_weight.ref_time()); - assert_eq!( - post.ref_time(), - pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() - ); - - // when dispatch is returning `unspent_weight > declared_weight` - let (pre, post) = - submit_with_unspent_weight(3, REGULAR_PAYLOAD.declared_weight.ref_time() + 1); - assert_eq!( - post.ref_time(), - pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() - ); - - // when there's no unspent weight - let (pre, post) = submit_with_unspent_weight(4, 0); - assert_eq!(post.ref_time(), pre.ref_time()); - - // when dispatch is returning `unspent_weight < declared_weight` - let (pre, post) = submit_with_unspent_weight(5, 1); - assert_eq!(post.ref_time(), pre.ref_time() - 1); - }); - } - - #[test] - fn proof_size_refund_from_receive_messages_proof_works() { - run_test(|| { - let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; - - // if there's maximal number of unrewarded relayer entries at the inbound lane, then - // `proof_size` is unchanged in post-dispatch weight - let proof: TestMessagesProof = Ok(vec![message(101, REGULAR_PAYLOAD)]).into(); - let messages_count = 1; - let pre_dispatch_weight = - ::WeightInfo::receive_messages_proof_weight( - &proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ); - InboundLanes::::insert( - TEST_LANE_ID, - StoredInboundLaneData(InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: 42, - messages: DeliveredMessages { begin: 0, end: 100 } - }; - max_entries - ] - .into_iter() - .collect(), - last_confirmed_nonce: 0, - }), - ); - let post_dispatch_weight = Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - proof.clone(), - messages_count, - REGULAR_PAYLOAD.declared_weight, - ) - .unwrap() - .actual_weight - .unwrap(); - assert_eq!(post_dispatch_weight.proof_size(), pre_dispatch_weight.proof_size()); - - // if count of unrewarded relayer entries is less than maximal, then some `proof_size` - // must be refunded - InboundLanes::::insert( - TEST_LANE_ID, - StoredInboundLaneData(InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: 42, - messages: DeliveredMessages { begin: 0, end: 100 } - }; - max_entries - 1 - ] - .into_iter() - .collect(), - last_confirmed_nonce: 0, - }), - ); - let post_dispatch_weight = Pallet::::receive_messages_proof( - RuntimeOrigin::signed(1), - TEST_RELAYER_A, - proof, - messages_count, - REGULAR_PAYLOAD.declared_weight, - ) - .unwrap() - .actual_weight - .unwrap(); - assert!( - post_dispatch_weight.proof_size() < pre_dispatch_weight.proof_size(), - "Expected post-dispatch PoV {} to be less than pre-dispatch PoV {}", - post_dispatch_weight.proof_size(), - pre_dispatch_weight.proof_size(), - ); - }); - } - - #[test] - fn messages_delivered_callbacks_are_called() { - run_test(|| { - send_regular_message(); - send_regular_message(); - send_regular_message(); - - // messages 1+2 are confirmed in 1 tx, message 3 in a separate tx - // dispatch of message 2 has failed - let mut delivered_messages_1_and_2 = DeliveredMessages::new(1); - delivered_messages_1_and_2.note_dispatched_message(); - let messages_1_and_2_proof = Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 0, - relayers: vec![UnrewardedRelayer { - relayer: 0, - messages: delivered_messages_1_and_2.clone(), - }] - .into_iter() - .collect(), - }, - )); - let delivered_message_3 = DeliveredMessages::new(3); - let messages_3_proof = Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 0, - relayers: vec![UnrewardedRelayer { relayer: 0, messages: delivered_message_3 }] - .into_iter() - .collect(), - }, - )); - - // first tx with messages 1+2 - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(messages_1_and_2_proof), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 2, - total_messages: 2, - last_delivered_nonce: 2, - }, - )); - // second tx with message 3 - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(messages_3_proof), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 3, - }, - )); - }); - } - - #[test] - fn receive_messages_delivery_proof_rejects_proof_if_trying_to_confirm_more_messages_than_expected( - ) { - run_test(|| { - // send message first to be able to check that delivery_proof fails later - send_regular_message(); - - // 1) InboundLaneData declares that the `last_confirmed_nonce` is 1; - // 2) InboundLaneData has no entries => `InboundLaneData::last_delivered_nonce()` - // returns `last_confirmed_nonce`; - // 3) it means that we're going to confirm delivery of messages 1..=1; - // 4) so the number of declared messages (see `UnrewardedRelayersState`) is `0` and - // numer of actually confirmed messages is `1`. - assert_noop!( - Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { last_confirmed_nonce: 1, relayers: Default::default() }, - ))), - UnrewardedRelayersState { last_delivered_nonce: 1, ..Default::default() }, - ), - Error::::ReceivalConfirmation( - ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected - ), - ); - }); - } - - #[test] - fn storage_keys_computed_properly() { - assert_eq!( - PalletOperatingMode::::storage_value_final_key().to_vec(), - bp_messages::storage_keys::operating_mode_key("Messages").0, - ); - - assert_eq!( - OutboundMessages::::storage_map_final_key(MessageKey { - lane_id: TEST_LANE_ID, - nonce: 42 - }), - bp_messages::storage_keys::message_key("Messages", &TEST_LANE_ID, 42).0, - ); - - assert_eq!( - OutboundLanes::::storage_map_final_key(TEST_LANE_ID), - bp_messages::storage_keys::outbound_lane_data_key("Messages", &TEST_LANE_ID).0, - ); - - assert_eq!( - InboundLanes::::storage_map_final_key(TEST_LANE_ID), - bp_messages::storage_keys::inbound_lane_data_key("Messages", &TEST_LANE_ID).0, - ); - } - - #[test] - fn inbound_message_details_works() { - run_test(|| { - assert_eq!( - Pallet::::inbound_message_data( - TEST_LANE_ID, - REGULAR_PAYLOAD.encode(), - OutboundMessageDetails { nonce: 0, dispatch_weight: Weight::zero(), size: 0 }, - ), - InboundMessageDetails { dispatch_weight: REGULAR_PAYLOAD.declared_weight }, - ); - }); - } - - #[test] - fn on_idle_callback_respects_remaining_weight() { - run_test(|| { - send_regular_message(); - send_regular_message(); - send_regular_message(); - send_regular_message(); - - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 4, - relayers: vec![unrewarded_relayer(1, 4, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 4, - total_messages: 4, - last_delivered_nonce: 4, - }, - )); - - // all 4 messages may be pruned now - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, - 4 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 1 - ); - System::::set_block_number(2); - - // if passed wight is too low to do anything - let dbw = DbWeight::get(); - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(1, 1)), - Weight::zero(), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 1 - ); - - // if passed wight is enough to prune single message - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(1, 2)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 2 - ); - - // if passed wight is enough to prune two more messages - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(1, 3)), - dbw.reads_writes(1, 3), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 4 - ); - - // if passed wight is enough to prune many messages - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(100, 100)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 5 - ); - }); - } - - #[test] - fn on_idle_callback_is_rotating_lanes_to_prune() { - run_test(|| { - // send + receive confirmation for lane 1 - send_regular_message(); - receive_messages_delivery_proof(); - // send + receive confirmation for lane 2 - assert_ok!(send_message::(TEST_LANE_ID_2, REGULAR_PAYLOAD,)); - assert_ok!(Pallet::::receive_messages_delivery_proof( - RuntimeOrigin::signed(1), - TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID_2, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] - .into_iter() - .collect(), - }, - ))), - UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }, - )); - - // nothing is pruned yet - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, - 1 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 1 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().latest_received_nonce, - 1 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, - 1 - ); - - // in block#2.on_idle lane messages of lane 1 are pruned - let dbw = DbWeight::get(); - System::::set_block_number(2); - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(100, 100)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 2 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, - 1 - ); - - // in block#3.on_idle lane messages of lane 2 are pruned - System::::set_block_number(3); - - assert_eq!( - Pallet::::on_idle(0, dbw.reads_writes(100, 100)), - dbw.reads_writes(1, 2), - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, - 2 - ); - assert_eq!( - outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, - 2 - ); - }); - } - - #[test] - fn outbound_message_from_unconfigured_lane_is_rejected() { - run_test(|| { - assert_noop!( - send_message::(TEST_LANE_ID_3, REGULAR_PAYLOAD,), - Error::::InactiveOutboundLane, - ); - }); - } - - #[test] - fn test_bridge_messages_call_is_correctly_defined() { - let account_id = 1; - let message_proof: TestMessagesProof = Ok(vec![message(1, REGULAR_PAYLOAD)]).into(); - let message_delivery_proof = TestMessagesDeliveryProof(Ok(( - TEST_LANE_ID, - InboundLaneData { - last_confirmed_nonce: 1, - relayers: vec![UnrewardedRelayer { - relayer: 0, - messages: DeliveredMessages::new(1), - }] - .into_iter() - .collect(), - }, - ))); - let unrewarded_relayer_state = UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 1, - last_delivered_nonce: 1, - ..Default::default() - }; - - let direct_receive_messages_proof_call = Call::::receive_messages_proof { - relayer_id_at_bridged_chain: account_id, - proof: message_proof.clone(), - messages_count: 1, - dispatch_weight: REGULAR_PAYLOAD.declared_weight, - }; - let indirect_receive_messages_proof_call = BridgeMessagesCall::< - AccountId, - TestMessagesProof, - TestMessagesDeliveryProof, - >::receive_messages_proof { - relayer_id_at_bridged_chain: account_id, - proof: message_proof, - messages_count: 1, - dispatch_weight: REGULAR_PAYLOAD.declared_weight, - }; - assert_eq!( - direct_receive_messages_proof_call.encode(), - indirect_receive_messages_proof_call.encode() - ); - - let direct_receive_messages_delivery_proof_call = - Call::::receive_messages_delivery_proof { - proof: message_delivery_proof.clone(), - relayers_state: unrewarded_relayer_state.clone(), - }; - let indirect_receive_messages_delivery_proof_call = BridgeMessagesCall::< - AccountId, - TestMessagesProof, - TestMessagesDeliveryProof, - >::receive_messages_delivery_proof { - proof: message_delivery_proof, - relayers_state: unrewarded_relayer_state, - }; - assert_eq!( - direct_receive_messages_delivery_proof_call.encode(), - indirect_receive_messages_delivery_proof_call.encode() - ); - } - - generate_owned_bridge_module_tests!( - MessagesOperatingMode::Basic(BasicOperatingMode::Normal), - MessagesOperatingMode::Basic(BasicOperatingMode::Halted) - ); - - #[test] - fn inbound_storage_extra_proof_size_bytes_works() { - fn relayer_entry() -> UnrewardedRelayer { - UnrewardedRelayer { relayer: 42u64, messages: DeliveredMessages { begin: 0, end: 100 } } - } - - fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage { - RuntimeInboundLaneStorage { - lane_id: Default::default(), - cached_data: Some(InboundLaneData { - relayers: vec![relayer_entry(); relayer_entries].into_iter().collect(), - last_confirmed_nonce: 0, - }), - _phantom: Default::default(), - } - } - - let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; - - // when we have exactly `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers - assert_eq!(storage(max_entries).extra_proof_size_bytes(), 0); - - // when we have less than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers - assert_eq!( - storage(max_entries - 1).extra_proof_size_bytes(), - relayer_entry().encode().len() as u64 - ); - assert_eq!( - storage(max_entries - 2).extra_proof_size_bytes(), - 2 * relayer_entry().encode().len() as u64 - ); - - // when we have more than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers - // (shall not happen in practice) - assert_eq!(storage(max_entries + 1).extra_proof_size_bytes(), 0); - } - - #[test] - fn maybe_outbound_lanes_count_returns_correct_value() { - assert_eq!( - MaybeOutboundLanesCount::::get(), - Some(mock::ActiveOutboundLanes::get().len() as u32) - ); - } -} diff --git a/cumulus/bridges/modules/messages/src/mock.rs b/cumulus/bridges/modules/messages/src/mock.rs deleted file mode 100644 index 67f7b78a487a..000000000000 --- a/cumulus/bridges/modules/messages/src/mock.rs +++ /dev/null @@ -1,526 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -// From construct_runtime macro -#![allow(clippy::from_over_into)] - -use crate::Config; - -use bp_messages::{ - calc_relayers_rewards, - source_chain::{ - DeliveryConfirmationPayments, LaneMessageVerifier, OnMessagesDelivered, TargetHeaderChain, - }, - target_chain::{ - DeliveryPayments, DispatchMessage, DispatchMessageData, MessageDispatch, - ProvedLaneMessages, ProvedMessages, SourceHeaderChain, - }, - DeliveredMessages, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, - OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, VerificationError, -}; -use bp_runtime::{messages::MessageDispatchResult, Size}; -use codec::{Decode, Encode}; -use frame_support::{ - parameter_types, - traits::ConstU64, - weights::{constants::RocksDbWeight, Weight}, -}; -use scale_info::TypeInfo; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, ConstU32, IdentityLookup}, - BuildStorage, Perbill, -}; -use std::{ - collections::{BTreeMap, VecDeque}, - ops::RangeInclusive, -}; - -pub type AccountId = u64; -pub type Balance = u64; -#[derive(Decode, Encode, Clone, Debug, PartialEq, Eq, TypeInfo)] -pub struct TestPayload { - /// Field that may be used to identify messages. - pub id: u64, - /// Reject this message by lane verifier? - pub reject_by_lane_verifier: bool, - /// Dispatch weight that is declared by the message sender. - pub declared_weight: Weight, - /// Message dispatch result. - /// - /// Note: in correct code `dispatch_result.unspent_weight` will always be <= `declared_weight`, - /// but for test purposes we'll be making it larger than `declared_weight` sometimes. - pub dispatch_result: MessageDispatchResult, - /// Extra bytes that affect payload size. - pub extra: Vec, -} -pub type TestMessageFee = u64; -pub type TestRelayer = u64; -pub type TestDispatchLevelResult = (); - -type Block = frame_system::mocking::MockBlock; - -use crate as pallet_bridge_messages; - -frame_support::construct_runtime! { - pub enum TestRuntime - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Balances: pallet_balances::{Pallet, Call, Event}, - Messages: pallet_bridge_messages::{Pallet, Call, Event}, - } -} - -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const MaximumBlockWeight: Weight = Weight::from_parts(1024, 0); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); -} - -pub type DbWeight = RocksDbWeight; - -impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = (); - type BlockLength = (); - type DbWeight = DbWeight; - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_balances::Config for TestRuntime { - type MaxLocks = (); - type Balance = Balance; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ConstU64<1>; - type AccountStore = frame_system::Pallet; - type WeightInfo = (); - type MaxReserves = (); - type ReserveIdentifier = (); - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - pub const MaxMessagesToPruneAtOnce: u64 = 10; - pub const MaxUnrewardedRelayerEntriesAtInboundLane: u64 = 16; - pub const MaxUnconfirmedMessagesAtInboundLane: u64 = 128; - pub const TestBridgedChainId: bp_runtime::ChainId = *b"test"; - pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID, TEST_LANE_ID_2]; -} - -/// weights of messages pallet calls we use in tests. -pub type TestWeightInfo = (); - -impl Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = TestWeightInfo; - type ActiveOutboundLanes = ActiveOutboundLanes; - type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; - - type MaximalOutboundPayloadSize = frame_support::traits::ConstU32; - type OutboundPayload = TestPayload; - - type InboundPayload = TestPayload; - type InboundRelayer = TestRelayer; - type DeliveryPayments = TestDeliveryPayments; - - type TargetHeaderChain = TestTargetHeaderChain; - type LaneMessageVerifier = TestLaneMessageVerifier; - type DeliveryConfirmationPayments = TestDeliveryConfirmationPayments; - type OnMessagesDelivered = TestOnMessagesDelivered; - - type SourceHeaderChain = TestSourceHeaderChain; - type MessageDispatch = TestMessageDispatch; - type BridgedChainId = TestBridgedChainId; -} - -#[cfg(feature = "runtime-benchmarks")] -impl crate::benchmarking::Config<()> for TestRuntime { - fn bench_lane_id() -> LaneId { - TEST_LANE_ID - } - - fn prepare_message_proof( - params: crate::benchmarking::MessageProofParams, - ) -> (TestMessagesProof, Weight) { - // in mock run we only care about benchmarks correctness, not the benchmark results - // => ignore size related arguments - let (messages, total_dispatch_weight) = - params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).fold( - (Vec::new(), Weight::zero()), - |(mut messages, total_dispatch_weight), message| { - let weight = REGULAR_PAYLOAD.declared_weight; - messages.push(message); - (messages, total_dispatch_weight.saturating_add(weight)) - }, - ); - let mut proof: TestMessagesProof = Ok(messages).into(); - proof.result.as_mut().unwrap().get_mut(0).unwrap().1.lane_state = params.outbound_lane_data; - (proof, total_dispatch_weight) - } - - fn prepare_message_delivery_proof( - params: crate::benchmarking::MessageDeliveryProofParams, - ) -> TestMessagesDeliveryProof { - // in mock run we only care about benchmarks correctness, not the benchmark results - // => ignore size related arguments - TestMessagesDeliveryProof(Ok((params.lane, params.inbound_lane_data))) - } - - fn is_relayer_rewarded(_relayer: &AccountId) -> bool { - true - } -} - -impl Size for TestPayload { - fn size(&self) -> u32 { - 16 + self.extra.len() as u32 - } -} - -/// Maximal outbound payload size. -pub const MAX_OUTBOUND_PAYLOAD_SIZE: u32 = 4096; - -/// Account that has balance to use in tests. -pub const ENDOWED_ACCOUNT: AccountId = 0xDEAD; - -/// Account id of test relayer. -pub const TEST_RELAYER_A: AccountId = 100; - -/// Account id of additional test relayer - B. -pub const TEST_RELAYER_B: AccountId = 101; - -/// Account id of additional test relayer - C. -pub const TEST_RELAYER_C: AccountId = 102; - -/// Error that is returned by all test implementations. -pub const TEST_ERROR: &str = "Test error"; - -/// Lane that we're using in tests. -pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 1]); - -/// Secondary lane that we're using in tests. -pub const TEST_LANE_ID_2: LaneId = LaneId([0, 0, 0, 2]); - -/// Inactive outbound lane. -pub const TEST_LANE_ID_3: LaneId = LaneId([0, 0, 0, 3]); - -/// Regular message payload. -pub const REGULAR_PAYLOAD: TestPayload = message_payload(0, 50); - -/// Payload that is rejected by `TestTargetHeaderChain`. -pub const PAYLOAD_REJECTED_BY_TARGET_CHAIN: TestPayload = message_payload(1, 50); - -/// Vec of proved messages, grouped by lane. -pub type MessagesByLaneVec = Vec<(LaneId, ProvedLaneMessages)>; - -/// Test messages proof. -#[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] -pub struct TestMessagesProof { - pub result: Result, -} - -impl Size for TestMessagesProof { - fn size(&self) -> u32 { - 0 - } -} - -impl From, ()>> for TestMessagesProof { - fn from(result: Result, ()>) -> Self { - Self { - result: result.map(|messages| { - let mut messages_by_lane: BTreeMap> = - BTreeMap::new(); - for message in messages { - messages_by_lane.entry(message.key.lane_id).or_default().messages.push(message); - } - messages_by_lane.into_iter().collect() - }), - } - } -} - -/// Messages delivery proof used in tests. -#[derive(Debug, Encode, Decode, Eq, Clone, PartialEq, TypeInfo)] -pub struct TestMessagesDeliveryProof(pub Result<(LaneId, InboundLaneData), ()>); - -impl Size for TestMessagesDeliveryProof { - fn size(&self) -> u32 { - 0 - } -} - -/// Target header chain that is used in tests. -#[derive(Debug, Default)] -pub struct TestTargetHeaderChain; - -impl TargetHeaderChain for TestTargetHeaderChain { - type MessagesDeliveryProof = TestMessagesDeliveryProof; - - fn verify_message(payload: &TestPayload) -> Result<(), VerificationError> { - if *payload == PAYLOAD_REJECTED_BY_TARGET_CHAIN { - Err(VerificationError::Other(TEST_ERROR)) - } else { - Ok(()) - } - } - - fn verify_messages_delivery_proof( - proof: Self::MessagesDeliveryProof, - ) -> Result<(LaneId, InboundLaneData), VerificationError> { - proof.0.map_err(|_| VerificationError::Other(TEST_ERROR)) - } -} - -/// Lane message verifier that is used in tests. -#[derive(Debug, Default)] -pub struct TestLaneMessageVerifier; - -impl LaneMessageVerifier for TestLaneMessageVerifier { - fn verify_message( - _lane: &LaneId, - _lane_outbound_data: &OutboundLaneData, - payload: &TestPayload, - ) -> Result<(), VerificationError> { - if !payload.reject_by_lane_verifier { - Ok(()) - } else { - Err(VerificationError::Other(TEST_ERROR)) - } - } -} - -/// Reward payments at the target chain during delivery transaction. -#[derive(Debug, Default)] -pub struct TestDeliveryPayments; - -impl TestDeliveryPayments { - /// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is - /// cleared after the call. - pub fn is_reward_paid(relayer: AccountId) -> bool { - let key = (b":delivery-relayer-reward:", relayer).encode(); - frame_support::storage::unhashed::take::(&key).is_some() - } -} - -impl DeliveryPayments for TestDeliveryPayments { - type Error = &'static str; - - fn pay_reward( - relayer: AccountId, - _total_messages: MessageNonce, - _valid_messages: MessageNonce, - _actual_weight: Weight, - ) { - let key = (b":delivery-relayer-reward:", relayer).encode(); - frame_support::storage::unhashed::put(&key, &true); - } -} - -/// Reward payments at the source chain during delivery confirmation transaction. -#[derive(Debug, Default)] -pub struct TestDeliveryConfirmationPayments; - -impl TestDeliveryConfirmationPayments { - /// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is - /// cleared after the call. - pub fn is_reward_paid(relayer: AccountId, fee: TestMessageFee) -> bool { - let key = (b":relayer-reward:", relayer, fee).encode(); - frame_support::storage::unhashed::take::(&key).is_some() - } -} - -impl DeliveryConfirmationPayments for TestDeliveryConfirmationPayments { - type Error = &'static str; - - fn pay_reward( - _lane_id: LaneId, - messages_relayers: VecDeque>, - _confirmation_relayer: &AccountId, - received_range: &RangeInclusive, - ) -> MessageNonce { - let relayers_rewards = calc_relayers_rewards(messages_relayers, received_range); - let rewarded_relayers = relayers_rewards.len(); - for (relayer, reward) in &relayers_rewards { - let key = (b":relayer-reward:", relayer, reward).encode(); - frame_support::storage::unhashed::put(&key, &true); - } - - rewarded_relayers as _ - } -} - -/// Source header chain that is used in tests. -#[derive(Debug)] -pub struct TestSourceHeaderChain; - -impl SourceHeaderChain for TestSourceHeaderChain { - type MessagesProof = TestMessagesProof; - - fn verify_messages_proof( - proof: Self::MessagesProof, - _messages_count: u32, - ) -> Result, VerificationError> { - proof - .result - .map(|proof| proof.into_iter().collect()) - .map_err(|_| VerificationError::Other(TEST_ERROR)) - } -} - -/// Test message dispatcher. -#[derive(Debug)] -pub struct TestMessageDispatch; - -impl TestMessageDispatch { - pub fn deactivate() { - frame_support::storage::unhashed::put(b"TestMessageDispatch.IsCongested", &true) - } -} - -impl MessageDispatch for TestMessageDispatch { - type DispatchPayload = TestPayload; - type DispatchLevelResult = TestDispatchLevelResult; - - fn is_active() -> bool { - !frame_support::storage::unhashed::get_or_default::( - b"TestMessageDispatch.IsCongested", - ) - } - - fn dispatch_weight(message: &mut DispatchMessage) -> Weight { - match message.data.payload.as_ref() { - Ok(payload) => payload.declared_weight, - Err(_) => Weight::zero(), - } - } - - fn dispatch( - message: DispatchMessage, - ) -> MessageDispatchResult { - match message.data.payload.as_ref() { - Ok(payload) => payload.dispatch_result.clone(), - Err(_) => dispatch_result(0), - } - } -} - -/// Test callback, called during message delivery confirmation transaction. -pub struct TestOnMessagesDelivered; - -impl TestOnMessagesDelivered { - pub fn call_arguments() -> Option<(LaneId, MessageNonce)> { - frame_support::storage::unhashed::get(b"TestOnMessagesDelivered.OnMessagesDelivered") - } -} - -impl OnMessagesDelivered for TestOnMessagesDelivered { - fn on_messages_delivered(lane: LaneId, enqueued_messages: MessageNonce) { - frame_support::storage::unhashed::put( - b"TestOnMessagesDelivered.OnMessagesDelivered", - &(lane, enqueued_messages), - ); - } -} - -/// Return test lane message with given nonce and payload. -pub fn message(nonce: MessageNonce, payload: TestPayload) -> Message { - Message { key: MessageKey { lane_id: TEST_LANE_ID, nonce }, payload: payload.encode() } -} - -/// Return valid outbound message data, constructed from given payload. -pub fn outbound_message_data(payload: TestPayload) -> MessagePayload { - payload.encode() -} - -/// Return valid inbound (dispatch) message data, constructed from given payload. -pub fn inbound_message_data(payload: TestPayload) -> DispatchMessageData { - DispatchMessageData { payload: Ok(payload) } -} - -/// Constructs message payload using given arguments and zero unspent weight. -pub const fn message_payload(id: u64, declared_weight: u64) -> TestPayload { - TestPayload { - id, - reject_by_lane_verifier: false, - declared_weight: Weight::from_parts(declared_weight, 0), - dispatch_result: dispatch_result(0), - extra: Vec::new(), - } -} - -/// Returns message dispatch result with given unspent weight. -pub const fn dispatch_result( - unspent_weight: u64, -) -> MessageDispatchResult { - MessageDispatchResult { - unspent_weight: Weight::from_parts(unspent_weight, 0), - dispatch_level_result: (), - } -} - -/// Constructs unrewarded relayer entry from nonces range and relayer id. -pub fn unrewarded_relayer( - begin: MessageNonce, - end: MessageNonce, - relayer: TestRelayer, -) -> UnrewardedRelayer { - UnrewardedRelayer { relayer, messages: DeliveredMessages { begin, end } } -} - -/// Returns unrewarded relayers state at given lane. -pub fn inbound_unrewarded_relayers_state(lane: bp_messages::LaneId) -> UnrewardedRelayersState { - let inbound_lane_data = crate::InboundLanes::::get(lane).0; - UnrewardedRelayersState::from(&inbound_lane_data) -} - -/// Return test externalities to use in tests. -pub fn new_test_ext() -> sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - pallet_balances::GenesisConfig:: { balances: vec![(ENDOWED_ACCOUNT, 1_000_000)] } - .assimilate_storage(&mut t) - .unwrap(); - sp_io::TestExternalities::new(t) -} - -/// Run pallet test. -pub fn run_test(test: impl FnOnce() -> T) -> T { - new_test_ext().execute_with(test) -} diff --git a/cumulus/bridges/modules/messages/src/weights.rs b/cumulus/bridges/modules/messages/src/weights.rs deleted file mode 100644 index 9880f1dd1ea3..000000000000 --- a/cumulus/bridges/modules/messages/src/weights.rs +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Autogenerated weights for RialtoMessages -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 - -// Executed Command: -// target/release/millau-bridge-node -// benchmark -// pallet -// --chain=dev -// --steps=50 -// --repeat=20 -// --pallet=RialtoMessages -// --extrinsic=* -// --execution=wasm -// --wasm-execution=Compiled -// --heap-pages=4096 -// --output=./modules/messages/src/weights.rs -// --template=./.maintain/bridge-weight-template.hbs - -#![allow(clippy::all)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for RialtoMessages. -pub trait WeightInfo { - fn receive_single_message_proof() -> Weight; - fn receive_two_messages_proof() -> Weight; - fn receive_single_message_proof_with_outbound_lane_state() -> Weight; - fn receive_single_message_proof_1_kb() -> Weight; - fn receive_single_message_proof_16_kb() -> Weight; - fn receive_delivery_proof_for_single_message() -> Weight; - fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight; - fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight; - fn receive_single_message_proof_with_dispatch(i: u32) -> Weight; -} - -/// Weights for `RialtoMessages` that are generated using one of the Bridge testnets. -/// -/// Those weights are test only and must never be used in production. -pub struct BridgeWeight(PhantomData); -impl WeightInfo for BridgeWeight { - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_321 nanoseconds. - Weight::from_parts(54_478_000, 57170) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_two_messages_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_597 nanoseconds. - Weight::from_parts(69_267_000, 57170) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_with_outbound_lane_state() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_079 nanoseconds. - Weight::from_parts(65_905_000, 57170) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 50_588 nanoseconds. - Weight::from_parts(53_544_000, 57170) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_16_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 78_269 nanoseconds. - Weight::from_parts(81_748_000, 57170) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: - /// 539, mode: MaxEncodedLen) - /// - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn receive_delivery_proof_for_single_message() -> Weight { - // Proof Size summary in bytes: - // Measured: `579` - // Estimated: `9584` - // Minimum execution time: 45_786 nanoseconds. - Weight::from_parts(47_382_000, 9584) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: - /// 539, mode: MaxEncodedLen) - /// - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { - // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `9584` - // Minimum execution time: 44_544 nanoseconds. - Weight::from_parts(45_451_000, 9584) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: - /// 539, mode: MaxEncodedLen) - /// - /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { - // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `12124` - // Minimum execution time: 47_344 nanoseconds. - Weight::from_parts(48_311_000, 12124) - .saturating_add(T::DbWeight::get().reads(5_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - /// - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_385 nanoseconds. - Weight::from_parts(54_919_468, 57170) - // Standard Error: 108 - .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } -} - -// For backwards compatibility and tests -impl WeightInfo for () { - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_321 nanoseconds. - Weight::from_parts(54_478_000, 57170) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_two_messages_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_597 nanoseconds. - Weight::from_parts(69_267_000, 57170) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_with_outbound_lane_state() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 64_079 nanoseconds. - Weight::from_parts(65_905_000, 57170) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 50_588 nanoseconds. - Weight::from_parts(53_544_000, 57170) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_16_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 78_269 nanoseconds. - Weight::from_parts(81_748_000, 57170) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: - /// 539, mode: MaxEncodedLen) - /// - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn receive_delivery_proof_for_single_message() -> Weight { - // Proof Size summary in bytes: - // Measured: `579` - // Estimated: `9584` - // Minimum execution time: 45_786 nanoseconds. - Weight::from_parts(47_382_000, 9584) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: - /// 539, mode: MaxEncodedLen) - /// - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { - // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `9584` - // Minimum execution time: 44_544 nanoseconds. - Weight::from_parts(45_451_000, 9584) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages OutboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: - /// 539, mode: MaxEncodedLen) - /// - /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { - // Proof Size summary in bytes: - // Measured: `596` - // Estimated: `12124` - // Minimum execution time: 47_344 nanoseconds. - Weight::from_parts(48_311_000, 12124) - .saturating_add(RocksDbWeight::get().reads(5_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRialtoMessages PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), - /// added: 497, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoMessages InboundLanes (r:1 w:1) - /// - /// Proof: BridgeRialtoMessages InboundLanes (max_values: None, max_size: Some(49180), added: - /// 51655, mode: MaxEncodedLen) - /// - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `618` - // Estimated: `57170` - // Minimum execution time: 52_385 nanoseconds. - Weight::from_parts(54_919_468, 57170) - // Standard Error: 108 - .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } -} diff --git a/cumulus/bridges/modules/messages/src/weights_ext.rs b/cumulus/bridges/modules/messages/src/weights_ext.rs deleted file mode 100644 index 3aefd6be7ca7..000000000000 --- a/cumulus/bridges/modules/messages/src/weights_ext.rs +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Weight-related utilities. - -use crate::weights::WeightInfo; - -use bp_messages::{MessageNonce, UnrewardedRelayersState}; -use bp_runtime::{PreComputedSize, Size}; -use frame_support::weights::Weight; - -/// Size of the message being delivered in benchmarks. -pub const EXPECTED_DEFAULT_MESSAGE_LENGTH: u32 = 128; - -/// We assume that size of signed extensions on all our chains and size of all 'small' arguments of -/// calls we're checking here would fit 1KB. -const SIGNED_EXTENSIONS_SIZE: u32 = 1024; - -/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at -/// Rialto chain. This mostly depends on number of entries (and their density) in the storage trie. -/// Some reserve is reserved to account future chain growth. -pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; - -/// Ensure that weights from `WeightInfoExt` implementation are looking correct. -pub fn ensure_weights_are_correct() { - // all components of weight formulae must have zero `proof_size`, because the `proof_size` is - // benchmarked using `MaxEncodedLen` approach and there are no components that cause additional - // db reads - - // verify `receive_messages_proof` weight components - assert_ne!(W::receive_messages_proof_overhead().ref_time(), 0); - assert_ne!(W::receive_messages_proof_overhead().proof_size(), 0); - // W::receive_messages_proof_messages_overhead(1).ref_time() may be zero because: - // the message processing code (`InboundLane::receive_message`) is minimal and may not be - // accounted by our benchmarks - assert_eq!(W::receive_messages_proof_messages_overhead(1).proof_size(), 0); - // W::receive_messages_proof_outbound_lane_state_overhead().ref_time() may be zero because: - // the outbound lane state processing code (`InboundLane::receive_state_update`) is minimal and - // may not be accounted by our benchmarks - assert_eq!(W::receive_messages_proof_outbound_lane_state_overhead().proof_size(), 0); - assert_ne!(W::storage_proof_size_overhead(1).ref_time(), 0); - assert_eq!(W::storage_proof_size_overhead(1).proof_size(), 0); - - // verify `receive_messages_delivery_proof` weight components - assert_ne!(W::receive_messages_delivery_proof_overhead().ref_time(), 0); - assert_ne!(W::receive_messages_delivery_proof_overhead().proof_size(), 0); - // W::receive_messages_delivery_proof_messages_overhead(1).ref_time() may be zero because: - // there's no code that iterates over confirmed messages in confirmation transaction - assert_eq!(W::receive_messages_delivery_proof_messages_overhead(1).proof_size(), 0); - assert_ne!(W::receive_messages_delivery_proof_relayers_overhead(1).ref_time(), 0); - // W::receive_messages_delivery_proof_relayers_overhead(1).proof_size() is an exception - // it may or may not cause additional db reads, so proof size may vary - assert_ne!(W::storage_proof_size_overhead(1).ref_time(), 0); - assert_eq!(W::storage_proof_size_overhead(1).proof_size(), 0); - - // verify `receive_message_proof` weight - let receive_messages_proof_weight = - W::receive_messages_proof_weight(&PreComputedSize(1), 10, Weight::zero()); - assert_ne!(receive_messages_proof_weight.ref_time(), 0); - assert_ne!(receive_messages_proof_weight.proof_size(), 0); - messages_proof_size_does_not_affect_proof_size::(); - messages_count_does_not_affect_proof_size::(); - - // verify `receive_message_proof` weight - let receive_messages_delivery_proof_weight = W::receive_messages_delivery_proof_weight( - &PreComputedSize(1), - &UnrewardedRelayersState::default(), - ); - assert_ne!(receive_messages_delivery_proof_weight.ref_time(), 0); - assert_ne!(receive_messages_delivery_proof_weight.proof_size(), 0); - messages_delivery_proof_size_does_not_affect_proof_size::(); - total_messages_in_delivery_proof_does_not_affect_proof_size::(); -} - -/// Ensure that we're able to receive maximal (by-size and by-weight) message from other chain. -pub fn ensure_able_to_receive_message( - max_extrinsic_size: u32, - max_extrinsic_weight: Weight, - max_incoming_message_proof_size: u32, - max_incoming_message_dispatch_weight: Weight, -) { - // verify that we're able to receive proof of maximal-size message - let max_delivery_transaction_size = - max_incoming_message_proof_size.saturating_add(SIGNED_EXTENSIONS_SIZE); - assert!( - max_delivery_transaction_size <= max_extrinsic_size, - "Size of maximal message delivery transaction {max_incoming_message_proof_size} + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", - ); - - // verify that we're able to receive proof of maximal-size message with maximal dispatch weight - let max_delivery_transaction_dispatch_weight = W::receive_messages_proof_weight( - &PreComputedSize( - (max_incoming_message_proof_size + W::expected_extra_storage_proof_size()) as usize, - ), - 1, - max_incoming_message_dispatch_weight, - ); - assert!( - max_delivery_transaction_dispatch_weight.all_lte(max_extrinsic_weight), - "Weight of maximal message delivery transaction + {max_delivery_transaction_dispatch_weight} is larger than maximal possible transaction weight {max_extrinsic_weight}", - ); -} - -/// Ensure that we're able to receive maximal confirmation from other chain. -pub fn ensure_able_to_receive_confirmation( - max_extrinsic_size: u32, - max_extrinsic_weight: Weight, - max_inbound_lane_data_proof_size_from_peer_chain: u32, - max_unrewarded_relayer_entries_at_peer_inbound_lane: MessageNonce, - max_unconfirmed_messages_at_inbound_lane: MessageNonce, -) { - // verify that we're able to receive confirmation of maximal-size - let max_confirmation_transaction_size = - max_inbound_lane_data_proof_size_from_peer_chain.saturating_add(SIGNED_EXTENSIONS_SIZE); - assert!( - max_confirmation_transaction_size <= max_extrinsic_size, - "Size of maximal message delivery confirmation transaction {max_inbound_lane_data_proof_size_from_peer_chain} + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", - ); - - // verify that we're able to reward maximal number of relayers that have delivered maximal - // number of messages - let max_confirmation_transaction_dispatch_weight = W::receive_messages_delivery_proof_weight( - &PreComputedSize(max_inbound_lane_data_proof_size_from_peer_chain as usize), - &UnrewardedRelayersState { - unrewarded_relayer_entries: max_unrewarded_relayer_entries_at_peer_inbound_lane, - total_messages: max_unconfirmed_messages_at_inbound_lane, - ..Default::default() - }, - ); - assert!( - max_confirmation_transaction_dispatch_weight.all_lte(max_extrinsic_weight), - "Weight of maximal confirmation transaction {max_confirmation_transaction_dispatch_weight} is larger than maximal possible transaction weight {max_extrinsic_weight}", - ); -} - -/// Panics if `proof_size` of message delivery call depends on the message proof size. -fn messages_proof_size_does_not_affect_proof_size() { - let dispatch_weight = Weight::zero(); - let weight_when_proof_size_is_8k = - W::receive_messages_proof_weight(&PreComputedSize(8 * 1024), 1, dispatch_weight); - let weight_when_proof_size_is_16k = - W::receive_messages_proof_weight(&PreComputedSize(16 * 1024), 1, dispatch_weight); - - ensure_weight_components_are_not_zero(weight_when_proof_size_is_8k); - ensure_weight_components_are_not_zero(weight_when_proof_size_is_16k); - ensure_proof_size_is_the_same( - weight_when_proof_size_is_8k, - weight_when_proof_size_is_16k, - "Messages proof size does not affect values that we read from our storage", - ); -} - -/// Panics if `proof_size` of message delivery call depends on the messages count. -/// -/// In practice, it will depend on the messages count, because most probably every -/// message will read something from db during dispatch. But this must be accounted -/// by the `dispatch_weight`. -fn messages_count_does_not_affect_proof_size() { - let messages_proof_size = PreComputedSize(8 * 1024); - let dispatch_weight = Weight::zero(); - let weight_of_one_incoming_message = - W::receive_messages_proof_weight(&messages_proof_size, 1, dispatch_weight); - let weight_of_two_incoming_messages = - W::receive_messages_proof_weight(&messages_proof_size, 2, dispatch_weight); - - ensure_weight_components_are_not_zero(weight_of_one_incoming_message); - ensure_weight_components_are_not_zero(weight_of_two_incoming_messages); - ensure_proof_size_is_the_same( - weight_of_one_incoming_message, - weight_of_two_incoming_messages, - "Number of same-lane incoming messages does not affect values that we read from our storage", - ); -} - -/// Panics if `proof_size` of delivery confirmation call depends on the delivery proof size. -fn messages_delivery_proof_size_does_not_affect_proof_size() { - let relayers_state = UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1, - last_delivered_nonce: 1, - }; - let weight_when_proof_size_is_8k = - W::receive_messages_delivery_proof_weight(&PreComputedSize(8 * 1024), &relayers_state); - let weight_when_proof_size_is_16k = - W::receive_messages_delivery_proof_weight(&PreComputedSize(16 * 1024), &relayers_state); - - ensure_weight_components_are_not_zero(weight_when_proof_size_is_8k); - ensure_weight_components_are_not_zero(weight_when_proof_size_is_16k); - ensure_proof_size_is_the_same( - weight_when_proof_size_is_8k, - weight_when_proof_size_is_16k, - "Messages delivery proof size does not affect values that we read from our storage", - ); -} - -/// Panics if `proof_size` of delivery confirmation call depends on the number of confirmed -/// messages. -fn total_messages_in_delivery_proof_does_not_affect_proof_size() { - let proof_size = PreComputedSize(8 * 1024); - let weight_when_1k_messages_confirmed = W::receive_messages_delivery_proof_weight( - &proof_size, - &UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 1024, - last_delivered_nonce: 1, - }, - ); - let weight_when_2k_messages_confirmed = W::receive_messages_delivery_proof_weight( - &proof_size, - &UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - messages_in_oldest_entry: 1, - total_messages: 2048, - last_delivered_nonce: 1, - }, - ); - - ensure_weight_components_are_not_zero(weight_when_1k_messages_confirmed); - ensure_weight_components_are_not_zero(weight_when_2k_messages_confirmed); - ensure_proof_size_is_the_same( - weight_when_1k_messages_confirmed, - weight_when_2k_messages_confirmed, - "More messages in delivery proof does not affect values that we read from our storage", - ); -} - -/// Panics if either Weight' `proof_size` or `ref_time` are zero. -fn ensure_weight_components_are_not_zero(weight: Weight) { - assert_ne!(weight.ref_time(), 0); - assert_ne!(weight.proof_size(), 0); -} - -/// Panics if `proof_size` of `weight1` is not equal to `proof_size` of `weight2`. -fn ensure_proof_size_is_the_same(weight1: Weight, weight2: Weight, msg: &str) { - assert_eq!( - weight1.proof_size(), - weight2.proof_size(), - "{msg}: {} must be equal to {}", - weight1.proof_size(), - weight2.proof_size(), - ); -} - -/// Extended weight info. -pub trait WeightInfoExt: WeightInfo { - /// Size of proof that is already included in the single message delivery weight. - /// - /// The message submitter (at source chain) has already covered this cost. But there are two - /// factors that may increase proof size: (1) the message size may be larger than predefined - /// and (2) relayer may add extra trie nodes to the proof. So if proof size is larger than - /// this value, we're going to charge relayer for that. - fn expected_extra_storage_proof_size() -> u32; - - // Our configuration assumes that the runtime has special signed extensions used to: - // - // 1) reject obsolete delivery and confirmation transactions; - // - // 2) refund transaction cost to relayer and register his rewards. - // - // The checks in (1) are trivial, so its computation weight may be ignored. And we only touch - // storage values that are read during the call. So we may ignore the weight of this check. - // - // However, during (2) we read and update storage values of other pallets - // (`pallet-bridge-relayers` and balances/assets pallet). So we need to add this weight to the - // weight of our call. Hence two following methods. - - /// Extra weight that is added to the `receive_messages_proof` call weight by signed extensions - /// that are declared at runtime level. - fn receive_messages_proof_overhead_from_runtime() -> Weight; - - /// Extra weight that is added to the `receive_messages_delivery_proof` call weight by signed - /// extensions that are declared at runtime level. - fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight; - - // Functions that are directly mapped to extrinsics weights. - - /// Weight of message delivery extrinsic. - fn receive_messages_proof_weight( - proof: &impl Size, - messages_count: u32, - dispatch_weight: Weight, - ) -> Weight { - // basic components of extrinsic weight - let transaction_overhead = Self::receive_messages_proof_overhead(); - let transaction_overhead_from_runtime = - Self::receive_messages_proof_overhead_from_runtime(); - let outbound_state_delivery_weight = - Self::receive_messages_proof_outbound_lane_state_overhead(); - let messages_delivery_weight = - Self::receive_messages_proof_messages_overhead(MessageNonce::from(messages_count)); - let messages_dispatch_weight = dispatch_weight; - - // proof size overhead weight - let expected_proof_size = EXPECTED_DEFAULT_MESSAGE_LENGTH - .saturating_mul(messages_count.saturating_sub(1)) - .saturating_add(Self::expected_extra_storage_proof_size()); - let actual_proof_size = proof.size(); - let proof_size_overhead = Self::storage_proof_size_overhead( - actual_proof_size.saturating_sub(expected_proof_size), - ); - - transaction_overhead - .saturating_add(transaction_overhead_from_runtime) - .saturating_add(outbound_state_delivery_weight) - .saturating_add(messages_delivery_weight) - .saturating_add(messages_dispatch_weight) - .saturating_add(proof_size_overhead) - } - - /// Weight of confirmation delivery extrinsic. - fn receive_messages_delivery_proof_weight( - proof: &impl Size, - relayers_state: &UnrewardedRelayersState, - ) -> Weight { - // basic components of extrinsic weight - let transaction_overhead = Self::receive_messages_delivery_proof_overhead(); - let transaction_overhead_from_runtime = - Self::receive_messages_delivery_proof_overhead_from_runtime(); - let messages_overhead = - Self::receive_messages_delivery_proof_messages_overhead(relayers_state.total_messages); - let relayers_overhead = Self::receive_messages_delivery_proof_relayers_overhead( - relayers_state.unrewarded_relayer_entries, - ); - - // proof size overhead weight - let expected_proof_size = Self::expected_extra_storage_proof_size(); - let actual_proof_size = proof.size(); - let proof_size_overhead = Self::storage_proof_size_overhead( - actual_proof_size.saturating_sub(expected_proof_size), - ); - - transaction_overhead - .saturating_add(transaction_overhead_from_runtime) - .saturating_add(messages_overhead) - .saturating_add(relayers_overhead) - .saturating_add(proof_size_overhead) - } - - // Functions that are used by extrinsics weights formulas. - - /// Returns weight overhead of message delivery transaction (`receive_messages_proof`). - fn receive_messages_proof_overhead() -> Weight { - let weight_of_two_messages_and_two_tx_overheads = - Self::receive_single_message_proof().saturating_mul(2); - let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); - weight_of_two_messages_and_two_tx_overheads - .saturating_sub(weight_of_two_messages_and_single_tx_overhead) - } - - /// Returns weight that needs to be accounted when receiving given a number of messages with - /// message delivery transaction (`receive_messages_proof`). - fn receive_messages_proof_messages_overhead(messages: MessageNonce) -> Weight { - let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); - let weight_of_single_message_and_single_tx_overhead = Self::receive_single_message_proof(); - weight_of_two_messages_and_single_tx_overhead - .saturating_sub(weight_of_single_message_and_single_tx_overhead) - .saturating_mul(messages as _) - } - - /// Returns weight that needs to be accounted when message delivery transaction - /// (`receive_messages_proof`) is carrying outbound lane state proof. - fn receive_messages_proof_outbound_lane_state_overhead() -> Weight { - let weight_of_single_message_and_lane_state = - Self::receive_single_message_proof_with_outbound_lane_state(); - let weight_of_single_message = Self::receive_single_message_proof(); - weight_of_single_message_and_lane_state.saturating_sub(weight_of_single_message) - } - - /// Returns weight overhead of delivery confirmation transaction - /// (`receive_messages_delivery_proof`). - fn receive_messages_delivery_proof_overhead() -> Weight { - let weight_of_two_messages_and_two_tx_overheads = - Self::receive_delivery_proof_for_single_message().saturating_mul(2); - let weight_of_two_messages_and_single_tx_overhead = - Self::receive_delivery_proof_for_two_messages_by_single_relayer(); - weight_of_two_messages_and_two_tx_overheads - .saturating_sub(weight_of_two_messages_and_single_tx_overhead) - } - - /// Returns weight that needs to be accounted when receiving confirmations for given a number of - /// messages with delivery confirmation transaction (`receive_messages_delivery_proof`). - fn receive_messages_delivery_proof_messages_overhead(messages: MessageNonce) -> Weight { - let weight_of_two_messages = - Self::receive_delivery_proof_for_two_messages_by_single_relayer(); - let weight_of_single_message = Self::receive_delivery_proof_for_single_message(); - weight_of_two_messages - .saturating_sub(weight_of_single_message) - .saturating_mul(messages as _) - } - - /// Returns weight that needs to be accounted when receiving confirmations for given a number of - /// relayers entries with delivery confirmation transaction (`receive_messages_delivery_proof`). - fn receive_messages_delivery_proof_relayers_overhead(relayers: MessageNonce) -> Weight { - let weight_of_two_messages_by_two_relayers = - Self::receive_delivery_proof_for_two_messages_by_two_relayers(); - let weight_of_two_messages_by_single_relayer = - Self::receive_delivery_proof_for_two_messages_by_single_relayer(); - weight_of_two_messages_by_two_relayers - .saturating_sub(weight_of_two_messages_by_single_relayer) - .saturating_mul(relayers as _) - } - - /// Returns weight that needs to be accounted when storage proof of given size is received - /// (either in `receive_messages_proof` or `receive_messages_delivery_proof`). - /// - /// **IMPORTANT**: this overhead is already included in the 'base' transaction cost - e.g. proof - /// size depends on messages count or number of entries in the unrewarded relayers set. So this - /// shouldn't be added to cost of transaction, but instead should act as a minimal cost that the - /// relayer must pay when it relays proof of given size (even if cost based on other parameters - /// is less than that cost). - fn storage_proof_size_overhead(proof_size: u32) -> Weight { - let proof_size_in_bytes = proof_size; - let byte_weight = (Self::receive_single_message_proof_16_kb() - - Self::receive_single_message_proof_1_kb()) / - (15 * 1024); - proof_size_in_bytes * byte_weight - } - - // Functions that may be used by runtime developers. - - /// Returns dispatch weight of message of given size. - /// - /// This function would return correct value only if your runtime is configured to run - /// `receive_single_message_proof_with_dispatch` benchmark. See its requirements for - /// details. - fn message_dispatch_weight(message_size: u32) -> Weight { - // There may be a tiny overweight/underweight here, because we don't account how message - // size affects all steps before dispatch. But the effect should be small enough and we - // may ignore it. - Self::receive_single_message_proof_with_dispatch(message_size) - .saturating_sub(Self::receive_single_message_proof()) - } -} - -impl WeightInfoExt for () { - fn expected_extra_storage_proof_size() -> u32 { - EXTRA_STORAGE_PROOF_SIZE - } - - fn receive_messages_proof_overhead_from_runtime() -> Weight { - Weight::zero() - } - - fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { - Weight::zero() - } -} - -impl WeightInfoExt for crate::weights::BridgeWeight { - fn expected_extra_storage_proof_size() -> u32 { - EXTRA_STORAGE_PROOF_SIZE - } - - fn receive_messages_proof_overhead_from_runtime() -> Weight { - Weight::zero() - } - - fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { - Weight::zero() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{mock::TestRuntime, weights::BridgeWeight}; - - #[test] - fn ensure_default_weights_are_correct() { - ensure_weights_are_correct::>(); - } -} diff --git a/cumulus/bridges/modules/parachains/Cargo.toml b/cumulus/bridges/modules/parachains/Cargo.toml deleted file mode 100644 index 3e8d00511d53..000000000000 --- a/cumulus/bridges/modules/parachains/Cargo.toml +++ /dev/null @@ -1,60 +0,0 @@ -[package] -name = "pallet-bridge-parachains" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Bridge Dependencies - -bp-header-chain = { path = "../../primitives/header-chain", default-features = false } -bp-parachains = { path = "../../primitives/parachains", default-features = false } -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -pallet-bridge-grandpa = { path = "../grandpa", default-features = false } - -# Substrate Dependencies - -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[dev-dependencies] -bp-header-chain = { path = "../../primitives/header-chain" } -bp-test-utils = { path = "../../primitives/test-utils" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-parachains/std", - "bp-polkadot-core/std", - "bp-runtime/std", - "codec/std", - "frame-support/std", - "frame-system/std", - "frame-benchmarking/std", - "log/std", - "pallet-bridge-grandpa/std", - "scale-info/std", - "sp-runtime/std", - "sp-std/std", - "sp-trie/std", -] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", -] -try-runtime = [ - "frame-support/try-runtime", - "frame-system/try-runtime", -] diff --git a/cumulus/bridges/modules/parachains/README.md b/cumulus/bridges/modules/parachains/README.md deleted file mode 100644 index 5982c65ad316..000000000000 --- a/cumulus/bridges/modules/parachains/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# Bridge Parachains Pallet - -The bridge parachains pallet is a light client for one or several parachains of the bridged relay chain. -It serves as a source of finalized parachain headers and is used when you need to build a bridge with -a parachain. - -The pallet requires [bridge GRANDPA pallet](../grandpa/) to be deployed at the same chain - it is used -to verify storage proofs, generated at the bridged relay chain. - -## A Brief Introduction into Parachains Finality - -You can find detailed information on parachains finality in the [Polkadot](https://github.com/paritytech/polkadot) -and [Cumulus](https://github.com/paritytech/cumulus) repositories. This section gives a brief overview of how -the parachain finality works and how to build a light client for a parachain. - -The main thing there is that the parachain generates blocks on its own, but it can't achieve finality without -help of its relay chain. Instead, the parachain collators create a block and hand it over to the relay chain -validators. Validators validate the block and register the new parachain head in the -[`Heads` map](https://github.com/paritytech/polkadot/blob/88013730166ba90745ae7c9eb3e0c1be1513c7cc/runtime/parachains/src/paras/mod.rs#L645) -of the [`paras`](https://github.com/paritytech/polkadot/tree/master/runtime/parachains/src/paras) pallet, -deployed at the relay chain. Keep in mind that this pallet, deployed at a relay chain, is **NOT** a bridge pallet, -even though the names are similar. - -And what the bridge parachains pallet does, is simply verifying storage proofs of parachain heads within that -`Heads` map. It does that using relay chain header, that has been previously imported by the -[bridge GRANDPA pallet](../grandpa/). Once the proof is verified, the pallet knows that the given parachain -header has been finalized by the relay chain. The parachain header fields may then be used to verify storage -proofs, coming from the parachain. This allows the pallet to be used e.g. as a source of finality for the messages -pallet. - -## Pallet Operations - -The main entrypoint of the pallet is the `submit_parachain_heads` call. It has three arguments: - -- storage proof of parachain heads from the `Heads` map; - -- parachain identifiers and hashes of their heads from the storage proof; - -- the relay block, at which the storage proof has been generated. - -The pallet may track multiple parachains. And the parachains may use different primitives - one may use 128-bit block -numbers, other - 32-bit. To avoid extra decode operations, the pallet is using relay chain block number to order -parachain headers. Any finalized descendant of finalized relay block `RB`, which has parachain block `PB` in -its `Heads` map, is guaranteed to have either `PB`, or its descendant. So parachain block number grows with relay -block number. - -The pallet may reject parachain head if it already knows better (or the same) head. In addition, pallet rejects -heads of untracked parachains. - -The pallet doesn't track anything behind parachain heads. So it requires no initialization - it is ready to accept -headers right after deployment. - -## Non-Essential Functionality - -There may be a special account in every runtime where the bridge parachains module is deployed. This -account, named 'module owner', is like a module-level sudo account - he's able to halt and -resume all module operations without requiring runtime upgrade. Calls that are related to this -account are: - -- `fn set_owner()`: current module owner may call it to transfer "ownership" to another account; - -- `fn set_operating_mode()`: the module owner (or sudo account) may call this function to stop all - module operations. After this call, all finality proofs will be rejected until further `set_operating_mode` call'. - This call may be used when something extraordinary happens with the bridge. - -If pallet owner is not defined, the governance may be used to make those calls. - -## Signed Extension to Reject Obsolete Headers - -It'd be better for anyone (for chain and for submitters) to reject all transactions that are submitting -already known parachain heads to the pallet. This way, we leave block space to other useful transactions and -we don't charge concurrent submitters for their honest actions. - -To deal with that, we have a [signed extension](./src/call_ext) that may be added to the runtime. -It does exactly what is required - rejects all transactions with already known heads. The submitter -pays nothing for such transactions - they're simply removed from the transaction pool, when the block -is built. - -The signed extension, however, is a bit limited - it only works with transactions that provide single -parachain head. So it won't work with multiple parachain heads transactions. This fits our needs -for [Kusama <> Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md). If you need to deal -with other transaction formats, you may implement similar extension for your runtime. - -You may also take a look at the [`generate_bridge_reject_obsolete_headers_and_messages`](../../bin/runtime-common/src/lib.rs) -macro that bundles several similar signed extensions in a single one. - -## Parachains Finality Relay - -We have an offchain actor, who is watching for new parachain heads and submits them to the bridged chain. -It is the parachains relay - you may look at the [crate level documentation and the code](../../relays/parachains/). diff --git a/cumulus/bridges/modules/parachains/src/benchmarking.rs b/cumulus/bridges/modules/parachains/src/benchmarking.rs deleted file mode 100644 index 59c4642cde99..000000000000 --- a/cumulus/bridges/modules/parachains/src/benchmarking.rs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Parachains finality pallet benchmarking. - -use crate::{ - weights_ext::DEFAULT_PARACHAIN_HEAD_SIZE, Call, RelayBlockHash, RelayBlockHasher, - RelayBlockNumber, -}; - -use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; -use bp_runtime::StorageProofSize; -use frame_benchmarking::{account, benchmarks_instance_pallet}; -use frame_system::RawOrigin; -use sp_std::prelude::*; - -/// Pallet we're benchmarking here. -pub struct Pallet, I: 'static = ()>(crate::Pallet); - -/// Trait that must be implemented by runtime to benchmark the parachains finality pallet. -pub trait Config: crate::Config { - /// Returns vector of supported parachains. - fn parachains() -> Vec; - /// Generate parachain heads proof and prepare environment for verifying this proof. - fn prepare_parachain_heads_proof( - parachains: &[ParaId], - parachain_head_size: u32, - proof_size: StorageProofSize, - ) -> (RelayBlockNumber, RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>); -} - -benchmarks_instance_pallet! { - where_clause { - where - >::BridgedChain: - bp_runtime::Chain< - BlockNumber = RelayBlockNumber, - Hash = RelayBlockHash, - Hasher = RelayBlockHasher, - >, - } - - // Benchmark `submit_parachain_heads` extrinsic with different number of parachains. - submit_parachain_heads_with_n_parachains { - let p in 1..(T::parachains().len() + 1) as u32; - - let sender = account("sender", 0, 0); - let mut parachains = T::parachains(); - let _ = if p <= parachains.len() as u32 { - parachains.split_off(p as usize) - } else { - Default::default() - }; - log::trace!(target: crate::LOG_TARGET, "=== {:?}", parachains.len()); - let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( - ¶chains, - DEFAULT_PARACHAIN_HEAD_SIZE, - StorageProofSize::Minimal(0), - ); - let at_relay_block = (relay_block_number, relay_block_hash); - }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) - verify { - for parachain in parachains { - assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); - } - } - - // Benchmark `submit_parachain_heads` extrinsic with 1kb proof size. - submit_parachain_heads_with_1kb_proof { - let sender = account("sender", 0, 0); - let parachains = vec![T::parachains()[0]]; - let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( - ¶chains, - DEFAULT_PARACHAIN_HEAD_SIZE, - StorageProofSize::HasLargeLeaf(1024), - ); - let at_relay_block = (relay_block_number, relay_block_hash); - }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) - verify { - for parachain in parachains { - assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); - } - } - - // Benchmark `submit_parachain_heads` extrinsic with 16kb proof size. - submit_parachain_heads_with_16kb_proof { - let sender = account("sender", 0, 0); - let parachains = vec![T::parachains()[0]]; - let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( - ¶chains, - DEFAULT_PARACHAIN_HEAD_SIZE, - StorageProofSize::HasLargeLeaf(16 * 1024), - ); - let at_relay_block = (relay_block_number, relay_block_hash); - }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) - verify { - for parachain in parachains { - assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); - } - } - - impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) -} diff --git a/cumulus/bridges/modules/parachains/src/call_ext.rs b/cumulus/bridges/modules/parachains/src/call_ext.rs deleted file mode 100644 index ee3770146c26..000000000000 --- a/cumulus/bridges/modules/parachains/src/call_ext.rs +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -use crate::{Config, Pallet, RelayBlockNumber}; -use bp_parachains::BestParaHeadHash; -use bp_polkadot_core::parachains::{ParaHash, ParaId}; -use frame_support::{dispatch::CallableCallFor, traits::IsSubType, RuntimeDebug}; -use sp_runtime::transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}; - -/// Info about a `SubmitParachainHeads` call which tries to update a single parachain. -#[derive(PartialEq, RuntimeDebug)] -pub struct SubmitParachainHeadsInfo { - /// Number of the finalized relay block that has been used to prove parachain finality. - pub at_relay_block_number: RelayBlockNumber, - /// Parachain identifier. - pub para_id: ParaId, - /// Hash of the bundled parachain head. - pub para_head_hash: ParaHash, -} - -/// Helper struct that provides methods for working with the `SubmitParachainHeads` call. -pub struct SubmitParachainHeadsHelper, I: 'static> { - _phantom_data: sp_std::marker::PhantomData<(T, I)>, -} - -impl, I: 'static> SubmitParachainHeadsHelper { - /// Check if the para head provided by the `SubmitParachainHeads` is better than the best one - /// we know. - pub fn is_obsolete(update: &SubmitParachainHeadsInfo) -> bool { - let stored_best_head = match crate::ParasInfo::::get(update.para_id) { - Some(stored_best_head) => stored_best_head, - None => return false, - }; - - if stored_best_head.best_head_hash.at_relay_block_number >= update.at_relay_block_number { - log::trace!( - target: crate::LOG_TARGET, - "The parachain head can't be updated. The parachain head for {:?} \ - was already updated at better relay chain block {} >= {}.", - update.para_id, - stored_best_head.best_head_hash.at_relay_block_number, - update.at_relay_block_number - ); - return true - } - - if stored_best_head.best_head_hash.head_hash == update.para_head_hash { - log::trace!( - target: crate::LOG_TARGET, - "The parachain head can't be updated. The parachain head hash for {:?} \ - was already updated to {} at block {} < {}.", - update.para_id, - update.para_head_hash, - stored_best_head.best_head_hash.at_relay_block_number, - update.at_relay_block_number - ); - return true - } - - false - } - - /// Check if the `SubmitParachainHeads` was successfully executed. - pub fn was_successful(update: &SubmitParachainHeadsInfo) -> bool { - match crate::ParasInfo::::get(update.para_id) { - Some(stored_best_head) => - stored_best_head.best_head_hash == - BestParaHeadHash { - at_relay_block_number: update.at_relay_block_number, - head_hash: update.para_head_hash, - }, - None => false, - } - } -} - -/// Trait representing a call that is a sub type of this pallet's call. -pub trait CallSubType, I: 'static>: - IsSubType, T>> -{ - /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with - /// one single parachain entry. - fn one_entry_submit_parachain_heads_info(&self) -> Option { - if let Some(crate::Call::::submit_parachain_heads { - ref at_relay_block, - ref parachains, - .. - }) = self.is_sub_type() - { - if let &[(para_id, para_head_hash)] = parachains.as_slice() { - return Some(SubmitParachainHeadsInfo { - at_relay_block_number: at_relay_block.0, - para_id, - para_head_hash, - }) - } - } - - None - } - - /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with - /// one single parachain entry, if the entry is for the provided parachain id. - fn submit_parachain_heads_info_for(&self, para_id: u32) -> Option { - self.one_entry_submit_parachain_heads_info() - .filter(|update| update.para_id.0 == para_id) - } - - /// Validate parachain heads in order to avoid "mining" transactions that provide - /// outdated bridged parachain heads. Without this validation, even honest relayers - /// may lose their funds if there are multiple relays running and submitting the - /// same information. - /// - /// This validation only works with transactions that are updating single parachain - /// head. We can't use unbounded validation - it may take too long and either break - /// block production, or "eat" significant portion of block production time literally - /// for nothing. In addition, the single-parachain-head-per-transaction is how the - /// pallet will be used in our environment. - fn check_obsolete_submit_parachain_heads(&self) -> TransactionValidity - where - Self: Sized, - { - let update = match self.one_entry_submit_parachain_heads_info() { - Some(update) => update, - None => return Ok(ValidTransaction::default()), - }; - - if SubmitParachainHeadsHelper::::is_obsolete(&update) { - return InvalidTransaction::Stale.into() - } - - Ok(ValidTransaction::default()) - } -} - -impl CallSubType for T::RuntimeCall -where - T: Config, - T::RuntimeCall: IsSubType, T>>, -{ -} - -#[cfg(test)] -mod tests { - use crate::{ - mock::{run_test, RuntimeCall, TestRuntime}, - CallSubType, ParaInfo, ParasInfo, RelayBlockNumber, - }; - use bp_parachains::BestParaHeadHash; - use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; - - fn validate_submit_parachain_heads( - num: RelayBlockNumber, - parachains: Vec<(ParaId, ParaHash)>, - ) -> bool { - RuntimeCall::Parachains(crate::Call::::submit_parachain_heads { - at_relay_block: (num, Default::default()), - parachains, - parachain_heads_proof: ParaHeadsProof(Vec::new()), - }) - .check_obsolete_submit_parachain_heads() - .is_ok() - } - - fn sync_to_relay_header_10() { - ParasInfo::::insert( - ParaId(1), - ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 10, - head_hash: [1u8; 32].into(), - }, - next_imported_hash_position: 0, - }, - ); - } - - #[test] - fn extension_rejects_header_from_the_obsolete_relay_block() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#5 => tx is - // rejected - sync_to_relay_header_10(); - assert!(!validate_submit_parachain_heads(5, vec![(ParaId(1), [1u8; 32].into())])); - }); - } - - #[test] - fn extension_rejects_header_from_the_same_relay_block() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#10 => tx is - // rejected - sync_to_relay_header_10(); - assert!(!validate_submit_parachain_heads(10, vec![(ParaId(1), [1u8; 32].into())])); - }); - } - - #[test] - fn extension_rejects_header_from_new_relay_block_with_same_hash() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#10 => tx is - // rejected - sync_to_relay_header_10(); - assert!(!validate_submit_parachain_heads(20, vec![(ParaId(1), [1u8; 32].into())])); - }); - } - - #[test] - fn extension_accepts_new_header() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#15 => tx is - // accepted - sync_to_relay_header_10(); - assert!(validate_submit_parachain_heads(15, vec![(ParaId(1), [2u8; 32].into())])); - }); - } - - #[test] - fn extension_accepts_if_more_than_one_parachain_is_submitted() { - run_test(|| { - // when current best finalized is #10 and we're trying to import header#5, but another - // parachain head is also supplied => tx is accepted - sync_to_relay_header_10(); - assert!(validate_submit_parachain_heads( - 5, - vec![(ParaId(1), [1u8; 32].into()), (ParaId(2), [1u8; 32].into())] - )); - }); - } -} diff --git a/cumulus/bridges/modules/parachains/src/lib.rs b/cumulus/bridges/modules/parachains/src/lib.rs deleted file mode 100644 index be46fae3c925..000000000000 --- a/cumulus/bridges/modules/parachains/src/lib.rs +++ /dev/null @@ -1,1624 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Parachains finality module. -//! -//! This module needs to be deployed with GRANDPA module, which is syncing relay -//! chain blocks. The main entry point of this module is `submit_parachain_heads`, which -//! accepts storage proof of some parachain `Heads` entries from bridged relay chain. -//! It requires corresponding relay headers to be already synced. - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use weights::WeightInfo; -pub use weights_ext::WeightInfoExt; - -use bp_header_chain::{HeaderChain, HeaderChainError}; -use bp_parachains::{parachain_head_storage_key_at_source, ParaInfo, ParaStoredHeaderData}; -use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; -use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain, StorageProofError}; -use frame_support::{dispatch::PostDispatchInfo, DefaultNoBound}; -use sp_std::{marker::PhantomData, vec::Vec}; - -#[cfg(feature = "runtime-benchmarks")] -use bp_parachains::ParaStoredHeaderDataBuilder; -#[cfg(feature = "runtime-benchmarks")] -use bp_runtime::HeaderOf; -#[cfg(feature = "runtime-benchmarks")] -use codec::Encode; - -// Re-export in crate namespace for `construct_runtime!`. -pub use call_ext::*; -pub use pallet::*; - -pub mod weights; -pub mod weights_ext; - -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarking; - -mod call_ext; -#[cfg(test)] -mod mock; - -/// The target that will be used when publishing logs related to this pallet. -pub const LOG_TARGET: &str = "runtime::bridge-parachains"; - -/// Block hash of the bridged relay chain. -pub type RelayBlockHash = bp_polkadot_core::Hash; -/// Block number of the bridged relay chain. -pub type RelayBlockNumber = bp_polkadot_core::BlockNumber; -/// Hasher of the bridged relay chain. -pub type RelayBlockHasher = bp_polkadot_core::Hasher; - -/// Artifacts of the parachains head update. -struct UpdateParachainHeadArtifacts { - /// New best head of the parachain. - pub best_head: ParaInfo, - /// If `true`, some old parachain head has been pruned during update. - pub prune_happened: bool, -} - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use bp_parachains::{ - BestParaHeadHash, ImportedParaHeadsKeyProvider, ParaStoredHeaderDataBuilder, - ParasInfoKeyProvider, - }; - use bp_runtime::{ - BasicOperatingMode, BoundedStorageValue, OwnedBridgeModule, StorageDoubleMapKeyProvider, - StorageMapKeyProvider, - }; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - /// Stored parachain head data of given parachains pallet. - pub type StoredParaHeadDataOf = - BoundedStorageValue<>::MaxParaHeadDataSize, ParaStoredHeaderData>; - /// Weight info of the given parachains pallet. - pub type WeightInfoOf = >::WeightInfo; - type GrandpaPalletOf = - pallet_bridge_grandpa::Pallet>::BridgesGrandpaPalletInstance>; - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event, I: 'static = ()> { - /// The caller has provided head of parachain that the pallet is not configured to track. - UntrackedParachainRejected { parachain: ParaId }, - /// The caller has declared that he has provided given parachain head, but it is missing - /// from the storage proof. - MissingParachainHead { parachain: ParaId }, - /// The caller has provided parachain head hash that is not matching the hash read from the - /// storage proof. - IncorrectParachainHeadHash { - parachain: ParaId, - parachain_head_hash: ParaHash, - actual_parachain_head_hash: ParaHash, - }, - /// The caller has provided obsolete parachain head, which is already known to the pallet. - RejectedObsoleteParachainHead { parachain: ParaId, parachain_head_hash: ParaHash }, - /// The caller has provided parachain head that exceeds the maximal configured head size. - RejectedLargeParachainHead { - parachain: ParaId, - parachain_head_hash: ParaHash, - parachain_head_size: u32, - }, - /// Parachain head has been updated. - UpdatedParachainHead { parachain: ParaId, parachain_head_hash: ParaHash }, - } - - #[pallet::error] - pub enum Error { - /// Relay chain block hash is unknown to us. - UnknownRelayChainBlock, - /// The number of stored relay block is different from what the relayer has provided. - InvalidRelayChainBlockNumber, - /// Parachain heads storage proof is invalid. - HeaderChainStorageProof(HeaderChainError), - /// Error generated by the `OwnedBridgeModule` trait. - BridgeModule(bp_runtime::OwnedBridgeModuleError), - } - - /// Convenience trait for defining `BridgedChain` bounds. - pub trait BoundedBridgeGrandpaConfig: - pallet_bridge_grandpa::Config - { - type BridgedRelayChain: Chain< - BlockNumber = RelayBlockNumber, - Hash = RelayBlockHash, - Hasher = RelayBlockHasher, - >; - } - - impl BoundedBridgeGrandpaConfig for T - where - T: pallet_bridge_grandpa::Config, - T::BridgedChain: - Chain, - { - type BridgedRelayChain = T::BridgedChain; - } - - #[pallet::config] - #[pallet::disable_frame_system_supertrait_check] - pub trait Config: - BoundedBridgeGrandpaConfig - { - /// The overarching event type. - type RuntimeEvent: From> - + IsType<::RuntimeEvent>; - /// Benchmarks results from runtime we're plugged into. - type WeightInfo: WeightInfoExt; - - /// Instance of bridges GRANDPA pallet (within this runtime) that this pallet is linked to. - /// - /// The GRANDPA pallet instance must be configured to import headers of relay chain that - /// we're interested in. - type BridgesGrandpaPalletInstance: 'static; - - /// Name of the original `paras` pallet in the `construct_runtime!()` call at the bridged - /// chain. - /// - /// Please keep in mind that this should be the name of the `runtime_parachains::paras` - /// pallet from polkadot repository, not the `pallet-bridge-parachains`. - #[pallet::constant] - type ParasPalletName: Get<&'static str>; - - /// Parachain head data builder. - /// - /// We never store parachain heads here, since they may be too big (e.g. because of large - /// digest items). Instead we're using the same approach as `pallet-bridge-grandpa` - /// pallet - we are only storing `bp_messages::StoredHeaderData` (number and state root), - /// which is enough for our applications. However, we work with different parachains here - /// and they can use different primitives (for block numbers and hash). So we can't store - /// it directly. Instead, we're storing `bp_messages::StoredHeaderData` in SCALE-encoded - /// form, wrapping it into `bp_parachains::ParaStoredHeaderData`. - /// - /// This builder helps to convert from `HeadData` to `bp_parachains::ParaStoredHeaderData`. - type ParaStoredHeaderDataBuilder: ParaStoredHeaderDataBuilder; - - /// Maximal number of single parachain heads to keep in the storage. - /// - /// The setting is there to prevent growing the on-chain state indefinitely. Note - /// the setting does not relate to parachain block numbers - we will simply keep as much - /// items in the storage, so it doesn't guarantee any fixed timeframe for heads. - /// - /// Incautious change of this constant may lead to orphan entries in the runtime storage. - #[pallet::constant] - type HeadsToKeep: Get; - - /// Maximal size (in bytes) of the SCALE-encoded parachain head data - /// (`bp_parachains::ParaStoredHeaderData`). - /// - /// Keep in mind that the size of any tracked parachain header data must not exceed this - /// value. So if you're going to track multiple parachains, one of which is using large - /// hashes, you shall choose this maximal value. - /// - /// There's no mandatory headers in this pallet, so it can't stall if there's some header - /// that exceeds this bound. - #[pallet::constant] - type MaxParaHeadDataSize: Get; - } - - /// Optional pallet owner. - /// - /// Pallet owner has a right to halt all pallet operations and then resume them. If it is - /// `None`, then there are no direct ways to halt/resume pallet operations, but other - /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt - /// flag directly or call the `halt_operations`). - #[pallet::storage] - pub type PalletOwner, I: 'static = ()> = - StorageValue<_, T::AccountId, OptionQuery>; - - /// The current operating mode of the pallet. - /// - /// Depending on the mode either all, or no transactions will be allowed. - #[pallet::storage] - pub type PalletOperatingMode, I: 'static = ()> = - StorageValue<_, BasicOperatingMode, ValueQuery>; - - /// Parachains info. - /// - /// Contains the following info: - /// - best parachain head hash - /// - the head of the `ImportedParaHashes` ring buffer - #[pallet::storage] - pub type ParasInfo, I: 'static = ()> = StorageMap< - Hasher = ::Hasher, - Key = ::Key, - Value = ::Value, - QueryKind = OptionQuery, - OnEmpty = GetDefault, - MaxValues = MaybeMaxParachains, - >; - - /// State roots of parachain heads which have been imported into the pallet. - #[pallet::storage] - pub type ImportedParaHeads, I: 'static = ()> = StorageDoubleMap< - Hasher1 = ::Hasher1, - Key1 = ::Key1, - Hasher2 = ::Hasher2, - Key2 = ::Key2, - Value = StoredParaHeadDataOf, - QueryKind = OptionQuery, - OnEmpty = GetDefault, - MaxValues = MaybeMaxTotalParachainHashes, - >; - - /// A ring buffer of imported parachain head hashes. Ordered by the insertion time. - #[pallet::storage] - pub(super) type ImportedParaHashes, I: 'static = ()> = StorageDoubleMap< - Hasher1 = Blake2_128Concat, - Key1 = ParaId, - Hasher2 = Twox64Concat, - Key2 = u32, - Value = ParaHash, - QueryKind = OptionQuery, - OnEmpty = GetDefault, - MaxValues = MaybeMaxTotalParachainHashes, - >; - - #[pallet::pallet] - pub struct Pallet(PhantomData<(T, I)>); - - impl, I: 'static> OwnedBridgeModule for Pallet { - const LOG_TARGET: &'static str = LOG_TARGET; - type OwnerStorage = PalletOwner; - type OperatingMode = BasicOperatingMode; - type OperatingModeStorage = PalletOperatingMode; - } - - #[pallet::call] - impl, I: 'static> Pallet { - /// Submit proof of one or several parachain heads. - /// - /// The proof is supposed to be proof of some `Heads` entries from the - /// `polkadot-runtime-parachains::paras` pallet instance, deployed at the bridged chain. - /// The proof is supposed to be crafted at the `relay_header_hash` that must already be - /// imported by corresponding GRANDPA pallet at this chain. - /// - /// The call fails if: - /// - /// - the pallet is halted; - /// - /// - the relay chain block `at_relay_block` is not imported by the associated bridge - /// GRANDPA pallet. - /// - /// The call may succeed, but some heads may not be updated e.g. because pallet knows - /// better head or it isn't tracked by the pallet. - #[pallet::call_index(0)] - #[pallet::weight(WeightInfoOf::::submit_parachain_heads_weight( - T::DbWeight::get(), - parachain_heads_proof, - parachains.len() as _, - ))] - pub fn submit_parachain_heads( - origin: OriginFor, - at_relay_block: (RelayBlockNumber, RelayBlockHash), - parachains: Vec<(ParaId, ParaHash)>, - parachain_heads_proof: ParaHeadsProof, - ) -> DispatchResultWithPostInfo { - Self::ensure_not_halted().map_err(Error::::BridgeModule)?; - ensure_signed(origin)?; - - // we'll need relay chain header to verify that parachains heads are always increasing. - let (relay_block_number, relay_block_hash) = at_relay_block; - let relay_block = pallet_bridge_grandpa::ImportedHeaders::< - T, - T::BridgesGrandpaPalletInstance, - >::get(relay_block_hash) - .ok_or(Error::::UnknownRelayChainBlock)?; - ensure!( - relay_block.number == relay_block_number, - Error::::InvalidRelayChainBlockNumber, - ); - - // now parse storage proof and read parachain heads - let mut actual_weight = WeightInfoOf::::submit_parachain_heads_weight( - T::DbWeight::get(), - ¶chain_heads_proof, - parachains.len() as _, - ); - - let mut storage = GrandpaPalletOf::::storage_proof_checker( - relay_block_hash, - parachain_heads_proof.0, - ) - .map_err(Error::::HeaderChainStorageProof)?; - - for (parachain, parachain_head_hash) in parachains { - let parachain_head = match Self::read_parachain_head(&mut storage, parachain) { - Ok(Some(parachain_head)) => parachain_head, - Ok(None) => { - log::trace!( - target: LOG_TARGET, - "The head of parachain {:?} is None. {}", - parachain, - if ParasInfo::::contains_key(parachain) { - "Looks like it is not yet registered at the source relay chain" - } else { - "Looks like it has been deregistered from the source relay chain" - }, - ); - Self::deposit_event(Event::MissingParachainHead { parachain }); - continue - }, - Err(e) => { - log::trace!( - target: LOG_TARGET, - "The read of head of parachain {:?} has failed: {:?}", - parachain, - e, - ); - Self::deposit_event(Event::MissingParachainHead { parachain }); - continue - }, - }; - - // if relayer has specified invalid parachain head hash, ignore the head - // (this isn't strictly necessary, but better safe than sorry) - let actual_parachain_head_hash = parachain_head.hash(); - if parachain_head_hash != actual_parachain_head_hash { - log::trace!( - target: LOG_TARGET, - "The submitter has specified invalid parachain {:?} head hash: \ - {:?} vs {:?}", - parachain, - parachain_head_hash, - actual_parachain_head_hash, - ); - Self::deposit_event(Event::IncorrectParachainHeadHash { - parachain, - parachain_head_hash, - actual_parachain_head_hash, - }); - continue - } - - // convert from parachain head into stored parachain head data - let parachain_head_data = - match T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) { - Some(parachain_head_data) => parachain_head_data, - None => { - log::trace!( - target: LOG_TARGET, - "The head of parachain {:?} has been provided, but it is not tracked by the pallet", - parachain, - ); - Self::deposit_event(Event::UntrackedParachainRejected { parachain }); - continue - }, - }; - - let update_result: Result<_, ()> = - ParasInfo::::try_mutate(parachain, |stored_best_head| { - let artifacts = Pallet::::update_parachain_head( - parachain, - stored_best_head.take(), - relay_block_number, - parachain_head_data, - parachain_head_hash, - )?; - *stored_best_head = Some(artifacts.best_head); - Ok(artifacts.prune_happened) - }); - - // we're refunding weight if update has not happened and if pruning has not happened - let is_update_happened = update_result.is_ok(); - if !is_update_happened { - actual_weight = actual_weight.saturating_sub( - WeightInfoOf::::parachain_head_storage_write_weight( - T::DbWeight::get(), - ), - ); - } - let is_prune_happened = matches!(update_result, Ok(true)); - if !is_prune_happened { - actual_weight = actual_weight.saturating_sub( - WeightInfoOf::::parachain_head_pruning_weight(T::DbWeight::get()), - ); - } - } - - // even though we may have accepted some parachain heads, we can't allow relayers to - // submit proof with unused trie nodes - // => treat this as an error - // - // (we can throw error here, because now all our calls are transactional) - storage.ensure_no_unused_nodes().map_err(|e| { - Error::::HeaderChainStorageProof(HeaderChainError::StorageProof(e)) - })?; - - Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) - } - - /// Change `PalletOwner`. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(1)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { - >::set_owner(origin, new_owner) - } - - /// Halt or resume all pallet operations. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(2)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_operating_mode( - origin: OriginFor, - operating_mode: BasicOperatingMode, - ) -> DispatchResult { - >::set_operating_mode(origin, operating_mode) - } - } - - impl, I: 'static> Pallet { - /// Get stored parachain info. - pub fn best_parachain_info(parachain: ParaId) -> Option { - ParasInfo::::get(parachain) - } - - /// Get best finalized head data of the given parachain. - pub fn best_parachain_head(parachain: ParaId) -> Option { - let best_para_head_hash = ParasInfo::::get(parachain)?.best_head_hash.head_hash; - ImportedParaHeads::::get(parachain, best_para_head_hash).map(|h| h.into_inner()) - } - - /// Get best finalized head hash of the given parachain. - pub fn best_parachain_head_hash(parachain: ParaId) -> Option { - Some(ParasInfo::::get(parachain)?.best_head_hash.head_hash) - } - - /// Get best finalized head id of the given parachain. - pub fn best_parachain_head_id + Parachain>( - ) -> Result>, codec::Error> { - let parachain = ParaId(C::PARACHAIN_ID); - let best_head_hash = match Self::best_parachain_head_hash(parachain) { - Some(best_head_hash) => best_head_hash, - None => return Ok(None), - }; - let encoded_head = match Self::parachain_head(parachain, best_head_hash) { - Some(encoded_head) => encoded_head, - None => return Ok(None), - }; - encoded_head - .decode_parachain_head_data::() - .map(|data| Some(HeaderId(data.number, best_head_hash))) - } - - /// Get parachain head data with given hash. - pub fn parachain_head(parachain: ParaId, hash: ParaHash) -> Option { - ImportedParaHeads::::get(parachain, hash).map(|h| h.into_inner()) - } - - /// Read parachain head from storage proof. - fn read_parachain_head( - storage: &mut bp_runtime::StorageProofChecker, - parachain: ParaId, - ) -> Result, StorageProofError> { - let parachain_head_key = - parachain_head_storage_key_at_source(T::ParasPalletName::get(), parachain); - storage.read_and_decode_value(parachain_head_key.0.as_ref()) - } - - /// Try to update parachain head. - pub(super) fn update_parachain_head( - parachain: ParaId, - stored_best_head: Option, - new_at_relay_block_number: RelayBlockNumber, - new_head_data: ParaStoredHeaderData, - new_head_hash: ParaHash, - ) -> Result { - // check if head has been already updated at better relay chain block. Without this - // check, we may import heads in random order - let update = SubmitParachainHeadsInfo { - at_relay_block_number: new_at_relay_block_number, - para_id: parachain, - para_head_hash: new_head_hash, - }; - if SubmitParachainHeadsHelper::::is_obsolete(&update) { - Self::deposit_event(Event::RejectedObsoleteParachainHead { - parachain, - parachain_head_hash: new_head_hash, - }); - return Err(()) - } - - // verify that the parachain head data size is <= `MaxParaHeadDataSize` - let updated_head_data = - match StoredParaHeadDataOf::::try_from_inner(new_head_data) { - Ok(updated_head_data) => updated_head_data, - Err(e) => { - log::trace!( - target: LOG_TARGET, - "The parachain head can't be updated. The parachain head data size \ - for {:?} is {}. It exceeds maximal configured size {}.", - parachain, - e.value_size, - e.maximal_size, - ); - - Self::deposit_event(Event::RejectedLargeParachainHead { - parachain, - parachain_head_hash: new_head_hash, - parachain_head_size: e.value_size as _, - }); - - return Err(()) - }, - }; - - let next_imported_hash_position = stored_best_head - .map_or(0, |stored_best_head| stored_best_head.next_imported_hash_position); - - // insert updated best parachain head - let head_hash_to_prune = - ImportedParaHashes::::try_get(parachain, next_imported_hash_position); - let updated_best_para_head = ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: new_at_relay_block_number, - head_hash: new_head_hash, - }, - next_imported_hash_position: (next_imported_hash_position + 1) % - T::HeadsToKeep::get(), - }; - ImportedParaHashes::::insert( - parachain, - next_imported_hash_position, - new_head_hash, - ); - ImportedParaHeads::::insert(parachain, new_head_hash, updated_head_data); - log::trace!( - target: LOG_TARGET, - "Updated head of parachain {:?} to {}", - parachain, - new_head_hash, - ); - - // remove old head - let prune_happened = head_hash_to_prune.is_ok(); - if let Ok(head_hash_to_prune) = head_hash_to_prune { - log::trace!( - target: LOG_TARGET, - "Pruning old head of parachain {:?}: {}", - parachain, - head_hash_to_prune, - ); - ImportedParaHeads::::remove(parachain, head_hash_to_prune); - } - Self::deposit_event(Event::UpdatedParachainHead { - parachain, - parachain_head_hash: new_head_hash, - }); - - Ok(UpdateParachainHeadArtifacts { best_head: updated_best_para_head, prune_happened }) - } - } - - #[pallet::genesis_config] - #[derive(DefaultNoBound)] - pub struct GenesisConfig, I: 'static = ()> { - /// Initial pallet operating mode. - pub operating_mode: BasicOperatingMode, - /// Initial pallet owner. - pub owner: Option, - /// Dummy marker. - pub phantom: sp_std::marker::PhantomData, - } - - #[pallet::genesis_build] - impl, I: 'static> BuildGenesisConfig for GenesisConfig { - fn build(&self) { - PalletOperatingMode::::put(self.operating_mode); - if let Some(ref owner) = self.owner { - PalletOwner::::put(owner); - } - } - } - - /// Returns maximal number of parachains, supported by the pallet. - pub struct MaybeMaxParachains(PhantomData<(T, I)>); - - impl, I: 'static> Get> for MaybeMaxParachains { - fn get() -> Option { - Some(T::ParaStoredHeaderDataBuilder::supported_parachains()) - } - } - - /// Returns total number of all parachains hashes/heads, stored by the pallet. - pub struct MaybeMaxTotalParachainHashes(PhantomData<(T, I)>); - - impl, I: 'static> Get> for MaybeMaxTotalParachainHashes { - fn get() -> Option { - Some( - T::ParaStoredHeaderDataBuilder::supported_parachains() - .saturating_mul(T::HeadsToKeep::get()), - ) - } - } -} - -/// Single parachain header chain adapter. -pub struct ParachainHeaders(PhantomData<(T, I, C)>); - -impl, I: 'static, C: Parachain> HeaderChain - for ParachainHeaders -{ - fn finalized_header_state_root(hash: HashOf) -> Option> { - Pallet::::parachain_head(ParaId(C::PARACHAIN_ID), hash) - .and_then(|head| head.decode_parachain_head_data::().ok()) - .map(|h| h.state_root) - } -} - -/// (Re)initialize pallet with given header for using it in `pallet-bridge-messages` benchmarks. -#[cfg(feature = "runtime-benchmarks")] -pub fn initialize_for_benchmarks, I: 'static, PC: Parachain>( - header: HeaderOf, -) { - let parachain = ParaId(PC::PARACHAIN_ID); - let parachain_head = ParaHead(header.encode()); - let updated_head_data = T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) - .expect("failed to build stored parachain head in benchmarks"); - Pallet::::update_parachain_head( - parachain, - None, - 0, - updated_head_data, - parachain_head.hash(), - ) - .expect("failed to insert parachain head in benchmarks"); -} - -#[cfg(test)] -pub(crate) mod tests { - use super::*; - use crate::mock::{ - run_test, test_relay_header, BigParachainHeader, RegularParachainHasher, - RegularParachainHeader, RelayBlockHeader, RuntimeEvent as TestEvent, RuntimeOrigin, - TestRuntime, UNTRACKED_PARACHAIN_ID, - }; - use bp_test_utils::prepare_parachain_heads_proof; - use codec::Encode; - - use bp_header_chain::{justification::GrandpaJustification, StoredHeaderGrandpaInfo}; - use bp_parachains::{ - BestParaHeadHash, BridgeParachainCall, ImportedParaHeadsKeyProvider, ParasInfoKeyProvider, - }; - use bp_runtime::{ - BasicOperatingMode, OwnedBridgeModuleError, StorageDoubleMapKeyProvider, - StorageMapKeyProvider, - }; - use bp_test_utils::{ - authority_list, generate_owned_bridge_module_tests, make_default_justification, - }; - use frame_support::{ - assert_noop, assert_ok, - dispatch::DispatchResultWithPostInfo, - storage::generator::{StorageDoubleMap, StorageMap}, - traits::{Get, OnInitialize}, - weights::Weight, - }; - use frame_system::{EventRecord, Pallet as System, Phase}; - use sp_core::Hasher; - use sp_runtime::{traits::Header as HeaderT, DispatchError}; - - type BridgesGrandpaPalletInstance = pallet_bridge_grandpa::Instance1; - type WeightInfo = ::WeightInfo; - type DbWeight = ::DbWeight; - - pub(crate) fn initialize(state_root: RelayBlockHash) -> RelayBlockHash { - pallet_bridge_grandpa::Pallet::::initialize( - RuntimeOrigin::root(), - bp_header_chain::InitializationData { - header: Box::new(test_relay_header(0, state_root)), - authority_list: authority_list(), - set_id: 1, - operating_mode: BasicOperatingMode::Normal, - }, - ) - .unwrap(); - - System::::set_block_number(1); - System::::reset_events(); - - test_relay_header(0, state_root).hash() - } - - fn proceed( - num: RelayBlockNumber, - state_root: RelayBlockHash, - ) -> (ParaHash, GrandpaJustification) { - pallet_bridge_grandpa::Pallet::::on_initialize( - 0, - ); - - let header = test_relay_header(num, state_root); - let hash = header.hash(); - let justification = make_default_justification(&header); - assert_ok!( - pallet_bridge_grandpa::Pallet::::submit_finality_proof( - RuntimeOrigin::signed(1), - Box::new(header), - justification.clone(), - ) - ); - - (hash, justification) - } - - fn initial_best_head(parachain: u32) -> ParaInfo { - ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 0, - head_hash: head_data(parachain, 0).hash(), - }, - next_imported_hash_position: 1, - } - } - - pub(crate) fn head_data(parachain: u32, head_number: u32) -> ParaHead { - ParaHead( - RegularParachainHeader::new( - head_number as _, - Default::default(), - RegularParachainHasher::hash(&(parachain, head_number).encode()), - Default::default(), - Default::default(), - ) - .encode(), - ) - } - - fn stored_head_data(parachain: u32, head_number: u32) -> ParaStoredHeaderData { - ParaStoredHeaderData( - (head_number as u64, RegularParachainHasher::hash(&(parachain, head_number).encode())) - .encode(), - ) - } - - fn big_head_data(parachain: u32, head_number: u32) -> ParaHead { - ParaHead( - BigParachainHeader::new( - head_number as _, - Default::default(), - RegularParachainHasher::hash(&(parachain, head_number).encode()), - Default::default(), - Default::default(), - ) - .encode(), - ) - } - - fn big_stored_head_data(parachain: u32, head_number: u32) -> ParaStoredHeaderData { - ParaStoredHeaderData( - (head_number as u128, RegularParachainHasher::hash(&(parachain, head_number).encode())) - .encode(), - ) - } - - fn head_hash(parachain: u32, head_number: u32) -> ParaHash { - head_data(parachain, head_number).hash() - } - - fn import_parachain_1_head( - relay_chain_block: RelayBlockNumber, - relay_state_root: RelayBlockHash, - parachains: Vec<(ParaId, ParaHash)>, - proof: ParaHeadsProof, - ) -> DispatchResultWithPostInfo { - Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (relay_chain_block, test_relay_header(relay_chain_block, relay_state_root).hash()), - parachains, - proof, - ) - } - - fn weight_of_import_parachain_1_head(proof: &ParaHeadsProof, prune_expected: bool) -> Weight { - let db_weight = ::DbWeight::get(); - WeightInfoOf::::submit_parachain_heads_weight(db_weight, proof, 1) - .saturating_sub(if prune_expected { - Weight::zero() - } else { - WeightInfoOf::::parachain_head_pruning_weight(db_weight) - }) - } - - #[test] - fn submit_parachain_heads_checks_operating_mode() { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); - - run_test(|| { - initialize(state_root); - - // `submit_parachain_heads()` should fail when the pallet is halted. - PalletOperatingMode::::put(BasicOperatingMode::Halted); - assert_noop!( - Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (0, test_relay_header(0, state_root).hash()), - parachains.clone(), - proof.clone(), - ), - Error::::BridgeModule(OwnedBridgeModuleError::Halted) - ); - - // `submit_parachain_heads()` should succeed now that the pallet is resumed. - PalletOperatingMode::::put(BasicOperatingMode::Normal); - assert_ok!(Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (0, test_relay_header(0, state_root).hash()), - parachains, - proof, - ),); - }); - } - - #[test] - fn imports_initial_parachain_heads() { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![ - (1, head_data(1, 0)), - (3, head_data(3, 10)), - ]); - run_test(|| { - initialize(state_root); - - // we're trying to update heads of parachains 1, 2 and 3 - let expected_weight = - WeightInfo::submit_parachain_heads_weight(DbWeight::get(), &proof, 2); - let result = Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (0, test_relay_header(0, state_root).hash()), - parachains, - proof, - ); - assert_ok!(result); - assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); - - // but only 1 and 2 are updated, because proof is missing head of parachain#2 - assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); - assert_eq!(ParasInfo::::get(ParaId(2)), None); - assert_eq!( - ParasInfo::::get(ParaId(3)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 0, - head_hash: head_data(3, 10).hash() - }, - next_imported_hash_position: 1, - }) - ); - - assert_eq!( - ImportedParaHeads::::get( - ParaId(1), - initial_best_head(1).best_head_hash.head_hash - ) - .map(|h| h.into_inner()), - Some(stored_head_data(1, 0)) - ); - assert_eq!( - ImportedParaHeads::::get( - ParaId(2), - initial_best_head(2).best_head_hash.head_hash - ) - .map(|h| h.into_inner()), - None - ); - assert_eq!( - ImportedParaHeads::::get(ParaId(3), head_hash(3, 10)) - .map(|h| h.into_inner()), - Some(stored_head_data(3, 10)) - ); - - assert_eq!( - System::::events(), - vec![ - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, - }), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(3), - parachain_head_hash: head_data(3, 10).hash(), - }), - topics: vec![], - } - ], - ); - }); - } - - #[test] - fn imports_parachain_heads_is_able_to_progress() { - let (state_root_5, proof_5, parachains_5) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); - let (state_root_10, proof_10, parachains_10) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); - run_test(|| { - // start with relay block #0 and import head#5 of parachain#1 - initialize(state_root_5); - assert_ok!(import_parachain_1_head(0, state_root_5, parachains_5, proof_5)); - assert_eq!( - ParasInfo::::get(ParaId(1)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 0, - head_hash: head_data(1, 5).hash() - }, - next_imported_hash_position: 1, - }) - ); - assert_eq!( - ImportedParaHeads::::get(ParaId(1), head_data(1, 5).hash()) - .map(|h| h.into_inner()), - Some(stored_head_data(1, 5)) - ); - assert_eq!( - ImportedParaHeads::::get(ParaId(1), head_data(1, 10).hash()) - .map(|h| h.into_inner()), - None - ); - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 5).hash(), - }), - topics: vec![], - }], - ); - - // import head#10 of parachain#1 at relay block #1 - let (relay_1_hash, justification) = proceed(1, state_root_10); - assert_ok!(import_parachain_1_head(1, state_root_10, parachains_10, proof_10)); - assert_eq!( - ParasInfo::::get(ParaId(1)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 1, - head_hash: head_data(1, 10).hash() - }, - next_imported_hash_position: 2, - }) - ); - assert_eq!( - ImportedParaHeads::::get(ParaId(1), head_data(1, 5).hash()) - .map(|h| h.into_inner()), - Some(stored_head_data(1, 5)) - ); - assert_eq!( - ImportedParaHeads::::get(ParaId(1), head_data(1, 10).hash()) - .map(|h| h.into_inner()), - Some(stored_head_data(1, 10)) - ); - assert_eq!( - System::::events(), - vec![ - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 5).hash(), - }), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Grandpa1( - pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { - number: 1, - hash: relay_1_hash, - grandpa_info: StoredHeaderGrandpaInfo { - finality_proof: justification, - new_verification_context: None, - }, - } - ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 10).hash(), - }), - topics: vec![], - } - ], - ); - }); - } - - #[test] - fn ignores_untracked_parachain() { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![ - (1, head_data(1, 5)), - (UNTRACKED_PARACHAIN_ID, head_data(1, 5)), - (2, head_data(1, 5)), - ]); - run_test(|| { - // start with relay block #0 and try to import head#5 of parachain#1 and untracked - // parachain - let expected_weight = - WeightInfo::submit_parachain_heads_weight(DbWeight::get(), &proof, 3) - .saturating_sub(WeightInfo::parachain_head_storage_write_weight( - DbWeight::get(), - )); - initialize(state_root); - let result = Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (0, test_relay_header(0, state_root).hash()), - parachains, - proof, - ); - assert_ok!(result); - assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); - assert_eq!( - ParasInfo::::get(ParaId(1)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 0, - head_hash: head_data(1, 5).hash() - }, - next_imported_hash_position: 1, - }) - ); - assert_eq!(ParasInfo::::get(ParaId(UNTRACKED_PARACHAIN_ID)), None,); - assert_eq!( - ParasInfo::::get(ParaId(2)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 0, - head_hash: head_data(1, 5).hash() - }, - next_imported_hash_position: 1, - }) - ); - assert_eq!( - System::::events(), - vec![ - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 5).hash(), - }), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UntrackedParachainRejected { - parachain: ParaId(UNTRACKED_PARACHAIN_ID), - }), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(2), - parachain_head_hash: head_data(1, 5).hash(), - }), - topics: vec![], - } - ], - ); - }); - } - - #[test] - fn does_nothing_when_already_imported_this_head_at_previous_relay_header() { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); - run_test(|| { - // import head#0 of parachain#1 at relay block#0 - initialize(state_root); - assert_ok!(import_parachain_1_head(0, state_root, parachains.clone(), proof.clone())); - assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, - }), - topics: vec![], - }], - ); - - // try to import head#0 of parachain#1 at relay block#1 - // => call succeeds, but nothing is changed - let (relay_1_hash, justification) = proceed(1, state_root); - assert_ok!(import_parachain_1_head(1, state_root, parachains, proof)); - assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); - assert_eq!( - System::::events(), - vec![ - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, - }), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Grandpa1( - pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { - number: 1, - hash: relay_1_hash, - grandpa_info: StoredHeaderGrandpaInfo { - finality_proof: justification, - new_verification_context: None, - } - } - ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::RejectedObsoleteParachainHead { - parachain: ParaId(1), - parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, - }), - topics: vec![], - } - ], - ); - }); - } - - #[test] - fn does_nothing_when_already_imported_head_at_better_relay_header() { - let (state_root_5, proof_5, parachains_5) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); - let (state_root_10, proof_10, parachains_10) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); - run_test(|| { - // start with relay block #0 - initialize(state_root_5); - - // head#10 of parachain#1 at relay block#1 - let (relay_1_hash, justification) = proceed(1, state_root_10); - assert_ok!(import_parachain_1_head(1, state_root_10, parachains_10, proof_10)); - assert_eq!( - ParasInfo::::get(ParaId(1)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 1, - head_hash: head_data(1, 10).hash() - }, - next_imported_hash_position: 1, - }) - ); - assert_eq!( - System::::events(), - vec![ - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Grandpa1( - pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { - number: 1, - hash: relay_1_hash, - grandpa_info: StoredHeaderGrandpaInfo { - finality_proof: justification.clone(), - new_verification_context: None, - } - } - ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 10).hash(), - }), - topics: vec![], - } - ], - ); - - // now try to import head#5 at relay block#0 - // => nothing is changed, because better head has already been imported - assert_ok!(import_parachain_1_head(0, state_root_5, parachains_5, proof_5)); - assert_eq!( - ParasInfo::::get(ParaId(1)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 1, - head_hash: head_data(1, 10).hash() - }, - next_imported_hash_position: 1, - }) - ); - assert_eq!( - System::::events(), - vec![ - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Grandpa1( - pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { - number: 1, - hash: relay_1_hash, - grandpa_info: StoredHeaderGrandpaInfo { - finality_proof: justification, - new_verification_context: None, - } - } - ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 10).hash(), - }), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::RejectedObsoleteParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 5).hash(), - }), - topics: vec![], - } - ], - ); - }); - } - - #[test] - fn does_nothing_when_parachain_head_is_too_large() { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![ - (1, head_data(1, 5)), - (4, big_head_data(1, 5)), - ]); - run_test(|| { - // start with relay block #0 and try to import head#5 of parachain#1 and big parachain - initialize(state_root); - let result = Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (0, test_relay_header(0, state_root).hash()), - parachains, - proof, - ); - assert_ok!(result); - assert_eq!( - ParasInfo::::get(ParaId(1)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: 0, - head_hash: head_data(1, 5).hash() - }, - next_imported_hash_position: 1, - }) - ); - assert_eq!(ParasInfo::::get(ParaId(4)), None); - assert_eq!( - System::::events(), - vec![ - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::UpdatedParachainHead { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 5).hash(), - }), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::RejectedLargeParachainHead { - parachain: ParaId(4), - parachain_head_hash: big_head_data(1, 5).hash(), - parachain_head_size: big_stored_head_data(1, 5).encoded_size() as u32, - }), - topics: vec![], - }, - ], - ); - }); - } - - #[test] - fn prunes_old_heads() { - run_test(|| { - let heads_to_keep = crate::mock::HeadsToKeep::get(); - - // import exactly `HeadsToKeep` headers - for i in 0..heads_to_keep { - let (state_root, proof, parachains) = prepare_parachain_heads_proof::< - RegularParachainHeader, - >(vec![(1, head_data(1, i))]); - if i == 0 { - initialize(state_root); - } else { - proceed(i, state_root); - } - - let expected_weight = weight_of_import_parachain_1_head(&proof, false); - let result = import_parachain_1_head(i, state_root, parachains, proof); - assert_ok!(result); - assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); - } - - // nothing is pruned yet - for i in 0..heads_to_keep { - assert!(ImportedParaHeads::::get(ParaId(1), head_data(1, i).hash()) - .is_some()); - } - - // import next relay chain header and next parachain head - let (state_root, proof, parachains) = prepare_parachain_heads_proof::< - RegularParachainHeader, - >(vec![(1, head_data(1, heads_to_keep))]); - proceed(heads_to_keep, state_root); - let expected_weight = weight_of_import_parachain_1_head(&proof, true); - let result = import_parachain_1_head(heads_to_keep, state_root, parachains, proof); - assert_ok!(result); - assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); - - // and the head#0 is pruned - assert!( - ImportedParaHeads::::get(ParaId(1), head_data(1, 0).hash()).is_none() - ); - for i in 1..=heads_to_keep { - assert!(ImportedParaHeads::::get(ParaId(1), head_data(1, i).hash()) - .is_some()); - } - }); - } - - #[test] - fn fails_on_unknown_relay_chain_block() { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); - run_test(|| { - // start with relay block #0 - initialize(state_root); - - // try to import head#5 of parachain#1 at unknown relay chain block #1 - assert_noop!( - import_parachain_1_head(1, state_root, parachains, proof), - Error::::UnknownRelayChainBlock - ); - }); - } - - #[test] - fn fails_on_invalid_storage_proof() { - let (_state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); - run_test(|| { - // start with relay block #0 - initialize(Default::default()); - - // try to import head#5 of parachain#1 at relay chain block #0 - assert_noop!( - import_parachain_1_head(0, Default::default(), parachains, proof), - Error::::HeaderChainStorageProof(HeaderChainError::StorageProof( - StorageProofError::StorageRootMismatch - )) - ); - }); - } - - #[test] - fn is_not_rewriting_existing_head_if_failed_to_read_updated_head() { - let (state_root_5, proof_5, parachains_5) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); - let (state_root_10_at_20, proof_10_at_20, parachains_10_at_20) = - prepare_parachain_heads_proof::(vec![(2, head_data(2, 10))]); - let (state_root_10_at_30, proof_10_at_30, parachains_10_at_30) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); - run_test(|| { - // we've already imported head#5 of parachain#1 at relay block#10 - initialize(state_root_5); - import_parachain_1_head(0, state_root_5, parachains_5, proof_5).expect("ok"); - assert_eq!( - Pallet::::best_parachain_head(ParaId(1)), - Some(stored_head_data(1, 5)) - ); - - // then if someone is pretending to provide updated head#10 of parachain#1 at relay - // block#20, but fails to do that - // - // => we'll leave previous value - proceed(20, state_root_10_at_20); - assert_ok!(Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (20, test_relay_header(20, state_root_10_at_20).hash()), - parachains_10_at_20, - proof_10_at_20, - ),); - assert_eq!( - Pallet::::best_parachain_head(ParaId(1)), - Some(stored_head_data(1, 5)) - ); - - // then if someone is pretending to provide updated head#10 of parachain#1 at relay - // block#30, and actualy provides it - // - // => we'll update value - proceed(30, state_root_10_at_30); - assert_ok!(Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (30, test_relay_header(30, state_root_10_at_30).hash()), - parachains_10_at_30, - proof_10_at_30, - ),); - assert_eq!( - Pallet::::best_parachain_head(ParaId(1)), - Some(stored_head_data(1, 10)) - ); - }); - } - - #[test] - fn storage_keys_computed_properly() { - assert_eq!( - ParasInfo::::storage_map_final_key(ParaId(42)).to_vec(), - ParasInfoKeyProvider::final_key("Parachains", &ParaId(42)).0 - ); - - assert_eq!( - ImportedParaHeads::::storage_double_map_final_key( - ParaId(42), - ParaHash::from([21u8; 32]) - ) - .to_vec(), - ImportedParaHeadsKeyProvider::final_key( - "Parachains", - &ParaId(42), - &ParaHash::from([21u8; 32]) - ) - .0, - ); - } - - #[test] - fn ignores_parachain_head_if_it_is_missing_from_storage_proof() { - let (state_root, proof, _) = - prepare_parachain_heads_proof::(vec![]); - let parachains = vec![(ParaId(2), Default::default())]; - run_test(|| { - initialize(state_root); - assert_ok!(Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (0, test_relay_header(0, state_root).hash()), - parachains, - proof, - )); - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::MissingParachainHead { - parachain: ParaId(2), - }), - topics: vec![], - }], - ); - }); - } - - #[test] - fn ignores_parachain_head_if_parachain_head_hash_is_wrong() { - let (state_root, proof, _) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); - let parachains = vec![(ParaId(1), head_data(1, 10).hash())]; - run_test(|| { - initialize(state_root); - assert_ok!(Pallet::::submit_parachain_heads( - RuntimeOrigin::signed(1), - (0, test_relay_header(0, state_root).hash()), - parachains, - proof, - )); - assert_eq!( - System::::events(), - vec![EventRecord { - phase: Phase::Initialization, - event: TestEvent::Parachains(Event::IncorrectParachainHeadHash { - parachain: ParaId(1), - parachain_head_hash: head_data(1, 10).hash(), - actual_parachain_head_hash: head_data(1, 0).hash(), - }), - topics: vec![], - }], - ); - }); - } - - #[test] - fn test_bridge_parachain_call_is_correctly_defined() { - let (state_root, proof, _) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); - let parachains = vec![(ParaId(2), Default::default())]; - let relay_header_id = (0, test_relay_header(0, state_root).hash()); - - let direct_submit_parachain_heads_call = Call::::submit_parachain_heads { - at_relay_block: relay_header_id, - parachains: parachains.clone(), - parachain_heads_proof: proof.clone(), - }; - let indirect_submit_parachain_heads_call = BridgeParachainCall::submit_parachain_heads { - at_relay_block: relay_header_id, - parachains, - parachain_heads_proof: proof, - }; - assert_eq!( - direct_submit_parachain_heads_call.encode(), - indirect_submit_parachain_heads_call.encode() - ); - } - - generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); - - #[test] - fn maybe_max_parachains_returns_correct_value() { - assert_eq!(MaybeMaxParachains::::get(), Some(mock::TOTAL_PARACHAINS)); - } - - #[test] - fn maybe_max_total_parachain_hashes_returns_correct_value() { - assert_eq!( - MaybeMaxTotalParachainHashes::::get(), - Some(mock::TOTAL_PARACHAINS * mock::HeadsToKeep::get()), - ); - } - - #[test] - fn submit_finality_proof_requires_signed_origin() { - run_test(|| { - let (state_root, proof, parachains) = - prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); - - initialize(state_root); - - // `submit_parachain_heads()` should fail when the pallet is halted. - assert_noop!( - Pallet::::submit_parachain_heads( - RuntimeOrigin::root(), - (0, test_relay_header(0, state_root).hash()), - parachains, - proof, - ), - DispatchError::BadOrigin - ); - }) - } -} diff --git a/cumulus/bridges/modules/parachains/src/mock.rs b/cumulus/bridges/modules/parachains/src/mock.rs deleted file mode 100644 index a7030f0ae031..000000000000 --- a/cumulus/bridges/modules/parachains/src/mock.rs +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -use bp_header_chain::ChainWithGrandpa; -use bp_polkadot_core::parachains::ParaId; -use bp_runtime::{Chain, Parachain}; -use frame_support::{construct_runtime, parameter_types, traits::ConstU32, weights::Weight}; -use sp_runtime::{ - testing::H256, - traits::{BlakeTwo256, Header as HeaderT, IdentityLookup}, - MultiSignature, Perbill, -}; - -use crate as pallet_bridge_parachains; - -pub type AccountId = u64; -pub type TestNumber = u64; - -pub type RelayBlockHeader = - sp_runtime::generic::Header; - -type Block = frame_system::mocking::MockBlock; - -pub const PARAS_PALLET_NAME: &str = "Paras"; -pub const UNTRACKED_PARACHAIN_ID: u32 = 10; -// use exact expected encoded size: `vec_len_size + header_number_size + state_root_hash_size` -pub const MAXIMAL_PARACHAIN_HEAD_DATA_SIZE: u32 = 1 + 8 + 32; -// total parachains that we use in tests -pub const TOTAL_PARACHAINS: u32 = 4; - -pub type RegularParachainHeader = sp_runtime::testing::Header; -pub type RegularParachainHasher = BlakeTwo256; -pub type BigParachainHeader = sp_runtime::generic::Header; - -pub struct Parachain1; - -impl Chain for Parachain1 { - type BlockNumber = u64; - type Hash = H256; - type Hasher = RegularParachainHasher; - type Header = RegularParachainHeader; - type AccountId = u64; - type Balance = u64; - type Nonce = u64; - type Signature = MultiSignature; - - fn max_extrinsic_size() -> u32 { - 0 - } - fn max_extrinsic_weight() -> Weight { - Weight::zero() - } -} - -impl Parachain for Parachain1 { - const PARACHAIN_ID: u32 = 1; -} - -pub struct Parachain2; - -impl Chain for Parachain2 { - type BlockNumber = u64; - type Hash = H256; - type Hasher = RegularParachainHasher; - type Header = RegularParachainHeader; - type AccountId = u64; - type Balance = u64; - type Nonce = u64; - type Signature = MultiSignature; - - fn max_extrinsic_size() -> u32 { - 0 - } - fn max_extrinsic_weight() -> Weight { - Weight::zero() - } -} - -impl Parachain for Parachain2 { - const PARACHAIN_ID: u32 = 2; -} - -pub struct Parachain3; - -impl Chain for Parachain3 { - type BlockNumber = u64; - type Hash = H256; - type Hasher = RegularParachainHasher; - type Header = RegularParachainHeader; - type AccountId = u64; - type Balance = u64; - type Nonce = u64; - type Signature = MultiSignature; - - fn max_extrinsic_size() -> u32 { - 0 - } - fn max_extrinsic_weight() -> Weight { - Weight::zero() - } -} - -impl Parachain for Parachain3 { - const PARACHAIN_ID: u32 = 3; -} - -// this parachain is using u128 as block number and stored head data size exceeds limit -pub struct BigParachain; - -impl Chain for BigParachain { - type BlockNumber = u128; - type Hash = H256; - type Hasher = RegularParachainHasher; - type Header = BigParachainHeader; - type AccountId = u64; - type Balance = u64; - type Nonce = u64; - type Signature = MultiSignature; - - fn max_extrinsic_size() -> u32 { - 0 - } - fn max_extrinsic_weight() -> Weight { - Weight::zero() - } -} - -impl Parachain for BigParachain { - const PARACHAIN_ID: u32 = 4; -} - -construct_runtime! { - pub enum TestRuntime - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Grandpa1: pallet_bridge_grandpa::::{Pallet, Event}, - Grandpa2: pallet_bridge_grandpa::::{Pallet, Event}, - Parachains: pallet_bridge_parachains::{Call, Pallet, Event}, - } -} - -parameter_types! { - pub const BlockHashCount: TestNumber = 250; - pub const MaximumBlockWeight: Weight = Weight::from_parts(1024, 0); - pub const MaximumBlockLength: u32 = 2 * 1024; - pub const AvailableBlockRatio: Perbill = Perbill::one(); -} - -impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Block = Block; - type Hash = H256; - type Hashing = RegularParachainHasher; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type DbWeight = (); - type BlockWeights = (); - type BlockLength = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; -} - -parameter_types! { - pub const SessionLength: u64 = 5; - pub const NumValidators: u32 = 5; - pub const HeadersToKeep: u32 = 5; -} - -impl pallet_bridge_grandpa::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type BridgedChain = TestBridgedChain; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; - type HeadersToKeep = HeadersToKeep; - type WeightInfo = (); -} - -impl pallet_bridge_grandpa::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type BridgedChain = TestBridgedChain; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; - type HeadersToKeep = HeadersToKeep; - type WeightInfo = (); -} - -parameter_types! { - pub const HeadsToKeep: u32 = 4; - pub const ParasPalletName: &'static str = PARAS_PALLET_NAME; - pub GetTenFirstParachains: Vec = (0..10).map(ParaId).collect(); -} - -impl pallet_bridge_parachains::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = (); - type BridgesGrandpaPalletInstance = pallet_bridge_grandpa::Instance1; - type ParasPalletName = ParasPalletName; - type ParaStoredHeaderDataBuilder = (Parachain1, Parachain2, Parachain3, BigParachain); - type HeadsToKeep = HeadsToKeep; - type MaxParaHeadDataSize = ConstU32; -} - -#[cfg(feature = "runtime-benchmarks")] -impl pallet_bridge_parachains::benchmarking::Config<()> for TestRuntime { - fn parachains() -> Vec { - vec![ - ParaId(Parachain1::PARACHAIN_ID), - ParaId(Parachain2::PARACHAIN_ID), - ParaId(Parachain3::PARACHAIN_ID), - ] - } - - fn prepare_parachain_heads_proof( - parachains: &[ParaId], - _parachain_head_size: u32, - _proof_size: bp_runtime::StorageProofSize, - ) -> ( - crate::RelayBlockNumber, - crate::RelayBlockHash, - bp_polkadot_core::parachains::ParaHeadsProof, - Vec<(ParaId, bp_polkadot_core::parachains::ParaHash)>, - ) { - // in mock run we only care about benchmarks correctness, not the benchmark results - // => ignore size related arguments - let (state_root, proof, parachains) = - bp_test_utils::prepare_parachain_heads_proof::( - parachains.iter().map(|p| (p.0, crate::tests::head_data(p.0, 1))).collect(), - ); - let relay_genesis_hash = crate::tests::initialize(state_root); - (0, relay_genesis_hash, proof, parachains) - } -} - -#[derive(Debug)] -pub struct TestBridgedChain; - -impl Chain for TestBridgedChain { - type BlockNumber = crate::RelayBlockNumber; - type Hash = crate::RelayBlockHash; - type Hasher = crate::RelayBlockHasher; - type Header = RelayBlockHeader; - - type AccountId = AccountId; - type Balance = u32; - type Nonce = u32; - type Signature = sp_runtime::testing::TestSignature; - - fn max_extrinsic_size() -> u32 { - unreachable!() - } - - fn max_extrinsic_weight() -> Weight { - unreachable!() - } -} - -impl ChainWithGrandpa for TestBridgedChain { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; - const MAX_AUTHORITIES_COUNT: u32 = 16; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; - const MAX_HEADER_SIZE: u32 = 256; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; -} - -#[derive(Debug)] -pub struct OtherBridgedChain; - -impl Chain for OtherBridgedChain { - type BlockNumber = u64; - type Hash = crate::RelayBlockHash; - type Hasher = crate::RelayBlockHasher; - type Header = sp_runtime::generic::Header; - - type AccountId = AccountId; - type Balance = u32; - type Nonce = u32; - type Signature = sp_runtime::testing::TestSignature; - - fn max_extrinsic_size() -> u32 { - unreachable!() - } - - fn max_extrinsic_weight() -> Weight { - unreachable!() - } -} - -impl ChainWithGrandpa for OtherBridgedChain { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; - const MAX_AUTHORITIES_COUNT: u32 = 16; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; - const MAX_HEADER_SIZE: u32 = 256; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 64; -} - -/// Return test externalities to use in tests. -pub fn new_test_ext() -> sp_io::TestExternalities { - sp_io::TestExternalities::new(Default::default()) -} - -/// Run pallet test. -pub fn run_test(test: impl FnOnce() -> T) -> T { - new_test_ext().execute_with(|| { - System::set_block_number(1); - System::reset_events(); - test() - }) -} - -/// Return test relay chain header with given number. -pub fn test_relay_header( - num: crate::RelayBlockNumber, - state_root: crate::RelayBlockHash, -) -> RelayBlockHeader { - RelayBlockHeader::new( - num, - Default::default(), - state_root, - Default::default(), - Default::default(), - ) -} diff --git a/cumulus/bridges/modules/parachains/src/weights.rs b/cumulus/bridges/modules/parachains/src/weights.rs deleted file mode 100644 index 1e81dba72fe9..000000000000 --- a/cumulus/bridges/modules/parachains/src/weights.rs +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Autogenerated weights for pallet_bridge_parachains -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-03-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 - -// Executed Command: -// target/release/millau-bridge-node -// benchmark -// pallet -// --chain=dev -// --steps=50 -// --repeat=20 -// --pallet=pallet_bridge_parachains -// --extrinsic=* -// --execution=wasm -// --wasm-execution=Compiled -// --heap-pages=4096 -// --output=./modules/parachains/src/weights.rs -// --template=./.maintain/bridge-weight-template.hbs - -#![allow(clippy::all)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_bridge_parachains. -pub trait WeightInfo { - fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight; - fn submit_parachain_heads_with_1kb_proof() -> Weight; - fn submit_parachain_heads_with_16kb_proof() -> Weight; -} - -/// Weights for `pallet_bridge_parachains` that are generated using one of the Bridge testnets. -/// -/// Those weights are test only and must never be used in production. -pub struct BridgeWeight(PhantomData); -impl WeightInfo for BridgeWeight { - /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: - /// 555, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: - /// Some(64), added: 1549, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: - /// Some(196), added: 1681, mode: MaxEncodedLen) - /// - /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 36_701 nanoseconds. - Weight::from_parts(38_597_828, 4648) - // Standard Error: 190_859 - .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: - /// 555, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: - /// Some(64), added: 1549, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: - /// Some(196), added: 1681, mode: MaxEncodedLen) - fn submit_parachain_heads_with_1kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 38_189 nanoseconds. - Weight::from_parts(39_252_000, 4648) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: - /// 555, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: - /// Some(64), added: 1549, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: - /// Some(196), added: 1681, mode: MaxEncodedLen) - fn submit_parachain_heads_with_16kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 62_868 nanoseconds. - Weight::from_parts(63_581_000, 4648) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } -} - -// For backwards compatibility and tests -impl WeightInfo for () { - /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: - /// 555, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: - /// Some(64), added: 1549, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: - /// Some(196), added: 1681, mode: MaxEncodedLen) - /// - /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 36_701 nanoseconds. - Weight::from_parts(38_597_828, 4648) - // Standard Error: 190_859 - .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: - /// 555, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: - /// Some(64), added: 1549, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: - /// Some(196), added: 1681, mode: MaxEncodedLen) - fn submit_parachain_heads_with_1kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 38_189 nanoseconds. - Weight::from_parts(39_252_000, 4648) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRialtoParachains PalletOperatingMode (r:1 w:0) - /// - /// Proof: BridgeRialtoParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), - /// added: 496, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoGrandpa ImportedHeaders (r:1 w:0) - /// - /// Proof: BridgeRialtoGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), - /// added: 2048, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ParasInfo (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: - /// 555, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHashes (r:1 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHashes (max_values: Some(1024), max_size: - /// Some(64), added: 1549, mode: MaxEncodedLen) - /// - /// Storage: BridgeRialtoParachains ImportedParaHeads (r:0 w:1) - /// - /// Proof: BridgeRialtoParachains ImportedParaHeads (max_values: Some(1024), max_size: - /// Some(196), added: 1681, mode: MaxEncodedLen) - fn submit_parachain_heads_with_16kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `4648` - // Minimum execution time: 62_868 nanoseconds. - Weight::from_parts(63_581_000, 4648) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - } -} diff --git a/cumulus/bridges/modules/parachains/src/weights_ext.rs b/cumulus/bridges/modules/parachains/src/weights_ext.rs deleted file mode 100644 index eecdfe903593..000000000000 --- a/cumulus/bridges/modules/parachains/src/weights_ext.rs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Weight-related utilities. - -use crate::weights::{BridgeWeight, WeightInfo}; - -use bp_runtime::Size; -use frame_support::weights::{RuntimeDbWeight, Weight}; - -/// Size of the regular parachain head. -/// -/// It's not that we are expecting all parachain heads to share the same size or that we would -/// reject all heads that have larger/lesser size. It is about head size that we use in benchmarks. -/// Relayer would need to pay additional fee for extra bytes. -/// -/// 384 is a bit larger (1.3 times) than the size of the randomly chosen Polkadot block. -pub const DEFAULT_PARACHAIN_HEAD_SIZE: u32 = 384; - -/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at -/// the Rialto chain. -pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; - -/// Extended weight info. -pub trait WeightInfoExt: WeightInfo { - /// Storage proof overhead, that is included in every storage proof. - /// - /// The relayer would pay some extra fee for additional proof bytes, since they mean - /// more hashing operations. - fn expected_extra_storage_proof_size() -> u32; - - /// Weight of the parachain heads delivery extrinsic. - fn submit_parachain_heads_weight( - db_weight: RuntimeDbWeight, - proof: &impl Size, - parachains_count: u32, - ) -> Weight { - // weight of the `submit_parachain_heads` with exactly `parachains_count` parachain - // heads of the default size (`DEFAULT_PARACHAIN_HEAD_SIZE`) - let base_weight = Self::submit_parachain_heads_with_n_parachains(parachains_count); - - // overhead because of extra storage proof bytes - let expected_proof_size = parachains_count - .saturating_mul(DEFAULT_PARACHAIN_HEAD_SIZE) - .saturating_add(Self::expected_extra_storage_proof_size()); - let actual_proof_size = proof.size(); - let proof_size_overhead = Self::storage_proof_size_overhead( - actual_proof_size.saturating_sub(expected_proof_size), - ); - - // potential pruning weight (refunded if hasn't happened) - let pruning_weight = - Self::parachain_head_pruning_weight(db_weight).saturating_mul(parachains_count as u64); - - base_weight.saturating_add(proof_size_overhead).saturating_add(pruning_weight) - } - - /// Returns weight of single parachain head storage update. - /// - /// This weight only includes db write operations that happens if parachain head is actually - /// updated. All extra weights (weight of storage proof validation, additional checks, ...) is - /// not included. - fn parachain_head_storage_write_weight(db_weight: RuntimeDbWeight) -> Weight { - // it's just a couple of operations - we need to write the hash (`ImportedParaHashes`) and - // the head itself (`ImportedParaHeads`. Pruning is not included here - db_weight.writes(2) - } - - /// Returns weight of single parachain head pruning. - fn parachain_head_pruning_weight(db_weight: RuntimeDbWeight) -> Weight { - // it's just one write operation, we don't want any benchmarks for that - db_weight.writes(1) - } - - /// Returns weight that needs to be accounted when storage proof of given size is received. - fn storage_proof_size_overhead(extra_proof_bytes: u32) -> Weight { - let extra_byte_weight = (Self::submit_parachain_heads_with_16kb_proof() - - Self::submit_parachain_heads_with_1kb_proof()) / - (15 * 1024); - extra_byte_weight.saturating_mul(extra_proof_bytes as u64) - } -} - -impl WeightInfoExt for () { - fn expected_extra_storage_proof_size() -> u32 { - EXTRA_STORAGE_PROOF_SIZE - } -} - -impl WeightInfoExt for BridgeWeight { - fn expected_extra_storage_proof_size() -> u32 { - EXTRA_STORAGE_PROOF_SIZE - } -} diff --git a/cumulus/bridges/modules/relayers/Cargo.toml b/cumulus/bridges/modules/relayers/Cargo.toml deleted file mode 100644 index 93b091797060..000000000000 --- a/cumulus/bridges/modules/relayers/Cargo.toml +++ /dev/null @@ -1,59 +0,0 @@ -[package] -name = "pallet-bridge-relayers" -description = "Module used to store relayer rewards and coordinate relayers set." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Bridge dependencies - -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-relayers = { path = "../../primitives/relayers", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -pallet-bridge-messages = { path = "../messages", default-features = false } - -# Substrate Dependencies - -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[dev-dependencies] -bp-runtime = { path = "../../primitives/runtime" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "bp-messages/std", - "bp-relayers/std", - "bp-runtime/std", - "codec/std", - "frame-benchmarking/std", - "frame-support/std", - "frame-system/std", - "log/std", - "scale-info/std", - "sp-arithmetic/std", - "sp-runtime/std", - "sp-std/std", -] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", -] -try-runtime = [ - "frame-support/try-runtime", - "frame-system/try-runtime", -] diff --git a/cumulus/bridges/modules/relayers/src/benchmarking.rs b/cumulus/bridges/modules/relayers/src/benchmarking.rs deleted file mode 100644 index d66a11ff06d0..000000000000 --- a/cumulus/bridges/modules/relayers/src/benchmarking.rs +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Benchmarks for the relayers Pallet. - -#![cfg(feature = "runtime-benchmarks")] - -use crate::*; - -use bp_messages::LaneId; -use bp_relayers::RewardsAccountOwner; -use frame_benchmarking::{benchmarks, whitelisted_caller}; -use frame_system::RawOrigin; -use sp_runtime::traits::One; - -/// Reward amount that is (hopefully) is larger than existential deposit across all chains. -const REWARD_AMOUNT: u32 = u32::MAX; - -/// Pallet we're benchmarking here. -pub struct Pallet(crate::Pallet); - -/// Trait that must be implemented by runtime. -pub trait Config: crate::Config { - /// Prepare environment for paying given reward for serving given lane. - fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Self::Reward); - /// Give enough balance to given account. - fn deposit_account(account: Self::AccountId, balance: Self::Reward); -} - -benchmarks! { - // Benchmark `claim_rewards` call. - claim_rewards { - let lane = LaneId([0, 0, 0, 0]); - let account_params = - RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); - let relayer: T::AccountId = whitelisted_caller(); - let reward = T::Reward::from(REWARD_AMOUNT); - - T::prepare_rewards_account(account_params, reward); - RelayerRewards::::insert(&relayer, account_params, reward); - }: _(RawOrigin::Signed(relayer), account_params) - verify { - // we can't check anything here, because `PaymentProcedure` is responsible for - // payment logic, so we assume that if call has succeeded, the procedure has - // also completed successfully - } - - // Benchmark `register` call. - register { - let relayer: T::AccountId = whitelisted_caller(); - let valid_till = frame_system::Pallet::::block_number() - .saturating_add(crate::Pallet::::required_registration_lease()) - .saturating_add(One::one()) - .saturating_add(One::one()); - - T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); - }: _(RawOrigin::Signed(relayer.clone()), valid_till) - verify { - assert!(crate::Pallet::::is_registration_active(&relayer)); - } - - // Benchmark `deregister` call. - deregister { - let relayer: T::AccountId = whitelisted_caller(); - let valid_till = frame_system::Pallet::::block_number() - .saturating_add(crate::Pallet::::required_registration_lease()) - .saturating_add(One::one()) - .saturating_add(One::one()); - T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); - crate::Pallet::::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap(); - - frame_system::Pallet::::set_block_number(valid_till.saturating_add(One::one())); - }: _(RawOrigin::Signed(relayer.clone())) - verify { - assert!(!crate::Pallet::::is_registration_active(&relayer)); - } - - // Benchmark `slash_and_deregister` method of the pallet. We are adding this weight to - // the weight of message delivery call if `RefundBridgedParachainMessages` signed extension - // is deployed at runtime level. - slash_and_deregister { - // prepare and register relayer account - let relayer: T::AccountId = whitelisted_caller(); - let valid_till = frame_system::Pallet::::block_number() - .saturating_add(crate::Pallet::::required_registration_lease()) - .saturating_add(One::one()) - .saturating_add(One::one()); - T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); - crate::Pallet::::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap(); - - // create slash destination account - let lane = LaneId([0, 0, 0, 0]); - let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); - T::prepare_rewards_account(slash_destination.clone(), Zero::zero()); - }: { - crate::Pallet::::slash_and_deregister(&relayer, slash_destination) - } - verify { - assert!(!crate::Pallet::::is_registration_active(&relayer)); - } - - // Benchmark `register_relayer_reward` method of the pallet. We are adding this weight to - // the weight of message delivery call if `RefundBridgedParachainMessages` signed extension - // is deployed at runtime level. - register_relayer_reward { - let lane = LaneId([0, 0, 0, 0]); - let relayer: T::AccountId = whitelisted_caller(); - let account_params = - RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); - }: { - crate::Pallet::::register_relayer_reward(account_params.clone(), &relayer, One::one()); - } - verify { - assert_eq!(RelayerRewards::::get(relayer, &account_params), Some(One::one())); - } - - impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) -} diff --git a/cumulus/bridges/modules/relayers/src/lib.rs b/cumulus/bridges/modules/relayers/src/lib.rs deleted file mode 100644 index a71c218443b3..000000000000 --- a/cumulus/bridges/modules/relayers/src/lib.rs +++ /dev/null @@ -1,880 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Runtime module that is used to store relayer rewards and (in the future) to -//! coordinate relations between relayers. - -#![cfg_attr(not(feature = "std"), no_std)] -#![warn(missing_docs)] - -use bp_relayers::{ - PaymentProcedure, Registration, RelayerRewardsKeyProvider, RewardsAccountParams, StakeAndSlash, -}; -use bp_runtime::StorageDoubleMapKeyProvider; -use frame_support::fail; -use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero}; -use sp_runtime::{traits::CheckedSub, Saturating}; -use sp_std::marker::PhantomData; - -pub use pallet::*; -pub use payment_adapter::DeliveryConfirmationPaymentsAdapter; -pub use stake_adapter::StakeAndSlashNamed; -pub use weights::WeightInfo; -pub use weights_ext::WeightInfoExt; - -pub mod benchmarking; - -mod mock; -mod payment_adapter; -mod stake_adapter; -mod weights_ext; - -pub mod weights; - -/// The target that will be used when publishing logs related to this pallet. -pub const LOG_TARGET: &str = "runtime::bridge-relayers"; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - /// `RelayerRewardsKeyProvider` for given configuration. - type RelayerRewardsKeyProviderOf = - RelayerRewardsKeyProvider<::AccountId, ::Reward>; - - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Type of relayer reward. - type Reward: AtLeast32BitUnsigned + Copy + Parameter + MaxEncodedLen; - /// Pay rewards scheme. - type PaymentProcedure: PaymentProcedure; - /// Stake and slash scheme. - type StakeAndSlash: StakeAndSlash, Self::Reward>; - /// Pallet call weights. - type WeightInfo: WeightInfoExt; - } - - #[pallet::pallet] - pub struct Pallet(PhantomData); - - #[pallet::call] - impl Pallet { - /// Claim accumulated rewards. - #[pallet::call_index(0)] - #[pallet::weight(T::WeightInfo::claim_rewards())] - pub fn claim_rewards( - origin: OriginFor, - rewards_account_params: RewardsAccountParams, - ) -> DispatchResult { - let relayer = ensure_signed(origin)?; - - RelayerRewards::::try_mutate_exists( - &relayer, - rewards_account_params, - |maybe_reward| -> DispatchResult { - let reward = maybe_reward.take().ok_or(Error::::NoRewardForRelayer)?; - T::PaymentProcedure::pay_reward(&relayer, rewards_account_params, reward) - .map_err(|e| { - log::trace!( - target: LOG_TARGET, - "Failed to pay {:?} rewards to {:?}: {:?}", - rewards_account_params, - relayer, - e, - ); - Error::::FailedToPayReward - })?; - - Self::deposit_event(Event::::RewardPaid { - relayer: relayer.clone(), - rewards_account_params, - reward, - }); - Ok(()) - }, - ) - } - - /// Register relayer or update its registration. - /// - /// Registration allows relayer to get priority boost for its message delivery transactions. - #[pallet::call_index(1)] - #[pallet::weight(T::WeightInfo::register())] - pub fn register(origin: OriginFor, valid_till: BlockNumberFor) -> DispatchResult { - let relayer = ensure_signed(origin)?; - - // valid till must be larger than the current block number and the lease must be larger - // than the `RequiredRegistrationLease` - let lease = valid_till.saturating_sub(frame_system::Pallet::::block_number()); - ensure!( - lease > Pallet::::required_registration_lease(), - Error::::InvalidRegistrationLease - ); - - RegisteredRelayers::::try_mutate(&relayer, |maybe_registration| -> DispatchResult { - let mut registration = maybe_registration - .unwrap_or_else(|| Registration { valid_till, stake: Zero::zero() }); - - // new `valid_till` must be larger (or equal) than the old one - ensure!( - valid_till >= registration.valid_till, - Error::::CannotReduceRegistrationLease, - ); - registration.valid_till = valid_till; - - // regarding stake, there are three options: - // - if relayer stake is larger than required stake, we may do unreserve - // - if relayer stake equals to required stake, we do nothing - // - if relayer stake is smaller than required stake, we do additional reserve - let required_stake = Pallet::::required_stake(); - if let Some(to_unreserve) = registration.stake.checked_sub(&required_stake) { - Self::do_unreserve(&relayer, to_unreserve)?; - } else if let Some(to_reserve) = required_stake.checked_sub(®istration.stake) { - T::StakeAndSlash::reserve(&relayer, to_reserve).map_err(|e| { - log::trace!( - target: LOG_TARGET, - "Failed to reserve {:?} on relayer {:?} account: {:?}", - to_reserve, - relayer, - e, - ); - - Error::::FailedToReserve - })?; - } - registration.stake = required_stake; - - log::trace!(target: LOG_TARGET, "Successfully registered relayer: {:?}", relayer); - Self::deposit_event(Event::::RegistrationUpdated { - relayer: relayer.clone(), - registration, - }); - - *maybe_registration = Some(registration); - - Ok(()) - }) - } - - /// `Deregister` relayer. - /// - /// After this call, message delivery transactions of the relayer won't get any priority - /// boost. - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::deregister())] - pub fn deregister(origin: OriginFor) -> DispatchResult { - let relayer = ensure_signed(origin)?; - - RegisteredRelayers::::try_mutate(&relayer, |maybe_registration| -> DispatchResult { - let registration = match maybe_registration.take() { - Some(registration) => registration, - None => fail!(Error::::NotRegistered), - }; - - // we can't deregister until `valid_till + 1` - ensure!( - registration.valid_till < frame_system::Pallet::::block_number(), - Error::::RegistrationIsStillActive, - ); - - // if stake is non-zero, we should do unreserve - if !registration.stake.is_zero() { - Self::do_unreserve(&relayer, registration.stake)?; - } - - log::trace!(target: LOG_TARGET, "Successfully deregistered relayer: {:?}", relayer); - Self::deposit_event(Event::::Deregistered { relayer: relayer.clone() }); - - *maybe_registration = None; - - Ok(()) - }) - } - } - - impl Pallet { - /// Returns true if given relayer registration is active at current block. - /// - /// This call respects both `RequiredStake` and `RequiredRegistrationLease`, meaning that - /// it'll return false if registered stake is lower than required or if remaining lease - /// is less than `RequiredRegistrationLease`. - pub fn is_registration_active(relayer: &T::AccountId) -> bool { - let registration = match Self::registered_relayer(relayer) { - Some(registration) => registration, - None => return false, - }; - - // registration is inactive if relayer stake is less than required - if registration.stake < Self::required_stake() { - return false - } - - // registration is inactive if it ends soon - let remaining_lease = registration - .valid_till - .saturating_sub(frame_system::Pallet::::block_number()); - if remaining_lease <= Self::required_registration_lease() { - return false - } - - true - } - - /// Slash and `deregister` relayer. This function slashes all staked balance. - /// - /// It may fail inside, but error is swallowed and we only log it. - pub fn slash_and_deregister( - relayer: &T::AccountId, - slash_destination: RewardsAccountParams, - ) { - let registration = match RegisteredRelayers::::take(relayer) { - Some(registration) => registration, - None => { - log::trace!( - target: crate::LOG_TARGET, - "Cannot slash unregistered relayer {:?}", - relayer, - ); - - return - }, - }; - - match T::StakeAndSlash::repatriate_reserved( - relayer, - slash_destination, - registration.stake, - ) { - Ok(failed_to_slash) if failed_to_slash.is_zero() => { - log::trace!( - target: crate::LOG_TARGET, - "Relayer account {:?} has been slashed for {:?}. Funds were deposited to {:?}", - relayer, - registration.stake, - slash_destination, - ); - }, - Ok(failed_to_slash) => { - log::trace!( - target: crate::LOG_TARGET, - "Relayer account {:?} has been partially slashed for {:?}. Funds were deposited to {:?}. \ - Failed to slash: {:?}", - relayer, - registration.stake, - slash_destination, - failed_to_slash, - ); - }, - Err(e) => { - // TODO: document this. Where? - - // it may fail if there's no beneficiary account. For us it means that this - // account must exists before we'll deploy the bridge - log::debug!( - target: crate::LOG_TARGET, - "Failed to slash relayer account {:?}: {:?}. Maybe beneficiary account doesn't exist? \ - Beneficiary: {:?}, amount: {:?}, failed to slash: {:?}", - relayer, - e, - slash_destination, - registration.stake, - registration.stake, - ); - }, - } - } - - /// Register reward for given relayer. - pub fn register_relayer_reward( - rewards_account_params: RewardsAccountParams, - relayer: &T::AccountId, - reward: T::Reward, - ) { - if reward.is_zero() { - return - } - - RelayerRewards::::mutate( - relayer, - rewards_account_params, - |old_reward: &mut Option| { - let new_reward = old_reward.unwrap_or_else(Zero::zero).saturating_add(reward); - *old_reward = Some(new_reward); - - log::trace!( - target: crate::LOG_TARGET, - "Relayer {:?} can now claim reward for serving payer {:?}: {:?}", - relayer, - rewards_account_params, - new_reward, - ); - }, - ); - } - - /// Return required registration lease. - pub(crate) fn required_registration_lease() -> BlockNumberFor { - , - T::Reward, - >>::RequiredRegistrationLease::get() - } - - /// Return required stake. - pub(crate) fn required_stake() -> T::Reward { - , - T::Reward, - >>::RequiredStake::get() - } - - /// `Unreserve` given amount on relayer account. - fn do_unreserve(relayer: &T::AccountId, amount: T::Reward) -> DispatchResult { - let failed_to_unreserve = T::StakeAndSlash::unreserve(relayer, amount); - if !failed_to_unreserve.is_zero() { - log::trace!( - target: LOG_TARGET, - "Failed to unreserve {:?}/{:?} on relayer {:?} account", - failed_to_unreserve, - amount, - relayer, - ); - - fail!(Error::::FailedToUnreserve) - } - - Ok(()) - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// Reward has been paid to the relayer. - RewardPaid { - /// Relayer account that has been rewarded. - relayer: T::AccountId, - /// Relayer has received reward from this account. - rewards_account_params: RewardsAccountParams, - /// Reward amount. - reward: T::Reward, - }, - /// Relayer registration has been added or updated. - RegistrationUpdated { - /// Relayer account that has been registered. - relayer: T::AccountId, - /// Relayer registration. - registration: Registration, T::Reward>, - }, - /// Relayer has been `deregistered`. - Deregistered { - /// Relayer account that has been `deregistered`. - relayer: T::AccountId, - }, - /// Relayer has been slashed and `deregistered`. - SlashedAndDeregistered { - /// Relayer account that has been `deregistered`. - relayer: T::AccountId, - /// Registration that was removed. - registration: Registration, T::Reward>, - }, - } - - #[pallet::error] - pub enum Error { - /// No reward can be claimed by given relayer. - NoRewardForRelayer, - /// Reward payment procedure has failed. - FailedToPayReward, - /// The relayer has tried to register for past block or registration lease - /// is too short. - InvalidRegistrationLease, - /// New registration lease is less than the previous one. - CannotReduceRegistrationLease, - /// Failed to reserve enough funds on relayer account. - FailedToReserve, - /// Failed to `unreserve` enough funds on relayer account. - FailedToUnreserve, - /// Cannot `deregister` if not registered. - NotRegistered, - /// Failed to `deregister` relayer, because lease is still active. - RegistrationIsStillActive, - } - - /// Map of the relayer => accumulated reward. - #[pallet::storage] - #[pallet::getter(fn relayer_reward)] - pub type RelayerRewards = StorageDoubleMap< - _, - as StorageDoubleMapKeyProvider>::Hasher1, - as StorageDoubleMapKeyProvider>::Key1, - as StorageDoubleMapKeyProvider>::Hasher2, - as StorageDoubleMapKeyProvider>::Key2, - as StorageDoubleMapKeyProvider>::Value, - OptionQuery, - >; - - /// Relayers that have reserved some of their balance to get free priority boost - /// for their message delivery transactions. - /// - /// Other relayers may submit transactions as well, but they will have default - /// priority and will be rejected (without significant tip) in case if registered - /// relayer is present. - #[pallet::storage] - #[pallet::getter(fn registered_relayer)] - pub type RegisteredRelayers = StorageMap< - _, - Blake2_128Concat, - T::AccountId, - Registration, T::Reward>, - OptionQuery, - >; -} - -#[cfg(test)] -mod tests { - use super::*; - use mock::{RuntimeEvent as TestEvent, *}; - - use crate::Event::RewardPaid; - use bp_messages::LaneId; - use bp_relayers::RewardsAccountOwner; - use frame_support::{ - assert_noop, assert_ok, - traits::fungible::{Inspect, Mutate}, - }; - use frame_system::{EventRecord, Pallet as System, Phase}; - use sp_runtime::DispatchError; - - fn get_ready_for_events() { - System::::set_block_number(1); - System::::reset_events(); - } - - #[test] - fn root_cant_claim_anything() { - run_test(|| { - assert_noop!( - Pallet::::claim_rewards( - RuntimeOrigin::root(), - TEST_REWARDS_ACCOUNT_PARAMS - ), - DispatchError::BadOrigin, - ); - }); - } - - #[test] - fn relayer_cant_claim_if_no_reward_exists() { - run_test(|| { - assert_noop!( - Pallet::::claim_rewards( - RuntimeOrigin::signed(REGULAR_RELAYER), - TEST_REWARDS_ACCOUNT_PARAMS - ), - Error::::NoRewardForRelayer, - ); - }); - } - - #[test] - fn relayer_cant_claim_if_payment_procedure_fails() { - run_test(|| { - RelayerRewards::::insert( - FAILING_RELAYER, - TEST_REWARDS_ACCOUNT_PARAMS, - 100, - ); - assert_noop!( - Pallet::::claim_rewards( - RuntimeOrigin::signed(FAILING_RELAYER), - TEST_REWARDS_ACCOUNT_PARAMS - ), - Error::::FailedToPayReward, - ); - }); - } - - #[test] - fn relayer_can_claim_reward() { - run_test(|| { - get_ready_for_events(); - - RelayerRewards::::insert( - REGULAR_RELAYER, - TEST_REWARDS_ACCOUNT_PARAMS, - 100, - ); - assert_ok!(Pallet::::claim_rewards( - RuntimeOrigin::signed(REGULAR_RELAYER), - TEST_REWARDS_ACCOUNT_PARAMS - )); - assert_eq!( - RelayerRewards::::get(REGULAR_RELAYER, TEST_REWARDS_ACCOUNT_PARAMS), - None - ); - - // Check if the `RewardPaid` event was emitted. - assert_eq!( - System::::events().last(), - Some(&EventRecord { - phase: Phase::Initialization, - event: TestEvent::Relayers(RewardPaid { - relayer: REGULAR_RELAYER, - rewards_account_params: TEST_REWARDS_ACCOUNT_PARAMS, - reward: 100 - }), - topics: vec![], - }), - ); - }); - } - - #[test] - fn pay_reward_from_account_actually_pays_reward() { - type Balances = pallet_balances::Pallet; - type PayLaneRewardFromAccount = bp_relayers::PayRewardFromAccount; - - run_test(|| { - let in_lane_0 = RewardsAccountParams::new( - LaneId([0, 0, 0, 0]), - *b"test", - RewardsAccountOwner::ThisChain, - ); - let out_lane_1 = RewardsAccountParams::new( - LaneId([0, 0, 0, 1]), - *b"test", - RewardsAccountOwner::BridgedChain, - ); - - let in_lane0_rewards_account = PayLaneRewardFromAccount::rewards_account(in_lane_0); - let out_lane1_rewards_account = PayLaneRewardFromAccount::rewards_account(out_lane_1); - - Balances::mint_into(&in_lane0_rewards_account, 100).unwrap(); - Balances::mint_into(&out_lane1_rewards_account, 100).unwrap(); - assert_eq!(Balances::balance(&in_lane0_rewards_account), 100); - assert_eq!(Balances::balance(&out_lane1_rewards_account), 100); - assert_eq!(Balances::balance(&1), 0); - - PayLaneRewardFromAccount::pay_reward(&1, in_lane_0, 100).unwrap(); - assert_eq!(Balances::balance(&in_lane0_rewards_account), 0); - assert_eq!(Balances::balance(&out_lane1_rewards_account), 100); - assert_eq!(Balances::balance(&1), 100); - - PayLaneRewardFromAccount::pay_reward(&1, out_lane_1, 100).unwrap(); - assert_eq!(Balances::balance(&in_lane0_rewards_account), 0); - assert_eq!(Balances::balance(&out_lane1_rewards_account), 0); - assert_eq!(Balances::balance(&1), 200); - }); - } - - #[test] - fn register_fails_if_valid_till_is_a_past_block() { - run_test(|| { - System::::set_block_number(100); - - assert_noop!( - Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 50), - Error::::InvalidRegistrationLease, - ); - }); - } - - #[test] - fn register_fails_if_valid_till_lease_is_less_than_required() { - run_test(|| { - System::::set_block_number(100); - - assert_noop!( - Pallet::::register( - RuntimeOrigin::signed(REGISTER_RELAYER), - 99 + Lease::get() - ), - Error::::InvalidRegistrationLease, - ); - }); - } - - #[test] - fn register_works() { - run_test(|| { - get_ready_for_events(); - - assert_ok!(Pallet::::register( - RuntimeOrigin::signed(REGISTER_RELAYER), - 150 - )); - assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); - assert_eq!( - Pallet::::registered_relayer(REGISTER_RELAYER), - Some(Registration { valid_till: 150, stake: Stake::get() }), - ); - - assert_eq!( - System::::events().last(), - Some(&EventRecord { - phase: Phase::Initialization, - event: TestEvent::Relayers(Event::RegistrationUpdated { - relayer: REGISTER_RELAYER, - registration: Registration { valid_till: 150, stake: Stake::get() }, - }), - topics: vec![], - }), - ); - }); - } - - #[test] - fn register_fails_if_new_valid_till_is_lesser_than_previous() { - run_test(|| { - assert_ok!(Pallet::::register( - RuntimeOrigin::signed(REGISTER_RELAYER), - 150 - )); - - assert_noop!( - Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 125), - Error::::CannotReduceRegistrationLease, - ); - }); - } - - #[test] - fn register_fails_if_it_cant_unreserve_some_balance_if_required_stake_decreases() { - run_test(|| { - RegisteredRelayers::::insert( - REGISTER_RELAYER, - Registration { valid_till: 150, stake: Stake::get() + 1 }, - ); - - assert_noop!( - Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), - Error::::FailedToUnreserve, - ); - }); - } - - #[test] - fn register_unreserves_some_balance_if_required_stake_decreases() { - run_test(|| { - get_ready_for_events(); - - RegisteredRelayers::::insert( - REGISTER_RELAYER, - Registration { valid_till: 150, stake: Stake::get() + 1 }, - ); - TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() + 1).unwrap(); - assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get() + 1); - let free_balance = Balances::free_balance(REGISTER_RELAYER); - - assert_ok!(Pallet::::register( - RuntimeOrigin::signed(REGISTER_RELAYER), - 150 - )); - assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); - assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + 1); - assert_eq!( - Pallet::::registered_relayer(REGISTER_RELAYER), - Some(Registration { valid_till: 150, stake: Stake::get() }), - ); - - assert_eq!( - System::::events().last(), - Some(&EventRecord { - phase: Phase::Initialization, - event: TestEvent::Relayers(Event::RegistrationUpdated { - relayer: REGISTER_RELAYER, - registration: Registration { valid_till: 150, stake: Stake::get() } - }), - topics: vec![], - }), - ); - }); - } - - #[test] - fn register_fails_if_it_cant_reserve_some_balance() { - run_test(|| { - Balances::set_balance(®ISTER_RELAYER, 0); - assert_noop!( - Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), - Error::::FailedToReserve, - ); - }); - } - - #[test] - fn register_fails_if_it_cant_reserve_some_balance_if_required_stake_increases() { - run_test(|| { - RegisteredRelayers::::insert( - REGISTER_RELAYER, - Registration { valid_till: 150, stake: Stake::get() - 1 }, - ); - Balances::set_balance(®ISTER_RELAYER, 0); - - assert_noop!( - Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), - Error::::FailedToReserve, - ); - }); - } - - #[test] - fn register_reserves_some_balance_if_required_stake_increases() { - run_test(|| { - get_ready_for_events(); - - RegisteredRelayers::::insert( - REGISTER_RELAYER, - Registration { valid_till: 150, stake: Stake::get() - 1 }, - ); - TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() - 1).unwrap(); - - let free_balance = Balances::free_balance(REGISTER_RELAYER); - assert_ok!(Pallet::::register( - RuntimeOrigin::signed(REGISTER_RELAYER), - 150 - )); - assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); - assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance - 1); - assert_eq!( - Pallet::::registered_relayer(REGISTER_RELAYER), - Some(Registration { valid_till: 150, stake: Stake::get() }), - ); - - assert_eq!( - System::::events().last(), - Some(&EventRecord { - phase: Phase::Initialization, - event: TestEvent::Relayers(Event::RegistrationUpdated { - relayer: REGISTER_RELAYER, - registration: Registration { valid_till: 150, stake: Stake::get() } - }), - topics: vec![], - }), - ); - }); - } - - #[test] - fn deregister_fails_if_not_registered() { - run_test(|| { - assert_noop!( - Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)), - Error::::NotRegistered, - ); - }); - } - - #[test] - fn deregister_fails_if_registration_is_still_active() { - run_test(|| { - assert_ok!(Pallet::::register( - RuntimeOrigin::signed(REGISTER_RELAYER), - 150 - )); - - System::::set_block_number(100); - - assert_noop!( - Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)), - Error::::RegistrationIsStillActive, - ); - }); - } - - #[test] - fn deregister_works() { - run_test(|| { - get_ready_for_events(); - - assert_ok!(Pallet::::register( - RuntimeOrigin::signed(REGISTER_RELAYER), - 150 - )); - - System::::set_block_number(151); - - let reserved_balance = Balances::reserved_balance(REGISTER_RELAYER); - let free_balance = Balances::free_balance(REGISTER_RELAYER); - assert_ok!(Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER))); - assert_eq!( - Balances::reserved_balance(REGISTER_RELAYER), - reserved_balance - Stake::get() - ); - assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + Stake::get()); - - assert_eq!( - System::::events().last(), - Some(&EventRecord { - phase: Phase::Initialization, - event: TestEvent::Relayers(Event::Deregistered { relayer: REGISTER_RELAYER }), - topics: vec![], - }), - ); - }); - } - - #[test] - fn is_registration_active_is_false_for_unregistered_relayer() { - run_test(|| { - assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); - }); - } - - #[test] - fn is_registration_active_is_false_when_stake_is_too_low() { - run_test(|| { - RegisteredRelayers::::insert( - REGISTER_RELAYER, - Registration { valid_till: 150, stake: Stake::get() - 1 }, - ); - assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); - }); - } - - #[test] - fn is_registration_active_is_false_when_remaining_lease_is_too_low() { - run_test(|| { - System::::set_block_number(150 - Lease::get()); - - RegisteredRelayers::::insert( - REGISTER_RELAYER, - Registration { valid_till: 150, stake: Stake::get() }, - ); - assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); - }); - } - - #[test] - fn is_registration_active_is_true_when_relayer_is_properly_registeered() { - run_test(|| { - System::::set_block_number(150 - Lease::get()); - - RegisteredRelayers::::insert( - REGISTER_RELAYER, - Registration { valid_till: 151, stake: Stake::get() }, - ); - assert!(Pallet::::is_registration_active(®ISTER_RELAYER)); - }); - } -} diff --git a/cumulus/bridges/modules/relayers/src/mock.rs b/cumulus/bridges/modules/relayers/src/mock.rs deleted file mode 100644 index b3fcb24cdd20..000000000000 --- a/cumulus/bridges/modules/relayers/src/mock.rs +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg(test)] - -use crate as pallet_bridge_relayers; - -use bp_messages::LaneId; -use bp_relayers::{ - PayRewardFromAccount, PaymentProcedure, RewardsAccountOwner, RewardsAccountParams, -}; -use frame_support::{parameter_types, traits::fungible::Mutate, weights::RuntimeDbWeight}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, ConstU32, IdentityLookup}, - BuildStorage, -}; - -pub type AccountId = u64; -pub type Balance = u64; -pub type BlockNumber = u64; - -pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< - AccountId, - BlockNumber, - Balances, - ReserveId, - Stake, - Lease, ->; - -type Block = frame_system::mocking::MockBlock; - -frame_support::construct_runtime! { - pub enum TestRuntime - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Balances: pallet_balances::{Pallet, Event}, - Relayers: pallet_bridge_relayers::{Pallet, Call, Event}, - } -} - -parameter_types! { - pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; - pub const ExistentialDeposit: Balance = 1; - pub const ReserveId: [u8; 8] = *b"brdgrlrs"; - pub const Stake: Balance = 1_000; - pub const Lease: BlockNumber = 8; -} - -impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Block = Block; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = frame_support::traits::ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = (); - type BlockLength = (); - type DbWeight = DbWeight; - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_balances::Config for TestRuntime { - type MaxLocks = (); - type Balance = Balance; - type DustRemoval = (); - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = frame_system::Pallet; - type WeightInfo = (); - type MaxReserves = ConstU32<1>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -impl pallet_bridge_relayers::Config for TestRuntime { - type RuntimeEvent = RuntimeEvent; - type Reward = Balance; - type PaymentProcedure = TestPaymentProcedure; - type StakeAndSlash = TestStakeAndSlash; - type WeightInfo = (); -} - -#[cfg(feature = "runtime-benchmarks")] -impl pallet_bridge_relayers::benchmarking::Config for TestRuntime { - fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Balance) { - let rewards_account = - bp_relayers::PayRewardFromAccount::::rewards_account( - account_params, - ); - Self::deposit_account(rewards_account, reward); - } - - fn deposit_account(account: Self::AccountId, balance: Self::Reward) { - Balances::mint_into(&account, balance.saturating_add(ExistentialDeposit::get())).unwrap(); - } -} - -/// Message lane that we're using in tests. -pub const TEST_REWARDS_ACCOUNT_PARAMS: RewardsAccountParams = - RewardsAccountParams::new(LaneId([0, 0, 0, 0]), *b"test", RewardsAccountOwner::ThisChain); - -/// Regular relayer that may receive rewards. -pub const REGULAR_RELAYER: AccountId = 1; - -/// Relayer that can't receive rewards. -pub const FAILING_RELAYER: AccountId = 2; - -/// Relayer that is able to register. -pub const REGISTER_RELAYER: AccountId = 42; - -/// Payment procedure that rejects payments to the `FAILING_RELAYER`. -pub struct TestPaymentProcedure; - -impl TestPaymentProcedure { - pub fn rewards_account(params: RewardsAccountParams) -> AccountId { - PayRewardFromAccount::<(), AccountId>::rewards_account(params) - } -} - -impl PaymentProcedure for TestPaymentProcedure { - type Error = (); - - fn pay_reward( - relayer: &AccountId, - _lane_id: RewardsAccountParams, - _reward: Balance, - ) -> Result<(), Self::Error> { - match *relayer { - FAILING_RELAYER => Err(()), - _ => Ok(()), - } - } -} - -/// Return test externalities to use in tests. -pub fn new_test_ext() -> sp_io::TestExternalities { - let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - sp_io::TestExternalities::new(t) -} - -/// Run pallet test. -pub fn run_test(test: impl FnOnce() -> T) -> T { - new_test_ext().execute_with(|| { - Balances::mint_into(®ISTER_RELAYER, ExistentialDeposit::get() + 10 * Stake::get()) - .unwrap(); - - test() - }) -} diff --git a/cumulus/bridges/modules/relayers/src/weights.rs b/cumulus/bridges/modules/relayers/src/weights.rs deleted file mode 100644 index 1bc195a54247..000000000000 --- a/cumulus/bridges/modules/relayers/src/weights.rs +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Autogenerated weights for pallet_bridge_relayers -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 - -// Executed Command: -// target/release/millau-bridge-node -// benchmark -// pallet -// --chain=dev -// --steps=50 -// --repeat=20 -// --pallet=pallet_bridge_relayers -// --extrinsic=* -// --execution=wasm -// --wasm-execution=Compiled -// --heap-pages=4096 -// --output=./modules/relayers/src/weights.rs -// --template=./.maintain/bridge-weight-template.hbs - -#![allow(clippy::all)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_bridge_relayers. -pub trait WeightInfo { - fn claim_rewards() -> Weight; - fn register() -> Weight; - fn deregister() -> Weight; - fn slash_and_deregister() -> Weight; - fn register_relayer_reward() -> Weight; -} - -/// Weights for `pallet_bridge_relayers` that are generated using one of the Bridge testnets. -/// -/// Those weights are test only and must never be used in production. -pub struct BridgeWeight(PhantomData); -impl WeightInfo for BridgeWeight { - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances TotalIssuance (r:1 w:0) - /// - /// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode: - /// MaxEncodedLen) - /// - /// Storage: System Account (r:1 w:1) - /// - /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: - /// MaxEncodedLen) - fn claim_rewards() -> Weight { - // Proof Size summary in bytes: - // Measured: `294` - // Estimated: `8592` - // Minimum execution time: 77_614 nanoseconds. - Weight::from_parts(79_987_000, 8592) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) - /// - /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances Reserves (r:1 w:1) - /// - /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: - /// MaxEncodedLen) - fn register() -> Weight { - // Proof Size summary in bytes: - // Measured: `87` - // Estimated: `7843` - // Minimum execution time: 39_590 nanoseconds. - Weight::from_parts(40_546_000, 7843) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) - /// - /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances Reserves (r:1 w:1) - /// - /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: - /// MaxEncodedLen) - fn deregister() -> Weight { - // Proof Size summary in bytes: - // Measured: `264` - // Estimated: `7843` - // Minimum execution time: 43_332 nanoseconds. - Weight::from_parts(45_087_000, 7843) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) - /// - /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances Reserves (r:1 w:1) - /// - /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: - /// MaxEncodedLen) - /// - /// Storage: System Account (r:1 w:1) - /// - /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: - /// MaxEncodedLen) - fn slash_and_deregister() -> Weight { - // Proof Size summary in bytes: - // Measured: `380` - // Estimated: `11412` - // Minimum execution time: 42_358 nanoseconds. - Weight::from_parts(43_539_000, 11412) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn register_relayer_reward() -> Weight { - // Proof Size summary in bytes: - // Measured: `12` - // Estimated: `3530` - // Minimum execution time: 6_338 nanoseconds. - Weight::from_parts(6_526_000, 3530) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } -} - -// For backwards compatibility and tests -impl WeightInfo for () { - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances TotalIssuance (r:1 w:0) - /// - /// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode: - /// MaxEncodedLen) - /// - /// Storage: System Account (r:1 w:1) - /// - /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: - /// MaxEncodedLen) - fn claim_rewards() -> Weight { - // Proof Size summary in bytes: - // Measured: `294` - // Estimated: `8592` - // Minimum execution time: 77_614 nanoseconds. - Weight::from_parts(79_987_000, 8592) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) - /// - /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances Reserves (r:1 w:1) - /// - /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: - /// MaxEncodedLen) - fn register() -> Weight { - // Proof Size summary in bytes: - // Measured: `87` - // Estimated: `7843` - // Minimum execution time: 39_590 nanoseconds. - Weight::from_parts(40_546_000, 7843) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) - /// - /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances Reserves (r:1 w:1) - /// - /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: - /// MaxEncodedLen) - fn deregister() -> Weight { - // Proof Size summary in bytes: - // Measured: `264` - // Estimated: `7843` - // Minimum execution time: 43_332 nanoseconds. - Weight::from_parts(45_087_000, 7843) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) - /// - /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, - /// mode: MaxEncodedLen) - /// - /// Storage: Balances Reserves (r:1 w:1) - /// - /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: - /// MaxEncodedLen) - /// - /// Storage: System Account (r:1 w:1) - /// - /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: - /// MaxEncodedLen) - fn slash_and_deregister() -> Weight { - // Proof Size summary in bytes: - // Measured: `380` - // Estimated: `11412` - // Minimum execution time: 42_358 nanoseconds. - Weight::from_parts(43_539_000, 11412) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - } - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, - /// mode: MaxEncodedLen) - fn register_relayer_reward() -> Weight { - // Proof Size summary in bytes: - // Measured: `12` - // Estimated: `3530` - // Minimum execution time: 6_338 nanoseconds. - Weight::from_parts(6_526_000, 3530) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } -} diff --git a/cumulus/bridges/modules/relayers/src/weights_ext.rs b/cumulus/bridges/modules/relayers/src/weights_ext.rs deleted file mode 100644 index d459b0686bd7..000000000000 --- a/cumulus/bridges/modules/relayers/src/weights_ext.rs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Weight-related utilities. - -use crate::weights::WeightInfo; - -use frame_support::pallet_prelude::Weight; - -/// Extended weight info. -pub trait WeightInfoExt: WeightInfo { - /// Returns weight, that needs to be added to the pre-dispatch weight of message delivery call, - /// if `RefundBridgedParachainMessages` signed extension is deployed at runtime level. - fn receive_messages_proof_overhead_from_runtime() -> Weight { - Self::slash_and_deregister().max(Self::register_relayer_reward()) - } - - /// Returns weight, that needs to be added to the pre-dispatch weight of message delivery - /// confirmation call, if `RefundBridgedParachainMessages` signed extension is deployed at - /// runtime level. - fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { - Self::register_relayer_reward() - } - - /// Returns weight that we need to deduct from the message delivery call weight that has - /// completed successfully. - /// - /// Usually, the weight of `slash_and_deregister` is larger than the weight of the - /// `register_relayer_reward`. So if relayer has been rewarded, we want to deduct the difference - /// to get the actual post-dispatch weight. - fn extra_weight_of_successful_receive_messages_proof_call() -> Weight { - Self::slash_and_deregister().saturating_sub(Self::register_relayer_reward()) - } -} - -impl WeightInfoExt for T {} diff --git a/cumulus/bridges/modules/xcm-bridge-hub-router/Cargo.toml b/cumulus/bridges/modules/xcm-bridge-hub-router/Cargo.toml deleted file mode 100644 index 3d13e7cc3d7f..000000000000 --- a/cumulus/bridges/modules/xcm-bridge-hub-router/Cargo.toml +++ /dev/null @@ -1,59 +0,0 @@ -[package] -name = "pallet-xcm-bridge-hub-router" -description = "Bridge hub interface for sibling/parent chains with dynamic fees support." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.19", default-features = false } -scale-info = { version = "2.8.0", default-features = false, features = ["bit-vec", "derive", "serde"] } - -# Bridge dependencies - -bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } - -# Substrate Dependencies - -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -# Polkadot Dependencies - -xcm = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } -xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } - -[dev-dependencies] -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "bp-xcm-bridge-hub-router/std", - "codec/std", - "frame-benchmarking/std", - "frame-support/std", - "frame-system/std", - "log/std", - "scale-info/std", - "sp-core/std", - "sp-runtime/std", - "sp-std/std", - "xcm/std", - "xcm-builder/std", -] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", -] -try-runtime = [ - "frame-support/try-runtime", - "frame-system/try-runtime", -] diff --git a/cumulus/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs b/cumulus/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs deleted file mode 100644 index b32b983daf72..000000000000 --- a/cumulus/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! XCM bridge hub router pallet benchmarks. - -#![cfg(feature = "runtime-benchmarks")] - -use crate::{Bridge, Call}; - -use bp_xcm_bridge_hub_router::{BridgeState, MINIMAL_DELIVERY_FEE_FACTOR}; -use frame_benchmarking::benchmarks_instance_pallet; -use frame_support::{ - dispatch::UnfilteredDispatchable, - traits::{EnsureOrigin, Get, Hooks}, -}; -use sp_runtime::traits::Zero; -use xcm::prelude::*; - -/// Pallet we're benchmarking here. -pub struct Pallet, I: 'static = ()>(crate::Pallet); - -/// Trait that must be implemented by runtime to be able to benchmark pallet properly. -pub trait Config: crate::Config { - /// Fill up queue so it becomes congested. - fn make_congested(); - - /// Returns destination which is valid for this router instance. - /// (Needs to pass `T::Bridges`) - /// Make sure that `SendXcm` will pass. - fn ensure_bridged_target_destination() -> MultiLocation { - MultiLocation::new( - Self::UniversalLocation::get().len() as u8, - X1(GlobalConsensus(Self::BridgedNetworkId::get().unwrap())), - ) - } -} - -benchmarks_instance_pallet! { - on_initialize_when_non_congested { - Bridge::::put(BridgeState { - is_congested: false, - delivery_fee_factor: MINIMAL_DELIVERY_FEE_FACTOR + MINIMAL_DELIVERY_FEE_FACTOR, - }); - }: { - crate::Pallet::::on_initialize(Zero::zero()) - } - - on_initialize_when_congested { - Bridge::::put(BridgeState { - is_congested: false, - delivery_fee_factor: MINIMAL_DELIVERY_FEE_FACTOR + MINIMAL_DELIVERY_FEE_FACTOR, - }); - T::make_congested(); - }: { - crate::Pallet::::on_initialize(Zero::zero()) - } - - report_bridge_status { - Bridge::::put(BridgeState::default()); - - let origin: T::RuntimeOrigin = T::BridgeHubOrigin::try_successful_origin().expect("expected valid BridgeHubOrigin"); - let bridge_id = Default::default(); - let is_congested = true; - - let call = Call::::report_bridge_status { bridge_id, is_congested }; - }: { call.dispatch_bypass_filter(origin)? } - verify { - assert!(Bridge::::get().is_congested); - } - - send_message { - // make local queue congested, because it means additional db write - T::make_congested(); - - let dest = T::ensure_bridged_target_destination(); - let xcm = sp_std::vec![].into(); - }: { - send_xcm::>(dest, xcm).expect("message is sent") - } - verify { - assert!(Bridge::::get().delivery_fee_factor > MINIMAL_DELIVERY_FEE_FACTOR); - } -} diff --git a/cumulus/bridges/modules/xcm-bridge-hub-router/src/lib.rs b/cumulus/bridges/modules/xcm-bridge-hub-router/src/lib.rs deleted file mode 100644 index 87e050b45c73..000000000000 --- a/cumulus/bridges/modules/xcm-bridge-hub-router/src/lib.rs +++ /dev/null @@ -1,557 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Pallet that may be used instead of `SovereignPaidRemoteExporter` in the XCM router -//! configuration. The main thing that the pallet offers is the dynamic message fee, -//! that is computed based on the bridge queues state. It starts exponentially increasing -//! if the queue between this chain and the sibling/child bridge hub is congested. -//! -//! All other bridge hub queues offer some backpressure mechanisms. So if at least one -//! of all queues is congested, it will eventually lead to the growth of the queue at -//! this chain. -//! -//! **A note on terminology**: when we mention the bridge hub here, we mean the chain that -//! has the messages pallet deployed (`pallet-bridge-grandpa`, `pallet-bridge-messages`, -//! `pallet-xcm-bridge-hub`, ...). It may be the system bridge hub parachain or any other -//! chain. - -#![cfg_attr(not(feature = "std"), no_std)] - -use bp_xcm_bridge_hub_router::{ - BridgeState, XcmChannelStatusProvider, MINIMAL_DELIVERY_FEE_FACTOR, -}; -use codec::Encode; -use frame_support::traits::Get; -use sp_core::H256; -use sp_runtime::{FixedPointNumber, FixedU128, Saturating}; -use xcm::prelude::*; -use xcm_builder::{ExporterFor, SovereignPaidRemoteExporter}; - -pub use pallet::*; -pub use weights::WeightInfo; - -pub mod benchmarking; -pub mod weights; - -mod mock; - -/// The factor that is used to increase current message fee factor when bridge experiencing -/// some lags. -const EXPONENTIAL_FEE_BASE: FixedU128 = FixedU128::from_rational(105, 100); // 1.05 -/// The factor that is used to increase current message fee factor for every sent kilobyte. -const MESSAGE_SIZE_FEE_BASE: FixedU128 = FixedU128::from_rational(1, 1000); // 0.001 - -/// Maximal size of the XCM message that may be sent over bridge. -/// -/// This should be less than the maximal size, allowed by the messages pallet, because -/// the message itself is wrapped in other structs and is double encoded. -pub const HARD_MESSAGE_SIZE_LIMIT: u32 = 32 * 1024; - -/// The target that will be used when publishing logs related to this pallet. -/// -/// This doesn't match the pattern used by other bridge pallets (`runtime::bridge-*`). But this -/// pallet has significant differences with those pallets. The main one is that is intended to -/// be deployed at sending chains. Other bridge pallets are likely to be deployed at the separate -/// bridge hub parachain. -pub const LOG_TARGET: &str = "xcm::bridge-hub-router"; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::config] - pub trait Config: frame_system::Config { - /// Benchmarks results from runtime we're plugged into. - type WeightInfo: WeightInfo; - - /// Universal location of this runtime. - type UniversalLocation: Get; - /// The bridged network that this config is for if specified. - /// Also used for filtering `Bridges` by `BridgedNetworkId`. - /// If not specified, allows all networks pass through. - type BridgedNetworkId: Get>; - /// Configuration for supported **bridged networks/locations** with **bridge location** and - /// **possible fee**. Allows to externalize better control over allowed **bridged - /// networks/locations**. - type Bridges: ExporterFor; - - /// Origin of the sibling bridge hub that is allowed to report bridge status. - type BridgeHubOrigin: EnsureOrigin; - /// Actual message sender (`HRMP` or `DMP`) to the sibling bridge hub location. - type ToBridgeHubSender: SendXcm; - /// Underlying channel with the sibling bridge hub. It must match the channel, used - /// by the `Self::ToBridgeHubSender`. - type WithBridgeHubChannel: XcmChannelStatusProvider; - - /// Additional fee that is paid for every byte of the outbound message. - type ByteFee: Get; - /// Asset that is used to paid bridge fee. - type FeeAsset: Get; - } - - #[pallet::pallet] - pub struct Pallet(PhantomData<(T, I)>); - - #[pallet::hooks] - impl, I: 'static> Hooks> for Pallet { - fn on_initialize(_n: BlockNumberFor) -> Weight { - // TODO: make sure that `WithBridgeHubChannel::is_congested` returns true if either - // of XCM channels (outbound/inbound) is suspended. Because if outbound is suspended - // that is definitely congestion. If inbound is suspended, then we are not able to - // receive the "report_bridge_status" signal (that maybe sent by the bridge hub). - - // if the channel with sibling/child bridge hub is suspended, we don't change - // anything - if T::WithBridgeHubChannel::is_congested() { - return T::WeightInfo::on_initialize_when_congested() - } - - // if bridge has reported congestion, we don't change anything - let mut bridge = Self::bridge(); - if bridge.is_congested { - return T::WeightInfo::on_initialize_when_congested() - } - - // if fee factor is already minimal, we don't change anything - if bridge.delivery_fee_factor == MINIMAL_DELIVERY_FEE_FACTOR { - return T::WeightInfo::on_initialize_when_congested() - } - - let previous_factor = bridge.delivery_fee_factor; - bridge.delivery_fee_factor = - MINIMAL_DELIVERY_FEE_FACTOR.max(bridge.delivery_fee_factor / EXPONENTIAL_FEE_BASE); - log::info!( - target: LOG_TARGET, - "Bridge queue is uncongested. Decreased fee factor from {} to {}", - previous_factor, - bridge.delivery_fee_factor, - ); - - Bridge::::put(bridge); - T::WeightInfo::on_initialize_when_non_congested() - } - } - - #[pallet::call] - impl, I: 'static> Pallet { - /// Notification about congested bridge queue. - #[pallet::call_index(0)] - #[pallet::weight(T::WeightInfo::report_bridge_status())] - pub fn report_bridge_status( - origin: OriginFor, - // this argument is not currently used, but to ease future migration, we'll keep it - // here - bridge_id: H256, - is_congested: bool, - ) -> DispatchResult { - let _ = T::BridgeHubOrigin::ensure_origin(origin)?; - - log::info!( - target: LOG_TARGET, - "Received bridge status from {:?}: congested = {}", - bridge_id, - is_congested, - ); - - Bridge::::mutate(|bridge| { - bridge.is_congested = is_congested; - }); - Ok(()) - } - } - - /// Bridge that we are using. - /// - /// **bridges-v1** assumptions: all outbound messages through this router are using single lane - /// and to single remote consensus. If there is some other remote consensus that uses the same - /// bridge hub, the separate pallet instance shall be used, In `v2` we'll have all required - /// primitives (lane-id aka bridge-id, derived from XCM locations) to support multiple bridges - /// by the same pallet instance. - #[pallet::storage] - #[pallet::getter(fn bridge)] - pub type Bridge, I: 'static = ()> = StorageValue<_, BridgeState, ValueQuery>; - - impl, I: 'static> Pallet { - /// Called when new message is sent (queued to local outbound XCM queue) over the bridge. - pub(crate) fn on_message_sent_to_bridge(message_size: u32) { - let _ = Bridge::::try_mutate(|bridge| { - let is_channel_with_bridge_hub_congested = T::WithBridgeHubChannel::is_congested(); - let is_bridge_congested = bridge.is_congested; - - // if outbound queue is not congested AND bridge has not reported congestion, do - // nothing - if !is_channel_with_bridge_hub_congested && !is_bridge_congested { - return Err(()) - } - - // ok - we need to increase the fee factor, let's do that - let message_size_factor = FixedU128::from_u32(message_size.saturating_div(1024)) - .saturating_mul(MESSAGE_SIZE_FEE_BASE); - let total_factor = EXPONENTIAL_FEE_BASE.saturating_add(message_size_factor); - let previous_factor = bridge.delivery_fee_factor; - bridge.delivery_fee_factor = - bridge.delivery_fee_factor.saturating_mul(total_factor); - - log::info!( - target: LOG_TARGET, - "Bridge channel is congested. Increased fee factor from {} to {}", - previous_factor, - bridge.delivery_fee_factor, - ); - - Ok(()) - }); - } - } -} - -/// We'll be using `SovereignPaidRemoteExporter` to send remote messages over the sibling/child -/// bridge hub. -type ViaBridgeHubExporter = SovereignPaidRemoteExporter< - Pallet, - >::ToBridgeHubSender, - >::UniversalLocation, ->; - -// This pallet acts as the `ExporterFor` for the `SovereignPaidRemoteExporter` to compute -// message fee using fee factor. -impl, I: 'static> ExporterFor for Pallet { - fn exporter_for( - network: &NetworkId, - remote_location: &InteriorMultiLocation, - message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { - // ensure that the message is sent to the expected bridged network (if specified). - if let Some(bridged_network) = T::BridgedNetworkId::get() { - if *network != bridged_network { - log::trace!( - target: LOG_TARGET, - "Router with bridged_network_id {:?} does not support bridging to network {:?}!", - bridged_network, - network, - ); - return None - } - } - - // ensure that the message is sent to the expected bridged network and location. - let Some((bridge_hub_location, maybe_payment)) = - T::Bridges::exporter_for(network, remote_location, message) - else { - log::trace!( - target: LOG_TARGET, - "Router with bridged_network_id {:?} does not support bridging to network {:?} and remote_location {:?}!", - T::BridgedNetworkId::get(), - network, - remote_location, - ); - return None - }; - - // take `base_fee` from `T::Brides`, but it has to be the same `T::FeeAsset` - let base_fee = match maybe_payment { - Some(payment) => match payment { - MultiAsset { fun: Fungible(amount), id } if id.eq(&T::FeeAsset::get()) => amount, - invalid_asset => { - log::error!( - target: LOG_TARGET, - "Router with bridged_network_id {:?} is configured for `T::FeeAsset` {:?} which is not \ - compatible with {:?} for bridge_hub_location: {:?} for bridging to {:?}/{:?}!", - T::BridgedNetworkId::get(), - T::FeeAsset::get(), - invalid_asset, - bridge_hub_location, - network, - remote_location, - ); - return None - }, - }, - None => 0, - }; - - // compute fee amount. Keep in mind that this is only the bridge fee. The fee for sending - // message from this chain to child/sibling bridge hub is determined by the - // `Config::ToBridgeHubSender` - let message_size = message.encoded_size(); - let message_fee = (message_size as u128).saturating_mul(T::ByteFee::get()); - let fee_sum = base_fee.saturating_add(message_fee); - let fee_factor = Self::bridge().delivery_fee_factor; - let fee = fee_factor.saturating_mul_int(fee_sum); - - let fee = if fee > 0 { Some((T::FeeAsset::get(), fee).into()) } else { None }; - - log::info!( - target: LOG_TARGET, - "Going to send message to {:?} ({} bytes) over bridge. Computed bridge fee {:?} using fee factor {}", - (network, remote_location), - message_size, - fee, - fee_factor - ); - - Some((bridge_hub_location, fee)) - } -} - -// This pallet acts as the `SendXcm` to the sibling/child bridge hub instead of regular -// XCMP/DMP transport. This allows injecting dynamic message fees into XCM programs that -// are going to the bridged network. -impl, I: 'static> SendXcm for Pallet { - type Ticket = (u32, ::Ticket); - - fn validate( - dest: &mut Option, - xcm: &mut Option>, - ) -> SendResult { - // we won't have an access to `dest` and `xcm` in the `delvier` method, so precompute - // everything required here - let message_size = xcm - .as_ref() - .map(|xcm| xcm.encoded_size() as _) - .ok_or(SendError::MissingArgument)?; - - // bridge doesn't support oversized/overweight messages now. So it is better to drop such - // messages here than at the bridge hub. Let's check the message size. - if message_size > HARD_MESSAGE_SIZE_LIMIT { - return Err(SendError::ExceedsMaxMessageSize) - } - - // just use exporter to validate destination and insert instructions to pay message fee - // at the sibling/child bridge hub - // - // the cost will include both cost of: (1) to-sibling bridg hub delivery (returned by - // the `Config::ToBridgeHubSender`) and (2) to-bridged bridge hub delivery (returned by - // `Self::exporter_for`) - ViaBridgeHubExporter::::validate(dest, xcm) - .map(|(ticket, cost)| ((message_size, ticket), cost)) - } - - fn deliver(ticket: Self::Ticket) -> Result { - // use router to enqueue message to the sibling/child bridge hub. This also should handle - // payment for passing through this queue. - let (message_size, ticket) = ticket; - let xcm_hash = ViaBridgeHubExporter::::deliver(ticket)?; - - // increase delivery fee factor if required - Self::on_message_sent_to_bridge(message_size); - - Ok(xcm_hash) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use mock::*; - - use frame_support::traits::Hooks; - use sp_runtime::traits::One; - - fn congested_bridge(delivery_fee_factor: FixedU128) -> BridgeState { - BridgeState { is_congested: true, delivery_fee_factor } - } - - fn uncongested_bridge(delivery_fee_factor: FixedU128) -> BridgeState { - BridgeState { is_congested: false, delivery_fee_factor } - } - - #[test] - fn initial_fee_factor_is_one() { - run_test(|| { - assert_eq!( - Bridge::::get(), - uncongested_bridge(MINIMAL_DELIVERY_FEE_FACTOR), - ); - }) - } - - #[test] - fn fee_factor_is_not_decreased_from_on_initialize_when_xcm_channel_is_congested() { - run_test(|| { - Bridge::::put(uncongested_bridge(FixedU128::from_rational(125, 100))); - TestWithBridgeHubChannel::make_congested(); - - // it should not decrease, because xcm channel is congested - let old_bridge = XcmBridgeHubRouter::bridge(); - XcmBridgeHubRouter::on_initialize(One::one()); - assert_eq!(XcmBridgeHubRouter::bridge(), old_bridge); - }) - } - - #[test] - fn fee_factor_is_not_decreased_from_on_initialize_when_bridge_has_reported_congestion() { - run_test(|| { - Bridge::::put(congested_bridge(FixedU128::from_rational(125, 100))); - - // it should not decrease, because bridge congested - let old_bridge = XcmBridgeHubRouter::bridge(); - XcmBridgeHubRouter::on_initialize(One::one()); - assert_eq!(XcmBridgeHubRouter::bridge(), old_bridge); - }) - } - - #[test] - fn fee_factor_is_decreased_from_on_initialize_when_xcm_channel_is_uncongested() { - run_test(|| { - Bridge::::put(uncongested_bridge(FixedU128::from_rational(125, 100))); - - // it shold eventually decreased to one - while XcmBridgeHubRouter::bridge().delivery_fee_factor > MINIMAL_DELIVERY_FEE_FACTOR { - XcmBridgeHubRouter::on_initialize(One::one()); - } - - // verify that it doesn't decreases anymore - XcmBridgeHubRouter::on_initialize(One::one()); - assert_eq!( - XcmBridgeHubRouter::bridge(), - uncongested_bridge(MINIMAL_DELIVERY_FEE_FACTOR) - ); - }) - } - - #[test] - fn not_applicable_if_destination_is_within_other_network() { - run_test(|| { - assert_eq!( - send_xcm::( - MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))), - vec![].into(), - ), - Err(SendError::NotApplicable), - ); - }); - } - - #[test] - fn exceeds_max_message_size_if_size_is_above_hard_limit() { - run_test(|| { - assert_eq!( - send_xcm::( - MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))), - vec![ClearOrigin; HARD_MESSAGE_SIZE_LIMIT as usize].into(), - ), - Err(SendError::ExceedsMaxMessageSize), - ); - }); - } - - #[test] - fn returns_proper_delivery_price() { - run_test(|| { - let dest = MultiLocation::new(2, X1(GlobalConsensus(BridgedNetworkId::get()))); - let xcm: Xcm<()> = vec![ClearOrigin].into(); - let msg_size = xcm.encoded_size(); - - // initially the base fee is used: `BASE_FEE + BYTE_FEE * msg_size + HRMP_FEE` - let expected_fee = BASE_FEE + BYTE_FEE * (msg_size as u128) + HRMP_FEE; - assert_eq!( - XcmBridgeHubRouter::validate(&mut Some(dest), &mut Some(xcm.clone())) - .unwrap() - .1 - .get(0), - Some(&(BridgeFeeAsset::get(), expected_fee).into()), - ); - - // but when factor is larger than one, it increases the fee, so it becomes: - // `(BASE_FEE + BYTE_FEE * msg_size) * F + HRMP_FEE` - let factor = FixedU128::from_rational(125, 100); - Bridge::::put(uncongested_bridge(factor)); - let expected_fee = - (FixedU128::saturating_from_integer(BASE_FEE + BYTE_FEE * (msg_size as u128)) * - factor) - .into_inner() / FixedU128::DIV + - HRMP_FEE; - assert_eq!( - XcmBridgeHubRouter::validate(&mut Some(dest), &mut Some(xcm)).unwrap().1.get(0), - Some(&(BridgeFeeAsset::get(), expected_fee).into()), - ); - }); - } - - #[test] - fn sent_message_doesnt_increase_factor_if_xcm_channel_is_uncongested() { - run_test(|| { - let old_bridge = XcmBridgeHubRouter::bridge(); - assert_eq!( - send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), - vec![ClearOrigin].into(), - ) - .map(drop), - Ok(()), - ); - - assert!(TestToBridgeHubSender::is_message_sent()); - assert_eq!(old_bridge, XcmBridgeHubRouter::bridge()); - }); - } - - #[test] - fn sent_message_increases_factor_if_xcm_channel_is_congested() { - run_test(|| { - TestWithBridgeHubChannel::make_congested(); - - let old_bridge = XcmBridgeHubRouter::bridge(); - assert_eq!( - send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), - vec![ClearOrigin].into(), - ) - .map(drop), - Ok(()), - ); - - assert!(TestToBridgeHubSender::is_message_sent()); - assert!( - old_bridge.delivery_fee_factor < XcmBridgeHubRouter::bridge().delivery_fee_factor - ); - }); - } - - #[test] - fn sent_message_increases_factor_if_bridge_has_reported_congestion() { - run_test(|| { - Bridge::::put(congested_bridge(MINIMAL_DELIVERY_FEE_FACTOR)); - - let old_bridge = XcmBridgeHubRouter::bridge(); - assert_eq!( - send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), - vec![ClearOrigin].into(), - ) - .map(drop), - Ok(()), - ); - - assert!(TestToBridgeHubSender::is_message_sent()); - assert!( - old_bridge.delivery_fee_factor < XcmBridgeHubRouter::bridge().delivery_fee_factor - ); - }); - } -} diff --git a/cumulus/bridges/modules/xcm-bridge-hub-router/src/mock.rs b/cumulus/bridges/modules/xcm-bridge-hub-router/src/mock.rs deleted file mode 100644 index 5ad7be4890a1..000000000000 --- a/cumulus/bridges/modules/xcm-bridge-hub-router/src/mock.rs +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg(test)] - -use crate as pallet_xcm_bridge_hub_router; - -use bp_xcm_bridge_hub_router::XcmChannelStatusProvider; -use frame_support::{construct_runtime, parameter_types}; -use frame_system::EnsureRoot; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, ConstU128, IdentityLookup}, - BuildStorage, -}; -use xcm::prelude::*; -use xcm_builder::NetworkExportTable; - -pub type AccountId = u64; -type Block = frame_system::mocking::MockBlock; - -/// HRMP fee. -pub const HRMP_FEE: u128 = 500; -/// Base bridge fee. -pub const BASE_FEE: u128 = 1_000_000; -/// Byte bridge fee. -pub const BYTE_FEE: u128 = 1_000; - -construct_runtime! { - pub enum TestRuntime - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - XcmBridgeHubRouter: pallet_xcm_bridge_hub_router::{Pallet, Storage}, - } -} - -parameter_types! { - pub ThisNetworkId: NetworkId = Polkadot; - pub BridgedNetworkId: NetworkId = Kusama; - pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(ThisNetworkId::get()), Parachain(1000)); - pub SiblingBridgeHubLocation: MultiLocation = ParentThen(X1(Parachain(1002))).into(); - pub BridgeFeeAsset: AssetId = MultiLocation::parent().into(); - pub BridgeTable: Vec<(NetworkId, MultiLocation, Option)> - = vec![(BridgedNetworkId::get(), SiblingBridgeHubLocation::get(), Some((BridgeFeeAsset::get(), BASE_FEE).into()))]; -} - -impl frame_system::Config for TestRuntime { - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Block = Block; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = frame_support::traits::ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_xcm_bridge_hub_router::Config<()> for TestRuntime { - type WeightInfo = (); - - type UniversalLocation = UniversalLocation; - type BridgedNetworkId = BridgedNetworkId; - type Bridges = NetworkExportTable; - - type BridgeHubOrigin = EnsureRoot; - type ToBridgeHubSender = TestToBridgeHubSender; - type WithBridgeHubChannel = TestWithBridgeHubChannel; - - type ByteFee = ConstU128; - type FeeAsset = BridgeFeeAsset; -} - -pub struct TestToBridgeHubSender; - -impl TestToBridgeHubSender { - pub fn is_message_sent() -> bool { - frame_support::storage::unhashed::get_or_default(b"TestToBridgeHubSender.Sent") - } -} - -impl SendXcm for TestToBridgeHubSender { - type Ticket = (); - - fn validate( - _destination: &mut Option, - _message: &mut Option>, - ) -> SendResult { - Ok(((), (BridgeFeeAsset::get(), HRMP_FEE).into())) - } - - fn deliver(_ticket: Self::Ticket) -> Result { - frame_support::storage::unhashed::put(b"TestToBridgeHubSender.Sent", &true); - Ok([0u8; 32]) - } -} - -pub struct TestWithBridgeHubChannel; - -impl TestWithBridgeHubChannel { - pub fn make_congested() { - frame_support::storage::unhashed::put(b"TestWithBridgeHubChannel.Congested", &true); - } -} - -impl XcmChannelStatusProvider for TestWithBridgeHubChannel { - fn is_congested() -> bool { - frame_support::storage::unhashed::get_or_default(b"TestWithBridgeHubChannel.Congested") - } -} - -/// Return test externalities to use in tests. -pub fn new_test_ext() -> sp_io::TestExternalities { - let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - sp_io::TestExternalities::new(t) -} - -/// Run pallet test. -pub fn run_test(test: impl FnOnce() -> T) -> T { - new_test_ext().execute_with(|| test()) -} diff --git a/cumulus/bridges/modules/xcm-bridge-hub-router/src/weights.rs b/cumulus/bridges/modules/xcm-bridge-hub-router/src/weights.rs deleted file mode 100644 index 04909f3b2e83..000000000000 --- a/cumulus/bridges/modules/xcm-bridge-hub-router/src/weights.rs +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Autogenerated weights for pallet_xcm_bridge_hub_router -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-08-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 - -// Executed Command: -// target/release/millau-bridge-node -// benchmark -// pallet -// --chain=dev -// --steps=50 -// --repeat=20 -// --pallet=pallet_xcm_bridge_hub_router -// --extrinsic=* -// --execution=wasm -// --wasm-execution=Compiled -// --heap-pages=4096 -// --output=./modules/xcm-bridge-hub-router/src/weights.rs -// --template=./.maintain/bridge-weight-template.hbs - -#![allow(clippy::all)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; -use sp_std::marker::PhantomData; - -/// Weight functions needed for pallet_xcm_bridge_hub_router. -pub trait WeightInfo { - fn on_initialize_when_non_congested() -> Weight; - fn on_initialize_when_congested() -> Weight; - fn report_bridge_status() -> Weight; - fn send_message() -> Weight; -} - -/// Weights for `pallet_xcm_bridge_hub_router` that are generated using one of the Bridge testnets. -/// -/// Those weights are test only and must never be used in production. -pub struct BridgeWeight(PhantomData); -impl WeightInfo for BridgeWeight { - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - /// - /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` - /// (r:1 w:0) - /// - /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 - /// w:0) - fn on_initialize_when_non_congested() -> Weight { - // Proof Size summary in bytes: - // Measured: `53` - // Estimated: `3518` - // Minimum execution time: 11_934 nanoseconds. - Weight::from_parts(12_201_000, 3518) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - /// - /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` - /// (r:1 w:0) - /// - /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 - /// w:0) - fn on_initialize_when_congested() -> Weight { - // Proof Size summary in bytes: - // Measured: `94` - // Estimated: `3559` - // Minimum execution time: 9_010 nanoseconds. - Weight::from_parts(9_594_000, 3559) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - fn report_bridge_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `53` - // Estimated: `1502` - // Minimum execution time: 10_427 nanoseconds. - Weight::from_parts(10_682_000, 1502) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - /// - /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` - /// (r:1 w:0) - /// - /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 - /// w:0) - fn send_message() -> Weight { - // Proof Size summary in bytes: - // Measured: `52` - // Estimated: `3517` - // Minimum execution time: 19_709 nanoseconds. - Weight::from_parts(20_110_000, 3517) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } -} - -// For backwards compatibility and tests -impl WeightInfo for () { - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - /// - /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` - /// (r:1 w:0) - /// - /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 - /// w:0) - fn on_initialize_when_non_congested() -> Weight { - // Proof Size summary in bytes: - // Measured: `53` - // Estimated: `3518` - // Minimum execution time: 11_934 nanoseconds. - Weight::from_parts(12_201_000, 3518) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - /// - /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` - /// (r:1 w:0) - /// - /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 - /// w:0) - fn on_initialize_when_congested() -> Weight { - // Proof Size summary in bytes: - // Measured: `94` - // Estimated: `3559` - // Minimum execution time: 9_010 nanoseconds. - Weight::from_parts(9_594_000, 3559) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - fn report_bridge_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `53` - // Estimated: `1502` - // Minimum execution time: 10_427 nanoseconds. - Weight::from_parts(10_682_000, 1502) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) - /// - /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: - /// 512, mode: `MaxEncodedLen`) - /// - /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` - /// (r:1 w:0) - /// - /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 - /// w:0) - fn send_message() -> Weight { - // Proof Size summary in bytes: - // Measured: `52` - // Estimated: `3517` - // Minimum execution time: 19_709 nanoseconds. - Weight::from_parts(20_110_000, 3517) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } -} diff --git a/cumulus/bridges/primitives/chain-asset-hub-kusama/Cargo.toml b/cumulus/bridges/primitives/chain-asset-hub-kusama/Cargo.toml deleted file mode 100644 index 6d5a4207ee66..000000000000 --- a/cumulus/bridges/primitives/chain-asset-hub-kusama/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "bp-asset-hub-kusama" -description = "Primitives of AssetHubKusama parachain runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate Dependencies -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -# Bridge Dependencies -bp-xcm-bridge-hub-router = { path = "../xcm-bridge-hub-router", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-xcm-bridge-hub-router/std", - "frame-support/std", - "codec/std", - "scale-info/std", -] diff --git a/cumulus/bridges/primitives/chain-asset-hub-kusama/src/lib.rs b/cumulus/bridges/primitives/chain-asset-hub-kusama/src/lib.rs deleted file mode 100644 index b3b25ba6eddd..000000000000 --- a/cumulus/bridges/primitives/chain-asset-hub-kusama/src/lib.rs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Module with configuration which reflects AssetHubKusama runtime setup. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, Encode}; -use scale_info::TypeInfo; - -pub use bp_xcm_bridge_hub_router::XcmBridgeHubRouterCall; - -/// `AssetHubKusama` Runtime `Call` enum. -/// -/// The enum represents a subset of possible `Call`s we can send to `AssetHubKusama` chain. -/// Ideally this code would be auto-generated from metadata, because we want to -/// avoid depending directly on the ENTIRE runtime just to get the encoding of `Dispatchable`s. -/// -/// All entries here (like pretty much in the entire file) must be kept in sync with -/// `AssetHubKusama` `construct_runtime`, so that we maintain SCALE-compatibility. -#[allow(clippy::large_enum_variant)] -#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] -pub enum Call { - /// `ToPolkadotXcmRouter` bridge pallet. - #[codec(index = 43)] - ToPolkadotXcmRouter(XcmBridgeHubRouterCall), -} - -frame_support::parameter_types! { - /// Some sane weight to execute `xcm::Transact(pallet-xcm-bridge-hub-router::Call::report_bridge_status)`. - pub const XcmBridgeHubRouterTransactCallMaxWeight: frame_support::weights::Weight = frame_support::weights::Weight::from_parts(200_000_000, 6144); - - /// Base delivery fee to `BridgeHubKusama`. - /// (initially was calculated `170733333` + `10%` by test `BridgeHubKusama::can_calculate_weight_for_paid_export_message_with_reserve_transfer`) - pub const BridgeHubKusamaBaseFeeInDots: u128 = 187806666; -} diff --git a/cumulus/bridges/primitives/chain-asset-hub-polkadot/Cargo.toml b/cumulus/bridges/primitives/chain-asset-hub-polkadot/Cargo.toml deleted file mode 100644 index 4ab562c6b34c..000000000000 --- a/cumulus/bridges/primitives/chain-asset-hub-polkadot/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "bp-asset-hub-polkadot" -description = "Primitives of AssetHubPolkadot parachain runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate Dependencies -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -# Bridge Dependencies -bp-xcm-bridge-hub-router = { path = "../xcm-bridge-hub-router", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-xcm-bridge-hub-router/std", - "frame-support/std", - "codec/std", - "scale-info/std", -] diff --git a/cumulus/bridges/primitives/chain-asset-hub-polkadot/src/lib.rs b/cumulus/bridges/primitives/chain-asset-hub-polkadot/src/lib.rs deleted file mode 100644 index 7363e5af02a2..000000000000 --- a/cumulus/bridges/primitives/chain-asset-hub-polkadot/src/lib.rs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Module with configuration which reflects AssetHubPolkadot runtime setup. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, Encode}; -use scale_info::TypeInfo; - -pub use bp_xcm_bridge_hub_router::XcmBridgeHubRouterCall; - -/// `AssetHubPolkadot` Runtime `Call` enum. -/// -/// The enum represents a subset of possible `Call`s we can send to `AssetHubPolkadot` chain. -/// Ideally this code would be auto-generated from metadata, because we want to -/// avoid depending directly on the ENTIRE runtime just to get the encoding of `Dispatchable`s. -/// -/// All entries here (like pretty much in the entire file) must be kept in sync with -/// `AssetHubPolkadot` `construct_runtime`, so that we maintain SCALE-compatibility. -#[allow(clippy::large_enum_variant)] -#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] -pub enum Call { - /// `ToKusamaXcmRouter` bridge pallet. - #[codec(index = 43)] - ToKusamaXcmRouter(XcmBridgeHubRouterCall), -} - -frame_support::parameter_types! { - /// Some sane weight to execute `xcm::Transact(pallet-xcm-bridge-hub-router::Call::report_bridge_status)`. - pub const XcmBridgeHubRouterTransactCallMaxWeight: frame_support::weights::Weight = frame_support::weights::Weight::from_parts(200_000_000, 6144); - - /// Base delivery fee to `BridgeHubPolkadot`. - /// (initially was calculated `51220000` + `10%` by test `BridgeHubPolkadot::can_calculate_weight_for_paid_export_message_with_reserve_transfer`) - pub const BridgeHubPolkadotBaseFeeInDots: u128 = 56342000; -} diff --git a/cumulus/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml b/cumulus/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml deleted file mode 100644 index 2bbe3d029a37..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml +++ /dev/null @@ -1,37 +0,0 @@ -[package] -name = "bp-bridge-hub-cumulus" -description = "Primitives of BridgeHubRococo parachain runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -# Bridge Dependencies - -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } - -# Substrate Based Dependencies - -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -# Polkadot Dependencies -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-polkadot-core/std", - "bp-messages/std", - "bp-runtime/std", - "frame-system/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", - "polkadot-primitives/std", -] diff --git a/cumulus/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs b/cumulus/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs deleted file mode 100644 index 525b2e62ceab..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use bp_polkadot_core::{ - AccountId, AccountInfoStorageMapKeyProvider, AccountPublic, Balance, BlockNumber, Hash, Hasher, - Hashing, Header, Nonce, Perbill, Signature, SignedBlock, UncheckedExtrinsic, - EXTRA_STORAGE_PROOF_SIZE, TX_EXTRA_BYTES, -}; - -use bp_messages::*; -use bp_runtime::extensions::{ - BridgeRejectObsoleteHeadersAndMessages, ChargeTransactionPayment, CheckEra, CheckGenesis, - CheckNonZeroSender, CheckNonce, CheckSpecVersion, CheckTxVersion, CheckWeight, - GenericSignedExtension, RefundBridgedParachainMessagesSchema, -}; -use frame_support::{ - dispatch::DispatchClass, - parameter_types, - sp_runtime::{MultiAddress, MultiSigner}, - weights::constants, -}; -use frame_system::limits; -use sp_std::time::Duration; - -/// Average block interval in Cumulus-based parachains. -/// -/// Corresponds to the `MILLISECS_PER_BLOCK` from `parachains_common` crate. -pub const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(12); - -/// All cumulus bridge hubs allow normal extrinsics to fill block up to 75 percent. -/// -/// This is a copy-paste from the cumulus repo's `parachains-common` crate. -pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); - -/// All cumulus bridge hubs chains allow for 0.5 seconds of compute with a 6-second average block -/// time. -/// -/// This is a copy-paste from the cumulus repo's `parachains-common` crate. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_SECOND, 0) - .saturating_div(2) - .set_proof_size(polkadot_primitives::v5::MAX_POV_SIZE as u64); - -/// All cumulus bridge hubs assume that about 5 percent of the block weight is consumed by -/// `on_initialize` handlers. This is used to limit the maximal weight of a single extrinsic. -/// -/// This is a copy-paste from the cumulus repo's `parachains-common` crate. -pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); - -parameter_types! { - pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( - 5 * 1024 * 1024, - NORMAL_DISPATCH_RATIO, - ); - - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS, 0) - .saturating_mul(5_000_000); - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS, 0) - .saturating_mul(125_000); - - pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have an extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT, - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); -} - -/// Public key of the chain account that may be used to verify signatures. -pub type AccountSigner = MultiSigner; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -// Note about selecting values of two following constants: -// -// Normal transactions have limit of 75% of 1/2 second weight for Cumulus parachains. Let's keep -// some reserve for the rest of stuff there => let's select values that fit in 50% of maximal limit. -// -// Using current constants, the limit would be: -// -// `75% * WEIGHT_REF_TIME_PER_SECOND * 1 / 2 * 50% = 0.75 * 1_000_000_000_000 / 2 * 0.5 = -// 187_500_000_000` -// -// According to (preliminary) weights of messages pallet, cost of additional message is zero and the -// cost of additional relayer is `8_000_000 + db read + db write`. Let's say we want no more than -// 4096 unconfirmed messages (no any scientific justification for that - it just looks large -// enough). And then we can't have more than 4096 relayers. E.g. for 1024 relayers is (using -// `RocksDbWeight`): -// -// `1024 * (8_000_000 + db read + db write) = 1024 * (8_000_000 + 25_000_000 + 100_000_000) = -// 136_192_000_000` -// -// So 1024 looks like good approximation for the number of relayers. If something is wrong in those -// assumptions, or something will change, it shall be caught by the -// `ensure_able_to_receive_confirmation` test. - -/// Maximal number of unrewarded relayer entries at inbound lane for Cumulus-based parachains. -/// Note: this value is security-relevant, decreasing it should not be done without careful -/// analysis (like the one above). -pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024; - -/// Maximal number of unconfirmed messages at inbound lane for Cumulus-based parachains. -/// Note: this value is security-relevant, decreasing it should not be done without careful -/// analysis (like the one above). -pub const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 4096; - -/// Extra signed extension data that is used by all bridge hubs. -pub type SignedExtra = ( - CheckNonZeroSender, - CheckSpecVersion, - CheckTxVersion, - CheckGenesis, - CheckEra, - CheckNonce, - CheckWeight, - ChargeTransactionPayment, - BridgeRejectObsoleteHeadersAndMessages, - RefundBridgedParachainMessagesSchema, -); - -/// Signed extension that is used by all bridge hubs. -pub type SignedExtension = GenericSignedExtension; - -/// Helper trait to define some extra methods on bridge hubs signed extension (and -/// overcome Rust limitations). -pub trait BridgeHubSignedExtension { - /// Create signed extension from its components. - fn from_params( - spec_version: u32, - transaction_version: u32, - era: bp_runtime::TransactionEra, - genesis_hash: Hash, - nonce: Nonce, - tip: Balance, - ) -> Self; - - /// Return transaction nonce. - fn nonce(&self) -> Nonce; - - /// Return transaction tip. - fn tip(&self) -> Balance; -} - -impl BridgeHubSignedExtension for SignedExtension { - /// Create signed extension from its components. - fn from_params( - spec_version: u32, - transaction_version: u32, - era: bp_runtime::TransactionEra, - genesis_hash: Hash, - nonce: Nonce, - tip: Balance, - ) -> Self { - GenericSignedExtension::new( - ( - (), // non-zero sender - (), // spec version - (), // tx version - (), // genesis - era.frame_era(), // era - nonce.into(), // nonce (compact encoding) - (), // Check weight - tip.into(), // transaction payment / tip (compact encoding) - (), // bridge reject obsolete headers and msgs - (), // bridge reward to relayer for message passing - ), - Some(( - (), - spec_version, - transaction_version, - genesis_hash, - era.signed_payload(genesis_hash), - (), - (), - (), - (), - (), - )), - ) - } - - /// Return transaction nonce. - fn nonce(&self) -> Nonce { - self.payload.5 .0 - } - - /// Return transaction tip. - fn tip(&self) -> Balance { - self.payload.7 .0 - } -} diff --git a/cumulus/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml b/cumulus/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml deleted file mode 100644 index 6d4334eaa57f..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "bp-bridge-hub-kusama" -description = "Primitives of BridgeHubRococo parachain runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -# Bridge Dependencies - -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-bridge-hub-cumulus/std", - "bp-messages/std", - "bp-runtime/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs b/cumulus/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs deleted file mode 100644 index 03f295e07f1e..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Module with configuration which reflects BridgeHubKusama runtime setup (AccountId, Headers, -//! Hashes...) - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use bp_bridge_hub_cumulus::*; -use bp_messages::*; -use bp_runtime::{ - decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, -}; -use frame_support::{ - dispatch::DispatchClass, - sp_runtime::{MultiAddress, MultiSigner}, - RuntimeDebug, -}; -use sp_std::prelude::Vec; - -/// BridgeHubKusama parachain. -#[derive(RuntimeDebug)] -pub struct BridgeHubKusama; - -impl Chain for BridgeHubKusama { - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hasher = Hasher; - type Header = Header; - - type AccountId = AccountId; - type Balance = Balance; - type Nonce = Nonce; - type Signature = Signature; - - fn max_extrinsic_size() -> u32 { - *BlockLength::get().max.get(DispatchClass::Normal) - } - - fn max_extrinsic_weight() -> Weight { - BlockWeights::get() - .get(DispatchClass::Normal) - .max_extrinsic - .unwrap_or(Weight::MAX) - } -} - -impl Parachain for BridgeHubKusama { - const PARACHAIN_ID: u32 = BRIDGE_HUB_KUSAMA_PARACHAIN_ID; -} - -/// Public key of the chain account that may be used to verify signatures. -pub type AccountSigner = MultiSigner; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Identifier of BridgeHubKusama in the Kusama relay chain. -pub const BRIDGE_HUB_KUSAMA_PARACHAIN_ID: u32 = 1002; - -/// Name of the With-BridgeHubKusama messages pallet instance that is deployed at bridged chains. -pub const WITH_BRIDGE_HUB_KUSAMA_MESSAGES_PALLET_NAME: &str = "BridgeKusamaMessages"; - -/// Name of the With-BridgeHubKusama bridge-relayers pallet instance that is deployed at bridged -/// chains. -pub const WITH_BRIDGE_HUB_KUSAMA_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; - -decl_bridge_finality_runtime_apis!(bridge_hub_kusama); -decl_bridge_messages_runtime_apis!(bridge_hub_kusama); diff --git a/cumulus/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml b/cumulus/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml deleted file mode 100644 index 2a0ab3213c85..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "bp-bridge-hub-polkadot" -description = "Primitives of BridgeHubWococo parachain runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] - -# Bridge Dependencies - -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-bridge-hub-cumulus/std", - "bp-runtime/std", - "bp-messages/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs b/cumulus/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs deleted file mode 100644 index ceacfe67ff2c..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Module with configuration which reflects BridgeHubPolkadot runtime setup -//! (AccountId, Headers, Hashes...) - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use bp_bridge_hub_cumulus::*; -use bp_messages::*; -use bp_runtime::{ - decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, -}; -use frame_support::{dispatch::DispatchClass, RuntimeDebug}; -use sp_std::prelude::Vec; - -/// BridgeHubPolkadot parachain. -#[derive(RuntimeDebug)] -pub struct BridgeHubPolkadot; - -impl Chain for BridgeHubPolkadot { - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hasher = Hasher; - type Header = Header; - - type AccountId = AccountId; - type Balance = Balance; - type Nonce = Nonce; - type Signature = Signature; - - fn max_extrinsic_size() -> u32 { - *BlockLength::get().max.get(DispatchClass::Normal) - } - - fn max_extrinsic_weight() -> Weight { - BlockWeights::get() - .get(DispatchClass::Normal) - .max_extrinsic - .unwrap_or(Weight::MAX) - } -} - -impl Parachain for BridgeHubPolkadot { - const PARACHAIN_ID: u32 = BRIDGE_HUB_POLKADOT_PARACHAIN_ID; -} - -/// Identifier of BridgeHubPolkadot in the Polkadot relay chain. -pub const BRIDGE_HUB_POLKADOT_PARACHAIN_ID: u32 = 1002; - -/// Name of the With-BridgeHubPolkadot messages pallet instance that is deployed at bridged chains. -pub const WITH_BRIDGE_HUB_POLKADOT_MESSAGES_PALLET_NAME: &str = "BridgePolkadotMessages"; - -/// Name of the With-BridgeHubPolkadot bridge-relayers pallet instance that is deployed at bridged -/// chains. -pub const WITH_BRIDGE_HUB_POLKADOT_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; - -decl_bridge_finality_runtime_apis!(bridge_hub_polkadot); -decl_bridge_messages_runtime_apis!(bridge_hub_polkadot); diff --git a/cumulus/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml b/cumulus/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml deleted file mode 100644 index 85c4225ab55c..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "bp-bridge-hub-rococo" -description = "Primitives of BridgeHubRococo parachain runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -# Bridge Dependencies - -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-bridge-hub-cumulus/std", - "bp-messages/std", - "bp-runtime/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs b/cumulus/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs deleted file mode 100644 index f8d46ff32bde..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Module with configuration which reflects BridgeHubRococo runtime setup (AccountId, Headers, -//! Hashes...) - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use bp_bridge_hub_cumulus::*; -use bp_messages::*; -use bp_runtime::{ - decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, -}; -use frame_support::{ - dispatch::DispatchClass, - sp_runtime::{MultiAddress, MultiSigner}, - RuntimeDebug, -}; -use sp_std::prelude::Vec; - -/// BridgeHubRococo parachain. -#[derive(RuntimeDebug)] -pub struct BridgeHubRococo; - -impl Chain for BridgeHubRococo { - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hasher = Hasher; - type Header = Header; - - type AccountId = AccountId; - type Balance = Balance; - type Nonce = Nonce; - type Signature = Signature; - - fn max_extrinsic_size() -> u32 { - *BlockLength::get().max.get(DispatchClass::Normal) - } - - fn max_extrinsic_weight() -> Weight { - BlockWeights::get() - .get(DispatchClass::Normal) - .max_extrinsic - .unwrap_or(Weight::MAX) - } -} - -impl Parachain for BridgeHubRococo { - const PARACHAIN_ID: u32 = BRIDGE_HUB_ROCOCO_PARACHAIN_ID; -} - -/// Public key of the chain account that may be used to verify signatures. -pub type AccountSigner = MultiSigner; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Identifier of BridgeHubRococo in the Rococo relay chain. -pub const BRIDGE_HUB_ROCOCO_PARACHAIN_ID: u32 = 1013; - -/// Name of the With-BridgeHubRococo messages pallet instance that is deployed at bridged chains. -pub const WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME: &str = "BridgeRococoMessages"; - -/// Name of the With-BridgeHubRococo bridge-relayers pallet instance that is deployed at bridged -/// chains. -pub const WITH_BRIDGE_HUB_ROCOCO_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; - -decl_bridge_finality_runtime_apis!(bridge_hub_rococo); -decl_bridge_messages_runtime_apis!(bridge_hub_rococo); diff --git a/cumulus/bridges/primitives/chain-bridge-hub-wococo/Cargo.toml b/cumulus/bridges/primitives/chain-bridge-hub-wococo/Cargo.toml deleted file mode 100644 index 24ecdb7adbca..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-wococo/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "bp-bridge-hub-wococo" -description = "Primitives of BridgeHubWococo parachain runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] - -# Bridge Dependencies - -bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../../primitives/runtime", default-features = false } -bp-messages = { path = "../../primitives/messages", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-bridge-hub-cumulus/std", - "bp-runtime/std", - "bp-messages/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-bridge-hub-wococo/src/lib.rs b/cumulus/bridges/primitives/chain-bridge-hub-wococo/src/lib.rs deleted file mode 100644 index abbb0cc20ea4..000000000000 --- a/cumulus/bridges/primitives/chain-bridge-hub-wococo/src/lib.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Module with configuration which reflects BridgeHubWococo runtime setup -//! (AccountId, Headers, Hashes...) - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use bp_bridge_hub_cumulus::*; -use bp_messages::*; -use bp_runtime::{ - decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, -}; -use frame_support::{dispatch::DispatchClass, RuntimeDebug}; -use sp_std::prelude::Vec; - -/// BridgeHubWococo parachain. -#[derive(RuntimeDebug)] -pub struct BridgeHubWococo; - -impl Chain for BridgeHubWococo { - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hasher = Hasher; - type Header = Header; - - type AccountId = AccountId; - type Balance = Balance; - type Nonce = Nonce; - type Signature = Signature; - - fn max_extrinsic_size() -> u32 { - *BlockLength::get().max.get(DispatchClass::Normal) - } - - fn max_extrinsic_weight() -> Weight { - BlockWeights::get() - .get(DispatchClass::Normal) - .max_extrinsic - .unwrap_or(Weight::MAX) - } -} - -impl Parachain for BridgeHubWococo { - const PARACHAIN_ID: u32 = BRIDGE_HUB_WOCOCO_PARACHAIN_ID; -} - -/// Identifier of BridgeHubWococo in the Wococo relay chain. -pub const BRIDGE_HUB_WOCOCO_PARACHAIN_ID: u32 = 1014; - -/// Name of the With-BridgeHubWococo messages pallet instance that is deployed at bridged chains. -pub const WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME: &str = "BridgeWococoMessages"; - -/// Name of the With-BridgeHubWococo bridge-relayers pallet instance that is deployed at bridged -/// chains. -pub const WITH_BRIDGE_HUB_WOCOCO_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; - -decl_bridge_finality_runtime_apis!(bridge_hub_wococo); -decl_bridge_messages_runtime_apis!(bridge_hub_wococo); diff --git a/cumulus/bridges/primitives/chain-kusama/Cargo.toml b/cumulus/bridges/primitives/chain-kusama/Cargo.toml deleted file mode 100644 index 65b0729aa17e..000000000000 --- a/cumulus/bridges/primitives/chain-kusama/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "bp-kusama" -description = "Primitives of Kusama runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] - -# Bridge Dependencies - -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-polkadot-core/std", - "bp-runtime/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-kusama/src/lib.rs b/cumulus/bridges/primitives/chain-kusama/src/lib.rs deleted file mode 100644 index b758484aefeb..000000000000 --- a/cumulus/bridges/primitives/chain-kusama/src/lib.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// RuntimeApi generated functions -#![allow(clippy::too_many_arguments)] - -pub use bp_polkadot_core::*; - -use bp_header_chain::ChainWithGrandpa; -use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; -use frame_support::weights::Weight; -use sp_std::prelude::Vec; - -/// Kusama Chain -pub struct Kusama; - -impl Chain for Kusama { - type BlockNumber = ::BlockNumber; - type Hash = ::Hash; - type Hasher = ::Hasher; - type Header = ::Header; - - type AccountId = ::AccountId; - type Balance = ::Balance; - type Nonce = ::Nonce; - type Signature = ::Signature; - - fn max_extrinsic_size() -> u32 { - PolkadotLike::max_extrinsic_size() - } - - fn max_extrinsic_weight() -> Weight { - PolkadotLike::max_extrinsic_weight() - } -} - -impl ChainWithGrandpa for Kusama { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_KUSAMA_GRANDPA_PALLET_NAME; - const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; - const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; -} - -/// Name of the parachains pallet in the Kusama runtime. -pub const PARAS_PALLET_NAME: &str = "Paras"; - -/// Name of the With-Kusama GRANDPA pallet instance that is deployed at bridged chains. -pub const WITH_KUSAMA_GRANDPA_PALLET_NAME: &str = "BridgeKusamaGrandpa"; - -/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot -/// parachains. -/// -/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some -/// reserve. -pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; - -decl_bridge_finality_runtime_apis!(kusama, grandpa); diff --git a/cumulus/bridges/primitives/chain-polkadot/Cargo.toml b/cumulus/bridges/primitives/chain-polkadot/Cargo.toml deleted file mode 100644 index 1522f1dadb71..000000000000 --- a/cumulus/bridges/primitives/chain-polkadot/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "bp-polkadot" -description = "Primitives of Polkadot runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] - -# Bridge Dependencies - -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-polkadot-core/std", - "bp-runtime/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-polkadot/src/lib.rs b/cumulus/bridges/primitives/chain-polkadot/src/lib.rs deleted file mode 100644 index eb62c1729adf..000000000000 --- a/cumulus/bridges/primitives/chain-polkadot/src/lib.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// RuntimeApi generated functions -#![allow(clippy::too_many_arguments)] - -pub use bp_polkadot_core::*; - -use bp_header_chain::ChainWithGrandpa; -use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; -use frame_support::weights::Weight; -use sp_std::prelude::Vec; - -/// Polkadot Chain -pub struct Polkadot; - -impl Chain for Polkadot { - type BlockNumber = ::BlockNumber; - type Hash = ::Hash; - type Hasher = ::Hasher; - type Header = ::Header; - - type AccountId = ::AccountId; - type Balance = ::Balance; - type Nonce = ::Nonce; - type Signature = ::Signature; - - fn max_extrinsic_size() -> u32 { - PolkadotLike::max_extrinsic_size() - } - - fn max_extrinsic_weight() -> Weight { - PolkadotLike::max_extrinsic_weight() - } -} - -impl ChainWithGrandpa for Polkadot { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_POLKADOT_GRANDPA_PALLET_NAME; - const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; - const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; -} - -/// Name of the parachains pallet in the Polkadot runtime. -pub const PARAS_PALLET_NAME: &str = "Paras"; - -/// Name of the With-Polkadot GRANDPA pallet instance that is deployed at bridged chains. -pub const WITH_POLKADOT_GRANDPA_PALLET_NAME: &str = "BridgePolkadotGrandpa"; - -/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot -/// parachains. -/// -/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some -/// reserve. -pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; - -decl_bridge_finality_runtime_apis!(polkadot, grandpa); diff --git a/cumulus/bridges/primitives/chain-rococo/Cargo.toml b/cumulus/bridges/primitives/chain-rococo/Cargo.toml deleted file mode 100644 index 26e035b439a6..000000000000 --- a/cumulus/bridges/primitives/chain-rococo/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "bp-rococo" -description = "Primitives of Rococo runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] - -# Bridge Dependencies - -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } - -# Substrate Based Dependencies - -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-polkadot-core/std", - "bp-runtime/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-rococo/src/lib.rs b/cumulus/bridges/primitives/chain-rococo/src/lib.rs deleted file mode 100644 index 140069d75695..000000000000 --- a/cumulus/bridges/primitives/chain-rococo/src/lib.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// RuntimeApi generated functions -#![allow(clippy::too_many_arguments)] - -pub use bp_polkadot_core::*; - -use bp_header_chain::ChainWithGrandpa; -use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; -use frame_support::{parameter_types, weights::Weight}; -use sp_std::prelude::Vec; - -/// Rococo Chain -pub struct Rococo; - -impl Chain for Rococo { - type BlockNumber = ::BlockNumber; - type Hash = ::Hash; - type Hasher = ::Hasher; - type Header = ::Header; - - type AccountId = ::AccountId; - type Balance = ::Balance; - type Nonce = ::Nonce; - type Signature = ::Signature; - - fn max_extrinsic_size() -> u32 { - PolkadotLike::max_extrinsic_size() - } - - fn max_extrinsic_weight() -> Weight { - PolkadotLike::max_extrinsic_weight() - } -} - -impl ChainWithGrandpa for Rococo { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_ROCOCO_GRANDPA_PALLET_NAME; - const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; - const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; -} - -parameter_types! { - pub const SS58Prefix: u8 = 42; -} - -/// Name of the parachains pallet in the Rococo runtime. -pub const PARAS_PALLET_NAME: &str = "Paras"; - -/// Name of the With-Rococo GRANDPA pallet instance that is deployed at bridged chains. -pub const WITH_ROCOCO_GRANDPA_PALLET_NAME: &str = "BridgeRococoGrandpa"; - -/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Rococo -/// parachains. -/// -/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some -/// reserve. -pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; - -decl_bridge_finality_runtime_apis!(rococo, grandpa); diff --git a/cumulus/bridges/primitives/chain-wococo/Cargo.toml b/cumulus/bridges/primitives/chain-wococo/Cargo.toml deleted file mode 100644 index 3bde102d8f2c..000000000000 --- a/cumulus/bridges/primitives/chain-wococo/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "bp-wococo" -description = "Primitives of Wococo runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] - -# Bridge Dependencies - -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } -bp-rococo = { path = "../chain-rococo", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-polkadot-core/std", - "bp-runtime/std", - "bp-rococo/std", - "frame-support/std", - "sp-api/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/chain-wococo/src/lib.rs b/cumulus/bridges/primitives/chain-wococo/src/lib.rs deleted file mode 100644 index 8247b63238ce..000000000000 --- a/cumulus/bridges/primitives/chain-wococo/src/lib.rs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// RuntimeApi generated functions -#![allow(clippy::too_many_arguments)] - -pub use bp_polkadot_core::*; -pub use bp_rococo::{ - SS58Prefix, MAX_AUTHORITIES_COUNT, MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE, PARAS_PALLET_NAME, -}; - -use bp_header_chain::ChainWithGrandpa; -use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; -use frame_support::weights::Weight; -use sp_std::prelude::Vec; - -/// Wococo Chain -pub struct Wococo; - -impl Chain for Wococo { - type BlockNumber = ::BlockNumber; - type Hash = ::Hash; - type Hasher = ::Hasher; - type Header = ::Header; - - type AccountId = ::AccountId; - type Balance = ::Balance; - type Nonce = ::Nonce; - type Signature = ::Signature; - - fn max_extrinsic_size() -> u32 { - PolkadotLike::max_extrinsic_size() - } - - fn max_extrinsic_weight() -> Weight { - PolkadotLike::max_extrinsic_weight() - } -} - -impl ChainWithGrandpa for Wococo { - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_WOCOCO_GRANDPA_PALLET_NAME; - const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; - const MAX_HEADER_SIZE: u32 = MAX_HEADER_SIZE; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; -} - -/// Name of the With-Wococo GRANDPA pallet instance that is deployed at bridged chains. -pub const WITH_WOCOCO_GRANDPA_PALLET_NAME: &str = "BridgeWococoGrandpa"; - -decl_bridge_finality_runtime_apis!(wococo, grandpa); diff --git a/cumulus/bridges/primitives/header-chain/Cargo.toml b/cumulus/bridges/primitives/header-chain/Cargo.toml deleted file mode 100644 index 962d262d571b..000000000000 --- a/cumulus/bridges/primitives/header-chain/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "bp-header-chain" -description = "A common interface for describing what a bridge pallet should be able to do." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -finality-grandpa = { version = "0.16.2", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } - -# Bridge dependencies - -bp-runtime = { path = "../runtime", default-features = false } - -# Substrate Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } -sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[dev-dependencies] -bp-test-utils = { path = "../test-utils" } -hex = "0.4" -hex-literal = "0.4" - -[features] -default = ["std"] -std = [ - "bp-runtime/std", - "codec/std", - "finality-grandpa/std", - "serde/std", - "frame-support/std", - "scale-info/std", - "sp-core/std", - "sp-consensus-grandpa/std", - "sp-runtime/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/header-chain/src/justification/mod.rs b/cumulus/bridges/primitives/header-chain/src/justification/mod.rs deleted file mode 100644 index 5fa5d7d607c8..000000000000 --- a/cumulus/bridges/primitives/header-chain/src/justification/mod.rs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Logic for checking GRANDPA Finality Proofs. -//! -//! Adapted copy of substrate/client/finality-grandpa/src/justification.rs. If origin -//! will ever be moved to the sp_consensus_grandpa, we should reuse that implementation. - -mod verification; - -use crate::ChainWithGrandpa; -pub use verification::{ - equivocation::{EquivocationsCollector, GrandpaEquivocationsFinder}, - optimizer::verify_and_optimize_justification, - strict::verify_justification, - AncestryChain, Error as JustificationVerificationError, JustificationVerificationContext, - PrecommitError, -}; - -use bp_runtime::{BlockNumberOf, Chain, HashOf, HeaderId}; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{RuntimeDebug, RuntimeDebugNoBound}; -use scale_info::TypeInfo; -use sp_consensus_grandpa::{AuthorityId, AuthoritySignature}; -use sp_runtime::{traits::Header as HeaderT, SaturatedConversion}; -use sp_std::prelude::*; - -/// A GRANDPA Justification is a proof that a given header was finalized -/// at a certain height and with a certain set of authorities. -/// -/// This particular proof is used to prove that headers on a bridged chain -/// (so not our chain) have been finalized correctly. -#[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo, RuntimeDebugNoBound)] -pub struct GrandpaJustification { - /// The round (voting period) this justification is valid for. - pub round: u64, - /// The set of votes for the chain which is to be finalized. - pub commit: - finality_grandpa::Commit, - /// A proof that the chain of blocks in the commit are related to each other. - pub votes_ancestries: Vec
, -} - -impl GrandpaJustification { - /// Returns reasonable size of justification using constants from the provided chain. - /// - /// An imprecise analogue of `MaxEncodedLen` implementation. We don't use it for - /// any precise calculations - that's just an estimation. - pub fn max_reasonable_size(required_precommits: u32) -> u32 - where - C: Chain + ChainWithGrandpa, - { - // we don't need precise results here - just estimations, so some details - // are removed from computations (e.g. bytes required to encode vector length) - - // structures in `finality_grandpa` crate are not implementing `MaxEncodedLength`, so - // here's our estimation for the `finality_grandpa::Commit` struct size - // - // precommit is: hash + number - // signed precommit is: precommit + signature (64b) + authority id - // commit is: hash + number + vec of signed precommits - let signed_precommit_size: u32 = BlockNumberOf::::max_encoded_len() - .saturating_add(HashOf::::max_encoded_len().saturated_into()) - .saturating_add(64) - .saturating_add(AuthorityId::max_encoded_len().saturated_into()) - .saturated_into(); - let max_expected_signed_commit_size = signed_precommit_size - .saturating_mul(required_precommits) - .saturating_add(BlockNumberOf::::max_encoded_len().saturated_into()) - .saturating_add(HashOf::::max_encoded_len().saturated_into()); - - let max_expected_votes_ancestries_size = C::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY - .saturating_mul(C::AVERAGE_HEADER_SIZE_IN_JUSTIFICATION); - - // justification is round number (u64=8b), a signed GRANDPA commit and the - // `votes_ancestries` vector - 8u32.saturating_add(max_expected_signed_commit_size) - .saturating_add(max_expected_votes_ancestries_size) - } - - /// Return identifier of header that this justification claims to finalize. - pub fn commit_target_id(&self) -> HeaderId { - HeaderId(self.commit.target_number, self.commit.target_hash) - } -} - -impl crate::FinalityProof for GrandpaJustification { - fn target_header_number(&self) -> H::Number { - self.commit.target_number - } -} - -/// Justification verification error. -#[derive(Eq, RuntimeDebug, PartialEq)] -pub enum Error { - /// Failed to decode justification. - JustificationDecode, -} - -/// Given GRANDPA authorities set size, return number of valid authorities votes that the -/// justification must have to be valid. -/// -/// This function assumes that all authorities have the same vote weight. -pub fn required_justification_precommits(authorities_set_length: u32) -> u32 { - authorities_set_length - authorities_set_length.saturating_sub(1) / 3 -} - -/// Decode justification target. -pub fn decode_justification_target( - raw_justification: &[u8], -) -> Result<(Header::Hash, Header::Number), Error> { - GrandpaJustification::
::decode(&mut &*raw_justification) - .map(|justification| (justification.commit.target_hash, justification.commit.target_number)) - .map_err(|_| Error::JustificationDecode) -} diff --git a/cumulus/bridges/primitives/header-chain/src/justification/verification/equivocation.rs b/cumulus/bridges/primitives/header-chain/src/justification/verification/equivocation.rs deleted file mode 100644 index 2484fc4d6b2b..000000000000 --- a/cumulus/bridges/primitives/header-chain/src/justification/verification/equivocation.rs +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Logic for extracting equivocations from multiple GRANDPA Finality Proofs. - -use crate::{ - justification::{ - verification::{ - Error as JustificationVerificationError, IterationFlow, - JustificationVerificationContext, JustificationVerifier, PrecommitError, - SignedPrecommit, - }, - GrandpaJustification, - }, - ChainWithGrandpa, FindEquivocations, -}; - -use bp_runtime::{BlockNumberOf, HashOf, HeaderOf}; -use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, EquivocationProof, Precommit}; -use sp_runtime::traits::Header as HeaderT; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - prelude::*, -}; - -enum AuthorityVotes { - SingleVote(SignedPrecommit
), - Equivocation( - finality_grandpa::Equivocation, AuthoritySignature>, - ), -} - -/// Structure that can extract equivocations from multiple GRANDPA justifications. -pub struct EquivocationsCollector<'a, Header: HeaderT> { - round: u64, - context: &'a JustificationVerificationContext, - - votes: BTreeMap>, -} - -impl<'a, Header: HeaderT> EquivocationsCollector<'a, Header> { - /// Create a new instance of `EquivocationsCollector`. - pub fn new( - context: &'a JustificationVerificationContext, - base_justification: &GrandpaJustification
, - ) -> Result { - let mut checker = Self { round: base_justification.round, context, votes: BTreeMap::new() }; - - checker.verify_justification( - (base_justification.commit.target_hash, base_justification.commit.target_number), - checker.context, - base_justification, - )?; - - Ok(checker) - } - - /// Parse additional justifications for equivocations. - pub fn parse_justifications(&mut self, justifications: &[GrandpaJustification
]) { - let round = self.round; - for justification in - justifications.iter().filter(|justification| round == justification.round) - { - // We ignore the Errors received here since we don't care if the proofs are valid. - // We only care about collecting equivocations. - let _ = self.verify_justification( - (justification.commit.target_hash, justification.commit.target_number), - self.context, - justification, - ); - } - } - - /// Extract the equivocation proofs that have been collected. - pub fn into_equivocation_proofs(self) -> Vec> { - let mut equivocations = vec![]; - for (_authority, vote) in self.votes { - if let AuthorityVotes::Equivocation(equivocation) = vote { - equivocations.push(EquivocationProof::new( - self.context.authority_set_id, - sp_consensus_grandpa::Equivocation::Precommit(equivocation), - )); - } - } - - equivocations - } -} - -impl<'a, Header: HeaderT> JustificationVerifier
for EquivocationsCollector<'a, Header> { - fn process_redundant_vote( - &mut self, - _precommit_idx: usize, - ) -> Result { - Ok(IterationFlow::Run) - } - - fn process_known_authority_vote( - &mut self, - _precommit_idx: usize, - _signed: &SignedPrecommit
, - ) -> Result { - Ok(IterationFlow::Run) - } - - fn process_unknown_authority_vote( - &mut self, - _precommit_idx: usize, - ) -> Result<(), PrecommitError> { - Ok(()) - } - - fn process_unrelated_ancestry_vote( - &mut self, - _precommit_idx: usize, - ) -> Result { - Ok(IterationFlow::Run) - } - - fn process_invalid_signature_vote( - &mut self, - _precommit_idx: usize, - ) -> Result<(), PrecommitError> { - Ok(()) - } - - fn process_valid_vote(&mut self, signed: &SignedPrecommit
) { - match self.votes.get_mut(&signed.id) { - Some(vote) => match vote { - AuthorityVotes::SingleVote(first_vote) => { - if first_vote.precommit != signed.precommit { - *vote = AuthorityVotes::Equivocation(finality_grandpa::Equivocation { - round_number: self.round, - identity: signed.id.clone(), - first: (first_vote.precommit.clone(), first_vote.signature.clone()), - second: (signed.precommit.clone(), signed.signature.clone()), - }); - } - }, - AuthorityVotes::Equivocation(_) => {}, - }, - None => { - self.votes.insert(signed.id.clone(), AuthorityVotes::SingleVote(signed.clone())); - }, - } - } - - fn process_redundant_votes_ancestries( - &mut self, - _redundant_votes_ancestries: BTreeSet, - ) -> Result<(), JustificationVerificationError> { - Ok(()) - } -} - -/// Helper struct for finding equivocations in GRANDPA proofs. -pub struct GrandpaEquivocationsFinder(sp_std::marker::PhantomData); - -impl - FindEquivocations< - GrandpaJustification>, - JustificationVerificationContext, - EquivocationProof, BlockNumberOf>, - > for GrandpaEquivocationsFinder -{ - type Error = JustificationVerificationError; - - fn find_equivocations( - verification_context: &JustificationVerificationContext, - synced_proof: &GrandpaJustification>, - source_proofs: &[GrandpaJustification>], - ) -> Result, BlockNumberOf>>, Self::Error> { - let mut equivocations_collector = - EquivocationsCollector::new(verification_context, synced_proof)?; - - equivocations_collector.parse_justifications(source_proofs); - - Ok(equivocations_collector.into_equivocation_proofs()) - } -} diff --git a/cumulus/bridges/primitives/header-chain/src/justification/verification/mod.rs b/cumulus/bridges/primitives/header-chain/src/justification/verification/mod.rs deleted file mode 100644 index 7af5292256cb..000000000000 --- a/cumulus/bridges/primitives/header-chain/src/justification/verification/mod.rs +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Logic for checking GRANDPA Finality Proofs. - -pub mod equivocation; -pub mod optimizer; -pub mod strict; - -use crate::{justification::GrandpaJustification, AuthoritySet}; - -use bp_runtime::HeaderId; -use finality_grandpa::voter_set::VoterSet; -use frame_support::RuntimeDebug; -use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, SetId}; -use sp_runtime::traits::Header as HeaderT; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - prelude::*, -}; - -type SignedPrecommit
= finality_grandpa::SignedPrecommit< -
::Hash, -
::Number, - AuthoritySignature, - AuthorityId, ->; - -/// Votes ancestries with useful methods. -#[derive(RuntimeDebug)] -pub struct AncestryChain { - /// We expect all forks in the ancestry chain to be descendants of base. - base: HeaderId, - /// Header hash => parent header hash mapping. - pub parents: BTreeMap, - /// Hashes of headers that were not visited by `ancestry()`. - pub unvisited: BTreeSet, -} - -impl AncestryChain
{ - /// Create new ancestry chain. - pub fn new(justification: &GrandpaJustification
) -> AncestryChain
{ - let mut parents = BTreeMap::new(); - let mut unvisited = BTreeSet::new(); - for ancestor in &justification.votes_ancestries { - let hash = ancestor.hash(); - let parent_hash = *ancestor.parent_hash(); - parents.insert(hash, parent_hash); - unvisited.insert(hash); - } - AncestryChain { base: justification.commit_target_id(), parents, unvisited } - } - - /// Returns a route if the precommit target block is a descendant of the `base` block. - pub fn ancestry( - &self, - precommit_target_hash: &Header::Hash, - precommit_target_number: &Header::Number, - ) -> Option> { - if precommit_target_number < &self.base.number() { - return None - } - - let mut route = vec![]; - let mut current_hash = *precommit_target_hash; - loop { - if current_hash == self.base.hash() { - break - } - - current_hash = match self.parents.get(¤t_hash) { - Some(parent_hash) => { - let is_visited_before = self.unvisited.get(¤t_hash).is_none(); - if is_visited_before { - // If the current header has been visited in a previous call, it is a - // descendent of `base` (we assume that the previous call was successful). - return Some(route) - } - route.push(current_hash); - - *parent_hash - }, - None => return None, - }; - } - - Some(route) - } - - fn mark_route_as_visited(&mut self, route: Vec) { - for hash in route { - self.unvisited.remove(&hash); - } - } - - fn is_fully_visited(&self) -> bool { - self.unvisited.is_empty() - } -} - -/// Justification verification error. -#[derive(Eq, RuntimeDebug, PartialEq)] -pub enum Error { - /// Could not convert `AuthorityList` to `VoterSet`. - InvalidAuthorityList, - /// Justification is finalizing unexpected header. - InvalidJustificationTarget, - /// Error validating a precommit - Precommit(PrecommitError), - /// The cumulative weight of all votes in the justification is not enough to justify commit - /// header finalization. - TooLowCumulativeWeight, - /// The justification contains extra (unused) headers in its `votes_ancestries` field. - RedundantVotesAncestries, -} - -/// Justification verification error. -#[derive(Eq, RuntimeDebug, PartialEq)] -pub enum PrecommitError { - /// Justification contains redundant votes. - RedundantAuthorityVote, - /// Justification contains unknown authority precommit. - UnknownAuthorityVote, - /// Justification contains duplicate authority precommit. - DuplicateAuthorityVote, - /// The authority has provided an invalid signature. - InvalidAuthoritySignature, - /// The justification contains precommit for header that is not a descendant of the commit - /// header. - UnrelatedAncestryVote, -} - -/// The context needed for validating GRANDPA finality proofs. -pub struct JustificationVerificationContext { - /// The authority set used to verify the justification. - pub voter_set: VoterSet, - /// The ID of the authority set used to verify the justification. - pub authority_set_id: SetId, -} - -impl TryFrom for JustificationVerificationContext { - type Error = Error; - - fn try_from(authority_set: AuthoritySet) -> Result { - let voter_set = - VoterSet::new(authority_set.authorities).ok_or(Error::InvalidAuthorityList)?; - Ok(JustificationVerificationContext { voter_set, authority_set_id: authority_set.set_id }) - } -} - -enum IterationFlow { - Run, - Skip, -} - -/// Verification callbacks. -trait JustificationVerifier { - fn process_redundant_vote( - &mut self, - precommit_idx: usize, - ) -> Result; - - fn process_known_authority_vote( - &mut self, - precommit_idx: usize, - signed: &SignedPrecommit
, - ) -> Result; - - fn process_unknown_authority_vote( - &mut self, - precommit_idx: usize, - ) -> Result<(), PrecommitError>; - - fn process_unrelated_ancestry_vote( - &mut self, - precommit_idx: usize, - ) -> Result; - - fn process_invalid_signature_vote( - &mut self, - precommit_idx: usize, - ) -> Result<(), PrecommitError>; - - fn process_valid_vote(&mut self, signed: &SignedPrecommit
); - - /// Called when there are redundant headers in the votes ancestries. - fn process_redundant_votes_ancestries( - &mut self, - redundant_votes_ancestries: BTreeSet, - ) -> Result<(), Error>; - - fn verify_justification( - &mut self, - finalized_target: (Header::Hash, Header::Number), - context: &JustificationVerificationContext, - justification: &GrandpaJustification
, - ) -> Result<(), Error> { - // ensure that it is justification for the expected header - if (justification.commit.target_hash, justification.commit.target_number) != - finalized_target - { - return Err(Error::InvalidJustificationTarget) - } - - let threshold = context.voter_set.threshold().get(); - let mut chain = AncestryChain::new(justification); - let mut signature_buffer = Vec::new(); - let mut cumulative_weight = 0u64; - - for (precommit_idx, signed) in justification.commit.precommits.iter().enumerate() { - if cumulative_weight >= threshold { - let action = - self.process_redundant_vote(precommit_idx).map_err(Error::Precommit)?; - if matches!(action, IterationFlow::Skip) { - continue - } - } - - // authority must be in the set - let authority_info = match context.voter_set.get(&signed.id) { - Some(authority_info) => { - // The implementer may want to do extra checks here. - // For example to see if the authority has already voted in the same round. - let action = self - .process_known_authority_vote(precommit_idx, signed) - .map_err(Error::Precommit)?; - if matches!(action, IterationFlow::Skip) { - continue - } - - authority_info - }, - None => { - self.process_unknown_authority_vote(precommit_idx).map_err(Error::Precommit)?; - continue - }, - }; - - // all precommits must be descendants of the target block - let maybe_route = - chain.ancestry(&signed.precommit.target_hash, &signed.precommit.target_number); - if maybe_route.is_none() { - let action = self - .process_unrelated_ancestry_vote(precommit_idx) - .map_err(Error::Precommit)?; - if matches!(action, IterationFlow::Skip) { - continue - } - } - - // verify authority signature - if !sp_consensus_grandpa::check_message_signature_with_buffer( - &finality_grandpa::Message::Precommit(signed.precommit.clone()), - &signed.id, - &signed.signature, - justification.round, - context.authority_set_id, - &mut signature_buffer, - ) { - self.process_invalid_signature_vote(precommit_idx).map_err(Error::Precommit)?; - continue - } - - // now we can count the vote since we know that it is valid - self.process_valid_vote(signed); - if let Some(route) = maybe_route { - chain.mark_route_as_visited(route); - cumulative_weight = cumulative_weight.saturating_add(authority_info.weight().get()); - } - } - - // check that the cumulative weight of validators that voted for the justification target - // (or one of its descendents) is larger than the required threshold. - if cumulative_weight < threshold { - return Err(Error::TooLowCumulativeWeight) - } - - // check that there are no extra headers in the justification - if !chain.is_fully_visited() { - self.process_redundant_votes_ancestries(chain.unvisited)?; - } - - Ok(()) - } -} diff --git a/cumulus/bridges/primitives/header-chain/src/justification/verification/optimizer.rs b/cumulus/bridges/primitives/header-chain/src/justification/verification/optimizer.rs deleted file mode 100644 index 99ccdd50616b..000000000000 --- a/cumulus/bridges/primitives/header-chain/src/justification/verification/optimizer.rs +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Logic for optimizing GRANDPA Finality Proofs. - -use crate::justification::{ - verification::{Error, JustificationVerifier, PrecommitError}, - GrandpaJustification, -}; - -use crate::justification::verification::{ - IterationFlow, JustificationVerificationContext, SignedPrecommit, -}; -use sp_consensus_grandpa::AuthorityId; -use sp_runtime::traits::Header as HeaderT; -use sp_std::{collections::btree_set::BTreeSet, prelude::*}; - -// Verification callbacks for justification optimization. -struct JustificationOptimizer { - votes: BTreeSet, - - extra_precommits: Vec, - redundant_votes_ancestries: BTreeSet, -} - -impl JustificationOptimizer
{ - fn optimize(self, justification: &mut GrandpaJustification
) { - for invalid_precommit_idx in self.extra_precommits.into_iter().rev() { - justification.commit.precommits.remove(invalid_precommit_idx); - } - if !self.redundant_votes_ancestries.is_empty() { - justification - .votes_ancestries - .retain(|header| !self.redundant_votes_ancestries.contains(&header.hash())) - } - } -} - -impl JustificationVerifier
for JustificationOptimizer
{ - fn process_redundant_vote( - &mut self, - precommit_idx: usize, - ) -> Result { - self.extra_precommits.push(precommit_idx); - Ok(IterationFlow::Skip) - } - - fn process_known_authority_vote( - &mut self, - precommit_idx: usize, - signed: &SignedPrecommit
, - ) -> Result { - // Skip duplicate votes - if self.votes.contains(&signed.id) { - self.extra_precommits.push(precommit_idx); - return Ok(IterationFlow::Skip) - } - - Ok(IterationFlow::Run) - } - - fn process_unknown_authority_vote( - &mut self, - precommit_idx: usize, - ) -> Result<(), PrecommitError> { - self.extra_precommits.push(precommit_idx); - Ok(()) - } - - fn process_unrelated_ancestry_vote( - &mut self, - precommit_idx: usize, - ) -> Result { - self.extra_precommits.push(precommit_idx); - Ok(IterationFlow::Skip) - } - - fn process_invalid_signature_vote( - &mut self, - precommit_idx: usize, - ) -> Result<(), PrecommitError> { - self.extra_precommits.push(precommit_idx); - Ok(()) - } - - fn process_valid_vote(&mut self, signed: &SignedPrecommit
) { - self.votes.insert(signed.id.clone()); - } - - fn process_redundant_votes_ancestries( - &mut self, - redundant_votes_ancestries: BTreeSet, - ) -> Result<(), Error> { - self.redundant_votes_ancestries = redundant_votes_ancestries; - Ok(()) - } -} - -/// Verify and optimize given justification by removing unknown and duplicate votes. -pub fn verify_and_optimize_justification( - finalized_target: (Header::Hash, Header::Number), - context: &JustificationVerificationContext, - justification: &mut GrandpaJustification
, -) -> Result<(), Error> { - let mut optimizer = JustificationOptimizer { - votes: BTreeSet::new(), - extra_precommits: vec![], - redundant_votes_ancestries: Default::default(), - }; - optimizer.verify_justification(finalized_target, context, justification)?; - optimizer.optimize(justification); - - Ok(()) -} diff --git a/cumulus/bridges/primitives/header-chain/src/justification/verification/strict.rs b/cumulus/bridges/primitives/header-chain/src/justification/verification/strict.rs deleted file mode 100644 index a9d5f4c1f736..000000000000 --- a/cumulus/bridges/primitives/header-chain/src/justification/verification/strict.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Logic for checking if GRANDPA Finality Proofs are valid and optimal. - -use crate::justification::{ - verification::{Error, JustificationVerifier, PrecommitError}, - GrandpaJustification, -}; - -use crate::justification::verification::{ - IterationFlow, JustificationVerificationContext, SignedPrecommit, -}; -use sp_consensus_grandpa::AuthorityId; -use sp_runtime::traits::Header as HeaderT; -use sp_std::collections::btree_set::BTreeSet; - -/// Verification callbacks that reject all unknown, duplicate or redundant votes. -struct StrictJustificationVerifier { - votes: BTreeSet, -} - -impl JustificationVerifier
for StrictJustificationVerifier { - fn process_redundant_vote( - &mut self, - _precommit_idx: usize, - ) -> Result { - Err(PrecommitError::RedundantAuthorityVote) - } - - fn process_known_authority_vote( - &mut self, - _precommit_idx: usize, - signed: &SignedPrecommit
, - ) -> Result { - if self.votes.contains(&signed.id) { - // There's a lot of code in `validate_commit` and `import_precommit` functions - // inside `finality-grandpa` crate (mostly related to reporting equivocations). - // But the only thing that we care about is that only first vote from the - // authority is accepted - return Err(PrecommitError::DuplicateAuthorityVote) - } - - Ok(IterationFlow::Run) - } - - fn process_unknown_authority_vote( - &mut self, - _precommit_idx: usize, - ) -> Result<(), PrecommitError> { - Err(PrecommitError::UnknownAuthorityVote) - } - - fn process_unrelated_ancestry_vote( - &mut self, - _precommit_idx: usize, - ) -> Result { - Err(PrecommitError::UnrelatedAncestryVote) - } - - fn process_invalid_signature_vote( - &mut self, - _precommit_idx: usize, - ) -> Result<(), PrecommitError> { - Err(PrecommitError::InvalidAuthoritySignature) - } - - fn process_valid_vote(&mut self, signed: &SignedPrecommit
) { - self.votes.insert(signed.id.clone()); - } - - fn process_redundant_votes_ancestries( - &mut self, - _redundant_votes_ancestries: BTreeSet, - ) -> Result<(), Error> { - Err(Error::RedundantVotesAncestries) - } -} - -/// Verify that justification, that is generated by given authority set, finalizes given header. -pub fn verify_justification( - finalized_target: (Header::Hash, Header::Number), - context: &JustificationVerificationContext, - justification: &GrandpaJustification
, -) -> Result<(), Error> { - let mut verifier = StrictJustificationVerifier { votes: BTreeSet::new() }; - verifier.verify_justification(finalized_target, context, justification) -} diff --git a/cumulus/bridges/primitives/header-chain/src/lib.rs b/cumulus/bridges/primitives/header-chain/src/lib.rs deleted file mode 100644 index ea6c58f4c097..000000000000 --- a/cumulus/bridges/primitives/header-chain/src/lib.rs +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Defines traits which represent a common interface for Substrate pallets which want to -//! incorporate bridge functionality. - -#![cfg_attr(not(feature = "std"), no_std)] - -use crate::justification::{ - GrandpaJustification, JustificationVerificationContext, JustificationVerificationError, -}; -use bp_runtime::{ - BasicOperatingMode, Chain, HashOf, HasherOf, HeaderOf, RawStorageProof, StorageProofChecker, - StorageProofError, UnderlyingChainProvider, -}; -use codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}; -use core::{clone::Clone, cmp::Eq, default::Default, fmt::Debug}; -use frame_support::PalletError; -use scale_info::TypeInfo; -use serde::{Deserialize, Serialize}; -use sp_consensus_grandpa::{AuthorityList, ConsensusLog, SetId, GRANDPA_ENGINE_ID}; -use sp_runtime::{traits::Header as HeaderT, Digest, RuntimeDebug}; -use sp_std::{boxed::Box, vec::Vec}; - -pub mod justification; -pub mod storage_keys; - -/// Header chain error. -#[derive(Clone, Decode, Encode, Eq, PartialEq, PalletError, Debug, TypeInfo)] -pub enum HeaderChainError { - /// Header with given hash is missing from the chain. - UnknownHeader, - /// Storage proof related error. - StorageProof(StorageProofError), -} - -/// Header data that we're storing on-chain. -/// -/// Even though we may store full header, our applications (XCM) only use couple of header -/// fields. Extracting those values makes on-chain storage and PoV smaller, which is good. -#[derive(Clone, Decode, Encode, Eq, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] -pub struct StoredHeaderData { - /// Header number. - pub number: Number, - /// Header state root. - pub state_root: Hash, -} - -/// Stored header data builder. -pub trait StoredHeaderDataBuilder { - /// Build header data from self. - fn build(&self) -> StoredHeaderData; -} - -impl StoredHeaderDataBuilder for H { - fn build(&self) -> StoredHeaderData { - StoredHeaderData { number: *self.number(), state_root: *self.state_root() } - } -} - -/// Substrate header chain, abstracted from the way it is stored. -pub trait HeaderChain { - /// Returns state (storage) root of given finalized header. - fn finalized_header_state_root(header_hash: HashOf) -> Option>; - /// Get storage proof checker using finalized header. - fn storage_proof_checker( - header_hash: HashOf, - storage_proof: RawStorageProof, - ) -> Result>, HeaderChainError> { - let state_root = Self::finalized_header_state_root(header_hash) - .ok_or(HeaderChainError::UnknownHeader)?; - StorageProofChecker::new(state_root, storage_proof).map_err(HeaderChainError::StorageProof) - } -} - -/// A type that can be used as a parameter in a dispatchable function. -/// -/// When using `decl_module` all arguments for call functions must implement this trait. -pub trait Parameter: Codec + EncodeLike + Clone + Eq + Debug + TypeInfo {} -impl Parameter for T where T: Codec + EncodeLike + Clone + Eq + Debug + TypeInfo {} - -/// A GRANDPA Authority List and ID. -#[derive(Default, Encode, Eq, Decode, RuntimeDebug, PartialEq, Clone, TypeInfo)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct AuthoritySet { - /// List of GRANDPA authorities for the current round. - pub authorities: AuthorityList, - /// Monotonic identifier of the current GRANDPA authority set. - pub set_id: SetId, -} - -impl AuthoritySet { - /// Create a new GRANDPA Authority Set. - pub fn new(authorities: AuthorityList, set_id: SetId) -> Self { - Self { authorities, set_id } - } -} - -/// Data required for initializing the GRANDPA bridge pallet. -/// -/// The bridge needs to know where to start its sync from, and this provides that initial context. -#[derive( - Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, Clone, TypeInfo, Serialize, Deserialize, -)] -pub struct InitializationData { - /// The header from which we should start syncing. - pub header: Box, - /// The initial authorities of the pallet. - pub authority_list: AuthorityList, - /// The ID of the initial authority set. - pub set_id: SetId, - /// Pallet operating mode. - pub operating_mode: BasicOperatingMode, -} - -/// Abstract finality proof that is justifying block finality. -pub trait FinalityProof: Clone + Send + Sync + Debug { - /// Return number of header that this proof is generated for. - fn target_header_number(&self) -> Number; -} - -/// A trait that provides helper methods for querying the consensus log. -pub trait ConsensusLogReader { - /// Returns true if digest contains item that schedules authorities set change. - fn schedules_authorities_change(digest: &Digest) -> bool; -} - -/// A struct that provides helper methods for querying the GRANDPA consensus log. -pub struct GrandpaConsensusLogReader(sp_std::marker::PhantomData); - -impl GrandpaConsensusLogReader { - pub fn find_scheduled_change( - digest: &Digest, - ) -> Option> { - // find the first consensus digest with the right ID which converts to - // the right kind of consensus log. - digest - .convert_first(|log| log.consensus_try_to(&GRANDPA_ENGINE_ID)) - .and_then(|log| match log { - ConsensusLog::ScheduledChange(change) => Some(change), - _ => None, - }) - } - - pub fn find_forced_change( - digest: &Digest, - ) -> Option<(Number, sp_consensus_grandpa::ScheduledChange)> { - // find the first consensus digest with the right ID which converts to - // the right kind of consensus log. - digest - .convert_first(|log| log.consensus_try_to(&GRANDPA_ENGINE_ID)) - .and_then(|log| match log { - ConsensusLog::ForcedChange(delay, change) => Some((delay, change)), - _ => None, - }) - } -} - -impl ConsensusLogReader for GrandpaConsensusLogReader { - fn schedules_authorities_change(digest: &Digest) -> bool { - GrandpaConsensusLogReader::::find_scheduled_change(digest).is_some() - } -} - -/// The finality-related info associated to a header. -#[derive(Encode, Decode, Debug, PartialEq, Clone, TypeInfo)] -pub struct HeaderFinalityInfo { - /// The header finality proof. - pub finality_proof: FinalityProof, - /// The new verification context introduced by the header. - pub new_verification_context: Option, -} - -/// Grandpa-related info associated to a header. This info can be saved to events. -pub type StoredHeaderGrandpaInfo
= - HeaderFinalityInfo, AuthoritySet>; - -/// Processed Grandpa-related info associated to a header. -pub type HeaderGrandpaInfo
= - HeaderFinalityInfo, JustificationVerificationContext>; - -impl TryFrom> for HeaderGrandpaInfo
{ - type Error = JustificationVerificationError; - - fn try_from(grandpa_info: StoredHeaderGrandpaInfo
) -> Result { - Ok(Self { - finality_proof: grandpa_info.finality_proof, - new_verification_context: match grandpa_info.new_verification_context { - Some(authority_set) => Some(authority_set.try_into()?), - None => None, - }, - }) - } -} - -/// Helper trait for finding equivocations in finality proofs. -pub trait FindEquivocations { - /// The type returned when encountering an error while looking for equivocations. - type Error; - - /// Find equivocations. - fn find_equivocations( - verification_context: &FinalityVerificationContext, - synced_proof: &FinalityProof, - source_proofs: &[FinalityProof], - ) -> Result, Self::Error>; -} - -/// A minimized version of `pallet-bridge-grandpa::Call` that can be used without a runtime. -#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] -#[allow(non_camel_case_types)] -pub enum BridgeGrandpaCall { - /// `pallet-bridge-grandpa::Call::submit_finality_proof` - #[codec(index = 0)] - submit_finality_proof { - finality_target: Box
, - justification: justification::GrandpaJustification
, - }, - /// `pallet-bridge-grandpa::Call::initialize` - #[codec(index = 1)] - initialize { init_data: InitializationData
}, -} - -/// The `BridgeGrandpaCall` used by a chain. -pub type BridgeGrandpaCallOf = BridgeGrandpaCall>; - -/// Substrate-based chain that is using direct GRANDPA finality. -/// -/// Keep in mind that parachains are relying on relay chain GRANDPA, so they should not implement -/// this trait. -pub trait ChainWithGrandpa: Chain { - /// Name of the bridge GRANDPA pallet (used in `construct_runtime` macro call) that is deployed - /// at some other chain to bridge with this `ChainWithGrandpa`. - /// - /// We assume that all chains that are bridging with this `ChainWithGrandpa` are using - /// the same name. - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str; - - /// Max number of GRANDPA authorities at the chain. - /// - /// This is a strict constant. If bridged chain will have more authorities than that, - /// the GRANDPA bridge pallet may halt. - const MAX_AUTHORITIES_COUNT: u32; - - /// Max reasonable number of headers in `votes_ancestries` vector of the GRANDPA justification. - /// - /// This isn't a strict limit. The relay may submit justifications with more headers in its - /// ancestry and the pallet will accept such justification. The limit is only used to compute - /// maximal refund amount and submitting justifications which exceed the limit, may be costly - /// to submitter. - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32; - - /// Maximal size of the chain header. The header may be the header that enacts new GRANDPA - /// authorities set (so it has large digest inside). - /// - /// This isn't a strict limit. The relay may submit larger headers and the pallet will accept - /// the call. The limit is only used to compute maximal refund amount and doing calls which - /// exceed the limit, may be costly to submitter. - const MAX_HEADER_SIZE: u32; - - /// Average size of the chain header from justification ancestry. We don't expect to see there - /// headers that change GRANDPA authorities set (GRANDPA will probably be able to finalize at - /// least one additional header per session on non test chains), so this is average size of - /// headers that aren't changing the set. - /// - /// This isn't a strict limit. The relay may submit justifications with larger headers in its - /// ancestry and the pallet will accept the call. The limit is only used to compute maximal - /// refund amount and doing calls which exceed the limit, may be costly to submitter. - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32; -} - -impl ChainWithGrandpa for T -where - T: Chain + UnderlyingChainProvider, - T::Chain: ChainWithGrandpa, -{ - const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = - ::WITH_CHAIN_GRANDPA_PALLET_NAME; - const MAX_AUTHORITIES_COUNT: u32 = ::MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - ::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; - const MAX_HEADER_SIZE: u32 = ::MAX_HEADER_SIZE; - const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = - ::AVERAGE_HEADER_SIZE_IN_JUSTIFICATION; -} diff --git a/cumulus/bridges/primitives/header-chain/src/storage_keys.rs b/cumulus/bridges/primitives/header-chain/src/storage_keys.rs deleted file mode 100644 index c4dbe53bd9a7..000000000000 --- a/cumulus/bridges/primitives/header-chain/src/storage_keys.rs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Storage keys of bridge GRANDPA pallet. - -/// Name of the `IsHalted` storage value. -pub const PALLET_OPERATING_MODE_VALUE_NAME: &str = "PalletOperatingMode"; -/// Name of the `BestFinalized` storage value. -pub const BEST_FINALIZED_VALUE_NAME: &str = "BestFinalized"; -/// Name of the `CurrentAuthoritySet` storage value. -pub const CURRENT_AUTHORITY_SET_VALUE_NAME: &str = "CurrentAuthoritySet"; - -use sp_core::storage::StorageKey; - -/// Storage key of the `PalletOperatingMode` variable in the runtime storage. -pub fn pallet_operating_mode_key(pallet_prefix: &str) -> StorageKey { - StorageKey( - bp_runtime::storage_value_final_key( - pallet_prefix.as_bytes(), - PALLET_OPERATING_MODE_VALUE_NAME.as_bytes(), - ) - .to_vec(), - ) -} - -/// Storage key of the `CurrentAuthoritySet` variable in the runtime storage. -pub fn current_authority_set_key(pallet_prefix: &str) -> StorageKey { - StorageKey( - bp_runtime::storage_value_final_key( - pallet_prefix.as_bytes(), - CURRENT_AUTHORITY_SET_VALUE_NAME.as_bytes(), - ) - .to_vec(), - ) -} - -/// Storage key of the best finalized header number and hash value in the runtime storage. -pub fn best_finalized_key(pallet_prefix: &str) -> StorageKey { - StorageKey( - bp_runtime::storage_value_final_key( - pallet_prefix.as_bytes(), - BEST_FINALIZED_VALUE_NAME.as_bytes(), - ) - .to_vec(), - ) -} - -#[cfg(test)] -mod tests { - use super::*; - use hex_literal::hex; - - #[test] - fn pallet_operating_mode_key_computed_properly() { - // If this test fails, then something has been changed in module storage that is breaking - // compatibility with previous pallet. - let storage_key = pallet_operating_mode_key("BridgeGrandpa").0; - assert_eq!( - storage_key, - hex!("0b06f475eddb98cf933a12262e0388de0f4cf0917788d791142ff6c1f216e7b3").to_vec(), - "Unexpected storage key: {}", - hex::encode(&storage_key), - ); - } - - #[test] - fn current_authority_set_key_computed_properly() { - // If this test fails, then something has been changed in module storage that is breaking - // compatibility with previous pallet. - let storage_key = current_authority_set_key("BridgeGrandpa").0; - assert_eq!( - storage_key, - hex!("0b06f475eddb98cf933a12262e0388de24a7b8b5717ea33346fa595a66ccbcb0").to_vec(), - "Unexpected storage key: {}", - hex::encode(&storage_key), - ); - } - - #[test] - fn best_finalized_key_computed_properly() { - // If this test fails, then something has been changed in module storage that is breaking - // compatibility with previous pallet. - let storage_key = best_finalized_key("BridgeGrandpa").0; - assert_eq!( - storage_key, - hex!("0b06f475eddb98cf933a12262e0388dea4ebafdd473c549fdb24c5c991c5591c").to_vec(), - "Unexpected storage key: {}", - hex::encode(&storage_key), - ); - } -} diff --git a/cumulus/bridges/primitives/header-chain/tests/justification/equivocation.rs b/cumulus/bridges/primitives/header-chain/tests/justification/equivocation.rs deleted file mode 100644 index f3c133481fb8..000000000000 --- a/cumulus/bridges/primitives/header-chain/tests/justification/equivocation.rs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Tests for Grandpa equivocations collector code. - -use bp_header_chain::justification::EquivocationsCollector; -use bp_test_utils::*; -use finality_grandpa::Precommit; -use sp_consensus_grandpa::EquivocationProof; - -type TestHeader = sp_runtime::testing::Header; - -#[test] -fn duplicate_votes_are_not_considered_equivocations() { - let verification_context = verification_context(TEST_GRANDPA_SET_ID); - let base_justification = make_default_justification::(&test_header(1)); - - let mut collector = - EquivocationsCollector::new(&verification_context, &base_justification).unwrap(); - collector.parse_justifications(&[base_justification.clone()]); - - assert_eq!(collector.into_equivocation_proofs().len(), 0); -} - -#[test] -fn equivocations_are_detected_in_base_justification_redundant_votes() { - let mut base_justification = make_default_justification::(&test_header(1)); - - let first_vote = base_justification.commit.precommits[0].clone(); - let equivocation = signed_precommit::( - &ALICE, - header_id::(1), - base_justification.round, - TEST_GRANDPA_SET_ID, - ); - base_justification.commit.precommits.push(equivocation.clone()); - - let verification_context = verification_context(TEST_GRANDPA_SET_ID); - let collector = - EquivocationsCollector::new(&verification_context, &base_justification).unwrap(); - - assert_eq!( - collector.into_equivocation_proofs(), - vec![EquivocationProof::new( - 1, - sp_consensus_grandpa::Equivocation::Precommit(finality_grandpa::Equivocation { - round_number: 1, - identity: ALICE.into(), - first: ( - Precommit { - target_hash: first_vote.precommit.target_hash, - target_number: first_vote.precommit.target_number - }, - first_vote.signature - ), - second: ( - Precommit { - target_hash: equivocation.precommit.target_hash, - target_number: equivocation.precommit.target_number - }, - equivocation.signature - ) - }) - )] - ); -} - -#[test] -fn equivocations_are_detected_in_extra_justification_redundant_votes() { - let base_justification = make_default_justification::(&test_header(1)); - let first_vote = base_justification.commit.precommits[0].clone(); - - let mut extra_justification = base_justification.clone(); - let equivocation = signed_precommit::( - &ALICE, - header_id::(1), - base_justification.round, - TEST_GRANDPA_SET_ID, - ); - extra_justification.commit.precommits.push(equivocation.clone()); - - let verification_context = verification_context(TEST_GRANDPA_SET_ID); - let mut collector = - EquivocationsCollector::new(&verification_context, &base_justification).unwrap(); - collector.parse_justifications(&[extra_justification]); - - assert_eq!( - collector.into_equivocation_proofs(), - vec![EquivocationProof::new( - 1, - sp_consensus_grandpa::Equivocation::Precommit(finality_grandpa::Equivocation { - round_number: 1, - identity: ALICE.into(), - first: ( - Precommit { - target_hash: first_vote.precommit.target_hash, - target_number: first_vote.precommit.target_number - }, - first_vote.signature - ), - second: ( - Precommit { - target_hash: equivocation.precommit.target_hash, - target_number: equivocation.precommit.target_number - }, - equivocation.signature - ) - }) - )] - ); -} diff --git a/cumulus/bridges/primitives/header-chain/tests/justification/optimizer.rs b/cumulus/bridges/primitives/header-chain/tests/justification/optimizer.rs deleted file mode 100644 index bdc90a3b07cf..000000000000 --- a/cumulus/bridges/primitives/header-chain/tests/justification/optimizer.rs +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Tests for Grandpa Justification optimizer code. - -use bp_header_chain::justification::verify_and_optimize_justification; -use bp_test_utils::*; -use finality_grandpa::SignedPrecommit; -use sp_consensus_grandpa::AuthoritySignature; - -type TestHeader = sp_runtime::testing::Header; - -#[test] -fn optimizer_does_noting_with_minimal_justification() { - let mut justification = make_default_justification::(&test_header(1)); - - let num_precommits_before = justification.commit.precommits.len(); - verify_and_optimize_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &mut justification, - ) - .unwrap(); - let num_precommits_after = justification.commit.precommits.len(); - - assert_eq!(num_precommits_before, num_precommits_after); -} - -#[test] -fn unknown_authority_votes_are_removed_by_optimizer() { - let mut justification = make_default_justification::(&test_header(1)); - justification.commit.precommits.push(signed_precommit::( - &bp_test_utils::Account(42), - header_id::(1), - justification.round, - TEST_GRANDPA_SET_ID, - )); - - let num_precommits_before = justification.commit.precommits.len(); - verify_and_optimize_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &mut justification, - ) - .unwrap(); - let num_precommits_after = justification.commit.precommits.len(); - - assert_eq!(num_precommits_before - 1, num_precommits_after); -} - -#[test] -fn duplicate_authority_votes_are_removed_by_optimizer() { - let mut justification = make_default_justification::(&test_header(1)); - justification - .commit - .precommits - .push(justification.commit.precommits.first().cloned().unwrap()); - - let num_precommits_before = justification.commit.precommits.len(); - verify_and_optimize_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &mut justification, - ) - .unwrap(); - let num_precommits_after = justification.commit.precommits.len(); - - assert_eq!(num_precommits_before - 1, num_precommits_after); -} - -#[test] -fn invalid_authority_signatures_are_removed_by_optimizer() { - let mut justification = make_default_justification::(&test_header(1)); - - let target = header_id::(1); - let invalid_raw_signature: Vec = ALICE.sign(b"").to_bytes().into(); - justification.commit.precommits.insert( - 0, - SignedPrecommit { - precommit: finality_grandpa::Precommit { - target_hash: target.0, - target_number: target.1, - }, - signature: AuthoritySignature::try_from(invalid_raw_signature).unwrap(), - id: ALICE.into(), - }, - ); - - let num_precommits_before = justification.commit.precommits.len(); - verify_and_optimize_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &mut justification, - ) - .unwrap(); - let num_precommits_after = justification.commit.precommits.len(); - - assert_eq!(num_precommits_before - 1, num_precommits_after); -} - -#[test] -fn redundant_authority_votes_are_removed_by_optimizer() { - let mut justification = make_default_justification::(&test_header(1)); - justification.commit.precommits.push(signed_precommit::( - &EVE, - header_id::(1), - justification.round, - TEST_GRANDPA_SET_ID, - )); - - let num_precommits_before = justification.commit.precommits.len(); - verify_and_optimize_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &mut justification, - ) - .unwrap(); - let num_precommits_after = justification.commit.precommits.len(); - - assert_eq!(num_precommits_before - 1, num_precommits_after); -} - -#[test] -fn unrelated_ancestry_votes_are_removed_by_optimizer() { - let mut justification = make_default_justification::(&test_header(2)); - justification.commit.precommits.insert( - 0, - signed_precommit::( - &ALICE, - header_id::(1), - justification.round, - TEST_GRANDPA_SET_ID, - ), - ); - - let num_precommits_before = justification.commit.precommits.len(); - verify_and_optimize_justification::( - header_id::(2), - &verification_context(TEST_GRANDPA_SET_ID), - &mut justification, - ) - .unwrap(); - let num_precommits_after = justification.commit.precommits.len(); - - assert_eq!(num_precommits_before - 1, num_precommits_after); -} - -#[test] -fn redundant_votes_ancestries_are_removed_by_optimizer() { - let mut justification = make_default_justification::(&test_header(1)); - justification.votes_ancestries.push(test_header(100)); - - let num_votes_ancestries_before = justification.votes_ancestries.len(); - verify_and_optimize_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &mut justification, - ) - .unwrap(); - let num_votes_ancestries_after = justification.votes_ancestries.len(); - - assert_eq!(num_votes_ancestries_before - 1, num_votes_ancestries_after); -} diff --git a/cumulus/bridges/primitives/header-chain/tests/justification/strict.rs b/cumulus/bridges/primitives/header-chain/tests/justification/strict.rs deleted file mode 100644 index 9568f7f7cf9a..000000000000 --- a/cumulus/bridges/primitives/header-chain/tests/justification/strict.rs +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Tests for Grandpa strict justification verifier code. - -use bp_header_chain::justification::{ - required_justification_precommits, verify_justification, JustificationVerificationContext, - JustificationVerificationError, PrecommitError, -}; -use bp_test_utils::*; - -type TestHeader = sp_runtime::testing::Header; - -#[test] -fn valid_justification_accepted() { - let authorities = vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1)]; - let params = JustificationGeneratorParams { - header: test_header(1), - round: TEST_GRANDPA_ROUND, - set_id: TEST_GRANDPA_SET_ID, - authorities: authorities.clone(), - ancestors: 7, - forks: 3, - }; - - let justification = make_justification_for_header::(params.clone()); - assert_eq!( - verify_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &justification, - ), - Ok(()), - ); - - assert_eq!(justification.commit.precommits.len(), authorities.len()); - assert_eq!(justification.votes_ancestries.len(), params.ancestors as usize); -} - -#[test] -fn valid_justification_accepted_with_single_fork() { - let params = JustificationGeneratorParams { - header: test_header(1), - round: TEST_GRANDPA_ROUND, - set_id: TEST_GRANDPA_SET_ID, - authorities: vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1)], - ancestors: 5, - forks: 1, - }; - - assert_eq!( - verify_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &make_justification_for_header::(params) - ), - Ok(()), - ); -} - -#[test] -fn valid_justification_accepted_with_arbitrary_number_of_authorities() { - use finality_grandpa::voter_set::VoterSet; - use sp_consensus_grandpa::AuthorityId; - - let n = 15; - let required_signatures = required_justification_precommits(n as _); - let authorities = accounts(n).iter().map(|k| (*k, 1)).collect::>(); - - let params = JustificationGeneratorParams { - header: test_header(1), - round: TEST_GRANDPA_ROUND, - set_id: TEST_GRANDPA_SET_ID, - authorities: authorities.clone().into_iter().take(required_signatures as _).collect(), - ancestors: n.into(), - forks: required_signatures, - }; - - let authorities = authorities - .iter() - .map(|(id, w)| (AuthorityId::from(*id), *w)) - .collect::>(); - let voter_set = VoterSet::new(authorities).unwrap(); - - assert_eq!( - verify_justification::( - header_id::(1), - &JustificationVerificationContext { voter_set, authority_set_id: TEST_GRANDPA_SET_ID }, - &make_justification_for_header::(params) - ), - Ok(()), - ); -} - -#[test] -fn justification_with_invalid_target_rejected() { - assert_eq!( - verify_justification::( - header_id::(2), - &verification_context(TEST_GRANDPA_SET_ID), - &make_default_justification::(&test_header(1)), - ), - Err(JustificationVerificationError::InvalidJustificationTarget), - ); -} - -#[test] -fn justification_with_invalid_commit_rejected() { - let mut justification = make_default_justification::(&test_header(1)); - justification.commit.precommits.clear(); - - assert_eq!( - verify_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &justification, - ), - Err(JustificationVerificationError::TooLowCumulativeWeight), - ); -} - -#[test] -fn justification_with_invalid_authority_signature_rejected() { - let mut justification = make_default_justification::(&test_header(1)); - justification.commit.precommits[0].signature = - sp_core::crypto::UncheckedFrom::unchecked_from([1u8; 64]); - - assert_eq!( - verify_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &justification, - ), - Err(JustificationVerificationError::Precommit(PrecommitError::InvalidAuthoritySignature)), - ); -} - -#[test] -fn justification_with_invalid_precommit_ancestry() { - let mut justification = make_default_justification::(&test_header(1)); - justification.votes_ancestries.push(test_header(10)); - - assert_eq!( - verify_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &justification, - ), - Err(JustificationVerificationError::RedundantVotesAncestries), - ); -} - -#[test] -fn justification_is_invalid_if_we_dont_meet_threshold() { - // Need at least three authorities to sign off or else the voter set threshold can't be reached - let authorities = vec![(ALICE, 1), (BOB, 1)]; - - let params = JustificationGeneratorParams { - header: test_header(1), - round: TEST_GRANDPA_ROUND, - set_id: TEST_GRANDPA_SET_ID, - authorities: authorities.clone(), - ancestors: 2 * authorities.len() as u32, - forks: 2, - }; - - assert_eq!( - verify_justification::( - header_id::(1), - &verification_context(TEST_GRANDPA_SET_ID), - &make_justification_for_header::(params) - ), - Err(JustificationVerificationError::TooLowCumulativeWeight), - ); -} diff --git a/cumulus/bridges/primitives/header-chain/tests/tests.rs b/cumulus/bridges/primitives/header-chain/tests/tests.rs deleted file mode 100644 index 7c525a9303ad..000000000000 --- a/cumulus/bridges/primitives/header-chain/tests/tests.rs +++ /dev/null @@ -1,7 +0,0 @@ -mod justification { - mod equivocation; - mod optimizer; - mod strict; -} - -mod implementation_match; diff --git a/cumulus/bridges/primitives/messages/Cargo.toml b/cumulus/bridges/primitives/messages/Cargo.toml deleted file mode 100644 index ecb0bdc4079d..000000000000 --- a/cumulus/bridges/primitives/messages/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "bp-messages" -description = "Primitives of messages module." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "bit-vec"] } -scale-info = { version = "2.9.0", default-features = false, features = ["bit-vec", "derive"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } - -# Bridge dependencies - -bp-runtime = { path = "../runtime", default-features = false } -bp-header-chain = { path = "../header-chain", default-features = false } - -# Substrate Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[dev-dependencies] -hex = "0.4" -hex-literal = "0.4" - -[features] -default = ["std"] -std = [ - "bp-runtime/std", - "bp-header-chain/std", - "codec/std", - "frame-support/std", - "scale-info/std", - "serde/std", - "sp-core/std", - "sp-std/std" -] diff --git a/cumulus/bridges/primitives/messages/src/lib.rs b/cumulus/bridges/primitives/messages/src/lib.rs deleted file mode 100644 index 84c41de3b361..000000000000 --- a/cumulus/bridges/primitives/messages/src/lib.rs +++ /dev/null @@ -1,530 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Primitives of messages module. - -#![cfg_attr(not(feature = "std"), no_std)] -// RuntimeApi generated functions -#![allow(clippy::too_many_arguments)] - -use bp_header_chain::HeaderChainError; -use bp_runtime::{ - messages::MessageDispatchResult, BasicOperatingMode, OperatingMode, RangeInclusiveExt, - StorageProofError, -}; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{PalletError, RuntimeDebug}; -// Weight is reexported to avoid additional frame-support dependencies in related crates. -pub use frame_support::weights::Weight; -use scale_info::TypeInfo; -use serde::{Deserialize, Serialize}; -use source_chain::RelayersRewards; -use sp_core::TypeId; -use sp_std::{collections::vec_deque::VecDeque, ops::RangeInclusive, prelude::*}; - -pub mod source_chain; -pub mod storage_keys; -pub mod target_chain; - -/// Messages pallet operating mode. -#[derive( - Encode, - Decode, - Clone, - Copy, - PartialEq, - Eq, - RuntimeDebug, - TypeInfo, - MaxEncodedLen, - Serialize, - Deserialize, -)] -pub enum MessagesOperatingMode { - /// Basic operating mode (Normal/Halted) - Basic(BasicOperatingMode), - /// The pallet is not accepting outbound messages. Inbound messages and receiving proofs - /// are still accepted. - /// - /// This mode may be used e.g. when bridged chain expects upgrade. Then to avoid dispatch - /// failures, the pallet owner may stop accepting new messages, while continuing to deliver - /// queued messages to the bridged chain. Once upgrade is completed, the mode may be switched - /// back to `Normal`. - RejectingOutboundMessages, -} - -impl Default for MessagesOperatingMode { - fn default() -> Self { - MessagesOperatingMode::Basic(BasicOperatingMode::Normal) - } -} - -impl OperatingMode for MessagesOperatingMode { - fn is_halted(&self) -> bool { - match self { - Self::Basic(operating_mode) => operating_mode.is_halted(), - _ => false, - } - } -} - -/// Lane id which implements `TypeId`. -#[derive( - Clone, Copy, Decode, Default, Encode, Eq, Ord, PartialOrd, PartialEq, TypeInfo, MaxEncodedLen, -)] -pub struct LaneId(pub [u8; 4]); - -impl core::fmt::Debug for LaneId { - fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { - self.0.fmt(fmt) - } -} - -impl AsRef<[u8]> for LaneId { - fn as_ref(&self) -> &[u8] { - &self.0 - } -} - -impl TypeId for LaneId { - const TYPE_ID: [u8; 4] = *b"blan"; -} - -/// Message nonce. Valid messages will never have 0 nonce. -pub type MessageNonce = u64; - -/// Message id as a tuple. -pub type BridgeMessageId = (LaneId, MessageNonce); - -/// Opaque message payload. We only decode this payload when it is dispatched. -pub type MessagePayload = Vec; - -/// Message key (unique message identifier) as it is stored in the storage. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] -pub struct MessageKey { - /// ID of the message lane. - pub lane_id: LaneId, - /// Message nonce. - pub nonce: MessageNonce, -} - -/// Message as it is stored in the storage. -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] -pub struct Message { - /// Message key. - pub key: MessageKey, - /// Message payload. - pub payload: MessagePayload, -} - -/// Inbound lane data. -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo)] -pub struct InboundLaneData { - /// Identifiers of relayers and messages that they have delivered to this lane (ordered by - /// message nonce). - /// - /// This serves as a helper storage item, to allow the source chain to easily pay rewards - /// to the relayers who successfully delivered messages to the target chain (inbound lane). - /// - /// It is guaranteed to have at most N entries, where N is configured at the module level. - /// If there are N entries in this vec, then: - /// 1) all incoming messages are rejected if they're missing corresponding - /// `proof-of(outbound-lane.state)`; 2) all incoming messages are rejected if - /// `proof-of(outbound-lane.state).last_delivered_nonce` is equal to - /// `self.last_confirmed_nonce`. Given what is said above, all nonces in this queue are in - /// range: `(self.last_confirmed_nonce; self.last_delivered_nonce()]`. - /// - /// When a relayer sends a single message, both of MessageNonces are the same. - /// When relayer sends messages in a batch, the first arg is the lowest nonce, second arg the - /// highest nonce. Multiple dispatches from the same relayer are allowed. - pub relayers: VecDeque>, - - /// Nonce of the last message that - /// a) has been delivered to the target (this) chain and - /// b) the delivery has been confirmed on the source chain - /// - /// that the target chain knows of. - /// - /// This value is updated indirectly when an `OutboundLane` state of the source - /// chain is received alongside with new messages delivery. - pub last_confirmed_nonce: MessageNonce, -} - -impl Default for InboundLaneData { - fn default() -> Self { - InboundLaneData { relayers: VecDeque::new(), last_confirmed_nonce: 0 } - } -} - -impl InboundLaneData { - /// Returns approximate size of the struct, given a number of entries in the `relayers` set and - /// size of each entry. - /// - /// Returns `None` if size overflows `usize` limits. - pub fn encoded_size_hint(relayers_entries: usize) -> Option - where - RelayerId: MaxEncodedLen, - { - relayers_entries - .checked_mul(UnrewardedRelayer::::max_encoded_len())? - .checked_add(MessageNonce::max_encoded_len()) - } - - /// Returns the approximate size of the struct as u32, given a number of entries in the - /// `relayers` set and the size of each entry. - /// - /// Returns `u32::MAX` if size overflows `u32` limits. - pub fn encoded_size_hint_u32(relayers_entries: usize) -> u32 - where - RelayerId: MaxEncodedLen, - { - Self::encoded_size_hint(relayers_entries) - .and_then(|x| u32::try_from(x).ok()) - .unwrap_or(u32::MAX) - } - - /// Nonce of the last message that has been delivered to this (target) chain. - pub fn last_delivered_nonce(&self) -> MessageNonce { - self.relayers - .back() - .map(|entry| entry.messages.end) - .unwrap_or(self.last_confirmed_nonce) - } - - /// Returns the total number of messages in the `relayers` vector, - /// saturating in case of underflow or overflow. - pub fn total_unrewarded_messages(&self) -> MessageNonce { - let relayers = &self.relayers; - match (relayers.front(), relayers.back()) { - (Some(front), Some(back)) => - (front.messages.begin..=back.messages.end).saturating_len(), - _ => 0, - } - } -} - -/// Outbound message details, returned by runtime APIs. -#[derive(Clone, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] -pub struct OutboundMessageDetails { - /// Nonce assigned to the message. - pub nonce: MessageNonce, - /// Message dispatch weight. - /// - /// Depending on messages pallet configuration, it may be declared by the message submitter, - /// computed automatically or just be zero if dispatch fee is paid at the target chain. - pub dispatch_weight: Weight, - /// Size of the encoded message. - pub size: u32, -} - -/// Inbound message details, returned by runtime APIs. -#[derive(Clone, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] -pub struct InboundMessageDetails { - /// Computed message dispatch weight. - /// - /// Runtime API guarantees that it will match the value, returned by - /// `target_chain::MessageDispatch::dispatch_weight`. This means that if the runtime - /// has failed to decode the message, it will be zero - that's because `undecodable` - /// message cannot be dispatched. - pub dispatch_weight: Weight, -} - -/// Unrewarded relayer entry stored in the inbound lane data. -/// -/// This struct represents a continuous range of messages that have been delivered by the same -/// relayer and whose confirmations are still pending. -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] -pub struct UnrewardedRelayer { - /// Identifier of the relayer. - pub relayer: RelayerId, - /// Messages range, delivered by this relayer. - pub messages: DeliveredMessages, -} - -/// Received messages with their dispatch result. -#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] -pub struct ReceivedMessages { - /// Id of the lane which is receiving messages. - pub lane: LaneId, - /// Result of messages which we tried to dispatch - pub receive_results: Vec<(MessageNonce, ReceivalResult)>, -} - -impl ReceivedMessages { - pub fn new( - lane: LaneId, - receive_results: Vec<(MessageNonce, ReceivalResult)>, - ) -> Self { - ReceivedMessages { lane, receive_results } - } - - pub fn push(&mut self, message: MessageNonce, result: ReceivalResult) { - self.receive_results.push((message, result)); - } -} - -/// Result of single message receival. -#[derive(RuntimeDebug, Encode, Decode, PartialEq, Eq, Clone, TypeInfo)] -pub enum ReceivalResult { - /// Message has been received and dispatched. Note that we don't care whether dispatch has - /// been successful or not - in both case message falls into this category. - /// - /// The message dispatch result is also returned. - Dispatched(MessageDispatchResult), - /// Message has invalid nonce and lane has rejected to accept this message. - InvalidNonce, - /// There are too many unrewarded relayer entries at the lane. - TooManyUnrewardedRelayers, - /// There are too many unconfirmed messages at the lane. - TooManyUnconfirmedMessages, -} - -/// Delivered messages with their dispatch result. -#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] -pub struct DeliveredMessages { - /// Nonce of the first message that has been delivered (inclusive). - pub begin: MessageNonce, - /// Nonce of the last message that has been delivered (inclusive). - pub end: MessageNonce, -} - -impl DeliveredMessages { - /// Create new `DeliveredMessages` struct that confirms delivery of single nonce with given - /// dispatch result. - pub fn new(nonce: MessageNonce) -> Self { - DeliveredMessages { begin: nonce, end: nonce } - } - - /// Return total count of delivered messages. - pub fn total_messages(&self) -> MessageNonce { - (self.begin..=self.end).saturating_len() - } - - /// Note new dispatched message. - pub fn note_dispatched_message(&mut self) { - self.end += 1; - } - - /// Returns true if delivered messages contain message with given nonce. - pub fn contains_message(&self, nonce: MessageNonce) -> bool { - (self.begin..=self.end).contains(&nonce) - } -} - -/// Gist of `InboundLaneData::relayers` field used by runtime APIs. -#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] -pub struct UnrewardedRelayersState { - /// Number of entries in the `InboundLaneData::relayers` set. - pub unrewarded_relayer_entries: MessageNonce, - /// Number of messages in the oldest entry of `InboundLaneData::relayers`. This is the - /// minimal number of reward proofs required to push out this entry from the set. - pub messages_in_oldest_entry: MessageNonce, - /// Total number of messages in the relayers vector. - pub total_messages: MessageNonce, - /// Nonce of the latest message that has been delivered to the target chain. - /// - /// This corresponds to the result of the `InboundLaneData::last_delivered_nonce` call - /// at the bridged chain. - pub last_delivered_nonce: MessageNonce, -} - -impl UnrewardedRelayersState { - // Verify that the relayers state corresponds with the `InboundLaneData`. - pub fn is_valid(&self, lane_data: &InboundLaneData) -> bool { - self == &lane_data.into() - } -} - -impl From<&InboundLaneData> for UnrewardedRelayersState { - fn from(lane: &InboundLaneData) -> UnrewardedRelayersState { - UnrewardedRelayersState { - unrewarded_relayer_entries: lane.relayers.len() as _, - messages_in_oldest_entry: lane - .relayers - .front() - .map(|entry| entry.messages.total_messages()) - .unwrap_or(0), - total_messages: lane.total_unrewarded_messages(), - last_delivered_nonce: lane.last_delivered_nonce(), - } - } -} - -/// Outbound lane data. -#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] -pub struct OutboundLaneData { - /// Nonce of the oldest message that we haven't yet pruned. May point to not-yet-generated - /// message if all sent messages are already pruned. - pub oldest_unpruned_nonce: MessageNonce, - /// Nonce of the latest message, received by bridged chain. - pub latest_received_nonce: MessageNonce, - /// Nonce of the latest message, generated by us. - pub latest_generated_nonce: MessageNonce, -} - -impl Default for OutboundLaneData { - fn default() -> Self { - OutboundLaneData { - // it is 1 because we're pruning everything in [oldest_unpruned_nonce; - // latest_received_nonce] - oldest_unpruned_nonce: 1, - latest_received_nonce: 0, - latest_generated_nonce: 0, - } - } -} - -impl OutboundLaneData { - /// Return nonces of all currently queued messages (i.e. messages that we believe - /// are not delivered yet). - pub fn queued_messages(&self) -> RangeInclusive { - (self.latest_received_nonce + 1)..=self.latest_generated_nonce - } -} - -/// Calculate the number of messages that the relayers have delivered. -pub fn calc_relayers_rewards( - messages_relayers: VecDeque>, - received_range: &RangeInclusive, -) -> RelayersRewards -where - AccountId: sp_std::cmp::Ord, -{ - // remember to reward relayers that have delivered messages - // this loop is bounded by `T::MaxUnrewardedRelayerEntriesAtInboundLane` on the bridged chain - let mut relayers_rewards = RelayersRewards::new(); - for entry in messages_relayers { - let nonce_begin = sp_std::cmp::max(entry.messages.begin, *received_range.start()); - let nonce_end = sp_std::cmp::min(entry.messages.end, *received_range.end()); - if nonce_end >= nonce_begin { - *relayers_rewards.entry(entry.relayer).or_default() += nonce_end - nonce_begin + 1; - } - } - relayers_rewards -} - -/// A minimized version of `pallet-bridge-messages::Call` that can be used without a runtime. -#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] -#[allow(non_camel_case_types)] -pub enum BridgeMessagesCall { - /// `pallet-bridge-messages::Call::receive_messages_proof` - #[codec(index = 2)] - receive_messages_proof { - relayer_id_at_bridged_chain: AccountId, - proof: MessagesProof, - messages_count: u32, - dispatch_weight: Weight, - }, - /// `pallet-bridge-messages::Call::receive_messages_delivery_proof` - #[codec(index = 3)] - receive_messages_delivery_proof { - proof: MessagesDeliveryProof, - relayers_state: UnrewardedRelayersState, - }, -} - -/// Error that happens during message verification. -#[derive(Encode, Decode, RuntimeDebug, PartialEq, Eq, PalletError, TypeInfo)] -pub enum VerificationError { - /// The message proof is empty. - EmptyMessageProof, - /// Error returned by the bridged header chain. - HeaderChain(HeaderChainError), - /// Error returned while reading/decoding inbound lane data from the storage proof. - InboundLaneStorage(StorageProofError), - /// The declared message weight is incorrect. - InvalidMessageWeight, - /// Declared messages count doesn't match actual value. - MessagesCountMismatch, - /// Error returned while reading/decoding message data from the storage proof. - MessageStorage(StorageProofError), - /// The message is too large. - MessageTooLarge, - /// Error returned while reading/decoding outbound lane data from the storage proof. - OutboundLaneStorage(StorageProofError), - /// Storage proof related error. - StorageProof(StorageProofError), - /// Custom error - Other(#[codec(skip)] &'static str), -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn total_unrewarded_messages_does_not_overflow() { - let lane_data = InboundLaneData { - relayers: vec![ - UnrewardedRelayer { relayer: 1, messages: DeliveredMessages::new(0) }, - UnrewardedRelayer { - relayer: 2, - messages: DeliveredMessages::new(MessageNonce::MAX), - }, - ] - .into_iter() - .collect(), - last_confirmed_nonce: 0, - }; - assert_eq!(lane_data.total_unrewarded_messages(), MessageNonce::MAX); - } - - #[test] - fn inbound_lane_data_returns_correct_hint() { - let test_cases = vec![ - // single relayer, multiple messages - (1, 128u8), - // multiple relayers, single message per relayer - (128u8, 128u8), - // several messages per relayer - (13u8, 128u8), - ]; - for (relayer_entries, messages_count) in test_cases { - let expected_size = InboundLaneData::::encoded_size_hint(relayer_entries as _); - let actual_size = InboundLaneData { - relayers: (1u8..=relayer_entries) - .map(|i| UnrewardedRelayer { - relayer: i, - messages: DeliveredMessages::new(i as _), - }) - .collect(), - last_confirmed_nonce: messages_count as _, - } - .encode() - .len(); - let difference = (expected_size.unwrap() as f64 - actual_size as f64).abs(); - assert!( - difference / (std::cmp::min(actual_size, expected_size.unwrap()) as f64) < 0.1, - "Too large difference between actual ({actual_size}) and expected ({expected_size:?}) inbound lane data size. Test case: {relayer_entries}+{messages_count}", - ); - } - } - - #[test] - fn contains_result_works() { - let delivered_messages = DeliveredMessages { begin: 100, end: 150 }; - - assert!(!delivered_messages.contains_message(99)); - assert!(delivered_messages.contains_message(100)); - assert!(delivered_messages.contains_message(150)); - assert!(!delivered_messages.contains_message(151)); - } - - #[test] - fn lane_id_debug_format_matches_inner_array_format() { - assert_eq!(format!("{:?}", LaneId([0, 0, 0, 0])), format!("{:?}", [0, 0, 0, 0]),); - } -} diff --git a/cumulus/bridges/primitives/messages/src/storage_keys.rs b/cumulus/bridges/primitives/messages/src/storage_keys.rs deleted file mode 100644 index 4edf9828cfde..000000000000 --- a/cumulus/bridges/primitives/messages/src/storage_keys.rs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Storage keys of bridge messages pallet. - -/// Name of the `OPERATING_MODE_VALUE_NAME` storage value. -pub const OPERATING_MODE_VALUE_NAME: &str = "PalletOperatingMode"; -/// Name of the `OutboundMessages` storage map. -pub const OUTBOUND_MESSAGES_MAP_NAME: &str = "OutboundMessages"; -/// Name of the `OutboundLanes` storage map. -pub const OUTBOUND_LANES_MAP_NAME: &str = "OutboundLanes"; -/// Name of the `InboundLanes` storage map. -pub const INBOUND_LANES_MAP_NAME: &str = "InboundLanes"; - -use crate::{LaneId, MessageKey, MessageNonce}; - -use codec::Encode; -use frame_support::Blake2_128Concat; -use sp_core::storage::StorageKey; - -/// Storage key of the `PalletOperatingMode` value in the runtime storage. -pub fn operating_mode_key(pallet_prefix: &str) -> StorageKey { - StorageKey( - bp_runtime::storage_value_final_key( - pallet_prefix.as_bytes(), - OPERATING_MODE_VALUE_NAME.as_bytes(), - ) - .to_vec(), - ) -} - -/// Storage key of the outbound message in the runtime storage. -pub fn message_key(pallet_prefix: &str, lane: &LaneId, nonce: MessageNonce) -> StorageKey { - bp_runtime::storage_map_final_key::( - pallet_prefix, - OUTBOUND_MESSAGES_MAP_NAME, - &MessageKey { lane_id: *lane, nonce }.encode(), - ) -} - -/// Storage key of the outbound message lane state in the runtime storage. -pub fn outbound_lane_data_key(pallet_prefix: &str, lane: &LaneId) -> StorageKey { - bp_runtime::storage_map_final_key::( - pallet_prefix, - OUTBOUND_LANES_MAP_NAME, - &lane.encode(), - ) -} - -/// Storage key of the inbound message lane state in the runtime storage. -pub fn inbound_lane_data_key(pallet_prefix: &str, lane: &LaneId) -> StorageKey { - bp_runtime::storage_map_final_key::( - pallet_prefix, - INBOUND_LANES_MAP_NAME, - &lane.encode(), - ) -} - -#[cfg(test)] -mod tests { - use super::*; - use hex_literal::hex; - - #[test] - fn operating_mode_key_computed_properly() { - // If this test fails, then something has been changed in module storage that is possibly - // breaking all existing message relays. - let storage_key = operating_mode_key("BridgeMessages").0; - assert_eq!( - storage_key, - hex!("dd16c784ebd3390a9bc0357c7511ed010f4cf0917788d791142ff6c1f216e7b3").to_vec(), - "Unexpected storage key: {}", - hex::encode(&storage_key), - ); - } - - #[test] - fn storage_message_key_computed_properly() { - // If this test fails, then something has been changed in module storage that is breaking - // all previously crafted messages proofs. - let storage_key = message_key("BridgeMessages", &LaneId(*b"test"), 42).0; - assert_eq!( - storage_key, - hex!("dd16c784ebd3390a9bc0357c7511ed018a395e6242c6813b196ca31ed0547ea79446af0e09063bd4a7874aef8a997cec746573742a00000000000000").to_vec(), - "Unexpected storage key: {}", - hex::encode(&storage_key), - ); - } - - #[test] - fn outbound_lane_data_key_computed_properly() { - // If this test fails, then something has been changed in module storage that is breaking - // all previously crafted outbound lane state proofs. - let storage_key = outbound_lane_data_key("BridgeMessages", &LaneId(*b"test")).0; - assert_eq!( - storage_key, - hex!("dd16c784ebd3390a9bc0357c7511ed0196c246acb9b55077390e3ca723a0ca1f44a8995dd50b6657a037a7839304535b74657374").to_vec(), - "Unexpected storage key: {}", - hex::encode(&storage_key), - ); - } - - #[test] - fn inbound_lane_data_key_computed_properly() { - // If this test fails, then something has been changed in module storage that is breaking - // all previously crafted inbound lane state proofs. - let storage_key = inbound_lane_data_key("BridgeMessages", &LaneId(*b"test")).0; - assert_eq!( - storage_key, - hex!("dd16c784ebd3390a9bc0357c7511ed01e5f83cf83f2127eb47afdc35d6e43fab44a8995dd50b6657a037a7839304535b74657374").to_vec(), - "Unexpected storage key: {}", - hex::encode(&storage_key), - ); - } -} diff --git a/cumulus/bridges/primitives/parachains/Cargo.toml b/cumulus/bridges/primitives/parachains/Cargo.toml deleted file mode 100644 index 6cd138c62249..000000000000 --- a/cumulus/bridges/primitives/parachains/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "bp-parachains" -description = "Primitives of parachains module." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -impl-trait-for-tuples = "0.2" -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Bridge dependencies - -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } - -# Substrate dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-polkadot-core/std", - "bp-runtime/std", - "codec/std", - "frame-support/std", - "scale-info/std", - "sp-core/std", - "sp-runtime/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/parachains/src/lib.rs b/cumulus/bridges/primitives/parachains/src/lib.rs deleted file mode 100644 index e619fc7b641a..000000000000 --- a/cumulus/bridges/primitives/parachains/src/lib.rs +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Primitives of parachains module. - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use bp_header_chain::StoredHeaderData; - -use bp_polkadot_core::{ - parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}, - BlockNumber as RelayBlockNumber, Hash as RelayBlockHash, -}; -use bp_runtime::{ - BlockNumberOf, Chain, HashOf, HeaderOf, Parachain, StorageDoubleMapKeyProvider, - StorageMapKeyProvider, -}; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{Blake2_128Concat, RuntimeDebug, Twox64Concat}; -use scale_info::TypeInfo; -use sp_core::storage::StorageKey; -use sp_runtime::traits::Header as HeaderT; -use sp_std::{marker::PhantomData, prelude::*}; - -/// Best known parachain head hash. -#[derive(Clone, Decode, Encode, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] -pub struct BestParaHeadHash { - /// Number of relay block where this head has been read. - /// - /// Parachain head is opaque to relay chain. So we can't simply decode it as a header of - /// parachains and call `block_number()` on it. Instead, we're using the fact that parachain - /// head is always built on top of previous head (because it is blockchain) and relay chain - /// always imports parachain heads in order. What it means for us is that at any given - /// **finalized** relay block `B`, head of parachain will be ancestor (or the same) of all - /// parachain heads available at descendants of `B`. - pub at_relay_block_number: RelayBlockNumber, - /// Hash of parachain head. - pub head_hash: ParaHash, -} - -/// Best known parachain head as it is stored in the runtime storage. -#[derive(Decode, Encode, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] -pub struct ParaInfo { - /// Best known parachain head hash. - pub best_head_hash: BestParaHeadHash, - /// Current ring buffer position for this parachain. - pub next_imported_hash_position: u32, -} - -/// Returns runtime storage key of given parachain head at the source chain. -/// -/// The head is stored by the `paras` pallet in the `Heads` map. -pub fn parachain_head_storage_key_at_source( - paras_pallet_name: &str, - para_id: ParaId, -) -> StorageKey { - bp_runtime::storage_map_final_key::(paras_pallet_name, "Heads", ¶_id.encode()) -} - -/// Can be use to access the runtime storage key of the parachains info at the target chain. -/// -/// The info is stored by the `pallet-bridge-parachains` pallet in the `ParasInfo` map. -pub struct ParasInfoKeyProvider; -impl StorageMapKeyProvider for ParasInfoKeyProvider { - const MAP_NAME: &'static str = "ParasInfo"; - - type Hasher = Blake2_128Concat; - type Key = ParaId; - type Value = ParaInfo; -} - -/// Can be use to access the runtime storage key of the parachain head at the target chain. -/// -/// The head is stored by the `pallet-bridge-parachains` pallet in the `ImportedParaHeads` map. -pub struct ImportedParaHeadsKeyProvider; -impl StorageDoubleMapKeyProvider for ImportedParaHeadsKeyProvider { - const MAP_NAME: &'static str = "ImportedParaHeads"; - - type Hasher1 = Blake2_128Concat; - type Key1 = ParaId; - type Hasher2 = Blake2_128Concat; - type Key2 = ParaHash; - type Value = ParaStoredHeaderData; -} - -/// Stored data of the parachain head. It is encoded version of the -/// `bp_runtime::StoredHeaderData` structure. -/// -/// We do not know exact structure of the parachain head, so we always store encoded version -/// of the `bp_runtime::StoredHeaderData`. It is only decoded when we talk about specific parachain. -#[derive(Clone, Decode, Encode, PartialEq, RuntimeDebug, TypeInfo)] -pub struct ParaStoredHeaderData(pub Vec); - -impl ParaStoredHeaderData { - /// Decode stored parachain head data. - pub fn decode_parachain_head_data( - &self, - ) -> Result, HashOf>, codec::Error> { - StoredHeaderData::, HashOf>::decode(&mut &self.0[..]) - } -} - -/// Stored parachain head data builder. -pub trait ParaStoredHeaderDataBuilder { - /// Return number of parachains that are supported by this builder. - fn supported_parachains() -> u32; - - /// Try to build head data from encoded head of parachain with given id. - fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option; -} - -/// Helper for using single parachain as `ParaStoredHeaderDataBuilder`. -pub struct SingleParaStoredHeaderDataBuilder(PhantomData); - -impl ParaStoredHeaderDataBuilder for SingleParaStoredHeaderDataBuilder { - fn supported_parachains() -> u32 { - 1 - } - - fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option { - if para_id == ParaId(C::PARACHAIN_ID) { - let header = HeaderOf::::decode(&mut ¶_head.0[..]).ok()?; - return Some(ParaStoredHeaderData( - StoredHeaderData { number: *header.number(), state_root: *header.state_root() } - .encode(), - )) - } - None - } -} - -// Tries to build header data from each tuple member, short-circuiting on first successful one. -#[impl_trait_for_tuples::impl_for_tuples(1, 30)] -#[tuple_types_custom_trait_bound(Parachain)] -impl ParaStoredHeaderDataBuilder for C { - fn supported_parachains() -> u32 { - let mut result = 0; - for_tuples!( #( - result += SingleParaStoredHeaderDataBuilder::::supported_parachains(); - )* ); - result - } - - fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option { - for_tuples!( #( - let maybe_para_head = SingleParaStoredHeaderDataBuilder::::try_build(para_id, para_head); - if let Some(maybe_para_head) = maybe_para_head { - return Some(maybe_para_head); - } - )* ); - - None - } -} - -/// A minimized version of `pallet-bridge-parachains::Call` that can be used without a runtime. -#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] -#[allow(non_camel_case_types)] -pub enum BridgeParachainCall { - /// `pallet-bridge-parachains::Call::submit_parachain_heads` - #[codec(index = 0)] - submit_parachain_heads { - at_relay_block: (RelayBlockNumber, RelayBlockHash), - parachains: Vec<(ParaId, ParaHash)>, - parachain_heads_proof: ParaHeadsProof, - }, -} diff --git a/cumulus/bridges/primitives/polkadot-core/Cargo.toml b/cumulus/bridges/primitives/polkadot-core/Cargo.toml deleted file mode 100644 index b7ba48034738..000000000000 --- a/cumulus/bridges/primitives/polkadot-core/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "bp-polkadot-core" -description = "Primitives of Polkadot-like runtime." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -parity-util-mem = { version = "0.12.0", optional = true } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", optional = true, features = ["derive"] } - -# Bridge Dependencies - -bp-messages = { path = "../messages", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } - -# Substrate Based Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[dev-dependencies] -hex = "0.4" - -[features] -default = ["std"] -std = [ - "bp-messages/std", - "bp-runtime/std", - "frame-support/std", - "frame-system/std", - "codec/std", - "parity-util-mem", - "scale-info/std", - "serde", - "sp-core/std", - "sp-runtime/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/polkadot-core/src/lib.rs b/cumulus/bridges/primitives/polkadot-core/src/lib.rs deleted file mode 100644 index ffd48d8a3892..000000000000 --- a/cumulus/bridges/primitives/polkadot-core/src/lib.rs +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] - -use bp_messages::MessageNonce; -use bp_runtime::{Chain, EncodedOrDecodedCall, StorageMapKeyProvider}; -use frame_support::{ - dispatch::DispatchClass, - parameter_types, - weights::{ - constants::{BlockExecutionWeight, WEIGHT_REF_TIME_PER_SECOND}, - Weight, - }, - Blake2_128Concat, RuntimeDebug, -}; -use frame_system::limits; -use sp_core::{storage::StorageKey, Hasher as HasherT}; -use sp_runtime::{ - generic, - traits::{BlakeTwo256, IdentifyAccount, Verify}, - MultiAddress, MultiSignature, OpaqueExtrinsic, -}; -use sp_std::prelude::Vec; - -// Re-export's to avoid extra substrate dependencies in chain-specific crates. -pub use frame_support::{weights::constants::ExtrinsicBaseWeight, Parameter}; -pub use sp_runtime::{traits::Convert, Perbill}; - -pub mod parachains; - -/// Maximal number of GRANDPA authorities at Polkadot-like chains. -/// -/// Ideally, we would set it to the value of `MaxAuthorities` constant from bridged runtime -/// configurations. But right now it is set to the `100_000`, which makes PoV size for -/// our bridge hub parachains huge. So let's stick to the real-world value here. -/// -/// Right now both Kusama and Polkadot aim to have around 1000 validators. Let's be safe here and -/// take a bit more here. -pub const MAX_AUTHORITIES_COUNT: u32 = 1_256; - -/// Reasonable number of headers in the `votes_ancestries` on Polkadot-like chains. -/// -/// See [`bp-header-chain::ChainWithGrandpa`] for more details. -/// -/// This value comes from recent (February, 2023) Kusama and Polkadot headers. There are no -/// justifications with any additional headers in votes ancestry, so reasonable headers may -/// be set to zero. But we assume that there may be small GRANDPA lags, so we're leaving some -/// reserve here. -pub const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 2; - -/// Approximate average header size in `votes_ancestries` field of justification on Polkadot-like -/// chains. -/// -/// See [`bp-header-chain::ChainWithGrandpa`] for more details. -/// -/// This value comes from recent (February, 2023) Kusama headers. Average is `336` there, but some -/// non-mandatory headers has size `40kb` (they contain the BABE epoch descriptor with all -/// authorities - just like our mandatory header). Since we assume `2` headers in justification -/// votes ancestry, let's set average header to `40kb / 2`. -pub const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 = 20 * 1024; - -/// Approximate maximal header size on Polkadot-like chains. -/// -/// See [`bp-header-chain::ChainWithGrandpa`] for more details. -/// -/// This value comes from recent (February, 2023) Kusama headers. Maximal header is a mandatory -/// header. In its SCALE-encoded form it is `80348` bytes. Let's have some reserve here. -pub const MAX_HEADER_SIZE: u32 = 90_000; - -/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at -/// Polkadot-like chain. This mostly depends on number of entries in the storage trie. -/// Some reserve is reserved to account future chain growth. -/// -/// To compute this value, we've synced Kusama chain blocks [0; 6545733] to see if there were -/// any significant changes of the storage proof size (NO): -/// -/// - at block 3072 the storage proof size overhead was 579 bytes; -/// - at block 2479616 it was 578 bytes; -/// - at block 4118528 it was 711 bytes; -/// - at block 6540800 it was 779 bytes. -/// -/// The number of storage entries at the block 6546170 was 351207 and number of trie nodes in -/// the storage proof was 5 (log(16, 351207) ~ 4.6). -/// -/// So the assumption is that the storage proof size overhead won't be larger than 1024 in the -/// nearest future. If it'll ever break this barrier, then we'll need to update this constant -/// at next runtime upgrade. -pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; - -/// All Polkadot-like chains allow normal extrinsics to fill block up to 75 percent. -/// -/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); - -/// All Polkadot-like chains allow 2 seconds of compute with a 6-second average block time. -/// -/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. -pub const MAXIMUM_BLOCK_WEIGHT: Weight = - Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2), u64::MAX); - -/// All Polkadot-like chains assume that an on-initialize consumes 1 percent of the weight on -/// average, hence a single extrinsic will not be allowed to consume more than -/// `AvailableBlockRatio - 1 percent`. -/// -/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. -pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(1); - -parameter_types! { - /// All Polkadot-like chains have maximal block size set to 5MB. - /// - /// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. - pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( - 5 * 1024 * 1024, - NORMAL_DISPATCH_RATIO, - ); - /// All Polkadot-like chains have the same block weights. - /// - /// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. - pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have an extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT, - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); -} - -// TODO [#78] may need to be updated after https://github.com/paritytech/parity-bridges-common/issues/78 -/// Maximal number of messages in single delivery transaction. -pub const MAX_MESSAGES_IN_DELIVERY_TRANSACTION: MessageNonce = 128; - -/// Maximal number of bytes, included in the signed Polkadot-like transaction apart from the encoded -/// call itself. -/// -/// Can be computed by subtracting encoded call size from raw transaction size. -pub const TX_EXTRA_BYTES: u32 = 256; - -/// Re-export `time_units` to make usage easier. -pub use time_units::*; - -/// Human readable time units defined in terms of number of blocks. -pub mod time_units { - use super::BlockNumber; - - pub const MILLISECS_PER_BLOCK: u64 = 6000; - pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - - pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); - pub const HOURS: BlockNumber = MINUTES * 60; - pub const DAYS: BlockNumber = HOURS * 24; -} - -/// Block number type used in Polkadot-like chains. -pub type BlockNumber = u32; - -/// Hash type used in Polkadot-like chains. -pub type Hash = ::Out; - -/// Hashing type. -pub type Hashing = BlakeTwo256; - -/// The type of object that can produce hashes on Polkadot-like chains. -pub type Hasher = BlakeTwo256; - -/// The header type used by Polkadot-like chains. -pub type Header = generic::Header; - -/// Signature type used by Polkadot-like chains. -pub type Signature = MultiSignature; - -/// Public key of account on Polkadot-like chains. -pub type AccountPublic = ::Signer; - -/// Id of account on Polkadot-like chains. -pub type AccountId = ::AccountId; - -/// Address of account on Polkadot-like chains. -pub type AccountAddress = MultiAddress; - -/// Nonce of a transaction on the Polkadot-like chains. -pub type Nonce = u32; - -/// Block type of Polkadot-like chains. -pub type Block = generic::Block; - -/// Polkadot-like block signed with a Justification. -pub type SignedBlock = generic::SignedBlock; - -/// The balance of an account on Polkadot-like chain. -pub type Balance = u128; - -/// Unchecked Extrinsic type. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic, Signature, SignedExt>; - -/// Account address, used by the Polkadot-like chain. -pub type Address = MultiAddress; - -/// Polkadot-like chain. -#[derive(RuntimeDebug)] -pub struct PolkadotLike; - -impl Chain for PolkadotLike { - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hasher = Hasher; - type Header = Header; - - type AccountId = AccountId; - type Balance = Balance; - type Nonce = Nonce; - type Signature = Signature; - - fn max_extrinsic_size() -> u32 { - *BlockLength::get().max.get(DispatchClass::Normal) - } - - fn max_extrinsic_weight() -> Weight { - BlockWeights::get() - .get(DispatchClass::Normal) - .max_extrinsic - .unwrap_or(Weight::MAX) - } -} - -/// Provides a storage key for account data. -/// -/// We need to use this approach when we don't have access to the runtime. -/// The equivalent command to invoke in case full `Runtime` is known is this: -/// `let key = frame_system::Account::::storage_map_final_key(&account_id);` -pub struct AccountInfoStorageMapKeyProvider; - -impl StorageMapKeyProvider for AccountInfoStorageMapKeyProvider { - const MAP_NAME: &'static str = "Account"; - type Hasher = Blake2_128Concat; - type Key = AccountId; - // This should actually be `AccountInfo`, but we don't use this property in order to decode the - // data. So we use `Vec` as if we would work with encoded data. - type Value = Vec; -} - -impl AccountInfoStorageMapKeyProvider { - const PALLET_NAME: &'static str = "System"; - - pub fn final_key(id: &AccountId) -> StorageKey { - ::final_key(Self::PALLET_NAME, id) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn should_generate_storage_key() { - let acc = [ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, - ] - .into(); - let key = AccountInfoStorageMapKeyProvider::final_key(&acc); - assert_eq!(hex::encode(key), "26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92dccd599abfe1920a1cff8a7358231430102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"); - } -} diff --git a/cumulus/bridges/primitives/polkadot-core/src/parachains.rs b/cumulus/bridges/primitives/polkadot-core/src/parachains.rs deleted file mode 100644 index 9cac3279c728..000000000000 --- a/cumulus/bridges/primitives/polkadot-core/src/parachains.rs +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Primitives of polkadot-like chains, that are related to parachains functionality. -//! -//! Even though this (bridges) repository references polkadot repository, we can't -//! reference polkadot crates from pallets. That's because bridges repository is -//! included in the Cumulus repository and included pallets are used by Cumulus -//! parachains. Having pallets that are referencing polkadot, would mean that there may -//! be two versions of polkadot crates included in the runtime. Which is bad. - -use bp_runtime::{RawStorageProof, Size}; -use codec::{CompactAs, Decode, Encode, MaxEncodedLen}; -use frame_support::RuntimeDebug; -use scale_info::TypeInfo; -use sp_core::Hasher; -use sp_std::vec::Vec; - -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; - -#[cfg(feature = "std")] -use parity_util_mem::MallocSizeOf; - -/// Parachain id. -/// -/// This is an equivalent of the `polkadot_parachain::Id`, which is a compact-encoded `u32`. -#[derive( - Clone, - CompactAs, - Copy, - Decode, - Default, - Encode, - Eq, - Hash, - MaxEncodedLen, - Ord, - PartialEq, - PartialOrd, - RuntimeDebug, - TypeInfo, -)] -pub struct ParaId(pub u32); - -impl From for ParaId { - fn from(id: u32) -> Self { - ParaId(id) - } -} - -/// Parachain head. -/// -/// This is an equivalent of the `polkadot_parachain::HeadData`. -/// -/// The parachain head means (at least in Cumulus) a SCALE-encoded parachain header. -#[derive( - PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo, Default, -)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash, MallocSizeOf))] -pub struct ParaHead(pub Vec); - -impl ParaHead { - /// Returns the hash of this head data. - pub fn hash(&self) -> crate::Hash { - sp_runtime::traits::BlakeTwo256::hash(&self.0) - } -} - -/// Parachain head hash. -pub type ParaHash = crate::Hash; - -/// Parachain head hasher. -pub type ParaHasher = crate::Hasher; - -/// Raw storage proof of parachain heads, stored in polkadot-like chain runtime. -#[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] -pub struct ParaHeadsProof(pub RawStorageProof); - -impl Size for ParaHeadsProof { - fn size(&self) -> u32 { - u32::try_from(self.0.iter().fold(0usize, |sum, node| sum.saturating_add(node.len()))) - .unwrap_or(u32::MAX) - } -} diff --git a/cumulus/bridges/primitives/relayers/Cargo.toml b/cumulus/bridges/primitives/relayers/Cargo.toml deleted file mode 100644 index fd2c9e19f984..000000000000 --- a/cumulus/bridges/primitives/relayers/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "bp-relayers" -description = "Primitives of relayers module." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "bit-vec"] } -scale-info = { version = "2.9.0", default-features = false, features = ["bit-vec", "derive"] } - -# Bridge Dependencies - -bp-messages = { path = "../messages", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } - -# Substrate Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[dev-dependencies] -hex = "0.4" -hex-literal = "0.4" - -[features] -default = ["std"] -std = [ - "bp-messages/std", - "bp-runtime/std", - "frame-support/std", - "sp-runtime/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/relayers/src/lib.rs b/cumulus/bridges/primitives/relayers/src/lib.rs deleted file mode 100644 index 21f66a2ffa10..000000000000 --- a/cumulus/bridges/primitives/relayers/src/lib.rs +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Primitives of messages module. - -#![warn(missing_docs)] -#![cfg_attr(not(feature = "std"), no_std)] - -pub use registration::{Registration, StakeAndSlash}; - -use bp_messages::LaneId; -use bp_runtime::{ChainId, StorageDoubleMapKeyProvider}; -use frame_support::{traits::tokens::Preservation, Blake2_128Concat, Identity}; -use scale_info::TypeInfo; -use sp_runtime::{ - codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}, - traits::AccountIdConversion, - TypeId, -}; -use sp_std::{fmt::Debug, marker::PhantomData}; - -mod registration; - -/// The owner of the sovereign account that should pay the rewards. -/// -/// Each of the 2 final points connected by a bridge owns a sovereign account at each end of the -/// bridge. So here, at this end of the bridge there can be 2 sovereign accounts that pay rewards. -#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] -pub enum RewardsAccountOwner { - /// The sovereign account of the final chain on this end of the bridge. - ThisChain, - /// The sovereign account of the final chain on the other end of the bridge. - BridgedChain, -} - -/// Structure used to identify the account that pays a reward to the relayer. -/// -/// A bridge connects 2 bridge ends. Each one is located on a separate relay chain. The bridge ends -/// can be the final destinations of the bridge, or they can be intermediary points -/// (e.g. a bridge hub) used to forward messages between pairs of parachains on the bridged relay -/// chains. A pair of such parachains is connected using a bridge lane. Each of the 2 final -/// destinations of a bridge lane must have a sovereign account at each end of the bridge and each -/// of the sovereign accounts will pay rewards for different operations. So we need multiple -/// parameters to identify the account that pays a reward to the relayer. -#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] -pub struct RewardsAccountParams { - lane_id: LaneId, - bridged_chain_id: ChainId, - owner: RewardsAccountOwner, -} - -impl RewardsAccountParams { - /// Create a new instance of `RewardsAccountParams`. - pub const fn new( - lane_id: LaneId, - bridged_chain_id: ChainId, - owner: RewardsAccountOwner, - ) -> Self { - Self { lane_id, bridged_chain_id, owner } - } -} - -impl TypeId for RewardsAccountParams { - const TYPE_ID: [u8; 4] = *b"brap"; -} - -/// Reward payment procedure. -pub trait PaymentProcedure { - /// Error that may be returned by the procedure. - type Error: Debug; - - /// Pay reward to the relayer from the account with provided params. - fn pay_reward( - relayer: &Relayer, - rewards_account_params: RewardsAccountParams, - reward: Reward, - ) -> Result<(), Self::Error>; -} - -impl PaymentProcedure for () { - type Error = &'static str; - - fn pay_reward(_: &Relayer, _: RewardsAccountParams, _: Reward) -> Result<(), Self::Error> { - Ok(()) - } -} - -/// Reward payment procedure that does `balances::transfer` call from the account, derived from -/// given params. -pub struct PayRewardFromAccount(PhantomData<(T, Relayer)>); - -impl PayRewardFromAccount -where - Relayer: Decode + Encode, -{ - /// Return account that pays rewards based on the provided parameters. - pub fn rewards_account(params: RewardsAccountParams) -> Relayer { - params.into_sub_account_truncating(b"rewards-account") - } -} - -impl PaymentProcedure for PayRewardFromAccount -where - T: frame_support::traits::fungible::Mutate, - Relayer: Decode + Encode, -{ - type Error = sp_runtime::DispatchError; - - fn pay_reward( - relayer: &Relayer, - rewards_account_params: RewardsAccountParams, - reward: T::Balance, - ) -> Result<(), Self::Error> { - T::transfer( - &Self::rewards_account(rewards_account_params), - relayer, - reward, - Preservation::Expendable, - ) - .map(drop) - } -} - -/// Can be use to access the runtime storage key within the `RelayerRewards` map of the relayers -/// pallet. -pub struct RelayerRewardsKeyProvider(PhantomData<(AccountId, Reward)>); - -impl StorageDoubleMapKeyProvider for RelayerRewardsKeyProvider -where - AccountId: Codec + EncodeLike, - Reward: Codec + EncodeLike, -{ - const MAP_NAME: &'static str = "RelayerRewards"; - - type Hasher1 = Blake2_128Concat; - type Key1 = AccountId; - type Hasher2 = Identity; - type Key2 = RewardsAccountParams; - type Value = Reward; -} - -#[cfg(test)] -mod tests { - use super::*; - use bp_messages::LaneId; - use sp_runtime::testing::H256; - - #[test] - fn different_lanes_are_using_different_accounts() { - assert_eq!( - PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( - LaneId([0, 0, 0, 0]), - *b"test", - RewardsAccountOwner::ThisChain - )), - hex_literal::hex!("62726170000000007465737400726577617264732d6163636f756e7400000000") - .into(), - ); - - assert_eq!( - PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( - LaneId([0, 0, 0, 1]), - *b"test", - RewardsAccountOwner::ThisChain - )), - hex_literal::hex!("62726170000000017465737400726577617264732d6163636f756e7400000000") - .into(), - ); - } - - #[test] - fn different_directions_are_using_different_accounts() { - assert_eq!( - PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( - LaneId([0, 0, 0, 0]), - *b"test", - RewardsAccountOwner::ThisChain - )), - hex_literal::hex!("62726170000000007465737400726577617264732d6163636f756e7400000000") - .into(), - ); - - assert_eq!( - PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( - LaneId([0, 0, 0, 0]), - *b"test", - RewardsAccountOwner::BridgedChain - )), - hex_literal::hex!("62726170000000007465737401726577617264732d6163636f756e7400000000") - .into(), - ); - } -} diff --git a/cumulus/bridges/primitives/runtime/Cargo.toml b/cumulus/bridges/primitives/runtime/Cargo.toml deleted file mode 100644 index dea3c979b862..000000000000 --- a/cumulus/bridges/primitives/runtime/Cargo.toml +++ /dev/null @@ -1,49 +0,0 @@ -[package] -name = "bp-runtime" -description = "Primitives that may be used at (bridges) runtime level." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -hash-db = { version = "0.16.0", default-features = false } -impl-trait-for-tuples = "0.2.2" -num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } - -# Substrate Dependencies - -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, features = ["serde"] } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -trie-db = { version = "0.27.1", default-features = false } - -[dev-dependencies] -hex-literal = "0.4" - -[features] -default = ["std"] -std = [ - "codec/std", - "frame-support/std", - "frame-system/std", - "hash-db/std", - "num-traits/std", - "scale-info/std", - "serde/std", - "sp-core/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "sp-state-machine/std", - "sp-trie/std", - "trie-db/std", -] diff --git a/cumulus/bridges/primitives/runtime/src/chain.rs b/cumulus/bridges/primitives/runtime/src/chain.rs deleted file mode 100644 index 43fdaf8da1b7..000000000000 --- a/cumulus/bridges/primitives/runtime/src/chain.rs +++ /dev/null @@ -1,400 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -use crate::HeaderIdProvider; -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{weights::Weight, Parameter}; -use num_traits::{AsPrimitive, Bounded, CheckedSub, Saturating, SaturatingAdd, Zero}; -use sp_runtime::{ - traits::{ - AtLeast32Bit, AtLeast32BitUnsigned, Hash as HashT, Header as HeaderT, MaybeDisplay, - MaybeSerialize, MaybeSerializeDeserialize, Member, SimpleBitOps, Verify, - }, - FixedPointOperand, -}; -use sp_std::{convert::TryFrom, fmt::Debug, hash::Hash, str::FromStr, vec, vec::Vec}; - -/// Chain call, that is either SCALE-encoded, or decoded. -#[derive(Debug, Clone, PartialEq)] -pub enum EncodedOrDecodedCall { - /// The call that is SCALE-encoded. - /// - /// This variant is used when we the chain runtime is not bundled with the relay, but - /// we still need the represent call in some RPC calls or transactions. - Encoded(Vec), - /// The decoded call. - Decoded(ChainCall), -} - -impl EncodedOrDecodedCall { - /// Returns decoded call. - pub fn to_decoded(&self) -> Result { - match self { - Self::Encoded(ref encoded_call) => - ChainCall::decode(&mut &encoded_call[..]).map_err(Into::into), - Self::Decoded(ref decoded_call) => Ok(decoded_call.clone()), - } - } - - /// Converts self to decoded call. - pub fn into_decoded(self) -> Result { - match self { - Self::Encoded(encoded_call) => - ChainCall::decode(&mut &encoded_call[..]).map_err(Into::into), - Self::Decoded(decoded_call) => Ok(decoded_call), - } - } -} - -impl From for EncodedOrDecodedCall { - fn from(call: ChainCall) -> EncodedOrDecodedCall { - EncodedOrDecodedCall::Decoded(call) - } -} - -impl Decode for EncodedOrDecodedCall { - fn decode(input: &mut I) -> Result { - // having encoded version is better than decoded, because decoding isn't required - // everywhere and for mocked calls it may lead to **unneeded** errors - match input.remaining_len()? { - Some(remaining_len) => { - let mut encoded_call = vec![0u8; remaining_len]; - input.read(&mut encoded_call)?; - Ok(EncodedOrDecodedCall::Encoded(encoded_call)) - }, - None => Ok(EncodedOrDecodedCall::Decoded(ChainCall::decode(input)?)), - } - } -} - -impl Encode for EncodedOrDecodedCall { - fn encode(&self) -> Vec { - match *self { - Self::Encoded(ref encoded_call) => encoded_call.clone(), - Self::Decoded(ref decoded_call) => decoded_call.encode(), - } - } -} - -/// Minimal Substrate-based chain representation that may be used from no_std environment. -pub trait Chain: Send + Sync + 'static { - /// A type that fulfills the abstract idea of what a Substrate block number is. - // Constraits come from the associated Number type of `sp_runtime::traits::Header` - // See here for more info: - // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Number - // - // Note that the `AsPrimitive` trait is required by the GRANDPA justification - // verifier, and is not usually part of a Substrate Header's Number type. - type BlockNumber: Parameter - + Member - + MaybeSerializeDeserialize - + Hash - + Copy - + Default - + MaybeDisplay - + AtLeast32BitUnsigned - + FromStr - + AsPrimitive - + Default - + Saturating - + MaxEncodedLen; - - /// A type that fulfills the abstract idea of what a Substrate hash is. - // Constraits come from the associated Hash type of `sp_runtime::traits::Header` - // See here for more info: - // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hash - type Hash: Parameter - + Member - + MaybeSerializeDeserialize - + Hash - + Ord - + Copy - + MaybeDisplay - + Default - + SimpleBitOps - + AsRef<[u8]> - + AsMut<[u8]> - + MaxEncodedLen; - - /// A type that fulfills the abstract idea of what a Substrate hasher (a type - /// that produces hashes) is. - // Constraits come from the associated Hashing type of `sp_runtime::traits::Header` - // See here for more info: - // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hashing - type Hasher: HashT; - - /// A type that fulfills the abstract idea of what a Substrate header is. - // See here for more info: - // https://crates.parity.io/sp_runtime/traits/trait.Header.html - type Header: Parameter - + HeaderT - + HeaderIdProvider - + MaybeSerializeDeserialize; - - /// The user account identifier type for the runtime. - type AccountId: Parameter - + Member - + MaybeSerializeDeserialize - + Debug - + MaybeDisplay - + Ord - + MaxEncodedLen; - /// Balance of an account in native tokens. - /// - /// The chain may support multiple tokens, but this particular type is for token that is used - /// to pay for transaction dispatch, to reward different relayers (headers, messages), etc. - type Balance: AtLeast32BitUnsigned - + FixedPointOperand - + Parameter - + Member - + MaybeSerializeDeserialize - + Clone - + Copy - + Bounded - + CheckedSub - + PartialOrd - + SaturatingAdd - + Zero - + TryFrom - + MaxEncodedLen; - /// Nonce of a transaction used by the chain. - type Nonce: Parameter - + Member - + MaybeSerialize - + Debug - + Default - + MaybeDisplay - + MaybeSerializeDeserialize - + AtLeast32Bit - + Copy - + MaxEncodedLen; - /// Signature type, used on this chain. - type Signature: Parameter + Verify; - - /// Get the maximum size (in bytes) of a Normal extrinsic at this chain. - fn max_extrinsic_size() -> u32; - /// Get the maximum weight (compute time) that a Normal extrinsic at this chain can use. - fn max_extrinsic_weight() -> Weight; -} - -/// A trait that provides the type of the underlying chain. -pub trait UnderlyingChainProvider { - /// Underlying chain type. - type Chain: Chain; -} - -impl Chain for T -where - T: Send + Sync + 'static + UnderlyingChainProvider, -{ - type BlockNumber = ::BlockNumber; - type Hash = ::Hash; - type Hasher = ::Hasher; - type Header = ::Header; - type AccountId = ::AccountId; - type Balance = ::Balance; - type Nonce = ::Nonce; - type Signature = ::Signature; - - fn max_extrinsic_size() -> u32 { - ::max_extrinsic_size() - } - - fn max_extrinsic_weight() -> Weight { - ::max_extrinsic_weight() - } -} - -/// Minimal parachain representation that may be used from no_std environment. -pub trait Parachain: Chain { - /// Parachain identifier. - const PARACHAIN_ID: u32; -} - -impl Parachain for T -where - T: Chain + UnderlyingChainProvider, - ::Chain: Parachain, -{ - const PARACHAIN_ID: u32 = <::Chain as Parachain>::PARACHAIN_ID; -} - -/// Adapter for `Get` to access `PARACHAIN_ID` from `trait Parachain` -pub struct ParachainIdOf(sp_std::marker::PhantomData); -impl frame_support::traits::Get for ParachainIdOf { - fn get() -> u32 { - Para::PARACHAIN_ID - } -} - -/// Underlying chain type. -pub type UnderlyingChainOf = ::Chain; - -/// Block number used by the chain. -pub type BlockNumberOf = ::BlockNumber; - -/// Hash type used by the chain. -pub type HashOf = ::Hash; - -/// Hasher type used by the chain. -pub type HasherOf = ::Hasher; - -/// Header type used by the chain. -pub type HeaderOf = ::Header; - -/// Account id type used by the chain. -pub type AccountIdOf = ::AccountId; - -/// Balance type used by the chain. -pub type BalanceOf = ::Balance; - -/// Transaction nonce type used by the chain. -pub type NonceOf = ::Nonce; - -/// Signature type used by the chain. -pub type SignatureOf = ::Signature; - -/// Account public type used by the chain. -pub type AccountPublicOf = as Verify>::Signer; - -/// Transaction era used by the chain. -pub type TransactionEraOf = crate::TransactionEra, HashOf>; - -/// Convenience macro that declares bridge finality runtime apis and related constants for a chain. -/// This includes: -/// - chain-specific bridge runtime APIs: -/// - `FinalityApi` -/// - constants that are stringified names of runtime API methods: -/// - `BEST_FINALIZED__HEADER_METHOD` -/// - `_ACCEPTED__FINALITY_PROOFS_METHOD` -/// The name of the chain has to be specified in snake case (e.g. `rialto_parachain`). -#[macro_export] -macro_rules! decl_bridge_finality_runtime_apis { - ($chain: ident $(, $consensus: ident => $justification_type: ty)?) => { - bp_runtime::paste::item! { - mod [<$chain _finality_api>] { - use super::*; - - /// Name of the `FinalityApi::best_finalized` runtime method. - pub const []: &str = - stringify!([<$chain:camel FinalityApi_best_finalized>]); - - $( - /// Name of the `FinalityApi::accepted__finality_proofs` - /// runtime method. - pub const [<$chain:upper _SYNCED_HEADERS_ $consensus:upper _INFO_METHOD>]: &str = - stringify!([<$chain:camel FinalityApi_synced_headers_ $consensus:lower _info>]); - )? - - sp_api::decl_runtime_apis! { - /// API for querying information about the finalized chain headers. - /// - /// This API is implemented by runtimes that are receiving messages from this chain, not by this - /// chain's runtime itself. - pub trait [<$chain:camel FinalityApi>] { - /// Returns number and hash of the best finalized header known to the bridge module. - fn best_finalized() -> Option>; - - $( - /// Returns the justifications accepted in the current block. - fn []( - ) -> Vec<$justification_type>; - )? - } - } - } - - pub use [<$chain _finality_api>]::*; - } - }; - ($chain: ident, grandpa) => { - decl_bridge_finality_runtime_apis!($chain, grandpa => bp_header_chain::StoredHeaderGrandpaInfo
); - }; -} - -/// Convenience macro that declares bridge messages runtime apis and related constants for a chain. -/// This includes: -/// - chain-specific bridge runtime APIs: -/// - `ToOutboundLaneApi` -/// - `FromInboundLaneApi` -/// - constants that are stringified names of runtime API methods: -/// - `FROM__MESSAGE_DETAILS_METHOD`, -/// The name of the chain has to be specified in snake case (e.g. `rialto_parachain`). -#[macro_export] -macro_rules! decl_bridge_messages_runtime_apis { - ($chain: ident) => { - bp_runtime::paste::item! { - mod [<$chain _messages_api>] { - use super::*; - - /// Name of the `ToOutboundLaneApi::message_details` runtime method. - pub const []: &str = - stringify!([]); - - /// Name of the `FromInboundLaneApi::message_details` runtime method. - pub const []: &str = - stringify!([]); - - sp_api::decl_runtime_apis! { - /// Outbound message lane API for messages that are sent to this chain. - /// - /// This API is implemented by runtimes that are receiving messages from this chain, not by this - /// chain's runtime itself. - pub trait [] { - /// Returns dispatch weight, encoded payload size and delivery+dispatch fee of all - /// messages in given inclusive range. - /// - /// If some (or all) messages are missing from the storage, they'll also will - /// be missing from the resulting vector. The vector is ordered by the nonce. - fn message_details( - lane: LaneId, - begin: MessageNonce, - end: MessageNonce, - ) -> Vec; - } - - /// Inbound message lane API for messages sent by this chain. - /// - /// This API is implemented by runtimes that are receiving messages from this chain, not by this - /// chain's runtime itself. - /// - /// Entries of the resulting vector are matching entries of the `messages` vector. Entries of the - /// `messages` vector may (and need to) be read using `ToOutboundLaneApi::message_details`. - pub trait [] { - /// Return details of given inbound messages. - fn message_details( - lane: LaneId, - messages: Vec<(MessagePayload, OutboundMessageDetails)>, - ) -> Vec; - } - } - } - - pub use [<$chain _messages_api>]::*; - } - }; -} - -/// Convenience macro that declares bridge finality runtime apis, bridge messages runtime apis -/// and related constants for a chain. -/// The name of the chain has to be specified in snake case (e.g. `rialto_parachain`). -#[macro_export] -macro_rules! decl_bridge_runtime_apis { - ($chain: ident $(, $consensus: ident)?) => { - bp_runtime::decl_bridge_finality_runtime_apis!($chain $(, $consensus)?); - bp_runtime::decl_bridge_messages_runtime_apis!($chain); - }; -} diff --git a/cumulus/bridges/primitives/runtime/src/lib.rs b/cumulus/bridges/primitives/runtime/src/lib.rs deleted file mode 100644 index 150e015cb4f1..000000000000 --- a/cumulus/bridges/primitives/runtime/src/lib.rs +++ /dev/null @@ -1,595 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Primitives that may be used at (bridges) runtime level. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, Encode, FullCodec, MaxEncodedLen}; -use frame_support::{ - log, pallet_prelude::DispatchResult, weights::Weight, PalletError, RuntimeDebug, StorageHasher, - StorageValue, -}; -use frame_system::RawOrigin; -use scale_info::TypeInfo; -use serde::{Deserialize, Serialize}; -use sp_core::storage::StorageKey; -use sp_runtime::traits::{BadOrigin, Header as HeaderT, UniqueSaturatedInto}; -use sp_std::{convert::TryFrom, fmt::Debug, ops::RangeInclusive, vec, vec::Vec}; - -pub use chain::{ - AccountIdOf, AccountPublicOf, BalanceOf, BlockNumberOf, Chain, EncodedOrDecodedCall, HashOf, - HasherOf, HeaderOf, NonceOf, Parachain, ParachainIdOf, SignatureOf, TransactionEraOf, - UnderlyingChainOf, UnderlyingChainProvider, -}; -pub use frame_support::storage::storage_prefix as storage_value_final_key; -use num_traits::{CheckedAdd, CheckedSub, One, SaturatingAdd, Zero}; -pub use storage_proof::{ - record_all_keys as record_all_trie_keys, Error as StorageProofError, - ProofSize as StorageProofSize, RawStorageProof, StorageProofChecker, -}; -pub use storage_types::BoundedStorageValue; - -#[cfg(feature = "std")] -pub use storage_proof::craft_valid_storage_proof; - -pub mod extensions; -pub mod messages; - -mod chain; -mod storage_proof; -mod storage_types; - -// Re-export macro to aviod include paste dependency everywhere -pub use sp_runtime::paste; - -/// Use this when something must be shared among all instances. -pub const NO_INSTANCE_ID: ChainId = [0, 0, 0, 0]; - -/// Rialto chain id. -pub const RIALTO_CHAIN_ID: ChainId = *b"rlto"; - -/// RialtoParachain chain id. -pub const RIALTO_PARACHAIN_CHAIN_ID: ChainId = *b"rlpa"; - -/// Millau chain id. -pub const MILLAU_CHAIN_ID: ChainId = *b"mlau"; - -/// Polkadot chain id. -pub const POLKADOT_CHAIN_ID: ChainId = *b"pdot"; - -/// Kusama chain id. -pub const KUSAMA_CHAIN_ID: ChainId = *b"ksma"; - -/// Westend chain id. -pub const WESTEND_CHAIN_ID: ChainId = *b"wend"; - -/// `AssetHubWestmint` chain id. -pub const ASSET_HUB_WESTEND_CHAIN_ID: ChainId = *b"ahwe"; - -/// Rococo chain id. -pub const ROCOCO_CHAIN_ID: ChainId = *b"roco"; - -/// Wococo chain id. -pub const WOCOCO_CHAIN_ID: ChainId = *b"woco"; - -/// BridgeHubRococo chain id. -pub const BRIDGE_HUB_ROCOCO_CHAIN_ID: ChainId = *b"bhro"; - -/// BridgeHubWococo chain id. -pub const BRIDGE_HUB_WOCOCO_CHAIN_ID: ChainId = *b"bhwo"; - -/// BridgeHubKusama chain id. -pub const BRIDGE_HUB_KUSAMA_CHAIN_ID: ChainId = *b"bhks"; - -/// BridgeHubPolkadot chain id. -pub const BRIDGE_HUB_POLKADOT_CHAIN_ID: ChainId = *b"bhpd"; - -/// Generic header Id. -#[derive( - RuntimeDebug, - Default, - Clone, - Encode, - Decode, - Copy, - Eq, - Hash, - MaxEncodedLen, - PartialEq, - PartialOrd, - Ord, - TypeInfo, -)] -pub struct HeaderId(pub Number, pub Hash); - -impl HeaderId { - /// Return header number. - pub fn number(&self) -> Number { - self.0 - } - - /// Return header hash. - pub fn hash(&self) -> Hash { - self.1 - } -} - -/// Header id used by the chain. -pub type HeaderIdOf = HeaderId, BlockNumberOf>; - -/// Generic header id provider. -pub trait HeaderIdProvider { - // Get the header id. - fn id(&self) -> HeaderId; - - // Get the header id for the parent block. - fn parent_id(&self) -> Option>; -} - -impl HeaderIdProvider
for Header { - fn id(&self) -> HeaderId { - HeaderId(*self.number(), self.hash()) - } - - fn parent_id(&self) -> Option> { - self.number() - .checked_sub(&One::one()) - .map(|parent_number| HeaderId(parent_number, *self.parent_hash())) - } -} - -/// Unique identifier of the chain. -/// -/// In addition to its main function (identifying the chain), this type may also be used to -/// identify module instance. We have a bunch of pallets that may be used in different bridges. E.g. -/// messages pallet may be deployed twice in the same runtime to bridge ThisChain with Chain1 and -/// Chain2. Sometimes we need to be able to identify deployed instance dynamically. This type may be -/// used for that. -pub type ChainId = [u8; 4]; - -/// Anything that has size. -pub trait Size { - /// Return size of this object (in bytes). - fn size(&self) -> u32; -} - -impl Size for () { - fn size(&self) -> u32 { - 0 - } -} - -impl Size for Vec { - fn size(&self) -> u32 { - self.len() as _ - } -} - -/// Pre-computed size. -pub struct PreComputedSize(pub usize); - -impl Size for PreComputedSize { - fn size(&self) -> u32 { - u32::try_from(self.0).unwrap_or(u32::MAX) - } -} - -/// Era of specific transaction. -#[derive(RuntimeDebug, Clone, Copy, PartialEq)] -pub enum TransactionEra { - /// Transaction is immortal. - Immortal, - /// Transaction is valid for a given number of blocks, starting from given block. - Mortal(HeaderId, u32), -} - -impl, BlockHash: Copy> - TransactionEra -{ - /// Prepare transaction era, based on mortality period and current best block number. - pub fn new( - best_block_id: HeaderId, - mortality_period: Option, - ) -> Self { - mortality_period - .map(|mortality_period| TransactionEra::Mortal(best_block_id, mortality_period)) - .unwrap_or(TransactionEra::Immortal) - } - - /// Create new immortal transaction era. - pub fn immortal() -> Self { - TransactionEra::Immortal - } - - /// Returns mortality period if transaction is mortal. - pub fn mortality_period(&self) -> Option { - match *self { - TransactionEra::Immortal => None, - TransactionEra::Mortal(_, period) => Some(period), - } - } - - /// Returns era that is used by FRAME-based runtimes. - pub fn frame_era(&self) -> sp_runtime::generic::Era { - match *self { - TransactionEra::Immortal => sp_runtime::generic::Era::immortal(), - // `unique_saturated_into` is fine here - mortality `u64::MAX` is not something we - // expect to see on any chain - TransactionEra::Mortal(header_id, period) => - sp_runtime::generic::Era::mortal(period as _, header_id.0.unique_saturated_into()), - } - } - - /// Returns header hash that needs to be included in the signature payload. - pub fn signed_payload(&self, genesis_hash: BlockHash) -> BlockHash { - match *self { - TransactionEra::Immortal => genesis_hash, - TransactionEra::Mortal(header_id, _) => header_id.1, - } - } -} - -/// This is a copy of the -/// `frame_support::storage::generator::StorageMap::storage_map_final_key` for maps based -/// on selected hasher. -/// -/// We're using it because to call `storage_map_final_key` directly, we need access to the runtime -/// and pallet instance, which (sometimes) is impossible. -pub fn storage_map_final_key( - pallet_prefix: &str, - map_name: &str, - key: &[u8], -) -> StorageKey { - let key_hashed = H::hash(key); - let pallet_prefix_hashed = frame_support::Twox128::hash(pallet_prefix.as_bytes()); - let storage_prefix_hashed = frame_support::Twox128::hash(map_name.as_bytes()); - - let mut final_key = Vec::with_capacity( - pallet_prefix_hashed.len() + storage_prefix_hashed.len() + key_hashed.as_ref().len(), - ); - - final_key.extend_from_slice(&pallet_prefix_hashed[..]); - final_key.extend_from_slice(&storage_prefix_hashed[..]); - final_key.extend_from_slice(key_hashed.as_ref()); - - StorageKey(final_key) -} - -/// This is how a storage key of storage parameter (`parameter_types! { storage Param: bool = false; -/// }`) is computed. -/// -/// Copied from `frame_support::parameter_types` macro. -pub fn storage_parameter_key(parameter_name: &str) -> StorageKey { - let mut buffer = Vec::with_capacity(1 + parameter_name.len() + 1); - buffer.push(b':'); - buffer.extend_from_slice(parameter_name.as_bytes()); - buffer.push(b':'); - StorageKey(sp_io::hashing::twox_128(&buffer).to_vec()) -} - -/// This is how a storage key of storage value is computed. -/// -/// Copied from `frame_support::storage::storage_prefix`. -pub fn storage_value_key(pallet_prefix: &str, value_name: &str) -> StorageKey { - let pallet_hash = sp_io::hashing::twox_128(pallet_prefix.as_bytes()); - let storage_hash = sp_io::hashing::twox_128(value_name.as_bytes()); - - let mut final_key = vec![0u8; 32]; - final_key[..16].copy_from_slice(&pallet_hash); - final_key[16..].copy_from_slice(&storage_hash); - - StorageKey(final_key) -} - -/// Can be use to access the runtime storage key of a `StorageMap`. -pub trait StorageMapKeyProvider { - /// The name of the variable that holds the `StorageMap`. - const MAP_NAME: &'static str; - - /// The same as `StorageMap::Hasher1`. - type Hasher: StorageHasher; - /// The same as `StorageMap::Key1`. - type Key: FullCodec; - /// The same as `StorageMap::Value`. - type Value: FullCodec; - - /// This is a copy of the - /// `frame_support::storage::generator::StorageMap::storage_map_final_key`. - /// - /// We're using it because to call `storage_map_final_key` directly, we need access - /// to the runtime and pallet instance, which (sometimes) is impossible. - fn final_key(pallet_prefix: &str, key: &Self::Key) -> StorageKey { - storage_map_final_key::(pallet_prefix, Self::MAP_NAME, &key.encode()) - } -} - -/// Can be use to access the runtime storage key of a `StorageDoubleMap`. -pub trait StorageDoubleMapKeyProvider { - /// The name of the variable that holds the `StorageDoubleMap`. - const MAP_NAME: &'static str; - - /// The same as `StorageDoubleMap::Hasher1`. - type Hasher1: StorageHasher; - /// The same as `StorageDoubleMap::Key1`. - type Key1: FullCodec; - /// The same as `StorageDoubleMap::Hasher2`. - type Hasher2: StorageHasher; - /// The same as `StorageDoubleMap::Key2`. - type Key2: FullCodec; - /// The same as `StorageDoubleMap::Value`. - type Value: FullCodec; - - /// This is a copy of the - /// `frame_support::storage::generator::StorageDoubleMap::storage_double_map_final_key`. - /// - /// We're using it because to call `storage_double_map_final_key` directly, we need access - /// to the runtime and pallet instance, which (sometimes) is impossible. - fn final_key(pallet_prefix: &str, key1: &Self::Key1, key2: &Self::Key2) -> StorageKey { - let key1_hashed = Self::Hasher1::hash(&key1.encode()); - let key2_hashed = Self::Hasher2::hash(&key2.encode()); - let pallet_prefix_hashed = frame_support::Twox128::hash(pallet_prefix.as_bytes()); - let storage_prefix_hashed = frame_support::Twox128::hash(Self::MAP_NAME.as_bytes()); - - let mut final_key = Vec::with_capacity( - pallet_prefix_hashed.len() + - storage_prefix_hashed.len() + - key1_hashed.as_ref().len() + - key2_hashed.as_ref().len(), - ); - - final_key.extend_from_slice(&pallet_prefix_hashed[..]); - final_key.extend_from_slice(&storage_prefix_hashed[..]); - final_key.extend_from_slice(key1_hashed.as_ref()); - final_key.extend_from_slice(key2_hashed.as_ref()); - - StorageKey(final_key) - } -} - -/// Error generated by the `OwnedBridgeModule` trait. -#[derive(Encode, Decode, TypeInfo, PalletError)] -pub enum OwnedBridgeModuleError { - /// All pallet operations are halted. - Halted, -} - -/// Operating mode for a bridge module. -pub trait OperatingMode: Send + Copy + Debug + FullCodec { - // Returns true if the bridge module is halted. - fn is_halted(&self) -> bool; -} - -/// Basic operating modes for a bridges module (Normal/Halted). -#[derive( - Encode, - Decode, - Clone, - Copy, - PartialEq, - Eq, - RuntimeDebug, - TypeInfo, - MaxEncodedLen, - Serialize, - Deserialize, -)] -pub enum BasicOperatingMode { - /// Normal mode, when all operations are allowed. - Normal, - /// The pallet is halted. All operations (except operating mode change) are prohibited. - Halted, -} - -impl Default for BasicOperatingMode { - fn default() -> Self { - Self::Normal - } -} - -impl OperatingMode for BasicOperatingMode { - fn is_halted(&self) -> bool { - *self == BasicOperatingMode::Halted - } -} - -/// Bridge module that has owner and operating mode -pub trait OwnedBridgeModule { - /// The target that will be used when publishing logs related to this module. - const LOG_TARGET: &'static str; - - type OwnerStorage: StorageValue>; - type OperatingMode: OperatingMode; - type OperatingModeStorage: StorageValue; - - /// Check if the module is halted. - fn is_halted() -> bool { - Self::OperatingModeStorage::get().is_halted() - } - - /// Ensure that the origin is either root, or `PalletOwner`. - fn ensure_owner_or_root(origin: T::RuntimeOrigin) -> Result<(), BadOrigin> { - match origin.into() { - Ok(RawOrigin::Root) => Ok(()), - Ok(RawOrigin::Signed(ref signer)) - if Self::OwnerStorage::get().as_ref() == Some(signer) => - Ok(()), - _ => Err(BadOrigin), - } - } - - /// Ensure that the module is not halted. - fn ensure_not_halted() -> Result<(), OwnedBridgeModuleError> { - match Self::is_halted() { - true => Err(OwnedBridgeModuleError::Halted), - false => Ok(()), - } - } - - /// Change the owner of the module. - fn set_owner(origin: T::RuntimeOrigin, maybe_owner: Option) -> DispatchResult { - Self::ensure_owner_or_root(origin)?; - match maybe_owner { - Some(owner) => { - Self::OwnerStorage::put(&owner); - log::info!(target: Self::LOG_TARGET, "Setting pallet Owner to: {:?}", owner); - }, - None => { - Self::OwnerStorage::kill(); - log::info!(target: Self::LOG_TARGET, "Removed Owner of pallet."); - }, - } - - Ok(()) - } - - /// Halt or resume all/some module operations. - fn set_operating_mode( - origin: T::RuntimeOrigin, - operating_mode: Self::OperatingMode, - ) -> DispatchResult { - Self::ensure_owner_or_root(origin)?; - Self::OperatingModeStorage::put(operating_mode); - log::info!(target: Self::LOG_TARGET, "Setting operating mode to {:?}.", operating_mode); - Ok(()) - } -} - -/// All extra operations with weights that we need in bridges. -pub trait WeightExtraOps { - /// Checked division of individual components of two weights. - /// - /// Divides components and returns minimal division result. Returns `None` if one - /// of `other` weight components is zero. - fn min_components_checked_div(&self, other: Weight) -> Option; -} - -impl WeightExtraOps for Weight { - fn min_components_checked_div(&self, other: Weight) -> Option { - Some(sp_std::cmp::min( - self.ref_time().checked_div(other.ref_time())?, - self.proof_size().checked_div(other.proof_size())?, - )) - } -} - -/// Trait that provides a static `str`. -pub trait StaticStrProvider { - const STR: &'static str; -} - -#[macro_export] -macro_rules! generate_static_str_provider { - ($str:expr) => { - $crate::paste::item! { - pub struct []; - - impl $crate::StaticStrProvider for [] { - const STR: &'static str = stringify!($str); - } - } - }; -} - -#[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, TypeInfo)] -#[scale_info(skip_type_params(T))] -pub struct StrippableError { - _phantom_data: sp_std::marker::PhantomData, - #[codec(skip)] - #[cfg(feature = "std")] - message: String, -} - -impl From for StrippableError { - fn from(_err: T) -> Self { - Self { - _phantom_data: Default::default(), - #[cfg(feature = "std")] - message: format!("{:?}", _err), - } - } -} - -impl Debug for StrippableError { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { - f.write_str(&self.message) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { - f.write_str("Stripped error") - } -} - -/// A trait defining helper methods for `RangeInclusive` (start..=end) -pub trait RangeInclusiveExt { - /// Computes the length of the `RangeInclusive`, checking for underflow and overflow. - fn checked_len(&self) -> Option; - /// Computes the length of the `RangeInclusive`, saturating in case of underflow or overflow. - fn saturating_len(&self) -> Idx; -} - -impl RangeInclusiveExt for RangeInclusive -where - Idx: CheckedSub + CheckedAdd + SaturatingAdd + One + Zero, -{ - fn checked_len(&self) -> Option { - self.end() - .checked_sub(self.start()) - .and_then(|len| len.checked_add(&Idx::one())) - } - - fn saturating_len(&self) -> Idx { - let len = match self.end().checked_sub(self.start()) { - Some(len) => len, - None => return Idx::zero(), - }; - len.saturating_add(&Idx::one()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn storage_parameter_key_works() { - assert_eq!( - storage_parameter_key("MillauToRialtoConversionRate"), - StorageKey(hex_literal::hex!("58942375551bb0af1682f72786b59d04").to_vec()), - ); - } - - #[test] - fn storage_value_key_works() { - assert_eq!( - storage_value_key("PalletTransactionPayment", "NextFeeMultiplier"), - StorageKey( - hex_literal::hex!( - "f0e954dfcca51a255ab12c60c789256a3f2edf3bdf381debe331ab7446addfdc" - ) - .to_vec() - ), - ); - } - - #[test] - fn generate_static_str_provider_works() { - generate_static_str_provider!(Test); - assert_eq!(StrTest::STR, "Test"); - } -} diff --git a/cumulus/bridges/primitives/runtime/src/messages.rs b/cumulus/bridges/primitives/runtime/src/messages.rs deleted file mode 100644 index d30858295783..000000000000 --- a/cumulus/bridges/primitives/runtime/src/messages.rs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Primitives that may be used by different message delivery and dispatch mechanisms. - -use codec::{Decode, Encode}; -use frame_support::{weights::Weight, RuntimeDebug}; -use scale_info::TypeInfo; - -/// Message dispatch result. -#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)] -pub struct MessageDispatchResult { - /// Unspent dispatch weight. This weight that will be deducted from total delivery transaction - /// weight, thus reducing the transaction cost. This shall not be zero in (at least) two cases: - /// - /// 1) if message has been dispatched successfully, but post-dispatch weight is less than the - /// weight, declared by the message sender; - /// 2) if message has not been dispatched at all. - pub unspent_weight: Weight, - /// Fine-grained result of single message dispatch (for better diagnostic purposes) - pub dispatch_level_result: DispatchLevelResult, -} diff --git a/cumulus/bridges/primitives/runtime/src/storage_types.rs b/cumulus/bridges/primitives/runtime/src/storage_types.rs deleted file mode 100644 index b37f779d00b3..000000000000 --- a/cumulus/bridges/primitives/runtime/src/storage_types.rs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Wrapper for a runtime storage value that checks if value exceeds given maximum -//! during conversion. - -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{traits::Get, RuntimeDebug}; -use scale_info::{Type, TypeInfo}; -use sp_std::{marker::PhantomData, ops::Deref}; - -/// Error that is returned when the value size exceeds maximal configured size. -#[derive(RuntimeDebug)] -pub struct MaximalSizeExceededError { - /// Size of the value. - pub value_size: usize, - /// Maximal configured size. - pub maximal_size: usize, -} - -/// A bounded runtime storage value. -#[derive(Clone, Decode, Encode, Eq, PartialEq)] -pub struct BoundedStorageValue { - value: V, - _phantom: PhantomData, -} - -impl sp_std::fmt::Debug for BoundedStorageValue { - fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - self.value.fmt(fmt) - } -} - -impl, V: Encode> BoundedStorageValue { - /// Construct `BoundedStorageValue` from the underlying `value` with all required checks. - /// - /// Returns error if value size exceeds given bounds. - pub fn try_from_inner(value: V) -> Result { - // this conversion is heavy (since we do encoding here), so we may want to optimize it later - // (e.g. by introducing custom Encode implementation, and turning `BoundedStorageValue` into - // `enum BoundedStorageValue { Decoded(V), Encoded(Vec) }`) - let value_size = value.encoded_size(); - let maximal_size = B::get() as usize; - if value_size > maximal_size { - Err(MaximalSizeExceededError { value_size, maximal_size }) - } else { - Ok(BoundedStorageValue { value, _phantom: Default::default() }) - } - } - - /// Convert into the inner type - pub fn into_inner(self) -> V { - self.value - } -} - -impl Deref for BoundedStorageValue { - type Target = V; - - fn deref(&self) -> &Self::Target { - &self.value - } -} - -impl TypeInfo for BoundedStorageValue { - type Identity = Self; - - fn type_info() -> Type { - V::type_info() - } -} - -impl, V: Encode> MaxEncodedLen for BoundedStorageValue { - fn max_encoded_len() -> usize { - B::get() as usize - } -} diff --git a/cumulus/bridges/primitives/test-utils/Cargo.toml b/cumulus/bridges/primitives/test-utils/Cargo.toml deleted file mode 100644 index 2e2af99332ea..000000000000 --- a/cumulus/bridges/primitives/test-utils/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "bp-test-utils" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -bp-header-chain = { path = "../header-chain", default-features = false } -bp-parachains = { path = "../parachains", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -ed25519-dalek = { version = "1.0", default-features = false, features = ["u64_backend"] } -finality-grandpa = { version = "0.16.2", default-features = false } -sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "bp-header-chain/std", - "bp-polkadot-core/std", - "codec/std", - "ed25519-dalek/std", - "finality-grandpa/std", - "sp-application-crypto/std", - "sp-consensus-grandpa/std", - "sp-core/std", - "sp-runtime/std", - "sp-std/std", -] diff --git a/cumulus/bridges/primitives/test-utils/src/lib.rs b/cumulus/bridges/primitives/test-utils/src/lib.rs deleted file mode 100644 index 5a7d0cca279a..000000000000 --- a/cumulus/bridges/primitives/test-utils/src/lib.rs +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Utilities for testing runtime code. - -#![cfg_attr(not(feature = "std"), no_std)] - -use bp_header_chain::justification::{required_justification_precommits, GrandpaJustification}; -use bp_parachains::parachain_head_storage_key_at_source; -use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; -use bp_runtime::record_all_trie_keys; -use codec::Encode; -use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, AuthorityWeight, SetId}; -use sp_runtime::traits::{Header as HeaderT, One, Zero}; -use sp_std::prelude::*; -use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; - -// Re-export all our test account utilities -pub use keyring::*; - -mod keyring; - -pub const TEST_GRANDPA_ROUND: u64 = 1; -pub const TEST_GRANDPA_SET_ID: SetId = 1; -pub const PARAS_PALLET_NAME: &str = "Paras"; - -/// Configuration parameters when generating test GRANDPA justifications. -#[derive(Clone)] -pub struct JustificationGeneratorParams { - /// The header which we want to finalize. - pub header: H, - /// The GRANDPA round number for the current authority set. - pub round: u64, - /// The current authority set ID. - pub set_id: SetId, - /// The current GRANDPA authority set. - /// - /// The size of the set will determine the number of pre-commits in our justification. - pub authorities: Vec<(Account, AuthorityWeight)>, - /// The total number of precommit ancestors in the `votes_ancestries` field our justification. - /// - /// These may be distributed among many forks. - pub ancestors: u32, - /// The number of forks. - /// - /// Useful for creating a "worst-case" scenario in which each authority is on its own fork. - pub forks: u32, -} - -impl Default for JustificationGeneratorParams { - fn default() -> Self { - let required_signatures = required_justification_precommits(test_keyring().len() as _); - Self { - header: test_header(One::one()), - round: TEST_GRANDPA_ROUND, - set_id: TEST_GRANDPA_SET_ID, - authorities: test_keyring().into_iter().take(required_signatures as _).collect(), - ancestors: 2, - forks: 1, - } - } -} - -/// Make a valid GRANDPA justification with sensible defaults -pub fn make_default_justification(header: &H) -> GrandpaJustification { - let params = JustificationGeneratorParams:: { header: header.clone(), ..Default::default() }; - - make_justification_for_header(params) -} - -/// Generate justifications in a way where we are able to tune the number of pre-commits -/// and vote ancestries which are included in the justification. -/// -/// This is useful for benchmarkings where we want to generate valid justifications with -/// a specific number of pre-commits (tuned with the number of "authorities") and/or a specific -/// number of vote ancestries (tuned with the "votes" parameter). -/// -/// Note: This needs at least three authorities or else the verifier will complain about -/// being given an invalid commit. -pub fn make_justification_for_header( - params: JustificationGeneratorParams, -) -> GrandpaJustification { - let JustificationGeneratorParams { header, round, set_id, authorities, mut ancestors, forks } = - params; - let (target_hash, target_number) = (header.hash(), *header.number()); - let mut votes_ancestries = vec![]; - let mut precommits = vec![]; - - assert!(forks != 0, "Need at least one fork to have a chain.."); - assert!( - forks as usize <= authorities.len(), - "If we have more forks than authorities we can't create valid pre-commits for all the forks." - ); - - // Roughly, how many vote ancestries do we want per fork - let target_depth = (ancestors + forks - 1) / forks; - - let mut unsigned_precommits = vec![]; - for i in 0..forks { - let depth = if ancestors >= target_depth { - ancestors -= target_depth; - target_depth - } else { - ancestors - }; - - // Note: Adding 1 to account for the target header - let chain = generate_chain(i, depth + 1, &header); - - // We don't include our finality target header in the vote ancestries - for child in &chain[1..] { - votes_ancestries.push(child.clone()); - } - - // The header we need to use when pre-commiting is the one at the highest height - // on our chain. - let precommit_candidate = chain.last().map(|h| (h.hash(), *h.number())).unwrap(); - unsigned_precommits.push(precommit_candidate); - } - - for (i, (id, _weight)) in authorities.iter().enumerate() { - // Assign authorities to sign pre-commits in a round-robin fashion - let target = unsigned_precommits[i % forks as usize]; - let precommit = signed_precommit::(id, target, round, set_id); - - precommits.push(precommit); - } - - GrandpaJustification { - round, - commit: finality_grandpa::Commit { target_hash, target_number, precommits }, - votes_ancestries, - } -} - -fn generate_chain(fork_id: u32, depth: u32, ancestor: &H) -> Vec { - let mut headers = vec![ancestor.clone()]; - - for i in 1..depth { - let parent = &headers[(i - 1) as usize]; - let (hash, num) = (parent.hash(), *parent.number()); - - let mut header = test_header::(num + One::one()); - header.set_parent_hash(hash); - - // Modifying the digest so headers at the same height but in different forks have different - // hashes - header.digest_mut().logs.push(sp_runtime::DigestItem::Other(fork_id.encode())); - - headers.push(header); - } - - headers -} - -/// Make valid proof for parachain `heads` -pub fn prepare_parachain_heads_proof( - heads: Vec<(u32, ParaHead)>, -) -> (H::Hash, ParaHeadsProof, Vec<(ParaId, ParaHash)>) { - let mut parachains = Vec::with_capacity(heads.len()); - let mut root = Default::default(); - let mut mdb = MemoryDB::default(); - { - let mut trie = TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); - for (parachain, head) in heads { - let storage_key = - parachain_head_storage_key_at_source(PARAS_PALLET_NAME, ParaId(parachain)); - trie.insert(&storage_key.0, &head.encode()) - .map_err(|_| "TrieMut::insert has failed") - .expect("TrieMut::insert should not fail in tests"); - parachains.push((ParaId(parachain), head.hash())); - } - } - - // generate storage proof to be delivered to This chain - let storage_proof = record_all_trie_keys::, _>(&mdb, &root) - .map_err(|_| "record_all_trie_keys has failed") - .expect("record_all_trie_keys should not fail in benchmarks"); - - (root, ParaHeadsProof(storage_proof), parachains) -} - -/// Create signed precommit with given target. -pub fn signed_precommit( - signer: &Account, - target: (H::Hash, H::Number), - round: u64, - set_id: SetId, -) -> finality_grandpa::SignedPrecommit { - let precommit = finality_grandpa::Precommit { target_hash: target.0, target_number: target.1 }; - - let encoded = sp_consensus_grandpa::localized_payload( - round, - set_id, - &finality_grandpa::Message::Precommit(precommit.clone()), - ); - - let signature = signer.sign(&encoded); - let raw_signature: Vec = signature.to_bytes().into(); - - // Need to wrap our signature and id types that they match what our `SignedPrecommit` is - // expecting - let signature = AuthoritySignature::try_from(raw_signature).expect( - "We know our Keypair is good, - so our signature must also be good.", - ); - let id = (*signer).into(); - - finality_grandpa::SignedPrecommit { precommit, signature, id } -} - -/// Get a header for testing. -/// -/// The correct parent hash will be used if given a non-zero header. -pub fn test_header(number: H::Number) -> H { - let default = |num| { - H::new(num, Default::default(), Default::default(), Default::default(), Default::default()) - }; - - let mut header = default(number); - if number != Zero::zero() { - let parent_hash = default(number - One::one()).hash(); - header.set_parent_hash(parent_hash); - } - - header -} - -/// Get a header for testing with given `state_root`. -/// -/// The correct parent hash will be used if given a non-zero header. -pub fn test_header_with_root(number: H::Number, state_root: H::Hash) -> H { - let mut header: H = test_header(number); - header.set_state_root(state_root); - header -} - -/// Convenience function for generating a Header ID at a given block number. -pub fn header_id(index: u8) -> (H::Hash, H::Number) { - (test_header::(index.into()).hash(), index.into()) -} - -#[macro_export] -/// Adds methods for testing the `set_owner()` and `set_operating_mode()` for a pallet. -/// Some values are hardcoded like: -/// - `run_test()` -/// - `Pallet::` -/// - `PalletOwner::` -/// - `PalletOperatingMode::` -/// While this is not ideal, all the pallets use the same names, so it works for the moment. -/// We can revisit this in the future if anything changes. -macro_rules! generate_owned_bridge_module_tests { - ($normal_operating_mode: expr, $halted_operating_mode: expr) => { - #[test] - fn test_set_owner() { - run_test(|| { - PalletOwner::::put(1); - - // The root should be able to change the owner. - assert_ok!(Pallet::::set_owner(RuntimeOrigin::root(), Some(2))); - assert_eq!(PalletOwner::::get(), Some(2)); - - // The owner should be able to change the owner. - assert_ok!(Pallet::::set_owner(RuntimeOrigin::signed(2), Some(3))); - assert_eq!(PalletOwner::::get(), Some(3)); - - // Other users shouldn't be able to change the owner. - assert_noop!( - Pallet::::set_owner(RuntimeOrigin::signed(1), Some(4)), - DispatchError::BadOrigin - ); - assert_eq!(PalletOwner::::get(), Some(3)); - }); - } - - #[test] - fn test_set_operating_mode() { - run_test(|| { - PalletOwner::::put(1); - PalletOperatingMode::::put($normal_operating_mode); - - // The root should be able to halt the pallet. - assert_ok!(Pallet::::set_operating_mode( - RuntimeOrigin::root(), - $halted_operating_mode - )); - assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); - // The root should be able to resume the pallet. - assert_ok!(Pallet::::set_operating_mode( - RuntimeOrigin::root(), - $normal_operating_mode - )); - assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); - - // The owner should be able to halt the pallet. - assert_ok!(Pallet::::set_operating_mode( - RuntimeOrigin::signed(1), - $halted_operating_mode - )); - assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); - // The owner should be able to resume the pallet. - assert_ok!(Pallet::::set_operating_mode( - RuntimeOrigin::signed(1), - $normal_operating_mode - )); - assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); - - // Other users shouldn't be able to halt the pallet. - assert_noop!( - Pallet::::set_operating_mode( - RuntimeOrigin::signed(2), - $halted_operating_mode - ), - DispatchError::BadOrigin - ); - assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); - // Other users shouldn't be able to resume the pallet. - PalletOperatingMode::::put($halted_operating_mode); - assert_noop!( - Pallet::::set_operating_mode( - RuntimeOrigin::signed(2), - $normal_operating_mode - ), - DispatchError::BadOrigin - ); - assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); - }); - } - }; -} diff --git a/cumulus/bridges/primitives/xcm-bridge-hub-router/Cargo.toml b/cumulus/bridges/primitives/xcm-bridge-hub-router/Cargo.toml deleted file mode 100644 index ca17f52d169b..000000000000 --- a/cumulus/bridges/primitives/xcm-bridge-hub-router/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "bp-xcm-bridge-hub-router" -description = "Primitives of the xcm-bridge-hub fee pallet." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "bit-vec"] } -scale-info = { version = "2.9.0", default-features = false, features = ["bit-vec", "derive"] } - -# Substrate Dependencies -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } - -[features] -default = ["std"] -std = [ - "codec/std", - "scale-info/std", - "sp-runtime/std", - "sp-core/std", -] diff --git a/cumulus/bridges/primitives/xcm-bridge-hub-router/src/lib.rs b/cumulus/bridges/primitives/xcm-bridge-hub-router/src/lib.rs deleted file mode 100644 index 0dd329f9e4a0..000000000000 --- a/cumulus/bridges/primitives/xcm-bridge-hub-router/src/lib.rs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Parity Bridges Common. - -// Parity Bridges Common is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity Bridges Common is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity Bridges Common. If not, see . - -//! Primitives of the `xcm-bridge-hub-router` pallet. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, Encode, MaxEncodedLen}; -use scale_info::TypeInfo; -use sp_core::H256; -use sp_runtime::{FixedU128, RuntimeDebug}; - -/// Minimal delivery fee factor. -pub const MINIMAL_DELIVERY_FEE_FACTOR: FixedU128 = FixedU128::from_u32(1); - -/// XCM channel status provider that may report whether it is congested or not. -/// -/// By channel we mean the physical channel that is used to deliver messages of one -/// of the bridge queues. -pub trait XcmChannelStatusProvider { - /// Returns true if the channel is currently congested. - fn is_congested() -> bool; -} - -impl XcmChannelStatusProvider for () { - fn is_congested() -> bool { - false - } -} - -/// Current status of the bridge. -#[derive(Clone, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen, RuntimeDebug)] -pub struct BridgeState { - /// Current delivery fee factor. - pub delivery_fee_factor: FixedU128, - /// Bridge congestion flag. - pub is_congested: bool, -} - -impl Default for BridgeState { - fn default() -> BridgeState { - BridgeState { delivery_fee_factor: MINIMAL_DELIVERY_FEE_FACTOR, is_congested: false } - } -} - -/// A minimized version of `pallet-xcm-bridge-hub-router::Call` that can be used without a runtime. -#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] -#[allow(non_camel_case_types)] -pub enum XcmBridgeHubRouterCall { - /// `pallet-xcm-bridge-hub-router::Call::report_bridge_status` - #[codec(index = 0)] - report_bridge_status { bridge_id: H256, is_congested: bool }, -} diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml deleted file mode 100644 index 6261f9cf511e..000000000000 --- a/cumulus/client/cli/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "cumulus-client-cli" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -clap = { version = "4.3.21", features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.0.0" } -url = "2.4.0" - -# Substrate -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/cumulus/client/cli/src/lib.rs b/cumulus/client/cli/src/lib.rs deleted file mode 100644 index 60d90e0299d6..000000000000 --- a/cumulus/client/cli/src/lib.rs +++ /dev/null @@ -1,440 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus CLI library. - -#![warn(missing_docs)] - -use std::{ - fs, - io::{self, Write}, - net::SocketAddr, - path::PathBuf, -}; - -use codec::Encode; -use sc_chain_spec::ChainSpec; -use sc_client_api::ExecutorProvider; -use sc_service::{ - config::{PrometheusConfig, TelemetryEndpoints}, - BasePath, TransactionPoolOptions, -}; -use sp_core::hexdisplay::HexDisplay; -use sp_runtime::{ - traits::{Block as BlockT, Hash as HashT, Header as HeaderT, Zero}, - StateVersion, -}; -use url::Url; - -/// The `purge-chain` command used to remove the whole chain: the parachain and the relay chain. -#[derive(Debug, clap::Parser)] -#[group(skip)] -pub struct PurgeChainCmd { - /// The base struct of the purge-chain command. - #[command(flatten)] - pub base: sc_cli::PurgeChainCmd, - - /// Only delete the para chain database - #[arg(long, aliases = &["para"])] - pub parachain: bool, - - /// Only delete the relay chain database - #[arg(long, aliases = &["relay"])] - pub relaychain: bool, -} - -impl PurgeChainCmd { - /// Run the purge command - pub fn run( - &self, - para_config: sc_service::Configuration, - relay_config: sc_service::Configuration, - ) -> sc_cli::Result<()> { - let databases = match (self.parachain, self.relaychain) { - (true, true) | (false, false) => { - vec![("parachain", para_config.database), ("relaychain", relay_config.database)] - }, - (true, false) => vec![("parachain", para_config.database)], - (false, true) => vec![("relaychain", relay_config.database)], - }; - - let db_paths = databases - .iter() - .map(|(chain_label, database)| { - database.path().ok_or_else(|| { - sc_cli::Error::Input(format!( - "Cannot purge custom database implementation of: {}", - chain_label, - )) - }) - }) - .collect::>>()?; - - if !self.base.yes { - for db_path in &db_paths { - println!("{}", db_path.display()); - } - print!("Are you sure to remove? [y/N]: "); - io::stdout().flush().expect("failed to flush stdout"); - - let mut input = String::new(); - io::stdin().read_line(&mut input)?; - let input = input.trim(); - - match input.chars().next() { - Some('y') | Some('Y') => {}, - _ => { - println!("Aborted"); - return Ok(()) - }, - } - } - - for db_path in &db_paths { - match fs::remove_dir_all(db_path) { - Ok(_) => { - println!("{:?} removed.", &db_path); - }, - Err(ref err) if err.kind() == io::ErrorKind::NotFound => { - eprintln!("{:?} did not exist.", &db_path); - }, - Err(err) => return Err(err.into()), - } - } - - Ok(()) - } -} - -impl sc_cli::CliConfiguration for PurgeChainCmd { - fn shared_params(&self) -> &sc_cli::SharedParams { - &self.base.shared_params - } - - fn database_params(&self) -> Option<&sc_cli::DatabaseParams> { - Some(&self.base.database_params) - } -} - -/// Command for exporting the genesis state of the parachain -#[derive(Debug, clap::Parser)] -pub struct ExportGenesisStateCommand { - /// Output file name or stdout if unspecified. - #[arg()] - pub output: Option, - - /// Write output in binary. Default is to write in hex. - #[arg(short, long)] - pub raw: bool, - - #[allow(missing_docs)] - #[command(flatten)] - pub shared_params: sc_cli::SharedParams, -} - -impl ExportGenesisStateCommand { - /// Run the export-genesis-state command - pub fn run( - &self, - chain_spec: &dyn ChainSpec, - client: &impl ExecutorProvider, - ) -> sc_cli::Result<()> { - let state_version = sc_chain_spec::resolve_state_version_from_wasm( - &chain_spec.build_storage()?, - client.executor(), - )?; - - let block: Block = generate_genesis_block(chain_spec, state_version)?; - let raw_header = block.header().encode(); - let output_buf = if self.raw { - raw_header - } else { - format!("0x{:?}", HexDisplay::from(&block.header().encode())).into_bytes() - }; - - if let Some(output) = &self.output { - fs::write(output, output_buf)?; - } else { - io::stdout().write_all(&output_buf)?; - } - - Ok(()) - } -} - -/// Generate the genesis block from a given ChainSpec. -pub fn generate_genesis_block( - chain_spec: &dyn ChainSpec, - genesis_state_version: StateVersion, -) -> Result { - let storage = chain_spec.build_storage()?; - - let child_roots = storage.children_default.iter().map(|(sk, child_content)| { - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - child_content.data.clone().into_iter().collect(), - genesis_state_version, - ); - (sk.clone(), state_root.encode()) - }); - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - storage.top.clone().into_iter().chain(child_roots).collect(), - genesis_state_version, - ); - - let extrinsics_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - Vec::new(), - genesis_state_version, - ); - - Ok(Block::new( - <::Header as HeaderT>::new( - Zero::zero(), - extrinsics_root, - state_root, - Default::default(), - Default::default(), - ), - Default::default(), - )) -} - -impl sc_cli::CliConfiguration for ExportGenesisStateCommand { - fn shared_params(&self) -> &sc_cli::SharedParams { - &self.shared_params - } -} - -/// Command for exporting the genesis wasm file. -#[derive(Debug, clap::Parser)] -pub struct ExportGenesisWasmCommand { - /// Output file name or stdout if unspecified. - #[arg()] - pub output: Option, - - /// Write output in binary. Default is to write in hex. - #[arg(short, long)] - pub raw: bool, - - #[allow(missing_docs)] - #[command(flatten)] - pub shared_params: sc_cli::SharedParams, -} - -impl ExportGenesisWasmCommand { - /// Run the export-genesis-wasm command - pub fn run(&self, chain_spec: &dyn ChainSpec) -> sc_cli::Result<()> { - let raw_wasm_blob = extract_genesis_wasm(chain_spec)?; - let output_buf = if self.raw { - raw_wasm_blob - } else { - format!("0x{:?}", HexDisplay::from(&raw_wasm_blob)).into_bytes() - }; - - if let Some(output) = &self.output { - fs::write(output, output_buf)?; - } else { - io::stdout().write_all(&output_buf)?; - } - - Ok(()) - } -} - -/// Extract the genesis code from a given ChainSpec. -pub fn extract_genesis_wasm(chain_spec: &dyn ChainSpec) -> sc_cli::Result> { - let mut storage = chain_spec.build_storage()?; - storage - .top - .remove(sp_core::storage::well_known_keys::CODE) - .ok_or_else(|| "Could not find wasm file in genesis state!".into()) -} - -impl sc_cli::CliConfiguration for ExportGenesisWasmCommand { - fn shared_params(&self) -> &sc_cli::SharedParams { - &self.shared_params - } -} - -fn validate_relay_chain_url(arg: &str) -> Result { - let url = Url::parse(arg).map_err(|e| e.to_string())?; - - let scheme = url.scheme(); - if scheme == "ws" || scheme == "wss" { - Ok(url) - } else { - Err(format!( - "'{}' URL scheme not supported. Only websocket RPC is currently supported", - url.scheme() - )) - } -} - -/// The `run` command used to run a node. -#[derive(Debug, clap::Parser)] -#[group(skip)] -pub struct RunCmd { - /// The cumulus RunCmd inherents from sc_cli's - #[command(flatten)] - pub base: sc_cli::RunCmd, - - /// Run node as collator. - /// - /// Note that this is the same as running with `--validator`. - #[arg(long, conflicts_with = "validator")] - pub collator: bool, - - /// EXPERIMENTAL: Specify an URL to a relay chain full node to communicate with. - #[arg( - long, - value_parser = validate_relay_chain_url, - num_args = 0.., - alias = "relay-chain-rpc-url" - )] - pub relay_chain_rpc_urls: Vec, -} - -impl RunCmd { - /// Create a [`NormalizedRunCmd`] which merges the `collator` cli argument into `validator` to - /// have only one. - pub fn normalize(&self) -> NormalizedRunCmd { - let mut new_base = self.base.clone(); - - new_base.validator = self.base.validator || self.collator; - - NormalizedRunCmd { base: new_base } - } - - /// Create [`CollatorOptions`] representing options only relevant to parachain collator nodes - pub fn collator_options(&self) -> CollatorOptions { - CollatorOptions { relay_chain_rpc_urls: self.relay_chain_rpc_urls.clone() } - } -} - -/// Options only relevant for collator nodes -#[derive(Clone, Debug)] -pub struct CollatorOptions { - /// Location of relay chain full node - pub relay_chain_rpc_urls: Vec, -} - -/// A non-redundant version of the `RunCmd` that sets the `validator` field when the -/// original `RunCmd` had the `collator` field. -/// This is how we make `--collator` imply `--validator`. -pub struct NormalizedRunCmd { - /// The cumulus RunCmd inherents from sc_cli's - pub base: sc_cli::RunCmd, -} - -impl sc_cli::CliConfiguration for NormalizedRunCmd { - fn shared_params(&self) -> &sc_cli::SharedParams { - self.base.shared_params() - } - - fn import_params(&self) -> Option<&sc_cli::ImportParams> { - self.base.import_params() - } - - fn network_params(&self) -> Option<&sc_cli::NetworkParams> { - self.base.network_params() - } - - fn keystore_params(&self) -> Option<&sc_cli::KeystoreParams> { - self.base.keystore_params() - } - - fn offchain_worker_params(&self) -> Option<&sc_cli::OffchainWorkerParams> { - self.base.offchain_worker_params() - } - - fn node_name(&self) -> sc_cli::Result { - self.base.node_name() - } - - fn dev_key_seed(&self, is_dev: bool) -> sc_cli::Result> { - self.base.dev_key_seed(is_dev) - } - - fn telemetry_endpoints( - &self, - chain_spec: &Box, - ) -> sc_cli::Result> { - self.base.telemetry_endpoints(chain_spec) - } - - fn role(&self, is_dev: bool) -> sc_cli::Result { - self.base.role(is_dev) - } - - fn force_authoring(&self) -> sc_cli::Result { - self.base.force_authoring() - } - - fn prometheus_config( - &self, - default_listen_port: u16, - chain_spec: &Box, - ) -> sc_cli::Result> { - self.base.prometheus_config(default_listen_port, chain_spec) - } - - fn disable_grandpa(&self) -> sc_cli::Result { - self.base.disable_grandpa() - } - - fn rpc_max_connections(&self) -> sc_cli::Result { - self.base.rpc_max_connections() - } - - fn rpc_cors(&self, is_dev: bool) -> sc_cli::Result>> { - self.base.rpc_cors(is_dev) - } - - fn rpc_addr(&self, default_listen_port: u16) -> sc_cli::Result> { - self.base.rpc_addr(default_listen_port) - } - - fn rpc_methods(&self) -> sc_cli::Result { - self.base.rpc_methods() - } - - fn rpc_max_request_size(&self) -> sc_cli::Result { - Ok(self.base.rpc_max_request_size) - } - - fn rpc_max_response_size(&self) -> sc_cli::Result { - Ok(self.base.rpc_max_response_size) - } - - fn rpc_max_subscriptions_per_connection(&self) -> sc_cli::Result { - Ok(self.base.rpc_max_subscriptions_per_connection) - } - - fn transaction_pool(&self, is_dev: bool) -> sc_cli::Result { - self.base.transaction_pool(is_dev) - } - - fn max_runtime_instances(&self) -> sc_cli::Result> { - self.base.max_runtime_instances() - } - - fn runtime_cache_size(&self) -> sc_cli::Result { - self.base.runtime_cache_size() - } - - fn base_path(&self) -> sc_cli::Result> { - self.base.base_path() - } -} diff --git a/cumulus/client/collator/Cargo.toml b/cumulus/client/collator/Cargo.toml deleted file mode 100644 index 7fba22b8e8a6..000000000000 --- a/cumulus/client/collator/Cargo.toml +++ /dev/null @@ -1,44 +0,0 @@ -[package] -name = "cumulus-client-collator" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -parking_lot = "0.12.1" -codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.21" -tracing = "0.1.25" - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-node-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-subsystem = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-client-consensus-common = { path = "../consensus/common" } -cumulus-client-network = { path = "../network" } -cumulus-primitives-core = { path = "../../primitives/core" } - -[dev-dependencies] -async-trait = "0.1.73" - -# Substrate -sp-maybe-compressed-blob = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-node-subsystem-test-helpers = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-test-client = { path = "../../test/client" } -cumulus-test-runtime = { path = "../../test/runtime" } diff --git a/cumulus/client/collator/src/lib.rs b/cumulus/client/collator/src/lib.rs deleted file mode 100644 index aca40b2b3429..000000000000 --- a/cumulus/client/collator/src/lib.rs +++ /dev/null @@ -1,424 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus Collator implementation for Substrate. - -use cumulus_primitives_core::{ - relay_chain::Hash as PHash, CollectCollationInfo, PersistedValidationData, -}; - -use sc_client_api::BlockBackend; -use sp_api::ProvideRuntimeApi; -use sp_core::traits::SpawnNamed; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - -use cumulus_client_consensus_common::ParachainConsensus; -use polkadot_node_primitives::{CollationResult, MaybeCompressedPoV}; -use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{CollatorPair, Id as ParaId}; - -use codec::{Decode, Encode}; -use futures::prelude::*; -use std::sync::Arc; - -use crate::service::CollatorService; - -pub mod service; - -/// The logging target. -const LOG_TARGET: &str = "cumulus-collator"; - -/// The implementation of the Cumulus `Collator`. -/// -/// Note that this implementation is soon to be deprecated and removed, and it is suggested to -/// directly use the [`CollatorService`] instead, so consensus engine implementations -/// live at the top level. -pub struct Collator { - service: CollatorService, - parachain_consensus: Box>, -} - -impl Clone for Collator { - fn clone(&self) -> Self { - Collator { - service: self.service.clone(), - parachain_consensus: self.parachain_consensus.clone(), - } - } -} - -impl Collator -where - Block: BlockT, - BS: BlockBackend, - RA: ProvideRuntimeApi, - RA::Api: CollectCollationInfo, -{ - /// Create a new instance. - fn new( - collator_service: CollatorService, - parachain_consensus: Box>, - ) -> Self { - Self { service: collator_service, parachain_consensus } - } - - async fn produce_candidate( - mut self, - relay_parent: PHash, - validation_data: PersistedValidationData, - ) -> Option { - tracing::trace!( - target: LOG_TARGET, - relay_parent = ?relay_parent, - "Producing candidate", - ); - - let last_head = match Block::Header::decode(&mut &validation_data.parent_head.0[..]) { - Ok(x) => x, - Err(e) => { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Could not decode the head data." - ); - return None - }, - }; - - let last_head_hash = last_head.hash(); - if !self.service.check_block_status(last_head_hash, &last_head) { - return None - } - - tracing::info!( - target: LOG_TARGET, - relay_parent = ?relay_parent, - at = ?last_head_hash, - "Starting collation.", - ); - - let candidate = self - .parachain_consensus - .produce_candidate(&last_head, relay_parent, &validation_data) - .await?; - - let block_hash = candidate.block.header().hash(); - - let (collation, b) = self.service.build_collation(&last_head, block_hash, candidate)?; - - tracing::info!( - target: LOG_TARGET, - "PoV size {{ header: {}kb, extrinsics: {}kb, storage_proof: {}kb }}", - b.header().encode().len() as f64 / 1024f64, - b.extrinsics().encode().len() as f64 / 1024f64, - b.storage_proof().encode().len() as f64 / 1024f64, - ); - - if let MaybeCompressedPoV::Compressed(ref pov) = collation.proof_of_validity { - tracing::info!( - target: LOG_TARGET, - "Compressed PoV size: {}kb", - pov.block_data.0.len() as f64 / 1024f64, - ); - } - - let result_sender = self.service.announce_with_barrier(block_hash); - - tracing::info!(target: LOG_TARGET, ?block_hash, "Produced proof-of-validity candidate.",); - - Some(CollationResult { collation, result_sender: Some(result_sender) }) - } -} - -/// Relay-chain-driven collators are those whose block production is driven purely -/// by new relay chain blocks and the most recently included parachain blocks -/// within them. -/// -/// This method of driving collators is not suited to anything but the most simple parachain -/// consensus mechanisms, and this module may soon be deprecated. -pub mod relay_chain_driven { - use futures::{ - channel::{mpsc, oneshot}, - prelude::*, - }; - use polkadot_node_primitives::{CollationGenerationConfig, CollationResult}; - use polkadot_node_subsystem::messages::{CollationGenerationMessage, CollatorProtocolMessage}; - use polkadot_overseer::Handle as OverseerHandle; - use polkadot_primitives::{CollatorPair, Id as ParaId}; - - use cumulus_primitives_core::{relay_chain::Hash as PHash, PersistedValidationData}; - - /// A request to author a collation, based on the advancement of the relay chain. - /// - /// See the module docs for more info on relay-chain-driven collators. - pub struct CollationRequest { - relay_parent: PHash, - pvd: PersistedValidationData, - sender: oneshot::Sender>, - } - - impl CollationRequest { - /// Get the relay parent of the collation request. - pub fn relay_parent(&self) -> &PHash { - &self.relay_parent - } - - /// Get the [`PersistedValidationData`] for the request. - pub fn persisted_validation_data(&self) -> &PersistedValidationData { - &self.pvd - } - - /// Complete the request with a collation, if any. - pub fn complete(self, collation: Option) { - let _ = self.sender.send(collation); - } - } - - /// Initialize the collator with Polkadot's collation-generation - /// subsystem, returning a stream of collation requests to handle. - pub async fn init( - key: CollatorPair, - para_id: ParaId, - overseer_handle: OverseerHandle, - ) -> mpsc::Receiver { - let mut overseer_handle = overseer_handle; - - let (stream_tx, stream_rx) = mpsc::channel(0); - let config = CollationGenerationConfig { - key, - para_id, - collator: Box::new(move |relay_parent, validation_data| { - // Cloning the channel on each usage effectively makes the channel - // unbounded. The channel is actually bounded by the block production - // and consensus systems of Polkadot, which limits the amount of possible - // blocks. - let mut stream_tx = stream_tx.clone(); - let validation_data = validation_data.clone(); - Box::pin(async move { - let (this_tx, this_rx) = oneshot::channel(); - let request = - CollationRequest { relay_parent, pvd: validation_data, sender: this_tx }; - - if stream_tx.send(request).await.is_err() { - return None - } - - this_rx.await.ok().flatten() - }) - }), - }; - - overseer_handle - .send_msg(CollationGenerationMessage::Initialize(config), "StartCollator") - .await; - - overseer_handle - .send_msg(CollatorProtocolMessage::CollateOn(para_id), "StartCollator") - .await; - - stream_rx - } -} - -/// Parameters for [`start_collator`]. -pub struct StartCollatorParams { - pub para_id: ParaId, - pub runtime_api: Arc, - pub block_status: Arc, - pub announce_block: Arc>) + Send + Sync>, - pub overseer_handle: OverseerHandle, - pub spawner: Spawner, - pub key: CollatorPair, - pub parachain_consensus: Box>, -} - -/// Start the collator. -pub async fn start_collator( - StartCollatorParams { - para_id, - block_status, - announce_block, - overseer_handle, - spawner, - key, - parachain_consensus, - runtime_api, - }: StartCollatorParams, -) where - Block: BlockT, - BS: BlockBackend + Send + Sync + 'static, - Spawner: SpawnNamed + Clone + Send + Sync + 'static, - RA: ProvideRuntimeApi + Send + Sync + 'static, - RA::Api: CollectCollationInfo, -{ - let collator_service = - CollatorService::new(block_status, Arc::new(spawner.clone()), announce_block, runtime_api); - - let collator = Collator::new(collator_service, parachain_consensus); - - let mut request_stream = relay_chain_driven::init(key, para_id, overseer_handle).await; - - let collation_future = Box::pin(async move { - while let Some(request) = request_stream.next().await { - let collation = collator - .clone() - .produce_candidate( - *request.relay_parent(), - request.persisted_validation_data().clone(), - ) - .await; - - request.complete(collation); - } - }); - - spawner.spawn("cumulus-relay-driven-collator", None, collation_future); -} - -#[cfg(test)] -mod tests { - use super::*; - use async_trait::async_trait; - use cumulus_client_consensus_common::ParachainCandidate; - use cumulus_primitives_core::ParachainBlockData; - use cumulus_test_client::{ - Client, ClientBlockImportExt, DefaultTestClientBuilderExt, InitBlockBuilder, - TestClientBuilder, TestClientBuilderExt, - }; - use cumulus_test_runtime::{Block, Header}; - use futures::{channel::mpsc, executor::block_on, StreamExt}; - use polkadot_node_subsystem::messages::CollationGenerationMessage; - use polkadot_node_subsystem_test_helpers::ForwardSubsystem; - use polkadot_overseer::{dummy::dummy_overseer_builder, HeadSupportsParachains}; - use sp_consensus::BlockOrigin; - use sp_core::{testing::TaskExecutor, Pair}; - use sp_runtime::traits::BlakeTwo256; - use sp_state_machine::Backend; - - struct AlwaysSupportsParachains; - - #[async_trait] - impl HeadSupportsParachains for AlwaysSupportsParachains { - async fn head_supports_parachains(&self, _head: &PHash) -> bool { - true - } - } - - #[derive(Clone)] - struct DummyParachainConsensus { - client: Arc, - } - - #[async_trait::async_trait] - impl ParachainConsensus for DummyParachainConsensus { - async fn produce_candidate( - &mut self, - parent: &Header, - _: PHash, - validation_data: &PersistedValidationData, - ) -> Option> { - let builder = self.client.init_block_builder_at( - parent.hash(), - Some(validation_data.clone()), - Default::default(), - ); - - let (block, _, proof) = builder.build().expect("Creates block").into_inner(); - - self.client - .import(BlockOrigin::Own, block.clone()) - .await - .expect("Imports the block"); - - Some(ParachainCandidate { block, proof: proof.expect("Proof is returned") }) - } - } - - #[test] - fn collates_produces_a_block_and_storage_proof_does_not_contains_code() { - sp_tracing::try_init_simple(); - - let spawner = TaskExecutor::new(); - let para_id = ParaId::from(100); - let announce_block = |_, _| (); - let client = Arc::new(TestClientBuilder::new().build()); - let header = client.header(client.chain_info().genesis_hash).unwrap().unwrap(); - - let (sub_tx, sub_rx) = mpsc::channel(64); - - let (overseer, handle) = - dummy_overseer_builder(spawner.clone(), AlwaysSupportsParachains, None) - .expect("Creates overseer builder") - .replace_collation_generation(|_| ForwardSubsystem(sub_tx)) - .build() - .expect("Builds overseer"); - - spawner.spawn("overseer", None, overseer.run().then(|_| async {}).boxed()); - - let collator_start = start_collator(StartCollatorParams { - runtime_api: client.clone(), - block_status: client.clone(), - announce_block: Arc::new(announce_block), - overseer_handle: OverseerHandle::new(handle), - spawner, - para_id, - key: CollatorPair::generate().0, - parachain_consensus: Box::new(DummyParachainConsensus { client }), - }); - block_on(collator_start); - - let msg = block_on(sub_rx.into_future()) - .0 - .expect("message should be send by `start_collator` above."); - - let CollationGenerationMessage::Initialize(config) = msg; - - let validation_data = - PersistedValidationData { parent_head: header.encode().into(), ..Default::default() }; - let relay_parent = Default::default(); - - let collation = block_on((config.collator)(relay_parent, &validation_data)) - .expect("Collation is build") - .collation; - - let pov = collation.proof_of_validity.into_compressed(); - - let decompressed = - sp_maybe_compressed_blob::decompress(&pov.block_data.0, 1024 * 1024 * 10).unwrap(); - - let block = - ParachainBlockData::::decode(&mut &decompressed[..]).expect("Is a valid block"); - - assert_eq!(1, *block.header().number()); - - // Ensure that we did not include `:code` in the proof. - let proof = block.storage_proof(); - let db = proof - .to_storage_proof::(Some(header.state_root())) - .unwrap() - .0 - .into_memory_db(); - - let backend = sp_state_machine::new_in_mem_hash_key::() - .update_backend(*header.state_root(), db); - - // Should return an error, as it was not included while building the proof. - assert!(backend - .storage(sp_core::storage::well_known_keys::CODE) - .unwrap_err() - .contains("Trie lookup error: Database missing expected key")); - } -} diff --git a/cumulus/client/collator/src/service.rs b/cumulus/client/collator/src/service.rs deleted file mode 100644 index c798cb84c23f..000000000000 --- a/cumulus/client/collator/src/service.rs +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The Cumulus [`CollatorService`] is a utility struct for performing common -//! operations used in parachain consensus/authoring. - -use cumulus_client_network::WaitToAnnounce; -use cumulus_primitives_core::{CollationInfo, CollectCollationInfo, ParachainBlockData}; - -use sc_client_api::BlockBackend; -use sp_api::{ApiExt, ProvideRuntimeApi}; -use sp_consensus::BlockStatus; -use sp_core::traits::SpawnNamed; -use sp_runtime::traits::{Block as BlockT, HashingFor, Header as HeaderT, Zero}; - -use cumulus_client_consensus_common::ParachainCandidate; -use polkadot_node_primitives::{ - BlockData, Collation, CollationSecondedSignal, MaybeCompressedPoV, PoV, -}; - -use codec::Encode; -use futures::channel::oneshot; -use parking_lot::Mutex; -use std::sync::Arc; - -/// The logging target. -const LOG_TARGET: &str = "cumulus-collator"; - -/// Utility functions generally applicable to writing collators for Cumulus. -pub trait ServiceInterface { - /// Checks the status of the given block hash in the Parachain. - /// - /// Returns `true` if the block could be found and is good to be build on. - fn check_block_status(&self, hash: Block::Hash, header: &Block::Header) -> bool; - - /// Build a full [`Collation`] from a given [`ParachainCandidate`]. This requires - /// that the underlying block has been fully imported into the underlying client, - /// as implementations will fetch underlying runtime API data. - /// - /// This also returns the unencoded parachain block data, in case that is desired. - fn build_collation( - &self, - parent_header: &Block::Header, - block_hash: Block::Hash, - candidate: ParachainCandidate, - ) -> Option<(Collation, ParachainBlockData)>; - - /// Inform networking systems that the block should be announced after a signal has - /// been received to indicate the block has been seconded by a relay-chain validator. - /// - /// This sets up the barrier and returns the sending side of a channel, for the signal - /// to be passed through. - fn announce_with_barrier( - &self, - block_hash: Block::Hash, - ) -> oneshot::Sender; - - /// Directly announce a block on the network. - fn announce_block(&self, block_hash: Block::Hash, data: Option>); -} - -/// The [`CollatorService`] provides common utilities for parachain consensus and authoring. -/// -/// This includes logic for checking the block status of arbitrary parachain headers -/// gathered from the relay chain state, creating full [`Collation`]s to be shared with validators, -/// and distributing new parachain blocks along the network. -pub struct CollatorService { - block_status: Arc, - wait_to_announce: Arc>>, - announce_block: Arc>) + Send + Sync>, - runtime_api: Arc, -} - -impl Clone for CollatorService { - fn clone(&self) -> Self { - Self { - block_status: self.block_status.clone(), - wait_to_announce: self.wait_to_announce.clone(), - announce_block: self.announce_block.clone(), - runtime_api: self.runtime_api.clone(), - } - } -} - -impl CollatorService -where - Block: BlockT, - BS: BlockBackend, - RA: ProvideRuntimeApi, - RA::Api: CollectCollationInfo, -{ - /// Create a new instance. - pub fn new( - block_status: Arc, - spawner: Arc, - announce_block: Arc>) + Send + Sync>, - runtime_api: Arc, - ) -> Self { - let wait_to_announce = - Arc::new(Mutex::new(WaitToAnnounce::new(spawner, announce_block.clone()))); - - Self { block_status, wait_to_announce, announce_block, runtime_api } - } - - /// Checks the status of the given block hash in the Parachain. - /// - /// Returns `true` if the block could be found and is good to be build on. - pub fn check_block_status(&self, hash: Block::Hash, header: &Block::Header) -> bool { - match self.block_status.block_status(hash) { - Ok(BlockStatus::Queued) => { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Skipping candidate production, because block is still queued for import.", - ); - false - }, - Ok(BlockStatus::InChainWithState) => true, - Ok(BlockStatus::InChainPruned) => { - tracing::error!( - target: LOG_TARGET, - "Skipping candidate production, because block `{:?}` is already pruned!", - hash, - ); - false - }, - Ok(BlockStatus::KnownBad) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - "Block is tagged as known bad and is included in the relay chain! Skipping candidate production!", - ); - false - }, - Ok(BlockStatus::Unknown) => { - if header.number().is_zero() { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - "Could not find the header of the genesis block in the database!", - ); - } else { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Skipping candidate production, because block is unknown.", - ); - } - false - }, - Err(e) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - error = ?e, - "Failed to get block status.", - ); - false - }, - } - } - - /// Fetch the collation info from the runtime. - /// - /// Returns `Ok(Some(_))` on success, `Err(_)` on error or `Ok(None)` if the runtime api isn't - /// implemented by the runtime. - pub fn fetch_collation_info( - &self, - block_hash: Block::Hash, - header: &Block::Header, - ) -> Result, sp_api::ApiError> { - let runtime_api = self.runtime_api.runtime_api(); - - let api_version = - match runtime_api.api_version::>(block_hash)? { - Some(version) => version, - None => { - tracing::error!( - target: LOG_TARGET, - "Could not fetch `CollectCollationInfo` runtime api version." - ); - return Ok(None) - }, - }; - - let collation_info = if api_version < 2 { - #[allow(deprecated)] - runtime_api - .collect_collation_info_before_version_2(block_hash)? - .into_latest(header.encode().into()) - } else { - runtime_api.collect_collation_info(block_hash, header)? - }; - - Ok(Some(collation_info)) - } - - /// Build a full [`Collation`] from a given [`ParachainCandidate`]. This requires - /// that the underlying block has been fully imported into the underlying client, - /// as it fetches underlying runtime API data. - /// - /// This also returns the unencoded parachain block data, in case that is desired. - pub fn build_collation( - &self, - parent_header: &Block::Header, - block_hash: Block::Hash, - candidate: ParachainCandidate, - ) -> Option<(Collation, ParachainBlockData)> { - let (header, extrinsics) = candidate.block.deconstruct(); - - let compact_proof = match candidate - .proof - .into_compact_proof::>(*parent_header.state_root()) - { - Ok(proof) => proof, - Err(e) => { - tracing::error!(target: "cumulus-collator", "Failed to compact proof: {:?}", e); - return None - }, - }; - - // Create the parachain block data for the validators. - let collation_info = self - .fetch_collation_info(block_hash, &header) - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Failed to collect collation info.", - ) - }) - .ok() - .flatten()?; - - let block_data = ParachainBlockData::::new(header, extrinsics, compact_proof); - - let pov = polkadot_node_primitives::maybe_compress_pov(PoV { - block_data: BlockData(block_data.encode()), - }); - - let upward_messages = collation_info - .upward_messages - .try_into() - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Number of upward messages should not be greater than `MAX_UPWARD_MESSAGE_NUM`", - ) - }) - .ok()?; - let horizontal_messages = collation_info - .horizontal_messages - .try_into() - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Number of horizontal messages should not be greater than `MAX_HORIZONTAL_MESSAGE_NUM`", - ) - }) - .ok()?; - - let collation = Collation { - upward_messages, - new_validation_code: collation_info.new_validation_code, - processed_downward_messages: collation_info.processed_downward_messages, - horizontal_messages, - hrmp_watermark: collation_info.hrmp_watermark, - head_data: collation_info.head_data, - proof_of_validity: MaybeCompressedPoV::Compressed(pov), - }; - - Some((collation, block_data)) - } - - /// Inform the networking systems that the block should be announced after an appropriate - /// signal has been received. This returns the sending half of the signal. - pub fn announce_with_barrier( - &self, - block_hash: Block::Hash, - ) -> oneshot::Sender { - let (result_sender, signed_stmt_recv) = oneshot::channel(); - self.wait_to_announce.lock().wait_to_announce(block_hash, signed_stmt_recv); - result_sender - } -} - -impl ServiceInterface for CollatorService -where - Block: BlockT, - BS: BlockBackend, - RA: ProvideRuntimeApi, - RA::Api: CollectCollationInfo, -{ - fn check_block_status(&self, hash: Block::Hash, header: &Block::Header) -> bool { - CollatorService::check_block_status(self, hash, header) - } - - fn build_collation( - &self, - parent_header: &Block::Header, - block_hash: Block::Hash, - candidate: ParachainCandidate, - ) -> Option<(Collation, ParachainBlockData)> { - CollatorService::build_collation(self, parent_header, block_hash, candidate) - } - - fn announce_with_barrier( - &self, - block_hash: Block::Hash, - ) -> oneshot::Sender { - CollatorService::announce_with_barrier(self, block_hash) - } - - fn announce_block(&self, block_hash: Block::Hash, data: Option>) { - (self.announce_block)(block_hash, data) - } -} diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml deleted file mode 100644 index a257c7e3d9c2..000000000000 --- a/cumulus/client/consensus/aura/Cargo.toml +++ /dev/null @@ -1,48 +0,0 @@ -[package] -name = "cumulus-client-consensus-aura" -description = "AURA consensus algorithm for parachains" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -async-trait = "0.1.73" -codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.28" -tracing = "0.1.37" -lru = "0.10.0" - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus-slots = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-application-crypto = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Cumulus -cumulus-client-consensus-common = { path = "../common" } -cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } -cumulus-client-consensus-proposer = { path = "../proposer" } -cumulus-primitives-aura = { path = "../../../primitives/aura" } -cumulus-primitives-core = { path = "../../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent" } -cumulus-client-collator = { path = "../../collator" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } diff --git a/cumulus/client/consensus/aura/src/collator.rs b/cumulus/client/consensus/aura/src/collator.rs deleted file mode 100644 index da60d491bc74..000000000000 --- a/cumulus/client/consensus/aura/src/collator.rs +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The core collator logic for Aura - slot claiming, block proposing, and collation -//! packaging. -//! -//! The [`Collator`] struct exposed here is meant to be a component of higher-level logic -//! which actually manages the control flow of the collator - which slots to claim, how -//! many collations to build, when to work, etc. -//! -//! This module also exposes some standalone functions for common operations when building -//! aura-based collators. - -use codec::{Codec, Encode}; -use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; -use cumulus_client_consensus_common::{ - self as consensus_common, ParachainBlockImportMarker, ParachainCandidate, -}; -use cumulus_client_consensus_proposer::ProposerInterface; -use cumulus_primitives_core::{ - relay_chain::Hash as PHash, DigestItem, ParachainBlockData, PersistedValidationData, -}; -use cumulus_primitives_parachain_inherent::ParachainInherentData; -use cumulus_relay_chain_interface::RelayChainInterface; - -use polkadot_node_primitives::{Collation, MaybeCompressedPoV}; -use polkadot_primitives::{Header as PHeader, Id as ParaId}; - -use futures::prelude::*; -use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy, StateAction}; -use sc_consensus_aura::standalone as aura_internal; -use sp_api::ProvideRuntimeApi; -use sp_application_crypto::AppPublic; -use sp_consensus::BlockOrigin; -use sp_consensus_aura::{AuraApi, Slot, SlotDuration}; -use sp_core::crypto::Pair; -use sp_inherents::{CreateInherentDataProviders, InherentData, InherentDataProvider}; -use sp_keystore::KeystorePtr; -use sp_runtime::{ - generic::Digest, - traits::{Block as BlockT, HashingFor, Header as HeaderT, Member}, -}; -use sp_state_machine::StorageChanges; -use sp_timestamp::Timestamp; -use std::{convert::TryFrom, error::Error, sync::Arc, time::Duration}; - -/// Parameters for instantiating a [`Collator`]. -pub struct Params { - /// A builder for inherent data builders. - pub create_inherent_data_providers: CIDP, - /// The block import handle. - pub block_import: BI, - /// An interface to the relay-chain client. - pub relay_client: Arc, - /// The keystore handle used for accessing parachain key material. - pub keystore: KeystorePtr, - /// The identifier of the parachain within the relay-chain. - pub para_id: ParaId, - /// The block proposer used for building blocks. - pub proposer: Proposer, - /// The collator service used for bundling proposals into collations and announcing - /// to the network. - pub collator_service: CS, -} - -/// A utility struct for writing collation logic that makes use of Aura entirely -/// or in part. See module docs for more details. -pub struct Collator { - create_inherent_data_providers: CIDP, - block_import: BI, - relay_client: Arc, - keystore: KeystorePtr, - para_id: ParaId, - proposer: Proposer, - collator_service: CS, - _marker: std::marker::PhantomData<(Block, P)>, -} - -impl Collator -where - Block: BlockT, - RClient: RelayChainInterface, - CIDP: CreateInherentDataProviders + 'static, - BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, - Proposer: ProposerInterface, - Proposer::Transaction: Sync, - CS: CollatorServiceInterface, - P: Pair, - P::Public: AppPublic + Member, - P::Signature: TryFrom> + Member + Codec, -{ - /// Instantiate a new instance of the `Aura` manager. - pub fn new(params: Params) -> Self { - Collator { - create_inherent_data_providers: params.create_inherent_data_providers, - block_import: params.block_import, - relay_client: params.relay_client, - keystore: params.keystore, - para_id: params.para_id, - proposer: params.proposer, - collator_service: params.collator_service, - _marker: std::marker::PhantomData, - } - } - - /// Explicitly creates the inherent data for parachain block authoring and overrides - /// the timestamp inherent data with the one provided, if any. - pub async fn create_inherent_data( - &self, - relay_parent: PHash, - validation_data: &PersistedValidationData, - parent_hash: Block::Hash, - timestamp: impl Into>, - ) -> Result<(ParachainInherentData, InherentData), Box> { - let paras_inherent_data = ParachainInherentData::create_at( - relay_parent, - &self.relay_client, - validation_data, - self.para_id, - ) - .await; - - let paras_inherent_data = match paras_inherent_data { - Some(p) => p, - None => - return Err( - format!("Could not create paras inherent data at {:?}", relay_parent).into() - ), - }; - - let mut other_inherent_data = self - .create_inherent_data_providers - .create_inherent_data_providers(parent_hash, ()) - .map_err(|e| e as Box) - .await? - .create_inherent_data() - .await - .map_err(Box::new)?; - - if let Some(timestamp) = timestamp.into() { - other_inherent_data.replace_data(sp_timestamp::INHERENT_IDENTIFIER, ×tamp); - } - - Ok((paras_inherent_data, other_inherent_data)) - } - - /// Propose, seal, and import a block, packaging it into a collation. - /// - /// Provide the slot to build at as well as any other necessary pre-digest logs, - /// the inherent data, and the proposal duration and PoV size limits. - /// - /// The Aura pre-digest should not be explicitly provided and is set internally. - /// - /// This does not announce the collation to the parachain network or the relay chain. - pub async fn collate( - &mut self, - parent_header: &Block::Header, - slot_claim: &SlotClaim, - additional_pre_digest: impl Into>>, - inherent_data: (ParachainInherentData, InherentData), - proposal_duration: Duration, - max_pov_size: usize, - ) -> Result<(Collation, ParachainBlockData, Block::Hash), Box> { - let mut digest = additional_pre_digest.into().unwrap_or_default(); - digest.push(slot_claim.pre_digest.clone()); - - let proposal = self - .proposer - .propose( - &parent_header, - &inherent_data.0, - inherent_data.1, - Digest { logs: digest }, - proposal_duration, - Some(max_pov_size), - ) - .await - .map_err(|e| Box::new(e))?; - - let sealed_importable = seal::<_, _, P>( - proposal.block, - proposal.storage_changes, - &slot_claim.author_pub, - &self.keystore, - )?; - - let post_hash = sealed_importable.post_hash(); - let block = Block::new( - sealed_importable.post_header(), - sealed_importable - .body - .as_ref() - .expect("body always created with this `propose` fn; qed") - .clone(), - ); - - self.block_import.import_block(sealed_importable).await?; - - if let Some((collation, block_data)) = self.collator_service.build_collation( - parent_header, - post_hash, - ParachainCandidate { block, proof: proposal.proof }, - ) { - tracing::info!( - target: crate::LOG_TARGET, - "PoV size {{ header: {}kb, extrinsics: {}kb, storage_proof: {}kb }}", - block_data.header().encode().len() as f64 / 1024f64, - block_data.extrinsics().encode().len() as f64 / 1024f64, - block_data.storage_proof().encode().len() as f64 / 1024f64, - ); - - if let MaybeCompressedPoV::Compressed(ref pov) = collation.proof_of_validity { - tracing::info!( - target: crate::LOG_TARGET, - "Compressed PoV size: {}kb", - pov.block_data.0.len() as f64 / 1024f64, - ); - } - - Ok((collation, block_data, post_hash)) - } else { - Err("Unable to produce collation".to_string().into()) - } - } - - /// Get the underlying collator service. - pub fn collator_service(&self) -> &CS { - &self.collator_service - } -} - -/// A claim on an Aura slot. -pub struct SlotClaim { - author_pub: Pub, - pre_digest: DigestItem, - timestamp: Timestamp, -} - -impl SlotClaim { - /// Create a slot-claim from the given author public key, slot, and timestamp. - /// - /// This does not check whether the author actually owns the slot or the timestamp - /// falls within the slot. - pub fn unchecked

(author_pub: Pub, slot: Slot, timestamp: Timestamp) -> Self - where - P: Pair, - P::Public: Codec, - P::Signature: Codec, - { - SlotClaim { author_pub, timestamp, pre_digest: aura_internal::pre_digest::

(slot) } - } - - /// Get the author's public key. - pub fn author_pub(&self) -> &Pub { - &self.author_pub - } - - /// Get the Aura pre-digest for this slot. - pub fn pre_digest(&self) -> &DigestItem { - &self.pre_digest - } - - /// Get the timestamp corresponding to the relay-chain slot this claim was - /// generated against. - pub fn timestamp(&self) -> Timestamp { - self.timestamp - } -} - -/// Attempt to claim a slot derived from the given relay-parent header's slot. -pub async fn claim_slot( - client: &C, - parent_hash: B::Hash, - relay_parent_header: &PHeader, - slot_duration: SlotDuration, - relay_chain_slot_duration: SlotDuration, - keystore: &KeystorePtr, -) -> Result>, Box> -where - B: BlockT, - C: ProvideRuntimeApi + Send + Sync + 'static, - C::Api: AuraApi, - P: Pair, - P::Public: Codec, - P::Signature: Codec, -{ - // load authorities - let authorities = client.runtime_api().authorities(parent_hash).map_err(Box::new)?; - - // Determine the current slot and timestamp based on the relay-parent's. - let (slot_now, timestamp) = match consensus_common::relay_slot_and_timestamp( - relay_parent_header, - relay_chain_slot_duration, - ) { - Some((_, t)) => (Slot::from_timestamp(t, slot_duration), t), - None => return Ok(None), - }; - - // Try to claim the slot locally. - let author_pub = { - let res = aura_internal::claim_slot::

(slot_now, &authorities, keystore).await; - match res { - Some(p) => p, - None => return Ok(None), - } - }; - - Ok(Some(SlotClaim::unchecked::

(author_pub, slot_now, timestamp))) -} - -/// Seal a block with a signature in the header. -pub fn seal( - pre_sealed: B, - storage_changes: StorageChanges>, - author_pub: &P::Public, - keystore: &KeystorePtr, -) -> Result, Box> -where - P: Pair, - P::Signature: Codec + TryFrom>, - P::Public: AppPublic, -{ - let (pre_header, body) = pre_sealed.deconstruct(); - let pre_hash = pre_header.hash(); - let block_number = *pre_header.number(); - - // seal the block. - let block_import_params = { - let seal_digest = - aura_internal::seal::<_, P>(&pre_hash, &author_pub, keystore).map_err(Box::new)?; - let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, pre_header); - block_import_params.post_digests.push(seal_digest); - block_import_params.body = Some(body.clone()); - block_import_params.state_action = - StateAction::ApplyChanges(sc_consensus::StorageChanges::Changes(storage_changes)); - block_import_params.fork_choice = Some(ForkChoiceStrategy::LongestChain); - block_import_params - }; - let post_hash = block_import_params.post_hash(); - - tracing::info!( - target: crate::LOG_TARGET, - "🔖 Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", - block_number, - post_hash, - pre_hash, - ); - - Ok(block_import_params) -} diff --git a/cumulus/client/consensus/aura/src/collators/basic.rs b/cumulus/client/consensus/aura/src/collators/basic.rs deleted file mode 100644 index 0e8461cc500a..000000000000 --- a/cumulus/client/consensus/aura/src/collators/basic.rs +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! This provides the option to run a basic relay-chain driven Aura implementation. -//! -//! This collator only builds on top of the most recently included block, limiting the -//! block time to a maximum of two times the relay-chain block time, and requiring the -//! block to be built and distributed to validators between two relay-chain blocks. -//! -//! For more information about AuRa, the Substrate crate should be checked. - -use codec::{Codec, Decode}; -use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; -use cumulus_client_consensus_common::ParachainBlockImportMarker; -use cumulus_client_consensus_proposer::ProposerInterface; -use cumulus_primitives_core::{relay_chain::BlockId as RBlockId, CollectCollationInfo}; -use cumulus_relay_chain_interface::RelayChainInterface; - -use polkadot_node_primitives::CollationResult; -use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{CollatorPair, Id as ParaId}; - -use futures::prelude::*; -use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf}; -use sc_consensus::BlockImport; -use sp_api::ProvideRuntimeApi; -use sp_application_crypto::AppPublic; -use sp_blockchain::HeaderBackend; -use sp_consensus::SyncOracle; -use sp_consensus_aura::{AuraApi, SlotDuration}; -use sp_core::crypto::Pair; -use sp_inherents::CreateInherentDataProviders; -use sp_keystore::KeystorePtr; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member}; -use std::{convert::TryFrom, sync::Arc, time::Duration}; - -use crate::collator as collator_util; - -/// Parameters for [`run`]. -pub struct Params { - pub create_inherent_data_providers: CIDP, - pub block_import: BI, - pub para_client: Arc, - pub relay_client: Arc, - pub sync_oracle: SO, - pub keystore: KeystorePtr, - pub key: CollatorPair, - pub para_id: ParaId, - pub overseer_handle: OverseerHandle, - pub slot_duration: SlotDuration, - pub relay_chain_slot_duration: SlotDuration, - pub proposer: Proposer, - pub collator_service: CS, -} - -/// Run bare Aura consensus as a relay-chain-driven collator. -pub async fn run( - params: Params, -) where - Block: BlockT, - Client: ProvideRuntimeApi - + BlockOf - + AuxStore - + HeaderBackend - + BlockBackend - + Send - + Sync - + 'static, - Client::Api: AuraApi + CollectCollationInfo, - RClient: RelayChainInterface, - CIDP: CreateInherentDataProviders + 'static, - BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, - SO: SyncOracle + Send + Sync + Clone + 'static, - Proposer: ProposerInterface, - Proposer::Transaction: Sync, - CS: CollatorServiceInterface, - P: Pair, - P::Public: AppPublic + Member, - P::Signature: TryFrom> + Member + Codec, -{ - let mut collation_requests = cumulus_client_collator::relay_chain_driven::init( - params.key, - params.para_id, - params.overseer_handle, - ) - .await; - - let mut collator = { - let params = collator_util::Params { - create_inherent_data_providers: params.create_inherent_data_providers, - block_import: params.block_import, - relay_client: params.relay_client.clone(), - keystore: params.keystore.clone(), - para_id: params.para_id, - proposer: params.proposer, - collator_service: params.collator_service, - }; - - collator_util::Collator::::new(params) - }; - - while let Some(request) = collation_requests.next().await { - macro_rules! reject_with_error { - ($err:expr) => {{ - request.complete(None); - tracing::error!(target: crate::LOG_TARGET, err = ?{ $err }); - continue; - }}; - } - - macro_rules! try_request { - ($x:expr) => {{ - match $x { - Ok(x) => x, - Err(e) => reject_with_error!(e), - } - }}; - } - - let validation_data = request.persisted_validation_data(); - - let parent_header = - try_request!(Block::Header::decode(&mut &validation_data.parent_head.0[..])); - - let parent_hash = parent_header.hash(); - - if !collator.collator_service().check_block_status(parent_hash, &parent_header) { - continue - } - - let relay_parent_header = - match params.relay_client.header(RBlockId::hash(*request.relay_parent())).await { - Err(e) => reject_with_error!(e), - Ok(None) => continue, // sanity: would be inconsistent to get `None` here - Ok(Some(h)) => h, - }; - - let claim = match collator_util::claim_slot::<_, _, P>( - &*params.para_client, - parent_hash, - &relay_parent_header, - params.slot_duration, - params.relay_chain_slot_duration, - ¶ms.keystore, - ) - .await - { - Ok(None) => continue, - Ok(Some(c)) => c, - Err(e) => reject_with_error!(e), - }; - - let (parachain_inherent_data, other_inherent_data) = try_request!( - collator - .create_inherent_data( - *request.relay_parent(), - &validation_data, - parent_hash, - claim.timestamp(), - ) - .await - ); - - let (collation, _, post_hash) = try_request!( - collator - .collate( - &parent_header, - &claim, - None, - (parachain_inherent_data, other_inherent_data), - // TODO [https://github.com/paritytech/cumulus/issues/2439] - // We should call out to a pluggable interface that provides - // the proposal duration. - Duration::from_millis(500), - // Set the block limit to 50% of the maximum PoV size. - // - // TODO: If we got benchmarking that includes the proof size, - // we should be able to use the maximum pov size. - (validation_data.max_pov_size / 2) as usize, - ) - .await - ); - - let result_sender = Some(collator.collator_service().announce_with_barrier(post_hash)); - request.complete(Some(CollationResult { collation, result_sender })); - } -} diff --git a/cumulus/client/consensus/aura/src/collators/lookahead.rs b/cumulus/client/consensus/aura/src/collators/lookahead.rs deleted file mode 100644 index 67c3ab4cc55d..000000000000 --- a/cumulus/client/consensus/aura/src/collators/lookahead.rs +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! A collator for Aura that looks ahead of the most recently included parachain block -//! when determining what to build upon. -//! -//! This collator also builds additional blocks when the maximum backlog is not saturated. -//! The size of the backlog is determined by invoking a runtime API. If that runtime API -//! is not supported, this assumes a maximum backlog size of 1. -//! -//! This takes more advantage of asynchronous backing, though not complete advantage. -//! When the backlog is not saturated, this approach lets the backlog temporarily 'catch up' -//! with periods of higher throughput. When the backlog is saturated, we typically -//! fall back to the limited cadence of a single parachain block per relay-chain block. -//! -//! Despite this, the fact that there is a backlog at all allows us to spend more time -//! building the block, as there is some buffer before it can get posted to the relay-chain. -//! The main limitation is block propagation time - i.e. the new blocks created by an author -//! must be propagated to the next author before their turn. - -use codec::{Codec, Encode}; -use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface; -use cumulus_client_consensus_common::{ - self as consensus_common, ParachainBlockImportMarker, ParentSearchParams, -}; -use cumulus_client_consensus_proposer::ProposerInterface; -use cumulus_primitives_aura::AuraUnincludedSegmentApi; -use cumulus_primitives_core::{ - relay_chain::Hash as PHash, CollectCollationInfo, PersistedValidationData, -}; -use cumulus_relay_chain_interface::RelayChainInterface; - -use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{CollatorPair, Id as ParaId, OccupiedCoreAssumption}; - -use futures::prelude::*; -use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf}; -use sc_consensus::BlockImport; -use sc_consensus_aura::standalone as aura_internal; -use sp_api::ProvideRuntimeApi; -use sp_application_crypto::AppPublic; -use sp_blockchain::HeaderBackend; -use sp_consensus::SyncOracle; -use sp_consensus_aura::{AuraApi, Slot, SlotDuration}; -use sp_core::crypto::Pair; -use sp_inherents::CreateInherentDataProviders; -use sp_keystore::KeystorePtr; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member}; -use sp_timestamp::Timestamp; -use std::{convert::TryFrom, sync::Arc, time::Duration}; - -use crate::collator::{self as collator_util, SlotClaim}; - -/// Parameters for [`run`]. -pub struct Params { - pub create_inherent_data_providers: CIDP, - pub block_import: BI, - pub para_client: Arc, - pub para_backend: Arc, - pub relay_client: Arc, - pub sync_oracle: SO, - pub keystore: KeystorePtr, - pub key: CollatorPair, - pub para_id: ParaId, - pub overseer_handle: OverseerHandle, - pub slot_duration: SlotDuration, - pub relay_chain_slot_duration: SlotDuration, - pub proposer: Proposer, - pub collator_service: CS, - pub authoring_duration: Duration, -} - -/// Run async-backing-friendly Aura. -pub async fn run( - params: Params, -) where - Block: BlockT, - Client: ProvideRuntimeApi - + BlockOf - + AuxStore - + HeaderBackend - + BlockBackend - + Send - + Sync - + 'static, - Client::Api: - AuraApi + CollectCollationInfo + AuraUnincludedSegmentApi, - Backend: sp_blockchain::Backend, - RClient: RelayChainInterface, - CIDP: CreateInherentDataProviders + 'static, - BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, - SO: SyncOracle + Send + Sync + Clone + 'static, - Proposer: ProposerInterface, - Proposer::Transaction: Sync, - CS: CollatorServiceInterface, - P: Pair, - P::Public: AppPublic + Member, - P::Signature: TryFrom> + Member + Codec, -{ - // This is an arbitrary value which is likely guaranteed to exceed any reasonable - // limit, as it would correspond to 10 non-included blocks. - // - // Since we only search for parent blocks which have already been imported, - // we can guarantee that all imported blocks respect the unincluded segment - // rules specified by the parachain's runtime and thus will never be too deep. - const PARENT_SEARCH_DEPTH: usize = 10; - - let mut import_notifications = match params.relay_client.import_notification_stream().await { - Ok(s) => s, - Err(err) => { - tracing::error!( - target: crate::LOG_TARGET, - ?err, - "Failed to initialize consensus: no relay chain import notification stream" - ); - - return - }, - }; - - let mut collator = { - let params = collator_util::Params { - create_inherent_data_providers: params.create_inherent_data_providers, - block_import: params.block_import, - relay_client: params.relay_client.clone(), - keystore: params.keystore.clone(), - para_id: params.para_id, - proposer: params.proposer, - collator_service: params.collator_service, - }; - - collator_util::Collator::::new(params) - }; - - while let Some(relay_parent_header) = import_notifications.next().await { - let relay_parent = relay_parent_header.hash(); - - let max_pov_size = match params - .relay_client - .persisted_validation_data( - relay_parent, - params.para_id, - OccupiedCoreAssumption::Included, - ) - .await - { - Ok(None) => continue, - Ok(Some(pvd)) => pvd.max_pov_size, - Err(err) => { - tracing::error!(target: crate::LOG_TARGET, ?err, "Failed to gather information from relay-client"); - continue - }, - }; - - let (slot_now, timestamp) = match consensus_common::relay_slot_and_timestamp( - &relay_parent_header, - params.relay_chain_slot_duration, - ) { - None => continue, - Some((_, t)) => (Slot::from_timestamp(t, params.slot_duration), t), - }; - - let parent_search_params = ParentSearchParams { - relay_parent, - para_id: params.para_id, - ancestry_lookback: max_ancestry_lookback(relay_parent, ¶ms.relay_client).await, - max_depth: PARENT_SEARCH_DEPTH, - ignore_alternative_branches: true, - }; - - let potential_parents = cumulus_client_consensus_common::find_potential_parents::( - parent_search_params, - &*params.para_backend, - ¶ms.relay_client, - ) - .await; - - let mut potential_parents = match potential_parents { - Err(e) => { - tracing::error!( - target: crate::LOG_TARGET, - ?relay_parent, - err = ?e, - "Could not fetch potential parents to build upon" - ); - - continue - }, - Ok(x) => x, - }; - - let included_block = match potential_parents.iter().find(|x| x.depth == 0) { - None => continue, // also serves as an `is_empty` check. - Some(b) => b.hash, - }; - - let para_client = &*params.para_client; - let keystore = ¶ms.keystore; - let can_build_upon = |block_hash| { - can_build_upon::<_, _, P>( - slot_now, - timestamp, - block_hash, - included_block, - para_client, - &keystore, - ) - }; - - // Sort by depth, ascending, to choose the longest chain. - // - // If the longest chain has space, build upon that. Otherwise, don't - // build at all. - potential_parents.sort_by_key(|a| a.depth); - let initial_parent = match potential_parents.pop() { - None => continue, - Some(p) => p, - }; - - // Build in a loop until not allowed. Note that the authorities can change - // at any block, so we need to re-claim our slot every time. - let mut parent_hash = initial_parent.hash; - let mut parent_header = initial_parent.header; - loop { - let slot_claim = match can_build_upon(parent_hash).await { - None => break, - Some(c) => c, - }; - - let validation_data = PersistedValidationData { - parent_head: parent_header.encode().into(), - relay_parent_number: *relay_parent_header.number(), - relay_parent_storage_root: *relay_parent_header.state_root(), - max_pov_size, - }; - - // Build and announce collations recursively until - // `can_build_upon` fails or building a collation fails. - let (parachain_inherent_data, other_inherent_data) = match collator - .create_inherent_data( - relay_parent, - &validation_data, - parent_hash, - slot_claim.timestamp(), - ) - .await - { - Err(err) => { - tracing::error!(target: crate::LOG_TARGET, ?err); - break - }, - Ok(x) => x, - }; - - match collator - .collate( - &parent_header, - &slot_claim, - None, - (parachain_inherent_data, other_inherent_data), - params.authoring_duration, - // Set the block limit to 50% of the maximum PoV size. - // - // TODO: If we got benchmarking that includes the proof size, - // we should be able to use the maximum pov size. - (validation_data.max_pov_size / 2) as usize, - ) - .await - { - Ok((_collation, block_data, new_block_hash)) => { - parent_hash = new_block_hash; - parent_header = block_data.into_header(); - - // Here we are assuming that the import logic protects against equivocations - // and provides sybil-resistance, as it should. - collator.collator_service().announce_block(new_block_hash, None); - - // TODO [https://github.com/paritytech/polkadot/issues/5056]: - // announce collation to relay-chain validators. - }, - Err(err) => { - tracing::error!(target: crate::LOG_TARGET, ?err); - break - }, - } - } - } -} - -// Checks if we own the slot at the given block and whether there -// is space in the unincluded segment. -async fn can_build_upon( - slot: Slot, - timestamp: Timestamp, - parent_hash: Block::Hash, - included_block: Block::Hash, - client: &Client, - keystore: &KeystorePtr, -) -> Option> -where - Client: ProvideRuntimeApi, - Client::Api: AuraApi + AuraUnincludedSegmentApi, - P: Pair, - P::Public: Codec, - P::Signature: Codec, -{ - let runtime_api = client.runtime_api(); - let authorities = runtime_api.authorities(parent_hash).ok()?; - let author_pub = aura_internal::claim_slot::

(slot, &authorities, keystore).await?; - - // Here we lean on the property that building on an empty unincluded segment must always - // be legal. Skipping the runtime API query here allows us to seamlessly run this - // collator against chains which have not yet upgraded their runtime. - if parent_hash != included_block { - runtime_api.can_build_upon(parent_hash, included_block, slot).ok()?; - } - - Some(SlotClaim::unchecked::

(author_pub, slot, timestamp)) -} - -async fn max_ancestry_lookback( - _relay_parent: PHash, - _relay_client: &impl RelayChainInterface, -) -> usize { - // TODO [https://github.com/paritytech/cumulus/issues/2706] - // We need to read the relay-chain state to know what the maximum - // age truly is, but that depends on those pallets existing. - // - // For now, just provide the conservative value of '2'. - // Overestimating can cause problems, as we'd be building on forks of the - // chain that can never get included. Underestimating is less of an issue. - 2 -} diff --git a/cumulus/client/consensus/aura/src/collators/mod.rs b/cumulus/client/consensus/aura/src/collators/mod.rs deleted file mode 100644 index 55128dfdc850..000000000000 --- a/cumulus/client/consensus/aura/src/collators/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Stock, pure Aura collators. -//! -//! This includes the [`basic`] collator, which only builds on top of the most recently -//! included parachain block, as well as the [`lookahead`] collator, which prospectively -//! builds on parachain blocks which have not yet been included in the relay chain. - -pub mod basic; -pub mod lookahead; diff --git a/cumulus/client/consensus/aura/src/equivocation_import_queue.rs b/cumulus/client/consensus/aura/src/equivocation_import_queue.rs deleted file mode 100644 index 4d137db5c5e1..000000000000 --- a/cumulus/client/consensus/aura/src/equivocation_import_queue.rs +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -/// An import queue which provides some equivocation resistance with lenient trait bounds. -/// -/// Equivocation resistance in general is a hard problem, as different nodes in the network -/// may see equivocations in a different order, and therefore may not agree on which blocks -/// should be thrown out and which ones should be kept. -use codec::Codec; -use cumulus_client_consensus_common::ParachainBlockImportMarker; -use lru::LruCache; - -use sc_consensus::{ - import_queue::{BasicQueue, Verifier as VerifierT}, - BlockImport, BlockImportParams, ForkChoiceStrategy, -}; -use sc_consensus_aura::standalone as aura_internal; -use sc_telemetry::{telemetry, TelemetryHandle, CONSENSUS_DEBUG, CONSENSUS_TRACE}; -use sp_api::ProvideRuntimeApi; -use sp_block_builder::BlockBuilder as BlockBuilderApi; -use sp_consensus::error::Error as ConsensusError; -use sp_consensus_aura::{AuraApi, Slot, SlotDuration}; -use sp_core::crypto::Pair; -use sp_inherents::{CreateInherentDataProviders, InherentDataProvider}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; -use std::{fmt::Debug, num::NonZeroUsize, sync::Arc}; - -const LRU_WINDOW: usize = 256; -const EQUIVOCATION_LIMIT: usize = 16; - -struct NaiveEquivocationDefender { - cache: LruCache, -} - -impl Default for NaiveEquivocationDefender { - fn default() -> Self { - NaiveEquivocationDefender { - cache: LruCache::new(NonZeroUsize::new(LRU_WINDOW).expect("window > 0; qed")), - } - } -} - -impl NaiveEquivocationDefender { - // return `true` if equivocation is beyond the limit. - fn insert_and_check(&mut self, slot: Slot) -> bool { - let val = self.cache.get_or_insert_mut(*slot, || 0); - if *val == EQUIVOCATION_LIMIT { - true - } else { - *val += 1; - false - } - } -} - -struct Verifier { - client: Arc, - create_inherent_data_providers: CIDP, - slot_duration: SlotDuration, - defender: NaiveEquivocationDefender, - telemetry: Option, - _phantom: std::marker::PhantomData (Block, P)>, -} - -#[async_trait::async_trait] -impl VerifierT for Verifier -where - P: Pair, - P::Signature: Codec, - P::Public: Codec + Debug, - Block: BlockT, - Client: ProvideRuntimeApi + Send + Sync, - >::Api: BlockBuilderApi + AuraApi, - - CIDP: CreateInherentDataProviders, -{ - async fn verify( - &mut self, - mut block_params: BlockImportParams, - ) -> Result, String> { - // Skip checks that include execution, if being told so, or when importing only state. - // - // This is done for example when gap syncing and it is expected that the block after the gap - // was checked/chosen properly, e.g. by warp syncing to this block using a finality proof. - if block_params.state_action.skip_execution_checks() || block_params.with_state() { - return Ok(block_params) - } - - let post_hash = block_params.header.hash(); - let parent_hash = *block_params.header.parent_hash(); - - // check seal and update pre-hash/post-hash - { - let authorities = aura_internal::fetch_authorities(self.client.as_ref(), parent_hash) - .map_err(|e| { - format!("Could not fetch authorities at {:?}: {}", parent_hash, e) - })?; - - let slot_now = slot_now(self.slot_duration); - let res = aura_internal::check_header_slot_and_seal::( - slot_now, - block_params.header, - &authorities, - ); - - match res { - Ok((pre_header, slot, seal_digest)) => { - telemetry!( - self.telemetry; - CONSENSUS_TRACE; - "aura.checked_and_importing"; - "pre_header" => ?pre_header, - ); - - block_params.header = pre_header; - block_params.post_digests.push(seal_digest); - block_params.fork_choice = Some(ForkChoiceStrategy::LongestChain); - block_params.post_hash = Some(post_hash); - - // Check for and reject egregious amounts of equivocations. - if self.defender.insert_and_check(slot) { - return Err(format!( - "Rejecting block {:?} due to excessive equivocations at slot", - post_hash, - )) - } - }, - Err(aura_internal::SealVerificationError::Deferred(hdr, slot)) => { - telemetry!( - self.telemetry; - CONSENSUS_DEBUG; - "aura.header_too_far_in_future"; - "hash" => ?post_hash, - "a" => ?hdr, - "b" => ?slot, - ); - - return Err(format!( - "Rejecting block ({:?}) from future slot {:?}", - post_hash, slot - )) - }, - Err(e) => - return Err(format!( - "Rejecting block ({:?}) with invalid seal ({:?})", - post_hash, e - )), - } - } - - // check inherents. - if let Some(body) = block_params.body.clone() { - let block = Block::new(block_params.header.clone(), body); - let create_inherent_data_providers = self - .create_inherent_data_providers - .create_inherent_data_providers(parent_hash, ()) - .await - .map_err(|e| format!("Could not create inherent data {:?}", e))?; - - let inherent_data = create_inherent_data_providers - .create_inherent_data() - .await - .map_err(|e| format!("Could not create inherent data {:?}", e))?; - - let inherent_res = self - .client - .runtime_api() - .check_inherents(parent_hash, block, inherent_data) - .map_err(|e| format!("Unable to check block inherents {:?}", e))?; - - if !inherent_res.ok() { - for (i, e) in inherent_res.into_errors() { - match create_inherent_data_providers.try_handle_error(&i, &e).await { - Some(res) => res.map_err(|e| format!("Inherent Error {:?}", e))?, - None => - return Err(format!( - "Unknown inherent error, source {:?}", - String::from_utf8_lossy(&i[..]) - )), - } - } - } - } - - Ok(block_params) - } -} - -fn slot_now(slot_duration: SlotDuration) -> Slot { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time().timestamp(); - Slot::from_timestamp(timestamp, slot_duration) -} - -/// Start an import queue for a Cumulus node which checks blocks' seals and inherent data. -/// -/// Pass in only inherent data providers which don't include aura or parachain consensus inherents, -/// e.g. things like timestamp and custom inherents for the runtime. -/// -/// The others are generated explicitly internally. -/// -/// This should only be used for runtimes where the runtime does not check all inherents and -/// seals in `execute_block` (see ) -pub fn fully_verifying_import_queue( - client: Arc, - block_import: I, - create_inherent_data_providers: CIDP, - slot_duration: SlotDuration, - spawner: &impl sp_core::traits::SpawnEssentialNamed, - registry: Option<&substrate_prometheus_endpoint::Registry>, - telemetry: Option, -) -> BasicQueue -where - P: Pair + 'static, - P::Signature: Codec, - P::Public: Codec + Debug, - I: BlockImport - + ParachainBlockImportMarker - + Send - + Sync - + 'static, - I::Transaction: Send, - Client: ProvideRuntimeApi + Send + Sync + 'static, - >::Api: BlockBuilderApi + AuraApi, - CIDP: CreateInherentDataProviders + 'static, -{ - let verifier = Verifier:: { - client, - create_inherent_data_providers, - defender: NaiveEquivocationDefender::default(), - slot_duration, - telemetry, - _phantom: std::marker::PhantomData, - }; - - BasicQueue::new(verifier, Box::new(block_import), None, spawner, registry) -} diff --git a/cumulus/client/consensus/aura/src/import_queue.rs b/cumulus/client/consensus/aura/src/import_queue.rs deleted file mode 100644 index b44972843377..000000000000 --- a/cumulus/client/consensus/aura/src/import_queue.rs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Parachain specific wrapper for the AuRa import queue. - -use codec::Codec; -use cumulus_client_consensus_common::ParachainBlockImportMarker; -use sc_client_api::{backend::AuxStore, BlockOf, UsageProvider}; -use sc_consensus::{import_queue::DefaultImportQueue, BlockImport}; -use sc_consensus_aura::{AuraVerifier, CompatibilityMode}; -use sc_consensus_slots::InherentDataProviderExt; -use sc_telemetry::TelemetryHandle; -use sp_api::{ApiExt, ProvideRuntimeApi}; -use sp_block_builder::BlockBuilder as BlockBuilderApi; -use sp_blockchain::HeaderBackend; -use sp_consensus::Error as ConsensusError; -use sp_consensus_aura::AuraApi; -use sp_core::crypto::Pair; -use sp_inherents::CreateInherentDataProviders; -use sp_runtime::traits::Block as BlockT; -use std::{fmt::Debug, sync::Arc}; -use substrate_prometheus_endpoint::Registry; - -/// Parameters for [`import_queue`]. -pub struct ImportQueueParams<'a, I, C, CIDP, S> { - /// The block import to use. - pub block_import: I, - /// The client to interact with the chain. - pub client: Arc, - /// The inherent data providers, to create the inherent data. - pub create_inherent_data_providers: CIDP, - /// The spawner to spawn background tasks. - pub spawner: &'a S, - /// The prometheus registry. - pub registry: Option<&'a Registry>, - /// The telemetry handle. - pub telemetry: Option, -} - -/// Start an import queue for the Aura consensus algorithm. -pub fn import_queue( - ImportQueueParams { - block_import, - client, - create_inherent_data_providers, - spawner, - registry, - telemetry, - }: ImportQueueParams<'_, I, C, CIDP, S>, -) -> Result, sp_consensus::Error> -where - Block: BlockT, - C::Api: BlockBuilderApi + AuraApi + ApiExt, - C: 'static - + ProvideRuntimeApi - + BlockOf - + Send - + Sync - + AuxStore - + UsageProvider - + HeaderBackend, - I: BlockImport> - + ParachainBlockImportMarker - + Send - + Sync - + 'static, - P: Pair + 'static, - P::Public: Debug + Codec, - P::Signature: Codec, - S: sp_core::traits::SpawnEssentialNamed, - CIDP: CreateInherentDataProviders + Sync + Send + 'static, - CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, -{ - sc_consensus_aura::import_queue::(sc_consensus_aura::ImportQueueParams { - block_import, - justification_import: None, - client, - create_inherent_data_providers, - spawner, - registry, - check_for_equivocation: sc_consensus_aura::CheckForEquivocation::No, - telemetry, - compatibility_mode: CompatibilityMode::None, - }) -} - -/// Parameters of [`build_verifier`]. -pub struct BuildVerifierParams { - /// The client to interact with the chain. - pub client: Arc, - /// The inherent data providers, to create the inherent data. - pub create_inherent_data_providers: CIDP, - /// The telemetry handle. - pub telemetry: Option, -} - -/// Build the [`AuraVerifier`]. -pub fn build_verifier( - BuildVerifierParams { client, create_inherent_data_providers, telemetry }: BuildVerifierParams< - C, - CIDP, - >, -) -> AuraVerifier { - sc_consensus_aura::build_verifier(sc_consensus_aura::BuildVerifierParams { - client, - create_inherent_data_providers, - telemetry, - check_for_equivocation: sc_consensus_aura::CheckForEquivocation::No, - compatibility_mode: CompatibilityMode::None, - }) -} diff --git a/cumulus/client/consensus/aura/src/lib.rs b/cumulus/client/consensus/aura/src/lib.rs deleted file mode 100644 index 1e29c656e978..000000000000 --- a/cumulus/client/consensus/aura/src/lib.rs +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The AuRa consensus algorithm for parachains. -//! -//! This extends the Substrate provided AuRa consensus implementation to make it compatible for -//! parachains. The main entry points for of this consensus algorithm are [`AuraConsensus::build`] -//! and [`fn@import_queue`]. -//! -//! For more information about AuRa, the Substrate crate should be checked. - -use codec::Codec; -use cumulus_client_consensus_common::{ - ParachainBlockImportMarker, ParachainCandidate, ParachainConsensus, -}; -use cumulus_primitives_core::{relay_chain::Hash as PHash, PersistedValidationData}; - -use futures::lock::Mutex; -use sc_client_api::{backend::AuxStore, BlockOf}; -use sc_consensus::BlockImport; -use sc_consensus_slots::{BackoffAuthoringBlocksStrategy, SimpleSlotWorker, SlotInfo}; -use sc_telemetry::TelemetryHandle; -use sp_api::ProvideRuntimeApi; -use sp_application_crypto::AppPublic; -use sp_blockchain::HeaderBackend; -use sp_consensus::{EnableProofRecording, Environment, ProofRecording, Proposer, SyncOracle}; -use sp_consensus_aura::{AuraApi, SlotDuration}; -use sp_core::crypto::Pair; -use sp_inherents::CreateInherentDataProviders; -use sp_keystore::KeystorePtr; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member, NumberFor}; -use std::{convert::TryFrom, marker::PhantomData, sync::Arc}; - -mod import_queue; - -pub use import_queue::{build_verifier, import_queue, BuildVerifierParams, ImportQueueParams}; -pub use sc_consensus_aura::{slot_duration, AuraVerifier, BuildAuraWorkerParams, SlotProportion}; -pub use sc_consensus_slots::InherentDataProviderExt; - -pub mod collator; -pub mod collators; -pub mod equivocation_import_queue; - -const LOG_TARGET: &str = "aura::cumulus"; - -/// The implementation of the AURA consensus for parachains. -pub struct AuraConsensus { - create_inherent_data_providers: Arc, - aura_worker: Arc>, - slot_duration: SlotDuration, - _phantom: PhantomData, -} - -impl Clone for AuraConsensus { - fn clone(&self) -> Self { - Self { - create_inherent_data_providers: self.create_inherent_data_providers.clone(), - aura_worker: self.aura_worker.clone(), - slot_duration: self.slot_duration, - _phantom: PhantomData, - } - } -} - -/// Parameters of [`AuraConsensus::build`]. -pub struct BuildAuraConsensusParams { - pub proposer_factory: PF, - pub create_inherent_data_providers: CIDP, - pub block_import: BI, - pub para_client: Arc, - pub backoff_authoring_blocks: Option, - pub sync_oracle: SO, - pub keystore: KeystorePtr, - pub force_authoring: bool, - pub slot_duration: SlotDuration, - pub telemetry: Option, - pub block_proposal_slot_portion: SlotProportion, - pub max_block_proposal_slot_portion: Option, -} - -impl AuraConsensus -where - B: BlockT, - CIDP: CreateInherentDataProviders + 'static, - CIDP::InherentDataProviders: InherentDataProviderExt, -{ - /// Create a new boxed instance of AURA consensus. - pub fn build( - BuildAuraConsensusParams { - proposer_factory, - create_inherent_data_providers, - block_import, - para_client, - backoff_authoring_blocks, - sync_oracle, - keystore, - force_authoring, - slot_duration, - telemetry, - block_proposal_slot_portion, - max_block_proposal_slot_portion, - }: BuildAuraConsensusParams, - ) -> Box> - where - Client: - ProvideRuntimeApi + BlockOf + AuxStore + HeaderBackend + Send + Sync + 'static, - Client::Api: AuraApi, - BI: BlockImport> - + ParachainBlockImportMarker - + Send - + Sync - + 'static, - SO: SyncOracle + Send + Sync + Clone + 'static, - BS: BackoffAuthoringBlocksStrategy> + Send + Sync + 'static, - PF: Environment + Send + Sync + 'static, - PF::Proposer: Proposer< - B, - Error = Error, - Transaction = sp_api::TransactionFor, - ProofRecording = EnableProofRecording, - Proof = ::Proof, - >, - Error: std::error::Error + Send + From + 'static, - P: Pair + 'static, - P::Public: AppPublic + Member + Codec, - P::Signature: TryFrom> + Member + Codec, - { - let worker = sc_consensus_aura::build_aura_worker::( - BuildAuraWorkerParams { - client: para_client, - block_import, - justification_sync_link: (), - proposer_factory, - sync_oracle, - force_authoring, - backoff_authoring_blocks, - keystore, - telemetry, - block_proposal_slot_portion, - max_block_proposal_slot_portion, - compatibility_mode: sc_consensus_aura::CompatibilityMode::None, - }, - ); - - Box::new(AuraConsensus { - create_inherent_data_providers: Arc::new(create_inherent_data_providers), - aura_worker: Arc::new(Mutex::new(worker)), - slot_duration, - _phantom: PhantomData, - }) - } -} - -impl AuraConsensus -where - B: BlockT, - CIDP: CreateInherentDataProviders + 'static, - CIDP::InherentDataProviders: InherentDataProviderExt, -{ - /// Create the inherent data. - /// - /// Returns the created inherent data and the inherent data providers used. - async fn inherent_data( - &self, - parent: B::Hash, - validation_data: &PersistedValidationData, - relay_parent: PHash, - ) -> Option { - self.create_inherent_data_providers - .create_inherent_data_providers(parent, (relay_parent, validation_data.clone())) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Failed to create inherent data providers.", - ) - }) - .ok() - } -} - -#[async_trait::async_trait] -impl ParachainConsensus for AuraConsensus -where - B: BlockT, - CIDP: CreateInherentDataProviders + Send + Sync + 'static, - CIDP::InherentDataProviders: InherentDataProviderExt + Send, - W: SimpleSlotWorker + Send + Sync, - W::Proposer: Proposer::Proof>, -{ - async fn produce_candidate( - &mut self, - parent: &B::Header, - relay_parent: PHash, - validation_data: &PersistedValidationData, - ) -> Option> { - let inherent_data_providers = - self.inherent_data(parent.hash(), validation_data, relay_parent).await?; - - let info = SlotInfo::new( - inherent_data_providers.slot(), - Box::new(inherent_data_providers), - self.slot_duration.as_duration(), - parent.clone(), - // Set the block limit to 50% of the maximum PoV size. - // - // TODO: If we got benchmarking that includes the proof size, - // we should be able to use the maximum pov size. - Some((validation_data.max_pov_size / 2) as usize), - ); - - let res = self.aura_worker.lock().await.on_slot(info).await?; - - Some(ParachainCandidate { block: res.block, proof: res.storage_proof }) - } -} diff --git a/cumulus/client/consensus/common/Cargo.toml b/cumulus/client/consensus/common/Cargo.toml deleted file mode 100644 index 7029dac0b7ff..000000000000 --- a/cumulus/client/consensus/common/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "cumulus-client-consensus-common" -description = "Cumulus specific common consensus implementations" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -async-trait = "0.1.73" -codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -dyn-clone = "1.0.12" -futures = "0.3.28" -log = "0.4.20" -tracing = "0.1.37" - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-slots = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../../primitives/core" } -cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } -cumulus-client-pov-recovery = { path = "../../pov-recovery" } -schnellru = "0.2.1" - -[dev-dependencies] -futures-timer = "3.0.2" - -# Substrate -sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Cumulus -cumulus-test-client = { path = "../../../test/client" } diff --git a/cumulus/client/consensus/common/src/import_queue.rs b/cumulus/client/consensus/common/src/import_queue.rs deleted file mode 100644 index 948fe065c425..000000000000 --- a/cumulus/client/consensus/common/src/import_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! (unstable) Composable utilities for constructing import queues for parachains. -//! -//! Unlike standalone chains, parachains have the requirement that all consensus logic -//! must be checked within the runtime. This property means that work which is normally -//! done in the import queue per-block, such as checking signatures, quorums, and whether -//! inherent extrinsics were constructed faithfully do not need to be done, per se. -//! -//! It may seem that it would be beneficial for the client to do these checks regardless, -//! but in practice this means that clients would just reject blocks which are _valid_ according -//! to their Parachain Validation Function, which is the ultimate source of consensus truth. -//! -//! However, parachain runtimes expose two different access points for executing blocks -//! in full nodes versus executing those blocks in the parachain validation environment. -//! At the time of writing, the inherent and consensus checks in most Cumulus runtimes -//! are only performed during parachain validation, not full node block execution. -//! -//! See for details. - -use sp_consensus::error::Error as ConsensusError; -use sp_runtime::traits::Block as BlockT; - -use sc_consensus::{ - block_import::{BlockImport, BlockImportParams}, - import_queue::{BasicQueue, Verifier}, -}; - -use crate::ParachainBlockImportMarker; - -/// A [`Verifier`] for blocks which verifies absolutely nothing. -/// -/// This should only be used when the runtime is responsible for checking block seals and inherents. -pub struct VerifyNothing; - -#[async_trait::async_trait] -impl Verifier for VerifyNothing { - async fn verify( - &mut self, - params: BlockImportParams, - ) -> Result, String> { - Ok(params) - } -} - -/// An import queue which does no verification. -/// -/// This should only be used when the runtime is responsible for checking block seals and inherents. -pub fn verify_nothing_import_queue( - block_import: I, - spawner: &impl sp_core::traits::SpawnEssentialNamed, - registry: Option<&substrate_prometheus_endpoint::Registry>, -) -> BasicQueue -where - I: BlockImport - + ParachainBlockImportMarker - + Send - + Sync - + 'static, - I::Transaction: Send, -{ - BasicQueue::new(VerifyNothing, Box::new(block_import), None, spawner, registry) -} diff --git a/cumulus/client/consensus/common/src/level_monitor.rs b/cumulus/client/consensus/common/src/level_monitor.rs deleted file mode 100644 index 8a6bbef62f35..000000000000 --- a/cumulus/client/consensus/common/src/level_monitor.rs +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use sc_client_api::{blockchain::Backend as _, Backend, HeaderBackend as _}; -use sp_blockchain::{HashAndNumber, HeaderMetadata, TreeRoute}; -use sp_runtime::traits::{Block as BlockT, NumberFor, One, Saturating, UniqueSaturatedInto, Zero}; -use std::{ - collections::{HashMap, HashSet}, - sync::Arc, -}; - -const LOG_TARGET: &str = "level-monitor"; - -/// Value good enough to be used with parachains using the current backend implementation -/// that ships with Substrate. This value may change in the future. -pub const MAX_LEAVES_PER_LEVEL_SENSIBLE_DEFAULT: usize = 32; - -// Counter threshold after which we are going to eventually cleanup our internal data. -const CLEANUP_THRESHOLD: u32 = 32; - -/// Upper bound to the number of leaves allowed for each level of the blockchain. -/// -/// If the limit is set and more leaves are detected on block import, then the older ones are -/// dropped to make space for the fresh blocks. -/// -/// In environments where blocks confirmations from the relay chain may be "slow", then -/// setting an upper bound helps keeping the chain health by dropping old (presumably) stale -/// leaves and prevents discarding new blocks because we've reached the backend max value. -pub enum LevelLimit { - /// Limit set to [`MAX_LEAVES_PER_LEVEL_SENSIBLE_DEFAULT`]. - Default, - /// No explicit limit, however a limit may be implicitly imposed by the backend implementation. - None, - /// Custom value. - Some(usize), -} - -/// Support structure to constrain the number of leaves at each level. -pub struct LevelMonitor { - /// Max number of leaves for each level. - level_limit: usize, - /// Monotonic counter used to keep track of block freshness. - pub(crate) import_counter: NumberFor, - /// Map between blocks hashes and freshness. - pub(crate) freshness: HashMap>, - /// Blockchain levels cache. - pub(crate) levels: HashMap, HashSet>, - /// Lower level number stored by the levels map. - lowest_level: NumberFor, - /// Backend reference to remove blocks on level saturation. - backend: Arc, -} - -/// Contains information about the target scheduled for removal. -struct TargetInfo { - /// Index of freshest leaf in the leaves array. - freshest_leaf_idx: usize, - /// Route from target to its freshest leaf. - freshest_route: TreeRoute, -} - -impl LevelMonitor -where - Block: BlockT, - BE: Backend, -{ - /// Instance a new monitor structure. - pub fn new(level_limit: usize, backend: Arc) -> Self { - let mut monitor = LevelMonitor { - level_limit, - import_counter: Zero::zero(), - freshness: HashMap::new(), - levels: HashMap::new(), - lowest_level: Zero::zero(), - backend, - }; - monitor.restore(); - monitor - } - - /// Restore the structure using the backend. - /// - /// Blocks freshness values are inferred from the height and not from the effective import - /// moment. This is a not accurate but "good-enough" best effort solution. - /// - /// Level limits are not enforced during this phase. - fn restore(&mut self) { - const ERR_MSG: &str = "route from finalized to leaf should be available; qed"; - let info = self.backend.blockchain().info(); - - log::debug!( - target: LOG_TARGET, - "Restoring chain level monitor from last finalized block: {} {}", - info.finalized_number, - info.finalized_hash - ); - - self.lowest_level = info.finalized_number; - self.import_counter = info.finalized_number; - - for leaf in self.backend.blockchain().leaves().unwrap_or_default() { - let mut meta = self.backend.blockchain().header_metadata(leaf).expect(ERR_MSG); - - self.import_counter = self.import_counter.max(meta.number); - - // Populate the monitor until we don't hit an already imported branch - while !self.freshness.contains_key(&meta.hash) { - self.freshness.insert(meta.hash, meta.number); - self.levels.entry(meta.number).or_default().insert(meta.hash); - if meta.number <= self.lowest_level { - break - } - meta = self.backend.blockchain().header_metadata(meta.parent).expect(ERR_MSG); - } - } - - log::debug!( - target: LOG_TARGET, - "Restored chain level monitor up to height {}", - self.import_counter - ); - } - - /// Check and enforce the limit bound at the given height. - /// - /// In practice this will enforce the given height in having a number of blocks less than - /// the limit passed to the constructor. - /// - /// If the given level is found to have a number of blocks greater than or equal the limit - /// then the limit is enforced by chosing one (or more) blocks to remove. - /// - /// The removal strategy is driven by the block freshness. - /// - /// A block freshness is determined by the most recent leaf freshness descending from the block - /// itself. In other words its freshness is equal to its more "fresh" descendant. - /// - /// The least "fresh" blocks are eventually removed. - pub fn enforce_limit(&mut self, number: NumberFor) { - let level_len = self.levels.get(&number).map(|l| l.len()).unwrap_or_default(); - if level_len < self.level_limit { - return - } - - // Sort leaves by freshness only once (less fresh first) and keep track of - // leaves that were invalidated on removal. - let mut leaves = self.backend.blockchain().leaves().unwrap_or_default(); - leaves.sort_unstable_by(|a, b| self.freshness.get(a).cmp(&self.freshness.get(b))); - let mut invalidated_leaves = HashSet::new(); - - // This may not be the most efficient way to remove **multiple** entries, but is the easy - // one :-). Should be considered that in "normal" conditions the number of blocks to remove - // is 0 or 1, it is not worth to complicate the code too much. One condition that may - // trigger multiple removals (2+) is if we restart the node using an existing db and a - // smaller limit wrt the one previously used. - let remove_count = level_len - self.level_limit + 1; - - log::debug!( - target: LOG_TARGET, - "Detected leaves overflow at height {number}, removing {remove_count} obsolete blocks", - ); - - (0..remove_count).all(|_| { - self.find_target(number, &leaves, &invalidated_leaves).map_or(false, |target| { - self.remove_target(target, number, &leaves, &mut invalidated_leaves); - true - }) - }); - } - - // Helper function to find the best candidate to be removed. - // - // Given a set of blocks with height equal to `number` (potential candidates) - // 1. For each candidate fetch all the leaves that are descending from it. - // 2. Set the candidate freshness equal to the fresher of its descending leaves. - // 3. The target is set as the candidate that is less fresh. - // - // Input `leaves` are assumed to be already ordered by "freshness" (less fresh first). - // - // Returns the index of the target fresher leaf within `leaves` and the route from target to - // such leaf. - fn find_target( - &self, - number: NumberFor, - leaves: &[Block::Hash], - invalidated_leaves: &HashSet, - ) -> Option> { - let mut target_info: Option> = None; - let blockchain = self.backend.blockchain(); - let best_hash = blockchain.info().best_hash; - - // Leaves that where already assigned to some node and thus can be skipped - // during the search. - let mut assigned_leaves = HashSet::new(); - - let level = self.levels.get(&number)?; - - for blk_hash in level.iter().filter(|hash| **hash != best_hash) { - // Search for the fresher leaf information for this block - let candidate_info = leaves - .iter() - .enumerate() - .filter(|(leaf_idx, _)| { - !assigned_leaves.contains(leaf_idx) && !invalidated_leaves.contains(leaf_idx) - }) - .rev() - .find_map(|(leaf_idx, leaf_hash)| { - if blk_hash == leaf_hash { - let entry = HashAndNumber { number, hash: *blk_hash }; - TreeRoute::new(vec![entry], 0).ok().map(|freshest_route| TargetInfo { - freshest_leaf_idx: leaf_idx, - freshest_route, - }) - } else { - match sp_blockchain::tree_route(blockchain, *blk_hash, *leaf_hash) { - Ok(route) if route.retracted().is_empty() => Some(TargetInfo { - freshest_leaf_idx: leaf_idx, - freshest_route: route, - }), - Err(err) => { - log::warn!( - target: LOG_TARGET, - "(Lookup) Unable getting route from {:?} to {:?}: {}", - blk_hash, - leaf_hash, - err, - ); - None - }, - _ => None, - } - } - }); - - let candidate_info = match candidate_info { - Some(candidate_info) => { - assigned_leaves.insert(candidate_info.freshest_leaf_idx); - candidate_info - }, - None => { - // This should never happen - log::error!( - target: LOG_TARGET, - "Unable getting route to any leaf from {:?} (this is a bug)", - blk_hash, - ); - continue - }, - }; - - // Found fresher leaf for this candidate. - // This candidate is set as the new target if: - // 1. its fresher leaf is less fresh than the previous target fresher leaf AND - // 2. best block is not in its route - - let is_less_fresh = || { - target_info - .as_ref() - .map(|ti| candidate_info.freshest_leaf_idx < ti.freshest_leaf_idx) - .unwrap_or(true) - }; - let not_contains_best = || { - candidate_info - .freshest_route - .enacted() - .iter() - .all(|entry| entry.hash != best_hash) - }; - - if is_less_fresh() && not_contains_best() { - let early_stop = candidate_info.freshest_leaf_idx == 0; - target_info = Some(candidate_info); - if early_stop { - // We will never find a candidate with an worst freshest leaf than this. - break - } - } - } - - target_info - } - - // Remove the target block and all its descendants. - // - // Leaves should have already been ordered by "freshness" (less fresh first). - fn remove_target( - &mut self, - target: TargetInfo, - number: NumberFor, - leaves: &[Block::Hash], - invalidated_leaves: &mut HashSet, - ) { - let mut remove_leaf = |number, hash| { - log::debug!(target: LOG_TARGET, "Removing block (@{}) {:?}", number, hash); - if let Err(err) = self.backend.remove_leaf_block(hash) { - log::debug!(target: LOG_TARGET, "Remove not possible for {}: {}", hash, err); - return false - } - self.levels.get_mut(&number).map(|level| level.remove(&hash)); - self.freshness.remove(&hash); - true - }; - - invalidated_leaves.insert(target.freshest_leaf_idx); - - // Takes care of route removal. Starts from the leaf and stops as soon as an error is - // encountered. In this case an error is interpreted as the block being not a leaf - // and it will be removed while removing another route from the same block but to a - // different leaf. - let mut remove_route = |route: TreeRoute| { - route.enacted().iter().rev().all(|elem| remove_leaf(elem.number, elem.hash)); - }; - - let target_hash = target.freshest_route.common_block().hash; - debug_assert_eq!( - target.freshest_route.common_block().number, - number, - "This is a bug in LevelMonitor::find_target() or the Backend is corrupted" - ); - - // Remove freshest (cached) route first. - remove_route(target.freshest_route); - - // Don't bother trying with leaves we already found to not be our descendants. - let to_skip = leaves.len() - target.freshest_leaf_idx; - leaves.iter().enumerate().rev().skip(to_skip).for_each(|(leaf_idx, leaf_hash)| { - if invalidated_leaves.contains(&leaf_idx) { - return - } - match sp_blockchain::tree_route(self.backend.blockchain(), target_hash, *leaf_hash) { - Ok(route) if route.retracted().is_empty() => { - invalidated_leaves.insert(leaf_idx); - remove_route(route); - }, - Err(err) => { - log::warn!( - target: LOG_TARGET, - "(Removal) unable getting route from {:?} to {:?}: {}", - target_hash, - leaf_hash, - err, - ); - }, - _ => (), - }; - }); - - remove_leaf(number, target_hash); - } - - /// Add a new imported block information to the monitor. - pub fn block_imported(&mut self, number: NumberFor, hash: Block::Hash) { - let finalized_num = self.backend.blockchain().info().finalized_number; - - if number > finalized_num { - // Only blocks above the last finalized block should be added to the monitor - self.import_counter += One::one(); - self.freshness.insert(hash, self.import_counter); - self.levels.entry(number).or_default().insert(hash); - } - - let delta: u32 = finalized_num.saturating_sub(self.lowest_level).unique_saturated_into(); - if delta >= CLEANUP_THRESHOLD { - // Do cleanup once in a while, we are allowed to have some obsolete information. - for i in 0..delta { - let number = self.lowest_level + i.unique_saturated_into(); - self.levels.remove(&number).map(|level| { - level.iter().for_each(|hash| { - self.freshness.remove(hash); - }) - }); - } - self.lowest_level = finalized_num; - } - } -} diff --git a/cumulus/client/consensus/common/src/lib.rs b/cumulus/client/consensus/common/src/lib.rs deleted file mode 100644 index 3e762e986922..000000000000 --- a/cumulus/client/consensus/common/src/lib.rs +++ /dev/null @@ -1,386 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use codec::Decode; -use polkadot_primitives::{ - Block as PBlock, Hash as PHash, Header as PHeader, PersistedValidationData, -}; - -use cumulus_primitives_core::{ - relay_chain::{BlockId as RBlockId, OccupiedCoreAssumption}, - ParaId, -}; -use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface}; - -use sc_client_api::Backend; -use sc_consensus::{shared_data::SharedData, BlockImport, ImportResult}; -use sp_consensus_slots::{Slot, SlotDuration}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; -use sp_timestamp::Timestamp; - -use std::sync::Arc; - -mod level_monitor; -mod parachain_consensus; -#[cfg(test)] -mod tests; - -pub use parachain_consensus::run_parachain_consensus; - -use level_monitor::LevelMonitor; -pub use level_monitor::{LevelLimit, MAX_LEAVES_PER_LEVEL_SENSIBLE_DEFAULT}; - -pub mod import_queue; - -/// The result of [`ParachainConsensus::produce_candidate`]. -pub struct ParachainCandidate { - /// The block that was built for this candidate. - pub block: B, - /// The proof that was recorded while building the block. - pub proof: sp_trie::StorageProof, -} - -/// A specific parachain consensus implementation that can be used by a collator to produce -/// candidates. -/// -/// The collator will call [`Self::produce_candidate`] every time there is a free core for the -/// parachain this collator is collating for. It is the job of the consensus implementation to -/// decide if this specific collator should build a candidate for the given relay chain block. The -/// consensus implementation could, for example, check whether this specific collator is part of a -/// staked set. -#[async_trait::async_trait] -pub trait ParachainConsensus: Send + Sync + dyn_clone::DynClone { - /// Produce a new candidate at the given parent block and relay-parent blocks. - /// - /// Should return `None` if the consensus implementation decided that it shouldn't build a - /// candidate or if there occurred any error. - /// - /// # NOTE - /// - /// It is expected that the block is already imported when the future resolves. - async fn produce_candidate( - &mut self, - parent: &B::Header, - relay_parent: PHash, - validation_data: &PersistedValidationData, - ) -> Option>; -} - -dyn_clone::clone_trait_object!( ParachainConsensus where B: BlockT); - -#[async_trait::async_trait] -impl ParachainConsensus for Box + Send + Sync> { - async fn produce_candidate( - &mut self, - parent: &B::Header, - relay_parent: PHash, - validation_data: &PersistedValidationData, - ) -> Option> { - (*self).produce_candidate(parent, relay_parent, validation_data).await - } -} - -/// Parachain specific block import. -/// -/// This is used to set `block_import_params.fork_choice` to `false` as long as the block origin is -/// not `NetworkInitialSync`. The best block for parachains is determined by the relay chain. -/// Meaning we will update the best block, as it is included by the relay-chain. -pub struct ParachainBlockImport { - inner: BI, - monitor: Option>>, -} - -impl> ParachainBlockImport { - /// Create a new instance. - /// - /// The number of leaves per level limit is set to `LevelLimit::Default`. - pub fn new(inner: BI, backend: Arc) -> Self { - Self::new_with_limit(inner, backend, LevelLimit::Default) - } - - /// Create a new instance with an explicit limit to the number of leaves per level. - /// - /// This function alone doesn't enforce the limit on levels for old imported blocks, - /// the limit is eventually enforced only when new blocks are imported. - pub fn new_with_limit(inner: BI, backend: Arc, level_leaves_max: LevelLimit) -> Self { - let level_limit = match level_leaves_max { - LevelLimit::None => None, - LevelLimit::Some(limit) => Some(limit), - LevelLimit::Default => Some(MAX_LEAVES_PER_LEVEL_SENSIBLE_DEFAULT), - }; - - let monitor = - level_limit.map(|level_limit| SharedData::new(LevelMonitor::new(level_limit, backend))); - - Self { inner, monitor } - } -} - -impl Clone for ParachainBlockImport { - fn clone(&self) -> Self { - ParachainBlockImport { inner: self.inner.clone(), monitor: self.monitor.clone() } - } -} - -#[async_trait::async_trait] -impl BlockImport for ParachainBlockImport -where - Block: BlockT, - BI: BlockImport + Send, - BE: Backend, -{ - type Error = BI::Error; - type Transaction = BI::Transaction; - - async fn check_block( - &mut self, - block: sc_consensus::BlockCheckParams, - ) -> Result { - self.inner.check_block(block).await - } - - async fn import_block( - &mut self, - mut params: sc_consensus::BlockImportParams, - ) -> Result { - // Blocks are stored within the backend by using POST hash. - let hash = params.post_hash(); - let number = *params.header.number(); - - if params.with_state() { - // Force imported state finality. - // Required for warp sync. We assume that preconditions have been - // checked properly and we are importing a finalized block with state. - params.finalized = true; - } - - // Best block is determined by the relay chain, or if we are doing the initial sync - // we import all blocks as new best. - params.fork_choice = Some(sc_consensus::ForkChoiceStrategy::Custom( - params.origin == sp_consensus::BlockOrigin::NetworkInitialSync, - )); - - let maybe_lock = self.monitor.as_ref().map(|monitor_lock| { - let mut monitor = monitor_lock.shared_data_locked(); - monitor.enforce_limit(number); - monitor.release_mutex() - }); - - let res = self.inner.import_block(params).await?; - - if let (Some(mut monitor_lock), ImportResult::Imported(_)) = (maybe_lock, &res) { - let mut monitor = monitor_lock.upgrade(); - monitor.block_imported(number, hash); - } - - Ok(res) - } -} - -/// Marker trait denoting a block import type that fits the parachain requirements. -pub trait ParachainBlockImportMarker {} - -impl ParachainBlockImportMarker for ParachainBlockImport {} - -/// Parameters when searching for suitable parents to build on top of. -pub struct ParentSearchParams { - /// The relay-parent that is intended to be used. - pub relay_parent: PHash, - /// The ID of the parachain. - pub para_id: ParaId, - /// A limitation on the age of relay parents for parachain blocks that are being - /// considered. This is relative to the `relay_parent` number. - pub ancestry_lookback: usize, - /// How "deep" parents can be relative to the included parachain block at the relay-parent. - /// The included block has depth 0. - pub max_depth: usize, - /// Whether to only ignore "alternative" branches, i.e. branches of the chain - /// which do not contain the block pending availability. - pub ignore_alternative_branches: bool, -} - -/// A potential parent block returned from [`find_potential_parents`] -pub struct PotentialParent { - /// The hash of the block. - pub hash: B::Hash, - /// The header of the block. - pub header: B::Header, - /// The depth of the block. - pub depth: usize, - /// Whether the block is the included block, is itself pending on-chain, or descends - /// from the block pending availability. - pub aligned_with_pending: bool, -} - -/// Perform a recursive search through blocks to find potential -/// parent blocks for a new block. -/// -/// This accepts a relay-chain block to be used as an anchor and a maximum search depth, -/// along with some arguments for filtering parachain blocks and performs a recursive search -/// for parachain blocks. The search begins at the last included parachain block and returns -/// a set of [`PotentialParent`]s which could be potential parents of a new block with this -/// relay-parent according to the search parameters. -/// -/// A parachain block is a potential parent if it is either the last included parachain block, the -/// pending parachain block (when `max_depth` >= 1), or all of the following hold: -/// * its parent is a potential parent -/// * its relay-parent is within `ancestry_lookback` of the targeted relay-parent. -/// * the block number is within `max_depth` blocks of the included block -pub async fn find_potential_parents( - params: ParentSearchParams, - client: &impl sp_blockchain::Backend, - relay_client: &impl RelayChainInterface, -) -> Result>, RelayChainError> { - // 1. Build up the ancestry record of the relay chain to compare against. - let rp_ancestry = { - let mut ancestry = Vec::with_capacity(params.ancestry_lookback + 1); - let mut current_rp = params.relay_parent; - while ancestry.len() <= params.ancestry_lookback { - let header = match relay_client.header(RBlockId::hash(current_rp)).await? { - None => break, - Some(h) => h, - }; - - ancestry.push((current_rp, *header.state_root())); - current_rp = *header.parent_hash(); - - // don't iterate back into the genesis block. - if header.number == 1 { - break - } - } - - ancestry - }; - - let is_hash_in_ancestry = |hash| rp_ancestry.iter().any(|x| x.0 == hash); - let is_root_in_ancestry = |root| rp_ancestry.iter().any(|x| x.1 == root); - - // 2. Get the included and pending availability blocks. - let included_header = relay_client - .persisted_validation_data( - params.relay_parent, - params.para_id, - OccupiedCoreAssumption::TimedOut, - ) - .await?; - - let included_header = match included_header { - Some(pvd) => pvd.parent_head, - None => return Ok(Vec::new()), // this implies the para doesn't exist. - }; - - let pending_header = relay_client - .persisted_validation_data( - params.relay_parent, - params.para_id, - OccupiedCoreAssumption::Included, - ) - .await? - .and_then(|x| if x.parent_head != included_header { Some(x.parent_head) } else { None }); - - let included_header = match B::Header::decode(&mut &included_header.0[..]).ok() { - None => return Ok(Vec::new()), - Some(x) => x, - }; - // Silently swallow if pending block can't decode. - let pending_header = pending_header.and_then(|p| B::Header::decode(&mut &p.0[..]).ok()); - let included_hash = included_header.hash(); - let pending_hash = pending_header.as_ref().map(|hdr| hdr.hash()); - - let mut frontier = vec![PotentialParent:: { - hash: included_hash, - header: included_header, - depth: 0, - aligned_with_pending: true, - }]; - - // Recursive search through descendants of the included block which have acceptable - // relay parents. - let mut potential_parents = Vec::new(); - while let Some(entry) = frontier.pop() { - let is_pending = - entry.depth == 1 && pending_hash.as_ref().map_or(false, |h| &entry.hash == h); - let is_included = entry.depth == 0; - - // note: even if the pending block or included block have a relay parent - // outside of the expected part of the relay chain, they are always allowed - // because they have already been posted on chain. - let is_potential = is_pending || is_included || { - let digest = entry.header.digest(); - cumulus_primitives_core::extract_relay_parent(digest).map_or(false, is_hash_in_ancestry) || - cumulus_primitives_core::rpsr_digest::extract_relay_parent_storage_root(digest) - .map(|(r, _n)| r) - .map_or(false, is_root_in_ancestry) - }; - - let parent_aligned_with_pending = entry.aligned_with_pending; - let child_depth = entry.depth + 1; - let hash = entry.hash; - - if is_potential { - potential_parents.push(entry); - } - - if !is_potential || child_depth > params.max_depth { - continue - } - - // push children onto search frontier. - for child in client.children(hash).ok().into_iter().flatten() { - let aligned_with_pending = parent_aligned_with_pending && - if child_depth == 1 { - pending_hash.as_ref().map_or(true, |h| &child == h) - } else { - true - }; - - if params.ignore_alternative_branches && !aligned_with_pending { - continue - } - - let header = match client.header(child) { - Ok(Some(h)) => h, - Ok(None) => continue, - Err(_) => continue, - }; - - frontier.push(PotentialParent { - hash: child, - header, - depth: child_depth, - aligned_with_pending, - }); - } - } - - Ok(potential_parents) -} - -/// Get the relay-parent slot and timestamp from a header. -pub fn relay_slot_and_timestamp( - relay_parent_header: &PHeader, - relay_chain_slot_duration: SlotDuration, -) -> Option<(Slot, Timestamp)> { - sc_consensus_babe::find_pre_digest::(relay_parent_header) - .map(|babe_pre_digest| { - let slot = babe_pre_digest.slot(); - let t = Timestamp::new(relay_chain_slot_duration.as_millis() * *slot); - - (slot, t) - }) - .ok() -} diff --git a/cumulus/client/consensus/common/src/parachain_consensus.rs b/cumulus/client/consensus/common/src/parachain_consensus.rs deleted file mode 100644 index 5bbaa2893cff..000000000000 --- a/cumulus/client/consensus/common/src/parachain_consensus.rs +++ /dev/null @@ -1,509 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use sc_client_api::{ - Backend, BlockBackend, BlockImportNotification, BlockchainEvents, Finalizer, UsageProvider, -}; -use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy}; -use schnellru::{ByLength, LruMap}; -use sp_blockchain::Error as ClientError; -use sp_consensus::{BlockOrigin, BlockStatus}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - -use cumulus_client_pov_recovery::{RecoveryKind, RecoveryRequest}; -use cumulus_relay_chain_interface::{RelayChainInterface, RelayChainResult}; - -use polkadot_primitives::{Hash as PHash, Id as ParaId, OccupiedCoreAssumption}; - -use codec::Decode; -use futures::{channel::mpsc::Sender, pin_mut, select, FutureExt, Stream, StreamExt}; - -use std::sync::Arc; - -const LOG_TARGET: &str = "cumulus-consensus"; -const FINALIZATION_CACHE_SIZE: u32 = 40; - -fn handle_new_finalized_head( - parachain: &Arc

, - finalized_head: Vec, - last_seen_finalized_hashes: &mut LruMap, -) where - Block: BlockT, - B: Backend, - P: Finalizer + UsageProvider + BlockchainEvents, -{ - let header = match Block::Header::decode(&mut &finalized_head[..]) { - Ok(header) => header, - Err(err) => { - tracing::debug!( - target: LOG_TARGET, - error = ?err, - "Could not decode parachain header while following finalized heads.", - ); - return - }, - }; - - let hash = header.hash(); - - last_seen_finalized_hashes.insert(hash, ()); - - // Only finalize if we are below the incoming finalized parachain head - if parachain.usage_info().chain.finalized_number < *header.number() { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Attempting to finalize header.", - ); - if let Err(e) = parachain.finalize_block(hash, None, true) { - match e { - ClientError::UnknownBlock(_) => tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Could not finalize block because it is unknown.", - ), - _ => tracing::warn!( - target: LOG_TARGET, - error = ?e, - block_hash = ?hash, - "Failed to finalize block", - ), - } - } - } -} - -/// Follow the finalized head of the given parachain. -/// -/// For every finalized block of the relay chain, it will get the included parachain header -/// corresponding to `para_id` and will finalize it in the parachain. -async fn follow_finalized_head(para_id: ParaId, parachain: Arc

, relay_chain: R) -where - Block: BlockT, - P: Finalizer + UsageProvider + BlockchainEvents, - R: RelayChainInterface + Clone, - B: Backend, -{ - let finalized_heads = match finalized_heads(relay_chain, para_id).await { - Ok(finalized_heads_stream) => finalized_heads_stream.fuse(), - Err(err) => { - tracing::error!(target: LOG_TARGET, error = ?err, "Unable to retrieve finalized heads stream."); - return - }, - }; - - let mut imported_blocks = parachain.import_notification_stream().fuse(); - - pin_mut!(finalized_heads); - - // We use this cache to finalize blocks that are imported late. - // For example, a block that has been recovered via PoV-Recovery - // on a full node can have several minutes delay. With this cache - // we have some "memory" of recently finalized blocks. - let mut last_seen_finalized_hashes = LruMap::new(ByLength::new(FINALIZATION_CACHE_SIZE)); - - loop { - select! { - fin = finalized_heads.next() => { - match fin { - Some(finalized_head) => - handle_new_finalized_head(¶chain, finalized_head, &mut last_seen_finalized_hashes), - None => { - tracing::debug!(target: LOG_TARGET, "Stopping following finalized head."); - return - } - } - }, - imported = imported_blocks.next() => { - match imported { - Some(imported_block) => { - // When we see a block import that is already finalized, we immediately finalize it. - if last_seen_finalized_hashes.peek(&imported_block.hash).is_some() { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?imported_block.hash, - "Setting newly imported block as finalized.", - ); - - if let Err(e) = parachain.finalize_block(imported_block.hash, None, true) { - match e { - ClientError::UnknownBlock(_) => tracing::debug!( - target: LOG_TARGET, - block_hash = ?imported_block.hash, - "Could not finalize block because it is unknown.", - ), - _ => tracing::warn!( - target: LOG_TARGET, - error = ?e, - block_hash = ?imported_block.hash, - "Failed to finalize block", - ), - } - } - } - }, - None => { - tracing::debug!( - target: LOG_TARGET, - "Stopping following imported blocks.", - ); - return - } - } - } - } - } -} - -/// Run the parachain consensus. -/// -/// This will follow the given `relay_chain` to act as consensus for the parachain that corresponds -/// to the given `para_id`. It will set the new best block of the parachain as it gets aware of it. -/// The same happens for the finalized block. -/// -/// # Note -/// -/// This will access the backend of the parachain and thus, this future should be spawned as -/// blocking task. -pub async fn run_parachain_consensus( - para_id: ParaId, - parachain: Arc

, - relay_chain: R, - announce_block: Arc>) + Send + Sync>, - recovery_chan_tx: Option>>, -) where - Block: BlockT, - P: Finalizer - + UsageProvider - + Send - + Sync - + BlockBackend - + BlockchainEvents, - for<'a> &'a P: BlockImport, - R: RelayChainInterface + Clone, - B: Backend, -{ - let follow_new_best = follow_new_best( - para_id, - parachain.clone(), - relay_chain.clone(), - announce_block, - recovery_chan_tx, - ); - let follow_finalized_head = follow_finalized_head(para_id, parachain, relay_chain); - select! { - _ = follow_new_best.fuse() => {}, - _ = follow_finalized_head.fuse() => {}, - } -} - -/// Follow the relay chain new best head, to update the Parachain new best head. -async fn follow_new_best( - para_id: ParaId, - parachain: Arc

, - relay_chain: R, - announce_block: Arc>) + Send + Sync>, - mut recovery_chan_tx: Option>>, -) where - Block: BlockT, - P: Finalizer - + UsageProvider - + Send - + Sync - + BlockBackend - + BlockchainEvents, - for<'a> &'a P: BlockImport, - R: RelayChainInterface + Clone, - B: Backend, -{ - let new_best_heads = match new_best_heads(relay_chain, para_id).await { - Ok(best_heads_stream) => best_heads_stream.fuse(), - Err(err) => { - tracing::error!(target: LOG_TARGET, error = ?err, "Unable to retrieve best heads stream."); - return - }, - }; - - pin_mut!(new_best_heads); - - let mut imported_blocks = parachain.import_notification_stream().fuse(); - // The unset best header of the parachain. Will be `Some(_)` when we have imported a relay chain - // block before the associated parachain block. In this case we need to wait for this block to - // be imported to set it as new best. - let mut unset_best_header = None; - - loop { - select! { - h = new_best_heads.next() => { - match h { - Some(h) => handle_new_best_parachain_head( - h, - &*parachain, - &mut unset_best_header, - recovery_chan_tx.as_mut(), - ).await, - None => { - tracing::debug!( - target: LOG_TARGET, - "Stopping following new best.", - ); - return - } - } - }, - i = imported_blocks.next() => { - match i { - Some(i) => handle_new_block_imported( - i, - &mut unset_best_header, - &*parachain, - &*announce_block, - ).await, - None => { - tracing::debug!( - target: LOG_TARGET, - "Stopping following imported blocks.", - ); - return - } - } - }, - } - } -} - -/// Handle a new import block of the parachain. -async fn handle_new_block_imported( - notification: BlockImportNotification, - unset_best_header_opt: &mut Option, - parachain: &P, - announce_block: &(dyn Fn(Block::Hash, Option>) + Send + Sync), -) where - Block: BlockT, - P: UsageProvider + Send + Sync + BlockBackend, - for<'a> &'a P: BlockImport, -{ - // HACK - // - // Remove after https://github.com/paritytech/substrate/pull/8052 or similar is merged - if notification.origin != BlockOrigin::Own { - announce_block(notification.hash, None); - } - - let unset_best_header = match (notification.is_new_best, &unset_best_header_opt) { - // If this is the new best block or we don't have any unset block, we can end it here. - (true, _) | (_, None) => return, - (false, Some(ref u)) => u, - }; - - let unset_hash = if notification.header.number() < unset_best_header.number() { - return - } else if notification.header.number() == unset_best_header.number() { - let unset_hash = unset_best_header.hash(); - - if unset_hash != notification.hash { - return - } else { - unset_hash - } - } else { - unset_best_header.hash() - }; - - match parachain.block_status(unset_hash) { - Ok(BlockStatus::InChainWithState) => { - let unset_best_header = unset_best_header_opt - .take() - .expect("We checked above that the value is set; qed"); - tracing::debug!( - target: LOG_TARGET, - ?unset_hash, - "Importing block as new best for parachain.", - ); - import_block_as_new_best(unset_hash, unset_best_header, parachain).await; - }, - state => tracing::debug!( - target: LOG_TARGET, - ?unset_best_header, - ?notification.header, - ?state, - "Unexpected state for unset best header.", - ), - } -} - -/// Handle the new best parachain head as extracted from the new best relay chain. -async fn handle_new_best_parachain_head( - head: Vec, - parachain: &P, - unset_best_header: &mut Option, - mut recovery_chan_tx: Option<&mut Sender>>, -) where - Block: BlockT, - P: UsageProvider + Send + Sync + BlockBackend, - for<'a> &'a P: BlockImport, -{ - let parachain_head = match <::Header>::decode(&mut &head[..]) { - Ok(header) => header, - Err(err) => { - tracing::debug!( - target: LOG_TARGET, - error = ?err, - "Could not decode Parachain header while following best heads.", - ); - return - }, - }; - - let hash = parachain_head.hash(); - - if parachain.usage_info().chain.best_hash == hash { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Skipping set new best block, because block is already the best.", - ) - } else { - // Make sure the block is already known or otherwise we skip setting new best. - match parachain.block_status(hash) { - Ok(BlockStatus::InChainWithState) => { - unset_best_header.take(); - tracing::debug!( - target: LOG_TARGET, - ?hash, - "Importing block as new best for parachain.", - ); - import_block_as_new_best(hash, parachain_head, parachain).await; - }, - Ok(BlockStatus::InChainPruned) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - "Trying to set pruned block as new best!", - ); - }, - Ok(BlockStatus::Unknown) => { - *unset_best_header = Some(parachain_head); - - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Parachain block not yet imported, waiting for import to enact as best block.", - ); - - if let Some(ref mut recovery_chan_tx) = recovery_chan_tx { - // Best effort channel to actively encourage block recovery. - // An error here is not fatal; the relay chain continuously re-announces - // the best block, thus we will have other opportunities to retry. - let req = RecoveryRequest { hash, kind: RecoveryKind::Full }; - if let Err(err) = recovery_chan_tx.try_send(req) { - tracing::warn!( - target: LOG_TARGET, - block_hash = ?hash, - error = ?err, - "Unable to notify block recovery subsystem" - ) - } - } - }, - Err(e) => { - tracing::error!( - target: LOG_TARGET, - block_hash = ?hash, - error = ?e, - "Failed to get block status of block.", - ); - }, - _ => {}, - } - } -} - -async fn import_block_as_new_best( - hash: Block::Hash, - header: Block::Header, - mut parachain: &P, -) where - Block: BlockT, - P: UsageProvider + Send + Sync + BlockBackend, - for<'a> &'a P: BlockImport, -{ - let best_number = parachain.usage_info().chain.best_number; - if *header.number() < best_number { - tracing::debug!( - target: LOG_TARGET, - %best_number, - block_number = %header.number(), - "Skipping importing block as new best block, because there already exists a \ - best block with an higher number", - ); - return - } - - // Make it the new best block - let mut block_import_params = BlockImportParams::new(BlockOrigin::ConsensusBroadcast, header); - block_import_params.fork_choice = Some(ForkChoiceStrategy::Custom(true)); - block_import_params.import_existing = true; - - if let Err(err) = parachain.import_block(block_import_params).await { - tracing::warn!( - target: LOG_TARGET, - block_hash = ?hash, - error = ?err, - "Failed to set new best block.", - ); - } -} - -/// Returns a stream that will yield best heads for the given `para_id`. -async fn new_best_heads( - relay_chain: impl RelayChainInterface + Clone, - para_id: ParaId, -) -> RelayChainResult>> { - let new_best_notification_stream = - relay_chain.new_best_notification_stream().await?.filter_map(move |n| { - let relay_chain = relay_chain.clone(); - async move { parachain_head_at(&relay_chain, n.hash(), para_id).await.ok().flatten() } - }); - - Ok(new_best_notification_stream) -} - -/// Returns a stream that will yield finalized heads for the given `para_id`. -async fn finalized_heads( - relay_chain: impl RelayChainInterface + Clone, - para_id: ParaId, -) -> RelayChainResult>> { - let finality_notification_stream = - relay_chain.finality_notification_stream().await?.filter_map(move |n| { - let relay_chain = relay_chain.clone(); - async move { parachain_head_at(&relay_chain, n.hash(), para_id).await.ok().flatten() } - }); - - Ok(finality_notification_stream) -} - -/// Returns head of the parachain at the given relay chain block. -async fn parachain_head_at( - relay_chain: &impl RelayChainInterface, - at: PHash, - para_id: ParaId, -) -> RelayChainResult>> { - relay_chain - .persisted_validation_data(at, para_id, OccupiedCoreAssumption::TimedOut) - .await - .map(|s| s.map(|s| s.parent_head.0)) -} diff --git a/cumulus/client/consensus/common/src/tests.rs b/cumulus/client/consensus/common/src/tests.rs deleted file mode 100644 index c13f839ad821..000000000000 --- a/cumulus/client/consensus/common/src/tests.rs +++ /dev/null @@ -1,799 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -use async_trait::async_trait; -use codec::Encode; -use cumulus_client_pov_recovery::RecoveryKind; -use cumulus_primitives_core::{relay_chain::BlockId, InboundDownwardMessage, InboundHrmpMessage}; -use cumulus_relay_chain_interface::{ - CommittedCandidateReceipt, OccupiedCoreAssumption, OverseerHandle, PHeader, ParaId, - RelayChainInterface, RelayChainResult, SessionIndex, StorageValue, ValidatorId, -}; -use cumulus_test_client::{ - runtime::{Block, Hash, Header}, - Backend, Client, InitBlockBuilder, TestClientBuilder, TestClientBuilderExt, -}; -use futures::{channel::mpsc, executor::block_on, select, FutureExt, Stream, StreamExt}; -use futures_timer::Delay; -use sc_client_api::{blockchain::Backend as _, Backend as _, UsageProvider}; -use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy}; -use sp_consensus::{BlockOrigin, BlockStatus}; -use std::{ - collections::{BTreeMap, HashMap}, - pin::Pin, - sync::{Arc, Mutex}, - time::Duration, -}; - -struct RelaychainInner { - new_best_heads: Option>, - finalized_heads: Option>, - new_best_heads_sender: mpsc::UnboundedSender

, - finalized_heads_sender: mpsc::UnboundedSender
, - relay_chain_hash_to_header: HashMap, -} - -impl RelaychainInner { - fn new() -> Self { - let (new_best_heads_sender, new_best_heads) = mpsc::unbounded(); - let (finalized_heads_sender, finalized_heads) = mpsc::unbounded(); - - Self { - new_best_heads_sender, - finalized_heads_sender, - new_best_heads: Some(new_best_heads), - finalized_heads: Some(finalized_heads), - relay_chain_hash_to_header: Default::default(), - } - } -} - -#[derive(Clone)] -struct Relaychain { - inner: Arc>, -} - -impl Relaychain { - fn new() -> Self { - Self { inner: Arc::new(Mutex::new(RelaychainInner::new())) } - } -} - -#[async_trait] -impl RelayChainInterface for Relaychain { - async fn validators(&self, _: PHash) -> RelayChainResult> { - unimplemented!("Not needed for test") - } - - async fn best_block_hash(&self) -> RelayChainResult { - unimplemented!("Not needed for test") - } - - async fn finalized_block_hash(&self) -> RelayChainResult { - unimplemented!("Not needed for test") - } - - async fn retrieve_dmq_contents( - &self, - _: ParaId, - _: PHash, - ) -> RelayChainResult> { - unimplemented!("Not needed for test") - } - - async fn retrieve_all_inbound_hrmp_channel_contents( - &self, - _: ParaId, - _: PHash, - ) -> RelayChainResult>> { - unimplemented!("Not needed for test") - } - - async fn persisted_validation_data( - &self, - hash: PHash, - _: ParaId, - _: OccupiedCoreAssumption, - ) -> RelayChainResult> { - Ok(Some(PersistedValidationData { - parent_head: self - .inner - .lock() - .unwrap() - .relay_chain_hash_to_header - .get(&hash) - .unwrap() - .encode() - .into(), - ..Default::default() - })) - } - - async fn candidate_pending_availability( - &self, - _: PHash, - _: ParaId, - ) -> RelayChainResult> { - unimplemented!("Not needed for test") - } - - async fn session_index_for_child(&self, _: PHash) -> RelayChainResult { - unimplemented!("Not needed for test") - } - - async fn import_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - unimplemented!("Not needed for test") - } - - async fn finality_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let inner = self.inner.clone(); - Ok(self - .inner - .lock() - .unwrap() - .finalized_heads - .take() - .unwrap() - .map(move |h| { - // Let's abuse the "parachain header" directly as relay chain header. - inner.lock().unwrap().relay_chain_hash_to_header.insert(h.hash(), h.clone()); - h - }) - .boxed()) - } - - async fn is_major_syncing(&self) -> RelayChainResult { - Ok(false) - } - - fn overseer_handle(&self) -> RelayChainResult { - unimplemented!("Not needed for test") - } - - async fn get_storage_by_key( - &self, - _: PHash, - _: &[u8], - ) -> RelayChainResult> { - unimplemented!("Not needed for test") - } - - async fn prove_read( - &self, - _: PHash, - _: &Vec>, - ) -> RelayChainResult { - unimplemented!("Not needed for test") - } - - async fn wait_for_block(&self, _: PHash) -> RelayChainResult<()> { - Ok(()) - } - - async fn new_best_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let inner = self.inner.clone(); - Ok(self - .inner - .lock() - .unwrap() - .new_best_heads - .take() - .unwrap() - .map(move |h| { - // Let's abuse the "parachain header" directly as relay chain header. - inner.lock().unwrap().relay_chain_hash_to_header.insert(h.hash(), h.clone()); - h - }) - .boxed()) - } - - async fn header(&self, _block_id: BlockId) -> RelayChainResult> { - unimplemented!("Not needed for test") - } -} - -fn build_block( - builder: &B, - at: Option, - timestamp: Option, -) -> Block { - let builder = match at { - Some(at) => match timestamp { - Some(ts) => builder.init_block_builder_with_timestamp(at, None, Default::default(), ts), - None => builder.init_block_builder_at(at, None, Default::default()), - }, - None => builder.init_block_builder(None, Default::default()), - }; - - let mut block = builder.build().unwrap().block; - - // Simulate some form of post activity (like a Seal or Other generic things). - // This is mostly used to exercise the `LevelMonitor` correct behavior. - // (in practice we want that header post-hash != pre-hash) - block.header.digest.push(sp_runtime::DigestItem::Other(vec![1, 2, 3])); - - block -} - -async fn import_block>( - importer: &mut I, - block: Block, - origin: BlockOrigin, - import_as_best: bool, -) { - let (mut header, body) = block.deconstruct(); - - let post_digest = - header.digest.pop().expect("post digested is present in manually crafted block"); - - let mut block_import_params = BlockImportParams::new(origin, header); - block_import_params.fork_choice = Some(ForkChoiceStrategy::Custom(import_as_best)); - block_import_params.body = Some(body); - block_import_params.post_digests.push(post_digest); - - importer.import_block(block_import_params).await.unwrap(); -} - -fn import_block_sync>( - importer: &mut I, - block: Block, - origin: BlockOrigin, - import_as_best: bool, -) { - block_on(import_block(importer, block, origin, import_as_best)); -} - -fn build_and_import_block_ext>( - builder: &B, - origin: BlockOrigin, - import_as_best: bool, - importer: &mut I, - at: Option, - timestamp: Option, -) -> Block { - let block = build_block(builder, at, timestamp); - import_block_sync(importer, block.clone(), origin, import_as_best); - block -} - -fn build_and_import_block(mut client: Arc, import_as_best: bool) -> Block { - build_and_import_block_ext( - &*client.clone(), - BlockOrigin::Own, - import_as_best, - &mut client, - None, - None, - ) -} - -#[test] -fn follow_new_best_works() { - sp_tracing::try_init_simple(); - - let client = Arc::new(TestClientBuilder::default().build()); - - let block = build_and_import_block(client.clone(), false); - let relay_chain = Relaychain::new(); - let new_best_heads_sender = relay_chain.inner.lock().unwrap().new_best_heads_sender.clone(); - - let consensus = - run_parachain_consensus(100.into(), client.clone(), relay_chain, Arc::new(|_, _| {}), None); - - let work = async move { - new_best_heads_sender.unbounded_send(block.header().clone()).unwrap(); - loop { - Delay::new(Duration::from_millis(100)).await; - if block.hash() == client.usage_info().chain.best_hash { - break - } - } - }; - - block_on(async move { - futures::pin_mut!(consensus); - futures::pin_mut!(work); - - select! { - r = consensus.fuse() => panic!("Consensus should not end: {:?}", r), - _ = work.fuse() => {}, - } - }); -} - -#[test] -fn follow_new_best_with_dummy_recovery_works() { - sp_tracing::try_init_simple(); - - let client = Arc::new(TestClientBuilder::default().build()); - - let relay_chain = Relaychain::new(); - let new_best_heads_sender = relay_chain.inner.lock().unwrap().new_best_heads_sender.clone(); - - let (recovery_chan_tx, mut recovery_chan_rx) = futures::channel::mpsc::channel(3); - - let consensus = run_parachain_consensus( - 100.into(), - client.clone(), - relay_chain, - Arc::new(|_, _| {}), - Some(recovery_chan_tx), - ); - - let block = build_block(&*client, None, None); - let block_clone = block.clone(); - let client_clone = client.clone(); - - let work = async move { - new_best_heads_sender.unbounded_send(block.header().clone()).unwrap(); - loop { - Delay::new(Duration::from_millis(100)).await; - match client.block_status(block.hash()).unwrap() { - BlockStatus::Unknown => {}, - status => { - assert_eq!(block.hash(), client.usage_info().chain.best_hash); - assert_eq!(status, BlockStatus::InChainWithState); - break - }, - } - } - }; - - let dummy_block_recovery = async move { - loop { - if let Some(req) = recovery_chan_rx.next().await { - assert_eq!(req.hash, block_clone.hash()); - assert_eq!(req.kind, RecoveryKind::Full); - Delay::new(Duration::from_millis(500)).await; - import_block(&mut &*client_clone, block_clone.clone(), BlockOrigin::Own, true) - .await; - } - } - }; - - block_on(async move { - futures::pin_mut!(consensus); - futures::pin_mut!(work); - - select! { - r = consensus.fuse() => panic!("Consensus should not end: {:?}", r), - _ = dummy_block_recovery.fuse() => {}, - _ = work.fuse() => {}, - } - }); -} - -#[test] -fn follow_finalized_works() { - sp_tracing::try_init_simple(); - - let client = Arc::new(TestClientBuilder::default().build()); - - let block = build_and_import_block(client.clone(), false); - let relay_chain = Relaychain::new(); - let finalized_sender = relay_chain.inner.lock().unwrap().finalized_heads_sender.clone(); - - let consensus = - run_parachain_consensus(100.into(), client.clone(), relay_chain, Arc::new(|_, _| {}), None); - - let work = async move { - finalized_sender.unbounded_send(block.header().clone()).unwrap(); - loop { - Delay::new(Duration::from_millis(100)).await; - if block.hash() == client.usage_info().chain.finalized_hash { - break - } - } - }; - - block_on(async move { - futures::pin_mut!(consensus); - futures::pin_mut!(work); - - select! { - r = consensus.fuse() => panic!("Consensus should not end: {:?}", r), - _ = work.fuse() => {}, - } - }); -} - -#[test] -fn follow_finalized_does_not_stop_on_unknown_block() { - sp_tracing::try_init_simple(); - - let client = Arc::new(TestClientBuilder::default().build()); - - let block = build_and_import_block(client.clone(), false); - - let unknown_block = { - let block_builder = client.init_block_builder_at(block.hash(), None, Default::default()); - block_builder.build().unwrap().block - }; - - let relay_chain = Relaychain::new(); - let finalized_sender = relay_chain.inner.lock().unwrap().finalized_heads_sender.clone(); - - let consensus = - run_parachain_consensus(100.into(), client.clone(), relay_chain, Arc::new(|_, _| {}), None); - - let work = async move { - for _ in 0..3usize { - finalized_sender.unbounded_send(unknown_block.header().clone()).unwrap(); - - Delay::new(Duration::from_millis(100)).await; - } - - finalized_sender.unbounded_send(block.header().clone()).unwrap(); - loop { - Delay::new(Duration::from_millis(100)).await; - if block.hash() == client.usage_info().chain.finalized_hash { - break - } - } - }; - - block_on(async move { - futures::pin_mut!(consensus); - futures::pin_mut!(work); - - select! { - r = consensus.fuse() => panic!("Consensus should not end: {:?}", r), - _ = work.fuse() => {}, - } - }); -} - -// It can happen that we first import a relay chain block, while not yet having the parachain -// block imported that would be set to the best block. We need to make sure to import this -// block as new best block in the moment it is imported. -#[test] -fn follow_new_best_sets_best_after_it_is_imported() { - sp_tracing::try_init_simple(); - - let mut client = Arc::new(TestClientBuilder::default().build()); - - let block = build_and_import_block(client.clone(), false); - - let unknown_block = { - let block_builder = client.init_block_builder_at(block.hash(), None, Default::default()); - block_builder.build().unwrap().block - }; - - let relay_chain = Relaychain::new(); - let new_best_heads_sender = relay_chain.inner.lock().unwrap().new_best_heads_sender.clone(); - - let consensus = - run_parachain_consensus(100.into(), client.clone(), relay_chain, Arc::new(|_, _| {}), None); - - let work = async move { - new_best_heads_sender.unbounded_send(block.header().clone()).unwrap(); - - loop { - Delay::new(Duration::from_millis(100)).await; - if block.hash() == client.usage_info().chain.best_hash { - break - } - } - - // Announce the unknown block - new_best_heads_sender.unbounded_send(unknown_block.header().clone()).unwrap(); - - // Do some iterations. As this is a local task executor, only one task can run at a time. - // Meaning that it should already have processed the unknown block. - for _ in 0..3usize { - Delay::new(Duration::from_millis(100)).await; - } - - let (header, body) = unknown_block.clone().deconstruct(); - - let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, header); - block_import_params.fork_choice = Some(ForkChoiceStrategy::Custom(false)); - block_import_params.body = Some(body); - - // Now import the unkown block to make it "known" - client.import_block(block_import_params).await.unwrap(); - - loop { - Delay::new(Duration::from_millis(100)).await; - if unknown_block.hash() == client.usage_info().chain.best_hash { - break - } - } - }; - - block_on(async move { - futures::pin_mut!(consensus); - futures::pin_mut!(work); - - select! { - r = consensus.fuse() => panic!("Consensus should not end: {:?}", r), - _ = work.fuse() => {}, - } - }); -} - -/// When we import a new best relay chain block, we extract the best parachain block from it and set -/// it. This works when we follow the relay chain and parachain at the tip of each other, but there -/// can be race conditions when we are doing a full sync of both or just the relay chain. -/// The problem is that we import parachain blocks as best as long as we are in major sync. So, we -/// could import block 100 as best and then import a relay chain block that says that block 99 is -/// the best parachain block. This should not happen, we should never set the best block to a lower -/// block number. -#[test] -fn do_not_set_best_block_to_older_block() { - const NUM_BLOCKS: usize = 4; - - sp_tracing::try_init_simple(); - - let backend = Arc::new(Backend::new_test(1000, 1)); - - let client = Arc::new(TestClientBuilder::with_backend(backend).build()); - - let blocks = (0..NUM_BLOCKS) - .map(|_| build_and_import_block(client.clone(), true)) - .collect::>(); - - assert_eq!(NUM_BLOCKS as u32, client.usage_info().chain.best_number); - - let relay_chain = Relaychain::new(); - let new_best_heads_sender = relay_chain.inner.lock().unwrap().new_best_heads_sender.clone(); - - let consensus = - run_parachain_consensus(100.into(), client.clone(), relay_chain, Arc::new(|_, _| {}), None); - - let work = async move { - new_best_heads_sender - .unbounded_send(blocks[NUM_BLOCKS - 2].header().clone()) - .unwrap(); - // Wait for it to be processed. - Delay::new(Duration::from_millis(300)).await; - }; - - block_on(async move { - futures::pin_mut!(consensus); - futures::pin_mut!(work); - - select! { - r = consensus.fuse() => panic!("Consensus should not end: {:?}", r), - _ = work.fuse() => {}, - } - }); - - // Build and import a new best block. - build_and_import_block(client, true); -} - -#[test] -fn prune_blocks_on_level_overflow() { - // Here we are using the timestamp value to generate blocks with different hashes. - const LEVEL_LIMIT: usize = 3; - const TIMESTAMP_MULTIPLIER: u64 = 60000; - - let backend = Arc::new(Backend::new_test(1000, 3)); - let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); - let mut para_import = ParachainBlockImport::new_with_limit( - client.clone(), - backend.clone(), - LevelLimit::Some(LEVEL_LIMIT), - ); - - let block0 = build_and_import_block_ext( - &*client, - BlockOrigin::NetworkInitialSync, - true, - &mut para_import, - None, - None, - ); - let id0 = block0.header.hash(); - - let blocks1 = (0..LEVEL_LIMIT) - .map(|i| { - build_and_import_block_ext( - &*client, - if i == 1 { BlockOrigin::NetworkInitialSync } else { BlockOrigin::Own }, - i == 1, - &mut para_import, - Some(id0), - Some(i as u64 * TIMESTAMP_MULTIPLIER), - ) - }) - .collect::>(); - let id10 = blocks1[0].header.hash(); - - let blocks2 = (0..2) - .map(|i| { - build_and_import_block_ext( - &*client, - BlockOrigin::Own, - false, - &mut para_import, - Some(id10), - Some(i as u64 * TIMESTAMP_MULTIPLIER), - ) - }) - .collect::>(); - - // Initial scenario (with B11 imported as best) - // - // B0 --+-- B10 --+-- B20 - // +-- B11 +-- B21 - // +-- B12 - - let leaves = backend.blockchain().leaves().unwrap(); - let mut expected = vec![ - blocks2[0].header.hash(), - blocks2[1].header.hash(), - blocks1[1].header.hash(), - blocks1[2].header.hash(), - ]; - assert_eq!(leaves, expected); - let best = client.usage_info().chain.best_hash; - assert_eq!(best, blocks1[1].header.hash()); - - let block13 = build_and_import_block_ext( - &*client, - BlockOrigin::Own, - false, - &mut para_import, - Some(id0), - Some(LEVEL_LIMIT as u64 * TIMESTAMP_MULTIPLIER), - ); - - // Expected scenario - // - // B0 --+-- B10 --+-- B20 - // +-- B11 +-- B21 - // +--(B13) <-- B12 has been replaced - - let leaves = backend.blockchain().leaves().unwrap(); - expected[3] = block13.header.hash(); - assert_eq!(leaves, expected); - - let block14 = build_and_import_block_ext( - &*client, - BlockOrigin::Own, - false, - &mut para_import, - Some(id0), - Some(2 * LEVEL_LIMIT as u64 * TIMESTAMP_MULTIPLIER), - ); - - // Expected scenario - // - // B0 --+--(B14) <-- B10 has been replaced - // +-- B11 - // +--(B13) - - let leaves = backend.blockchain().leaves().unwrap(); - expected.remove(0); - expected.remove(0); - expected.push(block14.header.hash()); - assert_eq!(leaves, expected); -} - -#[test] -fn restore_limit_monitor() { - // Here we are using the timestamp value to generate blocks with different hashes. - const LEVEL_LIMIT: usize = 2; - const TIMESTAMP_MULTIPLIER: u64 = 60000; - - let backend = Arc::new(Backend::new_test(1000, 3)); - let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); - - // Start with a block import not enforcing any limit... - let mut para_import = ParachainBlockImport::new_with_limit( - client.clone(), - backend.clone(), - LevelLimit::Some(usize::MAX), - ); - - let block00 = build_and_import_block_ext( - &*client, - BlockOrigin::NetworkInitialSync, - true, - &mut para_import, - None, - None, - ); - let id00 = block00.header.hash(); - - let blocks1 = (0..LEVEL_LIMIT + 1) - .map(|i| { - build_and_import_block_ext( - &*client, - if i == 1 { BlockOrigin::NetworkInitialSync } else { BlockOrigin::Own }, - i == 1, - &mut para_import, - Some(id00), - Some(i as u64 * TIMESTAMP_MULTIPLIER), - ) - }) - .collect::>(); - let id10 = blocks1[0].header.hash(); - - let _ = (0..LEVEL_LIMIT) - .map(|i| { - build_and_import_block_ext( - &*client, - BlockOrigin::Own, - false, - &mut para_import, - Some(id10), - Some(i as u64 * TIMESTAMP_MULTIPLIER), - ) - }) - .collect::>(); - - // Scenario before limit application (with B11 imported as best) - // Import order (freshess): B00, B10, B11, B12, B20, B21 - // - // B00 --+-- B10 --+-- B20 - // | +-- B21 - // +-- B11 - // | - // +-- B12 - - // Simulate a restart by forcing a new monitor structure instance - - let mut para_import = ParachainBlockImport::new_with_limit( - client.clone(), - backend.clone(), - LevelLimit::Some(LEVEL_LIMIT), - ); - - let monitor_sd = para_import.monitor.clone().unwrap(); - - let monitor = monitor_sd.shared_data(); - assert_eq!(monitor.import_counter, 3); - std::mem::drop(monitor); - - let block13 = build_and_import_block_ext( - &*client, - BlockOrigin::Own, - false, - &mut para_import, - Some(id00), - Some(LEVEL_LIMIT as u64 * TIMESTAMP_MULTIPLIER), - ); - - // Expected scenario - // - // B0 --+-- B11 - // +--(B13) - - let leaves = backend.blockchain().leaves().unwrap(); - let expected = vec![blocks1[1].header.hash(), block13.header.hash()]; - assert_eq!(leaves, expected); - - let monitor = monitor_sd.shared_data(); - assert_eq!(monitor.import_counter, 4); - assert!(monitor.levels.iter().all(|(number, hashes)| { - hashes - .iter() - .filter(|hash| **hash != block13.header.hash()) - .all(|hash| *number == *monitor.freshness.get(hash).unwrap()) - })); - assert_eq!(*monitor.freshness.get(&block13.header.hash()).unwrap(), monitor.import_counter); -} diff --git a/cumulus/client/consensus/proposer/Cargo.toml b/cumulus/client/consensus/proposer/Cargo.toml deleted file mode 100644 index 579981225ebf..000000000000 --- a/cumulus/client/consensus/proposer/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "cumulus-client-consensus-proposer" -description = "A Substrate `Proposer` for building parachain blocks" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -anyhow = "1.0" -async-trait = "0.1.73" -thiserror = "1.0.46" - -# Substrate -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Cumulus -cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent" } diff --git a/cumulus/client/consensus/proposer/src/lib.rs b/cumulus/client/consensus/proposer/src/lib.rs deleted file mode 100644 index 9c607490a52a..000000000000 --- a/cumulus/client/consensus/proposer/src/lib.rs +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The Cumulus [`Proposer`] is a wrapper around a Substrate [`sp_consensus::Environment`] -//! for creating new parachain blocks. -//! -//! This utility is designed to be composed within any collator consensus algorithm. - -use async_trait::async_trait; - -use cumulus_primitives_parachain_inherent::ParachainInherentData; -use sp_consensus::{EnableProofRecording, Environment, Proposal, Proposer as SubstrateProposer}; -use sp_inherents::InherentData; -use sp_runtime::{traits::Block as BlockT, Digest}; -use sp_state_machine::StorageProof; - -use std::{fmt::Debug, time::Duration}; - -/// Errors that can occur when proposing a parachain block. -#[derive(thiserror::Error, Debug)] -#[error(transparent)] -pub struct Error { - inner: anyhow::Error, -} - -impl Error { - /// Create an error tied to the creation of a proposer. - pub fn proposer_creation(err: impl Into) -> Self { - Error { inner: err.into().context("Proposer Creation") } - } - - /// Create an error tied to the proposing logic itself. - pub fn proposing(err: impl Into) -> Self { - Error { inner: err.into().context("Proposing") } - } -} - -/// A type alias for easily referring to the type of a proposal produced by a specific -/// [`Proposer`]. -pub type ProposalOf = Proposal>::Transaction, StorageProof>; - -/// An interface for proposers. -#[async_trait] -pub trait ProposerInterface { - /// The underlying DB transaction type produced with the block proposal. - type Transaction: Default + Send + 'static; - - /// Propose a collation using the supplied `InherentData` and the provided - /// `ParachainInherentData`. - /// - /// Also specify any required inherent digests, the maximum proposal duration, - /// and the block size limit in bytes. See the documentation on - /// [`sp_consensus::Proposer::propose`] for more details on how to interpret these parameters. - /// - /// The `InherentData` and `Digest` are left deliberately general in order to accommodate - /// all possible collator selection algorithms or inherent creation mechanisms, - /// while the `ParachainInherentData` is made explicit so it will be constructed appropriately. - /// - /// If the `InherentData` passed into this function already has a `ParachainInherentData`, - /// this should throw an error. - async fn propose( - &mut self, - parent_header: &Block::Header, - paras_inherent_data: &ParachainInherentData, - other_inherent_data: InherentData, - inherent_digests: Digest, - max_duration: Duration, - block_size_limit: Option, - ) -> Result, Error>; -} - -/// A simple wrapper around a Substrate proposer for creating collations. -pub struct Proposer { - inner: T, - _marker: std::marker::PhantomData, -} - -impl Proposer { - /// Create a new Cumulus [`Proposer`]. - pub fn new(inner: T) -> Self { - Proposer { inner, _marker: std::marker::PhantomData } - } -} - -#[async_trait] -impl ProposerInterface for Proposer -where - B: sp_runtime::traits::Block, - T: Environment + Send, - T::Error: Send + Sync + 'static, - T::Proposer: SubstrateProposer, - >::Error: Send + Sync + 'static, -{ - type Transaction = <>::Proposer as SubstrateProposer>::Transaction; - - async fn propose( - &mut self, - parent_header: &B::Header, - paras_inherent_data: &ParachainInherentData, - other_inherent_data: InherentData, - inherent_digests: Digest, - max_duration: Duration, - block_size_limit: Option, - ) -> Result, Error> { - let proposer = self - .inner - .init(parent_header) - .await - .map_err(|e| Error::proposer_creation(anyhow::Error::new(e)))?; - - let mut inherent_data = other_inherent_data; - inherent_data - .put_data( - cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER, - ¶s_inherent_data, - ) - .map_err(|e| Error::proposing(anyhow::Error::new(e)))?; - - proposer - .propose(inherent_data, inherent_digests, max_duration, block_size_limit) - .await - .map_err(|e| Error::proposing(anyhow::Error::new(e)).into()) - } -} diff --git a/cumulus/client/consensus/relay-chain/Cargo.toml b/cumulus/client/consensus/relay-chain/Cargo.toml deleted file mode 100644 index 31f5988fb98e..000000000000 --- a/cumulus/client/consensus/relay-chain/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "cumulus-client-consensus-relay-chain" -description = "The relay-chain provided consensus algorithm" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -async-trait = "0.1.73" -futures = "0.3.28" -parking_lot = "0.12.1" -tracing = "0.1.37" - -# Substrate -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Cumulus -cumulus-client-consensus-common = { path = "../common" } -cumulus-primitives-core = { path = "../../../primitives/core" } -cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } diff --git a/cumulus/client/consensus/relay-chain/src/import_queue.rs b/cumulus/client/consensus/relay-chain/src/import_queue.rs deleted file mode 100644 index ba082574328b..000000000000 --- a/cumulus/client/consensus/relay-chain/src/import_queue.rs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use std::{marker::PhantomData, sync::Arc}; - -use cumulus_client_consensus_common::ParachainBlockImportMarker; - -use sc_consensus::{ - import_queue::{BasicQueue, Verifier as VerifierT}, - BlockImport, BlockImportParams, -}; -use sp_api::ProvideRuntimeApi; -use sp_block_builder::BlockBuilder as BlockBuilderApi; -use sp_blockchain::Result as ClientResult; -use sp_consensus::error::Error as ConsensusError; -use sp_inherents::{CreateInherentDataProviders, InherentDataProvider}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - -/// A verifier that just checks the inherents. -pub struct Verifier { - client: Arc, - create_inherent_data_providers: CIDP, - _marker: PhantomData, -} - -impl Verifier { - /// Create a new instance. - pub fn new(client: Arc, create_inherent_data_providers: CIDP) -> Self { - Self { client, create_inherent_data_providers, _marker: PhantomData } - } -} - -#[async_trait::async_trait] -impl VerifierT for Verifier -where - Block: BlockT, - Client: ProvideRuntimeApi + Send + Sync, - >::Api: BlockBuilderApi, - CIDP: CreateInherentDataProviders, -{ - async fn verify( - &mut self, - mut block_params: BlockImportParams, - ) -> Result, String> { - // Skip checks that include execution, if being told so, or when importing only state. - // - // This is done for example when gap syncing and it is expected that the block after the gap - // was checked/chosen properly, e.g. by warp syncing to this block using a finality proof. - if block_params.state_action.skip_execution_checks() || block_params.with_state() { - return Ok(block_params) - } - - if let Some(inner_body) = block_params.body.take() { - let inherent_data_providers = self - .create_inherent_data_providers - .create_inherent_data_providers(*block_params.header.parent_hash(), ()) - .await - .map_err(|e| e.to_string())?; - - let inherent_data = inherent_data_providers - .create_inherent_data() - .await - .map_err(|e| format!("{:?}", e))?; - - let block = Block::new(block_params.header.clone(), inner_body); - - let inherent_res = self - .client - .runtime_api() - .check_inherents(*block.header().parent_hash(), block.clone(), inherent_data) - .map_err(|e| format!("{:?}", e))?; - - if !inherent_res.ok() { - for (i, e) in inherent_res.into_errors() { - match inherent_data_providers.try_handle_error(&i, &e).await { - Some(r) => r.map_err(|e| format!("{:?}", e))?, - None => Err(format!( - "Unhandled inherent error from `{}`.", - String::from_utf8_lossy(&i) - ))?, - } - } - } - - let (_, inner_body) = block.deconstruct(); - block_params.body = Some(inner_body); - } - - block_params.post_hash = Some(block_params.header.hash()); - - Ok(block_params) - } -} - -/// Start an import queue for a Cumulus collator that does not uses any special authoring logic. -pub fn import_queue( - client: Arc, - block_import: I, - create_inherent_data_providers: CIDP, - spawner: &impl sp_core::traits::SpawnEssentialNamed, - registry: Option<&substrate_prometheus_endpoint::Registry>, -) -> ClientResult> -where - I: BlockImport - + ParachainBlockImportMarker - + Send - + Sync - + 'static, - I::Transaction: Send, - Client: ProvideRuntimeApi + Send + Sync + 'static, - >::Api: BlockBuilderApi, - CIDP: CreateInherentDataProviders + 'static, -{ - let verifier = Verifier::new(client, create_inherent_data_providers); - - Ok(BasicQueue::new(verifier, Box::new(block_import), None, spawner, registry)) -} diff --git a/cumulus/client/consensus/relay-chain/src/lib.rs b/cumulus/client/consensus/relay-chain/src/lib.rs deleted file mode 100644 index 0f73aea88e88..000000000000 --- a/cumulus/client/consensus/relay-chain/src/lib.rs +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The relay-chain provided consensus algorithm for parachains. -//! -//! This is the simplest consensus algorithm you can use when developing a parachain. It is a -//! permission-less consensus algorithm that doesn't require any staking or similar to join as a -//! collator. In this algorithm the consensus is provided by the relay-chain. This works in the -//! following way. -//! -//! 1. Each node that sees itself as a collator is free to build a parachain candidate. -//! -//! 2. This parachain candidate is send to the parachain validators that are part of the relay -//! chain. -//! -//! 3. The parachain validators validate at most X different parachain candidates, where X is the -//! total number of parachain validators. -//! -//! 4. The parachain candidate that is backed by the most validators is chosen by the relay-chain -//! block producer to be added as backed candidate on chain. -//! -//! 5. After the parachain candidate got backed and included, all collators start at 1. - -use cumulus_client_consensus_common::{ - ParachainBlockImportMarker, ParachainCandidate, ParachainConsensus, -}; -use cumulus_primitives_core::{relay_chain::Hash as PHash, ParaId, PersistedValidationData}; -use cumulus_relay_chain_interface::RelayChainInterface; - -use sc_consensus::{BlockImport, BlockImportParams}; -use sp_consensus::{ - BlockOrigin, EnableProofRecording, Environment, ProofRecording, Proposal, Proposer, -}; -use sp_inherents::{CreateInherentDataProviders, InherentData, InherentDataProvider}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - -use parking_lot::Mutex; -use std::{marker::PhantomData, sync::Arc, time::Duration}; - -mod import_queue; -pub use import_queue::{import_queue, Verifier}; - -const LOG_TARGET: &str = "cumulus-consensus-relay-chain"; - -/// The implementation of the relay-chain provided consensus for parachains. -pub struct RelayChainConsensus { - para_id: ParaId, - proposer_factory: Arc>, - create_inherent_data_providers: Arc, - block_import: Arc>, - relay_chain_interface: RCInterface, - _phantom: PhantomData, -} - -impl Clone for RelayChainConsensus -where - RCInterface: Clone, -{ - fn clone(&self) -> Self { - Self { - para_id: self.para_id, - proposer_factory: self.proposer_factory.clone(), - create_inherent_data_providers: self.create_inherent_data_providers.clone(), - block_import: self.block_import.clone(), - relay_chain_interface: self.relay_chain_interface.clone(), - _phantom: PhantomData, - } - } -} - -impl RelayChainConsensus -where - B: BlockT, - BI: ParachainBlockImportMarker, - RCInterface: RelayChainInterface, - CIDP: CreateInherentDataProviders, -{ - /// Create a new instance of relay-chain provided consensus. - pub fn new( - para_id: ParaId, - proposer_factory: PF, - create_inherent_data_providers: CIDP, - block_import: BI, - relay_chain_interface: RCInterface, - ) -> Self { - Self { - para_id, - proposer_factory: Arc::new(Mutex::new(proposer_factory)), - create_inherent_data_providers: Arc::new(create_inherent_data_providers), - block_import: Arc::new(futures::lock::Mutex::new(block_import)), - relay_chain_interface, - _phantom: PhantomData, - } - } - - /// Get the inherent data with validation function parameters injected - async fn inherent_data( - &self, - parent: B::Hash, - validation_data: &PersistedValidationData, - relay_parent: PHash, - ) -> Option { - let inherent_data_providers = self - .create_inherent_data_providers - .create_inherent_data_providers(parent, (relay_parent, validation_data.clone())) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Failed to create inherent data providers.", - ) - }) - .ok()?; - - inherent_data_providers - .create_inherent_data() - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Failed to create inherent data.", - ) - }) - .ok() - } -} - -#[async_trait::async_trait] -impl ParachainConsensus - for RelayChainConsensus -where - B: BlockT, - RCInterface: RelayChainInterface + Clone, - BI: BlockImport + ParachainBlockImportMarker + Send + Sync, - PF: Environment + Send + Sync, - PF::Proposer: Proposer< - B, - Transaction = BI::Transaction, - ProofRecording = EnableProofRecording, - Proof = ::Proof, - >, - CIDP: CreateInherentDataProviders, -{ - async fn produce_candidate( - &mut self, - parent: &B::Header, - relay_parent: PHash, - validation_data: &PersistedValidationData, - ) -> Option> { - let proposer_future = self.proposer_factory.lock().init(parent); - - let proposer = proposer_future - .await - .map_err( - |e| tracing::error!(target: LOG_TARGET, error = ?e, "Could not create proposer."), - ) - .ok()?; - - let inherent_data = - self.inherent_data(parent.hash(), validation_data, relay_parent).await?; - - let Proposal { block, storage_changes, proof } = proposer - .propose( - inherent_data, - Default::default(), - // TODO: Fix this. - Duration::from_millis(500), - // Set the block limit to 50% of the maximum PoV size. - // - // TODO: If we got benchmarking that includes that encapsulates the proof size, - // we should be able to use the maximum pov size. - Some((validation_data.max_pov_size / 2) as usize), - ) - .await - .map_err(|e| tracing::error!(target: LOG_TARGET, error = ?e, "Proposing failed.")) - .ok()?; - - let (header, extrinsics) = block.clone().deconstruct(); - - let mut block_import_params = BlockImportParams::new(BlockOrigin::Own, header); - block_import_params.body = Some(extrinsics); - block_import_params.state_action = sc_consensus::StateAction::ApplyChanges( - sc_consensus::StorageChanges::Changes(storage_changes), - ); - - if let Err(err) = self.block_import.lock().await.import_block(block_import_params).await { - tracing::error!( - target: LOG_TARGET, - at = ?parent.hash(), - error = ?err, - "Error importing build block.", - ); - - return None - } - - Some(ParachainCandidate { block, proof }) - } -} - -/// Parameters of [`build_relay_chain_consensus`]. -pub struct BuildRelayChainConsensusParams { - pub para_id: ParaId, - pub proposer_factory: PF, - pub create_inherent_data_providers: CIDP, - pub block_import: BI, - pub relay_chain_interface: RCInterface, -} - -/// Build the [`RelayChainConsensus`]. -/// -/// Returns a boxed [`ParachainConsensus`]. -pub fn build_relay_chain_consensus( - BuildRelayChainConsensusParams { - para_id, - proposer_factory, - create_inherent_data_providers, - block_import, - relay_chain_interface, - }: BuildRelayChainConsensusParams, -) -> Box> -where - Block: BlockT, - PF: Environment + Send + Sync + 'static, - PF::Proposer: Proposer< - Block, - Transaction = BI::Transaction, - ProofRecording = EnableProofRecording, - Proof = ::Proof, - >, - BI: BlockImport + ParachainBlockImportMarker + Send + Sync + 'static, - CIDP: CreateInherentDataProviders + 'static, - RCInterface: RelayChainInterface + Clone + 'static, -{ - Box::new(RelayChainConsensus::new( - para_id, - proposer_factory, - create_inherent_data_providers, - block_import, - relay_chain_interface, - )) -} diff --git a/cumulus/client/network/Cargo.toml b/cumulus/client/network/Cargo.toml deleted file mode 100644 index 2a4c96389892..000000000000 --- a/cumulus/client/network/Cargo.toml +++ /dev/null @@ -1,52 +0,0 @@ -[package] -name = "cumulus-client-network" -version = "0.1.0" -authors = ["Parity Technologies "] -description = "Cumulus-specific networking protocol" -edition = "2021" - -[dependencies] -async-trait = "0.1.73" -codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.28" -futures-timer = "3.0.2" -parking_lot = "0.12.1" -tracing = "0.1.37" - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-node-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } - -[dev-dependencies] -portpicker = "0.1.1" -tokio = { version = "1.31.0", features = ["macros"] } -url = "2.4.0" - -# Substrate -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-test-client = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-inprocess-interface = { path = "../relay-chain-inprocess-interface" } -cumulus-test-service = { path = "../../test/service" } diff --git a/cumulus/client/network/src/lib.rs b/cumulus/client/network/src/lib.rs deleted file mode 100644 index b42342e5b778..000000000000 --- a/cumulus/client/network/src/lib.rs +++ /dev/null @@ -1,512 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Parachain specific networking -//! -//! Provides a custom block announcement implementation for parachains -//! that use the relay chain provided consensus. See [`RequireSecondedInBlockAnnounce`] -//! and [`WaitToAnnounce`] for more information about this implementation. - -use sp_consensus::block_validation::{ - BlockAnnounceValidator as BlockAnnounceValidatorT, Validation, -}; -use sp_core::traits::SpawnNamed; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - -use cumulus_relay_chain_interface::RelayChainInterface; -use polkadot_node_primitives::{CollationSecondedSignal, Statement}; -use polkadot_parachain::primitives::HeadData; -use polkadot_primitives::{ - CandidateReceipt, CompactStatement, Hash as PHash, Id as ParaId, OccupiedCoreAssumption, - SigningContext, UncheckedSigned, -}; - -use codec::{Decode, DecodeAll, Encode}; -use futures::{channel::oneshot, future::FutureExt, Future}; -use std::{convert::TryFrom, fmt, marker::PhantomData, pin::Pin, sync::Arc}; - -#[cfg(test)] -mod tests; - -const LOG_TARGET: &str = "sync::cumulus"; - -type BoxedError = Box; - -#[derive(Debug)] -struct BlockAnnounceError(String); -impl std::error::Error for BlockAnnounceError {} - -impl fmt::Display for BlockAnnounceError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} - -/// The data that we attach to a block announcement. -/// -/// This will be used to prove that a header belongs to a block that is probably being backed by -/// the relay chain. -#[derive(Encode, Debug)] -pub struct BlockAnnounceData { - /// The receipt identifying the candidate. - receipt: CandidateReceipt, - /// The seconded statement issued by a relay chain validator that approves the candidate. - statement: UncheckedSigned, - /// The relay parent that was used as context to sign the [`Self::statement`]. - relay_parent: PHash, -} - -impl Decode for BlockAnnounceData { - fn decode(input: &mut I) -> Result { - let receipt = CandidateReceipt::decode(input)?; - let statement = UncheckedSigned::::decode(input)?; - - let relay_parent = match PHash::decode(input) { - Ok(p) => p, - // For being backwards compatible, we support missing relay-chain parent. - Err(_) => receipt.descriptor.relay_parent, - }; - - Ok(Self { receipt, statement, relay_parent }) - } -} - -impl BlockAnnounceData { - /// Validate that the receipt, statement and announced header match. - /// - /// This will not check the signature, for this you should use - /// [`BlockAnnounceData::check_signature`]. - fn validate(&self, encoded_header: Vec) -> Result<(), Validation> { - let candidate_hash = - if let CompactStatement::Seconded(h) = self.statement.unchecked_payload() { - h - } else { - tracing::debug!(target: LOG_TARGET, "`CompactStatement` isn't the candidate variant!",); - return Err(Validation::Failure { disconnect: true }) - }; - - if *candidate_hash != self.receipt.hash() { - tracing::debug!( - target: LOG_TARGET, - "Receipt candidate hash doesn't match candidate hash in statement", - ); - return Err(Validation::Failure { disconnect: true }) - } - - if HeadData(encoded_header).hash() != self.receipt.descriptor.para_head { - tracing::debug!( - target: LOG_TARGET, - "Receipt para head hash doesn't match the hash of the header in the block announcement", - ); - return Err(Validation::Failure { disconnect: true }) - } - - Ok(()) - } - - /// Check the signature of the statement. - /// - /// Returns an `Err(_)` if it failed. - async fn check_signature( - self, - relay_chain_client: &RCInterface, - ) -> Result - where - RCInterface: RelayChainInterface + 'static, - { - let validator_index = self.statement.unchecked_validator_index(); - - let session_index = - match relay_chain_client.session_index_for_child(self.relay_parent).await { - Ok(r) => r, - Err(e) => return Err(BlockAnnounceError(format!("{:?}", e))), - }; - - let signing_context = SigningContext { parent_hash: self.relay_parent, session_index }; - - // Check that the signer is a legit validator. - let authorities = match relay_chain_client.validators(self.relay_parent).await { - Ok(r) => r, - Err(e) => return Err(BlockAnnounceError(format!("{:?}", e))), - }; - let signer = match authorities.get(validator_index.0 as usize) { - Some(r) => r, - None => { - tracing::debug!( - target: LOG_TARGET, - "Block announcement justification signer is a validator index out of bound", - ); - - return Ok(Validation::Failure { disconnect: true }) - }, - }; - - // Check statement is correctly signed. - if self.statement.try_into_checked(&signing_context, signer).is_err() { - tracing::debug!( - target: LOG_TARGET, - "Block announcement justification signature is invalid.", - ); - - return Ok(Validation::Failure { disconnect: true }) - } - - Ok(Validation::Success { is_new_best: true }) - } -} - -impl TryFrom<&'_ CollationSecondedSignal> for BlockAnnounceData { - type Error = (); - - fn try_from(signal: &CollationSecondedSignal) -> Result { - let receipt = if let Statement::Seconded(receipt) = signal.statement.payload() { - receipt.to_plain() - } else { - return Err(()) - }; - - Ok(BlockAnnounceData { - receipt, - statement: signal.statement.convert_payload().into(), - relay_parent: signal.relay_parent, - }) - } -} - -/// A type alias for the [`RequireSecondedInBlockAnnounce`] validator. -#[deprecated = "This has been renamed to RequireSecondedInBlockAnnounce"] -pub type BlockAnnounceValidator = - RequireSecondedInBlockAnnounce; - -/// Parachain specific block announce validator. -/// -/// This is not required when the collation mechanism itself is sybil-resistant, as it is a spam -/// protection mechanism used to prevent nodes from dealing with unbounded numbers of blocks. For -/// sybil-resistant collation mechanisms, this will only slow things down. -/// -/// This block announce validator is required if the parachain is running -/// with the relay chain provided consensus to make sure each node only -/// imports a reasonable number of blocks per round. The relay chain provided -/// consensus doesn't have any authorities and so it could happen that without -/// this special block announce validator a node would need to import *millions* -/// of blocks per round, which is clearly not doable. -/// -/// To solve this problem, each block announcement is delayed until a collator -/// has received a [`Statement::Seconded`] for its `PoV`. This message tells the -/// collator that its `PoV` was validated successfully by a parachain validator and -/// that it is very likely that this `PoV` will be included in the relay chain. Every -/// collator that doesn't receive the message for its `PoV` will not announce its block. -/// For more information on the block announcement, see [`WaitToAnnounce`]. -/// -/// For each block announcement that is received, the generic block announcement validation -/// will call this validator and provides the extra data that was attached to the announcement. -/// We call this extra data `justification`. -/// It is expected that the attached data is a SCALE encoded [`BlockAnnounceData`]. The -/// statement is checked to be a [`CompactStatement::Seconded`] and that it is signed by an active -/// parachain validator. -/// -/// If no justification was provided we check if the block announcement is at the tip of the known -/// chain. If it is at the tip, it is required to provide a justification or otherwise we reject -/// it. However, if the announcement is for a block below the tip the announcement is accepted -/// as it probably comes from a node that is currently syncing the chain. -#[derive(Clone)] -pub struct RequireSecondedInBlockAnnounce { - phantom: PhantomData, - relay_chain_interface: RCInterface, - para_id: ParaId, -} - -impl RequireSecondedInBlockAnnounce -where - RCInterface: Clone, -{ - /// Create a new [`RequireSecondedInBlockAnnounce`]. - pub fn new(relay_chain_interface: RCInterface, para_id: ParaId) -> Self { - Self { phantom: Default::default(), relay_chain_interface, para_id } - } -} - -impl RequireSecondedInBlockAnnounce -where - RCInterface: RelayChainInterface + Clone, -{ - /// Get the included block of the given parachain in the relay chain. - async fn included_block( - relay_chain_interface: &RCInterface, - hash: PHash, - para_id: ParaId, - ) -> Result { - let validation_data = relay_chain_interface - .persisted_validation_data(hash, para_id, OccupiedCoreAssumption::TimedOut) - .await - .map_err(|e| Box::new(BlockAnnounceError(format!("{:?}", e))) as Box<_>)? - .ok_or_else(|| { - Box::new(BlockAnnounceError("Could not find parachain head in relay chain".into())) - as Box<_> - })?; - let para_head = - Block::Header::decode(&mut &validation_data.parent_head.0[..]).map_err(|e| { - Box::new(BlockAnnounceError(format!("Failed to decode parachain head: {:?}", e))) - as Box<_> - })?; - - Ok(para_head) - } - - /// Get the backed block hash of the given parachain in the relay chain. - async fn backed_block_hash( - relay_chain_interface: &RCInterface, - hash: PHash, - para_id: ParaId, - ) -> Result, BoxedError> { - let candidate_receipt = relay_chain_interface - .candidate_pending_availability(hash, para_id) - .await - .map_err(|e| Box::new(BlockAnnounceError(format!("{:?}", e))) as Box<_>)?; - - Ok(candidate_receipt.map(|cr| cr.descriptor.para_head)) - } - - /// Handle a block announcement with empty data (no statement) attached to it. - async fn handle_empty_block_announce_data( - &self, - header: Block::Header, - ) -> Result { - let relay_chain_interface = self.relay_chain_interface.clone(); - let para_id = self.para_id; - - // Check if block is equal or higher than best (this requires a justification) - let relay_chain_best_hash = relay_chain_interface - .best_block_hash() - .await - .map_err(|e| Box::new(e) as Box<_>)?; - let block_number = header.number(); - - let best_head = - Self::included_block(&relay_chain_interface, relay_chain_best_hash, para_id).await?; - let known_best_number = best_head.number(); - let backed_block = || async { - Self::backed_block_hash(&relay_chain_interface, relay_chain_best_hash, para_id).await - }; - - if best_head == header { - tracing::debug!(target: LOG_TARGET, "Announced block matches best block.",); - - Ok(Validation::Success { is_new_best: true }) - } else if Some(HeadData(header.encode()).hash()) == backed_block().await? { - tracing::debug!(target: LOG_TARGET, "Announced block matches latest backed block.",); - - Ok(Validation::Success { is_new_best: true }) - } else if block_number >= known_best_number { - tracing::debug!( - target: LOG_TARGET, - "Validation failed because a justification is needed if the block at the top of the chain." - ); - - Ok(Validation::Failure { disconnect: false }) - } else { - Ok(Validation::Success { is_new_best: false }) - } - } -} - -impl BlockAnnounceValidatorT - for RequireSecondedInBlockAnnounce -where - RCInterface: RelayChainInterface + Clone + 'static, -{ - fn validate( - &mut self, - header: &Block::Header, - data: &[u8], - ) -> Pin> + Send>> { - let relay_chain_interface = self.relay_chain_interface.clone(); - let data = data.to_vec(); - let header = header.clone(); - let header_encoded = header.encode(); - let block_announce_validator = self.clone(); - - async move { - let relay_chain_is_syncing = relay_chain_interface - .is_major_syncing() - .await - .map_err( - |e| tracing::error!(target: LOG_TARGET, "Unable to determine sync status. {}", e), - ) - .unwrap_or(false); - - if relay_chain_is_syncing { - return Ok(Validation::Success { is_new_best: false }) - } - - if data.is_empty() { - return block_announce_validator.handle_empty_block_announce_data(header).await - } - - let block_announce_data = match BlockAnnounceData::decode_all(&mut data.as_slice()) { - Ok(r) => r, - Err(err) => - return Err(Box::new(BlockAnnounceError(format!( - "Can not decode the `BlockAnnounceData`: {:?}", - err - ))) as Box<_>), - }; - - if let Err(e) = block_announce_data.validate(header_encoded) { - return Ok(e) - } - - let relay_parent = block_announce_data.receipt.descriptor.relay_parent; - - relay_chain_interface - .wait_for_block(relay_parent) - .await - .map_err(|e| Box::new(BlockAnnounceError(e.to_string())) as Box<_>)?; - - block_announce_data - .check_signature(&relay_chain_interface) - .await - .map_err(|e| Box::new(e) as Box<_>) - } - .boxed() - } -} - -/// Wait before announcing a block that a candidate message has been received for this block, then -/// add this message as justification for the block announcement. -/// -/// This object will spawn a new task every time the method `wait_to_announce` is called and cancel -/// the previous task running. -pub struct WaitToAnnounce { - spawner: Arc, - announce_block: Arc>) + Send + Sync>, -} - -impl WaitToAnnounce { - /// Create the `WaitToAnnounce` object - pub fn new( - spawner: Arc, - announce_block: Arc>) + Send + Sync>, - ) -> WaitToAnnounce { - WaitToAnnounce { spawner, announce_block } - } - - /// Wait for a candidate message for the block, then announce the block. The candidate - /// message will be added as justification to the block announcement. - pub fn wait_to_announce( - &mut self, - block_hash: ::Hash, - signed_stmt_recv: oneshot::Receiver, - ) { - let announce_block = self.announce_block.clone(); - - self.spawner.spawn( - "cumulus-wait-to-announce", - None, - async move { - tracing::debug!( - target: "cumulus-network", - "waiting for announce block in a background task...", - ); - - wait_to_announce::(block_hash, announce_block, signed_stmt_recv).await; - - tracing::debug!( - target: "cumulus-network", - "block announcement finished", - ); - } - .boxed(), - ); - } -} - -async fn wait_to_announce( - block_hash: ::Hash, - announce_block: Arc>) + Send + Sync>, - signed_stmt_recv: oneshot::Receiver, -) { - let signal = match signed_stmt_recv.await { - Ok(s) => s, - Err(_) => { - tracing::debug!( - target: "cumulus-network", - block = ?block_hash, - "Wait to announce stopped, because sender was dropped.", - ); - return - }, - }; - - if let Ok(data) = BlockAnnounceData::try_from(&signal) { - announce_block(block_hash, Some(data.encode())); - } else { - tracing::debug!( - target: "cumulus-network", - ?signal, - block = ?block_hash, - "Received invalid statement while waiting to announce block.", - ); - } -} - -/// A [`BlockAnnounceValidator`] which accepts all block announcements, as it assumes -/// sybil resistance is handled elsewhere. -#[derive(Debug, Clone)] -pub struct AssumeSybilResistance(bool); - -impl AssumeSybilResistance { - /// Instantiate this block announcement validator while permissively allowing (but ignoring) - /// announcements which come tagged with seconded messages. - /// - /// This is useful for backwards compatibility when upgrading nodes: old nodes will continue - /// to broadcast announcements with seconded messages, so these announcements shouldn't be - /// rejected and the peers not punished. - pub fn allow_seconded_messages() -> Self { - AssumeSybilResistance(true) - } - - /// Instantiate this block announcement validator while rejecting announcements that come with - /// data. - pub fn reject_seconded_messages() -> Self { - AssumeSybilResistance(false) - } -} - -impl BlockAnnounceValidatorT for AssumeSybilResistance { - fn validate( - &mut self, - _header: &Block::Header, - data: &[u8], - ) -> Pin> + Send>> { - let allow_seconded_messages = self.0; - let data = data.to_vec(); - - async move { - Ok(if data.is_empty() { - Validation::Success { is_new_best: false } - } else if !allow_seconded_messages { - Validation::Failure { disconnect: false } - } else { - match BlockAnnounceData::decode_all(&mut data.as_slice()) { - Ok(_) => Validation::Success { is_new_best: false }, - Err(_) => Validation::Failure { disconnect: true }, - } - }) - } - .boxed() - } -} diff --git a/cumulus/client/network/src/tests.rs b/cumulus/client/network/src/tests.rs deleted file mode 100644 index e1bb961c75fd..000000000000 --- a/cumulus/client/network/src/tests.rs +++ /dev/null @@ -1,584 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -use super::*; -use async_trait::async_trait; -use cumulus_primitives_core::relay_chain::BlockId; -use cumulus_relay_chain_inprocess_interface::{check_block_in_chain, BlockCheckStatus}; -use cumulus_relay_chain_interface::{ - OverseerHandle, PHeader, ParaId, RelayChainError, RelayChainResult, -}; -use cumulus_test_service::runtime::{Block, Hash, Header}; -use futures::{executor::block_on, poll, task::Poll, FutureExt, Stream, StreamExt}; -use parking_lot::Mutex; -use polkadot_node_primitives::{SignedFullStatement, Statement}; -use polkadot_primitives::{ - CandidateCommitments, CandidateDescriptor, CollatorPair, CommittedCandidateReceipt, - Hash as PHash, HeadData, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, - PersistedValidationData, SessionIndex, SigningContext, ValidationCodeHash, ValidatorId, -}; -use polkadot_test_client::{ - Client as PClient, ClientBlockImportExt, DefaultTestClientBuilderExt, FullBackend as PBackend, - InitPolkadotBlockBuilder, TestClientBuilder, TestClientBuilderExt, -}; -use sc_client_api::{Backend, BlockchainEvents}; -use sp_blockchain::HeaderBackend; -use sp_consensus::BlockOrigin; -use sp_core::{Pair, H256}; -use sp_keyring::Sr25519Keyring; -use sp_keystore::{testing::MemoryKeystore, Keystore, KeystorePtr}; -use sp_runtime::RuntimeAppPublic; -use sp_state_machine::StorageValue; -use std::{collections::BTreeMap, time::Duration}; - -fn check_error(error: crate::BoxedError, check_error: impl Fn(&BlockAnnounceError) -> bool) { - let error = *error - .downcast::() - .expect("Downcasts error to `ClientError`"); - if !check_error(&error) { - panic!("Invalid error: {:?}", error); - } -} - -#[derive(Clone)] -struct DummyRelayChainInterface { - data: Arc>, - relay_client: Arc, - relay_backend: Arc, -} - -impl DummyRelayChainInterface { - fn new() -> Self { - let builder = TestClientBuilder::new(); - let relay_backend = builder.backend(); - - Self { - data: Arc::new(Mutex::new(ApiData { - validators: vec![Sr25519Keyring::Alice.public().into()], - has_pending_availability: false, - })), - relay_client: Arc::new(builder.build()), - relay_backend, - } - } -} - -#[async_trait] -impl RelayChainInterface for DummyRelayChainInterface { - async fn validators(&self, _: PHash) -> RelayChainResult> { - Ok(self.data.lock().validators.clone()) - } - - async fn best_block_hash(&self) -> RelayChainResult { - Ok(self.relay_backend.blockchain().info().best_hash) - } - async fn finalized_block_hash(&self) -> RelayChainResult { - Ok(self.relay_backend.blockchain().info().finalized_hash) - } - - async fn retrieve_dmq_contents( - &self, - _: ParaId, - _: PHash, - ) -> RelayChainResult> { - unimplemented!("Not needed for test") - } - - async fn retrieve_all_inbound_hrmp_channel_contents( - &self, - _: ParaId, - _: PHash, - ) -> RelayChainResult>> { - Ok(BTreeMap::new()) - } - - async fn persisted_validation_data( - &self, - _: PHash, - _: ParaId, - _: OccupiedCoreAssumption, - ) -> RelayChainResult> { - Ok(Some(PersistedValidationData { - parent_head: HeadData(default_header().encode()), - ..Default::default() - })) - } - - async fn candidate_pending_availability( - &self, - _: PHash, - _: ParaId, - ) -> RelayChainResult> { - if self.data.lock().has_pending_availability { - Ok(Some(CommittedCandidateReceipt { - descriptor: CandidateDescriptor { - para_head: polkadot_parachain::primitives::HeadData(default_header().encode()) - .hash(), - para_id: 0u32.into(), - relay_parent: PHash::random(), - collator: CollatorPair::generate().0.public(), - persisted_validation_data_hash: PHash::random(), - pov_hash: PHash::random(), - erasure_root: PHash::random(), - signature: sp_core::sr25519::Signature([0u8; 64]).into(), - validation_code_hash: ValidationCodeHash::from(PHash::random()), - }, - commitments: CandidateCommitments { - upward_messages: Default::default(), - horizontal_messages: Default::default(), - new_validation_code: None, - head_data: HeadData(Vec::new()), - processed_downward_messages: 0, - hrmp_watermark: 0, - }, - })) - } else { - Ok(None) - } - } - - async fn session_index_for_child(&self, _: PHash) -> RelayChainResult { - Ok(0) - } - - async fn import_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - Ok(Box::pin( - self.relay_client - .import_notification_stream() - .map(|notification| notification.header), - )) - } - - async fn finality_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - Ok(Box::pin( - self.relay_client - .finality_notification_stream() - .map(|notification| notification.header), - )) - } - - async fn is_major_syncing(&self) -> RelayChainResult { - Ok(false) - } - - fn overseer_handle(&self) -> RelayChainResult { - unimplemented!("Not needed for test") - } - - async fn get_storage_by_key( - &self, - _: PHash, - _: &[u8], - ) -> RelayChainResult> { - unimplemented!("Not needed for test") - } - - async fn prove_read( - &self, - _: PHash, - _: &Vec>, - ) -> RelayChainResult { - unimplemented!("Not needed for test") - } - - async fn wait_for_block(&self, hash: PHash) -> RelayChainResult<()> { - let mut listener = match check_block_in_chain( - self.relay_backend.clone(), - self.relay_client.clone(), - hash, - )? { - BlockCheckStatus::InChain => return Ok(()), - BlockCheckStatus::Unknown(listener) => listener, - }; - - let mut timeout = futures_timer::Delay::new(Duration::from_secs(10)).fuse(); - - loop { - futures::select! { - _ = timeout => return Err(RelayChainError::WaitTimeout(hash)), - evt = listener.next() => match evt { - Some(evt) if evt.hash == hash => return Ok(()), - // Not the event we waited on. - Some(_) => continue, - None => return Err(RelayChainError::ImportListenerClosed(hash)), - } - } - } - } - - async fn new_best_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let notifications_stream = - self.relay_client - .import_notification_stream() - .filter_map(|notification| async move { - if notification.is_new_best { - Some(notification.header) - } else { - None - } - }); - Ok(Box::pin(notifications_stream)) - } - - async fn header(&self, block_id: BlockId) -> RelayChainResult> { - let hash = match block_id { - BlockId::Hash(hash) => hash, - BlockId::Number(num) => - if let Some(hash) = self.relay_client.hash(num)? { - hash - } else { - return Ok(None) - }, - }; - let header = self.relay_client.header(hash)?; - - Ok(header) - } -} - -fn make_validator_and_api() -> ( - RequireSecondedInBlockAnnounce>, - Arc, -) { - let relay_chain_interface = Arc::new(DummyRelayChainInterface::new()); - ( - RequireSecondedInBlockAnnounce::new(relay_chain_interface.clone(), ParaId::from(56)), - relay_chain_interface, - ) -} - -fn default_header() -> Header { - Header { - number: 1, - digest: Default::default(), - extrinsics_root: Default::default(), - parent_hash: Default::default(), - state_root: Default::default(), - } -} - -/// Same as [`make_gossip_message_and_header`], but using the genesis header as relay parent. -async fn make_gossip_message_and_header_using_genesis( - api: Arc, - validator_index: u32, -) -> (CollationSecondedSignal, Header) { - let relay_parent = api.relay_client.hash(0).ok().flatten().expect("Genesis hash exists"); - - make_gossip_message_and_header(api, relay_parent, validator_index).await -} - -async fn make_gossip_message_and_header( - relay_chain_interface: Arc, - relay_parent: H256, - validator_index: u32, -) -> (CollationSecondedSignal, Header) { - let keystore: KeystorePtr = Arc::new(MemoryKeystore::new()); - let alice_public = Keystore::sr25519_generate_new( - &*keystore, - ValidatorId::ID, - Some(&Sr25519Keyring::Alice.to_seed()), - ) - .unwrap(); - let session_index = relay_chain_interface.session_index_for_child(relay_parent).await.unwrap(); - let signing_context = SigningContext { parent_hash: relay_parent, session_index }; - - let header = default_header(); - let candidate_receipt = CommittedCandidateReceipt { - commitments: CandidateCommitments { - head_data: header.encode().into(), - ..Default::default() - }, - descriptor: CandidateDescriptor { - para_id: 0u32.into(), - relay_parent, - collator: CollatorPair::generate().0.public(), - persisted_validation_data_hash: PHash::random(), - pov_hash: PHash::random(), - erasure_root: PHash::random(), - signature: sp_core::sr25519::Signature([0u8; 64]).into(), - para_head: polkadot_parachain::primitives::HeadData(header.encode()).hash(), - validation_code_hash: ValidationCodeHash::from(PHash::random()), - }, - }; - let statement = Statement::Seconded(candidate_receipt); - let signed = SignedFullStatement::sign( - &keystore, - statement, - &signing_context, - validator_index.into(), - &alice_public.into(), - ) - .ok() - .flatten() - .expect("Signing statement"); - - (CollationSecondedSignal { statement: signed, relay_parent }, header) -} - -#[test] -fn valid_if_no_data_and_less_than_best_known_number() { - let mut validator = make_validator_and_api().0; - let header = Header { number: 0, ..default_header() }; - let res = block_on(validator.validate(&header, &[])); - - assert_eq!( - res.unwrap(), - Validation::Success { is_new_best: false }, - "validating without data with block number < best known number is always a success", - ); -} - -#[test] -fn invalid_if_no_data_exceeds_best_known_number() { - let mut validator = make_validator_and_api().0; - let header = Header { number: 1, state_root: Hash::random(), ..default_header() }; - let res = block_on(validator.validate(&header, &[])); - - assert_eq!( - res.unwrap(), - Validation::Failure { disconnect: false }, - "validation fails if no justification and block number >= best known number", - ); -} - -#[test] -fn valid_if_no_data_and_block_matches_best_known_block() { - let mut validator = make_validator_and_api().0; - let res = block_on(validator.validate(&default_header(), &[])); - - assert_eq!( - res.unwrap(), - Validation::Success { is_new_best: true }, - "validation is successful when the block hash matches the best known block", - ); -} - -#[test] -fn check_statement_is_encoded_correctly() { - let mut validator = make_validator_and_api().0; - let header = default_header(); - let res = block_on(validator.validate(&header, &[0x42])) - .expect_err("Should fail on invalid encoded statement"); - - check_error(res, |error| { - matches!( - error, - BlockAnnounceError(x) if x.contains("Can not decode the `BlockAnnounceData`") - ) - }); -} - -#[test] -fn block_announce_data_decoding_should_reject_extra_data() { - let (mut validator, api) = make_validator_and_api(); - - let (signal, header) = block_on(make_gossip_message_and_header_using_genesis(api, 1)); - let mut data = BlockAnnounceData::try_from(&signal).unwrap().encode(); - data.push(0x42); - - let res = block_on(validator.validate(&header, &data)).expect_err("Should return an error "); - - check_error(res, |error| { - matches!( - error, - BlockAnnounceError(x) if x.contains("Input buffer has still data left after decoding!") - ) - }); -} - -#[derive(Encode, Decode, Debug)] -struct LegacyBlockAnnounceData { - receipt: CandidateReceipt, - statement: UncheckedSigned, -} - -#[test] -fn legacy_block_announce_data_handling() { - let (_, api) = make_validator_and_api(); - - let (signal, _) = block_on(make_gossip_message_and_header_using_genesis(api, 1)); - - let receipt = if let Statement::Seconded(receipt) = signal.statement.payload() { - receipt.to_plain() - } else { - panic!("Invalid") - }; - - let legacy = LegacyBlockAnnounceData { - receipt: receipt.clone(), - statement: signal.statement.convert_payload().into(), - }; - - let data = legacy.encode(); - - let block_data = - BlockAnnounceData::decode(&mut &data[..]).expect("Decoding works from legacy works"); - assert_eq!(receipt.descriptor.relay_parent, block_data.relay_parent); - - let data = block_data.encode(); - LegacyBlockAnnounceData::decode(&mut &data[..]).expect("Decoding works"); -} - -#[test] -fn check_signer_is_legit_validator() { - let (mut validator, api) = make_validator_and_api(); - - let (signal, header) = block_on(make_gossip_message_and_header_using_genesis(api, 1)); - let data = BlockAnnounceData::try_from(&signal).unwrap().encode(); - - let res = block_on(validator.validate(&header, &data)); - assert_eq!(Validation::Failure { disconnect: true }, res.unwrap()); -} - -#[test] -fn check_statement_is_correctly_signed() { - let (mut validator, api) = make_validator_and_api(); - - let (signal, header) = block_on(make_gossip_message_and_header_using_genesis(api, 0)); - - let mut data = BlockAnnounceData::try_from(&signal).unwrap().encode(); - - // The signature comes at the end of the type, so change a bit to make the signature invalid. - let last = data.len() - 1; - data[last] = data[last].wrapping_add(1); - - let res = block_on(validator.validate(&header, &data)); - assert_eq!(Validation::Failure { disconnect: true }, res.unwrap()); -} - -#[tokio::test] -async fn check_statement_seconded() { - let (mut validator, relay_chain_interface) = make_validator_and_api(); - let header = default_header(); - let relay_parent = H256::from_low_u64_be(1); - - let keystore: KeystorePtr = Arc::new(MemoryKeystore::new()); - let alice_public = Keystore::sr25519_generate_new( - &*keystore, - ValidatorId::ID, - Some(&Sr25519Keyring::Alice.to_seed()), - ) - .unwrap(); - let session_index = relay_chain_interface.session_index_for_child(relay_parent).await.unwrap(); - let signing_context = SigningContext { parent_hash: relay_parent, session_index }; - - let statement = Statement::Valid(Default::default()); - - let signed_statement = SignedFullStatement::sign( - &keystore, - statement, - &signing_context, - 0.into(), - &alice_public.into(), - ) - .ok() - .flatten() - .expect("Signs statement"); - - let data = BlockAnnounceData { - receipt: CandidateReceipt { - commitments_hash: PHash::random(), - descriptor: CandidateDescriptor { - para_head: HeadData(Vec::new()).hash(), - para_id: 0u32.into(), - relay_parent: PHash::random(), - collator: CollatorPair::generate().0.public(), - persisted_validation_data_hash: PHash::random(), - pov_hash: PHash::random(), - erasure_root: PHash::random(), - signature: sp_core::sr25519::Signature([0u8; 64]).into(), - validation_code_hash: ValidationCodeHash::from(PHash::random()), - }, - }, - statement: signed_statement.convert_payload().into(), - relay_parent, - } - .encode(); - - let res = block_on(validator.validate(&header, &data)); - assert_eq!(Validation::Failure { disconnect: true }, res.unwrap()); -} - -#[test] -fn check_header_match_candidate_receipt_header() { - let (mut validator, api) = make_validator_and_api(); - - let (signal, mut header) = block_on(make_gossip_message_and_header_using_genesis(api, 0)); - let data = BlockAnnounceData::try_from(&signal).unwrap().encode(); - header.number = 300; - - let res = block_on(validator.validate(&header, &data)); - assert_eq!(Validation::Failure { disconnect: true }, res.unwrap()); -} - -/// Test that ensures that we postpone the block announce verification until -/// a relay chain block is imported. This is important for when we receive a -/// block announcement before we have imported the associated relay chain block -/// which can happen on slow nodes or nodes with a slow network connection. -#[test] -fn relay_parent_not_imported_when_block_announce_is_processed() { - block_on(async move { - let (mut validator, api) = make_validator_and_api(); - - let mut client = api.relay_client.clone(); - let block = client.init_polkadot_block_builder().build().expect("Build new block").block; - - let (signal, header) = make_gossip_message_and_header(api, block.hash(), 0).await; - - let data = BlockAnnounceData::try_from(&signal).unwrap().encode(); - - let mut validation = validator.validate(&header, &data); - - // The relay chain block is not available yet, so the first poll should return - // that the future is still pending. - assert!(poll!(&mut validation).is_pending()); - - client.import(BlockOrigin::Own, block).await.expect("Imports the block"); - - assert!(matches!( - poll!(validation), - Poll::Ready(Ok(Validation::Success { is_new_best: true })) - )); - }); -} - -/// Ensures that when we receive a block announcement without a statement included, while the block -/// is not yet included by the node checking the announcement, but the node is already backed. -#[test] -fn block_announced_without_statement_and_block_only_backed() { - block_on(async move { - let (mut validator, api) = make_validator_and_api(); - api.data.lock().has_pending_availability = true; - - let header = default_header(); - - let validation = validator.validate(&header, &[]); - - assert!(matches!(validation.await, Ok(Validation::Success { is_new_best: true }))); - }); -} - -#[derive(Default)] -struct ApiData { - validators: Vec, - has_pending_availability: bool, -} diff --git a/cumulus/client/pov-recovery/Cargo.toml b/cumulus/client/pov-recovery/Cargo.toml deleted file mode 100644 index d574f718b52d..000000000000 --- a/cumulus/client/pov-recovery/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -[package] -name = "cumulus-client-pov-recovery" -version = "0.1.0" -authors = ["Parity Technologies "] -description = "Cumulus-specific networking protocol" -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ] } -futures = "0.3.28" -futures-timer = "3.0.2" -rand = "0.8.5" -tracing = "0.1.37" - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-maybe-compressed-blob = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-node-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-subsystem = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-interface = {path = "../relay-chain-interface"} -async-trait = "0.1.73" - -[dev-dependencies] -tokio = { version = "1.31.0", features = ["macros"] } -portpicker = "0.1.1" - -# Cumulus -cumulus-test-service = { path = "../../test/service" } - -# Substrate -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } diff --git a/cumulus/client/pov-recovery/src/active_candidate_recovery.rs b/cumulus/client/pov-recovery/src/active_candidate_recovery.rs deleted file mode 100644 index feb09d005cec..000000000000 --- a/cumulus/client/pov-recovery/src/active_candidate_recovery.rs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -use sp_runtime::traits::Block as BlockT; - -use polkadot_node_primitives::AvailableData; -use polkadot_node_subsystem::messages::AvailabilityRecoveryMessage; - -use futures::{channel::oneshot, stream::FuturesUnordered, Future, FutureExt, StreamExt}; - -use std::{collections::HashSet, pin::Pin}; - -use crate::RecoveryHandle; - -/// The active candidate recovery. -/// -/// This handles the candidate recovery and tracks the activate recoveries. -pub(crate) struct ActiveCandidateRecovery { - /// The recoveries that are currently being executed. - recoveries: FuturesUnordered< - Pin)> + Send>>, - >, - /// The block hashes of the candidates currently being recovered. - candidates: HashSet, - recovery_handle: Box, -} - -impl ActiveCandidateRecovery { - pub fn new(recovery_handle: Box) -> Self { - Self { recoveries: Default::default(), candidates: Default::default(), recovery_handle } - } - - /// Recover the given `candidate`. - pub async fn recover_candidate( - &mut self, - block_hash: Block::Hash, - candidate: &crate::Candidate, - ) { - let (tx, rx) = oneshot::channel(); - - self.recovery_handle - .send_recovery_msg( - AvailabilityRecoveryMessage::RecoverAvailableData( - candidate.receipt.clone(), - candidate.session_index, - None, - tx, - ), - "ActiveCandidateRecovery", - ) - .await; - - self.candidates.insert(block_hash); - - self.recoveries.push( - async move { - match rx.await { - Ok(Ok(res)) => (block_hash, Some(res)), - Ok(Err(error)) => { - tracing::debug!( - target: crate::LOG_TARGET, - ?error, - ?block_hash, - "Availability recovery failed", - ); - (block_hash, None) - }, - Err(_) => { - tracing::debug!( - target: crate::LOG_TARGET, - "Availability recovery oneshot channel closed", - ); - (block_hash, None) - }, - } - } - .boxed(), - ); - } - - /// Waits for the next recovery. - /// - /// If the returned [`AvailableData`] is `None`, it means that the recovery failed. - pub async fn wait_for_recovery(&mut self) -> (Block::Hash, Option) { - loop { - if let Some(res) = self.recoveries.next().await { - self.candidates.remove(&res.0); - return res - } else { - futures::pending!() - } - } - } -} diff --git a/cumulus/client/pov-recovery/src/lib.rs b/cumulus/client/pov-recovery/src/lib.rs deleted file mode 100644 index a7509c54ab09..000000000000 --- a/cumulus/client/pov-recovery/src/lib.rs +++ /dev/null @@ -1,657 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Parachain PoV recovery -//! -//! A parachain needs to build PoVs that are send to the relay chain to progress. These PoVs are -//! erasure encoded and one piece of it is stored by each relay chain validator. As the relay chain -//! decides on which PoV per parachain to include and thus, to progess the parachain it can happen -//! that the block corresponding to this PoV isn't propagated in the parachain network. This can -//! have several reasons, either a malicious collator that managed to include its own PoV and -//! doesn't want to share it with the rest of the network or maybe a collator went down before it -//! could distribute the block in the network. When something like this happens we can use the PoV -//! recovery algorithm implemented in this crate to recover a PoV and to propagate it with the rest -//! of the network. -//! -//! It works in the following way: -//! -//! 1. For every included relay chain block we note the backed candidate of our parachain. If the -//! block belonging to the PoV is already known, we do nothing. Otherwise we start a timer that -//! waits for a randomized time inside a specified interval before starting to -//! recover the PoV. -//! -//! 2. If between starting and firing the timer the block is imported, we skip the recovery of the -//! PoV. -//! -//! 3. If the timer fired we recover the PoV using the relay chain PoV recovery protocol. -//! -//! 4a. After it is recovered, we restore the block and import it. -//! -//! 4b. Since we are trying to recover pending candidates, availability is not guaranteed. If the -//! block PoV is not yet available, we retry. -//! -//! If we need to recover multiple PoV blocks (which should hopefully not happen in real life), we -//! make sure that the blocks are imported in the correct order. - -use sc_client_api::{BlockBackend, BlockchainEvents, UsageProvider}; -use sc_consensus::import_queue::{ImportQueueService, IncomingBlock}; -use sp_consensus::{BlockOrigin, BlockStatus, SyncOracle}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; - -use polkadot_node_primitives::{AvailableData, POV_BOMB_LIMIT}; -use polkadot_node_subsystem::messages::AvailabilityRecoveryMessage; -use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{ - CandidateReceipt, CommittedCandidateReceipt, Id as ParaId, SessionIndex, -}; - -use cumulus_primitives_core::ParachainBlockData; -use cumulus_relay_chain_interface::{RelayChainInterface, RelayChainResult}; - -use codec::Decode; -use futures::{ - channel::mpsc::Receiver, select, stream::FuturesUnordered, Future, FutureExt, Stream, StreamExt, -}; -use futures_timer::Delay; -use rand::{distributions::Uniform, prelude::Distribution, thread_rng}; - -use std::{ - collections::{HashMap, HashSet, VecDeque}, - pin::Pin, - sync::Arc, - time::Duration, -}; - -mod active_candidate_recovery; -use active_candidate_recovery::ActiveCandidateRecovery; - -const LOG_TARGET: &str = "cumulus-pov-recovery"; - -/// Test-friendly wrapper trait for the overseer handle. -/// Can be used to simulate failing recovery requests. -#[async_trait::async_trait] -pub trait RecoveryHandle: Send { - async fn send_recovery_msg( - &mut self, - message: AvailabilityRecoveryMessage, - origin: &'static str, - ); -} - -#[async_trait::async_trait] -impl RecoveryHandle for OverseerHandle { - async fn send_recovery_msg( - &mut self, - message: AvailabilityRecoveryMessage, - origin: &'static str, - ) { - self.send_msg(message, origin).await; - } -} - -/// Type of recovery to trigger. -#[derive(Debug, PartialEq)] -pub enum RecoveryKind { - /// Single block recovery. - Simple, - /// Full ancestry recovery. - Full, -} - -/// Structure used to trigger an explicit recovery request via `PoVRecovery`. -pub struct RecoveryRequest { - /// Hash of the last block to recover. - pub hash: Block::Hash, - /// Recovery type. - pub kind: RecoveryKind, -} - -/// The delay between observing an unknown block and triggering the recovery of a block. -/// Randomizing the start of the recovery within this interval -/// can be used to prevent self-DOSing if the recovery request is part of a -/// distributed protocol and there is the possibility that multiple actors are -/// requiring to perform the recovery action at approximately the same time. -#[derive(Clone, Copy)] -pub struct RecoveryDelayRange { - /// Start recovering after `min` delay. - pub min: Duration, - /// Start recovering before `max` delay. - pub max: Duration, -} - -impl RecoveryDelayRange { - /// Produce a randomized duration between `min` and `max`. - fn duration(&self) -> Duration { - Uniform::from(self.min..=self.max).sample(&mut thread_rng()) - } -} - -/// Represents an outstanding block candidate. -struct Candidate { - receipt: CandidateReceipt, - session_index: SessionIndex, - block_number: NumberFor, - parent_hash: Block::Hash, - // Lazy recovery has been submitted. - // Should be true iff a block is either queued to be recovered or - // recovery is currently in progress. - waiting_recovery: bool, -} - -/// Queue that is used to decide when to start PoV-recovery operations. -struct RecoveryQueue { - recovery_delay_range: RecoveryDelayRange, - // Queue that keeps the hashes of blocks to be recovered. - recovery_queue: VecDeque, - // Futures that resolve when a new recovery should be started. - signaling_queue: FuturesUnordered + Send>>>, -} - -impl RecoveryQueue { - pub fn new(recovery_delay_range: RecoveryDelayRange) -> Self { - Self { - recovery_delay_range, - recovery_queue: Default::default(), - signaling_queue: Default::default(), - } - } - - /// Add hash of a block that should go to the end of the recovery queue. - /// A new recovery will be signaled after `delay` has passed. - pub fn push_recovery(&mut self, hash: Block::Hash) { - let delay = self.recovery_delay_range.duration(); - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Adding block to queue and adding new recovery slot in {:?} sec", - delay.as_secs(), - ); - self.recovery_queue.push_back(hash); - self.signaling_queue.push( - async move { - Delay::new(delay).await; - } - .boxed(), - ); - } - - /// Get the next hash for block recovery. - pub async fn next_recovery(&mut self) -> Block::Hash { - loop { - if self.signaling_queue.next().await.is_some() { - if let Some(hash) = self.recovery_queue.pop_front() { - return hash - } else { - tracing::error!( - target: LOG_TARGET, - "Recovery was signaled, but no candidate hash available. This is a bug." - ); - }; - } - futures::pending!() - } - } -} - -/// Encapsulates the logic of the pov recovery. -pub struct PoVRecovery { - /// All the pending candidates that we are waiting for to be imported or that need to be - /// recovered when `next_candidate_to_recover` tells us to do so. - candidates: HashMap>, - /// A stream of futures that resolve to hashes of candidates that need to be recovered. - /// - /// The candidates to the hashes are stored in `candidates`. If a candidate is not - /// available anymore in this map, it means that it was already imported. - candidate_recovery_queue: RecoveryQueue, - active_candidate_recovery: ActiveCandidateRecovery, - /// Blocks that wait that the parent is imported. - /// - /// Uses parent -> blocks mapping. - waiting_for_parent: HashMap>, - parachain_client: Arc, - parachain_import_queue: Box>, - relay_chain_interface: RC, - para_id: ParaId, - /// Explicit block recovery requests channel. - recovery_chan_rx: Receiver>, - /// Blocks that we are retrying currently - candidates_in_retry: HashSet, - parachain_sync_service: Arc, -} - -impl PoVRecovery -where - PC: BlockBackend + BlockchainEvents + UsageProvider, - RCInterface: RelayChainInterface + Clone, -{ - /// Create a new instance. - pub fn new( - recovery_handle: Box, - recovery_delay_range: RecoveryDelayRange, - parachain_client: Arc, - parachain_import_queue: Box>, - relay_chain_interface: RCInterface, - para_id: ParaId, - recovery_chan_rx: Receiver>, - parachain_sync_service: Arc, - ) -> Self { - Self { - candidates: HashMap::new(), - candidate_recovery_queue: RecoveryQueue::new(recovery_delay_range), - active_candidate_recovery: ActiveCandidateRecovery::new(recovery_handle), - waiting_for_parent: HashMap::new(), - parachain_client, - parachain_import_queue, - relay_chain_interface, - para_id, - candidates_in_retry: HashSet::new(), - recovery_chan_rx, - parachain_sync_service, - } - } - - /// Handle a new pending candidate. - fn handle_pending_candidate( - &mut self, - receipt: CommittedCandidateReceipt, - session_index: SessionIndex, - ) { - let header = match Block::Header::decode(&mut &receipt.commitments.head_data.0[..]) { - Ok(header) => header, - Err(e) => { - tracing::warn!( - target: LOG_TARGET, - error = ?e, - "Failed to decode parachain header from pending candidate", - ); - return - }, - }; - - if *header.number() <= self.parachain_client.usage_info().chain.finalized_number { - return - } - - let hash = header.hash(); - - if self.candidates.contains_key(&hash) { - return - } - - tracing::debug!(target: LOG_TARGET, block_hash = ?hash, "Adding outstanding candidate"); - self.candidates.insert( - hash, - Candidate { - block_number: *header.number(), - receipt: receipt.to_plain(), - session_index, - parent_hash: *header.parent_hash(), - waiting_recovery: false, - }, - ); - - // If required, triggers a lazy recovery request that will eventually be blocked - // if in the meantime the block is imported. - self.recover(RecoveryRequest { hash, kind: RecoveryKind::Simple }); - } - - /// Block is no longer waiting for recovery - fn clear_waiting_recovery(&mut self, block_hash: &Block::Hash) { - if let Some(candidate) = self.candidates.get_mut(block_hash) { - // Prevents triggering an already enqueued recovery request - candidate.waiting_recovery = false; - } - } - - /// Handle a finalized block with the given `block_number`. - fn handle_block_finalized(&mut self, block_number: NumberFor) { - self.candidates.retain(|_, pc| pc.block_number > block_number); - } - - /// Recover the candidate for the given `block_hash`. - async fn recover_candidate(&mut self, block_hash: Block::Hash) { - match self.candidates.get(&block_hash) { - Some(candidate) if candidate.waiting_recovery => { - tracing::debug!(target: LOG_TARGET, ?block_hash, "Issuing recovery request"); - self.active_candidate_recovery.recover_candidate(block_hash, candidate).await; - }, - _ => (), - } - } - - /// Clear `waiting_for_parent` and `waiting_recovery` for the candidate with `hash`. - /// Also clears children blocks waiting for this parent. - fn reset_candidate(&mut self, hash: Block::Hash) { - let mut blocks_to_delete = vec![hash]; - - while let Some(delete) = blocks_to_delete.pop() { - if let Some(childs) = self.waiting_for_parent.remove(&delete) { - blocks_to_delete.extend(childs.iter().map(BlockT::hash)); - } - } - self.clear_waiting_recovery(&hash); - } - - /// Handle a recovered candidate. - async fn handle_candidate_recovered( - &mut self, - block_hash: Block::Hash, - available_data: Option, - ) { - let available_data = match available_data { - Some(data) => { - self.candidates_in_retry.remove(&block_hash); - data - }, - None => - if self.candidates_in_retry.insert(block_hash) { - tracing::debug!(target: LOG_TARGET, ?block_hash, "Recovery failed, retrying."); - self.candidate_recovery_queue.push_recovery(block_hash); - return - } else { - tracing::warn!( - target: LOG_TARGET, - ?block_hash, - "Unable to recover block after retry.", - ); - self.candidates_in_retry.remove(&block_hash); - self.reset_candidate(block_hash); - return - }, - }; - - let raw_block_data = match sp_maybe_compressed_blob::decompress( - &available_data.pov.block_data.0, - POV_BOMB_LIMIT, - ) { - Ok(r) => r, - Err(error) => { - tracing::debug!(target: LOG_TARGET, ?error, "Failed to decompress PoV"); - - self.reset_candidate(block_hash); - return - }, - }; - - let block_data = match ParachainBlockData::::decode(&mut &raw_block_data[..]) { - Ok(d) => d, - Err(error) => { - tracing::warn!( - target: LOG_TARGET, - ?error, - "Failed to decode parachain block data from recovered PoV", - ); - - self.reset_candidate(block_hash); - return - }, - }; - - let block = block_data.into_block(); - - let parent = *block.header().parent_hash(); - - match self.parachain_client.block_status(parent) { - Ok(BlockStatus::Unknown) => { - // If the parent block is currently being recovered or is scheduled to be recovered, - // we want to wait for the parent. - let parent_scheduled_for_recovery = - self.candidates.get(&parent).map_or(false, |parent| parent.waiting_recovery); - if parent_scheduled_for_recovery { - tracing::debug!( - target: LOG_TARGET, - ?block_hash, - parent_hash = ?parent, - parent_scheduled_for_recovery, - "Waiting for recovery of parent.", - ); - - self.waiting_for_parent.entry(parent).or_default().push(block); - return - } else { - tracing::debug!( - target: LOG_TARGET, - ?block_hash, - parent_hash = ?parent, - "Parent not found while trying to import recovered block.", - ); - - self.reset_candidate(block_hash); - return - } - }, - Err(error) => { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?parent, - ?error, - "Error while checking block status", - ); - - self.reset_candidate(block_hash); - return - }, - // Any other status is fine to "ignore/accept" - _ => (), - } - - self.import_block(block).await; - } - - /// Import the given `block`. - /// - /// This will also recursivley drain `waiting_for_parent` and import them as well. - async fn import_block(&mut self, block: Block) { - let mut blocks = VecDeque::new(); - - tracing::debug!(target: LOG_TARGET, block_hash = ?block.hash(), "Importing block retrieved using pov_recovery"); - blocks.push_back(block); - - let mut incoming_blocks = Vec::new(); - - while let Some(block) = blocks.pop_front() { - let block_hash = block.hash(); - let (header, body) = block.deconstruct(); - - incoming_blocks.push(IncomingBlock { - hash: block_hash, - header: Some(header), - body: Some(body), - import_existing: false, - allow_missing_state: false, - justifications: None, - origin: None, - skip_execution: false, - state: None, - indexed_body: None, - }); - - if let Some(waiting) = self.waiting_for_parent.remove(&block_hash) { - blocks.extend(waiting); - } - } - - self.parachain_import_queue - .import_blocks(BlockOrigin::ConsensusBroadcast, incoming_blocks); - } - - /// Attempts an explicit recovery of one or more blocks. - pub fn recover(&mut self, req: RecoveryRequest) { - let RecoveryRequest { mut hash, kind } = req; - let mut to_recover = Vec::new(); - - loop { - let candidate = match self.candidates.get_mut(&hash) { - Some(candidate) => candidate, - None => { - tracing::debug!( - target: LOG_TARGET, - block_hash = ?hash, - "Cound not recover. Block was never announced as candidate" - ); - return - }, - }; - - match self.parachain_client.block_status(hash) { - Ok(BlockStatus::Unknown) if !candidate.waiting_recovery => { - candidate.waiting_recovery = true; - to_recover.push(hash); - }, - Ok(_) => break, - Err(e) => { - tracing::error!( - target: LOG_TARGET, - error = ?e, - block_hash = ?hash, - "Failed to get block status", - ); - for hash in to_recover { - self.clear_waiting_recovery(&hash); - } - return - }, - } - - if kind == RecoveryKind::Simple { - break - } - - hash = candidate.parent_hash; - } - - for hash in to_recover.into_iter().rev() { - self.candidate_recovery_queue.push_recovery(hash); - } - } - - /// Run the pov-recovery. - pub async fn run(mut self) { - let mut imported_blocks = self.parachain_client.import_notification_stream().fuse(); - let mut finalized_blocks = self.parachain_client.finality_notification_stream().fuse(); - let pending_candidates = match pending_candidates( - self.relay_chain_interface.clone(), - self.para_id, - self.parachain_sync_service.clone(), - ) - .await - { - Ok(pending_candidate_stream) => pending_candidate_stream.fuse(), - Err(err) => { - tracing::error!(target: LOG_TARGET, error = ?err, "Unable to retrieve pending candidate stream."); - return - }, - }; - - futures::pin_mut!(pending_candidates); - - loop { - select! { - pending_candidate = pending_candidates.next() => { - if let Some((receipt, session_index)) = pending_candidate { - self.handle_pending_candidate(receipt, session_index); - } else { - tracing::debug!(target: LOG_TARGET, "Pending candidates stream ended"); - return; - } - }, - recovery_req = self.recovery_chan_rx.next() => { - if let Some(req) = recovery_req { - self.recover(req); - } else { - tracing::debug!(target: LOG_TARGET, "Recovery channel stream ended"); - return; - } - }, - imported = imported_blocks.next() => { - if let Some(imported) = imported { - self.clear_waiting_recovery(&imported.hash); - } else { - tracing::debug!(target: LOG_TARGET, "Imported blocks stream ended"); - return; - } - }, - finalized = finalized_blocks.next() => { - if let Some(finalized) = finalized { - self.handle_block_finalized(*finalized.header.number()); - } else { - tracing::debug!(target: LOG_TARGET, "Finalized blocks stream ended"); - return; - } - }, - next_to_recover = self.candidate_recovery_queue.next_recovery().fuse() => { - self.recover_candidate(next_to_recover).await; - }, - (block_hash, available_data) = - self.active_candidate_recovery.wait_for_recovery().fuse() => - { - self.handle_candidate_recovered(block_hash, available_data).await; - }, - } - } - } -} - -/// Returns a stream over pending candidates for the parachain corresponding to `para_id`. -async fn pending_candidates( - relay_chain_client: impl RelayChainInterface + Clone, - para_id: ParaId, - sync_service: Arc, -) -> RelayChainResult> { - let import_notification_stream = relay_chain_client.import_notification_stream().await?; - - let filtered_stream = import_notification_stream.filter_map(move |n| { - let client_for_closure = relay_chain_client.clone(); - let sync_oracle = sync_service.clone(); - async move { - let hash = n.hash(); - if sync_oracle.is_major_syncing() { - tracing::debug!( - target: LOG_TARGET, - relay_hash = ?hash, - "Skipping candidate due to sync.", - ); - return None - } - - let pending_availability_result = client_for_closure - .candidate_pending_availability(hash, para_id) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Failed to fetch pending candidates.", - ) - }); - let session_index_result = - client_for_closure.session_index_for_child(hash).await.map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Failed to fetch session index.", - ) - }); - - if let Ok(Some(candidate)) = pending_availability_result { - session_index_result.map(|session_index| (candidate, session_index)).ok() - } else { - None - } - } - }); - Ok(filtered_stream) -} diff --git a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml deleted file mode 100644 index 22cd040b6471..000000000000 --- a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -[package] -authors = ["Parity Technologies "] -name = "cumulus-relay-chain-inprocess-interface" -version = "0.1.0" -edition = "2021" - -[dependencies] -async-trait = "0.1.73" -futures = "0.3.28" -futures-timer = "3.0.2" - -# Substrate -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, features = ["cli"] } -polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } - -[dev-dependencies] - -# Substrate -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-test-client = { git = "https://github.com/paritytech/polkadot", branch = "master" } -metered = { package = "prioritized-metered-channel", version = "0.2.0" } - -# Cumulus -cumulus-test-service = { path = "../../test/service" } diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs deleted file mode 100644 index 5b3ab15ed6fd..000000000000 --- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs +++ /dev/null @@ -1,471 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use std::{pin::Pin, sync::Arc, time::Duration}; - -use async_trait::async_trait; -use cumulus_primitives_core::{ - relay_chain::{ - runtime_api::ParachainHost, Block as PBlock, BlockId, CommittedCandidateReceipt, - Hash as PHash, Header as PHeader, InboundHrmpMessage, OccupiedCoreAssumption, SessionIndex, - ValidatorId, - }, - InboundDownwardMessage, ParaId, PersistedValidationData, -}; -use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult}; -use futures::{FutureExt, Stream, StreamExt}; -use polkadot_service::{ - CollatorPair, Configuration, FullBackend, FullClient, Handle, NewFull, TaskManager, -}; -use sc_cli::SubstrateCli; -use sc_client_api::{ - blockchain::BlockStatus, Backend, BlockchainEvents, HeaderBackend, ImportNotifications, - StorageProof, -}; -use sc_telemetry::TelemetryWorkerHandle; -use sp_api::ProvideRuntimeApi; -use sp_consensus::SyncOracle; -use sp_core::{sp_std::collections::btree_map::BTreeMap, Pair}; -use sp_state_machine::{Backend as StateBackend, StorageValue}; - -/// The timeout in seconds after that the waiting for a block should be aborted. -const TIMEOUT_IN_SECONDS: u64 = 6; - -/// Provides an implementation of the [`RelayChainInterface`] using a local in-process relay chain -/// node. -#[derive(Clone)] -pub struct RelayChainInProcessInterface { - full_client: Arc, - backend: Arc, - sync_oracle: Arc, - overseer_handle: Handle, -} - -impl RelayChainInProcessInterface { - /// Create a new instance of [`RelayChainInProcessInterface`] - pub fn new( - full_client: Arc, - backend: Arc, - sync_oracle: Arc, - overseer_handle: Handle, - ) -> Self { - Self { full_client, backend, sync_oracle, overseer_handle } - } -} - -#[async_trait] -impl RelayChainInterface for RelayChainInProcessInterface { - async fn retrieve_dmq_contents( - &self, - para_id: ParaId, - relay_parent: PHash, - ) -> RelayChainResult> { - Ok(self.full_client.runtime_api().dmq_contents(relay_parent, para_id)?) - } - - async fn retrieve_all_inbound_hrmp_channel_contents( - &self, - para_id: ParaId, - relay_parent: PHash, - ) -> RelayChainResult>> { - Ok(self - .full_client - .runtime_api() - .inbound_hrmp_channels_contents(relay_parent, para_id)?) - } - - async fn header(&self, block_id: BlockId) -> RelayChainResult> { - let hash = match block_id { - BlockId::Hash(hash) => hash, - BlockId::Number(num) => - if let Some(hash) = self.full_client.hash(num)? { - hash - } else { - return Ok(None) - }, - }; - let header = self.full_client.header(hash)?; - - Ok(header) - } - - async fn persisted_validation_data( - &self, - hash: PHash, - para_id: ParaId, - occupied_core_assumption: OccupiedCoreAssumption, - ) -> RelayChainResult> { - Ok(self.full_client.runtime_api().persisted_validation_data( - hash, - para_id, - occupied_core_assumption, - )?) - } - - async fn candidate_pending_availability( - &self, - hash: PHash, - para_id: ParaId, - ) -> RelayChainResult> { - Ok(self.full_client.runtime_api().candidate_pending_availability(hash, para_id)?) - } - - async fn session_index_for_child(&self, hash: PHash) -> RelayChainResult { - Ok(self.full_client.runtime_api().session_index_for_child(hash)?) - } - - async fn validators(&self, hash: PHash) -> RelayChainResult> { - Ok(self.full_client.runtime_api().validators(hash)?) - } - - async fn import_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let notification_stream = self - .full_client - .import_notification_stream() - .map(|notification| notification.header); - Ok(Box::pin(notification_stream)) - } - - async fn finality_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let notification_stream = self - .full_client - .finality_notification_stream() - .map(|notification| notification.header); - Ok(Box::pin(notification_stream)) - } - - async fn best_block_hash(&self) -> RelayChainResult { - Ok(self.backend.blockchain().info().best_hash) - } - - async fn finalized_block_hash(&self) -> RelayChainResult { - Ok(self.backend.blockchain().info().finalized_hash) - } - - async fn is_major_syncing(&self) -> RelayChainResult { - Ok(self.sync_oracle.is_major_syncing()) - } - - fn overseer_handle(&self) -> RelayChainResult { - Ok(self.overseer_handle.clone()) - } - - async fn get_storage_by_key( - &self, - relay_parent: PHash, - key: &[u8], - ) -> RelayChainResult> { - let state = self.backend.state_at(relay_parent)?; - state.storage(key).map_err(RelayChainError::GenericError) - } - - async fn prove_read( - &self, - relay_parent: PHash, - relevant_keys: &Vec>, - ) -> RelayChainResult { - let state_backend = self.backend.state_at(relay_parent)?; - - sp_state_machine::prove_read(state_backend, relevant_keys) - .map_err(RelayChainError::StateMachineError) - } - - /// Wait for a given relay chain block in an async way. - /// - /// The caller needs to pass the hash of a block it waits for and the function will return when - /// the block is available or an error occurred. - /// - /// The waiting for the block is implemented as follows: - /// - /// 1. Get a read lock on the import lock from the backend. - /// - /// 2. Check if the block is already imported. If yes, return from the function. - /// - /// 3. If the block isn't imported yet, add an import notification listener. - /// - /// 4. Poll the import notification listener until the block is imported or the timeout is - /// fired. - /// - /// The timeout is set to 6 seconds. This should be enough time to import the block in the - /// current round and if not, the new round of the relay chain already started anyway. - async fn wait_for_block(&self, hash: PHash) -> RelayChainResult<()> { - let mut listener = - match check_block_in_chain(self.backend.clone(), self.full_client.clone(), hash)? { - BlockCheckStatus::InChain => return Ok(()), - BlockCheckStatus::Unknown(listener) => listener, - }; - - let mut timeout = futures_timer::Delay::new(Duration::from_secs(TIMEOUT_IN_SECONDS)).fuse(); - - loop { - futures::select! { - _ = timeout => return Err(RelayChainError::WaitTimeout(hash)), - evt = listener.next() => match evt { - Some(evt) if evt.hash == hash => return Ok(()), - // Not the event we waited on. - Some(_) => continue, - None => return Err(RelayChainError::ImportListenerClosed(hash)), - } - } - } - } - - async fn new_best_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let notifications_stream = - self.full_client - .import_notification_stream() - .filter_map(|notification| async move { - notification.is_new_best.then_some(notification.header) - }); - Ok(Box::pin(notifications_stream)) - } -} - -pub enum BlockCheckStatus { - /// Block is in chain - InChain, - /// Block status is unknown, listener can be used to wait for notification - Unknown(ImportNotifications), -} - -// Helper function to check if a block is in chain. -pub fn check_block_in_chain( - backend: Arc, - client: Arc, - hash: PHash, -) -> RelayChainResult { - let _lock = backend.get_import_lock().read(); - - if backend.blockchain().status(hash)? == BlockStatus::InChain { - return Ok(BlockCheckStatus::InChain) - } - - let listener = client.import_notification_stream(); - - Ok(BlockCheckStatus::Unknown(listener)) -} - -/// Build the Polkadot full node using the given `config`. -#[sc_tracing::logging::prefix_logs_with("Relaychain")] -fn build_polkadot_full_node( - config: Configuration, - parachain_config: &Configuration, - telemetry_worker_handle: Option, - hwbench: Option, -) -> Result<(NewFull, Option), polkadot_service::Error> { - let (is_parachain_node, maybe_collator_key) = if parachain_config.role.is_authority() { - let collator_key = CollatorPair::generate().0; - (polkadot_service::IsParachainNode::Collator(collator_key.clone()), Some(collator_key)) - } else { - (polkadot_service::IsParachainNode::FullNode, None) - }; - - let relay_chain_full_node = polkadot_service::build_full( - config, - polkadot_service::NewFullParams { - is_parachain_node, - grandpa_pause: None, - // Disable BEEFY. It should not be required by the internal relay chain node. - enable_beefy: false, - jaeger_agent: None, - telemetry_worker_handle, - - // Cumulus doesn't spawn PVF workers, so we can disable version checks. - node_version: None, - workers_path: None, - workers_names: None, - - overseer_gen: polkadot_service::RealOverseerGen, - overseer_message_channel_capacity_override: None, - malus_finality_delay: None, - hwbench, - }, - )?; - - Ok((relay_chain_full_node, maybe_collator_key)) -} - -/// Builds a relay chain interface by constructing a full relay chain node -pub fn build_inprocess_relay_chain( - mut polkadot_config: Configuration, - parachain_config: &Configuration, - telemetry_worker_handle: Option, - task_manager: &mut TaskManager, - hwbench: Option, -) -> RelayChainResult<(Arc<(dyn RelayChainInterface + 'static)>, Option)> { - // This is essentially a hack, but we want to ensure that we send the correct node version - // to the telemetry. - polkadot_config.impl_version = polkadot_cli::Cli::impl_version(); - polkadot_config.impl_name = polkadot_cli::Cli::impl_name(); - - let (full_node, collator_key) = build_polkadot_full_node( - polkadot_config, - parachain_config, - telemetry_worker_handle, - hwbench, - ) - .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; - - let relay_chain_interface = Arc::new(RelayChainInProcessInterface::new( - full_node.client, - full_node.backend, - full_node.sync_service, - full_node.overseer_handle.clone().ok_or(RelayChainError::GenericError( - "Overseer not running in full node.".to_string(), - ))?, - )); - - task_manager.add_child(full_node.task_manager); - - Ok((relay_chain_interface, collator_key)) -} - -#[cfg(test)] -mod tests { - use super::*; - - use polkadot_primitives::Block as PBlock; - use polkadot_test_client::{ - construct_transfer_extrinsic, BlockBuilderExt, Client, ClientBlockImportExt, - DefaultTestClientBuilderExt, InitPolkadotBlockBuilder, TestClientBuilder, - TestClientBuilderExt, - }; - use sp_consensus::{BlockOrigin, SyncOracle}; - use sp_runtime::traits::Block as BlockT; - use std::sync::Arc; - - use futures::{executor::block_on, poll, task::Poll}; - - struct DummyNetwork {} - - impl SyncOracle for DummyNetwork { - fn is_major_syncing(&self) -> bool { - unimplemented!("Not needed for test") - } - - fn is_offline(&self) -> bool { - unimplemented!("Not needed for test") - } - } - - fn build_client_backend_and_block() -> (Arc, PBlock, RelayChainInProcessInterface) { - let builder = TestClientBuilder::new(); - let backend = builder.backend(); - let client = Arc::new(builder.build()); - - let block_builder = client.init_polkadot_block_builder(); - let block = block_builder.build().expect("Finalizes the block").block; - let dummy_network: Arc = Arc::new(DummyNetwork {}); - - let (tx, _rx) = metered::channel(30); - let mock_handle = Handle::new(tx); - ( - client.clone(), - block, - RelayChainInProcessInterface::new(client, backend, dummy_network, mock_handle), - ) - } - - #[test] - fn returns_directly_for_available_block() { - let (mut client, block, relay_chain_interface) = build_client_backend_and_block(); - let hash = block.hash(); - - block_on(client.import(BlockOrigin::Own, block)).expect("Imports the block"); - - block_on(async move { - // Should be ready on the first poll - assert!(matches!( - poll!(relay_chain_interface.wait_for_block(hash)), - Poll::Ready(Ok(())) - )); - }); - } - - #[test] - fn resolve_after_block_import_notification_was_received() { - let (mut client, block, relay_chain_interface) = build_client_backend_and_block(); - let hash = block.hash(); - - block_on(async move { - let mut future = relay_chain_interface.wait_for_block(hash); - // As the block is not yet imported, the first poll should return `Pending` - assert!(poll!(&mut future).is_pending()); - - // Import the block that should fire the notification - client.import(BlockOrigin::Own, block).await.expect("Imports the block"); - - // Now it should have received the notification and report that the block was imported - assert!(matches!(poll!(future), Poll::Ready(Ok(())))); - }); - } - - #[test] - fn wait_for_block_time_out_when_block_is_not_imported() { - let (_, block, relay_chain_interface) = build_client_backend_and_block(); - let hash = block.hash(); - - assert!(matches!( - block_on(relay_chain_interface.wait_for_block(hash)), - Err(RelayChainError::WaitTimeout(_)) - )); - } - - #[test] - fn do_not_resolve_after_different_block_import_notification_was_received() { - let (mut client, block, relay_chain_interface) = build_client_backend_and_block(); - let hash = block.hash(); - - let ext = construct_transfer_extrinsic( - &client, - sp_keyring::Sr25519Keyring::Alice, - sp_keyring::Sr25519Keyring::Bob, - 1000, - ); - let mut block_builder = client.init_polkadot_block_builder(); - // Push an extrinsic to get a different block hash. - block_builder.push_polkadot_extrinsic(ext).expect("Push extrinsic"); - let block2 = block_builder.build().expect("Build second block").block; - let hash2 = block2.hash(); - - block_on(async move { - let mut future = relay_chain_interface.wait_for_block(hash); - let mut future2 = relay_chain_interface.wait_for_block(hash2); - // As the block is not yet imported, the first poll should return `Pending` - assert!(poll!(&mut future).is_pending()); - assert!(poll!(&mut future2).is_pending()); - - // Import the block that should fire the notification - client.import(BlockOrigin::Own, block2).await.expect("Imports the second block"); - - // The import notification of the second block should not make this one finish - assert!(poll!(&mut future).is_pending()); - // Now it should have received the notification and report that the block was imported - assert!(matches!(poll!(future2), Poll::Ready(Ok(())))); - - client.import(BlockOrigin::Own, block).await.expect("Imports the first block"); - - // Now it should be ready - assert!(matches!(poll!(future), Poll::Ready(Ok(())))); - }); - } -} diff --git a/cumulus/client/relay-chain-interface/Cargo.toml b/cumulus/client/relay-chain-interface/Cargo.toml deleted file mode 100644 index 1a6cf2a75287..000000000000 --- a/cumulus/client/relay-chain-interface/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -authors = ["Parity Technologies "] -name = "cumulus-relay-chain-interface" -version = "0.1.0" -edition = "2021" - -[dependencies] -polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -cumulus-primitives-core = { path = "../../primitives/core" } - -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } - -futures = "0.3.28" -async-trait = "0.1.73" -thiserror = "1.0.46" -jsonrpsee-core = "0.16.2" -parity-scale-codec = "3.6.4" diff --git a/cumulus/client/relay-chain-interface/src/lib.rs b/cumulus/client/relay-chain-interface/src/lib.rs deleted file mode 100644 index a0258e206328..000000000000 --- a/cumulus/client/relay-chain-interface/src/lib.rs +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use std::{collections::BTreeMap, pin::Pin, sync::Arc}; - -use polkadot_overseer::prometheus::PrometheusError; -use sc_client_api::StorageProof; - -use futures::Stream; - -use async_trait::async_trait; -use jsonrpsee_core::Error as JsonRpcError; -use parity_scale_codec::Error as CodecError; -use sp_api::ApiError; - -use cumulus_primitives_core::relay_chain::BlockId; -pub use cumulus_primitives_core::{ - relay_chain::{ - CommittedCandidateReceipt, Hash as PHash, Header as PHeader, InboundHrmpMessage, - OccupiedCoreAssumption, SessionIndex, ValidatorId, - }, - InboundDownwardMessage, ParaId, PersistedValidationData, -}; -pub use polkadot_overseer::Handle as OverseerHandle; -pub use sp_state_machine::StorageValue; - -pub type RelayChainResult = Result; - -#[derive(thiserror::Error, Debug)] -pub enum RelayChainError { - #[error("Error occured while calling relay chain runtime: {0}")] - ApiError(#[from] ApiError), - #[error("Timeout while waiting for relay-chain block `{0}` to be imported.")] - WaitTimeout(PHash), - #[error("Import listener closed while waiting for relay-chain block `{0}` to be imported.")] - ImportListenerClosed(PHash), - #[error( - "Blockchain returned an error while waiting for relay-chain block `{0}` to be imported: {1}" - )] - WaitBlockchainError(PHash, sp_blockchain::Error), - #[error("Blockchain returned an error: {0}")] - BlockchainError(#[from] sp_blockchain::Error), - #[error("State machine error occured: {0}")] - StateMachineError(Box), - #[error("Unable to call RPC method '{0}'")] - RpcCallError(String), - #[error("RPC Error: '{0}'")] - JsonRpcError(#[from] JsonRpcError), - #[error("Unable to communicate with RPC worker: {0}")] - WorkerCommunicationError(String), - #[error("Scale codec deserialization error: {0}")] - DeserializationError(CodecError), - #[error(transparent)] - Application(#[from] Box), - #[error("Prometheus error: {0}")] - PrometheusError(#[from] PrometheusError), - #[error("Unspecified error occured: {0}")] - GenericError(String), -} - -impl From for ApiError { - fn from(r: RelayChainError) -> Self { - sp_api::ApiError::Application(Box::new(r)) - } -} - -impl From for RelayChainError { - fn from(e: CodecError) -> Self { - RelayChainError::DeserializationError(e) - } -} - -impl From for sp_blockchain::Error { - fn from(r: RelayChainError) -> Self { - sp_blockchain::Error::Application(Box::new(r)) - } -} - -impl From> for RelayChainError { - fn from(r: Box) -> Self { - RelayChainError::Application(r) - } -} - -/// Trait that provides all necessary methods for interaction between collator and relay chain. -#[async_trait] -pub trait RelayChainInterface: Send + Sync { - /// Fetch a storage item by key. - async fn get_storage_by_key( - &self, - relay_parent: PHash, - key: &[u8], - ) -> RelayChainResult>; - - /// Fetch a vector of current validators. - async fn validators(&self, block_id: PHash) -> RelayChainResult>; - - /// Get the hash of the current best block. - async fn best_block_hash(&self) -> RelayChainResult; - - /// Fetch the block header of a given hash or height, if it exists. - async fn header(&self, block_id: BlockId) -> RelayChainResult>; - - /// Get the hash of the finalized block. - async fn finalized_block_hash(&self) -> RelayChainResult; - - /// Returns the whole contents of the downward message queue for the parachain we are collating - /// for. - /// - /// Returns `None` in case of an error. - async fn retrieve_dmq_contents( - &self, - para_id: ParaId, - relay_parent: PHash, - ) -> RelayChainResult>; - - /// Returns channels contents for each inbound HRMP channel addressed to the parachain we are - /// collating for. - /// - /// Empty channels are also included. - async fn retrieve_all_inbound_hrmp_channel_contents( - &self, - para_id: ParaId, - relay_parent: PHash, - ) -> RelayChainResult>>; - - /// Yields the persisted validation data for the given `ParaId` along with an assumption that - /// should be used if the para currently occupies a core. - /// - /// Returns `None` if either the para is not registered or the assumption is `Freed` - /// and the para already occupies a core. - async fn persisted_validation_data( - &self, - block_id: PHash, - para_id: ParaId, - _: OccupiedCoreAssumption, - ) -> RelayChainResult>; - - /// Get the receipt of a candidate pending availability. This returns `Some` for any paras - /// assigned to occupied cores in `availability_cores` and `None` otherwise. - async fn candidate_pending_availability( - &self, - block_id: PHash, - para_id: ParaId, - ) -> RelayChainResult>; - - /// Returns the session index expected at a child of the block. - async fn session_index_for_child(&self, block_id: PHash) -> RelayChainResult; - - /// Get a stream of import block notifications. - async fn import_notification_stream( - &self, - ) -> RelayChainResult + Send>>>; - - /// Get a stream of new best block notifications. - async fn new_best_notification_stream( - &self, - ) -> RelayChainResult + Send>>>; - - /// Wait for a block with a given hash in the relay chain. - /// - /// This method returns immediately on error or if the block is already - /// reported to be in chain. Otherwise, it waits for the block to arrive. - async fn wait_for_block(&self, hash: PHash) -> RelayChainResult<()>; - - /// Get a stream of finality notifications. - async fn finality_notification_stream( - &self, - ) -> RelayChainResult + Send>>>; - - /// Whether the synchronization service is undergoing major sync. - /// Returns true if so. - async fn is_major_syncing(&self) -> RelayChainResult; - - /// Get a handle to the overseer. - fn overseer_handle(&self) -> RelayChainResult; - - /// Generate a storage read proof. - async fn prove_read( - &self, - relay_parent: PHash, - relevant_keys: &Vec>, - ) -> RelayChainResult; -} - -#[async_trait] -impl RelayChainInterface for Arc -where - T: RelayChainInterface + ?Sized, -{ - async fn retrieve_dmq_contents( - &self, - para_id: ParaId, - relay_parent: PHash, - ) -> RelayChainResult> { - (**self).retrieve_dmq_contents(para_id, relay_parent).await - } - - async fn retrieve_all_inbound_hrmp_channel_contents( - &self, - para_id: ParaId, - relay_parent: PHash, - ) -> RelayChainResult>> { - (**self).retrieve_all_inbound_hrmp_channel_contents(para_id, relay_parent).await - } - - async fn persisted_validation_data( - &self, - block_id: PHash, - para_id: ParaId, - occupied_core_assumption: OccupiedCoreAssumption, - ) -> RelayChainResult> { - (**self) - .persisted_validation_data(block_id, para_id, occupied_core_assumption) - .await - } - - async fn candidate_pending_availability( - &self, - block_id: PHash, - para_id: ParaId, - ) -> RelayChainResult> { - (**self).candidate_pending_availability(block_id, para_id).await - } - - async fn session_index_for_child(&self, block_id: PHash) -> RelayChainResult { - (**self).session_index_for_child(block_id).await - } - - async fn validators(&self, block_id: PHash) -> RelayChainResult> { - (**self).validators(block_id).await - } - - async fn import_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - (**self).import_notification_stream().await - } - - async fn finality_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - (**self).finality_notification_stream().await - } - - async fn best_block_hash(&self) -> RelayChainResult { - (**self).best_block_hash().await - } - - async fn finalized_block_hash(&self) -> RelayChainResult { - (**self).finalized_block_hash().await - } - - async fn is_major_syncing(&self) -> RelayChainResult { - (**self).is_major_syncing().await - } - - fn overseer_handle(&self) -> RelayChainResult { - (**self).overseer_handle() - } - - async fn get_storage_by_key( - &self, - relay_parent: PHash, - key: &[u8], - ) -> RelayChainResult> { - (**self).get_storage_by_key(relay_parent, key).await - } - - async fn prove_read( - &self, - relay_parent: PHash, - relevant_keys: &Vec>, - ) -> RelayChainResult { - (**self).prove_read(relay_parent, relevant_keys).await - } - - async fn wait_for_block(&self, hash: PHash) -> RelayChainResult<()> { - (**self).wait_for_block(hash).await - } - - async fn new_best_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - (**self).new_best_notification_stream().await - } - - async fn header(&self, block_id: BlockId) -> RelayChainResult> { - (**self).header(block_id).await - } -} diff --git a/cumulus/client/relay-chain-minimal-node/Cargo.toml b/cumulus/client/relay-chain-minimal-node/Cargo.toml deleted file mode 100644 index d4460dab5358..000000000000 --- a/cumulus/client/relay-chain-minimal-node/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -authors = ["Parity Technologies "] -name = "cumulus-relay-chain-minimal-node" -version = "0.1.0" -edition = "2021" - -[dependencies] -# polkadot deps -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-subsystem-util = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-network-protocol = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -polkadot-availability-recovery = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-collator-protocol = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-network-bridge = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-collation-generation = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-core-runtime-api = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# substrate deps -sc-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network-common = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# cumulus deps -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -cumulus-relay-chain-rpc-interface = { path = "../relay-chain-rpc-interface" } -cumulus-primitives-core = { path = "../../primitives/core" } - -array-bytes = "6.1" -lru = "0.11.0" -tracing = "0.1.37" -async-trait = "0.1.73" -futures = "0.3.28" -tokio = { version = "1.31.0", features = ["macros"] } diff --git a/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs b/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs deleted file mode 100644 index afe174202c57..000000000000 --- a/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use std::pin::Pin; - -use cumulus_relay_chain_interface::{RelayChainError, RelayChainResult}; -use cumulus_relay_chain_rpc_interface::RelayChainRpcClient; -use futures::{Stream, StreamExt}; -use polkadot_core_primitives::{Block, BlockNumber, Hash, Header}; -use polkadot_overseer::RuntimeApiSubsystemClient; -use polkadot_primitives::slashing; -use sc_authority_discovery::{AuthorityDiscovery, Error as AuthorityDiscoveryError}; -use sp_api::{ApiError, RuntimeApiInfo}; - -#[derive(Clone)] -pub struct BlockChainRpcClient { - rpc_client: RelayChainRpcClient, -} - -impl BlockChainRpcClient { - pub fn new(rpc_client: RelayChainRpcClient) -> Self { - Self { rpc_client } - } - - pub async fn chain_get_header( - &self, - hash: Option, - ) -> Result, RelayChainError> { - self.rpc_client.chain_get_header(hash).await - } - - pub async fn block_get_hash( - &self, - number: Option, - ) -> Result, RelayChainError> { - self.rpc_client.chain_get_block_hash(number).await - } -} - -#[async_trait::async_trait] -impl RuntimeApiSubsystemClient for BlockChainRpcClient { - async fn validators( - &self, - at: Hash, - ) -> Result, sp_api::ApiError> { - Ok(self.rpc_client.parachain_host_validators(at).await?) - } - - async fn validator_groups( - &self, - at: Hash, - ) -> Result< - ( - Vec>, - polkadot_primitives::GroupRotationInfo, - ), - sp_api::ApiError, - > { - Ok(self.rpc_client.parachain_host_validator_groups(at).await?) - } - - async fn availability_cores( - &self, - at: Hash, - ) -> Result< - Vec>, - sp_api::ApiError, - > { - Ok(self.rpc_client.parachain_host_availability_cores(at).await?) - } - - async fn persisted_validation_data( - &self, - at: Hash, - para_id: cumulus_primitives_core::ParaId, - assumption: polkadot_primitives::OccupiedCoreAssumption, - ) -> Result< - Option< - cumulus_primitives_core::PersistedValidationData< - Hash, - polkadot_core_primitives::BlockNumber, - >, - >, - sp_api::ApiError, - > { - Ok(self - .rpc_client - .parachain_host_persisted_validation_data(at, para_id, assumption) - .await?) - } - - async fn assumed_validation_data( - &self, - at: Hash, - para_id: cumulus_primitives_core::ParaId, - expected_persisted_validation_data_hash: Hash, - ) -> Result< - Option<( - cumulus_primitives_core::PersistedValidationData< - Hash, - polkadot_core_primitives::BlockNumber, - >, - polkadot_primitives::ValidationCodeHash, - )>, - sp_api::ApiError, - > { - Ok(self - .rpc_client - .parachain_host_assumed_validation_data( - at, - para_id, - expected_persisted_validation_data_hash, - ) - .await?) - } - - async fn check_validation_outputs( - &self, - at: Hash, - para_id: cumulus_primitives_core::ParaId, - outputs: polkadot_primitives::CandidateCommitments, - ) -> Result { - Ok(self - .rpc_client - .parachain_host_check_validation_outputs(at, para_id, outputs) - .await?) - } - - async fn session_index_for_child( - &self, - at: Hash, - ) -> Result { - Ok(self.rpc_client.parachain_host_session_index_for_child(at).await?) - } - - async fn validation_code( - &self, - at: Hash, - para_id: cumulus_primitives_core::ParaId, - assumption: polkadot_primitives::OccupiedCoreAssumption, - ) -> Result, sp_api::ApiError> { - Ok(self.rpc_client.parachain_host_validation_code(at, para_id, assumption).await?) - } - - async fn candidate_pending_availability( - &self, - at: Hash, - para_id: cumulus_primitives_core::ParaId, - ) -> Result>, sp_api::ApiError> { - Ok(self - .rpc_client - .parachain_host_candidate_pending_availability(at, para_id) - .await?) - } - - async fn candidate_events( - &self, - at: Hash, - ) -> Result>, sp_api::ApiError> { - Ok(self.rpc_client.parachain_host_candidate_events(at).await?) - } - - async fn dmq_contents( - &self, - at: Hash, - recipient: cumulus_primitives_core::ParaId, - ) -> Result< - Vec>, - sp_api::ApiError, - > { - Ok(self.rpc_client.parachain_host_dmq_contents(recipient, at).await?) - } - - async fn inbound_hrmp_channels_contents( - &self, - at: Hash, - recipient: cumulus_primitives_core::ParaId, - ) -> Result< - std::collections::BTreeMap< - cumulus_primitives_core::ParaId, - Vec< - polkadot_core_primitives::InboundHrmpMessage, - >, - >, - sp_api::ApiError, - > { - Ok(self - .rpc_client - .parachain_host_inbound_hrmp_channels_contents(recipient, at) - .await?) - } - - async fn validation_code_by_hash( - &self, - at: Hash, - validation_code_hash: polkadot_primitives::ValidationCodeHash, - ) -> Result, sp_api::ApiError> { - Ok(self - .rpc_client - .parachain_host_validation_code_by_hash(at, validation_code_hash) - .await?) - } - - async fn on_chain_votes( - &self, - at: Hash, - ) -> Result>, sp_api::ApiError> { - Ok(self.rpc_client.parachain_host_on_chain_votes(at).await?) - } - - async fn session_info( - &self, - at: Hash, - index: polkadot_primitives::SessionIndex, - ) -> Result, sp_api::ApiError> { - Ok(self.rpc_client.parachain_host_session_info(at, index).await?) - } - - async fn session_executor_params( - &self, - at: Hash, - session_index: polkadot_primitives::SessionIndex, - ) -> Result, sp_api::ApiError> { - Ok(self - .rpc_client - .parachain_host_session_executor_params(at, session_index) - .await?) - } - - async fn submit_pvf_check_statement( - &self, - at: Hash, - stmt: polkadot_primitives::PvfCheckStatement, - signature: polkadot_primitives::ValidatorSignature, - ) -> Result<(), sp_api::ApiError> { - Ok(self - .rpc_client - .parachain_host_submit_pvf_check_statement(at, stmt, signature) - .await?) - } - - async fn pvfs_require_precheck( - &self, - at: Hash, - ) -> Result, sp_api::ApiError> { - Ok(self.rpc_client.parachain_host_pvfs_require_precheck(at).await?) - } - - async fn validation_code_hash( - &self, - at: Hash, - para_id: cumulus_primitives_core::ParaId, - assumption: polkadot_primitives::OccupiedCoreAssumption, - ) -> Result, sp_api::ApiError> { - Ok(self - .rpc_client - .parachain_host_validation_code_hash(at, para_id, assumption) - .await?) - } - - async fn current_epoch(&self, at: Hash) -> Result { - Ok(self.rpc_client.babe_api_current_epoch(at).await?) - } - - async fn authorities( - &self, - at: Hash, - ) -> std::result::Result, sp_api::ApiError> { - Ok(self.rpc_client.authority_discovery_authorities(at).await?) - } - - async fn api_version_parachain_host(&self, at: Hash) -> Result, sp_api::ApiError> { - let api_id = >::ID; - Ok(self.rpc_client.runtime_version(at).await.map(|v| v.api_version(&api_id))?) - } - - async fn disputes( - &self, - at: Hash, - ) -> Result< - Vec<( - polkadot_primitives::SessionIndex, - polkadot_primitives::CandidateHash, - polkadot_primitives::DisputeState, - )>, - ApiError, - > { - Ok(self.rpc_client.parachain_host_disputes(at).await?) - } - - async fn unapplied_slashes( - &self, - at: Hash, - ) -> Result< - Vec<( - polkadot_primitives::SessionIndex, - polkadot_primitives::CandidateHash, - slashing::PendingSlashes, - )>, - ApiError, - > { - Ok(self.rpc_client.parachain_host_unapplied_slashes(at).await?) - } - - async fn key_ownership_proof( - &self, - at: Hash, - validator_id: polkadot_primitives::ValidatorId, - ) -> Result, ApiError> { - Ok(self.rpc_client.parachain_host_key_ownership_proof(at, validator_id).await?) - } - - async fn submit_report_dispute_lost( - &self, - at: Hash, - dispute_proof: slashing::DisputeProof, - key_ownership_proof: slashing::OpaqueKeyOwnershipProof, - ) -> Result, ApiError> { - Ok(self - .rpc_client - .parachain_host_submit_report_dispute_lost(at, dispute_proof, key_ownership_proof) - .await?) - } -} - -#[async_trait::async_trait] -impl AuthorityDiscovery for BlockChainRpcClient { - async fn authorities( - &self, - at: Hash, - ) -> std::result::Result, sp_api::ApiError> { - let result = self.rpc_client.authority_discovery_authorities(at).await?; - Ok(result) - } - - async fn best_hash(&self) -> std::result::Result { - self.block_get_hash(None) - .await - .ok() - .flatten() - .ok_or_else(|| AuthorityDiscoveryError::BestBlockFetchingError) - } -} - -impl BlockChainRpcClient { - pub async fn import_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - Ok(self.rpc_client.get_imported_heads_stream()?.boxed()) - } - - pub async fn finality_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - Ok(self.rpc_client.get_finalized_heads_stream()?.boxed()) - } -} diff --git a/cumulus/client/relay-chain-minimal-node/src/collator_overseer.rs b/cumulus/client/relay-chain-minimal-node/src/collator_overseer.rs deleted file mode 100644 index b488db962f31..000000000000 --- a/cumulus/client/relay-chain-minimal-node/src/collator_overseer.rs +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -use futures::{select, StreamExt}; -use lru::LruCache; -use std::sync::Arc; - -use polkadot_availability_recovery::AvailabilityRecoverySubsystem; -use polkadot_collator_protocol::{CollatorProtocolSubsystem, ProtocolSide}; -use polkadot_network_bridge::{ - Metrics as NetworkBridgeMetrics, NetworkBridgeRx as NetworkBridgeRxSubsystem, - NetworkBridgeTx as NetworkBridgeTxSubsystem, -}; -use polkadot_node_collation_generation::CollationGenerationSubsystem; -use polkadot_node_core_runtime_api::RuntimeApiSubsystem; -use polkadot_node_network_protocol::{ - peer_set::PeerSetProtocolNames, - request_response::{ - v1::{AvailableDataFetchingRequest, CollationFetchingRequest}, - IncomingRequestReceiver, ReqProtocolNames, - }, -}; -use polkadot_node_subsystem_util::metrics::{prometheus::Registry, Metrics}; -use polkadot_overseer::{ - BlockInfo, DummySubsystem, Handle, Overseer, OverseerConnector, OverseerHandle, SpawnGlue, - KNOWN_LEAVES_CACHE_SIZE, -}; -use polkadot_primitives::CollatorPair; - -use sc_authority_discovery::Service as AuthorityDiscoveryService; -use sc_network::NetworkStateInfo; -use sc_service::TaskManager; -use sp_runtime::traits::Block as BlockT; - -use cumulus_primitives_core::relay_chain::{Block, Hash as PHash}; -use cumulus_relay_chain_interface::RelayChainError; - -use crate::BlockChainRpcClient; - -/// Arguments passed for overseer construction. -pub(crate) struct CollatorOverseerGenArgs<'a> { - /// Runtime client generic, providing the `ProvieRuntimeApi` trait besides others. - pub runtime_client: Arc, - /// Underlying network service implementation. - pub network_service: Arc>, - /// Syncing oracle. - pub sync_oracle: Box, - /// Underlying authority discovery service. - pub authority_discovery_service: AuthorityDiscoveryService, - /// Receiver for collation request protocol - pub collation_req_receiver: IncomingRequestReceiver, - /// Receiver for availability request protocol - pub available_data_req_receiver: IncomingRequestReceiver, - /// Prometheus registry, commonly used for production systems, less so for test. - pub registry: Option<&'a Registry>, - /// Task spawner to be used throughout the overseer and the APIs it provides. - pub spawner: sc_service::SpawnTaskHandle, - /// Determines the behavior of the collator. - pub collator_pair: CollatorPair, - /// Request response protocols - pub req_protocol_names: ReqProtocolNames, - /// Peerset protocols name mapping - pub peer_set_protocol_names: PeerSetProtocolNames, -} - -fn build_overseer( - connector: OverseerConnector, - CollatorOverseerGenArgs { - runtime_client, - network_service, - sync_oracle, - authority_discovery_service, - collation_req_receiver, - available_data_req_receiver, - registry, - spawner, - collator_pair, - req_protocol_names, - peer_set_protocol_names, - }: CollatorOverseerGenArgs<'_>, -) -> Result< - (Overseer, Arc>, OverseerHandle), - RelayChainError, -> { - let spawner = SpawnGlue(spawner); - let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?; - let builder = Overseer::builder() - .availability_distribution(DummySubsystem) - .availability_recovery(AvailabilityRecoverySubsystem::with_availability_store_skip( - available_data_req_receiver, - Metrics::register(registry)?, - )) - .availability_store(DummySubsystem) - .bitfield_distribution(DummySubsystem) - .bitfield_signing(DummySubsystem) - .candidate_backing(DummySubsystem) - .candidate_validation(DummySubsystem) - .pvf_checker(DummySubsystem) - .chain_api(DummySubsystem) - .collation_generation(CollationGenerationSubsystem::new(Metrics::register(registry)?)) - .collator_protocol({ - let side = ProtocolSide::Collator( - network_service.local_peer_id(), - collator_pair, - collation_req_receiver, - Metrics::register(registry)?, - ); - CollatorProtocolSubsystem::new(side) - }) - .network_bridge_rx(NetworkBridgeRxSubsystem::new( - network_service.clone(), - authority_discovery_service.clone(), - sync_oracle, - network_bridge_metrics.clone(), - peer_set_protocol_names.clone(), - )) - .network_bridge_tx(NetworkBridgeTxSubsystem::new( - network_service, - authority_discovery_service, - network_bridge_metrics, - req_protocol_names, - peer_set_protocol_names, - )) - .provisioner(DummySubsystem) - .runtime_api(RuntimeApiSubsystem::new( - runtime_client.clone(), - Metrics::register(registry)?, - spawner.clone(), - )) - .statement_distribution(DummySubsystem) - .approval_distribution(DummySubsystem) - .approval_voting(DummySubsystem) - .gossip_support(DummySubsystem) - .dispute_coordinator(DummySubsystem) - .dispute_distribution(DummySubsystem) - .chain_selection(DummySubsystem) - .activation_external_listeners(Default::default()) - .span_per_active_leaf(Default::default()) - .active_leaves(Default::default()) - .supports_parachains(runtime_client) - .known_leaves(LruCache::new(KNOWN_LEAVES_CACHE_SIZE)) - .metrics(Metrics::register(registry)?) - .spawner(spawner); - - builder - .build_with_connector(connector) - .map_err(|e| RelayChainError::Application(e.into())) -} - -pub(crate) fn spawn_overseer( - overseer_args: CollatorOverseerGenArgs, - task_manager: &TaskManager, - relay_chain_rpc_client: Arc, -) -> Result { - let (overseer, overseer_handle) = build_overseer(OverseerConnector::default(), overseer_args) - .map_err(|e| { - tracing::error!("Failed to initialize overseer: {}", e); - e - })?; - - let overseer_handle = Handle::new(overseer_handle); - { - let handle = overseer_handle.clone(); - task_manager.spawn_essential_handle().spawn_blocking( - "overseer", - None, - Box::pin(async move { - use futures::{pin_mut, FutureExt}; - - let forward = forward_collator_events(relay_chain_rpc_client, handle).fuse(); - - let overseer_fut = overseer.run().fuse(); - - pin_mut!(overseer_fut); - pin_mut!(forward); - - select! { - _ = forward => (), - _ = overseer_fut => (), - } - }), - ); - } - Ok(overseer_handle) -} - -/// Minimal relay chain node representation -pub struct NewMinimalNode { - /// Task manager running all tasks for the minimal node - pub task_manager: TaskManager, - /// Overseer handle to interact with subsystems - pub overseer_handle: Handle, - /// Network service - pub network: Arc::Hash>>, -} - -/// Glues together the [`Overseer`] and `BlockchainEvents` by forwarding -/// import and finality notifications into the [`OverseerHandle`]. -async fn forward_collator_events( - client: Arc, - mut handle: Handle, -) -> Result<(), RelayChainError> { - let mut finality = client.finality_notification_stream().await?.fuse(); - let mut imports = client.import_notification_stream().await?.fuse(); - - loop { - select! { - f = finality.next() => { - match f { - Some(header) => { - tracing::info!( - target: "minimal-polkadot-node", - "Received finalized block via RPC: #{} ({} -> {})", - header.number, - header.parent_hash, - header.hash() - ); - let block_info = BlockInfo { hash: header.hash(), parent_hash: header.parent_hash, number: header.number }; - handle.block_finalized(block_info).await; - } - None => return Err(RelayChainError::GenericError("Relay chain finality stream ended.".to_string())), - } - }, - i = imports.next() => { - match i { - Some(header) => { - tracing::info!( - target: "minimal-polkadot-node", - "Received imported block via RPC: #{} ({} -> {})", - header.number, - header.parent_hash, - header.hash() - ); - let block_info = BlockInfo { hash: header.hash(), parent_hash: header.parent_hash, number: header.number }; - handle.block_imported(block_info).await; - } - None => return Err(RelayChainError::GenericError("Relay chain import stream ended.".to_string())), - } - } - } - } -} diff --git a/cumulus/client/relay-chain-minimal-node/src/lib.rs b/cumulus/client/relay-chain-minimal-node/src/lib.rs deleted file mode 100644 index 6def072913b0..000000000000 --- a/cumulus/client/relay-chain-minimal-node/src/lib.rs +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright 2017-2022 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -use collator_overseer::{CollatorOverseerGenArgs, NewMinimalNode}; - -use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult}; -use cumulus_relay_chain_rpc_interface::{RelayChainRpcInterface, Url}; -use network::build_collator_network; -use polkadot_network_bridge::{peer_sets_info, IsAuthority}; -use polkadot_node_network_protocol::{ - peer_set::PeerSetProtocolNames, - request_response::{v1, IncomingRequest, IncomingRequestReceiver, Protocol, ReqProtocolNames}, -}; - -use polkadot_node_subsystem_util::metrics::prometheus::Registry; -use polkadot_primitives::CollatorPair; - -use sc_authority_discovery::Service as AuthorityDiscoveryService; -use sc_network::{config::FullNetworkConfiguration, Event, NetworkEventStream, NetworkService}; -use sc_service::{Configuration, TaskManager}; -use sp_runtime::{app_crypto::Pair, traits::Block as BlockT}; - -use futures::StreamExt; -use std::sync::Arc; - -mod collator_overseer; - -mod network; - -mod blockchain_rpc_client; -pub use blockchain_rpc_client::BlockChainRpcClient; - -fn build_authority_discovery_service( - task_manager: &TaskManager, - client: Arc, - config: &Configuration, - network: Arc::Hash>>, - prometheus_registry: Option, -) -> AuthorityDiscoveryService { - let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht; - let authority_discovery_role = sc_authority_discovery::Role::Discover; - let dht_event_stream = network.event_stream("authority-discovery").filter_map(|e| async move { - match e { - Event::Dht(e) => Some(e), - _ => None, - } - }); - let (worker, service) = sc_authority_discovery::new_worker_and_service_with_config( - sc_authority_discovery::WorkerConfig { - publish_non_global_ips: auth_disc_publish_non_global_ips, - // Require that authority discovery records are signed. - strict_record_validation: true, - ..Default::default() - }, - client, - network.clone(), - Box::pin(dht_event_stream), - authority_discovery_role, - prometheus_registry, - ); - - task_manager.spawn_handle().spawn( - "authority-discovery-worker", - Some("authority-discovery"), - worker.run(), - ); - service -} - -pub async fn build_minimal_relay_chain_node( - polkadot_config: Configuration, - task_manager: &mut TaskManager, - relay_chain_url: Vec, -) -> RelayChainResult<(Arc<(dyn RelayChainInterface + 'static)>, Option)> { - let client = cumulus_relay_chain_rpc_interface::create_client_and_start_worker( - relay_chain_url, - task_manager, - ) - .await?; - let collator_pair = CollatorPair::generate().0; - let collator_node = new_minimal_relay_chain( - polkadot_config, - collator_pair.clone(), - Arc::new(BlockChainRpcClient::new(client.clone())), - ) - .await?; - task_manager.add_child(collator_node.task_manager); - Ok(( - Arc::new(RelayChainRpcInterface::new(client, collator_node.overseer_handle)), - Some(collator_pair), - )) -} - -/// Builds a minimal relay chain node. Chain data is fetched -/// via [`BlockChainRpcClient`] and fed into the overseer and its subsystems. -/// -/// Instead of spawning all subsystems, this minimal node will only spawn subsystems -/// required to collate: -/// - AvailabilityRecovery -/// - CollationGeneration -/// - CollatorProtocol -/// - NetworkBridgeRx -/// - NetworkBridgeTx -/// - RuntimeApi -/// - ChainApi -/// - AvailabilityDistribution -#[sc_tracing::logging::prefix_logs_with("Relaychain")] -async fn new_minimal_relay_chain( - config: Configuration, - collator_pair: CollatorPair, - relay_chain_rpc_client: Arc, -) -> Result { - let role = config.role.clone(); - let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network); - - let task_manager = { - let registry = config.prometheus_config.as_ref().map(|cfg| &cfg.registry); - TaskManager::new(config.tokio_handle.clone(), registry)? - }; - - let prometheus_registry = config.prometheus_registry().cloned(); - - let genesis_hash = relay_chain_rpc_client - .block_get_hash(Some(0)) - .await - .expect("Genesis block hash is always available; qed") - .unwrap_or_default(); - - let peer_set_protocol_names = - PeerSetProtocolNames::new(genesis_hash, config.chain_spec.fork_id()); - let is_authority = if role.is_authority() { IsAuthority::Yes } else { IsAuthority::No }; - - for config in peer_sets_info(is_authority, &peer_set_protocol_names) { - net_config.add_notification_protocol(config); - } - - let request_protocol_names = ReqProtocolNames::new(genesis_hash, config.chain_spec.fork_id()); - let (collation_req_receiver, available_data_req_receiver) = - build_request_response_protocol_receivers(&request_protocol_names, &mut net_config); - - let best_header = relay_chain_rpc_client - .chain_get_header(None) - .await? - .ok_or_else(|| RelayChainError::RpcCallError("Unable to fetch best header".to_string()))?; - let (network, network_starter, sync_oracle) = build_collator_network( - &config, - net_config, - task_manager.spawn_handle(), - genesis_hash, - best_header, - ) - .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; - - let authority_discovery_service = build_authority_discovery_service( - &task_manager, - relay_chain_rpc_client.clone(), - &config, - network.clone(), - prometheus_registry.clone(), - ); - - let overseer_args = CollatorOverseerGenArgs { - runtime_client: relay_chain_rpc_client.clone(), - network_service: network.clone(), - sync_oracle, - authority_discovery_service, - collation_req_receiver, - available_data_req_receiver, - registry: prometheus_registry.as_ref(), - spawner: task_manager.spawn_handle(), - collator_pair, - req_protocol_names: request_protocol_names, - peer_set_protocol_names, - }; - - let overseer_handle = - collator_overseer::spawn_overseer(overseer_args, &task_manager, relay_chain_rpc_client)?; - - network_starter.start_network(); - - Ok(NewMinimalNode { task_manager, overseer_handle, network }) -} - -fn build_request_response_protocol_receivers( - request_protocol_names: &ReqProtocolNames, - config: &mut FullNetworkConfiguration, -) -> ( - IncomingRequestReceiver, - IncomingRequestReceiver, -) { - let (collation_req_receiver, cfg) = - IncomingRequest::get_config_receiver(request_protocol_names); - config.add_request_response_protocol(cfg); - let (available_data_req_receiver, cfg) = - IncomingRequest::get_config_receiver(request_protocol_names); - config.add_request_response_protocol(cfg); - let cfg = Protocol::ChunkFetchingV1.get_outbound_only_config(request_protocol_names); - config.add_request_response_protocol(cfg); - (collation_req_receiver, available_data_req_receiver) -} diff --git a/cumulus/client/relay-chain-minimal-node/src/network.rs b/cumulus/client/relay-chain-minimal-node/src/network.rs deleted file mode 100644 index 5097e6ce33a6..000000000000 --- a/cumulus/client/relay-chain-minimal-node/src/network.rs +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use polkadot_core_primitives::{Block, Hash, Header}; -use sp_runtime::traits::{Block as BlockT, NumberFor}; - -use sc_network::{ - config::{ - NonDefaultSetConfig, NonReservedPeerMode, NotificationHandshake, ProtocolId, SetConfig, - }, - peer_store::PeerStore, - NetworkService, -}; - -use sc_network::config::FullNetworkConfiguration; -use sc_network_common::{role::Roles, sync::message::BlockAnnouncesHandshake}; -use sc_service::{error::Error, Configuration, NetworkStarter, SpawnTaskHandle}; -use sc_utils::mpsc::tracing_unbounded; - -use std::{iter, sync::Arc}; - -/// Build the network service, the network status sinks and an RPC sender. -pub(crate) fn build_collator_network( - config: &Configuration, - network_config: FullNetworkConfiguration, - spawn_handle: SpawnTaskHandle, - genesis_hash: Hash, - best_header: Header, -) -> Result< - (Arc>, NetworkStarter, Box), - Error, -> { - let protocol_id = config.protocol_id(); - let block_announce_config = get_block_announce_proto_config::( - protocol_id.clone(), - &None, - Roles::from(&config.role), - best_header.number, - best_header.hash(), - genesis_hash, - ); - - let peer_store = PeerStore::new( - network_config - .network_config - .boot_nodes - .iter() - .map(|bootnode| bootnode.peer_id) - .collect(), - ); - let peer_store_handle = peer_store.handle(); - spawn_handle.spawn("peer-store", Some("networking"), peer_store.run()); - - // RX is not used for anything because syncing is not started for the minimal node - let (tx, _rx) = tracing_unbounded("mpsc_syncing_engine_protocol", 100_000); - let network_params = sc_network::config::Params:: { - role: config.role.clone(), - executor: { - let spawn_handle = Clone::clone(&spawn_handle); - Box::new(move |fut| { - spawn_handle.spawn("libp2p-node", Some("networking"), fut); - }) - }, - fork_id: None, - network_config, - peer_store: peer_store_handle, - genesis_hash, - protocol_id, - metrics_registry: config.prometheus_config.as_ref().map(|config| config.registry.clone()), - block_announce_config, - tx, - }; - - let network_worker = sc_network::NetworkWorker::new(network_params)?; - let network_service = network_worker.service().clone(); - - let (network_start_tx, network_start_rx) = futures::channel::oneshot::channel(); - - // The network worker is responsible for gathering all network messages and processing - // them. This is quite a heavy task, and at the time of the writing of this comment it - // frequently happens that this future takes several seconds or in some situations - // even more than a minute until it has processed its entire queue. This is clearly an - // issue, and ideally we would like to fix the network future to take as little time as - // possible, but we also take the extra harm-prevention measure to execute the networking - // future using `spawn_blocking`. - spawn_handle.spawn_blocking("network-worker", Some("networking"), async move { - if network_start_rx.await.is_err() { - tracing::warn!( - "The NetworkStart returned as part of `build_network` has been silently dropped" - ); - // This `return` might seem unnecessary, but we don't want to make it look like - // everything is working as normal even though the user is clearly misusing the API. - return - } - - network_worker.run().await; - }); - - let network_starter = NetworkStarter::new(network_start_tx); - - Ok((network_service, network_starter, Box::new(SyncOracle {}))) -} - -struct SyncOracle; - -impl sp_consensus::SyncOracle for SyncOracle { - fn is_major_syncing(&self) -> bool { - false - } - - fn is_offline(&self) -> bool { - true - } -} - -fn get_block_announce_proto_config( - protocol_id: ProtocolId, - fork_id: &Option, - roles: Roles, - best_number: NumberFor, - best_hash: B::Hash, - genesis_hash: B::Hash, -) -> NonDefaultSetConfig { - let block_announces_protocol = { - let genesis_hash = genesis_hash.as_ref(); - if let Some(ref fork_id) = fork_id { - format!("/{}/{}/block-announces/1", array_bytes::bytes2hex("", genesis_hash), fork_id) - } else { - format!("/{}/block-announces/1", array_bytes::bytes2hex("", genesis_hash)) - } - }; - - NonDefaultSetConfig { - notifications_protocol: block_announces_protocol.into(), - fallback_names: iter::once(format!("/{}/block-announces/1", protocol_id.as_ref()).into()) - .collect(), - max_notification_size: 1024 * 1024, - handshake: Some(NotificationHandshake::new(BlockAnnouncesHandshake::::build( - roles, - best_number, - best_hash, - genesis_hash, - ))), - // NOTE: `set_config` will be ignored by `protocol.rs` as the block announcement - // protocol is still hardcoded into the peerset. - set_config: SetConfig { - in_peers: 0, - out_peers: 0, - reserved_nodes: Vec::new(), - non_reserved_mode: NonReservedPeerMode::Deny, - }, - } -} diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml deleted file mode 100644 index 10bd3d8c2d30..000000000000 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -[package] -authors = ["Parity Technologies "] -name = "cumulus-relay-chain-rpc-interface" -version = "0.1.0" -edition = "2021" - - -[dependencies] -polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } - -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-babe = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-storage = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-rpc-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } - -tokio = { version = "1.31.0", features = ["sync"] } - -futures = "0.3.28" -futures-timer = "3.0.2" -parity-scale-codec = "3.6.4" -jsonrpsee = { version = "0.16.2", features = ["ws-client"] } -tracing = "0.1.37" -async-trait = "0.1.73" -url = "2.4.0" -serde_json = "1.0.104" -serde = "1.0.183" -lru = "0.11.0" diff --git a/cumulus/client/relay-chain-rpc-interface/src/lib.rs b/cumulus/client/relay-chain-rpc-interface/src/lib.rs deleted file mode 100644 index db01af3cdc0c..000000000000 --- a/cumulus/client/relay-chain-rpc-interface/src/lib.rs +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use async_trait::async_trait; -use core::time::Duration; -use cumulus_primitives_core::{ - relay_chain::{ - CommittedCandidateReceipt, Hash as RelayHash, Header as RelayHeader, InboundHrmpMessage, - OccupiedCoreAssumption, SessionIndex, ValidatorId, - }, - InboundDownwardMessage, ParaId, PersistedValidationData, -}; -use cumulus_relay_chain_interface::{ - PHeader, RelayChainError, RelayChainInterface, RelayChainResult, -}; -use futures::{FutureExt, Stream, StreamExt}; -use polkadot_overseer::Handle; - -use sc_client_api::StorageProof; -use sp_core::sp_std::collections::btree_map::BTreeMap; -use sp_state_machine::StorageValue; -use sp_storage::StorageKey; -use std::pin::Pin; - -use cumulus_primitives_core::relay_chain::BlockId; -pub use url::Url; - -mod reconnecting_ws_client; -mod rpc_client; -pub use rpc_client::{create_client_and_start_worker, RelayChainRpcClient}; - -const TIMEOUT_IN_SECONDS: u64 = 6; - -/// RelayChainRpcInterface is used to interact with a full node that is running locally -/// in the same process. -#[derive(Clone)] -pub struct RelayChainRpcInterface { - rpc_client: RelayChainRpcClient, - overseer_handle: Handle, -} - -impl RelayChainRpcInterface { - pub fn new(rpc_client: RelayChainRpcClient, overseer_handle: Handle) -> Self { - Self { rpc_client, overseer_handle } - } -} - -#[async_trait] -impl RelayChainInterface for RelayChainRpcInterface { - async fn retrieve_dmq_contents( - &self, - para_id: ParaId, - relay_parent: RelayHash, - ) -> RelayChainResult> { - self.rpc_client.parachain_host_dmq_contents(para_id, relay_parent).await - } - - async fn retrieve_all_inbound_hrmp_channel_contents( - &self, - para_id: ParaId, - relay_parent: RelayHash, - ) -> RelayChainResult>> { - self.rpc_client - .parachain_host_inbound_hrmp_channels_contents(para_id, relay_parent) - .await - } - - async fn header(&self, block_id: BlockId) -> RelayChainResult> { - let hash = match block_id { - BlockId::Hash(hash) => hash, - BlockId::Number(num) => - if let Some(hash) = self.rpc_client.chain_get_block_hash(Some(num)).await? { - hash - } else { - return Ok(None) - }, - }; - let header = self.rpc_client.chain_get_header(Some(hash)).await?; - - Ok(header) - } - - async fn persisted_validation_data( - &self, - hash: RelayHash, - para_id: ParaId, - occupied_core_assumption: OccupiedCoreAssumption, - ) -> RelayChainResult> { - self.rpc_client - .parachain_host_persisted_validation_data(hash, para_id, occupied_core_assumption) - .await - } - - async fn candidate_pending_availability( - &self, - hash: RelayHash, - para_id: ParaId, - ) -> RelayChainResult> { - self.rpc_client - .parachain_host_candidate_pending_availability(hash, para_id) - .await - } - - async fn session_index_for_child(&self, hash: RelayHash) -> RelayChainResult { - self.rpc_client.parachain_host_session_index_for_child(hash).await - } - - async fn validators(&self, block_id: RelayHash) -> RelayChainResult> { - self.rpc_client.parachain_host_validators(block_id).await - } - - async fn import_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let imported_headers_stream = self.rpc_client.get_imported_heads_stream()?; - - Ok(imported_headers_stream.boxed()) - } - - async fn finality_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let imported_headers_stream = self.rpc_client.get_finalized_heads_stream()?; - - Ok(imported_headers_stream.boxed()) - } - - async fn best_block_hash(&self) -> RelayChainResult { - self.rpc_client.chain_get_head(None).await - } - - async fn finalized_block_hash(&self) -> RelayChainResult { - self.rpc_client.chain_get_finalized_head().await - } - - async fn is_major_syncing(&self) -> RelayChainResult { - self.rpc_client.system_health().await.map(|h| h.is_syncing) - } - - fn overseer_handle(&self) -> RelayChainResult { - Ok(self.overseer_handle.clone()) - } - - async fn get_storage_by_key( - &self, - relay_parent: RelayHash, - key: &[u8], - ) -> RelayChainResult> { - let storage_key = StorageKey(key.to_vec()); - self.rpc_client - .state_get_storage(storage_key, Some(relay_parent)) - .await - .map(|storage_data| storage_data.map(|sv| sv.0)) - } - - async fn prove_read( - &self, - relay_parent: RelayHash, - relevant_keys: &Vec>, - ) -> RelayChainResult { - let cloned = relevant_keys.clone(); - let storage_keys: Vec = cloned.into_iter().map(StorageKey).collect(); - - self.rpc_client - .state_get_read_proof(storage_keys, Some(relay_parent)) - .await - .map(|read_proof| { - StorageProof::new(read_proof.proof.into_iter().map(|bytes| bytes.to_vec())) - }) - } - - /// Wait for a given relay chain block - /// - /// The hash of the block to wait for is passed. We wait for the block to arrive or return after - /// a timeout. - /// - /// Implementation: - /// 1. Register a listener to all new blocks. - /// 2. Check if the block is already in chain. If yes, succeed early. - /// 3. Wait for the block to be imported via subscription. - /// 4. If timeout is reached, we return an error. - async fn wait_for_block(&self, wait_for_hash: RelayHash) -> RelayChainResult<()> { - let mut head_stream = self.rpc_client.get_imported_heads_stream()?; - - if self.rpc_client.chain_get_header(Some(wait_for_hash)).await?.is_some() { - return Ok(()) - } - - let mut timeout = futures_timer::Delay::new(Duration::from_secs(TIMEOUT_IN_SECONDS)).fuse(); - - loop { - futures::select! { - _ = timeout => return Err(RelayChainError::WaitTimeout(wait_for_hash)), - evt = head_stream.next().fuse() => match evt { - Some(evt) if evt.hash() == wait_for_hash => return Ok(()), - // Not the event we waited on. - Some(_) => continue, - None => return Err(RelayChainError::ImportListenerClosed(wait_for_hash)), - } - } - } - } - - async fn new_best_notification_stream( - &self, - ) -> RelayChainResult + Send>>> { - let imported_headers_stream = self.rpc_client.get_best_heads_stream()?; - Ok(imported_headers_stream.boxed()) - } -} diff --git a/cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs b/cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs deleted file mode 100644 index 0869dace7331..000000000000 --- a/cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs +++ /dev/null @@ -1,579 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use cumulus_primitives_core::relay_chain::{ - BlockNumber as RelayBlockNumber, Header as RelayHeader, -}; -use cumulus_relay_chain_interface::{RelayChainError, RelayChainResult}; -use futures::{ - channel::{ - mpsc::{Receiver, Sender}, - oneshot::Sender as OneshotSender, - }, - future::BoxFuture, - stream::FuturesUnordered, - FutureExt, StreamExt, -}; -use jsonrpsee::{ - core::{ - client::{Client as JsonRpcClient, ClientT, Subscription, SubscriptionClientT}, - params::ArrayParams, - Error as JsonRpseeError, JsonValue, - }, - rpc_params, - ws_client::WsClientBuilder, -}; -use lru::LruCache; -use sc_service::TaskManager; -use std::{num::NonZeroUsize, sync::Arc}; -use tokio::sync::mpsc::{ - channel as tokio_channel, Receiver as TokioReceiver, Sender as TokioSender, -}; -use url::Url; - -const NOTIFICATION_CHANNEL_SIZE_LIMIT: usize = 20; -const LOG_TARGET: &str = "reconnecting-websocket-client"; - -/// Messages for communication between [`ReconnectingWsClient`] and [`ReconnectingWebsocketWorker`]. -#[derive(Debug)] -enum RpcDispatcherMessage { - RegisterBestHeadListener(Sender), - RegisterImportListener(Sender), - RegisterFinalizationListener(Sender), - Request(String, ArrayParams, OneshotSender>), -} - -/// Frontend for performing websocket requests. -/// Requests and stream requests are forwarded to [`ReconnectingWebsocketWorker`]. -#[derive(Debug, Clone)] -pub struct ReconnectingWsClient { - /// Channel to communicate with the RPC worker - to_worker_channel: TokioSender, -} - -/// Format url and force addition of a port -fn url_to_string_with_port(url: Url) -> Option { - // This is already validated on CLI side, just defensive here - if (url.scheme() != "ws" && url.scheme() != "wss") || url.host_str().is_none() { - tracing::warn!(target: LOG_TARGET, ?url, "Non-WebSocket URL or missing host."); - return None - } - - // Either we have a user-supplied port or use the default for 'ws' or 'wss' here - Some(format!( - "{}://{}:{}{}{}", - url.scheme(), - url.host_str()?, - url.port_or_known_default()?, - url.path(), - url.query().map(|query| format!("?{}", query)).unwrap_or_default() - )) -} - -impl ReconnectingWsClient { - /// Create a new websocket client frontend. - pub async fn new(urls: Vec, task_manager: &mut TaskManager) -> RelayChainResult { - tracing::debug!(target: LOG_TARGET, "Instantiating reconnecting websocket client"); - - let (worker, sender) = ReconnectingWebsocketWorker::new(urls).await; - - task_manager - .spawn_essential_handle() - .spawn("relay-chain-rpc-worker", None, worker.run()); - - Ok(Self { to_worker_channel: sender }) - } -} - -impl ReconnectingWsClient { - /// Perform a request via websocket connection. - pub async fn request(&self, method: &str, params: ArrayParams) -> Result - where - R: serde::de::DeserializeOwned, - { - let (tx, rx) = futures::channel::oneshot::channel(); - - let message = RpcDispatcherMessage::Request(method.into(), params, tx); - self.to_worker_channel.send(message).await.map_err(|err| { - RelayChainError::WorkerCommunicationError(format!( - "Unable to send message to RPC worker: {}", - err - )) - })?; - - let value = rx.await.map_err(|err| { - RelayChainError::WorkerCommunicationError(format!( - "Unexpected channel close on RPC worker side: {}", - err - )) - })??; - - serde_json::from_value(value) - .map_err(|_| RelayChainError::GenericError("Unable to deserialize value".to_string())) - } - - /// Get a stream of new best relay chain headers - pub fn get_best_heads_stream(&self) -> Result, RelayChainError> { - let (tx, rx) = - futures::channel::mpsc::channel::(NOTIFICATION_CHANNEL_SIZE_LIMIT); - self.send_register_message_to_worker(RpcDispatcherMessage::RegisterBestHeadListener(tx))?; - Ok(rx) - } - - /// Get a stream of finalized relay chain headers - pub fn get_finalized_heads_stream(&self) -> Result, RelayChainError> { - let (tx, rx) = - futures::channel::mpsc::channel::(NOTIFICATION_CHANNEL_SIZE_LIMIT); - self.send_register_message_to_worker(RpcDispatcherMessage::RegisterFinalizationListener( - tx, - ))?; - Ok(rx) - } - - /// Get a stream of all imported relay chain headers - pub fn get_imported_heads_stream(&self) -> Result, RelayChainError> { - let (tx, rx) = - futures::channel::mpsc::channel::(NOTIFICATION_CHANNEL_SIZE_LIMIT); - self.send_register_message_to_worker(RpcDispatcherMessage::RegisterImportListener(tx))?; - Ok(rx) - } - - fn send_register_message_to_worker( - &self, - message: RpcDispatcherMessage, - ) -> Result<(), RelayChainError> { - self.to_worker_channel - .try_send(message) - .map_err(|e| RelayChainError::WorkerCommunicationError(e.to_string())) - } -} - -/// Worker that should be used in combination with [`crate::RelayChainRpcClient`]. -/// -/// Must be polled to distribute header notifications to listeners. -struct ReconnectingWebsocketWorker { - ws_urls: Vec, - /// Communication channel with the RPC client - client_receiver: TokioReceiver, - - /// Senders to distribute incoming header notifications to - imported_header_listeners: Vec>, - finalized_header_listeners: Vec>, - best_header_listeners: Vec>, -} - -fn distribute_header(header: RelayHeader, senders: &mut Vec>) { - senders.retain_mut(|e| { - match e.try_send(header.clone()) { - // Receiver has been dropped, remove Sender from list. - Err(error) if error.is_disconnected() => false, - // Channel is full. This should not happen. - // TODO: Improve error handling here - // https://github.com/paritytech/cumulus/issues/1482 - Err(error) => { - tracing::error!(target: LOG_TARGET, ?error, "Event distribution channel has reached its limit. This can lead to missed notifications."); - true - }, - _ => true, - } - }); -} - -/// Manages the active websocket client. -/// Responsible for creating request futures, subscription streams -/// and reconnections. -#[derive(Debug)] -struct ClientManager { - urls: Vec, - active_client: Arc, - active_index: usize, -} - -struct RelayChainSubscriptions { - import_subscription: Subscription, - finalized_subscription: Subscription, - best_subscription: Subscription, -} - -/// Try to find a new RPC server to connect to. -async fn connect_next_available_rpc_server( - urls: &Vec, - starting_position: usize, -) -> Result<(usize, Arc), ()> { - tracing::debug!(target: LOG_TARGET, starting_position, "Connecting to RPC server."); - for (counter, url) in urls.iter().cycle().skip(starting_position).take(urls.len()).enumerate() { - let index = (starting_position + counter) % urls.len(); - tracing::info!( - target: LOG_TARGET, - index, - url, - "Trying to connect to next external relaychain node.", - ); - match WsClientBuilder::default().build(&url).await { - Ok(ws_client) => return Ok((index, Arc::new(ws_client))), - Err(err) => tracing::debug!(target: LOG_TARGET, url, ?err, "Unable to connect."), - }; - } - Err(()) -} - -impl ClientManager { - pub async fn new(urls: Vec) -> Result { - if urls.is_empty() { - return Err(()) - } - let active_client = connect_next_available_rpc_server(&urls, 0).await?; - Ok(Self { urls, active_client: active_client.1, active_index: active_client.0 }) - } - - pub async fn connect_to_new_rpc_server(&mut self) -> Result<(), ()> { - let new_active = - connect_next_available_rpc_server(&self.urls, self.active_index + 1).await?; - self.active_client = new_active.1; - self.active_index = new_active.0; - Ok(()) - } - - async fn get_subscriptions(&self) -> Result { - let import_subscription = self - .active_client - .subscribe::( - "chain_subscribeAllHeads", - rpc_params![], - "chain_unsubscribeAllHeads", - ) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - ?e, - "Unable to open `chain_subscribeAllHeads` subscription." - ); - e - })?; - let best_subscription = self - .active_client - .subscribe::( - "chain_subscribeNewHeads", - rpc_params![], - "chain_unsubscribeNewHeads", - ) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - ?e, - "Unable to open `chain_subscribeNewHeads` subscription." - ); - e - })?; - let finalized_subscription = self - .active_client - .subscribe::( - "chain_subscribeFinalizedHeads", - rpc_params![], - "chain_unsubscribeFinalizedHeads", - ) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - ?e, - "Unable to open `chain_subscribeFinalizedHeads` subscription." - ); - e - })?; - - Ok(RelayChainSubscriptions { - import_subscription, - best_subscription, - finalized_subscription, - }) - } - - /// Create a request future that performs an RPC request and sends the results to the caller. - /// In case of a dead websocket connection, it returns the original request parameters to - /// enable retries. - fn create_request( - &self, - method: String, - params: ArrayParams, - response_sender: OneshotSender>, - ) -> BoxFuture<'static, Result<(), RpcDispatcherMessage>> { - let future_client = self.active_client.clone(); - async move { - let resp = future_client.request(&method, params.clone()).await; - - // We should only return the original request in case - // the websocket connection is dead and requires a restart. - // Other errors should be forwarded to the request caller. - if let Err(JsonRpseeError::RestartNeeded(_)) = resp { - return Err(RpcDispatcherMessage::Request(method, params, response_sender)) - } - - if let Err(err) = response_sender.send(resp) { - tracing::debug!( - target: LOG_TARGET, - ?err, - "Recipient no longer interested in request result" - ); - } - Ok(()) - } - .boxed() - } -} - -enum ConnectionStatus { - Connected, - ReconnectRequired(Option), -} - -impl ReconnectingWebsocketWorker { - /// Create new worker. Returns the worker and a channel to register new listeners. - async fn new( - urls: Vec, - ) -> (ReconnectingWebsocketWorker, TokioSender) { - let urls = urls.into_iter().filter_map(url_to_string_with_port).collect(); - - let (tx, rx) = tokio_channel(100); - let worker = ReconnectingWebsocketWorker { - ws_urls: urls, - client_receiver: rx, - imported_header_listeners: Vec::new(), - finalized_header_listeners: Vec::new(), - best_header_listeners: Vec::new(), - }; - (worker, tx) - } - - /// Reconnect via [`ClientManager`] and provide new notification streams. - async fn handle_reconnect( - &mut self, - client_manager: &mut ClientManager, - pending_requests: &mut FuturesUnordered< - BoxFuture<'static, Result<(), RpcDispatcherMessage>>, - >, - first_failed_request: Option, - ) -> Result { - let mut requests_to_retry = Vec::new(); - if let Some(req @ RpcDispatcherMessage::Request(_, _, _)) = first_failed_request { - requests_to_retry.push(req); - } - - // At this point, all pending requests will return an error since the - // websocket connection is dead. So draining the pending requests should be fast. - while !pending_requests.is_empty() { - if let Some(Err(req)) = pending_requests.next().await { - requests_to_retry.push(req); - } - } - - if client_manager.connect_to_new_rpc_server().await.is_err() { - return Err("Unable to find valid external RPC server, shutting down.".to_string()) - }; - - for item in requests_to_retry.into_iter() { - if let RpcDispatcherMessage::Request(method, params, response_sender) = item { - pending_requests.push(client_manager.create_request( - method, - params, - response_sender, - )); - }; - } - - client_manager.get_subscriptions().await.map_err(|e| { - format!("Not able to create streams from newly connected RPC server, shutting down. err: {:?}", e) - }) - } - - /// Run this worker to drive notification streams. - /// The worker does the following: - /// - Listen for [`RpcDispatcherMessage`], perform requests and register new listeners for the - /// notification streams - /// - Distribute incoming import, best head and finalization notifications to registered - /// listeners. If an error occurs during sending, the receiver has been closed and we remove - /// the sender from the list. - /// - Find a new valid RPC server to connect to in case the websocket connection is terminated. - /// If the worker is not able to connec to an RPC server from the list, the worker shuts down. - async fn run(mut self) { - let mut pending_requests = FuturesUnordered::new(); - - let urls = std::mem::take(&mut self.ws_urls); - let Ok(mut client_manager) = ClientManager::new(urls).await else { - tracing::error!(target: LOG_TARGET, "No valid RPC url found. Stopping RPC worker."); - return - }; - let Ok(mut subscriptions) = client_manager.get_subscriptions().await else { - tracing::error!(target: LOG_TARGET, "Unable to fetch subscriptions on initial connection."); - return - }; - - let mut imported_blocks_cache = - LruCache::new(NonZeroUsize::new(40).expect("40 is nonzero; qed.")); - let mut should_reconnect = ConnectionStatus::Connected; - let mut last_seen_finalized_num: RelayBlockNumber = 0; - loop { - // This branch is taken if the websocket connection to the current RPC server is closed. - if let ConnectionStatus::ReconnectRequired(maybe_failed_request) = should_reconnect { - match self - .handle_reconnect( - &mut client_manager, - &mut pending_requests, - maybe_failed_request, - ) - .await - { - Ok(new_subscriptions) => { - subscriptions = new_subscriptions; - }, - Err(message) => { - tracing::error!( - target: LOG_TARGET, - message, - "Unable to reconnect, stopping worker." - ); - return - }, - } - should_reconnect = ConnectionStatus::Connected; - } - - tokio::select! { - evt = self.client_receiver.recv() => match evt { - Some(RpcDispatcherMessage::RegisterBestHeadListener(tx)) => { - self.best_header_listeners.push(tx); - }, - Some(RpcDispatcherMessage::RegisterImportListener(tx)) => { - self.imported_header_listeners.push(tx) - }, - Some(RpcDispatcherMessage::RegisterFinalizationListener(tx)) => { - self.finalized_header_listeners.push(tx) - }, - Some(RpcDispatcherMessage::Request(method, params, response_sender)) => { - pending_requests.push(client_manager.create_request(method, params, response_sender)); - }, - None => { - tracing::error!(target: LOG_TARGET, "RPC client receiver closed. Stopping RPC Worker."); - return; - } - }, - should_retry = pending_requests.next(), if !pending_requests.is_empty() => { - if let Some(Err(req)) = should_retry { - should_reconnect = ConnectionStatus::ReconnectRequired(Some(req)); - } - }, - import_event = subscriptions.import_subscription.next() => { - match import_event { - Some(Ok(header)) => { - let hash = header.hash(); - if imported_blocks_cache.contains(&hash) { - tracing::debug!( - target: LOG_TARGET, - number = header.number, - ?hash, - "Duplicate imported block header. This might happen after switching to a new RPC node. Skipping distribution." - ); - continue; - } - imported_blocks_cache.put(hash, ()); - distribute_header(header, &mut self.imported_header_listeners); - }, - None => { - tracing::error!(target: LOG_TARGET, "Subscription closed."); - should_reconnect = ConnectionStatus::ReconnectRequired(None); - }, - Some(Err(error)) => { - tracing::error!(target: LOG_TARGET, ?error, "Error in RPC subscription."); - should_reconnect = ConnectionStatus::ReconnectRequired(None); - }, - } - }, - best_header_event = subscriptions.best_subscription.next() => { - match best_header_event { - Some(Ok(header)) => distribute_header(header, &mut self.best_header_listeners), - None => { - tracing::error!(target: LOG_TARGET, "Subscription closed."); - should_reconnect = ConnectionStatus::ReconnectRequired(None); - }, - Some(Err(error)) => { - tracing::error!(target: LOG_TARGET, ?error, "Error in RPC subscription."); - should_reconnect = ConnectionStatus::ReconnectRequired(None); - }, - } - } - finalized_event = subscriptions.finalized_subscription.next() => { - match finalized_event { - Some(Ok(header)) if header.number > last_seen_finalized_num => { - last_seen_finalized_num = header.number; - distribute_header(header, &mut self.finalized_header_listeners); - }, - Some(Ok(header)) => { - tracing::debug!( - target: LOG_TARGET, - number = header.number, - last_seen_finalized_num, - "Duplicate finalized block header. This might happen after switching to a new RPC node. Skipping distribution." - ); - }, - None => { - tracing::error!(target: LOG_TARGET, "Subscription closed."); - should_reconnect = ConnectionStatus::ReconnectRequired(None); - }, - Some(Err(error)) => { - tracing::error!(target: LOG_TARGET, ?error, "Error in RPC subscription."); - should_reconnect = ConnectionStatus::ReconnectRequired(None); - }, - } - } - } - } - } -} - -#[cfg(test)] -mod test { - use super::url_to_string_with_port; - use url::Url; - - #[test] - fn url_to_string_works() { - let url = Url::parse("wss://something/path").unwrap(); - assert_eq!(Some("wss://something:443/path".to_string()), url_to_string_with_port(url)); - - let url = Url::parse("ws://something/path").unwrap(); - assert_eq!(Some("ws://something:80/path".to_string()), url_to_string_with_port(url)); - - let url = Url::parse("wss://something:100/path").unwrap(); - assert_eq!(Some("wss://something:100/path".to_string()), url_to_string_with_port(url)); - - let url = Url::parse("wss://something:100/path").unwrap(); - assert_eq!(Some("wss://something:100/path".to_string()), url_to_string_with_port(url)); - - let url = Url::parse("wss://something/path?query=yes").unwrap(); - assert_eq!( - Some("wss://something:443/path?query=yes".to_string()), - url_to_string_with_port(url) - ); - - let url = Url::parse("wss://something:9090/path?query=yes").unwrap(); - assert_eq!( - Some("wss://something:9090/path?query=yes".to_string()), - url_to_string_with_port(url) - ); - } -} diff --git a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs b/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs deleted file mode 100644 index 0d7cf0bd4e41..000000000000 --- a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use futures::channel::mpsc::Receiver; -use jsonrpsee::{core::params::ArrayParams, rpc_params}; -use parity_scale_codec::{Decode, Encode}; -use serde::de::DeserializeOwned; -pub use url::Url; - -use sc_client_api::StorageData; -use sc_rpc_api::{state::ReadProof, system::Health}; -use sc_service::TaskManager; -use sp_api::RuntimeVersion; -use sp_consensus_babe::Epoch; -use sp_core::sp_std::collections::btree_map::BTreeMap; -use sp_storage::StorageKey; - -use cumulus_primitives_core::{ - relay_chain::{ - slashing, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, - Hash as RelayHash, Header as RelayHeader, InboundHrmpMessage, OccupiedCoreAssumption, - PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, - ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, - }, - InboundDownwardMessage, ParaId, PersistedValidationData, -}; -use cumulus_relay_chain_interface::{RelayChainError, RelayChainResult}; - -use crate::reconnecting_ws_client::ReconnectingWsClient; - -const LOG_TARGET: &str = "relay-chain-rpc-client"; - -/// Client that maps RPC methods and deserializes results -#[derive(Clone)] -pub struct RelayChainRpcClient { - /// Websocket client to make calls - ws_client: ReconnectingWsClient, -} - -/// Entry point to create [`RelayChainRpcClient`] and start a worker that distributes notifications. -pub async fn create_client_and_start_worker( - urls: Vec, - task_manager: &mut TaskManager, -) -> RelayChainResult { - let ws_client = ReconnectingWsClient::new(urls, task_manager).await?; - - let client = RelayChainRpcClient::new(ws_client).await?; - - Ok(client) -} - -impl RelayChainRpcClient { - /// Initialize new RPC Client. - async fn new(ws_client: ReconnectingWsClient) -> RelayChainResult { - let client = RelayChainRpcClient { ws_client }; - - Ok(client) - } - - /// Call a call to `state_call` rpc method. - pub async fn call_remote_runtime_function( - &self, - method_name: &str, - hash: RelayHash, - payload: Option, - ) -> RelayChainResult { - let payload_bytes = - payload.map_or(sp_core::Bytes(Vec::new()), |v| sp_core::Bytes(v.encode())); - let params = rpc_params! { - method_name, - payload_bytes, - hash - }; - let res = self - .request_tracing::("state_call", params, |err| { - tracing::trace!( - target: LOG_TARGET, - %method_name, - %hash, - error = %err, - "Error during call to 'state_call'.", - ); - }) - .await?; - Decode::decode(&mut &*res.0).map_err(Into::into) - } - - /// Perform RPC request - async fn request<'a, R>( - &self, - method: &'a str, - params: ArrayParams, - ) -> Result - where - R: DeserializeOwned + std::fmt::Debug, - { - self.request_tracing( - method, - params, - |e| tracing::trace!(target:LOG_TARGET, error = %e, %method, "Unable to complete RPC request"), - ) - .await - } - - /// Perform RPC request - async fn request_tracing<'a, R, OR>( - &self, - method: &'a str, - params: ArrayParams, - trace_error: OR, - ) -> Result - where - R: DeserializeOwned + std::fmt::Debug, - OR: Fn(&RelayChainError), - { - self.ws_client.request(method, params).await.map_err(|err| { - trace_error(&err); - RelayChainError::RpcCallError(method.to_string()) - }) - } - - /// Returns information regarding the current epoch. - pub async fn babe_api_current_epoch(&self, at: RelayHash) -> Result { - self.call_remote_runtime_function("BabeApi_current_epoch", at, None::<()>).await - } - - /// Scrape dispute relevant from on-chain, backing votes and resolved disputes. - pub async fn parachain_host_on_chain_votes( - &self, - at: RelayHash, - ) -> Result>, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_on_chain_votes", at, None::<()>) - .await - } - - /// Returns code hashes of PVFs that require pre-checking by validators in the active set. - pub async fn parachain_host_pvfs_require_precheck( - &self, - at: RelayHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_pvfs_require_precheck", at, None::<()>) - .await - } - - /// Submits a PVF pre-checking statement into the transaction pool. - pub async fn parachain_host_submit_pvf_check_statement( - &self, - at: RelayHash, - stmt: PvfCheckStatement, - signature: ValidatorSignature, - ) -> Result<(), RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_submit_pvf_check_statement", - at, - Some((stmt, signature)), - ) - .await - } - - /// Get system health information - pub async fn system_health(&self) -> Result { - self.request("system_health", rpc_params![]).await - } - - /// Get read proof for `storage_keys` - pub async fn state_get_read_proof( - &self, - storage_keys: Vec, - at: Option, - ) -> Result, RelayChainError> { - let params = rpc_params![storage_keys, at]; - self.request("state_getReadProof", params).await - } - - /// Retrieve storage item at `storage_key` - pub async fn state_get_storage( - &self, - storage_key: StorageKey, - at: Option, - ) -> Result, RelayChainError> { - let params = rpc_params![storage_key, at]; - self.request("state_getStorage", params).await - } - - /// Get hash of the n-th block in the canon chain. - /// - /// By default returns latest block hash. - pub async fn chain_get_head(&self, at: Option) -> Result { - let params = rpc_params![at]; - self.request("chain_getHead", params).await - } - - /// Returns the validator groups and rotation info localized based on the hypothetical child - /// of a block whose state this is invoked on. Note that `now` in the `GroupRotationInfo` - /// should be the successor of the number of the block. - pub async fn parachain_host_validator_groups( - &self, - at: RelayHash, - ) -> Result<(Vec>, GroupRotationInfo), RelayChainError> { - self.call_remote_runtime_function("ParachainHost_validator_groups", at, None::<()>) - .await - } - - /// Get a vector of events concerning candidates that occurred within a block. - pub async fn parachain_host_candidate_events( - &self, - at: RelayHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_candidate_events", at, None::<()>) - .await - } - - /// Checks if the given validation outputs pass the acceptance criteria. - pub async fn parachain_host_check_validation_outputs( - &self, - at: RelayHash, - para_id: ParaId, - outputs: CandidateCommitments, - ) -> Result { - self.call_remote_runtime_function( - "ParachainHost_check_validation_outputs", - at, - Some((para_id, outputs)), - ) - .await - } - - /// Returns the persisted validation data for the given `ParaId` along with the corresponding - /// validation code hash. Instead of accepting assumption about the para, matches the validation - /// data hash against an expected one and yields `None` if they're not equal. - pub async fn parachain_host_assumed_validation_data( - &self, - at: RelayHash, - para_id: ParaId, - expected_hash: RelayHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_persisted_assumed_validation_data", - at, - Some((para_id, expected_hash)), - ) - .await - } - - /// Get hash of last finalized block. - pub async fn chain_get_finalized_head(&self) -> Result { - self.request("chain_getFinalizedHead", rpc_params![]).await - } - - /// Get hash of n-th block. - pub async fn chain_get_block_hash( - &self, - block_number: Option, - ) -> Result, RelayChainError> { - let params = rpc_params![block_number]; - self.request("chain_getBlockHash", params).await - } - - /// Yields the persisted validation data for the given `ParaId` along with an assumption that - /// should be used if the para currently occupies a core. - /// - /// Returns `None` if either the para is not registered or the assumption is `Freed` - /// and the para already occupies a core. - pub async fn parachain_host_persisted_validation_data( - &self, - at: RelayHash, - para_id: ParaId, - occupied_core_assumption: OccupiedCoreAssumption, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_persisted_validation_data", - at, - Some((para_id, occupied_core_assumption)), - ) - .await - } - - /// Get the validation code from its hash. - pub async fn parachain_host_validation_code_by_hash( - &self, - at: RelayHash, - validation_code_hash: ValidationCodeHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_validation_code_by_hash", - at, - Some(validation_code_hash), - ) - .await - } - - /// Yields information on all availability cores as relevant to the child block. - /// Cores are either free or occupied. Free cores can have paras assigned to them. - pub async fn parachain_host_availability_cores( - &self, - at: RelayHash, - ) -> Result>, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_availability_cores", at, None::<()>) - .await - } - - /// Get runtime version - pub async fn runtime_version(&self, at: RelayHash) -> Result { - let params = rpc_params![at]; - self.request("state_getRuntimeVersion", params).await - } - - /// Returns all onchain disputes. - pub async fn parachain_host_disputes( - &self, - at: RelayHash, - ) -> Result)>, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_disputes", at, None::<()>) - .await - } - - /// Returns a list of validators that lost a past session dispute and need to be slashed. - /// - /// This is a staging method! Do not use on production runtimes! - pub async fn parachain_host_unapplied_slashes( - &self, - at: RelayHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_unapplied_slashes", at, None::<()>) - .await - } - - /// Returns a merkle proof of a validator session key in a past session. - /// - /// This is a staging method! Do not use on production runtimes! - pub async fn parachain_host_key_ownership_proof( - &self, - at: RelayHash, - validator_id: ValidatorId, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_key_ownership_proof", - at, - Some(validator_id), - ) - .await - } - - /// Submits an unsigned extrinsic to slash validators who lost a dispute about - /// a candidate of a past session. - /// - /// This is a staging method! Do not use on production runtimes! - pub async fn parachain_host_submit_report_dispute_lost( - &self, - at: RelayHash, - dispute_proof: slashing::DisputeProof, - key_ownership_proof: slashing::OpaqueKeyOwnershipProof, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_submit_report_dispute_lost", - at, - Some((dispute_proof, key_ownership_proof)), - ) - .await - } - - pub async fn authority_discovery_authorities( - &self, - at: RelayHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function("AuthorityDiscoveryApi_authorities", at, None::<()>) - .await - } - - /// Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. - /// - /// Returns `None` if either the para is not registered or the assumption is `Freed` - /// and the para already occupies a core. - pub async fn parachain_host_validation_code( - &self, - at: RelayHash, - para_id: ParaId, - occupied_core_assumption: OccupiedCoreAssumption, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_validation_code", - at, - Some((para_id, occupied_core_assumption)), - ) - .await - } - - /// Fetch the hash of the validation code used by a para, making the given - /// `OccupiedCoreAssumption`. - pub async fn parachain_host_validation_code_hash( - &self, - at: RelayHash, - para_id: ParaId, - occupied_core_assumption: OccupiedCoreAssumption, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_validation_code_hash", - at, - Some((para_id, occupied_core_assumption)), - ) - .await - } - - /// Get the session info for the given session, if stored. - pub async fn parachain_host_session_info( - &self, - at: RelayHash, - index: SessionIndex, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_session_info", at, Some(index)) - .await - } - - /// Get the executor parameters for the given session, if stored - pub async fn parachain_host_session_executor_params( - &self, - at: RelayHash, - session_index: SessionIndex, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_session_executor_params", - at, - Some(session_index), - ) - .await - } - - /// Get header at specified hash - pub async fn chain_get_header( - &self, - hash: Option, - ) -> Result, RelayChainError> { - let params = rpc_params![hash]; - self.request("chain_getHeader", params).await - } - - /// Get the receipt of a candidate pending availability. This returns `Some` for any paras - /// assigned to occupied cores in `availability_cores` and `None` otherwise. - pub async fn parachain_host_candidate_pending_availability( - &self, - at: RelayHash, - para_id: ParaId, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_candidate_pending_availability", - at, - Some(para_id), - ) - .await - } - - /// Returns the session index expected at a child of the block. - /// - /// This can be used to instantiate a `SigningContext`. - pub async fn parachain_host_session_index_for_child( - &self, - at: RelayHash, - ) -> Result { - self.call_remote_runtime_function("ParachainHost_session_index_for_child", at, None::<()>) - .await - } - - /// Get the current validators. - pub async fn parachain_host_validators( - &self, - at: RelayHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_validators", at, None::<()>) - .await - } - - /// Get the contents of all channels addressed to the given recipient. Channels that have no - /// messages in them are also included. - pub async fn parachain_host_inbound_hrmp_channels_contents( - &self, - para_id: ParaId, - at: RelayHash, - ) -> Result>, RelayChainError> { - self.call_remote_runtime_function( - "ParachainHost_inbound_hrmp_channels_contents", - at, - Some(para_id), - ) - .await - } - - /// Get all the pending inbound messages in the downward message queue for a para. - pub async fn parachain_host_dmq_contents( - &self, - para_id: ParaId, - at: RelayHash, - ) -> Result, RelayChainError> { - self.call_remote_runtime_function("ParachainHost_dmq_contents", at, Some(para_id)) - .await - } - - /// Get a stream of all imported relay chain headers - pub fn get_imported_heads_stream(&self) -> Result, RelayChainError> { - self.ws_client.get_imported_heads_stream() - } - - /// Get a stream of new best relay chain headers - pub fn get_best_heads_stream(&self) -> Result, RelayChainError> { - self.ws_client.get_best_heads_stream() - } - - /// Get a stream of finalized relay chain headers - pub fn get_finalized_heads_stream(&self) -> Result, RelayChainError> { - self.ws_client.get_finalized_heads_stream() - } -} diff --git a/cumulus/client/service/Cargo.toml b/cumulus/client/service/Cargo.toml deleted file mode 100644 index 52ab82a1127e..000000000000 --- a/cumulus/client/service/Cargo.toml +++ /dev/null @@ -1,41 +0,0 @@ -[package] -name = "cumulus-client-service" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -futures = "0.3.28" - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network-sync = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network-transactions = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-client-cli = { path = "../cli" } -cumulus-client-collator = { path = "../collator" } -cumulus-client-consensus-common = { path = "../consensus/common" } -cumulus-client-pov-recovery = { path = "../pov-recovery" } -cumulus-client-network = { path = "../network" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -cumulus-relay-chain-inprocess-interface = { path = "../relay-chain-inprocess-interface" } -cumulus-relay-chain-minimal-node = { path = "../relay-chain-minimal-node" } diff --git a/cumulus/client/service/src/lib.rs b/cumulus/client/service/src/lib.rs deleted file mode 100644 index 712bdba9af44..000000000000 --- a/cumulus/client/service/src/lib.rs +++ /dev/null @@ -1,462 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus service -//! -//! Provides functions for starting a collator node or a normal full node. - -use cumulus_client_cli::CollatorOptions; -use cumulus_client_consensus_common::ParachainConsensus; -use cumulus_client_network::RequireSecondedInBlockAnnounce; -use cumulus_client_pov_recovery::{PoVRecovery, RecoveryDelayRange, RecoveryHandle}; -use cumulus_primitives_core::{CollectCollationInfo, ParaId}; -use cumulus_relay_chain_inprocess_interface::build_inprocess_relay_chain; -use cumulus_relay_chain_interface::{RelayChainInterface, RelayChainResult}; -use cumulus_relay_chain_minimal_node::build_minimal_relay_chain_node; -use futures::{ - channel::{mpsc, oneshot}, - FutureExt, StreamExt, -}; -use polkadot_primitives::{CollatorPair, OccupiedCoreAssumption}; -use sc_client_api::{ - Backend as BackendT, BlockBackend, BlockchainEvents, Finalizer, ProofProvider, UsageProvider, -}; -use sc_consensus::{ - import_queue::{ImportQueue, ImportQueueService}, - BlockImport, -}; -use sc_network::{config::SyncMode, NetworkService}; -use sc_network_sync::SyncingService; -use sc_network_transactions::TransactionsHandlerController; -use sc_service::{Configuration, NetworkStarter, SpawnTaskHandle, TaskManager, WarpSyncParams}; -use sc_telemetry::{log, TelemetryWorkerHandle}; -use sc_utils::mpsc::TracingUnboundedSender; -use sp_api::ProvideRuntimeApi; -use sp_blockchain::{HeaderBackend, HeaderMetadata}; -use sp_core::{traits::SpawnNamed, Decode}; -use sp_runtime::traits::{Block as BlockT, BlockIdTo}; -use std::{sync::Arc, time::Duration}; - -// Given the sporadic nature of the explicit recovery operation and the -// possibility to retry infinite times this value is more than enough. -// In practice here we expect no more than one queued messages. -const RECOVERY_CHAN_SIZE: usize = 8; -const LOG_TARGET_SYNC: &str = "sync::cumulus"; - -/// Parameters given to [`start_collator`]. -pub struct StartCollatorParams<'a, Block: BlockT, BS, Client, RCInterface, Spawner> { - pub block_status: Arc, - pub client: Arc, - pub announce_block: Arc>) + Send + Sync>, - pub spawner: Spawner, - pub para_id: ParaId, - pub relay_chain_interface: RCInterface, - pub task_manager: &'a mut TaskManager, - pub parachain_consensus: Box>, - pub import_queue: Box>, - pub collator_key: CollatorPair, - pub relay_chain_slot_duration: Duration, - pub recovery_handle: Box, - pub sync_service: Arc>, -} - -/// Start a collator node for a parachain. -/// -/// A collator is similar to a validator in a normal blockchain. -/// It is responsible for producing blocks and sending the blocks to a -/// parachain validator for validation and inclusion into the relay chain. -pub async fn start_collator<'a, Block, BS, Client, Backend, RCInterface, Spawner>( - StartCollatorParams { - block_status, - client, - announce_block, - spawner, - para_id, - task_manager, - relay_chain_interface, - parachain_consensus, - import_queue, - collator_key, - relay_chain_slot_duration, - recovery_handle, - sync_service, - }: StartCollatorParams<'a, Block, BS, Client, RCInterface, Spawner>, -) -> sc_service::error::Result<()> -where - Block: BlockT, - BS: BlockBackend + Send + Sync + 'static, - Client: Finalizer - + UsageProvider - + HeaderBackend - + Send - + Sync - + BlockBackend - + BlockchainEvents - + ProvideRuntimeApi - + 'static, - Client::Api: CollectCollationInfo, - for<'b> &'b Client: BlockImport, - Spawner: SpawnNamed + Clone + Send + Sync + 'static, - RCInterface: RelayChainInterface + Clone + 'static, - Backend: BackendT + 'static, -{ - let (recovery_chan_tx, recovery_chan_rx) = mpsc::channel(RECOVERY_CHAN_SIZE); - - let consensus = cumulus_client_consensus_common::run_parachain_consensus( - para_id, - client.clone(), - relay_chain_interface.clone(), - announce_block.clone(), - Some(recovery_chan_tx), - ); - - task_manager - .spawn_essential_handle() - .spawn_blocking("cumulus-consensus", None, consensus); - - let pov_recovery = PoVRecovery::new( - recovery_handle, - // We want that collators wait at maximum the relay chain slot duration before starting - // to recover blocks. Additionally, we wait at least half the slot time to give the - // relay chain the chance to increase availability. - RecoveryDelayRange { min: relay_chain_slot_duration / 2, max: relay_chain_slot_duration }, - client.clone(), - import_queue, - relay_chain_interface.clone(), - para_id, - recovery_chan_rx, - sync_service, - ); - - task_manager - .spawn_essential_handle() - .spawn("cumulus-pov-recovery", None, pov_recovery.run()); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - cumulus_client_collator::start_collator(cumulus_client_collator::StartCollatorParams { - runtime_api: client, - block_status, - announce_block, - overseer_handle, - spawner, - para_id, - key: collator_key, - parachain_consensus, - }) - .await; - - Ok(()) -} - -/// Parameters given to [`start_full_node`]. -pub struct StartFullNodeParams<'a, Block: BlockT, Client, RCInterface> { - pub para_id: ParaId, - pub client: Arc, - pub relay_chain_interface: RCInterface, - pub task_manager: &'a mut TaskManager, - pub announce_block: Arc>) + Send + Sync>, - pub relay_chain_slot_duration: Duration, - pub import_queue: Box>, - pub recovery_handle: Box, - pub sync_service: Arc>, -} - -/// Start a full node for a parachain. -/// -/// A full node will only sync the given parachain and will follow the -/// tip of the chain. -pub fn start_full_node( - StartFullNodeParams { - client, - announce_block, - task_manager, - relay_chain_interface, - para_id, - relay_chain_slot_duration, - import_queue, - recovery_handle, - sync_service, - }: StartFullNodeParams, -) -> sc_service::error::Result<()> -where - Block: BlockT, - Client: Finalizer - + UsageProvider - + Send - + Sync - + BlockBackend - + BlockchainEvents - + 'static, - for<'a> &'a Client: BlockImport, - Backend: BackendT + 'static, - RCInterface: RelayChainInterface + Clone + 'static, -{ - let (recovery_chan_tx, recovery_chan_rx) = mpsc::channel(RECOVERY_CHAN_SIZE); - - let consensus = cumulus_client_consensus_common::run_parachain_consensus( - para_id, - client.clone(), - relay_chain_interface.clone(), - announce_block, - Some(recovery_chan_tx), - ); - - task_manager - .spawn_essential_handle() - .spawn_blocking("cumulus-consensus", None, consensus); - - let pov_recovery = PoVRecovery::new( - recovery_handle, - // Full nodes should at least wait 2.5 minutes (assuming 6 seconds slot duration) and - // in maximum 5 minutes before starting to recover blocks. Collators should already start - // the recovery way before full nodes try to recover a certain block and then share the - // block with the network using "the normal way". Full nodes are just the "last resort" - // for block recovery. - RecoveryDelayRange { - min: relay_chain_slot_duration * 25, - max: relay_chain_slot_duration * 50, - }, - client, - import_queue, - relay_chain_interface, - para_id, - recovery_chan_rx, - sync_service, - ); - - task_manager - .spawn_essential_handle() - .spawn("cumulus-pov-recovery", None, pov_recovery.run()); - - Ok(()) -} - -/// Prepare the parachain's node configuration -/// -/// This function will disable the default announcement of Substrate for the parachain in favor -/// of the one of Cumulus. -pub fn prepare_node_config(mut parachain_config: Configuration) -> Configuration { - parachain_config.announce_block = false; - - parachain_config -} - -/// Build a relay chain interface. -/// Will return a minimal relay chain node with RPC -/// client or an inprocess node, based on the [`CollatorOptions`] passed in. -pub async fn build_relay_chain_interface( - polkadot_config: Configuration, - parachain_config: &Configuration, - telemetry_worker_handle: Option, - task_manager: &mut TaskManager, - collator_options: CollatorOptions, - hwbench: Option, -) -> RelayChainResult<(Arc<(dyn RelayChainInterface + 'static)>, Option)> { - if !collator_options.relay_chain_rpc_urls.is_empty() { - build_minimal_relay_chain_node( - polkadot_config, - task_manager, - collator_options.relay_chain_rpc_urls, - ) - .await - } else { - build_inprocess_relay_chain( - polkadot_config, - parachain_config, - telemetry_worker_handle, - task_manager, - hwbench, - ) - } -} - -/// Parameters given to [`build_network`]. -pub struct BuildNetworkParams< - 'a, - Block: BlockT, - Client: ProvideRuntimeApi - + BlockBackend - + HeaderMetadata - + HeaderBackend - + BlockIdTo - + 'static, - RCInterface, - IQ, -> where - Client::Api: sp_transaction_pool::runtime_api::TaggedTransactionQueue, -{ - pub parachain_config: &'a Configuration, - pub net_config: sc_network::config::FullNetworkConfiguration, - pub client: Arc, - pub transaction_pool: Arc>, - pub para_id: ParaId, - pub relay_chain_interface: RCInterface, - pub spawn_handle: SpawnTaskHandle, - pub import_queue: IQ, -} - -/// Build the network service, the network status sinks and an RPC sender. -pub async fn build_network<'a, Block, Client, RCInterface, IQ>( - BuildNetworkParams { - parachain_config, - net_config, - client, - transaction_pool, - para_id, - spawn_handle, - relay_chain_interface, - import_queue, - }: BuildNetworkParams<'a, Block, Client, RCInterface, IQ>, -) -> sc_service::error::Result<( - Arc>, - TracingUnboundedSender>, - TransactionsHandlerController, - NetworkStarter, - Arc>, -)> -where - Block: BlockT, - Client: UsageProvider - + HeaderBackend - + sp_consensus::block_validation::Chain - + Send - + Sync - + BlockBackend - + BlockchainEvents - + ProvideRuntimeApi - + HeaderMetadata - + BlockIdTo - + ProofProvider - + 'static, - Client::Api: CollectCollationInfo - + sp_transaction_pool::runtime_api::TaggedTransactionQueue, - for<'b> &'b Client: BlockImport, - RCInterface: RelayChainInterface + Clone + 'static, - IQ: ImportQueue + 'static, -{ - let warp_sync_params = match parachain_config.network.sync_mode { - SyncMode::Warp => { - let target_block = warp_sync_get::( - para_id, - relay_chain_interface.clone(), - spawn_handle.clone(), - ); - Some(WarpSyncParams::WaitForTarget(target_block)) - }, - _ => None, - }; - - let block_announce_validator = - RequireSecondedInBlockAnnounce::new(relay_chain_interface, para_id); - let block_announce_validator_builder = move |_| Box::new(block_announce_validator) as Box<_>; - - sc_service::build_network(sc_service::BuildNetworkParams { - config: parachain_config, - net_config, - client, - transaction_pool, - spawn_handle, - import_queue, - block_announce_validator_builder: Some(Box::new(block_announce_validator_builder)), - warp_sync_params, - }) -} - -/// Creates a new background task to wait for the relay chain to sync up and retrieve the parachain -/// header -fn warp_sync_get( - para_id: ParaId, - relay_chain_interface: RCInterface, - spawner: SpawnTaskHandle, -) -> oneshot::Receiver<::Header> -where - B: BlockT + 'static, - RCInterface: RelayChainInterface + 'static, -{ - let (sender, receiver) = oneshot::channel::(); - spawner.spawn( - "cumulus-parachain-wait-for-target-block", - None, - async move { - log::debug!( - target: "cumulus-network", - "waiting for announce block in a background task...", - ); - - let _ = wait_for_target_block::(sender, para_id, relay_chain_interface) - .await - .map_err(|e| { - log::error!( - target: LOG_TARGET_SYNC, - "Unable to determine parachain target block {:?}", - e - ) - }); - } - .boxed(), - ); - - receiver -} - -/// Waits for the relay chain to have finished syncing and then gets the parachain header that -/// corresponds to the last finalized relay chain block. -async fn wait_for_target_block( - sender: oneshot::Sender<::Header>, - para_id: ParaId, - relay_chain_interface: RCInterface, -) -> Result<(), Box> -where - B: BlockT + 'static, - RCInterface: RelayChainInterface + Send + 'static, -{ - let mut imported_blocks = relay_chain_interface.import_notification_stream().await?.fuse(); - while imported_blocks.next().await.is_some() { - let is_syncing = relay_chain_interface.is_major_syncing().await.map_err(|e| { - Box::::from(format!( - "Unable to determine sync status. {e}" - )) - })?; - - if !is_syncing { - let relay_chain_best_hash = relay_chain_interface - .finalized_block_hash() - .await - .map_err(|e| Box::new(e) as Box<_>)?; - - let validation_data = relay_chain_interface - .persisted_validation_data( - relay_chain_best_hash, - para_id, - OccupiedCoreAssumption::TimedOut, - ) - .await - .map_err(|e| format!("{e:?}"))? - .ok_or("Could not find parachain head in relay chain")?; - - let target_block = B::Header::decode(&mut &validation_data.parent_head.0[..]) - .map_err(|e| format!("Failed to decode parachain head: {e}"))?; - - log::debug!(target: LOG_TARGET_SYNC, "Target block reached {:?}", target_block); - let _ = sender.send(target_block); - return Ok(()) - } - } - - Err("Stopping following imported blocks. Could not determine parachain target block".into()) -} diff --git a/cumulus/docker/docker-compose.yml b/cumulus/docker/docker-compose.yml deleted file mode 100644 index 8344ad43bb4c..000000000000 --- a/cumulus/docker/docker-compose.yml +++ /dev/null @@ -1,129 +0,0 @@ -version: '3.7' -services: - node_alice: - image: "polkadot:${BRANCH:-cumulus-branch}" - ports: - - "30333:30333" - - "9933:9933" - - "9944:9944" - volumes: - - "polkadot-data-alice:/data" - - type: bind - source: ./test/parachain/chain-specs/polkadot_chainspec.json - target: /chainspec.json - read_only: true - command: > - polkadot - --chain=/chainspec.json - --base-path=/data - --port 30333 - --rpc-port 9933 - --ws-port 9944 - --rpc-external - --rpc-cors all - --ws-external - --alice - networks: - testing_net: - ipv4_address: 172.28.1.1 - aliases: - - alice - - node_bob: - image: "polkadot:${BRANCH:-cumulus-branch}" - ports: - - "30344:30333" - - "9935:9933" - - "9945:9944" - volumes: - - "polkadot-data-bob:/data" - - type: bind - source: ./test/parachain/chain-specs/polkadot_chainspec.json - target: /chainspec.json - read_only: true - command: > - polkadot - --chain=/chainspec.json - --base-path=/data - --port 30333 - --rpc-port 9933 - --ws-port 9944 - --rpc-external - --ws-external - --rpc-cors all - --bob - networks: - testing_net: - ipv4_address: 172.28.1.2 - aliases: - - bob - - genesis_state: - build: - context: . - dockerfile: ./docker/test-parachain-collator.dockerfile - image: "ctpc:latest" - volumes: - - "genesis-state:/data" - command: > - polkadot-parachain - export-genesis-state - /data/genesis-state - - collator: - build: - context: . - dockerfile: ./docker/test-parachain-collator.dockerfile - target: collator - image: "ctpc:collator" - volumes: - - "collator-data:/data" - depends_on: - - node_alice - - node_bob - command: > - inject_bootnodes.sh - --base-path=/data - networks: - testing_net: - - runtime: - build: - context: . - dockerfile: ./docker/test-parachain-collator.dockerfile - target: runtime - image: "ctpc:runtime" - volumes: - - "parachain-runtime:/runtime" - - - registrar: - build: - context: . - dockerfile: ./docker/parachain-registrar.dockerfile - image: para-reg:latest - volumes: - - "genesis-state:/genesis" - - "parachain-runtime:/runtime" - depends_on: - - node_alice - - runtime - - genesis_state - networks: - testing_net: - - -volumes: - polkadot-data-alice: - polkadot-data-bob: - collator-data: - genesis-state: - parachain-runtime: - - -networks: - testing_net: - ipam: - driver: default - config: - - subnet: 172.28.0.0/16 diff --git a/cumulus/docker/injected.Dockerfile b/cumulus/docker/injected.Dockerfile deleted file mode 100644 index 16b8877c30fd..000000000000 --- a/cumulus/docker/injected.Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -FROM docker.io/parity/base-bin - -# metadata -ARG VCS_REF -ARG BUILD_DATE -ARG IMAGE_NAME - -LABEL io.parity.image.authors="devops-team@parity.io" \ - io.parity.image.vendor="Parity Technologies" \ - io.parity.image.title="${IMAGE_NAME}" \ - io.parity.image.description="Cumulus, the Polkadot collator." \ - io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/docker/Dockerfile" \ - io.parity.image.revision="${VCS_REF}" \ - io.parity.image.created="${BUILD_DATE}" \ - io.parity.image.documentation="https://github.com/paritytech/cumulus/" - -# show backtraces -ENV RUST_BACKTRACE 1 - -USER root - -RUN mkdir -p /specs - -# add polkadot-parachain binary to the docker image -COPY ./target/release-artifacts/* /usr/local/bin -COPY ./parachains/chain-specs/*.json /specs/ - -USER parity - -# check if executable works in this container -RUN /usr/local/bin/polkadot-parachain --version - -EXPOSE 30333 9933 9944 9615 -VOLUME ["/polkadot", "/specs"] - -ENTRYPOINT ["/usr/local/bin/polkadot-parachain"] diff --git a/cumulus/docker/parachain-registrar.dockerfile b/cumulus/docker/parachain-registrar.dockerfile deleted file mode 100644 index f7d77454a2b9..000000000000 --- a/cumulus/docker/parachain-registrar.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM node:latest AS pjs - -# It would be great to depend on a more stable tag, but we need some -# as-yet-unreleased features. -RUN yarn global add @polkadot/api-cli@0.10.0-beta.14 - -ENTRYPOINT [ "polkadot-js-api" ] -CMD [ "--version" ] - -# To use the pjs build stage to access the blockchain from the host machine: -# -# docker build -f docker/parachain-registrar.dockerfile --target pjs -t parachain-registrar:pjs . -# alias pjs='docker run --rm --net cumulus_testing_net parachain-registrar:pjs --ws ws://172.28.1.1:9944' -# -# Then, as long as the chain is running, you can use the polkadot-js-api CLI like: -# -# pjs query.sudo.key - -FROM pjs -RUN apt-get update && apt-get install curl netcat -y && \ - curl -sSo /wait-for-it.sh https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh && \ - chmod +x /wait-for-it.sh -# the only thing left to do is to actually run the transaction. -COPY ./docker/scripts/register_para.sh /usr/bin -# unset the previous stage's entrypoint -ENTRYPOINT [] -CMD [ "/usr/bin/register_para.sh" ] diff --git a/cumulus/docker/polkadot-parachain-debug_unsigned_injected.Dockerfile b/cumulus/docker/polkadot-parachain-debug_unsigned_injected.Dockerfile deleted file mode 100644 index a2e32049f5bb..000000000000 --- a/cumulus/docker/polkadot-parachain-debug_unsigned_injected.Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM docker.io/library/ubuntu:20.04 - -# metadata -ARG VCS_REF -ARG BUILD_DATE -ARG IMAGE_NAME - -LABEL io.parity.image.authors="devops-team@parity.io" \ - io.parity.image.vendor="Parity Technologies" \ - io.parity.image.title="${IMAGE_NAME}" \ - io.parity.image.description="Cumulus, the Polkadot collator." \ - io.parity.image.source="https://github.com/paritytech/cumulus/blob/${VCS_REF}/scripts/docker/polkadot-parachain-debug_unsigned_injected.Dockerfile" \ - io.parity.image.revision="${VCS_REF}" \ - io.parity.image.created="${BUILD_DATE}" \ - io.parity.image.documentation="https://github.com/paritytech/cumulus/" - -# show backtraces -ENV RUST_BACKTRACE 1 - -# install tools and dependencies -RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - libssl1.1 \ - ca-certificates \ - curl && \ - # apt cleanup - apt-get autoremove -y && \ - apt-get clean && \ - find /var/lib/apt/lists/ -type f -not -name lock -delete; \ - # add user and link ~/.local/share/polkadot-parachain to /data - useradd -m -u 10000 -U -s /bin/sh -d /polkadot-parachain polkadot-parachain && \ - mkdir -p /data /polkadot-parachain/.local/share && \ - chown -R polkadot-parachain:polkadot-parachain /data && \ - ln -s /data /polkadot-parachain/.local/share/polkadot-parachain && \ - mkdir -p /specs - -# add polkadot-parachain binary to the docker image -COPY ./artifacts/polkadot-parachain /usr/local/bin -COPY ./parachains/chain-specs/*.json /specs/ - -USER polkadot-parachain - -# check if executable works in this container -RUN /usr/local/bin/polkadot-parachain --version - -EXPOSE 30333 9933 9944 -VOLUME ["/polkadot-parachain"] - -ENTRYPOINT ["/usr/local/bin/polkadot-parachain"] diff --git a/cumulus/docker/polkadot-parachain_builder.Containerfile b/cumulus/docker/polkadot-parachain_builder.Containerfile deleted file mode 100644 index 159bcb323693..000000000000 --- a/cumulus/docker/polkadot-parachain_builder.Containerfile +++ /dev/null @@ -1,36 +0,0 @@ -# This file is sourced from https://github.com/paritytech/polkadot/blob/master/scripts/ci/dockerfiles/polkadot/polkadot_builder.Dockerfile -# This is the build stage for polkadot-parachain. Here we create the binary in a temporary image. -FROM docker.io/paritytech/ci-linux:production as builder - -WORKDIR /cumulus -COPY . /cumulus - -RUN cargo build --release --locked -p polkadot-parachain - -# This is the 2nd stage: a very small image where we copy the Polkadot binary." -FROM docker.io/library/ubuntu:20.04 - -LABEL io.parity.image.type="builder" \ - io.parity.image.authors="devops-team@parity.io" \ - io.parity.image.vendor="Parity Technologies" \ - io.parity.image.description="Multistage Docker image for polkadot-parachain" \ - io.parity.image.source="https://github.com/paritytech/polkadot/blob/${VCS_REF}/scripts/ci/dockerfiles/polkadot/polkadot-parachain_builder.Dockerfile" \ - io.parity.image.documentation="https://github.com/paritytech/cumulus" - -COPY --from=builder /cumulus/target/release/polkadot-parachain /usr/local/bin - -RUN useradd -m -u 1000 -U -s /bin/sh -d /cumulus polkadot-parachain && \ - mkdir -p /data /cumulus/.local/share && \ - chown -R polkadot-parachain:polkadot-parachain /data && \ - ln -s /data /cumulus/.local/share/polkadot-parachain && \ -# unclutter and minimize the attack surface - rm -rf /usr/bin /usr/sbin && \ -# check if executable works in this container - /usr/local/bin/polkadot-parachain --version - -USER polkadot-parachain - -EXPOSE 30333 9933 9944 9615 -VOLUME ["/data"] - -ENTRYPOINT ["/usr/local/bin/polkadot-parachain"] diff --git a/cumulus/docker/scripts/build-injected-image.sh b/cumulus/docker/scripts/build-injected-image.sh deleted file mode 100755 index dc92f181bc3b..000000000000 --- a/cumulus/docker/scripts/build-injected-image.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -OWNER=${OWNER:-parity} -IMAGE_NAME=${IMAGE_NAME:-polkadot-parachain} -docker build --no-cache \ - --build-arg IMAGE_NAME=$IMAGE_NAME \ - -t $OWNER/$IMAGE_NAME \ - -f ./docker/injected.Dockerfile \ - . && docker images diff --git a/cumulus/docker/scripts/build_docker.sh b/cumulus/docker/scripts/build_docker.sh deleted file mode 100755 index ba4454493010..000000000000 --- a/cumulus/docker/scripts/build_docker.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(cd "$(dirname "$0")" && git rev-parse --show-toplevel)" - -dockerfile="$1" -if [ -z "$dockerfile" ]; then - dockerfile="./docker/test-parachain-collator.dockerfile" -else - shift 1 -fi -image_name="$(basename "$dockerfile" | rev | cut -d. -f2- | rev)" - -echo "building $dockerfile as $image_name..." - -time docker build \ - -f "$dockerfile" \ - -t "$image_name":latest \ - "$@" \ - . diff --git a/cumulus/docker/scripts/build_polkadot.sh b/cumulus/docker/scripts/build_polkadot.sh deleted file mode 100755 index 266017c8908e..000000000000 --- a/cumulus/docker/scripts/build_polkadot.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cumulus_repo=$(cd "$(dirname "$0")" && git rev-parse --show-toplevel) -polkadot_repo=$(dirname "$cumulus_repo")/polkadot -if [ ! -d "$polkadot_repo/.git" ]; then - echo "please clone polkadot in parallel to this repo:" - echo " (cd .. && git clone git@github.com:paritytech/polkadot.git)" - exit 1 -fi - -if [ -z "$BRANCH" ]; then - BRANCH=cumulus-branch -fi - -cd "$polkadot_repo" -git fetch -git checkout "$BRANCH" -time docker build \ - -f ./docker/Dockerfile \ - --build-arg PROFILE=release \ - -t polkadot:"$BRANCH" . diff --git a/cumulus/docker/scripts/dc.sh b/cumulus/docker/scripts/dc.sh deleted file mode 100644 index f5b44225d759..000000000000 --- a/cumulus/docker/scripts/dc.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -# helper function to run docker-compose using the docker/docker-compose.yml file while -# retaining a context from the root of the repository - -set -e - -dc () { - cd "$(cd "$(dirname "$0")" && git rev-parse --show-toplevel)" - docker-compose -f - "$@" < docker/docker-compose.yml -} \ No newline at end of file diff --git a/cumulus/docker/scripts/healthcheck.sh b/cumulus/docker/scripts/healthcheck.sh deleted file mode 100755 index 227ff8e8431d..000000000000 --- a/cumulus/docker/scripts/healthcheck.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -set -e - -head () { - polkadot-js-api --ws ws://172.28.1.1:9944 query.parachains.heads 100 |\ - jq -r .heads -} - -start=$(head) -sleep 60 -end=$(head) - -[ "$start" != "$end" ] diff --git a/cumulus/docker/scripts/inject_bootnodes.sh b/cumulus/docker/scripts/inject_bootnodes.sh deleted file mode 100755 index 5b2dbae454e9..000000000000 --- a/cumulus/docker/scripts/inject_bootnodes.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -# this script runs the polkadot-parachain after fetching -# appropriate bootnode IDs -# -# this is _not_ a general-purpose script; it is closely tied to the -# root docker-compose.yml - -set -e -o pipefail - -ctpc="/usr/bin/polkadot-parachain" - -if [ ! -x "$ctpc" ]; then - echo "FATAL: $ctpc does not exist or is not executable" - exit 1 -fi - -# name the variable with the incoming args so it isn't overwritten later by function calls -args=( "$@" ) - -alice="172.28.1.1" -bob="172.28.1.2" -p2p_port="30333" -rpc_port="9933" - - -get_id () { - node="$1" - /wait-for-it.sh "$node:$rpc_port" -t 10 -s -- \ - curl -sS \ - -H 'Content-Type: application/json' \ - --data '{"id":1,"jsonrpc":"2.0","method":"system_networkState"}' \ - "$node:$rpc_port" |\ - jq -r '.result.peerId' -} - -bootnode () { - node="$1" - id=$(get_id "$node") - if [ -z "$id" ]; then - echo >&2 "failed to get id for $node" - exit 1 - fi - echo "/ip4/$node/tcp/$p2p_port/p2p/$id" -} - -args+=( "--" "--bootnodes=$(bootnode "$alice")" "--bootnodes=$(bootnode "$bob")" ) - -set -x -"$ctpc" "${args[@]}" diff --git a/cumulus/docker/scripts/register_para.sh b/cumulus/docker/scripts/register_para.sh deleted file mode 100755 index 44455f960a0f..000000000000 --- a/cumulus/docker/scripts/register_para.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env bash - -set -e -o pipefail - -sizeof () { - stat --printf="%s" "$1" -} - -wait_for_file () { - # Wait for a file to have a stable, non-zero size. - # Takes at least 0.2 seconds per run, but there's no upper bound if the - # file grows continuously. If the file doesn't exist, or stably has 0 size, - # this will take up to 10 seconds by default; this limit can be adjusted by - # the second input parameter. - path="$1" - limit="$2" - if [ -z "$limit" ]; then - limit=10 - fi - count=0 - while [ "$count" -lt "$limit" ]; do - if [ -s "$path" ]; then - echo "$path found after $count seconds" - # now ensure that the file size is stable: it's not still being written - oldsize=0 - size="$(sizeof "$path")" - while [ "$oldsize" -ne "$size" ]; do - sleep 0.2 - oldsize="$size" - size="$(sizeof "$path")" - done - return - fi - count=$((count+1)) - sleep 1 - done - echo "$path not found after $count seconds" - exit 1 -} - -wait_for_file /runtime/cumulus_test_parachain_runtime.compact.wasm -wait_for_file /genesis/genesis-state - -# this is now straightforward: just send the sudo'd tx to the alice node, -# as soon as the node is ready to receive connections -/wait-for-it.sh 172.28.1.1:9944 \ - --strict \ - --timeout=10 \ - -- \ - polkadot-js-api \ - --ws ws://172.28.1.1:9944 \ - --sudo \ - --seed "//Alice" \ - tx.registrar.registerPara \ - 100 \ - '{"scheduling":"Always"}' \ - @/runtime/cumulus_test_parachain_runtime.compact.wasm \ - "$(cat /genesis/genesis-state)" diff --git a/cumulus/docker/scripts/run_collator.sh b/cumulus/docker/scripts/run_collator.sh deleted file mode 100755 index 33e2fbbe1237..000000000000 --- a/cumulus/docker/scripts/run_collator.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(cd "$(dirname "$0")" && git rev-parse --show-toplevel)" -# shellcheck source=dc.sh -source docker/scripts/dc.sh - -dc build -dc up -d diff --git a/cumulus/docker/scripts/stop_collator.sh b/cumulus/docker/scripts/stop_collator.sh deleted file mode 100755 index f70a564c696f..000000000000 --- a/cumulus/docker/scripts/stop_collator.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(cd "$(dirname "$0")" && git rev-parse --show-toplevel)" -# shellcheck source=dc.sh -source docker/scripts/dc.sh - -dc down --volumes --remove-orphans diff --git a/cumulus/docker/test-parachain-collator.dockerfile b/cumulus/docker/test-parachain-collator.dockerfile deleted file mode 100644 index 9c2d8fbe5818..000000000000 --- a/cumulus/docker/test-parachain-collator.dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -# This file is sourced from https://github.com/paritytech/polkadot/blob/master/scripts/ci/dockerfiles/polkadot/polkadot_builder.Dockerfile -FROM docker.io/paritytech/ci-linux:production as builder - -WORKDIR /cumulus -COPY . /cumulus - -RUN cargo build --release --locked -p polkadot-parachain - -# the collator stage is normally built once, cached, and then ignored, but can -# be specified with the --target build flag. This adds some extra tooling to the -# image, which is required for a launcher script. The script simply adds two -# arguments to the list passed in: -# -# --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/PEER_ID -# -# with the appropriate ip and ID for both Alice and Bob -FROM debian:buster-slim as collator -RUN apt-get update && apt-get install jq curl bash -y && \ - curl -sSo /wait-for-it.sh https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh && \ - chmod +x /wait-for-it.sh && \ - curl -sL https://deb.nodesource.com/setup_12.x | bash - && \ - apt-get install -y nodejs && \ - npm install --global yarn && \ - yarn global add @polkadot/api-cli@0.10.0-beta.14 -COPY --from=builder \ - /paritytech/cumulus/target/release/polkadot-parachain /usr/bin -COPY ./docker/scripts/inject_bootnodes.sh /usr/bin -CMD ["/usr/bin/inject_bootnodes.sh"] -COPY ./docker/scripts/healthcheck.sh /usr/bin/ -HEALTHCHECK --interval=300s --timeout=75s --start-period=30s --retries=3 \ - CMD ["/usr/bin/healthcheck.sh"] - -# the runtime stage is normally built once, cached, and ignored, but can be -# specified with the --target build flag. This just preserves one of the builder's -# outputs, which can then be moved into a volume at runtime -FROM debian:buster-slim as runtime -COPY --from=builder \ - /paritytech/cumulus/target/release/wbuild/cumulus-test-parachain-runtime/cumulus_test_parachain_runtime.compact.wasm \ - /var/opt/ -CMD ["cp", "-v", "/var/opt/cumulus_test_parachain_runtime.compact.wasm", "/runtime/"] - -FROM debian:buster-slim -COPY --from=builder \ - /paritytech/cumulus/target/release/polkadot-parachain /usr/bin - -CMD ["/usr/bin/polkadot-parachain"] diff --git a/cumulus/docker/test-parachain_injected.Dockerfile b/cumulus/docker/test-parachain_injected.Dockerfile deleted file mode 100644 index 6056c504604e..000000000000 --- a/cumulus/docker/test-parachain_injected.Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM docker.io/library/ubuntu:20.04 - -# metadata -ARG VCS_REF -ARG BUILD_DATE -ARG IMAGE_NAME - -LABEL io.parity.image.authors="devops-team@parity.io" \ - io.parity.image.vendor="Parity Technologies" \ - io.parity.image.title="${IMAGE_NAME}" \ - io.parity.image.description="Test parachain for Zombienet" \ - io.parity.image.source="https://github.com/paritytech/cumulus/blob/${VCS_REF}/docker/test-parachain_injected.Dockerfile" \ - io.parity.image.revision="${VCS_REF}" \ - io.parity.image.created="${BUILD_DATE}" \ - io.parity.image.documentation="https://github.com/paritytech/cumulus/" - -# show backtraces -ENV RUST_BACKTRACE 1 - -# install tools and dependencies -RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - libssl1.1 \ - ca-certificates \ - curl && \ - # apt cleanup - apt-get autoremove -y && \ - apt-get clean && \ - find /var/lib/apt/lists/ -type f -not -name lock -delete; \ - # add user and link ~/.local/share/test-parachain to /data - useradd -m -u 10000 -U -s /bin/sh -d /test-parachain test-parachain && \ - mkdir -p /data /test-parachain/.local/share && \ - chown -R test-parachain:test-parachain /data && \ - ln -s /data /test-parachain/.local/share/test-parachain && \ - mkdir -p /specs - -# add test-parachain binary to the docker image -COPY ./artifacts/test-parachain /usr/local/bin -COPY ./parachains/chain-specs/*.json /specs/ - -USER test-parachain - -# check if executable works in this container -RUN /usr/local/bin/test-parachain --version - -EXPOSE 30333 9933 9944 -VOLUME ["/test-parachain"] - -ENTRYPOINT ["/usr/local/bin/test-parachain"] diff --git a/cumulus/docs/container.md b/cumulus/docs/container.md deleted file mode 100644 index 63575f37a59b..000000000000 --- a/cumulus/docs/container.md +++ /dev/null @@ -1,60 +0,0 @@ -## Using Containers - -Using containers via **Podman** or **Docker** brings benefit, whether it is to build a container image or -run a node while keeping a minimum footprint on your local system. - -This document mentions using `podman` or `docker`. Those are usually interchangeable and it is encouraged using preferably **Podman**. If you have podman installed and want to use all the commands mentioned below, you can simply create an alias with `alias docker=podman`. - -There are a few options to build a node within a container and inject a binary inside an image. - -### Parity built container image - -Parity builds and publishes a container image that can be found as `docker.io/parity/polkadot-parachain`. - -### Parity CI image - -Parity maintains and uses internally a generic "CI" image that can be used as a base to build binaries: [Parity CI container image](https://github.com/paritytech/scripts/tree/master/dockerfiles/ci-linux): - -The command below allows building a Linux binary without having to even install Rust or any dependency locally: - -```bash -docker run --rm -it \ - -w /shellhere/cumulus \ - -v $(pwd):/shellhere/cumulus \ - paritytech/ci-linux:production - cargo build --release --locked --bin polkadot-parachain -sudo chown -R $(id -u):$(id -g) target/ -``` - -If you want to reproduce other steps of CI process you can use the following -[guide](https://github.com/paritytech/scripts#gitlab-ci-for-building-docker-images). - -### Injected image - -Injecting a binary inside a base image is the quickest option to get a working container image. This only works if you were able to build a Linux binary, either locally, or using a container as described above. - -After building a Linux binary ()`polkadot-parachain`) with cargo or with Parity CI image as documented above, the following command allows producing a new container image where the compiled binary is injected: - -```bash -./docker/scripts/build-injected-image.sh -``` - -### Container build - -Alternatively, you can build an image with a builder pattern. This options takes a while but offers a simple method for anyone to get a working container image without requiring any of the Rust toolchain installed locally. - -```bash -docker build \ - --tag $OWNER/$IMAGE_NAME \ - --file ./docker/polkadot-parachain_builder.Containerfile . -``` - -You may then run your new container: - -```bash -docker run --rm -it \ - $OWNER/$IMAGE_NAME \ - --collator --tmp \ - --execution wasm \ - --chain /specs/westmint.json -``` diff --git a/cumulus/docs/documentation.md b/cumulus/docs/documentation.md deleted file mode 100644 index 383f7ff3c405..000000000000 --- a/cumulus/docs/documentation.md +++ /dev/null @@ -1 +0,0 @@ -Was moved [here](https://github.com/paritytech/labels/blob/main/docs/doc_cumulus.md) \ No newline at end of file diff --git a/cumulus/docs/overview.md b/cumulus/docs/overview.md deleted file mode 100644 index 402c56042c49..000000000000 --- a/cumulus/docs/overview.md +++ /dev/null @@ -1,101 +0,0 @@ -# Cumulus Overview - -This document provides high-level documentation for Cumulus. - -## Runtime - -Each Substrate blockchain provides a runtime. The runtime is the state transition function of the -blockchain. Cumulus provides interfaces and extensions to convert a Substrate FRAME runtime into a -Parachain runtime. Polkadot expects each runtime exposes an interface for validating a -Parachain's state transition and also provides interfaces for the Parachain to send and receive -messages of other Parachains. - -To convert a Substrate runtime into a Parachain runtime, the following code needs to be added to the -runtime: -```rust -cumulus_pallet_parachain_system::register_validate_block!(Block, Executive); -``` - -This macro call expects the `Block` and `Executive` type. It generates the `validate_block` function -that is expected by Polkadot to validate the state transition. - -When compiling a runtime that uses Cumulus, a WASM binary is generated that contains the *full* code -of the Parachain runtime plus the `validate_block` functionality. This binary is required to -register a Parachain on the relay chain. - -When the Parachain validator calls the `validate_block` function, it passes the PoVBlock (See [Block -building](#block-building) for more information) and the parent header of the Parachain that is -stored on the relay chain. From the PoVBlock witness data, Cumulus reconstructs the partial trie. -This partial trie is used as storage while executing the block. Cumulus also redirects all storage -related host functions to use the witness data storage. After the setup is done, Cumulus calls -`execute_block` with the transactions and the header stored in the PoVBlock. On success, the new -Parachain header is returned as part of the `validate_block` result. - -## Node - -Parachains support light-clients, full nodes, and authority nodes. Authority nodes are called -Collators in the Polkadot ecosystem. Cumulus provides the consensus implementation for a -Parachain and the block production logic. - -The Parachain consensus will follow the relay chain to get notified about which Parachain blocks are -included in the relay-chain and which are finalized. Each block that is built by a Collator is sent -to a validator that is assigned to the particular Parachain. Cumulus provides the block production -logic that notifies each Collator of the Parachain to build a Parachain block. The -notification is triggered on a relay-chain block import by the Collator. This means that every -Collator of the Parachain can send a block to the Parachain validators. For more sophisticated -authoring logic, the Parachain will be able to use Aura, BABE, etc. (Not supported at the moment) - -A Parachain Collator will join the Parachain network and the relay-chain network. The Parachain -network will be used to gossip Parachain blocks and to gossip transactions. Collators will only -gossip blocks to the Parachain network that have a high chance of being included in the relay -chain. To prove that a block is probably going to be included, the Collator will send along side -the notification the so-called candidate message. This candidate message is issued by a Parachain -validator after approving a block. This proof of possible inclusion prevents spamming other collators -of the network with useless blocks. -The Collator joins the relay-chain network for two reasons. First, the Collator uses it to send the -Parachain blocks to the Parachain validators. Secondly, the Collator participates as a full-node -of the relay chain to be informed of new relay-chain blocks. This information will be used for the -consensus and the block production logic. - -## Block Building - -Polkadot requires that a Parachain block is transmitted in a fixed format. These blocks sent by a -Parachain to the Parachain validators are called proof-of-validity blocks (PoVBlock). Such a -PoVBlock contains the header and the transactions of the Parachain as opaque blobs (`Vec`). They -are opaque, because Polkadot can not and should not support all kinds of possible Parachain block -formats. Besides the header and the transactions, it also contains the witness data and the outgoing -messages. - -A Parachain validator needs to validate a given PoVBlock, but without requiring the full state of -the Parachain. To still make it possible to validate the Parachain block, the PoVBlock contains the -witness data. The witness data is a proof that is collected while building the block. The proof will -contain all trie nodes that are read during the block production. Cumulus uses the witness data to -reconstruct a partial trie and uses this a storage when executing the block. - -The outgoing messages are also collected at block production. These are messages from the Parachain -the block is built for to other Parachains or to the relay chain itself. - -## Runtime Upgrade - -Every Substrate blockchain supports runtime upgrades. Runtime upgrades enable a blockchain to update -its state transition function without requiring any client update. Such a runtime upgrade is applied -by a special transaction in a Substrate runtime. Polkadot and Cumulus provide support for these -runtime upgrades, but updating a Parachain runtime is not as easy as updating a standalone -blockchain runtime. In a standalone blockchain, the special transaction needs to be included in a -block and the runtime is updated. - -A Parachain will follow the same paradigm, but the relay chain needs to be informed before -the update. Cumulus will provide functionality to notify the relay chain about the runtime update. The -update will not be enacted directly; instead it takes `X` relay blocks (a value that is configured -by the relay chain) before the relay chain allows the update to be applied. The first Parachain -block that will be included after `X` relay chain blocks needs to apply the upgrade. -If the update is applied before the waiting period is finished, the relay chain will reject the -Parachain block for inclusion. The Cumulus runtime pallet will provide the functionality to -register the runtime upgrade and will also make sure that the update is applied at the correct block. - -After updating the Parachain runtime, a Parachain needs to wait a certain amount of time `Y` -(configured by the relay chain) before another update can be applied. - -The WASM blob update not only contains the Parachain runtime, but also the `validate_block` -function provided by Cumulus. So, updating a Parachain runtime on the relay chain involves a -complete update of the validation WASM blob. diff --git a/cumulus/docs/release.md b/cumulus/docs/release.md deleted file mode 100644 index b04c4e844c4e..000000000000 --- a/cumulus/docs/release.md +++ /dev/null @@ -1,130 +0,0 @@ -# Releases - -## Versioning - -### Example #1 - -``` -| Polkadot | v 0. 9.22 | -| Client | v 0. 9.22 0 | -| Runtime | v 9 22 0 | => 9220 -| semver | 0. 9.22 0 | -``` - -### Example #2 - -``` -| Polkadot | v 0.10.42 | -| Client | v 0.10.42 0 | -| Runtime | v 10.42 0 | => 10420 -| semver | 0.10.42 0 | -``` - -### Example #3 - -``` -| Polkadot | v 1. 2.18 | -| Client | v 1. 2.18 0 | -| Runtime | v 1 2 18 0 | => 102180 -| semver | 1. 2.18 0 | -``` - - -This document contains information related to the releasing process and describes a few of the steps and checks that are -performed during the release process. - -## Client - -### Burn In - -Ensure that Parity DevOps has run the new release on Westend and Kusama Asset Hub collators for 12h -prior to publishing the release. - -### Build Artifacts - -Add any necessary assets to the release. They should include: - -- Linux binaries - - GPG signature - - SHA256 checksum -- WASM binaries of the runtimes -- Source code - - -## Runtimes - -### Spec Version - -A new runtime release must bump the `spec_version`. This may follow a pattern with the client release (e.g. runtime -v9220 corresponds to v0.9.22). - -### Runtime version bump between RCs - -The clients need to be aware of runtime changes. However, we do not want to bump the `spec_version` for every single -release candidate. Instead, we can bump the `impl` field of the version to signal the change to the client. This applies -only to runtimes that have been deployed. - -### Old Migrations Removed - -Previous `on_runtime_upgrade` functions from old upgrades should be removed. - -### New Migrations - -Ensure that any migrations that are required due to storage or logic changes are included in the `on_runtime_upgrade` -function of the appropriate pallets. - -### Extrinsic Ordering & Storage - -Offline signing libraries depend on a consistent ordering of call indices and -functions. Compare the metadata of the current and new runtimes and ensure that -the `module index, call index` tuples map to the same set of functions. It also checks if there have been any changes in `storage`. In case of a breaking change, increase `transaction_version`. - -To verify the order has not changed, manually start the following [Github Action](https://github.com/paritytech/cumulus/actions/workflows/extrinsic-ordering-check-from-bin.yml). It takes around a minute to run and will produce the report as artifact you need to manually check. - -To run it, in the _Run Workflow_ dropdown: -1. **Use workflow from**: to ignore, leave `master` as default -2. **The WebSocket url of the reference node**: - - Asset Hub Polkadot: `wss://statemint-rpc.polkadot.io` - - Asset Hub Kusama: `wss://statemine-rpc.polkadot.io` - - Asset Hub Westend: `wss://westmint-rpc.polkadot.io` -3. **A url to a Linux binary for the node containing the runtime to test**: Paste the URL of the latest release-candidate binary from the draft-release on Github. The binary has to previously be uploaded to S3 (Github url link to the binary is constantly changing) - - E.g: https://releases.parity.io/cumulus/v0.9.270-rc3/polkadot-parachain -4. **The name of the chain under test. Usually, you would pass a local chain**: - - Asset Hub Polkadot: `asset-hub-polkadot-local` - - Asset Hub Kusama: `asset-hub-kusama-local` - - Asset Hub Westend: `asset-hub-westend-local` -5. Click **Run workflow** - -When the workflow is done, click on it and download the zip artifact, inside you'll find an `output.txt` file. The things to look for in the output are lines like: - -- `[Identity] idx 28 -> 25 (calls 15)` - indicates the index for Identity has changed -- `[+] Society, Recovery` - indicates the new version includes 2 additional modules/pallets. -- If no indices have changed, every modules line should look something like `[Identity] idx 25 (calls 15)` - -**Note**: Adding new functions to the runtime does not constitute a breaking change -as long as the indexes did not change. - -**Note**: Extrinsic function signatures changes (adding/removing & ordering arguments) are not caught by the job, so those changes should be reviewed "manually" - -### Benchmarks - -The Benchmarks can now be started from the CI. First find the CI pipeline from [here](https://gitlab.parity.io/parity/mirrors/cumulus/-/pipelines?page=1&scope=all&ref=release-parachains-v9220) and pick the latest. -[Guide](https://github.com/paritytech/ci_cd/wiki/Benchmarks:-cumulus) - -### Integration Tests - -Until https://github.com/paritytech/ci_cd/issues/499 is done, tests will have to be run manually. -1. Go to https://github.com/paritytech/parachains-integration-tests and check out the release branch. -E.g. https://github.com/paritytech/parachains-integration-tests/tree/release-v9270-v0.9.27 -for `release-parachains-v0.9.270` -2. Clone `release-parachains-` branch from Cumulus -3. `cargo build --release` -4. Copy `./target/polkadot-parachain` to `./bin` -5. Clone `it/release--fast-sudo` from Polkadot -In case the branch does not exists (it is a manual process): cherry pick paritytech/polkadot@791c8b8 and run -`find . -type f -name "*.toml" -print0 | xargs -0 sed -i '' -e 's/polkadot-vX.X.X/polkadot-v/g'` -6. `cargo build --release --features fast-runtime` -7. Copy `./target/polkadot` into `./bin` (in Cumulus) -8. Run the tests: - - Asset Hub Polkadot: `yarn zombienet-test -c ./examples/statemint/config.toml -t ./examples/statemint` - - Asset Hub Kusama: `yarn zombienet-test -c ./examples/statemine/config.toml -t ./examples/statemine` diff --git a/cumulus/file_header.txt b/cumulus/file_header.txt deleted file mode 100644 index 04f0c5de2716..000000000000 --- a/cumulus/file_header.txt +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . diff --git a/cumulus/pallets/aura-ext/Cargo.toml b/cumulus/pallets/aura-ext/Cargo.toml deleted file mode 100644 index a3c0a5bb6b8d..000000000000 --- a/cumulus/pallets/aura-ext/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "cumulus-pallet-aura-ext" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "AURA consensus extension pallet for parachains" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-application-crypto = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -[dev-dependencies] - -# Cumulus -cumulus-pallet-parachain-system = { path = "../parachain-system" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "frame-support/std", - "frame-system/std", - "pallet-aura/std", - "sp-application-crypto/std", - "sp-consensus-aura/std", - "sp-runtime/std", - "sp-std/std", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/cumulus/pallets/aura-ext/src/lib.rs b/cumulus/pallets/aura-ext/src/lib.rs deleted file mode 100644 index 4ca091059567..000000000000 --- a/cumulus/pallets/aura-ext/src/lib.rs +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus extension pallet for AuRa -//! -//! This pallets extends the Substrate AuRa pallet to make it compatible with parachains. It -//! provides the [`Pallet`], the [`Config`] and the [`GenesisConfig`]. -//! -//! It is also required that the parachain runtime uses the provided [`BlockExecutor`] to properly -//! check the constructed block on the relay chain. -//! -//! ``` -//! # struct Runtime; -//! # struct Executive; -//! # struct CheckInherents; -//! cumulus_pallet_parachain_system::register_validate_block! { -//! Runtime = Runtime, -//! BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, -//! CheckInherents = CheckInherents, -//! } -//! ``` - -#![cfg_attr(not(feature = "std"), no_std)] - -use frame_support::traits::{ExecuteBlock, FindAuthor}; -use sp_application_crypto::RuntimeAppPublic; -use sp_consensus_aura::digests::CompatibleDigestItem; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - -type Aura = pallet_aura::Pallet; - -pub use pallet::*; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - /// The configuration trait. - #[pallet::config] - pub trait Config: pallet_aura::Config + frame_system::Config {} - - #[pallet::pallet] - pub struct Pallet(_); - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_finalize(_: BlockNumberFor) { - // Update to the latest AuRa authorities. - Authorities::::put(Aura::::authorities()); - } - - fn on_initialize(_: BlockNumberFor) -> Weight { - // Fetch the authorities once to get them into the storage proof of the PoV. - Authorities::::get(); - - T::DbWeight::get().reads_writes(2, 1) - } - } - - /// Serves as cache for the authorities. - /// - /// The authorities in AuRa are overwritten in `on_initialize` when we switch to a new session, - /// but we require the old authorities to verify the seal when validating a PoV. This will - /// always be updated to the latest AuRa authorities in `on_finalize`. - #[pallet::storage] - pub(crate) type Authorities = StorageValue< - _, - BoundedVec::MaxAuthorities>, - ValueQuery, - >; - - #[pallet::genesis_config] - #[derive(frame_support::DefaultNoBound)] - pub struct GenesisConfig { - #[serde(skip)] - pub _config: sp_std::marker::PhantomData, - } - - #[pallet::genesis_build] - impl BuildGenesisConfig for GenesisConfig { - fn build(&self) { - let authorities = Aura::::authorities(); - - assert!( - !authorities.is_empty(), - "AuRa authorities empty, maybe wrong order in `construct_runtime!`?", - ); - - Authorities::::put(authorities); - } - } -} - -/// The block executor used when validating a PoV at the relay chain. -/// -/// When executing the block it will verify the block seal to ensure that the correct author created -/// the block. -pub struct BlockExecutor(sp_std::marker::PhantomData<(T, I)>); - -impl ExecuteBlock for BlockExecutor -where - Block: BlockT, - T: Config, - I: ExecuteBlock, -{ - fn execute_block(block: Block) { - let (mut header, extrinsics) = block.deconstruct(); - // We need to fetch the authorities before we execute the block, to get the authorities - // before any potential update. - let authorities = Authorities::::get(); - - let mut seal = None; - header.digest_mut().logs.retain(|s| { - let s = - CompatibleDigestItem::<::Signature>::as_aura_seal(s); - match (s, seal.is_some()) { - (Some(_), true) => panic!("Found multiple AuRa seal digests"), - (None, _) => true, - (Some(s), false) => { - seal = Some(s); - false - }, - } - }); - - let seal = seal.expect("Could not find an AuRa seal digest!"); - - let author = Aura::::find_author( - header.digest().logs().iter().filter_map(|d| d.as_pre_runtime()), - ) - .expect("Could not find AuRa author index!"); - - let pre_hash = header.hash(); - - if !authorities - .get(author as usize) - .unwrap_or_else(|| { - panic!("Invalid AuRa author index {} for authorities: {:?}", author, authorities) - }) - .verify(&pre_hash, &seal) - { - panic!("Invalid AuRa seal"); - } - - I::execute_block(Block::new(header, extrinsics)); - } -} diff --git a/cumulus/pallets/collator-selection/Cargo.toml b/cumulus/pallets/collator-selection/Cargo.toml deleted file mode 100644 index b7d5c524f8f5..000000000000 --- a/cumulus/pallets/collator-selection/Cargo.toml +++ /dev/null @@ -1,63 +0,0 @@ -[package] -authors = ["Parity Technologies "] -description = "Simple pallet to select collators for a parachain." -edition = "2021" -homepage = "https://substrate.io" -license = "Apache-2.0" -name = "pallet-collator-selection" -readme = "README.md" -repository = "https://github.com/paritytech/cumulus/" -version = "3.0.0" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -log = { version = "0.4.20", default-features = false } -codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } -rand = { version = "0.8.5", features = ["std_rng"], default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-staking = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-authorship = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-session = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "master" } - -[dev-dependencies] -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "rand/std", - "sp-runtime/std", - "sp-staking/std", - "sp-std/std", - "frame-support/std", - "frame-system/std", - "frame-benchmarking/std", - "pallet-authorship/std", - "pallet-session/std", -] - -try-runtime = [ "frame-support/try-runtime" ] diff --git a/cumulus/pallets/collator-selection/README.md b/cumulus/pallets/collator-selection/README.md deleted file mode 100644 index 9718db58b37e..000000000000 --- a/cumulus/pallets/collator-selection/README.md +++ /dev/null @@ -1 +0,0 @@ -License: Apache-2.0 \ No newline at end of file diff --git a/cumulus/pallets/collator-selection/src/benchmarking.rs b/cumulus/pallets/collator-selection/src/benchmarking.rs deleted file mode 100644 index 5fc92f8a783f..000000000000 --- a/cumulus/pallets/collator-selection/src/benchmarking.rs +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Benchmarking setup for pallet-collator-selection - -#![cfg(feature = "runtime-benchmarks")] - -use super::*; - -#[allow(unused)] -use crate::Pallet as CollatorSelection; -use frame_benchmarking::{ - account, impl_benchmark_test_suite, v2::*, whitelisted_caller, BenchmarkError, -}; -use frame_support::{ - codec::Decode, - dispatch::DispatchResult, - traits::{Currency, EnsureOrigin, Get, ReservableCurrency}, -}; -use frame_system::{pallet_prelude::BlockNumberFor, EventRecord, RawOrigin}; -use pallet_authorship::EventHandler; -use pallet_session::{self as session, SessionManager}; -use sp_std::prelude::*; - -pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - -const SEED: u32 = 0; - -fn assert_last_event(generic_event: ::RuntimeEvent) { - let events = frame_system::Pallet::::events(); - let system_event: ::RuntimeEvent = generic_event.into(); - // compare to the last event record - let EventRecord { event, .. } = &events[events.len() - 1]; - assert_eq!(event, &system_event); -} - -fn create_funded_user( - string: &'static str, - n: u32, - balance_factor: u32, -) -> T::AccountId { - let user = account(string, n, SEED); - let balance = T::Currency::minimum_balance() * balance_factor.into(); - let _ = T::Currency::make_free_balance_be(&user, balance); - user -} - -fn keys(c: u32) -> ::Keys { - use rand::{RngCore, SeedableRng}; - - let keys = { - let mut keys = [0u8; 128]; - - if c > 0 { - let mut rng = rand::rngs::StdRng::seed_from_u64(c as u64); - rng.fill_bytes(&mut keys); - } - - keys - }; - - Decode::decode(&mut &keys[..]).unwrap() -} - -fn validator(c: u32) -> (T::AccountId, ::Keys) { - (create_funded_user::("candidate", c, 1000), keys::(c)) -} - -fn register_validators(count: u32) -> Vec { - let validators = (0..count).map(|c| validator::(c)).collect::>(); - - for (who, keys) in validators.clone() { - >::set_keys(RawOrigin::Signed(who).into(), keys, Vec::new()).unwrap(); - } - - validators.into_iter().map(|(who, _)| who).collect() -} - -fn register_candidates(count: u32) { - let candidates = (0..count).map(|c| account("candidate", c, SEED)).collect::>(); - assert!(>::get() > 0u32.into(), "Bond cannot be zero!"); - - for who in candidates { - T::Currency::make_free_balance_be(&who, >::get() * 2u32.into()); - >::register_as_candidate(RawOrigin::Signed(who).into()).unwrap(); - } -} - -fn min_candidates() -> u32 { - let min_collators = T::MinEligibleCollators::get(); - let invulnerable_length = >::get().len(); - min_collators.saturating_sub(invulnerable_length.try_into().unwrap()) -} - -fn min_invulnerables() -> u32 { - let min_collators = T::MinEligibleCollators::get(); - let candidates_length = >::get().len(); - min_collators.saturating_sub(candidates_length.try_into().unwrap()) -} - -#[benchmarks(where T: pallet_authorship::Config + session::Config)] -mod benchmarks { - use super::*; - - #[benchmark] - fn set_invulnerables( - b: Linear<1, { T::MaxInvulnerables::get() }>, - ) -> Result<(), BenchmarkError> { - let origin = - T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - - let new_invulnerables = register_validators::(b); - let mut sorted_new_invulnerables = new_invulnerables.clone(); - sorted_new_invulnerables.sort(); - - #[extrinsic_call] - _(origin as T::RuntimeOrigin, new_invulnerables.clone()); - - // assert that it comes out sorted - assert_last_event::( - Event::NewInvulnerables { invulnerables: sorted_new_invulnerables }.into(), - ); - Ok(()) - } - - #[benchmark] - fn add_invulnerable( - b: Linear<1, { T::MaxInvulnerables::get() - 1 }>, - c: Linear<1, { T::MaxCandidates::get() - 1 }>, - ) -> Result<(), BenchmarkError> { - let origin = - T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - - // need to fill up candidates - >::put(T::Currency::minimum_balance()); - >::put(c); - // get accounts and keys for the `c` candidates - let mut candidates = (0..c).map(|cc| validator::(cc)).collect::>(); - // add one more to the list. should not be in `b` (invulnerables) because it's the account - // we will _add_ to invulnerables. we want it to be in `candidates` because we need the - // weight associated with removing it. - let (new_invulnerable, new_invulnerable_keys) = validator::(b.max(c) + 1); - candidates.push((new_invulnerable.clone(), new_invulnerable_keys)); - // set their keys ... - for (who, keys) in candidates.clone() { - >::set_keys(RawOrigin::Signed(who).into(), keys, Vec::new()) - .unwrap(); - } - // ... and register them. - for (who, _) in candidates { - let deposit = >::get(); - T::Currency::make_free_balance_be(&who, deposit * 1000_u32.into()); - let incoming = CandidateInfo { who: who.clone(), deposit }; - >::try_mutate(|candidates| -> DispatchResult { - if !candidates.iter().any(|candidate| candidate.who == who) { - T::Currency::reserve(&who, deposit)?; - candidates.try_push(incoming).expect("we've respected the bounded vec limit"); - >::insert( - who.clone(), - frame_system::Pallet::::block_number() + T::KickThreshold::get(), - ); - } - Ok(()) - }) - .expect("only returns ok"); - } - - // now we need to fill up invulnerables - let mut invulnerables = register_validators::(b); - invulnerables.sort(); - let invulnerables: frame_support::BoundedVec<_, T::MaxInvulnerables> = - frame_support::BoundedVec::try_from(invulnerables).unwrap(); - >::put(invulnerables); - - #[extrinsic_call] - _(origin as T::RuntimeOrigin, new_invulnerable.clone()); - - assert_last_event::(Event::InvulnerableAdded { account_id: new_invulnerable }.into()); - Ok(()) - } - - #[benchmark] - fn remove_invulnerable( - b: Linear<{ min_invulnerables::() + 1 }, { T::MaxInvulnerables::get() }>, - ) -> Result<(), BenchmarkError> { - let origin = - T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let mut invulnerables = register_validators::(b); - invulnerables.sort(); - let invulnerables: frame_support::BoundedVec<_, T::MaxInvulnerables> = - frame_support::BoundedVec::try_from(invulnerables).unwrap(); - >::put(invulnerables); - let to_remove = >::get().first().unwrap().clone(); - - #[extrinsic_call] - _(origin as T::RuntimeOrigin, to_remove.clone()); - - assert_last_event::(Event::InvulnerableRemoved { account_id: to_remove }.into()); - Ok(()) - } - - #[benchmark] - fn set_desired_candidates() -> Result<(), BenchmarkError> { - let max: u32 = T::MaxCandidates::get(); - let origin = - T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - - #[extrinsic_call] - _(origin as T::RuntimeOrigin, max); - - assert_last_event::(Event::NewDesiredCandidates { desired_candidates: max }.into()); - Ok(()) - } - - #[benchmark] - fn set_candidacy_bond() -> Result<(), BenchmarkError> { - let bond_amount: BalanceOf = T::Currency::minimum_balance() * 10u32.into(); - let origin = - T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - - #[extrinsic_call] - _(origin as T::RuntimeOrigin, bond_amount); - - assert_last_event::(Event::NewCandidacyBond { bond_amount }.into()); - Ok(()) - } - - // worse case is when we have all the max-candidate slots filled except one, and we fill that - // one. - #[benchmark] - fn register_as_candidate(c: Linear<1, { T::MaxCandidates::get() - 1 }>) { - >::put(T::Currency::minimum_balance()); - >::put(c + 1); - - register_validators::(c); - register_candidates::(c); - - let caller: T::AccountId = whitelisted_caller(); - let bond: BalanceOf = T::Currency::minimum_balance() * 2u32.into(); - T::Currency::make_free_balance_be(&caller, bond); - - >::set_keys( - RawOrigin::Signed(caller.clone()).into(), - keys::(c + 1), - Vec::new(), - ) - .unwrap(); - - #[extrinsic_call] - _(RawOrigin::Signed(caller.clone())); - - assert_last_event::( - Event::CandidateAdded { account_id: caller, deposit: bond / 2u32.into() }.into(), - ); - } - - // worse case is the last candidate leaving. - #[benchmark] - fn leave_intent(c: Linear<{ min_candidates::() + 1 }, { T::MaxCandidates::get() }>) { - >::put(T::Currency::minimum_balance()); - >::put(c); - - register_validators::(c); - register_candidates::(c); - - let leaving = >::get().last().unwrap().who.clone(); - v2::whitelist!(leaving); - - #[extrinsic_call] - _(RawOrigin::Signed(leaving.clone())); - - assert_last_event::(Event::CandidateRemoved { account_id: leaving }.into()); - } - - // worse case is paying a non-existing candidate account. - #[benchmark] - fn note_author() { - >::put(T::Currency::minimum_balance()); - T::Currency::make_free_balance_be( - &>::account_id(), - T::Currency::minimum_balance() * 4u32.into(), - ); - let author = account("author", 0, SEED); - let new_block: BlockNumberFor = 10u32.into(); - - frame_system::Pallet::::set_block_number(new_block); - assert!(T::Currency::free_balance(&author) == 0u32.into()); - - #[block] - { - as EventHandler<_, _>>::note_author(author.clone()) - } - - assert!(T::Currency::free_balance(&author) > 0u32.into()); - assert_eq!(frame_system::Pallet::::block_number(), new_block); - } - - // worst case for new session. - #[benchmark] - fn new_session( - r: Linear<1, { T::MaxCandidates::get() }>, - c: Linear<1, { T::MaxCandidates::get() }>, - ) { - >::put(T::Currency::minimum_balance()); - >::put(c); - frame_system::Pallet::::set_block_number(0u32.into()); - - register_validators::(c); - register_candidates::(c); - - let new_block: BlockNumberFor = 1800u32.into(); - let zero_block: BlockNumberFor = 0u32.into(); - let candidates = >::get(); - - let non_removals = c.saturating_sub(r); - - for i in 0..c { - >::insert(candidates[i as usize].who.clone(), zero_block); - } - - if non_removals > 0 { - for i in 0..non_removals { - >::insert(candidates[i as usize].who.clone(), new_block); - } - } else { - for i in 0..c { - >::insert(candidates[i as usize].who.clone(), new_block); - } - } - - let min_candidates = min_candidates::(); - let pre_length = >::get().len(); - - frame_system::Pallet::::set_block_number(new_block); - - assert!(>::get().len() == c as usize); - - #[block] - { - as SessionManager<_>>::new_session(0); - } - - if c > r && non_removals >= min_candidates { - // candidates > removals and remaining candidates > min candidates - // => remaining candidates should be shorter than before removal, i.e. some were - // actually removed. - assert!(>::get().len() < pre_length); - } else if c > r && non_removals < min_candidates { - // candidates > removals and remaining candidates would be less than min candidates - // => remaining candidates should equal min candidates, i.e. some were removed up to - // the minimum, but then any more were "forced" to stay in candidates. - assert!(>::get().len() == min_candidates as usize); - } else { - // removals >= candidates, non removals must == 0 - // can't remove more than exist - assert!(>::get().len() == pre_length); - } - } - - impl_benchmark_test_suite!(CollatorSelection, crate::mock::new_test_ext(), crate::mock::Test,); -} diff --git a/cumulus/pallets/collator-selection/src/lib.rs b/cumulus/pallets/collator-selection/src/lib.rs deleted file mode 100644 index 539a4d8bd957..000000000000 --- a/cumulus/pallets/collator-selection/src/lib.rs +++ /dev/null @@ -1,700 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Collator Selection pallet. -//! -//! A pallet to manage collators in a parachain. -//! -//! ## Overview -//! -//! The Collator Selection pallet manages the collators of a parachain. **Collation is _not_ a -//! secure activity** and this pallet does not implement any game-theoretic mechanisms to meet BFT -//! safety assumptions of the chosen set. -//! -//! ## Terminology -//! -//! - Collator: A parachain block producer. -//! - Bond: An amount of `Balance` _reserved_ for candidate registration. -//! - Invulnerable: An account guaranteed to be in the collator set. -//! -//! ## Implementation -//! -//! The final `Collators` are aggregated from two individual lists: -//! -//! 1. [`Invulnerables`]: a set of collators appointed by governance. These accounts will always be -//! collators. -//! 2. [`Candidates`]: these are *candidates to the collation task* and may or may not be elected as -//! a final collator. -//! -//! The current implementation resolves congestion of [`Candidates`] in a first-come-first-serve -//! manner. -//! -//! Candidates will not be allowed to get kicked or `leave_intent` if the total number of collators -//! would fall below `MinEligibleCollators`. This is to ensure that some collators will always -//! exist, i.e. someone is eligible to produce a block. -//! -//! ### Rewards -//! -//! The Collator Selection pallet maintains an on-chain account (the "Pot"). In each block, the -//! collator who authored it receives: -//! -//! - Half the value of the Pot. -//! - Half the value of the transaction fees within the block. The other half of the transaction -//! fees are deposited into the Pot. -//! -//! To initiate rewards, an ED needs to be transferred to the pot address. -//! -//! Note: Eventually the Pot distribution may be modified as discussed in -//! [this issue](https://github.com/paritytech/statemint/issues/21#issuecomment-810481073). - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use pallet::*; - -#[cfg(test)] -mod mock; - -#[cfg(test)] -mod tests; - -#[cfg(feature = "runtime-benchmarks")] -mod benchmarking; -pub mod migration; -pub mod weights; - -const LOG_TARGET: &str = "runtime::collator-selection"; - -#[frame_support::pallet] -pub mod pallet { - pub use crate::weights::WeightInfo; - use core::ops::Div; - use frame_support::{ - dispatch::{DispatchClass, DispatchResultWithPostInfo}, - pallet_prelude::*, - sp_runtime::{ - traits::{AccountIdConversion, CheckedSub, Saturating, Zero}, - RuntimeDebug, - }, - traits::{ - Currency, EnsureOrigin, ExistenceRequirement::KeepAlive, ReservableCurrency, - ValidatorRegistration, - }, - BoundedVec, DefaultNoBound, PalletId, - }; - use frame_system::{pallet_prelude::*, Config as SystemConfig}; - use pallet_session::SessionManager; - use sp_runtime::traits::Convert; - use sp_staking::SessionIndex; - use sp_std::vec::Vec; - - /// The current storage version. - const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); - - type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - - /// A convertor from collators id. Since this pallet does not have stash/controller, this is - /// just identity. - pub struct IdentityCollator; - impl sp_runtime::traits::Convert> for IdentityCollator { - fn convert(t: T) -> Option { - Some(t) - } - } - - /// Configure the pallet by specifying the parameters and types on which it depends. - #[pallet::config] - pub trait Config: frame_system::Config { - /// Overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// The currency mechanism. - type Currency: ReservableCurrency; - - /// Origin that can dictate updating parameters of this pallet. - type UpdateOrigin: EnsureOrigin; - - /// Account Identifier from which the internal Pot is generated. - type PotId: Get; - - /// Maximum number of candidates that we should have. - /// - /// This does not take into account the invulnerables. - type MaxCandidates: Get; - - /// Minimum number eligible collators. Should always be greater than zero. This includes - /// Invulnerable collators. This ensures that there will always be one collator who can - /// produce a block. - type MinEligibleCollators: Get; - - /// Maximum number of invulnerables. - type MaxInvulnerables: Get; - - // Will be kicked if block is not produced in threshold. - type KickThreshold: Get>; - - /// A stable ID for a validator. - type ValidatorId: Member + Parameter; - - /// A conversion from account ID to validator ID. - /// - /// Its cost must be at most one storage read. - type ValidatorIdOf: Convert>; - - /// Validate a user is registered - type ValidatorRegistration: ValidatorRegistration; - - /// The weight information of this pallet. - type WeightInfo: WeightInfo; - } - - /// Basic information about a collation candidate. - #[derive( - PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, scale_info::TypeInfo, MaxEncodedLen, - )] - pub struct CandidateInfo { - /// Account identifier. - pub who: AccountId, - /// Reserved deposit. - pub deposit: Balance, - } - - #[pallet::pallet] - #[pallet::storage_version(STORAGE_VERSION)] - pub struct Pallet(_); - - /// The invulnerable, permissioned collators. This list must be sorted. - #[pallet::storage] - #[pallet::getter(fn invulnerables)] - pub type Invulnerables = - StorageValue<_, BoundedVec, ValueQuery>; - - /// The (community, limited) collation candidates. `Candidates` and `Invulnerables` should be - /// mutually exclusive. - #[pallet::storage] - #[pallet::getter(fn candidates)] - pub type Candidates = StorageValue< - _, - BoundedVec>, T::MaxCandidates>, - ValueQuery, - >; - - /// Last block authored by collator. - #[pallet::storage] - #[pallet::getter(fn last_authored_block)] - pub type LastAuthoredBlock = - StorageMap<_, Twox64Concat, T::AccountId, BlockNumberFor, ValueQuery>; - - /// Desired number of candidates. - /// - /// This should ideally always be less than [`Config::MaxCandidates`] for weights to be correct. - #[pallet::storage] - #[pallet::getter(fn desired_candidates)] - pub type DesiredCandidates = StorageValue<_, u32, ValueQuery>; - - /// Fixed amount to deposit to become a collator. - /// - /// When a collator calls `leave_intent` they immediately receive the deposit back. - #[pallet::storage] - #[pallet::getter(fn candidacy_bond)] - pub type CandidacyBond = StorageValue<_, BalanceOf, ValueQuery>; - - #[pallet::genesis_config] - #[derive(DefaultNoBound)] - pub struct GenesisConfig { - pub invulnerables: Vec, - pub candidacy_bond: BalanceOf, - pub desired_candidates: u32, - } - - #[pallet::genesis_build] - impl BuildGenesisConfig for GenesisConfig { - fn build(&self) { - let duplicate_invulnerables = self - .invulnerables - .iter() - .collect::>(); - assert!( - duplicate_invulnerables.len() == self.invulnerables.len(), - "duplicate invulnerables in genesis." - ); - - let mut bounded_invulnerables = - BoundedVec::<_, T::MaxInvulnerables>::try_from(self.invulnerables.clone()) - .expect("genesis invulnerables are more than T::MaxInvulnerables"); - assert!( - T::MaxCandidates::get() >= self.desired_candidates, - "genesis desired_candidates are more than T::MaxCandidates", - ); - - bounded_invulnerables.sort(); - - >::put(self.desired_candidates); - >::put(self.candidacy_bond); - >::put(bounded_invulnerables); - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// New Invulnerables were set. - NewInvulnerables { invulnerables: Vec }, - /// A new Invulnerable was added. - InvulnerableAdded { account_id: T::AccountId }, - /// An Invulnerable was removed. - InvulnerableRemoved { account_id: T::AccountId }, - /// The number of desired candidates was set. - NewDesiredCandidates { desired_candidates: u32 }, - /// The candidacy bond was set. - NewCandidacyBond { bond_amount: BalanceOf }, - /// A new candidate joined. - CandidateAdded { account_id: T::AccountId, deposit: BalanceOf }, - /// A candidate was removed. - CandidateRemoved { account_id: T::AccountId }, - /// An account was unable to be added to the Invulnerables because they did not have keys - /// registered. Other Invulnerables may have been set. - InvalidInvulnerableSkipped { account_id: T::AccountId }, - } - - #[pallet::error] - pub enum Error { - /// The pallet has too many candidates. - TooManyCandidates, - /// Leaving would result in too few candidates. - TooFewEligibleCollators, - /// Account is already a candidate. - AlreadyCandidate, - /// Account is not a candidate. - NotCandidate, - /// There are too many Invulnerables. - TooManyInvulnerables, - /// Account is already an Invulnerable. - AlreadyInvulnerable, - /// Account is not an Invulnerable. - NotInvulnerable, - /// Account has no associated validator ID. - NoAssociatedValidatorId, - /// Validator ID is not yet registered. - ValidatorNotRegistered, - } - - #[pallet::hooks] - impl Hooks> for Pallet { - fn integrity_test() { - assert!(T::MinEligibleCollators::get() > 0, "chain must require at least one collator"); - } - } - - #[pallet::call] - impl Pallet { - /// Set the list of invulnerable (fixed) collators. These collators must do some - /// preparation, namely to have registered session keys. - /// - /// The call will remove any accounts that have not registered keys from the set. That is, - /// it is non-atomic; the caller accepts all `AccountId`s passed in `new` _individually_ as - /// acceptable Invulnerables, and is not proposing a _set_ of new Invulnerables. - /// - /// This call does not maintain mutual exclusivity of `Invulnerables` and `Candidates`. It - /// is recommended to use a batch of `add_invulnerable` and `remove_invulnerable` instead. - /// A `batch_all` can also be used to enforce atomicity. If any candidates are included in - /// `new`, they should be removed with `remove_invulnerable_candidate` after execution. - /// - /// Must be called by the `UpdateOrigin`. - #[pallet::call_index(0)] - #[pallet::weight(T::WeightInfo::set_invulnerables(new.len() as u32))] - pub fn set_invulnerables(origin: OriginFor, new: Vec) -> DispatchResult { - T::UpdateOrigin::ensure_origin(origin)?; - - // don't wipe out the collator set - if new.is_empty() { - ensure!( - Candidates::::decode_len().unwrap_or_default() >= - T::MinEligibleCollators::get() as usize, - Error::::TooFewEligibleCollators - ); - } - - // Will need to check the length again when putting into a bounded vec, but this - // prevents the iterator from having too many elements. - ensure!( - new.len() as u32 <= T::MaxInvulnerables::get(), - Error::::TooManyInvulnerables - ); - - let mut new_with_keys = Vec::new(); - - // check if the invulnerables have associated validator keys before they are set - for account_id in &new { - // don't let one unprepared collator ruin things for everyone. - let validator_key = T::ValidatorIdOf::convert(account_id.clone()); - match validator_key { - Some(key) => { - // key is not registered - if !T::ValidatorRegistration::is_registered(&key) { - Self::deposit_event(Event::InvalidInvulnerableSkipped { - account_id: account_id.clone(), - }); - continue - } - // else condition passes; key is registered - }, - // key does not exist - None => { - Self::deposit_event(Event::InvalidInvulnerableSkipped { - account_id: account_id.clone(), - }); - continue - }, - } - - new_with_keys.push(account_id.clone()); - } - - // should never fail since `new_with_keys` must be equal to or shorter than `new` - let mut bounded_invulnerables = - BoundedVec::<_, T::MaxInvulnerables>::try_from(new_with_keys) - .map_err(|_| Error::::TooManyInvulnerables)?; - - // Invulnerables must be sorted for removal. - bounded_invulnerables.sort(); - - >::put(&bounded_invulnerables); - Self::deposit_event(Event::NewInvulnerables { - invulnerables: bounded_invulnerables.to_vec(), - }); - - Ok(()) - } - - /// Set the ideal number of non-invulnerable collators. If lowering this number, then the - /// number of running collators could be higher than this figure. Aside from that edge case, - /// there should be no other way to have more candidates than the desired number. - /// - /// The origin for this call must be the `UpdateOrigin`. - #[pallet::call_index(1)] - #[pallet::weight(T::WeightInfo::set_desired_candidates())] - pub fn set_desired_candidates( - origin: OriginFor, - max: u32, - ) -> DispatchResultWithPostInfo { - T::UpdateOrigin::ensure_origin(origin)?; - // we trust origin calls, this is just a for more accurate benchmarking - if max > T::MaxCandidates::get() { - log::warn!("max > T::MaxCandidates; you might need to run benchmarks again"); - } - >::put(max); - Self::deposit_event(Event::NewDesiredCandidates { desired_candidates: max }); - Ok(().into()) - } - - /// Set the candidacy bond amount. - /// - /// The origin for this call must be the `UpdateOrigin`. - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::set_candidacy_bond())] - pub fn set_candidacy_bond( - origin: OriginFor, - bond: BalanceOf, - ) -> DispatchResultWithPostInfo { - T::UpdateOrigin::ensure_origin(origin)?; - >::put(bond); - Self::deposit_event(Event::NewCandidacyBond { bond_amount: bond }); - Ok(().into()) - } - - /// Register this account as a collator candidate. The account must (a) already have - /// registered session keys and (b) be able to reserve the `CandidacyBond`. - /// - /// This call is not available to `Invulnerable` collators. - #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::register_as_candidate(T::MaxCandidates::get()))] - pub fn register_as_candidate(origin: OriginFor) -> DispatchResultWithPostInfo { - let who = ensure_signed(origin)?; - - // ensure we are below limit. - let length = >::decode_len().unwrap_or_default(); - ensure!((length as u32) < Self::desired_candidates(), Error::::TooManyCandidates); - ensure!(!Self::invulnerables().contains(&who), Error::::AlreadyInvulnerable); - - let validator_key = T::ValidatorIdOf::convert(who.clone()) - .ok_or(Error::::NoAssociatedValidatorId)?; - ensure!( - T::ValidatorRegistration::is_registered(&validator_key), - Error::::ValidatorNotRegistered - ); - - let deposit = Self::candidacy_bond(); - // First authored block is current block plus kick threshold to handle session delay - let incoming = CandidateInfo { who: who.clone(), deposit }; - - let current_count = - >::try_mutate(|candidates| -> Result { - if candidates.iter().any(|candidate| candidate.who == who) { - Err(Error::::AlreadyCandidate)? - } else { - T::Currency::reserve(&who, deposit)?; - candidates.try_push(incoming).map_err(|_| Error::::TooManyCandidates)?; - >::insert( - who.clone(), - frame_system::Pallet::::block_number() + T::KickThreshold::get(), - ); - Ok(candidates.len()) - } - })?; - - Self::deposit_event(Event::CandidateAdded { account_id: who, deposit }); - Ok(Some(T::WeightInfo::register_as_candidate(current_count as u32)).into()) - } - - /// Deregister `origin` as a collator candidate. Note that the collator can only leave on - /// session change. The `CandidacyBond` will be unreserved immediately. - /// - /// This call will fail if the total number of candidates would drop below - /// `MinEligibleCollators`. - #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::leave_intent(T::MaxCandidates::get()))] - pub fn leave_intent(origin: OriginFor) -> DispatchResultWithPostInfo { - let who = ensure_signed(origin)?; - ensure!( - Self::eligible_collators() > T::MinEligibleCollators::get() as usize, - Error::::TooFewEligibleCollators - ); - // Do remove their last authored block. - let current_count = Self::try_remove_candidate(&who, true)?; - - Ok(Some(T::WeightInfo::leave_intent(current_count as u32)).into()) - } - - /// Add a new account `who` to the list of `Invulnerables` collators. `who` must have - /// registered session keys. If `who` is a candidate, they will be removed. - /// - /// The origin for this call must be the `UpdateOrigin`. - #[pallet::call_index(5)] - #[pallet::weight(T::WeightInfo::add_invulnerable( - T::MaxInvulnerables::get().saturating_sub(1), - T::MaxCandidates::get() - ))] - pub fn add_invulnerable( - origin: OriginFor, - who: T::AccountId, - ) -> DispatchResultWithPostInfo { - T::UpdateOrigin::ensure_origin(origin)?; - - // ensure `who` has registered a validator key - let validator_key = T::ValidatorIdOf::convert(who.clone()) - .ok_or(Error::::NoAssociatedValidatorId)?; - ensure!( - T::ValidatorRegistration::is_registered(&validator_key), - Error::::ValidatorNotRegistered - ); - - >::try_mutate(|invulnerables| -> DispatchResult { - match invulnerables.binary_search(&who) { - Ok(_) => return Err(Error::::AlreadyInvulnerable)?, - Err(pos) => invulnerables - .try_insert(pos, who.clone()) - .map_err(|_| Error::::TooManyInvulnerables)?, - } - Ok(()) - })?; - - // Error just means `who` wasn't a candidate, which is the state we want anyway. Don't - // remove their last authored block, as they are still a collator. - let _ = Self::try_remove_candidate(&who, false); - - Self::deposit_event(Event::InvulnerableAdded { account_id: who }); - - let weight_used = T::WeightInfo::add_invulnerable( - Invulnerables::::decode_len() - .unwrap_or_default() - .try_into() - .unwrap_or(T::MaxInvulnerables::get().saturating_sub(1)), - Candidates::::decode_len() - .unwrap_or_default() - .try_into() - .unwrap_or(T::MaxCandidates::get()), - ); - - Ok(Some(weight_used).into()) - } - - /// Remove an account `who` from the list of `Invulnerables` collators. `Invulnerables` must - /// be sorted. - /// - /// The origin for this call must be the `UpdateOrigin`. - #[pallet::call_index(6)] - #[pallet::weight(T::WeightInfo::remove_invulnerable(T::MaxInvulnerables::get()))] - pub fn remove_invulnerable(origin: OriginFor, who: T::AccountId) -> DispatchResult { - T::UpdateOrigin::ensure_origin(origin)?; - - ensure!( - Self::eligible_collators() > T::MinEligibleCollators::get() as usize, - Error::::TooFewEligibleCollators - ); - - >::try_mutate(|invulnerables| -> DispatchResult { - let pos = - invulnerables.binary_search(&who).map_err(|_| Error::::NotInvulnerable)?; - invulnerables.remove(pos); - Ok(()) - })?; - - Self::deposit_event(Event::InvulnerableRemoved { account_id: who }); - Ok(()) - } - } - - impl Pallet { - /// Get a unique, inaccessible account ID from the `PotId`. - pub fn account_id() -> T::AccountId { - T::PotId::get().into_account_truncating() - } - - /// Return the total number of accounts that are eligible collators (candidates and - /// invulnerables). - fn eligible_collators() -> usize { - Candidates::::decode_len() - .unwrap_or_default() - .saturating_add(Invulnerables::::decode_len().unwrap_or_default()) - } - - /// Removes a candidate if they exist and sends them back their deposit. - fn try_remove_candidate( - who: &T::AccountId, - remove_last_authored: bool, - ) -> Result { - let current_count = - >::try_mutate(|candidates| -> Result { - let index = candidates - .iter() - .position(|candidate| candidate.who == *who) - .ok_or(Error::::NotCandidate)?; - let candidate = candidates.remove(index); - T::Currency::unreserve(who, candidate.deposit); - if remove_last_authored { - >::remove(who.clone()) - }; - Ok(candidates.len()) - })?; - Self::deposit_event(Event::CandidateRemoved { account_id: who.clone() }); - Ok(current_count) - } - - /// Assemble the current set of candidates and invulnerables into the next collator set. - /// - /// This is done on the fly, as frequent as we are told to do so, as the session manager. - pub fn assemble_collators( - candidates: BoundedVec, - ) -> Vec { - let mut collators = Self::invulnerables().to_vec(); - collators.extend(candidates); - collators - } - - /// Kicks out candidates that did not produce a block in the kick threshold and refunds - /// their deposits. - pub fn kick_stale_candidates( - candidates: BoundedVec>, T::MaxCandidates>, - ) -> BoundedVec { - let now = frame_system::Pallet::::block_number(); - let kick_threshold = T::KickThreshold::get(); - let min_collators = T::MinEligibleCollators::get(); - candidates - .into_iter() - .filter_map(|c| { - let last_block = >::get(c.who.clone()); - let since_last = now.saturating_sub(last_block); - - let is_invulnerable = Self::invulnerables().contains(&c.who); - let is_lazy = since_last >= kick_threshold; - - if is_invulnerable { - // They are invulnerable. No reason for them to be in Candidates also. - // We don't even care about the min collators here, because an Account - // should not be a collator twice. - let _ = Self::try_remove_candidate(&c.who, false); - None - } else { - if Self::eligible_collators() <= min_collators as usize || !is_lazy { - // Either this is a good collator (not lazy) or we are at the minimum - // that the system needs. They get to stay. - Some(c.who) - } else { - // This collator has not produced a block recently enough. Bye bye. - let _ = Self::try_remove_candidate(&c.who, true); - None - } - } - }) - .collect::>() - .try_into() - .expect("filter_map operation can't result in a bounded vec larger than its original; qed") - } - } - - /// Keep track of number of authored blocks per authority, uncles are counted as well since - /// they're a valid proof of being online. - impl - pallet_authorship::EventHandler> for Pallet - { - fn note_author(author: T::AccountId) { - let pot = Self::account_id(); - // assumes an ED will be sent to pot. - let reward = T::Currency::free_balance(&pot) - .checked_sub(&T::Currency::minimum_balance()) - .unwrap_or_else(Zero::zero) - .div(2u32.into()); - // `reward` is half of pot account minus ED, this should never fail. - let _success = T::Currency::transfer(&pot, &author, reward, KeepAlive); - debug_assert!(_success.is_ok()); - >::insert(author, frame_system::Pallet::::block_number()); - - frame_system::Pallet::::register_extra_weight_unchecked( - T::WeightInfo::note_author(), - DispatchClass::Mandatory, - ); - } - } - - /// Play the role of the session manager. - impl SessionManager for Pallet { - fn new_session(index: SessionIndex) -> Option> { - log::info!( - "assembling new collators for new session {} at #{:?}", - index, - >::block_number(), - ); - - let candidates = Self::candidates(); - let candidates_len_before = candidates.len(); - let active_candidates = Self::kick_stale_candidates(candidates); - let removed = candidates_len_before - active_candidates.len(); - let result = Self::assemble_collators(active_candidates); - - frame_system::Pallet::::register_extra_weight_unchecked( - T::WeightInfo::new_session(candidates_len_before as u32, removed as u32), - DispatchClass::Mandatory, - ); - Some(result) - } - fn start_session(_: SessionIndex) { - // we don't care. - } - fn end_session(_: SessionIndex) { - // we don't care. - } - } -} diff --git a/cumulus/pallets/collator-selection/src/migration.rs b/cumulus/pallets/collator-selection/src/migration.rs deleted file mode 100644 index e26d9f08b5b6..000000000000 --- a/cumulus/pallets/collator-selection/src/migration.rs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! A module that is responsible for migration of storage for Collator Selection. - -use super::*; -use frame_support::{log, traits::OnRuntimeUpgrade}; - -/// Version 1 Migration -/// This migration ensures that any existing `Invulnerables` storage lists are sorted. -pub mod v1 { - use super::*; - use frame_support::pallet_prelude::*; - #[cfg(feature = "try-runtime")] - use sp_std::prelude::*; - - pub struct MigrateToV1(sp_std::marker::PhantomData); - impl OnRuntimeUpgrade for MigrateToV1 { - fn on_runtime_upgrade() -> Weight { - let onchain_version = Pallet::::on_chain_storage_version(); - if onchain_version == 0 { - let invulnerables_len = Invulnerables::::get().to_vec().len(); - >::mutate(|invulnerables| { - invulnerables.sort(); - }); - - StorageVersion::new(1).put::>(); - log::info!( - target: LOG_TARGET, - "Sorted {} Invulnerables, upgraded storage to version 1", - invulnerables_len, - ); - // Similar complexity to `set_invulnerables` (put storage value) - // Plus 1 read for length, 1 read for `onchain_version`, 1 write to put version - T::WeightInfo::set_invulnerables(invulnerables_len as u32) - .saturating_add(T::DbWeight::get().reads_writes(2, 1)) - } else { - log::info!( - target: LOG_TARGET, - "Migration did not execute. This probably should be removed" - ); - T::DbWeight::get().reads(1) - } - } - - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::DispatchError> { - let number_of_invulnerables = Invulnerables::::get().to_vec().len(); - Ok((number_of_invulnerables as u32).encode()) - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade(number_of_invulnerables: Vec) -> Result<(), sp_runtime::DispatchError> { - let stored_invulnerables = Invulnerables::::get().to_vec(); - let mut sorted_invulnerables = stored_invulnerables.clone(); - sorted_invulnerables.sort(); - assert_eq!( - stored_invulnerables, sorted_invulnerables, - "after migration, the stored invulnerables should be sorted" - ); - - let number_of_invulnerables: u32 = Decode::decode( - &mut number_of_invulnerables.as_slice(), - ) - .expect("the state parameter should be something that was generated by pre_upgrade"); - let stored_invulnerables_len = stored_invulnerables.len() as u32; - assert_eq!( - number_of_invulnerables, stored_invulnerables_len, - "after migration, there should be the same number of invulnerables" - ); - - let onchain_version = Pallet::::on_chain_storage_version(); - frame_support::ensure!(onchain_version >= 1, "must_upgrade"); - - Ok(()) - } - } -} diff --git a/cumulus/pallets/collator-selection/src/mock.rs b/cumulus/pallets/collator-selection/src/mock.rs deleted file mode 100644 index 7e8b1595d2c8..000000000000 --- a/cumulus/pallets/collator-selection/src/mock.rs +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::*; -use crate as collator_selection; -use frame_support::{ - ord_parameter_types, parameter_types, - traits::{ConstBool, ConstU32, ConstU64, FindAuthor, ValidatorRegistration}, - PalletId, -}; -use frame_system as system; -use frame_system::EnsureSignedBy; -use sp_core::H256; -use sp_runtime::{ - testing::UintAuthorityId, - traits::{BlakeTwo256, IdentityLookup, OpaqueKeys}, - BuildStorage, RuntimeAppPublic, -}; - -type Block = frame_system::mocking::MockBlock; - -// Configure a mock runtime to test the pallet. -frame_support::construct_runtime!( - pub enum Test - { - System: frame_system, - Timestamp: pallet_timestamp, - Session: pallet_session, - Aura: pallet_aura, - Balances: pallet_balances, - CollatorSelection: collator_selection, - Authorship: pallet_authorship, - } -); - -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const SS58Prefix: u8 = 42; -} - -impl system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - pub const ExistentialDeposit: u64 = 5; - pub const MaxReserves: u32 = 50; -} - -impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -pub struct Author4; -impl FindAuthor for Author4 { - fn find_author<'a, I>(_digests: I) -> Option - where - I: 'a + IntoIterator, - { - Some(4) - } -} - -impl pallet_authorship::Config for Test { - type FindAuthor = Author4; - type EventHandler = CollatorSelection; -} - -impl pallet_timestamp::Config for Test { - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<1>; - type WeightInfo = (); -} - -impl pallet_aura::Config for Test { - type AuthorityId = sp_consensus_aura::sr25519::AuthorityId; - type MaxAuthorities = ConstU32<100_000>; - type DisabledValidators = (); - type AllowMultipleBlocksPerSlot = ConstBool; -} - -sp_runtime::impl_opaque_keys! { - pub struct MockSessionKeys { - // a key for aura authoring - pub aura: UintAuthorityId, - } -} - -impl From for MockSessionKeys { - fn from(aura: sp_runtime::testing::UintAuthorityId) -> Self { - Self { aura } - } -} - -parameter_types! { - pub static SessionHandlerCollators: Vec = Vec::new(); - pub static SessionChangeBlock: u64 = 0; -} - -pub struct TestSessionHandler; -impl pallet_session::SessionHandler for TestSessionHandler { - const KEY_TYPE_IDS: &'static [sp_runtime::KeyTypeId] = &[UintAuthorityId::ID]; - fn on_genesis_session(keys: &[(u64, Ks)]) { - SessionHandlerCollators::set(keys.iter().map(|(a, _)| *a).collect::>()) - } - fn on_new_session(_: bool, keys: &[(u64, Ks)], _: &[(u64, Ks)]) { - SessionChangeBlock::set(System::block_number()); - dbg!(keys.len()); - SessionHandlerCollators::set(keys.iter().map(|(a, _)| *a).collect::>()) - } - fn on_before_session_ending() {} - fn on_disabled(_: u32) {} -} - -parameter_types! { - pub const Offset: u64 = 0; - pub const Period: u64 = 10; -} - -impl pallet_session::Config for Test { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - type SessionHandler = TestSessionHandler; - type Keys = MockSessionKeys; - type WeightInfo = (); -} - -ord_parameter_types! { - pub const RootAccount: u64 = 777; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); -} - -pub struct IsRegistered; -impl ValidatorRegistration for IsRegistered { - fn is_registered(id: &u64) -> bool { - *id != 42u64 - } -} - -impl Config for Test { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = EnsureSignedBy; - type PotId = PotId; - type MaxCandidates = ConstU32<20>; - type MinEligibleCollators = ConstU32<1>; - type MaxInvulnerables = ConstU32<20>; - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = IdentityCollator; - type ValidatorRegistration = IsRegistered; - type WeightInfo = (); -} - -pub fn new_test_ext() -> sp_io::TestExternalities { - sp_tracing::try_init_simple(); - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - let invulnerables = vec![2, 1]; // unsorted - - let balances = vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)]; - let keys = balances - .iter() - .map(|&(i, _)| (i, i, MockSessionKeys { aura: UintAuthorityId(i) })) - .collect::>(); - let collator_selection = collator_selection::GenesisConfig:: { - desired_candidates: 2, - candidacy_bond: 10, - invulnerables, - }; - let session = pallet_session::GenesisConfig:: { keys }; - pallet_balances::GenesisConfig:: { balances } - .assimilate_storage(&mut t) - .unwrap(); - // collator selection must be initialized before session. - collator_selection.assimilate_storage(&mut t).unwrap(); - session.assimilate_storage(&mut t).unwrap(); - - t.into() -} - -pub fn initialize_to_block(n: u64) { - for i in System::block_number() + 1..=n { - System::set_block_number(i); - >::on_initialize(i); - } -} diff --git a/cumulus/pallets/collator-selection/src/tests.rs b/cumulus/pallets/collator-selection/src/tests.rs deleted file mode 100644 index cbfbde743f0e..000000000000 --- a/cumulus/pallets/collator-selection/src/tests.rs +++ /dev/null @@ -1,640 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate as collator_selection; -use crate::{mock::*, CandidateInfo, Error}; -use frame_support::{ - assert_noop, assert_ok, - traits::{Currency, OnInitialize}, -}; -use pallet_balances::Error as BalancesError; -use sp_runtime::{testing::UintAuthorityId, traits::BadOrigin, BuildStorage}; - -#[test] -fn basic_setup_works() { - new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); - - assert!(CollatorSelection::candidates().is_empty()); - // genesis should sort input - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - }); -} - -#[test] -fn it_should_set_invulnerables() { - new_test_ext().execute_with(|| { - let mut new_set = vec![1, 4, 3, 2]; - assert_ok!(CollatorSelection::set_invulnerables( - RuntimeOrigin::signed(RootAccount::get()), - new_set.clone() - )); - new_set.sort(); - assert_eq!(CollatorSelection::invulnerables(), new_set); - - // cannot set with non-root. - assert_noop!( - CollatorSelection::set_invulnerables(RuntimeOrigin::signed(1), new_set), - BadOrigin - ); - }); -} - -#[test] -fn it_should_set_invulnerables_even_with_some_invalid() { - new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - let new_with_invalid = vec![1, 4, 3, 42, 2]; - - assert_ok!(CollatorSelection::set_invulnerables( - RuntimeOrigin::signed(RootAccount::get()), - new_with_invalid - )); - - // should succeed and order them, but not include 42 - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3, 4]); - }); -} - -#[test] -fn add_invulnerable_works() { - new_test_ext().execute_with(|| { - initialize_to_block(1); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - let new = 3; - - // function runs - assert_ok!(CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - new - )); - - System::assert_last_event(RuntimeEvent::CollatorSelection( - crate::Event::InvulnerableAdded { account_id: new }, - )); - - // same element cannot be added more than once - assert_noop!( - CollatorSelection::add_invulnerable(RuntimeOrigin::signed(RootAccount::get()), new), - Error::::AlreadyInvulnerable - ); - - // new element is now part of the invulnerables list - assert!(CollatorSelection::invulnerables().to_vec().contains(&new)); - - // cannot add with non-root - assert_noop!(CollatorSelection::add_invulnerable(RuntimeOrigin::signed(1), new), BadOrigin); - - // cannot add invulnerable without associated validator keys - let not_validator = 42; - assert_noop!( - CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - not_validator - ), - Error::::ValidatorNotRegistered - ); - }); -} - -#[test] -fn invulnerable_limit_works() { - new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - - // MaxInvulnerables: u32 = 20 - for ii in 3..=21 { - // only keys were registered in mock for 1 to 5 - if ii > 5 { - Balances::make_free_balance_be(&ii, 100); - let key = MockSessionKeys { aura: UintAuthorityId(ii) }; - Session::set_keys(RuntimeOrigin::signed(ii).into(), key, Vec::new()).unwrap(); - } - assert_eq!(Balances::free_balance(ii), 100); - if ii < 21 { - assert_ok!(CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - ii - )); - } else { - assert_noop!( - CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - ii - ), - Error::::TooManyInvulnerables - ); - } - } - let expected: Vec = (1..=20).collect(); - assert_eq!(CollatorSelection::invulnerables(), expected); - - // Cannot set too many Invulnerables - let too_many_invulnerables: Vec = (1..=21).collect(); - assert_noop!( - CollatorSelection::set_invulnerables( - RuntimeOrigin::signed(RootAccount::get()), - too_many_invulnerables - ), - Error::::TooManyInvulnerables - ); - assert_eq!(CollatorSelection::invulnerables(), expected); - }); -} - -#[test] -fn remove_invulnerable_works() { - new_test_ext().execute_with(|| { - initialize_to_block(1); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - - assert_ok!(CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 4 - )); - assert_ok!(CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 3 - )); - - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3, 4]); - - assert_ok!(CollatorSelection::remove_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 2 - )); - - System::assert_last_event(RuntimeEvent::CollatorSelection( - crate::Event::InvulnerableRemoved { account_id: 2 }, - )); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 3, 4]); - - // cannot remove invulnerable not in the list - assert_noop!( - CollatorSelection::remove_invulnerable(RuntimeOrigin::signed(RootAccount::get()), 2), - Error::::NotInvulnerable - ); - - // cannot remove without privilege - assert_noop!( - CollatorSelection::remove_invulnerable(RuntimeOrigin::signed(1), 3), - BadOrigin - ); - }); -} - -#[test] -fn candidate_to_invulnerable_works() { - new_test_ext().execute_with(|| { - initialize_to_block(1); - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); - assert_eq!(CollatorSelection::candidates(), Vec::new()); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - - assert_eq!(Balances::free_balance(3), 100); - assert_eq!(Balances::free_balance(4), 100); - - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - - assert_eq!(Balances::free_balance(3), 90); - assert_eq!(Balances::free_balance(4), 90); - - assert_ok!(CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 3 - )); - System::assert_has_event(RuntimeEvent::CollatorSelection(crate::Event::CandidateRemoved { - account_id: 3, - })); - System::assert_has_event(RuntimeEvent::CollatorSelection( - crate::Event::InvulnerableAdded { account_id: 3 }, - )); - assert!(CollatorSelection::invulnerables().to_vec().contains(&3)); - assert_eq!(Balances::free_balance(3), 100); - assert_eq!(CollatorSelection::candidates().len(), 1); - - assert_ok!(CollatorSelection::add_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 4 - )); - System::assert_has_event(RuntimeEvent::CollatorSelection(crate::Event::CandidateRemoved { - account_id: 4, - })); - System::assert_has_event(RuntimeEvent::CollatorSelection( - crate::Event::InvulnerableAdded { account_id: 4 }, - )); - assert!(CollatorSelection::invulnerables().to_vec().contains(&4)); - assert_eq!(Balances::free_balance(4), 100); - assert_eq!(CollatorSelection::candidates().len(), 0); - }); -} - -#[test] -fn set_desired_candidates_works() { - new_test_ext().execute_with(|| { - // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - - // can set - assert_ok!(CollatorSelection::set_desired_candidates( - RuntimeOrigin::signed(RootAccount::get()), - 7 - )); - assert_eq!(CollatorSelection::desired_candidates(), 7); - - // rejects bad origin - assert_noop!( - CollatorSelection::set_desired_candidates(RuntimeOrigin::signed(1), 8), - BadOrigin - ); - }); -} - -#[test] -fn set_candidacy_bond() { - new_test_ext().execute_with(|| { - // given - assert_eq!(CollatorSelection::candidacy_bond(), 10); - - // can set - assert_ok!(CollatorSelection::set_candidacy_bond( - RuntimeOrigin::signed(RootAccount::get()), - 7 - )); - assert_eq!(CollatorSelection::candidacy_bond(), 7); - - // rejects bad origin. - assert_noop!(CollatorSelection::set_candidacy_bond(RuntimeOrigin::signed(1), 8), BadOrigin); - }); -} - -#[test] -fn cannot_register_candidate_if_too_many() { - new_test_ext().execute_with(|| { - // reset desired candidates: - >::put(0); - - // can't accept anyone anymore. - assert_noop!( - CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3)), - Error::::TooManyCandidates, - ); - - // reset desired candidates: - >::put(1); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - - // but no more - assert_noop!( - CollatorSelection::register_as_candidate(RuntimeOrigin::signed(5)), - Error::::TooManyCandidates, - ); - }) -} - -#[test] -fn cannot_unregister_candidate_if_too_few() { - new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::candidates(), Vec::new()); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - assert_ok!(CollatorSelection::remove_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 1 - )); - assert_noop!( - CollatorSelection::remove_invulnerable(RuntimeOrigin::signed(RootAccount::get()), 2), - Error::::TooFewEligibleCollators, - ); - - // reset desired candidates: - >::put(1); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - - // now we can remove `2` - assert_ok!(CollatorSelection::remove_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 2 - )); - - // can not remove too few - assert_noop!( - CollatorSelection::leave_intent(RuntimeOrigin::signed(4)), - Error::::TooFewEligibleCollators, - ); - }) -} - -#[test] -fn cannot_register_as_candidate_if_invulnerable() { - new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - - // can't 1 because it is invulnerable. - assert_noop!( - CollatorSelection::register_as_candidate(RuntimeOrigin::signed(1)), - Error::::AlreadyInvulnerable, - ); - }) -} - -#[test] -fn cannot_register_as_candidate_if_keys_not_registered() { - new_test_ext().execute_with(|| { - // can't 7 because keys not registered. - assert_noop!( - CollatorSelection::register_as_candidate(RuntimeOrigin::signed(42)), - Error::::ValidatorNotRegistered - ); - }) -} - -#[test] -fn cannot_register_dupe_candidate() { - new_test_ext().execute_with(|| { - // can add 3 as candidate - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - let addition = CandidateInfo { who: 3, deposit: 10 }; - assert_eq!(CollatorSelection::candidates(), vec![addition]); - assert_eq!(CollatorSelection::last_authored_block(3), 10); - assert_eq!(Balances::free_balance(3), 90); - - // but no more - assert_noop!( - CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3)), - Error::::AlreadyCandidate, - ); - }) -} - -#[test] -fn cannot_register_as_candidate_if_poor() { - new_test_ext().execute_with(|| { - assert_eq!(Balances::free_balance(3), 100); - assert_eq!(Balances::free_balance(33), 0); - - // works - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - - // poor - assert_noop!( - CollatorSelection::register_as_candidate(RuntimeOrigin::signed(33)), - BalancesError::::InsufficientBalance, - ); - }); -} - -#[test] -fn register_as_candidate_works() { - new_test_ext().execute_with(|| { - // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); - assert_eq!(CollatorSelection::candidates(), Vec::new()); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - - // take two endowed, non-invulnerables accounts. - assert_eq!(Balances::free_balance(3), 100); - assert_eq!(Balances::free_balance(4), 100); - - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - - assert_eq!(Balances::free_balance(3), 90); - assert_eq!(Balances::free_balance(4), 90); - - assert_eq!(CollatorSelection::candidates().len(), 2); - }); -} - -#[test] -fn leave_intent() { - new_test_ext().execute_with(|| { - // register a candidate. - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - assert_eq!(Balances::free_balance(3), 90); - - // register too so can leave above min candidates - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(5))); - assert_eq!(Balances::free_balance(5), 90); - - // cannot leave if not candidate. - assert_noop!( - CollatorSelection::leave_intent(RuntimeOrigin::signed(4)), - Error::::NotCandidate - ); - - // bond is returned - assert_ok!(CollatorSelection::leave_intent(RuntimeOrigin::signed(3))); - assert_eq!(Balances::free_balance(3), 100); - assert_eq!(CollatorSelection::last_authored_block(3), 0); - }); -} - -#[test] -fn authorship_event_handler() { - new_test_ext().execute_with(|| { - // put 100 in the pot + 5 for ED - Balances::make_free_balance_be(&CollatorSelection::account_id(), 105); - - // 4 is the default author. - assert_eq!(Balances::free_balance(4), 100); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - // triggers `note_author` - Authorship::on_initialize(1); - - let collator = CandidateInfo { who: 4, deposit: 10 }; - - assert_eq!(CollatorSelection::candidates(), vec![collator]); - assert_eq!(CollatorSelection::last_authored_block(4), 0); - - // half of the pot goes to the collator who's the author (4 in tests). - assert_eq!(Balances::free_balance(4), 140); - // half + ED stays. - assert_eq!(Balances::free_balance(CollatorSelection::account_id()), 55); - }); -} - -#[test] -fn fees_edgecases() { - new_test_ext().execute_with(|| { - // Nothing panics, no reward when no ED in balance - Authorship::on_initialize(1); - // put some money into the pot at ED - Balances::make_free_balance_be(&CollatorSelection::account_id(), 5); - // 4 is the default author. - assert_eq!(Balances::free_balance(4), 100); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - // triggers `note_author` - Authorship::on_initialize(1); - - let collator = CandidateInfo { who: 4, deposit: 10 }; - - assert_eq!(CollatorSelection::candidates(), vec![collator]); - assert_eq!(CollatorSelection::last_authored_block(4), 0); - // Nothing received - assert_eq!(Balances::free_balance(4), 90); - // all fee stays - assert_eq!(Balances::free_balance(CollatorSelection::account_id()), 5); - }); -} - -#[test] -fn session_management_works() { - new_test_ext().execute_with(|| { - initialize_to_block(1); - - assert_eq!(SessionChangeBlock::get(), 0); - assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); - - initialize_to_block(4); - - assert_eq!(SessionChangeBlock::get(), 0); - assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); - - // add a new collator - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - - // session won't see this. - assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); - // but we have a new candidate. - assert_eq!(CollatorSelection::candidates().len(), 1); - - initialize_to_block(10); - assert_eq!(SessionChangeBlock::get(), 10); - // pallet-session has 1 session delay; current validators are the same. - assert_eq!(Session::validators(), vec![1, 2]); - // queued ones are changed, and now we have 3. - assert_eq!(Session::queued_keys().len(), 3); - // session handlers (aura, et. al.) cannot see this yet. - assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); - - initialize_to_block(20); - assert_eq!(SessionChangeBlock::get(), 20); - // changed are now reflected to session handlers. - assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 3]); - }); -} - -#[test] -fn kick_mechanism() { - new_test_ext().execute_with(|| { - // add a new collator - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - initialize_to_block(10); - assert_eq!(CollatorSelection::candidates().len(), 2); - initialize_to_block(20); - assert_eq!(SessionChangeBlock::get(), 20); - // 4 authored this block, gets to stay 3 was kicked - assert_eq!(CollatorSelection::candidates().len(), 1); - // 3 will be kicked after 1 session delay - assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 3, 4]); - let collator = CandidateInfo { who: 4, deposit: 10 }; - assert_eq!(CollatorSelection::candidates(), vec![collator]); - assert_eq!(CollatorSelection::last_authored_block(4), 20); - initialize_to_block(30); - // 3 gets kicked after 1 session delay - assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 4]); - // kicked collator gets funds back - assert_eq!(Balances::free_balance(3), 100); - }); -} - -#[test] -fn should_not_kick_mechanism_too_few() { - new_test_ext().execute_with(|| { - // remove the invulnerables and add new collators 3 and 5 - assert_eq!(CollatorSelection::candidates(), Vec::new()); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); - assert_ok!(CollatorSelection::remove_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 1 - )); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(5))); - assert_ok!(CollatorSelection::remove_invulnerable( - RuntimeOrigin::signed(RootAccount::get()), - 2 - )); - - initialize_to_block(10); - assert_eq!(CollatorSelection::candidates().len(), 2); - - initialize_to_block(20); - assert_eq!(SessionChangeBlock::get(), 20); - // 4 authored this block, 3 is kicked, 5 stays because of too few collators - assert_eq!(CollatorSelection::candidates().len(), 1); - // 3 will be kicked after 1 session delay - assert_eq!(SessionHandlerCollators::get(), vec![3, 5]); - let collator = CandidateInfo { who: 5, deposit: 10 }; - assert_eq!(CollatorSelection::candidates(), vec![collator]); - assert_eq!(CollatorSelection::last_authored_block(4), 20); - - initialize_to_block(30); - // 3 gets kicked after 1 session delay - assert_eq!(SessionHandlerCollators::get(), vec![5]); - // kicked collator gets funds back - assert_eq!(Balances::free_balance(3), 100); - }); -} - -#[test] -fn should_kick_invulnerables_from_candidates_on_session_change() { - new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::candidates(), Vec::new()); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); - assert_eq!(Balances::free_balance(3), 90); - assert_eq!(Balances::free_balance(4), 90); - assert_ok!(CollatorSelection::set_invulnerables( - RuntimeOrigin::signed(RootAccount::get()), - vec![1, 2, 3] - )); - - let collator_3 = CandidateInfo { who: 3, deposit: 10 }; - let collator_4 = CandidateInfo { who: 4, deposit: 10 }; - - assert_eq!(CollatorSelection::candidates(), vec![collator_3, collator_4.clone()]); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3]); - - // session change - initialize_to_block(10); - // 3 is removed from candidates - assert_eq!(CollatorSelection::candidates(), vec![collator_4]); - // but not from invulnerables - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3]); - // and it got its deposit back - assert_eq!(Balances::free_balance(3), 100); - }); -} - -#[test] -#[should_panic = "duplicate invulnerables in genesis."] -fn cannot_set_genesis_value_twice() { - sp_tracing::try_init_simple(); - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - let invulnerables = vec![1, 1]; - - let collator_selection = collator_selection::GenesisConfig:: { - desired_candidates: 2, - candidacy_bond: 10, - invulnerables, - }; - // collator selection must be initialized before session. - collator_selection.assimilate_storage(&mut t).unwrap(); -} diff --git a/cumulus/pallets/collator-selection/src/weights.rs b/cumulus/pallets/collator-selection/src/weights.rs deleted file mode 100644 index a4a30d833612..000000000000 --- a/cumulus/pallets/collator-selection/src/weights.rs +++ /dev/null @@ -1,213 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; -use sp_std::marker::PhantomData; - -// The weight info trait for `pallet_collator_selection`. -pub trait WeightInfo { - fn set_invulnerables(_b: u32) -> Weight; - fn add_invulnerable(_b: u32, _c: u32) -> Weight; - fn remove_invulnerable(_b: u32) -> Weight; - fn set_desired_candidates() -> Weight; - fn set_candidacy_bond() -> Weight; - fn register_as_candidate(_c: u32) -> Weight; - fn leave_intent(_c: u32) -> Weight; - fn note_author() -> Weight; - fn new_session(_c: u32, _r: u32) -> Weight; -} - -/// Weights for pallet_collator_selection using the Substrate node and recommended hardware. -pub struct SubstrateWeight(PhantomData); -impl WeightInfo for SubstrateWeight { - fn set_invulnerables(b: u32) -> Weight { - Weight::from_parts(18_563_000_u64, 0) - // Standard Error: 0 - .saturating_add(Weight::from_parts(68_000_u64, 0).saturating_mul(b as u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - fn set_desired_candidates() -> Weight { - Weight::from_parts(16_363_000_u64, 0).saturating_add(T::DbWeight::get().writes(1_u64)) - } - fn set_candidacy_bond() -> Weight { - Weight::from_parts(16_840_000_u64, 0).saturating_add(T::DbWeight::get().writes(1_u64)) - } - fn register_as_candidate(c: u32) -> Weight { - Weight::from_parts(71_196_000_u64, 0) - // Standard Error: 0 - .saturating_add(Weight::from_parts(198_000_u64, 0).saturating_mul(c as u64)) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - fn leave_intent(c: u32) -> Weight { - Weight::from_parts(55_336_000_u64, 0) - // Standard Error: 0 - .saturating_add(Weight::from_parts(151_000_u64, 0).saturating_mul(c as u64)) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) - } - fn note_author() -> Weight { - Weight::from_parts(71_461_000_u64, 0) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) - } - fn new_session(r: u32, c: u32) -> Weight { - Weight::from_parts(0_u64, 0) - // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(109_961_000_u64, 0).saturating_mul(r as u64)) - // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(151_952_000_u64, 0).saturating_mul(c as u64)) - .saturating_add(T::DbWeight::get().reads(1_u64.saturating_mul(r as u64))) - .saturating_add(T::DbWeight::get().reads(2_u64.saturating_mul(c as u64))) - .saturating_add(T::DbWeight::get().writes(2_u64.saturating_mul(r as u64))) - .saturating_add(T::DbWeight::get().writes(2_u64.saturating_mul(c as u64))) - } - /// Storage: Session NextKeys (r:1 w:0) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: CollatorSelection Invulnerables (r:1 w:1) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(641), added: - /// 1136, mode: MaxEncodedLen) Storage: CollatorSelection Candidates (r:1 w:1) - /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(4802), added: 5297, - /// mode: MaxEncodedLen) Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: - /// MaxEncodedLen) The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `757 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 52_720_000 picoseconds. - Weight::from_parts(56_102_459, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 12_957 - .saturating_add(Weight::from_parts(26_422, 0).saturating_mul(b.into())) - // Standard Error: 2_456 - .saturating_add(Weight::from_parts(128_528, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: CollatorSelection Invulnerables (r:1 w:1) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: - /// 3697, mode: MaxEncodedLen) The range of component `b` is `[1, 100]`. - fn remove_invulnerable(b: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `119 + b * (32 ±0)` - // Estimated: `4687` - // Minimum execution time: 183_054_000 picoseconds. - Weight::from_parts(197_205_427, 0) - .saturating_add(Weight::from_parts(0, 4687)) - // Standard Error: 13_533 - .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} - -// For backwards compatibility and tests -impl WeightInfo for () { - fn set_invulnerables(b: u32) -> Weight { - Weight::from_parts(18_563_000_u64, 0) - // Standard Error: 0 - .saturating_add(Weight::from_parts(68_000_u64, 0).saturating_mul(b as u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - fn set_desired_candidates() -> Weight { - Weight::from_parts(16_363_000_u64, 0).saturating_add(RocksDbWeight::get().writes(1_u64)) - } - fn set_candidacy_bond() -> Weight { - Weight::from_parts(16_840_000_u64, 0).saturating_add(RocksDbWeight::get().writes(1_u64)) - } - fn register_as_candidate(c: u32) -> Weight { - Weight::from_parts(71_196_000_u64, 0) - // Standard Error: 0 - .saturating_add(Weight::from_parts(198_000_u64, 0).saturating_mul(c as u64)) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - fn leave_intent(c: u32) -> Weight { - Weight::from_parts(55_336_000_u64, 0) - // Standard Error: 0 - .saturating_add(Weight::from_parts(151_000_u64, 0).saturating_mul(c as u64)) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) - } - fn note_author() -> Weight { - Weight::from_parts(71_461_000_u64, 0) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) - } - fn new_session(r: u32, c: u32) -> Weight { - Weight::from_parts(0_u64, 0) - // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(109_961_000_u64, 0).saturating_mul(r as u64)) - // Standard Error: 1_010_000 - .saturating_add(Weight::from_parts(151_952_000_u64, 0).saturating_mul(c as u64)) - .saturating_add(RocksDbWeight::get().reads(1_u64.saturating_mul(r as u64))) - .saturating_add(RocksDbWeight::get().reads(2_u64.saturating_mul(c as u64))) - .saturating_add(RocksDbWeight::get().writes(2_u64.saturating_mul(r as u64))) - .saturating_add(RocksDbWeight::get().writes(2_u64.saturating_mul(c as u64))) - } - /// Storage: Session NextKeys (r:1 w:0) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: CollatorSelection Invulnerables (r:1 w:1) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(641), added: - /// 1136, mode: MaxEncodedLen) Storage: CollatorSelection Candidates (r:1 w:1) - /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(4802), added: 5297, - /// mode: MaxEncodedLen) Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: - /// MaxEncodedLen) The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `757 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 52_720_000 picoseconds. - Weight::from_parts(56_102_459, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 12_957 - .saturating_add(Weight::from_parts(26_422, 0).saturating_mul(b.into())) - // Standard Error: 2_456 - .saturating_add(Weight::from_parts(128_528, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(4)) - .saturating_add(RocksDbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: CollatorSelection Invulnerables (r:1 w:1) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: - /// 3697, mode: MaxEncodedLen) The range of component `b` is `[1, 100]`. - fn remove_invulnerable(b: u32) -> Weight { - // Proof Size summary in bytes: - // Measured: `119 + b * (32 ±0)` - // Estimated: `4687` - // Minimum execution time: 183_054_000 picoseconds. - Weight::from_parts(197_205_427, 0) - .saturating_add(Weight::from_parts(0, 4687)) - // Standard Error: 13_533 - .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(1)) - .saturating_add(RocksDbWeight::get().writes(1)) - } -} diff --git a/cumulus/pallets/dmp-queue/Cargo.toml b/cumulus/pallets/dmp-queue/Cargo.toml deleted file mode 100644 index f254720dda58..000000000000 --- a/cumulus/pallets/dmp-queue/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -[package] -name = "cumulus-pallet-dmp-queue" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } - -[dev-dependencies] -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "frame-support/std", - "frame-system/std", - "log/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "xcm/std", - "cumulus-primitives-core/std", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/cumulus/pallets/dmp-queue/src/lib.rs b/cumulus/pallets/dmp-queue/src/lib.rs deleted file mode 100644 index aca9025d9e33..000000000000 --- a/cumulus/pallets/dmp-queue/src/lib.rs +++ /dev/null @@ -1,915 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Pallet implementing a message queue for downward messages from the relay-chain. -//! Executes downward messages if there is enough weight available and schedules the rest for later -//! execution (by `on_idle` or another `handle_dmp_messages` call). Individual overweight messages -//! are scheduled into a separate queue that is only serviced by explicit extrinsic calls. - -#![cfg_attr(not(feature = "std"), no_std)] - -pub mod migration; - -use codec::{Decode, DecodeLimit, Encode}; -use cumulus_primitives_core::{relay_chain::BlockNumber as RelayBlockNumber, DmpMessageHandler}; -use frame_support::{ - traits::EnsureOrigin, - weights::{constants::WEIGHT_REF_TIME_PER_MILLIS, Weight}, -}; -pub use pallet::*; -use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; -use sp_std::{convert::TryFrom, prelude::*}; -use xcm::{latest::prelude::*, VersionedXcm, MAX_XCM_DECODE_DEPTH}; - -const DEFAULT_POV_SIZE: u64 = 64 * 1024; // 64 KB - -// Maximum amount of messages to process per block. This is a temporary measure until we properly -// account for proof size weights. -const MAX_MESSAGES_PER_BLOCK: u8 = 10; -// Maximum amount of messages that can exist in the overweight queue at any given time. -const MAX_OVERWEIGHT_MESSAGES: u32 = 1000; - -#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct ConfigData { - /// The maximum amount of weight any individual message may consume. Messages above this weight - /// go into the overweight queue and may only be serviced explicitly by the - /// `ExecuteOverweightOrigin`. - max_individual: Weight, -} - -impl Default for ConfigData { - fn default() -> Self { - Self { - max_individual: Weight::from_parts( - 10u64 * WEIGHT_REF_TIME_PER_MILLIS, // 10 ms of execution time maximum by default - DEFAULT_POV_SIZE, // 64 KB of proof size by default - ), - } - } -} - -/// Information concerning our message pages. -#[derive(Copy, Clone, Eq, PartialEq, Default, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct PageIndexData { - /// The lowest used page index. - begin_used: PageCounter, - /// The lowest unused page index. - end_used: PageCounter, - /// The number of overweight messages ever recorded (and thus the lowest free index). - overweight_count: OverweightIndex, -} - -/// Simple type used to identify messages for the purpose of reporting events. Secure if and only -/// if the message content is unique. -pub type MessageId = XcmHash; - -/// Index used to identify overweight messages. -pub type OverweightIndex = u64; - -/// Index used to identify normal pages. -pub type PageCounter = u32; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - #[pallet::storage_version(migration::STORAGE_VERSION)] - #[pallet::without_storage_info] - pub struct Pallet(_); - - /// The module configuration trait. - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - type XcmExecutor: ExecuteXcm; - - /// Origin which is allowed to execute overweight messages. - type ExecuteOverweightOrigin: EnsureOrigin; - } - - /// The configuration. - #[pallet::storage] - pub(super) type Configuration = StorageValue<_, ConfigData, ValueQuery>; - - /// The page index. - #[pallet::storage] - pub(super) type PageIndex = StorageValue<_, PageIndexData, ValueQuery>; - - /// The queue pages. - #[pallet::storage] - pub(super) type Pages = - StorageMap<_, Blake2_128Concat, PageCounter, Vec<(RelayBlockNumber, Vec)>, ValueQuery>; - - /// The overweight messages. - #[pallet::storage] - pub(super) type Overweight = CountedStorageMap< - _, - Blake2_128Concat, - OverweightIndex, - (RelayBlockNumber, Vec), - OptionQuery, - >; - - #[pallet::error] - pub enum Error { - /// The message index given is unknown. - Unknown, - /// The amount of weight given is possibly not enough for executing the message. - OverLimit, - } - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_idle(_now: BlockNumberFor, max_weight: Weight) -> Weight { - // on_idle processes additional messages with any remaining block weight. - Self::service_queue(max_weight) - } - } - - #[pallet::call] - impl Pallet { - /// Service a single overweight message. - #[pallet::call_index(0)] - #[pallet::weight(weight_limit.saturating_add(Weight::from_parts(1_000_000, 0)))] - pub fn service_overweight( - origin: OriginFor, - index: OverweightIndex, - weight_limit: Weight, - ) -> DispatchResultWithPostInfo { - T::ExecuteOverweightOrigin::ensure_origin(origin)?; - - let (sent_at, data) = Overweight::::get(index).ok_or(Error::::Unknown)?; - let weight_used = Self::try_service_message(weight_limit, sent_at, &data[..]) - .map_err(|_| Error::::OverLimit)?; - Overweight::::remove(index); - Self::deposit_event(Event::OverweightServiced { overweight_index: index, weight_used }); - Ok(Some(weight_used.saturating_add(Weight::from_parts(1_000_000, 0))).into()) - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// Downward message is invalid XCM. - InvalidFormat { message_hash: XcmHash }, - /// Downward message is unsupported version of XCM. - UnsupportedVersion { message_hash: XcmHash }, - /// Downward message executed with the given outcome. - ExecutedDownward { message_hash: XcmHash, message_id: XcmHash, outcome: Outcome }, - /// The weight limit for handling downward messages was reached. - WeightExhausted { - message_hash: XcmHash, - message_id: XcmHash, - remaining_weight: Weight, - required_weight: Weight, - }, - /// Downward message is overweight and was placed in the overweight queue. - OverweightEnqueued { - message_hash: XcmHash, - message_id: XcmHash, - overweight_index: OverweightIndex, - required_weight: Weight, - }, - /// Downward message from the overweight queue was executed. - OverweightServiced { overweight_index: OverweightIndex, weight_used: Weight }, - /// The maximum number of downward messages was reached. - MaxMessagesExhausted { message_hash: XcmHash }, - } - - /// Error type when a message was failed to be serviced. - pub(crate) struct ServiceMessageError { - /// The message's hash. - message_hash: XcmHash, - /// The message's ID (which could also be its hash if nothing overrides it). - message_id: XcmHash, - /// Weight required for the message to be executed. - required_weight: Weight, - } - - impl Pallet { - /// Service the message queue up to some given weight `limit`. - /// - /// Returns the weight consumed by executing messages in the queue. - fn service_queue(limit: Weight) -> Weight { - let mut messages_processed = 0; - PageIndex::::mutate(|page_index| { - Self::do_service_queue(limit, page_index, &mut messages_processed) - }) - } - - /// Exactly equivalent to `service_queue` but expects a mutable `page_index` to be passed - /// in and any changes stored. - fn do_service_queue( - limit: Weight, - page_index: &mut PageIndexData, - messages_processed: &mut u8, - ) -> Weight { - let mut used = Weight::zero(); - while page_index.begin_used < page_index.end_used { - let page = Pages::::take(page_index.begin_used); - for (i, &(sent_at, ref data)) in page.iter().enumerate() { - if *messages_processed >= MAX_MESSAGES_PER_BLOCK { - // Exceeded block message limit - put the remaining messages back and bail - Pages::::insert(page_index.begin_used, &page[i..]); - return used - } - *messages_processed += 1; - match Self::try_service_message(limit.saturating_sub(used), sent_at, &data[..]) - { - Ok(w) => used += w, - Err(..) => { - // Too much weight needed - put the remaining messages back and bail - Pages::::insert(page_index.begin_used, &page[i..]); - return used - }, - } - } - page_index.begin_used += 1; - } - if page_index.begin_used == page_index.end_used { - // Reset if there's no pages left. - page_index.begin_used = 0; - page_index.end_used = 0; - } - used - } - - /// Attempt to service an individual message. Will return `Ok` with the execution weight - /// consumed unless the message was found to need more weight than `limit`. - /// - /// NOTE: This will return `Ok` in the case of an error decoding, weighing or executing - /// the message. This is why it's called message "servicing" rather than "execution". - pub(crate) fn try_service_message( - limit: Weight, - _sent_at: RelayBlockNumber, - mut data: &[u8], - ) -> Result { - let message_hash = sp_io::hashing::blake2_256(data); - let mut message_id = message_hash; - let maybe_msg = VersionedXcm::::decode_all_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut data, - ) - .map(Xcm::::try_from); - match maybe_msg { - Err(_) => { - Self::deposit_event(Event::InvalidFormat { message_hash }); - Ok(Weight::zero()) - }, - Ok(Err(())) => { - Self::deposit_event(Event::UnsupportedVersion { message_hash }); - Ok(Weight::zero()) - }, - Ok(Ok(x)) => { - let outcome = T::XcmExecutor::prepare_and_execute( - Parent, - x, - &mut message_id, - limit, - Weight::zero(), - ); - match outcome { - Outcome::Error(XcmError::WeightLimitReached(required_weight)) => - Err(ServiceMessageError { message_hash, message_id, required_weight }), - outcome => { - let weight_used = outcome.weight_used(); - Self::deposit_event(Event::ExecutedDownward { - message_hash, - message_id, - outcome, - }); - Ok(weight_used) - }, - } - }, - } - } - } - - /// For an incoming downward message, this just adapts an XCM executor and executes DMP messages - /// immediately up until some `MaxWeight` at which point it errors. Their origin is asserted to - /// be the `Parent` location. - impl DmpMessageHandler for Pallet { - fn handle_dmp_messages( - iter: impl Iterator)>, - limit: Weight, - ) -> Weight { - let mut messages_processed = 0; - let mut page_index = PageIndex::::get(); - let config = Configuration::::get(); - - // First try to use `max_weight` to service the current queue. - let mut used = Self::do_service_queue(limit, &mut page_index, &mut messages_processed); - - // Then if the queue is empty, use the weight remaining to service the incoming messages - // and once we run out of weight, place them in the queue. - let item_count = iter.size_hint().0; - let mut maybe_enqueue_page = if page_index.end_used > page_index.begin_used { - // queue is already non-empty - start a fresh page. - Some(Vec::with_capacity(item_count)) - } else { - None - }; - - for (i, (sent_at, data)) in iter.enumerate() { - if maybe_enqueue_page.is_none() { - if messages_processed >= MAX_MESSAGES_PER_BLOCK { - let item_count_left = item_count.saturating_sub(i); - maybe_enqueue_page = Some(Vec::with_capacity(item_count_left)); - - Self::deposit_event(Event::MaxMessagesExhausted { - message_hash: sp_io::hashing::blake2_256(&data), - }); - } else { - // We're not currently enqueuing - try to execute inline. - let remaining_weight = limit.saturating_sub(used); - messages_processed += 1; - match Self::try_service_message(remaining_weight, sent_at, &data[..]) { - Ok(consumed) => used += consumed, - Err(ServiceMessageError { - message_hash, - message_id, - required_weight, - }) => - // Too much weight required right now. - { - let is_under_limit = - Overweight::::count() < MAX_OVERWEIGHT_MESSAGES; - used.saturating_accrue(T::DbWeight::get().reads(1)); - if required_weight.any_gt(config.max_individual) && is_under_limit { - // overweight - add to overweight queue and continue with - // message execution. - let overweight_index = page_index.overweight_count; - Overweight::::insert(overweight_index, (sent_at, data)); - Self::deposit_event(Event::OverweightEnqueued { - message_hash, - message_id, - overweight_index, - required_weight, - }); - page_index.overweight_count += 1; - // Not needed for control flow, but only to ensure that the - // compiler understands that we won't attempt to re-use `data` - // later. - continue - } else { - // not overweight. stop executing inline and enqueue normally - // from here on. - let item_count_left = item_count.saturating_sub(i); - maybe_enqueue_page = Some(Vec::with_capacity(item_count_left)); - Self::deposit_event(Event::WeightExhausted { - message_hash, - message_id, - remaining_weight, - required_weight, - }); - } - }, - } - } - } - // Cannot be an `else` here since the `maybe_enqueue_page` may have changed. - if let Some(ref mut enqueue_page) = maybe_enqueue_page { - enqueue_page.push((sent_at, data)); - } - } - - // Deposit the enqueued page if any and save the index. - if let Some(enqueue_page) = maybe_enqueue_page { - Pages::::insert(page_index.end_used, enqueue_page); - page_index.end_used += 1; - } - PageIndex::::put(page_index); - - used - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate as dmp_queue; - - use codec::Encode; - use cumulus_primitives_core::ParaId; - use frame_support::{assert_noop, parameter_types, traits::OnIdle}; - use sp_core::H256; - use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, - DispatchError::BadOrigin, - }; - use sp_version::RuntimeVersion; - use std::cell::RefCell; - use xcm::latest::{MultiLocation, OriginKind}; - - type Block = frame_system::mocking::MockBlock; - type Xcm = xcm::latest::Xcm; - - frame_support::construct_runtime!( - pub enum Test - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - DmpQueue: dmp_queue::{Pallet, Call, Storage, Event}, - } - ); - - parameter_types! { - pub const BlockHashCount: u64 = 250; - pub Version: RuntimeVersion = RuntimeVersion { - spec_name: sp_version::create_runtime_str!("test"), - impl_name: sp_version::create_runtime_str!("system-test"), - authoring_version: 1, - spec_version: 1, - impl_version: 1, - apis: sp_version::create_apis_vec!([]), - transaction_version: 1, - state_version: 1, - }; - pub const ParachainId: ParaId = ParaId::new(200); - pub const ReservedXcmpWeight: Weight = Weight::zero(); - pub const ReservedDmpWeight: Weight = Weight::zero(); - } - - type AccountId = u64; - - impl frame_system::Config for Test { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockLength = (); - type BlockWeights = (); - type Version = Version; - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; - } - - thread_local! { - pub static TRACE: RefCell> = RefCell::new(Vec::new()); - } - pub fn take_trace() -> Vec<(Xcm, Outcome)> { - TRACE.with(|q| { - let q = &mut *q.borrow_mut(); - let r = q.clone(); - q.clear(); - r - }) - } - - pub struct MockPrepared(Xcm); - impl PreparedMessage for MockPrepared { - fn weight_of(&self) -> Weight { - match ((self.0).0.len(), &(self.0).0.first()) { - (1, Some(Transact { require_weight_at_most, .. })) => *require_weight_at_most, - _ => Weight::from_parts(1, 1), - } - } - } - - pub struct MockExec; - impl ExecuteXcm for MockExec { - type Prepared = MockPrepared; - - fn prepare(message: Xcm) -> Result { - Ok(MockPrepared(message)) - } - - fn execute( - _origin: impl Into, - prepared: MockPrepared, - _id: &mut XcmHash, - _weight_credit: Weight, - ) -> Outcome { - let message = prepared.0; - let o = match (message.0.len(), &message.0.first()) { - (1, Some(Transact { require_weight_at_most, .. })) => - Outcome::Complete(*require_weight_at_most), - // use 1000 to decide that it's not supported. - _ => Outcome::Incomplete(Weight::from_parts(1, 1), XcmError::Unimplemented), - }; - TRACE.with(|q| q.borrow_mut().push((message, o.clone()))); - o - } - - fn charge_fees(_location: impl Into, _fees: MultiAssets) -> XcmResult { - Err(XcmError::Unimplemented) - } - } - - impl Config for Test { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = MockExec; - type ExecuteOverweightOrigin = frame_system::EnsureRoot; - } - - pub(crate) fn new_test_ext() -> sp_io::TestExternalities { - frame_system::GenesisConfig::::default().build_storage().unwrap().into() - } - - fn enqueue(enqueued: &[Xcm]) { - if !enqueued.is_empty() { - let mut index = PageIndex::::get(); - Pages::::insert( - index.end_used, - enqueued - .iter() - .map(|m| (0, VersionedXcm::::from(m.clone()).encode())) - .collect::>(), - ); - index.end_used += 1; - PageIndex::::put(index); - } - } - - fn handle_messages(incoming: &[Xcm], limit: Weight) -> Weight { - let iter = incoming - .iter() - .map(|m| (0, VersionedXcm::::from(m.clone()).encode())); - DmpQueue::handle_dmp_messages(iter, limit) - } - - fn msg(weight: u64) -> Xcm { - Xcm(vec![Transact { - origin_kind: OriginKind::Native, - require_weight_at_most: Weight::from_parts(weight, weight), - call: Vec::new().into(), - }]) - } - - fn msg_complete(weight: u64) -> (Xcm, Outcome) { - (msg(weight), Outcome::Complete(Weight::from_parts(weight, weight))) - } - - fn pages_queued() -> PageCounter { - PageIndex::::get().end_used - PageIndex::::get().begin_used - } - - fn queue_is_empty() -> bool { - pages_queued() == 0 - } - - fn overweights() -> Vec { - (0..PageIndex::::get().overweight_count) - .filter(|i| Overweight::::contains_key(i)) - .collect::>() - } - - #[test] - fn basic_setup_works() { - new_test_ext().execute_with(|| { - let weight_used = handle_messages(&[], Weight::from_parts(1000, 1000)); - assert_eq!(weight_used, Weight::zero()); - assert_eq!(take_trace(), Vec::new()); - assert!(queue_is_empty()); - }); - } - - #[test] - fn service_inline_complete_works() { - new_test_ext().execute_with(|| { - let incoming = vec![msg(1000), msg(1001)]; - let weight_used = handle_messages(&incoming, Weight::from_parts(2500, 2500)); - assert_eq!(weight_used, Weight::from_parts(2001, 2001)); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1001)]); - assert!(queue_is_empty()); - }); - } - - #[test] - fn service_enqueued_works() { - new_test_ext().execute_with(|| { - let enqueued = vec![msg(1000), msg(1001), msg(1002)]; - enqueue(&enqueued); - let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); - assert_eq!(weight_used, Weight::from_parts(2001, 2001)); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1001),]); - }); - } - - #[test] - fn enqueue_works() { - new_test_ext().execute_with(|| { - let incoming = vec![msg(1000), msg(1001), msg(1002)]; - let weight_used = handle_messages(&incoming, Weight::from_parts(999, 999)); - assert_eq!(weight_used, Weight::zero()); - assert_eq!( - PageIndex::::get(), - PageIndexData { begin_used: 0, end_used: 1, overweight_count: 0 } - ); - assert_eq!(Pages::::get(0).len(), 3); - assert_eq!(take_trace(), vec![]); - - let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); - assert_eq!(weight_used, Weight::from_parts(2001, 2001)); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1001)]); - - let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); - assert_eq!(weight_used, Weight::from_parts(1002, 1002)); - assert_eq!(take_trace(), vec![msg_complete(1002)]); - assert!(queue_is_empty()); - }); - } - - #[test] - fn service_inline_then_enqueue_works() { - new_test_ext().execute_with(|| { - let incoming = vec![msg(1000), msg(1001), msg(1002)]; - let weight_used = handle_messages(&incoming, Weight::from_parts(1500, 1500)); - assert_eq!(weight_used, Weight::from_parts(1000, 1000)); - assert_eq!(pages_queued(), 1); - assert_eq!(Pages::::get(0).len(), 2); - assert_eq!(take_trace(), vec![msg_complete(1000)]); - - let weight_used = handle_messages(&[], Weight::from_parts(2500, 2500)); - assert_eq!(weight_used, Weight::from_parts(2003, 2003)); - assert_eq!(take_trace(), vec![msg_complete(1001), msg_complete(1002),]); - assert!(queue_is_empty()); - }); - } - - #[test] - fn service_enqueued_and_inline_works() { - new_test_ext().execute_with(|| { - let enqueued = vec![msg(1000), msg(1001)]; - let incoming = vec![msg(1002), msg(1003)]; - enqueue(&enqueued); - let weight_used = handle_messages(&incoming, Weight::from_parts(5000, 5000)); - assert_eq!(weight_used, Weight::from_parts(4006, 4006)); - assert_eq!( - take_trace(), - vec![ - msg_complete(1000), - msg_complete(1001), - msg_complete(1002), - msg_complete(1003), - ] - ); - assert!(queue_is_empty()); - }); - } - - #[test] - fn service_enqueued_partially_and_then_enqueue_works() { - new_test_ext().execute_with(|| { - let enqueued = vec![msg(1000), msg(10001)]; - let incoming = vec![msg(1002), msg(1003)]; - enqueue(&enqueued); - let weight_used = handle_messages(&incoming, Weight::from_parts(5000, 5000)); - assert_eq!(weight_used, Weight::from_parts(1000, 1000)); - assert_eq!(take_trace(), vec![msg_complete(1000)]); - assert_eq!(pages_queued(), 2); - - // 5000 is not enough to process the 10001 blocker, so nothing happens. - let weight_used = handle_messages(&[], Weight::from_parts(5000, 5000)); - assert_eq!(weight_used, Weight::zero()); - assert_eq!(take_trace(), vec![]); - - // 20000 is now enough to process everything. - let weight_used = handle_messages(&[], Weight::from_parts(20000, 20000)); - assert_eq!(weight_used, Weight::from_parts(12006, 12006)); - assert_eq!( - take_trace(), - vec![msg_complete(10001), msg_complete(1002), msg_complete(1003),] - ); - assert!(queue_is_empty()); - }); - } - - #[test] - fn service_enqueued_completely_and_then_enqueue_works() { - new_test_ext().execute_with(|| { - let enqueued = vec![msg(1000), msg(1001)]; - let incoming = vec![msg(10002), msg(1003)]; - enqueue(&enqueued); - let weight_used = handle_messages(&incoming, Weight::from_parts(5000, 5000)); - assert_eq!(weight_used, Weight::from_parts(2001, 2001)); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1001)]); - assert_eq!(pages_queued(), 1); - - // 20000 is now enough to process everything. - let weight_used = handle_messages(&[], Weight::from_parts(20000, 20000)); - assert_eq!(weight_used, Weight::from_parts(11005, 11005)); - assert_eq!(take_trace(), vec![msg_complete(10002), msg_complete(1003),]); - assert!(queue_is_empty()); - }); - } - - #[test] - fn service_enqueued_then_inline_then_enqueue_works() { - new_test_ext().execute_with(|| { - let enqueued = vec![msg(1000), msg(1001)]; - let incoming = vec![msg(1002), msg(10003)]; - enqueue(&enqueued); - let weight_used = handle_messages(&incoming, Weight::from_parts(5000, 5000)); - assert_eq!(weight_used, Weight::from_parts(3003, 3003)); - assert_eq!( - take_trace(), - vec![msg_complete(1000), msg_complete(1001), msg_complete(1002),] - ); - assert_eq!(pages_queued(), 1); - - // 20000 is now enough to process everything. - let weight_used = handle_messages(&[], Weight::from_parts(20000, 20000)); - assert_eq!(weight_used, Weight::from_parts(10003, 10003)); - assert_eq!(take_trace(), vec![msg_complete(10003),]); - assert!(queue_is_empty()); - }); - } - - #[test] - fn page_crawling_works() { - new_test_ext().execute_with(|| { - let enqueued = vec![msg(1000), msg(1001)]; - enqueue(&enqueued); - let weight_used = handle_messages(&[msg(1002)], Weight::from_parts(1500, 1500)); - assert_eq!(weight_used, Weight::from_parts(1000, 1000)); - assert_eq!(take_trace(), vec![msg_complete(1000)]); - assert_eq!(pages_queued(), 2); - assert_eq!(PageIndex::::get().begin_used, 0); - - let weight_used = handle_messages(&[msg(1003)], Weight::from_parts(1500, 1500)); - assert_eq!(weight_used, Weight::from_parts(1001, 1001)); - assert_eq!(take_trace(), vec![msg_complete(1001)]); - assert_eq!(pages_queued(), 2); - assert_eq!(PageIndex::::get().begin_used, 1); - - let weight_used = handle_messages(&[msg(1004)], Weight::from_parts(1500, 1500)); - assert_eq!(weight_used, Weight::from_parts(1002, 1002)); - assert_eq!(take_trace(), vec![msg_complete(1002)]); - assert_eq!(pages_queued(), 2); - assert_eq!(PageIndex::::get().begin_used, 2); - }); - } - - #[test] - fn overweight_should_not_block_queue() { - new_test_ext().execute_with(|| { - // Set the overweight threshold to 9999. - Configuration::::put(ConfigData { - max_individual: Weight::from_parts(9999, 9999), - }); - - let incoming = vec![msg(1000), msg(10001), msg(1002)]; - let weight_used = handle_messages(&incoming, Weight::from_parts(2500, 2500)); - assert_eq!(weight_used, Weight::from_parts(2002, 2002)); - assert!(queue_is_empty()); - assert_eq!(take_trace(), vec![msg_complete(1000), msg_complete(1002),]); - - assert_eq!(overweights(), vec![0]); - }); - } - - #[test] - fn overweights_should_be_manually_executable() { - new_test_ext().execute_with(|| { - // Set the overweight threshold to 9999. - Configuration::::put(ConfigData { - max_individual: Weight::from_parts(9999, 9999), - }); - - let incoming = vec![msg(10000)]; - let weight_used = handle_messages(&incoming, Weight::from_parts(2500, 2500)); - assert_eq!(weight_used, Weight::zero()); - assert_eq!(take_trace(), vec![]); - assert_eq!(overweights(), vec![0]); - - assert_noop!( - DmpQueue::service_overweight( - RuntimeOrigin::signed(1), - 0, - Weight::from_parts(20000, 20000) - ), - BadOrigin - ); - assert_noop!( - DmpQueue::service_overweight( - RuntimeOrigin::root(), - 1, - Weight::from_parts(20000, 20000) - ), - Error::::Unknown - ); - assert_noop!( - DmpQueue::service_overweight( - RuntimeOrigin::root(), - 0, - Weight::from_parts(9999, 9999) - ), - Error::::OverLimit - ); - assert_eq!(take_trace(), vec![]); - - let base_weight = - super::Call::::service_overweight { index: 0, weight_limit: Weight::zero() } - .get_dispatch_info() - .weight; - use frame_support::dispatch::GetDispatchInfo; - let info = DmpQueue::service_overweight( - RuntimeOrigin::root(), - 0, - Weight::from_parts(20000, 20000), - ) - .unwrap(); - let actual_weight = info.actual_weight.unwrap(); - assert_eq!(actual_weight, base_weight + Weight::from_parts(10000, 10000)); - assert_eq!(take_trace(), vec![msg_complete(10000)]); - assert!(overweights().is_empty()); - - assert_noop!( - DmpQueue::service_overweight( - RuntimeOrigin::root(), - 0, - Weight::from_parts(20000, 20000) - ), - Error::::Unknown - ); - }); - } - - #[test] - fn on_idle_should_service_queue() { - new_test_ext().execute_with(|| { - enqueue(&[msg(1000), msg(1001)]); - enqueue(&[msg(1002), msg(1003)]); - enqueue(&[msg(1004), msg(1005)]); - - let weight_used = DmpQueue::on_idle(1, Weight::from_parts(6000, 6000)); - assert_eq!(weight_used, Weight::from_parts(5010, 5010)); - assert_eq!( - take_trace(), - vec![ - msg_complete(1000), - msg_complete(1001), - msg_complete(1002), - msg_complete(1003), - msg_complete(1004), - ] - ); - assert_eq!(pages_queued(), 1); - }); - } - - #[test] - fn handle_max_messages_per_block() { - new_test_ext().execute_with(|| { - enqueue(&[msg(1000), msg(1001)]); - enqueue(&[msg(1002), msg(1003)]); - enqueue(&[msg(1004), msg(1005)]); - - let incoming = - (0..MAX_MESSAGES_PER_BLOCK).map(|i| msg(1006 + i as u64)).collect::>(); - handle_messages(&incoming, Weight::from_parts(25000, 25000)); - - assert_eq!( - take_trace(), - (0..MAX_MESSAGES_PER_BLOCK) - .map(|i| msg_complete(1000 + i as u64)) - .collect::>(), - ); - assert_eq!(pages_queued(), 1); - - handle_messages(&[], Weight::from_parts(25000, 25000)); - assert_eq!( - take_trace(), - (MAX_MESSAGES_PER_BLOCK..MAX_MESSAGES_PER_BLOCK + 6) - .map(|i| msg_complete(1000 + i as u64)) - .collect::>(), - ); - }); - } -} diff --git a/cumulus/pallets/dmp-queue/src/migration.rs b/cumulus/pallets/dmp-queue/src/migration.rs deleted file mode 100644 index b2323f6a60fa..000000000000 --- a/cumulus/pallets/dmp-queue/src/migration.rs +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! A module that is responsible for migration of storage. - -use crate::{Config, Configuration, Overweight, Pallet, DEFAULT_POV_SIZE}; -use frame_support::{ - pallet_prelude::*, - traits::{OnRuntimeUpgrade, StorageVersion}, - weights::{constants::WEIGHT_REF_TIME_PER_MILLIS, Weight}, -}; - -/// The current storage version. -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); - -/// Migrates the pallet storage to the most recent version. -pub struct Migration(PhantomData); - -impl OnRuntimeUpgrade for Migration { - fn on_runtime_upgrade() -> Weight { - let mut weight = T::DbWeight::get().reads(1); - - if StorageVersion::get::>() == 0 { - weight.saturating_accrue(migrate_to_v1::()); - StorageVersion::new(1).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } - - if StorageVersion::get::>() == 1 { - weight.saturating_accrue(migrate_to_v2::()); - StorageVersion::new(2).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } - - weight - } -} - -mod v0 { - use super::*; - use codec::{Decode, Encode}; - - #[derive(Decode, Encode, Debug)] - pub struct ConfigData { - pub max_individual: u64, - } - - impl Default for ConfigData { - fn default() -> Self { - ConfigData { max_individual: 10u64 * WEIGHT_REF_TIME_PER_MILLIS } - } - } -} - -/// Migrates `QueueConfigData` from v1 (using only reference time weights) to v2 (with -/// 2D weights). -/// -/// NOTE: Only use this function if you know what you're doing. Default to using -/// `migrate_to_latest`. -pub fn migrate_to_v1() -> Weight { - let translate = |pre: v0::ConfigData| -> super::ConfigData { - super::ConfigData { - max_individual: Weight::from_parts(pre.max_individual, DEFAULT_POV_SIZE), - } - }; - - if Configuration::::translate(|pre| pre.map(translate)).is_err() { - log::error!( - target: "dmp_queue", - "unexpected error when performing translation of the QueueConfig type during storage upgrade to v2" - ); - } - - T::DbWeight::get().reads_writes(1, 1) -} - -/// Migrates `Overweight` so that it initializes the storage map's counter. -/// -/// NOTE: Only use this function if you know what you're doing. Default to using -/// `migrate_to_latest`. -pub fn migrate_to_v2() -> Weight { - let overweight_messages = Overweight::::initialize_counter() as u64; - - T::DbWeight::get().reads_writes(overweight_messages, 1) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::tests::{new_test_ext, Test}; - - #[test] - fn test_migration_to_v1() { - let v0 = v0::ConfigData { max_individual: 30_000_000_000 }; - - new_test_ext().execute_with(|| { - frame_support::storage::unhashed::put_raw( - &crate::Configuration::::hashed_key(), - &v0.encode(), - ); - - migrate_to_v1::(); - - let v1 = crate::Configuration::::get(); - - assert_eq!(v0.max_individual, v1.max_individual.ref_time()); - assert_eq!(v1.max_individual.proof_size(), DEFAULT_POV_SIZE); - }); - } -} diff --git a/cumulus/pallets/parachain-system/Cargo.toml b/cumulus/pallets/parachain-system/Cargo.toml deleted file mode 100644 index ef2666c10d52..000000000000 --- a/cumulus/pallets/parachain-system/Cargo.toml +++ /dev/null @@ -1,80 +0,0 @@ -[package] -name = "cumulus-pallet-parachain-system" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Base pallet for cumulus-based parachains" - -[dependencies] -bytes = { version = "1.4.0", default-features = false } -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -environmental = { version = "1.1.4", default-features = false } -impl-trait-for-tuples = "0.2.1" -log = { version = "0.4.20", default-features = false } -trie-db = { version = "0.27.1", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-externalities = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, features = [ "wasm-api" ], branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system-proc-macro = { path = "proc-macro", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent", default-features = false } - -[dev-dependencies] -hex-literal = "0.4.1" -lazy_static = "1.4" - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Cumulus -cumulus-test-client = { path = "../../test/client" } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "environmental/std", - "log/std", - "scale-info/std", - "cumulus-pallet-parachain-system-proc-macro/std", - "cumulus-primitives-core/std", - "cumulus-primitives-parachain-inherent/std", - "frame-support/std", - "frame-system/std", - "sp-core/std", - "sp-externalities/std", - "sp-io/std", - "sp-runtime/std", - "sp-state-machine/std", - "sp-std/std", - "sp-trie/std", - "xcm/std", - "trie-db/std", -] - -runtime-benchmarks = [ - "sp-runtime/runtime-benchmarks" -] - -try-runtime = ["frame-support/try-runtime"] diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml deleted file mode 100644 index fbadb909c67e..000000000000 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "cumulus-pallet-parachain-system-proc-macro" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Proc macros provided by the parachain-system pallet" - -[lib] -proc-macro = true - -[dependencies] -syn = "2.0.28" -proc-macro2 = "1.0.64" -quote = "1.0.32" -proc-macro-crate = "1.3.1" - -[features] -default = [ "std" ] -std = [] diff --git a/cumulus/pallets/parachain-system/proc-macro/src/lib.rs b/cumulus/pallets/parachain-system/proc-macro/src/lib.rs deleted file mode 100644 index 490b9c17c448..000000000000 --- a/cumulus/pallets/parachain-system/proc-macro/src/lib.rs +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use proc_macro2::{Span, TokenStream}; -use proc_macro_crate::{crate_name, FoundCrate}; -use syn::{ - parse::{Parse, ParseStream}, - spanned::Spanned, - token, Error, Ident, Path, -}; - -mod keywords { - syn::custom_keyword!(Runtime); - syn::custom_keyword!(BlockExecutor); - syn::custom_keyword!(CheckInherents); -} - -struct Input { - runtime: Path, - block_executor: Path, - check_inherents: Path, -} - -impl Parse for Input { - fn parse(input: ParseStream) -> Result { - let mut runtime = None; - let mut block_executor = None; - let mut check_inherents = None; - - fn parse_inner( - input: ParseStream, - result: &mut Option, - ) -> Result<(), Error> { - let kw = input.parse::()?; - - if result.is_none() { - input.parse::()?; - *result = Some(input.parse::()?); - if input.peek(token::Comma) { - input.parse::()?; - } - - Ok(()) - } else { - Err(Error::new(kw.span(), "Is only allowed to be passed once")) - } - } - - while runtime.is_none() || block_executor.is_none() || check_inherents.is_none() { - let lookahead = input.lookahead1(); - - if lookahead.peek(keywords::Runtime) { - parse_inner::(input, &mut runtime)?; - } else if lookahead.peek(keywords::BlockExecutor) { - parse_inner::(input, &mut block_executor)?; - } else if lookahead.peek(keywords::CheckInherents) { - parse_inner::(input, &mut check_inherents)?; - } else { - return Err(lookahead.error()) - } - } - - let rest = input.parse::()?; - if !rest.is_empty() { - return Err(Error::new(rest.span(), "Unexpected input data")) - } - - Ok(Self { - runtime: runtime.expect("Everything is parsed before; qed"), - block_executor: block_executor.expect("Everything is parsed before; qed"), - check_inherents: check_inherents.expect("Everything is parsed before; qed"), - }) - } -} - -fn crate_() -> Result { - match crate_name("cumulus-pallet-parachain-system") { - Ok(FoundCrate::Itself) => - Ok(syn::Ident::new("cumulus_pallet_parachain_system", Span::call_site())), - Ok(FoundCrate::Name(name)) => Ok(Ident::new(&name, Span::call_site())), - Err(e) => Err(Error::new(Span::call_site(), e)), - } -} - -#[proc_macro] -pub fn register_validate_block(input: proc_macro::TokenStream) -> proc_macro::TokenStream { - let Input { runtime, check_inherents, block_executor } = match syn::parse(input) { - Ok(t) => t, - Err(e) => return e.into_compile_error().into(), - }; - - let crate_ = match crate_() { - Ok(c) => c, - Err(e) => return e.into_compile_error().into(), - }; - - if cfg!(not(feature = "std")) { - quote::quote! { - #[doc(hidden)] - mod parachain_validate_block { - use super::*; - - #[no_mangle] - unsafe fn validate_block(arguments: *mut u8, arguments_len: usize) -> u64 { - // We convert the `arguments` into a boxed slice and then into `Bytes`. - let args = #crate_::validate_block::sp_std::boxed::Box::from_raw( - #crate_::validate_block::sp_std::slice::from_raw_parts_mut( - arguments, - arguments_len, - ) - ); - let args = #crate_::validate_block::bytes::Bytes::from(args); - - // Then we decode from these bytes the `MemoryOptimizedValidationParams`. - let params = #crate_::validate_block::decode_from_bytes::< - #crate_::validate_block::MemoryOptimizedValidationParams - >(args).expect("Invalid arguments to `validate_block`."); - - let res = #crate_::validate_block::implementation::validate_block::< - <#runtime as #crate_::validate_block::GetRuntimeBlockType>::RuntimeBlock, - #block_executor, - #runtime, - #check_inherents, - >(params); - - #crate_::validate_block::polkadot_parachain::write_result(&res) - } - } - } - } else { - quote::quote!() - } - .into() -} diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs deleted file mode 100644 index 27a12b953fac..000000000000 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ /dev/null @@ -1,1277 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] - -//! `cumulus-pallet-parachain-system` is a base pallet for Cumulus-based parachains. -//! -//! This pallet handles low-level details of being a parachain. Its responsibilities include: -//! -//! - ingestion of the parachain validation data; -//! - ingestion and dispatch of incoming downward and lateral messages; -//! - coordinating upgrades with the Relay Chain; and -//! - communication of parachain outputs, such as sent messages, signaling an upgrade, etc. -//! -//! Users must ensure that they register this pallet as an inherent provider. - -use codec::{Decode, Encode, MaxEncodedLen}; -use cumulus_primitives_core::{ - relay_chain, AbridgedHostConfiguration, ChannelStatus, CollationInfo, DmpMessageHandler, - GetChannelInfo, InboundDownwardMessage, InboundHrmpMessage, MessageSendError, - OutboundHrmpMessage, ParaId, PersistedValidationData, UpwardMessage, UpwardMessageSender, - XcmpMessageHandler, XcmpMessageSource, -}; -use cumulus_primitives_parachain_inherent::{MessageQueueChain, ParachainInherentData}; -use frame_support::{ - dispatch::{DispatchError, DispatchResult, Pays, PostDispatchInfo}, - ensure, - inherent::{InherentData, InherentIdentifier, ProvideInherent}, - storage, - traits::Get, - weights::Weight, - RuntimeDebug, -}; -use frame_system::{ensure_none, ensure_root, pallet_prelude::HeaderFor}; -use polkadot_parachain::primitives::RelayChainBlockNumber; -use scale_info::TypeInfo; -use sp_runtime::{ - traits::{Block as BlockT, BlockNumberProvider, Hash}, - transaction_validity::{ - InvalidTransaction, TransactionLongevity, TransactionSource, TransactionValidity, - ValidTransaction, - }, -}; -use sp_std::{cmp, collections::btree_map::BTreeMap, prelude::*}; -use xcm::latest::XcmHash; - -pub mod migration; -mod relay_state_snapshot; -#[macro_use] -pub mod validate_block; -#[cfg(test)] -mod tests; - -/// Register the `validate_block` function that is used by parachains to validate blocks on a -/// validator. -/// -/// Does *nothing* when `std` feature is enabled. -/// -/// Expects as parameters the runtime, a block executor and an inherent checker. -/// -/// # Example -/// -/// ``` -/// struct BlockExecutor; -/// struct Runtime; -/// struct CheckInherents; -/// -/// cumulus_pallet_parachain_system::register_validate_block! { -/// Runtime = Runtime, -/// BlockExecutor = Executive, -/// CheckInherents = CheckInherents, -/// } -/// -/// # fn main() {} -/// ``` -pub use cumulus_pallet_parachain_system_proc_macro::register_validate_block; -pub use relay_state_snapshot::{MessagingStateSnapshot, RelayChainStateProof}; - -pub use pallet::*; - -/// Something that can check the associated relay block number. -/// -/// Each Parachain block is built in the context of a relay chain block, this trait allows us -/// to validate the given relay chain block number. With async backing it is legal to build -/// multiple Parachain blocks per relay chain parent. With this trait it is possible for the -/// Parachain to ensure that still only one Parachain block is build per relay chain parent. -/// -/// By default [`RelayNumberStrictlyIncreases`] and [`AnyRelayNumber`] are provided. -pub trait CheckAssociatedRelayNumber { - /// Check the current relay number versus the previous relay number. - /// - /// The implementation should panic when there is something wrong. - fn check_associated_relay_number( - current: RelayChainBlockNumber, - previous: RelayChainBlockNumber, - ); -} - -/// Provides an implementation of [`CheckAssociatedRelayNumber`]. -/// -/// It will ensure that the associated relay block number strictly increases between Parachain -/// blocks. This should be used by production Parachains when in doubt. -pub struct RelayNumberStrictlyIncreases; - -impl CheckAssociatedRelayNumber for RelayNumberStrictlyIncreases { - fn check_associated_relay_number( - current: RelayChainBlockNumber, - previous: RelayChainBlockNumber, - ) { - if current <= previous { - panic!("Relay chain block number needs to strictly increase between Parachain blocks!") - } - } -} - -/// Provides an implementation of [`CheckAssociatedRelayNumber`]. -/// -/// This will accept any relay chain block number combination. This is mainly useful for -/// test parachains. -pub struct AnyRelayNumber; - -impl CheckAssociatedRelayNumber for AnyRelayNumber { - fn check_associated_relay_number(_: RelayChainBlockNumber, _: RelayChainBlockNumber) {} -} - -/// Information needed when a new runtime binary is submitted and needs to be authorized before -/// replacing the current runtime. -#[derive(Decode, Encode, Default, PartialEq, Eq, MaxEncodedLen, TypeInfo)] -#[scale_info(skip_type_params(T))] -struct CodeUpgradeAuthorization -where - T: Config, -{ - /// Hash of the new runtime binary. - code_hash: T::Hash, - /// Whether or not to carry out version checks. - check_version: bool, -} - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - #[pallet::storage_version(migration::STORAGE_VERSION)] - #[pallet::without_storage_info] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config> { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// Something which can be notified when the validation data is set. - type OnSystemEvent: OnSystemEvent; - - /// Returns the parachain ID we are running with. - type SelfParaId: Get; - - /// The place where outbound XCMP messages come from. This is queried in `finalize_block`. - type OutboundXcmpMessageSource: XcmpMessageSource; - - /// The message handler that will be invoked when messages are received via DMP. - type DmpMessageHandler: DmpMessageHandler; - - /// The weight we reserve at the beginning of the block for processing DMP messages. - type ReservedDmpWeight: Get; - - /// The message handler that will be invoked when messages are received via XCMP. - /// - /// The messages are dispatched in the order they were relayed by the relay chain. If - /// multiple messages were relayed at one block, these will be dispatched in ascending - /// order of the sender's para ID. - type XcmpMessageHandler: XcmpMessageHandler; - - /// The weight we reserve at the beginning of the block for processing XCMP messages. - type ReservedXcmpWeight: Get; - - /// Something that can check the associated relay parent block number. - type CheckAssociatedRelayNumber: CheckAssociatedRelayNumber; - } - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_finalize(_: BlockNumberFor) { - >::kill(); - >::kill(); - - assert!( - >::exists(), - "set_validation_data inherent needs to be present in every block!" - ); - - let host_config = match Self::host_configuration() { - Some(ok) => ok, - None => { - debug_assert!( - false, - "host configuration is promised to set until `on_finalize`; qed", - ); - return - }, - }; - let relevant_messaging_state = match Self::relevant_messaging_state() { - Some(ok) => ok, - None => { - debug_assert!( - false, - "relevant messaging state is promised to be set until `on_finalize`; \ - qed", - ); - return - }, - }; - - >::mutate(|up| { - let queue_size = relevant_messaging_state.relay_dispatch_queue_remaining_capacity; - - let available_capacity = cmp::min( - queue_size.remaining_count, - host_config.max_upward_message_num_per_candidate.into(), - ); - let available_size = queue_size.remaining_size; - - // Count the number of messages we can possibly fit in the given constraints, i.e. - // available_capacity and available_size. - let num = up - .iter() - .scan((available_capacity as usize, available_size as usize), |state, msg| { - let (cap_left, size_left) = *state; - match (cap_left.checked_sub(1), size_left.checked_sub(msg.len())) { - (Some(new_cap), Some(new_size)) => { - *state = (new_cap, new_size); - Some(()) - }, - _ => None, - } - }) - .count(); - - // TODO: #274 Return back messages that do not longer fit into the queue. - - UpwardMessages::::put(&up[..num]); - *up = up.split_off(num); - }); - - // Sending HRMP messages is a little bit more involved. There are the following - // constraints: - // - // - a channel should exist (and it can be closed while a message is buffered), - // - at most one message can be sent in a channel, - // - the sent out messages should be ordered by ascension of recipient para id. - // - the capacity and total size of the channel is limited, - // - the maximum size of a message is limited (and can potentially be changed), - - let maximum_channels = host_config - .hrmp_max_message_num_per_candidate - .min(>::take()) as usize; - - let outbound_messages = - T::OutboundXcmpMessageSource::take_outbound_messages(maximum_channels) - .into_iter() - .map(|(recipient, data)| OutboundHrmpMessage { recipient, data }) - .collect::>(); - - HrmpOutboundMessages::::put(outbound_messages); - } - - fn on_initialize(_n: BlockNumberFor) -> Weight { - let mut weight = Weight::zero(); - - // To prevent removing `NewValidationCode` that was set by another `on_initialize` - // like for example from scheduler, we only kill the storage entry if it was not yet - // updated in the current block. - if !>::get() { - NewValidationCode::::kill(); - weight += T::DbWeight::get().writes(1); - } - - // Remove the validation from the old block. - ValidationData::::kill(); - ProcessedDownwardMessages::::kill(); - HrmpWatermark::::kill(); - UpwardMessages::::kill(); - HrmpOutboundMessages::::kill(); - CustomValidationHeadData::::kill(); - - weight += T::DbWeight::get().writes(6); - - // Here, in `on_initialize` we must report the weight for both `on_initialize` and - // `on_finalize`. - // - // One complication here, is that the `host_configuration` is updated by an inherent - // and those are processed after the block initialization phase. Therefore, we have to - // be content only with the configuration as per the previous block. That means that - // the configuration can be either stale (or be abscent altogether in case of the - // beginning of the chain). - // - // In order to mitigate this, we do the following. At the time, we are only concerned - // about `hrmp_max_message_num_per_candidate`. We reserve the amount of weight to - // process the number of HRMP messages according to the potentially stale - // configuration. In `on_finalize` we will process only the maximum between the - // announced number of messages and the actual received in the fresh configuration. - // - // In the common case, they will be the same. In the case the actual value is smaller - // than the announced, we would waste some of weight. In the case the actual value is - // greater than the announced, we will miss opportunity to send a couple of messages. - weight += T::DbWeight::get().reads_writes(1, 1); - let hrmp_max_message_num_per_candidate = Self::host_configuration() - .map(|cfg| cfg.hrmp_max_message_num_per_candidate) - .unwrap_or(0); - >::put(hrmp_max_message_num_per_candidate); - - // NOTE that the actual weight consumed by `on_finalize` may turn out lower. - weight += T::DbWeight::get().reads_writes( - 3 + hrmp_max_message_num_per_candidate as u64, - 4 + hrmp_max_message_num_per_candidate as u64, - ); - - weight - } - } - - #[pallet::call] - impl Pallet { - /// Set the current validation data. - /// - /// This should be invoked exactly once per block. It will panic at the finalization - /// phase if the call was not invoked. - /// - /// The dispatch origin for this call must be `Inherent` - /// - /// As a side effect, this function upgrades the current validation function - /// if the appropriate time has come. - #[pallet::call_index(0)] - #[pallet::weight((0, DispatchClass::Mandatory))] - // TODO: This weight should be corrected. - pub fn set_validation_data( - origin: OriginFor, - data: ParachainInherentData, - ) -> DispatchResultWithPostInfo { - ensure_none(origin)?; - assert!( - !>::exists(), - "ValidationData must be updated only once in a block", - ); - - let ParachainInherentData { - validation_data: vfp, - relay_chain_state, - downward_messages, - horizontal_messages, - } = data; - - // Check that the associated relay chain block number is as expected. - T::CheckAssociatedRelayNumber::check_associated_relay_number( - vfp.relay_parent_number, - LastRelayChainBlockNumber::::get(), - ); - LastRelayChainBlockNumber::::put(vfp.relay_parent_number); - - let relay_state_proof = RelayChainStateProof::new( - T::SelfParaId::get(), - vfp.relay_parent_storage_root, - relay_chain_state.clone(), - ) - .expect("Invalid relay chain state proof"); - - // Deposit a log indicating the relay-parent storage root. - // TODO: remove this in favor of the relay-parent's hash after - // https://github.com/paritytech/cumulus/issues/303 - frame_system::Pallet::::deposit_log( - cumulus_primitives_core::rpsr_digest::relay_parent_storage_root_item( - vfp.relay_parent_storage_root, - vfp.relay_parent_number, - ), - ); - - // initialization logic: we know that this runs exactly once every block, - // which means we can put the initialization logic here to remove the - // sequencing problem. - let upgrade_go_ahead_signal = relay_state_proof - .read_upgrade_go_ahead_signal() - .expect("Invalid upgrade go ahead signal"); - match upgrade_go_ahead_signal { - Some(relay_chain::UpgradeGoAhead::GoAhead) => { - assert!( - >::exists(), - "No new validation function found in storage, GoAhead signal is not expected", - ); - let validation_code = >::take(); - - Self::put_parachain_code(&validation_code); - ::on_validation_code_applied(); - Self::deposit_event(Event::ValidationFunctionApplied { - relay_chain_block_num: vfp.relay_parent_number, - }); - }, - Some(relay_chain::UpgradeGoAhead::Abort) => { - >::kill(); - Self::deposit_event(Event::ValidationFunctionDiscarded); - }, - None => {}, - } - >::put( - relay_state_proof - .read_upgrade_restriction_signal() - .expect("Invalid upgrade restriction signal"), - ); - - let host_config = relay_state_proof - .read_abridged_host_configuration() - .expect("Invalid host configuration in relay chain state proof"); - let relevant_messaging_state = relay_state_proof - .read_messaging_state_snapshot(&host_config) - .expect("Invalid messaging state in relay chain state proof"); - - >::put(&vfp); - >::put(relay_chain_state); - >::put(relevant_messaging_state.clone()); - >::put(host_config); - - ::on_validation_data(&vfp); - - // TODO: This is more than zero, but will need benchmarking to figure out what. - let mut total_weight = Weight::zero(); - total_weight += Self::process_inbound_downward_messages( - relevant_messaging_state.dmq_mqc_head, - downward_messages, - ); - total_weight += Self::process_inbound_horizontal_messages( - &relevant_messaging_state.ingress_channels, - horizontal_messages, - vfp.relay_parent_number, - ); - - Ok(PostDispatchInfo { actual_weight: Some(total_weight), pays_fee: Pays::No }) - } - - #[pallet::call_index(1)] - #[pallet::weight((1_000, DispatchClass::Operational))] - pub fn sudo_send_upward_message( - origin: OriginFor, - message: UpwardMessage, - ) -> DispatchResult { - ensure_root(origin)?; - let _ = Self::send_upward_message(message); - Ok(()) - } - - /// Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied - /// later. - /// - /// The `check_version` parameter sets a boolean flag for whether or not the runtime's spec - /// version and name should be verified on upgrade. Since the authorization only has a hash, - /// it cannot actually perform the verification. - /// - /// This call requires Root origin. - #[pallet::call_index(2)] - #[pallet::weight((1_000_000, DispatchClass::Operational))] - pub fn authorize_upgrade( - origin: OriginFor, - code_hash: T::Hash, - check_version: bool, - ) -> DispatchResult { - ensure_root(origin)?; - AuthorizedUpgrade::::put(CodeUpgradeAuthorization { code_hash, check_version }); - - Self::deposit_event(Event::UpgradeAuthorized { code_hash }); - Ok(()) - } - - /// Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. - /// - /// If the authorization required a version check, this call will ensure the spec name - /// remains unchanged and that the spec version has increased. - /// - /// Note that this function will not apply the new `code`, but only attempt to schedule the - /// upgrade with the Relay Chain. - /// - /// All origins are allowed. - #[pallet::call_index(3)] - #[pallet::weight({1_000_000})] - pub fn enact_authorized_upgrade( - _: OriginFor, - code: Vec, - ) -> DispatchResultWithPostInfo { - Self::validate_authorized_upgrade(&code[..])?; - Self::schedule_code_upgrade(code)?; - AuthorizedUpgrade::::kill(); - Ok(Pays::No.into()) - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// The validation function has been scheduled to apply. - ValidationFunctionStored, - /// The validation function was applied as of the contained relay chain block number. - ValidationFunctionApplied { relay_chain_block_num: RelayChainBlockNumber }, - /// The relay-chain aborted the upgrade process. - ValidationFunctionDiscarded, - /// An upgrade has been authorized. - UpgradeAuthorized { code_hash: T::Hash }, - /// Some downward messages have been received and will be processed. - DownwardMessagesReceived { count: u32 }, - /// Downward messages were processed using the given weight. - DownwardMessagesProcessed { weight_used: Weight, dmq_head: relay_chain::Hash }, - /// An upward message was sent to the relay chain. - UpwardMessageSent { message_hash: Option }, - } - - #[pallet::error] - pub enum Error { - /// Attempt to upgrade validation function while existing upgrade pending. - OverlappingUpgrades, - /// Polkadot currently prohibits this parachain from upgrading its validation function. - ProhibitedByPolkadot, - /// The supplied validation function has compiled into a blob larger than Polkadot is - /// willing to run. - TooBig, - /// The inherent which supplies the validation data did not run this block. - ValidationDataNotAvailable, - /// The inherent which supplies the host configuration did not run this block. - HostConfigurationNotAvailable, - /// No validation function upgrade is currently scheduled. - NotScheduled, - /// No code upgrade has been authorized. - NothingAuthorized, - /// The given code upgrade has not been authorized. - Unauthorized, - } - - /// In case of a scheduled upgrade, this storage field contains the validation code to be - /// applied. - /// - /// As soon as the relay chain gives us the go-ahead signal, we will overwrite the - /// [`:code`][sp_core::storage::well_known_keys::CODE] which will result the next block process - /// with the new validation code. This concludes the upgrade process. - #[pallet::storage] - #[pallet::getter(fn new_validation_function)] - pub(super) type PendingValidationCode = StorageValue<_, Vec, ValueQuery>; - - /// Validation code that is set by the parachain and is to be communicated to collator and - /// consequently the relay-chain. - /// - /// This will be cleared in `on_initialize` of each new block if no other pallet already set - /// the value. - #[pallet::storage] - pub(super) type NewValidationCode = StorageValue<_, Vec, OptionQuery>; - - /// The [`PersistedValidationData`] set for this block. - /// This value is expected to be set only once per block and it's never stored - /// in the trie. - #[pallet::storage] - #[pallet::getter(fn validation_data)] - pub(super) type ValidationData = StorageValue<_, PersistedValidationData>; - - /// Were the validation data set to notify the relay chain? - #[pallet::storage] - pub(super) type DidSetValidationCode = StorageValue<_, bool, ValueQuery>; - - /// The relay chain block number associated with the last parachain block. - #[pallet::storage] - pub(super) type LastRelayChainBlockNumber = - StorageValue<_, RelayChainBlockNumber, ValueQuery>; - - /// An option which indicates if the relay-chain restricts signalling a validation code upgrade. - /// In other words, if this is `Some` and [`NewValidationCode`] is `Some` then the produced - /// candidate will be invalid. - /// - /// This storage item is a mirror of the corresponding value for the current parachain from the - /// relay-chain. This value is ephemeral which means it doesn't hit the storage. This value is - /// set after the inherent. - #[pallet::storage] - pub(super) type UpgradeRestrictionSignal = - StorageValue<_, Option, ValueQuery>; - - /// The state proof for the last relay parent block. - /// - /// This field is meant to be updated each block with the validation data inherent. Therefore, - /// before processing of the inherent, e.g. in `on_initialize` this data may be stale. - /// - /// This data is also absent from the genesis. - #[pallet::storage] - #[pallet::getter(fn relay_state_proof)] - pub(super) type RelayStateProof = StorageValue<_, sp_trie::StorageProof>; - - /// The snapshot of some state related to messaging relevant to the current parachain as per - /// the relay parent. - /// - /// This field is meant to be updated each block with the validation data inherent. Therefore, - /// before processing of the inherent, e.g. in `on_initialize` this data may be stale. - /// - /// This data is also absent from the genesis. - #[pallet::storage] - #[pallet::getter(fn relevant_messaging_state)] - pub(super) type RelevantMessagingState = StorageValue<_, MessagingStateSnapshot>; - - /// The parachain host configuration that was obtained from the relay parent. - /// - /// This field is meant to be updated each block with the validation data inherent. Therefore, - /// before processing of the inherent, e.g. in `on_initialize` this data may be stale. - /// - /// This data is also absent from the genesis. - #[pallet::storage] - #[pallet::getter(fn host_configuration)] - pub(super) type HostConfiguration = StorageValue<_, AbridgedHostConfiguration>; - - /// The last downward message queue chain head we have observed. - /// - /// This value is loaded before and saved after processing inbound downward messages carried - /// by the system inherent. - #[pallet::storage] - pub(super) type LastDmqMqcHead = StorageValue<_, MessageQueueChain, ValueQuery>; - - /// The message queue chain heads we have observed per each channel incoming channel. - /// - /// This value is loaded before and saved after processing inbound downward messages carried - /// by the system inherent. - #[pallet::storage] - pub(super) type LastHrmpMqcHeads = - StorageValue<_, BTreeMap, ValueQuery>; - - /// Number of downward messages processed in a block. - /// - /// This will be cleared in `on_initialize` of each new block. - #[pallet::storage] - pub(super) type ProcessedDownwardMessages = StorageValue<_, u32, ValueQuery>; - - /// HRMP watermark that was set in a block. - /// - /// This will be cleared in `on_initialize` of each new block. - #[pallet::storage] - pub(super) type HrmpWatermark = - StorageValue<_, relay_chain::BlockNumber, ValueQuery>; - - /// HRMP messages that were sent in a block. - /// - /// This will be cleared in `on_initialize` of each new block. - #[pallet::storage] - pub(super) type HrmpOutboundMessages = - StorageValue<_, Vec, ValueQuery>; - - /// Upward messages that were sent in a block. - /// - /// This will be cleared in `on_initialize` of each new block. - #[pallet::storage] - pub(super) type UpwardMessages = StorageValue<_, Vec, ValueQuery>; - - /// Upward messages that are still pending and not yet send to the relay chain. - #[pallet::storage] - pub(super) type PendingUpwardMessages = - StorageValue<_, Vec, ValueQuery>; - - /// The number of HRMP messages we observed in `on_initialize` and thus used that number for - /// announcing the weight of `on_initialize` and `on_finalize`. - #[pallet::storage] - pub(super) type AnnouncedHrmpMessagesPerCandidate = StorageValue<_, u32, ValueQuery>; - - /// The weight we reserve at the beginning of the block for processing XCMP messages. This - /// overrides the amount set in the Config trait. - #[pallet::storage] - pub(super) type ReservedXcmpWeightOverride = StorageValue<_, Weight>; - - /// The weight we reserve at the beginning of the block for processing DMP messages. This - /// overrides the amount set in the Config trait. - #[pallet::storage] - pub(super) type ReservedDmpWeightOverride = StorageValue<_, Weight>; - - /// The next authorized upgrade, if there is one. - #[pallet::storage] - pub(super) type AuthorizedUpgrade = StorageValue<_, CodeUpgradeAuthorization>; - - /// A custom head data that should be returned as result of `validate_block`. - /// - /// See `Pallet::set_custom_validation_head_data` for more information. - #[pallet::storage] - pub(super) type CustomValidationHeadData = StorageValue<_, Vec, OptionQuery>; - - #[pallet::inherent] - impl ProvideInherent for Pallet { - type Call = Call; - type Error = sp_inherents::MakeFatalError<()>; - const INHERENT_IDENTIFIER: InherentIdentifier = - cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER; - - fn create_inherent(data: &InherentData) -> Option { - let data: ParachainInherentData = - data.get_data(&Self::INHERENT_IDENTIFIER).ok().flatten().expect( - "validation function params are always injected into inherent data; qed", - ); - - Some(Call::set_validation_data { data }) - } - - fn is_inherent(call: &Self::Call) -> bool { - matches!(call, Call::set_validation_data { .. }) - } - } - - #[pallet::genesis_config] - #[derive(frame_support::DefaultNoBound)] - pub struct GenesisConfig { - #[serde(skip)] - pub _config: sp_std::marker::PhantomData, - } - - #[pallet::genesis_build] - impl BuildGenesisConfig for GenesisConfig { - fn build(&self) { - // TODO: Remove after https://github.com/paritytech/cumulus/issues/479 - sp_io::storage::set(b":c", &[]); - } - } - - #[pallet::validate_unsigned] - impl sp_runtime::traits::ValidateUnsigned for Pallet { - type Call = Call; - - fn validate_unsigned(_source: TransactionSource, call: &Self::Call) -> TransactionValidity { - if let Call::enact_authorized_upgrade { ref code } = call { - if let Ok(hash) = Self::validate_authorized_upgrade(code) { - return Ok(ValidTransaction { - priority: 100, - requires: Vec::new(), - provides: vec![hash.as_ref().to_vec()], - longevity: TransactionLongevity::max_value(), - propagate: true, - }) - } - } - if let Call::set_validation_data { .. } = call { - return Ok(Default::default()) - } - Err(InvalidTransaction::Call.into()) - } - } -} - -impl Pallet { - fn validate_authorized_upgrade(code: &[u8]) -> Result { - let authorization = AuthorizedUpgrade::::get().ok_or(Error::::NothingAuthorized)?; - - // ensure that the actual hash matches the authorized hash - let actual_hash = T::Hashing::hash(code); - ensure!(actual_hash == authorization.code_hash, Error::::Unauthorized); - - // check versions if required as part of the authorization - if authorization.check_version { - frame_system::Pallet::::can_set_code(code)?; - } - - Ok(actual_hash) - } -} - -impl GetChannelInfo for Pallet { - fn get_channel_status(id: ParaId) -> ChannelStatus { - // Note, that we are using `relevant_messaging_state` which may be from the previous - // block, in case this is called from `on_initialize`, i.e. before the inherent with - // fresh data is submitted. - // - // That shouldn't be a problem though because this is anticipated and already can - // happen. This is because sending implies that a message is buffered until there is - // space to send a message in the candidate. After a while waiting in a buffer, it may - // be discovered that the channel to which a message were addressed is now closed. - // Another possibility, is that the maximum message size was decreased so that a - // message in the buffer doesn't fit. Should any of that happen the sender should be - // notified about the message was discarded. - // - // Here it a similar case, with the difference that the realization that the channel is - // closed came the same block. - let channels = match Self::relevant_messaging_state() { - None => { - log::warn!("calling `get_channel_status` with no RelevantMessagingState?!"); - return ChannelStatus::Closed - }, - Some(d) => d.egress_channels, - }; - // ^^^ NOTE: This storage field should carry over from the previous block. So if it's - // None then it must be that this is an edge-case where a message is attempted to be - // sent at the first block. It should be safe to assume that there are no channels - // opened at all so early. At least, relying on this assumption seems to be a better - // trade-off, compared to introducing an error variant that the clients should be - // prepared to handle. - let index = match channels.binary_search_by_key(&id, |item| item.0) { - Err(_) => return ChannelStatus::Closed, - Ok(i) => i, - }; - let meta = &channels[index].1; - if meta.msg_count + 1 > meta.max_capacity { - // The channel is at its capacity. Skip it for now. - return ChannelStatus::Full - } - let max_size_now = meta.max_total_size - meta.total_size; - let max_size_ever = meta.max_message_size; - ChannelStatus::Ready(max_size_now as usize, max_size_ever as usize) - } - - fn get_channel_max(id: ParaId) -> Option { - let channels = Self::relevant_messaging_state()?.egress_channels; - let index = channels.binary_search_by_key(&id, |item| item.0).ok()?; - Some(channels[index].1.max_message_size as usize) - } -} - -impl Pallet { - /// Process all inbound downward messages relayed by the collator. - /// - /// Checks if the sequence of the messages is valid, dispatches them and communicates the - /// number of processed messages to the collator via a storage update. - /// - /// # Panics - /// - /// If it turns out that after processing all messages the Message Queue Chain - /// hash doesn't match the expected. - fn process_inbound_downward_messages( - expected_dmq_mqc_head: relay_chain::Hash, - downward_messages: Vec, - ) -> Weight { - let dm_count = downward_messages.len() as u32; - let mut dmq_head = >::get(); - - let mut weight_used = Weight::zero(); - if dm_count != 0 { - Self::deposit_event(Event::DownwardMessagesReceived { count: dm_count }); - let max_weight = - >::get().unwrap_or_else(T::ReservedDmpWeight::get); - - let message_iter = downward_messages - .into_iter() - .inspect(|m| { - dmq_head.extend_downward(m); - }) - .map(|m| (m.sent_at, m.msg)); - weight_used += T::DmpMessageHandler::handle_dmp_messages(message_iter, max_weight); - >::put(&dmq_head); - - Self::deposit_event(Event::DownwardMessagesProcessed { - weight_used, - dmq_head: dmq_head.head(), - }); - } - - // After hashing each message in the message queue chain submitted by the collator, we - // should arrive to the MQC head provided by the relay chain. - // - // A mismatch means that at least some of the submitted messages were altered, omitted or - // added improperly. - assert_eq!(dmq_head.head(), expected_dmq_mqc_head); - - ProcessedDownwardMessages::::put(dm_count); - - weight_used - } - - /// Process all inbound horizontal messages relayed by the collator. - /// - /// This is similar to `Pallet::process_inbound_downward_messages`, but works on multiple - /// inbound channels. - /// - /// **Panics** if either any of horizontal messages submitted by the collator was sent from - /// a para which has no open channel to this parachain or if after processing - /// messages across all inbound channels MQCs were obtained which do not - /// correspond to the ones found on the relay-chain. - fn process_inbound_horizontal_messages( - ingress_channels: &[(ParaId, cumulus_primitives_core::AbridgedHrmpChannel)], - horizontal_messages: BTreeMap>, - relay_parent_number: relay_chain::BlockNumber, - ) -> Weight { - // First, check that all submitted messages are sent from channels that exist. The - // channel exists if its MQC head is present in `vfp.hrmp_mqc_heads`. - for sender in horizontal_messages.keys() { - // A violation of the assertion below indicates that one of the messages submitted - // by the collator was sent from a sender that doesn't have a channel opened to - // this parachain, according to the relay-parent state. - assert!(ingress_channels.binary_search_by_key(sender, |&(s, _)| s).is_ok(),); - } - - // Second, prepare horizontal messages for a more convenient processing: - // - // instead of a mapping from a para to a list of inbound HRMP messages, we will have a - // list of tuples `(sender, message)` first ordered by `sent_at` (the relay chain block - // number in which the message hit the relay-chain) and second ordered by para id - // ascending. - // - // The messages will be dispatched in this order. - let mut horizontal_messages = horizontal_messages - .into_iter() - .flat_map(|(sender, channel_contents)| { - channel_contents.into_iter().map(move |message| (sender, message)) - }) - .collect::>(); - horizontal_messages.sort_by(|a, b| { - // first sort by sent-at and then by the para id - match a.1.sent_at.cmp(&b.1.sent_at) { - cmp::Ordering::Equal => a.0.cmp(&b.0), - ord => ord, - } - }); - - let last_mqc_heads = >::get(); - let mut running_mqc_heads = BTreeMap::new(); - let mut hrmp_watermark = None; - - { - for (sender, ref horizontal_message) in &horizontal_messages { - if hrmp_watermark.map(|w| w < horizontal_message.sent_at).unwrap_or(true) { - hrmp_watermark = Some(horizontal_message.sent_at); - } - - running_mqc_heads - .entry(sender) - .or_insert_with(|| last_mqc_heads.get(sender).cloned().unwrap_or_default()) - .extend_hrmp(horizontal_message); - } - } - let message_iter = horizontal_messages - .iter() - .map(|&(sender, ref message)| (sender, message.sent_at, &message.data[..])); - - let max_weight = - >::get().unwrap_or_else(T::ReservedXcmpWeight::get); - let weight_used = T::XcmpMessageHandler::handle_xcmp_messages(message_iter, max_weight); - - // Check that the MQC heads for each channel provided by the relay chain match the MQC - // heads we have after processing all incoming messages. - // - // Along the way we also carry over the relevant entries from the `last_mqc_heads` to - // `running_mqc_heads`. Otherwise, in a block where no messages were sent in a channel - // it won't get into next block's `last_mqc_heads` and thus will be all zeros, which - // would corrupt the message queue chain. - for (sender, channel) in ingress_channels { - let cur_head = running_mqc_heads - .entry(sender) - .or_insert_with(|| last_mqc_heads.get(sender).cloned().unwrap_or_default()) - .head(); - let target_head = channel.mqc_head.unwrap_or_default(); - - assert!(cur_head == target_head); - } - - >::put(running_mqc_heads); - - // If we processed at least one message, then advance watermark to that location or if there - // were no messages, set it to the block number of the relay parent. - HrmpWatermark::::put(hrmp_watermark.unwrap_or(relay_parent_number)); - - weight_used - } - - /// Put a new validation function into a particular location where polkadot - /// monitors for updates. Calling this function notifies polkadot that a new - /// upgrade has been scheduled. - fn notify_polkadot_of_pending_upgrade(code: &[u8]) { - NewValidationCode::::put(code); - >::put(true); - } - - /// Put a new validation function into a particular location where this - /// parachain will execute it on subsequent blocks. - fn put_parachain_code(code: &[u8]) { - storage::unhashed::put_raw(sp_core::storage::well_known_keys::CODE, code); - } - - /// The maximum code size permitted, in bytes. - /// - /// Returns `None` if the relay chain parachain host configuration hasn't been submitted yet. - pub fn max_code_size() -> Option { - >::get().map(|cfg| cfg.max_code_size) - } - - /// The implementation of the runtime upgrade functionality for parachains. - pub fn schedule_code_upgrade(validation_function: Vec) -> DispatchResult { - // Ensure that `ValidationData` exists. We do not care about the validation data per se, - // but we do care about the [`UpgradeRestrictionSignal`] which arrives with the same - // inherent. - ensure!(>::exists(), Error::::ValidationDataNotAvailable,); - ensure!(>::get().is_none(), Error::::ProhibitedByPolkadot); - - ensure!(!>::exists(), Error::::OverlappingUpgrades); - let cfg = Self::host_configuration().ok_or(Error::::HostConfigurationNotAvailable)?; - ensure!(validation_function.len() <= cfg.max_code_size as usize, Error::::TooBig); - - // When a code upgrade is scheduled, it has to be applied in two - // places, synchronized: both polkadot and the individual parachain - // have to upgrade on the same relay chain block. - // - // `notify_polkadot_of_pending_upgrade` notifies polkadot; the `PendingValidationCode` - // storage keeps track locally for the parachain upgrade, which will - // be applied later: when the relay-chain communicates go-ahead signal to us. - Self::notify_polkadot_of_pending_upgrade(&validation_function); - >::put(validation_function); - Self::deposit_event(Event::ValidationFunctionStored); - - Ok(()) - } - - /// Returns the [`CollationInfo`] of the current active block. - /// - /// The given `header` is the header of the built block we are collecting the collation info - /// for. - /// - /// This is expected to be used by the - /// [`CollectCollationInfo`](cumulus_primitives_core::CollectCollationInfo) runtime api. - pub fn collect_collation_info(header: &HeaderFor) -> CollationInfo { - CollationInfo { - hrmp_watermark: HrmpWatermark::::get(), - horizontal_messages: HrmpOutboundMessages::::get(), - upward_messages: UpwardMessages::::get(), - processed_downward_messages: ProcessedDownwardMessages::::get(), - new_validation_code: NewValidationCode::::get().map(Into::into), - // Check if there is a custom header that will also be returned by the validation phase. - // If so, we need to also return it here. - head_data: CustomValidationHeadData::::get() - .map_or_else(|| header.encode(), |v| v) - .into(), - } - } - - /// Set a custom head data that should be returned as result of `validate_block`. - /// - /// This will overwrite the head data that is returned as result of `validate_block` while - /// validating a `PoV` on the relay chain. Normally the head data that is being returned - /// by `validate_block` is the header of the block that is validated, thus it can be - /// enacted as the new best block. However, for features like forking it can be useful - /// to overwrite the head data with a custom header. - /// - /// # Attention - /// - /// This should only be used when you are sure what you are doing as this can brick - /// your Parachain. - pub fn set_custom_validation_head_data(head_data: Vec) { - CustomValidationHeadData::::put(head_data); - } - - /// Open HRMP channel for using it in benchmarks. - /// - /// The caller assumes that the pallet will accept regular outbound message to the sibling - /// `target_parachain` after this call. No other assumptions are made. - #[cfg(feature = "runtime-benchmarks")] - pub fn open_outbound_hrmp_channel_for_benchmarks(target_parachain: ParaId) { - RelevantMessagingState::::put(MessagingStateSnapshot { - dmq_mqc_head: Default::default(), - relay_dispatch_queue_remaining_capacity: Default::default(), - ingress_channels: Default::default(), - egress_channels: vec![( - target_parachain, - cumulus_primitives_core::AbridgedHrmpChannel { - max_capacity: 10, - max_total_size: 10_000_000_u32, - max_message_size: 10_000_000_u32, - msg_count: 5, - total_size: 5_000_000_u32, - mqc_head: None, - }, - )], - }) - } - - /// Prepare/insert relevant data for `schedule_code_upgrade` for benchmarks. - #[cfg(feature = "runtime-benchmarks")] - pub fn initialize_for_set_code_benchmark(max_code_size: u32) { - // insert dummy ValidationData - let vfp = PersistedValidationData { - parent_head: polkadot_parachain::primitives::HeadData(Default::default()), - relay_parent_number: 1, - relay_parent_storage_root: Default::default(), - max_pov_size: 1_000, - }; - >::put(&vfp); - - // insert dummy HostConfiguration with - let host_config = AbridgedHostConfiguration { - max_code_size, - max_head_data_size: 32 * 1024, - max_upward_queue_count: 8, - max_upward_queue_size: 1024 * 1024, - max_upward_message_size: 4 * 1024, - max_upward_message_num_per_candidate: 2, - hrmp_max_message_num_per_candidate: 2, - validation_upgrade_cooldown: 2, - validation_upgrade_delay: 2, - }; - >::put(host_config); - } -} - -pub struct ParachainSetCode(sp_std::marker::PhantomData); - -impl frame_system::SetCode for ParachainSetCode { - fn set_code(code: Vec) -> DispatchResult { - Pallet::::schedule_code_upgrade(code) - } -} - -impl Pallet { - pub fn send_upward_message(message: UpwardMessage) -> Result<(u32, XcmHash), MessageSendError> { - // Check if the message fits into the relay-chain constraints. - // - // Note, that we are using `host_configuration` here which may be from the previous - // block, in case this is called from `on_initialize`, i.e. before the inherent with fresh - // data is submitted. - // - // That shouldn't be a problem since this is a preliminary check and the actual check would - // be performed just before submitting the message from the candidate, and it already can - // happen that during the time the message is buffered for sending the relay-chain setting - // may change so that the message is no longer valid. - // - // However, changing this setting is expected to be rare. - if let Some(cfg) = Self::host_configuration() { - if message.len() > cfg.max_upward_message_size as usize { - return Err(MessageSendError::TooBig) - } - } else { - // This storage field should carry over from the previous block. So if it's None - // then it must be that this is an edge-case where a message is attempted to be - // sent at the first block. - // - // Let's pass this message through. I think it's not unreasonable to expect that - // the message is not huge and it comes through, but if it doesn't it can be - // returned back to the sender. - // - // Thus fall through here. - }; - >::append(message.clone()); - - // The relay ump does not use using_encoded - // We apply the same this to use the same hash - let hash = sp_io::hashing::blake2_256(&message); - Self::deposit_event(Event::UpwardMessageSent { message_hash: Some(hash) }); - Ok((0, hash)) - } -} - -impl UpwardMessageSender for Pallet { - fn send_upward_message(message: UpwardMessage) -> Result<(u32, XcmHash), MessageSendError> { - Self::send_upward_message(message) - } -} - -/// Something that can check the inherents of a block. -pub trait CheckInherents { - /// Check all inherents of the block. - /// - /// This function gets passed all the extrinsics of the block, so it is up to the callee to - /// identify the inherents. The `validation_data` can be used to access the - fn check_inherents( - block: &Block, - validation_data: &RelayChainStateProof, - ) -> frame_support::inherent::CheckInherentsResult; -} - -/// Something that should be informed about system related events. -/// -/// This includes events like [`on_validation_data`](Self::on_validation_data) that is being -/// called when the parachain inherent is executed that contains the validation data. -/// Or like [`on_validation_code_applied`](Self::on_validation_code_applied) that is called -/// when the new validation is written to the state. This means that -/// from the next block the runtime is being using this new code. -#[impl_trait_for_tuples::impl_for_tuples(30)] -pub trait OnSystemEvent { - /// Called in each blocks once when the validation data is set by the inherent. - fn on_validation_data(data: &PersistedValidationData); - /// Called when the validation code is being applied, aka from the next block on this is the new - /// runtime. - fn on_validation_code_applied(); -} - -/// Holds the most recent relay-parent state root and block number of the current parachain block. -#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo, Default, RuntimeDebug)] -pub struct RelayChainState { - /// Current relay chain height. - pub number: relay_chain::BlockNumber, - /// State root for current relay chain height. - pub state_root: relay_chain::Hash, -} - -/// This exposes the [`RelayChainState`] to other runtime modules. -/// -/// Enables parachains to read relay chain state via state proofs. -pub trait RelaychainStateProvider { - /// May be called by any runtime module to obtain the current state of the relay chain. - /// - /// **NOTE**: This is not guaranteed to return monotonically increasing relay parents. - fn current_relay_chain_state() -> RelayChainState; -} - -/// Implements [`BlockNumberProvider`] that returns relay chain block number fetched from validation -/// data. When validation data is not available (e.g. within on_initialize), 0 will be returned. -/// -/// **NOTE**: This has been deprecated, please use [`RelaychainDataProvider`] -#[deprecated = "Use `RelaychainDataProvider` instead"] -pub struct RelaychainBlockNumberProvider(sp_std::marker::PhantomData); - -#[allow(deprecated)] -impl BlockNumberProvider for RelaychainBlockNumberProvider { - type BlockNumber = relay_chain::BlockNumber; - - fn current_block_number() -> relay_chain::BlockNumber { - Pallet::::validation_data() - .map(|d| d.relay_parent_number) - .unwrap_or_default() - } - - #[cfg(feature = "runtime-benchmarks")] - fn set_block_number(block: Self::BlockNumber) { - let mut validation_data = Pallet::::validation_data().unwrap_or_else(|| - // PersistedValidationData does not impl default in non-std - PersistedValidationData { - parent_head: vec![].into(), - relay_parent_number: Default::default(), - max_pov_size: Default::default(), - relay_parent_storage_root: Default::default(), - }); - validation_data.relay_parent_number = block; - ValidationData::::put(validation_data) - } -} - -impl RelaychainStateProvider for RelaychainDataProvider { - fn current_relay_chain_state() -> RelayChainState { - Pallet::::validation_data() - .map(|d| RelayChainState { - number: d.relay_parent_number, - state_root: d.relay_parent_storage_root, - }) - .unwrap_or_default() - } -} - -/// Implements [`BlockNumberProvider`] and [`RelaychainStateProvider`] that returns relevant relay -/// data fetched from validation data. -/// NOTE: When validation data is not available (e.g. within on_initialize), default values will be -/// returned. -pub struct RelaychainDataProvider(sp_std::marker::PhantomData); - -impl BlockNumberProvider for RelaychainDataProvider { - type BlockNumber = relay_chain::BlockNumber; - - fn current_block_number() -> relay_chain::BlockNumber { - Pallet::::validation_data() - .map(|d| d.relay_parent_number) - .unwrap_or_default() - } - - #[cfg(feature = "runtime-benchmarks")] - fn set_block_number(block: Self::BlockNumber) { - let mut validation_data = Pallet::::validation_data().unwrap_or_else(|| - // PersistedValidationData does not impl default in non-std - PersistedValidationData { - parent_head: vec![].into(), - relay_parent_number: Default::default(), - max_pov_size: Default::default(), - relay_parent_storage_root: Default::default(), - }); - validation_data.relay_parent_number = block; - ValidationData::::put(validation_data) - } -} diff --git a/cumulus/pallets/parachain-system/src/migration.rs b/cumulus/pallets/parachain-system/src/migration.rs deleted file mode 100644 index 17dce3a11a9d..000000000000 --- a/cumulus/pallets/parachain-system/src/migration.rs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::{Config, Pallet, ReservedDmpWeightOverride, ReservedXcmpWeightOverride}; -use frame_support::{ - pallet_prelude::*, - traits::{Get, OnRuntimeUpgrade, StorageVersion}, - weights::Weight, -}; - -/// The current storage version. -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); - -/// Migrates the pallet storage to the most recent version. -pub struct Migration(PhantomData); - -impl OnRuntimeUpgrade for Migration { - fn on_runtime_upgrade() -> Weight { - let mut weight: Weight = T::DbWeight::get().reads(2); - - if StorageVersion::get::>() == 0 { - weight = weight - .saturating_add(v1::migrate::()) - .saturating_add(T::DbWeight::get().writes(1)); - StorageVersion::new(1).put::>(); - } - - if StorageVersion::get::>() == 1 { - weight = weight - .saturating_add(v2::migrate::()) - .saturating_add(T::DbWeight::get().writes(1)); - StorageVersion::new(2).put::>(); - } - - weight - } -} - -/// V2: Migrate to 2D weights for ReservedXcmpWeightOverride and ReservedDmpWeightOverride. -mod v2 { - use super::*; - const DEFAULT_POV_SIZE: u64 = 64 * 1024; // 64 KB - - pub fn migrate() -> Weight { - let translate = |pre: u64| -> Weight { Weight::from_parts(pre, DEFAULT_POV_SIZE) }; - - if ReservedXcmpWeightOverride::::translate(|pre| pre.map(translate)).is_err() { - log::error!( - target: "parachain_system", - "unexpected error when performing translation of the ReservedXcmpWeightOverride type during storage upgrade to v2" - ); - } - - if ReservedDmpWeightOverride::::translate(|pre| pre.map(translate)).is_err() { - log::error!( - target: "parachain_system", - "unexpected error when performing translation of the ReservedDmpWeightOverride type during storage upgrade to v2" - ); - } - - T::DbWeight::get().reads_writes(2, 2) - } -} - -/// V1: `LastUpgrade` block number is removed from the storage since the upgrade -/// mechanism now uses signals instead of block offsets. -mod v1 { - use crate::{Config, Pallet}; - #[allow(deprecated)] - use frame_support::{migration::remove_storage_prefix, pallet_prelude::*}; - - pub fn migrate() -> Weight { - #[allow(deprecated)] - remove_storage_prefix(>::name().as_bytes(), b"LastUpgrade", b""); - T::DbWeight::get().writes(1) - } -} diff --git a/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs b/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs deleted file mode 100644 index 8f371191a7e9..000000000000 --- a/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use codec::{Decode, Encode}; -use cumulus_primitives_core::{ - relay_chain, AbridgedHostConfiguration, AbridgedHrmpChannel, ParaId, -}; -use scale_info::TypeInfo; -use sp_runtime::traits::HashingFor; -use sp_state_machine::{Backend, TrieBackend, TrieBackendBuilder}; -use sp_std::vec::Vec; -use sp_trie::{HashDBT, MemoryDB, StorageProof, EMPTY_PREFIX}; - -/// The capacity of the upward message queue of a parachain on the relay chain. -// The field order should stay the same as the data can be found in the proof to ensure both are -// have the same encoded representation. -#[derive(Clone, Encode, Decode, TypeInfo, Default)] -pub struct RelayDispatchQueueRemainingCapacity { - /// The number of additional messages that can be enqueued. - pub remaining_count: u32, - /// The total size of additional messages that can be enqueued. - pub remaining_size: u32, -} - -/// A snapshot of some messaging related state of relay chain pertaining to the current parachain. -/// -/// This data is essential for making sure that the parachain is aware of current resource use on -/// the relay chain and that the candidates produced for this parachain do not exceed any of these -/// limits. -#[derive(Clone, Encode, Decode, TypeInfo)] -pub struct MessagingStateSnapshot { - /// The current message queue chain head for downward message queue. - /// - /// If the value is absent on the relay chain this will be set to all zeros. - pub dmq_mqc_head: relay_chain::Hash, - - /// The current capacity of the upward message queue of the current parachain on the relay - /// chain. - pub relay_dispatch_queue_remaining_capacity: RelayDispatchQueueRemainingCapacity, - - /// Information about all the inbound HRMP channels. - /// - /// These are structured as a list of tuples. The para id in the tuple specifies the sender - /// of the channel. Obviously, the recipient is the current parachain. - /// - /// The channels are sorted by the sender para id ascension. - pub ingress_channels: Vec<(ParaId, AbridgedHrmpChannel)>, - - /// Information about all the outbound HRMP channels. - /// - /// These are structured as a list of tuples. The para id in the tuple specifies the recipient - /// of the channel. Obviously, the sender is the current parachain. - /// - /// The channels are sorted by the recipient para id ascension. - pub egress_channels: Vec<(ParaId, AbridgedHrmpChannel)>, -} - -#[derive(Debug)] -pub enum Error { - /// The provided proof was created against unexpected storage root. - RootMismatch, - /// The entry cannot be read. - ReadEntry(ReadEntryErr), - /// The optional entry cannot be read. - ReadOptionalEntry(ReadEntryErr), - /// The slot cannot be extracted. - Slot(ReadEntryErr), - /// The upgrade go-ahead signal cannot be read. - UpgradeGoAhead(ReadEntryErr), - /// The upgrade restriction signal cannot be read. - UpgradeRestriction(ReadEntryErr), - /// The host configuration cannot be extracted. - Config(ReadEntryErr), - /// The DMQ MQC head cannot be extracted. - DmqMqcHead(ReadEntryErr), - /// Relay dispatch queue cannot be extracted. - RelayDispatchQueueRemainingCapacity(ReadEntryErr), - /// The hrmp inress channel index cannot be extracted. - HrmpIngressChannelIndex(ReadEntryErr), - /// The hrmp egress channel index cannot be extracted. - HrmpEgressChannelIndex(ReadEntryErr), - /// The channel identified by the sender and receiver cannot be extracted. - HrmpChannel(ParaId, ParaId, ReadEntryErr), -} - -#[derive(Debug)] -pub enum ReadEntryErr { - /// The value cannot be extracted from the proof. - Proof, - /// The value cannot be decoded. - Decode, - /// The value is expected to be present on the relay chain, but it doesn't exist. - Absent, -} - -/// Read an entry given by the key and try to decode it. If the value specified by the key according -/// to the proof is empty, the `fallback` value will be returned. -/// -/// Returns `Err` in case the backend can't return the value under the specific key (likely due to -/// a malformed proof), in case the decoding fails, or in case where the value is empty in the relay -/// chain state and no fallback was provided. -fn read_entry(backend: &B, key: &[u8], fallback: Option) -> Result -where - T: Decode, - B: Backend>, -{ - backend - .storage(key) - .map_err(|_| ReadEntryErr::Proof)? - .map(|raw_entry| T::decode(&mut &raw_entry[..]).map_err(|_| ReadEntryErr::Decode)) - .transpose()? - .or(fallback) - .ok_or(ReadEntryErr::Absent) -} - -/// Read an optional entry given by the key and try to decode it. -/// Returns `None` if the value specified by the key according to the proof is empty. -/// -/// Returns `Err` in case the backend can't return the value under the specific key (likely due to -/// a malformed proof) or if the value couldn't be decoded. -fn read_optional_entry(backend: &B, key: &[u8]) -> Result, ReadEntryErr> -where - T: Decode, - B: Backend>, -{ - match read_entry(backend, key, None) { - Ok(v) => Ok(Some(v)), - Err(ReadEntryErr::Absent) => Ok(None), - Err(err) => Err(err), - } -} - -/// A state proof extracted from the relay chain. -/// -/// This state proof is extracted from the relay chain block we are building on top of. -pub struct RelayChainStateProof { - para_id: ParaId, - trie_backend: - TrieBackend>, HashingFor>, -} - -impl RelayChainStateProof { - /// Create a new instance of `Self`. - /// - /// Returns an error if the given `relay_parent_storage_root` is not the root of the given - /// `proof`. - pub fn new( - para_id: ParaId, - relay_parent_storage_root: relay_chain::Hash, - proof: StorageProof, - ) -> Result { - let db = proof.into_memory_db::>(); - if !db.contains(&relay_parent_storage_root, EMPTY_PREFIX) { - return Err(Error::RootMismatch) - } - let trie_backend = TrieBackendBuilder::new(db, relay_parent_storage_root).build(); - - Ok(Self { para_id, trie_backend }) - } - - /// Read the [`MessagingStateSnapshot`] from the relay chain state proof. - /// - /// Returns an error if anything failed at reading or decoding. - pub fn read_messaging_state_snapshot( - &self, - host_config: &AbridgedHostConfiguration, - ) -> Result { - let dmq_mqc_head: relay_chain::Hash = read_entry( - &self.trie_backend, - &relay_chain::well_known_keys::dmq_mqc_head(self.para_id), - Some(Default::default()), - ) - .map_err(Error::DmqMqcHead)?; - - let relay_dispatch_queue_remaining_capacity = read_optional_entry::< - RelayDispatchQueueRemainingCapacity, - _, - >( - &self.trie_backend, - &relay_chain::well_known_keys::relay_dispatch_queue_remaining_capacity(self.para_id) - .key, - ); - - // TODO paritytech/polkadot#6283: Remove all usages of `relay_dispatch_queue_size` - // - // When the relay chain and all parachains support - // `relay_dispatch_queue_remaining_capacity`, this code here needs to be removed and above - // needs to be changed to `read_entry` that returns an error if - // `relay_dispatch_queue_remaining_capacity` can not be found/decoded. - // - // For now we just fallback to the old dispatch queue size on `ReadEntryErr::Absent`. - // `ReadEntryErr::Decode` and `ReadEntryErr::Proof` are potentially subject to meddling - // by malicious collators, so we reject the block in those cases. - let relay_dispatch_queue_remaining_capacity = match relay_dispatch_queue_remaining_capacity - { - Ok(Some(r)) => r, - Ok(None) => { - let res = read_entry::<(u32, u32), _>( - &self.trie_backend, - #[allow(deprecated)] - &relay_chain::well_known_keys::relay_dispatch_queue_size(self.para_id), - Some((0, 0)), - ) - .map_err(Error::RelayDispatchQueueRemainingCapacity)?; - - let remaining_count = host_config.max_upward_queue_count.saturating_sub(res.0); - let remaining_size = host_config.max_upward_queue_size.saturating_sub(res.1); - RelayDispatchQueueRemainingCapacity { remaining_count, remaining_size } - }, - Err(e) => return Err(Error::RelayDispatchQueueRemainingCapacity(e)), - }; - - let ingress_channel_index: Vec = read_entry( - &self.trie_backend, - &relay_chain::well_known_keys::hrmp_ingress_channel_index(self.para_id), - Some(Vec::new()), - ) - .map_err(Error::HrmpIngressChannelIndex)?; - - let egress_channel_index: Vec = read_entry( - &self.trie_backend, - &relay_chain::well_known_keys::hrmp_egress_channel_index(self.para_id), - Some(Vec::new()), - ) - .map_err(Error::HrmpEgressChannelIndex)?; - - let mut ingress_channels = Vec::with_capacity(ingress_channel_index.len()); - for sender in ingress_channel_index { - let channel_id = relay_chain::HrmpChannelId { sender, recipient: self.para_id }; - let hrmp_channel: AbridgedHrmpChannel = read_entry( - &self.trie_backend, - &relay_chain::well_known_keys::hrmp_channels(channel_id), - None, - ) - .map_err(|read_err| Error::HrmpChannel(sender, self.para_id, read_err))?; - ingress_channels.push((sender, hrmp_channel)); - } - - let mut egress_channels = Vec::with_capacity(egress_channel_index.len()); - for recipient in egress_channel_index { - let channel_id = relay_chain::HrmpChannelId { sender: self.para_id, recipient }; - let hrmp_channel: AbridgedHrmpChannel = read_entry( - &self.trie_backend, - &relay_chain::well_known_keys::hrmp_channels(channel_id), - None, - ) - .map_err(|read_err| Error::HrmpChannel(self.para_id, recipient, read_err))?; - egress_channels.push((recipient, hrmp_channel)); - } - - // NOTE that ingress_channels and egress_channels promise to be sorted. We satisfy this - // property by relying on the fact that `ingress_channel_index` and `egress_channel_index` - // are themselves sorted. - Ok(MessagingStateSnapshot { - dmq_mqc_head, - relay_dispatch_queue_remaining_capacity, - ingress_channels, - egress_channels, - }) - } - - /// Read the [`AbridgedHostConfiguration`] from the relay chain state proof. - /// - /// Returns an error if anything failed at reading or decoding. - pub fn read_abridged_host_configuration(&self) -> Result { - read_entry(&self.trie_backend, relay_chain::well_known_keys::ACTIVE_CONFIG, None) - .map_err(Error::Config) - } - - /// Read the [`Slot`](relay_chain::Slot) from the relay chain state proof. - /// - /// The slot is slot of the relay chain block this state proof was extracted from. - /// - /// Returns an error if anything failed at reading or decoding. - pub fn read_slot(&self) -> Result { - read_entry(&self.trie_backend, relay_chain::well_known_keys::CURRENT_SLOT, None) - .map_err(Error::Slot) - } - - /// Read the go-ahead signal for the upgrade from the relay chain state proof. - /// - /// The go-ahead specifies whether the parachain can apply the upgrade or should abort it. If - /// the value is absent then there is either no judgment by the relay chain yet or no upgrade - /// is pending. - /// - /// Returns an error if anything failed at reading or decoding. - pub fn read_upgrade_go_ahead_signal( - &self, - ) -> Result, Error> { - read_optional_entry( - &self.trie_backend, - &relay_chain::well_known_keys::upgrade_go_ahead_signal(self.para_id), - ) - .map_err(Error::UpgradeGoAhead) - } - - /// Read the upgrade restriction signal for the upgrade from the relay chain state proof. - /// - /// If the upgrade restriction is not `None`, then the parachain cannot signal an upgrade at - /// this block. - /// - /// Returns an error if anything failed at reading or decoding. - pub fn read_upgrade_restriction_signal( - &self, - ) -> Result, Error> { - read_optional_entry( - &self.trie_backend, - &relay_chain::well_known_keys::upgrade_restriction_signal(self.para_id), - ) - .map_err(Error::UpgradeRestriction) - } - - /// Read an entry given by the key and try to decode it. If the value specified by the key - /// according to the proof is empty, the `fallback` value will be returned. - /// - /// Returns `Err` in case the backend can't return the value under the specific key (likely due - /// to a malformed proof), in case the decoding fails, or in case where the value is empty in - /// the relay chain state and no fallback was provided. - pub fn read_entry(&self, key: &[u8], fallback: Option) -> Result - where - T: Decode, - { - read_entry(&self.trie_backend, key, fallback).map_err(Error::ReadEntry) - } - - /// Read an optional entry given by the key and try to decode it. - /// - /// Returns `Err` in case the backend can't return the value under the specific key (likely due - /// to a malformed proof) or if the value couldn't be decoded. - pub fn read_optional_entry(&self, key: &[u8]) -> Result, Error> - where - T: Decode, - { - read_optional_entry(&self.trie_backend, key).map_err(Error::ReadOptionalEntry) - } -} diff --git a/cumulus/pallets/parachain-system/src/tests.rs b/cumulus/pallets/parachain-system/src/tests.rs deleted file mode 100755 index 5d259eabb728..000000000000 --- a/cumulus/pallets/parachain-system/src/tests.rs +++ /dev/null @@ -1,1017 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . -use super::*; - -use codec::Encode; -use cumulus_primitives_core::{ - relay_chain::BlockNumber as RelayBlockNumber, AbridgedHrmpChannel, InboundDownwardMessage, - InboundHrmpMessage, PersistedValidationData, -}; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use frame_support::{ - assert_ok, - dispatch::UnfilteredDispatchable, - inherent::{InherentData, ProvideInherent}, - parameter_types, - traits::{OnFinalize, OnInitialize}, - weights::Weight, -}; -use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; -use hex_literal::hex; -use relay_chain::HrmpChannelId; -use sp_core::{blake2_256, H256}; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, DispatchErrorWithPostInfo, -}; -use sp_version::RuntimeVersion; -use std::cell::RefCell; - -use crate as parachain_system; - -type Block = frame_system::mocking::MockBlock; - -frame_support::construct_runtime!( - pub enum Test - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - ParachainSystem: parachain_system::{Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned}, - } -); - -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub Version: RuntimeVersion = RuntimeVersion { - spec_name: sp_version::create_runtime_str!("test"), - impl_name: sp_version::create_runtime_str!("system-test"), - authoring_version: 1, - spec_version: 1, - impl_version: 1, - apis: sp_version::create_apis_vec!([]), - transaction_version: 1, - state_version: 1, - }; - pub const ParachainId: ParaId = ParaId::new(200); - pub const ReservedXcmpWeight: Weight = Weight::zero(); - pub const ReservedDmpWeight: Weight = Weight::zero(); -} -impl frame_system::Config for Test { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockLength = (); - type BlockWeights = (); - type Version = Version; - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} -impl Config for Test { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = ParachainId; - type OutboundXcmpMessageSource = FromThreadLocal; - type DmpMessageHandler = SaveIntoThreadLocal; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = SaveIntoThreadLocal; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -pub struct FromThreadLocal; -pub struct SaveIntoThreadLocal; - -std::thread_local! { - static HANDLED_DMP_MESSAGES: RefCell)>> = RefCell::new(Vec::new()); - static HANDLED_XCMP_MESSAGES: RefCell)>> = RefCell::new(Vec::new()); - static SENT_MESSAGES: RefCell)>> = RefCell::new(Vec::new()); -} - -fn send_message(dest: ParaId, message: Vec) { - SENT_MESSAGES.with(|m| m.borrow_mut().push((dest, message))); -} - -impl XcmpMessageSource for FromThreadLocal { - fn take_outbound_messages(maximum_channels: usize) -> Vec<(ParaId, Vec)> { - let mut ids = std::collections::BTreeSet::::new(); - let mut taken = 0; - let mut result = Vec::new(); - SENT_MESSAGES.with(|ms| { - ms.borrow_mut().retain(|m| { - let status = as GetChannelInfo>::get_channel_status(m.0); - let ready = matches!(status, ChannelStatus::Ready(..)); - if ready && !ids.contains(&m.0) && taken < maximum_channels { - ids.insert(m.0); - taken += 1; - result.push(m.clone()); - false - } else { - true - } - }) - }); - result - } -} - -impl DmpMessageHandler for SaveIntoThreadLocal { - fn handle_dmp_messages( - iter: impl Iterator)>, - _max_weight: Weight, - ) -> Weight { - HANDLED_DMP_MESSAGES.with(|m| { - for i in iter { - m.borrow_mut().push(i); - } - Weight::zero() - }) - } -} - -impl XcmpMessageHandler for SaveIntoThreadLocal { - fn handle_xcmp_messages<'a, I: Iterator>( - iter: I, - _max_weight: Weight, - ) -> Weight { - HANDLED_XCMP_MESSAGES.with(|m| { - for (sender, sent_at, message) in iter { - m.borrow_mut().push((sender, sent_at, message.to_vec())); - } - Weight::zero() - }) - } -} - -// This function basically just builds a genesis storage key/value store according to -// our desired mockup. -fn new_test_ext() -> sp_io::TestExternalities { - HANDLED_DMP_MESSAGES.with(|m| m.borrow_mut().clear()); - HANDLED_XCMP_MESSAGES.with(|m| m.borrow_mut().clear()); - - frame_system::GenesisConfig::::default().build_storage().unwrap().into() -} - -struct ReadRuntimeVersion(Vec); - -impl sp_core::traits::ReadRuntimeVersion for ReadRuntimeVersion { - fn read_runtime_version( - &self, - _wasm_code: &[u8], - _ext: &mut dyn sp_externalities::Externalities, - ) -> Result, String> { - Ok(self.0.clone()) - } -} - -fn wasm_ext() -> sp_io::TestExternalities { - let version = RuntimeVersion { - spec_name: "test".into(), - spec_version: 2, - impl_version: 1, - ..Default::default() - }; - - let mut ext = new_test_ext(); - ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(ReadRuntimeVersion( - version.encode(), - ))); - ext -} - -struct BlockTest { - n: BlockNumberFor, - within_block: Box, - after_block: Option>, -} - -/// BlockTests exist to test blocks with some setup: we have to assume that -/// `validate_block` will mutate and check storage in certain predictable -/// ways, for example, and we want to always ensure that tests are executed -/// in the context of some particular block number. -#[derive(Default)] -struct BlockTests { - tests: Vec, - pending_upgrade: Option, - ran: bool, - relay_sproof_builder_hook: - Option>, - persisted_validation_data_hook: Option>, - inherent_data_hook: - Option>, -} - -impl BlockTests { - fn new() -> BlockTests { - Default::default() - } - - fn add_raw(mut self, test: BlockTest) -> Self { - self.tests.push(test); - self - } - - fn add(self, n: BlockNumberFor, within_block: F) -> Self - where - F: 'static + Fn(), - { - self.add_raw(BlockTest { n, within_block: Box::new(within_block), after_block: None }) - } - - fn add_with_post_test( - self, - n: BlockNumberFor, - within_block: F1, - after_block: F2, - ) -> Self - where - F1: 'static + Fn(), - F2: 'static + Fn(), - { - self.add_raw(BlockTest { - n, - within_block: Box::new(within_block), - after_block: Some(Box::new(after_block)), - }) - } - - fn with_relay_sproof_builder(mut self, f: F) -> Self - where - F: 'static + Fn(&BlockTests, RelayChainBlockNumber, &mut RelayStateSproofBuilder), - { - self.relay_sproof_builder_hook = Some(Box::new(f)); - self - } - - fn with_validation_data(mut self, f: F) -> Self - where - F: 'static + Fn(&BlockTests, &mut PersistedValidationData), - { - self.persisted_validation_data_hook = Some(Box::new(f)); - self - } - - fn with_inherent_data(mut self, f: F) -> Self - where - F: 'static + Fn(&BlockTests, RelayChainBlockNumber, &mut ParachainInherentData), - { - self.inherent_data_hook = Some(Box::new(f)); - self - } - - fn run(&mut self) { - self.ran = true; - wasm_ext().execute_with(|| { - for BlockTest { n, within_block, after_block } in self.tests.iter() { - // clear pending updates, as applicable - if let Some(upgrade_block) = self.pending_upgrade { - if n >= &upgrade_block.into() { - self.pending_upgrade = None; - } - } - - // begin initialization - System::reset_events(); - System::initialize(n, &Default::default(), &Default::default()); - - // now mess with the storage the way validate_block does - let mut sproof_builder = RelayStateSproofBuilder::default(); - if let Some(ref hook) = self.relay_sproof_builder_hook { - hook(self, *n as RelayChainBlockNumber, &mut sproof_builder); - } - let (relay_parent_storage_root, relay_chain_state) = - sproof_builder.into_state_root_and_proof(); - let mut vfp = PersistedValidationData { - relay_parent_number: *n as RelayChainBlockNumber, - relay_parent_storage_root, - ..Default::default() - }; - if let Some(ref hook) = self.persisted_validation_data_hook { - hook(self, &mut vfp); - } - - >::put(&vfp); - NewValidationCode::::kill(); - - // It is insufficient to push the validation function params - // to storage; they must also be included in the inherent data. - let inherent_data = { - let mut inherent_data = InherentData::default(); - let mut system_inherent_data = ParachainInherentData { - validation_data: vfp.clone(), - relay_chain_state, - downward_messages: Default::default(), - horizontal_messages: Default::default(), - }; - if let Some(ref hook) = self.inherent_data_hook { - hook(self, *n as RelayChainBlockNumber, &mut system_inherent_data); - } - inherent_data - .put_data( - cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER, - &system_inherent_data, - ) - .expect("failed to put VFP inherent"); - inherent_data - }; - - // execute the block - ParachainSystem::on_initialize(*n); - ParachainSystem::create_inherent(&inherent_data) - .expect("got an inherent") - .dispatch_bypass_filter(RawOrigin::None.into()) - .expect("dispatch succeeded"); - within_block(); - ParachainSystem::on_finalize(*n); - - // did block execution set new validation code? - if NewValidationCode::::exists() && self.pending_upgrade.is_some() { - panic!("attempted to set validation code while upgrade was pending"); - } - - // clean up - System::finalize(); - if let Some(after_block) = after_block { - after_block(); - } - } - }); - } -} - -impl Drop for BlockTests { - fn drop(&mut self) { - if !self.ran { - self.run(); - } - } -} - -#[test] -#[should_panic] -fn block_tests_run_on_drop() { - BlockTests::new().add(123, || panic!("if this test passes, block tests run properly")); -} - -#[test] -fn events() { - BlockTests::new() - .with_relay_sproof_builder(|_, block_number, builder| { - if block_number > 123 { - builder.upgrade_go_ahead = Some(relay_chain::UpgradeGoAhead::GoAhead); - } - }) - .add_with_post_test( - 123, - || { - assert_ok!(System::set_code(RawOrigin::Root.into(), Default::default())); - }, - || { - let events = System::events(); - assert_eq!( - events[0].event, - RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionStored) - ); - }, - ) - .add_with_post_test( - 1234, - || {}, - || { - let events = System::events(); - assert_eq!( - events[0].event, - RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionApplied { - relay_chain_block_num: 1234 - }) - ); - }, - ); -} - -#[test] -fn non_overlapping() { - BlockTests::new() - .with_relay_sproof_builder(|_, _, builder| { - builder.host_config.validation_upgrade_delay = 1000; - }) - .add(123, || { - assert_ok!(System::set_code(RawOrigin::Root.into(), Default::default())); - }) - .add(234, || { - assert_eq!( - System::set_code(RawOrigin::Root.into(), Default::default()), - Err(Error::::OverlappingUpgrades.into()), - ) - }); -} - -#[test] -fn manipulates_storage() { - BlockTests::new() - .with_relay_sproof_builder(|_, block_number, builder| { - if block_number > 123 { - builder.upgrade_go_ahead = Some(relay_chain::UpgradeGoAhead::GoAhead); - } - }) - .add(123, || { - assert!( - !>::exists(), - "validation function must not exist yet" - ); - assert_ok!(System::set_code(RawOrigin::Root.into(), Default::default())); - assert!(>::exists(), "validation function must now exist"); - }) - .add_with_post_test( - 1234, - || {}, - || { - assert!( - !>::exists(), - "validation function must have been unset" - ); - }, - ); -} - -#[test] -fn aborted_upgrade() { - BlockTests::new() - .with_relay_sproof_builder(|_, block_number, builder| { - if block_number > 123 { - builder.upgrade_go_ahead = Some(relay_chain::UpgradeGoAhead::Abort); - } - }) - .add(123, || { - assert_ok!(System::set_code(RawOrigin::Root.into(), Default::default())); - }) - .add_with_post_test( - 1234, - || {}, - || { - assert!( - !>::exists(), - "validation function must have been unset" - ); - let events = System::events(); - assert_eq!( - events[0].event, - RuntimeEvent::ParachainSystem(crate::Event::ValidationFunctionDiscarded) - ); - }, - ); -} - -#[test] -fn checks_size() { - BlockTests::new() - .with_relay_sproof_builder(|_, _, builder| { - builder.host_config.max_code_size = 8; - }) - .add(123, || { - assert_eq!( - System::set_code(RawOrigin::Root.into(), vec![0; 64]), - Err(Error::::TooBig.into()), - ); - }); -} - -#[test] -fn send_upward_message_num_per_candidate() { - BlockTests::new() - .with_relay_sproof_builder(|_, _, sproof| { - sproof.host_config.max_upward_message_num_per_candidate = 1; - sproof.relay_dispatch_queue_remaining_capacity = None; - }) - .add_with_post_test( - 1, - || { - ParachainSystem::send_upward_message(b"Mr F was here".to_vec()).unwrap(); - ParachainSystem::send_upward_message(b"message 2".to_vec()).unwrap(); - }, - || { - let v = UpwardMessages::::get(); - assert_eq!(v, vec![b"Mr F was here".to_vec()]); - }, - ) - .add_with_post_test( - 2, - || { /* do nothing within block */ }, - || { - let v = UpwardMessages::::get(); - assert_eq!(v, vec![b"message 2".to_vec()]); - }, - ); -} - -#[test] -fn send_upward_message_relay_bottleneck() { - BlockTests::new() - .with_relay_sproof_builder(|_, relay_block_num, sproof| { - sproof.host_config.max_upward_message_num_per_candidate = 2; - sproof.host_config.max_upward_queue_count = 5; - - match relay_block_num { - 1 => sproof.relay_dispatch_queue_remaining_capacity = Some((0, 2048)), - 2 => sproof.relay_dispatch_queue_remaining_capacity = Some((1, 2048)), - _ => unreachable!(), - } - }) - .add_with_post_test( - 1, - || { - ParachainSystem::send_upward_message(vec![0u8; 8]).unwrap(); - }, - || { - // The message won't be sent because there is already one message in queue. - let v = UpwardMessages::::get(); - assert!(v.is_empty()); - }, - ) - .add_with_post_test( - 2, - || { /* do nothing within block */ }, - || { - let v = UpwardMessages::::get(); - assert_eq!(v, vec![vec![0u8; 8]]); - }, - ); -} - -#[test] -fn send_hrmp_message_buffer_channel_close() { - BlockTests::new() - .with_relay_sproof_builder(|_, relay_block_num, sproof| { - // - // Base case setup - // - sproof.para_id = ParaId::from(200); - sproof.hrmp_egress_channel_index = Some(vec![ParaId::from(300), ParaId::from(400)]); - sproof.hrmp_channels.insert( - HrmpChannelId { sender: ParaId::from(200), recipient: ParaId::from(300) }, - AbridgedHrmpChannel { - max_capacity: 1, - msg_count: 1, // <- 1/1 means the channel is full - max_total_size: 1024, - max_message_size: 8, - total_size: 0, - mqc_head: Default::default(), - }, - ); - sproof.hrmp_channels.insert( - HrmpChannelId { sender: ParaId::from(200), recipient: ParaId::from(400) }, - AbridgedHrmpChannel { - max_capacity: 1, - msg_count: 1, - max_total_size: 1024, - max_message_size: 8, - total_size: 0, - mqc_head: Default::default(), - }, - ); - - // - // Adjustment according to block - // - match relay_block_num { - 1 => {}, - 2 => {}, - 3 => { - // The channel 200->400 ceases to exist at the relay chain block 3 - sproof - .hrmp_egress_channel_index - .as_mut() - .unwrap() - .retain(|n| n != &ParaId::from(400)); - sproof.hrmp_channels.remove(&HrmpChannelId { - sender: ParaId::from(200), - recipient: ParaId::from(400), - }); - - // We also free up space for a message in the 200->300 channel. - sproof - .hrmp_channels - .get_mut(&HrmpChannelId { - sender: ParaId::from(200), - recipient: ParaId::from(300), - }) - .unwrap() - .msg_count = 0; - }, - _ => unreachable!(), - } - }) - .add_with_post_test( - 1, - || { - send_message(ParaId::from(300), b"1".to_vec()); - send_message(ParaId::from(400), b"2".to_vec()); - }, - || {}, - ) - .add_with_post_test( - 2, - || {}, - || { - // both channels are at capacity so we do not expect any messages. - let v = HrmpOutboundMessages::::get(); - assert!(v.is_empty()); - }, - ) - .add_with_post_test( - 3, - || {}, - || { - let v = HrmpOutboundMessages::::get(); - assert_eq!( - v, - vec![OutboundHrmpMessage { recipient: ParaId::from(300), data: b"1".to_vec() }] - ); - }, - ); -} - -#[test] -fn message_queue_chain() { - assert_eq!(MessageQueueChain::default().head(), H256::zero()); - - // Note that the resulting hashes are the same for HRMP and DMP. That's because even though - // the types are nominally different, they have the same structure and computation of the - // new head doesn't differ. - // - // These cases are taken from https://github.com/paritytech/polkadot/pull/2351 - assert_eq!( - MessageQueueChain::default() - .extend_downward(&InboundDownwardMessage { sent_at: 2, msg: vec![1, 2, 3] }) - .extend_downward(&InboundDownwardMessage { sent_at: 3, msg: vec![4, 5, 6] }) - .head(), - hex!["88dc00db8cc9d22aa62b87807705831f164387dfa49f80a8600ed1cbe1704b6b"].into(), - ); - assert_eq!( - MessageQueueChain::default() - .extend_hrmp(&InboundHrmpMessage { sent_at: 2, data: vec![1, 2, 3] }) - .extend_hrmp(&InboundHrmpMessage { sent_at: 3, data: vec![4, 5, 6] }) - .head(), - hex!["88dc00db8cc9d22aa62b87807705831f164387dfa49f80a8600ed1cbe1704b6b"].into(), - ); -} - -#[test] -fn receive_dmp() { - lazy_static::lazy_static! { - static ref MSG: InboundDownwardMessage = InboundDownwardMessage { - sent_at: 1, - msg: b"down".to_vec(), - }; - } - - BlockTests::new() - .with_relay_sproof_builder(|_, relay_block_num, sproof| match relay_block_num { - 1 => { - sproof.dmq_mqc_head = - Some(MessageQueueChain::default().extend_downward(&MSG).head()); - }, - _ => unreachable!(), - }) - .with_inherent_data(|_, relay_block_num, data| match relay_block_num { - 1 => { - data.downward_messages.push(MSG.clone()); - }, - _ => unreachable!(), - }) - .add(1, || { - HANDLED_DMP_MESSAGES.with(|m| { - let mut m = m.borrow_mut(); - assert_eq!(&*m, &[(MSG.sent_at, MSG.msg.clone())]); - m.clear(); - }); - }); -} - -#[test] -fn receive_dmp_after_pause() { - lazy_static::lazy_static! { - static ref MSG_1: InboundDownwardMessage = InboundDownwardMessage { - sent_at: 1, - msg: b"down1".to_vec(), - }; - static ref MSG_2: InboundDownwardMessage = InboundDownwardMessage { - sent_at: 3, - msg: b"down2".to_vec(), - }; - } - - BlockTests::new() - .with_relay_sproof_builder(|_, relay_block_num, sproof| match relay_block_num { - 1 => { - sproof.dmq_mqc_head = - Some(MessageQueueChain::default().extend_downward(&MSG_1).head()); - }, - 2 => { - // no new messages, mqc stayed the same. - sproof.dmq_mqc_head = - Some(MessageQueueChain::default().extend_downward(&MSG_1).head()); - }, - 3 => { - sproof.dmq_mqc_head = Some( - MessageQueueChain::default() - .extend_downward(&MSG_1) - .extend_downward(&MSG_2) - .head(), - ); - }, - _ => unreachable!(), - }) - .with_inherent_data(|_, relay_block_num, data| match relay_block_num { - 1 => { - data.downward_messages.push(MSG_1.clone()); - }, - 2 => { - // no new messages - }, - 3 => { - data.downward_messages.push(MSG_2.clone()); - }, - _ => unreachable!(), - }) - .add(1, || { - HANDLED_DMP_MESSAGES.with(|m| { - let mut m = m.borrow_mut(); - assert_eq!(&*m, &[(MSG_1.sent_at, MSG_1.msg.clone())]); - m.clear(); - }); - }) - .add(2, || {}) - .add(3, || { - HANDLED_DMP_MESSAGES.with(|m| { - let mut m = m.borrow_mut(); - assert_eq!(&*m, &[(MSG_2.sent_at, MSG_2.msg.clone())]); - m.clear(); - }); - }); -} - -#[test] -fn receive_hrmp() { - lazy_static::lazy_static! { - static ref MSG_1: InboundHrmpMessage = InboundHrmpMessage { - sent_at: 1, - data: b"1".to_vec(), - }; - - static ref MSG_2: InboundHrmpMessage = InboundHrmpMessage { - sent_at: 1, - data: b"2".to_vec(), - }; - - static ref MSG_3: InboundHrmpMessage = InboundHrmpMessage { - sent_at: 2, - data: b"3".to_vec(), - }; - - static ref MSG_4: InboundHrmpMessage = InboundHrmpMessage { - sent_at: 2, - data: b"4".to_vec(), - }; - } - - BlockTests::new() - .with_relay_sproof_builder(|_, relay_block_num, sproof| match relay_block_num { - 1 => { - // 200 - doesn't exist yet - // 300 - one new message - sproof.upsert_inbound_channel(ParaId::from(300)).mqc_head = - Some(MessageQueueChain::default().extend_hrmp(&MSG_1).head()); - }, - 2 => { - // 200 - now present with one message - // 300 - two new messages - sproof.upsert_inbound_channel(ParaId::from(200)).mqc_head = - Some(MessageQueueChain::default().extend_hrmp(&MSG_4).head()); - sproof.upsert_inbound_channel(ParaId::from(300)).mqc_head = Some( - MessageQueueChain::default() - .extend_hrmp(&MSG_1) - .extend_hrmp(&MSG_2) - .extend_hrmp(&MSG_3) - .head(), - ); - }, - 3 => { - // 200 - no new messages - // 300 - is gone - sproof.upsert_inbound_channel(ParaId::from(200)).mqc_head = - Some(MessageQueueChain::default().extend_hrmp(&MSG_4).head()); - }, - _ => unreachable!(), - }) - .with_inherent_data(|_, relay_block_num, data| match relay_block_num { - 1 => { - data.horizontal_messages.insert(ParaId::from(300), vec![MSG_1.clone()]); - }, - 2 => { - data.horizontal_messages.insert( - ParaId::from(300), - vec![ - // can't be sent at the block 1 actually. However, we cheat here - // because we want to test the case where there are multiple messages - // but the harness at the moment doesn't support block skipping. - MSG_2.clone(), - MSG_3.clone(), - ], - ); - data.horizontal_messages.insert(ParaId::from(200), vec![MSG_4.clone()]); - }, - 3 => {}, - _ => unreachable!(), - }) - .add(1, || { - HANDLED_XCMP_MESSAGES.with(|m| { - let mut m = m.borrow_mut(); - assert_eq!(&*m, &[(ParaId::from(300), 1, b"1".to_vec())]); - m.clear(); - }); - }) - .add(2, || { - HANDLED_XCMP_MESSAGES.with(|m| { - let mut m = m.borrow_mut(); - assert_eq!( - &*m, - &[ - (ParaId::from(300), 1, b"2".to_vec()), - (ParaId::from(200), 2, b"4".to_vec()), - (ParaId::from(300), 2, b"3".to_vec()), - ] - ); - m.clear(); - }); - }) - .add(3, || {}); -} - -#[test] -fn receive_hrmp_empty_channel() { - BlockTests::new() - .with_relay_sproof_builder(|_, relay_block_num, sproof| match relay_block_num { - 1 => { - // no channels - }, - 2 => { - // one new channel - sproof.upsert_inbound_channel(ParaId::from(300)).mqc_head = - Some(MessageQueueChain::default().head()); - }, - _ => unreachable!(), - }) - .add(1, || {}) - .add(2, || {}); -} - -#[test] -fn receive_hrmp_after_pause() { - lazy_static::lazy_static! { - static ref MSG_1: InboundHrmpMessage = InboundHrmpMessage { - sent_at: 1, - data: b"mikhailinvanovich".to_vec(), - }; - - static ref MSG_2: InboundHrmpMessage = InboundHrmpMessage { - sent_at: 3, - data: b"1000000000".to_vec(), - }; - } - - const ALICE: ParaId = ParaId::new(300); - - BlockTests::new() - .with_relay_sproof_builder(|_, relay_block_num, sproof| match relay_block_num { - 1 => { - sproof.upsert_inbound_channel(ALICE).mqc_head = - Some(MessageQueueChain::default().extend_hrmp(&MSG_1).head()); - }, - 2 => { - // 300 - no new messages, mqc stayed the same. - sproof.upsert_inbound_channel(ALICE).mqc_head = - Some(MessageQueueChain::default().extend_hrmp(&MSG_1).head()); - }, - 3 => { - // 300 - new message. - sproof.upsert_inbound_channel(ALICE).mqc_head = Some( - MessageQueueChain::default().extend_hrmp(&MSG_1).extend_hrmp(&MSG_2).head(), - ); - }, - _ => unreachable!(), - }) - .with_inherent_data(|_, relay_block_num, data| match relay_block_num { - 1 => { - data.horizontal_messages.insert(ALICE, vec![MSG_1.clone()]); - }, - 2 => { - // no new messages - }, - 3 => { - data.horizontal_messages.insert(ALICE, vec![MSG_2.clone()]); - }, - _ => unreachable!(), - }) - .add(1, || { - HANDLED_XCMP_MESSAGES.with(|m| { - let mut m = m.borrow_mut(); - assert_eq!(&*m, &[(ALICE, 1, b"mikhailinvanovich".to_vec())]); - m.clear(); - }); - }) - .add(2, || {}) - .add(3, || { - HANDLED_XCMP_MESSAGES.with(|m| { - let mut m = m.borrow_mut(); - assert_eq!(&*m, &[(ALICE, 3, b"1000000000".to_vec())]); - m.clear(); - }); - }); -} - -#[test] -#[should_panic = "Relay chain block number needs to strictly increase between Parachain blocks!"] -fn test() { - BlockTests::new() - .with_validation_data(|_, data| { - data.relay_parent_number = 1; - }) - .add(1, || {}) - .add(2, || {}); -} - -#[test] -fn upgrade_version_checks_should_work() { - let test_data = vec![ - ("test", 0, 1, Err(frame_system::Error::::SpecVersionNeedsToIncrease)), - ("test", 1, 0, Err(frame_system::Error::::SpecVersionNeedsToIncrease)), - ("test", 1, 1, Err(frame_system::Error::::SpecVersionNeedsToIncrease)), - ("test", 1, 2, Err(frame_system::Error::::SpecVersionNeedsToIncrease)), - ("test2", 1, 1, Err(frame_system::Error::::InvalidSpecName)), - ]; - - for (spec_name, spec_version, impl_version, expected) in test_data.into_iter() { - let version = RuntimeVersion { - spec_name: spec_name.into(), - spec_version, - impl_version, - ..Default::default() - }; - let read_runtime_version = ReadRuntimeVersion(version.encode()); - - let mut ext = new_test_ext(); - ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(read_runtime_version)); - ext.execute_with(|| { - let new_code = vec![1, 2, 3, 4]; - let new_code_hash = sp_core::H256(blake2_256(&new_code)); - - let _authorize = - ParachainSystem::authorize_upgrade(RawOrigin::Root.into(), new_code_hash, true); - let res = ParachainSystem::enact_authorized_upgrade(RawOrigin::None.into(), new_code); - - assert_eq!(expected.map_err(DispatchErrorWithPostInfo::from), res); - }); - } -} - -#[test] -fn deposits_relay_parent_storage_root() { - BlockTests::new().add_with_post_test( - 123, - || {}, - || { - let digest = System::digest(); - assert!(cumulus_primitives_core::rpsr_digest::extract_relay_parent_storage_root( - &digest - ) - .is_some()); - }, - ); -} diff --git a/cumulus/pallets/parachain-system/src/validate_block/implementation.rs b/cumulus/pallets/parachain-system/src/validate_block/implementation.rs deleted file mode 100644 index 4f07f2021c30..000000000000 --- a/cumulus/pallets/parachain-system/src/validate_block/implementation.rs +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The actual implementation of the validate block functionality. - -use super::{trie_cache, MemoryOptimizedValidationParams}; -use cumulus_primitives_core::{ - relay_chain::Hash as RHash, ParachainBlockData, PersistedValidationData, -}; -use cumulus_primitives_parachain_inherent::ParachainInherentData; - -use polkadot_parachain::primitives::{HeadData, RelayChainBlockNumber, ValidationResult}; - -use codec::Encode; - -use frame_support::traits::{ExecuteBlock, ExtrinsicCall, Get, IsSubType}; -use sp_core::storage::{ChildInfo, StateVersion}; -use sp_externalities::{set_and_run_with_externalities, Externalities}; -use sp_io::KillStorageResult; -use sp_runtime::traits::{Block as BlockT, Extrinsic, HashingFor, Header as HeaderT}; -use sp_std::prelude::*; -use sp_trie::MemoryDB; - -type TrieBackend = sp_state_machine::TrieBackend< - MemoryDB>, - HashingFor, - trie_cache::CacheProvider>, ->; - -type Ext<'a, B> = sp_state_machine::Ext<'a, HashingFor, TrieBackend>; - -fn with_externalities R, R>(f: F) -> R { - sp_externalities::with_externalities(f).expect("Environmental externalities not set.") -} - -/// Validate the given parachain block. -/// -/// This function is doing roughly the following: -/// -/// 1. We decode the [`ParachainBlockData`] from the `block_data` in `params`. -/// -/// 2. We are doing some security checks like checking that the `parent_head` in `params` -/// is the parent of the block we are going to check. We also ensure that the `set_validation_data` -/// inherent is present in the block and that the validation data matches the values in `params`. -/// -/// 3. We construct the sparse in-memory database from the storage proof inside the block data and -/// then ensure that the storage root matches the storage root in the `parent_head`. -/// -/// 4. We replace all the storage related host functions with functions inside the wasm blob. -/// This means instead of calling into the host, we will stay inside the wasm execution. This is -/// very important as the relay chain validator hasn't the state required to verify the block. But -/// we have the in-memory database that contains all the values from the state of the parachain -/// that we require to verify the block. -/// -/// 5. We are going to run `check_inherents`. This is important to check stuff like the timestamp -/// matching the real world time. -/// -/// 6. The last step is to execute the entire block in the machinery we just have setup. Executing -/// the blocks include running all transactions in the block against our in-memory database and -/// ensuring that the final storage root matches the storage root in the header of the block. In the -/// end we return back the [`ValidationResult`] with all the required information for the validator. -#[doc(hidden)] -pub fn validate_block< - B: BlockT, - E: ExecuteBlock, - PSC: crate::Config, - CI: crate::CheckInherents, ->( - MemoryOptimizedValidationParams { - block_data, - parent_head, - relay_parent_number, - relay_parent_storage_root, - }: MemoryOptimizedValidationParams, -) -> ValidationResult -where - B::Extrinsic: ExtrinsicCall, - ::Call: IsSubType>, -{ - let block_data = codec::decode_from_bytes::>(block_data) - .expect("Invalid parachain block data"); - - let parent_header = - codec::decode_from_bytes::(parent_head.clone()).expect("Invalid parent head"); - - let (header, extrinsics, storage_proof) = block_data.deconstruct(); - - let block = B::new(header, extrinsics); - assert!(parent_header.hash() == *block.header().parent_hash(), "Invalid parent hash"); - - let inherent_data = extract_parachain_inherent_data(&block); - - validate_validation_data( - &inherent_data.validation_data, - relay_parent_number, - relay_parent_storage_root, - parent_head, - ); - - // Create the db - let db = match storage_proof.to_memory_db(Some(parent_header.state_root())) { - Ok((db, _)) => db, - Err(_) => panic!("Compact proof decoding failure."), - }; - - sp_std::mem::drop(storage_proof); - - let cache_provider = trie_cache::CacheProvider::new(); - // We use the storage root of the `parent_head` to ensure that it is the correct root. - // This is already being done above while creating the in-memory db, but let's be paranoid!! - let backend = sp_state_machine::TrieBackendBuilder::new_with_cache( - db, - *parent_header.state_root(), - cache_provider, - ) - .build(); - - let _guard = ( - // Replace storage calls with our own implementations - sp_io::storage::host_read.replace_implementation(host_storage_read), - sp_io::storage::host_set.replace_implementation(host_storage_set), - sp_io::storage::host_get.replace_implementation(host_storage_get), - sp_io::storage::host_exists.replace_implementation(host_storage_exists), - sp_io::storage::host_clear.replace_implementation(host_storage_clear), - sp_io::storage::host_root.replace_implementation(host_storage_root), - sp_io::storage::host_clear_prefix.replace_implementation(host_storage_clear_prefix), - sp_io::storage::host_append.replace_implementation(host_storage_append), - sp_io::storage::host_next_key.replace_implementation(host_storage_next_key), - sp_io::storage::host_start_transaction - .replace_implementation(host_storage_start_transaction), - sp_io::storage::host_rollback_transaction - .replace_implementation(host_storage_rollback_transaction), - sp_io::storage::host_commit_transaction - .replace_implementation(host_storage_commit_transaction), - sp_io::default_child_storage::host_get - .replace_implementation(host_default_child_storage_get), - sp_io::default_child_storage::host_read - .replace_implementation(host_default_child_storage_read), - sp_io::default_child_storage::host_set - .replace_implementation(host_default_child_storage_set), - sp_io::default_child_storage::host_clear - .replace_implementation(host_default_child_storage_clear), - sp_io::default_child_storage::host_storage_kill - .replace_implementation(host_default_child_storage_storage_kill), - sp_io::default_child_storage::host_exists - .replace_implementation(host_default_child_storage_exists), - sp_io::default_child_storage::host_clear_prefix - .replace_implementation(host_default_child_storage_clear_prefix), - sp_io::default_child_storage::host_root - .replace_implementation(host_default_child_storage_root), - sp_io::default_child_storage::host_next_key - .replace_implementation(host_default_child_storage_next_key), - sp_io::offchain_index::host_set.replace_implementation(host_offchain_index_set), - sp_io::offchain_index::host_clear.replace_implementation(host_offchain_index_clear), - ); - - run_with_externalities::(&backend, || { - let relay_chain_proof = crate::RelayChainStateProof::new( - PSC::SelfParaId::get(), - inherent_data.validation_data.relay_parent_storage_root, - inherent_data.relay_chain_state.clone(), - ) - .expect("Invalid relay chain state proof"); - - let res = CI::check_inherents(&block, &relay_chain_proof); - - if !res.ok() { - if log::log_enabled!(log::Level::Error) { - res.into_errors().for_each(|e| { - log::error!("Checking inherent with identifier `{:?}` failed", e.0) - }); - } - - panic!("Checking inherents failed"); - } - }); - - run_with_externalities::(&backend, || { - let head_data = HeadData(block.header().encode()); - - E::execute_block(block); - - let new_validation_code = crate::NewValidationCode::::get(); - let upward_messages = crate::UpwardMessages::::get().try_into().expect( - "Number of upward messages should not be greater than `MAX_UPWARD_MESSAGE_NUM`", - ); - let processed_downward_messages = crate::ProcessedDownwardMessages::::get(); - let horizontal_messages = crate::HrmpOutboundMessages::::get().try_into().expect( - "Number of horizontal messages should not be greater than `MAX_HORIZONTAL_MESSAGE_NUM`", - ); - let hrmp_watermark = crate::HrmpWatermark::::get(); - - let head_data = - if let Some(custom_head_data) = crate::CustomValidationHeadData::::get() { - HeadData(custom_head_data) - } else { - head_data - }; - - ValidationResult { - head_data, - new_validation_code: new_validation_code.map(Into::into), - upward_messages, - processed_downward_messages, - horizontal_messages, - hrmp_watermark, - } - }) -} - -/// Extract the [`ParachainInherentData`]. -fn extract_parachain_inherent_data( - block: &B, -) -> &ParachainInherentData -where - B::Extrinsic: ExtrinsicCall, - ::Call: IsSubType>, -{ - block - .extrinsics() - .iter() - // Inherents are at the front of the block and are unsigned. - // - // If `is_signed` is returning `None`, we keep it safe and assume that it is "signed". - // We are searching for unsigned transactions anyway. - .take_while(|e| !e.is_signed().unwrap_or(true)) - .filter_map(|e| e.call().is_sub_type()) - .find_map(|c| match c { - crate::Call::set_validation_data { data: validation_data } => Some(validation_data), - _ => None, - }) - .expect("Could not find `set_validation_data` inherent") -} - -/// Validate the given [`PersistedValidationData`] against the [`MemoryOptimizedValidationParams`]. -fn validate_validation_data( - validation_data: &PersistedValidationData, - relay_parent_number: RelayChainBlockNumber, - relay_parent_storage_root: RHash, - parent_head: bytes::Bytes, -) { - assert_eq!(parent_head, validation_data.parent_head.0, "Parent head doesn't match"); - assert_eq!( - relay_parent_number, validation_data.relay_parent_number, - "Relay parent number doesn't match", - ); - assert_eq!( - relay_parent_storage_root, validation_data.relay_parent_storage_root, - "Relay parent storage root doesn't match", - ); -} - -/// Run the given closure with the externalities set. -fn run_with_externalities R>( - backend: &TrieBackend, - execute: F, -) -> R { - let mut overlay = sp_state_machine::OverlayedChanges::default(); - let mut cache = Default::default(); - let mut ext = Ext::::new(&mut overlay, &mut cache, backend); - - set_and_run_with_externalities(&mut ext, || execute()) -} - -fn host_storage_read(key: &[u8], value_out: &mut [u8], value_offset: u32) -> Option { - match with_externalities(|ext| ext.storage(key)) { - Some(value) => { - let value_offset = value_offset as usize; - let data = &value[value_offset.min(value.len())..]; - let written = sp_std::cmp::min(data.len(), value_out.len()); - value_out[..written].copy_from_slice(&data[..written]); - Some(value.len() as u32) - }, - None => None, - } -} - -fn host_storage_set(key: &[u8], value: &[u8]) { - with_externalities(|ext| ext.place_storage(key.to_vec(), Some(value.to_vec()))) -} - -fn host_storage_get(key: &[u8]) -> Option { - with_externalities(|ext| ext.storage(key).map(|value| value.into())) -} - -fn host_storage_exists(key: &[u8]) -> bool { - with_externalities(|ext| ext.exists_storage(key)) -} - -fn host_storage_clear(key: &[u8]) { - with_externalities(|ext| ext.place_storage(key.to_vec(), None)) -} - -fn host_storage_root(version: StateVersion) -> Vec { - with_externalities(|ext| ext.storage_root(version)) -} - -fn host_storage_clear_prefix(prefix: &[u8], limit: Option) -> KillStorageResult { - with_externalities(|ext| ext.clear_prefix(prefix, limit, None).into()) -} - -fn host_storage_append(key: &[u8], value: Vec) { - with_externalities(|ext| ext.storage_append(key.to_vec(), value)) -} - -fn host_storage_next_key(key: &[u8]) -> Option> { - with_externalities(|ext| ext.next_storage_key(key)) -} - -fn host_storage_start_transaction() { - with_externalities(|ext| ext.storage_start_transaction()) -} - -fn host_storage_rollback_transaction() { - with_externalities(|ext| ext.storage_rollback_transaction().ok()) - .expect("No open transaction that can be rolled back."); -} - -fn host_storage_commit_transaction() { - with_externalities(|ext| ext.storage_commit_transaction().ok()) - .expect("No open transaction that can be committed."); -} - -fn host_default_child_storage_get(storage_key: &[u8], key: &[u8]) -> Option> { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| ext.child_storage(&child_info, key)) -} - -fn host_default_child_storage_read( - storage_key: &[u8], - key: &[u8], - value_out: &mut [u8], - value_offset: u32, -) -> Option { - let child_info = ChildInfo::new_default(storage_key); - match with_externalities(|ext| ext.child_storage(&child_info, key)) { - Some(value) => { - let value_offset = value_offset as usize; - let data = &value[value_offset.min(value.len())..]; - let written = sp_std::cmp::min(data.len(), value_out.len()); - value_out[..written].copy_from_slice(&data[..written]); - Some(value.len() as u32) - }, - None => None, - } -} - -fn host_default_child_storage_set(storage_key: &[u8], key: &[u8], value: &[u8]) { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| { - ext.place_child_storage(&child_info, key.to_vec(), Some(value.to_vec())) - }) -} - -fn host_default_child_storage_clear(storage_key: &[u8], key: &[u8]) { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| ext.place_child_storage(&child_info, key.to_vec(), None)) -} - -fn host_default_child_storage_storage_kill( - storage_key: &[u8], - limit: Option, -) -> KillStorageResult { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| ext.kill_child_storage(&child_info, limit, None).into()) -} - -fn host_default_child_storage_exists(storage_key: &[u8], key: &[u8]) -> bool { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| ext.exists_child_storage(&child_info, key)) -} - -fn host_default_child_storage_clear_prefix( - storage_key: &[u8], - prefix: &[u8], - limit: Option, -) -> KillStorageResult { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| ext.clear_child_prefix(&child_info, prefix, limit, None).into()) -} - -fn host_default_child_storage_root(storage_key: &[u8], version: StateVersion) -> Vec { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| ext.child_storage_root(&child_info, version)) -} - -fn host_default_child_storage_next_key(storage_key: &[u8], key: &[u8]) -> Option> { - let child_info = ChildInfo::new_default(storage_key); - with_externalities(|ext| ext.next_child_storage_key(&child_info, key)) -} - -fn host_offchain_index_set(_key: &[u8], _value: &[u8]) {} - -fn host_offchain_index_clear(_key: &[u8]) {} diff --git a/cumulus/pallets/parachain-system/src/validate_block/mod.rs b/cumulus/pallets/parachain-system/src/validate_block/mod.rs deleted file mode 100644 index 4e387bf84962..000000000000 --- a/cumulus/pallets/parachain-system/src/validate_block/mod.rs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! A module that enables a runtime to work as parachain. - -#[cfg(not(feature = "std"))] -#[doc(hidden)] -pub mod implementation; -#[cfg(test)] -mod tests; - -#[cfg(not(feature = "std"))] -#[doc(hidden)] -mod trie_cache; - -#[cfg(not(feature = "std"))] -#[doc(hidden)] -pub use bytes; -#[cfg(not(feature = "std"))] -#[doc(hidden)] -pub use codec::decode_from_bytes; -#[cfg(not(feature = "std"))] -#[doc(hidden)] -pub use polkadot_parachain; -#[cfg(not(feature = "std"))] -#[doc(hidden)] -pub use sp_runtime::traits::GetRuntimeBlockType; -#[cfg(not(feature = "std"))] -#[doc(hidden)] -pub use sp_std; - -/// Basically the same as [`ValidationParams`](polkadot_parachain::primitives::ValidationParams), -/// but a little bit optimized for our use case here. -/// -/// `block_data` and `head_data` are represented as [`bytes::Bytes`] to make them reuse -/// the memory of the input parameter of the exported `validate_blocks` function. -/// -/// The layout of this type must match exactly the layout of -/// [`ValidationParams`](polkadot_parachain::primitives::ValidationParams) to have the same -/// SCALE encoding. -#[derive(codec::Decode)] -#[cfg_attr(feature = "std", derive(codec::Encode))] -#[doc(hidden)] -pub struct MemoryOptimizedValidationParams { - pub parent_head: bytes::Bytes, - pub block_data: bytes::Bytes, - pub relay_parent_number: cumulus_primitives_core::relay_chain::BlockNumber, - pub relay_parent_storage_root: cumulus_primitives_core::relay_chain::Hash, -} diff --git a/cumulus/pallets/parachain-system/src/validate_block/tests.rs b/cumulus/pallets/parachain-system/src/validate_block/tests.rs deleted file mode 100644 index eab3ed6d2139..000000000000 --- a/cumulus/pallets/parachain-system/src/validate_block/tests.rs +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use codec::{Decode, DecodeAll, Encode}; -use cumulus_primitives_core::{ParachainBlockData, PersistedValidationData}; -use cumulus_test_client::{ - generate_extrinsic, - runtime::{Block, Hash, Header, TestPalletCall, UncheckedExtrinsic, WASM_BINARY}, - transfer, BlockData, BuildParachainBlockData, Client, DefaultTestClientBuilderExt, HeadData, - InitBlockBuilder, TestClientBuilder, TestClientBuilderExt, ValidationParams, -}; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use sp_keyring::AccountKeyring::*; -use sp_runtime::traits::Header as HeaderT; -use std::{env, process::Command}; - -use crate::validate_block::MemoryOptimizedValidationParams; - -fn call_validate_block_encoded_header( - parent_head: Header, - block_data: ParachainBlockData, - relay_parent_storage_root: Hash, -) -> cumulus_test_client::ExecutorResult> { - cumulus_test_client::validate_block( - ValidationParams { - block_data: BlockData(block_data.encode()), - parent_head: HeadData(parent_head.encode()), - relay_parent_number: 1, - relay_parent_storage_root, - }, - WASM_BINARY.expect("You need to build the WASM binaries to run the tests!"), - ) - .map(|v| v.head_data.0) -} - -fn call_validate_block( - parent_head: Header, - block_data: ParachainBlockData, - relay_parent_storage_root: Hash, -) -> cumulus_test_client::ExecutorResult
{ - call_validate_block_encoded_header(parent_head, block_data, relay_parent_storage_root) - .map(|v| Header::decode(&mut &v[..]).expect("Decodes `Header`.")) -} - -fn create_test_client() -> (Client, Header) { - let client = TestClientBuilder::new().build(); - - let genesis_header = client - .header(client.chain_info().genesis_hash) - .ok() - .flatten() - .expect("Genesis header exists; qed"); - - (client, genesis_header) -} - -struct TestBlockData { - block: ParachainBlockData, - validation_data: PersistedValidationData, -} - -fn build_block_with_witness( - client: &Client, - extra_extrinsics: Vec, - parent_head: Header, - sproof_builder: RelayStateSproofBuilder, -) -> TestBlockData { - let (relay_parent_storage_root, _) = sproof_builder.clone().into_state_root_and_proof(); - let mut validation_data = PersistedValidationData { - relay_parent_number: 1, - parent_head: parent_head.encode().into(), - ..Default::default() - }; - let mut builder = client.init_block_builder(Some(validation_data.clone()), sproof_builder); - - validation_data.relay_parent_storage_root = relay_parent_storage_root; - - extra_extrinsics.into_iter().for_each(|e| builder.push(e).unwrap()); - - let block = builder.build_parachain_block(*parent_head.state_root()); - - TestBlockData { block, validation_data } -} - -#[test] -fn validate_block_no_extra_extrinsics() { - sp_tracing::try_init_simple(); - - let (client, parent_head) = create_test_client(); - let TestBlockData { block, validation_data } = - build_block_with_witness(&client, Vec::new(), parent_head.clone(), Default::default()); - let header = block.header().clone(); - - let res_header = - call_validate_block(parent_head, block, validation_data.relay_parent_storage_root) - .expect("Calls `validate_block`"); - assert_eq!(header, res_header); -} - -#[test] -fn validate_block_with_extra_extrinsics() { - sp_tracing::try_init_simple(); - - let (client, parent_head) = create_test_client(); - let extra_extrinsics = vec![ - transfer(&client, Alice, Bob, 69), - transfer(&client, Bob, Charlie, 100), - transfer(&client, Charlie, Alice, 500), - ]; - - let TestBlockData { block, validation_data } = build_block_with_witness( - &client, - extra_extrinsics, - parent_head.clone(), - Default::default(), - ); - let header = block.header().clone(); - - let res_header = - call_validate_block(parent_head, block, validation_data.relay_parent_storage_root) - .expect("Calls `validate_block`"); - assert_eq!(header, res_header); -} - -#[test] -fn validate_block_returns_custom_head_data() { - sp_tracing::try_init_simple(); - - let expected_header = vec![1, 3, 3, 7, 4, 5, 6]; - - let (client, parent_head) = create_test_client(); - let extra_extrinsics = vec![ - transfer(&client, Alice, Bob, 69), - generate_extrinsic( - &client, - Charlie, - TestPalletCall::set_custom_validation_head_data { - custom_header: expected_header.clone(), - }, - ), - transfer(&client, Bob, Charlie, 100), - ]; - - let TestBlockData { block, validation_data } = build_block_with_witness( - &client, - extra_extrinsics, - parent_head.clone(), - Default::default(), - ); - let header = block.header().clone(); - assert_ne!(expected_header, header.encode()); - - let res_header = call_validate_block_encoded_header( - parent_head, - block, - validation_data.relay_parent_storage_root, - ) - .expect("Calls `validate_block`"); - assert_eq!(expected_header, res_header); -} - -#[test] -fn validate_block_invalid_parent_hash() { - sp_tracing::try_init_simple(); - - if env::var("RUN_TEST").is_ok() { - let (client, parent_head) = create_test_client(); - let TestBlockData { block, validation_data } = - build_block_with_witness(&client, Vec::new(), parent_head.clone(), Default::default()); - let (mut header, extrinsics, witness) = block.deconstruct(); - header.set_parent_hash(Hash::from_low_u64_be(1)); - - let block_data = ParachainBlockData::new(header, extrinsics, witness); - call_validate_block(parent_head, block_data, validation_data.relay_parent_storage_root) - .unwrap_err(); - } else { - let output = Command::new(env::current_exe().unwrap()) - .args(["validate_block_invalid_parent_hash", "--", "--nocapture"]) - .env("RUN_TEST", "1") - .output() - .expect("Runs the test"); - assert!(output.status.success()); - - assert!(dbg!(String::from_utf8(output.stderr).unwrap()).contains("Invalid parent hash")); - } -} - -#[test] -fn validate_block_fails_on_invalid_validation_data() { - sp_tracing::try_init_simple(); - - if env::var("RUN_TEST").is_ok() { - let (client, parent_head) = create_test_client(); - let TestBlockData { block, .. } = - build_block_with_witness(&client, Vec::new(), parent_head.clone(), Default::default()); - - call_validate_block(parent_head, block, Hash::random()).unwrap_err(); - } else { - let output = Command::new(env::current_exe().unwrap()) - .args(["validate_block_fails_on_invalid_validation_data", "--", "--nocapture"]) - .env("RUN_TEST", "1") - .output() - .expect("Runs the test"); - assert!(output.status.success()); - - assert!(dbg!(String::from_utf8(output.stderr).unwrap()) - .contains("Relay parent storage root doesn't match")); - } -} - -#[test] -fn check_inherent_fails_on_validate_block_as_expected() { - sp_tracing::try_init_simple(); - - if env::var("RUN_TEST").is_ok() { - let (client, parent_head) = create_test_client(); - - let TestBlockData { block, validation_data } = build_block_with_witness( - &client, - Vec::new(), - parent_head.clone(), - RelayStateSproofBuilder { current_slot: 1337.into(), ..Default::default() }, - ); - - call_validate_block(parent_head, block, validation_data.relay_parent_storage_root) - .unwrap_err(); - } else { - let output = Command::new(env::current_exe().unwrap()) - .args(["check_inherent_fails_on_validate_block_as_expected", "--", "--nocapture"]) - .env("RUN_TEST", "1") - .output() - .expect("Runs the test"); - assert!(output.status.success()); - - assert!( - dbg!(String::from_utf8(output.stderr).unwrap()).contains("Checking inherents failed") - ); - } -} - -#[test] -fn check_inherents_are_unsigned_and_before_all_other_extrinsics() { - sp_tracing::try_init_simple(); - - if env::var("RUN_TEST").is_ok() { - let (client, parent_head) = create_test_client(); - - let TestBlockData { block, validation_data } = - build_block_with_witness(&client, Vec::new(), parent_head.clone(), Default::default()); - - let (header, mut extrinsics, proof) = block.deconstruct(); - - extrinsics.insert(0, transfer(&client, Alice, Bob, 69)); - - call_validate_block( - parent_head, - ParachainBlockData::new(header, extrinsics, proof), - validation_data.relay_parent_storage_root, - ) - .unwrap_err(); - } else { - let output = Command::new(env::current_exe().unwrap()) - .args([ - "check_inherents_are_unsigned_and_before_all_other_extrinsics", - "--", - "--nocapture", - ]) - .env("RUN_TEST", "1") - .output() - .expect("Runs the test"); - assert!(output.status.success()); - - assert!(String::from_utf8(output.stderr) - .unwrap() - .contains("Could not find `set_validation_data` inherent")); - } -} - -/// Test that ensures that `ValidationParams` and `MemoryOptimizedValidationParams` -/// are encoding/decoding. -#[test] -fn validation_params_and_memory_optimized_validation_params_encode_and_decode() { - const BLOCK_DATA: &[u8] = &[1, 2, 3, 4, 5]; - const PARENT_HEAD: &[u8] = &[1, 3, 4, 5, 6, 7, 9]; - - let validation_params = ValidationParams { - block_data: BlockData(BLOCK_DATA.encode()), - parent_head: HeadData(PARENT_HEAD.encode()), - relay_parent_number: 1, - relay_parent_storage_root: Hash::random(), - }; - - let encoded = validation_params.encode(); - - let decoded = MemoryOptimizedValidationParams::decode_all(&mut &encoded[..]).unwrap(); - assert_eq!(decoded.relay_parent_number, validation_params.relay_parent_number); - assert_eq!(decoded.relay_parent_storage_root, validation_params.relay_parent_storage_root); - assert_eq!(decoded.block_data, validation_params.block_data.0); - assert_eq!(decoded.parent_head, validation_params.parent_head.0); - - let encoded = decoded.encode(); - - let decoded = ValidationParams::decode_all(&mut &encoded[..]).unwrap(); - assert_eq!(decoded, validation_params); -} diff --git a/cumulus/pallets/parachain-system/src/validate_block/trie_cache.rs b/cumulus/pallets/parachain-system/src/validate_block/trie_cache.rs deleted file mode 100644 index 57876b87876f..000000000000 --- a/cumulus/pallets/parachain-system/src/validate_block/trie_cache.rs +++ /dev/null @@ -1,104 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use sp_state_machine::TrieCacheProvider; -use sp_std::{ - boxed::Box, - cell::{RefCell, RefMut}, - collections::btree_map::{BTreeMap, Entry}, -}; -use sp_trie::NodeCodec; -use trie_db::{node::NodeOwned, Hasher}; - -/// Special purpose trie cache implementation that is able to cache an unlimited number -/// of values. To be used in `validate_block` to serve values and nodes that -/// have already been loaded and decoded from the storage proof. -pub(crate) struct TrieCache<'a, H: Hasher> { - node_cache: RefMut<'a, BTreeMap>>, - value_cache: Option, trie_db::CachedValue>>>, -} - -impl<'a, H: Hasher> trie_db::TrieCache> for TrieCache<'a, H> { - fn lookup_value_for_key(&mut self, key: &[u8]) -> Option<&trie_db::CachedValue> { - self.value_cache.as_ref().and_then(|cache| cache.get(key)) - } - - fn cache_value_for_key(&mut self, key: &[u8], value: trie_db::CachedValue) { - self.value_cache.as_mut().and_then(|cache| cache.insert(key.into(), value)); - } - - fn get_or_insert_node( - &mut self, - hash: as trie_db::NodeCodec>::HashOut, - fetch_node: &mut dyn FnMut() -> trie_db::Result< - NodeOwned, - H::Out, - as trie_db::NodeCodec>::Error, - >, - ) -> trie_db::Result<&NodeOwned, H::Out, as trie_db::NodeCodec>::Error> { - match self.node_cache.entry(hash) { - Entry::Occupied(entry) => Ok(entry.into_mut()), - Entry::Vacant(entry) => Ok(entry.insert(fetch_node()?)), - } - } - - fn get_node( - &mut self, - hash: &H::Out, - ) -> Option<&NodeOwned< as trie_db::NodeCodec>::HashOut>> { - self.node_cache.get(hash) - } -} - -/// Provider of [`TrieCache`] instances. -pub(crate) struct CacheProvider { - node_cache: RefCell>>, - value_cache: RefCell, trie_db::CachedValue>>, -} - -impl CacheProvider { - /// Constructs a new instance of [`CacheProvider`] with an uninitialized state - /// and empty node and value caches. - pub fn new() -> Self { - CacheProvider { node_cache: Default::default(), value_cache: Default::default() } - } -} - -impl TrieCacheProvider for CacheProvider { - type Cache<'a> = TrieCache<'a, H> where H: 'a; - - fn as_trie_db_cache(&self, _storage_root: ::Out) -> Self::Cache<'_> { - TrieCache { - value_cache: Some(self.value_cache.borrow_mut()), - node_cache: self.node_cache.borrow_mut(), - } - } - - fn as_trie_db_mut_cache(&self) -> Self::Cache<'_> { - // This method is called when we calculate the storage root. - // Since we are using a simplified cache architecture, - // we do not have separate key spaces for different storage roots. - // The value cache is therefore disabled here. - TrieCache { value_cache: None, node_cache: self.node_cache.borrow_mut() } - } - - fn merge<'a>(&'a self, _other: Self::Cache<'a>, _new_root: ::Out) {} -} - -// This is safe here since we are single-threaded in WASM -unsafe impl Send for CacheProvider {} -unsafe impl Sync for CacheProvider {} diff --git a/cumulus/pallets/session-benchmarking/Cargo.toml b/cumulus/pallets/session-benchmarking/Cargo.toml deleted file mode 100644 index ec83adbfc1d5..000000000000 --- a/cumulus/pallets/session-benchmarking/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "cumulus-pallet-session-benchmarking" -version = "3.0.0" -authors = ["Parity Technologies "] -edition = "2021" -license = "Apache-2.0" -homepage = "https://substrate.io" -repository = "https://github.com/paritytech/cumulus/" -description = "FRAME sessions pallet benchmarking" -readme = "README.md" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -parity-scale-codec = { version = "3.6.4", default-features = false } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-session = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", -] -std = [ - "parity-scale-codec/std", - "sp-std/std", - "sp-runtime/std", - "frame-system/std", - "frame-benchmarking/std", - "frame-support/std", - "pallet-session/std", -] diff --git a/cumulus/pallets/session-benchmarking/README.md b/cumulus/pallets/session-benchmarking/README.md deleted file mode 100644 index e097f03f34a8..000000000000 --- a/cumulus/pallets/session-benchmarking/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Benchmarks for the Session Pallet. - -License: Apache-2.0 diff --git a/cumulus/pallets/session-benchmarking/src/lib.rs b/cumulus/pallets/session-benchmarking/src/lib.rs deleted file mode 100644 index 5217bbae71b4..000000000000 --- a/cumulus/pallets/session-benchmarking/src/lib.rs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Benchmarking setup for pallet-session -#![cfg_attr(not(feature = "std"), no_std)] -#![cfg(feature = "runtime-benchmarks")] -use sp_std::{prelude::*, vec}; - -use frame_benchmarking::{benchmarks, whitelisted_caller}; -use frame_system::RawOrigin; -use pallet_session::*; -use parity_scale_codec::Decode; -pub struct Pallet(pallet_session::Pallet); -pub trait Config: pallet_session::Config {} - -benchmarks! { - set_keys { - let caller: T::AccountId = whitelisted_caller(); - frame_system::Pallet::::inc_providers(&caller); - let keys = T::Keys::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()).unwrap(); - let proof: Vec = vec![0,1,2,3]; - }: _(RawOrigin::Signed(caller), keys, proof) - - purge_keys { - let caller: T::AccountId = whitelisted_caller(); - frame_system::Pallet::::inc_providers(&caller); - let keys = T::Keys::decode(&mut sp_runtime::traits::TrailingZeroInput::zeroes()).unwrap(); - let proof: Vec = vec![0,1,2,3]; - let _t = pallet_session::Pallet::::set_keys(RawOrigin::Signed(caller.clone()).into(), keys, proof); - }: _(RawOrigin::Signed(caller)) -} diff --git a/cumulus/pallets/solo-to-para/Cargo.toml b/cumulus/pallets/solo-to-para/Cargo.toml deleted file mode 100644 index c884c8a6b9f3..000000000000 --- a/cumulus/pallets/solo-to-para/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "cumulus-pallet-solo-to-para" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Adds functionality to migrate from a Solo to a Parachain" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { default-features = false, path = "../parachain-system" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "cumulus-pallet-parachain-system/std", - "frame-support/std", - "frame-system/std", - "pallet-sudo/std", - "polkadot-primitives/std", - "sp-runtime/std", - "sp-std/std", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/cumulus/pallets/solo-to-para/src/lib.rs b/cumulus/pallets/solo-to-para/src/lib.rs deleted file mode 100644 index 5672ec4ece4a..000000000000 --- a/cumulus/pallets/solo-to-para/src/lib.rs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] - -use cumulus_pallet_parachain_system as parachain_system; -use frame_support::pallet_prelude::*; -use frame_system::pallet_prelude::*; -pub use pallet::*; -use polkadot_primitives::PersistedValidationData; -use sp_std::vec::Vec; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - - #[pallet::config] - pub trait Config: - frame_system::Config + parachain_system::Config + pallet_sudo::Config - { - type RuntimeEvent: From + IsType<::RuntimeEvent>; - } - - #[pallet::pallet] - #[pallet::without_storage_info] - pub struct Pallet(_); - - /// In case of a scheduled migration, this storage field contains the custom head data to be - /// applied. - #[pallet::storage] - pub(super) type PendingCustomValidationHeadData = - StorageValue<_, Vec, OptionQuery>; - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// The custom validation head data has been scheduled to apply. - CustomValidationHeadDataStored, - /// The custom validation head data was applied as of the contained relay chain block - /// number. - CustomValidationHeadDataApplied, - } - - #[pallet::error] - pub enum Error { - /// CustomHeadData is not stored in storage. - NoCustomHeadData, - } - - #[pallet::call] - impl Pallet { - #[pallet::call_index(0)] - #[pallet::weight({0})] - pub fn schedule_migration( - origin: OriginFor, - code: Vec, - head_data: Vec, - ) -> DispatchResult { - ensure_root(origin)?; - - parachain_system::Pallet::::schedule_code_upgrade(code)?; - Self::store_pending_custom_validation_head_data(head_data); - Ok(()) - } - } - - impl Pallet { - /// Set a custom head data that should only be applied when upgradeGoAheadSignal from - /// the Relay Chain is GoAhead - fn store_pending_custom_validation_head_data(head_data: Vec) { - PendingCustomValidationHeadData::::put(head_data); - Self::deposit_event(Event::CustomValidationHeadDataStored); - } - - /// Set pending custom head data as head data that will be returned by `validate_block`. on - /// the relay chain. - fn set_pending_custom_validation_head_data() { - if let Some(head_data) = >::take() { - parachain_system::Pallet::::set_custom_validation_head_data(head_data); - Self::deposit_event(Event::CustomValidationHeadDataApplied); - } - } - } - - impl parachain_system::OnSystemEvent for Pallet { - fn on_validation_data(_data: &PersistedValidationData) {} - fn on_validation_code_applied() { - crate::Pallet::::set_pending_custom_validation_head_data(); - } - } -} diff --git a/cumulus/pallets/xcm/Cargo.toml b/cumulus/pallets/xcm/Cargo.toml deleted file mode 100644 index 213af07fdc52..000000000000 --- a/cumulus/pallets/xcm/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -authors = ["Parity Technologies "] -edition = "2021" -name = "cumulus-pallet-xcm" -version = "0.1.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } - -[features] -default = ["std"] -std = [ - "codec/std", - "scale-info/std", - "cumulus-primitives-core/std", - "sp-std/std", - "sp-runtime/std", - "frame-support/std", - "frame-system/std", - "xcm/std", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/cumulus/pallets/xcm/src/lib.rs b/cumulus/pallets/xcm/src/lib.rs deleted file mode 100644 index f230ced5dc55..000000000000 --- a/cumulus/pallets/xcm/src/lib.rs +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Pallet for stuff specific to parachains' usage of XCM. Right now that's just the origin -//! used by parachains when receiving `Transact` messages from other parachains or the Relay chain -//! which must be natively represented. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, DecodeLimit, Encode}; -use cumulus_primitives_core::{ - relay_chain::BlockNumber as RelayBlockNumber, DmpMessageHandler, ParaId, -}; -use frame_support::dispatch::Weight; -pub use pallet::*; -use scale_info::TypeInfo; -use sp_runtime::{traits::BadOrigin, RuntimeDebug}; -use sp_std::{convert::TryFrom, prelude::*}; -use xcm::{ - latest::{ExecuteXcm, Outcome, Parent, Xcm}, - VersionedXcm, MAX_XCM_DECODE_DEPTH, -}; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - pub struct Pallet(_); - - /// The module configuration trait. - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - type XcmExecutor: ExecuteXcm; - } - - #[pallet::error] - pub enum Error {} - - #[pallet::hooks] - impl Hooks> for Pallet {} - - #[pallet::call] - impl Pallet {} - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// Downward message is invalid XCM. - /// \[ id \] - InvalidFormat([u8; 32]), - /// Downward message is unsupported version of XCM. - /// \[ id \] - UnsupportedVersion([u8; 32]), - /// Downward message executed with the given outcome. - /// \[ id, outcome \] - ExecutedDownward([u8; 32], Outcome), - } - - /// Origin for the parachains module. - #[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo, RuntimeDebug, MaxEncodedLen)] - #[pallet::origin] - pub enum Origin { - /// It comes from the (parent) relay chain. - Relay, - /// It comes from a (sibling) parachain. - SiblingParachain(ParaId), - } - - impl From for Origin { - fn from(id: ParaId) -> Origin { - Origin::SiblingParachain(id) - } - } - impl From for Origin { - fn from(id: u32) -> Origin { - Origin::SiblingParachain(id.into()) - } - } -} - -/// For an incoming downward message, this just adapts an XCM executor and executes DMP messages -/// immediately. Their origin is asserted to be the Parent location. -/// -/// The weight `limit` is only respected as the maximum for an individual message. -/// -/// Because this largely ignores the given weight limit, it probably isn't good for most production -/// uses. Use DmpQueue pallet for a more robust design. -pub struct UnlimitedDmpExecution(sp_std::marker::PhantomData); -impl DmpMessageHandler for UnlimitedDmpExecution { - fn handle_dmp_messages( - iter: impl Iterator)>, - limit: Weight, - ) -> Weight { - let mut used = Weight::zero(); - for (_sent_at, data) in iter { - let id = sp_io::hashing::blake2_256(&data[..]); - let msg = VersionedXcm::::decode_all_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut data.as_slice(), - ) - .map(Xcm::::try_from); - match msg { - Err(_) => Pallet::::deposit_event(Event::InvalidFormat(id)), - Ok(Err(())) => Pallet::::deposit_event(Event::UnsupportedVersion(id)), - Ok(Ok(x)) => { - let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, limit); - used = used.saturating_add(outcome.weight_used()); - Pallet::::deposit_event(Event::ExecutedDownward(id, outcome)); - }, - } - } - used - } -} - -/// For an incoming downward message, this just adapts an XCM executor and executes DMP messages -/// immediately. Their origin is asserted to be the Parent location. -/// -/// This respects the given weight limit and silently drops messages if they would break it. It -/// probably isn't good for most production uses. Use DmpQueue pallet for a more robust design. -pub struct LimitAndDropDmpExecution(sp_std::marker::PhantomData); -impl DmpMessageHandler for LimitAndDropDmpExecution { - fn handle_dmp_messages( - iter: impl Iterator)>, - limit: Weight, - ) -> Weight { - let mut used = Weight::zero(); - for (_sent_at, data) in iter { - let id = sp_io::hashing::blake2_256(&data[..]); - let msg = VersionedXcm::::decode_all_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut data.as_slice(), - ) - .map(Xcm::::try_from); - match msg { - Err(_) => Pallet::::deposit_event(Event::InvalidFormat(id)), - Ok(Err(())) => Pallet::::deposit_event(Event::UnsupportedVersion(id)), - Ok(Ok(x)) => { - let weight_limit = limit.saturating_sub(used); - let outcome = T::XcmExecutor::execute_xcm(Parent, x, id, weight_limit); - used = used.saturating_add(outcome.weight_used()); - Pallet::::deposit_event(Event::ExecutedDownward(id, outcome)); - }, - } - } - used - } -} - -/// Ensure that the origin `o` represents a sibling parachain. -/// Returns `Ok` with the parachain ID of the sibling or an `Err` otherwise. -pub fn ensure_sibling_para(o: OuterOrigin) -> Result -where - OuterOrigin: Into>, -{ - match o.into() { - Ok(Origin::SiblingParachain(id)) => Ok(id), - _ => Err(BadOrigin), - } -} - -/// Ensure that the origin `o` represents is the relay chain. -/// Returns `Ok` if it does or an `Err` otherwise. -pub fn ensure_relay(o: OuterOrigin) -> Result<(), BadOrigin> -where - OuterOrigin: Into>, -{ - match o.into() { - Ok(Origin::Relay) => Ok(()), - _ => Err(BadOrigin), - } -} diff --git a/cumulus/pallets/xcmp-queue/Cargo.toml b/cumulus/pallets/xcmp-queue/Cargo.toml deleted file mode 100644 index 842e3ce9af80..000000000000 --- a/cumulus/pallets/xcmp-queue/Cargo.toml +++ /dev/null @@ -1,66 +0,0 @@ -[package] -name = "cumulus-pallet-xcmp-queue" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive" ], default-features = false } -log = { version = "0.4.20", default-features = false } -rand_chacha = { version = "0.3.0", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } - -# Optional import for benchmarking -frame-benchmarking = { default-features = false, optional = true, git = "https://github.com/paritytech/substrate", branch = "master" } - -[dev-dependencies] - -# Substrate -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -xcm-builder = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { path = "../parachain-system" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "cumulus-primitives-core/std", - "frame-support/std", - "frame-system/std", - "log/std", - "polkadot-runtime-common/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "xcm-executor/std", - "xcm/std", -] - -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/cumulus/pallets/xcmp-queue/src/benchmarking.rs b/cumulus/pallets/xcmp-queue/src/benchmarking.rs deleted file mode 100644 index f4167e522fa4..000000000000 --- a/cumulus/pallets/xcmp-queue/src/benchmarking.rs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Benchmarking setup for cumulus-pallet-xcmp-queue - -use crate::*; - -use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; -use frame_system::RawOrigin; - -benchmarks! { - set_config_with_u32 {}: update_resume_threshold(RawOrigin::Root, 100) - set_config_with_weight {}: update_weight_restrict_decay(RawOrigin::Root, Weight::from_parts(3_000_000, 0)) -} - -impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/cumulus/pallets/xcmp-queue/src/lib.rs b/cumulus/pallets/xcmp-queue/src/lib.rs deleted file mode 100644 index 960af9b5b772..000000000000 --- a/cumulus/pallets/xcmp-queue/src/lib.rs +++ /dev/null @@ -1,1180 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! A pallet which uses the XCMP transport layer to handle both incoming and outgoing XCM message -//! sending and dispatch, queuing, signalling and backpressure. To do so, it implements: -//! * `XcmpMessageHandler` -//! * `XcmpMessageSource` -//! -//! Also provides an implementation of `SendXcm` which can be placed in a router tuple for relaying -//! XCM over XCMP if the destination is `Parent/Parachain`. It requires an implementation of -//! `XcmExecutor` for dispatching incoming XCM messages. - -#![cfg_attr(not(feature = "std"), no_std)] - -pub mod migration; - -#[cfg(test)] -mod mock; - -#[cfg(test)] -mod tests; - -#[cfg(feature = "runtime-benchmarks")] -mod benchmarking; -pub mod weights; -pub use weights::WeightInfo; - -use codec::{Decode, DecodeLimit, Encode}; -use cumulus_primitives_core::{ - relay_chain::BlockNumber as RelayBlockNumber, ChannelStatus, GetChannelInfo, MessageSendError, - ParaId, XcmpMessageFormat, XcmpMessageHandler, XcmpMessageSource, -}; -use frame_support::{ - traits::{EnsureOrigin, Get}, - weights::{constants::WEIGHT_REF_TIME_PER_MILLIS, Weight}, -}; -use polkadot_runtime_common::xcm_sender::PriceForParachainDelivery; -use rand_chacha::{ - rand_core::{RngCore, SeedableRng}, - ChaChaRng, -}; -use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; -use sp_std::{convert::TryFrom, prelude::*}; -use xcm::{latest::prelude::*, VersionedXcm, WrapVersion, MAX_XCM_DECODE_DEPTH}; -use xcm_executor::traits::ConvertOrigin; - -pub use pallet::*; - -/// Index used to identify overweight XCMs. -pub type OverweightIndex = u64; - -const LOG_TARGET: &str = "xcmp_queue"; -const DEFAULT_POV_SIZE: u64 = 64 * 1024; // 64 KB - -// Maximum amount of messages to process per block. This is a temporary measure until we properly -// account for proof size weights. -const MAX_MESSAGES_PER_BLOCK: u8 = 10; -// Maximum amount of messages that can exist in the overweight queue at any given time. -const MAX_OVERWEIGHT_MESSAGES: u32 = 1000; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - #[pallet::storage_version(migration::STORAGE_VERSION)] - #[pallet::without_storage_info] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config { - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - /// Something to execute an XCM message. We need this to service the XCMoXCMP queue. - type XcmExecutor: ExecuteXcm; - - /// Information on the avaialble XCMP channels. - type ChannelInfo: GetChannelInfo; - - /// Means of converting an `Xcm` into a `VersionedXcm`. - type VersionWrapper: WrapVersion; - - /// The origin that is allowed to execute overweight messages. - type ExecuteOverweightOrigin: EnsureOrigin; - - /// The origin that is allowed to resume or suspend the XCMP queue. - type ControllerOrigin: EnsureOrigin; - - /// The conversion function used to attempt to convert an XCM `MultiLocation` origin to a - /// superuser origin. - type ControllerOriginConverter: ConvertOrigin; - - /// The price for delivering an XCM to a sibling parachain destination. - type PriceForSiblingDelivery: PriceForParachainDelivery; - - /// The weight information of this pallet. - type WeightInfo: WeightInfo; - } - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_idle(_now: BlockNumberFor, max_weight: Weight) -> Weight { - // on_idle processes additional messages with any remaining block weight. - Self::service_xcmp_queue(max_weight) - } - } - - #[pallet::call] - impl Pallet { - /// Services a single overweight XCM. - /// - /// - `origin`: Must pass `ExecuteOverweightOrigin`. - /// - `index`: The index of the overweight XCM to service - /// - `weight_limit`: The amount of weight that XCM execution may take. - /// - /// Errors: - /// - `BadOverweightIndex`: XCM under `index` is not found in the `Overweight` storage map. - /// - `BadXcm`: XCM under `index` cannot be properly decoded into a valid XCM format. - /// - `WeightOverLimit`: XCM execution may use greater `weight_limit`. - /// - /// Events: - /// - `OverweightServiced`: On success. - #[pallet::call_index(0)] - #[pallet::weight((weight_limit.saturating_add(Weight::from_parts(1_000_000, 0)), DispatchClass::Operational))] - pub fn service_overweight( - origin: OriginFor, - index: OverweightIndex, - weight_limit: Weight, - ) -> DispatchResultWithPostInfo { - T::ExecuteOverweightOrigin::ensure_origin(origin)?; - - let (sender, sent_at, data) = - Overweight::::get(index).ok_or(Error::::BadOverweightIndex)?; - let xcm = VersionedXcm::::decode_all_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut data.as_slice(), - ) - .map_err(|_| Error::::BadXcm)?; - let used = Self::handle_xcm_message(sender, sent_at, xcm, weight_limit) - .map_err(|_| Error::::WeightOverLimit)?; - Overweight::::remove(index); - Self::deposit_event(Event::OverweightServiced { index, used }); - Ok(Some(used.saturating_add(Weight::from_parts(1_000_000, 0))).into()) - } - - /// Suspends all XCM executions for the XCMP queue, regardless of the sender's origin. - /// - /// - `origin`: Must pass `ControllerOrigin`. - #[pallet::call_index(1)] - #[pallet::weight((T::DbWeight::get().writes(1), DispatchClass::Operational,))] - pub fn suspend_xcm_execution(origin: OriginFor) -> DispatchResult { - T::ControllerOrigin::ensure_origin(origin)?; - - QueueSuspended::::put(true); - - Ok(()) - } - - /// Resumes all XCM executions for the XCMP queue. - /// - /// Note that this function doesn't change the status of the in/out bound channels. - /// - /// - `origin`: Must pass `ControllerOrigin`. - #[pallet::call_index(2)] - #[pallet::weight((T::DbWeight::get().writes(1), DispatchClass::Operational,))] - pub fn resume_xcm_execution(origin: OriginFor) -> DispatchResult { - T::ControllerOrigin::ensure_origin(origin)?; - - QueueSuspended::::put(false); - - Ok(()) - } - - /// Overwrites the number of pages of messages which must be in the queue for the other side - /// to be told to suspend their sending. - /// - /// - `origin`: Must pass `Root`. - /// - `new`: Desired value for `QueueConfigData.suspend_value` - #[pallet::call_index(3)] - #[pallet::weight((T::WeightInfo::set_config_with_u32(), DispatchClass::Operational,))] - pub fn update_suspend_threshold(origin: OriginFor, new: u32) -> DispatchResult { - ensure_root(origin)?; - QueueConfig::::mutate(|data| data.suspend_threshold = new); - - Ok(()) - } - - /// Overwrites the number of pages of messages which must be in the queue after which we - /// drop any further messages from the channel. - /// - /// - `origin`: Must pass `Root`. - /// - `new`: Desired value for `QueueConfigData.drop_threshold` - #[pallet::call_index(4)] - #[pallet::weight((T::WeightInfo::set_config_with_u32(),DispatchClass::Operational,))] - pub fn update_drop_threshold(origin: OriginFor, new: u32) -> DispatchResult { - ensure_root(origin)?; - QueueConfig::::mutate(|data| data.drop_threshold = new); - - Ok(()) - } - - /// Overwrites the number of pages of messages which the queue must be reduced to before it - /// signals that message sending may recommence after it has been suspended. - /// - /// - `origin`: Must pass `Root`. - /// - `new`: Desired value for `QueueConfigData.resume_threshold` - #[pallet::call_index(5)] - #[pallet::weight((T::WeightInfo::set_config_with_u32(), DispatchClass::Operational,))] - pub fn update_resume_threshold(origin: OriginFor, new: u32) -> DispatchResult { - ensure_root(origin)?; - QueueConfig::::mutate(|data| data.resume_threshold = new); - - Ok(()) - } - - /// Overwrites the amount of remaining weight under which we stop processing messages. - /// - /// - `origin`: Must pass `Root`. - /// - `new`: Desired value for `QueueConfigData.threshold_weight` - #[pallet::call_index(6)] - #[pallet::weight((T::WeightInfo::set_config_with_weight(), DispatchClass::Operational,))] - pub fn update_threshold_weight(origin: OriginFor, new: Weight) -> DispatchResult { - ensure_root(origin)?; - QueueConfig::::mutate(|data| data.threshold_weight = new); - - Ok(()) - } - - /// Overwrites the speed to which the available weight approaches the maximum weight. - /// A lower number results in a faster progression. A value of 1 makes the entire weight - /// available initially. - /// - /// - `origin`: Must pass `Root`. - /// - `new`: Desired value for `QueueConfigData.weight_restrict_decay`. - #[pallet::call_index(7)] - #[pallet::weight((T::WeightInfo::set_config_with_weight(), DispatchClass::Operational,))] - pub fn update_weight_restrict_decay(origin: OriginFor, new: Weight) -> DispatchResult { - ensure_root(origin)?; - QueueConfig::::mutate(|data| data.weight_restrict_decay = new); - - Ok(()) - } - - /// Overwrite the maximum amount of weight any individual message may consume. - /// Messages above this weight go into the overweight queue and may only be serviced - /// explicitly. - /// - /// - `origin`: Must pass `Root`. - /// - `new`: Desired value for `QueueConfigData.xcmp_max_individual_weight`. - #[pallet::call_index(8)] - #[pallet::weight((T::WeightInfo::set_config_with_weight(), DispatchClass::Operational,))] - pub fn update_xcmp_max_individual_weight( - origin: OriginFor, - new: Weight, - ) -> DispatchResult { - ensure_root(origin)?; - QueueConfig::::mutate(|data| data.xcmp_max_individual_weight = new); - - Ok(()) - } - } - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// Some XCM was executed ok. - Success { message_hash: XcmHash, message_id: XcmHash, weight: Weight }, - /// Some XCM failed. - Fail { message_hash: XcmHash, message_id: XcmHash, error: XcmError, weight: Weight }, - /// Bad XCM version used. - BadVersion { message_hash: XcmHash }, - /// Bad XCM format used. - BadFormat { message_hash: XcmHash }, - /// An HRMP message was sent to a sibling parachain. - XcmpMessageSent { message_hash: XcmHash }, - /// An XCM exceeded the individual message weight budget. - OverweightEnqueued { - sender: ParaId, - sent_at: RelayBlockNumber, - index: OverweightIndex, - required: Weight, - }, - /// An XCM from the overweight queue was executed with the given actual weight used. - OverweightServiced { index: OverweightIndex, used: Weight }, - } - - #[pallet::error] - pub enum Error { - /// Failed to send XCM message. - FailedToSend, - /// Bad XCM origin. - BadXcmOrigin, - /// Bad XCM data. - BadXcm, - /// Bad overweight index. - BadOverweightIndex, - /// Provided weight is possibly not enough to execute the message. - WeightOverLimit, - } - - /// Status of the inbound XCMP channels. - #[pallet::storage] - pub(super) type InboundXcmpStatus = - StorageValue<_, Vec, ValueQuery>; - - /// Inbound aggregate XCMP messages. It can only be one per ParaId/block. - #[pallet::storage] - pub(super) type InboundXcmpMessages = StorageDoubleMap< - _, - Blake2_128Concat, - ParaId, - Twox64Concat, - RelayBlockNumber, - Vec, - ValueQuery, - >; - - /// The non-empty XCMP channels in order of becoming non-empty, and the index of the first - /// and last outbound message. If the two indices are equal, then it indicates an empty - /// queue and there must be a non-`Ok` `OutboundStatus`. We assume queues grow no greater - /// than 65535 items. Queue indices for normal messages begin at one; zero is reserved in - /// case of the need to send a high-priority signal message this block. - /// The bool is true if there is a signal message waiting to be sent. - #[pallet::storage] - pub(super) type OutboundXcmpStatus = - StorageValue<_, Vec, ValueQuery>; - - // The new way of doing it: - /// The messages outbound in a given XCMP channel. - #[pallet::storage] - pub(super) type OutboundXcmpMessages = - StorageDoubleMap<_, Blake2_128Concat, ParaId, Twox64Concat, u16, Vec, ValueQuery>; - - /// Any signal messages waiting to be sent. - #[pallet::storage] - pub(super) type SignalMessages = - StorageMap<_, Blake2_128Concat, ParaId, Vec, ValueQuery>; - - /// The configuration which controls the dynamics of the outbound queue. - #[pallet::storage] - pub(super) type QueueConfig = StorageValue<_, QueueConfigData, ValueQuery>; - - /// The messages that exceeded max individual message weight budget. - /// - /// These message stay in this storage map until they are manually dispatched via - /// `service_overweight`. - #[pallet::storage] - pub(super) type Overweight = - CountedStorageMap<_, Twox64Concat, OverweightIndex, (ParaId, RelayBlockNumber, Vec)>; - - /// The number of overweight messages ever recorded in `Overweight`. Also doubles as the next - /// available free overweight index. - #[pallet::storage] - pub(super) type OverweightCount = StorageValue<_, OverweightIndex, ValueQuery>; - - /// Whether or not the XCMP queue is suspended from executing incoming XCMs or not. - #[pallet::storage] - pub(super) type QueueSuspended = StorageValue<_, bool, ValueQuery>; -} - -#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, RuntimeDebug, TypeInfo)] -pub enum InboundState { - Ok, - Suspended, -} - -#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] -pub enum OutboundState { - Ok, - Suspended, -} - -/// Struct containing detailed information about the inbound channel. -#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo)] -pub struct InboundChannelDetails { - /// The `ParaId` of the parachain that this channel is connected with. - sender: ParaId, - /// The state of the channel. - state: InboundState, - /// The ordered metadata of each inbound message. - /// - /// Contains info about the relay block number that the message was sent at, and the format - /// of the incoming message. - message_metadata: Vec<(RelayBlockNumber, XcmpMessageFormat)>, -} - -/// Struct containing detailed information about the outbound channel. -#[derive(Clone, Eq, PartialEq, Encode, Decode, TypeInfo)] -pub struct OutboundChannelDetails { - /// The `ParaId` of the parachain that this channel is connected with. - recipient: ParaId, - /// The state of the channel. - state: OutboundState, - /// Whether or not any signals exist in this channel. - signals_exist: bool, - /// The index of the first outbound message. - first_index: u16, - /// The index of the last outbound message. - last_index: u16, -} - -impl OutboundChannelDetails { - pub fn new(recipient: ParaId) -> OutboundChannelDetails { - OutboundChannelDetails { - recipient, - state: OutboundState::Ok, - signals_exist: false, - first_index: 0, - last_index: 0, - } - } - - pub fn with_signals(mut self) -> OutboundChannelDetails { - self.signals_exist = true; - self - } - - pub fn with_suspended_state(mut self) -> OutboundChannelDetails { - self.state = OutboundState::Suspended; - self - } -} - -#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] -pub struct QueueConfigData { - /// The number of pages of messages which must be in the queue for the other side to be told to - /// suspend their sending. - suspend_threshold: u32, - /// The number of pages of messages which must be in the queue after which we drop any further - /// messages from the channel. - drop_threshold: u32, - /// The number of pages of messages which the queue must be reduced to before it signals that - /// message sending may recommence after it has been suspended. - resume_threshold: u32, - /// The amount of remaining weight under which we stop processing messages. - threshold_weight: Weight, - /// The speed to which the available weight approaches the maximum weight. A lower number - /// results in a faster progression. A value of 1 makes the entire weight available initially. - weight_restrict_decay: Weight, - /// The maximum amount of weight any individual message may consume. Messages above this weight - /// go into the overweight queue and may only be serviced explicitly. - xcmp_max_individual_weight: Weight, -} - -impl Default for QueueConfigData { - fn default() -> Self { - Self { - suspend_threshold: 2, - drop_threshold: 5, - resume_threshold: 1, - threshold_weight: Weight::from_parts(100_000, 0), - weight_restrict_decay: Weight::from_parts(2, 0), - xcmp_max_individual_weight: Weight::from_parts( - 20u64 * WEIGHT_REF_TIME_PER_MILLIS, - DEFAULT_POV_SIZE, - ), - } - } -} - -#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode, TypeInfo)] -pub enum ChannelSignal { - Suspend, - Resume, -} - -impl Pallet { - /// Place a message `fragment` on the outgoing XCMP queue for `recipient`. - /// - /// Format is the type of aggregate message that the `fragment` may be safely encoded and - /// appended onto. Whether earlier unused space is used for the fragment at the risk of sending - /// it out of order is determined with `qos`. NOTE: For any two messages to be guaranteed to be - /// dispatched in order, then both must be sent with `ServiceQuality::Ordered`. - /// - /// ## Background - /// - /// For our purposes, one HRMP "message" is actually an aggregated block of XCM "messages". - /// - /// For the sake of clarity, we distinguish between them as message AGGREGATEs versus - /// message FRAGMENTs. - /// - /// So each AGGREGATE is comprised of one or more concatenated SCALE-encoded `Vec` - /// FRAGMENTs. Though each fragment is already probably a SCALE-encoded Xcm, we can't be - /// certain, so we SCALE encode each `Vec` fragment in order to ensure we have the - /// length prefixed and can thus decode each fragment from the aggregate stream. With this, - /// we can concatenate them into a single aggregate blob without needing to be concerned - /// about encoding fragment boundaries. - fn send_fragment( - recipient: ParaId, - format: XcmpMessageFormat, - fragment: Fragment, - ) -> Result { - let data = fragment.encode(); - - // Optimization note: `max_message_size` could potentially be stored in - // `OutboundXcmpMessages` once known; that way it's only accessed when a new page is needed. - - let max_message_size = - T::ChannelInfo::get_channel_max(recipient).ok_or(MessageSendError::NoChannel)?; - if data.len() > max_message_size { - return Err(MessageSendError::TooBig) - } - - let mut s = >::get(); - let details = if let Some(details) = s.iter_mut().find(|item| item.recipient == recipient) { - details - } else { - s.push(OutboundChannelDetails::new(recipient)); - s.last_mut().expect("can't be empty; a new element was just pushed; qed") - }; - let have_active = details.last_index > details.first_index; - let appended = have_active && - >::mutate(recipient, details.last_index - 1, |s| { - if XcmpMessageFormat::decode_with_depth_limit(MAX_XCM_DECODE_DEPTH, &mut &s[..]) != - Ok(format) - { - return false - } - if s.len() + data.len() > max_message_size { - return false - } - s.extend_from_slice(&data[..]); - true - }); - if appended { - Ok((details.last_index - details.first_index - 1) as u32) - } else { - // Need to add a new page. - let page_index = details.last_index; - details.last_index += 1; - let mut new_page = format.encode(); - new_page.extend_from_slice(&data[..]); - >::insert(recipient, page_index, new_page); - let r = (details.last_index - details.first_index - 1) as u32; - >::put(s); - Ok(r) - } - } - - /// Sends a signal to the `dest` chain over XCMP. This is guaranteed to be dispatched on this - /// block. - fn send_signal(dest: ParaId, signal: ChannelSignal) -> Result<(), ()> { - let mut s = >::get(); - if let Some(details) = s.iter_mut().find(|item| item.recipient == dest) { - details.signals_exist = true; - } else { - s.push(OutboundChannelDetails::new(dest).with_signals()); - } - >::mutate(dest, |page| { - if page.is_empty() { - *page = (XcmpMessageFormat::Signals, signal).encode(); - } else { - signal.using_encoded(|s| page.extend_from_slice(s)); - } - }); - >::put(s); - - Ok(()) - } - - pub fn send_blob_message(recipient: ParaId, blob: Vec) -> Result { - Self::send_fragment(recipient, XcmpMessageFormat::ConcatenatedEncodedBlob, blob) - } - - pub fn send_xcm_message( - recipient: ParaId, - xcm: VersionedXcm<()>, - ) -> Result { - Self::send_fragment(recipient, XcmpMessageFormat::ConcatenatedVersionedXcm, xcm) - } - - fn create_shuffle(len: usize) -> Vec { - // Create a shuffled order for use to iterate through. - // Not a great random seed, but good enough for our purposes. - let seed = frame_system::Pallet::::parent_hash(); - let seed = - <[u8; 32]>::decode(&mut sp_runtime::traits::TrailingZeroInput::new(seed.as_ref())) - .expect("input is padded with zeroes; qed"); - let mut rng = ChaChaRng::from_seed(seed); - let mut shuffled = (0..len).collect::>(); - for i in 0..len { - let j = (rng.next_u32() as usize) % len; - shuffled.as_mut_slice().swap(i, j); - } - shuffled - } - - fn handle_blob_message( - _sender: ParaId, - _sent_at: RelayBlockNumber, - _blob: Vec, - _weight_limit: Weight, - ) -> Result { - debug_assert!(false, "Blob messages not handled."); - Err(false) - } - - fn handle_xcm_message( - sender: ParaId, - _sent_at: RelayBlockNumber, - xcm: VersionedXcm, - max_weight: Weight, - ) -> Result { - let message_hash = xcm.using_encoded(sp_io::hashing::blake2_256); - log::debug!("Processing XCMP-XCM: {:?}", &message_hash); - let (result, event) = match Xcm::::try_from(xcm) { - Ok(xcm) => { - let location = (Parent, Parachain(sender.into())); - let mut message_id = message_hash; - - match T::XcmExecutor::prepare_and_execute( - location, - xcm, - &mut message_id, - max_weight, - Weight::zero(), - ) { - Outcome::Error(error) => ( - Err(error), - Event::Fail { message_hash, message_id, error, weight: Weight::zero() }, - ), - Outcome::Complete(weight) => - (Ok(weight), Event::Success { message_hash, message_id, weight }), - // As far as the caller is concerned, this was dispatched without error, so - // we just report the weight used. - Outcome::Incomplete(weight, error) => - (Ok(weight), Event::Fail { message_hash, message_id, error, weight }), - } - }, - Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion { message_hash }), - }; - Self::deposit_event(event); - result - } - - fn process_xcmp_message( - sender: ParaId, - (sent_at, format): (RelayBlockNumber, XcmpMessageFormat), - messages_processed: &mut u8, - max_weight: Weight, - max_individual_weight: Weight, - ) -> (Weight, bool) { - let data = >::get(sender, sent_at); - let mut last_remaining_fragments; - let mut remaining_fragments = &data[..]; - let mut weight_used = Weight::zero(); - match format { - XcmpMessageFormat::ConcatenatedVersionedXcm => { - while !remaining_fragments.is_empty() && - *messages_processed < MAX_MESSAGES_PER_BLOCK - { - last_remaining_fragments = remaining_fragments; - if let Ok(xcm) = VersionedXcm::::decode_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut remaining_fragments, - ) { - let weight = max_weight - weight_used; - *messages_processed += 1; - match Self::handle_xcm_message(sender, sent_at, xcm, weight) { - Ok(used) => weight_used = weight_used.saturating_add(used), - Err(XcmError::WeightLimitReached(required)) - if required.any_gt(max_individual_weight) => - { - let is_under_limit = - Overweight::::count() < MAX_OVERWEIGHT_MESSAGES; - weight_used.saturating_accrue(T::DbWeight::get().reads(1)); - if is_under_limit { - // overweight - add to overweight queue and continue with - // message execution consuming the message. - let msg_len = last_remaining_fragments - .len() - .saturating_sub(remaining_fragments.len()); - let overweight_xcm = - last_remaining_fragments[..msg_len].to_vec(); - let index = - Self::stash_overweight(sender, sent_at, overweight_xcm); - let e = Event::OverweightEnqueued { - sender, - sent_at, - index, - required, - }; - Self::deposit_event(e); - } - }, - Err(XcmError::WeightLimitReached(required)) - if required.all_lte(max_weight) => - { - // That message didn't get processed this time because of being - // too heavy. We leave it around for next time and bail. - remaining_fragments = last_remaining_fragments; - break - }, - Err(error) => { - log::error!( - "Failed to process XCMP-XCM message, caused by {:?}", - error - ); - // Message looks invalid; don't attempt to retry - }, - } - } else { - debug_assert!(false, "Invalid incoming XCMP message data"); - remaining_fragments = &b""[..]; - } - } - }, - XcmpMessageFormat::ConcatenatedEncodedBlob => { - while !remaining_fragments.is_empty() { - last_remaining_fragments = remaining_fragments; - - if let Ok(blob) = >::decode(&mut remaining_fragments) { - let weight = max_weight - weight_used; - *messages_processed += 1; - match Self::handle_blob_message(sender, sent_at, blob, weight) { - Ok(used) => weight_used = weight_used.saturating_add(used), - Err(true) => { - // That message didn't get processed this time because of being - // too heavy. We leave it around for next time and bail. - remaining_fragments = last_remaining_fragments; - break - }, - Err(false) => { - // Message invalid; don't attempt to retry - }, - } - } else { - debug_assert!(false, "Invalid incoming blob message data"); - remaining_fragments = &b""[..]; - } - } - }, - XcmpMessageFormat::Signals => { - debug_assert!(false, "All signals are handled immediately; qed"); - remaining_fragments = &b""[..]; - }, - } - let is_empty = remaining_fragments.is_empty(); - if is_empty { - >::remove(sender, sent_at); - } else { - >::insert(sender, sent_at, remaining_fragments); - } - (weight_used, is_empty) - } - - /// Puts a given XCM into the list of overweight messages, allowing it to be executed later. - fn stash_overweight( - sender: ParaId, - sent_at: RelayBlockNumber, - xcm: Vec, - ) -> OverweightIndex { - let index = OverweightCount::::mutate(|count| { - let index = *count; - *count += 1; - index - }); - - Overweight::::insert(index, (sender, sent_at, xcm)); - index - } - - /// Service the incoming XCMP message queue attempting to execute up to `max_weight` execution - /// weight of messages. - /// - /// Channels are first shuffled and then processed in this random one page at a time, order over - /// and over until either `max_weight` is exhausted or no channel has messages that can be - /// processed any more. - /// - /// There are two obvious "modes" that we could apportion `max_weight`: one would be to attempt - /// to spend it all on the first channel's first page, then use the leftover (if any) for the - /// second channel's first page and so on until finally we cycle back and the process messages - /// on the first channel's second page &c. The other mode would be to apportion only `1/N` of - /// `max_weight` for the first page (where `N` could be, perhaps, the number of channels to - /// service, using the remainder plus the next `1/N` for the next channel's page &c. - /// - /// Both modes have good qualities, the first ensures that a channel with a large message (over - /// `1/N` does not get indefinitely blocked if other channels have continuous, light traffic. - /// The second is fairer, and ensures that channels with continuous light messages don't suffer - /// high latency. - /// - /// The following code is a hybrid solution; we have a concept of `weight_available` which - /// incrementally approaches `max_weight` as more channels are attempted to be processed. We use - /// the parameter `weight_restrict_decay` to control the speed with which `weight_available` - /// approaches `max_weight`, with `0` being strictly equivalent to the first aforementioned - /// mode, and `N` approximating the second. A reasonable parameter may be `1`, which makes - /// half of the `max_weight` available for the first page, then a quarter plus the remainder - /// for the second &c. though empirical and or practical factors may give rise to adjusting it - /// further. - fn service_xcmp_queue(max_weight: Weight) -> Weight { - let suspended = QueueSuspended::::get(); - let mut messages_processed = 0; - - let mut status = >::get(); // <- sorted. - if status.is_empty() { - return Weight::zero() - } - - let QueueConfigData { - resume_threshold, - threshold_weight, - weight_restrict_decay, - xcmp_max_individual_weight, - .. - } = >::get(); - - let mut shuffled = Self::create_shuffle(status.len()); - let mut weight_used = Weight::zero(); - let mut weight_available = Weight::zero(); - - // We don't want the possibility of a chain sending a series of really heavy messages and - // tying up the block's execution time from other chains. Therefore we execute any remaining - // messages in a random order. - // Order within a single channel will always be preserved, however this does mean that - // relative order between channels may not. The result is that chains which tend to send - // fewer, lighter messages will generally have a lower latency than chains which tend to - // send more, heavier messages. - - let mut shuffle_index = 0; - while shuffle_index < shuffled.len() && - max_weight.saturating_sub(weight_used).all_gte(threshold_weight) && - messages_processed < MAX_MESSAGES_PER_BLOCK - { - let index = shuffled[shuffle_index]; - let sender = status[index].sender; - let sender_origin = T::ControllerOriginConverter::convert_origin( - (Parent, Parachain(sender.into())), - OriginKind::Superuser, - ); - let is_controller = sender_origin - .map_or(false, |origin| T::ControllerOrigin::try_origin(origin).is_ok()); - - if suspended && !is_controller { - shuffle_index += 1; - continue - } - - if weight_available != max_weight { - // Get incrementally closer to freeing up max_weight for message execution over the - // first round. For the second round we unlock all weight. If we come close enough - // on the first round to unlocking everything, then we do so. - if shuffle_index < status.len() { - weight_available += - (max_weight - weight_available) / (weight_restrict_decay.ref_time() + 1); - if (weight_available + threshold_weight).any_gt(max_weight) { - weight_available = max_weight; - } - } else { - weight_available = max_weight; - } - } - - let weight_processed = if status[index].message_metadata.is_empty() { - debug_assert!(false, "channel exists in status; there must be messages; qed"); - Weight::zero() - } else { - // Process up to one block's worth for now. - let weight_remaining = weight_available.saturating_sub(weight_used); - let (weight_processed, is_empty) = Self::process_xcmp_message( - sender, - status[index].message_metadata[0], - &mut messages_processed, - weight_remaining, - xcmp_max_individual_weight, - ); - if is_empty { - status[index].message_metadata.remove(0); - } - weight_processed - }; - weight_used += weight_processed; - - if status[index].message_metadata.len() as u32 <= resume_threshold && - status[index].state == InboundState::Suspended - { - // Resume - let r = Self::send_signal(sender, ChannelSignal::Resume); - debug_assert!(r.is_ok(), "WARNING: Failed sending resume into suspended channel"); - status[index].state = InboundState::Ok; - } - - // If there are more and we're making progress, we process them after we've given the - // other channels a look in. If we've still not unlocked all weight, then we set them - // up for processing a second time anyway. - if !status[index].message_metadata.is_empty() && - (weight_processed.any_gt(Weight::zero()) || weight_available != max_weight) - { - if shuffle_index + 1 == shuffled.len() { - // Only this queue left. Just run around this loop once more. - continue - } - shuffled.push(index); - } - shuffle_index += 1; - } - - // Only retain the senders that have non-empty queues. - status.retain(|item| !item.message_metadata.is_empty()); - - >::put(status); - weight_used - } - - fn suspend_channel(target: ParaId) { - >::mutate(|s| { - if let Some(details) = s.iter_mut().find(|item| item.recipient == target) { - let ok = details.state == OutboundState::Ok; - debug_assert!(ok, "WARNING: Attempt to suspend channel that was not Ok."); - details.state = OutboundState::Suspended; - } else { - s.push(OutboundChannelDetails::new(target).with_suspended_state()); - } - }); - } - - fn resume_channel(target: ParaId) { - >::mutate(|s| { - if let Some(index) = s.iter().position(|item| item.recipient == target) { - let suspended = s[index].state == OutboundState::Suspended; - debug_assert!( - suspended, - "WARNING: Attempt to resume channel that was not suspended." - ); - if s[index].first_index == s[index].last_index { - s.remove(index); - } else { - s[index].state = OutboundState::Ok; - } - } else { - debug_assert!(false, "WARNING: Attempt to resume channel that was not suspended."); - } - }); - } -} - -impl XcmpMessageHandler for Pallet { - fn handle_xcmp_messages<'a, I: Iterator>( - iter: I, - max_weight: Weight, - ) -> Weight { - let mut status = >::get(); - - let QueueConfigData { suspend_threshold, drop_threshold, .. } = >::get(); - - for (sender, sent_at, data) in iter { - // Figure out the message format. - let mut data_ref = data; - let format = match XcmpMessageFormat::decode_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut data_ref, - ) { - Ok(f) => f, - Err(_) => { - debug_assert!(false, "Unknown XCMP message format. Silently dropping message"); - continue - }, - }; - if format == XcmpMessageFormat::Signals { - while !data_ref.is_empty() { - use ChannelSignal::*; - match ChannelSignal::decode(&mut data_ref) { - Ok(Suspend) => Self::suspend_channel(sender), - Ok(Resume) => Self::resume_channel(sender), - Err(_) => break, - } - } - } else { - // Record the fact we received it. - match status.binary_search_by_key(&sender, |item| item.sender) { - Ok(i) => { - let count = status[i].message_metadata.len(); - if count as u32 >= suspend_threshold && status[i].state == InboundState::Ok - { - status[i].state = InboundState::Suspended; - let r = Self::send_signal(sender, ChannelSignal::Suspend); - if r.is_err() { - log::warn!( - "Attempt to suspend channel failed. Messages may be dropped." - ); - } - } - if (count as u32) < drop_threshold { - status[i].message_metadata.push((sent_at, format)); - } else { - debug_assert!( - false, - "XCMP channel queue full. Silently dropping message" - ); - } - }, - Err(_) => status.push(InboundChannelDetails { - sender, - state: InboundState::Ok, - message_metadata: vec![(sent_at, format)], - }), - } - // Queue the payload for later execution. - >::insert(sender, sent_at, data_ref); - } - - // Optimization note; it would make sense to execute messages immediately if - // `status.is_empty()` here. - } - status.sort(); - >::put(status); - - Self::service_xcmp_queue(max_weight) - } -} - -impl XcmpMessageSource for Pallet { - fn take_outbound_messages(maximum_channels: usize) -> Vec<(ParaId, Vec)> { - let mut statuses = >::get(); - let old_statuses_len = statuses.len(); - let max_message_count = statuses.len().min(maximum_channels); - let mut result = Vec::with_capacity(max_message_count); - - for status in statuses.iter_mut() { - let OutboundChannelDetails { - recipient: para_id, - state: outbound_state, - mut signals_exist, - mut first_index, - mut last_index, - } = *status; - - if result.len() == max_message_count { - // We check this condition in the beginning of the loop so that we don't include - // a message where the limit is 0. - break - } - if outbound_state == OutboundState::Suspended { - continue - } - let (max_size_now, max_size_ever) = match T::ChannelInfo::get_channel_status(para_id) { - ChannelStatus::Closed => { - // This means that there is no such channel anymore. Nothing to be done but - // swallow the messages and discard the status. - for i in first_index..last_index { - >::remove(para_id, i); - } - if signals_exist { - >::remove(para_id); - } - *status = OutboundChannelDetails::new(para_id); - continue - }, - ChannelStatus::Full => continue, - ChannelStatus::Ready(n, e) => (n, e), - }; - - let page = if signals_exist { - let page = >::get(para_id); - if page.len() < max_size_now { - >::remove(para_id); - signals_exist = false; - page - } else { - continue - } - } else if last_index > first_index { - let page = >::get(para_id, first_index); - if page.len() < max_size_now { - >::remove(para_id, first_index); - first_index += 1; - page - } else { - continue - } - } else { - continue - }; - if first_index == last_index { - first_index = 0; - last_index = 0; - } - - if page.len() > max_size_ever { - // TODO: #274 This means that the channel's max message size has changed since - // the message was sent. We should parse it and split into smaller mesasges but - // since it's so unlikely then for now we just drop it. - log::warn!("WARNING: oversize message in queue. silently dropping."); - } else { - result.push((para_id, page)); - } - - *status = OutboundChannelDetails { - recipient: para_id, - state: outbound_state, - signals_exist, - first_index, - last_index, - }; - } - - // Sort the outbound messages by ascending recipient para id to satisfy the acceptance - // criteria requirement. - result.sort_by_key(|m| m.0); - - // Prune hrmp channels that became empty. Additionally, because it may so happen that we - // only gave attention to some channels in `non_empty_hrmp_channels` it's important to - // change the order. Otherwise, the next `on_finalize` we will again give attention - // only to those channels that happen to be in the beginning, until they are emptied. - // This leads to "starvation" of the channels near to the end. - // - // To mitigate this we shift all processed elements towards the end of the vector using - // `rotate_left`. To get intuition how it works see the examples in its rustdoc. - statuses.retain(|x| { - x.state == OutboundState::Suspended || x.signals_exist || x.first_index < x.last_index - }); - - // old_status_len must be >= status.len() since we never add anything to status. - let pruned = old_statuses_len - statuses.len(); - // removing an item from status implies a message being sent, so the result messages must - // be no less than the pruned channels. - statuses.rotate_left(result.len() - pruned); - - >::put(statuses); - - result - } -} - -/// Xcm sender for sending to a sibling parachain. -impl SendXcm for Pallet { - type Ticket = (ParaId, VersionedXcm<()>); - - fn validate( - dest: &mut Option, - msg: &mut Option>, - ) -> SendResult<(ParaId, VersionedXcm<()>)> { - let d = dest.take().ok_or(SendError::MissingArgument)?; - - match &d { - // An HRMP message for a sibling parachain. - MultiLocation { parents: 1, interior: X1(Parachain(id)) } => { - let xcm = msg.take().ok_or(SendError::MissingArgument)?; - let id = ParaId::from(*id); - let price = T::PriceForSiblingDelivery::price_for_parachain_delivery(id, &xcm); - let versioned_xcm = T::VersionWrapper::wrap_version(&d, xcm) - .map_err(|()| SendError::DestinationUnsupported)?; - Ok(((id, versioned_xcm), price)) - }, - _ => { - // Anything else is unhandled. This includes a message that is not meant for us. - // We need to make sure that dest/msg is not consumed here. - *dest = Some(d); - Err(SendError::NotApplicable) - }, - } - } - - fn deliver((id, xcm): (ParaId, VersionedXcm<()>)) -> Result { - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - match Self::send_fragment(id, XcmpMessageFormat::ConcatenatedVersionedXcm, xcm) { - Ok(_) => { - Self::deposit_event(Event::XcmpMessageSent { message_hash: hash }); - Ok(hash) - }, - Err(e) => Err(SendError::Transport(<&'static str>::from(e))), - } - } -} diff --git a/cumulus/pallets/xcmp-queue/src/migration.rs b/cumulus/pallets/xcmp-queue/src/migration.rs deleted file mode 100644 index bda54620cd9b..000000000000 --- a/cumulus/pallets/xcmp-queue/src/migration.rs +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! A module that is responsible for migration of storage. - -use crate::{Config, Overweight, Pallet, QueueConfig, DEFAULT_POV_SIZE}; -use frame_support::{ - pallet_prelude::*, - traits::{OnRuntimeUpgrade, StorageVersion}, - weights::{constants::WEIGHT_REF_TIME_PER_MILLIS, Weight}, -}; - -/// The current storage version. -pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(3); - -/// Migrates the pallet storage to the most recent version. -pub struct Migration(PhantomData); - -impl OnRuntimeUpgrade for Migration { - fn on_runtime_upgrade() -> Weight { - let mut weight = T::DbWeight::get().reads(1); - - if StorageVersion::get::>() == 1 { - weight.saturating_accrue(migrate_to_v2::()); - StorageVersion::new(2).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } - - if StorageVersion::get::>() == 2 { - weight.saturating_accrue(migrate_to_v3::()); - StorageVersion::new(3).put::>(); - weight.saturating_accrue(T::DbWeight::get().writes(1)); - } - - weight - } -} - -mod v1 { - use super::*; - use codec::{Decode, Encode}; - - #[derive(Encode, Decode, Debug)] - pub struct QueueConfigData { - pub suspend_threshold: u32, - pub drop_threshold: u32, - pub resume_threshold: u32, - pub threshold_weight: u64, - pub weight_restrict_decay: u64, - pub xcmp_max_individual_weight: u64, - } - - impl Default for QueueConfigData { - fn default() -> Self { - QueueConfigData { - suspend_threshold: 2, - drop_threshold: 5, - resume_threshold: 1, - threshold_weight: 100_000, - weight_restrict_decay: 2, - xcmp_max_individual_weight: 20u64 * WEIGHT_REF_TIME_PER_MILLIS, - } - } - } -} - -/// Migrates `QueueConfigData` from v1 (using only reference time weights) to v2 (with -/// 2D weights). -/// -/// NOTE: Only use this function if you know what you're doing. Default to using -/// `migrate_to_latest`. -pub fn migrate_to_v2() -> Weight { - let translate = |pre: v1::QueueConfigData| -> super::QueueConfigData { - super::QueueConfigData { - suspend_threshold: pre.suspend_threshold, - drop_threshold: pre.drop_threshold, - resume_threshold: pre.resume_threshold, - threshold_weight: Weight::from_parts(pre.threshold_weight, 0), - weight_restrict_decay: Weight::from_parts(pre.weight_restrict_decay, 0), - xcmp_max_individual_weight: Weight::from_parts( - pre.xcmp_max_individual_weight, - DEFAULT_POV_SIZE, - ), - } - }; - - if QueueConfig::::translate(|pre| pre.map(translate)).is_err() { - log::error!( - target: super::LOG_TARGET, - "unexpected error when performing translation of the QueueConfig type during storage upgrade to v2" - ); - } - - T::DbWeight::get().reads_writes(1, 1) -} - -pub fn migrate_to_v3() -> Weight { - let overweight_messages = Overweight::::initialize_counter() as u64; - - T::DbWeight::get().reads_writes(overweight_messages, 1) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::mock::{new_test_ext, Test}; - - #[test] - fn test_migration_to_v2() { - let v1 = v1::QueueConfigData { - suspend_threshold: 5, - drop_threshold: 12, - resume_threshold: 3, - threshold_weight: 333_333, - weight_restrict_decay: 1, - xcmp_max_individual_weight: 10_000_000_000, - }; - - new_test_ext().execute_with(|| { - frame_support::storage::unhashed::put_raw( - &crate::QueueConfig::::hashed_key(), - &v1.encode(), - ); - - migrate_to_v2::(); - - let v2 = crate::QueueConfig::::get(); - - assert_eq!(v1.suspend_threshold, v2.suspend_threshold); - assert_eq!(v1.drop_threshold, v2.drop_threshold); - assert_eq!(v1.resume_threshold, v2.resume_threshold); - assert_eq!(v1.threshold_weight, v2.threshold_weight.ref_time()); - assert_eq!(v1.weight_restrict_decay, v2.weight_restrict_decay.ref_time()); - assert_eq!(v1.xcmp_max_individual_weight, v2.xcmp_max_individual_weight.ref_time()); - }); - } -} diff --git a/cumulus/pallets/xcmp-queue/src/mock.rs b/cumulus/pallets/xcmp-queue/src/mock.rs deleted file mode 100644 index 2c27568115f0..000000000000 --- a/cumulus/pallets/xcmp-queue/src/mock.rs +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::*; -use crate as xcmp_queue; -use core::marker::PhantomData; -use cumulus_pallet_parachain_system::AnyRelayNumber; -use cumulus_primitives_core::{IsSystem, ParaId}; -use frame_support::{ - parameter_types, - traits::{ConstU32, Everything, Nothing, OriginTrait}, -}; -use frame_system::EnsureRoot; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; -use xcm::prelude::*; -use xcm_builder::{CurrencyAdapter, FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset}; -use xcm_executor::traits::ConvertOrigin; - -type Block = frame_system::mocking::MockBlock; - -// Configure a mock runtime to test the pallet. -frame_support::construct_runtime!( - pub enum Test - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - }, - XcmpQueue: xcmp_queue::{Pallet, Call, Storage, Event}, - } -); - -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const SS58Prefix: u8 = 42; -} - -type AccountId = u64; - -impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - pub const ExistentialDeposit: u64 = 5; - pub const MaxReserves: u32 = 50; -} - -impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -impl cumulus_pallet_parachain_system::Config for Test { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = (); - type OutboundXcmpMessageSource = XcmpQueue; - type DmpMessageHandler = (); - type ReservedDmpWeight = (); - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = (); - type CheckAssociatedRelayNumber = AnyRelayNumber; -} - -parameter_types! { - pub const RelayChain: MultiLocation = MultiLocation::parent(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(1u32)); - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000, 1024); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; -} - -/// Means for transacting assets on this chain. -pub type LocalAssetTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports. - (), ->; - -pub type LocationToAccountId = (ParentIsPreset,); - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - // How to withdraw and deposit an asset. - type AssetTransactor = LocalAssetTransactor; - type OriginConverter = (); - type IsReserve = NativeAsset; - type IsTeleporter = NativeAsset; - type UniversalLocation = UniversalLocation; - type Barrier = (); - type Weigher = FixedWeightBounds; - type Trader = (); - type ResponseHandler = (); - type AssetTrap = (); - type AssetClaims = (); - type SubscriptionService = (); - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; -} - -pub type XcmRouter = ( - // XCMP to communicate with the sibling chains. - XcmpQueue, -); - -pub struct SystemParachainAsSuperuser(PhantomData); -impl ConvertOrigin - for SystemParachainAsSuperuser -{ - fn convert_origin( - origin: impl Into, - kind: OriginKind, - ) -> Result { - let origin = origin.into(); - if kind == OriginKind::Superuser && - matches!( - origin, - MultiLocation { - parents: 1, - interior: X1(Parachain(id)), - } if ParaId::from(id).is_system(), - ) { - Ok(RuntimeOrigin::root()) - } else { - Err(origin) - } - } -} - -impl Config for Test { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = xcm_executor::XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = (); - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EnsureRoot; - type ControllerOriginConverter = SystemParachainAsSuperuser; - type WeightInfo = (); - type PriceForSiblingDelivery = (); -} - -pub fn new_test_ext() -> sp_io::TestExternalities { - let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - t.into() -} diff --git a/cumulus/pallets/xcmp-queue/src/tests.rs b/cumulus/pallets/xcmp-queue/src/tests.rs deleted file mode 100644 index 45c4519d3aa4..000000000000 --- a/cumulus/pallets/xcmp-queue/src/tests.rs +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::*; -use cumulus_primitives_core::XcmpMessageHandler; -use frame_support::{assert_noop, assert_ok}; -use mock::{new_test_ext, RuntimeCall, RuntimeOrigin, Test, XcmpQueue}; -use sp_runtime::traits::BadOrigin; - -#[test] -fn one_message_does_not_panic() { - new_test_ext().execute_with(|| { - let message_format = XcmpMessageFormat::ConcatenatedVersionedXcm.encode(); - let messages = vec![(Default::default(), 1u32, message_format.as_slice())]; - - // This shouldn't cause a panic - XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); - }) -} - -#[test] -#[should_panic = "Invalid incoming blob message data"] -#[cfg(debug_assertions)] -fn bad_message_is_handled() { - new_test_ext().execute_with(|| { - let bad_data = vec![ - 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 64, 239, 139, 0, - 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 37, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 127, 147, - ]; - InboundXcmpMessages::::insert(ParaId::from(1000), 1, bad_data); - let format = XcmpMessageFormat::ConcatenatedEncodedBlob; - // This should exit with an error. - XcmpQueue::process_xcmp_message( - 1000.into(), - (1, format), - &mut 0, - Weight::from_parts(10_000_000_000, 0), - Weight::from_parts(10_000_000_000, 0), - ); - }); -} - -/// Tests that a blob message is handled. Currently this isn't implemented and panics when debug -/// assertions are enabled. When this feature is enabled, this test should be rewritten properly. -#[test] -#[should_panic = "Blob messages not handled."] -#[cfg(debug_assertions)] -fn handle_blob_message() { - new_test_ext().execute_with(|| { - let bad_data = vec![ - 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 64, 239, - 139, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, - 37, 0, 0, 0, 0, 0, 0, 0, 16, 0, 127, 147, - ]; - InboundXcmpMessages::::insert(ParaId::from(1000), 1, bad_data); - let format = XcmpMessageFormat::ConcatenatedEncodedBlob; - XcmpQueue::process_xcmp_message( - 1000.into(), - (1, format), - &mut 0, - Weight::from_parts(10_000_000_000, 0), - Weight::from_parts(10_000_000_000, 0), - ); - }); -} - -#[test] -#[should_panic = "Invalid incoming XCMP message data"] -#[cfg(debug_assertions)] -fn handle_invalid_data() { - new_test_ext().execute_with(|| { - let data = Xcm::(vec![]).encode(); - InboundXcmpMessages::::insert(ParaId::from(1000), 1, data); - let format = XcmpMessageFormat::ConcatenatedVersionedXcm; - XcmpQueue::process_xcmp_message( - 1000.into(), - (1, format), - &mut 0, - Weight::from_parts(10_000_000_000, 0), - Weight::from_parts(10_000_000_000, 0), - ); - }); -} - -#[test] -fn service_overweight_unknown() { - new_test_ext().execute_with(|| { - assert_noop!( - XcmpQueue::service_overweight(RuntimeOrigin::root(), 0, Weight::from_parts(1000, 1000)), - Error::::BadOverweightIndex, - ); - }); -} - -#[test] -fn service_overweight_bad_xcm_format() { - new_test_ext().execute_with(|| { - let bad_xcm = vec![255]; - Overweight::::insert(0, (ParaId::from(1000), 0, bad_xcm)); - - assert_noop!( - XcmpQueue::service_overweight(RuntimeOrigin::root(), 0, Weight::from_parts(1000, 1000)), - Error::::BadXcm - ); - }); -} - -#[test] -fn suspend_xcm_execution_works() { - new_test_ext().execute_with(|| { - QueueSuspended::::put(true); - - let xcm = - VersionedXcm::from(Xcm::(vec![Instruction::::ClearOrigin])) - .encode(); - let mut message_format = XcmpMessageFormat::ConcatenatedVersionedXcm.encode(); - message_format.extend(xcm.clone()); - let messages = vec![(ParaId::from(999), 1u32, message_format.as_slice())]; - - // This should have executed the incoming XCM, because it came from a system parachain - XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); - - let queued_xcm = InboundXcmpMessages::::get(ParaId::from(999), 1u32); - assert!(queued_xcm.is_empty()); - - let messages = vec![(ParaId::from(2000), 1u32, message_format.as_slice())]; - - // This shouldn't have executed the incoming XCM - XcmpQueue::handle_xcmp_messages(messages.into_iter(), Weight::MAX); - - let queued_xcm = InboundXcmpMessages::::get(ParaId::from(2000), 1u32); - assert_eq!(queued_xcm, xcm); - }); -} - -#[test] -fn update_suspend_threshold_works() { - new_test_ext().execute_with(|| { - let data: QueueConfigData = >::get(); - assert_eq!(data.suspend_threshold, 2); - assert_ok!(XcmpQueue::update_suspend_threshold(RuntimeOrigin::root(), 3)); - assert_noop!(XcmpQueue::update_suspend_threshold(RuntimeOrigin::signed(2), 5), BadOrigin); - let data: QueueConfigData = >::get(); - - assert_eq!(data.suspend_threshold, 3); - }); -} - -#[test] -fn update_drop_threshold_works() { - new_test_ext().execute_with(|| { - let data: QueueConfigData = >::get(); - assert_eq!(data.drop_threshold, 5); - assert_ok!(XcmpQueue::update_drop_threshold(RuntimeOrigin::root(), 6)); - assert_noop!(XcmpQueue::update_drop_threshold(RuntimeOrigin::signed(2), 7), BadOrigin); - let data: QueueConfigData = >::get(); - - assert_eq!(data.drop_threshold, 6); - }); -} - -#[test] -fn update_resume_threshold_works() { - new_test_ext().execute_with(|| { - let data: QueueConfigData = >::get(); - assert_eq!(data.resume_threshold, 1); - assert_ok!(XcmpQueue::update_resume_threshold(RuntimeOrigin::root(), 2)); - assert_noop!(XcmpQueue::update_resume_threshold(RuntimeOrigin::signed(7), 3), BadOrigin); - let data: QueueConfigData = >::get(); - - assert_eq!(data.resume_threshold, 2); - }); -} - -#[test] -fn update_threshold_weight_works() { - new_test_ext().execute_with(|| { - let data: QueueConfigData = >::get(); - assert_eq!(data.threshold_weight, Weight::from_parts(100_000, 0)); - assert_ok!(XcmpQueue::update_threshold_weight( - RuntimeOrigin::root(), - Weight::from_parts(10_000, 0) - )); - assert_noop!( - XcmpQueue::update_threshold_weight( - RuntimeOrigin::signed(5), - Weight::from_parts(10_000_000, 0), - ), - BadOrigin - ); - let data: QueueConfigData = >::get(); - - assert_eq!(data.threshold_weight, Weight::from_parts(10_000, 0)); - }); -} - -#[test] -fn update_weight_restrict_decay_works() { - new_test_ext().execute_with(|| { - let data: QueueConfigData = >::get(); - assert_eq!(data.weight_restrict_decay, Weight::from_parts(2, 0)); - assert_ok!(XcmpQueue::update_weight_restrict_decay( - RuntimeOrigin::root(), - Weight::from_parts(5, 0) - )); - assert_noop!( - XcmpQueue::update_weight_restrict_decay( - RuntimeOrigin::signed(6), - Weight::from_parts(4, 0), - ), - BadOrigin - ); - let data: QueueConfigData = >::get(); - - assert_eq!(data.weight_restrict_decay, Weight::from_parts(5, 0)); - }); -} - -#[test] -fn update_xcmp_max_individual_weight() { - new_test_ext().execute_with(|| { - let data: QueueConfigData = >::get(); - assert_eq!( - data.xcmp_max_individual_weight, - Weight::from_parts(20u64 * WEIGHT_REF_TIME_PER_MILLIS, DEFAULT_POV_SIZE), - ); - assert_ok!(XcmpQueue::update_xcmp_max_individual_weight( - RuntimeOrigin::root(), - Weight::from_parts(30u64 * WEIGHT_REF_TIME_PER_MILLIS, 0) - )); - assert_noop!( - XcmpQueue::update_xcmp_max_individual_weight( - RuntimeOrigin::signed(3), - Weight::from_parts(10u64 * WEIGHT_REF_TIME_PER_MILLIS, 0) - ), - BadOrigin - ); - let data: QueueConfigData = >::get(); - - assert_eq!( - data.xcmp_max_individual_weight, - Weight::from_parts(30u64 * WEIGHT_REF_TIME_PER_MILLIS, 0) - ); - }); -} - -/// Validates [`validate`] for required Some(destination) and Some(message) -struct OkFixedXcmHashWithAssertingRequiredInputsSender; -impl OkFixedXcmHashWithAssertingRequiredInputsSender { - const FIXED_XCM_HASH: [u8; 32] = [9; 32]; - - fn fixed_delivery_asset() -> MultiAssets { - MultiAssets::new() - } - - fn expected_delivery_result() -> Result<(XcmHash, MultiAssets), SendError> { - Ok((Self::FIXED_XCM_HASH, Self::fixed_delivery_asset())) - } -} -impl SendXcm for OkFixedXcmHashWithAssertingRequiredInputsSender { - type Ticket = (); - - fn validate( - destination: &mut Option, - message: &mut Option>, - ) -> SendResult { - assert!(destination.is_some()); - assert!(message.is_some()); - Ok(((), OkFixedXcmHashWithAssertingRequiredInputsSender::fixed_delivery_asset())) - } - - fn deliver(_: Self::Ticket) -> Result { - Ok(Self::FIXED_XCM_HASH) - } -} - -#[test] -fn xcmp_queue_does_not_consume_dest_or_msg_on_not_applicable() { - // dummy message - let message = Xcm(vec![Trap(5)]); - - // XcmpQueue - check dest is really not applicable - let dest = (Parent, Parent, Parent); - let mut dest_wrapper = Some(dest.into()); - let mut msg_wrapper = Some(message.clone()); - assert_eq!( - Err(SendError::NotApplicable), - ::validate(&mut dest_wrapper, &mut msg_wrapper) - ); - - // check wrapper were not consumed - assert_eq!(Some(dest.into()), dest_wrapper.take()); - assert_eq!(Some(message.clone()), msg_wrapper.take()); - - // another try with router chain with asserting sender - assert_eq!( - OkFixedXcmHashWithAssertingRequiredInputsSender::expected_delivery_result(), - send_xcm::<(XcmpQueue, OkFixedXcmHashWithAssertingRequiredInputsSender)>( - dest.into(), - message - ) - ); -} - -#[test] -fn xcmp_queue_consumes_dest_and_msg_on_ok_validate() { - // dummy message - let message = Xcm(vec![Trap(5)]); - - // XcmpQueue - check dest/msg is valid - let dest = (Parent, X1(Parachain(5555))); - let mut dest_wrapper = Some(dest.into()); - let mut msg_wrapper = Some(message.clone()); - assert!(::validate(&mut dest_wrapper, &mut msg_wrapper).is_ok()); - - // check wrapper were consumed - assert_eq!(None, dest_wrapper.take()); - assert_eq!(None, msg_wrapper.take()); - - new_test_ext().execute_with(|| { - // another try with router chain with asserting sender - assert_eq!( - Err(SendError::Transport("NoChannel")), - send_xcm::<(XcmpQueue, OkFixedXcmHashWithAssertingRequiredInputsSender)>( - dest.into(), - message - ) - ); - }); -} diff --git a/cumulus/pallets/xcmp-queue/src/weights.rs b/cumulus/pallets/xcmp-queue/src/weights.rs deleted file mode 100644 index cbb29ac3ae31..000000000000 --- a/cumulus/pallets/xcmp-queue/src/weights.rs +++ /dev/null @@ -1,48 +0,0 @@ -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{ - traits::Get, - weights::{constants::RocksDbWeight, Weight}, -}; -use sp_std::marker::PhantomData; - -// Implemented by autogenerated benchmarking code. -pub trait WeightInfo { - fn set_config_with_u32() -> Weight; - fn set_config_with_weight() -> Weight; -} - -pub struct SubstrateWeight(PhantomData); - -impl WeightInfo for SubstrateWeight { - // Storage: XcmpQueue QueueConfig (r:1 w:1) - fn set_config_with_u32() -> Weight { - Weight::from_parts(2_717_000_u64, 0) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } - - // Storage: XcmpQueue QueueConfig (r:1 w:1) - fn set_config_with_weight() -> Weight { - Weight::from_parts(2_717_000_u64, 0) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) - } -} - -impl WeightInfo for () { - // Storage: XcmpQueue QueueConfig (r:1 w:1) - fn set_config_with_u32() -> Weight { - Weight::from_parts(2_717_000_u64, 0) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } - - // Storage: XcmpQueue QueueConfig (r:1 w:1) - fn set_config_with_weight() -> Weight { - Weight::from_parts(2_717_000_u64, 0) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - } -} diff --git a/cumulus/parachain-template/LICENSE b/cumulus/parachain-template/LICENSE deleted file mode 100644 index cf1ab25da034..000000000000 --- a/cumulus/parachain-template/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to diff --git a/cumulus/parachain-template/README.md b/cumulus/parachain-template/README.md deleted file mode 100644 index 6dcc70c53829..000000000000 --- a/cumulus/parachain-template/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Substrate Cumulus Parachain Template - -A new [Cumulus](https://github.com/paritytech/cumulus/)-based Substrate node, ready for hacking ☁️.. - -This project is originally a fork of the -[Substrate Node Template](https://github.com/substrate-developer-hub/substrate-node-template) -modified to include dependencies required for registering this node as a **parathread** or -**parachain** to a **relay chain**. - -The stand-alone version of this template is hosted on the -[Substrate Devhub Parachain Template](https://github.com/substrate-developer-hub/substrate-parachain-template/) -for each release of Polkadot. It is generated directly to the upstream -[Parachain Template in Cumulus](https://github.com/paritytech/cumulus/tree/master/parachain-template) -at each release branch using the -[Substrate Template Generator](https://github.com/paritytech/substrate-template-generator/). - -👉 Learn more about parachains [here](https://wiki.polkadot.network/docs/learn-parachains), and -parathreads [here](https://wiki.polkadot.network/docs/learn-parathreads). - - -🧙 Learn about how to use this template and run your own parachain testnet for it in the -[Devhub Cumulus Tutorial](https://docs.substrate.io/tutorials/v3/cumulus/start-relay/). \ No newline at end of file diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml deleted file mode 100644 index 595b787ffaaa..000000000000 --- a/cumulus/parachain-template/node/Cargo.toml +++ /dev/null @@ -1,83 +0,0 @@ -[package] -name = "parachain-template-node" -version = "0.1.0" -authors = ["Anonymous"] -description = "A new Cumulus FRAME-based Substrate Node, ready for hacking together a parachain." -license = "Unlicense" -homepage = "https://substrate.io" -repository = "https://github.com/paritytech/cumulus/" -edition = "2021" -build = "build.rs" - -[dependencies] -clap = { version = "4.3.21", features = ["derive"] } -log = "0.4.20" -codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.183", features = ["derive"] } -jsonrpsee = { version = "0.16.2", features = ["server"] } -futures = "0.3.28" - -# Local -parachain-template-runtime = { path = "../runtime" } - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" } -frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-offchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network-sync = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } -try-runtime-cli = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -# Polkadot -polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-client-cli = { path = "../../client/cli" } -cumulus-client-consensus-aura = { path = "../../client/consensus/aura" } -cumulus-client-consensus-common = { path = "../../client/consensus/common" } -cumulus-client-service = { path = "../../client/service" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } -cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface" } -color-print = "0.3.4" - -[build-dependencies] -substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = [] -runtime-benchmarks = [ - "parachain-template-runtime/runtime-benchmarks", - "polkadot-cli/runtime-benchmarks", -] -try-runtime = [ - "try-runtime-cli/try-runtime", - "parachain-template-runtime/try-runtime" -] diff --git a/cumulus/parachain-template/node/build.rs b/cumulus/parachain-template/node/build.rs deleted file mode 100644 index e3bfe3116bf2..000000000000 --- a/cumulus/parachain-template/node/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -use substrate_build_script_utils::{generate_cargo_keys, rerun_if_git_head_changed}; - -fn main() { - generate_cargo_keys(); - - rerun_if_git_head_changed(); -} diff --git a/cumulus/parachain-template/node/src/chain_spec.rs b/cumulus/parachain-template/node/src/chain_spec.rs deleted file mode 100644 index 0ca3c51900f2..000000000000 --- a/cumulus/parachain-template/node/src/chain_spec.rs +++ /dev/null @@ -1,231 +0,0 @@ -use cumulus_primitives_core::ParaId; -use parachain_template_runtime::{AccountId, AuraId, Signature, EXISTENTIAL_DEPOSIT}; -use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; -use sc_service::ChainType; -use serde::{Deserialize, Serialize}; -use sp_core::{sr25519, Pair, Public}; -use sp_runtime::traits::{IdentifyAccount, Verify}; - -/// Specialized `ChainSpec` for the normal parachain runtime. -pub type ChainSpec = - sc_service::GenericChainSpec; - -/// The default XCM version to set in genesis config. -const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; - -/// Helper function to generate a crypto pair from seed -pub fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -/// The extensions for the [`ChainSpec`]. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)] -#[serde(deny_unknown_fields)] -pub struct Extensions { - /// The relay chain of the Parachain. - pub relay_chain: String, - /// The id of the Parachain. - pub para_id: u32, -} - -impl Extensions { - /// Try to get the extension from the given `ChainSpec`. - pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> { - sc_chain_spec::get_extension(chain_spec.extensions()) - } -} - -type AccountPublic = ::Signer; - -/// Generate collator keys from seed. -/// -/// This function's return type must always match the session keys of the chain in tuple format. -pub fn get_collator_keys_from_seed(seed: &str) -> AuraId { - get_from_seed::(seed) -} - -/// Helper function to generate an account ID from seed -pub fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} - -/// Generate the session keys from individual elements. -/// -/// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn template_session_keys(keys: AuraId) -> parachain_template_runtime::SessionKeys { - parachain_template_runtime::SessionKeys { aura: keys } -} - -pub fn development_config() -> ChainSpec { - // Give your base currency a unit name and decimal places - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "UNIT".into()); - properties.insert("tokenDecimals".into(), 12.into()); - properties.insert("ss58Format".into(), 42.into()); - - ChainSpec::from_genesis( - // Name - "Development", - // ID - "dev", - ChainType::Development, - move || { - testnet_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - get_account_id_from_seed::("Alice"), - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - None, - Extensions { - relay_chain: "rococo-local".into(), // You MUST set this to the correct network! - para_id: 1000, - }, - ) -} - -pub fn local_testnet_config() -> ChainSpec { - // Give your base currency a unit name and decimal places - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "UNIT".into()); - properties.insert("tokenDecimals".into(), 12.into()); - properties.insert("ss58Format".into(), 42.into()); - - ChainSpec::from_genesis( - // Name - "Local Testnet", - // ID - "local_testnet", - ChainType::Local, - move || { - testnet_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - get_account_id_from_seed::("Alice"), - 1000.into(), - ) - }, - // Bootnodes - Vec::new(), - // Telemetry - None, - // Protocol ID - Some("template-local"), - // Fork ID - None, - // Properties - Some(properties), - // Extensions - Extensions { - relay_chain: "rococo-local".into(), // You MUST set this to the correct network! - para_id: 1000, - }, - ) -} - -fn testnet_genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - root: AccountId, - id: ParaId, -) -> parachain_template_runtime::RuntimeGenesisConfig { - parachain_template_runtime::RuntimeGenesisConfig { - system: parachain_template_runtime::SystemConfig { - code: parachain_template_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: parachain_template_runtime::BalancesConfig { - balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), - }, - parachain_info: parachain_template_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: parachain_template_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: EXISTENTIAL_DEPOSIT * 16, - ..Default::default() - }, - session: parachain_template_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - template_session_keys(aura), // session keys - ) - }) - .collect(), - }, - // no need to pass anything to aura, in fact it will panic if we do. Session will take care - // of this. - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: parachain_template_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - transaction_payment: Default::default(), - sudo: parachain_template_runtime::SudoConfig { key: Some(root) }, - } -} diff --git a/cumulus/parachain-template/node/src/cli.rs b/cumulus/parachain-template/node/src/cli.rs deleted file mode 100644 index b72579c86b96..000000000000 --- a/cumulus/parachain-template/node/src/cli.rs +++ /dev/null @@ -1,115 +0,0 @@ -use std::path::PathBuf; - -/// Sub-commands supported by the collator. -#[derive(Debug, clap::Subcommand)] -pub enum Subcommand { - /// Build a chain specification. - BuildSpec(sc_cli::BuildSpecCmd), - - /// Validate blocks. - CheckBlock(sc_cli::CheckBlockCmd), - - /// Export blocks. - ExportBlocks(sc_cli::ExportBlocksCmd), - - /// Export the state of a given block into a chain spec. - ExportState(sc_cli::ExportStateCmd), - - /// Import blocks. - ImportBlocks(sc_cli::ImportBlocksCmd), - - /// Revert the chain to a previous state. - Revert(sc_cli::RevertCmd), - - /// Remove the whole chain. - PurgeChain(cumulus_client_cli::PurgeChainCmd), - - /// Export the genesis state of the parachain. - ExportGenesisState(cumulus_client_cli::ExportGenesisStateCommand), - - /// Export the genesis wasm of the parachain. - ExportGenesisWasm(cumulus_client_cli::ExportGenesisWasmCommand), - - /// Sub-commands concerned with benchmarking. - /// The pallet benchmarking moved to the `pallet` sub-command. - #[command(subcommand)] - Benchmark(frame_benchmarking_cli::BenchmarkCmd), - - /// Try some testing command against a specified runtime state. - #[cfg(feature = "try-runtime")] - TryRuntime(try_runtime_cli::TryRuntimeCmd), - - /// Errors since the binary was not build with `--features try-runtime`. - #[cfg(not(feature = "try-runtime"))] - TryRuntime, -} - -const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( - r#"Examples: - parachain-template-node build-spec --disable-default-bootnode > plain-parachain-chainspec.json - Export a chainspec for a local testnet in json format. - parachain-template-node --chain plain-parachain-chainspec.json --tmp -- --chain rococo-local - Launch a full node with chain specification loaded from plain-parachain-chainspec.json. - parachain-template-node - Launch a full node with default parachain local-testnet and relay chain rococo-local. - parachain-template-node --collator - Launch a collator with default parachain local-testnet and relay chain rococo-local. - "# -); -#[derive(Debug, clap::Parser)] -#[command( - propagate_version = true, - args_conflicts_with_subcommands = true, - subcommand_negates_reqs = true -)] -#[clap(after_help = AFTER_HELP_EXAMPLE)] -pub struct Cli { - #[command(subcommand)] - pub subcommand: Option, - - #[command(flatten)] - pub run: cumulus_client_cli::RunCmd, - - /// Disable automatic hardware benchmarks. - /// - /// By default these benchmarks are automatically ran at startup and measure - /// the CPU speed, the memory bandwidth and the disk speed. - /// - /// The results are then printed out in the logs, and also sent as part of - /// telemetry, if telemetry is enabled. - #[arg(long)] - pub no_hardware_benchmarks: bool, - - /// Relay chain arguments - #[arg(raw = true)] - pub relay_chain_args: Vec, -} - -#[derive(Debug)] -pub struct RelayChainCli { - /// The actual relay chain cli object. - pub base: polkadot_cli::RunCmd, - - /// Optional chain id that should be passed to the relay chain. - pub chain_id: Option, - - /// The base path that should be used by the relay chain. - pub base_path: Option, -} - -impl RelayChainCli { - /// Parse the relay chain CLI parameters using the para chain `Configuration`. - pub fn new<'a>( - para_config: &sc_service::Configuration, - relay_chain_args: impl Iterator, - ) -> Self { - let extension = crate::chain_spec::Extensions::try_get(&*para_config.chain_spec); - let chain_id = extension.map(|e| e.relay_chain.clone()); - let base_path = para_config.base_path.path().join("polkadot"); - Self { - base_path: Some(base_path), - chain_id, - base: clap::Parser::parse_from(relay_chain_args), - } - } -} diff --git a/cumulus/parachain-template/node/src/command.rs b/cumulus/parachain-template/node/src/command.rs deleted file mode 100644 index 46c57aa2c677..000000000000 --- a/cumulus/parachain-template/node/src/command.rs +++ /dev/null @@ -1,429 +0,0 @@ -use std::net::SocketAddr; - -use cumulus_primitives_core::ParaId; -use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; -use log::{info, warn}; -use parachain_template_runtime::Block; -use sc_cli::{ - ChainSpec, CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams, - NetworkParams, Result, SharedParams, SubstrateCli, -}; -use sc_service::config::{BasePath, PrometheusConfig}; -use sp_runtime::traits::AccountIdConversion; - -use crate::{ - chain_spec, - cli::{Cli, RelayChainCli, Subcommand}, - service::new_partial, -}; - -fn load_spec(id: &str) -> std::result::Result, String> { - Ok(match id { - "dev" => Box::new(chain_spec::development_config()), - "template-rococo" => Box::new(chain_spec::local_testnet_config()), - "" | "local" => Box::new(chain_spec::local_testnet_config()), - path => Box::new(chain_spec::ChainSpec::from_json_file(std::path::PathBuf::from(path))?), - }) -} - -impl SubstrateCli for Cli { - fn impl_name() -> String { - "Parachain Collator Template".into() - } - - fn impl_version() -> String { - env!("SUBSTRATE_CLI_IMPL_VERSION").into() - } - - fn description() -> String { - format!( - "Parachain Collator Template\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relay chain node.\n\n\ - {} -- ", - Self::executable_name() - ) - } - - fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() - } - - fn support_url() -> String { - "https://github.com/paritytech/cumulus/issues/new".into() - } - - fn copyright_start_year() -> i32 { - 2020 - } - - fn load_spec(&self, id: &str) -> std::result::Result, String> { - load_spec(id) - } -} - -impl SubstrateCli for RelayChainCli { - fn impl_name() -> String { - "Parachain Collator Template".into() - } - - fn impl_version() -> String { - env!("SUBSTRATE_CLI_IMPL_VERSION").into() - } - - fn description() -> String { - format!( - "Parachain Collator Template\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relay chain node.\n\n\ - {} -- ", - Self::executable_name() - ) - } - - fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() - } - - fn support_url() -> String { - "https://github.com/paritytech/cumulus/issues/new".into() - } - - fn copyright_start_year() -> i32 { - 2020 - } - - fn load_spec(&self, id: &str) -> std::result::Result, String> { - polkadot_cli::Cli::from_iter([RelayChainCli::executable_name()].iter()).load_spec(id) - } -} - -macro_rules! construct_async_run { - (|$components:ident, $cli:ident, $cmd:ident, $config:ident| $( $code:tt )* ) => {{ - let runner = $cli.create_runner($cmd)?; - runner.async_run(|$config| { - let $components = new_partial(&$config)?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }} -} - -/// Parse command line arguments into service configuration. -pub fn run() -> Result<()> { - let cli = Cli::from_args(); - - match &cli.subcommand { - Some(Subcommand::BuildSpec(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) - }, - Some(Subcommand::CheckBlock(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.import_queue)) - }) - }, - Some(Subcommand::ExportBlocks(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, config.database)) - }) - }, - Some(Subcommand::ExportState(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, config.chain_spec)) - }) - }, - Some(Subcommand::ImportBlocks(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.import_queue)) - }) - }, - Some(Subcommand::Revert(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.backend, None)) - }) - }, - Some(Subcommand::PurgeChain(cmd)) => { - let runner = cli.create_runner(cmd)?; - - runner.sync_run(|config| { - let polkadot_cli = RelayChainCli::new( - &config, - [RelayChainCli::executable_name()].iter().chain(cli.relay_chain_args.iter()), - ); - - let polkadot_config = SubstrateCli::create_configuration( - &polkadot_cli, - &polkadot_cli, - config.tokio_handle.clone(), - ) - .map_err(|err| format!("Relay chain argument error: {}", err))?; - - cmd.run(config, polkadot_config) - }) - }, - Some(Subcommand::ExportGenesisState(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| { - let partials = new_partial(&config)?; - - cmd.run(&*config.chain_spec, &*partials.client) - }) - }, - Some(Subcommand::ExportGenesisWasm(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|_config| { - let spec = cli.load_spec(&cmd.shared_params.chain.clone().unwrap_or_default())?; - cmd.run(&*spec) - }) - }, - Some(Subcommand::Benchmark(cmd)) => { - let runner = cli.create_runner(cmd)?; - // Switch on the concrete benchmark sub-command- - match cmd { - BenchmarkCmd::Pallet(cmd) => - if cfg!(feature = "runtime-benchmarks") { - runner.sync_run(|config| cmd.run::(config)) - } else { - Err("Benchmarking wasn't enabled when building the node. \ - You can enable it with `--features runtime-benchmarks`." - .into()) - }, - BenchmarkCmd::Block(cmd) => runner.sync_run(|config| { - let partials = new_partial(&config)?; - cmd.run(partials.client) - }), - #[cfg(not(feature = "runtime-benchmarks"))] - BenchmarkCmd::Storage(_) => - return Err(sc_cli::Error::Input( - "Compile with --features=runtime-benchmarks \ - to enable storage benchmarks." - .into(), - ) - .into()), - #[cfg(feature = "runtime-benchmarks")] - BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| { - let partials = new_partial(&config)?; - let db = partials.backend.expose_db(); - let storage = partials.backend.expose_storage(); - cmd.run(config, partials.client.clone(), db, storage) - }), - BenchmarkCmd::Machine(cmd) => - runner.sync_run(|config| cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone())), - // NOTE: this allows the Client to leniently implement - // new benchmark commands without requiring a companion MR. - #[allow(unreachable_patterns)] - _ => Err("Benchmarking sub-command unsupported".into()), - } - }, - #[cfg(feature = "try-runtime")] - Some(Subcommand::TryRuntime(cmd)) => { - use parachain_template_runtime::MILLISECS_PER_BLOCK; - use try_runtime_cli::block_building_info::timestamp_with_aura_info; - - let runner = cli.create_runner(cmd)?; - - type HostFunctions = - (sp_io::SubstrateHostFunctions, frame_benchmarking::benchmarking::HostFunctions); - - // grab the task manager. - let registry = &runner.config().prometheus_config.as_ref().map(|cfg| &cfg.registry); - let task_manager = - sc_service::TaskManager::new(runner.config().tokio_handle.clone(), *registry) - .map_err(|e| format!("Error: {:?}", e))?; - - let info_provider = timestamp_with_aura_info(MILLISECS_PER_BLOCK); - - runner.async_run(|_| { - Ok((cmd.run::(Some(info_provider)), task_manager)) - }) - }, - #[cfg(not(feature = "try-runtime"))] - Some(Subcommand::TryRuntime) => Err("Try-runtime was not enabled when building the node. \ - You can enable it with `--features try-runtime`." - .into()), - None => { - let runner = cli.create_runner(&cli.run.normalize())?; - let collator_options = cli.run.collator_options(); - - runner.run_node_until_exit(|config| async move { - let hwbench = (!cli.no_hardware_benchmarks) - .then_some(config.database.path().map(|database_path| { - let _ = std::fs::create_dir_all(database_path); - sc_sysinfo::gather_hwbench(Some(database_path)) - })) - .flatten(); - - let para_id = chain_spec::Extensions::try_get(&*config.chain_spec) - .map(|e| e.para_id) - .ok_or("Could not find parachain ID in chain-spec.")?; - - let polkadot_cli = RelayChainCli::new( - &config, - [RelayChainCli::executable_name()].iter().chain(cli.relay_chain_args.iter()), - ); - - let id = ParaId::from(para_id); - - let parachain_account = - AccountIdConversion::::into_account_truncating( - &id, - ); - - let tokio_handle = config.tokio_handle.clone(); - let polkadot_config = - SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, tokio_handle) - .map_err(|err| format!("Relay chain argument error: {}", err))?; - - info!("Parachain Account: {parachain_account}"); - info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - - if !collator_options.relay_chain_rpc_urls.is_empty() && - !cli.relay_chain_args.is_empty() - { - warn!( - "Detected relay chain node arguments together with --relay-chain-rpc-url. \ - This command starts a minimal Polkadot node that only uses a \ - network-related subset of all relay chain CLI options." - ); - } - - crate::service::start_parachain_node( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into) - }) - }, - } -} - -impl DefaultConfigurationValues for RelayChainCli { - fn p2p_listen_port() -> u16 { - 30334 - } - - fn rpc_listen_port() -> u16 { - 9945 - } - - fn prometheus_listen_port() -> u16 { - 9616 - } -} - -impl CliConfiguration for RelayChainCli { - fn shared_params(&self) -> &SharedParams { - self.base.base.shared_params() - } - - fn import_params(&self) -> Option<&ImportParams> { - self.base.base.import_params() - } - - fn network_params(&self) -> Option<&NetworkParams> { - self.base.base.network_params() - } - - fn keystore_params(&self) -> Option<&KeystoreParams> { - self.base.base.keystore_params() - } - - fn base_path(&self) -> Result> { - Ok(self - .shared_params() - .base_path()? - .or_else(|| self.base_path.clone().map(Into::into))) - } - - fn rpc_addr(&self, default_listen_port: u16) -> Result> { - self.base.base.rpc_addr(default_listen_port) - } - - fn prometheus_config( - &self, - default_listen_port: u16, - chain_spec: &Box, - ) -> Result> { - self.base.base.prometheus_config(default_listen_port, chain_spec) - } - - fn init( - &self, - _support_url: &String, - _impl_version: &String, - _logger_hook: F, - _config: &sc_service::Configuration, - ) -> Result<()> - where - F: FnOnce(&mut sc_cli::LoggerBuilder, &sc_service::Configuration), - { - unreachable!("PolkadotCli is never initialized; qed"); - } - - fn chain_id(&self, is_dev: bool) -> Result { - let chain_id = self.base.base.chain_id(is_dev)?; - - Ok(if chain_id.is_empty() { self.chain_id.clone().unwrap_or_default() } else { chain_id }) - } - - fn role(&self, is_dev: bool) -> Result { - self.base.base.role(is_dev) - } - - fn transaction_pool(&self, is_dev: bool) -> Result { - self.base.base.transaction_pool(is_dev) - } - - fn trie_cache_maximum_size(&self) -> Result> { - self.base.base.trie_cache_maximum_size() - } - - fn rpc_methods(&self) -> Result { - self.base.base.rpc_methods() - } - - fn rpc_max_connections(&self) -> Result { - self.base.base.rpc_max_connections() - } - - fn rpc_cors(&self, is_dev: bool) -> Result>> { - self.base.base.rpc_cors(is_dev) - } - - fn default_heap_pages(&self) -> Result> { - self.base.base.default_heap_pages() - } - - fn force_authoring(&self) -> Result { - self.base.base.force_authoring() - } - - fn disable_grandpa(&self) -> Result { - self.base.base.disable_grandpa() - } - - fn max_runtime_instances(&self) -> Result> { - self.base.base.max_runtime_instances() - } - - fn announce_block(&self) -> Result { - self.base.base.announce_block() - } - - fn telemetry_endpoints( - &self, - chain_spec: &Box, - ) -> Result> { - self.base.base.telemetry_endpoints(chain_spec) - } - - fn node_name(&self) -> Result { - self.base.base.node_name() - } -} diff --git a/cumulus/parachain-template/node/src/main.rs b/cumulus/parachain-template/node/src/main.rs deleted file mode 100644 index ba9f28b354f1..000000000000 --- a/cumulus/parachain-template/node/src/main.rs +++ /dev/null @@ -1,14 +0,0 @@ -//! Substrate Parachain Node Template CLI - -#![warn(missing_docs)] - -mod chain_spec; -#[macro_use] -mod service; -mod cli; -mod command; -mod rpc; - -fn main() -> sc_cli::Result<()> { - command::run() -} diff --git a/cumulus/parachain-template/node/src/rpc.rs b/cumulus/parachain-template/node/src/rpc.rs deleted file mode 100644 index b5ca484fa484..000000000000 --- a/cumulus/parachain-template/node/src/rpc.rs +++ /dev/null @@ -1,58 +0,0 @@ -//! A collection of node-specific RPC methods. -//! Substrate provides the `sc-rpc` crate, which defines the core RPC layer -//! used by Substrate nodes. This file extends those RPC definitions with -//! capabilities that are specific to this project's runtime configuration. - -#![warn(missing_docs)] - -use std::sync::Arc; - -use parachain_template_runtime::{opaque::Block, AccountId, Balance, Nonce}; - -use sc_client_api::AuxStore; -pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; -use sc_transaction_pool_api::TransactionPool; -use sp_api::ProvideRuntimeApi; -use sp_block_builder::BlockBuilder; -use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; - -/// A type representing all RPC extensions. -pub type RpcExtension = jsonrpsee::RpcModule<()>; - -/// Full client dependencies -pub struct FullDeps { - /// The client instance to use. - pub client: Arc, - /// Transaction pool instance. - pub pool: Arc

, - /// Whether to deny unsafe calls - pub deny_unsafe: DenyUnsafe, -} - -/// Instantiate all RPC extensions. -pub fn create_full( - deps: FullDeps, -) -> Result> -where - C: ProvideRuntimeApi - + HeaderBackend - + AuxStore - + HeaderMetadata - + Send - + Sync - + 'static, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, - C::Api: substrate_frame_rpc_system::AccountNonceApi, - C::Api: BlockBuilder, - P: TransactionPool + Sync + Send + 'static, -{ - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; - use substrate_frame_rpc_system::{System, SystemApiServer}; - - let mut module = RpcExtension::new(()); - let FullDeps { client, pool, deny_unsafe } = deps; - - module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; - module.merge(TransactionPayment::new(client).into_rpc())?; - Ok(module) -} diff --git a/cumulus/parachain-template/node/src/service.rs b/cumulus/parachain-template/node/src/service.rs deleted file mode 100644 index 9ad3c1ad3cc6..000000000000 --- a/cumulus/parachain-template/node/src/service.rs +++ /dev/null @@ -1,453 +0,0 @@ -//! Service and ServiceFactory implementation. Specialized wrapper over substrate service. - -// std -use std::{sync::Arc, time::Duration}; - -use cumulus_client_cli::CollatorOptions; -// Local Runtime Types -use parachain_template_runtime::{opaque::Block, RuntimeApi}; - -// Cumulus Imports -use cumulus_client_consensus_aura::{AuraConsensus, BuildAuraConsensusParams, SlotProportion}; -use cumulus_client_consensus_common::{ - ParachainBlockImport as TParachainBlockImport, ParachainConsensus, -}; -use cumulus_client_service::{ - build_network, build_relay_chain_interface, prepare_node_config, start_collator, - start_full_node, BuildNetworkParams, StartCollatorParams, StartFullNodeParams, -}; -use cumulus_primitives_core::ParaId; -use cumulus_relay_chain_interface::RelayChainInterface; - -// Substrate Imports -use frame_benchmarking_cli::SUBSTRATE_REFERENCE_HARDWARE; -use sc_client_api::Backend; -use sc_consensus::ImportQueue; -use sc_executor::{ - HeapAllocStrategy, NativeElseWasmExecutor, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY, -}; -use sc_network::NetworkBlock; -use sc_network_sync::SyncingService; -use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; -use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; -use sc_transaction_pool_api::OffchainTransactionPoolFactory; -use sp_keystore::KeystorePtr; -use substrate_prometheus_endpoint::Registry; - -/// Native executor type. -pub struct ParachainNativeExecutor; - -impl sc_executor::NativeExecutionDispatch for ParachainNativeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - parachain_template_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - parachain_template_runtime::native_version() - } -} - -type ParachainExecutor = NativeElseWasmExecutor; - -type ParachainClient = TFullClient; - -type ParachainBackend = TFullBackend; - -type ParachainBlockImport = TParachainBlockImport, ParachainBackend>; - -/// Starts a `ServiceBuilder` for a full service. -/// -/// Use this macro if you don't actually need the full service, but just the builder in order to -/// be able to perform chain operations. -pub fn new_partial( - config: &Configuration, -) -> Result< - PartialComponents< - ParachainClient, - ParachainBackend, - (), - sc_consensus::DefaultImportQueue, - sc_transaction_pool::FullPool, - (ParachainBlockImport, Option, Option), - >, - sc_service::Error, -> { - let telemetry = config - .telemetry_endpoints - .clone() - .filter(|x| !x.is_empty()) - .map(|endpoints| -> Result<_, sc_telemetry::Error> { - let worker = TelemetryWorker::new(16)?; - let telemetry = worker.handle().new_telemetry(endpoints); - Ok((worker, telemetry)) - }) - .transpose()?; - - let heap_pages = config - .default_heap_pages - .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); - - let wasm = WasmExecutor::builder() - .with_execution_method(config.wasm_method) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) - .with_max_runtime_instances(config.max_runtime_instances) - .with_runtime_cache_size(config.runtime_cache_size) - .build(); - - let executor = ParachainExecutor::new_with_wasm_executor(wasm); - - let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts::( - config, - telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), - executor, - )?; - let client = Arc::new(client); - - let telemetry_worker_handle = telemetry.as_ref().map(|(worker, _)| worker.handle()); - - let telemetry = telemetry.map(|(worker, telemetry)| { - task_manager.spawn_handle().spawn("telemetry", None, worker.run()); - telemetry - }); - - let transaction_pool = sc_transaction_pool::BasicPool::new_full( - config.transaction_pool.clone(), - config.role.is_authority().into(), - config.prometheus_registry(), - task_manager.spawn_essential_handle(), - client.clone(), - ); - - let block_import = ParachainBlockImport::new(client.clone(), backend.clone()); - - let import_queue = build_import_queue( - client.clone(), - block_import.clone(), - config, - telemetry.as_ref().map(|telemetry| telemetry.handle()), - &task_manager, - )?; - - Ok(PartialComponents { - backend, - client, - import_queue, - keystore_container, - task_manager, - transaction_pool, - select_chain: (), - other: (block_import, telemetry, telemetry_worker_handle), - }) -} - -/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_node_impl( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc)> { - let parachain_config = prepare_node_config(parachain_config); - - let params = new_partial(¶chain_config)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; - let net_config = sc_network::config::FullNetworkConfiguration::new(¶chain_config.network); - - let client = params.client.clone(); - let backend = params.backend.clone(); - let mut task_manager = params.task_manager; - - let (relay_chain_interface, collator_key) = build_relay_chain_interface( - polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let force_authoring = parachain_config.force_authoring; - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - }) - .await?; - - if parachain_config.offchain_worker.enabled { - use futures::FutureExt; - - task_manager.spawn_handle().spawn( - "offchain-workers-runner", - "offchain-work", - sc_offchain::OffchainWorkers::new(sc_offchain::OffchainWorkerOptions { - runtime_api_provider: client.clone(), - keystore: Some(params.keystore_container.keystore()), - offchain_db: backend.offchain_storage(), - transaction_pool: Some(OffchainTransactionPoolFactory::new( - transaction_pool.clone(), - )), - network_provider: network.clone(), - is_validator: parachain_config.role.is_authority(), - enable_http_requests: false, - custom_extensions: move |_| vec![], - }) - .run(client.clone(), task_manager.spawn_handle()) - .boxed(), - ); - } - - let rpc_builder = { - let client = client.clone(); - let transaction_pool = transaction_pool.clone(); - - Box::new(move |deny_unsafe, _| { - let deps = crate::rpc::FullDeps { - client: client.clone(), - pool: transaction_pool.clone(), - deny_unsafe, - }; - - crate::rpc::create_full(deps).map_err(Into::into) - }) - }; - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend, - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - // Here you can check whether the hardware meets your chains' requirements. Putting a link - // in there and swapping out the requirements for your own are probably a good idea. The - // requirements for a para-chain are dictated by its relay-chain. - if !SUBSTRATE_REFERENCE_HARDWARE.check_hardware(&hwbench) && validator { - log::warn!( - "⚠️ The hardware does not meet the minimal requirements for role 'Authority'." - ); - } - - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); - } - } - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let relay_chain_slot_duration = Duration::from_secs(6); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - - if validator { - let parachain_consensus = build_consensus( - client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), - &task_manager, - relay_chain_interface.clone(), - transaction_pool, - sync_service.clone(), - params.keystore_container.keystore(), - force_authoring, - para_id, - )?; - - let spawner = task_manager.spawn_handle(); - let params = StartCollatorParams { - para_id, - block_status: client.clone(), - announce_block, - client: client.clone(), - task_manager: &mut task_manager, - relay_chain_interface, - spawner, - parachain_consensus, - import_queue: import_queue_service, - collator_key: collator_key.expect("Command line arguments do not allow this. qed"), - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_collator(params).await?; - } else { - let params = StartFullNodeParams { - client: client.clone(), - announce_block, - task_manager: &mut task_manager, - para_id, - relay_chain_interface, - relay_chain_slot_duration, - import_queue: import_queue_service, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_full_node(params)?; - } - - start_network.start_network(); - - Ok((task_manager, client)) -} - -/// Build the import queue for the parachain runtime. -fn build_import_queue( - client: Arc, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - cumulus_client_consensus_aura::import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - >(cumulus_client_consensus_aura::ImportQueueParams { - block_import, - client, - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - }, - registry: config.prometheus_registry(), - spawner: &task_manager.spawn_essential_handle(), - telemetry, - }) - .map_err(Into::into) -} - -fn build_consensus( - client: Arc, - block_import: ParachainBlockImport, - prometheus_registry: Option<&Registry>, - telemetry: Option, - task_manager: &TaskManager, - relay_chain_interface: Arc, - transaction_pool: Arc>, - sync_oracle: Arc>, - keystore: KeystorePtr, - force_authoring: bool, - para_id: ParaId, -) -> Result>, sc_service::Error> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let params = BuildAuraConsensusParams { - proposer_factory, - create_inherent_data_providers: move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface.clone(); - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ) - .await; - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - Ok((slot, timestamp, parachain_inherent)) - } - }, - block_import, - para_client: client, - backoff_authoring_blocks: Option::<()>::None, - sync_oracle, - keystore, - force_authoring, - slot_duration, - // We got around 500ms for proposing - block_proposal_slot_portion: SlotProportion::new(1f32 / 24f32), - // And a maximum of 750ms if slots are skipped - max_block_proposal_slot_portion: Some(SlotProportion::new(1f32 / 16f32)), - telemetry, - }; - - Ok(AuraConsensus::build::(params)) -} - -/// Start a parachain node. -pub async fn start_parachain_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc)> { - start_node_impl(parachain_config, polkadot_config, collator_options, para_id, hwbench).await -} diff --git a/cumulus/parachain-template/pallets/template/Cargo.toml b/cumulus/parachain-template/pallets/template/Cargo.toml deleted file mode 100644 index c51f32a00712..000000000000 --- a/cumulus/parachain-template/pallets/template/Cargo.toml +++ /dev/null @@ -1,41 +0,0 @@ -[package] -name = "pallet-parachain-template" -authors = ["Anonymous"] -description = "FRAME pallet template for defining custom runtime logic." -version = "0.1.0" -license = "Unlicense" -homepage = "https://substrate.io" -repository = "https://github.com/paritytech/substrate/" -edition = "2021" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -scale-info = { version = "2.2.0", default-features = false, features = ["derive"] } - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -[dev-dependencies] -serde = { version = "1.0.183" } - -# Substrate -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -[features] -default = ["std"] -runtime-benchmarks = ["frame-benchmarking/runtime-benchmarks"] -std = [ - "codec/std", - "scale-info/std", - "frame-benchmarking/std", - "frame-support/std", - "frame-system/std", -] -try-runtime = [ "frame-support/try-runtime" ] diff --git a/cumulus/parachain-template/pallets/template/README.md b/cumulus/parachain-template/pallets/template/README.md deleted file mode 100644 index 5a6461233465..000000000000 --- a/cumulus/parachain-template/pallets/template/README.md +++ /dev/null @@ -1 +0,0 @@ -License: Unlicense diff --git a/cumulus/parachain-template/pallets/template/src/benchmarking.rs b/cumulus/parachain-template/pallets/template/src/benchmarking.rs deleted file mode 100644 index 8bba2a09867d..000000000000 --- a/cumulus/parachain-template/pallets/template/src/benchmarking.rs +++ /dev/null @@ -1,20 +0,0 @@ -//! Benchmarking setup for pallet-parachain-template - -use super::*; - -#[allow(unused)] -use crate::Pallet as Template; -use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, whitelisted_caller}; -use frame_system::RawOrigin; - -benchmarks! { - do_something { - let s in 0 .. 100; - let caller: T::AccountId = whitelisted_caller(); - }: _(RawOrigin::Signed(caller), s) - verify { - assert_eq!(Something::::get(), Some(s)); - } -} - -impl_benchmark_test_suite!(Template, crate::mock::new_test_ext(), crate::mock::Test,); diff --git a/cumulus/parachain-template/pallets/template/src/lib.rs b/cumulus/parachain-template/pallets/template/src/lib.rs deleted file mode 100644 index 5f3252bfc3a7..000000000000 --- a/cumulus/parachain-template/pallets/template/src/lib.rs +++ /dev/null @@ -1,106 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] - -/// Edit this file to define custom logic or remove it if it is not needed. -/// Learn more about FRAME and the core library of Substrate FRAME pallets: -/// -pub use pallet::*; - -#[cfg(test)] -mod mock; - -#[cfg(test)] -mod tests; - -#[cfg(feature = "runtime-benchmarks")] -mod benchmarking; - -#[frame_support::pallet] -pub mod pallet { - use frame_support::{dispatch::DispatchResultWithPostInfo, pallet_prelude::*}; - use frame_system::pallet_prelude::*; - - /// Configure the pallet by specifying the parameters and types on which it depends. - #[pallet::config] - pub trait Config: frame_system::Config { - /// Because this pallet emits events, it depends on the runtime's definition of an event. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - } - - #[pallet::pallet] - pub struct Pallet(_); - - // The pallet's runtime storage items. - // https://docs.substrate.io/v3/runtime/storage - #[pallet::storage] - #[pallet::getter(fn something)] - // Learn more about declaring storage items: - // https://docs.substrate.io/v3/runtime/storage#declaring-storage-items - pub type Something = StorageValue<_, u32>; - - // Pallets use events to inform users when important changes are made. - // https://docs.substrate.io/v3/runtime/events-and-errors - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - /// Event documentation should end with an array that provides descriptive names for event - /// parameters. [something, who] - SomethingStored(u32, T::AccountId), - } - - // Errors inform users that something went wrong. - #[pallet::error] - pub enum Error { - /// Error names should be descriptive. - NoneValue, - /// Errors should have helpful documentation associated with them. - StorageOverflow, - } - - #[pallet::hooks] - impl Hooks> for Pallet {} - - // Dispatchable functions allows users to interact with the pallet and invoke state changes. - // These functions materialize as "extrinsics", which are often compared to transactions. - // Dispatchable functions must be annotated with a weight and must return a DispatchResult. - #[pallet::call] - impl Pallet { - /// An example dispatchable that takes a singles value as a parameter, writes the value to - /// storage and emits an event. This function must be dispatched by a signed extrinsic. - #[pallet::call_index(0)] - #[pallet::weight(Weight::from_parts(10_000, 0) + T::DbWeight::get().writes(1))] - pub fn do_something(origin: OriginFor, something: u32) -> DispatchResultWithPostInfo { - // Check that the extrinsic was signed and get the signer. - // This function will return an error if the extrinsic is not signed. - // https://docs.substrate.io/v3/runtime/origins - let who = ensure_signed(origin)?; - - // Update storage. - >::put(something); - - // Emit an event. - Self::deposit_event(Event::SomethingStored(something, who)); - // Return a successful DispatchResultWithPostInfo - Ok(().into()) - } - - /// An example dispatchable that may throw a custom error. - #[pallet::call_index(1)] - #[pallet::weight(Weight::from_parts(10_000, 0) + T::DbWeight::get().reads_writes(1,1))] - pub fn cause_error(origin: OriginFor) -> DispatchResultWithPostInfo { - let _who = ensure_signed(origin)?; - - // Read a value from storage. - match >::get() { - // Return an error if the value has not been set. - None => Err(Error::::NoneValue)?, - Some(old) => { - // Increment the value read from storage; will error in the event of overflow. - let new = old.checked_add(1).ok_or(Error::::StorageOverflow)?; - // Update the value in storage with the incremented result. - >::put(new); - Ok(().into()) - }, - } - } - } -} diff --git a/cumulus/parachain-template/pallets/template/src/mock.rs b/cumulus/parachain-template/pallets/template/src/mock.rs deleted file mode 100644 index 8fae1019f42d..000000000000 --- a/cumulus/parachain-template/pallets/template/src/mock.rs +++ /dev/null @@ -1,58 +0,0 @@ -use frame_support::{parameter_types, traits::Everything}; -use frame_system as system; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; - -type Block = frame_system::mocking::MockBlock; - -// Configure a mock runtime to test the pallet. -frame_support::construct_runtime!( - pub enum Test - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - TemplateModule: crate::{Pallet, Call, Storage, Event}, - } -); - -parameter_types! { - pub const BlockHashCount: u64 = 250; - pub const SS58Prefix: u8 = 42; -} - -impl system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = SS58Prefix; - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl crate::Config for Test { - type RuntimeEvent = RuntimeEvent; -} - -// Build genesis storage according to the mock runtime. -pub fn new_test_ext() -> sp_io::TestExternalities { - system::GenesisConfig::::default().build_storage().unwrap().into() -} diff --git a/cumulus/parachain-template/pallets/template/src/tests.rs b/cumulus/parachain-template/pallets/template/src/tests.rs deleted file mode 100644 index 527aec8ed00c..000000000000 --- a/cumulus/parachain-template/pallets/template/src/tests.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::{mock::*, Error}; -use frame_support::{assert_noop, assert_ok}; - -#[test] -fn it_works_for_default_value() { - new_test_ext().execute_with(|| { - // Dispatch a signed extrinsic. - assert_ok!(TemplateModule::do_something(RuntimeOrigin::signed(1), 42)); - // Read pallet storage and assert an expected result. - assert_eq!(TemplateModule::something(), Some(42)); - }); -} - -#[test] -fn correct_error_for_none_value() { - new_test_ext().execute_with(|| { - // Ensure the expected error is thrown when no value is present. - assert_noop!( - TemplateModule::cause_error(RuntimeOrigin::signed(1)), - Error::::NoneValue - ); - }); -} diff --git a/cumulus/parachain-template/polkadot-launch/config.json b/cumulus/parachain-template/polkadot-launch/config.json deleted file mode 100644 index f03f983a4975..000000000000 --- a/cumulus/parachain-template/polkadot-launch/config.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "relaychain": { - "bin": "../../polkadot/target/release/polkadot", - "chain": "rococo-local", - "nodes": [ - { - "name": "alice", - "wsPort": 9944, - "port": 30444 - }, - { - "name": "bob", - "wsPort": 9955, - "port": 30555 - } - ] - }, - "parachains": [ - { - "bin": "../target/release/polkadot-parachain", - "id": "200", - "balance": "1000000000000000000000", - "nodes": [ - { - "wsPort": 9988, - "name": "alice", - "port": 31200, - "flags": [ - "--force-authoring", - "--", - "--execution=wasm" - ] - } - ] - } - ], - "types": { - } -} diff --git a/cumulus/parachain-template/runtime/Cargo.toml b/cumulus/parachain-template/runtime/Cargo.toml deleted file mode 100644 index 44be5b94e8e2..000000000000 --- a/cumulus/parachain-template/runtime/Cargo.toml +++ /dev/null @@ -1,166 +0,0 @@ -[package] -name = "parachain-template-runtime" -version = "0.1.0" -authors = ["Anonymous"] -description = "A new Cumulus FRAME-based Substrate Runtime, ready for hacking together a parachain." -license = "Unlicense" -homepage = "https://substrate.io" -repository = "https://github.com/paritytech/cumulus/" -edition = "2021" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -smallvec = "1.11.0" - -# Local -pallet-parachain-template = { path = "../pallets/template", default-features = false } - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = {path = "../../pallets/session-benchmarking", default-features = false, version = "3.0.0"} -cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../parachains/pallets/parachain-info", default-features = false } - -[features] -default = [ - "std", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-collator-selection/std", - "pallet-session/std", - "pallet-sudo/std", - "pallet-parachain-template/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-xcm/std", - "parachain-info/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "substrate-wasm-builder", -] - -runtime-benchmarks = [ - "hex-literal", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "pallet-parachain-template/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-sudo/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", -] - -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-session/try-runtime", - "pallet-sudo/try-runtime", - "pallet-parachain-template/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] diff --git a/cumulus/parachain-template/runtime/build.rs b/cumulus/parachain-template/runtime/build.rs deleted file mode 100644 index 02d6973f29cf..000000000000 --- a/cumulus/parachain-template/runtime/build.rs +++ /dev/null @@ -1,13 +0,0 @@ -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -/// The wasm builder is deactivated when compiling -/// this crate for wasm to speed up the compilation. -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachain-template/runtime/src/lib.rs b/cumulus/parachain-template/runtime/src/lib.rs deleted file mode 100644 index f2b9290369f8..000000000000 --- a/cumulus/parachain-template/runtime/src/lib.rs +++ /dev/null @@ -1,752 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -mod weights; -pub mod xcm_config; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use smallvec::smallvec; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiSignature, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, - weights::{ - constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, Weight, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - PalletId, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use xcm_config::{RelayLocation, XcmConfig, XcmOriginToTransactDispatchOrigin}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -// XCM Imports -use xcm::latest::prelude::BodyId; -use xcm_executor::XcmExecutor; - -/// Import the template pallet. -pub use pallet_parachain_template; - -/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. -pub type Signature = MultiSignature; - -/// Some way of identifying an account on the chain. We intentionally make it equivalent -/// to the public key of our transaction signing scheme. -pub type AccountId = <::Signer as IdentifyAccount>::AccountId; - -/// Balance of an account. -pub type Balance = u128; - -/// Index of a transaction in the chain. -pub type Nonce = u32; - -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; - -/// An index to a block. -pub type BlockNumber = u32; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Block header type as expected by this runtime. -pub type Header = generic::Header; - -/// Block type as expected by this runtime. -pub type Block = generic::Block; - -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; - -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; - -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, -); - -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, ->; - -/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the -/// node's balance type. -/// -/// This should typically create a mapping between the following ranges: -/// - `[0, MAXIMUM_BLOCK_WEIGHT]` -/// - `[Balance::min, Balance::max]` -/// -/// Yet, it can be used for any other sort of change to weight-fee. Some examples being: -/// - Setting it to `0` will essentially disable the weight fee. -/// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. -pub struct WeightToFee; -impl WeightToFeePolynomial for WeightToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1 MILLIUNIT: - // in our template, we map to 1/10 of that, or 1/10 MILLIUNIT - let p = MILLIUNIT / 10; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} - -/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know -/// the specifics of the runtime. They can then be made to be agnostic over specific formats -/// of data like extrinsics, allowing for them to continue syncing the network through upgrades -/// to even the core data structures. -pub mod opaque { - use super::*; - use sp_runtime::{generic, traits::BlakeTwo256}; - - pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; - /// Opaque block header type. - pub type Header = generic::Header; - /// Opaque block type. - pub type Block = generic::Block; - /// Opaque block identifier type. - pub type BlockId = generic::BlockId; -} - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("template-parachain"), - impl_name: create_runtime_str!("template-parachain"), - authoring_version: 1, - spec_version: 1, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 1, - state_version: 1, -}; - -/// This determines the average expected block time that we are targeting. -/// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`. -/// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked -/// up by `pallet_aura` to implement `fn slot_duration()`. -/// -/// Change this to adjust the block time. -pub const MILLISECS_PER_BLOCK: u64 = 12000; - -// NOTE: Currently it is not possible to change the slot duration after the chain has started. -// Attempting to do so will brick block production. -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - -// Time is measured by number of blocks. -pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); -pub const HOURS: BlockNumber = MINUTES * 60; -pub const DAYS: BlockNumber = HOURS * 24; - -// Unit = the base number of indivisible units for balances -pub const UNIT: Balance = 1_000_000_000_000; -pub const MILLIUNIT: Balance = 1_000_000_000; -pub const MICROUNIT: Balance = 1_000_000; - -/// The existential deposit. Set to 1/10 of the Connected Relay Chain. -pub const EXISTENTIAL_DEPOSIT: Balance = MILLIUNIT; - -/// We assume that ~5% of the block weight is consumed by `on_initialize` handlers. This is -/// used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); - -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used by -/// `Operational` extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); - -/// We allow for 0.5 of a second of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - - // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. - // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the - // `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize - // the lazy contract deletion. - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u16 = 42; -} - -// Configure FRAME pallets to include in runtime. - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; - /// What to do if a new account is created. - type OnNewAccount = (); - /// What to do if an account is fully reaped from the system. - type OnKilledAccount = (); - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// The basic call filter to use in dispatchable. - type BaseCallFilter = Everything; - /// Weight information for the extrinsics of this pallet. - type SystemWeightInfo = (); - /// Block & extrinsics weights: base values and limits. - type BlockWeights = RuntimeBlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = RuntimeBlockLength; - /// This is used as an identifier of the chain. 42 is the generic substrate prefix. - type SS58Prefix = SS58Prefix; - /// The action to take on a Runtime Upgrade - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = (); -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = pallet_balances::weights::SubstrateWeight; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 10 * MICROUNIT; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type WeightInfo = (); -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = XcmpQueue; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = (); - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EnsureRoot; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = (); - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = (); -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // StakingAdmin pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow root and the StakingAdmin to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = (); -} - -/// Configure the pallet template in pallets/template. -impl pallet_parachain_template::Config for Runtime { - type RuntimeEvent = RuntimeEvent; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system = 0, - ParachainSystem: cumulus_pallet_parachain_system = 1, - Timestamp: pallet_timestamp = 2, - ParachainInfo: parachain_info = 3, - - // Monetary stuff. - Balances: pallet_balances = 10, - TransactionPayment: pallet_transaction_payment = 11, - - // Governance - Sudo: pallet_sudo = 15, - - // Collator support. The order of these 4 are important and shall not change. - Authorship: pallet_authorship = 20, - CollatorSelection: pallet_collator_selection = 21, - Session: pallet_session = 22, - Aura: pallet_aura = 23, - AuraExt: cumulus_pallet_aura_ext = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue = 30, - PolkadotXcm: pallet_xcm = 31, - CumulusXcm: cumulus_pallet_xcm = 32, - DmpQueue: cumulus_pallet_dmp_queue = 33, - - // Template - TemplatePallet: pallet_parachain_template = 50, - } -); - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - frame_benchmarking::define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_session, SessionBench::] - [pallet_timestamp, Timestamp] - [pallet_sudo, Sudo] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{BenchmarkError, Benchmarking, BenchmarkBatch}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use frame_support::traits::WhitelistedStorageKeys; - let whitelist = AllPalletsWithSystem::whitelisted_storage_keys(); - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachain-template/runtime/src/weights/block_weights.rs b/cumulus/parachain-template/runtime/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachain-template/runtime/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachain-template/runtime/src/weights/extrinsic_weights.rs b/cumulus/parachain-template/runtime/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachain-template/runtime/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachain-template/runtime/src/weights/mod.rs b/cumulus/parachain-template/runtime/src/weights/mod.rs deleted file mode 100644 index ed0b4dbcd47f..000000000000 --- a/cumulus/parachain-template/runtime/src/weights/mod.rs +++ /dev/null @@ -1,28 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Expose the auto generated weight files. - -pub mod block_weights; -pub mod extrinsic_weights; -pub mod paritydb_weights; -pub mod rocksdb_weights; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachain-template/runtime/src/weights/paritydb_weights.rs b/cumulus/parachain-template/runtime/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachain-template/runtime/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachain-template/runtime/src/weights/rocksdb_weights.rs b/cumulus/parachain-template/runtime/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachain-template/runtime/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachain-template/runtime/src/xcm_config.rs b/cumulus/parachain-template/runtime/src/xcm_config.rs deleted file mode 100644 index ff996d4dde30..000000000000 --- a/cumulus/parachain-template/runtime/src/xcm_config.rs +++ /dev/null @@ -1,193 +0,0 @@ -use super::{ - AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Everything, Nothing}, - weights::Weight, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use polkadot_parachain::primitives::Sibling; -use polkadot_runtime_common::impls::ToAuthor; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, - FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::XcmExecutor; - -parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = None; - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting assets on this chain. -pub type LocalAssetTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports. - (), ->; - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognized. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognized. - SiblingParachainAsNative, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; -} - -match_types! { - pub type ParentOrParentsExecutivePlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } - }; -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - WithComputedOrigin< - ( - AllowTopLevelPaidExecutionFrom, - AllowExplicitUnpaidExecutionFrom, - // ^^^ Parent and its exec plurality get free execution - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - // How to withdraw and deposit an asset. - type AssetTransactor = LocalAssetTransactor; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - type IsReserve = NativeAsset; - type IsTeleporter = (); // Teleporting is disabled. - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = FixedWeightBounds; - type Trader = - UsingComponents>; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; -} - -/// No local origins on this chain are allowed to dispatch XCM sends/executions. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Nothing; - // ^ Disable dispatchable execute on the XCM pallet. - // Needs to be `Everything` for local testing. - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Nothing; - type Weigher = FixedWeightBounds; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - // ^ Override for AdvertisedXcmVersion default - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = pallet_xcm::TestWeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} diff --git a/cumulus/parachains/README.md b/cumulus/parachains/README.md deleted file mode 100644 index 41ea61bd0a63..000000000000 --- a/cumulus/parachains/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Parachains - -This directory is the home of Parity-developed parachain runtimes. This directory is _runtime -focused_, and does not include builds of parachain _nodes_. - -The general internal structure is: - -- `chain-specs`: Chain specs for the runtimes contained in its sibling dir `runtimes`. -- `common`: Common configurations, `impl`s, etc. used by several parachain runtimes. -- `integration-tests`: Integration tests to test parachain interactions via XCM. -- `pallets`: FRAME pallets that are specific to parachains. -- `runtimes`: The entry point for parachain runtimes. - -## System Parachains - -The `runtimes` directory includes many, but is not limited to, -[system parachains](https://wiki.polkadot.network/docs/learn-system-chains). Likewise, not all -system parachains are in this repo. - -## Releases - -The project maintainers generally try to release a set of parachain runtimes for each Polkadot -Relay Chain runtime release. diff --git a/cumulus/parachains/chain-specs/asset-hub-kusama-genesis-values.json b/cumulus/parachains/chain-specs/asset-hub-kusama-genesis-values.json deleted file mode 100644 index ab89dbb93253..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-kusama-genesis-values.json +++ /dev/null @@ -1 +0,0 @@ -{"0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195014113a7040518ced617572618050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730":"0x50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730","0xcec5070d609dd3497f72bde07fc96ba0878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3095cb580595ffbb4fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a":"0xfe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a","0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3bcf23f8ad989027738144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a":"0x38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a","0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609":"0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d34973050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747afe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc44153253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415","0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505":"0x50cd2d03000000000000000000000000","0xd5e1a2fa16732ce6906189438c0a82c6878d434d6125b40443fe11fd292d13a4":"0x03000000","0x1809d78346727a0ef58c0fa03bafa323878d434d6125b40443fe11fd292d13a4":"0x03000000","0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d":"0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415","0x5e8a19e3cd1b7c148b33880c479c0281878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fb63b830f923ed3561757261803253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415":"0x3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415","0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1":"0x01","0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b062f0665fab654f617572618038144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a":"0x38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a","0xcd5c1f6df63bc97f4a8ce37f14a50ca7878d434d6125b40443fe11fd292d13a4":"0x00000100","0xd57bce545fb382c34570e5dfbf338f5e878d434d6125b40443fe11fd292d13a4":"0x03000000","0x15464cac3378d46f113cd5b7a4d71c84878d434d6125b40443fe11fd292d13a4":"0x03000000","0x3c311d57d4daf52904616cf69648081e878d434d6125b40443fe11fd292d13a4":"0x00000100","0x57f8dc2f5ab09467896f47300f042438878d434d6125b40443fe11fd292d13a4":"0x03000000","0x7b3237373ffdfeb1cab4222e3b520d6b878d434d6125b40443fe11fd292d13a4":"0x00000100","0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d":"0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415","0xbd2a529379475088d3e29a918cd47872878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3b2f278bf7750703750673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730":"0x50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730","0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19506f114d556b001da96175726180fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a":"0xfe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a","0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903":"0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415","0x682a59d51ab9e48a8c8cc418ff9708d2878d434d6125b40443fe11fd292d13a4":"0x03000000","0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80":"0x00000000000000000000000000000000","0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1":"0x00000000","0xe38f185207498abb5c213d0fb059b3d8878d434d6125b40443fe11fd292d13a4":"0x00000100","0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a":"0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415","0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4":"0x03000000","0x7474449cca95dc5d0c00e71735a6d17d878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb36d5c455f52f81fe03253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415":"0x3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415","0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4":"0x03000000"} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/asset-hub-kusama-genesis.json b/cumulus/parachains/chain-specs/asset-hub-kusama-genesis.json deleted file mode 100644 index d6eeb567c25d..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-kusama-genesis.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "Kusama Asset Hub", - "id": "asset-hub-kusama", - "chainType": "Live", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWHGksh2JFMaW8AkZvyhVpmiXUJnCQbngExTLMdq753ZQR" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 2, - "tokenDecimals": 12, - "tokenSymbol": "KSM" - }, - "relay_chain": "kusama", - "para_id": 1000, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x042473746174656d696e65", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195014113a7040518ced617572618050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730": "0x50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730", - "0xcec5070d609dd3497f72bde07fc96ba0878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3095cb580595ffbb4fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a": "0xfe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a", - "0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3bcf23f8ad989027738144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a": "0x38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d34973050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747afe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc44153253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x50cd2d03000000000000000000000000", - "0xd5e1a2fa16732ce6906189438c0a82c6878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ceabb9d5dd4f04028168fb9ed26993fd50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ffd52a3f716e9278daa12da68261ff683253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x1809d78346727a0ef58c0fa03bafa323878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415", - "0x45323df7cc47150b3930e2666b0aa313878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x5e8a19e3cd1b7c148b33880c479c0281878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fb63b830f923ed3561757261803253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415": "0x3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b062f0665fab654f617572618038144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a": "0x38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca7878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0xd57bce545fb382c34570e5dfbf338f5e878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x15464cac3378d46f113cd5b7a4d71c84878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x3c311d57d4daf52904616cf69648081e878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x57f8dc2f5ab09467896f47300f042438878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x7b3237373ffdfeb1cab4222e3b520d6b878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00580479057e7fc669134c108066937498f56deffcabdbfed5cdd23de7df45177859443667fdf148c27ddacef7c874fea7bfacf0ff7601c76607669e4cfd22b21385f3413725de81cf61ff37d2da2684904df6de5bca1d2214bf1291137797f01384d18a596312fcee19f07b8b273cc3bf26fba5df7138c2f798c5e0fe5a11f0ed1674fb20f28eba8b77f1ee54bc8cee2ede4d77ce1d66dbd6943526b197771ce6c76f3ccdfb3637cde3433c9ce2db7eb2fd704c0725fc606900e3c903319258fbc6a3621a689f7cb522f6fccd430b6af8d78a886f87ad883d0093200fb8741026c1b7e9aa06e4dd4d757892bbb10e9f836d1e93e4e1896845bcfd9087b7328c6be4ab4c728d3cc636d5867437335c230f3fc336d461100f82ba1ea0e16db422b6a145650e0afbe5f2eeddbe70c2169d8349529e66ba6b6e9a8936d92f3dbd05f1808b6e413c7842cf30493e664bd1c6243965b0fd686ff3b51fdb51b804d91d814bf3e31b11ac05ed404bc7b7e62f0f805ac47433f8f87d13028dee3b9c3bf1f1fcd68a68fc76249e3f653cf1bcb391d698d5f6b665ad65566b3cf5fd94f1509fce73c8348b4ca78c54a768954d7d679327a444a1829f76d2fea4d4a496e00f80f8d24fda162c544c69eb4f4a6dd14ae1b04565adabccb2e235fdc1a933cd2215ad4ff474ea943a9c43aabea4329a228df2c83781a2ab933dd5f83d8ee3c7ac8dae6e413b9842bfb7a9d3da0f0833d91cb5ef0fd611180dac493ed8e6b53be62ee378b4bbbc3810ea83d52dc88a3af44c0eabb56c5b6bbb84d5767431e9c9dc0a2ae4fb7b7ceff8ae000c9e088931c136f109609bd7f11930a3e33bc0372f273a2e1d9b171d89e8f8367178866d5a900ecae8f81c6cc31d638cbfd88647a43cad0c9e030dce00cab23fcd0d09ac050159e9fd69778b6f321d8ca7bd75dd1fee1694c59423ab8276b4ee4fb75b6d3a0ae5d552b7b756040d91aadf6b1b43bf3b09d28f3611b57b6d5fbab6f3715ccb5ab76c679337c17a7f96b0466840b01604032cbd633509602da805411deff696450331aca48118aa24c1b94fb3c81aa1e3630ca4c0808bde694130b8f2648f68dd288fcb2a3bf191dda47d69f83887b420185c69ce2225c14cfbccb4db6c5d80876e59bb6535eb596dee34d92fddea6e564b3acb596d412dd8d2ee7016e11f74fc9b44dce3775a500ba4d0f01ccfb3c81bf2ceb4b51f5c976efbc1778759e5e60745767b0b02a2435b2222444851465712c8400bb42b0990f0832155193ce826edcb974084bafaac010d333de8ea83a507d61abafab8600dddce93480f3328a1eb133228a1db9788fcf9793f3fdd5e8a1bc3d0c14fc323b4eba277f4be0658f48ee65ba226db7c8b3378abcd1da6759b0fff686ded476d413500a3f9ef6f0ee1bbe3b897b586592df5bbcb688ac023f0c0d76da65068380b664dda972f5f8eec685a4b2f8342638b21006886476897f97003a02dbeda74190fffdd62773787ec21a43e563726d516444596f6e176b4f2a16c3b1c7ed98e76d98ee6acf5663e56b797e0f21c2cd6c1b6dbbb386b3b7a0f226652a470225e0a1114a59c789e3aed3444aa6eb489a8a134c9d13edc4bafc4c3b7317490b69e181d33292d08ea2148fc43c74ccaa796354074cca44812832f5fbe7cc989b7a0e37d0dc65093fdd257809e131bbf7da1097ef738ce726d49695bb2783235146e1138d90ea2ad67c1acd5a1ad78e1a1ade98259fb66db70ea44006b7fd308d66eb939a489d1c468abc175d48e502d41b7cdb861d6cce846312605d18ee23067dba58db2a5e79e128e607b4bb4ad3304e6fe80a8d81cfe4c7b993b82eddb53601d813d2661560382bdf7e8f605195fe8f3202561020b9833c53934f4c13635a321f27e5e3b8c3b9eb36d1e6c13e9749fd8ed56a48ec3f1eae9adc97e697c794b66adb5e33095ed250fb669b25f9aaf9839f1893d7dd3d04df64b931d1d6f7136bd65957b7add9e8ec32d5b5af7ed9cb58eb4351f13adee8ddb8c008e7b9b439cb376eac82b03495840e5e53c1ea3e18f609b4a4222036c53671adad4a605026cc30d1fc48c863f00dfb89c16c66b5a5aa66b90a689907fcbbd6be70e17e12f4f1dfece22eefc368b6ca445f63966d8061e93e9993ab478782b66ad1f509242bc62b6dfb913bf6f93c8c68c7f54d0cb36eccae81680125c79044b44243eba4797b56ed3f96eba3c740e4e50b65d06655b5e3e6ee3e9136d8dc392f2c8436ba765b9eb08a4d7ad36a7e9ceb9cbbeb5198dfbde9d331a77fe744bdeda79044eb7e6a34edfcb6cb2f8da39843f5d667c47843f5d4ec76178271152d4cb88994fec782a52197c8c4df64bcb5b2ef3b9da3d6695e15ddd7692b6e6c30d817791d652c74f5975e7919f6e3927d79df8c4b6eea4492be3e7a77d609abacfd5d5adebfa755d57194d1d872d2b6bc2806eedc7b6bb3278ab4d22dba5a95b55d68401bded87bccb2ab73c7cb503efde64bf34f5361f506a8ab6e6431e875d56b7e5790e8197d41dc74d116695bfb7dc2d77b98cbfdbee8f62d5ca23ac008b19d1bbf5f8d6ceb6236cb3ed56daad8055dd1241ebed4d52f2419aa2b219d9de8ad86ed9639b20dd0eb3c7a44604beba55657c55197c9b3bd5a1c3e12a6bbd939aa468db6a53a7ed08631275f9e93b752a5a4b5d1dc7e1f094cd645466c10cca765d28dbd4adbdaa8c3acc5a3fcbf13a176ae29a66886b7949df7eb46fc38ca23cd3e5abacf59b4d64c3b76964123526d51cddfe48ed3b87c4b757d9769b43b625935acc68e29b173f3fdda3ad29abd3e52dab4d8ad65253afb2ba5d5d6675677fbac906756b3faacbe3b82adb5319bf4d1d3e0ecbac3579f53dd226db9096a67d6658cd0a4f3823105690811c02e1869c36adc6566bcb059b61d21e63d2fe0058fd5ebd5f227abf4f00dbc0de9f6d5a901aa8f49e07df6cce763dc0f78dc7529e16e4f82ed3c178dc83e8da7babb5226a9086257844d5f0f0bd3a5aa3b47ba520d0d8d0905e797fcbde617601206398c2979c76975528dad5f89e92153dbd4669f8d68c680d486d4152d6d03edb1365d2c6e826eecb978ef40a14ed514a472823e7d19f0a45435add2bd57c1ce7b220dadaeb65ed6d6ea071a14a4e0ba25d942db1e32f5856bb4a0e479b529021c51629b090828a9683f11bff5969bebcb003588ded1b0fd1de2cab29006b41517039dbf0f924b661e628829a5d0e337313d63ee3371eac84d5baf1a858f3adbddbd7abd9727bf7b6e7719bbd9e653414181177504389d372576b45ec6bdd7641b06df7f636771c9596bb36733da1c4ab4b43b942ad0827fbd34d18d07b3ecf23efe7a7f73b89603fbdbfd8a635bf4d22fbd3db1ad62d0025b70c07ab75639bca6f7ffc7d6d6f4c6a4c7a0f82f1dbdddb3cc2e769b431e9514771b8c42b01ab29007baf330d1f846daa24826d2a46629b1aa4e1e10fc036afe1174eb8a2e173f00de7c037b6715d13d0101e631b3ebc0cdbb8c3c35f6cb3876f3c20e5694151aca6008ccf36f591d8c69d07db70bb202955dafde21bcef1c15d73b47bdbedb1da1b8f1aa4ddadd61e935afb33d20e8fc356cbaa5b6d5ab496da7acbeabb7d339e6d478f493eaea7cfb04dbc7b0e2b5214add4a753501c631b4adefdcaaa13dd6e51d9b6d598747de7cef663d245ebf5e954d6faca7c5ccb5bcb6d5d88ca5a479935264977d382e734aea93edddeda8f7a75bbbbe5e4ca7db7b2ea2d6b53a7929797b557cbe2ad3697d652ef5be666dbd1ab244db7de6c6d7431890793dca93726c99f491495b4b6bfe3308edb2cbe614ce2efd48994a608fc7e291fbeaccda592497c6ca665ad2fddcdfbf9f9f9f9c97127b522dcbef208d22d00a56aa115abf9c0ac7683b5201554d12d48054042ba05fd84d156b3c15ad00f16ddba357fe71058d04f175d5ff3e55ecae66e1ad754acf715eb2abb9dffd8667a7b639bf776c936addba34260f05306cfd7cbb677c2c3296b6ded24120f698d8fb7b8cd22a28ec7e1976d4f596b9e3aefd65e308b6fb331a9ca58569b90d6271a7ecaaaece931abf18d49d3715ccc5a4f597ded6eed15b3d66d42eae3fad1c72426ed1b0f8ecb5dac3861ed2d5a8d6ddcabecf6b6d9b6b5d766ad1fdbf0db2d97b5e66cbb1fdbecdb2dbe5cb6b7d64d9dbdc59710cc1d878c027b77e7bba9c354086c6fc18be7becd475f9b3a8e3626f1711887db3ca2f51e8771d865ad4bbc7bc56a05c02c51e351dfee8d6f1ed7b8b75bcd07b653a731a9ca766f7367bb31c91d870d8055acddf9ee16c636adddadbd30b6694c6a7797619bbd7b639bed2abb62eddea6ce1e877198339a22b2f9b299d214e1bff31ff5d95eda98545fb7b74964cfb4f2f738dc7838caf36e0128f12e16565300c6776f6c5367dadd7d866ddadd73b0cddefdf1cde6b8636cd3bec8620eedded8a6759569f7c6c3519e770b406977c76a40b016f4f3d3a36e5f84618c6e23abb5e582d16e414af8d253b7202578e9ed66c36a04c01ab4da0fac41abf5c01a9cc430c2862554f00e100e300e500ef00a6805fa00fe2006228a11c910cb10cd308d61da326d61e2c2d48515c2c3c323034a8153c0154419c42a4421c42b100ff106b18a8908d00c11101b84f88648c62484a90813165316d315310fd18ce825eae1f1e059e151e155e179316199ce3099611223120116610a02b402bc02fc22ee000602fe019e010131c56182c344c6f486c90d531ba6312636b8311c1bdc1a2634f01e262f4c5f98c0c07ee032980edc83d887e887b887c807fe438c43a4433c4344434c43ec12d5c07ce02f510a310a110ab18bf884e884d884c8452c02cb81cf603dc02ff127aa204611a58852221cd80cee03e3c1b560ea02ebe0a8b8299c140c0886439c4394839bc281e0396c175c07b6838b82f3f0aee0801c0b380e4e05910bb10b710bf1cbb482698aa98a69cae483c9cad4832907d30e261e4c564c544c40d30b26292619443b4c3198543055996a30b5609ac1c48288875846bc43acc32465a23245310161a28183827b82d3829b42a482c3e2ae381fb82b5c0f9c10dc0ef8064cc566d932f60e8b8795c3d601d201ce61e9b073d837ac1bd60bcb85ddc282b15ad82c2c1656cb7eb157d836ec18cb865dc3aa61bb6c1a160d7b861563cdb0655832ec13160a1b87e5628db0572c10f607eb83f887272e60817582089420f980073ac0010d3820044520808806ac1d360b488612c4232c166805f4f292f090f0b2ec0ef64a44c2ca60ab6c0c1606fb82a5b22ed829db82055a16ec0a768a95b2526c14ab82fd29454901142838816b4306160cab4505205064bff0000a24008795606db77d5ea0d829799204089038918412269020b1d62dc144091224555b253d2048c28709094280c44709254e962cc16409122437263584de0e9440d244089810e9e969a2013e4a28e9e969a2013d9e15ed49cf92247c942c814489921004f170d09a08019325484ce04409099a2059e244fb30513202132481c45f154d89124c9a60822409244b9c68254a306922023e4c48d084124ab48e5783259a5042c9123b1e15ed890994f02079f2c4044a8a306962c993274a2890bd19b4122c71a29d28e171d204068e640fa829f1496289253d494041a284044a4820810a2ca144042248a2023d9e94f6844709254c280188f6c4878912274a9860b2e4ae0f4c968480c699d19458f284c912273e4f284162821e279c48028913254bf42c21410e8f124df4e4e4707768234092844f124b24e1a3c4c8c8d9e1044b7a9258e2b384c9121a8e0e8d4789267a408044890f099450f28412182787e6a489065c2e0eed8992253e4b9c34c1840f0992887170684c9a58e2938413122c81c4a7899e27489638d149382141d3a801a94c5fcc814ab792d5827e7e7a4bee46e425f012d6899d5e6bad09117280030811e26a1e647ebbbca175f4b110cfc1371900c22040dce38a798a91e1ab184e939ba49bdc7b5305dd6b104ed0bd0a323bf7de73efccf0b957801f3f2084ccce4d0d42c730c6c7cc103eb81042ae9821dc6dcc0c193284f03d38bdf72074fbe074efc1f720f383707a3e1e7c3d1e012264764e420879e16358c303428670a19b26e71e7c6f82cf0a8005d7317455052574ec203333c551c30c1f64863224c82f88678382ee45f820bf017028c42f148230147221661600f380904310c21084701986b88221071986e00b7108866028149a1edcdd65c80c21ac98210c00c3062dd7d84ded3908213c7cfc16b6e7e07b6e5a079942c8195c667ecf41866e1752103e081f64f81e43f8981fc307df7bbbfbdc830b23c77570dd2e2f9ca6d718beb70b213f085f730e4207d7c1ca7165bdb71584ef4d0fc237590f00d3249dabe47b53febbcbd5c217dfe31dbbbba107e12e33c35d08dd3ef8a083d04dcfc9c9590098aaaa7aef4186fb9cf576e104a785efc1e79a7370775fd3d1da6edbcdd1f6edee5aef6d8cbb3bb5277350cc340b215cb8dba6d720c7f75e555555358931a1c1cd6600255094f42079228911ecf8134a9660b2040993254930a1440842d004c52182267a908880c9121188a0899e1b4160376ee0e051220910f4f4344180191c320090b951a3f2512289274c9270e283c467c90846d004c906b54123f34489089824c184121463a2c4092792c83182253e4c48e084da08810f0974d850c204121f264b9c38814489274b4690a3c6124a9c2859c24913486c861042c912273e0438808d8e279a28810f006c8610a24633001142180089104a7892e8010112113059c2c4932498b8909e9e253c41683c0942c6a78926483149287102a3840789cf134a98f880f151228220464f7c9e2c794209019e581202254e9c0882394942498f124894882009274df83c41b244cf12269440e2d343822442a064899a380200b012272140e2a4099f249468a2a727891c958f93247c9e04214400444a7c9270a28489121138792280d0124a9e3c51e2c4891134a10412274aa034a1841227489278b284124a901880c76608219c5042c9939bc984123e49800009134f96305912021214264adcd50c808449134b9e38510205890942b0c489122848106080218610620925489af071c2044e9440e2f38492004061a2c4c1343681932646a06404110a1325aec794033f58a24a30498b529a92b42851a26ca995a24429954a712abd24514a2f4a9428254ed2a294a624ad5492495aa914c525296dc92589b2cd2569513649a9458912c52589b2513649942d458912e52589b25138498b12859394364a89934469494a5b8a1293b49624ca966092d29636492b9538496ba552a9f492b4d27292d2964a25976408dec3b6d676044f926801ed476c5d6a0cc16a3c5e3b407549ab6c19638c355edec7757ca44164e683c4a468f1c8c1a4f8a8ef943538ba9874372383c918bfb7288a92a7e4792828a98c11d61e22dc0404cbbdba3b77767fb4b98cb326f6d93cc7ad9b117cf7e569ce39ce7cb8db5b5785e5da0cf58956d913bcfc42082bfc744865b0ab65d65ed3e3abbccc9ac0a6cbe93c92b6b501c69f68ccfe64ed294dfba8585684cff18a5a7b73782003d006ed960da35ecfc9cccd228e48a474870c5534fcc436aeae1775b5747bd3f931e3990e27796d8c97f1e7a7e1237c24c37df2d2d38e3bfc820b190d1fb1118661570ca4f56af83ad22a331ef9782ab3b0596463144d22f2719a1eb389d2548f6fdd66458730378e83d70c8f200938a202497a9e9052c50a2cbb05db70bf5b325725d3ed33dddadf358bec18ca6867c4ddc26226a749444e34aec6363cf190aaf2fc8a55997a2a2be23e3d4e2292620bff2691c86f9b83a10dbabe60bda02c5469f75267c10a1112146f1681eda03091f7f3d31a90a547525004ee976ee29c4cf791eff16e0e29f574472b5bd3c550b8a75bf27252d226ae27f76804d2579ad6b18013e09c73ce394772d3d421312903a476d323bd071f430e42da85d039e7de7bae0d101e11d4e07bef3df8f75e6badc9d1012e26ed14217cac03e13e2f6093ed27a5de4f53fb0121ce14a3840b2385710cf8de7befbd07617cefb57e3f0e6be37b1be3bef7e08310be2a6d8a31c61879b7b911124c923fc9479069fa4e2edbc7ddc369e5d4d92d1ef73ec6462b146d777231c6dd297ecaa6088694524ab95208466de4d9f3e3eb521a22135387a7a80f26498a9292a2284a4aa6288a9297524aea52ca53144549cad382a63310d1d007d682249370f8000d7d700de46f8cd3280793b043278f394666869121076948723570779a383e92bb9921359c69c8926d229f799a81194d002d3d40e0a27d740b02029569e2701c3111e16b300fae5b6badb5e5d112cccb3abcb435e776dd9eb7b5c6dbcce072bc2f846e448493d7efbd078fe09c734e08168fc3efbd51079844bdcec829c2bb5f16b54f7264388d6c3ff99e739256285a9e338aa22899f173ce652f73d3463c4409a7294792182384d139f75c150e48c3eeeeeedbe1d49961d2b27392dfe0a8024c5ae6bd73ccccec989977df3b3384eeb1dbefeef24a616666e75c7c9d9961271dcca264e6e7f809d0bd353333bbf37ba3204cc2987431e9bde75e9c3aef3df8de739419425a5f3fd25a72d03966664719b2c139e79c7b71ea4c74dfc2af8c6e2e9d79eebd9841f8de83efbde71c141dff324b08364df1b93be7dc3a2edd7c605c5e7befbdf736e1e11b418049f27566fa4c0eb6717f87998c02cbb6a7636cb30dfebd5bd362d9c5a4f8291ec6f8378d6cc3182fa74e8c718adcf190d6edf81e143d3d5a4230f8066973137c84efbd1824f2818b961670d1022cdd827c008475ab420b80da6a3758ab0290976e4156bc742575fc4cb72a006d694b14db9fb44e65db386414184d9177ea147daf14a521023f1d7eb2a8bca3399814bf42b0e93b657d52cae9cd8d3026611793a63b29f5f4372593a6efc4618b8601ac05fde08ce6d12de80761a8251bf9d6566b3b8b6c4b5a275a7db827ba1387a09d386ce124dd89c3164c6a3dbdb5e5b8a7efc4018b9d3860b105dfccb89af866b3bd13872e98d41a8aa63e65f575f58aceaaa275f2e1969fb29d3870c1a4d63b7108d2d98903166c53ead63c67e2e39b8b33a39d38606152eb2ab3b40981b613072c98d41a8783408e67588d47b5da05618c94183633f3a641e395d43215a42abc5531c3eaf0148e835973cec64c0d1a9fa153d8a07344a3615e63f41957339289c9e04359ccad5bd32504e3b91225484e16d3e5a7a9132f519398d752c7d0276e0e811765a2c3ac31497498ac46096a988bb671081e872dab5d5416cad6c9f4074004e24b536ff2a4d450a6a628dbf0bccb6fbccca1d55a11500656acbe923ae695d4325f1abb65ed35fa47879fc9ce35b247a41a8f79e39bf9d01bdfcc9cc61bdfd8380ccca9db90344e7d060bd13ad331a73eb3c63514ad33378d6b620e5f236b5c03e15b4f5f3af4eaf575b5de24be42514445a1dce82bf3d443596b3f285ae1ad26f14f78a8cb9c87a24d448f87e29a0926596fcd4785b4497c0d1d8a6b26aab7a953b546aaa11aa24de2a94311bd32690b6a7c8a2041dad5c041c2d5b8dff8fc7ccb99af416a1cc75bce14363ef3d66a681c079de2067f328dcff0675c0dbfb62ded8ee370d846d65a0d0cadb2635e236bad26e6a3acbe634e23ab58c75099b79e7ebab51f18ad3214deaa48b4351d8794029b6ebdbeb66eed65bd4eb77a12994e1d66d43c3211a10e69754d851c95b50ef10563e89352c364f2a30c1365f5f59555f0f038a414acfa7e698b56eaa1bfa913a24260a1c349847a88d68ad6d7f014bd320fe715a0e74c1a25484e16f016cc6888bc8697fd7a0a5c60d139ba4d818b2a6df105b3ba0d4504b5d44ca6f6710d5f6ab2f0b25b5b590bba624557f0143502655b521a22b2e37ba686e27aa291c83ba41793f62e0a2cc9285baa9ea80f56177e8005d10fbc682ed4da8fc6a425d64eeb26fba5f7bbeba4cb7eb0c5fbc11096977f400376ec6c9ce19e7b35dcf0e08395189bfd21363ff44c6b3fda0f38dfa6cb64fbc1c791046b413e00a3ebd5cc8f92ad88e8056757b7201f70d1568bf039de3685ac2c96e8467cd5d1edd5a8232244d32b4cd7aa8d900b845fe57bb58cb81608bf8850fbc1afaed9c8b73d9a5fd1ca4dc41ad1164885e1d17c8a56ee4a44f36566a391f82e33a22da902a01ba90aa0f9728da8d17ef0f9d71a21b340f87c237c10c136ad9196d61b5547f321adfc9e0eb3e931c3d8668275a21bff0eff5eeac74e5e57ac995ab706abf1a8bba5e1ad2088983140ade956b36ef2867cbda857ac9b0cdfda1da6d16ade754801f4fb8f7e9707e8f7baa3ab94693fdedd23bd53599561520691ee2603ae06beee98b15eb1eb557695fd3e83d8b446aa3b96d61d1970370be46ae0e545abc42c5ab1056a086f2d90bbd921b41af823546942150d770a0d5fd74ac373fb01a160757f1a5aae2d8764da8fd6fbc33695464b619bcad3eff0558635d29ecaae46dacb4c36d27eca5e6ba4fdce2132d835440e79cdb4c924f2fa51da5c4ddd2c0d170b26c16361127c5d2cbd5bba05a03445d9d2baa90b50787db89f0ff70ed9bfdebf5e4a5364df9ac16a3c2c21d836266d2b82db1ac12aa8efc6fa3b4f9d698dd86e7b7ed44d9d29cac735f096641b38f1c24f990fe6eede487ccb09c19a4e93c72478a44d1d6a3aac0e273765af77568efa705794a608757747a170efa926eecb191c8508ff74136b39abafe397a711e784ba8f6c273eaee3b701e1acc28edfaca2a0dddd3442d16da478c4b59b5406859bba355d6e1e79bdb7e4d5a611d794e375a1ea9cd51de2baa24d5c53d44d47af003d47529d481f936063127cc5dcf91847d9927bd08b45137aebfa0e856845a26b4f90e66952a1b86622f476f9d6d3f754d624f45aea508886fea4d421fa84cae69535a9af2bf577857cb6ab57c7e1965dc77154366fed15caa899bdbeb22692caa83f2935459f58b4474a8942050de54653af686ba4da68138a5e6981fb148d27da1c9d026b818d9c29a0a87ae00325e0a00652d082951c28a6b8abe147695cb000628a30c6084320b2c8817f7f6f39eff13953b8b756235580b59c29b056b38f740a489bab697f147335ed2d670a47a790aea67dc6d5b4cb28afb4ce9941f498c46fead3db85606e779756caa232f91d3e0e90001eafa9b345358aba10cc5db20d45eb5b9edfeb0cacb229778a5649697bb7e648ab84b462ed72f44cbf77631b77f372f8edb55c3786c6edd12a1dad58b71ca67506069392c57e05cfc9825fe275e2dcf66a6109c1a6e3b01358757fdf3777f8fabe74ca9efb3be2cef33ed1d767e35edf5f265f3fd73cef8fd60260af5bb371c2edc33c8bb82f5f5ed6da72d7dbae6c44bc3565326b02e36ecd4eb66791f6e54bbb5bf16a45f8703b0634b6d977be746feb6b87b927588d4785555a11f2eded0a67d0d2f2d6db9706d8dbfd7a0dd2f3f500a15722dabd26a0a75bafa4ead547bf0eeaca3fedb0a6a8cceaa5856de0ddce7b74ecf5b5ac12d23aa218755a644369226aea2251d6c47dc9aadbb2450c329c193f54aab8224b175ac2e83287e7054ab1ae6cdb69619bd0dddd2c12a255665aef9218868414fc93138fc357d69a6a0d48b58e44694b3a492bb7c545f3df912b9c014bf3a7bf69c479c124f7496b0e26b95fd469897326dbde1960d505b5735ad8c6ba33c2b7689de611ac5bfb71843f35d9a6a6b6f085a4c4bf6f539925857f72d8bd6bca2c78bd8ca7eb659b13b3153c270b796ba226760b2f99f1c853b7e235651c45cbcc7df9d252f4446556a3a8a0e597a64a3d8ff06ba92799754f19f79b3b0c68499b30a0e5adb9d3829afa696a839aa24d36a8e59fa4adfdd8b536f271f8652ec705392fd8860fab740b40c98ab20b2b33acc683e1dbf906fbf9f951414ee3dd5dde85900a8131e45ddea54eb0f73de43f7efcf8bd33583b3c2c21d8de5abe96af7ddbb6f8fb7adf5bd69a84579b11d8be98d4aea6b35408eccdf72047b47e44ec6cd409e6eeb6b94d40b7cb29b0377bc16a3e30b7a5df2d21d8744b083631c9da4b08d6985479f474524fb71a2ff30bb5f663fad5f846ca8eff2dbeddda9149e1c48e5b42b0e96dea5cd9711cc621a3c0e6a737e7a4574e819eb3e3d67bd67276642da7cd09c72d1cd9b695b522a2ebe9d47aa1fd78b79c8ccc69583232f388d632b71ebc705cd7cc0dac63a5bab59af869daa2db0ed6be088317ed1ec31046bb7609c1b0b7a90373ab35eaf058536fad883ad3d4778bbb7159660e6f60385edd657137ff7bd58a887f976b848d8f8e83d699ae2ecb8edfa01513b5cc675c967eb791b50644e6cfa65623f31a996b2499efc85aaba9365ae6a31d2df398b5f6a372cbdc81b146b4225a57eeeac0e8df788f47b3899f4ef2d16c625ec74c46116fd1983a910a81c5c498d03ca275ccdb1cf28eb1ae9d3b3197b90e8de3f0ccaa8ecf8bb22a7abc35af296b1d6770ccb8e3f8220c337af4995bd415b36d1dd976bc4cf666ae9999df9899993935756edcaaae9d3b7152f3b2b231aaf1f715a3cb18d6cc85236bbd2393b2e32b78ce0e9a850e1d07c0a75bd7716baf49c78d79446b1d1f4d1d00dcb2ae986c7499ec3169f4a823abdb328f9943b869d0c6a411ad3d57d334d91e1dcaebf826a28e545228db235a653edfe61099d3380e8fe68e8c9c644ee334649c14b6b9f17707c436337f7754d826de3a0d19b689f97bcc9c1526bd0320735730e95d47e6b05857cc745c66eee878bc15339a5b36f8d33c32aa31294d111d9ff98c0e4ae3aa3187d03cdeb266ae367722a5f9ce1d9a26db390ee5e1389fa6c9f68d4379dd64cbe8993711f50c6ded479db98dc779c41d0785b29d83d6f879388f8c3e43a16cdfa035bec6715ca4a131776828cfbc3c4f8dfb6c8f4ec36e1b0d0cc5e3c85adfc85c154c7a9fc99c154cc2d257cc360c26bddbc8960b93de47d98ac1a4f71ad97661d23b8d6cc760d2bb4cb66430e93d26db39b85056b743a7e690edddd27ebc8f000bc2a477ec30990f26bd5b30577cbd315f4737cdd58c5ea99ede5a113bad439fbeed66b7b89af7e9325367b7b81be96adee5885689f5a415ebba5b5c4d9de92a672646493d58959544865644932d237efb9de711f778378bb8ef16b6e1bf6f186c13ffbe5c5a11addfe12ce29a6c8b44c771a2ac75286b3debabacce3495399964e6b39da4d5ecc9906560afd5d4e6a5f775a62decda395121b020dd260f16696d5d7abfdfe26e70ae54e19ad6ef8d6d70ae54c1a4d69056d975b7f47be3f1288fdb42c334c4b09ce30bc1e04e9de9ded4d9ef84f489763eda98e476bfb05a01302609e8cd1e9378677b0956316619b6e94940ef79a6f90abcce15a0e7401a25013959d01479edfeda519a22eeef8ed68db225c75b8623ad00b05b5011cc3882593d9883cbd22b72b74494dfb62dcee47942a02405ce561e877b10d4d6e5f76da9acba95d5eb3cd4ad78f9770b0344bf4b66d53acf398fc37cc94c74be30ec32ab5232bd825d04af1614f51064ba64d6fed0d82dc8db5cc48ec30d2ebf5048664d8c76d97628e3e338781e79ebaf5a6f73676f59d671d862f926a53c0eef24226fddb244196d6b2f115f227789e025cae639738dcd5bd38c0036dfa6116c1e87e7ad06271ca15a829ee71665cd8cb6aaec9a3b933a6177abca2eca5cf17565d5a77b2814bae896a89a2e720fbd316db25f1cdf0a55dcd5f4d034b326fba5d44c5bf351fd72dff66d4791624ca2fde80c93f8db51b63459c6a10756748e6e413c08445ba2d68aa8414aa2f7ea6caa6ee2be3c38463fdac47df9221f4599485ae57b4a4728a321650245bfefe55df6dee691c6852a2de9956845e9ba15524c142025a82193c6852a0d5f4fd0928214092c510032062ac827da9ddb5fe6dee606acc8997e6aa0e10852c0e1e77daffce8784110a8b0e24400568ca0e5c7c78936465ff90132062afc40518094a0274ed0f057a26863e44cf4a78d91d32814ed5198f0c0076450c1193f3f3991fe48f9f9d93b5a9d689781911ad020844048f1e54b4e3b0e1f21c351b8e45cac827b6f92100698ccca8be252292e5d1fbce652625820ecc5b2dac519cb8ce27ab559dd6547b40794dadaa9fedef7fdbd7aa22bba53dda2720a8ca648f5f8f88a566f4caa68ed69f7690ea1e44c739325b9aca58a288a7e018944228ba70843557688d61585427c5d53ae29d7946b4a95d03e3758b9802e2a566cae53d37b1390bb195df4e445a2494e734e5a17e8a23d573febd3025dd735c5ca96440ca5500506e602baaad0ba17956bca3505e61710cc5505e6a2b24018cc0261d76824bf30a3b7d1bbae29d7946bca35a54a0fac5c4017950be8aa7251b9a85c177f5a59207e9f55265bb9ba6e15e657b6526556b189f97c286b4c9a33e69a175f53ae29d7946bca7351064154aa50d14be5f5872c5b70d14590175ada3b03cb9205cb8265c1fa9025cb165c7411e405dbc4eb02baa65c61058b952bb06c05b1fc416626078f93ae2917153f60f2adae953e602b339383c749d794abcab364d90293e1714db980b02c54ba72967a711677b3565c8d7b95eed7148bd6ad2a8ad605ca72616bc5dd5c97956b4a90d586ca8ab72c0831786c2535459e3b3cf0f25365ddba4e65f5358561388eb24e5dd83c454d6b3afcacd361f3a1109d164f115ec4a1297218f54b24e2105b9f77bf2c49eb14a163d14217b0c1ca1ab2b4906e5fa8e18c27636b0d2d9e5729d7404607d1ed8b350449197af52ee7297eef4f7e7aefbd338bce6ff417f3e9c17c7acc2469954f5e464ef2d863e461e4f5113689f8f94cfc2a93516021ea33f5b33ec928b0497b66fa59bfa8bfb9f3288f355515456133af24e248450d73680274fb420d413d8617bd32e8f6051bb2b4957eada9376b8aa1b5d43157e87a68a9af7c1543a19b3b3cd42b233b61b046d4523f24fa95d5d757cc3e86e2b82bf4eb6d1e1171c7fc17f5e1be5eb1d0d4f1d43139c550eca311bd8e855edf6fa6e3eb6b481de68d77b4d8ca29e6bae89730ef7ae8187dd5a78b4274665726b36b16b1baa235bad3f0e564a55b004ad8422fdab0650d5eba4b972a1aa885e8f6c5186174969e6eb56fab3bab945adeaaef7d525923f8cfdd878dbc4329b0faba526f6fd487d659a5e35987bad58060ed8b360435a9db176da862ca30a9b54a9d927bec98758a7f61af3d33cd87f99b3b3c4ceb1ec7bbe3b7d0abc4de617e601e6aee26ab33d3afabfa4c3d7fbd72167723fa2473a6158b395f266b5cc3b4ca348dc35099c39c46d6b80686d6ab3974990ce631190cad23da33d3d5312aca5e33ad3d333d2f3a6516f599baa2543c4bcab39f1ee1dd4469b31ad2ba7f8e622e4bb7004471f3c52e56e3515d9776df2aace85d6a846386c960bb87eaaaaaeca2b524970fd88cbb592d333db366603cd461d7d572ed82b15bd8260c31b60bdb5cd5dda76a299d89a213060b64b7d82c5c64815cb08ddc0a72c136d7dd770f15acaa4c34ea01936f75b398812d35fd9d1484c8d575bb4e182c904945d7f8851ab290560bdbb42fd480a5dd178c3750d1ee397c4c182c9038d1496581c0ba45de8c962aea0c6b71379bc5d5b8535a584bbb4f18ac114babcfd4fbea33f545ab5b3f6dd1ea33b5a4d2d01d879402eb99e9958fff66a9e8d52bd34b6bcf4c4b2aa72ced1eb3098305e2ba5c31d8d6a66025073dc3a429d8a0f1c0aa42153c4c614a2082f03085276899ba0505c92186f60a56d01982c21004c6b60dea2228cbf2729095a02a825ee046dd82a47046cf30093a2785394cddacf0031cb493c218edd849210c2b90418514b600292fa4c045cf4c72d271f449018b147e2043f20acc11bee6d7b422acd7cec9d6700c815552175b74e5d13cb355e6609baaf9f2e29b96c32dc8e5c0da6e6fc61259dc0c40058b659abba1a900fcfc7c29a75dba1b9a0bcc871efa7ce3d1cde5c064b6d39aa4436a3f7666d77958392e1e3c6e6539e28cac4e5df65cb5e76aea6460d5a923156d4ce2c12ad6ae66ff326c8ac2a57d0e0c4c2ee7aede3bc717ff39e62d83450a4200587b160f6c8679990600631c8b62edc518330c1ef11d43b601808d2c1d587b560e1a1c9610ec0626258bc643f00d600d0083aeb92d673d18aaa5d2ee05ac95023683d9a88185ace643a7e7f2b9fabde76a373155398ed53b45d19c8a56ac990626258b4966cf8ab45e1dff5e9d4fbd569f68f5ea9da7a29249fc28d573b57b7bceedebb9da51f95a405b954bae70392cf3fa92b126d002d1072200a10e6ee0411fccc869d4e86212a98908da0115379cc309d8aea85cba03166cbb17584760dced8b33a8214608b62c47d802661abee12404db73b68d44e4351771cd9fda328649c9c2c9c7ecca60636cb30dbfcde6b9e913a58974c8c2c661c838b044f0d492ed4382c65847437b8425ffd88649f2ed1b056c62d3a56401e379c8095c2b05ccc2a464e19e0e6bc87645635112939205bbb7190b62ed3de67683610d9b3077d37220ad72a215eb9c88394c4a166f866d96baf847b128c32447dd94cd74c5e61e6392fb4c7cbc9b74a293d798bbd99c23603f233821d8c6bc324c95d82b257ab542afa2f98a5dd66b0d23aa571bd4eb0d1daf0080af6f45c4abfd708fc96603e20e93891ac91d66ad01811fc5b43b26d3eea21aed1ec2d1ee93a6dd2f1ded6e650ba4d21f32eb2a331f598fefd841801d0000400d0074e820e9c89123881c343403a0c1814300386edce0716366260033366c501b356a643568d0380d19991d32313100888181d101331ae51861180d2612e1108542374273ceccebb27159560dabaa6854142543491923a709668a71149bdbb51ffb8ac1e68b5a11affdd8d7ee21e7da0fd7fcc9dc7e5853c66ded15b72db8edb9d0461d78b52260fbb17753075e5a6f1b875afbb1a57e94317e105155056bc8f6626db2866c37cc9d86d57c6042307843bddda232294bb388f13105ed1a9e1f14f8e724720302ef5ecc6aac2730c28d040fdfa1cc2a37dcf603be4669c713bb2b944046b7202570e902740b52c2101ade7adb4890db72a8b51f905ed9ef4f60399701628af039de24b0168484337a8085e3296ce1e52404359a842cecd825c10a4cb7a02450e999bf1d3cb6d91102164c6a6d471012e6d03bba0521018c6e234b096cdf304b088631896598c4eee61d7e3397d5b7831914595400fe5128de2114f0ed0bd6a47569f796d37888ba8f5356a1886ca3c30868e896f3b296b3737fda07f6522460183b1642bc258af0d99539646640cf99d61b2f605228b2081d8a2ce2e7adebbdcd2214f5362b91e82e7411e5e1871edd43b4967a662d87e57db8c83b45e324e39b8ea4426051c6c7699ae2b7234d9177f7e7a26ca972ae0c5df02116dd82906005f5062f8f042a67b81b28aabbb72a6b3cc434db3402290fbb1b284a39d2d5c0d998449d5c404a7335aeb65754ba1a3e02df68a528c653a73726c934cf23f092d66d9e8942ba14bb2b38e79c73ce317f9f19ac8d87336b4cbae4abac42d1d5df1cf26ed1ba6dddaaf1b0ba5bd9152cbe85de43536744b10ce8395885a242b1008c42d178087828b047693c84e88d876023edf13c8d843ee561569d33eaa3cc1dcb5a8e05af26a2d6e7df7f6559eb6a3a251f7cfb04efc33b31529a220b697d34ca96a67b4048602dc80867b4083e97c928b0eaf3661fde8190f2b83bab4d86d9cec624e8c370371056e351b98c9eb060c1a4e9375a901661b4bbd95e2660dc65a48517dd82b4d8a281740bd2424aaf1777c354d85ddc0588ca129839a7bae49bea4b0619341278e767e051a0cda1ce14cb8094153020873ad0e6c83757c3404c983b6ecc816d00c036353ef399c15c08362f040340b65d23dbde916ddf98b37ab38460a363c7e199acb515af364d80c028225ccdf42a7be2a9de8e5085a8961a4674631e06e6d58c113df44b08b65a44532707173160321a9acb69a4a23cd334024379aacfcf2aabe8080a2750b0fbe8b888ce1bbff16b1a09d15ba2524f9aebc89aec689e1c6f8d654d76748e8f329eeaad690e93edc86e64bb25c771f8cfb20593a620dea60e8fe37090174ce2302c398fc0bca2b5fa348f883e69ad157d526aec15f650631b1d9fa7a691185a2b398d8442175d845d9431972d59858207e623ec1556ed123026638c2e31cc41ee86bbe808eae9960e1dafc6ab1aaf463ab2aa4347171d1993d145878e31ba90b1231472352ea70ef6c63657dc67cef3488d57b4d6b8358338cf23303b7a452b0c7d526a1d9fb776c2843e7f04a01e1de6307466a5203edf3c527dd21a3222a2b57a9d1f7d34ffe6111d4460ae83d6093300011c872d6c1ecbb6ad2ce6613251751a0ba099d4c905f6fc0bbcef99a680bf3405fbf7142ccd22f414f01fcd625ef4378dc07c742b849d74fa368be8384679aaeb78280b7d006fd348e859111b0f519eea363e71b4c671a48cb3642da7ca5a8bb20a45571e0fe238b222d96dd05aeaec3159117a1db4969a1e26aba51e9d46564b1d80b7a913001e6f1dc4e9d409820a81f10882c7000490f1153c461fcd9dd12800df0e00a529429f9d52e6a2cb969e5e394b8fc137fff9f989e266ca73dcab67b2990bdbcc57171de61c06db6cb1e8d481811955a3edc2a4ecd3ad2c83d979a43a4ce8d5e8221dec479843b7a02388d195bbf4740430fa46b7a02364e9792b5e5956b363b7da2402436ba9611eaae6e33c327a526a98bf69247498cfacfa70679fb766c656b28cb188debab2959e6e5157f6ae2c6bed2611d1ab3751e830e72bd8a6a250b8adb00d16ab00b3d251e9b8b59308d6d8db24821d86d610dd31aa2dc3d54cb7ac9d1710f18fab998ec3757bbde05825609581c8a0e2a50a172abca8420b5bc13675c7e8897fdc4d14bc65b89b153ce791c136d55fd678885a51998c67a7f5fff39440cb61da7888ba5ca611988a6e172393f2cc57af9ec54b9b44aa8b687d52ea49eb0f43d78bdd3206db9cca7c3a8ee3d2d3776450b8711c0019146e1bb7568bbb6120182d130c2f3014e6d5e8f330af0e739eeaa1d5c2a4e9fc33caac2aabf355eb2a9afce32594ed195b60d3cb91f93d836d42140a7748d47a82993a222a0416128542f33b77e6a43c30afdea61118ba5b9834bda275bd60d2741ac7612efc13f3f93dc30bdbcc4fb74653675221b0ea15f5e11d18980bc1aa33d07ad1c254a6d7eb856d469fbe67b00df6e9fcc336a24fb72a1d9f1994edf92aeba95e5d4756c4f57c28eb097dbbda9e598e5719b7d5963994838aa03129e655c61dcab669322905c3f1d6d5311c386edcb801f36d181b6f3df3d1d499a1426036666c341b35dee64e8d1a34be4d83d66d19ca0373d1d78bd03402f3d1ada9237a28862e16264d0f4d1d989745c17f9f597d3d0f93d5d73097993a8d17f0c37f544ae32160be82e7bccf87269110add545171dc7c164a32c688a6c87be1dfacc2a8f0fb7e8308f993aa2f318f3d3b90bdbc07c3a933161a60e0c150283c95eb739e777ee54df167d5b7418ba5998347d942d174c9a8e65db0593a68bb20d62d2f44502e68549676c12b0ba5cf4740672370b04c45edccd56e16aa64fdf2a7a5a2f3d1d0b162c284ada84e8155945155630bfb748c0ea02f5f405629bead3970adfb4a09f9f1f2939d3dbf5ea8f1770bdbae405003dc77af58b1760bdba9b3a151502c3ba4d1d2715d83b0a05142457337dc6d54c5fda5c4d105733ddc9045ace5dcdf426136839fc09b49ccb7a25c27acb99de5bcef53ad3d32d2b3bc2d54cbf322dd7add7a6a5a70c649b43652d87b3e66a6aebd2d327407091dd729ccce0774aa0e530e16aa6cb1f26a3a7f34442ca13ae66facb68aa6734d57fb04869e65b4e3ca43493d220113f8196137f81cd81df1cf88bd254a73415a59100fffd02eb5e9b97ce91d9e6b48984947729fcfd44793847142e6d142e2d2c4016b230238b39b4a02cc6c0ba0565319f19ad879e61527bfbd15efbd1281969e87d1bc05a90152fba5ecd56cad02c258b3d8d953072b09f9f9f9f9c3f106922eabd81b55f4a621bbe1abe45f379f8c098ea3a33930595e6e720b51917640a8b2f046b358dca6052b268fb28bb3aacc6a3b62e44c06a0b7280b3d926028c76af00dbbc3f7722dccd6281eddb67a4ccc7ee21f511846d765f217d94d4241744b69b52172d70c3166168c34f0ee290e38eb59b76c611baf8c24f1160b0858b1cf79976c30026fc608b11fc7084292c21c7fded46013f7900031659e4808b31e4b877f9c2ba25ba6e5159e589a7cee718cff1bdbbf74efddd3db83cd3a94f87927a75aba2d6ba7b732eaf833b4d9d37756e5db4caeaadcab65abe9656ea4b65d5373b42bda295c77a91dae677518fe7dd9d3a9cef9445c5cde2699b6226c3a43dcc1e56ba3666c16a3e30be9122bf82e7489a05431e3e0e2905e3b77e77ec78db0f8ed2fcbdb5ec24be6f03f2ded88689b87650b81dd36da4f706fba1a099c82ce2d8ad0b4d136de27e3cb72fca9622bb2114010e43b082af6ce9f6d762ba3de6b7e501b6bd67667766b77bb97f5f478160351f5812ac5801095d58a2cae3d81dfe7db3babd5b799ed5f8e9d694c56cad60d4db3215799cdbd692f24ef14b6be471f13bdd63c603ffe8e6b4efa44d6625b92e0c6b797b97a70ef372b6bd5a44ddae80850b7bf9da5a4ffbd1caa80113496af05a1226b577e0061940e206974482490d023a3802470732180e968004e080882038c831330a32e3c387cc1ae9dbda8c0cd6d3ba4879ea5b7abf6180d1dbbc48000fd277665d2fadf293ec695d88d82aa613315581f1664198e47c907830c9b911c6a4f6b581df85bbc36de5f42aa594306e8bb08c1614aa81aca4945256524a69c94a4a29e3b77a8d314659490a219c2084cf87dc8805c5e2df7b11625fabeee371bcd7d804b68fe7c84b5f567b66ac403a8410fa68784be600631f64c8001215400202adcb11380ec04900110720e200412cabc5acb51ff2386ea70e758a7426451e560e99467da25ebd4e13f5893acf445595a2a88f6bea9474417c04f1410ab51ff13ccee3396664b0a502e3cff6237edd8c8ce36d2f74b51fdf5d79f9ee40cc418290483c784c80a2ce6198943b8e65dad11779ec79a69dbfd3e8b61f7ba6db7ebcb9036924405dbe02d425459bab9962a2a58673272ef332c7b93335df49ea1d7ec7b2b237a96a3a2aa7c01eefbcf3ab4944ee97b65c5be63687507388a8f534873057eec19d1a4585bafdd8c7141e1ea94d607902ecdc04dc7b6f4ee04108e104608c31c6382710a7699aa6690253cebb257255b82aba74612c8ca58c32b8e0627ff6a75d6281c9390199f36e516dd93d182719aaa576571e5d77769479ea83c53412981e5f01f8f709b41c29534cfbd8a5dba7788e4bb72deddb77f6eda56e93db978ab12e8c6e3b91efb09df7e48e6b774b447344eb06a7c05e57e785de57e7856e877387dbdd8a316489688874a9db1cc2d46da16e0b532e02b6515e89d90561d7cdd803cb7c0f2ce63543a7a89015e11dbb297b68d1438b1e5acc7564f0630f2c5cac3db23ce79c63ea538ff3e21ccfab3dee3db4c066a2f07e30ac07961e584c588f2c3db2f4d0a287163db060ef8105d6630b6c340a392fd4a74f580f2d7a68d1438b1e5abc1f1f94d1560f2c3db0e891a507961e58f4d8a247961e59bc78a9bc5096f3f25ed11ee7659a2493f83db4e8a1450f2d7a6851c69359dadd797167f42ec5e4d558aaaba27808587d400fc8ddc82aaec65d4a0c888580f1c8c3aeb2ca25abb08d75aa0ab6a9acb0c23657482c6c7351540f2c6426df038ba43db4e881454a913f4c02fa611b299604b2782b2881184b65a587163db250145fc1a6b7ae0fe84708d8023d2ad4dd1f156c63c5abe259e9a1458f2da80754651559455201f4ace8a105457b60217b60a90fa887165eba3e2955e7a5f7eba597d61ee7a5a7fa807a6821b3c060b2d2a1acc64acd15b1c64a7ccd15b1068b186bb0f4f45a8325c6f8de944929b01eb7a5e56b8fdb122bcc8de699561fc7af3dd72d5a83f032ca9aab09d11a4419af43b7dc96ae18ed715b446e8bdbd221abba2dcdd558bfb2e668ada8cfeb2988323abe46083542a811c24c8d101688b312854bd58345b0ac76b556c4f4cabbad2d91c553b65ffabdf7674db6dd763ccd90767706b4fbcb781aa521b280765f000d11e7be7c59340461c14ac3f3b546c805e21e71547ea43b89f061fcfed1e77669b046b09a0facbabbc7781b1dcf5abe482caca0d5b4aea21b1c2d7c6835f1cf07988d6ebd64d70666034b8b1cdc04df4d7cfb0cc56582c24d9d3629311cd2ad8249fbb88a2d6d4bfba2cbba699a2607e144719ccb6c208410c6e9d09a1eefb2e97172f4d1f8c021b91b29e50c47816d6b5b6011980618c77855b9a65c54faeae2a2b2822f82f60ba0b6441cd45b036cbbee15ddfeeeb2f7e461971ea3a2ac68aab2a2aa28154dc948ad8ee4a65e55218aa2264951547c3b8f5062b88bd4f529a3c2a01e955d52fe0a5eba055d818c26a25bd015b2f4fc4e9d8b0b26555d3ce1f37ad80a93aa2b985459d674986d97a98290a960d861d67335b56130a9b202e339847bb930e9b92b9854dd59615255dd72170ece01e6b8b894d84cf5560593aa3b2ed555d1d55d752706db5cafeebab08df5aaaa7806d83ac136d4ab27713748b89aea559515dd23e16e384b95e991aba2f7585665b60aee2d5dd78a7e2f74656fa2b854ef458a12c302a91e3cc5a52ba0a6c2a8e07b54465d198e8b13c37509c456e1b8f4bec36cade876678529cf00db7e308b7941e4dcb117ef2e488971eddf053f1d5f7172efbd6744dee2cb4179f8deebd0aba4c4302931cc1deaf2ce515cd8265e668dfacbae0dc3516234258635621feb6489282e1ddf344dd6cde87b5dfbe2ddeeaf43e7dca930d688f748e1f54a7169f8288fe8fd8a81a922ad4bbdc75c13e6125db002dae5e9ba9c3bf1542b830a6381bc5f59363fca42af32f8189f8c91bac3d748d122f0490e5a2e6d0cf9adbe6fd35aa0fde5aeeb8aafaecc61692d529ae9efd00535c736461ba3f65cce1d779e8b566e8c0884a5f9a1ec71cdf5492d5a5f3f175f1d421d4865d7147b72ce3dba53625820ef55d90bc6ec400c30b2f43bc7a0362d4738f964d698f43807a47ec7d1be56d8a6fdbd5b71ea342a0426b7d905ed24777371cdfb7baf41fae5e8f74a44bf77fec16ad3d2affd080820c136929297f044747b10b669419aab21756b996cd7aac0dadfb3bc77852eb0e88283a88045b7a02964e92a9b83bca8e2b5466a4c7a59a99bbb8122be513804a455626cd33026ede6b8d91e7c257e018675f3420ba0ae2dc801b51ffbc72e09d615acb4eb17a492dbbdad22b043dd3d4e2214454d4a7dbef56cfb1cf7dbbfac96e22f7a49d7d65ed47ecaead5d3663b958c406b8b72eeee156dd7141c673576db5e683a8e9bb2edd84ad5c23044d39666e79ae8d01282b9b7d69c7b7badad6c97d8997441000926e13860bae2a421c22679d134490cbe67a61d840e3a37412cae86a57c5347fe4988e539e9a4c85d1291b44939397ac93f7799a4ba9c73f0b9ea53567b66a8a933412c19609be957b05b4230111799910c9d55980447ef0ded079f2fca980c26cd81cdf082657c063b2964cc2a930a91286e612a714b33367a555e156c9299911306938a48346110bd88a22c0631890fb1bc2a8f8a57c5abc23613062e0f58e5375426a3f9100b1659f80dad080e830b93c490bc852f9d73226c34c244f462d27b2bb188ab68787711ac201699432cee8634125d7e270dea4447e63aef96cc93c9a807e9165998c40db10002ab2dc8b99b98a057ac49ee26864298895639a2186dae46d28ab588147a5566ba422c0ea86a5c9a4f61590106b1345f5ed8d946dec92ab90ac360da1282368a607981e56afcdefe5a26047350d49ee51f0bbef1a8b14b33cc9a65b529032799ac965ae6560cbccb60cc24a77749f7298b89794c26c316bcdec40e67939dd6f23bad6364448fd92d30993b194a026e11f5e1e671148af66947ab7bcf4c43764e8babe1439d67bd07454f0bbc0cad32865e4c8a8131f0dc31b76262b22b54e90d43b7202f9a60062bd2e0a5b36e5fa4610c0d8732e2c534c0ea9b2d21d804695cd143b8d92686b61eb41fa5eb75af602b7c0593f83432c6e26af82ee32c2ebba830a9ca3c84147669fed3e26e689c2517ee3a72bdbb6b9a26110ab950280693f8613089ffb4382e5c172e886d68e05bd792e362740747325eb0ca3de8d63072f41ec864f5b54c4c0c0ccc54a346167391a85403e62eab1750c3e8c0d0f76ec5381ac7614b08261fa59135aeb9265a27997658bb2adbc5c940987c8f960706db60e7bf2d6c03cf6799c9cc30a97da26dae6c476bcc452fab3efd1e93d5fde9985fed46a3d12d984cca4c9f64a64319d373358ce82eab6f943d30de16117d21c745f36756afbeb22ac3b73299d6c25360fcfab4b43c1fab32d3f492ce141c3749481f3cccaa8cfb3482c49bbb2a10bbc4b81a34b882141fd80cdb5ca10e9f035a5bc874bc2503a74e3b6c2d5a3152ce2eab9a3ed12bd4ab4b1daeae50714e6fdb1aeb50f13c87c44fd6ca8d514e22fbb8f19cc54f2d425aaf6ef1326edcb8dff3d489b2cad81a4718654bcf4929d498d8e14fc37395263bdcf2f21f5d66cc40587d3f5de7df8f14b6191dfe01fd4d39e50f94a3cf49494ac9d1a92ac6fbf08c1935c2e4c4a4ac1ea93482bd1ac58fa46c7c23a3fcbce68e485e532e2a5347466beacc2aa3606e3d84cdab4abc0c3d7255e3080d5ab9e76bd0ca8d8566d5668de370151bdbd078e88f6f641e0acdd06bd0221ba234a1531fc1c048792947f2918ee4e89a3b352e294f8dac6e4f1898996aa39a3bf33cb1c6a93943c13ce6576663d6a062176dc90c62d83b545154c2c01ccb2e201ad975992ce65336bae8aaa494957b9714fbf52a1a4d7ae4ba84c9a0e3d0a565d10803d472df0ff6778cce870e73ac48481e06cb68605e7d54dd4f43f90a9b4658e8a2d7d7a35373073b4f8856ec38aad7f7d3f031d9e39ad0afac3129446b0f668d46bf469fa6ce0826360c866197184cd65a5ec7e1ea5636752c9ed02b6af499559f5afae9d03129613e1a653b23222398d1885258764c943dd133bba62c90ea9a525d54aae9524af8c3a590abc102d6c25ad8e6cabc3b8371052b98d1ed8c6e57f0c24bdf8807ea21ba7dd1654b5bf2bd5f4f32e9baaecbcb82f4cabc75a943c95c9930f392576cea96ccb5536726278b779e43de21465d467951577c0f6612d99df877eaba4e553904b6e5ae788ab64924b6fb7bb5d46feac4cfa9f3aebfec62d225fb7aefe2dcaf67ed6416603e5dadf75c4d413941eb316929ac255f90a2e8a3d5aba8fb704bec5405318aca1ef5e07bef617f46e431d70552b4627c51a79e196dbd99c65c17aeb160e87b0fcd22d5dc11c5cff837abb04d3cbca64e143d66d5d4647c7042e623215ab95fcb5965f436b1e3f00856d7a543af323d5d3dfdf18debe26aac4f6f544e45de23ad0b398babb16e8d6c3cf497cde955fca39548fc3b12e13bc4717556d445d9dcb9f14779deb15f372899e7c5d558381ea2156b6e44adf78ae6863577e279201dbd8a34957598ac7971376f6c8383560cdea0f575f5d0f3d2567c1f5531a8ad97c19e624f524af97ac2a8888675ce62dd7ab33e43abb46e8356ccbacc269505125f65ef38ae4606f3988ca2915599b62e935519eb96bb224559a228a594925297225a044a2ba3c27d5a5ebaba2ed7f542d771f8650d5637f390ca8f0e4387454634242d4a137a3c454557d7c5757137ad8beb12add1635e994a5316c533a297154361b236ba1b8da845eb93123589320623d4218aa20e217465b81a4b08566d09a3dd9b960504565d977e652d14f549cd2afdcca0eee6c036547565b4a328993932d826838f775ddc186cf31ebc1f7ca66bca15b6ca4e59a0a5c27cf8a208603412156845b8b7e6455f15c89060d2e6b45b4c05eb6112ace26a588649716e3feab13acc64065b5259c5dd584eb81b8b36ae712fa3f9164b81c1276112df7d092631d1c3365556af9e24ee0689e95607d8863aff8b3078b9980a56db96e6e91d7073887c875f2027afabbc3bcca2bca432cd3a40fbc324fe14ccbd02dc01693947adc4ab2d37052e7eba057901d43dba7de10634b4649b2b63f811431ada9ade655956bbac5bd525049b0e279c88c4e65bd7251b6657e0771a81d4adec8a7c4545b972b278b7e6906704f62bf21e6fc18c3f3153d88fd210e1e6431141a95bb749249e69e5c7e3304fa4ef2f838fb06143076360b525b0760531b20455814aef1987931d26c25f2a5f2bc235840d1bdb38e122eecb9735c2c966dc6d1669fb5a11ce6d1a44b2ba45ebca27dfab8a5ad4a23cd5e12595523e298b54bb16dffabe657acd22554b6bee4ce7b62bbf5cc1ecddb22aba5578a7ac11d7d9871d15d1ca7c133aa45711492b9aebef9694f2cb7ba6d6d6a5d2d6a7cc9a3b22f84af4a468479e87a5940f4e1dabaaaaaaaa2e48f7158c0f65f35466ed569fbea7aa09ca4b492d1ef9ebd77e92d7e1adef944ac5993dae89b4529773a73acf3c727555d1fac4b2acc7a963495955b0ab6afa5e10b6ccaa4fcbdeebd665653b1611ebe2f32d9a51b4be9eab27ba53160884f01146d85e69a370c9722219ec1b0fab66a2ac6e8bde79ea5c71d8e1f0a3862afa82ef02d4568f6e5d976561d7e2b8b9d7b19d7ebd3647e77e9f179cd89c934eefbdf6cc4c23a2996df60416bab063134248ab88ce6a16a91ace5373c76adb7abecd79ae824d9d09b326b3eb33eee6881aa28fa6683215701e870fadf94974aed2b0ca7455fd7155d1d1be7a55654fb89b2034e437639aead7b11fe16e92b81abe8dcfd0993f3abfb41299dff985674871ec47551abb95517307becb79e4ea39676c5cd506954d73079e6744eb46383f2fe9b441270aa90b66ea6054088c83dada0c56d9b608b6a8ca5abf8bee83b89b991ab44a1a415a86c6d08ab548520f65d82d29baf5b52eb266dc0dcc8f70373034891647b58c2e8a17c637ee7b6af1cc8ffefd48f48be6ba3cf624eee60957c3c7acd6a54bf35e8e5e7b66ea6bec71ee8cce23a275e13c72f5e84fb89bc735a2f34f8bf854161ad15a6118f698a9835dd9c6beaa095af48a8216cd0c8abe47608b0ebb4d22565b97f254564bdda343a0d4a357c7ceb348758c4875ecd5318a1da37562d90e861d1e1b618787c7a864d25a6f7367fe12c92beb99698b320c1688bc257f86c11ad15a2e57696b2f2a6bedc96b63942d856838c19281ef5d3a1761ed99c9de8330fe65ce7ad783567c9fa0730fde65ef3dc237e39260f125dbbc478549eed5a5d2357b66c0bb8cffb2e8de974a6f178dc316cc166881b8c777cedc14ee826559ed9c31678ea70edf6ab3b55a5aa6a22bd76db65ab3acbd781261182c10e6b72cd2b47395e6a0c6e19771cc5ad3297115669b16d7c5a015000bca42101ae6d0eff6051ac04043171da4db176868415b8fbae41f56b7e511abe594525e87d8454456d1dd17688dc07e5dd3e5e72b8cd6edf9f7378b543de94e5920ef6eeeccc75bd7454d9d0bbba88c88a5c0e02b767ddea276e5e3eb57a579a9f49bb240f838dc16e8bd2f15b6d977d13b658d68bd9f3abbf4b114d852615269ba7652e936f7f10a666666e6f7debba8c43775de9f73671758cd0706abb53e65d5a7a7cbab619599791c23f579cbca76ac5fdf49c49ad6af5f54567472a59eb29eab23858f12c31ad1ba97e2d2d65e6bad0b82d5da12f5b431ba963ade4d6f59840e663102ade5a729dbe14fdf59844f8427e8de321c1777bf788315fda8f47b0eb6797f4fa6df9f0bab14a8f4cab415baa206a15368466446180414731400303020148bc52312a9ae0b3f14800dadbc565c1da9590ec328858c31c61844400000000400826900006a96d4a356aab466cacec1cb426b475eb5eaa6dc58e937597b340aea279ed2777329c41239940260d08077d6ca4246f4d2b3649b3cf07d03237a7f62a5735e873c626a79661b098935da8a18f062a7c13a651a7d3d1df5a854970452cd750c826481e8d1ca46f407e7f213b71904abc51bcab47864b40ca3e909b3e535e819fec3940f5c55c8bc930f669fb843097545bc3d9da8501417a2603d1aa05c42d99926dc0460ab5b6a3d8de5c1abe52fe44c465aa89687ab38c9d7d6e962254ec3ed3b539e482475285296c1a49a3a7a7af9329d8e860d0c917f519b6c1a09bf1e5ad8bb3816db6e635d35cd286f49a6bfaf936710f4cbff0f98e6322f4dc2bf8195099ca8f634b181e4c19b49b22bf39f61bc8e05b0ce29a30d01f648ac0e68148c02bfa7180ed9084d40fd50406b2259ee4636ae8149ebb98cc4e2e0463756231b397644739468dc466874e3dd483734e758af724d1b62b15182c5db8dbbbe7bf9575a91f3f4d4a84a4165d89163bac8e101a5f471899c29147b39ab1a0721e3e475b92be2109a5497370bb4bb76a6fb093595eb9222a3b70b470a9b35affe7db0a36beec020363f71d14a467dae684d76c586add5b16d3642d4463d5389f15b1aaa6d31c2f724d20e6bb398575c16f4cc3499568d9f21b8d9b27fe173d4b0770568404fbba83ae79ef476e0575f495d9cef3c534f4aa6c37c8dd9c02f1c1da906920cffe88e053da93e4e69526ff9d2e749984774ba6e06764abb5b200f9c47f45b9ad18d8eeb49f11887776f7b86fd41eb95ac5f708b15119d0966a96acc4b481dbb1986732ac170e1abd403842d7159e2892dd4eee1b2b44661e5c038d7de484073e810c38171eae14d00f491d5018becba07b09f4ae2b3f48a6c7a3c02b7a207d1474c8a6138d551f8e4a0ceb864e43be8f93a6f6e1a8493ce25eee5a6e15de9742b4138ee6f6d6628a54c5cca4dfdfed4de72e85a7213402ca78d61956cc4ac10b39588bd41b45f2844a1e6fd353b2cd2bd7e288bc51f9d387c6c2370174bc3cc10c977d1a7245eff5fb52393bb0a5142729b4e4f86e11b9ffb4b405cf22c18e48c96abfc570ed0df252521a0090ab0e1314fc782317588b02593b55387ed57079393e5bf785d2e5fd343ee5212b2a7be5bee325a79b9b48eb1afaa453c18c882e79638a64803e41285142950b9c0a1234d651f99746990a2c0faf0f19f0e893312a5507239844de9b758e4b0217cfb6c0cc393ecb33544b3c95f7231197e8e5d7ade8c9aa690fbbad7a6584866148bdb795c8a98cfad7815146de5834c42762a232d967879d7e63f2aac90803e21277a7163d8564fc44541f96e618c3e8f697b20df8c7757da181c3839c3b9423f59bf85a565a8c371e1dac3f72dd01de6780f8429aab12b33641fa87b71c44d5214ec78cb928ca206441475c01b1b5c9ff5e6186ef8a86d4c6a839174c9bd4054a9a187315578d92215baf907ea2dddfbb4f3ac7a207a79f86d635ffe414737cd973f6e99c65611f351117222ff8c31f9ea11fee1ff47b9fc3d617c17b218fc43b640bf152dbf5690635972f25c77be8fef387c924a924d23b4bc01a9ff3efcad0fb8e9a810137c3de9dc629f8023d65151419434c3749d584565e31d5dfba751d324046e1dc0821273dce9359d66263d6167feaed7062055dfc119dcde54a6ed9ccb045e3598bbb7bc7e36eae223907e255706132cab50341ca491d68655ecc163e0ba5d28301153f1de7e79310c159db1c555ab8f9c93e192a8c0dde506a6c508be18c6a281f684fdd382b90a862f9d71ac8f52e711555accadb0c55d7ee893e336a36fb4ad43c5b1e62c367b900bd9e5cda23e8ebc68855a9ec8aba94bc856e813460d86bd204c2f232170bf7021c859fd4bc6519b8b6a2181f90a88ae822a05931cf121204ce44c4868567c3e70dadcf7e4a06733c59824cf6beb2be3ebfb7298e9eb9a0303adf4bfe819e19cc96bc307ad21346aec1d80b406672a2c77edbbaaadbfc8103d579d519c43d582cd88ea50eb4ea329a2737a2d8e1961c451937420e1b0e7c2c2c7c1a0b85b66f0de19707c4464c93c04848700f8d41ad0c7716926f861e0d3fbac439fe17d75f4b9e462c1970d3bdc2f4233f19d618acfdd53f8ed340f8ef990f81019d7d027275ce1c0b465cfcfb89079e5becf0ad505c3db3e8d88228e723a0618204f8b491f83aea88d1ef1e6960d52da7210ae790cbe4b1727ebcef05013a4e929ddcea12e6da310c60e70c12bf333144e24ea7183798700eedd406c3e2f7ee9534d4e9879944ed19e96610b8ba55891e02f2eb2eec505b79ccbc82ddcc42e4e1f71e2bd65ac81c0ba898ea894c600f1b2efc758304adf39792163dfff2d0f619049d74fa906eda592c80beedf6f0661ffe1a33da6ef3ad2ca71351915e89a06c86c2a9317e769011fedd6e39c514bd4a8a79618ed08085fb007764d73819bef6ed0267b28b1b92d416a9652561a30d55c9798328b555298a198ce9a87db9a0af1190470193bd096b9afdec73f7f30c705e3927893641599012dd3e0e26bd7d6c8875d63c011d9fccc5a69f155ba67a44f90b22ed3b9055249add0191027744e90abd9f8e9c64cc0b2bdcf0b413f75f5854c900886a45e092f5c94faa038e9b6e846dccfb3128a99137194716f3169694f0805cc6188ec9dff3ac6fe082ba65cc13f4da2ca0e2496a528c724d40c639ab754ad661ec93c10bc2569eae122f9fc4ced75c488bba34fcef8155e62b36d255c928e9c1a87f14fce1d4d022a6b85fec1e760494e481de6626c481418b2e3de957373863731ff271b0cfb16632222f45db9cbfe246f25b9a0d122f4e73660324fab39eedc7e620079f50125624514250ab7780c418f4111258a1f10124101a91681cd1a15fd636f1e6cb21e156a20c6e76080427d5f9582381887bb257330d34feefa5e321d44c0a785cb9ed3680a55df47dc93c4a4d3cfe2347c7add0609cc403ea57aed5a1c53290ec974018609b46d911f2205b2cbf013097926af9a7b70c412aec29dc235f5dec4caa7ed932a5694ed57906219e3da136f7b500eaab7463bc9487b94cd1bcec9c9c8f480425c3c6136b41641477ef32ca48cb98eaffdcd05e2c567a1dd60e200b363460a0bd358c8f226180715e75dd22a8d616897c0630b94a113cbdf3c20e3d92efefad6775d88db819d730b46f5f40662e62a866480abdfc4aa2a3e5086659fe4c8bed818fdde8cc383e67833dd6250988e69b6aa2a8fc1044389fc469b62760aacc98a5b1934d93fac8e56d901377cb12100f9fd440cf7581dc36caf948f9c1cc4a175eb5b3ff55167bc4214ccedfa662be19e2530845bb4a207ca945c91d45bcfb054df0ccf9d58fb1de25e4deac231cc7a85964252ef1fa7c6605f0ed922f6eab610045b8d3ca63b6360e2ca15f960891bc949734a515d013b00c92ec6babfd51bf917196868cbe8ea5b70e5d2ce6e0d36b5b0178cea1b1186de775f6187448ed9431416ab04831c1112ae956cbc400654c1d7d4e01e653bf6330daa4f37e35380076d33a85cfb80ace410f09ebf7450d3404f27c0e203f08e2609590c45457223433529e2cd4840dd0e85e4980c68bc3fb840b7db10c087e25dcd8d4f871a5f9af585b2c01b54c73073c3e166a84c3ad0ea9ead2d49687642ba67432f565278e8aebdd03ae51eb8f97420499e58bdc41119035c548eb2450908451b7cf1949282f4b5b258c0edc6b88fef8ae6cdaa037ee0d82c7508d05a5ed4707105d46650bc7921cdc2e0c53387ef1017d1bfc60218c0f4a0a2eb4633eb75c77f1564cde2067ee2e81547c8710ac886fc0a9f795f9c5bc56c190d4ee744cdf8657bca4a06718238e024f283ee79530cb59c2eefcd133adbc7c328cee5b7f73f7a94579b514a49118b23afc389412ed5573c0734d2bc48052ad921c97890610f92eedc3370f9d380a9131c94ff8502dd2b3d330a2b9d1210665840fa798289706cb70757accb65a0174f3f23d4567501da3a36e6eaec947106c5643ba0cf0e366ef4dd8e36aca8aaaa829dd7e16a72f5854a1851cc96fae84d99f38e8d837112265d08b586ba26db6f77b946a43aa10bdacc356307da248d1b665f7a402fe1d9cd6cd491938a694903b50f072ae47e5aabca5cef1afe76412e8755bed6cbc6dd653ca0bfbfbbe0ba6f1acaa58f815d0cc6fc62c912ce947a2b30fcb4afa9e9bedf71bd528b3af994261a9a48e1f30a42fe6ef960059cda9f0f7a293cf74cd1f48d58c940ecd7cb6dc20079e89baa09eaf49757323dc53cadc3d83dfa4b32ae4530deb6a357680f103cad0e141762c598c199bdbc299ca4eb0fcccab7aadab24e0a5d140d8d2c999b588680c775c3725a78c92cb4526b049ca81c563170b4a6e550ff6d106d66218127a8d65020b92368dce149171228fa751ccd79cb7065003c946a43a855d86fa14630dc6e86fa8151b2a935b605ff13655677c67cd8296ad6bf9d1e2c3790de741661c20d1139eff03a12af221cce7fcb2f1b9abe32b0a4b2a7693ab17c14808e87cf01e172999e4ef748cfa978cd493822ff5630aca26ba86ca0ed3b142b550b14b13f6e0c409af535b7fac12f9cf1057c599d0e635d9e045c0938b0ad97dc02a97d5d9bdb729cb6620edb4b1807bee8ca1a5bb7fc7c99322a1ac3ca337a27bbbbc441ebe9a394992038045023e8c8d58fdbaf24f6124f593aa5fbb6e418a87b61210a83dddf6cfbcb97da2a43823a67112c9e03c55795081e9bbaaa57feb485565be5bc94faf8f17818564b8f1325bd59b12756d66e24670506c84d77ade6165287794dfc9b429641c48df296c6bf2e5c16fb2dd96be62fee4ff3b299f12917a3eff888d01a7000b6be6e9eb5f1c2f593a091270ed0dcfea3f77752322f367acfd53ed12620447cb3eb504f6c4db86de008053f582b1901e7e2fcc27ec42291b67988e1eaccd2fc60bd389e84d9097741c1f67f73d64fdf1ac48a34e944a94203eaaf25686eddc95cfdfb1d5962b0ae4554178d3d68674579a4e9cd24c8e9edfdba3ef092b194b198b26978be3f09418b630d2f188f7c31b4e1b1bae3716f9097f85d24d0a1204613e879f659390358139f5bcaa0d9f2b71b96329a80a88cbeb853795368a98f1b9aee7369aa05442c2adab2388cbe7439d16e109fc208ecd89e7346275fd2711e1142821c601f30ee7dcf739015a7965bfe3a323d9de5b20add848fa8a441a614df50e7a7606e6b8375f0cdb4419a54e1584d929fa47531991d26ed31827ad4a23f5125af445d47fd202ef3d46060dbe22e4f4514562831ef58057f4819d9ab19639d4e727a0acac1432a60bc579aad293cc744080fcc15ad2e1883d453932ad1482f17968095fa4107e39b82b4b0393fc226fc2eeaffcb993a01097e9889949020a8e4588f029c2e660ccd521089dbb496b27e4b398aed838809a6b26351ce1928acf6b084b3a1613cdb8bb715b64a6e89f326fa856203bacc24641291092c12465cf41b243b3a0f7146278cb01f882f002f88f2003ff4c81e921c3ba498ee987043f35b6b1fefaeb14a2a7160bae6522aa9559197dd07e4d780ddda85101abc1f2303ab6c6425f1a0173bef388bfd851971bb43da7db51e16c1e008d1dfcc46fed97e42e1b39380d81b742a16f3e02d296839203cb53030675235eabb6a1a8e0ffd9f6eb3e181218ca842fe4852cd9817eb0e31415c0152bc8c5d2417ee50987c7fa1ec98a294a851e728d9b14728bb421cb35e83a55f6684ca381f249b15a21288061e3be4d1684546dcaa8216117f456fee71d5f013e2bdd1a29c004300c5108b45476eca70566e0f50d44ae4c3e92388cd1b81b5cbfb6fa99b0451704eddbcb98266ae20b8f0af16b8fb7a480fa6f51667aa5932b94c50dac511985c02b8c05fa0719835c9811e56427f3c82aac14d868c4f1edfb681738a10ee9aa205e3dc8999827639b991c7941ff9542d2321192febfd94482a4a98f318f8cb3f3ecfab542c8db791b87809a42d0ad4e17a899e7920ccfd378874d3a6d2595d972a9a6653df383a223f7939c49d297313a3a3554c9de8771af7bd86781b4307a3cf9d5810b84fcf048513c3279c11b0e8efde5f23d5773df1a0ed8b6a6ef8426de9e034a528aeb366a984a8e19e6408c3e84324aaf97a50559bee056511ef597bd3d2966c31e6ea5e3f367909675fc68221fa7ecebf41ece1641c8ab93c6526884218333869231b04bfdf6eb670eacd596c4f889448cd0cbbe9a37b8e88810b92c1fbaf14b4311f2d6e7ef622646800d077a41090263504f6029952198aaaf074c6815258830e15ebd783340c4b36bd0b64092ff0dc6ac592a5e59a8e98bdc87d0a07c709ca17906a208e246192b403da7f44bb2b2f366225baa9d86f62fbd7167785add5ea88fc53e27895725e5b97e52204abc2eb060c0f329d3c96a93aa870d04b3576078cfa06ca35b2c82da3459aa16ecb90d2017743e21780774ff3d3c20ba8cbd2f97cad7378b9902b07c1765114bbe7dd2bdcc9b9614624ee9052d02454fb0c1a3aea581967a1ecb3600cc819ebecfe6225e4ef3e3387ce9ad703450ee8b8fac04c9cf285e9c63a01b53b66c7e869151ac725921d304f3ea3b8a363b4f07859e9d526f58b7171f961f83ca5e4aa704ba99e425a345a1e0cbca0201cc48b1168c5f528c6db3ab2b67f87d3636b0653dd8e81d37cb926f415809d015b1b848901bfac452e3d906cee89083a5f24215e24d2f035e26f7b8b2ca19a9b45b31cce44ab0a653d7e4064d27b2c757f9480af32ee57c163620cf7de052a786649d518a6aa25f614014649c8529b68e8332acf40d69c907c660f5ca7e92fdf6ee24387f3c0a55f28e7fc09c060e7cc3e7ef74f71c64b9c6bcd1337f3f447c4cdf9e69bca2ef8bc317580e1cf2397231d6e3defda3dd0e529303a5c5c9171681d605d5f240f905861057e78ad8e14afa803c8b1a04259a08aab9503b391f8b355147573e72387905222368f9787c3eaed217802ae4a781c58c94344be762ac7ac395b78f0880344538c9a48c3a0445e22749b8b6e45be4ee4535559764b65ec9e53eb4958b544fd476b42bf6ecd8335f775699c56e4fcaf19dc3da01af06731748e8bca53454e763c3a2226fe692a328d6c90698e8b4a27223ddc39453617636fbb2407529c2e90b891ade3b7ded7a3fd018fe9eb71eb6b5ae33f2e9473a14f66e001f4eba217e67b12e5ded58f05c02d968598a4e941100fac923dcf7b53f35ae18804a33ad5904cd8bb048d012df8f85f34572b23f84774bdc0a167a615e1c23a52604ef6e194ced065ab9f4585c4e9ec1f37401c00101089a94222ab56739304e8bd6062a9e73f9959072b021d5c5ae37f385b0525e7e4c47d805a69289113381b17132ee1ad3df684af2d913ec97a60bfd1edf341061ac54bf72367cfcb5e79554cea307fff7ef806dae9ffc6c2cd822083ba900b1284751875234dd5417468e3cd382e61785f82a5546083ab14db83d93a2ac8c5b916eb18498712cfd679b36723661a55aa83dee7cd0f75921e7841018ea0dcbceb70339098d7fe6116c7f5d3176f8bb3f075e55031d1803cd2a23ece609d7df1a82517247d4f2eaf981114a22ddc0f2e75af036447a46513465de8253cc8adc2a5dacb55f956830f7684d5c72a396e0ed30497a7c5e2c092b44731c2464a4f2bb1b24fff1d4031738896c635236024f5dca41f5aa1728c1298c1eb5572d3f2021fa2116d6450cc8787515311fa6638b78bd81c73312d82102e8a45ab915c0f0b03ea8f44dc7fc5f582b32430b21263171d39e62dd79b678d8b18223b26b462b45dc697d60617940b4fb7109cdd4ca16467a76dcec7e3fba9b2511e0fed65a80a14f43f51dd3529a078d12d0ecfd6b8011b740f9f594a36dca324567c624f69e1894d459917ee919cc2065511935dc86e7af9778ee23addbf17be6ec91e51d653786502264ba9b2dd171e529bdbea9e4313947575deb9b8479fa115790bf47e3e5d5b5621efbdf1714f90fd4196d2496545c985ee8dcc73dd6058a2a78f14bb17f32fcf0318cb7c4f8185707fd611d176b279b67900c0e823501ee22e22fd148090e6c5b4a85c69d1df9f16883e17eafc686adef52b4d034ef05ba64075f121a85ba65bccd0e486a961830a2ac1ec482d0467fa46494c3efc84ca825836fbd9d650ab4c0dd981fd04c8ee96275f40f40a07a919e754041ad77701e8894c900cbd58a3289356f4b9002694b7ded3df3f7266869a76a75d3102c438813ff48a447110b5140c7836a3e999196d30334c25b3d9b7e683dd50f566461e03fc8775c34f48c34efabc49643cb570e9745e684878429b4142e5d527ea2d9f07c8bca02c2e23d0ad48b24ff4f568274fa72a0ec74b7ed951a0391f5c7b09f5bdf48a08551ffc84d454361a9a318a36774d9b8a5eba5fa53aec052140552a571452fa872713ea45634ad2585b959c1009a54fa361b14048f2d4c9eab754776a233f061aa99ce7078bca63b6a847279f5b0502aae02d86957d59cd1b72040119a2676e1136d5dde981aff904082b99806e174c7af50e365b94ca52c6601e088e1d5223a91e58ff93835482c04b961c440d7ea1cd57891487852164c60781b106a4f85488bf03636a29a9f50db895d0b5056fa54d2251c533621274ff155bb0114cc4788caa8facc5d5df1be3d294a9a24ba18899219d1a2caea30dfb7ce666ce1506f37ec287bd78933afd72a137527e393af9a4202745500486b31510677805540b0d5429ccacf964ca303ea784cae802cec243a3b0cca4981fd4420a1746ab5954d4cfb42f85c2627cb9218b2738ab5455155c7814e8b77539d7cef5cc5f2f8430437502316cf0d1622acef66faeed50c441f7464456756437a224f4a41b30d9fbd210e8aef8d89a00e2844ffc90b7bf0b53dbf56f9fcd35ca8453a61b574f96c11c728ff4ed868fbeba451395aafe44db9b6d821c97e1ccc4e3c94b81fa2e270817155859c44669f11e9845f820c2bd3ca11d0288e65b30318114a5ebaa2376c3669b67831468cc4738db4bae79380cc8ddb492e38cc4c112d7eb8bb22ca4e7cbbda074df55e10939f50eee9414c27bd4c1edc2c06dd86e23e440b8d2859e20c5a97b4fec4e8201a3b5ac826e3e6be86f54281a24028593c60bfaa5c237b74e9a2d2357f142aa12880aa5a732b77330921133a30af2664444c10d80e19d58e8780ce6ecc7609f7e24f02716c699651887c2b63d6e3af23d5b8a85b40bdb522e3084e56797044f78620ab744bb000304c3743d84376dce45b84dd9542cae5856ad206695b1a3354a9c2541b20afd985f85fca7afd3d6a12a76afd2c447a594b17fccbb0c4cf729b3c5d8b1c86823e54e2bffd932a0599274254ec8c33efeabaaba1db0a183e0cd3bee2ca8f7208c8361b9ec27466f660f27325296075eb43ec92a9f9dfb982b5da70b57ac8d44ea834b48447d389bf19f27b4177c956052cecd8f345be61f9c3e928bef6a66cc56a8f83dcd022206ffcb84dc7fcfa91afcc04590e5c1659cb7ee43c176b0cf237377ea5d9ebbc653fa2950e7a0a8cd6148e76008a1a2377f3e81d9e6b987e8781c4f8462855d4a5fb99a1ebc0c8d292b651664afa647c95f889c02fe91e5834b9e4feb6609db901c558b27ced20876d1eef3c9ec8fa87c424599c6b112329986025734d50ca45f2e82cb386f89cef1c10622b53465016a563b10f0a0de7d2d27e97b5a9628a1f0206b7536003a44cda11c0cf297295507482eb6cdae321b63de3e77313f95c565deb24ab979f8684d7aafa007d7b33e4e5a3c723e2e47f1509ad0959fb50a8c861d472ca12c54cdea9c82db71d9c24662bad7f2c5c75c2216abe87a91d275b1e38e6679797761d652fdfe8f3320f601a93c926303878c5712cf6cf57c918d2b45088c2a872d3e4cdb3b1999257f8de84fec269d798b3f72171eb71c25a170484174533ffb360a3149a8bf1a19c30a094a410e542bd3d415aa974641d2d3afc17a48a56f1538f30822d72e818cf44bbae67440660bc7df73466e75d4753b8cbc9182269185989730556d0021c7e1701e90791ad46bbec5f7af1c70654d4a5d405c1d4f8186cd2932fac3d3b4cdc098059dfe79a0ca054122b60a26bdae38a254185bfceac535553433d03bf66e23b84964a9634da6f7bfd445de5d086f72698b1778e3a0fa1c75c91188236592237ac487690bd9ae41e9908af0f1f9e54c82c2437be65e2ec7273c875a5e43bae25e7c493243cc8d28854ca59c268c653e2168cc5f0b8757a532e85949c879dd8ef4983e58562a2d725ac19780b57c37789cad3e547d9cbb8e1e87d69878f25dc204a42631f82dabc31bb17a6866220060603ea3f5f6a0dd3ec6a23f2e581cc8d41178f6bc55b9a99d29c64da0e3331723853ebd554222c047b316849f3aae63d2084ceb2c27483731c8ddbb07a0b2be199e22cd666a8d47c5040ab907b3848cd0ec46330f03b33d85f481c228e2594f0232fd38a1e27f04053746e4cf52effffbe0d0c55edc4bbfa9691b61ebd8b97bdcad4ddd9089445c701fffd138f85d0bf4fe00019a6b008f5125109942de194aabc65b8fecd0b7000773ff9080dd6b87af6e72499760e6c888e3de4d172bd4b576df66bd48213332c40927b5e132609008357c97bfb54cc2ac904fab0ea3cd78bb1f942b14c30f7a83440fc4377ab87d69fb3ee5d6fa0dd10500bbf58db307bdf68857c4016a3833e7fa9cd8ad8bbab3ef065880d8860ce1f1f2021ce28d74e1a1e65df17a386f41e9eb8edef17be9512225e5ea4e140162b044b58b0e585c2d40df5e1c5646b07693cde2911e35166bbe74ac6d59c61b8d3ef3c904cc57ca130a88c75a55f6b80eaa511dded0aaf3827896556707d43deb1f0845816b8b459ec48a1b531f75a1c40e2a1e764f32e1257a5edf8ad5bdcfe092445a32b120cc09f8b65ef0177a577c46ed641e00e933a4cbfd93f1c0f89ae4355749add9d36bcc9b0beca92af59fd31bc86bea0d42153c463c132fddd79c64903d0b9a6566d407b03d8841a2fb385b3ce944e3440bb4615868dabbd78b7abf0b467be7a1d3f6ba035503d5853388bb2479fbe4cbc2cafca06e8092d1c4de4692ad85dbe1f9ddf33c210374fbdcbf856fbf1816dd1a271ac3279f28e2dc7735c7a0c61989dd543b2d4429fea250c6700fec3f31a4696ed34be126b134b3453904df766f0e733f917286d7d245c90b46a24f9e64d07867087bb42c4fbe419ca6ba30c08a51d2d8112751f311adfd0f2610720efc10fa58981396213a3e7712172fcd4a6e56ec0f5858ce5f12082df46895a74333c56c76a16177bceeafb5271946671adac175ae46c8c3d0cc3bff20d806031b021815a97c577865158bde4c5f6d82d1c1f45397d50b3743139cccfe9e262816229f2a10fa255a1c175a79b4b8cd72070f9c2c1a30a503d95f39e2ab874f1c8c466af1151f69f29ea7a6e0bf7c68b5b678a2044f484c620a7c476c6d95775428b8b5ad9a30c4d490ddf2a678eed9f35d59ce7490416d33d14fef20f04b141ea5ce195c82001431346b33106445774a3668bf643f6a5a1b9a1ebf441e405b840803c9ccc49f32b1e7ecd974815882b024d16fd8a7c81a99515b3faf5827b33ebb3d4545831dfde7999013c47c522dd0e240fd8c0987b8d9c4a079f7ebf20253b92aefe7a398b733db4e1302b31973761a0c2c0f47ea81eebc94f81a91454ba2739c6e57dae16832c18d33236c63c44d6d7ddbc4a3db32534860ff3c1c854d4803688635a279d6db9e480e891d6b5426cc42ef40b25c9915416dc408ef0cd69f5f08af3c9e07d8999d19afc6eddb8572c328657b5226042ffe0c5f5edf195fbdc67d5bcd327e69fbb9d3a3d08adf4f3fae4fbd712e9d064602c667192ad757fa92de3185b81b12141a1f05ca42b97269e6a2b861029c57c8bb836f986a1b623c95ed3d55006260c43e52e6a25cd54b2015a0346c8fa1965109e6b03598cbb4da2a064156017d81efaee2cacaaffcad6fb58356b4b00bbcc1356b46b782d7847e8b721babd700b26be6081999495f9fee3422a6c24a15915af84690d6ecb7a04190db1cac783ed803f35fb251aeac0b5a42c6efdead070e568e3fcc437d6dade8cefeddeb6bce1c02b14d9a15863e819b7a55ad374bc2170954ed44356bac0595cd23b56fbf0d328f33ed942bdb0c9aed0dfd1c68d9b321db5ddd602766ad6e19650dc9781c2d4aa98359eaa20414b90daf572a789d72184e174cd2c80dfc393dcc6d00a023dc7088e76e4f1ab9a794f86158fb618205fa05014c4731f152211cf03ec17baf121f818667285e4197797086fed27d1177917a9bc4817c5bb14c812957299781e778608f197fa8374c182af1ccf2b708d2226049d76bc0794c8745b352ca251016d8b31faad732d83ee26b7a212058bf1750d4e5bff84c654e0638eaa87c1e4e74b33542a0c13b82ea0265c43de487c9a60ef372d5b274b47234d942795fe299b63109e9bb9902a660ad5e0480168c81e500dd022e94de154961a257956386f0328e9a6f564fd356d07bc503a260ea2739f61adf30ba50cd878ebd9dff025bb32a497c22082e9e56f6a2260cfb005253ee416aa8bfeab2a5d04ad6842b2af8dab77c345b91664ab41544bc2333de90f8235dd78f5172ec45811341d6c833e053e875217ccac14675eca413a2a4e4cc09fc865e4df6c425459bfd718ed51767c6a82f3d0dbb0862994c703669169e6e74644ececdacd2255624fd04291bcca85d0caf18b0cff7e73c09c2269b5ba1a3d1a45dbdf204f44003cdaa4c934ad21b0be8c1e6c21a071a28b25ffd1b98c5133a060c1a2fc15ecd578c50f705e10ff1c868137757c09ec9ff3dd3923d47c3b624e9a5aacb37ed0b0ce2bb88ce1716250218188413ede3e7972ae5031da0be9c3ecf47b0ba444d272e328ad377314d87e508f73ee7d167fd4097d27d61ea04bb2855c5014d6e53a96755439852c652a5939e028a43b0d039cf8067dcaf01825c5effd40d40f40a6daa274c6cb886c4c36555fe8b19d8ebff65593d9442181618532c4508e838332e76ae16991c355fa0ace371fb63d16b169f1df67dd4cbc1f01ae1400a9da4dd0b75b812e91935f36463cf0587fd97b41fe8a34927f863bd48d794cc44e13aeb280c4a0c49b7e7ad5e16ec3fcdd1dd2019cc61259a1fc3cb198826f106ba874050746f5c2990821eabe3ca064280e905bd23e6e2d065e726550581e444c73ab63c3ff17c2f97e2fda7fe1be5e7d144639cbafae06dc43e9f27a9c303a54319fb1c6aa5a39c94e606d940871c580c617e0b51b5485e6cbae4afe9c0a9cec402ceb79070466d61eca72e79f7ec800839a2c373369e0af2aab7273496c9e7b51667612260fe4c7fa7e3bbebec43930d097a1b793ecc6f1b9e58a7571688dc9fbb9196a097bd6783ac6aa0de647deea0493a08099de019f6f08cca84f7825ff43e4c8a83db5c68405e4aa6d5881e00113999c16ded7c7059f6068798065baaf38b90774470ee9ce1b638e513a18e07c07246390c11b974713d1a21e226664eba24a700bdd0034da30289a277397fb0cd36ebdc7ba01d72a120a3a4fd14726cb614dee1914f3e7b97dbb93e0d1d03314343fc659d4bdc52b60d71741e5328b7fbca4ae880b2a54b6b5b46ec9822c1977137d3323414f7180d31a0898a7bfbd68c12a88919730450de0f6175e5adfa41386838b1cbba0c5230926f58e0e4d28dee52e812e19b13e2491aefbd2c77d9cd8d7089df974f77328a7c453c02003f722216a4a3c1811d9afa0c2c9b78e205d27b70c070691fc0a6aacf14009917a4216c646578d00dd810a64376be6255f15601e2a83bb850c54c68963c75a4f23275f9e20b744667117ad65236729f6963ea2a281f2fa9dbd18d83bf03188bcfce9247758aa289cf7f0ec24d108edf500552d72cb5324c327e63bd36ef50435062b2cdfda610ca53d528720c7fcc2538a6a1eac232a4acfeb4ae371d2a4dd4a035a139a01a8dd2e13f0120ab9fe0b6ba00587a9bffc61ff6ae86a8747aec80bad82cc8e663ace54344fa2b31c5860bfc3a5ccf107ac3f1703be6c1827320e8b2d9f89748f9ee8e76a187d578899c0e4f606f35278461e549711f493f3eb97302502eea4ed43d7befd3bc7fe46b01ae36273a5f60667afdee0c69c4fae6c4830034e46e2dc5b02488eb6cce0f242507fac9688796ea511499afd89c683d9a24955884445e90884beba2c2ce213ebe51a88614f0dd498ae67f2b1444adc2c738047a85a58a8b96a557f89bff137b7d1d1429d23c530016d2045c22b5e41576a5f55cf32dcf2a12629fc05a707360b17edfca103807c02f127d14c2c66e1fbe7bf48b97b44e0b807c35346a52004ec0ae46cd2d82f2efb2db854893fee14afb5b8dcc93c11c9fb6f590d648f7ccdb0babc2b8ad51a2734e3f500dbe300a477ea6d9c190ecaa8eacc6a874b7c64118148959f99b8e1f774b2df7c15a071bef904f55e89bcc50396cbc4d48414252e90e4ca28e970cb1dcf8277e9a848d1a39bc3a0447a627a8d26f1b02e668eb73bc5b190036aa9b4b073c24981d98a95a85455fd46498277c002507dfe75cb1cbf851e75330d9da878de35ef8903eb0b0bf9c49730fa87218083b43f4643329c101529db2e2986c868363e3f628dab40c9016a19d0832e4c952bf85eb08bc7be6ecb51697ff18ea7d40abb43adb216ead6f6ffd147cbc160379dc05bb2e0a077c8ba044444720d8bc06db03641edfdd44e80b0772ba706f67555e70fe4ad392703291e7e60c99e75f1d273f5949dffb81363fcec227514325f75b2b1aa1f8168e2f3739aae0cdfeec4739bb6afda644b9a7d533375f51dac5bd707343635577dd0bf41e5510ebf7b6f5165303ac98bd8d3ac12446089716304c4d5c8e5e872396b438de298227036fd087ceb1394db5c26cc96f2e375dc4de5d0a56fe41d7c77fc761f02331fc7606f607b3276f31d85cb35e5f55618ff2d2c0da9c9beac86d29780815bf711c2a597816b85d41958b1cc54f5f210723b869678f3635bd64f4f6745e47cb9d9e34f6cd87c1a14ec9af4e84c053b6a2c0d2bb530059fa9e1150a4c618c3aa1bdf44e51fe573bb4691e5536d302518163effbe091a9456465cfdf115e4e71988e9eeba01fa41020dfb803516a1cd447eefc89e1dc2cd302034a3292be632b699490603d71cb604d96ba9b8ae719d5f141826efc2716e9732e8e27da24d49d675222fd72c016ee235fe59bcdb0e9391f0e1b85533e34c237138fb7e2e801a529cd379251d6f8dc3c128a972aa323788c78bb1f1ec56e56b0841cd792bd74767f112c9a052dad20e8e90610893bc133a5fb65ad01bd641e24c88a754925491417c3b4aae84e801980985730dc8a08cc1469617b3f563b56b0218034f894dc0840b5c117fa077fd7f659d5f254b1bbc7a7a05d1b3137107141bafb24278c59bc3720faaf2e8de43ac647df67db58ce6872022bf4f92d821b4ba137a7dd9d30e449f26d7dc982fe1b5a58a1621d8ca0d2fab016880acbc5d62513781bd9a8c0eef7dc2682e3d2bed92884f1716b93c21458340523b41b866084ab3ba3b7c653cff2e44a7b14c2e5976e6f2f68e0f2ea19ebd153d27135d29690c912113898f5c006fd3fa920658b1279c379aa2a15d7bcc1d2cc2981045e3e02645af0cec4060a73feb48375d0b983915e2795eeb720139f250424a252c6a3c90c100eac4ac58c5fe55a29fdfae5bd0f636cb0dc8cb0584fe22569b4054db5a87505cd002589ce53526887f18e0b4b837d877e933ace7164e3cff1e65def311895b776c4e137fe38dd9601777103fdf02bacfbbb7bc424e1b90ab5295aa248b216a86fba3a0763e03bda0c5d578dfeb0c8121790e81f25aece819c4ade8f2a27fdf890d55a6d4cde94fdcb80ce72d6f1544eb08077328cccf582aaa088e15113d0a104b8e88b2b6a624d3c30934f40973ad924656d18bf2195517b49cf2c6d8c3e214c59816be16e818b8706d729293c12c7e9fca2b728036bac57a1d5ae8c01d0046bbe19f12780117578737c1173ae1972240d5cb6b2383a6c866fc270fde2c257cb91e502b91f604d3d55a75dccae33950e13fd91bd66d32e6111346917aca48215e858c726b6fd4a57287bad766b97bfcd634f6cd1e2b9731a6625fa1bb38de7daee91acf2b874ee56cab629de503f40e65580fa7e8e282b8838d37b103fd90c37793342e4f1402d5a27b68052aae8d9ac3fc21d33e74137ea9e0fd78c280bff0b991302b62af57cee014d8f041747030d5baea572629d2418292b273641ea8143c472fe4fc01c53704fdf65b245d01d6f52ec49941e52c5980b4bbd82aab8364dc2592814910b2003ab4a1b93ebb32c77fda7fdc23a63296e918285efe09d5051b62d2deff3d6fb974fe332301c80c435164a0caf147c9a997556c86d0db62b60db4b22f686d7774622bc1f27274965e72d5d9c78b6aa9162948498ad3b306ad10374ecac44575b52e4417ec7e92e8a11e3ad60176b5985df128b6c6fec42017be2e71883ba8ee21cbbfca6a0c06c9583061a1f15c924854925304e577a64077a5b8c0547721299699a6942be082b841ca28cb0eb32466b13971135d169ba05e27e19b31809e3c771cbac1e194235573aada4ec836d36abcf18791dbe0439d35a5996f801574302c509d901c3b1c044e97c658ef8620424f26e31661cfbeab1423505b7f8bf16f28cc4a833c9fe8690822ee991c0ba785a015a8699ea7038f916fb01e4d4ff48f863fabdf5c0f36a57279d5b4458069b830bac0ded08882959ded38efcf2218472b9e8e2e4799b53c6f9203cdd0eb51d01160c4e30e98e9cde25ebe6dca8fbb2ccdaa4335cc8a4a8c2a92a82d625d7073bba56b5ead5e6a8f743d0ad348fb10aac04827ea832b3e507bfa3fb63865ccc0c1d3fa0c40976107961435c6d1084c2a2104f34e51a56a88c21f6aabe24ad513a931844535f34bc4388b18e30fa85220c3478ee36cfbd10d451f77197ad28f3873bf28d97fc7ed612298b00fca45299a2c1ac43f04868a7087b0dee53ad9c0f4ee6e56fad3df3e1504c419e350065598d5e44a68ced7b27fa8deeb654d3e6dcaeee949850a894eb1c24f6d774b51cfc5ec6ccdf5da1adfc1c7f013d4ef9c8e32bac304f0a9c10d645e90235c8648c3c4b5bb4df7bccf92dfcfd7865ca29b0d7ee9dad6558d7c4d2e68e3f8ddced8add9442863db62d6b56c16d6a816de6789d7bd45f99433e48d3ea1923858f0b5800e9eae0f7f762a214b43820135382e2e7020a6d061f38bee7b3daba044fadf3d3e9a5ca9c1489dc00eec504cd608a83f48502ccff50cdfd382cb3f47403c32de9b3fc65aeaee32804bd4ceee23637a3c5e34cceb73398465e42de173890d56912183403d2b960639d8059079ec0dadefb8da4fc49e6888777751cc32f04e831d4acf38bcfb15ea13d1f1fec6314e40ee29caa174adf61211b1e8aa077f34fc53f74edb3a1320e583fa89c8b2e3f10811daba080a7d833853347d66b778c4bb50e7697967fd77576d82cb54e0ea67131553ee966933d4db6c267ae3a14ca0d268e88abb2dbf9af547817b136daa543609524c61024125744a72d22de84172782555b0fc7ddaca4e1efc96e432cc1ff43a5fdc783762e12144236ff3e08ded0328ec4d90e7e509f56ce31a2ccf5b4a8f1996952bbc1285280f7268e339d7444b0977285951351e428b040cf749ba1c0008c8a8f4995cb408548acb29f0f2672523ea2ae9895c43e8e6da33e428886445e8cbfbbc55e703a52b8af3d3f9d6aa9d24deb52fd4912fdda2b199bc4e2c25131780ae74a46c6c80dafcffa9097868eb42ee7ccc2a3c5c6714420d347c20f8c3cbaf58fb22bef8aa992f9cd8c433b176ce5f726c608480cdbd3574e0a8a0f3ff30d53df857b50d27bae11f916332a58cf5fb684668f8b364d524b31714cc1e50f29b4638e43ce0a2ea180d2c66cf94582f63d2209c95c8c033262526cc34795bec1091d550a242ae726862197edc2248edd53af17e2ecda67ac9aef10109662e33a88b78ea44c7e28f7779341da120bafb111d6722076e0636e1d92ddf86fe8c6eea4625f4173dd4410997a26e37d4caea77e1b53606828b36b914cff9b4ba407bad5f3d761e84f1b8e96af0a7595b8a97a28e2eff57bcd5e41ef6d1505f7d57ceacdcfd01f777f3edc810a6a722ce5e568dadddbe0138aa67e9c3bf292f01cfd61f057bfd7172da48d751d02dd04f892f15541e6956443d844538d523dab4cbde8e63c99f3de15b67a9ed1d074629cc7b5b870d8fa591c44f657dc343bb92b6c335b130d2853cb915c84fb9be82930103606db2659bdd0fd8f8cdc5c18e2a5d78e3718db37da5ba0aa145810ad90285836c81436cfbffc5e18380e650125c810ec75aa5a370d543a77df1db86824bce93820708e9113d499c18a237b5c36425574b6df5cfbd8b1c64e99be44344b7432e7f48a49555e0c961b148ae4e2f165137ff07c481d3a419321d4427a0e96dc27d6e560941f82a8d769fba2116ab734a0109c7f303e74a0f14b7cfda0989193b87ff36c8848b870219703c792a9d73babb6ce5a9c304b7c5f621d724aeafb51d89bf574440b3fe79f8db1fc9e40fa6cfb8550458a2c0d040fc469f622540176fded1f7bf4ae02481b002cd577e074d1d19ac002adf30a2337c55c99f9566e4a000a76ba529a8f688b1af0f7c69a99bf0f0e78589e50220a805ed7df24f409093984b93668a7eeedcc768fe244fbb7dc1c9b327ff337d049b99ff514485c4ae2245f18ee173833d0cfcded5248ccd9e940534e2e194bb06df04b410e255945f4c0269d01ded1d3aa9f380dc0cbef4c46c5bfe557a94d9312816aa5a1306a1098e45d467a4904ac489dca48ceec4f4a8f0eca538faa01ea7370d0037564b039c2a9eb5ea408a3893d789fcd448dd191fa8899479baa52770514f25d1450d3164494c72a7601609fc6ec50170da54665b00d3c1e6fbb11860b652b989b28479c7ae92e684a170859aa21034ba90282b835e754764c64b027030d7aef4dc9b6ee3b8e38c659dc1e4558d64d9adc14913cccd75f582a384143e5644034b7729bdf8f0ddd74d762d3ba06c83b3ab1165dd9822a8cb2242d8c8779c0098ab072905203f51147810af499d5d9657cee82cf2aed98b3c424823a9f21f2ba556be1d53a41d3bcad3b2ab7f212e1a68e98aa203bb4467e7041a8ce0d62f3d5c770ffbda6aa20e0c4e2e7850257f036e660513390fc5dc86c74f0a09994e68ef8285e4d316f4b71c889839aa24e3c4868973a0dad2343d515ab095dd3cb51e21c73291c7f05709816836ffbfca6ec4393f6372054df1b126923ba6377f763a16baa712aa07102a93079a423b84ac0406b17ed44d48a4b2a6c602028c890b048338a1257b28a41c83c375a61c27bb759a86af0357b61053c05fa8520412ba1a5c1d227dd90bdf2517e4cf9f5049ce97ef87939e96045f70a932ce3919e128e9d3034700d2cd23720ca695720be02899f2bd4e2f8ff7caeae2d1e4d6e7806d8e2f60da37996707f5c7768fb1810f4edd39914ae3ec636dcb13a06794e51b20da0a92632985633690e2d0602be05b412204aa7c147a60f21e03d35f20e1f5e300303424243fc02b127eec7ed5a66d921657b90eab54686acc519d61d3017fb5701256677142930644af441f6a0cebb384360db9db03487626f99296be5a52b2849b7cac394bfe14832236620abc953177b3443d8bf7a10d75402443a2f4306e8c7c2543e673d3c648907d059a333c613d04d0d94aa06613006dc6661134b3b39cb16488fb6d3b0bf1316178b79cc7e6bd281a8ce331137f6c9310143a2a000faead174225ad865d880fbd1dc3eb682fe1d1dedc2caa67a9a21a7e91b09d9a4cc76c61765eca04c92bf1d13f26098a00f5e29c03440c00ab8faeddc66d51ca9216093e67ee49f44b352cac68bc3ced8ea49994c370a14898cbc40b3da926785d2016905da472442a400b2a27deceb5a414960e772a4a52f738526edb7c4a56911dc666f351e9380c77064e0ec2ac13410062885fcb2d22def92c3c00e25498181168cbbe68fd90ce83aa19c0bef16c0f1e7ed4c6267ff232df8822bada17c9578a3b170c798062c10517a52285752fda92a4096e2a46244d0535fede2b624e1454884a7371b2258098c76907c95aeb943e9e57efde59f4151b764498bea0e8a65b6699e00a102c7df8d2acc849fa1a0cb3f4a3c2e88cd7dad010535fe9fd24406dc1c641614f1d98d053673bf97cc620a1808cde30f7867150a3438566a5f349efca77798eea679b5d3aff8fb8cbbf9d510530cc882b4a43fe7913dcae6162a38830673b4b040567f1b131d7df432fcbc6b6b21c5665cbc890a7d4009cfd1b906fa67ab334cb072572a3c72f6acce05a398f1fbf446e60150e27f1b296d2602bc94c14993412881a1971e765e43932406d23427c1b6b715c7e3090cadfe5de374c168d16bc7f958fae89fb40ca785a4e9a410e59c5ee84ce08f0340146592b213896b2d330c18a811813485c5e13f0c38c8c6a3489850bdc9a288dead10bca0fa9550f4177545004bf7da99f6132f30304823d784299ed89ed1f25fcc55370448c65592e3c7b12259fedb5a1bc80b03da3c642719d4626af135086d34fa3703ab6ed1e03a6ba58ff3904234e9f04d037f744c51d7b4f9cc491a454005122e6902e272dc0f45ff3eba4b4287f58b196148305fd43fbe906fce2add3a1acc7867e8391817984ea7800f95a39ca07fb69bceebb28a79926d191528b9bbae7908e084740348cc7af973177d14a8599358d37f50174811d89e41ac86cb313188cf97b05363ffbc8ab35811413736b8f9fd09c3254997d2f84552da94a67c75ef417bd1656c17d3036f344d59ef5aabdc876e1dc436a378da250ac90c74b1590b7ea73a13b1beb03d0f11db3162026501e04af9506ea3c2185a901bafd69cadfab6320ca5ea638b3c806ef90740497ac62ebbee600bb1bed9a3ed6a424b3df20adb5dbf37f6c3c2d4135b61859f9de5f172a6a9307db63338bc2e1eabf003a10753958d8bd217c8cc7d6f14db0dee24d9de1f3ffe490dc28edb0ee83f86d216734e6c755fbd6f13308167a8468b60211472abcce5541f1e247956fabd1095e55326527c36b4edad374316961694adc90cd303b4fc94fe153f03df6a376dda7e589c2392b2887bb3c9a6ae88b5da6b2991d792436019cc9840a9033cd52b2f046bc5293f29b7ae5a9fd3800cf318ae8baf66848435cea816d93bc26040dab0b6dc3b23e95d5a193ff417c952564b73822240b14309eca341a0cc3316cae30ece58ad6eea0ad7790a809fba8203eca9a9c902dbf3d4a539f4a404829391d84ef1ccced2049290e9fa5312477dc259a9859a8b627ce70f0edec53ce72f6bbc3f0338503a25c49d96ee8e2a84caeb08edfbddd03cafdc10f41496f917f1d3e42a8c7475fd73bc57187b78e5d644b88fd5ac81f5dd0fa8afb4788ddeff88bf7aa217e136a649e327495a253c47fa7c077538f9a07a3c84fadb107da723adf04e07d24a683950005d2e1dd0a2d1035dd0e66f14efd813a4ce3980407a4ed3c1532f7999b13278486c3d707e6bc99f0d63127c91973c207a90c87c775fa1fc3fae26cd075558989d1011af480abab9ef8999b6ce4695ce524cad0d3e2c072831692888b3b1e88f600b335462c82a2947fd007716d9abfaa599eda3c11d780b8c90da8855fcf602c2a4968a42128786aa557ea8407246601abefd0bef508d1a1e19ab594aaa58425d6422010f55e1c2e7724a1e11abe7f8f428f6550102b12e2c0847197541b60ef987783cf86c9d1a8bb1b2d79052f219295b4a52600c02cd8041f7decc0a2712d911a5999171abc32103068035922d860555a65ec4e246e4483f027253d86c4e217d3f4aec82931758a5181e2204c998bfa8aa06bfb9fd4cb1d56e1c36ccdebbd45b738f3d5ac9463c4dde31bfde4525c72f8dd6b6247beedb1de3085f7e4541d1378893858af75546cae7e8ed33f0c534965fa0fc81c185c390a3ef8f2429010e1cdf292caabbba72e1a1d1ca4520c85f00b0ba450e92607ed2e450f2de347a9e34356aa3da49b5619014c4e82cf84e3ed11d7a55647047a9c6428abafc7cb72b742898bc74669e9d1657fd2100486816160f7b417f852c598e8a8eb972b29b85771b0dbe1dbace2fbe31609d82621c7f7c1755a0eabe55a66d00bfc13b1321941a0230855f7d6430b1ebd4d71be49e74f0e22806d46bca7bb88beea91f440a3af73a2817ea8bcfbc92d099dcc5793af65e79656e0024a9dcc681a2093d610806d57065ee1e5006bce1654b1ab353bb4eff75c0fb5602e63335368891e006c38ed190f9826e03ff9b80e21a51370881bc249ce9668a5031ba702c5ef57d06e95e05ef97adc2ab8758b7f6727841daf74d47ee15902d715f26897d2aa763edfc42b49280340578a7b5efcfa720e4d00babb409978e69fb034ef6f7b3be8df0dda23f05cea2f34dd0ffc64260ce8df3b09ebd0f85309ba48acabbd3f4e95800ba48b6274a2cf5739fd659948bf0d7b4f57f3ce589771dded4b598016895c8dc35a4cc7087f2aeb5e182a572010dc477bbbb3f6005f12ceebf1a88395ab54d133f3d1bcc548978d8d7d42dddbc1f4dc2946e0171633349074835a393917dc1d7a0ffbf52b7b8a4266b4877b4a2dd723078bb38e94bdf0d5eab5ede034792a24d7a975829cd2800902733caa0014112bec6125f5573f20226d7e5a9156614949676b958ad1025e9990149542bd27a9ee2811de5efef0c7772cc75eaad6e54cec04c8b0baa950caf903fab0260ffa644f8f46acb244a6dbe02b6f0f42687752649d3f12d6a8810259075315d29552448f48387fe2f891980266a95249580d6f2aefee3900da939502795349c7fd0c501bf88095a9f12d848ea7135c6d2ced284ee2322c1d51e5a96a65024b7bac5ae5f4a0834e07620ce2b5012aaaeee8012826ab3b2267845d1ad0504676e2471aecd67df62acbba1dc154ae755853984ddbb5f872aa1800152acbea00971d3562d5715e0de70960e28973bdc1ac721f61dd85c1a3cc99c819fb78b1420ed8a17b75943998cb379a17c6440368f8f3a12745491cb133402d561859da8c65d0453e66999585021b83648960a124820ff94c10adc44527fa4f18797bd2758a74b1fc6f615c73591acdc6f6f33c6ed9f450136327c1b9a5081ea811860790ed082a1d241d6965e6c522d4db1d035746eda8548258d96518cb8ba3be6f0887293ddbb0de43f387bbd0949b5b99f382172e5100288c444ebad57c1a1b4a81154250e7a43f27d8660ad282a85fb9b8f362a263b68865574005ee06d3d32131c5901263ff286c9b82046cafc656c14e6688ec76d5e3c7b15954273ebe448acaa515e99d6851bb60814306f65309a88505e4528c1024c025cbef1b0dd450809186e7a56489829d80fbe51affda5f1d19fdd0a0907c4ffc77c6316ceb834ccde53bea85ec0620df32ccc3adc176ee74a41fa10bebe6bc22431e30c1c62505b71a311018d890521209bbcadf47c9438eaa287f7f1360f63358d2527e3c39a1ca9f32e1883c516fb3bca96ee5bdd1b61df7110abad638da6879d6948f2ea96ad7d09c5cd8d4e28dd8d29a58f5b329218a112a0e1b94745a8cb68701c98b472243f2376ef7c9c60313332fc9917865d881d79611e84c5e9abc1c92dff1387d2227f84fb7f6d44ac6222934cb8979d56c4d589643685fc9f17cc20de59c1311bc6e3e46e1b89d00529ce3ca8daf067ccc654f95cb0a7dbdac94658263dce99f7c93a7fcdb647e577a8a782dc37c7cd580cc3f9fd06b80b0a94fd668596197bb54cbe3eed5a524ca63da9abf7e878db443b59ad6de640023bc5b1fded551dbb4a1d1bbd73b308157fc6fd71b2820f3355c014cf813fcd641b3cd50d9990a49a38a120cea4ac0c3f291b4d99ce8d5e96f606f7037f21b3c6f06055172dea242fa6948a6adc5a526567c96ca2d60dc3cc6d78c6638f549cfca2f1362f56b7995445aa1a80bb41c8e904d4678f7cf81a30af225158c6452986b10185da59e5aeb4543f880a2575503adf5da848bc99cde20695f10c58a79c513554b21e482afec3b045a42fd98997e780bd0ee5b72fb39574e04d58fbd9056e2c2939d34bd5b2915374389ad161c79b555a5f68bef8972b3562ce333c3b87c80ec6eb3a3041a804897d00f225c13e87e59f4327d70137ecd024011a281d9b4eb5c3d95417c82369f13f070080e27e310311c0cc110bb64058084190a54031526600fa639ccd0e371681acb251799848086b9b08f2c4d414e550a1c006dd5c8e5bacebea3a8ebbdad0ee8a8d9076a64e7eacdda14ffc03b1f691da9bb48721159d35e9668a78c6442321524f52c2c10dce1edbc187ddd71db9149a348337add577c287de396fc620b9a2506215afa915a8e756d59743459ea7526214b40188b214eec57bee2874b2c031a5c2a80e37202e9c74247172e1a160b1f8ad12b7e7914220ff8c0b876096c1bc58fc15d33304d202e76af99e625c8a123a65bd8e7bc0c31eefd284e7c97c01d3eec7f82d856e80e8c827bf4677daf660623f61cb601ca250292c0bec2b5deed8c50a86ae73e63ccd203c5cb5f608a39d06da2dbca23e4db314bb79967f18bb2c2095f65be5e5a1fe4a2583ed826d31fe2be035630474cce423410d3c3818eaa22d80311540982862ef61b4bb1981a44c898031489f4a6c5925ffb73db2753fd6f13ad36f8ed134a0b898807f905b4a75332677ca2e559725cf2a6bc6776a826d0aba22eafc407c506d206fb7f1f860f56fc81091d9fe6d6624d6a64d473dfc7b58617d3bb73fb51c2dae1505bd5bf284372559000f4376313bd5ae495d5ebbede20111bc84e562857e390f6744e68fa7fb437b1b8eef47f630d36e89cef8b468f0ec74a7857bfb9fdf9200cb41a687b8bda77034268e8a993ea51abed7ec6d115660164f2be04ed03b731d659141db48ddcd32d46d9a2ff330bbd1fe64a0c827b23585996b1b054ec22430cfb8f5adca9ec62e9a58581140919515318eee84f21ccdb26f17b61de45f4b190e32ca7190541c35487ac62393c520662017bb1e6a5953b266fc311e44b4b33fa347a6fbf349e4c94e4478ccb69fd29f7163f7c36eb40483752cc0bd043b70f9e604a52f960cad1d8a15948e4607bc0eaaec4996ebbad05fc68b616a4702343f183e46a6ec4f2c265085cffa2b5a4131c770349e890dc1a2715312e322eda54b4043c69b132c361d2768759e1c26deb5ab148ec0768d4354e0f4c78f5a06640f144cb7ee2990865cb185026f90ed71f88ab3b8de70bfc484147defe3b799feccb47d6b1db07184ae27f754224d472e1bb736f270a64bd66adb75341b8ea0805e0a0a6be16822aeaa5dea75e9b13b2b0e2d3ee693285db62fb80dc8ad76a613831ae51172f501835fa65304352113935947f593df1085b1e0c73f7c506668ec74a2071061a9980d90c9957922da2f21ba44bc447e6a82460cc942e437a6210301fdc7f771a6e721e63ab84b6ea4d2db3aaae4f89fc235e889c0cc3b1d1cf52db0f3197f34d4b50d26909e868bfa6c4d0e17061017288bded04ccd00c07d3c1d4d75de386300695937912350b4595a5e3815c42d737c4119229e4436a8e403ec2704667f42cbad32ebf8c8698a2cbf4a8403d3bdfc798f9ab3dbaa47f3414379284936b0920bd7eea2a222e487f4a5562a68fac7fe1ec4b8699fb1f31700372b5bcf9b07d8d06afe2666f1dedd811d06a88838e1f363e85f0202c960ab7ff65995f1c3a9c47e6c4b18d134d7742dd899bfe5bfdbdc46d2443426c90da8f80fb4d940ac98094e2c7426c3f1857dbc121c94773460bc6d23c23c5fe773d2f0e7956c7d38e4ffa39d9f42709955dd7b9381cfbce359256316b601fcdd75fee41f01171d881543a5d187495319d8f2c81b44085c0b0d6e63a878bf0128d84a1b87cc6b8f682bda433df86ef1a6b5429e687a947d37fc1c4df7e09c63ad5a00cd69e8f1a0807635aee458fda8515af011116be90015109ae3b1f3769d217829afc76568d5e9f7041f17ca3cda8f26faae65089d79444c94e844f8d08b56d0cc563517e8e5e7435154b0768ed00b0a838b1c3ac9bff29e9a09681c1c9d12eb867c20c336ce2c71c0279009c04a00b0f22f851304b0d043afeec9c6b4a32339011969fffe0d0971d41e967d6d5a16066f10b130cc19ade910e1e3b27f81c50efc8f1957ffe57d2a4ce3484100c999e0f10d0d795ef2bca9c3de48ff7a58f9bfcb32e1d548e34abcb3f3438cf34260eadd333407311daaaf8232e9cb5b43dee26155ceca4a9b245598127ab7fdfeccb858354200b606fb27a75d985a41ee5d72b1ff2654fdc95bcaef925a2dd64ee89411f99c43c45c33128320997e6b3b8233ee0dcd286fd9049c19b1c8ad1d1b7af877a745069edd8b5dde6f2ef2a983c4232e1813d93ae916fd197cd40e21abadbe08508aa647956a891f0b44dba5a85489f2e5fd794ae73aa405f18402138047aa95ecb6771e687b47dcac5c4197c8a29be1a80f72a79d5b0a2ce9cf617d640b959b920cdf4106e83749dce01111ce1e19c02434f01862857633c39af0961ac97073be2cd8748004208bb412fcc65cb8226a4622eada4eb30895b31ec651998723b4093482e4d78b804ef8d072340ec3dba8b7fa9dfb431007455824601b6fba4d5243eba42dfdaaf73ed2e9da3a0439acd9fa9c5111b7048670cc395921f141903d10a7c5d30201ad130b4770df4e4b98a2b0d1f732f7176279085fea0ce0fbed7ac655059c597e68c7445c7e4898c0b9b6bdc05e16d3e0a485969362a0947020c7cc94be8373d3888aec1cf59104a73c3f530a0b88e3d75e3acc408a66f3548fd07fc2da3cc482e11c0895f48491cd7dbc59bfedce2509e5f7a1eb40734488763a1d1fecaffd1bf2ac6e276dd73cab32a2f4f80affa4169e1bb368a4da18aa77b06509b025a8bd2f061ee12dbd349795cf22482c5ab27ec41d724365b2a8063ef0b4019b556ab399f2a0221a28fded92bc47eb45032080cb4a977009ae9ca9a34f4749de0b30dc79c0aaa37e253097c6e514335d4baef2362b9ab8c7498563857e72ede9793522bc41f87d4c5c4fe89b345345fb3baf0402013c2ee26d4cddc953e08b59e664f4f8bbae8c412d3e0164704d2731ed1bff958be1545d3864ee89557a6611cacc3c8c02cec06aa59acd878d47163681842a056afa8166a584f6b11ec08c59071818c2abb6054742c72cd25b42ef59ac6bcca2fdc805536274f8b235f812015a60f13a84bc9e15740d6b25a34a8b82e72aa912a0c3a640fb7dc778b8e1efc74c008fc3e915058c15a79c901d683b9d9de5389aa54cacb17cbbd8d2c6fd52bb7bc82ae33dd3a80d7ffb2635d3f7773cde86c3a57aaf1ad5df256e6e97d83a4d8448b4d7e374701cb4aa82fbd21621d67ba36f208beba5db7d6635a440f6e894099cc4049e4b0acd42d23b9ea9fbd06dfd754d1b127e5bca1573677f46feeedf5161e863301afdddb7391d48f92dfa8b0affa851358b97afeccfb7ad629fdc6beed5a66547f783f508407e5cd4c3b73bcc2afa111c2f18acb17a2e86b50de294443c44e24cc2c8c5187029964e9ad282dd24d5f32f61517bacb32d8f36016481e8462fb0c3e3a66714716c99b4557e7696789b87d96e02de749b861eb6b487e740fea057a685d8e7c19cd5d592c8ab4e680fd3297a4b273c87d61d01a93d1a65487c595ebf656193558559212b44b9874514c1666a0f58fb68434a8835b377acd4f88e28bec58ced97f1f8476f90fee1df9b9cc30950e6aa8051175e6b1c774ccf542900d1a288f98a656a2e739b55e6657a181ceb17c60b117f705e7c86a55f2e83a04484277b1a91bef2ca1a371e860de516bd1f66198e1b64de43b6015977b1c0ad508e8cd802ec44e6c9a5d258e581cd1bfc581916f0b18ee3b0e291e6c806c4df156b8e1d1b0027c8033352c954d6aef4face0d7095a53a065958899c11de00adc2f6bab1982ce0a06fd9d84fd041ec4af182e5cf3c9022a95c04e0e7289dc9e32cd4c45ddb4bc711536cc8c5eae26332e6f6b845b92bf76f6a19c1f6adb7e613b5892b176e32f436795b7c8088fbdf5415ca9ceb502acf59b6c6e7485f44a90facd9bda012c5e0152be79533bc0c22b43ea1b6e5a99f7fb49685e45b9b4b84e6bf65fbbc013f52f775e6af4d796e11edde585269f387d0477d2d3d1964394a1c611927ce6364a291cca1fb3c7ec620820497b24d0af1138917da12358387b1242a98728013aa139b7067c9eeface1c70a8828a69e3ea85df30fce0762c722165cb35b9ec8042e5f18b33074604f6667ea68fac0e26457877339ad9ea61aaece2e4a041d4b40ac87293d6ac633bdb3d06030b472dfe6d6857d3dbf5b648636afe5c209a11db9a141536bd49fe5e05f3dbbc2c6a86313af069400a6d52f9791e08b20a68fe184d33421346e5f94f80b7a0e8d105e9282cdf73454f8237c80820ac6783e5679081984a0b9214df9f89cc1fdeebe245e754b08b565f415dda24881e3ca0a30beb019892825df68b2af4ca8dfdbf299ce46e81fa812dbc7027685003898e76ef707d40a1f55717851c1a63eb43a698ecf8cb8b991cf0ca3461976334015a52cac3785b4d225090fed251b9daf08bc97421713b375d76e1b656ee9d38c9d8fcf01a6bb6185bfdf3bd47ebac311cecb3ca0963e8c5a3229c12b3937ac94a2b16bc107baabacc98e913cd1c406f9fbf18d5228fd0116f73846b662514956619400f1f81ee291a718f62b6013800f50be7f9241a2a10b6221544293d55b4a0768f9351e1c5ed0e80e6a5ed0065e4025d79d328be6cc22926a8a1997640d96347826c6414cf51402a02747ecd51ffbc7c32fa5b7debde244963dbe42c937024d68f180fe8e3dabbc775a4b6cb13e792400693b6d7a1d50c4cf2f030ec8c799994752385a1fa4ef6fa51609daaa298fd9676d50a898c35bc3af7a5ebab65f4da5417da8eb1928a1b10435ad405ce9bf61614c7fdd65b8595d74f6acaa5879744458e9de9e542bee5a420b487bc05bd83618eca9359d0db5f99f26748aa0e31c85a7c8f2506ff3b0de2e096847839661b0e8484849b7e812fdb8402e0eea0d0b0bcb71782386f33f7d9258a46cd07b26b533737aa1586d2695ba386feefe101eaa78b3ed1446db05e9237caede96df736740a859cfbffbfe1e3401c4eac74d333333cfcfa07c1a69874d9c309925a744f21b3989cccc28e007abc72b6a72cd7d49c0f3f1e6c383111a5e6d23c050681822241f720eb32694d5915a7a8a1966304ebc0b4db7c25f94f4549fa0e91931538c1b46a396aff38d54179e21de564c0dd5a595e522e29a29a8989c277a28232256433924100b5c487e1429e046377fb7b715e21f7e1fb4201acd8ac6c5d8af54a713669b0b6b9e9629da7a1cb1770d24664bf8018e210f694fa2674e0a382895f73627ec8fbb8125a336318d3e28704690bba1503fffb5c496340e39113a381a5d3a2ec214bce0eb236ef88601736d914d26d9e6a1ae4bdaa66c570a705b385bd1e54e231b98f41110aef540db151c51a4f940225ca27ee070a347fc2b73afc6ee9a21035cd66809b1ec0a8dbb86cc6571abc2e3a1da58c67b7d435d954f8cd6596179eaad22b040176a28bbaa004f3ab52d297eac58a2321402c26a85f144acc78164ca37984d25437c74bbf78c64606bc7f912048f4cc957b3296fbb17c931d402ca7346ab81340c13253f419cf7a846bf83330d74a041bc5e440d9e4ec628e0df0a7db3f061e7906e1ab2984593aa4fad32deebb7d09a98b716ad7695a13c78d5e2d05b8248b391ae529b11eb929af6d3a9995d402fe482590af3d1266a580f05f0e467ad72a840ddfb8cad40085dc43f4617995de2378266a9b8ad132ec198b07c85562ae726b016abc879d82f33b28e11c4939f0443b50b8a0255b15401e9bafd8e30ac13abb8629499dea734f18d4137c52df8209aef254b79b10a5ae8111580585a01cf6a6b78eb80af2a3a90bb1500627cece78a9577de6eaa88aafe9d56225026e40beaf187b504026b843b8ad32ece47d9f8f4948b364b913919c0e0c001607b81dde30afeedc4412af6c34d4e12e2be1e619b8253b71d7c27d92fd098ae01f85442f273e1f38fb713332a6a2b5f5e0f2b01c78f9fc3afc4d126c0df8af1a1cee02ae3d4473f83c7f271a5b5ac18c09ee49d5d0538bfac135782fac18bcdd882c3744ba2efb825abf5470d54dbcfcc5d8c2b5fbb430fa60b45e28ed954b0658c874f23e5ce5dc77ddb682dff3a33d456ab8d2614021a036e1da455baa9e59217e3dba0a74b855335e948029f8fab8012bd5abb75dfeb06ecf24c0c0d4f12ed30becbe0b3632609ca10a9210818f2770ce337844d286b87aa8ac7ba5cb21d228195913ac03e8d1ba2f15687c47de0cd2a8a9ef1031c563066a27444738e292b5c387c6b28701d389383c4b6a4c5d2ba4e461df38f6564a7818052f5a3585d599fd24baee91cf1ad1c9c0fc8ac278d732fb837f9dffeab7570774a8d27d078fc9bf1df41fc00ff8b0611b58df0447996981a3d709144e830b7fef4fb0fc523c32258850ba26262f82daf3e27dde0bfbbc840181269fc19c45a3faa6156f3da0342cfd780848a9037e3ab494160ef2865bf92b2e7b78d8c548ed2e9bc2e8e21a1ad64ea0a4bd173b8cde795a0aa1676170a44f6cd419ff4f7b999a5ee5b965c1d5975b614fc5f3f9848b6ad01fdc1a64a115f479fa3007a4f74bb65c4de3b8856c9f73f7378e2209b9a8d807e9d659b57f93c5637ce7201c963e809cb2584d79fc7b2ad6c7a20fc085b859a0214cc1293acbd061dfc42a109a8994e8e02cd1da319e301fbd5b792e640ae313af01860d5041ff7c2a8771260816f5271b68dee95b5ac60a423486d28fb9848f3e7a1e5e58d92a580a124db32f341d73adc498a157109df77e62abeec70747d6541bb1c318e90971c0c5b696a2285e634a01b01180dfddc94b4aa3dfdb4cb70f86fba1fb582d3d2730602463c2aa60d1808d4e9a46b48f61cf7461a1d7c971ed0fef865c72f301d500f194d5d952a1324cef2bc085a4b920a44032d94388829a3e063b3541e75bd57317005d473a28c856cd63447853ca8fda607eb15d963a647a46e3c0b7c9e6807fd30299073b6d58b9df8566f4ef0982c5166a9d3dd260aa20a3eae0bbec73b89c3d509dbad54b6656bdf5d856a93077a7ffcafe7b6fd36f37e89da3e5a7ba2c0dbff85e0a0c14c70d827b64150c68819434b0f10c69e883ba350777f77c53e27e941e468c70cd07bea78679831eb0686f95abbcdbf619969a1c977b26d31b6bc3a59f02a18572436df5fbf884309c86e856f70df171ff2598bccb90fdd9d9361cb737f6f323d6c049992831c89bb8b6b6065a6d3fdb894a1920412648aeac3bea4004b8d2a22cb421f7a46d2c109f568a5634c9aca6883147b28cbbc851548e4e14216c31c1e153a365694b0b8f9199ab2914ccab5f78cd0096763083439bb826c1da3dc194760e85e883fbbdff36acfc54ef7dbfc5902e8faf0415632a38b63d1075868a0f460fad3ebd5a4f0b7e494d006e232b18b73e24271067a5d6398772d7d6d0502d5a7f8618478d2939ae166efce018a395f7702a082f5e181679b0529a7eab721b2de5c750f1c098c7e2d70c80be2df61b374054e43632ca51e642c8ea0931cf14d74a1ebb6c252e03296a87816e9ab747ac4781914fd7006281172cb06d43358087069d041e77cac54c34e88520a4936f4e395f00febbb31267482a850fc8b8b108295536cbd28cf76b32874d5ee070f3e165048f8290a418ff67c8d45d6110dea7a5f11f1bfece3aff80222ac1f90552f1b98bc0810677f88a4a60bcc5bf532e53b0df02ae9d84e19a0b588f8ad6b26551e2d80003f55841bb61165e64f8e44ab280403fbab3723bd8a8c1f89ae1553be30a38d54fd6c709bc767a4b15ef7166d971df91eb92482445056efc1204bfcd835310231fb36b4293998e38630493a11717e1890fee85d48e01affb4a96fc50bc7b12febd1fc43d46db73138c64a9fdcb5f7e67240eda8b1f0ac9eac27350c6c63e5310688b57cb8cbff2f3ce7b83a78e5e7266477abd2305015371b303d37bf62c45252b22386026e090864d31d3cc3bbf1c50b626c92621a010f60e782d14421f5912a3e24b664b0852d1d788947138efa60fdd98748c46c53874600eebe57ecf8dd57bc11f55db216856db9d3aed723c161509e147b8736d9036d02c6d52263596a9d0e8f5ee6846586b5822fe5a805fa30632bf75293e40a6f8a2274252eedf5ad0ac6d0b03508ee9e8f5d44ae699ef5c3f633cb1c965a39ecf81383c5f94d714313737c4c07f6d77562330ae1e79527f7ef782b920bc4028a0690e662ce370d51e48753c1665ccd58d264c2931817d1a52443c831ba1d5908aae128c3d380086a2c4f9a91a2237ec36f9c55f0422a8a7ff63ad0ea903b657d97afb1b3a1ab03213fcaed745a1da8ac0438a0c130733fe1fe837008e883cef60eaf89ec6794240838a60b76b3dec7e33f78916ad4a6133d0ea9ab7592f525ffc5f0033388b464a1adf8cea82e06d91e57c68a4957cc5c93d2a09a9ba28b62a06a18f09d5ed03d240e02f5c5d84e6f6e088cb4f0c28b0c4b55354dfa2e4c4d119a4092a9eb05ae5f2c01042a84ed446e7791ca283955120de31f5065c288e9323089f0740012adaafe927132f50b2b4a8561dc9871f75543d87dbd254e20c7cc857e0c3cc9f18c320c3038b45e16e9c7220ed8594da8962817ef626bcdf3e55ad4bbe642fcf2c98339f8b8e2a0db460f4f41889a2c982a88d8a3e682eda056822c85e61fb22a057e32c715f6a48bc0c571814b13bf64857e4dc825bab89623d58ea7b6f881dd96079974f178ac118b0e9cc746113a0abf9bc2a25872657c937e755996bab8e59bce120fab050645c70ca7ac22635a0a31cc27d1f1c51887b5e3a8f25369299e8f0b8c1680e433b33e20332ed42cd02fa3d6ae8916a2c771a5739e6dde808e621fb1abccb8364603eed07daeca328a4676448c914fda53c65da16d80478235bbb4df28153f087fd98212458e74269e3b7da6c5db70e8807fc589f91591fad8af905417dc6165b0132013b6d4921c59fca3583dc6a2c8f8557a6bdbccaf131cd89d4dfb1386bc1402d1c6206e91dc56e3947d45f34954c0c30593f6955f2b84ecdec304043bbce10144c873f88b332bca2a6b9be098e889d1e2243aa26e8be7a46f80db4dedcb78f2343d09c38a8ac04c7bfc7771b6e62caa379c8bdd2392c13e8668d99253e9a3bf593332f203a37c22c9a9b818d2c6e1fd162d84961b0c5e729efb1189596c2ca7e1c7045986aba60aeb3aed32957869f86fd3b92e189fe785dfeba7a83d1de5b8afd3b8accfbe61f3c5dabc4195da29444fa9b252a29090e394f6a7347d448e6c39b575d5157681ff04790c0ca8664ebf8c14894fe2a1203553707565e92d5e60888c25c06c00636b10b9a059dd0980ef5a863503ab3f06d8fb81e33be405710e1576f5a9d8af221338606b5869cd6eb873427e198797243aee566be548ef97e5049ac7d133a278b5100b0a25731fc401a7dff70cf79065a9bb94848da59d15cb7356d41539d20e88e5707862b023e8e7b6a678c9e538564a814b1cf93f3377d6ff1f9909225a94cc17b64efc656c4b0b9ee94fb7ae2f75d165374d12d10270b9b9d3926c297dc6ad360244f98bf4152f987c46b792136c44462d5d717e5310956439b81b2eddc0d485cf60b5d9ee28f9c964f6b1f6e7d9a0de3dc123f5fc66166118847a9a237d043c0e84353f722f207a7bf095d174bded1a11af1dd18f2f4d69046d442bcbfcbb284307ed44accb1904fe3d3114c5fa69de2aa1a723aeff75b934e35ee14733a211e179aeb914f5d2e22eb025b8702b47d85ee87e42ea5c07b853ae15eca349281f40f3f47e5053363acf48777c1a2f24d7b4859357fc8aae3b87d74a2fcc64003a76b056bd5ca1d211cba948853120e5b9caa403307c68423323c528623db76325cc3ef31f5125d60274af8428bb1393fb45e18fd43954ff97101a0eff1a4d39f17a035498d607ecaa59b48a1330d082a32359df822af736b18e8b2b801a21323f3a086403782f2ddfd8e7d04252a72ab75ba39be177e586adfe6b3af0ed7fbd0061e01fd4a013f893d33bc7f4c8aa1d71024658aff43a86ea75b24acda650a39618c18c6b14864e20a3f964a6dcb0e9100f4add6236aac94da5dee45e285cd3c4247315ef080e157b29c1c7e4fde959133c45dbe3dcc8fbe8ff2b0d440ee7a8f2c5434bc15599f3fc215cdf1e0e88e9881d51779601810bc554da20a173ddcb2fe6cd4123176f482855e35480c0493b999ea5b7f497f9e76fe7e18c8a99a844abc4a42824cfddc65d493145507d7f1382f706e926683f7f8b2e0d07f021d8433d7a0dd4fe13f824f3a16da3e623af90f7b1e775cadfe6973d706166f765103238996bde4ad09c12407f6256700290c5df4b00eaa27eec3cd352263c61853812f23d809284bddaf298394a1b2adb2cf332cab6c54867d41e320d916699587692bd64a2a84d72f2a717f9eaaaa8f917a64fb89efd2f9571010c7fc857c7c59913b46526b451e4fe4c2c6696f593991d7172de87c07778bb8069002f7b8fc11911d28d15fcc9f3715f73c8a4945b5e2380d48d86746b35e725bc85cb7c5534e441a179760f8df12b97946a4c7885f316a191d5e3058d86a704341a737ba7f7197010ff2310bb9aa67db306085fc94460ac227648e58d4615c7d1fe0ca351367c5220c18dfc3980495a3973d01aa77f40ccdf67d2ade7d08b04c03ff4f6a2c241cabcb56a51a42218b30905965388b41b030c08364450f55f88b63affa5bd0a3fb7e26aaa53a236829eeb140899dadfc5ee0e8513c48a3758e99c97a417947e035a2977a25d409815a903f009fcd758dce7ef64ee5f71c4974bb65d186675cd32950319a90855bd33a489c9879bb43307bd4241d09dde0ec067ddffee712cea40d23a51bf0fe35e2548be1096d955247b837f32826c1849db4de4de7b4b29a59449ca1c0ae909e60921b8bdda3a730740da5dec75b51efc43abf179d5b0cf0cfb54cf69006e3fd2597eee0665b90e32a34661b7cd5b5bf6f2e9572e6800f1a641ba1cb1f5ade52c7d496368173117f73feda20fd2ae202065f9d728c0491f4780be05a79ec1569076dd4b5b6c5df9cac1100ec90ac33edb1dfb5096631f1168bd3c02e9192a7db9ed87ae5849def20d86be2d7ba0fbdef27617db52a59dd0491a63c4fd5c4395415fd6306b6a6a6af27681ed53b228ad36bc8ca0c08c1d811e74e35f6d1f33d97e0e6df2ff60040566ec1e744bf962f4b1690e1fdb7fa68ebe7d18eb8ed1ae33d04bb5fd7b8dd8815e4a29b6202ceee0f7ba8feb55488784565b22334264ba534a84cc08116b9dd25aefc51563ea13e31e24476a9d3a74a7566bbf7b31aed6defb619cf356b78dfadc367b2fc65f86c0b67195e3a84f8ebb1fc6397fdbf6711c05e22b9c5d44a6b12d3fd39cbd6d4076b8215b3ea7e32b8ad35121b6fc8e02f1aae7519f9e8784a6e4a7466ba8cd125a12243d4e84e70ce1d9911921e2395e8413e130286a6ee32fafa92981c26ffc474d0914d367eaec1899c9dc7b901cd919327566ac87593381e0780f1336899842cc9a69d3c30f0cbe92b205489aec71186e90504040070c52ba78be9292c55752be7b8c2d7d25c1ea2b996340c143faa8019f3d2b8e106638b50bd3a0525a398ef33c0fe4f90d6e9e43269d7382190443216bad4894731e8d482452472285422626a55209542a99be0cfa1e57ec443741ff6c0d683f18b0ca1e9a3bdbf26d0d28f1b535e70e249fe8248b9c73ba3ba5b4d6ba752553a8036da7135207daa84551012f4aca8e3e0f256533a5b5566bedbd17639c6bced467ced4a2a880172565479f8792b23954adf0c252a9085dbc6851a908ebbd18e39cf3b66d1cc775b5eba8cfaea3164505bc28293bfa3c9494cda16a8517964a45e8e2458b4a455845305a2b0c2386a8c50a16183144cf715dd7799ea7b5769dbcd6394020ed023d48e7905ffd3eeaf3fba84551012f4aca8e3e0f256573a85ae185a55211ba78d1a2521156118cd60ac388216ab18205460cd1d390c19163cbb44043070d0c322dd0d8ba9229d481b6d309a9036dd4a2a880172565479f8792b23954adf0c252a9085dbc6851a908ab08466b8561c410b558c1022386e869c8e0c8b1655aa0a183060699166868162fb50b0001f8a95d377eae7ce7ae5d31bcbff094d6aa5d317cf569ed8c37f1249d53bb660af0ae5d0778afe13b4a69f560c0047cd52e057cb5e13b6bb52be62d0bdfc95befa53eeff57a33e7a5a8cc20a1c5fce84906f0a3fbd4f0a3d70af0a32b39c08ffe63c38fbe24013fd21a05fc486d18e04698e1473fc28e612500376cbce042cf8c1f1df684d389440241cfa3e1478a23801f298c003fd21c03fc486308f891ee2ce047ca436fb67ccc020316a0800420c0860318a00035106000028899a1816506f1c6bc0b2fd8b8118095df110300fe67c4ccb0f0820b376cacb048914a9d4e2412087a9ec9db36ed02400ccf715dd7799ea73d181000af358bef24a88240d427089482f33c1028c2334e04007ef41c2f62c78f1edb89e1471fc24344664406f9be021f62d3906961e3c801830e9a143f3aec09a9d49f4e2412083acda7f6436be8cb7bb6fccb4286f08567e16fbc0b1fc3dbf81d367e05002c6c0a1aae1934313a66606021c70b385cd8376ad868614586c57f2a753a914820f87ddac5e23bd08301597850bb5c78d0c677a15048e4c180332fd2ae175e74e3bbd148bb567e94e23b49aa2412f54922819e8854ba3350d4567e9c4a6afc387f6cfce8352cfce8362efce8af1b3ffa8f991ffde6851f1d88eb47c77942cc8ff3891d03b7562c2d56f8fc7fea74229166fce839347ef498cc8fbed3c28fceb37f74190c3ffa4cbe4de182e185997dc3851658b0215383c60a8b192c31625df9152d58562dfc301f03c6ffafb048d162c58a058b742a753a914830be33f160c0186f62522a954c26138c3f9d44dfc9937a72427d9e9c6813cf7462677460fc387786c0fc387964317e9c4666477a90c8f871d2b6fc79c414b243950ad60a2f2d2e5e7c2a954fa7da8fd7f8cb6f1c477e15c9085b7c8a5ffd8a8ff12c0f03434475e8f22f565cb06849f1d2628515ac95c8a202ab44ffa9d4e9743a9d7830608a3fd1ae157fc2f21d0a8ace31b766f128ed6af1a8d577a99476e14fe91c33a5a6a4509f2929271eaace2c993536e28ff3c592e2c70964c5eac729048b1f27acc58f9308971f67ceca8f920a5b3e06fe535705f446df4fea7f9c3be18f9347f5e394a9f871ce583fce9e961f274d3ed52e2d2d58b0562b54a46051892116fd8ae8f8bf9107aadc1015a650c2ff8c457af481deb5359542a1b40be5bb940703a63e954a49d1aefb293ac7dc2310e5eb3ff5f95f531e9d614962cbdf9208ca8f52268da07e9433d993fa512291349944fa482852b60e142a9948a7931f25cfd780afd3cde3ac6033e767db9470144afd5f980abd4785374461a9e276128ef2c8f63f85d2572291248d6c7f53580a4171943c9e38ced8fea018dbbfb33ffa1e3f25454545bbbe57f1be5b59d1aefb2b3ac7f46040d1bf768dfe758ee9c180f643edba1fea1c53aca2487d8ae206a2c0b7e9fb4cb5dc8fa7df725ced962d636cb94919962c65cf96a3a46d49fa51d6b67c39ed122d92b248e2a8450486dfef71e5dd4a52d66659a60c4bbe780be9e28fc551c5762aae54ba154fd298390382a7d3ff6ae5624b177b9cb15794e52ff74aba2c01ceef70de36d07d7a69cc3623ab0fd3fa307d703e4c1f39c5e3885cb3297517e2e50a8eb58a5d0d41e701e7aeaf64e71f4938bc8dc5faaa2f1daaf4bc8503fdc9a0d31ffa936be8914e7aeb5e196615acfbb0fd27c55603dba7a4a91bdf4a7fca17fbf7eee01ed53250eaf5af952e547451dee9463ac932926e6ef015ad38bb3a12e0287d6ea02c2ca55c01d42e1773f0163dfd486b2728f5a98f8c417dfdfa9231a4af5f6f648cc9d747853c50167d94f0243c8592b24c636ad7af3f658dd2d7afb2057efd2c5ba2afefc956e8eb8332c67efd936c8dbe8a238f8ab373b8010720fe51fae4e0e12bca038da93e94453f9bc431832051fe8c53884dbfeb7448b70d411ccac218ebb06edba65da23982d5d3a1ed3cbf81e7390dc00e7b3af46dc4fec0bbfad0989c41b0f3d9f48d6c2f0746593b20041c50fabee4329101671e48a1942c902869f2fe01691cde06716c00eaf012d99c07f395c7e05a87ecd302d866409c198036b481b2e87f3a080d3598dd6b63c68c0bc200ea1b9267db5a56ab2d1423a45db81089449e4e8138a79388457f27f29c06e0987bb40ee8c1647bf4603d9bbe480b609bf1609445df8379447839230f461a6990e4c180e093b48b07fdd9a2276997e85f23fd1132431ef4678786ecfca3fdb1e98f421026806dc68a200e65cd009c3f8238a010bea21f0a4198768122887304589fa4650c340133e87bd08f3ebe504a1790287da5c5eaab2ab7e7c1c6ef67d3e73cd8a6238883b3fdafde919f87b76ec8c15b5bea1ac4bed41567c6081c2aceaebe92a41bf7c1fd928e983b7367d680d24fc96a2b2bc7579595639db25a305ffc85d0d13906a5bba4a4ef4f91fb633d95d0db38ec56a26fad0682a2db277d7dae0f0d6f9290db27fad22e4d25dcb60def91d90c098abe3db74725ccdb869708cfe531726557a612e2edb2a2ce1d7277764c9e4a78538ac8c9d1b9b11bc3a10ef8bdefb81e7963f13dbbf10daf10afa22f0ece855d984a58f70571f9fe78dd17907b513c9590ee1b5a287c7cac92da12fb637faecdeb5b736bb663fb5d8a57a58a83505e25f4dda174354c62693495706efbc38956d4b6c7f69c4aa0fba05528141a79a6d0b46596c7eed81dbb1342d923286d6776964aa54aac927496c6a2924e599d94b6311b2379a6d024a588146d736c8e8a8a76dd57d139dcded8977dd91729246d15aba22dac888599c2d12e1999322622f3c5148351963f919291eda00c967ad377f3a774f93769977812be288e3ec2504a970f6bcd64d241aa4ff5d9fe2b2926222622dbffa471d8ad229ea042e9ab1471cc28e212d989c661b748bf29668a6d7f949448c360db7fc5daac685b636b4c4944fb75a5d142ddca8a766da29fa1dc9873113dae1873604e3192a2ab0ccce19150d7599d210975ede93921026e51571e95f7faa63c2ebcef85db9bc2cf7b8edb36bd7dedb6d1d66d349b588ba835673b87397a45975eee5eb1eae01aabb13a44a5eb4edd114511b4516190ef4f6110d0a38892b24e4091854557182ce599429d2285ae38382940bcad42d79b1b1b5653d8ed15babe5e2b9e29e456d566a56b4dadf14ce1b64b34d61296a63f3f2ced123d4b7f277aa83008e84f6190ef514ebe2fcd4cb2d9cefb0b29889ede446929146956b5fb641297782a1b252c34add55ab468a1f24c21e6d9d9d96971a485a6b3594b4b0b8b670a2f8ce2509c161d1a8bb9b8b8a4f04ca1a5353f3f3fd58502d1f486aeb0c20ad569dea31f7b8fbf0e5750b282f69a9b42ba71b843f6213b3b4e84c779dc88cc652fda67457c85670add6194e539a22fb982388eeb9f2ea2d0858eaffc5d688f79ecfe0b96670a027a9198c3128dc6a06ebce6b0c525a358b3d1a107b8c15db9ab5f00f195ff0bed37372513d24814023f90f63ace04ba8f62d1c293ded25bbeac5e26b4e0c0538a65cbe01f5732db8f2cb67431c30618dab8107b9cf75bb803b8f177a127e6babb30086843e053f0bfd00f2e664051ba8c1f563321f100dbded1878f8dc5d17e77817db74d6957e58abe9ca2d885414cde929e9afc35f98fe4bdcd0fab99ef7f7031337a5068f39a3163f2363fe41923ecffb09a21cd9009a9060812489817deab63f15cbb66c89b8a11b88fefd3f0beb557f4eb7dc523fdeeb18fed89351dcebd5d000cad94a1015138e5eacae9a0fa54ce486f75f6669576719b4aa5d2ae1d788bbeebc2b93bef3c1127b5cb1347fc5b04f073df0110ff563f84bf9b9bd621377e95a6c1a2fff0953fa7d2fef2974de6bed05a0d6ccc3d8ba64921a783b6b75ce7c2a9b40bb3b0689a1429340d1e70a10a55a8c20ce8bb7b8300e7df70500aeda22a565a5c3c3965ee8f377b75ca501a52771baf710731cfd6a182bb0760edc17900ce25f3c75d56f0a4b7380ae2b82be215a89b2d3d66c43ba51a8ee19c2d4fb454a331a61765cd526dfbdfec0cd234795bd48d7dfa206deb307174db8a4450a142850a252af4acd556b0607930207d9676b1b46b8a41f25b3bff8653d91e3f9849364193a55d54146b4a80130a5ff9b3f4f4993e2c5a589efdc1503794657ac9b6bf8a591e3f1cdd166b41106b02d866c49acc85fa942b5e5cbcf0a4c77c6068e5e58f648b7bf92619935fbe4ac6805e7e0bd9da5efe8bacd18536dffff0339f68c4fc5a7f7ade8fb4cb9be24c32694568221442310af3258b3fa3aaa69e0074ef0b18f8e2d0eecd12e1b0350d8843df9c9c49c2a5b6fee6c40ac3b339fc8870967f0bfd72aa48c32fe783c900a43f7e309fcdfd88bae95e5eb48b87acedf92fda35c58f085f390f964d6ff8023a393dedaa9607cba63ff15ffaf883f9ca4525493e22bc8583ac7db02fc75b72546f773b59b3b2b6a5385bf4ec69d1f75b603ce92dd2b7e56b29d33d17b3fd286531604cc8f49a329d689281ab294ae9f2da1f8cb240af86b260782fb47d185e58a78c8767f2c078f142bbeabfd039bc906e108c857272b8505412ca007daad7f67fa171d88dc56c82ed0f03a3edc7d039dc1584872626cebc993731627832b4cbbe0c9dc3bd20f9711804f45bc8815037543665f2cd7cf137c96e70006535a1c4a26ec425fb66ca8850902f3fc02a8a51b80c8dc36e2a8ab521b4eebb8821c306caa2e1072ec3d29f2d3006459235ae949936b428228fc1b50e59dd340c02fa190679e519d0df30c8eb34037ad40d8d31c928cbeda36e4c321af3d1b7a249064e938c0492e5ffbd608e60fbab6eb6fff819b1fd3f188df9c48c0269baf196e9456340ef2fe7b7c77c33e63d7eb0eddf1e451310db1f946f4457d964d58fed7ff338146bdeba1dc5551c2f8efbdb06f6d5a16e9a2255186e18d9a3b864fb8fa89bed6fb5ab72a05e4d5341f7b71879e50c3914edba5734c3c68c221d0d0f06e49e46b8ed8a5f62fb3502f6e94f7b51da75ef8886a6b1620c9146915c43bbe8112ca35da2f8e36d6bb950fc116b380890fb51ace51095f8caed6bfba17eeb3d0bda35f50cb6fb50bb3a1106683b6bc5d4c98b745e27ca8e050f636c83c5867eb94525dec2e1b4e9fb8b35f1c75bb29a8841f29be8d38c11389cb61465f4eaee1c8a4a9ce56f43e3f07d45b1f60270fe28d6b6db15130b24163418d63fb5e0b5a073f6664837b7ed0e9bba64d97741d3e4f928df89da752fca0d2d8b80f3c3b9b79e812279020807f6fd3b6660cf70a0fbee8374b1dffa40d0a7bdeee3be2d7ff8daafca18a0fb13dcf259cc7ca03ea60ff5e2f90225f2908b898078080feaf1f024c103ee2be299f760866798e7e27b797876fd6e52407f28a54e1d069cf329add682ae290ac15f4e77b903b0e69c31f7b903d447b28c1ecff6efa4745aedc599eb3c296b705e9de0b9a6220c90fa6c1de6ae62eec9c10efa81216f0372336fa6101367e21001f3953f2c34f37cbd44a3da23075ff9d77af0953f48f3f0336d7ce5aff5acd9b3757fc6d8e0ffe167b068c47cf037fa7713e5772693ce6dde39a7c8e3065fb953fb94754549b7efcebb904f49abee469ead0149465276e6d49a4b075c800d5edbee3f6bad2aa93fdb5fd61a046acd01be32313129d5dc4359eeaa3580340d5dc93379f4c7fc23989138cb6dccd041594e83d4c064329dbc65b58ae1c2c5e9743a99a9d389e5ffe444bb4eb4cbfe6b7421e07c4abbdae342e22ba7b9aa987b8e0049fe9f771de8ca1a9dc7b3a5ca529322308dfaf480437d76407d9c407d74409d407f72407fe80ff5a13ed407d35cca5cbdd39cee4e29d52e1e95a4019f8a2304f9b6a68717fd11427faaacf5a57c6f02943ca410700437c6209fa2f3a838d3479d790a5e712ace9eef74bb685df7390d9c064e836f8669950718a6358169538ea18d69590e01ac5f711242ddc622ae4917fa3ec3b5b9475cc301d364c6344cfb665d8cc66c790b73dcd7ba427dfa76054de3fbe5e514ce7d55f0e2a2cebc50299e4f87ececec3da3337b84dea7f6e50bb5d509d0753c167b01064ceb265917d855ea795fcc5ca6d8ac62538cc69864b259b5f5d3347916d22e18556c47a62e5cb8a02e8ac8c9791103060606d75a719dd14e2f9aadb6c268d711a03bcc61314eafed2fa37e34d44cb6e2b5e246a68ad1543155aca58ac5bc70d189c3cb32de8fa115fa638a9697cda442b6381652a6be7c1729635f7e7742fd69fbced3b6765f9f7a4f1f047e0ffa4ec786fa0e7532d1ae6df35c08d4c971c00fe4d1ae5ecbe52468ad5cb69b8fbdd93aa9cca1e3dadd4dfa204a73a05eabadc1ad5b87273d06e3f04b12a35d39871fcdc767766df6f195d392cc6a7852e7b0b5d65af35b1ada453f871fcd57aed2f155135a7ac797c45b38c8da47f3960f49bb72c6b856312616a3efc7d0d88a6f969d5e34da4b46c33b33c6826743d767c16b7e7e7e58b06143bbf2dbb833dacc2744a3d154315fa974423c53c564dbee2be626b67f0b2de8fa2ecc588d62c6663299cc0517bc1b17d3680c6a767a4d993ca365da3dbd601867e3a874aa2a36530d994d19d51146886cff2cceb64a88dfd038ec13b60c0076601cce1bca9aaf1ac818e411ef949211b5523faec47c3faa4e3fb6d8273fc2b04144caa41139fbf1a5fef8c2fed8b234f6fd51668e48dd0c2d0050a21d9a668ad3a6d63dfa94205ffc4121aa0892e5cf85a824c8953f897eb42993dfff5b026a4663f0fba37a50349412a48c0fb63f253281b0fd3313dbff533521e76a3569759141e3f0c1f9d85ca88ad10d9a73c6a06964d03453eca1cae0db24a33138cf680c163f1a65f9d3b607c12fc29fc27f4b6f7a4b7a93af23fcfd0fab199b1fc019f043e18b286bbf561bf6a8a81e5fcd7c950450f5e3479b6dff18958e8be138b7f834dac5c212aa6256452595e253cff25d8a259552f12a1e001e0cf8ffa276fd9fd0c440a375c852d0a45468bc6b592a8b0803b42c61b55544ed5051116bf0953f8da661a6a211c3bfe15f121d7a47ae0bf095bf8e1dda854285aa984aa7a652312b295fb747a12a0a3e25fc94afdfc5e0c1802929ffda9522c2006b4a358910b83bb4035476689ad40ecfaa62de42e9782ba5aa68174a840156b147dd29226a476a879a1279d4bd43dfe0a3d23bdb3f06edf2504e543fd8fea724b6bf6908dbbfe4c4f637510561fb9366db7fa45262fb8b544b6cff093382600fb6ff37647b0074aedb3660bf9df56ee2585ffbd83abc5f6fce39cba0697256c9d9247f00344d167b0440e72067a041870c95e25943ae9bc18301690a890618688809c09bba6ebbe6bf2899aa6817a52602d03455b461059007a05d97069800da453b3a737ed58eb736d54ec55ea8da51c5b61f553195ce76b9bf8f431b8c6ba841bbea6541b1f8caff7ef7b613bfabc18301ab7842004d53c5964b80988b005e0d553adec2e1a48aa976dcbe09bf09e74c00958eb3fc6b1055312780f347556cfb5b2b9e142055007d3ad5b05e158a014806a0bbd603705ebd6feb6b9a69294dd9a069a6e8d910f310406d4580a6a9bb4b400cdad5e246fb507d5c1fa60f8b271335c8f85e2ce2d9917a71bdb5ca26bace9300279e6d7c644bb0566b91005d6c027f808669a49837f366b311c4b39cf1116fe6cdbc9937f38e78b3969437f36632003def88d7e3cdbc19291683aefbe6747f905212382ba9e208614e9753e61e70a8cf0ee6bb9c52fa404a6be79c93064156a4489122458a14995be6714395acba6df6dd07ad5d9756bb441159b55489222626d6d26a65d552258a2851c47e9d3f30994e276b69b54b14a9962a51849e685795525a4bab5da248b5548922f64932fa13047cefc53824bb7d455c932e449019df0b84bd44905d9c33ce5896f3668960738cecc2f3b48bbece380c026e13b76810f6f9aefc40abad9733c6a02221d18804fab47dcf93828c5aa93825ab564a6dad9bb52fe8d75aa90de5ae75b3b6d64aa9b5f7da7a696d8177fef3065f01c1fd7baf659c71c637e39bf1bd19cb6432d9bdb22bbb3963d9cdb29bb14c26bb57766537672cbb59763396c9ee955dd9cd19cb6e96dd7b3396dd2bbbb29b3396dd2cbbf7662cbbb29b3396dd2ccb39cbf0cd59866f96e59c2f96657c6532fbb6ce222ec6debe627df98a097c6f10b5d669ab38e5ca5a5aafb596d2aff55e3b7720257843359d4e50462827e1c954ba265f0814e15a4b207d4158ceb98a38ce15fa3ef08aaee88a42e0676416310927e84d42fb4e606b50badc9fda05e6400ab364dd9f5a06bc412071e4613499f83cd8158931e8f01595fdc0da258a585908fc942892f31245b22c047e4a14f942a10f043b258a84c04f89224b149185c04f8922df93b48ba45da10f04af4816023f2548454c40afa574d137288f1b72b8f85e3d5202f348d99cee9476525a52ea9348e40c1b3172de368eeb3acfd31a04fa3e100c8544a218a45308fc40233df23a6e34da463e4b2b1f7dd82ed2d509a4800b2ef29649589b318fc7030fe64902f34c9f3e5facf5ae10d0df9ba41d8023ed6902a4800bb9cee975ce7777777777f767a9a2ff0d97b5eaab6de3b8aef33c0a1a7d6cef06d4e12b692407707b0f9b7a38e65d6736a48dec7972eada793dbc3ddfbd49f27ca5b5cbe77c7777771e27d0e78544d44553b481461fdbd32ead5d9f76c9255b3e087652864222d168248f6cf93166b890249249a96432915c27f0e444e770d085a273f8ee5020140a8542d94a1d35a50968f4b13b6ecb1aeb6b2bd5dae70752914127594616a71b36f5789c36671d66de1a703475524b3967476bd5aefb55e7f05dd227a8d34a8aca77256fc23c669c37aa950d489992ce7cf1177f9455d8f247b944d6c24ffd28673bb2d3c98fb2078502da72e3648df996a69ea524ca2129837f1c6df9f9864554659d29533242634a33caf217459d501cc11753e20e6db56d2729e79c529a5e6a57e945dfa578d25b9f4dfeb1819ca07e9c3526d87cf1df29c2965f002953daf951fe984a3fca23a01149c424b3b1a5c5a76fd9b29333546a8de9a984a19d37fade04d8d130ff286d4ee7577e79d9c3e17d95d0646f7506987d6fb55682968034fec13fd926d7e41a9590b46d88a1f0f1f934aed540cf5309471b141a713bae83d9578cc0fdca614ebb3076101f99cd90f4e01e0c6a4ca3792aa168836ab76d9d765d1a2212d29887473432120a692cc33291766ddf691ac9835dbfbeee345775e5aaad55c41d2e024e0fbbf95e77efad224db3895847a4710cc7b8cbfd8864b9ee867888765d51a4f1ce4ea9466350373554a936654cb1d26cbef86753cc042bcd7636b8bbe9c180271fd22ed487740edfa7944799d205e5a576ada43cca8a38fad82a3f3f2594d2054594be5211a5af4e502a27ef6f8a4d19d47f271571ccb01371861247950df8d9cb5d0e696f848918690cc33095f0db26258c8190481adfdc9034c6c1382a2108dbd4e01afcc344e3177e996897f726dd77214f25d4db5442dd9476c0120eb68bc450ac79dd97c46aa271d8dd8901b25501b9f2771e86902d0dc81c6fcd1a87816c4d0fc898b7e6cb85c8d61481dcf1d6bc7124646b022179bc35713c09d99a414899b726cc9990ad39849c796be6b813b23561207bbc35637e04d99a4224cd5b73c799205b1309e9e3adc9e34fc8d64c42d6bc35651e856c4d26e48fb7e6cc3315646b3a216bbc357bdc03b2358f205fde9a3417816c4d26c81b6f4d1f0742b6e61312c75bb3e641c8d68c42c2bc357f7c08d99a549039def21a87816cb90764cc5bfe7221b2e522903bdef21b4742b61c08c9e32dc7f12464cb8390326f39cc99902d1f42cebce539ee846c390ca4c7fc08b2e54224cd5bbee34c902d4742fa78cb79fc09d9f22464cd5b2ef32864cb99903fdef2996f54902d7742d678cb7bdc03b2e547902f6f39cd45205bce0479e32df7712064cb9f9038def29a07215b1e858479cb7f7c08d9722ac040b6a807648eb7688d0b912d2a0219f3167d3912b24581903bdea2373cdea2389e846cd120a4cc5b14e64cc8161dc209d9a23090336fd11c3f826c5121b2c75b34e64c902d8a84a4798beef8788bf238f7846cd124249df96a3e0b213db204356243b6e7671e74446478f67cf006a3213576f6fcd311281d1ab13dff5da02a6246ce9ebf5a410b2262607bbe8b14c008d1c229818ca4406484f36f80e0851f315e7bbe0eca811dd40686d6ecf9344881004b60fcecf9364041014a5ed4f67c073ce10150b8f0d9f36f50420492bcd0f6fc1cdc081590485608e7f330040d1c7199d52ce101232db2170f4440a405cfcd0d8018c26207e78820745831980b8628629593b3021810b102164b81102154e0ec94000920296e781c0449f80f167fc99c034cb88dca6b6652706289f8d303852328096bb42730018af7f151c2134956687bfeac1961468144e56708930a475266354b78c0484af6e2810888a0786e6e00c410941d9c2382d03989c15c304411a79c9c15c08008132c960221429470764a800410931b9e098224e60fd27cc92607989836a359339382134b443f3d50388292508df604264001faf828e189249fd78ce051200185f3fd67084e85237a56b38407644b4aa72fe78108644bcaf086061036b819382f8288b1b980b18668c9ab9c10062cf863274252f7b413da48c896944e797cdb4978359c535226644b4a510d0b3e71a8d0d91821ff873c63848772bb7d26661bb5250f1342b6d433d41dc48a377cfe276b4c09a21bd0d2fb2ce74b96e92ee86c1e73cbfd67ca76932c5793c7a63fc795ed1f1aa9480014a5e0f08552130081a81cf48742010f74a243a74f15e03c538fad2b592073263be08d74819b473c582cc240bd19f011dc1ac89f3f686ea0befefcb77748e84e5250dbc71269bb684bbdfd47cebb2a532fc5b2855cf95f90498b945c59713cd9fef96f9857177f8d00fe95ac21c51c52d690b7d21074d6b6dc5f6eaf5eed7b15294522a794524a29e79472ce29e59c73be9453ca39f3367dce2a6595a2fc2ba59c37dc8f004a11f495cc73d63967952e523eaeb3925ad0d1b029f7f3b38cd97e86a38b2dc18dbf1d01fc770b579f79b8d8d341e063c896443e671b8ee2963e6d0803de9fdc8fe026c5d17eb6d3da6dcbefc43187b6bc275bfe268ea77dedccf7d679efbd3fefe3b05e2af29044f6fc6dda21ab2d5de0195be2cf2f7fe3af184f39254b7e16e7fc3b6b8feb2ce866ae7f455bdfebe35cf1aef5eefa58b472143d2a9b940831f4373c6b49f9c03be2cd7ed0e2a6aa744e95763d76fde97d0d79785b5beb9e3229ea6bd8a3eeadab373195ceb5a0fc928866a7d7ccd4a15c7b2dcc4c450ad248c9a74c2aa59f931414d1096552afe572a73d3ce74c8598422c299932a61f34c674f3a3a444451c419358127f4cb050674275f6dea4f3ba7bbbbf9ee7795d0aca096994fa0e04c196580a0a8d2693c97e7e4e4e287d7ad56b33e636af13a54421de77ce1729e79c5eb79d5ac00e7ba230b431f79daae38c94f6a6b34cb6fd41a2d0647399cb778301abb5d7ea215ae79dbc9389649e58e61185a45dc35c444e2ce7e8c472ec1b7922bb71397776fb9c3751fee5f2f54fd3583103c937f9260b91716219271391334c148aba10c78526e76997a5a0a69962b6e16a6a42a2fcc395419d5fa19076719dd6df6dbf7520edcad96228c4eaabe913f31171dd6f5e67ede74d5b8e8613f1366bb15ab5d55abb24fffc9862b12963aacd978f4659a63cabd16e7eb68b4050bb501e3c21fd9cf34923518a944a3d699412a552505229b5079de8a4c48f9622a250c45145e4cb3983a224988645e1b74926171ff1958bb319125cf24421081389c54824edea9ea473f8ee4e9e28d4fb8442cd4a3f5306f553d0e2e69d44d4f6248dc36eab1ab289437676bccdcdb00e8ee15811dd36699c13c33998086e9f3486c144e1b66b8881c44e62a230ef1a629b9a58cd0f148d5fb1172aa567e0c41e62b5016f49bbea48bbee83b48e1df9a2ae92dafdf91185379584766950f8f8dc50873cbbe24a7745a1b5dd3de22b4f89a5c45eb5c3636446c457ce13e3312293892e1130d82d22274727168b0dd9d9f9d72efbdfb178a9140e1afd0d4f85728be68f36fb42e0e08854313b0bf5bdb911750ba3d128c53b85a6fd636bb5dae8feb8af142952944413ec0695a1b03e3ea7d044854da2425b9aa5ad58a15df657bc676596c7f2581e558cb4572059a16d4f8f770a47fba3997e4c9993cd7c39bd4c3513cde6c7ae9968f3f49d89c99c1385a282323dcae451af124ae96212a5af500f0a6dce077399a04e3a8885a9745033ff938d4d4a3c09452871540d39bd4c3553e964a2d921766727f46a6885106d96b638318ba3a23b5588c5dab0685b53b3229459d81faf9705626fec8d6a09b85be8faf3b342e7ef526c61fe53f86ddfa1baeb7dd77922f72b344dee46dac571dc4ad364b12659c5388ea569ac8b52ae45d358b1b6e8eae3a3a445d75aad458b16a08d72224a51c528cb5b20a93db5e714ea2375365b61c4db2fbaca565e0d2b91b0db2e74e5e13985dc0b557d1163e19dc26d9b60307460e81a8bc180d1e2a19c88524c37a71765ddec53c5a9a8aa8aa97442d4ac33323ba1ac27be608a80d1352727468c182ede29c43fb55a2d46fd1143d7970c193256f04ee1ed99cd6632a090a1a98f4fabd57af14ea1dd89c5622d6aa4a5a98cca6262b4cb7e8ccee19bd68ee2608fde684fa5d3c5d022680ecd99e10e79d35acd97f84f0dada13f6668faa2af53e8b01ea7cd5027943e8552ba10511d215ffc4f421a34b4fbf8d4a8a15df66b684f9b60baeb9e530dc95325447584eeaef56a846ea48676594c26c3a25d37f612f6c982dd866d489e94cafc51357f4c81f2a38a2d57decb67c91a272f4fa16f947007709f7e863a506056616fdf23efd36b943e0977c89bfb2edca185d7a2837c9fedf7a1884e0ce113553a72c2cc4aab5cd9971ab768d7663bdb424f21dd5e1824f4d4869e0b77003705f0929a9a8d22ead003dc278ff2a050caffb09a3142871e600e75a000ae4215aab075e801eefca7ef71da29914c5d9493395fea7ce17ab002b69ec7c3175629c3fea43da04229575ace584ab18b766db6b32e2e5e8be6509e9f78a8effe2494d2a5ebb847bdc77df7de9f4294a8bf45d37061f59527b77e11a739ee5d340d273a11cf453b0fcf0ea10e3b9cf6ddc22a57dcc6fdbddcad3b5f391d14a398a814ca1c6b8a1c239a0100004010008317000020100a07c5c2304cc268ef0114001869a65260521c0ba420056110c520848c31c40002080063006666684801f5136e41a15706d3345bcb8c5bb26a9ba971362d336cceae45a696d9db64aa2034891fe3e08ccb636e4e733fc2f9592e0f7038c9f508b76738acde155c99eb118ecf707594d361e25954624b494b05ed5062d148a75c1e7175566d40cdb3e37bf20f2e4fb94cefb0ded3cb2bcbec51501699bca1ab16110e4a64405baefddc168fdc28bd6fd03d0f5b77add8380f653f4e451475f773117c5e19ecfc1ba98ad900c573f3a22d2aa7defc8aee5f296807c02712d0b25739b238dc979772c1e38c7f114ca29d15a1784bcae6eb48b35741a67354fb2d897e54d80d2743c678dafc9a83f17582b8bb2a055200b0c3e84091611f8b80ff054993fa6c3b423ffe28d64e7d803097c5bc27039b2ccae446ee5f09fd9743df075be90d591feae6747d041e9c09f269d1f0ce9c38eb88f1da723fad2979c7a5df8f537706dd1fe87372fd59cb3b14cf7b5ed5ad6202bc95d2726e3f22198d2085fa9e193a3ff09f43964f5a762d417b5d88bbaf716e17e233593789abbb84f6a4d2589db2937e6ccc935c1473538b9771e05eb9555804fc0ec878a40840782ef3140ffd7e4a8066685c3a4bbda3d97977b697cd74daee279e0d4a77db757d9153a67838449b70130a6c1a80dc023b100888932c4cb1ffcc475eefa0342ac7f66e3419f9a78e773a42d13ea52c2f1dbc283f818ddcff44de7731a8916788a027f354e822e2dad8050de23c264d8ef04dbbe40d1d65bd281b764d51f8362e7d3d2af39d8a4254465ce82d3630cce82f12479f384a1b87c2bd44dd9467328d575a489c11760114e11c56d0ae36c7e27508a17e4c356a77cbc48c62993aab364dccaa661333bb6d6296da3635a3dba6cceca68919bdd1d48c6a9a9adddaa666f4a609b37a76db756244854b1eee39b57a30cadcba43684e0d359a412cb0ccb150bf83bedd2e058c510d40030162f6275b6243f0235fd2dc34bd2cb25e9861df5c36a1ad363a6dc1a7cfb7cb44d6cb171a9db6c5bf37b66976e0eb17e2640ec43a285c03ea6d755aaac069a514575916c2d4740f48d172f27c0591b449743e8a7be50734acfcd5c34f31ba66a318e5af0ea37fe9bf3579e7b78093b5288101972bff2d3e5e113fe53bb724150007758020af70468f614b51b9401be6e872ea394881e4b7af242a7b517b2f32758d12216ebfc016b0b07567aa53fb04119c557ab6fb4fd38426cf41a122470fe6c9113047a3fe1d9d7230a171a50b946d25703b4bfb5458a55bb7ca5c80222a03d6c5568025b502ddf07bf0b9d7c3ac7ea3c1cd4924393d501de59882078cb7c880490d5aa94aa6cda473cebf3d1144d05d6af00fa53cd80808b7615da714c5453eb374e1bbe26eef776919754b39379475dd72629ffd622050210823a3a47d2dbc871370bf6e880af5d95262cb0b36edd91500403f2d1ac556d643ddf1a263f52b32cca2497518ba891c2f9631298948ab960772fa6dca96f2a4dbfde2d3e1ab89d01063c78607aa6a443b55f2eb7d000ab2c00a080da1c90e9c8563c19847926642c0ca3e6c2dcb3bbdb96ed7124467c8b3d5be11a643e7347e53008a8b0a725625c85130a48351832b5a190d7ecbb7fa25b9cab37f7e8bb38cb4da1803e84abf4eed5c8faef18a8029faea070c11e2be65ad513f25c64f30922770e587932c5518d9a27dfe7293f81909c6b4b02e355e0b460965ce0f28e0bc55db8fc31d6ae4578bcd1103bb965bff2df0efb784eccf4a8d6106fe9a1bd89e85ac35d7524e422ed0f457fe415778867ad0a244e421b502a43a65009d0920557fb096c0aaf6161bb1315fb915d26b4d8ee7f6fe79c3b8e769d2a58072b5581eca7543c28fbd440153deb1481b2d704117ff843592ab85bd77684e46094b3fa824c1aa73a601aec00cf073da579645ad35228523de488d3dedf548b580189e76f8af1baabafaf2387731b9f6771cff5d1b3684444d3ead82d48945d34f59dc6e0aafe9246cea973ec01b49a0520ed73dd028398b9fb7b151493750c0e5f8fbc3ad412a73fc6c9d4b052e9fbee1e0f0c1d8dc655ac8a236b3f187a40db71c637aeba66cbb12d9c839223b239ca33bf3ed57ade3f237eae19f98f8256c26fc914b781a2a32364044c7ae08705fd00210744513e6628c113d30ae0510f8f58bcaebf8dc687b8848b0158d1f2280345094129e2074e7870378b9e50f88fd86debc064858700ed27d5d65c1c422da2c69962a93031f21aa17f61532052540dd750913d431019c069bb658a8a6455d280671dc0e32910ad201d6bde59ff82211b5b44c74adaa71e1b71a1dd1d7359329be8eecef532a24f7293c9d0cd1a96c8930877a9b3d75d40544c4e5539092ce365f2e005ce505f9ad4f76e4f8968373bd147af60b3a94ec65d46687a7b0027514f8edef515b7efd2d6951826f8cda9b020dbab9e8e157caeaf8d14e8b2bf92375d525f0ae69e9564e214f0d37f06203d51676e0f457ede83c05d30737a45cc7dba3d33d94c781fae2a686427c02fcb82fb3daa023be47fb5951fbcb422578af4351d9dc242680071d082a864d1611fa3756c8680921350daae283279a1f7858645f0ad5416087300e185c98aa03b6537fc55416450d9481e9282c41efa363ea3daf2bdcd6ad50f71df663a3a13c60534924ac6628f991cbfe7c55ef255966972b90d543fd845aeab2ba46e2c6f51db3e8b735b1cdc23685a5e146e2d52f3c612314666fd71a0baf41eae1d264e643e67ac9882c370d8f10c28527b906104f346b8f2cd87b75140e8fb10935d2c67b59409283599d42ad6e1f549fb13acb1ad6e6ae7eae6120f14bb6fdf1a477fcbad2fbb32062430a40e7ad7d987555010640908fb1bb4a68ff16c23be0fb1024cecb626c550f9c76f73b34ad7d7dc0189a034c476d7bb08d893aaa44445b7e90c21dd11eead8d8a13441ba8920768aa0eaa41c58d97dc18f0ae2e013fa9395ed59ccac6bddb46ef39937d154bbcf7e9d435cf6b0714943563d17b919ecde5063691098f8da0c6c5fb182a6be79d6cc986abe6e67bb3203dcc76b6b067fa95713771bcc474a58eb36766755eaff682e11e215068131852c7fb6e2267d24feba052b707d99115d186f1a1de47b61b624e2500e5557ccfb9d60f90f2224a4515b587e4c433562faa3ada9ce8d24927257930162324305d987f0ed4ac25d5953aedfeaa85b89059f34d2eeb7bcafebc9b19608f8a42a926833470e90359ed2efdac9c1e65dc8b3acd72e90e2d1b6c5be856bf96de1ce21796a40f4fac79cf8e9e6187769b8dcdeff9a042ec1ba4191a95364eb31714c20a47149f6c8dd61521e6d545e7c40550eb0377543a12cbe9591b1ea4e4f04d67b3b9b6714fcae8df363018ab83a4479f9c7c1ec86ba8395bbd9033b1d54b98bf4b6b45a37b2310643d05462acfb72586775351b6f79c5c2b1d6c928a2bc906e9096a485a364ca56adb6042f6c5facf4adda4a12da3b05fcb952a597d908c22da621ffbaae01c644ba197a249d34a914f2487349deef52d101771c3ff8a91f0e67f78663045dd234391fd4a4508a7725758e83b7b1e5dae84079545c2ff257e4e15acbbd272a53c3c35635195f672179dae68c08b0f8cafd416955bf312b0abf8156b5dd1a3c7260d9559a5ad5c0533d6b3d993c00137cc7893b33a5ee0641a55db674ea982c5860dd57493b8c04272491c6cb05567c2128c49a542c31e0cf0ecdc43a8c8634f3cd92b0a21db7279c997741fc09807a5833159c4913c8b8a52371d4af5a95b7c0b1a3359d9f9e0f8663fe4439b7f3d92c74c2fde7a12beed96477286ed3c97f72d0599bd8179fa1698448d78ddbc007dc8ee4ed1aeb385e402ebe4e93a356f04076f66ec45b045a2b6d2739519b8903544eb3bb3cec4835ecac58b0f9226f980bdd3a825918ff33d55f7028c052eda05e2abe4429a270c99596c1af8334a6fc2b0cdc2460dbbdacfd9e82a15e6bb2e0df520d33717404043c0553c5e8350b898fb5522e2ad52dd5b3d9d14d56ca34ac68feac07fdf9a450135173782c0578c465a90e801e00407f607f716f73acf0a1f36f73744f9d13f10c178725c0f7e6a97887bb5d7273bebd061a71f925379c8979f1b2d222914a977c5d07e331467b584faf2948f46e2bab167359bf1e4cdfe0dbf46797ea688bef6121e22c005f4d5addf7b9b93d718a524763a6c030b3dc2c19003ab428750513be64d123479c46e78b94476a5f625e48bd4e6ad0a0be76d1a57f46a4debea2529f7585fa0e457ff0703d1b2b8e1e6406d2e2722c9b2ef3125f2a144f79e7b3bdb4db0f995fa669bafad913b2d303e456927b975d8c9ff62e271307253c1228939a72cd85c89edb1ed8e2db8e024095c2b9b46e05ef64e50500074fdee897a180c399e5ee4a30942204837ff0eee1434e3fd2148866fbc11909e239523739c2b524bf925986c51294f6b0e74eba70ed04d26d72b3d484a37e2b9ec930d853ccac91bbfb95efdd98abd5333d5ccd5c1feb6ccc84b500ef7b647aa5a874975f8162b9f0bbe410b933bcc2eddbd546def9b90a172cc50e72ed75f7ecd3225c841ab32bd6ca474e5c3e7515dde330011418089afbaf56614568d1d1d4cdb6a2b8badf65ed354ea040cfc4b682343320603b522e0e4fcf9fdb3b0452cc07556b0e2d6b2856630591a30ae0a8f74d4e2652f8febd0b2c8d8ad0336f9c11ffee5ca7dfa901f40e4009ecb44956bd0b2ad822c5a4aae1695580beb1b09de7c3dbdba3921913b6edf383ca0b887afc2b6a24ad3f48e7d34e441c57779707f49b8b1e43c8c27a23796e550d63161fe3309014891eb4befc2a6aefddd47981f258d1384fed12ffdc5d863e194ed5fd65344dc269ad1a2f479603a09e221ba7454271574d8846a7dd8cf5d45255edd9cd81b23f247882626352c42568e0e63ae7fd78f85e389f2ac547b3c3bc06e2f87762462a94fd3448a64973ba2809b0b0cf35ad1fa399efbe61a62fbf714f9e246e80c72e98321f17dfaabbd172b29b00bd979386cb05a6402178184eb6f40c4f9e3e608324297f7445ffcf922db5bd40edcefa1afa675383360fd853fe658bc0d70cd362284c8f19f6531919238a14d06bd1dc4549f647bd4c205136f0e33a0dc335be0ef9c44bea9c67e95128c117bd067d5ad24fe19b6eb008d8f6ea43101521b832e4614df8a5cb41f86733716c20b394df6e3db08f5401b6a654c66daf4dc8cab92c91fc1b8f85203f172896555cf664d211f4cd4679a09b5cd5fd733d80bad65b5d878f530a17219b27075c6de1c34681548ffd8d6f25ad90919bf918d1c0e40fe65e1d7e1ce92aee6f494d71017b33271e567e9c1e3bad6813874380a6915e67ae96d42df1cf8c3ed0683891a069f43419bd00a06647b2a4e67681b0590860ddbc475715800ecf438d0fd0c912a232fae7c2030c29c2d249cb5e64daa079f707fd11dedd3605af20d800aa8cd4c649b12a3f5ef3f80277d3954167e739bd13deb5d55307c4ee507b97acca4001a16f08661caa7ac769f2af6c85617e60490df3c9fb6545a745fe277bbfc66e928000490a61b6e62f31ca83104242f9f383b60eb7d0515752445db7795fc3e45e657de808ad4d77dc2da9e7e4ee4c3bd2d0488402cdf555e157b520462a8b6f18902c679dc3b459c8579a398c938a2c4b6a1ed7d9a7391d1406e1db86fd2f1485916c675008f8e35c0e5acb57280917c527bcd335e50985d86be42f2c0a3cf0a5007d8dd4d686adb315ab565e0cff9159056c3f23f5246bf86478496178575a842efce2b7cf18a91dd2ea363b2fe5b2a82900620fe9304664aecc206eb6491d22b182da3182d48969efd7fd71d08e9daceee05d4fda26bd4b463df833bc8c55915173e28e797a3b7d3caede09eb46ea543b9d990cddc61d35682b4505b8ee647b5e38942b6971ea094c5208d4b07acb49f5baa1ecf3d4427a1a06cfb1f17cff77e5817b54f721c20b656c7c2c63f7fa07aa81351ec4960ca1219207488ad3ce9abbc895f1fd7037423b51e056065b88ebecbcd262830e80ec01a5e039014a7b616df8c51bc9762c65935c7f36766ad0ae2233994e6f447426d42e58807082338d99bce6584973a07076d7e9d0c24b74ca01a3ada1f507a912224668291e5ca1cb85432b81220cf1729a1aaa0cca4aa707a002ead50c79cc261acbe93947e944f7b9010262ce53a7a5f44e949794d593083ae9e695ea7ea2b8c049eac94565be80d20cbd73987e2215f6d9c4ff1bb6d066e74a2c4bf5da6ac3cf9063e7a4c79ecefecdbe278932cffad58ccc15ac33750d411faac13c74a64e35ac0f22bcb1482da1a149ba897791bfd011239d185b91b520a4ff7fcbcec0e23acf8024046563c5693d059444d8708c468c7e22c4e842af1e5f8d906681da6866b75df82e4736325aea7b085dfa4a6ef0dd62eaaeed95c784ddbdcdc456e653d9e0d42066061d1d4e88ab003a5a04e6c1cc09b2c826eef59c93dab740d9348dac3db6d18c90bf939592ec367ad487bf99674aed02a1d0aa39a37ffccccece2793572783b7415b39a3273ea3da9eaf16b59e603b0c79b11286510017322c5adcc13b4f5b210db2209fecf18341a829fa8161293ac30076ad242c132dbe054065484c1f48aa3c594b7339513279d2369d1f9a35c4cefa8190b21888c4242f30168b9693246494996c856e1b2bb9dc534483345d1f4eeec0302d35b60dbbdbfd95f1d0c305650b80808c33795abd19c848d1548272ed7bcc146ac2ed24f93d884560ecdbb130cb04fbf1605ce7b012cb19e3cada3e0262aa167ac8e01e80abcc2eb8c71c0322869e6d988f9ac7a9f2d08e25238f085a6c0422a954a18dc05b15a2022f6d46773276c0dca77e159ae318c2de142efe3ce91a2fa07f5118209872428252edf2581e1c749df3b09d7a56b0b9f0a2711050d1dc8f8d4404e7dc6a337f0867b8260ef444df02528ea0f51568803eb030dda444fefa8a64c49096f290164cdf7deb34df1a9e0e09970d2e02eda49468c88d4b7eb0527c110e2a71c12ee50dffb7f5f67af6e861eb239835df2b0be772356ec1205a3c33165ebb9a0dac5efda95dda92db62feab48acab2b17112a75b73f3738e75c6a948cabc0e27242b5478db8e4ccddc9d9291efc1d51ff1e9865f60c77fdd1cde2ec1308602b3d8571d6c323eeac9a8608f28eb54ec499743f081939c0a6b64a5c48c7c48ec43783e8a9de32e3e8e39b6f44d38bd31bf0f6be37583d52bcc46263817b7c00a543fa212b0b2c9d8941226d33ed4a92cdb3b6396a66b92565b9a698c49142836ef3e6a55d07c0424559e0a535d1c74246909e3a8d501a07a269ab7745f07890a0e25732b1fae6c18cda393c364180d91f57e74d34dc661ee43064df7340b5d7d7cf94bd5a207bf2269b17854d0535e5499459b1774056638932434194b095f15dc662c68138252b16bc40a2dd95cf52ce64786573b8e9b0060e6ed429b98fa351a67376319691a8a20b42f4e884a7355f0795e815f58ed067a86c1e7819472e48d35da0b8ac5f0f386031fdaa1adc163b1b6533dbbc55b2d941b43d1cf585588b6981331244c71aff4d7472249b11ada37635b9f17927477f672cb0d659fefea07012119c854fefd9704913235ef5e76373dfea1880358b8fb7dac7d12d8df6eb6b698ed9cab58810adeab119e7ea81138f4376c3359bb549eba9c08eb7ff6a6bbec2d5874f91305a489c03ece617a80804656582f364833364d4a4b30cc18ef0742f17da171b009bd7849e21c8655d2c56b636a54f0cec9993b5d0df22006ffd7cbe6f291379a64d3cd0601e4a0566aca4000112d2211581075638a4586c688d9232d7a7a881efdb32478ecc8027e272de720cf34f12adc4b52c46afce308c767439ff07491480360066947127ee152cfaf7861942868f14b84c17c759661166ab05e73120e7e618390d62534892bb30726dfff5edb239bfa3af9fa06555429c0306f9cf7665c735b847427e11782864b67b37817d3c386d5054b85bb4823cadff2351637dac4af24758679a9c837f1f01a76a84c8b2534937d4e30d6bd66c3f7428ef0c5f2c6ab82f53afb1a17e3e0854563c1bac8f896cc4790914bb54f25e360b2cc920d48784e85c84c06910934816c97b373cd4c4110c3c620ab2e097783b57085a8dad514a14544b81a4ff60a582dbab79e70fa31dc4b43020e8edcb90be868a0075c93ddab63153422b392f1cffff0024473cd54529a966ae013900cbb831a12569691de319737e97e975f0e53f44ce246a89c594cf5a2cd39b94da6baf5d8eb21333b87949d254b21727468b80c14c7c029b9d2411623234a1ff47629f4663b937937759a53b0a8ee9c6f5877f888098372e067dea02b6a75e9f957497e78b42857a894f3b4efbfab95a594bdff9852eb4149da69356b74a19d6fe4123eff4e492ab7bee9f991f601b48bbbe09a7d91675af05f87a1bb2152652bec0d908df3f3a2c57327c94683fb7153f4a18f014394506a24556854930038ddffe93fdba3a16d6c87f33e725c22398a0cc0ce66c17a834698380bb292836484b4c42f1d197084752aae9c94d703ff1ff70236414204ce1535e127503631c67282c113930072e6b884c3eddd4201a6ed12d83d3a812784abd9c53484bb2fad75013e35a7a55d635425cd4a99f4c247aa371e86ad63522c3cb45037b34ea362d54b0d14dac71cf94490539d3b84b8461ae59e1780829a582c8ac41f159370bcc2b69c8dfd115f75546ad6888bf1301f9df1a559286d49169829a46bab6f1916b6c2ae0624452b2cf12a3a29330a3cf993dd8d761f36a3c7454a3c68876786b88bc260a62726e15d92a69daadc92a2945fb5985bc5d69fab8bc97131079192392c3dba1bda23cc2e18f375f6b8db88c46abe34504639e04519bae83af0f8b40803670fa6bde1a98adc453c364a1d570a96f98038c6ea8c1b2888a89d6fca3e257da360bc5c0d93f27d02737529865d21f0457937a3d55e1cc17dcc4e19c6f7dd9afe0a5fc4246826ec11c1c4ea57a02cf47c1c912e8bbc96e07c5ab31e2e24669dcbac0a04c1288facd859e8db9510db4674cd1242ec69ff09d5375f53952d66b330912981192cb3757b1938b1a0cb12335e1e55e3ad00790734d68d702583f576af170501350cb00c35ca98b5a0bb0c6f08627baf618908eb7eb43deb8b1ea0bd88fc3170108deda55779af37e9ed4af8e405ec0d99dc894fb6ed87bd75929fdbebceefefe358ca7eb76721038a8d3e8bad497bf9802de469c36af5a60efd5549b772844959b52411784547f9405d9b1dee3f7cbea8688372f2191b78e11495d6b568b4c6e22bbb04ccf3e5dabc3d8e90a41eb4f8ff1d5dd53006c240580c3c2ec547704bcb041ee53c9be63ee83402c92a437ed8064e66d866f69c4e66975dcedc0f4a6155df92e9ea58efdcc0b92f80c9b38edd4bb1e6400a677ecdcc158c8214d4a225689e4537512ba800cd3fb1a5cb5617fcc5f724812e11791c02933e8f5b6b4f4c258998dfe31965eb3a671175f44c2f55a118b808c766858056225f1c72c1d13b49a8527755abc923fd285ba025f4e069dd8408f580d6d881b7f49728403e1a5a72dbdd9e9b1e59f2476bee0a608e72e56e81564791e71619e92ed777f6bbaf1c49f144e237b7d53004be6237bc342e8e34800ce58046e33e14b30d061a68ceb89bffcc698288d033e40667e009eed799ecb2dd74a77863596e1dc38b02ab03613b438bdbf3ac510b6b1cb63b68c03277b9d2dedd7d98ee8dc6147de84afbd22f40918659e777dfe6ed2774666baebd3322151a36e2dc5249337217f4cc30cc7cfbd1245c1b99e09fdfbd766d527296a8dc5f53e15ad372a9cfeef1d513b7efba8a09dc1d138fedc8d6e0a853b11d3eb360aad517889ee0eff8ce19d979f30d698ba54a2a90a92902f9b54b116f9c2e8e6d3b17c1fb0768a04892d5d692340ff2db7cc940c61ff3365dab42c71fb9f46f095f3aaf8bf281b5458dc15f6b6b8f4e289c2c502c7c0436022aee4c5ccdb6c962501a8c45681904ef16c26e1798a0c90d7a8e65ba6ef2a8600548e127d7eea2bc427daaf0300548a6a9ac67415400faa7ffab50187eb74d0fec770edec7b2696cc631e423cea5f10e82701064a55c3ac552334ed4025db075a76cc0b9a68dde9919612e3294f03c355a6ca4d896fe53fdcdead0cb026e3bffdc614116b8bb225b59abf68ad43bf863165292c19fcb52a434f616bf2c9a3a4e03adeb0a34e95b8e12d969570ca6f6cc39b372a59abc8474600d57ef19a05d5ea1d98f7834193a7b69fa8576d1174560723db1b8c05c6186782b2dba208bef23b8d91b29eb6b53db123be15dbc603aa312d3169943da707b6e3d3a35967631a45ac08a8bc4fca920c5411e7d4f2a25f6a29c3e7353914de8b443168fd8b534700cf5f58276a179294d8132976d4911689deec6f302057099e0bc70d025672b53bf04288b537c8664434e02e2c05e16b82b9c23c1534c784d8a7e964ae0e502d57d79be61a2fd682141a0e52c109b671ae31699c6cf7d6d45c9d9873671881a8d28ebd5f69b8537b8273cd46e68fd5caa0429107d7286020bd6038a4737d5472b99896dc6a9c02596d1c69f4564c5a3ddd7e4a02af71e8fc5f357ad9abbf8b2d30b4565feb31f2a924e0b062afe150becfe00e48f8297d50d742bec416f47ab0e78abdbc75b84dd873c454be11a73b622a6e4cb5e78aadb87182f87ded15d65b71cb873e1f5bf686cdb4ec04acbbe03ee758e47b376defa217e8e990dfd71e61bd3637f295b2377ca26526b2dd2577728647f677a33d173d44bf4faf5f7a84ebadbcf5a1cfa65a7702e326b9cd3906f2dd37da3be8dd4737a6efb4b2da1e61bdb63784d0ce4a71b73681fdf1c8edde6cefa2631fd4d83ed29541374274957a78b766754ee391efdcdcde45477d54637dfb950ef59e03e3b18d4667cd18f49489951a68a0cbe8fd3fba73ab6c5e63870fe8bd2f8ffb5d5fd984ad94bdc88f1d61cad2bedc691859acbc18c0dc01e540c6df740dd3bfcdef7b97fd134e0e0e540be4c822053f0ef6cfc6dca1e7ca3c632c90afad151a3673327ebc558773e60c7ba50dce303673b9827ae6750c70e694745f05f81b6193fde79f39404eda80f675e685bcf099188221176803454173e2cd1acdc354d5d52d687ea57c8e38f47ddf706e24b1d0c4be5c46ea8f1262932bf847f083cd9b86365f949875099b430cc58637432edbe3361db807f11fe8a0dd439b83b4eb0a42ec756d92e8f8069573decbc107baaef35640218c118847208fbc91cd4f344d09bdf5ef0a12729a48376770eeef825f24435b473775b71f8a62917795af081910e9058128749c9be87b726e5c398425133e9cdbb959b6a53c0136187eac3f62f41827f3edf9be01a15f231fa7c3e05b7344645e8bfb2019e267c53122e49c2915f38f70d46ac7888a20e3c0dc98babd07852b9c0f00e15674b2e642bcb8e074e1fc9d67957a726ded1e06692fc48b85b13e73e5930adfdb026e3285f0d6e7a841059142cea136d0654bf91fa77b70a69b451285e54767790169c5f5eb0a3b97ae5e38935467a9b7753145f0c3579f09329884cd599089cdc86679f6f0f34463b0de13922b7c6c723d551e7659e7e4183bed1008546351949df4f908d57aefbde4b8e6d045ce0eadfcfcab5c14e1d37e6197a9a52dcf83ec09bb39f0151713b961e1846a625256bd26adc16a9250f925aa5ff592849e170b560a0d15aedc2656011fe635d18fc8e98f313941dd1c290bf0d9c74d6c462049453fffc0ec5e41ccf3e822813af98084b1466882e2640b552096bad17c5f61ee0da358ac46da92604d9f0c5ce755382a8d200eecef91af538971a4e0dc125c251382e5114111673b3d40bd638ee98ac32592b2d2c6614588405d7fd55e98facd31c50a84311370646a616b0df9ec57b76cfab933d84cad2006b2bd0d7e8cca4cf7fe0d6a5a9c40d997b4d05adb1d067241eddb7ae01a9f90b2a893de34d8c750be272e79a5e0963c8d88123addf74b2264104d8078bf394c403a161a83e8d142cd627cfbc7551f48e64bb08c3eb7ca8c68d63e8f34b88ae7b1a88c3e64a30932024cd909357ea4e8bb87df11429cd139e8a71be4f9cd77856b223643d5db12280b2ac326e093280cb0c8d699c11173d6ab86f2547e1bf9507478411f878e440b4bd6982386f48f3e658a72991834112e07a663126500e5455cba11a6195cb22a09531c45d1b73e530603c381f21f1735aef6754398aee5a0ea4551543560830908a1b1dbe9487a9c19025077a6dac56150e7d6a3c110aac0d01c3257b8e244c46c30f03f44572ce564be7a2caf3f703790c4a7e7916d8fc2cba8b4b3be318478e65e5e227f071e8c52a37442a394c84393eb72233d295ddae1d70a707c48295103d0886e2091b2f5a5da008c8f47d4cb48f9d5fc4fb60e2a2057937b3d90cc2e36869090a688d724aa19fd123f63e9716752163791aa065485ac1334e1f1ab616f0fb27ce2c4e41319cdaf7e088810c23ed6dcf6d2e8402b6d0122dec53fe562774f0a4a4e591ab94139ef2f406ddf39700699b817d5b6dcb1d5fdd2312b07cc48d5aa22039cddeafd23cbf66dd771df0a9ff5f79688e226d00949909e47545dd3488178e6facd1b81b23424d8e4361c173699e740a6852e77bcb3d167d48a71cb5af3b10d174e8d4655951f4ca545889e1c55ffb62b19228365679d47b010fc99ea875c3854c81cbe228771fdd98b9e43ea401aa9d735b2ca8f50b981fb891ddf7af0a0894005634a7e378d410bdd60f06edd0b6d77d2ded4deebbdc095c124a7f07c4992dd2da7f9096b72ec87c7b356a03eacfd5cb192e74febaf6c6dde110b019e8db7673378ba40a28dba74aa692b5e785df7b093c83908fad453dd829c4408795df05cd9245c9d2687bbacdea50a44e86e8e06e46f64af4c6c51569a12a47c6df0ffad300bf4f2bc2be381243df05f37cdf851fdd8e3eb11d862cfa802f4310378f8d5479bd821fa0e48eae240166940338a473d07c75828a33a20e2f67d5848b4fcacbf7d2a4c8debbea960dd0348daed737d9459b89f54ee1e621050397a16bc45e3c785957d74edb88b5f05a361a014aa90c0acc9d2e4f24e285e179debec2829c9e277cb410499c59aeb77895bd23e4f91b83ead217ef358967a38042d1f8267e131be36f8b25cc087149bf2ea7f60d100462da31b3e215e685bd4cf0647bec05885071c0af3c117684bc815c58427fa131527c12106c0b0e9f28b91db09c2b192e430ae87d5088dd267c75bdcd23b469d0c414af4104717c3a21f83c2bac889b101f29aea182731f5b62a8ac95c51d2d658127f02c90df8a1cb845b63747de9e703e2fb19d92cc950261d86a697be84fb7b84252020d9881457c11b1b196a0dbb0b6c24b7a710500dd6e72177df0ae60c953cfba663614595e87d0db78ea5e92b8c5d207381d53816f7fcec4626b4760ecacf97683ba8f4a1a1a87d0cb1f57d695132c0969000b19f1cf19fc886d2fa42f674caf143f8199d5ff7c2f801a14152bb2bfbe9596d9a4a5f16e3e839a52be8723d115dd08e894d823f9e2d72c8cd22394c7fa4430158a26cb9c28d36366de7316526363fe4091fea0272464fb5af2c4c65ae08b2338a101027b8ed7e6385ba07d42fc02b93d0bbb6052f8a853e1062c04e40d9a91d3c7ea0380875bce4b22694bb39cffbb47a8dd32091608428d9b42825247de622148977847530ec356c18b308e70e14f6b182644a6a25aa37bed41c14c8a0cd591faa22d6884e95b52029dacd68dfd1ee1feb1d0be9e6c0587defe0ee502a946ff9954a496b50c3906a627c9cb68e9beb0890c59ab8e67bd022daea62e0f671df45d6a692c9add0368f32d4046603c1ab784833710fb3f57c8cb5becac626e2c29dee9e1f3ec49d388746ce82103210975c1b7d8ee18f23770fe28f950d160e0b513d1991b18620e7de7b7044cc1b46376e10518ecce4af308cf09d771ba97e5890c4bf1c546bac5390f7a60a747858869a19669d989df843725a03371d8afb55440b7a7efab023c3416a8e131c22841209918d62349704cec6af10bb0608ca439b01ca962a706cf696e7107c833a88444e9fbd9454626a79b28d43d8d41d1df7907c5855fdb4fc51613192fb751817de48cb4651b880e1ebf9d2f61c1fa6ebb6b79b3a2632ba49c9e3e159c07ede64bb3ec1f51a8a92835a5764fd0a7e0404d265ad3dd670709608758419f27356bb4b62822c3a2f513c20a5a53f7798bacee38b75ffb3d956fa277ef14709e86f79c15e1416dd2399ff1dad5f024f860ce4eba724cadba79a623a1c08277c0af573c7fb14e1b09a7243642a2dbf8cd5158ae6595d5ac1bcb5c59eba518275c99d1106ca334e30c90f48121e3c093e65f4b767d4158147d29ade5f37ad8b56ec4b8a4f9f02316c2401f2537f2468b94fd742de19be1d0e22a4b69534397c0db1ec0ccbf5b5228abf4297ba91e3d5abf5d6aa40994eed2a01e713f3ae75475ab8184644ea9adf8a5c72b000c4aa00955b44dcc74a54ce00dd0a2159f1008b192c92cf723960a5956ce653ab55eb170cbc7d55d85fd764055e2f71249fe947a0b974b0587558068eb38457c423af5ddcc72f53414f531edc6708580c98456854d8443364556191580967fd0a20a6bb6193c6efd6d16e56064eb5b4f9a6ba868c0edd819988afcc4c84da45e117308e15a85e372f3d0944275470cc85142ece657eb8d420e1bcc06020f99211cec9e87c4efed37e0364a0dff8e8f6ad02cb634198f6071368f9a483ad623616915308fdd10501b4b41e3f31a68b82dac3ba05cfd51ca3494fdab29b806f8c99b8633d9a6438195b04313c0d737f89a58a46dbf611e04c6d8fed00eaceab7834686ab3443e8dd324b753ec171988f8545ce626192f8abbf710321796965bf46b9c55ed1375398060f7f84a9802c3c4516ec8da900c30825684efb019179e58e47b5b2845ccb35b1b2e5cce4e8b080f4e1231771c188f94f2c350e90fd4711d2e1d15db71b6730c0ba6e3f460d8bf980d282f827ebd6b95e268fc6bd86c0ae174f7322c5cbc075830d0195ed33a0dd11e2f1428e8cf4f97410de8fe4397bb1bf7c908dc3d6b86882e04ec01a37f78e635a70afff6564610c64d5a15b1be1dd606fb30bd162be838d9ec6327c4121fb36cec84664e5d68f9b9836e97a4f20646fab739b102e522b64cc17d5d98c00d097b0bb31f35b18977292ba7dd190b0125263764c92532db765e0dd25aed4fd2e84fac4ac97bed347c960f8379e9a485cadcbe4183993ec3ee576e2a50f4dada3916f2a8770900355e8e505ed6bcc2f61ec36bee669c919587a5014c9ac52de337b7db23f5665c0c54a6641c6690c8b149b17f22bd11dcbd390dadb438fce14dab2a3b600973d395702f3c2b4176a080e13de58c03d404f76df1d481e4460994b181e15f37dab587bfd6e94cbdabdcb07d87cd59089b2fe868c74b1a848d4efbe2c41a9895f6eb426a5d16e0fb918a144bb990c85a9b3f7f3025716f52bf0dd24144571c6b0df7351e1bde8ee26b7a827c6b0c7fe179e914bc95addec580e407faa75d164f4d1dee3ed01ba017ff84852191bdaa1e3e10f8db9c984b5afef17a063c97e57155272bb2bb9e123f58a18d12b3650d50e7c14919490f65e11757523ad8403b809c6cf72c52ddb1211f086d0312d2e2d39ed2fc9f7cb365c865e119e29af9ab204f55762ef39f794dfebd1244cd238bb73d740e6fe541caf98546a3609287d3d1f2dc06432f5a5dc985e6cda6947eb5ea5e9df2adf6accbd171c7bfe81fd18e2265ee6243ffd9fd3a7c2bada7f2c33524843970d739b60c1adfe0f57dbdfe9e6187c2cba8062a807a53e1370c35638a6d99b3b0c6f71067bc192cdd5d5e5cf28ce863b8af3df2c40e7dc52064ab3da55ab4614eb6e234886d1535894ae7122ac4fe6115edc88d57a3e892370032e5a39db9d918082bb9d6066b8251ed68e486781ec979b4040b3323bbae72ebe22a7038c393c89510db8f717dc203001a4a5be63c450f3e10cf521e1cd77a30b79d18554268dd134fc4f1f32cd4290a9c144317857983f039a5ec61cf64689a92563a911fbbd66266c0b08d18d067e1244344650ab67b6270ff88614f7e964bacb42029abd901bd6305b486be62099d22dc92ab35103143325e6ab027abd54dc5e58a755cc31c394eea5b37f2216810b09c7b99472681e3476d4431810a589e789464697bbcf969ddf8b4e8bcae731dda3dc3f6283ad178147cc10e65cdc747c698f8c8a10c640835215eb83f18e89ec046317447ade7aef0f8c99ee152f55e78f36a54d48f61ca0153841112b015f994f271f24ae48aea4bc72a0941cbedc1b62387eadca0ff7469c390d704a80cbc26321dc113e7aa34e57ac497a14b820023a33d9957387a3b07a70e918d810d2a41101bfdba18abdc3985237311daceef640c0cfcea01738eae455314e71833dd49fb4c03d3595cff377a904b51edf4fb841bfb4b9a0801b9d55ab9db80f06ac7b008d2b0664110aa32422b581ad29cb22677276124b2ec9b1beba280a7498126ae19c7e681083804456167ce43a4b5c264d8c9a1b202e4a9138caec7b8b14bd7f94086b59cfe67beb2b4b04c7063ae407b430d8872faa4bce9d1f036681e7cd4b486aa217b8380be7521bf2289b75a178dd8e9f70c2fc77e31efb04a1524c4113ee100d3132cec15e33f13da38582f59f0e2b40880ca07567bb871d27b2881b743b338f8ec1b9bfbf2e8324484f8b98f76d374932672f803ef272adfd1ec6f96bd8f8b43e449b78a5e065d4a952bbc19ef606b7178341a169ef42503af143058b1d7ff22d42a4f2d8332b59214a18e63afaa92f30992feb224a22ac76c7a287336d41537160a387dce745518094e70387d1307799b7a21025cc268880ad005f54d80963f5b64975173908a23521c940550039ba2b43c8a9e02b674d4b0a4807879eba09e742d95f7cb87d527021d355bf3e8cd520d0fee81caafc0b6f04d568d89fe65c6899c3f6d9e0cb995ef937ee61811ae2fcb560ad798b3ff994719f16b8f300e79fa4bcf30f1137f08405b1877680b73f9e41df293cf17a82007cdec3eb88b2b816888accf8f247fd8e88c6d75e25f088380f5e27a5dc0fd8791836a52d9ab6a3662eac6365c56811093fe2cc07808a232a6c56300391139ad7b8c58a5eb23575926bbfc4c8b550a8f4adfc7b61b591aac45e22133f49415ad375fdd77e5bcbd220c8695db3ded480778b70eb7325df8fdf5c3d98f574a8509708b5a65b2efefb1d70f0bc735babb42f70a1911c8a6e20f5bf5e0471709cea5649f1dd0aef685c3753bd8b5c720da7baa25acc0e870d1e75a7a1ab6fb44a25f656ec20717471a718dd9d799e3215523674ce0dd4ed28c9205c73e344cac8601f32244ea6a06bd54dcaa1a92f8c32aca5cce91247628f07fd4bbd9c774f7ce97fe8f15431c12bec929c296ff68c33fe950e0de50160506cc49369080e8a9b0113929d529df077b086bcc22e3475b9e1c22458632c45de9143d8b9810423c0d9212dc61c8ca3e607b621871a528c5d4c0051991eb95f682ee2a82391b73437283b8a50e7cb3ef35b3cc81fca8ef6272ca9fa54620487e3ec9a12dacc9a197c86218976950ad89fc71092e48ec7125b6547483ae132583c75934825bd42ca2eeb16dcc5fee50254d8dcb8d27ccdbc234b513893aba51b7f512b51a7281572c7615ea683898728e02c8180355a382b464908031d4e18d0c80c03c8acab8ad57e91ab3e3b958a3d43bb42906b2c8c365d37c67e8f7b6b4f58b173006b3686f33e10747499c2530f77418cc651adcde5cc6e7640f8a7fa052f2d4b67c5a7c16a7003905c3a4c430cf624243e0c02208ee674bbeb432c7b9e62666a216c7a83389e21c59e48137fafebda554a4c880717ce99b6711a660a1d5f2e783b3cd62de4f3b60ac54c93a6b1fe8fa1f851476c901b11e9e6e2192b96849dffe38cd8c908c090cd838306af090e5d3dcfdf386bbcdf053533da30c6fc96a47c116bd552faa558233b8ec4046809c0c4699c8dcb628d15f81e413a798acf638ee47dd64dde3fe22397b07784b64ba2c65f4fbaf6571d1b1a2a09ca00e1e91a8bee6963c3a4b9fae0910507945bbe8e642e6f289569cf96dc090f3e7891b0c1722f93fb0e8b8a56fa167f4a74e1a1a486baceffc616c3e0bb0e3280fcc7f987f289e382d3873a54385d0766d218c9f0d1099f006bf36950256a71f9969249eeeeb0c4f3d0054c6f5f338e542775fea938885262b685c6c1952344b29d125042d1716307699944c2acbe5d6e3d9480d1610430f2b4806614e794f1a2941631f1dd9188254aeab20964c565ece323962dfce0ed288524a08607c1181c7b45c1065ed545d7c2cea790a793643e0a3b73194e1398372d53e2adf9dac72a00002c1c45d300d92d3f5f21304ca0d868d13008d5cba813a7225f788238cf10a6c190389d64786b9288a7b63227d19a4ae7ee2681856096d8c99237c20ce16b60c770cb0e5d4ba393ddb5684bd07474f11e5c35b9c2151437d77a90850cc4f94a2a69c537033014d8106c0ed1d0d2a920e5cc2d379f8503b1c242cc411a4831305d11b81bb08c9677becef293a20274414855235faa03ee2bde8c153e1e96db3be2db637dd2d792317263fc89ec7e6039139d962c7669081535c6abd3936ac726571b0af61ac7df8b45a48d6524c559d718835f5f4f5a94902251e5db7e97dd21dba364c748d7e10e49c99ea30bcd707ad00307c993bbaf2800caa4a05d1489c5c0067a8345ab837ecd3a6fa1366e7134b858b9a1d32844c3fe8309afb86b9064c94380045c20820bd87b2412636489aba680c8e27990ee125a44d1ee403b4d7a2d32e0852399951b4b263b744c88bf44c6def874020d7024cc9a46966aad284680be4a92ce784ebb6611f7a82307c9f6935b2c66567ce8d40444c7205ba8fc2a15e507a190142a6042000f4b63d5e93dfc01252c189f9f97165e9afdda5539cfa9158cd251d1715c3ad9e8501d7f774145c3a16cf006ad7c02d77fc3f6c6f276df5d1d40f1815cf4bd539edb96ee02908d75be6587f6c134636ff7d57392157d225b59a4c28e8066a0cf28b99a9457a71b13e550a625117b5e068821d31f415ba58ff25c68e10934f2c99dad7b2e7d7794cf6216d10c958ffc160b376c8402c324b2248d8864bd60b45dc7f7f2808082f90f90127fa3a8ee4172fbc3b1ab23ae622dee20580334f4e9c9ff565774c5f165ac1520b7bc3180260e3ed78c2bfc40e6838c170466cfde0b7aa81e93c3fa8c724998648db171154e68871a0b100fd9f061c2544a7a3400348f4f57aa847ae8e047921c152efc3715b1181216848a81564642002abedff706d80decbc92fc4e65fb5897c4dde1231d4f4230810f2aac83924cbb988e5ce22227b686285f6211820c17a11ee67e583483b3094f8d7df6075781306fc34ac5f5967953cfc5e6f0ab2fb0767b0eae71d2fe8dab47d7deb87030493e1385719b8d4588786e1ace0a3c325f87496252954587d96c11a43014648be948e72cb3283fd2e8466d0699452a1c05f76b23c7e1ed9f81af95402747e089d642550c055f5fff5c5b2dbeb2301798eaf3af35b3eac2cf847582ea0b0d169a24f47da78c64ca4bb92d8c4dfec8dfa9acca8ce857bd279124698d245fabb878511e8af7a31a724cb4733c844c33da1f62fae0ffdd0118416b5424f41249f26be16f5205efd3596985a1c6247f6bce5c9475f486bb82e96984081a06798fada31a3830a06cf3b7921cd7105e34a21f51b5a910217069e8e2b983824795f3a63fa6b3a043b02c178be046f1c25ef048118bd318273dc3b8d337178beee26119cfbd6e9c5155846ba3d4c2597fd23cf829f0d723b9f2b365a1a20efd350cca5faf1fe9d25283b58db21a358dd6f427377b19f7e845efe12182f84c2fbe077c0400b3b1bc255b6606a3bd5c993e805691b20efaeb57a50a8d547e6b98a4cbe6c30f34737dca4a9a7bf6eebb2c400aece0658c7adf50f47a7d5c0b3b081c780ece87b1c5547f82bdd5d162227be1440bcb3395d51a7c5930a438603659d3155a08d348a893987d7f27fdab87cda0e33ef61b11a5f0f69eff9a8baf58190969a6dd8eade49d673f83a141157c7af828075e0c134159f01d218f942d3be88c30e13c151aa0a0d36fb6ac8d42bc35f6977429d5d5c712b803df1f93c6f939f36ec0aab1c0181b455461f93f5cbbda6462358e887c6cfb259a0b0a7878aa233136128a0e37201ed5d5e42fa18698e409e3e8022cd55e79e75c0b9fc6f056a961f13b51135682fae6d452c23528c88ec05ca16f5736c3af6a2d54231f56360a3d1e513562c57a4dad51e5f6933ad50b30e0c7e7c0556a1770fbb1fd24547b5c956e28492fd0b98358b04a1013c674dcd3b62aded43579b000893e0d5032c1550fc24e41338d6b6d0d0a66dfa8d826611c667e13caf94839a4b46fd6949593aac4cb85313656b62bd5e434bbadfe40639bca45d2eb32464e084579905705773ba0a88843972d45a876b3f024007ea915c47c4f902d405d3b028abb5a3fc640b0cf5c1e7f07e69540ae33ea625a2e836e912eb09646c7f1b392a3a16c2dc2aa6b7ef023bc8e61881df71a1c8636af1dd63533f3ce0b4440ed750bb9aac1e9931e61ee44f35000eed1d5c667d5c3bc05ffb7537731c6f5cf1a71cb6fb943af363b0a96687fd21c3a63ee9ed8737626729ccc1899f31cc8984c07eb866693b3c21b52eae6a1852aea623f05204e8180f142e79d1eb9a151f3a7fc787bc4c0eb1e1beefbc7fc99bfafc26d8451637ff4179cf120242cd39108be5adf2c5b40f0a3ccd3033e042451d9295ce08ba9eeb9a4dc492173058b4baa4264c12e14ab086eb1dc6bee9791a3d77ae5eac5c2f0de3d333ebb81afcc515a46b4341dce56f0c129dfe90ab8267d259221021a3d043b57b08c244341ba76890355a1ca4b8c399095b2b88d168df891999e0f0791ab29a462d6c693bef70ac38aa245dad0cff45cc8bb92efd0cf8840d802ae0c2597beb2fa95f269c4d234092b60878c0a8c42d7ea9f219bf50839af27f918a984d2073510693ddd3255b444539b0527f065f3758494776b82b141bace982c0e310d4aedf36b5c01ea8a77c7d09f23d5a5006b027cd4be1f1d5c501f516f412ff15139c794c38cbb1f37710fdaf27dce103304308df4384e1133c37cba32a061e79628f7b1c3ba31e05c15ab210435ba37cfe6aa3d45e0ef56371d49af03d0a02aa33dfa24787115ed2c66ff8caf61cd915046a0351a7fa0a4abb2e704184b6c1692867c29ea39fc40bee250b392c400b887beeb79dbfdb60baad790a7aabcd8c0c4a802757b272d0dfc3bef63a4257cda663fd84d6a8b8039de87f28148779862e156d6a53e73a4fdaa817d03ace161ae9ccbc043a5478a0105918ab55cc9a88115536f6739cbf42661648d4781b4cf4165d456e63381e4ce114e6f45cfceb9f58319aec1f12034bc24700fedf4f4063dd5e280280cca312c0b9aa75f31c9a07d6a523cecc5b163105dfc80d2c8a34752a29aa4eb161934dc15fab53a62546cd43f6c8dec8ed81d27afe5c3bd17b7aa16fe7433262f82e62403832414020c5df0334a0257d8a027415bd76e25e3888abbeb10d4ea13ad317086935407526513a7bf021d32b7ee3220d92a2263b956fe7b1c3f3c29cb3863f0e3e9acb51b48ae964821bcac56cee003914e190049830510ed8ef220a791d0e1f5e84b76f38f918030f5f86e1f3d11e8da39469e15c23a5827c5a1b15acdb79b7df30a36b8e8f1a014f540c3d8ec9d03e06e3a5f83ba3baf1dc83d882d59c48136e0633915ffd8cfbeb78e382e70f932c0af50db4b56da88c1efbedf8dccf701827a4922c053af9587dc6c32d5f7ae3d6b87d54a1da93c0e9d5ff7c492ad17702879125974a68752b1a3e543b6189939078fb24020303624f66882726cfd0acc78ff95d20f6c1850fc645aa33a29ed31103a68b00387833b3afd1333ea6434ec646e4848ffc10e05c26e20e29b429fdc00eb4b1fb110b7126bf2fabc902cc5d9f4c07c331777c621a136630a17e6c022b4567a0630ac70ba18f8f62c223eafae6c54df828b8b4f48843e0f98854da90618aeb11e48ed6e93357673781d70922ed215d74dc039b80e6998e34bf4bd8b6622b5f5711ddfac4f581777020d66c8cc0e35238cc1577c224f4604a1d6ba22fe0762f2fb8f93243378730b6e56500e46f6325b9e099ab32470efddebecda7a3c50b7ae46534f51fd9043591c3b40dda1ddc1fd62666cf5bced5141bd235d97262e3982de2b925bd3aa1fd560cdc549586c171f64490b369bc0d0ba6a18bfe40acd9d9d4369fa465de06ad4db4776e329a29d9b4f1b83eaa186fc42e76b76d5266ea1597e8f8cf72d0fb87e44d32f62fc3d26d7be745899739523693cde0fea8729f88ddd89dbe499f5456ad1db287da6b93b681faca31307fb0df2ec87d91160b21bb66657fb4a1fd509d62d11f78b158b0cbf2754ce78679d56963d626f8590bde17aa6d8417de4c0449db5477a07f58616d4c3e76a7cbb42c2afb43f108a0d6faace4e293aaefac79585a9b44b537a9906a98a1355e220725718acf0c711ee988221a8f03408186c979d2052c40cca80abd5139abf5c8c55690eb0b55dacb2a218fc90fc3fcf77d8782f3cd22f105bca0ff8d4b3ce5af304e9aac9b2e0360302f0522c4383673e26e691a86c10845cc782b21e5ddced4d10af7175871ea370b69dead073b89fa7f54ef54e8d9a8bc8ec80bccb6660145da4ad9836d33e687e98a1a2f23c9214574e77765880f31813f0dbd3a2be5eaa2f30d2bf173a6f7d7e04e00e7cd096c46d8d432dae283ac415edf69e90d05e32fc427fa4d241c3a0fbba417084679e12f0ac82d5cf9d31adeac12c54d65ba85029628730bbc24e09cc7b4942112f0d9afaa19872a0337f801d083641b8b5dace080f4b68482f7d87e33e454d0bf401b16f25eb665ab4366824fc5c1dbdb719bd3900e86e149068049cd63b449adc65a2d2669823cfd85189200166f6c81eab9fcbdf6f6cf7cba17c658f939e8fd1ebb15c8714304f88e9b7a775e637db3bf28089394275c94bdc48a42ebad269705006ea0906716bcdddf1b03a937fbc780ecddace066e2888dd734311e5d84c7b0b70dedbec498b94031edf8142f73b2f4510abb177d2bdd1a1cfe30ad9026e54c84cbbc52b983c25931c5a6ce265ab5b038bb63f62a480064143e53508e344b7a0715600b7fa43ccbd7c4a3dd76bbd95d5b1abe61c5fc9c74f853460dbdfc18f8d7d46d767477e0008c3ba94a0a29f8c5b9ba1eed64d7ee014675d35731d1558c1d2f12d42dbb524c1ca9403b26c6f664d7e18c89197e8a29d020ae472d0234e098de8e42f31cc96dd6943cc54712fa721bafdae63776f6a79f1c21859a0e1683bc21f4460e9c2e1b12c43064c91030c9790c3e6948957bcab0b3558224fe8a1ea300c96f60e0fa58ed9fee8dcbbf791743ecfc39e8e6cf3a4c2a1d3f4990bc803df6b62707793885b16ed1b1703a879fbee4ba4f9e4e28fbfc1bd2555dff2d3abd800af9d08573a5c24d75c6984eb85972bec40ecbf8b85da6d918786e167f389f2a03d7c00907bc8cedda1026932b9b54cfae85ada6d5fda174096937ce8cdc2f38f8c46397dae75e59e847a249b593b947976d07a7d22e04d0e307be5989167e225452a384c0c00b625650ea310784f549081bf83277eb59a87b158dfca2913768e1c7df2d72a0f9de25bd21e0eb85b5afaedd710dba5a6df9d313b8077864d0ff47040b305e8e85b2fb19ba55bad37edf8ae5fef9b8a22575c2dfd6a2fcfc1d3a8bdd5ed9a031adfe599d28925d7ac868c66ce86e853b485f92d8da7481791b011b0659b3213b73672500605814e883839330a639eeab792486e9db61a425a48d72a1ce0cbf9904e5d28cee2f59e12f6e41b1709abdeb3b13914d5eb25931c0711e3c5237d2f1bece78cae799caf4ab7eaaeead0cc632c450d251b4a04d5944c5950d0d73d51769d7d2ac8d0a650adf582a16fc3b3a3dfe9e90574dc66dcffac47d92db477f9478fd0af6bf74fc961af29f70705704250ded60335d66fae7de8ba1b673923057ea6e8f393d88cd614a3648b41127eefeb74906a94a66d2354fea1192b0f56ab55e79eca956f07f0d4338ef97332594778d8794efdbdbe172c44bc655b6ebab43fae77f47c1cbfaba9a0f155653b4938c3d7306160df23e5724c1450275f3258d1936e31354fde8074cebbf4a983d5ca199580a131ef415d58c5a6a9e865f5899234f9d1175586ec71c7430438a8d1c5558be019c274faf0f541fdb5e3621532ea76e445b0c7dce4e46ce41d0bfdd0259c9ae43618cd0536dd636b1b8a0fd331a7101d559a0d47b9cbe2594862e33b17a91cd67950a4f78c6f71023051dfe2371f27b72dbcf55c73aedcb0cb0137268d456978e366d0e0e634aec1dc90f66299ce0dfa765350ac5329f38054af45b303b2a196a1322bc41ff7868d66ee112ca8812d46270d332e235939bfffca6fca834bedefc47921883f4932412c406a08698fe3f12594a964a4604b11eeeb121b322b10bf3e9c48a75b5dea95e5e04fb5991ea3a441a94db0b6c03b87a298f83a451018aac10fce1e5d22f6ffc846a8dac483a9ac61cd4efaad180183b9adca19c9c8f28479db7e4892a7a8178f5892c39f1266026340404feffb1d077bcfe78aaab11f20bd9153cededc1097571bccc302980c704b317c05e23aeb2554344a495b3becaeb98ed324046f6a9886e1bd6d081e3eb5f3951181f8048e81c616a9653a8ce3fa8c52b7f1402fe7422767099b466d2b05c2ba41194b246bb738795fbb8fdd681372fb73df535a97e473ad0109cfe5749d07a2f4c709c765da53120cd9ffa30a4f7509750ee39fe1ca94e9081f64ac4e40dae6b54dfe46b15295e7517f1fc4ac8ecad0f26f6dfab2675774de80964ea6ca9a46c8f3fcc5d4db23fec1f6d441d159f362f67c613c7f18876c249901ef7616cb90b2a4ba02972f1f8dc87de15a99db179f7cbf9e204078ef5bf255e6924451c180b12b4e8a47bc4dd45f5360fa0bd82c3cc5dd3b5cbf1686e325833770367277b6c1127bf0ae2c92a2b6f00ebecc895c820ced66723ab85f73a2b5e945f7136bc880518895ec2edae908c33717eb9c04cf85a4c08e0a9996e0c18885fe1cfe8581f6bfd517dcbc40324fbac00924613765f66fef88ca4339b51d13feba45b6d11595ddcae62386275ba7a5a0d8b2aab1c5aa10f5afdccf85a4c9ca1f8d7c88c7dca2580b6e6b55c099a8f380470ee5c74b03064ee9a3a77d74f156ac1eb420beb218c08f8e18332aef16b470f63aa598d73de136e89a9ed0a95bea9efd25856ed148bd2dd35dbdd3233ca6cf0b4c542db603ca66dfcfdc6e13181507f1bafea69895d67583466b68b46500fd8e7ce1bc78499a6bb2bc39a7ad2751a15bd196d88daa0d2c47e5fa71cd0cbb186842ce919fb7ba05c1ddeee538a4ecc2d96026c45057ef084ad0f5920d41d710ec5caa7b215cb6ad567451f9fcbc2e73f3758f8feb6c2f106f7dfb98a3c7f9785cfffccf6cfd11a04f821e02a0278923e7dcb664e8deee68bd115c6205073251323d14e3668d152f700f4179b489684369132c9142910160f5d0f94521f18d5081a5a4e867a04d7293a37c8606d3dd2831a34fa572b006babc5d6fa8eb75aadd66bd5e38d1d70ed9c048f8cf4bbae3391a8adfa5ebda4154b2deddf6a29bdc28b4064851230cebba32df309d75a7f9c262129f83f7ec3fbf984c3ee6d58e6ee3daeeb1e4c91faebc7eede65eef7def6d3fe4afee829b8415aa7a8dfa3adb5fd68ec1f57b5cc76c43fde27ec4b1a07f4238cfd8d67b0be435bad56cbb5ba3a60f7ed667f7dfb6ebfbd7ba3f0f0989e4efed8ebd76f31871bec430dc26177ff92026171100e7b79ad0076cab318fdcad8b8edca05db5a6c0e986f731c8502f4eb793782d8ea7a5e4b9c3bb073e770eedadb3ace5dd9b6db9debfeb6fd0c8cf6b96efcdbb6ec6edc4e03b05bf4528691621852a9d4b701aecd9a3d6056db2f5eb25f9d4ee1d67ed7755dd7755dd775efbd257fa470d7030f6e3af8bd7828182f7a9c7cd0ec10c30110e81c378db31f1b7080899101493a384a9f63684f0d9da313e240911570953ff889401ef93d949f6b70f7bd4ceffcd0bdedd385effef679bffbb07750df3d6d9fef3beebd92871eb86755a0071419d4a46be15d20810872f18cffa1eed0560b9c41364e91165f921e714af24afa2289f749225057521a922e5873e2401004bd8ae017ca8c5e188661d802d97d8a74fc91ef914a5c3c2b54d96029d4a17b8f0c45a07b45f186ae0c4b2bf4893758ac0455d25755a5a07beea3a07ee0048e87e09e1ee99efbfef4753db157292534be051a7f513f830ce20ed5227a87ea60a8ee502c3aa051a041d22a60a15cfcfc765035373532b0fcdb7ca3480aab2aff8fa44780f0ff332fa28eeeb9ffa95cd891f75324876790415c5c7e495e108cd7fb6b4b2290e7852f9d1d395b7da463dfd2ad649323212c01fbcf883cee57c04f0ca478e8e1765d572a41a1baef4a0ca4702d5355a887d39c98f8d801020e486205af80e8fbea8c6b2077cf7943f0cc8f4c0c8c69b4610701704832a5eb2ed785d623bfd23616d269022fd149419bfe2265010c4894be00d3256ae81e8a821cd4871ea136fce90ab0bf77cbeeeb7fb61b82bdf50d4187d0705f04ec54a6321cf794524a29a5945299e7c816814affe332d6dbc1e1f5e57f9c87621e99def999f95c31c73d6d9f99e7def609f3dcdf0e7ba77baecc3f52b8c4e33a4563e9b30ec621f330301fe4e298ffa93b3dca18b2b189b4d89215e84187639892071b47c7e76827632229b65dea3baf1ee7d59c3c9937918e6788dc64210b59c0426bd53d0c919b5bcfc83cf754e6ca581999bfe20d32a5cc158150aca42b5d09a149c98b9779f1b67b98ef8180dea1236826ae1a01e5419bfe2f482a45abfc29131ac5cf999df0bff073c59fc524ca0483dfb9f65055fe33640556c06171e63972e679f073a69cc9323078a624893ab837fd4f952187c09c89e4700c19c4c5a61f9fbe69842965183918ee068ee40390b3d5410af62d713f9a46fb3fb5af406999b680d600088bc34f0ca430e7b592ee5b1c22b56a82e2513190aa26ad0d4187582b76015a6b6d899e8a642cd03e3a9ddb0910681f1ccd805640fbf0501bfe303eb715339fbb4a0e6ac3bb87d034534b81fb81dae76bd8691f93daf0cf3464197074c6efefe9f3e56f9c22f81927bb803bd3601aed339236ed2313a3cfcfe7446df8c7d4501bfe27d287abbc64820ef5f9c1c10323478eaebd9891a99706e7ae5d0d0cf17470dffddcb7c1c4c1f1ae8d81318d2f9ef57470a19b3fd486dbd1066ac3ff447d76e04009f0d31939b6a197a005f7140fb4e91f920a68d31fcc5d6302f6ff3a09d87f475f2140f724e071a03e3ea88ddc58607f6f2434adc7bd2fbc8405e8b42bfdee8b7fe9759cad4ebbdab6e410a7d708b4efe22d62741d1d5a595ec79155459b4a892c4b3b87ebaaea588d3b9105048bb2e87b6d4b8a2cff1e75b49bde7dbf928e4e08a03fe8e49df591102d8a39d10cd1007705a69c7a29738046c7d95aca1d6801247dd796b2075c308d2f25912b6521e609c68b199998ae943fa0fa1b1b1935a8185e290ff182ca74a1051aa919255883be5b11809dca30ad007c3f180092aedacf8aa58a3efb8263cc09f533cc1a3a37787c7e04b083478f03ecd0001e28d0830f3f6840080f94c410247dd7fcb1e6a6d72aeda3c71439aacf6ad4ef336ae8f869ad75b9e91689fe7101ec701e3dfc003b78037870eba47b701f7e700d08e1a7a579a0e5b68acb5f6eb3c03ce6560b990b394764c867ce19e1606e7acd392688dce69c932e720ecacd8f9ca3a2e52ee7aebc1ce62757e4a673461d734e0b990bf9d9b5dcf48e480ff9d9b9dcf40e8999d3fcec606e7ab744cdcf2ee6a61379b7c4e6457e76436e7a07e5e6477e763437bda3a2e5675773d3bb2a2e7f39cccfaec89788f9d9dddc74999fdd912ff18808b987449beeb9dc74efe534a7b8d6aa94843ac773e490f9f8c47a7a6034d0f0e2e171edecb4ce533c9a61861b0e1c45376ed86490812886186a3a3a341b366630c030949323848323ab5123f6c20b3095ea659a2e175c68b5d042784483c62d952a9a31c35696442459fba7dddccc6c6c8664c810aaa991a150b11831603434afd3c9050346ebc50bf06866e626235314136383812132996ae348eb9c1729b3ce295121561192754eec7585288bcda8488b9bab73c016e9d675410409232dd7eb9adacdd04dfab77e00c85ef5903a459f95e80a15dc50f4596d5db3747da2cf5a69e8af4ef4596f5db5a84df4598fba76d13bfdd5057dda565b225d95e8d3da9a449ff6d5d648e3e8af47f469616d97e84a449f36d6968996a1dfb9e8d3cada2ee918fa3d8b3ead505b27add3ef58f46987da42e922dcef57f469676da5b4edb4b4b654b457d1a7adb5add253f46989da5e6928fab4b6b659fa893e6d515ba37627fab4b7b65ab4d9ef4df4698fda76d1b2936b3547a45d893e3957734874127d72afe68cf4eb883e39d8126dba13d127176b8e89762efae464cd2d69b29f66d127d7dcede4869a83d2f48a3eb9597352da8a3e395a7354b48c7e5a459f5cadb92a5dd34fa7e893236aee4a43d127676b2e4bc7e8a74ff4c9714327776b4e8b136da24feea8b92ea80bfaec3aaa449f9dab4ba2cfeed59d917e1dd167075ba2cd987e4a449f5dac63e2ec64dd2d01d26727d49d93be409fdd10142e2f12e8b39b7527a517d06747a3a2cd02f4d9d5aab4e97f439f1d5177579a7676b6eeb2340d7d7645dd19c5d06777d3a24d57f5d91d75d70591369dec13099a3e3d57f58c9cdecb7a4b9c5e25aae14a0d25215b8e2c394ab2221f239f52ecd6a3454f09568f68a0a1f46af110e129b95c3b48ec945aafd3c8291ec166586206f116c3c1040eb1487663c90dd1262483131944a2a118a0c420d6663a5274441acd061536c4590d862a3088434439577244211b4e161c515654a386685f787ffbc2fb9ba46855aaf77781145f2d938829ba5c2e20e182d87ab560a485f0084663091ae12d9662221516c9662c9911da844a27654834444221c3daeca5fcd3683754dc84b39a4d159b708848c61519a190ad264b4d282b4219a1c2d82d8616311e764443f3afd689c82974b9602001236cbd5e1879011ec1669698016f31192664c02259cc9218d02604e30406241a324131bdff0b09964850a873c021700692204dca381b5f682f554ab5d2159148045f1f09c22e09c6485096e5daaed157f46941ba91409074231d91608b045d442c129c910e7b2debe25e9d27e6c0e386fa41283ed91e02cbb02ab66e7eb83ba7ba0dc65c1ac2fe1ee9f6e14cba997026dd68c84c92598533e91603cea41b0d646e28c8dc53e4ae22b7152632f715b9b1c89d456e2e322522d323324d2253255c90691328325327327d225328329d22d32a9eccd48a4cafc022d32c32e58206999d88ec47644f22bb122a32bb0bb23791dd091c32fb1339647628b24f91bd8aec5664bf4206323b1637c8ec59e020b3733103992b112799eb11b926c143e6aa44ae2ee821736dc287ccd5891c64ae4fe04cbae50a05f62bc6fad8c31d066b58490e8316e4c20a7ae0fd4aa59a9f5eac4a9f1e139eec4a9fde124f284b9f9e136fc8a84f0fcacd4f6fa6459f9e947ae4a747ab5df4e951d1f2d3ab11e9d3abe2f2d32342a24fefcacb4fcf66a44f2f8b57b4449f9e51cc4fefc6449f9e16323fbda3257d7a5d08f9795b4efabc4486fcbc2e287d5e24667ede97149a9f17e654c4aaf4799920f2f3caaef47997d8fcbc4259fabc4e8afcbc43467d5e28373fef4c8b3eaf147be4e7a5d92efabc54b4fcbc35227dde2a2e3f2f11127dde2b2f3fafcd489f370bcccf5bb444cccf7b7326ee912ff95a4efafc880cf9f9b9a0f4f92131f3f37b49e9f33342f3f38351d1e7b744cdcf2f56a5cf8f09223f3fd9953ebf25363f3fa12c7d7e4e8afcfc868cfafca0dcfcfc665af4f949e18efcfc685c177d7e54b4fcfc6a44fafcaab8fcfc8890e8f3bbf2f2f3b319e9f3cb02f3f32b5aa2cfcf28e6e77763a2cf4f0b999fdfd1923ebf2e84fc24b59cf4492232e427c905a54f1212333f492f297d928cd0fc24c1a8e893b444cd4f52ac4a9f242688fc24c9aef4495a62f3932494a54f9293223f4943467d92a0dcfc24cdb438f29344f3ae8b969fa49a1371b987c4cb4f92cd8df449cae2c1dc5bc28b31d1676dd3ff8263cc09f533cc1a3a37787c7e04b083478f03ecd0001e28d0830f3f6840080fd01625e242e26504b6448c09d9122127435066526854d4aa105db1652932ba6971d485b79c880b899711d8123126644b849c0c419949a15151ab4274c596a5c8e8a6c5511731265c4b5e4e86a0c498902d7122046548ca8c46852f61e4de8a1a6035e6588d6de9578c8d7369c831e9365477e8cabf34eb9e92137d7ab22553727caeb326faf4849c44f1f95c875cd0a73704e549cfe72aa4449fde4c0a131a3e5759127d7a342a92d458e9883ebd5a15243b9f2bac44449f1ed19523e7e7fae2a24fcf96a51699e1737565d1a757645483707cae2d2cfaf46e9e165d6e7cf6a32bfaf48ebc2eb690e1b3dface8f3b6887089e1b31755d1e77521a145e7b3dba6e8f3be8c60b1f1d989a0e8f3c296b002c367af3dd1e78d314125e7b3d39ce8f3ca964cc1f9ecb326fabc424ea2d4f8ec432ee8f30e4179f2c2671752a2cf3b93c244f5d96549f479695424313f7b4c3ca2cf5bab82c485cf0e1389e8f3125d39d2c2677f71d1e7b565f122ae2cfabc45461e94faec2d2cfabcb7ab4597199fe9d1157ddea3dbc516e5677ab3a2cfaf45840bf9991655d1e7e742428b6d8a3ebf97112c379f2911147d7eb025acd0da137d7e3126a8c8f84c694ef4f9c9964ca9f94c674df4f909398982fa4c875cd0e73704e5498ccf5448893ebf9914265496449f1f8d8a2434161ed1e757ab8284c24222fafc88ae1c79f199beb8e8f3b365a145663e5357167d7e45466dca7ca62d2cfafc6e5a7489f9dc4757f4f91d7d5d6c71b3a24f528b08972eaaa24f920b092de3e7b64dd127e96504cbcbe72682a24f126c092b5d7ba24f528c092a4d73a24f926c494fc93d6ba24f9290931c3c2ee893340405878e127d92665270cc24fa24d1a848e53fa24f52ad4a9b9944449fa42b325cf449b2916e27294b48daa24f925167d127a9e88874eb1efb4eba617f4fe6672fe9b30af9799df4090ef93942e93366e6e7494a9f289a9f4f459f336a7e9a55faac41e4a7ce953e6fd8fce4c9d2a74f919f3f467d0ae0e6e70e2dfae4e11df9d9c3eba2cf03b4fcdc81489f0d70f9c903127d52e0e5670f46faf401e6e70f4b0423d914c78ae0fbe0fdee3ec1d46fe34b61186fb85dc7851cd995d4e526a52d1a04f3b3542a11ff74fa0fe22706647e10c24f8a29add596593541dde07fff96281efee0831f7ee32164e30e8a31f3b062c0848ab4a6c448691075d1227ec2283d82e9db1dfc0c49efeced6e0e3fefd991ef3df7f476f53daeabf7c72fe93d28cee167ede127f7f47df8f93dfd0a5ceaedf8eaf3d7f5c87bcb10a414a6a3035a52c77c32521cef3ec5ef7f72f36b3832088bbdd2dfe97513c777c6538d9ffefd7eefbddef9f54ae6fad7cdfc23bc9c93fe72d3bb235787fb9e975e7a1d8a0695f4ef1d334f37a3b7b0dabc28a59452d2ba6929ed4abbf73c863fa5d42bbbf6aab43dc8e3287304dbc6560763feb7a64e9d12fee31be638777777d20637b9d28b9f2f49e48756abd55a959494de13815c89587aaf4ab5b4e1a707a3fdaab3830f3f3b0a1ad43067d2983eec4f1dc84b19461ddc628562cc6dc3dc671dcc0347fdb98b47d277fd44d6e3f0c7fb9579bce50dc5b7be233e2796f931f81c290ccb0c9697e3ee784beebdb72290371bf3d89532a30f377930eee026f75dd9e33d36fae7aef5edba37ab2ca84308ab93b13a19fd7b005eebbda0dbb74ea38c4e29096c95eef0dd4e4609f4c562cc02fb3717d85137f453cc811c2dc60d1a9b86bb0074b54355b92d2f68abc2c1701ea760291245114752e8600a36cbbdc7791cf7f67ab6bb9eb565e7d9fff1eb759ce5acadf58cc7470dcb9dbd4371031bce2723b6221f18c18a09b7143a188275d7e179b31b4fdfdfdef1fe2b73f7f6415bbbaf2f6587832d2fc7ed70d32b57ab0d6e76e5257faead1c0b5e983ec86d31f683945a53fdba13b648d69629541873d8e2a6303aa52e3f69d872330c0293b8be0c5d6ed207636ed2560d5d7e36ee8e34edd0fe69df6b771a9841192803996c31e613eeb725ea5e12ee294820f2be411918f313a5a33aa660124c412698822edc207863c4428b308236374d7ac214ec822978c3f4e99f28a50f7621ba156de127117d108beff48a72b4cd0f746a3f20b00c835afccab0e5260d5b983e58e467068730173f1f246a15fd5bc23dc506b3ee5e27e326ad4a181f249a82e50948048243e01048036b6148c12e60a7bcddacb408638c19c6294a1cede0f1b3a7cc0086ebe7682ab83e0e3ff329c4f54f3bbdaa74d54f695cd7da0aee6f157d9d56d16f928ea76e2ae51ed87e649bdda6694b203f601b5e6c31d7a135b1b66ce166e35ab32700fb3b95c327a37dee2967626db1f2f444ab933153287a08df29c62ab05b81fd54811e7ef8d9bdf7bb0804447ff7e0bdd773d984d0e57acd99463751ddf74cc910e6fc515da9c371f794e29eb28409f6a745740bdfa1455aad568b88953f9d72849dce664005ac35e92930a0e14cb960cf948633b5c2e2e272b33125595b62246b4b124e04627109221b83d5a99738fbb9c90afc38d55a83b1ca60eca7b5abf2827bca09b8dc18294f7fabd56acd56d98ebdd3337c632cf3a5dd494cd9c10b7c083da8019529468ea26889a20a5670ccd3e9ea983c5150610ace272cc50e6480f36d414d7594d25a69adb5d65acb5a29b5a57963ac5fbf5b04a2b5d1c32d051312e03c5a25523f8e6dbe0e0e0e15c26871c6c18ec3e1961224049cc71dd0c0360b42ab416a3d8eea34ede61e04b9cedacedaee8a405c29c3d8bdedac2d2b0bc6fab6d66aab0b5c0867bb9faaea76930b82fd076cdf4502506c4b6a5fc7cd7e8e65cb8a05d8a90a83f1ad257552f5ef1dc7d3e823eeee9e7c1f48f7594819040df6de34398e03630e73cf4a20f423cbdbdffdb205d27deeff4afa3fb58178a512fb5df96e3e1efbfde6cf66e867ed2c12409c548dcc4863c0ed9e69464ab9eff7cf3df0588e0d641cc7f13530048fa50648550c3f7c902cbd3c48c3912401f9c0279148a50644d28765b799c11208a954c29547d82fe2da71fcef7ec58dfe5e5944c795bd2aa28853557d43d821b472452a1363fea17e1017e267dde9aa35df14825f50ffa7ab5c99475bcee83b0da65c2a985ac13b395a45dbeb0a8331f76cc78f0d5f6f99eff5cad30fb602dd22c6fa9d77ed05d6d868cdb182d5fdbbbe36ecbaa7d8eb9ebad875ef7565bb07d2b069f75e8c0b8211779e57725c5959c03db551acd77dd65a1937e9771d67ab638eecbeeebb5ea971bd20186b256b7da15df7d0cea16f329d6a3e6549a993773d555505c1d1d2cf1f6e4a3fd3e0aeb555f49d865e431da76d6de966f1fd10ef7d74429a78e9c3fbaf14427a21df0f6901d8a92cc6b0fddb310f5a1bbe08ab3be2876fbf3af197cfde44c96bbd1a8f62ca4c5b3a177cb1a49285d91e9d0bec3bcc7a13d83a81ed13d87ede0fe40e95ba84a82afb1fc94355d9afa17354dcb432fff2dc8ac8637587c4432bbde963c6aff45bde3b8e60d9551553be589a2089fcde617587de3b8ea7d3ffca6175a757b11989a8eed8b745d83e91b52f25ad519a7d0aabf78ee3e9943f9b18ac4b38acc518577bada5977fb10ec330204c25d154a24aa1f82fae1f76a83bdedbe7a1ee7c6f4799323f1eeb0e173b8d8fff36d8914d62c81e5d191404be7f10e93f8a1d666b353daa54f6084b54492cfdc3f7e11f96429ac4bc10f0bd44951ee6c58f297d944248ff853f64d5e4e52f895a5512552a5105101fe67d880f535ffc52e923fcaf14e21f7efd5e892fa81ef5b10d43133936a64575e7de922d7d3e596bedefa83bdd5b6b1f347b0479df95c8cc832df8df8b1f1444fafbe13bc04d6b5fb44f22eddf19b6ffd1b0fdae862d11b6b0aab2ffe3bdea78d8c14d6bad1893492286dd52dad960ac367862a46f4b3f4e861d1191cd5654546f18082ba3de90cc7b42a5d6177f1755cb524893fa42ee7fded7d207e9bfff4a21df93ca21abea79610cef07b59e5670f6a260f7646eba2784fdbd29c65c6bd9ab59a9b54b1e61cc9e8c74c444a603335fefca600b7bf664ded496b210148c75fe11d55785d5589555a1a1994c2693c964b21f746e66d1db4e443c5d5fb21b8f47642bba1dd5964c2693c964b21f7878787878789ca806b3c96e3cdeb94c686846abc16030180c0693c96432994cf643dffad6b7bef5ad6f1e9355aee876d472bd6030180c0683519b4c2693c964b222988c0a0dcd6835226a83c16030180c466dd4466dd4466dd446856047b735ba4eaf879931afc16030180c063b82e9dccca2b79d88c67679cd6b5ef39ad7bce635af3bf58ea737ababf2d48a64cc17dfbe5ea9ce6a74014d2c23246e361e71fe1d943fe97b457f47dd4179892a40f7df27c07b52f901d27bff951f68e283f49ef71ff8be2b51b757f4bb762dfb76a4c5c158df45dc525e537e5a453f5ffbb4365edc52e86006f8eb4eaf6e571e5cb33516de700784f7406eb0d0c2f44b5e50e95f5e7c0ac6df91823153dacb974afff2dd5727de3de5c266baa3f6a83be277a7bee984375fdc955d55f416d57bbdb2c77592855fcac54804eefc08dc5dd06397e4a1aaba77724755755f227b207b5455f72f785e4c8f497d328ecfbdf7b4037fc885b2cb78ea9ba6efbae36f29adee84651dcb7cafa9a46557952d8b68e1bb5cae2292783bc2de1a12c2ddfb10ee7ea8eef46aa806235752212aeb9eba5c2e21aaaa7bd062b0a6603cc1e43eea4a6bc55ce944cdc148e9bf680121024159205c89b26f805ebd94def43fbea3eef877cf83107ec67cf74268abeed4efbec7d89dcadc2f45454d0cd0abfb30648f5b0605894ffaa0f0415a547728adaababfb70865cb1e2f25cafefd212bd2dff741fafb30fffd905513d3c7904afc39ff9a8d42fad22700fc1712659f44d9125580d2bff804bc3c8c2ffd8b076958225ffc0b09e3513a284601c18e5f66be24f3305efec5aa546446e6a554805a8391bedcec3ea6a4aeeee96bbc7204b7c80969e223fcd20b7979f11bfba0543c418455a9145242f5b86f805edd52481398d207f8df0b119ff409a0543c6165f59542c2075d8892f7480b97c8263d3b029602bc3ce913f0f2a4f2034d7cf897fe03f55f3e01a507cb0ff8974c14539af7dd1d3d4ac3ddebd41df0bb37eb0ee9bbe7a93bf7bbae568f3491745523c21db5e1eea968805e057d7fdf23b3e991d90c0a121ffc970f0a0a9f84839b5df72ff408771fb670f7a20b774f7ae1ee4118ee62b8fbafa34555d5fdaa44f64a247b1592bd0257bdaa35187b943bdcecbaaf32e81154dfc31bee1976883bc4b91731003b953dee8260cc95a8c246fabdf3b5cafffb4c26dcf9f673448c36b8491f088adb57777cdc2d1a80ae6ad95545a97b1640b3999010502cf662b318737d619bc5e8315c544485f0d191cd62cc17d3ee86dc06d588dba086ccbfbdd63aa7c60ca80d7ffbed3584700d5b0d2635643566504348c89b54c5eabb0d544c543150c9b08a4895441553c54025ab25003b252e31e6daa54bc77d25ab0a46eebbcfe3d83d31987a47869ec2ec1e903db87ea6c156a7e374ea915187c7b6dc5d0a90661171dd091a5746fcaa096de23faa00860c30e8b45dfc1314384694237c942d688eec34c1a40eb460b0ebba12100f8b3f5304063d74327c0286d9011718c57dcf7660058a7b196c491212987b276ddf52e5d239f5eb13481153b2673c3801e6c8a22d701d732dc2d923faaaaad5a3bdd4eccd70d589611247abaafad9be70dda2fb92f837db16089248f0850482f4412e167f24c73795fee5eb4e2522c2f52bcc11ae25927b12d9e1d1a32489e42a51dd29aa379bad36afe212d1f8e2225905d3af55b40dd27b64a954d281249257aab5cea1ff8249240997482530ff02f3234cadaaa8e97eb84402017e902bfecb876450132048e3575adda9b50804c70ed3171f2c59cbd9afd89e5e44ebb844dfd436e8835d48f14822810cd1c2b654e295a0e795c6cea10f360efd0b4112974825dd8be45855f443d28ab692488fa4c47b9184e16c75eaadaaea83642d222b9716ae1f929556ed8b86eb57d8681f0cb9b1134390f42791169bac97a59044560cbe8424d23138862692292ca560ccb528ebe8b889829162c7dd7b5f1f8bcea95f9ff64edd4255f5ab25e264055c3f9b70a5aa5ca580ebe70fb71448b8611a5c8b3ae704a3bf57556e8331d7225cbfa8debaa771c5edd97c48ed6038013b955fd8b07db0e90d653c5a55d96a64ccd586edbb0dc67c6281781cc2f97a366c4d30e613101653f19a60cc21ae498cd9a361fb4f301016e7108569f9127b8dd5a3d59d9724f925963d226cf34b2c7bb497989bf64b30bec4b0b52f6c35490dc74def6ad79ce9a69f5ae563be1ca5cf75b4cc1c47ffc7bdaec4b4962d186df0d3e28c03879ff43fdc53ae68c1b43676b8a5886284f3ed5a13fcfdede75abf7e7d4a2967b153b00bfd725cbbffb70c63b5b75aa948f8d9edee9c37e9fed5bbbb7eb5360ae81f2fa4889fd9112e9d558e1752c3d79d23729442644090842844010a0b4020845511a390227a5495fffb73ad1787c4776c6c8d04672e0867ee888d2dc98d890df704fbff3052dc3e80c20738dbd86af8eff3f82da50755e03205169c70896255c3e79e7d9f757a55c40c2128b12ab0a0049424ab1aca262dc59616ce5dabe12b8f2057429ab0b6b47c86c68def5711e8e65a89c64c6fa46cad602732c5f235c2984db11be3fd2b336293c9548225d224234db1526908fbcbccb07f0c4d088604c23e36bd5f9818d383a52966224d32d39b603786fd61ca3ce25b65f755555e8b306653ecbe491663fa7cc2a511a654e698d2648ac1944c653ee15b7a53cc24f3b3e94b8b73c1b71bf6245f7f5afcac9513c5bff7de7befbdb7be48fe48616bba5ecb4d228c5c786100204d495ce53f2e110edf8a40e10664587c973296c87c89f0bdb7c502f8ea96a5d28f4b844571a65af182482578efbd3559065fd3e79ae3bbee00e07eaa7b7afe3e8dee79f1f75be81e187fdf85ee39fd7db34f9abf8fd33de1dfcfe99e187f1f86ee41fd7d1b7dd6fcfd1bdd23e3efe3e81e9bbf3f43f7dcfcfdb3cffffb3ddd43fe7d9fee29ff7e8eee99f1f701d067eaefe3eea1f1f757ddd3c2df1740f7b8f0f76de8d3fcfb3bba47f5f76fe89e17fefe00baa7c6dfe7d127cedfd7a17b72fe7e8fee81e1ef17a07b6cfc7d03f4a9f3f713d03d31fc7d05748f0c7f7f87eeb9f1f717d0278ebfff80ee99e1ef43a07bcebf1f81eed9f9fb3cf4c9f3f72bd03d34fc7d0b748fcfdfefa1ee7c7fff87ba53c3df0f7d8726f6d64f9998bf4fdba7daa80d7f98bf65fee1b53c57ad325e2fa8f45c34b1ba13435655d447068ddaf027d1d0c4b00d7be9f367c30e729c0814f31ccc7362017cf589a529e6a6cbea4ecba08d3f8e2f3164d8471934ec9f0300a4adeb64de138162de731148090fd9c6f6430a118201357c00ca215009a0ab1c4f57394a57b8aae15d761594e38db82b00fce7c3ae6a288d20f2b2caf1bebae2fb0380a41dc37d2a0299807ae4f86bca4176c770c11ed2b10f69d2d239fe50780f496b0fd99806d294a573fc79489312daf4df214d49e81cff933421a173fc67204d583ac71f076922224d46e81c7f194853113ac73f06d24484cef1d7214d55b46982813409a173fc734853103ac71f8734fd809afe3548d3149de3ff0269a2758ebf8a3449d139fe266992d2a6bf0ba4a9079de3df026982a273fc6990a61469224d503ac7bf244d39e81c7f92343dd139fe4f9a6cd0a6ff0d697ad239fe36a4490669aa41e7f8d790a619505313d2c4c4b4a473fc69489392364d3130c1a073fc5f90a6249de38f431219a38e43f14d9fef97de8a3aeecf0c814d313f1be33b53b60cc969718ee36cd7575664d9fb363693682a6d6c229058da6811cb3c048bff914146fcaac9fd1ebca4924e64c077310dca36b69f3a72b6cc71c14e7a2fc8cff05e1279712bf9bec54bb46a82e2e161e012611b2dd4455d369c4d423053cc24333131b99631dbd862d8dfc6a6c5cf1b9b0c43d0211e3744153594388e5e0b42474787ceecc9daee5a6bffb8b5b32be2e0a68c8c9bf6edbde3783ad11d5565dfac4118e903615976c73dbd29d375b907fea183abcccb82f67b99d9c4efb47b2f433f3b5bdaaeebba2ec4f96222de5a71ffe34ab8b2d22e0ea1a5ae29398e70dc708a52366c5b66079dd14a5a02046f8c3a6efa57ef7fc0f79641547c690ff44120f4f3104c4b0de828b9eeada8837dfa2dd2af4fc94c662f33ada94c7fc8a5be02b05219fbdb031b67a482ebd7284c307d0ec98873efbd0f72a4f75d97c297ccdfdb07c1af06073961f183585cfaecfdf5b0e0faa1e8e2971ee448d25ff2f677640a77658b5407a5790846f1a0f54112f9011184c5dd399603f203eecec9620e5c0ef7d2e772885b08dbe096c2082f0c3a1579a47013197da04f6978030dcc7d62fdee0f4231f73f1e52100707c80be69ed2ef72d84f9bfbec7921270235bd99c3dd38222559818be500096e23dc513ce1048e52a40b97ee28a060c17405b8a3c841140c825f48c50a9a42d3f74852ecb8524a2f1eefa5a117867e86d606ce34de5fe1cb55fe39ed63696dc3bf8e60256b10464ac711686c279148a41f6bada55a2ad552e9651cc750d461eb87a14cd844186c2a2f396238babfd15f35e6f55fca3cd632864977cc81627b5477c256d197c1f461ca7c4b653ee1e870657e2cfacb34bfccffea4ab758c6ec2f3f0272657f9ee3d1451e25fc72c30b7e79d0d21e513738ce1fa8d83158dd9df4a0b51593c8aea512a896a88ac71fbf7ea61f4b3f8e7f4b3f8eff8dff4591032678c4f7a51842145ce2966208300cc6c4c4d878b754fa308c9843fd71fcfaf54bf57e3f92e38b78c3379216e700471168fcbe1c6e52ef46f4be6f1c6be98d2f2f667dcf5f7ec4cf7c1fc6d43d31efef49748f0c09e405c3fc2563488a453187f14da61fc797211b9b1adf0f82e25b3e99af0ff7c707451ea51b6e798a7141307a1138fc7cfd087914bb9ffd35766f93bc8c0f8a3c682987d28f5f3f1d965677c4567d3f83bffffefb9b2d2dec1c8fdef1c711c854b69ba6bf26d2fe3876dd8581216160a8088ee408f339e6653e86ce104d3ffe8fcb50ee47b27b1399c226203487693cc712e63f18d27eccc83dcc98c3cd1762b5981379bce0ac832b48135a2a63a638464f2e956684a4d247a6f00784e2fa39befb9e47dabfdc7b64f7b5ec1822d057e6082d95d18777d3879a9afa1583e507b00c7967781d07d638ed1a5bb23f7446d2f14b891cddac38fbeba585e4af1f3af8965e9ec935988ba12ee4208808cdc2aac607e13c918a85d6ca88bb7ae13b95bd1a2f907405d2f005b257a00d6b90bd7a81ec150ed9ab22fb7dd79d7f213b249dc3757f7aee6978de9ffcadbff5b732dedaefec775da4a82209eec12d45ad08ffdb8e2bff69687832de362184bb0adc3e90210183366408672867cca071f331883abc8ea8c389e67f2a0d928633ec8e21061a621075a0a18383c2909303e3539e07d61079d017c41bbc949bdd9b6ee278de8986c63b91149b35f0bca052b9d0420b3c29fb9ef7a74fa54420cff3ac2700cff3eca91475f0fee423eab0a517094058830ca22b9cd2885fd5f81748234eab1aa57de233700fd2103a4ce64f2799cfa3cc93404e4777c31cf727b0e3e26886a883bfbd755bf879d43d8db92f451e4e714e3d8cefb47445f6b91779507c6365e420e3ed8d78c389ec6e168aa519178aa57f79bd68107538f64acf7b6bfff43244a0938c1309f3963cb919f3a77cf3343437369cfec6c23c0d0d19f336854fa79fe1c3e9ff699e7beb44f7dc3cf7e00d4971cdff89b47f4336ee1fa7211b5f3fbdd2925e19448e30470e37bb7b80e072cc73254a048a79f0de70f63ee6c17e2071280a23c5b784f918f2e4a697c2393aa77f30662b649d7832e3bb32531ce3ed9319cfbd15e29efb185df137d1d1c2e9e47d1096a6398efb191fa3f368b8fea934a712c5a3854f7dea5be800842f90744545967dd5fb2bf53458a9b72f66441d4a1a344a551984e212c6649fc6feff0908c5e49335a92f693cf79cc84ab9e0c2d31bcfa3f91927ef81bc60af7cf363441dfe69ca2028be29b37df261441d68bc570641f1a9ccf6cbffa9a60b2d7c0ba50f258dd28b943e906f637ece28b397c4cf2f7df0647e922f25f106efbba20f345f963e90e5975e44d441b3d085fb9b32f7db3cf7f6899fa7d287b6437ed294ff2591878cb72f8a37747972b37b5b8201084391e541381b520639bad9c588f1f66394a19bfde2b30d6c693ed3c056c60cb64222b639edd3cdda06f7f6870e0e8330da9ff9165965d8717f3b11a8b342dc8f4f53e6d3a914c21c885f90d9b99f2165c8dcad20cfe07e1832d7e0a6feea6655c5fd672af33896f9c495515e4824b87e37ab3bdd0a5a55df064d70ed6080eb87dd0cd7fa1e699fb829e4b022aebec32ac9b9147d65adb5e600b99a3bbad93d74b0e538ee2de7b55c701b5240f0c638fa0f1d4ca90ea694d2fea18303b053b976912e98f496f41da94a17ccf5185b8a2a5cf00dafb5b6fd6c6b398fbb9ef7430e29dcc38f83b587444f4ae96981382739203fd8273d49cc8144bac13e894422b91f0217cc913ff803c1a53057f6e0a69740b8921e71d37d0bd087ee49ffbdbf67d13de13bfd72e89ed49824ded03de90349dd87c56d6ed61f8cd96fd83d8bee01f282bb73b6f05bf7d01cec735b74d4a771f6a31b90b819f382a0989634899bb4a3b69487600a33328e6ed61e4cf3ff741a47e7a18615088beb1415a4242680f5c16ae9ca9695369a96ab630e654e9cef98aef2bf6314d83fd3c0f59be3de6f18c777c277339bdf7b11f008f6b72424edaaec49b0bfc7448bbbf075a1a2d1dfd6dcceec143fb9b733ecb5b6b0b5796eaf00765fa5181d47c471b3ebeea3be711cc77194963db8d97df5c1c8d528ba5a72381d690ec1434c1c1dafd64a710ed2671c3985bd06fb7768963fdca4a287e40f37bb372f0f0fa9cc3a3aa679cbfc7f2aea7aa853c67cc2dda9fbce9dd26ed3e866ed7ae86655bc30d9b35a171cfad97fa9d0776fd8d23cd8336cad49760ff7948a5e129d6329a5f91a7d9eea68f3f9e271c463add51d4ea8aaecdfbc4d992f8c3a83137aa17be8db37a98fcddb19653e3d57f3379c4dcd7b357faaf9aee661d43cad79ef456fdd6364447d4d0c2f7b2f194d0c5b0f866daacd3e514f1fa74f14ea6b48288a42fdbda86f51c6ff78eab99f21f3cccd8c9b1930fec6c90feaca2635352fe3c907634420b29461ac216b6a504f1f0c434aa61e14434a529c222946d590f6747373f37fbab931dd3c0de54c36303c24b1246029449130be86b46ec2788a51672a45534fe3e98334299a4a7d8b403462c88001e383b0983e90174ccb521904c530ca8c7ad4932c544d4d08d694281ea8279f44dd297efedb9bb77fa9f8491fe665d4f8897afb94ac331a649de2a6fd14596934618a7c907c6ae30f8a3ac020893a548e2c513c527ff337a9f2c76917a29e2b6f6e66fccd0379c13765774ebe799bff441deacf2883a0b82c33d501c6df944150fc65a67ffa9f4a81504fc9c624d9b8e33e7c1f4e309e0cdbaba5ffe3641dba216b942de851176f911e44bacb4dfb28d28bb8498d8cf45f7ce68462c4282f08468a058bff625fc6be3ac77e75c248cb4ae4a6fd174f43562b5fc85118f44465de7b55957def65ff8e30ca3c56f345596b6e5a53e826e9b3f7023fd79aa7047d18f55e7efadbf78e78303a1304c533ff5365c88e21f3c390393491f984b3f702c2c3d9cc8e73e9f632ef05c9b675e72befe9e495dde5bd7688d7174c805dab0ec63c9ea84f486d90fd82318fa98a821ba61c101c19dcdd32ffc05726fc21834924ea2a69100becd316d89141a0184d6e9d0a41877cc887ea0f194cfa61682c7da9bee97da87f499ffb16840ebd50b7e2a74784c5cfd146b5f8093e0d9f22094b8a84c6fc34951ce9eef73f5dbca6255564adb5d65a6bada536534a6f0ff4d6a2365a44b9502d5d742484901fd4e6de12a619f6eedcbad75a64bf879a7f5c227bed876efabdad02d415577e750a237def1661afd7ddba5fa27a896c9b664ecb3ec399b65a5ab03f0df2d346b5d02d68111d332da95cb18c55a83ec16eabcda6f859df69d8a9ccbc8fd2772963b5d65a5b7a4fffc668f914a7fd48b5b5d65a6badb5d667150a5e9b914ef329f95efa2d45132e353bdff2d93d02dbcff6eecee1b5b3b5bbf77ab97e68ad3d6d75ec3edd96b315a583621c1c9c731cbdb8bd3a99729372cfb5ade4bbc964eca7ef25f163435b99a6d2fd8fcfb083cb4854556dbb45e3ed9483a36f992e1dcc82f2aaaac6d52b0f7e1c8930c3fe329fc251d384be7dd367f0af468cfef949ce9f94a1d696a37dd7f19f02d83823115c385f7cc316cfac1cb580334e106dd97724d856f60651af36ac24c54f64b8674f601807ee99932560b0bbaea41a595c5c7e7a4c0549fcec591424b8318b8b8b625bb2b80801ec54e666982b825e01379d02eea74f68ca058b0d04987bef4c64f7785f6d75c75b55c5fdf5b2b4b56ae52a57396fd57bc7f1ab57740e67eb1c278cf5b9bf23a7e2feebe9348e9c9f5d0d8f686edd1771afd339f65bacd96d5cbbb730d7d5e7be2ea17bbae7c0e7be3aa177c2ff3ebfc0f0aacd6b95f720599be4fd477a46fcea2b9b741fa38a40b57ab59a3ad5264e9fddd7afa0a7e3b1e566b8670c412d090b607d905acee28ef4819f65c41948cb4c433fbd17e791ca2f65589a977ea9e4bdebe4d8e183871f4204bd90c89ecca81039ae0f8224c5a69f622acb94a638b68d4cf29ef454bc61084c7ad34fef49a44a7d28eeff4a20de0d4d3ffd6dd75e66af34ddacd4049487a8838b3af8774028f6ecd75e29c7715dd7759cf760f779f53c8ff4c1fbdb799e773b8c3bcfbbf77adeaf3e454943f8105ac1295ce04ade4081612856e04a361418a438900257b28780411f520257d2078375c88a1dd20257f2050c722bc0956c01839d145cc91b0c7a4bc0958481c11b52b2674f70812be90206bf30862b49030649a452cf726005aee4077131102f0b586861fa439cfa08406b6de7d0075b242530f61415bc9accb49f3e57f638453b7501e72eb9fce81e2074b092ee87f413defeb5df955c196444ce8a7b57cccaca60cf3f30e5c2a547103781b1fb53550d59f51490e0a0053810b2b55a2beeedb7ec121230018217e860156444cecabe2b66d50519e12bef5d35b86a580969e2c3be901d9e4848131fde73a5901d55e5ef955c496b2a84600a254f38820cae188239e4045474c00216404154032d56bdea3ef3f8f8566bc5c54f17b07f576910570619916365df65571cc75912c8d39bbb17ebdea1b51fb4a5cbaeac11707d2074b012fb7908ceddffe3b485dddd8a53778f2245135c70be98be144d60c1fea1eff8ca69e08c837520005a699a8f7cc2c101f706b1d8db7180ab3872071efce481d2b7650e62f1e56187fbb9891c1024964de8ebf899290efa24b0d40169a51ea56588e3eae8943a42ec4fbd7e72efef001e6e101e9dc55e894306b70e0e33f53537d0bb236a8d8b6e6bfe02bdbabbbbefc0c1df063fb3c993c3a4b41d403bac7c6aac7446dd74b3eab859df74b3d2709d82eb0e1c2a165cdf861c26ce8eb596b32937ebd7f74acbf186b64ac4a605d7e09ed968186ccbc49804d3ffb87c47f9eb82e9935a989e64a8bbbbbbbbbb3b498b2c01093671cfaed8022fa18653b8674b60822975d5701e291128116811c612ee59142ad896594707e7314b0bdbe09e2dc186af38f2d9ec15453e5b6dc2084490117f469d43ffc3a26d508ecc297c8516ec02eed9155128adeeb6d6ca89b676a20eae3e5739daa5fa2cb79fbfa24a8950ed0b46ff2210b1836e4ac791d56d7e5f43168ba3d8abe5ba2b75e7f4d732737f39199216a922cbbfeb6a97118ab17631562b8cf4297e8cb2dfd8ff2baadc116e5f51abe8779faba32eae04c9aa8471c43d65062e4c9fe50277f7d2eae87c896ad8a2b55f5115c64c5d9816e1dcded3a202d495577655d5b764df70a6ae6ff2c725ea2785f8814631d6fa4ef6ccd60567ea72dc33db16983e2d4291701db62c07d2bd0ec7b6eccef1b2ab2ae3806d639b2912fcc38f4bf471a93bf48856d14fe2a404a6d405a777d9d8f8ddbe2237e9d7118c794851bd8d4deaeacccc2d4f0e379d6786b1bb64d3df01424c7ff7e7c98143fd82e077eff05455100ea4a48e6984ff8ff354ef782c8e450110d4c4d101f2bc2e088783e070aabd8e6eba3f770476e4088cb5250a666d19f2d352da4f473f595b8664fcc455473f10dc258a8777d99fa25650238cd7dafadc83f712d98a7adc186b79ed73f6ed9dd1746e8cf5efedeee96d39f6b55c40cfbbdf4f7de8178cf57fa4f0ad1ea53800dfb3bfcd97bab77b57f7fad9bdbd6bfb7be965d72460c33036f7c9506abff7be3e7ddcdbb168a43241dc1bf12bae6c629f44faec676fb03fd5c34088ed77df9da5968635c4d6cdafd51271892e11579f2201f4be3d6f057a0896dd2aae8e56c5711bb818f4614bda33701eb0d8235105081ffc1dc2b2dfc3820f418af090d590953f58661af43d480681df55453ac2412aeebe579c8e21b8579fe7213891c70ddc351173a859c882177e6413eebd8f6c12847795abb55ab1743b6f08cf725078b5617ff964a239754e124e96e32ad7ed0491de885f91ca26ed7df5befa799fe7796548695bd07b714322db5519470ef6a72d60ff17dd63d339fe35342f70df389968f4f71ef995d9fbeefb2bb3f7a20eefed1096ab4edb723dbb7e9d3cc133704b217bc98a64536e6cd88f4a37d32ddcf4d791904422916c180661ffae08ee5a3f4e31b11e4ef89e6290c4240982c102431404430453eb0edf8d8ca6bfa5d289e3c417166762119104547c4d71d381c487a1d1dcf4d25f317c2d2125954af44ba6ff715a2a95aec9549abe5432cd908d41db62a9f4a2589a2145f2c1fba617c9fb2572e63d11e88a25d29bc8cf4a89543291332ffecccf908d61666efa908fc84df17f2acc104c143f1b268a9ba6d283a048fe084d472613e861102f32de1fa1690beca55269e2e2a6bf3cc1fef4495fa50b8e01f7ac0aad56837b56459259155be09e5531abc2361b020cc7e09e0d2128091a9e01371449242193e22a3ae196e2aa4919010cb794236051cc000b7edc51cc208a9422b0601a704b29229604197edcb324d88670cf6c329c65d09a28223bc260d72bc65c2384fd2f590ac3f0bbf421d9c37db04402b9b74402b9b7542a8198ca6c45320f31c3e2b34cdfe21549d25f5299a989cc16931eb421a4d96362430c886574e4f38d512290cfb3b8b4bc6f1c4304f29e6554a3826944a0fa2c23dbcf373e89403fcf321aeaf9c63044a09e6719cd68bef10b1188e65946b717df7846047af12c232118df58460482f12ca3222d7e9ebe718c08747a9611110ddf184604a2e15946349e6f6c1281789eb5a5688b163f77bef12802ed3ccbe8757ee31711e87c96916c866f5c1281667896510bc7371645201ccfda42bbf18d4311e8c6b3b6d464f8c6a00824c3b3b6d862f8c6241128866719c1745ee7595b886c7ce32b02d978d6961b173f6178189eb5e528e71b772250ceb38c6248fcc4799c6719b9708d6f6c45a01acfdac284c9932743b37ae2e2a6dfb09f585b5ce2f7903b84b5058987230afcc6f4fb71f88912514cb0a392f8c94fd4cc977e66e67b5543ca4f14e94b252b064c1e45fa5ee510c9bea415b7c841b2c9d8c05009e3d34851c34c1246292378c2bd74ff234352060d09e363f1ef4b1981cc5492224a16bd2a95f9d608d53c7113cb986d6c3268b69a1a9b194a68ca988370f87e8d10ae4109c948e2e72d957c358020478f1ca5eb5735943298b8ca65c8fa629578ed966b63b3396a95f82af1868bc507c11a211559f7b303b0e94b644ee9e8367f1c0471c21659b7cc292aea104b1f4a3f93ef974ad413376ff92385efcb38e2278df79701ab3b3524d13e35331922a03e355388b44f0d8ddae8427d6aa8c818419fa9f79761043d67bc7f4d16fa2cdfbfe6c84ff26746a614c134194550c102f6af59c214daa7a696459f0f05ea5363650b3d6f9cd03e354459fab4799f1a2cd4867fad0a566e5860ff1744166de15151fcbca50f300fbe3f98c23e981efcfc23754bd4131ea607bf0592621832530c73efbdf7de7b9ffe256b66d4c7863685fad850a1511f9b1a6d46654a8d86fd6ba8501f1b2b35ea63436485fad86021a23e3292d460a13e3264d486bf152a44352b35443264508305c3bc9843e9ef2d7d7e7ccbfc23f534beb7a1519f1a5b8c0c21b4cabfc64601f0bdffa0b4e1baf3b9f0fd9137276855480a4b4f2a954aa00d61c8c6a00ded857f8186fd6da8c4d464acc42042bdbf0d16ea134345a616c30a8aa8c6068b8d136ca0404dff276da6d0a63f49da94e40d91be1101bd49e206e6a67f0de40d1257f9cb90c14c1219ef2f4336f3329260512cef933edf9f792aeab85f7a1279919862cb1598b679bf3be79a9e3e8ca93125514fc87cb302ecef820c9a8d918d146cb8c88fb38ded2604f986043727b031c55051fcec16c8c6e045d508f9795f061557f9d708d53c9141bb32b6eabb82b87df0032e32689dafa80328e02c832696aa32dbdcb0d7c4ea8ecdd0ad89a184b0bfcd50ddb9b1b1f511ce3268339f65d03edbb870a689c590bd5e48901c4172041892936dc688595b5e2f97cb058b21f4f29d18b222476047901471c590d51a64632be28a81c47740301623c94c9949486c75e7de3b8ea7d3bf699e6c27db149c2fccf6e4c939cbac2d4322c9da32b38225e6ebc2fef7ded91064f8fe8dcc10d6962797de7bbf22ec9fadaabc546621b8f497046f8ca6325b937845ff6c3830f96a75a7d66a1f51179cab0d76ef389e4effa6a9a3c3c332dac2cf146eec43b28cb6303a323aeae2e70cdcd82359465db8b4b8b4a8f859e2c695641951a9d5b0f849e2c63f24cb088bcdf6c4cfc78d7b4896d193a1a1287edee0c63424cb28ca6cc6c54f1bdcf805c932e272bb31f153066e0c836419311112d2e2670d6e7c2259465a8a8aacf889c28d692059465688888ca6f8190337e6215946538c6846b42d5afca4c18d7748d6162d5b8ab61415f1f3841b9f24cba8c8eb6594c44f18b8f10c24cb28894cd6c5cf17b8310e92b5a58b51cba835c5cf19dcf806c9da328546a3e2a70c6e2c03c9da42a556db82c5cf18dc380692b505cb16db169bd1113f6170631d926574c4086604b3e2a70937b641b2b6582122e2826120595bb8dc6e5bb6f0f30537ce21595bb6d872b4e50809c621594648622ca358e734fe719651909f226e5c8364190519b9aecbcf6c8ae1227e66ce865946aece697c8f509f249ead7b3a2626c3fe2699496866aac52031c54c341e9c4db15a85a1713169c9a618cc13ec3051628e608f8161ffce566fd12bdbd8baa359bdb44b84fdad0d3b27e2203e2702896565c1688ad57bf358c5f759dd719e3bc321c12e7ee92f29de7b673e833ff320d862e945f29625d3fb8d51c9f73f5e63a312d7af3e21b2ad263207c13f421c96ca767326c43333df2258fe08710880ff7100bc2d1a757470dd39c2f5ab1c01ada7a8348bd64b4359aa98424302080000100023150030301c0c87c422b1703ccf24690f14000f90ac5a70489d68590c44c8186508010300000000000020090000c041aadee8409cd89ed9fee00474e6ab19a2a611aaf307abb09a5ec692b81c6b35102bd60e6a0c17f40c24dc9921ea0378ee870cca0304423320118f6b50faa29ab90002288cb69d97b0e938a06fa6803cd044271b2169742eb212942c8fc0bd068e9d566a121dd795dc8478b969201d978419fbc24e813fc74a28da2ee25743eb67b337b7b67ee52b984e519b6eec94547130968cbb2828cf8fd9c88d5773bacdfdca030ac481ff676bf81b4807d19f9e9899de4a4bf5f9e4489e0b6268ed4e8e4e29f36d4cc028163e0eb84fa1621d508e94ab326f191343a5c44b90cd5b76af2080759bcf6968d50863a54dc5c816e0a13b83e700c21b3020e9019092e0b1619b7d21ed251b7c9ba3233d59dd4fe758347c45b544a2d8d5bdd8e30bd4368bc49636d41a910191d999736f58686dd3f96e6cf900bd2fc46edd2a840dafcc9c31007368cf72efccecda0176c714c47c318b03ec4562af6b271a7ae8c7e20dbf1b699c8cf294f372ab0358348823eefc8b18ffda16ecfb882abb16daa7b0fe459ba9ab7db20c736d9be9454f8bcf8d70af45f3d89e14363931b0c298359b18028aa5e2601f9dbfdb36cbb825fa8040d0d94448a38216e46e7f60c9bd98906539d1606622e2bbe97b03afeabc9d261c331552b9d1b55f94a917f4ad339cbe619d70a515f70a350e601b712d556f610eb9cb2d622f6db41014cc49f91f982e87001021f3ca457f42a4322f9136376907ee13d0f2054343b0134ce8391b8ce72880fabd2cced32486c911072becde396729aee02d44eafed9d303af65d2498a627aac17e27159c8adcdad1c9a37021919e8adb20142eb46db78934ad69e8e6420196c773b8822a38b8a48103b04d05290bb40af42555c811ec10882983e103bb8fda54a801db83c0c8d58168fb681c5bc20e2bfeb28f71db2ce02620c0c61f3bfb3ffce9f3684a786b5b8673ee9f2c16306ed40bc10327997c9deb6ec3e1ae54a2d0e708b88fcb6ddac383f69512db7448416d9e0ddabf8bcd4ddf0f5dba5c2243ffc5d841a343a0f37a216472e5625fcaf5d5217e1a6a37860d471c0cca41fd83eb8c0fd1ccc3cd2919e950cd4a23fbe63d4ec945e61654b96b14b76e296281d35b6a24c99011038bdea721b867a4ede1c24031b90e976c05940d09b5f9d879a75b87dedd73af9cac6319e93d69afe6492cdd4bda0249d380960cd7922bcac41ef13ed0039b38ccfa8e83f577c497bdae3fa57470221280f4b86e4cef61652b6865ab794ee91510afea796af11317674aa7334fba621ad20829ee61971b84d8fc27db900f4bc27fdd79284c8f2c32c31a82447a82d180a9395523cdb7873442152756e39948ebe507e19d32b0a779a689a910abb62ab4b34b130b81100c019893c4405c8706364dc046a049f1a45552d0498d061cb161cc136e26544c171e98b29aa387cc218a19346f2c6fa350140a35b1812ea875fdddd2acb1fbe3f754177470123bbf45ba967eb33fddeb2911ee88ff0a174f2d222adfc51d78e394389267c371eada144dbae2469895d9295ee6783e4235a27e9e22a3ddf4b74087085b7b77dcc42290993539489de57aadf231690aba473c4faaf0bcb304614e6fbd06a554d406005acde28d25eacf8d0165db350b24304f3b314b0445e05c0c76572f08245085a8511f643c42db9b1609184e1493571fb4b47e0313e15cbdecb5a48be4f2f2bd4f7d776d34a10c1f5c24934e798d75dc6f3d6e5466ad466ed6cb6dc4f29325cc7f714ccc69f500508e75694b76ed78a3309bc5e209d5b0e12b67223a74cfaaec5770f4d8cd044ea25d4ceaae65636aa1ffe1019ae814a5a8d121062af5e43cc5dcb9f87e04d2825ee9f4631e81db42792253625ece8e8a5bd00144f3e2d79a56b6357d31a98f20c3f4ef189432cf56ee9b085f6195223f501c6451ee07d23e555442abe19e67964f1592c0a3b72af4193f1ab81d5a7686e48133104683ac3e995b5a9a6c50c7ee709918fe2a53d36df096e838b7455eb9a4913cd7a56075a51d646cdbb162b4d1e404429585bf1972dd6e9bb5ecbc3833783a4152becb0037c650e52624bdde8a20d266d691285bd87cd867e8d8d6ab1a36250fc79cb5cc7f338569054690b4344cb5e1c65e3b0bfcc1f2cc62a868168a8b061168a71b162c7c8d6b54c8dbe344140e4adeb91aee0f05c22a22627133c81b90eb6bd04c93e875195ee281d9fbf3fef986db3e2ac38189a616a0d3b2c6bfc3105c74e5f445b1f25528e843644afe23826f700437b08322f89355e1f397a856396af594046546169b62f4c7c65567689280bc40ddd3f5d2e27c3568cf223f22c2b7270363456290b34b66268901f24fd7421f5b9e9742e3d0b9eb09c6412d3ec01dcdd074f2725512a21280f6021519ad846686931ae920db9c6e67e5b096c3484f7f472ba23a27bf4611dacf46f978842d1850b8c7a1cbdf54a30e7320146b93747aa7b0e86b294dfd836a5a06ee6e1d63228bbd40c2b42a37d808fd92964893518512633c597072e206caac9fe3f843e4d121a19486620dd4fb07f7f01c83c60295fd8a80d56215e14a3c741384a09b96e0142b65906931a36c6a334bdb226ae7edb05c5a7c467e81943f70925c9cd6acb74e3f054735fa64e1b965b68ec976439cff08b8629f713c18c4d02c5d8754d944765d9ca24387c74b6099303e9f4ca174f54f2d470ce5a55701ca94b815d84d9e839e17c85943f69265b7fc77ebd73055eded40be83273ad554e3a5c9da95c335354c7dbc569a9f87ec2acd5be265d69bfe1950270c17b315536044725422981b93359441798f77aad43dedc548451ada5440f476032aa993eedfa7a6b54a39693e368fe5c295e8953437e71a628bd417bf19ff14397db4ffa525cba3f1e96e3b63f32287125659139c519d31fbd17f8bfd84b396adc7e4d9c06ddb55b063f7078d0dff044791409c1c6c77621c2c598efdbd10910954984cb9f14b98a190173b71a475868931a6a1ed43877f35f7e0c3594e2f044f61950e86e682306b40894437a11112f763c57366d88d9f79a504c24cc5c3f7fed0a9c5f225c183726928834aa65883708ab08b64144fd06de8551a30b9e7a386e6c7d17c14aa29e62a3d889ca5a7f6cb16e004dea33f69c1cc87d63315b65d34f3961561e348c406ba8e09ae44c862d4a15dd72d3f35d0196fb085f386425fc6c929a3d6a49cd6e51f01235b0ade4a5602c0df2b9d05cd02aff2cc47727aa847afc7382a7c36128fa55b37437ebc520d7a9a29b38b3891b85852ff65797c52eb8a754ed0af7355325ac4a2664566c81c0bf2a7351ae442940bbf139bfc55b9169de0b2fc104a37aafaaea4dcc9ea37d0bb81d8bf5fe9722d0cb20b3563fd8e854f4beb2318ad20957e9291ddb1663a57868d335a7f9663aeca1d5dc6914da09447c53871fdbe58d2d6f4128677c78ba7e8c46829be697d0ac9471c25ca7a4856d0a25522d222972ba06cfc86d1179eda77b8f697b429e222263b27d2a223e1eeb276db90006adad9eec18dbf390210cd69a1cee1e22e802f91a9e1b8982eab2f4b175bc07c946ae3df8ab52dfa7f2f42c941b0ac8576bf26f8b95b5151756e8db5ec9bc4077fabbc374a0ff7e9c944dc04631a149e0550a3dde2a3e6d1b239df71559cf4b714ca5ac20df077a5c65de32bfa21131622ec3c59b95dfa6956818c1e4790a4743f3641de6baa2f34eaac2b7611595a3730cd95417ec120f507816abc16e687f6749993d050a24867c752fe21407180fba1f091a3c84388bdff5da8a63ca8be04a6714ac41c9c2bca8169354f8e0ba2ee7a7d81ecea534f1dc2ab6434de47282832ba93ce0c794d2cd98611887188edfb57609167732dae3467c0164ecb6fa3f269f8a276e9e8cf50ae897c7f5213ccc5710c39a2713688e5a81606fbdb57996ab62eeae654ae5120bcb9faed588f5d2645216da1d607c80031c41f07b284e69c530fca223a1294572c432668d0e54038931f8e4035ca001ff675ed1cf4fde50df0ead2f6eed281f01b1b8066f35d0191ff8d451e39f15fd053739f5ead175efe698ef5d6bc2125a4377ebae1e5c5d1f21950db57cab2f392b7f5987733b53ed1f9fb899dfeeb9d32a3bdd99ec34fd350a84e56bad5ca66440a7b243a30b38e551c0298b0c1071bedde7cd125af29b74490a7e431195ec16916a362fa98b13570a984c4a2598fb1a6640f6dd9298874b1deeedd85889a1b7e4eef63af95de28135b8f2d2e25a0d9216640c6b18972d3386d9f134d6a644dde9276f414cc6b7b05f269020fbb23d502c8edc003b097112649b65891f2dd607281e3d9a127aca465166e106ec3e0e7c17a76da689101e21332d72b6f9dbc386aeecdbc31a978b768c69ad99862f5267eabec473264c9b553f3f51c8f827300d30a536cb66cc1358d9b00a4909a84a0d8ac2765bfd48c7855c42e3da6e1aef0739d24faccf639df4a4d19b3eab4b69d8e35af7a4c7a1a3d58b942ebcfe93a94850f430b07e9b3ab835d013da5858e15d75defcf2a15be010610551a5426bed30ef71288dbcab4214501647df34beccda9a131c8255dbadce1a7091e064257bd21c999f2429d05d08b4ba85f591198df8632eca46be2199b57e84c440b32f4565a6b7c6074f9f65a16216a66ee3c475fb07f71e9f48ae2994b1252e7102e4ea0ab73e83b099d0dffb226cefbd137987a3d2bf216bf7271a026a999ef393f990acad36d668b70694b5615986a9375b8b37253fc12daeb02dfd2a8ee59c981417b3ec7b5409ac53e2c70dd3dfd2c9752166b6d448cf1c45ecab3c3b68a4817ff119b28a85ad4bd99a3bac124018d46df0a5c3599120fafb486ee33cb0c204c76a3a2a0b01e4e62c4d78cdccad888c4fe15d840ffdcd75a195f90056ef99eff716c29f4946106d1db542d106a2f85d0b7b47656595ba3581a86d6ccbbfaad2ad2ad9cc6f16f252e086489b7695f088b3cac01e3d583850114d2d96ba3bfa9a512959fe7051df701930b1eddac1abd11f3b6f5f4a2c4f2baef0076030db28b8f48c80cabbae4b5997d9947d95a9273515c5e05fc752390b50993eefe7c922883d1a2d81f3642680c267eab26dce111742d13e6a3f6ba2cf80a7ca68cd245e38be12b8663adc1bff630e3a1493785b0c572927b190638834188aa0b86e056af666f9d464163c0d4cedb4233e7474c0816562e0436debe58892a587d2eeae0d48d87c46862b7528a2f724dbc565faaba17669c77aa3cc43144efd51cdcae19eae0aa14993c53a4ddff7624620863812c463fc6fa911d624f8e01049b814e74e11affb58d3f47e22c186b0055288d2b59d1dbbef5a70ecfb65c76a43c6e25e268a4b730882fef63ad351544ff8c2df08b5b95ac7b869263c5c91c4ed747359a10ebd18e13f9b9baa02d448515224975a7a137cce0cd29a04e5efd27db2ebea584839091361ffe13bc5a71af7d557d0a7fc03e5421f8277a7e1256ee8213286acfc0dd2c9d1d149c64eeb61d57c2c4168766ad48de55e5ea5fddb14a48a59689b6f30bf61fe54ef6108b26d51f393abe9b45be1d898bb172cecf236c2d0d00ded5e69427b8bb527fa71289b72e8caa0abd77e36f3f14a6a560a388018e2bb4066f0be57f2e882f025c009c46a824f6c06e728638423cb29158245999386354b6e0f7eb5921c2a8a95336014cf5cb3953ed0b95940c80bc52a83c256cbc5c1fb969a347ed8d558b834377b7232ccb74e9a4e9017329d957c66fe3fc3f77ea122b5b0e3e21516f1a662514b22746c9183199020692a3a18c6c551cf32781479da171d21733cc60a89e340ae03ff65e0d1750de37c76600a3c752360cadc65b18b90f422a56ff761d52092c1882f6e65f1b06cda337beeefae57570999e6d9a6030f3a473ff283df3c9454d73605503c88f80934a6f8443bc3e9b2f8a4c9109dbfbd1ea401af9f8dd3111666ebf5670e1ad321c9f3e5bf04e800618c5985155d5fe7127d3425162a52242c327121ce5e79d7962497dc524974c912c44edca65bce8908e6981b29daf147754cdccf17a2bcc8307150cd1a4e95a2b03e3baeb40372a51514d1bd8d33ef34d7ba700b4f67e6a04947c7727ec0813b58079ffc79b8fd0a4a11f61370ed07d295480c32adb29387bdcbae5eccab4796e47ac6e3ae1dbca8920347c6c3171453777d7814e035f40bafb145205c6a9d56c69b6819ec0d96b7e0d1a5073688b62bc5eddec56dd911293ee4974a9951865d73adb5d9b553b361365e918f0268ce70cdc2752716ed60ed4e6cd247a4d84352d89b8c8c65c656e48b0e39a749e5fffd2c2df05eee7440d8d05cf03d04ac94210b02575d2e30d98588332016f81764cf55ad4c2d519898230ee93c33fd8990fda1ff789e15dcc5e7e57bd5778e00885d728c40afeba56324ad4fec8a6d26b4922337db054635a1b753704512c6dba807c0f83288933b381634debf5efbdfbbc6d8739a51a093a015590274f82e11d360e9291c1d22ae9888cb6f5aacf035ff7ec1013c30cfabef314858a52bfd13a69a51815124535dad4194c5c7d8bbeedfd88414bd7168cc98859cdec0946a35d805a3ac21fff3de2bd8867930eef2a96605e3a8e5cf2afd51001a3959f3011ccc1369e0f251bd0252d894159b30c628ae9963949cbe59c639d5ef072a78a0e84d96a6cf925bb4748124105a524d52ad9484b76d6ebddf74105c9cadb82b2d4d5fdc3af8de40159ee74e22ca37a5c2193828e564705ce7519e827ccba46579ce6825135d60d694b9918d3a1fd20cc62a7bda8ebe92680a0a28d3d14d4974407d2b31daee3a4945cf6723ea39e68249a8afc292704534d6ea81a31e0c66a26bb4019ede65ee2f491754497f45e881e3ba60bb608df2b350509f39522c0d4d9d1285f2280874b20a9357795df403bce82b9d699b7ef882ac63304f41d740f28405815befc88cfe032111241c6df3dc54c0899be65e8f5f1ea8253ec58c67c97276e383fdd99aa57cf8fdb827b2fd4ac9a712d8e6dc94042ffff497ccb5bbabc980370368f4fa9fef0660adb8f3dee66eb70b1aafbd319cfb36374573c59e0d7a151aed4ce6080a104f21445fb5b719988e4752aa3a018e3f4764b12dc6bc16d3b0656a6c6e5e66192e3d17bf1d3ea1bfe29a8bc46c0003c1c040f1a8a0e5f3f0e0937a9cd0927bc050d3bb1b2c2156e590255e6c291eae8bb93a6146f19d78e39a9cc0a3cd4e04d2cf4f2852b57e67924ab0f010f5609ccc42b52a7a1e020d9e2bb351ad8be1292214f03960eec88a0a1c8b610cbf3e9742c1c5082a648fd8b3de1405ba81b47497e6e90063f0da2429f9e7da53a3b527075b99d89ca7474a6769bedb686cfb4c3fe53ee90b935794319555d687db31560dbfbc77ffb9f42b2ad6bdad98b543cf2916e176ac2d68db418201cebc605a54a1edb4b4ee291c4a0f964fbad540e6f860f8d6b61f40af181cc4fbe7ef675f200cee30a10b83a356ab42fe2103d1c1385249bee0e6a0b6023913035ed964134c22553170459658cf749aef0f31101199387cbeb2f4bcdcb737af48ec5d6e437c4ca2ce83a349377926ad8ba756102f582731562c5c717f9427dd3e8e6bbea32ef3227a6f840dceceb1dfc0aaa9ba130295580d8edaebdff5e46e9dd47783ef09ec2ebb2392d61c566f55eeedd2bee13fd81684c2ca455ad5c1ff3f7eb5a4b2de059334c72ce5ef7aecf58e0facf7616ef25c0e5b76ed7f2dd2bf3325fb9e6dcc1f83f8c524ed8d9effb422be9ecc89d063bc26ff2dacf0277e3c0a0356f9bfbd1fd81ad2045245bd073d452e2b8c10ac90339bb22a1ec052978f67bfcf2710868ee5d3dea96a4e51ff188d85640d7fc1f4e7bb02aaa375f27e7fe5864af5625c27b7482e0233c5323fd798ac88f5b3f08758bca7457fea9245d1bbaf4ca137c7a2dc7eb6a4156843a852d031eccdd582e70fa73b101774aff60d9ac7ac9f01aa562d3f92a08abb66b5e667f988c0b91637e2f9406993330fc2eb9c7031c0111c5b20b4fd941121b2ec787081e7c5e411839fc79ec70124bfc2098bf960600661dbe9a00a6fd0b22d418b017147e0087dab5311015b591b8c656d6a486b335695da54cca2e27b4aada9b0a5fa250f80463d709347a96a3f7cd52f215136dcbe89806b06af8aa1d0feb162d112eb1e2bab6907b2a6941037ef8aab6a546ca478ec00b5fcdaf3a539b77aa6bd0d00c64a74fc61549ef3e1f3af685323190d7a38bb2f75aaa0e28bb0f5cb5bdf59342dfd149c5077ac54e3a077753e18f1f621a06d06a6c5dbc54355765f568abf0d201c6cfe7c7ee7ebd54fb14d3f550efd54377f4721889fca4596b4c3f8d3af6147ab02e8f655223ddb394887b34c1276c2b963b8c6a239dcd5f5e78ccc01ffa0945158c674273230a5f86d2d2b47a141a66b5c11a41792a4954d663dc7e056cd7e2481b80043cee33af1bcb5837c6e055a41d0927c0b948016b40ef4c82db2cfa27c46a1489059ddb7e60f3b5d5a5d16e7b133cfb3d4bce5d98aa1a1a15c090c25e4441fe3e3f95a52d51f27ac9a6890497cbcd7060edfedabe3d63e53bd75a3e34349bc395c353c1834eb52e11a2bbeb4547d1b6d3b6dbae67d19c9abd420192c2b0fedc3c70470d7d956b0911f26a818da01caac9417517bba22fdbb74469dc6d66f8b75114a5a440d9c1d5573407899a03c150544d15ae04ee8fcee7073adf6466cfa7db1573f6862bb2272d4ae48b72af2538ef54a78734bd15f3ddb0b117441406beb1efd9fc03d5eac03d7a128ce191997b9b8ecacabc8af042525af561228565d51fb6c81419d72cc25aa3e2094eee6e9d266f54dad391c187d42dd94b7ade2de46aecfcb14ff768b020804181030c843cb12864f1428c089b17ba75fa7fd04619b77f4ca24dc3c3ff189b6bca0c91142974fb520dbd247ce39dd8c1fa384b65d11785caf64745c1aa6cc017aee3d7eb72153f0aa7ceb02b15dd5a1e06a0a42704d2e6bb3c8fce6ef91ae9c6b14d860a7fc472544a13023dbf40dc6b72641d278b68c341f82aa707a17b1f99339d960f2db6497d1911b7e1a11d107321960c49a7f56fb2f32143e9cf3473090a782d171bc6ba68d574774d7d0752b4262ebe3a3414992bfa16dd73d2ad21b29986776278dad0fb067aca481089ec324dc513966e11f43399ba8c1f3e0ad4062892daa684ee40a87c8ed6abf64797bb412b3dc5ef2582452585780a72e83c54b30fa6f888f0199ff99448ae82a8cc3d98bc0fd6b2fa46c14b8bc47e371ca3bb16aa47fce3e97a1a6a91a947166ada4c454de369cee51b4bd93ed54332337aaa782523000f648b4f101769570dcf4c509677c341a32987093e217739c6a9b539071c107f01ee0a7720c13a6d59630dfafe512c37b3873c1cec57fdb75b5d812c9964926a4fd6c9e9f391215138b25baed14cc89569c48b53c22c55bf7e823545358127187f3c764f31ce8f09072101f381099fa3856ffc27154248a33c89e002b233014431f8db6b29f433f255163141a4f0f87c3e24a1ed1bc564d6265e6ac1daa674e27c06c2648fa92c8acea90514721cd9c1d519b58f6759f5f3c7885c11fff3a338370144328eb033f40903b0507dbd747cf82157292e034d85efb6ab280fa6ff9219d6ec671d4792656f69440477df7fec5608559923d367b75a3378d1edff6153b65e08b20b39ddf2426c47131fed6929590812047352b0946c52be2964e5a1da3db0ad58c2f6096804c3b085a82a42ea08662044ffe2330aed3f3da0be26b1224e54826384ee33e2cfd577a514e1bdb10a0544cf1dc77ca9c864aa4861dfff31b57ae96c429a102ca58d314e2884215de95539244214036c8c48151400f4678d92844fddde0032b2d16bca3754dbf0701d80e3cc36ef32c81b314ab1c16d3ddcf7b23149dd88c4310fd6c2d8dd315ac6a661b7094892ba8fd9ee677535d32be9055a3d09b09ffc77e32407263112cc4432e322ca2e4280de312033e7289fa9c88d034629b388f2594360eb867439e5072960d3b12453dada7f80c79caa16bc9bb59158bf07d87c633399545701e947cab287023af0516572d90f4b2b0b2a066a8a783d143cc0920f4f773044c9ef3b2bd0f30f609d82978c567131a03db0a26392343ed15920237d2576f01c9328747395e02152537d88fe3b0fdc3707664d50d3934c4bbac3fd92a66657585cfa5fa88024589193363c9cbcd7f65beaf0e7a70ff105892ba04f7e40b26ee5d777e8d213108579d312ee0d24f89884bf23dcecc4fe265b85e30ca4f8a84189015e21bcdc9c3f41e11d89fa04f10d93b9c3c6eeb37669d8aadb0161d452317c4f217191a53f8413221a1391361ab73ed0ba0f0c9fa1fad6f369940086eaa647fec4decbb1e169633ec2e612321302ad17e5c076606b4e52d4bae61594a8e926c45f7136c3dadc54591408700c45e7572d17066d7fbf72075831400768a34840e288e51530c5e0c3ccbaa65f20f5d90c220fdfffada9a95427313c3b04a074e27f49fe47a4837b8037151e83b5d54db1a52e4efe04d32573f65838614077b6552bb41aaf32a91b30075095cc73a88d12cf0f7dd4708e9f29563404b31dec443bc35899d92b8378666c8b5b95a98d1f33784700d623d63eebdd4741994bae3656b148ec76cf10e955680fb25a2c8694446991529a65f49595947e45dac291027e8ce33ce9a5952350f89530c436d5162ae010feb0cf62a1ff07c67e0922a77638eb0cc8b315ef9331c5e85a49f12e3d265b5be0649099658bb3cb6c401897ebb86ee31b7534fb170b69e84ca202098e1ace5df0865a012fa2887f76d22e4f83b9a3becd05c2c20d37e046a2cfd7fbe57e46fed05f4218289ce6c0c702731600987134dab3762b9da8a3e37b0ca9e59c900f77eed0cdf77c3ddaa630ccc2b98034818821225ac0d7ac8e30d682efd47c8ef79dcb5ef212c3ef0d150f6033d9291bff5c0790e8526cf29add35c545e06c2a33493e505dc4cfc6eb8173cbe11cc0373ba12b806556df710ce08bc4fa4148d4db0cd4f6789c8a5e08092bfce8246c11c0b24e47010a41520d013d00f80f52a39a9f68899fefa098472cf0e5dafb291264686b0913f77246847e5f9b7fc36c4d366c084c177931bb6850cdce42bf63a09e3a30f8fb6102a05f7aff9f0709597f75824378da1911cf3fdef9ad957138a10f85d42d25c1a5195352ad3441c9c28cb5696a915859513d1703dd399e5274bdf519ee17da8170cd5226acdebaf9078dd72cabbc8b8c9fb49c8c11fdd83bdd3133e9167d578094e38bed3d5156751fb001f7a1f10eb920c892c275eec1c32c9df771bb397a520b91e6cffb891313d3d6190dc72bdb19e87f214294985d9635fd1140cc75fe5738223ddf7c7ec41d218a68b183cc15ba470848f89d24fd1461222db4f83ff3e0e88e6bb21267b72b6916859fc0ed482a44fdfc65d167cc2b45b780f8567a15f810b289f22a5841fe419fb7e69fdd3133e22102b44d0276b51e02a05e681f0319b2e8e7c266226e88c5709a71e9774795b1e2a6174e5c81b8649ba04fb7c6222c9ca855d8805c55382a8efc0b09dc17912cec41281777bfc888e3eebad5ddb035c646c082b099252f216994e3a3b04d398899ba611c5b56ab4fe4b4cf1ca241cdc40f0a6f746ecd7774ea3732c22c3fddc97cea909f0054a289c48ca2a2aceca6e2dc949194ef754492f9ea37e03107055985e98cb327da62c88999f8f3d3c1a170fd709c73d701b6300d40f4c48cb061a0377573a3bdff418ea392daf46220f29be1a14ecc58d6a77a5252684ad6e5379aa4b2c0238be2109d3f9c5362fcd9fb02b9235b0abefe97af7cb0f38154fc20e7f425375d754cf864219953e1200cca76c2c20ac36742d2c8c86563c3302d144983f89f1bb616010f10d96d4e1c0db361ebcbf46ba07cf63f986446a909744cc6603be19204c20d1496dbf7b7ee98ed553d744804dfe7ddc6c8cd406ab2c48cc2233047898ef4bd2184dc0ae619533a2d17e4038f43dadc7028a77ba579adb29fc70e57b58c3144b0cfa062bb4ca8bd85386f8fe2169413951cf995589ee6505a89f65a087e4cc43fcdca02fd5d66f20b533c96227dfd9bd191add8dc04261acdaf379fde880008476918ffd5053abff36743f7006338cf8f6c803a0f0d37204020ac126271d324f3030567a51d1644f0308c19a20387903ca240876042c2a3e0f7b7376bf0e8fc0dc3c1f227b4a66631401b0a72fd60cbcb4953b6cbfaed90ac8165fb41a8df294c45cad60c85c35314e4e66aeeb3bb9cc57707c119e93eca8ee84fe9b216ff478c3c1045b7ed4a04330d0e93709e8d67554007c86f88eeb0b28cfd94c0a88ae5b13b9172656594b45469fc0140f1f3b554a3e757be215815baf5fba25db37360eb7898d9901ab2efb28b8bf1b531464c0395ed96e1db653d95eaa0387eb3985dd065e0bc6011504230a56325fe67ebcf9cb56e8d0bbea27fbb8a6625b415aadcfa2ac5210f5c90f111b003f4032d670e140fb89bbe344f8adc4a3439cdfe94ffaf3d148777a01c338cd874704904d2dafdc8c08e31bd9942d69bb05864e35116f51f4553f3890bd828b7163acdceb4d3acd65c869bfa6e97e5c8cff5fdcfe39e27eb17a1768c425fbdb68f4379eb1d30c16f0d1f1438c44f9455f345fb384d58ff2e5cb7bca39a475ca0abea704a15f60f602047262efd47819f9466491d2c482b682958a2d178d5fda4223637ccf86689e0c38f59fce2ff0cdf34f0c96158ce028c96adc6a5d3b2b17a5bbca9b8c096602040d6caf150802543b402192132915f1d505265e991b54a6bbc83f8d339528d4f40a4d952e8239bcca8e256eafcde4ff6078f2458d623e20ae064ecc3930415bc9628b56c1fdf2ca1dc2f6586afb0230aded6f97a9e254e606f4423e19f40826cba7e58fcf2f9f8c0ed75114a52df5c56de571e9b4a97ccaef9719c9c2f52b215091d0298bc005b49314c81d5325bfc7347b65ab9919f5633120570285cc7d8fe3e0285ff056d1739a5c167d65202322dd28501c7140517202689b164aa79ca5569cb69291d60509ffdaf8afc99660a6a027b7657e47b2ef245d383ba742fcde5926001712a17ccede2958451bc2e970fd46436c68deffc329b7616dfd2002f5b097d9ce4b15ff2091db0bb032f589815dc07916d7af9c5ea26659b4b4d6c8ef87304d247ddf4f2840c7bf11247651c4082a3875262759127a6672e244fbf010beefa933209a329fa19670cfadf51046967f27771ef1e2df290caf435225ca73de1c5f3957cfed35d1311772113366f7e2e88f0cbffe5a72a1e0cab14b503f7aa2a36bbd41ef8bf85cd942b178d1d3fdc99504b6c9d88687170b2b548e7374f54538b22a47a24914b13a7504777626e0b319ca0a73fe6aaad850d33e8164e32a00e53138cad4ed09960c8dcad735221e3da274eb6d5ef51419218124f085705b88df55114933a942e576797e4ec6f6efa51d60819c16d5b72e5bd4e484f5963256e413d8b98bfb011050f72f9f83fe062a2703fbbffcba7e267133951a3b15c161259733187c504914dab1fc546671ca3319388182ffa3244d333db0c66d04c0ab59eba3e1058f205147f53132f5d15469eaa3c391ac50dec0676cf8067189eff4098a8962269b38a9fa219bfbcaa9fad014909becab8112e4d393f47d032d7be081e096f5f7974e0ff02110b79e40d3a90b01cdb8fbe060cd830bfa9766f72fdd8502788ae88d767c22197616c9e99faea68564432e78b7225883382d1e12f983884ba5b4d05e3c7c6a4c10eb13925557b899a049d4268ad05c3bca81b3c5ec820f591580040851b703c877b9004a5258b9cd490435d74a55953e53c45743e67a8612d9744875d5095bac6ebef1dee9bbc45a743d702922c2fb17a7ad951e27814e637ac58d4cfcbb5bac7d6622862f094ee559eac38018eefe3167dcca2bdff4f7d3aa4b96c28587b397b20fcd18b1561924f73144e07de8b3c039e2f9a1e0453a8fca5af959ac87f6bfd2923ff30e947b495a80240d913d33fa53d52bb7efcfb5feb91c41fd48b6b1ff7a5fd5574fa67d18c3270926f756ad5a235fef9f48984ce46be9c17e681108d7077971cca777de210034ce2da506714a79359651c8e9bec12377ecf46dac1f6bb09e6159d02a7fe3f346d1923936662511fb0cefe4f4c79a4fc588de462853202e5350c1cfde1fe671a6f6ddea83be785f65976a3d7c417a63097d76e486872aa7705381406056100a066c9b4b67ec875850ed43f864f3cc1e5d1490836d7dbb9015d40def0d244573109e0caf6acd14c8231b572aae6ea0544f74503dbe02af7edb6bc63b85a8c91a44b2e374fe6a2483f8c8459ad02847f6a234a488f00ddbf006b076281fbd0d2b81ae395131c28af085715c894c742b5b25675df561560f131b75a10eac6548868bd625806e16c2178b0374911eeb370cb9f15235db9adb05a905d55a7185bd780af4d13d2ee0f12c830090cf8db31fc6eb7ed6d6cb15c633646f575613eebc5b674c39937cd0fb01db6e9ce9725ce9d1a9e31f8260f39d1a4a322c4454d034dc9a2659ec57a9f5be28eee17a466243e03de33f5f71ae0c6116fc95e9117f648035fdbe6ca94fce4430444530385b436562b34e102d7a257c85f6b3a187cdfae2679770f7ebb6f63d05fbd7c74dd2e2254fded371fb5dc3e0c1ee0b7eff990c229711abf346032ca6d10ffe4af011c1345aa30786fbe36534c5097f3535480aa3c8bad37a51e83abb698303c6bca250979b7b0f5cbbe4bd8fc15ae68dd2f7b1c0932d6c9218a94ac4c03a766eda3f6c1e5c1e542136c859e092301bc45ec8bcc338d0b829f5f83f8cc4c0e7d0a73d32aa7e4fb07d35048a9d357abb3a97f1d0870f4fefc2827aa1de8e98522ff82204d1d404dbcf7f9b333733b696291d013c80ce03cbb9be23dad96659bea4311399aefabf65b822700dedf8a21d76def42c01a9cee4b299159c263a9a5c151d7aa39e370186861efca55957487600e465b7ab84a0f0bf5d70ba70cd83300ccab1883dbc334fba09b94bf2837266f691d996822e5e42dbb5b41b63afab4a652ced7d5ea7e6b33aa161790bcd9fe21c4a392a9f34d308b5326bd69ca8206bb8da9b4eb494265f7e4b822c94240882f1ba3283d13c9da68402ff8995614d1ab3b5ca0a83f0904b69d38cbd0bdca08ea2a668cdf2e2ff8cac437785f4b532840e30cb329b2d211584fe1d4fd5247f0ebab84aedd0b358c4003f04411abe79898868f78e04855254833cda8e6143aebe298cc01acda9c6f0be861ad835e7775154b983160987256dd34c7a27626d5dec523d4d90bc8d722752a67edd40699598f9277e4cf1022a38b0acef3a7b19fd9cc67b45b0ac03072d140f83efacce937c4d0b8a66a064f6a54ffa6af5bba8ae520b1cf3d793b75040d7eb5257692ead49f37b643afa236069472112ed40d0b25246c7216dcefcb84327bd54cd9a2513aa96649ecd9faaab70f8d645212e6cde7514df1a83e7ac8cf6e694a65db10819223099f7bab7e6f3563c13f5b414f13b1121040b34d3cdc09869705aba32a8e484b61c97885a558be2adf9ed8dd787ac66b93ba69728dd2a03076427b6e9a0fa2270649071425204640789f9cdd81b0bbc6e66fa2221b0beed8d62adb4ee6051214decd92342f373b684e6c34a55e16c15e188667dc62e389399d285abd6633f85ac412e47cadc0f099f92335203d93a049153e00516cd107cf784de505029730ca3f75928f4c14030e80ed2448e57f400fe4b5a7f943135f45e988236c0baa75b0cbdb88ca01ba3056a9b399dba913e530ddf64bbeccf6e0bca397174287b0e847163ae61fa070bd9cdcc616b3a20b72d2798d01968dc8512478bd20e362973aeee254f8215c61f41e15fbf82c516cc818aaa6a6a5556fd70bb0cda8cfa4f990146e4733c4bd2a0f2a75899e9818d286b9860756b05cea4897dc30cc8406b320cae389e1808851b9538d767fc271419c5b7555645c5a919486d6aae7194e944046f7a45c00586a1c66cfb5084b61d08eca8892cc6a0da135fb1bb10de9a8f59db6e2b2f179ece396d55ba070640eda5ecd6657e70b39f7fc6d4d82e2729684912d9986bf850f145f55a7f0cc83f8f185b5adcdb886afab9a594a0ea9d285bedd024b4b05e09c7f2a0bb6f428b3b911e1caaa12ffda407f844dd3c43df15cbb0d632f7fe5257d80e41249d333a8043717cc21cee7fb6fd9e770c1188928d9783e43bdf894373ddb134bfb4de08aea4eec2ce06b74b48a3aff7a48dd5085276df3a1b8415abf4eec5d122ca6166abc8eb5d8286344c348894ab251891ba1809e3679492698cf3fd70dc3741c231d9b1196f9b5b740f0a032f707a85e55983d336475d4a0522b14d5d985b386850aad72f16abac04f667904050fb8a58090e1c58982ded80c34be516ba519c333b184303a5e7a513b75a3507c5ea7e26559a847f38a6c1da92a87d3d01ae0eaf21572be01d5b962ec6bd7be698d868ffe0234f1540c94839880e56742065aa7edd5ddd901317280b7fa1b14f1ab6b111c7651b44f81604e4e0af57ea5556ca0f90e43a8751f83a47082f1f65ab2e4a7d0b24e8ed6eb08c422d9b26b370a5f8c0a8e2e805d430b38e5a65d393502d5011e2ab066ef4a10a9a7fea8f1a2b9739c09f237a0c07efc2ed0481490b9ec5cbfb5fad8075c653e975f603731a8c85857213da5c2f7bc8555eaca70e514610214c15968a3ac022f74f6688fcad769d6a7512b9e901768fb252bcaf24050ee40f0ad736b9fcb2ba1f9b52ecf3702cdf3e1a2430827247816149f6f8b8e154b4e776acba261d4c82c78dde4aec03f27194f0f399de0ba5659d3e7054d478be7143d4495c6e1db83c3ba74f7b27044c2be5a114ce476ff7f40a0205df123e31e3e68e8366f0b2642471ac9255635ced366947adb5930c106db4c039ac37e4882461bbf611ba2ee2ad8a0d6f086156ef975ecf16a553ea8463b9163b760589177bca76ae271f2c19a91cf34ae32f82fdbc1ed013a74e5343252b8b84cc782e6c1502ceb9ae50cf2aaa816fa3b150acdb1ca857cfe83b7cb18ca0dfc0e0f910a0c076bd9faece57db1d85106f54ecc0045bcf683b8a2336b09335a3d0d08d83ea84f6a908158ab7747074c0dc0419b99bea234b0a58cdc29140f0a7cedb06f67e3ffde13d5276b0372c1e3d9e2a9c1c02449074397aa6bfb2cd65261809c9ed9fd0b549e9c31b50243d32caadf63bda8ffbfa20526770e477dfefaee34abf7eb86de21238403cb59c9b7953160003ff8ba4fffc868985300152fcdcc4e633387ea9fab13319b46896131e4f0b86f4b30d2a3f9de2ea8f4828ae7ca2f46c8374befea11eb1244eff44a2f2c210b3cd51e7753437066f19b3e98eb28d6804b6318828261ded5268d373ed569122b0487766c16fd16cbc12ebe6dc84ef9e1fe647a8aa6c6886d1cbfe47e06e84796d2a074a122f7ad171d4670a01ab9cd6553eb28a935894ba01152eaa59e5c1b27bbe82f8d3bf6d554342d6b5c9471401e285756d1649b688937c675d1b199fb9ae0d8f45366d06f51386b9e28d4c6b888c70c636c4003bb5fbb14e3eb9d49ab3bbd553d922acf767ad5d2e1de6372d461a25f04f0bac3a1206fc1b5807502406a350fab1a98fb21cb85c01b5e926617277c1aeaf15ca07ae5d488fc15088ddeacced62237cc700912fd8d59d86381725f3bd429336c4b4c0c4425b22c8c78d2bf0c45c8b882a4b58820981e14cd559bed70df3432e3f2239e281cfeec293ccaa549daaaffe4b3f292cdf58a16ea392dc733df534ed5d10e0bb1301000ebdc57c03550a8aa137feedb368478392b88f12ad3a649c883249fe61712002c86143876c34dd4ef6bb51325be9177d3d2012ffed28a0442b9491d0cd11d230dcccc4c4d27bc1360c2d48fb6b6b3d56a784871078e3e48c6c5f897bc741335b7348ea5dcaa50e76621eb626fbb4e8f91f79c7d9e24c7c534cd8f762cbe720432ea78089dd327f9c6ec0c2203e03dc72797d28761cc18bc355d8a40fe0228a63b6ff7271b84f2ff5d7e20d41a2b09ad511bc229988353621411178027abd12b274c1f3e7de35f1865dfe497af9397a850f7b29a1dd2a6504b7d8cff921661ae8a67b199cb48ab2d806cca427ba1383e74d14740dbdf1682d5be2c699cb6e96c59e194ac70a88d9d44a55bd94f0f5feedd955ed07ea7039edf4f6ea73ac63728e29bc2382ab04cd4122282069fa632b8c5e83c930ef1d7c5731a75630a3ebaf4e9f804d5c9444c749ae9e703898fc2eb8044b7a5b03136fd586de96d050a512d3c0b37034b3332f905b5edbca42956da49fa8ad4a8c30048f33cdb2dad5103f370b6840e446cdf15266cb1c105af4ecb54386b1acac1d624e606a09fbf5088fc4ce6bcc36644d4aee10b5ca0f77b0681bd2019b987375c0e59ef264407b21c19cc6321040d75590ff2d715d8dc606a34154d2be7c78aae28e53440c7b3826bf2a8a3147c77d728b3981334649176940a2d59897f653a3874f555f0b0e3d2dd5de858ed4e8772c04d3a23c052a7ea370a524cde6be8bced56a90db4e2bd5844b7832ec21e0e929e5552968a2eb83852858480b1cae2a2736a2f2da8a3cb0c2f915399a64e2410f0681ff857d17765d0b81c4aa20d82f3c57d182435b62c0eeb2dbc6b6e19dda7d5f0bf08ba651133de2d8748bf6fdc7cf47d6235c18d360c78e80678358028d2ddc82b018797324c46949e00d94f7b60c8e5a464feed26457f49134a2ff0d291fbe23a13368a8bce3bd120966228d73b38dc54898db01a688a09e8b87a8886368c77e8976dbc7459c0c8fd3d031dde65a993248e5a1194348967e1958f32b7e6fa8e91c177477b6c02251dfb7f87fb28856de7c04e2c48c340d93c0777e30d36382a521ef851ab069da781b512fa835ef1fa5e7f56538dc2014d86c87f3ab46fdd93803d91698a8440f239de32da7f64caca26da6a69eac011eef7fbc793a029b4e2f3b7825b8a502069c837f17779625a1dd7f939afe01758e493bca366a500acd6914934b79a7a517155b8db751ef935a6a55f05567981f6ace5136777708e897b64faf38c3a7d7cac9a9dea0a7439ff3d57f0b66d519462ca38dd7312d791fc62e5fd6ad7b7c4a302275e1a589523fcba5e1e59ff5153e7627d619a175549c3bd99425380352e8057a9fd03d8011ab4a7824c52be9571a5528e1a494f7e7e4cdae4ea59ae8200c4c5a400453849ac4c2f1538d02f9f1cb5c634842b6c187173170b9d4efd8e161353962ec7c5f422fbccdab95e406fef513fdb165246e9ac758305a8fadc26f501ba94416c110dd1ec320c46c1508115e1f44e42fb6c4768e53774d9a2f72a48ab356d08c8f722a49705856adfc42c85c60dcaf5e1a974a5ea73e84892358b081764b6f4599e364c1cb9cd133e921309131d2e85191bf69b8f6796de4428bb5fe840f0c9d864971c847a74e708f88fd1210bb6aca5a4993d3236e96d734d7f5b77b600e5c8881bd1d53614c1cd8181f3b76e34368f89d0bf3354e1b71a3d5164fb4166c6b2dd83fbcef454d52c8cf075511be72130155285d8e808bd9af37a946d0ecd287035f826e1760e7d60530b70ce9cdcad3833c9e479df112b937308f951bb0889af8cde30f0a36cfc5f874efaf98f845b21bf4cc8345fade2cccec715524cdb8f56064cc5641301335775eac15b9b5beea3a923534a890d4059d88be89978bb53fee7261dfbeae7f91e0d21d180e077e13c7676116739224002e3b780255e439395f75ade6338cd1e6522a2a6554e85ccf14539721a2fd59c1ce4426d837a0d6221482bfbdb93eb7f41a93dd43aca76f7bc0ad760e596027c3255438cf822d5bc50f228a5c01e4edbc345d298d54515d1730bfb22d91dd967a67b5280a493a06b48ac66c9048dd87ca66b9fa1fdb68d145d1874d46b5a06f1fc227ad9ffde5778c26269369efdf4081b2300131918e2bf01b3b92629dfe14511f575a0632502e47b9f2860b7e2db4c45133d360958b818455fabfbaa9a58b3775061ed020dc301b56b9c1434df0c2c6d9d07f0a62d87bf6d2e03ee8eb48c766183719b42919cd6fa476993f8053d80684f5a5050ed6359928c3e07bf4672838071822b0a7b5e088449183d3991f22b0b40af3323f44a8b056ef12102f5b8ce05409bde8860898385f137f7f1db91ad2b17d02802102d0bc0c7a1ee00c1100052215c82c7bd760db3d59f20d115eaf3e53da62d5669def1122d03aa59dfae43602ab20ab9ad18703dafc2d88406b2963dbe30d16599a8795942d06319ff47971db1b6d7a05adb5bc29f61ef688abc320eaca7b9c3da3057675468c47e200fa0e9ff6515be4d97fa9e17af6df757b7a904dc51a30a07aca05c009c2c2d9c0ab283b1796b7f4b209309b20d0e73190b151b7b691770670f5715c721032fd5b76a94ef17c965d280a404ff7778948ac4e30217442ab6e94a64517b02fcdb8477b010c6c1b8383aed4de15f5887d81a7b04884dc22f7cbcce63b1fe8a41b1db722fe9242bf9368246dffd3ebd1c4c1844039eaa92ee3b6b6f8ff547fab02e841106573251604ad6629bcf57717fe57270e21305a16d50fb2b12e35d57a98f38ea2f714746cd8af49eeb1b54109c754f8b5d66ef04559f1819e073f6f982f7c85f15d997b6b56d482b32e2b1ac878bf139637dbf870b51340c5b2fe273dbe5e802fa1c3a78038206656417285fcd25050519ec661f8ed8efd2b45a8eec4bff2e544269595ccab7602648eb9b86cb95a3d9c0978edb73a56d997e224f55e1b6b163045f0cca612f147652987de0c3228702ef2902d867bd89f0278a39b771fd0ee9474ebf0fc8eaa5961ace88eae1350519f1dcdea9df2de3a5f304c3db3a0311011ca101b0877da1bcb78c2a5c3c1299702da7eb24cb0728670c4356f452aed910abb60b72a3de5b621749a7ecdc9addaabd83494be59fbd9b9e9ce504669208195eba8d38d2f2f617554580e083db5391ce0fbd253474d7c3a62a9ea2848eae89e245bcedc06d1ccedcc33c72f684b24b9d2b1f3d2f7ab7aa93bb36924bb5c22240c43e16ebae74e75582eca2d0c6b7645d606f7a203fe3edab476791ab27b344fdf854103dd07df8a737ea7e7643b9cd62092c9fc4339823279a96f6edd6b3985666220e88f8faaa5154914be31b27091d9f19bd73da25e497124b401b098ced3f8ee6c38405d3a356a16d10abd9ca31756037e244cb75a5b972e072534c0e4784eb5693d9c3a579e030be63b2eba47b3ab14051aff6fd647120501a36f23b53bba1b9357f5234f9457854e193046df2ea9893294ed18c2d74534088f4915601f00a305f74a462649baa2266c3e4f1e3d683177e5289c1a1f923c1151b8f5b97dff9ddab922db7001049c8d0c2ceb6e02779fffc36cbc132cbfbcac22d4ffbfb085b04afe2b604043ae159b52ed3bb044d3c64a51891af042c2443f71d297fadbbe1c4908b3b2282eee7e16463677aa3c67886faa7049e2199bfd3712560b02af91560a32c67effa8e8a95a5066200358d73dfb7a91e079e9197135059114bb37d011689d7b8ce14f074576316f575cca66a36e22e737681e704e8939fdb97b9b6122db12da6919b67d9579f0c14249f243ec8a6fe117add2dc9109f98ca95336b4eb0c88d2cc7341b06a7bfc48646d7de42cbdff4d8f7a87fd9cd6e58b5daa1bdf20eec699204f5d285095129ce7479abf61465cb2e2d3320795434d499464281f3aec62bb1aa5e9500835129fe47e61b9ee8d577faa8bfa48a0b7b91151c3dde32987f7ad9a1b62ed8ad4cfc3c459d310b604fddce0e1c3d3aee5cdc79a2274ec2564aa3740f3fdac10be4e7abd9716b7cb22753d251b959ffa878738888777d17a7326c592b9277dd73ebd5b6fde55c7d5e69adf0f89c6f1058b08769643da7eb313d7476e3ac33f99d933e1f91808ae1b210c86b7aa595739908ff99fff533c831aaff99bfc9a05deca478f9489d2ae49ff9b405f5143dce7d6a9e2784f9b6c8b7278c77b6b93e75437691dbc9faa8f8cd73938936fcc55217d7947a40a3c64b2608a886761f9106ff67e444a14301b8afd48df5dc57c96f058e85072d02b1ca260fd5491d51657959cadb731d2e8cce33814f0628682ffae681d7976d817aba263c948da0164ca5fd746977f99c98a4bde7681a0662983fb68cd9b7202b8c0939caed6e8e7e21d0406f82556ea55c2cebd0425ed554c9fb00d52cd5d1c890de6f98ffc3a637fd2224ffa54fb8e0037b02c41e1e4c62f20d16b704074c936714883787281bdc44010644c860c78bbfa01cb159c6376bdf390b6163cf24be5e075b33bf6159072fa080795eaf38a241ea72dc20715f55ebb3a10fecdc69cb5bbc55c45c16b321770438ad869f27a8c97253774da228dc151d1d17402bba11be05322b6748c7975bc8bdb190568c9312ca321f45630a31fc3b6d7def11b3ad94554089a2680b8d500d631469f91d2695a4808d94454fa58fdf91b5201d210b73a8f00ded49dc5d9f2d1b093d419a0d19db6c67ee1cd733f2d0aa0a1bb7037d3addc668bde42463a92e798dbe0cf502f3b13df3bd5264237bf0120476796091641d228f8308faf399ba0818d99523ebc14f039f58f6c469abb41d64490ddb0b359f2c614d7dbe096b1bfef40b03f43ae213a31f1d61a72c40dc381ec9083892f43a43b5c3b72146c8258339b6f5717afab288f4a0de5b11cf21262fc6b39402fcaa390047b1e6e15919fa1a23cf4c75bf1eed694074ad4c6b1f35a08f0bbc518f3ab1c3b0fa99a8179949af220915844ca17f4f774581423c0519a4f48041fa40387817c033910ebc5a0c679bb080187d17d13b05cc44cc85d5d5d87b024d025d59f18436a36695bfe62d706751853c055a857b728c73cc835050827e217aa15cc3988b17624ed1211ba1f3e519d0dd0a1e57b504d870d8fa219bd36e240aaf321d65044885bec956f5bc3e3f931ecadc6bc6e49b7b4bd98ace189d67a9fdb0d288513e225eabafa47337a37b8888f4f6c74a9ed45ced0bf9fec7e74d254b540046a997730973aceb40bcfbd777afc515f4a5ce42aa0429e60e1de9b3fe46af1d1e719744c65e91311498f2572adb4a238e6bddd4f13600797f267a51812121f1f388388200e298d079885bc75206ab1fcad7d9d6e670fbef913f4fa6038a96e42531b8966a18f763bc031516df8583279d1a4431e84dcfe095886893fb5b9bce40ef9c3c11d0c405052f9e49e23e8036512d9d6efc62acf20b4b955c54896369238905574f66c9e037e64479d5eaa6e2a8908e47002bab065014a0f5933ee2cad9b8b5c347aa5e72873cb7309a1e7e4489d3fd4a1b78dee6cab3af9b2e9045b9fe96000f364c9caa0267eac2e68ea832b150a995180345cadf03eb40904169aafd97e21905b54855470d403bc9f4af965ce804336ae27c0e7755234358b6654022cd10a60b810e110b1f6c59ba370ab306a50acfb4611281002a400d5705b1805f2dd3bc0df41be6f6f266e44c2ba689bc025398b6cdd8221b4307d0c7f934d63866953c4af539b7ee482f3d5743bef735d875bd1c6e0bd8fc2689a2c00b890bebe8010cf63432ef0f4f7603486ecb5c044803659407558f09119c026bc4feca81e147770d297711f63482b62858d113b6e897adc25bfba74c6351ae3fce48bef9f2df07bfa23c411a0f2197f3056f1f7fcc98526218b603d88b5e4e59e5578da8f8614a35c0d74882b0786baa3b245499e63c60a5b6e4759296f473339421a0a4f6038b29bd50b65f438e6f3682a3a49b5146a89a461de1738904676f1e5a466f380f1a1c649b2227a585469465d4a07b2689cf43faad9b0c65669f343f96e9386b35cd2e00b770ac17544f0f14e6e365a2a53744f1294b69807fad4249869141b53772eb9a667cf4627bfeb3e73afc8ce85b33d0e3e5a7ef0b861c454f5f883a03f0705c42ef7d924c76f7ae5c4f6edbb33c837807b1a7fa29dab2929fdd94409707de631cb364fd644e975418f3e6e0ace7fc9066d88b15fedb172442f80bb90b331ce22b046980878f2498ab5c056afc50ec44887335ede6c0725fb2575fdfee30104351c81a6e46a2df314f480193f0fd75398d76b9e0c3f36da54073e645ae188ef910eb78ce584712c6de4036ae8698201a694aea345abf5b49558e283257daa3d21a92017e26b67f6d7f918a363c6ab976360f6e809c052b6c5bc09425fee5f2e49d76596d05c7648663e66286f9588522578ae09555bf4169d701509e88157318f0c2f4924d2dce25ee941f17670cd2820700955df444a9f08a38878cb181e3af94797ae30a163235186712a659a54bec18fbcd64fca6fa7fcd065a2f677260fc601c8b547f3962dc41e05e2865a8a0d5bffc6fbd32bd200303dda81e9f60412b875bcdfc79f2e38d4832263a207a411e122d188af00a13c7b258976a0d14ade26260df4e68ed71dbebd13a177a463d4c0856096938c72989691569e4274e4702362117568b0887a195b5d40e3068baf34720f3ccc9ad21ad62bed2b5c8cd5b3b605bfa28bc82ed6662a027abfed232de8f6abfcae5061333e6292753f7136504490258fc094fcc8a2416487c5aea3f87dd3f09b34ff670efd5d8ad088787998640294ac56cff9026e067608e1eafbe212984176148be4ee70eb9b879b8307be8a11b207672382cbe6fccf53ebf144d618971e126c4260ddb82f918570e91947883292356d67fa6ad7d23306bd93be027a1cfd7006282f24b26fc89d2b8f681cdc7fe2f469240985d5e9b58f5d245b16e107efaefdad03ba257e986b44b58dcf2cb2f03edcc1887025578b65616124504bd774f23e9bed47a911786cde065f996de261f1ad9dcdcc6cef1edf5f8275e3c4baf8a6c55cc4bc8705700fce3b25ccabf0b736547ea5818ecfb612b6b71f83c8c1fceec547c50d929e63d8006d16d4d5c9a2501cc5b6b19ae55ac711d7ffe45e7fd609b3306538dd320f2af90566a32c617d81418ed06db6b89b4c14cdb285fc8be03aef6be5ae374401632287c9e04cfbdcac72b9dbcdaa8c81e1efef4f35ca80728ef156b824809263c5c15f89090c8f826938ef20a0b871b0faf652a3fb0901eac4aac03a8cb6f741f446e1ea3e6e62c76a396433123700f6747873d276399815bc0c76558a58e8baf40cfbbfc3c7ede333e8635ae50ceb94a7e87af5415e03b7f840da8b79181db09537a8f66cad8692265c3e56ab15588dd63f735df89046ca4f8e60e1396b2644299d85e7a48910e18056784c7a53ae036ae121692a453e1895972a7f8556263365347366be403dad36ebb6070dd3f89a31416f180c5d042d18f0a120a9ca0578fcfe3b9171d4a085622871d2cb6d00dd39dc7d3cdc403f5c9f42dcfd220e98248564ad6484c4e7e0bdef876a0e26d6a103fcc1648106c48b412cb131edf8c02840d3297bcecc88486ca89267c5387230a1491e1573331213aae47864d5df5082926795c93c913d18a388a572c7456e5ca449be8a300f82606692c5499160300cfd008afdf19e14d8b312db324584361f942b9a26ee52160deb13928bd6af0af618ddcd8559117569647c7eaddf91e8842f19bba4dfee15fa8ce701d4e37b72014950479ff3ec1be4b9e61e170e5d06252cf3d0994d11ac8a4eadcaafd1cb34f30c3216dc9db021f023d1d600bd9e65f574f0ad6ca2c5ac8e8f3ffdfc83cf7d9ccf31bed9e78db191368246ae81960904ebc0b6e31f87936ae7d769c11ac420d6372e7d1c3b7084de3f142689d6905a3329841daae1598f99c353cfba342e72e322578e497d0ff7a49a01f34a192005be1d95ad06fe60a184caa03ba0d5ad626556d8c222d340ca0aa30072b71cbcaf833b7812d071f6f1e79f7de0ef35d7dcc38b1f6d5bb583c1f13c46713d18898374eb37d0bb918e7ffec9279ffae4157f6e1dc24ebee51aa7d1344acdf5dce37218600dbb86ebdc84538c4bf1b728795d9d5fce8ff39b0ef33f82af961eded04ab8bc0890f11c5a80327fb007652666a165358fc7d5a1a0ac14139bc88426766a4812273598f75b1d8ff91976bf14068301c3413ff78f1d99086a336335350a88fd274c0c883caacd400c5d4007340d8d064cec5b193bdca9467824b6a02d857abb1e56e60db7e0eba5c5706afe5b8b2c8a527310620a12bcc0ad0bb4ead3db2037966c022c963a30d49e571fb0a72efbd7f6533b86a520acd50a1fca682dfb83adfb9b445eadbca0741a25908872d7b3aaca780d35a37fc36b8456a03724a161e15e742223e8054a8e7aa43ede298c4187b6418285574915503d92c1f04aa7226e0312577840e3d4bca46922d20c0278ac690fb841d86701c4a394b52ef125f7956917e5e2504030823dd6161f37f314bd19aef6bae5994658b3dccfbe149af5b4305a7521b4925c2b47464c73d14e8bf7a28a9ef1220e5322fb1df1a901ec7afa12e1a693d0fcb4c82bd07c99b5041b0e8b3788c8e4391b3b03e7d365c55c312231b1948ce51063703c5fd861009269240122499b97f4c67c58aec58a245ec06d8ecbe8c1b7e94474de25ee9d406ead9ba33427adf1eb473a4aaea5ae92362d15a96794d8812091871bebce1d4cb4c6dc1c41436e8501eb5b9411f74525f24df3543d89baed0f78ba258d7e952936196c463e77a5626357024322c5074bf59ee1494ba4cc6fceea7267625752ebb3cf5de2f23a72f1526b9a69977bff1562dac1686b84882598226ae933f6384d75a0f0f8dcd49bb67862372802cf59251af69f3230f6ebfa662e4bdeeb45a6802550aee040cb008e4bd02f8069bac1914633c762db6eacbd6c4fe58527e1b25fa3b1c68437807d665aa489701c0cda0d0a172c4f7ec94f783e8b45584937fdac5942058aa742954352287bfbb1337e179349662c8966cdb6362eb60e1d8f9fe4e3ce6bbe064987407265b3556d175ce8d83ce982060627987f237890033e1ff4f3775e2c3d2f70754d1ee5da1d2a517f8fda086e985c97573b5247e255bc3867aceb0cca13743a8ab40bb5c1fb0b58c7a73d35dc55e630b19c909755b9a01f54db5f1765eacd795e9bd6412dc076566931cc960986b53dd8c1c7b0049189b906dffccae3712657185fa4235f1d44415cab0546468bc6249fb92e4fc91fab4670abae04a29ca8512622d03f08f51ed3593264ad3032bd2343118a19a2833fedb21824bc61d6734f8029c9946402f55170e92faa4b101bb9a265706ec770732953ef69ce5199fc969a2f9b69c9ce7a078b882fd065e2aae1f523b53da2822bd3e56a9208d1efa09ef473726c6ef2d3e8d807dd58e8a993d929fe7366961607e797670124303f0a4b6a0c5f7bcf5a601b3bade5a8b2558875635ca8043c318c1aec942df6097cbc5606ae1acbca7305ec15e154d8c8fd197c9e68ae704206f6a62466c299c81de0300b5ee7145822a60e276bba7e06b8e5747bafd5cb4c55ce3a49610b6fc030d30bc9e86ea00e9196d7d4ea8484021f93a04fe81029c058068a7a46a6f718e981f69d262de046f5abb89a6e706bf5b6bf0501399e67cffdf8df1a2a08416e0bb6f039e0c9d41642123937ef6df1dbade942da372c95da93c5b8de6c6352ad43f2d4c6e06cc7d419d7746b83d8ed93a14a504c480017834a7335e305fd2b81d836a517d5cf6f8585ea53dc7e80447f8a1747fd0e0a5c35bb173af4db8f12c6400b3dbb10740f74ae6e79a92410fe9bf19f42b3960a7adf4c7a4e892fa6f159135faa68bdedf3c0801fe3e873146c9c5c26cbde44dc654a24b2754b3aed05d1e7cd61063e66fcb7c5074ac45148620c7a1b5321af90ea9505dd64e0777a034b9bd61b37eee7e4da16ad0873a4aa696f3418c5c12c8ce07f9a3e1c5b23a790749fc47f2ffec868b0d5525e92142d499668498f980aaed6c3d57c72013143e3fd1c045f7dd3957c05e78bf47c2fa7a125ff212e17e672223557d82d2e1cf6ec2d28b994a6a3dee93c99a2caa02e041eb7c71ce7c19b7529ad2337d7b9591fec88179da4ae019269d255b4b8e5aba6e905222348b9c2c38f3cadf5485ade18d5b5d7fbf446bed6f4eff00940a249939f56827dfb087d8cd229881c6ab1c225829c40bb7fbc4f3ecb450a286eee12e7772b435426f06021c077b2778e0610a99ec8019c5fa0fbd696194294bec1b5e3c211063b079f0e0b4a1ba336c1ddb32000b35f0a280827a4fe60dce48c50b454044d46a5ee93d91fd273ea3810890144f31b839d1811097ab6763b62fe35cd6c8d614d7e6410feac092bf5b6af376f794cc86f2b802b75262b445d2c117aca57855e2779eaa1a2a1c6d0bb9990ac144723e9e2be348a9d99026795b24694e8e7923b3ca2132c2ba0b4c54b301d3e29f0f32d52675ad0b0b8290d24c6c6308ed42a48b0beda5ccb744cdaea14f105b7bed9ef3ec8a9f143366ec5507492e4684b9a41fb8c40084c50e4eb7ef94e04a41c4923baceb27824ed952e45808a0af563639e7d98f8eed889a8bf4062638ed8b4452e713eeed69f55e7877c7f291af11c150e543d6d82987ca4fbacac5339985ccd61520e8a2d274f3964f5393c5fa94765e310441c5ae73ca45c2496b8ea283588025d3c8825b0b0fbc044c2615060101104ca278062fb9249662893411fca604acf7ee45ad934dcb7b543faa8804d1d73a3c9e039ac4307e8d89a2053a51a665ab01002ea8d7746f482a9c4a37e2070f533a0dbfbe086077792f9c3138ae87b84fb88ce41e3ae06b008c9844ba1ca126f77067e7e2b10b6a8205ec4677e3239ffd7f3e6068a4f2828035e8618a98d30b0b32cb60df0fe613fb77338276a35536a6ff9e6a24864caf59d83f1335d72c1746ad7e3c2486a41c57c6d2b984f355ad40b7bbf8dfb25df3d0a37a6653a8936aa0421c684f7bcc60f8184ac27a7d8e18bfc197ab259aa2bbb26c95c543a881454427a4a89f22e2c9cbf190eb3b50601fa104aa4eb6e3ca487e58f23e340628a232d5904d868889303d328571f2fde236f0cf1499303de26223fac6acea9d4cdf61d8c00374501f153727dc255548d53e8c8d264524f558181c4fb8f1653a8453957f510a09e6cfa11fdb144533e83811ee1ac3a23348b19085a3d87ea8536a958874cac6eb05318d0653a4fa026f25651708466f6d9ca55f8df915bcb256891b7e80efffd574ea9df1e53a1c4a7c6bd615963593f301d16bf9f5851f56a1761edbfb3aa1f7772cda88486b54c2f829bc3afd76f91c90739c3788298e475d15328d04ea25831b20799847e0d1a98b0cd07eade10e8187eef115bb4b5e8c6fd927009d6c00006f5761ef436670fda1285b8f92699e76503fb431c710c1b9f35ac9c807d621ba93b94070204d5e9a821ba3d1ce76b82f7dc6dd7524f12d69b74670a51980f677230c8b4a4f091f331c13da70b11e2fdb7179138a0077efa80221afa8940edcdd897cab32073efb44b19878980963c6862182ac1802622e01a0719acfed6f0dfadb8de4c4eb8b9a7d1cb345b83e0beb029e4c5b0ec5f240f2359909beba5aa22ce7fe7b4b74fff3cdb43b442424d084b64dc74458360f2b1207a1a475519046f3795d183d68395fbc9bbcf5cca2d5124677859f9f11bfed86fe76e4f6312ff5fd168912b7de54957835398f432ec8731aaeba39e0fc80f287b193e0f04176039ad103a82959805e5dc81c15804f2ac044e800731c6e714210b4b80266a287042c521e1d5c36aa5da03ae85db77e11bc3a273ee26af911959f5e0e420083051c8d1d31e2876b3efa3d23825e540321b5c0ea0d5c70d72b613602f060603863d25847e9534f5cac1900ad02888e8ec2470e31cb8792d3f844cb121988962b81eeac97ab0180ec365b8dc38e79ab4c02d86de0a6488e57f90897f690c556d241db2aa6650ad5dabae700f03bfa4a0d97cea49b71c879425ec4d33367c8abe27a5fcb4a8023d7ddd65f263f43c259210df5818eb24740e99a3f73243263029faf5f51e9e4468fc55c0c94e0ceb1867501b6179a76e316469b66c6fa949c553aac313457602df29ef0f53e3dca9e981df0e807212b80034b29703ed4ae2dc5e1ae17990466df1d3e2f527bd42f5061be5a9227bc2b352c61c34b451b56650def33800ba62aa67223b195cb2ee568ae2f823b6a4a5d37ee578a3743b92cf119e71d623703617b43826121207a2be5092a22239cb471e855d509e7f0203bdccbf6f919bd11faf889f522ba14c2ac0d93bbe23c9900e222576109e1866bef556b9d04046edfaa384529ec94f245c9311856a5eae928fd881c8d8032e06160a83519368441cfdb268c30ed75f6bc8a4c4aa4c1371e3fb99a1920028f82fb95b121902239dd215cd179ce054d8911158583effde22a04b7d666c8ac0af43d0a87eadc1e9b9a47060675220b2e9aeb7812314c294dc212f9726e90b8b58c262406251c30bfc41d03926c144a328c40712ae703081b9b5a246f470dec32bf50cd0f9818637c1358a94a2dee05389ae6b9c8bad5987b9f65a606f9e5a1cd8474b522db818d5c6e5e87b155935eb02e0052bd5fb02620a7ff447334e2fb79f3d4a9cceef10c50464062b0553155afbd044911079f709f085c2c53f801de6e66bdf9549dba031a21ebe0b3bc7a720748b590866000502f00c6360b02116848ac09d7fa3d6402cb6425708a4b2da2467b5478620dab10e3be8622c3e90f0d2d4609c3c1c10e57f7e2b5e237e04b2ead9a2f542e3d9e4e30c576d2e399133025c59826fc4b2a08b07821552cda0dd6de3793e9232be151f8e1ea7ce30d6020b31b24af52ada286bddd0e26e223071601081721a633ad0031edcded86864cdb62f4191d5135d5865a17ee1203c428615339e2f5dc4f68101b183128824880e1302f9f014096118880685b88ac83629e806cc6ee4f2651b7b9efee8964ca042ca87cc8e52c5006c7be370380905ca21806882fa5c2696fc4a267d740d8d2acc3401c3936809a606227946a4f4180dda56e3743acfa55b2d610f87aaa1a6e48fc445d728ac2be833e10152c98aaf348bb72317ba816a789abecda5e09470a45756323d28573fbb4d3404db9340163e797a89bdd9d0ffc6fb63f9ce08c2d5efa9f4e01e0fcf5a01d2073a19849cf6d887c09cfed632883045b568b5949d963b6a7a73326a3ebaec671783b6b456b40554fa4677c62fb4033b4a38dcb4c20bf115715fb7331b3b7c77f336707a3d67ad4bd1838b5e1146fdfa04998ae342df65369f0060834ce17b7dc677cc25c7fcc6ca3cd103b2293b8cf1b544a76e19e629c661be76640b2976f7ace2e20f2a62d3883dcb1e62194fa01620ae2066e959390f2a8ebf05932c34dd3933fb1fffd27c5375b9c4107365f54854468e2684be0c3427fc7883853a59a86a535bbda4b0bf71553abeacd4acb6113eda879784c433fb0c8c8517bdbb4ff4565c3cb941589abc48bdc7b277a5eaeb1b08dee56f1d471941f6d56b2dedd6e0d25540430dffd8230b94e4b92da925c7d5771d7e2dc970a1d0c6b98c0cb7a55b161b1c8c55a72937841f8530ce2d99fac72c71a5b77dc3dc78ded88097ba31fc7289585ac9c27beb89917aed8df78d93373d333ae16c53f70de06f128d05cd395f1ddf008d374155308785d54c27204057c768e86a892ee791fbbe62206d391ddb206ecbd37e0e7bcda1cfa4b233d556f6a691223b66124377489a72afe42fca9de633d988fdb56cf47507109a7b26e65147136cce55040583c48817f65174cbc5d81bb94f15eeb85cb26914582f38f5f81e28fcb557fdab5c0fe67fd085050ec3e392d84663073542b8961f426adcad52217ce116657f4f45e4f22e83b2e54120b11e7c927c47145edec79fa1c6dfac44c5e2bb80f0ea1514d6b51916a3e13e9f5bc878c69340a276cfc29067778e3660f4a6ca1311d8b3f2bd263a28ea3800d61b9ece6c68279eb0c1726869f3c69183d4b2a8ade3441f15afaf1c44fe18fdadb00a4195a23162f370f6c6133ce0e2ea23bd3e42a6bbce6247f00a9b451f1d09049c06c4f92333e68b6368f98603a0264f495a5f7644a0c2a8b1f348c36d4085493bde2885695c69d4965aac44798e14c7d90ca7dc1b25fe31289c92c82838a1201d783ac01ec70737b405e3fdeeaaa68281d326c1cb64c62545140219302c3f4a65e5dda6941978400e52aa1abc4d551bc680c758aa22696ab77a8f8a5e4c37162c5e2d1a6c0e3bda3de38af77344852b8b9a50b1dd39b33c1961a5f85be4d1e192b046e43daa75b803a18216f780ed256c5706c200b3f87d15d9ce958a7222d09ebf64a5e5560e3812072e3233d7cfae3bab365e3d970c5071c5e8129a566b02ebbf1dd4707f655521bf4fe0354dbadadcd9d5f9dc50db13a93033021136d36934d34464841f6baa3aa10ef89d66bb3ef40db3966fd92234cb5cefb90d0386d81c8a69a8fb1cd0ac804bd60f3708f9fecea585d5be52b4c06bbd0a95cec8cd17bf2b29c70a6ef8ac0d950e4855b30987300ad3fab8d9fad2ebdce5c18aeadea077591d2195d5c4c137a05300b239a9314d28b83be620b37d2bcf3fc1c4c9da380efb1d6703ef454f096b69ccd31a5db154c507b7555d9f35dce31b9934a0e0361a52bf03c501e89c27161ed8a1456d21d657b74df9ee587c18091f8e04ed947f7c2edf14e80043ba902d1885c25699408d1bd50abd4d0b096a41d687103752168c3c3d062ac7dd9190cd936f60c7fc99e2c4d2782aa2dce0e617c4992ea784000f6fff5683c469213de9fed75aecace12d627b6a4c6d93aa1dd58191be6f7a7d188ac45040360e0e0edcf57f614f40207cc17b0dabe693486f9422ab3690c91a306d798e8a706204a51e1f56ba0ca0ecc3a6e71d83ad2ce7ada94902e9cfdd0002c3b48030974c0bfbbe03e639de9732cf073069f90079f795acc3b015f4c0f64b94f1a4fd339e191e9ade5a3b5b33583decf6e6bdc3b7323aeffea1780fe519ff3cb13e1a4d960599582212225e5c436788b278dac38cdc0f6ac74de5191dfa8d47646b06b4f25a11b046cf3c293df4d8ef5fabfaccf49a88ad4fae42555caa77cafc61aa2fe639cc7cf0055ad97fab0fb882837e4eecff2487f341d983b5e589be1f7f604bb47a6efa9e0f4ac62b40c93c90004d43ad4086004520697c3c07cdd04c23d3f1734f56140d15a6f919094b65fef70324ba2ed84fd3ea49dafb7584736a135e42f2ce392e8bac32bcfdab62a2e3a39d030d9a3e0421cfecee46fc2621bb5558aa5e248a151a624e2391fe9a506b1bf82a7a219aa1e9dcda3bb04d857b2907c9d02ef66b7ca39e540d15ea0b92e338ce8decda41708fa2203740b3e19cc5d8f59cacb4fedc22c808acd75b2ff657c0a371f31343a5f996a59fd00305f3aa17e90082bb4d2a1fa6e42666e4c382a34252f70fa709f27113c2496bcb55781b900b180c5c1f20c805dae3a587d6d351460bbfc6dc0a259ef7a48c800d02996cc856b7f33ed862f0a2e2ead35d8789b4ca07bac21ee374d7efc55d064bfaf51a8cda6461a46038c51789ec019e74c1e118d2e5bc57d856c57917e8bcbb619fe7fd4c1d1ead36ef53f739d89de6ddffe8de111a802a120c1abab2cba9adf4da57914718e34321bd5a1255b8afc2c8ff09d1c485a01938815eb1f0c04c56464a5c41043eee16602eeaa3b91d94b9b364bff1561f8feacbd8a4de546fa517a9b78c5e063361ea3223926a0081bec71489e72ae20b61aa58ed842c2e64094aa621f138b2a8dc8e0c0a22edeea7f04d68ef5786c60d6e10e886c11e239200e067ec1e3bb842e67be74ae46767c1c869297228ce67d926564d9a461c7fbc2791ada234a7847a8086abae47764617d743c0ecb2478eeaaa829b55c844000c842632d25ae2f512b5e94a3149bd1623bdc033e44ea44e168b4f84f9e97308d0a17e070022c8b19789c9db8f5044a94211c76528422c028e3904cc32490402e34b69a9efe1d89ea3503ea73dc41d754866df52c41c34208a15396c7493ca8f551a36b722230f4096d536c1507c454a9b6e9ae41681f1d3f6ce56bda9e4ec6f55206ba340bfa480c6dbc907e2fdc26a299235eefa26e31db5c853ea39602f93c4c6fd275ab908b68d0b38425d24009a6ec1174e366ad0a51b78f16b3ed5bfe7d2e63c4f089b3daec8dfda42e5c3640472894ff4fa5c31016f47361f3921e1758bc2c1b91d6e37c3feead07ba8d62f3c03a5feb5d0b9d80fd50b97dac837993c6f47e45244c5d5a1738dca26e76e452a811ebc4da92639eb36a66af4f86d4e95d183b741d5a467dd26558d1ebf8daa327af036ab9af4acdbb0aad1e3b76955460fdec655939e759b57357afc36b04a3a37de0a14d4af7ea97ff5ab7ed5cfed172bc8e15333e16a54ae0a4479bdccacb85553891342549b55517b696b2a4b58c5b56625ada67a383844bf29a0e0fdd6edac369a5ca6c17b7ab3df66b1c5410bdcafa5293a7eff676adb9356215c4e697ade4d778335ca8af6e34046effc431fab7d6f3e9bcd86b3d6a72f67b7dd5debda5bb3dbe4b075f28399b6b96cbd7a8ed3eeb7baab82157579fab63bc9a81a3c3fee0e651b92fe7577ea46cc5bf3f7fdb25680be49005c7bbebbfa4d02aed811fc312b208473225cebc1bbf1663d5cf719fed25798c589445c73c5bbe6263aaed655fc352b26923333aeefc83bf1a656aef23bfe76a5cffdc641e4146366186f9173edc8e46f5881009d54e5bafebc0337eee87adee50ffcad9cae0cccfc2d2b9eaa33dd5c4faa77e6e6705d4577feae56dcd839ff5cbbd8bbe02dd4aebf10fd512b90b873215d23dcbb49378332bd9a6ed5df351fea0f7c05199e4ad53517bed3f4962eeb55bd6eaa5daf92f76bf3e7c30e5af3c02a1f0d664f565d6e6a8f8bbad47bcbd76bb76e7fcb0ac8f6c472d7b5f61ddc8d80bb57c47e36fcbbbd03173e00db27eedf933e97f50f3eeeb7e4d6d3403c3deb1975dcd73d03e38d736f14fb6e6cfcdab27366f2b5d1475a329fc2fddda2f355bf2fd4ff53410fe1d3004d427a36fd15c3b2f3be28ee8406801efdade61f8fa2fe1b6d004428565839ab3e4d726bc83a4d424bddac74b4d29ba1fac743431b65743b549c4aa24addacba34a9db50f624292d716be9a24d6e879a534954a99b559726751bca9e24a56b3002c074aad3a4a094db4a9726bd1d629d92a2256e571d5ae9d650739a9494725be9d2a4b743ac5352b4c4ed7d632039961095ba1d74d152b743ec6912d3d95f5d6c59031a9d3eae91a60430adfb30922005d09f197acb4405804559a9ecb017abf5ad01ba871e4f25b90054a4708e4bdeaa7a7590336d03e82889f74a5fce948144f230bbc2869e7d0df22d01ba5ad26d0eaaec9f9a7849a421ddcc6517148cdf70fc2ba657b1f86f98d0599a54f111f977326424b7d4f75e3258d22098bb43b9326551b9f7f516b1bc1fd73fd9c21ce67a258d04ecef163abaa3eb399a3fce1d9bbf9ec306e716a19d0dd7c6db2eda784e10ea7c3e80f06240ffcd4442bffe868be85a46c1e8575b99205dc710deff80de61fa187c877130fbb14670a03e0478a0c1a6bf511c20541f213c30f6d94fec0186f599201ede098b3fa18471fd0ce38bf845308e0715b09f08f2b5fd0fac079000d9bf4196d957389e87f619988790dffa832d40d83e87f3701953808d5772703f14e84b47584531a115dd0f20fd3381917459dc1f14ea33f85827dbba14df6b60fdb878d129db9c03fcd45026f8b703a98c141a62ab685f49fb3a9dc002102f0ff73fcc0bdc63fb38c6cff11e0e15099c842000f91f3849f27bdee7517e3ec059fe3f1b26ccdb0cf94caee6f40753c079ae90caf32b505a042cc42a417f0dc3f59c0181915ee51d79fdc7963785fa9a8520356602a4ff82d81a919625abe2feb8609ec00ee6d02b3c99067e24a19fca681146fb19909fd7053fad925a3ced46f7831066f15e118509222060669d486b89c0c7aee3c72a881d2318048a7f54fd4b1b1761b0f0d8585edb4f315108ceb72f04ffadd4880cd1c1a190c40c6882b64b888836433bfee06f354bc064183ddebe46e31fcb495d028a1cf08f5b065372063e114f25ff9e19015e63837ca739b61f08fd92faf3b5675444dafeb40e84e7f5475121549c2a394a174d8d788679003d701ebcff456294143537f34b7514060030f7e86229332ec2a1da80a6aee7f1d119c4eb692114cb3bd9bbb58043e82f41315bb4dd38407cc92d04f444abe0c24e82e7b7881e3a4bbc2a2e98427d27ab970b7311fd1194a28b98db03899feb4291d047b25b77e105e837c1345e889a3e4ddc4d2f4c43fc27ebdf0b71d93d12fcea8baae389899ffd4218d82fd96ec0e00ded3b41b3608c9d3e4fdc9b3054573114531a98f0866105fadfe19cf0154a2888af2d3d8272c648bb7590f8b16328107d40f60d19be01fd12ec970c2bd35388bb29c32b847fb2fe96a107db03826fcc683d3891f8bf669800fd906c0f94148d789aa0bf67dc989e43dc0d1a5a313c92fd170d1d621f107c93c6f5c059e2fda6c104ea8b641d2be3acd9956a6d004ed2493c3657137f3f13ec59e3edc369e2fdaee104eb0fd9366ce86be991a0bf6c50bc1f409c4d1bac2c7e92fddb861f665f08b671639ed019fc1304cdb37bf1b2273dc538e710f70e391059d105b9c86789359dc0e58e5fe5d0b40c1a3d58fc16222bfa61ec044cf619b1e84cd2860133e225dfd9e7c44c86ee25df15a63315f16d180f7f8b7b11ef30790edfd71a52aec962fb7ad4353e0d012b828febd985e7ac6a1cff236f2646c5ae668b70394e80428688f21f6516d0599a76138798e3bd973474a456c9e644b1dab399bdbd4d642321d3bf5a50d158dcb6366222b368d9b21222fd3e58788a66f436483697d26974ac15d409f51fda21e70fe4d5b7c0e8c54986d6e540bc9971409693a116b17f45b143e18787513a545280de40f53fcacda614bcc0fecc8fd87f26313a90d65fa134f7af6e9fd63f43f0beb9d5017b69fcbf8655327326fd4f2333fa7f8035e8afbfa4cf4718ab823939cf286e251c48d505a5eab57aebc0d6cd1f570fecc62f8b8fd3b18b1ca78ff42d2d5ab024e0797d12536957e3b4ab397cf459b59c79cf6bcc40da6e803bd6b1f03e2e6b36741f9bcb1f2d8ad4b7dde691d09427456c11e1f43c623262f1be6c8cc8bc1e6a6d0edde4bda6fb2fe122d51f58d9a1d80919da7290844f59b4c3acd41d5f8cd5d53f5b599b9cc93cc657d8457b94d9cdb7b4267a57887a2343ad8ddc150ccdd94b36ce09e909976d971dfd0357d79833528717c14e113f2ed0319b84475cd95c8ec44e5a7a5bd6e81cbccae69c903d70d97e99517f7075edb17d957d0fcae456dee3cec09f357ee7bed9285f71f2a95ec3c72a75dd0786e8b77299df013dea2d7bc2d8d1dec037c4016f9df4855c70676c63ce037047bf936d2f976b4f6e8050bf468f969e965e8d5ead1e2d3d2dbd1abd5a3d5a7a5a7a357ab57a540131ba7bb97bbf72757377f372f77ee7eeeeeeeeedeefdcedddddddddbdd7beeb4ef32c6fef02caedaf405beeb87c47c5d29fafa7a3afa74fa74f5a6d31e3bd656489c20e0420001f6fecb1ade7148b082f46090c90a06e17097a9e14e0467f6c849dac99b50529d02524f14ed2b6961433332ea03ce53f30239f67b8a1249479984d5e88f0d3dccc45a5f46afd8c005c575840abfd2f9874eb140f3b306d4c32140c6a94f1c8a13773881bda67818175ee102162d3a92cd34b264f528720193335a66be248e8e794f37332fd769ad040dda7929158fd5b950a26fce9a339376ee2105051011fafa012a14275dd9e4efbc3449c769c40bbad339961ef191a4ed6b828a647974fc96b35748fc9e8279e9cb1d328ac644fe9a73119cc802b04895f41d7519c246b232e6ff834b6ecea919ce02a46a42b9579bf4062bdc84233c3d44e059a689989117ae1084495fa1ee5036b7c0db6459bf34019596efa9553d7f29e382037ccf3fce028ce962b8a8d4173bd32499d980d235faae3725dcf5f9e00baaa8ab4211cba539f7a64d01b45ffaae6385683650c2cb646db1b74aba6a9957a5b8b6b8dba45fb1bc8b525b551832c2955c2be1b2f52e36f32f9f80d47d048ae8f7c6572098556d3a65eb7e74dbcddc5f6199b2effae39d690545d670fe8a31ac8ce968398ad8ea8ae7d6aa5908dc9bf9c170f84dfbcd50f9049a4cb75d8785f138adde2463b3afc87703443bf2280afd7eeb26222242f69672077e0c160cc10cf3da547fe2e08a268dfe875030910948dc86898947aaa8ebf2a45759cd349a71108a76804444ca445a45a4ae295d9edc14d7ab7e006edf527c72639986caaecb93ae2939eeddb8b9fc5056bbf850d676971fda7249c289252ac5e5e7f65d9274cb25664b50453593624b19b77419ba7d9758b75e56323e83a4baa5cb934652b9a5cb139727f7db4697ace8053c9996a6d83e431e2a180c0c0ccc56c6083d7121ba731762bb97049346527c1eddb9f3d8ee6df7beddbb90ee9c2a76cb1897f78d2f847b772138db5d08cf8a312861886a0f7a4a5bd75d877b777eb7e3f55545a11552faf626392bc4884ee9db85780f5faa885446b7b987e7d17d7b78eea5eae80a015f7a380a1162ba479f104b154c8891ec42bc9bde424a079fe2f3f06e3a8fd2c12dc51608efa6eb78373db33aa583391f0c51d76c0f1f8b7121d10d7595d1674bd5910aa9853ba59060906294e3a828e6d01fc49060b652273052c1edd4110cca182115cca482154979768621ba3030caa22df00d1313544f3f948569a1b6fcb682213a1d26c671a28842fd938489d1d6245d30180c46082668524acbd51daa82c975b973a80aa1fb755d98233b0e16bd207261d25041e2f66192306fb4dbe782e896304d7c7e805ee2a882a98a46d51065f5c351058e2a24ca52115dca32a9929ef8de9f2111a9ba999e03962aa4db5b96222a534437cc915d55445b463c10c42441dbd3233e7c0ff8d3339baa3667bbe9aa21da3abdaf42a22d97db54f6d9f23795d9141061f8ed5966754e37d91df0a7ef88e52abc493c8aa92d5797f9226db57c05868809e36813dcfeb6d5ef986c2a7b58ad8ee927bbe36253190fefa1156244e7f4d28594ee72172be4f4524e0fcb57ce2c1ef5ade5a66f42a4699ca4881a27d9324e92659ce4ca38494ea58008ef5d88d0a6f8db7948ef429cb6eb98be99ce56e7b4733a0f599a241706c164f8ef349a465034990e5ec774f07c10bc68774053cce4e2c30367e78153403069faf6148f6d23a2ad39678a68a688668ae8f6bb912bea7c288b33baddcfedad8c71c1c41ac68bfafacfc6b8baa6561be38289cd4b635c5d3353faeb0fe5dd0843a48a8d2a1fca6a1edc76ce4eca52f954c65215838985614e781e45d7fdc2b1aba95a6162305ec404c51ce9968c504c4fd7cc243a20725b057322c60524845bc6bc6eebc00ab78c29523356c1baa68421ba48ba66950386a86bca14900f6da5543ec9948a05629231aeca03b154c1a67694245c00a57c9f2d39188ae5010a110f7e923514423cf81a06c1a4e9a771923c7229a039a33f5340b4e573bb0093b2cad40f5877209627d84df9e0ba9aeb7e144c01cd1b2e88264d9d8bb642da7a21a21d6d7134465f88928850b6fb79417a49125f8c88255704beba267b961db95906be186472c5cb15cd9b25cc1b26704b05a3ac3e2705f10a5c176eab60a538f61dbae509f642445b2a8e1345a2db7f09a22d15a78aa9ec4b904af5a3026ad7fd1a54c568cbf4beca87b64c168608153b719c288a3e6469f4461788f3a6727ab8773f5dbe294e71781defa1dd31c2df11ef9dad4ec9f4d279c81c393d3da2f5de63b23142def84af14de72183526c75bc97ce2fd91d236c754a3759bb03e4737b8641d41488f53ae67539c19cd1a7b61611e9eb41ebe2a2acbed5baf8a0b8ae14e2900ad6ab1824dd7a414ad23525c7384e1451a87fb5e2675721e955c70cddfe0b126dc52469563fc615c3e4f6450e251eb53a4c0c2646136383c415bd20dd3e424ae262aedbf9dc3e4c4c35a482c1c44a1822d8056292de569fc1c43eab82b50a76faa1ac7e177412ba1c278a7368b3271fcaea97395495104bfe71dd86f1a2573a10635c1626061353daa788d4355f1093ba86ae5eb82344eee7966292883467f45120963031a4db30311b34364888254c0c26c6ca78e8108d8787549e4c43801a3e7a86a682b2a08621e9267982e8ce244fc06e6912c36d9318e60dada006d610390d8826b5f7a02d4acab833f346c6e701306f589fbf61de04e0f338cc9baf26c6e765ccc861de749fa751c3c6bc093f7f63de943e5f336b4c37e2e771cc9bd3e7779837289f27c0ac49f9fc9d372a9f27e7cdcae70f306f583e8f8059d3f2f91ee60deaf33b12306f5e3eefc3ac497dfe8779a3fa7ccebc81f93c10f326e6f341cc1a99cff39837bf193f2fc4bcb19f7fc0ac81f1f909cc9b991b007c9e02f3e686cf0f316b70f83c06e6cdeaf3199837333edf83b6b4cf03a12d1bd7e1e58cb9ba3593b8b38769f47d68eb065bcea789cf8644e37dae8786c68644c396a626b791682c117c4b13d773fb35c61be339d4d15b98638a99c3a8b2711d7438933ad8d0a1c6351b3abcc9ae4123004d87d33c87d7ae11802d792e8de7701dc63975a0b1b35739d0c841c6d81c93cb2d19c2a2e7908c914d149431ce1b63e49a985c0a3826b8258e70fb3818e0dea0e4f601b0c5edcf24b97d189608b73f0ee1f67fc5edcb5871fb31b0db8701c2edabaab8fd940f6effa507b7efc283db6fd1c1e57270391cdcbe4a1047e472515cce06b72fd6e0f64d9c0c6ebf04c5ed874fdc3e1883dbf73817dc7ed782dba74edc7e36b2e0f64fe10e035cfaef6330fbe84bcee7873974a9e57c7ad55f0e6a80cbf978c7e9cc7add3431e995a9a85a139189a847931c2a20cb5e332d43c2a49d6a9936674a53120dc010e6a91aea886fca103d18c711b97d5025e5e7c2fac650dfe87f8d850fcc197d22e68cbe07e68c7e4c2c62cee88360cee8f3d5c1dd20de50d770bd07f390784336c59607be402e5f8a0671fb5eb4957de3fe652325e919c4b26317898fe68cce3c18116d65471eec7b99412c3976e2c1527e342720873928bd399e044a2997f4ec31d7f96ab932f3bc5c99cbbe1cc771b6815c9939e31a7c8213e2463971dbac0896dc0ff0fcca50cc2543805d7681b872c5aeb9653d078a4b3002186e592d07f6ea8b2f32efb472e50ff09641e8ade72a570671fb6639007262ddb67abb11e4466eab2069a4d610eb164862a8244168f896484103efa8140670e8086a28d510eb453108bdf4dc289241e44ba90597c0c0e772244d3d11f9e68c0a4a548338efbc35076268533ae0c3877627b4299df02a57b13b2a0fc1f3903ca4ca587120d26fdb8f999e8b72a7163d63b81f05c3712ed1220a17997208a43c553fc9f0f36888271cce5e5d8b1e2df4bf1a623633858aa67d29b5f378a8efaa8e6a4b095ccd962a1601fd992169889c6166716ad044bae5672c4340b3b467e77a702c10f9ce944eb871c148175c64781e92fb497a0197a4050a84908cc174f943a05cdd90134e4a3f4eb0c185ea80c221d7921b30c1b5844811a02eac412709c10a9f10d05083b0e52545d25015aeb86207dc922baab8d0ab0a2d842fd7a9bbafa802a59c43a2eb670b207401fcd90286845689bc4ef238cfeb3a9751f7a3240869e838269c2eb51b160c70c44754a000e868bc020b3899c7795eb7fd082109adc1ebb82bba503b0a1bcc19fc7e7512b59d9415d1242542c8624b5a820328b48ad3357c0474cd9625d59f28bcc0fd2c718519ba2557b48126bdb6684118b670814bab57b4e1f34e505d1409db2b09912d9cfa041ec702aeba90e05c516875082ce0aacbb53dd1bdb070848513697862e36c003621890a5db001e71d0d6d41c51986b6a8020543c84176010b0c9172548445108494f89840ab43e08176010b0c714fcbb62e501a05e5a4bd8ad4232d48c0042532b0c22d190aed28a7eed751bfbaa666bbfc21ea146204e60c3e04e60cbe104ca3074aa499922024b92310cae2d726c417912c0c47f0da489f8ddaebd841e1087e86d48b6f25e927ab1cc765f58809931b4a2e2643687131f1c92a4b21d26b07425b29e7735091ae399d8f72a62d95bfdce58c7acb4553a9769de5a16f77aea7858080744dcae543d1ad9e2f6988880e4e4543447e2edf08da715956437caff83b5dc31ff2ce9f7919559395dd65943159d951e30e9395b1586c645719c1c9ca9e32664719b9b9ca7e1aeb9cab0c013a18b85d19e476df673db073bb4fdbb17ea221608ab08639a60035d0fef81547d3581a4b7e7923df8bec59cdb226d2ad17c96f6ac559b9c7bce1cb7ff74f0beb0dc4f2d376a83b935421e9969d4473f2cb6a2ab33cf4cdb4f7e81a5a3397dc00c9e5331013e956ca90cbe522013993dc80c8e51e965bcea41e3a7233ad7ee2704b1997af8e2ff40cd135daa5973b663ba95795086d31c9734e9c7a9acbfc1eb3e793cb07b50f68dda59f4b84007467a8a3bbd9bb4eea271debd58a91bac8e51bd1e307bf8b744dd9495da3d349fde4a5690e5a69253241251c910c018d3304d7fc72d264f1b78a7267922ab86ed949349752d4b75da55b3d288bbf71dfce1307f7cdfbb61dbcd835cd3d68eb4dcf75ffce8d440411bf2cccf17de378ebada722ff98b93aa428d29a24d3d79d3086703cd990e6f9ea0656c0471cdfbc9989f2dcf9ef5a3d3ffb5ce2760cba40eae2b61373721768f8ea583a7867c9769ff7da3a7d0f4d607a1f01dd3abd6fe8bd6ff37d0c866319a4aff7f0e258f280aff5a3610ed0722510b91ba2a4f0a48c41e845b18c02a6111e87f69c9ec4c99335e27d28985b1717a55ad1560dc17f947e21ae680b059ec31f2af82ecc015a01881e38f271da82329ae5715b083411cc6c04347672103263888c0eabd7953504a0c3e55453a59bc1371d20ce2c9600dda9e4ce2c9428e1f618f19ec44f3fb73ba6943f99996df79d8e5d1741afaff76cd08b6d8754cf447ad548749c11bf7a15c49d080775a3d803e7e40bb19c43dcd60171b1582cc6406c7f7046771bc794964312b9934312c951d61122bd73c90f906ebdc192289edc253758e2ce255134b933ee5c12c514b73b9a377cfb9d15668b0606b483254f50c18427e476b95e2d898206a8aed96c771494f483746b05525d2e17096a4f1227b5274143662ff9d5646c5a94386f290acda2aecfbdba2eb8463f1b3b2d708dee8e6a7d559738b350b2a495e9800190ca692bb3fca293eb8ecaeea87bbd9ed08448d77545be107bc5c55eb4d575d17de1f6ebab3b6a835872b172e6e8705e7447a7acf404111e1cb933090e90c8b833c90ecc703fd39ca92da2260e2198c616e55c62ba99587c2527e5006e2900ce0885248102e0188269f0cbd69da799383090335bec4359fc59c2b8fd71e2e0a24963c2cc9ad3575ea254bc9497f4f65918073741e19aad867b9feb0e621a5c6f33e2d497369777c0e99511285fd951b1546817d360c6c13d4c839fc49cc14fb1651bc138504ee2c6edb892e8995eb860d45a6badb5d65a6badb5d65a6badb5d65a6bad2b66d2ab79c716375b391185a2412cf44308c6d157028c839b0cc138d808038c839d308d22c6d1764e1a3c9d5ca6c29cc12f9b598bcb2f621ecc15bff4a02a2e1fe42b2e7393205cfec1a5c2bce11dcc197c3e3b611c5c8469f0915c7e6d72998a7b4b369239c2d5212313638498189822c0c0a88854aad49254ea45c9cb8bcb162e2ea82428548b162d2d2c59b0b0ac60b1b2a232a4a292428494149421a0a09cae389d4424a2681282c9540a42a9145a1186200c043f207c9f5785e77554741d7784e3b61f6c9be6034dcb7a70b3592b0fe60da57407f3a6838c843cf02d426d0f20bd622f38d1ab4999852c073161cb0dd0e07a412857b84dc420daea81b2782cb97f3fc74b6cefaae5a029889ae51f0a137b1b4bfa9c1e9044ee93db7200bc7d7e0f39a9edb3bb3bcea6e8e71df9829c4dd734df862d074d5abb1908455b8c83c9e2f780633e87ba8c0a72d2641b4591b67867122e983057daf4250771505639a8f2d19d3078c021ccc3d11b94a0848ba20be34e255c14b9dfcc417c7141a5c2bac305a9f74711f5a61250cfa91ef8a612c073f93c9f08c4f36e7f04b120a8b789a89739f17e5ff5de57400f395788305adda7ea1ce680f9f755afc234fff5de0ed561ce63f933cbb057b65cf5a9faa8777eb52fdc1162ada71ecc555e9519533b645e2fc38133d421f3b73ce6f56f21daca622c6db1dfd15726a4a10fd54b981f5417a242efb107f56c7886b9cc08f3169a9fa155fdfb3250657dc05c4565ee591ff4bf674b7afe17f0d77b23b5e5e7d0f53e672bbbf6f06b6b4bd49541899355af8ddc3827ab5a1ecb96cbb48c3f825c98d370c7efed0ff0c2bcc31d30579dc31ddf4df90073d55587f90c77a06e0973d5597518d687aaab47c2f4050d77a8ac8f7fe6d5faf8ad7df9032c7f80d7c74fffe3f4f7cb8c1ffdbaeef00cb9aa1df62087f7f84ca3acafe7eec128654edf9f573596dc85f18fc17fe15802b9e1bf965aca248919dd99b3ea3125d791feff2ae88d25ef08afba2723232313fe70c36f78873bfaaaac0ffe4cb51c634b9e3bf31b0e33fa30ce3bc33a873956936718739931e6df2c80583f12e998b9f76f0201bbde5b826ebd2a0d40b77efcf76d20cf12c80d42af0fd5ab674b19a7d7c2058c6fb9077300dcb3250e996d98078078a70f5f6dea13bf7badd4677778afa7df6f780260de0cf02c7704cb1b652e03e4876a53e1ebbf54f83eff25776f53a1dd614b20def700f085e1cbd82095f519fe0073cffa80795b1f2df7c620956d6df90dafa10f333b5aec946183d03b9600b015071b845ed502541f6dc957a51acb21770733e8616001e577be676bafca20f4aa6c29e4863b28db6a6fdb923e08f568ad30ef48c4facf90873e0284cc63d2e033bf0984ccbd2789c5ee0c98853f78f7f7c698abc612c855bdc7926fcc38eff15b3e93c490ee71388f30f7c6ef25c7c38ef0e2f55417e6efd1e2d566b5bce563cc6fb8f5117399e3740d77c4c81c87e2a0eab16316d0dd6badad95bd592a8b4303701e7d789739871deef02ef36f07cfbc5e2973c3f308e47e0fc71ffae3c08f3231308ff18fe5901d3cc42d6f388c0d52afccebf57e43c97365f8c6c88c338f319639f78607602c81dc1ba8d521459179a46b9883650520ae9e850ae0b92b1ba4eaa8f7c0acb68870c7caed61b21562906b8a26370b2441770edd998510b670b5f839726f00f1671d2d577d66cc9917a72f2323f3fd24c9c193243978e23205a124693092f972663eaf85af8ca33e3cf7effbbe99f73033e6bc409c5140afe667fe143fe6f3d631c59687fb037b9eedd12b1cfa315839cc3145f6498120da2ff57ddc837f7e30b9f340ce3e1488a19893c9ccc20849eebc1194bd1d7d431c6ef0c103412f9c22fb16fae001e09df26c0b917da459f3740a620b61222da0de986ba107f88b3b9e471fde7fc36798e306196f94390d7da8bd9279c957e638e818bfcbd8f2c70e2f82eff7ffc3c1dba1917cbc616ca2666285388edb9c11be8e9569848f1939a6116a7346588237fcb7813323cc6754303e33ce0b80b1c51ec6bf0dfc38ef8c3d4e2ba06b8aa83930c694f7afabf55da803e636b5c3bededa9447dff296d3d7206cd1e3a487fa7df35caf6815c4b71defd4a289364c2319cf9641aef7fabfebeed50a4ee195e0fd4e4799913b42f4fe8d32ef910360cfe755af7ab73ef837c201708aef1b6bfdfec3f6a8b69dc8dc1b4b19f66a98c3f3d828f4e19f2d8384af23873e780fad8fd92bea437de3509c1ec7926f117dff6ffc01de5f99d731e5c317fe7bca07eff238ef2d4ecb8ca97a1d5214b1549848308f59b9538b1f1ac0a8543d5263905e4d97310b73a02c102bc4d9ab9e1e30b19c48934f3abaf0855252fd6c133eb5d66aeb0dc47212d5233d74403d1011358cb6b2f7a83d3c24a44f3ccf761dabd35db43ba777dfd99e9d87fc4e1b8f8ef8ad74f1d5eaa0b01ce53ce469e4d99e8ddab3f3e0bed954fd965d3c8faebb688518d1d9de5d88f86de2d63d55bf7d92a96a534088dfce43fc668518d16139ca85942e9e070a0b044edf6e7a36a6eab5a7fc6329f1902c2b5739cb4b2f5b28554feffd43194594125b3aeaa40091624bd7ee8d3a261e8eb828f2e40c2f978b64794a0a0bcbc843a688ef2ebe53995f591979481594674779268432f290598a0793d98518d14939ca272924c5a68e62539ee571faf693ddd93192ca393d88499e2c0f2de6022fc84006442e172952d6bc4f93a70f716d2fdb254ef294355f8a4894a0220949e8e2648f28df893c64970282c92ebbc6c48b92650bb51065b5500fded19da99c495925ffdcf9799487e4461eb207f7409c24017a86c8498649469e100421fcb85ce424992c279269b4a1ac5981202ab9c1123d3c3a3ff04e2536309a1e1f0495d800d683e711794cbf5ecddf21bac6b3d5fb677b782310cffb8f5ecd87f74620bdca6e05f28d3dc25adfe3470309c714dff32c11f506c96eb529fe24b3093e1b7f346b9ec71e5c88a0d7430fa02dc54b940331a5a3edd42ac4148f4c7bc643527b6ef34eff79631ff1bcb3ed23bd82758df7926dc37a354f6d0b09358c79d239737a18757a35af8d958a1e686bf650510f47523c3a21d9bb4f724e2d528085db63d2190ac13db3299d6c27e579160826b34f72eb2c10ca6a422c279250c3286b5e1b855a8807e26c169aacf939279dcd936548c75387643c5936040fbecff4aabfe6b2d2b25eba3a9d59f5cafe5fd16e307c5386e8f32720115566b8cf19a6944f55d8a76fb0ab64a6df7c7ae5a214296908ce341fb6ecc33d45935deca3b166d9c735b30d75ca6a17fb502fc43588b40a6233558358cfafdba98b9bbb366dcd969ca8f5e7e4fbe69c73ce39e7ecad3babb479cbaad65a77c695f9ccf6b46634a3cdfc3927739e12df9c2959aedbff78d6c07c3157b3c5a3d0edc37c3161b7df2e3d98acbe0b1065a941cc1e7703ca466d16a1e8d7190fd9dc03b19f62bbead5f60a04316b1f1ccadaaef60431a5d3b7fd4359dbd63edd43053951d9c939b3591f74a8d627986082092686a0f190a538b3a2b9b344a9b431a5c33c44f8e28b2ff83ce45741d075a716eaf0eb37b95b9fbd875caefbf19c9c8da91dd9294fcd32aa846fe62082aedb9a5328c31190b809356071e4022790f8270b2b00e21a24e10a2f266264f4a32941418fcff604363c29e2a0908228f87453e002b605178484b6d0020e8e9c30052b887a7a101b027ae12788a4220ba1074c5ea72c92f004124a162fe0e2956277261a62900517f9992169e886892115ee081a0891d40e2980128a54b6285a83d08a12a67004104b4f218991a2be82139028a24c882dc1a89a610922329b411741a456051717625b13c8b0041139a4c6880a57a820899c5d15b278c5c82105182267dff094402185263ca107464f3441a464054a043da10a2514cd2710410db1d92f204190d1ec1f203c5134db05495e0822a70ac0a00521951424c10649e4ca10efd4529d6fc8ac020f7a5c64fd67533a1f3791841217f959fa9d212d5eb0828bacdf19c25d140189f4ecec1b3b433c1b201144566b24e583f64c9b7748d805144124b54632cbc3a2a448148866915112865a9a91bec842901358a40156d909254700ca380746a4f8d18ab0a0e2683b2aea428c530210a4f061410d7ee612dab08518149c2425ad2a07191df921876c6828226bf582064d82c82127160491f4b5deb33bd3085c483a2287743ff821a915a0d0e4881cc2b920c94696e241ef9dda1d8ec20fb048227786e0e043d60f11bff0ddfb6777e6117cac9044ee7c1fd2f5bc487acfa6787807efd91d7e91c10940e4ce90161859ef1db43bd30a4f981022773e3b644322ab8c215c133e7da354c181041f0c91d452bbb31de1c788d61c1d21fa06937346e584e0434591a619a0c80f5c243d0f1934d6176569ddbc993abdea1cdabf4fe4805ccdf2c6c50e90c81dfa21fd822649a491ed3ce4a43c240ee531e3c620f56a9a1143971bba597d5525c4ec65909a93d3ab164248dcaed3356c8ba897b979bb710b7370f672a18e6db39c11a06748d3e1d956b7a1a1c9c96e8347523af5f43b7687e3216738c58451161d79c80d0862595ff5558bdcee1f51dd2c7b9d35dab37333cbb41a88b1db015d2d0ab16665103f0e9cb495aaaf162841886c2aac610c5d12a0004b22bd26866002a46f0b2ea316119018dab121c2101239a42a01ab597f130a449e20810c451396201432114313a29215825005d1ace0119a686234b597f89508d03344329f7a667c5355021890c8211b1239c54c892924d948821049ad9154c6a7d9851640e4ce10fa21aa131c91d4a28093b686d060c30d62e4ec1b294929e831525901296dd138010c49e464821248246ded18e1c161a0c2082e923ec583a4a776c8113890e003227c31c4459d78c10917594f3f6b507dddbe518225cf3595c412e8a23cd90d51f05c77d23388e58fa8ebceb3846e8b462f4211150d15d970228dcd22cada6294d543454497b638a4a42394515151116a8b1dc56e037d40c4ecfc33882577d4ae9bb99c8084825e7c974c13af9665a3cb2bd35c5ea30b14bd6a940f9f5cd4e5d5354f5eb5c605c8e505645d5ca01093cc206e43b7ec9e88a50b900b50d740d12d8ee4ae98445ba238445bf5484727a32b12dd2ee29762ecb6a886db9f0c74fb1483db7ff9910bd02d4f4d6eff04a3add5e97582c17e604ac09080896bb842a20e66142ba3d3135ac6aa0114aba3798f6e2369ddcb55ec66ac25583f2c9f5e75768aef25cb8787e98b2fbe6803c9592147d073dfd9ce59f0a09114f98d35046292b4b27cb8554ccb56deaa5bb17c3a960feb75c9158cb656462b2b3023d8ed9517bd6a9612279834fa2b23da622dc1f20103cb0923da9a24b732bafd15186eb37ce68c66b97a15633121ce5bae62b7572f9fd7ebf6af40af1726e3e04983b92dcc9aec5d86dba79f06d233f0e4daab99c52d67667019a8da1ea4d09d3078b887340f6f2b67f8ea0954e0d3356507bb250c170c17147c6e1f460f0c091318b4e6e7ea34715273d0cc19fd0ed60d61a1c69cc1dc0d75b00e76c4b6838d1d1218db6ec8491327dc0d75b092e7764375d2cc19489aef47394debc0ee758c01bbfd187d0ec9edd3a118496e932006d0bc991e47434313d288622f510a63c060d2e8c77862cea03406500c184c1c9d1533c613f3a613c23b588d1a4294f5151515151515157d5ec725c170711e0c5707c3c559d7ac307c60fcc0800246d0bc61954b99bbd2cc9b994ae5a438081e323b8f2542273b6877c2673ce1c815b93160e24bd4e501ba523c980c9f1db4463890f2e16ae72497eb4ed2f4926b42ec6037906e24dd38a22d71e846ac83a51cc574f1f4ec3d2a079faad5749deca6d79bec8e91aa62bba4ef9c6c8c87fcc03155b331556b056d6ad6095e273bf879d0ee18995607bcc9eed86e2823c1791df3d6b062cee8a7d8142c2574ed6507bb217443e886d00da11b4237846e1c09ddce32bb2a1f03e8e4d9525ce25a9413b72d14b73b1891dbb6432a523bccd1afdb270245affa4ec00082f1d32bcd75e76d26c48d8639a8ebf66b7a6edff0a25713bcf164ce1b49f3a608518789a3be4f336fb8b362d2b8dd12a2f6f9d0d610a2ac696bc0e60c14d7bd71445b37384ebc71446fb850bfebf66f1cdd7071f3318adc16bfaea19c476bad1fe538ee9e7d3776618eda8539b8aee3ce7df6aaf48ee34431e92589b23aaf55c9cf96759e0b73701c78a94d05d9a823cc735d1b9a5ebd24c170d1960d8e134514ea2f2aba291ed9c183560838851c913dfc4e68533cc0870fad90f0e027b9933db42f202699d9540a1c8da4565746af288caeeb3a1b2f1b2f1b2f1b2f1b2f1b2f1bafa41a4949318068ab06574511e5c500aa11830b43b7dfc1baa18ea849d71c711dec37c68bb678c87e36f2903182621ce91ab63aa4281263e8a9aa84b8d932554308464f528c0e1603a84481f5aa91f4aabba118405d3391527c6e3fc55584d411812b3b583d81587a46497ad51dd1ed0ff15fe8cb1840305c1dac13c32d6300ddee508084508062d0e0f6678aab84810244e79cf192645f9e744dc903c3d535e54bd2ed81d5fcdc09a3a936002ca4d47a0b7e55b325978cf46d2cf96ecf4c5f5635d3a669daa75dcb461c9a650be8fe1da7c1aa5d2bb98bcd8659673730d4e1bdfbecb6ad6ecfba7103b96fa3f76c345d3cf8efe3671d239d82a4fc9075df67f97b4ad91251ce71c629d6876c7be54dfb698b465c4036d9877164dfecd6c5d5c05047ca33eb23a594ddb4a2e26d29efb6155bd66b3aa762ca9e62cada89cbdc75ddf9b3cc853ab67b28d6b469a763f8acd65a3b53e6d56ab23e68ef6ae6650d5a1acaea977c4d2f59d1722d9c1fe00f10c7d47de3be992cdb14f7ec38db33d34ba7d774f0252f71b573a18e7a1f265bd6e3984cb62c8541e8e5256e566df9019ebbfdb3ac69dea8dd5a9fddfaad7ed3324e6cd6e4384b79c137bb86cb998d1c6571ad767267f14d1962c615cc3acc51392e47b76dd7b43108bd99c569460147db09f5a1d46687c9842ee11de52863bffa4650dfd8a1576d739c88dd41fdfa5129a5f541ba9e8e3eb472b5d572bdfa8ed3744cd5cf1c9b723e8a2e6c6c0650cfdc23758d6ca94faf3ae8259f06f5ea75bf976d9b323167b0b51dd4af255e1df4fda37c66326fe6dd01e5fd6a02b1a449350991bae86729626105933bb1b002c9b577626105d0b519800ebe3625f8e817a210a67b8d8439e3455b28ef77106d9d7eba7714d1f230d91dee821069bac7e4694c71e211d435594da98d089ac639590bd82e97839e87faefd48824970887746504d1ad460cddda46fcdcfad218da8ce5ea721266c238f8b6679bfbbe1067333333333373bfe65fabbecd0e47ba459328ab6fd37d8826d116ed69968b26dd3e67c41975d136bc688f8ba98bfe5c9736529f7ecf4a860da7bd046d61e4e866efdb74beccaed98b19e54ec7b2bb36faa0ef3eb34a5fce77409caff33eaa2da91533fb696d6c2411b9ae9bddcb21973e7bf70e79e85bce6c9b15b597dd01f13eb277bc7da66b92a054b2f77667de355cbd94f2a53888e0beb55e3a3e11e74b063283d835e5c4e24e2ceef692b96271790e5d1fccb533e639e7ac3434b7d66a7d64e798d9d2993983be0be23c3df75c7b3b88267b5016e5ee9c38e6a552b8d5969593c22c75e1ab21aababbdf83cd0e36ba49263366cbf110e6e1da30d0388eb97e5ff7d7fdf440fad1ab06c10e9c4d5694456dd8ec70e7e7d9505677af56b4c5426c3f94122709c390894a968752defad12863c9397af4aa81744d686a09aff22f54094396b3f551bf727e0b4b96692bd3a485394a5779ff0710152b003154a16109b4d5824a183c3f852f781c8a527bc57ca44795ef1b7fe4e86c0f205de38921d875630fef3abce3b438f6884fe2a4688d54d3b97436555ac14a6b2d952bd0ce1d3547d735ddfb3f80801f6883f8e0fdfb678ba8d7cef4aaeb55f2a3579aedf10368b5fa5128314786c49ce912351121d9a5cf82fae59dde8220bb9d9da24ffb9dd92e2bc1149fe024a39447d4f7a11cd9324876bf6bedb344af988f288a2d39933dd2111e877e44f0458d65ce0d75b44f2f315e1bc71ccae27f9c39b4c535982c3e0e2e1f44d510bdffa0b95d779cd6726ef6d79cc1d78cc4b283384e1451a81f3497b353c4589f933153c4d0744dc92725aaf48a6fca4b51fcc60ec28298f2b283442550e8c9321175bf94915ed33aa88b6ed510ea235d33956881f44ad2455349108c2edf76a2d157fb744d0a55d33700b704f9686614c81173ecfa50ae582e66c3e96f2601a1e162c62ed22cee20ed88b86d968f7ac5a7b9122018a59dca715a6ba27da677454669a76929eec3b9dfb391529a05c9ae1644bba5d24f1262e9f387d2e9125d436d11d9a5ffd152df3dd0d1ac8364b7f40e75945e92b1a9ef938c019983f8d54125bb3aa88b3492cbe7239089f4e701992fbef8e2dae81587df63461bcd626d3cca3207f312f5d5a52f3697be288bb5dbf2ef5fcb68430305916fcb4b1a1bbde2b71ca7f9455b1d44597c185ba254b6fc2a65cb15cd8b2d695c6c6973739ac5471551d164327d8a371dcd19fcea02b10113025c811edd622f9ac56c86b90a03f316e68a1f44e9fc9c928fd367d91785e565df14959f3e51589ef22f3b1db3cc96ce3eec035e1d945d1735967c51c7a1a871de96715e96b1642f5cfeca5832192e5f85a170990a97b370f97c144444651a7afeb220daa536e543588476351bda99b7120ff42c909a6f318425dd586f2096eda3e40544cc59e5c66d94514f5f00d459fb3037d0e57e0129f98442a91024e92cd4927f27d5aac6f5d55eab3885735f66666666661928559f9b27cff3125f56a4d64aa796552dab55cb9ad6a65f7c516badb51af96610e21cb242915b7265b522c9a5e72e6be09b32449069257120ced7b965d58938cfd5d0b9e2d99a9d5a3659756e3af86a0d84e8675677422381ae294f63e374a63fae1fca9d2e671ad4ce1994a509976ea301e68a5e1b67b3cad9e4d26748b8f4ade4d25bc6b103d3f8a5362626738b4b6d2e95e1424626460a3131305180815119a9542928a4522f4f78797171828b0baa090ad5d28496161626b0b0ac2c616545a548452545092929284940413921e174129988a2e9082653c908a552588430048940f05bf27d9e12cfebb6e83a2e09c76d5a6c9b9685a6d1ecd2cf5a2fbd01e60db529800d3d01f8b7d961de4c3a6fd893c237674ab1e812713a9f88951efa3a86a99d4023419606666eaab1e078df77cffbb66ddbc4979aab076579230e65693f9dfb3cefdf9765d90a377a230e8b0d45da5ad1c4ca15ea45a83989bceea6a8977777cfcf7b19db058eed3372381ab15aa1501b4572facab7d3e9b462e9108551d8a7d24035d6356546c4bd4494156559967189339dbb817a88b2b473da5158266d5a5a394ef74a376d2334ed352422750ac1958be2576cea74a476d1d6cb4d8c14dab27d9a4845b3b925237de33671436d2e2f5177db2ed216eae52c63ce8bede971b9f71ed43fbe2fe3243322daa23fda595e936aa993cd0943300c5d509e3d599defde3dbb83b2d4653b89b2b4f390464eef224eb4da3fd3c824cde9fe01fa832564445914322b645cc8629aeb3b4e7fb1d8a97e61e5d94fcf8856c695155b72355663355663359611d1560da22ced1c278a28d4bf5ad1d0644444b435c922a323a4a49b692e16186d4d321baa4948411c278a28d4bf5aa1d4a05bda5c1aa32ceddd587faaab025156f5b9dab9f175b57f1c485f901175cdcab5d3f0f26ca6a5d33c7146941111717aca39f400cb533ec097e52a31dafaa1adeedaab0be86a1c8d5d8dda5c149a8bf27275517e14141494a3fcebba67634e0766e48966a77fa77327ef742abdc4e0692c33a2abc58ca8b85c97e660b1a91ccea6b27f25cfcb32ab63da01719a251b595cae4bbff330d522bdd2522c638a8568923e10ab508bad41da5f602c27c5f2d279c8148b4d01f1bd749def25967f6fb13adc4b2fd91d91b258beb39ce593a4e3244fe37657c6765d1e67e9df754affec8e9196efd4972ccb5bacce77ceee50168ba5477aa55597ebd2efa3f72ea4feb342e8bdd3bb32aab8eea732b2eb6adacfd5e6ad316d88c2281135a2489a76204a0a2ba991e95fe9a7ea85f7954ca497b94eb6c6583b3dd2354994e3441185fa572b1a9aeda54d27d1d6243be6f2f9017a5d2d486421da325d2b5d3bc3680bbc762662234d9b379c98238783be90156546595216d35c9a4f46c4494819516b62113784e3e96ae38aefe86e363443b76f435499d9a1ac974d9f384d29f5348dd21fe015798aef1f8f285144d58dce0b3a291dd535cc26b157a84c6cb157288be2bc9722773e47c5d3e928a6b84fb2fb694c7967db5c88e267455369a4390585e304c7eab2e4f3a850b2a21b6d340d4d6f233782bd1269682e0dcd4a6cdec224dd6b1a11b9fdda83029c803694d5a7744573b1957ddaa01791ee456d4784a3ac7e10776cbbee35bb5717d411e982ba97e7930211c507e50428ae7b28ae49d4bdba97e7d3bd6ef742d9bcf0d5273427684d5e842efd77744b7a06faef3eb415eb97997432a2599fafd949cf20961ed0a53d3ebda2ae39837e2271f843bd6db95e515a2dca90d1a52894ea458869a3a1e48cee89e84464f473fb2726b3aa9c9a94e245f9b9a979ed3c646a66d9b5ec3bdc37913b6ae6e68e7a6564448fd3dc51592d77c4197146474f88cc39e18e38a339a3515c283e3755c7d8f6ec3a5976ce1e9d8a4e48b7bf9d8c6e9f88a8d531af664f30caea13d1ed2b21b22dbba4dbe78e10dbe8969c513744593110f99c11ca4f7352c46e9f8fac64ecc0486ecf1ce237104c7ebc1af945a457cdb6df7d9e9e7f7e605d43d93559fdce324ca857477ad55cc3d37210d3402c573436a66ad670e7cbbc327180a759a39d5f9a38446f6e13870a9d351d0e14977d4bf033de8af9c534fafcc33418070b318d3e55d1575bb637739b57c7e24e2d6e7fbe68cc559f5bdddffea611e0f6b39a9b9f1ad707f3268739438871c8601afd1dfac6ed1f9923c8c8c418212606a60830302a22952ab524957a51f2f2e2b2858b0b2a090ad5a2454b0b4b162c2c2b58ac5cfeaa5554520c9092825200149413014e2771075134e130994a37a552388030046d40f06b7d9f57e379dd8daee36c70dc5663db3401685aa6037fd5f525cdad34e60de5af7298373d67d4f357332a7f25c3aeba464141117576379ddc5c7c54e3ea349566ad385a6862aa6063d38393db57a11f1d6d986bb53638363b3811b9e3d08d3ebb41eae52a378ef460d7d0cce26cd666ded26643892dd2d60026ab8fc5ed6ffd6c09a20d4d1533dab5822abd1277b039e2bc000524d9b571f5be518aad72a63f6b21524a6be5cae790f2a9f5c1a7563c17eec8516ba7527a93bb3f430427df9367d5abd90e44eed90ec4bff39a6c59d6d5fb6fedba199bedd9eb5ffa6576cfd2643eb2dbb80d44ee38d4e6c7ccddb6d3d8b0e99a9965e7c699cddc5ab7ec5c7dddb65a6bdf3953bbd8376bc4a9a40a4eca997489dc7e90a2265d4c2f9a1839e9bcd75a6badb5d6aad57fd65981341b892517551688f3963db4fa805010bc15c7f7ef25bd752c5d1cb3cb1d21965e0f82b56402c7d92bca69541cfb8add1537fad34dffbe97fe79610e931580484d7cc1d99c38ce6b5a956211dc05ed9cab8f0608ea9c33c21cf39c779eb9dc71ba93748d67393073b98f721dc71ccf9046b47351d7cc265d93d518f1cc510f7151af8c7a88cb89d4838b322a1ee1fbea0968ec0734563f13a5b56699a655156c26681b370372a73806a93619ac22c96a56abc82aec3292f66ce423331b2b57512bc388a670dd397403a1a33b87a4785dea9a37acb96812973fb7e76cdd7978ef9ed37d863988f0008fefda73b4ef1a185ecbd1ecc7311773d267b988b23a21debb0efc07fe7c409e10ac0bf22ccf90478ac7f6ee9d15422799caf1420f043149cfe674b648877b2a6752d60e0f39296b0839439d14b539fcede87228c40e67f999d52c136546239319d1e56bda3524eda8ac441950f6fab959500674f988b6b27345ba4c6e6335aab14b7e0c6649978f2eef6877a9909a3d427b2da22ded7ca4ec48d39e6542475976cdd254a2cb45944504bb250f1d959430c1083f2e1e5a4213262471f11336a08189eb870888517ceaa22d94a21774e122f994fed05625aab65cb9288c161d21cda4180f5156bd6de79c4184894bcb4a44e7e521daa2ae3ac4313391e6ba13c6908ea77609896fce9474e86e9fb4354f72b4157ea2be7eb9a2e1442ee4b828a6c4a8544c15c6a11e65cc90c8000000006314002030141088c462c150341eadab1f14000b92c44a76501aa8418e52c818430c0104c000000000000844c3040020ae3fd620dd612fb66963cf813bebb508f13e51c45bd44917af9683ee8a9347c0708dad824965686c12b2c51e98f889b402b358a0f2ed8ea84000fd970c8b17067433cf5c20d7090a4b3a0da716307110b65439017a91e70ecb5538fe9ad48480f6ca9c63ea18332e4cee3a26e125313aa9c35aa666280208b42bf2ed6eee5475e7c9248b4b9e4a4e677a3c49c9096c031593b5924c49ae60fc72817758ceac6b1597428a5f00437a295b5b6a8c37666e783daa0a5581acf339ddd9c00e43b263bf70a19ed8d2fefd7aa37ee902dea1f22ad121605378ad24d37a36571ded84340596c19d01cb257a87b5138644fa966aacaa1d00be1282a3866b40ddf054466428d49cd25c1c604e8afe7ea3d4dc7a55b5ca23665de655f90c4bb35989d847f95dcf77ee90867cfec4013b43b2228a078647dd71e9e160bd244992d001b7ee0c9166f6951106c3ff2216784129cfef6790515b888213bca58fdd5a724287841a562060400f375445e86b9315e2ba1f3c54828cc35fe4f7ad652f540b9ae0e1389f63aa0db382e9c41d203eb4c68b86faf5719c6274fb9ce911593064067882efb8d4d61eeccf7e38213b0bed0b4741e22540d66afd89566742e3c3305a6e4787184847e5c4950baf4fc357104e742997a561fd815350092bbdb03eb647df03972bc3f454124912754e0005c8874b508221b8947f64be4e2062b8f9d8013d84f20b8674d84d9fced69877fd9ecff8a461f8d96613ec3e5685e72873eee93b6d762aa0b735663730f11e1412dfa1aa65790de1d65d46879beff667568fa635d08db636e5f1f34e318b65f4e612689ef1d434745ec169cfe5d6abecfc10efb14adea1f68696a523ee447f20f1d22a600621512e02f170a390efa5a2c5421f67f24cd8f1c0cf651903ffcc161677f74d05fb8023772fb2b12c24da54fada613af954b0ad4243f04561784bdd1ea7151d086708634c76e1d9b08219058131fb863bc1b3b8eb8fa0cbec7e0fd3843956b9fd7864abb8e5df36da8d91f2edc20c2c269dc7a1ccde1464f66849c3209dcf0b420b4930c622cc07e1020cc1118064db27bb62e1e3cdc4e496c544e1fdd187a41104151eb9c65187c83fe11b44200bb34f8061f64299a540219225294f240703c62519ea0e855939f9eb786c870e441cc9fbac316508b00521945553bbefc1addeed88fa5097a25e803350c0844304cfee45aaac5a3e425d790e524f422491f3019d39132632ff6882373f31295c01129b81c314452a6ce2fb51684a16fc20c7edc93f05cb338dff6568497d9d3a7400b3aedd18f292ba803e9315d5364433be86869953b296c0541070ba35afc89aeac2e618cb5535d28ee726fe0f070901ea3a760063901cbb82235fc6048a6f9e3de816c4adaa96a057aad5a4bd73402c3ed2e00ad45a028283df9aba95f674deb9e414daa75c935f46bdf7f77a5300fc8c3b68c3eb83045e8eb2b4e075074ccabb56c16d15eca7595dd757e8fa442ed75960cb03554eb8d48ca27c9f135fb7c67d1559fb6b5fcfdcc59b369fbd8482e05a8dd6ef44ce9270b32ede37f006af249bc493e435286f9598c11df0709934c67baaea68cb3018a9c98ca536258beba2a6747f1134705a1ad925c8073ce792af6c72888ad9e27ef6a46742780889a595aaedd824311e8741f5022b8bfa3bf2c8cb951c698e1a264ae3937e5163ad06f9b88c65865897e954bffe3fcc798aa58f7a2998678d083f99c06391e18ff3000afd7e966c296c8c43f0bd313b26913f625e6fc783a16ddc692fb758f9dcbe5d1178003b088c7c5e1af8582869e0041893649d0bbc1e15d1b7d9a5cefff4b9c7e3123613179f47b0fabb5376c02d133f2996b95a5d5c0e80a2d3a8078cfa8a4377f84942dd9f0ac0fe93eba97b18c4c6abfca769002c5bc676d9268b0736fc5b408856ee79f4d236cabdce1d9348031e2ebfb152afadd7186193ae02990621e932c4e720c7b8e08dc1e016847606601f0a142b6d12a608eb7a110111cff263ca9a51c6b963799dc81e1354968fc9ebb4b113df93c33fe1c6b1ec449710f804d0f8b3cc3e89bbfd899809dd01f884ee79b038d3581a193bf1f0f5e3014ce8c047b113d4d8cea7cf54a3c5f5fb1a2ee209968267deb67fcecfe01fdbd6381c2128b89c4773de7c704d1f6ff8530261d11a17f79dc4dac3638eccf76dd03268af212ee3336881463917104ddcd652372ac5cb5674e677c911379151af19b09726a289594fc854c5a88ec76ebd8e0e08419b8c22d17277ca024c2e7446e9eaae103bb2da78624aea6c4058a894dc55f0ffc8af4c7077fc170125ef2a9b05ed9689c395d4f43b6a122fc8edbe2f5985e87148101290232fb4a617c275af0cbaf695d50fca837144a1c0eacfd4adde3d27c1d81f86644845c7ce1e2d436b7e30dc062aeafebd0b9fcc6fbcf51204ee4c1b089699bbdab257a30e03a16e393d35bea02d74d6939e6b4c056d730308f677e32b03aa235c2483add25301c463dc200528d5aa057cfba80e3872267c03050b53e7aef3b1c9f706f5b0969ced7c99fed134df5f44eb86f5132064e3a6d94e1f083a3637acdd247248c5e1b0c1670571d4a1cf9e8561ca5d1da273097f7586d11e9c3b3a473633a33ccd37f50b30467ff8de6088dbf85a73307ce827537998f36b87682cc37e9de1d483e696e6f0cdcc08a7e27ff177aba6ff025770c27798b5cab755895fa005b538ebc66e55bfb0550b6f020d5df1d0215dd47e7813c40b09127009a62212078810bbdfde1611c4b870fde4d4b87ec8b55b0ca12f3ae15a253e0577665428dcb45c300cec58b9e89ab03b744dab654fe8b0deaf26787cb361a687201b0912b18b2427a051ca5897044051a4210b7f03b4459b0fd680b13e5ce605fceb5cc4a25ebb504639e04501a9d303f84b4d151ca00d53fd15f0382870f9a5e1802325d9e06606ff22f93ccfba340006cd6a224564f74a76cbbd3ce383548ca281bf9355ef113807e88d6138a8d7403234e2447b936c504c3ef0723d0f0c86f75d2f3eb32e79f430aa523a6f6917b88ba1b5fb8425d9dd00b319122b3adb1ecbdbe945c07c5b706835d90819fe9451f5f44e25387a618f1cfd28e6cb20c078ab7be359e231f1c3d9a33223867d58825e2429cb5822b1157fc6ec9f6f98f4668bc827b82cda25278c87ff7fd0c4be3cdcf381a7fd5ab6242fc7970f7855478793f68096e8c654a5bf452e2cfc425415c6af8f5183a716bc1ba026fc67b5e8744eea2c8481f4e1c7ef7ac74ecffdc54534ebc5797ea7222d394d8455ef689e5f6bb2f069c6b0760356f39bfbb3d945281a6f6b93b8fdb72a1ffe6018bb7fa489b830db45a6df1975003d14a890cf0fed7ee0ed5d4a428d64f5d938f96aadadafa3b6e0660df7f869e9d2be9368ad7a913285d158eac7ec457acc25e31ba6c321010c873d86d76d649b3755c9d19d0c45c56af116b8d72a0d2b18429c3c1a7de8eda291f223852c085e51f0a8684cd1633c85a280cafc4d547b696b735ff67706c9f46f6e727d6c7f0694e0e38dfd57f2387f6c7d22e9938741d873c73f2bfa03b4c2882d3ca3c8ba1b16fe57898cd2026bb09e33c02487e48fe435e9d9bd2658af6193d44481e45d1a859c00d1bc43037ac5934f9d92c90a58e5300e4e2e9fa06fb036efcc75f607801c88b62bb2161bd35be2da8a723360b1b1ff37e2f3212e55a5819f9058a4afdf14770a19bbe2c9c66c945af73b84d6c69d7e56aea3430718e75cc84dccaf3bfadb56e4caab4300cba4d0a01b38ba3b4cbe06f1dc3ffb813c3f16833ad5dde4bc8e8c3d5b2c68e7df517b18e1f8ee5f6ea03e2f591b8236d1a15d74befbd932452638002a01cc6c904e4f18a6708148bc68747516510831ad60b58ed90a166bcc13dcc313159ca1b89ee68104f4dc36fec49b5bf8d151f08bd093e5477dc23a1a84ee242e955d27af17377c982ee51ec3891ae92589e0232d77265d440f9ce25f660913824076089754ee599253dadb99ac68cd16a4d4c8ca1640d661d36386b655cb83d4114cc34c1d355f1498c5a81ba0c17cbf3435eed27beb3876137144a819a434b17377cae4d61a9946dc7aa4c8c5f69424b7fa3b4178e59acf7d0ebedda2b2382934ff2bf04d25f8836961b991498e40c923ba934e90846e34274973110f5dcea8999ce5db02828d880d517566e27765910506ba9039822e20ce4c0e3bead55dcef8a45c739b2989ecbcc60841813378ff310264292c8ca19905b3eba167bd7fd12048e7b560a979874c0c23876e1f11f7c8c80b66e63a8e7750c25dd31f7f95c13f47eaf63392a40600f7e4b83e6373ba3d49ac7f0d15f13415f01e4b09362c428805fe24f7857e5c5f4cd9a1b632b3e6a777c92d233dbce69df0c04c34d319df5c89e9c8d6959345cbba509f98a2c503a7190a0f514b4dfb15408ece193936f0081e31234f62ce08f32ae2b1ae0a401d0b4307f3c8f91366076496da8c9b5f037c34a1edad2d12134b26e812e06fd986ea0bd52f557151c5bd8afbec6b2948513f37e147c2d6876356c5b63b94fc203cf3ae5321ac1dd69ab4522378fd752ece732ed237940e4fa249e3a4422ea982678a8e1727e54e15af84de6bbc33bf8b15f0277d1795f47c178710e1cc311863440289dc11f6c636497bb91f66efa20ec888bdd8bc8be18e3a8ad25e4fe3b7deb99579bd8a07515a2d73d37ec7d29aa5946795d93049c46112380b554bfe8c6710d904929d1cdb6790e6aa3dfc90363a85eadb53f04709fad1db71cfae3f00378d3d10c9def2822f088c1a288e0e5b6d38085ef9d7f9e12f3bad777d371516a887126b0c077ba858d086ed1e8e74ed4c21cf1dee45e8f208ace4dff16c3ac12ab6bfdc3f8c6b720161590a372ce16bf8851243c02f89ab20e855d69960c69cc1409967cdc0d732d95087ac0e7a3058e630ebe9e4ca664ae967321316610660119dae958c58e4881302784c458f299013fa046493421782c91076f281a913081108318cd90e185cb50aa6c2c705cb3c0030c78660183ebbf74914261a36c44b20a95e5f735479d5d8a57d7b56471ce06ed8ed45a69461792eeb17c92295ef60176b6f02206d04b9ba5860aa7e023233710833e7c5be7f2a0c02b166a4e38aa9a7c8f54554258921852ed70d5dd8f73c482adcc59d42c1e2cb40ba734726af2c200715726a9f0499c912250c3d55121d29456e7feca00f14bf2b8d43d9693e7d61e496ab9c8a8490c9d7f1c81016c946a29831ee057512fbb0b4f8bd80dfc540fa0f2448c1d812b618d9533fb2d8811fd086a359ba0f3fc8f8bf528f8889467922ac34fbb0bfa04158bb7473de95b727433eb4494f71fead063718bdaf51809953ab28acd9bf36f21e4955ef244b498480ec658133cb9c9141a4fac852d424611ca2e44d9c57257734d9d532058b35122bfe500fb56a2a73613703ecea75f662195af303ed36605107efddf864b87156e053fc4f874038cbad0ec2f959790b60d0e00266723026131ca78f6344b560a695249975d47c560c0f61c0abd87b091bbecad185d950346c2b5ea35c19bbc2fb96dbaa6c8f62ed0ea87116899f067a348cc14fe7a1e6d8090ddbaca5525ab348df138a749bd3bc65c4bcc38a4c19456e7c55169f38a23ea6f9b25046a1756e830ae9f3cf1365b9b06e18e050b194a196f0a4b9b6e07316201bd2da9765cf7c7d85533f03a82bf55768527852fe4f94376dcd19867fdc5f2a5b033050aa1efe6949e48146066600049714cdcad7cd335a062fb66989d9b4a2444334562f24381fbf4d862b392853e37a9bc13026e4a04098c71a4bed87454ba939a4631353925b4a5f45c6f7dd04df453609506d18bc135496dd80eb113bf08bb87a133b908f58feaae5bdfdf3c6fce20e3188d96c7c71c4480c89dccbe1c061dfbfa176382b69fe34335be04ca54de661ac8a1fca2f401604acd8144cea6de601c45753cc4f56dd6288f84afe37aa1b47fc4cb6a541983483f2bc25ee606e79c2bd92cc5a95a7abe2933c38d23cb143ccb5d889a0dd7e0f1ec4a30aca31d2804d39e4fb4752d7b531af46b33164f294a0a672924fba4e9e755383e7889930b96c11ee491da5712457553bedbe119083db9ed2c5a07f6f9a985f55ec65efbbaa6847f480aa3ad2aafec65c9e1fd03fc39381609622ba3e83902fd188c94a525e8d94a2bc4482f9766d45e87430c7f09e604a239649ea2a5e2ed370cf6bd2212cb0f8689eec04f82f01ada0fefb16cbcc1a29e3163bf1490ab082831d7956a070de03ec733b68131a42cb8ba8a14e601facb070332cea4c89ca9e1dbf42329a0c3af744889ec4f4ec942291953d20c2fb83607d570dfb41aba18fc51df894383b62e38a8aff0240d44075b50d0542b0a7e801732ac2b9e5ddea6139205898f4abeee62d9c6c054f742bf1a7e5ae0d8be2dd1be2d8c0ccc838f1ca484633d98de7b1ca6a025a3665206d195b169e5c46b719bf65fcf35216f7ddb78a826f493242948ce9b6a7eb96599adbe9d30210fae93f533990b17b87e92c435f8da3f483e77cde37d21e49cc197f0d878f3431e3612938945c744939805ee6c4184357fcf720241568ca108e03be2a1e279b376782229edd6b18d651f6c8e8e0ff248d67323ce2e071d7d5472cd3be6788cc81038e271299c6b28a3b59a49ed201876249463367fac230bff27f7d5b6e234aee8049b7b6fc0e898249f46ae7e2bac77336f3d8e3fb63ddc4657a751e799bd35b21eac31564b1efb91867e3c4dca1d2dfc8f430d81632b7e73895dc1c438b013a46de93eeb5d939a6a9602150741c73cd2e0928b837e313a074463b470096171ddbf68c916138d4e54b05d17b03d218c479c04109824d06b5a578648814b690fa683420d21db9d33ac9d63b9f7cef6dc83ee35fd6bf3cd7fac400cd15a3d28731ea2a5a06335ac471b45c3e7e553c5929f4d4e0b852437f0dc18421df5a11ae6e57f829f1b8197175ddbfac1e1d77e1903fc22276a57ae08da0842a1b99a490f9d658df6dd9428711aca2d6074f7dc35125d088b0e1be4e15c905058fb4ed61e3d1cbf8cb90a20fa9c99033b9411cc3ea3db2bce80d0763a4ac3b12b9bd411fe70af6c0fff9e9841a61b490ef383f37dce1a3fd4a14340fc47d75d905c33e16ba21c9b6847ed3072c42a4377153c124954588d545055f884a7fbbbf4122ff0da4625e727a388e3224816b63b17558a008f91cf54b7cef5734da61d80ecf580812d93fb25099f4572230a7e4c107296ea0ff784903475c1e60d217bd45fded0310233151ef13a0b4204d7c28b410018866859fc5d486afd72176e1258882bf547a649ada5373cf9714737e540476a2d8391f5a2449616e75cd2ba0b6420940524be37c171727b53354b62454485a6b7daa24e0d0b33c4015d8b08c88b509f76f335355d0f268e3bc1cc418e27aaa00579ceea5aa551188ba8eaf148aec16acbd692f66a74e51c3add3871580485a12d49fc5c580dde540c85e71e3e23e50628b874d39c21dc0627b6a9b063a2a3a6eaed93b8d7c4ff1c3918155625de96d8496db91597a82710b7a7288c1402c9a49113b901a11717ac083b9ffdc0db644fcde1b769eca712522aa94e2204791658578bf308971c5a727c831d806de8186356121fb5340092d38125c9fff1e0e347caa2a73aef2e986bf0bb4a1fdd8a0bd9c9e766559a0f96e52262650dfbadc746ce43ad270c4e33c085dc2363fa87bf50a96f403f653ed634684a318d545c1d9f008a70f81e539a9cc5769c27cd935e00794acc504bef456205a64831ca1b9aa35f50dad29f9374a541b85a0af64d1d0ba99252aa70256d259d203eacde2098fc804c00e9e8f1130866e75a06d6ed7b33a38b9fffb595a326ecbfcde1407ebbc2924d34f67d580d92004c23f934a3948dc93a3b9f36521bb5cb1e49751379476c8c83e162260a5aae5485a2826106f929979c048ab288999aa8ce5cd1426adff1998e55dcf14405084255ef738ae2c735090c8ece40c6ce37d54a98e0ce2521a02d95af7232611d70e85c1ca5150f34ecb382aaf2f2b240c95788e84afa721a323509cdbae96c98cfd9c1b04901e0f2af9726ab9203c3588c9c993682c40144e56546d4e18995f6e8d1b3466aa84b5f252552b9b11ba4d7b0478308bdd78891d71fab751bf5c87fec6f4f8e2f6d86034acb2371ad23dc5eecbf79480fdcf6ea83602828c99990ae514a53a8bb81490ef7888ed6fc80350c0a09286e7f0c0019589f0b06525e67e0c19331cea6e8a436c490e767d7e17fcee340214e7c074c35f5efa6b87f3f7a0655b79d6056589d2c63dc24e56210ed4cc924bf10e60374251a97188b2fa17dc07f146742c88b241a527aec26e7e2d9ac1e724ee9f062be1f09a404430b5b6238ed5754a0b81bf21b70249adab0a10e02f2f4358f624b45a8952c2a274dcc3de7ab1105f3fc4ceb3b2a3e106e4366f1158fd61743eb505a0218788a6d03aa82100a92bf90d0a4de0e10af47fc38d2f556c3ac4ab590c7a81a9e4002405f5c49304e87c6f3ba6b23f31ff2b1e32f353e76633b773ddb1e0aca8457a1f9f469f757c9fd18a5e3d44f43654d959d4d558a246a20d50f489a9db762fc65499dd90b726a1d6476f8e574ae22a633c3548964038f3f601ee63ee823a008506c40563265e25702603ce5411fa1f6efcbb5939e53635ede61edf0dbacb8864a81208e4bb113b05601e85a879cd13c2c46d760ef651e209cb255cb49c5c7d723ed7295c4a068ef3b15ad7f9ce428bba2c1cabfc331904db2dfd5830365208593a90ac581c853dd31fa2f3a2cb5270c2ade004ffe51f604cbdc926665448f35cb0b51ab320c51d62ed7c08817254f3d20910b080831ead4b2c8cff3e096c25513a1da0291a9cdf42e298153a112ed8e6bd5889e9fb73752e90ad33147961b9f53060a514e333d23becd27d0bfdd20bca07116f619ebb03807ad49b1406c29dc6d5ac603bdd257a4a1eccb28886fdbbb41485df76262c331af2f86fcf324e5091cfb165e85424d26a9b2585b1582e05a209b7bbb940eae8f952b4444ffdea31335cb931b5c4ccc4d9f905b38b6c9aaf9efae50a2add3d6a7081ad132d9afa025ad971f055b1baf832ab9b5972c647de7fb02335def420522e2bb00e8e10edfa08df6b5eee3f3e79d7db1273c9a3ca6b0da09c24fe5e0c51f790c46e926cdfcb5839928cd5562c546d62eb5fcc9191e246ab5d49269c8be4492c513f33aa0c14c72356de6010af8db4b883ded8f72f817cd9dff92c28ef92a86000f2069c37f12bbd157c10c008a9afb37b1b36fe29aa16cb473db2a90b67013fa4351dbd2f1f4c0689173e304bbe468b0bf1ea7f3f57ed10c2aa670f2392d31bc1adb773f95a375428d5ade5388bbdc9ccefb952acfc457fbb8fa1e30a4bbc33125d12c52add5e469ddc04b2f97329ffd63b61147de939e9d290209771dbf7d11fbf04147049def364d5a9e420da4d36eca5a47044f6094d28aa4aff791a9cde31ec32e55d7f8dfb6104a4f15521a4032f742a68c5d19baec06ce174d744b6fa3b97593710290376f85acc54f0218d66a4f7b866480cf2e172e5ab747dc7bda8925579a11945f8069c8cea4a99e5087670758594e706137c2215a90ff1c088b9af1aa6d1e899732edfe5e1e83363ee89f4024672a0adf48c7dbd5161233965ab9e26586dca95c9378d44f20bfcb08b91791e7d0a06b132f38020a99d3343053c22bd60bc386581c9f9d3e655586305ddd3e87dd6fbd8e0ff03ac774d41b8948b71defa8c958df53b8153113a4906d5827ed1ac4623778c4c48cc4bc51253fca7ccc374673a305389c88724fec126480c07373f2e82f1c01a4c4ee8b98c60c7f4bfc2d394c4e3928c249ad3532018423a43820c131b4b2a2889c31141ef910bf275da25b4d3fd1880179791e2f256ee02efbb7c81961d281349de7ce57146a8e4eb94705f7a9287fa132dca3e91c78d141e226b8d12828d7e784922775122944e555ed3e527b79a87faa8c81282111b9f66782f81fbf185fb4389d03a7038c751613f38c493edfb5799572de541f10a4eaa1d9b1930558533e04bd7843c563885aa053ffe7d822b382dd46bb6e60b357d23fa9dd6c1549fa72828f9e1daa7e3990031b1eeaf18da07d22dc5309a3ce98921531785c4713c65cd33f71fceb8a301125c1849e053d9bc06c235e1ef454d08388166187cacfa45ccb4753a9acb94df3d6a06c0570b34d933295f6998265e0c20109baf7ef73e8b94a8fcc7e30e2c62d92e4fa2e68934f773f6f8b8bec644f33f2ba4965c02617fe0ed574cb589471c76c29b04fc09ee175ba801ccbdbdae0cc8062bb7eb7d2cafe8893a1531c5fbfc8bfe204a17fa64893e48408228ef4a5c1293e18e65f9b92ec069b02bb96cdb7a3f28fdd243d16c4ca276a201ecb227adf30bee81641b8fb49c90540605d9b81f6d083a23629cd61b89a91d571a3f13ccd406e13a156b5f4de75ae6371e0ca9aa488c34b866767a5186210afc06e1ebfb261050e124c1d8b5de5cff2b68aa443c596a9e5bb7d51c5eb088bb7c0ddecd918d5c086083c3e7b1ece3a0616fe0383bc178a359412f10028fc19ca63388883709cbfe70ad834dfaffbae01ed06f01e14f5b1f91ffc76e3283b2d2cf0ce39aedd2a8434ff832098c327eb01ae9a9abbf34b6131870983df568b34ce958466b49f78bd22843d8b26052f144a5dfe71fed0e00fdb9185b8797e6e427625bde1b0fe62247089ab24bb207dc80926f579f69c4999f9f26d4b240bc6210fb154f6ea945600a601e40a6590184f0688db441c3ce3a218d6157667e902103f0e97b3fb3929f54142fe0a03922fe69edf63218b92168a2797adceb47d30329df2d338b9f9c463594a7a6d3b27fa3b289ae20bb6c63da23e235be7598a6fa8b49c700c621680fe21bc3bb90d0fe9bb4b6118f0aa2a5feb79587f4712c6ec1a484dbcb3444727fa8a62599bc157b281086cb6606e8ec58d394c21f2eaa74d43ccf1acbfbe548b8079dc8adadd5f9d3b301f90387dd72458820c42411282793aacf642dffcb510933a88180426dcc2b6821011cb11f131400c211abd607deccfdd5ccb3a82671549d5bf8a801f3d9e01625e67f66403e33b619434eacceef932e48214ece0c0b17c745fafb3561d3963700ce2307388ad7ff059676ac06a30ffad837e92c940e02a60120295125ddbb9beac39fb4d9c65f0edb540629a49ed896cf85cb6be9dff9426213256d655392fdd2b184ec7b7025049907ec20614a9ff686cb750ae4a5a9e729d0bf2380238bb8d85eedf308e3a7c27e7a8bb5a68b16053cf8ba475a6ac0fee6df509b35ec3278d97b8555eac7f5c924015298c0bce4777903e606d19d01ff1b1cbf7978bb4edb62ee92aac26023440f0c3886874e75bf987ea6d6c1e14b5aa0549b98f9a5e6adeb3aebec2fe97d8e00e2fd4ae180182e5eaf530265c6f4efd08bbbf159e6b366a12222332a576dc53dc8dc8a0b6121e16d3dadef9a509d0912aefec675d27901de159e55032238b3e8db2169ecd97ac5176a480be3ef86588432a93c20ba2fe84ac8163921cb7c4b132ccdb9dc37c0ff40548026e85cf490cf8458a0866a4fdb8892a55e9b682dbd1efb9d7da6cb912fcb43952195ab64ca4a941e2b306ce167ed1858b7a3c786ccadf96805e204aeb26b99807307cb96987dba7cf9c87ed0f14875afb6f1de8b5007806e8db4a97c5d398d2fe1aa3ede862e6f2d01836e4a15368fd5a7bbf3f6814e9db50b97067ab3d9a0b3c8fc00156ee9e538ae030b7571166d10e3a0939cc4b9d6ad3ec7f23c5f58c2e4730a9edb4b60c9a4e60d16f488d96b570c6b4d7b3b2d7d6820422fa7cb0e19413745d04061044269961b29ca90f4306018386c817893f0df1a06caeed19cbb3d25c7c38aa0141c407f8ac3458b559fb034dc6fdd4ba34410513474d1dcf95c49571e5e7e586c06bc75b677fb5a9e152bda205751e4fc40c70e0c575021975cb1a5f13de27339796ceb4538476ca468a6cd3bc2de0d5cf1b8c2c9bf7e781a94fd6ea6610a58d30d79a16f2f6bf668233d342fb205092b9b1156d1fb273f2e93144e4c14270fd22ce472fe3feb86e9c5cac193ba44219ecfe021e98cebb44ee0245b3d8e6b1e4695a400c64aeea9758d0f344573b9e0cdd183e92aa71520abfb819ba6ab5c0b57442f5a25e8d8b6c94f46a3bb398dbafaa51ab44d01c13283435d66d55faad44b4c7aeb310ac5652bc433f926513e37f63182d81941cbd97d82c2ea100310b3ad96aefc21df83699ceb9626daca711793df5533bfe5696d2b314d0b2d9c2414ce2657253c9fbf2e8309ffa0ba052eeaf4ad3b5fcd373c36fc3f80ab763bcf31008f48c0c6affdf22ffa502773d19a7648546861cc74607e5356841725c82ab67572e45364ddd0658796c3daca0b315f60ef7ec0da218a92c8a4884d166407f54dfff30119ae18b6fc433e0dc1842456f115ab11bb26735610dddee6085e53fef99ad45242a3bea6acd10aa25f041730b0eac1a83426e837e2e5085ca0ffa03d1715f5f6b4f37bc3e223bf1715d60971e964933b55997d39302e6dac12394012f586dd0df4ac46ad7243ff1c1a433aeb5c88fe448c2f65906698fe0e48afa67b7bc2502612525c4dbb2671ec0b06f908415acc55d05e4359dc1788d225808610bbc3728eb6a412abd94802e239d8208628f5a00010e25e8187ed48d960c89ece68af0528f518588a12a0d0239161db2f5502e3aa40aa2d57848a0db94c91ee5573a5e94f5a1368350c7bbf0b12fd8af59e124a4957b21ab2e9389622dad09e3bc08e43d7b0436085d036dc05bb614563993985bc7664725490586b6963c5088c3ba3e13572198e0854045b3c60f8bf122ede85d465fa0572a7dbe6f4229a73a746c1eecb294e011455b4cf93a4cf41cbb741961660eaa897597aa16f945ebfff24314f33dcdc2b6b2cb18cf5562037b0ccf2b521fcc9f661b01cbc72f31fd5933a5619fc3ff04e49fcc325ab722492990d68644ea9388bd138c0e4685151b3524af3b1c26904a5ae991c83e4a40c1294af2601219777163b38837e489b0e72d1214bd661b7ed4894a5dc7d223ee30f2ebca6f83e340c5516528aea5ba43e137df145d078dc048c95bcd6499b72e8323293ff91bbf87f70a00730b174205c9695b1862b9b0c37fef8898907fcd545cf1cd4852c91c5ccc29576b463cc9baf9c313f2dc6aa772e7ecaa4d3937c05544e7e0cd385091cc9f0d44da438b1931c507f5c77f323a1063c4aba26021c64cdf98aaf14d6994ed52925907d3fd69a0858b9f3ededfc1d9021baca03989e0bb2ed2785102ca499899f6a9a632a69fdf628a0c8510665329920d33131dad9d1ccfc5443f71d64fc9f2ed29b6e9dd7314872f79a30ca4105f99880d86ba8383c65f9b6b3fc7e00a4d9693506e7f6d94c0a5bdfdb7fd50fe2d2708dac38e25686d4cfa2898c80e1e9f4b8607cd5263b0d0cbac61c5d88a0f34369fda5bee3b78b04eeae178ca51a7f5d5883b23d2725e36d4881c0181287c4820d01cdb9f95c86919559dcd35ef8f90e8e4f33e6136845138c3a3f84f7b766b9e2af07ae879eb93ff743e4b6b386bd91969fc25ea30d31998648af99c0b274ece316589267f19917112242d31d14b33b4b8ec4e9122d327388fd54a34d0c99e550ac2b7b65fa7ff11643f4c1b535fa606af6c285e6b0ba1ab5cddacf944e291a7fa7dcf77d7b2fdf52e3f558d9e11ae8cb5bf889e33a09a3f48605faa8c630bbc258f821958f3563f901c5f1170042546f71af9d2ccbe2cff36c0f28066a99f1667037aa430c593c1236cb538904ee0434b04275247956111d485801d75098c841c744824639d56b221735755374b81970844e036efe0d11d4c2fee2099da26c04b363b086f9fa31d9fcb5520b60ecb76a303319c8a629c85108284124566f4fda2f41aeaa4b24569e1bcb8200dc07084431a247897dd289800a56bff364f271bd6062503cd0aa4be5dec2b35e74a01e20c192e01b46fd98085330511360623beeaf18397aa08b6e458694193887064360c03be8f5440f7f80182a5d6c430c9297c2b1ad6bf47e71240f4f7722926382611643991874934d3ea8d8b77dbf60134970e979c5435af8027bf34c4c85556df23175faafd3e004243d468a265eff6e1b8a46a4a1b3fa0d01621bac74da0e8888898ae79adba0e8a00476bce22ad2e688359176664fe3462934450d3853afdce38874db7a6fcdb240f0369dfcea76231e8cd879ed5cc8990f56196d6217602f886edae3d31e7d73d06a8e90e79021f19220935cfe4b56252464a1309bc9218267d8224f9d56f1993cf9b0bf3ed0848df91366df685728cca31264bf85545494ba8235f3e0c7d941a59c68b39e471230c5963494067381123e527f729188316e3a92fbde3423ae1d9fcd1ff82910ee5c5902e8c87aa52841cf44448c5e9686a16971778026d1e7aa0a98dcc8f801bc3dc194da250083581973fbefb459b0cd5b9726febd3128d42982cd36208c2b2720130e192ad6012dd89e669a61ab8815d044ff5970268434d31539af3d7cabe3efc4f406c93570e620dfb90308508203447d8a8f96eb369b48a180399922ffc94b59ec777815c42919a5731a640c6697e0704359652e033720830f8a240d3ad801bb60c235f99c31f904819ad0e4c19c921bbe804a6c9a272fec13f3ed8a51a601a9bc5bb67acfc9f9a8ee6caab33a2d4a3801662f799edd782cfd24f2851c5aec4d3faf3ee462f2b8874bd89d04d8e51bb053ca5ad84d34af8e79c0e086f921790687de45c7e452deac94349396620e599881b4ecc92c2c05bf08a0c56a30a34afb89efa1b5baa37c3bd35885565371cdc557c4b64095e60f83801dc8ad5d492fbca4ab5e0c3b36065779f844bbf84988abb3e720fe73f42ce620b472d4eb18a89790085934f3b3252e2f0a4fc5f5d578b9dff40c6abb9af0ce3d9214c6b1384acdcf983386bade1dce252ec913ae143dd557b352aed0a4457e3db4fe6d34296efb3b062805ab640a8770a1248646601fad75094caa59841401911ba180c13246f3c4b27234552e409d8499145b9f78684f4e184d3ca777df631b9113e6f77f84413e535a6fe6f4b87f021238961bec077cfcb364c52d417b60acf106a9a1332ef1e0f00091c2229d4172194eca6aaab103d97c510a3b23bce00449c0bc29f7c495a7926f1dcb149787cd93226570e7b5518689f8224851b6e15743047bcb3c41b0d4dbc790b8729fd8c63ba8a2f65e537f4e452e47e63b15ba95f53828eae6fd550039863485d3cd48b69f1f18ef21e718b4e7ab97c88df60f70c3fdf6aa491215a938dc9018f0608251ee20504beae515ce1764edc9db1f25c11f7f039d26a7f427805182fc6501cfd1447a80604be5ce42a34d0dd5961b9adc9df03cbfecc7ddd034798d4efbe98d89b91bd53990e95a6f39ad5191e29612f6f171ace2a74233cae892a0b191bc1c0c8fca5f82c34df557ae8ff1adfc25ce13ae59aab7caf3ab600285e08884f3a37be2514e01e88250653c09dcf506072e017511cc575f9dbb09f30eae5a9423c2104a9448c646248960b7aadb1b20f53261148a66f98eec1119df42986b9785c7f6d668cc74764e5db6059de6ae2c59a1759969300558fab37013f6a3d0f12294c6300038a11a5038a87ea0fe1a0dc3212566b102229a19e0eea38a74b87e5b1945bd45a64297611c43421e28680aa678605098659ac9968185f78436ac88780e0e1e27266251f976abd4f531c30352fd6ecf4212861cf3c7ca26098f440aae4462710ae710e48387f4e6e979cfb4e8213af9ae22763a266ae214e6fbcb4e642f37ae5fec67cccfcd43c620b590ed8e27a958943f3c671c78ef2b2ad29d31d47c89d74616caae9f696ccaa7b1e9cb5db427d4a265c6a305f485f0d5459202364e7cc2c7eab48dfa2cde7f3b0e7aa0d15fca0fd514b46c0abb9b020f38a5dc5f95ca91dacb50d9678d1b9625ea1ff1fa32459fe0af5881baaeb55b3b442f45e72dfaa3726f4cffe41530b381962f8538902e258e1dac354acc12a4ddc6bc1feba70fdbe02595f998ec90813ecd9a9016dcf6582cbb4eb5b1d0787776874c940027c3148c7b52195a3a6cfde1145575706d2a5600b8e9dd615626cf3a06fefdc47a4d04285ff954db99e5572e20dc47bf86ef9f712e908f051ecb8d192260d15d45d49efe49044aa15d1b8155d8a3f584527e6ea7d32bc84c7d5b0a7169853fe665dfd153055eefac5f67a5ede4a0d00632d83db2bcb9726546fac7cc8027e229ed5b93e0ee69b76e5405cadee56115c07dc15c1263e83aa31d61f148f41d17770e61a9845fffffd80a6069b722800819d48ef4818eff8f749c1ce9036c36edaf5a48115f686a3ae63653003b3afdf5ac0de4962920ba2f3ef9078c7017572fdc0d72062b51fe3001414762f8c7852fc561382e02e6a20fc72dd1c956fcadd594252882da1cbe8f3f61704e9dffc2fd04b83dff885a47268517aeaf4e7bb2a151330a85a835c2b313b988377546ce8a4fe7fdeb85efcaac8b1d445dfdadf89cae74d81b5dfec1acb5c6abbb1ae3934038cf0cb252cf7300e6a46d1d037662e5e763e4a1f920a1a1b128fb0ce5495068c8465ae608e91f5f8b433af6c6e3b96872e67834393c4f60ab0ef1d7a7c70f32a63dc12d1d036f48dfda1b2e35ac4a66e9dd905c3f828ccdb25e08c9d247cc58c750be8b3f836cda943de1597a7327ed55807c73b2f49ddf71e7b4b0274b2f0eb8ff45fc785857727ab495127e181f6e00daca698c1df06e4a5ca3ff5b1318f30146f2e5f3c515c1ca47c53eef9ae5ac0bfe141d7e8a6ce79a98a242ae07bd21a204bcb10cfcdf58f2f09b412ce9d9552382cdf41e8810525486b0c28c555cb432f88655b2c0363d411c01a51587d69c201d30c6d5c10a41cd40dc2f50981541c1e82998cbf1c67ec794b99d3cd6f561e020351b98351d298ac66dd094224c482f304a347309bf48cd37cb6f45050e06c2f500a1287729380720c25eaa892c2160b743b3468269060b5233dfa70ce60f9d68eb6f2b58d6e778009298daed2e8ebc98eb10944ea3787aba4431a06c446d177a28ceca3542bc31cb20d68ad41d8e66518a029a8005171ce2c52d7cbb5d95253957229147bb0a9d1efbcb4f4333cf4a3f539bd6b784a69e6b6aedbd12a1c0bdad5bc784d4113e941fac79346421e56fd43aa0e8dcdc981df8b2e2fdaf884a5cd5dcde94312e0d50d7323a84abf6d66e70270df7c851db003c75e50fe8e48c628c121c3975b1c6c99204c3d1bee98d0f89071aa62100eef21864b0e17469c0a646d86b00f0ec5ad90283c490fe89264e404b41c84466ed0ac203a41083054d0382d23ad2101eb1b40819838f7c1b5da17372f53c8d551158bdd0053d683558e8fe4adebde5ecd9360afd1d5aa09583230857b5d5348e76d43434831efe9adc0bba0557e690784f20116cff192cb6bc178fb4ae1e2ea0b023a1d309ca3975e418ec390c9b669a40a3130d4754df66c3d412034269c1ab4eafe5a322b97c6950025a9707daf305f87c9b2f894a189ac974fef123fd31ddef3c02786b10bfc3b232796233fcd72b6c7ff77b96b25cff4c84e448c322835d245fd09d3f7b06e9f400c1db5c2252b251bd605aabf5b67e67504f03853e40daf3cdb118ca0f061f45e9a1ccc4be0cd232d928456875804ce8af9f0b330eaadce6773c95b170d02547a08618cf5722deab616d4d7569f7bb822fcbd304382bcb619b7e720d9afbc43cf5646464d5167472991884140f266486c560126c73ccaf7c1f4081930192f85ab995505373cfac55d143689f4e608c40043601042fd814ce0315dd31b084824b528d95b7450e34b2b07d20ba2147d512d67008cee82ca9df0b0d131d05f05bd78d46c08858989d79e9d66f9a9a13eed56641033a3691cfc5fd017739d3d4daae04cfc6e769105db011d9a6a36ec39b14abdecdd278b4921fd8a65c8cf4976cc7ab5e687bf6f1216a753e18ebf4d41b20da5fb121986cdb534a259a3825e5a81c93917dabca3d70be23d06314e5d4629293ea45c5b7cc9cd4e719bf722383ad295ae93eab2406caddda902681802a01054a86a809179db45b4706a8b85bf20f3b14b37c2b6377ce0e998783aa46012cd42a5c206b56a2e78694ba06491ac97d7bebb177de3f5afccabfdbf629cd3375788a6513c905acac9fb282f9f9849d33235569e93ce280137c412b9ceccce14878bc9a9afbe1ae96734853907d88036da844542c6e2c78dfce316056645dddbc3905190b97247928eab26dbeead9cc1064ee35840d06fb753fd85252c5cff2aa73b6a2ce1c4f671bc90487a8d4021ee5af2b9abc9277c1a3f42327a2ef79fcd68bfb8b5c8de8f4a505dce10258a41548714ea8464e97981cae4ae0c6dd20e838132f12588e72fcf92836f4508e2abca58dd962835a268092cf79afb3f65193a5f4e4fa7ea81a1f0058ec521b508e8eba68a55643df572b935c5d819b47c57e4f99b0d4f5dd396aedd434b9c38760b1b570326b43fce8147a52435fe8c725c99308e41d1c2b324ac7ae298caefb3acf2c218b8fafaf51967fbbcefdbf62be5fb25a610957a45c5e324d10fc0a12a291a2926b95d6bff227c6c3ae16be07c2ac34f12b558b0bf305c1a66be106cae482c908bc2ea62026e1ed70b1c0591d8b1731b40085728821e6c8f5670f6a5359e0e1784b76c74f52e06780f53186bb5b2871a76958716cadb19dca2020779170ce32b650fc25960d23426cdd4569b79129bb3ec9acc96cc8988cd97de97f1f32cc8d0fac6e1556b7322b8c2d92620ffeaed027b588ed31880a36175ef8425983a92dc635cf4c67d7a0a4b68d3200581373e12147ffc9ac8005657a5594b898ef3d627e52fe9f012243837b89ac54e904ff6ed7dade909d5755831ac4d5731cccafcd6da29b07207dac16ee299b87edca1c7b84a38134dff7070e3a4e470418fb305f14c2fb895c4ef3fcbbe97f06bd4110ee92dd2c1dba456a86e926abd4ed635e3b7581549e4506cbaf83478d99330bafe250f9a41629614241ccad51e518e2260c2b72eb701612d4a170b051f2feacacc6a910e1ec32b94b6cd17eb32ff933be0c3c8449ac3e3ae5be3b6dcdfe3e5650705f95f12b1792c3fe65497932449f1037e78b046e860ce139b43386fcd616098054c2728c0775fc9cb856702f5703ae3aadf24d2381ac4848a07457609aa6f059bb717ecb364a14821d5801525730e84be5a6e10658d28a363a16009bd075cce4309d0a854249300e693cdd70a217335d87cdae655097611683b630bdf3c8f4ae9dfc738917b3abe486694366af6c3edef94b2333a144ffad1243b6275e122d78db0ecc58f733ec3bd50c99a6dcce362d463c507823e345c15d9095287c69355c5f3f72c82042fa745f3fd130bb1523b6a89a228e2df4e9bb44e5a7c680409ea1400997b27013d0f8f6c2466872be9500cae77eb96ca45a57974329965e24d314464462d555c84b76e207d7c9cbb29d9fff200f081914b18a1376dc131e520c40154b877b77d5d50aad1ca056563dd9ac45254d9ac7bc12c60736268a83894f9b3f945731d5c9a79b05e13eccbccf341bc07b6494871f47087148ea743473d06462d31098d484c54fbd9e2eca8611d49e5cd9855082ecaad610c59d8e5e1d987d125b508b6237cd2bc14da363816402d515d73f00a8a5208179b07bff2eb20ea3fb92a3e0c5a220b72e792b73ae9ccd271942b206204dded28aeb8f686d4d2a9e4457cb5ab6ae6e098dcfff2054a2db9787d16c04bb7cb78ee329cc12d22359cee3d241eec0aa28a94264d43c703890b6254a51644a410b62a2c8559f74ce3a030d3567a943e883bb82e5ce6730ab693b57740776fecd3420c55c9bc4434ce652daf6e51d2c4e806275467385a689b213c316ff8a9d18c424f662121bb1108b98c520d6622606b1118bd8c522f662271631108b98c540cc62eb033e001fa39bbbcdbef05b4105f7387e73d45c533f13f68ad384acbf8ee5b465f4ca90c6a72baf5e1ab6c4e27d8823fec2016103345304e8292c23d70dcb75042c9ad6704900f46bda272f0e51d61849c2e08197d43ed8fa005c847a54cec3bba437db9ae13d067b5413b185b4d27e6bf0b03300b50dfa99950b4d1206b958956e5eb1fb39a0be28f3c9b0072dd905c2a983a074595e8d742d0467c48040e1403a6118d2b4f00467843f8d6627382d62fa7bf761daec5ee2ddbcb48096f8d5886cdd9755106f1bb17fce2060d0a3c610430103bf86211e1d813d0900b8029859340877e428e01070c2d7018ca122b84d41305e80438e04c31e1d46180ac8b8350cf04804ed4910c257c0cca040b8a3c71087800204da35eaf9f854cf9c6895c883359ef684b4ebc8719b61014f95fb98cd7c94d46f2ff58fd44c9793ec80009cbc3dc1950527454cd64a11bf800c62e3594a64d9a38a7928f13fc4e1e0d632b554fa468f0b4d1ca40f24a628c7537b075dfff367eb5c01b5494718f528c90e3694e51edbe613c99029d6a824256aab7c25ae6f913b3cc56a3701972f7ca2fd5cca836606993769be643e48d78b20ad22dd6d27cf129ef89cd51036ecef5a9759d324047a7cd5cc0092db73ebe9571d4fce1fdbd29514ec5b2f2e6f6b86d2cbb4f54422a896105582523f72ebc4b7e437079384209fcf95e3fdba66bf2f3e1f4c5f38f14c526fb7bbc11f604090e2586e492f443e939d31a48f9004df4228831223b0c7905fde13a9988a9af8b1aba22c0c5906571592defeaf7ca22c99203635bd42592e4e950324ecd70c9705550042e05b1de2ec7af19e8e3a2ddac0d28fa340fc28f2062cb29012ad22885e7eff6362f256755efbe34e2a762655975ddf0e833396a43458a5286473acbb259a133c5ef52261798e0c0c214826d5b9d9e00b5e1e1cb06aecc5c4ff9af231501d4d5a827f5855301e1729f939c6d83c63e568f88a2cb75c46377634711fc5fbdcfd20769fae9cc9865c453a22ff72a1a4a54e80d6024f2d2efc86d7a0e6a733dd17257d6b53861e585b76bc5c442c112c3513509501a20816f26f42673130d65eacd561d960ed4a3ef58c27c73fe78e314f6ea9e1977cc6932674fcae16d1ae22f3e05fc5199aabf7c342d5f65721f2e840f8fda17ea8617127f2c3c12863868e561bf9c58129f7a77ae01c78abc49740abbbdf5c43ab3aa459fa7cc68f5e001a32d384201d8986696bd251a4239f7dde58dac8c8651eccbdc319c04c25f8e02551487f2a0d30bdb0543b7f40ee11a4a04dc5e1624d123be2e9a4efea72d6fec13740c7762bddcd4d1b7f602772df26cc78f3b5ad6111421b7dca04c18026ca8152c215f90181b8d04e33a55dbf306ce75f5874d1c486378a0612f49a2c0bc24d2b220ad7921c25144312252b1023ab989ee7a0185301a1c5db43dc098501e972fa8612a4be398f51c88fbd33806c36876b1967052d3c3533fe1516c3c8ca1cc5363e332af8ff4ee9900d49e94c668e717e18225c5ac57f3ee59dcfbfa6c640cee124bb824c3f911bbf066faf4047496eb2d00be42ebe859fe790aa1edde70f1a313e49195585eda0a55ae0857eb2185e1d48942ee58f663533e5a94613f58b3f968cd2fbf9a5c2a11aa2c7e915a0aa5e079d362152449fd35f30b0d3cbe9f301ec5c860c003b3d9b5687fc113b2ca467ec057a18d423e628fa353f810b5ebc6621d9c5f3c07d04680b5194b98fc666a8e1ed97085e6e67cd4eb4ad29c2ecadede2d27f903d3a00b74fd84a218f9c017efaa77ca4ef68d27e67b2f6ab66194c4ae84e585fe5cf313bc69306bb0af37c6d8d7be536a502260e40ced83258f301d3187095ab1cefe25542e6a0d088b3402ca09e56b5184d01ee2178e53b4833956e842cda7abcc047a94c6ce556c7d3402cf9e52a60d99bedab3381328152b02f20b3dcc220d848725f7d5ce86e59a495278db02010e540a3e2efa8f120783bf84ec5b11457233fea24b1903cb1df635778af8ab6566b65d0746dd60790605007972120158157b0e835ea2cde733991eaac708f67839304a160cbf5a390639ad344e78301b2d1c7c75109c601901290b01b94b3acd14348c93a13bb7b7e1961404d195a806d5277444d21b8e8019d67a75cf274c0c2f5d03b9306cfea252d2ab235a4eae41cf0d7281d177236c04fb972af6cf134748fd794d8590e8648a023a1b4095609e879b68509e1ff28c97a36f14557201d21d1995be33c0bea9e26057478ac08e26a67b7993f513c53d1a7c0735ba3b9ccbb046d02de7120c7af32c13c38f391fc1ccb931ce1d5aa6d4d42bc61dc8f4c27a898fe199294f93eb45b82e0c9040df5e4df88b428f2da0b638836488f083465934e65b4740c126f8c5fc60479ce7cd8a5d8725e389901b7cabf2c427b4dcc239486d7550f9aaf8d1f9b444231ab92b261b9f492ccd95e03e7fa11b17481321b1e3c05e8511f11ad0e11866fa47f7c21fa8359e70ebfdf916e868941854921dad0c8666493ee13df0847bfc0a087a9fc40954eeaa7cbf9a7820ca34283ca02673869fc4f76523fd268142094a86d28731bf844db09479a1ef659eacc69da9d2bfb2638ff6b600c32dfee1db8d3cf82eb7b236325257a0bef615338979b2b780fc1360a530b314c23751b0c20cc2fa39f782991c4c0d2c61f6fe95d99c3758a1b0bdf22aac7c3fa63164789c1be6f2e4f383690f8f28c3df7207f0f507c80baccb085804ef909fea1bfc8731be937be88e1e686d776f386daa687ebec036911043ac9fb3b9d7307c9dd6e4816d84f9ab52806a2956b1ec345e3a93cb6f69548ddf2f312f5c8d749fe5c0e44efd85d19df92220c807217137c5b000061b06fd80c439193a68e27ed102435144191e15f2c456670a1b420570d8a80b3b8b25a1a86d3290c31b547425594d1215295a0190e0a826e4cb43a8a259d3334040e6d363195ad370c48ac4e770e3948038a11b832906af3272384142a66c08598c3f6c99af59a082a1cfd2190f0a18b6935efe2d73984f9b6b5a283754685e7f53b07b6c0c8aa2e0c0b1e84c833f39db134ffefce730a8103c11d302fcd361020fc3115e2b1efb9715d2c4311e6178d9e70239d538d8910eb3bc9e827a80060345199f575dde4c51aeba218b56eb743a2b76da0a3b8a580742f9097d5aaa8c1512d4d55fbfd73acea72f5cec7b3a955a975bf2045b55ba87f82c4f16d39c3856708c482a88f963b5bd88a302f89b4ee34513df9b30704fd478f90949d606aeb4c029357f7743e2d62d41ee670cbf1878eca7066a5592c0e04a5fcb25d41215efa44531233a82b3cba87273bb1390c010b90ddeae9c14b2cce6e9da9e49350a62c5246dc182ae911db08ff26018907b8fe0042ec5fca4a2d36b3ec599fa6a10a30009c045fda962dd8354171b63923c12de7fba2eb76e7085154f5f06995b6cef564e18487f7397c17c72be28675930c5ed8998bb642c531915142e5c2b60227163273291bf62f4ef6b3471c34065768fbf67595b64c9e3afe32fe143dbd53d04f25e4cf5d1c75bdf6898f67bedc73d870921ca1d3cfe0d3a18020b724d5bf396684de4ae8a020cf64c78a17707f8e93dd084ba5ccaf7d02090288ad2cc37546bf277976fcf7617d4171dc8e9a676827ad309dd0295512463379d5dcb05f9be3bb4f37cd53bec977f3db060ad48329da3d74cbcf863ad227e67de68e32ec1a1fe665596cc1efd46da138765130d45526176cb169066f3f624f0a7cb005b97a9cfb1d1d353d828eef346c264eb6fdaa7b25ccc376fb4cd1505dcfe76870745313e645bba9bc88a5b0b5eddf3d6c3af16a36e0bda420621dbee37223ac8712735c3a75ddc6b04f10f6e1f5df40123e5f281336b8c094e2099a76a66945c897571b92db6e65abde3b984bdca6e1a31022067b551ff7f07464516ee87272aaf53a84a0a81e3aaa75d7223e983198e43466c97df89ac10040ff09a5c503919061aa2d94382ed0b567b7df0d296d4f7782f120211da1892006d6485d6a960eb5cb36c3c8f469a17e4f812035f12710e75cb598b2eb1723bed286ea0b5002d1b373f0b76eed8d03164c8e5482a698fc5b1a1e692091d090f325ec16a7095b0c8bb8387b20467f6b6d366a2ea38830e4a742323d7133aa05971fb6965ce4609d06b264f126ea52edc91cbcfaf8b7517a9060228f1610cc203fdc5ff5076246637faa46649cf395abf599baf9c7e3982c6b1a030861f4f3f58663bb63958d34358766ef4436cc72bdfe96bc8a316a2a4576c0d24b9f0ffc4a7e9a0dd5f68d1fc12f8d36e56ac63f9fb1c111ade5d47adecd9aca261ffc51cca3467facee975316731f4415a300bc308b0df9883147327a4baa6c959499e4a57375694d7e78ee11c4b2ad82be65ffbfb9ae7152f4dc79dd41390869358314863cac608eb8f4242d61fae230644196bfd351d81759dbfe734b7f8902223f1001b6d8adc1e1a8f4edeb3c804e5cc78cb1a975c7c8ea4566fe3b96b1d6bf3864e20e8521e7ca079e4f7a6fb4271f1da35dd94be1c1782998186cc7a2de703caaf2b5a08cd96c7f9869a31c029e297be05d14ffe05979e9007a673bed4facf74ff24cde374175abc96d66246c983ee98324f2683c92eb29b9b7c71869c276f46987d9c1268e25791318b0082425ef1bea2bed465d1ef4f45f4d2eba8556974f4137cc77b15e9760972bd164485addd2d64526b2ea6a6ad20d88d74788e71ba3503c44944dd76838d45b9659014ab9cd26342e62efe9872bd1ff0da197a5e0487fd30e5f4f0143d8bca6623ec834e868032e7db4a13004c3048c7d1940636528905987e81342c7ac5820382250840325cf835761bca29a61b30dd99019e88924167764b9bb040af84ff494869f9f64a08fdcad74fc12e76336db84b9dd0d48716007c02d598e4eb069b774c78205d3067b53d4652a4a2265936b2d9537bd78c32fc851a19d003a2fe658f0d95283bf0f3abda672cbdb57a109d2b3d736061cd9eea479fe6b299380fe23853a2ded01e55104a69dd81246dd5d3f47086c8b1282a1f2ad7a0c39ea0ef49c40ee9c65c3deee9a7e68b1489b94798e0b4dd614e1ac914afa41f0c494b02ccfcf3349ab9c865e6b87d068c72d26abe3197538a70d8a916d102c67f1320d2656796c7f0a12a14cd779131ebd119bdc4c18b217f574f560ad51994ce1cce38c394b2a3e7228aba73c253be21bfb3aab81d21d25eb357906486006e3a20e8769da248254ef8e2180056bcbe86b937d8f0b1ef6ac0cb5bebe747e278ceeda436107e67dcb672325162ffe1090307f792ba001a9e360c7d34b3b7cfd4e1151b27334b1db3057dea4efd1f7e7ae4d2271cc6975ea611613e69c38d3416656636f712cd1bb87f9f83cd99241942546f39f0a97254d324b22b4597249c6eadd60131495b4bcb246c72aa362687ed58a57361be3169136457a533fb009ea22bb00b24daeaa6452188618d55fac98033b9e085ffbcca9646869cf827f888e89acd0a2ec8f19e998440577242bb99ee656bc6e32525383b916842e2ba3c57d02cae159ea9180d279e0ce6d69c6f3022eaa564f4e50cf24fd3a11e06bd86740c27f1ea1fe2b40875e90b551a3b2ef6359301bf7483f4f4d1e09f46d1aaf37b2e32c4ca5c3e6e4f116431750074023a81554f51ff5816e2ead40529275151b0467312fd3c6d9f7a23aff8bb29c65f126d20b4daf8bbfd583f589dbed3bb4e5319ae12b9d3ad890e304f399350f0408e9eb98dca1c06172f42089178b994eeb168902ab1d27815dbfa64f6151886fa006a7c877a48047ef32f3c05518cb7232c2d32b681187530137791ce4576ed17fff7d5a2066436ca2b30b12bd3be6260a74a7c4bdf3e4430100cac019b88b19449d907fe506e1a676a38c1b01cf0326e53d8a1dad5523b66b10758cfcc85c8e18e44131fa9d8fe52c26a6d917eb1fe24821e212a5ea2ed4d22134f0e4c06bbc95103e5de7d49fbb0e1007f8a06ea616903a29ce8492589519643992215c6485ecc99939b881c2783d477d74db03d1c490e64606a8d976341811a8b934afa1b3deaf1482aa097cc33be34b1cf7acbc1a828a9409d698f67f4655e63e05e657f36aafd13f50f614607ea6b9e4489d82077f4b266d532e280fb853cb11182fa491a11c6494270721fb26cc0e78f002c113d4261bffd87669cc08ddef298f8322e900fd356fb6a5256992542e3f18251ce8c09db1b4e1546c04090027501261c0f6e639aff54c365551257b2296c60dad60d0cbb67053e41d055b628b83ff946ca1e2e06de2346acad67b8b1f40e6e81a164740007db4cb5a0d46c4d97f26a66df04e49084ed61dd76a7e3b4a9ebdc877728f013606c60028c7b1e270f3e0d25aa66faaf9f0470f71c6d9b5f06842ea58b3a3fcf5c0c2446ea58951f60d901484d9462d56739c0987a490976f1410e00181faa891a6e9a5d9e9ed9c43b850ea024c86bde19c96916d4c7b01a4fce85c0e1a61a9b5d84b0302cac4f330199331d6afe5fbe295f526bda2684342dd6c7405ad2b9619d6492594e596918e55a4e32be18248c9eaf86494853b8e00c918b2ecb12ee930a211c8451cb6c5ae2574c7a51ffeebe3fd8c7712d4c21046a52ee54d0d02140c6574f85549b8dce878f64db107030f8c10fd4b9734c1754b677277632bd3457b4ad53309c3a2bd358f76d2dd3b8a2ef0b3715424c1f4f89475a4d46a5b2c885a5c1553492b43677515c6a9d87d4617d34cf9f6c6c846b6375931f8135278690c5c1b4535ea48c72ff1f633fbc221b88f48a391c59256fe23dc95ec44de65d764d2afe7a8d474ad8e512e1f75fe092e723273da4cfb275ec8dba5648d536d5fabeea3dfa0e6a379b70ea6500cb0615c3bfe26a51e93f4263d96bfbe98540a6039b18d2fa3bf34a73b107c1d17e42bdf9e8de244109ba09644317dec834591423c1186289df4097bdf01f2f8762a50f2890ffc7960d605bc15eef165729326f35ca4fd4acd9a515d4a464a461f4784d7db10b01bbce22d62b2946b4aa5305c2f0128d13e1b7039a712f41cff67f4f5e011433c631d2c0b482454c098295d721d406e4056fd77944f9405631ab6c8d445dac029038e4eb521fd24151ac684d33255d4c30ad313ab7647a9c01e6a8c69b0d2fd3ee08f56433a963c8acc395ea9a09ba290d51a31298c1602ea0dcca07e6ddb145271e2bb88ea9e2afd89d68e7a6e925ea374e100d3d4775dba56974bb6f4f4fc386ee25e730e7a3680812d462ed02965b723fe018270733c6d9f70a2cdd06bc8cf3c158cc9704b8aba6d80f9ec75d8d9d8f70afa0c5a23684dc8d52aedbf2662e832468d441cbb260cb2d8517c715a9170dec582f3eaf4516d9075d20679686faf3247a4591da4f7a7d2940105053230f5e0189139c216aad7b66088787a571fa8a0e2200980428726a938aa37a0bfbdb45f2d50ffe79dc2826cb7ce33f937b8dc1bfb7e6555d9d50654da22882cd223a2a822cd9dae001528570dd8d51ad4957b61b880d1ab0215766a5bcb29362f9a7b6345714b6ae8ef38d38f4bde81da6ce26d1e956754fef8baf7d87a84d32d2ab3eb8ae4e62f894db4e854b3ab594a616adaa09dd60bf1411c9eae119dbc0df441c9283751233dab69919f74324546ead0e1f70b1dad1e472d86152080862ef358a2e55365eaa89fc145a25aac3897d5547a66ceca54b733bf6a0acad5285a46801489af6d39993870067637fdb50d180b9563f7f44af7d4c09aa3d915e52ab48900094014ace7880eda64142b3e8f027affe9077d29735dd4db3a8c4a2ba27b3a125a146d0023b0d4560b48698c8f8854a44f627711adf822a70428ee8bc49c7a7d8b7cb8578d196daca68f2cec935fc55b8bfe1545f06cfce65c04af439986a6f4c23f45f37c9b4b81951d7d95ad2598fc263288b0d83c6edc3db535f82fdaa0841bcc1646fffee37e82b7c5dcdd6a0e30c1478645a4fbdc7f6cc8b962940c3283d205e2ad1e0597303ffe76853c9a99ac3f432580699ca113cd65a5023eb5f84a63f88feeab3dc8c65aa05d4f384c8af5103c852300cfcc81349dbd001ec64aacffb904d5fc5d0071bcd30ec86aabce97be62aef377485d4bcab1c1dcb0988593a76eea91a1bb7a47caa049d23c514148dfe98a9de869312a3d4db857c1057c34844df2a9284fb0978fb844102efc713d3a55b0e4a57e7687ca326f8deac6012669923628c958c168d2deb462fca0b0fb2a33bb920e5f1c02448541b9911ff6fe41726ce5f30c4be915ad6bcc029476ab017da0e8c6aa81075c9eb207720badc5b767bd460ed689c661ad6b7e2d752e968d09c07c8b4aba288112ffca687e5e07068b4be4f59d5ec35df29d3fc4e8075173ef6593c7cbef68322386241fd9d96bbd1e6fa7f2b056a93621fe39b6c114409d131467ace8375d76cb31970852f6aac4aeb051b1f6526748b1400fa5bc7c76ffa8ad7e8c8bad5534c287bba5818cc09ee81c53c395f028aa8a95ea807204c26199d1746fb915212fa30b44f2d2fdbe1297b7c286caa3137eaa967254da51ac5282336237a8556a22680351fd028804d66cbf6a3c13826d7cef6145e447280377b0d1e11babd2f084b5cacd797d45cc5aec9738b0bc029cddd0d6380d07f9964a63d8fe022d8d63b316dda1929d55503edc0b201ccc26f9bb4df1aa6374ccb13977548eb137d5ed1aefceac1d7e8d9a7f52233dc6378d9c6a36a8d00024bfdaef897835d58a5a42fe72c94040b1510708244b516882e25ba3206789a0f58e9d5e31c0dac04353be3655c69f009b93a5181d811f0d62e07f3147305c8bce6a5500606db7c796c5160212364ed81687530b914483dd8f2c69391a5a6d3cefff9d7f3daed654be81f68f49dd55d6b6194a44dce95a1f0beb89ccf863837b7da1bb77b87b6d41e72f75a5c6da49ea330c57ea76bfb1f7f237c115a207ae82211157776be06ab383589a5c945434372245cc92d0adfbdd0100763a48455b83e5130a5dfa4b25bdd3dc9d5be2e8ae49f041fa9bff4146c4cc9e836d31d05a83ea5876d3b5cafd18d09255b0a3e25d010b1e223cdeca52d6bef95afbef3312a92f97c759329e05305a27b321c66b168eb765a9260df1cf5454584a2a09bd0ede0c7eda96ad6814db37890e74110e61c926a7905d59e5b81ca6fa30cf919fdf73eea6870d3ee99ecd4c2cd5acc1fb8b4f86cb4eb56ac91a0bca0cec78f7316b767b23ba403ce79a04e594e1af3ef0ee031471f5eece37e61bcaa617f0127f6e4ccb586089c1624d71d0ff8057edd03e98f6da740fbc7f1396c910c1117ba2fac9a40c7c327d7adf6bc15dc38928b65c2581b6cedf4269318c0ad5ce527e2b4a73981635d116c272608d068945b88cf4300ccfa0262d51c542fc9d3d9da96f8058c07e617f4a7f0ffdd376a1de760b0c11d5a228a2565c38a8d7be9a985d2ddad660073d911306003990f1483b1733c2959109844abb2a98053341e1a78860f79688b9d3ec6ea89ecf2aa11e5cdc696a810f9cbf113e635b90888ad858b3010e83ae1735e6c265183d2b35e80a395ccdaa5d3cc61326672420da04cd233c4f8e923cbc0d81a69b5b7e0c0482cf95f628dce31675465f4b844f9b232ed4d65a816f7925ae6200cd4429e5d2269403a82e1c7f127c3bbbd91aa3a00fff24293a46f08cd5aff05e20eedde5135af5ce76e723847816287137d56b9552c44f6a284377e4082038cc32734ae33284a62a6f03d3a028b0fd1545dbe910b41a3c3737ca9d5c4751c6b3b950c8069edd6514f2a83f8854192e7eac245a9f4ae686646a487985905bbab34d650b326f670c62fcad0022c79518106c461f9dac41d7d8b38d13d62ee294bdb2f4dc206b02a481a5c18122f69973266f1b806165a875865d6d33456f39bb3f33159f20c521df7cd2cb50f84df5ea86d3b008c98e40dc714a050d00846b4fdc90ca4c76489ed49bf7a98a3eb80c9d598a7ad34f8cd8a015903f095a26417ac1c09806e224c2f9001844f8960f7aa5a80e7d028ef2ec63b09b20455bd87b45191d8a93b228842c9f9dd47e517e9e5c24632aa3a508237353a40699b77e0edf96e41c6ba76e54c30dbd68b117d7025ecf557916e45b90e6aa1724278b4fe45beb9cefadb6d649e3b073d659265e45848ed13e9cc1a5a17df5b2429b6622e9e1dc5c96cba665e50e14fdc462d38869ba607d5241001cccfff38e45f22549cebda5f4abe1ba6f7ac266064efd2730e13a7ac3914834e2bde130136a1b34602bb5f6471c203dd58736a0a59c96a63c6c5aa6b700d69f10f5ceff65f83552781ad5d269287a909d66c7073764eb8976426c856487fecf2d3e70a0a3a25d98eff7140ac36a5e37e03dfbbf21fef5c6261149e9ac939d7188a2abf5994ff0e0476950604d66673fe1e7dd07d66910d9443da65e0fd9d5f75135c57b2aaadc69e266a894f0b84371d42c3966af2752911505bce78d0e96efd29cc4e58e68b50197cbb29e4077cf5a0265090f6da59617b2a0f5510aa5fc4f09af09396f1cc5530f191c474080dffee0d895bf304095e1f177369972a43b0462dcac40455f254fa0d8f2a186a9c0ae0320aafe5bf8a061cab4c2ee713591ef4efa6075d07a376d3b02c09b16270a360422189d4057d36d39730d500e52a29a2399724538f80f4ede42fcfe9a98da892dfd6488843f4d8fe3cad80ed072e652031ce33c808046d2f3100ad7e946cc64a317a48820f5ab3c9b8aff3c9691a8326f9ff7a0659b07c163429e3db01827432b41a1eac3bb0e2122ccb7246dc1f28b9a6fb952b0b84e975ac5059a599733e8ebc5b1bac7414f6276201c4ef09c01584516c187be01f03c1db810e28fed5247af526c749dde0aaed286f2a6d1deddc7742291ef6534d31b121a33033ff079539b842697b4ed48d2482069244a8a461e994d08fff8b3816e3a40c79a521994c6499ea991bcd18e2b306f5bc97a07b5a18d6e93951c565cf6f1e765accdf5c9d061260bedb2b52aa0c4ee48248a5797e45847885c0637c2b54fa47261f5ed979551e4ad25a37c08a3f43e823fef0330681afc51c1c060fc3de387fb756d2f5a049e800a4be1dc5c80f910a37bce1f3185d3e2f7fffb08d60648976488768b9367f2a783cf478485a7eaa032634f33d818afb683ca71ad5ed4fe5eb14d8d5bf586bfa7c4213bab5b421e41dd51e16228e1e7df113f2b2ca7664e9972bd28c2bcaf9e45f6a9fbd2766cd53caf5f7d03b284b7f4285963cf89ee4a3c433752f912de2072f461db0f264a326007aace8f997d555378a88d7e820803aad8affea5c1b0d21de57c7dd07ea7ae37205dbb4c026c9d5052d6379795febabdc8f00d685b22045719592b8d867db9fb54078a1d577b0c711a60b3819f288f104fe3f36e060562e5c01f077c81669e01d6172891591e34a8f2822b9ca772f995e36f04bfc8f52212ea2fe9f7ef8d454d8e333ddd5a308645820a43d46d21f45a47f86987b54a3ef25cd5b9d60202d484873e5f70ab71c86a98a6833794bb93f460209ed772c0393ee3a635eb7535baf92ae0919c23d054fb32d497b153151a1093d7019aafef553a01fca6c75b60ce1941998a88c75a860cf481fb25b5da8fe4c3fdf08dc12a59b9d3f95de546d0540295ab83de1b4b9524d6a297afef166b0f93237223f6fa2ed477c3ae7900a949c04cf5ab1aef21c2f230493014cb1de174b141dccbc701be223b8db1390bcd9b427769fa117823a26254c2d32c1f68adc9c7bb1f72292a230522d4820bf350c67b3f3bb55875527040a15ced974330188e72b52ad3b3d38976b7a694fb5fdc400e86d9dcad7007e9513e45dbedbde9c146372eebffd7fd5faa0e974cd8513e57026ad1f8cb20d163d0953365fa8e7ba637291e15c96917dfaab1547beae084855df0305dc0b40e25540e2d1e78f59bfdaf7d62b810402888d80dbe02809e11712150218f845a78825a9a7f6d0b14fb26d8e10b5c156a22ff94a5be40aa7060aca627ba4208a739367c1973e7e75dc9f6717f7c7f8a6fe0543beaf0b88d0ec18d7502899aac8b4670d17bb5118f83bbc3cb77af6b714cc8b68bde9c8f6798ada73a2d509633f0860005c7232ad0b3a1dd89bd8645572a09be5a304479874391a2237b15abea0ee00cfd6045978ea1dff37e3fc9023e8626583ef8b703fade4be80c4a83e12f3d46ad3a11411611dcefc7e80df0a2178caf42ab32d27c7dbfa815aa38f2839e73b1b9c38222ac8b04c5c3f03a2c7a5d9fcb82a046a88fb1af524a1b333c27d0a0857ec03e2846e0db9e01b4d1bdc571d99508aadedcd375da3f43b572182380d9e88f5ce43e3993a6ea8512106a1c566be12e21e231978481c06f14933187d827eec28a1546538bbb8f712f38e1f35be7b724a73791626ddd468f35db584521ef84e3622a367b9a68562e09e14f49aac6c983faa4666d8b1e08edf0b8dcd9da7d6b31ac320e13bb3cb5cd946c21728b34c8a8e61919838ba8817b5d4e9a3990eabb10ba8193401dfbf09c7498a2f29fdc3881ab897c8ebedf5a100b257cdddd56f42cd5ec1aeb91b1c1cb451ba356c8d15fc8608701f5c80ed6f847caab58e4be2b1fc765df1a6136e697223a27e77e590c2f6e007a63fdb0af4c1b0133cf1529c0aa2013ecb964f83c8f3ea59782e6daebd23ef90279691593ba5bf9970255c15ef50e7ab56ed6495c8e5109a26ba318f71096a7f9c1b7e50c6b4ec71ffbdf441203ce6148c96bbd533480a3a272eadbbae9aab21fac27316148c008fa6453b167713260986af6e38a34eeac928ef0fe1a0e41c9a88788d5887bafdb11fe3e887dcc93f81b762b4027f32c8914501218745db32a14415da54906cdf43fb973c1fdc67769deb5597f556e7e8e4c7ee14ac5af0a658b0c0e61740930039e3784d76ce79e9b4825e50842bce1e71ae2b35399f29eac674b11c5e2402e5588495bd286048110d8216ed04d24acc827a5c2f4b3b220241472be1336f6934b19df2513866b64d8171031133b842ec6a104f5065f609d83372b187b1362450198b4fb12843bd839daddd431ff1592ce06bf9dd7007d4b46e6fd4305d890087665f24f21f885c2ef29a261ba68382d3d461cbec46e0174ee99a2fe8bafa18fb2a24c4e3fab8f8a2256ce1591c5a13b5e143116d1ba476bdda8d6c068421d840d1a5ed6fbc14d41646ed5ad9f8d5bdf57c507606fadd8ce0238a089f3248bb31be81c784cbb7dbb2fae1187d9ae60c4eca1b8e11216b0c9f3e84064c0b51dd5a8aa20c8dffaf1d8beb78cedd3c23606f061707c445750e904b50e33ccb5494da2b9da42c9e0703b0bc781d78060eec21d788535a3135f677a37e6005197e972139d6ffba39b6dc4fb86e0a59813e8633c370420f06f2db921f0383f4f25bb1bed0d0be122e00a2bce7c4358b1be6066c1b8ad6f523cc212fd44587a109efb6098cf49398dee407e2e105e04c63151b0fb6b6958269885189067bcbe447eb609e09fe72f7ff0c87e050149541f014b7fffc075b3c13c6e60726e330104b0307fe2be487b94552d41c482c02669c520b880d4123cbfa26b841a242d68c6b4afea4048e864d52db9de93bc95f14ce26c868559df1ff4cbcd5f987f528b58e67fa8937664356ca3b1230e4d816477a53ed803e51d6bc0a3460e2a5e6eddf1c067dd692cfcf2309ba213c4f9e93c5caae6a38ee76b31b8ece40c806e27198d13e31362a1f55b3f23b970a124c5c5bf75e1c43d5c4b2f83c40b056e6844b70d56205e55493af97c11b88792f844e00e4aaae1b469669abb0674af27349d5cfc45870a46bbeb62e17808002894948020c0ac6ebe7fdd345f5de1f1b70c4bb371ab1bd8eabd3ceaebfbdcb79fb4460869641342b6947b07e60da60d760d3546361e06bd32806c7c0c7a6510c1d08b4387fbc5d08b7241ef7cd9781c7ab7201bbfa2772bb2f12a7a4b3f36fe06bd25978dbfa1b7442f3764e35fe8e58e6cfc0b16a72221d185de1c19d8f81f9448e4917308d7d4d452457941cc6fdf3ee911dae7759226ffe2243d4967c9f7781d285c4c5444acba2752b0eaae8a5875719ab0eabe3062d545998255f7c68b55f7860a565d1b47298fd7a1cf79bc4ecc771eafe3e20cf85832413c5d9c8aff288ac5a9b84329859ca229b74121a76cfc86424eddfc06859cbaf1171467005ff1b8aac50b8be724b95c41e3f13aac1a8fd7f14179bcce0fab2e8cce1156dd151d20565d169d13b0eab6e804b1ea5e0709ab2e8e4e8b5577a5d304abae4a47285ec70956dd9dab3c5e67885537e7278fd779e2058d0ced3921c9fccca1961c0a3995f313bab3731515d55738386fe971161f5f21c0515c5ec39e06cf7396cc3c3e078abb7660d20311ab2e0c2958756b14b1ead268c2aa9b3262d58d3105ab6e7dcda082559787db1cd13c3ea70a565d98b73c3e07895597e5288fcfb18255f79e8a74688ed3eb4552ab8585424eb11c85c250c82998b7501e28e4140f979179ad3f9c068d1aef41003a7e0a39b5e33849acba3857b0eaeef0f81c16ab6e0f8fcff161d54d3d3ee787557726e708ab2e8c1c2056dd18392760d5a579e9f13941acba3aaf797c0e12565d1c97f1f89c16ab2e003ee3f1394db0eafa709bc7e708b1ea26f11e80c7e738c1aa0bc4733c3e6788553749f7201e9ff304abee690a0e8202416fe8a94900a80ff485152f9038158f83bea88253f13af4c5d18c41270c3a67e804a22d3dd016234ec5ef405b9ab4ec34c13efcbcc53e709588dc11ea553ffe54d42b534bbd2aaf2863ef09897df0e2cdc7621f3c947a51a7a2ef5464e36de80e929da09d13ec00d19d233b3f3b3e7487c5a993ef31c703a0f294a3bce530f5aaf870967a5100f84abd2d76ea95c1f19c7a533a7f512fcdca69bd3731f5e2b8b061958bc7bfa88255318f7f81c42afaf81756b0eac5e35f24b10ae6f1323facdae1f13241ac9a79acf5aad4cbd48b92390ff5b6e0e138f5caf4f055bda9d455f5d2c0f88d7a6f6eeac5b1512f0e9cc7cf13b06af5f819c42ad5e3271256dd78fc6cb1eae6f1738855368fa5db788d7a556a9c46bd281affa1de16334e807a657cd49baa798f7a6978d47b33807a715013c8c6b714b18a004d58f58311ab809882553e1edff262558fc7b720b16a008f47b158853a8fefa85765c775d48bd27101d4db82a75e199edb7a53f62ef5d2b0a8f786c55feac569512f0e7b5b8a76847aa7d5332a8a7380d7a037425c06b5f9f1494b3409cdaee894b17a006e7ea222c0fc4186cdaa5e7ad58b9e931a3d06f88d03ac6edcfc3b404c8e03b800a25ed55707f071c3c5010e204355af0b2da626314f6a12f38b7171950154f5e2fc86015437eea384d64bff19e045bd2f1e63801c01b88f1217f50271154ebd3e7ee3ab9bd7e8e9a981d3b3eac159dd47c94dbd2e5ea327a6e7e423c0717ef8ea363ccfc655bc9b1af751d2c3e3e1d9dc7836ea95790d0f002a365ecf69086183068fb708711f8480d9516f8ddb104287103478d4db7218213e2164d4a817467b4d6202a02631017098d7e8a951efcd69f4d4a0711f25b5de7a00f4c8d42bf3f754233e4a7c00c07d94c0d4bbe3356eead5711ab7d1326d2e4345c68d8d1b1bf751d2522fcc557e199e4a4b8fdff0b88dcfa053864ecfb6b98f920108a067c848699b9ac4a723801932bcd7fc98c1f283071c3f78ea95f1193fec8f9a1f2c3f70dc47898c7a79d0e6e4e1323c19f5dabcc69351731f253dd4dbc37178a97a53d7f1aa111f253874eea384877a792ec3a65efb9acf10404d62b23ca526317948b98f129bf9193633eea364877a77380f2cf5f2f0941496fb2829d53b80dbcc7a05f019dfe816a3de023c87a6de1841e4a07cdb3ee77d9414a05e9a0711e3393941dc47094a4d42abb7f4d9679a8466936c3c6d920e46bd28ddcacefcd6bd70c72b1d4abd2bdfe976eea364d6cb42a3a917c6776a123346bd3bf3a526d1d9243deb7539d724bae9a30446bd31fed23bf5d23ca77772eea38445bd2c3e5fcedf6a129a4de212444d62ae4c18282e3589ae54afcbb79a44b7dd47c94cbd3387c1d50be3283589cf1af15182b2721f25a87a5177a9d705881f08e0a3078f1d3a0620001e9b83ee3c0034e73ed09d0380e61c07dda949b8ebd09cba83434b5fd1ed2a3a7f83f26f68e936e8f61a749e06e5dbd052dd9941b7ba2383ceba5343b9eed0d0178f41e961d098cf50174fd117ef81d2f34063be03757119faa2ee20e1547ca5b4ee9cc6d49d13b08bbad38296ec0bcdb090812658615950cd093f59e08175a1bd820c10a1c1a26806822890c2605b284bf715159a84ab44220ff7149aa4ab4498873b0a4dd29548f370d547c949dd69712ad69d2638155d16babe5d7b94f30e611b48710b99d8600596e3eeac82da39ee369476682f4a6bc12aae48b0e5c78d39e3ec3a49ac822e1bbfc3ea95f71d211b777e6cdc01ba3b413b2d9f8f5916da8b93d4d153d1a9885537c6d0a909ab620cf50a070e70263e03d303363e8704367ea8579067c618b2112709d6c427354ed28ba3f8e2681ebd38b23940384934874584efe224d9c8d9f8a60a14df9d4c58b68b7026013570da6c1e9087e3b88b4205431c77b39bdf378453fc73aa3cc5c7df7fbedfc8faeac9f4930331fde437b2be373d4209af07b440be0f91f60469bbe9e404f3746c9ff5e4268d12d18e6a2122cf67862f75bfcfbf1001cf7296ba847678c8733f8fde933a44da01d0978fa32fdf214fcbb9ad7462f95461e12bf218c10007b0aa63f998be7a8fb0df4ff47e169ee84787487b623aa9f00c3f7a3a50ac42b1b00ae5a74b56adfc54ef107942511ffd4e58a80fcb39701e96aae474ba8aa902393de57cba4a2de274684dd74ea6d3e9ecf93855995213e01571aa4524c074363d479f5068bfd3576b7cdfb9d87da7ecab43a43d9d7eaa48486baa09f06a6754440258a50473a5ba7d6eb507a7688e207cfd0b9bd66e72aa84659d07260ca284953b881de50f2044c58e393176c581355bf8ae0d87c107463948420ba4c085229edb35c5f5d2cac408061270e10c965f54e0621abe78d87113ce4038137f5111c6cd7495b04194686692831ce420075a922abec82ca594ec830fbe35337c5723ba916516b1e354579b6b658013a21dcadcb611b992d1b51aa7e05477acf155a311a7da085a2e28dede06ca3eeb278516a3e421e0e365a38ed188cf7106ad4d112f43785c8d443dd35ba9bfd50622a2e3be7943705c85dc1db952358adacb10301ef54c47a20df294fec25588c8d3f5bf8e46a39e29d5fb6d0d642117345b8ee019128b6533fae2233bd797698b584921168d32a3cc3650770bf550c61d147af2a4f2d88f59a5c5243776c6b06e4cfb9d74768749ae35e497042e32e417ecf0457838a6922f251d423bac44e035adca2a44e4d92ed71963a4b06f9be13196485e86e0c31ca61289543059e2e221c227027326769ec003178f92ed4578a0ccf5866cdc4ee94099b0d0924fe5650a826785c965098d3597c150c642168ae0e2d9dac44518ca37d0c0152e9e0dbe509d8dafb31a51a5d9711c574bdd18f53aebba332c32d626ec063fdb5fd0d498d7b5beea5731cc3bd728ca4750ef63188661f78ed523a014ec2d02a560bb2681391fe157af62abf56abd5a2fd456e21f3ec240fc53f4f3c3473cef30948f68a81ae7fc3ed4bd6714088a32100a05f3f806a49c750053917f10990830150f439909cf70dce377ba7cd9b61cc2d3c925ca5b58e88823381b9fc7478668f4460d5a147ab9072c84162a443b71de7bf37478de8675ef67754857251c72b3551b1b1b7f582564b2411c58088b48a52658b7bcc1c73e5dd8c28b67889722b8c7071f879a73db32ac76c3e083f627f2c0dc870301e081a92fa6d3439e9fc8f362aa2f3027e2a775092530ff8980393dad449878420938e08139e4b90c435f4c873c3cf462aa42441e1612aab1c5a9be81dcc177e3cba667e2b19a0406c3babbbbbbdb0819cbdda65790c745c43166ca42502a6d25a24dc8542bd641744df2d397ce8c686068aa81fa5f7a3db5fe9c87567682675a0bdf9465f8b41bddd137b58ced63267a1360b17afb1957fba52f853e9b1985a2b03108bc03d9fa6eb325dc3461fd4126b0e83335c7659089ed89c5e0552282af23db8410ab342656fb350232b118c6bd74d3398c962a472f76d3f61cbd65376d8f42192d711c7b3fa0a9b43dc6161686efc696e5a1983ad4a10e3c313ff1c8290773b1431df5c8c11c5c3a7b3d1b08003686efb29012b88a2d3803756c005531898db19b01540de1c0c66d3babab10dfa6cc37e5ce43596b958538d331ca43a6214e096ddb2f0b61d9c6422c24c4425c762ea3b75f3a378f243fe781a92fd876ec3b5c546881cb6419b216dd6acc32d38b8feca69bb2ee3cba6ff39b1fbd6d8ab190aaab486016333dc668e7fcbeaea6639e0e53e6015104b3fd2c002f3eba88c5903eefd10b70c5040e50a8e10932d8785347a1c5d2f079bfa7a35028c8aa937bdea3a7c3eb1e7c9785567e7b19eaa01e3576229eaff069e1e30eb17366392129b10e3299300c65b13b4dd77e0a6168379cf176989a9e6ea2d02291d9d2b974a22874087b3cb8078941a9cfc10cb0a637ed86f9fd9e127ae59f39bfafbb4a4fa7a368ebd47254cb4fa856bf5eb1d52bc833bbd79cdfd7d5d8ca40f0e1d8702a3e73c277f987fe9fda4bf5a268fd9c5c612aca4ff4e4d99659ee47f010cc6a2f3d07a3280f68b3b7d06bfac9398e2ad1874358855524328b6d28376d1bc6fd2031b50298e5ea10cc6af51c0a7de957fad29585783223107b6f5c0f078bb257ea139be01bb1f43e6cc19ccf7c1818863911266e88b086221e983301898c4084253c5c9500e1381b5f162c219b6e91249ce5a05e713512cd0f15899e1149f1b5fc4622ed72e53726fb582252b7608f2d31a885c626a210a76a44d2425588a00e5b790da9590efb5be9b3d03bbf8b5aa137c66277cb3848ba6c778ea7f86efcd97e32a06b1288534750e4519e8399a2d408444f9751f8380a5fb49964244d409deff2976960651220d987c4130a84af7d34daf9413b4d120a1f07e5133e29c5b784af7fe3e5a314bce22e5f471d5f4da4133ee9924df8d845c431841c848c8d483825bb1c2c99f0753faf00ea0439590e823a3108662433ee4020fc4ca35128065626f190f0caabf231487210f375704ac7cc8f98a9a34c333a3365a94e582325d76b04bcc2f26d82e067f1c6a9117d1b902040704057118cf239aca5e5842054411505d091b89a3c308a9f97bd1f117270830624494593d941ecd00af98e9da90fbf831837cae5a1d7b3847b0962d1689b28759b983c452323a393daa379211a49297fba0ca7cfd11ca52331fd8baf5ecd4b0e62201b4f2749566a351a6da50a7be654392ea39b1249493cde919527252e136a0909090945a3afc656509095737e9f0ab0ef3332fa6e3a31d59793d2e938a9946a8419719aa675873cd1487eceef83a512d7bdf421ba97bc773fa943cc4dc9e945ccb2dc9d3b119308a7e4510e795e50aa1090a779f045564a5542f2c7a17047a943944a1d4625cbb2f7ee4478eff8dd97e87b27a2fbac4bf0bb8f962c77b271c99c714911dac946977ccc8e512399f862fd000545a389d547a3ee35857e36bbf6de1dcffc8eefee9336f5a925c70f221169d94963a6de4e0dbb7bb086efc7ee660f7010037aa65fa23d94e8993ed307f44c5fa33d9448763c42eaee5f1ec2096ad397f53ce98ea66efe9aeb7777777777f71719ebc7251d87a2503ffeccf97dad820fe5e41cc3c86d3afd041f8f5805dfa77b9f77aa2f5fe49b7a30a0a757dafb4af46abef928dd9135fba8398c2a3100ecc1aa8f4ff6ed3edcb568b13ef5e9a2bc97aff6c4faf23dbe080fc798d525940c318f7d89eed9b7faf29d5f8487ab4bcc63d7b6f387d8ce5d7df97e5287d088ccfaf2d51721f8d98988c7aec474ee44e5e7fc3e4964bbf753bd9aa5378a673b79dd9d4ad9cede7dbb8fcf8665b35fea0d9b3ed8b5fb649f2f51c80304a77ac6a43ed6efcbda835337f8e02f24f2e99066116e950c7050e67e4816bb90f8f94788c28218c38486b025412e280c4b89455cc7441c170f61bdf3641ea9a4c4222e2341cc760075222ab3410cb2159cd4b9241add9f8ab8a754958a051d556fcaa55e9b227ac60655af4d0aa5ded45bea3d4a25657ef54eec1c77841d754f8987f9280b6a6df12816f50c760fc33115b96c8c2e842a320a329aa7cf93a2a05e6147f3fb50a83f95b2b1c18e7ac5443d837dceef43a17eec08433a311949562731111331910d11b3ba088eac1e8249dd17be6c0f036141f66247b62fe5fbd8b11606070cc3902476592f2f91914a0b2590c58ed2f21c7cfa093b7a398947d1a857dd31945894b24517c74e1b3b53ea57fed5af57dae72cb5ac9cbb8f067b66d2204cb02a8684532d34da12f62548442f27b5c7545f4e9e9d641f827bb6d2402775888e88b651251f51039d9cc382580583823023ec8561737acfc16a38c2302cf380c5b4ac657a894aa1adcb4ee4149cc25a9ef29363471852afb425f2281bba999029c522937a55aab3aa54cea32b5fb264c9120dc330ef68c862c7b22516fb11268f2c9652e54b1a49238b5d2ee9d59cdf2797b04a48905807abf220273ab02ccbb16341584b47ca4f280f6853ce7129345a13853c2a746aa00396854e0db02c173bae55f0b9a09e835368b42a545a1616ce44dba312a8ad869dc39e7106db94f21c8ca508e18bf12952a867b06f72c862d73c212c4751f9510ebd202cf545a5e39e7209d42bafe5d8a513ac62397639d4ab52afb46319e632e71176e4512528dae3551f9fedd97d56aea1200f76d42b99d433d8e7545179c765ef3e44a67222debb2f513af7ec2a75086da52ee1bd4be2dd4495a49c8576ab572bc75a0ebd17214cdf3e8489e5444af545e5dc5b2a4b1dc2f4954ac4ab2f2af5450879ee44f4bbd76ef50c868261d8ab8dfa0843821d7b018605590c6bc2626f200c1bb218861171190a8661d8e386999edd47fb159cc230a4afc38e3cec68c38e78b44eb24e6a2761ef225661d8fc504fd9cc06fa2a0568b431a857a6638f401d5b71a857ae5e6dc7b048941df2bc0821af9d887e5697c8ded9fb4b68ac975885803cf1446f04b25877eda6fbf870cfeec5269cf22886d433d84dd839ec1df62c03b2d8b52cc862df5a167b49c862476c546311a7b05fecc8623c3ef2fd21654c64da0d0c384e86a008b161aadec6b3153e2d7c1093f0527234d2ddb1e39492c5cd30c8d7fa59c598b18a138b7a9450d483ed854ad8117760f0f5c00fc1aa582f9cc23624ea910423536036680904a7b8dfce26108c793a7a2061e37b7a38c53ba7df69e38ee9a56750c77be91ad4e15eaad7882ea317099b9ddb680ff7e0141f33c2b7f100e239f844279c512ad9d2f9269ac11917b099bd6c238c6cc2604de93b96b0d1721a8c6c92b0a6c441982a9dd33a8eded9713c88d8f8d75f256c2681f7e861f6744ca955097436abb37b619dd180833237a00cb8139dc0b13854f3b00708b78e57de7584d423e20cf8a3d2c2c2a804a7e28f883fd109263908ba102935240171078713031002752470040e6b71c49df81367c45fce117786380d20ee1461fae57823e24e0224007516d0ab2e1a11670cb100a843005813dfe3549bd82e6af108cffc1c7d174e07f023f482688b5db9dded7d588d88819d01ac228e00a6e2670a6c7ce682268458600202409d2802581377e2913823de0914d878a61b031c80d5cbcf8e653fb6b12a7ba65875a7a56161c2ec38d43567050eca30bcdda762610b19db38387218111591802a707a00811371448fa23ada821ea6823009ec107eb4d0fb615aaef7015605a6fa1bfd60aa65aa55be6e5ae61a8488659a4eb1ea368ea00b96638c5e944dc02ca3907eac84eb43990b99b06cfc91dd7eb2415213ee7708a73e77ccfa8e72676a035fa236875e101ed0424e75e788f4bb73517cd1ca38f478404e71bd3382d8ced0422ab8889da77195b043dad6bca64e4ed53c7a3a68d4fbd99a7a67d4989cc3c249e2d4657493468b1d815ec653ace273a569137c2c671f7c3f17196ea65b013b835e86e8def39e4a6406f5cc04ea99eec177719230a893811c0d4495cae3733890f381a81241cc2941cc494154ed3c3e87055195f3f89c1744158d4797b3d0979a64c3860d1b366cd8783174f362e8e6f066e8e6e6e6e6f0c68d1b376edcb871a852a9542a956ab55aad56abc3d5210e0e0e0e0e0ece2750af8408ea554faf0c70172e5cb870e12226262626c6c561cc392168eca13e3d06a03e4a6a2ec4fbc8d6a45ed538aa4935a926d5a49a54877a65a3d533f173be187a31f462e8c5908d5709f5cac69cdf8742fda994ead5ab9b39bf0f85fa53a95550af6e885645f1737e1f0af5a752737e1f0af5a752383fbdbab104c7d5ab1b3636a9d48f427ddfcf9cdf8742fd2e8e85c67822c612ae87b2e0e162d7435d78503c5c773db48587935d0f65e1e1b0ae87aef07059d743557838adeba1293cdcec7a280a0f57ea7ae8094f0d4dd273217a6a8c253d13fff1705cd7434f3c5cd7f550130fe7753dd4e3e14c5d0fed78b8afeba11c4f8da35ea984846a1c09d53812aa712454e348a8c691508da356af542fd5aba57ab554af96ead552bd5aaa57cbc6db30ead52a681564c3681564c3681564c3681564c3681564c3681564c3c8c6df00f56ab52aba015a15dd00ad8a6e8056453740aba21ba055d10d908dbf21ea15ce0fab5738ae9e89c7f9b9219af3fb50a83f95c271c5df58d2ab18a0be81d4ab96a29e89b7b149a57e14eafb628096ccf97d28d49f4add80c3576be8b48de48bf1ab12b2f19a6d241f8c5fd5cbc6d7d0cc36926fe6771564e3bbaba1986d245fea775564e36ba8b48de4ebe117e7c7c6635d0d6ddb483e1e7e715c36be86b26d24df0ebf3140365eeb6a68b48de493e1e6668ab18453f13514da120f77d2f5d08d8743e97ae8e4e152ba1eaaf1702a5d0fcd78b895ae87623c1c4bd743250fd7d2a1ba1eca3c9c4bd743230fe7c205d5c2e2e2c514a387421e2128e4413dda22d896c3a8d09621fa02a9eba12f907a261ef2d4742ab465a8e58996252d50b4b876680b9316224ec5d3a02d52702a5e081a796a28db1eda3c2f8eaaf820cf12dd0ff08bd35264697ce5384950a7e6f12d45bd629ef81623a8030475a28d479d8055321e0f4f4527357fd979cec7a9979dba83ed4ecd735a515a171b9f132494e3c48aa628c7470a1b9ff3b39353d352c4aa1836b60cf5eac551cfc4cf9696a196211b7fc487bd218755535373583849392c1a94c54f4550a766e5d76607676b2a4e5215be9baaa1a9a97100fa4204d7e70e79209cf141263780c2ba58c8e4062d7b831fcb4fd1406ffef2693c9e866be8d4c0c7a7515335b3e69fa7a3a6e6f37a401f5c65a54975e6e9e07711ca3605693b6958c5b5c66b0e3d1d3857d4a02ffc17e77bf485eba9e8d48467e27b0b5f0eabe2249d5e1fad327e719224ace13a3935cfcdaea32f44c013c1583fbe44777878f67a7e1c7a3f18bebb0c3aa31aa162b70a3965e343b560f2e124f50a888cd7a85820db6b7e8d50b140647cfb0c19db6b6e436f116b7319f4462b833f633bd75cd3f80f359ff4aad8a932afcdb7cf38d36b848add3ee3d0d321e3560685d686424b83decfcea853460d02b0bf1001fbf007bfc436f4465baaf4ce60d97819ba03bd31926c3c0ff4d20cd9f81ee8a539b2f1297a6b5a367e86de737b2627b63d3e6a3be2f90790781b709087bcd684d59ef1909f5538819dcfe6fc3ed4cac6c6f68d86862f48bc692a858f099bed2dc7b68deca04abeff4155c4a0f6437e1e63167793cd746a40f38028b2838d1548f679a63e8244ec4086442be3330d9c7c94f0c55134ffa564c0b82a3836580c6e8965dadc4a5ce7994edf094a8aca0a4b0bca85c54b0b17303136be20642cd7e45d0cca9669921267436754d8335c513ca2c20a8b9dabc2628f4716e38ab8a2f90d897a4fd0ae86c280f199cb3827e3e990516b7c3064c080716e87ce86cea8f18666bce67c6e6606cf98c1cfc139587677bff80eefee6e9d777777cc73dedddd38efeeeed5bbbb5b08a77a77770bb9f17777738b5542f8e6dddd57b04a888d7777b790951aefeeeeee6e213452de424ededddddd6d04ab84786feddddddd2dc32a21326cde4df320b10e56470360a77dc0d1c30e9165e6188c6373e6397807cad60700e0d8e9a1a94eaf500aed0b0a5f744ccc73625476c8a16c7528dbedc546b7968b3e4ea7b8a0d0c65018c37271f9ca056545d9e250b631cda94e3868a7cbe572dd78f95e284f97c9cd6ef1cd69b258365a4c6c6f5eaf570daf05d562c3e572b968a4746c354d6b9d7027d06a2c96772a31b7652e97cb25c366da50e6b2ceb845936934145a19d863f0d0d550189731f318b4ad6cf18aa710cd25125609517d7505afd8258fb84e606984d0bf38cddb88573c5fdf91a579376195909bdf38cdfb095e35ab67b04f286884b878cc69de40bcea19f4b52ccdfb08ab84b8fca50a5eb5cb6585eb0a57fb1ccdf80a11affa5564d4af179396db38cd594eb09e60416169ce2d9a338b57b2d5e29f1603b538e80a1aaf719ac72978255d5454215d56189d3ce5348f4b78255f3d837dba681e4fc02b6c22a1797c82e611c8fba9157f5a343f8257986b0a9a03c12bcc6584769af7609590ed3487fcfa706c502d686e67699ee215f692a9b9cd692e7995b17a063b8d8cc738cd539e0e1a7661d7f99d38ece257af36978b5f2e7eb95e16db5a2d568bd562596c63b55a2d57afe6ebe57ab95eaee972f5cbd52fd76cb5582d568bd5ead564b15a2d57afb4d7cbf572bdb0cb57af34974bbe5cf2e5922f56afb4568bd562b558ad5e69ac56abe5ea55f67ab95eae17f6c25eaed7cb62cf58bdca5adc42a13216cbb65a6fade25531eb21d5c337a4aa537370ea0e34f505e5e1b5bd362a78c5c30ecfc12fd8ae28b42a97ca455dae1b2f7ef3628717322f9e83b7966a6bd1ad45d38aa1b90b1a195a6328b42e28db1b14da1bca76636dac8db5b15e5eee425fc43ce675f372f1a279adcca82e605c7c0665fb42a175a16ce7caa49933a68d16fad2e2e53978ae4c9a396336df85850b5b1b6c276bb2266bb26ad0886941b5bc5eaf57ca09cc0a4b0adb1a6c3597cbe5caa68b14956b33b46ed5d6c96b7182f2937b946dc65663692c8da5b1b4eee5f4fdf49af1ea17bf368e8567faa6b1cd5c2e97cba6c6853bf68e7b0ece5abdda905a336ae562c8a81bd286b4217d1bd28e68bda12e7cf2b363aea8e7e48a62700d65cbf5d0cda07c19d47b8253d861d01a0f0a8b9d599f91c5ee1559ec93694ae76030c730fa92943ee372124fa14e9f9bb73883993a4e618f41a1854121639fa19053298abd07ec3c4061b1ef203364b1bfc05e9bb0d829c5fe208b3d063b4c3c62b11614f6cc0b761656580c4531ec2c5358ec2b77a2e038c1f9e88962f7dea1b8194df0f55988d4aa1069af376431ae08892d47d3458f37a8d3d5db01acc18e7943b0067b8fc11b3a01c54411e88083322c8e522f8d8545862ccaa135991ea4f44bc4a2a45805a43bcbe139169a42a12ca79b4e2c2867a92bcfd12841b897eab9f06d67390bb782625aa9283548e9b75bb9e9275a8394be72d351e89516e52bf4a2acd420a7e7e81c8c42a58d50b00a9e9b85aab0b4b7c3c55bc09a4bc4a67c1ee631ff3998226cca69026ccac52c0ccc29ea31d485c56368cb61e8edb129879e8b7a8b0cd9947a8d804516489014d32f3c6af18417fa838c6551e30fea043786c0f253e845a2ed03528e72161a2425252525a5526005e5a69f9c85aab0dc2b9d57be7214ea9dceb2424f47a1dd5574a45414944a8193af22e162b99fea4d414abfd276350857937840dec82c45a29e318242a18ca420a471a30f2cdf084ecff027479ee8ea9927b6f015d133dca367e4e51f30db88123dc34630a25ec1cb7374b160022b129bb3c1764e7addad6d745ed2d99534199b61b6b3b05e7e3c76fe3cc7158bbd513ec7da27cc642c27bb98868f0fdfb0a5c065df145f13d4cd075d9048e32ea1a4e560cc8674635869fb09fbdcae95b6f93ecdd3f9744de5b30a3e2c5ac8794424ba6cf964215957b2524c2a2d2b37345c94ddd8db42fdc2715be8d49db8a86a5fbd7332333333333333b30e7679f97a554411bd8a4344295556228cc844d4518dbdf795ac3874256b65e8c65ec92ac25aad168d8ccabdb14287d95ba4641dd1a357d28767b2a34af57e5af56abd6495a66d92d5d52ba160a957ba564a37cdd351250dcaf43002e809a378458b091f1d196ad2491249e7e9d8a0f7a33b7793463b27e7628aef7a875a9dd4a33f5fafe2d097ea95cbb348e452b9a8675e7ea74b8a4a853d233f1722ee123dc1f64824051721b1d9b329be264fd84c3a01a15111ade2add659fb0636fbe49564f54c86f2f908775a28cec83e3f5350a48f5c0285346a592489a44b0ee1ca20b05ab26e3bb1d5cb128a1fb3c8f4300208ea70348a57708b99f0d111a8c34350873b09ea2039793ad8c5fb713a9fa3b593ac6296e938d6c15220da994d16d5a57213be91bdc00dc80ca03cfbdecdeac9c2c9b4132dc4a9ec1b479570b790906d091545c9ba421c6aa1a199a1aef8ace87ebb8aeeb7a9e82d78cfde4ef02a12f14cf6ccfbed2ed88cd9de9e22d5e452a09810f513367b249a91e874e8ed60e1a1b3f1f1c9749a9387aee9e9256afa4653aed1b69b646525ccc7e4529d967232691aa432e533e59432270ccb2a1f3c7ba56fa5deb66ddbe2f6a9d5b96da517efc73637493ff6b1d97b38e1263d74278a721f25df490a2a967ee7519e8f5991a872a6eba8f649210f9632b72ebd742a3dc8c996ae452b85787e1fea9f2d3494b27dfe6ec75ac8c5f3b1d55b42793fe6bb2211eda95efe26599cca6ec2faa4858f7f20dbac7252e1bb9235af5d429b2db19984c266d2653326f34ba91775aaf7ac948d4c0f23809e308a57b498f0d191a1269d2491401db6da59a4cbaecc8d8b5895cd9f844815cf47094697ea550ba17c92a3273a39d5422a55c824a4d5146ea27c28188b67b25f16ab82449bf24ce8a64513240364b3df167c555cdd8772fae59b7ea58fcdee22e5a7b737b909a7dec9a22ab49064b590cc00843af3d95d5c4e4ee65699e18a0f96f33996438f07cbf92793772f4a6162554a8d491d17bb1374e1b829455182262c0c0ba32041926d8f47ca4fceb57732b10059394b0592f2931a9b58a12aa667f508145873c3f23b8874211c4e7508a7b22390222bfec4ac63ec1b952ccdfb308cea9846beef905392c7f71ccc3c58de7d7a3cbab7b4948e84346df3414e7656d43defc7a9542f3fe59df743e5f3f2579ea35beacb0f1d90953a55aaac40526a4ce2d40985b7937713f56abc8253d90d0e0ecb8f49fc8e7f9866a69bd28753d93bc9ac2336daeda92f65b31410fefccd24cbc75627a7b2cf0a5b36c6f29888453079800c703e9383345fe48990469fee3ab232009bf080ed48021b57d0c4fa4496ccc2076b929ff364e733607e1f6a26427916109c8245ccb2f045cba643e95d7a97ded7b228a9f0754224b3410d70879ff5b34796652446ea39fbfb56a2c4c2c76b803a48f0b3ac8960b34ba3afcffd36d0f47cf44b7d66035c4d3893fd6339a036603317fd23230771252a99461be551235d796405a7b2b3bcc287bd6386d459866433236f079760966d5be528bf44239cc15ae99cb6759d562f74699b76d6ceda659279a6d20adf6d249b3d49fb6d38d8eafdd0ce48ac826d4527b1e7835bab13a9374e6a96c6e2e6b020017845c32be01547f6240f656e64d1e4e3213919297c575a086b5a1e0621e31512497777f4b110c201aa0192e108e885efff8818b1e1e6897837f2f58cbcf4c02462e490c642d8041a5918bb571c1c167ae7ce49efd786f3badac3ddf6c8c63a02c90824596bc271271b9f3cc9589cf86e4f47bcf9a434c527f09b25ab5a07c6f682f021b1cb48296623a491916bb06540e45f7e90df2ebf7d7a363ee338eeb6cf6bb0464e49af0422bf3d7a3fb68ea50e7b73584d9b00944c2f1319b0cc6a4f0707895602e1971d46b01428c2b2f2c5870f56de07cbd54224a295f5c54763623052c2168ee00937858d5390e27483600883e01f68580521d71b7530963d3247ef07c38a44b47caeef41161f691fc29aec59d5aaa7a383cfa0ce1069bbb35093521e3b33a63110ec439af0c9c32027391f6b768d5537f3915dc3fec918c83790e959989d6990d30da2cff7f27cae138b110811720a429dec177b0cbe68b143acc220273b67f0c14397c5b07ab30f89d23216eda4b16d0f862441044036868549084118dad371bb02c98e1d883cffe031e4dc64c836b310f8ee67777c08b38a7df05956c8150c9c14be4b63251156dd688940ede4b2e8eb03c1a9c8052570e1c7f251ae842d24d95b4d3b6be728486064b34b09e5235cc5a0cd4217163128b6ac2c793fc458ae4dd8f8ba7336bee7600877501e7f3c1f7c6df37e58c2a29ce98d29e77a65846cd7eccc9a0e2c7bf27e50ab55860249b27ce7020d9b44a10257ef88323242f49cdfb7a38747a68387b623c88e1d3b22843076a1344b2fcba523cbd78cb426560bd2882c5f0bea555f636259430290168565cd08968b60f9f06a42b03c6b902674b5a1f9ab314bbdf3a7abe8a23883cfd12ed176f5cc12da578033a6e0d45050af609cf9ced7804ee7b7d0cabfd34d75e5b146554b2b81e5df18163ac1435c759044459aa86a0b3f037734a0388377b6c3d7a86aa1127778ae64329934968a0e53e988537cb54835ce4485f4926823121d2613d521e5922592c5c23013c5962cc9b22ceb4c5487a6699a896a424273ce394db4836e7b3a5e2f1642425ab224b2220b1275269ab2c568afd6b24b4c5487101662e2a1ada077006b385e0b82353547ac8a67d85a50dc8196e1cefced2bf41496b9cf81c923cf2ca6f3351f56796f2ba858aa06747b0a96b9fe6449967f42b520cb1d74a48520cb8fcd3fd5db58b07cee470bba3341d5c6734c5d9c1837b03cd8c891a7859294a2c964327d72ca74e8c59fc953e2e8d7334ddf3330e20a0400ff04fad0e77f2d3006aeb8b30c7e0f705592549e0393a70f9bfe7c3c7de899687bb49b9466f460e3351a1c3f93a76b09a98b4826ba48c45054e0628c593f6236fad8e1d90f3235befef476f4d9fba12f9f6554a63166ec5c2f10ec7d2a656c112cb68be3da0d68e078d8412db4a45d4438af231c249cb3523f380d243487be2528d7895245464251a8f58aaf78343fd4539068167d46471009fea46e834a7ddbe7fbe763c94108bd1fa22d75d164bbd11dd1f2f4aae7fc3e14ea4fa5dad5737e1f0af5c691737e43106908220d412424fe9cdf8742fda9943c62acc541bdc28c7a863fe7f7a15af1f5b2586b7e8c197150066463934afd28d49cdf8742fd291bdb3fd606d9f86de3634836f2b78dcf90c86ecc75b7d124d827ddc0112c56fff42acbfa27eb1f18675ca2db48446439c29a780e6aacc65cdec04199fbd2f2c1179f0d71d90b11d912d3d53398a47049cf6091873b25b18a93efae2ff17d2345784a97f5257ede48111e79eca7a45ebd44ec1fab57de8790f71e631d8223322feb0b578407c3e8a412081c4f495a8a2bc5c8ba52882a7c10be3b5b3c17c7de53d25c72618aebd4c288e8f34a3711209f5522ef192c096a09cac64b6940f8525c163b0b977c694ded091c94b93010462b234f84937f3f202b8396b4e60fa7da9424fe87de096465ac93d533f197c5110fb52fa873c40209eac018bb071f19e02ac2a8062be160a54b06acac800d72b27d27b592eb8b65e561d7d30bd6481647a7178b231655b04a1e1161863803e23895ef5349911d2f5bca9651de4a086b8c81dd98ec8ed816b8c8d9ca87ab4a623c9098d10deac80cc5c24cae346ae502514991a162440a4a4d4a04504e68502470f2c53899c07782f11d7132cd9c8298bc944988d7f5e051a0e378e88670a51db80a9436991212db7cb12531b53a95d0328abd6586ca2e60251623318049982622db052fd10c6bb0334abe23acf1b4de344ed29845c96db22327b9d811153f6f568ac7ce711a1313d5922356e1c95014283092d9d9c524c8c22b2c540293a4fe33e6e6f676a870aa5b7a5d6b7cd99b1f606fdf0894651d1da72666b9e6682d3b63dd1166fe61e6ee037c68e3841e057840db9507b48c5dc141997b7245407b59f86ce8c3b04f1e2b08e214d55ef66a2f3b35f069cf9cf8aef6b22fbbfd6aaf1d1c268fd5c9297972453870f150e69e78ce07f5ccd144fa3a49feb6b0127518552c7e3b179505edee42bda3a8e99c8ca1a7c350ee2e68e92de8ca5f28cb5ba86659d01311a7b6bbd013134e6d47d1938b53db6550afe64fcf6cdfa60c9262f8ae0cb2dbefc965b76b84f6b2dd4d41deb7cb2d63d25d0bc55aa86cd1ba9693eddcb64dd3f75fce0abb9d85c2965f919f3fdd48565ea5dec9fab1db49bd2dacdcfe9d68ecbad2d4c02783ac3c5f1994a3392b2c3f935000e943c891092eb231118b6c9bb6022dfc5868a1cdc2b9dfec18cc4ab0a68fd1ae74292bdc3e207d0975844858d34160873cbb4a4e417921a720fc578aad04c9e722c62760265ba9542a6d496d4529463e127f7ee2cf6be336fed9ee662ffff0112bace41715ac1a825f349fcc8d3f3f3ff148c70313ecf4d0c63fbd6a263c23df4d15f92323249338c8b0880583c4c2d7af0fa9a5943f52e5d9b3c79f7804ea40eb8233f27322a1b74fcef3d196b3f17d363eac59ed036be49cb7e97e696e5b73709bf127662a50a7bb94ef232c013612a08abb7cbbe20ecefb0a564661e36ec36d5ca95756b652c3edfded5d7715fab27d6efdd347b6666d3e5067bb7c1b81cd6a56bba051d021b0f2dca6a96ce7b696259b290a1318d919164661821fcbf18cb46178e692278d3e6825132b4d40d47590551cfc6cb65367e3e3e24ffc916dd034ed173362e5b55f39872aa8302a6ac2538af67670bba4d117af0c902ccbb47a65ac76b259115b9a5d022c5725a7388ebb3899cd44cd792a7c5148b450070c56bebbe7334c32e1148eabe7f7a150bfa4e2bbcd6a1f295c4c60e292524a29592c168bc562b17c5c1b365db27dc0f0dd1e926c4fe023afb0525ad171139e8265b80a2b2fa998f218bded81f6e154b338255dd375190a2c7cf2d5ae0f494aecc74aec88c54260a5e95a3713a8035b7eceef6b1ecdea151fe119f9134c245f132c963cff3412acbc8cfc6a386575fdb87a157fe08cfc9c50421c705e67e3f3bc20646cc7a957119c924f80040197659f583639149439b924de332aad201f2fdf4c9a08ea942e9b09565e1e61097085239100a54b167581e80a561e421985392f077ba39d13c3300e05659b1cf732bf5120dad24df4657ed24c4ea338130075e6e5150057edea22589575172e34326a43d119ac0c8365dbd121d276d22599c01a29930067a8e8c2168caa50249f60e56f13597921dd831c61517e4d520a17ab98109d529ef2eca77fb2fbce9e8eef3b9db0792e4be1d3fc69a6f048a1739ed3668ad6cd393714ed5bf61945098eac8c8551948089d5a228c1131c8ae3b8ee42970963951d0867749fddb743264be96c7c2c2f3f645ff9cab392a7a3e59c4ad772ced3d1f21a5f76964b17ab4c97a6b37ce51c4b17b31fb29b584c540a2bb7b3502198e999c9644af178645f39b742b76fe75aba8c5ee91282ed90b12619cbb574db7653bdd2b583ddaa74714a4ef1656f79e9924c54e6b72152d56442afab40523e24f60905655e660eb0d9ac570138d9b1d27ca9b267fadd80687ff1f159ed9fe532bad52b73b363d7a8b723476bb4480a95dd7783e359e61e8a3b1e9cc1cc373a59fe90953e3c1fdaa7e7fdd05e83445befa540113b04e3b21216042abbda0f323693c7e9d510379aa0a45859c1ca4fd9a2fb30d7d63ea8e0a0cccd47736530af43f50cf69d446be34351752c3009c7b281d3ca31ccc6e765d937bb13aa633b2ad350a886718a131aa1d7b272169514ed93e55c4aa7d2ad7841c8d8d34f4ecc473cee08dbc4cfc141da7247e3149cf28e9d08abba0894345d6ee3fb9298a63821c23c545786a24fcf93e9d4f6247a3c68dbef2792552c876741448907f40c8eaf4258c352a39117a205e02a4225a08e76ec012cf5a46925cfc4e28b2c94080ff110867d7e55a0ac78cae4e9e8ceb5741c5d129fb0d83d9894d499a80b85c5a28f08a50418be8b6384d338710a567daf625af1c52bd8c76865faedf888c54eba1577293b0a4f68eca465ef078ab783c539e55c54699927ff5a544ede8f95971f581ce5282cf884ba7ce5c4e5f32e2c942d6c14a3503b5ccec24259b054168f2b73aab470de0fed2a1509966f2f793f5258fee960515f7e98299f15c8c642514fa13d38859da240e1c0812f68848383c3a2bb11e5f168161616ed2df5f20f95b35424f8df73748ba76305e5f158a940be0f49a12857c14e19b0188ae94458753a762558f51d6b65d89d6cbf93893749d99561354e7050a69bcbe6799ee799ab987c1424da0993fa4326647b046d6cca76a55927df3739198ff8a85b1ead6047b60c4771878f613eb0d886c9eddf4fd30c7085311b2c866118947cd412c846d9b14d9a46b98aa32f7cf27d64b4c47ba9ebbc12e6953a93a95e1c5ed6655e128e3b3ab21812d66ab0989c47acaaa291a08e0ffe3cc2308cb551c8725e9b1a6f332b95b6996540599b863828d315017570704a9ee5e56a9bbd2ad51e70a6b908a8136dec01b1103f32c4233825ef85efe25879207e90f1017764e20c79f91e5007fb87fa52f236dc7cd97879192cd8f8a42369c1ca222c503336050eca7030acfcd52cbcdc49c519f217b39063139086364c6529f9962c4b452aa9d0823ad04ae628b3f0f5b16791c562b164608a06aab03363cf9a6f338c5b580958e528eefb1a7bbf6cb0db63b1ee298a41a15ab0d82ab429b08845351273ef1d5339155874daae428360580db2552c85de255c36e5e41f0bcb39245c6c12ef2de762f7712c2d261595abdc23ecc6e2303f1df2eaef0e79f5721731ab16c7fe32bb7abf7f2898937a51dfb1b3d85ca052eafd625a50c8331836b3712c29293589573de0b577e8512347784622ab67200d971b8940405ed7b85c6ee1bbf1655fb1d5331d877aa60f73efde3be62c0e798cb4f84ba31e73c863c4c55bc4542330d57bdf054579f5eb199416d5c8ec1994a37a06e52b2f94058570e6abb7c8900bbd44ee113787c52acba1e55aea65a9d8b9af505649a1a7a39c9cfe9d3058a415e99888454a32e50a1c9431920312dd07421bf01c380f8434a20dce8d1b97c889189150e3fa49ed08ac3211234ad8cf484f8445fdf76525226f8401515625fd6e2496188beb8ecb02acb3a8642cb6a549cd32854a00000000009314000038140e87c5a2d1702c4d5561fc14000e8ba64e7c589b674116a390510a10630800000000000000009b00007e13dac4679029cb46983e4aae9a8f055dec1659fa219bb11bd79b982b4e359a637e23e9f818b15ba9e0a57a63c4ed7c8e16809aa9fc7f84104fcbc26e5c77ae4419c014357f850475169081dd300005d7c253075f62450529fbde3e779ec572963df1c06eeda37d53b0db34c75619762975b2b8fdc39583ddb261dae428af4d9c434478e0eed2398725fd01675adadffc637ef8d71f289525f93fd80d8eedc4fa00d71f62beb6ca45076a4aba4c6f68c28bcf95cb4393d861cbbe6bac63419a8792b2e8582f51d8f98eccde021e4eb5d9439ef490134d5a9ca58bbf436074d6dcd557550c1a2064a1042d57038cb1390caf4c2ff920a4b18529b48a2363132f2e110aeb19e66a09b721590b6ab184aca1f0a0910117e31f9ab922096ce0d3b161ef8a7c761260509d5a0e3a99e1c5c82fcf09e1a742e70156713a374285d83e35583ec39b0e023676de441c3eee75a94d76492f4f218ea72954ea3fe23ba9ae019a91612e3ec4d94f2a49c0a4501ea888b3e7e8c79fe956f5ba12ce807689d23e5e3a0b6db85e4d1cb316ec6c4131793b94cb8ee8ef70f2180a60d30c2b8748c01008fefdb35f0df6a64683b0585896820e8e27504b21a4bd274c4eac937165c2fbde5ec7b61f6feda6dafd1268de61ddb531e2bafefb9737e5fde7feccad7fa64813a24d766d64b936d9fddeefdcdb2e7d59e15e47a25ba46feba6dde7fdb8cfded38f668168815090694509a2a476e57c664cde178af98b321aa92bb75f04c85c00b64090932b9bbd589e7de73a2af1f4b842af22936f91bf7365e84c4e663e198c9a3b57f9bd86947661aca88a37ab7e953a752eec9d105e7769e45f131918917b361fcee2b11066c9c8f211fef9afc19050d32dce8a3194b3cfbec38af1496225e14d90010419a0cae41dd12d349d1790524d8ef6e5291f45a12f5c2928d3c787c69acaa98feb6c16e75dd4269dac356f106d22edd46745391b423fb50ed5b019fe55f29785204996e0cab99cbec7ca8cd2d6e1f5e2da951a6bbec516701faacfb5332c634f263c16d207c959087d8c3978af8d7de8e7505dacf3f8406cd54c5333ec8b4c81e769107d8999a820ed6538ced579a62a7e8778019cacfcd00013d21d85264df1dee326b67db8f78413df0604afac29a5819268cb79c7a144f6c14a94dddf0de2e6a551ca90b452748b1ca4b7bee445f1333b19c79719954b5cf2116e410c4ec8590b7c658eceb8d63918206de471b8e252d044be1c229eebd133eca3aa465bf1bdcc34391215c172a049babe5df845ee1e90ce12bf0f460ffe042568051ff58969f3e445c73796456f410320da9fe40b389661fdbfb19f12af604ed89d831f3a90c11a8efa20e2728d80a5c465121e51aa3a5befe77e8c269552e7a083fa49ce436d32591b213b33f84d8409164caa246ef8110909cbd2071c6a6b744741b4aa95e02c24a954c62dc4ac3b104d6d0cd360264b0d32dce1030798db9f22ce31639458817dff53bc37a2904d34046090024def2d368591818f270aeb1b9c14ba1f3f54031383fc607ff5134b30086836b50589572cb5208082e0a0509a5790dde189deedfbd19e701a772a147f5bb8ee03188a9bea87ed383e2f343353aee4a1b6f771e001b5987187cc6d7ae0267b24f369b34580719680a809a2f3d49f4a5e09dcc2a790355ed29b7009932d8e3da9e90a79741718d199a4620c2eb9c26d4cd74d8b3d0a872444a9a95dd7933a2e87e0c836b9a5961a0173165ebfe7092cd4804ff771dd242eed8d883eed1ea2a7cc00acf794e7c1bd186c733dc153194f0896b91aaf8897cec23c8a234f095fda46641619665234d19f26140375ded1411a85afb100df4218f2709376a4d8f9aa5cba006a7494a0bc36358357b4648cc038e71f2d9706dd6d304d0146be6c184525f1113b9d2e59b8a539c65b4ad27110e1cad89681311754d274f53931947baecaa4eb6c0abe58e3a3e043218395bdc4f813a2c0eb3d407c723b99cacf19b9e859b60faec9561e1ecc62dfbb1df061002c8c6e53a131b6f1caa727683db7464d58f96548b018640e12239e68eb96dc20a005e69711bc4da1c5ce8082e77b69d2a2defcf97bdd76b1a8851bf7baa3656ab0ed8bd3f0c7d8365065886bff8472986addbc08038e8531925fbced5b4f4e353913cb4110f041486758069843c39be423be45a988c8b68dd1b52074e11b4be456347213468bce21aee5c5b65d4ce7d0f365b48010c5bd8c8eba7bc123e9b526d55830046ff17c5a58e39a5cf969ad16f2f495e4a679c8884a68c7a70bd1c439460e839eb5fcc182d7454d67cd3a606eb8ddfd107eb9dbef0f0d4a1eaefbb86f91053cb31a7da8d5a167bccc14bd580bb121b647497a1234a32eaa503428f402408e2bf34363f93eef6ecc25f33f01777e2a649ded35fc4cfd3e6a50b0c0d65595254875ad5148d3405958558897972990523c821a7051e9bdd60113b7714011363ea3edf16a9e284c07164ba436fbd4ab919d2af0b0709466c68c3ea4f70628734acef87fcbc65600a5162f280bc19d8466c657f1735f4d23518a84be12494468b14a385b2fbd538e1527ad7b369775a3d5c72160d41d91aa9b289e2aa689d4e022af1d1793de01008b3fa9ab7ab2906634b91b64ef16930a11f8c999a87b667f42e917b573d07d97a82bf3d2a866ed4a0ff7fcbcee9c5c08044463606b5482642f66180a24027d2e141d85ca38bea1476fe7b3c4314d70092358206f7521dbc31f420affc288b9d833ac6f66896339f9271192c8003ad610ac848fe59f047589a7426682037d719ed1838d6b48caa4075064d414d4014e94d4e0e4f83701d63a93b72764e378bb9c4252a279c335bde6374d79969720cbd87c0d21fa721a3a2da54b901dfb38db735de22eb6ca5c45f79cd46f6a2fed9634179c97bf792b92883546c10f33b89e3435997f868a3eaac69d69710191e2744c92e14f7d95078f9162ef42b142a53ac1d971506269621f1be4e947aac2357716ff53647f1142b6d0e9feeebfec92fd7eabd32911c209ce7133aa9d1084acafb0004eea1a5b7f8ff2f72cf4fa0074b356664945201a53a8ba6c1a99edbada72a5a95a9f2504886121615f5fb085376fa09121eb43555bcad456d55b87f498cd094a52018f8833f687602bb98c2dd4fb5a81f81bae7db9fad7c44735c1530a4daf20cceb7af10b63abfa2368208a09e9ca258bacac770dcaaba054c712f76ef1f6edd730b25210c82189e4d18e1e2e982bcccccfbee920806d6122feac147b38c60fde781a419f9e1d95f67df653befbf7218cc0e9678222424e8d31fdb23542dc06b99554889e130a1cb7621b572bbe01cea7ddef2afeb14345ff5133da6b8dbc32a9833a42cbb9244229bb46371aba5c891e6db6dfbf9b8182d241f2b2c48b341eac3906139a4239268b75af0493c7ba55c2c8b1dd9560f258f70a1869ac4b059414c35d19268b75af849362b9564248315d1560f258b74a3839b6ab12941cc35511228975af24305be6a2b0b0e80a150f3b367e98f6166fc1699836757f8dc095bd284b10ed5a29836a174a9bca84920cecfd681615c9aad8ebe2f97a33638154478ccdd37102bce5470054822f78401217665f7ac4bddc30211a0cdddac1cd7f76488d5b9f18259fb7505aa80e2ca9ef43909733884f642326cb48f45ca92b5cca3d70a5c557af6a824d0ba66f01e98a7ce4eeca0907647addfbf5f0bf136ac1a147e6f7d6492a100c6143abb56bfa07b819fb86cb06080805c2066d927f44effeaf71745583e76c87011b980a2d984e5b972bda6d6d0bcb4030b46dce6c34b1ac99a4dba90629df08b976bbcff12a6d312c4707a383a44166823f7156a118682eaba2d359fad64fbf5b58d4ddcbf096226bee95a89d1a5c59f01c5d3afedbccea3f809312802f3c541c9a422de0423f00f3de08f88aed92272e52a07332b7b46b20a1fa1052d056a3910ef3703af0f153d40942f6054be74a5f3e2e0bfcb0ffbeb0d1028e1d44d8c20594ee63035c6149abd330aad29f8c685d4c7ace05b6c9f96b76169472accc4a30b97a7f1f4134286b7cfcef8619407299d9ba52322f168ed81417866b791c644fb158f9bc77baaff90cd860062adaaf1f01f14db03c66e0fc7f2623fd7c19ccb73448c06ffd77456109684055cbd2b80aead730c3937946e7369902feb339e44e2db27a20794a1f95b62633a0fbcc922426200e946ef7546790babe7a2a349eda50508a00fc4ba70ea63d30f7b5e93410629280125a343ff8755591b67707d956392583c7ac304568e02de06143701bc79693b6edc93875d94e42bea27385d3b327b086d149b2aaea2522ac5f3a48ecc090a3fc18b38716627144b930abb8c23138d4c8f3fdf7271b5da33a1bde6c9992c82f7733b0e07b5bdc4908715187d3379285d8afe5ab3e61de3757c8201b471db1892d11620c97a38270e4aaaf3ca63da3fa73bcf1fa7c2cf7565dec57d28d0c453c51710f5499d88ab74f5a14dee73766bfa309c3b0db96dab70eef2e1c12017c6027aa023a5c831a43c4104bec3bbb1b36741044fd04b1c2799964454fef1d3170af6b244080009e59040a8d01743b31aac4e167ea9f68ab272cfae33d2f42ad417639b9763ce6ed0b2da4f3230fb49876159b445c936bf2c463983bde244825c3437e7a18006fb183b6179ac76d083f591ebaa72518a1fa5859727113050f3e7a45621a3542cae18f669b9fc203316bdfbf8e8129f4498d3f71d49aa60e60cbbeeba40b25ab534902164c50809fc7501eee436b445aa752b0404d5f7b7175fd7cadb49206c14bdd9d95daae61309b3c29e8470b876e93ee1b0e8edeecb894a1fe21f29b01fbb8a7d681d00836601cb80011d87768548cd2f67fd6eaeb0f8c8f52a9edf27c8031b3ef14d3719ef988674809478453e9be6c015b994385cf41ac4123e4a75edfef68ed058ade2a62b316a6d011ec31b85cf41a68cab81cc7150b04c9d22ca2cd9350366aaa795f3c65337bc99f052aa6b6f43bfd7a0f9660a83ae6c3983151eebfc311341fc631463cca734ed16cb609a2d73c5f2c9ce9655b14bbcd0a3b21701122599a4ce60810243a08541b5ad722c03d9520b68f8c3010b7dd9d88c192fe43cf1b853fce5bf4af1f91b54dbc26411ca94a71b043b394bc092e3c00739134402f1c61df8c3cbc0306cf1d679368d7005d083577d6509c2180a884762861c49f0096ad1893e3be114bf8542f3044a717c47a8a1b430484056641686a91c48f42e43c0db0a736f499356b71bd66d66fca5533a3092ecc8b5b8011717a1f60d0d52bd9014594907f4a954b5e0da21888239ebd6b5c1c38f59ba6f145f7d766432046b2cb33b86c1aa052f003f46777f0c556891ff5078226cfb54a5591b1cf391daef6ef8baac5792cf273f852c2f41d0db9d430bd33b628aa15399ddffbdeb013c2cd934e170250a49ee3b751f0ba730af69e30c77e43c3c62e13d8b8a5ea503f1deae4d85994c3ffd163b957a53fcb1fbe0ea977e660d7d1b48f38aa63f1e8c1888c90a822d365da3126bd28b95b3f41662b0077e567edf5e6ad0b3ac2c36d247d457680ecf511c1aea273c705a9dd426c8e05a010f60efa3e26d91601608c97f0ddea157f8762d88aae3007642c247f40d40342d93784f7c71a422070a0bca336718ac048243548498c6c6406b740a515f2bb892f561a006d05e8f7a2430e1fa95a0e09a04fa1ca33cb3fc7890e2cb6d35dada7065c5e6dcea97b302c4bef11b5fb738629fde38e46b4bd28867e583a1b59e877cb16dbed08af69274dbfed9c78368460a97ae9271e844516b4055c8764f27aba66925bc2122a2baba2af69f1ef7eb409c051c66415ef40011911067774d86c08750d39d5b6135877c822d2e5551353aa55789bb48318dbf24b907ad0a14fc47d79e58dd61d204b0c5680402e467c63ca49de2a66ae2a77a2d11481695e13c7dd7e7723af30c78d13c8237a884be40a49f2bd66cd47a24a1fddc26797a68a32d04efcf5833ee0433ed07e7daa0477b8e216c603ce2ba017c9e7237390403fcbf13b0d4306fa80a223b2eb9db08688f50fb04722a3166f122b01cdd073656e25f9f2f1cc58a546b4320d3af61f3c4721ca71e112029e241dd64e879b17e58247e0184a93f19ac1f1a3e81efe0da747d657c0b867114ffe615caf352e04b8a72af1622537201b6bbf0e86032caa8cadd410e1c4d7e4660ab1acb21daefbadc112d46f98eccf474f56fee0b805f962dcaa6735a1b5b154c4b71ea66416ef7d656e4d4c7b371ec98c0673ed874bc014c073adfe9a5e8e81d746e37d4f4df1acc561eaa3490a610569a1baeaa44d4c3a4ee93b40bc8e57d22141d75c2bb8da355394c05621f3fd4388606abeb80ca9cd3a1158c22135431476680865a9395e7bc32618f565a1afcf6d065d7bf583a82f00fcd27c966893e095da2a50bd31dbf6d109bc49ac188874c8eb873f1c7fe50d74755ccce0bc80c3f2f295cffa8bc29dbafbf5b37e47728256ac8e840371fb191711856b7186d11b321d5ea140298e1d6680ca4936eeae547a78090ffea56bb412e6c10dbdefc2770c31585101dbd1fb140b777b841e5d7d71e6b976bba55004b33dd8c1a09ed258b42610dd75dc411880ce17465f8e25b48135b38f162b3060b1e4f5aad49597ab944e75eacd6ae873cf05b68b7bd78205b4d95aae9f54b9fd7ba2e40741ae85f640c05aa967fa0ae73e6c3c6dfb3b40e8c32df1a5bd3ed8690a84f58fe736aa0fb4e8fa2f95ca2048e3e079f349ce03a877f98f038bffd31e9f5a439c37d564849ff7d04e7b8b3f5c652daa9e2610cc231c0c6afa57e8bae96a533d78e5e19e87b26c2b5154f252129fe2cd4459d2f951a15297de62abb1ce0673aa385d7edd0dc518c49c17304b9580ad516c1a97a8cabb962a549751128f15fb631615104b908c4bf6293c690e2481339de7c4878845f5c4a0da6f08d0cb8142d78433567b3c3525605cd0a720861bd430a010120147454117e5e75ef738adb135ee13e4b4b799d17daf88672203f543876f65056c73b1d5cf0d096aad2a03fe97e433d6d49810af86ff5e0b93b0b3db55e35af9b88bdc07a7e498c8d737cb6cfd05bcb25ab615a00ab0e8a91820a6cd6033a0a3629b9451d5d50c8ae1e2d8f5bd567d3d1f12ae7787f43d98f2805ae2f23d7d6d742800d5329b1cc7ac5051288b9f2716d7fa207c4c4a561d812934da3bc9cb3d8e24d3eb1f0cb02e12372d13e14578e3da4620093e4373b30cd2639dd4122e8d9e8dcedf6551a09bd1af8844d1b73b58238a1437e64859123022355fb966460a13d6fc6b473e21f0549d9a82e682ff82d8d2d74cbd09a69740d3ad3f8e4f0f63200124e7b34854aa7f0a4c1bb5eacbf30ab542fe9481fe0a6e9d76fb6ac84fc4c3f57211840072b981d57412727798e378815c7912d1a31e851379eb9f5cb1ad0343c990b5b0cd7123344bd0f355cc5e83fc544b7d2187a692d7cdd15974005c9a811b51f586f124c40b8fae059cc034c211d2aaf35afbc336088385a4333c192c8d60ba03c92f84efe4a67324a596f7fafd8c566d449fb296cc577fa654d8d2b010cbf2ed19c7d0f66071b7a3ee2dcac2654dc2a2d6ca2884910ccb6de759d8bbfc4bf4004c34f09e307768182c9b4327c6d31be0dcf1b8c0d923033869431cc09e3aa0b83c20f9789e2bfedda58eebdecb90a7a0364b760c837f9570503b7abbbc5557e7b8530f28748b1268c0a6ecba044c9eaee6de7fabd7d4d8c7b7db000b8eb68a8945620d88f138583dca3269ab87378b217b4751b1979e11170cde8d46b4c2df3fb7a5c4efd96a0acdcd1ea3eda2fc4b80060c87c1c5406d1f41accd702e8914080a68ccc8e1e02052937d75a877a737edb13be0b53917e6326d20720685450080629a0b9042c459f8f7b00c549c7219c96e01139ce3b790cf481b0e2763607940080b951eeeefd5bc344e2768bc8fc37296f5dc4f66496ea30b04b06f9715240073821952e428d7020005a04df8908ff23416d711c66b4e0627a0e221dfee3a9745c78a054caafcf10d1d8a8b2299f6ffe34853136e1843fe20e8499888c21dc01ef5626c3051244e24e281a713c334be0578247a32e2fee358dab1032131fcc418590d0235057a422a8ca0e54fbc2589a25df490ef04f7d5dfff6e0ce89a7579c7f0f6b15c282b18276f6214d80a9f480fab82f53fb357dce367b4010d2627181904e945016338558b1cacc9dda83bf570c2fa9d527b39c5d814b0a21d75366862c6316205c4e4d883d94e415ca184194889cf33f3ba6616becc2b120f3cce75599ad23838c0f1d22c1540d3db5e7fb1923fa65f7c13df51c253038c91e428ed1a6f9c2f6860d2b723fece56f5a8d3035fdf0fd24a5a4fe17ddf35a9ae839528cc7bffcf07c929e83fabb32c471665143b30e76d6d71086806dd0545b7753b93c57ec1dc7d834fc41ab111bffdb2715357c87411519c7fabad026bc338c8cfe16ad35dd695800337ed2433260c60ba45e97c5089cc5f100c1ceb2489c46a2b36ac8b60bc5550fc92b44da662497ee9ee724a2c8200a36036c0714f765283d74372bda9111b2afcc16cc472e9debb3eaf1f67d6f189c4763ca3f57a12758536671dba285d0899d26f05f21abffdc38dec15f9932c9d40c73e6afa1898c4a85eaaf88f520ba506e2b7f3e9490db51c609f23979caae808dbb49dabe243a502924f671aea9d1bef1e6edfde48b8887c3c42cefa476bc054f3fb638b3f134f810a13772b90ccb4412629c66a16785445175d6265296f222623aa44864379c2010e051780095030202d8e9d7c14723e6e4d90143ba5f0a3cddd4f2346830508b4fdbb8acd9d10c3a863d1bb49a59ccf3a0de1f755cd17a85225a2251c2fefdcce142973c6dfef37cea51dcdf18b5fa9da0db6e527c5e22659b597c4c6f3133b6cb5e2d8b588bd3e272454a34cb15834237a51ae1e85e171b1d9c6e9418f02587f6b230009407d81acf024174d3ba721dd63a2a2a847eceb81acbdb2147a5b3872756d32a886e1136546f0e2bf43724686edec3463886394743086597c066222037c461819d434de65188306fc9d0bbb0f7235e16b4166bc70fb3b57f04dbaf489828bd701af1c42086c8e3f137f05f46f9c12c8f891b52b2a98266c743aaee43f1374dcc041601323265c8a6a6b452be9092521878b4899adb54d8ea442f8ffe7849345124a7082e0d65229123693609d684855438ae9dfc7139958eeecb415fd86b8a007ee984e8c36333bbad4379a9ab1b5daca0fcb808a878848c72b8c7299b3adebb135e7a091b4a963a350a9e684dc89987241573e46eb6481394700521c5776999b3b009e44872d049ab53f754850e572d430b5c79f63f2127316078e3ef653f1b9098fb7d4d20fbc6fdd058cc5e301a8f891d6423c016d6b17cace8d016a28d7e99224b117a48799d51029823b7a0fb8203c40395ef233faf572b34462cb5f96b134bbe5695d873cd97e0c23baa5328febe0751b3d303b43cb853dc8cab86027232268e13c15dcc450dab3d832b464082eb41da9e4a30c2dd426c3858892e00f314931b4408ff90473e07ad2ea2c4d8c56804292c0b21bb14fae3388e0673559764b9e9d1ded67572d445d0919af9ebcf1e38460801e857c4b00425bdf4d7b17d644f90d16a470a5fce7f5290ed28a2c94d5646c38c6b81b578492860041d6cd58190e66b15d8b7ef48e9e1724e47161c7904b8a1f4491a19171216c97cec085e2e230dba5846ae023eec667e6e5f5ba8937dba5d136815d578d90db6c2eb3d69556fea0ff64c138afa84f45fbe6eb225bb84b1de84f6f5dbb2674e075b250858ea4aa9c9ba28e03571577948ca9085a02365083847f17409ae238c0285e6970557465d2d296d9feb3cf98f9efa2433637904c97e426dbc02ec1a3058a5aa120535ffd97de2af0898d538dd5c8be6a4e7eab12f7204288c0e01b684ad99617fe40f98dfa981db23c7e2c881147bebbdf466a2f0d67711bce9b054cdda757df2cb8518e745c86fe71ecdaaf0aa6caa95bd4d439bc09ccd77a634faac7bb66c345348a52922f707cf6712ceb3039c4342330657340286b1dedd224712f2b367631f7639786146d0eed7f063231026aa90d2a1610fdc1497aad027c531680ac69b7f246e30180256319b1530902031682d6fc4ee1d47ab563af9dfa0f05dbb91ccf2f1d6b95979b7708ab4a4975855636e0f2e10fc22b1fd0354029398871484330f307eaa378bf2baebace28d83041688af406c20342141f2cf6a5837f67273a5245a160550f51c9e088441f0b71f83182e608ec3de5b9b94fa7a6c17ceac5c09ee85d620a634f32476f867c73c32dcb29791b2e546bbb4df1184143da8e8535fe9d39c1f581333295e1ea08329d4d0b9d414cbd3dd2d1b61635cb7ed21cbba9ca527d322fe18a6e75682ccb8b23b01c3bc24a0fba32ba10a2e70eb0c546b6670bc7f94429898e9b9f8682416016e538c6266a99cc9a187d11b648e6756d73b9634c90f9933ec13f7c1a2e5c00d131a87f74630405de07f7113301be9110946351f345dd48daf149841e636e7ab9189dd54aa2d0482ab1433829dffda6e482facdcffad9ca9194f4a4746cad2552c052a9dc93528fddf7218712b57490515f4a23495c9a44d93a00c407aaa6e1825d342ae56201a16302d181fd8f2f1d2e03360a080b019118ef38b7f93a6ffee8ad601ca528dcc917b9f943b7a09fcbf96aae5316f0092cb06d10b3f037dcfcd193c45dea0f572a232d15866d5880ec1480b34e0dc49625534ae3ad62fda1d39dfef836bae908f3a5b12616d235a111eb0f6d564411efd41ebd55c241dd55f4f2d273a8bcaac0e6db01c4fc00362a50c55d4b5e68f5a37099dd0a26d03d39f9657d5d391ef3b7f3e5792f636e598f3c09847b51523f0ad432758d4a45c78ca775448020154b84f00828997187ddf65a1dfeb854c6428839f65cfe73f8e3621647f7e1d700d0d9afb95af5827366ff4f3524dbdfe4008d28932ce2173e690e94ce189657e55fd9fa03fca6928b124167a54d3db8c36abf8bb850725878029e0e1c3b7ff906651e24129255d5466db7dbe46806524f403056c2ad98e1eae37d56ec0fe9cefab19b89b2bfa0271ac675a7163bbffde8301d2a1406d64a3f2e142d8d16ef141077fc5ddcf6b591f15d557eb59ddf493f92358698c24afc66d28f32d592b34032afc49d9e0f6e4d25e454005a9f25f35a257886b7e667667b0e54dc612047bbf081b9141f281613cab707a8bcb21a140387aa376f149b94153d1383fa689faeb30cfa1eca7dad556789e2ead28f297b23e77a9a40c9d5e519cd4962dcde7dfe705f7fd57294ef60008c825d1d772339e411448af3c18a67ed2462ceed7c438a24ae69b8a0a7d3490aaab8e424d0c7a5e7daa1271d7168e62a12159970b4e52207a1a81f9bfc8a3e70416c4713ad19a1a3ab89510ab374bc46406cdeb04c977809c9f83863167a0d9f1c3fdcc8b7a45a348720c49a44a15967758d7ea71464b57afbd745a5cbb0273741015118c3cad730f3234aa445fe093c52eafa93ba88217c3a78caa89a2da32c6532d33171eb4a2d2085e0087291582399d4c892b98dc852aa7e1bd8c3cabcefe0b112227a0206e7ff976adbcc83a5e9d0a4c6d4cf57c078b7c3c28070776c3ba4c13b063671783e52e09203887f83d824b9aabcb9702738bc14ec4a7de3a3dcfbf63781170a61542fe27ed59a1c9d8c95f6e76db78f5d1fe111f13c1ff3bf795c93b39168aa1ffdee885b631b08aed39ca25aab4d28df3196a03c44c39e26b0ab22c6da3e460fb8a17c584f2d26f7cc467ddd1f9f5a8c0cd0e00adad6defddeebdf7a88b788db9053bf0b12fd1471205f8f5eaa929c6e0505d33731b93d329ce26ecf69937d2de10e98221ed96109ed2814ab862f9261a1ba185060441b61edb8302e949bb383a11812907cdb9015ecd403c0997c84afb304dfc0038538cce97c4506c5d6e0300432658012a471fffbc2c9395e5286d54f8afd7b014f2fac32514f33f0c8d7b9f6397b3da14bdbd35e1a3ff722a5eadc8780bfb112e8a313faa017ddd1412774a02bbad1813e74402f7aa3837ee8404ff44707bdd0818ee84617ba161d7674e00140c238fc9abca78d6e7e3eb6ed4803e6fc9a8f3ed0b97c5588373cf3c6f8356553a61762dbd51fe10fbe3bb43c397f88d482fedf95844cf51d493aa6d9185b669a94db12888d76af8ef7813599d788c57de3a2db093f6a4203fd12fa03bf6596737c97121fc181993766ba038ffff56b8c5cbbff98df307c3d4ac34e785280ef2d2b841da5dd3638f9a8d98bb0f56ecb7fb5e5a471c60a6b2a6ec09175ac74faa1232eb84a7fce40dce092ec1a902698e87eb6bb26a3c93aef85a9a506dce8902d77e2aaf3e16f43024a2fa8eb3ab73a873c7d7b348e201503215a755275c1dddcebfcb9488380eab72194231365acf3b67fca1c4321fed2c4139b7c61724fd6f96fa152092391bca14192b9b3642af3bc515963dd5ce75e73dea1d603dceb1c5699b713b70d6fac9146ba41df7280eb9c4a4ee403276d0d1697ce3a5663599db46464789d2bbb6ce955c1ef68ee74e2ef5d1e8f01a25adc9eb974c0eea3aae90837e63ac52672b85ab9d1f88bb6c78d7a03b75d73772f7ab3064873f3d2dcdcb112e445f9a4b6e605db0bf4969ba3e9118dd77cee496ba46589dad28dd97ee97b490cdcfb98934465aaa696f4b2495aea35ff095fc2e4e0b49905757d95608b6ef8bee9ae203c218e1b67e95de9d88727986d7a6392e6e272ede4a5ddb78f6bdedb4e75fc93b04daff8a6b944cf4f6b47fc710367bad61ba81dc420f62551c98a67d20eccf793b0af577ed3b0dce9890c3fe99e4ea33582e17bbd491ac6f83b71c5b5e684b0b3a69ec12de9d56f7afaa7498cc463cca5b721bd6092eefe2873a0a1aeba7dd9ecc0f9ed05dd5d1fffd66ed4be695f3f4da83b6b825611428fd6155717e80d11244d9d90e8dec9f5f4b9527c4ce9e0fdb3718cfcccd2b1eb96e23d00c4092645c3d8faa7904b938799397a8964ef373db52a90ab79964bb27e8aa2b3b637fbc78066b3147fecb929012af4f875d892b3246025f1f203ef504208ec4b785d2b39b5f4642c3588e8376c9522e60a4f26bca6e45a7674e46e3b2f879aba05625f670fe11b6d64894727186c1718b3b3c4ca59ee279ff1b5ee86931c3995dd1ae0ffec07d4de8faef2f1f28863e9245288ad80b2f3dc4027833ee906fc08948442ddd8e2bc752ded3b067928dd9c643e00abe208a96986224b1ba87b9de6b64a54209591863366829e867342b4a4cc97582bb0c1df53c88023e843921cbe3eca629c4b6da274f088ba95c618971317892a0ea27c1652748e461a4d939bb9bb42247cf52e2a3a244d8f493b084c8cb5e72e360e4955030f55940f9d9bf5b2378a160d111c658bc19b9b48bdf8371d9541503579f05f7d12bd8ac22a1eee864dc14032a83a7e143f6df52826ca36e048828da55716a15287d49ba6df75da55f80fe77bba112d73eaddfb17232fb4ad4b5a8672d38ac88201c3ba7eda7e3cc997b20564488daaa0962b698068b7fbb202d587a1939c73ef8d4aec82a4f30646780d18f0982b29e0b340c9f6ae1e9156afccd0112b4ffd7d4c180584c3cb3967943710f4c10a72288b54d83f0f6f7d94bdf696cd2d8937c52aa73f2a1463944f0cc7dec18160c6baa82e74ba013c7657bd982a52f0d384db3f9078019a9cc4c5e81f99538ed47a46c524ef709815873f461b72131de2ce0d15b23269eba7a750350ffdbed939a0682cf000ee7032c06a6fa61c43a48c87a6fb06160e6e36b6d41103275db05df998267e2e3756f983fb93925b4524bd7c41c08583be5c10c8ec6b96dd61920de97a03bb034c2c0ceb0360e295b2e7042f3752fb83673b9a605f0c74355d72ef0e707256bdaa1c404cec3ca20d218ca2dbfd7543f47680d359941c1bd9b08b11843eac69ba9ee075435407b0f130845fe066e79d11846e7a63c7417b2303c53549d0d5f803019693387d982c2539ef272de876032a0b7140ef12d7865ef581eeb2e74a1950624d7054a1ed7623bebdc903dfdb9d4d963bbc60a190ce93dc2c61fae9ca794ffa756e3742ad1007eef198d48380d55caa4b08bedee03407e901256219a7ed9141a953c02218d084c0edc1211b71ff1641b6dde89e6a5cf9e75e2e9a1782f25d214d70692fe286b998d6b76dca2eac487f5a8bc772901948a3c2c3a7ead4c703c8cfd70dbf2ef8c6ae87d90ea553130a4cafc9c1dcffa4aa5692f6acd4baf7dde1febee4c326eef8b782ec126f41bf15ebd5ddb3aa794f3bdcafd6212448e13c3366ae9c715871d28b820d886fcf633046cec155fb79e938f70530b43cd0759c37e8297530e7591ff6c5180056879c4168476946c468812b40400b8d05d646ad866c398f2aaaf8e8cba4f99296d6c6d5fd6fe9ae31c5aa883567ce3114954fbd54cb407d1e6c47e8ee0db2368532ca1c08d921625989efb61bbc69b89150e5bc0e4142ce33bc8d6530ddcf77674bba44792ea3547fabec84b9cf885992eb28a901103246aabdd21217df5a089b89fd2169a80172e4c1899f2a9da7172fadc7906048a0db84030af18eedba2abb3cfd80972be18e5e5d36f8f09e0063aec983864224c42944710ba0d8b089f01b4067c27cdae72e90a9ce817a704a30d39944014ff3383fc73a6dbcc6b85a59bf718840fa753c7daa8dc40e1e17eb93d1043c5e94ddefff758e6a206d6b33bf90a65846ddad020e91ddc110dc885adc0542208aa0e3967ede43bf6ee4beaa1a398846b1a3915b14b1df0b84ca3e970d2644b41d49c25c987fdef64b1557eb86c1c557108daa3ba528f1ddfa3f9607c4baf1da728713f3784cec5d7645ff316f8be6d7bd3896063434456abdfc8ef5695038b3564aa518f0d6dfdc362c46701a61f0d72ca0777a3f020a9760dd53d233a5bb71d9e08b1ba21c80f8a2c8044d786a4a67820e5427c8c4117acb272d2684cf4e7fd169b912c2b298aa99da941a4e888ef39644a4afb5bda53e691d46d294a8c0e6579c2711464fbf24109cd616e27f6cf8c63a3bd9faef4d8f100843e0ac2012a5df606ed6c330d12fcfe852df1ea2893e8d9dd6c4091600dcfa3e251f831057a74f96f68e4194d8eb1373bc31886ae4c7d9a622cf99eb9342672054381d31c142a5292f081f3a1c15717db4c778d0795517ca78932b88d585d62dd32374e457031edb2ea50b106d3ab0e96c053d805c141b7ba6a051596002c4a4dcc93e2e3e0aef6028a060dfe1da0ae624228b69c5c7c57d914d9737c2869e0b031db4a673641ad7c5c81ed2a896cb4dd8dc7ddd7a6f00f5758d3158608117df0a0d720f30a2ba898ca74e59ec06438051bfc609d529c1091e6d5b7ef0efde1f8ab2d77f34849e32c8797e1f89672ec52291874001c325c2973e59ec4f0d75c0df8afcb9f6b7ba1ccce15edfdc117d1de96756f6775cf41e0e1437f45069c82ab699a79c30af15c13c16e6e8700e35040b4e98b978e3597448f6a02bce108909d8ae5926a58efc196117b1b3f55ad7bd72f4386723ac3f6dcbbd5383d158b2727add5566190712056b89fd97dae87e82d0d39b0c44f026c0daa24dec061aad55f86f2c873cfc3ecbdd2ba5a4b19760bd69c313f26e37021637ae6049358e9cd67511419d23d9e57f59add52d1238ceab6906c3d7b851a74aa766bc715ead5cc63b54821870095931edf4d35dad646354af6bf0a927742c9260f9f78f3f8cae05e9a11e1306acf1c8dd728675f4c1ecedec8bff4526f1ed868c4debfea2a447220b19d4e2f1ac588c24247bcae3526c7ef6a7f8f8d001443bd493eede2e729e5c1c592b0707657480a3389d2c4eba5c950c8d74c7e752008d4bb04ae2997667c94d24aa902122c47e291b13a45e08154d45d788aa985218a225484349afcb2c2c95395e8bcb6aa121d52a5a66a110a607a47320021b3774df5f6041e38c67961c82a12d68952e7a5b7dfd431481d52e05638429a5b2136b46e921f557b65261ff670663ee595325dc8a9233ab519828d93ffe03436689ad0e812413b5268ed44b66754e42664e9b7f7ca744feb71653c4600031c13f93b8ed201396c390db955ac4353c60bf1147d334b56aa4110e41c49b1ae9c3b2b7c3d03bea2271bfe76ff1ea7d5d8289681b314f608f8b5321638504821ced52150844dce9f1160c397cfb1cf7ea2153518bc3f45b40b505b8b2417e84e3837e8d1bfc65e97f785b40ef6bd8d1fb8993818fc667faac553d213b7d5062e58717fc91355f590eddcf5da52c61486698b411935805f89adfda762b608e5ce9baa4e3426dcf7ddde4f4bc920685ace0497c9de82659fe6000b1b7b5e14a10dca72e4c1b816b96bc08e7b4f81b3d24d1373a4a24df1a066e363928d53a00a929b5224588769f1a894d909c03802515ab24caf648882637f77568d0aef6538d73c9c0e31bfa6b40e27561a868ad8a8dbb41e6c87c79b95dc85696f1124762b9d64db114adf1cb588c62a40fa23fb360747dcb5739e01a64fbbb9b6fcf6c17a1c45bdcccd34b612370827125640a341c02da72bf01dc7a3ac65cea45176a2aa2343eab97eae94da5f493c760ac2e0496ffbb689d8e05b5c862360e1529df4081ad08aef9143529f802f521ef8ef61b0f209a79fb4d697a978b66319251c2fe91668c86671e62512e43dea94b892bc6b2a11029105a7c2d132d21dc73ccfcd06d415add1bb2a357b80789957f43253eb7a771ddfe2118580203982cce7413ac7633a5f0d8b1417806ae6c8c84def0b929219094fe0086dfda1d59322708b33528b1b38a39b025e194d04b1890b6875c016914dc08e02219952667c311649cb464d2fc0325240de1804e11472fb03e3c8bc1cb27f1ad86ee47574edc40721861ec55a80c48ccfe6006bf65d2572b944ca0c4c7949d641c876266d519da0ae46318151cc0de88971bb717b6dda3af15c5108bec791475f8ea5701a0cd3d9577d4501d7a620efcec0ebf5b6ab23080a7c7c018515e8c45fa2bef7ab1eeefca2c2a773bcc0fda6c0bf943ca007de75e00508d75e5248de4d1d695c7dfb250113b46404900ec4942253c914b2afcd30bad2c40f96039e1c531798e54030cae0b90098f65b1aa71c3765b039a5cf8d04dd2ee0f953792f0e2a4e775a61e83211a120a3f468de7b78f240730954f930c94d51d6b05f787549a4b3402636efcedc213af14f004bca66dfcd653845593471d940c9dff51cbe9a389c3736c6f7db1a4fa7289838922b9dd31b42cedbf5fe91dc1195d94be4f308cc7d6fa6d51a10500445ceff53410e2dddfca04fff769a3400d0da7097835dcf5289b76529b0df77d9ac2de338fd1be805d0270b7be09dc58bdd1a8c018760dc4de432d18e926d7baa66b5a636a3c26137a2a518d772c5a165463927b6626f2fb8ac9739a95fd86fdba511ced963daa8c676c81e9c74d231bee15e24ef2dbbabab824da9c6c78d735c03711225714fe5f552bee2daa01ac784f1792d839648480b7d437b964dea57e01940ddce405598e0abd15d1ba168ab5f98e0987af100e56d11cc66eff5856fdcd0f5a08131b75d3733928541c32470efd18d77217f052e68e65427d2ae0de839f588363619a2f3b08f5d099f8b2ce586dedb6b55032e1d038864ca411317247f886933b478ffd9ac9ae077743915a91be522ec5cca14d77d052f6e223f3be169000c235750af07c3ce619ccde81e2bb505a050eab8c1cb63655bd884ae47f93efc570d60d0d76891fee3ae58f8785a6b59d01741ac3cdef83cb67ccbad9f2c51bcc97f84780f0659b2d7e58c127dffbc06f39a6312801a56a7367d4510b2534fbb861cc222147c49f372f7f43fcb5eb5e34b3ce46996b76a1d239da372a7d10b19ca030d7097ef554d54e867534b55124ed2a1717f4a053d4728e9d8d09e992710da650f68925f4e15460fff3455fc75b343f43f79ba1f0749f1e722221d6df9fde05d9e87745af9c137e064c2a1124d138447bbd9aceb16830ebe08e23c05fcc46ba33e24654a6c3691aec78d998453460a3e89f6f068ff590edcdadb9f6a0a82ca3c52d48591168f274adb6a4d9bd72febb002c4783957934c078bf67e071c9f92b8a61269b6092e0443c42e74ecc03426a429b3fc879997d09a4fd83c4eb215439f96248f3625f67d453b08dbdbbd1dc7aff481bf98650d4948a471f3633359ba977b7c98236782b7942e52ca809ca97da843ba2fa57a5d777701250663b55285799689f907085ebe12d2844890dc37eb0cef891f133c89019147e5d7163074672f15facd84d9b71bc8e41f7b5b1ae0fb80ce22d45ebd4616e07547d480dbfc4428c565740311dcf783ac6e2b0997029f1e5e7f963be68ed219cde61a90058a5e94eb8e096017ce0a88c8efc296cb7c37d04d9138c97e38ec2ff9c5ee26c8bba99548a7ea4a1987eeae092c1776641a32cd97c825888ef03b3175cad99dc400aeb63fabf9503b6cc6f7c021d8435339085221d4c518d8db7d9bc86bfc3987c891069c340ec910fe91e5e0df4cda0b4cdefb5282123080ce56214f8d07519ef48cb3ab0e340d8ce096aebaa23091bdfbf6beef7568d73f94f354afa12fa206d071acd066d7d5a8b57f4e4c43c402805effd583db60b01070edda4382622b5564158a342469dcb733d367ed9f92ee842b39d7df479895d44482ea102d7191053b4295ccb525052d9c4946152950da8df6b4291d1249d01483e4345bbd62675bd8d62e70d807ffe3eb89a97727f26636976b80027b0263d750900bfa59128190543d8284e35ba60998baefdf06187744939c91b5a4d14dbd6602b5e13b91f3f328b8e6003333bc558b618984303a0a59eec17cb331d15450b8a60cf26f2bc8cb793f9115939eebcef22235c9cc7bf96472229a0211f9a68a042b439196a59b8a9866db8d85805b2c615875a2b0cfb203de85875de7100130d70ee398c2df712613ed3a1d1a6c4993c002d0f06a6e14533146a8b41f8abb43766ed050d414de5202b3d5d53fccae95fa7704efd8f58c5c460f729a75025bc6f3f4ba0cbb8144b5450cf4b35e76eca6542019811c86c3b3fa7ca156a84d79bba652520638b3681c34aaa72af1cab2c71b609a056332b7442707d43dab58dede7fac465f63c2a2e6cd8f5688e528ec43645ff93a51d7f74377d365ca10fc3c4d4202b1dcc6f429cf357d032a4e426d265548734988a59f04ef4fadc8674655e964f91e3036bac2c55333698b654438274391c6f62bae9302b3bf94bc9ede3c2ca661cf4935d63f7b6b821f416e6fad4e524f48a783abcfd979b5e8db2a55b6d4a16c9527863904e497da018515e25982eef4f87e43b16dcdf7fb350ad4a281a161e87b2006e3addb3f9268d6c583e97148f34379c935f4ab20651d94cf9348f3c2ea7bfd16959077d975391ae72bb6c6657168cfb7ea96d9413d3adfbd361ebf50f9c55ca77d156c3e5323aa75eef835b0fef758a2dad12d9eb4233e7d1f55829a53ca1c0bdbecb041e04b9ac0a061de5f48a1d65fc517e0f5aa737cff142849880463de5674ec219b6bd73fabeb1e7eeae69669564aa3675296b502fc90f919860dcf2af5a89b26ef04262b89ebdbb333f76515876e4a480c854c7274c1c1074ec13ee0d4213f7b8610b8a8adad1ad86e7fa3225a556518a750a2f82dde9e4299c7e95ffc425c57fa2ee747e657918106680b9236c95574960bbb43b6f9bc4c78ef344b15643f7d0f4190b6acce49380e1e3ec8fad63bd25678e87af2b6c537a02f40a5a68b4420b625f67a80738430bfa25fb55492b27d23a862f29f953b62cb650c87194f51eeb170bb7d8d408001497c7a7edcee78e1b719bf3f0b0791acf665abd1db22d3fc3aff85840a7286fce596eb0b368df1ae47316d088961f791af288b28e117cb663db9f6303b0eb785b134057fd85c1af6b495da5fd5fd57c71d16fa0a651191f56a5d3e71d58c8ae428070c8dc6bfed9fcef32b499d61146a485023dab251082bca3f5b031464553d0fb6be3e75a959796d3508d3139b960afe98c1905725c3a5b5ff22514c168c5f5f13d66eada4f14814b24a5d295cdff69d0e6fb5c2aa8ae0ac60741fdc2660361050c6dd0251cea5a87d58acb32dc4e46562222f8af2dd7b17eb14ef2e4e8202a2fa47178bd9c60023ae174e5ff59b69bd40c7c64fc3f66cb6d2f2077bb31d1e16e5cbbe3ce9d6246d270670e4596fbe2ac3efe79f493444bad0b24883bdb051d2bb1881f61805f25d9b09388e43b8cf864e0fbe746a190d857d6627541bbe0385ff0f4c012779a6c81e612bb4bc77668866d50bf4adbfc55e2e63cdcab48c27c9b07266584120a810a79bedce38906c0b0d99e74cd6234f6699e3b0cbe9eb76d3e2dd20f249b59f286dfbeb16326249f83b28b8238e9b45be6da5c5083205a81ee6ed0666f36336d0614698f0e2b8ebc24515a146fe1f50d68fa5f97e85903366e54663f9d7d274debc7b3a96bfc6d096e08b2c779b37e17f712b86ed10b71df9949ef74aef138730fa27bf52c59126453093cb1a49d53a2fada95a1bcd5ce618dee84f4da9a4c5a1eb0c9215a69b287d46504c7b7ef0f425e21079158b42dc86fbc7b21003386f34148435c0b4d05d245b042823e79b8fe25fb8f28004e82f0831005a0ef2e0107ff2ae9645e1a45be92aa5ccbf0d0959ae97c2e76ba3a7badafe69a057ddc3e9e708f9bb7173b578d0446a972f4001c08fe231e374a25b9c812a4578516cdfda4925cfc0d008b06936c65099716c25dcd5d048582165c41244bf8bd8d29ed9acf6c66c2de4a3fac448c87fea8b9a48ee2ba82cb53a865385b5b133fdfbca6a7db8e536e48c7e7b8eae9c1e6161313f35ff72238f577c569ac3542579e1f79d1faa7321cceb881126d28f7d2b3d961d59488cdca0bd77e5a0c3e5eb1a0ba452e935a2460476fc2dc227c864b06bab7247850c09d5388be01b957908b3c235f05adff9e8bca6e912075443517e8ee1f7404c2854d78605b589484f8ada9540dcea296007217b5e39fc7cbf5845719e46622c3b53a9e5345d0cdd175712f106ec920b7e2fda4ea92a12201537637c7f8a17fc85ea529f927f15ff9f9e311c852ed0be52ebf38b068409da7137073f1c52c0fedb4101a1adf5e9d9816c0a90c9a680372ccb3e8bc39cabb77852aac096601ef8ca3e82a37f346d032bb3ad0257a0d1485b6b397ddf647ed18a3558785f6ec5e658c948c6cd295440c313282b2d3ecacb28c547615dcf0e1a3305cf5837b71ebfc3ca1bb4a85753a39a37b29ebc21adeb3e3c090bb97c49f3e7cdc657fe2e3284f2200d403a21fcd50fd8c2edcacb29145ef4b6ea1b11f5eae0ae7358f2b8bcbd931fcd5e5bc8284608260a373d4b340df2f5327d37e927a17f9e0ca764104da656f309da8e984c4ba948aa990fa600b95ce59c46994ae6947db1471cfa3673d0ade32e2398bfef843f855415bf5bd70f30b6afcd0805b601e4a0ae84153a0c005397c8956177602b3d40267b0d591346c4ca41e5f47eed9d8a6d17c6926aea5fe00246362b25bf0857172dcad451c66fd08f4e71eafda266691ab69f4e7f3ce403ea238febd22c0a961bce3d630e63351031aa65d7721e44eec499852432ac267a31c15642954b40302ef6a55c6ac416ba0756449007b152c601db08803dff24510f17c394364bb0d6add74dabe5b0b4b7126a716906b8d5a2b1e91111d007a509303e3790e1d607338d2a02d5f97f964f49cec5106068cea642b360b5662f3c5f41f7662cd94811d3652a5106396ed25e141c2365c614c0dfe842771cdd68e151de67d7f3da21041aa7a7674d06dda4e65195209b4ca35f6abe4ad4a6b82b5871f6602f90d40e4084528eb425bc809f92b8272ac981911cee299b7de6d88afc1d647f37b21bc953e1849730c8f325fad16a08dd28619d1239b6f620432669f527655ee2c74a6adb633a8bd629b379c77ed2810893c3265cfe2a2dbc9f8f833758ba3f3dea05a16339e16d0843b67c47f9a1478aaa3d594bfc9e843f82684f6425adfa9aff3dae1ea67e579dd54da2cbed71d9f13d49e53ccab72c85fcfb5c9493267017721abe7449996e6b84eae100491736be2a103ff169227ed1fe17850f23e0f0ca963d64d2ce6b4249ab16f400f45b87aa7f7e2727a40a9cdecf8537eb81110f8691b586f3e85c5b0064ff2623213811ed169d1cdd1bf48011cfac41fec0aa62b2bd3c5efb0b2c21c2c5cfedb54f7770f5b2a0bc3bed2f3a49d040604aaf3a3406e9b27726670e07b3720ff9f13ebec6bdf5c1b576f0efb282cf7eb613c1172da982cd128e8aa856936002fef7aee582d333ad21e52b4e4403d1c2caf4dd3bb100f994c097f5cf9ab1609d286be0ad0a21216be71b594d1c87721b51682618099ced4987ca9e8a71ad648c93b6f32ce3db38469d6f756156785110fcbd201bc560d0a1d0eb709cd7967c2cc3c21c5452bfb34a18b58b7478918416a55e994a98cba9e3d2e4c045024ad2a7ce7edf9bfd3db94b495e9203b632326d342939f5708c66e5ab7158c90f9b098e75ffa64b239c3be1194ad1bedbc9cdf419f73c6bbaa8d6ff0639de18daa92c986846aeb6b88b5fdd465b87d9c3b6e2846d4faa41ef9e7d8b10bac2cae512dc57a16ff1464ffe3ab92cfba66d340fe257cde9d4bb7178bf8c6f8ca5809330680ef889c3e2bd5b90b98500d9036761801b0d8e16bacde710079f29f278daf5223ce119605641429fd67e84aa7540bf4fd59f7b41e6f605d8576f004f9c032a7ace57fdd8247bdb28c10015a26e4f3c6c4e89c28b2dd22ba86850676c0369840af4b9f6c4a6c10bcf7ed031bdf7376f5538f2fe33e855e6be3c3b63e05a98ce5c516a19a5fae0540129c710306401487c11d4ec855d747ba31391715e0c123d80de8a05848200a896f6caf64b965a4ee91d8fcff0a94ec24e06e190002f3f7389d63256901c144896235fff24c0bb272cd633a2451d4c49fe7580f42f8e13fa3c36538fbdbdfe5d36f08cd58451daff52bcab1d66de13e9552041582c65fdc961ba34a3454bcad23b2128df3c5e496b16113c62a31a3d8f143216ffd89e6a46377ea217bd15fcb731aa949523749ac2f31ab2435259babc47f064d42aaba5d739fc4ff27537ce8abf927f3dd565f3bc8d74f12937379af7db9a64cae287a800d686210ecc214e28f998159fce8124f9f901d890e72248cbf1a9b413bdcf67e44fa48b62c8d442a50244e5962957e84f20cf3c049dd61fe644d467b7af86ffd2f4d090968bd47680dde0cf1d27c8b76288a491f34b15402cd159492ccc44249ac5f59f7421355a283a68389c28fa6bce2210d7a0b8015b4d3de1f2e4568f6e2f5f8e39e16d920c75344cc2a7a36e408bd0934ff42e4bc36347f5aa17cb025f8a08d739f3285669a7b5ce529713e4070875aa7968528026e43b0954be7398a08b9eed21b79d039c2ca540a9b81d45577f3cd37527396bfe84ff9ae8cce099b8f1b57b11d36ff56f8d048ba95e7868c8cdeea55df344308b540d141a358f2eb3fef4214a8188e30129f41acba8828c5cd0772b0b6c59761ff592e4cbfb664509f21a952fca3062f1197b1f0ca8fe5ff4830a2c84db0a582bb19c83ced47c8bdcc763f01addc592b02a26ddf7c0e701c9dd9b153be7d8a42081e046c3e8506f82ce088bc3cf99b94f28504d13e96f2a1eea3f0c8c2d8c986e9bce47fe97ef0fa7da2edbf07fbfd24a03f1ad45fd2f4e3ad9823730deaa7ada021f881136435caf7f4ad0e01dcb183dd22c737fe15e60bc0ad3c52638d8a3bb295be90fc29fd0225c66250950172125e93c14dd9cf927f150182540a64d7194e76610ba8a198f2fd7e24ed5beb923fb05814b5a4aeaa81545e9101afd1acc8e53d5bcad4ebeb736a21e9fac36340887ba0a3d53911d861ce18bbd543aa76ae00a9c9d0c1741b39821c8c177684fc98e0318061314927f367ebc881b97db83d641130ec83044db3fc60f58b9ed0e10003965315920ac7e8ba09249c3f8969e445810a780c9073ab2ebf9088f92696004300f4954606c5f45bf4233c06134274defbd056fee131a89ac5d8886d6d8848492c49185a92294aaeb35c8cb8ebd4f303ae3c7ca5a61bca691dc5cbcaef0d34e239f2baafe007edec03e6a4195412616f84243785c780ae3a2bfabf72b4edec64a55760d8b159be1927c41e663f7535215af42ae259faba654a14d7cc13472a8925ed7847a110412df8a4016eb43f8f401e1e83d39566cd28c4d33234b7d94976391e823367034776ef045ab1022bcb0195db258991174bb4e97099410268e22631a34164f1387f61b094fd12b84e676d2e2536a4db32f5e7511c63c4f4d71a4561338a537110857fa542d9cdc877096be67ed259f5506e7eaaa54fac90edc23576b51fc13aab9d36586f942b4540bf8e8c161ff4d7ad5a603da4e7faafb70c7d7dd985c18e8e047abdcf615ac74a3c18b0114f1b88dbcc79ef30803dfc1cee734ae0c2a5f6c48b1ac1fd0eacc87dd3d46d502a35882655eed26a11ed76f2f3e57665c2b450c8d6140a319fbdcaae3f831580534457c48642e8c5bf6b4019f607adab1aa08fab06bcdd50fc8fa1a0575ae31300e0282d301c179c120c38bbd4469988097494a157f1daf6f417aef78986093d9c99e1b4530d5aca1e4498a7bcc1966dd5673fe5fb55fdff4cedd53756a3697213b34f6a110c61971fd998610114a73c3593586820a5134603a2f17db76a099abe9ea09c1266dd2843c173c4e73212de8aa4e2cde52a4b650ac70a46e9050b042ec14c2f320717e9dbd66b7e4c985a3882c9d144f37344d76847f6ac8a43ad4e3bbc0cc1827809824475ae429c33e5dbae200b482d7845934c4695d7e16a8ff355ee643cb76743906e5b412d1a27d8334a7c02903a34443a0fdadd863b83cb56e443d7d166dc6a1d28d8ed1aefa4fd8fc43e298b7a516dd0a5035229cb4adb846587b2bc8e4857dbcd0bdb035c3c52bee6ca9a1ba3b9472d52a17f92576fe25b6cab55eec0707e6c488314b29541102068998eb91a1ae77d01822a912ef276cce01f3878c45557c29c5772308a0dbce5d8e5dae4a2adfe67b20414425da18cdc70362a9fc8a0db6db02e9d09016aadc1c019ed80b6873aacb4e2d408ca1cf4ab96bbccf7b153c875efcc9a37ac64d3ddf36670ac3bc123d64222bc385f19cb92c6199a2cf7ec4af665d5820def856dfb6a3eba78dd349d874a803ea81c36780eedff876ea2ab0be7c3f622a100e88775eb37b38852c5471e9301fc6c24a93c1f3d47adfd319e69db8a47eb2140872f9d395fc19bf305b9740ef68a142469921d0d35e040ba5d2f9d8d95f395b8a750381b99ef0dfe8b89bb8eb1e2215c5374de16912235acb63e9e771338e8598388f41c2b7c83a7068801e7ed126c2bf19b5e8b2659b5a19a69a8cf7019706f24af4c093c48725362c0d0ad82f6e3073f8bf1db0d5e68b8a5e439fac91634b3c86613341d8f21176ec86a60e21e63d7325d008a31357586d6cb6fde76747f3c361783b5e1e24be3603477263fed5e6525feace71f46e975220165cf53a83afdc1637954e8706428e3064e91c83282ec6a1da02e74c17f32ec76ce9c28ead55d48f7aef3a3b359e2c635780883377ebc0f1bee3b4f9259140c7eb2685feb45002dbb6353855f3072571c1bec7bfbc93c3250c9e4ef8cb7a6b1bdb1e987b31d42a9adde444aa798eb06e2f9fca41013c4dd716bac5dc9b5896c746e32fec920c170598d29306f0efa9d386334dbafa8908f67741d799c38d69ee8c2aad9640c3e94570166cd8f473295d244478e4de1b2bcdf4e205949d9b18d26a404c178eaa53633d44f29c0300e2d4ef8d73f0bf95b84e30a85ffa4752d10c9f37adbe7694b43fd6ccaea2d7e20b6e0f6e4f0674f8c0456fdb327acb95b5d0d02d81513280886efea019f783545ffdf9fb1d4f5aadbc17895023bfece19adcb49b45cd3085b32a15bd787886ceea3cf13688721af763b741f8bc1c087f6288fb65d016a4c1b3e4f4070500cc868edecef8005b61948be183f58d3d4ca74f6975c5a838f8ef65a40839e1d4f7cb1c302e782ea2d9400d29cbe2d6528d4dc5b723a3546e446b5d9fd3025c94c952f889f6e19c7a3a95d19802744f86577e77a1becb39431a991596b9c15c84c763b5df37d9196e2dd2bfa2699559d74a157e762a15b1a45adca3a97f76a7afc06ed529696f27c8eaa3e5f5aeb5f7ada1fb8aded78d58d1ff07e3fdb1e559185a6fce16dad8b2f48e9d22b8d379f1eea62df38872d6f7bc9792f2aa7b3d864db6bffec0b47a8d0ce19cb491bbda6e21b74b2e30e43fe45eda3e188d2b815b31e1773091cab60e7f73a49ed84d3e46260e7d98e6c35aab28353e59956714f54b2d5cd80f50cf1939c615b02445af81fc9cc02d7ab9258b96a22001ab6541198aae7be1d9e97343b61079bc15efb1b0e53b6e2598516e40b3b6b269306e775a77dbdc0f2ea9cf57e2e1a225e68a121c4e9cea99f43f9d12f4c1eee0bd5b42ab8b867ba25293a5beb97972711f13405de4ed2fe19ea9138ca51548fa9f223f21df1b14bc18afc8715ba81a69d39543dfdff4c0843260d4fa5301c3fbc8e4e22eb73fefba12ab40473ec2b95d2ac69d4bdd3a068c14b4c6f60532a3d6bbf41a53c308b6480955e6c1dd38c5bbb77e7dd1e9c1f3aebf3103765c88aa3763351bb77d0d50243630aa974fbd117e2e3f2e86903b35d4d9e745445fa74785982c3544702ae74d5f023ed1dc80805ff22420073a672827b7577a094db4f8c208b0431d027f0082657006ae6a23cc3dbc9c696810701e22ccf5d5d69e80603627cd830cab8851524edc0b4f3a01f2fb29572aec6a69d3c287cf2966ec9c6f067769ddd54512a772eb21ad8e07837c3a8bc06adff2880110b2c19ff35656e87d33f17b0157a077ab706ad080d147046f5fe284b1789df2711ea66b2f86e5731ba2bd6fa0ab2af7b6aaa07eacc019ea7953b95d1c76e4029f16853ee68258c6a31baa31f05ea20002629393900605d8c2e4626de958fb58b81828ad187eb06b1dde211cc279d33119543ebe555ca4c98f8cfc705515b5f0529728f1d0c6553412f166e26908fa23fc29f7257a180ffc934c425a482322ed489a9e06399a301bd5fe3d866e749ecd721a4c733424cd2e4edc93804b41b62e766bf6c2541b7225aa4c0145798f5aeff42863083626909c356ecf0a1286ef739b9822c241ac8b5ca7049eb817a9004f7a3b5900d97e754f06aa530d1b786aeb21f2d15199d81b7c5910941e45536126cd2ae12172deab6845d2f2f83b8d5cc1398816cd900e940589224fdc2fed560d72e0cb92988da303240b120a8d3113b549e0c559594ef673660b92e757cf80959d7d10f7115959db628051f43575124fcf3b14e31815d51e79a02673654e1d31a45adef50828998305ead4d62bc07058077af0aada10a0402417088f11e0f548f6dc0b51c6a3940c0608afa9ac1a703f51c1750a855670c70cbffbab39032f60e7566172f4f1cda7c51131a03e8b8c53f377f225f5218d96985145a608cfdc695c2e8dfe9a2e74b0d1799b2f218f7dc53578934153826c74372f1c647a2bb949bf87396fc870ca42c4040f9dd431cdd5815afd702b3ce89dcc2963532c9421be9502bd8be704107586a6f819a2bc45df099dad7bcaa3fe1c133d77df6a0e68c6414102aec257b6c5a3d0b9c247faec783e42697e6499f43db97233a1bd38e939124fdb78f29bc016a86325424475cd796890fa52d8bde3ade5606005f0e01f54e64ae4b9a9441a49ec85f9b6502f801cb0174f728b18df46bd4e13f72831b53c909685133839639fb723a6c4dbafa69cabbde93cc56b85687acc18060155430156538e9b6f7eac455aa2aca61f81d9d340ef84bb5bc058c6914ddb5c533bace0b487d6f036fcd17fe32797e90b616dd3430ba7e9c695fd02944c00413a5d6d32162a26bc981d21d4124b96cc5a89c91e4fc141c88a76bd712058d345f524961ce5ae188284929e3c44981349a9081dec127776b77dbf6a658bb1835315b13b8423b412fccd61b24b3e384265da1eaf8e8fa680b160c511c2fc31a1f3c6404c97896243b5fdbed9529c509cf4ba24d5f4b11e200c664f014da1605aaef7bc8963fba33468236c34ab3ece12b3e8463ea6566bf183c7ec3f1b1ce0b682603bab7fb23b7b8af288960f39acc7d26f2a75e95d90be950a963f1ceaa6e273685b7d0d707d4d6a7ea51d32a5986b09dc043a64db52ca8005786d00462b0571c96a0dca278af46c88e4d49b5bd57e415e155869a39d1427c4d1a0a6cfce0b0f66e2f5387accd409e614029f4b9d4b64040c583589dd918c4b7f0ca9e2fd3788306a58ce36c3d03396286f8da8687002a8693687a502c9fd54a832ce92205c44ae2f1ce503348fb8d37160a83c7a635cf6e50f0609ed8287d7a648c98f5ee4925b5965c4146040c6314a97b523af6bbe36ed689127f27ccb449cdcecfa17a625980b4800a22d89034b3049a888d3794d1ebcfbb1932dccff659f5246d65a74e9a3d54b97edeaac6eb909fcc9eabea5723f19d913c6430bf99ef0d0733c6eef90c355f5e2602d488232cc6e8ae8aaa64d276188cac14377d11d561a4159facd3b3789500e032621ddb86e1e9ccfd003e0b02305ed4479eff5059855e9a4262aeb65302b7a9358479ffcc7836446bf48f89686759fed9aa43674ddc0072231a1eae754098d815b2bea3f3b2ac8cd17a27f7f12a6b8b37b26dabb6438d83d8edc72df03c145bf47a640ab39cfed06c8d2c11e3e7d583a1ccd00c4fd009ff4a40498002b94fc199ded2c68ec2351f9dbac1740f68f0827f284f053923c3da3ca6f55aca09c546e4f5e1b7c6a0f05a2cdc89af5326721a8092abe09f301b93403a4f1179a511c6b9002b59d1b45a79cb0557b7973c56ce07ff7c63821995c3b06cc0655f9be71f354ac2663b6e36a465fc935c7588f4a4a4f7e5dfb6cc4318142ab8212420b6fe8342774c2060d68c210e5a01e14c6eca902656a4b2a65a326bd30d52bc090d29e244e68642ffe2868539af81c670ecea31896bf3dcd2b5f78ccdb57dfed5904e4d3899833c010740e143449183483187608a67a05191f8ae925519b9518bacb07b784357de385f179674ffa959163ed01e39141c7350193d90167cd8133e7444e44d1ea2fb39183e388c1c588c397c8c1e9c0c3e402fe36cbdd93d954e0858390f1fec460e3ec61c8c450fdd041fac880fff470ea7630e9e460ff6829fd9df636e44e60cc0e75469c9072ad125a3d5dc60a2bb2b64d7b2dd9d9d8c9d579f125f54afe55248e49a59b66f292242cf14d71cb2bc7f61c5fadca748b731d684c5aab034a661981509a870524c8c935c8595b68cf7c25198e66896e40a9f57441db7fb38b316b6693b60438d26d4fe45526cca57b0b6f58ed95f98337e07b13bda9a4ff3dea325d4f2db7867d0862eee85a5bff0014a85a9c83d05c29986f698d975614e7807a9c297c570fccc85b936ce2934bc454626ad7d6c58157d070884acb7c2deff953a99ef5c58f6dde1529333ed805bf0fe2720d8f9185ab9d8052e6cfded0a9aa7a2f2c50a4450472bc3a8c6b9d4010389a132c4893992c8472991a91a2ad97b86ff481426e5c295b447e3f1da2d77b954b0e86cde902a0e9ac54f42b4bd9d1f11bfe2478b9ab65cd823d42c88485ec108b646bc7ca175e23cc7c25ac86d2f7edeb8394b668e61ddd90f37080c0b5b90ebfa3dd1c1770991687cbd51a96db8697b5995eb441fcc554a13ecae5ff38621aebfa641eea69bba40e67f2d85bb291b5599ff06e5bb9d68f0fe69b8255407d037fe57630f26922aa6b39131f8b53310b0145bfcc85b40373e8f1dfd9c98a79944c6e5b6a35d7d78315b140ce7de85bef028c72edbe0cc38f84c594a9388e41ca7569a419c7001c9453ee8e784e2cb7024f03b172af15bcd4f72c5741cc35a4118692784ebf92c9b731d7bfbe65623203888ee4b810836fd3d4a09b1a35a1e1309046447727a726344e34fbcb725ec8b1fafbb27b00f884debc53cb2d736330c396438e0642f1e46de163ed9de436a3166fe543c5844648901af8c7dd0fbcc100b3878a6ccfe1ecd18dd450e1874c4e06dbf8c64025d863efe8967b9f13bb7014b9c4c833601492a4fedb62e08164a11057e864846b3dbb9552cca14e0064dedde16424973f9e379965580f7ca767a86ecaa7223100b5408ca6fd11681d008646a91c7de3d9104df42e60220c1f077c7c75879a4917d84a366d1ca6549f198db12f1388ae8e0841dc6d2fe28b4b7ba4a90a7d78bbed7589fc1cf156174d75092fb48d0acdb190bab188742b8a05c70a8bb5e78a285a4be9f984df774d283ac24e87b2fc89c406b1cb69d50c6dd136b7b33db4d365a406b5583cc30d44d9ec15b39cd08034ea867edd70b0a89eda236282bbb3fe011edb17eb99b49a7f4682500242858ed0e7362360cb0105865281c6095bc6d70238fce049f4471e2cc853453941283cab2aba5b4b4c56d65bfdbe9022175702a5535d6b76ce7e00c6ee5a07cf59d0649770f993fc7004686e4e8d2eea2a95a86739dccd08dab1dc96239872b58e32e61202db3dc786c33ece8fd1499dec8431361f7f1b705f03fa367cb389d22b9bb241b7cf62932dbd55fb540afac930fc5acb13cb5845f55e5c19e45589385be6f6c7866037e0fb5cc66f450e7f490c96bc5f9ec17ec2e0eb61652ccb36ba09413fba175f16a24f3f031255c44a95d34c1b613a842b2dd4b767f1a251f50a34f61a1df49f7b2c412796e2d35501d8d7e39ad911bc0525d61ab6066b11607842262d875e03271a352c89d8748d6dd714c88a41976171ea727624cf5518ffe364840291be62cbb13baa770b15f9abe03dcdd4fc0bdb554d14b614a8eeddf4819b53ec73cf0c4f7b9e250e6bc1ee583648d8eef39b586845ed491f76516ed1b0e624264b1dd853924ef32cb5506a9327b6948cdee470ec76a06c726b5f6dde69f470806d71456d7ff274ca2b52fbb621696dc7ab1cccb4aea02c90b0f1108b9b5e2a53f72aa28bcb9a06b4779c4affb20e8154c84f5d0db085b57878f6f5bfd97d79589d60a325913dffdca35e09b4bc455909186d17890065b4f0bd6b25be08bb66929b7431606a391ebc32133564e7b5f866f32c7d0b163678afb8682e40dbd6566d7f42f83d1ad0f32a84fcadd9cd3b834325b8306b3ac78067d6f049bc6f17b712f96ee8dc67b95df821c6152554b07b8f1d45165200d5879af71540e5b56e43c1305a32701b6cb70c10e02ede05d12ff8192d12d4f90dac8282469bc2b09b9cf2a5cee3476ce4701b28b7ea73f853abaced67507b9fd88f7ea82ac51442ac53eb2e7837647a6723681cf9a87fe95084c2b9a65985050baa42deb34983e9fd6d67250f1e69467e243d0177487ee5fb6b7ee78234c94782f6a90f62d9fb1c19cf6fc2921edc96ebf447b746754a9bdb6996c8b4914b0e8f44cbe826710e55335be7c2fd0efcc5e592701998210a559073806a936b8c915d6010d56760aae46a954779c518cbe568ac0c3b45aee3b988e3ec95d173619108e9a050c72de04dda912a19641799391913f38c87d6d4abf6645812a26ce8aaa67bbb48c560d9e9e3fe31e2fb51163e4d35c9cd96f66058ae33cab59895480f5583008d24d32f04215efecbc83fd645d085307428797a51c92ceb82e6932368e5667ace2baa9bd6ac200b5dae92d98d873473696a07caedffb45ac8200deb0f789a249dc47826ce63399de06b4bba4474f8237a47beea91cf5b3f018d23ee045b7183e05c466d051dd079f1bad08909f56534d317bd88c55285b2de97319a031b2ae2a56c57206462b5c206f7b203b63b8fc689a425fd58898ec7e8e10eeb762d5fa180e94b2d327196ce1549af0273e520ed9824651bac806e59cd5daa7a7135302bf952360f5a7f20741772bf4e12c4fbbe53a308bec8f24a06527d89b0562530f79ff2b656c9cccba424d7c58551711301cdbe6acf6c8e88858f4e2d545a789f22dd34eb8afc526be3ac98759b7026e2b3d2d0c23164b788db67e477e77043456f83cd2390c935d29be28fe72df6b393f7837713a64609245d6676d1cadecab6746d2ea46b9c6c55d283e2b90c6baa611319908b5229a38076d7a97cccb48506a7977d517049a3a6fcb0716d7ae758d23a430f6b9236bee385e8a8ecd58f33114223c04dcc4db836712fae2ce5ec15421943b814a271228cf25a7a89e4cb2e7398f21494e47c4da7aec22ed01c36c27dd1eb4ffdd69eaf80ff1c99977e322fb781ee6a0b370ca3af051d8c470a1b3d561b8e8b06b29269efea91017759aab58e602bca1ef9d5db381208e6249676da54239e74100c4403f14c7ab1de092bff989e9335eec16ca43b7f43e8d3a57908a32936503fd8db6d355fcb4518798ecfde7ee6edd7f848ccf339c8d719659958cd4709d0f462b8d7a67f6140014a0e0364072ed6c1b88879671ed070c05cd3ad33d0ed82d8dc783fc604b4b9cb8d1f01f90fb353cfeeb21eeee61efaf7b8a733ac75eb0c60ec2e38d3b678f24b0a2adce45c4920b402723b6a8233cf9821cdcefa21b2a204b9ae06dfa9a54e03470309a1ba2f9238e07fab0ac2e864ab1eec95d4a7d60411a51b3aa822b494fed10d32ccf69919c4ed6fd473a5527cbd70c2c6c514f49c6d8a24066dbd2ab2d7bb146f3a138d8fcfb15b7e9a5c8640c2af210d8933c0f0038b7b3334b2b517e06005273676a8a9bae802b55b556f5111b8ffa545accb926a4e67cb49ad59053e788d82cb1d327337d5a90dbf3b323b45d519357725a82b69f9dca7793374365d72bbdb3ba84b4a21603bbae3ca52b59ae50b167980faed04c7458fcce6a42ee997f2752231b599d7f26a0f4d49e57a5c044e8bc2294e52661fe5479ac6a04150a7a37cf0a9fbe50439f4cbad9cc1b40694b1009e0b4210831bbe8ef8d269fd70ae4e23bfad4a68859d873a389c08f9566760abb9d26e030e219e10846080f8ffceba3e08a0aa300334e146a63fbfabe96f7f54883ea2da421f5d8f22d3536a2adbf59c2f90326b3e8f03999a9b552a2159b177d726b1e5852dea81939f87b39d019acfacb2a364be775193b3ec96a6949051e6ff330bdfcd82632e8f5c82a689e0f859cfd78df20cb262717e00018ffee84fa9ad39b15533708ac426818c1fdde4eaa776cbcc2a293aeb09367470b4312b39040668764956ae8b457be4a9dbdafc79042aae64098940f00f90d3f5a20f9eb5fc506bfdbb1b5b629fdbb8946dba6233e96b5774c472aebc0176459bff2d87c9b44a46553e07b36e89bd3a60cf5c8ae9394a3815560aa6e72b6c5ca3196cb165b70a1dcb3252ea858ae716f1704fa1ece7f3d85ce29f88f034446dda80180d23f833667a375d7d09e66e4b7d0d7d14c77bc22eda83c7a8bc24ce47c09c3a6f2fe57afac773a8b6cb9a3aefdd8d023b958ad0b64566c5d8a831c4ad8b678e17b5bebe2811870d0890b8794f835d18144f0a031e1773e4bdb8a365d0a51018a9e335d17bd8ae2929183eb2056403dbd97a75e3246f6fc000cec6091fb68de3dcc232c9b8c7e508f7c3b3c675b401407a765af13532649ec440b4ef42650358356fe5fce75a540bbfe04a16bbae3c15efc600a988d794f6108ea25197d64bcff3e632909e7107e692b13f0bebb012cc903b3a3619c549f36c06dafb98cb77c407d0c90fcb55a919925067ec09239918d10b74190670bf4dbb611d768ace1f2551ac2c17440ece35525d10fa8065f3ccf2f3098ba9d1fc9945aae572db02a1a3d1d730616a2f7342e41e7e86b5361d1da37a5f56d8f356e3c9320c10915692d0a559f436036c3b9650dad127e73775391b7a5774481576738f67c2507676736abc99850546e2e066d4c78c511e6a59b989d2e85de54c1acaca5f4653a906ecc89e8f743647009ec144fd3e2be4b82fba2e2b765304f62b3925733c957ac1d8ef26d601809d61c3ee02a197f6f1459b8d83be6b7f7fbcbfaee242cf5223bc985caf011c89e74db2e66ae8cbd08492ca9a2ca5df47ce8a00d640339d8c8adeba679123601b778c64f7defab6e9e76761985e3dc5cc47cf8edbdeb4757e6dd68e2d71b60c3d4e8772a2d1bc7745990a6c3e5b2d53b475f1d62deb8a72d9e0431db080a8c6e7f1af10401c6f844de3f2c2ce26767887df418efb6f32157744842cd16757fb2cd65bbbbaa76ed939659d5bc8999c2599192ca9656f8832ed596261d659013b18512346a6ac4c0dfa19130fb7b6dd1f24dd45269681b89b33fed5a40f48cd122502d941950d49f9237f04178b9a2eaa78c638b7ec4a5b144b024cdd4905cc6b2a2799f52ddd69cf6617302cf8aa1b11f9b290a432e237ca2bc0639086a5b02d999a776002a4d11572c1db79a43d608e1b43bd2b22dbabcf7a9826786b9d408dca1b57bd29dd149698e10ce8f11fb8247500e2121128bc3f0ba80e231202d1f07d12e038a12d61030233caa53eedc2c2f8e4a63ff28f3eea9991a4e6e608f0e4c41c67a9c4c686451e1bcb08c01239c1cf89ce6484631c7e57d668b37bf1050190b9ec64eb4f61b68ab51ffe062ca7314817796b8898fc90d044416d2bcb8a949a39071f34582fa561dda2d4c3f45693d02675af8d01fa4b8ccbd3e65f7af2568a19c70b5e31092d9ad1a7ad59db21237155374a73ced3dc60e8bb7f17813b923f86094a4edab58bb18b9a0c7d67ca72fb38d636e7c088445a27fd7358f785d43a229e4f9f962cbac0bafe52ada25e0cac1278b31f556763581608ac711efb0919877fb60646259467a6450b36c1d7028a5853c934552bb45f2a60124526eecd7c1cd537d1c637a1d5f432a56fa51f393c8507f44b558e5e6426894ec90df5a3b78ed29f6e8529012646ec0d5758776c848e73566684cb25bfdb0efe8074028d0ce154c233868427cb1546fc04bcb8d81fd1462a8c3442ac19fb35ab0f0f4dd4cb14aba00225f69001092b3e8a7e82d6466b9b336d10942a1faf29c4a60a270cbbb265199ea3698e5682f62c7d215da9e96cc2522f4e94b18a6ed2d06825935c9dea15758fed2b6dd03049e2394087ab1269e53b832be8838acb48234f72ecd39e91832aca740ef3062f79c1e0d4d9ecfe29c417e7c593122e33764ceb14b2c3d16d49fdc3d23d3bd01cb9fa2780ff5c9d5bad5551d40846d9c02467bde90ef5a56d08949130ea101d419c0a7cb1af4d2d437d666bfe589f0f0a98edd91107163d3fea1770f88402cb17a1a336c018676ae1a7afb27a1135136611ddf343072698378bcafd0e9726f90ad553ed2f15cd52a1eac08f22cd5217e623813c528ed91e4cc337dfeb47ce6549b307dafb82091422b3256c80ef55d00afdc0f807386a5a1c08fb6cd0a661a6dc34470fb4f6b6f055116accd407aff86f8d1397430732ba8e849d7d81f3c30f61ce078b043fc9e2b7289f741f65cc959a8ffeb05e79e3474481fb74e72e8b47244d7d986637978dccf9cf3cd33ec003347db4967d080b2705fcd7e5a1c01ce91d6119c0087b66ec1918fa689847e26deb06d0a9da629532e96950d9d86f3db759c5f5036a6882bc3cd40ae3a43b12232d40189a6ec607ce15efef038d4476e78a47528f0cbc03899af904f0f4607a708c1ff6ea2c85a7e410d9f51486178661219a9626eb7aba0a4b279d1e78741317f49f14b800d1d9025e560b655bcdcf6f3c579f248599e1fcdea704558d6743a5158a0c48efcda422aa783430a3207ff47ea8c38c0b61911bf9cb682f153b9b28b8554f6203b87446a02ee7c8b4c9fb2a56a81030f1950d638a8849b0021e78f1b2806a66a72bca0de0a3596b5027bf58bdccd59f003358a7c13bda9820328dd0af5caa8add27e2e5601ce1e22e838b45ab68ea54632596a29e7f5a40c11defa19c8f7020ec03b1ff08c0b8e35feab5f7837c495d05453fd21e9dbade8c2d212e34cc6a4b889d0a60f1f1d6430f0150dbe6215fe2aa0bece26b9c463efc0f4841ae2441497a41279039bd817c80003c8f7eea41248123c0adfea30e8c04196a2253676f35cd8622bc7c2bf9e34783d93d690bc4679bc871edb4a61010add6af269b9a85b39e23b853373666454ce00b303ec683f006f23478d5500f5445a8db5eaea7ab86ab5d2826689244d8af6c30c9d7602a1b4e7a7699e379ce5818e31d1e8485a44776da8395694a94432ed940357ab5d96a79fd57103557908fdf2c8bd8ed35770d06aea229f5ec7a72b73ba28e181622203d74b0a349a54511cdadcf60fc0182e5bb762be2eb516b8b798ad2505bb93c4586de0a113f58a4d89d2349176a2665a9fc3ed7b7c0abfa7c2aa572a55d5fde2371a50a9b9c8fbc7a0a3cebdc6276f065e1d7c9e034cf071a5f30e6af58213a09eebaaf96f1f59bdbf6773c5d999862a444d1f6d0220f1ed33b2faff156bf238df2ed4f8305103e4a366ed41e505c233ecbbd0155906d0c29fecb0ca0db115180af5570e6f698831a54f261aa32f9a63c0825a799f48878727fa24b4e745723ae8e683722e724390947f8c1fc0e491eeb781c82a4807303eeb14ac56547fd9b1fa2468bed46280c0da727f2c587f780724b8dd9361735aa16bee815e811747555d451300c330d665bf7809c9ffc500f783950a6746e719b1947ce883bb1d701ee207cb4447c3f00d3869b835255f9553c1e55f59affbfd8ca027f23220f126d9fee37c76161597b524d59815f03384ad88b624627711dd3285edb10eb8370510e1622d2439acb8ec1f6d7fadb0c2f9488eccc7db247114255bbfc65ef1e4e6153804c5ff4e11562d7d44ff10a00a9044128fca8acc734a44bbb0bd041da0107f105bc187b0bb926635da573a19378817ece9a4828ba10ed1506ce81891a0ce3089d86ad0d2695e654ec7efa8c0116ce20a6a9ee20a06bbad041812c858da92fce7f3044533d7b4bd9d6c4feb44ff89062cf149843e7afffc05bdfbb79b092cc87bc245b4b59b512b642280280b41eb301c7af5b3040c2996d72e610192d2209c8033b9a74012fe98905d2bb8261e0f9e239edbc45eafd5b22b3a0d05cc91280d9b043cd1632b040c32bec72daeebac55a7228838265e3c0e155bfc528fa90702b0ec98bb9cab457e9c724028d9a1fc9c32c3d5432008e6b289eeaaacc0a02a9938da4b5dd938614b2900bd2557b339fbbb8b536a5bd8f3118150b958d808ba355dd698fad48ab1d05bde886a85a7abc7616f3b2d54d73f92fa2aaa539c6c050190ca107982c23bce877be5caf02bd6f3f9244357cd04b0232ceb2f223424f16dedd94204cc30f3cb4defbf7ac2828acb23e71d04a64d9934a869eaea5be674b22d94fb6fe2dbd3bae3bf0be5dbfc20b617030a6a6178128c04a5ca2dbcd64982e6f39f04640451d7a25f02390e25f18402e1642590cb84829cb1b9e2772312e3499aa7a0c4507b5b340a1d00e55448e4973e72b56fa4ece6cfc02e0596f672a5641dedd9c4758ff33e7fb364a2882e6420b9e02041e37859ab2ef81e1b57509c3c98351c1b2c33ebb5cf6c4b732a980fb3720c548c34fa993f8a00bdb0b79afe11e1193684e805ab7583ce79e581b25c526fb7b3e95e6a7ffc4984344390be107f6d1e345df89b484d710937f2b273a3fc748677d0e646861f3842f8f55d4910c6a35a44981615b01b904ca2b941e5e1c385548ab2634486e4b46251b6a0da05390fa714e0e781eb6bd070076c754ec7b7d5fc81c278f828fdf5941f00b7fcc859d8cb66cb685a6ef1cc50b6264c9b581075a2db8ce3668452c8f1e2303e5cf4f80b233312d8461410f6b3d702957e81e91f3defed301c494150a809233862114b972c73f3d553e47e7f3991614334784eb5c2aaba417a4e313805917b39be52fb837ca3c73651dda14e9fcd7772d85629ae39a71f83b22e9cdc74f8854b62c14d62e11353fef13cff13a21b03c236e76fe35b36ec2bb119fa029059e5d98ed93070d31b2252e8081500d3d08b13b1daa1935c7e2fa481f5ed0848ac83da68ba0ad2c444c0e8efd2a8120808ae20e56b1f73f752fa06152c90c381db46eac3f566f174181269eb30a48ec393dfc91d500345b95afb8745a2f98c295dc44a84aa85753d4221b90e09ab4225772134a344aac8675627630c3686bb988f4a8987b804e5650d8130f086f3d7546b8132072c28e3cbdcbc0b719331b3f594dbf8c4bba4c6b82dc7404d96bb406c7ecc3df3a549eb8966e12af3de0f6b5528a4fa045e34c44e0d50107866950e187de3453ba13946c7313a3ad2f6e0721c31064d7eba63d7d17ff4c91b0c20a5b06cfc86f62a5ae030426e2605cf4a8315d5c848c0ae073e6aa9f0156c04dab6ee46f6967bcbbda54c49a6d30c6b0d960d8f217df7dc928cc72cf3d10d6de01d971f3f4b822d6925115445ea9d9546e054fcd3bbbb3b11bc3be47b9a0ad97997599d4bfa06a80aef44d1acf9642e69d4049a4f661015bc6f02dd3889e2ace2d2f9e0b8cc29736846c1b46896cec7c7907867f5dfc9fb6fdeae73b2a4285015ffe5752a16c5aac29b254589f91dcda3071985ab702a3e90635a609de4a91e27655538f6fe4e859d8fcbf55ebf243e22aeabe761e74324d379ff20b1f3e1c95e418064afdbe3021244ca554acad46a9592397a805c17902041b2174f9694256558b2178feb753ef2b878660e1e1e170f86e437f155ddefac763024f72e07cf5f1e170f0f0f0f8f0f3c3c3ef0dccb53f9e254c8c3535d3ed4afc8bd9fa37e49dcebf25ce7d363757844be23d27542dc5d2ec8b92abc98168d1a52952651b35cae94caf5f7e9adb3cacaf5dfac32a368547c17e41855ae0aaf4b4c0ba566adb2a41eec373b8fdb91fd8ca259432c13f7e34fa2abfa7b9f6b56eaefbb743ed7eaf0a4aa72a304f0236d88ac7e2e4d31c4c1c1913838cf2bfbfddcd5af3e4b6a169666e17cfcec9529655a9aa5fa8e7d30e57e720a91db6fce1c6be594667d52088a66557109a5595f6c22856873b10d3e3e7e5c822d1f1f837c7c1902c802f2f1a513cc12f2f16550b35c1f5f3e69d68fd67f5a8c03b75a3bff794c606be7e3b3ce7f35f204dcd2f92825fb9efe5183548c0b8c8a0fa4626180a8f8422a460646c5dfc1b880aaf8ad0ae3b12fb02abe0f6c0b9c8a8f690155f15d7509264e57c762676054bc794c0dac8a3470d098c1c30c193764c4f8183637363050305eecf0e2a4c3a926871a1a1b3433356664a84c8c8d81a9302f332f578753feafe3415cae0ea7fc67e870ca5f860ea7fcb9abe31f43c7df46c71f860ea7fc6b74fc5f64d8865d1d4d5e9d2e728177dcafce635bf0d7794c0bbc13973cc75f7e137f4e0fd3827774ac4cf29b68a5168d8a488d8a1f955e8d92489e0efbc1a49b8a1f83621402028a43313a612ae237f193c438254251c52351b3acc4679e999939dd193ee2a4ff20102bfd0783302f8abf4abdbfcbffc7f6c38f771cfbf9bcfcd801e17ac7f9847c001ec77e00682b5ff5f2715441ecbc5b9bd4fbe3d4cfb349bd5ce1d8a4522fdf1fe7694a27556d88a47ef54252bfd249d998fa9dfaad9ee77d10328094c5f90ec8ab541fc4ff87bfeba9e47cbc8f2f89bb7ad805e1d646e7fd538ff3aa6aa3f3f255363a36c8cfd579f9a95f3dd569e9541b223abff342747ea7a5f33bbf637592b8aa55fd56df9312f23dadaa9f7c1f7686c04b7d1784904fd92384bc8e3d22c8ab7e5591c4ab7aaf9fb448e215626390e779ef7e00f2aaef8e4810cb3e16895fd717800f001689df1f40fc7897fde0fdf1fe43f5384f71aaaac28e88e3ac5e7aea558ff3c37e4a2e110742955ad94f3e12f7befe41cd52a9ec87c463b4e2f93b6954bc405ec7ea00791d9dbfdbc579afaa97f54b22087f15140fc7ca377544fc75bec77bde716aec7ed02ecec7cee7a6ecf77353a657cd5feddcecd86fca37ddacece7aafaed7ccfcbfa3ccf9d4fca32012f8e3de2bece77f70390d779d811b9afb3aaa99755f538f54be2e2fcaddfcfbd4fbbf3e1e7aeba20542a15cea756f73e4efd762c927875b85b8fc0799d55dd795953aafa2571554f57a9552a6555bf63b951aa5f3d4ed5f98bf33a38b5afaa7e48e2d5798883536de0fdb93644e4e3bc10f9382a3b47e0d9fc201fe7715eda78edd7c4d5799ee746e13ccfad7c75ecfd5b81bc17b93cdf53bf242e4f74b2c93c95a1407e7644662e90e7a9feaa4acd02623f78817cfcb89bc279ff09e4574f57d55f28f080fce7af6a43c47ff52bfbf9ff5cc6b450d56ad509f12c9fc2a9d3b9a5667da720fed896a5ef67ba94d2254e4de9ecf84e4bc7875b2ce9c7635a302d8d8a1812900aef8fba44f48121794ecb6259fce36ae7571f9ba5f3ab5f3dd72cd5af5eeb7c561b9278fd378e03f47a81d33dc27ff53b95752ac5495de0748f48fdea7fee0e55d5d928292dd7a8d4c729cd4a7dfc9826383838ef55c77e487058e7231feb7c709e4a1c1c8ba37ad7d9796e714e542ae9d272a35ad6c63f5ef92acb8ddab136fef3aabea775accd5d22fe4c6956eae347279d1397fc26ae52ffd9b85f6c22836294964da05c95fde2931be78def52f0aae84196f8393ebea4024a26cc7c7c9945b3747c7c49045b3d3ebe3402efbc7c7c99046ec17c7c69056cedf8f8d209dce2f1514ec1fa9cff24146efc19650ef5a8396c604ef5b0c585cf430d651083172e7c1d750ba338e6e2c2cff1850bdf9b78ff4142a68f55dc8a4731af78587816a6cf3253669a9d8fa76a1f212d75ecb88483a352550ea7facbd453e756952f8e939b52bd3fcea752a9a738383838385aa87054cf1d8e4ae59c7a554fdb3496a5251cf5c3dc70e3f3503fac0d37fe8dfa615ddcf837f5a381aadf8c1dea274387fac5c8a17e3636ea07a346fd5ed8fad5d4fad17cfd6468d42f6646fd6064d4ef2546fd5c6cea678251bfee45fde8fd30a4afe3d7d48fa3a95f763f0792894bd80f6e4cba9f445a02de0f439244ed62b368b8e41501798e134dde653a3a6a62fa24f363fce884294686a27330241bde513afbcd28386248f387aa6c76fe078f32cdcecc3a515d98a5f2614837ca677867d1e51a3f3e9a803fde84fc6979840ea69012745b97a7c881146ec68fbd117eb3643af19ef00b0a0b7bce924d3e7aa322efe1b368a9e347798fdf44bff206eff3a397262f1ddb5f8d8a9e2bc1c1b32132f3fe33ff73b3cf5c09468353b66dcaa61427f44efe30355689427adf5686a0edd3f79be9280ba48845a4a32c1af5fa711f924317385dff388ddab63f7478cadedfb3377833f3a346c5e806ef8353b488eff2d1c5c6262eabc4286e6cb2c5abdf84b6e8d456a4f48f58b43bcce24affb6df1c8a427f34a4ef47fa3774ffae5a6b59b4bb6cf9d0fa94f6288d8a443f4343d10d1edf291fa3962e3c976e2352a3b8979c64ce95dae0d910f17e2ee75a7a3a763e10e619e659d3b46f99f6a1194b2d17d3439f4c6bad693ef4e243d1085a6104d41161095fd67ea358d4a818af340aa959de9c7ee4b15c4bb32e60e32a35abfb08e13dc5e89e3b36f9ee31e9f2990b91eee5cb9f4b31aeab7c63171ee53afabd8222227028516ee49038dd290dc58d6f7ba86313cf89454f3ac809922c1679b5bb59907f3ad8d1efe920b4ef2a61e723e17741b7939d13d9d3cdf7c20e055025e5fb8b7e3cf257c472a3c9f4b0dbd44bbcfe1e875d3bdb50342a7eedda05354abea6f538a4b2b54cb9b0ca853d34347d080e9e7ceda150a358ab92ca4abf2b12dc9548b82bbf9d78f27bbc6535b272715cb6c228e872dcec59b91e8a593f7740c8ab69b6a1804fae5c8805122c9a462f3e3ac5eff11c38e54fa7d50a85fa3f355217ae7f17473dc45bdca11eb22ba969dacbd7aa11f1a912f1bf9f1b6d06ba288858d9a3fd4679569d08de612238c544f00ebc455d985b7867b8fe71c96b129b4c894da64ce9e9193c1193a8f7a042f96be59bf83747396efc8f91746efc7abfffee391521155ef4faaf5458e4cd095b0d946d7c52b87eaf82b7840d11971bdfe5fbb9523c201f49bc52806c8e4017f6d085d9269c4bdae937cc0fbb0433d06538861d867b41c9789c7bdfc4304ef15bdfb41567b1944d93373b4fe3b22c28ddb439bd0ad9e4301f78f01de33ce9bd300ccbcb1c3d189f9ce7659dc948c9297e092737c393a3d941d3333c5cc68b31726a5b678231753c1889b75c1ec25e32ee374e49cf853946a3bc467166da3aca717433693e3d6f661f8f170c46c644ee2193b1673dbc0a1ef4cca361d738d5e3728de7d2237baf82079d3fce3bd5708a5fc7953de4de8f32935996d198da9c337b6e54d5b22cd3348f334a66969cc9e81042e89c13ebc5a4949233ccaba07db71a5aa8f2cf989951382e4beebf181baa5cb29c92532ca36b1d591c3d074e65eeeed994d9a4a8271efcca297fc8f2b35b659459966513662e2767dacc30b9dd70de6474f6e19ec5daa351fcee710ec97cf4e081c3f6ca6f58e314db681475c916f2a9a16a83d8a95159e636c618dda7bb239157869b76bb99b163d4e2c17788411573d482753e6c91c88a2eff332af3f82b3633c9060fbef7c466964df11bfe24159be2c18ffe44c213d5388c051e7c7fec89e74891463663c2e8d2654643baa4d1a2e750ecdd73a1586dcec41131e7e9c49c31331279f9bb286782dc0ade51d26bd5a3c8abb0c3f36f6e52da2fcb60f4e189c4d6f9f0736c659c938dd44928a5785cf0b78a1bc7491c78f039761cd6020f728cd11439c819334308d9fd33f7ac778f4635b333fbc7192ffc5697b3397f5eae1c63c69fc128a4e421d8296d6c34aaff3d877bc738fb6e9b6db322f7c0fb9eb5f04c8b47363bb9e6516630dac0e1f1b8fc132693106672f4efe74a28bfa879a746f14f18ee25a3311c7742f8a38df143e204d3f9f077163cc66238a9030fbea43271c669660e3633bfe91a0e9eb8c8f24547098580628c586597b6819b88457fee2162989431b28bfbcf8b316252c61831897d8c9894f2e70358c0e05d81a0b76469d61663703a336a4444148be0cc4c44da14229a4231f7e3d7bc0de90e4fe3587337d1b7f0a70907510fa3d4856f5444a432d2e814221212a2443e436090caad7e3682adb62ba644846c4fb7156c696f58694bf3ca16787cb5a5a8048e4be02b386712c5a22a8a88a6709d7e4f43139d44936812c92824d65be39af877601c2a13f3d22c8d827589ecb7f7d1d1ca2e3a6f47a99d442693a927d112ef98becb5c18b2a8d15353ed2b59e019b5d17598efde088c8d66c4c5da687fa453927594e8ba8be54cd4d4fd1197efac122a4ae4d3239d92f89d65970a8baa90c28a2db7b58905e8522e92b62682c302745d2a2b75950a5b51c402cd4d96934b573ef1e0fd8f5b5c4f7fbc83051305dadaf4b4e18a084ea2a68d1b42afa0469c13f08990b7b81d5ef6adce87fb5627a4afe9e90f2ed62554324e080adde16db36812354a3af158449e035d5d144e4da13aefbc72051eccfbd325de995df04e1b208b1235caff8566e194bf505a063370ca3ff317a754e0d1fff8f5e24e08cc7b9837e259fa30d6061a79bfa1ff626160601ec626e968179cf277a144b40d97c2c1ca75cc65e9d2f684378b886ca085d01a8949ba8ff6c745ab90c28acb55ee521bee974c20179377519940ae8fbe2e1769e09c95df8c81a91998be201053376495ad286201b7c5ef5675c814787348a8515308726afbaecda9ed69754e6ddb7375326a7b3a9944265993e0fad34ec8cfa52fd8c298dcd8b1125d7f0742efc0fbb8ebfee5250c8c35e2f249ba7779cea5daf4dbb40dd2972e71cad9259fe06490c741e13c2ee83a7dd90811dfe58d44aa74fddb1a899fa47b68bb289cf28732055e34d25e7ef72bcf79a8faef08c64006d808d8a24896dd10af34ca9f16d11d5ec6c33cd04da68f5370e74ae0943f97992812ed240fb7c3e3e9bae8fad325aa44797a78da24253e7747a02b5a242ac02a7f07c1f5ff7e5cdf7204a7fc29100e482784e6a2408ce014e5e1a810d0455f28f0be585444b3365bb320413a1fd307e984f4a5f48723109d81bb74297382bee8968fbea01149f06b0af18e8603dee14cf4a99d42d60a3198aee0b828b03585a0cae5ad10e14e18e4c007d73929d7f41fc703bac4017530299be20860e89e08272b1fc91b2b15ee7c1a763685860ce97c4c4f7d601fa09be856e1e5d7d5bc28166dae686391df9cc0c4d1293485aeff56fb6a2e9d0f5c57ba055729179cf237553a06fa03076bfbd0f968ef030582e31983eb538851feeca22ffaea272d749d8be2fa734f9c81738cf09b1f3a88b28272bdb0029eb40b06013b71fda7954679bc6264639174e27db1281645a33a8966917fb7a48b025b7cbd83d2b9a04b41c7a423416782ebcf61f98fdb729d63039be13a1786ce6e23d0e2bae5ac70dd6a4b1c14c62086cb2de13a77c5f5e7ae70513ac7084e881b7a29f992e7f8734decc74db0e2b4c441719d0b9a175afa9ac263978c13e0e0c91090eba3afad9a2ead3cc511c070b99a5d2038aeca4b2b2b2168e96e3e9b8e0bab5f9aa551ae445f3af0b0ffe84b5b7222606b0854f977ddfd5677751d088eeef0e6007800d0e3145f2c9a51b857b85ec42978a509bc8fbeae3b7dd5a5215f3b8d126d22fec026e06c116018d6d1ff2e81da04f1ee85d0d7e0316c9b1941c8ef4da1fdcc655cbcde853633a2c2fb5c9a5c9726f0fb5d9c34cbc8dfbb1c140510b040c20a7ab024660a148cb959d947e6c9030ed6f61eed87bdf6322e7f9c0f6b2ecc81595d8b83aab6e196d749ee9c396e7fbb983aae7237e0ede76e0eb7dfed09b39fbf06b70f70f54b72e7c3f93d1d1f7b683b462ba0548246da0bdff80be8ced164a35bd0ddddd0bbbbbb1bb6b7135248c375ef26502c0cde37a90721f5d00b5659c2c2304d4ad41f7299f7a6eef326b67154ae5438291c3cdcb841eda0430e366ad8fa3466c888d13072bc8f1f40787aae0b0001f009226408111f7e1000100308a2881004288011031c39c0100848800216c080063880880740200245c0b7f9d47df13ddcd3ffb8355f43f334333f23f332311f03f3302eeff2f22f3a5e8b03a75c47d5de0004555b38b5e449e03fd8c4c77f304808c87f7088e73f38a5e73f58e5fe07895cffc12200fc078d02f01f3cf2f90f2205f90f2609f90fbe86fc079588fc07977cf8af817ef8af9b08e0bf0e02e2bf161ac07f3d14c47f3da5c87f5d4588ff9a8800ff755101fe6b2323fff59101fe6ba423ff75d201feebd710ffb51202feeba504fce7400af8cf9b2ce03f0f62c07f2ed480ff7cc801fff91422fef32a0ff8cf8920f09f1745e03f37ca29c29162e490b2f9af8717fffd38fdc755d4fcc74ea061d682cc7f0c8698ff980c30ffb11a5cfee337bcfc074770f9e19d8009833a9eff060e64c9e7d7c13babe7674196eaf9777807e7f9814056eaf95d41a00f0380ac9be727c011c8dae1f913d000c8cae1f9213001c8aaf1fcdf0520ab3eff12bcf3cfcf0464d1787e0ff0ce8ce76f02b2643c3f0c0164025b30381eb8a5b56c5a00e0d6a955f3fc05e016cdf32b805b33cf1f016ec93cff11dc8a79fe0c700be6f93fc02d97e78722e0d6cb737777f7b64999cf55294d66e43ec74fa052f17e0993e91281c7210e2e2aa65fc2e4e4a2d23d931e2e2a5147edb0e06a770514ba26c0d61530aab60455fe12a85a1be08d5f1b9b87f12f5e7c8e3f9d5ec7d7d0d03c8f9f99f91e5e46e6591f13f3390fd3e35d74fea52eb1f3da92e748e0b123cf9180ed8cbc6519aa5affcd223c020e017f8013e10ef00638037c01ae004f4023a087e803f49136401be90234015a882ed241f4001a881640fda1fab0444469c84b485210249fa3001801a0c84574abf44ce1190222f423c84765bff96013cfd9d6006ffcfd19b6e070fd5bd6684b03abfc75ea360656f9f7a8db1758e59f53b72cb0ca9f55b729b0cabf87ba5dc12a7f1e755302abfc77d4ed08acf2d751b720b0ca3f47dd78c02a7f1875bb01ab9ce01bff55dd6cc0297f55dd7200b71d70ca3f55b71e40943f8eba01a16e438028ff1b753342dd900051fea8ba5151372b20ca5f87ba35a16e4f80287f1b759342ddaa0051feb66e58a8db1620caffebe6054ef9d3a85b1820ca7f46ddb8a85b1920ca3f46ddd0c029ff9737b8a801860c316090d1c20c15686a4d3dfd78d1834dea8889a7c126604e67046ffc39c832e5ccad9314b2b01a4e1ab54569943fec7ca65c7f38d4dd5b159f2d0a87a251be05f96c4f1ae59b934679f63d9dd9ad09a73a21b8877509f8d97b9589d37df9ad3271badbcbca84c7c4898979e3c320f1907857f33cef3dcf83a95b149b091815e4375070c028ff982a57e54f6b0cae0da0ca5f8bc2107234b9d80d8a985529d3426d097a316a75bbd2a8a2ebdfdfd3305e7ccdccd3e678a761681a841b90df5818f5db806ebfff8bfa6d36b8d98ef7fe5b083627cd7af91d8c05ccda5ec03b1c0c660059f2dd32e15df835f6db9e5cff4d05b00567ec16036e69bf2db91e633fef616cbc52a66bbea94a69e2b9e677550afcacdb6c70fd3fec688b016f2a80aa97ba39d99ee094ff563716f0f682bac1a06e3380287f4d06d71f5617988f794d7b19996ac32af8311506aae067d5aba6da5005bf9bdc0cbfa83038055fd6198c82afc9c8c1fd7c07d7ffbb214dde7fa7c8395c7ea0cbbfc156f6fc322f64308bee6ccf6f7580015bf1f96bb8b8b8bc8b8b4bb7942627d77caf4a69d2c335db54b5a52e3867f20e7cad0bcd0d5a1c3620bfd99c5c0fda9ed858b0996073627bb2a9405be294bf0c81d7396172d285cea83beab2e8aed0698146e13f192cf4c871d31965b56302abfc65edae6014146af77546465de8c070fd63edb270bdbbc2f5d73a2cd73b2f5c7fe9fbc29609ef62339609ef9a64ec47a387fd4ef6f36e3a23dee9de9f7695af04819775462e5609258468d77c9f8b756faa4b20f160fd5e601c672e09e47ddad2d5de81ae673f36322a02b72eabe0fb6f56e07fac84ed09ce79a12d6d40bcb364738277e8fb6f27e00d04dceade7f2b016c99be470ff85f8e4f5b82ff558fda4fc6df54615805bfab1aabe0737586b7caf1e4140cc0472f8c452f3cfcec6802fec8f84307a7d3494a4ab36f66c9f573e2314b0c934830a72169485a16198c42946d7cf0e87e2b560c8dd259add648ee7cacb6130ffb1e9f156bf7e804c3b0ca01d82ec34a4746946d7c9d94837a466155785f0f971e5732393052fa3f374a6c08ac728f610fbbc865d9cbac878f1e99c99e1e3e20ec1ef002a795dd9eeb9c1e58cef4d9ac0ecf8648fce1b02a30efd12797308b3b94983f7ceeb00c724e2e67e5f634c5fc3309a167fed66b547fb3a2ed9e49fd83b9cb126cd8b0f1100bb0193aedee7cf8bb8effb1430154f1cb875877cdcf7109651bdf2c523d773e467ca78bf3dcf9708ec4498959399e7fe31766d1e73f316be6f963304bc73b7fc62d95ea4ddcc2c199e1966420aaa3ca992a8f241318159fab920a888a9fa3aaa6b8aaf8389e2abe9450b8aaf84edbeb12abeff1aaba84ea611ea72e81f33b5ed625fc79a452a954ea7bba22f1eecbab2a12eff6f03815897759ef158977733e088e97c27e4451a5b1cc28b0cec7edac92aa8da593aa24ad5ea552a9a22bbd523e5a38cf8d83a383a3f33e5a3b424e9ee7425a5552af5aa9785ec84efd30a21b5fe747fd783e763e403e48f580f03c92788100e964a2134c8b466ad691c3210bdb5896d4c7d57f271c55ca6259b0342ad6a45e65bf7971ece7e1fcca3a86a5b12ccde21bbb4c07de8721293d0c8921a5ec37b957591cfb9d224ddfd7d5d30ea7d758e18ca9ef9d14d9cdfce31ff18f56091525dd11d32b997f247ef747fc5d4c737bc62282abd18ce366c1d6642244b3993601f13b6b3313e0ef626da6e98f746fb236f261de66bee9d975c4e5633ec6dac88f799b696d848079d31f817953cc2b99476294983ec6da4c1be3a2047c430c4c7da91ea7b2974f7832c8eb777953fdced20a3b2805a7b2dfaa87450457abd89dd50aa7b287571a9541a346653f2d2c721d78993d021e7513fe03e70e28dbe898612f98f6d96b1ea77afee41c8b59f66e0f7a33f922efac280f1e8deacfe243e15d9baec2eb41f01ec05d0839a27bbe3176ee1e7966d4b188e07ef13276842cdcfb7137c628bcece147970d91eee7cf8efef659fdaec228100aedcacdec10d04e0bad70aadfae28859208ec5d54b3709c62ecc8ec450679f1ba4a69a3c7b1b3c0fe0f4208bb2184104208218410420821eca22122843d5db48aabd5161c5ae11d18432ca00a1e118df21fa2510e89aef440a873a0cba195667d738866e5b02b0a66d13c3f246256cd73ff805b3170f8211566cdec805b9ffa0f42910366c9dc805b3670fc077170f9210d98757a7e0805b650fcf009432166c13cc12d1c3cfc07577002667925e0d6ea0664c22c1e373f4960ab073f120e28c12d1f287e0b308bb67a76e09f00b3b60f800e0e6096e999df08b3b2e71f8259b32500a8f21cfee3295c7e209885bd0d7e1fb855e4e32a8c0461967c863b0072790acfaa592f9e9f47f768967d7e7ecf7366fce99fc6c7802d180527c68558d8802d23a0ca87b8c13b09e094c3272bd8824250e59fb2386c5c1e70dcb05ff3802d0805aa767807da80533d600b0ef9802db8a407b6609300f8dff0b8281f3bd8af75b01ea4024e0900b69014812d0e4023b095640adc01efc01070ca3f072c6cd8a31af6eb4b5b0a4ec1b715168151f06b854260f80346c1174bb8e23601850a2fac0283469d0283f8264685407c03ff050c18568924ee8b17f6fb01bafd30caa9866646060b2312300416fcfa8943137050f286245b3ee0060fb4a1035d706069036c60620d1a5003122d1948c3126850e20c492861c00c17288305c880449623c6f07151812d8c7851400c13088304c0500496087c01025e78401788487ae21f03f3e2b90841b1c19015a12b04280eb8820b341ad0842dcc600013b4206301465ac450c012b26093002bb0000301555ce1c51057904e075082156a8e5051051a034c418519234559c81420095388210012a4002384145128c24741301406c04f00829d2000c6e207bec2076e021166c2103612c24b08c256f8701501e02b006025b89c8acb53f414c12570c9f537751cdd6013e8440541b00974c2c30304c88f1f3e7cb45a3b3b3a3a3d7ae4e4b0583df4c083c78e1d3a74e4c8b15aa9543838a9140e1c3cf070e3c6cd0d0ab5c30e3ae890430e366cf880776ac41ab7ad5b2abc53bbde7e0805effc23f177d7027dc08e42712049087807f6805340fe5696ae10b6d0b882068d194d983143061364c88861142386cd126c6c60580103c68b2a5ebc385d399d6a9450534343050dcdcc14333332453232314988898141020c94e2be4087feecd09f1dfa333bf46787feecd09f1dfab3437f76e8cf0e2374873d7028acf04efbc323ece7e4aa2d70cf4f4d0f4d0fbfc9cdcba68ee3ace7f2bd65532697b9fb47cfd15cd45bc2fd8be7994ca6e7b87fe138137431994c2693c973814f376d66988cde84fc81181604bab9d8f39a402993c873e66742fe3dadb9bcb2ebc8fdc6737592b7bdb62ccd72f9ed6633803ffa3318402053887760be3f7b01efbc7c3694d5e0b697e9c0ffcb769033ffcb800024fe97d9e0c71226efca72709704f10bf36d304be66fef75c90e0f06c6f3bc9ff337294c7ab8a85411f02c61b2726dcfa4874bfbee7cbcf6cec7f33ccffbd9280f3e7730d0c5d4712f9c83737c2fe06718067bf836b8e3335df85e97307917c31d1fcd85cfb0870fe6ce26e60ff4698572b3982b948253d1638c3c1ac5df2cf99131ec21b4c2a918e13366b3fe9e9e598cf6eb87b165dc02a5b414c3b02ab1c6e2e7e3f237d13fb2271628db40828df5e0c6cded93f7626a59340a6e30301adef4c37e7971bbcae84934746bae69fc8daf6751a22fa5a6485c118dd282fe967d468da891b6b40165d906d4a82dda92b6852acdc0fb180b35f26ce0cbff7149f945a4eb1f3b1b8fbeb8e5b6b6a5953ebac47783117edb2170495b62a322458608808bcca12934a45945684b93685e994694051edce89b2af7024eb98b5da1507f92d657520654e06985eb38aeffcc625ee99cf8accdca2cc2e2fa0f812d6d8955feee46d7cebb3d6cfadbfbc3303d7dfa476cdad22bcbf61f7d6d4acddab6ed5be995e595e5a5b43553bb017d5388227d5a5afbb8947dd42284fba8f4860b2bc6fe948b3b89e821dfc0adc601cb2d498049b856eec7b7a374144e2551248a715b9ba073d1e3604cffd9b8998c29fb1a54c7a53b3c99e9d7f9346fbf80ffe2c50b48c3dc0c2633bb9a130d5f0851fe3072512333b305a7b8d02a1d036c2a4a5c888a3c2554e02be9dee595c4efdee58d74f6ddfbbc860d5d925031d27db4494e6ad00209555c9d958142052e765191c190dd24e37b5a880c1bb7d0f1c2c640ae66d7c45d534f2108a1cc9ffea5f3399d4c27cce497c2d0dca02dc5c0fb6251dc6267060d5429a3af251c7d19798e3c6a2d9a25f3fef1c53b33ef1fb7e01d2cc6fc176f4354ccb7cc472d624cfda8114d0c4d8c913135267271fd63e6fbddb09addd9c574cc24b2e3d2efaabdcccfc8d0a7361d8395a87c36ae8c2310d93c773e26bac393d1649c6454beb4860702531444d7466f4bbc9f17ce789bb6696b23848b0bfd2412e6a935e2f22fff629374eff2f23faeed4d373358df3802d11219800cb3ac3af682ae7e37206d097b6d48735f8e1ac193a31b0ee882f4c7f062943fbd42c5c9bdb97c058a2e5c1ab9ad9a3ed6205898eabc9ce95da2ad4ccc6bfa3699ecb4128be69530f0e2bb3cccbffcf6dcd39787f98f2ec1fccbf7f4248a4593c825d623dec35825548cc8877925dd7bf608ccbf5825f2612c55f21b970a87ba6e17561dd7543d0a57bec0db9e73a7ef0fc3f4dbff11f4e7a47fd42c6a892625e21b6a8445a3fc07172c9ad5acfe1b10b5fd0e0f7e4fc37c4f6f59966599a6691c07636370f63433eee338eeb9a75a6433fb39676632797d03dff4966b5446939ac5d9afdff4fe30b6a7a64a932852667aeee98dce87e362112a1a354ab34a4f2114bcd837f02907c42dd1d228a74bf4b58a82b906fc829727bf33511a4ac372d96dd9d12ca718cf01714d384f46cb9646d1ae388da31bc2b72d556a948d4b95a89666d18fdf7fde8932112c66c9b0661e5e38e7122f718a7eaaf3a148cdda6c90222c8dd282075b66f654db78836e32696d7003b3b4f7d7e22002ce19e2370e5b454095b6143333b939e734bd8ad368111de5668534ab7e672a56b34b3b6e06abdcedb428ae6b4b300a4eb991d0d09459650978773a88dfb6c2fd3425cab510bc2f1609a1b934d31024ca6dab5fadb01c11f06340b84a7e6727047445206a5fe035e46877e7439f3a3b74d3464d1be7e2e212c3c1cafd46bd4ab3740ffeb1327917770f305d90793925349e5d4a5cfee3178d9a84ca91f8336a0c37a3ba1489dfe4ba8bb5692b0474bd5418afb24bbec0dbac9047d42ced595b1a02b711c0d0300d9799b44ec688116386cac4cc18dc0e6ffb1846d8d8546ad4a8a346c178f1fe5d0e602bc6771f4491a07066e0b6c4cc2264b46c46886bb01cbef1779a973befca733807037ce3af75f34d2f3899a7303a4d06cb68be330fa3f3c99eca60195046e58b04f21aae3fb5e17678356fd3f9606ff3361d5f1915cae06a5e46e7833d9dc133da4d1cbc27233c46cd4197c31c0daebf90e714397dc91478f4c8c652239a3fc18c59d20281d4d0840d32db673354a8082121ac861b42041bc1a0f11bc9c5160db86df0a715f8d072d47258a577767f6d1e9d8fc972a61d278099c6cdcc78a98f2d52206d7aba7545de16453ccae2462d6251d2f58fd5086ec13b7db7708167b24934cab7fff8e51bacbe753e5b14700a09cda269b403d71c4f7184a30baba6434764c70c81b7fdccd73cabf3a9d981abe961124da2198f0648dc9a270b48b41976dc7bb74406e06d8c5aa158d0236a44a9113da24694d249976466b82c3eee0ac784ebcffd805b457041c0d142f9b81f7d11712ba0dc92eb42340df6eba2b8d0421f5cf83c830b1f42e156119004175a98820b2dbc01a4c185160e17765ad80c97e3300385c4c0850b93700bc702fc61c3227e71e703650a3c4a8962fea34445388603aafc7de2e0cb3233da735c96052c02cec86838fcb92984121242c5f050891bfd7efe1ab4275676cd8b44124668fc4ac2086d481158a5c88fb5c9bb2a139309ef6e6fb2147220984834ca4f37873b26c14b42c5487cf9493a693d3771b4d2add22d8d6ad2d5255cc7561461b9927bc205760a35aa071e7d6b82b1722eee7c7c5c08b5251db166ae207da15f239a95c40b8ae0fa33a781d9709dd170fd8d261145b29b6d7671505bd2b62022aec74595f88ae04500953e1b57c7e5b7bc13fb0200763e5664d779636b5b36206dc9a42d31515110362805efc0cbc9c8f9959183b58b88b667c2e5a50d87a300c836eeee2d878e4d4b0e8e0660c72a1e61dc13ba0d8992b1d8a21cc258dc4897e4135edb248ce0c1992abd5d798a23a4e152d8f56f5bd357a34cffd1176d42c609e10069a807ce54b9db15d6be5bf5db9d0ff79b57fae43a0ca6affbc5a28ec229011419c2a6ffd8681e65464242d4148087adb61489faf01543b8a729120dfecc2c68b117a66431a5bea285d745442f3629599752a0f070605d0632c85970fd3d887766e4c897df2cc9781caafffc89ff7c05fff9132719948e3b55f932f5f4d485a33bbc08b4a4512ef3326af9a06f71252389054eaa6b6c23faa912fd5fb498fdbe268a2efcac0b22eb0c64f593b11fc4accf54ecd21d9e0ffac2b9cc54d93335ded8054ef9d38c93b57b72fdb3268d8a55fce6156b3caf4a104e4a1ec9231979248da491c4424a4c4a9913ce8d1bdfd3120b288f2084379e1ba9513d6eaf3ed455f21be7c83b36be5ff28ecdf763b085848fdbcfc36395871a8fbc8e59c4a4999a1af6fbcc7ea8cc864d6d35f41a60dbda5b92600dfba1ee17939ec67ea7191b39e5af010f7bc928bcd3f255a5120fbcd33fac48fac29845b32ee0e3461ede3f2235abf3e1215e2d6a3e5c5460e3a46ec08fad042d4eaeb086311c59e10c9f64021438c1e2042510824b666994471a494919c05e49987d25f98a474a46467c8616403184144cc1520619b011145100dac20328008dc0e5581ae533b52f5fea71332a94519923a3e01241e25522c9c59e48bc98957271c4574c4a62820636bc4029065ba650c3cf0a54700508c400743454c5480ad490650636e0c20dda0024055648c3941764210d53b83c8b4655f11c19938ce20c69e439ecba9fe4c27537f2e07f355d10eb35357046ed33341aa0ca7f555b0ba7fc73d45603a77a0d2790e24c861a0ed75b6946859709efc39a604d30270da4b5f0e745a40877e07dad7474fd5ba9595a9af5c9a025cdfaa491dc726595eb4a9f7c01f9cb57346ad6e97f82ca90821ee8e04a10caf00597bf14f21c8e0c476083195ed0459434b8fce590e7fcc8c00b5c4ce1448a14707082cb2530831b506109413c8842125cfeac1a8351fd3dd467543f8f7a6254ff8e2ac3a87e1dd563547f8ccaf164547f4c8d8c6a543f75e1666011174208a15522c9854a7db570335ae9f3fe72510d84aed254722f5b9a40f06646f3c843f22378b946b55dc2fbb0d79c319e93ebf0617c57d8e3dc05e987616361b5f6bb0b02e3ed4bd16cd4f82dee41ddb7edf7dd7e86f6b3c0ed2417c9ed2f891cff4da0e6490456ff398046680157f5df10b72f0605aa0c70bbc87f466edb0f5a2456178bf7c35e89ecbf24b78f981f1f93fdd142d7a2c48d0e78313e2a012ff4a5866d95c8fe9bf0b1efe9ac1bc62b8364ea6723c0e00051feab8ab18151feaa8a29552c4b908c27338468bc3f06e55fc6a782667ccd131a4f2374fd7fc642e9aec6d3c8f5c7813b53a322b9335f1277e6bb1b00bcd07e49eecc53ec356367fececcccd899cfc0cf9db11980f6b1aff95869ec17958850e67b3c569aa7909ba9703e8e2ae5c5cb542566acdd3603353c58265edc1b2fad55e28695e2440efeaee45a1a95831da209d46fbf7d8f7ff13afcc74637760428eb47d67378768d60073b0247dafe6324cf79615b49079b03c46cd8d064500c3a2551a3c647a046798d8f4d1ae57586c0abf13635ba460dcdd698aff5cb4870fdbf2e2169d48fbb33ea87b9e1facba85f1602cb8d8a8989791835e61dc9834d925e0809bd5e7c92ed47c00177e28511494600a7f88dbf034527bd74fd8b4bae073d1982e2db6bbcb4fda6757b15cf692cfac6df9be86b220fcbf52a32081e859d86566294bfbb6466f63650524a09048f955082a1fb612510c25e3ff04a0024ab781ff66a568213afeb8f65716ce93a9213469d4fe1b27c089b6a74e3b8937e652abc34d6973b2b06e4478df2e71d38053ec2f5f7266294ff46d4a88e91e3642aec02a7bcc0a92f5488c5c2244ef9c0fbfce8c8b39079672aa88072fdc8736450129ecc67ffc920dea9797fd805ce69a51cb8053cc3a549f22870cafd48c9735c0a5b5c7f1afb3909bc70fd67ece73916aeffec21afe1c4b04c86e3eecbe50b4967e0ce40207be0a1200631624b1142efc59cda87bdfcc8a167eab0e7f8d2df550817574ce031fc9e31caa1a486585c380f086ed4876db9fe127bcd39e78ccc8ccccc30cef33a1f291af68257302dd7a53479d7652a8c8e2ef66a567c8cea001b9253ae3fed2c7de3d8ab518ebd5210457b4f0abba79ce2f23a22d1422b57888818f66408bb39024fe67e4d443b217de5d4449d902e6a94ff4c2e828262603f11c24550b3e00be1028a102e82b2a046f1edacbb31a5ebd8cb6f5c081737368635c43a215c602fcf71f79886020a8af38f4d94fd9c9e773afd674d4474bd720e9c826f1c4e011ec5202f4681304e196a1412aee3c38a0477bba15cef278d4a6a9463e9de8a1ae58fbd2084101a15dd1d97a9303ac1edce87b60c6a0821849dd90fc2f467a3b581a0a930155364b9b20b0265503f16e3b2125090451af18dff84d268ca21cc062d013fbab4cfbb1ff662b8156d57aeabe07af68413dec45e8e612f6c8b7986eb5817d733105ccf9cb8cca97ed82fa5d2e51a3f3a34217f68ff60594b0125caf8d1faf37f3ff77bbbc41a4a8c99995949322a6a1b6054f4f890087b8ab1b008fbfdb1e84848c282850a241cad9060658a778a81a21e7522fe98ac4da64b7eac4b98f470c96f325d317be69d4c4a16bfdd6a9bd5b42376dcac1e815926fcf27b97bb1f580c97ad141bec937091ab03f13b20232b7adb23eeccceec91d9866d11f9982500bba43dc2e3722b9d4085144dee37790945c8e2f67b7d4507494850b6a1745997a9b0427429cb1c78544801748a51c46bfc5989f047fb6154839914ff79b97e1cb8f1e56b76ce2390f48d1f73b17a44b44cf8953f2f773fec70a595d281c88ade1e8738748be512f0724f4bc948fa4af1e7ee088fcb312ea810c2160e32fc2164e566a4fe2116001f42e88221f845348b8b8eac5cf871d2d285901e1941085f36c3289e74e5f26d3b6d3b13302aa85cf1c113b4d4c4586902d3dddddddddddd0dbbbbbbbbbb82a10a2758dc7ab90a27537678f0f96164f3bf47e180564aecce2736acdfa84671d70633cb7de521a06cc3166994102eb614f1d80a2b4757fbccb5cc35cda1159494328734b3610e1859bafd459a052f4dbbf82ee192a440c1ed2b1cb11556926e3f11be69d9908edf1f8066e1dcd4a5737adea95193b39753a3e09759194ec1ad7a8d3dd79d8f9499bd5b237dd39f178b7c7c34943961c53b7d57ab1cbc03dff48cba1c7d7939862ab97d842aa9fd842a6796d061f4ef0eb68688b0b5006cc216110d5b45c8fffa0ed12fe5022c66bfbe4448688f6094945b0e57a226205f7e11b0250355f2e51f2119d5f6bbb9f2ffca1d34685ca963c68c2b73c89071e52a468c2b55363657e2c0807165eac58b2b719c4e57f2505373e50d1a9a2b6f6666ae44c9c85cb9434ccc953ac0c05c99c3cbcb95363cefca1a2e2e575a93e9cada75573ec75d49e3ca677ae58c2bfb3d29e3caf7a4276daeecf7248c2be58b2bfb3d59233df934d29b69191f8ad94c0baffc1e0174cecb518ca02babc8c8fb9d587e7f258e2b1fd60c5b02952c97bb2f89db5d151886b9768361ee284ec5d0c29b5896d90fb354b04c9b1c7f9bdf99c5de060687c0eeae44c7a35e02651c4f62f0c4af69b6a75ba39a8c3b3c9849d9bea7e79c94c6a0d49e382e08f947c4c741398ea39ab659cf47d3565f45c9674dd37af4d0c01b326d1196b131cb44143144a34e319e0823384fc6c8021ad551466c48a3fa6391212d8096444008e1b5a7dbdd8d41e9c6dddd08773f09a0878f86d16bd6cc62f4db6814efd0c734c8a9adefd6c4ed77fadc567641ecb8da737586c0d39eda55bfa669af754434cb6d5a37b72e881d37fb55b38ec8be6a7695c52ccb5e8647a3acf03099c4edf77e1b37df288fa1d43fed120bca36be0e8859de12cb286cef6e77efa2996527efdd3b79f56f5bf86281278461c67d97a5b159a16761964629cded3dcf7e6da11274cd874acd62af9e1ae5d9f4d33c5fede31bd1bc8fd626fbe8fd665d5cb48faf647379761d89da476bd3343ff37ce7cce8cf874bbcd305ef9c7e3e6c0364c1a488e5cea79985592a5721196019a0193835e76fc1294e4deffdfb89f9703e9cad833bbb0677f60beeecd9b3e78573ce9a8ff953ac36fd32ffe3a2b5e6e31ba989360995b646625ec626317d8c4d22bfc6feb86052b3da70e74f08873bff83584cfff2624fb4336b23444c0cfd9a57123fc61ea95142bfe6d9e565005e2ef6f5ae9cf7f0353db7dfc9abde0472518ce3aa8e8b55bfde5a706afe631376c1a9f93095a6c2a5273cd4d3c0fbe69d0f690661168f7cd3904e26f0359f52ac13f273679e4aae6bc52e9c4f6797792e35abf31d08de0e3ce72e931ff3474c2ff318cc735753f39e3502f3494c0ff33430d5c67b76b9541b0f2e716abed0c820cf7fa6369446cd97a9dd64bef749e4bb78a677b1f0e537f33d0aa7e6679c96464d6e89536ad47c4ee9ce97266bd35925e065c2bb990d676d84d83efe91eda3f64ae46f7f447b6a95c4d74eeefda33c67b3de84af464dbe0f67ff9ccf36a63da203ead66838b6abf83cbd931bd148348b680a22678757c09e6a99a6cd14244101489b99b347777f42c9dddddd6116d71f8b5c857011454896258d8a2d4f2efd346d7ee8efe7b6e571e10d3c2eba5ca31d8b42f634fb8dc9cd7ee21be9dee5dd26a1eff249e277ffe3ca323834939b3df42c7b6a2384e9e31b8979fa3d8dc1c0f82be91ec6dab88ef853abc425ac5ba8048cb775514e3235331000400000c314000028100a0704c3f188404e24557d14000d87b05070529ea75994c31042c618430080000000cc0090a6810039d6e391359e1cd854951550f6b842001e6ad2a544672f2823e3ffd9761cf9b81ceecd39ecf27e9c24c5662eecd26460dba102658419cecce12f6f22391e552d94d47e20392e6236f2dbc8ad787c06f5f01529c7dfb57707f8003dcb4cd2f1d36a8e9fe00d4cd07d782faa78fc07540d9a07af9561a3283f89ec94ad4986cee665152033243400a65e340634b6f2f899a3af0ed3d04e96f9c2a1de14e0e959b20d9f59b34cd24eb165fc5039bd06b38d425f5d4f1b05100754dce29b3eb4a622adca6a8a91854ae10c8db697d36857b25ff616d0d0463ddf619d5ca404c29bb976546607ee9bab86f36a7fe5f871043f6867658d9115a5a2d2b58cf4fc27910dae8b5821838b0210e367af00d19286ac36e28ddf4178cd4586b878372c10dbc8894c3d6714ca82249e474ed4c3963564f0946986fc66eb672aaa3ce90d777d1853a2ff8110c17b837da122298bd3fca9f95c4fc5bca9f29f5cf35f69a576d676ad8d96da47ebac18f9a8a9b7cd9277b33684399c1c15ff354fc55b9cd8ee5c0ad632e36ea34bd5d57813b9aca6c016dd3faf8ef4b703549722d5a037032d57190362a165c92052172977c26f7ab3ba4bf1d137c130907ec70978f962dd5f684db2decf652722a35c4014c230f6614605fdb7e73487122387f0350489ceb02c8eb7fb742c2dc12f4bd6662b78bf41f3c03019319834ae4f8ed16572cd303419857b91596587f7ea5e1b7eaaf74e0ce1c4e5b28469a8a463cb3ac1420656a62f09cfdce65c1f9dd6c0d5f3478bd0fefa1cbe4dfd2c54901a0a84ed2c667f2eb46cf4a62b45ddd6bda88ba6ca4ac5cffadf00a840262d24c8f336a94a4a35733785c394f6c83cd50db59b9632953b17b3d402067963eb6b7d762f67b390e17f813a91be08d3e190fbe4af650247a69df793f46f001a64a1a2fd33f7c4a9aea343151b6e22c62827184e0e3835bac579c5fd0d1a0456910671fba2a7196e5fd1232d82a5a768fc53199b87c57351ae3fb796f87d6b470217f34b1a2b028dd70ca2564971af7cf2f987b4770677021f5d3dafbeb0fd43b2ba2cd228fe207da3b2b65dbdbf81bd727277acc9cf9593bbc945e6a3a70af888cfeffbbe7211a1ebc86cc0fa17e8c188f080002a64d5adaa706a53e982a54c0ee4e92924eb2b13a832f3f1310dd632500396815b7c193404fdb279d99ce90921c1f5a2cca98c17eaaa2f165a359422bfeaa41d088c875cc109fc3ae9f20cdfaa54e79a2055a20de926972b13853a89cede2fb017a728a52839f0fd7ed030914c03c04468674e45f45e29f9d6f73f86854b0d4005cc91efb68170c351a22e41fd10eca581069491136241064e81d4b51a9dde258727e7c2bf1b87477717f08a4227c64aa4c6c148aa9bb586b01891bb93d0d8bc2ed91f7f5134fe5f4bef3743cbe9734b723207cabda42b920848ccd812de4f798c32c07c09f276445df283b588907dc342ae56cbf54d687955ea68a194da91028614f4745f08e4334e0408c12d96daf555caeca0b314f678f21693091c972fa4348361529ce73f6288611d9edb4239212b9b2a2534fa9cfb29374c591c51aee6439d3d95c9d3329bda2a5e882211cae989452164181c28ee69aa790c7b383c715767a45b877ceed26accf2a9cd69fed49e2c372fc1f58b8da4fd8451e97cd98e3909359e78a8ebaf8cf9cb1bb78527c48853639e08df31d5206ed961ff2a08619b1a3b663ee17a8159fb83ae6d6fe5af20f5a475d90b8dda06574b1748a8c526e73206a8cfaca213baa1304e91a9bfd221f6a9e8494dfc9d3f1cc3916b1db225f22fa915c124672227bed7b95db358b14a645092f8397a79ae13ae421e8a2d1433b16dc4b0a3b99b9a1ae42b21f86e064d9a7ea571ea838345c65b839c1147a56fc87dc18d11d28eb0255739e1c6a310850f46b118d4bb51126477502167f7ec9d5723887dbdd198e0d91756750a48ad858a4589a84299f61711ba04408f11c95378f9c9d388efe852118aba1b88e087c5c176911f01b1f1bbcc63ee4d7c0a09f7cb8e0ccb5fd92e450981af43c2e99b5f018b0d2e17db4e9a1951001315757364b2bbacf3e457a5e83a34f4da1762f05200958289734765729e9141ab470387fd924db3f1c726c18eb1ec8e4b7a7c9773388c66e92e9da2189bace49e4e560d83b2091dc46abbaa3c56af72cf0d05ff5d209803d609afe2b6d6093f7924582e18f3ab333d52675b56de93eb0356d84dc8794f33ae5e747756d4ba23b82ccc50d6deec00893dc099da8690ea5de2311de74a09ec5374c83833721bbc925cdcbc7c693658bc0caa76542742ee46ba498804618e3d059dc1d8286756655379112e7c7bd49172ccfa79de0c5ad53e2e7500cb864aabd4c05a2aeafafb811da20486813b357247743643e6045fd5233a294e933b672623391d42af199f19e408d3978db0e32cd68e4a6f38bf7e145a1f4a3beabc5b03c13b58187a938fed20a18f627466ab931e65f841e83236024f5d109f5874881334874bbd1bdbb9bfcefbd2a2937ab02d4be2961a677ee06bcded5a442e3afd8746de47247fd44a6f5a7349bce8fcdda6c4bc3b33a8951a4cc31d4635111b61c87a3c9109cc6c537cf9bea11dbab3f81d7060af2f61c52cb85c3448d3d9be0b4fbffa7a5a0f52956f2565990be2c2e322f08970eba9a80e0fca461fd107b0588c01ddab040e91270668b58bffa453c638658b04edd8950a7e31d62b3e7a302fb56ce38b0c786448bd36a6ff526c9d342e86dccdce68441df45bc5d05861ca7639a37135b416f80729630b084ac37c295d9ab31c4d7ffba5ca33fc63062ec35ea9bd09ef77df1fbeedf35c1d4580dce9ebcce9514cb3bd6f842c769b16ab5cfef5f2cc379812d8ef2d5f3f571b06d7b64d26a5876b5c7ae39ee7ebfa875d5234a465a357414da47e07ff4761a04ce4d0e242b48b7070c5842d2c913210e15050a6c636d708c3ebcc000cb650bbc66d9638827abd9f25601d0294e2c5da29e424b4675fb846179c7d07a3d48e14926a172fdd8a4c092b9b449e9b74ae6203e8bb5dbef7ba17ea69478f00196d9671e319dab9ea8295719246c68da01222b2f4c43b6e906972820aaa384432b215d36a6b769100c0da142dc209012d72e3372d79ec883dd6ead23a593a7399e3247829fd772d2af342620b0545bb2ab1dd7fd4a926f2845b54b091c35d4a1d6990fac84d3fb9884c783a24527889251ccdf2e62331616d5ba8113a2b74d9d60a8ce0c46dc0e9e45402226da611c9d5bcec403b30dff76165121ea60bfde3d62c518a1bca67fe1c78251ddd08e5807756bc2c70f5a8fce46605661b217291df2ab7637230da5ce88c3ef00b31340338271f478c3b9a040758c2c556b34627e4a4deb53b2e3df8387a426bcb790c6196f71d41a9350613e6e872abc706d7431502f81f94da65b5094cffa8c0b75e4daf5a396eab8efd136aa2d9a956d18573de46910997295e854a68fd230bd6d4cd6921f5b6aeba7e0435ca8f6485c9d16c015a9861f71635329f990b96b7ea631a81216895d06f736d5fb898f2230829ba5bee14108320b6369c25a967a003063e80411453bf02507fed88fffc01e666efc8fbad07f86cb2b426ae7edc114c29e354e6d099cf01dbec5f0b94c98f7d8ad4187dbb8995f052f29f8bedd7d4920d6110bf1c483f573f683e98679ffb0368e44689eaf5b3b69e43864661d66c1a791a084e03ded7818465afd1719992301ff61648dda5db15ea3f2a5b018520bf375c71c9a9e00784da7c74e66a4df472511960522a9e4f1c74d02b44f2d61804a5abedb85cf69313126cc308bfbb160a10e61a0e1bdcd5da5c97cf8b3094bfe18cb5a722238f367cf0e8ce5702c866bedbe36cec35e24a5d87a56239c5a723b7c006b1386c1f361db75957a5dbda5d155c59fbf40a023887562dedafd03409e9a6bd36e4d371dcc9e0ad367296abcefce79b19c706e9679bf1e96884ca44217840d164a1405e3790f394b8d0a1bac1e7da613368b79d286721cab2c99458f362bbe27b131db7dc9220a97a959336bbb444593825bbcb6adcdc82ad28027210deee6673984bccdfe3fb0a7ce63c490f76e775bc7eb23ef2ec255acae5341badd4a61eec7a997d3a130420439e7651d8271cf5158a4d4cde79e391546aa36e8770191c1a85aee5cc31de00c1e29f591750543ee9ce64b49b63b9aa4c8323f1cf52dcd67e9d9419e0a601b99f17ac4c712870161536def9eddb5b39c9cf959014afe5dcc53d8e6674fca7dc74e5eef651f6ec8bb9b2e286047950e7eab2fdb6a524ca688c523a660c16b7a5e7e72271e58d580c7760051174a02e9d2197129145dbf13b81c4e6e04ec751f755224de9323fa7869f8c8ba90db76ca6a64a816c1252366aeb8edbf504a97949e4d5bb02edb505fd22ce1e88dc32241811c18b52c81abcc63fbe97b9ea66afecfd13ff58f2db471a2c9cef8fd274b018f158d07a48710d69f01a354b85b5b8fcf322fadf1390e969245df3323487039801e4bdfbbb791e2c622c22374a02120f85d658d8950c83a4094b2347f7dda781ec807b8174e8daef0065b6e7d50856199cf3f2ce4b4b458a7e076be902a5bf491b3468800d3780d38ada6a2f861a7d89c9ec323f9c5b1b3e735fefd99e20a51f56890084dd833a28a09cc638362f43f746aa3bf9a996fb65a04913afd95c8aa5e38152e181ce3e8e0900728264b7b0563c2c178859763f35eaef88f790576bf5ecaa5739b9551b7b49d5465a11e511746c6289a13f7a6ba90d6c8fb184e59c840ea0c131120d27b5a12cec4e1e888c57282cf204fa5cb640c91c218f9585456a57aacf65d32efb6d4f02f95f5f2a9c23890074f62d557bbe373cf0dab419bc7b03585a9c44cbb64d49ce9ae55c4b11ee59b1c7039db5974a1b04bfcb4e51b2f683fe126b7f6abd0358c2ebee2f874050b11d8c0c0849dc7b0ef78796354db2f9998c9c21bb5856dea61a6da7b44525f19fa7f888fc26ec101b30af545a09d6b28115515bda38b29747620df4c889903d58c841d5b2b37d28df4472dac7a07393b540838b7edb04ebe72941d8cf35354ae6199c334912b97d88be941f82385a2310a4ceb362fe7c6ee739af48a98d1d5217dfe9664860ead25a0dc70af14e3a279627923b0871a8e8a3bf7280ce567056280f0314ff91a115ad60cb7459b555de9e834cd7b36b73eff5eac65d84f5d7ec4509ca43018a860abcde1897fdb33b8e07ff77d44f38f07df715bf68149950aa6f53f67cb589136d33e7f2958cdbcceb92efd8e9066afee5d5e8ac9b763fab954b0a5e52e960b21f0882d28c5b1fbafafba79b234471617c9e308e13efcd940565cc37a53cb8f55a5461070042342982d723725a4aeec2d40acdb057b463986540668d97800cb7f40555765f966fe682691b21bdcdf26dae5fa4954935735bfead817bd8bb4595d25b529638c49d57c7cc427d8793d678b35ddc115cdb2dcb602b7123622817871d42d57c8afdc19296d4da9e9eb90cccb278b1be98647a885073b1015958a9990a8805880bb93429d291c4a1aeed119b99f7ca894f496fef42ec366dea48d01da901f44233242dbf8e4bb5c07386024d6c363598f437282859742a7f828b8a3f0f733675e46b69d3a88a2841a839cd534e850e1f5c4ee3e81134577dcb89327d26ea6dc7dd7136f1a803d2f62d80dac077bdccf2f80d10ae66262cab2e9da8bb5ad38817343b9cfda790a4d5ce012a2eac515d9124b4f3446995c9f05739196b505e6b70128cf2782a932b54bedb29027b2d632a45d5bf5d90e67ce8817133c8377358d20c0c11bcd185d40719923dae547d55d191a56ee5601785f42564932c23e84c5ce0a2641892d7b36eeee0846a90392b9c54dcd57e897f05f0b50a12cbf20a75d4c448a05e69091db93370ee2b4117ddc7944f9629d27c920b3759008510498615b23b7c869b405e45d62e4e86828a622fed0bb22211dfbd22512dad346fb92bf4906cbe3192f7245bff00f50da73ea02611e66537bc9909ba2eace8908ecde0c1cf304a2c4923d221366fb35ee921133ccc5131bd34d3854c6262157272c595573e60bd370fabd1caca4e88c044c0b4f6885cfe77ecdbddaed86e35848e46b74288a9030735544f02bc6135433b36f022068268b450aa0f1e93bd5b006e19cdfd6bd129cb02892dd1b667d523d1827526982d6160a707b1190db111ee9d76cf0a930b20b83f66165464134127736b3b96054118c73104ae9b2bd874b9be0690871311e5a2b8c565e65e141837e5f00a33032f84157545dfc125b37d3617a56d07f8e62ef268b346b52b4a4b7db03830a5d320d08e160fd2f4e77b615fb65234847f1a332f7855f81f8e71a1c2e311e47e5860aaf5b4719928bc82a5e877cb18ff73d4467a49d7684a852091f1d7eda6cf50cd7d4f2b233a8f8de5570ae1401345184fb1e0916b8bebbd18d2bf49d3627b4a7924829803f04389d470f0725b3116c2ce483270f26f56ddb2fbe85eb37ca0471db910e3ef34441f9c2180160d519119e217cfd0ac141dda7ad83a71b4471ee0c9bf8fe5195f64e457514b98db7b070eab3216282c31af4d5df5adf2cd70bf19d84d1cfce99fc8162df256c59a15035d7d4883eb0def13ffae5d1d7e2589efab9bfe3592c656a9a8669ac1b3c87fa749661a8a24df1fb9a2e1f78376f938b6b36ef674bfe84befb79fa06ebf35ef5d2270c069d6468dbada2a87df47e95d149e5ebc32aa907901b7f9f227aeb9eb418cb3de9ffde7bd173acf8b47b6ce322fe49b53fec898793d903fcb7ba27bb6f720fb3cf14bcef9e6875c33cb9b6cb3af1799677b3ffacf7b1f369f132f5cf63990085e9bd3435ddf83043faf3c009793d286308b00ecad951006435653f809e08a0024a989a002988289ed50be0a742bd4839526b86513c4eeee532a1c322989859635dc05a7e6e38000849a41aece1263d0f1cf8c4525726739db8edbceb8b471d6206be91993b5ba5b33236a796473f503a70c916e749e03637255ce05c59eb347e79e49fd85d05febfcdd6530dbf29ef117d96245c94c8e6b8f2db3c179b706b0502c7756012086bd161df0094665183b8ad2740c7e4671a6710505e01e5e46ff3d64933b7647fd9c5b48b01f5d9321b29440a5dacc3da192e90a803ab93db1f905736b8a2dd7aa44c1904afb92abdb5301f4fc0f823779b2a4452160fb08f97cf409bdeeaeaf736095f4b27706e742996a8a518d666080ff888567e4d6c1dc3152e56a3da8297082291829a46feac396bca37a0e578738d5a2d2d1541894b554f2264fc863c1ba500819bb8c149a0916c72c3f9d6edee01897a7d00e94a8002f7f2d98072b881610b528b380be4e9164464f83ad383858ccb7a0eaf9cdc4070b446dcad229ce5b4041c29b24101290390ee8a0e2d3f371794ceed58751f2a081ae3c50a1f454fa36e0ae4ea6762ad4ed384cf887d93e74108ea6a4f83a5ee68c45c810985f6780ff9fa293fc4761194a82755024cb1f47a1f684ccfb490ff1192ecff71f0a0217681fb842ad72ce015376d01048b5a94fecfaacd18f53e6374b0132eaecf2f560a2264aa8db6da3cfad1c3ec4ea535502ffddf15bcebb5e3e0144a2f91e5b1dcbee80ba4182158087e02b27b0fd5401cc94b3f6e6f4167211d396ed54925242d411ac99cff02c079cac1046b34f71955f8e022330dfe69b4d524a838b2225a9364475cca5dc8d446c3122174f95aa4e578f04b34a7948aa050286811b580fd035120321c3aba897086702bd87a0f6abe3848f36d284d26725d7ec280c8e9f8942611f9b9e2a5f05ae2acb723151044b1e3b8d30c71a5b578d2efc88806c03459ff0be4a945c4268701300493374c7765fc06a2993d05400c68a41c53758faabb90a9d3a228fe319b28650955f27556a529500b8aca39c019730c49b109ee4162d66fd065112ab8dcc45014f89682f943faf1cbcb01cd940999d1db63bd36a9aea90209622adab08db608aa2b4b10e6846e810295cda67d6298ad080ddda60ee63b4260b81aaee4106ad4aa64a26837bc4e1b0320c807e1cc87d5acba740b998e92da838e9e055575c25b2afeec4fb99fdb48b3b088a6277368736624a1b849cc29905026384d1e12a045884013c7c3308e5469502a0ae0327654172d233feb5526e48989c98fb0342bf219ba24a017ce50d3e32ea94ba85cf11fb8e7c79b60d51a6bddbeb138ae95684654cd5f0bd5db0867924ce549f9c7006bef5b73dd7e626438a9872a57003e650e30a5cc64ad16fd0b2e7699250650ad252974ca62c4463eca18c1f377afe548ba3d8f2f3662f27d151d4695410c5f41c81d88417b7bbaf55b99493b07d0eb93e8afd4c5e817aee5c2d5ae61db18017415c1ef010689f7e7bbc06b4416c101237272378dc807353f5b67673606bde219a5d3e1f00703bf03d571392f71cdea53b47abfedc15826f271d92be901c444f621057528f9146b5cbd303ee717668258861e61b264387970224ebdea8e464fec7da70a5f25811c8187ad7f205ff5b59c29ebb0b96383f13afaa77d8158483089e12aad550c0c5214552b3b301c9c2fdd52211e42c05e80575a1394e71313567181a9f888e3ddd47984e813908d0e2d535a3441f4eed6307ce37ea5b82650d6c4c9766fdba6eb4f849f374a10cbdff3ba351db580b33b3ebd1cdc9f57f3e52071534e228a5ea54da6af6cad3e414fe060d0b6e03e2e48a7b60eb4119bd000702b2b61e1d1824f1fb6dede8eaa21759a55e366229a9b122fb7e9b26a1ba77b38d5988e1fe4721743160de971478c04c107ebc6b0d4e7ab366c459b60fec9fe25b292bb214a9171499688d4f9a6490b17aa9e638c5a175a2f8f76acc6c1e45d10e5505c21c594e70fb1c174c2ad76c752829528fbcbb09350be720edac779584f2e844a8245e0a1e0b46a9c6f970fd2161fca9450575df9a4a6ca4db46a2af49a5548b1257c9d2b22d52386681fb5044735ea8be08f8d7efd547e0cbe0a836d84563e50fa1844d41c95d8317534c6495c1c427d82c83ee0d520f1482c7be74c214fd6512af4284bac8ffb2b39bda77abb4ab8484d9f809916952b1cfddf3b281169c0f04519d46a566be33205abdf2164cc7d2561025dafa3980243284e4e1da463c5d4520a03bb0b36488a295011ea331bbc4d606cc24eecba1445c982e3e04374435c9442817d026c121fc42c043b3faa0c05167a0ea06871d6425c1acb4f30963d03e2d42a343193340960b59c6bd30db4470d5ef92735983f1bff446a0973e8f46ec0a054c87f0a9615dccb26a98248432e968804d37772a4d96621fc02c84dadfa6a1a4e27899b259fc7eb9a19982e051cf7e1c8e159c53fcdeefb55dae9e59d824314156474c7458f321375ae04997786f3f4aa3a98d61e63c737f6f704b7be5efc82375c60147080e7c1d245bc57834059646ff6c4e2b51064d95a2d72fd8fded80b9e0c33150cbe5a870e18476387ad3c27b0c54d1bac3fd52a1e4f90ecac3a5294b22c2db492cd21d4de816c32c93696a692257255d1818cfc3e82fd3dcb47088b9720bf29cf7e3e8e0e1498dd37435e163e75f3a63dac345c19654f641f6f2830662121fd6ea925e43eae924803ee4469ec24fa4dcce80f2503073a20a48b5871b1bec972daf8d82d10612dc5ccc14f6477a69f2a5c0d28838898b3389fc414cdfc31ab1240e33d6491c3ed11bd37488c2f9ee05a53b9ffd1070af82541a2df9b3df7075942b849717745f19aff8f88fb5f1405254c1523de0daebebbad63480d0f2df52d3d9f9e8cc644de787905619dfd4780858199dbeb37af98396135817b40c859e84889e06f6a185897ad098e14102a903dc24bf6847a359068c88588474811a3905136406478b04e6f54a1b304b36a6a0d61bd7376882958e8924c5c8650720222d3a0002c0c32187a99a6e8061fc82af202ab2e79903b2220787212db8b666ded240b6a8dc87d6e633a63186cba876d432f181ee4b3a931e104ab3bea6721b92409f327b94f47178a5e04ba82a7a3d0e8aeae2e377a06fba90de3274249175cb14f6c7b8de5dc3df50585347658415701f0f530738ba55b77b1d881dd1256224f1dba98085a902b4a10acdb31eae1a2c016edd16b4dc8d696b2f2b3dc40518affdf73cbecefc0575a2b4796bf3f733c3ec1eb49ceddbcdc3c458830c4b865a5653036ad0f001495b593b5077e834f0bfdb844b14e8c74648eb941a5f2a5841ad1a1015990d84d532321589b96c26907a98683dd5082f2d55369bb12761da3e0e696fbc84a29a067cbca7ba9fa969cb7c70c32593113fd4f65b19c36beef43e6316f9527d2f12f6004b8ef7432405a87368c658c48eb34980375422d7c152eaad1328e64d3207c5f5d780703d30645d59930542620171dcafeffe3a56b92266f7bec0d73a963df53ac8eaef3822bd6f60cf23b396e8675e627792b4885a516e323f25a2b0c4cbf93f2a44587acd9a91b16b87ce282de0de54cb385d40f49d2249175e27da7353a2f10af850111d8f53d2ea31c21ed289e88d41f1daf9b1095f6530266273b81224f1ae914b43eaae491e07eb24979eec78d5f9285649c80a2da3f95c368a9ba37f2538971f4f77704df363054f967b95839d10327fdd8eae427cb458dd6e4e7ac69dbfecc86645748b7c9da2888f28c72d5e110290d790aa850558b6b1912032906a676eda0e251a54a37c641d5b9872d176c9fa9f868e4b72926d0a37e0743444dbe53493da27b5049a4889661f6b14b650b1c39c0f50a07665a235e34988e71658d68b36709fac70b849355c8f772a2d0bb7cf54444fcd7816d23abe997930e6fa07aa6e4811efe2b67891d6ed75e1ccc193aa724bc2dacdb6e1160ddce10f5d7ae1b11b0e24698a3b24a4c746b8e68e72bb0c88c586d9e36d612a3708e0ceaca5a1c63e8e0711495d1301552061dfa1af9f2e063e0234b11b194d23ec0f8dac52329e10cbb6d812ed2aa8dea7603a272a06faa01873057ede9ed41f94a2b362b437a3717a9efe76218a9633d3e6c9807972a96ab5d55b587dd2245da4458b8a7a5c7ea447dc26bd259b886e2b5b7ea5e809c37a03adfa65f06c23d56ee6113c87d8c5eff43e599b589910a93f69dd8f6f3e18ba746246f224c53ffdb2b18f3fe53bf14c02e264a883372ebcaac1714e53d3962109110e93721b659f44ee7495e1556533a185f78b02b57a18577290de7dc82ef3a810f33fcf6e6e9a72e7a62c721ba2c56d927e0ff169ce3eae39d5b2b351a4a5a944a3cbfe45a94bcf70226c65a4afe23b33d4c60c24c496675449701862d9bea2a0ccbbb3c8c204c8ef75023307b2aa25b114f18953e72580f6520731db0d368e2d738731e0b1398faabe1f450d79a99d91a4a927786154ce45aec1236ca1d4e624d5ca0bc650aacd906de5094e589566916af40657889af3486a780a2b9c9a9964b57980199aaa39329bbc3032fec9f687fb5746d9c2f819447d44e2768395d363abf78d332e4400919f6c673d9f2568a842a9026d28a19445056ac20c51aa15a0196494a2aa014d30a14aa506358214515615a40d24a4a2d63008db699e5f306404bec0c860f4822d23e005460663176c19812e303218b960cb08708191c1b8055b46600b8c0c462dd832025a60643066c1661d786153172f12712bce940b4b2a5bb8232f52c95ab4839201a3d05d87b3b0202c3604a679f05f6d434933ebce9298b3ee248959abce499959eb9c8499d54e49cd597596d48c55a749ccad754acadc4aa724cdac3b4b62ceba932466ad3a276566ad731238ae00791c68a8b7c32e15728b8f43b42ad6e40959019e8944304b5a12e579afd0272053c509acd641c3378082e207917fecc3425c9e448c740786b061711c685e3894b24b63a9875242e3dc5da3cd4aff568ca4483558ebef458c32f347beeba9a269326cee47dce524426fe7ccec05ccc9a755d766c4e889bccf4b45d364d8dc8fb86b08e8dfac7096542d11adc2f9ed5e4aeade9c78484876e88da8510a0a851e896ca62b5e2f4e292faf898fc2b4275fd29fa3d4a351ba4f776b4ca394eebbbf38376e3548a8510a45f2dbea0667760dce903b83fd9a066b94e281e7416058705e4113d861e52a1b9beb2ddb9cf314960f600a0692d0f27747b70a4e1c031b9c489ceaeef3ecf50039fa89f42d4e00aaf52e0736f84c005023eeba05b900bf9a42696b1b45fc4f04c410ef181bb64af05402d85a039e11b02fc0d0b4b0d100cbb2f6690f06363d442e34edb203f1055a185603d0c1f0524d35cad9b9c28fb55323127a42f90ee49a9fec2640474561de5007c44c50b23c862d243b9e54bf0cf8d431316f9f266e7825cc5729ac2d93da97ad15376d95bb8365552622e0a6937042f1cc5c842fc11fc2fce75e4971228ddf506a717cbd920c1d717fd265cf684034f71369f7d007bd5638dae6eaa2489d6b4e37ea52a4ff4eaefda316f7897f045da7e5d870ce85da4a7201f0045b1d36aa891fb6a99154c1c237f1c60a957c8af1c6de09b7d26ae62fee2cb667df891d49862f0b67b7abba3759c595898334da6061e268cddf4cc07685cb54210e73c52f9bd70128886b5a70c38d22cafb24d6e6caa4d9819085275d09c7780d2394c58866d5db702670ce38eb57dc6b63dd8448447d4f9e707f9bca945a065a913bb7266a59e00e6082296e51b2afc0c9855c611e4c8e7a6b87b5675b47be77a6b2baf1ccd3f909e426576c22d18b1346dd173fd67a8777f3db1988fd9f382b7a15e32c8ae23503b20b99be17fed9cae5d85e17b3ad48211eb4aff10823b7bb9589876e4fb18b0b6c66cc53ca6b0c2f9fbf87cb6ed5785cf8be877c03e373b30c976e182ef3eea7c120d4abacfc6db8f097bdfebdeec1465ddf33aa1a6988915ade38ee8b66d45fcac5fe59d81643655c2ccce19d21791e22436f5dc4ee81487a3cef437db3d62e590302a1e8fa1a75dd1f41013904abb0016ac6a7f42e782c771e375d697a2bc1aca48f33fbd5c6f80b0c773dd7762649c72ee7e4e095263512e33895bcd6f87708b70e8b301d114e52014754df87b4ab1cab19a845dca84e41cd4d6f60d4e82c28a73aa647a9b60b4a3756ac431fba9ede583d40948bb545a494d3f06bc3d1387a13a062a9afc766a044bb8f70b920d232a3542f40e184d87f8253f17bd88fb89a25c820850019f9ca383bed2db1138b965f806ee8ad4c3e9b94d2da94c00f2bb87bffb4b13aa154f5616113e289e0f102f8024750d8d75460f4c1b462c20524a35ff754f4cbf29cf5905306629a714f82b92103ad9a054338e459e9412220f82b34badf3e43ff4e68b45e6b9b830eece727887b26bbac95dcfe379fc30d1a0c8c303dcedc0f933e50c91b555ec4324752ea98b4fdc2f209ea9a9b340026d329e844f5c3265173db907b73a7206e1363efc3738433fff763f346f16290b1ce7481dc4c9cf09420c32227faa98ee8a41fff72261f40371b064a5c5e5ea96d2f8bfcf1c3c7888496a7fae4076000ac3eadad248fda958765c7912c1e22bd0b8ebd20a0f7fc3a193aaef0955ec54946de98c9df528ff3399949fa90c65f9853c72e56492a1956f0636edc18bfa3205eb914ca68589981dce0d792c22e1b86ddff551dc1c1e0ab8db51a530ec03d8f12ac90150fd142ed3bddb105a450b770a5f2d8f08df601c67ce9a93e98719a5ab4d5634ae026546a017bf25485f71e17b087bfd73694a7ecc2f7cbfe38974b9fc8fbae4feb5d865838a01ebcc6108ad7518f5c06a6ecbef0b1044b4bff808d600f7778ee0d68e85633fbebfd04aa766f3b64993999dc1f30228ab9c0df267a927107aef6d0f56c032040010198c8304421b371804163297f338e12a4d4526c3ddb71da03e08bc6ff68fb42ef8ff4fc4f6afb33fe5f14d7256a5da16a07785d566dfe7767f43c4e1a0cfcad1a70ba0edc066e3fd4b826a439a6bea69a349f4f78016d543ca7dcd130b1a6a2b21873057831d17087a1fb6ee18574f193b3634d63c17a92eca950beab496e1a8d9fe9dbc1cc267bb994846d8c9393bae17bd12d81f5b633c5c9ad796cf557569650815a36d3131137966ab0c40d5b2e6b4a7faa529fb8b1b47e470fc6ec38cdec01981d68637ba264094484a6d74e5a40d50e349e8916e8d594774dc363d76b1e1ebb44d043ff626354a90e716892c8086cb4365191913d2c96e8104ff4f5dd86d35118ea028d46c791bbb646f4db1d5c21dc8ef9f3f632623e1fc43aa95647d8996d150385001b2cf520519312d0b107d385d532a4ac5e5b1b9513b6334d3ed7e9fe59251df44bcc29d595dc102ad38a460a8693e17d22077ba18163a8296451f5e553ea50d6ed85b3c2dcbcd98762f91cd515187b64950e210d5b015e6443beca397a89bb254f831b943f357196f4a9cc3e158fd96ef35ad029daceb501e0253bcdd927d12a7af344b42a07596d6e7fe775fd11dd65053eb6eaf44694acb90f8ebd5538a26b18694825240c5de4a35871af85eb06b129cc52c55ddd9ce2ed372bbdba76002cc6eff0a550b9300640ccc2992af8a3ea20a3935cd3ebf55b444d253ab275c5c3f995b6e8179f2067e35b158acc821629e3f79a356d144b803b76d80c21343ee1e11717b053c6cd6366e99cd1d93e491da8a4f9af77b8c195c17acca57be08e59d56528ab2a43ed35fb53cadcae21de4a44b307ec5f407a806af500f606752ce2c4084b07e909fec4f2b62606e438a5c1353304f411e06d2476546df6b1b57aca93e70cae33643358f805fd629be4c694b655145359fef43085a2cf9173d38220418a33d96333087857465c386757dc04ae51c68bd8d8bb06430274cc78c5ff199db7256c0b7f5498a4fc43eab476396a0a2baca1adc35f161670e72478e88b6e96f6f6c5b4bd8dd9bb10fd1e246defda42d97c1d0d57275ac4310b222ed1e75c204cd905432e38e93013b28db440481e439d85978b3e592c1484c6a25922aa895e63f11e342d2cac8975d4a5252c695cefc829c5656e4d4654d42cd2dc034e85ad4a1607992ba24c1b46281806c7df490f58a4a87f110f6998cc9a609834ec8c652297e0bec6061d8a956cb07a855802a20c31ce2480b34bda36f863b0f5c5c0a9a4599a22ef9fd714564ff2c1e19a9eb50feb18795dc07a9a2c378d811114fa811d29a2194720a70f5b5f495be87f9814992802d6bfe85bd7656812951cef5829b0befe626970e1a6a491d402bb64807cca4f7602526f4c41a43839404d7fd280bf00ad6b715cb1991993d63a75791b0eb7105a4f0af2e90cba499fc1696a4a335d9f2ca7a74c037de9653924f7ebc10f30d30123a0f87735c15e50ed7553b709eafc41d8c628d893cd064341aa7cb38a353e722819710d963d1a82da84a69fdf155b9cf2e0894da90d975f65d8650331e4a230b0a5773e5aac96c460472b96540c9a2233da046260bbf865a1b9ec79fe088f014f4eb4d9fd2213e4dc04833d79251397e7611ed40e501dddb48a31b8da6f1522bff74de4a0c308e94bec7f1e653139a2653c5177241476412668a808e2b0fde35fb54cee99edfb10182e75d376058fd4ebf78e2eef5994bfdfc383a5bb50f91efea71429996d4fc5f03f2dcf238b1237d7d4fddd3aaf90996968a57d2ca1ed9f31920d897168b75bd7493436154b407cda515e312d14eab8de39f19f8b9a71075d8285753c765fbdcaa91b7ba62c3c46051506d806f27c611e2a08470d179395e39930b4f6b2779a4a926eb66af9de605f537ed9ae0ed68ea242e4cb5dfeef1b350f6285e38ab96826d1ee41a14e2534379ba90d606352a30cd58046104cb64b9b820a9df89145b5284abc13443048d1635207baa8d9f524183e3fccdf583e03da61f681a96c435faad3892012445c4e37e4ab65f8969b19cf729dac3df5a8d02af16933494191575b72a7aeedacc6dea98d4b417a124f58eccc2cf1db35f8e558a026c3136d6944c3021ec8c986f02d72df87bdef6b32b04c575374d4d85bd08554685a23c28e0a61100fc0e1044fc2ad92fedc2763e1ee4198dc686c8a965628baec25e1ac184aa4a74eeb75e1a12f0cbab2495c712e72c496a64acf68200db32b6bd2470e76388cdbe8635825689d74e9060dd8ac2485601cdaa72e73e9945732d435639b1794e3696ae978c482d2efd7c0b0282fad82d5b62059d169b8f5c0359988d86a55885a288e52b0f6ba1ce8fae7782548c245082d8a4a54e074db0e483407604e846fd8b89068763974dacd1ee576a4431247e2edebbd6979e1bb2ebe05a87364886c9f117d4e7e5bed2b573ca600e542cf0e1e8ca8ef64c38dd741904fc37b341643919816a38e9bbc684aa769ecde03124ce5d79e1823e8e19a5414a822ba76a181151de883aeb053b28a57b4337122df60b476916689fcf3a5688a29b4b4d2d863dcdf4cad9ca4c7ed3873a5824b105da0d844d8adb6c4ad2e00221eb8bb9110d39def3da73d5758159eb97f2b63424a0117527329b508ce58a9db0bdae10ffa191bc7c8f125a513f0a64a723ac20fd981456548aa2a052b04d040e49e7f4c354dc4d0655211fc2860ada3cfd4a6dc63917f56b8409e78ecdc4137416ab240fc6a5250408cb426cf3a82bc4f440d09d0cdc70e707d14411d06cb1e89b74fa2046190477f0067046e671cf0653e62fefb0233b0c201bcd87067c31855dac1b9c4c9254d3266d8452fa4451abd98b7344945e1d38c095b9a2900b403b8f00e2fbaffdd50d27e29a5098c29d90dc77fe22a7a394960c6e72fa5475084ec4baca68ab100384120d0795c588b2e448e04c75adf6f7a485b261eec96e40869d53071ac30dd991e52244a3c91b77aad7a0bb45a6a4bd7d72a54a837ba095b2db39e170b7a679980c37e95d408f5289debe3f686778ba4a5914f2e3eaed3c9411d3c1d68211378351e97c3c9a0c1e99d60d8f854cc5d9f2e8082f17567995d69607253dd9dc19f5bc2aed41d6f6d24781b30a0368c5bafd7673f9b069e1f1eb28118835a247db69028eeca99e217c0cb71eb8c70af6cbe971ba8f9e1db29fde7dbc059458eee86d1410c6079230727969b0f93eb646ed44d6d911ced08e8d7a5816437a5936815a1441b14995d3393af4d34c53c9b68e44f03606f192283980a7f764c83fbc30c87bf407df9e8095c5126b3a0c47b24a73159444c905a42a2388d1a34b1595a821ca09a48f40e3b783e42dd0148b779135942487649a52cc9e8bce42b2d31658339cdc314b638b64b44eaf9100179b0b4bd2d7b085c31bc8c5b572dd6b9871fae92bdda7b9868449dabdc9e1f7a792c980b431623ef9eeb95747da86c59d5b7c2ad5e1e1bd6c8736b55b50a627f114af681968820642f8513f7404f733c0e5c335ec21d47a4622dd39fd2206cd61841f9291c8146f93bc0f9c25a05a8bd5849188ce0ed6b746ba31a132584a474fa652752f1b36e11c638fa14d6c88d67a16d97b872420fe04014236836c16431b3d550b1200d6b457f0bbee1004cf28763c4a56383c9e5327329333dd7f59b6bc72036529cfd0b9c9faebcbe61e83de08eadab971d690ac8f91d9a12e1bc7388ea7fe6df3f3606cdb76ebe399fb76019de2de5e637868e117ce2b549a3fc22bedf910aeb7344ceef005fed5ea373ac888723d749ec352fafd06eed3c297c00c132844b9c783a345b1f54dfb41fde82cc78b262a048c63e1002b3eaa532eedb0a313721f6a2c39f7b3facb408848387885aad45ef3bb8485aa5965ec96c41c7b4a2e4baebe2068ca18ea02ebfc39d7dec2dc9a1bdea57f6743d02885d5209cedc938b03152176a3d227e0a46b40957d32802aae60960e9d6a83fbf03210160964b405e6f7cc635b96b114c5bf159a37d2758631ed3da4126960ae015c6ec0c9a00b202bafe60908a5fd67d364b61a7b6425a273bb69962a13f9891afb0cd37eff50320f676a7861475f72f6de40d0e2723a8d78ce6c8de669126a7f43928273a4e07b086df6e159e9def3943feb69572a7c11f9bc39da5b96ee47e147f82ec0ddd0b5583f16174b0141a2640cd741a7bb1f3a84ea1033d7f5b5b7861a5783aa1c9eecb94eca89fc91c29ca2fefeee76a1d09d984f43f7ea4a02fb3c9332fa7640ac39d89f22801552e23b2c47dd68048d8113a98b06f330dff8a7f6192c0abc993386419fdb6e80d4b84d3910fc7cd0a4fc3a56aa807f7621cd36ed9f9e57ee33ef9acf4d1552efdb30f4543f5eed255b4fcf2685a3e5bc3aecd52e80612737c31b64f699021bd581b2bdc8c2b5adc6f7f68eed478c8d6dd892833ff32e6d5cacd11c749e81217ec38172b40c66cf6cf26727aac5558b9f6a255e9732d5bcdce01d1c0b212a4711df7a50603ae18f647f422a4aa48b4971d6d9900ffd0e54faad261703acd1f3f4d81b3efa874243a600e3441a8491c8080037f1e4af26e07ae9048144cf40c237f8c8b1726e6c00e73ee183fca87bea15fdcfb5860a5f97d66a928b56fe2f6ff28289637a92f3b7df95e6bc98fd3e5821168fab3b515be0ffd8f1ad6517f466590f6d55abaface26fcba0b383de4d2764a5bb5aa67d81216fdd5f32ed68f3e8e6a0d12888dc747135fecdee8e6f662167c3b66f070f325e39f344e19ac96d3088bdbaed90c97d188f15b2731a99c705d8f6798e211af5d9a6c64254bc866c6a26e8e1af1341de0f363bbe1f543ab3f8f2eea2f04a0426a0cc15a1b7b97178b6b07f903071da88529c12301d2b4319bc6b6c42d68764e6d68e82100c8983bffaffc638af81a288c3d80a4e61e338c82329d6856fd18682976236847e2bc00db64897fcf5b6fa0f033b00f4701d47c7314857b24a86f258ff610d6c19aeb990ed0d13259e21ce25c8528a88a8f845b316545ccb669b75d8833a4a575328eb161cac1943b453bf4ea2c10b90d27ccb58372a41727608cbf2e1120a8a8bec53c09e3347fbd83da5d71db6b521a3bcfb3f944b5ac339e270d70b56f491bc65856cab33210f5bbe5efba8d0091888c9b2243bb86241225b848ff0940ef43208ee7cb5122a6ff45c0d691a594d2719537a75ed75188689d72f9784e85890d95d6f6a6a1ca0a5588189c46c4455f5a3b78ceb7d29ce0f2a5f08db89dcd4d99355a9d0b44a59f0e7664f58a643b4cb7b6ac28e4ef8beab25405661af2528cd7bba6c81a7c2ed5c2dda8af17bdca0436419d029b0fce51f900accebb7c861f73762cf0c08d51b0407a67a1988bbbefbfe6534e0b1617bb6d2b71ba39fb05d301f1ec402617889879388a8b485c2bf1ae7538f83d64fdf313bce4aa421ab96e453bdcfcb29b6e19f1b89cbac7d6d27c88596bb320388b566f85048deb3ab135e44c9fe8d9c7e004628df3e6cc50276c8c4c36af9d137e81262016394e543192e467a1a23af80360bc59347e0a332b1e568ad95e1b0c511b1a4ab20148dc8e97e062af6156245838b924d3464f3ff48f6f41b5fd686b53e8ffcfa2c390cb87d4dc46e59d7a3899697faa6bdb9fa2810aabbf0bca571dfc6b1c174ef7d92e1dcca22114c8f206d419e5bce68b4761ec299b0c85de8a859bb7de877ca1ef4977d3a37417cd8700d96add1129a7279b1b4cc3d5611438f61131715577cfbaa62919d788a8ac6a32ef24bfd50aa5e42b8d19afc48867870494ab7a2d24d911364f742bc738a005ada70362a6a8e0cc6360cc6e9b5f17fe64cedf53de3e6a133961e89db66f87344147d12553dd186ab55281565887801a61aafe3c099c311cd3c745e68cc724be59d72e2deacfe3cec71ccbaf2fe72896e6351425b4e0435caa4e3cfad5639be6792fee92e5199f76853af546ec62be90661424537610032955e11df3d3d3eb5d70cbe18c08082d7718a17fb23fd8274b8c1a6ec4b1c777f288b8d3e39e933766dfa98b5646ce7c61255731af3aac853a190759747125685fb9ce0fa61cf49862a80da1d17f493f3486ecbb4cece0ce49cf9ad2f1c8dd0863a1bb2e13cf7cd028d55b6e6fc3a58be82f5fab3dd572e02cd5466431fbae621b15095d65ce6ed96392498e8fc63cbab4f1de1e66a2dac438821ed64bf463004776f043c176a503a2a53a99f9daf4d4a7b0e4f4287b72af5d11881f584605c2ac801be8115fa582e513ec856dc9347e31fda9dd1b84351ac06bd659fc4b317ba1f15aa5fca84423a78fb6e61bd406da44a9fbf2d8c1fed4dded3f743634402eb265e1fe37d15e1d85121c7b4c4d75e611c31aa51e617a8975dd7bfaa1242ab502461b9aefc836719f8b1f0de1b914b85bdfa829483368c7ca550d8990a1e67b11261d4d23554cd46068461c9ba8313e2dc6b176b7932ad3b7f5ba339defa8f3a734a4e583e5795084d2e35f14e6661525980083bf451294f5b731d83a31e9deacbe6b8a5963bc0868eec135e386821b70ac4f0ec4c71cefae40212f420b503a01f430fcabbc46560d7e3397073a259a5e12ea5d746c45e012c40659f3401717f6197cc29b322cdba2516a0609bb936ce0372e1fb7cf43a2c6885e4357dfd9423d8fc6230722707a54e5d721840bf6525e1068bf802895b8d2a024d17d105a49f75a71cfc46d10d9a031d637321e6c0574722338946264c716a5f6e1b4f04aa45769e8cd125a3ad205508fc58c7efa41f1b7698248403dcfcbd24db6f1498ae4453359d79291f337dceb4d6501fc61f826a0266610af4879787ad44842a31691c4e449ed2a584602dfafe76dc0922cd42d2859ceeaf5ab52f0da7fd55b0654026ab283fabfb364be2c0b00cdb9758726f61c65bd02f00725000bd7235639811374dc0ee54b55b0722545545983148ef9616e394e98801e7a94d75b7f3901696b5c871fd35e42f46858852988e4189d456c8db9b536e0676d7c73ac1742aa5f2b94afcc0a9e8054de5c483aa0dae8ea37e100958fb2e720465e181e8d40144685fa213ba0a80abb0961c84fafe078bd762a88ca85acc31260c30716484f3dcdbbefea4dc7a4b89a0550025620dc5e0724d3d45867e844a97c920ea107a93e04d3f32dc575c14dcf2e7f7013ac564a0f68426fa335f9a057b29b4b804d4844a53361c6ba986031632ed61307ba156d3c88717a0aa58b28f643cfcb784f4be2b652e379a90b1c536b3d278064136933dc1f4f4c26f57de01163b1aa04111dc629f9266804802e9c61b32390c6b9c9ae106b2ffd8498a87f612b0b6122d42fbef8b640238986d6a6645efdce83f91128accaf15e25d1dc612c511d203d0fdea2b8f245e318816c62a98d61c26f17148c1467947222912dcf7eeec4c0dee37e6fb82b2924db4a5ebab9cc50f2370810197899b2db0cbbfab6e2966f997a7db66c1b9bdb4c86830c3ef11959995731463d46c9d6790b731523b41434591268a5dcba035e3e38c4b6fe19cf74c02bde71058cbd6e8e7645fd938abcfd447edb00c198146defee8a95eb58f52a2c750e5e146c0e59c651778e81caf5dbaa3282f682cd27700bddb6f1f5484c646ee1678247853a7a7b916d83c9f415dabd73d08915a69fdfc1acf6f8114a73b6d7487089bb8416a5ebf09329d13f3644e10a92315e27b422cb0c1c3847cf0c000555273ed4af3451ab7f8dc1667c85c2dfabfed86153d3fadaaa98172093badf5e142d04b52014b2958c53f997bf4047e9cd31522787aa9bce2a2301467eea98811285ad3632f3ee2547c5d42f1048697388937181628ec7d7d1d696835d13745c2161254577a2b1431f56c8d60c8ac8555b65432798024e31ea97ec8d21defe3b4520f843510f8b229707b6dce6077146d52fab928cf5c91ae186e912d966ea160561ec897247e55f75bf1e8b275c59a7d5eef70ca15ec47a073f028d7298166cbfc6e95fd2104db5c031e933b810fe97d10729b03d6af061a29145ef26a94af94eda5149241a55ce8da5b941296851d944e900c5fab56f88816d7e48e213db0126ef40cd395304389308107d375cc970225fbdc40b12ae387fe592c7c620df0fa3239a9033bc2d1cd2f0a8de8309c72fe2064ce23ffc444d65cd8a8c26f9fa5a70a3af7401a10bfcf90e70eeb422c0e992d0c42a2743a29bdfd4ed4a38a8e8fa85adf272274492d7092278064f159302f45306cf8d37285d0908ae6ea57d06cb4578a16bf842bb4b86b962d387ead8f15dd6f67c94c3366937268523b9ceca8509bca3001e849a45a86e92837cb0f6c3f1ee13e8a880ec2eb47ae2d8c81b025957536adf35461ecbd0a9ad5a7d7d9c17e3618bbd630d05162311d4b332fd7a7bbbd9a52049b59e084b9bc34996e83a311f82f0f46ad685b55afc6bdbdbd2e6a53342218adccbf2155b3f584f9dbd1be56baaa4826c4ff1e89e3f898f2682b4a4e30db343104e7e26c82dad4473d9ba164971e4ba332f8f765b6721f66d31466d0590947a7215fa3297e1c4493e6349a5d9c41a8ce16684339a8200c863060cba0803c6a881cf879c04b34b40731362df5286ace024694ca1b1d98c03083e2e56b1687da9727d40f21981e4347924307d1e7b65711bf332f13379d4a073dc08c10d17b6ac267a85101e195509b03fc1065a601598a2e736e443f91f95ea1b26c5251604c95e99f2253761ca4db9b82636070396e5467b23a101084c1c49e26687adfb8015bb89b9d113e5416a4047ed52edc0ad5b90ab80d6d964559a2e19ee845b0e234e748cfc284de03ba1b71ed06719fa8f36a4e5d4d59c303eda8b4b7cf83970f8d7e8f834d1a248fcfeedc5e5966dfd0dadeca209451f7568110a8b6feeedcdc37702cb711044c07b3beb2f73055028edcee91fae7d6bf959190ffeaf626252a50c9df266f9bd2f2ccb265ab9dfafcaca28aa15deeee84032e1514fcae3d3c549d9c4b806cb7453a567cf021942e500d0af09a3694ce60347d0962b089b4aaa5a9307b99e8f69e7c1257741d165b1154a8e801159d38558c8cf8643c0a62b14b4e479f9d87066c6b5906c8ff8bf6c15c69ba9ebba02f57aca8536b4db916500dfa228df304077337fabd0a9003bfff8fd9a869949b8a8360b08f9585051bb2490e2cae96517e7b179dbd68aa5314e689a2cc2f37dcc25191274a20db0e41f11bb5f34656bebbb8b00a93a21c3f3fc37ff5373a0d52c543b46f5a56260af27924fc1cadf1052357aa7ce72ff35556814985cf676e72f22ee20136939c005cbfd5fda39756eb07d889fe5211f67cfb559a6ebc2d22ba458415584dc18e867cd49f6a233719760f964c1f033f5ef5e9f04c0ef367cd9d408848cd3081fca884c76820bedf6b855b21884ad4ea35b06c4068516335dd1a61d1c38c841bbab38974b7789661119edbc78e646a2054107a57d443a6ee9a4422e73e91e0a55c40986fa1fc13df3c815ab9830417fd233815504adc321a6ae2245c961540df0f480c8b208ddb1fba19bac4c246e41cc7896c1d7a4de50a34793b238f36f9e721e31c0824da18125ad467c1029ae63fa2fdf7479c64b18bb8271490db3f1aba7e44eb2a64352969291048528a72255f087a0db54c5e24d04b4c20f922816666b63bcceb4e0fc42420f14ceb1d09451921a6cf9f9f38f7a1f73c9007d3d5c58d4a9612962020cf65d6a29347efdd7a6e6580a2d9e46b9be23576d27d3220a2019f07f1633eb666a0ee2791ce205bbfdb5d66af0af16ab1230981dc7f0817e48a3ca96998745b9209a76fe3fb1fa3acf526b2af8b71fe579d09eb706a807d3e01331256405ab919b253912e410156be76f2bd3840e1330de10b27bbccb31d841c6ba931aa60667179e1005c095296142160632669cef689d0029a59eae12fa2b8c3a26fdbf158c58294cb1511dc96430e00adb010c5df19061bc0680b442f2e351cb38efb238c574e4308e60c0e8e4f8eaafd6e87bc3eeeaef312288d030208c05012f4a88cf4aaac11e2347508ff0c1e04624776b0f771619c34bc9d2d508498864759d51f05492abdbe95c65e964a563523b5e22e4b4396dd2895da16d26bb97a3b12cbaeaca5bbd150da65adda1b45d34ea6eade54947a332bb6ce6299ab596d6b18b65a8c467b222585056f685419694f169a45944832dd140de9e879260593c5578cf8b604eeebc7e5b70f2538b6127a2489b1fab643888ab36e8eac4664bfdf70e3702c6123aa0ac95b347c3978f19db90c200b14b79079a32686293c5b21fb1b11010afa28984ab4c0ee383458dd8683b9d720507b1b1d749723c1d8311c583d0d82aef7d120761d118c6ec3c0d47318e87b8f2482765b0ad53d9190c3a5a2e954cb9a38809d83d715a438818462e4873b0883ca9b6f91d1e76494a99cbe71054d5d25f4de5a1e3e09dba13b5754b2be5c851e0dddb0c9b8420f1fcdaf070d0dae078726d66382bea87a6cef293dea23c46d8b56bddf3c9adb7950da5067137a24098fd674aa94fff673f0d811671ff603a5bc0bc281be1d43d4cdc7cd541a8bb14d7b84fd63a6f0840bfd94f4379b4fe3a0b604642ba5f9b4198b438f36f45409524db7db9560b3db73304c1f865ab4191620aa5f7beb24ec98fa4a647afdd71a4fd0ba2522e2907cfdc60214440b6b49668550fa5e4b7930b84a96652b022748a01d4fbc2a04c696337ecf6bb005ac08790b56801e4155856754f32099169da9ce0569b2f0cd5a1e4a1b1195d7a53e7a11f0f734e5bdbf18bad4921b893ee5d77e3b88de07db203dc5edea71ee5fcf75ff7ac0fbd5fbf87ef3fbe001c921f55c84264d0fcbcbbb8274efe79a6ff110a8ae62360ec4bc7da97fd3cd314987620823984aeb9dd4463633bcda31cafe2607fc37a8824bdde53071c71cc97f1041310e62c8e810f66c56399cf32b499ad7e08fa4a2250e5a3c1d44df0b54c59f3e448f0df49a040a7149f38866d74b36c36f91b872387f03131c9afdc981b503bcb67878fc8918e6987e52067f09000c5147f08aec59583a6b5bad0d62c2f0bd6df2c04c2d911508742a3f644fee56bf257e08f6f11027b4c1c1b77133c4933cce51f2166bda0e5943bcdc258a03377b6fa5e912d476b684fae2618fe1a64b41e49fc329fd8ace42124824ceb20325e9cf47637860bd53f0ec9f306aaa0d266c14ad7eec0c21a4bfc2412e9a088ed24e3bf7f253e3a5a0c5d58019e7dd58e5cbd94ef8c1a55f3b4c28094590056aa7e9f1536dec9b73f114fb74b4412fd31350421a65385cb3fd47252636fdcfd52d9059bfb8ec9f7bfc791fadadff88159893dfe371c233251700a24d652572b237740c8171f2ca14a5ceb80fe6a3b54e6a85dd496f2bb19292e6841e48688147fa28579422dce50cab171b4475929e259c1fed93e49523338b1b01c67f9657e0f00ceaa3d344ca59408fb485ba601ce30bc0685b4c826749501ba1a57c4b985d4830f286b9c78431b6751e62eccb83384d58a627254d447acf1106ef01ffe4f2aca87e851ad7428cab12a9048f55afaef8a4a8f6db9646dca64f992d7129fc5332ffb1cf1eac798c2af3dbc45f78c259c5546cdd8c5adc8127d81f43c47bb2c4a06d464397014be5095c95fea9416a63e981a1aefc5c18708f99f55b83e2b7ae75b1850fb421858e8a94aafed8e407a9e575c441988cb7c1aa54186792123589912b853de8b30778c2945b0246a26d3a2e2ba676fe535f5ea13d2af966fd0eb66f7caf4715c23d32e304491154df3042a1d48cc6f657daaaa48d1728ee1aea23e1dd62f549b4f7180925dc774ca4306e887c4c6ef9a1f01db1ab6810d1cf600d519bf8080d8e47eb0009f15ea822ab121f12a8aae9ff80f24a2c1cd1666ad61ce79f2f5157c0074b684110a04874e2d3805a70f6cc4f35f711152e72088235994a5ea7cf6cc9a6af34d1a6efb88e434e68fbe63846498b23385a8c2ebe65ed74a9f82fdce6f3355a7a8c79634161d357c347d1fe482122cdb6c9b0d6b7e58f06f288ae998d44e83dea0ae03060ee8e36881659d6d0c35580843b6a25a40345cdc04eb46de01d28c48dbde58e19ae511fae6f456a81177018cd4d55088e63947e1bec11b357929a1bda8a13fc4a4aca4bad22eaa9588ab712d787c196ade9a4a11be8bffa15b5e519e9be381d20a833c9dc8ceec6241f206154a36a02745b29b541d30132f42466dd0443dfcdbbc85c91524c9a9d0e508e3f295f3312a7fec3fd0d3a4b19991ab69f24a3493af67064206afc451f435643b9de0cf3b2bac6f2c817d8c38837df4387059e87a2c71acbc4b02041a67181819098cb7b0e1bdb7631664d21fe7a4727ca5ef86d718a0bc058febc5a59d946b3d9eae0ce2d8f7f7131cc69320d65925d3dec869aa2977b85aa04a26a4aaacc9a5bd4eb30bbafd66efcfb332f07b3472877d5c0ecd2a3975de0c230634ee9a056d1188f73d684ca5a1eed7845df338e3e4356653451eb0fd3ce41974522f4108390b185659a84cfd394bd16fc459b1a4e5cf8fde375aff77b2f48af13c3a0d46519e408b2f46e136285f0bf759c21e121dcc89a1b7cd4df835e0943bda0c94a99ed919cfe7c37c1e3427240dbdcd0a9113a858b4b21fe77e3a8528401399ab9b7ccc668fad401322903bb96217da609552a971bc2c24e79d065e649da6901961feed916aa0a63998d6db8bd86e79d7704dd62d0b6eb11609cbeab84b986fb3ae41b270efdde8d1e964b8dc9a46c483a5c10ca07067c67b2f4467fd02e2e17d487de8db04a9fea9f8b89c4af465577d13265ef1afa4bb488448199fd6c899ed5ac4fddbe0aa27db34216f90823e57159eefdd1807d47b3a92661e54085d7f0056c78e5a8307c91095b2efa2f6dd9308e80d85278a507cdff8c989311f3ab01b80955ed386211555de839405dbbc6f0ce3c9b935b541771ad700d1396b86d9c8f5d1b43a5259da5b63186b0c174be21de132a96fa6143bb5fa4ebbae3c266db3d81752abb77bb3d3dceb97c1492fd36e549d057e8d1b1c88ce31005d46bf89c60c1c3cc29f3a97f5bf7302191d17de669042bc94066852934bab8ee3e088f3dbad5a0ac1ce6562c6eb3c9254cfc4cd71505be4d870dac8217badb872b6215eda2db55f462ac221a0a0dac5c03f731b7d450bdc92917cdfb0a837ed22f5a41e4d295d42aa9bba174d71e13158b980941a58f2de208b0ca9969a8c7b855e5900e2d8fdbc0336ab04c9dd2df451c6a6aae9e7379af839dcbba4000c613f9602d250e9c90a7737493f8369d1cfab70f0a308a9ff19246a856b35e18b971d4677192a7f5e4e4b0483749731ace4e0a614d37ae71c5fdf75232c6393557b39709e80b3907024bd589866e7ee77052f8db7158331e6293e0f1154dd8e93d7f30599a3ee0fc1aa1d95a23bc306cd38fa41f6137362b8e132f31a16f949d24ea3e7d6ec2f0ff2ec8adebe6aa48ed026145358b25c27fb162ebf7a36f85b29d0a382275715774fc46f22e2b5d7ff64adb42332bd536d884b34351c1ddfd37eacfa75f971c76ac73556cc954a7b5c6c54d5a1aea1770e91b3181e169d28a805df630f7c990662136a433e63596bd0b6b76d71a6444489dd64d29b0cde49f7801b300b50e6318351f288d140d7791a8cd21b7693ceae034c9f0a1c3b435a3368d639014d203e6523122284ead7d9715c5ad62c6841d0b316ab586a5874b557f41c6a9ade038d7cf231586a602ec1994feab0d872c4042f5f4ddb374cff2f83d18cb758a5751515555acc6c3ce26fd07610c8af4742b73ddb66f0b3bd2111608c2fc08df2cc8221062abe4b0a770d7143f12029805de0d652768548981849086292520e21b61602dfefb21cbc81f84aa9ae1e8774283f3b8f610d0f4271f6e72e392d150c58ea60534bc2728408fb1c3b50d259a290414415366038a9792a505ff122ea53811943847bb552d814793a155c74db104786e51d65e3ce0c96d988265769595af74f3c50cff8e133f56f7e430c9fb710156552f7d66ff654ae0b2a4a3bb408f32a2ad65c448929b802d6529b098b832b20ce9e0961a5f754c24ad62c2341a0a36c582e960b070394afe260845da0a3b7a9014d987dc4ab200250fe8324a4e7618ccf0cc3c8ea63e60245cdee0f29a8e2aed1d915725e32ebe788c2f503e444535a4592d8b4d1fceae604959cd2cebff2183b815e2979cfa1a4e9aec339f43a92a7bc17426d563a1717f85d28090a1b00d215bacbdf6e66e6bba734953530455254bfead8f59a97dec42c5954dab2d605c93b5704b043894254e09b475df2a664d51c7d65c558304af7f2507198695f620894abe69580246056187f20b9981d0235906115f9eeb300df19db725b053e625ee1b2368d1dc25a12d3062c247db4efcc8160fbbadc478dc36c3a0e9290e2ab2fe0134fe046116afc186afe569a8a0a10a75b13bcebddef2893ee427bea0d684646ef7960cfce22ff0d12b3f8ed51c6fea96dd0dc50a17bc319acb054259caecf6888a7c86ea9b2eb0ce2e159855db55d52608558c6470a68a57e709136cee73a22bf387edc804bee915d75a85d47f0321097982b6588ef0ec1028474603144b2d720783e070d6e5e626417a921d8f8dac69259428611957561f996830e6f43f994b3029518e32175e85c651c81c054081ce4a3f4b4bf77b022eb832c85d1352168f9c53004fbaf4cb3f8b952d501bc391c0c226cf6d4b181c59e567b57986d532ac922b6eb7a3c7f3087096ba26124b140b75dc3071d26a3ea2a15f40599454859bbba79a222a4e5e2343cce5792a893508221b6893dc670edf72a0284706e6bfa68c79ffcb31fde10053df834179dcf5b0bcf313ca7aa8257d6296a20180c5ab36e27304220fa6c2bd32a5b854506baa0ac61135a461ff0172de8c0e7c56e6cf0da058e0a2d073e9cc91be846a9c2ab8f451aa0bcaafdb06963928caa1e56c68310282a23dc454ee3ded7d7776173556effb83b5eeded036927aa20524c85290f95cb79e90594ec3bfa44bf9c111de417af15210ef0741419569414563e8c7d7c38db351b802aa849af12e8ca6bf6874ccf547383cbe6a2b7a4c3bae3f6432a99d9a6016427f94463a754806bef8b826f7d35ede5a301887cea411d0e02bda237a1b918deacbc19c6557762d40e68240f9be37324ea77925d32f748e29315890ba94276b7de6c8a0e74f23959eb4882b17a51570d31c02d9f2936761be4cf92a40edacb774a4a0f9d4e1ac2b1c0764293abb386b7524a50a2adc1ef1264d15c0eee97c5144051ddabebf49f6ad78c35ee7d4b5afa0dfea6b96ef3b7feb02c49f88c6db4196025c84a6152a0f810b2b052e71d8c045fec0856197005450210031b8aa348bd9dfb79de040dfa493b811490016eb88cd597150e18a8dfed6f03f1efa30848d6d82addc9054839a3a11c33c81326c21a48fb946b8dd827656845790f4b70cbbb3da055393f495965d56a110d20302a6ae810dc196dcacb82460c5231093434ff5615cc0075a174dec18404ccacfdebe42dbf2c211dfdb00d56e06b35d19b05005e0b908556d228aa8c0629a9383ea7906a2c40e208563f6db99debe2426b3ea04c641246885ee50803bcf40d8bf0f113ca206c3f97a5e808f7d15e8e68409db03c571d402e622731cf22be831ae0fe1ff10f92ce66177d3bcba8e67ef2be8a2c690953e8b877cc58e33620066222ff824122b9098424362768eccec9bf69d13d333c4747ea883787787a28bb38f61bfa7a0cd648990d9ec240483eddc055e271e2adc121f8b9f7537b03a243fae5245baa36e49c73075cf3e7feba0907aa3f32d44910ca1d585b6038bdf41f0f97cd313004e86d69381e2849afc9967229c122750dd2bb5c33505f5710eee6db9ebf5ff27e89bc73945669fc4d1f9e457860651e04de6738d34ff6b99da32751131f3f9f5791f5c78c55926f904fe77b4c4fd91f89c7c22dc43c9c83debe34c1807af2f04fe284656ae3d9d79af8f548dc54a4df1f3c6b9739c279f947ece26dce7c5283193a33fcf6fccff39043699b49cc31d7d42147af83773c7edc2acd566ac2408a12d87aebe1881b570729410c440439510fabc0763cd6d897ddb84bf4e0561a71d3c247ede206e0c45420ae3983e95bc90c1f52f2fa11308ffc9021bcd7f40cf578288dcf00506a09fe4bd4bf002df28081d5b15f5c66d14eb539350e6b343d2271b8d962a9b9e10f0af61a0d2c5884067f12d8bd7e2deedd6cdd737681cd5118c052f3c9a488d26b4cdbc2b3bce744d02b628e6d09e5cc8bfe7cb60c616e10e73b1a3d41010d144d70e6ca081df220d0c71db2490560f41f1d7c75514fb665503398cdd61dbc3d68857cfa7d000394176f0bde1a51d7daa2681dac06d5556793ad11eebae8f49c6330cc399f2525d02a65e186acc38144e631ef98846025b4fe21d2b2cca0e19c93d31d6f5b558a3624c7353e5c7dd1439b4b2dee6d7b84463f595be8ce8f28f905d011fa21f20870f260940f09ddd6e3787ebb0377423f67b8832980625f6d53ef9c133033d740ed6fec1529d3c5a065672e5484b95d289beb4beeeee10f5419a9f9bc18ea7b7da9acf2413c5e01df1ac3754f227a988d0266a372b43dc6d790903cf0bcbee78531a241c09e42424277b0de1ce64e7b5eb0e300bdc91b830e4f5679896e69537dc306e1e6d03a3afafe51c5f09eee72713d5468841e25e1b90560ea917df5cda0b455e69be3e2c059b3228a3c0caf457fa92884c9cd55fd058655aa098fc51e8a81864ec57610ba12f2c88e2ba9c36b1b0776cdba7608040c9b7405f16855c9ba6ea922216158f70dbb3ab13dab24f4fe04f267a1a17dd74a12d0d01e86343dd54fa2cc33642420eb19798ba6bd4869d3c8bc8088a19aa85267343a8dda19e0d2bbc568178a36b0fbe510d22a5134bd5a2f238a0f19dc9af6952d32ad85dac48a828445888c705add479307334683964558075c74a10b504ead37d55a5090c5c61c5aba6921cecde761f458e47d5fc32eb1e8feb11c90bec5f79cb11c863f87a3dbc66a570ddd0a463154f5690118fa8a0f1ce36a89178aeda42491a302899927d6762e952f731fe676a2698991e9dfd6ddda931949db6e96ade3c208a549792d6ddbd1b29d29107f08305ca8b436960fec708ce4b4cadfd1b3f92e90a64a09d020b3c74685ee3e1d952292e1e0b4609032d8643fc62f39fe6e6d4c607f70be253cf97ecc352e91b67305cfb2812516d14101790e11b49e05c322ab46147e34b56adcf15e90046ffb5fc51682e4d3a937a1046b6ee58604207d107f673b3b17c58ae56ec0ba2e1d5217666ec1e61a4dafeb68b64513424b238df1bbbd583bceed7da10273dafea7936eab0084b31c1c7cef9052f350220473619e271ff3f61c9c48fcf89a9700f599aba190111c25b49c4bd5eecb09da4a8d33a35de4ba6d86bc617f9019df8c5b45cfe0f00f8cf4227e2b76ffcf172620755e24793ed7e70a08dc0242cee9fe80217b19b089fa0fe675c21cf39e242e7185fb0868d79d795c2eb2111e9a3fbce8e75dc2f9d4bb339078affa09b194a13ef4a591542ef5570a264b33c51f21b54d09954f7f28b27f65e16f8fd7b624d4df47f8da2e59c635f6070e0909c6dc4b6dc5712d99a070de6edbf6c88695334ccdcf2908e48146a437a8caabfb4089738ca703513ce6eebb90e5e927a5c9ea8d02b3c7846d9f03b3e3526e55dd5b1c8dc60b82dcac9e77ace9a0f637735ecf6005597cb50e3ff6c86b1a592c0b90e62b84f4d784fdbcf233b0392c3ba68200f0ec98aa9f361e0879e38ecef759b31f0e7f60bd0915948cd7ce25297a4db639fd4ed626b6c014fdbca961f8923e9e03ec40b4c151f56686df9d67d9407e29544ce3375dfeb37bf06b9a6fc35320e549155c603d5f74f981968f820e94fe50fe12974acc1dc774a984affab59921da034750407f89175e86b8e75db67601059ea30481e861deeffb82606b6a60cad52c685dc199b9d51165631f4158c9aa4b8575f2cabe76243840accf0578d516439ac8ce5d432a317a1f3f7aec35903e0a2fe466efbbc2bea2de03fffb5f23a13cb4d0eced4dfd7404278fa8071069dd10eea5abd19a400f5043bb09e7e53cf63d31baa593009a710c8d30860c5206bc915aaf0928a6f1dd1c9764ef5a7dafc4bcb2e44449d3e174782cd0e5f953a12e72ae5e5f904b7cb54166cba3370794cd0c6ac144cd23d85684042201731b2bb6353db540a160afef886884cde6028d1f344d45e98e32c4a63828d1741ecb7a1479635184a252c8d9472e6f1f2d884b2a9d68ab3a71d5ac99823d63a457ea656c456cb411d728e0ecaaf457b475d1592ca04ed8f21b0e34d7a377875725a03e900bd00aaa082e65dd688e35f4550d6881b485a9c668499fc574af3b0e60fdf3904be748405a7f9184ac55294e9170243393ab2abbc60c76762c3133eca2b1c0048cf720bf11f76dbcd68b970a61aa1bb9f23abb4350ab88cba5f14afd0b72c88aa52dd04c9c55d4c885d320305917f1ca4727e164069a0c80315223be67e31eb7692d6ce11c17021648e7b1cb0b946330d8a82a04f8388c7fe4d443a20ce9d8aeb1db349e2bc485fd648fe0a7d972ed2889642702d5741018c04699c19590133a5b49beb288a71565dd0d8742a653e72794f92de7dad877be74ee6d3c129ca1264ab6e87dff81a90a66cf1a0a97ce5c3695ac9fb7eaf3ad82d546962de75ac2e99a704592edace59303e187ef0e6d89dc53c3cd18d1b35d5c079257f8f553c9bc048f228632b1f6aeaeaac3ad53fcd3716eb32228056575fec7bef0c2c60908455df285eec68d5d22e8f923971dd398b8b0a425b5c958e6dfa674257e759896c6787714936f519dbf2e88e77058bd97952b9d37db2100c827c126a68e213803cb192de70a4328da56749bac46fe00573d16858c95852ece03200716b4145deb15aaa850273e503039b18cc5a4c508ee22cd08c918ec3a534819ad561b521f682d27521f8446edd2a0860930b0a1a49cc6050813193413d0ab984162c4e2b18756db8044b5ecaf4fd325fa04d39bd53ead0f243103d20b220d73ef35b9c9720614d2394b08cb0c7d7df307fb2c37f4cbd00b52103cfdd4bad907a6b83a13f15ce9945b2bb8ea554e464717a2a4bb47b6f4a8a562fa7fe284a759d049131d9aa39e560ba0f832d6016fb0b41c92839a58b7b98f33397e88f32a267c9275b4d2b3312f2d64c3e5b8c601f56cb933f42544e736e249f3e2e74ca72ab3081e2733a9d351672a347fe22284b3146202ed69e54226e2c78903311452213a0f181ef38408ebbcd076231d7a186b681818ee8fad0de4a2fdb2b7002bf5cd569890681d1a9f766c3da3b2e1f471aa24eee688d874e07e16a0851eb36b79ce9754ff31aa7659f155ea1c7fd5dbd39238dde3ff83f57a788856fd2e60843744a7977320b94dbfa624de81858699d0b713c61f70482649022267d13a2db85a320601c2f341455590445b42778143e5c51be34a446a0e6b87a100f70b078cbecd1b51648c757fdc6bb4546973d5aac2a3326ab9638c3f327ef8b4160aa39682f4cf14c5fd49a0c2e77610b965c7bbd4a81edfc96d4395969b05852ccc2e7147f4038a0211b3fc3df14c237b55641142250ae6919ce557528555e9b1f687c12c2aa3d4f6743fc049ca18c0b6d6c6a771b534ee6b48a96fed7fca0aa5c2df7313f9014a8b596f14a7de39028e1309e54dc965109eb5b31a4921062781bf98523d3d651ca868ac627867e72eea043ca27c5b55eec91c37685ad1d9ae248988d46468f1ea476518ef2229e523b51e29b5541451e5cc65bd7f1cf4f7e6e5aae33c753d3700a13c64b8e4718edc8c2b28c13685c7c6148197728b689991e947e75ff6b415e6f8cc9109c2bf08115d2dcba2af9c34de219f91614f333bf35dd98920a147087e0360dd7885172ca6bf0314dc1d0824c0833dcdfbfc9a089e9adfe19248afb224ca39bebb1850d617011f5782d7f5b67049661843df7ad9203884cff4936e2a40aa2108a5e3031c0c0adf5bd74725368dee047a14c1fe3f8980087a04093493d562e9f458e8e8d8287af60dd73510bd4088538c3a0c4ba6495343d7b2c4e521475d5c40ebcb3a589d3f2bd34f4a094ce01195d8814fcd52dfb300106a5fce080d5150a73f80e083cc52f3920fd62a366d7603ecc24d8ea24b9ba821c0309ad5bd789e7d7587ff13b238a5b47329ccb7414359fa1656d4a298a6d26208684e149ab4919938659186d19baf4a3d1034e678dcd9940feba8d9f49b8beb0e2e2b1a07c7e88b36c426ac049870b17902480ae300dfaa73d14c6988ac42ea0d32c680a2876105dce823a259b53985115c5f577cb1e6fb3ae08b42a80cee50b352c4eda885928077dc25d88e852303832ba0e2e8be0610a82bb8af42edd0c0e47dedd37cef588ce2e80e73093e85328b07bba272c0512af834379418db8266902b8df42111faa4f9fa24f6ccf41fe89bc66219af9356da6ad0036e18fc81e5d5fd12bd01f97b41436c4f7b0e5ebaf0a33ba547fb8354a5fc8fad702e03675c25cb00f75a75564432579bb7617b70db82423d5c3042666f6052273e288420b60c86fe9327059690e254504014fab3eb04cee5397f7f92eb392221a0575ee002da14e90941f009d13d5405524bb4e9a52536f754a445ea9d1396017789ff402b64ccbb95d47e2400f0eeff84bf4302182e87842a5e11b8a486f6281a93581b41b8ba47e0c69db31019bddd3547cfd8ddca13469bd2ab0d909bdb2d83c318e887f2206ad6629f18334ba52d89ba8ec9704c48930984e5b41a3a189f7caa4977273eb29791c77a172f79a889233431c1f49b986ab4b3537672f4bf8f7c35b1020d5c609df19692750490b79e2616c6af669e285d5e560fa0144b2557cf0f192ada631eb529188802b2e2069425f25e0633b7116cffcc4e35e806ba2e85ffdbb962b600affb102c3bb2c1ffe4188179288a8eb371f8a9563412bbe317920fd92352b9fe8a3fa44ca19bd525fbd3477f12ca2ca6724bf02712bb3cc73a5013b7fcd0cb04d21bc57ff9fa4b639321203fac4901dd4f9ec3af35362f8955e00e0bfa7bbda03d5abff664798fd28758fd3f89587042e3a7aa47de9f9f897dfd9e8afdbd21e79970c9c65f53c62b8103de6f552c7ad7b48149ea41f6f714fbaa1d5587528b26da5b1aade1ad017db27c9544d3af4ae3976466968b324f4b64619adfb2e290a3364af3ce9d92b2fa0e7b9adc9a5dda4350b4070538fd3d689acba8f391ff2697c263ae7ea3d894074051ff9deda6a5c0b458e22c1664c614f3e0ec5d62949bfbd79bc32500020eb3fe7cd2242cddc73819794bf112f355cd81bb65d29f1c9bdbc9a9458758dcac0a70b28e41e4269ceb132227840ccd2e19aeeee5afc532587ce82a9e1c544fffe3db1dd2b8825bf8c2ffe46b5fb4d9fff5b31151b8c43b55032d5fed9011ef30f4c06371c084eb3a06858e002d34ea4dcb56970eb4bf8817ada1fd1917a35b3c84d3eb23b479d0c73937dddffdcb08667ffde4f6c38bd2cec3df4e352afedeb7570b5122546b9b8638649023d5eea66fa3153c87861291a135c741a6000da6752488356284731ff8937ee86f61f9f0c46212c44961e883721e8f1ccebde6e02650158abd9ebe3d214db766d6c268cf1dbd5038e7ee5675229c66d2df0adc34fa0ea93120cb548d8968fa0bf043960667674553e5fe1eb8140e7521a839eaead22f3b099e79d88338244b7c1386cbee45648ff753231d48e54a16171c38696d9d4fb83de3c92fbd616b7f5077fbb87674e773c455bd43a2f7041013a013cc6daa3c53aec9546514010face48690e2f08b29c1cb4e094d770c92d4728d36222e20360147fb481626774055c9f7f099299dbe8651dd92d3f76914f4a074dd736b97f470ed20c84ef1d830c825a1828c28f624618b5b0ba05fdd51129ab2c45d17de77bfb813ed4c008c074a77723679598dae83a9427328224c5e92f03120a0738fab0f28361de4a5b6b023256ede68a1e0569b6301ab85e14ec328772fe438e717aa5b8b1e25e61b6799cf422e8fb436e87e363a485400c03ec4c33264e293d41cd16cedb35d09748317d59babdcc1643ef959fdeb2f1fc3309a8d1a5cce45631bd2f7ae4bcd5a3e1f88513c64dcc7bafc5917c1be4b5d08dccb148e2363b225280bce3cdb0a0b29ea7f652b852331c4d0317b2365488e22f5113549c3559fe1a9ff0bda90d78a2b143514f4559fce3072754240a7670bf945b8d01572be554fc29d1a420c37b49a918dd1dfa639bd5cc4850bbd545a50b63d8281bab967f361cd4c42e306a931ae279fb60ba93282b852b88263cea1f17eb7e287ff42fff55e3a12def0c866ac3298a5fcff9ed1d674e3d2df60a4bbc7728f0368ddd3ee656e5afa1b715eab56509bc81a061b0c2365119387491f50ed5f8e307385935f4f8ec2d479394e892dc8a29147f4120fcc87ebdaf332da09d58e95e45f324a7115cab44af6807b93453aa1c6ff3e05084d2767eeafb27f0876603cb189c8e93d53d0671278a051784407b7cf0105e4a0ef3459d5e04b8966061373154d0c432591e96812f0b9b3f187b9301125f8ea7ef5046243323ca0e254be3f9e13a8d1241310e9eedb05cd81c0a3e300d5767bf2dd7904bd87a3ad4052238b626a81aa0f4861d9448404c3946ae85f72f5757ebf8a0f688ea1273d813498346783fa9b92dc19604595038e971811733662c4c32701f40c022aa0f5a186ae9bfc128fe0716dcb6631b33d3b9a9f779515a89c58b06ef6c4b358f1c185be3996aa87afd4725d86e1c96a32572eb5024d54201ac5cd15fc93da7ed10d105e566b5244f48c248a1b49a53fe7017a2bdbeb5e889c4a17afa7b39d4a56cea162898a88e517e7d76637724431c057b32e55978def39a5f6118131648a10bc45170950645e6a518b3c227ef59defd911901cdc9d398ece0d96f62bfb230a6e932c2d2e5c6e514307fdb34f137afe902b02819175ed404ab82c6f993ca1e84f2966b318d71876d61658fcccb9b51cdf6a8c816ae455a00a0ae50b5e1ecea549efce48a516f5ac7c4937a8d0c3da1a8f001664f302a2b702397db0cbeea05ca77dfacfa710422ae10d9c489aac55792b5ccb1782543ff49a335a67215320b6197dee008228fb213c2ce2ad6455bdd79628dbabab644bf264b00a49fcb4d6e9bee8bc0704ac854b4fa0327c50f0a4ad96a564f8d2dccacc0a7304a8e6269cfdec057482a48f574b7b05ff70a91d92f6c8524609af439654d17e550c23b110747217a1bdca2838638f8e79c5c9acb4853c19201697ad90e54a876875761b8369dcd7906da46922a50154ae49d2b8c69275ef28463e364a66f0d131f391d83b938548adda3d7146eb89b7c08b572294726b1085a06d6d92336cc22f0b4356bcfccdbd339596c60016a9ea633fd808cf7046f8e108de003ea4eb4735a24e363d95143f8d883a0eb54fd6489f26460dab8be7f8e13dfcd11f1eaa24760d1e1cdc432798be7ac2632bb50d7e0122168b45e5f0b0279600625d243db9d8cdb7d0cfe294f99b95ac9642077daf6fec81dd9da604a53022234e83ff43f5a20a6e5ad10eba38817a967c167a24409d1109b322db50e4b1858ae956911543a24108a8919eadf7eef23c3af8feb38a58546f0027e006d9556d30e5d3e1c21ecdfc20dfd1357961377e94567f935d65459dfe6f74232dda4939fe090ebe003d284483a44ff36d93a1cb5ea09f44eac81fc15f89a6520c4d29faba375599635825edfdf89437d701c6c30d8dac4a23d4827522a13d9fb146bfd0e9be58c67d81be8c1022c4464a9c8a2d6cff5b7877537883f1dbf1b021f2eaa2214607c7133bb54d3ca4f2d58ddeb2a6136fefc6d10451638635b2bc5bc77d31f6fceec9e91e8faf6e527f10721c26e525cb49eab0ed68360650041e7aa24b08f5d3087b3022161f1f050e57938e94b3de9789f4382c37468ab69fd414e84ddfc90c6fe5b173aa1afa65235688375545812be5ce848e72f2fc4b69607657eec2882359e5b01f19943c0282e03337c2f4451602987502b44a70588c3708f145a268c39dc58231247ef76fc19144422170695ce0e720000935e7009b8b549fc6b8ab6edebb62383c8cbeca9b0dd1d209c4ef54e9db2a288101aa81cf4728e94b71161075a792b35427fd5a5efa4d1b88d803731977e3fe4efe7b10490b7984123b48d0853f57e2246ddea04896cca6d59feeb5c9b75466d118d0d9335b53682bbef8c8e57051f836a9d650799682c6d843e004d34ff381f61b84b19cc9c042a81d7ad583058594d3ae9757d737a5dbfaedf23a73345f94feb8cc6d150ba9adbb6dd77dbee6f2ef1a0d5ba8aefe633e4870290074350008437b99dde7358823e2498d37b2266cf198a9b788cc60cad0e6d641bd9441a217bef2de50eaa0a650a260b879cccbc950e97abaeb22e989530067b5b0963a8fce48060c121e777f886d5f6549fdc01f8b23ce57d7d95cd34d0b5fd71dae190dbc172697db0bcad0f1ddea653ef63b152879bded7c185d589977b0c2b73b03af1da53fb3ef7be95974c999eadfd92a09229f7a393beecd347a16c7239d8aa7e95ea31d90e7e6685d0f155319827b99c182ccb5c5a1c255377e1d45b78b06152fc9117a5ea3c9cbde674fcaa3397a3e794311ec43cd563c53c1f31577d636e07ea52d6b823e6269bdd7469511b56633c78b18ccb813a2627733f9c2c8cf924972385655eb6d291bacb5d2c6c566ac73c66a5953046de4071663f25aeea26bee9df0ee6f18d51797fffb8a647a1d648a724fa4b2e07eade4a93d7f605c66378f41e2da25804612ee93e3974bb664555b762c9c0cc32166bed3793e870974fcfc588d3e914818e65bc15cbed51df3e9d79e39366c54bd151a2480371b29497bacafb76eeb758472dfe750d61b49694c42e7f03bbfcce65ef93bf2d69f69b6e9d993a7b3751e5e5f094673215593daebe7a1472f1be93f5563a648ebacc519f5174f3936f0e2f2f3e188f4ada8a69f2529ff0da6f3d5fd3481cd27d94a85dac402969fea655c8dd70f1d5b794c74c2f618b00ff20931affa0105482ab3f081404a7a8f9d7c325c02ce2ba0dbfd647e3b6fde4b51fbb78234e87763be36eec7097a73e0365b0cb48b752e7a3b81ce696b7c30de0c9ebf0641c08afe64178ae1fc023c07778356a783b4e00ef00777941bcc603e2323c1d979e01be83d7fa003cec2df994c3f2c4cc5c2b370988c5ead4f3316983c05e4f3f404c62cc639c9e79a72128414ce81252482a33ecc2d8de38bd0c7665392c3467a189462e0bcb216461b1d964f9a7332157695c8af35880c74f18c0d67dfc5c01b76e1e3f4d005b34b3043f3ca6ccf899c1030d272c134fa3af008258265e0087ddb2f1ef86c5cecffe71c6f2d3e5e9101422443ef4609383cfede0f78ccdf193f4415fafb195c132d2c8eb488c790cfa53761c39ec8d3892f18c1e87fd68dcd35f6ed84fde13bd8c530ba0bb516fd2cbe2f1c530ec97a55a192c73b20dc4329409e93c2c01c6c4fff0648665b2dfc41c4fde86378017c0ab711c8f00bf9eeb375ecd693c19dfa1a2bc8f2feae519266350e667a7633206e5bf3cc6ed8e97f36f9a459e30398bb4853feca24229f6eb780ac42eda04e8c6d3207651273c5c256809d0865e01c63061177d22c42e3ae4c359c809bb28119669c22e0ac5e63c5c01da4827c09827ec92422c13dfc3bbc9c72ad84a79bf05b6aa8b1669136ca9bcafc116e9dd27411735025d74f4d2734e1ab308cb444ad4bd9c8e9dde3b581d9895c132fcd3699e5d5ec6583010dd0eb18b1681c22e6a8408bbe88b659cc02e7ac407fb75ec01ca8d36f66b19ecc29ecd79596ef38fc695d7e9cbf21827400d976782ac7e8da741563fe36ef07db0d41ce376d4cba745d8858232bd72fb2d2428d32fc9f02264f5e98b5d1894e9b7cebcd86dec47e3667f1900f61897c12eb65f8d94c1c2e5c88dc6e37b62be9837efe54be3c1971bb95f7616efdbb92c37dd4a9991f14f871e96c1e1f68b95967f2f4aaccfeab68bdb4b58a653b7ed2719c37e83b6f7c963ded7cf5efaa79d2b75fabe58192c933d86f7c9cbe2b93cf352df5297c12e785377f1ac8c2e1ab9b4875d14c90e97a1845d74063eeca249586609bba813b145c92df9e460c98da74874d0e13b20c18860439aba01b2e2491e4d03b3e279a0399801972487c75327d8073f6606373ec98d1c7b3836646536f62811b2d26c54727320fa281ba600bc23b04bc3fba60b6efc0cef9b34b8115e94076fbbb02f8f3d5149b76cabacd024a25488c0092a85a4100b11bd787bdf0fb63f4ef7c55f98eee2cce5385d176f0fc8e9bae03e4bdfe5c529bdedbb645c0ed7ed721dcecfb82058def653fde5d27e2bcc46273e809c7cf0e94f6fbb3a7da71576ceec0ab339e6b3df98364776ec37328bf1fbf227efcb0ee306507d1e00b3a66f5c65eaa9d31d6d57f34dbdd57cf62f3bd9d5b4f3ab1ca89f7e0375b23ba7cfdf38edfcb89d03a63a3f65330d746c7f9c4c87dc0ed531eb43f5697dd8ff385dfaf63eb63f4e5765ed619c723a5e9c7e7239ac853a589d7859ce56aeac4ebc2e7779bfb92058ecc7d7e5fdcda529958d5d66edd2e720a895965bb293c8d118e592aedfa459313a911997a3adcb8bbbb89ca3ff7ef4e5044257b91c7d97dfc41cdef492cbe1a4f7fdb812b64d1d764bf58962186bbfecca94a54436e583bbcb9bd3f1e22e672e0777976f1bf65586d9d5e9288cf3be9dcba14ed3bb811de3b894d5e9fb635e97c7f8c695f33e974f60e762bfb17357d957f3a7efdcccae504f7de74a2f3b7bf2c7a54f7937e4f9282f07bd91e5c8e4b7ac52cf458579f072df7c8cabbc4f89ebb2a25fe590cf7e435a08a95de5e0d3df60fbf5b81f8c4ffbe3745d247718dfb9f6dbb92e96fb8bc7f03e1b17c673f0be1f17c68d1a38d1262ba373f176d148f07df1e237ed2199419223181358118c0811df17677e71617c83e1c9219f6e95437e851d9941921546042b62a459fde2a7fb2267462109e574fb11c6992f8c0ec6279703a3f984f3c42a47afe490558c4201797decdc9d0bafe74922920959245e71e3fbfc3e5b1f7c899d2f665706d8b9fd1d1fb2088b4b6d8cf2832e0ad12850748cf34527f7498412896eb4e2c6b3cfc7dde47d3bd7d41e43c1321cc771bfe929829cc41e242cb9b0c985530411ddad7dc4ca52ca96cd7d3e7bf2478d2be5574e672ebd997f92e6ccfca633cca75939b29bafd32c594963a7186657d40a9e6e65a744dcc2526929d1c86ef59d838ebbe9322b371d8223c49e2a7d7cb4d3e5b793277d644f0abad33fd9a304729b10c6198d4ea3401b79efca34225dae3a9d51a8a7bea13c1a4547bc32056fe5725257ce22cd8a77f1e62b42d18d4ea360af4883c3e3312491a60525cab20c957abcf471399d2ea594d2e527295dacec691612f2ca6f95cb41414e4a798cbb215f56fe72788700c05bd8582484f5281486ee743e0eff62d7964674d8639645a05b9de5dbacac48d7d0592687e490c6d2a759d1ca1eb659864926b2c232cf28f38a0c95cd99fae9dbd69fbccc975267ce7f948868e372f8e445212f3a39425e1d2074988f54d2ac287b306f5ed1ac9892591dce9c8d2c91b71a22001f7d6493c0b9892b295f7942941259ef4b3900bc151f07243a08e2c1197d934aba8584bc7df9e8c3e54879fbe5cddd7879e9897205cb933ee802f0178f02f2fa48b90e9412a144640f43183999cca019247b6473475a07efeba73c00de2afb88124dc6a1445249a7232f29ce68a0636156044b22a557b04845ddcab0e8d644037449a132c0161d03bb640f18b825bd005d33680bb0c543ec8a422ca30568139d0063e285d420bf707188a2c8a21b4f3136894e8428511125e22f36e956bd4d84b00c5c6c09214a06c88a9fbff192a681bae162436ebceca16cb8919ec109d0868e01c6b08b5a41b1903d140d3308041ff000910e7060034396d04006309e2cdee0062cdac0863514a9210d68b8e20c6628434b49066813631c03b4694a44c5d08f6de5d0b4a25b17011418663d5d8faae76f09a0f5cf368d19565829e39f6c29a56cf927dfd2a351a4949d0aa551bc7f6da5090bb21b8b1a92c8075ddb214924872411144a1455aa2c939743cd8af2146b2211264a223944d42d28e54848e828fbb166308ac54f255df6931d791d25c20809492b54d331f3e2904b6a4507352b7e46d7d2ca4ed2287c6a45b3a2cc9ac995344ab7d806990dbab883ea73a336a253138aaccb9a902674e3a507532b3f548966257a67d3fa47069b94124a283bc628e79c2a2a634bb3608c10622dcd523164d91c639c72cef938639c2308310d420daae69ca766c1db487bc61aa76cc948e7e79c4d19ca4c360b7e8efa8310c2f8c5286394347e598c91610cfc8cb2eb4e2a2a89c5ac47acc919a5e5c8cd6ad67d69167ccb968c7d755a47cc228b764529e3a58431c60863dc46190f1c3822679e3b476c9248747a54b6fc8575103949545111820a0452528290120193698949025d274507a4548aa26404890404d2111ce7c34da0d61f549d6d8362a380a6f9404362345232aa4096f5200b82613cc02c40e90ee8052e9d493070a9d4811422630e6212b19f68253a723918bf69766c4a4ab9877be2a5ddd33d34f6c41e297b2627256721866198d47a22dd4173e6247139a86523a49e12d4304949a614958e53982573ec39a15029367174dbb62959b2395b70399995d1cd6c6e735a1a3333d8ca0a77448e7ca6c2a69450605ec4e28ab91d92a5c6a02c167d5368d32fac18339139b28c5c3c56cfc21d91b37d44bf73b9ab6df7b19da785df5ab6f337de56dbc6e18039367bea7a3a96114e49c2208c69c11263cf4923d16b2f96e828eb9cdc11394d90224db36a50552d50a60fe5ad1e0fe1611e668289e800f184043142c77dabd70022867e2ca08793d80ce524cd8931f5e8bcf26eb1ceca47f8f5227953cec73927c6e598968d442ec245e66f3a6a993622d9272236c27808318a3424085ff26e224cd738a166e36dabf0aa9673124e62b201e731a9d2989991afdc1139f15c56bb78ae095527a18bf7c21be3e79993f125c997e3707039a28d31378ec5aa19576774db39ee881cedd95f581a0c6ec300caf43f8f238967c032fd1ab00e1aa61ffbdce71a34bbd889d4859ca42727bb356d733fc4ea1d2193787cb34cfbf4a16987777b0a97b359191ddf2e7239347b925d2749f37c27a94268a3d5d13cc748286b9f5ab0c1a629e17c59158adcaf3bd170c2109529949064feb8f2544f174229a9704ac2e97492599ca77dcaec27b9bbf2a4921076f22a99792aaf6b96c42a7727959c431d1fc631c82074900d5df6db26e64c4db36e224c6f307a7c8e23c68ca35bfdec5bf470340b7bc48e6156d5ac6e55b7601344bc26e66d34cdcc6eba95d91f7ea0d8c8e20f3a88451e1e9e1b9fc577b44dccd36fd1fb2abcc428b5d130dd375decd8316252d82874dd324a6619d45ab97fd8cd9e758b547af6ae5bddb34f096de8b3947bb5c67aeb99fbc174ec5be476c86bff61ce3927e576743f911ebb9f7eb2dd0e956bd7ac8431d17e51b3115ec54bf1be1ff783ff71627669ef6bde8432b0b3da4b9ec6d9d63c6ff3563fd46f87319b853066b3ab1cf5db6f54bbd548479a97c5950eecd933acb91d3207fdb45275e3d42cfac4c687340448704687cf1aa7efaa3f2f3d6c9b803b2f9999999919889a1a3cbdccabf0844d4ae7ec2270a0888c4bd8e0cb96c9195d8f662d200a1d113d209406f0e0f7e0d30246f6fb7147efe6affe38ddd1c823a247b3f83fe217d0307ced4494b6cabd478fb647b388985474a37fd0c90246968806b04b0828c3e70d42f9d1307ccde3724adf4a5e11cdc2ce7d203cba8436db47f6d3895bf48014b1a48b3ffa6e5c470c3b92248c19fda6b7d1f99d07216bb483c3e2f8e6edfb4dec3f30503aff47b74a5646372a8dac4ebc6d573a4848441297f5c5d11f062a0e8ba359bcd94f88b6801eb1b3c34c077d1fb340d89ac1201c40d4e0ee16618925b73bee2e4fa6bd80b2e9335a3a67e9329b991c3173a956e6e9f18cb21944f6fa9b9ed9668d9bc98f4696594aad8c3927fd7ce47266e6753c1a56faa885c71d5ef5956dfb9cdcd2e2733badabd7436e470bfb756b18cfe67d7ceb6bbd8695feb558de74f0dc2e8988309da272185139669c73ae2ee30d5abf713b2a13f1c27eaaebc2bec57ed995e122ae6ccb3f6a571f713b785ac35cd88f06d7b2921bbddbbc5b0649dde99937c3323791c5bb2d3cee5bac32d83533538cdb68ca4c078d237ef79594fd543729f634eb4a263b99794a87513b8ca4fa6ffba7a3a3def4865da5d2acfdb2b9fdd399346e9437b6fb2861cc537a96752592fd68705506bb361974e4c949a1c72e78e50bb59371a4ad72689fbfa159d82c2dcb1e776ea6d3975a192c1325941134bf185bb0abfd7efc40a7f7fdb8b172bf819db3b0d6df90af36c6b9d96fe7632971e3e50b29cce0e35739b0d3dfc0ece9c2efc8c7df90968fc5a8e4743ab5851042d810b2921c9c9aa65fe331db75d6dc307dec34b29adbd5f84bf730ba8ebc4d7c3498bb412dcfdc693f0cdeba51f6a1136bec19f52236d9e732d165259162d87c366dc62d3397b387da3d8cec9bc5debc8930b33ca165c578b3f84af00ed618106adcfe88aa3089f5c5bae3a99d529eba9a4119257c8f9826d960ab8346c0c2933bfa086e190f2aff604eff3cd4bf1697b944e24e978fb28f270b238c8aad71e9b794f86bbff4379de2c16bea4a24af7627efdbb99fa36bded722478d3b2350e3ce67198532da8ca404efb494af6dc58750ae8c7221841042080f21843538ba75206a600d28618c66b19a05191e422a80e0216c276c30015dbc425e71a594523ae00344ee97014109151e8872bf2c8a2134080eba2262c3a220ddca3eb517016d78b3548c80c8e4ec3713a459fd19b57ff19c0dd2acd1b3f820cd629e78213c31160163b8086813e3dd608cf9f5ddbe79ccc379418ae22bd4e93b75f810a45b5cfc4d0789342cef7cd49a086d09e4424622206181422ab57facb85fd64b5cf86d723ab4af7464dfbe591f37abb68b58e83a4e7231b26ecf8c8e7010e9336311cdfa01a459fd229ad54ca45b41fa42ba01ddaab75f44ff681a8823a4832cd17d5048081e369ad5fd1add3a95dd5072aa7ba1844541282cdaa99c726483ad52458f001d9c220945a2c8dc299240e4089decc575ba2b1f553fa5e89c937e524a29cdb0542a95b24ca42094f142f804c81a313fe129f8f41221ace330a48b6078875c8e9755189771482773e696674fca8d4a29314a29f6ceb81cb9cd642d65d08e4ea210f378a0fba2108ddb341a6996948dbd67286dd9b49b16155d980ba74002931b8d48ef74c851192c23f994e1e9b2bbfb2465f4e9d81395acd8afc65df9146a016156568e3a8c2b5ff9a7ba75e537ad5245d43c9d4ea8e9e26265b0cc3c7b37f1e4b17c7a76c5a652a928ba959b68bd6945eafb51e3ce7c05074f42d1e1f009d4a12e04d3bf038944fa36a3535d12c18addfe842e4a0465e29bf35ca8e8b88fbc6d8aeef4d44de76fa6cb4b6893c3e5924ea59244e8a04a75c8e5f8553750e74b1d2a0cbbcb993be67192c8c5934339781cb99cd34f9fd1f5e4724e4dd0fba3b66d62347fa8154d33ba10203ad747ff47bdaaa3e845b10caaabcb0f2817d508b3d449b7dae5a86f2e5e741285e610da3631bacb0f7cd45dde3423c8a12c25925174cf22cbb78c61a7bc93f7eddcc48e30878cbb669daeca8bf9067be882b658d9beff65d7c5e99b0b827b33cb639ced97c3a9b5d189f5d14fbddb53e9505da63c89fa7151dfb26397dc0f9c85e772e9a5ce9ecb21e61dcb300b73acfe927a7b74f597bfa4be1272698eec98f44ee71f302037e562bf1f3775e670b08ab37d1d36ba6dcce548f1310f75fe4e1886fded61f49bccb22c835c9665ec7255b6367777d9b819777b71d27df1254d596b069d98f919e9f1752e87f98526543a4a08e9a69d2d00cd751be7cdb8db8c6e83e996db9442f7d1a2cc088ca93ca5a6914b1a26025d19046dda42182399348b48b71ae38934a547ce34d07dc381cba92e12a8590c9bc541cd5a31a3cec374d4f9282be4094ed9f81252ba690787ed17917498a45a0ce3542649e1c3f4566a868ed41b2d6a52d4b8add3b8adab3f5d4d5f542297342b56aedbb49626252b04944aa49265914a96156124500b20fe63298138250863f8858b0f51ba0b9b84e9a9bbb0291f8c08c6042dc27830231af7036322f5e9d6d73f41dd6a614696d488552295877d9a45b50ecbb48e398ec46d15e3a40c370f7589cad3dc3de53210779b5024537c655034285c0238be1b3d7724313777d5b8adab1ab775dddd74d35a33995eda501b0af5214a37a14efa10a893ac90215459f8600a36e090ac2ac26cff542613aa14934427501e1228dd5ab1d5a04425d0a6c36c54d2598c8716356bbe721ba954e9959d86c94ec3b8ad4e1e58f062d4e5a95c9050277fbad2499a908b431c1dddb5ce6a446d570830a53e44123689d24d4d2a6ddbfbd5270add669beb2ac98343ecd16eeb362c25856e9d46b74e2371984a6daf0201c6440163a4a84b7e504fc284faa759a1c203f5d29320ddf424502f5d85cb59218074d38740bdf48db90f513aea9ad08befe0c46b4e228d8bf35db8f80b2b0475171742b2429ee0413aca0a5181010d438870483632926665248f44fa4dbbb02bbe4dd9d45f7c0817b73689d25dfc850b9b84e929ab39b93837310dea34a59b34a26ead72b4b6434b4137de2474e367142814baf5f1ab6aa75a3d7a37cda3b7211fa941cd62d2e4095d44f26ad269af0f6262eb13ba9eae72dba96a1e7637de50355535afdeaddb8afe61e60a6d88005dfdf8a602daccb7683bd9fa9238e3ba96b86933b869c82d6b393d9e8b02bb54e7867004263f8052f08b83827b4113d78914046199d81c0a60161db86a68c30dcbc4771aa017201654e4b672499b7d65aff85ab91f2dca981bd1ae4ace341a49dce588a6604ad8d58365e2a90005abc81555148a562bd5a733ce868eba204f28ba912a3d5ae66963a9edc14e5557b81bf3f2e91a927023b4e93b2103d003300bed4524c098f88da56e5ed61ea4a24815ba1b271cd578d5528df07382ed45edbcca21915d7ecd6c946204a67292ea8b59805f9c4213604482f78f758a710503c6ffab545fadbeb2f296969fbcc36069a15aadb49cb84f429a794e364851d7d7cc46292ab2e195fd66aca3da56b94c004718a104cfe5a8c65b4dc5414dc235268930f1af8a862a06f8552ef8fc541f6e487c0545244057165f5109914913ce8bb7eb3712dfca356e4ea4a89c5a8e187d05c6fdaa4fe9f1d596a5858a231260a8b8d5552d5858be91522f980f83a5856ab571b51962effe41273ffc7ac1d7c641228d26d465292a278fb5e2191184878787877011085cb00269112d2ad9ea136144d07db4e866936a925faf57d66a12cfa8342c05fb3009dbded9a4db2377c404f87627751e5f2937ee5723d95452bed2f2f8ea06e86af1f89a05b4511d289b95486aff3824479a33d24cdcc8f3af3e61018bfd3236c16506c1e50b61578bf307df209758fde30e7c1dc7337c5d15e01378280c2dffe015e016bc70192aa1071fa838c2caf935d8a5727e0b93fad5fd0646a90d753683449aca83410601a7f2e413ba123379884955d9369eceaba46eb395bdec4ac9432e4d944ef29060b67549b382a0ddad522c9a35c4ff625cfe5e2ec3545b7d608479b55f06495ec569614dc8d6eaf16d52b75a4a78d8856129d0c0c596e0a11b0bbbdb388c769b566333baf1073e1900a93403a744c54fe5b42635bb240fe2709c26a439c96e3cb700daf065d2f6d1a21269aba2d39c6842cdd28460c0630322581169532235d7c06033a9d90957259578068900b00d3708fdb991044ff0b71297b83726100ad1501468d38fb1c88dd10337c60cf41a60194631ce8cd26bdabb1700186942f1954daa755b9f6b4d4823c38b5fcc537940203756855cd735926eadecc7575b798d44a75b1de1aacf8a52bb4200eaa90f617ac92651bae9299b845dd1bbf80e4e12a6a3ec8ada95025077711ea9bf38fd0b2be4096a79a0eec20a211df5d47770200ef78824e56942af4dfe74a627417ae92dbe75ad3e424ca4b7e07256dce185dc8ab343905eb2f115e32bd2d0a2967f30545f762b8daaf8ea9f4af413ab4f8bfd60a8d8149b7533561f229547b3f0aaaf3e1ebc8f87fbc5d7aa03c0e5747da45b2c8f6f24dd825c0e0b8b2769703d0dee46addf604ade13fd8dd49b0eb5e4419c6e613fcd8acbdbd01017a956b0e7c0e5d0e7b0c9d4ea236f908a861bab186eac5ce8aa80428dc20da969569d4ee8ea56d3ac98245ef5737d5e140b8c8716d56c325c96759d0c2906c56f736287da79f40bf11569b80b0c138362166e8c53b83136212261fe63f55ff115b7c83e91a65f11a60b4c43df402d66559dfd60dc8f7dba6ff623a55ed4370ff10e95e70d4cd33f3060a8a2665f9dfd48f7a345dcb488a3459516ed108317c0fdd33ffdd33f44f4e05e1fc3b1d0ea135f42f4c6e07ee89b19813140cdaaa2eba0fe6956af8005b085c1960c20cd4d7c5571230e6e1058544fb11b950ec7faf90fd703c907578dd6b1d777c8135c7b4864f3f6ab8aee8102eb4001d2ac28b1fa344ba759f1409ad54d401a7ebd7a05cd827e016c1924e91f20d1c1dcae78bde6f4b0cefbc08daf26b8f1dc086ebc2694821b8fbde0c6266e8c2653e949a06eb24324417aa9abaf6d3bf9d3a12cc9d2a2162a48d0815b6b1796b8b0ab47803441224c64977c7c8da24a015badeef1950ad8a2e76102c7b127bbb0c4ddba72ecc12e2c71f9cc58923602d390ac1685a3bed9d4e91f09a5f22f654af9f7a26421c38cde3f240b1966fbb783160586412a227440d84176b21fa953b15f4a9562bf1707c0fd342166edc0136162ac4e54229e4853bf0061e2895c2e03aa35dc789e5a86ca93655da752fd4de86acf966456d165762b9a768b521f24d2f44f51ff449a1eac75dc6f9a7d7cd807884eb7b657ccd3ba538f96184eee26a3b2d7739b424dd8877f90dcda5de39e411a88c359ae4338be89f0d4575b8710e9164715577d220cb5f1d54898d0dd6cd50ea9447896408bb025601b602b7b3ccd02b626bb2a1ba0cd0d6e7c14c38d67105c214ff028dd749315427a7dfd8964577c04c65488f3b5bcde5a842018e16a5ead71ab8c3c3837bdcda898c7976a1ea624dece9b7167151db34fb37a344bf3b84b3d48050948d0719ccf92669ddf47fa9cad3ef5a759b16d2369565dd2af1f8efb76eedc7dd4737c559f5a7fba55eb468b36fbd5ead59fea5397549fbaa45bfc86f76e365c4e770d12fe6956bf605111133afe2acf4fb7be7edd25dd6afbd52240fdead712283f49d8b5456199782ec936a3cb040005c091b4694230b8f19a50f5a98fbff9e99f52943aa3db68b86deb8ad4a0fad33435344d6a8244b2740db40d30060b7953f4c28a64addae21030c2a93f1126be55d4f1458b686a579ff8aa3edd5d02f6806b9ce63b0468d3cd2126d5e709338536d8e33928401b6e4dcb7020831207020b3913fc408a2140c1a1807b41e53476698faf3ef50c6148831ada90c516fed528dc58a550052cdc587da010addf24941c497cbea4934836be22cc0c016b1d57378c6e5e05428dc2ab52c09825cd8ab7de70f4d74653d13f4ba00db402c402b4c91e5f830069e8fdaa4fb7b83a4474391e2caeb83787b08a1b2b146e7c3cd2acd821892fae09bb201537724ab8917bc28de7947046b81efce370702327831b218ce9ecd799e046ab092df10329860005f7020e051c0bb814dcf87a05bb468faf4d9a86164598a02a547d7e6cb5e24279f2d534dcaa8636d42caacf66a372debcb567d4255c7faacf139dd484369c5a801c98c391a4459aa882f80ab08482105e5e18233b0823f639b191379a33ce11166777f7c426c5a68c37415db7fd4a3676571202c6683f29e5c4e69cb3bdcfbb8d4dac679c18a4c97806ceee8e33c68e1383240863b4e6d18c9cec1867742c6577632daeaa9be3658c0da36972774378d28c31c619e78c9299d91e462c758b67582ceaf810c67ca40b7fe12b8c81564ac9b0a594524a29a56c96568592a28c524612090a1bd8b6520bac45e08f24d23571868b9a7561bc6c128684a3c847a2dfd82ed3267108601c8e268035db9535c7081f260761cc462bc55e6e561a6d32f6c61bc4489f1114c3b02963638c61184782d3064049842e5092a00b2fe12988267854808e6816097a7d4096aae5440361b7b457d5d44e0b616e20d17f740bc69dee660291a0977f040f5d24ea659b2398e71ae1c3e576481e9e8e87e74668779a1180018dc08742a1e1c412152a48802455434a0fd5a1067027eaf63f17cb3f1ee60ed7c5bf99dbe25f0e771e4e983b55ff5ceefcefb477b6dc699aa7eeab5476ac88ee2e542d2d94f73de0fa485d9ed52c168f47102aef0766f5573c1f20abdf8a314323f5e9a58ef26aba956a71532c3765bf7912eaf25f71c05df1be075c393da88231a4dfb47cc03de5a88a50f1bad38f14af76406ed5b95206217dca6925a40226e1f6b59a9a66a611a871ad842b23356cdda93b75a778d3d2047f22e207650cba2fbb0c67b8cbec977506b3e6be020808c80a51302178f4108283d80933e12797a1100b08217808d12ce6d12c1b5c3ce6f168181bdd8217f37864ef61035b7fbf07d8f2de03b87d1ae82242c6edcf40570374b87d18e82aa22d84f1e27d1c60cb450bfb9e400bed760ab680a4c096eafd12740559710961196e0874551ead10cdead1854e8587ed4144038a601733b11a22d23fd8c54526005b9c02231d845d7c8491f059ac383283ee7833797cd948b73849a700b618079075845ddcf3351276b19218b04f143086f93c845dbc845dfcc3324cb08b815886f94b86fc0019808bdcbeb51e5f5ec2874b2edfbbc75060bc7061801f201c3ee24dff1ae8aabc3d959b4ea56b995cced72ffd2696bcafaf8fd2e34ddea7c42db5b4d82f5e89eb23be14df9d71005b3ab887cf2bcbd27389d80a90c55ff1380acce2a778cc04257c8ec27ecd3e6c390b90c5677bb24a2e93ce1dda98c06f82ba1559c57e7dd331ee877e77533c862cd36f4c25fb6120e372c8db7d1b3134d91b1ba5f32997532a79369ac5858f9f70990a972300816ec737048240d706fcb1d1ad296367aa47599968c03c8523e4fd316382191a353333ac183334669ad533339333a4d734eb728c1a385c0ec0e556ea1fcbe5eff7e6c56595dbe2d86db00cf73b76e160192019ed40376a513a56fa4b42b08c0d760931000ed553da64bfee805ebac5ef2e5b1f9d102a21063880597d940701c8d2e91cfa3c84f459da531a8beeec757fb7bab6ff21f2c724b88594fb41272dee079d1c21efcc4c4d363363528277a6ccd280cd26a0344104ced8dca72cbbaaf341f768bf8ced14e2fa88ff317347bffca199117ea0b85ff6d50b3780a4477bf4a8fde24542de0fc8d591390dd39fbfa182b9850eca6efe35774a4169f046c4856f4fa582188d66c5d175e69d353337c608676ab219c8351e0d6869342bb2b5353333ac9e99616de4d17ee96e39690e8080a4ca854518d253821072ef4c9f6f81adeef328e852addc79136ca57c5e832d95cf791274b56070f63fe87a61199de9f92071a0e39ba9b4a3ecc99369310120cb46e368561f002ddbfbafefbf946c0b257d7a2456b748a42f93dfb93372333e9bdbd7fa2316764c67de699198575a79e2f9d3972da594524a29a594524a29a594524a5bc39ae96477f78c4e9e470fb6375216198ac18d57c116e300e2e10f14006c8d4e23ca80ae8e655adc89652296358dcae33f006cda61240a22848923ac05f0a8955d353a76dd9cd8652308bb705c200a69189d23451800478964538260a1fba0900e09ae096ebcc9ee40567c57e34721b8f11c078e7ce0e3257cb002a08d124258269e890d10b5b8dce38370f6ebd7d16fa2c6a388db0fc29a875ccb99c862abba42f7c1a220b1281661728482ad34036de451a79b60151d34421704a738f94084cfe6c2afe67e336e0bcbb40bfe0bc085ae0b63c0567689652bdabb43790c61e64f9e490237bebb547237a972d77ff77262a9eec6f5a3af97f213d8b9744685464a4d8ca89262ea4a242ec693ec375f7dccc8fd30cf2941825ceb0cbb68b08cacc96af467689d814eb89be703b2fa9a7703b2e010146e1f834bb850093fd8f0f1a48829dc7e5771fbd4427913654a6f6e90546cc08a0e02187e6a60cb104bc2ec33346ad48e880644612686743875fb5c04c90c9c1052840f110df8a1130488843f940935353540345831fea26ae94e0d3369704498182f2da73b71449a2011667e3a410224c20e887061d6752ad55fc41ac03c8c9693c098f99b9e4fba2f6baf832c2384f44cc24a788890f96227ee642277cad8731ebe4cc9f445b143da5837d60263244796c2d0e97ce47494ae24c2e731697dcc49279d73ca68052c7b8665189d33a334a318868d6826a59452d3b42ccb32abaa12cb3256261b506b95149318a51493f459961151444d8d363f08848de6b41154530313a2076603886c6214abc1ec8d109106888dae798d3e8545b4a4fcec7d337abe13c3a827e7680394948194262da7ac635683150346891db35ff6918fec59f6917db33a3bccac7c817f69e9284d4093bded47e5a4234c4a8b0018d3dfaf3c0ca697aa8c7637e5131b7c9911e226918780e8b015ddfa5888a1b0100dc4a111a2194096759d4ac5a251c179150d10543b506559d74518e507fe4ccb48e693eee32066d2ad9691a717666a3061c204886ed5804c58063138463aa51cc9294772524ae394db286a9aa669d968341a5955d546a3d148a354a352d24d4a8d528d528d524a279d73522226957452a6f438a8158247d300e9a227b7ef0789ee89c001a23329a59466cc3539026d5a5a8cbcba2507d4614e2f2c152b07534a8c0074330028d1c041a5c6a672355e36d78d8b66c3fa508306ac813c401710debf19173e06b6e8618c0b9f030c1700bcb8f02d30606bd4c2c58b4396e700c30a0000707871b1de61b4e085c72a70e1f10948e0c20b612003178131bcf29807c2f0593c088f9494e89d95b8431a2cb700c648556bda53f424a7619fdf30cfcb302ce093cc8b328b2d10a661a48dad54b62e5572ccc54b8bb62d33b2354c767d9638d19c68425a134d486ba209694eea4fe5e1a126435086b6ed67fbd998a85943afd7eba509fdf413ee958a214d98fc00458131f1cc509828c893cb79474879bf1a14e552a1fbfac70a8d851bdf4eba3573e3fb09b461d234a437d0bbc9d584a04cbc26e4f3da64745d7d3a4da8ebbaae36e4ace6a4593fdb4f8f66c5eeb1877b74222661246eb81c95dc68139310fa00bab2134099086df8fc027ec191fbd1a2cc08fbd48d7698accc027efd900d21d6242c130f852a3454a1c4a09b1ecd8a4bb86bad8b2a7d52d95e71536da89a92aa217d0e64384b6059649105ce1375ebf8722d1c1a88dcc8051f8eb9bb79d8e5c285fd837554db84a410a4353d7c1de92cbf4ea71b5fb50655274f986ba4987ccf6790864497d8fad34fba7738f1ab96961e3b921784c18e24bee291f88a47bac5dd6aac6546873561fa4da77ed374341a8d4629292973a66ccb54a98ca6cabf39e779c948c553515119492093ed24ffb0f04fb37cba85cb99f3c51291346b492d827d15a8841d0a35b915a80661424e30a095ca04e3b7e072a4f4a93f5528d2d0a2eae45626485e96bd79319ea89d79e36ebbdace77deca3384af92977dba45ed122736703f1eea176946aad7a8042d5785450b199a1100000820009314002020140a8603a2e17848a067abf20114000e7ea0507262a049b31c8721848c318618000000006000606066124000f030187d638f5b2096d94b06daf9986e6efb4d5a8de7fae8df02fac14520f21a20ef19818bf45cf0c640f7511ce561262dfc287f3ab3731762a531ab28d2b816f94d172f2a4f8a66a2e210a07619036df06190330d82bff11722218adfebfd79f5e543b4c9ef8b667aa6997f877c8fe1a09eb6a60c06e94186ca8dbdb7d102ad76887cea69504da30d2b68aa538687c706420bc203e1924383668fd18990cd4d69de2b56e46903c06c6a71da4721809feca3b0d04e221fb8eaf71f4e2994ce535b04eed2b0a577ad5e75021f63959b9266d62cf4315bd5ab41e3834da246ef2290a558959d98938085a8f91b109e00db8ec32c0f9146da8915e0e5c6022ee09754cd5422c01cdfdea35e30652004aa4b143861c35f781d1ea211b7155cbc55524d1a0e1d23de3059d2c360a41287fc732015b12b07ed8ba0b4652e857f92262778ec8cf3105031213c0b3c6f2360189bb5c96eb024d2fc1734b3c2805fad176698e522538c93d4b13e13ca9766b9172e5774f69f8fc9719c4a9a305f7af090992293081f85e019d3f1f1a7f88213bde85936ce08b83d675dfc4786d14f3a5aa64d096a256be3ceca9b7951e104523b8b61230a2fd1e87af946a40b2d31454f680c60014e50a07bdf830cfea0d96e7beba68a0bd6f1f1dbfd77f5f6e1062a5fb9cf92ea3511540462cf3203e395cd84c58082c414415984a0f9cf567ef17da0d70b76cb1100ade8f9c71c674586749fb647b378c393e9679a3fc46691911cc5e3f094750a2b6e84294cecfe3dc9569b3d56f962456ec543140a6b682ecf7c816b9d74f693e2ba3dfbb6f945a59a0533a50c0bda7334bf54a3b73c563183fa6e26d69e32a2f51dce226e7b4af1b35c0b5766ebf4c33c06e3bc2c35af04d33fc75451a7d7d3b86cda7477d5145a7b537320d2e1562ff4d2951724effd1212e934b7680c8361fc0b3b627f04a9f203d4af2265b777c06e3ee6394d00fa56922616225fa1eab2f2f781d2ed7f4845488fc50f262a2a0e4482e78bbf21816d3180f64ceac64a537b565a58b6e2e51b35087000e1888a772506f02735fd8f0a5222f0c885677edd4ac7f25a90ecb061554aa82b599f27a193af50147b208a31cb0294048c598292e82c052596e11c6f6dfa97e52f77844c3ea9f4c2445bca5624fa04c674ead56d88f089e61333d970b238be0c7da757be14518993912ea0634e54eccd54b44b1041946207f6fb18223443a21e2ce16790b43f83306e34ff2cf56d91acd88e0be6dd94dc1af5b838f8e939367265e139b79490b98f809e4671220e1306d7b18b62759b44ff744abff4ca29ed8a121aa2333c906325a2a48062e98322719c9d33b22929e314fa4d8d992094201e572a26c5a295dd515a8ff036f7c80577dc91885dd32a40cc4117415e85b943d94e71687e0946b6290e9a02232171583327fd10c0ff07d43a100bc72c6bb1085de450e522506c68ae974fae5e29abea2aa0a60bd38a85196a45892d0a9428a3bab080e25780494dc9cd2d7feba87d4eefe0dd05453a4132f502335c5965cd9cb3c8f8ba79d0e173a64ecd97381de52ad9e912d15049bb6c46e8a83811920f14709f171b207943662dc444491f42c06278f1de40d3ab44be1b99ffec1c4a2a91cf3dd33fddc421c59835a59771a48aa8afb9bdc73b32c2e4a2bbae96b6b1258feed46cd53fcd6be99c628bf1e8aa5bd457069a46153bd6733ac81508810585c6b82b71e5af77057fd37c9ab7dca0bef89eec0111bc44ac38ced77c271ce90dfb0f1d53b12110bf21a2b35d6d08fb63ba323f4b9f2b23afffe7c03d87761b5624f7d1d98780256803b42c4f69cce54b86a47e61d2a51b3f51c5c2fa2ff63b7b7608fbc4388d0b20189992ba44fe8149360c7849e3aa1fc39c35a8db06b8838fc8be609c51119cd7503beb7b98360663bfe15aa4a5c67e15cdf8924703835829f0a2d2ef4c618cb002eb8304a2aa4e9a2f784551db4ed6fe5f00a95ff9daa1820f894a8c89275a7aa8d050f63e248dac176da62173d79a7b39e76932425ed23294c32f9dec3baabc7d4171bf0a7bdbac6e69c1452759d9da5cb224c9ad949c36c898d896655326da0a45ae87567c533445f7a96d1838a6be6cc34c4160b2a1f3bcb151292336e58c92246980c135717638458f6308c16f6cd32997e6824df1e6522c2c7434f0b662231ecf493050157b408956a7adcbda66d7defccc6639209fcd34c62b0d51918426f6e1796e91eff476f67ca4726a29153c3a1a9d1e361888925b10cabdddac102c7d4b17726383b056a4d203be3c12a3773e86dbccde2ae6062a2755d2b10fc4811d896f8b4032320f2806bc39cbed193c47479268ce8c1854a918d17109c5a9240b44c570a6ebbb42acf18e7c5d6fa4fc4a1ebb26add0057fe604b8fec57b201af65c54e2aab2c89e08b5ee2845362e1a6d9db61759f108a7fc9696060544fa78d411462be9c8d5ea3cc93b11791797c2dd8e7085346bbee6dfa3204a440e297c56b3a88d51820379a7baa6ba5dea245d05bd5d66a5f703b21a4ad8fd264f4a4f4fa49bf2a5304f884fae905400ad0abaea7804b81721fa77cec627afa83e6f8dc402846e51915ab4625343836a2a6a7a69d79d5c64e5cd067e465d1f5ca2de3e36c33dc4692c6a48346157fec7e6983a403226858d8dd5a34e8b8047e509455bd312ad0f0e75f7b668d7eba3384acc0afdf08e3d2cd45c0e0ad7ad036a8c49733a5f2907eaa0b3950c28689ea6fec32adf6a5840181b14451ecbc9755103ea06d7c2b6f6087728c2747deb5771f1db369bf57bebf0c122386a4463b41b8622e49a45231e7c131ca3c2e410c1a892f0293724d1c0ce31c747f6a1884dfb4e49fe618808d482f0a454717fbe89f27527d61d896299ac0321db96b4f9cda38e90faf69623bc7711a62789bf050666860ecba3ccf5e4ed209e301ed2e0c07288716770d8df94a0cacd658d9f50457eab876bb651e8019763ce4d55e62ec2f81db537909993a0a0c488265c1ca778a145b0dd806688f6345a1e7a9c81f2f8c1216246ceed4cd860629d339e8fe0722cd8505aabe98ad1eae4a1de19e7e3a870270f328e7a57502b3c877174177e6ba42c58a46d1c6df9c872a1c711b52bb5c1fc4c47498d0f38615bba49854db097df0de171d449bb7984521b046382cffccedbc953a91c0d9993b8e39a8d3b8ceb1618d67fbe9a802c44007b06b7a793d96679d1e0299ec0ac8703f4d21d10585fbb66078893f241d7153297a6c1b32eaebe2f940e8c2a9550ebefeaf419dee242af00a68206971d39435105882d60e34263e1f6d9d82ec8374361f8471a2c21ca4010e644bba0d60aee9c1278352f6d1d271215e134737ecd5c49ff744737411b3d750ecf13014cb5eb8b1075718d1bc8e4af14582cc16c3621f5b07dd73169d20a697d47f43f7a7bd02a58fc409df722fda4e1a4b08ecb3336aea553071ccfbf9b734ed8ed0549b9cf524c5a76529d99b994fe58f55f1c28dfd42f7ad3a30bd780e916bf9aca5173c2c0be606b098ff7fb8ec4fae1f1c2ef840c8a2d169b2fe2dc85ccd985ff194f554495c6d3f6ce3ec1f8663d8d9a4b235ff757090bcef500acc0eb48fd72ee41ebae4896004dbe761de9977b4cfe7faa0f2a7c9b5532c3cd4ef12cc129eb8ffadf9876c57c433b506175fadf075fd01a7b4d5a800d6a473583be0abbb26a5a67cebee17d26d55235ec047d124e4fc5f0ac7d802d67154f4433541d31e0c1c78b9dbf48ed0796a6febaf9ca4e3f136d17d67bcfeb599b1332f3e80da0594d7c5ef47e7d4b11d810336e5812d678231c3af815b140e055cf3466e9741ae28903bad95d134fe64ea3b5c8793061c82dd7f06e6975b2684424dca0ca4b9a3a439cba5ee26c278083edf95b12084aca76226f276439cf640bc086db55950a462f1ed8d2036308675aa9ca1ddad0ac81748a35d228b5244c1a3c472decacea51916c4bb77ed9ca80465e0af2e8ba5f470bd6ff94a62589e3407851056cf5230bdd4e991e4e69d352b5949081d690f7b2212323356d66bfa3e399bd6bc0d8c0ffabb28a2c262bf2c9176f894dca2c28d9aa438ecca53d994caba574cd259765dbf1207d13b56fca29b37b255480b2927154687216c11294c730f9143a669798960b531a5bcd6ca459a6d2774c9f4099ba0f9b826e3ce8b3441620302f476f3dc61bd614fae84a37882e5940eab0aeb20a34a3e5646b38c8cd08206b49cdcac8131a4b43bc5f6e21bcead8d5106dbc1faf94cb3c215498b22cc64a58a620efd51b15a684540699850a177ef1b950192ccd9d51f70896e0819a9bcd2e77d29b076654e0b1e92ccfb6ecd51ec5f6adb547f76d8de078cca72a20dc12d7f3385341603f7d9e6f9eede131d50d67bb5489210057e83016e41d21fc80599a7ecf37b6046e0fc4cae4ea549346204189f6184e38970461e6c25d0c9e2f5eb1a2b3ca08064ca3fd015fda4926673866469ab99a4ffbca9dbc2d3e7dab81ab855a833cd5b0a4ab9d71db00e1aa1b0d36a015a61e01a783d3806e6263f9ccf74e8d807a9d15a29358d51c73f8f7409b7d659616702944235d26a7b053cb9a8df5ebf69d59daf59937a273d311eb11977668c7b3d8bb846c85cc99765189155913fe07ead68b719db43da4bbe2e512c2579a18d5acf9131d179bfc4de1bbe53b2bd19f9fb905da7de87245f2ace8b7169256a3a8d5693d10603d6e0c7da90041bc073c8a65689b07c53d7e18c15c45b557d109ece0c47c2289f954b3cb8e55462d4c9cd03e1547698782774c6fee6354f355bc8a810e8d96285c7c8fe349eb218aab59e1031d9db53e3ba549f19bbb03d925586ff98b4378483bbb9d74897a0d17688eff43a43b42536d407a1c858eb1faca0ed198d27dcba98cea6b5d0384f1701bb60112905a8ddfdf83d048d59f8ff16865621e96625eb14dfc3216f374b3986770857b7cefcfa5042e0c7da702b533975cf3804695a902fa214808fa2103f87cbc84d17c380a000f7c4e3f6a6f0754261ef139ea23c8f523cb03dd6c35fb41cfa264550b6584f87b1319649bf4ddbf3a4ff6a112eac3f93b5d203428ea1758a4ec41462cb1400640837ffd00d1ce336885d882a6258116c1830871125abccfd520c5158842c1881a6561b4cad538ae0c8a17c53110fbd796568739ccb1ab018e403a64c428457f28f0229307cf4bec1e2c0b8755d3818a3f2a94cea94a080e01a90574b13cde921679b06fcaa9491afafabfb1a180b98e47cdb96fb91c7ad2cc890ba004c3ea2964c9a22905c3e4001cc5133132543dfc267c46a947c8a12a3e74a2b4ff0fddaa31305b9aa792b45439d75c157e56ea0b1d1eaa18d57b9e45b12ceef115e8ee6e5f02b069c73d2f627acf423c5e03976e53e990c12be6b081cd5700ebc998201da3e81fb5a3962b759ef5c8819486d33f5d8a344f2d410845793e97425c3173fe890fe52822eac71dfc3a3bc5c82d1b42115075833274f0a1adc04164d45a95f2a4d63e714dfdc4bd01d3cbf9a37840ed238363e76730890e4fd02da8e9b8617ea9e4a3bc6171f0804c01052d9dd896f7564bd0178648008ce90b8ba42ee0666ca7ae23692b9ab82c1255fa80fca01188ae181a5ec5cfae2848f4905d04e24cfa946d74d052494e69e39400714fcf9f75d8603c40fe8a955775162f0ee04ce9327ef816bd9510ea54a35ec8f860fab7bfa926ed6a0a7bae6fd5509ce61cc2592302d73e7e8a598b9e870038b912bd8892e0fbbaa16a52d187e13b9be83416a01163d99581a7076bbce20a652caed4ba77a442560b390c1f756d70b77ba1aefad1aaa61f8c7b05713f0ac502cf9c66b5dc5c6560f50727b563053c71507ad429520c36ae9cbb7485694469a29a792aeb2e53d1ec1a789d0040c182013a4b0ac0c6db01b002a07598046e5cfa7537cbdfbe99549b65013435ee590060e6810500c00a41206ca4f5c915002acba6abf9bba27005f4713d5600926a465e081e983409ae0200ec65719a600c007a116196713200f7e24311bb09290519c05a1acc009c11f10283386600d307e564d68db7defb5ee06c21cf2cec1d0f57b481d56cc59a4c509d8a87063e1dadfa958c885e9945152e9052eeeed44cf2d80c73957b8dbb266e00530d4b9578df454a4698898068da0f8aba4d21aaed2450af11b48c979449e5c6cf0e204134673d006bc00ffe00aae9ed9ad09f84eea27d7cd8836d0a48691315e5ad5258150fb4e0cc67b8caa023190a1154068dd664f188361c5132211e310201b130027c3b8a102d1801d29c0463c06a998d1701e8cab1e2fa31f2a52c7de2937d6cb51effe2e9f6eb90c564fbfa14b23bbe958b946700d0015ef3acbd99343e4f7700da59251f606db31f90748cbdfe3c234eb14db6e6433f2f27dbb2e04ac0028f27744aad2112a15fe6e24530ff76b4ad6d48f79362354fa0b2e41342ea41e1929def1fa826a67c2083fb51c7bd010ce792b675d58c85ee261def17bf806a6b5b2208395b992bc73f5944e67ada6729dd2385b122ef38d07c27e4b718c5b91c7d5e0eb08ada8bf6b3e8570f2fbe6ad9be977a6b5db3b05be189a727516b29d08f3663d91ff20666fe004c43b2fd2859a54d3f12efb6b7802ff703223727a770ca3e83787ab9a8468d572c8721ebf2cb79850aa68c0001a89bd9c325eee48d899783bfa0801e88d3157be34397551fd4b8bab235a422c18e41806a33e9cc16ee5afaf57c092c9778c80a335f93fa79139f15be4c4831e7cf4dd5fefc7512aa3c4a954e8641007011fa5c8704e16adc58190f2f4d7884bcf1474df1e469e51890f08716e99da48116080228f381c44bb972816c510a792481b6821c7794435056ea8bd3be312951ad779f7642caa00f03ebc3e73e0ae0490294483823b7f53885a5419b486e06713aaca92f88793eeb318f76c01e28300350daf0d8cf6e0b0602daf3b1cfe9e0c88c0ff75f9012b8be44be6636f70829240f5b183033f1c7a2dfdc1d99fb00294066e720f3208d108004f4687312898dd27a79351f22915b4edf7ae63808af832a0f747c808abcdbd232bbeb1c121ee0e03df323a68e9b3efb011716c052884f50163a83e685120de0fd6300b33af131cf0c01a5b7c260364300aab2b44716481c02f87a9127737022dc8934ba8b431a7f4a0a451768052db2a79cd0be3794169e615a1a73a7063f6c05c133b018b1c6b140534f45bdde56e55cc399bd3ca9400066e2f4fc6b87c9b1fc6f33807be639d20a231a13ff7804a3a97c3b786ad8cad6c417332dda796f5d7802aaef74237867592b0a3d035f89e28e3b4f42f3ec967029e6746782ee97954f91980a3615245712172983106070f4136181bba1e5b26dd1891e9ff8a87003a7a08e0264dfc9acb493eadacbab90d3597d272312f4ef195c9a85041a7c61570a0696f9761ab6573636cd451e06624ae281755e65a028d474f72b1e6bc87ffbc2e90bd0a59a6c0f290ca49d8d5127e7e99dac7278761cacaac8660f2e0410394c02c45ffa0ef5cb6f26db28144a45977622ae21016d3ffb24bac0b133527a0e5c256c6c2e70e969f401a1ae5c70ab59d1c9526744a124882338da93dac78ab7432d2b4da56e1910fe26019e4a32fc99c5e5525b02172e42cf453c3633e1307d4838f6d9e43128845ba51003fbd830d27479c20b9a7f16cd46b85dba7c8d4a02bf60b06e3ed4abd28bd69493982af907d5882ee58a3411b8012ad6feb8324d840795aea1eab8894006177ba0c8d142cdcca2aa68f7bb3a3b3b598f47233286447cffee230dfa0174c6de58d7b296cca1951da25e9069706767cf74c1a8c268478c7739a226243911b9d4246f25c981f87792c543f9625cd85e2c2c35686783dc86efc8c41d84b2c8ab7b3c3b7bb8992a34a35f0a3355dd38b6878e50e115453f6a470b860114bcbf292c529c43a05cc146285e7da39d6e9e3e19a76b76768f510191058a3af7aec0d7c40bc5ceaeb715ccd906ec2d25e8dc742d82c72f91c0063a7be578b848fcdb78c54528db7e958c6d09f3bb1e70bb45d9be3c92b875296cfb73bf6de7b1e0998fcf94a8deb1ff8a3c5af7443b120034c5d6d4a632c96e9f00280a17bfcc68e7f5a47e59cf26e8d8e88cda4365b0f8df03918216b277a0ddeb6f1d9b8b8fbea88ca0332b94734f07d52dec6e4804c121a6a0b01958a4e0e2a8da71a6e24bbfa88253bd0c9211fca7a01aaf70e1a5707657a0203a574516376040b0c1020e35309cf84846e285e3eb9a02f2bc15a0dcc4d0c85c02b334ba926f70e4e2a6604a67b0d7dcd8941ffb306f0a72a15a7ef56c0f32ddd17539f48feac5c49ad8895f7a991813cabcb07756b1ca59e9904e9a8cad221588521b5a7f06e81db87e379ea7350769ef8ec0c6ba67a8ac80aaf3fd3700a040fcf7bd3f7e8d484d1405565b0d881ff28012eef80537240b3302424289e924c0624114191dbcd87a3842e61154646c1ffb515e640134830e476fc5ea58a6ae6ab35e241f28c52eaaacac61e36a6b994dae83720c51afdbd82127fbbd9172b43ee1cdebc4e7310c1257500bcd13b17a94a5ec250c10fa7f20b7e568d40bf144b599a2e612db80be4f1f8fc0fb7ae46aaac3d2c3f98ffb34de87dba30af50f6ac267390350f30bb202ccf84e826b7ae5726d834d38b23e3de1a54045515b23cfbfa003abedd19151610d57e52daeb08785eb6006d7f9ec2b219fd9dd407cc71b7e3b3911fe32f9a0929fa1d4712cba37015d8d6b28a508f4592b766b115528609fc776b14b854fb8240a480cd62d43ff3bb64d703918fce296b4f260380df1adf05d69ee36be5f76379d0db7fb82e608256e47c2a563692f89714e71d5bec58006529a55df4acb2f1d168b53bc072f8e1907531a251f4cf44181dcea2cad80505c36a951610f910dc2e504f4f0f7cb1460631f6708b4c5c16a141361c616bcb8b230f225c41681c9e266ffa7710589491ce7450153309d8708bcd0a48a46e902ff34fb9c18bbea6d9f7e0afe66b8e12cbe92cfb879c5c03c484306ea364470af17d5dd602bcb0070ab3607333a9a64ea8cde5a0e3728c334136bf5833997c1ff0a7fc20017bfb3a24275fbac4163f0371fc5facc17a843701128a9d0159f7bf781fd3d232c83610162da064f3742987994899499e2bba9d34231ca990fbbaa92137593f4f19e68bea9a9928a3d5efb4a12f3ca0705d718b8ba1e583d6f02c8f62639830d8e8aa0d5915315fdf091a4d0b9a2494aaff4d68de80a0ed44dba87e90d9cc5c7102e16c9734327e420cf760694829d8cbb361e7c54a8bec368fd56e8ef70eeccc0aae1f171c8772814bde09c41def848a11cc8a9304ceade95762c3b2d6e465e19c4a1da2e4d019e597f04ad3dd43ba40c77a324c5e3dca074c5da94805f7b9c536aa7429d712c293cd7a42057062a45034eaeacf71ecbbca2016a0b84dd042dc2221807db41301145a6d2570bffb7f7af6460792d85ab43fd63b5fed89a6f02fdce8b93f06c31a9035a9e6e0605240af61cce62a62d9573a4979b135a451a74df096e728b3403b00bd51ddf61d9995009d94406b7387fc7358dad610444a99f327304d65adf07d8a00d42a7e2f8224dfe691080821c8322b1b3929ae84e4adda4f1670298ff4a09342a09c13d9c6c25be6b0e7d7002fc994d4c95f5aff1950ca0c0791a9c02a04595eda0c6413601b50c6d1784784152e94c1584fe29feb1ea8dbd58e887a9c4e92f03d95ccfc507029a4dab49fecc5281d884ca50be9fe1341c88cb7aadbd75394f6444fb4677fa622b0aa3fcda9f21d9846fc2b1738243485eb0e8a2922918a7b5f4ccab2b8a0f6f1df1855afdaffc75f2be3f0fb543296fb98f3305eb1acf23daa29d5fe76629ecafb11302caba7cc55e8e3ec2b8c057efc4315f7bc29e1c7ed3da3677322c2e33235812f4d665296918fa83e37c966fb3cba76db89933efafe0407c4ee5a850d08637273b2cb593d61220b0a0c0e8cc23cf9302b05601f2c9176b1016cfe7726fbeb10f8ff68bbedf9612946df84f7f48b7a78abbaf085f32e4f4cd72527ce7d82000d59d607edbf35fa4a205f3c4479f7c4025bed8652eec69d4ea5b321e68ec47fe245a9849abbf5ac74b592198825ad269b8f12b31b6a9cbcc63dbb8b882116c179dc56c3bd289c5ca8d17b508e0581508ce4017aeb2b63e57f816caa1db9bbf5b8f3865886eaf1a0e47ca62dbb39d1393bb8dfe80fb669934b1c0847a051730c7ca1ea2e18e7e30fa3df710459a2cdd9046a0f8b6cc8b1e7a756aaf2f1db8d685e2d57e09e065ea25be7753ac8144fcc1b7241464a06bcb390f2fb60cb09f834c22bb55166411e2a1e02fd4adc5f6e0107fe0b5cf2c9b576c136d863b6e1d8dce8d06e0106ce16fc055bdbec739b1d52639b1c879129ae2654d8d4010f187de54be5c001c6ae20463f1e1cc6f25dd89b864acdd24ea4aad2b8511181e7b17e3d7eae3380d44a344a317258210961f152b35021f8d1d8af1b0fb0b26219cfb7994751e430a65b0d58958e02020a26cdd4535ca2f059cb91ad9e3f7c0b2486e077791a36380950b9228aba7b1c4b0349e2f7d918a8706c66f3c2d1be5957eec44255261d31c98e89eadd09cd1b2a315622705f9d43ebd3f7ba109c9e37d205ea09f9a21029900256549b48d85eda96075b54346040ef1929410cbbc9d77f6fef48ddbc4e363826c9ec07b0b74d34074c617a00424ab5f268aee9f97a145fdfb021eddfc12034fbaa4e51a82add3367e68b8ea8240f957b6cf0f9110b38ba79cc2e344a2ee0aac195b7447df42905eba39174a350ab6c8bf3811514bb9a927815198e9d1433c7840d20f148756a0dabb7b6e55cc1f8006d4ae04bad2e223513f6398db767933def32eaff6a51bc62d0a5d021a757a9c5ce0fc648f067117878c7a985a7327d497af099df34cf69d78415fa460c52e6209f8d03d55e42c2fcc72f64177dc0ce0dc748faec12907d0a2d3af8557a0046eecfc579a04f8eeebd55f7c9885b993677d4d6b56d68ddfe71fa804802c6db16035964aa22edb6af5820a2d8245d1a6fe11a7d3c5d950e5c3a4bf9b5b2455a6edca61b9b92ae56fdde80a00ad62e8e171279f81879420d1712a2ec8d3f8a0d11c91af2472fe4e16a25b158cf8fb28524925fce6d5a849bd0ab7c2380e12b5b1b9bfca5139b33341eca80a6747e25eeca2e3e5324e7ae2184f3fae59deff23c48e775cc28913d91287f9192d1d24588d1aaf6126aef4cc83aa2b90303a8d7c3c96fd51a82c0834892113ae442c059c935387e53416b001e35213c8fc51a87627b43cb66727f96db6f3e8f97b134274763cbf22eab0bcf6e014000fb7c4c71a1e6d7076904120e2ede5c5625db6309018d87355b8da3bd0934c3ac71e07050aef06f7dc8ccb30838d19599c7eebc2f722c9080341cccb8da98343ea41fe933fae8147424bf42ec3beac70eb9ffd9888bd46bc548ee67cafb7c58e606e1d39cb8945fcc33b2df9413894476715f1fc9ad89449ee79a1a4186d3f299173f1dbe332f14f2d4c13930c36f718ecec4d5cb85e4229b212f183a23adbc01f94e9a5f26ee5db623adb0c0bda823a164e979b600ae1bb9184326115263a7ffe6d1a0eff1ec49460464529ae3cc2ec236b5013493f188df08310efea02c35f83a4ca0ef9b70b94c8a91c34962e51779b913f2670edd8f5c765ee3dda9304b1563b3ca6e412fac0a8da5a47e6909d8bbdcb2a9a50f0603c9ba299a9d5627b8a4d52f8496afca626d2263d06ee07227eb0feebfb4cdce3448fd35608c10e30df328cacf0290c391e4d21a7effdf5b01050ad30cf0bc7b8f97616c0b8c72dbdd2a771801f0258e9f09e39ee9323245e44ce757943796f47b82f83df2d28ff45089de8580e6184104296c60b0967b5acadf2ac20c49e5a60dc37df8edb37b17776465d4965d65112ba29210abf02cc2a4944eff9c384d00d5ec7515127ec332c1e80b242f58d14f68000a520ab4e5f5ed234f897d86592b8b0170a7db9cbf8c87945d3376a91e366b5785628397b19fea4a10a68c19333d9e6e85d97cacbbdf79fabfde076c2f0b736e09e864dbc52190f9556c1b93012aea42811631127b1c0af0e73077e5cba25c5c6fa4485a0f3341e162aca85201d774d86be45b8e6b6b734f945c86346960bac57634de936e5f2361c456ae27646c89e4aa5949e09a8b6ee26700ca87a0130c5011058c404707824e7af01132329de37f67b6cd1c7975857053bc534e20734a34ea133a8627e6f6e2699238a166a23911b0486a0da730613ce67d830da8319a08f6c88629471ab6129880cd01af46c6c990f3ca5309bb852790ff556c1cf502fd3523c762e591fe35edd4e91caf0dea8aec6c988dbd7e50b98294d6cd1c3aaf9057278566c841215407af51d11489d01933de5f1fdd43281f72fbd206ea3a94077505b661f26284d8546136fd17da3a2875d862eb31fce678d516e746e77141d73e092960806948d6ddea6b5855472ba03c7e0a9d92bbccab647b6b6b297a059ea4d5754f17e50c753b66a7025cdc1237b2a06f68545117460710644f9392578f896ce332a3a74152c257c56a6f8581a0bac1e2033983c6ca22281e795ee89806b9fdcd1ea071d5b3cb681becfb21a568c582f2f1d1eba87537459190a1723561a17848ce7f83c72558e81d7dcf35436e64af605898befe2b89eddf9bba60501ca17822c9fc57ce1cdd47df2330e00177d80ab4e2ff8ef9ade9f93aa8eb42a93a66c845dcb7e34428c7e0b4f5940607280ca36b3261000b49732e01da761df11934a130c97f0d567163953a601d15f3103095fcd6c8dfa73b62a31b3609927db778b7937ffc60b30d9c32c16dbc7e10c632bb251b943d35739161fcc76daad8d0861b1660520ea199f54c004b848423d8e0176d3fc7c0838e416dab1ce8239d4fa0d7d23fbc5d4bbaf4014274453ae28e413df0bb5c9cf6c17d29c8f2da6693e022b1b6557206d3a12c10905dea9606f355a8465cf01f545824ccc23bf69db1ce59322cc4553b6aa903c17395aeab0ced0b86cb3718ba22345d1a20c6f7ce30d318b747539a0548b4a90338dcd357a513385a6cd8f868e7eb1f60a6e3228b5ae305e156dfd65930e87acd1058da74e49b9ffb0e22eee8697cc16cba6496bab49e5b69016a88e1bb1aa1867ee45f56f9309171e24bc4ffe359e75c23ab135c568b37ce6a351702d4652c9efafe86842a3d8cbe33b237c47bd358acedce18a4bdd06c0fa0f0331c20130d4bea1551e399ec5f6e074eb12abb4644b73ee6a252164e37e83cecac4c20f7e4809cfcd55ecbdfe62fe9f7436b83ca04cb77fe0429400571ef80cb9ec0b5d82d075518e2e7534ebd017034f838ec406e18cea4283f4a9e6378d662a20a704188a97e861ef27713061652644a7bc61195f31670c20e85ed19ea219fce8b59e916e9d9ad67a854fb4f4bb2687cdf92d2c2012feae325ddea80c2e4eb971c2eb65d339adef8f498b146eba0fd00c1272f8303f42ca38ddd783976192d3440e8ea69b4156df776df5be6fe1812d7bbcd1b16581c331ffb33858dae9b8c1d7106ac70f3c78204ee264769a570748bff10ce05a249487b5f7a68485680e538e9062267081603d2e2ff897ea044330b279d2d1688888724983574d7582264be846759ecab87530f958a725bb6b05948a83a7691b621f629778d4af3868e33f53574b6bcac99e058d4c2f35a4c0a2d35843f9fbf49de0ff74d1db017135aa1ecab4e43ec9514ec5469363e60548886de68f7cfb1d280b6b484ac269a3714a713add392af97c662e1399c9b44c665a66392deb95f148a14da7321769e98432718d8dc157e1569ce5402bf6ab714fd47cc95b13c52eb8a83d6ca0bf2742a3f4c5b1a219ed3d0aff48e5265c0982a406deba5e8a852311301d70c57c9d3c802a11461c956d9abf53ef0f4a0c0035498817d6a790768bc91d94e4e3564e3baa8e6219715f910572f01e211bb07f344581aad8502f2e0d4d46c0dcaa0a705c9b92560b2b4ac36ede4db828e31ad39cec62612c832ed2e69523b3ee39005fadc846b7f42c63d0827699457ac1680cf4b7eaef88893c2bea13c1dece485398dab76f6e31e41743395e5d344a1483ddba5887bce412b9ec51c99a1dd2b473a98d415dfbfbb07472ca2525159d4a03fe13baec947edf480dbaa07189b53435901aa3f65919d2a5b3cb699f9782b9bd72223c29be0a04f391d6717796684384730d22dd64f5d2b639b962293ba0f39659a6642a533397894ca4dd9942b4da1818e4985030da05683ff95af1bf6d4f5d486bee5e7df3e69152440b7841f8b8b13740d1be262542838eaf2ff2fc183d5f84cce5e390ec2c0b9ccadb71528448bac7faace418524baa5f34036e593bf705c456b886207f57fe6176a083226a91aaa4fdcd279a9e63aba57d99252922d1d749862794fdfab01b146945710404c1ae919eed14c3fd99a1e1f9d1e7a2c1657d7011e0ec9b119d6fc2b13959849b475928a6a9cf4889fd2f7a69fa869b126ad7df2f30673d22f7eb47a7aa6f0a8fdc1f5969f71296431e267cf1d3714b3f60cd31d833809e4dde4b6f1d47ebda1ebdfa011faff6b9b9494c2e00ae64f0cae749e71fcbf7cf30e422a10b960a63c9d9b532569114305a81e70090c94ce75232028a12389236fc34927a38d10644309f45828663a16a4a3004c3fdb0504003904d1a3e895698dfe1ab94171ed29f88065c45f894faa64a4aadfdd03e594e65aebfb12b427328e4d7e21d59d2745dfc1980c67f30e0bdb71504ec537a14ce010d6460ac3dbc2eb96f25fd04cd237f8eb94931c9e0afd45b99ffda22205e3f5c8d2e8d0ae199ac8abc189170b3a41897ccdc0acab9749b1e00e2b5682312175ca52a8623c03f6842b34a4dcb71ea65c39871f614219f8f6bdd0f366fcfb41572622e742fcee695717ee5f2cb17d24e1965b74a60efcc21ae9a9d3fb8a90b5335f07241c661aebbd5bb98052c6bd6b3ee7694c4b3c0380529794e35e59295565660bb540dba89bc1be5c16b59f187fb7aafd8de5d1fdc1dd1aafbda29d089a872bfdc78b2e4846a0a8d7e55be5db3a80d1f2632400c8ca5d2030ef34005e2bffb01bc0e5ca942a9cd10cbb8733f028f77b0f8b08501aeeec57abeffd4088b6e330526df5625447f837078436fcb45732f7b8f83afebb4f679ee808156922d8328efde1b9ae1cffb0e4bf178ef9409cd53faccd1c03ae7eb31beb2401d8ad193b42e4ba6f379b80bcce88b8a945f61549dc585f1a4318d0ff801b285edc0b6b59fd057db0b7b9cd63f3f4a3b3b7f6372d89ed26072c3a8396db0fde42740c8a508fbb39e9294b048fb0f3097e150e69b81646278e35b649197401331fdc21acc20f71f4945110cbefc1ae87f8bf1370e8601c3494f95c235b8b94220f388d2955734a4f2366f6cec5a304b601cf92e5fab2484beb53514434544c9f6868b7a63f1b6a1062869633df84e44830c2f3b3e7c374d6a18ddeddb814ed437b467da0a3e929e08c2e75f3e765fe97d6a8b5a937d58a0117a372f676893da96e98186b5ee87db70412dc1f4332b22bd50504c3e00c8e537f6872ee9ef26d214f878e64d8eec0bbf46a12f38c215d14d324abc287e7000703c34a3581492297e2b7d1ddd10328c0bab5d27f5149dfb057fddf01bab285e681eee42bd0479d9a41db6ddfee42a30d093ba1668e6be230028fdb043860eacfb0db868869237ccbc68205b0f77b3d6d5f2db0a0435040fd0baed3e8b17f576704305917b5697c64af3c5c268def48682648ba01db87a4932e989787fd29bea4b86cce8a0e7b9434cb1772846997c0c8ffb4064ad9eae3a2302b7c727435378b0eadc8e58df15a151f472e4acf3cd212a9a96dfd5ea300fd39b2cd700ab683e382684ca4e2378d4f6cfe72ef9cdb60fbdf1e65110c080499936737c92ace15b36bddca66990cff8b848803dc4691595a8dfcb4bf5fefeaa2fcb7d646e14a9f69055372d10901ca2b18439e54dba6faa11a7e8198fe23d85d2f8e7b520163b46946111dfdda1b7130edf52a4b6b0a28b223d379da071604738de485e8e1b3d96635c4d93ed9cccf6f747c012be2437d4c62c04310222d0d9b0dc7d03a30d8ac0b8ba575f29aefa6ef564ea21627a38aa83d606a592d8488e63f6f3687b0221e69553098e9672a954f76e8684ea2fb1d058729a49e7ae2849b7c54294f5ba7b0649b9f1c18bc80e592fdc92a66e8e38bfbe3bb6212b5039ca2144471b7b2a7760071c1b0528ec402930fbaf3be91219670ff4c3d7c5ca80ad38db84d0e0a59403e49772bf07615950dff67afd8ca9107d8b2d42c5b88b29365e1fbba93621391ba9f1545112729ab226c4fbec1e7ac76eb3acaf9502a900d2842a40c078e914fccb4ee822ad2a67fc715a46ef2894b0320a8b933cc6863e9e5f0599f34e5b14aac69c6a0a24673c58f9a92bc2662e7aac556ad1f51220b6f46d97ec7b8b433ce1176ae0e528a5a4bb71e5c56fef70430ea8b0dae5532021bc4be924f732d64384e4ee8cbc000e91d5a940ddbf898d7b03056b11de2e4b1d3c02b9cdd1922190f473d2e63205f639d054aabea8d438d56b098edf585415dc24803f9131852c5d560b758425d13188719baee37578507722f236d7385b1eef8cecabcea03d74391cf769a48394de1948b1712fc5c8a2943a030fdc01dd7075fe2ef00404c144de6f36740bf69397bcfdd67d46f60ae72d8d56706402be95205f053a182b0c7a0035e5c32771682b0e165c5a5a8b3c74b16384b674520f629d8f2237ac94dde22c4a8d589df953004558cc52db04d1323116488617ee8ed33237c50131180f10d123de14142c523e4f8134e4d9921ed84d9dcefc14d172647361d2fe73f248f64f06a4532100da0e20ceb3a0f37b68316ce95cf81ef6eb6531fd722fa0069d378a980f24fd6c7c1fc761bc661b5dd553c6796b89e423a310faa673647a9bc7922be4ebcb8f6afc09e47fb0f40c51c2fe1daaad6f983af73906190ca7ce618e292a79f5c7d7585429be83bd7263fd863d3e2c99c595dc89b6cd65464dbddcc24faf84497c415045d6097f2657723275e571ff3ef04c6e788d527166c8b6b5a9102c95e6492b01daef7878624d41554f4cc52b3b4a7d543ff259b679f4a9d44cc3011916e417e0bb648bf7abb753b59d35b04bbc87a644abb8225e6561223d7d72594ef223f0bae8af3430eae49ee46f99900a4da3a08a482ab94a112298bfcb17b40923f80a619114b0220747dea903e5f56ffc1f729a69de42572521ee131f00b12cd8e46351344ea35f07e79810f7c62c166e984b915f0099dba5976df7bc429e4f47df9989be166e6a97767343c6971a7c427f381b10c510b0840cc56d75843f38a043bd432a9914caef18054628452a963b222499fe9fcc2db8942d231228e42e4ac7285fbc9b24493f1afccc8b7b8985588e9681885a0699a2b0f05f3d4ba0491749841851130b031442980663fe40aff6d60b2e13b5a19e9e103712021721d01d909463d54e2d203343efde83b7725e60ceafec99d661c128cd1bdc1da60c95931444574cc16810eb8cc1f11ade3a17a3781b0e04d9995c8c263ad3c3365f2b2a77730862d31224c80556cb902ea184662a7386e1263c2ab909024de02a47fa83b0da4c6ac2f991d3106ee72c8880712d36b77d88a29aaa67e4ed8acf0999fc6aec82e26d68ea4df37ec7f8eeb68e11054b8e88bec4ace3284b05734d5f7f4ccb8c2bf5022c60a255085ed77411caae275a3d4aeb2be503d3006e3cb8a8ebc4252e9bf80ccc097addb46e2392f9c801d61990dbc8e03e3d044b7aa2018e0aa2010f18d0ffa787ee273e8b0c17bc506a14bebed6be47db4fd82e0a8f2011fa8e728929ea158f7f80a670bf4af40bb77ac369599e5d5747c6777a89a00c1edbcebe329780a52d473edaa2449c290eb6511371ad1a93b8c4011513ed6309c2389d9ab7a59501443b4b272890262b791d87937043284de338b8b0ea06b0ffd65e8f26089f57510e848c3ec849a46a00856bc1a75fb630c3e5ff4be269c16fbab79584b08bb0e2be133936a312fda2f070ab178a4e2641f03275398d1a3e8380f371fc9fdc495b28a01225f9d1cee11749e6f07270392206f947111bfdfa379bfb06b84ba5984ad41f645cf7d8d95097246629c03ebb444b2e8273bfd071dd7c71042e477d49ad0806e74464830aa7e28f99b93708fb453fb3fc3cbc503fc737565537f0b1da38e7b1727d50bd324c86fdac7efb7e83129db87140bfd97d5bcae3015297b16ebd34234ea7b237ccff24c5bed759e853f78b418008f00e05b9dac0f31872b56e809c4697a394994cfc89b669d7773f36544c56c2689ac067f2ba31a338c701912fd2f6d5040ee974db01e48e67df9186bc0ea01fdcdf4642d0d667eae82620db3e309ecf5d900877e5c805594a48f8f25d14d6c00055d428e6463f2c1d883d4fc97b2cba6f17cd642899803497153dccdd9865e01aecb1589603485156987a26c104c80898008009c81ddaee7f2080000840875c074af9d803581ac808e7a3773e7fdfd79e56eb0625ba675440bcdabe3f84d2e5bc07abaf6dd3976702655619d8cf9f74b6baaafd379227c0e6aa9d761638ceb2b1b056cbf4f9b87727cd44df75176f7841e807962daef8c1906dd508f18a7a8831a6eeec579fe51b581577d88c1b50e095c2d7cef1db6d55a2db3983a58c66d72e0015d017d65d7d8a53a129206145c322ac184dc0c96161ecdff198da65913517f929063321f1f6fcf36dbccec5802be36c4aca3e66cfda9ae4882c8d34f9ed96c1d5af84e5b49eed509a0b1b2af00f95f180462180e173ca39878781a61c7138b5c5e3b93dda504ef8835911c739bf8de31bab1f5fcd0704ccc2f2cf4b8cc2be19581ccb323932798f3e9c94085bd7692ff227e0b14a2a045aebd3b6f7c10a44e55a7e963c3e88a2f4fc4f0b0dc1a091d256ad8544637058532a1f5b68de0da96ca25596e9666814a26d138faec2acc7362ba88388b3a1d76cf8e2285e252c1380866b6484ed6b6c45ff3b084f2602a6d9018987b383522d29a73788093d9b37d78d876c182c14217fdc936d7a0e56b64967e6ff0418f78047ebd0e56b113dae070185dd9508b37047050c2d5760fccf5d41f59d1f9f1064670026aecda9096c66e0d34338a7136c8ae53b6f9cdd3a729603715ba7264e0244d2ba033709022072fcb3e1f172967999ea4553efae854431ed8237d56875fe8cfa00f2c2675e54d7ffb787fb68fa7f145246c1234600776544adc30233bef32c21a69f1763482d4966440c5c29b2a50956085dc9f541011f0758c1a4c729a983d81fdcd6d0a9c07c31efc3d3db1293385ba90c5e8f0630cdb76e79f1d2ee65b67e9d1630e360fdb47825f8d1e6862369fb6d4da84236aa8f440e2063700d4b19fb401ba8d90dc29f9e74c141089b939052d6310cfde4ad06ed9e74742b1dd8a19a3ef362b40de40aa5ef42943d6e001adaf250bb6fed33c052e5d8a2f15c23f0e7f84d8feb9006cc15ec6686a5a0f77febf835dd8155971fbea1f5a861561bb43e4d8d5741dd0f5a9fa818036bbcfb13a45604243ced7a7301cfe532d420f1a2f029a5fbd80f32fd87cd8a8bd645ab75572130e37d1c207a463f6a0049d9d8fda577eea94a1c9b3b300ffc9ae0b6724396653d7652e5aa357177c1d9895bdcd3098651532b84136c86ff0bf2463829dc2a900e4c1a0e23abe67e5850bfcbbc25f714098d12d889ad4e04f1c01228b7e539610dfbb127be3c5b6c497c3e188573e1455d04fb954ba5e00058fbd9eb76bd9de26bd2b49ec9102c6ba7ad652040cb36090dbe788c98c13dd85f78d06667c5b78a3d879887fa0489b95fec69ac674a5d08a13610b049ecef7cc4941139fb5bf378a34a64e5fecce7900980d8a7430b354fd8f4d8db32f65c8c89b0ee656ac5b61efba292582f37b33557234587cb18411db49e8a567784a96b72965fd46242cdc5c12b32b595639a00a4ff6ee95a7e3f6014bea3f0b4f6a97a867c4a5f542f30fba6a5e2cab8dca7b2e38ad1d9e37435d275188b465995302a95d596fff34064d0f337066699b646ff179a7c1bb7076a4d2782b090c5d2e8f5625a05802aaebaf441f30c67175094759f5994c3d390e57959c784a933a29df7064127ea6164cbf08346843e6e2f92de402f4de4e7f55ad41ba2dec57fbd35b4f1d7e8694e63954d169a03d34ec04a0b40897853d06699ab53d90af165400d5d4011925ed650c1f38f5741846de8474fff75653647a2070dd6929bbe1899fc48d1cb8da0077488ce50285a1abd4674ca404233331e3ad3c52b3d34664239026c424ec9e6437442579b13274692665be713c7539b6e77a6be59fca3ab3e07321e060d823ff67585d222127459091a918734ba8741130a72951ffc10a9fff4d990b99775e43fa5d4112cb64954ec820a0588f4eb0227da7151ab9422bdd8f51c5f781bed27c11d11e7cdbdff6c3aa870da2241ed11d7244068f12760b2bdb05c5d00e4bf50b3407bc95cda5013eee5930861aa3668901578bf03a865ce14eb22ac44b29ba54c9812ff7c0067e9c1697151f9e60163fdba4adf8a0333743c1a51077b4bdb9ef4356cec974dea6376e0a5529d0e0cc240bd0c03508953334c23285286c6a301faefa5050dbb1a4d680387901525d54de8866364340902b40de4a2140d2f7e99f57022aabf3bf7fab747840616419766f8e7ba9d9e9ad850de4420f8440ce95b8b09126a352caac3c94412c705d450a41e1f51360f2e5d195175ca9d3101c4bc29082b43ceda6603a74f33a0ac3b3f8307983e300a98fa5805f8487c40faa26b2ec7cf57a4e387782fbac0e9a49a945a2154a1a58ee9429c72ced228ee3c4f15a8c3338fe279537a6628c77f40ad707e6593181a49d1df8f21ee9b0b56a84ed2aa73e9d931eb73db46fb711dbd1ec5c852e6e140ab51cd47caf66631a6a49db7b67fdef685f1150d4beb6409774796f9f42477ca0d578680204b35462be7f48ef6f7e382dca42f9bf6489c612c1c0798475062f08d698a281182a5254e7e04c39b573e758e4585d0bc9f38b5e6520fd1d78e60e2c27290bdf23a039916bb5e61a0a4ae88791cad30da65e7be8d9350d08465266afc48fb1763507813b912f7301d37ac745c6610ae96f741741c6a507319685aafb8b96e02b98931d80b62092a9f636a0b47689ddf0267980f67212a5f0ad964ee3d84203be97bb48caa7d184b53f91f53b4b804ebf93670e379281b41f9429025e7ec4d06b1cbbf23e56829c627774a7b9e04abf3968fff88ee2e1695686e94942c9223a62c061eb4358ae484c7da4315762146b4e08a04949180a4466f05eafac825fdb503b77fbb22dbc360c311a8ffbb85bb3ad136f048b40d6c7debdd4bed26b981765e43a55bd2e73a63a329aaf4884a73e21ac340e2df70d4a5ca7250487ab297b81cadb8e3b1acfd1f6c390e751db1e3c8806433ecc12156a5135bd769ba9ffa52e7736eeff2be7e169dee501693d5b91d8b79139045c95d70026c3ec8cbc31c3a5d310ecd83ac44061d8563819bb8aa1f4e95c9e048da2ce113f2942e04c91b241351d28f9cf6d410970b62eac0546bbfcf1957bd2e6cca62288a99731ea6f559432d8db6bb188a08a85c939cc486c776de3829b5759d1d32e0ec0e2507f9a3e80df6bab903255baf8e12642906640f123faa445e30307084ff92688cd0bf4ba8d7038829d42af0b538d1d7b956f6ad56b992a5feb5114a2b94228f47c9c83dc153e548f248b9d2344fbbcc9430b6016536e8603af5d9defa42f56a9808abaa814ab1cc918eb9b705679e9690c63665bde9103bb5e01965f4c0093badc0e3decea7f0a915fd37ee571e8fdebf576bde2409949d7889381ab7ffad552fabfadadb8fa786e87d61c9d30abc76ee163e40c30fdc2e8ddb13d2b62b21eb682946d8c0fb16420243db7933722b0450f875b2720a10bd080aadda041c684e1625dc95768f3f231510f74818044d3d67ddf9a6e393dd423a4554859e3fdc5ca3a058e974c418f7eb7757881fd430c438971e8fd8ea347e7ba171f9f8e607886c7ed1b87033a07490ad325e309087c464eac3e366c5348417e61b1646a6ef1b10dd3743dbf1bb5863bd9f081e1bc1107d783c609260ee5116e8663a14151e38f419c7c7c1c0957918803e724c914a0cf6a0a802424d579bd06b9b414e68411687b7c30c74e3d015f3d0c054163a97a56d6b3dd8fe0bdd36d0211611d0ae1d53b236718f053a1b337ffd23e2484138f87eb2eaaf49627b9038f25b6f56aebb35b0c9840529c4b83811e2b51dd23e106b36ced719e99a2cdbb935e0d32e76928448771dcabfc2168516918cc8a5f6d07924d8e42b77e0f2e2e574d893a91edf04cb646789a508ef948117ff851e4f3251bccf56d4079d37e6174da269d4afba1ae9aeca4654e81324113a708acbd132e7ad6847154e399562a359406ef5a04364728ebc75b3fa165f67da94817dc6d3c26edd05f5b877e7558711c2412f84affb490d16cdf6a2d5f092c6d84373a9a5fd5af45112c5a2cf7eebc0a089c92a93a0dfb8e9ad367bb20e4ceb437f9fee9f5860ccc0b5961b27c6aa7ce36b42855b42cd6df9df3e6392e9093d1e847a7b9aa266f868913b684f8682ea174475380e8d33a5e9792059b40e9b624690172c6079042ca300a11c550b276c213ba9ee3a0ef9997a2f48f80c1a1692e691dadd9496e98b744a1e2f81903388c54c8ea7dfac5cd0334daec3559c5e4633f8db35a80aa92eb358c83dd3d8c6ba24a461b79c82cf70f57518aaa6059247fe7722c1a5b1e6d8796afdc990f340960fa53e3d72f7108bccb068780a4a6679058c5277368496f21ae6a20b268ac87f3c681420b7e252322d19689723b788741c22b80f5003ee5ac372e34b0c8e821c679902e0e75cb3346033c562319bf903497bf8444a35dba721f96633eb2308bae1423a6e6bfd4eef6949f95c421c5a73411e0e5fa1e95e827a4f9f8f3b178f15b8c919e47257045331f08bb1ac327e0226d6e96f2a5ebba6133fd484b34417b95711ce86f1cc1db097b677ae177f477331717f1f6be17723c3ad531e6ebcd5fca1d3ee0d7ffd6874d21b212e4b5d00511610fe2f131b7a07f41d3346de6f77a8b68d7a567b2d0867f1d4bc5faa4bccccb5b8937650e7eaa85eb265fbee027e602efd7880d2bac75b2a9e49038d2699fd5a4b1bde5a413a3b900e270d5d972354c755234ad8afd019a92f9741e6f728e9b08b9bf02208bb48266e831066eff0c6cb3ce331b0ff425892e13b5f6edc00db6d6260e1088b6e17d59bc9769c317af8169d3b3a0a448e1b0327d71733bac2a3305141a2aee94e4f079edf5b827cc45c1b5fb4314fafda152f295d178d3ef8a24e3b374377609b2f8f1ebf1dcd2be052a6783c5ef70d09e6ed85ffbc1be239e7b3f2747a379bc81d78c9c860c04bd2d2fb22fdda7a31f2545ff7bc3c05ab2344fc766ff96adc1b86de18fc91bfa7aed9396baf44416a0c564e80bf4a3bdc54987b35038dbd856398b74ad53d805b6f35b8a9be487492229f512472415583d5ac1b0c55706a362e27b52382fe71a35033babaf84f29ead7af9f7eb787264a2a7c410b352dd174fce84aaad36e5858dcc8c55885aff1e35fc7d9d8079329a0c26a1a98ae8898bbd63f4636249094af8c68bcb421b84439a7cf0228766a67e51a23ac83257ecec930acd7f8584173a521d83b44c8e7bf04a12b9fe6207ce5dcd6fd9974abafa3b0ae78f3c30e9fb30c9df0379cb2de29c0d4e37661ca828d6ca5a166e538383f3a86948f227c58befd67183a15747dbe60ceaefcd7cefca149d081077da243ef40cfe420c308eb182241fa4f2ff101aa077d6534c660dd5d3a191cc46951738dbbb5174d0c46ddccd5f016ece39245bb0991f529b48ff9e47814f29d71b85ceb4d7426409d426b78c990828f57f0f206510d013c7d071bf25fa31aa242431bf6625491d1cff59fdfc8742d321b2c27e791982d50413294539a1a38c04802e9d68f0cb5abffa8881c29729a2e297c735a6be8d082623e1e0364905b0c680a56b4da8ae10e5508c23e800a0203dfba72cd99d188fc4a2435bc00b3453b855456212ef9ab6e1e3e1187b4ceba01fae9a5eab68d1a05862e96906c553609457a8179054aa4386067bb4f72b6524a6c412bde65bbd0ee7dfd93a2bd5df38ce99998e4024f4becc41886d299ae5db047dd7164e72b5f5392b83c66c986cec853da0081e12077ed1ff412c2e3abbb5785f1450266cf577daee254ee32cd6ba3257b60771f5af354d052f91da04a42525bb5de01cbf91db06eb5ea5c09488a42bf034ce6397f80e6a7a55bb901573a7708f3a3eacf330bff315517807aa6f15648e2d03443f25e97bb50b45037418a5d5347a428b174dffbdd7d39f0ee13dd6f2d1da69610f4b6a3ad42af110bd7c4f022ebae5bbabfbe705948232184d97335cdf0f73e013d84a09ecbae436546be3c3e6de8140b2ad461ea335fc0324854804973a751605c3cb559d5ba02df6c07025d32342f6c59a85d57a8ab7ebc4ee8921274673fabfd3564d179c45397797d24b49ef36bf676136c226f992006c4f2860f77fe96a1fbbb0acbae943b5b85a846d9dcb365696ebf96b96ada298e30199df43762e563e8c60bdcc024f44de763deb81f228acf00e38610fa2926c3bc4e4e4d4beef6c2c04abb2431564cbaabca7d4ec1c03cfe12580ee8369a9eea97f6e3793237ae57d08db468f31e1b03db6230672b2f86db7eb189a795091b76033ae82e86db10ba87a14eab892368367536d5b92083b7793f2e7b360f053c02f4a8a1f4352834743181af3ba31c893a85e7a3ef3db7b4e408987466bcfbbc1a512eccd85a372bb5bfbbeb3c4dc9beef2ea88cfbc6479d28afa86e91cb32635294580c0b72a53811dc2d70fc06a7df4def528527558e5b6f483f30a25813a65a45f2a0de6d03268e7fbed85545e2f373b5e851d03fa9a0a79ef05bc76f4124db4455e94052bd21595b85c5915bd58c5ee009e4860f4576c1d76a78b73d5e7ab8b56a189bed3c2ecca2866a5abd650888860f00dbdaf21d5c82ba2c1d7019aa3606e29f47f995b007eb21997beac0cb7c180cfbc1b5e7e5cc4dc0a407fc58a5defaf870d9efc6500411677379566a9d5752ce04a1f15b98fc522ca0dad7dd8b8d9e321d61a75893819d5306861dd601bb570c68e76786368240f7e635665d9d8c470c0d801b13e4860f719188127f863678a0bace681938289e9dbc760f4997d14a664d733fdb70aa5dcb81c845c06d84b0d7f2bae516589dfdde6d0438818f813311664626f1f2b251a210f65c1db691a62fa63180085afa72e5e2fd16d699be90e5a53cf561f206d781f4d080db0105eaecb20f7f5d0138d4f25475a3a28b5f4e98ca24ba250179ae3a84311fd11c9b392afac3d5998009c8fbe0416a3e85bd2b1a6e87f1c5fa2a60a27362817bbb671bdea6b4d73d651d39ea89226d98ee521cdbd58dca566c65b9e010939fb1f09a7ab5681bab09a84c92cf1b407a41bf709397134aab48ad88e6a0de5fba7ab7e8f5e6e54731c216a7d5a542811f1a330a9344149a3a60a023bd239451a0345881013b6037ebbfe7391830b9cb8b6abbe00cf3041853502d6dd1172a7a41472767697c3a1f1a3d1f2fc432b97ab94e5e10ead603d6a75802260178a380e5a1ce2bb1418af766a17e0539ab898ee8d6e6ee4b7b480e0ab85fac7a0a55721865c6fd0c88c80e8ac717444f515b5ef33de1044c6c789e78e59a53e261d6b60dcc4567cfb5f9b3b8e270717c09d1cf1af7e704ad36dc22fb7669740a3d2110966e725b237742974c6334c0c2590d3cd96047013d3dcdb7085cdc84648efc908263e4d8798e210b80008899a11a02e15134f9efff909a429f4a258cef416f905dab9a8d5e2ce6a0845a682895a8e62240bf8864324972683a10d5962d9749df0113158231568ca0208c3657d0fd8599690acc35c474704a9adb5f87cb7f3522010cb674bd449157b42bd177b4b9c088ed14e41ae82c7ec82b1c6365d125cc55e58afed1af04b36715e10ad1a6175c4263f9351573b66775bf99089b2e990959b217cfe3f4a5ff634a7622a33f8bcd25e52a9567416667240b896077537f494d4862f07b49a5bc6b721a6e2c56e4ea8b761ebe7e7560c22179879d8aaf2a2a2f3b3d2b3932c53f6cb2eb77a38c54e169668db661f6a0dad6779afd351637abaa6012906b148a55968b0be6ac7eda47369ca72ec4fb18a3adaca830be9b761fc4deab5e7ed884feedc133d57e4041d60ba59b05f8315598fb49bcbdd2531e39a9b121126e68bf6c037ade52373435d8406fd7ef4f1b43e3b9cd9abf801936035e43c2329a5ed86b0a043a2ba9c6086fbd4f65bcb24f45251b13d4728adbe6f760dc3d888b3dc5d86fb4882e013da27916c6f057bf7b90213b1e0bea1b5c95111e350f1dfe2f6d29b9a4bf16b0c2627de540c31e0e9c3d61503f7e0a24d9dd75b5109d36f76a339141afe9efe8115785722855ef859aca518d5763a33cf954f45ec892af005fcae76a9e65a8198dfc225fd86d2f24810d685608ed815287595b229df50483f5d00b0ae017adb89520c17608d1d78381b7294c2cd94a590d3b4340ca76c39f2df7cf03da04e6212eb7e25c08c260de24bce2e3a80b2e6c3cb117d66f5b2684c5d8337fe6413a6155115ed4fe88029e328a0935a54a2259f44b2d82b6c1868e9c023c27d93bfb860b1100d632cfa67afc7c79fdc880d43bcac9f0876cf324f3515e38a2767a97b018c7059e33c868ad5177bd982dab418f40f54e10858cf28597a3597b8c6b9237f10c7f14117adfa9e22a9fe1c5a135e2dd2c37cebacfe5af0aace3198d3876e45b90980c8cbbc6e75aa28bc1c298869733bb5a8d09b67f08093d23935c832026aaf10fddfe5ca63191217e725145cca768c2e67a9ce6f273beb431859e55623bc9408fe0e7c47b39876e411622bcff300d1e219be1154ccb82897cc605755c20e63b3d38e5db04e0aa8f69e653d3ee2d631ea390c3a265b4fbcd3896dbc07581e410f55f81e80715ee89982f95fea89117bd785aad5eff1d2bf4b33c6a9259d46f61bcef2d625f8fd584e7c2368f11091f86d72896387a92628b56d9472b232751a74c61c6c49b68938cecf86df3c02453c3b15387acf2b5fa9500c6135b977a184af89fc74d916e98d6776e04bd9164373300ae650fd3b15feda39529815db9bea9eb1c553111ced92b0440d7b5a3ebc39ab318684a684200df3dbf63df1e114a6597d6702ece009eb3ebc8db68b3b8f93e224138055d98d55cc460218b207c675c60c91055d7dc88e6b755e547d1ddb648b661199e3b46dc4f6404f5ac076237c53b493382596a87bcb404bc7c50de9d73477894fab39dafd9d97b9f7e524705096496caad712713c31fbe55a29769d9df1aba618d89ae34b3318184d83996161f6da9935aa221a4b04bfbbc5479960f5ea586e7270fb2f17dc0b4469b26a80115d722daf11f849c735f4a55f05038cf4607f590f037e7caca78f13d970897b227b757e88a5b751f0c659274a23dbcdaff0fcf390a4d3b4c85bb942cd0580368ef72b27a48a5a2c89bb6d1bcf55466814f7d8a24388d90b221968b3adca2e1906657c1e376724fa2eeda09a86a83162f0d415adb970c59746b43956d647edbbca1e28288523f1dd90811b94b8dc4d048c3a4d25c444c773395a303ccda74515f6beddc04800c8f58a99c91c3d26e8c871195c8ec2b5a40332a9524358ffeea395359c167282d8e70408ad0cf67a3d37bac08617dc83000e7ebd9b3ca9eb9c5241f2b8eb01f4b1af18f9b4a9f9b3db0b4dc2ad25ca41ec0ddfc76e5c27981a0c3be831a67754c2e3aeaae65d789f46b3991ad3a3121f25ae1758fc97517ccce061247e3a09df32ff3290f15e468ad036c1964c40a3e0288a7b7ac62ab0104a6f64f2c34cd4ae8293a1e9c2b08a7058b5db12968bcddad07b131544589d6c0bb2c057a7c58e4f786d523b392bbb861d991e956a15b474fdd483c2e0736e07b319b7d5d917e41fe6236c431992c274511898bc9c0e9c74606877b0766f9b7f5c31022922f0c13e0cfecbcfaab78c5843eb76b02614b1a316a598142c4517b43af4088bf5394404120cc0c395cd45694844024ef87921ed32d5da858c3c87c9b8adb1261c5a5b62d886ed89c2de35d1126bdaa933f5b803a2468bd17d3cfde58354975631d8350b88ad4d0ad1db915b8ee3b26622e2c46f18c6129d5d46d5dfe484b99da58829e12a777062b066f30de988d1f1dcdd66dc0b7dfd8ae1238c609162e7709efc49191b6b99a662e5d8c2cd21bf73a96c379c99486f3df37b3d9a36b6bdcd6226f2ce05728ffc7ec5092725f24765ad0114779a481dd3d68e98ef0c90af35f11fd1b929429d3436d92f7c28bfaf212da4b8c38f81eaad4698d939d20dd5f928775c8f83c62cc3b4d66f9decaa849ea212739b413a1f24fd58b1bacd38683ebbf83796fa1b216ab1d5e3bf72c2669c74acc8e25919f08974bc548f17a9097e8167deb2767ffb6262db65448eebe7ef839e0b8fbba7b134b81ae66a8fd64e914aba7b2349a5574c582c2231cc1665620b51d5917101295a55b93f6df7319cfd5f240771e63ca38fbd6522eadaa2441e52c0491a820151a393aa11957a8de7ff4b14fabc1a58ffaacc5dd8705cd411283272c4dd16c31138133fc097c9d9c9536a9ad58226632b51be0e109c9f0665244784db095888de00d2b8e5ad1ab47bc502554dba9954acec589ce320ff8c0dbcc356c04c2b91fa26f52e12d80f42f711a26276de00f05787315accfba4cc821cc746c443da4b97c8f96626130ac06f0f82ccf1fe13234b014132cc648d3b6793e64b953cc833c4a087b80f3b9a382ea7182f3b54e97a1d694fdce9ec91aa2447d6ff350ab2c044e817fba82ea628b0029cdf19cea2ef276aba51270ed3e503f2a269c733814316cc91421d917b70e40829d7fada9388c588917ce264375df57950fbd46f2f486fd822a3a04942a4646e07da6754c0a7d5eb2e530dc962f931201d494623e57b02d7069ee6e6484656d51913441851112f7fd6c026c93fdad08f36d5a8e26250bc07fe567be022cfe41ba04ac66ab58caba09d79329f7115251ec8429870d4f3897fa2a84ecd65968ead335febfe63059daf833d9ce6f23483d5a75cf93abc2e6a4f6b1827a5423130c2102a5164673da6793fe0bb840386de34eb50ee46f157dff3a3207615068d9dc1344f8e2b50830b7671593607e46e35d22854c1ce1a7b8712af54b5325746cd91d2ee8160b7ece2e9ed5c0be61e1a8f2e93fa1a3f27592791ec6b3cff5e8f222cce9b35596a62ad18b71fba58a44e4f3ad7adc7023e48d5cb162c74eb130e544445d893ab1ca792a26c5cb57515a468ad4066b0b15f1a258a79e6a580c6d32ee745c49e4db778cf5b8ba9c25500ebb62518a8ec6babca771b0aa755cc66f1101296043ebd07f82fd5e7cbf11f64865e296c3700f2c2ca1b2146a340d2e95379f4ba021a7db491005f1eeb590476686ad07d81071458eacff1e78f874432c11df9ef1dc53a067bf6bb11a151fcf085d945bba07e402ea73d37a7632ad190057a139f3e60034782197cd6184c9a236aded1dbbc5568af1cc9670c472d27290c344e67b11976144570a2601c57e9e199880e669cbaa6358287537fd95e89b58c1077f43ba3907382d2993f368210d635cb63b0084e781d95906264d543219a9c43f84f69f42a722f52395960e39eaf68feb29b87b5a770a4daef5bcf0a05974243490e2405819e634bfc3612a00c77c9eb8e795f3c1c65cd720d5a4647efcd7b486fa1f5a33505c496e87a233c0088cd0bcdebd5abdb0f678e7db0ba2225b910657599ed5452ad20ed01a223dd5e8613c049ea222ee58204018dccda51ad8b577c8b2a09d1c624f9e078670d6fad272de8d993e30481980e54efaf21ea7470965ad90813aa441eef0ddc8955ba194260ab01eef46691ae6317319e04d754877e0f50d4c880c9fec103035268d3e8dddb2d3f72019db8af1cdab98f2f5ed44b16927c438dc03fa04c44ec2725407970e84304f4606c427edb3602aba4c8a475abbaf42c354bae3b9eb1224b89aa5544a3b60f172437088134fe116fc8e0e22a2b7aa8837466d8c580414434c62ca080fd24b297b41a62b6f6ec6cb7520564ef14d79bd8fe8ca7f6a56ec16f2217a33bd9f8940affd3609eee870c0a3b9ca43048360a7cac5586b0eedae535391c6f004f6fc37b59b5276cb634d57847c498a6700ac38495894b2b0a781cd861e7da8c2188c01b08bd9c2d31907ae18aa5a7e1e475b08c532bf97b6562b07f9aa33bab631e09bc0ced9e2eb64b589ba1e7d7dc7cfd2348307daecf93a9868259adfeba9144d48aa060e8396dc9c64cbb89190d2289fd730925062a04905ebb444b49b944af958b4de0049e5529ad49cc55358fe774079c01a320330349eefa83cac7fe9810139e6075a51eddbc2fb4907c571407cf67ac6424fc2bfb9e869cc9aa936f6f567d9374f03e7d241a4318db52c62eec245b823dcdcb3da1d668d1605ebb5534cae4a5e59c3c2c2870b0d7787365fef1f0fc14450648d18bc81c22050f102918ffbca8c1a9fa5c592ea7b0fde401412834b370ada59b8eba55105fb0e954d8dd29cf79d6f9e2b6cb3d9d616a8881dd132ad2950e0702cb08cf3c8df19f1163fe0e6b10e5ca1d360bf2b981a76fb951be05c0fae4ab6a2378ed1a8f1fe1b17148dc0f84a19203634d52469b7b1ccadc3b7d8ad3c0bd099df149e67cd7788c29aab431692f9e37aa163d50ac3a44e7726c68b081b9887ebb821b0db93b8f50fe9ad86e5de1b58416d432e45c3029f568ea0dfd84aaedcdcf5811f3248901b3c814b4e85041bf705d49bf5e0e242d46c7135d31f30bac9d4fca8bc0b3eb1ebced0197b651df4c274178e50f0ecacabb6347c8368b703d386e39000b492d5e05e78af6b0f346add22fbf1cd79e4dabeff751ada47cbb475035f02ec7bdd7b0149ee23acccfe3614fcf47ad16e78e636d86bdaa4912431824596b9d04211a711ac9881fdf3e21509d2581658c5628dfe22b7d385f92a66d3a99e300df316ddcbc1ab701cd69d918523e35600580e3f3b59d64db4d71741d1264a17968eaf12f4a4554d1bdf6f4cc1ff27532367bfc4db2eb34561c4d833ee376c9bb229909e8c2a7187420a46a738eda1d5e0df214a6bdae093367990475d8fd6cd98a3d0423be326cad45bdc2fee870251aff78ef70e965e65cfc98913c28fd4792f318c80c5438b1ee9f59830c425cfc8f937d94d16724ed958621c93930d83d032e52d970cbddf0c70b1c48def96612ca460a88a36fe50cc6d092b9ed0b429fc4038d1f8a3316377714ba310d6c0c27fdfb990f580b2409ba5d99ce60969cbf85754f69894fe441bd7101716a30a108a1bd499943e0443e2da4082aaf287db9c7979660ec2f15f1f6a1dfc755922618132ec4db9ce0ffe1d90773b5fcbe9b7c529ba3fd0fb0b409dd63218a542ee759fa2756fd1ca9876868f54bdd98325cfffd5dc37ef240d02b6af9d79c9b90821876cef8a0cf22572056a19215a603635106d7a84544fae0618fce11115fab7bea6dc3b0db3e7bb370e26389a4846fc1764923f60502a08401a7162ed3957237efa7afcd9e3cca2bf4049ac4df15ecca4636020d543107ec31814c17a76f6174bda9817fbb29966efe577f135770740d0824a098d333c4d28e66a5b30d17a41724a3d325b8fea6692412a2c007fe59d05ef5ac00867c2df196ba682082e532d093b3e2ee05bfc8b447512695a053457662c83362d248b0cb02f2fd1d9fb938ea27b5bdcbbd4ccba6f796009da026be3890480dee23449973081093d35b2ead0dc4ddfd7d4483f34faba395c77fa5b3d97ec9ffe0e3d254f996aedd6b2f4c7de118924e85bfe52f444cf1a066a512e16182829f0a8cedb0c54a148a8445bc2632de9164a920f25c64d7087263af42572a657aa16d83bf69bd381290cdf054351414000270429829a1558a39a05096a663e84a4bd4bb0bcee01ed64377ba12ded2e9db806bd28230eae4b3180887315dd89f81be3c5f28ad08011709a72cafc126bc4f53500afe7ec873379a917626f9a9a566bd8452bf3acd314d1f1146356b806f4cc635245917d099e48afba5744f976d81295e75ef13996ace9177d745f4795ee6c0bd7e6439605f94569b68409fa219743890153721a2a8863f71a09228304c126e28415f1f10dcf72094aff0add33f995d88b61a3bdf26a8270b2344fcf029244fd5e0eab6c13ea8e8d32ae4c7e9bdc247cc0906eb7ec19094a8a126eca450407e9cb8421f0a0471132bddc677c8eccfe5839f2c29cbfc400aae8533d1b98286939215e32d6b6bb20b5168a15a3414348aad61cc2a0e06306f11ae216eeac5db1d9388b06c6afd731b7601627cafbfb96a8fe7a9c7ad7660aebcec3b831abc197bcc6814bac7eb7377ee7ec22dce424400e543c98eeed06a25209817a814fe0529b461656696d2d9dd0ec5b69372e082871b78faea8116512a28a389aae08aaf6faf88e9c02bf09e5a50df2b62b4341139f707f9f2199b99080614bd55d795a9f944084704f7f6f441870f06fb215050bdb9ae4960ad6b2b430d5046341ac54d1f428b0a383bd6ca9b545ebeeb9614ee1fab1b4ee9c00ccc6cb2621f0bf968665d469631087f9c0ff0881382e90678a40f921cf86b8095b1a3742e618038eb3a171496eed6cd8c6652d1813f23bd58e022ce0c40635ae6bdc9911e041cff4d4c3a955bbb20de533e6089e195bfe625eefc43a975c355ba2b2215fba4572918f97221000179f334b4d706c8ea80801d1969d3051f2f1df2cadbdbc5f54b534cb52bd4cb1b0fb8d6b62263100b4ab18895ba8149033d4ce5b6462261a4eb2e5f44a7ea1c1b49eea0eab528636eeb3aab8c9eb446f60d2402ea7e0aa4b85c662cc7d92be3eea2ffda3add740bc17b7a7f2d16ee71c7191866a86620bd2e6969dd35200c9e5f4187bbd5acbdabe88a8c11c27f103fb617b19271c998d5279be33c1a6e1af097e37f3d7d84963f53f8a42247a1de59983ebe38a1eaf2e378f8a2ee3e62613a6d4cc5b05471dd4833af7f2a6fd29b85093c6e5e17fbb4f1c2f4a495404a479c2e971ca704d0930c05b1e40816c9d02cb14caccb1e7848fcae19351d4b9141e1f08e6f431cf7c44c30c0c2a53322020565aa82808c2b13e1740eed2eef5948d60b310c001e8df94ff4ffaac82ed33ca1f19396ebee75daf2f3d3906bfd9bb0d9da79eff90921a586cdef7451cbf64d2cd058f3c1fe4ffbbc8edee076a4dcb636b68992198af5c363b810ce63257be8765221d3a04fe0d78a3c0cba5477b2085b82cb69ea2aff9b95b1bcaea734e42bcacdc0a479319ec7e881cb1907e5d302f4609ac9a443dcd64f785086f3e49664e40ebcf1e7ad76fbed6d2bedec52b6da42a45b6b80a73d5cdf514a986ac84eaa035f4b8d62223a17ab54c6b9fd787d0a14983f2fd3c8c22e6637a3456a387d1c6a415b2870d6fc3b950130edcaabbba59ff7d96fc38f6be5b20fc78da005c9a9425525e993e24f4cf77a0a38e855cad2732b9425312730d9f3dd6c87b495cfdac81e0fdc5d3274a1a1747b93607f7be8253829527e32fc38f4e671dd7c365500e7e11efb1f6d1688013d9d9e7ec3e7c04565d94a06641ba38fc98f21dbdb91632789121d5b1a37343afd636f7f7af3a4d85c906d2d901d43e47626907bafa323e250d6b66ad70d61c9754ad5b3e50ae80ae449ce380280ee9403bbfa41a6d92c63971bd26dbf5858cdc252bb9a46ae59e7c7427e411c4ffa8295c3a28ee8096286e603135a905c99e9e5bc6c16d5cd732c8e62027bb9bb6c6926abbb42edacd17f22a4b000b020934a3166506756effe2926a360582ead7fbc4d38458ffcc3fc7bdf267b6937a92660393a5bd4dd77aa88bea6b44a1b83297fbc908343246a8a5e61eb960e155b7dfc18f207dc5a537ba5e62087c349934cde44a9438475cae112be2fbe00d1abc9247f5da532222210204dbea39c843e7f8035d383b2c5086a340071ba8af48ac7cb325242d38ed3c04771e08b71364157ceb059ebaabc9e62c3c350dc18d3ba0e9956d6a5f60d38da31b6da781e7f33aad6c4301de1de170e2bd32c50f493d2a201fd577a2334b772b5da6f890ea0e4484a4639caa0368fa2b14504f4be5881f9eda1728e9c10ab19337b34801c6ba226e2a7fe5f58f22a5ad0917af0cbe99cd03d36efa602da0fac2a64cc701f7c7cb83878f7aeee022adedb1fbbfd3f7922ee4f817bcb16c5c1b62a0ddf6b8a8905b1878180f3527d00c959df0474b02278d111ce452042bac010f38f2f5bbedfd7a24e6915787f51a5ae1eb81b0d68273d2becd85fe63457422688e37b08510a5a89e3d1e127583df87d41ae68c3623502169574a8e661fa8460c2c74ab562bb415b915b9bb6bcaf2e732c03d522bfe9dab1573c3fe3f7facbdafeab28d128fd0203ef175cd2e38fbe2b0a52f0a2d25d42923d897033bf3a5e8b33bf1b75b8a4fee3ad3e2e7788dcb32dc35cc09400599843ea2a9ac306401f5236910a5c8aa83d4bc2887873f99d1013efb0d2fa108b0f451ff2b9f1b0dead18135a7eb2412031c8e02125aad20ab84267365ccb068032412a7805e766d0a573c962a8e99e5eb59a4422ac8642dd9a835e34cac51d2b503f6e59f366e5a2ef0c0d59c61a211cdefabff1b6309288701bcea887183aa0676d17f296a9264227d3ae77488957763432181d280c05f1c8e2ba1e9c826ee45a660701c5c0995168b0a4adc24e74f3d7e4c105dbce62967e2bc516c7358e661eae446704f5776f329248bd73419a2691f5624bdeedf519567d3fda1c8d448ecd965fc6ff34d516a401c08b6b6d93521048f4af07fe8a371f39279867a9bcb7771e946c3f880d763c0cc75f8e58afd9db44f24fa5bc4ca5977c98a2fd7749146634ceadd0dd5ca3a2bb9ed952f37f27fef9bb32b7b66ed1a50e17909fa4bd61c78889290d10187d3fb7449751ce19c25421e5c7b8203a2412188fbd8f2d5a0369f2a7b0829e7cc2f14752bfe7f3753b513af9f7e221b21fe1e3aadf3444994357ce1545ec56f486655c3e5b9102df7b96ba8e19ee3e759093058f77377b62e39d6a96bb11c90c9449592e274ce2bf14c78a5a81c41cd54d858f65cc9e54be9753fd26f4922bea6186087c1ed067069b4f705dfca94c982fd07281a425a9219310a0abe1a6ecfa32e011d4445707812a26e1d6e0f767c007e444f0c37eabc447c0068ae5b6fb9a5dc886756cd10860523ffd3d0adc5b7ccb83dcde5b72519968a3c2f6ea47e7a3c9c9dc35f409e11ba87d1d822514e791df285ebbd0ce2d21346df40ccefa51908d586e278f8aea2469c99bc041067c9d6de3e812508ac2deb1ff96464db270e1100c464f61a8418c41c4ff506d4805d73f051268ca88c7d14109201fad076a3782b8a8f49dba3b47f8221480c24cd6bd3ad374086418c614aff0442a8839818da0615ce286ac7415cc6260c1998424a40820917580acbd305355d0bdcff6c0e24f791823741e34ca933fbe8189261aad946b2ccdfe2c83d540f25078ed5568836ecd27bbb5a46955bfee050ba5ec786e7d2749a92166824cf822ed2a87faaba309029b60dd1e27d087bbd91b06dbd405cbd1f8b1bb258c90c3bc71ca9ceaa038eeec782c037491643bbe8145e581331c7e7a76135263527348ff841eba776a6000a2f9faee22033ed89c9cecb30a6a04522359221576cdf42004724517429b5d2a687e4638b3a8441d70176c3f38e80e252d0f19655f69bf19c4781c88d840d6280ef35ffd081b9895a2bade66aae3cad68d87e2234b1d412f7ea3f4c998e0c8c27d6d2966ada01e8315bc6e3c48ebf6ff72954838d2a6f5903779868e8c520a7d4a936c340170804aa29127b292916dbaaee3af6c3562d344b26a2b788d122e35a68c52022eaeccf9c43fc050e537c8e72ed03d843d4017d9399c0389c68048deadd4e18f2e6d3dfe6b9ee7ce305a8f8cac462e365e545279923857458a46b8c75c387e1885ef274fd0fb8e20a1574497990d0f41730dec89fdfc730e42a6563a1b128842988789152409e6dc2740fdf560cbebfa8d97ba28ff879a55d1b8815f755893c006d71ac4726bd0b31bc63ecd315f5ed2ce6ba50d7f63b28f8ffb48780b6a8315829b00fc6b2ef18a33f0c0cf92363b058dd086268f5311dae02b7b8651a848575636f3051683dbb538d70e0b3074fb626f073ce509e1991c816be4aeb523eae3e2ee50c0d1a2ee1519c7a8c1fc1617bf1615e310bd9ee739ff65deccbe5879b610d525459d5fa16de60a8c5aad8ee479523f41abc1f39bc3eaa46990f88bf7ccd92caedd047a63eddfac752b5e96369954009408f043820b46b6d824c573e044aae411b703c1e7060946fda83ce8e7e03eda4423fe0ae0e60e0739f5a825a1af09915729b10f00dc0636b1f033d774413a08f0f38f0904f4dc16dcabf07a152a30be0b70a2060aa6dadc1ebe53e010574a317e00e021870d56bed82676b1f037def401320e651f6e7fa34fd64b25a352ae385721beae9da063bd7a77ac5c0c3f2a2141370392dab44930fcfa6f517a93f1f90e7fb559f7676bb74498596c97365a6864a617229dca74cf8bb2646057d210c91e2171527beea5ebc8a5ef39e57e1e3430a1ad0bb56a704c687752f4ed24e47be3ca154438139c79761aab3647d9411e5224fbc4062dbe154ec33bb263b50f3d96d9628feb90a7204c53065f67c2fe918fd3f5d938078642506597c27cda7a504ba941aee130cffc0c30d58f7d458b72fac5c67703fabcc56883d22da4861870c567d923e418c2b8e78651a69f966a8365ea99f616a949d991b4d93872c34de292308d164fc28c97268813518d08ea68ab37c95f374e37973e44fab3816f24c1844df163b880ce60a262db2c8b8152392f91b696896b40d36a4b0c04e44aab5732fd0d238180c7eb21d35144f76c1d186dd4a88a83770cdb67eecd8862b641c4f24272e59b1efae25ade08b6cf37a1a03931ccbe17147670229c8d4fe5f34af80ad79a9159b959b6c43d0ce6906cfe9748012f7aa9c1b039546cda5d996e7f1746b602f67e519e0136b01fa8c729085d0ae22c1417488ab82e71059d548b6f90312442e86965b40e4e9763c94c7f314dab62a318961819693410d418dbea7c4aed6e7e801eff4bfa9ffdd0676d29062bcb88874377cbf4961787bc98005d112caa382a4f3080ea91139f396052cf81d41709dc2b78288fe61bc9b4c5b3aa3c524b12257eb38ec0be46a7add106f011402e6a233a162f0135caf034aaf728351206055a50399767c1d7cf1849791e28b1a67087328a5d441c49a8ec687cb81e6492b4e0064a9e361e91a85abe2067434ed07f081eccdce730b0e3daf3edc4a584906166d5b9384ecbdf796724b99524a01d507190873085db12b1b51ae18968dbefaa7e9680f652a95aa5df4012f82b27ad124c2451ab660112baf2a1949bb15cb3854575457545734b941aac90da290160703c134f518bd36d21e8e74b4c73bfceeefef9b1ca18b1a53b7c911802ae6d968f4a3ad1bfd88763bb646d1efff818a699a7669a351a783eb48bb46540757eddf36aade6754e7558c45dab52b62bd6b3acc8d412839c6cada966bc8b82dd79854e3ea09d8eee0273d9227905606d3fe6b1455db7834f77234f7dea248f460fe7e0e24fa6949f093deb51ed993b64e7e16bb8be93fbfc241faee2bece13be6195d679285848a2a2aff85248b3a7aab099227153e10167ee4b379deb17190308c64654e72d26661d8e768cb0a7eb69ea493d11ab397e2d55d1ad2670fe90ee9e13fc10a4cb2a84bda4c3d1a6a3ad99b7af0cf9f5b27022e52319eccf37972a783eba583947d8ece5e85ea64aeed20d1ad9724612fd3686bd7eeee1569ff1584eb75718fea88763208910a9ff44b77accfbea94987b5997a14a0665f80ed43ed16c825654d076e3bfd50d2d77af4663213b263ebf26be9d99bb0a52a4519f22d998bc366b21aedc6a8eed87ad3dc7b294875c7d6236a9703563e98dd9298c81efe7b082c8e4947f670028ba3fd7b8f48ed4f454d87b405e18c9a7a14a0424cfb8b7697f68fb475402ae93348bb961dbb344f5b62b4595b2189eec00d48cbba9604fff51a85ff1805d262929b0ef9d66fcd7edf7befed745b2fbb2d89fdf516352561bdf6da5b8f75ab659b8e5d1a52464d49642f5f7eb65d9fc32d2af72fb80169a93cdb8ac915bee41fb1cb942632e06994f4971657f2fa7d983dec8054a8bdb7df49f16ab5c954af3242a982694ae2bdaaeb80edee36154c80edcc24f1b44d57c4817a8b4050e67e17812a3f89877780ed027ce7250da372e58aed8eb94da89052ab875f6d726e132abaa85bb762dc2bfbd42fe360585bf0218caa0e37b6c8834f35fb41b8c9e66e3077c2581282108490060c7bb08ad2bae40215f10fa73a490f794f15a5153bd92d5011ffa43ac910c442b54045fc93ea24100bdbbb4dbb052ae29f14c4c293dd0215f10fc4822f5011c44263a1b9dbb2d8920186c58829c1ecf66ebbb4b0ac7477f7ebf66e9fa491b6bbfb1aebbe2c192bf8bc7bb79bbb77d71423a60463223901c37c7777abafde6b19d7dd5f30458af3fcfbc65c793b952d05ec2ce4cbd89076116a56560256c4f40b3c78e3a68673ab92694e0312e16543e3bb23febb05e20ec7006c54be2180212ad304a0f2cbc8f8ca448c0f95128c133f3c41818aafb7201b72308e2878703366bccb161cb4dc371419e01a3f28b0381f788271009121a4f2c3e6f251d0a7f1d2b2222384f6339eb711cceff83bfe199fc367d09df8fd506426ca3e8c84320c96f32f515e0173fe301fd832f00388cbb6d31f379594ff0866519190e737768bdd22498cf6861b2f6359dd8da38cd893df2c8dffbbc1ec6ebca08be33b2064b81596ff616db2df188b43e6c5a5eeb3ecd2f8cb8a85d29ab6691f4378086071706e308f322a610c91d5df60ad7af83ec0a874a80ea5023be432e26da787bca1aa01677128f004d7f097e21f836ae2f539bcee54df6f5149e3c615f3d86a7b353537482d8d70a5e6c6e00fbabbbb3bf18473eeee1cf6329d181f93196b40b8caaf84d61b7df2d7746ada263ae96f6e00b03808b035fc9900d565c82cce7c36e588714162a5b68c2ac7ca037bccccd5eb4d506f5a306fe4e815dacbad7cd39dfef8bfc2848f210a581c21946089a142a4aac439e9ab5eb1974dda1583d9a45cb12c8e7869565e4632131e235481dd007b60a5184173fe42f8fbd0fc39160fa3e7af6ccf8f7d7c153a3f87c7e78e2ba6c578c555beb9d862e672b4f80057e326f3e05b21c245a0632ea8f11a87eeeeeeeeec50077f10033ce730c033380331f95992c4a7878f304f511429289607dc9b9aaf383f353bdcdf52acb6e927b8adac2a67c05e55d934100fcf32110f0f37598982daee6dbbce8c029732fbd7093d7eda2ad34c03ecf5105fa4aa2dfccc2f6e2ce1c94f1655e4c93e04f130b7b9ca8ad9c96a79c6af9b10ab349daa728a9a737fe5fc9759113d4ae6b22d1eaaed431516b3ab7e30bb57171b45f6d8871a06d202894cedd9d23644d4ade12318b6d9653df9c030c1e060f05d5f8e4375ff1d73777777df0a0ae1bdf7de835f17eeeeee8bbba4f222776f19db92fedcdf95adb65b6782d42bc2e47f3e25f7f7defa5fd5b75d9a25c2455e93da50c45ccb7a4b6296656d5bed93dc3c2eeff932af7b8b115ebfb7cdd2debed2fd547ac2a569528f1c2ac143f38c86430821dc7e408cf3abad951d49306b6fd9953f9fe1e0ee6e0e95e0f17677dff3f7de8beff97b9173ef96ddefd178bb71bcbbdddded10f280fbe2d2c2b2f25244bf5671f7289e46bbbbc3072384105ad01d02f1094970e41af7d2f4fbedc5cc1dce3806aff79e777bd632563cd39cbff7bafb69b83b04f29efb24c1f860c717e36b7fefbd1767de7bcff7bdf77677f7410895680ebaca24add880de707d770abedd0fe6708df7bbbb2cfdad0be13b87ba0f46dd8f6269f679a3581ad80dbb634308217c6ebde5b0bbbba13333fbe6fdba1b7637ad6fa574f78fe69afbbdde29b8fbee6e748fdbfdbabbbddbdf55f7f7e173a84372ddddfe1a3a7cb165944e83eeee8e9017a334e8d7bebd965c9aaf90b00f7531494583f7de7b0b581a16bcf661ebd97bafaac1647fddeedeafdfeb3ae2f7de7bbdf1eeeec26a866fef55f7e70f7ab7bf6652b69a6f1d14d5ffedc25da752c0ba3f0a900e9105d7d8b70db184bf07a724bd84d949202e94a34f4b4e4b4e41382da9a7a11316a724a7208081ad4c47fa49c2ccdcaa35456fb1ba8d8a5bf449e809942ea217af76981791688a4fa95d24aa3b5c869bc122dd3ac44f732fbe217ee28bb2a8c71045e01afef2c521b2a01d0fb1a4b967d1f83e4411b623dae6886d9bfada8eac6e735ee461743f23b56177694ea248d4a7e6227ad57554d57911ecbca83696f24dc8f3a2f6577eaab0307dcb7edc25ece1515d61761bc60876c809259a7326dae67900cd22b5fa6e83e2d62d95a23946e244ec8a54f6a2cab46bfb5861763be4844b3967a9f4cf719247db78b57d807d98a9a907337785d9cd542e68ca1cf8b04f650529e72c95fe39aea6618f471dc0dfec48e6022958bfce7fe7dbab6adb81dbee3812b0f5e2d5b8bbbbbbf760d6d9bd6d0d148eec6e1d90acbbbba77677df4136d73dddd331606e193431c2921effc1ec9867795054b44d91597a3d8586d4f94cf876853bf7f86040985d4d8dff5b8ff33d20314008e7fb87fdb02b1882203c1e3cdfb6e57d8971644cf78a09a744b2329dbf975c7560bdfb5796bb530bc3b05feb31fac31f0be26e5999a5a22db1d9af26df69f736b98d32499f8f341ddfbeb94beb71bd6fa1839f0a445d2764c8a202d930eab575458cd4ebdd1dc88651d39c134fb4cdf3c2ec38e8396871f849f3ccefda08153fafb03832c035b2c03b65a57821b1a8dced50c741fc2ca5514a2c94291d87519946f58759540e3fc5b559d2a2483854dedf775de3fd688e196677e51c3244ca3939c84773d773129fe63888e5e5509eaca8401529aabfb424a6a8d5578ff1cbfbd6c908916f658f5934bb1e83d965fdb4367f4273fc7d3d8fb447fa4d4a4d87d70e5a1afef764b6b84f07591d8d7abdebba88fcc47f7d0bf6dcf2ecf2cc41945d280fb96cfca48576f3e8d7b5c762393b5df9d16469a2a69d75bdac60ec737d122b0957d1dcb57115d5c64930aaf28f0bb32faf028bc591cf49aa0321db94cc1deba5e07a61545a59e65698bff23c9fb954e58ec2f9895fcbc2e4dfea4040be85bb43a9fca4395e99f357be731f9f2ab2b7b68eabfb5c55647bfd655d94873aee824cbd9e3497882aa778761cc449da866d9c757c45d3c19e83f6a9c8686ef4da94ee22c6c153849ae3cf2843d1a812cd05f1d54b2f2abe09814f16477b7ef7715407f1ff50d9d4cb965ad95cb6ee1987cb738106356268139801543f753400584791be8358b66eae07b96f5d911fff1f4016c7662b3fc1398ac79efc774a494a65e186e8aed09be5fc55e8119be3082496f327d1b927978b2aedc9b7867f4d89e304f85fdb4d76bd8549b95dd95e7fedcb7dae6d2a99191b58abe73e54b845ccac63a266d96fbd32f72ccbdea9b565eed8b38feafe5b2f8c06f1ef8a54df42f0a2e9d882643e05d012f2adf7e78a6df02ddabdb8c1ca1fcad47d74c6852a225d64f482888310846fa469a4a9691a69563abece8774cef78ff46f92be4825252137e6fa134606218c569c988c3a56f5d08a96f524b65d5f5178c1ab9fb6bd156a3a2ebfa594bdede7e11303b63228235a88a0eb931f65c54b48f8914a23f37d6b3c3609b8bd4d8aaeee5c07ec313b7d007d4be30f45e5f724ef2f34af8061cf8aeae77b9fb79ddd657e36cf193eb890dde1eeb274382cbc438cb284284790a4462e660389dc4d98dd8c513691314aadb28831ced8613fd84f7354346a85c84f1df683a4b650c5fea7b7c50e5fd5313ef3575a4c06f27caa9471dbe10d63f2040f3c9fba03ffad61c2efb01f25b40d9327b44d07e4f9d47ea1cc87587a2e3e04516a428423cc83613e291b6caabdb7d7b355479674b7773b7ccd40e8eeee59f27efd9e3feff6a5afbbddbdbbdbbbbd7a4298b0e4eeeeafbddb5ff7eebe76efdeee959992887185c42f771702c3e4879612f9dc9ffb5b241edd9154fedc9f3ff727ddd777dd79d7d71d1bc924f814bd263878123f3a110ff1a9305525c4834b1a3de5a9aaaad8534e54178822cff98b4b8885e5f154455e24f3dd3b02c477af67eb3c0a7d1934b974059f1ae65f3e3e56a23fbc0b8d7506ddb1d5e5a7ab54ca4fed530d01212573a4f203417b4c14ab1b954125fd71d4d5316425a55e403c953b52252dce23f1e22c4e8cefb7168769c60c2f2ad78841d550f9d7c6e51b0d95a54731d14b4691557f905834d2556dd3d3f81933be4ddf33361bd3f41867334c34644c33b0f2abad7252e1591cd3e3ccf8fe0a0f8b83c6f77f7b8d1940547e13c5c3da984cb4324f5554152dce56f045b6a289ca0a73499899682c32d1aa3ad00fd5908942cd4586c9c8fb157ccedbb47071f991a61363b3315d62b8985c362b335d9909cb4c9725b36c6472a1553551253155919f7a224f6b5a69fde442617d5e15459e09e4425b06bd98f8a937231ed403e84fc13b5215615835f4d5900be56aa24a623e0655d253ad8fa15551f48930341ef153ff0bbd80ae8b47ee53e4518e58be7ad674b0bc7c165255d98470edaaa2ae22c9ae6be757d47e8d7635b5ab8a8a9ecff3793e97d02ba242848bb494c1857c19b5224e4d3f09c9a18ebb11722195d1c7caa2f2e3a77e61f9d2f7975a7ea585c2fc0bad6a09e6f95958361b1386050666832c50e20f7fc79f17fa2a0cedc2a354fe12cb4acbd04a4b8965dbe6a078c1bb0013a56553e2b2bd5c75965c7cc8852ab7557dc85fbee51dcacaf7bb17bab03846dfef40428bc3f2fd5ea8cab3d0aaaef0c37c8bca6352d381d96c4c1518158dc756956d05a6c5532cf4551522ba6f7929b9d79715986d9beb0a33ea586a742a2c94ab8ab7bc6c4a5cb66a4771045d56179a3ee42339aae2885695f3944b01babe938eb990a72066c54c85927e445f8d21513049cf3fe7bc485e312b1bd14e23aca08c6c417d416d997887e5221fa40a6a5351bb0705b523918dc58976589a8e53b846bf913dd4fe9948e41f195a4f16911bd185657eb307e8831f2ea6cdd7de3783ea9e364df2b00436a983918ec2109a54214914ba708ca8bec732abae4addd99c894df27fb48d8f0084a41843d1d302087d8faba88fdfb3cc40dbd8a8af32e128249e0871cd918419e4c9c5c33c417def611a66b742a62476fc79db0b096aaad919268f6d09d6bf542c95aaff0d23aa0b84176108f35055158d06daf8d717c961eacfefe3791ba245dc7cc8bfb621a6f82b5f2447fe1053dc84f8e09fa41712646e4386cc57f16d88163e583af9a626706801095250c223372292652b92b36911e7c73dac3865c24fcdb4c64ffd938ee88d9f58eec6437eea973c7373ac97b4488ea44572b2bfe8f591663409af9147beb50d1912859ffaa1d8843060737ef8a93f080336e77a066c8ec523adef1a3f09f7683e578f463989c551d2eb339abd468374cd34213ef8af6dc890ebaf8d7fde086fcca4f93747e6641c549babce56be020d43a8d5d671aaa534505d208854459cabf8e40b6f079007f240813c331ec5c4517dc7effdba856bf07c9e5555f783b3f6cfda1b23a77f63d45682edae44a9712876b1386858d4e38951aab36039ff2ea6aac7213f3d16ac4d3c433c431c7230aafb909faa909fa8ac4f8bd93d9edd42f517d2b57b3c8ca37986aaffbedf2aeaeecb742d5d56b767eab64d021842667eefb9efae44e1e23dc6dd10ef1935e2d3fbed5a78c4a81b7c7a1fbfdaba6b2506735bedb2fafe06a398c74f8c6308d778bfc9ad8ba17db5752bb5b381ba6a67a3bee6b1a0a4a0ee578bd39dccaaad73a256cf74c87be609a2320f0fcf6bf64a62904a15cce7254fd3116bb55d2f2910ae56983f135bd148a49c4573ef2b5ed2dcab8e4c3ec23ccd391184ac254284542f24480c8387a7c6e7de0ee6fb7e5c4d010f0fa7606d98080cd81ccbb7878f708f35b246d0a5859bc5094c9ca0652a5811332ab1aa9ed9758f4a7c232bf89c522f51f9ec05c3f8c1ae229669b32b862a2fa8cbf96bac8476166221a22888da59685516276a32bb7630abc7308ad54bd2aa6a54881afb8b4ef517bca488595536574fc33c6901d2ade9f4b7b695571e867f561ea6a5fbf18f65edfbf7b61d966e61f9fe1616161a2306cbfbf75a54de9484cbbffccbb6b331bebfe5593e06ddaa4285c4172245a966ef425930ce5a56b6de3aa8a5217cdb8c62b64fcf9bd2e328ced9a50d07da71589af71dff44228cb05462a6806366cf5b485503d405dac2928ac56cb551cf6069685003246feb9e497a59e36bdfa91889f1630fc8fa2948a3b7be09d2cfcfd196158534daa0189162a8117e2cf2a3b2f2b6533d55327a6cb7a83bd5f7631814d763d8cbe81655a260ee16955f873ded80c86a53d2457e921515a24219b554169088888848285b0d08576529053c29e025cd44a526130a4b44943593e6bc83e46fbbe10dfd859448246b941283d9754a89f5cd0428484e6bc7ee986ffd8eadcffaf9538c1660cd6f62f46c7d13f3ad6d88163eac1ffd681b529a43932c04e5581b0f3f5d51400316399ba3c5fb9743a23de4279ff41da1c934aa7b1e67959f5050778f77a934bb273e6a82bff5451a1f15a29b83988a99c5ec980852279e186a08df6b3ee2478eb4263f52c945854238d1719553dec5ca0f0857dbc40f4dfc5b1f7cb4a59878ebd4d6f6e99e233da71f227e8cf881c998084a110f0f09050d010a4e6a27c3d51e0daba284ac695f516cab5da768ed3aa5c958c166a26652c1f8cc647188226519ac042bf9cb5558492931965f60c33fcbf9776a7178718ac0386000872d0161f220c86d20eb307b0fd55d05d59fa148266ace8b9a9bc2453ca5399e99229a52693a6f885dd6b775aa64072aecc005392999c9e8e77f8bea203f71b5292f591aacb3f82aa442d447bdb69426ea54733db56bb03619b7156bb3c41b08fc303d788d831ec6d152b846d360713a0e4b435b0ecb79c661efd2a997c30b68c4c10533e0e02df841cacbf88286e90d3362b82126b534324a6d581aff6beb4c306c88f1b286a58971f1a2450d302c69785941c3d2b8a844d1b6ae659e81856486a55919956169ba4e75b13471601be68239298c8385c4b035346d28c32a83816b748a0c4bd3b51766d7a996d2365d07d5b6e97849aa6db609148250dda4bde9faad61300e787344737e93a39178dc4c6433d924b5ea922a861fd0b4821a894537876eedd33da91c5821849619f3f3a788f9f95dbb6445ccf82e2fefa2e9bc746169fc9932174be30516ca503016978d85e6c74c313fe6855846df44cccfd128667e4ce93b2e460b982e0445ea7b98fff81006e6e54bc16442b4944631118a684af384e1d3ff852ab1b646d23d4cb9ba085159e83a41c30a6acf91b9b231938d7f7a3a88884856a217937111b3838070557e49d3915b3f692e8789c04bdc10697fb13452aa52a72ca0499ac27ad2c7683a26fe26463fbf09eb49f347dfc4dcd64f1669eba1212530ae78039313cccd813ef8e1226773b460de527ef2972520dcd60565ff24475f5a0ffeac7bfce42fe59c25c71e5d26b496001a35fb1d7e50a815b52a377d0fb73ec0cda4433e7c530ff9f07748ece126b334d517a91a8f05c271f6d96b54c8ebe956422361524563e12dd49cc7f7962243464b07a582da26f6931e72d4e67494ad53d591c93d4788303b168a915514ab906e1328eca03e212cca39ab11392412121212faf981dbcfc32e1959c545504a4a47d228ebbd9550bdb3c0e2a70a4c46d6b489baa70421c2338487a7f24bec87acaa33b2d242e1a9584f6d4d879f7f3cd5f39392d28509bf67b0277f4baa744f4fa7bac79fd9b9a3d862d9a511759148c4ab388222604f657f632b4a5555d1a14787ef3df6b175afdffb115f3dcc813d667af38eb0a9bc3e9be7af71f4ce767384e4ce717333a4fa57f0a66dd80a5984264d104254c36fb2a80641544f4bfcf957a724cd79454bfdc56ed1cf1045f8f073748e6e18bce941514c291e2de2ac01ccc56761564561be778ee55643e4cfa871c595e48a63e4181b06b30f53fac06de71f14f8c12a6e098ac5e1b678c1e08dddb5cf98be18e36ffdc1cccc7093ffb425aae75f8d25cd9e2bda695ba6b94c09db807aa300750c242790a3a4ec1ef40c583294958c52be08063f2896c63729bf80edcc74828423759d1ca1a8a6ae932d82f0842c66adb69573ca9cf7f361a71d22c2882ded1486c4871b13eed2a54b261cc53da18a72e51cc5c49ede4b392707b3d936fb04aebed6746673f0a5a386c00134d474fa5f555555d53098febdadbb0c43140cc3308ca9680ccbb22ccb3001cc2e9ecc2aab7c9a8b9c65d1facd28909a1affedc0a6cf8cefd97b5a4d73f139470d89df5cfce7f45b662bf9e93d465be2dba693d9f111a642e32d2e77cea25651bd378df27014d0cd4d4d0df71f34e1112d7437cf3f0712185b5929a6622a157bec79b1afa9ab61385c317e5c2d0570cdb2181205337bebb12c7bd6e63d9818ddca475ccab86d18163d53fee883ece87a53fdb123538adabd9f2d4f3b3ee2c389e62049092ba39d14b1669a0e86dd58ff9ac3bedab28f96653d4685e7e8173f3e4657c33ed2f7597c0c8b2fc62ddb64739689a9b82ecadd8dee060962d9f709e68db6e97894f94cf89d64286d28e1e1dadef67ef7d50cbd9b9a379773141f79f3bd577d8c31c618638c4f5be28ab1fa5859958c2fbe0abee6285abfc8a18b4aaaeb24e8495d156c23cfdcca49164042008290fb503112578c64eaf13efe8e2a65e5fb7cd47135f5e0dfdfc19b6f2611bcba1f845477fb0b6a4bf4f326025e02fe6e22f0cba26b4ae2ed54db8ef7d647dac8120650c4acde5d96a6fab568acb5debaae7d6e6d1b5d3f916172959103b7eec948c0abbefd68d99f6d53b92cce0fbf5e956a8ede1f70eb4a6feb6410e922d01f0f9c00210a8e951f34132e273e0072280439e90150b78d47d9dddddddd0dfb7378b7fc967f49ab5b4635602bd33998f06be4cbf7dedbdeab197aefa6c2f7de7bef591f5f526d341afdd66c447fc8c73e88949ab6752ffba72d81bdbc7e3599d1f812a39d75c96fee412ac8f7812e163517880a4fea024de1875b06d3a7c6e51013f69ba305fc9b5ad3dce39ced2dfab0df2098a78487090674f8502cced60c71421f54b35e23e574283f3acc344dfbf11e0bf2dea3564704a8620fb525ae7fbfdac368fc77d14e6e1d5b5142b86d7370232dd015625057eb41aad109b6327298ddacce0f6830763b0c3a80bc788d9a43442733785263ed5af6f78693235e60a422a60c1d2e2d3fce658a989a4e10b632ce9fc3512f7fc49f12f0bc81a7007720bb62bc5c9923d3afa3663ee6d751423cccafa3b8003c10bf8ebaf1f4d751369ec6afa36a04f043fc3a0ae7837800fc3acae68bf87514124fc4afa372bec6d3fc3aaa008fe3d75149bc11bf8e42c0a37e00bf8ed2f107f8755403befe3a6a016f805f472df104f8759404bec7afa320f03b7e1df580d7f97594039e01bf8eb2c033f1eba80abc027e1d358157e2d7514f7c047e1da58177e2d75119f8267e1d8581f7f1eba80b3c140f792677977ee7f7b11dda3d0669ace073481b52ce392d117bea1b6bb443afda51251cf8e71cc581efaf71d48fefbfe9c0d6952a7fff0f3afdc4cf01ba01ba7ed2005d3f65807f2aff0598547e0bd0f513145be73c95bf0274fd44818dff09ba7e92005d3f456073627b005d3f35b1f9d818b031b12d41d74f0ad8ba16aaacc4d6f550e54f82ae9f1040d74f3d361e74fdb463d341d74f3a5bd74c2a3f1274fd7480ad6b9eca9f43d74f75cb41d74f06d80a40d74f04c0c18f43d74f466c1da76c2817f9a988ad63203f11b1d55016aafc02a0eb279a6d86ae9f86d884a0eba7d3c6d1f553105b00e8fa09005bc74c80d83ae6593fd1ade32395ff29f798b66ea36c6a89b668fdb4b2cdad5ba13adaba1daafc5c65b97535373941a0a83b0bd49bf496803607161ca935ea3a5941182a465a19c8337ad692f01f6d3b6f731c2e65545f716e66f4fe151ba6cbda15810b9039eba7ae1d09bc762588da12af76268099d49680b51b221fab324b5ba2aadd14f1b1985dda12b1764430ec3de370285c23c6d6f588fac750efa23d4abb17ed2927f229d48bdac368eef1f433429f43e9ea434bd3d51a6627475a46bb1eb268c729fe41c3fcb7f9835594d6c8677212e6eba960948236224d9515961697c798e6f2a23257585a7e7bd17498e8bdf7de8bf107afaf9a48edaeefac8ab52cf7287eac3076d767bf72fde8c545c36cd47033d77b97d42e79ad601addf1b7fed18c76560bcb8acab4acca6ad17414a9ddce8bc5b2022357544a98ccb491f32339e9f17b1edff52a9a4e0e8f178d443223c9cd5853d3e9a024529d2b161343b3de05a593477a3bd5fb778faed6639aa6699ad6a2599a16c364c18abdda1aaf04d55beb61599665592bf01733c9f8c159b2ec87192df312a342c2aa12d4a77d8e5e696dc3386ea6c6e6c64ccd0c1a5406ca2d638d9f65599615eb9ba2ee544ca47a16ebcbbe2b523179c19948f4d2d274c08f4464848f697ee30212b73f58453985ddc20802d4bdb121a286101c103536a60a76b5b464a59226430669fbdd91b454a68d1a6e4642f9620b49cbb0ab2463fb928cebb2b20c939a8d1a6e46cbaec8a970a495ec3d5f236e5020e21dd86dea1251a3ae105c2472c8d5abd8d232ec8a91480f366ab8999136aab2ef362ee687d24ccdc5cdd4d830cdb42aab2e58c10a7233353637666a48238cf4be9f6bc07e5e912a49c2a68aafa8acf4c32ac8717266c6aaa9b961f38654e6f8bdf7de9befc22e8b8b96ace04c8dcd8d991a9615162a63bd178e84d59de11abdafdaa8e11a7da3bef71d899aeb6f2893bf8b4449c8e75eb187c1ccab5fae3ea2cfa8d40c99643deb10cd0000000014e314000028100c864322c158289889eaec0314000d839c4c70609a48a324874114858c21c61802002004c018811922d226007ba4a3805db096deb887e5507ced0ae10e261c0e9b19746e5b929f755c0ffcb3cef2c44582f75559974668ebeb56da7eb1efb99dda78947b1cdb1dae09218c0432bd2fc175134994bec46b7896044bc7845173fe2c46e51df7b5c5f4d7b468778eea0215fcaebff833a484a4bd0ce2ce335e07da76140876a6edb49d4aa51c6211be3ba3af749d6011de8bc2bcbc0262acd2e602a31d2caad05c622c4c465aef88a761d099a9e13182cfd81d5820acb5bdfc410d209c666fc18b62812414403f748be91de575773fb5e99c06a481b3298f4e5c9e96f94829dbdfa3281179a5780a823e469ed3f7478e89e3e340296e090d9c867fd7ecafbe138f3be13f2450918b83a0edea7e10c578214c482445510693fd4dd3096b9f9453316e0feaafd3e254f23effeda894f27c2286327dbb21b4f1dc1a052c46580c9cb48c933798bbfb5c7798dc156380462d862d70663e3d1f5021501299358f6960ac8022055da2c9d666158184b78b3c2a4910ad7f5afdd70aa7172bc4b39f75b7f305c14fa83138c818e0c4dc2a1286f635481b8b5e50a129aece4051e313008903750190789dc00e52b4f35babdfc66c812ad86c6fe7fb8b49da677f616d3c2eb5cb63c3cdc6325abd46c020fba6ad3c338157eaf0561db2f6724963d12e1ce3d073e6996670129729a24a773d49b32095f6fc3d4ee966d6806db66580891697a6ca1cf6c96c852bffa6ac5123d4ce9ab96971ce1ca6d8261bb4aac90c5c0e89b3ec7c0bdf368e2205d0531ad2c68ae65f9988ab1cdab096ce4a176ce37d7528d1d5c5643c29e92bd2156fa78973b10096a42a77c06210b9fe8a0540a08dedcbb00cd4588150c9affa766a82dc38d31225679a762f493d833dc12fe15efd44b4d321759b2357d499710caa815353771b9be985cafdd988b04a41360e942333b09d3ef01b87231953795e00dc4b4792c986af34d49778d9c8edd1f9efe5f15aa5f22a03f0e58e2b24e20e35aabae5faa921984c76921e3e09012b22c3a9c4ea107543e1c7687792c94a64ebdae6803a85c5bba2ea7dc0bae537fbfef2a894384fe30a9e7194f497737c56d4bc0cc2b7bcab69ce96d70161a6e1f33a0db085493da11408663b5a44d61eba45f81f5971383822585eadb935519a7fb343e98f9263c420216bd974ac3b8059847854aa9a8ae51f18976681fa418583c5160fe606c2275f190c53094bf7127032fe0b11f566ea93fd59946272098fe834afe4edb1906033c7e221474a8a08cc10dc6484f0166e55ab720ee3daa4001fe265305d369aa6515146df5571457644fd935a450720233059b8479cf53315ac6a5b04ce8e403a279497203fd8d333160bac88518688e7a387d4cda16141c4ba9abe0e8d26f0f7e8bf6b362a9d8bccf757433c01810f0ee17dc8a7a09b82f24291fd00c9fb2eedb6baaa982771704c6a8394983bea0e35c9980a81a9d0c305293cd0511b03b021926bcc4ed1366eefcb3c69ec85aa801308457349fbf77d40321183302a4fe376bc68f069066890bd2ffd214a46061284d7e02c8ea3ea2e0102690a787081b0deddbe775eff72461f097229d9f1dd4a5f98b1693519c45c56d0a7092e1e943844002b5e7d2573860001a00a6f8fea3f68b84dfca86de382aa46630d63efd1e573bb02a1320a55cc6c2409998937e0192d2914c2985bfb4a99509714e2596d20feca3ee61e3717723a6c2f39235017ae01f56fb96ecdd8a056ac21415f9f67c0d527fa58b07630b70b7e9b7c43f32ffe48ce070246f205019762b728aea5866c6ac6ccc8b481e175361fd9d223a29582a0b145385b49b1f2040c0b024cc8dfda61d2525771c08eaaf84f8b890737008e1f94f60e948f751ec22a4517e795f14e4831a2ca5bf7fb2560d6b3d4809e776a0ece2ee3c07126286ca1d288ded7941c9866045587840d63c9c27a851884ff912575897bdd5583b9bce9f3e36eb46350af565d53fcbc480b127b1a34392679601aee5f5d0adabf947d3569529af0b22b5c5292f39e46a1d37b86ef056177891f3e36c03c873da93dad86c53758c1ef73a7a45e34b73770422d20a35c80ad331ddf391642490009f5e82edbfb99cf4d5daacc3b280a24520e4b57c98c3e5522a10dd178149334e3a30e4258ed06e6eca138cb32b33fadebba18518c588916746cbb2755f6516994956e1fd4b3a275176734b739de8371e2785f46a61b6f38053f1566622c4f708dd1dcd79b3de551a4eae0954983ea896a10070868366062bbc0450730d29d897870edc77995a73268228b1792b50826bcf273f958d31008a49c48ea631d85d946f20ea23632aa0661352ac1ab76dd545f929a34bdeaa73f5400c13bab1dd2514f7e5d8f64c9bc959a705c3b4c1645345e8b51c2933f2c2c86240d9a32ecc72e285161aab34f8decc3f9aa05ae2d2e8b9bed17e98954a73fa244567568784e1afc910c73c1f22b652cca5372559712d4be4f883206f0bc11f7932b07dd15d755970702baf56fd8048de4e02f62db55a049e805b024662c9cc74cf6ebc4c505de6011c6e40764fc3c81fedf71c1ba480708a5b730b14dd771ba0e61f514f96774b284a1ea5bb3dfd973d2ac9f17236188d6e843bc87e54ac5bf61443159902361484b9f2424c08f9496b22c51b3266e0b4299fb7788b1dbe7f99a094fcb637bd9dacc0ed90835c7abc51bcd7003f596cc88ef17480b4a42e8ebc2d296aea2802179fa880e7acc1f1db576d1ebb1a6c772c6625681807b69c84c344566c597cca2526996caf8c084b934419549410328816e102be24ad1191844fc2e0f6af3df93b0a533bac7e046a1c746c55d196247d0614c6b80759dd9c92df8a8d02a171b4ef6e8c3446b16eff9e17813767e709fbfb045e40b5f92f74248782b1e5dc0b6cfd7dcf5ed4feaa2dac00ba408617e5bf5e7e31199b08b633f658fc9e8d959357b5d0b4dc307fa17ea03a38ff78b734a1c057d96bf3f86e6640593f1a5d5bb8521413111e2fc2497df3dfe082ee75c5a8635d698963b8739e492941369fcbd7c39a9248284083d924e4035dac2dd47d519c1d9174ae68e11f06440e25604966bdf6f9cd2490449644701349b0dc0e3089a87f315956f1052b9812e4fc5930e2ddee35898fb4987cf21fc181072ff2a8db4165318b078d6200bb06cc4e3b04e308442eeaac112031866e4029e4ea454c8ae38468b6f0f9ccc6b6daaab470f5207511283ee8e05696eaad5687e375cb944c29d8de86fb73e8d644dd9b9d586e1aaf6f97fdb2790ea88594765ebd0cf52cfef06e8dc2ad0470c72c103bd994dee6b40cc1c626a79a75856181c9a7347308ed23c045d5e4395a11a272683580569044aa1d75c1916bf761285b7e7ee1d643d299370ffb55aa254affb56dc740a7f5dbf386161e6b3b3f33bc7f9ff4670f8e1fd9786bf8f45d82e9b7c1d988b443e947c91b3f48a0bc70d057fe70ed4f8e7abc711bb4c8070efda593b8fc2dfa23dd028ac48ab00805cd3bab498cdc529ddb4cec82125342cc24b1e383a4b62c80f1b6cd1a60fe362e4649cbfbaf2ae5b3a200394d423ecedbc5b24deb3f4bbda08ac494525c7aff24e24b211ef7ac3a1ba29c99f5b43e45be3fee2b9d580de45ed02cbb57c8b75c0a27f1d944f761d7f6ed463b68480a23fe4096f36abcb1b4e809de1edd44111b945244115ca09dacba4fe1a849a55933d725081eef2a55d3ee3e76ff9a26f0ae7fabd59fffd06ea35fe39e9ae61742eb9914dfa9c9a6c4696f2d28f66f8c50df936d5cd6011841eb51f9a08c7d773da2494b54520d07f0e1eeae3b89c7304ff0977b0b173e086591fb2f41e61f189d5afe3ea41ead48fdd518890e067ae37799f6d75d57ba0bdf07ef01c75ff3e32b6cf343d0dea0c82862a1b85dc1bfc13e3a661d5d0f8f16f5520f8a43d95600b686e051431385f7777b8185db2096c4c2e6ff28b96cb9ad6e678d58fdbf0f9c14c3b5b816937995293fd7265f662189b5d77e44aa24ca9d984be94112d6a34d983f5d420bd6f04f87edd43903fdff4bbe86f2e19c81fde9045a636141231906966f634f0d30d69c594727dd87cf6646f688ac3fb4a56785d383864d899bdde7d3854b443c30e601c6ab231e97efedb3b4befc7609e97bae6fba18f14f13b7a6ad8ebf2db76f5577eb2b743355c6d53af5768afce912a790378079151b9416a571d8adcd5db73b5adfc20ab43ff1a36844b0eb108d001f151292e0637fd7a3c3fc074f6da55815639ec27e14f33763b6e6feeaa7d37bf74e8a0594e005be558ae7b756791801a3d20d0c0529b1d409d0afefe34708dbed0ab9c0e2f20a181a56b5b14152e00993ea3bcfe2ff745edbf1b52deab0958893d76ece1b691e3885edfd8bb7e572b3ffcbfffca23c0fc3ddc5c0ffe01ed6a918642a7828307b5acc04417f058e75c746c12b78a6c3d9f87d5cd203ae5473192fcb67a914c65b8041cf205ac63420fda7be34d9fd364177c969277c2f0120bd6356c4f92e1a51388bf46bea10532ed6c84ac1262e0de89c0323b060fa28f3be30b5f14519e713cb0bad1d7ffe92ad9439cfb81fb05ce2729015dd72ea798d851043814ffb5137aaf70d0bbc9f2ffd89ef04d24f55eb26b1a7cbab805450b5f136c1f1e45f2e295c8ff0bd39662db3d7726a680e7b58453c097b18d395cab3d1982cbb8e53e6df77bc9ad30d039b8a20226287ed04cd174da1f778e44cc81a25fa507bbf0153cae82276f3bfc5ef4e201dd594fbd2f453e4df497d360063baa91bbda60367d01fa2711fc408a3556adb00aa07860a6418413c81195376db97b34dfe07f8217c15ef495b79048c15579b92745215cdcd1ff7e04adc0bbcd002cdfb5331593aec5519e7df3b22351ed2ab7436db2f956055251482d9917497327432f8d19a12078864184b2ca4fdb61f2120a6325a8b50a00ef2eec49fa9b46401a84d237fbd250a179aa282ba2aae70eb65dc20fee68dbe4caceec906d2b063e0a40fe3c6726de9f88dc5a25b8ee87c7fcb6485c240c062e00c428ef8a92d159daad073b5c4189c8cf51bd7b69b51c738ddf8b15bd9ab8d8f1bdaecc5e189d3450d66e26837ed74b909f4b94ff182fc017a962d894aaa60b3c2d339c9a6cbc2f2d1fcc2d5b50c4c680ab72fa76274cd3b73601fcb0d7c83821272ec62b1e66f76d5fd027f8d19ccacf28ddf3438fb631c27e6289a1f4875284633a89ccebf745746d7b12260724507cabe3bac818077bd97499679ac64a1a19c85e2a6c1b76df1830ef60dc925955f9404e7dfae7ba0b8c51ba2efd3feec96fa3fab34bb7314aafda3969194a1b7a97d220113a083170e3248c5aec178f6d192e5e383df14f08bdbed806f482351eeb127bcbc3726a3b83df1696302cf7c7d0b32ebd1c9e6a5b3f363ec14a0284adb04fcf37ed5092b1a222ae2bbc1e594bb66becd137ff73affe710b5c3055ceea058e050fa62e7ef2537285700c3c88d15d6aaa5fccc7971ad3e955eea21181facc4855e3a11149c5e2be0216ef0cde870cb68d976c5278a010dd730900fc6d1074317040944346d29b9645a826d42a49252ea166a522a963d605f269e1ec98aaf863c8cad6254878f78f3eba72cffd1815813f6ef402c3078baa5b4846d75ae03c48040a7b137a792a654489f2062158f7518597dccd44d70fe79c44f25a9031355a349c7648c4883d99c94c6f3997e1ea312b51a62ef45c355f283154b307901fbf3737ecc861f1d01ddb08e28418b162c53e391853c0b9ddb0af361e1415a85e48457d3da859396bcfbc00d338efff53051f14c5e3849a397ca8f4f78028b540726431a4a8162d5af50c8a0f3c3ef2916d497b73308d1227d1fc40dc2a8d524f2ef56199c0bd26d653e2b9ac0b5c5f2294c6c9894630945c2f2df4801924c95f6f9faabeccf35916b85e0aaaa43af1e579b04369676f5b0008138ab10455536b232587e244cb65ce650b3ee6eb9ac92bf779e53fe3fe56a8df4e64d03d1648f61938a2ba3377d99e21db6481ab5f9ecd5ee590cc7f9f776349b2c0c7ab89ebadfbffcf522c517515270bdceaaa43944d86e2ed6f5d4f806bf173810338b101e5b46872384abe9e0ff0c48ab6d67fe64e91544554a6cc8685050177294e629bb5aa8d8b9c4bb18196f45724a97b673aecb4db0b8d5768d9cac9a76e254ebcf9646cfc11514175593cfbb70e0bde21d34e2719f4f5e545d19fc067881cb01ebba62a7d05e4e1448d947b0b365db77f6e850b5695581760616950a3cf15c86005bc1752eabc952e78c71bda3ff2aef304fc01770c6292b31dfb9589d9ce744b55014e0246382a21ab5e4c64486050875cbe27acf2957b0b42c6fc6817a3f983a15cbd40c15fae3f4f32fee37689579a38e6d74b1120760b43b247b6fb5ed22a20b72b24b5ba5167d2aa542db7540f997ba72f0a3659b9a4a3eb51e76c8b8524ce02018b4af1f3a9fc2420fb52cb5436d7469930c364dd053498caba3b7fb40c9c8b6fb214da6d7e4ac3d3b52870b4f014869cb66c335db77d0ff814c71974c97c44ce01683b810fe2ba6cf25d3e96f88f43b570d800a515d8b0e9a356c41f8e867f3422115d554c515800114c8a0065225efa7c7fc4e49a39c2626150ee58860e46429abf4926f8197bb21b107a3c015ef5071d9fbf9f53fe965318b5db21c61f44f9da07708a1d4e27167cffd1a7507b05f09cafcdd610302daa37ee1d0caced96156ded284ed8380fd97a8567fbbea1229a5916e707c3bdd35471553029c0e04101464dc25958e05f3cc895126cb4924bcf487752680f72910cd60e60dc60b5b15f824935fb4995a44cd425e4fad2c3194b2e33748e2c70284b8e21644ce1291121364a1f693f4a08038a7f2e9cf2a8b49395ee4c124e36636739b20042daef3147160a8d05af5e8d367051881f9d7c8c40fa23cc4f220e904c8dd3c682feda25bfee0c8ca75f5ebc296b6c2b453e01d93794f05b240be0f620d4ed020ec0cef57f0b203bf739960c2bea303a27720d8df524638558968f7a773b80b7264cb18b7923393a6f39fc4f7223f160ccffe098c72efce8d2b76ffff6505b10b2c7ad33ef1d794d91a55ad170f5ab43134a069c20da9d4a22419230f3624605c59d7652caf9827a13867a0f7e126f46a86f2f044763f2637800b6b4264192fa06e864cfd13be5a9add8da412a8492159350732bafef835e86778b746d128fb153c350a27e247890d949b926694be4da24f1f19dab7a0ac8f626c4e4ba70b430c0a53b0f660aec2b84b4fd56a7a5dc827c6691276febb83a6dcb5d18dcf0f183db3f5a2c3cfe1dd81185c017078c6922e7e2f207dcbba08bbbc6651c6e529ee931a529a6b0d654a63e5cb782125421b3c2996f26ee59a2f10b848d457c2e56a0871c4ce8ed32f0c44b3743bb5fedd2ada06f3ee1b8dd48515e0fc668a2f37727565d04d9c8d449f3749c3260ca98982220dfb6a2057b62a24082a5b58a8e556c33903b5df3246bb7777c08d09b7e4408b1101df967e24ce63e665af41d7b3aa694ca8fd66f4143905463b933ac92742fb243e2656f9c414918a17964651ccc929a4b3b3094c0afa9ef10786181740ef8f34316bde9c0707fe5b1fd051e8d3269e64fb3dfb3f5569202b200888f65b1506343570d7275407c2f7e0455a95611012a1b27d71f1daf1caee09ba00a7fd8beb7f5e751c48dd890953366778150799d5032e677b4700c4810a10f8331a76c9d334d50cb872270e320f90c1963bcbf623f7a01ad867a138e7d4a7985dac70383bceebf45bb17467527e2350222041511def1a70c5ad568749cbb5b4f7a08c5bf0be0d47a03706682c4d833773f8b77e047b28a6a251fb4df10a5a22ee3742e79f8372d26fd4b70ed445a23e9b8dddbc0165c737ec2eb10fd4bafb673350fff583c6bd4e8f4771e15cc2e1f9f6b15b878befa847a3f00c1c8fd60b317ae5aea55e3edf281fb14d7084b0d46294e99bee6dd6966634003a86a61ebfd2293b78dd586e3822079a85d3898e436c8b30c52b0f359a38f08eb40320b8eeac2851b45aef2227598b42fe030ee3da0ac8e03aa9ade485a3ef7470cf230b39d38e26d72bde485dcf7a0b8c7c7378749200a0e115078e422b4a1a573bb4f991428357d913c3209993fa29a6e2567cc4d0f7cda2a1a230df4f3025a1ac5d9462725ce3860334ca053ea0419ea73fb2b5111f743af1fd024ad189dc0dcbb6d5f45fec49ee6b0f57896e5f8ba2f813a349943f2624898864a306b0b8e5fe89f2c4fe3d98b8c1b02a06c51e8fa00709aa6f016b8ed43d795c16c2e4d080af40e4bf29fe953057d25a5d45e802ef82b12aa19707b86c90be1e32b80302ee0f4db92f64b5803da5a440e04785d61aa623dbc0e5141b7d7a8ae2adaf96b0d0f2b41dd58115e61422120382c2668a6935746ab3e83e651263fc0a25a3d8c24e1632d93a6f38f3123a6830cf5c6d96ed0efdf0fc3326b5742b2a0100ac7ce8ce20c81540e040ead34d9b8cb6c9c1f7361172344282778330df2dc1eabf3ee7c30e82e7294f4cf06a7529a843c5c29cb74939446da25582148154343bb8d31ae40db3a626149d2120a32e6115ca041434469673025bdad4b3b740bac93ec1c6ff93ab4752cf45d68961005c360671239c5b4c40b4ccb27909ebd7b0fb6c158d0aac22fa8e15b0f18ac2ebb820c98471c713cbecf12a0d9b7a69c713b7a2ab8d13ea4cc12a6cb3cb68ddbe33d8597e5d2db52feb028748a4e79919fd76e938c8a9b9ceee01bc9cdceb4fe61121065224a21649e3870584c6ec49b9d520444ae8b84a850d861d540c04bb9abc504bf1ce46396e30ae1dbdd153833b12ab0832a6039a0d95abe9ac6085735118a0e3e7b9847d13986d7cb1577db8d90c72bdb918a251c99c22d0b7adc4ac58dbc21dc8bf809a7f76e30b9f2453e64ca2d83e921d5c5dddbc9d89aa6a429bf6b74760da6bceead2304ef8e042a169921c8eb05fea45b920a6cca495af57fe5126ef4a8ba8b0921bbdc1bf97837281849d61d9b4ed1d165a6da2572c9903ece5a2077ff1eaf88b65504d6d1662e40d7fc2e5220ccbe849920e007a3eabc67a1eba5bee90d024ea173fcf8c88e816cbfc8ba0692fba74c62fe610f37ddba3e7ac42288b6ba7af8adc0edff460dffa34b6a1c2c6e3eb4dfabd1c7b786d60a4874c31e86e37fde635a573f3e7f982fb941b131690ac8ccf53f5a200c5a805c1dde1ac24df0e36486a011486a9031ec16d1ca82841d998db675348160446958f078c02d4b87f679f30c23a7364e79348492dc44bc2559ea688d8f672821c25b9b67507afc2ac5ea1b8908fad724c3a7cc9db3d3e41c2279db28eab62aa92a7c084e3d82caf32b58c8eb15d401cdc1d89a205c485aeb6e808ab20f41a0e0f34ac914da819e010a50322e2dd79ed2b7138e9d5e57d97d068d6ecf3cb611e7098882e4901be81fb418fa12de9d75e0e36776524203080e76f1cbf3a500d762a241ee4b70961f6930c4b685a0af8f1ff39fc1a5fbb78ff732a4cad616dca70ddd2319a3c430556b5332c07ba93187af16886af2b04811bb13f1b5eadb6d0093e5905747eaa88715b63a2ba1a53a52b7ac6981f0a5da0201595ed7929f9a6605653773cea4b610307f1db405e2f6a92016886f94e3fa3424eb48d52f7d748dc20618f9323a7d94caee606b4db321a30d0052390991d1e177424bd54b7a33a6b59b605896f06816f8046e20bd5163081a13e3d1c9339ed40211529a85cb32f3af371bd54f565b7e67d3619689700488bebd0908edd90e1341ff4c2a22bddf21acfb36c3a51a0434292d6265194d42710932cd9c9f098051606618cd251d69321bad881e71252ed5c4918ecc204bdbdaa52997840c3b1164fb11ec451048ecaa2c7c9b414082ecc56f5d2fe40510bb588cf75e9145269a2ecfcc5dae47b89a1b71c10689dd213a0b141ae9964cefb20ef11bbb5505fd444dbdada8cf4c7de87ca5306404d1348fdf28d043d4acecdc481c2f8c00f6549ff24a44167d28fa95c6d4d30f2160ec2995c00742c3927f77ae195c4c04e733c4c77f960d122ae2de5b945a13faa54730a1d66cf0fc974daf790a8e72e9d1fddc53860329737ffcfa936795141e9610ed0c496a94c9cb1991c1b358cf3f00ead484241ed12abbbf7ae85895b8b725bfbbbfbef97aa1fcfe128bd354ec7468fadecabf02784504295703a2b3376dc8a8b11db7fae9186c862dc32201f8d09312e15cca780ff4f9102801bf37bfb651655d8e1c57800b88a3f6ebba091b62b354e3784fc17e98af12c7bbe04af064d450c49ceabcb219e1d1f030df7012d70d107e7effa5741d9013606139fe61f608f04605560375725fa5b71e4a8e6041ee2ea825a1a0bb1ab88b05eb52999928ca1e292807e0666c111466725fc94e05a12eb446a76f8cc2ea32e000a6619b8482b4f586fcd42abb9faa776916f800db05889c0a46d11c21c84ccaf651afb36d96afc3881238ad43d171309388c2410fb4af38c51af15e763a2c92cd3e295e927134bec09cb4682c69d40e0811e3cbe6445d42cc44bc0f98f1442a86d861e1318e7a610ad716af82f0347e046e789bf14af7580e05d986f1f6c22d8a1e461a17a17f2d9164fe948a2e4a67c1c5bd814e9ebf7879899468d37fa76ccde8f1f6e2f69f896b0f53d9ca978a40fa105bf1ed5e8f69622bc95abf57bcc0223e514422fe73e98306e904ea482ef0bcc6acdccf182ac8c4959ab218c229ae3d0c1030dc9c1e6b7fe1bee71566b51fb3ff86c77bdceb8f842b6578e567cb65a13adbef110b0fd720b1c3c2905c25c8b2028b704a54bf05d65d6703de89b2de48ce50f1596315391195f26ae8acbda641419ea518b8e8494b86d46f5999d1e09364a6daaf2c3249d8e387a56b85d07bc3e44ef9b7bd3e2eee033e9cfabbeac877035e3dc74ab082ba300bea6b60bcdce4a8e9ef238387beb6bf2b87a29dce11a4f0345a4e970573844338d3bc514065a9fdd71afea1c5df6be2211def5b8d81095649c92988b087e29148876410a82cf19aa46b72f45e6939c8637c135ce0faeeb392317301cf245650942c76df51b60205fb0cb5f1b9f27b0f428062d474f17d8c47e1700ddcf50111238113c162c76257c22be1e1b8e749fb9110028a82786a3363904e39cc55bd122bab3a5d54620239009015278ac6069e5596e0e1f827fe9e8b08a1b95406417eee750aae248f5091db7579c01f0dfdd807ba8253a9264eb496c4e5311fd145ea3cf99f842365bf78ee2187dae4ff4e967de762a6428080edbb0bbd6c928174e9c902658a8ba8201d8500389e71a8f6b85c3378de1753a7584cbaa1a504ecf6dac39453b5002619b1368db1dbba695967d3d275660d42a94e999c2ced324248ce0f1f394319e86060476bfe2e9798cced5d456feb8a0784bceb3a8a02b4fef9a38cd71bbde86dee3b15634bcdd2c689537c1250e1818dd2473869a3d08fdc1f3e17f8ce5d557f00b746dcb68a275c328a3cb76e26ebd8dfe4958bca2ea0e154cab01c206cbc0ee7e7a74e1fcf92d27e94637132a71f8d32c0abf772603cf6b482420ce3bb84d2e704e959af3bb44c4d5f2f672e50ecfef5af4257ee03172e18b538c6cf09d9f5daf7290afc7d0a6a21b06ec345b1f1aa460f768477d1318fce64c0eb61f96439869e6d67c5e36ba6b24bf287490c9b7594a25efe97ea5b24c256a5ba921eb46ecb436ec0dd24ff20a6bf49431f3197c754ed94959e2a5f10d24b0225c82bdb7cd6d00ae3be47d377fc592c2ed8edd7e9c16b7b08f8ab8f2118300e1c2f590c2fad3ddfab3634184d9c6dc77f4f6d621152f749ef010d2d386edebb1c4f0d84607b8c0b802ef76278c749fdc8bfef34289cbd0607605ead349320d77d4de66dbfcc50ad0960ceeba5583fc5357fed5906c960b04cc3d5d01dec2b3250ee02f833a068af6d28987378b002be7fd24cceaf36a43e046acc5a2862eb0ba4d1fba305b9a5c0e256026c431e837f5f6551df717a4a8e230bc96148a242d9aee4eb2d832dfa10cea6e6c0d905453841ca91e2a742959aa02f57426bba7e62917401f4a50a5841d4a2733057c108f4a5d433a75b6afded5d5152a8340e49ca6e368d5589007e20b6e2521bab77f1840ddcfdeeac47d7bd1874ed039d9c770404e1f68f490ddeaa5b484d09f80dea4948230f8babfe9388f66434860c34d57f6ae13354fd6f1796efd20700f63331e83abca4fff4a3ddc083a200b7849491c568933ab4a36bd024f8d64b5a70861fac082f154829aeb5b83e89040c0750fc200ea076f68384b0d8b4c40b61ccbf466fc3d4e7242157471a69421207b1648dde3cf19350a72bbc5bf1070d119d80f94cdef62e9d51bd6c1e5103ca7285d7015405f0a6b72516b54aef4ebfde999805d1d2029e7ac80c86bf4e77a2d166e72d4dcd6d94413b4d55d70e8b2e45f13a5fca1e148da8b414cfe061e050b30d1ab1c8151ebf741e59dcc425d1fd2a8e301f041f2e7428bf07d9e49a40edb06259a7728d7daa65b8bb5526060a2c20a2c0143fef1550a49c89843e9c7a07b466da2ffa82bfc0a6ff1377fabcc97a730177b2d1182857d9a51ce1328c868991c802dec05bc3b81636c260a08da31853d4a2cf02d1a1b5fb81d426ed0a07d7a3b3c2ae6c7acf264965eddec4776015a6c5d1655d1170d81ee433fdd08802d8e76024eda0e5f13017a43aa86179176a9bd0b2925f66d6c4d6a2882d9e4fb2cf1d466f673c76c4f5bf5aba274ad623f1e20db989847523330d89d5ab26f986a451d36d0803b569674e882234bb4d41694f2068409f44aa7b99493dafae5ba74692977352e605275ea78dc82be1ba41402c08071a3bc2c4aa17d3bce1c58c2cbd5b424d498a090f526ec0793ddd0807023c5cb5a326aff1b35446b91d026670e94231510fc3af02107a06a48e1f5fa33a603dbcebaed6e57d35836e8296da3c7866b910b32f8d0cbdbf35eab5ba1e4a5f6fef7856ca5a47b3930373b2760d0c5dec3d3952292e5ea00f75b568db8b47e6e39bf283604503d735c3449885685f80b5830074cd91dfa61adea43fc402f45af073a9af08c325d2d4beaac68cef0226dced70cdf05a45d5dec70ffa389612485291e567168633abdf8deaf96cbb3982d5447882466ea2f56e0b9772ad63c4ab8a6fa8639e6204d79c4413122b9ec3cd8313d8651711b7e0466aec3617fff0bcc1069c2dccc02e37d71888291a459a7197af0b9fdfad8618f13efd8b2f1f7bfbde6df6af2e720d87037270e2a69342dfb8434bf2ddd016b2c17cd109a615a76e0b7337b4e29b4a4f3d39508532aac180cbad20136160917f59dcdb705dade34644b8d2247f7014c986fa734f5a88527fe3b0fa6f68baef49e0920bd65aa81916a7a074ea553fbd083ea9929db2100fc8ec830fdd09620546f46f136d8c78ea9ed22b2e30c982e2e53ce1892be488012c26d56ae01d407557103ca68e042c58aaefd47490f3e370d5c30ec2ae71bf83bdd32e9b9a4ea274fd8a305d5b93dcf95b35d48fb94a3475750491cb8991e4ee812445eace2ade8c43f90d242998c0b0be9121d1c814ea3037414e3a7bdea024365f0388162d10c46bd64320081353584d5af7b136d50992679a2e961e047a0d218589911e4b2bc3267be1d51c92fa87c6bad9b120d94ebc4176a466efe43eeecaeb07122eecd2101406d6723770b5712bd40f1026611a8cf13ab0c47b656c9ebf6dc9906dd4adccc6ec9bc33141585392be1a15cce1176eb50fec0c34f5964a1d8f03c8584662a9427e686272a3311d2de9ba91d597afcaafcbad2344018c76b81ff4f189d1aa111363ee41723d0d6f5c7c796cdaa35348da99b3131073cd1c27c8d247dfd5c2491d9556d2e508067aa79840d23da9a3cae4848e439299349c9065aca89c946eb0c1633d23bc39c0b22e129d0968438aeefab9b6ac44354232467ec2a746547c38a5b5fe7ea69e02e5f75d171183442e5cd77531ea87b6c59377835a13db304e303f89670eff7edc49bcd23e267f1e49995591ac837c4c2df656a8c69934487e23f1a5f6287eeac1b91510164765ffc8cbf801fdaa2499117c95c589bcd21fb0a24614b347cbbf2caa967a44fa9f09dea4d40fe16b1100f546e2139cbd9f51b725accaab290df90a0726318521a4f0a79423ace9cb3ee7f7555dcb8deeea44c241274d92bdac33300350881ad34134d3aeaa248536447851763ce602a190e11a517e8a3bcb89a2e0ad6a6ea511c1f8c3962b0bb12f5445bf566b69e9c6c23e35814ab142276562e7951979ce3f01572c1c2c54ccc2ae5a3c21a1ae7f8675091fd4e13d855fbbb9831ee4800a161d162679a953cbeb90951e6cc7ac547c2fd2123ef8d4ef3b76fc775c2021fb1af66d4b7d216b56725121e5104568aa551ce7534f5bbe4d5443162d4a8b14b9759ae55fbc11a29c444f9f4e81106be4393c4e261e2d2526ad7c2501e1e69bfb9578ad6c690f1ac8925a0bdf5801da121eebf38f52923603667a707b6e1b3d7be49a58a3eedcf4eb08b15c57e2b3d95cf4e137ed809c767f596eb589a6997d0e7d0e684a7fb84eac592f44751b0ad5bbb0b971ad8bec6a0d6e20f323a6f2b8f56bdf19b925506ed41612f48ecd7cf5da55ed69b8bb4a1c01e063a86caff354ab61be810eae448e6efef4a870495c5bcae7157863424be8249e7b08bba4bebe83ce5ed519a20f12ef07237fefcfb5bed0b60c321bf6640392ee2948391b8aa61f17ac230438d3c16323bb3f96bac3146315948f3db9e90872bc0477e235967606291818b8e7b8377252a5cb8967f5a119251baa90a38f021f40be86b018c84825ffc4b63ec7642ffb0cc52842536def1c84aea85248f0a7a8ed7246ea0a5087b4c5915821c47b9139402ce3eda4729a5a27caa98f17a53d9ba66eb9c52b217fca1a670238007ce5abd3c9c228c86e9878343207306562b09f0057c729f2632762c088d0dfdb47888a4e8c6010edcc91dfe19f9158cde38a59593aac8ac3f7a0263718b174d1daafcd47bef94c2832eed10286313cf9605ee5affb8ef5f434454e943cc892d2d6d1582191b4a5a3b42577a964a2f65b4ce9a8ecad6934ab6beb6947900fc552f8740de032a96656dd133ced765d870066e59d0376f9ece31c9f7ed75f0dd3fd1d77fde4ac33919568834039bccca041fec9ecb8cb2e9180a827c900671948186c080a81a8fda486625a1fab2cc714fa2c661e932a45ab3a43be7b6e6096404f57af64d6fee250561f3bacc2d458097505e3dbc35de3627d6217d7a4cc4f273e45a0b14b5cd2a03ce906043d301d1cda15d503bbd586c59a56459b2c1491635173398b3a513dae75e0c52795c41d898ee20aea09fe89c61a6c68422d653c395ec6d58630b1efa0070e9608412a0a7c5024358acf1efee5657349d199a83165585e3331b348132cf798fbee3f6231e87548ca676e453b788bf44153d1a6c1a7608641144f9b5b722176d6f481cf97ded6c6372129d8b617326a82778e7fddc0a54dede8227f30d0f8cdc0524c51432884d0d04ad363e98c4eaa8ea628ba27a09773bc26eaf5fe009328cd8efc3f2ce01f0cf00a11381e0a3f4115f099318990edb8a93e1b5a4de83f065ad5705ca999dd28bea6d1aaf83662c95586f41d7ea22f027469439b3a054accec70900dab3e129edc516b1a8bc00ab5222d9f65abbc71f4fb9964936ce57406f91f8ea79b6c9217714e4f7ce71ce15460245c250437648f0d829ad18d1f639be8485331e449b4022cd2ab5d78139333a09343ea92bde12cbd9948892e83af1a654a23b2ea1f0bf60246329f69a5fc95e7f2b1da15d61bba57cbfcecb266e9cc95a0783cf1a932d857889872d9ca07870aec888ebcda1e69e34c4c1bcf5e8c479afed6b21eb56e934ad31423b6c0ff8ea5d6bd589a8a1308547835d6d37e0c907c855eb947c55f3470e2a6b82ed1db3765ac2a9c5274643c6cc632839ad777516bf9d60cfc548f04d85cba58929275f4ae5012a642f55cf51ff0bcf7d55a871fb210459d71190e0c0578626232b398c5ac8645b2621605fb4064d0e564f0c4b02f7609ce437e22ff76b5389929066b9495c247e224fc193b0193f673153710f18de535382a046dcbef7cfec178ad31ae930cd9aeb37b72e1945d670b7b82541130db6e72624b0114780663928feb660aaf4d88909e51b58bcaa5942572108f874dde98c61ebef640beef50b48bf095e318b3992a7a9b74b0a49c239cb208daf6222760731d6ed3590aeb80db310ffd01ac05f42b042aeafc78a2643b729d838ed1a73efc9c2607c42d491864cf4c7f96f26c30ccdcf185c386bebb80d6d0529edbccb38b9bf62209fa3cf1a6c680dda708527f21f7313bf873879cf00b64647feffe13dbff11c6e33341529787ec6fd0032156a6f262d4edec3229fb95aa21284e603c12f6eea5d6b0b4c7ae274b5267b22830e74a09f11db7b36c6c06313fe27b1fc93cbc48221eff618699a84141fcbe8a73c71151ee37a1f8ee88e010c2d06e34bc4871b95124f6864110eb79e14cbbb216d3ac8850ab5644c35a56c0c28bace3b298316233f90c080c2f526194ec3ad8f2fa6900e8eb91f14280802188b9574cd00cb9915a4d31ad0fea384327bf34c1cb5320fcd870c01d1721bce921b46ea0089c3db8ccf384638187170978616cf2b89139c524f4e459b6da178161aa76448993a69c3287602bd9eb4ed937a3062243b3376abd5d677e46a942ec598c522acd08d3a71a7afc22b71c70d32d5c25e4b577edd2ca2987d6af79f10e0f295bf05895bff5f388811e9e758a95ff120b5c3121d98bccbbf9d8eabadb9327a27e7cd1414455fd54e2b4b7583fbbc61739e3f2a85ba0c417b9519fbf5f6d38943b5b6b6d5d7c61b8a2029c5669dec1cecf982c1761385571b99198736ca2ea59a0a5164dd7bb40a0640bc3403a77b5e08cb6176540563f53c1e6316098082093638bd8f4eaa97d2bb3d4dfde2b637f1f0aafdbc6b6715c15eff9b8e7c50636f2319e2e94da17a9f86c878049ac36c287420c870b7100e0633cb31629ddd30b3deaa88e07a732a0c34620cdc8accc40e891dba94b2e00e4612336bb5b2eec19b44e656638fe821e3f0f4e10614bf341187994982a3d532c358e792e4582e55a908eeeb0d7ab872b51938c941f518ca825cc374beafc1a4a820ca87138d0e23add462fa33456fb46244d9a1018670fcb1d330fee58ba7afb382839d91abb53162cfd9b13a269ccbe79704801c00105edfe8d65fde1c3e53f0131df26d8f9580338a4566f4ea9411039d0495b8e5bb5144464d1abcbabc20c27f5cf2cd2f474a92b91660948b02ba202cd525b718e6739e61eddec530e11d8728962e1bb87cf521bee800aeb3681ed89fef6f5e43f7d9c14c39cb283a2833db7e8a2b9e0bf747f9b62d47c11ec79c6dccb431d059000abf338c3ae1e7892cd004e899ded6e494c2b9995da58c6049f100fe85bde0d13d6fc13051d1b1d1b3274e0e76582a6b98bf93ff9191e7f55a82828d74c091e5d59ab89d374f1d27d64bc9c7d9afeea8a166ed783831efd4a0b33a4728bbc742fd9c69786e92ea0e29576afbceb8fb34c6de35ecee98ea4aed0b224559368b144a9cf2f49d5ab576b7021ba95eda525a27a6a69ded7fa540f3ade5e5989dd5d81b7ee7cf9b946ef074fa51f66aa88264ad14159ca1051d54dc083dffd4c692ee2f7ea9127624e237fd01c4a764d88111307f8b039e2a56756c0b30c1290bbb0d68e947b954122ca516ac6f55d741361bd0f12e1b3ad42f9249b14a1d27d73d02b801f54269868924779d1c523d13bf774dbb7d4bee47f92f0a86ff9643d6a86cea1d8178f02055e0e94a98c3c73518ea6729d79788139148bc12ee9427747360d2b58e7dda38995c5c68504ecd68341d47ace3ac2b27f162becc232ece31885537a77e0abc2a3c03c208f58b11898f8b67704d4612363825c8ab78a8ddb11ba562efeb0bf1e813bfa1414fcb73b8e8756bc1d9d7fd260e0a9bece8b93116e00a9e5c47b015388c63c894589f9362827175080e72895e9fcb40fa596132a4d33fe7e2e2315b0320b8062188113b039ef850630474ad1d0ad3a320b15836e0d70ab10e54829d4d5f5154f15b5caaf5579231462aaac12140554f7672307d52f335d32a5c7892f7dbab84a461cafb970a034a88f8f14e6047d63f4a26e0fcd2c578068c9f4a97f940fe3b0fd14cd3086aeead0144dda803944f9be29a33f4329dd7843086052828aa8f74a96df1b1173a6556c4abb716fc6958bee727f3ac0a2acd7638c12cf9ccca1e3bb1bd64172fd4a92cc94cacebe1460b6c07621c059203fe3f46683ac102a7abbb49ce954a9a4cf286bb0cbd8cc85c4ac4b0065ec87d24cc2652b516461af0db165d2f506a54fde88bac5a9f0f179a012220d849d0cea89d810256d089524a16e3b9d3971488ffaa29224873b955bbe775237ace191f8fb4f1e89b3dc2a4d3408d0439f7f8615fda19a08bce4a614bbc4650a5286bfad4d44ba224c0042f8c04fce269c118c70d54e636044db498638224edd402133c7465cf5ce9463c42f2a20065b25c8421601308a6dcbe404bdafbaf0289f88e65565c5d0867000bd512fdceb65bc27f07b04c12ac642b40cb8cc2d206a2e1405f48c25a809f02b00a1407c6b3f0caeff39f684a19351accb5baa597d4f4973b50b8e136c3d9babaaf523188fa431fe0186dd259f9954a75a5130116469bb1007450a0e55c605902b6071ae87102326771f4dbe5fe130adca52d87f89c73023039100a8909b41bbf8faf5cb80af94ac43aa2453cb1dad77d2c6acad955c22c97b67bc630dc2b32051d144db5c12b0c019cc3f00a5381d774e6e8565cee133a881e48227e29ba8e2999be307265942e2fc677fe498b37930a1e8e9ae095d72e42c6cf949203a2f4c905e13d1bfd166ad1991075356340b39a191ab59a3f8c1483c2f49995f1c30e225cc4a6e6cdf887093ed7726244494f5007a757be496f973c444c42e1d55f0508afcdae60976c2cf04f32d42d205433b81a28f15f2109dc966dee7eaaa80a677cd52b225a4e75a443705e33f3a2b12fb68b08837fee121b66bc1488f867e89e8416e8ae78fc804ca911f0325fe49c55ad090d26658a1dcccfdfabd5699dbd409a6a064af1792f6b72e52cd1006b938d4ce9556e60781c68d617e3f4e6ba391fc6c40597b2a4b4bdf62633877c30e781ebd29735f59930d906df1536d2571b263ffce29d2158865034264a7d6c076c673f932a529913f09049379ef7fcbf8ff7b54d3f31ccd63ed12afd701ff8b27c6e5769fcc60485464a1888790a1b0a9bc0bfd9c44b99f35439d81408a1f3ac5b4ac1900dc50265e3fccb0f50a1ae32ed61bca9474b58ed664137b205b9e56937b5a9954fcb266af004e2f42b099006e5291210f74e25506c4232b532705030534352d975af9b44078535048f3ace542dc53b0e46b4eccffbbbc8eaabf10584f802e6ed26fd94010311e40717c0b7ef2c4eab815569f9130109d42b4e22c7b00d0bdeb17c6b67eccc78e2472c242e58016193c9ab366a8cfe0c33c2a4bc0c1740f31195e1f1db2e014796325137c16590aceee36b1568c69c433220fdb625e460604db96e49b4229c13f11b134b8df88b284b1da8b47e2c484cb9039aa704a0e5828424a602171b16236aab34518e40418c94c250500e9bad12979fd5c9a402377245e8db56f7d6f935bf1e004fc9d3bbe48bff001e1c7ef2dbd39edec951e8a2b290fa340c3512567bd0e63980d8321af004188d850a850184c126bc632466972a888d4e0ae5c4d6e20510ee2861b520f6324872b58549452dbcf11e3093af673029b93b8b1b70895d525fda7718175f2b1ebd104afe67ca1266e47a2706cf9d9f20034d33d38a0256fcfd7496e4fdeeab60ed81965241010c15b4f2a4e4ca0df7bd9fad1cda13f91ae8569ebf2a59abb4a71c898237bf63331a52576594eaf4fd5cd1146a1de4cb0f524507eb1a32471e6d13d35082d69c0f0d69ef799cc3cd76a5d2c5d5e3b59b0cfd422bafa723a2479e7bf4f47bb637424752634eb2d9d070dc695e9bbf53099c424a86864dfb6b19dbe0a2129e479cf38873f6943ebd5caf1568f935279a303fd7aed2e28b81b0cba0e45e58f101f05890d02be8185619d1ef4f9e71b6e590b92fee90a152101719f23dfb539d1de5429014dd4131cd50acf68151f32fee2be081ef93af27f4622e661e1f2608977fe6b200101f11f5d220a092090eedc3c4fe918322645aee1988cb4c62cd692c02c809a940437e4e0102ffc493e72b39f3d6fe05b9dcc05a5ccdb389ab3e45bc1b82b152a80a485b8c855b0065669ae0ece7247463e09024b2003a49f42dc206f7d8686a4a9ce87ac163f7468d896c5cb9e12e26a96a6afe8ebe9981a281fc62bb8129e9f5b8ca7b40e44416e44b57c20beb688806ab4ee770fadf602f474309d3119c44d2ad76fbbf0b8c1092f17e57ca26153acadfdfe07ee1802eabb8bc14f4ab481670b9eafb75e98c374d0702d2ffd09f6c6e10421b517f28e833c7ee25eff163b86f65b7919cd83ebde2127edf62bda68be4e0c6734566d03d172ea79a631696808a81b8141d747dd30785003536e2efbfe0a13a798a5440a1478cac8557d72b18e3d993115540612b083efcbabee9cf3e0919d827774a9d34f593b9b2e4933bc673b8590192d3dc2cb02816ee0e4bcaec066565df75e3a393cb918b801f953e0075f456dc7b3edc0764b66b1edea7806227843e662aeb413013902429860d3f1ec0df2ada8342d5de42dfe3aae2bedc4ac18622e543871d513b7468a58bfe5ec034f4186285ddc665001ef1cdeff99f6e481f49bdd4300e99cbf4ad2f1d5a2f73ad7221ded13c9503d6832315b9b5e228328a84a71031d40cd23bb6927f2e6061d31f7c1da3a1396dcfe05b8340e5c800c7be88b903a006e4f80956d3af3f9d6ac1ecf1a8632aa55183fa3b16a620ca69b1b4587934ae944e0010f9403ea0e0c4d9e90e24b70513c1a983c83ec762819fc6c67bc21e8a14af1d3d0b1646e7bbe85d2d05bda16309f63588e8b30a6329046bd17e3ec17b4bf6f706a1e204e7ff316f165cb56b8f23cc293e4c130504db2691b795c731a67e146510887e3820cd530027d1ed61337483c2511992789ab9093bc9b878590b6f578507ea5cfff8319e2555ef3920756ee03ed01cf3285f9e1b7b9d6483c73bf08a50a7d74f389ad8023899af4e7619c67b0927ff7ee2d485a0b1e2c7fa62709eaf8234d430e7c9a73e56982d18b61c07d813688ebea31e34bbcc2581f128b78356e2f37c443041e75f640a0902b79a8ab4fbe2df6bf10ee7e5bc194fd5c8c79728c3d0de07ce9f96c2491502d831d031a727c2a8359f9139389d20219bc0fdbe9a3382f65dde653ecd25b0bdc55bb8b1ee1c986df55bf386d0fa29ce3ae678f372ac035ba4a542c084687bec3ab07f15bbd5eb6cf78565b1ca545b471139a241a9c939602ee52caa5027eb157d52ca3ad38599379e448fc2261dedab3c341be0e6881481b68eea1dbc3e2dec2bcfa613b6ab29090dba70e452fee7cdfe17a795b43eb2c95a69c075266840975109a832b2329682881fdc89e3cd51a50deb4d8003ebd6887e891e56b62ce9cb93251014e504e72f0ea7299cf4e0e6fb386371b4c68bcfcb252fcb6f2e4a929168c4df84f7860096f4a61ba12968857533cd3db8c56392c2e927dd4b68c3f9cd3da77085aa8eb2bdb5b9b026de5c075790ec1748f64c7656a98fd03065ebd7047b3c083990f71d721027d1110c81dcd92249a25423dfbb4ee003bda87521adb4f32ea2a2c4884b66f75adf6681fdaca70cc79654a1baa7ae2673a97f7a4c97cf980bc78631771e4c4ea227591f6f134f93e32e8865db4c5f22ae5e816307b624e3ad42d2566e7256d0a9c58edc010e041471c62d60639c47b407a9f48509befc9183a79885107fc8d8194fcf0c1ed2903b6e9dcd44c6cb00bced63c7b72c78f79b8da11662e36d801672946a0c98aca20af71063fc04578f95be5b1a4a2dea35e38c9605d07b01db15fa7c82237f87120af2d0cc94c97c41be7e9602fb5912660c77b598edbaf67996c36a7051d3be94c94d26ba97220964f055ea766144c4ab9bf7b28025c7a560d7c61593f30c77bb33969a840bf24cc57df3cb4da7e49fb30ce562004b82c28b84f4bf1992465d2f1eaf97e4e710d234e7ea3650f8a9f62253956403c9d8396b094f0b1d509eb4201bed643579b40302cbfba92609f676814513c252d5ab55182264ace920bf687798bff96010384c019556c971464edc926704b2518aecbdc4a42780b61a6c16da43f1e5087b35ed1af700668d227f88008b587d4743b9506ff23f9ce090a313185ff7f5d5e9d4c33b2acf75d813802eea1c227cf8749ede128b4862cb7304e26a6ae055b321411afc03b5788609920a29e431075474741896671fa5d1c0fa7326fecd029a5d0238039bac7e19e858d6d2e5bef61b24f7514f14b15b35ca645ee852a1edda68f0d322a83852b25802c536c821bb340b1eed12aca484b43ce7e19d3d604e0118e49de56abad817508e214c78b40c04b0b8e9740ff668940124f18869b64c674e7e9727864abb1b9593ff059190adb00e513504d5e9bb4cf71323c2c637bda14c3603d7432c4c0f5176176efc5c1cca43cc4de437a1c9ff3fca62f5d1d033fbb379ebd1aed38c25901b69b3b960a910189b1c1f6fe876198fa39372652446138db0f213e1280dd320e70a40bcf2e67815a003431a4c2ae2b52a277d93f9a426f87fce6587e7a91e7ba92d303c283828694dba0521558172c09b8f7d2e62553aa03130230ba6f694f758e7a5243c3034ec3d7e27e346fb57a33b73f4f7cfec09a8fcf5d3a3cc1a6bd6f789b2aeb356435b1ce65bb00feb277adff1e961db1e9ea0805c2413956e1f132312626ed1008edb426c720119503196eafae5a42a1d16b32b9b48573fd7824a775fa595a7b98eebcb432a825952598f0f6a8e58530dc3180712e180380a017079ff862498e68cfa0ff2023392997981c2c7de9b2ce20fbbef281134811a4f14ad4f7e43367dd0f590682e2b90580f324e4439f177e0a983ef86076337975dfc5c3e873366e0329b53a40f82a0c8d26588373f161e6b96af98166f77db16c21bb01887ae075b685cc49dad321411adb1a3586087d987ab05e1bf03de4d92e6cdde0c9315ed0aaada14f8c1697f4f3b2b717b99e8aec6bad870b8ed34c6790e3e74ef6de89e24130050fd5dc1b0c80ff40c71500178d2cce582a2e3e574e794bb009fe4b4e9990966fedb23240bdb621cc1d359ec9678fad4281231d1127bc9ff04ef7f31954aa0d0dfdbb3f2084781f46d8915f23542998a7e7a5eb5d2242f7ea901c0cd089e6e6e2c00ee136ae34909b231dd16666ceb2dd37473aef46aa53db6be50c1b4ecdd86c49e7f09e31f6f8e412c95fa9bdddd5230c871b6c3e9dd3d7c136fdd462555e02c021909e97628cdb90465f0ea881202d0a7292f8e3009f861faabf545ab01c30d73c052b88f6257d7d73b66b465f41fff8325f657eb4c6ac967d44b9e4f4c807414c9b9c0208d7d51e18c44066b725c46674c5aba0bd90abed64615c4209fd0b4815decbe9672610780f5e68931b91ff9611097cf30006c1239908b22763a7175cad4c03a159dc85df41615d952249f8adc766eab5494b2c5ade7e076ac10d9c8169028e1ec4111cd3efdb1d66f743f05b03de08cc201d1a379376ab84a5f04f1706f15767c50dfef24d2cdc303ae1069902f214b0101c5c4428d0d2090aa80f5430c1a3df78e77ca13f9462eb1ba4ee0b23464eb3fa0cead5f8a25cdf1ded8f6853d2a4f173d5683c9b494fa5dbe02f252d2dfaf55133885b66551cf6c7c2f3b28ba04823ab95f3e67a17b6ae4167f8bacbaa6254853b1074c82feb7db8dadcbaa1cc2d1a0e571943140e660bc433274e30f74e26808e12bf78475b0cd6e348a446a518f4033a9944909d62095cadb1db3391fe0e415cf60cb46c822a75d89a2915b063a169729907bdd28e556d348e3bd3be48db5df8d39195c331aa9cd28d9d829f0b45113d6e576e0d5c8202e18c0a35402ffb7e73fd5a7a21884ad04a9fcb97572fcfe915fa0d58aa4211be84d2ae52db15b585d664092c01b576cce4ece5bba8c5495688114a7e07a06673bd16f1dc8d69526d98deb3b491925f53fa50115b3aabf8bbed506294bc69f2b168e8e7b3206496c3b0028cc535a7cdcabf8960a8a102500848f84e0931a23cea3d6b223f3df215a34c36bd5eddd18a1ab16fcbb4b7908988d55eeb889a910248d6edaa635a4e495864f6e16b0c889f7a35b7bd50594c3ba1aa4ac488e91fa6dcf0b662d842104b809074c904bfd67f182e23b142b9cb545da93c65284e95bb5aeca77ff5ad88f1e079e6164ee162fb0f7baed87bd209f1d3e0d2d0423c8a1ecc4852a6a915310fc0e8671bc1f76c8c7f7a6e2b967f782e27867dfae50ee0aded7b4993c8d2de62cc4b8a53ae7a1e4a1f549a7a87dfb9b5a17c07456558b625e2b8f7d55e5e1f420286ac0e69934e0585f4193d0d83d8b69c5c50340f10a80210d560e2a519977377ddd6dc1134bcefdb31adc08fc5bb0e11b4b7765c7ea339bf26e3212e2893653a2c73d4e7541a3c93cbf054e8fd8b10040dbc1b3befc642ab3553ab8b3c77e9152d112acda60cd8503cc5866f98cf09054bf91273d23f28353efe184c3714c8ea3376c4230e4c7685fcb532067685694bd4d97da117a25da4518b58c1b38b46c2bb48356719fbee4985fa9333372ad29c5ed88b5255f6721f5de793465a1b11c15151fb0b7e4762a0742688fdb652089c9df8c35a029f5f3f29f709f8ac07d17feba01d3c4fd2bb531f62fc4aad3032ad0833fc40bf5f5ed9b71766c7a12f195c8382b36239e14ef5642937760cdd18cf1f1ce3e3524dbfb8724e2d156e688ab0fafbda3f7d2303d6ad0c3260cecca7a251b8a728ae01feab538769549df5e49a152e22afabe239542ecaf603b6c6898f6addd142daaec1fa4935e4b3b61bdb02b4abec579d0e82689fc526f993ae4b79c42173ce57d336e04b65f60f812a8d42f8c2fadb2c7d9e359c1e11cf0fc1ec45a70fe39dc66b0cbbde06007daaadc808bbaf40699b758ae30376cfb4854c3caaae07be6427fa27979ab91b31de77ad8d4e4e4d6395035e32d2ace973d9035a5e472679a355a2faa87e454df1a94cd8e18c93d03d8466b4f25f1d1d1aba44dd50a0881042380914221d0e756f6165df5a8554801f29f32ad0a76456fab89dd0e73d73c42736cabef7f3ade05f03b2e6d17d21bf62c9a77b2e858fbe7105e3c2c81fd39309353d22c1735f267a387ce87a4090a1626fc1ba5e3f6ac2d4f7c3a1398b3d8ef40b4594264d81b3cf8946f7c3f5a4acf55ca47a3eaea3e55f4f414a1d550d45721ca188d5eff6277ce891a9b6f3042707f2268d487be8f1c25fb5d143802d94082e7db2a156eedf70fb9ecef150989509750ad7bd9cd74affa39c197431f5d09f2794c21ed438678dc2293b028da4a2ad70441d037b915f740ab5ddf3aadd8a4d9605c72fda563b443ad7f3e0e195fdd1562f2e8f64e093a20f087b74d981e1eb68db6d5f5df51ff25b93e3cf10f9c58754ec0cc998d3689a5fbf343f051de4edd4d8b75cc3cc071a91be96d7c76dc4e2c8cb2250b5cdfbffcb92e51611011fc7c78ce4e890cd0ef13d174be8d06c14c5255dad37d873560a37e70ad9e14710f5e83160451c71cd4ab3b8af992a447e6b9ddac20d415dbb943a085fa45fe88df3a3d76bdec35c6858aa3a749396259b86e8729c4088eed4ed1f3273df158147d293ae2ccb3e0fe6c0a2705bd6ec66ff3838a3dc47d7a7090dc3db645097e2a74dfb33004c1d73c36e9a972a70664c8480caf335a4ed3c77176c8f9b6df5913c4d4b332a59105cf7ba29443aa3a7861448c235a268aa510a07570bdf596f4c70791ea174f1333cddebe340283e66c495407f86d27b643cf22c8d4753daff960b2efa2330e42c3e0ede6c43987c3cfb9c904f7127176793f44bc0ea4df68aa1d49e11543f5c4978a38c767deed8d89574c7d3494c9694922743e11ce98c87c709b3de2659003311421d4d34f95c25319f1bbf4f0d8e197f6442e54eb6869d6fae009c803d626f45818d3d6fdd7ddec4142f4858c035b7ade97902112020d6d3db95232f0e60522e665d1d9820efa7ee5f0b719a87f119850a5cdb5bea323b07de167eccf775ab04923793611f8aa06c7dfc34d8fd55c17860049c9fb070c294325a59534575408648cf9ecc05af13c84f2727adcba6607a9e7afe425322c45208b11229ab43cf0240315f4b21c2958450279d63c73658e5b5e0d5510632a294661cca045b2c230d87847590a631d1d1a9903685184843721027e40134beca144b43c2077f1a66fbe421971760bac6e134b82acc970724654d2c70e3b1be1c229006a2f35727871ec41dd13b96a9ee9edba89e31f0b23f2b0bda8056c6de22068689afd658cfca2ae3cfca1fab2455c135745cae6eec2d4038c90979d1be6546c84edb9c1a56b65cae876893f61474183ee24038386f3dccbf0dd184d83e11c82fb8c984445f89a82d958ce4e9a0c03f18ba2d680583d5e9e287dd78e0561b250fb0ec57b008c36d8432f207c369bf4a3618c51ad68ba0d284f77c6113ea335b1e20e89b397e4ea14ae84cdf8f3d3201b911d3eeeab50787f9b08e890733420c09e210e8166a9d7a0eb0aaffd861ffcb13991e2a66225b5599a365f51f3eefed7947e0c5244fd2c7a119883ab6cd7e74a69d9b136b455bb2f80a01d3d47761563f8f5210c2e1dace2d6eeafdf4234d4c219fc6e1a28270986a3f308ba2a2654ec11bd72576edde36fbcdaeb3d519322355d94aa79d9b8d5689089635bbb1cf0b88f765ff0707bbc67ed73d83ede9b2b745304d54ef52f3f76b9a2f11efa6870317ebd9fbac1856dc79e3fd2836a246eda403b3786e805a36a64540a4ae17e6c14399ef3c2630fe421a2365ae05a33108d538aca3de16e63b64c8e188fc8dc32a63b96d04fa45d61f01449c4b41f6f16ffdc16823a4725f0594e5e5a49fe74ed2aa79d287188ec6b61fe7c4f089a27fe048f225bb7b3adb4a0edc0999950482320ae55823a326f6dc88b67aba8f420098a7756c35f4636107fd5f9a5a868cd5a4b4dc68afb7cb3bc99720ec5a801ac239b127aace9ebf13855b120bcb65061d4b2b9e26aac8c464a86f6bc4039e920a05d3697e063be115458c5e4607370bca2d5ac7e61c05a33c2cc87055b71acb556d5a7f4f41a0a81881b5449467defd7af9e58963e8549a970a7d0c0584c7e25b2eaa9f1b67286d8d8f6d29af87906b267a953979292a3e2eee7a240eae0bea53a20977b0f41eeaf6ffcbfc5457d67de682c2f842a856a912306ab9065eccacd02d07dca6c44f601fae6c21fc8e35ee5949f3c4aedd908ef58fc2b763d2400ef1e2b074a561e1ab8c925bbe9dbebea1a0555e428d836dfaf32638bbe2058b358008008338afc76d2e61db55af785a8dfbec675ca0ba08ffb8450ffb9e89d16eebe0c94c64969156eec8f6be9ecc4acc2a2328fcd4f92ee5abeafde5cecda8a0aa7617c97f701544061f261445eb2f046788e0a50750159c664af1cac1b4e3f0248b284d9541f32cdf042b399e6af23e7155f463967d771254259a19f6ccac7f290c48562e29c6d7d49d13bad66a2ef3e4122c1c5ee1a93b4a5c6677e16dd758fa065338192cdd875555e67ce412afa01fa582199d69c16e02acfb805d56662d888c8926a7a10b4c52bb1a19c87470faf8a78e25ac78ff8121e5c6c22b9d4d50f4ce0c077a33d5bc84707d35a469a062f5b200e06bcb36149ba124cca631433610fbef87cd313ae8cceead58235d0d5c9f3e53ca5e55af954ab8c31c512e146bf9f533da721b112c7689403e94f50625d5290b9a6149fba672032245bff51f345b0900213c3a642aa36f51e47f55434b846367c1828c40426083c3646a3f59c54320835c7f437bf53dc91788aed71455d9c4b1146d7034d86ecf72697a312efa0b350030f6c69510b68fb7c3a958b05c0e3b4b69d4ae48c9f69b5d20e48b835cec609063819128ebb5815234ad78e7c6c6c0c72c9e1c858ca6992cef888ce193ded51b64d39fd9bcc317350d809139d3d38b94ec22ba0457e17aaa4ab327c0d0de3a39c66c1d09c5e10069b6a832840ee451b11d712c2bfdb36cbbd43982d0545860dc0ead34c50fa870f864698d82499e63fb403441484c46a846a0826f19d51fe4422bc8806a17c51bebbd8e028f4f80a5ce2e3ee7508f96b208314ae38663a8183b1d6edc5ad53b11e1c12f7bc95eb5dc0acef65d59761508ab5dce49e4101877d095f2c81c1339ebaae4f769d70bfc52f439d0249a10edb9cce9fd1e3540806caadf581b64e440c4c178c40ab0a280e26b825974c4717d3c31044b57006adf0bb04b8367d06c453b0a4b50237ce0400acf3c11842ce52ec43721417f6eec8803e89fb6cdbc0266736f4e66019b4194c88857456037e46d1c11ef88e9120466e7cdad1c7843b07c5265c81211bead01f681e43faf08eaf20ae7acc7fb7aeb0c5bb60fadb239969de73774418dfa1a6ebd557a1965ed522e9df05a30fac031141fc4ae9d20b46e090d1ea18c4b3dd792dce24950d2a56d496dbef51399b67bc09181e9bb3ea22844a26fdfe7546285d6040cac5b85e47ee9112f09818c71c34941fdf3d4475c68f581cf45541a8d692b7153cb6096c575570148c74767c9bcad8945fe0e9b53fce6ab653971ab11077a51976c8d585f2d7b878b5e591211695b2630ff8b32e26ef2e2a4cf79140bcb70e9d73a284240dd897c20415d4151635ede170c0667e8bcb2ed669b40b100592a43919baf2aeb844b08949228a7964868c450b6c8f5d5ebe58d00dbbab9a588914f962dc2e9ea9bf5e78d4e40dee3f7e50b2b10f5032205c5fce7896c5dc404f87b0e4be683e643d372f43e8d8219dc80d30c47f79632f9b80b3cefbbf78758e408ce914fde8a6a191e3c7c6a182303967d6cbe57eaa0eda4dc9defe6723feeef3142d02c1a4ef3924d0628539fc6a55a35fb21e19bc99d9245b9c8c18fcdcc9b67f3da3395f0a00fb0308e35b5ebc31fbc90dbe611db415f028ba4214f52d21dfcc2cbfec80c93a94ddb59857c048bfc73508395f34d8413cc2bbfffc2859a0c8e53143e2b063fde4a09fa16643df1a8a93401ba4bf2cea7412ba04f613a33dc9f7a5b55ffbf4c094af655acdbc7a41861aafed58b6ef707a28b44c3dcbcee634d846872822c1319332facc5e0f0aff71f70df7c2b5f8878d4f2efc7b9b39594cdeb488d551f3095c7a6b1ba11ab76df476b21336511debae4ad40590d7629a9e985f3a71b725ee18e3b1a2c4f5441ca7f2318e8c7067d2c55bb25216d0303fba3d5eedc622ede91c7de3e134579b9ea832350df9b0f357979d709f1611e56b83c14340b8b991a785d08eae05bea122f6b02bbd2bae3b25a2374a14599faab8f7ce8c080ead4bfa217782ca3eff0f82e283366e0cbfb123a2eba176ff789db69c1f4afcacb078100997c8be6e727504f1ad83e75c220952382bdfcc15f855b10c4c6ac3d7fffad043d9dbe861a183a4cfab9dd66bc7e85944fc0ebaf6c0b397524d65f815f82995569a17c2d945c52ed64fbf5e29f5f4af15003d0c5af9f514b91c9027659fcd633a3f40609099983a71194ed45704f745355be6147396d246a6a7101bd4a2efeac1994abbc2086779b9c038cf0374fb0f2c9a31d82002aac3e02720a6ae67d01a683dc5485ffae2d664b4fba7c25230f1a3089eb4ab1e680038c25ed1dcf06dfd46deae6847d2d24d2ab366eafd82f3c4661c74c7df74120527d1b2871e0f448ba45435ea09f5a558e66ec73c5e4d7f632e8703ea0fd574b8a10786c18ab89c5c1d5cb3f9fb9ddb397d4ee3e71260ad2fd6fd99777eba2b71f001df9bf71f4764e877a3dcae06db4cf46967e9bc40b68ad7f3e394fddbe26185623033b08621553cd0a0598c906a7cc195b8798e052e14d20bb509900956fd3294986793d28274fc460f953b7cd2a2a0a20d2838149000c81e5ab2b7d9f4fe9ee334785716da053b0ac9405bf74dc4d74e641b40bad77bcb24ee80aacdc894bf1b51f87278927bef9e926d9dfb470fca5d340763717b2fc52a1492e372227e39651d7f4fec4d09f62b1afbc60c9d52a51297d5a2384e136ddbab635658b54a1df7131ce498463cafa588ddbbe2b621c468173019adb1cd2e86f0dcad9317d8c03b4e97b0592667a3e7c161bc9465e988613e3c36521455159a910880f1ead3eb00199cdf52e2ac5d627107919cefba6dd1e78ed31d3d33295975077927c0deffb34141b80e57c169df98b6d7a823530b841a3df99fd4c816e8ba75d205401a86e9ba84c08aeafdd8ae643811b335370a3bf1ed63a6286d47f6bf0b7ec0d7545ffc0175bf63d9a9227506f2ca928cf631d3cbf17f76a841277048d9b7dd276ad47048653d8f152f4db7c53ba10d923e0b8041416052e3104390d55209cd9a80385146c8f303d4e3ee387e5d0b0411af93a4723cf971c5a08267cb898af3401943420ad464d7fb1b1b8359ea2af8c192f20a431652d93008e2c7613f8432adc5a9b0a64202684ecbdf7967b4b299394019e0c060db70d1e5616dcfa52c679978517b95a3d4ae95570b56d317af47313dcfdbad2a8434343238299fa3eb1e6ee5cc430cad88c218651571dc1b9e513fd821d4a29a5924a2a252dc29def490dbc1e5659abac32ca28354d522eb474f5fc8eab699aa66951c7dd3ecd5341ea21e8c90f0441ed751f47e712eef79ea799386fc705eda6791c16c2fd27efab69567370d3be4ffbbceffbbeeffbf881abcfd3243841100441105c81a0c7e3f99e821e10f4802008be075c819ea8fd6baf7a386c5ffb62ad79e2811ecee3f94022dcdbbce712aec73d101e06e161fd1f3cf444fd99595caf07edf1d09e77d29e276b66e4a24ccb9a7949ffc99b147e4ce8c93b86abb8072a773b0dcb53fbfa126752ab56b5aaadb41e3daa179ef2be5a7d2bf81ff02da8d54fb55572e1aafbf525cec59e97399ed2b2f769797fb2ccf1b03e98258e87d57a3e8fe7a9eff90e5c7970a62aa70798e5932a6beee135d75f7bcf73587b0ff720c8691c478487f5f35168f53d9aa67d7d1109c4229287dfa6e5cfc30f7cafe3401088e8342f33358f487fa0f75acb03821e8ff620c8719aa6bd275b0fbdf76a2d52bfca1ede81fb795ff5177025edeb964d340eac4f1c55bfd629ba562c74ad351ed60a7e8f1e64b4f72ca759ec710eccd108ba6a9a56b58f55d3aa56b5aa55ad6a55ab5ad5aa56b5adbea669dd5beef3f970d8f31ffc04c7711cc761cf8341bcab9011f99ef33e821cd7e52d3ddb719a8c472ddb96e735d640e5935a6bedc1bd5610041f04c1f955ebd119b54468f0fb683dfb050179ee82bbbd25a97d87f914afb3d86bfc8987d4ba6ba2e8cbecad2c661eba51ea79472a3d7848f3eed12326260cffbfbc4935f778c29d4f5fda44d9ec0b4d750c90ae9cae2fa3eada984984bbe54cce3c25e321953f7e903034b872462ff5fee62f3f7d49e5ebb587e47db466fb32987b4c145d7d352fd9dd3dba2cab54195b73e5ef1eb4888794fb8f6d595aff8a48e07b158b3cd4de62d2b51d883792cde3b66fdbde5bb4fb9a41215da61e7e3957f0ed57bffb5a3ff0c3e05b5c1fc41febb3d55af0ebc123c243ba1da6a9c36e8fa992b339658f297bccbc03573b12b9d02fb0f44bf565ab89b556f4a8e228fa5b70d185a64e43bf0719bb7d5cb75289064d6ba595d6590f9c1e3d7a545a69edb171b6daba69d5652518a534c696add5e8f9f9dec3711c4729a5546eee79dff0feb2e7529d2db4d8428b4a63a4da09eea74926266ac6e46b1f33b5506befa136c377dc9f159c91a5ce963af19b504c94d49972078a39e3ac8a87fec48937f1b015cbd8f3317c60d000836f53356510515b9eae3d5d7426739e2fa853d0f3412beeeeee5e90fb2e2b1547c95ad147a4e0aa5259c95c651e7aa1e36115eeae323d5f47d79755b2341a4fd5259eda1e8c3ebe2e3cb32e24cc7ccf83983699853eef33d4859e54266577c626e8437853146cea92426209ae42a177bca1003d12aa43a1d14b7025aa9ef71877f362bd7f8af14ef78c373dcdbb94e5d7fab95772dbcbcd6312b23df741b6e73c1bf5cd3d68c67b46efc520a1afefc52262babe8c1be3bd0a825fa1f0bc3fe7f9edebc7e4c9409468cf6f9ee73309f1fce78378fef379fef39f4ca1d0dbe69e65abe0e8294864c66fd9c88cf7642332be3e8791e03d2353190ffa090e09099191e32923993ac6675aca48a6bef76fbd95abb7724e6badb592eae609bdc7f3a40a45cd4e2ecdf23d5088bfe76526cb3bc5944463dfe7f3b69ffc799697f841341b21bde71d1c1212427a0f0785a69e578ef4c946e87bdefbbcacdc96398a3d4fc2517b5c57181f4d406825f483c8a755d2cc91f2ae427b1e04227932e9493804036f2234e859f0864283bece3c55abf8075c8d3cf4151432d2a1261ece4a29a594d24aa9a43397a742597b486b793843bfb596deb095524a5969084b2d29165cfea9aab3594c6be2a9953c05d52dcde529293508f4a0ff3cb53de83de00a443b2454cb28a21025dadba44b5aab3f955fab9492d65aa5e6788adbc0957f9d4d9584d5d98dc5622c4fed49c3c453f299f0d0dfa50e8da77cc7539f2f3cf5b121fed068d210539e33c81f5aab0c32c58d21fea8333044c7f12f441ff305f1653e8d1bc860bf1d97fe075c39d1f92639e9919faf9f6a631305ae5c76679ef27c9e107f380e13628acb42fe982e24c8d4f63fa4ce1062ca7f3e8dc91f332661a810a28f29047a8428395844b9df070402814020100804028140201008040281402010080402814020181fcdfcede33c1fad55672f70d51965a994a552964a592a65a994a552964a592a65a994a552964a592a65a994a552964a592a65a994a552964a592a65a994a552964a592a65a994a552964a596a65a9e0f781f51d874a8152c171a8119ea34fd0f3379a859e3f5db4095a8726410b21faa045882f31f983622161e66ba15d097afe2775686881068d1959983143061664c838dd9c4ea62b984c252b944a31aa102306a90a8904830a3060b04c8185652485d14834138956a2b0b212824228047a020874b5b8f7e384cfc7d3048f076402087e36dfe72dc1f3ba2cba8e5302c7592ad66e49d8360d09daa447d075526a84e8634e5a040f113c9fafd69811023fedd3a4bbbbbb7b751c1c1c1c1fb1c8381aa3fe9e8b4bff1ce3bb1d28dd6b76a96df9891c4bdf0483485d9fc63c8505b8aaf904aee88cdd7838ffee78b37363a6f749402023f33e49f72078afc6a3b88a6e6fe258442a34763fcaecef9838b3f46b802beac1605ea6b1899adf71795b9b6f0c0573b8f42bc8447cf19a5b69cd4a155e2b03b670536badd5e9265d6eeed55d7aadb5de006007405728aea6d55a6bad5e6badb56af6bd7eadb5d65a6d75ad6a0f5dba536b06265871a3e6d1b8d375be8140c06df37069fafcd9755df736dbeefbefb5cfc35f92138af7f28f90f49ce144d18fd9c4d84046c5d57d07aeb8efc05547dd1f773c708f1e9270e5dbbafa1e9413e3397d82fe32c8f6d2856c2f7feb1eecde62cf4b1ceae0219d8e59524ef70772f290029199928b2d9aea803f89edfb83d453524a29fda5b4564af06db61e820f66d3fc28c120f4ef97a178ffbda762cc5479d959b0633e0f6912eefc5c739c6d33c4e43323a5f5f33e5c5db525b5d4de9df1deaf26e2461912be8841b8f76448e842d7ef538d7eb66aadb5d65a4b5f8370d94836f2bdf71314a23d97a90b14e23d97ab4bc8f7defb085c9ef26a935af3f6de88f63beed7a4d29687dff6fefb326de223b8da8341b4ffdefb40f03f0d9b84501a9aaaa9a6d1dc6b42a24c7342b8077314730e5f682e8aefb358728420e8e4d0710962e0829e2d4f416932b3508217547274cc82ca8ddeb40582ef79be11a64d1c35e77bff658f7bef376d6923ded3262e4f79b4e52175793869ab0385d0dfcb08f369f0bdeee3f014dfe78143beff3e70c8d4dc7bd2a99c1e4dcb514ccd6525ada99a2dcff3ded39372dbf6a34f7bd43375e9261e4ea969cbc3b96d483ce49e6239e57e048378f71379f869ef2bb8dab62d522cb5b76dff792aef23a411f63c4dd3fef34ca6211d94d1772770e599b40765f49ee4c04f236d2bc155ae82342365fb6f1bf261ef39efb9bafd141150a2a38e010aa1413eedb5f7f0f61cdeb457bf6d7b2f6e1bb51b9d2090edbdfc79a8e9cd7339f9c015a5a34df3e6efe1aa29cde0f71b6de229d3f6ad1a675a2010a96b6b7b8ff7d196a7be283eead1af62a16346607aeebd951abfaf5df638cfcb5cf6b2e779d5f3bcb7a3972cf9a3934c74c8f3ba4e72714546162931b8a29c05575eae5296640c53c9c4d9cf0ef1b2b4524ac981414cd684b7d45e358542a64df3640d29e97758b24a3814030c3d7d2ef49c884acfb343ba2c6df7e07f2fc11821abc5c85b5669bf6f01575fd7454d430f7ee06a7b0ecbaeab21f03d7ce4f358c097200c7005ae500f579eea15d2e73970f579ee43f3076faabdefa3792bf9907f8fc475077e21ceda8f4a4ae997f7912f825e16a27bebf9c7717b943738a40383889e7b998ff73f788afe87d2ff98c4005794abe0cacb3f78f809bdc5210f7ceebdee6b69ee2381fc01b220711b830829c7c8db2d07765b8c97710b3e75158c07f3912f461ec23d984de087fef39ee62dc47b4a84fb8f257fd0e7f217fafd31d19fe82d1824c6d36c2446c83379a58e8bf19e670a715c296faa435e8c904771edbaee3bdd813694a96c75f86391f0cac3c0a367c1df8b3eab691ce7599a577e8b4444565e64e944b221d9766a8b7bca65ef3befb9e78674f92341de92cb26ed2d7dbb916cba7b966f1ff974f7a207c120dc1be9f2961e90c8a7391afa2cf6776da1ba5fc1d143119743dff7fd095c7d1a969ad3dc53225a5d09e1ad448764dc48f73682df7b782ba1d1dd7341bedfb6efcbe00a27ca1da6427bf8c8a757f24782cffff009e1a8bf8f89f6e417c2321e7e3eef81eec7f3f4bd4f7e70dc32dd016d4ddaa2addaaab1daaa3d6a6bb65ab5355b5a2b5465b278cd39ab11344a93681f278a5e0f29d56cad32efe168dbad7878e4601d10fc3c1ca547677079d87868b5d0964b52b3c9088d0326ed352533f4a9946bb3596e8ca8af65171b2b3cd57d09c67253aaa237f602eb786871ce44d9a773b8dd6f1e39b38f75b1f1d08ae0529a3468eb5d2c7547dd3fb2dc8040d0a370411faf4d5c6d44b81b7f3e2e171bfa71d96982bb596e3a9fffc1517f0e0631e999371ddcfd7195601ffb71e229df9f1a6df5efcfeb1345dbffc03cf485b53f4fb47d8d8bbb596e40344bb4fd8b3d1f6d69fb9f87dd0babfbb80fee2cc14a53aca742a92d821b165434e50785f319ffc1d55cb8d0f6ef54b9d8b8e04c15974bb089b27fafdd2e39dafe36848ffd8f134f7dde7adebe7bbe042bc5b47d4ff7f1cc3cb45e151fc29d29b8e04f14dc2373477bf38afb7179426d5d6cb4f554487ba64ffa157713c2dd2f3c725e5853c5bd65b97194e7b57b596eb47d6179687f9ee06e9ca3addd3effb114a6ed7ba56f52cff13f1f971474e29d84f5c10057b4c3dbf391b9c3a30b57c519cb6366dfbe7d8a37ced9a4945aed3e7046cf3375e28bfd928dde2f2cadc12e4b7c913f78285f2a89b03b9a99738245b4a7ad89ea9e824136d27cee6be680f61c94fa76a2ec572c65153db4bf05e14e282d361be901d3b1869220015062ab904ae42655d005b7a19420517fcc35edb7a7a2264912f934763169a2dce5cc16847b64c3d1f5b5185f34e931c61823a9bf6892ed0a2bbc6866aa904201ead27b033972c6736a4565dd2450b620dc48299594d239a787278e3372e6451db4f74011e556a63b2064ac6b24d29d28ed3defed6596f110080f352d03f183875a4abef6da0321a548db8fd15e26a2c038ad9e733a10f4bc53a341e28bf6f40897769f2449fd4eca14556f1adada2dcf1dc4d9b6e36d11941a0f8960d0dd7f4b7331d6a8a10a2eeb052f4a00b31657614fc09a91d2c551183e111db93c65fa7cd42ccffda835552bcffd288aabe4ce28fa1e51d1dc471f61a1b9d11493698f9c686e1b3dd17267467b2f89a44dd8833f0fb90ff72c1cb78d5833dccc96459fe655c741a4f67041a28ef138eaf8994fa1dcd74029569fb780d4db7b710357f36770b7dcf91c9c2f6d12a9822d3c603393a40a18b119d057d18d803523a5fb24d1092c2fe8cc24a962cb990149e926b680d49fdc66f5426803849d79df3bf394b51bfdf95bde5a08ae0c020aa13fb39c790806b95aee78c879a10c9fef45402302100c443355201e44102cbe00e1c69938a3ba3fa15c28770a2b92cee06e4e9684cfa7e38a95332bd854c426b12b5fc5eda266464a076279c88db81f31893e5c733fd2d1dcc80bcdfde80d510582b1d03c2192c270b7a0b92a68ee472588aa184752a22ab4a315686e1483510d484ab844d0dcc738fa016ba2821053a313c4907beebdd109462cd00c36508de6402c10cd86ada6526834f7231a4fcddfb6cd7dced51cd1786a7b6edbb6ffae06c1b807f540aac289e2de0a01099afb28554dd01cf7125645732399e67e149ba851134771ef24f644a6b95114cd719b3762799e1904f310340514f390fb2d83605c00c134f723eead35c2fe88355156ac602ee63c7040449c8ca3e229d173cfedb8a27770c5e2314f999efb1d20576f100c04f394e8b9074df1942973cf3d0be6a878c85d4e3662e221376ae511cbc3b983eb3861f0743aee78ea12f1dfa5ff7214a617e2b9f41ec5df9bfc8be010faa2ffb0119a4d2c4f7f4b134b06226a96ff5ef4a6154bfef2a67f12e1d2d3d29fb057bf1ddc57a985e63ee3acc1f34050104030501040b0a9e28ee0e1641b1024f7f20b57ddf73c720e31e476268a7b3987986ae99da91a8d20ca112bbe704f8f7057debefc8f0443a49d35f0c035b3924913c5bd154b6433d17f9334f71504622abdf65434f752e62167c3c5e07ec48a39a487f12ca2ef8118b1268a7bce8ef2e5b84f9c19b1b6e75a9a1bb934f7718e6afe8110a2241bd0dcff869bfd0b61282e14508e8efa7c58e629d7ffe37eeec82f3ce4966c3eb85bee68ee47ac19472ccd3d279b1cf7de652e1bf9d6c6e950051a351fb6d4281e212641538f0f4d3fd22dd28f3c68da6283c2c4903aa599461d52a545f92347183a238694fab0654f44d1df294da526b30e2e75f0b0d6184f79d6c29850074fd5aba914222a6a205d60424445adbd142c1a49a5340e1e4eaa9960a5eaad7961067aa4f7a7e3143e405d4a59658e21b84298d076cb15c765b0004ab40581e668d450ea9402a8e5a93ae80da53d9f2a3903faf821e87aff5d4c59a1e7ef93d62a4569ea38a4b5740cd29e6b38be413bbebafb240e01417f986af73ec7d3660a3bc59da2f3e2d498441f53477b4254c5306ca10a7abe26256a25882a4a52c22542ec0776053706b1067a6ab18992992acd89cd132dca0f9ec622c1ad1988b9833b6b17f4bd7e51592d23fe1a130f67ddf1b0daafb6d668acfaadab6b7c5bb1c6d298448d89a7fce9f42ab8a254a3a93a3bd7351613d79af8ad35fb51daf39bae54c70b2d07ad61ab277575a1733a5d71cc02270cdab147976a8db6a32ce6e116ee7e29dd435d94355d966ada6be0ca751493baa64a4799cbb5a3ccc5816258ad6edfc793c9a8c51894474ca5f686ded09b2806f0382d5ae7458fbb17048b9033323fb8ddd39be8238e20faf852dadbadb1a4fd4c15e8a7f57eaa40996221a2e65f2f588f0c69f07828bd892ff3e98dad1fede4f9b08c2feeddafc3d1e35390b47f88c280c63c84c1fc1cbb9ec1a5efad7c157fde31f8f2775c5ca9d424c497195fe67b703d427c992f637cf9342b58331647add5587ca9322bb06079aa5e11c3f9ddae5a70d824657b25339e43c9b566a2e66ba2aa944b5bd66a9af6165c692d2b337f46aa284e1324bd8953a03a310b1a138dc5d2a6f86f7a23f383169b0feed658acf9d6de3b6bbc3ea9442217bafe54e9c8048d05198da5d5485b53894651672089ea576133870e5e5a772be89c48a60622a7a01375a28efc2dbcf4f6eed2dbbba9a5a707c56e51be4e05b2274bb463937c4e6b7a8be94f0fa4ca03021da52747089e1d247c689aa03f4c3eaeefe3c4c34984bb4bb08febe3b289e94f4dc90b59e1706325d8104a3a5365a299a8c9bd896544be69c947cbdf7d6aa8342d29d11c5c130b8a854d95cd251d1da94b3b5fda29e9680fc57e581e6ef9d3f2704aada4e329599ae2289d92173297601e4e3a84bb9568134db61246e6ad814268f8e3aaf1d4f6f9d468f8e392bf3f2e3da5b73f2da3871a75e22a97c5a6258e9aae8f9369a229e9488d7ac92676f837ee1d5c714f4120f5b5d78ef4404b58784845976c74490b3d4b310fe71597f579b55a2c16abe5a9e855bc7de161140f73a6aa048ba8f9d6de5b82e296601fd807f6797d5e1fd8b6b3c9e2cbb4798b51d9629e8ada447f7f5e9fd7546db12de6c9d962f56949672be99474f4fc12ac04d3b324d3251b3ddf93e3e9c2533a9df61fdcedd1e819ea424f2cf47cfa7979382936b14c4ba60aaeb6829b4d2c1a138d89e5a998f3f258f1657a341345636ad5396a02680a5fd429ccb4a84fc0d99ac0e40cf1e3bef5bd83efdbc729fa38f30ef58e38f3f3d04bd1ca7b21d14ade48f4ca866288a84349f44a8ef989f2dfef11e595fca1fcd957e64d84960f2291de949aa67dd45693524a2aadad14fc32145a466d394ecaa755c8a8c452c7d8a713d7b79c0e3cb464d1f89aaac49b1b172012b8d0fb6a1e9e4775b04129826c250b20e8e4504a29a5f4e36bd308375535c724a93985f2050d2ece0b08b397045bdc7063206136a0a1f162674766534547d91274e2117494d9b4a6b474cc620a4d54828e59f82036638c7186669c317f45a20f59647ea1108e9abb91f1f9a150fcef278eff854231ce39bfd067a70d4236893ea48c829652c2224ac6504b6f8cb557522b9f52ca7dadb552eea7c5bbfbb84927e5e8c7ab0f04998e590001e626d0318b2935fa150a3d170a793114fa59858c88ad3feb7fd3b6e8cdfb4ea41ddf7ed45ff7c58fa4bf8fdff765ef39eebd2fc65008fc888f9042fce9a17bc8f1bcd0f23b4eeae0a11b2ecd4a1c062e573cf0d1f7e8d1639df3a3248257df6140722e0d9c96d25dfaec6d48d2a54b972e7d4a77d79e7ee7c5701e7ea2bee7c52e4741c5120f748066e39e82446cad1ca65fb746b5ead5e974b9c4f318dcce8b3adcf71414fbf25ba4bf17d3ea06c5fef6e04ad32214fb9ea4207d09f398f6abf80e02895f87c4f7afd563a4a010ff88eb3bd6b2844d2d7b74778f8fc4b5e83157520565688ea2aaabcc8c95d2f83462eec6c3a8457f4de3aa4898f89ae61e3f666a352ae59433e51eb85b7e8cf4c8e7550caede4319e21d6ff48c55c716b9b9f70589445ae2a91da3fcc2435f02835b7fcb2f34751a4d97683a57c0842e5c70a3e679d1253d799f1e71f700247af8f3e5fc7892d67377f7777fea2ea5ac5edd024162b4d4645e6cd931dbbfd6de9be00a8afd9984582718e4f5964103509a0f4061672ca62de1c73810aae7e33ce2a82a9d38aabe577be8719af9090fc7205db5d688b47cc97aaad23586bbffb4a4243d94524a29ad2c1fb8644c57ee3970d5d1f7362aa9273f29a51359539fba5870e97be05b29e594de371fa493beed8e78586b7ec27b62aaea575b9053a44a2be35b0b6efd2f173979aabaaacb5970a914544b1a9ef52491a1e09ca912f2fedd6baaf0fb77b0a92ac0fb77b1a91af2fe9dcd5405f1fe5dce5409f1fe1e6baa86787fef355544dedfb3992a22dedfcb99aa22deff634d9501deff7b4dd5018abcff97335508787f90355546bc3ff89aaa23de1fb4992a24de49614c8f681367f126e6449d4fb2644bbae4ebca98b491b39b8fb3b6b7dce52f8779cc6d7c26f31ecf711ddf99acd99aae2040742f24f03c024f23b023007b11ec07c06e002c718ac092082c6b264a3e112c69264afe10988989922f04969928f941e09f28f943f09d28f905c076a2e40bc1533651f28108026485e3445102e8ea837c01fc0800ee215fc5c38e188c8e560ed40d171c1362fcb8a381bb195806eeb4f0ce0677543a59178381597017a58974d08fb62622bcb2bbd7f61a50f7da36ee48d8c7b3bb976c7bcde6b49452de48779f73524a6bad520bc395513a2a1eba8d94b97b37f3b0ab32b5a04e73f7dad070fd77f7d2fe851b97a0851d1b5f24115ff7dc7bf5d3369799eeeeee536ffa469048ad514a29a594bec93eadb5d65aeb102d1bd974aebfa6699aa669da96eba673e5d3e4a822002cd5004ebcae46bafb9c93525a6bfd3c017e68011244fa9c93525a6bd5344df4dfa494d65a354ddbb68dfe476bad9aa66ddb66ad9d5f354ddbb6cd5acb71dc7fdab66dd65a8ee3baae8b1ef5bce9d2f3388f2ce237703584c85b7025e46d01dee3380e88efc09510df79deb7e30e790f5c115144108fe26e6c960b519a8b0d2e44753a3c3a7ca0e74587872387e745c767c70a0040a1951d765c9898951d76887a90522c3048aa1e231e3c90543da8004e3f4aa6530f028811001fa71e0430675e66068dd733327c18c0eb9920ab97e02abfacf19ebb6302fcd00224887c192f024f2744e0f984089e5386c0130b21f00c02c7f8e23fc4bf004270f4d01f08f740a97f31107cc23f601e1efa1300cf685c040f001f4122002c7bc092894b273eb07c12002c7b6089850acb14965578c0720b1e58eec0d20b2cbfc0cec41f06bb130ffd75608fe2a1ff0bf629d8a978e89f03bb16d8ab78e88fc2ce8587fe21f62eb07f81e7120ffd5df064e2a17f0bced83f621b1a3364e093bfc9c318fe940463a63df41ff98b7442fea0fb7939cc65da6d74e7fe7647fbfb6b5ef39c7976b6727476361ad6d6ba81c5643633994c2693c9642c168bc562b15cdbcce572b95caed9bad991b15c72bbd1603199cdec668786d592c96432994cb6cd582c168bc5626db36db6cdb6d936db663732d63673cd6b76341a96d6d25c5a4d8ecc6676830383c16030188c2593c96432998cc562b1582cafc981edc858b3e6c86c66373839ac96ab060683c1603098cceec86432994c9603db91513ae37bce2cebb648aeaf095f15766f483839a18edd81c16030180cb66377ec8e84edc0ec4e9d333b7a4f3bbb37249ccf0975f48e8e9185b187915e3930180c0683edc026e74e5f93d64ce772660e97c3e570395c4e9471db376fa6caced99cc5e83d67d3c99d4d55b49e88b7d531864c23a12f35ed82a8422a99b3c8133c7fcf7d4e4a69adb5829aa669daf669e0b66ddbb6a5e1eed9c2f1578e8e84c576244d1a6c54e2b25ec19b9ab6bd94d24e29a59452fa0f64ae9fa70beebf95f4edace282cbda728af6b7ffe9546bef25d55ca34c21c1b4cbaf584a9ce3e59f94a19094528a5e7e0ed80ae84538471450cef1f2b07ab27a3ef284875e410fc240f8157687c6da7b495a701ad4faf796e7e99b33adbd9744cad1de55fb5b8453f3a7e3a17f7a73c3d57e7f3a4f780884a7a2fe743e3a8ef2ffacacd4d0afd45aab07c2517b524ad08f1e6fef25ae1ab8aa1255b322c2a08f2011d08782c8447c95665a7b2f8904561aed513cf50547335530de9f634d95e9fd3f9ba92abd93aee7bd1326bda9d3221c9d9597f1138ef1265c02e27a05a6f7e394e4c7907923a1240c03b3e07b64ceb4287a2b2b2b5f31eab592b792fa1114c9177dc5f257f0a8caba22aa3f5a91b2aebcc4b5be28175921c29d501272c243077d3329acdd918276221ceddfa713da25aee5900bf79884bbed8edd99aaef0bdf9070e3a73355d1adcefc74b43f092672182bf062cbee01d3d6fba4dcf99f8f29b8dba58ab63f517029d5a4d8a9d24220fe336fea4a82c389b246b8db4bda02bde50b2bfae8becb31be7cdef3c2da1bc8d1d38332f311ead29ef69f77b1b1f64a2f464a29a5524a4a29a5d2dd29a594fa9c93524ae90f28a59482efd55a29a594524a29d5346ddbc055f7f43d4e721c17a957c551f63fd89b79c8232727e7f3bc39e7a4d4f35eadd58750b54fd3683670b5e3529a19697e70bdf07046cb7d74069703815c4d693c9469eb5101571176a7175ef43c4ffaa455dba67be7d6fb6028f53fae97272fac979aa9aa2fac97978b8d8b8d8b162e33cf2bcd26f6c5ea09c47b4a3730884977390a77fe7e61ad362ceefeb8bc12ecf38f2b8a224878d5ebbe7981f7dc8a0bcc59aba615f1323e977809ae9e786f4e7085819f54d0256ad5b4254ef4749a2e4f27ce43c4ebbecea3e04a034f37b0bf829ab681abfd9b028448a2892382f8bcaf822b0e7c3562c1265e3b62db2cb86ae2ed1133e88c19d3e58c199c2708040cf9400d5c2979ed010cf8ed63ad04be8f03570c780e0134280d1ad3250d1a9c6708e8d9c0d591df9cb0df0726e0ed101cb89ac0730ef07c1db84ac07743803ccfe7f958700581b74a80463c4704a8035711f88e89fb791ea6184f9718739e2b43f01f7015855cf21cb8aac0736010a9a1e8be0b4a107c4781f7c095f4c07b1ff8c09504c17f21f889e3023e5a7181115800c97bee2e8508581720c1532b8a58e2091360808af7dcc1953cc112533029c11327588288021a90020d6ca0015b011968a1a0015b01421c91c40a38602489268e48a2829f4d9268e288201080440b943c00090620a08a9fe04ab240024830000143863880eb88130748c010341370c001123004e889784fbae025b882c04b25de7377d9819fe02a023fc1205233f1459e822b2388b83fc37aa0705f3b8f47b4925ef4f969f4b76dce34b5d65acf33ab5c1c135fec1381797868df08dc830b70101eda670217f1d07e04b0121eda1f021ff1d07e02301217960ec072025836f1d03e02b0640096515a80a504b0a4c2022c8fc0b2092c5780a5174db0fc4205d81580bd09f614608f8202ec535ad897c0aec509b0573101762e4a80bd0b26d8bdb002cf2524c093c908f074c2c2f38908f08c12023cb100019e5496e059e503f6a507ec17c14ad88700b62f3b60ff00f69db07f04db1f621f096cff01f695c8b4fd2a6cb4fd20ec2781a3ed1bc1d1430e60fb49b07d21708c2f0db0bf01fb1ab09f0122d846db7f62a6ed5381a3ed632047db9fc27e1134dafe0558da3e12fb16a8d1f6a57869fb0b8869fb51c8b47d28ec5700dba700b6df8572eef815777a3c1094f5e391e3e191e3f138cea1dee73d98290d95da4e55fd7b775ccf6bb0eb79cf7fc0695f3ff4fba5e645a6ed7ec1d141a3a346874c070e0c0d4c0d8c0c06278626a62646f612d3f6e5e66547874b474cc78d8e1d18174c0ce6066627c615138bb17979bdc0f68b8d7e9969bb5f725e7474e868e978e980e9b0d131d391a3430706a605f38281c1d8c0cc6072607462625a31af189847cf3b58849c71b171d9aeb833f43dbf5f58f565dc93a1335540bcfd2058868cd95405f9278e4ce0098065fcf0ab07f232605345807f80047e005806ec358e1325819f91d19aaa01bc03201081ff8165f4f002781ffea433553f7e89269c78153ef5f800bc8f3fcda64af54a30d180df814f3c9e874ffd0936553b3e890530e061f029e601f03bfca93555306f440214f039f049877f791d6fd299aa1c7f802390f81bd8143eea71bc693655377e882208f81ad8d4f22e6fe34db0a9aaf1448828e26960d313f1f94dada9a2f1f64dd8d49a28fbf661e092ce6caa60bc103f23883f0d7919a027dd8f0196b08bcd0a2ecd26ca3e76b1096390649c667c8461a261c3a5a5060e547843c78b0e397600400c4c8a071e3b7c04a087ca0701f4f06346cb0c00c8ea070218a000428200e162e362535d669acb0df7216e268206e0668a70436fffa5f5e29a2aedf794917e873ba6c78eb21d6d769ced78b323ce8e393beaecb8b325cd96ac2d5b06f82d5d3dec97d796b02d635bcab6b4d972b6e5cd96385be66ca9b3e5ce761a676d6fb96b7bcdf6d776d8f6d876d9769bedb3ed37db71b6e76cd7d9beb3270d6bcfd69eae9a3d5f7bc268187992cc488c7fe2c8c7a932fd049ec604f29eb11947f29e3019af9391bc67cd1332fe0112f81a794f97de25d86ce1f94fe43d691e80df011088c0df8840debe63030279bb8e4bcb03f2761c07b8fc124d7c9caa1befc4e770226fbfc1d144de3e43850ec8db9740bd12389e891cdf80876940deaec3612f2f1d96c8db6b9478f92416f071aa609e01bfc35d3b2c206f6f01c059314ae4ed344900e08dd861c72be0550ac85beea4a40e0f393c92c85be2f0782378f8031cf171aa548fc4ff90373e8ec85bce0260d343ca0e10801fc2c78f47c00f000179cb980f122680570f07c85bd60c218027e2c300be88374011794b5701644b0891bc254b46d208f17a47bf103f2344de1167e6837802c41c02fc90ff4167c8af86e41d65a00702ca3bdadc0ff2e003116f807850c87f3e9c5380182121101fe406c86c65f3838c003a33391a4726ee0cc0e5434b00ac1e687ec47cc002f0ea51a3ba49cd78b0e121dbb1030062605c3a5a2f2c1d6872c470c050afb0e6c68d8d998b4d8bacc64e761dec39ef38345c335a3258271a53ac048bb1f1c65e091623c2a1c539215c82c5a60aeb70b8149b28fb25d954e19d89b225d9c439154badfbe95eb8f365a66787e5467bb33b834b638cb4f4f2d0061ec155fe601ee2cf853f271e6e48889fabc5cdfb82a8b25cdef3c3de4aaba45028140a91483466e3e1fc2930d817e3bd49937c2d89822b9fa555144aab332c88ee85516196c5a4d562d530992c96b5d6c620916e92e8d3a98a5e5ad46cccc3e9e5f89982ebbde8f85a2bf6afef1124c269e1a35c13a2bda03c1c28140ac71410c7e3f88add2b2aac8fa3627fd44b16eebdf7d6ff9a4cf170ce187f42a1dec2ee8555144a07de4a74e82f1887575f724479711cf8a5e561bef8bee0bbf1e034bfe4e228ef4539b25d626132fe64fae8269b0d68d16bfb5a36da251e4e11cbc329a2892f3726615c98879b136ef7272f72bcbe9b03d612893eaf1c307085f2d71e85fd35548e170a85caffe45ff86b3c9c24d2894422e5d0410e1d780deeb62d3dff743ab5707051bf2f2c8aae58890e1c382ecc53fe381ef5dabf855dd65491601335dfda8bcafb92e69f5e24588ddfb6c6ef5be33729c667126cbee8f54f22dd8b65e0e0757a75b16be29231be5618ca7875d1481b162e07a414b1f130cf0197bff11cb0f130d2134d29a15ed3a67f4d3e27315ec657dfc62b997197b7f1455cde464e22a57e921befe2455c60de252b99a99e37921b0ff35b5465c5493091e825825d188efa38fe056f25fae545513c14cd2db6c8f1a81a1d502f0f73bc0e30255be819bf452f12ec443355313fe78daed5fd91b8d6f256a251ef820387d7aabdbf867a82f2ea9e494c482d1426d9c0305eb00b7b7947d920be8cbbf6386eeeb6b097288aa770fc7c11cc53f505864265cfc145d5c7f13ac29771255ac3a8271ac7e33015e1f237de0897bf817a236c3c4c96711c38bee28d037b0e6efdfde19d0476354ac747d05f47f8a8f065e60bd621c71c1fc1558e4c49ffb5442f58e969bc0d4c63e7149ba8f92e98049b1307b1d3fc5a7eda44afd34bb3b9e17bd1e595cc541beff2456cbc4b4e2245fb242e6f23c71b3b456e24b1f137b29219ad6697b7217a9d5ea7282798a7503f3d8f9aa7978727989fa67838452fd14b529866437b170df5f52fec4eb931770dc7cbb86b8ee3655c43a11e8757d750188543abd571b83f2adfd8855d1b4f85792bd1e1cf3bc5c3f065fcc2a6ea6b4d18e17fa14bb9fe2d3ded4cc1edac9ed4daefe3deafb81cf71b75d9b8a172f97d757c7a035b47c9b781afbb60ef56cdd2ee9bee91f17e9efa2d7a7ecb5397ff6ef9744b8d16c578dfbfb019580afadad6c26c0cbc2de96b6d7b617afe8804d3f345f8f5da530b109682ce44af2d025f3a094b6befe1ce6a35db6fda87e95823d3550ebcd8b2c31ba594d2dde98a4e4a2fe9f5a4135c497a84fa60563a29a5f48aab49b93356cd531504a3906dd0c0219ba62ee8ecbb7c9c91369b1290bfc61bd1f22e9903525aa411353840f3d7789a4d45f2d7f89c5b641355f7b34e2dfb1aecca9799f64bef496c1ad17818c122ded36fc2fbea4ddabee8492f48e9b9bc379c24dd3ffed760ffa6a7df7d9cd92db23fc5a20f96af1c4b8ef185fbc79b8a1a7d64c359cdc05248ad95f03eb2e1b4c83621f4e07a94b2a9f430af646646299b1250e3f3177179989c444ae95d729ca819b964278a16a9f12eefa264869ae48c17edd8978c226be416578dfaba0f4322b9e4969cb7f5187aa6e0ee162d74fd8982db62d3226ba1e2a9ffda5233d3f53d0e23f15889d23f5602090fb917c5740b6c89a3aa2b4b9a16598bcc535dd8d2d5a5eb3331552d2e950b47d5274d554bae21d257dc231bce910d476f1bce14ac68e26871453bb248f7b9cb73c3dc949f3569bb59b9d94be23e4d3e15eda45e92d21e1374f90fee4a2814859597a98fe02af5327e8acd3f995ec6672cefd5674d554be9e32cddb0f1a7d80cd954d5182d99f1224fa31c8c0b05fd9639239a108f583030648c9f4df4a9bebf65fa56bb896609c37f8addc0fb5b2f10deaf6db8e4acc545e3558b1697e74fde1fcdeed1e2baf353a4ff7c9c5f7167ebee8a43b2893efc2b0dcd71989e668c58d187e9eb2341136f5a643267f4115cd9dca7d89e70ea29e6748bac45d6226b91d937e19567c1dbcfc0da53ec694953e70c1a138c6701dd789a370d23e84f4b2944147d2c582f68fa30f22403fd1b79d3c0294ced0abe78cee20bddd162560526692e0d1a24d2fdcfef16d90ccc824d187cc597fa54f3eaaca20517930b1b9941d715579fb0f054e9eb54e5af251cb58d209fa61fffeaf7e82ad18ea3eaff7b9acdfd53cc539faecf9aaa8c8aa16203d28f94dec0d7e25214989ca251bb6976d32ca5f62996533cac513c84492a928a872e4f7da52f61a96d60a951787f4bd77f2c058d39c5407a83ae29058c37684a414771c9c5dda20a69a2ea8ff2965a6849a5877cc957123e24dcdde314ab949e62a094ee834b5fe220264df344a2524a73fff39e3bfa6f1757c7c37a73e20be8c443b0c6c37afa08620cba388cb7128d7f73c205ed481c5c6983b39173e840c2701774790a7ffd9b137dd8af7fbbb83a53d57da5f1970cf18784f1118646da6a9e78cac6d7075fd1c78daf38a97c8a650cf312eff81d0010c3e39158cd836847c61b61071cc343cccbe711c323ef706378c4fc7f31318afe65c4e0b9450c0180a7b07a873c6f62f80f83974c1c981df0bce1014f61358f3cabf0c0b34a7cf9dff13fa5b0030062e6cd44fdc3609c19c6511b41c7b0814f58dcc027597cb181e9671cbec43a3cc6527738c723b11a07ea398cc46a1d5f71bc1c18f5166bda7ae0a25efe0bea25ef70512fa87f54fe8f6144fdd77f16aa51f814431c780aab7364520cff43bce42300fe3f5005cd4cf8defc2c9e3a0726e9c05358fd9245317cd72f58145ffe75f80745987fafe6c050bac781a1a03069a2fe43fcef6937befc4b29bf2d30a0e98bbef07044e36195f111dc443b1e566c1fbf0dbc95c4ee95cc5059247f979348919fa4fb9c6fec14a9f1f9734e92bfc60d1d4df32e6d4db8dde7154945bf41d7c9e624f3900a13ee065d26fa35bee53b6ca2d95444feee8d68f91adf7dfed9c67133cfc19549609afe86adbdf111a412e3b747e64cdfc8281b4818fc1bde3770347e996903479ce9e8453ba22f4634a3259ee21e7bcff21b749d62272c3cdca718b5ff5e47c15f420eba90d3b3a9d0d49b933ee8c4c30a3ef9380dba5cb403ba807cfa14b3b9dbd34dca975bdd994bb821afca7f289f87ff115cd5f8ead2d282bb77c1f96b80b7864b0bf5ba1d0fab0b2ee86a724f8f6fce54e54d9b517ad0053a016ba6cae56bcb57926e714d957cdd0de6d5c0ddb7e07ca272c2e254df0bc991c9059f641355bf059f6a60d2745d169b69eea87dcfe268ad8da2377d69bded29ea09de525b4a375bb9f0b0ee508cb7d5ff1567aa648e2591f496c5a5dec966aae28c7c9afc499a69f567aa40d7cae95940bff21ee8a4ce145cd04f145c993355a7d844d52d77b4126ea8fe7645272c5c1567a85cea7d5e3739eb32829fe7ff31f834f09e549881f7d5d9aff729b65fc37be2e80dba38bd4f31f0061b44a3ebb3e06d4758b4728aed6f7f175ce2d7037e244ee653ccc32adac111d5177de12af99aa8fad63551f5a568a745a6657137e802639e924e5c25da9960ad82a3050e958a8305099c22da118976be245cd03555d20b97aebf21e14a9d2e724447d0b8b89bacfe29e6a9edeb9fb03855299fd253ec143bc9ba16d7b7b8768b4cd7b79e8c1c387d0b7134aa84a50a5752b90dd080869b895f69ae287fe0b7f5c0efdb011a25557020c9063490012a3030c5059058408a28a0a800052670c4c896c0131180c0039c68c2010d606209062c4009052460f4798a2505e34931be9432a54e29193f2345e37d8892785067a2fced07f2b6d703795f5207f226e5fd4af20eabf0bc26cadf72206f7b2f89f41f52e1c19928ff587ba7c8fb922e9037e991e4fda105f20ea5c8368abced8522ef4baa40dea4a740de3f81bcc3239fd944f98d3192774cb8f30e5f02793fe989bc493702795f0864fb80bced7522ef4b6a226fd23b20ef6f00135736517ebf9030fe314be41d133220eff01790f79394c89ba4809c8011c67266095be8e8b8842d7062745cc216301d93fcb61bf87d35f09b9481df4fc5ef100353fcb617f87d91fc26690b48f189e2b785e2f7adc06f12057eff0e778ce63e1ad977939ef8fd3bfcb41db3c307fcfe4dd2fb6a076cbbef12fbb5dda1b631dabe68c8cb274d557ef93c5a5e7e8fa9727919b3c3fd338939fa6d75f715c087212f5f871a2f3fc67d68f9f8a37b2261fcc17ff7218897dfe23eb07e2688971fba0f355ef65080975f69ae84617a09ae4e25182496193464c020b16cae98f69769ff24795b1bedbf81bcef4cfb6b206fd28df6cf40de8fa3fda9c839da1f03799b4d912f9091e46d66812c45b62c2bfb4491a1c815c814c813c847f28e3192b304f213f9662bfb32078b40de3110c83b7c40deef44dea426f2be0ec8db3620339197c80cc81c6c01792573394fe48f4e89bc631490779880bc3f89bc49a3bc2f286fdbf940fb7bdd138db19d01753c1e50c703ea78401d0fa8e301753ca08ef6c7789bf1bc42a157e8157a855ea157e8a5fd31d6663c389f8f07e7e3c1f978703e1e9c8f07e7e3c1d1fe18d7998febde8feb7e5cf7e3babf63fc31a6339fd954f97f9fd9f7997d9fd9f7997d9fd9f799698ce7cc65adacb056582bac15d6ca65ad5c96f6b71fc63e7365f70bf9636b2261fc6362c2f09f44ba57a6fd7ea1fd03af07a8d48b972bab1e64884600000080001315002030100c07c4c2e1581c07aa5e7514001189c05e6a4896c6491454c818448c01023000000000000000028ac3a313f2b2836068880c3fdc6fc2ef17866d8855019f2f05ab43f12b5a75de779abf8175130f1e119191c5406e022756dd4287a2cbf24e91b1190100d4b28f5336a4f07102304084f638534d80ffbffb17c9aa55224c6fd67cea55b7cf231df060d3d0737fef1c15e9a4329df138939a82e0acefac16fee7364314acc4d398a8cd3e83f79e106585ab5ff74d7444e25ad2a5b904864124a4145702ea710773cc512d57c7b0fff9b6e7893c0e68dfad89003c0c505b192d7367901ce2807c3c51d6abc3353122acfa461f9b5e150216c3b54408799ffc8721fd38d3fbfcfb223fd235488b5400ff4bdbefc98ec7a7667d479f853e73703bb95f3908999bd8cafdf02783609d91e29a4fc58f0e0b4879652df0b28c4f8e8b005554bb90d161b0af5037e0cd65b33b217970aa742c41a52f9c73a5be5e49a4f80d7c511a1f1182a4447d721a6fc9d7574d5e5b3d5acf8b0d2f021b8f8aec3f0049062bfb38c50faa30bd55d7ddfad6dc9672e00ffb19530f58786bceec8f3233bf645ba0ef45c4c48a6f4e0085e9188ddd9abef2db2d33a5e7826a76bcaf95383afa4facfd073e49475088b4d5de9feb9b5f0342f3959d1ba1a3b07ee59af37f9235760bd004573308780b4726d0457cba260b72434a30d27198c282a461b6141882d5af02d8f2ea8f61e42782fc434e4a1d67155e78332c1b93001b9a10fa116925104b5968a643ec8862adef3ec884222136cc94bb4dd8cfbf496a85272886323e39c89d25cd0cfc45c69fc08659d5b62b4c61014e0856dbf8a349658bb0b9940134ff9cd87df3fce58ac2200f6d36af2fb1ac1dc8a6e72fa6b4bd79c29040d9bad95446057abcfd2cd04c8979c100e6378ff9140516a795100d156f5900e91fd130f5227c0737db49e7a6c0b6673971bb6abe134f3270ae822b3ee2e33a27213e5b86313b4e3b5fb7c46b9eeae95feb8fd2b60f816ac103ef9602ac53577d4f9caf4284bc4ade1e2052defb11416821e0c56970f2718a0f656453e1ca2e6023fedbf7be03e4b4b82730985eeea15cfb8bb2ac338c9981b944f09a79f8aac80782bcb186ef82641331f07066e6babb801416d2c8d2b78531e22bb1e13a92ddf6c0114464d5c9a81104765960827792bf879fc32049022ce1b284b9b06f66e5e8e6e583900ba7338ad974a9a78679752760a485cd6204b8509567295d019b7e08905a31f417ed2a3afe6444906c5f6e4b28ea55ea740d21a9af967b81136a8c09094c14c12e5facfd81a509d8bd72dbae3e9c0ca3c22feaaeaa070f7c624561545ae27674d3b9a124666a6c4aacca7e234b8c84d5788fe17f897f310ea5c5028f2b6e1e7ec284c2e85c86195dccf17d9269cc719239e494f5971e2e505fe855f3676e09611ad0fa7520b811976d0f4b12c1d7598c26d171f3784ef154733ac63c1685680e47299d3d560b9f6147f301d957e809d5040183704f7650eb3d74914195315863211287926ea2a0d0d66aa7aeb11eba1ba3b5ed6b3d993c36dce4cb6b6b900dde22790aed695d041e4a630fb5a28b74275e5dede2ebaefc0e7c639d4b8e9f52c0c859ee0ee58d5d204166a08b9b1d72543ff109eb0bc61287a39cade1e84a44266906cc90365188de19f034b3278ec0912a8e15338de02f90a5727a6c163b0fac7e488809292d800184a964654e1b0b98865db4f2b9e28fc1d98a57cb060651046121429597dafc75c2ebbecc18a6531e6d978f95a1a800d70989ea64abca14e8328be22dc209e9baac4c3db202ca8ca74a5a01697ed7c8f46f66b4c1516541197959ad61533706fa9851f87ccd1b9b9866d88bb5f144bc84416e0cd197652a21bac9510b0ff28a6fa5147fbc7e065c4ad6f048d9c04ce451d919083183e31ad2548a6e9a10527007957c793fe4da7582c18cbaec3c10a8ed3d3c0b438880cf2367d20618c432462d8afd79878ee52a3297686b757d720a54ac69bbaa4e21a43fc97c3227b1f46ff0138561f9cd5bd6f3d2c5c579253af0acf8d7978b1b6dff0a1f0378e45a8f422b7b79867f01cebcbcd24398025f16461ec49b61d909041bf3d2534d3fcb87cd3714f4350ba049768d61eb3097837a8b5efc566f8944bfe08da005fb3187d4618236bf9bc7cdbdb2848ead9fcc4f2c7e8617a2c7da8a9a6482bcab94039731e3ec7a277316451d15c1da1c96fa9397e7342a18e053d7dc4d5ee5440c103c4d1a6ee52d04c2d09a6a6a2c4d96bfabc776b3ec8acf977b1e6e1e5681b4cb2840777f4cb54cd87ebdda062b782a7266bacd1f5c7c1a583ab9eb72478e5804403007ba9f88372cef06dfc05ec5b0ca3c5cc25c2732d6062087b905baca686f453c08a3b9e8a779445cbfbb1554f74104fb2a2db78219b594186ec56e0861a4596a544d45fcff0ec485fc25e43a2e47b02c153a1df62dfd373ae8c379c05dc7b2b36733b208dc6d6631801e4da42f733655699800ab076cdca99745b8b8c7ee88ee3ee2fb84b6f445033929ae4b0687db7f696dc276eca26d7108168bcfb80dace58e471842a65ab0d9d771c1f2b96f011771c888e59663444a5cb033412c88414beb371c9701c8168efa1a8616af963310c1dc4121a123edfc089a6dd849beb8bed2a0e5191b800fb6723210bd890ca7e4ce9dd92d86685b077ba22c98fbcb0c84406c1963073edead94c543a602a34c3b134801978567605847b5f36f76340c9240a206c458450fa6543677c92a10a01bf5983f311c1a4f6187489fc62c97619f8da70118da42d519d90d7b8ef76b2529a496978b7430e59d90906934705c79ffa4015b07c8bd3f265451d7e3cf5271270a6947c6952a14211c4c0e8c1b9eaba80db9777925d11878202241d66ecdc691faf1ad33bb96eeaaf4507b1769ab31a376c44ff5494cd9e29f52e51286b820c3cab027904c14f186617fc44bd761d2a20e8ce62dc4744a7b98c89318128f53c160360245690422d0a80f1a99604fea1e0cab6a010f330c6ddc89342b4a899065f21e85ff1e4626a90ac222d1f9d1b505377dfd5de7a5811797d8ed1ea64c396bc60f22166b64df0670334e145c7f2441ca1fbf8edae0e69b934a91a1d6f3cef75d2bffef7d0f27fbddf22201beee9582a5791f561dc9303ed885588db1b01dd474b71585e8bb90eabf0dcf5b773bf20879087fa9d48730f246482134ae92e809fb902a7867f6e515e0da6bfbf3c0caedfe9af11474eacbecd5195feb2929f77f52c34b358115c16a0c48b6e2b129837ef8f93a3c3d2082241ad41e0ab9a054e720a4c5b6c94fc8fedee29628680a92f532127c24ee3a32a6526ac316b1ef29f0dbaa64472968871256d0751ea5c6e5d6629873c6f626b1f988137e72c2eaa54a1ac2ebd1b6d144979301432132c4945d14bdfb69fb085e696319c031eb77f7f426ae2ca4212601d335b4ee5f33e41bfa0afbe7fea69c65e89e5964a4297208a3c4cbf1a8ab961553cf417c6dae8c85962a260d140180fd95ba180436fb7d2d18c39ac81aef0dd6c237f8a222c32de9020b7ac7308c5c10bd80d36c26a132c577cebfc26f274aa62f5f40e71d570317379e6587f273a11b272b3440b40c0e149b79124c3e9e6ea8166491b34bc5542130fe32fb5eaf69d5933544a1834b9d4f7798461614c00ccb257275a937d07f5a1fd1050548ffa33c6b66363e5ba9d812e1d59554541285639848b93f4ad74dd413c180c0235882631b0cf17e1a8dd95ee2e03ac8f3a0ff396ba646f898476ce4e73c3c77c34511af4479f94fb29083f06eaafc3f88d4a261007ccb9feecb3b05b29b3946c62afd823ea71755304e525a243e5156eb892b94039764f8f0f386dc0b063609ea0b2b860f233804f6f611ed1e3dd18fd35ea7a24edc70c3a493a5f204aaa5a11fff701401f70a4df9c4974c5146e6753f63a3898d4e7919965883d5ec1e82ed9c1a1cdac3abff4ee7df5c18cbd05fd86ed1d3e395ed2424ef0af2b2b04f1f5b46cc19c0077772b14cbd6dd28f97980ce3c98475e1ff16a4204639b4d4a7c2c8de9b3b690f238a57a6a0324a61623b665421100c2c4c7b12abb0e8b4a214cdfcf5866e944928e1afff753c7a21adf72998a4f445256a7f5d837c94de593513d4d6b95b2632b7c4433301b2b3eb57c65ea261e806986dc5033a78df61a4c3a1d0e7cac64675a717c3dbd8cd1881d6daca0c9d0e9c5e18c6b7c4bebc59d75a0b3071467ac37057c950f6581d0011191e2362bc85aec3bc9b16cc183885ff49301e1037e863eb07755928f9f9c1fc055a4471b81787f742eb2a981b320463a27996243b16a1c371e80c6e08fb268758aa178c18296fcaeaa185c825d81499b73c31151b1d0d2ebd992aae2e8974a9cb39042c2b7f44a893dc4712438fd78423a9dee813ed40296d74acd08b026a24cb17c22ba1cecb68f1fb48d001589b2d8f1e46465f6e8587be4827e698f2e5bb2c32be928a588fa7ba41b18361164f46536da348dc4792d7b0281c433da24d4f055e077423d5b844134c12dda1a3bb7bfe2229f6a8f953e3620c463193ab5ba5a46a92476d9b08c1f76dd764f29c76859945cc66369ed7e4f0939606136eb78eb6d76a53de9ed5395c6856a01d1277c336c555a484f6684aa44feacd1f428c5084793b62049ff7291e620455a75be9e0ec33b7c26f6c677933fc5860541e91e16fa3948ce58d0087cf4465d46a2d491f6fdb7f0bc01de7f8b14e8a12ee42773da9225cd5497f6f46a37999cfd61ab1e40c164c9c58c2168115ea8d6f9ac5aabb9f799ec123b1f75b3cd6528b35342136da4ee1ca16eec18d5c19bbb3eef5a4d260f91026af79ad2e02244508f00488f428466d0152dc00f118ca5eb67f6e98f541f588590d9cdcc2801faeac0143c515c269ecd76149dde6f6b6896a68e788113dca3a42b0e891253d5ea41a012ce35e561791d837d4778421366d18dd4b60b1c958277d262373ca84bfd3d871cadb0526cddf52401e1dcddf54a15c8783cc32ef289884f4c231a64345dbe3527948183cd2cbb0df3115e62f9b25dce6caebd4edcf54d7ad95206ec38a82ceb1b222b0b16234f3e58aea3d5730a85d7df1ad7d094b51b096cef1f94f05ce7ee7a5912fef28d9793b2367e36e40107a721171e7c01ecff346bcf2ab681f7a66e08c3c81c3ece89a368fd0e1ed9227f564d9e652babb87add9bae75e01bdce7244d030fae62c37405b143a1fe776805279b40e77dbdfabc6b14152efc8873ce830e9089a94149e41de67173155f80c917b047ad713188809d3637f419ac7d68f9ec71e62f586f5642f85aa89a137b0f7a36fe0b5ff78f024841018402d976dd279e1f2c9361e0113e2e49bb32f1a32606b5ccda35ff9549c558f368275f53c16672a596d19907e8662547e24f7996a20d1ced8cd781561764af54e40dab4437901a5aa8eec57ae8a016d0afd42ba9a035c28cbf0034edd4b86e5ff904d4a2ebc2f711833e7e6a7f6ad4d111b4c606b1934db1162247ac60c4ec9e69516130fac80e4db681abb03187425a110c82d3150f0ec6c90f2e0767da07c2d3875ffcfd0b4ab7f0ec67eb19097cf00fcc801840e9e4d32408d2e6286189c8c048e50140ff6455ad02d6de983521359fff444eb07545e9a522e40b175545306c47d8d513bc415c283a8c64e45bf7e63b14d6741c6259034b1277c1a805445393753f820d0036f4823e3791a0d15ea00ea61fb5e97524e3167794c2615f3b4cbb02313152e6c22a02c40abe7f311c8fe82f026382b59bcce158eb42a10c444e3190c6807fdd50bd73ddd43fe452074988fa105ac652d0d6f75884e831a98673c68e059ea3870a97f06fe05fa55001fc51c2060283997c2e605fa6ab02cfb345abfa385f7200c8be8bc65e2a70ee6831fb9b4ed9827b7c781c5b3e3dafd72ab06f74622391a4783a8d74808b3405dccebb52852ba8a2ee32b39439c1048d56ec2a0cd2feb120984d51b4121f19bec352699a963225f34f5dde182837075933bb4030509ffb9938213dc14fe97dae3708d16951fac3222b02351887f8039d01add21dbf58681d03780235715f648c456cee5d2778ae646e5c6af0f4b7ae1dc5ff7b6580ea143b144981e7c1b5487d0f8db88139ff1e1c47d67c442b76e305d55396f534c977f613f965e9ae48050965f27aa3f58e3ee9d46ca2923dc886daad0e3263e16563a2ff6a9438cc9c4aaeb3a6bbe2599383281f97a7a0c31888d2f2b17041b9933252ba458dfdc9d15937e562b2f77b04c73b840312208b829148bf9b06e89904e9e2c321b41477fa08c5bcf869838c896e8f2eeca59f35790d7b591befcc51e6d56b66de614c1f64bba09f3c072efa9350fdc31894e4147f397ea9dbc403cda5828fe49b4af003e3ac04622c53a3381d54b0e4d0520ad03af789275a3bdb36fc29ae02b190db5901cbc4fd92fa86090f73d186c5a6795fc92dac735148701888a9188530b6a0e91cdbdf939e8d8c24a8605e3d38192a3f8d445dbbf9423f09afbbeadb290b3b12b6210ad8fc9f6ee59218ad3dccb0b5b18f3053f9aac1471a551ff5901c12cd105bd6c259002ba4c45a354a31def590fd5eda92a117b3fb9e3a659453eb9a34146bea6262a02dcd3218a009c8e3015af17fc96555e864e9eda3b107aaaeaa57d67bc9935d2889f2177fe54aea603a1abe00b2d37e23d5cb06308c6f06adfc8f7feb72b741c075a5d4fbc6dd97f8cc0da89433c1fe0a52949c76c5b365d2a15c703ff71dbe29f60823396871cf698bcc14a800452666767099fd8d3447abba0b20f7b181b956ae196903197477ac641ef73429d439af383096ebbb9a161174aef7268c563b9f4047c2baf6eb4fda043b7b543bf6ba391816b23117233002a143ffa3310c8431767a36037f667ca258f47df9f939a4b415b880fc16556c577f4bb2a10b5e0be52805f38988280fd1ce799ba6e902c9707231548db7beb5427f09f721cec969224b754358a54686b7704bec5b430bd2a7253564ab91b299250cd23fe3c42a48ee5fe72f7ab0c0f1e2c2542e0ae831c3286f61293aa4647b896fdb9a99f07370e08103d55a33dc99f448ee31ffaf5344944412f35a10dd1035cc50f81c6179ebf3d83cb8e5b203806212eba0050d8d119185c3c276e3ec45d0a59321a4c3f8a19651051f23b3ddebc1cd255ba3ea420ca0139ed12bcb938cdb222f72903d0926c8bdcc12ec143c31343db804ae13b14b23ddf8a2be5d391483c91b6881311cc13acd644a194be85ba03bc17499795f567b085e99b0b3d89060ab64c6076fee1608f5715bc7d98138881ee14c480b240f987c2cfcfbe6fb061e0f286146f2300e81f9073824c8dfdb9609d8d044b9ace69c1a249bfe9a60ccb5e0b682815ee8b3a3596c56e9d7051b8828da2a61a1c4649598673b18599544877a53034efd7b6b3e4245b3696faec0ea740f23dedc0e784d43d0bc668acaa16864f643216c5f7094f30969793f0e43921955b08633d1c8c5c79c30ed57e275084680c8f9d6545377a834f8ba015b95b62a86bba508310b5cf72bfd4a221027604f5a92348bf3ff1c4be7bca28216a9309474069f777e0238cf805b8b303e77e41a1ce85fd20391a8fe857ecd237d36b0fb7429897219dded7303935fd861d650e1f6746bd03c69862c49cf86a2e10fb9dcde3cfc56a49000ce4b496434fedf2c8cb4593d4df17149d531077348a1040e28dd38fc661131e5753fa878af9b46f8f8dc4a345f17400daba5e22c300dfd9cda890e3ea66b8121a244937767c663567acd4714c69403cdd38790a03a214e3bc9590d838f9f2bfec63426ae3844b08813b5964085266c0effda7b1071f29ea019f0021155421fd49312404d880c6cefe62075c2201199a9c03b9d3ead906aa620e16e99e7d4a7d348ff5614cbffc9d61c89146077525b1d848d7ac0537a8f0d7574e9706ec92de678e197a64d1cfc127f7dca5fde5d6ba7d37890d025920a8851e136080ebfc004798f4357582fd4fb601fd877d266d180cc74be8ef1a5813e2eeefe320b4dd45b516348fa2ea03147180c9c0e532065e761e173d4e4d91aa89e6a0395517771fc1e6f834cd4d82e98a5c6d956a760f7fbc5a6ccea8e8768f65b937de5329180b360da6eb77b5552b670716e24289af955ca9108f7a502c0e5e3477f609628d24b19a83972caf07d7bd44ec87d1fedbc1ae89fb810b6e5ac68bd9678928b83ffaf8715ba5326c13c35ab926da85f90593600a67d35645711428e00ea082f99310f45f9dd620296cef4824f95be5611a630a8b5547c15fbce005a2c22b508107308585d8c981f10decbf5ba3e62d56eb410573bb96c27f4884dc540481aab0ac0650019b22705a69e9f3dfaeea80d7494f38853f9033494135949a2abb7b6e5a6139a80a37b1be03b434415cdf973f4c6c70dc117240ac22c11738207065be16599f64d413f93a3b60b73f7245a1787df3032aa56c9f189858c3e95b70e02cad7b9940af2e61d1d5b154d67a34c905e086a5ee5170c187edbaf34254d8f038efe983d555e181e772a6b1fd97a7c37cbe6f6bae0d82e79661cb8a15ab4f5303b4488dbdb53a6d16a936894a73451a2f50f155647ce6e9768aec4f73fafb8d4913560830e232ac62f08bf8bfa8d8886a11dfb654245644e5874a67adce293e4fc4077f541bdfde1c5a1e75f5646c05871f97e20b9c20167d3563f0a465c6933531b083e8efa5a25482ed140093d65f3b638fa41ad62e7210a98b511da41cd4ae797b342e111c249ad61fce8a0133732fbf49c7286869ce6b687e1cd24d5538adc55b6fba7c4d0737c929a310a6697ad2d4f4dca2b17f4d603b4a81e9d6ea3c6ce4653a9520e74364d09de1f76f57e216461a33393384a76c4d3b84e7a03f93f19df2009435254f35f1cc748019bc1703e06fbd4d6c2e888e84b7814eb3686e023e7b7df34b801633ed82f4b61356aaa783021f986c012c0285ad81ebd55b1571ede6af80ad9bf90f93407d6a96fa506e0b639f865ae65f54fa8a3671fffa6a64fb9fe6ed0079a29a73ee2cd8a2c629de3daaecd2665a660290a38a01df7b8f6da4b33279aac8d20cd5584855538fdfe47e87d16f39ee4998f9bb0354b35d738e086d4cbfa03d89dc9ab03bbf12d7990ed91dcc3d9c8de668bf1e2539c25a8f672676fb74c36cb9afe6d52ced65adb43c15ca5a936f04b63d495781e706eb6aa14176b318a7ac894b834c177d70c859cf3c0f6367e22b6e3b6f56f540c9fb0f5bce6087ed9393b1c649d85373ce65b087a28aeef02a3e1a29951ef4feaa0f76bfbaa7fe55e5fbf2669f25a13b53e4d1e25f57b6e46ef07129a734f660c1d41771ac1c8811747636f665a943cdfe42a513d2443db7a4c6c9a10aac856d4952b73351edf4c2803652edab701016d5965bda1afeff856a48350d46fd7c004f09529f21fc830aca7e90c355df268bde7179d4ff73d488bd92543bead1284b0dde8592a3da4237213a16af661b15c43867c8184e4c7996ea65ddd8cda8876b61326aea23326a8a3618706ebbf845451831ae6bd786b3453d062735d28bef66a9a9c44b4db35354b207cf1062f2e8903da120ed15a3b2b9a2acd6afb14120503481daace3d3e63c6d28c7e8844f135e9912bd8fc58ef9d511a5ea1f32892642410843485970e321863f0cf0dee25c9d074b998cc0540a741ca8c4ea01d5e9bc1808b889ac447d12be79062c8277b980a944b7bd14fb6565676e833ca8aa916fc05c383c2ce65b9370528fb34c238e93eb294906a822b7ce09c112fb02813e47f99e0d3173024e357a3036bd9e1b2ccf964cbc8cde274b5456d6c644c2797b25a163dcda88f0f0fd7c3e929a2d393bde682ce70d605805748a725ff3276087ab17a51a10e4fb1cf03ff7b25feff5c722792f27a97cd4eb908c50d134a6a9c7f1ae110a2648d1a91012d5d8eee03589c79e74fb7d0ed0e1ebbf9f2f8794dcaef61d2089fbd2368f28a0d4b7723ff3446b3bc904dac26e8c1b557c8d2aacdcfd4cf47506e731c11eef82ee389ed5515351b8967b98d28827412ee1cc64ff0b4dd3ab606fac90ddcda9487f9b498ed6a842288ada9e808ef48c86af8302a848b55cbf7938ae8d1622af6cb9b13ad4e9e3fc3ba2dcfcc8badbe1e7e0b7fed86b57a3f646f34dbccc7a5e3f008efe45ea1a25f81383827869dc1423ac87736409045da4ff5c91e1dce44a962d40ec5bc49bd2ce9b8b3d564ef6100493c2d065fe4f0489ae3f5376510fe21d899f4c8e3f611fc2d38714c46ffa2028b689c7b125c7d840f0ef4afc38305c6a9d028d54e1a8dfd8520408fc3ab19d044c9c66b14ed5e7bd3029e52a12fa9493b2675318395eb03deeff74e3824c69a961ae17e6a8e80435304333ae11dfd59489ed5ae37da3a9c4c804f47dce19148a08d273c968bb1f9815abfa475397576f92025c9684826f14a569270c087c4abe78fdac500b39f2aef8207a065e356cf4a265e438d4844e03ff728a619245d6b3cf165344193a0830cb65b1bb770719d4f419600a741d20200b62308b5834d6bcc8c2cfce72534cebe7f40821dc6a8a56e58d526abced24dcddfa79276bd11c294cf8492daa7a8db03cd25bb1f5454d0cad1dbecddb3916b9063dd03e3ef8b5e4c9e0dae35bfe504c60412a15f1357ac284633f64b2946dc73a6dad47323ff9dd833a44e67dc6f55ba9082e1574de2e385f8fb4d768164c88152d5fcf82cbb59aa535e3cba8bcee78795c01e13cc23d4e80ad12a881691efef27f739f224d635c90e101ee2b6304ec4775145c7643b1609d85d54624b880fe3689eaa61e3f6cee6ca742f77f9b50ac333bf3a14639333454846e2245ad4fb988edc76267efeab148ca9101a5371d75f57376f1305225c1f0dea30e5443eb2b223ac4f401b762f9d1c2f416f3e35c88e10fa66561e7f36245d467a59294fc8166184d0b5e52c8cb7be8e306b777dbedee535001dba0cfc750c566244deb798f1f73a398d9bef299663a1332c9e28b2f0ffebb84c31f20e75a109a87eee88d56b4fc3e96401133547ad1d14f7f62370b23ab1418aebdeb406f63ad224547ec3e7029869fb5b861317ecc15b13eb570ff119d4507741a3da3c5909d63b94d2be3ee6f876eaebeecd577a3a7085fd37c024353e888e19fcf7113537d9b5b5f04e915dbc7dc1673035f514d58c2dc8424b73f864e53f8b0ad405dd762a9d23ecb4d8c3fe73ecbf4e2969bdce456972d78f3248096b728ba943baa00d216bac1ea566fa5950db43a4dfc9d71434ab0c55670f683c8bd64278b6ab98622a727c69f732bf60f40964b178b8f5716df5202293cc6cb201e172f6248f09ef4b8a91bdde266d738eca8754e906fa457c241066cb251a4a0add59cf3ef8afda6993e1b2ef137317a47daf5622002b8fedd99022c187c0b0bf38ee3b4a13f9a544b0d89ed236ec5f0abf55bc5f344db71b57962965e8b71247fd551123da0fbef20fea39db5e8d0eea5c4a9a0e2f0e4c3ec00275437f935b84d63a8403e75d4feb9fee1151ce750ec665ed843e8b58bcd7d61e4d0c7ed6eeca65bbb115c1571da6a0bf335791af254e172e3ac1268b2326cfcbb80b7b0f77ece447086feb2e66c8013138b962f845e2a77a04c20f26a206840d33cbd96f62b872a314185e14b869c070eefa12202feeb289f8a96b2eaf71e2ce36b0140bc217740aef6579ef2d1a078e5d44a1bb13ce5398782bf1e048761ee088c5cfc7a2098e024aa07dcb8b9c119371662cd4fd356b224cfd79d1c0fe6984940f1fd1289c7aafffa57745fe48d6fa815bbb3cc1c7c612cd6c298eb803c3c3f1614cbd2df180df56d104add52618c267536502a3a5ee7cd3a9a70f350634ad0430be45ff786943e6ce3579e0c5ddd231a86612c86f90f492c15f7dbf9de77d5f196599f45745ae10e0b0327d0d669121f14f54baedfa6e7e69b4bb46f7e574fad499aaa4c38456192d96937646681cb2236d69e8bf85dd5bc57ce108b9867a9b6513d7fd4e7a5d927303113dae61a25c36243a7830518c34c67e723a077523fb2aa815281ccbe1fd5ae93609a46f338330edc25701a3e452b4f32c9ecd3185a6772ff5abe05ceb414a542d3fcd16cb91ae6bd54d964d4c474416634a19ce85908a53453882c67d08f42b7702567e10c743e24d590e4c9aafc6f57d51fac00dc0deddd57bba6d05fd6f843e1f9f57801d189def55ec66ab55bb601444d373d1fde1263c430ef01dc4aa0d34fef9236f2ab0dab24d99b7f68280ba6400c9c23fd77f3bd1367478ed9efb868dab2a0c8a55278c5a8eb5d750fc4d701cbd3bd86f0e0fc87ac73a7fa84f451e7fe5f1e716cc4283dc7795687f9e5eb3801f7fc1854edcefa75a3c15e0abc32563a8b9cef81d0d481bd5251e1dcc30733877d3faba44ad7e93e7b79b62dabf5caf46de06f39f1760243f2a8c1e3f19d9d258a3b335ad066e0acbeb737780f08214a825058fba26249e99f359e73c62ed0ef4ed50c65eed35ec51c7b60bf0fffdba5c223c7ea3d5dac01f776d9345d85b1bde110234f5a88cbe78a6e826fa09e6732d82d90ae91f3a200e8f67ee248f1db4edc8c16f2b125328453ba50cc3cc293bd101ef4a57f232cac0e1cf7010d9b9d2d0027119ae2f13c6a14ea0fcaaf93cf6f8bde08feb19d73d360f7c1d37461c13005f4753b8081fc21114818c951feb997a64fa5af5269f1f2e35fa2acb741ca28a2fc75bf1c2eeec11f30186dd167879250e898debfa90b6ca482b5a1197dbd81f2faefa852b51d5b0c5c7162e5d1c021add27915959fdcc66ba3e3fedcfff90229ce6fc736d72b28b4872368e8f3a503a1cc828063307c7659ad555031db39af1e825827b88220ef1cbde79e6c40a61d4fb6d1a4fa53e11e363096ad0610cbc24b44a2b1763e760093cc5c886da01b593356b0c947ffa00c0d0994a831f0313a189c9ba04b94ec52992f3389d0df5bcddd8b15d76ad1a673ccf0234d067b401a70b5c69cd81ce8388daa488e26af7e4f62999722146243af899c5a57c0ad4f6df20af2f7362da8cdaf6536d85e2433e870f0b84ee0df237c4e3ec4e0f8a67c6c0154ff0716ff4896234e57fef0d7e50ffd7a719fe8d774fb42131d20459394464dee7b7430df05a87d3b781b8e8d7ef5cf96a92c7b6a4e1fbaebb35535559c51b95e24ae188c3f0a3455bdc7572f0981b89c253e6e65fb938966f7d5f743b7906c8edc4648a192378d52e74b2c2e36bc7ad029b2d2b07691b7d3d8e5f9b653f5216e4ed5f146458552498a302c694eac7f5c5f1a990d6209d37c034caaeb4a1cd010169eb034f8376b53207ba80503e3e465d5de32b1e4320e90c8eb7146d8afbc107d39eefaf5be22930089482e508f1cb572486c8a88cecd599b938b52f073add496c2fbb5046f195ddcc9d4dbc1087feb9b61bc4349642e8cc15e46090a6bb02c520f00002f23b256541eae1bec6c87383755d40778da5ac96855b9df3f7c190697bf4bc5c579de9d3e0c5d0fc6c869ec9dfae56fd6e493113ac364dcfbf483809ea6f46cf369dff9b49904f30d548e2b36bfae434eacf759dba714ba095623f51bf121e0dc1a981e878c1aa7d60cc4cd01d9043eb4f1077c38f3e6dae19bde9ddea7426c5edf1417a8a19ba815cbee50dc442d5e5ea9aed013480e5b6f10e744f33e615a92ce449982f115224893da998c9d35a1866b0f32d3fbaa9dc7077aea423729b9cd81a86282940d53e7f08dd7c0ff4153fcacb018de5b14af9d80a976b14b1c679f1d75373a3333e49a548914ed65dd37a5b6d0dc1b7b04688ef747ef1e2dda4e46bf450affbede77b333767308a659e23b74b871b94cfc7e1ef66baea7b5052903907056232eef966bb01f549765b7719e821513123281e3d7477eb4c88c341fef6ae5b47be31e8baf44f5da64b32b1b4aaafe62fadda2ac3f2b0c3c30ed69640537bda9525d562a7fda3af97809d84351dd0079488216c442db331320bf58e0b2aeb7235c5a5fa62f1b2afbfb5af3ad615818e7009809bbeaedd426ccc2e0cee8467d80d58aafc239aa8026f7ab9bd3330edb0878c7da44faf67a15bf5ee26423a0f7e190261676324ea8de3e466761a2c39d74f1d31f591ad3b1d190cef5ad011b9697374199ac1d9c8c7896d1dd02dfd1fb089717d0e972e3b5a6e5fc25f5ec2877f27d7ee0b72699eb97af94efcd3fe5da606a0aee64307366f782d8afb2193a070026bf35f01f7f327271dbd58d00a8e0d18e8c6701239f615dfb32b3eb117f745df30ee43bb67bec76105ce03dd60c245232173d19724c6d4ce6b8c20c044a410b920377c8ecccf95ef815c91e221ff10937e599dc49c40eebed95e98055824b4c108c92b7fb22b48c998ce4457ecf4e004ab6db109672c13229de1850f95a67becc1dbe88ece439cea88fb255f65d7958f395f414d3d42231eaca10266b981cd7cce496cfa8861d806b40f0ec1de2ede242c21083e741b4ec8c07076f19dacbef610f75158efe0e1094cf3432abe15a9118e4c3217f3a551906f24f5d030ccd4e252f8a57bbacf13eebc922b1cd8740a6e6da8f85ca8c478666b591cecfdeadfc4888c661c45b506478fc217cc32c21b6526b00da3a3ea24cb54f2b404b9f719f415fa334b93b0fb8ea627effb3a099dfece18b1cb98bf0dfcb204cc89197cbde0808018f5c466c43f750ab9a16771417ca826d92400a2e52fc1dc33a78ab55758cb65fbff571ea84a5b98ef999b2efebc18016bd5120349f568b2ebe290927fe28c7c7a5766e9a2a1e594b22212ffe194240efff0b98c941f86724f63525694e3baf0a6db701234c93a581e81a6372a3dda86390a77c3f1904d80c37ddf6044ab8a44893dc740392c93cde4833c15737618beb021aebf74e2a05fcaa145a03269c7af41a65d7f1f6145f6c524df38a6e833fbe0b0fcd597b92019e190e4f7fec7acaf671f719b107c677bfb2cb31bc0dbde3c06fff21d9baa0318f9380becc7e65355e56400ae3ca29928a083be37e13fd3dda9791b86cbced8e3cf4bdf914ddb9295dfd08cb8d920b7d94b054463f5d334aaecfc78f2d5233150cd00eba8fbd9cd2feaa3f60e07ce87bbe45ef11122c5c222d4e91a2c600541c7d0e7e88869b92ef1985b45894bf0810ac8857c786c2d148840217d682f9ab021bb5a45497f41266117160f4677bd406815f688f4b23741890ac7159369a11912e5f01c2b057c7f8e0092b8c4bd3bbd83d3e6135ce497b19ccb0121c4cdbb01a4dc70be05e980312a6c8bd99db9524f6be9484afae155f3564e402395f8e7530aaf61406c13fe5e14139a0bca229565ffb580ada0ab61e0ab8bd8bca4f487d27645c3888711f1ce84fc21b38ea55e89a0377d3a09fd244d0136667936df40cec1ac24268bbe7593402c6206c634968071acc94a4c9c478f9cd669125de68213deda3ad2c6fdae164be892bcfd392f9f0264e85e895c59f96d74b6dcb2ccd30e1dbc563276b09e7e029931f1bd5ab8406e33d52bf9c4a5033db09a38eb0d46a4fe644234a9f8c4ab662644b42ccb3668cdb79a93a9c11038d36f9d2765919d39ae89a449ae98e91b20c493151f65e180f34c8ed0d8a9283d10b1b95c640e7783328829130996ecaca24518b2260526d4119c941b40c23edf0c698dea12bb5288b3186851172d789628c61c0d041293aa8b684e1130185a98f30f75da3d83c58481b3a844257027e07cbcf5e83602f57275ebe0c6c89155bb8bd81946072551e3905a04fdabd157e6ec4bdddf3e06b6b7bcd645877087071d41976b0ea469c55f3e083b0a1833bef06bcaeb45d2e5375af3b64758414d14b84f495d749df45115867dd025b477e1299df48217a9df95d1fc1bad72dfd75d1ef0e1ce9d2597b05fcc54583ddadf39e95b04d3dfe83e20670c589086b599b56dab1bd1df09faad3fa4a088c8b0abbb9c0d0707bef5cf47fb4539fdf15c15a91e1afbab62d47ad61ea5f2f13d54133182b3aec027ba6a54904eb87341be3f68357c91fff4482bb429ab42c1f4aadc6008fd34d8501bbf98d1ffb1b423c09315ffe13907582707422dadc335a662147fa01f62301f2ab00e3930f6fb8bb36dce536413382906f8ced9bf3e8e5bcf5625e3c3b0fefced327e6f5d5f3f06c9e7c31afdf9867efe6e907f3e6a9797eed3cbc386f5fceab67e6f1fb79e2e9bc7c751e9e9ba72fcecb1be7f9fd3cf560defe5c1aec96ebdf82564fd8774a64a392ff2cd8aa04ffa4546c2debbf45ad4cf06f4ac7a612ff2cb29564d2db5c3dbb5b40ba008d93b9b9933fdac36a3cde3e040880a91820a924c6e14dc90ad78833546ef8d62b8e902b8b0aa8aac6067a830d62713540fcc2e29d73a40b336617854011471e8a3296e382507357ce7d4e8be3d3631946752e8ab1be0a42cba598cd980b61dd2ae4e38e5aaa03368215042924eedbdc61abc8feaa8bc33ea9cce7f9e2586716f038f112fce295c51551c29ee86238e228cb87434a68e9aa23e7ec17a071e77e94fac917333e3616bbe84be1e18a812f4aa618e45679cfcc8a732a56e3dd58b073660bdf889d5fbb6c638a64105be2a8cc21c1f2768c9dbc12b532bf1c303f815ef2ae2a1d122d67dbb17fbc1996ded7d725b3135f9c9b6352dc855e949178b00ce6a51c33d3cb8773888d664914c6a985864c334ef4d5c0bd3106a2e75da2d3f17691bf0e89bd9af074d4a0293ef8511b504ea10b310608d505d37fa1203fa6fbca1ddd2717dc6ec7173efe0d567b530c6516bd4e4277bd1015de1249574ee0a2eb428ca0797d84a425b3471cf8adb688c957998f0b1fa9a9a0ec85296f9abe9e3a662f3422c8403aab85f17b3074acf50fa6ef514a55c1180a5c002d6ab57564b205bc29b0d02681a99ba14fd3d13778efaf4c6a385e42cbba1dae00e9fd122ff3e03496e417c4392e96ef96eaabd40f9f62767c81beca7d88fb4af154198db58df8b5cbc6f715a15e1892cbe7b64ff7642eac585f794b8fae884bf58b3f5c2052eb96bf501d5bfdb9fdc8002d6d68d8e01d472495605e1b77c77ef354065c82b99e7be404ad4f98ef49dc662ee6053caa59d0c0df7afe089242ae16efafedf0491638447bb979be6022689526998fd460c40802e15dadd4da941541cf4a3270ff4756329969560e2102d94f633e5b16618792cca36d1fb56784d28247b114c57f3b30cbc294f9d8b5648325c51611b5400d396c85c61c7435b240d52d8cac9df8f91e50956cd241ac23910cedecf3ed4af6015da69f3406974b3c12b572f86a2fc54e9ff5782a730cbb2040b8164fee7bf16409e0af02ca6b048a1279bf21e87888b82c17199878b308fc2293e55ac01920f7e1783383f195384f84c529eaa543ce1d13733b3859027d2f5eb66243e561e2930d8cdd371f4e7d4c99a7500af2976aeab833aaf310f9b4fd4e8c2898a66fb9fa21d5d2ef3cf99b6d6b913dc5ff320a09a5c4088e9e8f8fc1cc288385b58cb1e33bb0f304a0cb1d729c992bea13048602668cad11c1d24b99913de2c460eb1b1c13535fed0db8bdfb475002fc737564a6ffc8e1e5b77729b71fb677ac84df41b0cc285a92c5a5ac14d249adeced044f8ae217aa1e9c0e3fd283a36368a92ab34b17e4ffd65f80528adf8d52f95cdcd076071f461421327f46c41945106c683f7f01748a78a48ec98a2ffcf468987a5ca52831262302a409a2ae8d0da2c5a5a05864d9d2c843cbda28ffc183c4938883ff88d4b66d3c6bd952ff50059011580c3a18089a6bb067547ad8e0d8f77cd9e75a2c21a3e22c2dcf26ee65b32bd7e0aef677ebd8a34074114f389866eb02d8357481940fae0e07c97909cae00921f20e337c7748c4860eccf0775ee89060ed7d3bebe26b2e5a824f80952c0ec1a85ca7a975614d626f834e15e9525dc05abd7383b4e76c107bd92f3ef1e36eaa1fefd14669036b6b57a7b9502e45ad1012064409d180c2b1f10f271a97e1db24d3848782df0539f18f143f810fadcbe85a78a4a700cfb1a318d61be05f7f7d540352ff84b2f80f6070250c16c5395f98156ecfd2465c0ff4e401117a05c4c7645d547f0b6c11851720472c956f6df60e765b4931f84dff64bf77ba5b73b5c9c2e1a6c09d0d48ec9208520a870ecbc7405f1e93fc778b34ad51a9302c96cd9d680090aadbf940e8a8fb27f6f262dc0b2443ec6149d01c5d49230348f8fca174dd43a81d5bd0c0a7e474e06e11d1522a1cbdd9122fb8dba255c8c25cd5c54c40b6272116d3e6232d4d0e76231512e522aaf7520a80ff0fb5f127800229e0ab7c97f0edc633c79e0fd6a1cf1b9b548118eff758fe7140df0e379433f72304a6dd73716b940fa0e70f1d6f24f5aac6318cc42529cd59058fea65d538348474687287f3f1b8fa68d45f1124b968a22dbe42ea6872263b4cf8bd669be10aa1f7e53509df4ba9fa3efef329b464874c8296b6250f1377138d9f82e50547e54e9868b79642a26cfa42df2a6958acffb57183a9b6f5cb21a242a0b16e292b2aa168d0d05348ca4bd1d023478bd930edca76c9592e2169277898e23da131b9e5599ff249c8801b2cf38ded3530d6a7056f2cc80ee2b7b7dce70ccd647df682b43684f712be597ec2f4d941311f9418f1ac69582ee7003dd6981f1011c07b9b9e48e52dec39493a6b977b17f0065a9168605eae41cf2194809589a053f0c72272dba4645d81a10dff1a11dd3e53e5a0957aa1bbc68ead312dc9811a3f4017ff44a393f401c42e56892ee894165a4be0375180ab1dcbea510410d08a9bdf7f1fa83c31c8a43fdcbb2211c3707b6a01221a7b13d75eb24fcf616650b0cd31d31c96fb119c944d58acb998d8ec94e73f1d77c65f9b4ea1a2b7f7ed8a3d58332bfbb8cf189f3296a6b66fc2408a64e0f623ad3fef80cffce864148fc2df6e26b13fc835224f047a53ecfbda25708a973673693c430fe6e014950b6046d1323d1b380f1ac4e6e0741e378c2cf7dab6ee8959724e3dab5959cc83e0278095589d40137a059d15d1b5e6f5131ebaf6c255ff763ac9e34316745ac614a532deb522232d724ba1126148581091f53e2afe7fddb285bc22c87355059bec6a8d7d468384e168b76e2b9e8dbc580c8a3302bd32baf2f2af9cad942630e6dfd5fd44278d24d341da729432066ba699a09e1ee30321785ba8431a5921ea29b6b8b67e4ae4b5f2c0ac21447cd0ca579c2e466cc2c49726b07373e8d7927f6d34bee47b88d3925face2a7508bc9b4db49029ff206fd2cd97ec77af1ceb28de5b26e6fa6fe5e1d8bc1a95ab598c8801c7cc9dadd45cb34651e771fd455be6431673c1d95c221e239aba810e97e0862a49905ff75055f0aee883bd982c32113f51041bcf0cbbe088db739bbf13290a2e1b587e3d52578a5d6bafc31e738a132dd6e615068fcf2e747936a8b7385b23719a6032e2ecf4d0bc07b55b062862740f7aa0ac0ab0a0f5c640060f7f0fc0fe4d0e5ae93760c82528d012600a4a8d68371290c9e4d9c6286409e4b1214c6cd9d8fe26f8f7409f8411617477a5ffa946dd863040ae875fe824c4f4dfc76d8208f32ac42619eea049b1876481caadb743605242bb6e0c9cf4adf2b74d011008bcb19922f622267e16bb35c5c3bde8fe841443bd40430e2f2407d6f37df33634d8cef24d60f7ea7cf8890e3e7d6e495ff9a3ee1128a1203fc3f4e1392722dd7b5716ca137e9251599cb922410d64cfdd592b9b0213e69bd818ed2a2181b3ee6eb7c38596c313c1263307a6ff5fe955acb52524c058bd1526604ce61099bf2b440e4690c1b80f74e7af5f9882c894d98b103009d117f41089fda4ca14f6d09e243db8ac6338b8b50173f1ec525745b1275378c78500996a24ff9ef75fdb591da8de4137280efb2de8b0c2a7d3ddea37e99a38b61c0743cf27388029ecfe132cf80b07f95b73393a769cdd08be1292f7ad61bc97019770e56b78e8378f0aea4da7362981ec6052c8c8a094bdad46511360ab3936289724832d747c8286105127d254445f4ad16dee6121136a50ec2cc55335ff8b8e662a2080e139b25ddaa27aa68b22300efbaa25626587a840addb64253ad545ab6fdbdbab5437b2a66170ab1a0db5636da5fcc91ce60d895229b85c24ba8ac44e022a07d5a8f51ed26edf6d160b63b8aa9099a76ccd8034d59e6a00341fc3aa1fc64173d6e1fdd219b833f7cd0bdb0fec501526a63eda1972c836d7637fe81af8de358a59738ae15f44354edfd735d655603fc261c0a3d6131e15c14ec2c472a9fedcc1a44e1b045af8a1a05c864f40255badfbe45af1d4af4108b5e763c54f07fd5d49fb0f06151501552c4119d40cca36700b6b43d0a2576268e13d32ecff069674057068e9482ccae4544045a500dab16100149f4b999aa648b4ef11bdf421cba3c846461c4252bd0a11fe7f9f6c09f37039ac9ae932ca0ac5105a07ee9af9a4150c2559c94ccbe33e910aead4410a5698c024bf59813882bc0def9edf71198579d5bfd9c8348a1368e7975c90c8fd3734869ed95f687fa8ad9170b98daca7121f0c8848fabdee065bd17b8e45c59c3dda596d5b829d2fcbc92a2beb2caf565b0b601b001adba96059fbb4af3fbdfc37985da0aabef458274617e3d4c1ad4d2f7478d4effac224b36dcaf00ce00c0d79d0321f3aff8f4a0298505681df11135e996345c555ffdf59b316f12d166db80565cf64cc6f2861f96c272a99be8c9df7250f457c2423d956321c58fd8095841b73afdfc07a6c1968ceabd99b354d9720c84c8bcd0c71c9584404925c0b6a0c7b5e52e7241766cb3ed32866da35494c60d14cacb384f090ef93b2252a06d3066061a9bcc05e7ab15dc4410f5fa32a4d96fe187333014ca87a1837a67c5f1d304b12937e76855a01803b9b5d1a66417840c3c8fd49248262c11d241128e27d2ec2438bd36270bc6f8d9709fdb1876467e2550616da9188e24fea2dfae239eb99a6fd33472bb3c9de86f1088241b83feb2a1264082d8ae1e47510520e86ce7c354bf6124b2629f037f781e2c2ac23c10d7c90caca43d3e1e16ef64d88e69d51660c383daad4a87644d41d46de3634616997e76432003a65bb2e2ec73665fa2e3d9e79968971046f08647865967ca0d2523ecc8942043ee09264b270c736e08fdb988c39af900be15810564476e9b374997b92ec835ca5e5f3a2ebca4cc59769bdf0917d0eb90ae0ce07b9f1f32aea322dee87947846cd3c5404b4e11684388677b29f069a16dfecf674b2820b266dcf6a48b7a81f90399d3bfd2d08d6590aadcc15dd53ff5d5c634e7008c43843202b11e53523fdf941a5121be6aae64c469a05c3491c08cca13a824c0c4acbec81a22fdc8a550afb6a45d36c5ccdf6014b4e44636d52e4a1b42ecf234ffd807ab2be966e939578987e54156c1eaefbba25cb78a82554bab125631fbb0d153ee34c6afb98a1bb3c6e5b87a0de45b08aea24e8294a0585b93484679723632c5dc7134a963e16a0e40182c3223b41dca22ff1910feaf57f9893ba1d0396007f0b91d247dea5cc12d15d55c415704244df1ac16a4e94b1cb25a8b0e17142c1882006140cba817fc7d0cc970ea62922bcba89907832c1d3056c2164449fe41f9e9aa7096a96ed41bd5062a11a4a8530dcf31d4647c481b5e1850f3f0d9e22776fbb45e99ac290db189435e0b192af17e2aee5c212efda8c5a69fc12294cc77b69b41052863c306cbb14dd0c30af55517e83f3e0745ada3fb8dbc1f5f44179e0b50a022f951f1957ae44624ff84a66b60b6fa7d262bfe427ca6df62e391a67d631dad3f3874c91b71cd05bed6b5178c88face28678f0176b68d6a1b08400dd0910f5a27871c15e4ea7c6001c2cf3dde8a8cd5375ef6b3e4bccc9ddaf7f32217f39eb5b3e44fbfe2c6b1273532ec18ec3e8a7d2b8a8a7582672708083c252afef60099541dc7064ac3d2e874a398d8f67a07f962b082ef54c77b47dbbf173fa1e9347c6d305481a8a412ce3db44a0d3492fdc180064017462138be569aebf234f8faa07c24ca31cca01bbdbe12bdb8dc21dd7dc7a1ee387a3db9697b93040994709ff436c328794d6d501fe2b0d11cc8a4b1c1699a08cf59ef36f77565782573a30240e53ab5f99358f8a1183ffe3c24e48ef0c7c2d21b0f7106277c73cc163ac6b0a45be1d77b9fd0f1e963f579bb2493129bc1abecd5bf84c402e3cd8b1984084d15344df7dc70b89458a3e3ce02fc025b9321a7a82e2ac8eb83875c04087825fc11c534af8c91bf6afe4d7ea8474c98c489eec9a407a8147a55772f554cedb1477e63933f9375d5877f16dc3c70e1468db9ba653c815a7fc251d9c5cc410632ad0fab6c327c3b30175f30dbfb866fc3f100ddb8d7cc0ee58509697710f2071149c53b9a67215385657a370d2e59707490d08a938a32314251f74c0611e85a6b7cb02554a3bb4942a477f1446295a7d447ca934b0aefe6f4d4004d3b93e722a1a4b9ff89ea0e9e08af6460e75900133040f40214762474e48e086b8c98493179d43fe10c39bcb18692e94a7f4238accaf23cca82a46eb042c2faefbe722ec0bcc1d7ae6bc9503ea18b3f3e217d2ceb2812d5acf926125d630f44483369e6d8bf2fac1ddb1d66ffae70bf02a5cba18a3dde10f1ad503604141f3c999cf5c1b6039770850440c271d746f3a92a0e460d49ac0542dca35c0fd43ad965841c08018710e50a5dccb8e1faffbc26b06e6db1de93e929889cbc30567811f85a4e17594826fc0f61ba0d7e0ad285ebe622a1f7febd02a012c214971f44ff2b3f56a0fe70b98b7013a1e7e184a633ac53548790afa489ea53cd0de107a2731bb195f7d3150ef44e873bd32ef838e8388c54ca54da432d0faff76bc018901d0d92f72088dc943f4f29a75f47f060016f994f917b39bb191fe93d14aeabfcc3a53d994d9dfba45748c6ff8b5206b951e81d2f0b66cc98464cb0e516426c43505d8334e43d15bbc581e2c337f4f021f4d3c562525be8a133765b1489b385643e851b5114f110dee89c52280419a9089c56cff8f5c344d82269c343c9c523a14cb0a5a70d4075293aed18c0b8f8b711af8c83194dc0004ff2349c0312a0e2c5b58c4c69b0fef9efe674d2f158c8d51800875c2a08518f881fdbb5a19952bd8544067ffdb11ab096f6480602e1115ea81688c94709c5b589190af7de49c6e9d9559e4cd3ec87f114470a06509c52fa6fc22a4881bbfec935d5400ead33e1880cd0cc2c1d66364754bfb8af7d4cafa5a59a05154e9e6a20f1e684adb9fb8099a4fbd045b9919419f4216160a873bce07548540e5102270af981f759e915490a1b3ed82e008ce6360d2426e4875eb4cd4dd640c829176e530fc5fdd1d08908db150e2090113055de22c225249c653d072a4827a8f092987e040de7894d36cc69c1df58b6148121711dc346bae7ecb60c92294cede566b751c7ffdc0ae5d1e55067c6e2c59a74afb2cb3d5ad93f5db2f43fa4b8c8f8719463c7ab4590d174c42f3db9a30a80a73d9001e44dfa3079afc1dde43ebc1a282aa55893d2c726635d36b742c1578a83a37b17fa601380c7c74c10225534e32a67626364846b2a34176f62a306e29d825497dee6ec3a620d242849898a1ed1dc64dd25b3c8a89b33ccdfa0acc390d0f0864ab2f8fa13fd926ea370caeec882cef77a443d647a4e0eff91d37833d4058aac65121d29d4530cf7ac3e15b678938cb8e8d80650e32c7aeb720c5054d7a7a3ef24dc8c54dba169ce9b51a88e5c1d8e6a5bf32540567d1f6354f68cb40e2c70347536dbbed62b6190786b9de7b99a87432072a796aab60c346fc5c0291ec062dc02a6ab048928bd03300e688967036826bfbf5e82f5209c1e70aec83750ff086d0c11c67080f89818846db022c2c401df425c05d87154d4378409e58f27d97618db96def62aab7bfdfce7e9b2aa977ce4d05f5e6144a3177a1c8824d7de9e0ae99f1f320eac9e61da97f41ff634bc4c9be5858fc6f62b8aa23a7b96e3637b622d3408c34e00fb68eba845370639c821f349950ef4d7d6891eb049b36a602858e1aa522ac0681a83421700f36af7cdafa69334a0d145830a64a236792c982e330590277cff295d35376eb98bf16ee679a85db458126328a6a40b852219d2e1c6f8cfb371f2585ebbf3cf70dfa3d0d061267fe4163c5504ff2e1bc01626bfde0513282d731788239c0a1f7da4f81e816755238bb4d515bee6ed083f5ad3adc80317fa3b5b42c681439d81984930f9d1945e0d4393bff025a67ce0647a7ebbd77b29adcb5cbe15c2382f5759efe466da8917c7c411cf1227a450bf18944977a08c948acf5d09d467e7999d0f992b8ca4b241270066a0f7835eb084ad4cb5dcf69064b4c448f429ef0e9c7d72168de887cb0db8a9d72115c71d31e3761100366dc06a9b50cfb39f33e0d86166c7ca6b0cc6663c20979d6a5ef1e97de155e5e5acb60f31487902676b845d3bff60bd0da0ed6fa3e0f40b9e0154f9908b8c1964fb299407a2ce9c0f334157929f98c2030659224842dd33fd4b79f657aa92e761f9e3ee9b4a693b2844a740a6c5b92e9b0dd2b71d66615a64149f2e855669ffda4714644d27bdeea27f770e18a384fe0e88a4091eda8ccdc19d196bee8959e5f8ec07a42c5a4173a83d10616a3021d417a872e8c23cd5dc21cc65b7f17d93905a55440f9144d39ce8e22c086978eadfe6708cb6dcf85168e283bc8cc1d204da94a993e408f3c7b5141b37e492a1585cc9d58247e9d7b459a05c0afafdcfd75146987d00f2500c748811177fb85a862f49992888ce3121dd57a5dd1c83a184932234cc94f0bb7507f1339f404905b16d1cb9b6764f828db1f77fc297674dcf9c91425f684c8e8d9ecc49afd272faf3da2b21cef3dc3a2ecd66a9e5c5be817db8d6c822524734b9adac6490e91eb8f9e1097f0eada68049b221f6df6e999749e50368b3f9902e08a26026e7a9097f8f6025552e5dc2372a6c72da2f8c17057b8916aa447dfa027d7309b23295b55218e11c444e75d9395be248304470f60395f5584af85bad4390bb494b37f7d932e05d39b4b36cf3648d04a4471edcefb4be53b970bf81dc189f99816d44a8a93698642beae1158295faa341491209541cf631f86e4919c26271547e68c8f91e2cc8b42678c26d35ab11db86ccb2e2d7edff468fe5cca6fdfa3104089e3791e7d948c149a5e523e7bd23d256e027df71a4a2abc11405b6bcbeeb5b58a17ae8c5fb0dba16c1b560fcbbb09e6f83f4dd24dfa2dacbe243ccbbeb8301e12a25b0eb6c6689562f48e23d1f961071ab2d6481e7647fcb2fd2d12bc812a878d9e83061e372ee28bb449de167e11729f1e14d6c676ce4e21586fc03399852d91e8e3e3c1b12e30641b182609b1fb3f890620c0057a60f0c93fb83556613b53af1f8efdc8a03f3639082edcafca24253e46e9215aa3bf1a6d87ab7c9c6f5956086270c265d1321cd2ce47cb71b7d15fac4551aff536960b57f86ca89311acd3eba0a0bc90443766f9602c6fba2dd516112dc15a2e0f2e7eb98a671f2802bcdf5bfd24faaa7c9e414998a2831b0bb218cc73907c6a2451908e37d7eb7c923537ce52d521e5901e945e44f83107c70cad622020162da3d51bbc2a8c34b7768aaa70e5377356361e3ed4f542b4d7c901183794c1787cbdff4801e792176b569910760f99fca1d1b05b7c4eedbf47cc6e4f36d8d20d09766751a91661c7a83bbc82f51013aa735818ac8b485b97c13dcc27c3964750d38015beed647f9fafefbad9b128440a0ceb83ea555682a079eef1d108c32b117c68ca00f43028996f7352f3cc4d8075604f205beb89ad60c8a9fe0d690d60a961743ad749653e0328f134d9db9e813d510e2fde9d6b37744e3eca99ca93aa5180ca81c51701ae89c4c3e24c0201304d0340baf53e71ccb2056548ddabc9d3551e9633967a9392c03f5a6e86ee3c0bdbf780aa2b9e6267aced642af02d99ad142070e9e5e7477dcf306e91190bbf038cb6b9711b80f11c4d5e563c458621e9d7284395cc04e25f7ca09302a31b79121aea674c765647133c435341eee3661e39472d369612774f42a307046ff07f1541541bfa2c1684ac46f5ee146fb2f0eed407ee23246e017cd901d7fe38ee6d907bd39fbcbdba48acb1e619448d3250e733048c81bfa70472b62b86e402d4c1643da64fb376f3c961652d97bf162eab57b4c623ff2dfbd6ed50cdf365f19a99d72921662050a44417ffe49c07a1e58df3f9588cafef58985cf9166560fa2c782f0d6fe3e05c7b2b76dfa23db9895457e2173d1b584e8ef1336d499fdd36e2c035967cd1483b8a8ff1df5b60b1564830c964e8c320acdbb2d2af04e37550701f393fd0752d329c2ed221cb4f0512f536569c1b8bfe69a80a799506a91a0d23ada0aa3e6ad9e842c212efc979bf22be15c42ef76eb2e9f22ef2339946a301790a71eba4e430893db5faa0de2819913a1b433299536a3d2adfeb9dca41a8c4d4c0086ae35ab740b7e35c77c86b1fdbe2a16e60f1f052bbd57a2246874ea278e219125f0af16f565d89ff57bbaa509d1ed1018f82fcb6d7c8619c11ca11e339db1295117478ab36865e1615ef11516e77b2aa15cfa8709325d1e5b7ddbc38947b127e7bae83c72f0436aae44142553290383b7bf023e17003eb255e0bb47616b5ea3b078945c7b4c93f9b04d26220de2d832460f7fd953a0e0e5091325d940c69dfbea0d4d362c4b17b2abd07728bc8ff2c2fc04e71dee542d2426cce4a06f9ce8c5ebe6aa08d1c5889072ee6f07ebc3443923cbcdaed05e717dacc8fd711de8ba88cdc326123f347e06e7df84838591f242e5f2e171991a91ba622dbf4c2f457c6d13bc19b2e2fc157232d40b3990cf1f19fd2414f5ec4df892752948cc0be1329108074ff9042f340969aebf9e8c6010b2f9e41379ef7520f94220bdc94e977e57b8115dd64d374e9167034f4cc13953311d143f8de6b8f66c3820fb316c39ea2dcbea2a376d4c6490ac61db0767aa13b84bf09448f9be892e47ad78499cd94ea71e239a7cb9ab2008be2334ccea47f63e1b0cc8381097990a2ab9f8b594149ae2e1125220c176a3297d843146107749ac6bc80c5acdfc73a4c94c4db875f0b8708c8861d6f52ec9fca5ae38dfdd3ae04c147fbdda818782bd4a2eb12eecf4e88171b846275523858851d77e2698777e2b6773cc61ab8f6c0332f520232413bd4f8402d28263002113a629682393377265d4820945859e4474db10d9a73a9b3b27194e2e453404589a2623c021b684131722ec693778a30e8e6666160b2ef95a03978ab752b4468718dbb5dd54c56e64ca84f8860cd8f0aee40dc90a8a1bb27a10a4a6747211da203e0c9fda046817cb007795c76deee804796a67916678356eb3244d40a442aaecebf8b0f058f57284f366e239f8b8380712250e70a37533d8fe61a0cee50e6e7d7b1b5a28473d0028b6ead248cc2b411c5eb984cdb7ef35ff20bc1280549f9a458d784dcf8f2feb5dfbce756193d9fb631237a411df51b156a76e6c96e39d04e884201bc28bdf1262c312dfe333e3f0fefdca0cc2a9a7ca05d287ac3408edd8c5f02d683fa24ec817f3e26d03ab8359ff3bb71fcd27c236662bb61a2929ce8b9113ae4bdaa03ebf21c29b48c92ea9743a6dbf5a9b6268200222f2b18733bd6db7420c1927e0cf36fe2a8ec27bd5d260d21acd34c952a3e8f9cab2541ecd9bf83b62396c3acc6f7cdfded38965a8f83e746741b8fdc45aac25a16ef8e8e8fc41259e7c4aead4b7bfefae3c74b867873aeb1ce1bd7464a8dab4c99591dd5a47da388e7248b7d5e0c1ae56bb5f0de03a61124b6eb77e66df52699f1a5d323c8f715862d902b4b4990ba0eeff66bea7d68fee360475979f00bedc8086f5a408c6615fdb094bef6c22315ddecc86b6aa50c6fedc6f51630156500afcb9d8f4badf371a111ff81af6eb3148f614342cda8f2d32ab5e47980afe4a16dc8ff04bc09bfed70667e3d550b7283f2584359670f0c26c1b823bf3d42fddb58ec2c9b72bb3275f2b9e2009f171a815af12340cc91f191f95242029051048ee48542361ab7b02cd16adacc26e9d56de80a86ba821530724fb9a5cf64dcd70e8e6d0ef835e9d48a86c4c63acde8e8a5e8ca2f506c8a889c8acde387c325c17fc6bea518cf3991444dcca397ee3635ac8345cc6b723d0cc2abb9c57db02fdbd483de2b2146e3908566182ba6c4c7955c2dcc391ff0d018b69fa1129043c9b55f92245e3799968377c4aa12c39403107476a7c591cea7840606de571a90f2934082dc27d45d74bb5d867da7c0d9ff2f9c13fc349a6a83dd396a5c23d0e886d9c845152ea3ba7f7a3200ae747eaa7299a60449b282473c446e3282bc38c6fa273f6ccaade84b2aef77532fab75ae01ffc3c84c37f8342089be078a82380f9200a9e090aeb6d5a7941213c919032da3797e38eafcc31cc1eca19929f698dee1ab5b1b2cebb405e776f26cf06bdb7b4d3ef9023da4552a0245f368713a030a583aded7aab2764b080fc546802510c0efc7115635cbb06e185f82a48bd6bee4c1cf29acecf7acab3ecfb8f757c42e48257d9f8f9f144669c126e81b954b075b6cade689cd1b3bb738fc98257b232024f086d472e040f19e51b9bae6a5826d52a0eedb7e27820ac8d5e0752f3cb28f7aa0860b38ba809b6d39e93379a0844bf17ac62db4cf635c1ad3aea2cc2bface449205d2f2ce1857984511a53b58a5656e40a57d57158e83cc6c20a0ac392fe319b5987138ddbbd97dc2a1db15a3974d08b7ed7b1bdae53a4e601b7dbc42a7900f4e6d2f18f4e0d90cccec6191a09062d79004629679f727ed285dc899d0a23e49b17306aec31e2f51579a0dcf3008b15f677901aa1901609372dcb81a9c067f9810e3099c1b0404b21fc109a1de1f3634ed673f04c02c20495f23188db2db65967be8ab0cfdf2b488dfc918848fa35a09017e426cf8e653f398a89c79de06e4b00734c417c41ff7d58bbd832d9d0d8e7bb129b8e049a430a28e886b055fc303303f3ac1a06152e50ebf4338790a4d9979b03d88b098f144f0ba34aba72c8f2452646ab3fc1880226e9c35973d718f4ea7f6e178ebf63a216a7ea4d57b93d305b1f388e1b26a109bde77e32c32f93717d7fc2b048a527214a4f1eb4bbba84470bc64d651137464afb3f7a35a9fc6004dcd239ad63f5a227a83c2f03a7011a3465ad6209d3f2228766551ae9c393923320ed61e615224a39115887a180bfff4c90933d67c33a58407b369931c9c44380a7c862ccb8abaff603849b14ad779bfc13c9bdfaf227fbf1de813d327c9c91c1a7f19e4f0c014fc384241b14a31d125597803ee9d38f8d0b2df24e0966cca2947d0261762dbb9655ab65a125ed5802064eee7d33a02366bd7705a8d29b92c5f929aa42aacd727ba1d30d298c1051402d21437ccf7c5faec7f644bd8dde341b0ca15143cc4bb6e44561ea12808d95b6ba822f4aab063da3a95bb2950c87069f578ce6a5409cd72c12f1646e2c81197df8cc10d3c872f54933620d6d145945a69fc9f791d7255a042a68bc4e94730c2f3561ffed3543ff40578321af679ef7f626d6597ea11696306fb9bcc3ed1a1ce89a92898c962caa9fd6bfa0429177f7f376eeac920d81128ce1a101f60b00453a82382354052f332207d6852ca388a1b2b94330c1e2970ca5b1582b52e956ff6cf0ed53a824199261668a754891658194b168120da76e09706bc57a6a55e61db0b7a478873bf1eec5ec16b51c4383a5b50890b0d480e90303dd9b7b98c19e221ea5939b1fb2b88e32cc44651323161f3a1400027f653c7bc0377a01c83c98725cd53d73bd765c97c6fcf6f32f02e7753ba5319178c567829069e7e102ffce63d7f6b2e7b3b2240cabb4ba31556f8629a8bf4a579bf5bd74059c73c7953510f0fda854f6fe2783ab8fc06b5bdb7cbbae895e1bf527fee8cc70d414bdaa8b5fff3ffa30e611c4b8ed73e8e28f71be284c1d4102a44f3a268f5a3a4babeb23a2889bc6a72f4489f19c4b02d5ab1e79356725c8ebad612c61d6fa40fb5fc71ce99232644889ccf0fbf3142d8080d2bf3469e07a53e86a2840ecfaa59256fe547e8b69a8ed953459c22f1bc091be1a345886d524102a217fde7781ea3555a9fb42ff8c9c3247e05c3c37d245d444d98dd08fdc8ddc52999a4ab130b6d11475b248e29d07ddb4072077bcdf487334c44bc56a851fd82cc721a3f17fc7d36f376f49d18b6d924e617ee7df1883ae691d19d0b25e86b807cc545b843b9296b04573b3b8a6ac9105dcbd2eac0506bd69eff6dce7e758e9281af37a504aac371364ce9ab17cec1289b72bd983f39c46fb6ef480f11c7e94ad7438efe8eef2d374e25cdbf95fcb15ed42038a2b39006ac7aed9dafbf85822e83e4bb205907addb12a1050bc5635ce72159bc6e898fde243a58db3e41a820816b5dbe086e79ac4790a85d27d0afe535a28bb104d8b8250a621b85bae6a4a33f280d37a11ae4642aa20f1e3167eb71c36be7ed01fcc01010e177060cd798fe84ce1dffd80da68dc760e9c70f91df3bc60ace4851d1f0299341045c363e3e9263af5df7d4ba58d3f9a2cd9e3d10be393190941fbc52230e33645b01494d26c1ff02310aba7f103eba375f16ce3cdde9e7a22c14e6ccc3b06b67270f00aa0067e7e248ac8e724e75736cb250e8e751272e5252e58a54e2837014a7f3618a25d220576b345d4936731a867540bdbc3cbabe464bcb30e9b9f7adda14379b502ee105afd994beac8928018b8f5aadfee09ee3dd6e2500177869706b8ca0af427cbf01391e1896abec9cbfc81a698fb00c11396973fcaa3eafc8a6869236013d1d0e225d952e59de6b8695f04e3c7cdbaf897703cef105b703f70889bd312579438011def64d9e172bde5d26946cf08ee29f1ab893479dc62c8021acf7ffc0d7515270a222c50d00603cae93a54a5639049d94a0cdd437191e5de7da0963ddf22e85ddb61dc2c76736d4d92b933b18c60ecf3abed352ebffd42890e72c385c4dfca5f9d1b9d079e5ac39a46f4fb93769a5f002a48fb61fa4875ecccf75a7d0de3104c5de97c0d69d2a1ebe51ba43fb0d50e482404b148f93502161e6bb6191506253ae2f5fdc55e9c913cbae0868a253c8e34869dd07ab4decd9256be470271bd75109379f99ed2a1ce03c1df4d77ac8646cac78a66b3baa0a7c5bffd96f20dce6fadd0878111f075c7f291adb1d6e1296bbd289e022e4081a676376da7c1f75f784c3720736058817c7e109d5e0abb60afe4026b5294f1869750a0c14d25fc19df42122ec1d2794b8a5dac7be76ef820f23e1f966fb18e0ea8e4d51fcf683c0d38caa537819bc9024ae7d44e22a3cda7a940d3ea597f25522a5cfecc766f1e99961ba3851f5f138a6c4ffb89c1761520dad50653efddd5725910704c918f7241b92f8b472a25cbb9424df03bd198f92fe55b5b5bee1010a1c076db016c01f94743789a335ca68576c45395889854025f6abf640b0faa6ecb5334d112b425e24ede501f75491050b3827770392ab59cde1a4de4fd3b60abad1e6b0908cd0d73d2a72e5dca065f065cd20663a7e6fe8bb0b5597ac860a03a3c13b879788043b33130d199b431f5f60c2ed8f6d0ff1fdbd3a7c82004ee43eab5959efa21bd42d452c808318687e4f68721d0244b506098e230bc8cb50833a94a86b5383ba9b59fcd4c17ad45292616c0f120bf31d2cafc93e80941b591d9ea348c880a64e665eef94f7c71c282332a4bac002c8ce612ef143cd6081eb0c83166651b56fb04489b6442c93cc605dab7d3c466c1b6bce572a48c472060effe63c6f6343c0942459cc6d76b07bdf4aeeb0aa589051b12c1751fd61c0cfd4b95892e02a28c47cf2fe5b287ea3cff9da2a6949f10ede47a95ca89c06410eca1d7cf9b837d9917c134cc56271be0cd6020f5cc9b41714484324f862f64ff0c4627b4f3224970f0c8168a6c9307695255b69239e5391a8bd47b6790382cc1803d37c78753c0bb5ec2226432235a50de758dd701647142fdde9b211bb5c9b0810597051bd3eee1b64d4feb6a737826425942673b3243d9fa5447ce206c68f83b41383151f42a40bd243f23b4891ee6f1a774887afbbb37b1a250833bd0c2e91a31fa794173e54a0e583d8baad9c5db7303217f7e32ba383e6229c074e655af0f32ab1a30bf5ae8b7d0549ab20857d393858920ce6744006912353805c0db2e0a4c86eef59cc0794adfcb67761b0a2a4402e7f0ab1ebeca24c49ae4424c2c79064ae5703e0c2a23c2aca66c20721106917cebe4bbb5a22987499b57444d5e728e3408b2caff77a164401ab631141c8d6e170d3a8c92cc54e2b817237a89a64ed9846a3aa0abc0c8e08d8342df7c1f4a180bcbaedade486f3a9cd944a38add3961216364648413adf102a5c8f5e1a28befa3796c8bb9ccfd7789b2f8ffe38c80ecbf8a09379ff1e0d5c353191460df84b2021c3d1b6191427c53ac0b6ecb9456d396665dba088079615fdf03d5abef3c51148f4da162a9354036d8c53a7c1d1814f0dcac7b1814ae24ef5bcee166d8e3de568731c2d2e425ff3117011de5a304a8a47c348ee7e68201f836bb56f9c0c000f417a0f2dd32bc537231aa42a4de51af2b16f6b24e93f33bc856d2cd5f12fd9309051aa3633936d0a3705f2f2e14225403f5bce3056daa2514df7141f4824ce46735b65c2df73d9e68151120d4cbe65770ce2ea1c0f186cc9f883d4078ee3b8004b44c312f50e0f5caba29dc8d48c33839beeced4a3cea93819261cc6b91103de5fc9ca1be9c380393ac75aa7264f6abd958f219600da2d0c289433e34e8e96ce8af90094c377620a9a4c30f1e587eab1153f80d46fd7f3478121d29a372491f2451606d8576b931ba48254652d0c4d5d98d3cf58959d60105ed67259da44df56312641dcd125052a0ab2445e69a3870eea91a9bb9b54e08271555260480f0d301058887e44e3e6439ea12c0aafd32699c0d7040a152e4632628cc0990c9d40a92ff6e9382620301fa7f8485e7f97f10d56e3f9a8be1da724af434870ed3337929db90b60fa1407ba22b99d8e316c43b84083e12980272a2ec02cedeafde9df7ccf8bd1168128c01a22f03b0d461c4f59606620bd9777ad099c4b66d48dda846c0cf29ff910e169739f1c150a3212c46a1bed15f18594cff48275f5a92bf445629c77790b673f145a6df9bd5825c859aa34a56e24804a70c32e4a01809c575890c4859b381c9a62a7bec932984ae481e12df616bf89abf13e0d75461b9c68761a821e043113e8efb8f7425e72528f877ec5a97d544888a49820773fd13239466967638aa1d407fb93ba400b49e09c57b09219c039b4acb073c7825b92ddccf0920ae1c2f1ccbb19ea629489b35f6bde92aa84460221f7f2421a2dc69908560274a62c5602d2681d228ba2c270e50c36422d55f6969995a200f9cc697eae4c20c7b0c29c0f0193f4021f83dc318f5c07157e5690f139dfac9eeeb06171d8f8a0fc78ccc6a3934027de0203eeaf88cd67980d178933352f398d907e368d80f2e8503ca15ef90e8c84e04798491a0a981e3e17868c72cd3e5df0ee5a88c6b404b7e7f9f1d4d9f317df4715de8933bb5b96fda9a17d786f4a37ef4b99d1115593b470b27ea2eb8163beb9e023ee4fe1ed9cedca38db90d91d98a5904ea8d368e274ac19644c31fb70196757bc4b23aa4bd58e19bc161b6ef104de9f734e76629b8cb7c4b4681a4e84b166742b881825c0c06d3ad561160aebea9f9fa0e0a4c8d7547b40559613e4c327503a530376e623d9d79964a6884edb11e36ac3786c0d352eed742444966ebd71ebe15584f036272cb9653898416c4ce17892c2953375f975c1e9afc9833a6859106dfb9c9ec02ffb192e9de920f9d3a58318405a56d585c84a4546fe5a40b45bbcc7e014acaa422d707057a4aafc2b6af7861d4934042b20ccd340281652eabcd9c9e436384f6212b00fa513ee51c129f0846aa98c2b4b7460b1b72dca59ba891261d5eafe805c51b4aa6ee1f80254da114ea065b7e33f1d9eb06276efd78c7f0bf32d248ca49419e7eae397f05943ee0d166704c9a2860a49c16273a03de45e32595af959e432aa17bcfc0d0c9973be205e02ae011666d44c6a1bbeaedcd6e789337dcf08d6f7cf31bdce86637b8e14dde74c337bff1a66f70a39bdde0a6377bd30dd3e3e9e7f0c411f1191692470e0e8dfca702c8000f0d153ab802144b7450cc243c66f36b89aa436d810182c4c3ca6081aa9dd414ae861fc4e7fca190459aa2eaf236dc053014c2fa93c02fde8a2b10ace08ac02178f67f1a67914ba82869c0dec3876330bf18e4428d7075b91946011a8265fc61e317fa05d56416982564b0b21f19a1810bcc87913aa5364ee95fbee0173dba87ade4667b929f5ca26f3d8767d44a4f42d679bdca3412db12490bd6c06c6ef03e4a0ffd68195d429ada586bd859b625b65ab4eb7297c7abdff2f703c8052b35e8f4cf1e5841aa153d1eef82e2c6e914748effe7a1462c9b9c8e76472a003c9b18afdfe1a0963ee746cfbcf41a138d46d721f874120ca7c78333fdcc0f6c6b790199246a979153815614e532a2caf947c16ada9ee811762d4cc71c0d35e7e0cccee6f79a57961193a317135dd793b6fffb93ff7e3918fc8dbb042335b838d8df3c91ec9e7db8fc2b9ce5685587b446284d77a9f744c9e351d7c58d3ea6fbf27c026e3d8600effe109b74be759d0e9c5aba117733fcc5d05ce6533a4834aaf3453f4c394e6fa6695d8f0635cf81e1f35a0036eae5eb70a0380c5e351fa71bf295bf9aca827d02368ed51b7b477dbbdbb19cf739b87f1351a6d21437fcc73a22878443c09801b1984897d81ca4dc1807862ab0d970377c48159afcdc736c98d0e34b5726f214d2494a4f62b3b56807611f19d53a0c003f87a40a7897619591f79a561a7e0637244d4cdc4d23eca81cb889e12896756414c570b313094b4ff214b5184e2569ae92643055ca79bf05397d91e802eee1a0b401b6fbc81b30b7044495dc270cad047858f476f82fa341060bd95afcd98d266be1529b5311b98037fc0fc67cb2135b1a1b8e7138f6e5dc09f23b46a285ee44fd526c4a81d25a099bc70f0b95f1903896b710f628f2056e3515127ab94ef7e19f00e19768740dabf5d639b6ca37fc68187f1f9ce3dbbbf0c9419efa98193246cf93961eef79e3d47899a4f3fa2e0b19dc0034ddcf684a3d99ef36ac4112d2233dd26b3c993fb674817ba5b4e1f2a92955b5216c5da40f1d23beb25cef7b9077a248426d850a5275d78e9d5c527698a6d05d455393412872f082966c801b587447bd65a604b4891c4e613dbae3fe97aca53b3f548372b926b3cb3c7904856d3c0a20c6618726edee5a7291eea7e7b0d102fc1d46f695364289a442e337eb249d0dc02cfed6d3eeb3806ca2beb12bf12c5e74c610fa62299a113e27d6f93d1d45e08aae5f4ae202d748619ddd6f7f67dab7b64fbbc982aa6ac9b5f5f1d56bdcb37ab9164738bc06c25a25f7b5348800f1c2330abdf20cf2cbde90a35b26f9e5feb55100dc6de7f982bf16fb562e5575bca2baa0ad162d96d9e714fdd29d786422caba95e4143976a768eac9ba83b3f04447b3b7be91287ad301aee6eebb56da973ace9a9fb281e39a42fb4fc274908597c649fad6e9d9e2aebb14cbdd1bb7a3b3336978d1fdb0d7f580f2a2a66d13e10593eb8a5c33303f233e169e99230e64522e24fdb853ea8ddcb4952308d01970106bc910e06fcd889de917bb6b9a9cc94af7089c96af964998613ab4e90fc45384035c385a0659c74232645a40513e2c29b4f79e9e14c30a1e1968eb70c78f4b01e1ad4771ed6200344023f7707d4b9e277b5d22d4bf7fcfef5d29d82e3254a5d48534b3eefd143ddd0ba820853684f0e9b231868604429325c4400b226abaabc482b166f859fc3713598686e7051e45c66ec08e25cc31ef7858cdf6040be3351919e9db93ec429043363e84997afeffda8702d2b2bdbdf7d1cfd0d618f26f02aabcd79aca3953e58ec5bfba98b026985d1375b1a7ff9034d8b10b2777a1bc12a4c0c7634ba99c9cdbdb19791b72723c8e28859ea6bc0180fda3acbda09496a13b9901e0d160b5e46f2e8d5e4a4bee53782063b0efe10eff0101e4fb7bc5da2834ebd9ddae7a11c41d5a5c830ff532d2b29213cbbafe97614924bd837a780c3c257fd7783e2fa72ad6c8cd4948690d866e5ca5ff9a9e2922ca8c849553e29fb08cc2f1b7845ecb62540487944d740426367c101ac185960628cfbf6787dea6c6a77bf644a6b0e8a370df4551669fb00defe70ad8e037178f74e7e0b7f74668da6d9b33cc3c407052e6f38a0ee5f3ed781442d56c68479d3c95d58e6970d87dde8389e97f56e1ceb274ac22bcfbd4e223a478d5ca6f4145e651d46b25c4b3489be65dd47d0886ac59dc60419765aa1654af08cb901ee0f1efed5f4a49681ebf5cbeb6f9c1ba4341a749fddd917a20c42304209e0030688296205c80a19aa75f1b246c62b018dd986948a09b08e30001b5e9d929e795f14d8ec5d335a4df43a05b990db22faead7b85d3431ec28596fe4a49e18319a577049741adf100ecd2d41a63f054f71a8795515db392a963e1f585417113682583c534b50a73522d459bbe98b35ccc4509393736c018762e9ec2fe8fad5329560c20cfc76a079652184ffc62ff103d00824cbe5398e4dc4953408a8ada808c087317826eb227b3d250f188d2021409edb88f43c3982c31dfce449708aa3316b95f37ff33c37c3c41bbbf837af3633cc2a7f34e185049dd79858394b3aebdd21e4d3494d6935affe042bfe21767066ecc980274923caddb67190ca183742907b395d34624b10838074ac41629585b94e6d25ef29b4a69e1cc16d0448902ecdcaf362456d0fc983e32bcc4cf1ecfbe4420078662962039fbe7eceb22af6c1be8cd2afaec4c304a4f17ce5de37827c7bb59b7be41026996a34bcf71bed59d4082c042aff0aa6edd0dc6ab10b8ec64e482618d490419b7f33eebd98d5048bbebdff0b14607568e7ad82abd7caacf5f7328629f3e415133238f01a71cc25bd22b58e3f69c8dd6372ff8e66a24aa8f4c41f2c843a17c982e3b5cc2762d4eb95f3000a7af9a11e6918df099ab0219d584c82229c14679d36fc8c54437ce47c36ed59d0eeddec74cc93a91731d7f0ac0068aaba9b99e23538da44c108f5f96cf378c5c6c18055de83d341d594498038397bce3720f3cb0cf4a8a3e46e697ceb100c6e67dd8ecc0c1733f2b46695a091fd376335930a556a88b5e56b44f52e8ccb165b0c3775871e0812ebee00d216a670ba2aecd768ae39656c52ac91912f17483af9c41e41291f943f0b77638a9705542ad02eff8fbf4a61442deb65e24130f14cc22133dc01436f183d84cf3af1a4908ad666e522603cb3039984a2dea77305fc140649e2c4d30544d60317e7bbb281b00d20b2d5de84e06c94ca54904c1a142b2f62b00a52d79d3a577e87ff07b90af62b6618d092449c6e16a02045d8071e46fb99e0b7f6fb39dc914fb0dfd1985aabea853352a164c9bd6786b4aef7aec2c5e3d8b57acf5765101b6b969e1d86890d65ac33f984d4b7af0bcb02e43352bdc64e63233af77e7532f7cb41a257283fa270e37fa622b0721e789f87f8dd7f192a3dd5df6ade8100e681987b3b2da0f4e69f15c95b8b331b0a0f0b486f893076c151d0f97c34763e5858e27649a2eda85ca69bbfdc1a8808644ff8721f41e21f0c1060b3eb3babc074ba3c1c4a8ff87ee4928ea175e1e1f3f268bf68f18f3ba163ec2d8c5f8348535c0b0dc729ae2c0da97ba1a349728e77f9921e4ecfb0569cb77db8c951659b2d04e619616b15ec6fcddccbb0f48ca1cd0762497b4f15a97a4c3e9866826d87e68ca434801cf21cea127a176a4d620b91c73541c3c8cc7feb996651f809d79cba19d45f20e5fbc25248e2ca84b7e0dd2eb3dde05a798869b42e325c36b5d8eafa443e162547e71580c67f1466a47f5621c4cdd4d2bb9a2146f2a209c6c0057e9813ca4a9ff33054345fe9a2a0174be74839d5aa945c6d769f233ecb1c6782ed5fffd3f38439bb72e940985c32dd703250d6468da3b62ac0a48fa32f6f68945451374d4ee0185153295b4fc5775a867883422176b407f00c1fe4b22786c62934bfc851128a0546cb640ab1fe8f96562b2ada635de800516dd730b04e8138577516a2bda59201908fd896491a2db6d3274401646177172bb1c9f3d7148f59f0a011ff8262a628973faf94b88f5ac3836c956fd62df9338aecebcec483f0e9fdfb4b14aa0fcca5681018cd2129678967ee393b1acdb2f6bead44109c614e45c5a9c76fe3236c342e1c5afea5e4ae137d0c8b59174f0635dc8ce2e48e676cc539b43662cea4225d3a860656c6afe24ec37935def58399fe95b346f979ea3e762b026ad5eb5115b58070c7315a6fdcb1fef5127505a58b91d88fbf4aad30c97902f6e1759820170505e43d95823361023f9ec2528e534814fbc06540b977b6f51420c23fe8a0f461c09c287d702be3c8a6c548774fd96206a20445962a07bb105d8a0c0c1ba8499a3625a976f2e6128ef1735085b6213ef7bbb0738828e1d02b3c03eb819d8bdc187936eac536758dc60dbf905d8e533fc8216eacd2f4a9458a1f606f6efe80abf8bb889deb334b8a3de2b69f09519b570bf88b6dacd635eab4def04bd56611bfb18f41376bd76c80b403e5d3d7a28d6d73c4d56d07a951bd1f2869ca6f0f1bc1e131b796ed9b87d07d100d463c0b74bb93c8256e72440ee633d7b9efe683cd71eb370466ca02f889ee37994d1ab4f90da9b37d5dd56eb390aa00e39f267d6e0875fbde78ed39d9d5c3d7a97dc480fb59f8ee1ef11d1cfa3aafe08daad2916c3dcbe209045dde0c0bddde01f52ac37975564a188f0a885fa0fd8e53156d56b81df397d4325acd5c10d7154c876e3fb113777746b9fda2d84e343ad89ae0525fb9cc8f40677eae5944503907a78680d194fad9ad7e0c66bc0856bfc9006ca5aed0bbf7c9c9c8bfe92099d64c41e9e86a235afb51a130f8c315d3dd357513469acc068a2caade9fc4d829c340857131a2c656903698d9caaf62e602a045667e0ee63f9acfbe3cac2c764d9d07c7529ee505fd88d16eb57d1904c67e6dd7a3bd678ac5a2e44d6df872d3913e58238e38c30977564ada27ccc2c916f2ee7e16e3f1d49e7ccab81d5c5f2ef00ccb300831a7a401ff16aee409949aabf25eece10f6c39dd360a6fed63b266c0f05a67924d53e9c6cc2c89ee23111ca69983d1057907d2370990d88680c17a716446e0d267fa4d40d112df984de427c4af5c52842e4068680cf3e79c1a78465fd7978b073822890c908446eb20676a4487abcbd6b210c46cf9240c344a1a258841d068584c401298e6f65420801e9d8423c1686603c7559095cb91e39f1c1e444fb8eafb70bd2942f52c2e5ac189f5ce2dbf1dff1ff5c17c7ea239ff02b7a00e821b335c4962c4871fca639cdf22fd0ac399716020adbe9c9be2396db12b90cb91608e68827560e345105feed84c410581050e76c73c05ec1447c529885eb99bc1c4f7707be2cac0b0ebb81d4f45e7a5fccb37a7edcbd18da80decb2a663134f823b567f65fa7c6963db9fc020bd4c4e147c1833eacb37390d2a9034860ef75d0d2d2d2922da54c0103108910f010e1d499cbae1307986fc9e47f792b3d24d6f8c4016318641d0c83e29edc6202fe0bf824d86a224503855f5424f9351aa898d40de5d75e47d031bff65a42aaff85c5eb06feaa01de1193e545557b19217d01e1c583268a90ea5710d250aa2ad5b55716a98e1da183f4a5e545156b02ef88a9c2375278070dd41178079ac337fabf581334612875448a63b2a49ee77939e7777189a9c23b624b641a28a781c23b624c6028bc2316856ff4a3b925c6bc44aa3f0615bec650a9fe181338c64414de11c3826f4ae03cb128dc46c756d0b5dc5dddc768397679e603c103130ab0039a1f623a90f1c16db44c0f323cc8104066496607b79179d12146460e6e332386128c0c0e2f646e90e1c206b789c192c9c138b778b15a82db681725b0cc249c251256e411dc468f46701b53dc528645701b1224c2f80d414c636282d0ed88d1c26ff4c754b98d7e1dc39fd1a5dc6aa1b98c2aa14b5927a33ac7a4f46b44d12514cd65974673a85296e55c2e9713a2476717694c4acb603e34446b3030286a83bff4bf10205c05a1805437bda85a29fe1dfca5cf4fcf1d5cf66205674ecb5e489127c494881df1b123b24e4c96ec8a29e13a3131f01e638cf14a4b76e9d2a96cf221bb3c7db10297bd24e08549bf62b2649d702abb6262e03a610bc029e0af9e264b0268a8d216d04cf1c2a4653430f0702aebd048d102c31da42418958e63044e8cc9ae85eecb78640de1010942813c084b378780512de01e1ab025c304fcd5afd029ab5fb5649aacfee55f501a29fdd2bf4263aaf44bd344e95787c459c350351a283417ebe1ec1ecdd53a53c8997e28097eef75698b7cb055b381516998732d8753aa6b31a91c444820d518638cbb13a6c8ae2fe79c73fe1814a114270c303e612abb74daf5e0ac954d594e3003a109e537d5793c3ca5a597823386e6501a10d040d180a064000d54d6299bba16aa84e6a28451ce34a3ed7ba6280e6ea31fb5c16f948849c5b06419f8fa498ff13fb2f8e48c726cc5e090924972eaf231a68ff7e5d85aa55dcb9bb8e2001034a5a2373363facc983e318c40654c9ff3c9b385e64c7409a7e852f75d8c3f9f8cd14297d05c8cafa13934c6ffc8de9b92ab560c4b7ee99f8101bef85cfc8c29c44bbb15e828b20a84e03486c57964c868b9db741f930546ab166b418c0531296a21aa94756e259a4397b28e9b3ee739ae7e5c8d248a9990c150fa5d5a9dbb3ab456fe18922f6316e952b32ccbb2488996336618d6bc1fc9d72f8e2886eabc918659c44361d030a130146622eb68c9ad1716a60f465f542f38c556897dba0e00356e9cf853fc63ea4d54e086d45d06fae01ae509219a731bfd313497eacf91a30159677c34067305ba43aabfe64ad19cbff49328bc6cf0a272977eef33e9270ed15a0ea71c44745f8b01418bf38a10c7a46250b88dfe9894f3902449921f832294e28441aaaf48f5eb20d52ee30566468c8cb7f4d8d253842d2340f44349174792e5c25fe0d385c708e625888053efb067975a4b84cc2fc4cb5dd7a12774ba33518df313245883133f367db0d969dd9942746a0af1a6a45a88464f701becd25ead4a3ac444dd4ac63807eeeeee180391d9f481829da2b211171f285d9409b269e4459b42c4b4731b138ade42c583671a9101058ce2217df19962140acd15d03442a6180a8f2ba1db88a60f149c28d13452a6181d331e4591f43a721c3d971a2e85a2afe4d2173f4e4bd3c82ac5a81996a576a9e152cf2e4c8e2e65e9529b9266d0050ade22f5c79a0151473420f5a8237c485da41e750123a420e9eeee2e7ab532757787c9aedc52925d2449922c6417893a114763c0247e924463c83ab8c33188cf23bb32466b658a9f04bf46922419b6344eabe68f6b62c031f89b35b22b33c92eb4467e0dbf92ec8a0133c10870f4a7ce10db90e6fcee4a48b327a13c429a7d0869ce6fc33ae1d79c0869761fb8acf3c4cffe83f4fbb0c44d30f2e307b84d7e738832d5682d6b235adef2d488cf3113d641ca032618429f81df20cd4fe6c778881aa44df9f1039ca789db342067fc30e4a339256b2ec47f64f7295788c24c49ddd11926f9c524bf72056066c02ad85b0981f3cf6459eec93a1c22cd5f3ef18106c0c0a9329623498e6f9635cc448a7e3f26195fc41c10cdf21b4dd3f43cb3c449f3e8bd898a47f27b9d39bef9a6b8a304ad8da85896e690d58f5814c5c75063799e5a86c30a5f2c1f2f51c6f871f4bc11f43c34cc0fe3711e8c81e61761a046caf1c53cfe88f1ac274911ad1529f1f87809bc43fc118512c51a8c37bf34878c2fa245621214732006fad56c30d0f76be690522cc751060ac6406b5dfa9530be4f4b4a8a59cc3967ef43c5f3730b2fa15fb4cc77d1d2bf12c5712c9598e0d748f0c717d153cb5cbe7b7f2d7341715828fa62a944cb7e80e1d7c650fc0f95f91f9ac4d1b2ae7bcc01bc437cefcb1a4e6abe182ac149bd37a71c101f44310738009a3ee6f8a218cad05a8d54fcae26154db416a64ab4cc052d3bd3347f487ef3ada4654b6cd5ca5434c5b245a29e8628e600bef1300730145518a3073258554fb881a5d45f884f64e029373d7144930bad75cbc653583e0e1f0ccb96063b342449f08f74ddf769fd7d5a6b8d5b6019eaf243dde92eec1e87a1ee4aad75f87d2ebe21fa8b42517fa00671da755dd795e0772e7fb6cc5fb5ca0fb1b6e150d4d8ebf4177ea18d24f0971fd6a0aec2586cbd6822bbb2d65a877a8bde82f18ba821688dcd2ad88ad62c25c818c78f318ae20f3d7eefe117fff3d037a7e388be3945c7afbdb59c9a3fb6de6cd5deeec3d8341f7f6fbe9cc407f198c29614934fa2581c4fc7e3eb29eb8ce2083aa5dd93e4f7df7b1f8ee193d9c426699a6868bef9239bad300c51efb10cd408fe11255199711c1f8b4fe22751f1f5547b9d32cc1f65881ff93244176f2792323e1445f193f1799ee779a189a2f83d182d9793f5b975d6462d695773b992767f8a3f9a3fe2711c4fb448fc108f62eded6a22ea7d68d1f89e288a3fbed744383e368f84363d554ebd8a30df7bd696b4c3ef8de708be0b16fe73fc46a9954babb379e3079ae6388ea359d356a4dd972d3da565f9f1875a26be37457675ef4e9268bec049fef86038b6aca4622b05aa14bb9e8a11157a3270f0403da565e44f8925068350ba94a50b5ab32284138c8ad2546094a622e22c12df4b6b6094cb47651df3432c59e77b97507f88d63014fd72c228b804780584ba9275960031141804d383a2b7d8e2c6443f100827f80e5e21e2c4694d5389aff3e92cb410b24eb7e555445803a3d2a8ace34f5cf194ea079bc83a541a0b2d8410fd91c5ce489742d15b6c4125a2218a51f4550415a8c9183ca1002717fc1fd65d0703f32678f9ec3a14773a0c418ddde5afb5eeb4ee3cfc39e80f02a13bdd7962a745af3bbdf368a56305c565c7a53565a65bea942f9983c48d38c628e20d1129cc39e7ec758ff5e32e279402c65230e973e7f968f06ebc1a3a583725d5da6d3a1b4d25d5ef36dd839ef79ee7799e276227c050f44011f4bc16f9a2588e64497a1f688a5fe33cdee71745b20c7ba0e0d40810cd34384d300c41d37bd0d3ab28d26be0ac3dfcee7511f61e4bdf137ed65f0b47922c5b370e739bfc5dab06dfe8ec48b3e6398f563a56505c765c5a5366baa54ef9923948dc88638c22de109142adb5d6ba46f4be7623cd39a1143006267d5fc3493f1a3ccff34c9f6c26e9522342d4a55fd9aba183e96e8af760d654d2eec5cf4c824972e683b9023382a4f7b998510385eceeaaade0d855d349738d8c94e54a5b24598e64499ae0e8f24c107cd22c3df3fb1ae7f9b069fa80ef5a9d622bd47e961ff8bd99ad7c9ae5812d41c040530f4a519fcbe56ed8e158e49a27843842874f00e1240127b430754ed4c0876e3575852a574da53ac4315e878493bca26524d49f2e98237479c6e7b34b6fe0fc32c61e8258346884b3064a815840a9ac83d399bc811326bb6078b9cb2eddbd5703a740f24a0d944ab5d6425e8102a3d20c6e396b30698649cf14268b659965f9bdf41513d6e40e5c80ff62e3c9c61121ea1a74fd1ed8aa792008a29a246de891ef49b7710436bfc421e8e2b8bb9275c0c7e168fa806055f8bae575a98d251efc1fd946129fe4446b39c5cf426b39d52489e2ef312ad3bdf721f818ad15095fe3d728aed9b8429a435c3c468b46176138bea8c330f45c78b8e57ddff77d9f762866b5cc3f5be5af5a1d0882e1e307b126a9d2fc226a35855f6f09df43b428fc07df436b7a8b4ced45549a6bfac70fcd21e01775a099a44cc1af4a6b7a8bb740fce4f8369e6c24f1993ee3977a20083e061f63348bb4d629e92d3a4bb94d7ef2c699cb6d0943345be00cfff58320065b56526c23091b4f3692e85eae882e5ebace858b53aa41f0cb773349f81e88be39edd037a765881695ff765df932be057a9e0c19ef7ded48f932fe47cee518fe187aefb97cf9e1cbe94544f72ae2f5d475a8b622bbfcd1d7f7614b7caf05feaa2ccb10c6ab08bc83fcf0858c52468c97f16e26f164843264a0a48cafc990d18af1309e44c9a2f2bdb07b418d78df85a80cf9e07fab95f77de87d887eafa7daeb29fd5e643cf9d2aae1b4fb562befc1970ffcc01f43ef5f5efc56efd272d47b01b394655996a58c323487842f3ed8ea5c1e46cbfc172df2c3f3718b257a0fd6deeeebbe155a147ef9dfab08bce35d7cf8766188e240a2a177e4fb12ad79fedf63f34859b375a80cf8de936396daea6b2954a5241ade70daca6f9de40aada55035a4fba212ed5c4caf23d1f1c7f13dd367145b7a2abbfc4910ecfef3f4fb5c9caa642ba6768105e959c775166d05f6f0c6d9ad42345fe0141fac819fed55c4cbe95504883310c02ca5cee23a59329024ddd35974960f0cc371049d325aa24f7e187ed69d46bfd273f2afa6a748ddb5146994b305a96721c72fedf093249a738664e875a476724af377e92886ad2c50aae4724ab6dc6d344e47f0c596670488eaaf853a04c925743692e89c60274ec52e75415dce67b15c5c582e9fcb6ae57dab154b8f7ffecc9f68ce79e274fc5c582fbed58bf0b491c438fe0b1797f3dcc2faee6d24c162a1369260fdf7a9d8317543744d27383f330921ebb0bef47c5cc5c2ac13647966f964eec877c73ad0819622a7ba4acbf46b2dce836b30a9d6e23cee723ecbc5bff899acf3e2f57fd661b15eb80059a1cb67989444614e1b4ba461cbc695b4b3914458da78ca3adde3b77104def16423091b573aaa94b4f1642389b03cc169e38a8d2b1d0b9b118842415497aede9f5c9920589a660a8aa00b2882a0089eab96a7e6cbe95544f82e6859fe699aacc7ab0fb5ccc5af563fae9e85d670ba7af03bd3c898aec0d7e690d57f9f8a541a8becd25a9a385dff0b172dd7af939c399ff5306058ac164e572d9c7e26114fcd95e992bf6c85e3eb885a0a55e9eb29fd919db24e117887a7e0bf9ebe5796947c39bd8a2071d93571be9eb2cb4a0abe9e5237f1eb2a22baaeebbaaeebb4ceaffc2a620bd3196ab11375e7bda8b5a7b59ba228865ff881622becc44fd45ff75df7fdc05d156137e53a940aa53c4ba75bb518b2ab08676d6747cb60c2b36cd2a513d92af3cbbf4377763acfd3def8e4f8ef6612affb518b1a6c894f86bad36227b63cf54a22b22b3ff925d554d9044271d6ba29cf0212e1c4526593f69a9cd29cc1fc5d193e198e22aa5bafa79a95ae55c33e5a6bad3d4f772ded141ffe388adf8f2d2b296ebd8af8fe87063ff04a98bb2048afd179a7bf3bcf98779ff91fd9691ee37773862626e67dc63b9a8f9969d1a0369e3ea645e34ff334ad1d9408e93433315d1855859fa97fd70496ecd2baeb3ccffbbeef03411004c3300cc3302cc57731fe0bf261941fc37c192eff123eebc5d5c33c2986ff211a4a65973e3f8cca2ecd4483329da70cda954c9d14eea46a27ced530548c5a580ba332555a0ba3c2a812aa76e25c9a71559a9fd2fc63ab5573a94f4976691c1c2d3b4fa8124acb744aa8fcc257b23683f01e6cd5ac5819d1175eb98d7e2af08a969dafc7d6eb69fc37a764cd4af9ab14b6a4a5f76789d6deb244c7ffb2353e59be3996651352291895c12b3232e57b3aa2353c8e3ffe0f5d8ee47bab29aad42bdf34cdcf3f8e66ab36bed70adfada464eb45443a7e28993f0e648d3dcf03bdef7baf0576de077a20dac1e8cf4b1897405004670d5c4a9f0c35d3e8f4345e818a9282828282828282d252b95c2e97cbe5b49496d2525a4a4b6929a89c96c260162d555bc6dcb834323d3d3d3d3d3d3de5a0a0a0a0a0a0a072b95c2e97cb0295cb9f78052a4a6a2acbd3d3d3d3d3d3135457050505050505f504a5bd1ab814865bce1cccd233b9c4261cd1296d6a6a6a6a6a6aeaaa9e9e9e9e9e9e9ebaaaaeaaabeaaabaaaae4acb5357d575e05218754ac14c7d1617158e96b4a9a9a9a9a9a9e9c9a37a7a7a7a7a7a6a7a0297b44cf780e1d2c904d3f44eae278faaa9a9a9a9a9a9c9a3f2a83c2a8f6a4b13b884b3c555f55a60a8ce2ce137d5d4d4d4d4d4d4043269d937b5a465b8273c4f18987f976b29fda6a2be2970e9e600fedff7a0d8929169c1e5cd67527e0e2edfe7507e4fa2da4a9acd2118eb2e77e110adbd7348978a9fe923a25a8af41be2a5e2935e298e9ff8e00f111f1cd1308753c688a8adf8fe1bf2b94bcd4a2a5304b492ba290444f594db7c2fa2df6b14acd259017397c524df3d2fff8b888c168de493e52b67f2c532af5e145768edf59442958b0b5a5be9dc72416bb93445fd6527b642b4067e6976c91d0a9cb0b75e4e2f22f4a7bff67a1a75a76164570a55680dfc0ecdfacd143efc554ba338b8886868a29a44df1c02a245e3179da0d3d8755467f92202fc37a7e18f38cd565297d5cbe94544f73aa273f1b5d7930bd6875a06e359a88b8ef52e52a89a02cfee6cb9bc8a7815a1a73c1cc22b640148999ce2d4759a538c759a73d65aeb2ff5d2aeebba0e4cbfd4f33ccff3643453ea1fa660962f3b795a3a7c456f49fd33dd6d3e7345863874c1dd0148afa175766e6c6cbc76f42bff8d30bdc113a63cae653ebe07fa3550703d662100ef44de5b58f23967020d99cf3805e213f330431ed7c214c93b92337d214c5f787f8126c30be0858b67ad4c3c86dfffd0b2191e3b19804a243c4f18987f570d47474a76659d1adcb5dfc3330793fb9c2bcd399c344f1d612aaa30a53ad330b4a1b53367a62234e72b619abb9c4c470eced7a8908590b57057fe4ca55f533e726e8002dce54ae17366c2544b98ea87ce9a081d0126d7d2439d57a6c22c5b76cb88227a4a43a1b1b43e874fa3abf46b0b53ba5b46b8f0448e94c4a89d2f5a0b2d04a7dd32428627d2324d757e7e255ae6a2019d02aebc7817a6335fd92d236678202deb72443a7765a9a5ef985c39cc596ab78c087a22f93101bc06d7c13eb84bcbca774985e16e8d69a6d2321c9f737c967dd6f13b3ebf5ed2321e9f5f3369d90a9f5f3769998fcfaf9db4ec8796f57c90cfafa1b44cc80ff9fc5acac81fd15a749596b9d0e5baa58e4986cff9432d7bf2f3eae72ee8f363262d9b7d7edc84d6606641ad50bf3ccb931964880186264c9660254fd8096f09005a8408be92a23f7cf45881070f5acb5129de416b3a87cee928eda49ff4150d85025acb5a6aa0b55c85a2b5bc25c5b9bc949972d30c98171930d017f85d9c2eb849bf3aa7175574d639b7802e41addece5312a335b155a66efa9c906a2d5564a14a7d2a15ff0551a9f852297e4af5e32a9ad24ee7f427aa584abdc751a0e02d30891d6b6f7546708a5ff2ad4401f163ff5e348fe030348f782f9ed9a58dd448fd7f6cd54428601a4201d332bb72d6eed83b5310e6ecbc13b76ae011106bcf3c02ea0fa31da95b611b65267d61d2b7c32fbe671ec17e64ecc62362abe5628d14d7aaa418ad59c13531750fed6aa45dabd6e974a999047fb632e291089204b3007b006601f68007cea4f7dd48b6b2123848c7168d348b28aae4799ee91363c424f93d994b0f93650ebad854aa45d711635331a918160f8d4d651d8cc6a6625266ea4d54c087b484316188604e1818937479cb14dbcafcb9e9b2eabad589a1b47019cceb8f49e1e510c06d4875cc08a9c6a5f9684ecb60d0a398aa70063976268ad1b3f490b08205000ce537fafd8d6822f528527fa20821148145114ba4240cd7fe855e169b7298cd26e04f8155f5acde4d252bf4f54b67d70d672da6cac3faddc44f2ee18397c5a68c3ffca1b530a7a0bb8d0b18659869300d0d4e4e4e099a538af9191ff3fa6370bc8786c60ceaf4a135f409878606ea5a0645491a281a282533ff239399060652345334727232aba7d1025ba84ceba58546b5d0192dd449bff4d368a14bfaa5d19c15e17b604e4c2a676927adc5a4c8772d93d13283c6a4740c4aa232ad978f496118ef99ca42e53de40b292d634af5bf90d2b827269581d34363a862b2c46481827a095f1086e10b76485370e6fc95756247b84b27e06c432832f9a184a84c7e17bc27e69be01478608a9e19efa1392d9369d2b2198d5ed132f0677c87d650a754a34f28141a95ea1a2a956272a685840bde33f35f4bc90caaa404f3ab577af99996f7c4a474182a894165f2c7bc951e4fd19867b2fa18985f7d4699803fe367a0535e1e7c2b322d24bca732e36164fee5e5659e0acccf787999190ff34c64fe65c6c37c13997f7906cc3cf854627e35f3e06b2a4830017fe6a9ac3ee6a9803ff332f999c4fcea99cc7c465b88f9d5379979d07b605a32f961de7b484fe3d249cb689ec6eb2f9fb4cc84d731aeb475718a65c4a0811dd7006002c658bb2e311318046e7383a1667ccc43e11d51c294fc283029292386ceeb8fe5c079c8bcfed80b5cf6f2fa6b311aa45ac66bd327c6939e7b58bba4e80d314040714077407b78f520440dd0e60f31c618632ff4c431e3acb54bf75e4e716b88a71e6a03fe8b4a468c9611ab978921c1d0f4293fd4f2aa7ab9e03d4aff267cad6c9af1341ff34a4a324fe367fe47063379e3f4c8199996eb19344cc859f29e9996f7ccf01e9a96f7d06879cfb7bcc7042638051e7041cf8cc72d25539060f2f233d029e0bffc94d5c378341f88394103029a11d098c0652f4c4dbc3820d5ff4293826c9658bbe09424c5f1fbbeeffb5e98624dbc30bd30b9699a3ee59be6909ce616aa842e85690c14cd41e0c4e9ea51e03c1f48b58ef9b116c4f0096231286f9ce6af58cec23a7d516999904f1c6166885064f8e4e7f45b95e54b548aa5cc1a0cf9028952fc1146eae5ec7939e7ec658f847961ca31a9ecd23906a7f9ee793450d81ca5c8af1c69a0bc898e0cc9b7d57012f5fe47f67e3c495de6ec3897187b8dd814d9d5c271d98b0acf587d8d95e26ffd0a6c6197954d628acd7779d26cd144d1409965139a51181548cd9697bae9d3fa60fc3181716af326c208a46612ec220522355d7ced4545bea8627c18c6f818ffa2d232ef094ba7a6ecd23f9c22c021358fa4f9bf22a4e657a63acb59835b2e970c192fb4a42c9df344d1f05fb45a9c96634ba7662b57918a2d3325bf12347dbe374f10821ca462eb4cc911ffc85844b5f9fdf87d68eea45131291c93c2b598147e1768ed445d1693ca2ffd18bba03450d9451345c3445476dde0acd140c9e0e0c0d1b8f462b26052976436a1609d92684781f2bd8c47292c934b651e9b43721a8382244992243dcff33cdc81f96b0090c941064b577aaa8817783a538ce650a5ec7a51753330148ac674386dc5b0b4702c056e73a39fa4998231e044104f3d554a1c967a90205f98a4f01006ae83d896342797eab7e1a4198d61c1e2f4bc9c63aad05c59668c73324b296ac4cbffc82f280d547e99f05d96d29acb522a964e65d3064e348779ecd0e0dcc1229aa389ca3a248ab16bd5a289a281ca2efda27a51a11f1a93027ff5318a48716a679ae2564dc90f6dc391c160cfea49b16504f81d0d1359068234505967448728a0898689118d49d9e04473259af3d09c175385a1a0a07eb48874e08c32a132c62fd212a4b8e5a51e9adf93c12f83d198d497c3592b9b4c9d9d88524add2c221343ea24fd5a9a06a7879995e6b2bc92eaa79940d9a59d4a4aa68897e2f7528cda48d6101ea45e5a43739ea24aa90ebd5246637075825ab6f2b2406192f4f2cbcbcb0c0d0c85f1a7b5b28974228b0f380ccba74c92243a3545160175907a20087a3fc40421a62a86062a36c507c459c350fe8554581193d24cb470de92a394655f159b22ebb81324904a754cc7a6b4a43a968458961816a97e2fe3d6901d1c712c5e54a311e07b3f602f66f538e0aacf3252b205a1f7c26289f38b49b995d4fc5a3943e43420d5ef39de44faa1b5d8d44bcb8b0acdb90d0ec3f37c5175b915938a4d65d7f7c38963b6c454c5a6b2cea3436ab84cc9a93cc0801401a94e4d98c059c30d702a9bb22bf6b2b249872801d2a720d25209181a266250c450805ffaf5154a54f1548bb1c0e9714ceaebe1f4509a281aa81795f358bdfed7152ec31e7851e117157e51ad50314aaa072432940fa674a9b52ca6eaccf854aad252c0203dafa8723acf3387e57c8125ebd45e545f0f50ece08a4f6b619a731efca80d2e8b41e12ffd31293417939a3123ada1b99894dbe8ff7a3863b66434a6ea4bc159c35061789e1e1022055b98e9c68963614e064e74495be0acd140610fb88cc603fed21a86c5c25034506ea3bf6c12c313d34069b0e53df985098732331e9b7a51ad7e5543733434320b4eef499ad203a5b238bd07fc5a4cca7b5169d96a85a234b8093361a62727272fd54e3574089c45132090822f4c60ce5903676ee1ece427480003522f7766169c353467ca00fe0a9d2245bfb4114750670dcda57849831dc039e751ca3adea34b2853aad12152fd31a9fcdeb90e8925d57fc20053fc1dd619a280a610cbbc6749774c5ab67afc5d93f334c075c2c7df3939ee9e521c86e195947cbd251d4d9fa6f4050d9496bdbc60a817a66c02f8abafd5c8233857684c8934365536ed4c6559b5f0955c2e97eb015b48e43397e20d9c200151691ec1e9e5ce98149acb2fa4fe47069338d12c399a52a7981c4f2996580a768452f8468fe90b292da60f26711993e54aaa3f268b4d949654d75e542f2cb28bca6d5e57f8cb06210a52107d21a58d70d6caa6175538c594eaf385540a3e8ae6aa4ea82de0153d15956a19f89a5c3da598290d712bcdde8b14bc907a910203a459e785c9bf1594a27ac0b7d213e21896ecd2b1a998546c4abfb29300014d29d912d398947ef180e63d37434dde38d11caa842ea1b92614b025ad9db92c59a75636a5de44124d312bd21a9a4bcba6ac538ba94a1b90754a5489068a4469a0c62fc44b3081afd040d53a1a26b24e6d8abf5e545542c83a1985e2c0b9fa568ea60d9c198b494401befe180a700f1055d2e17b625ee6f5c7a0701e32a3b5d854aa6359521d83c1d76255a4fa6bb11af478797f41677c2d4645aa8495c09ff9554be9e55739e79c3308fe0cf8f2f2ab96920e383d345e879d9e9917f38b39673c4576856397ff0b69cce497c93f0326ff4bce4fd240714073280eb114a4fa6352ee4da136f3c720092d3d60959c8029aa7a561f9342228625eb781fe61eabd7b2337ca1812201f062052fa4f0ea5739bd7192af8970926f7325bbc21604b8db7ef5dd4d5ba3b0edd11bb92a92cb12a1edb7658fb60b36f55585b83b122143b7d5dd8fb8afbb4af1515f35c87bdbed26ba157177163e16dcfde6ac17609c75710ba486575c438f1b61db4dc32705fda6ad5156dab3efbf4746fb7dd504e4e0a2bbbfeeb6b0f7b6e286d620f7099c30a5b3ef6d55dd16f6ae413b39b11fb7dd47b64d345bdf6d44f4aead7ae3ee28ebbb1aadedd14e4e0cf742ffb2371bcedd6dcddda1f8f962e4ee4642da86f23b667f5389de77dd6d7b374945b2a99f14f451da4dbbad46bb75f700d8dad667c6da6c29126b136a77942449ef3a538f5420eeaeddfdf5cbe0410a8edbc2d623f5c7c855916eab4a34535bf5e80687b665321c9d9b9d9da36e1c3b074d9623b473030787cdcbd2d4221b7b44c3dd07e0a78c1a77b7515f95f62feee8b6ce368d05f2c449cd0c4e1e66b36da477d5afb9ed28ebd00fddd6d76d57a11762ff61b49506636f49361b4ee867ef6eda0bb1ff670c1eeeb4fd6edb91110ba4869f314ee0ee4dfc8cc1b26272603d0da1edf708d7b6fbbd15219abd6a4f0c1c316ac070778fd1b9bbc31082bbbb878670eebf4443abd1efa3a4d755bfdd4146b8db17cd585bd06fa2b7e689939f199cfc267a6fdb0837d4aabf89defdb2481e46dbb77d74a412bdab12bdfb481bc9c348727701f809e3593d10e17e6357d7dd4b90361218278cd0ddfd7c910477f722ee4ec4dd876cb1c5165bb8bb630bb83b909f2ea2ded96e5b76b65bf5dd976868dd48bf8dd6f7866b5f687dda7e67fb48ca7e77fddf444c7e07d04fcbfe003dd1bb223d6d13b9eb6d15fa1eb785b9ef6ab4da8cf6eb26b9bb1077c737de9625729f655f2257257a9eedb63bca6e9fb6dad428b7226e0b237255a29b1b1d6a2c474748c74d2c47c591dd98e1a0ddb881630767cb6cf6abb6af1b84736fdc17c716cd36d1ece65d876ed8a1569dc16e8ad4f5883d526fb6114b7443e4aa443c3c6fcb1e1de1dc9f6da4b6422e78c8d8a560b4fdbeab91113b3301ac68a6063d6ddb6c6cfb3be86feaec5f95e89da9ee4d6ddfbfed23f65924ee6ee3aefaa942e9eeb077bbebbbdad45bbb5f29fb6d37b65da3dc7cdedb7683d24d63673b8810cbb64adcddc7e7c8a8252265d36e456cfb76538980b8ee6e876e458e8c5a229b8675c9c66d5c0b44b3573d72d72049aa6dbb40533791199423508c82b87b90a155e8c60271d7232fcbba90830da04e58e5c082025a4c66ce011cb0c41236408041004c142ea840902a2c60c2c30a33f8dc1d48cf8f9fdbd06a537f360dabfbe2d824950577f7715b5f77d39e68f6aa469ba5fdcbb5f7acc5b1ae0d3fcf1967e734eee10961cd6acadd67c038d011fb1edfb6b8990a4fc657cde87251792a2bb83b8fb1c6dd77b8eb70f7cefdc658c37fcdd7f06e0b6b896646dbe8c66558c1b82dcc6d37cdb6e2826e5e2321f71b2d77cf71d1e2eeffff5f93420a3c4cb0a8c842042e21f07fd5a7eda2d97a538f5edc91966d5b1f24b66dd99ee701027a9eb10608e8795ea16dfb1f815e2fd1d0dafebf42dbe6027a1edab6adaa90abbabbf6d3a5a8f4d3e5c7e588bbcff0d30587fb0a2bb8eb03fdd06dbd6d22a47ffd0a3cdeb5028fbfad433bc86d61eaabd27edc61f0aa1c908346a0770ebac7c2a0afb02703bbe030a793b91ea2a30173187a9dc6d8b3e3163a1fd8c11d9e67c718eb4c046310678cf54743c6198359860b187f18f48c4d98cedfe71a1f7739774cb8c3388f7808198beee12eeb8d712d639cc317b24cc6f9eb32e641c6f8cbb805fc82b1cea1093c0dba601918c7083576c25fc638eb1f9cbb51c4914bdc23c45e0ded937317d33b2b1d7c855440f6ce330570a75d9d97b176ef00b806d8b39fe7e9d8718733f6010eb30a18672f678df10d7c83435ce69cf30704a7907397318e8691334214b0e9222627007b7906eeb0c69e95e41f71e779fdfc81f00fda5b26c0ee611e27b2c61fee406c62dd9473c8a3f18ec639779f4bd1853d8c419cce070b07e7f10b33c6188318f3e09c63a03f2ce64e47c16846d2365824330e419c7f649a4c43d3d0ae1daff0973336bb53777946ce197fb813c2620d4c7a197bd8458631c6582607e023c58c83c212ccb8051c62ac33ee30114c23ebc83399cc60f6b0c6196732831dd69ed681357661119718e31d98268f1ac4618733c63c187f32320cdc65ec7558070dd63ae72e775847ce38268f58c4619731c63c98461e418dbbb0c318cb1eaf90b40d0f6b2ce20e068b220f39830c0d06408773fe32b8f1190387248271c619636ce3a01fb9bbf7707717dcdde5eef2d3647a6104b8ea05983f932bb44c3189400db258a25e81d3c21554aea4558527b9428a9da4c584039044804d8244ad55052002344110a2cee0e868c1dcec5ce17201996ad6d089c0887554ac841c545b3c2087d312dc860a093435544fb906a808d686138e0a36bee60734545fd238bdb870a7174f1cc80bc2bfc3c15dbbd36efb55df3d47742cdd6d61db16a4beb7b53dbad93476b6de709fd278420a722fd0d42208ce10414feb1825131b90a0a1eb1bc39dae84518202285f6d6a33cc82c302729f4b06c5aec6a4b193446e6c52d2ba1a171b320e19ef850e7f3c4a905b8185202c1c7237762cbc5e90f31cb0c7736443ee62b48d0b723694e41063d593831e62c30eb919220c258c05e484bcdc427724420ec80027286ad32bea08e0830d61c7d231136c2882044415a8500ab724c02593de0f16a8a333b267b872c30bcf350a195100ca9d0aa08e1b3c108121374801c48d12133c34912371420cc0c1cc59e10ee466e8d830823abe3174d1b22243348d510868830e1a4b4222323e42469148b984c6232a7776353a23a8e385f98da40f3a80227263488426a8879ca74f0f7f2d7ca3b7e35321f541e2c4144222df08ce7001b2a2e990882f30669aa810ba90b880820d6308036f9837644594806507c6783c5a472cbb14fe0728826377e319e9767e604f46b73c19386238d33a9a72e1284394d9c094c3248ed0d5d5e86a7c16c8a9e0d205f16c7834628d6e6615d3346ec8c16eb016d2369df66a40076000f68625498924a6a2ae2861012278b042458a5b24b46740037022430c4d5e58a284850010e1d9b9e142e104007ce7c4097cf438018d99013aa9008b1145b4e0e38387468c92fc9a60e203483c1941c40422e0e480175c293060014132fcc0073fac1040ac423d768ce053104c321106592af0c4a343e705063986e08c4c0738e064d39220094011213e0f2800017670419523044a2461012b303491e9c0c0e8a4980a42931e2be888e00781073c008824487aec48a1c448c847c846c85bbaaaf741d692aff0a87015f905990ad105e514598acc442ed2355c23a4e1cd9833f24b8e8161b05e782e320b9f9d4b26bd318b61983bac31fe3cc65c69192d825cf743ae63e153c125e534b28145819ce795200a55d8d04520d6bd94445ce0e321d7b120ca18676070c88902e864d034e4fb95a19070e71bf58e0a29c8855039184e6c1065fa07256dfaa0a441cedb22e7953154e4cad746033911c625833bbc1b6f88a518e48c04dcd0f9905bb5ced736ac9b1086b5c50d9e8d7007e4a1579a47f86a9b8e051fad6ffc8ec869f28be96ac898c65dd9d58c423c1ba000be986ffc6a258c1286f842c60005a09570c317a3afdce049e54ea87546ff73028d8ea75c7dac0e6b1b0da45362c600330803787a1fc8d23c5e0c17fc91daeb4aad75d6a00eb538ce741a7c0174b15232b2c00fc41aec7074371d0e6768aa1ce9ca71819ccb1136b0be4e260c724347831bd09ff72d969003186491620a0a29dcd0922d961004934f8f8f1564eced073eb849e15c85e00c322441b2451424883201089ca604fc58000d5eb0822746d001258cb881a1f0738300dc0b84db0e418b2a2b5c30c5093660a5ca009cc81043122443849840f322e3084c80408924aa50f9a131c3de4c58b9d06006508cccdc164b2802119cccf02283f582279c20c1083ac0010c00510002fc0c40003024415264055138a1821034118941152b88e289138c40044510d1430e386851f502178c40044c644029b769457c5866d50db0a001142700c10796a840103f6c1a0c457c5e2c73055140e1000604a1b46903084011213e3b785cccce6f80c50aa240811320f8c01218a8801005507a1280222bece091e188bd5cb03adfe20658cc000550387102107c00031510228802fca054830dfc3c71e2e306960424b06064e522031a334c3ef410030c3812f8a187242948f8e8ee27f82952e1e2167a099d123c24e4238417e82c902b908dc03939a671308cb4c935da867e1926601a79068cd133328cf78265882f5cb8d067b7325d4e134639839c195962187ea0fe3ecfd3d8dd166684bbb5eaeb763fdcb7bbcbf8d9b9e00e83b97bf6b39b01027a21f65fefee3729c8f5bf69ab7b5bdf5dff5d7f4752abb62ad1ecd57fd9dbbbebbf49419f9f9de9eea19f9de7ee28f8a96960a2e0349d7077173f4da8ee855985bb937eea29fc090c069be189dea1dbb6bd10fb7bb6dadc6f5921da6dff1ebaa9adbba37e6a16dcfdf453f370d7a16347874c878e8e1c3a70e8b8a12347474c078e0e1d3b3b3bb21d9d9d1c3b38766eece4ecc476707674c8766432998e2c870c87ec862c471693e1c874e8ece8c874747472e8e0d0b9a193a313d3c1d1d1916327872c874e8e1c3970e4b8912327472c074e0e1d387670c870e8e0c88103078e1b387270c470e0e0d07163e786ec86ce8d1c3770dcb87123e746ec06ce0d1d393b39b21c9d9c1c3938726ee4e4e4c472707274c47662b2984e2c470c47ec462c27168be1c474e0ece0c870747072e0e0c0b981938313c3c1c179777d7141ffeeba89dee77169371c1bf442ecbf38f6a56cda4e56e2eeef67c6f177b51db90ff4aa40e092187ee22dee36350a6bb4db55869f38057777e127666205299b765bdbedde567737dd3d1d987477ece7aa06777ff1134f7177187e6222777f7775fd6ddb9ec7efa0a7d9702c91fbafd98ee2b6301a6b74f31a09ed969ddd04ede498cd7008e5e0c041db3ab3999a13cba109e5d08143db99dd98c972ece4506f08edecd8ec66f6bab8f6c66d61af9190e721ee0ee3a73fb9bbccbd65db76ff4d7ddabeb5b877b77f63d7577d6fdb68db8e8cd67f57b57d7fe8b6beaf6ad4b242afbae770771c9dbbdf70f717eeb87577237e7a94dbc2663bca0f92dadecc5af766c6da6cea4d52abb641abcddd3df78ce3ee337efa09ee20477a542e97ba06b3782249ed7df7d8f409404df6ff9159d23fd4b2294830017ffc294a4bdfe331f9defb2953aae4d75f057ff755c40fdfd1293a7c8f874ea922a24bdf8356f93e4497be473f8856f9500fc561b5c516fe553e7c8339b10e3a744a4bf875e85027f31212507ca4faf392d252872201c5870e4840f1e151a986c13f04937076af6b783c48aff4b2954bb17b112b913f92e48764d9caf9c9c72d2ae1e31c962d2bb9960e3e96708f7e1d7cf4749f4d9916ba2f9f89fe9e924a95fc1f9a1b5b65f9e2f84bb8277ccf6c4189fcf2718b8af83844a920c1447cfc54c6cf2def115b63ab9401df475aa4df88a4fc1e4582e587e6f497a5d2f84bdf23fed7522a5f87ef111f97684e53a9a25f44735a69e97bcad7a60ca7feb245a58afe11cde9375bd04c942ce11ef1c3d612ee097f6c29e9e0a347fc25dc336ad347a685eecb97413ff95f4b295ce23d254a050926e3e3a7227ea6323efe9eb1e52d1d9080e223051ff7805b9c507c8b14448b8c48ca6f449292fc9f29d342f7f999e8c76f2ad15fc5eb3e0cc0c8a5f973ced86baba52c4d544e5ad2a7aa34ffd23944d6bf04cc11693e894873d880349369b81486e7590b97ba1444dbce5753a4ab2c695e4db94d56caaebcb494e632f736b08d1ddc06468ab510ca5c12ca9c8d2bba0bf58361d6499290e607735bb22b97392dd32d911ad4e2ac853ba439e73f977c3899c21d9cc75321e85612c0aa2160adb3e8aa0c2337ea80f4dcfb1ac8947a1a2aeb309175c8f7b4ccc5f356adee5d5aadcea5955faeb3693e95ee5768484587656bca951407371c3b9ba97b155adfdba6d1d61fa04f0a4abaa9eb6d6855770b7b5bf5c886d6ae44ef6f2336c9e6e2d855a552059523a82ca102802928988234e5a7c0d470821a98a881a8ca4b952b0a7006618b95244968c1939520aaec1802961b5cb0610b1b406043056c80c186d4dd97f899f341ae2917c4ca1536235a0c400b255a28dda004c3210b0e4a38dcfc00eafc41104a543a0c914313a52672488107097077cf420a25239c3b0c399526e083151121e4e0940394730702d8e1891d987680a2431074e881bbbb0e3a28427a5649a9525285c28c1658b420c159841a9c3f58c2140ae88084a51c000830b3f400022001000f26016070042a78285a4242801e78c8f9a1e907203e2ce9618ba71e5ae8c1460fddd2d4c943103f1401c4152066f881c7871af84000206c14a00505a0a10027fca0041e4690b301e20340fce014a246102e082217448e338892090bd3014ea621400c0108149c859530c093d300338480c129040f420c5541594c56708098219630840a8650e2e52cfd0df1340493217618e0062cec025d012d019687001eeefee3e70164d041d1b9c0ea5c2c7d8403e05042800274c09482b340206ea0c10d3db0c021f03c000ace03b8451d0276f882b0bc23208005a51eb478a24a5725d3908506294f7c683893a49e3449024ac22141135298a41021410b909aa264214106a2e49e144539714d4face07e9060ca1bf502918087d75d2712d8c055e23e097890e54910eeee2d532be509035ad70b2859a03cbd40398fae1c3dcbc412b94ddd9660eeee3723aa12e4b8bbd191d18f12e8d89e6c444ab042d19522a2121469d9245b8ddb6e1a6a6eab114dfd9a76e35c773552f7fb43ea4ddd444c5822a4af7969eb0f5012dbbeeea6d16636ae6a9bbdd08fbb7e8d6b538dd6d9a67d8d8d0d324a72bf661ba9b7af79b7fbc489fa4f9cd4d0d6760bbd52d73f7192645369459e38f99aafa101ed571ddab64d037aa076df9058a0a477b7eb7bdbefbe6b0b04445b677002b4672d2b0488b6ddfde282d6f67d559a4af4ae4a24e3ee3efc0cb262b6346367286da7b47dceb4982d416b421369546819a822c60ecf9209f6b87b809cb6915422261b88dba6816d858860ff40e8858408ede0ee2bf8291425a484a19d191258a270052de1439014221524212806154ca1248a298288047d144d413058984e2c4b0485491042162a5516153099926aa5542815f8708549054e4b2aa8c99d2a10962d31fcc032a5eea88f85c8dd1d8965816db70cb7f5c8119adab3d720341b8e8561d3b0772b84a412bdef767f5a75db6caa6dcf662d2b44db51d8f6e848fdb1d9b7d5a82909d1a6beaad0ef1bebae4c62301d301c9b1b12db0611b92a912771c263f64fe4aa441c972c1e84ee0ec561b8a3a3df3338b93b123378c0dd8fe8f1eab183e331db4dbea668c6da7a5c3c66bb49bbdf1b8e05b2875425ee1e5295cc800277bfc01e5295cc5085bb5b407dd5204d4bcea2228b196a3300c540c459546431836b061a33c0cc70ce70caf0c40ccba045862ccea2220b19b03cd100d82dc9f300bdb71dc5e76143bf5d1cd0dbfcf30001bdcdf3b8b05da4be37767df65d817c80de75d523cf0304f436b6a1dbeabefa2f001901bc884105670c1188410131b410830c186e004394007cc00004038e1107a8bb756937958856e4c813273534da4d75d7274e6a9ed6aa48372436c837a1f10216b4254d7268d2a3c90dede693a4c90ddc7d053f9b3c7dce2a01117c60d8d181261098a2892b4e4b2fbcb4175878818793176a583b78d4b076c0ec085fa8c1e2a97277ff61b38d1fa0563d7255a41e369b0a8487a7c7bbea33e1c163b69bc06c38a17623091569d9b6dd9ba61abd6bc309d50001fd267a5775ad71dddb6ad4ee77d39e7d5d23dcac5d676fb3a94549801e2808e7fed0f68fab02a94835393115d857c9d0eaaeaf0d770428f643b3b144ee6e89de9ff5b5e18c7e5c15e85fae4d10cefda4dbb3efcbd21ec726bd6ecbaeedd16def20f67da024296c7b04f4383609b661abeb69bb656f2cd1d06da56d570db2b9a9fb2654c45d714f345b89906e2a6ce8c6da54f5e877fb30a3a41b4bc36df7e869fba6b6442f8cb681fc6e3711d2bf80b8923ccf0b4888cda602d9aedac3c3e3baea5152d0bb9b86b3cd6eae87b5fbb5ad4243b7f5c5b1b74df4baab50111e20a0b77958d2914fbaa92fb4be6d558b666a90cdc6b63776b5b1444846b3d5887dd5a0579f76db4b1e89eb4816ac0f44b510a589bbbfe0670b58c9939226387e2a4121c9549226d6133a38e12c1128b15e18eeee4b5a2ea8c00524175468618ad4cf24309c496a20c17222614202a5852596f02cc9a15444cb911916b228a285bb3b0b4e5808526409eeee2c080000bcdd51d89f3d5ba3b4db85ed21d575b7d1d0cd16b4ba2e7bf4ee2ac49e466adcfd5d8d5616da1d2589912423358cc01839594e315edc8fcd91116de3360ecacf9111ede76747595f35cada6eda8fabda6cea0fd1ec558390d0c00cf72e06b0a11bdb22fdd06d257a616e10ce259addd4b6c7bd18ded180b6d723a1f5dfedd2b68bf35eae732f57d27b64b47fdc1596b48b7e866e6b6be875f727ceea411314f7166dcf54dbd16e9f4d6a99c08ef62e3222e2c4dd2be0eef8061126279120cea2220bf75d6f38b7655fd7757142ecdeadd0d06dadd9ee76dd1db4e4797c982441f2b01bfb49b7f461efbe3dd2bee1c0706039519e75d77f2131388530e1ee4fe79098bbc3fc1ca2dddd881e52d4233c3c4cbea668c6b2c063b69bf414a91b06b768c6b230e400436870f7227af0f030e1a1be6a90213770770a103184b3a8c8822584132c21a08428bd425610b223e4859ccea2220b9f2d522ba6c2c5a7cadd87ca59546481800eb8bb4b058119ed7dc47e4f90676fcfba5f735b3fc9dbbc6a5ccfaead7adb33f7b7abcefe755b16e96b74603764ff7f53917e1ba96e51cb223dd08eb2dad49fa3bd8b7e808068379c4d7d5d5c90760f0dadedab120de1d8dbfea1db1a8535da2e00fd20eddbcf8de5e141da486e4978789800053dfbc292de55cab61d19bdb820a09f9b3afbd92dcebd6da0b7f97f1e171e8693c2de926c36f5f6bfdbdf7bc9c3dcd9b7fb886d8f6a6cea6c7dd776f62f7b736f41dee6612d0bb404e848dd6d8dfaaefa2900ed2d042829a8c8c3da1d65ddb3dd3eeda6c2da4df4b2db88fd41dab7bd5ba11fa47d03628990806a6231588e1b36db6a4427074c96f33c43b7f56d6c1ee6ba422c6dabef02799b87b9ef6dd36efbc8e661402fcbb6404c58243c3c3f40ae77775bb3895e776dd947dab7220f7b0115b1a92fcb04c8f538d75ddfa6beacabeed67dd787ad40407bb74280beddaf4d75572226ea0bb1bf973c2cc808e7baeabfbbb66f536fecfaae349aba0aadb37de4fe0ea2ddd4a33d93b2bfe65df5936cef4c95e2f33d6e7800e05fec6fd7f5afbb69307c8ca66e173ed613e46ddedd40091e072c96e37960f8edaa3d6ff330dade41dbc5a9b31dd4ee23751301791b188d257ab711006c462f114c09ec9de1dad77d1e184dddaf7b5bdf9b8af43836e9041d3a1eb689de97bdbdfa04a8dd4240336c2375c9db9c3b70e0ee307eee88e2dc31c48ed98d9f3b70eca8c133c523073c12c0c3071e3b3f38f990d14309670f1bf498a287087afcd0c3a8c78fb387aff08115a4ac80b30279fa08e283070f05707787c1172406880ddcbd053f810801e4e80492e3ee2ef8d943e5ee31f8d9b374f62c7177237ef684e9126904ce74480ae3fc21c5ca729e3f6e387fbc70fe387d489d3e74f0a1a48aebfc81160f603149018f94271be021c2e34f8cd071a4c38533e3eebea364e74b80c213277bb742bb9dc1c9c35c97b5fd8b636db847626d3b886d370d3637f6b65d9608e96f296dd3f69ecd70eeff1327357bb7424941ff6e37fd274e5a5688b65d15c948ddadd01327352c11d20c4e1ef6dabb157af67dd7e3963c71e2e25ef5757f6a6ad8f76b8cd8566806270fdb4749fb55672bed66536fab9087d16eec6cbbec2bc4be11db0afdbb2a92bbabe0678e1d678e0ec7951c5b5ddb573dda2e9c398adcdbdb0b1ba0ed28ed76b70b670e25b88ecfbb97e848613dfd606920e7d4a93a759c5e9765e17571414e590da76d249676f369c2210507cd891222387ee0d8c18183c385e3c4d125e1061656dcc072a30977f71b4cb09e60dcdd6f2ca1feb7ecbb48a2ac8e5f80cd56a1b5dd517ec9d4dabe512c91526db8994d9d19ed77fdd7dd436b90a858150dfb387350bc13638211b9aa12a4f304595c1e1ef7c76d6146ae8a5480f366876d697f63ffb68bd4976868257a9b8aa4b6b4db8eb2dba36fdf76dbeeb3eff7fcc6d1d8f76db6b528493dba69b790bb12bdaefb513eb5d9ed5152abaeb35568df76cf9f3656b8ba83d86ce1db86a36da2d992a1db0acb71f71d65b5a5477b1b39614ddc83d8d4f5bded1316c4adc80953c2ddddb57ddded42d2bbd2561c949505774fc14fd815ee3d434da6b0918ab279723a6d86f0c146ca918d1326363c6c70d8d4386b88b8bb6b5bd577d37ef61662f95953e33530ee3558b8bb9bb48b7eb68d26bcdd452d8bf473c46983c9dd1f29a70d27eeb755c84610775ff969a3467d559afa6e231b33ebbbde561b9dbbe3665bcacec2a3b83be8a70a5678cb12bd38550529b52753b93b133f9d58c192010e159a54d080dffcec57b571df6db3a947372ece8633c2cd6e5c9bfdb246bbf5212cdbfebbeebebd2b0cee4e8404dc3d021070f707b8bb03dcbd01eece00775f80bb2bc0dd9b10e0ee0770f721dcdd00ee2e0493bb03e1ee0570f71fdcdd0777efc1dd79707702b8fb92bbefe0ee3a28b93b0eee7e83bbdbd0b9dff041e4aa3b347513fd7bdb9ec3c68abb577172772a3594b320a7ab73f796a66edaabee2a24847371b4ddfe6dbdbdf03ceb10cbc299c2d29902093002dcdd89b36618b711bbe4dd7775d9a34dfb195a6bbbfd1d38dfe35faedbb6c1866e2bedb68f7e076d13b9b8a37f5d5c00dc9d06774f727729ee8ee4ee51dc1de7eeaf27eda28db3b13cfb556d47aad1cdcd916ac4c3d3b2afca83421228c0e0c6ae6ebb9b4861e2aeeebeed2149ef6a53df963d5234db44403c3be1ee333f4f50e2eeee074202f4b4df30b82d2cb7ac1f4c71f798bbfb6059c18212773761c85949fc705b58d06a5bdb974a8d2beece43e3f9e1b1e154a11d640fa92dfbba4d0cddd676bfb7fd84bb0128c715c014389738b97b4bdb507ec7d17edda2196bdbee1ebaa944b3bfed96665b89664fbba97fc432b91549a2a9bbb5a53806d8bbddddaa49bb88b6936c377676c309b92b119387d1f6bbef8d9dbdfbae5f43db5158235114c5f1a6fe6e59a1ddf349bbe893de76a5fd267a692d3bdbedbbeb6f9c4d6d42db49aaaddd5192fc4d7df6fdfdae2dd2a7fb28098b4407d60460b83b941f1c580c966333db347666b36deaccb5497ad7563dbab991b333db3a82683a74e4e8cc663b6663c4ce604138a2774d6a5f771dda6d0d39826835c0dd861c00dc7d8ad7f051aebeee6d259aa94636fb555f1788d1366297ec1b8be4ddae9b0231c219adb7f508126bdb3d2c12b6dd3224f5bce0ee47a9bbb3b75dc43251c22271c1dd6feecec2912434b5878597bddd8cda4df42601725b87d6967d9ada33745b6fab6ab4db6fb711cebdb140dc9645b26d381a6bf4b41bee6f698b9bcdd85bba4659836c5b906a5bd528ea0df7bb55f74a7371463be8a5dd68fb55773bfb1d94e2de5ddd8d83f2b7f5dfedbaea6f2226b74d03db0afd6ed5d75da56c213615076513b92a1177b7b9d7567727daecfbb4ddae3828b7f58f70452c6bdb446fcbbe2a6ddf8656f786bb01b921b1b7a2db0b2f24d6b66737d5a606fd7bc3b1b399fab021d876bdbbb7d06f23d6fd24f5e8d9f793ded5b606a9b722bbc5bd38a1df416fb3ad48b4fdaab4dde25ef536b4ba4f53839ee86dd7a07f6f7b9dddd4bfa9efaa444846ecebe266b0bfa97f5b9fb66bd41da4dade5591de6653679fc2dcbda3a84449aad1bb3b925af6556937d5e8ddf599b82d4c6df7cd6c6df76d0fd5b8fb13772ff253c6c9d06d7d5b36287d186dbf2e4e2592b23fa9658db6910b8e459b241b6dd3d8d96d6f9c4d8de2b6b0a4a01fd7558f66aa50bbdfdb6a0382981d77dfef4dbdad466b3b7357da1b05aa14a8746df1d7891a650ad188080400008000e3130020301c120bc6a3019150cc32c5d60314800a7db65476541e0993308a21639831c81001010000000000800100003dee659c88ea50935af234c823a9da1e864e72ecc15840da257233fd7cb228a9659c5f2543fe486395c0e3e429a21c4d015b9cada0aee6a2db80bc6b16d91cfde9e6eb7bf8a323d20a956db1b25d586f8817a2b569362c518dd49b00bf809913c9629cda23d484c10d3e7e0731da5ee798299816b64663373b8b23e418ba8723f456344f466e8733eb1a6505845c92516be2e61c71562ff65bbd31be594edffc46f3dccd15e94d581af325fb0680bb124c16b9c1e6d3ddca3498f7b86bedfa652ffb2a66a66180fbaa18773a1b7e3f2c450b5aa01dca7d3b175798620e336a28b4064761b64710a7a5bdfc2cc03348d501363df7677fa6f528cd9833a88117f07b1f99568232daae2eb1ac5be00f6b038f8b30d179ed8d61899b985a4f58bba5d21832ba47127f1e84c6c90ee10e45ce044c3aae690a7030b82b06a3c21c12505f76e0fdfe57ed18dbd64d4c6520725ff23933843f5e1cbb3765f79aadfc3057b1c1e3df86c7f974c030479f1caa4159de432bdd2ee776654b923b9397caa1c3f6986f32554c7ca39df1c1ffb7dd97cc9ebd42b559940f0a3253f0cc36acc162e0b7a76d1b008fd1513919f9bd2b9ab7f0265356b6752b56aeb86a697eaaa906297ccc8a8dd76ac76da5be0213ec725c7982c279fdb3c78689899275767d03909dbcd6b01d82d195b170c7aed42998f4c80add58bb3818cb9a713176267292872bccdd77e5f5ded3de368041f8db20c6416e115e436ae296adcd772dded827bc963bc93c87c693dff4b9d1410d4f1819b05f1e8be5f8132918553f48d7376dd97558cdd71baa04d3cda955dc7fd1116cc809e7bf9e037883c98e85d916fd3b0b0686f1ba3a73a342233f86b960c25e052baff81bc8df81613cd31b15def6effeba229b22fa7341ba4e6df23398e24fe998e6dfced01e5933f88b3df6c6fe74981d084ae29b6ea7c514dbfd59a45f41f805320f8ceff3f3bc41d1886b66b29002fb4afa8921119dbb2b5d82e547f0bca6a759e850fd0e636786fe3dc32505ec13425ecc58ecb636cd82b1c3f902ffe77bfc97ca5980bd3beddaffdb1f87ff5efd7c1e1fdf67777e8654ddd2ffe3609dbbc40763321dfac12c1fd8492aea3af5c73a3faaa0e5ab9c9b81971e781e059a1cfbcf532e8d716f9b1f8d331497fc86e81cad2f4ef157dfd436d8c592b0e8e8878c622adb83f8cf6c1ac6089fb2983dfcd2f064b071b47e59b8ced84113dea17036822b852701b2ee7a3121b0039cd8a0c5e3bd04fafaf7cb27fe85848f05b5eb7282a17ea68dc36f60fe13d02254f388bdb9d616b971f87609ff3f5a42f16476afa79129a5078046a0147e5abe8fb3975f123cb3d06e3f4d30cbaaf399a16c9f7549986b04b2af502b0672a0e556545743df84eb23a3a201203cc82c6cb41e8f89a2d57279c740fe7c41270d71233be80c2d0dd964c31eb5782aab4f6c412f6fd0dae16080b37a312dcb342d3c20bc9f323c63b3f21a611a781ed248ac1ca2c425a2e42e9abe961405095d26d293fc922fd7f791794678f09adf8c99327ce45bd246dea58db11e70154186011aa731af1ddac94ae8d792dfc254a50d90229f844790143a5cbd89023e56b6ef6724444b0d9a9b1f8893de2df431d256b80a36885973ba2f085273d000b004635e6c249e41f7ace9a6b5a84c4fa1ea3829b7b3d3e229e542df8e497f72cc364e2936eb0a1204b9d2dc943e2bae0a146d5760ce5934262c070730da99236d2f254e12d1f5565040e11a81fc302ccc05f667e375328a3e523709c5bbf62eddd11f233d71032e7f55296ba12f75dac75afa9fd3fe56d39daa76ba3b6837cfcade97ff09c5293d06dfe8773b3bf3f2b722152c673b30a6dab6f7cb5f9c1f144feceac9e4a6b6f87689d7db0186fc60bacca0e8103c9cd7b0b35546e922d96f21ebac0cf301827ec1ce727d8d88cb57149736b52e45ffe72c7782e55e2f9cd73560cbb98420f7f189e999e7b70516a45f07402f64d10ae4bd3f33a26fb25de8324a8486749f00637970240bcac1e7fdb013ff023bc8a0d96e547c32f37184d78ffa65f18670c45b3bb1961ff0c162fb173ec3e7c515dd1b49692891d629b1cb6b80cf04f7af550c8c6b9cbd062f39b644c54694e776c4f498c52617f67dc032c1255d2d5db085493c835112b4063af28aa38ed6c33992b09bbf5db5ecce8c55e309d34140ec63be717b7cef76ea7d02873303f8fdc2aecfe54da9f8c81269e9c38289fe9c5f9fa78fcd3b2dd60ff4d519059f8be609d5424f4d693d04148e6783d12d04a541f88948f1e6a5a36e8e9d521a69aca400fd24c0b447faa8f8e64b991f0ce3cca56c2e9ea2149c391ee0e94dfe8584866e234f144c0bc0b877a43f4e97f0079111efc429fa32aacec80bd5f762a3a1f8b2542e02e359085ebcdf388a573a6aed81e0d6d38a8f52e482f48886f4f09c711a6bfa4b2af3113d1c05206fff676ab1374818b7b322e02684b1078ed727be6b034bd721354485012aebf4d42218aed64c9c6c7b25a4298422fcbc511033313ce892664d00fd681a1b2ab173a61932ad7ad73756f31b66bb026bab7cf951e21b5fef88c7ffe408eee378c0837a4fada67934cd77d3f0b0597cfbfed4e1486559eec319e04160092c9cedbb5de8c663a046a31377f9b91701cff27f38307fb0af10303c5ac18941e6ddbe92e3c422af19459e5bb554c4ea22403b125020e48245b592a0f34af982f0bfaa85dac8d1a5b26282fc39a7238e2b5fb923eacd0522437dd6cbcbecb896fca9bdddf2f5825952d2819efd9faa2bbb9ac17da3410844ee9676c00e2ea456ce382c2c52ca45ef39e7c184bf7e78e3b641e259237233ca656cff146ed47be6cbb332dbc1041f406958bfef19e2c03334f88d01765ceebe464cf499100ec32aa49fb746d1ef47a56f615293cca2e83ee0b40813e90ed314615813e04d5b413453e3bb4d6f0e96db7321007382a783848bd35dc03641a6a98a37ed339f66b3ea91e3124fc4eebe33275b1f49daeaa4c82b277ee3a05f8cb02c85ebae119635724449dc623cb942bc7b52290ff9e8a5802d0af953eac1e588f1872b4cd48b1b7f214ae327961f55d99194855d809b86d54aff887b310d16f319dff13ef9422c93a83b4df5b684c202d62465630415c4b1282b91c996a9c58f66a82ef141ba5be676c8fa6d2940bca0a9f5b64c88f4a86e8821010dff849b28005a7d98f22da722e850ed1676d938d511c7e3597c57b3451178979690a4360c6180385334802d5c3a8a7d515c9557b3cfb4ce03b5416a9d645708563dcd3019195afa3cbc10d1b1cd0a8af5fc5e782d8cf29ed41245784017b83de0cec943ae13cf2ffa4e58f2d91bc5525da8865f2357614e693e200e3e74ce65fb3d7adb7349a1e335f9b74a972e3f8e95e4752a0be813fa85b8a831b9e3ba1c713a5239c437be67d81ab50cecf2c265ab1904e98e0a8b0db0fcc96c5fd14c63445d723d7f5a86f81295bc8ba4af72f77b4b73bf82ed67e2c0e8613563f62673f02f47c2f53fca2d70aed07c3aa58f6c373a575aaeef6e4a7e4ae9cff0f7617a7d957273db092199f20dde3efa0d3e4e77a7c7f85a025b1c301f706b1b329cb277ed85767ce3fd2ee00634e6cb991226a8981d93ac2bc6fee57abf4469d1ea1b145368d374d9bf98f955e0d69013f7abdf2c893cc41f4a0ae552eaf462c845e1117fb6dc52f399f854d256016e1d0d30fd80349557787f865cd98f2145c6eddd44aa0ca4a05bc7be4ff304538f6368a89e0c37c7cc00dbf3b29040c026a214767d703a85f38ee0723af83a383aea174aebc0f465f60738ddf8db9f6f929fd39cd19c92dc39b7417a744f17f6eb204280bbd3d6dbd4a77e6972b8fd083f7433dfdd88c517f7804757836b6bdbaf6f79071c6957688a11133e77330009c005244a55ce01cebc762c5000879e0a0174c3f0cb7912e52012c3a47db9cd60d46f429e0ef2f8f06f1418b8dfaa1c300657b4739b191137884a747f1c2de28929442c0bd00ea01019d48c0c4206721bf4ec62dfe8984be7ae083b98fac770ff5d196ac6d0981f971acae20aaf701f099e3ea1eaf4a447a7c4270d10ebb5b5bb025e66fa18a03347ba815ee2d08903fdee986cf26717be0af556057050d75b50597d9dcdf83cdf9872f408f5b0f3f7c36fd5c0541ad3700f3b663711ff0b605b56fd4e36638d9737c47367de37160dbb4c0db5495612c1000c5cb30f551455f0798e0a80b521e13b6c5b268391aa0173e4af67300ba9fe7259c287e0071abb670f6a3e39405b527a05fe3152703bc56f867483fc53aac26d61342ce25d0d54d5e37e20665501b15e1c2a9a6234a091afc2a2d90137ff47f004ccb236a19fd2aafa098dc8fb428390eb72de1cf809ba5952b102da8fdf799dab3ec1e2e556bc0ddd2570e34e4cc0c8a233a4dd043c028b2b77aedd5088bdbde643ed0a7a9fecc105f3ce5843795904d90904edab9e2d2161e82913b9989d94787d060ac68fd9c7cb456013b8bbe3c6536ec1c066edfed0260824db24b7f95174facd2c091b236bd4a4b4e24be872e2d31816ae0863e1234008001b2d55e6cb9a0ee4119ca72a00b28d13afddf06b3095c64cf04697cd6f4da7b15f9a976a5b427996e3cfdec05986faf6778d8b07e282dcf7a047095b4687c63512c80f5adac09c7df83a21f5bd1a96b0d9ccca2ea41bb1b385c4c03c36814127458cb883c6e12d1ca3e7d89da2a6b20b1d1a875fb1c14d0cd7cc0428f8df2fe2da740edaff0dd709e6227ec6f56c45019c0952fe1ff667d877a814f190a58718a81024c90255a7bfc523901646a5088844fc7602249239f3338792c0efd78e1958c580990523f33d73e46f7e6d81c586bb8c1e2b3c2d3b7d1f38c534948125e7262ae3d43ed2ff874373badccb0884c358c356233d02e64381bd310525aed24819fa110466cf98528bdcc6cc95a89a68112e9cab4e6c3e1b7ea2863d5cbf54033e487a19ef50e4db759961487d70af26056e2dd5da35a6c38f6126d8152cd3ac972a1ae5e187a6bdde4ffbd12bf001edb6b9c60f35d7abd6d9ef766b2126abe22a20ecaaba91c83963cef5d84ada73019e157636ae6719ae4d8cdba9bfc27cd4d3475e189a5efdb55140afd6cde6d05d27d1ad8f69f77f00e1ecb0e468b393595f9fa65d0c32ff180f3fa9b29a22d30584c5c2ec53bf39879ae18abf17f0fce605dc7dc211e0e3537b5bf125617d84cbd46fb83870e66bd14eb612571e77d656b4c419e8f83111ffa5344d6e34201e67d5c7f036b9a3e9c80117108e09a5a0415b24ce2d0e68d64dfb172de7228eadcea6871ac36b2368a14d70e80a2b7fb21fcb0f6eab66ddbfea52510bd4266e14f9bd113532259737d0b3763a12a07d7ce077343870d487c347e2ee725ae006f848bbdc97802d1b6bd3e37a5f598b86bfb23098ece99b5c7457a452c8dea85847bfcafb24609d7a04c4623078205d02b5a01ec5e77b26800b2a6c4d866e20ed9ef3b056b566828e9f1096cfd0f345bbb44692a387ab5397b12e9f021a68c6ff08ce02605b93d3c704f9e0bd2e5d43e995918ce42e334c89354cccf6c8b16aa5db64cd7148ed3b80d37dadde538af990111e88330dd502336894f627f18517e6dbcbdc24e9310dce05cff60f97cdade1af7c8b573b5b876fb6c099c03d54a650a71389ac1af355e790187e26fc05e9dd727004d5c4713e9f572ca535cbce12fd2ac733662151a8a1488967df4880e88a8013a6037d9d0ecc5eb7b44b5eb7851d5fd5dcd549efd5d4c38e00093f6d4a5c56d2a6728d5bc3edda377b9fd9997f06dfc93038de7b3412eef2823876b0112b3c0d3871efb8d80b7b58d06f2998807c10568be09c09f49397641a287f1635cda61fab9f7fb937dfb20d4f96431d7609dccb6d9b34a87b4d3c80015f12f0e99fbe729532d9bb8a29f2fff3be092d7a18e8a8f9e28b7c88a60225e983bcf452afcf8f2d442285aecf8c231c802cb2158ee1321e1c3470ccb9ab20d3dbe154e43fd023668e0f9b9928748899fee3e202c7ddf85cef83ac81dbad8659177d3c109f145b7e603f7f734ce949560ad1561745d7d0a7cd350df7d7add93a74a9777e69848e430358bccc6c9e20f9032b838e62f75dd4dc5fa741079d6efd602fdf834e23612b5e4c2341d2a3ddfb62e4ba132aa5e19dde5b3ec0b22b71639f1addce982e2b253759cae3b9b1099d4e8c2ca323f03d670ddf7645a1d374eb98c2fb079d36f865fd1ecaa43be4e18d5a9a65e38b130e55858e8696d73af3224f0acfdffeacdd01b0abba7b03d6fad1087efaa7bc6ebbd933e7c627549ea6d76e55fc2f37c941949c954861bef2acba378b9a0b86f83732bb3402a7ff3cf87ae50063f877c1f5f1f1ff2f2726d4233ed7bf66bbd191de5f6f20e75c5d0e9c66c0958bfdb1f9c865674b6d1c708dc50a4b5759fed9e50740aa862d1344853fd11b24e419dc2df04e3efb1a9a492e7bed18843cf7186674e009b92f9c6e8a9caa6844b5839a196389a6e20ee5b4a44dc6cd9df6f91bab2ee971484392e716a7080b7c467455215b9e50dfb127f2555b90f59191669e12ffd0134d56460628c10f93949742d5b15f138b49ef24b94f037e5bc5c6c191eb38a29adba797d1fb5552619be5f8c3e80e84b330c09b5701b8fa491895c1882877fe8b911f94ed237167eb18b941ad7fa40f99af89ef561fd08f3dccde062171aca7dd20e7dac5d257bb1d4ce91f00e80217074c44cfe9bdb5ba6112b39efd81a7d0f3ff9deced98f727f65bb07d1ebcd94fd37b2fafc6334428bf259dfbe588a31060191f8200ec8738943e54296ffa2f50ff0362bce10eb998c7a2ca3727ee8a752de0876c3e177cce0b5ec3a57704b78bb3311f06a2a39e36ef41c299c4120df1e0c6c5c6cf5b58d678013b583fa5ad9e89384b61f629a34067338daef057366c84bed6df28355f46698109ff9459ebb073b909227278018f0db33ce74a2b34bc5f8a570dedb27a0f9fc32b39f44a5eb3f5f35f4ad8bbf46b61fc0a2c20c5065fc6b036a79a4c77f17c19bdab6c7a779d899ba00530c95b2dd2b21e461b7756d4d7887c6c3a58b4adf2e1a2a7eecbbfbbc8a83ba87d3681dd93ecf7a5e09f3830106a08020d614ca21cecd920b3bb223cd24332e60033530839e5bad2ac433ae6b8076590a38af943698d396d8a5d196170ad55ec8c096ec54bb2aab37830441655674a44d004a3d7d80693000880d40361adf359150a4a972f1c784977f109b973d29e224d2dddf429945e2e0048c2ed5ca4314b53427a2e828d9edf4bc2f1476a31b5e137486228f9440ffd7ef2cae308e9a1cd9456e134c03735cf795a81a532410fcdb8579639fe02ba9f58712eec0f9cd835b7ed4500a55766ec26af5243227dfba01a8c05d7e19c453ed8b0b4551487f15efe583bdcbc66b6ac7968ae519136e571b7b7e568bb21b33f8d8cdcad063be073d7a51cce460bf7277b6bd163cea71db7f98e58a67b589986bfd7288a24452d7e80a8a19915e572632f7b438547fc0757725e3942a9794456d401b7a92bf88bedc4ff32f732fb94bf3a9cdc78e4ffd6066cbc05fc325e0ddcae5ccab556f7720ffa8e3df6da5345a0dd14f3c3d01ddc2123e1a0b3e771f1f1b8b6e8d5291a67cc7e8bed7951820989197ca777a2b7b0daa06bc6fa42e2009642da0fc5aa1463dafda6e62084164b12f67a03afffa612b999335c2d48621fb5d14f7cdaf8b352cb3467e3fb0cdb17fc52586fc7ac1de332d322ee60887d671b7d40a4d70e583eff3be14593a60767cf0409bd08048a624a274e64540a49a585a1ef969171abfde5e0b876ff34a0bb23d8ed9f0756f0f9fd6380f1ff38422fd57b8379e0c1d5d724e54703b2ad3d474b3b8f351858dab27759bf4074ad1dca21d4865f4503915f2b07a307cbb8f3619d7183b46c6d6d409fa1292737f022ccf737bf80def42eabd48918b9436c40a4ce9f33901c25cb2417ee75ee1042b7de7f6afaadb174d9e548dce53b1e4482645e1fcc2bf0478776f4452fe270fe330184a3dc3824d9c17314c103ba3ac49d528f959d6c3704e51d77b9b71a0dca88efdbafe8d8496f5410ed179ad60f38fd5f80f087450deb331405ea3b89bde2227fbf7455992e766cef84438d2b00efead5d539242712eb392ef0e0705091e62fe2b02bfd79d21ecfd5084d60cd81be131ef6c71582b66c85d22dc7444307fd37346d719dfc7d5a731d4cabfc25a95d67a471d6cfaf2a470171bcb7b5d5e812cd0cff52af70d307165cb2f48e4d9d9743b9dc02adb2234efe6f545b226cfb3a7476aed8890aa7c6ffc48dd902b90faebfa4931b483ce7dd96edf5e6e572b4fee733c44f7aa0f7a21a5c9d56fab57cd83a2610b602157ffe346f94aefc6c423aa7d1177329522ec4adbf5aba63830c1784fe17a82395bc486dee591a5c3218b175e02f13dc67016f79d7713ff93d5bff2f28c461c15b3df49b1432bed704a402327f011406950c0e6d2574af311b907f1bcc422f9d0b57fa9dbe4f38decccbce8af0d977db7f494970f6694c64762909214df537b2f4c15aaadc9c95252514555030415308ccc5a4e3e85370523120088baca44f40ef9a5aeb96b1a4f8f95d2922f37cd6b7354aa7338d5bfcf974daa9929d4b590cca9e8e4cc7d6306529ed6f6650eef868464274266d68610c7f7c19c1e2c32a6d29e0d64fd470a811103a13c3bd25bdc2d3524cccc3d9a7117a23e2e8f6b3b1037ad92038809e1ed76a5aeff303b564f6b082d0ccddca1038b8e2e54656557a5d69dc3dbac121af57c8ab86986672954404e1e7a9dfe868d0cde77802811aee1b875f8664bb175cfd6616dab45af9a5365f534ac2ba352c592d3781333cc4338d19945978ed997b4481b4fe0db6fdbf35d17e0271dfe02d49fda7031c356648f73a6e9049cb1e00f3e74e8444df7ae1670271f9f0b7ba3452a002f461f1186f12eb68a883c94ee4ca1e32c6c12a833eae0321eb44ed38859a156779df0d335f6376c789bec65c7ef860a54be6d5d1517c6b14db619fcf964aabfa2a4d5426128a1562298345f239e866f08ea402bc3f42911d17aa94a334acb12718e3b8e982e4bd9e7d1251932fd993751d5072fb3ca51fb81b426140a3de63f8ec6ea79038eeef44107bd96b7a2af2277a1577ce492d62b3b85fa38ec86cf2e1f2c80a368ce111c49b2dc510b65b89a82650715a88249ea921bf562e105aeec9d5e9dc752d74ee65f1811e53f54844a30c4a68f1398262f9954481dad5cc8490ffde38225fe21ff73955a8da61b86add6d135048ce9247199579301a9dbbd302996957c2f68d39a9172ad648ba43019bfc406248d50f51b529345015742fc45ca04ca557333a3d66c33ccc30fac0e025528f43d98f7fb37d744521e63f2f3cba1383882d0a39b62faadd62ab1884718f666df22bb65165d14882a42f40d42c1488e1be461e9e7e1866eed006a6be42748ae25147f1484e11c7e4a2a06a57d8b272241f1a525f50c8a1e47664fa7d1216921aa797a36418f4ab32e28519d51a9b05ff72e719e5a0e53426d784550dca2061238dc6365ab61ae40de57e8985d6e6bf62cbe3818087aa13f74640f73848f03e75c73851db1b7f0f6beda5b0567ad9c8bb55bdf76d3890c3c36fc4279d8cffe09711b43a3dd09390341e5ababa233711455ad194ca375c238b0c916d62378247768a7fc6c8e1f4f5978b630541793aae134c6daa511f5de419042dd0f5dd3a25583ebafe511eb2d1e5bc3d4a9d1b1fe550b82bafa0e01d9166f743dce8d5400c0003f8267bc02a28a56d23299d5fd32984247768864eec2866cd6d3b87a50b6cdcdc61fbd2e1e6bdb8fd148dbfa3ecd1c7364938f27b7195b5e04d6643bc41138a5fae7edbaac986fc43c8190c728e4a1bbc0fed7d1e428783be1920c182bb170c7051ec5790ba12950d76d7210b35fbd86f443625e387adc151464818c624f4bcc720eb097f947aaf661713615d04fd23c171543c25fb234069405e7417ddaa416ca11c153df0abdbeb0d0e72cd0747b29377fe4af63e474b0c20f696c936713a0a06eb0f9f038ea2831f700a7029be943a2270db52b699fbfa45f2d2e41e6ba2d59502f62be77117960a66c4c5eb78bb4f78afda5cf1e6b33c8cf91036b90d90b6ce87f1b64605cc0f130e9123a0dbbbdb40b130e10ac573da971e62f8a1625b90e2c4d78f95ba39aa5e4e1df7c4cd97c2c19d36f2a7ac67351277424a3ba81446e0f4315dd7b32392982da8779537e881fa6849ddcbce28de7e1af2c1d27e64bad0b425231ba72d793613a1e035e789148665497e2d5b88de59c4eecc25378d93dcd9c4630c34d1592b646d1ef90b5d664327b2bd3e0f0ca02ca6028856a6499337e4601d8750329404327f90ac117443d96ae790b412665394d5997882c644a7b39508397f5a8729a1fb3ed95ef8d35869ab4524119fffb9b0e104cff0a1476d8fa7935120de9371567b620b0bab42ff09ee129ed8984467f1f4ede7035548abb3c73408151ceb7e01b02fd7b2abf30e9dad9410df3f61682b861d6dbef143f8e23d4a19341f6e313ee3e12fbdc27670d6d2b340a54bafe29850c64f0281178e0c43d6d2c2f43d804caae436e2a81b802ecaafc97895d507fe5f927ee029d86617ff324a8b7fa30eace50caf3584dcc8548a96b0b1e7443a7cc11c50acfdb3c3983d38bc6b9b205f869cf7697422cf61659e4a99f8fb7bd8a58e17a7769091fa3223181464f102fa42996b305873a835dd177a5998910a8f8eb4eb66919fa5c776a20f770d51c6fa8563451ce8b5a0ecbe31b35c2135a1861dcd13361157938080646cb3f39abafb1fc24258b0cd2258c308b5ad18a1c49349fc0b84d3de8dda969ab55aed705d04bf4fbe392972edc2b003cb72e8a7cf1d760f8f6c4f91ed399fadd87e1741febccde2a6e52c34371e84c706a6483282c8f069e6d95bdda9b66212b2152c872b09158dbebd0985646220e69346f308c9c5e1f210b97bfabec3c4c7a8b921442b091a41fa2e4be4e81c2b05d6e073db38b03559634e891621b65d2c5b88121d3e819944038ec759023f869730e5001360311c8158082e0116c34b98728009108e82002e092cc24b31658049208c82105c022c869730e5085c119162a55826d6f8e395d3e40de374621a7258c94d6f6637fec13ff807ffe03366e30095bcd377fe1fdb847c4b28b2dd177ab7d84da89938813e70e7e3e8c69ce798b5e77df2063d87d905ce39c7987bcf79f20fa80e22c45a319958c30f2ba176fee3f739612fad510ca2c61423e15ea8bbab0038849bda509e74a30f561cebc77ee9d15f72f42f7f777770f7e66e4e1e32f96315494daefff985ee8937fa6065f76c92e3dc73ecbaf73efd071fc3dc05c69cd398b5e77af20654fda8b0560c26d7e8c395d27efead26ec2f4018693b5f1ab271aeb933db6eb3850ee32a164a8cfea546f76e5afb63d6f4304c949f497ea824e1f3d935e527e118a8220668e45c39364ad3179d6538455a3fd6936ef071a5f7c46fbecb074b49ab72a81a55cac1bf530b5731f8c92c9936f4a0121b79640574b31ff6c37ed80ffb570cb2a644ca5067d34c1795840a38508958ec05360f1008818a094955409cc82996936ce051a5b63db5ada1ed053840b766292519e2cc2d8be9160ba8318e62a1d4e85e7a74cf265f3f31028917c2038e6f7df27aa20bf813983e0140e7f3fbfedfe8e9624a049a3c55bad5321e9cbaa13c71a30f571c7b4c202d676f54b486dd8ffad17c94df28590f56653847408cf65bc29fd3ea5b3462936ef6c72556b178ce1697ebb1a31e7b26a03efb7195d5b86e80c483298f507a742e253a29441eeb06a40f5fb8b6dd479ecc7e8a43a600ad9f9365e4f939c42ace938f2304baa19392bdcd51bf92cb4bdc40694bb40efa3195385e091939447a34232b12f8d608616f5640486af48f04b2ae0f723dc85b1012589929147d386a02fd065a8a88bd4247e0c4e2e2cfb08fdcd3ff87057852ecee22136dd8229119885c58174377a339c43d0a6d47e6ae0c293f1c96ca61b7430daff4113a8ef95e490809935db29f948d1256c97ea189d20a8c654b3bc6d84bfecae4a7e305f2e5e197948de7d8dcbbf00134e8347195436cd87dcba40021214a84339689d189392354d05d928465a422e3a4f4016ce3c1d6a7c4398214737c436a85668511c34c2cb9fc68d9a5f5b43261344b49568fa946741af81f9d1d8e65b892ed69f4566168606763a40d626a5283c1538d708bcf488cb4d282e7ac64c3568cb47d3204e1552362eb5756227b5e57f7afc7acb35cf987bc5ae567a8a634676cf2734a9345e35559fd77fe47547609d492697e73b9247550faa13c68915b7f9a9d677e6ea01ab27f63fd9e56ef5fcc0e6fa0217524d7dc63502e270092ecc701d397d1a8ddd8ffa923423617ade81d16132ccc5a84063d331def58537e5543df3f8297218578c6a1c2ffd1c150620bf7b1b6bc842a3c43083d5540f4ec657727c4b8e1dd52dfd9df258138a9cae8f8abbb46ac438f0e407bc484539059e5ffde07cca26b604ba0955c9fd5c7a8e9e2fe200a2ddbdb95d117e2873cc86bf901c0f69127b3d5672815b115a67f90244f1dea630c98dcc8a9a84c6122c1bd89711f5016053d6781dce084265f8bfe0c66d1e3cb49d88cb53a333efd97454b3b2906d7e13af82d04aa1d64853748b15cc16f8c3700d18c433f2c06effbfaf1e658ad1b80745cf6e3b29156b6523c14f594379b6713a24c08ba0148d32762b0ced3cde3d983cb77b754795aa6dc87e69da69ba9da00a407063445483497ddd99a3d6c1d99159a40eaaf30f5748af43176e8632943fd5f47226d836403bb7b308fdb9ec40f506ed321b49254ee9400383ac98aeedfbea89475c6243856de277981a24bfe10403a65bb2fa7dd679743e23de44189133143c8028836d1f5079d5822a6c838b7c69f49a5ddead98abe7efebb4494b0287abf1b22d9d1b033e14e49d6bff61e47c123bf0f24e90d2dc30459acdc532de191062cb56cc98292028733103d60c170fc2c8fe7c91085e8040515e0f8b11c38f70adc55255230dacc5e80dbddf876bd1540e5434883652fe2eb550f898de6b8af1a2edae8e6dae87adee8ca6151db6e72a38da92b3fdea78ec22a9e601205adf6487db53a2707bb7972c9bceacfe48c4271650c2f59089d33a3e157e133ba160423fe6be49b9080c1ac5d784930bcdbde115d9624b0d67f0680184967ea0ae3087aad5f318ba6bb85be89aaf2185517f696450f16e3ca310b6843a21714df01abc1e329acf2cfc4bf53bbf324acc8a4941f6db43b5a7d3446a495af8fbe7ee6bd797818fe14984294f7f1565cbabfe2de2605639f884c8e0509df674115de1922690742054f3a23e908c5b4ae8224b50649b2b28592f4e4d864a5e698a499eebb2a34709262d435db68b487bbcaf39c0f33f36c50891ff8514552950ff6707a60be14498124d8789893215da9007011f02315d6469384a9b8d1fe61280780a2207129a61722e364d3085f0dc9314048fe888e291ab1985a5b6c7a30cec7955439525c806dc91ccee548499658ca1dcfee92d430ab1bebf5f164eeee3223fdd05040849bf5036493a665c2bd297c3139a619efaed980e54ee160ffadfc1c889c2614e3204e168ef41161bb6f0b4696d5c46922234c42cc47cb141299a2c4628a3b69658aaea9e1c3453b99361918d36b2052fe29f1c316d4a3f3ba55bd1759534676f893aad68e5c49f1d429064626e727737af00f6a9c2d49b672aaf48397ba599dd39d5ff1320fe772cfd8356c7d55faaa57aff630eda0611cb248f0506de7a81b9c23c20e95ee0c323142814b2cf9dafc2c8f6d56362d3ee29fe903dcf10b489817ce891ff822864110e647873e5dbaafe23705356cfdf79606da9b85070a6eecafc2b9be6e2d0d9c09a1cebd93f6153791556ffa32edd235b822222c68adfe87ae522b3196422ecfd9dd49ee1094670055a161d89976e91b7718fccb161e3aba23116eaa5eb9947494a7a6a2eb685c6630a84ba9612028898ba2542ecf8bfc4d248556de390ec9cc08755cf05e76686646a8db6809669ec0ced2405d529f7a1fd7ba236d51139f2c19231e46651f9d1cbc51a8509585573891b49b998cdb8e5343fcd6f60dbc6269618003b80ca66d57289269ede86e83b6c0bae2145677eff1ce86c56eb50bac56fbd473cbad2320a43a6ec1c26bfd0a1c74f1d772310d9c111831ac75e285b1c45c6bc73870f1fa5ea4f32c58c5c2bd181a7ea144951b08d79349c040fa9501743b9e88a10b3a4ddce02020fdcaa141db9db2ed7a585febcb01fa8aa7b567cb165eb9e8c9a388bed88f75e9880a5753dc69454e3420eba6bd863f6045f26b91c86b0d615fd1d06fdb75d4dcb6d97c0ccb54d23c50e257ccf9ced592b8d712b86128b57794273112c95c1729176c333c3276a2625af7d9c5960c97ee244013c0aff1effd118d333e7fb112e8da9fa8a5945f9d5d30d80280c8610722ed1b503ab25f60ffd5748a0358456f49bd5e8e6bc540ca099c301f8960c8801248876fe8c2a4e604037521b3f0bf600a6b57e2d872bce921584d3b1b2d09e4488885315c6fa6f6e1f7314bda0e91e4484bea4a4c6299c2e673005b43252151f3dad3ec096d5646555e55ba43680f38ff02f0dc17a8bdb98809fbc0ea65c4ae81ef7e71dac4324a826a5baa8cb79de68ceeb3db8f55e14f35efb4e53c2e7da043066021c579e638833882ade1aa25afcbf6d829f87d0b29c692aeadafa3774d2e4cb680b46e2ed1922a760f9e4588c44bb5444123a5242a49060a97777302317e5d28333958dcc2e90a3480099a952c594eaabc6c55b822e6428d58317b25dc4c50a4e8959e67d0c53c36c94f765b85c3007039309704cc4d2751e8bc3d4f14eb3512897db0242cda521c396819f2b22b0cf5aaac3462202a06a7c6f8e312553c999ec179d1057f4de1f81d452929f12a5aba5891f64d8dc174166009c1c3a290aa73a416ee9c9613e8156788000aad9c12d7a08cd23ca98d7ea27ae69084417553c858e0a01a3b0f62a521a3baaf7448e4e195866d5d35c7c23832727708e5432dd624eece7bbb47d724c396ffa0ad027ae7e8cbd53b0def6bccdb3b04f3a2b9203f8d55bf66620e4b8d9aca33363d2310636a043e7f6cd9c65025130b5da90c5652898fcf2a30d61d0285acf45d1d4a70a2179659c9a4f8bd4cae64fcefbd44688bcb67c09877d5deb69b23e89b540a393d4ba86fcd2c0355be5d45b9de4aba252b9667687259a70a450ed4c4bba594de20cc726a15e2332aa31e5ddba1b2aa876ecc6c48502a08cba65280c0c37ac49c1ca82c7900be581df2b625464c0eea4901dd7e728cdcc5943a4b09341fbc77902f25c2f13d776db314dceb255d4c86a1862b37c01ae08009e5f95eb610aa4cddc42867b70fce833d55e57563b7f0867688f1d6f3a1f4563fcb8ff8917457e7d17cf45ae7e2ba8aea73c5f688cbf3831ce02287ac2bd196121dda1353d41b1319242c35f8bc485b1bba784d25b417b9b0627252675c1d4ee5124f595622eb5d9136c470c14d908380858f97338fb30e99a1eddaa59842d78d0d01e521b94b0a03d5229ce24e488241805fe7198460c6a689df4ff333babda62312ffa55507b18aa6a0e72d3af3058019c1078d39a8f07dbd104e09a418fe77aeb2f5f7a8352ef260c121f5e0372bc60e1d3b8a2fd992840f5f8ba584b852c7311b6197394978e9c694b29f60a2fbb86f8fcb6dcc200887dbd483c286d7c531dc1d83206a7b75f5194cfd6dafdf9986f4d4b6db5124ba67b67b8cedabe48941563d3fe543f4599cc14cf75bc136b4275614023c78678d58c43319a9788d6bed6ec7461f889a66072dbb031353a059097875cfd561364e933c6db3d8e4c6d2c92c2295d192469b05efd68afbabf1fdc238f7ce295156780c73228117b461bdff1212ce5edbac1779a09d14a8a7da6c1882f3c37f812ea7e4ae4e390cb765aa6ec47618aeb7155dddc283e18628348caf94de880441475d7235e059d150412ad754fdf046bda31e8052f1b30ff37654d1f99a025c3ffcaf3c1af6ae040b1fcb92fcbc35e9a05b64d397183ec5c7c44febe71c96b9682b9ada3cfc80292fca346f904c87cfa9353098ec5bc82e77f7b70c9e166e9811d94531cbdbdc0572cba03164816a215ea6fd28291bd4d69af0ae5c0591f51aa611f135a1bb958547147531f3f7a91e82f4c05a7ac2d432ac6b7153a490c2b7e0899c554178eb113882d495f6adfbe4a3f600b045f79f18345bb9282dba358a0dd6168faa7a9b5ab7141ace4aeb4be6a85a6808686710942452b698c881bf60b130280adb98ed8fae54f4c2205544f242623f70ab469d810e91faf429778da5a3f4865d5e8b0775ca0c59e6970a27f91a15ca3b297ccd1c18d10ba03b2f3a209bdb1e2c45c35c45bc826b29b8ce2c370b4876583810ee479560d1f250bd8f9b8182fb1892d3ed87446412c120f2b94b2f3496e0624e469ba9545cb89e6bc6a599b6a32a66b7feb7562f6923ac5e30b46b260504b44002aabf786ac239d50874480a05c0d24a54ed9b21559a3c8bd20d3a40ec948bd70c19fc52ed4eec6cdea3e47c8b740c5807a9d767394df109c48f60f485f295e49660dbddf1396a57a4d555d44885f69b52f3f673d929bab12b5444cf80bd3dfc173e5fe067c3d913c11d6f4317b27da0a0d31d0f12286929f3fa2728f80ba3c0f46c023dd250f274de56f523a2fe21cb0a0de2a2d89628478ff187908060747978c39b9e64d2865246898bf1eb8cb3170f19f2c60bd269318e741939027bba3351d0f59d065d0ce9fac5a0e9c9f1f4020c4a32e6fb976be9430053f400435085453e992f5198cdd3f1b1a6e7515ecda3eecbbf10e0d60ad8efba699ffc3c067cb3a902c42de72727af65e56c286bc1dcd3ff1aa77b02b553d9d114409c9a35ab8fbd0c70f9270308b0f4d3624cc86f668ba06282d01157458a07b53199e1aa8fb3a8e26e42bffdb957680e5a48feb5894d16ddc843770e2edaab3b9639791fb4a5184872ea698035f25d6a0a0490f41eb827cfdc046b4a5e74997d3becd83cad5ce9cec90f12d10db50ece5759eacad0a8a27ff0ebbb59c9ce8ade7441d409dea800ccc9a9d7e445ed83e288647a04571e08c031994f8cb846611ea90caf4a63fc6f6826cffc8a8e61490af0f6ec96affd9d34ca82932841c9fb653fa97b8a1d0dd25719a5e8aa86bb40d8f0f1c896301ac8c9b8b71e25e67dc84a3120b08267f04947807f6d0dc0768589c06b0245f4f1e7b84e69c52d3655d111b677f1048f2554ff282b61a392cf1fe4e6b0fb28bb57f641d375a71a1a41b6a89c943030615ef89fc1d1d3b62f9b861ff8c807441f10ef459253c7bd0b17de15fa99cc3f694b13f6419a65b921f0d7d74be3fb94997f5b40a6e3537787678c53822347c0bc4367e63e6508117168a18ed70c540e8ea21cbe1cdbc58da4939ab8d658cd7437697418fa223c1b8d91734576722a1be8c99ea0d85b51952c5f4ffa7e90e8419483091b516a58022ab556d2aaf82c7a0336d310307e810c29019ab3f77401083eee45df672d25bf0827bdd230edc777b5c6d17faf84756b9c6e5be41be155c4ffff99c4d14a3f422c220dcdf1319faa296fa6a42395134de2c0b096095839d48dcd62643df62a4c38e1272d1aeeea6c70e5be6b9151e44d4b44e08d0fac26bd2a6403b522de09215d4e6e94b0b11037439f0d5738a68b4fe9434a517b6d179ad9757fa6402d8c37736e0b698a6c1d453aa40776e6ef8453067a0d94a8beceffc9915f4fccf8eddba18ac23587d87be7344f36db2809e8e50fd510856591795b5485d13b37908dc9f262348a565d4454be145e2f35419ac364d6abc3ceadf87ccb510c63296eae9bbe1c09617c2a54ec53674c3c8d82df24b87a07899f06b9a96d2066f3386e84c18d4c46695d9b87f3cb81e89b4be4c9bdaeff9e501b97f101c416498c52a4fb32aff9659e06d18a4c76eb88d58c91c7ce6e8f1d70d7278228887680237a2e5d3c644722c679db34bbdc18905d43d4e3b65e8868b9af1e07fff7c3db7f4cce1f5305b9f5121996c0e3be101d8d170c324b0d308e23f0b9796f5a287cc1231f1bcd43bf240ce7ec0280ae1390b24f56d5b5dc7152c1d31739b17ba18c218b31470f951608d32391c8a96235920841ac7c470731b3eede838930db4d23472cc46bc4a9ec6df3c88ca5df34f2ea5fd158c26a51b1196c04da62c65720cafb9784dee7f4a28dc361b854cbbfda7345642f79aaf81877a874f2e2ac79ace45a626304fee509a8b08f9e9b41b6fba06771d751f5860c61f6e42e4db03fbcc92dd33610646f46f24404520b878970fb2dc34c1594d3757eaefb8bf793ffd900f65c3c0aa2876cca8b050cc203c8484c6c1c6d2f1e9bdba98135c162dadb07548c8812c98f7291140216a64707d41bda31c50b0a406d00f7347b5a24099875c49d3214c65142136c45b4e70ca146086ae2feb0511c26827ac60dd51883cc6155a32c19dfdddd3cf26ffeac57c5a08774b2db39ed0d403142c689a0cd0d67a7378f1f56b256390cf28267c5c5478412de000c34bfc0d24d19009eda74c4934f0a1bc7f17111aea5f754c34e80990c0e0898d336704a125ac253bfc3393cfa492139455222a43baedda2fad6b08fa59dae001fc5e588b53161c73860a1c03668762679a8b174c69056ad4e8387e2063966107ad757530853104f41d8924863a8a891af59f73e53907dfb7e93f47e672efec2b10db5c9acd6ffeb5ca97936a6fffcaf96a36ebffc72986fe35843392771ce45ac39b6b1e3c170cbddce29c262256047070ea14eb350f87588922c2d8525f4b4136dc43c390449a50b950ea9b9f9eb39ad2d46afb9fbf3387026c750f6b141b159036c31a25c206ba59a39e4d2c012a550d2fc5948fdeae2f44f79871d29c0a8bcb5d10cfd085c4f95e7bafa32b3752c011bf18d18080dc4224d3287012f5995b3c19bc204d9e496450b93e1da398789a3a4c2cf7519861cbd1ac827ffe8a79a589cfa93630986e65c7ccb72b26e96b6cdf031002b531966db231376248a75188cbfcddde01e4866c8e7cb56b3fd040c7d32efab9bbbac7e5657f08bbe6d8da8b3c2f3457bfa592393489efdbe3ba6434a2851d7ee3b1094d383fed79353d4c2413e1cf8d94f9ceecd84661bed0d34f1a02893b92fc76d55f2986406cb7c19adf2b9db851ed53745f4f35e7d2018099e0dac5ad54999d2fc1eb381200549ce87cf11d138f22c9d53b5a5e9ef4cdb6472774d5b48bd77ea8926eda6653f447dad7f9472116c3fc71e66c3acfc9871e782351396563e1824b6e19d430388dc0f6b4546fdfd375a8214e8663cc8f1275d394e8de606d6dd26109b56c8b99389049a1bce3355a6778efb74c69921d24cc7a0d2d644767c61dbd5280a6058afc66b0108d07700b208582bcde772e746c4584f20ddd9024236f35fb7f84cc7f894b296a808faeb8c7f286b44ba276204e02b8835109b8ab9df27867dee051a64d5ae54101b777892e2f993e908e72925adde67a5479a14eba3bb5b575a0dc5eea1789688e28607600119cbb5a75f6f4bbb6f0e210bebc2d08e4ba479a6c1e676b454f4a98ee60b001dd9c5c15f864600b780df36b0853bf75766fb5fd01248042272785961208cbaa00389e7382fadc0bd03c72055c603b94ca6a3d7a048ab6be39019000970715c3cea8e9df53ed07e02a8f7aded4fba567f69c240e0841e7a4cde9b0d0c208fbe169bd7bd43195ae564759fa62f75934aa32500c57f60f86f005a17c9ed131910609c59ae8fd5b18b7adbc1e502515b993504c076d7c381da854c1632d001e2f9bc9ed5ab48235ea9668f9687bdb15cf0b306cc73063f14be53d569cb2864875e0d49c911b36660a7e92b2e00702eb896671e259edf27d343528a2ec72e984cc0125e5660c4503d198f7ced2dfded22965e9ebd269a983f349a561b8689a9c6a106ea3441f3f4e80bdc26e33b4c362e98d53de326517425e7fd545798f9306a84a295d789f4f17f7e185043278025415ef127c65357d138ea2eb845780fb1ad2dc87c6f4d84532df98e1022c48f0a4dcaa4bdab7f1fccf2720561bc9fdcbcd75cc86c7614358fdb4e5212fdfd53b19e9ca3a4d391cf516aa4c0653afe1a97e124efc3c1cb327cc5216dc0bb12196cd033dc66754f885b0f50203b42e64b41483e8e63e06f2c6b18fae01cc53ac54e302c303c0a6bc793975ca8125bd525106291a0d88a97fadad7f7d5ffc1ac45a3a8002c04f37ca90361c5381c4517db14c2d659cc847a9b70e74c50a2ea2ffe8bfe498d9c783bdbd1c455788cbedd4b989db71434a88d88bf99fe5bfc0e9d49975373c6f72e2d8a4c1373b6b04d8d8dc45910bd44d2da822ba90ac03a4d14d3f5f070d3061ee5a2fa776f21157ea3b64d20aaccb32dd4f765f4c24a944e38b59c8cb35fdbaf5808b748a9457bf512896b26a3b8054c874a1a4cbf04a3b6ca8531fa67f4d590a0bc8763ef6586348cb3fe3207f11f22be2efe3a6d356e605da2c5dd3ee6e3c8cebdc924cd13647fcadc22511ac55fcc1c7e40143256a1438d91564b52ad8dcfef2ba3e0fd73dc52697eb79a0e29d9555ca1a35c5e5dab94e5ebb2108bd1f161e0999e0fc7d2ca0839b5e5d624ab51226b746bdb95ca4ac0185659fbee64889104ed4d0cbeac0569a23b852989075f14682fa44c0ab94d8e40598862e31ec51493d90fb779618a3915d00b3416a0e684546c8a6d970de28a72c694ef7c5df72c5cc6384f8830fec8d2528486efd0f775867317c41fcd772dc88c6670f4a0709ffc7d76909cd12c1d64c627e470a4c022c9e62b3770f49595cd8326d5c36595417f2631384ba5a3749e843ca81347b8d680fc9a1bccae96da7a51ad7954fd84e0079bbed98b3cd97c048c127afa7db85b631c9f40bd1eb0538f8acd32450d0ada3399f7ba35f4cb773d3a03f3e5bf60c5251de12cf143ac63cb5264b12cdbe956aecac9611e7a3e9a00cad55907891031e701d5224728be7bc629892266d9ddd44ccd0ae0bb06d2b512b31d89a946863066fc5257fa6a80f0cedffdb99b5f1b10da60f031d2c31ff94cb8e1ae1fba5254c2c001d605104c7436999b0124e835fa8c6fc34c6a00665f656979485227a349e4bacd634b5675c22338c9da5e5e057eec3e223a934c4372dc2a30b897451bb271a18f6b87d6d14a2c8a4dccdd289faea89ce412f1593786f505f47c4acf63877369499635670a78d6b78c146891d1ae279c8efc22dca7e94ec2d858149b746eacb0a6ff1a6d0853796e12f6fac49e63cf4958beaffc1fbabf2c54e32200294327178048d82c7553b6c9a5f561ed98154b49ef04c6ef68f0233ac9b5ca2efe6f37403b66fa3c7d56a337f83983eb613b37482cd8eb0ac81e090741bc28250a50072b85575df97804a3d4bc71144d438fe1a960bf27b6e4ad363f90598e4ef5aa4adb4448d4759039b061c55d8d948a4096ab158a94a979a25dfc7254eed41b91919f53a9102e70636364c7f1e70e54210afac629dc90b35c5cf7ea7d73f5be7f1af4a06ab0d35cb0d839ed64f17cda9fc349a2e26b8134ff1803532c280bd9201216b69ccda1f3efc4a90ca64d67698946c0eeaa0bc93e68b53cf7e0d9c247dde999be820451686c91aff34a3d34f9b3a9d4032a41274b2720802efff105f85fc9ada1733891ac422aa018f5050cbb7047559cb7a3cc4f557f740d650ac11fc18b887d651b15a21224abbc91fa3507eeb6d4af5e69425be41829a133dbc671030c9c91d168bb65e146513e1dde1f08022ba33e28a6a1327d98dd63c439b83e9c6a5f44070b64d9bd255869facaef8c0c072c73ee528db37b991be52ebf4b83229b2d471224a3909a6489327e7f9747d26b2433dde34e3dd5245c4315a4f2e0463bb2c5c363a618d0f62531d163c2a0dd77ad02523bc92075b38532aaf0dc9f03eeb265e48b18880fd1ca5da3fd6a85e1507f4dba35dc6f2a009c5ba7031d980434b83493f291aa412cf79d99e1027a7dded0d6522f8e95189f78662ed65998d8c4d706adf6f840534f6c04826ed20aeaf54588391c642503e9073c14f4589d79ed674aea20672627e36139a6488bd3719ae94e68e9fe8b0377e9d673662187807ae4fe1784fc8f5aa23319b1c0f89a250fa735facf027db001e2bc2a84907ac48befe926bebd10111f0a9792228f3283c63b9aebb01debeb4f37279b6bd7d570956dccc4ebeff56cab0204d3945ad58ee0f83cbbb7c74c26d0fff85b5567eb7429f50fa91a9b17b624356beb6de1d41e9b2fd2a088e20d7e8c681d8b656d58bdf22755797d33b653ecd3a1885c30191a5b847b98eb74205c18e39fe2635071db934f10a35886cda7fa8ccd976d2da1df40fd3ee45ae200287669567688bfdcfb057fec8138f407518f9355f3c1a5ddee0f643b40559fae89340f0a59c7bdbc6613412a106d8f2155c1b111bf525ce3048ed8b8ae9b21830fe66cb6964b4e9db0b0424f687ebc066b1728390a8d3fd252ddf3e83a27f40809ea799a4820ae3ca88943015828447a0554806725d83d91496e9efc2e58327e2801f911617f5020c70ff46d93ea45d6b2bf40b0abf1d77971a36fdeb826ac88067036e53912e511c38c0db6be3fe5c95b9665be2cf1de55b4d6aa2a3e676a057c6e14712f278398826cc00c4b0b0b6d3968b18b5278b9b68e6061dcd476d1861f5f7962b224fd6c886999e36eaa9386e7a46aea58190e467503dd34f116636ec1f3df852fcf463138ac66ca0c6e4a73a73404e50c69705634997ede811476d35901bfbab1640829b3aa9f8f47e66c4a27167cc7840759dbbc9b149d454de5eaa97ef818d5ac3f15fe98ee411cda9afb0c3490fd90c40b37daa3541941c281b00d8d5e061b0940462d89d64219c960ae9f6d9f60e3a40ba4e8c695e485bf915ff207c5414bfeaa6044d8006370fc8832d0d80d80aa343676c60495a2996b7ce16e1feefc373ee235650476c7eb5d33a19abbf61d9d48ef2423da0274d7faf1287dc93ab1f28c53341e1fdad31528a474eb5c53d5d04b5b401f0625349e02d40a81099778de2f3e96c875119df3c9435d3cf5dcd19d7d35751915df0f4e8bc03c63c43c80383fff46275cea15c1d7f03f46faa19b5528262b6a37bc1b2c9f316cf38cea4a45cd5f42c21db345dee2d32b63eeebd9055fb647c212960928f7a84201b245e58e3eb5111d090ca7096d0cf29b1dde5a8cfec6fac66113214b02237e7c914b9fdc9e74e21e9841d7d6f8542ed010cb48cd080d9a5268a849a0ca41c98aa4478b09f6435abc46c608760288bce5ef28e5dc0c9c12abe616d1d9d0e7e2b9877fd43a1eb73985743645381f8fbf6748888ffdd2d6177f1af64a6375e9fe7dfadb358774005f2dd0c2fc4c25a9aa5fe7294cbae508572a2a389a59afe0cbab987e0f06a2b5717ef9d6325dcddd27434c06feac91507d3cfcb9e37f5d686767ec846f0df479aa0825ff5f58e063a09fcf1fcf897c53309719866d5501746eec85eaf7397e90d0487e37bbeffa517ac92ef93e392c02893ab0b011a96106fe3ae29840ba1b65dc7378c27253bc6d4be69062ca6f44e5058abf1309b8cf43d2cc8e79f1a459c93af05d6025e1fd1a02afacd1951735a249d622f68f28655cd15e87071355b0c2ed274e8b4ddae7772fd8a42f0b26c42677cbea6d315cfb68c1405f54dcc738aff8cb43d800f42a431ba609be825d81974da239faf29a461cff32491b40404776e5f5bdac47c4aea82fc77c9bee61dfc4e315b090ed64a7ff0147c9d01d4fd436d70887078b24bcb507c9adb1cff96112aacfa10ef82933fe5b8da8fd04f7b20b3af2f7458f29e6b9eba7e05b7662d3e1a90cd81ea624320d72253720fdaba563b641f92701aab7ccbba563d53e5bd272949a8360a2cbfe526d20f9c045cf5483d6224c3a9bae0a59ef83c8c694936af8027bab6ebcff742c8025e156901a31a9ca277cfb54695ab4a3d176fa4e7fe7dddb1c8ef21353b87aef16a529f9ef95763effebde676902078eeee937e5647a4b4853cebdfc45b25af9a60bceea2ffaa77b4ef41ba76a528db5eda48eba3985ee938c7df7d768e9f438f76d7b1a39f549969a47eaa577ccf393a59d4976e33b3f866c8d51286b3a32b3995438adf739052746a2c18c14b11b9e63768c72cba3ef799b89493ed5f4595b647764db93ab6510ffba414405db1de0923cbca7d36b93ff1dd60968ac0dadaf1717688cab0e9870d5ce86ff583fabd36059975491de496b67935d2427777f83c3a15682a68dd5ada4c7a486acc7054b180b0505d84cb3643f50b11a4aa2fd9ea2cf3b8d9da2cd8109c7200f6a8427839f4e9f3930f7a698b27155b92bd4386e1b0aa70dfada447e5f944ace184ea5aa3094ef0c63c45b0fb69fd62c5e2c930488b6cc687edfbce673e23980674cb44d07d6710e04d5e288fd489b838098c5966d69012e79bee5106639785aac11c5c34c727187cdae0aab21935417bb16d51ab838ef42a9e5a9d9bc588cd71e11a183eaef060512f92438a58ed4b09ab9e6884593876036b2c1d6edd728e81aa6649ccc343f51ee5dad87974ab6b67b7131bd5b89256a452e020f7bb5339b24ca2defe2d1aebefaff19fdb3a1080f122ae1713d5384a3ad2ab885dbfcff94d1c36466459db8078cec98da8b28699f867f29a28b8d05a20add910385404259350cbbdc9975eaa984766dcc5e12c09fd5f0be747c16ade460e732e5cf575d354b2d2d47674b487f04c7d59ca8ade7ead042ddb435ba50dbcf73bf67ca9a5c752275aadc9757b8ec9d40d52447cb6615bcd158cdf26b7f02a15128f75b587eda101f4467e13663c01cd058fde644a9da71c9467f9c3d6f7045d8e5ab4c4187cd007acd29644707f25a7b327fd7999895f60612332f16acfcf35df3588d3866d3d3cffe57171c7ccc7e45a0edfcbcf68998b575d794d8e989c7559828e86a75304384a636b123ca0aa73e32079567b4df4b4c8499b789caaada59abd553e507c3301a18428e4697ddefcbcc77b10771d62b91ccab555dbbd9fe46545c86a91880950627db6fb060e9bebe9fb3068b0156679255b31b53342fd9ccc6b3bca2d4ea85ae119c6a75497dc68ac3160551b8209406bdb3aa4597c03e0a9a6eee4da6577f102c74a224dd8ef13f4140f3b1b688afd1277f1a73b072343d168febf0b87c9922fd19c4c753885b8f19b25266f83c77e533b137843d89f7819140dbdae70ccfe7f9491e8f9bbfb5450e2eee4b3da5560f2bc607306630f622917cb96538d8659121b2d3b1de97836a98758dff910799e9e343f67b42914d7a630347ff09c70f5293148c000606de126787546e459e78574785392de8245ede4d1de3a9be8877f2dd023271a2b6a97593fc2509f086de9873764c6cc60fb632f1f4a9e46c252b031137168f13be6294b391c9482d9a20e5598f67d365faef4cbde441ea747a4bf7291cf7e00dc774e7248fb4f5ec15add70c752c68d4036b8a9328e4bb817a031023db7770baea8b13d12101a41bd5df9e1a321d181e6360c426629d8e91c815a98844714eb7978a745f130480d416088bac7155cc7285b707f3c33d1278b3c89e43d3f980f732f337f224dbd3e9d07907c84c959c8db55565eac55d8139fa98c4bd431161f9cfa544b8fd92164c198303051e783ae3d77ca51b9fa4018ee9663fd3bee4041c2d015354f92edd8242bb5ac7ea2513898912d434b106c5697dcdfb414e0a0ceec1227d6c841c3a7e491e4a75994e6ed403ff50b6e7f9d79995261c2becc4af34caded1a0261c7664cfa87366b31757585754094031cc22f53c58c80219354bb8ee11170c8742985c0209b10ffb988ec48833761c29436ec6b5f1068e836bb7f89c8e9d2e6e128b5526bb7ec26fd003fba82d415101099daee511721f3b16941631da01d1113607f9a848dd0df533c112a1cb6c51debe0dfc45fa5a40b27b20a18ca0b9208040b3e4053e60bcbc9bb0cd33bd257a4defbe214ebf8da15367ad88885c0d321e9012ebcf0fb57176dd2e147f2d995e2e26ee420f26d837d5250dc2b74f716756116c0c8d1953a43b343d9a3635cc7c3208a53703e0713cd81a61fb5218184665b3305513735e9dc5e732f19fa0a72f146088ccd6efed2c34ca6879791ecfd8f5a47f048e1517f5b96e651cee3d84c53bfb10c1f661063f0699a39e19f4c9467b79560b59a1a6fd678dbecd2afb2157f7dcd0252961d5a602cb44f6186fb54ed9c0ea14c91e3afe4360afcc08452321970acfa659c7b49653c8f8944d09c8814d9ed9a7d38649f44d1545b56677d9970fe4873bc67e9bcf23a1cdb0ffe08ef0b6eb5522c0051cc820ac88311ab1b768517c81393da1acc268458bfd7238d8f5b51825b6209a3c61a8bf6ad053c062bab3001ac8b9d21175b9ac5c86e965965f22748e09df5e46cbace698788277f14cffbe9027d1291ac40f716fade2898ce575ea5e30ae2ba920777a426546872cdfddc1e16d645898d3e18d584c7456fec7b3230f1eba13abf93ea1f8bf64c4c169745442f746e6da4d98d31e3fed45e8764be97234a1224888428ccc81992147b1d06733b4485418e79ccd6b6514b1ea5e10c008d234d7581771e012209d44585f64a4c9b26357c16c0309736d5efcf176465813c803ee71a7b782e6860541fc6f622709dc3ca0dfa7b79fe75da097e96783c465a0d00f32ce51f4928e20bf0d3e047b2f8c6cb1246f3f39e66c6a1b56e913099c42ba75d97a707c17fdaa913a3367af6f6d23efdf6d5bae7bb0dd7089513145f2b9297992da902b994519e45996aeb1b3ce14055cf134e593cf65f5cc1ecebbabf3a07f9421b4885d08f25ea57594f9e37fd5ea7c135701a8145103af15a0620b5f87956d9f322abbdc99a280c5016ad0179c1bc9b6a518705a77cebc1d445ae065108bec7f21ed7baf7c1828abd7917f51f988ae8a5f3bc676ee6155176eb67b0543591762e3bf12d40eeddc4592b686805f839cf3fb05baeebc9e725c98b77cc81e03b9e8c6ebf5287de75cdfa77ce53ffaa3bdbc51250cb2f7eb5c90256ed26c9d2f61dcfe22412786f06fc9cf5bd845376405363b29e4ef1608d22e5066c6642d8240e80e8d8783676754275084f1754e69e897dbdbd6b07d67e9008fdcfc52ceebfdbdaf791743059ac0d24711066d246b324af061bd9cbeabfba61ec3f1f52e107e036b525d2a458ee223877e6d6857081200d60dcc28d688677bb745449155cb0e21c6a2388f4e79c9725770a6dcc9aff51a43241626dc2e7cb030bbd1cc046bb0c95144ab6273951321523e035082ab805d2930ecb76aff81421c20962555a4300507c5898c8680b59fa923b1401a05f46d8c1ccb76d42e3009b951bdbfe1fe3c8057300ff87acf466310f4256dd1d5d0076673f9ab10c402526dd041e28b0075e0048d1bbb116fec3044133041e20c1dfa630bb8c91efa218a01079cba9702cd0deffdd19c37e0880b65a8bbb1f5a4aa0e2b965da0cb8945456286c6f8a3776742562c416ed14ecf46b4a916da22cc25d41a31f3724b4be2cb48fa4aec4720476a6788f001fc98777265e96e1b9ca32dc52f775c5d7f93a0daaf1fd1a170145e6315e73227eb950de493ecbe6f796e5063e4118d348ffa65914c8f36bfe05c44cbfc2164fa6592a8da1cd78beca4371319736e3e9f046cdc2cb6954c23246c73b04e9a8de752212c58b4853c69a26826d7746d8678e028b4e572f74c261dfcd2742cb6ac49098252e3f538f232137e68bcfa7a5d0c9b171f848e4b5738f0e5ea39db3eb14f9365c1689753b9622cb32626fbe2c58e2c3af97e931d1853ada4f36e70231acada9c1c3ffe2a84cecc7f4cf2e9dc4d8d2e12ac4e62e21c9e89b4feb6fee787759bfc55963665a0f0ba30320575299d9002f4eaa4e22a7479a3b9a4d6619511e393a868bc61bb3f650276c77850b00a08d415f5be4fd8d5652f39fcf197caad26694b080e84fe90dbacc68e25ab4b5b5addfb1c18283366aa31edccef878b09d2be99ad87b9b91ea4d02419af1e02d1f29d8fe25e70011dc48dfd27ced842527362614602d4bd6ab948d55591f3359f2531f458113be51507e847813d8c26684ec99e7e960a291c0f4779084ccfc83fbbcf68111c0520c6da1ccee94aad26511834414b67c965d8e92cc647d789c639f7eeab37ad79a9e0997f483e138d4b5b51cacefd0aeb0ce46c874b4a6b631ba96466397a11429c84d3c30a8a9ba43826df808f2f762df306e0b313f638284cb7b905b060e850167a49fdce68a6556ab5f375a561a734713b3c0a987c0d4c86dfeb393425613d604a870b4947e35476f427b57007dc51b3308ba6db38329cb7d2b3adc1b10c943a273a9987d7fd2e50f20fdc549c0707251ca05f1add63d07e50206f5e8126009fe65ca59dbe064e76979fbf0be581901f5fdd5aa0542f0f385040859f8212091e51ab5c3f12c645f58c32a47ca65122788da5e63553610d771a6b5ac9e95f3c59f940148381542755890f8f3474ec6ff1264d2e3758264eef6003e83f1a4fc1f29bf9e907d44b6ee7701c29ee97a90d9a51db1754501fae0c609ac37be51d9809b8c57b0d9214b840c68bee15b8f1e49a3291ff3b7d75790cea545c9a2d4aca94e048ccb61ed30ba1c60b0c6f6558eff4450432f7eb4735a04987b86a2e651e0b2a44ce31fb44ff5ec1359112e61b5d4247f91cc897d6b783a3a83df05bb7ce63cd4eec9db274666688758efdd96731bdd32db2211a39b3d28046207ae24e2d2bee1e81eb7e41f1bdd366445d2101638a704febb7a2c7d9a55b2a26f416569d2a6650f131d8076f4b001affe99398c43a653a3c80d76f7466ccf7c002a99863fcc4e1f0331fef774d471c9f753adeecbb1de551f8ed42ac53fe778fec54641383321f0c4bd9e29d64ab5de04027a04d8ac4745bfbf980bfd8b453c96343c5c6d8c388b49ce7d7a761ba4e01e766ad03bed57e12a7f6dc0c70659fd97e74d0403f23efaeb4c506b5783badf8d5702ecea441eb57141a82d0a98c6d3767cb4d8922f020e4b88ea1e9fbe88e24f41fa5d22ecf4ed84f22d187aae2d8829bc26f6edc8664ad037ecf34efc2d9d57a5d6470d3fd178dedc4a702fe1ef59c0e71e1619fccf72262446696f3faa5cc926230a4be7f89e78522aa060f734a5e538454821bc7e30462f74cf9a3b49f58b90e9759fc82714268302bf6903af54b22a6f7b95100c647f76f05720facb283e68162a8b9e11a9978529255a9aff99ae466c8a93e87c31e072e8de42fe5ca7557db883a2530eef9e614003701ffd01f2c7b7f1a36b97f268da32029c61b44b76e38746ac6e27e1fb0b129fc8f9038a3d0f7f1adf482487393ed983cfb0583c99be0c0b8c40f59abbbc62610d24507e2211b1e2403bdbc7b46380cdbf8bf7085da1e39226e9e8c0ceda2a9f299b4dfc6bf5d080caa3fcac9b9625162c4733c1114a2d77d08ceced6d4779c2b0d7d45aa7e4377ebe8d8a9b345e72eaec93f940b598e1b2b6efc7e231428174e8d673a8fbdd14d65132549b063adf8e6d2fb739798aa9b8a15062dee0f3c5d83c711c102cbb58f11ada90e9c047232892d319b60fa95b368711a4b70e39d9774e48dbd22ba72d6d20f18503c9c26d7f14c257c5675143481887910b5b6751452f6eb89e4895a7b145f3acbde9c109d3c93009e97c9a855987895509bf4119134d7daf174dcb98e5a9aa347e34566a99ecffd46b1d5d93db2c90f787cba9d31b72ccfac4066542367515288a28cb169888e756aa666d6388e4c8c3f978393d0fa485627b99c1400db03c1244a0dd844e690c33d0e006c431bd41633e78ff012e7eb76fc8ff87eb301879c13a5c5243349952c3dc9b83a88e4741be752bb0d34539d18a610fce009ca880aca083110717eec7c0ac4778ce30801948ff17837eb0496e8dc471f984b442f579b3c1fd8636cc75195ce13e26ca087945edf6b0c07f0a86afe0f88b37e6e155e98fb329e94ba6f5164efad425f1f3852638f046e7f69957eb47c02806d2a45307b909fb340d98829e3e1f186da5e20088012daefbba09900713d7043a9a7139e9b1a519274b833b9a1b066a800a92a4f88a866b294678317e3ac056720789782ff0b5b831e94d20cd5f8996fc2df138bd2f07de39e45994fdf4421b41fcc430a16d55ebd11075848629cb657efd1daeb24fc18585f064a943318505fe365df690788f201f4d4ded02915ec92d31a74b3fd7119fe05b13beeee0bc19682448580a10bc3a525431730a83f804ecf15f0e7b5bda5c061b7dcafaf5ed2a23706baca0c31651ab6bf2113c7c64ec88f1492028ecd31a495f6a05408042a1fe710bb6a310841a5cca6c58046a4dc891cfc476e8258073656e851b52654c48c5466663fac37060dd9a882f06003aad6cee3ac650c30be19ffeae0ed4a20ba33cdd04d338c24898f0f6734e096beaa484bc7dd5084f364695248b170a4423c37c4101da122a6f215929be9a00a27cc21762feff9a6edf25a3a8fb872ea23af5908b8220c3e5c2151967681de15a443954f4fbb0e9232c0edeb0d749c0ef353344f0f0ce05042bcb7e0cacc1db925aac07e571f1af9c6586b995142efb710e45073f518bb6f0cba277043c949856846af48b55b1a9c4bd0c0c1cb822e678c4935b5bba5c0b6ac556029570f640aa3caa67ca28cc2a0375fbdd983c831440b87b18f516c18dbf6860fd3f3263c5198bc596a386166862393201a834e9018515b386964bd41529de2aac32c539a0cd1565e0c2fb24349b084583e9134aa0e144153cac81c81bff91e718435cdfd46a30d9f60c46b414d63764085348027d768fd683d2a9a7884020615a9b15f6358b0684b90b9f472fc84786c507741c875f0e4156f45f0fa486f1226c9fb991a07ba30f16d6c8af6f5e242e086c9077d890de4759888d9b3097c018d6c6914d3a481b3425c6916567c9cc52dc52a87ea8a1c2b36454825866d5a39ba0f44a61dcc8be77ebd5071550d0892e04a0fb7cf763678facf0f4e12ecde50f0489a03a27485bea1b4f7a0e009942498b1a3ebedd7de4e879d5c5cad75f9f6b9ee3efe68d2c7c8e5d9e3c7cbe14fdf99fe4c1fa0ffedfbdbc7cdf5cc2a8a14054d546bec44a8f7623a9a99c0fcc11e72fdefcfdfc0c5d9c536c184fc130ff5460e0972296373625500f9b9331f79ecfde953a90ead7775430ccf04ecdbb43727761279ba9baccd5b20244896652894147f2941a4b1f5e2b2e812a083b8f9f04fa3eccd2fe847b8458f83cc93ddd1d2c5fe6e719de8906169d21585b4635d1ee7b3809d27d564a66b41fad6d9c7ec55fbcd9c2083594c6c70733cc2812f8ee771351f79b298a7a457424dc5d6a6120d156f696cb8eddad96f9b143fa84c80a5c2fd038bec6c4bc7c595e2f78ea63e72d3ed9454a631731987117fbafec5c2373cc26e4e9573d827e94dd236475c24c3f292d9d75603ae845bd1f031ec6aec8801d280ad17d5a4eafaacc4b2a06eebd6541936524888d8fe5fbaed0ebcb91d7b30e973d472c6d891f576ab6fe7e1a7ae2ed6bc7fff1e7e269ae9c3f4037d6fffdbbfb4606fb0108a3eda86f744d3662d61499c36539d800ece043c2476241556626921f4bd042395d620d800ff708d73cd1a935299f86a365f3a832545be170244ecf0cd10ab6f0dac5745a8232b6d7142551c4d6cdd941baa87d99c01de6036d97838f7488bd39c4746bf8e3d4242966ad0896437f4ef9a3f1b1081b602d91303c1c89b87e1adc83848e4b0794c5676fb476cbbb9505251a38c518f545862f3b63a990f7d53155d6aa54770998a235b7470a61f197634b05a49de2648101e199ee144fb68466d06f4c5e3b15bec84d0c7ca0eb69132cecafd550406f26c58c7a521a1ce88cd75e1330b1a90a76c4c817b9232a61123b0862d679ad44fc7cadd2e18a38dd1520bf755aad3e93486a374c3794a4c92e76ae7bd93c2e711b5f5fd701162c3a1d24bd59494aa5e1957bc904c514089d22192af43508ff06e4e563e1717d52d92dd96b8a8168d17ffcfb8e761cffb07fb0951a368d016e774b5a5263bb2159169b04f881baeb2ada1231aef6a99205c5524e300c2412895e1c67c28367106f0fc728ffa56ed82e633969d3a0733533eeb16c98a068a0deee249a8e23384daa886b9859746823441be0fb378538c6ae605ec33de350ac243735dae4bca62b345bf47896ae66a8f66febc302841a9a459c3b4bd106e65af474bfb5fb72a522631c43aefdfc45240e6f26c1975e0c7a1c5301cba0170a92a02876174776a7e881ad0dc619be9d094949408bd95bc1281b82e704b1042ba2cd7f3f439cf2efd5af48f50d2e8ae9a20a28dbab4a6861a7b0b775809850aab98e7a870565a46b34e0fbb784ca1209e851e53a135bf30803131063ab8c4d88113d7fa40fec7170d6b9e8ae68b8834c0feadd8d4e1e66b56bcb56bdd03857dfce5494ef2d785c99c572c2df5c00d8c965148c70a5bcd51108fc7a395f6e03c62c622875c3e6365e3c8de0a5da7903ed68c7b9bd230a6166af18d7b486d942be2728fc2603f6b674b188d59937a213a69893e1245009fe9f66872e963461e4f5be3e7b5d0c6e15b0d2334b0ff40fad167b8319d19a0ffbbd1ec1ff87d0a8b7c186467b0cd088ae1deb5d03a403c1c84e77849973d13ac868259e2c11778c083b105ebe9e2c05e5b979f23c155849f5917b6fc30314a060c42a36566980f3cba20fb2a77b97081da73f87dc2e10a16aa612b0d4cf3bd248c0084fbc534183515a03ef2d7c2577ad0bba1c325588cc7129153f156d00f672eea4f8d0a7261969babff75f8f8ef7c126dd76fb11b3677ea4c67ed73f6a3c67d8d85d648816863083af4b9d52e9636a28ba6104bbcd259f654b39b4ae6f1e90b453e4b5a83a0d81f9ccc467dd3a006348c4447722d1e3865ea7d728a728ffc149a40774ce43b547be369122aa0fe389d5f5610e78f35872aa5916bee91b42697a4f44de7ca1c0eccbd123182cdbd2cccfd94e29b2d94b9e4ff9a3807683b53f534fad702c5efb2a8a0086ac8a15247da0e107c9935691eafa0ddeffc8bf39d5e5d9c1c8fa8658f57d221b137d902d4b7e44c78179596af8d0c6ca55a8616038a8bcc85b23b786626ef1d2742191bc20c72138a570be5108a93b7113f09f6a390803f33538c0f800f7406bf9a5757057042949c1317f134cf258611bd3562c9d8d0b25aeb7ea1f18fb2a5475aada91959eb9ffa094311b7681cc16f31da2a2a27466bc9efb4abf4fe1e0995c6559aded30e767faf33795c3473859fc862dda7d012446d7c2ea1866a9411c3181561bd0de86a9636c45f2cf830354f35360dad04f172be6b41541b44d5ab2ae9cbd0aae5634fbc8a9f13c9075bb54ca096bab2c8f4ff325260c3c3b2f06c2f6a008cecc578e0f8129a65f552c50980da0d3139078402f32cbd791a77ef94bdd4f13572b4a266afa9fa0bef7548f2dac226a47886fd0803d9a10f30b2e40af498bbc3414ec60ccb24da66b08e6197759508e13ee09ed164591b6da35cfb3a522082bcd7df3089000607226703441afc31f875e09306bf87d3c104e5461310ebebd2d8c17d2fb561821e1dbdaa1bca82162fd6af32e7bdfe1be05d380d95db55cb9e4abfd08c2044143b52a34ac5e55673e65a9fd73fbe2f98a12aedec86c82a21ce1e2249fce181b8089dc8913f8c0c5a30720a2c9b881009cb5f3c745947c9b42b15279e081dc68f08a244fad656dc4fc4a7f9cabbe943104687cd19dc43155e7326042d753cb0896879c74a56cd597a6e7bfe29ef62cb9f34cd59637a9c430076b238a2714b6945a3bbd5a57fcaa5f89c6d630ae6e2b5250a83308f79a41db937b080a89459df071ee631a77b27feb527660aa452bb10872a59e05a358787f63cb072f318fc9c1a24c44678bca0c2c43638e04766b7036bb1f6d6d6b22b0dca530939a989bed586804fcab6de674c67e02ee3f081afad3cb6012e3819e47549eb53d83aebc0981e523af374d3540310b849678716d4d013e2906924f4c12416589fc96a64b172804ee89df1eaf80e3b15642799b01df9c278cffed2ff91c75a220fb27eab0c6c8d8ec35d9dc9927f70c0656959ad8d81151921d2184f050aa492813d83ae30da571cc42868a8ebc7f9c9ceefbf15f8b4ce559dec196ab28644bc10cd621062c0527299b9c0cfc68d83b3f5c7c28334cb69e314ea882c2b385a50ccae271f2983c672e882b9e622fbe0668995cab8c20520bb091db19aafc32873f4b97b1dfba953e543197085406d0b611032feed3345d8c34101e51f5a26d83a6dbfe261e14990c3d8e7034667a047e487b418464e815cfbc1d5b2ba6ac0c7c2fb3107fc4b6f32d3f2628e191a153dde2254cf8f3c51471e79ed88867a07104de03bf2ca86998d791209bd5e3d4699cdee58d10e0a4ed191ffe45fd281fb025ca66edf7390e08134d8dd042838905ce7870049111eb2af9ba1362a91bf51484c3b7ff9653a4a63d480cf1c95f7912ee297a14933184cc7103bee99dd5362a4921763a9619fe5026b87edc94edc3732b3db73077cf7a960b8dab7a0eb27bd7a1b6635cc9e957bd6eb90c0a9938b2d3eee1957917371470814c09c09284318fa6b40972c1d23002ac89719910515e9b18fcde145840f7e2b53800c1d6dd8928607b4202bed6b331cb8ac0e2162b6d44294cf47c2774d1b09fce39fe433fc767c7dbebee31da282f248f38c927f744334544cbb7261d28a178c25f7a60e181630b9c6545f7e16e89b4f0195006ecacfedc01fc91d1a667080de5fc58dbb680ac62556ad37a248cdbdfad1191b2b9a0801c96bd1f2d05eaa7982a248819b14e51f6220a09e2829cf4f2c2e782ca781b01ebc60d38b1be91dfe906b0150d32f2e3a3186f6835e3240b9f21fc230237e2da5bb3b2a798f9be96a949a8d215a5357a3cf8d2954bbba2a4c8ee9a63608ec724195c986a0ec3916c8bf59bbf2a477b02d6a27a170d16b70e51f3920ed22103d08bdfb4656c7d319955ae1d46551d42cdc0541a21ec0c54ded0439c74e85399c5815dc9f9c63613d225b3e10cb30e72b80a099696ad130f97c8b81a7de1b3bd16f6167ffe60860e10a4d69f634fb9222f29d2244d518f357d437f5664423404a3d9066b84c262a1416169604cf464dea172aa741b52d4e9f83d839e38fba86164a2c294c185ccfe3482fddae827e92ec63f6b350cf9c3598b35d56187ab70714ae3d3b893a0a6b9bd14ccd85de7bec2e03d0863331ed5c928d3065823340697f8aaab9c096324f8a4421ac198013ac40e15f5a677ba40d8fab75b8166ca49ec72cd315c9435bf5f9c92988792cee0355d804397ac05a288ce28d28c32af1d078879d4840271c09eb5629361e1237f13a1258e39594941e08db98793e71fd7cb21e79151e263964dda874ba78ce27dfde86d6b8f9889a9a255ee8bd1bf8f429df152d14083cd9965e7d223bdf93690934c618b3fc54fc655830e3fffd5c40865d3b4a94bda5105baf57e612a2a01fa0f433bc70f494930133f931a6420229b8e289b98f3d7926681496420cea356f83fa53086606892a0a0213a603d13ff074b241366b2255e8ca9023fac02588af12b0c0a424b7f65965cedf81c3a00a281bb442c2ef2738a281f003a388ac688a153f5e2d3ac8a6b0f7ad31e4bddf1294ae5443a24cecf1ca5439f3b41e2d350e35acf08618fd78723bd90acd2881fbddc06eb363459c5d59ff77939e2bca493cb5c2fd4ebf220a9123c61a53fcf0e30d13c67421165b21e6c49e79bdd79947544a8c3a757f6fafdd1ae2b8d41cde50e860853f66d672a63f0f9474a46d3953fea819f1271579579e1fc0805f73315a244367fe4b5534d1d82f2f0640f93da141b9a7c974bf65e0ae0dfd879df08d7d94ac32bb1dbe12b4deb2b83c3f3507aa0fa49637b36103a09e8e6fc41aa3233d7dc96561667f31685b81ab96b00d77a3f0893a8933c2bf71fdb9ea1589de5d46d15282e02f891db85cc1c663132eec6633d6315e4077c924e1b35b168b65a4d28bc9ac0e76b2b68e8f08e8a1abd17287dabbbf91eb8289c96c42a107336e977a98139a5f923e51f4e6505218bc70d6c9e9a77e01b5e58f88e4954061b3a9865aafa12c193cff497bab629abede91c9b695b73d3ac637e7c8647d8caf77ab9b7dee5865754d56d1341854238ec1dc9d0433ef3db001f6ba2d76a031e3d94f04b15dca91af604df0348d4b2d7edfa7df3a61efe88523aa66f993279f71626ab0d4ca5790fd507d1fe00e19f0423fcd389489544768333f0c11897353bf82f521af5fbc9f940fda7e89759ccb9671dbc54a23fd2892337a3e5dd605c142ba4efc4144fdf5669b11f403d5994cca8e8c17d4619f10554467515647013eb170bc904daca3d414350bedd43e2a001ceef98efa9572da4deac847c5f028acc1f5d6d71a3439acce8ec5976cb67048813106fe3b82f698b5571e0ce0ae41ae973db898c8c6c7f58ab0feae3b813852350456bdda26f76f1f9075ed7274c200d179c74555cc263d33a2371a9701fe6675ad4ec91f37fa9d754cf1d9099649f5b2ba4b91d824d65f55c97c3a52c248a31aa5d0fbfb610388e1901dcca87b6d42858781d973361292d0deee2eaeb73d5b394d198d2be12866838d46c773124dbe0fb0ebb6c5a81f867df4b5f8867de1018ad56633ff2651a9fc941beedfeeba868fd3251ea161f57539a9bd76434cc904c243d06b70abe31d4247f8fc3f031200d4cb2907698e56eeb70698b94699b120cf654cea5ddb483f00a4e153e388a9f7b717b75563f86fa31b391a8c22a067c8dedf3d7b722702e0f8c10a01492768130a35abb2c64dc5e7378af9be36ca23144c922f3e0a9384d7875c181f7c17c8039eff2bc6b6392ed914fcdaca82cf1a4743d63705a1e2b6a421e920ed9ee96fecc9da949e3f93052902cf74995934f4d004ae83c4f70e521040aea839f836accd8e73a02dfb73678317b836abaa14527ef55f254acdd3537bf764f1bfd7fe2654ff4b904c524ab920b28d3e0c7f082319878b01855cd9dd2b573b9a1271cc25065694d52cc55db44d063110f80f230e647692d130e7cc225362ce7945c6c79c330c218fcc4eb40184df4382608e86c39cd30bd711c125da953967155a08e69c60e432eff0883de499d7cd65ba8c5c245c1e9492fc91848f247424f932937491248a52920b24b992e44a424ba7430021a3023ae0f8523a2d81012c3d9c422f7512ea39dd9c32d2c9743ae114c2a90820b324860c157b906cf4b0c3860dd2195d66490c990fd864b1b1b159916c3c1b2a3617087e7a7c20d4a9e750d429db58414c64c8014201e5307152a98d7665a77a5ae5f7287984b640ad7a92ccd14fc3505e150d7dd14786bf4aa130dee4a7c258fc502b32456968aa2688e62745312acc3b150482acfe4f033de9e8e8a45a61e6df2854923ff4edd0206afa6f14a2e4add889aba9343f3c403934c5c3279f9442716a48045195d2d02f69ad461fe26c5a4daaa6d2fca468a8114f175bffe466ff948f22a197b3279b0fc52729b28b299ed4131e54eb9f54ea0226bffc461a8028129ad97bba1e7c9e024aa58052405fe691351a51b2f5449a45b268598a62141a2812244890d0d3d1d79f6c3d11093ea9d4869e34d5343fe5a77acac34c94a1d00504b2003654b8a2c256a1012a8c50a266d0b24493a820850a205061cb0a475618800a6f9454b862052b4264b1824e698533567862852b2bfc0a2c58210f163a10461e2c0051620188851656a0010b76b030821628d0824e89853225231f941840056d61ce89c32c31004aa9852106cc520b2c307232c244c9c80f4674308219f9c2881673cec982024a46c23042c79c73968ce071e4c8111516a065013f944a7c01a614cab0bca4e044e94a0a3c859e1296327a24818213a5520850102aa17142193d4a6d944ef072821325149c70c20fa53ce69cb30572b1873ca3388e4cac54318de238fe0d55c21c7ae25cdc389563a58ae9862a36a148c31f5a821dfca398509a733e31c134a7094f2697f25cd431216502074cb8405098334af0d2a50427b444714b304288127a284be0a512847a4ad8292153659ffdab201e5188e4ff3efb5741e57e95a8138a3efda388e3db108a3e1c781ca40a00c623b3c7451f8a6b68982460a422ea501ce5274a142609c049c85fb5ca392350428096395bff6468cc794231cf4bc8f194046332143f32fcf2e831464094392986a243c506088a0e15a01904cc9c503a00113324427c485026c989cd8be3efc0395ee5f7f8932c1e146a4e2aa502845032406ace13141d2a5074a8509e975003843067c90026a836159e971800090f3f481432409111ca00c2c7086346082396a69a4782848692e3d0a7a26306f7734a2dd0450cb62ca182114c2330601feda37d04825f277f28af502b922c59e27311f5df58a2c8f2c9a3afffb84281e04784221ab3eac7d36987c7688767146936ea1f0f451f4a0027082086003510c18a6083082d11325012018ed207a5528d961930700396ff010c821f01ae541f8a3b5d36fb8b5a791cf3919200e898737e41a286c26f4cf22c1d9ea3f617252143f19bb3cf9200803a2095aa1833e764d2e3858a157e6864543e49958c5ff89d6a684a200c124202e69c55f49f10ec9cb3cb9710bc39671533333321a060ced925063e4a20585102218b180e403002842b2038294308841840b80a297d40468f30a50f98f8c0880faeacfcc843e8839e0f6e66490c99d207002805c09052000699aafc2579e455d4dbf947ce733efd8fe537fe8a4552327b27f213436a4a7d8a3ed1078652e8a9058aa14d2886242f5f8552852aea020d5f933c14a752d406db9c523534af124914f99d28fd904553a991d69424494353bf4325644d593e4b877fb02c3ff248f9a9dedb64feb193a238f48132d0d3d007ea4ccb51ecfd6d4af2f9c80273d1a772b6f928f4944af151ec389c86e2abc4a014ed3c14a3ba984395a46ca8121b8a8330c6d95f99cb204a668ab1d04dc91a93f01fc54e694619fd68f4618ada187d9893a236b4f5444ff444296ae3026d3d114d98715236e4915c668ec3794ea9f283c89204739939c94356f86027bf544d4db9607481890ff005b90f07b8e00c3e5cc007122ee800990990c9f828436685176c79c1087df4a100327dc0008d181cc08f3cfc102306373028f28384810a3028c00bd6f063490cba39e78c810b7f08f28713626840021a14d1a066062a980112338832839b19304006780092420d7ea88106081940a000c48a200408248f40ae08e4a8063210a48b203b083265900f0c7245904108210969c0205db040080c08098310216cb06510426c600dd131a4a64c98325a9441950140215d14a20b19800d5681d4d8800586a40e51e1067cdca08a1b1ccdc0043730a410434e60c8060cf952586916e090300e094284436818a41eb20182cd2b25925189a4a44402a134bd9843f861f2a385129120886c9e39a709b344244969c690d20c15a51955696686128990120739d052911d4a44b8904109a4cc520760943a28a2c401182fb8f2021ef808818c292dc0d2829d1c5860070b84f600640f708f1634a087163d6ec87862055d5610820ab0a860270f32793891c7ce183dc660600c1f73021986cc39271e61f0f00200108f13ee207307bf232b038514784941998210ec38c30ed08e1650c005053dd4d1a58eac8e2274a4461fd2532a954a59a9424d74ff142b552889d3fa27389c0763a19b50fccad50fe7b15285b69e889a50af5b59454d3bcc237d03cc1b3fc0a1031c367028014701de3024078e2de2084094381430e340220e1d870a74e438218e33ca0f922304720ccdf249b2040590e38b39a74e094c25082a4117557ea11200c25108e36492640675c819868a302b98730e16e6188ae30b3ec707e6dc99e30d11c414792390c9ff8d377adeb879e384374478c38341dc20e3861e67b8e184116ef4e04659c58d1e376edc10a10d3dda60a30d2e6d64f9e1a88d15afd2d3c64d1b591b2db451848d3fd8a0830d306c7c61830b1b5ad810828d15cf4b9e9412f20c85e248c38ee8134a81a2ccfce361d6191f88fc9c5ce69d92cc3de507f16fa72473cf0e5992b9e767a5da546858a946272bd5e8c4e87de6045b4f8402f316eda99eaacdf3fce591304a06d0303a020d0e1081c6187316410112e69c3493059d396702f414218d6cceb944d316a873c9529d742982e4192298f1c79cb38b520483ced0e69c5c9841871960cc38a38c6e861733b8cc921832a5278ce69cf309b00df22bfa38cde3f3397dbe14324530a8ec3f21cf97e1a70a4796fed1287b65f9e593a83cb2721e59cfd2e10b555ff2ec9c7e486459493d1775bef2a32b32533283f9479a434f5652a458be5148ada45237c0d0ea1f0df464942999474ad2a14c4512cc94fcc04c4da631ccafe2e07f7d157eb9d4624966f01bc7bcc3efcb9e29ffa24c52ceb308160d859f4adce147c75fbd91272486b47fd4e87dc6ac1abfcc46276fe7a75d7c5d7e8b9620f895243da550a198da214b0ccbecb1bc12158a291a7e5aa46f44a338d1a1f28d405076e850f81999caa30f4d5dd8d085155ddce145115e685eacf10502e69c5c44f8a287392797956a7452b27e6ef64ff9e2895a0446d01736f8a28d3967155fe48081031846cc39b7a026ce93c70c74b3ca50fe47a1255e9480a1022f41734e2d5e042f46cc39bbcc21fe8d3a270c21c2d044f0528718218491c59cb38a52f4c8550e83c44861ce9985c5588c6fce8985184dcc39ab28c98f1c1f688c3d460962cc31e7bce28bcf9710c6d0630c0fcc39abe8a2852e0ca0802e8aa8710308177aa841e2428d1b70c106980574e1c2092e8c48c30b2eb8004a630c17978b13d2006496d9824c1a516c11260d35ba6ce1c41657d43091b6486d01b4c58d942d4228334b62c86831460d3cb48822cb2c8921a3c5153546403af2b40052430a275a5c3584d0e2d282ce9218325a78a0c61f5dbaa8d1a5cb972e56cc9218326a7c28f28f25b628d1fe464de6a7adf1a7d013098a5b2cc57145c1ac1a49f24d64b8c3178aa3b7c356103d3d6d81d92bb3b857ab5ce61da0d3afc86f7fef4f9f933934558ae193d95bed507cca9f482c0a3f291e993d1b1874310519339440451e5464a1625311c3143198c20d2e445e804415ab2a14c0050d2e2b2e2454e14309859b28a6d8f2650a213e10c79c734e11c314341f708114834831e60365c22f7b3aff91d948738c51ad0cfe68a50add3aa850fc4916aa5c41a104142928bc882350140380a20d1e85fc284c487d8902cf3973a21813059628fce03f8a655013a018a068010a0394a0e0a30c20202003023ae0004117103801022d73ce09821fe69c530518becc65d050f895612e7af0a3a450e50fa568de4f10cd497117c571451f241a5f45692b831f298627289115e80b2f509edf438dac3d63470d0d918822bf530d497ba84151134963a4076aa2693d11aaa551de1ef393a8d698c34f9f48f0c3f023e3b9b8310abf79f9248a8fd968c542f1f04994c859240a55ee1cfe8c915c662e96610ee147aaf298579cb5f5235be4839f679443962b161d1a3348b5086a9ac9ec85ac9114bd0f5cad5824f9d1f059f4b9b86913570ea534919a73f2df2147f4696202bc147d9af032754a5274e2810ee6cc29459f5ce69d291ee88007a0cc39f42d1145210f8400a8b5e4f3c411e803a4493ecfe3d04aca50f8ad564dd0347142130668620eb2858c1e226c39c3cb962d5b8cd822c4952de016be05a8021210c7df213fc8f383542cc9f2d3fccbfe7924399e360e1c30840611389045c96571c05463060ad1b8a60aadf1a3af51e593a751fc6c3af8243db572497ebde82b1a59a491961fe69c244c11b4c8a1a50f267498186262024c34d18315305a6628e10051c0f728c138a007304755aa94082084431a425668a0a5e706ad3083ef9d4c3b3cb4f544a3d8bbd89bd013a9449739a7151fe05c1635dd2c61c31254893596e032e714014e1ecb23264bec31e7ac0287879a846efa0f35711e12fc72a904172db324868c12424a282182122d641964cef9019865cc1c6548748099253164b2383133339345cb9c59b0cc921832597cb2ec94f133e729455b7a7fa0669d52aafc25aa7c72f579248a454990b6b2aa7c92fc225104cb520c1fd4df50c8ca3445e61768aa86a436f46444435fa03b5317e88aba4037cd4faaa54b91a6c44dea32fc5442630659fb2bc7bc2ac30f0a3da544cfc8e63fad126da02529aea811fa23105592123da3254759a5f947532912fcf212282b167d6fb3543a0a3d9d7e68cc65d1673a29294911882a4975118862f2b908a5fce8136592fc52baa45f24eafce46734be57b6c0d21bfa4056b973f89564985b9a939f7e1e8ae4178950a8e819852c9b91d533f9ed845f1e1a7af02bfac655c8a2462208e69c74931c1e9d92a66ac2074f2ed0f0c1d3ab72484391d02f5b4bc607722145710659aa51eca3b8776ef263ffa1ef95afcae1fe15f9230f87827c523541d405ea43f3933a7d48feb8fa91458f7e28fcc63228455b9a9e5a200fff1b3b1d9f64a9725866be627d2882f92496343fa8434f355e69248e43e3932c0a8a63198afb49f0e9f8455f66cf888ee20e13d68fdf7fa4a914cd9c648d65aaf394df164932d3328ba0a6f93d1a284ea1c84f1c7f872757e4c77fb33879e48bb267f461f8a95ae01791a55866d527aee81b8942afa262494791ae5894ff6a259629928783a2478aab91b51afac8d60e7f1c593aa932c5849e280f73f86f54fea71a7f4539494f29fea5543c87be576a3a8af4fb4c5b9af22e82bfc3ac43713016ba29775ea9441dfe9d5264f9a998d0133976b1548925991fa425cd6561e288c3853882e2f0c1082b362174ae4439b2e2dd585941bae159f100375254ac2802c88a26dc7062c5163180b9569ce0b2a20f3768ac2064ce396b388f8986a68b2ed02c45c96f1cc5fee517b2d6c032e76401094e58438d39e71e6c786c9c40023248f0734e3dd6f8a19c253164d6e06bf4ac71b3866904654a2320334b62c88c20ccac82660445e69c5dc80906cc083a2081015302c36596c490298161cd703003263543d147c7069a1f7a2af3eadba34da61f7f958a873e4b87bcfa01c1bc491608446d6a50ffd190a9076d8e4a1b6c48d5b8406da02ed0209a9f542a454da3f811fdfcd053aaa6be0773d1c7d2e129f9d1d3687a6f8825e2e020a154f595df3f9092e54769fe1d3ef2cb5a1334248234f58139fc521f8a3e293145a64c5f8a627a4aa52ab5a15de4d90a66717038cf5659a48987acfe51a8c98ace0dd44431cf1fc546f52589f14f121e6af3e14fabfc8eba688482397594a1a456abbc4f94a682525e296a6a327df8436de8c9e643510ab5a1271a5aae542f7a46b4868692242a456dc8cf2614a9498c2c0c3fc268220c1fbc10000c2e4a5f1471c5c0428a32b09461250c31bce8d21743bc9cc40883c607d0b0e12a230432bea091421823191020e349184bce98c3cb1f5eb67801cff8728610676066a0c00c0c98d1f3458d2fe3170580b101301af005205f0430461863e8504699313031ec18401a45ca2041195e784003066a946860356cd2b841c98c9a34c248439506096204e185e785072220810b3eb85889e0c8165aac44c075f9a3cb1711c010b286348d827333ae56a6f2862af4447368098b1fb0b0238b25b218ca42491660b298c1e87d7ac0c2c32285c5c582060b12ae18e40a3eae187305982bbc08f990a28fd1371145a1f1f9f8d37f4ad60ff9df2896214f2996a2cfab3e2123b1473cca50c6d31b59b3c80ffc4a5692a18f3c41982cbe983a7c46a09e8b2108644078e186f24fa565d2b18a2b73ce93893eade16f6a955fc852a9c44d43e61e2ba9d40dcfbff113f5d1d7847249cd399fe0f2049720e69c55cccc39b3e05f92b9a70a16e69c2ba822ca9c53055ca87071c2e5ce3927174a059710485c8a5001081561d8a0c20b154550f103153d5001ce921832545499461f1e65150f452dc5aa9c734e298cc02d475250d942440c5b3a30e79c52d0683131cbe2cf790e0fc5253a46efb363f43e6264317a9f1b054d141e4431ff80220c1b507829c92f33384504a2990e851c14df48fc8c48fa46e197e5371a8d39fce87b9b920f820f8080c9132e78e28c3927179ca795f38496d21358f4f0c3057312edac0b2939014efe1d9c4872dc19e2e89b48e20bc007a128925372665818137e62c984055a664a0e855ff6800a4d0c32e7cc83f33441471367cc4986acd11bfa544a481c7a94555be86802017392df97fcc78f7c8e2a9fe4a1a851adbd5164467da82fca0fea3c7e08b28a4ad18794b265c9b6c5c89613b6d494991e7dc801403a80c2cc08385084d8c34fece1872a8f1e954756b609c52751a38842f9fcf0044561320525c4a4a727070885c262480ad113f991a2586a01b52ca1c50b2d27d012032626132a68e12815aaa06ab408a18868e91144cb0e0e75dce0d08239e7d492a10830e79c337a909991633c3d29829b1e95cf1aa2a1b8e94a14411a02f0c169a4656e12800f4ed968cc2a6f87afe928f64ec19cf1203f2351d330534705561d0948a52aa426a4150899538f0f6460ce3986f2a7e47f61568d99872cb1d313278f3ca8bf32fc48b2fcf226bf6ce9530b2c43b1348120e799d2245249ec90840892a841298b0d598ac8c285ca0680703022092749c48043181735c385831c3456009104c5618b1d1e2afa70ca5ff581b47c42335066008c0cec918143347004ac72015e650355aa84425578c840cf9622722c958854ab58e3a69992cfc5102596e187e2e1ef5fadbeb124b18acc4637277145bf6c691b25aa2fafbe177d23983f9518b6407185049839271e2feadcec9ff2df4414c2000873ce3bfe9b7cd95af205092b900802891e902891e04800a580cc0fbe1de37fe0eabf4979f43e705c208a591243e6024c5c00cba4a7237a987362710415479c31e744010ee7f992a73596211329e511fc082a132886232ea97444e908235860c41894d187a74ca905b05840041678e2070b8055f83c91a3f879bf3f95188afbc7e7e491517c8f065e86628ae47181a6524f84050ecef34f688828c09cb30a226a20a29b738e815916f9ed105103224030e7aca3866cfd93227828c266ce8945114ecc39b328a28c39e709b060c1e2441358b460e9a18a14583816212c0dc072b1d060216188416418828f21860033c49721ac188234c41043a05e205b4f34be291391e5271a89e3f314c55cef501b9a32a552d494ea3f98e4f9a3e81a1a927fa8d613614cb6fe09c642a91c4ac38f72f02b4316ad0962862068802003c4579a001c421c21c44a0819840001080d041108105909082241842088520831b8205b4f842a9f9cc0047e0064ce397f38e38750dca8f155fb88032509fc0e1fa9a40459e469878fa68bbfc347a6ba98aaa139b940319b0a3f05ae2866b5cdabbe72ab99aabefc6cee4643531e999da4a829c55bbb8b57f61501f840c79c938e2b725c0162ce6902089820e08039a798082c11812510e0a304012fe69c7348600024b0a3148135e69c619ef4a18b287cc0e243e903f7a16727f3a1e4830f451e60071b0fe8e201a5078c008f0784a249f4c8275b4f4443f6c0e79c25a831f530a6070bcc39e5a8c1a1261c13fda0ff0e500f557ae8e1210f1ec2f070060f5dbe59e2e1090f3b73922791925f147a7a506732359e8c448f9a5a9aaa78fe91563a147e5028fed9f911a2a7cf447e5cfcc65fd127592bca125bf4c7232cb14549f26b5229d5579a680ef8e9efe8c13e8a3d95a25fa44b52548179fca2f1535f8679ccac214a7e34d3d028af82280e665938a71a201a3aee26a8f2e8b347df13f252d4e64a697104a2279a3aad5254cc948c424f0fea2ffc9020213f0709127aca2bb28b28d4f8645e921ac572e726e1ab52b48bf443b1cca90c85fce8eaf3c850fcc0e71fa96dc80fd42c20aff52a8fcc4e4030eb9c3cb1554343c9f1f354359c86e2fc7822b307446d5439d486e22e827913ed0fa238d545dac1ecbda6a1088260fef1cb57e53103d1530d4923aec81f4791fc532a95a2391c955414503d5191c028401e42ac5a812a0d7005a2428854500a6558c52012226e21ea201e09df288544a8bc108304257207f2c81866fc61d489810e1bd061a54309251d405875b1aa000ce5562ea02c8114a46484c5288a910b45628a888a466089c1ea00eb4919485947a95ca27c523aea8c5660a445a9c5c11118474614c151d4430b06ad285a538cac283d206f407241540591109108624a399ca094031b3bd88043200d60d0f7c767840d03f844f0c6a0e0a56cb886ba1812c2069dce475f3df92e7e55c39c733eb541733036ace69c93a7380936ec2d9b8a0d139856aadc50c5d40273e8af5a4256aaa04cbf6a95281ee6cc1afab42a931f6f69133581f9c71baad0530a2ca50e499d916bc8c93a8b1ae69c299eea49c590ba5222a4e620a83f5063422964eb9f707214c11f6fe873228a42e5074929451f20d1a7156628a2288442a150ad15c84555eb481c813af841a20f0fa5000d8dd9d321c7d3879d30ec74d9680e16e100a444f57d24e5a24ac98fdf2896b4cc477f9be0700239e692e7b9e8b36487871963ad628d3a64eb9f9447efd3fa2764eb9f883ea20fe7999223fab4fe09ff32ef0f5cb176c80777b8fa3cd20695e45579ec9ce7d677248e2b9225aa5aa118e62fc35795fb73f831a35a47e2b822c70f51e3971f4a258e5dabc10a723cf124fb8bb41a7ac62f3f0e361532277ea4448553b94095271ba022f4a48a2771cc39e19873be31e774838d392709d6983e84d14282f9499aa3b072e883ab261dc860ca1f73cefd5352f55206a052bdb3f4386615e5ff24ddf5d292ccdff841740a1be59413e69c239852448a14211ba0f81f7d7d4a01f3377e99a144b9d93fa5249f9f84e829e5006a853ae074e2c101a7130f2dd6127a03c5a489074a43261453af4c6196a768a8690e4da592a2a3484d2b9aaaa9399d68a88906a392a2af572d1a8e700ad43a8f621ffa7efc22912471846e549bcacd91b8e484e45522894449287e600b49298648c82fe7795695e54af5475995a26156b540308f226d819ba6864855cacb31f137859952a03d8028500222814ef8f9f2a3c54f2efd98ca2033030d6ac10c49cc508520500aea409011a5a05390014a51ae8862c39c93cfd20c81cc399fccd20c5408ddc440688c501de0973c7cd2278c8f133e5a7c6e7c5a80c2c69c738250aacc39271413149a39e7c4f82ac2a9a1b9516d2a3d3db947a80c3fa8c79b73f2efe9b93d574f0b13d43994f2230bfc72131e7e10ff07750ea59cb80e556219660f0885ea2935c0014f8e6c54fbc8c6e6033bea8b4295c8c33ca266214a4c93e40229842e0a1989209862424f5f7ea46813f26f7faca191557222e4c4033c29949ca88027f360c1a3464f02ce70b293801238319512c082134a241071120209284c0f6c64a01845425779a33828d2175ea03534abbc4f1d7c72aba7cba614c5d1e6bfb14cc1480db3d404cb0c53850fc513eb94241479c6a1a14c73098aa22e3f1b6fe8f394643a8a9d9e34ab699b18523245c39c593a8846a5e935ede2935f36a224985b618eb83f550e5b5c6767ce0946870273823a57904c782831e1f228ed0cb1c3e98c9973aa51b355163581a2a84b4cc2984d88cc39d3f8a0c68453b3526d2a3c373a261d05e888a0e3c19241fe5862c7122e4bb42c0997545922b444a789376666965c4b689690304b62c8e4b431e79c395e88440a45878a6a5381a2438564b1f4478639b48463c5a652c2c963ce59861f04830879090c0cc84b6050020315f0cb4d6048c1d033a3c0c962044e0f6509c74be108f5e0dce0dc0b8706878a23073f929e9eb58348b10c3e3c3e517268b81953642c0216f98a78a8223310a940114d0464482328609210d0c1098a0e154a7e56aa50fe41d1a142bbf863e55225977583952a5425ee9225720e280195883127ff508a123f940862c59cb3a7a464923ca4983442e9a9a624c78ff51c146954140a3de95c664e1e91819ebaf84459c54791869fced4480c89c8fc51e8a955aed0e46a24b98276838228fff279774b974ce972e096734e342e0be86a41419dd09cf38c8e35e73443ef745ccc39cbc021cc39c9e8c1db9cf30b4992b7e7dedcebd25c122e00ee1c848f59124386a38383034c17b324860c17c5162366490c198e076ec579258eca2c892153e276b8bbc3635a511204730d0d3f8fcc5e86424f35b9cc5c2c297964955534949e5229dad2ab557ecf741241fa3aa46528ee14c9ca21956295e477f1bf7791869f8afcc2eced57ed3c965ff481db869222b8bf92fcc8fdad72e8a9243f90a67070846ec854b9bf88e61a1ababf9558d2bcca50f6afc8146659a9b286863e09e626f4944aad5a5e4949ce1ac56b67ced9e5c9ec0131b9c2b8fa83ab6f14bade987362815929a210af2bcc39ab107bc843e69e92fd2c024a981925ac0225ac2bd53dea9752359a738e414d4234fb5b8942560a6b823927178fcc4e3016bae1a3b83fcacdfe29f69039a7184237fd275332a7171af71a57b3fbbdebb8dd4a8c7170a4dc8865c8d31a85302e5f207171375e6de6baabbdb398dd1ec69ce72daca6695cd52ae7b2e776eb3c8c1de0801f59a4086e1e78c0b8e8e33b242dfed2ddcd9aeddbe5f26bdb655faddbaedb18d66177e3d5c31864a93852163bf3ad75d6f9a6b1eeb1cdc318c4b80c3f2943df128c31090b5e6fae1db765aedb19b31daaa5512d708531c657ec8de94ec3b8dd5d1a677b178a18df3480640597358b5dbbd6bc2f9208eeb657be59d5d77255d71e82efd77ddbf9765d1897e97df44ec637127b2ca90a4d773a6759d66ebdba2e6f0fe326242e98c6eac6eafdad5e6c5feb614cae54a387310a04df08e35a8431896a00898a9ed5ede6dbf5b51ca63336c5def2aed7d576c679efb84d882445c5b4c6b8be58e632cfac0f298a2bdb5d6f5dde57cdbf5d1d10090a2edb37b359b6ed0eab977b120876bd19a6b1ad3fc3387e691e467ac276ace36eb59abdbc7355b3c0be919cb8ecfdde3b4e5b9b653ccbbc8cf4019e693ddbfa394eebef397b18f307751e127b301e127b56a20fc643227873491ec8364dd3bd5bae39cf1c9731162235b16916abdbbefdba5c567946da725d4e777f2defacceb2da3d8c7170784c4237e3d864ff2a08e39b4dea00c76bbf99671bbf367beb46e240de39f3bbb9cbdaae7195637c5385c4c4b675767b2df38c77cb73d7c2edd577ddb89e73b7b3de40962f866599fdeb62bce7bdc456335b3bec5edb2bd734ad84d661fd725bd7affdee9bb3bcdeb7db6ab36bb5aaf74da267d75afe5c7779d65dbe84409206f4c56f8669badbae72f76e1ec6e183283144e59032703bec66d9e52cf759fd9e5118e38cef91d949c80485310f240cf42cdbec6efd358e7798967918871904aa2424b2acd33adf2aef3a6b312ecb18df10912e906bc735dbb3ed9dd61d678fc8f8dbdc3dc6d5afdabd320f6322921159b5f7ea1d9665b5d39add46240b6897fb8cbbeee517b6e56e2be239edba5bf658b61bbb36f73026c27675abddad7ff3d5f7d2b0642d635bbb2eadf9c6f50ef330e6813444d7dbe6daed97e6aeaede2f4915c8349df9bd765779be9e3f49018d693777ce79f67bfbcc85d0f2ebdae5cdfeb55cef2e888d699f691a56f765f3d6ef614c9280e0b4ee7e77d5d73dbbb7731ec62cd20434ec72da56b39a9f5f9ade1ec623e9072cdbd7d62a87e5ee2bd7bd87f147920066b7f61d7fcb7dc7b6ac3d8c4911c8b6ccf1ca716edbadbbb2ed610c81dd65d9767f5fddd9ad755a45bac2f5da3b6d672efb4bbbdde5615c8aa20f57b6d95bf3775d37dd33f730ee0f78abd9bcbdbef9eaecf5e6613ce400fddc725db7bc771a7b4d0ff580f59c9febdacdb06d775725390f1b976d4d776c6776d3fd390f639e7fc4f877c0366e5f2ce7deadd675edf230f6c8ecfd8812ba79506721a31c0563a33ce2b4b07d6dae6339bbaacd59ab47f9e26cbf5bab5a866d5ad7373918554c67fb6e8dbbeec66f86b36998931d146a6314abe8b9c7fe79d66cde5dd79b752bf7bb631ad7dab65ce7b277ddf6bb61fd6299bdbac318632132d336dd5d5ff3d52dc6bb20d314d3939b5586b2ca2a8cb7f1fe95655def19cb72f759eb90715acbdf5d9da6e9bdb1cec3986775b3d757d7af7feebbba39b16ab9bb30abfbcdb8abb9cbc3b88b28b2fcf258a25664165afb1ad65d17562bbff6660f638cf77351e7b9e88331c69a77aa8a6559c6615bc7312cabdc0f0101d6cedf6615cb7c67d985711ec6262737fda32cd9d11ce591d963f224f928d210449767fdeeddd56eb9d5b8f670709c383105dd2cf96f14c21863146a45de18e5d0755ba65d17e7f8c575cef5cb7b57bdef75b39ad9afde5f99eef4f5b5efbf3a860de98e5fd9bdba4d7bccea9be1f49ab7ad5cb6dd6e3fcbb8adb7e6d8f3dcbfab50e1832d1c2b4237f8f0dcf3bedcae98dd3aabba97e44dddb6f39d69ba6a4ceb8cdb300f63b10c3f54b6b1504f8e7955f57637ec75975dae77d7f6dbc318e3f283b86cf5d6b8bf1c76b3bfb0cd3db862097529edd2d9c6b7bddd9ae5eee2a80cb37977bcbb7ff1d77ec36177f55e4ccbd796616f7bf7ac6cb55fdb96377665dcf5dbf54e55eece78775d9ceedc72dcce37642cdfcc72da6ff9abadd7c39883ff758c83b00d9cef9cb3aab7965f5fbdcbe11908e3a01a38adbbfd661a777de62edd51d1b6ab5f8d6f9d7197a659ed4403ff5b39cb65ec5e5963bf9d4cb19aed9cb3d77297aefd7a8c41f037132916b339bbecc6bb6ab9ccd99b1da1edb2bf69d9d66e6fdccdfc0ab256f78af5e798cdb0efac87318a8bc25dcc66d7c5b25d6db6377b61069dabb6edad5e4dbbb2cbe5005deed42f6e5f3afbfbdca55dd9eff091432cfd3d3f1bc673c5f2b6ebc5be66cc43911fc69d4fe6327e695a66f7bfd69bf530c6f855efadf23884b10c5036ded9ad39cff5332d77d70dd6a37f6f9cb3fb6a8c5f7bb921967e9c23ce73f343618e82f14d039e68ba66db79cffa6675bf66e4066b40ddf4b6d56a3b5beb67b9e3e9b82e6f7dab5dbddbeed67a189b9c546c63b5d376e71bb6611ae7611c3e883a7a8e3a7a1ec220436733d7b99c7576ebb4b69787b14e139e5d7e651796edde757b590f63308f439f571a930de334ce2fae5f2defdc330f63fea17ed52a31c669853918b7c25c77ee6f58d7b7acbb5eb3ab621ec63838389775337ec973a38331ff6f256ebcca3c633c7ef919b941851f6a258e1ce3b15c893a3cfc8c4216aab404dbfaebacc336cd6eb6671b0b55aa7a921c5dafe5f2beddde3a7be9ed8918ff0e7fc22618634caec42e86ed2f8b5dfb314dc3360ccb7a17513930703ae72ebb1a875d1de3f7e2588debdb69ee3bbd33dbd9bc70b5befc5e8dd330dbf5f51e0e6659ad0caec86f075ca9be1b8c57aa0f63152bf4b9f9ab699af7bffa67f579c518e3fd45384a6ebfb2acafe7f9b7ad9df370ceb45633a76bd6f56bdbb887f198bdada4d3bbea2be3baab31beb76e3d8cc79244e1d04069a0254b65e4065f9d75cefecab8c5eefdef1ec6a8f1c465566bbdc3b8b51bffbdb3873189dab62ce337e334a669d6560ed33c8c59d0fe3996334de31aa675d7b58731c6a5aa63cc808c3f87617673d5da9bb5e61ec6ff636762eb953776b3abfbdf17a67115c624aa24450f158e32607d5fcd6b77bbda6d59efeb616c248e43a77a69b9bbb8c66f765deeda9887310f334ae418638c936332ca517c2ece75f56258efb2f6b66b9887f1178ee2ae49c2755bdbf7c2367b65b6dacec3188571765289a207365dbd2eee66995f4c3f965d1ec6185b934a145143230ae5810ba8511cc74791ac1185320149fda207514759b5801a4a73a40423471850420b26b08064051354488196b080135240d1a070820214b0820925ac40422f5928240001480e906d2818e048342a47a005b85845614f94418d1a0a3f8fcc1e2d59d42502798400a5280e80e71f6904600aa1fca1232090483eb802e04145a95200006a14cb7c420715758403ac48458d0c20c2cdd09058981e00c1811c81905e95c3221cc871480b04d026f9ad7208a409cc09c25483cc0f3973a8f3ad730a8583952a37d85003151aa648110a8a3203d0cf085b66490c991c418620f033f30308538d3eaee4900a21c7536b2cc34fc2041023bc72f59c6272fc8af2a60117404000449b738e23939448533534ab3c1a852c8c3998e3b918d63185141cdc3820ac6232bd80f302ad39e21f4dd9bf0747197fcafe3d94521a56e1811ef10ff543fc51443b8f25074bf0c7442fe07090830b280e8a450279e186860fa2cafe20cae8c32265cc600c10443a303b48a324397de105bac7223c4d2e8af33f965a023508f1e8e400e5e8d01b7ac43f1fa8cd0bf4f443fc756a68c8f184ba8a92ec919c11f2e3ca9cf333221209464956f8a9582acdff1bcb0e9674b0a4080104610408203c30c51244e4787a2e86733e69009919e624820314110cc7e8c3ed546df6178160569185cc395fc02305527e628042268a393590a58f10e69c3e1840a274040ed12780d49c4e1ed4fa0b5fe0a3cb9c9986e14795609401347cf0a22fa840c307e79c96a4913292c53846aa6548172909e9844712243626920b486af0405243433a6284012dacc0c20a7828400515e80252c06304120a7804600127904c9877dc8054421952026a80003f4807b8a30f03941961ce390b304b77ac4084320310c01d728430e7077780018114000feed802001d90382072470866e6cc1d4dcc3989cc3224d22177642973833bae90a621b3cc2cc40693903b7418640a3203993598734e40ee2092b2a3da5474549bca4ab5a994474cf2c8cac9232b27482787ec21cfea039be844a1c10c6430e7fc63ce19033f6030e72c4266ce49d2df0ba20c5680441f734e52141e9002680430c070734e120c17b8e1c7080a30e165ce491ae2050ba81939b8a162ce39d3c304863d863832842073ce990358000e3f92c8e2458e3927074b64601052187c8318e69c243d6a70440f6592580137e724b281140094f04890031e734e52188da15185081d5230e79c739252e0042905b894822d054fe69c4c5c78411f2e20c7932aff58925062a0a1086a96c8e9eb3cb272e82836093fa2513432225964183e29d6404fe49857ab4cb938ae281224d9e897d01369870050d0c50614cc39271f63e098253164eaf80243f943df0ead239b7362018aa2ae23cf395b608d449f3a4c75d411421d454e708217f05186af12a1602c642486a9f2495428a6e8f8a927ca25c6fcdb49d12ed2b05435249853e507853f299a1bca023da5522996f815fd9be6a4030e3a3c3a14508709466082a392099688212326cc090e708202cc39a7982a62764a404a80883d68506492e34974630c690673ce14e69ce1600e8f629a650e048429338fde869c5a8e1062aae0813d0609e6afc401ba69e9307cca2727a04505281b390e91a38f39c2942d6041490ed34a954bf2559fd0b5ca25a9facad328528cacf95154d1d056984130eb187d176af1e75fd16b5a1e097f87fc47f439b5b2d1f85c0c4d6436caa127ee461637c8702390ec8d2b6f8081c3003d70180147a4b87aae0691252e8c67dce6dd5faff1ef542c52b348d450586612635287881257bdb28bdb755f99f6bb5b8f0a912cbfb5ac7377ed6bcbf7c69887df93d6f8ac194c26a01b159124aeaccbbabd34d77bbed7de1ec638435f27c32712496310d1c0d669afaf2cdbf676698f690fe3fe23aac4c15962cab92931aec1aae962f2e08a254473e303910c74bada8cdbb2cd6afd5be71ec63a3cc638373410c1c00b4490b8b8e6aee67ac3fee2b2ec2fc075f6dabc65b5eb9a96afee887c3f575dafaab59e712eab41c488caddddb15defee755f597b18e3984ad3f8de2e3314d30d0a6312182216e857be3a77bfdbbadb7aef3c8c319e42a4886af7e5eea5659a779bb671abac42ad32942a4488b8f2d535a66dfe9ae534d7b1e89b395e35deb74ceb55db86d03a8cb3cfafd6ee966d592752814ce3aeab717de3aae6bb3f110a6c8f75f76a57dfb8ee32fd4484e030feb7fbabb3d8db7a9f4810f96e9ab397ee1ecbb7679508105dbfb08e67b5ab1bb3dd4fa072355fbb71ddb98c5d5723f2c35ffc6d766dc736966d6c1391c0b575cbbbcd74e7396fd8261281aeef7dcd79be7e6f9bd34420b069aef78e7b6e77b6319b11b972f9f57dd32c577756b94c1f92558e65f65ef6affd5bd537e8ba9c713d77afd9cff6d286dc4deb4eebf9cad9db5a7399cf17d71ac6b3da79eecf1572715ceb5cb57ebb31ede26c50b74b67f9b2f5ea2ac7b78d108def2ddbd866b9cdb2e7bec9cc20fd66b6da8be7fc9dbbdb2648d665cd3bceafec3566bb2c90ab6edb77d7f38edbb6acdb1a60cff356abceaeed5bc52c2099f75bb9deb0ab755ab7311a64fef96e1c67f5dbbb2f3683ad6e4d7717ef5add9da572a3332303bdf7b559c72dc7b38a6d7f5cdb7bb79a5b6ef5c66d0cacae376fd86fdfffde0bf3637397666fdedbd6edec7218f0abeb6c675bcb34777326d35db5d36c66b9766fbf6e7dc1c53bccf25cffea7acbbb8fcdb7ac7276bf9661fdb9b2a551656b89e966fcb27c195ae54ac524fc71c08c0b6e772fdb751da6f995b59bf9c8ee57abf16d777c6becb51a665ac0691dc62bc7adedaca63b0b6a97d9edab76b36eb3d7f62366f6d07fb5ceb0dbfbde1ad661a69b71468fae750eeb7cab57df7a2b469a6266051bb7e9ac6e58cd3a7db72dc41827c708ce1223373a3001f3578e19e8674605db629aedfa6f7b5d5899317e61260fecea5b6f766bbbf72d77ddc338fc86be51fcb96972a3da546e54336338ce72dde534cc5eff5b773cb656b1efead6da8561d8bea3cb59bf38dbed75b3cd980f559282dcafcae52ce32ead6d8ecb56846eb871326307b72facd3b0e7dbc52f8ee33a3328f8da75c76dcbe9eff65e5d1d9fe5ae396d2bdff6adcf9de0b57b2dc79f6b5a63da6f74681db7dda5ed956d6f37ae99206399d67aefb2eb666ef34c0cb7d87f976db5bfceea55e7b8fc6ebe7bf79bdb3bef301b866dbb621aa66d666df625b05aa69deab55afbfad976759add9d87318e6a53a161468ecddaba33fd57d5f296711f47bf966f2ee74cd3fad255c391bfe64eefadea8addaed9516c32f386962f0ce39a77d56ebfe5cb8dcc7577777be3f4a555eeb3362e2ed3309e6d5acddbf2ddd9b0366bde6d7a63d8dd7ad74990b7cc65bddb5c638fbdd6ad61add619d71df67c04d8962fd6ebe6ea56ff621d8cdeae2c5ff5e26ab7e58c776a68ed5fbbbfb9ecf68bb33a0d8d7597deb57b6dbb3ee3191a3bcb966737d33a4e3fbfd9199b9669a7cc5fcb9a9671daee5d773b8f67c60cedd25876b1dcb9ac3ee7196ba60c2ebbf6dbabed8a65956b8c0cbeb1ecbaff395fd9be38ec0ba665dae9bbbe7a776f354dabfcca1ec6384b66c6e89abe9a6f5d775ab775dec4c85d7759ab599db5edb3acdfa836953e1306d769d9d5f663b9db2ecd552fb66bbbbbead6699b63f57293909319302e6efb9a77b76999ef8edf2fba6ce34e5166bcd8b87bed75e50db3553fe75ddc9bb5e5fde65a2dbfb583c00c17fa5e9ef7d669ddd5d7ae58b66dc1ed6ab3ce76d716d3d76f5ed08c161ca76535e374dff8555feb2efc39a65dddf5da5f57d6340f631c283359542db39c66b99c65bbdb6c491598c18257eeb3e638e7aeeb5ebc5e9165ec56ceddcab57b3b8d68c68addaf4bdf6e6b76657db16b7f116a4604dd953b766917c6f7d5b9be552a9e107477671a7bcd6b67b3ba2f0f0582ac3e147ead1d3c66aad0b25aafc63a8e630dc84186192e596397b517bb1cb7f19cc912a5da47373c3354dcedea1abbfa73f63cd39c8753b3c4944333fe60bc52ed7267660a6ec3b07bf3b67597f35b67a4e03acdb9cc71fcf29bb36667a2d0aff5edf6beeca6af6d633350bcb5af9fabd7cd3267b93a03028e6558df3ccbb6c6b66df399273aae6fdf3e63d9c661fb6e334e5caeffaff659ad99bebee3e1f83cbf07c3cc07b0dee92bd36ecf5cb7eb96a1765e912b329bf1c0d57b6f1de3dbaddd72fd9a6962cb5a56b3caf18befab3f11ea7938f8793a38335bb6fb588775d8a5bdee34def5cc74206795e70bbb1de357d6751ea3cc70e0bab2ae69ecaadd757956779519267acd5b6b9ba6efbe57db382dd763d9657957b3e595ab1b87990d7059bfc66d4cdb6c73f96d19e69da744995922735cd65d6fb9cc5dd9e69b87c91b6694e072b6b17d6f875d1a86719987314a27cbed9bc6fd96b52bdb97f63a9c49a2fb2ef7bb6d1d86fd563bf77a36919898d100573badcb38fd5d6633aded0c68ed6ad66ad8b6bd66d77e7106039ccbb4abe32edd33ac62f9e2994182b35bc5b0aff772f5da6ae7614c8ae0d0cc05b0bcbbdd39be3ddfb06b65e6886e2fad2d56b7c6fbc5bbebc6082edfbe7bcd1ce7d6de2e5b40dbb6cf56cb328cdb6b6f1b5984bd19e7ead63be7b2fe1a6688e0dd767135dbb82cebd6d60ccbc5d9e7b64e7339eb2e0e631c8ccbcf334364faebb5f18debd6cbb9d93f0504b32a489ba9c0c62fad6dcd5e4dbfd62e6a354301cbb3b5dd6e5aa76ddbed9a10f9b9ef6ce5d9d66b6bad5ef9414d6682d8b0fdf7e25edbb7e6bf1b88cab7ae7ecdb9dbcb619cf6428c573313e057a6e9da6d7eafee39cd7a2b71dcc178258e3ccffc9065babb1caf9faffe5a778f45a236ce8722a883f18722b8c319095cdd766e5b7bbfe332cee5086019c7b77b69fd723de3384bd580190870ddcd326db3dc3b5bb9ac6598b992695e77bd5fffebcd5a33211db23567ed55f9a57bbfdd867918e38865c883f10ea41b747ee97b697cabbc661ad779283087e3cfaf5a42a42f4886d8cabb0cbb57c59edb0ec3ca5c9ce5ffbb5ffc6a75bb5c2117b6afddb6f6f52fc6b5b641cf59b7f9a5390cbb3cdf4dc8bdb7eb4e5fab6dd75edb1ec46e5cdfd7c659dee95db1ea615c863fe6558a24c8ee18bfba9a39cf98d5577bd8065220bbf34cc332ae33ad66ae5e1ec61cfcbc8d42fdd0f82a4eaa81cd59b5b9c3f87eec6adde6610ce62f491411c8d218e34c313db9298fbe0c459da1f0bb810448bf5d766d98cd6ecfb8c6ba87711111aae707513838539ee0f4fc3d534c4f4c250b0ac6e3138d59d53fca73d1c709c6cfc510e399294834c8f6339d658cbb5b66333d032c6b6e379bb1eddaba3d9741cd328d6b5c7777df1dc3ec1f5add7dd37abeafb37b6b27032906fbda9bee58b5f966d86f9947f2a35e5ac66bbedef2ca69db0f0906db76b7bb2ed7ddaeeb74bd188337412432f5725d676fcdd6d6bbf7bfa056adfbef30ed6659eb5efbc8195639efb4ceb3e7d6660fe3f0d32a7163dc2a3f17d45e3beceab56e3bd3df2f3eeace9d5fbc5fae697b67ba05fdf6dff667ab69ddbeee58d06d19ef9bbb17c6f1ab5dbd47a7594edb18c7b9ab562cbba41e97f7fd7a5fcd698ef1ba828cd5af9bdb3886e98dbb3215e47e6d7a6719b72bc6f5aed321e5a1b52c77fbd25acdeebdd81e63b9bedbceb4ac6f0ddb355b42c2e3ebce304dcbb5db5bbf32ec8e9c79b76d2eeb9996026c739cd636bed5bdfde62e3b78b7bbaef76bf7bad96bab28d0db5f5a6ffdfaaee378d63c8cebb8f6671ddb57ef35cbac764fc0b32dff95bbaf9d736daf11121dbfd5ac6ff5e69bafae3d2199e0b5ee7297a66dda86dd8cdb1ec6b7972c31776fd8b6bbcb694de376bf8731698e6cdbaaed8559aeb5fc9af530fec6328cadb956ad62bdeb34c6f95682cde6ec5ed96e5bd796ab4f92a36ef6ea1ddf5dc73bcf2e5e43737391e2d076cbdf59ddb96cf39e2f0f63121c79ab3657be3d76afdf2e56496ff02be35b6b755f75ff7fe6610c821f911bf7ca7cf3d73aae73fe8c23dbd8bae7362c6f8ccb99b61dc606b79db5bccbb4fe3ce7ad9140ebe79bd6edae7539f7eda590d6d8b4aeabb6de4efbdcb9d54670b52c734dd79dafbe2eec83486078bf340dbbfde2576bbfb71a486ae44dc372be9ff5b51bcb3a0a298d8bd9cddece76cc76d80391d0c8bf6befb0ee7a7bb1da6d67641cc7ae2e7bae63f6c278e661ec4332e3efd79c2fac76f56fdeaa8731a98cbb6d1777f1ebb2db5aadd31ec63390c8e87297f12cdb4bcbb6b5fb7a188be5aa35ee1ed217cdd99bf3952feeeabf9d8ff15bdfd975f1acdf5eab330fe3af77213a8a9da74913953836c118a38c4862e42de3bac631ec6bb6bbef61689ddbca6daedb3e5fcb71640ec9cb65afae5dce310ed376b77130ead70beb2aa777bd9bbed7c31885714fce929f1e1930fe95b8498c57e412d21716bbf9aa7f6597f3ab77174ed1b783f1c5aa148c6f9ee445c6b656b9def6b75a7986756103a4b6a894d1e78935ca32640c10004048090a8311003038241c90c72312b968d0ed5100148004549a528c46561909c3e228444194310619630c20c400316666a6881a0044d7f783e2adef2cda98ebb46e119a24d51197d9d81224cb0815bdc861e4ba240d3417f00e5c0fee69860fb6812b7b3ec6c5700deca5d96dbf0e6e1a1d1280630e3120e6099b7107deb0dada929938cf0cc1f452f8aa3b41af82525438002bf1bff77c3c0bcc177b0159d7292d7f8cff3690760a3b4edefdf290cff88f977da1e204080fb0eefbc2e937ac20245fe75bf0ac987a949e5c6e5e1891541d9cd3daf0deb4cb5885a4378de8011e0403e366f95aafe6e6514e5ff8b2e77db636d11924596a2988f3a3633b87e7e035d02f917da5c43ecdfd2569ac9d8a83ce171acf07ea16599f782b831e6245e254997d6faa24c39db1d4fb59ee75ade92d2de871f31be556b6337b507f2829f6b3a2e75ad62bada9e790398aadd940eb65b2d13b32e85999e93519f4a6ccf53219d391268f1db6a469f565e8b5b2e96d32f44e99f56632e83dc0925bcf04ef092145490094b45bbb9eb5ad5e83456fd24c2fb341efc05ccfd20652d363c945b1b8613374652709050200ef19a9991d5cc31a8f1b4b139d18bf5981f9754990e86792364094415bb76d1a1c4d5cd1e00e3612a24954af3528f23376a235b6fe10121dc362dc42559383f5659b30ac60af61d3979a94e9b48f8208eade7496ab80a44c5f8661272ec0f4c22179fb7b51cbaf4667e8b12a98cda45e3fd66eb3ebde497d5d4d4b9cf430958f20d9a002f858992f064bae619e7f1c7e444ff6bcfdc99b1c536de70632db0513f7f865153e6753a8850c6fc74c0b9c9416fae42dd11ee8a400e290f6edd665a2462b163a8894db5a743d9ab55b863f53ec2713f939e2c8b312f2d7017be028f0ffa1a6fdc65acad45e23d1c0b89bab70e06ad032dfca82a5ac55a33f2df05dc5dd8956056b2233910ec4f55edea0e1d7cf11f3618dd81b70955bca61dfef803a445443ccaa0d777d130e563c8cfdc59ab88a52891783be5c524a6a94ea2a77a6eca7bb51d490847e5a075eb8199c9a1b97fc696433bbd914c6cfffefca94cbf46ab9af2d145440e757dc4037850e9c175b07e482348a48479488dd13a22341cc1f6c2947a21b90e4a1848c20b27ae68b8794fba7bf2e36ab97167c50570349e076be6c60254a3601b8f31cfca32d9c60490aad4381bedd30e873cbfdac10df472cfc682ceb96505237d44e6c09f662e25ca5149f0d7f9ebb8025249ed2a058a399c411f375738a8e30623c4b29097dc74a63333881d9dfc2f25fdb6675ebdd64a0403fe70da12cc28e8d00a84083c9660f79a6a205a7c3d055ba86e56a21cfd563e4dce980db3776aa8a61a0c42aa13dd33f98d82ef1ad94438f934144e35f650194e5007c825c877ba2ea0c8ed7d6ab9f6b32961335bc0eb721c40efe0af18c4673e5a9a520bb2e029b57821f0bb2decd22e56745e51f5bc20f3bf99d4d35ae4de0e89127e5b63769f63a369ddec71a96c44d972982226d2184f68cfc6f8fe0da38a80e61eefa76cd7ad011be828a9eb7037e91d243539b94e79c26b400db20c437bbe02eb1f0f06f92451b016796089487b9a6aad5a086f20bab4ec261f0079ca0eb9f74266644ae5d79b795df3c1ec46eedc539c22724f5a63a70e610745974dc9c4fe28fe40407ac1b33789b698c7bb8d82bcbf7bd70c1d897817cc3d666f20a634b564c6ad856f255fcd9abfb8465bbf900ee1eedc0ed135a8a746a7fe8e6a4f70f8e71432350b98fb9c62b921635ac3a11aea2154c04f8770484771d2bb2744febe46495221933399f3f66a232a674c06aa4f07a8ede38e102eee27abbaea9884bf918f3c3bf3f2982fcb73b909e22f9baa26371ee85d3b540b3040b8cd226170176014da778d9bface1f309b4298558713216b6d370f21f8537b29cd76457feac0044c5a903aa33750f4ec27575d32b3ecadc77194f158f0a99782b3e87cf6a2dc7fbb2048f9a23d5eb87c267d83f127bad7b50298d3aba7bf84abab10ffa3127b675706baad19ba886ade51ffff4bf20c1bc56f81f59193aaa6a7df19053d6060570a021a4f721e38bc98e993f1eb0f7f89a1dca24341d74f00800cc35e6b3a16b6428895739e0ec7c3632a9f38523ad88e5032b4460736773705f36eb5831576613641efb346a403983644d03506929385993c55fbbb3fc00af9a5d64d34fab6e75547f809771ac6d9907ce75d1034722db2c5b3950d32997ec901c1cfb8ca622c4e558c857c1af4dd136b8ac5ab36c0eda6de0d1b8d31e228d3de08ad5031be94562d349dbd313ec7cd40a5c379f89bab93ffb8cc754e3abcf1fa49680e882a9407d3255b199a1ba4c24cd8285e92a0477b8a33ea6dd288c0cfac58b1d4c8c12fdcea836b136ee89eb3d5bd05985ea0feeef1cca7a15391732e9deb668fef59186e0612c6569c94b0c29bd68fc6d11689e4a444218801342bdb3f0a1642ab509b7945c90f975fc53a0e3e11e241de21252c21c0dcf1a42df9514e80ebf4fd247cdd4dd6200f4944cedff6c71cb8a76ac600f46574d5d8e128b39e022e17fadb43c38d3bca54f958f80c225b8ab19558ca8f96f12f9b22226d6a8fa59da829b70831c730939eba69a9597f6f2369bda1c03b5585f321647960c1de8da488d64194d0371ec81f15d90984c2ba4b5f048d4d5811d771103b212d3a3e20a9650e143830f58a04c277a31ca941e1418d3c01f98a681f369a92ad8adbb7c2d16926f15cbea905daab98d9de829b51dfe3cd5457aad8207ea23fc27c620d74158513c5163f2a157da87d68a14630ef42a27be5180f8f9650151c4a2218e37e84555c3adef30ff0fbb5696d20b90f5d6413e9f12030f8dcc803a1034293745db0bcac005df29f1e26cae039cbd420d3c248ba93233ae077c0c4acbab811f9658d642bbb909eb80192d9724102af7575c7db2afb3ec04b78c0b78141a2439877a9ab5a4b4dbd638573e4f22a5619396dfdd0db256eb2caf5db6c438c96f915a17f33300a8dbd66aa3f9a0ac25f76c729cf1cf58752a48d88e68f0e69b16d89bbd5ddd7f30abb7aedd45bed09ee3b16817acb037d1ec8dd0e42bb9cbcd7ec8552abebd02b5605fb1145e9433d714ba205332192f462238ed1de5a5306091366e035353018d56634900666968ae32e142c3b9471cc7b542ffdc2692b7f163999a65ccdaaa67eb4769a38f71b2ee5058b087ba2b52d48b9b10525aac49cebaa93582c8245cfaa288513b0c56db41b02fe8366068543796e6e4d84be8aa84e0bcca1e64d101e26e765055af7b81af521c21a151fae718a7addb6e90c3d9f69af19510df3c5d5cc3e278f319ca285368eff45a7ddb6915068df93f65ebebf65b700fe29b035e6e76326a60e5c1d7526641efabb22960f78b39cd3d5569f1747bc64e50695f99403a4fa5ed3af965ee553207a2f048e9459fd1f6a0438b08a676ebe903e6b73348ad8b73c635d81736b423899c1eb7492175b66a732be52f2a0c1b08c15d0c84befa3d52b989540698be5f5792f99864fa2ff8e759c844bc6be1d6e29ea3d0283e4842896c9898ae0a670d622a2575fadc082516b4c48bafa42ad64ab1ea9eb2c4f2b20d151f3f78e93b5a0a2f44099b9249e139ab3eee6eb09fd1c6ca3717ea6fcbe11fdc2eab9da3c4c98b6b651242d0d877a81bd52eb8e9b01776ebfb5b9e6e08d8cd12243f7411d27ce576f189c7415f593de38562fce6695ce0c02f094fb51e53942c17e0cc96a670adc9f0aa0350a566f39810e3933a552a542a18dda741f7a351ea589f475fe37bb09156c070108fc781037a4184d703bed0cae715842fc0be8af68e7b6ea6615e9917bdfd5a51429ae77b5c40ca2cffb411fea9ea557453d331e82f1193d0506143100fc06bf9426aa5332a090027bde08da213ec0ae645323b681161e7223297cefc8f8a8d0cc68ab4c367ec3a68c9a0585f43bd868e97e055061f8c3e7b03d784af27856472234454c68d8cc0c78b588288953a76834dc486ff5c53b884e2442af16556f948e2053bed9366966a5780e26b2e999670fa50f10888508343e1bc060b49c75dd961b287c137332d31345beb17face00f927d730e057953b9a1507d194ed87a70a35b8a6147e058e02e0559ef1288327a8eaaf45c568e7cec9aa9724e932ac485d0a952dc54b53d52f28e0505ff40934764edfb47b34c8232ac9e88e2febcff974ac8b4eb97f97ed433c18fc6b70bbf37cb82efa74d56710d43b6ed5c08c0b45fa833b4b7afd059704da0855d2849ad9bf31d07b73916a1692c1ca01ac8618a8411bf5ef030a81f273ab7e01ca84fdc9e917c396b80f12c23149b04238c6d736e02d1af074d097bc3a7373365c2717a709bcf2e9d59fed68aa386d00b89a79c6ee93a39a7ebfae1be25efbda47ae76832a329db8fff4635d16b8877fdbb4311aa33713e54bb91a38746bc0b913d14b77c428e8181b39f091ff93075d837ba1bed6c0e437def9dffe4a6ed64828cbbf53fc66150d5a945c44fdbacb36dae7c87c07c94029fc5f4218a20cd132d5e39019ba92e4930f1b223b80901891167fc8ad43abe10aef5ff7ae7ade1926d87de4c874ad0495fd73ee955fd93669336deb7cbf65ecebe236e09b18917df5030ba635cb201e3320a7b3f59f740fa31f62725c7a0502d08b04994520f9a004fdb4d381238e63619f57aead829e66b47d48eba617c2485f3c00f0aacd1c6873f984a45301af7a07e12f347c571dfdf391e501af3a1d149b0dae83139446fa7907059132d3bec6e681573d2f0cdd38a79a51fc3cb2afcf9a48584b0ab5cb613563e001416f2a6e50340c6861cdbc634d8eccbc61062704e681c140426d7560ac160aaffaec466165f443ce737ce93a8a816e3e54a7076029b7b72e78576f72bca9fa89b20832cae3e5c0166e8fb363ce0daf7adfd8b99ac3abfe8fd83ff0f0aa1f799cf0aa2968a25ba51a14d748babb9d688a83862a23aed5130af81dc1368a81621014e6cc0f8561e33635d8be470be67c50190f8f55c3c0336ae0dbcf0e0c87ab616e97617ceabde27b661f821ee1b95269f9083b2524288102c97827eec50d996ebb13b83d4aec96224976105b6306fcf72538618d98f11c721b08e12f5089c9cc754b8d8d3803e7b3cc57bf782cdf18b8ff2fb5b5d2f4d92f47e6ee3783c9c4de968e50e64aaca726ddaa77e42b2d65ab347c5934441d34475d722078c00f01ef7807b35be8e4fca7d6c56a9fca8837bde7d8b1796cbad43ba8bb6d350f2ee945375f8f3d015f658579fc5170e0481b6a36ac2375a40f606e056c90f29bf93fcbf0cf2615b8042bddd7f67fd77c8d0e4cc8b65470f1a90683c0506aa3db96f37283f461f54ce846a2c341ce3cd946fdf85208f48e2b452ec01731013d635120eae545d9cf0d94c3c17fb20bf1182d7021857d2e58b018060508ac41c17ba3cc7bb2db2fa1abb6d2f19bf7467ef3a9dd99f6ae821bbffbca64d9f118683ecb2ba945927f0a0cf790e927b3d0e7c09d437f5c96383caa1b18c6d506a328438ce0bb916baa06616eb7a1c5a8ede3c2ce4a774c117cadf9d01bcfb88991edbace18f0212ad7aedbfb06fab0546cb760e0b7e7aea1b0476edf25b9be14bb70c1ce6b37cc8727d2e7c93efbe873449d8cbc5118c7465c1752e8d3777a23d55f1fa9f79eb32303ed2febe9f1f5fb8e49991d3190b413d66de94b60a7fcc505ca46b6eb71db78dce20ab7e5ce0f13bc3fda7e6dabb14fc9db4e4a6ccfd9effbe67309d6f3d11a899a7cccec4bdb127508dce48f6a38b03ac779d8f74a73e71b64d8bc7aa0045dce1cdfd12f2f08ded9541cade3b9ebe0d1c3c31a6d6cf1832ddc0d5c30f388cfcf5998d53021628c64e33831f4d19caf19286301385351586e4f21aa319ecc2d247b35d0c8b0b1a54da357eb877f0d07620711e5656963c541ef65600970ca21c07548cfc4caf26ec21e237dbbc14c39e463445f2eb2305052766679048e8f8901ff694f6602987377e4cddf74f62cf4904fe3da275105c9298f4022b3184e31ce37bb22785e057ace38d6dd417b4c461ede4ed0e78c81eadc7048d7866440c28b2d4c79f2109f69e1834419527f1eb2f30598acb2dc840e8f90f527ce963baed5a7134158630ea96ef0ef6834125ed796378d39a6c67a94533e16abfbc9c3b265b27db3ff82e2a511b812048c73d407c4d9f17ae7bcc08c4a8ffeac293f523f84fdf34cf0e6c455da006dc980c707caf428bdc32ff863bf867523b5cfd6e9a7cc051a11d733ac8c8c262860f0ea6cdf1263d88edfc619b1393ab409a0f3b2bbbc476be933881ef323be7d28a3bc804d4339d17991ff50729242e86958201e362d250504a09b9c764b8a2731a499ee8426fb9720136ad1006d41bed45f97b68cae2fe03573d0579948ee8431108aa22203cb19591d50e77973c37771fe172b37f8ce96a9f88f3a7e59f8363f04aceeb6ac21cf6565d78c3fa274cc7b9eacfd0e4c3d63db95c04aa6cbd8b15f13aed15674913cfd74e786cf3ce2f4e996f3f7b936580a3c3860e3b72cb3d962e28c46f2977fdb7f60d08be430a889a9042e4f1de0cbe4772e954b7b39de3b6463f5f8c36c7419125f0533c781427532a77c7d5c21b457ad262e84ddf2062449d2b5a1a65cf24215677d4927f9ea073f3609c8977dc3c2ae220d5277fbf68ecc3bc3a2fc5194321d67c7c3bc8bf0722322e5f8bdb871a2bff27d65f863eb89797de63b5b3b299508e7032f93642e48e30d46b36bd8ce95d4fa2ec8133afe4d611d732de821261c8016e5c00ce0d7cc060dd130bf8358276bace4a90a00ad84f1929e5b7f2114f0dc9dc21831ce2611dd9cb4797d48372d32099c111683086a3d88734dd2c7c8145636639a5fd6fc87c93b55ab5065b46a077b37f18d7eacd14030a4ba5646c9544d1647c2cfdc31ab7de970576c066a9a30dfa45eff8a94a28e5e484328bb5ecd6c8648dab88be8f8ab5d362ed425da39aa094876d3e713557c3e2fcf7e0f21b61d106a39e011dc2ff02fa980a5d6088c40599b132b6ece4e06a22f85897d72cb9386dd4deb102dce99155dc3236f7d99ed27a004c6ed30dcfe6ea60e99e602b5d7bbbd78b3822ecdb1798b24f28cc7f5ba59f14020689c8d13280f8e054b16412ee2461de1982a2c4e4773e0e7bb510db32dd76cebcda11ce6cdf0418276a3e4ce3cf43751f87663d31b6c05042c3d5e3ee1446aedd611aad5af5fe69e877db89af244df09873cf4f70f07f60d9965360ddfcf3d3ee46df3d7b579f53d5bf63ab65400f877460337889a6084543012b912b686c09a6ed5723721b0d039422a845f688577b65b38945bd17b96888eec6b252f165136ae0966e83c1e28fb714a8ca67739f477c7325fed8ffebe1f838328d22c6e3c4e3fe596ad891e915784e42fee61e64aa1b382b1089d0a5e2cbc70369eb821f6904db3026184521de1b03af39dc3469da64c444131bc4dbe1c9003536514d2df11fff58121e803471843c0325c078d086e35dbd3ec368daf9110ecd8ca324f37002304eef7b374eac238617cc98069080683ee9a028c6427871c2197b1cba885996252e804005053fbd5db637c9139e1749c5007eab6c902f627332c6d35cd033c47fa9faad52f8ea79989d7bf38bfa3d7a9a5a6fc5ff3b37ce34e3e47103a142fb91520af7d34cb518aff580f87452b3ac00163cf939eaf521484bcf7cfd6dc178ac96f93ba65f1d644df809f3e80e64545f7102e64c40c941214734cdfbe8794ec003998ecca47cdb5a8b6928fd789586c50f733370fecb3caee77aecc6cbbd11367fbac3c3168f4a4a1e1d87d64dcff8beaef360cbc80053ce0c02fc756e130c8bca11d7f3d00cc0fd107c1f0919babd3c45ab8c4c6d7f2d798805fea8b7486c41b79be7326fbcfe3010de70fe6e3ccf3cf3a87dc41b767da68a40153e0104c93d0e8a4275f92f4fc23e13a2cc3aad142473f1124de68c44fc49e19af20c38c68300ea93f5238f49abd34d1d48a662e378bf638f4a2e189b8e24532a56e92c2b205b7a00c491901c9920316c83022d1b2f650e75a4a209b2d602cd97810a2ec2b15ef60bf5585fa3045d857e99bccb297fa3d971557f1bc2d588fae1ced14b166a849ffd2d111dc2682dd80bc1083a38f788609823200f7ae3507b387da6cecbcf83846f05bd841da8d427e9da613ad3d5a6f14967e9529caacd93b972ca2d7798e0c26cf9847e32d1de7ba4a930b63a675a96ebf86676ecd4ccc673d4a0ec9e259967ea1897ed2f009006cbfd9b2384c622180474161f6dfb118178c8029f33564e44f743c4db3df118658659bd0b15b9ba05afbce03f32f02afa53edf1929cd35c1644dbdc7c6750df69fe5273753f03a2546503dd2381fc49266bbd9afc93e6d00bce7891fb7c632476002333a5326586aecdae3858179774aa43ae83c002d923a30ebefd9108246e77bc6ad1f7207b0b55e53ce05d0d2e7efbc16338feba2e10422ab9f6460103ab2791ba05f2dbfbf886a08d10683c25f9ae9d9e42c6267dfbe2e708a33939bd9efcc08a7767340b7eb13589a59e316224dca60725c0d8c15b73e8331322e9e95ae31d145010b19aea8856343928d1f304dcb15662a70a8521e31f9e85f8243f38a20194dc50a46d583792e2bffa71c63341ca5acbbcb4237e9e68e561c4b18af8ba198505de702f1b3623cc8ec9d79f457b89f5986820acb6d211397430240ff73a794196261a6232e3322b705701d53e0343669ab0505cd614af77fc1507152afb46d11882397f48396a53e07a9d14316d05a1de73dd7b3b00adc30f01cd01c8989c324ecb7a80299185666e5aea887174e58b08d73202ef22c969dc8d1a8106f4b8a0acd1e99857a9d8f77b1df670310408c981e48ddb1408c2d9a26856d94b9f05721607ed733dff3328c478b8f61e49253f8a5afc3ac98827c11bc00cb35a2bf770db2fde4d5c6f24df38aec42671dfb62b413e02176106868398add9a15073c3845d9ad076c54d3d8c9d6b2686c0d71f8c3a1fccb5e39d74372641302919358984e06105616136d99aab76889372c9324b40f9e8219c60e146dc48d594241d0504353610898eb87c30ad808c596bba3f7d3c1003d342245e95da9e7ac1d077baf21d09e00c02dd8a610c08baba63a58d0043c3dd65304c5ae5330826f25eff5a82d1891fb81f1a3db10aec4c9d33fcd0e3313f570736e9bf3e1285c8f76a176edcecb54ef01498f6c6051719120e4b776f6da20c810cc070a4862b9fb5b34dfd0fcd49b83d6170c83ca073a4486111631a9b946a461958c3f080425f269d488ed9d68d60a149443c14d1ba9b5c054ecdcfaa4c503b8c12dd94bfb810b566c90d860652f6dc02441bc4387d60870ca44b9a286d4b99584c2944de7f2545028362d790a5e838a9c91ee9ac58d649d8f948d3411e24db04951338252227c802be598fb082bd745b7fb3d484cae6ae1234e3baf00e0d96642b518e0b628e58ce6dfc6dc2bed1857565acae9d6abab4ef3b281bb93829b2b52a88911b5e9fa60f3ea72c2cde6bc4c3b86bfe66cd17946afe86a5906de5e6661f226934edf704ef536dd6c3dcbc5c2879d633c07e8661c38b7828b0cff7c23469656ad33f0f45d091bdc5fa86cc1f40053ddfee7a434e25dc51b6b07de9facf4448bf768d5f077d569ff33da60ad7b3517bbc87cc0515879a43eaef74dbf4b03ee3c908d0cdedaa42f34443e64ce1b3dc6cb29e753e9d11fd1fa401c0b3ba438fe03f4ba6cd34f23a61bafaaa3afd6649d3ccbe27f1464edc807f4ff952d7dfb462cc69b2bd30dede565b9c0b2650772a6a22787a684992d52bf68fbac672da2be7fc4e9e8cf1c74dc9ba0ce4337affa1324ed7ec62d43e841d7936c6343e2408dca6743699f99d9696618da3f4a66a9d3392a25ccf40090ef92bf61baff651212c9e4483e20cf56ed07574c611a998a6fd896f44382e400bc31f9b0354b0bfc45c93ebac3933f9ecba85d31f146763d0c7969ac3549694a27c964383d83ae57d9933d3e871ce6cf82c04867d6ee78c86fbdfe2288b3f91a1998483fabe378af466c0271b941773fd3384fcbf0beafe12dcdf4e6d81f7b1381ab57bf28d6dd06b8137b90b1ef76e13dbc2f2e8e71d0ba3eefad05630edc17da266cd0192a730a3e610b462e68d9600ccb35cd2111e25dbe8c574d909d297a0845289fa28aee83cb9cf1ac8b99ca241a922f387d693bd1586d29b7db85a1d13f090603bcbad561c477cd038677b9576d499ce0c0e7b33e51b8e64fa92497a57ca17256ff11f3fa626289b8471c994c1436b84ed33191261d8365cd967b2aa89da146ca8e82368c8577b84cc7cae6ec3e23742c599b10bc27022539ebe271eb6cf3058d7f11512b30628107eca551cbd08d84c1bbb56fefa7d5989b96e63f4566835ec34c9bef68eb0f4565d70a69658ea95b8b9b352e8b42e99faf0604397c5b53ab0ac6bf064689f85c63c6d8afd1fb7da0bef04562922fc74e9e35e4250ec7795a042de67c57deb9068b2e5b644bdb1f30bd02bc1886cc673ecc71d1f0d65f0258fa0d97b90fe8cca118e6915659c4c16501eb5f5468361e8b61ac4213eca4e76f750407469f1faa9efc8a66c5d8280f939bec6355ccffab56f5b957785a00fc834fdea02283ebae2bdf3db3d632aaa57ccd07bed7373d9f8dba684b2f320b26eadec383e150c021bfa986ff678ebbfcaef457c487ec5ca88fa530de39a0a9f7a01912393e76682ce4aae89e942d0ca982fd3eefcd7816a1e2b0342ae236929b020b7413f8e1fef8dbb7e37e361c078831310e81f45454bd0560eae95fc70946fbe5773bba720cd965245f9b3eb589e54d4fd4219b4f6a5be5591ad88ee954ad7d4a6254dc6e10c3c1be0619007042cd58112c93331952e960bb4567f8a1836b9d9b89c208779e617884c63e6c1fe43e70a23e08202e98e2fe61de2d29c3af9d6ca8ebcbd5ed533dff0bff019cfd748c8835147a2e0f38b1e8e340da78962455db7f0d4f333fa6e776b7838c9c5bf41c1f3032b7c6ff454fc98c23ec900a25aa5de4c7aff63ff99e732f12e4bf453efb12a03779f7c4fadf209149040e13a3b4bfc8b2f3bf117d7cb6c3263e68ca6492acf1050fdb5cb68c6d7da741d3e5c69d6e32320cc624ad5fa719663780b10c1e3abad0caef31fb745522d927005bc318f2c13f7813d9d2b10a0385bf80e9ae69a261f7de60e3a0cabdd91a3db04eb0fddde4e9ea9db518ceea9f3c1268679cbd66de4b5c4007976b455b56f513fc7064aac9aef8954f4b9bc15bcd3b8934e74d2a627fd471c029eea898386cefec782e69c7fbf1e4c6e3ac4b0a982e8282a4172966fb40209da1c5dc912ffe55dc1220dd6ffd073c6feb8938afaee1b880227ffb6c343f5d0f044ed67bd34fee7a5d0dc10344b2902bc6844e4243012f8d9b4b817ee9c2c33cd88a6c4268348b470d7997557f38fde911c63a4a517920728259c30bc7f08a5b1abc3e47e48955572a73019d83881abcb127e51184bc07ea677c61cc67c1e509b5868f42bc34748d3e097e04372713e705e1e497704ac4b1ee998af02e61662fe03b5531457acad19bd488ffcffefb7e77308927c761b70f6989370ff62eef52fc57a5a308199f3c26393ccc787c56bd36d840a0fcbbdcbb409c9fa1bef9331d6a7cdee9e2bcd1beb307a3fb4d61fd1bc6a1c21f5c7420bb4f0220caecb3e28a77a4673ec61b90e724d28e2274adab4abb776ea29ecbde9da9f420a9673411b26926a4515ea9cdb1499c68ca2e5f22ab495b5887238b88e3822ac7686676add2e9a52bdd41baab84aae0344c8e88e06186987288213e5a728718bd32f8eb4bb93ed167904851cb599003547273d0c82ffb9ea6547f098841a74ecc824d3660ad8c6800db25a4bb15329e2edbc454f8a60a502ed6b5937252e7aefd74e13ec3ca9599ee4efa852e0ced99597eaed17156fbf6d5f799033552ffbddb97bc23a2a3f6815e384013f608697be12e1bc195d161f0c9c6c6ea508c66be116fb418dd3adf510c51c4528d706a52938d43e5271d2f675d659568f2f842f9957f6fd5898f641e52bfd23b17a380f1e56d169eee35f97b98a822a862f01e65af6ebb530c09a22dc6bebb1f81d0173c195cdea8e49655673c284e73bbb2ff457ea4fac86b3117e56eb5f71b776b433e87b4fad7278ec05d39863e89586ce19c0c32839df95f3e83c0a33e6903e4188307ec6ddac8d8bffa522e06620bcda54b86efce6fd967c20362c32c2dc9e4f387fa9386f5e964348040dcbf9823af94c99df30004e39816fad02a6fb9e5e27b6c9f30b7efae6138ee36c60eaf81fef1ff68fecfed3070e9c3bc27d0bedfdf66f5be60d79687635cb87e4d9297ac3fc5d7160ed10ff2853c5632dab320f410aef4a0712fff2f6ae3fb275990fa270c0555f1d36f0ad6b65c8c5ac12078d65c513c406a57b41ad2dc05890724551e55f7c789710d07c0a58b1283ec4162d26ebd3c6735f929d29008243bc79f8487eb9b72712c00e8feededb60d0ef79d411c44d97e12ed895102c8255c732daec3b313d6e0761c56d69538428be6647b14e1485d7d65f279e0d65fe17c70faa0cf9c73fcd0f10a45f589dc2dc79fc6f764a38c608dada5020a1874fa1d3f19b45c9b02ea83e6de4ed3c9d29e99fb16144499a8677646bbd9abcf63154bccef85de94fa9fb2e8d559c1a13ee0b87bd33aa9ccadc8d9dba87e0af2a379600d839f0b6f21d883e3a2f1ec8534bfc69f187349396b90ba98333f1ab0f56c4c9ba1b0790a591f3b6a827e455cb9132e6f25af9c794c76cbe8d0a48f5856898ec434bdcf51947120a682092228134b0d94eb6e4549b845de106fa220ede428d603ae770542a111824dd592f3120f0e9bb0ae8fbed236d2e7c5c0d58bfae66ae90e0b295b618446ac85cad3d3327d73c047dac1c734f8434b8cba188869562666ccdafd6d5bb0861d624c3b04458108b7368354598f106b0278ea8790cc1af5c32a6fa191bb190c1118496e3f2d34c4092295fcc32f629bb607b90fb04e94c37e32e9629addb410f38ad8da6ad655842ebcc368e4d58afb05a0b2ff3001c3587816acc79cd9e5eea8c0fc730f71f8b9765e35eec30c6286333d7b7a42b65187719fbdbe34ea5d6a97b3d42441d068599f23b4f5d87a58ffe6a2b04dd1d2f4cf77c4d1432639fa78a011c69bf539c5eb5fddbb1f861fa32bf0d089ed718d8949b150ef971ccbef349674b9844f7efcd16af52391d5e7def7a3f3f4e911ade96c43c89d3a177b342e6ba53a76fc090d1dfde045df65345f3cf0879d12883c6c310cc74a3a5e9e2a2fc4169e21a70ecb775121e04504be3c8da705984436d44998a238033147f29022d1ed811d2f1b33c0899254e734ceccabd72c003a94b99af296e581353a91b699051076071a99d571cea64a1b9bc324ab38ae4222aaad3ae399d281a79cb7393831b2c5c55d3029cc4265a2ad13d6c45ca48cf8096c30eb8b6f45bd20331b25703b3356968a9b14ff49a75f38c2226fd36eee8b52c2ed650908215717a70c02323fa4b0485f1f683a7aa4cf14deedc671a4aff6dfc9f385b21d349a64cbe83ddccf85b64a66ce76d0a41b95f29152f29e27fa10e8b740ce84e077a7fc2b44b3060a32931f6f3d9a1e74be7a19cf04de11f309832ee4ad204afda40df6251d26b6f825e41f8d910f974fa5540fa002dfd38600921f5917d6bd7f9f54903af287257d1e67f9e24d3c3fe8deecaf9c79cf8bfbb13186da28fbcd615de1bb6b2c2f9ca99512a1f8f9ee5144acd9763c8bc1c6ce8632996d238aa6b8b0449246ff11e57b5f79b46b7e1516c505e3fada026828c799185816cabf6d462df5bef6772473c162e3a58452c1b913ae78a94af10cd5813df3f1be0a5569eb8d3c26d4ee7225f5935bc4af2fed32cb261060dc8f41738b4a942f70bc65e777e0efe22856f103b65570adcd3061d98d1c5d495f9a1ae472800c43062fc59187867d6b5d93eb581c647f4d4674e56071dd4160560a80cdaf1bac770ce86af02b06f2c1c19c812080e82b9d7b0c68a936c51ddc8b5eb0e43994686ebaff9752ac03c68526abfbdc914b394300cf26a086c49eb9a0bf3d475d16357e5fde717c75c2dd23f5f4a51727e94b74f8d371e08d556ca607a3f433b3fa3ddddbba8f4bb78a9ed68e972b7debcaf7cf08db0c920477e9866df0e9741dc5dece37a0bc268595ef068ae3c61fbeb63364ff3ef410f0f8711a2bf24797d245f2be76b215633a296a875b9c1987d4ddb5bccbaf7583a80cdde32b851219aece1a099b22661d72636dcc7cd458466ea908d3de9916c4c5417c90da78b26805a040f232ffbbfcc2f11addc5116b4d3cd4f84056e8f5783f1d001c180a64ce5ce42ca42a789ef4a89add108a7e4d603abdd058caaa5aa8c80e32c10df098dde674cf16da70b9ac5dc6d236004d8d0e84cd36d4cba71233a6a55063b60ae8b1e7d179f17c93bcc1c023ef2ed0f2c0b7eb2a6ac726d791595cf3075672dd72b6d558dd4503be20ac7ae0982f20b837971053e21d83235c93d6135e2013016f9b58b5acbd36694ba8ec209be1f8dcbf9dfb9142edda44a3b4ae875663d69c55aba5c1c4bf55a5e762c7ab4f4e7320499407bf4cdad6d265ca261b22d990070bc1476ebee5ad2e347063bdb82d975e107a669278165bce0d77f1316b475fe5f471b2c91d5f217307853b31da0653042f29ba4ccc106ee34d54743099c2a0a19f178f829b092005e32275f7076ebfeb06ee8e552c256d50c213e94dff8eba29cb4bed86a29436407afb2ee10ba0659234a666821226af6e0753503ed943685bef77c44f7003066428acee563f48a7f4202608aa6d80078ba6e0b006d5b20238c8bd2d603ceeb119f808cdc52bf2ac94590052bca42cb2800af0b381aecb4f6df49f1b183555bc8c04a574714cee8c2721cb0e2616618ac8d403b93b649a39470fcffc47ed94b6d732cfb6cb9a0e72a6d3c10945f1b39e233f7fc2f6d240c14168785b9e9338df8612f9728ef055c2f07390c3266e8e1df55bce0ed4077103f809438f8e7261240c6fe24a0b243779d3e63bcc482a6cae4981635f503e0c166b813a7fd1dd455bf66ef56aa57751d89fc00fcce8d1f8a460e02ecf330d4c96807708f756df112016c93042c1b8e6482ba4401c35b252cc7b58c092e7ff40ac46d6a5bb620d24745fa46e139069533fc5a04273e83aae8f3bf17167c9a42ca1e8ec4bb6f69a01c7c088b7aaddf1ea8894da4127f80bc0ce9d91ec048cd90dbda0033f0b889ef299dfc8a4b19dcde4054c0b18928d1cbd081045e4bfb04d0173c85afee020aeee039e590d8f5b73693bed9750891a29ca29a81334b70ecc1410c91e4bdd88d6bc465dd085d0af42e6c8eddc26f633dcf312c10fe101b71fe7ed7380b660cc0267c81739102f5414c45df607641c6609777bac0c8d0ed9a8d9699a4ecfafd1bea94b3d74bf6865b9265bb02e2f189ee7bb4f4b5da1dcbdf2a38c357a989b0c581b3200d340d1a1fd76119b3504510d0663f0e7209b2c2dc7b56e555892ec777dc9fc47cb234811c818acf838066e14fbe70afb94a61ad3557ecedb62d17e83c4edd6c7ec14c608c0e61760585755243844f763bc7ed9a4d9455dee30b5516cbcabcc343ad7d947ed1af537ea0d54a013dc09f59d0b4f36594e56d86d53faef4e13767e45f10158524889e65815bab10cf380ba72267be0281c7cdac025aeda21bbe9ca000ae8b43a52c4f3f9823235f71681489066af3ce2571f17a37a441d8fee3faa8cb2c3069a26706829e98d01b571d00a407e7798e31ac7ab39ebbf11d02199aa929ceb3b081f03368624b5a9df34f5aae3921c075bf4ca171fa23cc2b08d16db666019a4a33e7d7fc380c590fc06e2ca59ba67cace018346af4b9a418a8a9c3c52e418ee61cf595d12e974402861b877fc7098c84968ef50ae686704176c30058562962ac04636f4a81fbba230efd325677ab2c20e38c7bf118a6ef8a3fe288f75591bd6ab29af7104219a21a899f7fb5ef2094781e32c8867bc1ce1b713305f1d19bc159439b8837002d6b00620be15c1a7c93856b441790a329718eb8bb17c83dd3722b73dfa52f621f0d536fd4ad9bb7d7dba50264ef0692cef9d0df7270bcc9fdec61948d10d18c5349df8505bb87fd27096c30cac9239e4375672cafee57f65dcdd64e2ceb91c9e46a13928a15ba4ff9171729b91cbb744fb92ca7f3842bc51b8b6b1e12f17299acfda0beb2f04ff5fd05ebd1d4f4ed1f274b41e1474e91596f9e3855b6c1be71c0c0843843be5c34d8ddc4abdf8a1184228cf8731db50c873c1aa6b4b714fa4cfec37c175e5ef315b7cfc6bdcb922fafc80986f581ff6803d6e5ebfe1cb4782fc8960f3782557c4a21f85eb37f95e04e959029282234f16ef71c0d23f9ecc90fc5c538716413c3bcea0fe84d37c44c2a34de2ee7415e79215037302eee8da3978af1dd83db7562e278afea84a5c3e65430f636d119b8eec7f16a304f2e10587c3ab21e9fc4945949c51eb3e9b37c68e1e2929cc1bbac7f7732e886fef44b1a7f23247c9f6dc74f95f367d5e6231e8d9cf4e7cb4396e0d5286abb11f1a2d0afb4a7f6889e5a05fe361ba31d588c87fe6dad71413b2869e3ff910c938640c5923bae4f5567a9d7438e41de5403b3b48f350b0c4a30ac141616574d280f4877b078b30135a3c9965c3bc3dc56f0f7f32ac3a6cbbd9169f4250f64c0f2b09e3e0dd1a77a2ef99f1faa8f129f47db222564fbe02303b1c7acbe758534e590140c856aa7a512156cf378227728b4678c769d61321d42347a3b4e220c7f865d16a10e2c3e101e085db7b35658d14d79f56ee52dca445e6f23348a9a0d095122ef2c9cb469f7204c4516cf4d09031a3d83164145c26e16cd44accc96e8cc44d94163b39224400b6462022c5d1b5f9d8669b1d8fead348d25e0e159350c63aaeee0aa4d70d197b62daccd5c7a5bd063c427d3878a69e56fdd8e5fdcc1cd42c140956ccd898014219d60e6d3f446dbe9ac8fb409739e22ae8f94bbd499c2f525efbd0faadb1216b389201ec4270d1838f93bdf0d63f20234454b75c6f14a865baa741a4cd0487d3cb4087a62e0dd0ddb526f7ffc5fc2efad6ff41fbb1cbe5cfab18602c1556c244daabbd2362eb8ce493099091bc2b1fc3c6a1cc9094efbbf73971a6e6b9be9a7499142e3668fb29643cbfc80fb337e1b6c4ef6e23e340c9a7fdef38634f2761013d3a8c0a225498aa2175ee547090820ec7d08078738b6b83be597c77ea68da01c578aa46fea3fc5fdb4b90fa31dccc3ff9d8340a1dc85ac7b47e57f1b97ae1e59115fadb949f5f5ed403072f88cc3798e3ff148b38b95faf12a300832ee1e91dc3ca8a3e7dc10f6b08e7cfad60113dba1937f065b28ea7102df8275011f7b5b17086334d38e9c994c393b84624a1bdb9cb07a4f73437e5f4956b631da7d51732c613cb1f842d306d3322fad8fdedd07cb808df1aeca7118a130202e07436be7717729f1ef8151407139e6f1d1bea407ef06980ae3d11ee0538a03a7f561eb461cfa3715f53ed4f7fdbd6f6af894d42e24e1a88af241796ed5d24ca898f3f2043e6f0076d8e443619628bdc3aff365988034b8048340d55af08555923c39a16054fc1da5cfd790db3a403f96ca45e8b609fd2a59aff133e36f066c1ce940d69f0c2fc67748ed09f1241093554f406568abdaa68b5c34d68809a99c6722c457dc1342fd2d68797a2c5f36620a8545b0d90ca2e0e068d6c8a0ee88956b8dbf3284515af4b0750815c1d192500e2480c927817874c0c541f0be120507e66f5e90a05a69c13ec6cfd0da66649099428e080221a28c8bf666580ce2aa38554719cef0ab5cea1e4bc1c703517c6e37b9561ee21167c7aa70d458744856e5744a963fe5345c00875623932577ba3e17da975151b2a5bf6cd02e778f438c903e368af72d2af9ee8c329c50a0f20ccdeece91d79ec9dccf8ae3757a98ed218500897f406211379a42fbf72d63114ce2da1c6793aea564947c00b7fb0cc634e4a2c9ff8ec77683d8907a0ade84148319276eafb792706046363ae96d648e33a27d5a7b21fc4599964c1368fc3da05178149a39e7edae86c48ba992246e8cd96e40fd82bd00fa9df0bfb7885c36d29365cb93ca95e2d9c2d38c3c779f47db270ed29607273b31fc3acd061cf5629bacfde92715aec7f403f2d13848f7b246c1f9dc997403fe3511f1324bed4e7098ac76268b1479d6c387386bfdfce0e7a3049682da5c72fc703c4f20badf913d8c5211ece1c2e90fd8a7e2bb937433c543864c3ce418bf33d13a58303c7bbbd12b16f67a3a3cd9edeb22e08fbc433837af542c66887b6241df3f5c0cfac35abc395f1d3dc70569222f44ba32150b9b59a6e73864d8b1937bde83c53d0e994efbde6b70a9b58059b3679cfe7481a960402ac60e2c022ccdcbba85f5045c058c7394234816b1a94b9836b8f136bace081c2a7a74f4f3791a91049ed9b2fd4f7d27de7ede9be1af16eeaebc1177788a3c6e5e4fc7c93648f8e69bad5ba024a70ecc7d72b35443230e480d594995805e2c13be01a38003881b30c24f067d13166e55bf7919b210e22cd18aac22804d923e8574730a6c602a7fe5207df91b27f600044d9a75c94ac933cd6e50a449577a9e3537d2e1d7d3e601de2f5b1da65672f6af4c32f1a8b3ba132dad4ae52deee90df9a31bc949a752b7ec14a09998ca7577b9e117aa8359fb37b7c46f433661ecdb5d3f8ff2fdf3cf7c07d6bb61a34f2f57063b64f4f900ff7a4a4c38f0ce885f666f37757d3d9ce92f2925f2681028a4e87677724174bbafbd3513ab3f2289564965e231d172cbc743ffcd66e10442725599a147eb6b43c2ec0fb09e26f62b84581da1ee80917c235e7aafe7350144e8a65e8a9ad4714d9433ee069087bf1d69f5d0a7c4f5a38d5609858cb053749d9d63ba105e92681b44aaabd40f91abff3e0874b1f3994214e4b05c817921fa6dc9c8c2962e6eb2a45c7294901c308a4b30ffccca687e3d5d7ccb1fc754136174985070f5e0aa07b680f66162dbd618bab585352aae901467395c2b18f16bae602a48d7118e50ab0c3525f5c2183bf8368972ba99163f669b41ed406e0168000a555d0351f35429c40b6d71f60c20eb59bb385bc836ca0af2dce804814b510477df406bcaa89ef1b0c376cdace053d41467d85c66dd7aafc0ecdc8a61d1accd8be1951be31909ea9c93cbef5e58ffa54ac2a7fa8f4b74193a74263878eeb402dad13e983b4dfdb85f039a1ef8cb3466a37beaff1bc6c85bb45d6c50dacdd4c4333a3d5acd9d4420fd3a28d6a964ce70c5d5a9008c6a29871107b9501d5cf740a55c0f12b9491bcd7dab022794821031f9e8f7ee055710e1df2e96d0a97bc97367ba4edcaf5b3cd75dbfe5abd55feec702f0a9e4d71abfbeefb15cce8fcdfcbba9243b7ea3ca3eaef4af346ab96d1c4fb09f7e656576d228277b6e6bb96c7e506875aa19bafdce4fff06097d551181392396fc0316538dd13477e4970c011aba74308fe34d76187fb39405583c8e65936176342f2bbf64ff1b99bd80e2c674fa6eebaa36fc90fa6cd49e1628161eb44e329d45ca07449bcfa792c0f5291dbf87386c2a7cf0c8facfa180890f1699054a71cfd1516999b5d5827e23f8f1960019762c080b79eb67a07d7791ec1f1793bebd2f19b3eed61f97ef6c539993fe1c96574c7e52337a1e9c7796ef67751ec8d0d770d0123e726dd1a8fdf2d29401d490d4f5fb9d4a0be9f5ad56d3c12beb56a14793c1ad8dae8aa8c9165092848071e28c06c9c2987d774c40ce339dcd1bd93153dbd1af55e6292901ae2f125a18d93f6e7f206110b6b1176c287cc8330c1af8146d429f396422ec98eff4a3f146a841767ac138d49129e44c9ed15f20fec39a330b065aa23eac7d30203162fde3c0f003824e326dc6ec05588671d2a4aebf03567d6edf4bca94e6605eb447c6a1e08f199174320e2f22ac55cbfc85afab5a32e293734692813756ac427ac503ed64929849b737defd3a1318d668aaf16ccdbd7c39d45fee33b30fad793e1d0f9eff0362f709de03f7148d48dc3e8c3199f7e90184f4b9eeb3abcaafd04542fe6289f91efb2e621945d011cf9ff295fd3cfdfab8b86220823b49f0988c41d251d47090778c0450ab4586a119465fef4ef3d5d30b32ba566f36f848196891f0d004b4a447ad42e5bc2d0cef61a881c349f736ddd81e1be171e39cc7f375396f87ef5b4c65fcc358843ec814b08f3f8ac7a8f632bba1b5ca463b5eabe1af71eed6da97c692238fb024a02f4b68110819bf19102b5475b937a808564399a232296580d57ecc8d3e538530ae4ac3f003fcd1183e0a0e41edec5d48ca79eed6c73fbf32039b92b836bdd5d1f7fc31d3c9ab0939e4a749638b60219447abc094d184fb43acdb67cd1daa98c4d420dc6a33f62c26276fdc98eb1d08d1c5a3c6766c10114edec80d49b0c2810f031ccffcbe5234b173244e8a05e8dfd43de9bac5a3b242d20e263471dcd2e327e2fda0c2fbde0750381fdcc69e3e02866bf4b23c40ce84632e31b19a13151445c22929a0c2e60b17142c91d7864fe9489332ab1112ef71f511e1d1323f2d651543efc8cdec3964352072c007dc1866252c3e57e86cdb4a003b13306f4896201193793421e685d99763d81a9b4ac4e0d7364ec75d712a10258c572abf8bfd1129503822aca927be7b41e9cfe0a286c6003b2743b7775fa8ebcabd6494efbc46a318df3e173240bd4b1bdc99f585512d408bdb8f1ef2fa62b6673baa08548ddb110f8908a08c5568b396c36166ce330cf60d35bd649781e066660320a82fc8bf522f20dc26cd5e7f8b8ef5fcafccc1fa570cf6239541585c9b3ab1aa7cc624f7e5d9b3680adbcbefdc2eb310566d8a43383764837d045014e8b73f453898d165cd45f1afa9ce47d7224c2ed21b7547b4883bd7b0c146adbd189e97c7ad45d42e2f6b47c2abdbbef6e46dbacf05f74aba96cf9ecd1b1a46b484338241f970a2b591c0c5a3758a5b71f31373a395c30a8023aff3dc444873e1b38ff706cb90dcc1b233fa6980012b6a20adcdcaf6218792064d34724f6d714a4701f198d43680a44872437e277352db96bd9ff20d13af0f2fddc2c2f4e51576bad8af8be73d6603cac47b8ab4b5b2ef209428f0ec146cfb8720cfd0a5856556ce89c89507d3fca389c42f39561be11e4bcb9b56b95a99f1780d2b0fac1311bec8c80cc04c930914127b56cb30e8d98000b888cae79270f5423b3b5e71c068629b5329ca2c93be271fb3d2efcf1ccc2977d21e73b4f65eb7bbc8bcf14a8e4fb4cc44381d1dbaefc0cc47208ce375af0671c60936ca34a0de42dc32fc79f408655e3f18ea7befa03f3d8ad4e41d00e63f7fa679f0d0291dc6fe4302c0340c7906bbc043ccff05b3e606efc6ba8488152b4e928b75099b79aca5be35e9bb578e7540b6f2bd1bfa287d21bc4cf98ae46208402eaa5e198403550de2f815c365dc3988cb3783da983d0fe2d9d8d9aabb84ccbab9d71c2e53f36507f49b54685c33e15f5906772cf971f485af37e07c04efa7d048749b58d37e3c3cdc886587b9a670edc98f6002de73ab2b4a0a28bab16e2122140a1060d878f4fbeb03d9bc45ad161d755641f4f80677480d6dea1c6f22b38ca879f745c3b942ddf9e157e16132018b77c5f85d8cf106d551c2c18adf525c688ece9e7699a963fd062cb26285229d9f8aad8bd990d5907de0438b81e948868875990c7ba34fbc7dc70f505944c712cf4c8aa8f3b397c3a8e2b6affaa18ecb2e53860d81832c861b202346c4bf57229617436451ba392a3ed2f9ad0faa7b7328c1cf5c8df6a5151c901930daf1efc1161e6bf1c3d98a49bf3db12781e9a88875f059dba30cd42fd81d1e2b1f9c5ccd3dac4ca86597642e491654350bd49d9b06ca02db29d23bc8db9778120edaafdc04e3c9bc1803f2984ff78d529c4e415e52520511ff2071d0dc9e3614db450d981822a5b84e5b97b7761965e94b1ddf74003ae56e86783eccc1d760381ef6e6ab1d65fb14bc9db37f2a0ca90a84e6c0566de27dfaa34beaf7eb1ee53095a2acc1f5a3376e6b52c7e89068fd0f578b0e578f3c5d264392d7c9f93597d805091cd74cbf80af2c9cf6365dc3da8be297430c83361b793c3e7f46d55ffb0abd728d89c0c2163d5f75ec7af852ee6ab295f56aebdbf6ebd8ba13e4dd305754cfaf7aea064e86253ee2476661600b0aea1bbea6844d5a2e66c199a08370af05c4c925ec67a3cc28acdfb1ceea7f87f60c61c073df64df3cd4fdf767a034a72d9e6fda15537d86c5930345b579bd6c46fe2b702857a9fd6ced44a3e47287a5f3054f3c9e8382dbcbf8a3e00ba80f2feec1b62d73368db22de065e1e44b46f677f769baa6fb765da17f00e2c67f84c63d2cd453923453f63700f99c0db51223faca7d5137248575839100d1d22df4fe13e2014f16adb2bbd2371a480ed1c9c2341af33a19d6c7dc303e67d3f417748df72ab2c72406a8a121e58d6aa351b6369e889587cfa7130ea9d1dae833bc5840bfc2390e13d1682791be3f2d00586812ddcd4daef2cff1278d7b20b1a4b7395821f50a83e4935e2712c06b6086e7acc8c88711ef8703cd8ddae6f5252f9acc5cde50a69bd862d01bb09e6f0c2f25db267cabedbd3a5c9ad4bdfff0dc0e267bec03c821af38e1bbbc313ee16a868ba9281c001aa2eef1f67f04c17c5fce85680fe699fa0db9ce580e569df25d463f28258f98b33e2075ab7b3a36a4aab9ef543824c803a9997a308988d326b948d6f163e27d7a161b1967d9c5f044a5c6c5ccdcddd98c9eaad839e61f0b4e90812577dc05db892cd3f8426b0c1e2cdd1cf97728eb857e9bb204694ebcd914fa653c68d011e20ae7982556c293498541b89bb105fa6a5fbb9b66e89f12a23f48f06be6193852fce2594e415ea1c1f352859790f1ed72b967fde579f1fc74be7cdf5f6ea21a5c93fdf35c450b006691690954f3c805acef556022d7d4f311ea01b84572c1724c4f8bfdd737af4c0f243d29b86a2530ea191a477a57869ea04903f4d2de7a5998d8a55a670bce1f9d0dfcb0bec7ecdf9d9bfe3d13d2a04a81c113e28d51b5b0c9c86bad3c942f6879c8a0c02e3e9fdf68daeb14d82d568654e0aa92ba4c187436633763de405371f451cfe0b8d4e43136f11f2cbaba0fdc89087fda872fd983b2f3299d02fc7d90c2a7909f98c9eb32a05c96f8f755518685c156d750206f519467f3aa095fa04bd176bda04a45d7433bc8be915cf0f3b7fe142565bd1ee77785651a7028c36637e409f2a024474e8f4e640c85ef3b5ea4c020b7ff1f5e7917a092a3fbf3e0f3a57109bcf328b7eebb3fd8ba75397d78b512c08b7b497e89083750d8e5ce3658e3b9f73d395ef591d0eccca4c6a14421cfff892dd9dc7d6a928c6c30ddddac5bda5f679eee972f8eb94b4e5fc0177848f3f6d86ff14d53f341bd4c22c70e5fec9b69c96f777a1144e176694f3ff19caeda25fc3b6a89d1e557ea4d113dfccc23edfc8a13fe8f5d59ac25af118d285930cf8d95caf6cbf3de35bf8f92064d5e3f2f3ec9a6377778b2dde28cbf93116bfe5c4937d6de313e534889ee3bdc381aadc9b3047c8e2fa118d35ce8e73e8466d0127e2a9668bc3b10ee9643975d06d534689d317c99e80aa9f1519daa5b247a6b19cb5b127337c3e7c39fe9fa3f883b077226f76c2f374b7cbddfe1ec9dfdf669c2faa318a26ceeb02e6f3ae7c33c47338f534c6f2a8afe1f3e563d74b5db167cab9c459dc8c19f7f77dbaa8b07164de385281e3b90bce57404ec7b5ff2f550f12ff5cc88af787bde52e334e371cb924b297f7de860e97fa23f81efe6ff649c243e0337ef770e7c7c74f117b3477878fabd8711be77bed953646ccd4f9acee25ace14378707664dfc3bc39f27832d13950e8a3ed89ba3cbe057a5378f50bcdcc9f5db0d3be019827f4ac042741047226a95660dc8ee3cc35b994f08feaf87f8d9c0c04dd4a641d5e9245844688df362f733ff5174c1faa4f4a391f23434540a31f18d4f04fea75800a35f4ad69030adbbd09ee01b7f2885e2187f36a8899d1eb5ee00582ec872edd5b278308093668bd48e71c15286752020defe00fe3433869937a9ff92952a879d48cfb0a29038f92b455cae984fe11b638b71f39024cd19daed691ddd0f5ac674ff454b79ba00a7fe0dc20b59694b61c1926f73d04242797f8fa73c7124dced045ebb2c96b1de0a0e76a6e201d279f4b1ab17e935d43ab3ad2eefc7489b51daeb335f0566f4409a665b07c593444993fc4ec52f732206e21e7be70a13e58a8247d8ab26e919345d157bc4cf8e7b5a02e69ef7e030ab572db81a3a3f00ae2aa25a62db5f5d6b34c482e4815796d177dd4e260290a7019d70e13855df2c9298bc5e59cb81c5c502556386a5677d4ba4c1448a330e73e3ebac37da30d1a8ef6276f13effeffbc8dc6082eb269ee6ed572bd201a4be0928897e66fb81be46eaf51b1a8b79979270386b245162f032a369cf0bafafe026ea39d16974781e7ec67a212412043182057e20b46455d15f8dc507e43e5339fb1c8dd91166cfe7b154c2ac2a32cda4c93bcf0d2955f41a08bc8d4b990f6697ae0b0ad27df721de79ba5f024ccd106c9b6b895bbfdb01ac3d592b585ea11bb7b45573c017fd99a01a5093466b2d0778b7b90dcf8d48395945fb87223647a6873c8a2227957be09773849667150b51ae5d3a7d7e49d2cfdeeeb7eb5ca242abe4e765787840ffeffb0a7fd21a7433335553b9c1a898aee71c53f852b4239dbee36267746921f6aef6ab57413e1901fa0406d7ace7fe4cca0f0f79d617055995da410e5bab31fb1b8fee8322c05549dfd38883904ce3b70a0213ae8af915d75e0ae4423b817503f0c4515a7474d9887f614ab3e6bd7c6c3d7a8ef0c73b79031746a18dfa28d57ecc7508e578627ef62d0966c4ccd886a04d9a910b0a66c9a14d360d6ee5482687a31ce956cda5b147b8e4b634fa25b68b30a173586649270424fc4dac19700f2a905ce41a7a84f9dc0057bfb86a93b49c5ab42cb1d42bb0ecf8038eaf86ba0bf5aa08c7bb6b2dd186b82ecaa05ea43d3b4d308b2536ab39b6477d43e35c49a428f20188fe3298a889099532baf5a253d7fc01d4bfe00bb6dd3b5f9b6f61840cc5da755a6ac98e743f260efce965482031fe46fbad39bf6ccc01dc1d7b6c187dc85512bc1e5c4c5e8dfcfd6475f873314d073e641924fc9ff68c198a7631cc2fdd3541f769403330673bad6526f88ceabb5752a64927eb7590dde3c68e6f515c409a3fb66a4d963a039791738510621c5861ddaa092f1290d746aa6d183e3b1c406e12a111edc46db2dc15b723d20937f5f878451e93104a5ae2ceb7af89ceb65d5e22988b0ce23a9082be025ff103240560fbcaa946ff3428c10508af6f7382a28ee743f5378ff054d92134b39ef3983f3a80f7445e412f82b5702fff6ef6841e31a406dc98a6f6e2d7d11bfde92392d133bb1625d029808df5838d45a5df07c6842db16389ce9132f20c17cd1592e538100f65fef89b469654b477311aa201e3bcb08aa1f3c81d10c3ac4068ecf146073e15c755027643747e771333393a593103255a8c0988d32dfdc2832253fd8c7e829df03ac2ae18a49b63e5f21c3e62f138876f1b633db6bd9e3c2d1b73574bb722658a521ebdb815e04bab95da92992e160d409b08509afa6fd72751244b0e13bb6680332b357a65e96d562d0d3589f4d20184aa27e1329f18b23f3877bd615a5fbbcea25ba55b0e6ed8b5b10082eb285afa47cecf412663dc55a5332fbd7b2501f7b8b7674d8a6baee427c4eb7fb39f75227214ce568fb023e3a790cd7bddf341f0de828346eb529edc4db4d7efcaaf0f1877d51b8f2676246c00fa1b91f3f2bb3e5a8172907c54d1bba33036b97a2f11652069a13577ca8760c843e1c12b667faea0cf5804474d707d693588f54d55019bb125dcfe9133d16d0d50f3c1d7441792d62bf64bd15398576c01ad45fb64e2400755a4b65aa0981d035b29630a1b69f1ac096d9e24c11375ca98be6ac0d15582ca1089423b252650435e2272c32586bcf3cd64717bdc286bc5b0f336a7cf0d516ece83512919be9bd1272ef70187ec938776d5b474e8d153bdae9c68544fc1a03f8e80632b3fc97db0a8e626591e42f16bbcf98d50b1a9d75e16bdc41b40bd1bfdbacf3e3e2a89ac163fedf1536c59793f3e911644fcb4d6b6be421b25ecb56ecc2f5b7f6348dd7f97b77cb6a5af7b5974f7d6140d3f5fcdb3519ab0b3eb1365305746fe51ba859cfa37acf60f9dfafc7ee6966c8fd821df2839df5b45dc4a328453104748f68a9a2a33483eb6bf604754600bfd747789a9fddded0f8b70dc3edaa3b948477057830727ea2ec34ba958bd4e39f0ab8a1bb37ad7745ff6738d4f85aedf799f34aee8aa787153d6a6b303cde5d19336c2d1169b6fd0ae53a45baed73f951ebe0afdc7722e29b31b0d3f59147ed20aeb8684b18e735d526226082456e9dfc3f946aebc28a771833e36222027f86033789725063e69275f5bc55dfb5b720df34d9bfc8a857f8e9ddcac00f0dfe0b294f82fc4f0f73955f723687360dc1e469d7afd9bbb6c4f3e5787c7df59a097c820b7bc23d1afe41893e64069b8a61bf82e97d8af93ee7aea6e2ba11947533f0c7d151675678eb3f10497b0d0aae3f966f3de3f50a7c2394fb566e9f65dbcbab5ed0e31f5dc4c30075e45ac9838f9636204a6c3da2da6b9b5f63b25bc47a99bd7f0048dfaafb8fa411a76ee4a9c3fac835b6f77575efa251bf4582f7b43ce779c5b755bfd4b21f17e39d87545fc83cb9403c688fa72b173cc7e9cb488fcd75959666217e730bb74567d99f4be44cef21d974e83a85c7f6d493b9aa7168ffcfcb228691f5cf8bdcb3cacfade030c69137dfb647113dc71bf69e24abf6de4cff327dd8c6912b3d6fb6efdcfb7d1d8f2c24f992a923578046fbc1005ced76b53bdce6750670d2dc003eddbe7acb93cebf544604bf9e1c56606056d1c39a4935fbe96658c9437e6f41c727b7cee1a554a6de2a90e2759da9792146b3f6f57d0ccb2e959f29adaee8b25b43791f1ac3a1c87b29ed51b5ecda65c866573e9e6852c1c54763f834eb09033fa48a19830a1124e75c3971a4e8dc9408f83c2d7ccb3b1e309866cc0f1b16d9f64af4a7991bc67b82665e29c80d4b3055b39396b6e6fe312f31b7786b5660ccabdc6e0dee355fe215e325da47678f4922b5327976dd56e0ad4573d2ebb8366f817be4dfcee9f8c0cb4f27fcb2302a23426d196190135cfb16cc093f10f9bccd4bc3399d577fa6881098dd2ad82334249b0cec444c2534163276d91da34a35aefeb67c3b17bf28ad49c104bc03017ad32c89207aafd2c926dc982eb4b7cd2dcbf6d5417c456d3bcf7e6659a0471dd1851b92a67643cf0cb09e88f37b518a3820709a95cd000b37dfcd109b865e4a7131392eb00ae2a3fa18fc014694d1ea63f5cd1e0539dab43088b69d519f33f905667494d3eae0ca36ca2738a314f0f4947a255155cdf6e6ee568a16ff3d77c36eb90d0903eaf204fed00382bd41f0a9677a6e61537cf8f02eb572369493f7477a424c9abc58396bcdfe125fc07f905ba7f9513afb518ac7abdabc87de669afbc7d9eadf5b90b632d28a3ff055e8e6210bb24a3e691953fdcd1c2a226e90ef2baaeb4175f91bfb8eb2fe79d4ce7d06cae8668e449ba29571644719b1f8aed00c34342e1a2671eefead59a30fe8c7ca6ab5f6289cd3318781fee95e70838cee98bfa187cca02aeba270d78e9dd89d6b5a251c27aa344f206167b92351c84f0e5444623e274780f3d474edaaf1c086caefb90571a19e591dfebe0bef972ab488f25ccace49dfad227160ed0c7ab70a861fe3db7c53698a7f1f594878307c68d785b40b954187fa728754e93962d9d8e82115a27d253daf9d7eff63e3bb55d7f5a80fbaa45d90bab44abd2d0337d5e7fdd0c8fc8ea5ff718f016bcbbbe1dae00e09665edda183b6eda497ea83a5713479f992de5469075e65ba923400a02cdae0ae070b695a7560da43c3e8ec48a553a1c3afade0e24b383666170c5d814cca39b94cecfa51263ca2f838ffd9174366c3ed33bbdc256cdab15e00683bcf9d193c1bcbd65aae1f8502aa7e80f7cbbc1c982cc026a01214fbd67f41262ffcebdf5abe84511e7019fd6884131ae6072c9c0f82bebe349cad25a6f15643676c154beb0fbd4a9108739e76afda1275321182dccd4d63484d2aa16370b269dc15aa220e223e770c36e7a8b0d1e730901be08effc7f730da760537bf5abab9a349caee80fee657f165673adab9c7d7da9d81d01d565f6b5a489e3b14eacb945164dac752da9ad21951cee4316dc82f12682e95d36b11937f7761b4b7f532e96a7305fc12d1423eea71b1ec1f124afc34dffe1f53fc3a6f8bd7887bca11cd0e869a378009d5cff2df32f0adf0bc42e720ac236fe62a35bcb593819b35d2b1aab79132f23fcc20a34152170623fd11b2a73fae653b449d6e4be2bbd2d34bd138fa5ad829f6460a15aff60551215d2aa20ad16b64c920be19e4a092e34e105bbd46ba1a811c7420676acbc13d76f160763247ff8236f709ac393166a27b9ab93bda55d3f190b3d7c03dd1eeb14343b27fb39cf6923e526d5611d060113e220ed5d018377f5cf968beb00ea2fb94992bfe79fef7d0ad7e9362d4442588498ac2cf0d5fead1b7164d70bbfa0b709dc49123805b37ae54b50c85fb65e2cf0f7c65b7b78b2f46640948e112dc22ab6601623c360e740e3de1cd0232dbf90afacf80d07cf903b877e63e4cf29bdec4f0cf038925edd16c2d99bd75309a14299674a50352b6aa6da2a72c1bd08b0f496b660adde395f3ce1d7efcfbdcdaf3a20ec1da39778f1e66f2488d8811cfedf1b8c2b02e1836b93ecaebbb688bbe2ffb16580ca4ef5e88c2c4f789b569e989898261b676f8a8da7f858e860e28913b9c0c28310d062dced1ed3c9af29ce070579cec1e394ce2a4c66ac1a5328fc0de094746510100c010af3fdd60b13aec3d0f6079a6fc98ca99cf4fe2f55046b3108dbe3ad929789500c8685bfbafc1600618798cc4664610e97e0ced50592e68e52ea3137a36fff9693c438794684e600c8ca50694a699c3465f890abaccbbe3f878d59daa76c71b7df322377cf1e59c65ff341f7c1b01997dfb1bcbc4e5d932ab6f9e4278421827a99a7f8270e506872606acc5759ebcf2e43df41d756fc301a03a37b824d3b81249778b12235274a4f89f83c315b4bcef09248b73d7f99aba905c07b7a3ce6ec6ab92cc41188c8724c520a36f4108c292035d0f8741278a491d6155d2d867f1332d4ce4c8b939ba158b78c4d0ff65d64c60e34ec32ae4a3faff18be6b435d76e934b032add1e4d4d816b93debdf68cbf4a6b9a3795f3dccdf391eecdb5b6ab925a43fdfe417f8ad827c93bde02c5a73a741836039d1f9eda8f30437a84b714eccd777a839edd033ef01c0b75c95577d8ecbc9ad3ff37f50e9eb25cf8ff64bb882bd98fd2b485ebee0e9c1a8cb8e5576a74a9cbf76fa85b57f949c3e117f52952570682d3f243db9d11c8488679a6ff44f52218e58aeffe96b06fa57a47a43068d8ba88f7f66b26501dc0b03f887dba7a3644d2c41b78518bba025ee6f7df4e4066488efe5af1ad962d6775bce06a3fb139b6e63728338aa20cda8e8031920354ac8ccc727aea5379f07227bbb95160d3170bd874b345ca50308e304fe233a206fd69503d723c0851149c012036d6e6cb5cc8a593b03a894fbb8fa721bbae5461a3bc6042e702062c76bfc7c203ac019ecc42e3a56005e4e77839fbfb05d80d8d028d9bf4fb367bb3a7e859bff7d6a8e704898070df9e8b34fd343aeb79f1cd2b8ef1f9f16cbc41aeedcc9a06dfdb8e753ba3161151cc71dc7c15f4c89fa279fe8a5ff02200fc59c2e8187e9ec01c2aeee378b5d3d9976d91165f32c03c66919fdb6c2f56053fc7ff6fc3607e65080bdd79861921b57b1e571084927387408b8f9e148dd15f720a7230bdddd68c0531f29708455328cc9dcdd27007a35081a10f23548ed481eda8ab24a36f6442e090ec1f8309189bec5a2e6146a26898db8ff4c9e733011f7eb49cfa5413d7bdcb65b1879fca8ffeaff46f698de380054720e2039c68b0bbf10bcc7f4407a00a56a43cbc7ba8285fca1a13df54cb69e120389104bae5adf77dbe6c1fa4d4552e572febfb14c42ef4b2f6b65c509524d6ac747bb53d52aa5d9074f8762fa154530828dd68634cdd235aa7d3b8e9d5c3dfaf01ddbb98a3373fe6b03bbad216c0b772cc5c00cd48d16ef676bf2bf8aac93f60d066c488b0d794587befad4043bfc6feafbb2e39e03c0a9c778e5b6ade74829110f67e007f69201290f629e34abe48643dccc6896f4e855e85f3ec1cf52f172a00c9b53c68f133842dde7a9af7eaec89e073bd0d872904587d174f6dbc2192743bc791e4df707039b419bcb4350b006a7812fbccb24e0d2bd8f951e2f9c420317916be52c40cb116321ce714d0522ea2f02aebbc1f66ce111e6797479fc17402b9573619c15e0409d2bdf1e30547199313e879fde8e20a0431b727c3b86c46cedd1757f5e6278c086eac7bd9e1539daefef82b66b19c0c15d3561cc77bdeaf55fe6fd206ee79173c27ffe6428c74e84959d01c4bf2dc23232212fa166267ecedc1a2d316d62f4b11bc7eba02453a2b6b5fd5d59eef6a70f64344856b6fc291e5e6fba244e8c5e27aae341ba9f4dbecc6dd96ffc03df10f6ad0d7ea5eab1dfa7aded78281d1d3c079501d7a8cd65699ea8028be8d9623b69555713742a97754600d4b99c5e806cc262cc3402215431348579edb1d8a91cf88eee754adaa47a08d07fa952b4b5947d27ecaad5faa88fb0a6e5624018a7270b6502d3ea35a16ddc560e7d0816cf9b8e67ca2a1fb2e581fc57915609040aec5a0997e1c943ed6e1377bdf3cac1ccdf0f36301646068b00869a6511b1c9a5fb25599de7a87f02411430103c34df40008e01f2300b3534ead022ffd1d09e546c5e21bb5f4c26f574f705be903dfc75d97c83bdbb333fb8c886a3822b76427e5e3ac9a301947089b3532cbe4f634e1675ed0d2145e970de06f7e65eb68e36d857f37fd3c4e8738e58a2ef0535c371c2e5ed4ee663cf441f1c8e7f900d3ec95d4ae75ef1fd4f37189fc7831e7a769bd65b2ed3de415ca1804c9bdb2e93e32acb8377f7cfffdf97102d42657f83e53c5e83f30bc43c3b9a2942b5c676a69dc3426d724e7fdcb577d786ed1c601aab0abe8824b8d571f3cb06429e48920cf5fa458220f32c5d64083e9fe31fbc6121f0fe648da255182ee0b8e7599efdbf77e9ac77ab5c9f4261949dbcf47ddd3b82e63b2e81041101712ed1e44ce21dfed02603d0379638b037b72230b2726855b784edfb24e332dabfb2507751ff72037ff00a30d81575eb3ba9b90937ee8ed32dd1e8b878b9443e66f9164f38a578cee4e4da72ffc600eb5ab63f36533ea8d9657ea3b61ad2c235eb8bb36a3fba0775dbbf5eee5ff7b7700e20fabbd3b88593c33397968c15b7e3db4d549c46d059d2ab2c02d49077eecca7838d40b300ee3b4358da1e7263bd2279479c22c35116c45386cb79a7ee6afae151ca60ab02c58fde2e9261e339d302fd0bb0504400b2ad1d0796a5fbf72f7e65c7f4ce81025d91a3ceba2504f34c592f0c132c6765c340f3064e3f7a2e7fc0c1d9587012a0a2375671fa765dc1f42320f3fdd2b70a80cceefb6e7c6b1cf5625feffd149cbd421448709981f441a5b1a3ec181aad47a5e3bffe6377063c30dceef57ce659bc33ccc09fb3fd5d109b07c79457452d2fafcbf6c66e79a756d309e73c064998f2dacf49c8c6eb003a933ae22973932626e8aec2b797b4ffd71cf12e97e8e7435b68d6ca12a91339087def89b759af706f088278ec4a6507562411bf31576ac8189a5874725a66cbff210774791a651a019f753d26d689542e8b35c2686fa8844a53901652b8854416a9540dd95eea61e7c39b4e86fa9f7f67f450088468ac8e2efbfa1d52e08386dbf60d6237cfb583cd23d6e10b5f2c1231a41b53a160047341c213d6979f20de7185a0a537348fdf05166eba8623159e44cf8c1b8660ccf9ab1341d8e6e705f7e2b029ec68711f256e8cc47ac31ef9c6cb2d36a89e52415af15930003157b5c7df267600c3a152ffbd530822808f74010336153da42d87f1ccd664dbe55610c8af559d6124f81330e9e7fe7219ab981c7be6e8a4c31a574de0212d1de87ac819eee84372de8d771c22297d0f98a023d09b7311a48008c26081a1b660aa15c274b66afcf6e7b64a470e9065e5310c407845858619e598d03b162702c50bcedf1e95e614f9884dd82096a728348443aa33ab1cbc943d3e130392f55c580fd0d4068305497428c01f631bc841aa25613805ab4ac135eb7eb65c6d6defa3c6693c38aea503039bc43c8fb26da6afc60a10fcc84bd5db8b919eec47c052f99934ed45c9e1c3a29701a8ce9b082bac0f245f4890b6896fc487284989464967a69afca1f81584e41748160d067917a1fba987f14ed30f31bdda4ff9aebb64dded4a031a9c2720edf7a85601201644c0aaf42f1a449d4647cd7942b3bae9694a1160241bd81b309bc11f9ddceae0ce69bb08a435f6256f52865f50ef136aeb08e64f4247a8cb8931f2afa2f6df12b094cd45ddbc00569b8b5a5bc0f07d366ca7289d1164da672886485545ca66a31bd1c989969b72df5e446fa5a0f8f7ab0986fbcfc0e73cbb360b70ff48d40947a41848ccd57104f888c0758f4d26885f95538ee071be1330a465dbc1f3383da33db4bc2aa9d85ae70f54e2e9378db8292429937f0805838be7a983ba73c07ac23a986af5fe0d2913efcd56de80351e571c3605265aabb9a15ee6583e4236f00a0c87bcfd2ca711354b7c76b0cf964fdd13f50de29a579767fa690a30a83e6af45564116c7a474e106f4fe9360451d3c23bed6095b3abeb488a38637c6512463aa5f65f2a0d89075e7af1082742dfc2aa05b280ae24ac4a00513fff12082eadc358c3deff7c0e3b01cd865a8164bcdcec2f7392707f7f743fdb7108b9f0661e7f73e7dad42904e0ea9a335e287202b241808ff8d1e5c8f17629e496240f248079d12095c3d0973394a052bb42a68f90914f7a5970f00e8b8c1bd844dafe22fa5fef2090413397f73f77f1209969c62054f206422ec660c9e516abf064740f3475600029bae571a27a59b80a6b2472dc0d64cfe2392fccd0c9b2678f2f17f4d8c1be0477c9b216b06fc41d6fd799fafbc4506be7c35865e8eea97477bb1a8a53ed7195435b96f9b11ab8e09128017c538b6d0b163546ac2de24ab058a7e4fdc6ed6b927b2edf904e26142f99c5d43f83bef5dd531412dbdb42385d273ead2d1629827169d50dd12329dba9a19a0e821532ad389f2b5253bcf1851639adf2d95c06cff0ec91332e99e335e2a356ec958b1a5345e4cfae7b1b25e57a77866d453a59587a380f735d90a4edc5bbf33a6dd92e7f4c7bdc10e78032733f7775a4f79d78eacfa357e93c11e4dda8b1bfe24f59f2d554d6005b5fde96a2d07043bceb8ebe965ee31fb583b932f47627547e29ed7f592ed632f62018f63cfb5d67a655aad6e9526991ff48b732adc75a250c530faaf22b58455c6246307a39779044bbd3b58441985d6d244d9cf8a7b136f7a5ca7f3603335b7928fa69a4b2133be297b9f7706ab95fb0f6cea71207434493325d162dd5c5ad45db86d1e2fd3a69651c2936003556716e803002ae509da6f91d7e9c6e43a449504c753367ecee0fb75dd4d47bab555f4fc594196f6542f4c93dac95e0b701bffd028498e9f6f91135aa017acb32783c302e25c3013cc3333cc3333cc3333e20d45aa3ad9143b8434a3249d14d877fe803ffc04e6b71a724654a2989a57f60f87f000002c43d79dede24ad0fa70773072a07669de31f6b36bbbbd68b111f9337bca7f56c92dbe97964dca0ea50328fdca8d8e7b461a19d9bf17d13861a6b4cd860a9e8d4abde5e833175f6ecfab34fdcea3251832fe7525c9c16d1bf5e3630494326348b1d7129759626346c52ac002fa4ebf2f28e793439c3d265c50bad65d451656648fbcbd3a0bd595d4a592c39c89894c1df56ddd9e4b45cd34fc8c07e9928f5527f73c5635045240683475fddea95dafee40ec523988401fdf1a4797b68ddfb0f1f239880e12c5765d439a4d03179be70c6574aa8135ac975e432f1c27d9abd4f4837315ee61883040d8ba564053d7a5c2400834917d41cefb165f0522a7f2e983c8c76a9273f7c865be073cc7e5d332937262d18eac56f7a4e3b7b6d16d0ac8430bd992ab66e1a4cb0807e16e6e142d584f65c2c9633b9c2428d1add322f95a9bf582c387a4cac703653155476fe1b35987bcb12154ea7565ce8117232d59f4ce1d1396cd59ec755d7e650c1440a233d9e648c2e26308902042650b834e8098d8c5a67fdcb5c22d2cb8e1d3c0244070f1d655c80f8f0d513278ce8f0d18049131630614263bf2a6c5bd9b7d64c96b09e1d599f5fdac85e5bc70e15640323132530609204074c90a09fd9495be9397eb28bc592c6e4086838606284491110ca56f3769496c6ec8408aa8eb961524977dd740c1c403c8c144c8690efebf8b964ee8bd45cdc621963228445330902db418af93bd1f3488ff58109100c7a44374b95cd6fcda5c7938c01c4c3b0a860f20375e9d92c743c7f43c7e13b144f61e2032f263de0c1a3c247c9db9919ed4c7670a6cf3361b372b3e84c74b0caac91c97ea467b127392899e000fbce71bf44e89c59d6be468ec90dfc9e515acfca6c28716203577f5452c47e646cf1c562d1420c931ae8ba31a65c63db9c7442037b3fe8ac290d99e2cee2d4d177946be6113aa647882c4a1a10120be4e594d2fee9d388ff62b17020041696c9f849d9dca3c765c7d2e183905758e3dda3f95b6cd0bf0a425c9180905670e2b5669bd9ad8fa59210562cc5bbeba4dba3e6370859c59e8321aa784d93d64a7bce9f7adfb8b1630777710387072c961192205a40212415235c282004159d567f7d2fd99c52750a84eacd4143680a038494a25b9131699759a4120e42488180905124465e7b9dfe66318d2842812c97a9c5337af9cb2f164b08283e7180104f8ce8f0b105ff08b20502423a61e9cb162b3547176a1df9d163840dfe3102c453c009d5ccd3d9a97ff13122060e0fd944fe5aa56c19b5d326a1104d785e9af21ae3a24b9d895b26137a7363b55c191307d19f473f7d6913a54b2cd36bf98828432cf16d6a3e359a6a2e7e0e1cde430b228454a20d1a94ae5a694abd8a126654edf6a7ebde3a9a8499e23a9d58a537c85e12a97a6a66256fb37e692450e9bddad3cfe6eefcc562b1587290a0d1c58d921d3bb6b8e1811b376ee0f03574582c350881c4a227d7747fd4aaee3ec2bc173fca7c7468521d81aa07b155db41d7538df83ca649313a6777d94218a1df2975fa52f48a2b21216411ebcc2566330a1dd4ecf70eb0204411e6d8eeb91ed539fd2611e7c775ef32a1bd571f82885cb4af274f331a7b14720864d059338bd6ea9242b51324c4106d7ac9f971ff0c3fb6c017098e2d4a4afcc75a7c859042a8a1592aa5a387ffcd5d540821d8336dad35658fd8d1c5621921e1d643c820b8ed53efe15d8fda648820d4ba72c3687b92baaa2e420271ec391dc64d069d1b2dba100208a5b4572384d4ce6c8e1b37029083903f98dba995ceed28fdef911ced1f380305217e408b79561d32b7501be211d207a31e992655872b702f1123840fbcd2ba364cf637adec82d27ab0a186af8077702183903d24a3bc755521424ecba420440feb18ea1f37eac336bb582c2bf03270e8f8a1461938708820240fbdc60bf9acfbfd64a30c1c1908c103fbad4e5f010949c81ddad2d6372247d5dc57e301217660dde389cf78527a4e73e1050e2ebc58deec238d369c0c1c6a84d42193a784d2139dd3eb6d00f1c1c34f081d12f332e3aecde35e1e3207c5ca5e9d447bc6bff6620991431acdd4e77e51e6eb098983afb11e7472d9a54a9643838881a30d27e352c26268f1841038a43bbd0691397aa9cf86bc61a9597c7b54323cab6410e2063d3667a1c255692e6d1b54939a43632e3ddae56cc8e56b452bbfbf31993528cdb3479342969669a4863d7ed2e96490eae3711a4c1a5f93b969cbef51101f683068fdda37eb28eb2625f135fc042167b85fc86606f9a53addcb2f257c2109a22166d06b9368e1a95979141a2969019b71a30d27e386163d082903324e5fb58514c23c2303eeadd36ce63f066c47e8f02e74bef4570c8ee67872a549ed36a530f8417e109b85ccb8e283e11cf437dcb8b7ce4ffac2fd31f35f3727b5d07a815122c35506b97dbdea82a5ea3aab669a9031bc83102e987bcecd478df6dbf43252c2255bdc20640b2a2195ac293f3fd3ac19846801d1aff4a9b715919e93464816d637a6fb95bc124ad3178b8587cb20040b6f126ae5eaa033887f81902b2077645dfe5fc828d31a620554ef633add35b7b95daaa02755d11db21e449572a871430c1c66dc50e3061864dc100307175e9881a3032154b8d5d6b9cc42b39657c520640acadd7f696e7a8c7e215258e88a3e71e12963ced9c13fbe704148143811392b65d6e7521a3342a060acdc3e171bebc6f44f487dcc519fda12ea21ba582c23407404bacdb8107b20f207b73bae52d30ca9320f03113f9c7b5cf4acb876c9b70fe9ad5169327c8f4e1b227c385764ec98130281c81e94d155bb6be7d4e5620f88e8e10d2d84af90b24d07791ef6d869756a4d7bff1b1e8e49968b56af5c8d5edd41bb5742cad472fa4e646d381937ecb4e164dc384e10b143d2f364ceaef369ef5f245e62b1e42011a9c39d63941b9ed2c124ea5d9a19a3dc3587650b29cc8348e1f17139e8fa56fb771251af350eeaa0857bf749a5b37a1138a0433e7eb4d18dd2339137f872f251dea3501d64226e505eea90f33e32d7495d44da607c5a5d9e212b1f1e1136ac65fef2b4fd22e3cd2cb20654c5f66e1a1964ceaa0780f00e302c161207028477fc0f113598598e2b572666f3bdd270dc11fd1b54ade9d86088a0a13b17f9a8e3a394538a9c6117aee6b57410efd39ac1bc4137b4d5cad0ae29831b33fa9b328896324f06f5885f8d9a3465f2ee0203913168b23c6fe728c6a3ebc5609c58e1c956a896598b09226170b569dd28fa2e34ea6040040c7b985676dacd5648a516887cc17fb9b1763f4b8e9012f1c23afabb37cdcea94f9540a40bca18fdab9e59de0a2d178e5178aa13ade65ffc3f44b670f22da576f5bcbbd044b4f046d9a2df4b6f261f8964c16d51f125848d06572f225838559aea8ea5847a712f164bc9488b5cc1f0a7a3e6de9f0d3187216285a3589775ef7a0d667f215285db66b547611b5f6e2e870815ccde9e3d5afbb4cd3e057429b1aad589d686cb62c911061937b4a0818814d231747679eaf2316991884421f1511eb3e9a942c844a07046f94c21e48998c79f9092b2573609f1b01b3ac12ccd574ec9c8d39e2618c6658ce14568d0e4919c4182021126e09fddd36c92b2454a9780d4f2bda336f95aecb194b0ebf45a7ffc9d7fb1af259204eddd376aad42c434e2c37ff85022483895dad20fb25c49997504f407f9fafb4d6aab458c808eea2575163fa3c35d84c5637f8cdf3908d9a10811f264f2644ad51d77634486d0860f6a5e8e4e076e94f168388988100cfd31e309ad31c7bd4482b0c7556f722fc48c9972dce0820810767d3a7a974e1b6205447eb06cf5585a7e6cb55f2f16cbc8c872120fecd8c15df040c407fd6729755c652aec3f911ea83b9ca8af0fa54a8c6288f020297257061573329dd0c56259be0206b2c010d9c1a639c712f1aee64fea22a203b3ca60dfba5a7d70ed192239e853b9e91ea585ce411a86080e3c29d6d7b6be336e8881438b2688dc808de23767d039a38cad8bc5b2cec051e225ac63c716767810b1016f426c4d2b957131446a805a99712664ea52d234446880509ff34eb8fc9f5f81249e694186c92cd66a84120d37c2c684b2f883e8e73d7717ab45b150c6dc8948a9d5bbd481b1050e154c60c1c9ee76523284cc9af6e415e84ead516f186132baae484469b9e61e1a5ddead50aa76fd285d7c90ae8a316185ad5b6d7fe91c655b26d1c13fd6c86415cbaf7dff868d67e62d961c6dbc8e1ffe010f4c5471a6ca55a2a2656bd49180e9c00dc3811b6603370c1a37cc19378c19374c191118d142089354389f83da86513248adb760820a94bcf29c5973a7ce7f728abbb76fa36e1db57e9417135378a332d4ca71f541bf654c4ad19a4a215c874f9af763b1a03121459ab48b9a4d311a43341985b1238a6e56be7013e73a2b91310985da46957aa93b0a2ff762b18c90e818e1d12de0d121d0020a1350a06537ab8afb98b6a5804b4a9c471a934f2c4f7eb6d4b6263d86b430f144be51ca49915945bc72d2094de5da9d8da94db7b360c289b59e1655f76d13a6df16f999cc47a3f262b18cf460a2894bc46d181de972e7d3e347daf801048c1b63e0f0c166e0d831c9842135aafede9351396d8209deb4ab17a7df497976b1585aa0e37572896d6dfee7b32e6f695bc298756cce1be3fa785b8943cb0771ae534754bc582caee3871a6a4c28818ca793cbc70b29a733e2243a76a03189c46b938f0df5bed744120b136a52efe8dc174a172f2691d0bfe3cb6bc73545e240783890312c961c6df08f1f5b6c8103c7176c4c20a1067d615294bcc8a42def01c4278fc88536ef1cddd59e9968e0704432626bcba530a593f652c262a449234e7bbd59ea345e9a3513469c7d657489772775ffc562f15142a2e38bc9221ca157b6a6d2b625be34b765a208858e1f1e748c65fab7911c934458dae1f774d2d25811222cb593d93e48a93da72787384af17b31150d22171343e0f5e2aef95fb3e7d5c562c981a3049342a04e9cb6b8ef378d041342983da7b399d5ff5466c48bc920ae4d1dd3b5bfccb71f3511845d7ade9a35d6fcfecb241067fcd352881e5d71099012de518209201a594affad8c519bedcbc822e11d4cf263f207f4736acb584dfbb9bc582c39bc75ec48e38c891f328dd935758f109e42979ef4c17d93c2b48c792963178405ee4517133e98253f835a4df65a9d408298b1c5640fcd7b47a9672ba3b88e165f98e801efd21cbf3d6b89e94a80903010df1164f5e0d181491e50edd2d53b7f55ead3050f06f9eaf444cf06f9c398dcc1d3f791e1272332561998d861f3517ba5941811933af0aa35fe7353688e77b1581431a143f2f7b99d45b534eb47072c164a4ce660d2e0440e66d0a149788ecd5a749338a43994b9c66dde0a0f1c0227146b4bdf4df11d478a8d0f0a281cdda5655d7aaf94a6c502ca27d2a93b4a1d93b0532f22a17842a5638946bd5b514f5a83d209359a8c90b6a655864fe1043266c6f8393eca268e535a334af56e760e31289a586ecc16429a6efb5c5d2c962f289948cf5f9dfc80fcf035daf801a4c49b640b1c3f7c8c329440c1842d93507d6a446b95fe127ab81b9994ab550d5b06144baceb842be12e62c47cac40a904afd43f548d081dafc2028512f8eafdcc2def4faf830265129ba794493bc5c8fd560973d1058a24925a499d637a0c2512e97ac79ef3fcf47abe984181444af74d9c8eca438a94f2085727e5ea1b53af943e1714471c43cee8c86716a03422d919ffcc3f469939bb000962c685c20885afcc3353cd22d46ef7a9959d8ca737e00e06181445a0348892084c8310710c2efde45d2bddeda11c62b3cf53badc632bad1ecb106af796f1daf1946df6b2d2a01462f5a0a7e4857f8c328a108639a9ddc694263bf50244071b83e06575487d23763f6f7c5104e1b69f0edf0e5b69bb1a21e9a1a384a4878e9292336e888103480bbe80012510998e527c4e73ab56b98048869b7da869ee3e1dca1f946ffa328837193f783f287e506e1625a550551f301db6c4c6edd5d77a3ee02384f61cba6b759b243af8d205650facf620549faaa8bc9ca207ce576ed651ad16e23279e0e3e76490fa35f6251eb61797526b74f615a3a6dce1fba044dde855be4ac90e967916f3a0c1a3ad90520755988c521fde5f5de662b18041a1c3bdaada33ae1250e6708b52e6dab3b53cf31050e4b09abaf40d665a283fc5617d1934fa7ef42cad34287058d646fc68174ad32a3b407983aa951042082983661952dcf0e9aca508f17e9b0512c40c34286dc0b459011f50d8806c0d2a366b49f1da8501650d491d3b4b1b911993cc6a7883cef6c974d4fd0aa5012deaff5c8bd3a7eea4a0c1f911a1739cf60cc9535fa643281d11b7198eeaeb5373ea4be52a2e2865b8cd4421031aedfb5beb0625744419c31fe24e6b19b51ef532623874d2b15f8e06b5d1be90801286d385cb6c21dece34010a1832e5ab6450d71221ed203f80a4e1618c8ce480f285dde40a1da15b69d31d0e50bcb05462f5f78655328f4e1b942eb4b625efb2bd42f90707142e20c634e7a84ca7c764942da49dfeebe99fa568011722948ad326953a3f0b8b76faab543216fc24fffa3c26fd2f5b942ba4c4ac4007285650c4ac80092855487bd23a768b5bfdfa1e198901850a27d7b2c5ff867bf5df4551a690ebd45da9377c013212018a14d6b94e6ae1ae999f3ca744c1f51562a2c1b3a89551a0608ba7de24b3c9e61c3e810f5b1ad6c55bcfa438e1b059dd8ef8f0df1b4a1354a183ccccb5b7a7260e5098c0cd7cf41819c4bcc7884159824285d250ba75ffada22861d37acde7857e21444449c2a65cbef0d3d066e705818204f7c5cf8f94d5eac61484720476d4e94da166dc4f6c508c8098c971dda4944bb9d9825284d3c9b8e69f7029e44e043ea7998788fbd4a53584336bd906a53293505b0869bc4cd294ae0e116a106cd7229a6a468dc71e087e8e6cfcfefe03647c6aa532d9cadc721ff4a644a95be96274be1ea4c5dde574b47890f787fc3e55a795e83bc085fc79cb081d5f3b141dac75d6e968afa4d86f941ca8c47427ef0f7fbf66891428383073073f979f57756451a0dc00f724633d6f949b4f45058a0d0cbec275fb4ed4eb7602a506ea0e32ceea52f1179b40a181519f16b52de23f4f8382c82cf6cc209fd47dd80c11595c9feed256a8dad1d70b91587cfa65e4a9df738d1f2e4460a16e523abbf2a86447a505445e814b21f478a9fc1026bb82b38d1eed94ead65acb0b915620a3282d292b544cab45588198f098b943ae9ad27488ac828d9f3676c9b4e631aa8ae735aacdf13dbb8e9a364452819b7eba16a55fcaf185082a2e13dba84f96903b630c444e8116ea45adadbc7f96fe1031456e1af21af56dfcd53a444a91dc5cf39f41bcfcfe2e971177818e121e22a4784eca18d543dd95b7179151a4f2caa3fad08f9bed8b28f2a832aacfdbf9fe9948283ca9510a71ef37db9608281a55afb3cd9e980d2931443ea1cee0c184998dd64203868827360df72374c6d23ae51810e9042a355f7bdc78d599e1841f4d37864c1bfb6dc343641366cef9901ec5ff6da7894b3784144f1fe7af6782b1d1d07de6416610262c29c4df2b0dd1eeda4bb0f1bf663abcd267f28bc5c202114bb827a56bbaae68a9a7129f94b5fa853a2d3d8d94f8844e2f3beb5b3e66894ce29372fcefa414e3bd4a02a1743e88cf2d4124127bb7fa7d96cc7ab265051148a4aa32c6c476cb6eb40b9147f01da79e2d3c6911ad2356263fc6ff9313524e8df0c7a306d9ccf1c47618a1ac0fa38356e2439ebd0885f4f67c427e96c94f116f7afc18dc73e68ee944249b7b3c4bd79cd51611069349c7c3ca6faf7c8837363da971d5517b6908553fff6f1a25a675218eb7320761e6a3b52c11429de3694e97ed294f83f8a4b95627d77416621484311f7ada4a7cd3b481f04f9ed232099da5ba1a10ca4cad6d0a1230478134143866ac011120a180a9006605ce0344b4684351800000005212a403132d3c051c240524bc43000128f9e103f000007cf0e81c00f1121cf81a3d78f0701e1501dca00d1fcdc379500460831b1180006a703a80ac1e3c828c8c0c400034381d40765c4a7864640095599c0e203f2e253b4646065091c5e900b2868e156464640095582ce55ddfeb736ecd9e8bda0962b1f0f01f236be85823abdd4789c55242a203c80fdfa1c3078f1e5d4605169daad142f5c574f304a3f28afc339fb8514278a7c815277529e2ee43c833f1c5621921e94152d28a64ca51e6abcf83d8678415db28b1ab3fe81ff9aa8fca2ad0d142ea17f1fdbf7b8dc1454515e7b33ff5f3c14a2adadd123932ff49ffb2828a93d4d1c44cd9c61959e514a7d3dfb5dfa0a34b79554c714afda5b34c35e8774a71dcf25153996ab54e4048fc079302df9cea2d3dbfd090f18e5118fe1e95ce9c63925168b194f8e83152118521b3a138c86c0514abceeb28c328310df20c2a9f406a6cb92565b7b9b43de109d118e3eb98362a9de8d4f4a64e1b27bc7338b178d7626ca53ea57f0512c48c54d9c423cd56756a6dd971bb582ca6a289a39ed1302555fddde7a1e352b2c60b5e204625139c92763a5346d4cc46051387f6c9d3fcbf4d99bde4588bf9871aaba85cc28f19f1cccea27ede8b1637a858a200954a3c529c085d9fb4d976164b098e0d542881529ecc469768d7db4d4259ed6a5566253bb42b89f57c77ebb42db3ec158954938dd0266d4898f1efb4962e52eff995475cba4b558e8e37b24b8e38c91ba1854c8f333a498c4a2376b54935265193d2c40a238e5a6826691a42ae945716b1cc1fd38689502fa5d00e2a8a7833d68996ff9d955b22d0ac5b34be07716f5505117b3013a7d94e5f8e9a0a954398b579d66afb6eb659c510c71cf2458ce8f8ba329542d84a88dc36a1b3bc926ea04208f4a63e35a34165835e19c4229a7f35e8a02f2a8230e9deb8be5285d0b75602a1a6b6df9195dbf801642b80506dd4ad51a3998e235e2c963f985a32b8bd8c2b7e68ef85c87c8eafeacd4a1f92bb239eb4eaefd457850f879769aee131dd83dc8bca1edef0159523d64747f152d183b5516fb383bbd0f3f2b0cbc98dd13ecee49c482a78e8c44a518f5e5ae7acbbc3eaa6b92557fa776a55eca096426f14de6167dfa25207a35ce9a33e68ad49ba020692810a1df22847b9e8f0ae7f519943db9a414c66f575327ff890834279499dade2adfbd1e3d2249538bc5a6bedc52939f9fee58c2954e0a0d013c257b68e0c255f2c161e3d7e805183ca1b92176f1ab3562d63c778248c8a1bd62efc536c888e514a178bc58b4a1b32712bfb4e63ebcc87fb62a3c286e48b0db17af2657b7ab158d8e8b163075fbae8e2861a384a1649901e5cb8a0b286fb747818d92b83dcd32b6ac8d49ea8abc860b67fa09286c7dee368195e6aad3f153498fa34a879a57458f14616098f2c07f2a3478e1454ced0c6e6fff017a9a36515331844f8687bed39c3d6824a194eff33755f559a79930113da44eb786a44becc187c53912e844b351d9d0b8f0ec122f1344250110323d4a5e8ee6779f772a01286f433b756dab966f347a3020665670cabdb5b9a4e5ee50b081db56f75ddca6c1f342a5ec04de996abafb39bdea384a447176090d146a50bc974d12efe1bbc747e01a3c2855544952d1c357483bc4b9d748c7e54b4906bd3a6b3b6374c771f952cdc39a9ca98b3d8a8842a58488cf9eb6f7bd298f98baa5cc19895686f295ccb945217a858e1b76d6dfb52b4bd262f160b57aab052e7726384b8db525d2c16f7a1838d910a1596b2a64a9e3ef11332369cc42b537895c789d725fe9ba52a5250d4b7ba53a74a67d907a944a14f9da7a4c9866cefa1808cdf9cfdc5864fa97b8259cbbd52aba32c21908a133c2955fed6ecdc4533a3d2846318331d56667ed242234c58bb79588d79e7b58e190307890321a92cc1d7ba4bbb67dd514eaba28475072f792ae4c7e4320b2a495885c7514ad4bbaa7b9170efecc6d79ec93c2b79c9118c339bb773abbb6db947c5080ad19863ae56a4bc0f49a50827916a567de8d73811501d252383e8f0dd108e9721fb9f427cb85a11c24aabfce8edd37a4618044c688edf7ae995bee251018231338af12cdf23831e46e507dd6747a5e2f34da683f4f001efe9f3e43c994cb35d2c9615547ae026bd9b771a3426d1e1c15194b6edf498848c59253a2a3be86fe56b61b3a9e7a9121da89e3c7f4e79a3fd121d3b1c888e0b1b23403c053938676f769421357ebf970a0e1a1d36c36bcef85a760364e547fd95ce067de7ba3415a67a4297824a0dce317c7ad623dfa24283951e7dbab294c95572818e9291efd1e30765167ad4d831ea30294b679d228b54b78e78511e734a7184128b77c3afab2af5e54ae692238d335e408185aa95ccc14dd4a8aa95f20a763dede990f2e54cf402c5152bf5643bdb51f44474054a2bd2da3589e82a194fe65c58f16b592d7faa6f75f435a0ac02d91215a3734a310fc980a20a47ba5ebd9bf12e32ac014a2af2e85a7ece51abd4396a0c0a2a0ed3695eaf7f281935ca295272857bda96e6b944174b1814531c465466a1d456a6c75f504ab1d2afe46f659ecc08b7a090e29c314bf710f28bc562b1e4b85046e1aeded99caa5d2c168b050314519c51af28fdae8804a81472b36830108602614020000600428acd4c12e31008204054381a0a49a5c2597dd70b1400004a4e385e4a302c18228a0502916020108583a14030180ec43018c54214895138ceb536dd5faf58b852735ae16cadb16d7b6f639fb00598ffa0dac94a11f984ca1f07a3324d8ee28a9a374ba3851881694b0108de18c38300b59c2d9bdcb6fdad1908ceed8ddc5e50b8da63f1c76e36003c60a76114173b10b88a603fd44f2349e580041d0e35f8815da47f2822cd511a69527acfa8e11bb9508938e8940e21a9a99e0b42ce79cd00afcad76ddcda3476fd6d55f2a8443495bdb2ba153547b3d68f9813da248b2d2adadf1dba92ff1a676315ec2a94a3489a01cfec4c416197329875f004ac96bf5ba1d28b9ecc378fd5bb3167db898fa03104c8a729f94256edf9039d73fa10e6630910f957b4f8fdd10382d7f11f9400f97a0b9928f2b52e911e2c5005842ac062ce59c8da5121cbb4d28d5daa2e5dda443e6acb16194ff4dedff26b397a0fd48b5ca349a38dc0748d27d3c0c6ac59ccf02a48d84091b383587077264d666c02008db8f337e144480503270f7b67b8bc74a4ea93931df0356b14772864d4c3675e193b2a2deabf716fbae7c515dc89e17aacc005003d54d2ebd74f194e05ed971f0411a29426105bd4f902719877469d3c5d3cada73172a291771a6f9a5c8b27e16e362d74a6ec73d86f79dbab4a3249765ac843ef88204b143300a0488a31340c1552aece6f81cbd09063affbc93a5ef10d6e82fa67f0c79a7dc15389b88e3d25c50152eb2404483603a2ab1d91df6a91f209c3a78260037ca14567c36029a1af804e18e0665a347ce4e12209dbd89b2eab68825625011fdf398606a8c4e98bc19e8edf35684ac171988045e0cbce2d9c51e59172a5bee538f707778b0a478dc1d1bc11f35780fe578eb310ad23f2da9688c87f1b9e6246efd46e63e9868a119cd2976110947c5750d59441e0be557fcf7e0f19c3337af74cf8d91b0b2589cecf9ce8c564b04c81a917b6b64d02cabd1a4cc54cd18f38110ceb21781c3f3f8d2f7096933c81e2b299d49f86c2c2eadf458ee8cfa53d3e6474cb086840d783bcf758bead29e683c0fe49ce841d10078f73c40864590bb51230287e3927dc93bd3503e8da4269a8af2795e39303ec3a848786f6502b8a20246b1c07e5a9f17a86c62a69e6f446e291a46145335dc3b3efcbdf9f9ce7b3bb82a71d0009f78c2580481f282c53008d2774d2a44ba9526fffc3f4bddba8f568e43ac0b1bbe2c7425a78d4206f0a0cbcfbd3073acef5a4198c2e830925bc51f54a60bd65f3f4062107315ca58bc7f7d04269bc9fa4c567747e3d80a9784c69027791efd2a8320e348b5cb330a3f082fd5b0acc6701058b83043926fc213b89449a648844707085d4439f051dd13af2c026566a9d6e0ee939ee954dd114e61b4f5679b24bcedd6b3e31a1f1c17a9c429ff76b73bcb52e7db973b74177010512ce325b77f66e8152fca599aa961693ac480e28a92391cd45f52eebc8ddd44a04d5953bd747df484e9eece7c9c11922a9bea1542f19093051a3579d5bb93bba1a38c25a208b7925578401fd63d57d060bb080c7771e6d9fcbd65bd08d26f37ca0d4af06a9b745049da1b181bae61a22fe3a351eac138cf2e6983b24deee85782406073e955145f8ca35ff15e1c40a35adb5dbd12caf8720cd96f415e07335a8acd68dac49170f349924f77a4b97733f2144f9de23be935e23d7f40544bc51cfadc628b958fd73f570f691f8f7e647191dd37feb734246669e459bad9bbe560e3a4509d5fa77d7db60eba1591e32462a406657df4c69601c34bb3476e86a3560cad8b48562c94acd07bd271caac24240633fedae30c9f8b47e2050db55fb4e4ebe4f4244b55a9fc23ca8e6e8bfc4c6856092f103a0040157869401cdb0e41bba295ef36afbbf72f5181906bec4fa0841ac84e9d2860b2a9f9cccb21585be05a25cb3e616078a9b0b1d65d0aead2cb488462818c28bf39b1f93983551b62962acc8097081354caa3f776639570e3c367a8850fc0d47ae1cb7a8f93d00986187c3c100dd280a2fe95a59bf65ae7f0ff5625a945561455842a506e4bd89227115717d3b5c34b7b8c6de1d4df3d82aace46e33ef16af8c2d740b7531ee27ff766451fa6a98c5ba62579cb009936f0b2797b82440fea54996d2ef204e810f44046b514b511e63b1499e7bdf63f3ac388b7055b146619a86e6fb92802dc43cbc47b3124287842abb2515c534c403d5c534d34d7f4cfcda8dd0ce2993773cb690511c29bd9d6e4e9eef8d163f528f3859913ccbb3f6cebe4021df0715ec0ec672cb62eb13d9d7d065c7856c34763ae7f9912992f9ca9e52d1c074586d95f4708e4d26f9404bf48d1f13e6c9343598c4920296e22c04c30d1b7c8808d48c88c3432988822da605881fed8b1fa7cfb70e5cf0683acdf22f707134bc91eadfc0880c1eb60913a236ec01361ffb8aafa2c418d6e0ac160ee0d065db8149576a908953fcaa3156a6015ecc30a22762311159a19719af48dab1237510d426f27afd56bca4f51619f460a4e5da680eee5ea4daf903b7abb8f0ed9e443604a8aee49545cd6821a15ea3181cf21bf273f633e42b6c74531c3eed8a70d3ba47c802390cec09fbebbb0dc209e5059e7fea0e34862a5aa63d911e4eb6a86e682d4f492b822249760221210dd8eeacedb6b7a6b25a4e62268aa810f706e25ed58905e49bc5853f325187d584298ec84c772a6e3544862a9e829c88be5b8a598aa4e860aa9c49f204ae37c9883f680c1db9de6cb388dfb02ad85816d85a42a13bf151e1255101aa34a6deb5073c01f28f3770dc29612c8dc6d0187c45ac8e712ce568aa6db1ee0bb26888771bce783608061d64e43aafe09cd8bf3281b75abc81d001b9e3a5389393ad5684b8e5f392ac1d30b36914040228f842cfdf81e9b785da8b898faccfb370b8ab604a5bf6c366ecf94430cb7e371274f06ded12ba04a44bd7c505fd50d8be6bd4aebc7ac425ee5c818534e23ba2002de8eafc0627cb48be73baa2fd5cdc60a8b0a34cf81d374f8065b6d9b43b032c2df41edb8bffdf19f05718bf7fcc70d78b51088303bbe13778fc4d89c5b7471bbda50815ba4e64b1c5292ae33005bd41c1b5c2a6b5c75ddca003e31e033de572fda60611e3d43eab6eeed26f3ef3798daf9e92aa8b32f9dc60c268d987e57b91383af1484e769c29608ee706e3b1176a2fa371cd926c98482d1561e67c51aa934641ddc37b1c2ede13c3638921ed4a25ea37792c11e1b37ece975463fe6e7cd03cf09cafa4596c3abcd80329427e5facf40a0feaa58f25f798b392c19761a944446e15be2b97dc17a5b4963ec6817021d1d138ae5f30272790471987cd035842d37cc51466dc0264337e96dd75be1b551d213cb27858361a18b24c0895d3838aeec34bac86b9029691031109c3309c1cfce60a0bef895a1140cee75b9f8f1e2c9e65e06eaba624e6651e5fd8bb7b2c26b7ac6a7b13272b22f9026eeaed28b7dd7cf82c36fc7dba7817ecd665690f15b25edfaa15fccb48ded5e1a5c3c7d8e5ceee832974c8a5a40dc7749934e199981c0b11267d15cf86511c2edbd980eb25cd4277554b68849fca1a2d2f443883f560fbc6574f6d6fa73651c4d16f388d3682c963a2e970af19c6155089f92bebfe530addd2fd5159ef0c96c50f6f9c8109dbcefa6af219f3c26c747e3dbd891965e7655d723b53847554580efbfc667e848c3b7bdafbd6894898d18ab9fcbe49bc5fc6dcb91d04e5a0b2c8e1951cd9e8abea09dda841353fe8ce4cae7156b878790b15f2773e08495d2f2eb07ed9f75104757ea2b73f0e33f7c524d364f28490be89a722620f12c9f326c55c206888b9febb70aa3348699f1a2ed1a7fbb8836161124d8ab67b9c6677cf55d2bceb6232b169e88771adc77a5f4a3943bbb01c0103d59ca47fcfee0b86efcca17cea24618304b13cd3a641ebbe9992d8cfd859a7e73a622cb1f44c83cecf229b594fbd4233a62750b0fb7a824e224161ba91e12cb950c6042444b62b934d90517e16d25c1451251b3d0239d83e1a97333bdb7a4dce815bc0362ea65714dc5d0d0513c6ec63109379c716c8ff01a53800c86dd2118643155260a21662060e99400b1a2ad4779e794264aba9d05109077d8bff35375aa5b7d73703fd30941793eee587bd21e1cdd7f564772d7b5cf7e8d6445c67ccc2462913a6fe2ffed7f67dacf3dd5bb5bc8b7fbfa9bc7ee32f6ebbe0b19f1973c2a45dd2e18b9c087dbbf205996188823abc5814d0866ebc575a25230e2cefbac5c619901b468d140b965062b93e20ec6d7654bc2c68a13fb4e4cd41e002bc1cea92b525e3e4caf5118cf1f3159169aac58c501792afb49d11dee2bba5ef119ed509215ce02e4b6e7e84e95472b75cc5f2134491911ecfec72560fcd722b272301147dfeec871924ff9a21a855a894b18929622c1e962b48029db75736716f2749ad5f6f974ce8e2c08766f4392264d251744dca73bdffc689d31caee6b60bf7d46ca1eb43707ef007f395754a362f68c574e2ed812e7271240d9980aa883e7d27ed1284e1249fc45ddaacf5822d8ae523806df3383a9548a2a61d4b36ee0ece8a526cbaec03185366e15bd0c9620f5de53db02281c4f5baccc941eabde9d2cbfdec996c0f1f5a9342450f16b10f084fbb8306890c419482e0de92062a74d12f8fec1b9d4f2a42695aad005b808b348a0ab25b4cb435b90b8569d7898a4ac74f11307006aa5ea915bdd5634a5212aa88331c55c9ac811c73a28d5310671765e930bd36b81770ae5a92f95683c920f2d0a1f7de5716784636a2b898e1954806801cd15658408e4b3dffef48d0c072f4e6b4d74e82c5535b2f2396a5c8dc050ebe5242f6151dd98a014471858e3da2ed3c01af97503a1ea7c0dbcbfb51993bbe8119992c099e946fd1b0965d3a60089ebc36edc3fa6eac2e18e04c55cd68f5dcaf54234d4fef2f35d3492aa960f97b800dc1c3a2dafe123523e8532e384a2187eccb2c2fb522d670cacb69090dc0fbd87202066cc4a595d56ce4f221306e431805f5c7ef028bf3f71dbd1310e85d153854474bb3b55004dca617f633ecd6f95242b094b0b17b2df8bca5dbd3ddfd98d70b6504ba4d95e7998a297c87579e894b44af489f76d4e23c4898a1e2677967c5fd598248a72b8a8790311146721294d9bf67afcfc5d57b8daae26c639baa23599c6faf91426c9145a429c0f90cdb6914a5996b4adb0fdc23a67a36e1b3a12fa4a1cffe6178319736e3b291142a5f839f157f975391d628a283e18caa46439281bc32a75f0f712b905d3171c8d22903eb788db4a1953ae9bc4605c9334a55179d644db2b74b5990ac8d95990b0cc08a01a6445cd596fd5f3f3ca00d485e3a6dd5636aab939c9cdad4f42af8e8ea49a8583de15941caf6732b8de105c61d3930d3dc356a1092b45e0d549a46cd9190acf373ede5d64de2033b50877d3f31c3cb339d171b218722c28940bc00a208fe3ee3ed37b1d01e1015192e5706803c58b9d631b95896c2f0f2b093c4a87c7b271a84f9b04fa17aa3aac4446ecc3c1db681c31ad9630ddf679c1e86a504d8fcf2caa6ee6f95f4152e667d8371c4c8793323ba01b8e1f2cf221363ee01b4227d1761fa6fdc15b8c6001d58582971c2f4a52e94e76b54b11ebd10725e1b8400a3fee858c1f59b3b1f6f507c8a0cc30dc0036ea204758992bbe615b681bc89fc95a0ed7470296651433f41be3cee936ff244c03f8b95acef6c726fe55c25af377d78ce6ad5a7f02e259fe87e4fa07cf4f6d19dae3d84b8df97b878c00f95d24501780c8906ac84f74de639ef91dd0a36870d2e203bc6ccb9158cd66b20a915009f2e41d697477089116252078ea555a29b4e0a021f5b88b966f531292d8f7ecbe7d2776391eabe5909f44c4d805752d9c228bc4e1944672d1e897bef9eb083e616e2ac7d58050a6cf3a0b268248b3b987500de16d36eecc358a4e3790351cf86b49ddfba28cdae5ba5562b4e60debc6def32b82e9b9e1f701d77461f9d2a7ee3f4b02741ec87d91de7c47451b5d245ac7472064e7c615c021217fc58dc89cff29c267b299f50542c1d45edc895583115033d4cb36de1ff75e5b8762cbb6f185f4a84d31e1c1e946030c1f763f4962cf4e4f01c536102b52cd376f8aa6c377ee79286dfb211db0cd25945933abc7aa08d48593a6f3a20b2c14dfba0b9bcf7a3e6afae6550559d981660326bd64dc0a2bb6ea764980c9825687b4f540085eb2c8d3cd544954e4440083a265309464b176fd6bebd4fd07ac119b3740e4ea2d4410c5fda8bbb1c1c2b4eebd0e7102ee2039d6e66dbb51df627cc1d302d126de7060a1be9a5fbb28aed41a7df3fe694930b486e1ff7d205a1a354e3d7f78046dec2ed73a4698753bbe5021030bf2fc3bf3478bb9056a413d5802883a7d4ce897fdb0c8b80a6abe2939296e7ebecd7089cfb8c374c92b072af9480e26dbd6092aad136bc5e020a0e9f9b6034144a9c058f24f8430e274231bf18321725162fa14eb0bf7e93c08aced61f8b890618c5fcacfec41a23fa20a05deecbf798438f747e221a0c82c0af35a179a635b44fac7625eb78972591430ff3fb77264c40c3038ee7b33c9b5a90e8c171b872e44fce5fe43d549fa973bf4a90917cfa2f4f238cc80ef37889253966d7c67de1fa7947aa3c4f87b96eb499b76014eed12b69c64fd35eed8f1d58f7591a8de0fabb7b13ea3ef99485f5202ce1ccd243893b99cd8be577d5d04d7b25a7572ce2284e89df3400ffb2f677d485de4b16ddc5f91ccdf03fc2d3f808d90fa9e0b207d9eac1b03895ca6b19bbb286561a3d83efe32fb2a031674e696e96a96ebadd09aa70ad689d31316396d632349586f281e9a495a6d219660128dde84a466174ea4e82dea3cf047374de568d4539d6d135f398bbb07cd350d4337eca82f684e4c35b918984f9f5e1d09aaaf0d4c9955d8a22afa077a9858e1f1cf210bfab3d27d068e1cce2aac12812470a9153fcc7bc610aee9abb563400cd7b33e41f2474cf369e2e11e7fb17775ae342a408c323aeff9dfd811a67f5828f7a70ca41346989e41473b2f673c6e2147826988d85a1d13b8742d88501685c6c2250433d17d2e6aef018ee0add948f4164b7d00de3274519392b4a338eaa1023510a19e55030378357a20ac0c8a548cdc5c020fcf5f871696f59042b3b99f78db413f107a8b28f30ffa572e9951073186829146e126e84f9c6305250dd432b8d0687d2fbb2f88905a25ae42cc82534df8f0cc77d4186960891bd304753036cc807cab1b590dd0f2d53856894f5a04e40b559f0edef51e54f1c127646c2ecf40af3573dcb88934c398a7583b5967316acb2a97ed8439ee8232cdd83b29fe27b5392c357a8cd182e55061a32bbcac8ab053e77e53c2c95f54c73b59418400e25004b3d4e2ca3aeb481f058883014b0b6a54ee15efaa9a842bcb1f3c20464951ef740a66f4c24d936febe86c4bce8eb02cc8a6dc6294fdf3a70eeca07444f664624fcfcf21c2720f782f8eb28dd380f3ce3e21ad55fb481a90c89efd971625de3ef316d23108a31fa6d1ad39ce9112f35a9ba987154b8655868d5b6f8c9cf47a3bf8601848bb6d36177316c0ce24035218fcdc9a0be4d80f104bb0010ceffc11e40c47bfc91059b351b8da61ed6227991ba58f2c1de984b0f769c7cfac0bda63291a44fe0ebe48ebc5cd7ac13657155137f6eae1c436d0d3c20c041ac1a0739abb75e1ea3e083f9424125e0272a0d0985dbd911b8ce64f4049ba38dc1377b08a8fec9c2289fa6bf0f92cfc02e606f9f773920879cf90958d50f0b268f6596539cd9b0175d3921479a93e37441f4b68d0081e78e0498340e0c8f0c6696859390d68535c70820f8347d1cd6b16b2966924c7ff8c0723220b1e170aaa5d7a1c05f9b9113f51bb43efd58c7338e68769ad8274f42f9d8cf51f2769a0f9f29906f8e8aa950a33912b8581b0a980cc1dad06b845d9a3528e3966dafbcba31e0de75c53ae81a9303affefef93113f6c69fc426282b080a12a6d32634077de0411dde4afd067df5e33c3594754f29273facd055e1e220a5d44cc715eacddef74f54f7cb18b9d81eae8bfeadd6ad1177bb2e8cbaef707de88af3ba86ecc01d1acd384576885e0d2daf2be5daecc6a3efa15aad504d000d5a73d9590a533bddd4ff1105bfa7a77a3c26eeee65d37ba2564033690c536dbd9006d25438b07df3000fbc60ce26865f4df84421132a8275a86cb30c7bc81d2b1630fbb60eae3c261d458fbd93e5c2f1b14d6bb2f6fa4e5153431dcef5f60717fcad7ff418bbcf5601", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f94d70db43676a76269071bc1fab024efe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xbd2a529379475088d3e29a918cd47872878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3b2f278bf7750703750673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730": "0x50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19506f114d556b001da96175726180fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a": "0xfe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a", - "0x0d715f2646c8f85767b5d2764bb27826878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415", - "0x682a59d51ab9e48a8c8cc418ff9708d2878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b063988c4aca94685cfd2b8b8ca2fdac38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x79e2fe5d327165001f8232643023ed8b878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0xe38f185207498abb5c213d0fb059b3d8878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x1050673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415", - "0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x7474449cca95dc5d0c00e71735a6d17d878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb36d5c455f52f81fe03253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415": "0x3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4": "0x03000000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/asset-hub-kusama.json b/cumulus/parachains/chain-specs/asset-hub-kusama.json deleted file mode 100644 index e50858795623..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-kusama.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "Kusama Asset Hub", - "id": "asset-hub-kusama", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.77.217.152/tcp/30334/p2p/12D3KooWF63ZxKtZMYs5247WQA8fcTiGJb2osXykc31cmjwNLwem", - "/ip4/34.77.119.77/tcp/30334/p2p/12D3KooWGowDwrXAh9cxkbPHPHuwMouFHrMcJhCVXcFS2B8vc5Ry", - "/dns/kusama-asset-hub-connect-0.polkadot.io/tcp/30334/p2p/12D3KooWMzvdGcUXxacLdMQzRVrsP1mJrZHcrz8LtGbhLzve84Qx", - "/dns/kusama-asset-hub-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWMzvdGcUXxacLdMQzRVrsP1mJrZHcrz8LtGbhLzve84Qx", - "/dns/kusama-asset-hub-connect-1.polkadot.io/tcp/30334/p2p/12D3KooWQmGf5z3DU1kKcZoLzMNgdbP31ybjuwxS1VGLKMUjq5ez", - "/dns/kusama-asset-hub-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWQmGf5z3DU1kKcZoLzMNgdbP31ybjuwxS1VGLKMUjq5ez", - "/dns/kusama-asset-hub-connect-2.polkadot.io/tcp/30334/p2p/12D3KooWLm6iHcmA3YD4xn2zfbm4KLF5KSUqJJAnmt2UGr9o2PgB", - "/dns/kusama-asset-hub-connect-2.polkadot.io/tcp/443/wss/p2p/12D3KooWLm6iHcmA3YD4xn2zfbm4KLF5KSUqJJAnmt2UGr9o2PgB", - "/dns/kusama-asset-hub-connect-3.polkadot.io/tcp/30334/p2p/12D3KooWD8Bma5qPbq7N5qdED3Xy6GXHfvfk86TL8aVTQKxmWkHG", - "/dns/kusama-asset-hub-connect-3.polkadot.io/tcp/443/wss/p2p/12D3KooWD8Bma5qPbq7N5qdED3Xy6GXHfvfk86TL8aVTQKxmWkHG", - "/dns/boot.stake.plus/tcp/34333/p2p/12D3KooWAzSSZ7jLqMw1WPomYEKCYANQaKemXQ8BKoFvNEvfmdqR", - "/dns/boot.stake.plus/tcp/34334/wss/p2p/12D3KooWAzSSZ7jLqMw1WPomYEKCYANQaKemXQ8BKoFvNEvfmdqR", - "/dns/boot.metaspan.io/tcp/26052/p2p/12D3KooW9z9hKqe3mqYAp5UJMhZiCqhkTHyiR43fegnGmTJ3JAba", - "/dns/boot.metaspan.io/tcp/26056/wss/p2p/12D3KooW9z9hKqe3mqYAp5UJMhZiCqhkTHyiR43fegnGmTJ3JAba", - "/dns/boot-cr.gatotech.network/tcp/33210/p2p/12D3KooWRMUYeWMPkadDG8baX9j1e95fspfp8MhPGym5BQza7Fm5", - "/dns/boot-cr.gatotech.network/tcp/35210/wss/p2p/12D3KooWRMUYeWMPkadDG8baX9j1e95fspfp8MhPGym5BQza7Fm5", - "/dns/statemine-bootnode.turboflakes.io/tcp/30320/p2p/12D3KooWN2Qqvp5wWgjbBMpbqhKgvSibSHfomP5VWVD9VCn3VrV4", - "/dns/statemine-bootnode.turboflakes.io/tcp/30420/wss/p2p/12D3KooWN2Qqvp5wWgjbBMpbqhKgvSibSHfomP5VWVD9VCn3VrV4", - "/dns/boot-node.helikon.io/tcp/10210/p2p/12D3KooWFXRQce3aMgZMn5SxvHtYH4PsR63TZLf8LrnBsEVTyzdr", - "/dns/boot-node.helikon.io/tcp/10212/wss/p2p/12D3KooWFXRQce3aMgZMn5SxvHtYH4PsR63TZLf8LrnBsEVTyzdr", - "/dns/statemine.bootnode.amforc.com/tcp/30336/p2p/12D3KooWHmSyrBWsc6fdpq8HtCFWasmLVLYGKWA2a78m4xAHKyBq", - "/dns/statemine.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWHmSyrBWsc6fdpq8HtCFWasmLVLYGKWA2a78m4xAHKyBq", - "/dns/statemine-boot-ng.dwellir.com/tcp/30343/p2p/12D3KooWQNJKBaNfW6Nn7HZDi5pSSEFmHL2Qz7chr9RksQUDR1Wk", - "/dns/statemine-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWQNJKBaNfW6Nn7HZDi5pSSEFmHL2Qz7chr9RksQUDR1Wk" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 2, - "tokenDecimals": 12, - "tokenSymbol": "KSM" - }, - "relay_chain": "kusama", - "para_id": 1000, - "consensusEngine": null, - "genesis": { - "raw": { - "top": { - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x08147368656c6c", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0x3a636f6465": "0x0061736d01000000018e022a60037f7f7f017f60027f7f017f60017f0060047f7f7f7f0060037f7f7f0060027f7f0060017f017f60057f7f7f7f7f0060047f7f7f7f017f60017f017e6000017f60037f7e7f017f60027f7f017e60000060027e7e0060027e7e017f60027e7e017e60047e7e7e7f017e60017e017e60037e7e7e0060017e017f60017e0060037e7e7f017e6000017e60037f7e7e0060027e7f017f60057f7f7f7f7f017f60067f7f7f7f7f7f0060037e7f7f0060087f7f7f7f7f7f7f7f0060047e7f7f7f0060047f7f7f7e0060037f7f7e0060057f7f7e7f7f0060037f7f7f017e60057f7f7f7f7e0060047f7f7e7e0060057f7f7f7e7e0060027f7e0060037f7e7e017f60047f7e7e7f0060057f7e7e7e7e0002980d2903656e76066d656d6f727902001103656e761f6578745f6c6f6767696e675f6d61785f6c6576656c5f76657273696f6e5f31000a03656e76236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f31000b03656e76286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f31000a03656e76376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f31000c03656e76236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f32000b03656e76276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f31000d03656e76296578745f64656661756c745f6368696c645f73746f726167655f636c6561725f76657273696f6e5f31000e03656e76306578745f64656661756c745f6368696c645f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31000e03656e762a6578745f64656661756c745f6368696c645f73746f726167655f6578697374735f76657273696f6e5f31000f03656e76276578745f64656661756c745f6368696c645f73746f726167655f6765745f76657273696f6e5f31001003656e762c6578745f64656661756c745f6368696c645f73746f726167655f6e6578745f6b65795f76657273696f6e5f31001003656e76286578745f64656661756c745f6368696c645f73746f726167655f726561645f76657273696f6e5f31001103656e76286578745f64656661756c745f6368696c645f73746f726167655f726f6f745f76657273696f6e5f31001203656e76276578745f64656661756c745f6368696c645f73746f726167655f7365745f76657273696f6e5f31001303656e76306578745f64656661756c745f6368696c645f73746f726167655f73746f726167655f6b696c6c5f76657273696f6e5f33001003656e76206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31001403656e761e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31001403656e761d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31001403656e761c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31000203656e761e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31000603656e762a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31001403656e761c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31001503656e761d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f31001503656e76226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f31001203656e761c6578745f73746f726167655f617070656e645f76657273696f6e5f31000e03656e76226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f31001203656e761b6578745f73746f726167655f636c6561725f76657273696f6e5f31001503656e76226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31001503656e76286578745f73746f726167655f636f6d6d69745f7472616e73616374696f6e5f76657273696f6e5f31000d03656e761c6578745f73746f726167655f6578697374735f76657273696f6e5f31001403656e76196578745f73746f726167655f6765745f76657273696f6e5f31001203656e761e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31001203656e761a6578745f73746f726167655f726561645f76657273696f6e5f31001603656e762a6578745f73746f726167655f726f6c6c6261636b5f7472616e73616374696f6e5f76657273696f6e5f31000d03656e761a6578745f73746f726167655f726f6f745f76657273696f6e5f31001703656e76196578745f73746f726167655f7365745f76657273696f6e5f31000e03656e76276578745f73746f726167655f73746172745f7472616e73616374696f6e5f76657273696f6e5f31000d03656e76196578745f6c6f6767696e675f6c6f675f76657273696f6e5f31001803656e76226578745f6f6666636861696e5f696e6465785f636c6561725f76657273696f6e5f31001503656e76206578745f6f6666636861696e5f696e6465785f7365745f76657273696f6e5f31000e03e404e2040d0d0d0d0d040406020500040700010105010501190202091a080400070101010401041b010101010401001a0101000101001c040101010300030405040405010703070502010105031b0304010502050404040d0d0d071d1b030708030407030505050403050505010101040405020405050205020505040205020405050405090502040105050a0202020103050503050305080d0d02020303030000070303040404050505020504030301000002051e03050202020101010504020404020505050505050505050505010502050501010108080804040504050405020404050404030c05040505051f050205020401040202050505050505050505050505050505050505050503050502050305050502050702040420202104040507040303030505050505050105050501010101010102052201050d0405010703050300030505050307000705050004040504031b03050d07040403031b030405010702030807040307020d040502040506060606070203020d030c01050c0505020c020c05040c05030c0d020c0502050c0c0c0305040c0c0c0505050505050505050502020204050205040c050505030203020505022305020205010404030403050205050505040405052405012503042404020202050105030501150505050202020505050505052405020203000203040501070403050505050505060d0a0505040104221b0405070403070703050404040404040501010502010501010102262603030807071d041b0701010107040405050d0104041b0d02030d05030105000104030505050403050505030401010101010105050603050403050227282900000000280407017001c601c6010619037f01418080c0000b7f0041ecaec2000b7f0041ecaec2000b07ec03110c436f72655f76657273696f6e009e0312436f72655f657865637574655f626c6f636b00a10315436f72655f696e697469616c697a655f626c6f636b00a503114d657461646174615f6d6574616461746100a7031c426c6f636b4275696c6465725f6170706c795f65787472696e73696300aa031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00ad0320426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300b0031c426c6f636b4275696c6465725f636865636b5f696e686572656e747300b4032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00b503214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200b6031f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b65797300ba032153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b65797300bb032b436f6c6c656374436f6c6c6174696f6e496e666f5f636f6c6c6563745f636f6c6c6174696f6e5f696e666f00bc030e76616c69646174655f626c6f636b00cf03195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000a5f5f646174615f656e6403010b5f5f686561705f62617365030209e802010041010bc5013b394c45d10446474dac016dd702c1049f03a704f701ff037172737475767778797a7b7c7d7e7f80018101820183018401850186018701880151d2043e3536375d3f5254555657585c5ec4044e4f6ec201c40198049a0499049b049c04bf019404d501c001c301c501c701c901cc01cd01d201d401e001de01df0185048404db0186048f049a029902dc01c9038402c803cc03dd01e504f801f9019f02a302a802a602a902a002fb03c204f804f704f504a202bf04a502aa02a102a702a4028c048b048a048904880487049304d40289039d03e502fb02ec02c102c602c502c802f1028803f6028c038503df028103c2028703e802fc02f2028b039103960394038f03980399039b03f9028d03ef02f002dd02be02c002bf02d802d502d602bb04bc04bd04be04c304d404d504d604d704d804d904da04db04dc04dd04de04df04e004c704c804c904ca04cb04cc04cd04ce04cf04d004e104e204e304e404e6040a978c29e20405001029000b0500102b000b05001028000b1700410141b8fbc100410741bffbc100412210d30400000b110041d099c2004111418080c000102d000b4701017f230041206b22032400200341146a4100360200200341bc8ec200360210200342013702042003200136021c200320003602182003200341186a36020020032002103a000ba90101027f4100210302400240200141004e0d00410121010c010b0240024002400240024002400240200228020022030d0020010d010c050b200228020422040d012001450d040b2001102f22020d010c020b2001102f2202450d012002200320041085051a200310300b200121030c020b2000200136020441012103410121010c020b41012102410021030b20002002360204410021010b20002001360200200041086a20033602000b0600200010130b0600200010120be00201067f230041206b2202240020012802002103024002402001280204220441037422050d00410021060c010b200341046a2107410021060340200728020020066a2106200741086a2107200541786a22050d000b0b0240024002400240024002400240200141146a2802000d00200621070c010b2004450d02410021054101210402402006410f4b0d00200341046a280200450d020b200620066a22072006490d010b2007417f4c0d02024020070d0041002105410121040c010b200721052007102f2204450d030b20004100360208200020043602002000200536020420022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc80c000200241086a10320d03200241206a24000f0b4100410041ac80c0001033000b102c000b102a000b41d480c0004133200241086a418881c000419881c0001034000bcc0501097f230041306b22032400200341246a2001360200200341033a002820034280808080800437030820032000360220410021042003410036021820034100360210024002400240024020022802082205450d0020022802002106200228020422072002410c6a2802002208200820074b1b2209450d01200020062802002006280204200128020c1100000d02200641086a21002002280210210a20092108034020032005411c6a2d00003a00282003200541046a290200422089370308200541186a28020021024100210441002101024002400240200541146a2802000e03010002010b2002410374210b41002101200a200b6a220b2802044101470d01200b28020028020021020b410121010b2003200236021420032001360210200541106a28020021020240024002402005410c6a2802000e03010002010b20024103742101200a20016a22012802044101470d01200128020028020021020b410121040b2003200236021c20032004360218200a20052802004103746a2202280200200341086a20022802041101000d0302402008417f6a22080d00200921040c030b200541206a2105200041046a210220002802002101200041086a2100200328022020012002280200200328022428020c110000450d000c030b0b2002280200210620022802042207200241146a2802002205200520074b1b2208450d0020022802102104200020062802002006280204200128020c1100000d0141002105200821020340200420056a2200280200200341086a200041046a2802001101000d0202402002417f6a22020d00200821040c020b200620056a2100200541086a21052003280220200041086a2802002000410c6a280200200328022428020c110000450d000c020b0b0240200720044d0d002003280220200620044103746a22052802002005280204200328022428020c1100000d010b410021050c010b410121050b200341306a240020050b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c2003418083c000360208200341023602242003200341206a360218200320033602282003200341046a360220200341086a2002103a000b7e01017f230041c0006b220524002005200136020c2005200036020820052003360214200520023602102005412c6a41023602002005413c6a41033602002005420237021c200541b48fc200360218200541043602342005200541306a3602282005200541106a3602382005200541086a360230200541186a2004103a000b8d0201047f230041206b22032400024002402000280200220041046a2802002204200041086a28020022056b2002490d00200028020021040c010b0240200520026a22062005490d00200441017422052006200520064b1b22054108200541084b1b21050240024020040d00200341003602100c010b200341106a41086a410136020020032004360214200320002802003602100b20032005200341106a102e200341086a2802002105024020032802004101460d00200020032802042204360200200041046a2005360200200041086a28020021050c020b2005450d00102a000b102c000b200420056a200120021085051a200041086a2200200028020020026a360200200341206a240041000bbf0501047f230041306b2202240020002802002100024002400240024002400240024002402001418001490d002002410036020c2001418010490d0102402001418080044f0d0020022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c040b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010c030b024020002802082203200041046a280200460d00200028020021040c020b200341016a22042003490d04200341017422052004200520044b1b22044108200441084b1b21040240024020030d00200241003602200c010b200241206a41086a410136020020022003360224200220002802003602200b200241106a2004200241206a102e200241186a2802002103024020022802104101460d00200020022802142204360200200041046a2003360200200028020821030c020b20030d030c040b20022001413f71418001723a000d2002200141067641c001723a000c410221010c010b200420036a20013a00002000200028020841016a3602080c040b0240200041046a2802002204200041086a28020022036b2001490d00200028020021040c030b200320016a22052003490d01200441017422032005200320054b1b22034108200341084b1b21030240024020040d00200241003602200c010b200241206a41086a410136020020022004360224200220002802003602200b200241106a2003200241206a102e200241106a41086a2802002103024020022802104101460d00200020022802142204360200200041046a2003360200200041086a28020021030c030b2003450d010b102a000b102c000b200420036a2002410c6a20011085051a200041086a2200200028020020016a3602000b200241306a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41bc80c000200241086a10322101200241206a240020010b6f01017f230041306b2202240020022001360204200220003602002002411c6a41023602002002412c6a41023602002002420337020c200241c082c000360208200241023602242002200241206a3602182002200241046a36022820022002360220200241086a41d882c000103a000b0b0020003502002001103c0b3401017f230041106b220224002002200136020c200220003602082002419083c000360204200241bc8ec2003602002002103d000b0d0020002802001a037f0c000b0bd20203027f017e037f230041306b22022400412721030240024020004290ce005a0d00200021040c010b412721030340200241096a20036a2205417c6a20004290ce0080220442f0b17f7e20007ca7220641ffff037141e4006e220741017441d283c0006a2f00003b00002005417e6a2007419c7f6c20066a41ffff037141017441d283c0006a2f00003b00002003417c6a2103200042ffc1d72f5621052004210020050d000b0b02402004a7220541e3004c0d00200241096a2003417e6a22036a2004a7220641ffff037141e4006e2205419c7f6c20066a41ffff037141017441d283c0006a2f00003b00000b02400240200541094a0d00200241096a2003417f6a22036a200541306a3a00000c010b200241096a2003417e6a22036a200541017441d283c0006a2f00003b00000b200141bc8ec2004100200241096a20036a412720036b10402103200241306a240020030b6f01017f230041c0006b220124002001200036020c200141346a410136020020014201370224200141cc80c2003602202001410536023c2001200141386a36023020012001410c6a360238200141106a200141206a1031410141b8fbc10041072001280210200128021810d30400000b02000b0d0042e38efeb4f5aa80b7847f0b830601067f20002802002205410171220620046a21070240024020054104710d00410021010c010b4100210802402002450d00200221092001210a03402008200a2d000041c00171418001476a2108200a41016a210a2009417f6a22090d000b0b200820076a21070b412b418080c40020061b21080240024020002802084101460d004101210a200020082001200210410d012000280218200320042000411c6a28020028020c1100000f0b02402000410c6a280200220920074b0d004101210a200020082001200210410d012000280218200320042000411c6a28020028020c1100000f0b024002400240024002402005410871450d00200028020421052000413036020420002d002021064101210a200041013a0020200020082001200210410d054100210a200920076b22012109410120002d0020220820084103461b4103710e03030201030b4100210a200920076b22052109024002400240410120002d0020220720074103461b4103710e03020100020b2005410176210a200541016a41017621090c010b410021092005210a0b200a41016a210a0340200a417f6a220a450d0420002802182000280204200028021c280210110100450d000b41010f0b2001410176210a200141016a41017621090c010b410021092001210a0b200a41016a210a02400340200a417f6a220a450d0120002802182000280204200028021c280210110100450d000b41010f0b200028020421014101210a200028021820032004200028021c28020c1100000d01200028021c210a20002802182102410021080240034020092008460d01200841016a210820022001200a280210110100450d000b4101210a2008417f6a2009490d020b200020063a00202000200536020441000f0b200028020421074101210a200020082001200210410d00200028021820032004200028021c28020c1100000d00200028021c2108200028021821004100210a0240034002402009200a470d002009210a0c020b200a41016a210a200020072008280210110100450d000b200a417f6a210a0b200a200949210a0b200a0b5401017f024002402001418080c400460d0041012104200028021820012000411c6a2802002802101101000d010b024020020d0041000f0b2000280218200220032000411c6a28020028020c11000021040b20040b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c2003419c85c000360208200341023602242003200341206a3602182003200341046a36022820032003360220200341086a2002103a000ba108010a7f20002802102103024002400240200028020822044101470d0020034101470d020c010b20034101460d002000280218200120022000411c6a28020028020c1100000f0b200120026a2105024002400240200041146a28020022060d0041002107200121030c010b41002107200121030340200322082005460d02200841016a2103024020082c00002209417f4a0d00200941ff017121090240024020032005470d004100210a200521030c010b200841026a210320082d0001413f71210a0b200941e001490d000240024020032005470d004100210b2005210c0c010b200341016a210c20032d0000413f71210b0b0240200941f0014f0d00200c21030c010b02400240200c2005470d004100210c200521030c010b200c41016a2103200c2d0000413f71210c0b200a410c742009411274418080f0007172200b41067472200c72418080c400460d030b200720086b20036a21072006417f6a22060d000b0b20032005460d00024020032c00002208417f4a0d0002400240200341016a2005470d0041002103200521060c010b200341026a210620032d0001413f7141067421030b200841ff017141e001490d000240024020062005470d0041002106200521090c010b200641016a210920062d0000413f7121060b200841ff017141f001490d00200841ff01712108200620037221030240024020092005470d00410021050c010b20092d0000413f7121050b20034106742008411274418080f0007172200572418080c400460d010b024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b20044101460d002000280218200120022000411c6a28020028020c1100000f0b0240024002402002450d004100210820022107200121030340200820032d000041c00171418001476a2108200341016a21032007417f6a22070d000b2008200028020c22054f0d014100210820022107200121030340200820032d000041c00171418001476a2108200341016a21032007417f6a22070d000c030b0b41002108200028020c22050d010b2000280218200120022000411c6a28020028020c1100000f0b41002103200520086b22072108024002400240410020002d0020220520054103461b4103710e03020100020b20074101762103200741016a41017621080c010b41002108200721030b200341016a2103024003402003417f6a2203450d0120002802182000280204200028021c280210110100450d000b41010f0b20002802042107410121030240200028021820012002200028021c28020c1100000d00200028021c2105200028021821004100210302400340024020082003470d00200821030c020b200341016a2103200020072005280210110100450d000b2003417f6a21030b200320084921030b20030bc80801057f230041f0006b220524002005200336020c20052002360208024002402001418102490d00410020016b21064180022107024003400240200720014f0d00200020076a2c000041bf7f4c0d00200721080c020b2007417f6a210820074101460d01200620076a21092008210720094101470d000b0b2005200836021420052000360210200541de85c000360218410521070c010b2005200136021420052000360210200541bc8ec200360218410021070b2005200736021c0240024002400240200220014b22070d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b200520023602202002450d0220022001460d02200141016a210903400240200220014f0d00200020026a2c000041404e0d040b2002417f6a210720024101460d0420092002462108200721022008450d000c040b0b20052002200320071b360228200541306a41146a4103360200200541c8006a41146a4104360200200541d4006a410436020020054203370234200541e485c0003602302005410236024c2005200541c8006a3602402005200541186a3602582005200541106a3602502005200541286a360248200541306a2004103a000b200541e4006a4104360200200541c8006a41146a4104360200200541d4006a4102360200200541306a41146a410436020020054204370234200541fc85c0003602302005410236024c2005200541c8006a3602402005200541186a3602602005200541106a36025820052005410c6a3602502005200541086a360248200541306a2004103a000b200221070b024020072001460d00410121094100210602400240200020076a22022c000022084100480d002005200841ff01713602240c010b200020016a220921010240200241016a2009460d00200241026a210120022d0001413f7121060b2008411f71210202400240200841ff017141e0014f0d00200620024106747221080c010b4100210020092103024020012009460d00200141016a210320012d0000413f7121000b200020064106747221010240200841ff017141f0014f0d0020012002410c747221080c010b41002108024020032009460d0020032d0000413f7121080b20014106742002411274418080f00071722008722208418080c400460d020b20052008360224410121092008418001490d00410221092008418010490d0041034104200841808004491b21090b200520073602282005200920076a36022c200541306a41146a4105360200200541ec006a4104360200200541e4006a4104360200200541c8006a41146a4106360200200541d4006a4107360200200542053702342005419c86c0003602302005410236024c2005200541c8006a3602402005200541186a3602682005200541106a3602602005200541286a3602582005200541246a3602502005200541206a360248200541306a2004103a000b41b2abc200412b2004102d000b100020012000280200200028020410430b7901037f230041206b2202240002402000200110490d002001411c6a2802002103200128021821042002411c6a4100360200200241bc8ec2003602182002420137020c2002418487c00036020820042003200241086a10320d00200041046a200110492101200241206a240020010f0b200241206a240041010bce0d02067f017e410121020240200128021841272001411c6a2802002802101101000d0041f4002103410221040240024002400240024002402000280200220541776a0e1f05010303000303030303030303030303030303030303030303040303030304020b41f2002103410221040c040b41ee002103410221040c030b200541dc00460d010b2005410b74210241002104411f2106411f210002400240034002400240200641017620046a220641027441a093c0006a280200410b74220320024f0d00200641016a21040c010b20032002460d02200621000b200020046b2106200020044b0d000c020b0b200641016a21040b02402004411e4b0d002004410274210641b105210002402004411e460d00200641a493c0006a28020041157621000b410021030240024002400240024002400240024002400240024002402004417f6a220220044b0d002002411f4f0d01200241027441a093c0006a28020041ffffff007121030b02402000200641a093c0006a280200411576220441016a460d00200520036b2102200441b105200441b1054b1b21062000417f6a210341002100034020062004460d0c2000200441ac94c0006a2d00006a220020024b0d012003200441016a2204470d000b200321040b024020044101710d000240024002400240200541ffff034b0d0041dd87c000210041002106200541087641ff0171210702400340200041026a2103200620002d000122046a21020240024020002d000022002007470d0020022006490d0a200241a3024f0d0b200641c088c0006a210003402004450d022004417f6a210420002d00002106200041016a21002006200541ff0171470d000c110b0b200020074b0d022002210620032100200341af88c000470d010c020b2002210620032100200341af88c000470d000b0b200541ffff0371210241e28ac0002104410121000340200441016a21030240024020042d000022064118744118752207417f4a0d00200341978dc000460d0b200741ff007141087420042d0001722106200441026a21040c010b200321040b200220066b22024100480d0220004101732100200441978dc000470d000c020b0b200541ffff074b0d0141a88dc000210041002106200541087641ff0171210702400340200041026a2103200620002d000122046a21020240024020002d000022002007470d0020022006490d0c200241b0014f0d0d200641f48dc0006a210003402004450d022004417f6a210420002d00002106200041016a21002006200541ff0171470d000c100b0b200020074b0d022002210620032100200341f48dc000470d010c020b2002210620032100200341f48dc000470d000b0b200541ffff0371210241a38fc0002104410121000340200441016a21030240024020042d000022064118744118752207417f4a0d00200341c692c000460d0d200741ff007141087420042d0001722106200441026a21040c010b200321040b200220066b22024100480d0120004101732100200441c692c000470d000b0b410121042000410171450d0a0c010b200541ef83384b0d09200541b5d9736a41b5db2b490d09200541e28b746a41e20b490d092005419fa8746a419f18490d09200541dee2746a410e490d09200541feffff0071419ef00a460d09200541a2b2756a4122490d09200541cb91756a410b490d09410121040b0c0a0b200541017267410276410773ad4280808080d0008421080c080b2002411f419c94c0001033000b2006200241b088c0001048000b200241a20241b088c0001042000b41b2abc200412b41988dc000102d000b2006200241b088c0001048000b200241af0141b088c0001042000b41b2abc200412b41988dc000102d000b200541017267410276410773ad4280808080d0008421080b410321040b200521030c030b200641b10541f099c0001033000b2004411f41e099c0001033000b20052103410221040b03402004210641dc002100410121024101210402400240024002400240024020060e0402010500020b02400240024002402008422088a741ff01710e06050302010006050b200842ffffffff8f608342808080803084210841f50021000c060b200842ffffffff8f608342808080802084210841fb0021000c050b413041d70020032008a72204410274411c7176410f712200410a491b20006a2100024020040d00200842ffffffff8f60834280808080108421080c050b2008427f7c42ffffffff0f832008428080808070838421080c040b200842ffffffff8f6083210841fd0021000c030b41002104200321000c030b20012802184127200128021c2802101101000f0b200842ffffffff8f60834280808080c0008421080b410321040b20012802182000200128021c280210110100450d000b0b20020b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c200341ec92c000360208200341023602242003200341206a3602182003200341046a36022820032003360220200341086a2002103a000bb70201037f23004180016b22022400024002400240024020012802002203411071450d0020002802002103410021000340200220006a41ff006a2003410f712204413072200441d7006a2004410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d02200141a8f7c1004102200220006a4180016a410020006b104021000c010b02402003412071450d0020002802002103410021000340200220006a41ff006a2003410f712204413072200441376a2004410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d03200141a8f7c1004102200220006a4180016a410020006b104021000c010b20003502002001103c21000b20024180016a240020000f0b2003418001419087c000104a000b2003418001419087c000104a000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420237020c200341a087c000360208200341023602242003200341206a3602182003200341046a36022820032003360220200341086a2002103a000bec0201017f230041f0006b220624002006200136020c2006200036020820062003360214200620023602102006410236021c200641e09ac000360218024020042802000d00200641386a41146a4103360200200641c4006a4103360200200641d8006a41146a41033602002006420437025c200641e49ac0003602582006410436023c2006200641386a3602682006200641106a3602482006200641086a3602402006200641186a360238200641d8006a2005103a000b200641206a41106a200441106a290200370300200641206a41086a200441086a29020037030020062004290200370320200641d8006a41146a4104360200200641d4006a4108360200200641386a41146a4103360200200641c4006a41033602002006420437025c200641849bc0003602582006410436023c2006200641386a3602682006200641206a3602502006200641106a3602482006200641086a3602402006200641186a360238200641d8006a2005103a000b140020002802002001200028020428020c1101000b6401027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10322100200241206a240020000b1c00200128021841de9bc000410b2001411c6a28020028020c1100000b1c00200128021841e99bc000410e2001411c6a28020028020c1100000b5b01017f230041306b220324002003200136020c20032000360208200341246a410136020020034201370214200341cc80c2003602102003410436022c2003200341286a3602202003200341086a360228200341106a2002103a000b1500200120002802002200280200200028020410430b830501077f0240024002402002450d000340024020002802082d0000450d00200028020041b19cc0004104200028020428020c110000450d0041010f0b4100210320022104024002400340200120036a210502400240200441074b0d002004450d03410021060340200520066a2d0000410a460d022004200641016a2206470d000c040b0b024002400240200541036a417c7120056b2206450d0020042006200620044b1b2107410021060340200520066a2d0000410a460d042007200641016a2206470d000b2007200441786a22084b0d020c010b200441786a2108410021070b02400340200520076a220641046a2802002209417f732009418a94a8d0007341fffdfb776a7120062802002206417f732006418a94a8d0007341fffdfb776a7172418081828478710d01200741086a220720084d0d000b0b200720044b0d070b20072004460d02200420076b21042001200720036a6a21054100210602400340200520066a2d0000410a460d012004200641016a2206470d000c040b0b200720066a21060b200620036a220641016a21030240200620024f0d00200120066a2d0000410a470d00410121060c030b200220036b2104200220034f0d000b0b41002106200221030b200028020820063a0000200028020421062000280200210702400240024020022003460d000240200220034d0d00200120036a22052c000041bf7f4a0d020b200120024100200341b89cc0001044000b200720012002200628020c110000450d0141010f0b0240200720012003200628020c110000450d0041010f0b20052c000041bf7f4c0d040b200120036a2101200220036b22020d000b0b41000f0b2007200441f89cc000104a000b200120022003200241c89cc0001044000bbc0302047f027e230041c0006b2205240041012106024020002d00040d0020002d000521070240200028020022082d0000410471450d000240200741ff01710d0041012106200828021841ad9dc00041032008411c6a28020028020c1100000d02200028020021080b41012106200541013a0017200541346a41b09dc000360200200520082902183703082005200541176a360210200829020821092008290210210a200520082d00203a00382005200a37032820052009370320200520082902003703182005200541086a360230200541086a2001200210520d01200541086a41c48fc200410210520d012003200541186a200428020c1101000d01200528023041c89dc0004102200528023428020c11000021060c010b41012106200828021841ab9dc00041a89dc000200741ff017122071b4102410320071b2008411c6a28020028020c1100000d004101210620002802002208280218200120022008411c6a28020028020c1100000d00410121062000280200220828021841c48fc20041022008411c6a28020028020c1100000d0020032000280200200428020c11010021060b200041013a0005200020063a0004200541c0006a240020000bf30101017f230041106b220224002002410036020c02400240024002402001418001490d002001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a200110522101200241106a240020010b6001017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41cc9dc000200241086a10322101200241206a240020010b0d0020002802002001200210520bfa0101017f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a200110522101200241106a240020010b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41cc9dc000200241086a10322101200241206a240020010bd40202047f027e230041c0006b2203240041012104024020002d00080d00200028020421050240200028020022062d0000410471450d00024020050d0041012104200628021841e89dc00041022006411c6a28020028020c1100000d02200028020021060b41012104200341013a0017200341346a41b09dc000360200200320062902183703082003200341176a3602102006290208210720062902102108200320062d00203a00382003200837032820032007370320200320062902003703182003200341086a3602302001200341186a200228020c1101000d01200328023041c89dc0004102200328023428020c11000021040c010b41012104200628021841ab9dc00041e79dc00020051b4102410120051b2006411c6a28020028020c1100000d0020012000280200200228020c11010021040b200020043a00082000200028020441016a360204200341c0006a240020000b840703017f027e027f02402002280200220341134c0d00024002400240200042808084fea6dee111540d002002200341706a2203360200200120036a200042808084fea6dee111802204428080fc81d9a19e6e7e20007c2200428080e983b1de1680a741ff017141e4007041017441d283c0006a2f00003b0000200228020020016a41026a20004280a094a58d1d80a741ffff037141e4007041017441d283c0006a2f00003b0000200228020020016a41046a20004280c8afa02580a741e4007041017441d283c0006a2f00003b0000200228020020016a41066a20004280c2d72f80a741e4007041017441d283c0006a2f00003b0000200228020020016a41086a200042c0843d8042e40082a741017441d283c0006a2f00003b0000200228020020016a410a6a20004290ce008042e40082a741017441d283c0006a2f00003b0000200228020020016a410c6a200042e40080220542e40082a741017441d283c0006a2f00003b00002005429c7f7e20007ca72103410e21060c010b024020004280c2d72f5a0d00200021040c020b2002200341786a2203360200200120036a20004280c2d72f8022044280bea8507e20007ca7220341c0843d6e41ff017141e4007041017441d283c0006a2f00003b0000200228020020016a41026a20034190ce006e41ffff037141e4007041017441d283c0006a2f00003b0000200228020020016a41046a200341e4006e220641e4007041017441d283c0006a2f00003b00002006419c7f6c20036a2103410621060b2001200228020020066a6a200341017441d283c0006a2f00003b00000b024002402004a722064190ce004f0d00200621030c010b20022002280200417c6a2203360200200120036a20064190ce006e220341f0b17f6c20066a220641ffff037141e4006e220741017441d283c0006a2f00003b0000200228020020016a41026a2007419c7f6c20066a41ffff037141017441d283c0006a2f00003b00000b0240200341ffff0371220641e400490d0020022002280200417e6a2207360200200120076a200641e4006e2206419c7f6c20036a41ffff037141017441d283c0006a2f00003b0000200621030b0240200341ffff037141094b0d0020022002280200417f6a2206360200200120066a200341306a3a00000f0b20022002280200417e6a2206360200200120066a200341ffff037141017441d283c0006a2f00003b00000f0b41ee9dc000411c418c9ec000102d000b6c01017f230041306b2203240020032001360204200320003602002003411c6a41023602002003412c6a41023602002003420337020c200341a09ec000360208200341023602242003200341206a360218200320033602282003200341046a360220200341086a2002103a000b0b002000280200200110490b1c002001280218418bf6c10041052001411c6a28020028020c1100000b2e01017f230041106b220224002002200028020028020036020c2002410c6a200110492101200241106a240020010bc916041d7f017e017f017e230041f0036b22042400200441c8016a41086a220541002802b8f541360200200441002902b0f5413703c80102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001200141e0006a2206200441c8016a10600d004130102f22070d010c180b200441186a2208200141f8006a290000370300200441106a2209200141f0006a290000370300200441086a220a200141e8006a290000370300200420012900603703002003410174210b2004410772210c200441c8016a41186a210d200441c8016a410c6a210e200441c8016a41206a210f4100211041002111410021120340201241017621060240024020124101710d00200620034b0d04200441003a00d001200420063602cc01200420023602c8010c010b200620034b0d04200620034f0d05200441013a00d001200420023602c801200420063602cc012004200220066a2d000041f001713a00d1010b200441206a20012004200441c8016a10610240200428022022130d00200441c8016a41186a2206200441186a290300370300200441c8016a41106a2210200441106a290300370300200441c8016a41086a2214200441086a290300370300200420042903003703c8014130102f2207450d19200720042903c801370001200720114100473a0000200741096a2014290300370000200741116a2010290300370000200741196a20062903003700000c160b20042802242115200441c8016a20132004280228106220042d00c8014101460d12201141016a2111034020042802e401211620042802e001211720042802dc01211820042802d801211920042802d401211420042802d001211a20042802cc012106200441206a200f41a8011085051a200428029403211b200428029003211c4100211d410021070240024002400240024020060e051a120001021a0b41002107410021060240201441017420196b221e200b20106b221b201b201e4b1b221f450d00410021060340201020066a221c410176221b20034f0d0c201920066a2220410176221d20144f0d0d2002201b6a2d0000221b410f71201b41f00171410476201c4101711b201a201d6a2d0000221b410f71201b41047620204101711b470d01201f200641016a2206470d000b201f21060b2006201e470d12201e21060c030b200420163602dc01200420173602d801200420183602d401200420193602d001200420143602cc012004201a3602c801200d200441206a41a8011085051a0240200b2010460d002010410176220620034f0d0c200441c8016a200220066a2d00002206410f71200641047620104101711b410c6c6a220628020022184102470d020c100b201c450d0f201b417f4c0d1b02400240201b0d00410121070c010b201b102f2207450d1d0b2007201c201b1085051a201bad222142208620218421210c180b20042802a003211e200428029c0321222004280298032106200420163602d001200420173602cc01200420183602c801200e200441206a41a8011085051a20042006360284032004201b360280032004201c3602fc0241002107410021060240201441017420196b2216200b20106b2217201720164b1b221f450d00410021060340201020066a221c410176221b20034f0d0d201920066a2220410176221d20144f0d0e2002201b6a2d0000221b410f71201b41f00171410476201c4101711b201a201d6a2d0000221b410f71201b41047620204101711b470d01201f200641016a2206470d000b201f21060b024020062016460d000c150b024020172016460d00201020166a2214410176220620034f0d0e200441c8016a200220066a2d00002206410f71200641047620144101711b410c6c6a221428020022184102460d15201641016a211e201641016a210620142802042117201441086a28020021160c020b024020220d000c150b201e417f4c0d1a02400240201e0d00410121070c010b201e102f2207450d1c0b20072022201e1085051a201ead222142208620218421210c140b20062802042117200641086a28020021164101211e410121060b200620126a21122010201e6a211002402018450d00200441c8016a20172016106220042d00c8014101460d140c010b0b0240024020164120460d002016417f4c0d190240024020160d00410121060c010b2016102f2206450d1b0b20062017201610850521064130102f2207450d1a200741043a0000200720042903003700012007201636002c2007201636002820072006360024200741096a200a290300370000200741116a2009290300370000200741196a20082903003700000c010b200441c8016a41026a41003a0000200441003b01c80120172f00002106200441cc036a41026a201741026a2d00003a00002017411f6a2d00002114201741176a29000021212017280003210720172900072123200441d0036a41086a22192017410f6a290000370300200441d0036a41106a221a2021370300200441d0036a41186a221b20143a0000200420063b01cc03200420233703d003200d201b2d00003a0000200441c8016a41106a201a29030037030020052019290300370300200420042903d0033703c8010b200441c8036a41026a2206200441cc036a41026a2d00003a0000200441a8036a41086a22142005290300370300200441a8036a41106a2219200441c8016a41106a290300370300200441a8036a41186a221a200d280200360200200420042f01cc033b01c803200420042903c8013703a80320164120470d13200c20042903a803370000200c41086a2014290300370000200c41106a2019290300370000200c41186a201a2d00003a0000200420042f01c8033b010020042007360003200420062d00003a00022015450d00201310300c000b0b200741003a000020072006290000370001200741096a200641086a290000370000200741116a200641106a290000370000200741196a200641186a2900003700000c130b2006200341a099c2001042000b2006200341b099c2001042000b2006200341c099c2001033000b201b200341e098c2001033000b201d201441e098c2001033000b2006200341e098c2001033000b201b200341e098c2001033000b201d201441e098c2001033000b2006200341e098c2001033000b410021070c080b41002107201441017420196b200b20106b221f470d00410021060240201f450d00410021060340201920066a221c410176221b20144f0d03201020066a2220410176221d20034f0d04201a201b6a2d0000221b410f71201b41f00171410476201c4101711b2002201d6a2d0000221b410f71201b41047620204101711b470d01201f200641016a2206470d000c050b0b2006201f460d030b0c030b201b201441e098c2001033000b201d200341e098c2001033000b2017417f4c0d060240024020170d00410121070c010b2017102f2207450d080b2007201820171085051a2017ad222142208620218421210b4100211d0c020b20042d00c90121064130102f2207450d05200741033a000020072004290300370001200720063a0021200741096a200441086a290300370000200741116a200441106a290300370000200741196a200441186a2903003700000b4101211d0b02402015450d00201310300b201d0d000240024020070d004200212142002123410021060c010b20214220882223a72210417f4c0d030240024020100d00410121060c010b2010102f2206450d050b2006200720101085051a02402021a7450d00200710300b20214280808080708321210b2000200636020420004100360200200041086a20232021843702000c010b02400240024020072d00000e0402020002010b200741086a280200450d01200741046a28020010300c010b200741286a280200450d00200741246a28020010300b20071030200041013602000b200441f0036a24000f0b102c000b102a000bce0201027f230041206b2203240002400240024002400240200120004180016a41201088050d004101102f2201450d03200141003a00000c010b0240024020012000413c6a41201088050d00200041386a2802002204417f4c0d0520002802302100024020040d00410121014101200020041085051a0c020b2004102f2201450d042001200020041085051a0c010b200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a2900003703002003200129000037030041002101024020002003106722000d000c010b0240200028020c41014e0d000c010b20002802082204417f4c0d04200028020021000240024020040d00410121010c010b2004102f2201450d040b2001200020041085051a0b024020010d00410021010c020b2004450d010b200110300b200341206a240020014100470f0b102a000b102c000bda0201027f230041206b220424000240024002400240200220014180016a41201088050d004101102f2202450d02200042818080801037020420002002360200200241003a00000c010b0240024020022001413c6a41201088050d00200141386a2802002202417f4c0d0420012802302101024020020d00410121054101200120021085051a0c020b2002102f2205450d032005200120021085051a0c010b200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a2900003703002004200229000037030041002105024020012004106722010d000c010b0240200128020c41014e0d000c010b20012802082202417f4c0d03200128020021010240024020020d00410121050c010b2002102f2205450d030b2005200120021085051a0b2000200236020420002005360200200041086a20023602000b200441206a24000f0b102a000b102c000ba60b03027f027e0c7f230041d0066b2203240041002104200341003602880520032002360284052003200136028005420321050240024020020d0042002106410021070c010b41012107200341013602880542002106024020012d000022080d00420021050c010b0240024002400240024002400240024002400240200841c00171220941c001460d0002402009418001460d00200941c000470d0b2008413f712208413f470d05410221074141210803402007417f6a20024f0d0320032007360288050240200120076a417f6a2d0000220941ff01460d00200920086b21080c0c0b200841817e6a2108200741016a2207418302470d000b41ffff03210841820221070c0a0b2008413f712208413f470d05410221074141210803402007417f6a20024f0d0320032007360288050240200120076a417f6a2d0000220941ff01460d00200920086b21080c0a0b200841817e6a2108200741016a2207418302470d000b41ffff03210841820221070c080b2008413f712208413f470d05410221074141210803402007417f6a20024f0d0320032007360288050240200120076a417f6a2d0000220941ff01460d00200920086b21080c080b200841817e6a2108200741016a2207418302470d000b41ffff03210841820221070c060b2007417f6a21070c080b2007417f6a21070c070b2007417f6a21070c060b410121070c040b410121070c020b410121070b2008ad422086428002842106420121050c020b2008ad4220862106420121050c010b2008ad4220862106420221050b2006422088a7210a410121094101210802400240024002400240024002400240024002402005200684a741ff01710e0405000107050b200a410171220b450d03200720024f0d0141002108200120076a2d00004110490d030c060b200a410171220b450d010240200720024f0d0041002108200120076a2d00004110490d020c060b2007200241d08dc1001033000b2007200241e08dc1001033000b2007200a41016a4101766a220c20024b0d022003200c36028805200341186a20034180056a106f20032802180d0241012108200328028805220d200328021c6a220e2003280284054b0d032003200e36028805410121040c010b2007200a41016a4101766a220c20024b22080d012003200c3602880520080d01200c41026a220820024b0d012003200836028805200c417e4f0d042001200c6a2f000021044100210a4100210d0240200642800283500d00200341106a20034180056a106f20032802100d0241012108200328028805220e20032802146a220f2003280284054b0d032003200f360288054101210d0b200341023602c406200341023602b806200341023602ac06200341023602a00620034102360294062003410236028806200341023602fc05200341023602f005200341023602e405200341023602d805200341023602cc05200341023602c005200341023602b405200341023602a8052003410236029c05200341023602900520034190056a2108200441ffff03712110034002402010200a410f7176410171450d00200341086a20034180056a106f20032802080d032003280288052211200328020c22126a22042003280284054b0d03200841086a2004360200200841046a20113602002008201241204736020020032004360288050b2008410c6a2108200a41016a220a4110470d000b200341c0036a20034190056a41c0011085051a410421040b20034180026a200341c0036a41c0011085051a2003412c6a200b360200200341286a200c360200200320073602242003413c6a20034180026a41c0011085051a200341386a200f360200200341346a200e360200200341306a200d36020020032004360220200041046a200341206a200120021070410021090c020b410121080b20034180026a200341c0036a41c0011085051a200020083a00010b200020093a0000200341d0066a24000f0b200c200841c08dc1001048000baf0201047f230041106b22022400024002402001280208220341046a2204417f4c0d002001280200210102400240024002400240024020040d0020024100360208200242013703000c010b2004102f2205450d06200241003602082002200436020420022005360200200341c000490d01200341808001490d022003418080808004490d030b200241033a000c20022002410c6a410110642002200336020c20022002410c6a410410640c030b200220034102743a000c20022002410c6a410110640c020b200220034102744101723b010c20022002410c6a410210640c010b2002200341027441027236020c20022002410c6a410410640b20022001200310642000200228020022032002280208106502402002280204450d00200310300b200241106a24000f0b102c000b102a000b880201047f230041206b2203240002400240200041046a2802002204200041086a28020022056b2002490d00200028020021040c010b0240200520026a22062005490d00200441017422052006200520064b1b22054108200541084b1b21050240024020040d00200341003602100c010b200341106a41086a410136020020032004360214200320002802003602100b200320054101200341106a1069200341086a2802002105024020032802004101460d00200020032802042204360200200041046a2005360200200041086a28020021050c020b2005450d00102a000b102c000b200420056a200120021085051a200041086a2200200028020020026a360200200341206a24000b7201027f2002ad4220862001ad84100f2101200041186a22024200370000200041106a22034200370000200041086a2204420037000020004200370000200020012900003700002004200141086a2900003700002003200141106a2900003700002002200141186a290000370000200110300bee0101027f230041206b2202240002404104102f2203450d0020024204370204200220033602004120102f2203450d002002422037021420022003360210200241106a200141046a412010642002200228021022032002280218106402402002280214450d00200310300b200220012802003602102002200241106a410410644120102f2203450d002002422037021420022003360210200241106a200141246a412010642002200228021022012002280218106402402002280214450d00200110300b2000200228020022012002280208106502402002280204450d00200110300b200241206a24000f0b102a000bd30303017f047e097f230041306b22022400200241206a20002903182000290308852203200141186a29000085420020002903102204200029030022058522062001290010854200108405200241106a200141086a29000020038542002001290000200685420010840520022004420020042004200542adfed5e4d485fda8d8007e200241206a41086a2903002002290320857c42a0cbbf9599b5a19f0a7c85421789200241106a41086a2903002002290310857c8542178922034200108405200041246a2802002207200041206a2802002208200241086a290300200229030085200389a722007122096a280000220a200041197641818284086c220b732200417f73200041fffdfb776a7141808182847871210c200941046a200871210d4104210e02400340200d21000240200c0d000240200a200a4101747141808182847871450d00410021000c030b200b200720006a280000220a73220c417f73200c41fffdfb776a7141808182847871210c20082000200e6a41046a71210d200e41046a210e200021090c010b200c68210f2000210d200c417f6a200c71210c20012007410020082009200f4103766a716b41306c6a41506a220041201088050d000b0b200241306a2400200041206a410020001b0be30605027f017e037f027e027f230041206b220524002005200120022003105f024002400240024020052802004101460d00024002400240024020052802042206450d004100210302400240200541086a2903002207422088a722010d000c010b2001417f6a21020240024020062d0000220841037122094103460d00200641016a210a02400240024020090e03000102000b200841027621080c030b024020020d000c040b200a2d0000410874200872220841ffff0371418002490d032001417e6a2102200641026a210a200841fcff037141027621080c020b0240200241034f0d000c030b20062f0001200641036a2d000041107472410874200872220841ffff034d0d022001417c6a2102200641046a210a200841027621080c010b0240200841034d0d000c020b0240200241044f0d000c020b20062800012208418080808004490d012001417b6a2102200641056a210a0b02400240200820024102762201200120084b1b22014102742203417f4c0d000240024020010d00410421030c010b2003102f2203450d0a0b2001ad210b2008450d02034020024104490d02200a280000210902400240200b422088220ca72201200ba7470d00200141016a220d2001490d032001410174220e200d200d200e491b220d4104200d41044b1b220d41ffffffff0371200d46410274210e200d410274210d0240024020010d00200541003602000c010b20054104360208200520033602002005200c4202863e02040b200541106a200d200e200510692005280218210d20052802104101460d0120052802142103200b42808080807083200d410276ad84210b0b2002417c6a2102200a41046a210a200320014102746a2009360200200b4280808080107c210b2008417f6a22080d010c040b0b200d0d090b102c000b0240200b42ffffffff0383500d00200310300b410021030b02402007a7450d00200610300b2003450d0220042802002201450d01200428020441ffffffff0371450d01200110300c010b20042802002203450d022004290204210b0b200041086a200b370200200041046a2003360200200041003a00000c050b20004181023b01000c020b200041023a0001200041013a00000c030b200041013b01000b20042802002201450d01200441046a28020041ffffffff0371450d01200110300c010b102a000b200541206a24000bc70101027f0240024002400240024002402002450d0020014100480d01024002400240200328020022040d002001450d010c050b200328020422050d0120010d040b200221030c050b2001102f2203450d032003200420051085051a200410300c040b2000200136020420004101360200200041086a41003602000f0b20004101360200200041086a41003602000f0b2001102f22030d010b2000200136020441012103200221010c010b20002003360204410021030b20002003360200200041086a20013602000b990603017f017e067f230041a0016b22052400200541f8006a200120022003105f0240024002400240024020052802784101460d00200528027c2201450d01024020054180016a2903002206422088a722044104490d002004417c7122024104460d0020024108460d002004417c712202410c460d0020024110460d0020044114460d00200128000021032001280004210720012800082108200128000c21092001280010210a20052004416b6a3602542005200141156a360250410021020240024020012d00140e020100020b200541f8006a200541d0006a106b4101210220052d00784101460d01200541f0006a20054191016a290000370300200541e8006a20054189016a290000370300200541e0006a20054181016a290000370300200520052900793703580b200541286a41186a2204200541d8006a41186a290300370300200541286a41106a220b200541d8006a41106a290300370300200541286a41086a220c200541d8006a41086a2903003703002005200529035837032802402006a7450d00200110300b2005411f6a200541286a411f6a280000360000200541186a2004290300370300200541106a200b290300370300200541086a200c290300370300200520052903283703000c030b02402006a7450d00200110300b20004181023b01000c040b200041013b01000c030b200541086a2004411d6a290000370300200541106a200441256a290000370300200541186a2004412d6a2900003703002005411f6a200441346a2800003600002005200429001537030020042d001422024102460d012004280210210a200428020c21092004280208210820042802042107200428020021030b200041186a20023a0000200041146a200a360200200041106a20093602002000410c6a2008360200200041086a2007360200200041046a2003360200200041196a2005290300370000200041216a200541086a290300370000200041296a200541106a290300370000200041316a200541186a290300370000200041386a2005411f6a280000360000200041003a00000c010b200041023a0001200041013a00000b200541a0016a24000bdb0301097f230041c0006b220241106a41047221032001280204210441002105024003402004450d01200128020022062d0000210720012004417f6a22043602042001200641016a360200200320056a20073a00002002200541016a22063602102006210520064120470d000b200241086a41026a22012002411d6a2d00003a00002002200241106a41196a220428000036023820022002412c6a28000036003b200220022f01143b010c200220022d00163a000e2002200241106a410b6a2f00003b0108200241306a2802002105200241256a28000021062002411e6a2801002107200228003b210320022800172108200241386a41026a2209200241246a2d00003a00002002200241106a41126a2f01003b0138200241046a41026a220a2002412b6a2d00003a0000200220042f00003b0104200041046a2008360000200041036a20022d000e3a0000200020022f010c3b00012000410b6a2007360000200041086a20022f01083b00002000410a6a20012d00003a0000200041126a20063600002000410f6a20022f01383b0000200041116a20092d00003a0000200041166a20022f01043b0000200041186a200a2d00003a00002000411d6a2005360000200041196a2003360000200041003a00000f0b200041013a00000b950201067f024020002802202201450d0002402000412c6a280200450d00200041246a280200220241046a2103200120026a41016a21042002280200417f73418081828478712101024003400240024020010d000340200320044f0d04200241c07e6a210220032802002101200341046a220521032001418081828478712201418081828478460d000b2001418081828478732201417f6a2001712106200521030c010b2001417f6a20017121060b2001682105200621012002410020054103766b41306c6a220541746a280200450d00200541706a2802001030200621010c000b0b200028022021010b200041246a280200200141016aad42307ea76b10300b0240200041346a280200450d00200028023010300b0bb00b01027f230041106b220224000240024002400240024002400240024020002d00000e0701020304050600010b2002200128021841ec9fc000410b2001411c6a28020028020c1100003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41f89fc000105921032002200041086a36020c4101210120032002410c6a41f89fc000105921032002200041016a36020c20032002410c6a4188a0c00010591a20022d000821000240200228020422030d00200021010c070b200041ff01710d06024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841ea9dc00041012000411c6a28020028020c1100000d070b2002280200220128021841eb9dc00041012001411c6a28020028020c11000021010c060b20012802184198a0c000410c2001411c6a28020028020c11000021010c050b2002200128021841a4a0c00041062001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4188a0c00010591a20022d000821000240200228020422030d00200021010c050b200041ff01710d04024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841ea9dc00041012000411c6a28020028020c1100000d050b2002280200220128021841eb9dc00041012001411c6a28020028020c11000021010c040b2002200128021841aaa0c000410a2001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4188a0c00010591a20022d000821000240200228020422030d00200021010c040b200041ff01710d03024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841ea9dc00041012000411c6a28020028020c1100000d040b2002280200220128021841eb9dc00041012001411c6a28020028020c11000021010c030b2002200128021841b4a0c00041162001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4188a0c00010591a20022d000821000240200228020422030d00200021010c030b200041ff01710d02024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841ea9dc00041012000411c6a28020028020c1100000d030b2002280200220128021841eb9dc00041012001411c6a28020028020c11000021010c020b2002200128021841caa0c00041172001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4188a0c00010591a20022d000821000240200228020422030d00200021010c020b200041ff01710d01024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841ea9dc00041012000411c6a28020028020c1100000d020b2002280200220128021841eb9dc00041012001411c6a28020028020c11000021010c010b2002200128021841e1a0c00041162001411c6a28020028020c1100003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a4188a0c00010591a20022d000821000240200228020422030d00200021010c010b200041ff01710d00024020034101470d0020022d000941ff0171450d00200228020022002d00004104710d0041012101200028021841ea9dc00041012000411c6a28020028020c1100000d010b2002280200220128021841eb9dc00041012001411c6a28020028020c11000021010b200241106a2400200141ff01714100470b690002400240024020002802002d00000e03010200010b200128021841f7a0c00041062001411c6a28020028020c1100000f0b200128021841fda0c00041052001411c6a28020028020c1100000f0b20012802184182a1c00041062001411c6a28020028020c1100000b880301077f410121020240024002400240024002402001280208220341016a2204200128020422054d0d000c010b200320054f0d012001280200220620036a2d00002107200120043602080240200741037122084103460d0002400240024020080e03000102000b20074102762108410021020c030b0240200341026a220320054d0d000c030b200120033602082004417f460d04200620046a2d0000410874200772220141ffff0371418002490d02200141fcff03714102762108410021020c020b200341046a220320054b0d01200120033602082004417d4f0d04200620046a22012f0000200141026a2d000041107472410874200772220141808004492102200141027621080c010b0240200741034d0d000c010b200341056a220320054b0d00200120033602082004417c4f0d04200620046a28000022084180808080044921020b20002008360204200020023602000f0b2003200541dc92c2001033000b417f200341ec91c2001048000b2004200341ec91c2001048000b2004200341ec91c2001048000bd20c01087f230041c0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802000e050400010203040b200141086a2802002205200141046a2802002206490d04200520034b0d05200141146a280200220720012802102208490d06200720034b0d072001410c6a28020021092000200220066a36020420004101360200200041146a200720086b360200200041106a200220086a3602002000410c6a2009360200200041086a200520066b3602000c150b200141086a2802002207200141046a2802002208490d07200720034b0d08200141186a2802002105200141146a28020021062001410c6a28020021090240024020012802104101470d0020052006490d0b4101210a200520034d0d012005200341d49bc2001042000b20052006490d0b4100210a200520034b0d0c0b2000200220086a36020420004102360200200041186a200520066b360200200041146a200220066a360200200041106a200a3602002000410c6a2009360200200041086a200720086b3602000c140b200441023602b401200441023602a8012004410236029c0120044102360290012004410236028401200441023602782004410236026c2004410236026020044102360254200441023602482004410236023c2004410236023020044102360224200441023602182004410236020c20044102360200200141106a210b410021050340410221070240200b20056a2206280200410246220a0d0041002006200a1b220741086a2802002106200728020421080240024020072802004101470d0020062008490d0f41012107200620034d0d012006200341d49bc2001042000b20062008490d0f41002107200620034b0d100b200220086a2109200620086b21080b200420056a22062007360200200641086a2008360200200641046a20093602002005410c6a220541c001460d130c000b0b200441023602b401200441023602a8012004410236029c0120044102360290012004410236028401200441023602782004410236026c2004410236026020044102360254200441023602482004410236023c2004410236023020044102360224200441023602182004410236020c200441023602002001411c6a210b410021050340410221070240200b20056a2206280200410246220a0d0041002006200a1b220741086a2802002106200728020421080240024020072802004101470d0020062008490d1141012107200620034d0d012006200341d49bc2001042000b20062008490d1141002107200620034b0d120b200220086a2109200620086b21080b200420056a22062007360200200641086a2008360200200641046a20093602002005410c6a220541c001460d110c000b0b200041003602000c110b2006200541c49cc2001048000b2005200341c49cc2001042000b2008200741d49cc2001048000b2007200341d49cc2001042000b2008200741c49cc2001048000b2007200341c49cc2001042000b2006200541d49bc2001048000b2006200541e49bc2001048000b2005200341e49bc2001042000b2008200641d49bc2001048000b2008200641e49bc2001048000b2006200341e49bc2001042000b2008200641d49bc2001048000b2008200641e49bc2001048000b2006200341e49bc2001042000b02400240024002400240024020012802104101460d00410021070c010b200141186a2802002205200141146a2802002206490d01200520034b0d02200520066b2108200220066a21070b200141086a2802002205200141046a2802002206490d02200520034b0d03200041086a200520066b3602002000200220066a3602042000410c6a2001410c6a280200360200200041106a200441c0011085051a200041d4016a2008360200200041d0016a2007360200200041043602000c050b2006200541f49cc2001048000b2005200341f49cc2001042000b2006200541c49cc2001048000b2005200341c49cc2001042000b0240024020012802044101460d00410021050c010b2001410c6a2802002205200141086a2802002207490d02200520034b0d03200520076b2106200220076a21050b200041046a200441c0011085051a200041c8016a2006360200200041c4016a2005360200200041033602000b200441c0016a24000f0b2007200541e49cc2001048000b2005200341e49cc2001042000b8b0702047f017e230041306b2206240002400240024002400240410028028cad4241016a220741004c0d0002404100280290ad424101460d00200641086a4100280288ad42110200200641186a41086a200641086a41086a29030037030020062006290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422208450d004100280298ad422107200841027421080340200728020022092009280200417f6a3602000240200728020022092802000d00200941046a22092009280200417f6a3602002007280200220941046a2802000d00200910300b200741046a21072008417c6a22080d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002006290318370294ad424100200641206a29030037029cad424100410028028cad42220741016a36028cad42200741026a220741004c0d030b4100200736028cad424100280294ad42220841016a220741004c0d0341002007360294ad420240024041002802a0ad422207450d0020074102744100280298ad426a417c6a280200220728020041016a220841014b0d0100000b41002008360294ad424100410028028cad42417f6a36028cad424188a1c000412441aca1c0001050000b2007200836020041004100280294ad42417f6a360294ad4220072802080d042007417f360208200641186a410472200728020c2001200220072802102802101103002007200728020841016a36020820072007280200417f6a220836020002400240024020080d00200741046a22082008280200417f6a220836020020080d01200710304100410028028cad42417f6a36028cad420c020b4100410028028cad42417f6a36028cad420c010b4100410028028cad42417f6a36028cad420b02400240200628021c22080d00410021090c010b20032008200641206a290300220a422088a72207200520072005491b22096a2004200720096b2209200920044b1b1085051a41012109200aa7450d00200810300b2000200736020420002009360200200641306a24000f0b41aeaac0004118200641286a41ac9fc00041d8aac0001034000b41b082c2004110200641286a41bc9fc00041f8aac0001034000b41aeaac0004118200641286a41ac9fc0004188abc0001034000b41aeaac0004118200641286a41ac9fc0004184acc0001034000b41b082c2004110200641286a41bc9fc0004194acc0001034000b860701057f230041306b22042400024002400240024002400240024002400240410028028cad42220541016a220641004c0d0002404100280290ad424101460d00200441086a4100280288ad42110200200441186a41086a200441086a41086a29030037030020042004290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422205450d004100280298ad422106200541027421050340200628020022072007280200417f6a3602000240200628020022072802000d00200741046a22072007280200417f6a3602002006280200220741046a2802000d00200710300b200641046a21062005417c6a22050d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002004290318370294ad424100200441206a29030037029cad424100410028028cad42220641016a220536028cad42200641026a220641004c0d030b4100200636028cad424100280294ad42220741016a220641004c0d0341002006360294ad4241002802a0ad422206450d0820064102744100280298ad426a417c6a280200220628020041016a220541014d0d042006200536020041004100280294ad42417f6a360294ad4220062802080d052006417f3602082001417f4c0d06200628020c2107200628021021080240024020010d00410121050c010b2001102f2205450d080b2004200136020c200420053602082005200020011085051a200420013602102003417f4c0d064101210502402003450d002003102f2205450d080b2005200220031085052105200441206a20033602002004200336021c200420053602182007200441086a200441186a200828024c1104002006200628020841016a36020820062006280200417f6a2205360200024020050d00200641046a22052005280200417f6a220536020020050d00200610300b4100410028028cad42417f6a36028cad42200441306a24000f0b41aeaac0004118200441286a41ac9fc00041d8aac0001034000b41b082c2004110200441286a41bc9fc00041f8aac0001034000b41aeaac0004118200441286a41ac9fc0004188abc0001034000b41aeaac0004118200441286a41ac9fc0004184acc0001034000b00000b41b082c2004110200441286a41bc9fc0004194acc0001034000b102c000b102a000b4100200536028cad4241002007360294ad424188a1c000412441aca1c0001050000be70601057f230041306b2203240002400240024002400240024002400240410028028cad4241016a220441004c0d0002404100280290ad424101460d00200341086a4100280288ad42110200200341186a41086a200341086a41086a29030037030020032003290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422205450d004100280298ad422104200541027421050340200428020022062006280200417f6a3602000240200428020022062802000d00200641046a22062006280200417f6a3602002004280200220641046a2802000d00200610300b200441046a21042005417c6a22050d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002003290318370294ad424100200341206a29030037029cad424100410028028cad42220441016a36028cad42200441026a220441004c0d030b4100200436028cad424100280294ad42220541016a220441004c0d0341002004360294ad4202400240024041002802a0ad422207450d0020074102744100280298ad426a417c6a280200220428020041016a220541014b0d0100000b41002005360294ad420c010b200420053602004100210641004100280294ad42417f6a360294ad4220042802080d052004417f360208200341186a200428020c20012002200428021028021011030002400240200328021822010d000c010b200341206a2802002205417f4c0d070240024020050d00410121060c010b2005102f2206450d090b2006200120051085051a200328021c450d00200110300b2004200428020841016a36020820042004280200417f6a220136020020010d00200441046a22012001280200417f6a220136020020010d00200410300b4100410028028cad42417f6a36028cad422007450d072000200536020420002006360200200041086a2005360200200341306a24000f0b41aeaac0004118200341286a41ac9fc00041d8aac0001034000b41b082c2004110200341286a41bc9fc00041f8aac0001034000b41aeaac0004118200341286a41ac9fc0004188abc0001034000b41aeaac0004118200341286a41ac9fc0004184acc0001034000b41b082c2004110200341286a41bc9fc0004194acc0001034000b102c000b102a000b4188a1c000412441aca1c0001050000bf20501047f230041306b220224000240024002400240024002400240410028028cad42220341016a220441004c0d0002404100280290ad424101460d00200241086a4100280288ad42110200200241186a41086a200241086a41086a29030037030020022002290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422203450d004100280298ad422104200341027421030340200428020022052005280200417f6a3602000240200428020022052802000d00200541046a22052005280200417f6a3602002004280200220541046a2802000d00200510300b200441046a21042003417c6a22030d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002002290318370294ad424100200241206a29030037029cad424100410028028cad42220441016a220336028cad42200441026a220441004c0d030b4100200436028cad424100280294ad42220541016a220441004c0d0341002004360294ad4241002802a0ad422204450d0620044102744100280298ad426a417c6a280200220428020041016a220341014d0d042004200336020041004100280294ad42417f6a360294ad4220042802080d052004417f360208200428020c20002001200428021028023011000021032004200428020841016a36020820042004280200417f6a2205360200024020050d00200441046a22052005280200417f6a220536020020050d00200410300b4100410028028cad42417f6a36028cad42200241306a240020030f0b41aeaac0004118200241286a41ac9fc00041d8aac0001034000b41b082c2004110200241286a41bc9fc00041f8aac0001034000b41aeaac0004118200241286a41ac9fc0004188abc0001034000b41aeaac0004118200241286a41ac9fc0004184acc0001034000b00000b41b082c2004110200241286a41bc9fc0004194acc0001034000b4100200336028cad4241002005360294ad424188a1c000412441aca1c0001050000bca0601057f230041306b22022400024002400240024002400240024002400240410028028cad42220341016a220441004c0d0002404100280290ad424101460d00200241086a4100280288ad42110200200241186a41086a200241086a41086a29030037030020022002290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422203450d004100280298ad422104200341027421030340200428020022052005280200417f6a3602000240200428020022052802000d00200541046a22052005280200417f6a3602002004280200220541046a2802000d00200510300b200441046a21042003417c6a22030d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002002290318370294ad424100200241206a29030037029cad424100410028028cad42220441016a220336028cad42200441026a220441004c0d030b4100200436028cad424100280294ad42220541016a220441004c0d0341002004360294ad4241002802a0ad422204450d0820044102744100280298ad426a417c6a280200220428020041016a220341014d0d042004200336020041004100280294ad42417f6a360294ad4220042802080d052004417f3602082001417f4c0d06200428020c2105200428021021064101210302402001450d002001102f2203450d080b2002200136020c200220033602082003200020011085051a20022001360210200241003602182005200241086a200241186a200628024c1104002004200428020841016a36020820042004280200417f6a2203360200024020030d00200441046a22032003280200417f6a220336020020030d00200410300b4100410028028cad42417f6a36028cad42200241306a24000f0b41aeaac0004118200241286a41ac9fc00041d8aac0001034000b41b082c2004110200241286a41bc9fc00041f8aac0001034000b41aeaac0004118200241286a41ac9fc0004188abc0001034000b41aeaac0004118200241286a41ac9fc0004184acc0001034000b00000b41b082c2004110200241286a41bc9fc0004194acc0001034000b102c000b102a000b4100200336028cad4241002005360294ad424188a1c000412441aca1c0001050000b930601047f230041306b22012400024002400240024002400240410028028cad4241016a220241004c0d0002404100280290ad424101460d00200141086a4100280288ad42110200200141186a41086a200141086a41086a29030037030020012001290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422203450d004100280298ad422102200341027421030340200228020022042004280200417f6a3602000240200228020022042802000d00200441046a22042004280200417f6a3602002002280200220441046a2802000d00200410300b200241046a21022003417c6a22030d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002001290318370294ad424100200141206a29030037029cad424100410028028cad42220241016a36028cad42200241026a220241004c0d030b4100200236028cad424100280294ad42220341016a220241004c0d0341002002360294ad4202400240024041002802a0ad422202450d0020024102744100280298ad426a417c6a280200220228020041016a220341014b0d0100000b41002003360294ad42200141003602180c010b2002200336020041004100280294ad42417f6a360294ad4220022802080d052002417f360208200141186a200228020c20022802102802541105002002200228020841016a36020820022002280200417f6a220336020020030d00200241046a22032003280200417f6a220336020020030d00200210300b4100410028028cad42417f6a36028cad422001280218450d0520002001290318370200200041086a200141186a41086a280200360200200141306a24000f0b41aeaac0004118200141286a41ac9fc00041d8aac0001034000b41b082c2004110200141286a41bc9fc00041f8aac0001034000b41aeaac0004118200141286a41ac9fc0004188abc0001034000b41aeaac0004118200141286a41ac9fc0004184acc0001034000b41b082c2004110200141286a41bc9fc0004194acc0001034000b4188a1c000412441aca1c0001050000bee0501047f230041306b220224000240024002400240024002400240410028028cad42220341016a220441004c0d0002404100280290ad424101460d00200241086a4100280288ad42110200200241186a41086a200241086a41086a29030037030020022002290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422203450d004100280298ad422104200341027421030340200428020022052005280200417f6a3602000240200428020022052802000d00200541046a22052005280200417f6a3602002004280200220541046a2802000d00200510300b200441046a21042003417c6a22030d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002002290318370294ad424100200241206a29030037029cad424100410028028cad42220441016a220336028cad42200441026a220441004c0d030b4100200436028cad424100280294ad42220541016a220441004c0d0341002004360294ad4241002802a0ad422204450d0620044102744100280298ad426a417c6a280200220428020041016a220341014d0d042004200336020041004100280294ad42417f6a360294ad4220042802080d052004417f360208200428020c2000200120042802102802441104002004200428020841016a36020820042004280200417f6a2203360200024020030d00200441046a22032003280200417f6a220336020020030d00200410300b4100410028028cad42417f6a36028cad42200241306a24000f0b41aeaac0004118200241286a41ac9fc00041d8aac0001034000b41b082c2004110200241286a41bc9fc00041f8aac0001034000b41aeaac0004118200241286a41ac9fc0004188abc0001034000b41aeaac0004118200241286a41ac9fc0004184acc0001034000b00000b41b082c2004110200241286a41bc9fc0004194acc0001034000b4100200336028cad4241002005360294ad424188a1c000412441aca1c0001050000ba70602047f017e230041306b22032400024002400240024002400240410028028cad4241016a220441004c0d0002404100280290ad424101460d00200341086a4100280288ad42110200200341186a41086a200341086a41086a29030037030020032003290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422205450d004100280298ad422104200541027421050340200428020022062006280200417f6a3602000240200428020022062802000d00200641046a22062006280200417f6a3602002004280200220641046a2802000d00200610300b200441046a21042005417c6a22050d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002003290318370294ad424100200341206a29030037029cad424100410028028cad42220441016a36028cad42200441026a220441004c0d030b4100200436028cad424100280294ad42220641016a220441004c0d0341002004360294ad4202400240024041002802a0ad422205450d0020054102744100280298ad426a417c6a280200220428020041016a220641014b0d0100000b41002006360294ad420c010b2004200636020041004100280294ad42417f6a360294ad4220042802080d052004417f360208200341186a200428020c2001200220042802102802601103000240024020032802184101460d00200341206a2903002107200328021c21060c010b410021060b2004200428020841016a36020820042004280200417f6a220136020020010d00200441046a22012001280200417f6a220136020020010d00200410300b4100410028028cad42417f6a36028cad422005450d052000200737020420002006360200200341306a24000f0b41aeaac0004118200341286a41ac9fc00041d8aac0001034000b41b082c2004110200341286a41bc9fc00041f8aac0001034000b41aeaac0004118200341286a41ac9fc0004188abc0001034000b41aeaac0004118200341286a41ac9fc0004184acc0001034000b41b082c2004110200341286a41bc9fc0004194acc0001034000b4188a1c000412441aca1c0001050000b810701077f230041306b2203240002400240024002400240024002400240410028028cad4241016a220441004c0d0020022802082105200228020421062002280200210702404100280290ad424101460d00200341086a4100280288ad42110200200341186a41086a200341086a41086a29030037030020032003290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422204450d004100280298ad422102200441027421040340200228020022082008280200417f6a3602000240200228020022082802000d00200841046a22082008280200417f6a3602002002280200220841046a2802000d00200810300b200241046a21022004417c6a22040d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002003290318370294ad424100200341206a29030037029cad424100410028028cad42220241016a36028cad42200241026a220441004c0d030b4100200436028cad424100280294ad42220841016a220241004c0d0341002002360294ad42024041002802a0ad422202450d0020024102744100280298ad426a417c6a280200220228020041016a220441014d0d052002200436020041004100280294ad42417f6a360294ad4220022802080d062002417f3602082001417f4c0d07200228020c2108200228021021094101210402402001450d002001102f2204450d090b2003200136020c200320043602082004200020011085051a20032001360210200320053602202003200636021c200320073602182008200341086a200341186a200928025c1104002002200228020841016a36020820022002280200417f6a2204360200024020040d00200241046a22042004280200417f6a220436020020040d00200210300b4100410028028cad42417f6a36028cad42200341306a24000f0b41002008360294ad4202402006450d0020071030410028028cad4221040b41002004417f6a36028cad424188a1c000412441aca1c0001050000b41aeaac0004118200341286a41ac9fc00041d8aac0001034000b41b082c2004110200341286a41bc9fc00041f8aac0001034000b41aeaac0004118200341286a41ac9fc0004188abc0001034000b41aeaac0004118200341286a41ac9fc0004184acc0001034000b00000b41b082c2004110200341286a41bc9fc0004194acc0001034000b102c000b102a000bc00601047f230041306b2203240002400240024002400240410028028cad4241016a220441004c0d0002404100280290ad424101460d00200341086a4100280288ad42110200200341186a41086a200341086a41086a29030037030020032003290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422205450d004100280298ad422104200541027421050340200428020022062006280200417f6a3602000240200428020022062802000d00200641046a22062006280200417f6a3602002004280200220641046a2802000d00200610300b200441046a21042005417c6a22050d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002003290318370294ad424100200341206a29030037029cad424100410028028cad42220441016a36028cad42200441026a220441004c0d030b4100200436028cad424100280294ad42220541016a220441004c0d0341002004360294ad420240024041002802a0ad422204450d0020044102744100280298ad426a417c6a280200220428020041016a220541014b0d0100000b41002005360294ad424100410028028cad42417f6a36028cad424188a1c000412441aca1c0001050000b2004200536020041004100280294ad42417f6a360294ad4220042802080d042004417f360208200341186a410472200428020c2001200220042802102802381103002004200428020841016a36020820042004280200417f6a220536020002400240024020050d00200441046a22052005280200417f6a220536020020050d01200410304100410028028cad42417f6a36028cad420c020b4100410028028cad42417f6a36028cad420c010b4100410028028cad42417f6a36028cad420b2000200329021c370200200041086a200341246a280200360200200341306a24000f0b41aeaac0004118200341286a41ac9fc00041d8aac0001034000b41b082c2004110200341286a41bc9fc00041f8aac0001034000b41aeaac0004118200341286a41ac9fc0004188abc0001034000b41aeaac0004118200341286a41ac9fc0004184acc0001034000b41b082c2004110200341286a41bc9fc0004194acc0001034000bea0501047f230041306b220024000240024002400240024002400240410028028cad42220141016a220241004c0d0002404100280290ad424101460d00200041086a4100280288ad42110200200041186a41086a200041086a41086a29030037030020002000290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422201450d004100280298ad422102200141027421010340200228020022032003280200417f6a3602000240200228020022032802000d00200341046a22032003280200417f6a3602002002280200220341046a2802000d00200310300b200241046a21022001417c6a22010d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002000290318370294ad424100200041206a29030037029cad424100410028028cad42220241016a220136028cad42200241026a220241004c0d030b4100200236028cad424100280294ad42220341016a220241004c0d0341002002360294ad4241002802a0ad422202450d0620024102744100280298ad426a417c6a280200220228020041016a220141014d0d042002200136020041004100280294ad42417f6a360294ad4220022802080d052002417f360208200228020c20022802102802641102002002200228020841016a36020820022002280200417f6a2201360200024020010d00200241046a22012001280200417f6a220136020020010d00200210300b4100410028028cad42417f6a36028cad42200041306a24000f0b41aeaac0004118200041286a41ac9fc00041d8aac0001034000b41b082c2004110200041286a41bc9fc00041f8aac0001034000b41aeaac0004118200041286a41ac9fc0004188abc0001034000b41aeaac0004118200041286a41ac9fc0004184acc0001034000b00000b41b082c2004110200041286a41bc9fc0004194acc0001034000b4100200136028cad4241002003360294ad424188a1c000412441aca1c0001050000b820601047f230041306b2200240002400240024002400240024002400240410028028cad42220141016a220241004c0d0002404100280290ad424101460d00200041086a4100280288ad42110200200041186a41086a200041086a41086a29030037030020002000290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422201450d004100280298ad422102200141027421010340200228020022032003280200417f6a3602000240200228020022032802000d00200341046a22032003280200417f6a3602002002280200220341046a2802000d00200310300b200241046a21022001417c6a22010d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002000290318370294ad424100200041206a29030037029cad424100410028028cad42220241016a220136028cad42200241026a220241004c0d030b4100200236028cad424100280294ad42220341016a220241004c0d0341002002360294ad4241002802a0ad422202450d0420024102744100280298ad426a417c6a280200220228020041016a220141014d0d052002200136020041004100280294ad42417f6a360294ad4220022802080d062002417f360208200228020c200228021028026811060021012002200228020841016a36020820022002280200417f6a2203360200024020030d00200241046a22032003280200417f6a220336020020030d00200210300b4100410028028cad42417f6a36028cad4220010d07200041306a24000f0b41aeaac0004118200041286a41ac9fc00041d8aac0001034000b41b082c2004110200041286a41bc9fc00041f8aac0001034000b41aeaac0004118200041286a41ac9fc0004188abc0001034000b41aeaac0004118200041286a41ac9fc0004184acc0001034000b4100200136028cad4241002003360294ad424188a1c000412441aca1c0001050000b00000b41b082c2004110200041286a41bc9fc0004194acc0001034000b41bca1c000412c41e8a1c0001050000b820601047f230041306b2200240002400240024002400240024002400240410028028cad42220141016a220241004c0d0002404100280290ad424101460d00200041086a4100280288ad42110200200041186a41086a200041086a41086a29030037030020002000290308370318410028028cad420d024100417f36028cad4202404100280290ad42450d00024041002802a0ad422201450d004100280298ad422102200141027421010340200228020022032003280200417f6a3602000240200228020022032802000d00200341046a22032003280200417f6a3602002002280200220341046a2802000d00200310300b200241046a21022001417c6a22010d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002000290318370294ad424100200041206a29030037029cad424100410028028cad42220241016a220136028cad42200241026a220241004c0d030b4100200236028cad424100280294ad42220341016a220241004c0d0341002002360294ad4241002802a0ad422202450d0420024102744100280298ad426a417c6a280200220228020041016a220141014d0d052002200136020041004100280294ad42417f6a360294ad4220022802080d062002417f360208200228020c200228021028026c11060021012002200228020841016a36020820022002280200417f6a2203360200024020030d00200241046a22032003280200417f6a220336020020030d00200210300b4100410028028cad42417f6a36028cad4220010d07200041306a24000f0b41aeaac0004118200041286a41ac9fc00041d8aac0001034000b41b082c2004110200041286a41bc9fc00041f8aac0001034000b41aeaac0004118200041286a41ac9fc0004188abc0001034000b41aeaac0004118200041286a41ac9fc0004184acc0001034000b4100200136028cad4241002003360294ad424188a1c000412441aca1c0001050000b00000b41b082c2004110200041286a41bc9fc0004194acc0001034000b41f8a1c000412a41a4a2c0001050000ba10701027f230041c0006b2205240002400240024002400240024002402002417f4c0d004101210602402002450d002002102f2206450d020b2006200120021085052106200520023602102005200236020c20052006360208410028028cad4241016a220241004c0d0202404100280290ad424101460d00200541186a4100280288ad42110200200541286a41086a200541186a41086a29030037030020052005290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422206450d004100280298ad422102200641027421060340200228020022012001280200417f6a3602000240200228020022012802000d00200141046a22012001280200417f6a3602002002280200220141046a2802000d00200110300b200241046a21022006417c6a22060d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002005290328370294ad424100200541306a29030037029cad424100410028028cad42220241016a36028cad42200241026a220241004c0d050b4100200236028cad424100280294ad42220641016a220241004c0d0541002002360294ad420240024041002802a0ad422202450d0020024102744100280298ad426a417c6a280200220228020041016a220641014b0d0100000b41002006360294ad424100410028028cad42417f6a36028cad424188a1c000412441aca1c0001050000b2002200636020041004100280294ad42417f6a360294ad4220022802080d062002417f360208200541286a410472200228020c200541086a20032004200228021028021c1107002002200228020841016a36020820022002280200417f6a220636020002400240024020060d00200241046a22062006280200417f6a220636020020060d01200210304100410028028cad42417f6a36028cad420c020b4100410028028cad42417f6a36028cad420c010b4100410028028cad42417f6a36028cad420b2000200529022c370200200041086a200541346a2802003602000240200528020c450d00200528020810300b200541c0006a24000f0b102c000b102a000b41aeaac0004118200541386a41ac9fc00041d8aac0001034000b41b082c2004110200541386a41bc9fc00041f8aac0001034000b41aeaac0004118200541386a41ac9fc0004188abc0001034000b41aeaac0004118200541386a41ac9fc0004184acc0001034000b41b082c2004110200541386a41bc9fc0004194acc0001034000bec0702027f017e230041c0006b2208240002400240024002400240024002402002417f4c0d004101210902402002450d002002102f2209450d020b2009200120021085052109200820023602102008200236020c20082009360208410028028cad4241016a220241004c0d0202404100280290ad424101460d00200841186a4100280288ad42110200200841286a41086a200841186a41086a29030037030020082008290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422209450d004100280298ad422102200941027421090340200228020022012001280200417f6a3602000240200228020022012802000d00200141046a22012001280200417f6a3602002002280200220141046a2802000d00200110300b200241046a21022009417c6a22090d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002008290328370294ad424100200841306a29030037029cad424100410028028cad42220241016a36028cad42200241026a220241004c0d050b4100200236028cad424100280294ad42220941016a220241004c0d0541002002360294ad420240024041002802a0ad422202450d0020024102744100280298ad426a417c6a280200220228020041016a220941014b0d0100000b41002009360294ad424100410028028cad42417f6a36028cad424188a1c000412441aca1c0001050000b2002200936020041004100280294ad42417f6a360294ad4220022802080d062002417f360208200841286a410472200228020c200841086a20032004200228021028021c1107002002200228020841016a36020820022002280200417f6a220936020002400240024020090d00200241046a22092009280200417f6a220936020020090d01200210304100410028028cad42417f6a36028cad420c020b4100410028028cad42417f6a36028cad420c010b4100410028028cad42417f6a36028cad420b02400240200828022c22090d00410021010c010b20052009200841306a290300220a422088a72202200720022007491b22016a2006200220016b2201200120064b1b1085051a41012101200aa7450d00200910300b0240200828020c450d00200828020810300b2000200236020420002001360200200841c0006a24000f0b102c000b102a000b41aeaac0004118200841386a41ac9fc00041d8aac0001034000b41b082c2004110200841386a41bc9fc00041f8aac0001034000b41aeaac0004118200841386a41ac9fc0004188abc0001034000b41aeaac0004118200841386a41ac9fc0004184acc0001034000b41b082c2004110200841386a41bc9fc0004194acc0001034000bdb0701037f230041c0006b220624000240024002400240024002400240024002402001417f4c0d004101210702402001450d002001102f2207450d020b2007200020011085052107200620013602102006200136020c20062007360208410028028cad42220741016a220141004c0d0202404100280290ad424101460d00200641186a4100280288ad42110200200641286a41086a200641186a41086a29030037030020062006290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422207450d004100280298ad422101200741027421070340200128020022002000280200417f6a3602000240200128020022002802000d00200041046a22002000280200417f6a3602002001280200220041046a2802000d00200010300b200141046a21012007417c6a22070d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002006290328370294ad424100200641306a29030037029cad424100410028028cad42220141016a220736028cad42200141026a220141004c0d050b4100200136028cad424100280294ad42220041016a220141004c0d0541002001360294ad4241002802a0ad422201450d0820014102744100280298ad426a417c6a280200220128020041016a220741014d0d062001200736020041004100280294ad42417f6a360294ad4220012802080d072001417f3602082003417f4c0d00200128020c2100200128021021080240024020030d00410121070c010b2003102f2207450d020b2006200336021c200620073602182007200220031085051a200620033602202005417f4c0d004101210702402005450d002005102f2207450d020b2007200420051085052107200641306a20053602002006200536022c200620073602282000200641086a200641186a200641286a20082802501103002001200128020841016a36020820012001280200417f6a2207360200024020070d00200141046a22072007280200417f6a220736020020070d00200110300b4100410028028cad42417f6a36028cad420240200628020c450d00200628020810300b200641c0006a24000f0b102c000b102a000b41aeaac0004118200641386a41ac9fc00041d8aac0001034000b41b082c2004110200641386a41bc9fc00041f8aac0001034000b41aeaac0004118200641386a41ac9fc0004188abc0001034000b41aeaac0004118200641386a41ac9fc0004184acc0001034000b00000b41b082c2004110200641386a41bc9fc0004194acc0001034000b4100200736028cad4241002000360294ad424188a1c000412441aca1c0001050000b9f0701037f230041c0006b220424000240024002400240024002400240024002402001417f4c0d004101210502402001450d002001102f2205450d020b2005200020011085052105200420013602102004200136020c20042005360208410028028cad42220541016a220141004c0d0202404100280290ad424101460d00200441186a4100280288ad42110200200441286a41086a200441186a41086a29030037030020042004290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422205450d004100280298ad422101200541027421050340200128020022002000280200417f6a3602000240200128020022002802000d00200041046a22002000280200417f6a3602002001280200220041046a2802000d00200010300b200141046a21012005417c6a22050d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002004290328370294ad424100200441306a29030037029cad424100410028028cad42220141016a220536028cad42200141026a220141004c0d050b4100200136028cad424100280294ad42220041016a220141004c0d0541002001360294ad4241002802a0ad422201450d0820014102744100280298ad426a417c6a280200220128020041016a220541014d0d062001200536020041004100280294ad42417f6a360294ad4220012802080d072001417f3602082003417f4c0d00200128020c2100200128021021064101210502402003450d002003102f2205450d020b2004200336021c200420053602182005200220031085051a20042003360220200441003602282000200441086a200441186a200441286a20062802501103002001200128020841016a36020820012001280200417f6a2205360200024020050d00200141046a22052005280200417f6a220536020020050d00200110300b4100410028028cad42417f6a36028cad420240200428020c450d00200428020810300b200441c0006a24000f0b102c000b102a000b41aeaac0004118200441386a41ac9fc00041d8aac0001034000b41b082c2004110200441386a41bc9fc00041f8aac0001034000b41aeaac0004118200441386a41ac9fc0004188abc0001034000b41aeaac0004118200441386a41ac9fc0004184acc0001034000b00000b41b082c2004110200441386a41bc9fc0004194acc0001034000b4100200536028cad4241002000360294ad424188a1c000412441aca1c0001050000bf30601027f230041c0006b220524000240024002400240024002400240024002402002417f4c0d004101210602402002450d002002102f2206450d020b2006200120021085052106200520023602102005200236020c20052006360208410028028cad42220641016a220241004c0d0202404100280290ad424101460d00200541186a4100280288ad42110200200541286a41086a200541186a41086a29030037030020052005290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422206450d004100280298ad422102200641027421060340200228020022012001280200417f6a3602000240200228020022012802000d00200141046a22012001280200417f6a3602002002280200220141046a2802000d00200110300b200241046a21022006417c6a22060d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002005290328370294ad424100200541306a29030037029cad424100410028028cad42220241016a220636028cad42200241026a220241004c0d050b4100200236028cad424100280294ad42220141016a220241004c0d0541002002360294ad4241002802a0ad422202450d0820024102744100280298ad426a417c6a280200220228020041016a220641014d0d062002200636020041004100280294ad42417f6a360294ad4220022802080d072002417f3602082005200228020c200541086a2003200420022802102802401107002005280204210620052d000021012002200228020841016a36020820022002280200417f6a2203360200024020030d00200241046a22032003280200417f6a220336020020030d00200210300b4100410028028cad42417f6a36028cad420240200528020c450d00200528020810300b2000200636020420002001417f73410171360200200541c0006a24000f0b102c000b102a000b41aeaac0004118200541386a41ac9fc00041d8aac0001034000b41b082c2004110200541386a41bc9fc00041f8aac0001034000b41aeaac0004118200541386a41ac9fc0004188abc0001034000b41aeaac0004118200541386a41ac9fc0004184acc0001034000b00000b41b082c2004110200541386a41bc9fc0004194acc0001034000b4100200636028cad4241002001360294ad424188a1c000412441aca1c0001050000bd30601027f230041c0006b220424000240024002400240024002400240024002402001417f4c0d004101210502402001450d002001102f2205450d020b2005200020011085052105200420013602102004200136020c20042005360208410028028cad42220541016a220141004c0d0202404100280290ad424101460d00200441186a4100280288ad42110200200441286a41086a200441186a41086a29030037030020042004290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422205450d004100280298ad422101200541027421050340200128020022002000280200417f6a3602000240200128020022002802000d00200041046a22002000280200417f6a3602002001280200220041046a2802000d00200010300b200141046a21012005417c6a22050d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002004290328370294ad424100200441306a29030037029cad424100410028028cad42220141016a220536028cad42200141026a220141004c0d050b4100200136028cad424100280294ad42220041016a220141004c0d0541002001360294ad4241002802a0ad422201450d0820014102744100280298ad426a417c6a280200220128020041016a220541014d0d062001200536020041004100280294ad42417f6a360294ad4220012802080d072001417f360208200128020c200441086a20022003200128021028023411080021052001200128020841016a36020820012001280200417f6a2200360200024020000d00200141046a22002000280200417f6a220036020020000d00200110300b4100410028028cad42417f6a36028cad420240200428020c450d00200428020810300b200441c0006a240020050f0b102c000b102a000b41aeaac0004118200441386a41ac9fc00041d8aac0001034000b41b082c2004110200441386a41bc9fc00041f8aac0001034000b41aeaac0004118200441386a41ac9fc0004188abc0001034000b41aeaac0004118200441386a41ac9fc0004184acc0001034000b00000b41b082c2004110200441386a41bc9fc0004194acc0001034000b4100200536028cad4241002000360294ad424188a1c000412441aca1c0001050000bcf0601027f230041c0006b220424000240024002400240024002400240024002402001417f4c0d004101210502402001450d002001102f2205450d020b2005200020011085052105200420013602102004200136020c20042005360208410028028cad42220541016a220141004c0d0202404100280290ad424101460d00200441186a4100280288ad42110200200441286a41086a200441186a41086a29030037030020042004290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422205450d004100280298ad422101200541027421050340200128020022002000280200417f6a3602000240200128020022002802000d00200041046a22002000280200417f6a3602002001280200220041046a2802000d00200010300b200141046a21012005417c6a22050d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002004290328370294ad424100200441306a29030037029cad424100410028028cad42220141016a220536028cad42200141026a220141004c0d050b4100200136028cad424100280294ad42220041016a220141004c0d0541002001360294ad4241002802a0ad422201450d0820014102744100280298ad426a417c6a280200220128020041016a220541014d0d062001200536020041004100280294ad42417f6a360294ad4220012802080d072001417f360208200128020c200441086a2002200320012802102802481103002001200128020841016a36020820012001280200417f6a2205360200024020050d00200141046a22052005280200417f6a220536020020050d00200110300b4100410028028cad42417f6a36028cad420240200428020c450d00200428020810300b200441c0006a24000f0b102c000b102a000b41aeaac0004118200441386a41ac9fc00041d8aac0001034000b41b082c2004110200441386a41bc9fc00041f8aac0001034000b41aeaac0004118200441386a41ac9fc0004188abc0001034000b41aeaac0004118200441386a41ac9fc0004184acc0001034000b00000b41b082c2004110200441386a41bc9fc0004194acc0001034000b4100200536028cad4241002000360294ad424188a1c000412441aca1c0001050000bf40601027f230041c0006b22032400024002400240024002400240024002402002417f4c0d004101210402402002450d002002102f2204450d020b2004200120021085052104200320023602102003200236020c20032004360208410028028cad4241016a220241004c0d0202404100280290ad424101460d00200341186a4100280288ad42110200200341286a41086a200341186a41086a29030037030020032003290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422204450d004100280298ad422102200441027421040340200228020022012001280200417f6a3602000240200228020022012802000d00200141046a22012001280200417f6a3602002002280200220141046a2802000d00200110300b200241046a21022004417c6a22040d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002003290328370294ad424100200341306a29030037029cad424100410028028cad42220241016a36028cad42200241026a220241004c0d050b4100200236028cad424100280294ad42220441016a220241004c0d0541002002360294ad4202400240024041002802a0ad422202450d0020024102744100280298ad426a417c6a280200220228020041016a220441014b0d0100000b41002004360294ad42200341003602280c010b2002200436020041004100280294ad42417f6a360294ad4220022802080d072002417f360208200341286a200228020c200341086a20022802102802581104002002200228020841016a36020820022002280200417f6a220436020020040d00200241046a22042004280200417f6a220436020020040d00200210300b4100410028028cad42417f6a36028cad422003280228450d0720002003290328370200200041086a200341286a41086a2802003602000240200328020c450d00200328020810300b200341c0006a24000f0b102c000b102a000b41aeaac0004118200341386a41ac9fc00041d8aac0001034000b41b082c2004110200341386a41bc9fc00041f8aac0001034000b41aeaac0004118200341386a41ac9fc0004188abc0001034000b41aeaac0004118200341386a41ac9fc0004184acc0001034000b41b082c2004110200341386a41bc9fc0004194acc0001034000b4188a1c000412441aca1c0001050000ba10701027f230041c0006b2205240002400240024002400240024002402002417f4c0d004101210602402002450d002002102f2206450d020b2006200120021085052106200520023602102005200236020c20052006360208410028028cad4241016a220241004c0d0202404100280290ad424101460d00200541186a4100280288ad42110200200541286a41086a200541186a41086a29030037030020052005290318370328410028028cad420d044100417f36028cad4202404100280290ad42450d00024041002802a0ad422206450d004100280298ad422102200641027421060340200228020022012001280200417f6a3602000240200228020022012802000d00200141046a22012001280200417f6a3602002002280200220141046a2802000d00200110300b200241046a21022006417c6a22060d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad4241002005290328370294ad424100200541306a29030037029cad424100410028028cad42220241016a36028cad42200241026a220241004c0d050b4100200236028cad424100280294ad42220641016a220241004c0d0541002002360294ad420240024041002802a0ad422202450d0020024102744100280298ad426a417c6a280200220228020041016a220641014b0d0100000b41002006360294ad424100410028028cad42417f6a36028cad424188a1c000412441aca1c0001050000b2002200636020041004100280294ad42417f6a360294ad4220022802080d062002417f360208200541286a410472200228020c200541086a20032004200228021028023c1107002002200228020841016a36020820022002280200417f6a220636020002400240024020060d00200241046a22062006280200417f6a220636020020060d01200210304100410028028cad42417f6a36028cad420c020b4100410028028cad42417f6a36028cad420c010b4100410028028cad42417f6a36028cad420b2000200529022c370200200041086a200541346a2802003602000240200528020c450d00200528020810300b200541c0006a24000f0b102c000b102a000b41aeaac0004118200541386a41ac9fc00041d8aac0001034000b41b082c2004110200541386a41bc9fc00041f8aac0001034000b41aeaac0004118200541386a41ac9fc0004188abc0001034000b41aeaac0004118200541386a41ac9fc0004184acc0001034000b41b082c2004110200541386a41bc9fc0004194acc0001034000b02000b02000bbc04010a7f230041f0076b220224000240024002400240200041106a28020022032f01ae2b220420016a2205410c4f0d00200041186a2802002f01ae2b22062001490d01200320053b01ae2b200041186a2203280200200620016b22073b01ae2b20032802002106200241f8036a200041046a280200200028020841f8036c6a220841f8031085051a200820062001417f6a220941f8036c220a6a41f8031086051a2002200241f8036a41f803108505210b200041106a2206280200200441f8036c6a200b41f8031085051a20092005200441016a22026b470d022006280200200241f8036c6a2003280200200a1085051a200328020022082008200141f8036c6a200741f8036c1086051a200028020c21080240024020002802140d002008450d010c050b2008450d042006280200220820024102746a41b02b6a2003280200220641b02b6a2200200141027422031085051a2000200020036a200741027441046a1086051a0240200520044d0d00200441027420086a41b42b6a210003402000280200220320023b01ac2b200320083602a82b200041046a2100200241016a21022001417f6a22010d000b0b2007417f460d00200641b02b6a2102200741016a21034100210003402002280200220120003b01ac2b200120063602a82b200241046a21022003200041016a2200470d000b0b200b41f0076a24000f0b41dca4c20041324190a5c200102d000b41a0a5c200412841c8a5c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c20041284180a6c200102d000be803010d7f23004180046b2202240002400240200141106a28020022032f01ae2b220441016a2205200141186a28020022062f01ae2b22076a2208410c4f0d00200128020821092001280200210a2001280204220b2f01ae2b210c200320083b01ae2b200241086a200b200941f8036c6a220141f8031085051a2001200141f8036a200c2009417f736a220d41f8036c1086051a2003200441f8036c6a200241086a41f8031085051a2003200541f8036c6a2006200741f8036c1085051a200b41b02b6a220e200941016a22014102746a20094102742209200e6a41086a200d4102741086051a02402001200c4f0d002009200b6a41b42b6a210903402009280200220d20013b01ac2b200d200b3602a82b200941046a2109200c200141016a2201470d000b0b200b200b2f01ae2b417f6a3b01ae2b0240200a4102490d002007200820056b470d02200320054102746a41b02b6a200641b02b6a200741016a22094102741085051a200820044d0d00200441027420036a41b42b6a210103402001280200220d20053b01ac2b200d20033602a82b200141046a2101200541016a21052009417f6a22090d000b0b200610302000200b3602042000200a36020020024180046a24000f0b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000bd80b03077f027e037f230041e0076b2203240020012802002104200128020422052f01a6292106200341e0036a20052001280208220741d0036c6a220141d0031085051a2001200141d0036a20062007417f736a220841d0036c1086051a200541f0276a220920074104746a220141086a290300210a2001290300210b20012009200741016a220c4104746a20084104741086051a20052006417f6a22013b01a629200341106a200341e0036a41d0031085051a0240200141ffff037141044b0d0002400240024020052802a0292206450d00200441016a21090240024020052f01a42922080d0020062f01a6290d01200341f4036a4101360200200342013702e403200341f4a9c2003602e003200341043602c40720034188a4c2003602c0072003200341c0076a3602f003200341e0036a4190a4c200103a000b024020062008417f6a22084102746a41a8296a280200220d2f01a629200141ffff03716a41016a410b4b0d00200341f8036a2005360200200341f0036a200d360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341b0076a200341e0036a41012007108c010c040b200341f8036a2005360200200341f0036a200d360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341e0036a4101108d012003200c3602b8070c020b0240200141ffff0371200841027420066a41ac296a28020022012f01a6296a41016a410b4b0d00200341f8036a2001360200200341f0036a2005360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341b0076a200341e0036a41002007108c010c030b200341f8036a2001360200200341f0036a2005360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341e0036a4101108e010b200320073602b8070b200320053602b407200320043602b0070b20032802b807210720032802b007210420032802b40722052802a0292201450d0020012f01a629220941044b0d00200441016a21060240034020012802a0292208450d01200941ffff03712109200641016a210d024002400240024020012f01a429220c0d0020082f01a6290d01200341f4036a4101360200200342013702e403200341f4a9c2003602e003200341043602c40720034188a4c2003602c0072003200341c0076a3602f003200341e0036a4190a4c200103a000b2008200c417f6a220e4102746a41a8296a280200210c200320013602d807200320063602d4072003200c3602d007200320063602cc072003200e3602c807200320083602c4072003200d3602c00702402009200c2f01a6296a41016a410b4b0d00200341e0036a41186a200341c0076a41186a280200360200200341e0036a41106a200341c0076a41106a290300370300200341e0036a41086a200341c0076a41086a290300370300200320032903c0073703e003200341086a200341e0036a108f01200328020c2101200328020821060c030b200341c0076a410520096b108d010c010b2003200c41027420086a41ac296a280200220e3602d807200320063602d407200320013602d007200320063602cc072003200c3602c807200320083602c4072003200d3602c00702402009200e2f01a6296a41016a410b4b0d00200341e0036a41186a200341c0076a41186a280200360200200341e0036a41106a200341c0076a41106a290300370300200341e0036a41086a200341c0076a41086a290300370300200320032903c0073703e0032003200341e0036a108f0120032802042101200328020021060c020b200341c0076a410520096b108e010b410021010b2001450d0220012f01a629220941044d0d000c020b0b200941ffff03710d00200241013a00000b2000200341106a41d003108505220141d8036a200a3703002001200b3703d003200141e8036a2007360200200141e4036a2005360200200120043602e003200341e0076a24000b8305020f7f027e230041d0036b22042400024002400240200141186a28020022052f01a6292206200141106a28020022072f01a629220820021b2003490d00200841016a220920066a220a410c4f0d01200128020c210b2001280208210c2001280200210d2001280204220e2f01a629210f2007200a3b01a6292004200e200c41d0036c6a220141d00310850521102001200141d0036a200f200c417f736a220441d0036c1086051a2007200841d0036c6a201041d0031085051a2007200941d0036c6a2005200641d0036c1085051a200e41f0276a2211200c4104746a22122903002113201241086a290300211420122011200c41016a22014104746a20044104741086051a200741f0276a221220084104746a2211201437030820112013370300201220094104746a200541f0276a20064104741085051a200e41a8296a221220014102746a200c410274220c20126a41086a20044102741086051a02402001200f4f0d00200c200e6a41ac296a210c0340200c280200220420013b01a4292004200e3602a029200c41046a210c200f200141016a2201470d000b0b200e200e2f01a629417f6a3b01a6290240200d4102490d002006200a20096b470d03200720094102746a41a8296a200541a8296a200641016a22044102741085051a200a20084d0d00200841027420076a41ac296a21012009210c03402001280200220e200c3b01a429200e20073602a029200141046a2101200c41016a210c2004417f6a22040d000b0b20051030200020073602042000200b36020020002009410020021b20036a360208201041d0036a24000f0b419ca7c20041910141b0a8c200102d000b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000b9e05040a7f027e027f017e230041a0076b220224000240024002400240200041186a2802002f01a629220320016a2204410c4f0d00200041106a28020022052f01a62922062001490d012005200620016b22073b01a629200041186a220528020020043b01a62920052802002208200141d0036c6a2008200341d0036c1086051a200528020041f0276a220820014104746a200820034104741086051a2006200741016a22036b22082001417f6a470d022005280200200041106a2206280200200341d0036c6a200841d0036c22091085051a200528020041f0276a200628020020034104746a41f0276a2008410474220a1085051a2006280200220820074104746a220b41f8276a290300210c200b41f0276a290300210d200241d0036a200041046a280200220b2000280208220e41d0036c6a220f41d0031085051a200f2008200741d0036c6a41d0031086051a200b200e4104746a220741f0276a220829030021102008200d370300200741f8276a2207290300210d2007200c3703002002200241d0036a41d0031085052108200528020020096a200841d0031085051a2005280200200a6a220241f8276a200d370300200241f0276a2010370300200028020c21020240024020002802140d002002450d010c050b2002450d04200628020021072005280200220241a8296a2200200141027422056a2000200420016b41027441046a1086051a2000200720034102746a41a8296a20051085051a200441016a21074100210103402000280200220520013b01a429200520023602a029200041046a21002007200141016a2201470d000b0b200841a0076a24000f0b4190a6c200413341c4a6c200102d000b41d4a6c200412741fca6c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c2004128418ca7c200102d000bef0504097f027e037f017e230041a0076b220224000240024002400240200041106a28020022032f01a629220420016a2205410c4f0d00200041186a2802002f01a62922062001490d01200320053b01a629200041186a2203280200200620016b22073b01a629200328020022062001417f6a220841047422096a220a41f8276a290300210b200a41f0276a290300210c200241d0036a200041046a280200220a2000280208220d41d0036c6a220e41d0031085051a200e2006200841d0036c220f6a41d0031086051a200a200d4104746a220641f0276a220a2903002110200a200c370300200641f8276a2206290300210c2006200b3703002002200241d0036a41d003108505210a200041106a2206280200200441d0036c6a200a41d0031085051a200628020020044104746a220241f8276a200c370300200241f0276a201037030020082005200441016a22026b470d022006280200200241d0036c6a2003280200200f1085051a200628020020024104746a41f0276a200328020041f0276a20091085051a200328020022082008200141d0036c6a200741d0036c1086051a200328020041f0276a2208200820014104746a20074104741086051a200028020c21080240024020002802140d002008450d010c050b2008450d042006280200220820024102746a41a8296a2003280200220641a8296a2200200141027422031085051a2000200020036a200741027441046a1086051a0240200520044d0d00200441027420086a41ac296a210003402000280200220320023b01a429200320083602a029200041046a2100200241016a21022001417f6a22010d000b0b2007417f460d00200641a8296a2102200741016a21034100210003402002280200220120003b01a429200120063602a029200241046a21022003200041016a2200470d000b0b200a41a0076a24000f0b41dca4c20041324190a5c200102d000b41a0a5c200412841c8a5c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c20041284180a6c200102d000bca04020e7f027e230041d0036b2202240002400240200141106a28020022032f01a629220441016a2205200141186a28020022062f01a62922076a2208410c4f0d00200128020821092001280200210a2001280204220b2f01a629210c200320083b01a6292002200b200941d0036c6a220141d003108505210d2001200141d0036a200c2009417f736a220241d0036c1086051a2003200441d0036c6a200d41d0031085051a2003200541d0036c6a2006200741d0036c1085051a200b41f0276a220e20094104746a220f2903002110200f41086a2903002111200f200e200941016a22014104746a20024104741086051a200341f0276a220f20044104746a220e2011370308200e2010370300200f20054104746a200641f0276a20074104741085051a200b41a8296a220f20014102746a20094102742209200f6a41086a20024102741086051a02402001200c4f0d002009200b6a41ac296a210903402009280200220220013b01a4292002200b3602a029200941046a2109200c200141016a2201470d000b0b200b200b2f01a629417f6a3b01a6290240200a4102490d002007200820056b470d02200320054102746a41a8296a200641a8296a200741016a22094102741085051a200820044d0d00200441027420036a41ac296a210103402001280200220220053b01a429200220033602a029200141046a2101200541016a21052009417f6a22090d000b0b200610302000200b3602042000200a360200200d41d0036a24000f0b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000ba50302027f047e024020002001109101220241ff01710d00024002400240024002400240024020002d00d003220320012d00d0032202470d00410021022003417f6a0e06050102030406070b417f410120032002491b0f0b20034102470d05200041d1036a200141d1036a41041088052200450d05417f410120004100481b0f0b20034103470d04200041d1036a200141d1036a41081088052200450d04417f410120004100481b0f0b20034104470d03200041d1036a200141d1036a41101088052200450d03417f410120004100481b0f0b20034105470d02200041d1036a200141d1036a41201088052200450d02417f410120004100481b0f0b20034101470d01417f200041d8036a2903002204200141d8036a290300220585200041e0036a2903002206200141e0036a290300220785844200522004200554200620075420062007511b1b0f0b20034106470d000240200041d4036a280200200141d4036a280200200141dc036a2802002201200041dc036a2802002200200020014b1b10880522020d00417f200020014720002001491b0f0b417f410120024100481b21020b20020bf90702027f017e02402000280200220220012802002203470d000240024020020d00024002400240024002400240024002400240200041086a2802002203200141086a2903002204a72202470d00410021022003417f6a0e0801020304050607080a0b417f410120032002491b0f0b20044201520d08200041106a200141106a1092010f0b20044202520d07200041106a200141106a109201220241ff01710d07200041c8006a200141c8006a1092010f0b20044203520d06200041106a200141106a109201220241ff01710d06200041c8006a200141c8006a109201220241ff01710d0620004180016a20014180016a1092010f0b20044204520d05200041106a200141106a109201220241ff01710d05200041c8006a200141c8006a109201220241ff01710d0520004180016a20014180016a109201220241ff01710d05200041b8016a200141b8016a1092010f0b20044205520d04200041106a200141106a109201220241ff01710d04200041c8006a200141c8006a109201220241ff01710d0420004180016a20014180016a109201220241ff01710d04200041b8016a200141b8016a109201220241ff01710d04200041f0016a200141f0016a1092010f0b20044206520d03200041106a200141106a109201220241ff01710d03200041c8006a200141c8006a109201220241ff01710d0320004180016a20014180016a109201220241ff01710d03200041b8016a200141b8016a109201220241ff01710d03200041f0016a200141f0016a109201220241ff01710d03200041a8026a200141a8026a1092010f0b20044207520d02200041106a200141106a109201220241ff01710d02200041c8006a200141c8006a109201220241ff01710d0220004180016a20014180016a109201220241ff01710d02200041b8016a200141b8016a109201220241ff01710d02200041f0016a200141f0016a109201220241ff01710d02200041a8026a200141a8026a109201220241ff01710d02200041e0026a200141e0026a1092010f0b20044208520d01200041106a200141106a109201220241ff01710d01200041c8006a200141c8006a109201220241ff01710d0120004180016a20014180016a109201220241ff01710d01200041b8016a200141b8016a109201220241ff01710d01200041f0016a200141f0016a109201220241ff01710d01200041a8026a200141a8026a109201220241ff01710d01200041e0026a200141e0026a109201220241ff01710d0120004198036a20014198036a1092010f0b0240200028020420012802042001410c6a28020022012000410c6a2802002200200020014b1b10880522020d00417f200020014720002001491b0f0b417f410120024100481b21020b20020f0b417f410120022003491b0b860a03037f047e017f024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000220220012d00002203470d00410021032002417f6a0e090401060208090a0c030c0b417f410120022003491b0f0b20024102460d0341000f0b20024104460d0441000f0b20024109460d0741000f0b4100210320024101470d07417f200041046a2802002202200141046a28020022004720022000491b0f0b200041246a2802002202200141246a2802002203470d07024020024101470d00200041286a280200200141286a280200200141306a2802002202200041306a2802002204200420024b1b10880522030d0941ff01210320042002490d07200420024722030d070b41002103200041016a200141016a41201088052202450d06417f410120024100481b0f0b4100210320024103470d05200041046a2802002202200141046a2802002203470d08024020024101470d00200041086a280200200141086a280200200141106a2802002202200041106a2802002204200420024b1b10880522030d0a41ff01210320042002490d06200420024722030d060b417f200041186a2903002205200141186a29030022065220052006541b0f0b200041186a2802002202200141186a2802002203470d09024020024101470d002000411c6a2802002001411c6a280200200141246a2802002202200041246a2802002204200420024b1b10880522030d0b41ff01210320042002490d05200420024722030d050b41002103200041016a200141016a41141088052202450d04417f410120024100481b0f0b4100210320024105470d03417f20002d0001220220012d000122004720022000491b0f0b4100210320024106470d02417f200041086a2903002207200141086a290300220885200041106a2903002205200141106a290300220685844200522007200854200520065420052006511b1b0f0b4100210320024107470d010240200041046a280200200141046a2802002001410c6a28020022022000410c6a2802002200200020024b1b10880522010d00417f200020024720002002491b0f0b417f410120014100481b0f0b02400240024002400240200041046a2802002202200141046a2802002203470d002002417f6a0e020102040b417f410120022003491b0f0b0240200041086a280200200141086a280200200141106a2802002202200041106a2802002204200420024b1b10880522030d0041ff01210320042002490d04200420024721030c020b417f410120034100481b0f0b41ff012103200041086a2802002202200141086a2802002204490d02200220044721030b20030d010b02400240024002400240200041146a2802002202200141146a2802002203470d002001411c6a2802002104200141186a28020021012000411c6a2802002109200041186a2802002100410021032002417f6a0e0401020304050b417f410120022003481b0f0b417f200020014720002001491b0f0b41ff01210320002001490d024101210320002001470d02417f200920044720092004491b0f0b41ff01210320002001490d014101210320002001470d01417f200920044720092004491b0f0b41ff01210320002001490d004101210320002001470d00417f200920044720092004491b21030b20030f0b417f410120022003491b0f0b417f410120034100481b0f0b417f410120022003491b0f0b417f410120034100481b0f0b417f410120022003491b0f0b417f410120034100481b0bcf0101037f230041206b220324002002210402400240034020022f01b6012105024020010d002001450d020c030b2001450d022001417f6a2101200220054102746a41b8016a280200210220042802b80121040c000b0b2000200136020c200041003602082000200436020420002001360200200041146a2005360200200041106a2002360200200341206a24000f0b200341146a410136020020034201370204200341f4a9c2003602002003410436021c200341eca9c2003602182003200341186a360210200341fca9c200103a000b920403027f017e077f230041d00b6b220324000240024002402002200128020441e8036e2204200420024b1bad42e8037e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b2004102f2206450d010b200441e8036e2107024020020d00410021020c030b200341d8076a410172210841002109410021044100210a02400340200341d8076a200110950120032d00d807210b200341f1036a200841e7031085051a200b410b460d012003410a6a200341f1036a41e7031085051a0240200a2007470d002009200a41016a220c2009200c4b1b220c4104200c41044b1bad42e8037e2205422088a745410374210c2005a7210702400240200a0d00200341003602d8070c010b200341083602e007200320043602dc07200320063602d8070b200341c00b6a2007200c200341d8076a106920032802c80b210c024020032802c00b4101470d00200c0d040c050b20032802c40b2106200c41e8036e21070b200620046a220c200b3a0000200c41016a2003410a6a41e7031085051a200941026a2109200441e8036a21042002200a41016a220a460d040c000b0b200041003602000240200a450d002006210a0340200a109601200a41e8036a210a200441987c6a22040d000b0b2007450d03200741e8036c450d03200610300c030b102a000b102c000b2000200736020420002006360200200041086a20023602000b200341d00b6a24000b961503057f027e017f230041900c6b2202240002400240200128020422030d002000410b3a00000c010b200128020022042d0000210520012003417f6a22063602042001200441016a3602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0b000102030405060708090b0a0b200241a8086a200110980120022802a8082203450d13200241b0086a280200210520022802ac08210420022001109b01024002402002280200450d00200241003602a8080c010b200241a8086a2001200228020410a30120022802a8080d220b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d22200441f8036c450d22200310300c220b200241a8086a200110980120022802a8082203450d11200241b0086a280200210520022802ac082104200241086a2001109b01024002402002280208450d00200241003602a8080c010b200241a8086a2001200228020c10a30120022802a8080d200b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d21200441f8036c450d21200310300c210b200241a8086a200110980120022802a8082203450d0f200241b0086a280200210520022802ac082104200241106a2001109b01024002402002280210450d00200241003602a8080c010b200241a8086a2001200228021410a30120022802a8080d1e0b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d20200441f8036c450d20200310300c200b200241186a2001109d012002290318a70d11024020012802042203450d0020022903202107200128020022042d0000210520012003417f6a3602042001200441016a36020020050d00200241a8086a200110980120022802a8082201450d0020022902ac082108200041106a2007370300200041086a2008370000200041046a2001360000200041033a00000c200b2000410b3a00000c1f0b200241a8086a200110980120022802a8082203450d11200241a8086a41086a280200210520022802ac082104200241a8086a2001109901024020022903a8084209510d00200041106a200241a8086a41c8031085051a2000410c6a2005360000200041086a2004360000200041046a2003360000200041043a00000c1f0b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d1e200441f8036c450d1e200310300c1e0b200241c0046a200110980120022802c0042203450d11200241c8046a280200210520022802c4042104200241c0046a200110990120022903c0044209510d0a200241f8006a200241c0046a41c8031085051a200241286a2001109b01024002402002280228450d00200241003602c0040c010b200241c0046a2001200228022c10970120022802c0040d1a0b2000410b3a0000200241f8006a109c010c0b0b2006450d1120042d0001210520012003417e6a22063602042001200441026a36020041002109024002400240024020050e0403000102150b410121090c020b410221090c010b410321090b02400240024020064108490d00200429000221072001200341766a36020420012004410a6a360200200241306a2001109b0120022802300d022001280204220420022802342203490d022003417f4c0d150240024020030d00410121050c010b2003102f2205450d092005410020031087051a200128020421040b20042003490d012005200128020020031085052105200128020422042003490d1a200020093a0001200041063a00002001200420036b360204200041f4006a2003ad2208422086200884370200200041f0006a2005360200200041106a4102360200200041086a20073703002001200128020020036a3602000c1f0b2000410b3a00000c1e0b200510300b2000410b3a00000c1c0b200241c8006a2001109b0120022802480d12200228024c2103200241c0006a2001109b0120022802400d1320022802442104200241386a2001109b01024020022802380d00200228023c2101200041073a00002000410c6a2001360200200041086a2004360200200041046a20033602000c1c0b2000410b3a00000c1b0b200241d0006a2001109b01024020022802500d0020022802542101200041083a0000200041046a20013602000c1b0b2000410b3a00000c1a0b200241e8006a2001109b0120022802680d12200228026c2103200241e0006a2001109b0120022802600d1320022802642104200241d8006a2001109b01024020022802580d00200228025c2101200041093a00002000410c6a2001360200200041086a2004360200200041046a20033602000c1a0b2000410b3a00000c190b2000410b3a00000c180b200241a8086a200110990120022903a8084209510d01200241f8006a200241a8086a41c8031085051a200241a8086a200110950120022d00a8082101200241c0046a200241a8086a41017241e7031085051a2001410b460d0341e803102f22030d020b102a000b2000410b3a00000c150b200320013a0000200341016a200241c0046a41e7031085051a200041086a200241f8006a41c8031085051a200041046a20033602002000410a3a00000c140b2000410b3a0000200241f8006a109c010c130b2000410b3a00000b02402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d11200441f8036c450d11200310300c110b2000410b3a00000c100b2000410b3a00000c0f0b2000410b3a00000c0e0b2000410b3a00000c0d0b2000410b3a00000c0c0b2000410b3a00000c0b0b2000410b3a00000c0a0b102c000b2000410b3a00000c080b2000410b3a00000c070b2000410b3a00000c060b2000410b3a00000c050b2003200441f0f5c100104a000b200041106a20022903c004370200200041186a200241c0046a41086a280200360200200241a8086a41046a200241f8006a41c8031085051a200041053a0000200020022f00753b0001200041036a200241f7006a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600002000411c6a200241a8086a41cc031085051a0c030b200041106a20022903a808370200200041186a200241a8086a41086a280200360200200041023a0000200020022f00c0043b0001200041036a200241c0046a41026a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600000c020b200041106a20022903a808370200200041186a200241a8086a41086a280200360200200041013a0000200020022f00c0043b0001200041036a200241c2046a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600000c010b200041106a20022903a808370200200041186a200241a8086a41086a280200360200200041003a0000200020022f00c0043b0001200041036a200241c2046a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600000b200241900c6a24000ba20701027f02400240024002400240024002400240024020002d00000e0a00010203040506070707080b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041106a280200200041186a28020010a401200041146a2802002202450d0620024198046c450d06200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041106a280200200041186a28020010a401200041146a2802002202450d0520024198046c450d05200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041106a280200200041186a28020010a401200041146a2802002202450d0420024198046c450d04200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b200041086a2802002202450d03200241f8036c450d03200028020410300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041106a109c010f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0120024198046c450d01200028021010300f0b200041106a21020240200041f4006a280200450d00200041f0006a28020010300b20022802004102460d00200210b2020b0f0b200041086a109c01200041046a2202280200109601200228020010300bb41507027f017e0c7f017e057f037e017f230041c0176b22032400024002400240200220012802044198046e2204200420024b1bad4298047e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b2004102f2206450d010b20044198046e2107024020020d00410021020c030b200341c8136a410c6a2108200341c8136a41046a2109200341d00f6a410472210a200341a8136a210b200341d00f6a410c6a210c4100210d4100210e0240034020012802042204450d012001280200220f2d0000211020012004417f6a3602042001200f41016a3602004100210f0240024002400240024002400240024002400240024002400240024002400240024020100e080300010205060708120b200341c8136a200110980120032802c8132210450d0820032802d013210420032802cc132111200341c8136a2001109901024020032903c81322124209510d0020032802d0132113200341bc086a200841bc031085051a4101210f201021142011211520042116201221050c030b02402004450d00200441f8036c210f2010210403402004109a01200441f8036a2104200f41887c6a220f0d000b0b4108210f410121042011450d0e201141f8036c450d0e201010300c0e0b200341d00f6a200110980120032802d00f2210450d0720032802d80f211720032802d40f2111200341d00f6a2001109901024020032903d00f4209510d00200341880c6a200341d00f6a41c8031085051a200341086a2001109b01024002402003280208450d00200341003602d00f0c010b200341d00f6a2001200328020c10970120032802d00f0d0b0b200341880c6a109c010b02402017450d00201741f8036c210f2010210403402004109a01200441f8036a2104200f41887c6a220f0d000b0b2011450d07201141f8036c450d07201010300c070b200341c8136a200110980120032802c8132210450d0620032802d013210420032802cc132111200341c8136a200110980120032802c813450d0120032802d013211320032903c81321054103210f2010211420112115200421160b200341cc046a200341bc086a41cc031085051a0c0c0b02402004450d00200441f8036c210f2010210403402004109a01200441f8036a2104200f41887c6a220f0d000b0b4108210f410121042011450d0a201141f8036c450d0a201010300c0a0b200341d00f6a200110980120032802d00f2210450d0320032802d80f211720032802d40f2111200341d00f6a2001109901024020032903d00f4209510d00200341880c6a200341d00f6a41c8031085051a200341106a2001109b01024002402003280210450d00200341003602d00f0c010b200341d00f6a2001200328021410970120032802d00f0d090b200341880c6a109c010b02402017450d00201741f8036c210f2010210403402004109a01200441f8036a2104200f41887c6a220f0d000b0b2011450d03201141f8036c450d03201010300c030b200341d00f6a200110980120032802d00f2210450d0220032802d80f211720032802d40f2111200341d00f6a2001109901024020032903d00f4209510d00200341880c6a200341d00f6a41c8031085051a200341186a2001109b01024002402003280218450d00200341003602d00f0c010b200341d00f6a2001200328021c10970120032802d00f0d070b200341880c6a109c010b02402017450d00201741f8036c210f2010210403402004109a01200441f8036a2104200f41887c6a220f0d000b0b2011450d02201141f8036c450d02201010300c020b200341206a2001109d014108210f410121042003290320a70d0720032903282112200341c8136a200110990120032903c8134209510d07200341d00f6a200341c8136a41c8031085051a200341c8136a200110980120032802c8132210450d0220032802d013211620032802cc13211520032802d00f2113200341bc086a200a41c4031085051a4106210f4100210420102114201221050c060b200341c8136a2001109e0120032802c813410c460d00200341d00f6a200341c8136a41f8031085051a0240200128020422044108490d002001280200220f29000021122001200441786a22103602042001200f41086a36020020104108490d00200f29000821182001200441706a22103602042001200f41106a220f3602002010450d00200f2d0000211020012004416f6a3602042001200f41016a360200410021110240024020100e020100020b410121110b200341306a2001109b0120032802300d00200341c8136a20012003280234109f0120032802c8132210450d0020032802d013211620032802cc13211520032903d00f210520032802d80f2113200341bc086a200c41cc031085051a20034198086a41186a200b41186a29030037030020034198086a41106a200b41106a29030037030020034198086a41086a200b41086a2903003703002003200b290300370398084107210f4100210420102114201821192012211a2011211b0c070b200341d00f6a109a010b4108210f410121040c050b200341d00f6a109c010c040b20032802d80f211320032903d00f21052009200341880c6a41c8031085051a200341bc086a200341c8136a41cc031085051a4102210f410021042010211420112115201721160c020b20032802d80f211320032903d00f21052009200341880c6a41c8031085051a200341bc086a200341c8136a41cc031085051a4105210f410021042010211420112115201721160c010b20032802d80f211320032903d00f21052009200341880c6a41c8031085051a200341bc086a200341c8136a41cc031085051a4104210f410021042010211420112115201721160b0b200341cc046a200341bc086a41cc031085051a200341a8046a41186a20034198086a41186a290300370300200341a8046a41106a20034198086a41106a290300370300200341a8046a41086a20034198086a41086a29030037030020032003290398083703a80420040d020b200341dc006a200341cc046a41cc031085051a200341386a41186a2210200341a8046a41186a290300370300200341386a41106a2211200341a8046a41106a290300370300200341386a41086a2217200341a8046a41086a290300370300200320032903a8043703380240200e2007470d00200e4101742204200e41016a2207200420074b1b22044104200441044b1bad4298047e2212422088a74541037421042012a7210702400240200e0d00200341003602c8130c010b200341083602d013200320063602c8132003200e4198046c3602cc130b200341d00f6a20072004200341c8136a106920032802d80f2104024020032802d00f4101470d0020040d040c050b20032802d40f210620044198046e21070b2006200e4198046c6a22042013360018200420053700102004201636000c20042015360008200420143600042004201b3a00012004200f3a00002004411c6a200341dc006a41cc031085051a20044180046a2010290300370000200441f8036a2011290300370000200441f0036a2017290300370000200420032903383700e80320042019370090042004201a37008804200d4198046a210d200e41016a2204210e20042002460d040c000b0b200041003602000240200e450d00200621040340200410a00120044198046a2104200d41e87b6a220d0d000b0b2007450d0320074198046c450d03200610300c030b102a000b102c000b2000200736020420002006360200200041086a20023602000b200341c0176a24000bb50403037f017e077f230041800c6b22022400200241086a2001109b01024002402002280208450d00200041003602000c010b02400240200228020c2203200128020441f8036e2204200420034b1bad42f8037e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b2004102f2206450d010b200441f8036e2107024020030d00410021030c030b200241f8076a410472210841002109410021044100210a02400340200241f8076a2001109e0120022802f807210b20024184046a200841f4031085051a200b410c460d01200241106a20024184046a41f4031085051a0240200a2007470d002009200a41016a220c2009200c4b1b220c4104200c41044b1bad42f8037e2205422088a745410374210c2005a7210702400240200a0d00200241003602f8070c010b2002410836028008200220043602fc07200220063602f8070b200241f00b6a2007200c200241f8076a106920022802f80b210c024020022802f00b4101470d00200c0d040c050b20022802f40b2106200c41f8036e21070b200620046a220c200b360200200c41046a200241106a41f4031085051a200941026a2109200441f8036a21042003200a41016a220a460d040c000b0b200041003602000240200a450d002006210a0340200a109a01200a41f8036a210a200441887c6a22040d000b0b2007450d03200741f8036c450d03200610300c030b102a000b102c000b2000200736020420002006360200200041086a20033602000b200241800c6a24000bfe6b1c087f017e0a7f017e057f017e017f017e047f017e0a7f017e057f017e017f017e047f017e0a7f017e057f017e017f017e047f017e0a7f017e230041e0006b2202240002400240200128020422030d00200042093703000c010b200128020022042d0000210520012003417f6a3602042001200441016a3602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e09000102030405060709080b200042003703000c3a0b200241286a2001109c02024020022d0028410a460d0020002002290328370308200041386a200241286a41306a290300370300200041306a200241286a41286a290300370300200041286a200241286a41206a290300370300200041206a200241286a41186a290300370300200041186a200241286a41106a290300370300200041106a200241306a290300370300200042013703000c3a0b200042093703000c390b200241286a2001109c0220022d00282203410a460d11200241266a220620022d002b3a0000200220022f00293b0124200241306a22072802002105200241286a410c6a2802002108200241286a41106a2209290300210a200241286a41186a220b280200210c200241c4006a280200210d200241286a41206a220e280200210f200241286a41246a2802002110200241286a41286a22112802002112200241286a412c6a2802002113200241286a41306a22142903002115200228022c2104200241286a2001109c02024020022d0028410a460d00200041c0006a2002290328370300200041f0006a2014290300370300200041e8006a2011290300370300200041e0006a200e290300370300200041d8006a200b290300370300200041d0006a2009290300370300200041c8006a2007290300370300200020033a0008200020022f01243b00092000410b6a20062d00003a0000200041386a2015370300200041346a2013360200200041306a20123602002000412c6a2010360200200041286a200f360200200041246a200d360200200041206a200c360200200041186a200a370300200041146a2008360200200041106a20053602002000410c6a2004360200200042023703000c390b20004209370300024002400240024002402003410f710e093d3d0001023d3d033d040b20104101470d3c2013450d3c201210300c3c0b20044101470d3b2008450d3b200510300c3b0b200c4101470d3a200f450d3a200d10300c3a0b2005450d39200410300c390b20044101470d382008450d38200510300c380b200241286a2001109c0220022d00282203410a460d11200241206a41026a20022d002b3a0000200220022f00293b0120200241306a2204280200210b200241346a2205280200210e200241386a2208290300210a200241c0006a220c2802002111200241c4006a22102802002116200241c8006a220f2802002117200241cc006a22132802002114200241d0006a220d2802002118200241d4006a22122802002119200241d8006a22062903002115200228022c2109200241286a2001109c0220022d00282207410a460d0e200241246a41026a20022d002b3a0000200220022f00293b01242004280200211a200528020021052008290300211b200c28020021082010280200211c200f28020021102013280200210c200d28020021132012280200210f2006290300211d200228022c2104200241286a2001109c02024020022d0028410a460d00200041f8006a2002290328370300200041a8016a200241286a41306a290300370300200041a0016a200241286a41286a29030037030020004198016a200241286a41206a29030037030020004190016a200241286a41186a29030037030020004188016a200241286a41106a29030037030020004180016a200241306a290300370300200020033a0008200020022f01203b00092000410b6a200241206a41026a2d00003a0000200041c0006a20073a0000200041386a2015370300200041346a2019360200200041306a20183602002000412c6a2014360200200041286a2017360200200041246a2016360200200041206a2011360200200041186a200a370300200041146a200e360200200041106a200b3602002000410c6a2009360200200041f0006a201d370300200041ec006a200f360200200041e8006a2013360200200041e4006a200c360200200041e0006a2010360200200041dc006a201c360200200041d8006a2008360200200041d0006a201b370300200041cc006a2005360200200041c8006a201a360200200041c4006a2004360200200020022f01243b0041200041c3006a200241246a41026a2d00003a0000200042033703000c380b20004209370300024002400240024002402007410f710e09141400010214140314040b200c4101470d13200f450d13201310300c130b20044101470d122005450d12201a10300c120b20084101470d112010450d11201c10300c110b201a450d10200410300c100b20044101470d0f2005450d0f201a10300c0f0b200241286a2001109c0220022d00282203410a460d112002411c6a41026a20022d002b3a0000200220022f00293b011c200241306a2204280200210b200241346a2205280200210e200241386a2208290300210a200241c0006a220c2802002111200241c4006a22102802002116200241c8006a220f2802002117200241cc006a22132802002114200241d0006a220d2802002118200241d4006a22122802002119200241d8006a22062903002115200228022c2109200241286a2001109c0220022d00282207410a460d12200241206a41026a20022d002b3a0000200220022f00293b01202004280200211a2005280200211c2008290300211b200c28020021082010280200211e200f28020021102013280200210c200d28020021132012280200210f2006290300211d200228022c2105200241286a2001109c0220022d00282204410a460d0b200241246a41026a221f20022d002b3a0000200220022f00293b0124200241306a22202802002112200241286a410c6a2802002106200241286a41106a22212903002122200241286a41186a22232802002124200241c4006a2802002125200241286a41206a22262802002127200241286a41246a2802002128200241286a41286a2229280200212a200241286a412c6a280200212b200241286a41306a222c290300212d200228022c210d200241286a2001109c02024020022d0028410a460d00200041b0016a2002290328370300200041e0016a202c290300370300200041d8016a2029290300370300200041d0016a2026290300370300200041c8016a2023290300370300200041c0016a2021290300370300200041b8016a2020290300370300200020033a0008200020022f011c3b00092000410b6a2002411c6a41026a2d00003a0000200041c0006a20073a0000200041386a2015370300200041346a2019360200200041306a20183602002000412c6a2014360200200041286a2017360200200041246a2016360200200041206a2011360200200041186a200a370300200041146a200e360200200041106a200b3602002000410c6a2009360200200041f8006a20043a0000200041f0006a201d370300200041ec006a200f360200200041e8006a2013360200200041e4006a200c360200200041e0006a2010360200200041dc006a201e360200200041d8006a2008360200200041d0006a201b370300200041cc006a201c360200200041c8006a201a360200200041c4006a2005360200200020022f01203b0041200041c3006a200241206a41026a2d00003a0000200020022f01243b0079200041fb006a201f2d00003a0000200041a8016a202d370300200041a4016a202b360200200041a0016a202a3602002000419c016a202836020020004198016a202736020020004194016a202536020020004190016a202436020020004188016a202237030020004184016a200636020020004180016a2012360200200041fc006a200d360200200042043703000c370b20004209370300024002400240024002402004410f710e09111100010211110311040b20284101470d10202b450d10202a10300c100b200d4101470d0f2006450d0f201210300c0f0b20244101470d0e2027450d0e202510300c0e0b2012450d0d200d10300c0d0b200d4101470d0c2006450d0c201210300c0c0b200241286a2001109c0220022d00282203410a460d12200241186a41026a20022d002b3a0000200220022f00293b0118200241306a2204280200210b200241346a2205280200210e200241386a2208290300210a200241c0006a220c2802002111200241c4006a22102802002116200241c8006a220f2802002117200241cc006a22132802002114200241d0006a220d2802002118200241d4006a22122802002119200241d8006a22062903002115200228022c2109200241286a2001109c0220022d00282207410a460d132002411c6a41026a20022d002b3a0000200220022f00293b011c2004280200211a2005280200211c2008290300211b200c28020021082010280200211e200f28020021102013280200210c200d28020021132012280200210f2006290300211d200228022c2105200241286a2001109c0220022d00282204410a460d14200241206a41026a20022d002b3a0000200220022f00293b0120200241306a220d2802002123200241346a22122802002126200241386a22062903002122200241c0006a22242802002129200241c4006a2228280200212e200241c8006a2227280200212f200241cc006a222b280200212c200241d0006a22252802002130200241d4006a222a2802002131200241d8006a221f290300212d200228022c2121200241286a2001109c0220022d00282220410a460d08200241246a41026a20022d002b3a0000200220022f00293b0124200d28020021322012280200211220062903002133202428020021062028280200213420272802002128202b28020021242025280200212b202a2802002127201f2903002135200228022c210d200241286a2001109c02024020022d0028410a460d00200041e8016a200229032837030020004198026a200241286a41306a29030037030020004190026a200241286a41286a29030037030020004188026a200241286a41206a29030037030020004180026a200241286a41186a290300370300200041f8016a200241286a41106a290300370300200041f0016a200241306a290300370300200020033a0008200020022f01183b00092000410b6a200241186a41026a2d00003a0000200041c0006a20073a0000200041386a2015370300200041346a2019360200200041306a20183602002000412c6a2014360200200041286a2017360200200041246a2016360200200041206a2011360200200041186a200a370300200041146a200e360200200041106a200b3602002000410c6a2009360200200041f8006a20043a0000200041f0006a201d370300200041ec006a200f360200200041e8006a2013360200200041e4006a200c360200200041e0006a2010360200200041dc006a201e360200200041d8006a2008360200200041d0006a201b370300200041cc006a201c360200200041c8006a201a360200200041c4006a2005360200200020022f011c3b0041200041c3006a2002411c6a41026a2d00003a0000200020022f01203b0079200041fb006a200241206a41026a2d00003a0000200041b0016a20203a0000200041a8016a202d370300200041a4016a2031360200200041a0016a20303602002000419c016a202c36020020004198016a202f36020020004194016a202e36020020004190016a202936020020004188016a202237030020004184016a202636020020004180016a2023360200200041fc006a2021360200200041b3016a200241246a41026a2d00003a0000200020022f01243b00b101200041e0016a2035370300200041dc016a2027360200200041d8016a202b360200200041d4016a2024360200200041d0016a2028360200200041cc016a2034360200200041c8016a2006360200200041c0016a2033370300200041bc016a2012360200200041b8016a2032360200200041b4016a200d360200200042053703000c360b20004209370300024002400240024002402020410f710e090e0e0001020e0e030e040b20244101470d0d2027450d0d202b10300c0d0b200d4101470d0c2012450d0c203210300c0c0b20064101470d0b2028450d0b203410300c0b0b2032450d0a200d10300c0a0b200d4101470d092012450d09203210300c090b200241286a2001109c0220022d00282203410a460d14200241146a41026a20022d002b3a0000200220022f00293b0114200241306a2204280200210b200241346a2205280200210e200241386a2208290300210a200241c0006a220c2802002111200241c4006a22102802002116200241c8006a220f2802002117200241cc006a22132802002114200241d0006a220d2802002118200241d4006a22122802002119200241d8006a22062903002115200228022c2109200241286a2001109c0220022d00282207410a460d15200241186a41026a20022d002b3a0000200220022f00293b01182004280200211a2005280200211c2008290300211b200c28020021082010280200211e200f28020021102013280200210c200d28020021132012280200210f2006290300211d200228022c2105200241286a2001109c0220022d00282204410a460d162002411c6a41026a20022d002b3a0000200220022f00293b011c200241306a220d2802002123200241346a22122802002126200241386a22062903002122200241c0006a22242802002129200241c4006a2228280200212e200241c8006a2227280200212f200241cc006a222b280200212c200241d0006a22252802002130200241d4006a222a2802002131200241d8006a221f290300212d200228022c2121200241286a2001109c0220022d00282220410a460d17200241206a41026a20022d002b3a0000200220022f00293b0120200d28020021322012280200213420062903002133202428020021062028280200213620272802002128202b28020021242025280200212b202a2802002127201f2903002135200228022c2112200241286a2001109c0220022d0028220d410a460d05200241246a41026a223720022d002b3a0000200220022f00293b0124200241306a2238280200212a200241286a410c6a280200211f200241286a41106a2239290300213a200241286a41186a223b280200213c200241c4006a280200213d200241286a41206a223e280200213f200241286a41246a2802002140200241286a41286a22412802002142200241286a412c6a2802002143200241286a41306a22442903002145200228022c2125200241286a2001109c02024020022d0028410a460d00200041a0026a2002290328370300200041d0026a2044290300370300200041c8026a2041290300370300200041c0026a203e290300370300200041b8026a203b290300370300200041b0026a2039290300370300200041a8026a2038290300370300200020033a0008200020022f01143b00092000410b6a200241146a41026a2d00003a0000200041c0006a20073a0000200041386a2015370300200041346a2019360200200041306a20183602002000412c6a2014360200200041286a2017360200200041246a2016360200200041206a2011360200200041186a200a370300200041146a200e360200200041106a200b3602002000410c6a2009360200200041f8006a20043a0000200041f0006a201d370300200041ec006a200f360200200041e8006a2013360200200041e4006a200c360200200041e0006a2010360200200041dc006a201e360200200041d8006a2008360200200041d0006a201b370300200041cc006a201c360200200041c8006a201a360200200041c4006a2005360200200020022f01183b0041200041c3006a200241186a41026a2d00003a0000200020022f011c3b0079200041fb006a2002411c6a41026a2d00003a0000200041b0016a20203a0000200041a8016a202d370300200041a4016a2031360200200041a0016a20303602002000419c016a202c36020020004198016a202f36020020004194016a202e36020020004190016a202936020020004188016a202237030020004184016a202636020020004180016a2023360200200041fc006a2021360200200041b3016a200241206a41026a2d00003a0000200020022f01203b00b101200041e8016a200d3a0000200041e0016a2035370300200041dc016a2027360200200041d8016a202b360200200041d4016a2024360200200041d0016a2028360200200041cc016a2036360200200041c8016a2006360200200041c0016a2033370300200041bc016a2034360200200041b8016a2032360200200041b4016a2012360200200041eb016a20372d00003a0000200020022f01243b00e90120004198026a204537030020004194026a204336020020004190026a20423602002000418c026a204036020020004188026a203f36020020004184026a203d36020020004180026a203c360200200041f8016a203a370300200041f4016a201f360200200041f0016a202a360200200041ec016a2025360200200042063703000c350b2000420937030002400240024002400240200d410f710e090b0b0001020b0b030b040b20404101470d0a2043450d0a204210300c0a0b20254101470d09201f450d09202a10300c090b203c4101470d08203f450d08203d10300c080b202a450d07202510300c070b20254101470d06201f450d06202a10300c060b200241286a2001109c0220022d00282203410a460d17200241106a41026a20022d002b3a0000200220022f00293b0110200241306a2204280200210b200241346a2205280200210e200241386a2208290300210a200241c0006a220c2802002111200241c4006a22102802002116200241c8006a220f2802002117200241cc006a22132802002114200241d0006a220d2802002118200241d4006a22122802002119200241d8006a22062903002115200228022c2109200241286a2001109c0220022d00282207410a460d18200241146a41026a20022d002b3a0000200220022f00293b01142004280200211a2005280200211c2008290300211b200c28020021082010280200211e200f28020021102013280200210c200d28020021132012280200210f2006290300211d200228022c2105200241286a2001109c0220022d00282204410a460d19200241186a41026a20022d002b3a0000200220022f00293b0118200241306a220d2802002123200241346a22122802002126200241386a22062903002122200241c0006a22242802002129200241c4006a2228280200212e200241c8006a2227280200212f200241cc006a222b280200212c200241d0006a22252802002130200241d4006a222a2802002131200241d8006a221f290300212d200228022c2121200241286a2001109c0220022d00282220410a460d1a2002411c6a41026a20022d002b3a0000200220022f00293b011c200d28020021322012280200213420062903002133202428020021062028280200213620272802002128202b28020021242025280200212b202a2802002127201f2903002135200228022c2112200241286a2001109c0220022d0028220d410a460d1b200241206a41026a20022d002b3a0000200220022f00293b0120200241306a2225280200213b200241346a222a280200213e200241386a221f290300213a200241c0006a223c2802002141200241c4006a22402802002146200241c8006a223f2802002147200241cc006a22432802002144200241d0006a223d2802002148200241d4006a22422802002149200241d8006a22372903002145200228022c2139200241286a2001109c0220022d00282238410a460d02200241246a41026a20022d002b3a0000200220022f00293b01242025280200214a202a280200212a201f290300214b203c280200211f2040280200214c203f28020021402043280200213c203d28020021432042280200213f2037290300214d200228022c2125200241286a2001109c02024020022d0028410a460d00200041d8026a200229032837030020004188036a200241286a41306a29030037030020004180036a200241286a41286a290300370300200041f8026a200241286a41206a290300370300200041f0026a200241286a41186a290300370300200041e8026a200241286a41106a290300370300200041e0026a200241306a290300370300200020033a0008200020022f01103b00092000410b6a200241106a41026a2d00003a0000200041c0006a20073a0000200041386a2015370300200041346a2019360200200041306a20183602002000412c6a2014360200200041286a2017360200200041246a2016360200200041206a2011360200200041186a200a370300200041146a200e360200200041106a200b3602002000410c6a2009360200200041f8006a20043a0000200041f0006a201d370300200041ec006a200f360200200041e8006a2013360200200041e4006a200c360200200041e0006a2010360200200041dc006a201e360200200041d8006a2008360200200041d0006a201b370300200041cc006a201c360200200041c8006a201a360200200041c4006a2005360200200020022f01143b0041200041c3006a200241146a41026a2d00003a0000200020022f01183b0079200041fb006a200241186a41026a2d00003a0000200041b0016a20203a0000200041a8016a202d370300200041a4016a2031360200200041a0016a20303602002000419c016a202c36020020004198016a202f36020020004194016a202e36020020004190016a202936020020004188016a202237030020004184016a202636020020004180016a2023360200200041fc006a2021360200200041b3016a2002411c6a41026a2d00003a0000200020022f011c3b00b101200041e8016a200d3a0000200041e0016a2035370300200041dc016a2027360200200041d8016a202b360200200041d4016a2024360200200041d0016a2028360200200041cc016a2036360200200041c8016a2006360200200041c0016a2033370300200041bc016a2034360200200041b8016a2032360200200041b4016a2012360200200041eb016a200241206a41026a2d00003a0000200020022f01203b00e901200041a0026a20383a000020004198026a204537030020004194026a204936020020004190026a20483602002000418c026a204436020020004188026a204736020020004184026a204636020020004180026a2041360200200041f8016a203a370300200041f4016a203e360200200041f0016a203b360200200041ec016a2039360200200041a3026a200241246a41026a2d00003a0000200020022f01243b00a102200041d0026a204d370300200041cc026a203f360200200041c8026a2043360200200041c4026a203c360200200041c0026a2040360200200041bc026a204c360200200041b8026a201f360200200041b0026a204b370300200041ac026a202a360200200041a8026a204a360200200041a4026a2025360200200042073703000c340b20004209370300024002400240024002402038410f710e09080800010208080308040b203c4101470d07203f450d07204310300c070b20254101470d06202a450d06204a10300c060b201f4101470d052040450d05204c10300c050b204a450d04202510300c040b20254101470d03202a450d03204a10300c030b200042093703000c320b200241286a2001109c0220022d00282203410a460d1a2002410c6a41026a20022d002b3a0000200220022f00293b010c200241306a2204280200210b200241346a2205280200210e200241386a2208290300210a200241c0006a220c2802002111200241c4006a22102802002116200241c8006a220f2802002117200241cc006a22132802002114200241d0006a220d2802002118200241d4006a22122802002119200241d8006a22062903002115200228022c2109200241286a2001109c0220022d00282207410a460d1b200241106a41026a20022d002b3a0000200220022f00293b01102004280200211a2005280200211c2008290300211b200c28020021082010280200211e200f28020021102013280200210c200d28020021132012280200210f2006290300211d200228022c2105200241286a2001109c0220022d00282204410a460d1c200241146a41026a20022d002b3a0000200220022f00293b0114200241306a220d2802002123200241346a22122802002126200241386a22062903002122200241c0006a22242802002129200241c4006a2228280200212e200241c8006a2227280200212f200241cc006a222b280200212c200241d0006a22252802002130200241d4006a222a2802002131200241d8006a221f290300212d200228022c2121200241286a2001109c0220022d00282220410a460d1d200241186a41026a20022d002b3a0000200220022f00293b0118200d28020021322012280200213420062903002133202428020021062028280200213620272802002128202b28020021242025280200212b202a2802002127201f2903002135200228022c2112200241286a2001109c0220022d0028220d410a460d1e2002411c6a41026a20022d002b3a0000200220022f00293b011c200241306a2225280200213b200241346a222a280200213e200241386a221f290300213a200241c0006a223c2802002141200241c4006a22402802002146200241c8006a223f2802002147200241cc006a22432802002144200241d0006a223d2802002148200241d4006a22422802002149200241d8006a22372903002145200228022c2139200241286a2001109c0220022d00282238410a460d1f200241206a41026a20022d002b3a0000200220022f00293b01202025280200214a202a280200214c201f290300214b203c280200211f2040280200214e203f28020021402043280200213c203d28020021432042280200213f2037290300214d200228022c212a200241286a2001109c0220022d00282225410a460d20200241246a41026a224f20022d002b3a0000200220022f00293b0124200241306a22502802002142200241286a410c6a2802002137200241286a41106a22512903002152200241286a41186a22532802002154200241c4006a2802002155200241286a41206a22562802002157200241286a41246a2802002158200241286a41286a2259280200215a200241286a412c6a280200215b200241286a41306a225c290300215d200228022c213d200241286a2001109c02024020022d0028410a460d0020004190036a2002290328370300200041c0036a205c290300370300200041b8036a2059290300370300200041b0036a2056290300370300200041a8036a2053290300370300200041a0036a205129030037030020004198036a2050290300370300200020033a0008200020022f010c3b00092000410b6a2002410c6a41026a2d00003a0000200041c0006a20073a0000200041386a2015370300200041346a2019360200200041306a20183602002000412c6a2014360200200041286a2017360200200041246a2016360200200041206a2011360200200041186a200a370300200041146a200e360200200041106a200b3602002000410c6a2009360200200041f8006a20043a0000200041f0006a201d370300200041ec006a200f360200200041e8006a2013360200200041e4006a200c360200200041e0006a2010360200200041dc006a201e360200200041d8006a2008360200200041d0006a201b370300200041cc006a201c360200200041c8006a201a360200200041c4006a2005360200200020022f01103b0041200041c3006a200241106a41026a2d00003a0000200020022f01143b0079200041fb006a200241146a41026a2d00003a0000200041b0016a20203a0000200041a8016a202d370300200041a4016a2031360200200041a0016a20303602002000419c016a202c36020020004198016a202f36020020004194016a202e36020020004190016a202936020020004188016a202237030020004184016a202636020020004180016a2023360200200041fc006a2021360200200041b3016a200241186a41026a2d00003a0000200020022f01183b00b101200041e8016a200d3a0000200041e0016a2035370300200041dc016a2027360200200041d8016a202b360200200041d4016a2024360200200041d0016a2028360200200041cc016a2036360200200041c8016a2006360200200041c0016a2033370300200041bc016a2034360200200041b8016a2032360200200041b4016a2012360200200041eb016a2002411c6a41026a2d00003a0000200020022f011c3b00e901200041a0026a20383a000020004198026a204537030020004194026a204936020020004190026a20483602002000418c026a204436020020004188026a204736020020004184026a204636020020004180026a2041360200200041f8016a203a370300200041f4016a203e360200200041f0016a203b360200200041ec016a2039360200200041a3026a200241206a41026a2d00003a0000200020022f01203b00a102200041d8026a20253a0000200041d0026a204d370300200041cc026a203f360200200041c8026a2043360200200041c4026a203c360200200041c0026a2040360200200041bc026a204e360200200041b8026a201f360200200041b0026a204b370300200041ac026a204c360200200041a8026a204a360200200041a4026a202a360200200041db026a204f2d00003a0000200020022f01243b00d90220004188036a205d37030020004184036a205b36020020004180036a205a360200200041fc026a2058360200200041f8026a2057360200200041f4026a2055360200200041f0026a2054360200200041e8026a2052370300200041e4026a2037360200200041e0026a2042360200200041dc026a203d360200200042083703000c320b200042093703000240024002400240024002402025410f710e09313100010231310331040b20584101470d30205b450d30205a10300c300b203d4101470d2f20370d030c2f0b20544101470d2e2057450d2e205510300c2e0b2042450d2d203d10300c2d0b203d4101470d2c2037450d2c0b204210300c2b0b200042093703000b024002400240024002400240200d410f710e092b2b0001022b2b032b040b20444101470d2a2049450d2a204810300c2a0b20394101470d29203e0d030c290b20414101470d282047450d28204610300c280b203b450d27203910300c270b20394101470d26203e450d260b203b10300c250b200042093703000b0240024002400240024002402020410f710e09262600010226260326040b20244101470d252027450d25202b10300c250b20124101470d2420340d030c240b20064101470d232028450d23203610300c230b2032450d22201210300c220b20124101470d212034450d210b203210300c200b200042093703000b0240024002400240024002402004410f710e09222200010222220322040b202c4101470d212031450d21203010300c210b20214101470d2020260d030c200b20294101470d1f202f450d1f202e10300c1f0b2023450d1e202110300c1e0b20214101470d1d2026450d1d0b202310300c1c0b200042093703000b0240024002400240024002402007410f710e091f1f0001021f1f031f040b200c4101470d1e200f450d1e201310300c1e0b20054101470d1d201c0d030c1d0b20084101470d1c2010450d1c201e10300c1c0b201a450d1b200510300c1b0b20054101470d1a201c450d1a0b201a10300c190b200042093703000b0240024002400240024002402003410f710e092d2d0001022d2d032d040b20144101470d2c2019450d2c201810300c2c0b20094101470d2b200e0d030c2b0b20114101470d2a2017450d2a201610300c2a0b200b450d29200910300c290b20094101470d28200e450d280b200b10300c270b200042093703000c260b200042093703000c250b200042093703000c240b200042093703000c130b200042093703000c220b200042093703000c130b200042093703000c110b200042093703000c1f0b200042093703000c130b200042093703000c110b200042093703000c0f0b200042093703000c1b0b200042093703000c130b200042093703000c110b200042093703000c0f0b200042093703000c0d0b200042093703000c160b200042093703000c140b200042093703000c120b200042093703000c100b200042093703000c0e0b200042093703000c0c0b200042093703000c0a0b0240024002400240024002402003410f710e09151500010215150315040b20144101470d142019450d14201810300c140b20094101470d13200e0d030c130b20114101470d122017450d12201610300c120b200b450d11200910300c110b20094101470d10200e450d100b200b10300c0f0b0240024002400240024002402007410f710e09060600010206060306040b200c4101470d05200f450d05201310300c050b20054101470d04201c0d030c040b20084101470d032010450d03201e10300c030b201a450d02200510300c020b20054101470d01201c450d010b201a10300b0240024002400240024002402003410f710e09131300010213130313040b20144101470d122019450d12201810300c120b20094101470d11200e0d030c110b20114101470d102017450d10201610300c100b200b450d0f200910300c0f0b20094101470d0e200e450d0e0b200b10300c0d0b0240024002400240024002402004410f710e09060600010206060306040b202c4101470d052031450d05203010300c050b20214101470d0420260d030c040b20294101470d03202f450d03202e10300c030b2023450d02202110300c020b20214101470d012026450d010b202310300b0240024002400240024002402007410f710e09060600010206060306040b200c4101470d05200f450d05201310300c050b20054101470d04201c0d030c040b20084101470d032010450d03201e10300c030b201a450d02200510300c020b20054101470d01201c450d010b201a10300b0240024002400240024002402003410f710e09101000010210100310040b20144101470d0f2019450d0f201810300c0f0b20094101470d0e200e0d030c0e0b20114101470d0d2017450d0d201610300c0d0b200b450d0c200910300c0c0b20094101470d0b200e450d0b0b200b10300c0a0b0240024002400240024002402020410f710e09060600010206060306040b20244101470d052027450d05202b10300c050b20124101470d0420340d030c040b20064101470d032028450d03203610300c030b2032450d02201210300c020b20124101470d012034450d010b203210300b0240024002400240024002402004410f710e09060600010206060306040b202c4101470d052031450d05203010300c050b20214101470d0420260d030c040b20294101470d03202f450d03202e10300c030b2023450d02202110300c020b20214101470d012026450d010b202310300b0240024002400240024002402007410f710e09060600010206060306040b200c4101470d05200f450d05201310300c050b20054101470d04201c0d030c040b20084101470d032010450d03201e10300c030b201a450d02200510300c020b20054101470d01201c450d010b201a10300b0240024002400240024002402003410f710e090c0c0001020c0c030c040b20144101470d0b2019450d0b201810300c0b0b20094101470d0a200e0d030c0a0b20114101470d092017450d09201610300c090b200b450d08200910300c080b20094101470d07200e450d070b200b10300c060b0240024002400240024002402038410f710e09060600010206060306040b203c4101470d05203f450d05204310300c050b202a4101470d04204c0d030c040b201f4101470d032040450d03204e10300c030b204a450d02202a10300c020b202a4101470d01204c450d010b204a10300b024002400240024002400240200d410f710e09060600010206060306040b20444101470d052049450d05204810300c050b20394101470d04203e0d030c040b20414101470d032047450d03204610300c030b203b450d02203910300c020b20394101470d01203e450d010b203b10300b0240024002400240024002402020410f710e09060600010206060306040b20244101470d052027450d05202b10300c050b20124101470d0420340d030c040b20064101470d032028450d03203610300c030b2032450d02201210300c020b20124101470d012034450d010b203210300b0240024002400240024002402004410f710e09060600010206060306040b202c4101470d052031450d05203010300c050b20214101470d0420260d030c040b20294101470d03202f450d03202e10300c030b2023450d02202110300c020b20214101470d012026450d010b202310300b0240024002400240024002402007410f710e09060600010206060306040b200c4101470d05200f450d05201310300c050b20054101470d04201c0d030c040b20084101470d032010450d03201e10300c030b201a450d02200510300c020b20054101470d01201c450d010b201a10300b0240024002400240024002402003410f710e09060600010206060306040b20144101470d052019450d05201810300c050b20094101470d04200e0d030c040b20114101470d032017450d03201610300c030b200b450d02200910300c020b20094101470d01200e450d010b200b10300b200241e0006a24000beb010002400240024002400240024002400240024020002802000e0b0808080800010203040506070b200041086a280200450d07200028020410300f0b200041086a280200450d06200028020410300f0b200041086a109c010f0b200041086a109c010f0b200041086a280200450d03200028020410300f0b0240200041086a280200450d00200028020410300b200041106a2d00004106490d02200041186a280200450d02200041146a28020010300f0b200041086a109c010c010b200041086a109c01200041d0036a2d00004106490d00200041d8036a280200450d00200041d4036a28020010300f0b0bcf0201067f0240024020012802042202450d00200128020022032d0000210420012002417f6a2205360204410121062001200341016a3602000240200441037122074103460d0002400240024020070e03000102000b20044102762107410021060c040b41012106024020050d000c040b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d03200141fcff03714102762107410021060c030b20054103490d01200341036a2d0000210620032f0001210720012002417c6a3602042001200341046a3602002007200641107472410874200472220141808004492106200141027621070c020b0240200441034d0d000c020b20054104490d012003280001210720012002417b6a3602042001200341056a36020020074180808080044921060c010b410121060b20002007360204200020063602000bf0020002400240024002400240024002400240024020002802000e080700010203040506080b200041086a10f4010f0b200041086a10f401200041c0006a10f4010f0b200041086a10f401200041c0006a10f401200041f8006a10f4010f0b200041086a10f401200041c0006a10f401200041f8006a10f401200041b0016a10f4010f0b200041086a10f401200041c0006a10f401200041f8006a10f401200041b0016a10f401200041e8016a10f4010f0b200041086a10f401200041c0006a10f401200041f8006a10f401200041b0016a10f401200041e8016a10f401200041a0026a10f4010f0b200041086a10f401200041c0006a10f401200041f8006a10f401200041b0016a10f401200041e8016a10f401200041a0026a10f401200041d8026a10f4010b0f0b200041086a10f401200041c0006a10f401200041f8006a10f401200041b0016a10f401200041e8016a10f401200041a0026a10f401200041d8026a10f40120004190036a10f4010bb00404057f017e017f017e0240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a360200024002400240200441037122064103460d000240024020060e03030001030b41012106024020050d000c060b20032d0001210520012002417e6a3602042001200341026a3602002005410874200472220141ffff0371418002490d05200141fcff0371410276ad21070c030b410121060240200541034f0d000c050b200341036a2d0000210520032f0001210820012002417c6a3602042001200341046a3602002008200541107472410874200472220141808004490d042001410276ad21070c020b024002400240200441027622080e050002020201020b20054104490d042003350001210720012002417b6a3602042001200341056a36020020074280808080045421060c050b20054108490d03200329000121072001200241776a3602042001200341096a3602002007428080808080808080015421060c040b200441134b0d02200841046a21052002417e6a2102200341026a2103410021044200210741012106034002402002417f470d000c050b2003417f6a310000210920012002360204200120033602002002417f6a2102200341016a210320092004410374413871ad862007842107200441016a220441ff01712005490d000b2007427f412820084103746b413871ad885821060c030b2004410276ad21070b410021060c010b410121060b2000200737030820002006ad3703000bbe0e02047f027e230041b00b6b2202240002400240200128020422030d002000410c3602000c010b200128020022042d0000210520012003417f6a3602042001200441016a3602000240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c000102030405060708090a0c0b0b200041003602000c130b200041013602000c120b200041023602000c110b200041033602000c100b20022001109b01024020022802000d002001280204220420022802042203490d002003417f4c0d0a0240024020030d00410121050c010b2003102f2205450d0c2005410020031087051a200128020421040b024020042003490d002005200128020020031085052105200128020422042003490d0e20002005360204200041043602002001200420036b360204200041086a2003ad22064220862006843702002001200128020020036a3602000c110b200510300b2000410c3602000c0f0b200241086a2001109b01024020022802080d0020012802042204200228020c2203490d002003417f4c0d090240024020030d00410121050c010b2003102f2205450d0b2005410020031087051a200128020421040b024020042003490d002005200128020020031085052105200128020422042003490d0e20002005360204200041053602002001200420036b360204200041086a2003ad22064220862006843702002001200128020020036a3602000c100b200510300b2000410c3602000c0e0b200241e8076a2001109901024020022903e8074209510d00200241a0046a200241e8076a41c8031085051a200241d0006a41046a200241a0046a41c8031085051a20004106360200200041046a200241d0006a41cc031085051a0c0e0b2000410c3602000c0d0b200241e8076a2001109901024020022903e8074209510d00200241a0046a200241e8076a41c8031085051a200241d0006a41046a200241a0046a41c8031085051a20004107360200200041046a200241d0006a41cc031085051a0c0d0b2000410c3602000c0c0b200241286a2001109b010240024020022802280d0020012802042204200228022c2203490d002003417f4c0d070240024020030d00410121050c010b2003102f2205450d092005410020031087051a200128020421040b024020042003490d0020052001280200200310850521052001280204220420034f0d022003200441f0f5c100104a000b200510300b2000410c3602000c0c0b2001200420036b3602042001200128020020036a360200200241106a200110c9022002290310a7450d0a2000410c3602002003450d0b200510300c0b0b200241306a2001109b010240024020022802300d002001280204220420022802342203490d002003417f4c0d060240024020030d00410121050c010b2003102f2205450d082005410020031087051a200128020421040b024020042003490d0020052001280200200310850521052001280204220420034f0d022003200441f0f5c100104a000b200510300b2000410c3602000c0b0b2001200420036b3602042001200128020020036a360200200241d0006a200110ca02024020022d00504107460d00200041106a2002290350370300200041306a200241d0006a41206a290300370300200041286a200241d0006a41186a290300370300200041206a200241d0006a41106a290300370300200041186a200241d0006a41086a2903003703002000410c6a2003360200200041086a200336020020002005360204200041093602000c0b0b2000410c3602002003450d0a200510300c0a0b200241e8076a200110990120022903e8074209510d02200241a0046a200241e8076a41c8031085051a200241386a200110c90202402002290338a70d00200241c8006a290300210620022903402107200241d0006a41046a200241a0046a41c8031085051a2000410a360200200041046a200241d0006a41cc031085051a200041d8036a2006370300200041d0036a20073703000c0a0b2000410c360200200241a0046a109c010c090b2000410c3602000c080b200241e8076a200110990120022903e8074209510d03200241a0046a200241e8076a41c8031085051a200241e8076a200110ca02024020022d00e8074107460d00200041d0036a20022903e807370300200041f0036a20024188086a290300370300200041e8036a20024180086a290300370300200041e0036a200241f8076a290300370300200041d8036a200241f0076a290300370300200241d0006a41046a200241a0046a41c8031085051a2000410b360200200041046a200241d0006a41cc031085051a0c080b2000410c360200200241a0046a109c010c070b2000410c3602000c060b102c000b102a000b2000410c3602000c030b2003200441f0f5c100104a000b2003200441f0f5c100104a000b200241106a41106a2903002106200229031821072000200536020420004108360200200041106a20073703002000410c6a2003360200200041086a2003360200200041186a20063703000b200241b00b6a24000b920403027f017e077f230041d00b6b220324000240024002402002200128020441e8036e2204200420024b1bad42e8037e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b2004102f2206450d010b200441e8036e2107024020020d00410021020c030b200341d8076a410172210841002109410021044100210a02400340200341d8076a200110a10120032d00d807210b200341f1036a200841e7031085051a200b410b460d012003410a6a200341f1036a41e7031085051a0240200a2007470d002009200a41016a220c2009200c4b1b220c4104200c41044b1bad42e8037e2205422088a745410374210c2005a7210702400240200a0d00200341003602d8070c010b200341083602e007200320043602dc07200320063602d8070b200341c00b6a2007200c200341d8076a106920032802c80b210c024020032802c00b4101470d00200c0d040c050b20032802c40b2106200c41e8036e21070b200620046a220c200b3a0000200c41016a2003410a6a41e7031085051a200941026a2109200441e8036a21042002200a41016a220a460d040c000b0b200041003602000240200a450d002006210a0340200a10a201200a41e8036a210a200441987c6a22040d000b0b2007450d03200741e8036c450d03200610300c030b102a000b102c000b2000200736020420002006360200200041086a20023602000b200341d00b6a24000bc50801027f0240024002400240024002400240024020002d00000e0707000102030405060b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041106a109c010f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0520024198046c450d05200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b0240200041186a2802002201450d00200041106a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b200041146a2802002202450d04200241f8036c450d04200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0320024198046c450d03200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0220024198046c450d02200028021010300f0b200041186a109c0102402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b200041086a2802002202450d01200241f8036c450d01200028020410300c010b200041106a109a0102402000410c6a2802002201450d00200041046a2802002102200141e8036c21010340200210a201200241e8036a2102200141987c6a22010d000b0b200041086a2802002202450d00200241e8036c450d00200028020410300f0b0b941503057f027e017f230041900c6b2202240002400240200128020422030d002000410b3a00000c010b200128020022042d0000210520012003417f6a22063602042001200441016a3602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0b000102030405060708090b0a0b200241a8086a200110980120022802a8082203450d13200241b0086a280200210520022802ac08210420022001109b01024002402002280200450d00200241003602a8080c010b200241a8086a2001200228020410970120022802a8080d220b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d22200441f8036c450d22200310300c220b200241a8086a200110980120022802a8082203450d11200241b0086a280200210520022802ac082104200241086a2001109b01024002402002280208450d00200241003602a8080c010b200241a8086a2001200228020c10970120022802a8080d200b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d21200441f8036c450d21200310300c210b200241a8086a200110980120022802a8082203450d0f200241b0086a280200210520022802ac082104200241106a2001109b01024002402002280210450d00200241003602a8080c010b200241a8086a2001200228021410970120022802a8080d1e0b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d20200441f8036c450d20200310300c200b200241186a2001109d012002290318a70d11024020012802042203450d0020022903202107200128020022042d0000210520012003417f6a3602042001200441016a36020020050d00200241a8086a200110980120022802a8082201450d0020022902ac082108200041106a2007370300200041086a2008370000200041046a2001360000200041033a00000c200b2000410b3a00000c1f0b200241a8086a200110980120022802a8082203450d11200241a8086a41086a280200210520022802ac082104200241a8086a2001109901024020022903a8084209510d00200041106a200241a8086a41c8031085051a2000410c6a2005360000200041086a2004360000200041046a2003360000200041043a00000c1f0b2000410b3a000002402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d1e200441f8036c450d1e200310300c1e0b200241c0046a200110980120022802c0042203450d11200241c8046a280200210520022802c4042104200241c0046a200110990120022903c0044209510d0a200241f8006a200241c0046a41c8031085051a200241286a2001109b01024002402002280228450d00200241003602c0040c010b200241c0046a2001200228022c10970120022802c0040d1a0b2000410b3a0000200241f8006a109c010c0b0b2006450d1120042d0001210520012003417e6a22063602042001200441026a36020041002109024002400240024020050e0403000102150b410121090c020b410221090c010b410321090b02400240024020064108490d00200429000221072001200341766a36020420012004410a6a360200200241306a2001109b0120022802300d022001280204220420022802342203490d022003417f4c0d150240024020030d00410121050c010b2003102f2205450d092005410020031087051a200128020421040b20042003490d012005200128020020031085052105200128020422042003490d1a200020093a0001200041063a00002001200420036b360204200041186a2007370300200041106a41003a0000200041086a2003ad2207422086200784370100200041046a20053601002001200128020020036a3602000c1f0b2000410b3a00000c1e0b200510300b2000410b3a00000c1c0b200241c8006a2001109b0120022802480d12200228024c2103200241c0006a2001109b0120022802400d1320022802442104200241386a2001109b01024020022802380d00200228023c2101200041073a00002000410c6a2001360200200041086a2004360200200041046a20033602000c1c0b2000410b3a00000c1b0b200241d0006a2001109b01024020022802500d0020022802542101200041083a0000200041046a20013602000c1b0b2000410b3a00000c1a0b200241e8006a2001109b0120022802680d12200228026c2103200241e0006a2001109b0120022802600d1320022802642104200241d8006a2001109b01024020022802580d00200228025c2101200041093a00002000410c6a2001360200200041086a2004360200200041046a20033602000c1a0b2000410b3a00000c190b2000410b3a00000c180b200241a8086a200110990120022903a8084209510d01200241f8006a200241a8086a41c8031085051a200241a8086a200110a10120022d00a8082101200241c0046a200241a8086a41017241e7031085051a2001410b460d0341e803102f22030d020b102a000b2000410b3a00000c150b200320013a0000200341016a200241c0046a41e7031085051a200041086a200241f8006a41c8031085051a200041046a20033602002000410a3a00000c140b2000410b3a0000200241f8006a109c010c130b2000410b3a00000b02402005450d00200541f8036c21002003210103402001109a01200141f8036a2101200041887c6a22000d000b0b2004450d11200441f8036c450d11200310300c110b2000410b3a00000c100b2000410b3a00000c0f0b2000410b3a00000c0e0b2000410b3a00000c0d0b2000410b3a00000c0c0b2000410b3a00000c0b0b2000410b3a00000c0a0b102c000b2000410b3a00000c080b2000410b3a00000c070b2000410b3a00000c060b2000410b3a00000c050b2003200441f0f5c100104a000b200041106a20022903c004370200200041186a200241c0046a41086a280200360200200241a8086a41046a200241f8006a41c8031085051a200041053a0000200020022f00753b0001200041036a200241f7006a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600002000411c6a200241a8086a41cc031085051a0c030b200041106a20022903a808370200200041186a200241a8086a41086a280200360200200041023a0000200020022f00c0043b0001200041036a200241c0046a41026a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600000c020b200041106a20022903a808370200200041186a200241a8086a41086a280200360200200041013a0000200020022f00c0043b0001200041036a200241c2046a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600000c010b200041106a20022903a808370200200041186a200241a8086a41086a280200360200200041003a0000200020022f00c0043b0001200041036a200241c2046a2d00003a00002000410c6a2005360000200041086a2004360000200041046a20033600000b200241900c6a24000b820801027f02400240024002400240024002400240024020002d00000e0a00010203040506070707080b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b0240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0620024198046c450d06200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b0240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0520024198046c450d05200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b0240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0420024198046c450d04200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b200041086a2802002202450d03200241f8036c450d03200028020410300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041106a109c010f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0120024198046c450d01200028021010300f0b200041086a280200450d00200041046a28020010300b0f0b200041086a109c01200041046a220228020010a201200228020010300b891507027f017e0b7f017e057f037e017f230041c0176b22032400024002400240200220012802044198046e2204200420024b1bad4298047e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b2004102f2206450d010b20044198046e2107024020020d00410021020c030b200341c8136a410c6a2108200341c8136a41046a2109200341d00f6a410472210a200341a8136a210b200341d00f6a410c6a210c4100210d0240034020012802042204450d012001280200220e2d0000210f20012004417f6a3602042001200e41016a3602004100210e02400240024002400240024002400240024002400240024002400240024002400240200f0e080300010205060708120b200341c8136a200110980120032802c813220f450d0820032802d013210420032802cc132110200341c8136a2001109901024020032903c81322114209510d0020032802d0132112200341bc086a200841bc031085051a4101210e200f21132010211420042115201121050c030b02402004450d00200441f8036c210e200f210403402004109a01200441f8036a2104200e41887c6a220e0d000b0b4108210e410121042010450d0e201041f8036c450d0e200f10300c0e0b200341d00f6a200110980120032802d00f220f450d0720032802d80f211620032802d40f2110200341d00f6a2001109901024020032903d00f4209510d00200341880c6a200341d00f6a41c8031085051a200341086a2001109b01024002402003280208450d00200341003602d00f0c010b200341d00f6a2001200328020c10970120032802d00f0d0b0b200341880c6a109c010b02402016450d00201641f8036c210e200f210403402004109a01200441f8036a2104200e41887c6a220e0d000b0b2010450d07201041f8036c450d07200f10300c070b200341c8136a200110980120032802c813220f450d0620032802d013210420032802cc132110200341c8136a200110980120032802c813450d0120032802d013211220032903c81321054103210e200f211320102114200421150b200341cc046a200341bc086a41cc031085051a0c0c0b02402004450d00200441f8036c210e200f210403402004109a01200441f8036a2104200e41887c6a220e0d000b0b4108210e410121042010450d0a201041f8036c450d0a200f10300c0a0b200341d00f6a200110980120032802d00f220f450d0320032802d80f211620032802d40f2110200341d00f6a2001109901024020032903d00f4209510d00200341880c6a200341d00f6a41c8031085051a200341106a2001109b01024002402003280210450d00200341003602d00f0c010b200341d00f6a2001200328021410970120032802d00f0d090b200341880c6a109c010b02402016450d00201641f8036c210e200f210403402004109a01200441f8036a2104200e41887c6a220e0d000b0b2010450d03201041f8036c450d03200f10300c030b200341d00f6a200110980120032802d00f220f450d0220032802d80f211620032802d40f2110200341d00f6a2001109901024020032903d00f4209510d00200341880c6a200341d00f6a41c8031085051a200341186a2001109b01024002402003280218450d00200341003602d00f0c010b200341d00f6a2001200328021c10970120032802d00f0d070b200341880c6a109c010b02402016450d00201641f8036c210e200f210403402004109a01200441f8036a2104200e41887c6a220e0d000b0b2010450d02201041f8036c450d02200f10300c020b200341206a2001109d014108210e410121042003290320a70d0720032903282111200341c8136a200110990120032903c8134209510d07200341d00f6a200341c8136a41c8031085051a200341c8136a200110980120032802c813220f450d0220032802d013211520032802cc13211420032802d00f2112200341bc086a200a41c4031085051a4106210e41002104200f2113201121050c060b200341c8136a2001109e0120032802c813410c460d00200341d00f6a200341c8136a41f8031085051a0240200128020422044108490d002001280200220e29000021112001200441786a220f3602042001200e41086a360200200f4108490d00200e29000821172001200441706a220f3602042001200e41106a220e360200200f450d00200e2d0000210f20012004416f6a3602042001200e41016a3602004100211002400240200f0e020100020b410121100b200341306a2001109b0120032802300d00200341c8136a2001200328023410940120032802c813220f450d0020032802d013211520032802cc13211420032903d00f210520032802d80f2112200341bc086a200c41cc031085051a20034198086a41186a200b41186a29030037030020034198086a41106a200b41106a29030037030020034198086a41086a200b41086a2903003703002003200b290300370398084107210e41002104200f211320172118201121192010211a0c070b200341d00f6a109a010b4108210e410121040c050b200341d00f6a109c010c040b20032802d80f211220032903d00f21052009200341880c6a41c8031085051a200341bc086a200341c8136a41cc031085051a4102210e41002104200f211320102114201621150c020b20032802d80f211220032903d00f21052009200341880c6a41c8031085051a200341bc086a200341c8136a41cc031085051a4105210e41002104200f211320102114201621150c010b20032802d80f211220032903d00f21052009200341880c6a41c8031085051a200341bc086a200341c8136a41cc031085051a4104210e41002104200f211320102114201621150b0b200341cc046a200341bc086a41cc031085051a200341a8046a41186a20034198086a41186a290300370300200341a8046a41106a20034198086a41106a290300370300200341a8046a41086a20034198086a41086a29030037030020032003290398083703a80420040d020b200341dc006a200341cc046a41cc031085051a200341386a41186a220f200341a8046a41186a290300370300200341386a41106a2210200341a8046a41106a290300370300200341386a41086a2216200341a8046a41086a290300370300200320032903a8043703380240200d2007470d00200d4101742204200d41016a2207200420074b1b22044104200441044b1bad4298047e2211422088a74541037421042011a7210702400240200d0d00200341003602c8130c010b200341083602d013200320063602c8132003200d4198046c3602cc130b200341d00f6a20072004200341c8136a106920032802d80f2104024020032802d00f4101470d0020040d040c050b20032802d40f210620044198046e21070b2006200d4198046c6a22042012360018200420053700102004201536000c20042014360008200420133600042004201a3a00012004200e3a00002004411c6a200341dc006a41cc031085051a20044180046a200f290300370000200441f8036a2010290300370000200441f0036a2016290300370000200420032903383700e80320042018370090042004201937008804200d41016a2204210d20042002460d040c000b0b200041003602002006200d10a4012007450d0320074198046c450d03200610300c030b102a000b102c000b2000200736020420002006360200200041086a20023602000b200341c0176a24000bf00801037f02402001450d00200020014198046c6a21020340200022034198046a21000240024002400240024002400240024020032d00000e0707000102030405060b02402003410c6a2802002204450d00200341046a2802002101200441f8036c210403402001109a01200141f8036a2101200441887c6a22040d000b0b0240200341086a2802002201450d00200141f8036c450d00200328020410300b200341106a109c010c060b02402003410c6a2802002204450d00200341046a2802002101200441f8036c210403402001109a01200141f8036a2101200441887c6a22040d000b0b0240200341086a2802002201450d00200141f8036c450d00200328020410300b200341206a109c010240200341186a2802002204450d00200341106a280200210120044198046c21040340200110a00120014198046a2101200441e87b6a22040d000b0b200341146a2802002201450d0520014198046c450d05200328021010300c050b02402003410c6a2802002204450d00200341046a2802002101200441f8036c210403402001109a01200141f8036a2101200441887c6a22040d000b0b0240200341086a2802002201450d00200141f8036c450d00200328020410300b0240200341186a2802002204450d00200341106a2802002101200441f8036c210403402001109a01200141f8036a2101200441887c6a22040d000b0b200341146a2802002201450d04200141f8036c450d04200328021010300c040b02402003410c6a2802002204450d00200341046a2802002101200441f8036c210403402001109a01200141f8036a2101200441887c6a22040d000b0b0240200341086a2802002201450d00200141f8036c450d00200328020410300b200341206a109c010240200341186a2802002204450d00200341106a280200210120044198046c21040340200110a00120014198046a2101200441e87b6a22040d000b0b200341146a2802002201450d0320014198046c450d03200328021010300c030b02402003410c6a2802002204450d00200341046a2802002101200441f8036c210403402001109a01200141f8036a2101200441887c6a22040d000b0b0240200341086a2802002201450d00200141f8036c450d00200328020410300b200341206a109c010240200341186a2802002204450d00200341106a280200210120044198046c21040340200110a00120014198046a2101200441e87b6a22040d000b0b200341146a2802002201450d0220014198046c450d02200328021010300c020b200341186a109c0102402003410c6a2802002204450d00200341046a2802002101200441f8036c210403402001109a01200141f8036a2101200441887c6a22040d000b0b200341086a2802002201450d01200141f8036c450d01200328020410300c010b200341106a109a0102402003410c6a2802002204450d00200341046a2802002101200441e8036c210403402001109601200141e8036a2101200441987c6a22040d000b0b200341086a2802002201450d00200141e8036c450d00200328020410300b20002002470d000b0b0bab0101017f230041106b220224000240024002400240200141c000490d00200141808001490d012001418080808004490d02200241033a00032000200241036a41011064200220013602042000200241046a410410640c030b200220014102743a000d20002002410d6a410110640c020b200220014102744101723b010e20002002410e6a410210640c010b200220014102744102723602082000200241086a410410640b200241106a24000bb30101017f230041106b220324000240024002400240200141c000490d00200141808001490d012001418080808004490d02200341033a00032002200341036a41011064200320013602042002200341046a410410640c030b200320014102743a000d20022003410d6a410110640c020b200320014102744101723b010e20022003410e6a410210640c010b200320014102744102723602082002200341086a410410640b2002200020011064200341106a24000bdd0b01057f230041206b21020240024020012802042203450d00200128020022042d0000210520012003417f6a2206360204200241013602082001200441016a360200200220053a000c20060d01200041013a00000f0b200041013a00000f0b200128020022042d0000210520012003417e6a22063602042001200441016a360200200220053a000d200241023602080240024002400240024002400240024002400240024002400240024002400240024002402006450d00200128020022042d0000210520012003417d6a22063602042001200441016a360200200220053a000e200241033602082006450d01200128020022042d0000210520012003417c6a22063602042001200441016a360200200220053a000f200241043602082006450d02200128020022042d0000210520012003417b6a22063602042001200441016a360200200241106a20053a0000200241053602082006450d03200128020022042d0000210520012003417a6a22063602042001200441016a360200200241116a20053a0000200241063602082006450d04200128020022042d000021052001200341796a22063602042001200441016a360200200241126a20053a0000200241073602082006450d05200128020022042d000021052001200341786a22063602042001200441016a360200200241136a20053a0000200241083602082006450d06200128020022042d000021052001200341776a22063602042001200441016a360200200241146a20053a0000200241093602082006450d07200128020022042d000021052001200341766a22063602042001200441016a360200200241156a20053a00002002410a3602082006450d08200128020022042d000021052001200341756a22063602042001200441016a360200200241166a20053a00002002410b3602082006450d09200128020022042d000021052001200341746a22063602042001200441016a360200200241176a20053a00002002410c3602082006450d0a200128020022042d000021052001200341736a22063602042001200441016a360200200241186a20053a00002002410d3602082006450d0b200128020022042d000021052001200341726a22063602042001200441016a360200200241196a20053a00002002410e3602082006450d0c200128020022042d000021052001200341716a22063602042001200441016a3602002002411a6a20053a00002002410f3602082006450d0d200128020022042d000021052001200341706a22063602042001200441016a3602002002411b6a20053a0000200241103602082006450d0e200128020022042d0000210520012003416f6a22063602042001200441016a3602002002411c6a20053a0000200241113602082006450d0f200128020022042d0000210520012003416e6a22063602042001200441016a3602002002411d6a20053a0000200241123602082006450d10200128020022042d0000210520012003416d6a22063602042001200441016a3602002002411e6a20053a0000200241133602082006450d112002411f6a200128020022042d000022053a000020012003416c6a3602042001200441016a360200200020022f010c3b0001200041036a20022d000e3a0000200041046a200228000f360000200041086a200241086a410b6a2f00003b00002000410a6a200241156a2d00003a00002002411d6a2f00002101200241143602082000410b6a200241166a280100360000200041116a200241086a41146a2d00003a00002000410f6a200241086a41126a2f01003b0000200041146a20053a0000200041126a20013b0000200041003a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000f0b200041013a00000bb90202057f017e230041106b22012400200142003703080240024020002802042202450d00200028020022032d0000210420002002417f6a2205360204200141013602082000200341016a360200200120043a000c2005450d00200028020022032d0000210420002002417e6a22053602042000200341016a36020020014102360208200120043a000d2005450d00200028020022032d0000210420002002417d6a22053602042000200341016a36020020014103360208200120043a000e2005450d00200028020022032d0000210420002002417c6a3602042000200341016a360200200120043a000f20014104360208024020012903082206a741044f0d0041fef8c100411b419cf9c100102d000b2006422088a72102410021000c010b41012100410021020b200141106a24002002ad4208862000ad840bd20403087f017e017f230041e0006b220241086a41047221032001280204210441002105024003402004450d01200128020022062d0000210720012004417f6a22043602042001200641016a360200200320056a20073a00002002200541016a220636020820062105200641c000470d000b2002200241086a41356a22012900003703502002200241c4006a290000370057200241396a2800002104200241326a28010021052002412b6a2800002106200241246a28020021072002411d6a2800002103200241166a2801002108200228005321092002290057210a200228000f210b200041036a20022d000e3a0000200020022f010c3b0001200041046a200b3600002000410b6a2008360000200041086a200241086a410b6a2f00003b00002000410a6a200241156a2d00003a0000200041126a20033600002000410f6a200241086a41126a2f01003b0000200041116a2002411c6a2d00003a0000200041166a200241086a41196a2f00003b0000200041186a200241236a2d00003a0000200041196a20073600002000411f6a2002412a6a2d00003a00002000411d6a200241086a41206a2f01003b0000200041206a2006360000200041266a200241316a2d00003a0000200041246a200241086a41276a2f00003b0000200041276a20053600002000412d6a200241386a2d00003a00002000412b6a200241086a412e6a2f01003b00002000412e6a2004360000200041346a2002413f6a2d00003a0000200041326a20012f00003b0000200041396a200a370000200041356a2009360000200041003a00000f0b200041013a00000b9b0805077f017e027f017e027f23004180016b22012400200141286a4200370300200141206a22024200370300200141106a41086a420037030020014200370310200141106a41e2a4c000410f10ab01200241a4e0c000411410ab01200141203602342001200141106a36023041002103200141386a200141106a412041002802d4ad421104000240024002400240200128023822040d000c010b200128023c21052001200141386a41086a28020036024c20012004360248200141086a200141c8006a109b010240024020012802080d00410421030240024002400240200128020c2206200128024c4104762202200220064b1b22024104742207417f4c0d0002402002450d002007102f2203450d080b2002ad21082006450d030340200128024c22024104490d0320012802482207280000210920012002417c6a36024c2001200741046a3602482001200141c8006a109b0120012802000d03200128024c220720012802042202490d032002417f4c0d010240024020020d004101210a0c010b2002102f220a450d09200a410020021087051a200128024c21070b20072002490d02200a20012802482002108505210a200128024c22072002490d092001200720026b36024c2001200128024820026a360248024002402008422088220ba722072008a7470d00200741016a220c2007490d032007410174220d200c200c200d491b220c4104200c41044b1b220c41ffffffff0071200c46410274210d200c410474210c0240024020070d00200141003602680c010b20014104360270200120033602682001200b4204863e026c0b200141d8006a200c200d200141e8006a10692001280260210c20012802584101460d01200128025c2103200842808080807083200c410476ad8421080b200320074104746a2207200a36020420072009360200200741086a2002ad220b422086200b8437020020084280808080107c21082006417f6a22060d010c070b0b200c0d070b102c000b200a10300b02402008422088a72202450d0020024104742107200341086a2102034002402002280200450d002002417c6a28020010300b200241106a2102200741706a22070d000b0b0240200842ffffffff008350450d000c020b200310300c010b20030d010b2001420037025c41002103200141002802dc9442360258200141093602542001200141306a3602502001200141d8006a360264200141fc006a41013602002001420137026c200141a0e6c1003602682001200141d0006a360278200141e4006a41d0adc000200141e8006a10321a2001280258200128026010ad01200128025c450d00200128025810300b2005450d00200410300b0240024020030d0020004200370204200041002802e88f423602000c010b20002008370204200020033602000b20014180016a24000f0b102a000b2002200741f0f5c100104a000b3e002002ad4220862001ad8410102101200041086a2202420037000020004200370000200020012900003700002002200141086a290000370000200110300bde0401047f230041c0006b2202240020002802042103200028020021042001280218419c9ec00041012001411c6a28020028020c11000021000240024020030d00200021050c010b2002200436020441012105024020000d00024020012d0000410471450d0041012105200128021841ec9dc0004101200128021c28020c1100000d012001280200210041012105200241013a001720022000360218200241b09dc00036023420022001290218370308200220012d00203a00382002200128020436021c20022001290210370328200220012902083703202002200241176a3602102002200241086a360230200241046a200241186a10d3020d01200228023041c89dc0004102200228023428020c11000021050c010b200241046a200110d30221050b20034101460d00200441016a21002003417f6a2103034020022000360204200541ff0171210441012105024020040d00024020012802002205410471450d00200241013a001720022005360218200241b09dc00036023420022001290218370308200220012d00203a00382002200128020436021c20022001290210370328200220012902083703202002200241176a3602102002200241086a3602300240200241046a200241186a10d3020d00200228023041c89dc0004102200228023428020c11000021050c020b410121050c010b41012105200128021841ab9dc0004102200128021c28020c1100000d00200241046a200110d30221050b200041016a21002003417f6a22030d000b0b41012100024020050d00200128021841ed9dc0004101200128021c28020c11000021000b200241c0006a240020000b0e002001ad4220862000ad8410160b810201027f230041306b22022400200241186a4200370300200241106a22034200370300200241086a420037030020024200370300200241dca4c000410610ab012003418cc4c100410e10ab012002410036022820024201370320410021030240024002400240024020000e03000102040b200241003a002c200241206a2002412c6a410110642002200136022c200241206a2002412c6a410410640c020b200241013a002c200241206a2002412c6a410110640c010b200241023a002c200241206a2002412c6a410110640b200228022421030b2002412020022802202200200228022841002802fcad4211030002402003450d00200010300b200241306a24000bd20201057f230041f0006b22002400200041186a4200370300200041106a22014200370300200041086a420037030020004200370300200041f1a4c000410d10ab01200141b088c100410b10ab01200041203602242000200036022041002101200041286a2000412041002802d4ad4211040002400240200028022822020d000c010b200028022c210302400240200041286a41086a2802004104490d0020022800002104410121010c010b2000420037023c41002101200041002802dc94423602382000410936024c2000200041206a3602482000200041386a360254200041ec006a41013602002000420137025c200041a0e6c1003602582000200041c8006a360268200041d4006a41d0adc000200041d8006a10321a2000280238200028024010ad010240200028023c450d00200028023810300b0b2003450d00200210300b200041f0006a2400200441e40020011b0ba504010d7f230041f0006b22012400200141186a4200370300200141106a22024200370300200141086a420037030020014200370300200141e2a4c000410f10ab01200241c8dcc000411110ab01200141203602242001200136022041002102200141286a2001412041002802d4ad4211040002400240200128022822030d000c010b200128022c2104024002400240200141286a41086a28020022024104490d002002417c7122024104460d0020024108460d002002410c460d0020024110460d0020024114460d00200328000021052003280004210620032800082107200328000c2108200328001021092003280014210a200241686a220241084b0d01410120027441910271450d010b2001420037023c41002102200141002802dc94423602382001410936024c2001200141206a3602482001200141386a360254200141ec006a41013602002001420137025c200141a0e6c1003602582001200141c8006a360268200141d4006a41d0adc000200141d8006a10321a2001280238200128024010ad010240200128023c450d00200128023810300b0c010b2003280020210b200328001c210c2003280018210d410121020b2004450d00200310300b200041246a200b360200200041206a200c3602002000411c6a200d360200200041186a200a360200200041146a2009360200200041106a20083602002000410c6a2007360200200041086a20063602002000200536020420002002360200200141f0006a24000bb02b050e7f027e077f037e027f230041c0036b220124002000412c6a22022802002103200041246a22042802002205280200210620024100360200200041286a4100360200200441bcf5c100360200200041206a22022802002107200241003602002005200741016a22086a2109200541046a21022006417f7341808182847871210a200141b8016a410572210b20014192016a210c20052104024002400240024002400240024002400240024002400240024002400240024003400240024002400240200a0d000340024020022009490d00410021060c040b200441c07d6a210420022802002106200241046a220d21022006418081828478712206418081828478460d000b200641808182847873220a417f6a200a7121060c010b200a417f6a200a7121062002210d0b2003417f6a210320044100200a684103766b41d0006c6a220241546a2d0000220e4102470d01200d21020b02402003450d0003400240024020060d000340200220094f0d04200441c07d6a210420022802002106200241046a220d21022006418081828478712206418081828478460d000b2006418081828478732206417f6a200671210b200d21020c010b2006417f6a200671210b0b200668210d200b210620044100200d4103766b41d0006c6a220d41506a2802004125490d00200d41586a2802001030200b21060c000b0b024002402007450d00200541ff01200741056a1087051a200741074d0d00200841037641076c21020c010b200721020b20002002360228200020073602202000412c6a4100360200200041246a200536020020002d00584101460d0f200041dc006a28020021020240200041c8006a220d28020022042004417f6a2206200041c0006a220928020022042000413c6a220b2802006b716b4101470d00200b10b201200d280200417f6a2106200928020021040b20092006200441016a71360200200041c4006a28020020044102746a2002360200200041386a280200220420024d0d03200141e4006a41026a200041306a220e280200200241fc006c6a220241036a2d00003a0000200141c0006a41086a220d200241206a290000370300200141c0006a41106a200241286a290000370300200141c0006a41186a200241306a290000370300200120022f00013b01642001200229001837034020022800082106200228000c21042002290010210f20022800442103200229003c211020022800402111200228003c210820022800382112200241046a220b280000210920022d0000210a200b4100360200200241003a0000200141286a41106a220b200241d8006a280000360200200141286a41086a2213200241d0006a290000370300200141086a41086a2214200241e4006a290000370300200141086a41106a2215200241ec006a290000370300200141086a41186a2216200241f4006a290000370300200120022900483703282001200229005c370308200a4101470d02200241016a220a2f000021172000280254220241026a200a41026a2d00003a0000200220173b00002002200f37000f2002200436000b2002200636000720022009360003200220012903403700172002411f6a200d2d00003a0000200141ec016a200141dc006a280200360200200141e4016a200141d4006a2902003702002001200129024c3702dc0120014180026a2001290328370300200141b8016a41d0006a2013290300370300200141b8016a41d8006a200b28020036020020014194026a2001290308370200200141b8016a41e4006a2014290300370200200141b8016a41ec006a2015290300370200200141b8016a41f4006a20162903003702002001200141e4006a41026a2d00003a00bb01200120012f01643b00b901200141b8016a41106a200f370300200141c4016a2004360200200141b8016a41206a200d2d00003a0000200141b8016a41186a2001290340370300200141fc016a2003360200200141f4016a2010370200200141f0016a2012360200200141b8016a41086a2006360200200120093602bc01200141013a00b8012000200e200141b8016a10b30136025c200041003a00580c0f0b200241506a280200210a200241b07f6a2202290200210f200241086a2902002110200241106a2902002118200141c8026a41186a2213200241186a290200370300200141c8026a41106a22142018370300200141c8026a41086a221520103703002001200f3703c8022002290025210f2002412d6a2900002110200241356a29000021182002413d6a2900002119200241c5006a290000211a200241cd006a2f00002116200c200241cf006a2d00003a0000200141e8006a41286a20163b0100200141e8006a41206a2202201a370300200141e8006a41186a22162019370300200141e8006a41106a22172018370300200141e8006a41086a221220103703002001200f37036820014198036a41186a201329030037030020014198036a41106a201429030037030020014198036a41086a2015290300370300200120012903c802370398032001200e3a00bc012001200a3602b801200b2001290368370000200b41086a2012290300370000200b41106a2017290300370000200b41186a2016290300370000200b41206a2002290300370000200b41276a200141e8006a41276a280000360000200028024c21022000280250210e02400240200a4125490d0020012802c401210a20012802c00121130c010b200b21130b200120012f01e4013b01f8022001200a3602f402200120133602f002200220014198036a200141f0026a200e28021c110400024020012802b8014125490d0020012802c00110300b200d21022006210a0c000b0b2001410036029401200141003a006c200141003602680240024002400240024020090e050102030400010b200141b8016a41086a200f370300200141b8016a41106a2001290340370300200141b8016a41186a200141c0006a41086a290300370300200141d8016a200141c0006a41106a290300370300200141e0016a200141c0006a41186a290300370300200120063602b801200120043602bc010240024020044125490d00200f422088a7210920012802c80121040c010b200141c1016a21090b20064101762102024002402006410171450d00200420024d0d084101210d200920026a2d0000410f71210b200241016a21020c010b20042002490d064100210b4100210d0b200420026b210a200920026a2102200441017420066b2104024002402010a72206450d00200141a5036a200b3a0000200141a0036a200a3602002001200d3a00a4032001200236029c032001410036029803200141b8026a20014198036a2004410210b401200821090c010b200141a5036a200b3a0000200141a0036a200a3602002001200d3a00a4032001200236029c03410021092001410036029803200141b8026a20014198036a2004410110b4010b20012802c002221b21020240024002400240201b20012802bc02470d00201b41016a2202201b490d16201b41017422042002200420024b1b22024108200241084b1b210202400240201b0d0020014100360298030c010b20014198036a41086a41013602002001201b36029c03200120012802b802360298030b200141c8026a2002410120014198036a1069200141d0026a280200210220012802c8024101460d0120012802cc022104200120023602bc02200120043602b80220012802c00221020b20012802b80220026a41003a0000200120012802c00241016a22023602c002200220012802bc02470d02200241016a220420024f0d010c150b2002450d140c130b2002410174220d2004200d20044b1b22044108200441084b1b21040240024020020d0020014100360298030c010b20014198036a41086a41013602002001200236029c03200120012802b802360298030b200141c8026a2004410120014198036a1069200141d0026a280200210220012802c8024101460d0f20012802cc022104200120023602bc02200120043602b80220012802c00221020b20012802b80220026a41003a0000200120012802c00241016a3602c00202402006450d0020092003200141b8026a10a6010b201241c0046a210720014198036a4101722104200141b8016a41096a211c4100210b200141f0026a411f6a2115200141f0026a41186a210e200141f0026a41106a2113200141f0026a41086a211420122102410021034101210d0240034020022d00002106200241023a0000024020064103470d0020034180fe037141087621040c020b2015200241206a280000360000200e200241196a2900003703002013200241116a2900003703002014200241096a2900003703002001200241016a2900003703f00202400240024002400240024020064102470d00200141023a00c8020c010b0240024020012802bc01220a4125490d0020012802c801210a20012802c40121170c010b201c21170b20012802b80122164101762109024002402016410171450d00200a20094d0d1141012105201720096a2d0000410f71210c200941016a21090c010b200a2009490d0f410021054100210c0b2001200c3a009903200120053a0098032001200a20096b3602a0032001201720096a36029c03200141e8006a20014198036a10b501200141e8006a200b10b601200420012903f002370000200441086a2014290300370000200441106a2013290300370000200441186a200e2903003700002004411f6a2015280000360000200120063a009803200141c8026a200020014198036a200141e8006a10b701200141e8006a200a41017420166b41016a10b80120012d00c8024103460d010b20014198036a41206a200141c8026a41206a29030037030020014198036a41186a200141c8026a41186a29030037030020014198036a41106a200141c8026a41106a29030037030020014198036a41086a200141c8026a41086a290300370300200120012903c802220f37039803410021060240200fa741ff0171417f6a0e020004020b200e200441186a2900003703002013200441106a2900003703002014200441086a290000370300200120042900003703f00220012802bc03220641214f0d0f200141f0026a2006200141b8026a10a6010c020b20034180fe037141087621040c040b20044120200141b8026a10a6010b200d21060b200b41016a210b200d410174210d20062003722103200241246a22022007470d000b20034180fe037141087621040b201b41026a2102201b417e4f0d0a20012802c00222062002490d0b20012802b802201b6a2004410874200341ff0171723b000002402008450d002011450d00200810300b2012103020012802bc014125490d0f20012802c40110300c0f0b4101102f2202450d10200141013602bc02200120023602b802200241003a0000200141013602c0020c0e0b200141b8016a41086a200f370300200141b8016a41106a2001290340370300200141b8016a41186a200141c0006a41086a290300370300200141d8016a200141c0006a41106a290300370300200141e0016a200141c0006a41186a290300370300200120063602b801200120043602bc010240024020044125490d00200f422088a7210920012802c80121040c010b200141c1016a21090b20064101762102024002402006410171450d00200420024d0d0d200141013a009803200141a0036a2004200241016a22066b3602002001200920066a36029c032001200920026a2d0000410f713a0099030c010b20042002490d0b200141a0036a200420026b360200200141003b0198032001200920026a36029c030b200141b8026a20014198036a20122010422088a710b90102402010a7450d00201210300b20012802bc014125490d0d200141c4016a28020010300c0d0b200141b8016a41086a200f370300200141b8016a41106a2001290340370300200141b8016a41186a200141c0006a41086a290300370300200141d8016a200141c0006a41106a290300370300200141e0016a200141c0006a41186a290300370300200120063602b801200120043602bc010240024020044125490d00200f422088a7210220012802c80121040c010b200141c1016a21020b200120063602c002200120043602bc02200120023602b802200141f0026a200141b8026a10ba01200141e8006a200141b8026a4100200210bb012102200141d4026a2003360200200141c8026a41106a2001290328370300200141e0026a200141306a290300370300200141e8026a200141286a41106a280200360200200120103702cc02200120123602c80220014198036a2000200141c8026a200141e8006a10b701200141e8006a200210b80110bc01000b10bd01000b2002200441acf0c1001033000b2002200441e097c200104a000b2002200441f097c2001033000b2009200a41e097c200104a000b2009200a41f097c2001033000b2006412041908ec1001042000b201b200241a08ec1001048000b2002200641a08ec1001042000b2002200441e097c200104a000b2002200441f097c2001033000b2002450d030c020b200028024c21022000280250210420014198036a41086a41002802b8f541360200200141002902b0f54137039803200141b8016a200220014198036a20012802b80220012802c00220042802141107002000280254220220012903b801370000200241186a200141b8016a41186a290300370000200241106a200141b8016a41106a290300370000200241086a200141b8016a41086a2903003700002000200028027c41016a36027c2000280254220241186a290000210f200241106a2900002110200241086a2900002118200041d9006a2002290000370000200041013a0058200041e1006a2018370000200041e9006a2010370000200041f1006a200f370000024020012802bc02450d0020012802b80210300b20012802684125490d00200141f0006a28020010300b0240200041386a2802002204450d0020002802302102200441fc006c210403400240024020022d00000d00200241046a10be010c010b200241246a10be010b200241fc006a2102200441847f6a22040d000b0b0240200041346a2802002202450d00200241fc006c450d00200028023010300b200041c8006a2802002102024002400240200041c0006a28020022042000413c6a2802002206490d00200220044f0d012004200241e8adc0001042000b20022006490d010b0240200241ffffffff0371450d00200041c4006a28020010300b024020002802202206450d0002402000412c6a280200450d00200041246a280200220441046a2102200620046a41016a21092004280200417f73418081828478712106024003400240024020060d000340200220094f0d04200441c07d6a210420022802002106200241046a220d21022006418081828478712206418081828478460d000b2006418081828478732206417f6a200671210b200d21020c010b2006417f6a200671210b0b200668210d200b210620044100200d4103766b41d0006c6a220d41506a2802004125490d00200d41586a2802001030200b21060c000b0b200028022021060b200041246a280200200641016aad42d0007ea76b10300b200141c0036a24000f0b41f8adc0004123419caec000102d000b102a000b102c000beb0201067f230041206b220124000240024002402000410c6a28020022022002417f6a200041046a28020020002802006b716b4101470d00200221030240024002402002450d00200220026a22032002490d04200141106a41086a4104360200200120024102743602142001200028020836021020012003410274200341ffffffff0371200346410274200141106a1069200141086a280200210320012802004101460d01200020012802043602082000410c6a200341027622033602000b20032002410174470d0420002802002204200041046a28020022054d0d022005200220046b22064f0d01200041086a280200220320024102746a200320054102741085051a200041046a2200200028020020026a3602000c020b2003450d02102a000b200041086a2802002202200320066b22034102746a200220044102746a20064102741085051a200020033602000b200141206a24000f0b102c000b41d0f5c000412b41fcf5c000102d000bdf0302047f017e230041a0016b2202240002400240024002402000410c6a22032802002204200041106a280200470d002002200141fc0010850521040240024020002802082201200041046a280200470d00200141016a22032001490d04200141017422052003200520034b1b22034104200341044b1bad42fc007e2206422088a74541027421032006a721050240024020010d0020044100360290010c010b20044198016a41043602002004200141fc006c3602940120042000280200360290010b20044180016a2005200320044190016a106920044188016a28020021012004280280014101460d012000200428028401360200200041046a200141fc006e360200200028020821010b2000280200200141fc006c6a200441fc001085051a20002000280208220441016a3602080c020b2001450d02102a000b2003200041186a280200417f6a200441016a71360200200041146a28020020044102746a28020021042002200141fc0010850521012000280208220320044d0d020240024020002802002200200441fc006c6a22032d00000d002000200441fc006c6a41046a10be010c010b2000200441fc006c6a41246a10be010b2003200141fc001085051a0b200241a0016a240020040f0b102c000b2004200341bcf0c1001033000bbd0701077f230041206b2204240002400240200241ffff03200241ffff03491b220541017641036a2206102f2207450d0020002007360200200041086a4100360200200041046a20063602002002413e2005413e491b210202400240200341ff01714102460d00200541807f7341bf7f20052002461b2106200520026b210341012105034002400240200541ff01714102460d0020054101712102410021052002450d00200621020c010b2003450d030240200341ff014b0d002003417f6a210241022105410021030c010b200341817e6a210341ff012102410221050b200420023a00102000200441106a410110640c000b0b200541406a417f20052002461b2106200520026b210341012105034002400240200541ff01714102460d0020054101712102410021052002450d00200621020c010b2003450d020240200341ff014b0d002003417f6a210241022105410021030c010b200341817e6a210341ff012102410221050b200420023a00102000200441106a410110640c000b0b200141086a2802002102200128020421032001280200210502400240024020012d000c0d00200520024f0d01200220056b2106200320056a2103200041046a22082802002102200041086a220728020021050240034020032d00002101024020052002470d0020022002470d00200241016a22092002490d072002410174220a2009200a20094b1b22094108200941084b1b21090240024020020d00200441003602100c010b2004410136021820042002360214200420002802003602100b200420094101200441106a10692004280208210220042802004101460d0220002004280204360200200820023602000b200028020020056a20013a00002007200541016a2205360200200341016a21032006417f6a22060d000c030b0b20020d030c040b200320056a210620022005200220054b1b20056b21032001410d6a2d0000410f712101200041046a22082802002102200041086a220728020021050340024020052002470d0020022002470d00200241016a22092002490d052002410174220a2009200a20094b1b22094108200941084b1b21090240024020020d00200441003602100c010b2004410136021820042002360214200420002802003602100b200420094101200441106a10692004280208210220042802004101460d0320002004280204360200200820023602000b200028020020056a20013a00002007200541016a22053602002003450d012003417f6a210320062d00002101200641016a21060c000b0b200441206a24000f0b2002450d010b102a000b102c000bd208010d7f230041106b22022400200141086a280200210320012802042104024020012d00004101470d00200020012d0001410f7110b6010b02400240200028020022014125490d002000410c6a28020021050c010b200121050b02400240024002400240024002402005410174200028022c470d00024020014125490d002000410c6a28020021010b20022000200310bd02024020022802004101470d00200241086a2802000d0341d099c200411141e499c200102d000b02400240200028020022054125490d002000410c6a28020022052001490d07200041086a28020021060c010b20052001490d06200041056a21060b200620016a220620036a2006200520016b1086051a2006200420031085051a0240024020002802004125490d002000410c6a21010c010b200021010b2001200520036a3602000c010b0240024020014125490d002000410c6a28020021050c010b200121050b2003450d002005417f6a21050240024020014125490d002000410c6a2207280200220120054d0d07200041086a220828020020056a2d0000417071210620072802002101200828020021070c010b200120054d0d06200041056a220720056a2d000041707121060b200120054d0d02200720056a20063a000002400240200028020022014125490d002000410c6a2802002101200041086a28020021060c010b200041056a21060b200120054d0d03200620056a220120012d000020042d0000410476723a000002402003417f6a2209450d002000410c6a210a200041056a210b20034101200341014b1b417f6a210c410021010340024002400240024020032001460d00200c2001460d01200420016a220d41016a210e02400240200028020022074125490d00200028020c210520002802082108200a21060c010b2007210520002106200b2108412421070b200d2d0000210d200e2d0000210e20052007470d0320022000410110bd0220022802004101470d02200241086a2802000d0741d099c200411141e499c200102d000b2003200341c097c2001033000b200141016a200341d097c2001033000b200028020c210520002802082108200a21060b200820056a200d410474200e411874411c76723a00002006200628020041016a3602002009200141016a2201470d000b0b200420096a210802400240200028020022064125490d002000410c6a22052802002101200041086a28020021070c010b200041056a21072006210120002105412421060b20082d00002108024020012006470d0020022000410110bd02024020022802004101470d00200241086a2802000d0341d099c200411141e499c200102d000b2000410c6a22052802002101200041086a28020021070b200720016a20084104743a00002005200528020041016a3602000b2000200028022c20034101746a36022c200241106a24000f0b102a000b2005200141a097c2001033000b2005200141b097c2001033000b41f49ac200411e41949bc200102d000b20052001419097c2001033000bc00201057f230041106b22022400024002400240024020002d002c4101710d0002400240200028020022034125490d002000410c6a22042802002105200041086a28020021060c010b200041056a21062003210520002104412421030b024020052003470d0020022000410110bd02024020022802004101470d00200241086a2802000d0441d099c200411141e499c200102d000b2000410c6a22042802002105200041086a28020021060b200620056a20014104743a00002004200428020041016a3602000c010b02400240200028020022054125490d002000410c6a2802002105200041086a28020021040c010b200041056a21040b2004450d022005450d02200520046a417f6a220520052d00002001723a00000b2000200028022c41016a36022c200241106a24000f0b102a000b41e494c200413a41a095c2001050000be11905067f017e037f017e067f230041e0026b220424002004200336020c20042001360208024002400240024002400240024002400240024002400240024002400240024020022d00004101460d00200241046a28020021020240200141c8006a220528020022032003417f6a2206200141c0006a220728020022032001413c6a22082802006b716b4101470d00200810b2012005280200417f6a2106200728020021030b20072006200341016a71360200200141c4006a28020020034102746a2002360200200141386a280200220320024d0d02200441106a2001280230200241fc006c6a220141fc001085051a200141046a4100360200200141003a000020042d001022094101460d01200441d4006a2802002107200441cc006a2201290200210a200441d0006a280200210b2001280200210c200441c8006a280200210d200441106a41086a2802002102200428021421062004200441086a3602a40120042004410c6a3602a001200441106a41186a2101200441106a410c6a21030240024002400240024020060e050102030400010b200441a8016a41106a2001290200370300200441a8016a410c6a200341086a280200360200200441a8016a41186a200141086a290200370300200441c8016a200141106a290200370300200441d0016a200141186a290200370300200420023602a80120042003290200220e3702ac0102400240200ea722034125490d00200441b4016a280200210620042802b80121030c010b200441b1016a21060b20024101762101024002402002410171450d00200320014d0d0a41012105200620016a2d0000410f712108200141016a21010c010b20032001490d0841002108410021050b200320016b210f200620016a2101200341017420026b210202400240200aa72203450d00200441a5026a20083a0000200441a0026a200f360200200420053a00a4022004200136029c02200441003602980220044190016a20044198026a2002410210b401200c21060c010b200441a5026a20083a0000200441a0026a200f360200200420053a00a4022004200136029c0241002106200441003602980220044190016a20044198026a2002410110b4010b20042802980122102102024002400240024020102004280294012201470d00201041016a22012010490d17201041017422022001200220014b1b22014108200141084b1b21010240024020100d0020044100360298020c010b20044198026a41086a41013602002004201036029c022004200428029001360298020b200441f0016a2001410120044198026a1069200441f8016a280200210120042802f0014101460d0120042802f40121022004200136029401200420023602900120042802980121020b200428029001220520026a41003a00002004200241016a22023602980120022001470d02200141016a220220014f0d010c160b2001450d150c140b200141017422012002200120024b1b22014108200141084b1b21010240024020042802940122020d0020044100360298020c010b20044198026a41086a41013602002004200236029c0220042005360298020b200441f0016a2001410120044198026a1069200441f8016a280200210120042802f0014101460d0f20042802f40121022004200136029401200420023602900120042802980121020b200d41c0046a210120042802900120026a41003a00002004200241016a3602980102402003450d002006200720044190016a10a6010b200420013602dc01200441d8016a41106a200441a0016a360200200420044190016a3602ec012004200441a8016a3602e40120044198026a410172210f200441e4016a21114100210620044198026a410572220541086a2112200541186a21132005411f6a211441012102410021084101210702400340200d20066a22012d00002103200141023a00002004200141246a3602d801024020034103470d0020084180fe037141087621020c020b200420023602e0012005200141016a2900003700002012200141096a290000370000200541106a200141116a2900003700002013200141196a2900003700002014200141206a280000360000200420033a009c0220042002417f6a36029802200441f0016a201120044198026a10a804024002400240024020042d00f0014103460d0020044198026a41206a200441f0016a41206a29030037030020044198026a41186a200441f0016a41186a29030037030020044198026a41106a200441f0016a41106a29030037030020044198026a41086a200441f0016a41086a290300370300200420042903f001220a37039802410021010240200aa741ff0171417f6a0e020004020b200441c0026a41186a200f41186a290000370300200441c0026a41106a200f41106a290000370300200441c0026a41086a200f41086a2900003703002004200f2900003703c00220042802bc02220141214f0d0f200441c0026a200120044190016a10a6010c020b20084180fe037141087621020c040b200f412020044190016a10a6010b200721010b200241016a21022007410174210720012008722108200641246a220641c004470d000b20084180fe037141087621020b201041026a21012010417e4f0d0a20042802980122032001490d0b20042802900120106a2002410874200841ff0171723b00000240200c450d00200b450d00200c10300b200d103020042802ac014125490d0f200441b4016a28020010300c0f0b4101102f2201450d1120044101360294012004200136029001200141003a000020044101360298010c0e0b200441a8016a41106a2001290200370300200441a8016a410c6a200341086a280200360200200441a8016a41186a200141086a290200370300200441c8016a200141106a290200370300200441d0016a200141186a290200370300200420023602a80120042003290200220e3702ac0102400240200ea722034125490d00200441b4016a280200210620042802b80121030c010b200441b1016a21060b20024101762101024002402002410171450d00200320014d0d0d200441013a009802200441a0026a2003200141016a22026b3602002004200620026a36029c022004200620016a2d0000410f713a0099020c010b20032001490d0b200441a0026a200320016b360200200441003b0198022004200620016a36029c020b20044190016a20044198026a200d200a422088a710b9010240200aa7450d00200d10300b20042802ac014125490d0d200441b4016a28020010300c0d0b200441a8016a41106a2001290200370300200441a8016a410c6a200341086a280200360200200441a8016a41186a200141086a290200370300200441c8016a200141106a290200370300200441d0016a200141186a290200370300200420023602a80120042003290200220e3702ac0102400240200ea722014125490d00200441b4016a280200210020042802b80121010c010b200441b1016a21000b200420023602e001200420013602dc01200420003602d801200441c0026a200441d8016a10ba0120042802a001280200200441d8016a4100200410bb01210120042802a4012802002100200441fc016a200736020020044180026a200441d8006a29030037030020044188026a200441e0006a29030037030020044190026a200441e8006a2802003602002004200a3702f4012004200d3602f00120044198026a2000200441f0016a20042802a00128020010b70120042802a001280200200110b80110bc01000b10bd01000b200041003a000020002002290001370001200041196a200241196a290000370000200041116a200241116a290000370000200041096a200241096a2900003700000c0c0b20002004290011370001200041003a0000200041196a200441106a41196a290000370000200041116a200441106a41116a290000370000200041096a200441106a41096a2900003700000c0a0b2002200341acf0c1001033000b2001200341e097c200104a000b2001200341f097c2001033000b2001412041908ec1001042000b2010200141a08ec1001048000b2001200341a08ec1001042000b2001200341e097c200104a000b2001200341f097c2001033000b2001450d040c030b024002402004280298012201411f4d0d002004280208220141d0006a2802002102200128024c2101200441a8016a200428020c10b902200041016a2001200441a8016a2004280290012004280298012002280214110700200041003a000020042802082201200128027c41016a36027c0c010b200441c0016a22024200370300200441b8016a22034200370300200441b0016a22064200370300200442003703a801200441a8016a20042802900120011085051a200041246a2001360200200041013a0000200041196a2002290300370000200041116a2003290300370000200041096a2006290300370000200020042903a8013700010b0240200428029401450d0020042802900110300b2009450d010b200441346a10be010b200441e0026a24000f0b102a000b102c000bb00301057f0240024002402001450d000240200028022c220220014b0d0002400240200028020022014125490d002000410c6a220228020021010c010b200021020b02402001450d00200241003602000b2000410036022c0f0b200220016b2203410176200341017122046a210202400240200028020022014125490d002000410c6a28020021050c010b200121050b0240200220054f0d002000410c6a2106200220056b41016a210203400240024020014125490d0020062802002101200621050c010b200021050b02402001450d0020052001417f6a3602000b2002450d01200241016a2102200028020021010c000b0b2000200336022c2004450d0002400240200028020022014125490d002000410c6a28020021020c010b200121020b2002417f6a21020240024020014125490d002000410c6a2205280200220120024d0d04200041086a220628020020026a2d0000417071210020052802002101200628020021050c010b200120024d0d03200041056a220520026a2d000041707121000b200120024d0d01200520026a20003a00000b0f0b2002200141d096c2001033000b2002200141c096c2001033000be90501087f230041206b22042400024002400240200141086a280200220541036a2206417f4c0d0020012d000021072001280204210820012d000121094101210102402006450d002006102f2201450d020b20002001360200200041086a4100360200200041046a2006360200200541017420076a220641ffff03200641ffff03491b220141c0006a41ff0020012006413e2001413e491b2206461b210a200120066b2106410121010240034002400240200141ff01714102460d002001410171450d0041002101200a210b0c010b2006450d020240200641ff014b0d002006417f6a210b41022101410021060c010b200641817e6a210641ff01210b410221010b2004200b3a00102000200441106a410110640c000b0b024002400240024020070d00200041046a2802002106200041086a28020021010c010b0240200041086a220a280200220b200041046a2802002206470d00200b41016a2201200b490d04200b41017422062001200620014b1b22014108200141084b1b210102400240200b0d00200441003602100c010b200441106a41086a41013602002004200b360214200420002802003602100b200420014101200441106a10b402200441086a280200210620042802004101460d0220002004280204360200200041046a20063602000b200a200b41016a22013602002000280200200b6a2009410f713a00000b200620016b2005490d01200028020021060c040b2006450d010c020b200120056a220b2001490d002006410174220a200b200a200b4b1b220b4108200b41084b1b210b0240024020060d00200441003602100c010b200441106a41086a410136020020042006360214200420002802003602100b2004200b4101200441106a10b402200441086a280200210b024020042802004101460d00200020042802042206360200200041046a200b3602000c030b200b0d010b102c000b102a000b200620016a200820051085051a200041086a200120056a36020020022003200010a601200441206a24000bb80101057f2001280208220241017621032001280204210402400240024002402002410171450d00200420034d0d034101210220012802002205200341016a22066a2101200520036a2d0000410f712105200621030c010b20042003490d01200128020020036a210141002105410021020b200020023a000c20002001360204200041003602002000410d6a20053a0000200041086a200420036b3602000f0b2003200441e097c200104a000b2003200441f097c2001033000bf90101057f230041106b22042400024002400240024020010d00410021010c010b200141086a2802002205410176210620012802042107024002402005410171450d00200720064d0d04200441013a0000200441086a2007200641016a22086b36020020042001280200220120086a3602042004200120066a2d0000410f713a00010c010b20072006490d02200441086a200720066b360200200441003b01002004200128020020066a3602040b2000200410b501200741017420056b21010b02402002450d002000200310b601200141016a21010b200441106a240020010f0b2006200741e097c200104a000b2006200741f097c2001033000b110041d8a5c200412841808ec100102d000b110041d8a5c200412841f08dc100102d000bcd0101017f0240024002400240024020002802000e0404000102030b0240200041086a2802004125490d00200041106a28020010300b200041386a280200450d03200041346a28020010300f0b200041086a2802004125490d02200041106a28020010300f0b20002802041030200041086a2802002201450d012000410c6a280200450d01200110300c010b0240200041086a2802004125490d00200041106a28020010300b200041346a2802001030200041386a2802002201450d002000413c6a280200450d00200110300f0b0b950201067f024020002802202201450d0002402000412c6a280200450d00200041246a280200220241046a2103200120026a41016a21042002280200417f73418081828478712101024003400240024020010d000340200320044f0d04200241c07e6a210220032802002101200341046a220521032001418081828478712201418081828478460d000b2001418081828478732201417f6a2001712106200521030c010b2001417f6a20017121060b2001682105200621012002410020054103766b41306c6a220541746a280200450d00200541706a2802001030200621010c000b0b200028022021010b200041246a280200200141016aad42307ea76b10300b0240200041346a280200450d00200028023010300b0b940101037f230041206b22042400200141086a280200210520012802042106200441106a41086a200341086a28020036020020042003290200370310200420062005200441106a10c10120012802002101200420042f010c3b011820042004280208360214200420042802002203360210200020012002200441106a10c20102402004280204450d00200310300b200441206a24000b930101037f0240024002402003280204220420026a2205417f4c0d000240024020050d00410121060c010b2005102f2206450d022006410020051087051a0b20052002490d02200620012002108505220620026a200328020020041085051a200020053602082000200536020420002006360200200020032f01083b010c0f0b102c000b102a000b2002200541a490c2001042000bba0401047f230041206b22042400024002400240024002400240200220012802042205413c6a41201088050d00200541386a2802002206417f4c0d0220052802302105024020060d00410121074101200520061085051a0c020b2006102f2207450d032007200520061085051a0c010b200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703004100210702402005200410d30122050d000c010b0240200528020c41014e0d000c010b20052802082206417f4c0d01200528020021050240024020060d00410121070c010b2006102f2207450d030b2007200520061085051a0b024020070d000240200220012802002207413c6a41201088050d00200741386a2802002202417f4c0d02200728023021070240024020020d00410121060c010b2002102f2206450d040b2006200720021085051a0c040b200441186a200241186a290000370300200441106a200241106a290000370300200441086a200241086a290000370300200420022900003703004100210602402007200410d30122070d000c040b0240200728020c41014e0d000c040b20072802082202417f4c0d0120072802002107024020020d00410121064101200720021085051a0c040b2002102f2206450d022006200720021085051a0c030b2000200636020420002007360200200041086a20063602000c030b102c000b102a000b2000200236020420002006360200200041086a20023602000b200441206a24000b960101037f230041206b22032400200041086a280200210420002802042105200341106a41086a200241086a28020036020020032002290200370310200320052004200341106a10c10120002802002100200320032f010c3b01182003200328020836021420032003280200220236021020002001200341106a10c401210002402003280204450d00200210300b200341206a240020000b9f0401047f230041206b220324000240024002400240200120002802042204413c6a41201088050d00200441386a2802002205417f4c0d0220042802302104024020050d00410121064101200420051085051a0c020b2005102f2206450d032006200420051085051a0c010b200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a290000370300200320012900003703004100210602402004200310d30122040d000c010b0240200428020c41014e0d000c010b20042802082205417f4c0d01200428020021040240024020050d00410121060c010b2005102f2206450d030b2006200420051085051a0b0240024020060d0002400240200120002802002200413c6a41201088050d00200041386a2802002205417f4c0d0420002802302101024020050d00410121064101200120051085051a0c020b2005102f2206450d052006200120051085051a0c010b200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a290000370300200320012900003703004100210602402000200310d30122010d000c010b0240200128020c41014e0d000c010b20012802082205417f4c0d03200128020021010240024020050d00410121060c010b2005102f2206450d050b2006200120051085051a0b20060d00410021060c010b2005450d00200610300b200341206a240020064100470f0b102c000b102a000b7301037f230041206b22052400200141086a280200210620012802042107200541106a41086a200241086a28020036020020052002290200370310200520072006200541106a10c101200020012802002802042003200410c60102402005280204450d00200528020010300b200541206a24000bab0301057f230041d0006b22042400024002402003417f4c0d000240024002400240024002402003450d002003102f22050d010c070b410121054101200220031085051a200141386a2802002003460d010c030b2005200220031085052106200141386a2802002003470d010b200520012802302003108805210602402003450d00200510300b20060d012000200129003c370000200041186a200141d4006a290000370000200041106a200141cc006a290000370000200041086a200141c4006a2900003700000c020b200610300b2004200220031065200441206a41186a200441186a2206290000370300200441206a41106a200441106a2207290000370300200441206a41086a200441086a2208290000370300200420042900003703200240024020030d00410121050c010b2003102f2205450d030b20042003360244200420053602402005200220031085051a200420033602482001200441206a200441c0006a10c801200041186a2006290000370000200041106a2007290000370000200041086a2008290000370000200020042900003700000b200441d0006a24000f0b102c000b102a000bd90101047f230041c0006b22042400200041086a280200210520002802042106200441106a41086a2207200241086a28020036020020042002290200370310200420062005200441106a10c10120002802002802042100200441106a41186a200141186a290000370300200441106a41106a200141106a2900003703002007200141086a29000037030020042001290000370310200441306a41086a200341086a280200360200200420032902003703302000200441106a200441306a10c80102402004280204450d00200428020010300b200441c0006a24000be50301047f23004180016b220324000240024020022802082204200041386a280200470d0020022802002205200028023020041088050d00200241046a280200450d01200510300c010b200341c0006a41186a2204200141186a290000370300200341c0006a41106a2205200141106a290000370300200341c0006a41086a2206200141086a2900003703002003200129000037034020032000200341c0006a10ca01024020032903004201520d00200341c0006a41286a200341306a290300370300200341c0006a41206a200341286a2903003703002004200341206a2903003703002005200341186a2903003703002006200341106a29030037030020032003290308370340200341f0006a41086a200241086a2802003602002003410136027c20032002290200370370200341c0006a200341f0006a10cb010c010b0240200341106a2802002204417c6a2201280200220041004a0d00200441706a2105200341c0006a41086a2206200241086a280200360200200320022902003703400240200441746a280200450d0020052802001030200128020021000b20052003290340370200200541086a20062802003602002001200041016a3602000c010b2001200041016a360200200241046a280200450d00200228020010300b20034180016a24000b980301037f23004190016b22032400200041086a280200210420002802042105200341106a41086a200241086a28020036020020032002290200370310200320052004200341106a10c1010240200120002802002802042200413c6a4120108805450d00200341d0006a41186a2202200141186a290000370300200341d0006a41106a2204200141106a290000370300200341d0006a41086a200141086a29000037030020032001290000370350200341106a2000200341d0006a10ca01024020032903104201520d00200341d0006a41286a200341c0006a290300370300200341d0006a41206a200341106a41286a2903003703002002200341106a41206a2903003703002004200341106a41186a290300370300200341d8006a200341106a41106a290300370300200320032903183703502003417f36028c012003420037028401200341002802dc944236028001200341d0006a20034180016a10cb010c010b200341106a41106a280200417c6a22012001280200417f6a3602000b02402003280204450d00200328020010300b20034190016a24000b840503017f047e0a7f230041306b22032400200341206a20012903182001290308852204200241186a29000085420020012903102205200129030022068522072002290010854200108405200341106a2004200241086a2900008542002007200229000085420010840520032005420020052005200642adfed5e4d485fda8d8007e200341206a41086a2903002003290320857c42a0cbbf9599b5a19f0a7c85421789200341106a41086a2903002003290310857c8542178922044200108405200141246a2802002208200141206a2802002209200341086a2903002003290300852004892205a7220a71220b6a280000220c200a41197641818284086c220d73220a417f73200a41fffdfb776a7141808182847871210e200b41046a200971210f4104211002400340200f210a0240200e0d000240200c200c41017471418081828478710d00200d2008200a6a280000220c73220e417f73200e41fffdfb776a7141808182847871210e2009200a20106a41046a71210f201041046a2110200a210b0c020b2000200537030820004201370300200041106a2001360200200041146a20022900003700002000411c6a200241086a290000370000200041246a200241106a2900003700002000412c6a200241186a2900003700000c020b200e682111200a210f200e417f6a200e71210e200841002009200b20114103766a716b41306c6a220a41506a200241201088050d000b2000200537030820004200370300200041186a41013a0000200041146a2001360200200041106a200a360200200041196a2002290000370000200041216a200241086a290000370000200041296a200241106a290000370000200041316a200241186a2900003700000b200341306a24000bde0403027f017e067f230041d0006b2202240020022000280208220336020c20002903002104200241286a200041246a290200370300200241206a2000411c6a290200370300200241106a41086a200041146a290200370300200241386a200141086a2902003703002002200029020c37031020022001290200370330200341206a2105200328022022062004a72207712101200341246a28020021084104210003402001220920006a2006712101200041046a2100200820096a28000041808182847871220a450d000b02402008200a6841037620096a20067122006a2c000022014100480d0020082008280200418081828478716841037622006a2d000021010b200341286a280200210902402001410171220a450d0020090d00200241c0006a20052002410c6a108002200328022022062007712101200341246a28020021084104210003402001220920006a2006712101200041046a2100200820096a280000418081828478712205450d000b0240200820056841037620096a20067122006a2c00004100480d002008280200418081828478716841037621000b200328022821090b20032009200a6b360228200820006a200741197622013a000020062000417c6a7120086a41046a20013a00002008410020006b41306c6a41506a220041286a200241106a41286a290300370200200041206a200241106a41206a290300370200200041186a200241106a41186a290300370200200041106a200241106a41106a290300370200200041086a200241106a41086a290300370200200020022903103702002003200328022c41016a36022c200241d0006a24000b130020004180a3c000360204200020013602000b130020004180a3c000360204200020013602000bd128030f7f017e047f230041e0016b220124002001420037020c200141286a200141086a10cf01200141e0006a41186a200141286a41186a2802002202360200200141e0006a41106a200141286a41106a290300370300200141e0006a41086a200141286a41086a290300370300200120012903283703600240024020020d00410021030c010b20012002417f6a2204360278200141e0006a410020012802641b220528020021060240024020052802082207200528020422022f018e024f0d00200221080c010b03400240200228020022080d00410021080c020b200641016a210620022f018c02210720082102200720082f018e024f0d000b0b024002402006450d00200741027420086a4194026a280200210202402006417f6a2206450d00034020022802900221022006417f6a22060d000b0b410021060c010b200741016a2106200821020b20052002360204200541003602002005200636020820082007410c6c6a41046a2102410021030340200228020820036a21032004450d0120012004417f6a2204360278200141e0006a410020012802641b220528020021060240024020052802082207200528020422022f018e024f0d00200221080c010b03400240200228020022080d00410021080c020b200641016a210620022f018c02210720082102200720082f018e024f0d000b0b024002402006450d00200741027420086a4194026a280200210202402006417f6a2206450d00034020022802900221022006417f6a22060d000b0b410021060c010b200741016a2106200821020b20052002360204200541003602002005200636020820082007410c6c6a41046a21020c000b0b41012108024020034101742202417f4c0d00024002402002450d002002102f2208450d010b200141003602202001200236021c200120083602184104102f2209450d0020094100360200200141286a200141086a10cf01200141e0006a41186a200141286a41186a2802002202360200200141e0006a41106a200141286a41106a290300370300200141e0006a41086a200141286a41086a29030037030020012001290328370360024002400240024020020d00410021084101210a410121030c010b20012002417f6a360278200141e0006a410020012802641b220528020021060240024020052802082207200528020422022f018e024f0d00200221080c010b03400240200228020022080d00410021080c020b200641016a210620022f018c02210720082102200720082f018e024f0d000b0b024002402006450d00200741027420086a4194026a280200210202402006417f6a2206450d00034020022802900221022006417f6a22060d000b0b410021060c010b200741016a2106200821020b20052002360204200541003602002005200636020820082007410c6c6a41046a2102410121034101210a034002400240200228020822070d00200128022021020c010b20022802002108200128022021020240034020082d0000210602402002200128021c470d00200241016a22052002490d09200241017422042005200420054b1b22054108200541084b1b21050240024020020d00200141003602b0010c010b200141013602b801200120023602b401200120012802183602b0010b20014198016a20054101200141b0016a106920012802a00121022001280298014101460d02200128029c0121052001200236021c20012005360218200128022021020b200128021820026a20064104763a00002001200128022041016a2202360220024002402002200128021c470d00200241016a22052002490d0a200241017422042005200420054b1b22054108200541084b1b21050240024020020d00200141003602b0010c010b200141013602b801200120023602b401200120012802183602b0010b20014198016a20054101200141b0016a106920012802a00121022001280298014101460d01200128029c0121052001200236021c20012005360218200128022021020b200841016a2108200128021820026a2006410f713a00002001200128022041016a22023602202007417f6a2207450d030c010b0b2002450d070c060b2002450d060c050b02402003200a470d00200341016a22082003490d06200341017422062008200620084b1b22084104200841044b1b220841ffffffff03712008464102742106200841027421080240024020030d00200141003602b0010c010b200141043602b801200120093602b001200120034102743602b4010b20014198016a20082006200141b0016a106920012802a001210802402001280298014101470d002008450d070c060b200128029c0121092008410276210a0b200920034102746a2002360200200341016a2103024020012802782202450d0020012002417f6a360278200141e0006a410020012802641b220528020021060240024020052802082207200528020422022f018e024f0d00200221080c010b03400240200228020022080d00410021080c020b200641016a210620022f018c02210720082102200720082f018e024f0d000b0b024002402006450d00200741027420086a4194026a280200210202402006417f6a2206450d00034020022802900221022006417f6a22060d000b0b410021060c010b200741016a2106200821020b20052002360204200541003602002005200636020820082007410c6c6a41046a21020c010b0b200128020c22080d01410021080b41002102410021050c010b200128021021052001280208210620082102034020082f018e0221072006450d012006417f6a2106200820074102746a4190026a280200210820022802900221020c000b0b200141cc006a4202370200200141c8006a20033602002001413c6a2007360200200141386a2008360200200142003702542001200936024420012005360240200142003703302001200236022c41002104200141003602282001200141186a36025c0240024002400240024002400240024002402005450d0020012005417f6a220b3602402002450d0120022f018e020d0241002106034041002108024020022802002204450d00200641016a210520022f018c022107200421080b024041c00241900220061b450d00200210300b024020080d00410021020c060b2005210620082102200720082f018e024f0d000b200741016a210620082007410c6c6a22024188016a2104200241046a210c024020050d00200821020c040b200820064102746a4190026a280200210202402005417f6a2206450d00034020022802900221022006417f6a22060d000b0b410021060c030b2001410036022c41002802e88f42210d2002450d060c040b41b2abc200412b41d4a8c200102d000b20024188016a2104200241046a210c4101210641002107200221080b20082007410c6c6a22084190016a280200210e2008418c016a28020021052008410c6a280200210f200841086a280200210720042802002104200c28020021080b200120063602302001200236022c2001410036022802402008450d000240200341014b0d0002402007450d00200810300b2005450d01200410300c010b20012003417f6a220d36024820012001280244220c41046a360244200141fc006a4102360200200141f4006a200e360200200141f0006a20053602002001200c3602782001200436026c2001200f3602682001200736026420012008360260200141b0016a200141dc006a200141e0006a10d00120012802b001450d00417f41002003417e6a200d4102491b2202200b200b20024b1b220241016a220820082002491bad42147e2210422088a70d062010a72202417f4c0d062002102f220d450d05200d20012903b001370200200d41106a200141b0016a41106a280200360200200d41086a200141b0016a41086a290300370200200141e0006a41306a200141286a41306a290300370300200141e0006a41286a200141286a41286a290300370300200141e0006a41206a200141286a41206a290300370300200141e0006a41186a200141286a41186a2903002210370300200141e0006a41106a200141286a41106a290300370300200141e0006a41086a200141286a41086a29030037030020012001290328370360200241146e210341012104024002402010a722020d004100210b0c010b20012002417f6a220b36027802400240024020012802642202450d00200128026021062001280268220720022f018e02490d01034002400240200228020022080d00410021080c010b200641016a210520022f018c0221070b024041c00241900220061b450d00200210300b024020080d00410021020c040b2005210620082102200720082f018e024f0d000b20082102200521060c010b41b2abc200412b41d4a8c200102d000b200741016a210820022007410c6c6a22074188016a2105200741046a210c02402006450d00200220084102746a4190026a280200210202402006417f6a2208450d00034020022802900221022008417f6a22080d000b0b410021080b20074190016a28020021112007418c016a280200210e2007410c6a2802002112200741086a280200210f20052802002113200c280200210c0b200120083602682001200236026420014100360260200c450d0020014194016a21144101210403400240200128028001220820012802840122024f0d000240200f450d00200c10300b200e450d02201310300c020b20012008417f6a2207360280012001200128027c220641046a36027c200120023602cc01200120063602c801200120113602c4012001200e3602c001200120133602bc01200120123602b8012001200f3602b4012001200c3602b00120014198016a2014200141b0016a10d001200128029801450d0102400240024020032004470d002003417f4100200820026b20072002491b2202200b200b20024b1b220241016a220820082002491b6a22022003490d0b200341017422082002200820024b1b22024104200241044b1bad42147e2210422088a74541027421022010a721080240024020030d00200141003602b0010c010b200141043602b8012001200d3602b0012001200341146c3602b4010b200141d0016a20082002200141b0016a106920012802d801210220012802d0014101460d0120012802d401210d200241146e21030b200d200441146c6a2202200129039801370200200241106a20014198016a41106a280200360200200241086a20014198016a41086a290300370200200441016a2104200128027822020d014100210b0c030b2002450d090c080b20012002417f6a220b36027802400240024020012802642202450d00200128026021062001280268220720022f018e02490d01034002400240200228020022080d00410021080c010b200641016a210520022f018c0221070b024041c00241900220061b450d00200210300b024020080d00410021020c040b2005210620082102200720082f018e024f0d000b20082102200521060c010b41b2abc200412b41d4a8c200102d000b200741016a210820022007410c6c6a22074188016a2105200741046a210c02402006450d00200220084102746a4190026a280200210202402006417f6a2208450d00034020022802900221022008417f6a22080d000b0b410021080b20074190016a28020021112007418c016a280200210e2007410c6a2802002112200741086a280200210f20052802002113200c280200210c0b200120083602682001200236026420014100360260200c0d000b0b20012802642102200141003602642002450d04200128026021060240200b450d00200128026821070340024002400240200720022f018e024f0d0020022108200621050c010b034002400240200228020022080d00410021080c010b200641016a210520022f018c0221070b024041c00241900220061b450d00200210300b024020080d00410021020c030b2005210620082102200720082f018e024f0d000b0b200741016a210c20082007410c6c6a22064188016a2113200641046a21120240024020050d0020082102200c21070c010b2008200c4102746a4190026a280200210202402005417f6a2208450d00034020022802900221022008417f6a22080d000b0b410021070b2006418c016a280200210e200641086a280200210f201328020021132012280200210c0b200c450d060240200f450d00200c10300b200b417f6a210b0240200e450d00201310300b41002106200b0d000b0b034020022802002108024041c00241900220061b450d00200210300b200641016a21062008210220080d000c050b0b2001410036022c41002802e88f42210d200b450d000340024002400240200620022f018e02490d0041002106034041002108024020022802002204450d00200641016a210520022f018c022107200421080b024041c00241900220061b450d00200210300b024020080d00410021020c040b2005210620082102200720082f018e024f0d000b200741016a210620082007410c6c6a22024188016a2104200241046a2103024020050d00200821020c020b200820064102746a4190026a280200210202402005417f6a2206450d00034020022802900221022006417f6a22060d000b0b410021060c010b20022006410c6c6a22084188016a2104200841046a21032006210720022108200641016a21060b20082007410c6c6a2208418c016a280200210f200841086a280200210c2004280200210e200328020021030b2003450d020240200c450d00200310300b200b417f6a210b0240200f450d00200e10300b200b0d000b0b41002108034020022802002106024041c00241900220081b450d00200210300b2008417f6a21082006210220060d000b0b410021040b410021030b20014200370264200141002802dc9442360260200d20044100200141e0006a10d101200128026421062000200128026022072001280268106502402004450d00200441146c2108200d410c6a2102034002402002280200450d002002417c6a28020010300b200241146a21022008416c6a22080d000b0b02402003450d00200341146c450d00200d10300b0240200a41ffffffff0371450d00200910300b0240200128021c450d00200128021810300b02402006450d00200710300b200141e0016a24000f0b102a000b102c000b8f0203047f017e017f230041206b22022400024002400240200128020422030d004100210341002104410021010c010b20012802002205ad4220862106200321040240034020032f018e022107024020050d002005450d020c040b2005450d0320064280808080707c21062005417f6a2105200320074102746a4190026a280200210320042802900221040c000b0b200128020821010b20002001360218200020063702082000200436020420002005360200200041146a2007360200200041106a2003360200200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000bf10101057f230041106b22032400200341086a200241106a29020037030020032002290208370300024002400240024002402002411c6a2802000e020102000b20022802182204280204220520042802002204490d0320012802002201280208220620054f0d022005200641d0f4c0001042000b4100410041e0f4c0001033000b4101410141f0f4c0001033000b200228020421062002280200210720012802002102200020032902043702082000200520046b3602042000200220046a360200200041106a2003410c6a28020036020002402006450d00200710300b200341106a24000f0b2004200541d0f4c0001048000bcd1701177f230041f0006b220424000240024002400240024002400240024002400240024002400240024020010e020001020b0240024020032802082205200341046a280200470d00200541016a22062005490d0d200541017422072006200720064b1b22064108200641084b1b21060240024020050d00200441003602000c010b200441086a410136020020042005360204200420032802003602000b200441d0006a20064101200410b402200441d8006a280200210520042802504101460d0120032004280254360200200341046a2005360200200328020821050b200328020020056a41003a00002003200328020841016a3602080c030b2005450d0b0c0c0b0240200028020422052002490d0041012101200028020020026a2107200041106a28020021082000280208210902400240200520026b2205410171220a450d002005450d0120072d000021000b200541ffff03200541ffff03491b220641c0006a41ff0020062005413e2006413e491b220b461b210c2006200b6b210d2007200a6a21072005417e712105200341086a210e4101210b024002400340024002400240024002400240024002400240200b417e6a0e020105000b0240200141ff01714102460d0020014101712106410021012006450d00200c210f0c040b41022101200b4101470d00200d450d00200d41ff014b0d01200d417f6a210f410221014100210d0c020b0240200a41ff01714102470d004102210a0c040b200a41017121064102210b4100210a2006450d032000210f0c020b200d41817e6a210d41ff01210f410221010b4101210b0b200e2802002206200341046a280200470d030240200b4103470d002007452110200721110c020b02402007450d0002400240200b4102470d0041002112200a41ff017122114102460d01201141014621120c010b0240200a41ff017122124102460d00200141ff017141014620124101466a21120c010b41002112200141ff017122114102460d00201141014621120b417f2012200541017620054101716a410020051b6a221120112012491b21120c030b0240200b4102470d0041002112200a41ff017122114102460d03201141014621120c030b0240200a41ff017122124102460d00200141ff017141014620124101466a21120c030b41002112200141ff017122114102460d02201141014621120c020b2007450d052005450d050240024002402005410220054102491b22060e020001020b4100410041cc93c2001033000b4101410141dc93c2001033000b200520066b2105200720066a211120072d000041047420072d000172210f4103210b0240200e2802002206200341046a280200460d00201121070c030b20114521104103210b0b41002112024020100d002005450d00200541017620054101716a21120b201121070b2006417f201241016a221120112012491b6a22122006490d10200641017422112012201120124b1b22124108201241084b1b21120240024020060d00200441003602000c010b2004410136020820042006360204200420032802003602000b200441d0006a20124101200410b4022004280258211220042802504101460d0220032004280254360200200341046a20123602000b200328020020066a200f3a0000200e200641016a3602000c000b0b20120d0e0c0d0b024002400240200841c000490d00200841808001490d012008418080808004490d02200441033a0000200320044101106420042008360200200320044104106420032009200810640c060b200420084102743a0000200320044101106420032009200810640c050b200420084102744101723b0100200320044102106420032009200810640c040b20042008410274410272360200200320044104106420032009200810640c030b4100410041cc94c2001033000b2002200541fcf6c000104a000b200041106a21082000280200210c2000280204220d21070240200141146c22054114460d00200041146a2111200020056a2110200d210703402011220541146a2111024020052802042206200d200d20064b1b2212450d00200528020021054100210b2012210f200c21060340200b20062d0000220a20052d0000220e466a210b0240200a200e460d00200b21120c020b200641016a2106200541016a2105200f417f6a220f0d000b0b20072012201220074b1b210720112010470d000b0b20082802002113200028020821064100210502400240200720024b0d0020022107410021100c010b200d2007490d02200c20026a210c200720026b21100b200441386a4200370300200441306a4200370300200441286a4200370300200441206a4200370300200441186a4200370300200441106a4200370300200441086a420037030020044200370300200641002007200d4622121b210d200141146c21112012210f03402005210a200f20014b0d05410021060240200f2001460d002011200f41146c22056b210b200020056a21054100210603402007200541046a280200220e4f0d08200528020020076a2d0000200a41ff0171470d01200541146a2105200641016a2106200b416c6a220b0d000b0b2004200a4102746a20063602002006200f6a210f200a41016a22054110470d000b2010413e201041ffff03201041ffff03491b2205413e491b210602400240200d450d0002402010410171220b450d002010450d05200c2d0000210a0b200441e8006a4102360200200441e4006a2010417e71360200200441dc006a200b3a0000200441d8006a41013a00002004200a3a005d2004200541406a417f20052006461b3a00592004200520066b360254200441013602502004200c200b6a3602602003200441d0006a10b5020c010b02402010410171220b450d002010450d05200c2d0000210a0b200441e8006a4102360200200441e4006a2010417e71360200200441dc006a200b3a0000200441d8006a41013a00002004200a3a005d2004200541807f7341bf7f20052006461b3a00592004200520066b360254200441013602502004200c200b6a3602602003200441d0006a10b5020b2004280200210b2004280204210a2004280208210e200428020c210f20042802102111200428021421102004280218210c200428021c2102200428022021082004280224210920042802282114200428022c2115200428023021162004280234211720042802382118200428023c211902400240200341046a2802002206200341086a28020022056b4102490d00200328020021060c010b200541026a221a2005490d0a20064101742205201a2005201a4b1b22054108200541084b1b21050240024020060d00200441003602500c010b200441d0006a41086a410136020020042006360254200420032802003602500b200441c0006a20054101200441d0006a1069200441c0006a41086a280200210520042802404101460d09200320042802442206360200200341046a2005360200200341086a28020021050b200620056a2019410047410f742018410047410e742017410047410d742016410047410c742015410047410b742014410047410a74200941004741097420084100474108742002410047410774200c41004741067420104100474105742011410047410474200f410047410374200e410047410274200a410047410174200b4100477272727272727272727272727272723b0000200341086a2205200528020041026a3602000240200d450d00200d2013200310a6010b200741016a210e4100210541002802dc9442210f03400240200420056a2802002206450d00200620126a22072006490d08200720014b0d09200442003702442004200f3602402000201241146c6a2006200e200441c0006a10d1012004280244210b20042802402106024002402004280248220a4120490d00200441d0006a2006200a1065200441d0006a4120200310a6010c010b2006200a200310a6010b0240200b450d00200610300b200721120b200541046a220541c000470d000b0b200441f0006a24000f0b2007200d418cf7c0001042000b4100410041cc94c2001033000b4100410041cc94c2001033000b200f2001419cf7c000104a000b2007200e41acf7c0001033000b2012200741bcf7c0001048000b2007200141bcf7c0001042000b20050d010b102c000b102a000bba0301037f230041306b22042400200141086a280200210520012802042106200441106a41086a200341086a28020036020020042003290200370310200420062005200441106a10c10102400240024002402002200128020022014180016a41201088050d004101102f2202450d02200042818080801037020420002002360200200241003a00000c010b0240024020022001413c6a41201088050d00200141386a2802002202417f4c0d0420012802302101024020020d00410121034101200120021085051a0c020b2002102f2203450d032003200120021085051a0c010b200441106a41186a200241186a290000370300200441106a41106a200241106a290000370300200441106a41086a200241086a290000370300200420022900003703104100210302402001200441106a10d30122010d000c010b0240200128020c41014e0d000c010b20012802082202417f4c0d03200128020021010240024020020d00410121030c010b2002102f2203450d030b2003200120021085051a0b2000200236020420002003360200200041086a20023602000b02402004280204450d00200428020010300b200441306a24000f0b102a000b102c000bd30303017f047e097f230041306b22022400200241206a20002903182000290308852203200141186a29000085420020002903102204200029030022058522062001290010854200108405200241106a2003200141086a2900008542002006200129000085420010840520022004420020042004200542adfed5e4d485fda8d8007e200241206a41086a2903002002290320857c42a0cbbf9599b5a19f0a7c85421789200241106a41086a2903002002290310857c8542178922034200108405200041246a2802002207200041206a2802002208200241086a290300200229030085200389a722007122096a280000220a200041197641818284086c220b732200417f73200041fffdfb776a7141808182847871210c200941046a200871210d4104210e02400340200d21000240200c0d000240200a200a4101747141808182847871450d00410021000c030b200b200720006a280000220a73220c417f73200c41fffdfb776a7141808182847871210c20082000200e6a41046a71210d200e41046a210e200021090c010b200c68210f2000210d200c417f6a200c71210c20012007410020082009200f4103766a716b41306c6a41506a220041201088050d000b0b200241306a2400200041206a410020001b0b960101037f230041206b22032400200041086a280200210420002802042105200341106a41086a200241086a28020036020020032002290200370310200320052004200341106a10c10120002802002100200320032f010c3b01182003200328020836021420032003280200220236021020002001200341106a10d501210002402003280204450d00200210300b200341206a240020000bcf0201027f230041206b2203240002400240024002400240200120004180016a41201088050d004101102f2201450d03200141003a00000c010b0240024020012000413c6a41201088050d00200041386a2802002204417f4c0d0520002802302100024020040d00410121014101200020041085051a0c020b2004102f2201450d042001200020041085051a0c010b200341186a200141186a290000370300200341106a200141106a290000370300200341086a200141086a290000370300200320012900003703004100210102402000200310d30122000d000c010b0240200028020c41014e0d000c010b20002802082204417f4c0d04200028020021000240024020040d00410121010c010b2004102f2201450d040b2001200020041085051a0b024020010d00410021010c020b2004450d010b200110300b200341206a240020014100470f0b102a000b102c000b830e02047f097e23004180066b22012400200141c8016a4200370300200141d0016a4200370300200141d8016a4200370300200141e0016a4200370300200142c0b2cd3b3703c804200142c0b2cd3b370308200142c0b2cd3b3703c00420012001290380033703c00141002102410121030340200141c0046a2104024002400240200241ff01710e03010002010b200141086a21040c010b200141c8046a21040b200442c0b2cd3b370300024020034103460d00200341bcf2c1006a2104200341016a210320042d000022024103470d010b0b200141c0036a4200370300200141b8036a420137030020014180036a41306a2203420037030020014180036a41286a2204420137030020014180036a41186a420037030020014180036a41f8006a420037030020014180036a41f0006a420137030020014180036a41e8006a420037030020014180036a41e0006a4201370300200141d0036a4200370300200141c8036a200129030837030020014188046a420037030020014180046a20012903c004370300200142003703880320014280e497d01237038003200120012903c80437039003200141b0046a200141e0016a290300370300200141a8046a200141c0016a41186a290300370300200141a0046a200141d0016a29030037030020014198046a200141c8016a29030037030020014190046a20012903c0013703002004420137030020034280b0def7d32b370300200141003602b804200141c0016a20014180036a41c0011085051a200141c0016a41f8006a428090cad2c60e370300200141c0016a41f0006a4201370300200141c0016a41e8006a4280c0a8ca9a3a370300200141c0016a41e0006a4201370300200141086a200141c0016a41b8011085051a200141c8046a200141086a41b8011085051a20012903d004210502400240200141c8046a41286a2903004201520d00200141c8046a41306a29030022062005560d010b200521060b02400240200141c8046a41e0006a2903004201520d00200141b0056a29030022052006560d010b200621050b02400240200141e0056a2903004201520d00200141e8056a29030022062005560d010b200521060b200120063703d0042006428094ebdc03804280c2d72f7e2006428094ebdc03822206420a8020064280c2d72f7e428094ebdc03824280cab5ee0156ad7c7c21060240200141e0046a2903004201510d0002400240200141f0046a29030050450d00420021050c010b42004200200141f8046a290300220520067d220720072005561b220520012903d8047d220720072005561b2107420121050b200141e8046a2007370300200120053703e0040b024020014198056a2903004201510d0002400240200141a8056a29030050450d00420021050c010b42004200200141b0056a290300220520067d220720072005561b220520014190056a2903007d220720072005561b2107420121050b200141a0056a200737030020012005370398050b0240200141c8046a4188016a2903004201510d0002400240200141e0056a29030050450d00420021060c010b42004200200141e8056a290300220520067d220620062005561b2206200141c8056a2903007d220520052006561b2105420121060b200141d8056a2005370300200120063703d0050b200141c0016a200141c8046a41b8011085051a024020012903c801220620012903c0012205200141c0026a29030022087c580d0020064200200141e0026a2903002207200141d8026a2903005022031b540d00427e200141f0026a290300427f7c200141e8026a290300501b2008540d00200141d0026a290300220950200141c0016a4188016a290300220a420052710d0042002009200a501b4200427f200720031b220720087d220920092007561b560d002006200520014188026a290300220a7c580d0020064200200141a8026a2903002209200141c0016a41e0006a2903005022031b540d00427e200141b8026a290300427f7c200141b0026a290300501b200a540d0020014198026a290300220b5020014190026a290300220c420052710d004200200b200c501b4200427f200920031b2209200a7d220b200b2009561b560d002006200520012903d001220b7c580d0020064200200141f0016a290300220c200141e8016a2903005022031b540d00427e20014180026a290300427f7c200141f8016a290300501b200b540d00200141e0016a290300220650200141d8016a290300220d420052710d0042002006200d501b4200427f200c20031b2206200b7d220c200c2006561b560d002006502006200b5620062005567172450d002009502009200a5620092005567172450d00200750200720085620072005567172450d00200020014186036a200141c8046a41b80110850541b8011085051a20014180066a24000f0b200141013a00800341bff4c10041e00020014180036a41d8f3c10041a0f5c1001034000bda0701027f230041106b220224000240024002400240024020002802000e03000102030b200241003a00002001200241011064200041086a210302400240024002400240024020002d00080e06000102030405080b200241003a00002001200241011064200041106a290300200041186a2d0000200041196a2d0000200110d8010c070b200241013a0000200120024101106420002d000c2000410d6a2d00002000410e6a2d0000200110d901200041186a290300200041206a2d0000200041216a2d0000200110d8010c060b200241023a000020012002410110640c050b200241033a000020012002410110642001200341016a412010640c040b200241043a000020012002410110642001200341016a412010640c030b200241053a000020012002410110642001200341016a412010644120102f2200450d0320024220370204200220003602002002200341216a41201064200120022802002200200228020810642002280204450d02200010300c020b200241013a00002001200241011064200041086a21030240024002400240024020002d00080e050001020304060b200241003a000020012002410110642002200341046a28020036020020012002410410640c050b200241013a000020012002410110642002200341046a28020036020020012002410410640c040b200241023a000020012002410110644120102f2200450d0420024220370204200220003602002002200341016a41201064200120022802002200200228020810642002280204450d03200010300c030b200241033a000020012002410110642002200341046a28020036020020012002410410640c020b200241043a000020012002410110642002200041306a29030037030020012002410810644120102f2200450d0220024220370204200220003602002002200341016a41201064200120022802002200200228020810642002280204450d01200010300c010b200241033a00002001200241011064200041086a210302400240024020002d00080e03000102030b200241003a000020012002410110642001200341016a410810640c020b200241013a000020012002410110642001200341016a410810640c010b200241023a000020012002410110642001200341016a41081064024002400240200041186a2802000e03000102030b200241003a000020012002410110642002200041206a29030037030020012002410810640c020b200241013a000020012002410110642002200041206a2903003703002001200241081064200041286a200110da010c010b200241023a00002001200241011064200041206a200110da010b200241106a24000f0b102a000baf0101017f230041106b22042400200420003703082003200441086a410810640240024002400240200141ff01710e03000102030b200441003a00072003200441076a410110640c020b200441013a00072003200441076a410110640c010b200441023a00072003200441076a410110640b02400240200241ff01714101460d00200441003a00072003200441076a410110640c010b200441013a00072003200441076a410110640b200441106a24000be80301017f230041106b22042400024002400240024002400240024002400240200041ff01710e080001020304050607000b200441003a000f20032004410f6a410110640c070b200441013a000f20032004410f6a410110640c060b200441023a000f20032004410f6a410110640c050b200441033a000f20032004410f6a41011064200420013a000f20032004410f6a41011064200420023a000f20032004410f6a410110640c040b200441043a000f20032004410f6a410110640c030b200441053a000f20032004410f6a410110640c020b200441063a000f20032004410f6a41011064024002400240024002400240200141ff01710e06000102030405070b200441003a000f20032004410f6a410110640c060b200441013a000f20032004410f6a410110640c050b200441023a000f20032004410f6a410110640c040b200441033a000f20032004410f6a410110640c030b200441043a000f20032004410f6a410110640c020b200441053a000f20032004410f6a410110640c010b200441073a000f20032004410f6a41011064024002400240200141ff01710e03000102030b200441003a000f20032004410f6a410110640c020b200441013a000f20032004410f6a410110640c010b200441023a000f20032004410f6a410110640b200441106a24000bd20501017f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802000e1b000102030405060708090a0b0c0d0e0f101112131415161718191a1b0b200241003a00072001200241076a410110640c1a0b200241013a00072001200241076a410110640c190b200241023a00072001200241076a410110640c180b200241033a00072001200241076a410110640c170b200241043a00072001200241076a410110640c160b200241053a00072001200241076a410110640c150b200241063a00072001200241076a410110640c140b200241073a00072001200241076a410110640c130b200241083a00072001200241076a410110640c120b200241093a00072001200241076a410110640c110b2002410a3a00072001200241076a410110640c100b2002410b3a00072001200241076a41011064200041086a2001109d02200041d0036a200110d0020c0f0b2002410c3a00072001200241076a410110640c0e0b2002410d3a00072001200241076a410110640c0d0b2002410e3a00072001200241076a410110640c0c0b2002410f3a00072001200241076a410110640c0b0b200241103a00072001200241076a410110640c0a0b200241113a00072001200241076a410110642002200041086a2903003703082001200241086a410810640c090b200241123a00072001200241076a410110640c080b200241133a00072001200241076a410110640c070b200241143a00072001200241076a410110640c060b200241153a00072001200241076a410110640c050b200241163a00072001200241076a410110640c040b200241173a00072001200241076a410110640c030b200241183a00072001200241076a410110640c020b200241193a00072001200241076a410110640c010b2002411a3a00072001200241076a410110640b200241106a24000b130020004106360204200041d894c1003602000b13002000410536020420004194bcc0003602000b130020004103360204200041948ac1003602000b040041010b040041010b040041010be80403017f027e017f230041c0016b220224000240024020012802004101460d000240024002400240024002400240024002400240200141086a280200417f6a0e0a00010203040506070809000b2001410c6a3502002103200241086a10d60120022903102104200041003b0108200020032004428094ebdc03807e42ffffffffffbfb2cd3b20032004428094ebdc03827e2203428094ebdc0380200342ffffffffffbfb2cd3b561b2003428094ebdc03824280cab5ee0156ad7c42ffffffff0f837c3703000c0a0b200041003b0108200042e88bd2003703000c090b200041013b0108200042f0edd5303703000c080b200241086a10d60120022903102103200041013b0108200020033703000c070b200241086a10d60120022903102103200041013b0108200020033703000c060b200041013b0108200042d8848ef0003703000c050b200041013b01082000200141146a35020042f8a5fd2f7e3703000c040b200041013b01082000200141146a350200220342e0891c7e20034280c2d72f7e7c4298c3e4007c3703000c030b200041013b01082000417f200141186a280200220141016a220520052001491bad220342b0ce347e20034280c2d72f7e7c42f0dd8b057c3703000c020b200041003b01082000200141146a35020042e8077e42e8edcf047c3703000c010b0240024002400240024020012d0004417f6a0e050001020304000b200041013b0108200042003703000c040b200041023b0108200042003703000c030b200041013b0108200042e8073703000c020b200041013b0108200042c0843d3703000c010b200041003b0108200042c0843d3703000b200241c0016a24000b8a3a08037f017e0a7f017e077f027e047f017e230041e0086b2203240002400240200228022422042802082001200428020c28020c1101000d002000420037030820004201370300200041186a41003a0000200041206a41023a0000200228022422002000280200417f6a2204360200024020040d002000280208200028020c2802001102000240200028020c280204450d00200028020810300b2002280224220041046a22022002280200417f6a220236020020020d00200010300b024020012802004101460d000240024002400240024002400240200141086a280200417f6a0e09090009010209030405060b200141106a280200450d082001410c6a28020010300c080b200141106a280200450d072001410c6a28020010300c070b200141106a280200450d062001410c6a28020010300c060b0240200141146a2802002200450d002001410c6a2802002102200041186c210003400240200241046a280200450d00200228020010300b0240200241106a280200450d002002410c6a28020010300b200241186a2102200041686a22000d000b0b200141106a2802002202450d05200241186c450d05200128020c10300c050b0240200141146a2802002200450d002001410c6a28020021022000410c6c210003400240200241046a280200450d00200228020010300b2002410c6a2102200041746a22000d000b0b200141106a2802002202450d042002410c6c450d04200128020c10300c040b200141106a280200450d032001410c6a28020010300c030b200141106a280200450d022001410c6a28020010300c020b02400240024020012d0004417f6a0e0404000104020b02402001410c6a280200450d00200141086a28020010300b0240200141c4006a2802002200450d002001413c6a28020021022000410c6c210003400240200241046a280200450d00200228020010300b2002410c6a2102200041746a22000d000b0b0240200141c0006a2802002202450d002002410c6c450d00200128023c10300b0240200141d0006a2802002202450d0020024104742100200141c8006a28020041086a2102034002402002280200450d002002417c6a28020010300b200241106a2102200041706a22000d000b0b0240200141cc006a28020041ffffffff0071450d00200128024810300b200141d4006a10e3010c030b2001410c6a280200450d02200141086a28020010300c020b2001410c6a280200450d01200141086a28020010300c010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020012802004101460d002001410c6a2802002105200141106a2902002206422088a721072002280224210420022d0001210820022d000021092006a7210a024002400240024002400240024002400240200141086a280200417f6a0e0a000102030f0e0d0c0b0a000b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b0240200920087241ff0171450d0020004200370308200041206a41023a0000200041186a41003a0000200042013703000c1d0b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c1c0b20042004280200417f6a220136020002400240200941ff01710d00024020010d002004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d00200410300b200841ff01714101470d010240200a450d00200510300b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c1d0b20010d002004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d00200410300b0240200a450d00200510300b20004200370308200041206a41023a0000200041186a41003a0000200042013703000c1b0b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b200920087241ff01710d054108102f2201450d01200342083702742003200136027020032006370318200341f0006a200341186a4108106441c492c100410a20032802702201200328027841002802fcad4211030002402003280274450d00200110300b2000420037030820002003280050360019200041186a41003a00002000411c6a200341d3006a280000360000200042003703000c1a0b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b0240200920087241ff0171450d00410221010c180b200341d0006a2005200710e40120032802502201450d15200328025421022003200341d8006a2802003602d408200320013602d008200341106a200341d0086a109b0120032802100d1420032802d408220420032802142208490d142008417f4c0d010240024020080d00410121090c010b2008102f2209450d012009410020081087051a20032802d40821040b20042008490d13200920032802d0082008108505210b20032802d40822042008490d032003200420086b3602d408200320032802d00820086a3602d008200341086a200341d0086a109b0120032802080d1220032802d4082204200328020c2207490d122007417f4c0d010240024020070d004101210c0c010b2007102f220c450d01200c410020071087051a20032802d40821040b20042007490d11200c20032802d0082007108505210d20032802d40822042007490d022003200420076b22043602d408200320032802d00820076a220e3602d00820044104490d102003200e41046a3602d00820032004417c6a220f3602d408200f4104490d10200e28000421102003200e41086a3602d0082003200441786a220f3602d408200f4104490d102003200441746a3602d4082003200e410c6a3602d0082003200341d0086a109b0120032802000d102003280204220f20032802d408410c6e22042004200f4b1bad420c7e2211422088a70d012011a72204417f4c0d010240024020040d00410421120c010b2004102f2212450d010b2004410c6ead2111200f450d0c200341f8006a2113200341f9006a2114200341fa006a2115200341fb006a2116034020032802d4082204450d0f20032802d008220e2d0000211720032004417f6a22183602d4082003200e41016a3602d008200320173a00742018450d0f20032802d008220e2d0000211720032004417e6a22183602d4082003200e41016a3602d008200320173a00752018450d0f20032802d008220e2d0000211720032004417d6a22183602d4082003200e41016a3602d008200320173a00762018450d0f20032802d008220e2d0000211720032004417c6a22183602d4082003200e41016a3602d008200320173a00772018450d0f201320032802d008220e2d00003a000020032004417b6a22173602d4082003200e41016a3602d0082017450d0f201420032802d008220e2d00003a000020032004417a6a22173602d4082003200e41016a3602d0082017450d0f201520032802d008220e2d00003a00002003200441796a22173602d4082003200e41016a3602d0082017450d0f201620032802d008220e2d00003a00002003200e41016a3602d0082003200441786a22173602d40820174104490d0f20032902742119200e28000121172003200441746a3602d4082003200e41056a3602d008024002402011422088a722042011a7470d00200441016a220e2004490d0420044101742218200e200e2018491b220e4104200e41044b1bad420c7e221a422088a745410274210e201aa721180240024020040d00200341003602700c010b200341043602782003201236027020032004410c6c3602740b200341186a2018200e200341f0006a10692003280220210e20032802184101460d01200328021c2112201142808080807083200e410c6ead8421110b20122004410c6c6a220420173602082004201937020020114280808080107c2111200f417f6a220f0d010c0f0b0b200e450d010b102a000b102c000b2007200441f0f5c100104a000b2008200441f0f5c100104a000b20004200370308200041206a41023a0000200041186a41003a0000200042013703000c140b200341f0006a200141046a41dc001085051a200341186a41206a200241206a290200370300200341186a41186a200241186a290200370300200341186a41106a200241106a290200370300200341186a41086a200241086a290200370300200320022902003703182000200341f0006a200341186a10e5010c130b2002411a6a2901002106200241196a2d0000210b200241186a2d0000210c200241166a2f0100210e200241156a2d0000210d200241146a2d0000210f200241126a2f01002110200241116a2d00002112200241106a2d000021172002410e6a2f010021182002410d6a2d000021132002410c6a2d000021142002410a6a2f01002115200241096a2d00002116200241086a2d0000211b200241066a2f0100211c200241056a2d0000211d200241046a2d0000211e200241026a2f0100210220042004280200417f6a220136020002400240200941ff01710d00024020010d002004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d00200410300b200841ff01714101470d01200341186a200520071065200341d0006a41186a200341186a41186a2900002211370300200341d0006a41106a200341186a41106a2900002219370300200341d0006a41086a200341186a41086a290000221a37030020032003290018221f370350200341b1016a2011370000200341a9016a2019370000200341a1016a201a37000020034190016a200b3a0000200341f0006a41186a20123a0000200341f0006a41106a20163a00002003201f3700990120032006370091012003200c3a008f012003200e3b008d012003200d3a008c012003200f3a008b01200320103b008901200320173a008701200320183b008501200320133a008401200320143a008301200320153b0081012003201b3a007f2003201c3b007d2003201d3a007c2003201e3a007b200320023b0079200341053a007820034200370370200341f0006a10e6010240200a450d00200510300b200320032800d0083602482003200341d3086a28000036004b200041186a41003a000020004200370308200020032802483600192000411c6a200328004b360000200042003703000c140b20010d002004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d00200410300b0240200a450d00200510300b20004200370308200041206a41023a0000200041186a41003a0000200042013703000c120b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b0240200920087241ff01710d002005200741002802bcad421105000240200a450d00200510300b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c120b0240200a450d00200510300b20004200370308200041206a41023a0000200041186a41003a0000200042013703000c110b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b0240024002402009200872220441ff01710d0002402007450d0020052007410c6c6a21022005210103402001280200200141086a28020041002802b4ad421105002001410c6a22012002470d000b2007450d002007410c6c21022005210103400240200141046a280200450d00200128020010300b2001410c6a2101200241746a22020d000b0b200a450d02200a410c6c0d010c020b02402007450d002007410c6c21022005210103400240200141046a280200450d00200128020010300b2001410c6a2101200241746a22020d000b0b200a450d01200a410c6c450d010b200510300b0240200441ff0171450d0020004200370308200041206a41023a0000200041186a41003a0000200042013703000c110b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c100b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b0240024002402009200872220441ff01710d0002402007450d002005200741186c6a21022005210103402001280200200141086a2802002001410c6a280200200141146a28020041002802fcad42110300200141186a22012002470d000b2007450d00200741186c21022005210103400240200141046a280200450d00200128020010300b0240200141106a280200450d002001410c6a28020010300b200141186a2101200241686a22020d000b0b200a450d02200a41186c0d010c020b02402007450d00200741186c21022005210103400240200141046a280200450d00200128020010300b0240200141106a280200450d002001410c6a28020010300b200141186a2101200241686a22020d000b0b200a450d01200a41186c450d010b200510300b0240200441ff0171450d0020004200370308200041206a41023a0000200041186a41003a0000200042013703000c100b2000420037030820002003280070360019200041186a41003a00002000411c6a200341f3006a280000360000200042003703000c0f0b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b0240200920087241ff01710d000240024020054101460d0041ce92c100410d41002802b4ad421105000c010b20034201370370200341003602782003200a360218200341f0006a200341186a4104106420032007360218200341f0006a200341186a4104106441ce92c100410d20032802702201200328027841002802fcad421103002003280274450d00200110300b200341fc006a2007360200200341f0006a41086a200a36020020032005360274200341043a0070200341186a41186a4200370300200341286a22014200370300200341186a41086a420037030020034200370318200341186a41dca4c000410610ab01200141e0c0c100410610ab01200341d0086a200341f0006a10e70141002802a4ad422101200341d0006a41086a200341d0086a41086a280200360200200320032903d008370350200341186a4120200341d0006a2001110400200320032800483602402003200341cb006a280000360043200041186a41003a000020004200370308200020032802403600192000411c6a2003280043360000200042003703000c0f0b20004200370308200041206a41023a0000200041186a41003a0000200042013703000c0e0b20042004280200417f6a2201360200024002400240200941ff01710d0020010d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20010d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b024002400240200920087241ff01710d002003200637027420032005360270200341186a200341f0006a10e80120032d001822014108460d02200341186a41086a280200210220032d0019210420032d001a210920032d001b2108200328021c210a0c010b410221010240200a450d00200510300b0b200020083a0023200020093a0022200020043a002120004200370308200041286a2002360200200041246a200a360200200041206a20013a0000200041186a41003a0000200042013703000c0e0b20034200370370200341023a0078200341f0006a10e601200041186a41003a000020004200370308200042003703000c0d0b2012450d030b2011a7210e024020032802d40841034b0d00200e450d03200e410c6c450d030c020b02402002450d00200110300b024002400240024020084105470d000240200b4180a4c0004105108805450d00410f210241ba94c1002104410021090c020b0240201041034f0d00411a210241a094c1002104410121090c020b200b103002402007450d00200d10300b0240200e450d00200e410c6c450d00201210300b2003200637027420032005360270200341186a200341f0006a10e80120032d001822014108460d03200341186a41086a280200210220032d0019210820032d001a210920032d001b210a200328021c21040c0e0b410f210241ba94c1002104410021092008450d010b200b10300b02402007450d00200d10300b200e450d09200e410c6c450d09201210300c090b20034200370370200341023a0078200341f0006a10e601200320032800483602402003200341cb006a280000360043200041186a41003a000020004200370308200020032802403600192000411c6a2003280043360000200042003703000c0b0b2011a72204450d012004410c6c450d010b201210300b2007450d010b200c10300b2008450d010b200910300b2002450d00200110300b41022109418394c1002104411d21020b410321010b410021080240200a450d00200510300b0b200320032800483602402003200341cb006a280000360043200041186a41003a000020004200370308200020032802403600192000411c6a2003280043360000200041286a2002360200200041246a20043602002000200a3a0023200020093a0022200020083a0021200041206a20013a0000200042013703000b200341e0086a24000be40303067f017e017f200028020421012000410036020402402001450d00024020002802002202450d00034020012802b80121012002417f6a22020d000b0b024020002802082203450d004100210403400240024002400240200420012f01b601490d0041002100034041002102024020012802002205450d00200041016a210420012f01b4012106200521020b024041e80141b80120001b450d00200110300b024020020d00410021010c050b2004210020022101200620022f01b6014f0d000b20022006410c6c6a41306a2105024020040d00200221010c020b200641027420026a41bc016a280200210102402004417f6a2200450d00034020012802b80121012000417f6a22000d000b0b410021040c020b20012004410c6c6a41306a210520042106200121020b200641016a21040b20022006410c6c6a41346a2902002107200528020021080b2008450d0202402007422088a72202450d0020024104742100200841086a2102034002402002280200450d002002417c6a28020010300b200241106a2102200041706a22000d000b0b2003417f6a21030240200742ffffffff0083500d00200810300b20030d000b0b41002102034020012802002100024041e80141b80120021b450d00200110300b2002417f6a21022000210120000d000b0b0b130020002002ad4220862001ad84101710c6040bd1f60107057f027e0b7f017e0b7f057e2b7f23004180206b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a0e050001020304000b200228022422042004280200417f6a2205360200200141046a280200210620022d0001210702400240024020022d000022020d0020050d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a22013602002001450d010c020b20050d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22012001280200417f6a220136020020010d010b200410300b41022101420021084200210902400240200220077241ff01710d00200341a0056a41186a22074200370300200341b0056a22014200370300200341a0056a41086a22024200370300200342003703a005200341a8046a41e2a4c000410f10ab012002200341a8046a41086a2204290000370300200320032900a8043703a005200341a8046a41a0d9c000411c10ab0120072004290000370300200120032900a8043703002003200341a0056a412010850220032802004101460d014190b3c000ad2109410321014280808080c00121080b200041810a3b002120004200370308200041246a2008200984370200200041206a20013a0000200041186a41003a0000200042013703000c150b200742003703002001420037030020024200370300200342003703a005200341a8046a41e2a4c000410f10ab0120022004290000370300200320032900a8043703a005200341a8046a41a0d9c000411c10ab01200141086a2004290000370000200120032900a804370000200320063602a018200341a0056a4120200341a0186a410441002802fcad42110300200041186a41003a000020004200370308200042003703000c140b200341e8016a200141046a220441d8001085051a200228022422012001280200417f6a220736020002400240024020022d00000d0020022d00012102024020070d002001280208200128020c2802001102000240200128020c280204450d00200128020810300b200141046a22072007280200417f6a220736020020070d00200110300b200241ff01714102470d01200341a0056a41186a22014200370300200341a0056a41106a220a4200370300200341a0056a41086a22024200370300200342003703a005200341a8046a41e2a4c000410f10ab012002200341a8046a41086a2207290000370300200320032900a8043703a005200341a8046a41acdac000410e10ab0120012007290000370300200a20032900a804370300200341a0056a412041002802ccad42110100450d0241dbb9c00041334190bac000102d000b20070d002001280208200128020c2802001102000240200128020c280204450d00200128020810300b200141046a22022002280200417f6a220236020020020d00200110300b024020032802ec01450d0020032802e80110300b200328029c0221040240200341a4026a2802002201450d002001410c6c21022004210103400240200141046a280200450d00200128020010300b2001410c6a2101200241746a22020d000b0b0240200341a0026a2802002201450d002001410c6c450d00200410300b20032802a80221040240200341b0026a2802002201450d0020014104742102200441086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200241706a22020d000b0b0240200341ac026a28020041ffffffff0071450d00200410300b200341b4026a10e301200320032800e1013602c8012003200341e4016a2800003600cb01200320032900d2013703b8012003200341d9016a2900003700bf01200041186a41003a000020004200370308200020032802c8013600192000411c6a20032800cb01360000200041206a41023a0000200020032903b801370021200041286a20032900bf01370000200042013703000c140b200341c0026a41306a200441306a280200360200200341c0026a41286a200441286a290200370300200341c0026a41206a200441206a290200370300200341c0026a41186a200441186a290200370300200341c0026a41106a200441106a290200370300200341c0026a41086a200441086a290200370300200320042902003703c00241002802e8ac4241016a220141004c0d03200341bc026a280200210b200341b8026a280200210c200341b0026a280200210d200341ac026a280200210e200341a4026a2802002107200341a0026a280200210f20032802b402211020032802a8022111200328029c022112024041002802ecac424101460d00200341d0106a41002802e4ac42110200200341a0186a41086a200341d0106a41086a290300370300200320032903d0103703a01841002802e8ac420d054100417f3602e8ac42024041002802ecac42450d00024041002802fcac422202450d0041002802f4ac422101200241027421020340200128020022042004280200417f6a3602000240200128020022042802000d00200441046a22042004280200417f6a3602002001280200220441046a2802000d00200410300b200141046a21012002417c6a22020d000b0b41002802f8ac4241ffffffff0371450d0041002802f4ac4210300b410041013602ecac42410020032903a0183702f0ac424100200341a8186a2903003702f8ac42410041002802e8ac42220141016a3602e8ac42200141026a220141004c0d060b410020013602e8ac4241002802f0ac42220241016a220141004c0d06410020013602f0ac420240024041002802fcac4222010d00410020023602f0ac420c010b200141027441002802f4ac426a417c6a280200220128020041016a220241014d0d0820012002360200410041002802f0ac42417f6a3602f0ac4220012802080d092001417f360208200128020c2202280208220420032802c802470d0a200228020020032802c00220041088050d0a200228021820032802cc02470d0b2002411c6a2202200341c0026a41146a220441201088050d0c2001410036020820012001280200417f6a220236020020020d00200141046a22022002280200417f6a220236020020020d00200110300b410041002802e8ac42417f6a3602e8ac42200341a0056a41186a4200370300200341a0056a41106a4200370300200341a0056a41086a22014200370300200342003703a005200341a8046a41e2a4c000410f10ab012001200341a8046a41086a2202290000370300200320032900a8043703a005200341a8046a41a0d9c000411c10ab01200a41086a2002290000370000200a20032900a804370000200341b0016a200341a0056a4120108502024020032802b0014101470d0020032802cc0220032802b4012204490d0042002108200341b8056a22054200370300200341b0056a22064200370300200341a0056a41086a22014200370300200342003703a005200341a8046a41e2a4c000410f10ab012001200341a8046a41086a2202290000370300200320032900a8043703a005200341a8046a41a0d9c000411c10ab01200a41086a22132002290000370000200a20032900a804370000200341a0056a412041002802b4ad42110500200542003703002006420037030020014200370300200342003703a005200341a8046a41e2a4c000410f10ab0120012002290000370300200320032900a8043703a005200341a8046a41ecd9c000411510ab0120132002290000370000200a20032900a804370000200341a0186a200341a0056a41201086020240024020032802a0182201450d00200341a0056a412041002802b4ad4211050020032902a41821080c010b41002802dc944221010b200341b8056a4200370300200341b0056a4200370300200341a0056a41086a22024200370300200342003703a005200341a8046a41e2a4c000410f10ab012002200341a8046a41086a2205290000370300200320032900a8043703a005200341a8046a4198dbc000410b10ab01200a41086a2005290000370000200a20032900a804370000200320043602a018200341a0056a4120200341a0186a410441002802fcad4211030041a0bac000410520012008422088a741002802fcad42110300200320032802cc023602ac18200341013a00a818200342013703a018200341a0186a10e6012008a7450d00200110300b10af012114200341d8036a41186a200341ec026a290200370300200341d8036a41106a200341c0026a41246a290200370300200341d8036a41086a200341c0026a411c6a290200370300200320032902d4023703d8034101102f2201450d14200141003a0000410041003502e0ac42200341a0186aad7c42adfed5e4d485fda8d8007e42218922083e02e0ac42200341a0016a41e0acc200ad220942a4bb99fed1a0bbb02385420042adfed5e4d485fda8d800420010840520034180016a200842a4bb99fed1a0bbb02385420042adfed5e4d485fda8d800420010840520034190016a200942c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200341f0006a200842c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200341e0006a2008200985420042adfed5e4d485fda8d8004200108405200341a0056a418de2c10041011065200341a4116a200341b8056a2903003702002003419c116a200341b0056a29030037020020034194116a200341a0056a41086a29030037020020034184116a428180808010370200200341f8106a4200370300200341d0106a41246a41bcf5c100360200200320032903a00537028c112003200136028011200341003602f01020032008200341a0016a41086a29030020032903a001857c200341e0006a41086a29030020032903608542cf829ebbefefde82147c2215893703d0102003200341f0006a41086a29030020032903708520097c2015423088893703e8102003200820034190016a41086a290300200329039001857c2015422088893703e010200320034180016a41086a2903002003290380018520097c2015421088893703d81020122007410c6c6a2116201221012007450d112012410c6a210120122802002217450d11200341f0106a2118200341ba186a2119200341b3186a211a200341a0186a410c6a211b200341a0186a410572211c200341bf186a211d2012210203402001211e20022902042208422088a7221f417f4c0d1b02400240201f0d00410121010c010b201f102f2201450d160b20012017201f1085052102410021010240200328028811201f470d002002200328028011201f1088054521010b0240201f450d00200210300b024020010d00200341a0056a2017201f106520034188096a41186a2202200341a0056a41186a29030037030020034188096a41106a2204200341a0056a41106a29030037030020034188096a41086a2207200341a0056a41086a290300370300200320032903a0053703880902400240201f0d00410121010c010b201f102f2201450d170b20012017201f108505212002400240200328028811201f470d002020200328028011201f1088050d00201f0d010c020b200341a0186a41186a20022903002209370300200341a0186a41106a20042903002221370300200341a0186a41086a20072903002222370300200320032903880922153703a018200341d0006a200920032903e81020032903d810852223854200202120032903e010220920032903d0102224852225854200108405200341c0006a2022202385420020152025854200108405200341306a2009420020092009202442adfed5e4d485fda8d8007e200341d0006a41086a2903002003290350857c42a0cbbf9599b5a19f0a7c85421789200341c0006a41086a2903002003290340857c854217892221420010840520032802f410220720032802f0102206200341306a41086a290300200329033085202189a722267122136a28000022272026411976222841818284086c2229732201417f73200141fffdfb776a7141808182847871210541042104201341046a200671212a2015a7212b2013212c202721020340202a2101024020050d0002402002200241017471418081828478710d002029200720016a2800002202732205417f73200541fffdfb776a714180818284787121052006200120046a41046a71212a200441046a21042001212c0c020b200341dc046a41026a222a201c41026a2d00003a0000200341d8046a41026a222c201b41026a2d00003a0000200341d4046a41026a2229201a41026a2d00003a0000200341d0046a41026a222d201941026a2d00003a00002003201c2f00003b01dc042003201b2f00003b01d8042003201a2f00003b01d404200320192f00003b01d00420032d00a418212e20032802a818212f20032800af18213020032801b618213120032f00bd18201d2d00004110747221052003200341d0106a3602a005410421010240034020274180818284787122020d01201320016a2102200141046a21012007200220067122136a28000021270c000b0b0240200720026841037620136a20067122016a2c000022024100480d0020072007280200418081828478716841037622016a2d000021020b20032802f8102104024020024101712213450d0020040d00200341a0186a2018200341a0056a10800220032802f010220620267121024104210120032802f410210703402002220420016a2006712102200141046a2101200720046a280000418081828478712227450d000b0240200720276841037620046a20067122016a2c00004100480d002007280200418081828478716841037621010b20032802f81021040b2003200420136b3602f810200720016a20283a000020062001417c6a7120076a41046a20283a00002007410020016b41306c22026a220141546a202e3a0000200720026a41506a202b360200200141556a220220032f01dc043b0000200241026a202a2d00003a0000200141586a202f3600002001415c6a220220032f01d8043b0000200241026a202c2d00003a00002001415f6a2030360000200141636a220220032f01d4043b0000200241026a20292d00003a0000200141666a2031360000200141706a2020360200200141746a201f360200200141786a201f3602002001417c6a41013602002001416d6a220241026a20054110763a0000200220053b00002001416a6a220141026a202d2d00003a0000200120032f01d0043b0000200320032802fc1041016a3602fc100c030b200568212d2001212a2005417f6a2005712105200741002006202c202d4103766a716b41306c6a220141506a200341a0186a41201088050d000b02402001417c6a2202280200220441004a0d00200141706a21070240200141746a2205280200450d0020072802001030200228020021040b2005201f36020020072020360200200141786a201f3602002002200441016a3602000c020b2002200441016a360200201f450d010b202010300b02402008a7450d00201710300b201e2016460d13201e410c6a2101201e2102201e28020022170d000c120b0b200228022422042004280200417f6a22053602002001410c6a2802002113200141086a2802002107200141046a280200210620022d0001210102400240024020022d000022020d0020050d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22052005280200417f6a22053602002005450d010c020b20050d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22052005280200417f6a220536020020050d010b200410300b0240200220017241ff01710d00200341a0186a10b001024020032802a0184101470d002013200341b4186a2802004d0d002007450d110c100b20032013360290092003200736028c092003200636028809200341b8056a22014200370300200341b0056a22024200370300200341a0056a41086a22044200370300200342003703a005200341a8046a41e2a4c000410f10ab012004200341a8046a41086a2205290000370300200320032900a8043703a005200341a8046a41c0e1c000411510ab0120012005290000370300200220032900a804370300200341d0106a20034188096a10870241002802a4ad422101200341a0186a41086a200341d0106a41086a280200360200200320032903d0103703a018200341a0056a4120200341a0186a200111040020070d0f0c100b02402007450d00200610300b20004200370308200041186a41003a0000200041206a41023a0000200042013703000c120b200341e8106a200141196a290000370300200341e0106a200141116a290000370300200341d8106a200141096a290000370300200320012900013703d010200228022422042004280200417f6a220536020020022d0001210702400240024020022d000022020d0020050d022004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22052005280200417f6a22053602002005450d010c020b20050d012004280208200428020c2802001102000240200428020c280204450d00200428020810300b200441046a22052005280200417f6a220536020020050d010b200410300b200220077241ff01710d0a200341b8056a22024200370300200341b0056a22044200370300200341a0056a41086a22074200370300200342003703a005200341a8046a41e2a4c000410f10ab012007200341a8046a41086a2205290000370300200320032900a8043703a005200341a8046a41fce2c000411110ab0120022005290000370300200420032900a8043703004120102f2202450d12200141016a2101200342203702a418200320023602a018200341a0186a200341d0106a41201064200341a0056a412020032802a018220220032802a81841002802fcad42110300024020032802a418450d00200210300b200341c1186a200141186a290000370000200341b9186a200141106a290000370000200341b1186a200141086a290000370000200341023a00a818200342013703a018200320012900003700a918200341a0186a10e601200041186a41003a00002000420037030820002003280088093600192000411c6a2003418b096a280000360000200042003703000c110b410c21042001410c6a2802002127200141086a2802002113200141046a280200210620022802242101200341a0056a41186a22074200370300200341a0056a41106a22024200370300200341a0056a41086a22054200370300200342003703a005200341a8046a41e2a4c000410f10ab012005200341a8046a41086a222a290000370300200320032900a8043703a005200341a8046a41fce2c000411110ab012007202a290000370300200220032900a804370300200341a0186a200341a0056a412010820220034188096a41086a222a200341aa186a29010037030020034188096a41106a222c200341b2186a2901003703002003419f096a2229200341b9186a290000370000200320032901a218370388090240024020032d00a0184101470d0020032d00a118210c200341d0106a41186a2029290000370000200341e1106a202c290300370000200341d9106a202a29030037000020032003290388093700d1102003200c3a00d010200341a0056a200620271065200341a0186a41186a2007290300370300200341a0186a41106a2002290300370300200341a0186a41086a2005290300370300200320032903a0053703a0180240200341a0186a200341d0106a4120108805450d004107210241c0b3c00021050c020b200320273602a818200320133602a418200320063602a018200341d0106a200341a0186a10e801024020032d00d01022074108460d00200341d0106a41086a280200210420032d00d110212a20032d00d210210220032d00d310210620032802d41021050c0d0b42002108200341a0056a41186a4200370300200341b0056a4200370300200341a0056a41086a22044200370300200342003703a005200341a8046a41e2a4c000410f10ab012004200341a8046a41086a2207290000370300200320032900a8043703a005200341a8046a41fce2c000411110ab01200241086a2007290000370000200220032900a804370000200341a0056a412041002802b4ad4211050020012001280200417f6a2202360200024020020d002001280208200128020c2802001102000240200128020c280204450d00200128020810300b200141046a22022002280200417f6a220236020020020d00200110300b200320032800e8013602a0182003200341eb016a2800003600a318200041186a41013a000020004200370308200020032802a0183600192000411c6a20032800a3183600000c0d0b4106210241a4b3c0002105411121040b410321074101212a024020130d000c0b0b200610300c0a0b41aeaac000411820034188096a41c8aac00041d8aac0001034000b41b082c200411020034188096a41e8aac00041f8aac0001034000b41aeaac000411820034188096a41c8aac0004188abc0001034000b41aeaac000411820034188096a41c8aac0004184acc0001034000b00000b41b082c200411020034188096a41e8aac0004194acc0001034000b200341b4186a4100360200200341b0186a41bc8ec200360200200342013702a418200341a4acc0003602a0182002200341c0026a200341a0186a108802000b200341b4186a4100360200200341b0186a41bc8ec200360200200342013702a418200341bcacc0003602a018200241186a200341cc026a200341a0186a108902000b200341a0186a41146a4100360200200341b0186a41bc8ec200360200200342013702a418200341d4acc0003602a01820022004200341a0186a41dcacc000108a02000b20004200370308200041186a41003a0000200041206a41023a0000200042013703000c060b20012001280200417f6a2213360200024020130d002001280208200128020c2802001102000240200128020c280204450d00200128020810300b200141046a22132013280200417f6a221336020020130d00200110300b20004200370308200020032800a018360019200020063a0023200020023a00222000202a3a0021200041186a41003a0000200041286a2004360200200041246a2005360200200041206a20073a00002000411c6a200341a3186a280000360000420121080b200020083703000c040b200610300b20004200370308200020032800e801360019200041186a41003a00002000411c6a200341eb016a280000360000200042003703000c020b20162001460d0003402001410c6a21020240200141046a280200450d00200128020010300b2002210120162002470d000b0b2003418c116a21010240200f450d00200f410c6c450d00201210300b024002400240200341d8036a20014120108805450d00200341a0186a41186a200341d8036a41186a290300370300200341a0186a41106a200341d8036a41106a290300370300200341a0186a41086a200341d8036a41086a290300370300200320032903d8033703a018200341d0106a200341a0186a10672201450d01200128020c4101480d010b200341a0186a200341d0106a41e0001085051a20034198196a200341d8036a41186a29030037030020034190196a200341d8036a41106a29030037030020034188196a200341d8036a41086a290300370300200320032903d8033703801941012102200341a0056a418de2c10041011065200341b8196a200341a0056a41186a290300370300200341b0196a200341a0056a41106a290300370300200341a8196a200341a0056a41086a290300370300200320032903a0053703a01920034188096a200341a0186a41cc9fc0004120105f02402003280288094101470d004100212e0c070b0240200328028c0922010d004102212e0c080b024002400240024002400240024020034188096a41086a2903002208422088a722024104490d002002417c7122024104460d0020024108460d002002410c460d0020024110460d0020024114460d0020024118460d002002411c460d0020024120460d00200128000021182001280004213220012800082133200128000c2134200128001021352001280014213620012800182137200128001c21382001280020213902402008a7450d00200110300b200342bfd1ab90c7d5a39e653703b805200342cdfebda78cc1eae29d7f3703b005200342f3a4f999eff7bbed0c3703a805200342e3eeb3c4a9ae8fee907f3703a005200320143602a8042003200341a8046a4104108b023703b803200341a0096a200341a8046a41046a36020020034198096a200341b8036a41086a36020020034188096a41086a2204200341c0056a220136020020034194096a200341b8036a3602002003200341a8046a36029c092003200341a0056a36028c09200341013602880920034198046a20034188096a108c0220034188096a200341a0186a200328029804220720032802a004105f2003280288094101460d05200328028c092202450d032003200429030022084220883e02cc04200320023602c80420034188096a200341c8046a106b4101212e20032d00880922044101470d010c020b2008a7450d0b200110300c0b0b200341a8056a20034196096a290100370300200341b0056a2003419e096a290100370300200341b7056a200341a5096a2800003600002003200329018e093703a00520032d008d09210f20032d008c09211d20032f018a09213120032d008909212e0b02402008a7450d00200210300b200341b8036a41176a2202200341a0056a41176a280000360000200341b8036a41106a2205200341a0056a41106a290300370300200341b8036a41086a2206200341a0056a41086a290300370300200320032903a0053703b80320044101460d03200341a8046a41176a2002280000360000200341a8046a41106a2005290300370300200341a8046a41086a2006290300370300200320032903b8033703a8040c010b200341b0046a4200370300200341b8046a420037030041002131200341bf046a4100360000200342003703a8044100211d4100210f4100212e0b200341f8026a41176a2202200341a8046a41176a280000360000200341f8026a41106a2204200341a8046a41106a290300370300200341f8036a41086a200341a8046a41086a290300370300200341f8036a41106a2004290300370300200341f8036a41176a2002280000360000200320032903a8043703f8030240200328029c04450d00200710300b200342c1f3db99a8f3d78f3e3703b805200342faa3dfa29eecf58f543703b005200342b0a0d080e781cb92937f3703a805200342f5c1fc9bf099f7f2867f3703a005200320143602a8042003200341a8046a4104108b023703b803200341a0096a200341a8046a41046a36020020034188096a41106a200341b8036a41086a36020020034188096a41086a2207200136020020034194096a200341b8036a3602002003200341a8046a36029c092003200341a0056a36028c092003410136028809200341f8026a20034188096a108c0220034188096a200341a0186a20032802f8022204200328028003105f02402003280288094101470d004100212e0c070b0240200328028c0922020d00410021124100212b0c040b024020072903002208422088a722074104492007417c714104467222070d002002280004212b200228000021120b02402008a7450d00200210300b2007450d034101212e0c060b4100212e0b0240200328029c04450d00200710300b410221020c070b200341d0106a106c410021020c070b024020032802fc02450d00200410300b2003428580cfabfc80d1acc8003703b8052003429deee4a88fb6ac96f1003703b005200342b8d08eab80d2bcb1fc003703a805200342ea9a80e5d5b4e689bc7f3703a0052003201436029804200320034198046a4104108b023703a804200341a0096a20034198046a41046a36020020034198096a200341a8046a41086a36020020034188096a41086a200136020020034188096a410c6a200341a8046a360200200320034198046a36029c092003200341a0056a36028c092003410136028809200341b8036a20034188096a108c0220032802b803210420032802c00321022003420037028c09200341002802e88f42220736028809200341f8026a200341a0186a2004200220034188096a106802400240024002400240024020032d00f8024101460d00200341f8026a410c6a2802002102200341f8026a41086a280200212d20032802fc02211c024020032802bc03450d00200410300b200342b58a8dcc8c8e8be0203703b805200342f1d7d0ebf6d98cf4c3003703b005200342b8d08eab80d2bcb1fc003703a805200342ea9a80e5d5b4e689bc7f3703a0052003201436029804200320034198046a4104108b023703a804200341a0096a20034198046a41046a36020020034198096a200341a8046a41086a36020020034188096a41086a200136020020034188096a410c6a200341a8046a360200200320034198046a36029c092003200341a0056a36028c092003410136028809200341b8036a20034188096a108c0220032802b803210120032802c00321042003420037028c092003200736028809200341f8026a200341a0186a2001200420034188096a106820032d00f8024101460d03200341f8026a410c6a280200211b200341f8026a41086a280200213020032802fc02212f024020032802bc03450d00200110300b2002ad423c7e2208422088a70d0d2008a72201417f4c0d0d20010d01410421260c020b20032d00f902212e024020032802bc03450d00200410300b410421020c0a0b2001102f2226450d050b2001413c6e210720020d01410021060c020b20032d00f902212e024020032802bc03450d00200110300b41052102202d41ffffffff0371450d06201c10300c070b2002410274212a20034188096a41106a21024100211341002106201c210502400340200341b8036a200528020022272014108d0220032802c003212c20032802b8032101200341023a00b40520034188096a200341a0186a2001202c200341a0056a106a20032d0088094101460d01200341f8026a41086a222c200241086a290200370300200341f8026a41106a2229200241106a290200370300200341f8026a41186a221f200241186a290200370300200341f8026a41206a221e200241206a290200370300200341f8026a41286a2216200241286a280200360200200320022902003703f8022003280294092117200328029009212020032f018e09210420032d008d09212820032d008c092119024020032802bc03450d00200110300b20034188096a41286a221a201628020036020020034188096a41206a2216201e29030037030020034188096a41186a221e201f2903003703002002202929030037030020034188096a41086a2229202c290300370300200320032903f80237038809024020062007470d00200741016a22012007490d0b2007410174222c2001202c20014b1b22014104200141044b1bad423c7e2208422088a74541027421012008a7212c0240024020070d00200341003602a0050c010b200341043602a805200320263602a00520032007413c6c3602a4050b200341b8036a202c2001200341a0056a106920032802c0032101024020032802b8034101470d002001450d0c0c060b20032802bc0321262001413c6e21070b200541046a2105202620136a220120273602002001410c6a2017360200200141086a2020360200200141066a20043b0100200141056a20283a0000200141046a20193a0000200141106a200329038809370200200141186a2029290300370200200141206a2002290300370200200141286a201e290300370200200141306a2016290300370200200141386a201a2802003602002013413c6a2113200641016a2106202a417c6a222a450d020c000b0b20032d008909212e024020032802bc03450d00200110300b0240202d41ffffffff0371450d00201c10300b02402007450d002007413c6c450d00202610300b410621020240203041ffffffff03710d00201421290c070b202f1030201421290c060b0240202d41ffffffff0371450d00201c10300b201bad423c7e2208422088a70d072008a72201417f4c0d070240024020010d004104212d0c010b2001102f222d450d020b2001413c6e210502400240201b0d00410021130c010b201b410274212c20034188096a41106a21024100212741002113202f212a02400340200341b8036a2014202a2802002229108d0220032802c003211f20032802b8032101200341023a00b40520034188096a200341a0186a2001201f200341a0056a106a20032d0088094101460d01200341f8026a41086a221f200241086a290200370300200341f8026a41106a221e200241106a290200370300200341f8026a41186a2216200241186a290200370300200341f8026a41206a2217200241206a290200370300200341f8026a41286a2220200241286a280200360200200320022902003703f8022003280294092128200328029009211920032f018e09210420032d008d09211a20032d008c09211b024020032802bc03450d00200110300b20034188096a41286a221c202028020036020020034188096a41206a2220201729030037030020034188096a41186a221720162903003703002002201e29030037030020034188096a41086a221e201f290300370300200320032903f80237038809024020132005470d00200541016a22012005490d0b2005410174221f2001201f20014b1b22014104200141044b1bad423c7e2208422088a74541027421012008a7211f0240024020050d00200341003602a0050c010b200341043602a8052003202d3602a00520032005413c6c3602a4050b200341b8036a201f2001200341a0056a106920032802c0032101024020032802b8034101470d002001450d0c0c060b20032802bc03212d2001413c6e21050b202a41046a212a202d20276a220120293602002001410c6a2028360200200141086a2019360200200141066a20043b0100200141056a201a3a0000200141046a201b3a0000200141106a200329038809370200200141186a201e290300370200200141206a2002290300370200200141286a2017290300370200200141306a2020290300370200200141386a201c2802003602002027413c6a2127201341016a2113202c417c6a222c450d020c000b0b20032d008909212e024020032802bc03450d00200110300b0240203041ffffffff0371450d00202f10300b02402005450d002005413c6c450d00202d10300b4106210202402007450d002007413c6c450d00202610300b201421270c060b0240203041ffffffff0371450d00202f10300b20034188096a41176a2201200341f8036a41176a28000036000020034188096a41106a2202200341f8036a41106a29030037030020034188096a41086a2204200341f8036a41086a290300370300200320032903f80337038809200341a0186a106c2003419c036a200f3a00002003419b036a201d3a000020034199036a20313b000020034194036a2013360200200341f8026a41186a2005360200200341f8026a41106a200636020020034184036a20073602002003419d036a200329038809370000200341a5036a2004290300370000200341ad036a2002290300370000200341b4036a20012800003600002003202e3a0098032003202d36028c0320032026360280032003202b3602fc02200320123602f802200341a0056a41186a4200370300200341a0056a41106a4200370300200341a0056a41086a22014200370300200342003703a005200341a8046a41e2a4c000410f10ab012001200341a8046a41086a2202290000370300200320032900a8043703a005200341a8046a41acdac000410e10ab01200a41086a2002290000370000200a20032900a804370000200341003602d810200342013703d01020032802c00220032802c802200341d0106a10a601200320032802cc023602a018200341d0106a200341a0186a410410644120102f2201450d01200342203702a418200320013602a018200341a0186a200341c0026a41146a41201064200341d0106a20032802a018220120032802a8181064024020032802a418450d00200110300b200341f8026a41206a2101200341f8026a41146a2102200341f8026a41086a2104200320032802d0023602a018200341d0106a200341a0186a41041064200341a0056a412020032802d010220720032802d81041002802fcad42110300024020032802d410450d00200710300b200341d0106a41386a2207200141186a290200370300200341d0106a41306a2205200141106a290200370300200341d0106a41286a2206200141086a290200370300200341d0106a41206a22132001290200370300200341d0106a41086a222a2004108e02200341e4106a2002108e022003202b3602d410200320123602d010200341a0186a41386a2007290300370300200341a0186a41306a2005290300370300200341a0186a41286a2006290300370300200341a0186a41206a2013290300370300200341a0186a41186a200341d0106a41186a290300370300200341a0186a41106a200341d0106a41106a290300370300200341a0186a41086a202a290300370300200320032903d0103703a018200341a0056a41186a4200370300200341a0056a41106a4200370300200341a0056a41086a22024200370300200342003703a005200341a8046a41e2a4c000410f10ab012002200341a8046a41086a2204290000370300200320032900a8043703a005200341a8046a41d4dbc000411610ab01200a41086a2004290000370000200a20032900a804370000200341003602e003200342013703d8034120102f2202450d012003422037028c09200320023602880920034188096a200341a0186a41206a41201064200341d8036a200328028809220220032802900910640240200328028c09450d00200210300b200320032802a01836028809200341d8036a20034188096a41041064200320032802a41836028809200341d8036a20034188096a41041064200341a8186a200341d8036a108f02200341b4186a200341d8036a108f02200341a0056a412020032802d803220220032802e00341002802fcad42110300024020032802dc03450d00200210300b0240200341ac186a2802002202450d002002413c6c450d0020032802a81810300b0240200341a0186a41186a2802002202450d002002413c6c450d0020032802b41810300b200341a0056a41186a4200370300200341a0056a41106a22054200370300200341a0056a41086a22024200370300200342003703a005200341a8046a41e2a4c000410f10ab012002200341a8046a41086a2204290000370300200320032900a8043703a005200341a8046a41c8dcc000411110ab01200a41086a22062004290000370000200a20032900a804370000200342013703a01841002107200341003602a818200320183602d010200341a0186a200341d0106a41041064200320323602d010200341a0186a200341d0106a41041064200320333602d010200341a0186a200341d0106a41041064200320343602d010200341a0186a200341d0106a41041064200320353602d010200341a0186a200341d0106a41041064200320363602d010200341a0186a200341d0106a41041064200320373602d010200341a0186a200341d0106a41041064200320383602d010200341a0186a200341d0106a41041064200320393602d010200341a0186a200341d0106a41041064200341a0056a412020032802a018221320032802a81841002802fcad42110300024020032802a418450d00201310300b200341b8036a41186a200141186a290000370300200341b8036a41106a200141106a290000370300200341b8036a41086a200141086a290000370300200320012900003703b803200341a0056a41186a42003703002005420037030020024200370300200342003703a005200341a8046a41e2a4c000410f10ab0120022004290000370300200320032900a8043703a005200341a8046a41b4ddc000410e10ab0120062004290000370000200a20032900a804370000200341203602dc032003200341a0056a3602d80320034188096a200341a0056a412041002802d4ad421104000240024020032802880922010d000c010b200328028c09212a0240024020034190096a2802002202450d00200320012d00003a00a418200341013602a01820024101460d00200320012d00013a00a518200341023602a01820024102460d00200320012d00023a00a618200341033602a01820024103460d00200320012d00033a00a718200341043602a01820024104460d00200341a8186a20012d00043a0000200341053602a01820024105460d00200341a9186a20012d00053a0000200341063602a01820024106460d00200341aa186a20012d00063a0000200341073602a01820024107460d00200341ab186a20012d00073a0000200341083602a01820024108460d00200341ac186a20012d00083a0000200341093602a01820024109460d00200341ad186a20012d00093a00002003410a3602a0182002410a460d00200341ae186a20012d000a3a00002003410b3602a0182002410b460d00200341af186a20012d000b3a00002003410c3602a0182002410c460d00200341b0186a20012d000c3a00002003410d3602a0182002410d460d00200341b1186a20012d000d3a00002003410e3602a0182002410e460d00200341b2186a20012d000e3a00002003410f3602a0182002410f460d00200341b3186a20012d000f3a0000200341103602a01820024110460d00200341b4186a20012d00103a0000200341113602a01820024111460d00200341b5186a20012d00113a0000200341123602a01820024112460d00200341b6186a20012d00123a0000200341133602a01820024113460d00200341b7186a20012d00133a0000200341143602a01820024114460d00200341b8186a20012d00143a0000200341153602a01820024115460d00200341b9186a20012d00153a0000200341163602a01820024116460d00200341ba186a20012d00163a0000200341173602a01820024117460d00200341bb186a20012d00173a0000200341183602a01820024118460d00200341bc186a20012d00183a0000200341193602a01820024119460d00200341bd186a20012d00193a00002003411a3602a0182002411a460d00200341be186a20012d001a3a00002003411b3602a0182002411b460d00200341bf186a20012d001b3a00002003411c3602a0182002411c460d00200341c0186a20012d001c3a00002003411d3602a0182002411d460d00200341c1186a20012d001d3a00002003411e3602a0182002411e460d00200341c2186a20012d001e3a00002003411f3602a0182002411f460d00200341c3186a20012d001f3a0000200341a8046a41026a200341ad186a2d00003a0000200341f8036a41026a200341b4186a2d00003a0000200320032f01a4183b01d010200320032d00a6183a00d2102003200341ab186a2f00003b01a8042003200341b2186a2f01003b01f803200341bc186a2802002106200341b5186a2800002105200341ae186a2801002104200341203602a018200341a0186a41206a280200211320032800a718210220034198046a41026a200341bb186a2d00003a00002003200341b9186a2f00003b019804410121070c010b200342003702d41041002107200341002802dc94423602d010200341093602fc032003200341d8036a3602f8032003200341d0106a3602a804200341b4186a4101360200200342013702a418200341a0e6c1003602a0182003200341f8036a3602b018200341a8046a41d0adc000200341a0186a10321a20032802d01020032802d81010ad01024020032802d410450d0020032802d01010300b0b202a450d00200110300b0240024020070d00200341f0036a4200370300200341e8036a4200370300200341e0036a4200370300200342003703d8030c010b200341e1036a200341a8046a41026a2d00003a0000200341e8036a200341f8036a41026a2d00003a0000200341ef036a20034198046a41026a2d00003a0000200320032d00d2103a00da03200320032f01d0103b01d803200320023600db03200320032f01a8043b00df03200320043601e203200320032f01f8033b01e603200320053600e903200320032f0198043b00ed03200320133602f403200320063602f0030b02400240200d0d00420021210c010b200341033a00a818200342013703a0182003200d3602ac18200341a0186a10e60142002121200341a0056a41186a222a4200370300200341a0056a41106a22274200370300200341a0056a41086a22134200370300200342003703a005200341a8046a41e2a4c000410f10ab012013200341a8046a41086a2201290000370300200320032900a8043703a005200341a8046a41d0e2c000411910ab01200a41086a2001290000370000200a20032900a804370000200341206a200341a0056a10900220032903284280a094a58d1d20032802201b2115201141106a21042011200d41047422066a2117200341b1186a2120200341a0186a4101722116200341a0186a4104722107200341c4186a2114200341d7106a212820034188096a410472211e201121020340024002402006450d0020022802002105200228020421012003200241086a2902002208370390092003200136028c09200320053602880920010d0120172004460d002011200d4104746a21020340200441106a21010240200441086a280200450d00200441046a28020010300b2001210420022001470d000b0b0240200e41ffffffff0071450d00201110300b200341b8056a4200370300200341b0056a4200370300200341a0056a41086a22014200370300200342003703a005200341a8046a41e2a4c000410f10ab012001200341a8046a41086a2202290000370300200320032900a8043703a005200341a8046a41b4ddc000410e10ab01200a41086a2002290000370000200a20032900a8043700004120102f2201450d04200342203702a418200320013602a018200341a0186a200341d8036a41201064200341a0056a412020032802a018220120032802a81841002802fcad42110300024020032802a418450d00200110300b200341c1186a200341f0036a290300370000200341b9186a200341e8036a290300370000200341b1186a200341e0036a290300370000200341d0186a2021370300200320032903d8033700a918200341043a00a818200342013703a018200341a0186a10e6010c020b202a200341d8036a41186a222c2903003703002027200341d8036a41106a22292903003703002013200341d8036a41086a221f290300370300200320032903d8033703a0052014201e1063200741186a202a290300370000200741106a2027290300370000200741086a2013290300370000200720032903a005370000200320053602a018200341d0106a200341a0186a1066202c200341d0106a41186a2903003703002029200341d0106a41106a290300370300201f200341d0106a41086a290300370300200320032903d0103703d80320012008422088a72205108b0221092003200536028c09200320013602880902400240024002402005450d0020012d0000212c20032005417f6a36028c092003200141016a36028809202c0d00200341a0186a20034188096a10950120032d00a0182205410b460d00200341d0106a201641e7031085051a200341a0056a200341d0106a41e7031085051a2005410f7141756a0e020200010b200320093700a918200341003a00a818200342023703a018200341a0186a10e6010c020b200342013703d010200341003a00d810200320053a00a0182016200341a0056a41e7031085051a20034188096a200341d0106a200341a0186a201510910242002122024002402003280288090e03000001000b20032903900921220b202820034188096a41c8071085051a2020200341d0106a41cf071085051a200320093700a918200341023a00a818200342023703a018202220217c2121200341a0186a10e6010c010b200320093700a918200341013a00a818200342023703a018200341a0186a10e6010b02402008a7450d00200110300b200241106a2102200641706a2106200441106a21040c000b0b024002400240200341d8036a200341b8036a41201088050d00200341b8056a4200370300200341b0056a4200370300200341a0056a41086a22014200370300200342003703a005200341a8046a41e2a4c000410f10ab012001200341a8046a41086a2202290000370300200320032900a8043703a005200341a8046a41e8dec000411910ab01200a41086a2002290000370000200a20032900a8043700002003200d3602a018200341a0056a4120200341a0186a410441002802fcad421103000240200d0d00200e41ffffffff0071450d00201110300b2003280280032106200328028803212d20032802cc02211b02400240200c0d0041002101200341b0186a4100360200200341003602a4180c010b200341a0186a2010200c109301200b21010b200341d0106a41106a200341a0186a41106a22022903002208370300200341d0106a41086a200341a0186a41086a22042903002209370300200320032903a01822153703d0102002200837030020042009370300200320153703a01802402001450d0020032001417f6a22133602b818200341a0186a410020032802a4181b220528020021040240024020052802082207200528020422012f01b6014f0d00200121020c010b03400240200128020022020d00410021020c020b200441016a210420012f01b401210720022101200720022f01b6014f0d000b0b024002402004450d00200741027420026a41bc016a280200210102402004417f6a2204450d00034020012802b80121012004417f6a22040d000b0b410021040c010b200741016a2104200221010b200520013602042005410036020020052004360208202d450d02200220074102746a41046a210103402001280200210741002101202d2104202d2102024003400240024020072006200441017620016a2204413c6c6a28020022054d0d00200441016a21010c010b2004210220072005460d020b200220016b2104200220014b0d000c050b0b2013450d0120032013417f6a22133602b818200341a0186a410020032802a4181b220528020021040240024020052802082207200528020422012f01b6014f0d00200121020c010b03400240200128020022020d00410021020c020b200441016a210420012f01b401210720022101200720022f01b6014f0d000b0b024002402004450d00200741027420026a41bc016a280200210102402004417f6a2204450d00034020012802b80121012004417f6a22040d000b0b410021040c010b200741016a2104200221010b200520013602042005410036020020052004360208200220074102746a41046a21010c000b0b0240200c0d004100210c410021024100210b0c030b200c21020340200c2f01b60121012010450d032010417f6a2110200c20014102746a41b8016a280200210c20022802b80121020c000b0b200341003602a018200341d8036a200341b8036a200341a0186a41c0bac000108a02000b41d0bac00041d40041a4bbc000102d000b200341ec106a200b360200200341e8106a2001360200200341e4106a200c360200200341dc106a4200370200200341d8106a20023602002003410036028411200341003602f010200342013703d010200341a0186a200341d0106a10920202400240024020032802a818450d00417f417f200341fc106a280200200341f8106a2802006b410475410020032802f0101b220120034190116a2802002003418c116a2802006b41047541002003280284111b6a220220022001491b220141016a220220022001491bad42147e2208422088a70d0a2008a72201417f4c0d0a2001102f2228450d04202820032903a018370200202841106a200341a0186a41106a280200360200202841086a200341a0186a41086a290300370200200341a0186a200341d0106a41c8001085051a200141146e211c20034188096a200341a0186a10920202402003280290090d00410121200c020b41142101410121200240034002402020201c470d00201c417f417f20032802cc1820032802c8186b410475410020032802c0181b220220032802e01820032802dc186b410475410020032802d4181b6a220420042002491b220241016a220420042002491b6a2202201c490d0d201c41017422042002200420024b1b22024104200241044b1bad42147e2208422088a74541027421022008a7210402400240201c0d00200341003602a0050c010b200341043602a805200320283602a0052003201c41146c3602a4050b200341d8036a20042002200341a0056a106920032802e003210220032802d8034101460d0220032802dc032128200241146e211c0b202820016a2202200329038809370200200241106a20034188096a41106a280200360200200241086a20034188096a41086a2202290300370200200141146a2101202041016a212020034188096a200341a0186a1092022002280200450d030c000b0b2002450d0a0c040b024020032802d010450d00200341d0106a4104721093020b024020032802f0102202450d000240200341fc106a2802002207200341f8106a28020022046b2201450d002001417f2001417f4a1b2202410120024101481b200420076b22022001200220014a1b4104766c4104742102200441086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200241706a22020d000b20032802f01021020b200341f4106a28020041ffffffff0071450d00200210300b41002802e88f42212802402003280284112202450d00024020034190116a28020022072003418c116a28020022046b2201450d002001417f2001417f4a1b2202410120024101481b200420076b22022001200220014a1b4104766c4104742102200441086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200241706a22020d000b20032802841121020b20034188116a28020041ffffffff0071450d00200210300b4100211c410021200c010b024020032802a018450d00200341a0186a4104721093020b024020032802c0182207450d000240200341cc186a2802002202200341c8186a28020022046b2201450d002001417f2001417f4a1b2205410120054101481b200420026b22022001200220014a1b4104766c4104742102200441086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200241706a22020d000b0b200341c4186a28020041ffffffff0071450d00200710300b024020032802d4182207450d000240200341e0186a2802002202200341dc186a28020022046b2201450d002001417f2001417f4a1b2205410120054101481b200420026b22022001200220014a1b4104766c4104742102200441086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200241706a22020d000b0b200341d8186a28020041ffffffff0071450d00200710300b0240202041144b0d00202041014d0d01202041146c20286a41586a21014101210203402001200241016a22021094022001416c6a210120202002470d000c020b0b2020410176ad42147e2208422088a70d082008a7222f417f4c0d08202f102f2226450d022028416c6a212b202841446a212e41002802e88f42211041002112410021292020210d024002400340200d21144100210d4101210402402014417f6a2201450d000240024002400240024002402028200141146c6a221341046a280200220120282014417e6a220741146c6a220441046a2802002202490d0020042802002105024020012002470d0020132802002005490d010b202e201441146c6a2101410221130340200521270240201420132204470d004100210d201421040c080b02402002200141046a2802002207490d00200441016a21132002200747212a200128020021052001416c6a222c210120072102202a0d01202c210120072102202720054f0d010b0b201420046b210d0c010b4100210d02402007450d00202e201441146c6a2101034002402002200141046a2802002204490d00024020022004470d00200141146a2802002001280200490d010b2007210d0c020b2001416c6a2101200421022007417f6a22070d000b0b2014200d490d01201420204b0d022014200d6b22044101762207450d002028200d41146c6a2101202b201441146c6a21020340200341a0186a41106a2205200141106a2213280200360200200341a0186a41086a222a200141086a2227290200370300200320012902003703a018200241106a222c280200210c200241086a221f290200210820012002290200370200202720083702002013200c360200202c2005280200360200201f202a290300370200200220032903a018370200200141146a21012002416c6a21022007417f6a22070d000b0b200d450d04200441094b0d04201420204b0d022014200d6b2104200d417f6a2101202b200d41146c6a2102034020142001490d072002200441016a22041094022001417f6a220720014f0d042002416c6a2102200721012004410a490d000c040b0b200d201441ccf7c0001048000b2014202041ccf7c0001042000b2014200d417f6a2201490d032014202041dcf7c0001042000b200741016a210d0b024020292012470d00201241016a22012012490d0c201241017422022001200220014b1b22014104200141044b1b220141ffffffff01712001464102742102200141037421010240024020120d00200341003602a0180c010b200341043602a818200320103602a018200320124103743602a4180b200341d0106a20012002200341a0186a106920032802d8102101024020032802d0104101470d002001450d0d0c070b20032802d4102110200141037621120b201020294103746a220120043602042001200d360200202941016a22172129024020174102490d0003400240024002400240201020172229417f6a22174103746a2201280200450d00202941037420106a220741746a2802002204200128020422024d0d00202941024d0d0520102029417d6a221f4103746a2802042201200220046a4d0d01202941034d0d05200741646a280200200120046a4b0d050c010b20294103490d012001280204210220102029417d6a221f4103746a28020421010b20012002490d010b2029417e6a211f0b02400240024002402029201f41016a22014d0d0002402029201f4d0d0002402010201f4103746a2214280204221920142802006a2204201020014103746a2216280200221e490d000240200420204b0d00201441046a211a2028201e41146c6a22022016280204220c41146c22076a2101200441146c210502402004201e6b222a200c6b2204200c490d00202620022007108505220420076a21130240200c41014e0d00200421050c080b202a200c4a0d06200421050c070b20262001200441146c2207108505222c20076a211302400240200c4101480d00200441014e0d010b202c2105200121020c070b202b20056a210403402001416c6a210702400240201341706a2802002205200141706a280200222a4f0d00200721050c010b2013416c6a212702402005202a470d002007210520272802002007280200490d010b2001210720272113202721050b20042005290200370200200441106a200541106a280200360200200441086a200541086a290200370200200220074f0d052004416c6a2104200721012013202c4b0d000c050b0b20042020418cf8c0001042000b201e2004418cf8c0001048000b201f202941fcf7c0001033000b2001202941ecf7c0001033000b202c2105200721020c010b202820056a212a200421040340024002400240200141046a2802002207200441046a2802002205490d0020072005470d01200128020020042802004f0d010b200141146a2107200421050c010b200441146a210520012107200421010b20022001290200370200200241106a200141106a280200360200200241086a200141086a290200370200200241146a21022007202a4f0d01200521042007210120052013490d000b0b20022005201320056b220120014114706b1085051a201a2019200c6a3602002014201e3602002016201641086a2029201f6b41037441706a1086051a41012129201741014b0d000b0b200d450d020c000b0b2001201441dcf7c0001048000b0240201241ffffffff0171450d00201010300b202f4114702101202f4114490d00202f2001460d00202610300b200341e8106a22014200370300200341d0106a41106a22024200370300200341d0106a41086a22044200370300200342003703d010200341a8046a41e2a4c000410f10ab012004200341a8046a41086a2207290000370300200320032900a8043703d010200341a8046a4184dec000411010ab0120012007290000370300200220032900a804370300200341203602ac042003200341d0106a3602a8044100211e200341d8036a200341d0106a412041002802d4ad421104000240024002400240024020032802d803221f0d00410021010c010b20032802dc0321102003200341d8036a41086a2802003602bc032003201f3602b803200341186a200341b8036a109b0102400240024020032802180d0002400240200328021c22120d00410121014100212c410021290c010b200341b5056a210f200341ae056a210e200341a0056a4107722118200341a0186a410472212a200341b9186a2119200341b2186a211a200341a0186a410b6a21264100212c41002129410021160340024002400240024020032802bc0322014104490d00201641016a211620032802b8032213280000210720032001417c6a22273602bc032003201341046a3602b8032001417b6a210241002101034020272001460d01202a20016a201320016a220541046a2d00003a00002003200141016a22043602a0182003200541056a3602b803200320023602bc032002417f6a21022004210120044120470d000b200341e8046a41026a222b202641026a2d00003a0000200341e4046a41026a222e201a41026a2d00003a00002003202a2f01003b01ec04200320262f00003b01e8042003201a2f00003b01e4042003202a41026a2d00003a00ee0420032802c018212f20032802bc18213020032800b518213120032801ae18211120032800a718210b200341e0046a41026a221d201941026a2d00003a0000200320192f00003b01e004024020290d00419403102f2229450d0f4100210c202941003b0132202941003602000b20292113200c21140340201341046a210d20132f01322217410274212741002104417f21024100210102400340024020272001470d00201721020c020b201320016a2105200241016a2102200441206a2104200141046a2101417f200541046a2802002205200747200520074b1b22054101460d000b0240200541016a0e020100010b200341a0186a41026a2202202b2d00003a000020034188096a41026a2207202e2d00003a0000200341a0056a41026a2205201d2d00003a0000200320032f01e8043b01a018200320032f01e4043b018809200320032f01e0043b01a00520032f01ec042127201320046a220141166a20032d00ee043a0000200141146a20273b00002001411d6a20022d00003a00002001411b6a20032f01a0183b0000200141246a20072d00003a0000200141226a20032f0188093b0000200141176a200b3600002001411e6a2011360000200141256a2031360000200141296a20032f01a0053b00002001412b6a20052d00003a0000200141306a202f3600002001412c6a20303600000c050b02402014450d002014417f6a2114201320024102746a4194036a28020021130c010b0b02402017410a4b0d00200341a0186a41026a220120032d00ee043a000020034188096a41026a2204202b2d00003a0000200341a0056a41026a2205202e2d00003a0000200341f8036a41026a2227201d2d00003a0000200320032f01ec043b01a018200320032f01e8043b018809200320032f01e4043b01a005200320032f01e0043b01f803200241016a21140240200220174f222b0d00200d20144102746a200d20024102746a201720026b4102741086051a0b200d20024102746a2007360200200341dc046a41026a220720012d00003a0000200341d8046a41026a220d20042d00003a0000200341d4046a41026a220420052d00003a0000200341d0046a41026a220520272d00003a0000200320032f01a0183b01dc04200320032f0188093b01d804200320032f01a0053b01d404200320032f01f8033b01d004201341346a21010240202b0d00200120144105746a200120024105746a201720026b4105741086051a0b200120024105746a220120032f01dc043b0000200141026a20072d00003a0000200141096a200d2d00003a0000200120032f01d8043b0007200141106a20042d00003a0000200120032f01d4043b000e2001200b3600032001201136000a20012031360011200141176a20052d00003a0000200120032f01d0043b00152001202f36001c200120303600182013201741016a3b0132202c41016a212c0c040b4100213a4104210502400240200241054f0d00200221270c010b4105210541052127024002402002417b6a0e020201000b200241796a21274101213a410621050c010b410021274101213a0b419403102f2204450d0e200441003b013220044100360200200420132f0132223b2005417f736a22023b0132200d20054102746a280200213c200341dc046a41026a2217201341346a223d20054105746a220141026a2d00003a0000200320012f00003b01dc04200341d8046a41026a2239200141096a2d00003a0000200320012f00073b01d804200341d4046a41026a223e200141106a2d00003a0000200320012f000e3b01d404200341d0046a41026a223f200141176a2d00003a0000200320012f00153b01d0040240024002400240024002402002410c4f0d00203b200541016a22146b2002470d012001280003213b200128000a214020012800112141200128001c214220012800182143200441046a200d20144102746a20024102741085051a200441346a203d20144105746a20024105741085051a201320053b0132200341c8046a41026a223d20392d00003a00002003419c056a41026a2244203e2d00003a000020034198056a41026a2245203f2d00003a0000200320032f01dc043b019804200320172d00003a009a04200320032f01d8043b01c804200320032f01d4043b019c05200320032f01d0043b01980520034188096a41026a220d202b2d00003a0000200341a0056a41026a222b202e2d00003a0000200320032f01ec043b01a018200320032d00ee043a00a218200320032f01e8043b018809200320032f01e4043b01a005200341f8036a41026a222e201d2d00003a0000200320032f01e0043b01f80320042013203a1b220241046a21010240202741016a221420022f013222054b221d0d00200120144102746a200120274102746a200520276b4102741086051a0b200120274102746a2007360200201720032d00a2183a00002039200d2d00003a0000203e202b2d00003a0000203f202e2d00003a0000200320032f01a0183b01dc04200320032f0188093b01d804200320032f01a0053b01d404200320032f01f8033b01d004200241346a21010240201d0d00200120144105746a200120274105746a200520276b4105741086051a0b200120274105746a220120032f01dc043b0000200141026a20172d00003a0000200141096a20392d00003a0000200120032f01d8043b0007200141106a203e2d00003a0000200120032f01d4043b000e2001200b3600032001201136000a20012031360011200141176a203f2d00003a0000200120032f01d0043b00152001202f36001c200120303600182002200541016a3b01322003418c056a41026a220120442d00003a0000200320032f0198043b019405200320032d009a043a00960520034190056a41026a2230203d2d00003a0000200320032f019c053b018c05200320032f01c8043b01900520034188056a41026a221120452d00003a0000200320032f0198053b018805200320032f0194053b01fc04200320032d0096053a00fe04200341f8046a41026a220b20302d00003a0000200320032f0190053b01f804200341f4046a41026a223120012d00003a0000200320032f018c053b01f404200341f0046a41026a221d20112d00003a0000200320032f0188053b01f0040240201328020022010d004100212f0c080b4100212f203b21462040214720412148204321492042214a203c214b2004214c0240034020132f0130210520034194056a41026a224d20032d00fe043a0000203020312d00003a0000200320032f01fc043b019405200320032f01f4043b019005200122272f0132223a410b490d014100211441042107024020054105490d0020052107024002402005417b6a0e020201000b200541796a210541012114410621070c010b4100210541012114410521070b41c403102f2204450d16200441003b013220044100360200200420272f0132223b2007417f736a22023b0132202741046a224e20074102746a280200213c2017202741346a224f20074105746a220141026a2d00003a00002039200141096a2d00003a0000203e200141106a2d00003a0000203f200141176a2d00003a0000200320012f00003b01dc04200320012f00073b01d804200320012f000e3b01d404200320012f00153b01d0042002410c4f0d04203b200741016a22136b2002470d052001280003213b200128000a214020012800112141200128001c214220012800182143200441046a204e201341027422506a20024102741085051a200441346a204f20134105746a20024105741085051a202720073b0132200d20392d00003a0000202b203e2d00003a0000202e203f2d00003a0000200320032f01dc043b01a018200320172d00003a00a218200320032f01d8043b018809200320032f01d4043b01a005200320032f01d0043b01f80320042f0132220241016a21012002410c4f0d06203a20076b22072001470d07202f41016a212f20044194036a202720506a4194036a20074102741085051a4100210102400340200420014102746a4194036a280200220720013b013020072004360200200120024f0d01200120012002496a220120024d0d000b0b203d200d2d00003a00002044202b2d00003a00002045202e2d00003a0000200320032d00a2183a009a04200320032f01a0183b019804200320032f0188093b01c804200320032f01a0053b019c05200320032f01f8033b0198052004202720141b220741046a21130240200541016a220120072f013222024b223a0d00201320014102746a201320054102746a200220056b4102741086051a0b20132005410274224e6a204b360200201820032f01f8043b0000201841026a200b2d00003a0000200e20032f0190053b0000200e41026a20302d00003a0000200f20032f01f0043b0000200f41026a201d2d00003a00002003204d2d00003a00a205200320032f0194053b01a005200320463600a305200320473601aa05200320483600b1052003204a3602bc05200320493602b805200741346a21140240203a0d00201420014105746a201420054105746a200220056b4105741086051a0b200241016a2113201420054105746a221420032903a005370000201441186a200341a0056a41186a290300370000201441106a200341a0056a41106a290300370000201441086a200341a0056a41086a29030037000020074194036a21140240200541026a2246200241026a223a4f0d00201420464102746a201420014102746a200220056b4102741086051a0b201420014102746a204c360200200720133b013202402001203a4f0d002007204e6a4198036a2101034020012802002202200541016a22053b013020022007360200200141046a210120132005470d000b0b2011203d2d00003a000020034184056a41026a220120442d00003a000020034180056a41026a220220452d00003a0000200320032d009a043a008e05200320032f0198043b018c05200320032f01c8043b018805200320032f019c053b018405200320032f0198053b018005200320032d008e053a00fe04200320032f018c053b01fc04200b20112d00003a0000200320032f0188053b01f804203120012d00003a0000200320032f0184053b01f404201d20022d00003a0000200320032f0180053b01f004203b21462040214720412148204321492042214a20272113203c214b2004214c20272802002201450d090c000b0b202741046a21010240203a20054d22040d00200120054102746a220241046a2002203a20056b4102741086051a0b2001200541027422146a204b360200201820032f01f8043b0000201841026a200b2d00003a0000200e20032f01f4043b0000200e41026a20312d00003a0000200f20032f01f0043b0000200f41026a201d2d00003a0000200320032d00fe043a00a205200320032f01fc043b01a005200320463600a305200320473601aa05200320483600b1052003204a3602bc05200320493602b805200541016a2101202741346a2102024020040d00200220014105746a200220054105746a203a20056b4105741086051a0b203a41016a2107200220054105746a220220032903a005370000200241186a200341a0056a41186a290300370000200241106a200341a0056a41106a290300370000200241086a200341a0056a41086a29030037000020274194036a2102203a41026a2113024020040d00201420026a41086a200220014102746a203a20056b4102741086051a0b202720073b0132200220014102746a204c3602000240200120134f0d0020272001417f6a22014102746a4198036a2102034020022802002204200141016a22013b013020042027360200200241046a210220072001470d000b0b410021012005213c2032212f203321042034213b203521402036214120372143203821420c080b2002410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2002410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2001410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b410021010c040b200d200b2d00003a0000202b20312d00003a0000202e201d2d00003a0000200320032d00fe043a00a218200320032f01fc043b01a018200320032f01f8043b018809200320032f01f4043b01a005200320032f01f0043b01f803410121010b024020010d0020422138204321372041213620402135203b213420042133202f2132202c41016a212c0c010b41c403102f2202450d0b2002202936029403200241003b013220024100360200202941003b013020292002360200200c202f470d0820022f01322201410b4f0d07200c41016a210c2002200141016a22073b0132200220014102746a41046a203c360200200220014105746a220141346a20032f01a0183b0000200141366a20032d00a2183a0000200141376a203b3600002001413b6a20032f0188093b00002001413d6a200d2d00003a00002001413e6a2040360000200141c2006a20032f01a0053b0000200141c4006a202b2d00003a0000200141c5006a2041360000200141cb006a202e2d00003a0000200141c9006a20032f01f8033b0000200141d0006a2042360000200141cc006a204336000020024194036a20074102746a2004360200200420073b01302004200236020020422138204321372041213620402135203b213420042133202f213220022129202c41016a212c0b20162012470d000b410121010b2003202c3602a818200320293602a4182003200c3602a01820010d01200341a0186a1095020b2003420037028c0941002101200341002802dc944236028809200341093602fc032003200341a8046a3602f803200320034188096a3602a005200341b4186a4101360200200342013702a418200341a0e6c1003602a0182003200341f8036a3602b018200341a0056a41d0adc000200341a0186a10321a20032802880920032802900910ad010240200328028c09450d0020032802880910300b0c010b410121010b2010450d00201f10300b0240024020010d004100212c0c010b2003200c3602b8032029211e0b2003202c3602c0032003201e3602bc03200342003702dc032020450d022028202041146c6a2119200341a0186a4104722127200341a0186a41246a211a200341d0106a410472211620032802b8032126410121012028212a0340202a280204212c200341d0106a200341d8036a202a109602202c201b202c201b4b1b211020014101712114202a41146a210c0240024020032802d0104101460d0020034188096a41106a201641106a28020036020020034188096a41086a201641086a290200370300200320162902003703880902400240201e450d00202a2802002105201e21292026211f0340202941046a210220292f01322217410574211341002101417f210702400340024020132001470d00201721070c020b20022802002104200741016a2107200141206a2101200241046a2102417f2004200547200420054b1b22044101460d000b0240200441016a0e020100010b202920016a220141146a29000021082001411c6a2900002109200141246a2900002115200341a0186a41186a2001412c6a290000370300200341a0186a41106a2015370300200341a0186a41086a2009370300200320083703a0180c030b201f450d01201f417f6a211f202920074102746a4194036a28020021290c000b0b200341a0186a41186a4200370300200341a0186a41106a4200370300200341a0186a41086a4200370300200342003703a0180b20034188096a200341a0186a10970221010c010b20032802d81020032802dc104105746a41346a21010b202c201020141b211b200341a0056a41186a2202200141186a2204290000370300200341a0056a41106a2207200141106a2205290000370300200341a0056a41086a2213200141086a222c290000370300200320012900003703a005202a2802042129201a202a41086a1063202741186a2002290300370000202741106a2007290300370000202741086a2013290300370000202720032903a005370000200320293602a018200341d0106a200341a0186a10662004200341d0106a41186a2903003700002005200341d0106a41106a290300370000202c200341d0106a41086a290300370000200120032903d01037000041002101200c212a200c2019470d000c030b0b41aca1c200412041cca1c200102d000b41eaa0c2004130419ca1c200102d000b200341a0056a41186a22164200370300200341a0056a41106a22174200370300200341a0056a41086a22104200370300200342003703a005200341a8046a41e2a4c000410f10ab012010200341a8046a41086a2214290000370300200320032900a8043703a005200341a8046a4194e2c000411a10ab01200a41086a22192014290000370000200a20032900a804370000200341086a200341a0056a109002024002400240202d450d002006202d413c6c6a210c200341d0106a410472212c20032802b803211f0340200341d0106a200341d8036a20061096020240024020032802d0104101460d0020034188096a41106a202c41106a28020036020020034188096a41086a202c41086a2902003703002003202c2902003703880902400240201e450d0020062802002105201e212a201f21270340202a41046a2102202a2f01322229410574211341002101417f210702400340024020132001470d00202921070c020b20022802002104200741016a2107200141206a2101200241046a2102417f2004200547200420054b1b22044101460d000b0240200441016a0e020100010b202a20016a220141146a29000021082001411c6a2900002109200141246a2900002115200341a0186a41186a2001412c6a290000370300200341a0186a41106a2015370300200341a0186a41086a2009370300200320083703a0180c030b2027450d012027417f6a2127202a20074102746a4194036a280200212a0c000b0b200341a0186a41186a4200370300200341a0186a41106a4200370300200341a0186a41086a4200370300200342003703a0180b20034188096a200341a0186a10970221010c010b20032802d81020032802dc104105746a41346a21010b200341d0106a41086a200141086a290000370300200341d0106a41106a200141106a290000370300200341d0106a41186a200141186a290000370300200320012900003703d0100240024020062d00184101460d00200341a0186a41186a4200370300200341a0186a41106a4200370300200341a0186a41086a4200370300200342003703a0180c010b200341a0186a41186a200641316a290000370300200341a0186a41106a200641296a290000370300200341a0186a41086a200641216a290000370300200320062900193703a0180b200341d0106a200341a0186a41201088050d022006413c6a2206200c470d000b0b20032802dc03210520032802d803211320032802e003212a201642003703002017420037030020104200370300200342003703a005200341a8046a41e2a4c000410f10ab0120102014290000370300200320032900a8043703a005200341a8046a4184dec000411010ab0120192014290000370000200a20032900a804370000202a41246c41046a2201417f4c0d090240024020010d00410121020c010b2001102f2202450d040b20034100360290092003200136028c09200320023602880920034188096a202a10a501024020050d004100210141002102410021040c020b200521022013210420052101034020022f01322107024020040d00202a21040c030b2004417f6a2104200220074102746a4194036a280200210220012802940321010c000b0b41b4bbc000412941e0bbc000102d000b200341b4186a2007360200200341b0186a2002360200200342003703a818200320013602a418200341003602a01802402004450d00034020032004417f6a3602b818200341a0186a410020011b220628020021040240024020062802082207200628020422022f01324f0d00200221010c010b03400240200228020022010d00410021010c020b200441016a210420022f0130210720012102200720012f01324f0d000b0b024002402004450d00200741027420016a4198036a280200210202402004417f6a2204450d00034020022802940321022004417f6a22040d000b0b410021040c010b200741016a2104200121020b2006200236020420064100360200200620043602082003200120074102746a41046a2802002802003602d01020034188096a200341d0106a410410644120102f2202450d03200342203702d410200320023602d010200341d0106a200120074105746a41346a4120106420034188096a20032802d010220120032802d8101064024020032802d410450d00200110300b20032802b8182204450d0120032802a41821010c000b0b200341a0056a4120200328028809220120032802900941002802fcad421103000240200328028c09450d00200110300b02402005450d0002402013450d00034020052802940321052013417f6a22130d000b0b0240202a450d004100210203400240024002400240200220052f0132490d0041002102034041002101024020052802002206450d00200241016a210720052f01302104200621010b024041c40341940320021b450d00200510300b024020010d00410021050c050b2007210220012105200420012f01324f0d000b200120044105746a41346a2106200120044102746a220241046a2802002113024020070d00200121050c020b20024198036a280200210502402007417f6a2202450d00034020052802940321052002417f6a22020d000b0b410021020c020b200520024105746a41346a2106200520024102746a41046a280200211320022104200521010b200441016a21020b200320062f00003b018c052003200641026a2d00003a008e0520034188056a41026a200120044105746a2201413d6a2d00003a000020032001413b6a2f00003b01880520034184056a41026a200141c4006a2d00003a00002003200141c2006a2f00003b0184050b2013450d02202a417f6a222a0d000b0b41002101034020052802002102024041c40341940320011b450d00200510300b2001417f6a21012002210520020d000b0b200341b8056a4200370300200341b0056a4200370300200341a0056a41086a22014200370300200342003703a005200341a8046a41e2a4c000410f10ab012001200341a8046a41086a2202290000370300200320032900a8043703a005200341a8046a41e0dfc000410d10ab01200a41086a2002290000370000200a20032900a8043700002003201b3602a018200341a0056a4120200341a0186a410441002802fcad42110300200341b8036a10950202402020450d002028202041146c6a2104202821010340200141146a210202402001410c6a280200450d00200141086a28020010300b2002210120042002470d000b0b0240201c450d00201c41146c450d00202810300b02402003280284032201450d002001413c6c450d0020032802800310300b02402003280290032201450d002001413c6c450d00200328028c0310300b024020032802c402450d0020032802c00210300b200320032800e1013602c8012003200341e4016a2800003600cb01200041186a41013a0000200041106a202137030020004201370308200020032802c8013600192000411c6a20032800cb01360000200042003703000b20034180206a24000f0b102a000b024020032802fc02450d00200410300b41032102410021040c020b4101212e410121020c010b0b200341a0186a106c0b200341d0106a41086a2029360200200320273602d41020032004411074202e41ff0171410874722002723602d010200341b4186a4101360200200342013702a418200341a8bac0003602a0182003410a36028c09200320034188096a3602b0182003200341d0106a36028809200341a0186a41b0bac000103a000b102c000bb60d010c7f230041e0086b22012400200141a0086a2202420037030020014198086a2203420037030020014188086a41086a220442003703002001420037038808200141a8086a41dca4c000410610ab012004200141a8086a41086a2205290000370300200120012900a80837038808200141a8086a41acc0c100410610ab0120022005290000370300200320012900a808370300200141086a20014188086a4120108502024002402001280208450d00200128020c450d00200141a0086a2206420037030020014198086a2207420037030020014188086a41086a220242003703002001420037038808200141a8086a41dca4c000410610ab012002200141a8086a41086a2204290000370300200120012900a80837038808200141a8086a418cc4c100410e10ab01200341086a22082004290000370000200320012900a808370000200141203602bc08200120014188086a3602b808200141d0086a20014188086a412041002802d4ad421104000240024020012802d00822090d00410321050c010b20012802d408210a024002400240200141d0086a41086a280200220b450d00410121050240024020092d00000e03000401020b200b417f6a4104490d012009280001210c410021050c030b410221050c010b200142003702ac08200141002802dc94423602a808200141093602c4082001200141b8086a3602c0082001200141a8086a3602cc08200141246a410136020020014201370214200141a0e6c1003602102001200141c0086a360220200141cc086a41d0adc000200141106a10321a20012802a80820012802b00810ad01024020012802ac08450d0020012802a80810300b410321050b0b200a450d00200910300b200141106a200041e0071085051a200141fc076a4200370200200141f4076a200c36020020014102200520054103461b3602f007200141013602f8072006420037030020074200370300200242003703002001420037038808200141a8086a41dca4c000410610ab0120022004290000370300200120012900a80837038808200141a8086a41d0c1c100410a10ab0120082004290000370000200320012900a808370000200120014188086a41201085020240024002402001280204410020012802001b220041016a22042000490d00200141f8076a2105200141a0086a220c420037030020014198086a2206420037030020014188086a41086a220242003703002001420037038808200141a8086a41dca4c000410610ab012002200141a8086a41086a2200290000370300200120012900a80837038808200141a8086a41d0c1c100410a10ab01200341086a22072000290000370000200320012900a808370000200120043602a80820014188086a4120200141a8086a410441002802fcad42110300200c420037030020064200370300200242003703002001420037038808200141a8086a41dca4c000410610ab0120022000290000370300200120012900a80837038808200141a8086a418cc1c100410610ab0120072000290000370000200320012900a808370000200141003602d808200142013703d0080240024020012802f0070e03030001040b200141013a00a808200141d0086a200141a8086a410110640c030b200141023a00a808200141d0086a200141a8086a410110640c020b024020012802104102490d0020012d00184102470d0002400240200141286a2802000e020200010b200141386a280200410b470d01200141c0006a109c0120014188046a10a2010c010b200141306a280200410b470d00200141386a109c0120014180046a10a2010b20012802fc0741ffffff3f71450d0320012802f80710300c030b200141003a00a808200141d0086a200141a8086a41011064200120012802f4073602a808200141d0086a200141a8086a410410640b200141106a200141d0086a10d7012005200141d0086a10fc0341002802a4ad4221032000200141d0086a41086a280200360200200120012903d0083703a80820014188086a4120200141a8086a2003110400024020012802104102490d0020012d00184102470d0002400240200141286a2802000e020200010b200141386a280200410b470d01200141c0006a109c0120014188046a10a2010c010b200141306a280200410b470d00200141386a109c0120014180046a10a2010b20012802fc0741ffffff3f71450d0120012802f80710300c010b20002802004102490d0020002d00084102470d0002400240200041186a2802000e020200010b200041286a280200410b470d01200041306a109c01200041f8036a10a2010c010b200041206a280200410b470d00200041286a109c01200041f0036a10a2010b200141e0086a24000bb00401027f230041106b220224000240024002400240024002400240024020012d00000e06010402030500010b20004200370204200041002802dc9442360200200241003a00002000200241011064200141046a2802002001410c6a280200200010a6010c050b20004200370204200041002802dc9442360200200241023a000020002002410110644120102f2203450d0520024220370204200220033602002002200141016a41201064200020022802002201200228020810642002280204450d04200110300c040b20004200370204200041002802dc9442360200200241043a000020002002410110642000200141016a41041064200141086a280200200141106a280200200010a6010c030b20004200370204200041002802dc9442360200200241053a000020002002410110642000200141016a41041064200141086a280200200141106a280200200010a6010c020b20004200370204200041002802dc9442360200200241063a000020002002410110642000200141016a41041064200141086a280200200141106a280200200010a6010c010b20004200370204200041002802dc9442360200200241073a00002000200241011064200241003a000020002002410110640240200141046a2802004101460d00200241003a000020002002410110640c010b200241013a000020002002410110642002200141086a280200360200200020024104106420022001410c6a28020036020020002002410410640b200241106a24000f0b102a000be810010c7f230041d0086b22022400200241286a22034200370300200241206a22044200370300200241106a41086a2205420037030020024200370310200241f0006a41e2a4c000410f10ab012005200241f0006a41086a220629000037030020022002290070370310200241f0006a41ecd9c000411510ab01200320062900003703002004200229007037030041002107024002400240200241106a412041002802ccad42110100450d0020004183023b0100200041086a4113360200200041046a41f4b1c000360200200041026a41003a00000c010b20034200370300200442003703002005420037030020024200370310200241f0006a41e2a4c000410f10ab012005200629000037030020022002290070370310200241f0006a41acdac000410e10ab01200441086a200629000037000020042002290070370000200241203602342002200241106a360230200241386a200241106a412041002802d4ad4211040002400240200228023822050d000c010b200228023c21032002200241c0006a28020036024c20022005360248200241f0006a200241c8006a10f5010240024020022802702207450d00200241fc006a2802002108200228027421060c010b2002420037026441002107200241002802dc9442360260200241093602542002200241306a3602502002200241e0006a36025c20024184016a410136020020024201370274200241a0e6c1003602702002200241d0006a36028001200241dc006a41d0adc000200241f0006a10321a2002280260200228026810ad0102402002280264450d00200228026010300b0b2003450d00200510300b024002400240024002402007450d00200241f0006a10b00120022802704101470d010240200141086a280200220520022802744d0d0020004183023b0100200041086a4106360200200041046a41acb2c000360200200041026a41023a00000c050b20024194016a280200210920024190016a280200210a200241286a220b4200370300200241206a220c4200370300200241106a41086a2203420037030020024200370310200241f0006a41e2a4c000410f10ab012003200241f0006a41086a220d29000037030020022002290070370310200241f0006a41a0d9c000411c10ab01200441086a200d29000037000020042002290070370000200241086a200241106a4120108502024020022802084101460d00200b4200370300200c4200370300200241106a41086a2203420037030020024200370310200241f0006a41e2a4c000410f10ab012003200241f0006a41086a220d29000037030020022002290070370310200241f0006a4198dbc000410b10ab01200441086a220c200d290000370000200420022900703700002002200241106a4120108502410020082002280204410020022802001b6b220b200b20084b1b200a4d0d002001280200210a200241286a4200370300200241206a42003703002003420037030020024200370310200241f0006a41e2a4c000410f10ab012003200d29000037030020022002290070370310200241f0006a419cdfc000411110ab01200c200d29000037000020042002290070370000200541046a2203417f4c0d0302400240024002400240024020030d0020024100360278200242013703700c010b2003102f220d450d0920024100360278200220033602742002200d360270200541c000490d01200541808001490d022005418080808004490d030b200241033a0060200241f0006a200241e0006a4101106420022005360260200241f0006a200241e0006a410410640c030b200220054102743a0060200241f0006a200241e0006a410110640c020b200220054102744101723b0160200241f0006a200241e0006a410210640c010b20022005410274410272360260200241f0006a200241e0006a410410640b200820096a2108200241f0006a200a20051064200241106a412020022802702205200228027841002802fcad4211030002402002280274450d00200510300b200241286a220d4200370300200241206a220a4200370300200241106a41086a2205420037030020024200370310200241f0006a41e2a4c000410f10ab012005200241f0006a41086a220329000037030020022002290070370310200241f0006a41ecdac000411410ab01200441086a220b200329000037000020042002290070370000200241013a0060200241106a4120200241e0006a410141002802fcad42110300200d4200370300200a42003703002005420037030020024200370310200241f0006a41e2a4c000410f10ab012005200329000037030020022002290070370310200241f0006a41a0d9c000411c10ab01200b20032900003700002004200229007037000020022008360270200241106a4120200241f0006a410441002802fcad42110300200241e0006a41086a200141086a28020036020020022001290200370360200d4200370300200a42003703002005420037030020024200370310200241f0006a41e2a4c000410f10ab012005200329000037030020022002290070370310200241f0006a41ecd9c000411510ab01200b200329000037000020042002290070370000200241106a4120200241e0006a10980202402002280264450d00200228026010300b2002200836027c200241003a007820024201370370200241f0006a10e601200041083a00002006450d07200710300c070b20004183023b0100200041086a4114360200200041046a4190b2c000360200200041026a41013a00000c040b20004183023b0100200041086a411a360200200041046a41c4b2c000360200200041026a41033a00000c040b20004183023b0100200041086a411d360200200041046a41e8b2c000360200200041026a41043a00000c020b102c000b102a000b2006450d00200710300b200141046a280200450d00200128020010300b200241d0086a24000bb81904057f017e057f017e230041d0026b22022400024002400240200128020422030d00200041023602000c010b200128020022042d0000210520012003417f6a22063602042001200441016a360200024002400240024002400240024002400240024002400240024002400240024020050e0400010302030b2006450d0e20042d0001210520012003417e6a22063602042001200441026a36020002400240024002400240024002400240024002400240024020050e0a000102030405060708091a0b20064104490d192004280002210520012003417a6a3602042001200441066a3602002005418194ebdc034f0d19410121010c0a0b20022001109b0120022802000d182001280204220320022802042204490d182004417f4c0d1a0240024020040d00410121050c010b2004102f2205450d172005410020041087051a200128020421030b20032004490d172005200128020020041085051a200128020422032004490d0d2004ad220742208620078421072001200320046b3602042001200128020020046a360200410221010c080b20064108490d17200429000221072001200341766a36020420012004410a6a360200410321010c080b200241086a2001109b0120022802080d1620012802042203200228020c2204490d162004417f4c0d180240024020040d00410121050c010b2004102f2205450d152005410020041087051a200128020421030b20032004490d152005200128020020041085051a200128020422032004490d0f2004ad220742208620078421072001200320046b3602042001200128020020046a360200410421010c060b200241106a2001109b0120022802100d152001280204220320022802142204490d152004417f4c0d170240024020040d00410121050c010b2004102f2205450d142005410020041087051a200128020421030b20032004490d142005200128020020041085051a200128020422032004490d0f2004ad220742208620078421072001200320046b3602042001200128020020046a360200410521010c050b200241a0016a200110ea0120022802a00122054102460d1420022902a4012107410621010c040b200241286a2001109b0120022802280d13200228022c2208200128020441186e2204200420084b1bad42187e2207422088a70d152007a72204417f4c0d150240024020040d00410421050c010b2004102f2205450d120b200441186ead2107024002402008450d0002400340200241206a2001109b0102400240024020022802200d002001280204220320022802242204490d002004417f4c0d1c0240024020040d00410121060c010b2004102f2206450d192006410020041087051a200128020421030b024020032004490d002006200128020020041085052109200128020422032004490d112001200320046b3602042001200128020020046a360200200241186a2001109b01024020022802180d002001280204220a200228021c2203490d002003417f4c0d1e0240024020030d004101210b0c010b2003102f220b450d1b200b410020031087051a2001280204210a0b0240200a2003490d00200b20012802002003108505210a200128020422062003490d142001200620036b3602042001200128020020036a3602002007422088a722062007a7470d05200641016a220b20064f0d040c1f0b200b10300b2004450d010b200610300b02402007422088a72201450d00200141186c21042005210103400240200141046a280200450d00200128020010300b0240200141106a280200450d002001410c6a28020010300b200141186a2101200441686a22040d000b0b2007a72201450d19200141186c450d190c180b2006410174220c200b200b200c491b220b4104200b41044b1bad42187e220d422088a745410274210b200da7210c0240024020060d00200241003602a0010c010b200241043602a801200220053602a0012002200641186c3602a4010b200241d0006a200c200b200241a0016a10692002280258210b20022802504101460d0220022802542105200742808080807083200b41186ead8421070b2005200641186c6a2206200436020420062009360200200641106a2003ad220d422086200d843702002006410c6a200a360200200641086a200436020020074280808080107c21072008417f6a22080d000c030b0b200b450d170c130b2005450d140b410721010c030b200241a0016a200110eb0120022802a0012205450d1220022902a4012107410821010c020b200241306a2001109b0120022802300d112001280204220320022802342204490d112004417f4c0d130240024020040d00410121050c010b2004102f2205450d102005410020041087051a200128020421030b20032004490d102005200128020020041085051a200128020422032004490d0c2001200320046b22033602042001200128020020046a2206360200024020034104490d002004ad220742208620078421072006280000210420012003417c6a3602042001200641046a360200410921010c030b20040d100c110b200241386a2001109b0120022802380d1020012802042203200228023c2204490d102004417f4c0d120240024020040d00410121050c010b2004102f2205450d0f2005410020041087051a200128020421030b20032004490d0f2005200128020020041085051a200128020422032004490d0c2004ad220742208620078421072001200320046b3602042001200128020020046a360200410a21010b0b20004100360200200041186a2004360200200041106a20073702002000410c6a2005360200200041086a20013602000c0f0b02402006450d0020042d0001210520012003417e6a220a3602042001200441026a360200024002400240024002400240024020050e050001020304070b200a4104490d062004280002210520012003417a6a3602042001200441066a360200410121010c040b200241a0016a200110ec0120022802a0012205450d0520022902a4012107200241d0006a200241ac016a41cc001085051a410221010c030b200241c0006a2001109b0120022802400d042001280204220320022802442204490d042004417f4c0d140240024020040d00410121050c010b2004102f2205450d112005410020041087051a200128020421030b20032004490d032005200128020020041085051a200128020422032004490d0a2004ad220742208620078421072001200320046b3602042001200128020020046a360200410321010c020b2003417d6a2105200241a0016a410472210b410021030340200a2003460d04200420036a220641026a2d00002108200120053602042001200641036a360200200b20036a20083a00002002200341016a22063602a0012005417f6a21052006210320064120470d000b20024190026a41106a200241bc016a2d00003a000020024190026a41086a200241b4016a2902003703002002200241ac016a22012902003703900220022902a401210d200241cb026a200241a0016a410f6a280000360000200241a8026a41086a220420024190026a410f6a2f00003b01002002200d3703c002200220012802003602c80220022002290097023703a802200241b5026a200241c0016a2800003600002002200241bd016a2800003601b2022002419e016a20022d00c2023a00002002200d3d019c0120022900c7022107200241f8016a41086a22012004290300370300200241f8016a41106a2204200241a8026a41106a2d00003a0000200220022903a8023703f801200241d0006a41106a20042d00003a0000200241d0006a41086a2001290300370300200220022903f801370350200d421888a72105410421010c010b200241c8006a2001109b0120022802480d0220012802042203200228024c2204490d022004417f4c0d120240024020040d00410121050c010b2004102f2205450d0f2005410020041087051a200128020421030b20032004490d012005200128020020041085051a200128020422032004490d0d2004ad220742208620078421072001200320046b3602042001200128020020046a360200410521010b200020013a0004200020022f019c013b00052000410c6a2007370200200041086a2005360200200041076a2002419e016a2d00003a0000200041146a200241d0006a41cc001085051a200041013602000c100b200510300b200041023602000c0e0b02402006450d0020012003417e6a3602042001200441026a3602000b200041023602000c0d0b200041023602000c0c0b2004200341f0f5c100104a000b2004200341f0f5c100104a000b2003200641f0f5c100104a000b2004200341f0f5c100104a000b2004200341f0f5c100104a000b2004200341f0f5c100104a000b2004200341f0f5c100104a000b2004200341f0f5c100104a000b2004200341f0f5c100104a000b102a000b200510300b200041023602000b200241d0026a24000f0b102c000bc70101047f024002400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a36020020040e020203010b200041023602000f0b200041023602000f0b200041003602000f0b0240024020054104490d002003280001210520012002417b6a22043602042001200341056a360200200441034b0d010b200041023602000f0b2000200536020420004101360200200328000521042001200241776a3602042001200341096a360200200041086a20043602000b8b0503037f017e077f230041306b22022400200241086a2001109b01024002402002280208450d00200041003602000c010b02400240200228020c22032001280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d00024002400240024020040d00410421060c010b2004102f2206450d010b2004410c6e2107024020030d00410021030c040b41002108410021094100210a0240034020022001109b0120022802000d012001280204220b20022802042204490d012004417f4c0d040240024020040d004101210c0c010b2004102f220c450d03200c410020041087051a2001280204210b0b0240200b2004490d00200c20012802002004108505210c2001280204220b2004490d042001200b20046b3602042001200128020020046a3602000240200a2007470d002008200a41016a220b2008200b4b1b220b4104200b41044b1bad420c7e2205422088a745410274210b2005a7210702400240200a0d00200241003602200c010b2002410436022820022009360224200220063602200b200241106a2007200b200241206a10692002280218210b024020022802104101470d00200b0d050c070b20022802142106200b410c6e21070b200620096a220b200c360200200b41046a2004ad2205422086200584370200200841026a21082009410c6a21092003200a41016a220a460d060c010b0b200c10300b200041003602000240200a450d002006210403400240200441046a280200450d00200428020010300b2004410c6a2104200941746a22090d000b0b2007450d042007410c6c450d04200610300c040b102a000b2004200b41f0f5c100104a000b102c000b2000200736020420002006360200200041086a20033602000b200241306a24000bda1105107f017e037f017e017f230041d0016b22022400200241e8006a200110f50102400240024002400240024020022802682203450d00200241386a41086a200241e8006a41106a290300370300200241386a41106a200241e8006a41186a290300370300200241386a41186a200241e8006a41206a290300370300200241386a41206a200241e8006a41286a290300370300200241386a41286a20024198016a2802003602002002200241e8006a41086a2204290300370338200228026c2105200241e8006a200110eb01200228026822060d01200041003602000c020b200041003602000c020b20042802002107200228026c2108200241206a2001109b0102400240024002400240024020022802200d00410421092002280224220a200128020441047622042004200a4b1b220b4104742204417f4c0d090240200b450d002004102f2209450d090b02400240200a450d004100210c4100210d4100210e02400340200128020422044104490d012001280200220f280000211020012004417c6a3602042001200f41046a360200200241186a2001109b0120022802180d012001280204220f200228021c2204490d012004417f4c0d0d0240024020040d00410121110c010b2004102f2211450d0d2011410020041087051a2001280204210f0b0240200f2004490d0020112001280200200410850521112001280204220f2004490d062001200f20046b3602042001200128020020046a3602000240200e200b470d00200c200e41016a220f200c200f4b1b220f4104200f41044b1b220f41ffffffff0071200f46410274210b200f410474210f02400240200e0d00200241003602680c010b200241043602702002200d36026c200220093602680b200241c0016a200f200b200241e8006a106920022802c801210f024020022802c0014101470d00200f0d0f0c100b20022802c4012109200f410476210b0b2009200d6a220f2010360200200f41086a2004ad2212422086201284370200200f41046a2011360200200c41026a210c200d41106a210d200a200e41016a220e470d010c040b0b201110300b0240200e450d00200941086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200d41706a220d0d000b0b200b41ffffffff0071450d02200910300c020b2009450d014100210a0b200241106a2001109b0120022802100d0420022802142113200242003702b40102402013450d00410021140340200128020422044104490d052001280200220d280000211520012004417c6a3602042001200d41046a360200200241086a2001109b0120022802080d05200228020c220e200128020441047622042004200e4b1b2204410474220d417f4c0d0b0240024020040d004104210f0c010b200d102f220f450d0b0b2004ad211202400240200e450d00024002400340200128020422044104490d022001280200220d280000211120012004417c6a3602042001200d41046a36020020022001109b0120022802000d022001280204220d20022802042204490d022004417f4c0d100240024020040d004101210c0c010b2004102f220c450d10200c410020041087051a2001280204210d0b200d2004490d01200c20012802002004108505210c2001280204220d2004490d092001200d20046b3602042001200128020020046a3602000240024020124220882216a7220d2012a7470d00200d41016a2210200d490d12200d4101742217201020102017491b22104104201041044b1b221041ffffffff007120104641027421172010410474211002400240200d0d00200241003602680c010b200241043602702002200f360268200220164204863e026c0b200241c0016a20102017200241e8006a106920022802c801211020022802c0014101460d0120022802c401210f2012428080808070832010410476ad8421120b200f200d4104746a220d200c360204200d2011360200200d41086a2004ad221642208620168437020020124280808080107c2112200e417f6a220e0d010c050b0b2010450d0f0c0e0b200c10300b02402012422088a72201450d0020014104742104200f41086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200441706a22040d000b0b201242ffffffff0083500d07200f10300c070b200f450d060b201441016a21142002201237026c2002200f360268200241c0016a200241b0016a2015200241e8006a10af02024020022802c001220e450d00024020022802c8012204450d002004410474210d200e41086a2104034002402004280200450d002004417c6a28020010300b200441106a2104200d41706a220d0d000b0b20022802c40141ffffffff0071450d00200e10300b20142013470d000b0b200241286a41086a2201200241b0016a41086a280200360200200220022903b001370328200041306a200241386a41286a280200360200200041286a200241386a41206a290300370200200041206a200241386a41186a290300370200200041186a200241386a41106a290300370200200041106a200241386a41086a290300370200200041086a2002290338370200200041c8006a200a360200200041c4006a200b360200200041c0006a20093602002000413c6a2007360200200041386a2008360200200041346a20063602002000200536020420002003360200200041cc006a2002290328370200200041d4006a20012802003602000c070b200041003602000c040b2004200f41f0f5c100104a000b2004200d41f0f5c100104a000b200241e8006a41086a200241b0016a41086a280200360200200220022903b001370368200241e8006a10e3010b41002101200041003602000240200a450d00200a410474210d03400240200920016a220441086a280200450d00200441046a28020010300b200d200141106a2201470d000b0b200b41ffffffff0071450d00200910300b02402007450d002007410c6c21042006210103400240200141046a280200450d00200128020010300b2001410c6a2101200441746a22040d000b0b2008450d002008410c6c450d00200610300b2005450d00200310300b200241d0016a24000f0b102a000b102c000bfb0201037f230041206b22022400200241003602082002420137030002404120102f2203450d002002422037021420022003360210200241106a200141106a412010642002200228021022032002280218106402402002280214450d00200310300b2001200210ee014120102f2203450d002002422037021420022003360210200241106a200141306a412010642002200228021022032002280218106402402002280214450d00200310300b4120102f2203450d002002422037021420022003360210200241106a200141d0006a412010642002200228021022032002280218106402402002280214450d00200310300b2001280204210320022001410c6a280200220110a5010240200141246c2201450d000340200241106a200310e7012002200228021022042002280218106402402002280214450d00200410300b200341246a21032001415c6a22010d000b0b2000200228020022032002280208106502402002280204450d00200310300b200241206a24000f0b102a000bb30101027f230041106b2202240002400240024002402000280200220341c000490d00200341808001490d012003418080808004490d02200241033a00032001200241036a41011064200220002802003602042001200241046a410410640c030b200220034102743a00032001200241036a410110640c020b200220034102744101723b010a20012002410a6a410210640c010b2002200341027441027236020c20012002410c6a410410640b200241106a24000b930201017f230041106b22022400200220002903003703082001200241086a410810640240024020002903084201510d00200241003a00082001200241086a410110640c010b200241013a00082001200241086a410110642002200041106a2903003703082001200241086a410810640b0240024020002903184201510d00200241003a00082001200241086a410110640c010b200241013a00082001200241086a410110642002200041206a2903003703082001200241086a410810640b0240024020002903284201510d00200241003a00082001200241086a410110640c010b200241013a00082001200241086a410110642002200041306a2903003703082001200241086a410810640b200241106a24000bce33050d7f017e067f017e047f23004190076b22022400200241146a10af01360200200241013a001020024201370308024002400240024002400240024002400240024020012802000e09010203040506070800010b200241d0036a200141086a10f10120024188046a200141c0006a10f101200241c0046a200141f8006a10f101200241f8046a200141b0016a10f101200241b0056a200141e8016a10f101200241e8056a200141a0026a10f101200241a0066a200141d8026a10f101200241d8066a20014190036a10f101200041386a200241d0036a41306a290300370300200041306a200241d0036a41286a290300370300200041286a200241d0036a41206a290300370300200041206a200241d0036a41186a290300370300200041186a200241d0036a41106a290300370300200041106a200241d0036a41086a290300370300200020022903d003370308200041c0006a200229038804370300200041c8006a20024188046a41086a290300370300200041d0006a20024188046a41106a290300370300200041d8006a20024188046a41186a290300370300200041e0006a20024188046a41206a290300370300200041e8006a20024188046a41286a290300370300200041f0006a20024188046a41306a290300370300200041a8016a200241c0046a41306a290300370300200041a0016a200241c0046a41286a29030037030020004198016a200241c0046a41206a29030037030020004190016a200241c0046a41186a29030037030020004188016a200241c0046a41106a29030037030020004180016a200241c0046a41086a290300370300200041f8006a20022903c004370300200041e0016a200241f8046a41306a290300370300200041d8016a200241f8046a41286a290300370300200041d0016a200241f8046a41206a290300370300200041c8016a200241f8046a41186a290300370300200041c0016a200241f8046a41106a290300370300200041b8016a200241f8046a41086a290300370300200041b0016a20022903f80437030020004198026a200241b0056a41306a29030037030020004190026a200241b0056a41286a29030037030020004188026a200241b0056a41206a29030037030020004180026a200241b0056a41186a290300370300200041f8016a200241b0056a41106a290300370300200041f0016a200241b0056a41086a290300370300200041e8016a20022903b005370300200041d0026a200241e8056a41306a290300370300200041c8026a200241e8056a41286a290300370300200041c0026a200241e8056a41206a290300370300200041b8026a200241e8056a41186a290300370300200041b0026a200241e8056a41106a290300370300200041a8026a200241e8056a41086a290300370300200041a0026a20022903e80537030020004188036a200241a0066a41306a29030037030020004180036a200241a0066a41286a290300370300200041f8026a200241a0066a41206a290300370300200041f0026a200241a0066a41186a290300370300200041e8026a200241a0066a41106a290300370300200041e0026a200241a0066a41086a290300370300200041d8026a20022903a006370300200041c0036a200241d8066a41306a290300370300200041b8036a200241d8066a41286a290300370300200041b0036a200241d8066a41206a290300370300200041a8036a200241d8066a41186a290300370300200041a0036a200241d8066a41106a29030037030020004198036a200241d8066a41086a29030037030020004190036a20022903d806370300200042083703000c080b200042003703000c070b200241d8066a200141086a10f10120004201370300200041386a200241d8066a41306a290300370300200041306a200241d8066a41286a290300370300200041286a200241d8066a41206a290300370300200041206a200241d8066a41186a290300370300200041186a200241d8066a41106a290300370300200041106a200241d8066a41086a290300370300200020022903d8063703080c060b200241a0066a200141086a10f101200241d8066a200141c0006a10f101200041386a200241a0066a41306a290300370300200041306a200241a0066a41286a290300370300200041286a200241a0066a41206a290300370300200041206a200241a0066a41186a290300370300200041186a200241a0066a41106a290300370300200041106a200241a0066a41086a290300370300200020022903a006370308200041c0006a20022903d806370300200041c8006a200241d8066a41086a290300370300200041d0006a200241d8066a41106a290300370300200041d8006a200241d8066a41186a290300370300200041e0006a200241d8066a41206a290300370300200041e8006a200241d8066a41286a290300370300200041f0006a200241d8066a41306a290300370300200042023703000c050b200241e8056a200141086a10f101200241a0066a200141c0006a10f101200241d8066a200141f8006a10f101200041386a200241e8056a41306a290300370300200041306a200241e8056a41286a290300370300200041286a200241e8056a41206a290300370300200041206a200241e8056a41186a290300370300200041186a200241e8056a41106a290300370300200041106a200241e8056a41086a290300370300200020022903e805370308200041c0006a20022903a006370300200041c8006a200241a0066a41086a290300370300200041d0006a200241a0066a41106a290300370300200041d8006a200241a0066a41186a290300370300200041e0006a200241a0066a41206a290300370300200041e8006a200241a0066a41286a290300370300200041f0006a200241a0066a41306a29030037030020004203370300200041a8016a200241d8066a41306a290300370300200041a0016a200241d8066a41286a29030037030020004198016a200241d8066a41206a29030037030020004190016a200241d8066a41186a29030037030020004188016a200241d8066a41106a29030037030020004180016a200241d8066a41086a290300370300200041f8006a20022903d8063703000c040b200241b0056a200141086a10f101200241e8056a200141c0006a10f101200241a0066a200141f8006a10f101200241d8066a200141b0016a10f101200041386a200241b0056a41306a290300370300200041306a200241b0056a41286a290300370300200041286a200241b0056a41206a290300370300200041206a200241b0056a41186a290300370300200041186a200241b0056a41106a290300370300200041106a200241b0056a41086a290300370300200020022903b005370308200041c0006a20022903e805370300200041c8006a200241e8056a41086a290300370300200041d0006a200241e8056a41106a290300370300200041d8006a200241e8056a41186a290300370300200041e0006a200241e8056a41206a290300370300200041e8006a200241e8056a41286a290300370300200041f0006a200241e8056a41306a290300370300200041a8016a200241a0066a41306a290300370300200041a0016a200241a0066a41286a29030037030020004198016a200241a0066a41206a29030037030020004190016a200241a0066a41186a29030037030020004188016a200241a0066a41106a29030037030020004180016a200241a0066a41086a290300370300200041f8006a20022903a006370300200041e0016a200241d8066a41306a290300370300200041d8016a200241d8066a41286a290300370300200041d0016a200241d8066a41206a290300370300200041c8016a200241d8066a41186a290300370300200041c0016a200241d8066a41106a290300370300200041b8016a200241d8066a41086a290300370300200041b0016a20022903d806370300200042043703000c030b200241f8046a200141086a10f101200241b0056a200141c0006a10f101200241e8056a200141f8006a10f101200241a0066a200141b0016a10f101200241d8066a200141e8016a10f101200041386a200241f8046a41306a290300370300200041306a200241f8046a41286a290300370300200041286a200241f8046a41206a290300370300200041206a200241f8046a41186a290300370300200041186a200241f8046a41106a290300370300200041106a200241f8046a41086a290300370300200020022903f804370308200041c0006a20022903b005370300200041c8006a200241b0056a41086a290300370300200041d0006a200241b0056a41106a290300370300200041d8006a200241b0056a41186a290300370300200041e0006a200241b0056a41206a290300370300200041e8006a200241b0056a41286a290300370300200041f0006a200241b0056a41306a290300370300200041a8016a200241e8056a41306a290300370300200041a0016a200241e8056a41286a29030037030020004198016a200241e8056a41206a29030037030020004190016a200241e8056a41186a29030037030020004188016a200241e8056a41106a29030037030020004180016a200241e8056a41086a290300370300200041f8006a20022903e805370300200041e0016a200241a0066a41306a290300370300200041d8016a200241a0066a41286a290300370300200041d0016a200241a0066a41206a290300370300200041c8016a200241a0066a41186a290300370300200041c0016a200241a0066a41106a290300370300200041b8016a200241a0066a41086a290300370300200041b0016a20022903a00637030020004198026a200241d8066a41306a29030037030020004190026a200241d8066a41286a29030037030020004188026a200241d8066a41206a29030037030020004180026a200241d8066a41186a290300370300200041f8016a200241d8066a41106a290300370300200041f0016a200241d8066a41086a290300370300200041e8016a20022903d806370300200042053703000c020b200241c0046a200141086a10f101200241f8046a200141c0006a10f101200241b0056a200141f8006a10f101200241e8056a200141b0016a10f101200241a0066a200141e8016a10f101200241d8066a200141a0026a10f101200041386a200241c0046a41306a290300370300200041306a200241c0046a41286a290300370300200041286a200241c0046a41206a290300370300200041206a200241c0046a41186a290300370300200041186a200241c0046a41106a290300370300200041106a200241c0046a41086a290300370300200020022903c004370308200041c0006a20022903f804370300200041c8006a200241f8046a41086a290300370300200041d0006a200241f8046a41106a290300370300200041d8006a200241f8046a41186a290300370300200041e0006a200241f8046a41206a290300370300200041e8006a200241f8046a41286a290300370300200041f0006a200241f8046a41306a290300370300200041a8016a200241b0056a41306a290300370300200041a0016a200241b0056a41286a29030037030020004198016a200241b0056a41206a29030037030020004190016a200241b0056a41186a29030037030020004188016a200241b0056a41106a29030037030020004180016a200241b0056a41086a290300370300200041f8006a20022903b005370300200041e0016a200241e8056a41306a290300370300200041d8016a200241e8056a41286a290300370300200041d0016a200241e8056a41206a290300370300200041c8016a200241e8056a41186a290300370300200041c0016a200241e8056a41106a290300370300200041b8016a200241e8056a41086a290300370300200041b0016a20022903e80537030020004198026a200241a0066a41306a29030037030020004190026a200241a0066a41286a29030037030020004188026a200241a0066a41206a29030037030020004180026a200241a0066a41186a290300370300200041f8016a200241a0066a41106a290300370300200041f0016a200241a0066a41086a290300370300200041e8016a20022903a006370300200041d0026a200241d8066a41306a290300370300200041c8026a200241d8066a41286a290300370300200041c0026a200241d8066a41206a290300370300200041b8026a200241d8066a41186a290300370300200041b0026a200241d8066a41106a290300370300200041a8026a200241d8066a41086a290300370300200041a0026a20022903d806370300200042063703000c010b20024188046a200141086a10f101200241c0046a200141c0006a10f101200241f8046a200141f8006a10f101200241b0056a200141b0016a10f101200241e8056a200141e8016a10f101200241a0066a200141a0026a10f101200241d8066a200141d8026a10f101200041386a20024188046a41306a290300370300200041306a20024188046a41286a290300370300200041286a20024188046a41206a290300370300200041206a20024188046a41186a290300370300200041186a20024188046a41106a290300370300200041106a20024188046a41086a2903003703002000200229038804370308200041c0006a20022903c004370300200041c8006a200241c0046a41086a290300370300200041d0006a200241c0046a41106a290300370300200041d8006a200241c0046a41186a290300370300200041e0006a200241c0046a41206a290300370300200041e8006a200241c0046a41286a290300370300200041f0006a200241c0046a41306a290300370300200041a8016a200241f8046a41306a290300370300200041a0016a200241f8046a41286a29030037030020004198016a200241f8046a41206a29030037030020004190016a200241f8046a41186a29030037030020004188016a200241f8046a41106a29030037030020004180016a200241f8046a41086a290300370300200041f8006a20022903f804370300200041e0016a200241b0056a41306a290300370300200041d8016a200241b0056a41286a290300370300200041d0016a200241b0056a41206a290300370300200041c8016a200241b0056a41186a290300370300200041c0016a200241b0056a41106a290300370300200041b8016a200241b0056a41086a290300370300200041b0016a20022903b00537030020004198026a200241e8056a41306a29030037030020004190026a200241e8056a41286a29030037030020004188026a200241e8056a41206a29030037030020004180026a200241e8056a41186a290300370300200041f8016a200241e8056a41106a290300370300200041f0016a200241e8056a41086a290300370300200041e8016a20022903e805370300200041d0026a200241a0066a41306a290300370300200041c8026a200241a0066a41286a290300370300200041c0026a200241a0066a41206a290300370300200041b8026a200241a0066a41186a290300370300200041b0026a200241a0066a41106a290300370300200041a8026a200241a0066a41086a290300370300200041a0026a20022903a00637030020004188036a200241d8066a41306a29030037030020004180036a200241d8066a41286a290300370300200041f8026a200241d8066a41206a290300370300200041f0026a200241d8066a41186a290300370300200041e8026a200241d8066a41106a290300370300200041e0026a200241d8066a41086a290300370300200041d8026a20022903d806370300200042073703000b4108210302400240024002400240024002400240024020012802000e09000102030405060708000b410021030c070b410121030c060b410221030c050b410321030c040b410421030c030b410521030c020b410621030c010b410721030b024002402003417f6a220420034b0d002001200410f2012203450d00200041086a2105200041c0006a2106200041f8006a2107200041b0016a2108200041e8016a2109200041a0026a210a200041d8026a210b20004190036a210c200241d8066a410172210d4100210e034041002104024020032d00000d00200241d8066a200241086a10f3014108210420022d00d8062203410a460d00200241a0066a41026a200d41026a2d00003a00002002200d2f00003b01a006200229038807210f2002280284072110200228028007211120022802fc06211220022802f806211320022802f406211420022802f006211520022903e806211620022802e406211720022802e006211820022802dc062119200321040b200241e8056a41026a221a200241a0066a41026a2d00003a0000200220022f01a0063b01e805024002400240024002400240024002400240200e0e0807000102030405060b0b200621032000280200417e6a41074f0d0a0c070b200721032000280200417d6a41064f0d090c060b200821032000280200417c6a41054f0d080c050b200921032000280200417b6a41044f0d070c040b200a21032000280200417a6a41034f0d060c030b200b2103200028020041796a41024f0d050c020b200c210320002903004208510d010c040b200521032000280200417f6a41084f0d030b200310f401200320043a0000200341306a200f3700002003412c6a2010360000200341286a2011360000200341246a2012360000200341206a20133600002003411c6a2014360000200341186a2015360000200341106a20163700002003410c6a201736000041082104200341086a2018360000200341046a2019360000200320022f01e8053b0001200341036a201a2d00003a000002400240024002400240024002400240024020012802000e09000102030405060708000b410021040c070b410121040c060b410221040c050b410321040c040b410421040c030b410521040c020b410621040c010b410721040b2004200e41026a22036b221a20044b0d012003417f6a210e2001201a10f20122030d000b0b200241086a109c0120024190076a24000f0b4188a9c000412f41b8a9c0001050000bf10801067f02400240024002400240024002400240024002400240024020012d00000e0a01020304050607080900010b4104210241062103024002400240024002400240024002400240200141046a2802000e0700010203040508000b410021030c050b200141106a2802002204417f4c0d10200141086a2802002105410121034101210602402004450d002004102f2206450d120b2006200520041085051a0c060b200141086a2802002106410221030c040b410321030c020b410421030c010b410521030b0b0b2001411c6a2802002105200141186a28020021070240024002400240024020012802140e050001020304000b410021020c030b410121020c020b410221020c010b410321020b200041093a00002000411c6a2005360200200041186a2007360200200041146a2002360200200041106a20043602002000410c6a2004360200200041086a2006360200200041046a20033602000f0b200041003a00000f0b200041013a0000200041046a200141046a2802003602000f0b4103210302400240024002400240200141246a2802000e0400010204000b410021030c020b200141306a2802002204417f4c0d09200141286a2802002102410121034101210602402004450d002004102f2206450d0b0b2006200220041085051a0c020b410221030b0b200041023a000020002001290001370001200041306a20043602002000412c6a2004360200200041286a2006360200200041246a2003360200200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b4103210302400240024002400240200141046a2802000e0400010204000b410021030c020b200141106a2802002204417f4c0d08200141086a2802002102410121034101210602402004450d002004102f2206450d0a0b2006200220041085051a0c020b410221030b0b200041033a0000200041186a2001290318370300200041106a20043602002000410c6a2004360200200041086a2006360200200041046a20033602000f0b4103210302400240024002400240200141186a2802000e0400010204000b410021030c020b200141246a2802002204417f4c0d072001411c6a2802002102410121034101210602402004450d002004102f2206450d090b2006200220041085051a0c020b410221030b0b200041043a000020002001290001370001200041246a2004360200200041206a20043602002000411c6a2006360200200041186a2003360200200041116a200141116a280000360000200041096a200141096a2900003700000f0b200041053a0000200020012d00013a00010f0b200041063a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b2001410c6a2802002204417f4c0d01200141046a28020021010240024020040d00410121060c010b2004102f2206450d030b20062001200410850521012000410c6a2004360200200041086a2004360200200041046a2001360200200041073a00000f0b200041083a00000f0b102c000b102a000b8a0401017f410021020240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e08000102030405062a2b0b2000280200417f6a0e08060708090a0b0c0d2a0b2000280200417e6a0e070d0e0f10111213290b2000280200417d6a0e06131415161718280b2000280200417c6a0e0518191a1b1c270b2000280200417b6a0e041c1d1e1f260b2000280200417a6a0e031f2021250b200028020041796a0e022122240b200041086a0f0b200041086a0f0b200041086a0f0b200041086a0f0b200041086a0f0b200041086a0f0b200041086a0f0b200041086a0f0b200041c0006a0f0b200041c0006a0f0b200041c0006a0f0b200041c0006a0f0b200041c0006a0f0b200041c0006a0f0b200041c0006a0f0b200041f8006a0f0b200041f8006a0f0b200041f8006a0f0b200041f8006a0f0b200041f8006a0f0b200041f8006a0f0b200041b0016a0f0b200041b0016a0f0b200041b0016a0f0b200041b0016a0f0b200041b0016a0f0b200041e8016a0f0b200041e8016a0f0b200041e8016a0f0b200041e8016a0f0b200041a0026a0f0b200041a0026a0f0b200041a0026a0f0b200041d8026a0f0b200041d8026a0f0b20002903004208520d0020004190036a21020b20020bf20d5b027f027e017f017e017f017e017f017e017f017e017f017e017f017e017f027e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f027e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f037e017f017e017f087e037f230022022103200241c0006b41607122022400200129030021044200210520014200370300200141386a22062903002107200141306a22082903002109200141286a220a290300210b200141206a220c290300210d200141d8006a220e290300210f200141d0006a22102903002111200141c8006a22122903002113200141c0006a2903002114200141f8006a22152903002116200141f0006a22172903002118200141e8006a2219290300211a200141e0006a221b290300211c20014198016a221d290300211e20014190016a221f290300212020014188016a2221290300212220014180016a22232903002124200141b8016a22252903002126200141b0016a22272903002128200141a8016a2229290300212a200141a0016a222b290300212c200141d8016a222d290300212e200141d0016a222f2903002130200141c8016a22312903002132200141c0016a22332903002134200141f8016a22352903002136200141f0016a22372903002138200141e8016a2239290300213a200141e0016a223b290300213c20014198026a223d290300213e20014190026a223f290300214020014188026a2241290300214220014180026a22432903002144200141b8026a22452903002146200141b0026a22472903002148200141a8026a2249290300214a200141a0026a290300214b200141d8026a224c290300214d200141d0026a224e290300214f200141c8026a22502903002151200141c0026a22522903002153200141f8026a22542903002155200141f0026a22562903002157200141e8026a22582903002159200141e0026a225a290300215b20014198036a290300215c20014190036a290300215d20014188036a225e290300215f20014180036a22602903002161200141b8036a2903002162200141b0036a2903002163200141a8036a2903002164200141a0036a2903002165200141c0036a290300216620012903082167200129031021682002200141186a22692903003703382002206837033020022067370328200220043703202067a7216a410a216b02400240024002400240024002400240024002402004a70e09090102030405060700090b200241176a2002290038370000200241106a200229003137030020022002290029370308420721050c070b200241176a2002290038370000200241106a2002290031370300200220022900293703080c060b200241176a2002290038370000200241106a200229003137030020022002290029370308420121050c050b200241176a2002290038370000200241106a200229003137030020022002290029370308420221050c040b200241176a2002290038370000200241106a200229003137030020022002290029370308420321050c030b200241176a2002290038370000200241106a200229003137030020022002290029370308420421050c020b200241176a2002290038370000200241106a200229003137030020022002290029370308420521050c010b200241176a2002290038370000200241106a200229003137030020022002290029370308420621050b206a216b0b2000206b3a000020002002290308370001200041206a200b370000200041186a200d370000200041286a2009370000200041096a200241106a290300370000200041106a200241176a290000370000200041306a20073700002001109c0120602062370300205420633703002056206437030020582065370300205a205c370300204c205d370300204e205f370300205020613703002052205537030020452057370300204720593703002049205b370300203d204f370300203f20513703002041205337030020432046370300203520483703002037204a3703002039204b370300203b203e370300202d2040370300202f20423703002031204437030020332036370300202520383703002027203a370300202b202e370300201d2030370300201f20323703002021203437030020232026370300201520283703002017202a3703002019202c370300201b201e370300200e20203703002010202237030020122024370300200620183703002008201a370300200a201c370300200c200f37030020692011370300200141106a201337030020012014370308205e20663703002001204d3703a0022029203c3703002001201637034020012005370300200324000bc8010002400240024002400240024020002d00000e09050500010205050305040b200041246a2802004101470d042000412c6a280200450d04200041286a28020010300f0b200041046a2802004101470d032000410c6a280200450d03200041086a28020010300f0b200041186a2802004101470d02200041206a280200450d022000411c6a28020010300f0b200041086a280200450d01200041046a28020010300c010b200041046a2802004101470d002000410c6a280200450d00200041086a28020010300f0b0ba406010f7f230041c0006b2202240020022001109b0102400240024002400240024002400240024020022802000d002001280204220320022802042204490d002004417f4c0d060240024020040d00410121050c010b2004102f2205450d082005410020041087051a200128020421030b024020032004490d002005200128020020041085052106200128020422032004490d092001200320046b22073602042001200128020020046a220836020020074104490d032008280000210920012007417c6a220a3602042001200841046a360200200241186a410472210b41002103417b21050340200a2003460d03200820036a220c41046a2d0000210d2001200720056a3602042001200c41056a360200200b20036a200d3a00002002200341016a220c3602182005417f6a2105200c2103200c4120470d000b200241106a41026a2203200241256a2d00003a00002002410c6a41026a2205200241186a41146a2d00003a0000200220022f011c3b0114200220022d001e3a00162002200241236a2f00003b011020022002412a6a2f01003b010c200241386a280200210d200241346a280200210a2002412d6a280000210b200241266a280100210e200228001f210f200241086a41026a2210200241336a2d00003a00002002200241316a2f00003b01082007200c6b2207417c6a4104490d04200020022f01103b001b2000200e36001e200020022f010c3b00222000200b360025200041146a20022f01143b0100200041166a20022d00163a0000200041176a200f3600002008200c6a220c41046a28000021082001200741786a3602042000411d6a20032d00003a0000200041246a20052d00003a00002001200c41086a360200200041306a200d3600002000412c6a200a3600002000412b6a20102d00003a0000200020022f01083b0029200041106a20083602002000410c6a2009360200200041086a200436020020002004360204200020063602000c060b200510300b200041003602000c040b200041003602000c020b200041003602000c010b200041003602000b2004450d00200610300b200241c0006a24000f0b102c000b102a000b2004200341f0f5c100104a000b8f0101027f230041106b2202240020002802002000280208200110a6012002200028020c360200200120024104106402404120102f2203450d0020024220370204200220033602002002200041146a412010642001200228020022032002280208106402402002280204450d00200310300b200220002802103602002001200241041064200241106a24000f0b102a000b1c0020012802184199f7c100410f2001411c6a28020028020c1100000bf80101017f230041106b22022400200028020021002002410036020c02400240024002402001418001490d002001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d410321010c030b200220013a000c410121010c020b20022001413f71418001723a000d2002200141067641c001723a000c410221010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a20011064200241106a240041000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41d0adc000200241086a10322101200241206a240020010bf50201017f23004190016b22042400024002400240024020002d00000e03000102000b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a10fb0121000c020b200441206a41186a200341186a290000370300200441206a41106a200341106a290000370300200441206a41086a200341086a29000037030020042003290000370320200041016a20012002200441206a10fc0121000c010b2004200120021065200441206a200041016a200410fd014100210020042d00200d00200441c8006a41206a200441206a41216a2d00003a0000200441e0006a200441396a290000370300200441d8006a200441316a290000370300200441d0006a200441296a29000037030020042004290021370348200441f0006a200441c8006a41211065200441f0006a200341201088054521000b20044190016a240020000b150020002002ad4220862001ad84200310014101460b150020002002ad4220862001ad84200310044101460bc30a03017f017e0f7f230041306b2203240002402001200210032204422088a72202450d002002417f6a210502400240024002402004a722012d00000e020001040b200341003602082005450d0320012d0001210520034101360208200320053a000c20024102470d010c030b2005450d02410121064100210702400240024020012d00010e03040001050b41012107410121060c010b410221070b0c010b20012d0002210520034102360208200320053a000d20024103460d0120012d0003210520034103360208200320053a000e20024104460d0120034104360208200320012d00043a000f20024105460d01200341106a20012d00053a00002003410536020820024106460d01200341116a20012d00063a00002003410636020820024107460d01200341126a20012d00073a00002003410736020820024108460d01200341136a20012d00083a00002003410836020820024109460d01200341146a20012d00093a0000200341093602082002410a460d01200341156a20012d000a3a00002003410a3602082002410b460d01200341166a20012d000b3a00002003410b3602082002410c460d01200341176a20012d000c3a00002003410c3602082002410d460d01200341186a20012d000d3a00002003410d3602082002410e460d01200341196a20012d000e3a00002003410e3602082002410f460d012003411a6a20012d000f3a00002003410f36020820024110460d012003411b6a20012d00103a00002003411036020820024111460d012003411c6a20012d00113a00002003411136020820024112460d012003411d6a20012d00123a00002003411236020820024113460d012003411e6a20012d00133a00002003411336020820024114460d012003411f6a20012d00143a00002003411436020820024115460d01200341206a20012d00153a00002003411536020820024116460d01200341216a20012d00163a00002003411636020820024117460d01200341226a20012d00173a00002003411736020820024118460d01200341236a20012d00183a00002003411836020820024119460d01200341246a20012d00193a0000200341193602082002411a460d01200341256a20012d001a3a00002003411a3602082002411b460d01200341266a20012d001b3a00002003411b3602082002411c460d01200341276a20012d001c3a00002003411c3602082002411d460d01200341286a20012d001d3a00002003411d3602082002411e460d01200341296a20012d001e3a00002003411e3602082002411f460d012003412a6a20012d001f3a00002003411f36020820024120460d012003412b6a220520012d00203a00002003412036020820024121460d012003412c6a20012d00213a0000200341086a41216a2f00002108200341286a2d00002102200341246a2802002109200341226a2f0100210a200341216a2d0000210b2003411d6a280000210c2003411b6a2f0000210d2003411a6a2d0000210e200341166a280100210f200341146a2f01002110200341136a2d0000211120052f00002105200328000f211220032f000d211320032d000c2107410021060b200020073a0001200020063a0000200041206a20053b00002000411e6a20083b00002000411d6a20023a0000200041196a2009360000200041176a200a3b0000200041166a200b3a0000200041126a200c360000200041106a200d3b00002000410f6a200e3a00002000410b6a200f360000200041096a20103b0000200041086a20113a0000200041046a2012360000200041026a20133b000020011030200341306a24000f0b41e8fac100412e200341086a4198fbc10041a8fbc1001034000b9e14030c7f047e057f23004180026b22032400024002400240200128020c220441016a22052004490d00200520012802002206200641016a220741037641076c20064108491b22064101764b0d0141002106200141046a210841002105034002400240024020064101710d00200520074f0d010c020b200541036a22062005490d002006210520062007490d010b200141046a280200210502400240200128020041016a220641044f0d00200541046a200520061086051a0c010b200520066a20052800003600000b41002105024020012802002209417f460d002002280200210a200141046a210b200341e0016a41186a210c4100210603400240200b28020022052006220d6a2d0000418001470d004100200d6b210e0340200c200a290318200a29030885220f3703002003200a29031022103703e80120032010200a29030022118522123703f001200341b0016a200f2005200e41d0006c6a221341406a220541086a29000085420020122005290000854200108405200341a0016a200f201341b07f6a221441086a221529000085420020122014290000854200108405200320102010201142adfed5e4d485fda8d8007e200341b0016a41086a29030020032903b001857c42a0cbbf9599b5a19f0a7c85421789200341a0016a41086a29030020032903a001857c854217893703e001201341506a2216200341e0016a10ff01024002402013417c6a22052d00000d00200341f0006a20032903e001420042adfed5e4d485fda8d8004200108405200341f0006a41086a29030020032903708521100c010b20034190016a20032903e001420185420042adfed5e4d485fda8d800420010840520034180016a20034190016a41086a29030020032903900185200531000185420042adfed5e4d485fda8d800420010840520034180016a41086a2903002003290380018521100b200341e0006a20032903e801420020104200108405200b28020021172001280200210841002105200341e0006a41086a2903002003290360852010892210a7220421060340200541046a2205200620087122076a2106201720076a280000418081828478712202450d000b0240201720026841037620076a20087122056a2c00004100480d002017280200418081828478716841037621050b02402005200820047122066b200d20066b7320087141034b0d002017200d6a2010a741197622053a00002008200d417c6a7120176a41046a20053a00000c020b201720056a22062d0000210720062010a741197622023a00002005417c6a20087120176a41046a20023a00000240200741ff01470d00200b2802002206200d6a41ff013a000020062001280200200d417c6a716a41046a41ff013a0000200b280200410020056b41d0006c6a41b07f6a201441d0001085051a0c020b200b280200410020056b41d0006c6a220641b07f6a2205290200211020052014290200370200200541186a2207290200210f2007201441186a2208290200370200200541106a220729020021122007201441106a2217290200370200200541086a22052902002111200520152902003702002014201037020020152011370200201720123702002008200f370200200641506a220541186a220729020021102007201641186a2208290200370200200541106a2207290200210f2007201641106a2217290200370200200541086a220729020021122007201641086a2202290200370200200529020021112005201629020037020020162011370200200820103702002017200f37020020022012370200200641706a220541086a220729020021102007201341706a220641086a22082902003702002005290200210f200520062902003702002006200f37020020082010370200200b28020021050c000b0b200d41016a2106200d2009470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080c040b200828020020056a220620062802002206410776417f73418182840871200641fffefdfb07726a36020041012106200541016a21050c000b0b4192afc000411c41b0afc000102d000b024002400240024002402005200641016a2206200520064b1b22050d0041bcf5c1002108410021174100210e0c010b02400240200541074b0d004104410820054104491b21050c010b200541ffffffff01712005470d02417f200541037441076e417f6a677641016a21050b2005ad42d0007e2210422088a70d022010a72206200541046a22176a22082006490d022008102f2208450d03200820066a220841ff0120171087051a2005417f6a2217200541037641076c20174108491b210e0b200141046a280200221641046a2114201620076a21132016280200417f734180818284787121052002280200210a200341f8016a210d03400240024020050d0002400340201420134f0d01201641c07d6a211620142802002105201441046a220621142005418081828478712205418081828478460d000b2005418081828478732205417f6a2005712115200621140c020b2001200436020c200041003602002001200e20046b3602082001280200210520012017360200200141046a22062802002107200620083602002005450d062007200541016aad42d0007ea76b10300c060b2005417f6a20057121150b200d200a290318200a29030885220f3703002003200a29031022103703e80120032010200a29030022118522123703f001200341c0006a200f201641002005684103766b41d0006c6a220541406a220641086a29000085420020122006290000854200108405200341d0006a200f200541b07f6a220b41086a2900008542002012200b290000854200108405200320102010201142adfed5e4d485fda8d8007e200341c0006a41086a2903002003290340857c42a0cbbf9599b5a19f0a7c85421789200341d0006a41086a2903002003290350857c854217893703e001200541506a200341e0016a10ff01024002402005417c6a22052d00000d00200341106a20032903e001420042adfed5e4d485fda8d8004200108405200341106a41086a29030020032903108521100c010b200341306a20032903e001420185420042adfed5e4d485fda8d8004200108405200341206a200341306a41086a290300200329033085200531000185420042adfed5e4d485fda8d8004200108405200341206a41086a29030020032903208521100b200320032903e801420020104200108405200341086a2903002003290300852010892210a72105410021060340200641046a2206200520177122076a2105200820076a280000418081828478712202450d000b0240200820026841037620076a20177122056a2c00004100480d002008280200418081828478716841037621050b200820056a2010a741197622063a00002005417c6a20177120086a41046a20063a00002008410020056b41d0006c6a41b07f6a200b41d0001085051a201521050c000b0b4192afc000411c41b0afc000102d000b4192afc000411c41b0afc000102d000b102a000b20034180026a24000bfd0404027f027e017f027e230041f0006b2202240002400240200028020022034125490d002000410c6a2802002103200041086a28020021000c010b200041056a21000b200241e0006a20012903002003ad220485420042adfed5e4d485fda8d80042001084052001200241e8006a29030020022903608520047c42adfed5e4d485fda8d8007e2204370300024002400240024020034109490d00200341104d0d01200241106a200141186a2903002205200320006a41706a220641086a2900008542002001290310220720062900008542001084052004200241106a41086a2903002002290310857c20012903082208854217892104034020022005200041086a29000085420020072000290000854200108405200041106a21002004200241086a2903002002290300857c2008854217892104200341706a220341104b0d000b200120043703000c030b0240200341014b0d002003450d03200241d0006a2004200031000085420042adfed5e4d485fda8d80042001084052001200241d8006a2903002002290350853703000c030b200341034b0d01200241c0006a200320006a417f6a310000422086200033000084200485420042adfed5e4d485fda8d80042001084052001200241c8006a2903002002290340853703000c020b200241206a200141186a290300200320006a41786a2900008542002001290310200029000085420010840520012004200241286a2903002002290320857c2001290308854217893703000c010b200241306a200141186a290300200320006a417c6a3500008542002001290310200035000085420010840520012004200241386a2903002002290330857c2001290308854217893703000b200241f0006a24000bc010050a7f017e027f037e057f23004180016b22032400024002400240200128020c220441016a22052004490d00200520012802002206200641016a220741037641076c20064108491b22064101764b0d0141002106200141046a210841002105034002400240024020064101710d00200520074f0d010c020b200541036a22062005490d002006210520062007490d010b200141046a280200210502400240200128020041016a220641044f0d00200541046a200520061086051a0c010b200520066a20052800003600000b41002105024020012802002204417f460d0020022802002109200141046a210a4100210503400240200a28020022082005220b6a2d0000418001470d004100200b6b210c0340200341c0006a2009290318200929030885220d2008200c41306c6a41506a220e41186a220f2900008542002009290310221020092903002211852212200e290010854200108405200341d0006a200d200e41086a22132900008542002012200e290000854200108405200341306a2010420020102010201142adfed5e4d485fda8d8007e200341c0006a41086a2903002003290340857c42a0cbbf9599b5a19f0a7c85421789200341d0006a41086a2903002003290350857c85421789220d42001084052001280200211441002105200341306a41086a290300200329033085200d892210a7221521060340200541046a2205200620147122076a2106200820076a280000418081828478712202450d000b0240200820026841037620076a20147122056a2c00004100480d002008280200418081828478716841037621050b02402005201420157122066b200b20066b7320147141034b0d002008200b6a2010a741197622053a00002014200b417c6a7120086a41046a20053a00000c020b200820056a22062d0000210720062010a741197622023a00002005417c6a20147120086a41046a20023a00000240200741ff01470d00200a2802002206200b6a41ff013a000020062001280200200b417c6a716a41046a41ff013a0000200a280200410020056b41306c6a41506a2205200e290200370200200541086a2013290200370200200541106a200e41106a290200370200200541186a200f290200370200200541206a200e41206a290200370200200541286a200e41286a2902003702000c020b200a280200410020056b41306c6a41506a220529020021102005200e290200370200200541186a2206290200210d2006200f290200370200200541106a220629020021112006200e41106a2207290200370200200541086a22062902002112200620132902003702002013201237020020072011370200200f200d370200200e2010370200200541286a220629020021102006200e41286a22072902003702002005290220210d2005200e290220370220200e200d37022020072010370200200a28020021080c000b0b200b41016a2105200b2004470d000b20012802002205200541016a41037641076c20054108491b21050b2000410036020020012005200128020c6b3602080c040b200828020020056a220620062802002206410776417f73418182840871200641fffefdfb07726a36020041012106200541016a21050c000b0b4192afc000411c41b0afc000102d000b024002400240024002402005200641016a2206200520064b1b22050d0041bcf5c100210841002114410021160c010b02400240200541074b0d004104410820054104491b21050c010b200541ffffffff01712005470d02417f200541037441076e417f6a677641016a21050b2005ad42307e2210422088a70d022010a72206200541046a22146a22082006490d022008102f2208450d03200820066a220841ff0120141087051a2005417f6a2214200541037641076c20144108491b21160b200841506a2117200141046a280200220941046a210e200920076a21132009280200417f734180818284787121072002280200210a03400240024020070d0002400340200e20134f0d01200941c07e6a2109200e2802002105200e41046a2206210e2005418081828478712205418081828478460d000b2005418081828478732207417f6a20077121152006210e0c020b2001200436020c200041003602002001201620046b3602082001280200210520012014360200200141046a22062802002107200620083602002005450d062007200541016aad42307ea76b10300c060b2007417f6a20077121150b41002105200341106a200a290318200a29030885220d200941002007684103766b41306c6a41506a220f41186a220b290000854200200a2903102210200a2903002211852212200f290010854200108405200341206a200d200f41086a220c2900008542002012200f29000085420010840520032010420020102010201142adfed5e4d485fda8d8007e200341106a41086a2903002003290310857c42a0cbbf9599b5a19f0a7c85421789200341206a41086a2903002003290320857c85421789220d4200108405200341086a290300200329030085200d892210a721060340200541046a2205200620147122076a2106200820076a280000418081828478712202450d000b0240200820026841037620076a20147122056a2c00004100480d002008280200418081828478716841037621050b200820056a2010a741197622063a00002005417c6a20147120086a41046a20063a00002017410020056b41306c6a220541286a200f41286a290200370200200541206a200f41206a290200370200200541186a200b290200370200200541106a200f41106a290200370200200541086a200c2902003702002005200f290200370200201521070c000b0b4192afc000411c41b0afc000102d000b4192afc000411c41b0afc000102d000b102a000b20034180016a24000b8007010a7f230041a0016b2202240002400240024002400240024020012d00002203417e6a0e0403010100010b2001410c6a2802002104200141046a280200210520024180016a41186a2206420037030020024180016a41106a2201420037030020024180016a41086a22074200370300200242003703800120024180016a41e2a4c000410f10ab01200141fce2c000411110ab01200241d8006a20024180016a4120108202200241386a41086a2208200241e2006a290100370300200241386a41106a2209200241ea006a290100370300200241cf006a220a200241f1006a2900003700002002200229015a370338024020022d00584101470d0020022d0059210b200241186a41186a200a290000370000200241186a41116a2009290300370000200241216a2008290300370000200220022903383700192002200b3a001820024180016a200520041065200241d8006a41186a2006290300370300200241d8006a41106a2001290300370300200241d8006a41086a20072903003703002002200229038001370358200241d8006a200241186a4120108805450d020b20034102460d020b200041003b0001200041013a0000200041036a41003a00000c020b200241166a20022d005a3a0000200241086a200241ef006a290000370300200241106a200241f7006a2d00003a0000200220022f01583b01142002200229006737030020022d005b210420022d005c210520022d005d210620022d005e2107200228005f210820022800632109410c102f2203450d024120102f2201450d02200120022f01143b00002001200936000b20012008360007200120073a0006200120063a0005200120053a0004200120043a00032001200229030037000f200141026a200241146a41026a2d00003a0000200141176a200241086a2903003700002001411f6a200241106a2d00003a000020032001360200200342a08080808004370204200041086a42e400370300200041003a0000200041106a427f370300200041186a41002802e88f42360200200041246a2003360200200041306a41013a00002000411c6a4200370200200041286a4281808080103702000c010b200041003a0000200041286a4200370300200041246a41002802e88f4222013602002000411c6a4200370200200041186a2001360200200041086a4200370300200041306a41013a0000200041106a427f3703000b200241a0016a24000f0b102a000bda0a03037f017e017f230041e0006b220324002003200236020c20032001360208200341106a2001200241002802d4ad4211040002400240200328021022010d00200041003a00000c010b2003280214210402400240200341186a2802002202450d00200320012d00003a003c2003410136023820024101460d00200320012d00013a003d2003410236023820024102460d00200320012d00023a003e2003410336023820024103460d00200320012d00033a003f2003410436023820024104460d00200341c0006a20012d00043a00002003410536023820024105460d00200341c1006a20012d00053a00002003410636023820024106460d00200341c2006a20012d00063a00002003410736023820024107460d00200341c3006a20012d00073a00002003410836023820024108460d00200341c4006a20012d00083a00002003410936023820024109460d00200341c5006a20012d00093a00002003410a3602382002410a460d00200341c6006a20012d000a3a00002003410b3602382002410b460d00200341c7006a20012d000b3a00002003410c3602382002410c460d00200341c8006a20012d000c3a00002003410d3602382002410d460d00200341c9006a20012d000d3a00002003410e3602382002410e460d00200341ca006a20012d000e3a00002003410f3602382002410f460d00200341cb006a20012d000f3a00002003411036023820024110460d00200341cc006a20012d00103a00002003411136023820024111460d00200341cd006a20012d00113a00002003411236023820024112460d00200341ce006a20012d00123a00002003411336023820024113460d00200341cf006a20012d00133a00002003411436023820024114460d00200341d0006a20012d00143a00002003411536023820024115460d00200341d1006a20012d00153a00002003411636023820024116460d00200341d2006a20012d00163a00002003411736023820024117460d00200341d3006a20012d00173a00002003411836023820024118460d00200341d4006a20012d00183a00002003411936023820024119460d00200341d5006a20012d00193a00002003411a3602382002411a460d00200341d6006a20012d001a3a00002003411b3602382002411b460d00200341d7006a20012d001b3a00002003411c3602382002411c460d00200341d8006a20012d001c3a00002003411d3602382002411d460d00200341d9006a20012d001d3a00002003411e3602382002411e460d00200341da006a20012d001e3a00002003411f3602382002411f460d00200341db006a20012d001f3a0000200041086a200341386a410b6a2f00003b00002000410a6a200341c5006a2d00003a0000200041116a200341cc006a2d00003a00002000410f6a200341386a41126a2f01003b000020034120360238200320032f013c3b0120200320032d003e3a0022200341c6006a2801002102200341cd006a2800002105200341d4006a2902002106200328003f2107200041186a200341d3006a2d00003a0000200041166a200341386a41196a2f00003b0000200041036a20032d00223a0000200020032f01203b0001200041196a2006370000200041126a20053600002000410b6a2002360000200041046a2007360000410121020c010b2003420037022441002102200341002802dc9442360220200341093602342003200341086a3602302003200341206a36025c200341cc006a41013602002003420137023c200341a0e6c1003602382003200341306a360248200341dc006a41d0adc000200341386a10321a2003280220200328022810ad012003280224450d00200328022010300b200020023a00002004450d00200110300b200341e0006a24000b8a1105037f017e0e7f027e037f230041f0016b22022400200241286a2001109b010240024020022802280d000240024002400240024002400240200228022c2203200128020441246e2204200420034b1bad42247e2205422088a70d002005a72204417f4c0d000240024020040d00410421060c010b2004102f2206450d060b200441246ead21052003450d0320024180016a4104722107200241ce016a2108200241bf016a2109200241e4016a210a2002419d016a210b20024180016a41106a210c4100210d034020012802042204450d032001280200220e2d0000210f20012004417f6a22103602042001200e41016a36020002400240024002400240024002400240200f0e08000b010b030402050b0b200241086a2001109b0120022802080d0a2001280204220f200228020c2204490d0a2004417f4c0d080240024020040d004101210e0c010b2004102f220e450d0e200e410020041087051a2001280204210f0b200f2004490d09200e2001280200200410850521102001280204220f2004490d0e2001200f20046b3602042001200128020020046a36020020104108762111410521102004210f0c050b2004417e6a211241002104034020102004460d0a200e20046a221341016a2d0000210f200120123602042001201341026a360200200720046a200f3a00002002200441016a2213360280012012417f6a21122013210420134120470d000b2002200c2902003703b8012002200c41056a2900003700bd0120022802840121132002290388012114200a41036a200c41036a280000360000200a200c280200360200200241c8016a41046a200941046a2f00003b0100200841036a200b41036a2800003600002008200b280000360000200220143702dc01200220133602d801200220092800003602c80120022900e301211520022800db01210e2002200241c8016a41056a2900003700ad01200220022902c8013703a801200220022900ad01370075200220022903a80137037020022002290075370065200220022903703703602002200229006537005520022002290360370350200241c0006a41086a200241d0006a41086a29030037030020022002290350370340200e41087621112014421888a7210f2015422088a72112410021100c050b200110a8012215a74101710d08200241206a2001109b0120022802200d082001280204220420022802242212490d082012417f4c0d060240024020120d004101210f0c010b2012102f220f450d0c200f410020121087051a200128020421040b0240024020042012490d00200f200128020020121085051a2001280204220420124f0d012012200441f0f5c100104a000b200f10300c090b2001200420126b3602042001200128020020126a36020020154280808080f01f83422088a7210e20154280feffffff1f83420888a7211341012110201221040c030b200110a8012215a74101710d07200241106a2001109b0120022802100d072001280204220420022802142212490d072012417f4c0d050240024020120d004101210f0c010b2012102f220f450d0b200f410020121087051a200128020421040b0240024020042012490d00200f200128020020121085051a2001280204220420124f0d012012200441f0f5c100104a000b200f10300c080b2001200420126b3602042001200128020020126a36020020154280808080f01f83422088a7210e20154280feffffff1f83420888a7211341022110201221040c020b200110a8012215a74101710d06200241186a2001109b0120022802180d0620012802042204200228021c2212490d062012417f4c0d040240024020120d004101210f0c010b2012102f220f450d0a200f410020121087051a200128020421040b0240024020042012490d00200f200128020020121085051a2001280204220420124f0d012012200441f0f5c100104a000b200f10300c070b2001200420126b3602042001200128020020126a36020020154280808080f01f83422088a7210e20154280feffffff1f83420888a7211341032110201221040c010b2010450d05200e2d0001210f20012004417e6a3602042001200e41026a360200200f0d0520024180016a200110ea01200228028001220e4102460d052002280288012104200228028401210f41042110410021110b2011410874200e41ff017172210e2012ad4220862004ad8421150b200241306a41086a2216200241c0006a41086a29030037030020022002290340370330024002402005422088a722042005a7470d00200441016a22172004490d0320044101742218201720172018491b22174104201741044b1bad42247e2214422088a74541027421172014a721180240024020040d0020024100360280010c010b200241043602880120022006360280012002200441246c360284010b200241d8016a2018201720024180016a106920022802e001211720022802d8014101460d0120022802dc012106200542808080807083201741246ead8421050b2006200441246c6a2204201537000c2004200f3600082004200e360004200420133b0001200420103a0000200441036a20134110763a0000200420022903303700142004411c6a201629030037000020054280808080107c2105200d41016a220d2003470d010c060b0b20170d050b102c000b200e10300b02402005422088a72201450d00200141246c21042006210103400240024002400240024020012d00000e050400010204030b2001410c6a280200450d03200141086a28020010300c030b2001410c6a280200450d02200141086a28020010300c020b2001410c6a280200450d01200141086a28020010300c010b200141086a280200450d00200141046a28020010300b200141246a21012004415c6a22040d000b0b2005a72201450d04200141246c450d04200610300c040b2006450d030b20002005370204200020063602000c030b102a000b2004200f41f0f5c100104a000b200041003602000b200241f0016a24000b13002000410836020420004194b0c0003602000b900201037f230041d0006b22032400200320023602042003200136020041002104200341086a2001200241002802d4ad4211040002400240200328020822020d000c010b200328020c210502400240200341106a2802004104490d0020022800002101410121040c010b2003420037021c41002104200341002802dc94423602182003410936022c200320033602282003200341186a360234200341cc006a41013602002003420137023c200341a0e6c1003602382003200341286a360248200341346a41d0adc000200341386a10321a2003280218200328022010ad010240200328021c450d00200328021810300b0b2005450d00200210300b2000200136020420002004360200200341d0006a24000bd00302047f017e230041e0006b220324002003200236020c20032001360208200341106a2001200241002802d4ad4211040002400240024002400240200328021022010d00200041003602000c010b200328021421022003200341186a280200360224200320013602202003200341206a109b010240024020032802000d002003280224220420032802042205490d002005417f4c0d030240024020050d00410121060c010b2005102f2206450d052006410020051087051a200328022421040b024020042005490d002006200328022020051085052106200328022422042005490d0620002005ad2207422086200784370204200020063602002003200420056b3602242003200328022020056a3602200c020b200610300b2003420037022c200341002802dc94423602282003410936023c2003200341086a3602382003200341286a360244200341dc006a41013602002003420137024c200341a0e6c1003602482003200341386a360258200341c4006a41d0adc000200341c8006a10321a2003280228200328023010ad010240200328022c450d00200328022810300b200041003602000b2002450d00200110300b200341e0006a24000f0b102c000b102a000b2005200441f0f5c100104a000b900201047f230041106b22022400024002402001280208220341046a2204417f4c0d002001280200210102400240024002400240024020040d0020004100360208200042013702000c010b2004102f2205450d06200041003602082000200436020420002005360200200341c000490d01200341808001490d022003418080808004490d030b200241033a00032000200241036a41011064200220033602042000200241046a410410640c030b200220034102743a000d20002002410d6a410110640c020b200220034102744101723b010e20002002410e6a410210640c010b200220034102744102723602082000200241086a410410640b2000200120031064200241106a24000f0b102c000b102a000b6901017f230041206b220324002003200136020420032000360200200341086a41106a200241106a290200370300200341086a41086a200241086a29020037030020032002290200370308200341dcefc100200341046a41dcefc100200341086a41acacc000104b000b6901017f230041206b220324002003200136020420032000360200200341086a41106a200241106a290200370300200341086a41086a200241086a290200370300200320022902003703082003418cf0c100200341046a418cf0c100200341086a41c4acc000104b000b6601017f230041206b220424002004200136020420042000360200200441086a41106a200241106a290200370300200441086a41086a200241086a290200370300200420022902003703082004419cf0c100200441046a419cf0c100200441086a2003104b000b1d01017e2001ad4220862000ad841011220029000021022000103020020be00c010f7f230041206b22022400200141186a2802002103200141106a28020021042001410c6a2802002105200141086a2802002106200128021421072001280204210802400240024002400240024002400240024002400240024002400240200128020022094101460d0020070d0120004201370200200041086a210a0c0b0b02402007450d000240024020080d004101210120050d014100210b0c050b200620086b210b20050d03410121010c040b200420056b210b0c030b0240024020080d0020050d0120004201370200200041086a210a0c0c0b200620086b210b20050d04200b21010c050b200420056b21010c040b200320076b21010c030b200b200420056b6a220c200b4f2101200c210b0b2001450d02200b200320076b6a2201200b4f0d010c020b200b200420056b6a2201200b490d010b2001417f4c0d044100210b4101210d02402001450d002001210b2001102f220d450d040b2000200d360200200041086a220a4100360200200041046a200b36020020094101460d01024020070d004100210c0c070b200320076b21010c020b200041046a42003702004100210b200041002802dc9442220d360200200041086a210a0b024002400240024002400240024002402007450d000240024020080d004101210120050d014100210c0c040b200620086b210c20050d02410121010c030b200420056b210c0c020b024020080d0020050d074100210c0c0c0b200620086b21012005450d074100210e2001200420056b6a220c2001490d02200c21010c070b200c200420056b6a220e200c4f2101200e210c0b02402001450d00200c200320076b6a2201200c4f0d060b2008450d012007210e0b024020062008470d00410021080c020b200841016a210c0c020b2007210e0b02402005450d0020042005460d00200521012008210c200541016a2105200121080c010b2007450d0720032007460d07200741016a210e410021092008210c200721080b200041046a210f410021070340200e210120082d0000210802400240024002402007200b470d0002400240024020094101460d0020010d014100210e0c020b02402001450d0002400240200c0d00200420056b410020051b210e0c010b2006200c6b210e2005450d00417f200e200420056b6a22102010200e491b210e0b417f200e200320016b6a22102010200e491b210e0c020b0240200c0d00200420056b410020051b210e0c020b2006200c6b210e2005450d01417f200e200420056b6a22102010200e491b210e0c010b200320016b210e0b200b200b6b417f200e41016a22102010200e491b220e4f0d00200b200e6a220e200b490d08200b4101742210200e2010200e4b1b220e4108200e41084b1b210e02400240200b0d00200241003602100c010b200241013602182002200b3602142002200d3602100b2002200e4101200241106a10692002280208210b20022802004101460d0120002002280204220d360200200f200b3602000b200d20076a20083a0000200a200741016a220736020020094101470d02200c450d012006200c460d0141012109200c2108200c41016a210c2001210e0c030b200b0d050c060b41002109024020050d004100210c0c010b4100210c20042005460d00410121094100210c20052108200541016a21052001210e0c010b2001450d0720032001460d07200141016a210e200121080c000b0b200420056b21010b4100210c02400240200b20014f0d00200b410174220c2001200c20014b1b22014108200141084b1b210102400240200b0d00200241003602100c010b200241106a41086a41013602002002200b3602142002200d3602100b200220014101200241106a1069200241086a280200210120022802004101460d0120002002280204220d360200200041046a2001360200200041086a280200210c0b200d200c6a2101024020094101470d0002402008450d0020062008460d002006200c20086b6a210c0340200120082d00003a0000200141016a21012006200841016a2208470d000b0b2005450d0020042005460d002004200c20056b6a210c0340200120052d00003a0000200141016a21012004200541016a2205470d000b0b2007450d0420032007460d04200721080340200120082d00003a0000200141016a21012003200841016a2208470d000b2003200c20076b6a210c0c040b2001450d010b102a000b102c000b4100210c200a41003602000b200a200c3602000b200241206a24000b940201017f230041e0006b22032400200342d7b89aadacd3f3803d370020200342b6c1b1faafd0a2b73f370018200342b8d08eab80d2bcb1fc00370010200342ea9a80e5d5b4e689bc7f370008200341003602302003420137032820032001360240200341286a200341c0006a4104106420032002360240200341286a200341c0006a4104106420032003280228220220032802302201108b02370338200341d8006a200220016a360200200341d0006a200341386a41086a360200200341c0006a41086a200341286a36020020032002360254200341cc006a200341386a360200200341013602402003200341086a3602442000200341c0006a108c020240200328022c450d00200210300b200341e0006a24000b980404027f017e0e7f037e230041c0006b2202240002400240024020012802082203ad423c7e2204422088a70d002004a72205417f4c0d00200128020021064104210702402005450d002005102f2207450d020b410021082000410036020820002007360200200041046a2005413c6e220936020002402005413c490d00200641196a210a2009210b034020052008460d01200b450d04200b417f6a210b2006280214210c2006280210210d200628020c210e2006280208210f200628020421102006280200211141002112024020062d00184101470d00200241206a41186a200a20086a220141186a290000370300200241206a41106a200141106a290000370300200241206a41086a200141086a29000037030020022001290000370320410121120b2006413c6a2106200241186a200241206a41186a2903002204370300200241106a200241206a41106a2903002213370300200241086a200241206a41086a2903002214370300200220022903202215370300200720086a220141186a20123a0000200141146a200c360200200141106a200d3602002001410c6a200e360200200141086a200f360200200141046a201036020020012011360200200141196a2015370000200141216a2014370000200141296a2013370000200141316a20043700002008413c6a2108200b0d000b0b20002003360208200241c0006a24000f0b102c000b102a000b2009200941a0e4c1001033000bbb0201037f230041106b220224002000280200210320012000280208220010a501024002402000450d0020032000413c6c6a210003402002200328020036020020012002410410642002200341046a28020036020020012002410410642002200341086a280200360200200120024104106420022003410c6a28020036020020012002410410642002200341106a28020036020020012002410410642002200341146a280200360200200120024104106402400240200341186a2d00004101460d00200241003a000020012002410110640c010b200241013a000020012002410110644120102f2204450d0320024220370204200220043602002002200341196a41201064200120022802002204200228020810642002280204450d00200410300b2003413c6a22032000470d000b0b200241106a24000f0b102a000b990204017f017e017f017e230041d0006b220224002002412036020420022001360200200241086a2001412041002802d4ad4211040002400240200228020822010d00420021030c010b200228020c210402400240200241086a41086a2802004108490d0020012900002105420121030c010b420021032002420037021c200241002802dc94423602182002410936022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241a0e6c1003602382002200241286a360248200241346a41d0adc000200241386a10321a2002280218200228022010ad010240200228021c450d00200228021810300b0b2004450d00200110300b2000200537030820002003370300200241d0006a24000b970302017f027e230041d0166b22042400200441286a200141c8031085051a200442003703f003200441e0076a200241e8031085051a200441f8036a200441e0076a10ce02200441186a200441f8036a10c4030240024002402004280218450d0020004202370300200041153602080c010b20042903202105200441086a200441f8036a10c30302402004290308a7450d0020004202370300200041153602080c010b0240200520042903107c220620055a0d0020004202370300200041013602080c010b024020062003580d002000411136020820004202370300200041106a20063703000c010b200441a00f6a200441286a41c8031085051a200441e8126a200441f8036a41e8031085051a42012103200441e0076a200441a00f6a200441e8126a200441f0036a420110da030240024020042903e0074201520d00200041106a200441e8076a41b8071085051a0c010b420021034200200620042903e8077d220520052006561b21060b20002003370300200020063703080c010b200441f8036a109601200441286a109c010b200441d0166a24000bf20803077f017e037f230041306b22022400200128022021032001412c6a21040240034002402003450d00024002402001280228220520042802002206470d00200521070c010b2001200541106a220736022820052802042208450d002000200541086a29020022093e020c20002008360208200041106a20094220883e020020002005280200360204200020012802303602000c030b0240024020062007470d00200321070c010b0340200741106a21050240200741086a280200450d00200741046a28020010300b2005210720062005470d000b200128022021070b0240200128022441ffffffff0071450d00200710300b200141003602200b0240200128021c2207450d0020012007417f6a36021c02400240024020012802082207450d0020012802042106200128020c220820072f01b601490d01034002400240200728020022050d00410021050c010b200641016a210a20072f01b40121080b024041e80141b80120061b450d00200710300b024020050d00410021070c040b200a210620052107200820052f01b6014f0d000b20052107200a21060c010b41b2abc200412b41d4a8c200102d000b200841016a210520072008410c6c6a220a41306a2103200720084102746a41046a210802402006450d00200720054102746a41b8016a280200210702402006417f6a2205450d00034020072802b80121072005417f6a22050d000b0b410021050b20082802002106200a41346a2902002109200328020021030b2001200536020c20012007360208200141003602042003450d0020032009422088a74104746a21082009a7210a024020012802202205450d0002402004280200220b2001280228220c6b2207450d002007417f2007417f4a1b2205410120054101481b200c200b6b22052007200520074a1b4104766c4104742105200c41086a2107034002402007280200450d002007417c6a28020010300b200741106a2107200541706a22050d000b200128022021050b200128022441ffffffff0071450d00200510300b20012006360230200120033602282001200a36022420012003360220200420083602000c010b0b024020012802342208450d000240024002402001413c6a2802002205200141c0006a2802002206470d00200521070c010b2001200541106a220736023c2005280204220a0d010b20024100360210024020062007460d000340200741106a21050240200741086a280200450d00200741046a28020010300b2005210720062005470d000b200128023421080b0240200141386a220728020041ffffffff0071450d00200810300b2001410036023420072002290220370200200141c0006a200241286a29020037020020022802102107200041003602082007450d022002280214450d02200228021010300c020b200241086a41086a2207200a3602002002200528020036020c2002200141c4006a280200360208200020022903083702002002200541086a290200370214200041086a2007290300370200200041106a200241086a41106a2802003602000c010b200041003602080b200241306a24000bba0302077f017e200028020421012000410036020402402001450d0020002802002102024020002802182203450d00200028020821040340024002400240200420012f01b6014f0d0020012100200221050c010b034002400240200128020022000d00410021000c010b200241016a210520012f01b40121040b024041e80141b80120021b450d00200110300b024020000d00410021010c030b2005210220002101200420002f01b6014f0d000b0b200441016a210620002004410c6c6a220241306a21070240024020050d0020002101200621040c010b200020064102746a41b8016a280200210102402005417f6a2200450d00034020012802b80121012000417f6a22000d000b0b410021040b200241346a2902002108200728020021070b2007450d0202402008422088a72200450d0020004104742102200741086a2100034002402000280200450d002000417c6a28020010300b200041106a2100200241706a22020d000b0b2003417f6a21030240200842ffffffff0083500d00200710300b4100210220030d000b0b034020012802002100024041e80141b80120021b450d00200110300b200241016a21022000210120000d000b0b0b9b0303077f017e037f230041106b220224000240024020014102490d00200041146a2103200028020021040240200041186a2802002205200041046a2802002206490d0020052006470d01200328020020044f0d010b20002003290200370200200241086a2207200041106a2205280200360200200041086a220829020021092008200341086a2902003702002005200341106a2802003602002002200937030041012108024020014103490d002001417e6a210a200041286a210520002001417f6a220b41146c6a210341002108024003400240200541046a280200220c2006490d00200c2006470d02200528020020044f0d020b200b2008460d042005416c6a220c2005290200370200200c41106a200541106a280200360200200c41086a200541086a290200370200200541146a2105200a200841016a2208470d000b200841016a21080c010b200841016a21082005416c6a21030b200320043602002000200841146c6a2205200636020420052002290300370208200541106a20072802003602000b200241106a24000f0b20012001419cf8c0001033000bc00201067f200028020421012000410036020402402001450d00024020002802002202450d00034020012802940321012002417f6a22020d000b0b024020002802082203450d004100210403402003417f6a2103024002400240200420012f0132490d0041002100034041002102024020012802002205450d00200041016a210620012f01302104200521020b024041c40341940320001b450d00200110300b024020020d00410021010c040b2006210020022101200420022f01324f0d000b20060d01200221010b200441016a21040c010b200441027420026a4198036a280200210102402006417f6a2202450d00034020012802940321012002417f6a22020d000b0b410021040b20030d000b0b41002102034020012802002100024041c40341940320021b450d00200110300b2002417f6a21022000210120000d000b0b0bc80201087f02400240024020012802042203450d00200128020021040c010b419403102f2203450d0141002104200341003b01322003410036020020012003360204200141003602000b20022802002105034020032f01322206410274210741002108417f210902400340024020072008470d00200621090c020b200320086a210a200941016a2109200841046a2108417f2005200a41046a280200280200220a472005200a491b220a4101460d000b0240200a41016a0e020100010b20002004360204200041106a20013602002000410c6a2009360200200041086a2003360200200041013602000f0b02402004450d002004417f6a2104200320094102746a4194036a28020021030c010b0b20002002360204200041146a2001360200200041106a20093602002000410c6a2003360200200041086a4100360200200041003602000f0b102a000bea17011d7f230041a0016b220224002000410c6a280200210320002802002104024002400240200041086a28020022052f01322206410a4b0d00200541046a21070240200341016a220820064b22090d00200720084102746a200720034102746a200620036b4102741086051a0b200720034102746a200436020020024180016a41186a2207200141186a29000037030020024180016a41106a2204200141106a29000037030020024180016a41086a220a200141086a2900003703002002200129000037038001200541346a2101024020090d00200120084105746a200120034105746a200620036b4105741086051a0b200120034105746a220b200229038001370000200b41186a2007290300370000200b41106a2004290300370000200b41086a200a2903003700002005200641016a3b01320c010b410521064100210c02400240200341054f0d0041042106200321070c010b41052107024002402003417b6a0e020201000b200341796a21074101210c410621060c010b410021074101210c0b2000280204210902400240024002400240024002400240024002400240419403102f2203450d00200341003b013220034100360200200320052f0132220d2006417f736a22083b0132200541046a220e20064102746a280200210f20024180016a41186a200541346a221020064105746a220a41186a29000037030020024180016a41106a200a41106a29000037030020024180016a41086a200a41086a2900003703002002200a290000370380012008410c4f0d01200d200641016a220a6b2008470d02200341046a200e200a4102746a20084102741085051a200341346a2010200a4105746a20084105741085051a200520063b0132200241c0006a41086a20024180016a41086a220a290300370300200241c0006a41106a20024180016a41106a220d290300370300200241c0006a41186a20024180016a41186a2210290300370300200220022903800137034020032005200c1b220641046a21080240200741016a220c20062f0132220e4b22110d002008200c4102746a200820074102746a200e20076b4102741086051a0b200820074102746a20043602002010200141186a290000370300200d200141106a290000370300200a200141086a2900003703002002200129000037038001200641346a2101024020110d002001200c4105746a200120074105746a200e20076b4105741086051a0b200120074105746a220b200229038001370000200b41186a20024180016a41186a220a290300370000200b41106a20024180016a41106a220c290300370000200b41086a20024180016a41086a220d2903003700002006200e41016a3b0132200241206a41086a2210200241c0006a41086a2212290300370300200241206a41106a2211200241c0006a41106a2213290300370300200241206a41186a2214200241c0006a41186a221529030037030020022002290340370320200241186a22162014290300370300200241106a22172011290300370300200241086a2218201029030037030020022002290320370300024002400240200528020022010d00410021090c010b200f2119410021062003211a03402001210420052f013021072014201629030037030020112017290300370300201020182903003703002002200229030037032020092006470d0620042f0132220e410b490d024100210841042105024020074105490d0020072105024002402007417b6a0e020201000b200741796a210741012108410621050c010b4100210741012108410521050b41c403102f2203450d03200341003b013220034100360200200320042f0132221b2005417f736a22013b0132200441046a221c20054102746a280200210f200a200441346a221d20054105746a220641186a290000370300200c200641106a290000370300200d200641086a29000037030020022006290000370380012001410c4f0d07201b200541016a22066b2001470d08200341046a201c2006410274221b6a20014102741085051a200341346a201d20064105746a20014105741085051a200420053b0132200241e0006a41086a221c200d290300370300200241e0006a41106a221d200c290300370300200241e0006a41186a221e200a290300370300200220022903800137036020032f0132220141016a21062001410c4f0d09200e20056b22052006470d0a200941016a210920034194036a2004201b6a4194036a20054102741085051a4100210502400340200320054102746a4194036a280200220620053b013020062003360200200520014f0d01200520052001496a220520014d0d000b0b2015201e2903003703002013201d2903003703002012201c290300370300200220022903603703402003200420081b220641046a21080240200741016a220520062f013222014b221b0d00200820054102746a200820074102746a200120076b4102741086051a0b20082007410274221c6a2019360200200a2014290300370300200c2011290300370300200d20102903003703002002200229032037038001200641346a210e0240201b0d00200e20054105746a200e20074105746a200120076b4105741086051a0b200141016a2108200e20074105746a220e200229038001370000200e41186a200a290300370000200e41106a200c290300370000200e41086a200d29030037000020064194036a210e0240200741026a221b200141026a22194f0d00200e201b4102746a200e20054102746a200120076b4102741086051a0b200e20054102746a201a360200200620083b01320240200520194f0d002006201c6a4198036a2105034020052802002201200741016a22073b013020012006360200200541046a210520082007470d000b0b20162015290300370300201720132903003703002018201229030037030020022002290340370300200f211920042105200921062003211a200428020022010d000b0b200a2016290300370300200c2017290300370300200d20182903003703002002200229030037038001200028021022012802042206450d092001280200210741c403102f2205450d012005200636029403200541003b013220054100360200200641003b013020062005360200200120053602042001200741016a36020020072009470d0a20052f01322206410b4f0d0b2005200641016a22083b0132200520064105746a220741c4006a20024190016a290300370000200741cc006a20024198016a290300370000200741346a200229038001370000200520064102746a41046a200f3602002007413c6a20024188016a29030037000020054194036a20084102746a2003360200200320083b0130200320053602002001200128020841016a3602080c0d0b200441046a21050240200e20074d22030d00200520074102746a220141046a2001200e20076b4102741086051a0b200520074102746a201936020020024180016a41186a2206200241186a29030037030020024180016a41106a2208200241106a29030037030020024180016a41086a2209200241086a2903003703002002200229030037038001200741016a2105200441346a2101024020030d00200120054105746a200120074105746a200e20076b4105741086051a0b200e41016a210a200120074105746a2201200229038001370000200141186a2006290300370000200141106a2008290300370000200141086a200929030037000020044194036a2101200e41026a2106024020030d00200741027420016a41086a200120054102746a200e20076b4102741086051a0b2004200a3b0132200120054102746a201a360200200520064f0d0b200e41016a210620042005417f6a22054102746a4198036a2101034020012802002203200541016a22053b013020032004360200200141046a210120062005470d000c0c0b0b102a000b2008410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b41b0a3c200413541e8a3c200102d000b2001410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2006410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b20002802102205200528020841016a3602080b200241a0016a2400200b0bb90201047f230041106b22032400024002402002280208220441046a2205417f4c0d002002280200210202400240024002400240024020050d0020034100360208200342013703000c010b2005102f2206450d06200341003602082003200536020420032006360200200441c000490d01200441808001490d022004418080808004490d030b200341033a000c20032003410c6a410110642003200436020c20032003410c6a410410640c030b200320044102743a000c20032003410c6a410110640c020b200320044102744101723b010c20032003410c6a410210640c010b2003200441027441027236020c20032003410c6a410410640b20032002200410642000200120032802002204200328020841002802fcad4211030002402003280204450d00200410300b200341106a24000f0b102c000b102a000b13002000410536020420004180c3c0003602000b3400200041e2a4c00036020420004100360200200041146a4113360200200041106a4198ccc000360200200041086a420f3702000bf70703037f037e027f230041c0006b22022400024002400240024002400240024020002d0000417f6a0e050001020304050b200241003a00202001200241206a410110642002200041046a2802003602202001200241206a410410640c040b200241013a00202001200241206a41011064200041046a200110f601200041386a28020021032001200041c0006a280200220410a50102402004450d0020032004410c6c6a210403402003280200200341086a280200200110a6012003410c6a22032004470d000b0b200041c4006a28020021032001200041cc006a280200220410a50102402004450d00200320044104746a21040340200220032802003602202001200241206a41041064200341046a2802002003410c6a280200200110a601200341106a22032004470d000b0b2001200041d8006a280200220310a50102400240200041d4006a28020022040d0041002103200241306a4100360200200241003602240c010b200241206a200041d0006a28020020041093010b200241086a41106a200241206a41106a22002903002205370300200241086a41086a200241206a41086a220429030022063703002002200229032022073703082000200537030020042006370300200220073703202003450d03034020022003417f6a360238200241206a410020022802241b220828020021040240024020082802082209200828020422002f01b6014f0d00200021030c010b03400240200028020022030d00410021030c020b200441016a210420002f01b401210920032100200920032f01b6014f0d000b0b024002402004450d00200941027420036a41bc016a280200210002402004417f6a2204450d00034020002802b80121002004417f6a22040d000b0b410021040c010b200941016a2104200321000b2008200036020420084100360200200820043602082002200320094102746a41046a28020036023c20012002413c6a4104106420032009410c6c6a220041306a28020021032001200041386a280200220010a50102402000450d00200320004104746a210003402002200328020036023c20012002413c6a41041064200341046a2802002003410c6a280200200110a601200341106a22032000470d000b0b200228023822030d000c040b0b200241023a00202001200241206a41011064200041046a2802002000410c6a280200200110a6010c020b200241033a00202001200241206a410110644120102f2203450d022002422037022420022003360220200241206a200041016a41201064200120022802202203200228022810642002280224450d01200310300c010b200241043a00202001200241206a41011064200041046a2802002000410c6a280200200110a6010b200241c0006a24000f0b102a000ba316020c7f027e230041d0016b2202240002400240200128020422030d002000410a3a00000c010b200128020022042d0000210520012003417f6a22063602042001200441016a36020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0a000102030405060708090a0b200041003a00000c170b200241086a2001109b01024020022802080d00200228020c2101200041013a0000200041046a20013602000c170b2000410a3a00000c160b02402006450d0020042d0001210520012003417e6a22073602042001200441026a220836020041002103410121094100210a0240024002400240024020050e0403000102050b200241106a2001109b0120022802100d04200128020422042002280214220b490d04200b417f4c0d1302400240200b0d004101210c0c010b200b102f220c450d15200c4100200b1087051a200128020421040b2004200b490d03200c2001280200200b1085051a20012802042204200b490d1520012004200b6b220736020420012001280200200b6a22083602004101210a410021090c020b410121094102210a0c010b4103210a410121090b200241003602a8012007417f6a2104200241a8016a410472210d034020072003460d10200820036a22052d0000210620012004360204200d20036a20063a00002001200541016a3602002002200341016a22053602a8012004417f6a21042005210320054120470d000b200041086a200241a8016a410b6a2f00003b00002000410a6a200241b5016a2d00003a00002000410f6a200241a8016a41126a2f01003b0000200041116a200241bc016a2d00003a0000200041186a200241c3016a2d00003a0000200041166a200241a8016a41196a2f00003b0000200220022f01ac013b01a401200220022d00ae013a00a601200241b6016a2801002101200241bd016a2800002103200241c4016a290200210e20022800af012104200041036a20022d00a6013a0000200020022f01a4013b0001200041196a200e370000200041126a20033600002000410b6a2001360000200041046a2004360000200041023a0000200041216a20022f00a1013b0000200041236a200241a1016a41026a2d00003a0000200041306a200b3600002000412c6a200b360000200041286a200c360000200041246a200a3600000c170b200c10300b2000410a3a00000c150b024002402006450d0020042d0001210520012003417e6a3602042001200441026a36020041002106410121070240024002400240024020050e0403000102050b200241286a2001109b0120022802280d0420012802042205200228022c2203490d042003417f4c0d130240024020030d00410121040c010b2003102f2204450d152004410020031087051a200128020421050b20052003490d032004200128020020031085051a200128020422052003490d162001200520036b3602042001200128020020036a36020041012106410021070c020b410221060c010b410321060b200241186a2001109d012002290318a70d022002290320210e200041033a0000200041186a200e370300200041106a20033600002000410c6a2003360000200041086a2004360000200041046a20063600000c170b200410300b2000410a3a00000c150b2000410a3a00002007200345720d14200410300c140b024002402006450d0020042d0001210520012003417e6a3602042001200441026a36020041002106410121070240024002400240024020050e0403000102050b200241306a2001109b0120022802300d042001280204220520022802342203490d042003417f4c0d120240024020030d00410121040c010b2003102f2204450d142004410020031087051a200128020421050b20052003490d032004200128020020031085051a200128020422052003490d162001200520036b3602042001200128020020036a36020041012106410021070c020b41012107410221060c010b41032106410121070b200241a8016a200110a70120022d00a8014101460d02200020022900a901370001200041116a200241a8016a41116a280000360000200041096a200241a8016a41096a290000370000200041246a2003360000200041206a20033600002000411c6a2004360000200041186a2006360000200041043a00000c160b200410300b2000410a3a00000c140b2000410a3a00002007200345720d13200410300c130b02402006450d0020042d0001210520012003417e6a3602042001200441026a360200200020053a0001200041053a00000c130b2000410a3a00000c120b200241386a200110c90202402002290338a70d00200241386a41106a290300210e2002290340210f200041063a0000200041086a200f370300200041106a200e3703000c120b2000410a3a00000c110b200241d0006a2001109b01024020022802500d002001280204220420022802542203490d002003417f4c0d0a0240024020030d00410121050c010b2003102f2205450d0c2005410020031087051a200128020421040b024020042003490d002005200128020020031085052105200128020422042003490d10200041073a00002001200420036b360204200041086a2003ad220e422086200e84370000200041046a20053600002001200128020020036a3602000c120b200510300b2000410a3a00000c100b200041083a00000c0f0b2006450d0420042d0001210520012003417e6a22033602042001200441026a360200410021064101210702400240024002400240024020050e07080001020304050a0b20024190016a2001109b012002280290010d09200128020422032002280294012205490d092005417f4c0d0c0240024020050d00410121040c010b2005102f2204450d0e2004410020051087051a200128020421030b20032005490d082004200128020020051085051a2001280204220320054f0d062005200341f0f5c100104a000b20024198016a2001109b012002280298010d08200228029c01210420012802042103410221060c060b410321060c050b410421060c040b410521060c030b410621060c020b2000410a3a00000c0d0b2005ad220e422086200e84210e2001200320056b22033602042001200128020020056a36020041012106410021070b2003450d02200128020022052d0000210820012003417f6a3602042001200541016a360200410021050240024002400240024020080e050400010203070b200241d8006a2001109b0120022802580d06200228025c2103410121050c030b200241e8006a2001109b0120022802680d05200228026c2103200241e0006a2001109b0120022802600d052002280264210d410221050c020b200241f8006a2001109b0120022802780d04200228027c2103200241f0006a2001109b0120022802700d042002280274210d410321050c010b20024188016a2001109b012002280288010d03200228028c01210320024180016a2001109b012002280280010d03200228028401210d410421050b200041093a0000200020022f00a4013b00012000411c6a200d360200200041186a2003360200200041146a20053602002000410c6a200e370000200041086a2004360000200041046a2006360000200041206a20022903a801370300200041036a200241a6016a2d00003a0000200041286a200241a8016a41086a290300370300200041306a200241b8016a2903003703000c0b0b200410300b2000410a3a00000c090b2000410a3a00002007200ea745720d08200410300c080b2000410a3a00002009200b4572450d060c070b102c000b102a000b200b200441f0f5c100104a000b2003200541f0f5c100104a000b2003200541f0f5c100104a000b2003200441f0f5c100104a000b200c10300b200241d0016a24000bf90401017f230041106b22022400024002400240024002400240024002400240024020002802000e09000102030405060708090b200241003a000f20012002410f6a410110640c080b200241013a000f20012002410f6a41011064200041086a2001109e020c070b200241023a000f20012002410f6a41011064200041086a2001109e02200041c0006a2001109e020c060b200241033a000f20012002410f6a41011064200041086a2001109e02200041c0006a2001109e02200041f8006a2001109e020c050b200241043a000f20012002410f6a41011064200041086a2001109e02200041c0006a2001109e02200041f8006a2001109e02200041b0016a2001109e020c040b200241053a000f20012002410f6a41011064200041086a2001109e02200041c0006a2001109e02200041f8006a2001109e02200041b0016a2001109e02200041e8016a2001109e020c030b200241063a000f20012002410f6a41011064200041086a2001109e02200041c0006a2001109e02200041f8006a2001109e02200041b0016a2001109e02200041e8016a2001109e02200041a0026a2001109e020c020b200241073a000f20012002410f6a41011064200041086a2001109e02200041c0006a2001109e02200041f8006a2001109e02200041b0016a2001109e02200041e8016a2001109e02200041a0026a2001109e02200041d8026a2001109e020c010b200241083a000f20012002410f6a41011064200041086a2001109e02200041c0006a2001109e02200041f8006a2001109e02200041b0016a2001109e02200041e8016a2001109e02200041a0026a2001109e02200041d8026a2001109e0220004190036a2001109e020b200241106a24000bad0901027f230041106b220224000240024002400240024002400240024002400240024020002d00000e0a000102030405060708090a0b200241003a000f20012002410f6a410110640c090b200241013a000f20012002410f6a41011064200041046a200110ee010c080b200241023a000f20012002410f6a41011064200041016a210302400240024002400240200041246a2802000e0400010203000b200241003a000f20012002410f6a410110640c030b200241013a000f20012002410f6a41011064200041286a280200200041306a280200200110a6010c020b200241023a000f20012002410f6a410110640c010b200241033a000f20012002410f6a410110640b20012003412010640c070b200241033a000f20012002410f6a41011064200041186a21030240024002400240200041046a2802000e0400010203000b200241003a000f20012002410f6a410110642003200110d2020c090b200241013a000f20012002410f6a41011064200041086a280200200041106a280200200110a6012003200110d2020c080b200241023a000f20012002410f6a410110642003200110d2020c070b200241033a000f20012002410f6a410110642003200110d2020c060b200241043a000f20012002410f6a41011064200041016a210302400240024002400240200041186a2802000e0400010203000b200241003a000f20012002410f6a410110640c030b200241013a000f20012002410f6a410110642000411c6a280200200041246a280200200110a6010c020b200241023a000f20012002410f6a410110640c010b200241033a000f20012002410f6a410110640b20012003411410640c050b200241053a000f20012002410f6a41011064200220002d00013a000f20012002410f6a410110640c040b200241063a000f20012002410f6a410110642002200041086a360208200241086a200110cc020c030b200241073a000f20012002410f6a41011064200041046a2802002000410c6a280200200110a6010c020b200241083a000f20012002410f6a410110640c010b200241093a000f20012002410f6a4101106402400240024002400240024002400240200041046a2802000e0700010203040506070b200241003a000f20012002410f6a410110640c060b200241013a000f20012002410f6a41011064200041086a280200200041106a280200200110a6010c050b200241023a000f20012002410f6a41011064200041086a200110ee010c040b200241033a000f20012002410f6a410110640c030b200241043a000f20012002410f6a410110640c020b200241053a000f20012002410f6a410110640c010b200241063a000f20012002410f6a410110640b0240024002400240024020002802140e050001020304050b200241003a000f20012002410f6a410110640c040b200241013a000f20012002410f6a41011064200041186a200110ee010c030b200241023a000f20012002410f6a41011064200041186a200110ee012000411c6a200110ee010c020b200241033a000f20012002410f6a41011064200041186a200110ee012000411c6a200110ee010c010b200241043a000f20012002410f6a41011064200041186a200110ee012000411c6a200110ee010b200241106a24000b4201027f230041106b2202240002404101102f22030d00102a000b2000420137020420002003360200200241003a000f20002002410f6a41011064200241106a24000b2701017f02404104102f22020d00102a000b20004204370204200020023602002000410010a5010b8f0101027f230041306b220224002000410036020820004201370200200241186a4200370300200241106a4200370300200241086a42003703002002420037030002404120102f2203450d002002422037022420022003360220200241206a2002412010642000200228022022032002280228106402402002280224450d00200310300b200241306a24000f0b102a000b4301027f230041106b2202240002404104102f22030d00102a000b2000420437020420002003360200200241e40036020c20002002410c6a41041064200241106a24000b2e01017f230041106b2202240020024200370204200241002802dc944236020020002002108702200241106a24000b4201027f230041106b2202240002404104102f22030d00102a000b2000420437020420002003360200200241003a000f20002002410f6a41011064200241106a24000b6a01017f230041106b2202240020004100360208200042013702002002410036020c20002002410c6a410410642002410036020c20002002410c6a410410642002410036020c20002002410c6a410410642002410036020c20002002410c6a41041064200241106a24000b8f0101027f230041306b220224002000410036020820004201370200200241186a4200370300200241106a4200370300200241086a42003703002002420037030002404120102f2203450d002002422037022420022003360220200241206a2002412010642000200228022022032002280228106402402002280224450d00200310300b200241306a24000f0b102a000b2701017f02404104102f22020d00102a000b20004204370204200020023602002000410010a5010b4201027f230041106b2202240002404104102f22030d00102a000b20004204370204200020033602002002410036020c20002002410c6a41041064200241106a24000b4301027f230041106b220224002002420037020402404104102f22030d00102a000b20004204370204200020033602002000410010a5012002109502200241106a24000b5801017f230041106b220224002000410036020820004201370200200242003703082000200241086a41081064200242003703082000200241086a41081064200242003703082000200241086a41081064200241106a24000bc65e0b047f017e127f017e087f017e147f017e037f017e017f230041c0036b2202240020024188016a200110ac02024002400240024002402002280288010d00200228028c01210320012001280204220441016a2205360204200520012802084b0d0002402003450d004100210542002106034002402005417f470d0020064280808080705a0d072006422088a721050b200642ffffffff0f83200541016a2205ad4220868421062003417f6a22030d000b0b20012004360204200128020022052802042203450d01200528020022072d0000210420052003417f6a3602042005200741016a360200200441ff00714104460d02200041023602000c030b200041023602000c020b200041023602000c010b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004411874411875417f4c0d00410321030c010b02400240200128020022052802042203450d00200528020022042d0000210820052003417f6a360204410121092005200441016a36020041012104024002400240024002400240024020080e050006010203070b200241a0026a410472210a410021030340200128020022052802042204450d07200528020022072d0000210b20052004417f6a3602042005200741016a360200200a20036a200b3a0000200341016a2205210320054120470d000b200241a0026a41086a280200220541087420022802a402220c41187672210b200241ac026a2f0100200241ae026a2d0000411074724108742005411876722107200241b3026a2f0000200241b5026a2d000041107472210d200241ba026a2f0100200241bc026a2d000041107472210e200241c1026a2f0000200241c3026a2d000041107472210f200241af026a280000210a200241b6026a2801002110200241bd026a280000211141002104410121090c050b20024180016a200110ac022002280280010d05200128020022052802042203200228028401220a490d05200a417f4c0d1f02400240200a0d004101210b0c010b200a102f220b450d1b200b4100200a1087051a2001280200220528020421030b02402003200a490d00200b2005280200200a1085051a20052802042203200a4f0d03200a200341f0f5c100104a000b200b1030410321030c060b200241a0026a410472210a410021030340200128020022052802042204450d05200528020022072d0000210b20052004417f6a3602042005200741016a360200200a20036a200b3a0000200341016a2205210320054120470d000b200241a0026a41086a280200220541087420022802a402220c41187672210b200241ac026a2f0100200241ae026a2d0000411074724108742005411876722107200241b3026a2f0000200241b5026a2d000041107472210d200241ba026a2f0100200241bc026a2d000041107472210e200241c1026a2f0000200241c3026a2d000041107472210f200241af026a280000210a200241b6026a2801002110200241bd026a280000211141032104410121090c030b200128020022052802042203450d03200528020022042d0000210720052003417f6a3602042005200441016a360200200220073a00a4022001280200220528020422030d010c030b20052003200a6b36020420052005280200200a6a3602004102210441002109200a21070c010b200528020022042d0000210720052003417f6a3602042005200441016a360200200220073a00a502200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200220073a00a602200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200220073a00a702200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241a8026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241a9026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241aa026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241ab026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241ac026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241ad026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241ae026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241af026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241b0026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241b1026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241b2026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241b3026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241b4026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a3602042005200441016a360200200241b5026a20073a0000200128020022052802042203450d01200528020022042d0000210720052003417f6a360204410121092005200441016a360200200241b6026a220320073a0000200128020022052802042204450d01200528020022072d0000210b20052004417f6a3602042005200741016a360200200241b7026a200b3a0000200241a0026a41086a280200220541087420022802a402220c41187672210b200241ac026a2f0100200241ae026a2d0000411074724108742005411876722107200241b3026a2f0000200241b5026a2d000041107472210d200241af026a280000210a20032f01002110410421040b0240024002400240024002400240200128020022052802042203450d00200528020022082d0000211220052003417f6a3602042005200841016a360200024002400240024020120e03000102040b200241003602a00241c00021030340200128020022052802042208450d04200528020022122d000021132005201241016a36020020052008417f6a36020420022802a002220541c0004f0d05200241a0026a20056a41046a20133a00002002200541016a3602a0022003417f6a22030d000b2005413f490d05200241f8026a41026a200241ad026a2d00003a0000200220022f01a4023b018803200220022d00a6023a008a032002200241ab026a2f00003b01f802200241ae026a2801002114200241b5026a2800002115200241bc026a2802002116200241c3026a2800002117200241ca026a2801002109200241d1026a2800002113200241d8026a2802002112200241dc026a290200210620022800a7022118200241e8026a41026a200241b4026a2d00003a000020024180026a41026a200241bb026a2d00003a0000200241f0016a41026a200241c2026a2d00003a00002002419c026a41026a200241c9026a2d00003a000020024198026a41026a200241d0026a2d00003a00002002200241b2026a2f01003b01e8022002200241b9026a2f00003b0180022002200241c0026a2f01003b01f0012002200241c7026a2f00003b019c022002200241ce026a2f01003b01980220024194026a41026a200241d7026a2d00003a00002002200241d5026a2f00003b019402410021030c020b200241003602a00241c00021030340200128020022052802042208450d03200528020022122d000021132005201241016a36020020052008417f6a36020420022802a002220541c0004f0d06200241a0026a20056a41046a20133a00002002200541016a3602a0022003417f6a22030d000b2005413f490d06200241d5026a2900002119200241ae026a2801002114200241b5026a2800002115200241bc026a2802002116200241c3026a2800002117200241ca026a2801002109200241d1026a280000211320022800a7022118200241a8036a410b6a200241e0026a280000360000200220193703a803200220022f01a4023b018803200220022d00a6023a008a032002200241dd026a2800003602b00320024198036a41026a220520022d00aa033a0000200220193d01980320022900af032106200241f8026a41026a200241ad026a2d00003a00002002200241a0026a410b6a2f00003b01f802200241e8026a41026a200241b4026a2d00003a00002002200241b2026a2f01003b01e80220024180026a41026a200241bb026a2d00003a00002002200241b9026a2f00003b018002200241f0016a41026a200241c2026a2d00003a00002002200241c0026a2f01003b01f0012002419c026a41026a200241c9026a2d00003a00002002200241c7026a2f00003b019c0220024198026a41026a200241d0026a2d00003a00002002200241ce026a2f01003b01980220024194026a41026a20052d00003a0000200220022f0198033b0194022019421888a72112410121030c010b200241003602a00241c10021030340200128020022052802042208450d02200528020022122d000021132005201241016a36020020052008417f6a36020420022802a002220541c1004f0d07200241a0026a20056a41046a20133a00002002200541016a3602a0022003417f6a22030d000b200541c000490d07200241d5026a2900002119200241ae026a2801002114200241b5026a2800002115200241bc026a2802002116200241c3026a2800002117200241ca026a2801002109200241d1026a2800002113200241e4026a2d0000211a200241dd026a2d0000210520022800a7022118200241a8036a410d6a200241e2026a2f01003b0000200220193703a803200220022f01a4023b018803200220022d00a6023a008a03200220053a00b0032002200241de026a2801003600b1034102210320024198036a41026a220520022d00aa033a0000200220193d01980320022900af032106200241f8026a41026a200241a0026a410d6a2d00003a00002002200241ab026a2f00003b01f802200241e8026a41026a200241b4026a2d00003a00002002200241b2026a2f01003b01e80220024180026a41026a200241bb026a2d00003a00002002200241b9026a2f00003b018002200241f0016a41026a200241c2026a2d00003a00002002200241c0026a2f01003b01f0012002419c026a41026a200241c9026a2d00003a00002002200241c7026a2f00003b019c0220024198026a41026a200241d0026a2d00003a00002002200241ce026a2f01003b01980220024194026a41026a20052d00003a0000200220022f0198033b0194022019421888a721120b200241a8036a41026a20022d008a033a0000200241a0026a41026a20024191026a41026a2d00003a000020024198036a41026a200241f8026a41026a2d00003a0000200241ec016a41026a200241e8026a41026a2d00003a0000200241e8016a41026a20024180026a41026a2d00003a0000200220022f0091023b01a002200220022f0188033b01a803200220022f01f8023b019803200220022f01e8023b01ec01200220022f0180023b01e801200241e4016a41026a200241f0016a41026a2d00003a0000200241e0016a41026a2002419c026a41026a2d00003a0000200241dc016a41026a20024198026a41026a2d00003a0000200241d8016a41026a20024194026a41026a2d00003a0000200220022f01f0013b01e401200220022f019c023b01e001200220022f0198023b01dc01200220022f0194023b01d8010c080b2009200745720d06200b1030410321030c070b200220133a00a80341bea9c200412b200241a8036a41ecf6c00041bc8ec2001034000b41fef8c100411b419cf9c100102d000b200220133a00a80341bea9c200412b200241a8036a41ecf6c00041bc8ec2001034000b41fef8c100411b419cf9c100102d000b200220133a00a80341bea9c200412b200241a8036a41ecf6c00041bc8ec2001034000b41fef8c100411b419cf9c100102d000b410321030b200241d4016a41026a2205200241a0026a41026a2d00003a0000200241d0016a41026a2208200241a8036a41026a2d00003a0000200241cc016a41026a221b20024198036a41026a2d00003a0000200241c8016a41026a221c200241ec016a41026a2d00003a0000200241c4016a41026a221d200241e8016a41026a2d00003a0000200220022f01a0023b01d401200220022f01a8033b01d001200220022f0198033b01cc01200220022f01ec013b01c801200220022f01e8013b01c401200241c0016a41026a221e200241e4016a41026a2d00003a0000200241bc016a41026a221f200241e0016a41026a2d00003a0000200241b8016a41026a2220200241dc016a41026a2d00003a0000200241b4016a41026a2221200241d8016a41026a2d00003a0000200220022f01e4013b01c001200220022f01e0013b01bc01200220022f01dc013b01b801200220022f01d8013b01b40120034103460d01200241b0016a41026a20052d00003a0000200241ac016a41026a20082d00003a0000200241a8016a41026a201b2d00003a0000200241a4016a41026a201c2d00003a0000200241a0016a41026a201d2d00003a0000200220022f01d4013b01b001200220022f01d0013b01ac01200220022f01cc013b01a801200220022f01c8013b01a401200220022f01c4013b01a0012002419c016a41026a201e2d00003a000020024198016a41026a201f2d00003a000020024194016a41026a20202d00003a000020024190016a41026a20212d00003a0000200220022f01c0013b019c01200220022f01bc013b019801200220022f01b8013b019401200220022f01b4013b0190010b200128020022052802042208450d152005280200221b2d0000211c20052008417f6a3602042005201b41016a36020002400240024002400240201c0e0400011a041a0b200128020022052802042208450d192005280200221b2d0000211c20052008417f6a3602042005201b41016a3602000240024002400240024002400240024002400240201c0e0a00010203040506070809230b2001280200220528020422014104490d222005280200221b280000210820052001417c6a3602042005201b41046a3602002008418194ebdc034f0d22410021014101211e0c0a0b2002200110ac0220022802000d212001280200221b280204221c20022802042205490d212005417f4c0d230240024020050d00410121080c010b2005102f2208450d1f2008410020051087051a2001280200221b280204211c0b201c2005490d202008201b28020020051085051a201b28020422012005490d0d2005ad22194220862019842119201b200120056b360204201b201b28020020056a360200410021014102211e0c090b2001280200220528020422014108490d202005280200220829000021192005200141786a3602042005200841086a360200410021014103211e0c080b200241086a200110ac0220022802080d1f2001280200221b280204221c200228020c2205490d1f2005417f4c0d210240024020050d00410121080c010b2005102f2208450d1d2008410020051087051a2001280200221b280204211c0b201c2005490d1e2008201b28020020051085051a201b28020422012005490d122005ad22194220862019842119201b200120056b360204201b201b28020020056a360200410021014104211e0c070b200241106a200110ac0220022802100d1e2001280200221b280204221c20022802142205490d1e2005417f4c0d200240024020050d00410121080c010b2005102f2208450d1c2008410020051087051a2001280200221b280204211c0b201c2005490d1d2008201b28020020051085051a201b28020422012005490d122005ad22194220862019842119201b200120056b360204201b201b28020020056a360200410021014105211e0c060b200241a0026a200110ad0220022802a00222084102460d1d20022902a4022119410021014106211e0c050b200241286a200110ac0220022802280d1c200228022c221d200128020028020441186e22052005201d4b1bad42187e2219422088a70d1e2019a72205417f4c0d1e0240024020050d00410421080c010b2005102f2208450d1a0b2001200128020441016a221b360204200541186ead2119201b20012802084b0d1a02400240201d450d0002400340200241206a200110ac0220022802200d1e2001280200221b280204221c20022802242205490d1e2005417f4c0d220240024020050d004101211e0c010b2005102f221e450d1e201e410020051087051a2001280200221b280204211c0b024002400240201c2005490d00201e201b28020020051085052121201b280204221c2005490d10201b201c20056b360204201b201b28020020056a360200200241186a200110ac02024020022802180d002001280200221c280204221f200228021c221b490d00201b417f4c0d2602400240201b0d00410121200c010b201b102f2220450d2220204100201b1087051a2001280200221c280204211f0b0240201f201b490d002020201c280200201b108505211f201c280204221e201b490d13201c201e201b6b360204201c201c280200201b6a3602002019422088a7221c2019a7470d04201c41016a221e201c4f0d030c270b202010300b2005450d210b201e10300c200b201c4101742220201e201e2020491b221e4104201e41044b1bad42187e2222422088a745410274211e2022a7212002400240201c0d00200241003602a0020c010b200241043602a802200220083602a0022002201c41186c3602a4020b200241a8036a2020201e200241a0026a106920022802b003211e20022802a8034101460d0220022802ac032108201942808080807083201e41186ead8421190b2008201c41186c6a221c2005360204201c2021360200201c41106a201bad2222422086202284370200201c410c6a201f360200201c41086a200536020020194280808080107c2119201d417f6a221d0d000b20012001280204417f6a3602040c020b201e450d200c1b0b2001201b417f6a3602042008450d1d0b410021014107211e0c040b200241a0026a200110ae0220022802a0022208450d1b20022902a4022119410021014108211e0c030b200241306a200110ac0220022802300d1a2001280200221b280204221c20022802342205490d1a2005417f4c0d1c0240024020050d00410121080c010b2005102f2208450d182008410020051087051a2001280200221b280204211c0b201c2005490d192008201b28020020051085051a201b280204221c2005490d0f201b201c20056b360204201b201b28020020056a360200024020012802002201280204221b4104490d002005ad221942208620198421192001280200220528000021232001201b417c6a3602042001200541046a360200410021014109211e0c030b20050d190c1a0b200241386a200110ac0220022802380d192001280200221b280204221c200228023c2205490d192005417f4c0d1b0240024020050d00410121080c010b2005102f2208450d172008410020051087051a2001280200221b280204211c0b201c2005490d182008201b28020020051085051a201b28020422012005490d0f2005ad22194220862019842119201b200120056b360204201b201b28020020056a36020041002101410a211e0c010b200128020022052802042208450d182005280200221b2d0000211c20052008417f6a3602042005201b41016a360200024002400240024002400240024002400240201c0e050001020304210b2001280200220528020422014104490d2020052802002208280000211e20052001417c6a3602042005200841046a360200410021014101212442002119420021220c050b200241e8006a200110ac0220022802680d1f20012802002205280204221b200228026c2208490d1f2008417f4c0d210240024020080d004101211e0c010b2008102f221e450d1d201e410020081087051a20012802002205280204211b0b201b2008490d1b201e200528020020081085051a2005280204221b2008490d0e2005201b20086b3602042005200528020020086a3602000240024020012802002205280204221b4104490d002008ad21192005280200221c35000021222005201b417c6a3602042005201c41046a360200200241a0026a41047221204100211b034020012802002205280204221c450d012005280200221d2d0000211f2005201c417f6a3602042005201d41016a3602002020201b6a201f3a0000201b41016a2205211b20054120470d000b20012802002205280204221b41044f0d010b20080d1c0c200b20022802a4022125200241a0026a41086a2802002126200241ae026a2d00002127200241ac026a2f01002128200241b5026a2d00002129200241b3026a2f0000212a200241bc026a2d0000212b200241ba026a2f0100212c200241c3026a2d0000212d200241c1026a2f0000212e200241af026a280000212f200241b6026a2801002130200241bd026a28000021312005280200221c28000021232005201b417c6a3602042005201c41046a360200200241a0026a200110ae0220022802a0022232450d1a200241a8026a280200213320022802a4022121200241e0006a200110ac0220022802600d19410421202002280264223420012802002802044104762205200520344b1b221f4104742205417f4c0d210240201f450d002005102f2220450d1d0b2001200128020441016a2205360204024002400240200520012802084b0d002034450d014100211b4100211d02400240034020012802002205280204221c4104490d022005280200222428000021352005201c417c6a3602042005202441046a360200200241d8006a200110ac0220022802580d022001280200221c2802042224200228025c2205490d022005417f4c0d270240024020050d00410121360c010b2005102f2236450d232036410020051087051a2001280200221c28020421240b20242005490d012036201c28020020051085052136201c28020422242005490d15201c202420056b360204201c201c28020020056a3602000240201d201f470d00201f41016a221c201f490d28201f4101742224201c2024201c4b1b221c4104201c41044b1b221c41ffffffff0071201c464102742124201c410474211c02400240201f0d00200241003602a0020c010b200220203602a002200241043602a8022002201f4104743602a4020b200241a8036a201c2024200241a0026a106920022802b003211c024020022802a8034101470d00201c450d290c240b20022802ac032120201c410476211f0b2020201b6a221c2035360200201c41086a2005ad2237422086203784370200201c41046a2036360200201b41106a211b2034201d41016a221d470d000b20012001280204417f6a3602040c040b203610300b201d450d00202041086a2105034002402005280200450d002005417c6a28020010300b200541106a2105201b41706a221b0d000b0b201f41ffffffff00710d1a0c1b0b20012005417f6a3602042020450d1a410021340b200241d0006a200110ac0220022802500d17200228025421382001200128020441016a2205360204200520012802084b0d172002420037029c0302402038450d0041002139034020012802002205280204221b4104490d182005280200221c280000213a2005201b417c6a3602042005201c41046a360200200241c8006a200110ac0220022802480d18200228024c221c200128020028020441047622052005201c4b1b2205410474221b417f4c0d230240024020050d00410421360c010b201b102f2236450d1f0b2001200128020441016a221b3602042005ad2137024002400240201b20012802084b0d00201c450d0102400240034020012802002205280204221b4104490d032005280200221d28000021352005201b417c6a3602042005201d41046a360200200241c0006a200110ac0220022802400d032001280200221b280204221d20022802442205490d032005417f4c0d290240024020050d00410121240c010b2005102f2224450d252024410020051087051a2001280200221b280204211d0b201d2005490d022024201b28020020051085052124201b280204221d2005490d18201b201d20056b360204201b201b28020020056a36020002402037422088223ba7221b2037a7470d00201b41016a221d201b490d2a201b410174223c201d201d203c491b221d4104201d41044b1b221d41ffffffff0071201d46410274213c201d410474211d02400240201b0d00200241003602a0020c010b200241043602a802200220363602a0022002203b4204863e02a4020b200241a8036a201d203c200241a0026a106920022802b003211d20022802a8034101460d0220022802ac032136203742808080807083201d410476ad8421370b2036201b4104746a221b2024360204201b2035360200201b41086a2005ad223b422086203b8437020020374280808080107c2137201c417f6a221c0d000b20012001280204417f6a3602040c040b201d450d270c220b202410300b02402037422088a72205450d002005410474210a203641086a2105034002402005280200450d002005417c6a28020010300b200541106a2105200a41706a220a0d000b0b203742ffffffff0083500d1a203610300c1a0b2001201b417f6a3602042036450d190b203941016a2139200220373702a402200220363602a002200241a8036a20024198036a203a200241a0026a10af02024020022802a803221c450d00024020022802b0032205450d002005410474211b201c41086a2105034002402005280200450d002005417c6a28020010300b200541106a2105201b41706a221b0d000b0b20022802ac0341ffffffff0071450d00201c10300b20392038470d000b0b20282027411074724108742026411876722127202a202941107472211b202c202b41107472211c202e202d41107472211d20264108742025411876722224410876210520224220862222201984211920024188036a41086a20024198036a41086a2802002236360200200220022903980322373703880320012001280204417f6a360204200241e8026a41086a2036360200200220373703e8022024411874202541ffffff077172213641002101410221240c060b200241f0006a200110ac0220022802700d1e20012802002205280204221b20022802742208490d1e2008417f4c0d200240024020080d004101211e0c010b2008102f221e450d1c201e410020081087051a20012802002205280204211b0b201b2008490d07201e200528020020081085051a200528020422012008490d102008ad21192005200120086b3602042005200528020020086a36020041002101410321240c020b200241a0026a410472211e41002108034020012802002205280204221b450d1e2005280200221c2d0000211d2005201b417f6a3602042005201c41016a360200201e20086a201d3a0000200841016a2205210820054120470d000b200241bb026a2800002136200241c2026a2f01002127200241bf026a2f00002108200241c1026a2d0000211b200241b8026a2f01002101200241a0026a41086a2903002137200241a0026a41106a290300211920022802a4022105200241be036a200241ba026a2d00003a0000200220193702b403200220373702ac03200220013b01bc03200220053602a803200541087421012008201b41107472210520022900b30322194280808080708321222037421888a7210820022800bb03212320022800ab03211e410421240c030b200241f8006a200110ac0220022802780d1c20012802002205280204221b200228027c2208490d1c2008417f4c0d1e0240024020080d004101211e0c010b2008102f221e450d1a201e410020081087051a20012802002205280204211b0b02400240201b2008490d00201e200528020020081085051a2005280204220120084f0d012008200141f0f5c100104a000b201e10300c1d0b2008ad21192005200120086b3602042005200528020020086a36020041002101410521240b420021220b0b0b20024180026a41086a200241e8026a41086a280200360200200220022903e80237038002200120247221242022201942ffffffff0f83842119410121010b200241f0016a41086a222520024180026a41086a28020036020020022002290380023703f0012000413b6a201d4110763a0000200041396a201d3b0000200041346a201c4110763a0000200041326a201c3b01002000412d6a201b4110763a00002000412b6a201b3b0000200041226a20054110763a0000200041206a20053b0100200041d0006a2034360200200041cc006a201f360200200041c8006a2020360200200041c4006a2033360200200041c0006a20213602002000413c6a2032360200200041356a20313600002000412e6a2030360100200041276a202f360000200041236a20273600002000411c6a2036360200200041186a2023360200200041106a20193702002000410c6a2008360200200041086a201e3602002000202436020420004180016a200f4110763a0000200041fe006a200f3b0100200041f9006a200e4110763a0000200041f7006a200e3b0000200041f2006a200d4110763a0000200041f0006a200d3b0100200041e3006a200c4110763a00002000200c3b0061200041e4006a200b360200200041e8006a2007360200200041ec006a200a360200200041f3006a2010360000200041fa006a2011360100200041e0006a20043a0000200041dc006a2025280200360200200041d4006a20022903f001370200200020022f01b0013b00810120004183016a200241b0016a41026a2d00003a000020004184016a20033a000020004188016a20183600002000418f016a201436000020004196016a2015360000200020022f01ac013b00850120004187016a200241ac016a41026a2d00003a00002000418e016a200241a8016a41026a2d00003a00002000418c016a20022f01a8013b000020004195016a200241a4016a41026a2d00003a0000200020022f01a4013b0093012000419c016a200241a0016a41026a2d00003a0000200020022f01a0013b009a012000419d016a2016360000200041a3016a2002419c016a41026a2d00003a0000200020022f019c013b00a101200041a4016a2017360000200041aa016a20024198016a41026a2d00003a0000200041a8016a20022f0198013b0000200041ab016a2009360000200041b1016a20024194016a41026a2d00003a0000200020022f0194013b00af01200041b2016a2013360000200041b8016a20024190016a41026a2d00003a0000200020022f0190013b00b6012000201a3a00c501200041bd016a2006370000200041b9016a2012360000200020013602000c180b201e10300c160b200128020022052802042201450d1520052001417f6a3602042005200528020041016a3602000c150b200041023602000c150b2005200141f0f5c100104a000b2005201c41f0f5c100104a000b201b201e41f0f5c100104a000b2008201b41f0f5c100104a000b2005202441f0f5c100104a000b2005201d41f0f5c100104a000b2008200141f0f5c100104a000b2005200141f0f5c100104a000b2005200141f0f5c100104a000b2005201c41f0f5c100104a000b2005200141f0f5c100104a000b200241a0026a41086a20024198036a41086a28020036020020022002290398033703a002200241a0026a10e30120012001280204417f6a3602040b02402034450d002034410474210a4100210503400240202020056a220141086a280200450d00200141046a28020010300b200a200541106a2205470d000b0b201f41ffffffff0071450d010b202010300b02402033450d002033410c6c21012032210503400240200541046a280200450d00200528020010300b2005410c6a2105200141746a22010d000b0b2021450d002021410c6c450d00203210300b2008450d040b201e10300c030b102a000b02402019422088a72205450d00200541186c21012008210503400240200541046a280200450d00200528020010300b0240200541106a280200450d002005410c6a28020010300b200541186a2105200141686a22010d000b0b2019a72205450d01200541186c450d010b200810300b2000410236020020034103460d00200441ff01714102470d002007450d00200b10300b200241c0036a24000f0b102c000bfb0201057f02400240200128020022022802042203450d00200228020022042d0000210520022003417f6a360204410121032002200441016a3602000240200541037122024103460d0002400240024020020e03000102000b20054102762102410021030c040b200128020022022802042203450d02200228020022012d0000210420022003417f6a360204410121032002200141016a3602002004410874200572220141ffff0371418002490d03200141fcff03714102762102410021030c030b2001280200220228020422034103490d012002280200220141026a2d0000210420012f000021062002200141036a36020020022003417d6a3602042006200441107472410874200572220241808004492103200241027621020c020b0240200541034d0d000c020b2001280200220128020422054104490d0120012802002203280000210220012005417c6a3602042001200341046a36020020024180808080044921030c010b410121030b20002002360204200020033602000be60101047f0240024002400240200128020022022802042203450d00200228020022042d0000210520022003417f6a3602042002200441016a36020020050e020203010b200041023602000f0b200041023602000f0b200041003602000f0b024002402001280200220228020422034104490d0020022802002204280000210520022003417c6a3602042002200441046a36020020012802002202280204220141034b0d010b200041023602000f0b200020053602042000410136020020022802002203280000210420022001417c6a3602042002200341046a360200200041086a20043602000bd10503037f017e087f230041306b22022400200241086a200110ac02024002402002280208450d00200041003602000c010b024002400240200228020c22032001280200280204410c6e2204200420034b1bad420c7e2205422088a70d002005a72204417f4c0d00024002400240024020040d00410421060c010b2004102f2206450d010b2001200128020441016a22073602042004410c6e2108024002400240200720012802084b0d0020030d01410021030c070b200041003602000c010b41002109410021074100210a024003402002200110ac0220022802000d012001280200220b280204220c20022802042204490d012004417f4c0d050240024020040d004101210d0c010b2004102f220d450d04200d410020041087051a2001280200220b280204210c0b0240200c2004490d00200d200b2802002004108505210d200b280204220c2004490d05200b200c20046b360204200b200b28020020046a3602000240200a2008470d002009200a41016a220b2009200b4b1b220b4104200b41044b1bad420c7e2205422088a745410274210b2005a7210c02400240200a0d00200241003602200c010b2002410436022820022007360224200220063602200b200241106a200c200b200241206a10692002280218210b024020022802104101470d00200b0d060c080b20022802142106200b410c6e21080b200620076a220b200d360200200b41046a2004ad2205422086200584370200200941026a21092007410c6a21072003200a41016a220a460d070c010b0b200d10300b20004100360200200a450d002006210403400240200441046a280200450d00200428020010300b2004410c6a2104200741746a22070d000b0b2008450d052008410c6c450d05200610300c050b102a000b2004200c41f0f5c100104a000b102c000b200128020421070b2000200836020420002006360200200041086a200336020020012007417f6a3602040b200241306a24000bd115030a7f017e087f230041e0006b2204240002400240024002400240024002400240024002400240024002400240024020012802042205450d00200128020021060c010b41b801102f2205450d0141002106200541003b01b6012005410036020020012005360204200141003602000b034020052f01b6012207410c6c210841002109417f210a200541046a220b210c02400340024020082009470d002007210a0c020b200c280200210d200a41016a210a2009410c6a2109200c41046a210c417f200d200247200d20024b1b220d4101460d000b0240200d41016a0e020100010b200441d0006a41086a200341086a280200220c36020020042003290200220e370350200041086a200520096a2209412c6a220d2802003602002000200941246a22092902003702002009200e370200200d200c3602000c0e0b02402006450d002006417f6a21062005200a4102746a41b8016a28020021050c010b0b200441086a200341086a22092802003602002004200329020037030002402007410a4b0d00200441c0006a41086a200928020036020020042003290200370340200a41016a21080240200a20074f220c0d00200b20084102746a200b200a4102746a2007200a6b4102741086051a0b200b200a4102746a2002360200200441d0006a41086a220d200441c0006a41086a28020036020020042004290340370350200541306a21090240200c0d0020092008410c6c6a2009200a410c6c6a2007200a6b410c6c1086051a0b2009200a410c6c6a22092004290350370200200941086a200d2802003602002005200741016a3b01b6010c0b0b410521094100210602400240200a41054f0d0041042109200a210c0c010b4105210c02400240200a417b6a0e020201000b200a41796a210c41012106410621090c010b4100210c410121060b41b801102f220d450d00200d41003b01b601200d4100360200200d20052f01b60122072009417f736a220a3b01b601200b20094102746a2802002103200441d0006a41086a200541306a220f2009410c6c6a220841086a28020036020020042008290200370350200a410c4f0d012007200941016a22086b200a470d02200d41046a200b20084102746a200a4102741085051a200d41306a200f2008410c6c6a200a410c6c1085051a200520093b01b601200441306a41086a200441d0006a41086a220728020036020020042004290350370330200441c0006a41086a220b200441086a28020036020020042004290300370340200d200520061b220941046a210a0240200c41016a220620092f01b60122084b220f0d00200a20064102746a200a200c4102746a2008200c6b4102741086051a0b200a200c4102746a20023602002007200b28020036020020042004290340370350200941306a210a0240200f0d00200a2006410c6c6a200a200c410c6c6a2008200c6b410c6c1086051a0b200a200c410c6c6a220c2004290350370200200c41086a200441d0006a41086a22072802003602002009200841016a3b01b601200441206a41086a2210200441306a41086a2211280200220936020020042004290330220e370320200441106a41086a220b20093602002004200e370310024002400240200528020022090d004100210f0c010b4100210f20032112200d2113034020052f01b40121022010200b28020036020020042004290310370320200922062f01b6012205410b490d024100210841042109024020024105490d0020022109024002402002417b6a0e020201000b200241796a210241012108410621090c010b4100210241012108410521090b41e801102f220d450d03200d41003b01b601200d4100360200200d20062f01b60122142009417f736a220c3b01b601200641046a221520094102746a28020021032007200641306a22162009410c6c6a220a41086a2802003602002004200a290200370350200c410c4f0d062014200941016a220a6b200c470d07200d41046a2015200a41027422146a200c4102741085051a200d41306a2016200a410c6c6a200c410c6c1085051a200620093b01b601200441c0006a41086a2215200728020036020020042004290350370340200d2f01b601220c41016a210a200c410c4f0d08200520096b2209200a470d09200f41016a210f200d41b8016a200620146a41b8016a20094102741085051a4100210902400340200d20094102746a41b8016a280200220a20093b01b401200a200d3602002009200c4f0d0120092009200c496a2209200c4d0d000b0b2011201528020036020020042004290340370330200d200620081b220a41046a21080240200241016a2209200a2f01b601220c4b22140d00200820094102746a200820024102746a200c20026b4102741086051a0b2008200241027422156a20123602002007201028020036020020042004290320370350200a41306a2105024020140d0020052009410c6c6a20052002410c6c6a200c20026b410c6c1086051a0b200c41016a210820052002410c6c6a22052004290350370200200541086a2007280200360200200a41b8016a21050240200241026a2214200c41026a22124f0d00200520144102746a200520094102746a200c20026b4102741086051a0b200520094102746a2013360200200a20083b01b6010240200920124f0d00200a20156a41bc016a210903402009280200220c200241016a22023b01b401200c200a360200200941046a210920082002470d000b0b200b2011280200360200200420042903303703102006210520032112200d2113200628020022090d000b0b2007200b280200360200200420042903103703502001280204220c450d082001280200210a41e801102f2209450d012009200c3602b801200941003b01b60120094100360200200c41003b01b401200c2009360200200120093602042001200a41016a360200200a200f470d0920092f01b601220c410b4f0d0a2009200c41016a220a3b01b6012009200c410c6c6a220241306a2004290350370200200241386a200441d8006a2802003602002009200c4102746a41046a2003360200200941b8016a200a4102746a200d360200200d200a3b01b401200d20093602002001200128020841016a3602080c0c0b200641046a21090240200520024d220c0d00200920024102746a220d41046a200d200520026b4102741086051a0b200920024102746a2012360200200441d0006a41086a220a200441106a41086a28020036020020042004290310370350200241016a2109200641306a210d0240200c0d00200d2009410c6c6a200d2002410c6c6a200520026b410c6c1086051a0b200541016a2108200d2002410c6c6a220d2004290350370200200d41086a200a280200360200200641b8016a210d200541026a210a0240200c0d002002410274200d6a41086a200d20094102746a200520026b4102741086051a0b200620083b01b601200d20094102746a20133602002009200a4f0d0a200541016a210a20062009417f6a22094102746a41bc016a210c0340200c280200220d200941016a22093b01b401200d2006360200200c41046a210c200a2009470d000c0b0b0b102a000b200a410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b200c410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b200a410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b2001200128020841016a3602080b200041003602000b200441e0006a24000bcf0701077f230041a0046b220224000240024002400240024020014184016a22032d00004103470d00200241206a200141e0001085051a410021010c010b20024186016a200341c2001085051a200141e8006a2802002104200141e4006a28020021054101210302400240024020012d00600e03000201020b200241f2016a200141e3006a2d00003a0000200241c0036a200141f4006a290000370300200241c5036a200141f9006a2900003700002002200141e1006a2f00003b01f0012002200141ec006a2900003703b803410021030c010b2004450d00200510300b200241ec016a41026a2206200241f0016a41026a2d00003a0000200241d0026a41086a2207200241b8036a41086a290300370300200241d0026a410d6a2208200241b8036a410d6a290000370000200220022f01f0013b01ec01200220022903b8033703d00202402003450d00200041013b0001200041013a0000200041036a41003a00000c030b200241db016a2007290300370000200241e0016a2008290000370000200220022f01ec013b01c801200220043600cf01200220053600cb01200220022903d0023700d301200220062d00003a00ca01200241b8036a41046a200141e0001085051a200241d0026a200241b8036a41e4001085051a200241f0016a200241d0026a41046a41e0001085051a200241003602d802200242013703d0020240024020022802f0014101460d00200241003a00b803200241d0026a200241b8036a41011064200241f8016a200241d0026a10b1020c010b200241013a00b803200241d0026a200241b8036a41011064200241f0016a410472200241d0026a109b020b20022802d00221040240024020022802d8022205418102490d00200241b8036a20042005106520024186016a200241b8036a4120200241c8016a10fa0121040c010b20024186016a20042005200241c8016a10fa0121040b024020022802d402450d0020022802d00210300b2004450d01200241186a200241c8016a41186a290300370300200241106a200241c8016a41106a290300370300200241086a200241c8016a41086a290300370300200220022903c801370300200241206a200241f0016a41e0001085051a410121010b200041086a200241206a41e0001085051a200041e8006a20013a0000200041003a0000200041e9006a2002290300370000200041f1006a200241086a290300370000200041f9006a200241106a29030037000020004181016a200241186a2903003700000c020b20004180083b0001200041013a0000200041036a41003a0000200241f0016a10b2020b2003450d00200110b2020b200241a0046a24000bb30501027f230041106b22022400024002400240024002400240024002400240024002402000280200417f6a0e0a000102030405060708090a0b200241003a00082001200241086a41011064200220002802043602082001200241086a410410640c090b200241013a00082001200241086a4101106420002802042000410c6a280200200110a6010c080b200241023a00082001200241086a410110642002200041086a2903003703082001200241086a410810640c070b200241033a00082001200241086a4101106420002802042000410c6a280200200110a6010c060b200241043a00082001200241086a4101106420002802042000410c6a280200200110a6010c050b200241053a00082001200241086a41011064024020002802044101460d00200241003a00082001200241086a410110640c050b200241013a00082001200241086a410110642002200041086a2802003602082001200241086a4104106420022000410c6a2802003602082001200241086a410410640c040b200241063a00082001200241086a410110642000280204210320012000410c6a280200220010a5012000450d032003200041186c6a210003402003280200200341086a280200200110a6012003410c6a280200200341146a280200200110a601200341186a22032000470d000c040b0b200241073a00082001200241086a410110642000280204210320012000410c6a280200220010a5012000450d0220032000410c6c6a210003402003280200200341086a280200200110a6012003410c6a22032000470d000c030b0b200241083a00082001200241086a4101106420002802042000410c6a280200200110a6012002200041106a2802003602082001200241086a410410640c010b200241093a00082001200241086a4101106420002802042000410c6a280200200110a6010b200241106a24000bce0501027f0240024020002802004101460d000240024002400240024002400240200041086a280200417f6a0e09080008010208030405060b200041106a280200450d072000410c6a28020010300f0b200041106a280200450d062000410c6a28020010300f0b200041106a280200450d052000410c6a28020010300f0b0240200041146a2802002201450d002000410c6a2802002102200141186c210103400240200241046a280200450d00200228020010300b0240200241106a280200450d002002410c6a28020010300b200241186a2102200141686a22010d000b0b200041106a2802002202450d04200241186c450d04200028020c10300f0b0240200041146a2802002201450d002000410c6a28020021022001410c6c210103400240200241046a280200450d00200228020010300b2002410c6a2102200141746a22010d000b0b200041106a2802002202450d032002410c6c450d03200028020c10300c030b200041106a280200450d022000410c6a28020010300f0b200041106a280200450d012000410c6a28020010300f0b02400240024020002d0004417f6a0e0403000103020b02402000410c6a280200450d00200041086a28020010300b0240200041c4006a2802002201450d002000413c6a28020021022001410c6c210103400240200241046a280200450d00200228020010300b2002410c6a2102200141746a22010d000b0b0240200041c0006a2802002202450d002002410c6c450d00200028023c10300b0240200041d0006a2802002202450d0020024104742101200041c8006a28020041086a2102034002402002280200450d002002417c6a28020010300b200241106a2102200141706a22010d000b0b0240200041cc006a28020041ffffffff0071450d00200028024810300b200041d4006a10e3010f0b2000410c6a280200450d01200041086a28020010300f0b2000410c6a280200450d00200041086a28020010300f0b0b950201067f230041206b22022400024002402000280210220341046a280200220420002802042205200028020022066a22076b2001490d00200328020021040c010b0240200720016a22062007490d00200441017422052006200520064b1b22064108200641084b1b21060240024020040d00200241003602100c010b200241106a41086a410136020020022004360214200220032802003602100b200220064101200241106a1069200241086a2802002106024020022802004101460d00200320022802042204360200200341046a200636020020002802042105200028020021060c020b2006450d00102a000b102c000b2004200620016a22016a200420066a20051086051a20002001360200200241206a24000bc80101017f02400240024002402002450d0020014100480d01024002400240200328020022040d0020010d01410121020c020b0240200328020422030d0020010d01410121020c020b2001102f2202450d042002200420031085051a200410300c010b2001102f2202450d030b20002002360204410021020c030b2000200136020420004101360200200041086a41003602000f0b20004101360200200041086a41003602000f0b2000200136020441012101410121020b20002002360200200041086a20013602000bde07010e7f230041206b22022400200141186a2802002103200141146a2802002104200128021021052001280204210620012802002107200141086a2f010022084180fe037141087621092001410c6a2f0100220a210b024002400240024003400240024002400240024002400240024002402007417e6a0e020105000b0240200841ff01714102460d0020084101712101410021082001450d002009210c0c040b4102210820074101470d002006450d00200641ff014b0d012006417f6a210c41012107410021060c020b0240200b41ff01714102470d004102210b0c040b200b41017121014100210b2001450d03200a4180fe0371410876210c410221070c020b200641817e6a210641ff01210c410121070b410221080b200041086a2802002201200041046a280200470d03024020074103470d00200545210d2005210e0c020b024002402005450d000240024020074102470d004100210f200b41ff0171220e4102460d01200e410146210f0c010b0240200b41ff0171220f4102460d00200841ff0171410146200f4101466a210f0c010b4100210f200841ff0171220e4102460d00200e410146210f0b0240024020040d004100210e0c010b2003450d02200420036e20042003704100476a210e0b417f200f200e6a220e200e200f491b210f0c040b024020074102470d004100210f200b41ff0171220e4102460d04200e410146210f0c040b0240200b41ff0171220f4102460d00200841ff0171410146200f4101466a210f0c040b4100210f200841ff0171220e4102460d03200e410146210f0c030b4190e5c100411941ec92c200102d000b2005450d052004450d0502400240024020032004200420034b1b22010e020001020b4100410041cc93c2001033000b4101410141dc93c2001033000b200420016b2104200520016a210e20052d000041047420052d000172210c410321070240200041086a2802002201200041046a280200460d00200e21050c030b200e45210d410321070b4100210f0240200d0d002004450d002003450d06200420036e20042003704100476a210f0b200e21050b2001417f200f41016a220e200e200f491b6a220f2001490d052001410174220e200f200e200f4b1b220f4108200f41084b1b210f0240024020010d00200241003602100c010b2002410136021820022001360214200220002802003602100b2002200f4101200241106a10692002280208210f20022802004101460d0220002002280204360200200041046a200f3602000b200028020020016a200c3a0000200041086a200141016a3602000c000b0b200f450d02102a000b200241206a24000f0b4190e5c100411941ec92c200102d000b102c000bf70203057f017e067f230041106b220224000240024020014102490d000240024020002802102000280200220320002802042204200041146a2802002205200520044b1b10880522060d0020052004490d010c020b2006417f4a0d010b2000200041106a2205290200370200200041086a220629020021072006200541086a29020037020020022007370308200041106a2108024020014103490d00200041246a210520002001417f6a22064104746a21094102210a02400340024002402005417c6a220b280200200320042005280200220c200c20044b1b108805220d0d00200c2004490d010c040b200d417f4a0d020b2006450d042005416c6a220c41086a200541046a290200370200200c200b290200370200200541106a21052000200a4104746a2108200a41016a210a2006417f6a22064101470d000b200921080c010b2005416c6a21080b2008200436020420082003360200200820022903083702080b200241106a24000f0b20012001419cf8c0001033000b941d01127f230041a0056b220224000240024002402001410c6a2802002203450d00200141046a2104200141106a2105200128020422062003417f6a220741306c6a210820024190026a41046a2109200241086a41e4016a210a20024190026a41086a210b20024190026a411d6a210c034020082802002203280210210d2003280208210e4102210f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006200741306c6a22062802040e0412000102120b2003280214417e6a0e03020f03260b200628020821072003280214417d6a0e020304250b4103210f02400240024020032802140e051212010200120b2005200328021c20032802186b41017420032802206b41016a10b8010c110b2005200328021c20032802186b41017420032802206b10b8010c100b200510b8020c0f0b2003411c6a280200220f20032802182207490d04200f200d4b0d05200f20076b2110200e20076a211120032802202207410176210f024002402007410171450d002010200f4d0d0141012112200f41016a21072011200f6a2d0000410f7121130c0f0b4100211202402010200f490d0041002113200f21070c0f0b200f201041e097c200104a000b200f201041f097c2001033000b2003411c6a280200220f20032802182208490d05200f200d4b0d06200f20086b210f200e20086a2106200328022022084101762103024002402008410171450d00200f20034d0d0141012107200341016a2108200620036a2d0000410f71210d0c0c0b410021070240200f2003490d004100210d200321080c0c0b2003200f41e097c200104a000b2003200f41f097c2001033000b200341246a21030c010b200341306a21030b0240200741104f0d004104210f20032007410c6c6a22032802004102460d0b200510b8022005200710b6010240024020062d000c4101460d00200241c8046a41186a4200370300200241c8046a41106a4200370300200241c8046a41086a4200370300200242003703c8040c010b200241c8046a41186a200841256a290000370300200241c8046a41106a2008411d6a290000370300200241c8046a41086a200841156a2900003703002002200829000d3703c8040b20012802002106200341086a280200210f200341046a28020021080240024020032802004101470d00200f2008490d0741012103200f200d4d0d01200f200d41d49bc2001042000b200f2008490d0741002103200f200d4b0d080b200220033602a0042002200f20086b3602a8042002200e20086a3602a404200241f8046a200510b90220024190026a2006200241c8046a200241a0046a200241f8046a10ba02200228029002210f2002280294022110200241086a200b4185021085051a0c0b0b200741104188fbc0001033000b2007200f41c49cc2001048000b200f200d41c49cc2001042000b2008200f41c49cc2001048000b200f200d41c49cc2001042000b2008200f41d49bc2001048000b2008200f41e49bc2001048000b200f200d41e49bc2001042000b2002200d3a009102200220073a0090022002200f20086b360298022002200620086a36029402200520024190026a10b5010b2005410010b6014104210f0c010b200220133a009102200220123a0090022002201020076b360298022002201120076a36029402200520024190026a10b5010240024020062d000c4101460d00200241c8046a41186a4200370300200241c8046a41106a4200370300200241c8046a41086a4200370300200242003703c8040c010b200241c8046a41186a200841256a290000370300200241c8046a41106a2008411d6a290000370300200241c8046a41086a200841156a2900003703002002200829000d3703c8040b200128020021062003412c6a280200210f200328022821080240024020032802244101470d00200f2008490d0341012103200f200d4d0d01200f200d41d49bc2001042000b200f2008490d0341002103200f200d4b0d040b200220033602a0042002200f20086b3602a8042002200e20086a3602a404200241f8046a200510b90220024190026a2006200241c8046a200241a0046a200241f8046a10ba02200228029002210f2002280294022110200241086a200b4185021085051a0b0240024002400240200f417e6a2203410320034103491b0e0401020003010b200128020c2203450d06200341306c20012802046a41506a220341086a2106200341046a21072003280200210d4103210802400240024002400240024020032802040e03000102180b200d280214417e6a0e03020202170b41024103200d280214417d6a4102491b21084100210f0c160b20032802082103200d280214417d6a0e020102150b410121080c140b2003410f4f0d130c120b2003410f490d110c120b200128020c2203450d062001280204220a2003417f6a220d41306c6a220341086a2106200341046a2107200328020021094103210802400240024002400240024020032802040e03000102150b2009280214417e6a0e03020202140b410241032009280214417d6a4102491b21084100210f0c130b2003280208210e2009280214417d6a0e020102120b410121080c110b200e410f4f0d100c0f0b200e410f490d0e0c0f0b200128020c2203450d0620012003417f6a220336020c2001280204200341306c6a22032802044104460d06200328020022032003280200417f6a220f3602000240200f0d0002402003410c6a280200450d00200328020810300b200341046a220f200f280200417f6a220f360200200f0d00200310300b0240200128020c2203450d00200341306c20012802046a41506a220341086a2106200341046a21072003280200210d4103210802400240024002400240024020032802040e03000102130b200d280214417e6a0e03020202120b41024103200d280214417d6a4102491b21084100210f0c110b20032802082103200d280214417d6a0e020102100b410121080c0f0b2003410f4f0d0e0c0d0b2003410f490d0c0c0d0b200041023602000c140b200f450d09200128020c2203450d06200341306c20012802046a41506a220141086a2108200141046a2106200128020021074103210f02400240024002400240024020012802040e030001020e0b2007280214417e6a0e030202020d0b410241032007280214417d6a4102491b210f410021030c0c0b200128020821012007280214417d6a0e0201020b0b4101210f0c0a0b2001410f4f0d090c080b2001410f490d070c080b2008200f41d49bc2001048000b2008200f41e49bc2001048000b200f200d41e49bc2001042000b41a8f9c000419d0141c8fac0001050000b41a8f9c000419d0141d8fac0001050000b41a8f9c000419d0141e8fac0001050000b41a8f9c000419d0141f8fac0001050000b200141016a21034102210f0b200820033602002006200f36020020002010360204200041013602000c0a0b200941206a200a41206a2d00003a0000200941186a200a41186a290200370200200941106a200a41106a290200370200200941086a200a41086a2902003702002009200a290200370200024041f001102f220f450d00200f2010360208200f410c6a200241086a41e4011085051a200f4281808080103702000240200128020c2203200141086a280200470d00200410bb02200128020c21030b2001280204200341306c6a220341003602042003200f360200200320022f00c8043b002d200341086a200229029002370200200341106a200b290200370200200341186a20024190026a41106a290200370200200341206a20024190026a41186a290200370200200341256a200c2900003700002003412f6a200241c8046a41026a2d00003a00002001200128020c41016a220336020c0c070b102a000b200341016a210f410221080b2006200f36020020072008360200200128020c21030c040b200e41016a210f410221080b2006200f3602002007200836020002400240200128021022084125490d002001411c6a2802002108200141186a280200210f0c010b200141156a210f0b200241003a009402200241003602900220024190026a200f200f20086a10bc02200241c8046a41086a220e20024190026a41086a220f290300370300200241c8046a41106a220420024190026a41106a2208290300370300200241c8046a41186a220520024190026a41186a2206290300370300200241c8046a41206a221020024190026a41206a2207290300370300200241c8046a41286a220b20024190026a41286a220928020036020020022002290390023703c8042001413c6a280200210c200241f8046a41206a2211200a200d41306c6a2201412c6a2d00003a0000200241f8046a41186a220a200141246a290000370300200241f8046a41106a220d2001411c6a290000370300200241f8046a41086a2212200141146a2900003703002002200129000c3703f80402402003280200220128020041016a220341014d0d0020012003360200200f200e2903003703002008200429030037030020062005290300370300200720102903003703002009200b280200360200200241a0046a41086a22032012290300370300200241a0046a41106a220e200d290300370300200241a0046a41186a220d200a290300370300200241a0046a41206a220a20112d00003a0000200220022903c80437039002200220022903f8043703a0042000410036020020002002290390023702042000410c6a200f290300370200200041146a20082903003702002000411c6a2006290300370200200041246a20072903003702002000412c6a2009280200360200200041306a200c360200200041346a20022903a0043702002000413c6a2003290300370200200041c4006a200e290300370200200041cc006a200d290300370200200041d4006a200a2d00003a0000200041d8006a20013602000c060b00000b200341016a210f410221080b2006200f36020020072008360200200128020c21030b200428020022062003417f6a220741306c6a210820030d000b0b200041023602000b200241a0056a24000f0b41acf8c00041eb004198f9c000102d000bc50201067f230041106b22012400024002400240200028022c2202450d0002400240200028020022034125490d002000410c6a22042802002103200041086a28020021050c010b200041056a2105200021040b2003450d0120042003417f6a2203360200200520036a2d0000210520002002417f6a220336022c2003410171450d0002400240200028020022044125490d002000410c6a22022802002103200041086a28020021060c010b200041056a21062004210320002102412421040b024020032004470d0020012000410110bd02024020012802004101470d00200141086a2802000d0441d099c200411141e499c200102d000b2000410c6a22022802002103200041086a28020021060b200620036a200541f001713a00002002200228020041016a3602000b200141106a24000f0b418b96c200412241b096c2001050000b102a000ba60201047f200128022c220241017621030240024002400240024020024101710d0002400240200128020022024125490d002001410c6a2802002102200141086a28020021010c010b200141056a21010b20022003490d0220002001360200410021010c010b02400240200128020022024125490d002001410c6a2802002104200141086a28020021050c010b200141056a2105200221040b20042003490d020240024020024125490d002001410c6a2802002102200141086a28020021010c010b200141056a21010b200220034d0d0320002005360200200041096a200120036a2d000041f001713a0000410121010b200020013a0008200020033602040f0b2003200241e096c2001042000b2003200441f096c2001042000b20032002418097c2001033000b810d03047f017e047f230041b0076b22052400200341086a2802002106200328020421070240024002400240024002400240200328020022084101470d002006417f4c0d030240024020060d00410121030c010b2006102f2203450d050b2003200720061085051a2006ad220942208620098421094100210a0c010b0240024020064120460d002006417f4c0d040240024020060d00410121030c010b2006102f2203450d060b20032007200610850521074130102f2203450d05200341043a00002003200636002c200320063600282003200736002420032002290000370001200341096a200241086a290000370000200341116a200241106a290000370000200341196a200241186a2900003700000c010b200541086a41026a200741026a2d00003a0000200541f8036a2007410f6a29000037030020054180046a200741176a29000037030020054188046a2007411f6a2d00003a0000200520072f00003b0108200520072900073703f003200728000321030b2005412c6a41026a2207200541086a41026a2d00003a0000200541306a41086a220a200541f0036a41086a220b290300370300200541306a41106a220c200541f0036a41106a290300370300200541306a41186a220d200541f0036a41186a280200360200200520052f01083b012c200520052903f00337033020064120470d01200541df056a200a290300370000200541e7056a200c290300370000200541ef056a200d2d00003a0000200520052f012c3b01d005200520052903303700d705200520033600d305200520072d00003a00d2052001280200210620012802042103200b200441086a280200360200200520042902003703f003200541306a2006200541d0056a200541f0036a200328020c1103000240200528023022030d0002400240200441046a2802000d0020042d00080d004130102f2206450d06200641003a0000200620052903d005370001200641096a200541d8056a290300370000200641116a200541e0056a290300370000200641196a200541e8056a2903003700000c010b4130102f2206450d05200641013a0000200620052903d005370001200641096a200541d8056a290300370000200641116a200541e0056a290300370000200641196a200541e8056a2903003700000b20004101360200200020063602040c060b20054190026a41086a200541d0056a41086a29030037030020054190026a41106a200541d0056a41106a29030037030020054190026a41186a200541d0056a41186a290300370300200520052903d00537039002200529023421094101210a0b200541086a41186a220720054190026a41186a290300370300200541086a41106a220420054190026a41106a290300370300200541086a41086a220120054190026a41086a2903003703002005200529039002370308200541d0056a20032009422088a710ce0320052d00d105210b20052d00d0052106200541f0036a200541d0056a41027241de011085051a20064101470d0302402009a7450d00200310300b024002402008450d00200541f0036a41186a200241186a290000370300200541f0036a41106a200241106a290000370300200541f0036a41086a200241086a290000370300200520022900003703f0030c010b200541f0036a41186a200541086a41186a290300370300200541f0036a41106a200541086a41106a290300370300200541f0036a41086a200541086a41086a290300370300200520052903083703f0030b200541d0056a41186a2203200541f0036a41186a290300370300200541d0056a41106a2207200541f0036a41106a290300370300200541d0056a41086a2202200541f0036a41086a290300370300200520052903f0033703d0054130102f2206450d02200641033a0000200620052903d0053700012006200b41ff01714100473a0021200641096a2002290300370000200641116a2007290300370000200641196a2003290300370000200541306a20054190026a41dc011085051a20004101360200200020063602040c040b20004101360200200020033602040c030b102c000b102a000b20054190026a200541f0036a41026a41dc011085051a200541306a20054190026a41dc011085051a200041086a2009370200200041106a200541306a41dc011085051a200041ec016a200a3a000020002003360204200020052903083700ed01200041f5016a2001290300370000200041fd016a200429030037000020004185026a2007290300370000200041003602000b200541b0076a24000be00102047f017e230041206b22012400024002400240200041046a28020020002802082202470d00200241016a22032002490d02200241017422042003200420034b1b22034104200341044b1bad42307e2205422088a74541027421032005a721040240024020020d00200141003602100c010b200141186a41043602002001200241306c360214200120002802003602100b200120042003200141106a1069200141086a280200210220012802004101460d0120002001280204360200200041046a200241306e3602000b200141206a24000f0b2002450d00102a000b102c000b9b0301087f230041106b2203240020032000200220016b10bd020240024020032802004101470d00200341086a2802000d0141d099c200411141e499c200102d000b02400240200028020022044125490d002000410c6a22052802002106200041086a28020021070c010b200041056a21072004210620002105412421040b024002400240200620044f0d00034020022001460d02200720066a20012d00003a0000200141016a21012004200641016a2206470d000b200421060b2005200636020020012002460d012000410c6a2108200041056a2109034002400240200028020022074125490d00200028020c210620002802082105200821040c010b200721062000210420092105412421070b20012d0000210a024020062007470d0020032000410110bd02024020032802004101470d00200341086a2802000d0541d099c200411141e499c200102d000b200028020c210620002802082105200821040b200520066a200a3a00002004200428020041016a3602002002200141016a2201470d000c020b0b200520063602000b200341106a24000f0b102a000bbe0301057f02400240200128020022034125490d002001410c6a2802002104200321050c010b41242105200321040b0240200520046b2002490d00200041003602000f0b024002400240200420026a22022004490d004100417f2002417f6a677620024102491b220441016a22052004490d000240024020034125490d002001410c6a2802002104200141086a2802002102200321060c010b200141056a210241242106200321040b200420054b0d0102400240200541244b0d000240200341244b0d00200041003602000f0b200141003a0004200141056a200220041085051a20012004360200200210300c010b20062005460d002005102f210702400240200341244b0d0002402007450d002007200220041085051a0c020b2000200536020420004101360200200041086a41013602000f0b2007450d042007200220052006200620054b1b1085051a200210300b200141013a0004200120053602002001410c6a2004360200200141086a20073602000b200041003602000f0b2000200536020420004101360200200041086a41003602000f0b41c29ac200412041e49ac200102d000b2000200536020420004101360200200041086a41013602000b0900200041003602000b0900200041013602000b2200200041013602002003200428020011020002402004280204450d00200310300b0b5701017f230041206b22032400200341086a200141086a28020036020020032001290200370300200341106a41086a200241086a2802003602002003200229020037031020002003200341106a10c202200341206a24000bb80501047f23004190016b2203240002400240024002402001280208410f490d0041fc8fc20020012802002204410f1088050d00024020022802002200450d00200241046a280200450d00200010300b200141046a280200450d01200410300c010b0240200041086a2802002204280224450d002004106c0b200420032903683703002004410036022420042003290330370328200441206a200341e8006a41206a280200360200200441186a200341e8006a41186a290300370300200441106a200341e8006a41106a290300370300200441086a200341e8006a41086a290300370300200441306a200341306a41086a290300370300200441386a200341306a41106a290300370300200441c0006a200341306a41186a290300370300200441c8006a200341306a41206a290300370300200441d0006a200341306a41286a290300370300200441d8006a200341306a41306a290300370300200441003a0060200441e1006a2003290008370000200441e9006a200341086a41086a290000370000200441f1006a200341086a41106a290000370000200441f9006a200341086a41186a29000037000020044180016a200341276a290000370000200028020022042802200d01200241086a2802002100200228020021052002280204210620044100360220200441286a2202200229030042017c37030020042802300d0220044100360230200441386a220220022903002000ad420020051b7c370300200341086a41086a200141086a28020036020020032001290200370308200341306a41086a200036020020032006360234200320053602302003200410c302200441c0006a200341086a200341306a2003280200200328020410c4020b20034190016a24000f0b41b082c2004110200341306a41c082c20041d483c2001034000b41b082c2004110200341306a41c082c20041e483c2001034000bb30302047f017e230041106b22022400024002400240024002400240024020012d0088020d00410021030c010b410121030240200141c0006a41fc8ac200411010e60222040d00417f21010c010b02400240200428020022054106490d00200428020c2105200428020821040c010b200441086a21040b2004450d012005450d01024020042005417f6a41186c6a22042802000d0020012802000d03200141003602002001200129030842017c37030820012802100d0420014100360210417f21010c010b20012802000d04200441086a22053502002106200141003602002001200129030842017c37030820012802100d0520014100360210200141186a2201200129030020067c370300417f210120052802004104490d00200428020028000021010b2000200136020420002003360200200241106a24000f0b418486c20041fc00418087c2001050000b41b082c2004110200241086a41c082c20041b483c2001034000b41b082c2004110200241086a41c082c20041c483c2001034000b41b082c2004110200241086a41c082c20041b483c2001034000b41b082c2004110200241086a41c082c20041c483c2001034000b8c16050e7f017e017f017e037f23004180056b22052400024002400240024020012802082206417f4c0d002001280200210702400240024002400240024002400240024002400240024020060d00410121080c010b2006102f2208450d010b2008200720061085052109024002402000280204220a450d002000280200210b0c010b418c0c102f220a450d014100210b200a41003b018a0c200a41003602002000200a360204200041003602000b0340200a2f018a0c220c410c6c210d4178210e200a41046a220f210841002110024003400240200d0d00200c21100c020b0240024020092008280200200828020822112006200620114b1b10880522120d0020062011490d03200620114721110c010b4101211120124100480d020b2008410c6a2108201041016a2110200e41807f6a210e200d41746a210d20110d000b02402006450d00200910300b200a200e6b210b0c0f0b0240200b450d00200b417f6a210b200a20104102746a418c0c6a280200210a0c010b0b0240200c410a4b0d00201041016a211102402010200c4f220d0d00200f2011410c6c6a200f2010410c6c6a200c20106b410c6c1086051a0b200f2010410c6c6a22082006360208200820063602042008200936020020054180046a20054180036a41f8001085051a200a4188016a21080240200d0d00200820114107746a200820104107746a200c20106b4107741086051a0b200820104107746a220b4200370200200b41086a20054180046a41f8001085051a200a200c41016a3b018a0c0c0c0b410521084100211202400240201041054f0d00410421082010210d0c010b4105210d024002402010417b6a0e020201000b201041796a210d41012112410621080c010b4100210d410121120b418c0c102f2211450d00201141003b018a0c201141003602002011200a2f018a0c220b2008417f736a22103b018a0c200f2008410c6c6a220e2902042113200e280200210c20054180046a200a4188016a220720084107746a4180011085051a2010410c4f0d01200b200841016a220e6b2010470d02201141046a200f200e410c6c6a2010410c6c1085051a20114188016a2007200e4107746a20104107741085051a200a20083b018a0c20054180036a20054180046a4180011085051a2011200a20121b220841046a21100240200d41016a221220082f018a0c220e4b220b0d0020102012410c6c6a2010200d410c6c6a200e200d6b410c6c1086051a0b2010200d410c6c6a22102006360208201020063602042010200936020020054180046a20054180016a41f8001085051a20084188016a21060240200b0d00200620124107746a2006200d4107746a200e200d6b4107741086051a0b2006200d4107746a220b4200370200200b41086a20054180046a41f8001085051a2008200e41016a3b018a0c20054180026a20054180036a4180011085051a200520054180026a4180011085052112024002400240200a28020022080d00410021070c010b410021072011211420132115200c21160340200a2f01880c211020124180016a20124180011085051a200822092f018a0c220f410b490d024100210a41042108024020104105490d0020102108024002402010417b6a0e020201000b201041796a21104101210a410621080c010b410021104101210a410521080b41bc0c102f2211450d03201141003b018a0c20114100360200201120092f018a0c22172008417f736a220d3b018a0c20092008410c6c6a220641086a2902002113200641046a280200210c20124180046a20094188016a221820084107746a4180011085051a200d410c4f0d062017200841016a220e6b200d470d07201141046a200641106a200d410c6c1085051a20114188016a2018200e4107746a200d4107741085051a200920083b018a0c20124180036a20124180046a4180011085051a20112f018a0c220d41016a2106200d410c4f0d08200f20086b22082006470d09200741016a21072011418c0c6a2009200e4102746a418c0c6a20084102741085051a4100210802400340201120084102746a418c0c6a280200220620083b01880c200620113602002008200d4f0d0120082008200d496a2208200d4d0d000b0b20124180026a20124180036a4180011085051a20112009200a1b220641046a210e0240201041016a220820062f018a0c220d4b220f0d00200e2008410c6c6a200e2010410c6c6a200d20106b410c6c1086051a0b200e2010410c6c6a220e2015370204200e201636020020124180046a20124180016a4180011085051a20064188016a210a0240200f0d00200a20084107746a200a20104107746a200d20106b4107741086051a0b200d41016a210e200a20104107746a20124180046a4180011085051a2006418c0c6a210a0240201041026a2216200d41026a220f4f0d00200a20164102746a200a20084102746a200d20106b4102741086051a0b200a20084102746a20143602002006200e3b018a0c02402008200f4f0d00200620104102746a41900c6a210803402008280200220d201041016a22103b01880c200d2006360200200841046a2108200e2010470d000b0b201220124180026a4180011085051a2009210a2011211420132115200c2116200928020022080d000b0b20124180046a20124180011085051a2000280204220d450d082000280200210641bc0c102f2208450d012008200d36028c0c200841003b018a0c20084100360200200d41003b01880c200d2008360200200020083602042000200641016a36020020062007470d0920082f018a0c220d410b4f0d0a2008200d41016a22063b018a0c2008200d410c6c6a221041086a2013370200201041046a200c3602002008200d4107746a4188016a20124180046a4180011085051a2008418c0c6a20064102746a2011360200201120063b01880c201120083602002000200028020841016a3602080c0d0b200941046a21080240200f20104d220d0d0020082010410c6c6a2206410c6a2006200f20106b410c6c1086051a0b20082010410c6c6a220820153702042008201636020020124180046a20124180011085051a201041016a210820094188016a21060240200d0d00200620084107746a200620104107746a200f20106b4107741086051a0b200f41016a2111200620104107746a20124180046a4180011085051a2009418c0c6a2106200f41026a210e0240200d0d00201041027420066a41086a200620084102746a200f20106b4102741086051a0b200920113b018a0c200620084102746a20143602002008200e4f0d0b200f41016a211120092008417f6a22084102746a41900c6a210d0340200d2802002206200841016a22083b01880c20062009360200200d41046a210d20112008470d000c0c0b0b102a000b2010410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b200d410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2006410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b102c000b2000200028020841016a3602080b20012802082106200128020021070b20054180036a41086a200241086a280200360200200520022902003703800302400240200028020c22084106490d00200041186a2802002108200041146a280200210d0c010b200041146a210d0b20012802042111024002400240200d450d0020080d010b410221082011450d01200710300c010b2005200636028804200520113602840420052007360280042008410c6c200d6a41746a20054180046a10e10221080b200b20054180036a20082008410247712003200410e20220054180056a24000b7301027f230041206b22032400024002402002417f4c0d000240024020020d00410121040c010b2002102f2204450d020b20032002360204200320043602002004200120021085051a200320023602082003410036021020002003200341106a10c202200341206a24000f0b102c000b102a000bb80301047f23004190016b220424000240200041086a2802002205280224450d002005106c0b200520042903683703002005410036022420052004290330370328200541206a200441e8006a41206a280200360200200541186a200441e8006a41186a290300370300200541106a200441e8006a41106a290300370300200541086a200441e8006a41086a290300370300200541306a200441306a41086a2206290300370300200541386a200441306a41106a290300370300200541c0006a200441306a41186a290300370300200541c8006a200441306a41206a290300370300200541d0006a200441d8006a290300370300200541d8006a200441306a41306a290300370300200541003a0060200541e1006a2004290008370000200541e9006a200441086a41086a2207290000370000200541f1006a200441086a41106a290000370000200541f9006a200441086a41186a29000037000020054180016a200441276a290000370000200028020021052007200241086a280200360200200420022902003703082006200341086a2802003602002004200329020037033020052001200441086a200441306a10c70220044190016a24000bc60403017f017e047f230041b0016b220424002004200010c3020240024020032802000d00420021050c010b200341086a35020021050b024002400240024020002802200d00200428020421062004280200210720004100360220200041286a2208200829030042017c37030020002802300d0120004100360230200041386a2208200829030020057c37030020012802082208417f4c0d02200128020021094101210102402008450d002008102f2201450d040b2001200920081085052101200420083602502004200836024c20042001360248200441086a20004198016a200441c8006a1082030240024020042802084101460d00200441c0006a200441246a280200360200200441386a2004411c6a290200370300200441306a200441146a2902003703002004200429020c370328200441c8006a200041c0006a1083030240024020080d00410121000c010b2008102f2200450d060b200441a4016a2008360200200420003602a0012000200920081085051a200441a8016a2008360200200441286a200441c8006a10840321000c010b200441106a280200200441146a28020041e4006c6a4188016a21000b200441086a41086a200241086a28020036020020042002290200370308200441c8006a41086a200341086a280200360200200420032902003703482000200441086a200441c8006a2007200610c402200441b0016a24000f0b41b082c2004110200441c8006a41c082c20041d483c2001034000b41b082c2004110200441c8006a41c082c20041e483c2001034000b102c000b102a000bda0301027f23004190016b22042400024002402003417f4c0d000240024020030d00410121050c010b2003102f2205450d020b20052002200310850521050240200041086a2802002202280224450d002002106c0b200220042903683703002002410036022420022004290330370328200241206a200441e8006a41206a280200360200200241186a200441e8006a41186a290300370300200241106a200441e8006a41106a290300370300200241086a200441e8006a41086a290300370300200241306a200441306a41086a290300370300200241386a200441306a41106a290300370300200241c0006a200441306a41186a290300370300200241c8006a200441306a41206a290300370300200241d0006a200441d8006a290300370300200241d8006a200441306a41306a290300370300200241003a0060200241e1006a2004290008370000200241e9006a200441086a41086a290000370000200241f1006a200441086a41106a290000370000200241f9006a200441086a41186a29000037000020024180016a200441276a29000037000020002802002102200420033602102004200336020c200420053602082004410036023020022001200441086a200441306a10c70220044190016a24000f0b102c000b102a000bd90504067f017e027f027e230041206b220224000240024020012802042203450d00200128020022042d0000210520012003417f6a22063602042001200441016a360200024002400240200541037122074103460d0002400240024020070e03000102000b2005410276ad21080c040b410121072006450d0220042d0001210620012003417e6a3602042001200441026a3602002006410874200572220141ffff0371418002490d02200141fcff0371410276ad21080c030b4101210720064103490d01200441036a2d0000210620042f0001210920012003417c6a3602042001200441046a3602002009200641107472410874200572220141808004490d012001410276ad21080c020b02400240024002402005410276220a0e0d00030303010303030303030302030b20064104490d052004350001210820012003417b6a3602042001200441056a36020020084280808080045421074200210b0c060b20064108490d04200429000121082001200341776a3602042001200441096a3602002008428080808080808080015421074200210b0c050b20064110490d03200441096a290000210b2004290001210820012003416f6a3602042001200441116a360200200b428080808080808080015421070c040b200541334b0d02200a41046a21062003417e6a2103200441026a21044100210541012107200241186a2109420021084200210b03402003417f460d012004417f6a310000210c2001200336020420012004360200200241106a200c4200200541037441f800711089052003417f6a2103200441016a21042009290300200b84210b20022903102008842108200541016a220541ff01712006490d000b2002427f427f41e800200a4103746b41f800711083052008200229030058200b200241086a290300220c58200b200c511b21070c030b0c020b4200210b410021070c010b410121070b20002008370308200041106a200b37030020002007ad370300200241206a24000bf10f03057f027e037f230041d0006b2202240002400240200128020422030d00200041073a00000c010b200128020022042d0000210520012003417f6a22063602042001200441016a36020002400240024002400240024002400240024002400240024002400240024002400240024020050e0700010203040506070b200041003a00000c110b2002200110c90202402002290300a70d00200241106a290300210720022903082108200041013a0000200041086a2008370300200041106a20073703000c110b200041073a00000c100b0240200110a8012207a74101710d00200041023a0000200020074208883e00010c100b200041073a00000c0f0b2006450d0d20042d0001210520012003417e6a22093602042001200441026a360200200220053a002c20090d060c0d0b2006450d0b20042d0001210520012003417e6a22093602042001200441026a360200200220053a002c20090d060c0b0b2003417e6a2105200241286a410472210a41002103034020062003460d07200420036a220941016a2d0000210b200120053602042001200941026a360200200a20036a200b3a00002002200341016a22093602282005417f6a21052009210320094120470d000b200041086a200241286a410b6a2f00003b00002000410a6a200241356a2d00003a00002000410f6a200241286a41126a2f01003b0000200041116a2002413c6a2d00003a0000200041186a200241c3006a2d00003a0000200041166a200241286a41196a2f00003b0000200220022f012c3b0124200220022d002e3a0026200241366a28010021012002413d6a2800002103200241c4006a2902002107200228002f2105200041036a20022d00263a0000200020022f01243b0001200041196a2007370000200041126a20033600002000410b6a2001360000200041046a2005360000200041053a00000c0c0b200241186a2001109b0120022802180d0220012802042205200228021c2203490d022003417f4c0d060240024020030d00410121090c010b2003102f2209450d082009410020031087051a200128020421050b20052003490d012009200128020020031085052109200128020422052003490d08200041063a00002001200520036b360204200041086a2003ad2207422086200784370000200041046a20093600002001200128020020036a3602000c0b0b200041073a00000c0a0b200910300b200041073a00000c080b20042d0002210520012003417d6a22093602042001200441036a360200200220053a002d2009450d0620042d0003210520012003417c6a22093602042001200441046a360200200220053a002e2009450d0620042d0004210520012003417b6a22093602042001200441056a360200200220053a002f2009450d0620042d0005210520012003417a6a22093602042001200441066a360200200241306a20053a00002009450d0620042d000621052001200341796a22093602042001200441076a360200200241316a20053a00002009450d0620042d000721052001200341786a22093602042001200441086a360200200241326a20053a00002009450d06200241336a20042d00083a00002001200341776a3602042001200441096a3602002000200229022c370001200041033a00000c070b20042d0002210520012003417d6a22093602042001200441036a360200200220053a002d2009450d0420042d0003210520012003417c6a22093602042001200441046a360200200220053a002e2009450d0420042d0004210520012003417b6a22093602042001200441056a360200200220053a002f2009450d0420042d0005210520012003417a6a22093602042001200441066a360200200241306a20053a00002009450d0420042d000621052001200341796a22093602042001200441076a360200200241316a20053a00002009450d0420042d000721052001200341786a22093602042001200441086a360200200241326a20053a00002009450d0420042d000821052001200341776a22093602042001200441096a360200200241336a20053a00002009450d0420042d000921052001200341766a220936020420012004410a6a360200200241346a20053a00002009450d0420042d000a21052001200341756a220936020420012004410b6a360200200241356a20053a00002009450d0420042d000b21052001200341746a220936020420012004410c6a360200200241366a20053a00002009450d0420042d000c21052001200341736a220936020420012004410d6a360200200241376a20053a00002009450d0420042d000d21052001200341726a220936020420012004410e6a360200200241386a20053a00002009450d0420042d000e21052001200341716a220936020420012004410f6a360200200241396a20053a00002009450d0420042d000f21052001200341706a22093602042001200441106a3602002002413a6a220b20053a00002009450d042002413b6a20042d00103a000020012003416f6a3602042001200441116a360200200241286a410b6a2f00002101200241356a2d00002103200241366a280100210520022f012c210920022d002e2104200228002f21062000410f6a200b2f01003b00002000410b6a20053600002000410a6a20033a0000200041086a20013b0000200041046a2006360000200041036a20043a0000200020093b0001200041043a00000c060b200041073a00000c050b102c000b102a000b2003200541f0f5c100104a000b200041073a00000c010b200041073a00000b200241d0006a24000beb0301017f230041106b22022400024002400240024002400240024002400240024002400240024020002802000e0c000102030405060708090a0b0c0b200241003a000f20012002410f6a410110640c0b0b200241013a000f20012002410f6a410110640c0a0b200241023a000f20012002410f6a410110640c090b200241033a000f20012002410f6a410110640c080b200241043a000f20012002410f6a4101106420002802042000410c6a280200200110a6010c070b200241053a000f20012002410f6a4101106420002802042000410c6a280200200110a6010c060b200241063a000f20012002410f6a41011064200041086a2001109d020c050b200241073a000f20012002410f6a41011064200041086a2001109d020c040b200241083a000f20012002410f6a4101106420002802042000410c6a280200200110a6012002200041106a360204200241046a200110cc020c030b200241093a000f20012002410f6a4101106420002802042000410c6a280200200110a601200041106a200110cd020c020b2002410a3a000f20012002410f6a41011064200041086a2001109d022002200041d0036a360208200241086a200110cc020c010b2002410b3a000f20012002410f6a41011064200041086a2001109d02200041d0036a200110cd020b200241106a24000bb80303017f027e027f230041306b2202240002400240024002400240024020002802002200290300220342c000544100200041086a29030022045022051b0d0020034280800154410020051b0d01200342808080800454410020051b0d0220047920037942c0007c20044200521ba7220541e7004d0d0341fe85c100413641a887c100102d000b20022003a74102743a00182001200241186a410110640c030b20022003a74102744101723b01182001200241186a410210640c020b20022003a74102744102723602182001200241186a410410640c010b20024133200541037622054102746b3a00182001200241186a41011064200029030021032002200041086a2903002204370310200220033703080240411020056b450d00200541706a21000340200220033c00182001200241186a410110642003420888200442388684210320044208882104200041016a22052000492106200521002006450d000b20022003370308200220043703100b200320048450450d010b200241306a24000f0b2002412c6a4100360200200241286a41bc8ec2003602002002420137021c200241c486c100360218200241086a200241186a10c003000b9a0201017f230041106b220224000240024002400240024002400240024020002d00000e0700010203040506070b200241003a000f20012002410f6a410110640c060b200241013a000f20012002410f6a410110642002200041086a360208200241086a200110cc020c050b200241023a000f20012002410f6a410110642001200041016a410410640c040b200241033a000f20012002410f6a410110642001200041016a410810640c030b200241043a000f20012002410f6a410110642001200041016a411010640c020b200241053a000f20012002410f6a410110642001200041016a412010640c010b200241063a000f20012002410f6a41011064200041046a2802002000410c6a280200200110a6010b200241106a24000ba70a02057f017e230041a00b6b22022400024002400240024002400240024002400240024002400240024020012d00000e0b0102030405060a07080900010b200141046a2802002103200241086a200141086a41c8031085051a200241b8076a200341e8031085051a200241d0036a200241b8076a10ce0241e803102f2201450d0b2001200241d0036a41e8031085052101200041086a200241086a41c8031085051a2000410a3a0000200041046a2001360200200310300c0a0b200241d8036a22042001410c6a2802003602002002200141046a2902003703d003200141146a28020021052002200141106a2802002203200141186a2802004198046c6a3602c407200220033602c007200220053602bc07200220033602b807200241b8076a200310cf02210120022802c007220620022802c40720066b4198046d10a40141002802fce441410010a4012000410c6a2004280200360200200041046a20022903d003370200200041186a200120036b4198046d360200200041146a2005360200200041106a2003360200200041003a00000c090b200241d8036a22042001410c6a2802003602002002200141046a2902003703d003200141146a28020021052002200141106a2802002203200141186a2802004198046c6a3602c407200220033602c007200220053602bc07200220033602b807200241b8076a200310cf02210120022802c007220620022802c40720066b4198046d10a40141002802fce441410010a4012000410c6a2004280200360200200041046a20022903d003370200200041186a200120036b4198046d360200200041146a2005360200200041106a2003360200200041013a00000c080b200241d8036a22042001410c6a2802003602002002200141046a2902003703d003200141146a28020021052002200141106a2802002203200141186a2802004198046c6a3602c407200220033602c007200220053602bc07200220033602b807200241b8076a200310cf02210120022802c007220620022802c40720066b4198046d10a40141002802fce441410010a4012000410c6a2004280200360200200041046a20022903d003370200200041186a200120036b4198046d360200200041146a2005360200200041106a2003360200200041023a00000c070b200041033a0000200041106a200141106a290300370300200041046a200141046a2902003702002000410c6a2001410c6a2802003602000c060b2000410c6a2001410c6a280200360200200041046a200141046a290200370200200041106a200141106a41c8031085051a200041043a00000c050b2000410c6a2001410c6a280200360200200041046a200141046a290200370200200041206a200141206a41c8031085051a200041053a0000200041186a200141186a280200360200200041106a200141106a2902003702000c040b200041073a00002000410c6a2001410c6a280200360200200041046a200141046a2902003702000c030b200041083a0000200041046a200141046a2802003602000c020b200041093a00002000410c6a2001410c6a280200360200200041046a200141046a2902003702000c010b200141086a290300210720012d00012103200241b8076a200141106a41f0001085051a200241b4046a200241b8076a41e8006a28020036020020022002290398083702ac04024020022802b8074102460d00200241b8076a10b2020b200020033a0001200041106a4102360200200041086a2007370300200041146a200241d0036a41e8001085051a200041063a00000b200241a00b6a24000f0b102a000bf40609067f017e097f027e037f027e017f017e017f230041d00f6b220224000240024020002802082203200028020c460d00200241bc046a41046a2104200241f40b6a41046a21050340200020034198046a3602082002200341980410850522062d00004108460d02200341186a2802002107200341106a29030021082003410c6a2801002109200341086a280100210a200341046a280100210b20032d0001210c20032d0000210d200641a8086a2003411c6a220e41cc031085051a20064188086a41186a220f20034180046a29030037030020064188086a41106a2210200341f8036a29030037030020064188086a41086a2211200341f0036a2903003703002006200341e8036a2903003703880820034188046a290300211220034190046a2903002113200641f40b6a200e41cc031085051a41002103024002400240024002400240024002400240200d0e080801020304050600080b2006200b3602a0042006200a36029c042006200b360298042006200b200941e8036c6a3602a404200641c00f6a20064198046a10be03200641bc046a200641a8086a41cc031085051a20064198046a41186a200f29030037030020064198046a41106a201029030037030020064198046a41086a201129030037030020062006290388083703980420062802c00f211420062802c40f211520062802c80f2116410721032013211720122118200721192008211a200c211b0c070b200641bc046a200e41bc031085051a410121030c050b2004200541c8031085051a410221030c040b410321030c030b2004200541c8031085051a410421030c020b2004200541c8031085051a410521030c010b200641bc046a200e41c4031085051a410621030b200b2114200a211520092116200721192008211a0b200141186a2019360200200141106a201a3703002001410c6a2016360100200141086a2015360100200141046a2014360100200141016a201b3a0000200120033a00002001411c6a200641bc046a41cc031085051a20014190046a201737030020014188046a201837030020014180046a20064198046a41186a290300370300200141f8036a20064198046a41106a290300370300200141f0036a20064198046a41086a290300370300200141e8036a20062903980437030020014198046a210120002802082203200028020c470d000b0b200241083a00000b200241d00f6a240020010bcd0901047f230041106b2202240002400240024002400240024002400240024002400240024020002d00000e0b000102030405060708090a0b0b200241003a00072001200241076a41011064200041046a280200210320012000410c6a280200220410a5010240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b200028021021032001200041186a280200220010a50120004198046c2200450d0a03402003200110d10220034198046a2103200041e87b6a22000d000c0b0b0b200241013a00072001200241076a41011064200041046a280200210320012000410c6a280200220410a5010240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b200028021021032001200041186a280200220010a50120004198046c2200450d0903402003200110d10220034198046a2103200041e87b6a22000d000c0a0b0b200241023a00072001200241076a41011064200041046a280200210320012000410c6a280200220410a5010240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b200028021021032001200041186a280200220010a50120004198046c2200450d0803402003200110d10220034198046a2103200041e87b6a22000d000c090b0b200241033a00072001200241076a41011064200041106a200110d202200241003a00072001200241076a41011064200041046a280200210320012000410c6a280200220010a501200041f8036c2200450d0703402003200110cb02200341f8036a2103200041887c6a22000d000c080b0b200241043a00072001200241076a41011064200041046a280200210320012000410c6a280200220410a501200041106a21050240200441f8036c2200450d0003402003200110cb02200341f8036a2103200041887c6a22000d000b0b20052001109d020c060b200241053a00072001200241076a41011064200041046a280200210320012000410c6a280200220410a501200041206a21050240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b20052001109d02200028021021032001200041186a280200220010a50120004198046c2200450d0503402003200110d10220034198046a2103200041e87b6a22000d000c060b0b200241063a00072001200241076a410110640240024002400240024020002d00010e0400010203000b200241003a00072001200241076a410110640c030b200241013a00072001200241076a410110640c020b200241023a00072001200241076a410110640c010b200241033a00072001200241076a410110640b200220002903183703082001200241086a4108106420002802042000410c6a280200200110a6010c040b200241073a00072001200241076a41011064200041046a200110ee01200041086a200110ee012000410c6a200110ee010c030b200241083a00072001200241076a41011064200041046a200110ee010c020b200241093a00072001200241076a41011064200041046a200110ee01200041086a200110ee012000410c6a200110ee010c010b2002410a3a00072001200241076a41011064200041086a2001109d02200041046a280200200110d0020b200241106a24000bc30801047f230041106b2202240002400240024002400240024002400240024020002d00000e080001020304050607000b200241003a00082001200241086a410110640c070b200241013a00082001200241086a41011064200041046a280200210320012000410c6a280200220410a501200041106a21050240200441f8036c2200450d0003402003200110cb02200341f8036a2103200041887c6a22000d000b0b20052001109d020c060b200241023a00082001200241086a41011064200041046a280200210320012000410c6a280200220410a501200041206a21050240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b20052001109d02200028021021032001200041186a280200220010a50120004198046c2200450d0503402003200110d10220034198046a2103200041e87b6a22000d000c060b0b200241033a00082001200241086a41011064200041046a280200210320012000410c6a280200220410a5010240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b200028021021032001200041186a280200220010a501200041f8036c450d04200041f8036c210003402003200110cb02200341f8036a2103200041887c6a22000d000c050b0b200241043a00082001200241086a41011064200041046a280200210320012000410c6a280200220410a501200041206a21050240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b20052001109d02200028021021032001200041186a280200220010a50120004198046c2200450d0303402003200110d10220034198046a2103200041e87b6a22000d000c040b0b200241053a00082001200241086a41011064200041046a280200210320012000410c6a280200220410a501200041206a21050240200441f8036c2204450d0003402003200110cb02200341f8036a2103200441887c6a22040d000b0b20052001109d02200028021021032001200041186a280200220010a50120004198046c2200450d0203402003200110d10220034198046a2103200041e87b6a22000d000c030b0b200241063a00082001200241086a41011064200041106a200110d202200041186a2001109d02200041046a280200210320012000410c6a280200220010a501200041f8036c2200450d0103402003200110cb02200341f8036a2103200041887c6a22000d000c020b0b200241073a00082001200241086a41011064200041106a200110cb02200220004188046a2903003703082001200241086a41081064200220004190046a2903003703082001200241086a41081064200220002d00013a00082001200241086a41011064200041046a280200210320012000410c6a280200220010a501200041e8036c2200450d0003402003200110d002200341e8036a2103200041987c6a22000d000b0b200241106a24000be00203017f017e027f230041206b220224000240024002400240024002402000290300220342c000540d00200342808001540d012003428080808004540d02200379a7220441274d0d0341fe85c100413641b486c100102d000b20022003a74102743a00082001200241086a410110640c030b20022003a74102744101723b01082001200241086a410210640c020b20022003a74102744102723602082001200241086a410410640c010b20024113200441037622044102746b3a00082001200241086a410110642002200029030022033703000240410820046b450d00200441786a21000340200220033c00082001200241086a4101106420034208882103200041016a22042000492105200421002005450d000b200220033703000b200350450d010b200241206a24000f0b2002411c6a4100360200200241186a41bc8ec2003602002002420137020c200241c486c1003602082002200241086a10bf03000bc40201037f23004180016b2202240020002802002100024002400240024020012802002203411071450d0020002d00002103410021000340200220006a41ff006a2003410f712204413072200441d7006a2004410a491b3a00002000417f6a21002003410476410f7122030d000b20004180016a22034181014f0d02200141a8f7c1004102200220006a4180016a410020006b104021000c010b02402003412071450d0020002d00002103410021000340200220006a41ff006a2003410f712204413072200441376a2004410a491b3a00002000417f6a21002003410476410f7122030d000b20004180016a22034181014f0d03200141a8f7c1004102200220006a4180016a410020006b104021000c010b20003100002001103c21000b20024180016a240020000f0b2003418001419087c000104a000b2003418001419087c000104a000bbe0201037f23004180016b2202240020002802002100024002400240024020012802002203411071450d0020002802002103410021000340200220006a41ff006a2003410f712204413072200441d7006a2004410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d02200141a8f7c1004102200220006a4180016a410020006b104021000c010b02402003412071450d0020002802002103410021000340200220006a41ff006a2003410f712204413072200441376a2004410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d03200141a8f7c1004102200220006a4180016a410020006b104021000c010b20003502002001103c21000b20024180016a240020000f0b2003418001419087c000104a000b2003418001419087c000104a000bd60202027f017e23004180016b2202240020002802002100024002400240024020012802002203411071450d0020002903002104418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d030b200141a8f7c1004102200220006a41800120006b104021000c010b02402003412071450d0020002903002104418001210002400340024020000d00410021000c020b200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b20004181014f0d040b200141a8f7c1004102200220006a41800120006b104021000c010b20002903002001103c21000b20024180016a240020000f0b2000418001419087c000104a000b2000418001419087c000104a000b880101017f230041306b220224002002200028020036020c2002410b3602142001411c6a280200210020022002410c6a360210200128021821012002412c6a4101360200200241246a4101360200200241b4f7c1003602202002410136021c200241cc80c2003602182002200241106a36022820012000200241186a10322101200241306a240020010bfe0101047f230041306b22022400200028020021030240024020012d0000410471450d002001411c6a2802002104200128021821052002412c6a4100360200200241bc8ec2003602282002420137021c200241acf7c1003602184101210020052004200241186a10320d010b41002100024003402002200320006a36020c2002410c36021420022002410c6a36021020012802182104200128021c21052002410136022c20024101360224200241d4f7c1003602202002410136021c200241cc80c2003602182002200241106a36022820042005200241186a10320d01200041016a22004120470d000b410021000c010b410121000b200241306a240020000b9b0702027f047e230041f0016b2202240020002802002100024002400240024020012802002203411071450d00200041086a290300210420002903002105418001210002400340024020000d00410021000c020b200241f0006a20006a417f6a2005a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b20004181014f0d030b200141a8f7c1004102200241f0006a20006a41800120006b104021000c010b02402003412071450d00200041086a290300210420002903002105418001210002400340024020000d00410021000c020b200241f0006a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b20004181014f0d040b200141a8f7c1004102200241f0006a20006a41800120006b104021000c010b200041086a2903002104200029030021062002412736026c02400240200442ffff1f560d0020064213882004422d868442bda282a38eab04802104420021050c010b200241386a2006420042f3b2d8c19e9ebdcc957f4200108405200241286a2006420042d2e1aadaeda7c987f6004200108405200241d8006a2004420042f3b2d8c19e9ebdcc957f4200108405200241c8006a2004420042d2e1aadaeda7c987f6004200108405200241c8006a41086a290300200241286a41086a290300200241386a41086a290300220520022903287c2204200554ad7c220720022903487c2205200754ad7c2005200241d8006a41086a290300200420022903587c200454ad7c7c2204200554ad7c2207423e8821052004423e8820074202868421040b200241186a20042005428080e0b0b79fb79cf500427f108405200229031820067c200241f0006a200241ec006a105a02402004200584500d00200241f0006a41146a4130200228026c416c6a1087051a2002411436026c200241086a20044213882005422d8684220542bda282a38eab048022062004428080e0b0b79fb79cf500427f108405200229030820047c200241f0006a200241ec006a105a200542bda282a38eab04540d00200241f1006a4130200228026c417f6a1087051a20022006a74130723a00702002410036026c0b200141bc8ec2004100200241f0006a200228026c22006a412720006b104021000b200241f0016a240020000f0b2000418001419087c000104a000b2000418001419087c000104a000bff0101047f02400240200028020022014106490d00200041086a280200210202402000410c6a2802002200450d002002200041186c6a2103200221000340024020002802002204450d00200041046a280200450d00200410300b0240200041106a28020041ffffffff0371450d002000410c6a28020010300b200041186a22002003470d000b0b200141186c450d01200210300f0b2001450d002000200141186c6a41086a21012000410c6a2100034002402000417c6a22042802002203450d002000280200450d00200310300b0240200441106a28020041ffffffff0371450d00200041086a28020010300b200041186a2100200441186a2001470d000b0b0ba30502077f047e230041f0066b220224000240418003102f2203450d00200241086a41086a22042001280208220541086a290000370300200241086a41106a2206200541106a290000370300200241086a41186a2207200541186a29000037030020022005290000370308200241d0066a41086a4120360200200220053602d406200241003602d006200241e0066a41086a41002802b8f541360200200241002902b0f5413703e006200241c0046a2001200241086a200241d0066a200241e0066a10ba0220022802c404210820022802c0042105200241b8026a200241c0046a41086a4188021085051a0240024020054101460d00200241306a200241b8026a4188021085051a200241c0046a200241b8026a41e4011085051a200241086a41206a200241b4026a2d000022053a00002007200241ac026a29020022093703002006200241a4026a290200220a37030020042002419c026a290200220b3703002002200229029402220c370308200241dc026a20053a0000200241d4026a2009370200200241b8026a41146a200a370200200241b8026a410c6a200b3702002002200c3702bc0241f001102f2205450d02200520083602082005410c6a200241c0046a41e4011085051a2005428180808010370200200341256a200241d5026a290000370000200341206a200241b8026a41186a290200370200200341186a200241b8026a41106a290200370200200341106a200241b8026a41086a290200370200200320022902b8023702082003410036020420032005360200200041c0006a4100360200200041186a41003a0000200041146a41003602002000410c6a428880808010370200200041086a200336020020002001360204200041003602000c010b2000410136020020002008360204200310300b200241f0066a24000f0b102a000be62b051c7f017e057f027e017f23004190096b220324002000410c6a220428020021052004410036020002402005450d0020002802042104200541306c21060340200428020022052005280200417f6a3602000240200428020022052802000d0002402005410c6a280200450d0020052802081030200428020021050b200541046a22052005280200417f6a3602002004280200220541046a2802000d00200510300b200441306a2104200641506a22060d000b0b200041106a210702400240200028021022044125490d002000411c6a220528020021040c010b200721050b02402004450d00200541003602000b2000413c6a410036020020002802002104200341c0026a41186a4200370300200341c0026a41106a4200370300200341c0026a41086a4200370300200342003703c002200341b8046a41086a22084120360200200341003602b804200320042802083602bc04200341086a41086a41002802b8f541360200200341002902b0f541370308200341c0066a2004200341c0026a200341b8046a200341086a10ba0220032802c406210420032802c0062105200341dc046a200341c0066a41086a220941e4011085051a200341d0086a41086a220a200341b5086a290000370300200341d0086a41106a220b200341bd086a290000370300200341d0086a41186a220c200341c5086a290000370300200320032900ad083703d008024002400240024020054101460d00200041046a210d200341ac086a2d0000210e200341086a200341dc046a41e4011085051a200341f0016a41186a220f200c290300370300200341f0016a41106a2210200b290300370300200341f0016a41086a2211200a290300370300200320032903d0083703f001200341003602980220032002360294022003200136029002200341ad086a2112200341dc046a41026a21134100210541002114024002400240024002400240034020092011290300370300200341c0066a41106a22152010290300370300200341c0066a41186a2216200f290300370300200320032903f0013703c0060240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024041f001102f2206450d00200620043602082006410c6a200341086a41e4011085051a20064281808080103702000240200028020c2204200041086a280200470d00200d10bb02200028020c21040b2000280204200441306c6a2204410036020420042006360200200420032f00dc043b002d2004410c6a200e3a00002004410d6a20032903c006370000200441156a20092903003700002004411d6a2015290300370000200441256a20162903003700002004412f6a20132d00003a00002000200028020c221741016a220436020c20042017490d0120002802042218201741306c6a22192802002206280210211a2006280208211b0240024002400240024020062802140e050001020304000b20024101742005470d220c2f0b2006411c6a280200220420062802182200490d052004201a4b0d0620032006280220221c3602c8062003200420006b221d3602c4062003201b20006a221e3602c0060240200341c0066a20034190026a10dc0241ff017141ff01470d002018201741306c6a41033602044200211f0c300b410021040240200241017420056b2220201d410174201c6b2206200620204b1b2221450d000340201c20046a22004101762206201d4f0d09200520046a2216410176221520024f0d0a201e20066a2d00002206410f71200641f0017141047620004101711b200120156a2d00002206410f71200641047620164101711b470d012021200441016a2204470d000b202121040b2004202046ad211f0c2f0b2006411c6a280200220420062802182215490d082004201a4b0d092003200628022022213602b0042003200420156b221e3602ac042003201b20156a22203602a804410021040240201e41017420216b2222200241017420056b2223202320224b1b2224450d000340200520046a2216410176221520024f0d0c202120046a221c410176221d201e4f0d0d200120156a2d00002215410f71201541f0017141047620164101711b2020201d6a2d00002215410f712015410476201c4101711b470d012024200441016a2204470d000b202421040b024002400240024020042022460d00200341a8046a20034190026a10dc0241ff017141ff01460d0120232022202220234b1b221d0d02410021040c030b20194101360204200320023602940220032001360290022003200520226a22053602980220214101762104024002402021410171450d00201e20044d0d0141012116200441016a2115202020046a2d0000410f71211d0c280b410021160240201e2004490d004100211d200421150c280b2004201e41e097c200104a000b2004201e41f097c2001033000b2018201741306c6a410336020420214101762104024002402021410171450d00201e20044d0d11200341013a00c006200341c8066a201e200441016a22026b3602002003202020026a3602c4062003202020046a2d0000410f713a00c1060c010b201e2004490d0f200341c8066a201e20046b360200200341003b01c0062003202020046a3602c4060b2007200341c0066a10b5014200211f0c300b410021040340202120046a22004101762206201e4f0d10200520046a2216410176221520024f0d11202020066a2d00002206410f71200641f0017141047620004101711b200120156a2d00002206410f71200641047620164101711b470d01201d200441016a2204470d000b201d21040b2004202346ad211f0c2e0b20024101742005460d2c2005410176220420024f0d0f200120046a2d000021042019410236020420192004410f71200441047620054101711b22043602082007200410b601200641246a2004410c6c6a220628020022154102460d21200320023602940220032001360290022003200541016a22053602980202400240200e41ff01714101460d00200c4200370300200b4200370300200a4200370300200342003703d0080c010b200c200f290300370300200b2010290300370300200a2011290300370300200320032903f0013703d0080b20002802002116200641086a2802002104200641046a28020021060240024020154101470d0020042006490d12410121152004201a4d0d012004201a41d49bc2001042000b20042006490d12410021152004201a4b0d130b200320153602f0082003200420066b3602f8082003201b20066a3602f408201441016a221441017621040240024020144101710d00200420024b0d15200341003a008809200320043602840920032001360280090c010b200420024b0d15200420024f0d16200341013a008809200320013602800920032004360284092003200120046a2d000041f001713a0089090b200341c0066a2016200341d0086a200341f0086a20034180096a10ba0220032802c406210420032802c0062106200341dc046a200941e4011085051a2008201241086a290000370300200341b8046a41106a2215201241106a290000370300200341b8046a41186a2216201241186a290000370300200320122900003703b804024020064101460d0020032d00ac08210e200341c0026a200341dc046a41e4011085051a200341a0026a41186a2016290300370300200341a0026a41106a2015290300370300200341a0026a41086a2008290300370300200320032903b8043703a0020c240b2004ad2225421886211f2025422086222542018421260c2e0b2006411c6a280200220420062802182215490d152004201a4b0d162003200628022022213602b0042003200420156b221e3602ac042003201b20156a22203602a804410021040240201e41017420216b22222002410174222720056b2223202320224b1b2224450d000340200520046a2216410176221520024f0d19202120046a221c410176221d201e4f0d1a200120156a2d00002215410f71201541f0017141047620164101711b2020201d6a2d00002215410f712015410476201c4101711b470d012024200441016a2204470d000b202421040b0240024002400240024020042022460d00200341a8046a20034190026a10dc0241ff017141ff01460d0120232022202220234b1b221d0d02410021040c030b200320023602940220032001360290022003200520226a22043602980220272004470d034201211f0c300b2018201741306c6a410336020420214101762104024002402021410171450d00201e20044d0d1f200341013a00c006200341c8066a201e200441016a22026b3602002003202020026a3602c4062003202020046a2d0000410f713a00c1060c010b201e2004490d1d200341c8066a201e20046b360200200341003b01c0062003202020046a3602c4060b2007200341c0066a10b5012007410f10b6014200211f0c2f0b410021040340202120046a22004101762206201e4f0d1e200520046a2216410176221520024f0d1f202020066a2d00002206410f71200641f0017141047620004101711b200120156a2d00002206410f71200641047620164101711b470d01201d200441016a2204470d000b201d21040b2004202346ad211f0c2d0b2004410176220520024f0d1d200120056a2d000021052019410236020420192005410f71200541047620044101711b221536020820214101762105024002402021410171450d00201e20054d0d014101211d200541016a2116202020056a2d0000410f71211c0c210b4100211d0240201e2005490d004100211c200521160c210b2005201e41e097c200104a000b2005201e41f097c2001033000b102a000b41ebfbc00041d10041bcfcc0001050000b2000200441c49cc2001048000b2004201a41c49cc2001042000b2006201d41e098c2001033000b2015200241e098c2001033000b2015200441c49cc2001048000b2004201a41c49cc2001042000b2015200241e098c2001033000b201d201e41e098c2001033000b2004201e41e097c200104a000b2004201e41f097c2001033000b2006201e41e098c2001033000b2015200241e098c2001033000b2004200241e098c2001033000b2006200441d49bc2001048000b2006200441e49bc2001048000b2004201a41e49bc2001042000b2004200241a099c2001042000b2004200241b099c2001042000b2004200241c099c2001033000b2015200441c49cc2001048000b2004201a41c49cc2001042000b2015200241e098c2001033000b201d201e41e098c2001033000b2004201e41e097c200104a000b2004201e41f097c2001033000b2006201e41e098c2001033000b2015200241e098c2001033000b2005200241e098c2001033000b2018201741306c6a41033602040c010b2003201c3a00c1062003201d3a00c0062003201e20166b3602c8062003202020166a3602c4062007200341c0066a10b5012007201510b6010240200641306a2015410c6c6a220628020022154102470d00420021254200211f420021260c0e0b200320023602940220032001360290022003200441016a22053602980202400240200e41ff01714101460d00200c4200370300200b4200370300200a4200370300200342003703d0080c010b200c200f290300370300200b2010290300370300200a2011290300370300200320032903f0013703d0080b20002802002116200641086a2802002104200641046a28020021060240024002400240024002400240024020154101470d0020042006490d02410121152004201a4d0d012004201a41d49bc2001042000b20042006490d02410021152004201a4b0d030b200320153602f0082003200420066b3602f8082003201b20066a3602f408201420226a41016a221441017621040240024020144101710d00200420024b0d05200341003a008809200320043602840920032001360280090c010b200420024b0d05200420024f0d06200341013a008809200320013602800920032004360284092003200120046a2d000041f001713a0089090b200341c0066a2016200341d0086a200341f0086a20034180096a10ba0220032802c406210420032802c0062106200341dc046a200941e4011085051a2008201241086a290000370300200341b8046a41106a2215201241106a290000370300200341b8046a41186a2216201241186a290000370300200320122900003703b804024020064101460d0020032d00ac08210e200341c0026a200341dc046a41e4011085051a200341a0026a41186a2016290300370300200341a0026a41106a2015290300370300200341a0026a41086a2008290300370300200320032903b8043703a0020c090b2004ad2225421886211f2025422086222542018421260c130b2006200441d49bc2001048000b2006200441e49bc2001048000b2004201a41e49bc2001042000b2004200241a099c2001042000b2004200241b099c2001042000b2004200241c099c2001033000b420021254200211f420021260c0c0b2003201d3a00c106200320163a00c0062003201e20156b3602c8062003202020156a3602c4062007200341c0066a10b50102400240200e41ff01714101460d00200c4200370300200b4200370300200a4200370300200342003703d0080c010b200c200f290300370300200b2010290300370300200a2011290300370300200320032903f0013703d0080b200028020021162006412c6a2802002104200628022821150240024020062802244101470d0020042015490d04410121062004201a4d0d012004201a41d49bc2001042000b20042015490d04410021062004201a4b0d050b200320063602f0082003200420156b3602f8082003201b20156a3602f408202220146a221441017621040240024020144101710d00200420024b0d07200341003a008809200320043602840920032001360280090c010b200420024b0d07200420024f0d08200341013a008809200320013602800920032004360284092003200120046a2d000041f001713a0089090b200341c0066a2016200341d0086a200341f0086a20034180096a10ba0220032802c406210420032802c0062106200341dc046a200941e4011085051a2008201241086a290000370300200341b8046a41106a2215201241106a290000370300200341b8046a41186a2216201241186a290000370300200320122900003703b804024020064101460d0020032d00ac08210e200341c0026a200341dc046a41e4011085051a200341a0026a41186a2016290300370300200341a0026a41106a2015290300370300200341a0026a41086a2008290300370300200320032903b8043703a0020c010b2004ad2225421886211f2025422086222542018421260c0b0b200341086a200341c0026a41e4011085051a200f200341a0026a41186a2903003703002010200341a0026a41106a2903003703002011200341a0026a41086a290300370300200320032903a0023703f0010c000b0b2015200441d49bc2001048000b2015200441e49bc2001048000b2004201a41e49bc2001042000b2004200241a099c2001042000b2004200241b099c2001042000b2004200241c099c2001033000b2004ad2225421886211f2025422086222542018421260c020b4201211f0b42002125420021260b20034190096a2400201f4208864280fe0383202584202642ff0183840b970201097f02400240200141046a2802002202410174200141086a28020022036b2204200041046a2802002205410174200041086a28020022066b2207200720044b1b2208450d00200128020021092000280200210a02400240024003402006410176220020054f0d022003410176220120024f0d0302400240417f200a20006a2d00002200410f71200041047620064101711b2200200920016a2d00002201410f71200141047620034101711b22014720002001491b41016a0e03030001000b200641016a2106200341016a21032008417f6a2208450d050c010b0b41010f0b41ff0121060c030b2000200541e098c2001033000b2001200241e098c2001033000b41ff01210620072004490d0020072004470f0b20060b060010de02000b1100418ee2c100410f41a0e2c100102d000b9e13020c7f017e230041e0016b2203240002400240024020024110490d0041fc8fc2002001410f1088050d010c020b200141fc8fc2002002108805450d010b0240200041086a2802002204280224450d002004106c0b20042003290310370300200441003602242004200329038801370328200441206a200341106a41206a280200360200200441186a200341106a41186a290300370300200441106a200341106a41106a290300370300200441086a200341106a41086a290300370300200441306a20034188016a41086a2205290300370300200441386a20034188016a41106a2206290300370300200441c0006a20034188016a41186a2207290300370300200441c8006a20034188016a41206a290300370300200441d0006a200341b0016a290300370300200441d8006a20034188016a41306a290300370300200441003a0060200441e1006a2003290048370000200441e9006a200341c8006a41086a2208290000370000200441f1006a200341c8006a41106a2209290000370000200441f9006a200341c8006a41186a220a29000037000020044180016a200341e7006a2900003700002000280200210b200320023602d401200320013602d001200341086a200b10c302200328020c210c2003280208210d2003200341d0016a360234200341c8006a200b41c0006a10e0022007200a28020036020020062009290300370300200520082903003703002003200329034837038801200b41d4006a210e2003200341346a3602a401200341346a210a02400240024002400240034020032802a001210902400340024020090d00410021040c020b20032009417f6a22093602a00120034188016a4100200328028c011b220828020021060240024020082802082207200828020422042f018a0c4f0d00200421050c010b03400240200428020022050d00410021050c020b200641016a210620042f01880c210720052104200720052f018a0c4f0d000b0b024002402006450d00200741027420056a41900c6a280200210402402006417f6a2206450d000340200428028c0c21042006417f6a22060d000b0b410021060c010b200741016a2106200521040b20082004360204200841003602002008200636020820052007410c6c6a2204410c6a280200200a28020022062802042208490d002006280200200441046a220428020020081088050d000b200520074107746a4188016a21070b02402004450d002003410036023820042802082205417f4c0d02200428020021040240024020050d00410121060c010b2005102f2206450d040b200620042005108505210802400240200b28024c22044106490d00200b2802582104200b28025421060c010b200e21060b0240024002402006450d0020040d010b410221042005450d01200810300c010b2003200536021820032005360214200320083602102004410c6c20066a41746a200341106a10e10221040b2007200341386a2004200441024771200d200c10e20220032802a401210a0c010b0b2000280204210420034188016a41086a220541002802b8f541360200200341002902b0f54137038801024002402004200441e0006a220620034188016a10d5010d004130102f2205450d03200541003a000020052006290000370001200541096a200641086a290000370000200541116a200641106a290000370000200541196a200641186a2900003700000c010b200341003602442003200636024020034180dec10036023c2003200436023820034188016a200341386a2001200210e302200341c8006a41086a20034188016a41106a290300370300200341c8006a41106a220420034188016a41186a290300370300200341c8006a41186a220620034188016a41206a290300370300200341c8006a41206a220720034188016a41286a290300370300200341c8006a41286a220820034188016a41306a290300370300200341c8006a41306a220920034188016a41386a290300370300200341c8006a41386a220a200341c8016a28020036020020032005290300370348200328028c0121052003280288014101460d0020034194016a220b200341d0006a2903003702002003419c016a2004290300370200200341a4016a2006290300370200200341ac016a2007290300370200200341b4016a2008290300370200200341bc016a2009290300370200200341c4016a200a28020036020020032005360288012003200329034837028c01200341106a20034188016a10e402200328021022044102460d05024003402003280214210520044101460d012003290318220f422088a72206417f4c0d03200328022421082003280220210a200028020021040240024020060d00410121070c010b2006102f2207450d050b200720052006108505210720042802200d0520044100360220200441286a2209200929030042017c37030020042802300d0620044100360230200320063602d801200320063602d401200320073602d001200341003602102003200410c302200441c0006a200341d0016a200341106a2003280200200328020410c40202402008450d00200a10300b0240200fa7450d00200510300b200341106a20034188016a10e402200328021022044102470d000c070b0b024020034188016a410c6a2802002206450d00200328028c012104200641306c21070340200428020022062006280200417f6a3602000240200428020022062802000d0002402006410c6a280200450d0020062802081030200428020021060b200641046a22062006280200417f6a3602002004280200220641046a2802000d00200610300b200441306a2104200741506a22070d000b0b024020034190016a2802002204450d00200441306c450d00200328028c0110300b2003280298014125490d00200341a0016a28020010300b02400240024020052d00000e0402020002010b200541086a280200450d01200541046a28020010300c010b200541286a280200450d00200541246a28020010300b200510300c050b102c000b102a000b41b082c2004110200341106a41c082c20041d483c2001034000b41b082c2004110200341106a41c082c20041e483c2001034000b0240200b2802002205450d00200328028c012104200541306c21060340200428020022052005280200417f6a3602000240200428020022052802000d0002402005410c6a280200450d0020052802081030200428020021050b200541046a22052005280200417f6a3602002004280200220541046a2802000d00200510300b200441306a2104200641506a22060d000b0b024020034190016a2802002204450d00200441306c450d00200328028c0110300b2003280298014125490d00200341a0016a28020010300b200341e0016a24000b8a0201057f230041206b22022400024002400240200128020422030d004100210420004100360204200041106a41003602000c010b20012802002104200321050240034020032f018a0c2106024020040d002004450d020c040b2004450d032004417f6a2104200320064102746a418c0c6a2802002103200528028c0c21050c000b0b2000200436020c200041003602082000200536020420002004360200200041146a2006360200200041106a2003360200200128020821040b20002004360218200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b8f0f030b7f027e017f20012802082102200128020421032001280200210402400240024002400240024002400240024002400240024020002802042205450d00200028020021060c010b418c01102f2205450d0141002106200541003b018a012005410036020020002005360204200041003602000b0240034020052f018a012207410c6c2108200541046a220921014100210a02400340024020080d002007210a0c020b02400240200420012802002001280208220b20022002200b4b1b108805220c0d002002200b490d032002200b47210b0c010b4101210b200c4100480d020b2001410c6a2101200a41016a210a200841746a2108200b0d000b410021012003450d022004103041000f0b02402006450d002006417f6a21062005200a4102746a418c016a28020021050c010b0b024002402007410a4b0d000240200a20074f0d002009200a410c6c6a2201410c6a20012007200a6b410c6c1086051a0b2009200a410c6c6a2201200436020020012002360208200120033602042005200741016a3b018a010c010b410521014100210c02400240200a41054f0d0041042101200a21080c010b4105210802400240200a417b6a0e020201000b200a41796a21084101210c410621010c010b410021084101210c0b418c01102f220b450d02200b41003b018a01200b4100360200200b20052f018a0122062001417f736a220a3b018a01200a410c4f0d032006200141016a22076b200a470d0420092001410c6c6a2206290204210d20062802002106200b41046a20092007410c6c6a200a410c6c1085051a200520013b018a01200b2005200c1b220141046a210a0240200841016a220720012f018a01220c4b0d00200a2007410c6c6a200a2008410c6c6a200c20086b410c6c1086051a0b200a2008410c6c6a2208200436020020082002360208200820033602042001200c41016a3b018a01024002400240200528020022010d00410021070c010b41002107200b2109200d210e20062103034020052f018801210a200122042f018a012205410b490d024100210c410421010240200a4105490d00200a210102400240200a417b6a0e020201000b200a41796a210a4101210c410621010c010b4100210a4101210c410521010b41bc01102f220b450d05200b41003b018a01200b4100360200200b20042f018a0122022001417f736a22083b018a012008410c4f0d082002200141016a220f6b2008470d0920042001410c6c6a220241086a290200210d200241046a2802002106200b41046a200241106a2008410c6c1085051a200420013b018a01200b2f018a01220841016a21022008410c4f0d0a200520016b22012002470d0b200741016a2107200b418c016a2004200f4102746a418c016a20014102741085051a4100210102400340200b20014102746a418c016a280200220220013b0188012002200b360200200120084f0d01200120012008496a220120084d0d000b0b200b2004200c1b220241046a21050240200a41016a220120022f018a0122084b0d0020052001410c6c6a2005200a410c6c6a2008200a6b410c6c1086051a0b200841016a210c2005200a410c6c6a2205200e370204200520033602002002418c016a21050240200a41026a220f200841026a22034f0d002005200f4102746a200520014102746a2008200a6b4102741086051a0b200520014102746a20093602002002200c3b018a010240200120034f0d002002200a4102746a4190016a2101034020012802002208200a41016a220a3b01880120082002360200200141046a2101200c200a470d000b0b20042105200b2109200d210e20062103200428020022010d000b0b20002802042208450d0a2000280200210241bc01102f2201450d032001200836028c01200141003b018a0120014100360200200841003b01880120082001360200200020013602042000200241016a36020020022007470d0b20012f018a012208410b4f0d0c2001200841016a22023b018a0120012008410c6c6a220841086a200d370200200841046a20063602002001418c016a20024102746a200b360200200b20023b018801200b20013602002000200028020841016a36020841010f0b200a41016a2101200441046a2108200541016a2102024002402005200a4b0d002008200a410c6c6a2208200e370204200820033602002004418c016a2108200541026a210b0c010b20082001410c6c6a2008200a410c6c6a22082005200a6b220b410c6c1086051a2008200e37020420082003360200200a4102742004418c016a22086a41086a200820014102746a200b4102741086051a200541026a210b0b20082001410274220a6a2009360200200420023b018a012001200b4f0d00200a20046a418c016a210803402008280200220220013b01880120022004360200200841046a2108200b200141016a2201470d000b0b410121012000200028020841016a3602080b20010f0b102a000b200a410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2008410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2002410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000bd20803047f017e017f230041206b2205240020002802002106024002400240024002400240024002400240024002400240024020020d00024020064106490d002000410c6a2802002202450d01200541086a41086a200141086a28020036020020052001290200370308200541086a2101200041086a28020022070d03418486c20041fc00418888c2001050000b20060d01410021060b200541086a41086a200141086a28020036020020052001290200370308024002400240024020064106490d002000410c6a220128020022022006460d01200041086a28020021070c0e0b4105210220064105460d01200041086a210720062102200021010c0d0b2000410c6a2802002101200621020c010b200621010b20022001470d09200141016a22022001490d054100417f2002417f6a677620024102491b220241016a22012002490d050240024020064106490d002000410c6a2802002102200041086a2802002108200621070c010b200041086a210841052107200621020b200220014b0d020240200141054b0d00200641054d0d0a20004100360204200041086a2008200241186c1085051a200020023602002007ad42187e2209422088a70d04200810300c0a0b20072001470d040c090b200541086a41086a200141086a28020036020020052001290200370308200041086a2107200541086a2101200621020b024020072002417f6a41186c6a22062802002202450d00200641046a280200450d00200210300b20062001290200370200200641086a200141086a2802003602000c090b41c29ac200412041e49ac200102d000b2005410036021c20052009a736021841bea9c200412b200541186a41e485c20041f485c2001034000b2001ad42187e2209422088a70d002009a7210a0240200641054b0d00200a102f2206450d0420062008200241186c1085051a0c030b2007ad42187e2209422088a7450d010b41d099c200411141e499c200102d000b200a102f2206450d0120062008200a2009a722072007200a4b1b1085051a200810300b20004101360204200020013602002000410c6a2002360200200041086a20063602000c010b102a000b2000410c6a22012802002102200041086a28020021070b2007200241186c6a220641002802e88f4236020c20062005290308370200200641106a4200370200200641086a200541086a41086a2802003602002001200128020041016a3602000b0240024020034101470d0002400240200028020022064106490d002000410c6a2802002106200041086a28020021000c010b200041086a21000b2000450d012006450d0120002006417f6a41186c6a2206410c6a2101024020062802142200450d00200041027420012802006a417c6a2802002004460d010b200641146a210202402000200641106a280200470d0020012000410110f302200228020021000b200128020020004102746a20043602002002200228020041016a3602000b200541206a24000f0b418486c20041fc00419888c2001050000b930d02097f017e230041f0016b2204240020044188016a200110da02200441c8006a41086a220520044188016a41106a290300370300200441c8006a41106a220620044188016a41186a290300370300200441c8006a41186a220720044188016a41206a290300370300200441c8006a41206a220820044188016a41286a290300370300200441c8006a41286a220920044188016a41306a290300370300200441c8006a41306a220a20044188016a41386a290300370300200441c8006a41386a220b200441c8016a280200360200200420044188016a41086a290300370348200428028c01210102400240024002402004280288014101460d00200441146a220c20052903003702002004411c6a2006290300370200200441246a20072903003702002004412c6a2008290300370200200441346a20092903003702002004413c6a200a290300370200200441c4006a200b280200360200200420013602082004200429034837020c200441086a2002200310db02220da74101710d01200c280200210202400240024002400240200d42800283500d002002450d0320042002417f6a2205360214200428020c2201200541306c6a22032802044104460d03200441c8006a41286a2206200341286a290200370300200441c8006a41206a2207200341206a290200370300200441c8006a41186a2208200341186a290200370300200441c8006a41106a2209200341106a290200370300200441c8006a41086a220a200341086a29020037030020042003290200370348410021032004410036021402402005450d00200241306c41506a21030340200128020022022002280200417f6a3602000240200128020022022802000d0002402002410c6a280200450d0020022802081030200128020021020b200241046a22022002280200417f6a3602002001280200220241046a2802000d00200210300b200141306a2101200341506a22030d000b200428021421030b20044188016a41286a200629030037030020044188016a41206a200729030037030020044188016a41186a200829030037030020044188016a41106a200929030037030020044188016a41086a200a29030037030020042004290348370388012003200441086a41086a280200470d02200341016a220120034f0d010c080b200441003602142002450d02200428020c2101200241306c21030340200128020022022002280200417f6a3602000240200128020022022802000d0002402002410c6a280200450d0020022802081030200128020021020b200241046a22022002280200417f6a3602002001280200220241046a2802000d00200210300b200141306a2101200341506a22030d000c030b0b200341017422022001200220014b1b22014104200141044b1bad42307e220d422088a7454102742101200da721020240024020030d00200441003602e0010c010b200441e8016a41043602002004200428020c3602e0012004200341306c3602e4010b200441d0016a20022001200441e0016a1069200441d8016a280200210120042802d0014101460d02200420042802d40136020c2004200141306e360210200428021421030b200428020c200341306c6a2201200429038801370200200141286a20044188016a41286a290300370200200141206a20044188016a41206a290300370200200141186a20044188016a41186a290300370200200141106a20044188016a41106a290300370200200141086a20044188016a41086a2903003702002004200428021441016a3602140b20002004290308370204200041003602002000413c6a200441c0006a290300370200200041346a200441386a2903003702002000412c6a200441306a290300370200200041246a200441286a2903003702002000411c6a200441206a290300370200200041146a200441186a2903003702002000410c6a200441106a2903003702000c030b2001450d03102a000b20004101360200200020013602040c010b200041013602002000200d422088a73602040240200c2802002202450d00200428020c2101200241306c21030340200128020022022002280200417f6a3602000240200128020022022802000d0002402002410c6a280200450d0020022802081030200128020021020b200241046a22022002280200417f6a3602002001280200220241046a2802000d00200210300b200141306a2101200341506a22030d000b0b0240200441106a2802002201450d00200141306c450d00200428020c10300b20042802184125490d00200441206a28020010300b200441f0016a24000f0b102c000be40a010b7f23004180036b22022400200241086a200110b70202400240024002400240024002400240024002400240200228020822034102460d00200241e8006a4104722104200241086a41086a21050340200228020c210602402003450d0020002006360204200041013602000c080b2002280260210320042005290200370200200441086a200541086a290200370200200441106a200541106a290200370200200441186a200541186a290200370200200441206a200541206a290200370200200441286a200541286a2802003602002002200636026820024198016a200341146a20032802082003280210107002400240024002400240200228029801417f6a0e0400040102040b20022802a40122014101762104200241ac016a2802002107200241a8016a280200210820022802a0012105200228029c012106024002402001410171450d00200520044d0d09200241013a00f002200241f8026a2005200441016a22016b3602002002200620016a3602f4022002200620046a2d0000410f713a00f1020c010b20052004490d07200241f8026a200520046b360200200241003b01f0022002200620046a3602f4020b200241e8006a200241f0026a10b5010c0a0b20022802e002210720022802dc0221080c010b20022802a4012209410176210620022802ec02210720022802e802210820022802a001210a200228029c01210b024002402009410171450d00200a20064d0d0941012109200b20066a2d0000410f71210c200641016a21060c010b200a2006490d07410021094100210c0b2002200c3a00f102200220093a00f0022002200a20066b3602f8022002200b20066a3602f402200241e8006a200241f0026a10b5010b20080d070b20032003280200417f6a2206360200024020060d0002402003410c6a280200450d00200328020810300b200341046a22062006280200417f6a220636020020060d00200310300b024020022802684125490d00200228027010300b200241086a200110b702200228020822034102470d000b0b200041023602000c050b2004200541e097c200104a000b2004200541f097c2001033000b2006200a41e097c200104a000b2006200a41f097c2001033000b2002280294012205410176210402400240200541017122060d0002400240200228026822054125490d00200241f4006a2802002105200228027021010c010b200241e8006a41057221010b200520044f0d012004200541e096c2001042000b02400240200228026822054125490d00200241f4006a280200210a200228027021010c010b200241e8006a41057221012005210a0b200a2004490d020240024020054125490d00200241f4006a28020021052002280270210a0c010b200241e8006a410572210a0b200520044d0d03200a20046a2d0000417071210a0b0240024020040d00410121050c010b2004102f2205450d040b20052001200410850521010240024020060d002007417f4c0d060240024020070d00410121050c010b2007102f2205450d060b2005200820071085052105200041186a2007360200200041146a2007360200200041106a20053602002000410c6a2004360200200041086a200436020020002001360204200041003602000c010b4130102f2205450d042005200436010c20052004360108200520013601042005200a3a0001200541023a000020002005360204200041013602000b20032003280200417f6a2204360200024020040d0002402003410c6a280200450d00200328020810300b200341046a22042004280200417f6a220436020020040d00200310300b20022802684125490d00200228027010300b20024180036a24000f0b2004200a41f096c2001042000b20042005418097c2001033000b102a000b102c000bdd0802037f017e23004180016b2204240002400240024002400240024002400240024002402001280200220541c0006a2002200310e6022206450d0002400240200628020022024106490d00200628020c2102200628020821060c010b200641086a21060b2006450d042002450d04024020062002417f6a41186c6a2206280200450d0020052802000d06200641086a22023502002107200541003602002005200529030842017c3703082005280210450d0241b082c2004110200441286a41c082c20041c483c2001034000b20052802000d0641002106200541003602002005200529030842017c37030820052802100d07200541003602100c020b200441086a20012802042002200310e70241022106024020042802084101460d0002400240200428020c22050d00410021060c010b200441e0006a2005200441086a41086a2903002207422088a71065200441286a41186a200441e0006a41186a290000370300200441286a41106a200441e0006a41106a290000370300200441286a41086a200441e0006a41086a29000037030020042004290060370328410121062007a7450d00200510300b200441e0006a41186a200441286a41186a290300370300200441e0006a41106a200441286a41106a290300370300200441e0006a41086a200441286a41086a290300370300200420042903283703600b20064102460d07200441086a41186a200441e0006a41186a290300370300200441086a41106a200441e0006a41106a290300370300200441086a41086a200441e0006a41086a290300370300200420042903603703080c020b20054100360210200541186a2205200529030020077c370300200441e0006a200628020020022802001065200441c1006a200441e0006a41186a290000370000200441396a200441f0006a290000370000200441316a200441e8006a29000037000020042004290060370029410121060b200441206a200441c1006a290000370300200441186a200441396a290000370300200441106a200441316a290000370300200420042900293703080b0240024020064101460d00200041003602000c010b200441286a41186a200441086a41186a290300370300200441286a41106a200441086a41106a290300370300200441286a41086a200441086a41086a2903003703002004410036025820044201370350200420042903083703284120102f2205450d062004422037026420042005360260200441e0006a200441286a41201064200441d0006a200428026022052004280268106402402004280264450d00200510300b20002004290350370200200041086a200441d0006a41086a2802003602000b20044180016a24000f0b418486c20041fc00418087c2001050000b41b082c2004110200441286a41c082c20041b483c2001034000b41b082c2004110200441286a41c082c20041b483c2001034000b41b082c2004110200441286a41c082c20041c483c2001034000b41d488c1004130200441286a41dcfcc00041ecfcc0001034000b102a000bc60101067f024020002802042203450d00200028020021040340200341046a210020032f018a0c21054100210603400240024020052006460d000240024020012000280200200041086a2802002207200220072002491b10880522080d00200720024b0d01200720024721070c030b41012107200841004e0d020b200621050b2004450d032004417f6a2104200320054102746a418c0c6a28020021030c020b200641016a21062000410c6a210020070d000b0b20032006417f6a4107746a4188016a0f0b41000bc40302027f027e230041306b22042400200441286a41002802b8f541360200200441002902b0f54137032002400240024002400240024002402001200141e0006a2205200441206a10d5010d004130102f22010d010c060b2004410036021c20042005360218200441eca2c000360214200420013602102004200441106a2002200310910420042802004101460d0102400240200428020422020d004200210642002107410021010c010b200441086a29030022064220882207a72205417f4c0d050240024020050d00410121010c010b2005102f2201450d070b2001200220051085051a02402006a7450d00200210300b20064280808080708321060b200041086a200720068437020020002001360204200041003602000c030b200141003a000020012005290000370001200141096a200541086a290000370000200141116a200541106a290000370000200141196a200541186a2900003700000c010b200428020421010b02400240024020012d00000e0402020002010b200141086a280200450d01200141046a28020010300c010b200141286a280200450d00200141246a28020010300b20011030200041013602000b200441306a24000f0b102c000b102a000b890501057f230041e0026b22022400024002400240200128020822032d00600d0020012802042104200241206a2001280200220141c0006a10e902200241c0006a200110ea02200241c0026a41186a200241206a41186a280200360200200241c0026a41106a200241206a41106a290300370300200241c0026a41086a200241206a41086a290300370300200220022903203703c002200241e0006a41186a200241c0006a41186a280200360200200241e0006a41106a200241c0006a41106a290300370300200241e0006a41086a200241c0006a41086a29030037030020022002290340370360200241c0016a2004200241c0026a200241e0006a10eb02200241086a2204200241c0016a41086a290300370300200241106a2205200241c0016a41106a290300370300200241186a2206200241c0016a41186a290300370300200220022903c001370300200241e0006a200241c0016a41206a41e0001085051a200241c0016a200241e0006a41e0001085051a02402003280224450d002003106c0b2003200241c0016a41e000108505220141f9006a2006290300370000200141f1006a2005290300370000200141e9006a2004290300370000200141e1006a2002290300370000200141013a006020004100360208200042013702004120102f2201450d02200242203702c401200220013602c001200241c0016a200241201064200020022802c001220120022802c801106420022802c401450d01200110300c010b20004100360208200042013702004120102f2201450d01200242203702c401200220013602c001200241c0016a200341e1006a41201064200020022802c001220120022802c801106420022802c401450d00200110300b200241e0026a24000f0b102a000b8a0201057f230041206b22022400024002400240200128020422030d004100210420004100360204200041106a41003602000c010b20012802002104200321050240034020032f018a0c2106024020040d002004450d020c040b2004450d032004417f6a2104200320064102746a418c0c6a2802002103200528028c0c21050c000b0b2000200436020c200041003602082000200536020420002004360200200041146a2006360200200041106a2003360200200128020821040b20002004360218200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b980203047f017e017f230041206b220224000240024002402001419c016a28020022030d004100210441002103410021010c010b2001280298012205ad4220862106200321040240034020032f01d6092107024020050d002005450d020c040b2005450d0320064280808080707c21062005417f6a2105200320074102746a41d8096a280200210320042802d80921040c000b0b200141a0016a28020021010b20002001360218200020063702082000200436020420002005360200200041146a2007360200200041106a2003360200200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000bf67007027f057e037f017e417f017e047f230041c0096b2204240002404101102f2205450d00200541003a0000410041003502e0ac42200441f8076aad22067c42adfed5e4d485fda8d8007e42218922073e02e0ac42200441e0016a41e0acc200ad220842a4bb99fed1a0bbb023852209420042adfed5e4d485fda8d8004200108405200441c0016a200742a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441d0016a200842c5ecb3fec9ecf7c2c30085220a420042adfed5e4d485fda8d8004200108405200441b0016a200742c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200441a0016a2007200885420042adfed5e4d485fda8d8004200108405200441f8076a418de2c10041011065200441c4026a200441f8076a41186a220b290000370200200441bc026a200441f8076a41106a220c290000370200200441b4026a200441f8076a41086a220d290000370200200441a4026a428180808010370200200441f0016a41286a4200370300200441f0016a41246a41bcf5c100360200200420042900f8073702ac02200420053602a002200441003602900220042007200441e0016a41086a29030020042903e001857c200441a0016a41086a29030020042903a0018542cf829ebbefefde82147c220e893703f0012004200441b0016a41086a29030020042903b0018520087c200e423088893703880220042007200441d0016a41086a29030020042903d001857c200e42208889370380022004200441c0016a41086a29030020042903c0018520087c200e421088893703f801200441d0026a41186a200341186a280200360200200441d0026a41106a200341106a290200370300200441d0026a41086a200341086a290200370300200420032902003703d002200441d8056a410772210f200441f8076a4101722110200441f8056a41e0006a2111200441d1066a211220044198056a4107722113200441f4046a2114200441f8076a410c6a211520044190036a41076a2116200441f8076a410b6a2117200441f8076a410d6a2118200441f8076a410e6a2119200441f8076a410f6a211a200441f8076a41116a211b200441f8076a41126a211c200441f8076a41136a211d200441f8076a41156a211e200441f8076a41166a211f200441f8076a41196a2120200441f8076a411a6a2121200441f8076a411b6a2122200441f8076a411c6a2123200441f8076a411d6a2124200441f8076a411e6a2125200441f8076a411f6a212620044199086a21272004419a086a21282004419b086a21294100212a4100212b4100212c41002802e88f42222d212e0240024002400240024002400240024003400240024020042802e8022203450d0020042003417f6a3602e802200441d0026a410020042802d4021b222f280200213002400240202f2802082231202f28020422032f01d6094f0d00200321050c010b03400240200328020022050d00410021050c020b203041016a213020032f01d409213120052103203120052f01d6094f0d000b0b024002402030450d00203141027420056a41dc096a280200210302402030417f6a2230450d00034020032802d80921032030417f6a22300d000b0b410021300c010b203141016a2130200521030b202f2003360204202f4100360200202f2030360208200441f8076a2005203141e4006c6a4188016a10fa0320042802940822320d010b200441d8056a41186a200241186a280200360200200441d8056a41106a200241106a290200370300200441d8056a41086a200241086a290200370300200420022902003703d8054101102f2203450d0a200341003a0000410041003502e0ac4220067c42adfed5e4d485fda8d8007e42218922073e02e0ac42200441c0006a41e0acc200ad220e42a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441206a200742a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441306a200e42c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200441106a200742c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d800420010840520042007200e85420042adfed5e4d485fda8d8004200108405200441f8076a418de2c10041011065200441e4036a200441f8076a41186a290000370200200441dc036a200441f8076a41106a290000370200200441d4036a200441f8076a41086a2230290000370200200441c4036a428180808010370200200441b8036a420037030020044190036a41246a41bcf5c100360200200420042900f8073702cc03200420033602c003200441003602b00320042007200441c0006a41086a2903002004290340857c200441086a29030020042903008542cf829ebbefefde82147c220889370390032004200441106a41086a290300200429031085200e7c2008423088893703a80320042007200441306a41086a2903002004290330857c2008422088893703a0032004200441206a41086a290300200429032085200e7c20084210888937039803200141e3006a280000210c200141ea006a2801002133200141f1006a280000210b200141f8006a22032802002114200141fc006a2802002134200141e2006a2d00002135200141e7006a2f00002136200141e9006a2d00002137200141ee006a2f01002138200141f0006a22052d00002110200141f5006a2f00002111200141f7006a2d0000213920012f0160213a200420013602d002200420044190036a3602d402200441b8046a41186a2003290200370300200441b8046a41106a2005290200370300200441b8046a41086a200141e8006a290200370300200420012902603703b804200441f8076a200441d0026a41c4a2c000200441b8046a10fe0220042802fc07210520042802f8072103200441f8066a20304180011085051a20034101460d05200441f8056a200441f8066a4180011085051a20044184076a2205200441d8056a41086a2903003702002004418c076a200441e8056a29030037020020044194076a200441f0056a2802002203360200200441f8066a41246a202e202b41186c6a222f360200200441013602f806200420042903d8053702fc062004202e3602980702400240024002400240024002402003450d0020042003417f6a36029407200441f8066a4104724100200441f8066a41086a223b28020022031b223c2802002130024002402005410820031b223d2802002231203b410420031b223b28020022052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b203b2005360200203d2030360200203c410036020002400240200320314107746a22304188016a28020022054106490d0020304194016a280200210520304190016a28020021300c010b20304190016a21300b2030450d062005450d0620032031410c6c6a2203410c6a213b200341046a210320302005417f6a41186c6a223028020022050d01410021050c020b41002105200441003602f806202f202e460d0e2004202e41186a220336029807202e28020c22300d020c030b203028020821310b203b280200213b2003280200213c417f20044194076a2802002203202f202e6b41186e6a223020302003491b21030c020b202e2802142131203021050b202e280208213b202e280200213c202f20036b41186e21030b417f200341016a223020302003491b220341ffffffff00712003470d0720034104742203417f4c0d072003102f223e450d0b203e203136020c203e2005360208203e203b360204203e203c360200200441f8076a41206a200441f8066a41206a290300370300200441f8076a41186a200441f8066a41186a290300370300200441f8076a41106a200441f8066a41106a290300370300200441f8076a41086a223d200441f8066a41086a290300370300200420042903f8063703f8072003410476213f200441f8076a410c6a2140200441f8076a410472214141012142024002400240034002400240024002400240024020042802f8074101470d0002402004280294082203450d0020042003417f6a360294082041410020042802800822031b222f2802002130024002402040410820031b223b2802002231203d410420031b223c28020022052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b203c2005360200203b2030360200202f410036020020032031410c6c6a2205410c6a2802002130200541046a280200212f02400240200320314107746a22054188016a28020022034106490d0020054194016a280200210320054190016a28020021050c010b20054190016a21050b2005450d0a2003450d0a20052003417f6a41186c6a220328020022050d02410021050c030b200441003602f8070b2004280298082203450d07200428029c082003460d072004200341186a3602980802400240200328020c22050d00410021050c010b200341146a28020021310b200328020821302003280200212f203f2042470d0420042802980822030d02410021030c030b200328020821310b203f2042470d022004280294082103200428029808223b450d01417f2003200428029c08203b6b41186e6a223b203b2003491b21030c010b200428029c0820036b41186e21030b2042417f200341016a223b203b2003491b6a22032042490d0c2042410174223b2003203b20034b1b22034104200341044b1b220341ffffffff0071200346410274213b200341047421030240024020420d0020044100360298050c010b2004203e36029805200441043602a0052004204241047436029c050b20044198046a2003203b20044198056a106920042802a00421032004280298044101460d02200428029c04213e2003410476213f0b203e20424104746a22032005360208200320303602042003202f3602002003410c6a2031360200204241016a21420c000b0b2003450d090c0d0b0240204241144b0d00204241014d0d072042410474203e6a41606a21034101210503402003200541016a220510b602200341706a210320422005470d000c080b0b2042410176220341ffffffff00712003470d0820034104742243417f4c0d082043102f2244450d0c203e41706a2132203e41506a210141002802e88f42214541002146410021472042214803402048213b41002148410121030240203b417f6a2205450d0002400240203e20054104746a2203280200203e203b417e6a22484104746a2205280200222f2005280204220520032802042203200320054b1b10880522300d00417f200320054720032005491b21030c010b417f410120304100481b21030b0240024002400240024002402003417f460d002001203b4104746a21304102210303400240203b2003470d0041002148203b21030c080b024002400240202f2030280200223c203041046a28020022312005200520314b1b108805222f0d00200520314f0d010c020b202f4100480d010b203041706a2130200341016a210320312105203c212f0c010b0b203b20036b21480c010b203b410274213c2001203b4104746a210302400340024020480d00410021480c020b02400240202f20032802002231200341046a28020022302005200520304b1b108805222f0d00200520304f0d030c010b202f417f4a0d020b2048417f6a2148200341706a2103203021052031212f0c000b0b203b2048490d01203b20424b0d02203b20486b22034101762231450d00203e20484104746a21052032203c4102746a21300340200441f8076a41086a222f200541086a223c290200370300200420052902003703f807203041086a223d290200210720052030290200370200203c2007370200203d202f290300370200203020042903f807370200200541106a2105203041706a21302031417f6a22310d000b0b2048450d04200341094b0d04203b20424b0d02203b20486b21032048417f6a2105203220484104746a21300340203b2005490d0b2030200341016a220310b6022005417f6a223120054f0d04203041706a2130203121052003410a490d000c040b0b2048203b41ccf7c0001048000b203b204241ccf7c0001042000b203b2048417f6a2205490d07203b204241dcf7c0001042000b203141016a21480b024020472046470d00204641016a22052046490d0a204641017422302005203020054b1b22054104200541044b1b220541ffffffff01712005464102742130200541037421050240024020460d00200441003602f8070c010b2004410436028008200420453602f807200420464103743602fc070b200441f8066a20052030200441f8076a10692004280280072105024020042802f8064101470d0020050d0f0c0b0b20042802fc062145200541037621460b204520474103746a2205200336020420052048360200204741016a22492147024020494102490d0003400240024002400240204520492247417f6a22494103746a2203280200450d00204741037420456a223141746a2802002230200328020422054d0d00204741024d0d0520452047417d6a224a4103746a2802042203200520306a4d0d01204741034d0d05203141646a280200200320306a4b0d050c010b20474103490d012003280204210520452047417d6a224a4103746a28020421030b20032005490d010b2047417e6a214a0b02400240024002402047204a41016a22034d0d0002402047204a4d0d0002402045204a4103746a224b280204220d204b2802006a2205204520034103746a224c280200224d490d000240200520424b0d00204b41046a214e203e204d4104746a2230204c280204224f41047422316a21032005410474212f02402005204d6b223b204f6b2205204f490d00204420302031108505220520316a21310240204f41014e0d00200521050c080b203b204f4a0d06200521050c070b2044200320054104742231108505224120316a2131204f4101480d0420054101480d042032202f6a2105034002400240203141706a222f280200200341706a223b280200203b280204223c202f280204223d203d203c4b1b10880522400d00417f203d203c47203d203c491b213c0c010b417f410120404100481b213c0b2005203b202f203c417f46223c1b223d290200370200200541086a203d41086a2902003702002031202f203c1b21312030203b2003203c1b22034f0d05200541706a2105203120414b0d000c050b0b20052042418cf8c0001042000b204d2005418cf8c0001048000b204a204741fcf7c0001033000b2003204741ecf7c0001033000b20412105200321300c010b203e202f6a213d20052105034002400240200328020020052802002005280204222f2003280204223b203b202f4b1b108805223c0d00417f203b202f47203b202f491b212f0c010b417f4101203c4100481b212f0b203020032005202f417f46222f1b223b290200370200203041086a203b41086a2902003702002005200541106a202f1b2105203041106a2130200341106a2003202f1b2203203d4f0d0120052031490d000b0b20302005203120056b4170711085051a204e200d204f6a360200204b204d360200204c204c41086a2047204a6b41037441706a1086051a41012147204941014b0d000b0b2048450d060c000b0b418486c20041fc00418087c2001050000b418486c20041fc00418087c2001050000b200441f0026a41186a200b2802002203360200200441f0026a41106a200c2903002207370300200441f0026a41086a200d290300220e370300200420042903f80722503703f002200441f8036a41186a222f2003360200200441f8036a41106a223b2007370300200441f8036a41086a223c200e370300200420503703f80320044198046a10ce014101102f2203450d09200341003a0000410041003502e0ac4220067c42adfed5e4d485fda8d8007e42218922073e02e0ac4220044190016a2009420042adfed5e4d485fda8d8004200108405200441f0006a200742a4bb99fed1a0bbb02385420042adfed5e4d485fda8d800420010840520044180016a200a420042adfed5e4d485fda8d8004200108405200441e0006a200742c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200441d0006a2007200885420042adfed5e4d485fda8d8004200108405200441f8076a418de2c10041011065201441186a200b290000370000201441106a200c290000370000201441086a200d290000370000201420042900f80737000020044281808080103702ec04200420033602e804200442003703e004200441bcf5c1003602dc04200441003602d8042004200441e0006a41086a29030020042903608520087c200441d0006a41086a29030020042903508542cf829ebbefefde82147c220e423088893703d0042004200720044180016a41086a290300200429038001857c200e422088893703c8042004200441f0006a41086a29030020042903708520087c200e421088893703c0042004200720044190016a41086a290300200429039001857c200e893703b8042032280208220541176a2203417f4c0d05203228020021300240024020030d00410121310c010b2003102f2231450d0a0b2004410036028008200420033602fc07200420313602f807200441f8076a418b90c200411710fd02200441f8076a2030200510fd0220042802fc072139200441f8066a200120042802f807225120042802800810e7020240024020042802f8064101470d0020044198056a41186a20044198046a41186a29030037030020044198056a41106a20044198046a41106a29030037030020044198056a41086a20044198046a41086a2903003703002004200429039804370398050c010b024020042802fc062203450d0002402004290380072207422088a72205450d00200420032d00003a00fc0720054101460d00200420032d00013a00fd0720054102460d00200420032d00023a00fe0720054103460d00200420032d00033a00ff0720054104460d00200d20032d00043a000020054105460d00200441f8076a41096a20032d00053a000020054106460d00200441f8076a410a6a20032d00063a000020054107460d00201720032d00073a000020054108460d00201520032d00083a000020054109460d00201820032d00093a00002005410a460d00201920032d000a3a00002005410b460d00201a20032d000b3a00002005410c460d00200c20032d000c3a00002005410d460d00201b20032d000d3a00002005410e460d00201c20032d000e3a00002005410f460d00201d20032d000f3a000020054110460d00200441f8076a41146a223020032d00103a000020054111460d00201e20032d00113a000020054112460d00201f20032d00123a000020054113460d00200441f8076a41176a20032d00133a000020054114460d00200b20032d00143a000020054115460d00202020032d00153a000020054116460d00202120032d00163a000020054117460d00202220032d00173a000020054118460d00202320032d00183a000020054119460d00202420032d00193a00002005411a460d00202520032d001a3a00002005411b460d00202620032d001b3a00002005411c460d00200441f8076a41206a20032d001c3a00002005411d460d00202720032d001d3a00002005411e460d00202820032d001e3a00002005411f460d00202920032d001f3a000020042f00950820262d000041107472410874200428009108220541187672214f20042f01fc0720042d00fe0741107472213d20042f00830820182d000041107472213120042f018a0820302d0000411074722130200428008d082141200428018608214720042800ff072142200428029808214002402007a7450d00200310300b200420053b00ad0520044198056a41176a20054110763a0000200420303b01a60520044198056a41106a20304110763a0000200420313b009f0520044198056a41096a20314110763a0000200420403602b4052004204f3602b005200420413600a905200420473601a2052004204236009b052004203d3b0198052004203d4110763a009a050c020b2007a7450d00200310300b20044198056a41186a20044198046a41186a29030037030020044198056a41106a20044198046a41106a29030037030020044198056a41086a20044198046a41086a2903003703002004200429039804370398050b200420013602b8052004200441b8046a3602bc0520322802002103200420322802083602d005200420033602cc052004200441b8056a3602c805200441d8056a41186a20044198056a41186a223a290300370300200441d8056a41106a20044198056a41106a2243290300370300200441d8056a41086a223520044198056a41086a225229030037030020042004290398053703d805200441f8076a200441c8056a4180a3c000200441d8056a10fe0220042802fc07210520042802f8072103200441f8066a200d4180011085051a024002400240024002400240024020034101460d00200441f8056a200441f8066a4180011085051a200441f8066a41186a2236202f2802002203360200200441f8066a41106a2237203b290300370300200441f8066a41086a2238203c290300370300200420042903f8033703f8062003450d0220042003417f6a223b36029007200441f8066a410020042802fc061b222f280200213002400240202f2802082231202f28020422052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b202f2005360204202f4100360200202f203036020802400240200320314107746a22304188016a28020022054106490d0020304194016a280200210520304190016a28020021300c010b20304190016a21300b02400240024002402030450d002005450d000240024020302005417f6a41186c6a220528020022300d00410021300c010b2005280208212f0b417f203b41016a22052005203b491b220541ffffffff00712005470d1020054104742205417f4c0d1020032031410c6c6a2203410c6a2802002131200341046a28020021032005102f223e450d14203e202f36020c203e2030360208203e2031360204203e2003360200200b20362802002203360200200c2037290300370300200d2038290300370300200420042903f8063703f8072005410476213f024020030d00410121490c040b20042003417f6a223b36029008200441f8076a410020042802fc071b222f280200213002400240202f2802082231202f28020422052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b202f2005360204202f4100360200202f2030360208200320314107746a4188016a210520032031410c6c6a41046a210341012149024002400340200328020821302003280200213102400240200528020022034106490d00200528020c2103200528020821050c010b200541086a21050b2005450d022003450d020240024020052003417f6a41186c6a220328020022050d00410021050c010b2003280208212f0b0240203f2049470d00203f417f203b41016a22032003203b491b6a2203203f490d14203f410174223b2003203b20034b1b22034104200341044b1b220341ffffffff0071200346410274213b2003410474210302400240203f0d00200441003602b0090c010b2004203e3602b009200441043602b8092004203f4104743602b4090b200441a0096a2003203b200441b0096a106920042802a809210320042802a0094101460d0220042802a409213e2003410476213f0b203e20494104746a2203200536020820032030360204200320313602002003410c6a202f360200204941016a214902402004280290082203450d0020042003417f6a223b36029008200441f8076a410020042802fc071b222f280200213002400240202f2802082231202f28020422052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b202f2005360204202f4100360200202f2030360208200320314107746a4188016a210520032031410c6c6a41046a21030c010b0b0240204941144b0d00204941014d0d06203e20494104746a41606a21034101210503402003200541016a220510b602200341706a210320492005470d000c070b0b2049410176220341ffffffff00712003470d1220034104742253417f4c0d122053102f2246450d16203e41706a2134203e41506a215441002133202d214a41002147204921440340024002402044223b417f6a22030d0041012103410021440c010b02400240203e20034104746a2203280200203e203b417e6a22444104746a2205280200222f2005280204220520032802042203200320054b1b10880522300d00417f200320054720032005491b21030c010b417f410120304100481b21030b0240024002400240024002402003417f460d002054203b4104746a21304102210303400240203b2003470d0041002144203b21030c080b024002400240202f2030280200223c203041046a28020022312005200520314b1b108805222f0d00200520314f0d010c020b202f4100480d010b203041706a2130200341016a210320312105203c212f0c010b0b203b20036b21440c010b203b410274213c2054203b4104746a210302400340024020440d00410021440c020b02400240202f20032802002231200341046a28020022302005200520304b1b108805222f0d00200520304f0d030c010b202f417f4a0d020b2044417f6a2144200341706a2103203021052031212f0c000b0b203b2044490d01203b20494b0d02203b20446b22034101762231450d00203e20444104746a21052034203c4102746a21300340200d200541086a222f290200370300200420052902003703f807203041086a223c290200210720052030290200370200202f2007370200203c200d290300370200203020042903f807370200200541106a2105203041706a21302031417f6a22310d000b0b2044450d04200341094b0d04203b20494b0d02203b20446b21032044417f6a2105203420444104746a21300340203b2005490d0a2030200341016a220310b6022005417f6a223120054f0d04203041706a2130203121052003410a490d000c040b0b2044203b41ccf7c0001048000b203b204941ccf7c0001042000b203b2044417f6a2205490d06203b204941dcf7c0001042000b203141016a21440b024020472033470d00203341016a22052033490d14203341017422302005203020054b1b22054104200541044b1b220541ffffffff01712005464102742130200541037421050240024020330d00200441003602f8070c010b20044104360280082004204a3602f807200420334103743602fc070b200441f8066a20052030200441f8076a10692004280280072105024020042802f8064101470d0020050d190c150b20042802fc06214a200541037621330b204a20474103746a2205200336020420052044360200204741016a224c21470240204c4102490d0003400240024002400240204a204c2247417f6a224c4103746a2203280200450d002047410374204a6a223141746a2802002230200328020422054d0d00204741024d0d05204a2047417d6a224f4103746a2802042203200520306a4d0d01204741034d0d05203141646a280200200320306a4b0d050c010b20474103490d0120032802042105204a2047417d6a224f4103746a28020421030b20032005490d010b2047417e6a214f0b02400240024002402047204f41016a22034d0d0002402047204f4d0d000240204a204f4103746a2245280204224e20452802006a2205204a20034103746a224d280200224b490d000240200520494b0d00204541046a2148203e204b4104746a2230204d280204224241047422316a21032005410474212f02402005204b6b223b20426b22052042490d00204620302031108505220520316a21310240204241014e0d00200521050c080b203b20424a0d06200521050c070b2046200320054104742231108505224120316a213120424101480d0420054101480d042034202f6a2105034002400240203141706a222f280200200341706a223b280200203b280204223c202f280204223d203d203c4b1b10880522400d00417f203d203c47203d203c491b213c0c010b417f410120404100481b213c0b2005203b202f203c417f46223c1b223d290200370200200541086a203d41086a2902003702002031202f203c1b21312030203b2003203c1b22034f0d05200541706a2105203120414b0d000c050b0b20052049418cf8c0001042000b204b2005418cf8c0001048000b204f204741fcf7c0001033000b2003204741ecf7c0001033000b20412105200321300c010b203e202f6a213d20052105034002400240200328020020052802002005280204222f2003280204223b203b202f4b1b108805223c0d00417f203b202f47203b202f491b212f0c010b417f4101203c4100481b212f0b203020032005202f417f46222f1b223b290200370200203041086a203b41086a2902003702002005200541106a202f1b2105203041106a2130200341106a2003202f1b2203203d4f0d0120052031490d000b0b20302005203120056b4170711085051a2048204e20426a3602002045204b360200204d204d41086a2047204f6b41037441706a1086051a41012147204c41014b0d000b0b2044450d050c000b0b20030d150c110b418486c20041fc00418087c2001050000b418486c20041fc00418087c2001050000b2005203b41dcf7c0001048000b0240203341ffffffff0171450d00204a10300b2053450d00204610300b2049450d01203e20494104746a213d203e21030240034020032802002230450d03200341046a2802002131024002400240200341086a280200222f0d00200441f8076a200441f8056a2030203110ff0220042802fc07210520042802f8074101460d0420042903800821070c010b2003410c6a280200210520044100360280090240024020042d00d0064101460d004100213b0c010b200441c4056a41026a201241026a2d00003a00002038201141086a2902003703002037201141106a2902003703002036201141186a2d00003a0000200420122f00003b01c405200420112902003703f8064101213b0b20042802d406213c201020042f01c4053b0000200d20042903f806370200201041026a200441c4056a41026a2d00003a0000200d41086a2038290300370200200d41106a2037290300370200200d41186a20362802003602002004203b3a00f8072004203c3602fc07200441003602a809200420313602a409200420303602a0092005417f4c0d100240024020050d00410121300c010b2005102f2230450d150b200420053602b409200420303602b0092030202f20051085051a200420053602b80920044190096a200441f8056a200441f8076a200441a0096a200441b0096a20044180096a10800320042802940921052004280290094101460d01200420053602d406200441003a00d006200428028009210520042902840921070b02402005450d002007a7450d00200510300b200341106a2203203d470d010c040b0b2004280280092203450d00200428028409450d00200310300b0240203f41ffffffff0071450d00203e10300b200441f8056a10b1010b20052d00000e0404040304020b203f41ffffffff0071450d00203e10300b200441f8056a10b101200441f8066a41026a20042d00da0522033a0000200d200f41086a290000370300200c200f41106a290000370300200b200f41186a2d00003a0000200420042f01d80522053b01f8062004200f2900003703f807200420053b019805200420033a009a05200420042800db0536009b05201320042903f807370000201341086a200d290300370000201341106a200c290300370000201341186a200b2d00003a00000c030b200541286a280200450d01200541246a28020010300c010b200541086a280200450d00200541046a2802001030200510300c010b200510300b20044198056a20044198046a41201088052105200b203a290300370300200c2043290300370300200d205229030037030020042004290398053703f8072016200441b8046a41e000108505210302402039450d00205110300b200441f8056a41186a200b290300370300200441f8056a41106a200c290300370300200441f8056a41086a200d290300370300200420042903f8073703f805200441f8066a200341e0001085051a2032280208223041176a2203417f4c0d05203228020021310240024020030d004101212f0c010b2003102f222f450d0a0b200d4100360200200420033602fc072004202f3602f807200441f8076a418b90c200411710fd02200441f8076a2031203010fd022035200d280200360200200420042903f8073703d805200441f8076a200441f8066a41e0001085051a200441f0016a200441f8076a10c2030240024020050d00200441b8046a41086a22052035280200360200200420042903d8053703b8040240202b202c470d00202b41016a2203202b490d08202b41017422302003203020034b1b22034104200341044b1bad42187e2207422088a74541027421032007a7213002400240202b0d00200441003602f8070c010b20044104360280082004202e3602f8072004202b41186c3602fc070b20044190036a20302003200441f8076a1069200428029803210302402004280290034101470d0020030d0d0c090b200428029403212e200341186e212c0b202e202b41186c6a220320042903b804370200200528020021052003410036020c200341086a20053602000c010b200d2035280200360200200420042903d8053703f8072004410036028c0820044201370284084120102f2203450d0a2004422037029403200420033602900320044190036a200441f8056a412010642015200428029003220320042802980310640240200428029403450d00200310300b0240202b202c470d00202b41016a2203202b490d07202b41017422052003200520034b1b22034104200341044b1bad42187e2207422088a74541027421032007a7210502400240202b0d0020044100360290030c010b20044104360298032004202e360290032004202b41186c360294030b200441b8046a2005200320044190036a106920042802c0042103024020042802b8044101470d0020030d0c0c080b20042802bc04212e200341186e212c0b202e202b41186c6a220320042903f807370200200341106a200c290300370200200341086a200d2903003702000b202a41186a212a202b41016a212b0c000b0b2005203b41dcf7c0001048000b0240204641ffffffff0171450d00204510300b2043450d00204410300b2042450d02203e20424104746a2147200441f8076a41086a2130200441f8076a410172213c200441d8066a213d200441d1066a2142203e21030240034020032802002231450d04200341046a280200212f024002400240200341086a280200223b0d00200441f8076a200441f8056a2031202f10ff0220042802fc07210520042802f8074101460d0420042903800821070c010b2003410c6a2802002105200441003602f0020240024020042d00d0064101460d00410021400c010b200441c4056a41026a204241026a2d00003a0000200441f8066a41086a203d41086a290200370300200441f8066a41106a203d41106a290200370300200441f8066a41186a203d41186a2d00003a0000200420422f00003b01c4052004203d2902003703f806410121400b20042802d4062141203c20042f01c4053b0000203020042903f806370200203c41026a200441c4056a41026a2d00003a0000203041086a200441f8066a41086a290300370200203041106a200441f8066a41106a290300370200203041186a200441f8066a41186a280200360200200420403a00f807200420413602fc07200441003602a0042004202f36029c0420042031360298042005417f4c0d050240024020050d00410121310c010b2005102f2231450d0a0b2004200536029c0520042031360298052031203b20051085051a200420053602a005200441f8036a200441f8056a200441f8076a20044198046a20044198056a200441f0026a10800320042802fc03210520042802f8034101460d01200420053602d406200441003a00d00620042802f002210520042902f40221070b02402005450d002007a7450d00200510300b200341106a22032047470d010c050b0b20042802f0022203450d0020042802f402450d00200310300b0240203f41ffffffff0071450d00203e10300b200441f8056a10b1010b20394110742103201041107421312037411074212f2035411074213b02400240024020052d00000e0402020002010b200541086a280200450d01200541046a28020010300c010b200541286a280200450d00200541246a28020010300b20112003722130203820317221312036202f72212f203a203b722103200510300c030b102c000b203f41ffffffff0071450d00203e10300b200441f8056a10b10120042f01b80420042d00ba0441107472210320042f00cd04200441cf046a2d000041107472213020042f01c604200441b8046a41106a2d000041107472213120042f00bf04200441c1046a2d000041107472212f20042800bb04210c20042801c204213320042800c904210b20042802d004211420042802d40421340b200441f8076a20044190036a41e0001085051a200041176a20304110763a0000200020303b0015200041106a20314110763a0000200020313b000e200041096a202f4110763a00002000202f3b0007200041026a20034110763a0000200020033b01002000203436001c200020143600182000200b3600112000203336000a2000200c360003200441f8066a200441f8076a41e0001085051a200441f8076a200441f8066a41e0001085051a200441f0016a200441f8076a10c203200041206a200441f0016a41e0001085051a0240202b450d00202e210303400240200341046a280200450d00200328020010300b02402003410c6a2802002205450d00200341106a280200450d00200510300b200341186a2103202a41686a222a0d000b0b0240202c450d00202c41186c450d00202e10300b200441c0096a24000f0b102a000bbd0402037f017e230041206b22052400024002400240024002400240024002400240200128020022064198016a2002280200200228020810ed022207450d0020072003200410e6022207450d0002400240200728020022024106490d00200728020c2102200728020821010c010b200741086a21010b2001450d022002450d0202400240024020012002417f6a41186c6a2201280200450d0020062802000d06200141086a22023502002108200641003602002006200629030842017c3703082006280210450d0141b082c2004110200541186a41c082c20041c483c2001034000b20062802000d0641002101200641003602002006200629030842017c37030820062802100d07200641003602100c010b20064100360210200641186a2206200629030020087c37030020022802002202417f4c0d07200128020021060240024020020d00410121010c010b2002102f2201450d090b2001200620021085051a0b2000200236020420002001360200200041086a20023602000c010b200541086a200128020420022003200410ee0220052802084101460d072000200529020c370200200041086a200541146a2802003602000b200541206a24000f0b418486c20041fc00418087c2001050000b41b082c2004110200541186a41c082c20041b483c2001034000b41b082c2004110200541186a41c082c20041b483c2001034000b41b082c2004110200541186a41c082c20041c483c2001034000b102c000b102a000b41d488c1004130200541186a41dcfcc00041fcfcc0001034000bc70101067f024020002802042203450d00200028020021040340200341046a210020032f01d60921054100210603400240024020052006460d000240024020012000280200200041086a2802002207200220072002491b10880522080d00200720024b0d01200720024721070c030b41012107200841004e0d020b200621050b2004450d032004417f6a2104200320054102746a41d8096a28020021030c020b200641016a21062000410c6a210020070d000b0b20032006417f6a41e4006c6a4188016a0f0b41000bb60704047f017e037f017e230041f0006b220524000240024002402002280208220641176a2207417f4c0d00200228020021020240024020070d00410121080c010b2007102f2208450d020b200541003602182005200736021420052008360210200541106a418b90c200411710fd02200541106a2002200610fd0220052802142107200541106a200120052802102208200528021810e70202402007450d00200810300b0240024020052802104101460d0002400240200528021422070d00200541106a10ce0120054100360208200542013703004120102f2207450d052005422037025420052007360250200541d0006a200541106a412010642005200528025022072005280258106402402005280254450d00200710300b20052802002107200528020821080c010b200541186a290300210920052007360200200520093702042009422088a721080b200541106a41186a220a4200370300200541106a41106a220b4200370300200541106a41086a220c42003703002005420037031020084120470d04200a200741186a290000370300200b200741106a290000370300200c200741086a29000037030020052007290000370310200541306a41086a20063602002005200236023420052001360230200541e0006a41086a41002802b8f541360200200541002902b0f541370360024002400240200541306a200541106a200541e0006a10d4010d004130102f2202450d06200241003a000020022005290310370001200241096a200541186a290300370000200241116a200541206a290300370000200241196a200541286a2903003700000c010b2005410036025c200541a8a3c0003602542005200541106a3602582005200541306a360250200541c0006a200541d0006a20032004109104024020052802404101460d0002400240200528024422060d004200210d42002109410021020c010b200541c8006a290300220d4220882209a72201417f4c0d060240024020010d00410121020c010b2001102f2202450d080b2002200620011085051a0240200da7450d00200610300b200d42808080807083210d0b200041086a2009200d8437020020002002360204200041003602000c020b200528024421020b02400240024020022d00000e0402020002010b200241086a280200450d01200241046a28020010300c010b200241286a280200450d00200241246a28020010300b20021030200041013602000b2005280204450d01200710300c010b200041013602000b200541f0006a24000f0b102c000b102a000b41202008418c91c200105b000b150020004200370204200041002802e88f423602000b6501037f2001280204210220012802002103024020012802082201450d00200141047421042003210103400240200141046a280200450d00200128020010300b200141106a2101200441706a22040d000b0b0240200241ffffffff0071450d00200310300b0bc80302037f017e230041106b22032400024002400240024002400240024002402000280200220441c0006a2001200210e6022205450d0002400240200528020022014106490d00200528020c2101200528020821050c010b200541086a21050b2005450d022001450d02024020052001417f6a41186c6a2205280200450d0020042802000d04200541086a3502002106200441003602002004200429030842017c37030820042802100d0520044100360210200441186a2204200429030020067c370300200528020021050c020b20042802000d0541002105200441003602002004200429030842017c37030820042802100d06200441003602100c010b200320002802042001200210e70220032802004101460d060240200328020422050d00410021050c010b200341086a280200450d00200510300b200341106a240020054100470f0b418486c20041fc00418087c2001050000b41b082c2004110200341c082c20041b483c2001034000b41b082c2004110200341c082c20041c483c2001034000b41b082c2004110200341c082c20041b483c2001034000b41b082c2004110200341c082c20041c483c2001034000b41d488c1004130200341dcfcc000418cfdc0001034000b9a3c05127f017e027f017e037f23004190066b220324000240200041086a2802002204280224450d002004106c0b2004200329039003370300200441003602242004200329039005370328200441206a20034190036a41206a280200360200200441186a20034190036a41186a290300370300200441106a20034190036a41106a290300370300200441086a20034190036a41086a290300370300200441306a20034190056a41086a290300370300200441386a20034190056a41106a290300370300200441c0006a20034190056a41186a290300370300200441c8006a20034190056a41206a290300370300200441d0006a200341b8056a290300370300200441d8006a20034190056a41306a290300370300200441003a0060200441e1006a200329009004370000200441e9006a20034190046a41086a290000370000200441f1006a20034190046a41106a290000370000200441f9006a20034190046a41186a29000037000020044180016a200341af046a29000037000002400240024002400240024002400240024002400240024020012802082204417f4c0d002001280200210520002802002106410121074101210802402004450d002004102f2208450d0c0b2008200520041085052109200341086a200610c302200328020c210a2003280208210b02402004450d002004102f2207450d0c0b200720092004108505210c02400240200641c4006a280200220d450d002006280240210e0c010b418c0c102f220d450d0c4100210e200d41003b018a0c200d41003602002006200d360244200641003602400b02400340200d2f018a0c220f410c6c210741782110200d41046a221121084100211202400340024020070d00200f21120c020b02400240200c2008280200200828020822132004200420134b1b10880522140d0020042013490d03200420134721130c010b4101211320144100480d020b2008410c6a2108201241016a2112201041807f6a2110200741746a210720130d000b02402004450d00200c10300b200d20106b21140c020b0240200e450d00200e417f6a210e200d20124102746a418c0c6a280200210d0c010b0b02400240200f410a4b0d00201241016a210702402012200f4f22130d0020112007410c6c6a20112012410c6c6a200f20126b410c6c1086051a0b20112012410c6c6a22082004360208200820043602042008200c36020020034190056a20034190046a41f8001085051a200d4188016a2108024020130d00200820074107746a200820124107746a200f20126b4107741086051a0b200820124107746a22144200370200201441086a20034190056a41f8001085051a200d200f41016a3b018a0c0c010b410521084100211402400240201241054f0d0041042108201221070c010b41052107024002402012417b6a0e020201000b201241796a210741012114410621080c010b41002107410121140b418c0c102f2213450d0d201341003b018a0c201341003602002013200d2f018a0c220e2008417f736a22123b018a0c20112008410c6c6a221029020421152010280200210f20034190056a200d4188016a221620084107746a4180011085051a0240024002400240024002400240024002402012410c4f0d00200e200841016a22106b2012470d01201341046a20112010410c6c6a2012410c6c1085051a20134188016a201620104107746a20124107741085051a200d20083b018a0c20034190046a20034190056a4180011085051a2013200d20141b220841046a21120240200741016a221420082f018a0c22104b220e0d0020122014410c6c6a20122007410c6c6a201020076b410c6c1086051a0b20122007410c6c6a22122004360208201220043602042012200c36020020034190056a20034190026a41f8001085051a20084188016a21120240200e0d00201220144107746a201220074107746a201020076b4107741086051a0b201220074107746a22144200370200201441086a20034190056a41f8001085051a2008201041016a3b018a0c20034190036a20034190046a4180011085051a20034190016a20034190036a4180011085051a024002400240200d28020022080d00410021160c010b410021162013211720152118200f21190340200d2f01880c211020034190026a20034190016a4180011085051a2008220e2f018a0c2211410b490d024100210d41042108024020104105490d0020102108024002402010417b6a0e020201000b201041796a21104101210d410621080c010b410021104101210d410521080b41bc0c102f2213450d19201341003b018a0c201341003602002013200e2f018a0c221a2008417f736a22073b018a0c200e2008410c6c6a221241086a2902002115201241046a280200210f20034190056a200e4188016a221b20084107746a4180011085051a2007410c4f0d05201a200841016a220c6b2007470d06201341046a201241106a2007410c6c1085051a20134188016a201b200c4107746a20074107741085051a200e20083b018a0c20034190046a20034190056a4180011085051a20132f018a0c220741016a21122007410c4f0d07201120086b22082012470d08201641016a21162013418c0c6a200e200c4102746a418c0c6a20084102741085051a4100210802400340201320084102746a418c0c6a280200221220083b01880c20122013360200200820074f0d01200820082007496a220820074d0d000b0b20034190036a20034190046a4180011085051a2013200e200d1b221241046a210c0240201041016a220820122f018a0c22074b22110d00200c2008410c6c6a200c2010410c6c6a200720106b410c6c1086051a0b200c2010410c6c6a220c2018370204200c201936020020034190056a20034190026a4180011085051a20124188016a210d024020110d00200d20084107746a200d20104107746a200720106b4107741086051a0b200741016a210c200d20104107746a20034190056a4180011085051a2012418c0c6a210d0240201041026a2219200741026a22114f0d00200d20194102746a200d20084102746a200720106b4102741086051a0b200d20084102746a20173602002012200c3b018a0c0240200820114f0d00201220104102746a41900c6a2108034020082802002207201041016a22103b01880c20072012360200200841046a2108200c2010470d000b0b20034190016a20034190036a4180011085051a200e210d2013211720152118200f2119200e28020022080d000b0b200341106a20034190016a4180011085051a20062802442207450d072006280240211241bc0c102f2208450d172008200736028c0c200841003b018a0c20084100360200200741003b01880c20072008360200200620083602442006201241016a36024020122016470d0820082f018a0c2207410b4f0d092008200741016a22123b018a0c20082007410c6c6a221041086a2015370200201041046a200f360200200820074107746a4188016a200341106a4180011085051a2008418c0c6a20124102746a2013360200201320123b01880c20132008360200200641c8006a2208200828020041016a3602000c0b0b200e41046a21080240201120104d22070d0020082010410c6c6a2213410c6a2013201120106b410c6c1086051a0b20082010410c6c6a220820183702042008201936020020034190056a20034190016a4180011085051a201041016a2108200e4188016a2113024020070d00201320084107746a201320104107746a201120106b4107741086051a0b201141016a2112201320104107746a20034190056a4180011085051a200e418c0c6a2113201141026a210c024020070d00201041027420136a41086a201320084102746a201120106b4102741086051a0b200e20123b018a0c201320084102746a20173602002008200c4f0d09201141016a2112200e2008417f6a22084102746a41900c6a2107034020072802002213200841016a22083b01880c2013200e360200200741046a210720122008470d000c0a0b0b2012410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2007410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2012410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b200641c8006a2208200828020041016a3602000b02400240200641cc006a28020022084106490d00200641d8006a2802002108200641d4006a28020021060c010b200641d4006a21060b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006450d0020080d010b41002112024020040d00410021130c020b20091030410021130c010b20062008417f6a2217410c6c6a220f41046a211602400240200f280204220c450d00200f280200210d0c010b418c01102f220c450d224100210d200c41003b018a01200c41003602002016200c360200200f41003602000b0340200c2f018a01220e410c6c2107200c41046a221121084100211202400340024020070d00200e21120c020b0240024020092008280200200828020822132004200420134b1b10880522100d0020042013490d03200420134721130c010b4101211320104100480d020b2008410c6a2108201241016a2112200741746a210720130d000b41002113410121122004450d02200910300c020b0240200d450d00200d417f6a210d200c20124102746a418c016a280200210c0c010b0b024002400240200e410a4b0d0002402012200e4f0d0020112012410c6c6a2208410c6a2008200e20126b410c6c1086051a0b20112012410c6c6a220820093602002008200436020820082004360204200c200e41016a3b018a010c010b410521084100211002400240201241054f0d0041042108201221070c010b41052107024002402012417b6a0e020201000b201241796a210741012110410621080c010b41002107410121100b418c01102f2213450d23201341003b018a01201341003602002013200c2f018a01220d2008417f736a22123b018a012012410c4f0d03200d200841016a22196b2012470d0420112008410c6c6a220d2902042115200d280200210e201341046a20112019410c6c6a2012410c6c1085051a200c20083b018a012013200c20101b220841046a21120240200741016a220d20082f018a0122104b0d002012200d410c6c6a20122007410c6c6a201020076b410c6c1086051a0b20122007410c6c6a2207200936020020072004360208200720043602042008201041016a3b018a01024002400240200c28020022080d00410021110c010b410021112013211920152118200e211a0340200c2f0188012110200822092f018a01220d410b490d024100210c41042108024020104105490d0020102108024002402010417b6a0e020201000b201041796a21104101210c410621080c010b410021104101210c410521080b41bc01102f2213450d26201341003b018a0120134100360200201320092f018a0122122008417f736a22073b018a012007410c4f0d082012200841016a221b6b2007470d0920092008410c6c6a221241086a2902002115201241046a280200210e201341046a201241106a2007410c6c1085051a200920083b018a0120132f018a01220741016a21122007410c4f0d0a200d20086b22082012470d0b201141016a21112013418c016a2009201b4102746a418c016a20084102741085051a4100210802400340201320084102746a418c016a280200221220083b01880120122013360200200820074f0d01200820082007496a220820074d0d000b0b20132009200c1b221241046a210d0240201041016a220820122f018a0122074b0d00200d2008410c6c6a200d2010410c6c6a200720106b410c6c1086051a0b200741016a210c200d2010410c6c6a220d2018370204200d201a3602002012418c016a210d0240201041026a221b200741026a221a4f0d00200d201b4102746a200d20084102746a200720106b4102741086051a0b200d20084102746a20193602002012200c3b018a0102402008201a4f0d00201220104102746a4190016a2108034020082802002207201041016a22103b01880120072012360200200841046a2108200c2010470d000b0b2009210c2013211920152118200e211a200928020022080d000b0b20162802002207450d0a200f280200211241bc01102f2208450d242008200736028c01200841003b018a0120084100360200200741003b0188012007200836020020162008360200200f201241016a36020020122011470d0b20082f018a012207410b4f0d0c410121122008200741016a22103b018a0120082007410c6c6a220741086a2015370200200741046a200e3602002008418c016a20104102746a2013360200201320103b0188012013200836020020062017410c6c6a2208200828020841016a3602080c020b201041016a2108200941046a2107200d41016a211302400240200d20104b0d0020072010410c6c6a220720183702042007201a3602002009418c016a2107200d41026a21120c010b20072008410c6c6a20072010410c6c6a2207200d20106b2212410c6c1086051a200720183702042007201a36020020104102742009418c016a22076a41086a200720084102746a20124102741086051a200d41026a21120b2007200841027422106a2019360200200920133b018a01200820124f0d00201020096a418c016a210703402007280200221320083b01880120132009360200200741046a21072012200841016a2208470d000b0b4101211220062017410c6c6a2208200828020841016a3602080b410121130b02400240201428020022084106490d00201428020c2108201428020821070c010b201441086a21070b201220137121130240024002400240024002402007450d0020080d010b20034190056a20002802042005200410e7022003280290054101460d0e20034190046a41086a20034190056a41086a290300420020032802940522041b37030020034101360290042003200441002802dc944220041b3602940420034190046a410472210420130d02201428020022084106490d012014410c6a2802002208450d0220034190056a41086a200441086a280200360200200320042902003703900520034190056a2107201428020822040d04418486c20041fc00418888c2001050000b02402013450d000240024020072008417f6a220441186c6a28020022130d00410021080c010b2007200441186c6a2802082204417f4c0d1b0240024020040d00410121080c010b2004102f2208450d270b2008201320041085051a0b2003419c046a200436020020034198046a20043602002003200836029404200341013602900420034190046a41047221040c020b4100210820034100360290040c180b20080d010b20034190056a41086a200441086a28020036020020032004290200370390050240024002400240201428020022044106490d00201428020c22072004460d012014410c6a21080c170b4105210720044105460d01201441086a211220042107201421080c170b201428020c2108200421070c010b200421080b20072008470d12200841016a22072008490d0f4100417f2007417f6a677620074102491b220741016a22082007490d0f0240024020044106490d00201428020c210720142802082112200421130c010b201441086a211241052113200421070b200720084b0d0c0240200841054b0d00200441054d0d1320144100360204201441086a2012200741186c1085051a201420073602002013ad42187e2215422088a70d0e201210300c130b20132008470d0e0c120b20034190056a41086a200441086a2802003602002003200429020037039005201441086a210420034190056a21070b024020042008417f6a41186c6a22042802002208450d00200441046a280200450d00200810300b20042007290200370200200441086a200741086a2802003602000c130b2012410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2007410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2012410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b41d488c100413020034190046a418489c100419489c1001034000b41c29ac200412041e49ac200102d000b200341003602940320032015a73602900341bea9c200412b20034190036a41ccfcc00041f485c2001034000b2008ad42187e2215422088a70d002015a721100240200441054b0d002010102f2204450d1420042012200741186c1085051a0c030b2013ad42187e2215422088a7450d010b41d099c200411141e499c200102d000b2010102f2204450d112004201220102015a72213201320104b1b1085051a201210300b2014200736020c2014200436020820144101360204201420083602000b2014410c6a2108201428020c21070b201428020821120b20034190056a41086a280200211320032903900521152012200741186c6a220441002802e88f4236020c20042015370200200441106a4200370200200441086a20133602002008200828020041016a3602000b41012108200b4101470d0002400240201428020022044106490d00201428020c2104201428020821070c010b201441086a21070b2004450d022007450d0220072004417f6a41186c6a2207410c6a2113024020072802142204450d00200441027420132802006a417c6a280200200a460d010b200741146a211202402004200741106a280200470d0020132004410110f302201228020021040b201328020020044102746a200a360200410121082012201228020041016a3602000b02400240201428020022044106490d00201428020c2104201428020821070c010b201441086a21070b2007450d022004450d0202402008200328029004410147720d002003280294042208450d0020034198046a280200450d00200810300b024020072004417f6a221341186c6a22082802000d00200841002802dc9442360200200842003702040b410c102f2204450d0b20042002290200370200200441086a200241086a28020036020020034190036a41086a2212200841086a2802003602002003200829020037039003200841002802dc94423602002007201341186c6a22074100360208200741046a2213410036020020034190046a41086a20122802002207360200200320032903900337039004024020070d0020034190046a410110f40220034190046a2004280200200428020810640c080b2007417f6a210c02400240024020032802900422122d0000221041037122144103460d0002400240024020140e03000102000b201041027621100c030b200c450d0320122d0001410874201072221041ffff0371418002490d03201041fcff037141027621100c020b200c4103490d0220122f0001201241036a2d000041107472410874201072221041ffff034d0d02201041027621100c010b201041034b0d01200c4104490d0120122800012210418080808004490d010b41012114201041016a220c2010490d000240201041c000490d0041022114201041808001490d00410441052010418080808004491b21140b410121120240200c41c000490d0041022112200c41808001490d0041044105200c418080808004491b21120b024020122014470d00200320034190046a36029005200c20034190056a201410f50220034190046a2004280200200428020810640c090b201220146b20076a220741046a2210417f4c0d010240024020100d00410121090c010b2010102f2209450d0d0b200320103602940520032009360290052003200736029805200320034190056a36029002200c20034190026a201210f50220072012490d0420032802980522102007490d0520032802980422102014490d060240200720126b2207201020146b2210460d0020072010418c91c200105b000b20032802900520126a20032802900420146a20071085051a20034190056a20042802002004280208106420032902940521152003280290052107200328029404450d0920032802900410300c090b2003280294040d060c090b102c000b418486c20041fc00419888c2001050000b418486c20041fc00418888c2001050000b2012200741f483c2001048000b2007201041f483c2001042000b20142010418484c200104a000b201210300c020b200329029404211520032802900421070b2007450d00200320153702940520032007360290050c010b4110102f2207450d012003421037029405200320073602900520034190056a410110f40220034190056a2004280200200428020810640b02402013280200450d00200828020010300b2008200329039005370200200841086a20034190056a41086a2802003602000240200441046a280200450d00200428020010300b200410300240200141046a280200450d00200128020010300b20034190066a24000f0b102a000be10101027f230041206b22032400024002400240200041046a280200220420016b20024f0d00200120026a22022001490d02200441017422012002200120024b1b22014104200141044b1b220141ffffffff03712001464102742102200141027421010240024020040d00200341003602100c010b200341186a410436020020032004410274360214200320002802003602100b200320012002200341106a1069200341086a280200210120032802004101460d0120002003280204360200200041046a20014102763602000b200341206a24000f0b2001450d00102a000b102c000ba80101017f230041106b220224000240024002400240200141c000490d00200141808001490d012001418080808004490d02200241033a000f20002002410f6a410110642002200136020020002002410410640c030b200220014102743a000f20002002410f6a410110640c020b200220014102744101723b01062000200241066a410210640c010b200220014102744102723602082000200241086a410410640b200241106a24000be00101027f230041106b220324000240024002400240200041c000490d00200041808001490d012000418080808004490d02200320003600054105210420034105360200200341033a00040c030b200320004102743a0004410121040c020b4102210420034102360200200320004102744101723b01040c010b4104210420034104360200200320004102744102723602040b024002402001280200220028020822012002490d0020042002470d012000280200200341047220021085051a200341106a24000f0b20022001419484c2001042000b20022004418c91c200105b000be60301067f230041206b22042400200441086a20012802042205200541e0006a41002002200310f702024002400240024002400240024020042802084101460d00200441146a2802002106200441106a22072802002108200428020c2105200441086a200128020041c0006a2002200310f80220072802002107200428020c2102200428020821030240024020050d002003450d010c040b20030d020b2000200836020420002005360200200041086a20063602000c030b41d488c1004130200441186a41dcfcc000419cfdc0001034000b024002402005200320022006200620024b1b10880522090d00200620024f0d020c010b2009417f4a0d010b2000200836020420002005360200200041086a20063602000c010b02400240200728020022064106490d002007410c6a2802002106200741086a28020021070c010b200741086a21070b2007450d012006450d0102400240200641186c20076a41686a2802000d00200020012003200210f6020c010b2002417f4c0d030240024020020d00410121010c010b2002102f2201450d050b2001200320021085052101200041086a200236020020002002360204200020013602000b2005450d002008450d00200510300b200441206a24000f0b418486c20041fc00418087c2001050000b102c000b102a000bb30b02067f017e230041f0016b220624000240024020030d004180dec10021030c010b200641106a2003280208360200200620013602082006200328020036020c41ecddc1002103200641086a21010b200641a8016a41086a220741002802b8f541360200200641002902b0f5413703a801024002400240024002400240024020012002200641a8016a20032802101100000d004130102f22010d010c060b20064100360224200620023602202006200336021c20062001360218200641a8016a200641186a10da02200641e8006a41086a200641a8016a41106a290300370300200641e8006a41106a2202200641a8016a41186a290300370300200641e8006a41186a2203200641a8016a41206a290300370300200641e8006a41206a2208200641a8016a41286a290300370300200641e8006a41286a2209200641a8016a41306a290300370300200641e8006a41306a220a200641a8016a41386a290300370300200641e8006a41386a220b200641a8016a41c0006a2802003602002006200729030037036820062802ac012101024020062802a8014101460d00200641286a41386a200b280200360200200641286a41306a200a290300370300200641286a41286a2009290300370300200641286a41206a2008290300370300200641286a41186a2003290300370300200641286a41106a2002290300370300200641286a41086a2203200641e8006a41086a2903003703002006200629036837032841c000102f2202450d0620022001360200200220062903283702042002410c6a2003290300370200200241146a200641386a2903003702002002411c6a200641c0006a290300370200200241246a200641c8006a2903003702002002412c6a200641d0006a290300370200200241346a200641d8006a2903003702002002413c6a200641e0006a28020036020041012103200541016a2201417f4a0d020c050b0240024020012d00000e0404040004010b200141086a280200450d03200141046a28020010300c030b200141286a280200450d02200141246a28020010300c020b200141003a000020012002290000370001200141096a200241086a290000370000200141116a200241106a290000370000200141196a200241186a29000037000020011030200041013602000c020b02402001450d002001102f2203450d040b200641003602302006200136022c20062003360228200641286a2004200510b903024002400240024002400240024020062802302201200628022c2203470d00200141016a22032001490d09200141017422072003200720034b1b22034108200341084b1b21030240024020010d00200641003602a8010c010b200641a8016a41086a4101360200200620013602ac01200620062802283602a8010b200641e8006a20034101200641a8016a1069200641f0006a280200210320062802684101460d01200628026c21072006200336022c200620073602280b2006280228220720016a41003a00002006200141016a220136023002402002200720011092042201450d0002400240024020012d00000e0402020002010b200141086a280200450d01200128020410300c010b200141286a280200450d00200128022410300b200110302000410136020020030d050c060b200641a8016a200210e4024100210120062802a80122054102470d010c020b20030d080c070b20062802ac012101024020054101470d0002400240024020012d00000e0402020002010b200141086a280200450d01200141046a28020010300c010b200141286a280200450d00200141246a28020010300b200110300c020b2001450d01200641b0016a290300210c200641bc016a280200450d00200641b8016a28020010300b2000200136020420004100360200200041086a200c3702002003450d020c010b200041013602002003450d010b200710300b2002108603200210300c010b20011030200041013602000b200641f0016a24000f0b102c000b102a000ba808010b7f230041206b22042400024002400240200128020422050d00200441186a41003602002004410036020c0c010b200128020021064101210102400340410221070240024002400240024020010e0400010302000b03400c000b0b200541046a210820052f018a0c2109410021010240034041012107024020092001470d00200921010c020b0240024020022008280200200841086a280200220a20032003200a4b1b108805220b0d002003200a490d032003200a4721070c010b41012107200b4100480d020b200141016a21012008410c6a210820070d000b410221070b200120052f018a0c22094d0d02418c81c200412441b081c200102d000b410321070b20052f018a0c2109410021010b024020012009490d002006450d022006417f6a2106200520014102746a418c0c6a2802002105200721010c010b0b0240024020060d002005210c0c010b2005210c0340200721082006417f6a2106200520014102746a418c0c6a28020021054102210741002101024002400240024020080e0401020300010b20052f018a0c2101410321070c020b200541046a210820052f018a0c210d410021074100210a03400240200d200a2201470d00200d21010c030b0240024020022008280200200841086a280200220a20032003200a4b1b108805220e0d002003200a490d042003200a47210b0c010b4101210b200e41004e0d00410021070c030b200141016a210a2008410c6a2108200b0d000b410321070c010b200541046a210820052f018a0c21014100210a02400340410121072001200a460d020240024020022008280200200841086a280200220b20032003200b4b1b108805220e0d002003200b490d032003200b4721070c010b41012107200e4100480d020b200a41016a210a2008410c6a210820070d000b410221070b200a21010b200c20094102746a418c0c6a280200220c2f018a0c210920060d000b0b2004411c6a2009360200200441186a200c36020020044100360214200420013602102004200536020c200441003602080240200c450d0041000d02200c450d022005200c470d0020012009460d020b200428020821030240024020042802102208200428020c22072f018a0c4f0d00200721010c010b03400240200728020022010d00410021010c020b200341016a210320072f01880c210820012107200820012f018a0c4f0d000b0b024002402003450d00200841027420016a41900c6a280200210702402003417f6a2203450d000340200728028c0c21072003417f6a22030d000b0b410021030c010b200841016a2103200121070b200041086a200120084107746a4188016a360200200020012008410c6c6a2201410c6a2802003602042000200141046a280200360200200420033602102004200736020c200441003602080c020b200441186a41003602002004410036020c0b200041003602000b200441206a24000b060010fa02000b1100418ee2c100410f4194e3c100102d000bf30802037f017e23004180016b220524000240024002400240024002400240024002400240200128020022064198016a2002280200200228020810ed022207450d0020072003200410e6022207450d0002400240200728020022024106490d00200728020c2102200728020821010c010b200741086a21010b2001450d042002450d04024020012002417f6a41186c6a2202280200450d0020062802000d06200241086a22013502002108200641003602002006200629030842017c3703082006280210450d0241b082c2004110200541286a41c082c20041c483c2001034000b20062802000d0641002102200641003602002006200629030842017c37030820062802100d07200641003602100c020b200541086a200128020420022003200410ee0241022102024020052802084101460d0002400240200528020c22060d00410021020c010b200541e0006a2006200541086a41086a2903002208422088a71065200541286a41186a200541e0006a41186a290000370300200541286a41106a200541e0006a41106a290000370300200541286a41086a200541e0006a41086a29000037030020052005290060370328410121022008a7450d00200610300b200541e0006a41186a200541286a41186a290300370300200541e0006a41106a200541286a41106a290300370300200541e0006a41086a200541286a41086a290300370300200520052903283703600b20024102460d07200541086a41186a200541e0006a41186a290300370300200541086a41106a200541e0006a41106a290300370300200541086a41086a200541e0006a41086a290300370300200520052903603703080c020b20064100360210200641186a2206200629030020087c370300200541e0006a200228020020012802001065200541c1006a200541e0006a41186a290000370000200541396a200541f0006a290000370000200541316a200541e8006a29000037000020052005290060370029410121020b200541206a200541c1006a290000370300200541186a200541396a290000370300200541106a200541316a290000370300200520052900293703080b0240024020024101460d00200041003602000c010b200541286a41186a200541086a41186a290300370300200541286a41106a200541086a41106a290300370300200541286a41086a200541086a41086a2903003703002005410036025820054201370350200520052903083703284120102f2202450d062005422037026420052002360260200541e0006a200541286a41201064200541d0006a200528026022022005280268106402402005280264450d00200210300b20002005290350370200200041086a200541d0006a41086a2802003602000b20054180016a24000f0b418486c20041fc00418087c2001050000b41b082c2004110200541286a41c082c20041b483c2001034000b41b082c2004110200541286a41c082c20041b483c2001034000b41b082c2004110200541286a41c082c20041c483c2001034000b41d488c1004130200541286a41dcfcc00041acfdc0001034000b102a000bc15e05077f017e027f027e1a7f230041c0066b220324000240024002400240024002400240024002402002280208220441176a2205417f4c0d00200228020021020240024020050d00410121060c010b2005102f2206450d070b2003410036028005200320053602fc04200320063602f804200341f8046a418b90c200411710fd02200341f8046a2002200410fd02200328028005210720032802fc04210820032802f8042109024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012802082d0060450d00024002402001280200220541c0006a2009200710e6022202450d0002400240200228020022044106490d00200228020c2104200228020821020c010b200241086a21020b2002450d042004450d040240024020022004417f6a41186c6a2202280200450d0020052802000d07200241086a2204350200210a200541003602002005200529030842017c3703082005280210450d0141b082c2004110200341f8026a41c082c20041c483c2001034000b20052802000d07200541003602002005200529030842017c37030820052802100d08200541003602100c220b20054100360210200541186a22052005290300200a7c37030020042802002205417f4c0d1e200228020021040240024020050d0041012102410021050c010b2005102f2202450d250b2002200420051085051a200521040c010b200341f8046a20012802042009200710e70220032802f8044101460d0720034184056a280200210520034180056a280200210420032802fc0421020b2002450d1f2005450d1d200320022d00003a00fc04200341013602f80420054101470d010c1d0b02400240024002400240024020012802004198016a2002200410ed02220b0d00200341023a0098052001280200220541c0006a2009200710e6022202450d03200228020022044106490d01200228020c2104200228020821020c020b200341f8046a200b10e902200341e0006a41186a200341f8046a41186a22042802002205360200200341e0006a41106a200341f8046a41106a2206290300220a370300200341e0006a41086a200341f8046a41086a220c290300220d370300200320032903f804220e3703602001280204210220034180016a41186a200536020020034180016a41106a200a37030020034180016a41086a200d3703002003200e37038001200341a0016a10ce014101102f2205450d26200541003a0000410041003502e0ac42200341f8046aad7c42adfed5e4d485fda8d8007e422189220a3e02e0ac42200341d0006a41e0acc200ad220d42a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200341306a200a42a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200341c0006a200d42c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200341206a200a42c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200341106a200a200d85420042adfed5e4d485fda8d8004200108405200341f8046a418de2c1004101106520034194026a20042900003702002003418c026a200629000037020020034184026a200c290000370200200341f4016a428180808010370200200341e8016a4200370300200341e4016a41bcf5c100360200200320032900f8043702fc01200320053602f001200341003602e0012003200a200341d0006a41086a2903002003290350857c200341106a41086a29030020032903108542cf829ebbefefde82147c220e893703c0012003200341206a41086a290300200329032085200d7c200e423088893703d8012003200a200341c0006a41086a2903002003290340857c200e422088893703d0012003200341306a41086a290300200329033085200d7c200e421088893703c801200b280260220441176a2205417f4c0d20200b28025821064101210c02402005450d002005102f220c450d270b2003410036028005200320053602fc042003200c3602f804200341f8046a418b90c200411710fd02200341f8046a2006200410fd0220032802fc04210f200341f8036a200220032802f804221020032802800510e702024020032802f8034101470d00200341a0026a41186a200341a0016a41186a290300370300200341a0026a41106a200341a0016a41106a290300370300200341a0026a41086a200341a0016a41086a290300370300200320032903a0013703a0020c1a0b20032802fc032205450d17200341f8036a41086a290300220a422088a7220c450d15200320052d00003a00fc04200341013602f804200c4101470d040c150b200241086a21020b2002450d092004450d090240024020022004417f6a41186c6a2202280200450d0020052802000d0c200241086a2204350200210a200541003602002005200529030842017c3703082005280210450d0141b082c2004110200341f8026a41c082c20041c483c2001034000b20052802000d0c200541003602002005200529030842017c37030820052802100d0d200541003602100c110b20054100360210200541186a22052005290300200a7c37030020042802002205417f4c0d1e200228020021040240024020050d0041012102410021050c010b2005102f2202450d250b2002200420051085051a200521040c010b200341f8036a20012802042009200710e70220032802f8034101460d0c20034184046a280200210520034180046a280200210420032802fc0321020b2002450d0e2005450d0c200320022d00003a00fc03200341013602f80320054101460d0c200320022d00013a00fd03200341023602f80320054102460d0c200320022d00023a00fe03200341033602f80320054103460d0c200320022d00033a00ff03200341043602f80320054104460d0c20034180046a20022d00043a0000200341053602f80320054105460d0c20034181046a20022d00053a0000200341063602f80320054106460d0c20034182046a20022d00063a0000200341073602f80320054107460d0c20034183046a20022d00073a0000200341083602f80320054108460d0c20034184046a20022d00083a0000200341093602f80320054109460d0c20034185046a20022d00093a00002003410a3602f8032005410a460d0c20034186046a20022d000a3a00002003410b3602f8032005410b460d0c20034187046a20022d000b3a00002003410c3602f8032005410c460d0c20034188046a20022d000c3a00002003410d3602f8032005410d460d0c20034189046a20022d000d3a00002003410e3602f8032005410e460d0c2003418a046a20022d000e3a00002003410f3602f8032005410f460d0c2003418b046a20022d000f3a0000200341103602f80320054110460d0c2003418c046a20022d00103a0000200341113602f80320054111460d0c2003418d046a20022d00113a0000200341123602f80320054112460d0c2003418e046a20022d00123a0000200341133602f80320054113460d0c2003418f046a20022d00133a0000200341143602f80320054114460d0c20034190046a20022d00143a0000200341153602f80320054115460d0c20034191046a20022d00153a0000200341163602f80320054116460d0c20034192046a20022d00163a0000200341173602f80320054117460d0c20034193046a20022d00173a0000200341183602f80320054118460d0c20034194046a20022d00183a0000200341193602f80320054119460d0c20034195046a20022d00193a00002003411a3602f8032005411a460d0c20034196046a20022d001a3a00002003411b3602f8032005411b460d0c20034197046a20022d001b3a00002003411c3602f8032005411c460d0c20034198046a20022d001c3a00002003411d3602f8032005411d460d0c20034199046a20022d001d3a00002003411e3602f8032005411e460d0c2003419a046a20022d001e3a00002003411f3602f8032005411f460d0c2003419b046a20022d001f3a0000200341c0016a41026a20034185046a2d00003a0000200341d8026a41026a2003418c046a2d00003a0000200320032f01fc033b01f802200320032d00fe033a00fa02200320034183046a2f00003b01c00120032003418a046a2f01003b01d80220034194046a28020021112003418d046a280000211220034186046a280100210c200341203602f803200341f8036a41206a280200211320032800ff032106200341a0026a41026a20034193046a2d00003a0000200320034191046a2f00003b01a002410021050c0d0b200320052d00013a00fd04200341023602f804200c4102460d10200320052d00023a00fe04200341033602f804200c4103460d10200320052d00033a00ff04200341043602f804200c4104460d1020034180056a20052d00043a0000200341053602f804200c4105460d1020034181056a20052d00053a0000200341063602f804200c4106460d1020034182056a20052d00063a0000200341073602f804200c4107460d1020034183056a20052d00073a0000200341083602f804200c4108460d1020034184056a20052d00083a0000200341093602f804200c4109460d1020034185056a20052d00093a00002003410a3602f804200c410a460d1020034186056a20052d000a3a00002003410b3602f804200c410b460d1020034187056a20052d000b3a00002003410c3602f804200c410c460d1020034188056a20052d000c3a00002003410d3602f804200c410d460d1020034189056a20052d000d3a00002003410e3602f804200c410e460d102003418a056a20052d000e3a00002003410f3602f804200c410f460d102003418b056a20052d000f3a0000200341103602f804200c4110460d102003418c056a20052d00103a0000200341113602f804200c4111460d102003418d056a20052d00113a0000200341123602f804200c4112460d102003418e056a20052d00123a0000200341133602f804200c4113460d102003418f056a20052d00133a0000200341143602f804200c4114460d1020034190056a20052d00143a0000200341153602f804200c4115460d1020034191056a20052d00153a0000200341163602f804200c4116460d1020034192056a20052d00163a0000200341173602f804200c4117460d1020034193056a20052d00173a0000200341183602f804200c4118460d1020034194056a20052d00183a0000200341193602f804200c4119460d1020034195056a20052d00193a00002003411a3602f804200c411a460d1020034196056a20052d001a3a00002003411b3602f804200c411b460d1020034197056a20052d001b3a00002003411c3602f804200c411c460d1020034198056a20052d001c3a00002003411d3602f804200c411d460d1020034199056a20052d001d3a00002003411e3602f804200c411e460d102003419a056a20052d001e3a00002003411f3602f804200c411f460d102003419b056a20052d001f3a0000200341d8026a41026a20034185056a2d00003a0000200341b0066a41026a2003418c056a2d00003a0000200320032f01fc043b01f802200320032d00fe043a00fa02200320034183056a2f00003b01d80220032003418a056a2f01003b01b00620034194056a28020021142003418d056a280000211320034186056a2801002111200341203602f804200341f8046a41206a280200211520032800ff042112200341a0066a41026a20034193056a2d00003a0000200320034191056a2f00003b01a0064100210c0c110b200320022d00013a00fd04200341023602f80420054102460d1b200320022d00023a00fe04200341033602f80420054103460d1b200320022d00033a00ff04200341043602f80420054104460d1b20034180056a20022d00043a0000200341053602f80420054105460d1b20034181056a20022d00053a0000200341063602f80420054106460d1b20034182056a20022d00063a0000200341073602f80420054107460d1b20034183056a20022d00073a0000200341083602f80420054108460d1b20034184056a20022d00083a0000200341093602f80420054109460d1b20034185056a20022d00093a00002003410a3602f8042005410a460d1b20034186056a20022d000a3a00002003410b3602f8042005410b460d1b20034187056a20022d000b3a00002003410c3602f8042005410c460d1b20034188056a20022d000c3a00002003410d3602f8042005410d460d1b20034189056a20022d000d3a00002003410e3602f8042005410e460d1b2003418a056a20022d000e3a00002003410f3602f8042005410f460d1b2003418b056a20022d000f3a0000200341103602f80420054110460d1b2003418c056a20022d00103a0000200341113602f80420054111460d1b2003418d056a20022d00113a0000200341123602f80420054112460d1b2003418e056a20022d00123a0000200341133602f80420054113460d1b2003418f056a20022d00133a0000200341143602f80420054114460d1b20034190056a20022d00143a0000200341153602f80420054115460d1b20034191056a20022d00153a0000200341163602f80420054116460d1b20034192056a20022d00163a0000200341173602f80420054117460d1b20034193056a20022d00173a0000200341183602f80420054118460d1b20034194056a20022d00183a0000200341193602f80420054119460d1b20034195056a20022d00193a00002003411a3602f8042005411a460d1b20034196056a20022d001a3a00002003411b3602f8042005411b460d1b20034197056a20022d001b3a00002003411c3602f8042005411c460d1b20034198056a20022d001c3a00002003411d3602f8042005411d460d1b20034199056a20022d001d3a00002003411e3602f8042005411e460d1b2003419a056a20022d001e3a00002003411f3602f8042005411f460d1b2003419b056a20022d001f3a0000200341f8026a41026a20034185056a2d00003a0000200341c0016a41026a2003418c056a2d00003a0000200320032f01fc043b01f803200320032d00fe043a00fa03200320034183056a2f00003b01f80220032003418a056a2f01003b01c00120034194056a280200210c2003418d056a280000211220034186056a2801002111200341203602f804200341f8046a41206a280200210620032800ff042113200341d8026a41026a20034193056a2d00003a0000200320034191056a2f00003b01d802410021050c1c0b418486c20041fc00418087c2001050000b41b082c2004110200341f8026a41c082c20041b483c2001034000b41b082c2004110200341f8026a41c082c20041b483c2001034000b41b082c2004110200341f8026a41c082c20041c483c2001034000b41d488c1004130200341f8026a41dcfcc00041bcfdc0001034000b418486c20041fc00418087c2001050000b41b082c2004110200341f8026a41c082c20041b483c2001034000b41b082c2004110200341f8026a41c082c20041b483c2001034000b41b082c2004110200341f8026a41c082c20041c483c2001034000b41d488c1004130200341f8026a41dcfcc00041bcfdc0001034000b410121050b02402004450d00200210300b2005450d010b200341f8036a10ce010c010b20034181046a200341c0016a41026a2d00003a000020034188046a200341d8026a41026a2d00003a00002003418f046a200341a0026a41026a2d00003a0000200320032d00fa023a00fa03200320032f01f8023b01f803200320063600fb03200320032f01c0013b00ff032003200c36018204200320032f01d8023b0186042003201236008904200320032f01a0023b008d04200320133602940420032011360290040b20004100360208200042013702004120102f2205450d11200342203702fc02200320053602f802200341f8026a200341f8036a41201064200020032802f80222052003280280031064024020032802fc02450d00200510300b20032d0098054102470d050c060b4101210c0b0240200aa7450d00200510300b200c450d010b200341a0026a41186a200341a0016a41186a290300370300200341a0026a41106a200341a0016a41106a290300370300200341a0026a41086a200341a0016a41086a290300370300200320032903a0013703a0020c010b200341a9026a200341d8026a41026a2d00003a0000200341b0026a200341b0066a41026a2d00003a0000200341b7026a200341a0066a41026a2d00003a0000200320032d00fa023a00a202200320032f01f8023b01a002200320123600a302200320032f01d8023b00a702200320113601aa02200320032f01b0063b01ae02200320133600b102200320032f01a0063b00b502200320153602bc02200320143602b8020b200320023602c0022003200341c0016a3602c402200341c8026a41086a2004360200200320063602cc022003200341c0026a3602c802200341d8026a41186a200341a0026a41186a290300370300200341d8026a41106a200341a0026a41106a290300370300200341d8026a41086a200341a0026a41086a290300370300200320032903a0023703d802200341f8046a200341c8026a4180a3c000200341d8026a10fe0220032802fc04210520032802f8042102200341f8036a200341f8046a41086a4180011085051a0240024002400240024002400240024020024101460d00200341f8026a200341f8036a4180011085051a200341f8036a41186a20034180016a41186a2802002205360200200341f8036a41106a20034180016a41106a290300370300200341f8036a41086a20034180016a41086a29030037030020032003290380013703f8032005450d0320032005417f6a221236029004200341f8036a410020032802fc031b220c280200210402400240200c2802082206200c28020422022f018a0c4f0d00200221050c010b03400240200228020022050d00410021050c020b200441016a210420022f01880c210620052102200620052f018a0c4f0d000b0b024002402004450d00200641027420056a41900c6a280200210202402004417f6a2204450d000340200228028c0c21022004417f6a22040d000b0b410021040c010b200641016a2104200521020b200c2002360204200c4100360200200c200436020802400240200520064107746a22044188016a28020022024106490d0020044194016a280200210220044190016a28020021040c010b20044190016a21040b024002400240024002402004450d002002450d000240024020042002417f6a41186c6a220228020022040d00410021040c010b2002280208210c0b417f201241016a220220022012491b220241ffffffff00712002470d1320024104742202417f4c0d1320052006410c6c6a2205410c6a2802002106200541046a28020021052002102f2216450d192016200c36020c201620043602082016200636020420162005360200200341f8046a41186a200341f8036a41186a2802002205360200200341f8046a41106a200341f8036a41106a290300370300200341f8046a41086a200341f8036a41086a290300370300200320032903f8033703f80420024104762117024020050d00201641106a21150c050b20032005417f6a221236029005200341f8046a410020032802fc041b220c280200210402400240200c2802082206200c28020422022f018a0c4f0d00200221050c010b03400240200228020022050d00410021050c020b200441016a210420022f01880c210620052102200620052f018a0c4f0d000b0b024002402004450d00200641027420056a41900c6a280200210202402004417f6a2204450d000340200228028c0c21022004417f6a22040d000b0b410021040c010b200641016a2104200521020b200c2002360204200c4100360200200c2004360208200520064107746a4188016a210220052006410c6c6a41046a21054101211802400340200528020821042005280200210602400240200228020022054106490d00200228020c2105200228020821020c010b200241086a21020b2002450d012005450d010240024020022005417f6a41186c6a220528020022020d00410021020c010b2005280208210c0b0240024002400240024020172018470d002017417f201241016a220520052012491b6a22052017490d1a201741017422122005201220054b1b22054104200541044b1b220541ffffffff00712005464102742112200541047421050240024020170d00200341003602b0060c010b200320163602b006200341043602b806200320174104743602b4060b200341a0066a20052012200341b0066a106920032802a806210520032802a0064101460d0120032802a4062116200541047621170b201620184104746a2205200236020820052004360204200520063602002005410c6a200c360200201841016a21182003280290052205450d0320032005417f6a221236029005200341f8046a410020032802fc041b220c2802002104200c2802082206200c28020422022f018a0c4f0d01200221050c020b20050d1e0c180b03400240200228020022050d00410021050c020b200441016a210420022f01880c210620052102200620052f018a0c4f0d000b0b024002402004450d00200641027420056a41900c6a280200210202402004417f6a2204450d000340200228028c0c21022004417f6a22040d000b0b410021040c010b200641016a2104200521020b200c2002360204200c4100360200200c2004360208200520064107746a4188016a210220052006410c6c6a41046a21050c010b0b0240201841144b0d00201841014d0d05201841047420166a41606a21054101210203402005200241016a220210b602200541706a210520182002470d000c060b0b2018410176220541ffffffff00712005470d1420054104742219417f4c0d142019102f221a450d1a201641706a211b201641506a211c41002802e88f42211d4100211e4100211f20182120034020202112410021204101210502402012417f6a2202450d0002400240201620024104746a220528020020162012417e6a22204104746a2202280200220c2002280204220220052802042205200520024b1b10880522040d00417f200520024720052002491b21050c010b417f410120044100481b21050b0240024002400240024002402005417f460d00201c20124104746a2104410221050340024020122005470d0041002120201221050c080b024002400240200c20042802002211200441046a28020022062002200220064b1b108805220c0d00200220064f0d010c020b200c4100480d010b200441706a2104200541016a2105200621022011210c0c010b0b201220056b21200c010b20124102742111201c20124104746a210502400340024020200d00410021200c020b02400240200c20052802002206200541046a28020022042002200220044b1b108805220c0d00200220044f0d030c010b200c417f4a0d020b2020417f6a2120200541706a2105200421022006210c0c000b0b20122020490d01201220184b0d02201220206b22054101762206450d00201620204104746a2102201b20114102746a21040340200341f8046a41086a220c200241086a2211290200370300200320022902003703f804200441086a2213290200210a200220042902003702002011200a3702002013200c290300370200200420032903f804370200200241106a2102200441706a21042006417f6a22060d000b0b2020450d04200541094b0d04201220184b0d02201220206b21052020417f6a2102201b20204104746a2104034020122002490d092004200541016a220510b6022002417f6a220620024f0d04200441706a2104200621022005410a490d000c040b0b2020201241ccf7c0001048000b2012201841ccf7c0001042000b20122020417f6a2202490d052012201841dcf7c0001042000b200641016a21200b0240201f201e470d00201e41016a2202201e490d16201e41017422042002200420024b1b22024104200241044b1b220241ffffffff017120024641027421042002410374210202400240201e0d00200341003602f8040c010b20034104360280052003201d3602f8042003201e4103743602fc040b200341f8036a20022004200341f8046a10692003280280042102024020032802f8034101470d002002450d170c1d0b20032802fc03211d2002410376211e0b201d201f4103746a2202200536020420022020360200201f41016a2221211f024020214102490d0003400240024002400240201d2021221f417f6a22214103746a2205280200450d00201f410374201d6a220641746a2802002204200528020422024d0d00201f41024d0d05201d201f417d6a22224103746a2802042205200220046a4d0d01201f41034d0d05200641646a280200200520046a4b0d050c010b201f4103490d0120052802042102201d201f417d6a22224103746a28020421050b20052002490d010b201f417e6a21220b0240024002400240201f202241016a22054d0d000240201f20224d0d000240201d20224103746a2223280204222420232802006a2202201d20054103746a22252802002226490d000240200220184b0d00202341046a2127201620264104746a22042025280204222841047422066a21052002410474210c0240200220266b221220286b22022028490d00201a20042006108505220220066a21060240202841014e0d00200221020c080b201220284a0d06200221020c070b201a200520024104742206108505221520066a210620284101480d0420024101480d04201b200c6a2102034002400240200641706a220c280200200541706a221228020020122802042211200c2802042213201320114b1b10880522140d00417f201320114720132011491b21110c010b417f410120144100481b21110b20022012200c2011417f4622111b2213290200370200200241086a201341086a2902003702002006200c20111b210620042012200520111b22054f0d05200241706a2102200620154b0d000c050b0b20022018418cf8c0001042000b20262002418cf8c0001048000b2022201f41fcf7c0001033000b2005201f41ecf7c0001033000b20152102200521040c010b2016200c6a211320022102034002400240200528020020022802002002280204220c200528020422122012200c4b1b10880522110d00417f2012200c472012200c491b210c0c010b417f410120114100481b210c0b200420052002200c417f46220c1b2212290200370200200441086a201241086a2902003702002002200241106a200c1b2102200441106a2104200541106a2005200c1b220520134f0d0120022006490d000b0b20042002200620026b4170711085051a2027202420286a360200202320263602002025202541086a201f20226b41037441706a1086051a4101211f202141014b0d000b0b2020450d040c000b0b418486c20041fc00418087c2001050000b418486c20041fc00418087c2001050000b2002201241dcf7c0001048000b0240201e41ffffffff0171450d00201d10300b2019450d00201a10300b2018450d03201620184104746a21150b20162128200341f8046a41086a2102200341f8046a4101722112200341d8036a2111200341d1036a211f0240034020162802002204450d03201641046a2802002106024002400240201641086a280200220c0d00200341f8046a200341f8026a2004200610ff0220032802fc04210520032802f8044101460d04200329038005210a0c010b2016410c6a280200210520034100360280060240024020032d00d0034101460d00410021130c010b2003418c066a41026a201f41026a2d00003a0000200341f8036a41086a201141086a290200370300200341f8036a41106a201141106a290200370300200341f8036a41186a201141186a2d00003a00002003201f2f00003b018c06200320112902003703f803410121130b20032802d4032114201220032f018c063b0000200220032903f803370200201241026a2003418c066a41026a2d00003a0000200241086a200341f8036a41086a290300370200200241106a200341f8036a41106a290300370200200241186a200341f8036a41186a280200360200200320133a00f804200320143602fc04200341003602a806200320063602a406200320043602a0062005417f4c0d120240024020050d00410121040c010b2005102f2204450d190b200320053602b406200320043602b0062004200c20051085051a200320053602b80620034190066a200341f8026a200341f8046a200341a0066a200341b0066a20034180066a10800320032802940621052003280290064101460d01200320053602d403200341003a00d0032003280280062105200329028406210a0b02402005450d00200aa7450d00200510300b201641106a22162015470d010c040b0b2003280280062202450d00200328028406450d00200210300b0240201741ffffffff0071450d00202810300b200341f8026a10b1010b20052d00000e0405050405030b202821160b201741ffffffff0071450d00201610300b200341f8026a10b101200341fa036a20032d00da0222053a000020034180056a2202200341d8026a410f6a29000037030020034188056a2204200341d8026a41176a29000037030020034190056a2206200341d8026a411f6a2d00003a0000200320032f01d802220c3b01f803200320032900df023703f8042003200c3b01a002200320053a00a202200320032800db023600a302200341a0026a411f6a20062d00003a0000200341a0026a41176a2004290300370000200341a0026a410f6a2002290300370000200320032903f8043700a7020c030b200541286a280200450d01200541246a28020010300c010b200541086a280200450d00200541046a2802001030200510300c010b200510300b200341a0026a200341a0016a41201088052102200341f8026a41186a2205200341a0026a41186a290300370300200341f8026a41106a2204200341a0026a41106a290300370300200341f8026a41086a2206200341a0026a41086a290300370300200320032903a0023703f802200341ff036a200341c0016a41e0001085051a200245210c0240200f450d00201010300b200341f8046a41086a22122006290300370300200341f8046a41106a22062004290300370300200341f8046a41186a22042005290300370300200320032903f8023703f8042003200c3a00980520034199056a200341f8036a41e7001085051a200341f8036a41186a2004290300370300200341f8036a41106a2006290300370300200341f8036a41086a2012290300370300200320032903f8043703f803200341003602e002200342013703d8024120102f2205450d0c200342203702fc02200320053602f802200341f8026a200341f8036a41201064200341d8026a20032802f80222052003280280031064024020032802fc02450d00200510300b200128020021050240024020020d0020052802200d0420054100360220200541286a2202200229030042017c37030020052802300d0520054100360230200320073602c801200320083602c401200320093602c001200341003602f8022003200510c302200541c0006a200341c0016a200341f8026a2003280200200328020410c4020c010b20032802e0022202417f4c0d0720032802d80221040240024020020d00410121060c010b2002102f2206450d0e0b200620042002108505210420052802200d0520054100360220200541286a2206200629030042017c37030020052802300d0620054100360230200541386a220620062903002002ad7c370300200320073602c801200320083602c401200320093602c00120034180036a2002360200200320023602fc02200320043602f802200341086a200510c302200541c0006a200341c0016a200341f8026a2003280208200328020c10c4020b200020032903d802370200200041086a200341d8026a41086a2802003602000b200341a0056a106c0b200b0d0c2008450d0c0c0b0b41b082c2004110200341f8026a41c082c20041d483c2001034000b41b082c2004110200341f8026a41c082c20041e483c2001034000b41b082c2004110200341f8026a41c082c20041d483c2001034000b41b082c2004110200341f8026a41c082c20041e483c2001034000b102c000b410121050b02402004450d00200210300b2005450d010b200341f8046a10ce010c010b20034181056a200341f8026a41026a2d00003a000020034188056a200341c0016a41026a2d00003a00002003418f056a200341d8026a41026a2d00003a0000200320032d00fa033a00fa04200320032f01f8033b01f804200320133600fb04200320032f01f8023b00ff042003201136018205200320032f01c0013b0186052003201236008905200320032f01d8023b008d0520032006360294052003200c360290050b20004100360208200042013702004120102f2205450d00200342203702fc03200320053602f803200341f8036a200341f8046a41201064200020032802f80322052003280280041064024020032802fc03450d00200510300b20080d010c020b102a000b200910300b200341c0066a24000b890201047f230041206b2203240002400240200041046a2802002204200041086a28020022056b2002490d00200028020021040c010b0240200520026a22062005490d00200441017422052006200520064b1b22054108200541084b1b21050240024020040d00200341003602100c010b200341106a41086a410136020020032004360214200320002802003602100b200320054101200341106a10b402200341086a2802002105024020032802004101460d00200020032802042204360200200041046a2005360200200041086a28020021050c020b2005450d00102a000b102c000b200420056a200120021085051a200041086a2200200028020020026a360200200341206a24000bd30702047f067e230041b0016b2204240020044190016a41086a41002802b8f541360200200441002902b0f541370390010240024002402001200320044190016a20022802101100000d004130102f2201450d02200141003a000020012003290000370001200141096a200341086a290000370000200141116a200341106a290000370000200141196a200341186a29000037000020002001360204200041013602000c010b200441d0006a41186a2205200341186a290000370300200441d0006a41106a2206200341106a290000370300200441d0006a41086a200341086a290000370300200420032900003703504120102f2207450d0120044190016a41186a2005290300220837030020044190016a41106a2006290300220937030020044190016a41086a200441d0006a41086a290300220a370300410041003502e0ac42200441f0006aad7c42adfed5e4d485fda8d8007e422189220b3e02e0ac4220042004290350220c37039001200441c0006a41e0acc200ad220d42a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441206a200b42a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441306a200d42c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200441106a200b42c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d80042001084052004200b200d85420042adfed5e4d485fda8d80042001084052000413c6a4200370200200041386a41002802e88f42360200200041c4006a4200370200200041d0006a4108360200200041cc006a2007360200200441f0006a41186a22052008370300200441f0006a41106a22062009370300200441f0006a41086a2207200a3703002004200c370370200041e0006a41013a0000200041dc006a2003360200200041d8006a2002360200200041d4006a2001360200200041306a42003703002000412c6a41bcf5c100360200200041286a4100360200200041086a200b200441c0006a41086a2903002004290340857c200441086a29030020042903008542cf829ebbefefde82147c220889370300200041206a200441106a41086a290300200429031085200d7c200842308889370300200041186a200b200441306a41086a2903002004290330857c200842208889370300200041106a200441206a41086a290300200429032085200d7c200842108889370300200041e1006a2004290370370000200041e9006a2007290300370000200041f1006a2006290300370000200041f9006a200529030037000020004184016a4100360200200041003602000b200441b0016a24000f0b102a000bcf0502037f047e23004190016b22042400410121050240024020012d00584101460d00200141dc006a2802002106410021050c010b200441266a200141db006a2d00003a0000200441106a200141e8006a290200370300200441186a200141f0006a290200370300200441206a200141f8006a2d00003a00002004200141d9006a2f00003b01242004200141e0006a290200370308200141dc006a28020021060b200441003602302004200336022c2004200236022820044100360238200441c8006a41086a2004290308370300200441c8006a41106a200441086a41086a290300370300200441c8006a41186a200441086a41106a290300370300200441e8006a200441086a41186a280200360200200420053a0048200420042f01243b00492004200441246a41026a2d00003a004b2004200636024c200441f0006a2001200441c8006a200441286a200441386a10b00420042802742105024002400240024020042802704101460d00200441f0006a41086a2d000041ff01714102470d01200441c8006a418de2c10041011065200141f1006a200441c8006a41186a2205290000370000200141e9006a200441c8006a41106a2202290000370000200141e1006a200441c8006a41086a2203290000370000200141d9006a2004290048370000200141013a0058200441c8006a418de2c10041011065200441f0006a41186a20052900002207370300200441f0006a41106a20022900002208370300200441f0006a41086a2003290000220937030020042004290048220a37037020012802542201200a370000200141186a2007370000200141106a2008370000200141086a20093700000c020b200041013602002000200536020420042802382201450d02200428023c450d02200110300c020b200141003a0058200141dc006a20053602000b20002004290338370204200041003602002000410c6a200441c0006a2802003602000b20044190016a24000bd70b03027f017e047f23004180076b22062400024002400240024002400240024002400240024020022d00004101470d0020064188036a200241196a29000037030020064180036a200241116a290000370300200641f8026a200241096a290000370300200620022900013703f0022003280208220741017621020240024020074101710d00200328020422072002490d05200641003a00f803200620023602f403200620032802003602f0030c010b200328020422072002490d05200220074f0d062006200328020022073602f003200620023602f403200641f9036a200720026a2d000041f001713a0000200641013a00f8030b2001200641f0026a200641f0036a10a9042208422088a721022008a7450d012000410136020020002002360204200441046a280200450d02200428020010300c020b200241046a28020021020b0240200141c8006a220928020022072007417f6a220a200141c0006a220b28020022072001413c6a220c2802006b716b4101470d00200c10b2012009280200417f6a210a200b28020021070b200b200a200741016a71360200200141c4006a28020020074102746a2002360200200141386a280200220720024d0d04200141306a220c280200200241fc006c6a22022d0000210720022f0001210a200241036a2d0000210b200641086a200241046a220941f8001085051a20094100360200200241003a0000200641f8016a200641086a41f8001085051a200a200b411074722102024002400240024020074101470d00200328020821072003280204210a2003280200210b20064198066a20064198026a41d8001085051a200641f0066a41086a200441086a280200360200200620042902003703f006200641f0026a200120064198066a2003200641f0066a200510aa0420062802f0024101460d0320062802f4022104200641c0056a200641f0026a41086a41d8001085051a200641e8046a200641c0056a41d8001085051a4101210320044101470d01200641f0026a41156a200641086a41156a290000370000200641f0026a41106a200641086a41106a290000370300200641f0026a41086a200641086a41086a290000370300200620062900083703f00220064190036a200641e8046a41d8001085051a200641f0036a200641f0026a41f8001085051a410021010c020b20064198066a200641086a41d8001085051a200641f0066a41086a200441086a280200360200200620042902003703f006200641f0026a200120064198066a2003200641f0066a200510aa0420062802f0024101460d0220062802f4022101200641c0056a200641f0026a41086a41d8001085051a200641e8046a200641c0056a41d8001085051a200641f0036a200641e8046a41d8001085051a20014101472101410021030c010b20064188036a2006411d6a29000037000020064183036a200641186a290000370000200641fb026a200641106a290000370000200620062900083700f302200741017621030240024020074101710d00200a2003490d09410021040c010b200a2003490d092003200a4f0d0a200b20036a2d00004170712107410121040b20064190036a200b200310ab04200641bd036a20073a0000200641bc036a20043a0000200620023b01f002200620024110763a00f2022001200641f0026a10ac04200641f0036a200641e8046a41d8001085051a41002103410121010b20064180016a200641f0036a41f8001085051a200641f0036a20064180016a41f8001085051a200620033a00f002200620023b00f102200620024110763a00f302200641f0026a410472200641f0036a41f8001085051a200c200641f0026a10b3012102200041086a20013a000020002002360204200041003602000c010b20062802f402210120004101360200200020013602040b20064180076a24000f0b2002200741a099c2001042000b2002200741b099c2001042000b2002200741c099c2001033000b2002200741acf0c1001033000b2003200a41a099c2001042000b2003200a41b099c2001042000b2003200a41c099c2001033000b9618020c7f017e230041c0026b220424000240200041086a2802002205280224450d002005106c0b200520042903103703002005410036022420052004290338370328200541206a200441106a41206a280200360200200541186a200441106a41186a290300370300200541106a200441106a41106a290300370300200541086a200441106a41086a290300370300200541306a200441386a41086a290300370300200541386a200441386a41106a290300370300200541c0006a200441386a41186a290300370300200541c8006a200441386a41206a290300370300200541d0006a200441e0006a290300370300200541d8006a200441386a41306a290300370300200541003a0060200541e1006a20042900d001370000200541e9006a200441d0016a41086a290000370000200541f1006a200441d0016a41106a290000370000200541f9006a200441d0016a41186a29000037000020054180016a200441ef016a29000037000020002802002106200420033602c401200420023602c001200441086a200610c30202400240024002400240024020012802082205417f4c0d0020012802002107200428020c2108200428020821094101210a02402005450d002005102f220a450d020b200a20072005108505210a200420053602402004200536023c2004200a360238200441d0016a20064198016a200441386a1082030240024020042802d0014101460d00200441286a200441ec016a280200360200200441206a200441e4016a290200370300200441186a200441dc016a290200370300200420042902d401370310200441386a200641c0006a1083030240024020050d00410121060c010b2005102f2206450d040b20044194016a200536020020042006360290012006200720051085051a20044198016a2005360200200441106a200441386a108403210b0c010b200441d8016a280200200441dc016a28020041e4006c6a4188016a210b0b2004200441c0016a3602b002200441d0016a200b10e002200441386a41186a200441d0016a41186a280200360200200441386a41106a200441d0016a41106a290300370300200441386a41086a200441d0016a41086a290300370300200420042903d001370338200b41146a210c2004200441b0026a360254200441b0026a210d03402004280250210e024003400240200e0d00410021050c020b2004200e417f6a220e360250200441386a4100200428023c1b220f280200210a02400240200f2802082207200f28020422052f018a0c4f0d00200521060c010b03400240200528020022060d00410021060c020b200a41016a210a20052f01880c210720062105200720062f018a0c4f0d000b0b02400240200a450d00200741027420066a41900c6a28020021050240200a417f6a220a450d000340200528028c0c2105200a417f6a220a0d000b0b4100210a0c010b200741016a210a200621050b200f2005360204200f4100360200200f200a36020820062007410c6c6a2205410c6a280200200d280200220a280204220f490d00200a280200200541046a2205280200200f1088050d000b200620074107746a4188016a21070b02402005450d00200441003602900220052802082206417f4c0d02200528020021050240024020060d004101210a0c010b2006102f220a450d040b200a20052006108505210f02400240200b28020c22054106490d00200b2802182105200b280214210a0c010b200c210a0b024002400240200a450d0020050d010b410221052006450d01200f10300c010b20042006360218200420063602142004200f3602102005410c6c200a6a41746a200441106a10e10221050b200720044190026a20052005410247712009200810e2022004280254210d0c010b0b2001280208220641176a2205417f4c0d002000280204210a200128020021070240024020050d004101210f0c010b2005102f220f450d020b200441003602402004200536023c2004200f360238200441386a418b90c200411710fd02200441386a2007200610fd02200428023c2105200441d0016a200a2004280238220f200428024010e70202402005450d00200f10300b20042802d0014101460d050240024020042802d40122050d00200441386a10ce01200441003602a801200442013703a0014120102f2205450d032004422037021420042005360210200441106a200441386a41201064200441a0016a200428021022052004280218106402402004280214450d00200510300b20042802a80121050c010b200441d8016a2903002110200420053602a001200420103702a4012010422088a721050b200441106a41186a220e4200370300200441106a41106a220d4200370300200441106a41086a220b42003703002004420037031020054120470d02200b20042802a001220f41086a290000370300200d200f41106a290000370300200e200f41186a2900003703002004200f290000370310200441b0016a41086a2006360200200420073602b4012004200a3602b001200441386a41086a41002802b8f541360200200441002902b0f54137033802400240200441b0016a200441106a200441386a10d4010d004130102f2205450d03200541003a000020052004290310370001200541096a200441186a290300370000200541116a200441206a290300370000200541196a200441286a2903003700000c010b200441003602cc01200441ecddc1003602c4012004200441106a3602c8012004200441b0016a3602c001200441386a200441c0016a2002200310e302200441d0016a41086a2206200441386a41106a290300370300200441d0016a41106a220a200441386a41186a290300370300200441d0016a41186a2207200441386a41206a290300370300200441d0016a41206a220e200441386a41286a290300370300200441d0016a41286a220d200441386a41306a290300370300200441d0016a41306a220b200441386a41386a290300370300200441d0016a41386a2208200441f8006a2802003602002004200441386a41086a2903003703d001200428023c210520042802384101460d00200441c4006a22092006290300370200200441cc006a200a290300370200200441d4006a2007290300370200200441dc006a200e290300370200200441e4006a200d290300370200200441ec006a200b290300370200200441f4006a200828020036020020042005360238200420042903d00137023c20044190026a200441386a10e40220042802900222064102460d0402400340200428029402210520064101460d012004290398022210422088a72206417f4c0d0320042802a402210720042802a002210d2000280200210e0240024020060d004101210a0c010b2006102f220a450d050b200420063602b4022004200a3602b002200a200520061085051a200420063602b8022004410036029002200e2001200441b0026a20044190026a10c70202402007450d00200d10300b02402010a7450d00200510300b20044190026a200441386a10e40220042802900222064102470d000c060b0b0240200441386a410c6a280200220a450d00200428023c2106200a41306c210703402006280200220a200a280200417f6a36020002402006280200220a2802000d000240200a410c6a280200450d00200a28020810302006280200210a0b200a41046a220a200a280200417f6a3602002006280200220a41046a2802000d00200a10300b200641306a2106200741506a22070d000b0b0240200441c0006a2802002206450d00200641306c450d00200428023c10300b20042802484125490d00200441d0006a28020010300b02400240024020052d00000e0402020002010b200541086a280200450d01200541046a28020010300c010b200541286a280200450d00200541246a28020010300b200510300c040b102c000b102a000b41202005418c91c200105b000b024020092802002206450d00200428023c2105200641306c210a0340200528020022062006280200417f6a3602000240200528020022062802000d0002402006410c6a280200450d0020062802081030200528020021060b200641046a22062006280200417f6a3602002005280200220641046a2802000d00200610300b200541306a2105200a41506a220a0d000b0b0240200441c0006a2802002205450d00200541306c450d00200428023c10300b20042802484125490d00200441d0006a28020010300b20042802a401450d00200f10300b200441c0026a24000ba503010b7f02400240024020012802042203450d00200128020021040c010b41d809102f2203450d0141002104200341003b01d6092003410036020020012003360204200141003602000b02400340200341046a210520032f01d6092206410c6c2107417f2108410021090340024002402007450d00024002402002280200220a20052802002005280208220b2002280208220c200c200b4b1b108805220d0d00200c200b490d01200c200b47210b0c030b4101210b200d41004e0d02200921060c010b200841016a21060b02402004450d002004417f6a2104200320064102746a41d8096a28020021030c030b200020022902003702042000411c6a2001360200200041186a2006360200200041146a200336020041002105200041106a41003602002000410c6a200241086a2802003602000c030b2005410c6a2105200941016a2109200841016a2108200741746a2107200b0d000b0b20002004360204200041106a20013602002000410c6a2008360200200041086a200336020041012105200241046a280200450d00200a1030200041013602000f0b200020053602000f0b102a000bbb0602097f017e230041a0016b220224000240200128020c22034106490d00200141186a28020021030b200242003703082002200336025c2002420037025420024180016a200241086a2003109203024002400240024002402002280280014101470d0020024188016a2802000d0141d099c200411141e499c200102d000b02400240200228020822044106490d00200241146a22052802002106200241106a28020021070c010b200241106a2107200241086a210520042106410521040b0240024020062004490d00200621040c010b20072006410c6c6a2107200620036a20046b210820024180016a410472210903402003450d04200242003703880120072009290200370200200741086a200941086a2802003602002007410c6a21072003417f6a21032004200641016a2206470d000b2002200836025c0b20052004360200200241e0006a41086a200241d0006a41086a290300370300200220022903503703600240200228026c2207450d00200241086a410c6a2108200241086a41086a210a20024180016a4104722109034020022007417f6a36026c0240024020022802680d0020024200370388010c010b20022802642207450d0420092002280260200710f2040b200241f0006a41086a200941086a280200220736020020022009290200220b37037020024190016a41086a220520073602002002200b3703900102400240200228020822064106490d002002280214210720022802102104200821030c010b200241086a210320062107200a2104410521060b024020072006470d0020024180016a200241086a410110920302402002280280014101470d0020024188016a2802000d0441d099c200411141e499c200102d000b2002280214210720022802102104200821030b20042007410c6c6a2207200229039001370200200741086a20052802003602002003200328020041016a360200200228026c22070d000b0b200241e0006a10d4030c030b102a000b41b2abc200412b41a082c200102d000b2002410036025c20052006360200200241d0006a10d4030b200042003702042001280250210720012d005421032000410c6a200241086a41c4001085051a200020033a005420002007360250200241a0016a24000b9c13050c7f017e027f017e027f23004190046b22022400200041146a2802002103024002400240200041106a28020022042f01d6092205410a4b0d00200241a8036a41086a2206200041086a280200360200200220002902003703a803200441046a21070240200341016a220820054b22090d0020072008410c6c6a20072003410c6c6a200520036b410c6c1086051a0b20072003410c6c6a220720022903a803370200200741086a2006280200360200200241a8036a200141e4001085051a20044188016a2107024020090d002007200841e4006c6a2007200341e4006c6a200520036b41e4006c1086051a0b2007200341e4006c6a220a200241a8036a41e4001085051a2004200541016a3b01d6090c010b410521074100210b02400240200341054f0d0041042107200321060c010b41052106024002402003417b6a0e020201000b200341796a21064101210b410621070c010b410021064101210b0b200028020c21090240024002400240024002400240024002400240024041d809102f2205450d00200541003b01d60920054100360200200520042f01d609220c2007417f736a22033b01d609200441046a220d2007410c6c6a2208290204210e2008280200210f200241a8036a20044188016a2210200741e4006c6a41e4001085051a2003410c4f0d01200c200741016a22086b2003470d02200541046a200d2008410c6c6a2003410c6c1085051a20054188016a2010200841e4006c6a200341e4006c1085051a200420073b01d609200241c0026a200241a8036a41e4001085051a20052004200b1b22032f01d6092107200241a8036a41086a220b200041086a280200360200200220002902003703a803200341046a21080240200641016a220c20074b220d0d002008200c410c6c6a20082006410c6c6a200720066b410c6c1086051a0b20082006410c6c6a220820022903a803370200200841086a200b280200360200200241a8036a200141e4001085051a20034188016a21010240200d0d002001200c41e4006c6a2001200641e4006c6a200720066b41e4006c1086051a0b2001200641e4006c6a220a200241a8036a41e4001085051a2003200741016a3b01d609200241d8016a200241c0026a41e4001085051a200241086a200241d8016a41e4001085051a024002400240200428020022030d00410021090c010b410021072005210d200e2111200f211003402003210820042f01d4092106200241f0006a200241086a41e4001085051a20092007470d0620082f01d609220c410b490d024100210b41042104024020064105490d0020062104024002402006417b6a0e020201000b200641796a21064101210b410621040c010b410021064101210b410521040b41880a102f2205450d03200541003b01d60920054100360200200520082f01d60922122004417f736a22033b01d60920082004410c6c6a220741086a290200210e200741046a280200210f200241a8036a20084188016a2213200441e4006c6a41e4001085051a2003410c4f0d072012200441016a22016b2003470d08200541046a200741106a2003410c6c1085051a20054188016a2013200141e4006c6a200341e4006c1085051a200820043b01d609200241c0026a200241a8036a41e4001085051a20052f01d609220341016a21072003410c4f0d09200c20046b22042007470d0a200941016a2109200541d8096a200820014102746a41d8096a20044102741085051a4100210402400340200520044102746a41d8096a280200220720043b01d40920072005360200200420034f0d01200420042003496a220420034d0d000b0b200241d8016a200241c0026a41e4001085051a20052008200b1b220741046a21010240200641016a220320072f01d60922044b220c0d0020012003410c6c6a20012006410c6c6a200420066b410c6c1086051a0b20012006410c6c6a2201201137020420012010360200200241a8036a200241f0006a41e4001085051a20074188016a210b0240200c0d00200b200341e4006c6a200b200641e4006c6a200420066b41e4006c1086051a0b200441016a2101200b200641e4006c6a200241a8036a41e4001085051a200741d8096a210b0240200641026a2210200441026a220c4f0d00200b20104102746a200b20034102746a200420066b4102741086051a0b200b20034102746a200d360200200720013b01d60902402003200c4f0d00200720064102746a41dc096a2104034020042802002203200641016a22063b01d40920032007360200200441046a210420012006470d000b0b200241086a200241d8016a41e4001085051a20082104200921072005210d200e2111200f2110200828020022030d000b0b200241a8036a200241086a41e4001085051a200028021822032802042207450d092003280200210641880a102f2204450d01200420073602d809200441003b01d60920044100360200200741003b01d40920072004360200200320043602042003200641016a36020020062009470d0a20042f01d6092207410b4f0d0b2004200741016a22063b01d60920042007410c6c6a220141086a200e370200200141046a200f3602002004200741e4006c6a4188016a200241a8036a41e4001085051a200441d8096a20064102746a2005360200200520063b01d409200520043602002003200328020841016a3602080c0d0b200841046a21040240200c20064d22030d0020042006410c6c6a2205410c6a2005200c20066b410c6c1086051a0b20042006410c6c6a2204201137020420042010360200200241a8036a200241086a41e4001085051a200641016a210420084188016a2105024020030d002005200441e4006c6a2005200641e4006c6a200c20066b41e4006c1086051a0b200c41016a21072005200641e4006c6a200241a8036a41e4001085051a200841d8096a2105200c41026a2101024020030d00200641027420056a41086a200520044102746a200c20066b4102741086051a0b200820073b01d609200520044102746a200d360200200420014f0d0b200c41016a210720082004417f6a22044102746a41dc096a2103034020032802002205200441016a22043b01d40920052008360200200341046a210320072004470d000c0c0b0b102a000b2003410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b41b0a3c200413541e8a3c200102d000b2003410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2007410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b20002802182204200428020841016a3602080b20024190046a2400200a0bd422020a7f017e230041c0026b220524000240200141086a2802002206280224450d002006106c0b200620052903703703002006410036022420062005290308370328200641206a200541f0006a41206a280200360200200641186a200541f0006a41186a290300370300200641106a200541f0006a41106a290300370300200641086a200541f0006a41086a290300370300200641306a200541086a41086a290300370300200641386a200541086a41106a290300370300200641c0006a200541086a41186a290300370300200641c8006a200541086a41206a290300370300200641d0006a200541306a290300370300200641d8006a200541086a41306a290300370300200641003a0060200641e1006a20052900b001370000200641e9006a200541b0016a41086a290000370000200641f1006a200541b0016a41106a290000370000200641f9006a200541b0016a41186a29000037000020064180016a200541cf016a29000037000020052001280200220710c3020240024002400240024002400240024020022802082206417f4c0d0020022802002108200528020421092005280200210a4101210b02402006450d002006102f220b450d020b200b20082006108505210b200520063602102005200636020c2005200b360208200541b0016a20074198016a200541086a1082030240024020052802b0014101460d0020054188016a200541cc016a28020036020020054180016a200541c4016a290200370300200541f8006a200541bc016a290200370300200520052902b401370370200541086a200741c0006a1083030240024020060d004101210b0c010b2006102f220b450d040b200541e4006a20063602002005200b360260200b200820061085051a200541e8006a2006360200200541f0006a200541086a108403210c0c010b200541b8016a280200200541bc016a28020041e4006c6a4188016a210c0b200541b0016a200c10e002200541086a41186a200541b0016a41186a280200360200200541086a41106a200541b0016a41106a290300370300200541086a41086a200541b0016a41086a290300370300200520052903b001370308200c41146a210d2005200541b0026a36022403404100210b024020052802202206450d0020052006417f6a360220200541086a4100200528020c1b220e280200210702400240200e2802082208200e280204220b2f018a0c4f0d00200b21060c010b03400240200b28020022060d00410021060c020b200741016a2107200b2f01880c21082006210b200820062f018a0c4f0d000b0b024002402007450d00200841027420066a41900c6a280200210b02402007417f6a2207450d000340200b28028c0c210b2007417f6a22070d000b0b410021070c010b200841016a21072006210b0b200e200b360204200e4100360200200e2007360208200620084107746a4188016a210720062008410c6c6a41046a210b0b0240200b450d002005410036028002200b2802082206417f4c0d02200b280200210b0240024020060d00410121080c010b2006102f2208450d040b2008200b2006108505210e02400240200c28020c220b4106490d00200c280218210b200c28021421080c010b200d21080b0240024002402008450d00200b0d010b4102210b2006450d01200e10300c010b20052006360278200520063602742005200e360270200b410c6c20086a41746a200541f0006a10e102210b0b200720054180026a200b200b41024771200a200910e2020c010b0b20012802042106024020034101460d002002280208220741176a220b417f4c0d012002280200210e02400240200b0d00410121080c010b200b102f2208450d030b200541003602102005200b36020c20052008360208200541086a418b90c200411710fd02200541086a200e200710fd02200528020c210b200541b0016a200620052802082208200528021010e7020240200b450d00200810300b4101210b024020052802b0014101470d00410021060c090b0240024020052802b40122080d00200541086a10ce01200541003602f801200542013703f0014120102f220b450d04200542203702742005200b360270200541f0006a200541086a41201064200541f0016a2005280270220b2005280278106402402005280274450d00200b10300b20052802f001210820052802f801210b0c010b200541b8016a290300210f200520083602f0012005200f3702f401200f422088a7210b0b20054180026a41186a220c420037030020054180026a41106a2209420037030020054180026a41086a220a42003703002005420037038002200b4120470d03200c200841186a2900003703002009200841106a290000370300200a200841086a2900003703002005200829000037038002200541a0026a41086a20073602002005200e3602a402200520063602a002200541086a41086a41002802b8f541360200200541002902b0f5413703080240200541a0026a20054180026a200541086a10d4010d004130102f2207450d0341002106200741003a00002007200529038002370001200741096a20054188026a290300370000200741116a20054190026a290300370000200741196a20054198026a2903003700000c070b200541003602bc02200541a8a3c0003602b402200520054180026a3602b8022005200541a0026a3602b002200541086a200541b0026a10da02200541b0016a41086a2206200541086a41106a290300370300200541b0016a41106a220b200541086a41186a290300370300200541b0016a41186a220e200541086a41206a290300370300200541b0016a41206a220c200541086a41286a290300370300200541b0016a41286a2209200541086a41306a290300370300200541b0016a41306a220a200541086a41386a290300370300200541b0016a41386a220d200541086a41c0006a2802003602002005200541086a41086a2903003703b001200528020c210720052802084101460d05200541f0006a41386a200d280200360200200541f0006a41306a200a290300370300200541f0006a41286a2009290300370300200541f0006a41206a200c290300370300200541f0006a41186a200e290300370300200541f0006a41106a200b290300370300200541f0006a41086a2006290300370300200520052903b00137037041c000102f220c450d02200c2007360200200c2005290370370204200c410c6a200541f8006a290300370200200c41146a20054180016a290300370200200c411c6a20054188016a290300370200200c41246a20054190016a290300370200200c412c6a20054198016a290300370200200c41346a200541a0016a290300370200200c413c6a200541a8016a280200360200200541086a200c10e40241002106024002402005280208220b4102460d00410021060340200528020c2107200b4101460d022005280214210b200528021021090240200528021c450d00200528021810300b200b417f4c0d042001280200210a02400240200b0d004101210e0c010b200b102f220e450d060b200641016a220d20064921062005200b3602b4012005200e3602b001200e2007200b1085051a2005200b3602b80120054100360208200a2002200541b0016a200541086a10c70202402009450d00200710300b417f200d20061b2106200541086a200c10e4022005280208220b4102470d000b0b200c108603200c10300c080b200c108603200c10300c060b2002280208220841176a220b417f4c0d002002280200210e02400240200b0d00410121070c010b200b102f2207450d020b200541003602102005200b36020c20052007360208200541086a418b90c200411710fd02200541086a200e200810fd02200528020c210b200541b0016a200620052802082207200528021010e7020240200b450d00200710300b4101210c0240024020052802b0014101470d00410021060c010b0240024020052802b40122070d00200541086a10ce01200541003602f801200542013703f0014120102f220b450d04200542203702742005200b360270200541f0006a200541086a41201064200541f0016a2005280270220b2005280278106402402005280274450d00200b10300b20052802f001210720052802f801210b0c010b200541b8016a290300210f200520073602f0012005200f3702f401200f422088a7210b0b20054180026a41186a220c420037030020054180026a41106a2209420037030020054180026a41086a220a42003703002005420037038002200b4120470d04200c200741186a2900003703002009200741106a290000370300200a200741086a2900003703002005200729000037038002200541a0026a41086a20083602002005200e3602a402200520063602a002200541086a41086a41002802b8f541360200200541002902b0f541370308024002400240200541a0026a20054180026a200541086a10d4010d004130102f220b450d0541002106200b41003a0000200b200529038002370001200b41096a20054188026a290300370000200b41116a20054190026a290300370000200b41196a20054198026a2903003700000c010b200541003602bc02200541a8a3c0003602b402200520054180026a3602b8022005200541a0026a3602b002200541086a200541b0026a10da02200541b0016a41086a2206200541086a41106a290300370300200541b0016a41106a2208200541086a41186a290300370300200541b0016a41186a220e200541086a41206a290300370300200541b0016a41206a220c200541086a41286a290300370300200541b0016a41286a2209200541086a41306a290300370300200541b0016a41306a220a200541086a41386a290300370300200541b0016a41386a220d200541086a41c0006a2802003602002005200541086a41086a2903003703b001200528020c210b024020052802084101460d00200541f0006a41386a200d280200360200200541f0006a41306a200a290300370300200541f0006a41286a2009290300370300200541f0006a41206a200c290300370300200541f0006a41186a200e290300370300200541f0006a41106a2008290300370300200541f0006a41086a2006290300370300200520052903b00137037041c000102f220e450d05200e200b360200200e2005290370370204200e410c6a200541f8006a290300370200200e41146a20054180016a290300370200200e411c6a20054188016a290300370200200e41246a20054190016a290300370200200e412c6a20054198016a290300370200200e41346a200541a0016a290300370200200e413c6a200541a8016a280200360200200541086a200e10e4024100210602400240200528020822084102460d00410021060340200528020c210b024002400240024020084101460d0020052802142108200528021021090240200528021c450d00200528021810300b20042006470d01200421060c020b200e108603200e10300c070b200641016a220c20064f0d010b4100210c2009450d03200b10300c030b2008417f4c0d072001280200210a0240024020080d00410121060c010b2008102f2206450d090b200520083602b401200520063602b0012006200b20081085051a200520083602b80120054100360208200a2002200541b0016a200541086a10c70202402009450d00200b10300b200541086a200e10e402200c2106200528020822084102470d000b200c21060b4101210c0b200e108603200e10300c020b410021060b024002400240200b2d00000e0402020002010b200b41086a280200450d01200b41046a28020010300c010b200b41286a280200450d00200b41246a28020010300b200b10304101210c0b20052802f401450d00200710300b200c410047210b0c070b102c000b102a000b4120200b418c91c200105b000b4120200b418c91c200105b000b410021060b02400240024020072d00000e0402020002010b200741086a280200450d01200741046a28020010300c010b200741286a280200450d00200741246a28020010300b200710300b024020052802f401450d00200810300b4101210b0b200020063602042000200b3a0000200541c0026a24000bcd0101037f02402000410c6a2802002201450d0020002802042102200141306c21030340200228020022012001280200417f6a3602000240200228020022012802000d0002402001410c6a280200450d0020012802081030200228020021010b200141046a22012001280200417f6a3602002002280200220141046a2802000d00200110300b200241306a2102200341506a22030d000b0b0240200041086a2802002202450d00200241306c450d00200028020410300b024020002802104125490d00200041186a28020010300b0bb80301047f23004190016b220424000240200041086a2802002205280224450d002005106c0b200520042903683703002005410036022420052004290330370328200541206a200441e8006a41206a280200360200200541186a200441e8006a41186a290300370300200541106a200441e8006a41106a290300370300200541086a200441e8006a41086a290300370300200541306a200441306a41086a2206290300370300200541386a200441306a41106a290300370300200541c0006a200441306a41186a290300370300200541c8006a200441306a41206a290300370300200541d0006a200441d8006a290300370300200541d8006a200441306a41306a290300370300200541003a0060200541e1006a2004290008370000200541e9006a200441086a41086a2207290000370000200541f1006a200441086a41106a290000370000200541f9006a200441086a41186a29000037000020054180016a200441276a290000370000200028020021052007200241086a280200360200200420022902003703082006200341086a2802003602002004200329020037033020052001200441086a200441306a10c70220044190016a24000bde0302037f017e230041106b2204240002400240024002400240024002400240200028020022054198016a2001280200200128020810ed022206450d0020062002200310e6022206450d0002400240200628020022014106490d00200628020c2101200628020821000c010b200641086a21000b2000450d022001450d02024020002001417f6a41186c6a2201280200450d0020052802000d04200141086a3502002107200541003602002005200529030842017c37030820052802100d0520054100360210200541186a2205200529030020077c370300200128020021010c020b20052802000d0541002101200541003602002005200529030842017c37030820052802100d06200541003602100c010b2004200028020420012002200310ee0220042802004101460d060240200428020422010d00410021010c010b200441086a280200450d00200110300b200441106a240020014100470f0b418486c20041fc00418087c2001050000b41b082c2004110200441c082c20041b483c2001034000b41b082c2004110200441c082c20041c483c2001034000b41b082c2004110200441c082c20041b483c2001034000b41b082c2004110200441c082c20041c483c2001034000b41d488c1004130200441dcfcc00041ccfdc0001034000b9a0301037f230041306b22052400200028020041a4016a2106024002400240024020030d004107102f2204450d02200441036a41002800b78e42360000200441002800b48e423600002002417f4c0d030240024020020d00410121030c010b2002102f2203450d030b20032001200210850521032005411c6a2002360200200541186a20023602002005200336021420054287808080f00037020c20052004360208200541003602202006200541086a200541206a108a030c010b4107102f2200450d01200041036a41002800b78e42360000200041002800b48e423600002002417f4c0d020240024020020d00410121070c010b2002102f2207450d020b20072001200210850521012005411c6a2002360200200541186a20023602002005200136021420054287808080f00037020c200520003602082004417f4c0d020240024020040d00410121020c010b2004102f2202450d020b2002200320041085052102200541286a200436020020052004360224200520023602202006200541086a200541206a108a030b200541306a24000f0b102a000b102c000b8221030a7f017e0e7f23004190056b2203240002400240024002400240024002400240024002400240024002400240024020012802082204417f4c0d00200128020021050240024020040d00410121060c010b2004102f2206450d0f0b200320043602e403200320063602e0032006200520041085052107200320043602e803200141146a2802002206417f4c0d00200128020c21080240024020060d00410121090c010b2006102f2209450d0f0b200341f0036a2006360200200320093602ec03200920082006108505210a200341f4036a20063602000240024020002802042209450d002000280200210b0c010b41900d102f2209450d0f4100210b200941003b018e0d2009410036020020002009360204200041003602000b200341c8026a200b2009200341e0036a10f104024020032802c8024101460d00200341d4026a2802002109200341d0026a280200210b02402004450d00200710300b02402006450d00200a10300b200b20094107746a418c026a210c0c0e0b200341d4026a280200210920032903f003210d0240200341d0026a28020022062f018e0d2205410a4b0d00200641046a21080240200941016a220b20054b220e0d002008200b41186c6a2008200941186c6a200520096b41186c1086051a0b2008200941186c6a2208200d3702102008200a36020c2008200436020820082004360204200820073602002006418c026a21040240200e0d002004200b4107746a200420094107746a200520096b4107741086051a0b200420094107746a220c4200370200200c41086a200341e0036a41f8001085051a2006200541016a3b018e0d0c0c0b410521054100210f02400240200941054f0d0041042105200921080c010b41052108024002402009417b6a0e020201000b200941796a21084101210f410621050c010b410021084101210f0b20032802cc02210e41900d102f2209450d0e200941003b018e0d20094100360200200920062f018e0d220c2005417f736a220b3b018e0d200341086a200641046a2210200541186c6a2211410c6a290200370300200341106a201141146a2802003602002003201129020437030020112802002112200341c8026a2006418c026a221320054107746a4180011085051a200b410c4f0d01200c200541016a22116b200b470d02200941046a2010201141186c6a200b41186c1085051a2009418c026a201320114107746a200b4107741085051a200620053b018e0d200341e0036a41086a200341086a290300370300200341e0036a41106a200341106a280200360200200320032903003703e003200341f4036a200341c8026a4180011085051a200341c8026a200341e0036a4194011085051a20092006200f1b220b41046a21050240200841016a220f200b2f018e0d22114b220c0d002005200f41186c6a2005200841186c6a201120086b41186c1086051a0b2005200841186c6a2205200d3702102005200a36020c200520043602082005200436020420052007360200200b418c026a21040240200c0d002004200f4107746a200420084107746a201120086b4107741086051a0b200420084107746a220c4200370200200c41086a200341e0036a41f8001085051a200b201141016a3b018e0d20034198016a200341c8026a4194011085051a200320034198016a419401108505210b02400240200628020022040d004100210e0c010b200b41e0036a41146a2114200b41146a211541002105200921162012211703402004210a20062f018c0d2108200b41b0026a41106a2218200b41106a280200360200200b41b0026a41086a2219200b41086a290200370300200b200b2902003703b002200b4198016a20154180011085051a200e2005470d050240200a2f018e0d2213410a4b0d00200b41e0036a41106a2209200b41106a280200360200200b41e0036a41086a2205200b41086a290200370300200b200b2902003703e003200a41046a21040240201320084d22060d002004200841186c6a220741186a2007201320086b41186c1086051a0b2004200841186c6a220420173602002004200b2903e0033702042004410c6a2005290300370200200441146a2009280200360200200b41e0036a20154180011085051a200841016a2104200a418c026a2109024020060d00200920044107746a200920084107746a201320086b4107741086051a0b201341016a2105200920084107746a200b41e0036a4180011085051a200a41900d6a2109201341026a210b024020060d00200841027420096a41086a200920044102746a201320086b4102741086051a0b200a20053b018e0d200920044102746a20163602002004200b4f0d0e201341016a2105200a2004417f6a22044102746a41940d6a2106034020062802002209200441016a22043b018c0d2009200a360200200641046a210620052004470d000c0f0b0b4100211041042104024020084105490d0020082104024002402008417b6a0e020201000b200841796a210841012110410621040c010b4100210841012110410521040b41c00d102f2209450d10200941003b018e0d200941003602002009200a2f018e0d22112004417f736a22053b018e0d200b41f8046a41086a220f200a200441186c6a220641106a290200370300200b41f8046a41106a221a200641186a280200360200200b200641086a2902003703f804200641046a2802002112200b41c8026a200a418c026a221b20044107746a4180011085051a2005410c4f0d062011200441016a22076b2005470d07200941046a2006411c6a200541186c1085051a2009418c026a201b20074107746a20054107741085051a200a20043b018e0d200b41e0036a41086a2211200f290300370300200b41e0036a41106a220f201a280200360200200b200b2903f8043703e0032014200b41c8026a4180011085051a20092f018e0d220641016a21052006410c4f0d08201320046b22042005470d09200e41016a210e200941900d6a200a20074102746a41900d6a20044102741085051a4100210402400340200920044102746a41900d6a280200220520043b018c0d20052009360200200420064f0d01200420042006496a220420064d0d000b0b200b41c8026a200b41e0036a4194011085051a2009200a20101b22052f018e0d2104200f201828020036020020112019290300370300200b200b2903b0023703e003200541046a21070240200841016a220620044b22100d002007200641186c6a2007200841186c6a200420086b41186c1086051a0b2007200841186c6a220720173602002007200b2903e0033702042007410c6a2011290300370200200741146a200f280200360200200b41e0036a200b4198016a4180011085051a2005418c026a2111024020100d00201120064107746a201120084107746a200420086b4107741086051a0b200441016a2107201120084107746a200b41e0036a4180011085051a200541900d6a21110240200841026a2210200441026a220f4f0d00201120104102746a201120064102746a200420086b4102741086051a0b201120064102746a2016360200200520073b018e0d02402006200f4f0d00200520084102746a41940d6a2104034020042802002206200841016a22083b018c0d20062005360200200441046a210420072008470d000b0b200b200b41c8026a4194011085051a200a2106200e21052009211620122117200a28020022040d000b0b200b41e0036a200b4194011085051a20002802042206450d082000280200210541c00d102f2204450d0e200420063602900d200441003b018e0d20044100360200200641003b018c0d20062004360200200020043602042000200541016a3602002005200e470d0920042f018e0d2206410b4f0d0a2004200641016a22083b018e0d2004200641186c6a220541046a2012360200200541086a200b2902e003370200200541106a200b41e0036a41086a290200370200200541186a200b41e0036a41106a280200360200200420064107746a418c026a200b41f4036a4180011085051a200441900d6a20084102746a2009360200200920083b018c0d200920043602002000200028020841016a3602080c0c0b102c000b200b410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b41b0a3c200413541e8a3c200102d000b2005410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2005410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b2000200028020841016a3602080b20012802142106200128020c210820012802082104200128020021050b200141106a210702400240200028020c22094106490d00200041186a2802002109200041146a280200210b0c010b200041146a210b0b200728020021072001280204210a0240024002400240024002400240024002400240024002400240024002400240200b450d0020090d010b0240200a450d00200510300b2007450d01200810300c010b200341f4036a2006360200200341f0036a2007360200200320083602ec03200320043602e8032003200a3602e403200320053602e0032009410c6c200b6a41746a200341e0036a10f3040d010b0240200c28020022044106490d00200c410c6a2802002204450d01200341e0036a41086a200241086a280200360200200320022902003703e003200341e0036a2106200c28020822090d03418486c20041fc00418888c2001050000b20040d010b200341e0036a41086a200241086a280200360200200320022902003703e0030240024002400240200c28020022044106490d00200c28020c22092004460d01200c410c6a21060c0d0b4105210920044105460d01200c41086a210520042109200c21060c0d0b200c28020c2106200421090c010b200421060b20092006470d08200641016a22092006490d054100417f2009417f6a677620094102491b220941016a22062009490d050240024020044106490d00200c28020c2109200c2802082108200421050c010b200c41086a210841052105200421090b200920064b0d020240200641054b0d00200441054d0d09200c4100360204200c41086a2008200941186c1085051a200c20093602002005ad42187e220d422088a70d04200810300c090b20052006470d040c080b200341e0036a41086a200241086a280200360200200320022902003703e003200c41086a2109200341e0036a21060b024020092004417f6a41186c6a22042802002209450d00200441046a280200450d00200910300b20042006290200370200200441086a200641086a2802003602000c090b41c29ac200412041e49ac200102d000b200341003602cc022003200da73602c80241bea9c200412b200341c8026a41e485c20041f485c2001034000b2006ad42187e220d422088a70d00200da7210b0240200441054b0d00200b102f2204450d0820042008200941186c1085051a0c030b2005ad42187e220d422088a7450d010b41d099c200411141e499c200102d000b200b102f2204450d0520042008200b200da722052005200b4b1b1085051a200810300b200c200936020c200c2004360208200c4101360204200c20063602000b200c410c6a2106200c28020c21090b200c28020821050b200341e0036a41086a280200210820032903e003210d2005200941186c6a220441002802e88f4236020c2004200d370200200441106a4200370200200441086a20083602002006200628020041016a3602000b20034190056a24000f0b102a000b0900200042003702000b870703067f017e017f230041306b220524000240024002402002280208220641176a2207417f4c0d0020012802042108200228020021090240024020070d004101210a0c010b2007102f220a450d020b20054100360218200520073602142005200a360210200541106a418b90c200411710fd02200541106a2009200610fd0220052802142107200541106a20082005280210220a200528021810e70202402007450d00200a10300b02400240024020052802104101460d000240200528021422070d00200542003703000c030b200541186a290300210b200541286a4200370300200541206a4200370300200541186a42003703002005420037031002400240200b4280808080708342808080808004510d0020054101360200200ba70d010c040b200b422088a7220a4120470d02200541106a41186a200741186a290000370300200541106a41106a200741106a290000370300200541106a41086a200741086a2900003703002005200729000037031020052008200541106a20022003200410f702200ba7450d030b200710300c020b200541013602000c010b4120200a418c91c200105b000b024002400240024020052802004101460d002005410c6a2802002108200541086a280200210c200528020421070240024020012802004198016a2009200610ed0222060d0041002109200541003602100c010b200541106a20062003200410f802200541106a41086a280200210a20052802142106200528021021090b0240024020070d002009450d010c040b20090d020b2000200c36020420002007360200200041086a20083602000c030b41d488c1004130200541106a41dcfcc00041dcfdc0001034000b024002402007200920062008200820064b1b10880522030d00200820064f0d020c010b2003417f4a0d010b2000200c36020420002007360200200041086a20083602000c010b02400240200a28020022084106490d00200a410c6a2802002108200a41086a280200210a0c010b200a41086a210a0b200a450d032008450d0302400240200841186c200a6a41686a2802000d0020002001200220092006108c030c010b2006417f4c0d020240024020060d00410121020c010b2006102f2202450d040b2002200920061085052102200041086a200636020020002006360204200020023602000b2007450d00200c450d00200710300b200541306a24000f0b102c000b102a000b418486c20041fc00418087c2001050000b0600108e03000b1100418ee2c100410f41a4e3c100102d000b3d01017f230041206b2203240020002802002100200341106a20023602002003200136020c200341003602082000200341086a109003200341206a24000be80202057f017e230041c0006b22022400200241086a41106a2203200141106a290200370300200241086a41086a2204200141086a2902003703002002200129020037030802400240024020004184026a280200220120004180026a280200470d00200141016a22052001490d02200141017422062005200620054b1b22054104200541044b1bad42187e2207422088a74541027421052007a721060240024020010d00200241003602300c010b200241386a41043602002002200141186c360234200220002802fc013602300b200241206a20062005200241306a1069200241286a280200210120022802204101460d01200020022802243602fc0120004180026a200141186e36020020002802840221010b20002802fc01200141186c6a22012002290308370200200141106a2003290300370200200141086a2004290300370200200020002802840241016a36028402200241c0006a24000f0b2001450d00102a000b102c000b830c02077f017e230041d0006b22012400024002402000280200220241cc006a220328020022044106490d00200241d8006a22052802002100200241d4006a28020021060c010b200241d4006a21062004210020032105410521040b0240024020002004470d00200141206a20034101109203024020012802204101470d00200141286a2802000d0241d099c200411141e499c200102d000b200241d8006a22052802002100200241d4006a28020021060b20062000410c6c6a42003702042005200528020041016a360200200120024198016a109303200141206a41186a200141186a2802002200360200200141206a41106a200141106a290300370300200141206a41086a200141086a2903003703002001200129030037032002402000450d0020012000417f6a360238200141206a410020012802241b220328020021040240024020032802082206200328020422002f01d6094f0d00200021050c010b03400240200028020022050d00410021050c020b200441016a210420002f01d409210620052100200620052f01d6094f0d000b0b024002402004450d00200641027420056a41dc096a280200210002402004417f6a2204450d00034020002802d80921002004417f6a22040d000b0b410021040c010b200641016a2104200521000b2003200036020420034100360200200320043602082005200641e4006c6a4188016a210003402000410c6a210702400240200028020c22064106490d00200041186a210420002802182105200028021421030c010b200041146a21032006210520072104410521060b024020052006470d00200141c0006a20074101109203024020012802404101470d00200141c8006a2802000d0441d099c200411141e499c200102d000b200041186a210420002802182105200028021421030b20032005410c6c6a42003702042004200428020041016a36020020012802382200450d0120012000417f6a360238200141206a410020012802241b220328020021040240024020032802082206200328020422002f01d6094f0d00200021050c010b03400240200028020022050d00410021050c020b200441016a210420002f01d409210620052100200620052f01d6094f0d000b0b024002402004450d00200641027420056a41dc096a280200210002402004417f6a2204450d00034020002802d80921002004417f6a22040d000b0b410021040c010b200641016a2104200521000b2003200036020420034100360200200320043602082005200641e4006c6a4188016a21000c000b0b02400240024002400240200241b0016a220028020022054106490d00200241bc016a220028020022042005460d01200241b8016a28020021060c040b4105210420054105460d01200241b8016a2106200521040c030b200241bc016a2802002100200521040c010b200521000b024020042000470d00024002400240200041016a22042000490d004100417f2004417f6a677620044102491b220441016a22002004490d000240024020054106490d00200241bc016a2802002104200241b8016a2802002103200521060c010b200241b8016a210341052106200521040b024002400240200420004b0d000240200041054b0d00200541054d0d07200241b4016a4100360200200241b8016a20032004410c6c1085051a200220043602b0012006ad420c7e2208422088a70d02200310300c070b20062000470d020c060b41c29ac200412041e49ac200102d000b2001410036022420012008a736022041bea9c200412b200141206a41e485c20041f485c2001034000b2000ad420c7e2208422088a70d002008a721070240200541054b0d002007102f2205450d06200520032004410c6c1085051a0c030b2006ad420c7e2208422088a7450d010b41d099c200411141e499c200102d000b2007102f2205450d032005200320072008a72206200620074b1b1085051a200310300b200220003602b001200241bc016a2004360200200241b8016a2005360200200241b4016a41013602000b200241bc016a22002802002104200241b8016a28020021060b20062004410c6c6a42003702042000200028020041016a360200200141d0006a24000f0b102a000b870503057f017e037f230041106b2203240002400240200128020022044106490d002001410c6a2802002105200421060c010b41052106200421050b02400240200620056b2002490d00200041003602000c010b024002400240024002400240200520026a22022005490d004100417f2002417f6a677620024102491b220541016a22062005490d000240024020044106490d002001410c6a2802002105200141086a2802002107200421020c010b200141086a210741052102200421050b200520064b0d010240200641054b0d000240200441054b0d00200041003602000c080b20014100360204200141086a20072005410c6c1085051a200120053602002002ad420c7e2208422088a70d03200710300c060b20022006460d052006ad420c7e2208422088a7220945410274210a2008a7210b20090d030240200441054b0d000240200b102f2202450d00200220072005410c6c1085051a0c060b2000200b36020420004101360200200041086a200a3602000c070b2002ad420c7e2208a72104024002402008422088a70d00200b102f2202450d0120022007200b20042004200b4b1b1085051a200710300c060b2000200436020420004101360200200041086a41003602000c070b2000200b36020420004101360200200041086a200a3602000c060b2000200636020420004101360200200041086a41003602000c050b41c29ac200412041e49ac200102d000b2003410036020c20032008a736020841bea9c200412b200341086a41e485c20041f485c2001034000b2000200b36020420004101360200200041086a200a3602000c020b20014101360204200120063602002001410c6a2005360200200141086a20023602000b200041003602000b200341106a24000b8a0201057f230041206b22022400024002400240200128020422030d004100210420004100360204200041106a41003602000c010b20012802002104200321050240034020032f01d6092106024020040d002004450d020c040b2004450d032004417f6a2104200320064102746a41d8096a280200210320052802d80921050c000b0b2000200436020c200041003602082000200536020420002004360200200041146a2006360200200041106a2003360200200128020821040b20002004360218200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b0a0020002802001095030bb60501077f230041d0006b2201240002400240200041c0006a410010f40422020d00200141086a20004198016a109303200141286a41186a200141086a41186a2802002203360200200141286a41106a200141086a41106a290300370300200141286a41086a200141086a41086a2903003703002001200129030837032802402003450d0020012003417f6a360240200141286a4100200128022c1b220428020021050240024020042802082206200428020422032f01d6094f0d00200321070c010b03400240200328020022070d00410021070c020b200541016a210520032f01d409210620072103200620072f01d6094f0d000b0b024002402005450d00200641027420076a41dc096a280200210302402005417f6a2205450d00034020032802d80921032005417f6a22050d000b0b410021050c010b200641016a2105200721030b2004200336020420044100360200200420053602082007200641e4006c6a4188016a2103024003402003410010f4040d0120012802402203450d0220012003417f6a360240200141286a4100200128022c1b220428020021050240024020042802082206200428020422032f01d6094f0d00200321070c010b03400240200328020022070d00410021070c020b200541016a210520032f01d409210620072103200620072f01d6094f0d000b0b024002402005450d00200641027420076a41dc096a280200210302402005417f6a2205450d00034020032802d80921032005417f6a22050d000b0b410021050c010b200641016a2105200721030b2004200336020420044100360200200420053602082007200641e4006c6a4188016a21030c000b0b418c8bc2004138200141c8006a41c48bc20041b08dc2001034000b200041a4016a410010f6040d010b200141d0006a240020020f0b41e48bc2004138200141c8006a41c48bc20041a08dc2001034000bfa0201027f23004190016b220124000240200041086a2802002202280224450d002002106c0b200220012903683703002002410036022420022001290330370328200241206a200141e8006a41206a280200360200200241186a200141e8006a41186a290300370300200241106a200141e8006a41106a290300370300200241086a200141e8006a41086a290300370300200241306a200141306a41086a290300370300200241386a200141306a41106a290300370300200241c0006a200141306a41186a290300370300200241c8006a200141306a41206a290300370300200241d0006a200141d8006a290300370300200241d8006a200141306a41306a290300370300200241003a0060200241e1006a2001290009370000200241e9006a200141096a41086a290000370000200241f1006a200141096a41106a290000370000200241f9006a200141096a41186a29000037000020024180016a200141286a2900003700002000280200109703210220014190016a240020020ba90e01147f230041c0046b2201240002400240200041c0006a410110f40422020d00200041a0016a28020021032000419c016a2204280200210520044200370200200141d8036a2000280298012005200310d50320012802dc03210320012802d8032104024020012802f0032206450d000240024002402003450d0020012802e003220720032f01d609490d01034002400240200328020022050d00410021050c010b200441016a210820032f01d40921070b024041880a41d80920041b450d00200310300b024020050d00410221040c040b2008210420052103200720052f01d6094f0d000b20052103200821040c010b41b2abc200412b41d4a8c200102d000b200741016a21092003200741e4006c6a22054188016a210820032007410c6c6a220741046a210a02402004450d00200320094102746a41d8096a280200210302402004417f6a2204450d00034020032802d80921032004417f6a22040d000b0b410021090b200141c8016a41086a200841086a290200370300200120082902003703c8012007410c6a280200210b200741086a280200210c20054198016a2802002104200a280200210d200141d8036a2005419c016a41d0001085051a0b20004198016a210e20014198036a41086a220f200141c8016a41086a2210290300370300200120012903c80137039803200141b0026a200141d8036a41d0001085051a200141c8016a41146a211120014198036a4104722112200141e0006a41146a21130340200141d0006a41086a2207200f29030037030020012001290398033703502001200141b0026a41d000108505220541e0006a41086a2214200729030037030020052005290350370360200520043602702013200541d000108505210402400240200541e0006a410110f4040d002006417f6a210602402005280268450d00200541b0026a200541e0006a41e4001085051a2005200b3602e0032005200c3602dc032005200d3602d80320054198036a200e200541d8036a10820302402005280298034101460d00200541b8036a41186a201241186a280200360200200541b8036a41106a201241106a290200370300200541b8036a41086a201241086a290200370300200520122902003703b803200541d8036a200541b0026a41e4001085051a200541b8036a200541d8036a1084031a0c030b200541c8016a20052802a00320052802a40341e4006c6a4188016a220441e4001085051a2004200541b0026a41e4001085051a20052802d8014102460d02200541c8016a1090040240024020052802d40122084106490d0020052802dc01210a024020052802e0012204450d002004410c6c2107200a21040340200410d4032004410c6a2104200741746a22070d000b0b2008410c6c450d01200a10300c010b2008450d002008410c6c2107201121040340200410d4032004410c6a2104200741746a22070d000b0b20052802a402450d0220052802a00210300c020b200541e0006a10900402400240200528026c22084106490d002005280274210a024020052802782204450d002004410c6c2107200a21040340200410d4032004410c6a2104200741746a22070d000b0b2008410c6c450d01200a10300c010b2008450d002008410c6c2107200421040340200410d4032004410c6a2104200741746a22070d000b0b024020052802bc01450d0020052802b80110300b200c450d01200d10300c010b418c8bc2004138200541d8036a41c48bc20041d48bc2001034000b024020060d00410021040c020b02402003450d000240024002400240200920032f01d609490d004100210703404100210402402003280200220a450d00200741016a210920032f01d4092108200a21040b024041880a41d80920071b450d00200310300b024020040d00410221040c050b2009210720042103200820042f01d6094f0d000b2004200841e4006c6a4188016a210a20042008410c6c6a41046a210d024020090d00200421030c020b200841027420046a41dc096a280200210302402009417f6a2207450d00034020032802d80921032007417f6a22070d000b0b410021090c020b2003200941e4006c6a4188016a210a20032009410c6c6a41046a210d20092108200321040b200841016a21090b20042008410c6c6a2207410c6a280200210b200741086a280200210c200d280200210d2010200a41086a2902003703002005200a2902003703c8012004200841e4006c6a22074198016a2802002104200541d8036a2007419c016a41d0001085051a20142010290300370300200520052903c8013703600b200f20142903003703002005200529036037039803200541b0026a200541d8036a41d0001085051a0c010b0b41b2abc200412b41d4a8c200102d000b02402003450d00034020032802002105024041880a41d80920041b450d00200310300b200441016a21042005210320050d000b0b200041a4016a410110f6040d010b200141c0046a240020020f0b41e48bc2004138200141d8036a41c48bc200419c8cc2001034000b8f0101027f230041206b22052400024002402003417f4c0d00200028020021064101210002402003450d002003102f2200450d020b20002002200310850521002005411c6a2004360200200541186a2003360200200541146a2003360200200541106a20003602002005200136020c200541013602082006200541086a109003200541206a24000f0b102c000b102a000b8c0f01077f23004180036b2201240002402000280200220241cc006a28020022034106490d00200241d8006a28020021030b0240024002402003450d00034020021097030d02200028020021022003417f6a22030d000b0b200141b0016a2002200041046a200041086a280200109a0302400240024020012802d401450d00200141086a200141b0016a41a8011085051a200128026821040240200141f0006a2802002202450d00200241186c21032004210203400240200241046a280200450d00200228020010300b02402002410c6a2802002205450d00200241106a280200450d00200510300b200241186a2102200341686a22030d000b0b0240200141ec006a2802002202450d00200241186c450d00200410300b200128027421060240200141fc006a2802002202450d002006200241186c6a210720062102034002402002220441046a280200450d00200428020010300b0240200441146a2802002203450d00200428020c2102200341186c210303400240200241046a280200450d00200228020010300b02402002410c6a2802002205450d00200241106a280200450d00200510300b200241186a2102200341686a22030d000b0b200441186a21020240200441106a2802002203450d00200341186c450d00200428020c10300b20022007470d000b0b0240200141f8006a2802002202450d00200241186c450d00200610300b2001280280012104024020014188016a2802002202450d00200241246c21074100210303400240200420036a220241046a280200450d00200228020010300b0240200241106a280200450d002002410c6a28020010300b0240200241186a2802002205450d002002411c6a280200450d00200510300b2007200341246a2203470d000b0b024020014184016a2802002202450d00200241246c450d00200410300b200141086a106c0240200041086a2802002202280224450d002002106c0b200220012903d80237030020024100360224200220012903b001370328200241206a200141d8026a41206a280200360200200241186a200141d8026a41186a290300370300200241106a200141d8026a41106a290300370300200241086a200141d8026a41086a290300370300200241306a200141b0016a41086a290300370300200241386a200141b0016a41106a290300370300200241c0006a200141b0016a41186a290300370300200241c8006a200141b0016a41206a290300370300200241d0006a200141d8016a290300370300200241d8006a200141b0016a41306a290300370300200241003a0060200241e1006a2001290008370000200241e9006a200141086a41086a290000370000200241f1006a200141086a41106a290000370000200241f9006a200141086a41186a29000037000020024180016a200141276a290000370000200028020022064194016a2d00000d01200641013a0094010240200641cc006a28020022024106490d00200641d8006a28020021020b20064190016a2002360200200141086a20064198016a109303200141b0016a41186a200141086a41186a2802002202360200200141b0016a41106a200141086a41106a290300370300200141b0016a41086a200141086a41086a290300370300200120012903083703b0012002450d0420012002417f6a22073602c801200141b0016a410020012802b4011b220028020021050240024020002802082204200028020422022f01d6094f0d00200221030c010b03400240200228020022030d00410021030c020b200541016a210520022f01d409210420032102200420032f01d6094f0d000b0b024002402005450d00200441027420036a41dc096a280200210202402005417f6a2205450d00034020022802d80921022005417f6a22050d000b0b410021050c010b200441016a2105200321020b2000200236020420004100360200200020053602082003200441e4006c6a4188016a2102034020022d00540d03200241013a00540240200228020c22034106490d00200228021821030b200220033602502007450d0520012007417f6a22073602c801200141b0016a410020012802b4011b220028020021050240024020002802082204200028020422022f01d6094f0d00200221030c010b03400240200228020022030d00410021030c020b200541016a210520022f01d409210420032102200420032f01d6094f0d000b0b024002402005450d00200441027420036a41dc096a280200210202402005417f6a2205450d00034020022802d80921022005417f6a22050d000b0b410021050c010b200441016a2105200321020b2000200236020420004100360200200020053602082003200441e4006c6a4188016a21020c000b0b41d488c1004130200141d8026a41dcfcc00041ecfdc0001034000b41fcfdc00041c500200141d8026a41c4fec00041d4fec0001034000b41e08dc20041c100200141d8026a41c08dc20041a48ec2001034000b41e4fec000418e02200141d8026a41f480c100418481c1001034000b0240200641f8016a2d00000d00200641013a00f8010240200641b0016a28020022024106490d00200641bc016a28020021020b200641f4016a200236020020014180036a24000f0b41e48bc2004138200141d8026a41c08dc20041d08dc2001034000bc34803107f017e0b7f230041e0046b220424000240200341246a220528020022060d00200441286a200141c0006a10e9022004200110ea02200441b8016a41186a200441286a41186a280200360200200441b8016a41106a200441286a41106a290300370300200441b8016a41086a200441286a41086a290300370300200420042903283703b801200441d0026a41186a200441186a280200360200200441d0026a41106a200441106a290300370300200441d0026a41086a200441086a290300370300200420042903003703d002200441c8036a2002200441b8016a200441d0026a10d303200441c8006a41086a2207200441c8036a41086a290300370300200441c8006a41106a2208200441c8036a41106a290300370300200441c8006a41186a2209200441c8036a41186a290300370300200420042903c803370348200441d0026a200441e8036a41e0001085051a200441c8036a200441d0026a41e0001085051a02402005280200450d002003106c0b2003200441c8036a41e000108505220241f9006a2009290300370000200241f1006a2008290300370000200241e9006a2007290300370000200241e1006a2004290348370000200241013a0060200241246a28020021060b200541003602000240024002402006450d0020032d00602102200341003a0060200441ec036a2006360200200441c8036a41206a200341206a2207280200360200200441c8036a41186a200341186a2208290300370300200441c8036a41106a200341106a2209290300370300200441c8036a41086a200341086a220a290300370300200441c8036a41286a200341286a2205290300370300200441c8036a41306a200541086a220b29030037030020044180046a200541106a220c290300370300200441c8036a41c0006a200541186a220d290300370300200441c8036a41c8006a200541206a220e290300370300200441c8036a41d0006a200541286a290300370300200441c8036a41d8006a200541306a220f290300370300200420032903003703c8030240024020024101470d00200441b8016a41086a200a290300370300200441b8016a41106a2009290300370300200441b8016a41186a2008290300370300200441b8016a41206a2007280200360200200441d0026a41086a200b290300370300200441d0026a41106a200c290300370300200441d0026a41186a200d290300370300200441d0026a41206a200e290300370300200441d0026a41286a200541286a290300370300200441d0026a41306a200f290300370300200420032903003703b801200420052903003703d002200441d0026a41d0006a200341f9006a290000370300200441d0026a41c8006a200341f1006a290000370300200441d0026a41c0006a200341e9006a2900003703002004200341e1006a29000037038803200441c8006a200441d0026a41d8001085051a0c010b200441c8036a106c410021060b2006450d00200441d0026a41206a2203200441b8016a41206a280200360200200441d0026a41186a2205200441b8016a41186a290300370300200441d0026a41106a2202200441b8016a41106a290300370300200441d0026a41086a2207200441b8016a41086a290300370300200420042903b8013703d002200441c8036a200441c8006a41d8001085051a200441086a2007290300370300200441106a2002290300370300200441186a2005290300370300200441206a2003280200360200200441c8006a41086a200441c8036a41086a290300370300200441c8006a41106a200441c8036a41106a290300370300200441c8006a41186a200441c8036a41186a2203290300370300200441c8006a41206a200441c8036a41206a290300370300200441c8006a41286a200441c8036a41286a290300370300200441c8006a41306a200441c8036a41306a290300370300200420042903d002370300200420042903c803370348200441286a41186a20044198046a290300370300200441286a41106a20044190046a290300370300200441286a41086a200441c8036a41c0006a2903003703002004200429038004370328200441c8036a200141c0006a41d8001085051a200141cc006a4200370200200141c4006a420037020020014194016a41003a000020014190016a41003602000240024020042802d40322024106490d00200328020021030c010b200221030b20030d01024020042802cc03220a0d004100210c4100210a410021100c030b20042802d003211020042802c8032103200a210c0340200a2f018a0c210d2003450d032003417f6a2103200a200d4102746a418c0c6a280200210a200c28028c0c210c0c000b0b41c48ec100413b41808fc1001050000b41a888c200412c41d488c200102d000b0240024020024106490d00200441dc036a28020021070240200441e0036a2802002203450d002003410c6c2105200721030340200310d4032003410c6a2103200541746a22050d000b0b2002410c6c450d01200710300c010b2002450d00200441dc036a21032002410c6c21050340200310d4032003410c6a2103200541746a22050d000b0b200141a0016a28020021032001419c016a2205280200210220054200370200200441c8036a2001280298012002200310d50320042802e003211120042802d003211220042802cc03210920042802c803210f200441d0026a200141a4016a41d8001085051a200141b0016a4200370300200141a8016a420037030041002103200141f8016a41003a0000200141f4016a4100360200200441c8036a200441d0026a41d8001085051a0240024020042802cc0322050d00410021130c010b20042802d003211320042802c80321012005210303402001450d012001417f6a2101200520052f018e0d4102746a41900d6a280200210520032802900d21030c000b0b0240024020042802d40322024106490d00200441dc036a28020021070240200441e0036a2802002205450d002005410c6c2101200721050340200510d6032005410c6a2105200141746a22010d000b0b2002410c6c450d01200710300c010b2002450d00200441dc036a21052002410c6c21010340200510d6032005410c6a2105200141746a22010d000b0b0240024002400240024002400240024002400240024002400240024002400240024002400240024002402013450d002003450d0120032f018e0d0d0241002101034041002105024020032802002208450d00200141016a210720032f018c0d2102200821050b024041c00d41900d20011b450d00200310300b024020050d00410221020c060b2007210120052103200220052f018e0d4f0d000b200241016a2101200520024107746a418c026a210b2005200241186c6a41046a2108024020070d00200521030c040b200520014102746a41900d6a280200210302402007417f6a2201450d00034020032802900d21032001417f6a22010d000b0b410021010c030b4100210b410021010c040b41b2abc200412b41d4a8c200102d000b2003418c026a210b200341046a21084101210141002102200321050b20082802002107200441b0026a41106a2005200241186c6a220841186a280200360200200441b0026a41086a200841106a2902003703002004200841086a2902003703b002200520024107746a22084190026a2802002102200b2802002105200441c8036a20084194026a41f8001085051a0b200441b8016a41106a200441b0026a41106a280200360200200441b8016a41086a200441b0026a41086a290300370300200420042903b0023703b801200441d0026a200441c8036a41f8001085051a200420023602cc03200420053602c803200441c8036a41086a2202200441d0026a41f8001085051a0240024020054106490d00200441d4036a2208280200210520042802d00321020c010b200441c8036a21080b2005450d0420082005417f6a22053602002002200541186c6a220528020c2202450d04200441d4016a200541086a280200360200200420052902003702cc010240200541106a29020042ffffffff0383500d00200210300b2013417f6a210b200441c8036a10d9022007450d00417f200b41016a22052005200b491bad42247e2214422088a70d0f2014a72205417f4c0d0f2005102f2215450d0b20152007360200201520042903b8013702042015410c6a200441c0016a290300370200201541146a200441c8016a2903003702002015411c6a200441d0016a290300370200200541246e210e0240200b0d00410121134100210b0c0a0b2003450d030240024002400240200120032f018e0d490d0041002102034041002105024020032802002208450d00200241016a210720032f018c0d2101200821050b024041c00d41900d20021b450d00200310300b024020050d00410221010c050b2007210220052103200120052f018e0d4f0d000b200520014107746a418c026a21082005200141186c6a41046a2116024020070d00200521030c020b200141027420056a41940d6a280200210302402007417f6a2202450d00034020032802900d21032002417f6a22020d000b0b410021070c020b200320014107746a418c026a21082003200141186c6a41046a2116200321050b200141016a21070b20162802002117200441b0026a41106a2005200141186c6a220241186a280200360200200441b0026a41086a200241106a2902003703002004200241086a2902003703b002200520014107746a22024190026a280200210120082802002105200441c8036a20024194026a41f8001085051a0b20044190026a41106a2218200441b0026a41106a221928020036020020044190026a41086a221a200441b0026a41086a221b290300370300200420042903b00237039002200441d0026a200441c8036a41f8001085051a200441b8016a41146a211c200441c8036a410c6a211d200441c8036a41086a211e410121160340200441b8016a41106a22082018280200360200200441b8016a41086a221f201a29030037030020042004290390023703b801200420013602cc03200420053602c803201e200441d0026a41f80010850521010240024020054106490d0020042802d403210520042802d0032101201d21020c010b200441c8036a2102200121010b2005450d0320022005417f6a22053602002001200541186c6a220528020c2201450d03201c2005290200370200201c41086a200541086a2802003602000240200541106a29020042ffffffff0383500d00200110300b200b417f6a210b200441c8036a10d90202402017450d000240200e2016470d00200e417f200b41016a22052005200b491b6a2205200e490d12200e41017422012005200120054b1b22054104200541044b1bad42247e2214422088a74541027421052014a7210102400240200e0d00200441003602c8030c010b200441043602d003200420153602c8032004200e41246c3602cc030b200441d0026a20012005200441c8036a106920042802d802210520042802d0024101460d0a20042802d4022115200541246e210e0b2015201641246c6a22052017360200200520042903b8013702042005410c6a201f290300370200200541146a20082903003702002005411c6a200441b8016a41186a290300370200200b450d0a2003450d030240024002400240200720032f018e0d490d0041002101034041002105024020032802002208450d00200141016a210720032f018c0d2102200821050b024041c00d41900d20011b450d00200310300b024020050d00410221010c050b2007210120052103200220052f018e0d4f0d000b200520024107746a418c026a21082005200241186c6a41046a2117024020070d00200521030c020b200241027420056a41940d6a280200210302402007417f6a2201450d00034020032802900d21032001417f6a22010d000b0b410021070c020b200320074107746a418c026a21082003200741186c6a41046a211720072102200321050b200241016a21070b2017280200211720192005200241186c6a220141186a280200360200201b200141106a2902003703002004200141086a2902003703b002200520024107746a22024190026a280200210120082802002105200441c8036a20024194026a41f8001085051a0b201641016a211620182019280200360200201a201b290300370300200420042903b00237039002200441d0026a200441c8036a41f8001085051a0c010b0b20162113200721010c090b4100211341002802e88f4221152003450d05200b450d04200441c8036a41186a2116200441e8036a21170340024002400240200120032f018e0d490d0041002101034041002105024020032802002208450d00200141016a210720032f018c0d2102200821050b024041c00d41900d20011b450d00200310300b024020050d00410221070c040b2007210120052103200220052f018e0d4f0d000b200241016a2101200520024107746a418c026a210e2005200241186c6a41046a2108024020070d00200521030c020b200520014102746a41900d6a280200210302402007417f6a2201450d00034020032802900d21032001417f6a22010d000b0b410021010c010b200320014107746a418c026a210e2003200141186c6a41046a21082001210220032105200141016a21010b200441b8016a41106a200841106a290200370300200441b8016a41086a200841086a290200370300200420082902003703b801200520024107746a22054190026a2802002107200e2802002108200441c8036a20054194026a41f8001085051a0b200441b0026a41106a2205200441b8016a41106a290300370300200441b0026a41086a2202200441b8016a41086a290300370300200420042903b8013703b002200441d0026a200441c8036a41f8001085051a200441c8036a41106a2005290300370300200441c8036a41086a2002290300370300200420042903b0023703c803200420073602e403200420083602e0032017200441d0026a41f8001085051a024020042802cc03450d0020042802c80310300b200b417f6a210b024020042802d803450d0020042802d40310300b201610d902200b0d000c050b0b41b2abc200412b41d4a8c200102d000b418486c20041fc0041848ac1001050000b41b2abc200412b41d4a8c200102d000b418486c20041fc0041848ac1001050000b41002105034020032802002101024041c00d41900d20051b450d00200310300b2005417f6a21052001210320010d000b410021130b4100210e0c030b20050d030c070b200721014100210b0b2003450d000240200b450d00200441c8036a41186a2117200441e8036a211c03400240024002400240200120032f018e0d490d0041002101034041002105024020032802002208450d00200141016a210720032f018c0d2102200821050b024041c00d41900d20011b450d00200310300b024020050d00410221070c050b2007210120052103200220052f018e0d4f0d000b200520024107746a418c026a21162005200241186c6a41046a2108024020070d00200521030c020b200241027420056a41940d6a280200210302402007417f6a2201450d00034020032802900d21032001417f6a22010d000b0b410021010c020b200320014107746a418c026a21162003200141186c6a41046a210820012102200321050b200241016a21010b200441b8016a41106a200841106a290200370300200441b8016a41086a200841086a290200370300200420082902003703b801200520024107746a22054190026a280200210720162802002108200441c8036a20054194026a41f8001085051a0b200441b0026a41106a2205200441b8016a41106a290300370300200441b0026a41086a2202200441b8016a41086a290300370300200420042903b8013703b002200441d0026a200441c8036a41f8001085051a200441c8036a41106a2005290300370300200441c8036a41086a2002290300370300200420042903b0023703c803200420073602e403200420083602e003201c200441d0026a41f8001085051a024020042802cc03450d0020042802c80310300b200b417f6a210b024020042802d803450d0020042802d40310300b201710d902200b0d000b0b41002105034020032802002101024041c00d41900d20051b450d00200310300b2005417f6a21052001210320010d000b0b200441dc036a200d360200200441d8036a200a360200200420103602e003200442003703d0032004200c3602cc034100210a200441003602c803200041e0006a200441c8036a10d703024002402011450d000240024002402009450d00201220092f01d609490d01034002400240200928020022030d00410021030c010b200f41016a210520092f01d40921120b024041880a41d809200f1b450d00200910300b024020030d00410221030c040b2005210f20032109201220032f01d6094f0d000b200321092005210f0c010b41b2abc200412b41d4a8c200102d000b201241016a21032009201241e4006c6a22054188016a210120092012410c6c6a41046a210202400240200f0d00200321120c010b200920034102746a41d8096a28020021090240200f417f6a2203450d00034020092802d80921092003417f6a22030d000b0b410021120b200441b0026a41086a2207200241086a280200360200200441c4026a200141086a290200370200200420022902003703b002200420012902003702bc0220054198016a2802002103200441c8036a2005419c016a41d0001085051a20044190026a41186a200441b0026a41186a28020036020020044190026a41106a200441b0026a41106a29030037030020044190026a41086a2007290300370300200420042903b002370390020b2011417f6a210a200441f0016a41186a220520044190026a41186a280200360200200441f0016a41106a220120044190026a41106a290300370300200441f0016a41086a220220044190026a41086a29030037030020042004290390023703f001200441d0026a200441c8036a41d0001085051a200441c8036a41186a22072005280200360200200441c8036a41106a22052001290300370300200441c8036a41086a22012002290300370300200441e4036a22022003360200200420042903f0013703c803200441c8036a41206a200441d0026a41d0001085052103200441b8016a200441c8036a10d803024020042802b801450d00200441a0016a41086a200441b8016a41086a2208280200360200200441e4016a280200210b200441e0016a280200210c2003200441b8016a41206a2903003703002007200441b8016a41186a2903003703002005200441b8016a41106a29030037030020012008290300370300200420042903b80122143703a001200420143703c803200441d0026a41186a200441ec036a280200360200200441d0026a41106a2002290200370300200441d0026a41086a200441dc036a290200370300200420042902d4033703d002200441ac016a200441d0026a10d7030240200b450d00200c10300b20042802a0010d020b4100210f0b4100211141002802e88f42210c02402009450d002004200a3602d403200420123602d003200420093602cc032004200f3602c803200441c8036a10d9030b4100210d0c040b417f200a41016a22032003200a491bad42187e2214422088a70d042014a72203417f4c0d042003102f220c450d00200c20042903a001370200200c41106a200441a0016a41106a290300370200200c41086a200441a0016a41086a290300370200200341186e210d0240200a0d00410121114100210a0c030b0240024002402009450d000240024002400240201220092f01d609490d0041002105034041002103024020092802002202450d00200541016a210120092f01d4092112200221030b024041880a41d80920051b450d00200910300b024020030d00410221030c050b2001210520032109201220032f01d6094f0d000b2003201241e4006c6a4188016a210220032012410c6c6a41046a2107024020010d00200321090c020b201241027420036a41dc096a280200210902402001417f6a2205450d00034020092802d80921092005417f6a22050d000b0b410021050c020b2009201241e4006c6a4188016a210220092012410c6c6a41046a2107200921030b201241016a21050b200441b0026a41086a2201200741086a280200360200200420072902003703b002200441c4026a200241086a290200370200200420022902003702bc022003201241e4006c6a22024198016a2802002103200441c8036a2002419c016a41d0001085051a20044190026a41186a200441b0026a41186a28020036020020044190026a41106a200441b0026a41106a29030037030020044190026a41086a2001290300370300200420042903b002370390020b200441f0016a41186a221620044190026a41186a221c280200360200200441f0016a41106a221220044190026a41106a2218290300370300200441f0016a41086a221720044190026a41086a221a29030037030020042004290390023703f001200441d0026a200441c8036a41d0001085051a200441b0026a410c6a2119200441a0016a410c6a211e200441c8036a410c6a210b200441c8036a41206a211b4101210802400340200441c8036a41186a22012016280200360200200441c8036a41106a22022012290300370300200441c8036a41086a22072017290300370300200420042903f0013703c803200420033602e403201b200441d0026a41d0001085052103200a417f6a210a200441b8016a200441c8036a10d80320042802b801450d0120042802e401210f20042802e001211f2003200441b8016a41206a2903003703002001200441b8016a41186a2903003703002002200441b8016a41106a2903003703002007200441b8016a41086a2203290300370300200441a0016a41086a22012003280200360200200420042903b80122143703a001200420143703c803200441d0026a41186a200b41186a280200360200200441d0026a41106a200b41106a290200370300200441d0026a41086a200b41086a2902003703002004200b2902003703d002201e200441d0026a10d7030240200f450d00201f10300b20042802a001450d010240200d2008470d002008417f200a41016a22032003200a491b6a22032008490d0a200841017422022003200220034b1b22034104200341044b1bad42187e2214422088a74541027421032014a721020240024020080d00200441003602c8030c010b200441043602d0032004200c3602c8032004200841186c3602cc030b200441d0026a20022003200441c8036a106920042802d802210320042802d0024101460d0520042802d402210c200341186e210d0b200c200841186c6a220320042903a001370200200341106a200441a0016a41106a290300370200200341086a2001290300370200200a450d062009450d030240024002400240200520092f01d609490d0041002105034041002103024020092802002207450d00200541016a210220092f01d4092101200721030b024041880a41d80920051b450d00200910300b024020030d00410221030c050b2002210520032109200120032f01d6094f0d000b2003200141e4006c6a4188016a210720032001410c6c6a41046a210f024020020d00200321090c020b200141027420036a41dc096a280200210902402002417f6a2205450d00034020092802d80921092005417f6a22050d000b0b410021050c020b2009200541e4006c6a4188016a210720092005410c6c6a41046a210f20052101200921030b200141016a21050b200441b0026a41086a2202200f41086a2802003602002004200f2902003703b00220192007290200370200201941086a200741086a2902003702002003200141e4006c6a22014198016a2802002103200441c8036a2001419c016a41d0001085051a201c200441b0026a41186a2802003602002018200441b0026a41106a290300370300201a2002290300370300200420042903b002370390020b200841016a21082016201c280200360200201220182903003703002017201a29030037030020042004290390023703f001200441d0026a200441c8036a41d0001085051a0c000b0b20052112200821110c050b41b2abc200412b41d4a8c200102d000b41b2abc200412b41d4a8c200102d000b2003450d040b102a000b200521124100210a0b2009450d002004200a3602d403200420123602d003200420093602cc03200441003602c803200441c8036a10d9030b200020042903003703002000200429034837032820004180016a2013360200200041fc006a200e360200200041f8006a2015360200200041086a200441086a290300370300200041106a200441106a290300370300200041186a200441186a290300370300200041206a200441206a280200360200200041306a200441c8006a41086a290300370300200041386a200441c8006a41106a290300370300200041c0006a200441c8006a41186a290300370300200041c8006a200441c8006a41206a290300370300200041d0006a200441f0006a290300370300200041d8006a200441c8006a41306a290300370300200041f4006a2011360200200041f0006a200d360200200041ec006a200c360200200020063602242000419c016a200441286a41186a29030037000020004194016a200441286a41106a2903003700002000418c016a200441286a41086a29030037000020004184016a2004290328370000200441e0046a24000f0b102c000bad0101037f230041b0016b2201240002402000280200220241cc006a28020022034106490d00200241d8006a28020021030b0240024002402003450d00034020021095030d02200028020021022003417f6a22030d000b0b20012002200041046a200041086a280200109a0320012802240d0141d488c1004130200141a8016a41dcfcc000419481c1001034000b41e4fec000418e02200141a8016a41f480c10041a481c1001034000b109c03000b1100418ee2c100410f41b4e3c100102d000ba70402037f017e230041206b220424000240024002400240024002400240024002402001280200220541c0006a2002200310e6022206450d0002400240200628020022024106490d00200628020c2102200628020821060c010b200641086a21060b2006450d022002450d0202400240024020062002417f6a41186c6a2206280200450d0020052802000d06200641086a22023502002107200541003602002005200529030842017c3703082005280210450d0141b082c2004110200441186a41c082c20041c483c2001034000b20052802000d0641002106200541003602002005200529030842017c37030820052802100d07200541003602100c010b20054100360210200541186a2205200529030020077c37030020022802002205417f4c0d07200628020021020240024020050d00410121060c010b2005102f2206450d090b2006200220051085051a0b2000200536020420002006360200200041086a20053602000c010b200441086a20012802042002200310e70220042802084101460d072000200429020c370200200041086a200441146a2802003602000b200441206a24000f0b418486c20041fc00418087c2001050000b41b082c2004110200441186a41c082c20041b483c2001034000b41b082c2004110200441186a41c082c20041b483c2001034000b41b082c2004110200441186a41c082c20041c483c2001034000b102c000b102a000b41d488c1004130200441186a41dcfcc00041bcfdc0001034000bbf0302027f027e230041d0006b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae4202402001450d00200241cc006a410d360200200241146a410236020020024202370204200241bc81c10036020020024104360244200241b481c1003602402002200241c0006a36021020022002360248200241cc81c100103a000b200241386a41002903f8a340370300200241306a41002903f0a340370300200241286a41002903e8a340370300200241206a41002903e0a340370300200241186a41002903d8a340370300200241106a41002903d0a340370300200241086a41002903c8a340370300200241002903c0a340370300200241c0006a200210a0032002350248210420023502402105200241d0006a240020052004422086840b1c0020012802184180f6c100410b2001411c6a28020028020c1100000ba10301037f230041106b2202240020004100360208200042013702002002200110c6032000200228020022032002280208106402402002280204450d00200310300b2002200141106a10c6032000200228020022032002280208106402402002280204450d00200310300b200220012802203602002000200241041064200220012802243602002000200241041064200220012802283602002000200241041064200141306a28020021030240024002400240200141386a200141346a200128022c4101461b280200220441c000490d00200441808001490d012004418080808004490d02200241033a000020002002410110642002200436020020002002410410640c030b200220044102743a000020002002410110640c020b200220044102744101723b010020002002410210640c010b2002200441027441027236020020002002410410640b02402004410c6c2204450d00200320046a2104034020002003410810642002200341086a28020036020020002002410410642003410c6a22032004470d000b0b2002200128023c3602002000200241041064200241106a24000bfb0801087f230041c0036b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241c0026a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae4220024280808080802037020c2002200136021c2002200041bc8ec20020011b3602182002200241186a360208200241c0026a200241086a10a2030240024020022802c4022200450d00200241cc026a280200210420022802c802210520022802c0022106200241e0016a200241d0026a41e0001085051a200241c0026a200241086a10a303024020022802c00222070d0002402004450d00200441246c21012000210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032001415c6a22010d000b0b2005450d01200541246c450d01200010300c010b200241c8026a280200210820022802c402210920024180016a200241e0016a41e0001085051a200241206a20024180016a41e0001085051a0240024020022802082802040d00200241c0026a200241206a41e0001085051a0c010b02402004450d00200441246c21012000210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032001415c6a22010d000b0b02402005450d00200541246c450d00200010300b02402008450d00200841c8016c21012007210003400240200022034184016a2d00004103460d00200341e0006a2d00004102470d00200341e8006a280200450d00200341e4006a28020010300b200341c8016a2100200310b202200141b87e6a22010d000b0b410021002009450d00200941c8016c450d00200710300b20000d010b2002418c016a410d360200200241f4016a4102360200200242023702e401200241bc81c1003602e00120024104360284012002418082c10036028001200220024180016a3602f0012002200241c0026a36028801200241e0016a41cc81c100103a000b200241e0016a200241c0026a41e0001085051a200241cc026a2004360200200241c8026a2005360200200220003602c402200220063602c002200241d0026a200241e0016a41e0001085051a200241b8036a2008360200200241b4036a2009360200200220073602b003200241c0026a10a403200241c0036a240041003502dc94420bc71c05187f017e097f027e037f23004180026b2202240020024190016a410472210341002104024002400340200128020022052802042206450d01200528020022072d0000210820052006417f6a3602042005200741016a360200200320046a20083a00002002200441016a2205360290012005210420054120470d000b200241e0006a41026a2002419d016a2d00003a0000200241d0006a41026a200241a4016a2d00003a0000200220022f0194013b01e801200220022d0096013a00ea0120022002419b016a2f00003b01602002200241a2016a2f01003b01502002419e016a2801002109200241a5016a280000210a200241ac016a280200210b200241b0016a280200210c200228009701210d200241d8016a41026a200241ab016a2d00003a00002002200241a9016a2f00003b01d8010c010b0b2002412c6a41026a20022d00ea013a0000200241286a41026a200241e0006a41026a2d00003a0000200241246a41026a200241d0006a41026a2d00003a0000200241206a41026a200241d8016a41026a2d00003a0000200220022f01e8013b012c200220022f01603b0128200220022f01503b0124200220022f01d8013b0120024002400240024002402006450d00200241186a200110ac0220022802180d02200228021c210e20024190016a4104722103410021040340200128020022052802042206450d02200528020022072d0000210820052006417f6a3602042005200741016a360200200320046a20083a00002002200441016a2205360290012005210420054120470d000b200241e0006a41026a2002419d016a2d00003a0000200241d0006a41026a200241a4016a2d00003a0000200220022f0194013b01e801200220022d0096013a00ea0120022002419b016a2f00003b01602002200241a2016a2f01003b01502002419e016a280100210f200241a5016a2800002110200241ac016a2802002111200241b0016a28020021122002280097012113200241d8016a41026a200241ab016a2d00003a00002002200241a9016a2f00003b01d8010c030b200041003602040c030b0c010b200041003602040c010b2002413c6a41026a20022d00ea013a0000200241386a41026a200241e0006a41026a2d00003a0000200241346a41026a200241d0006a41026a2d00003a0000200241306a41026a200241d8016a41026a2d00003a0000200220022f01e8013b013c200220022f01603b0138200220022f01503b0134200220022f01d8013b0130024002402006450d0020024190016a41047221034100210402400340200128020022052802042206450d01200528020022072d0000210820052006417f6a3602042005200741016a360200200320046a20083a00002002200441016a2205360290012005210420054120470d000b200241e0006a41026a2002419d016a2d00003a0000200241d0006a41026a200241a4016a2d00003a0000200220022f0194013b01e801200220022d0096013a00ea0120022002419b016a2f00003b01602002200241a2016a2f01003b01502002419e016a2801002114200241a5016a2800002115200241ac016a2802002116200241b0016a28020021172002280097012118200241d8016a41026a200241ab016a2d00003a00002002200241a9016a2f00003b01d8010c020b0c010b200041003602040c010b200241cc006a41026a20022d00ea013a0000200241c8006a41026a200241e0006a41026a2d00003a0000200241c4006a41026a200241d0006a41026a2d00003a0000200241c0006a41026a200241d8016a41026a2d00003a0000200220022f01e8013b014c200220022f01603b0148200220022f01503b0144200220022f01d8013b01400240024002400240024002402006450d00200241106a200110ac0220022802100d0202400240024020022802142219200128020028020441246e2205200520194b1bad42247e221a422088a70d00201aa72205417f4c0d000240024020050d00410421030c010b2005102f2203450d070b2001200128020441016a2204360204200541246ead211a200420012802084b0d022019450d0420024190016a410472211b200241de016a211c200241cf016a211d200241f4016a211e200241ad016a211f20024190016a41106a21204100212102400340200128020022052802042204450d04200528020022072d0000210820052004417f6a3602042005200741016a3602000240024002400240024002400240024020080e08000c010c030402050c0b200241086a200110ac0220022802080d0b200128020022072802042208200228020c2204490d0b2004417f4c0d090240024020040d00410121050c010b2004102f2205450d102005410020041087051a2001280200220728020421080b20082004490d0a2005200728020020041085052122200728020422082004490d102007200820046b3602042007200728020020046a3602002022410876212341052108200421220c050b410021040340200128020022052802042206450d0b200528020022072d0000210820052006417f6a3602042005200741016a360200201b20046a20083a00002002200441016a2205360290012005210420054120470d000b200220202902003703c8012002202041056a2900003700cd0120022802940121062002290398012124201e41036a202041036a280000360000201e2020280200360200200241d8016a41046a201d41046a2f00003b0100201c41036a201f41036a280000360000201c201f280000360000200220243702ec01200220063602e8012002201d2800003602d80120022900f301212520022800eb0121072002200241d8016a41056a2900003700bd01200220022902d8013703b801200220022900bd0137008501200220022903b80137038001200220022900850137007520022002290380013703702002200229007537006520022002290370370360200741087621232024421888a721042025422088a72126410021080c050b20024190016a2001109d042002280294012204450d0920022f01900120022d00920141107472210620022d00930121052002290398012225422088a721262025a72122410121080c030b20024190016a2001109d042002280294012204450d0820022f01900120022d00920141107472210620022d00930121052002290398012225422088a721262025a72122410221080c020b20024190016a2001109d042002280294012204450d0720022f01900120022d00920141107472210620022d00930121052002290398012225422088a721262025a72122410321080c010b200128020022052802042204450d06200528020022072d0000210820052004417f6a3602042005200741016a36020020080d0620024190016a200110ad0220022802900122054102460d062002280298012122200228029401210441002123410421080b2023410874200541ff01717221072026ad4220862022ad8421250b200241d0006a41086a2222200241e0006a41086a290300370300200220022903603703500240201a422088a72205201aa7470d00200541016a22272005490d0320054101742228202720272028491b22274104202741044b1bad42247e2224422088a74541027421272024a721280240024020050d0020024100360290010c010b200241043602980120022003360290012002200541246c360294010b200241e8016a2028202720024190016a106920022802f001212720022802e8014101460d0220022802ec012103201a42808080807083202741246ead84211a0b2003200541246c6a2205202537000c2005200436000820052007360004200520063b0001200520083a0000200541036a20064110763a0000200520022903503700142005411c6a2022290300370000201a4280808080107c211a202141016a22212019470d000b20012001280204417f6a3602040c090b20270d060b102c000b200510300b0240201a422088a72205450d00200541246c21042003210503400240024002400240024020052d00000e050400010204030b2005410c6a280200450d03200541086a28020010300c030b2005410c6a280200450d02200541086a28020010300c020b2005410c6a280200450d01200541086a28020010300c010b200541086a280200450d00200541046a28020010300b200541246a21052004415c6a22040d000b0b201aa72205450d02200541246c450d02200310300c020b200041003602040c050b20012004417f6a36020420030d030b200041003602040c030b102a000b2004200841f0f5c100104a000b200020022f01283b00172000200936001a200020022f01243b001e2000200a360021200020022f01203b0025200041106a20022f012c3b0000200041136a200d360000200041126a2002412c6a41026a2d00003a0000200041196a200241286a41026a2d00003a0000200041206a200241246a41026a2d00003a0000200041276a200241206a41026a2d00003a00002000412c6a200c360000200041286a200b360000200041336a20133600002000200f36003a20002010360041200041306a20022f013c3b0000200041326a2002413c6a41026a2d00003a0000200041396a200241386a41026a2d00003a0000200020022f01383b0037200041c0006a200241346a41026a2d00003a0000200020022f01343b003e200020022f01303b0045200041c7006a200241306a41026a2d00003a0000200041cc006a2012360000200041c8006a2011360000200041d2006a200241cc006a41026a2d00003a0000200041d0006a20022f014c3b0000200041d3006a2018360000200041d9006a200241c8006a41026a2d00003a0000200020022f01483b00572000201436005a200041e0006a200241c4006a41026a2d00003a0000200020022f01443b005e20002015360061200041e7006a200241c0006a41026a2d00003a0000200020022f01403b0065200041ec006a2017360000200041e8006a20163600002000201a370208200020033602042000200e3602000b20024180026a24000ba90503037f017e077f230041f0046b22022400200241086a200110ac02024002402002280208450d00200041003602000c010b024002400240200228020c2203200128020028020441c8016e2204200420034b1bad42c8017e2205422088a70d002005a72204417f4c0d0002400240024020040d00410821060c010b2004102f2206450d010b2001200128020441016a2207360204200441c8016e2108024002400240200720012802084b0d0020030d01410021030c060b200041003602000c010b20024198036a41047221094100210a41002104410021070240034020024198036a200110ab02200228029803210b200241d4016a200941c4011085051a200b4102460d01200241106a200241d4016a41c4011085051a024020072008470d00200a200741016a2208200a20084b1b22084104200841044b1bad42c8017e2205422088a74541037421082005a7210c0240024020070d0020024100360298030c010b200241083602a0032002200436029c0320022006360298030b200241e0046a200c200820024198036a106920022802e8042108024020022802e0044101470d0020080d050c060b20022802e4042106200841c8016e21080b200620046a220c200b360200200c41046a200241106a41c4011085051a200a41026a210a200441c8016a21042003200741016a2207460d050c000b0b200041003602002007450d002006210b03400240200b22074184016a2d00004103460d00200741e0006a2d00004102470d00200741e8006a280200450d00200741e4006a28020010300b200741c8016a210b200710b202200441b87e6a22040d000b0b2008450d04200841c8016c450d04200610300c040b102a000b102c000b200128020421070b2000200836020420002006360200200041086a200336020020012007417f6a3602040b200241f0046a24000b811501097f230041f0026b22012400200010a60302400240024002400240024020002802002202450d00200141d8026a2002417f6a10fe0320014188016a20012802d802220220012802e0021082020240024020012d0088014101460d00200141286a4200370300200141206a4200370300200141186a4200370300200142003703100c010b200141286a200141a1016a290000370300200141206a20014199016a290000370300200141186a20014191016a29000037030020012001290089013703100b024020012802dc02450d00200210300b200141106a200041106a41201088050d00200041f8006a280200220341c8016c210441002105417f2106200028027022072102024003402004450d014101210841002109024020024184016a2d00004103470d004101210820022802004101470d00200241046a2d000022084102462109200520084102477221080b200241c8016a2102200441b87e6a2104200641016a2106200821052009450d00200821052008410171450d000b200120063602102001419c016a41013602002001420137028c01200141f0e6c100360288012001410236028401200120014180016a360298012001200141106a3602800120014188016a41f8e6c100103a000b10a204200041f4006a2802002109200141106a200041f0001085051a200341c8016c210402400240024020030d00200721080c010b20042108200721020240034020022802004102460d0120014188016a200241c8011085051a200141d8026a20014188016a10ab0320012d00d8020d05200241c8016a2102200841b87e6a22080d000c030b0b200241c8016a21080b200720046a2008460d002007200341c8016c6a210403402008220241c8016a2108024020024184016a2d00004103460d00200241e0006a2d00004102470d00200241e8006a280200450d00200241e4006a28020010300b200210b20220042008470d000b0b02402009450d00200941c8016c450d00200710300b200141fc8ac2004110108502200128020421020240200128020022084101470d0041fc8ac200411041002802b4ad421105000b200141a0016a2204420037030020014188016a41106a2209420037030020014188016a41086a220642003703002001420037038801200141d8026a41dca4c000410610ab012006200141d8026a41086a2205290000370300200120012900d80237038801200141d8026a41f0bec100410e10ab0120042005290000370300200920012900d80237030020012002410020081b3602d80220014188016a4120200141d8026a410441002802fcad421103004101200110ae0110ae0310a304450d0220014188016a10af032001200141106a410c6a280200220636028001200120014188016a410c6a28020022023602d00220062002470d032006450d05200128028c0121052001280214210041002104034002400240200020046a22022d00002209200520046a22082d0000470d0002400240024002400240024020090e06000304050102000b200241016a200841016a41201088050d050c060b200241046a2802002207200841046a280200470d042007450d05200241086a280200200841086a280200470d042002410c6a2802002008410c6a280200470d040c050b2002410c6a28020022072008410c6a280200470d03200241046a280200200841046a28020020071088050d030c040b200241016a280000200841016a280000470d02200241106a2802002207200841106a280200470d02200241086a280200200841086a28020020071088050d020c030b200241016a280000200841016a280000470d01200241106a2802002207200841106a280200470d01200241086a280200200841086a28020020071088050d010c020b200241016a280000200841016a280000470d00200241106a2802002207200841106a280200470d00200241086a280200200841086a2802002007108805450d010b41baf4c000411410ad01200141d8026a200210e70120012802d802220920012802e00210a404024020012802dc02450d00200910300b200141d8026a200810e70120012802d802220920012802e00210a404024020012802dc02450d00200910300b20022d000020082d00002209470d060b024002400240024002400240024020090e06050203040001050b200241046a2802002209200841046a280200470d0b2009450d05200241086a280200200841086a280200470d0b2002410c6a2802002008410c6a280200470d0b0c050b2002410c6a28020022092008410c6a280200470d0a200241046a280200200841046a28020020091088050d0a0c040b200241016a280000200841016a280000470d09200241106a2802002209200841106a280200470d09200241086a280200200841086a28020020091088050d090c030b200241016a280000200841016a280000470d08200241106a2802002209200841106a280200470d08200241086a280200200841086a28020020091088050d080c020b200241016a280000200841016a280000470d07200241106a2802002209200841106a280200470d07200241086a280200200841086a2802002009108805450d010c070b200241016a200841016a41201088050d060b200441246a21042006417f6a22060d000c060b0b41c2e6c100411c41e0e6c100102d000b200141086a20012f00d90220012d00db024110747210a504200120012903083703d0022001419c016a41013602002001420137028c01200141cc80c200360288012001410436028401200120014180016a360298012001200141d0026a3602800120014188016a4188e7c100103a000b4198e7c100411e41b8e7c100102d000b200141ec026a4100360200200141e8026a41bc8ec200360200200142013702dc02200141c8e7c1003602d80220014180016a200141d0026a200141d8026a10a604000b41e0e7c10041274188e8c100102d000b0240200141106a41306a220220014188016a41306a22084120108805450d0041ec80c200410e10ad012002412010a4042008412010a4040b0240200220084120108805450d004198e8c100412841c0e8c100102d000b0240200141106a41d0006a20014188016a41d0006a41201088050d0002402001280294012208450d00200128028c012102200841246c210803400240024002400240024020022d00000e050400010204030b2002410c6a280200450d03200241086a28020010300c030b2002410c6a280200450d02200241086a28020010300c020b2002410c6a280200450d01200241086a28020010300c010b200241086a280200450d00200241046a28020010300b200241246a21022008415c6a22080d000b0b024020014190016a2802002202450d00200241246c450d00200128028c0110300b0240200128021c2208450d0020012802142102200841246c210803400240024002400240024020022d00000e050400010204030b2002410c6a280200450d03200241086a28020010300c030b2002410c6a280200450d02200241086a28020010300c020b2002410c6a280200450d01200241086a28020010300c010b200241086a280200450d00200241046a28020010300b200241246a21022008415c6a22080d000b0b0240200141186a2802002202450d00200241246c450d00200128021410300b200141f0026a24000f0b41d0e8c100412441f4e8c100102d000b940701057f230041d0026b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241e0016a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae4220024280808080802037020c2002200136021c2002200041bc8ec20020011b3602182002200241186a360208200241e0016a200241086a10a203200241ec016a280200210420022802e801210520022802e401210020022802e001210620024180016a200241f0016a41e0001085051a02402000450d00200241206a20024180016a41e0001085051a0240024020022802082802040d0020024180016a200241206a41e0001085051a0c010b02402004450d00200441246c21012000210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032001415c6a22010d000b0b02402005450d00200541246c450d00200010300b410021000b2000450d00200241e0016a410c6a2004360200200241e0016a41086a2005360200200220003602e401200220063602e001200241f0016a20024180016a41e0001085051a200241e0016a10a60302402004450d00200441246c21012000210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032001415c6a22010d000b0b02402005450d00200541246c450d00200010300b200241d0026a240041003502dc94420f0b2002412c6a410d360200200241f4016a4102360200200242023702e401200241bc81c1003602e001200241043602242002419882c1003602202002200241206a3602f0012002200241e0016a360228200241e0016a41cc81c100103a000b9936020e7f027e230041c0026b2201240020014200370214200141002802e88f422202360210024002400240024002400240024002400240024002402000410c6a28020041246c2203450d002000280204210441002105410021060340024020042d00004101470d00200441106a2802002207417f4c0d0c200441036a2d00002108200441016a2f00002109200441086a280200210a200441046a2d0000210b0240024020070d004101210c0c010b2007102f220c450d090b200c200a2007108505210c200141f8006a41086a220d200141206a41086a290200370300200120012902203703780240024020062005460d002006210a0c010b200541016a220a2005490d042005410174220e200a200e200a4b1b220a4104200a41044b1bad42247e220f422088a745410274210a200fa7210e0240024020050d00200141003602500c010b20014104360258200120023602502001200541246c3602540b200141c0006a200e200a200141d0006a10692001280248210e20012802404101460d052001200128024422023602102005210a200e41246e21050b2002200a41246c6a220a2007360210200a200736020c200a200c360208200a200b360204200a200920084110747222073b0001200a41013a0000200a41036a20074110763a0000200a2001290378370214200a411c6a200d290300370200200641016a21060b200441246a21042003415c6a22030d000b20012005360214200120063602180b200141386a22044200370300200141306a220a4200370300200141206a41086a2207420037030020014200370320200141c0006a41dca4c000410610ab012007200141c0006a41086a220529000037030020012001290040370320200141d0006a41f0c2c100411210ab012004200141d0006a41086a290000370300200a2001290050370300200141203602742001200141206a360270200141c0006a200141206a412041002802d4ad42110400200128024022070d02410221050c030b2001200536021420012005360218102c000b2001200536021420012005360218200e0d030c070b2001280244210c200120052802003602b402200120073602b002200141086a200141b0026a109b01200128020c21060240024020012802080d002001200141b0026a109b0120012802000d0020012802b402220520012802042204490d002004417f4c0d080240024020040d00410121030c010b2004102f2203450d052003410020041087051a20012802b40221050b024020052004490d00200320012802b00220041085051a20012802b40222052004490d042001200520046b3602b402200120012802b00220046a3602b002410121050c020b200310300b20014200370254200141002802dc9442360250200141093602642001200141f0006a3602602001200141d0006a3602bc022001418c016a41013602002001420137027c200141a0e6c1003602782001200141e0006a36028801200141bc026a41d0adc000200141f8006a10321a2001280250200128025810ad0102402001280254450d00200128025010300b410221050b200c450d00200710300b024020054102460d0041012107024020064102490d0041002107024020044105470d004180a4c000200341051088054521070b200741017321070b02402004450d00200310300b4200210f2007450d050b20014184016a41002903c8a34037020020014102360278200141002903c0a34037027c200141386a4200370300200141306a4200370300200141206a41086a2204420037030020014200370320200141c0006a41dca4c000410610ab012004200141c0006a41086a29000037030020012001290040370320200141d0006a41f0c2c100411210ab01200a41086a200141d0006a41086a290000370000200a20012900503700002001410036025820014201370350200141f8006a200141d0006a10c503200141206a412020012802502204200128025841002802fcad4211030002402001280254450d00200410300b2001410336026820014106360274200141dca4c000360270024041002802e4ae424103490d002001412c6a410e360200200141043602242001200141e8006a3602282001200141f0006a3602204100280284ad4221044100280280ad42210741002802e8ae42210520014188016a4202370300200141ac016a418691c100ad4280808080c00a84370200200141a0016a41f290c100ad4280808080c0028437030020014198016a420237030020014180016a411636020020014194016a200141206a360200200141cc90c1003602840120014281808080c0133702b401200141003602a801200141dc90c10036027c20014103360278200741bc8ec200200541024622051b200141f8006a200441d8f5c10020051b2802101105000b200141206a41186a22054200370300200141306a22034200370300200141206a41086a2204420037030020014200370320200141c0006a41dca4c000410610ab012004200141c0006a41086a220629000037030020012001290040370320200141d0006a41e4c3c100411810ab01200a41086a220c200141d0006a41086a2208290000370000200a20012900503700000240200141206a10a104220741ff01714102460d002007410171450d004200210f200141d0006a21040c040b20054200370300200342003703002004420037030020014200370320200141c0006a41dca4c000410610ab012004200629000037030020012001290040370320200141d0006a41e4c3c100411810ab01200c2008290000370000200a2001290050370000200141013a0050200141206a4120200141d0006a410141002802fcad42110300200141c0006a41dca4c000410610ab01200141d0006a4199e0c100410710ab014120102f2204450d01200142203702b402200120043602b002200141b0026a200141c0006a411010b903200141b0026a200141d0006a411010b90320012802b8022204417f4c0d0520012802b00221070240024020040d00410121050c010b2004102f2205450d020b200141f8006a200520072004108505200441002802dcad421104002004ad220f422086200f84210f20012802782207450d0241002802dc944221080340024002402004200129027c2210422088a722034b0d0020012802b00220072004108805450d010b2010a7450d04200710300c040b0240200fa7450d00200510300b2001200336024420012007360240200141d0006a2007200341002802d4ad4211040002400240024020012802502205450d00200128025421060240024002402001280258220c4104490d00200c417c71417c6a0e050001010100010b2001420037022420012008360220200141093602642001200141c0006a3602602001200141206a3602bc022001410136028c012001420137027c200141a0e6c1003602782001200141e0006a36028801200141bc026a41d0adc000200141f8006a10321a2001280220200128022810ad0102402001280224450d00200128022010300b4101210c0c010b200528000021092005280008210d2005280004210b4100210c0b02402006450d00200510300b200c0d0002400240200320046b22044110490d00200441706a21050c010b4100210541002802e4ae42450d00410021054100280284ad4221044100280280ad42210641002802e8ae42210c2001420137038801200141c0f2c100360284012001428180808080103702b401200141dbf2c100ad4280808080e00a843702ac01200141003602a8012001420037039801200141133602800120014101360278200141c8f2c10036027c200141c8f2c100ad4280808080b002843703a001200141bc8ec20036029401200641bc8ec200200c410246220c1b200141f8006a200441d8f5c100200c1b2802101105000b41002104034020052004460d02200441016a22044120470d000b20014100360280012001420137037820012009360220200141f8006a200141206a410410642001200b360220200141f8006a200141206a410410642001200d360220200141f8006a200141206a4104106420014100360220200141f8006a200141206a41041064200720032001280278220420012802800141002802fcad42110300200128027c450d02200410300c020b41002802e4ae42450d014100280284ad4221044100280280ad42210541002802e8ae4221062001420137038801200141a0e0c1003602840120014281808080f0153702b401200141d6e0c100ad4280808080f00c843702ac01200141003602a8012001420037039801200141263602800120014101360278200141b0e0c10036027c200141b0e0c100ad4280808080e004843703a001200141bc8ec20036029401200541bc8ec200200641024622061b200141f8006a200441d8f5c10020061b2802101105000c010b41002802e4ae42450d004100280284ad4221044100280280ad42210541002802e8ae4221062001420137038801200141a8e0c100360284012001428180808080173702b401200141d6e0c100ad4280808080f00c843702ac01200141003602a8012001420037039801200141263602800120014101360278200141b0e0c10036027c200141b0e0c100ad4280808080e004843703a001200141bc8ec20036029401200541bc8ec200200641024622061b200141f8006a200441d8f5c10020061b2802101105000b200141f8006a2007200341002802dcad421104000240200128027822030d00200721052010210f0c040b20012802b802210420072105200321072010210f0c000b0b2004200541f0f5c100104a000b102a000b0240200fa7450d00200510300b024020012802b402450d0020012802b00210300b200141f8006a10d601200129038001210f200141d0006a21040b200141c0006a41dca4c000410610ab01200141d0006a41b08ec100411410ab01200a2001290050370000200a41086a200141d0006a41086a290000370000200141f8006a41086a200141c0006a41086a290000370300200141f8006a41106a200141206a41106a290300370300200141f8006a41186a200141206a41186a29030037030020012001290040370378200142013703204100210720014100360228200120012f01683b0150200141206a200141d0006a41021064200120012d006a3a005041012105200141206a200441011064200120012d006b3a0050200141206a200441011064200141f8006a412020012802202203200128022841002802fcad4211030002402001280224450d00200310300b2001418080043602702001410a3602b402200141fea4c0003602b00241002103024041002802e4ae424103490d002001412c6a410e360200200141043602242001200141f0006a3602282001200141b0026a3602204100280284ad4221074100280280ad42210541002802e8ae42210320014188016a4202370300200141ac016a41b284c100ad4280808080d00384370200200141a0016a41b285c100ad4280808080a0038437030020014198016a420237030020014180016a411636020020014194016a200141206a360200200141d084c100360284012001428180808080043702b401200141003602a801200141dc90c10036027c20014103360278200541bc8ec200200341024622031b200141f8006a200741d8f5c10020031b28021011050020012d0073210720012d0072210520012f017021030b200141c0006a41fea4c000410a10ab01200141d0006a41b08ec100411410ab01200a2001290050370000200a41086a200141d0006a41086a290000370000200141f8006a41086a200141c0006a41086a290000370300200141f8006a41106a200141206a41106a290300370300200141f8006a41186a200141206a41186a29030037030020012001290040370378200142013703204100210620014100360228200120033b0150200141206a200141d0006a41021064200120053a005041012105200141206a200441011064200120073a0050200141206a200441011064200141f8006a412020012802202207200128022841002802fcad4211030002402001280224450d00200710300b2001418080043602702001410d3602b402200141f1a4c0003602b00241002107024041002802e4ae424103490d002001412c6a410e360200200141043602242001200141f0006a3602282001200141b0026a3602204100280284ad4221074100280280ad42210541002802e8ae42210320014188016a4202370300200141ac016a41f684c100ad4280808080c00784370200200141a0016a41e084c100ad4280808080e0028437030020014198016a420237030020014180016a411636020020014194016a200141206a360200200141d084c1003602840120014281808080f0023702b401200141003602a801200141dc90c10036027c20014103360278200541bc8ec200200341024622031b200141f8006a200741d8f5c10020031b28021011050020012d0073210620012d0072210520012f017021070b200141c0006a41f1a4c000410d10ab01200141d0006a41b08ec100411410ab01200a2001290050370000200a41086a200141d0006a41086a290000370000200141f8006a41086a200141c0006a41086a290000370300200141f8006a41106a200141206a41106a290300370300200141f8006a41186a200141206a41186a29030037030020012001290040370378200142013703204100210320014100360228200120073b0150200141206a200141d0006a41021064200120053a005041012107200141206a200441011064200120063a0050200141206a200441011064200141f8006a412020012802202205200128022841002802fcad4211030002402001280224450d00200510300b2001418080043602702001410f3602b402200141e2a4c0003602b00241002105024041002802e4ae424103490d002001412c6a410e360200200141043602242001200141f0006a3602282001200141b0026a3602204100280284ad4221074100280280ad42210541002802e8ae42210320014188016a4202370300200141ac016a41ccb8c000ad4280808080a00584370200200141a0016a4193f4c000ad4280808080f0048437030020014198016a420237030020014180016a411636020020014194016a200141206a360200200141d084c1003602840120014281808080a0083702b401200141003602a801200141dc90c10036027c20014103360278200541bc8ec200200341024622031b200141f8006a200741d8f5c10020031b28021011050020012d0073210320012d0072210720012f017021050b200141c0006a41e2a4c000410f10ab01200141d0006a41b08ec100411410ab01200a2001290050370000200a41086a200141d0006a41086a290000370000200141f8006a41086a200141c0006a41086a290000370300200141f8006a41106a200141206a41106a290300370300200141f8006a41186a200141206a41186a290300370300200120012900403703782001420137032020014100360228200120053b0150200141206a200141d0006a41021064200120073a0050200141206a200441011064200120033a0050200141206a200441011064200141f8006a412020012802202204200128022841002802fcad421103002001280224450d00200410300b2000280200200041106a200141106a410110b703200141386a22054200370300200141206a41106a22034200370300200141206a41086a2204420037030020014200370320200141c0006a41e2a4c000410f10ab012004200141c0006a41086a220629000037030020012001290040370320200141d0006a41ecdac000411410ab01200a41086a220c200141d0006a41086a2208290000370000200a200129005037000002400240200141206a10a104220741ff01714102460d0020074101710d010b20054200370300200342003703002004420037030020014200370320200141c0006a41e2a4c000410f10ab012004200629000037030020012001290040370320200141d0006a419cdfc000411110ab01200c2008290000370000200a2001290050370000200141206a412041002802b4ad421105000b200141386a22074200370300200141306a22054200370300200141206a41086a2204420037030020014200370320200141c0006a41e2a4c000410f10ab012004200141c0006a41086a220329000037030020012001290040370320200141d0006a41acdac000410e10ab01200a41086a2206200141d0006a41086a220c290000370000200a200129005037000041002108200141206a412041002802b4ad4211050020074200370300200542003703002004420037030020014200370320200141c0006a41e2a4c000410f10ab012004200329000037030020012001290040370320200141d0006a41e8dec000411910ab012006200c290000370000200a2001290050370000200141206a412041002802b4ad4211050020074200370300200542003703002004420037030020014200370320200141c0006a41e2a4c000410f10ab012004200329000037030020012001290040370320200141d0006a41e0dfc000410d10ab012006200c290000370000200a2001290050370000200141206a412041002802b4ad4211050020074200370300200542003703002004420037030020014200370320200141c0006a41e2a4c000410f10ab012004200329000037030020012001290040370320200141d0006a41f8e0c000410e10ab012006200c290000370000200a2001290050370000200141206a412041002802b4ad4211050020074200370300200542003703002004420037030020014200370320200141c0006a41e2a4c000410f10ab012004200329000037030020012001290040370320200141d0006a41a4e0c000411410ab012006200c290000370000200a2001290050370000200141206a412041002802b4ad42110500200141f8006a10b001024020012802784101470d0020014194016a28020021080b200141386a4200370300200141306a4200370300200141206a41086a2204420037030020014200370320200141c0006a41e2a4c000410f10ab012004200141c0006a41086a29000037030020012001290040370320200141d0006a41e0e1c000412110ab01200a41086a200141d0006a41086a290000370000200a200129005037000020012008360278200141206a4120200141f8006a410441002802fcad42110300200141f8006a10d601427f200f20012903787c22102010200f541b1080044100410010ae0120012802102107024020012802182204450d00200441246c210a2007210403400240024002400240024020042d00000e050400010204030b2004410c6a280200450d03200441086a28020010300c030b2004410c6a280200450d02200441086a28020010300c020b2004410c6a280200450d01200441086a28020010300c010b200441086a280200450d00200441046a28020010300b200441246a2104200a415c6a220a0d000b0b024020012802142204450d00200441246c450d00200710300b200141c0026a24000f0b102c000bb90702057f017e230041306b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241086a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae4202400240024020010d004108102f2203450d012003410e360204200341b8a5c000360200410c102f2204450d0141002101024020032802002205450d00200420032802043602082004200536020420044100360200410121010b200310302002410036021020024201370308200241edcad18b06360220200241086a200241206a410410642002410c3a0020200241086a200241206a410110644104200241086a10a80341c8a5c0004104200241086a10a903200241043a0020200241086a200241206a410110642001200241086a10a80302402005450d002001410c6c21012004210303400240024020032802004101470d00200341046a2802002105200341086a2802002206200241086a10a803200241086a2005200610640c010b200341046a2802002105200341086a2802002206200241086a10a803200241086a2005200610640b2003410c6a2103200141746a22010d000b0b200228020c2106200228020821052002280210210320041030200341046a2201417f4c0d0202400240024002400240024020010d0020024100360210200242013703080c010b2001102f2204450d06200241003602102002200136020c20022004360208200341c000490d01200341808001490d022003418080808004490d030b200241033a0020200241086a200241206a4101106420022003360220200241086a200241206a410410640c030b200220034102743a0020200241086a200241206a410110640c020b200220034102744101723b0120200241086a200241206a410210640c010b20022003410274410272360220200241086a200241206a410410640b200241086a200520031064200235021021072002280208210302402006450d00200510300b200241306a240020074220862003ad840f0b2002412c6a410d3602002002411c6a41023602002002420237020c200241bc81c10036020820024104360224200241b082c1003602202002200241206a3602182002200241086a360228200241086a41cc81c100103a000b102a000b102c000bab0101017f230041106b220224000240024002400240200041c000490d00200041808001490d012000418080808004490d02200241033a00032001200241036a41011064200220003602042001200241046a410410640c030b200220004102743a00032001200241036a410110640c020b200220004102744101723b010a20012002410a6a410210640c010b2002200041027441027236020c20012002410c6a410410640b200241106a24000be00801057f230041c0006b2203240002402001450d002000200141f0006c6a210403400240024020002802004101470d002000280204210120002802082205200210a80320022001200510640c010b2000280204210120002802082205200210a80320022001200510640b02400240200028020c22014102470d00200341003a00202002200341206a410110640c010b200341013a00202002200341206a41011064024020014101470d000240024020002802104101470d002000280214210120002802182205200210a80320022001200510640c010b2000280214210120002802182205200210a80320022001200510640b0240200028021c4101470d002000280220210120002802282205200210a80320012005200210b6040c020b20002802202101200041246a2802002205200210a80320012005200210b6040c010b200341206a20002802101102000240024020032802204101470d002003280224210120032802282205200210a80320022001200510640c010b2003280224210120032802282205200210a80320022001200510640b0240200328022c4101460d002003280230210120032802342205200210a80320012005200210b6040c010b2003280230210620032802382201200210a80320062001200210b604024020032802382201450d00200141d8006c21074100210503400240200620056a220141346a280200450d002001413c6a280200450d00200141386a28020010300b0240200141c4006a280200450d00200141cc006a28020041ffffffff0171450d00200141c8006a28020010300b2007200541d8006a2205470d000b0b20032802342201450d00200141d8006c450d00200610300b02400240200028022c22014102470d00200341003a00202002200341206a410110640c010b200341013a00202002200341206a41011064024020014101470d002000280230210120002802382205200210a80320012005200210b4040c010b200341186a200028023011020020032802182101200328021c2205200210a80320012005200210b4040b02400240200028023c22014102470d00200341003a00202002200341206a410110640c010b200341013a00202002200341206a41011064024020014101470d002000280240210120002802482205200210a80320012005200210b7040c010b200341106a20002802401102002003280210210120032802142205200210a80320012005200210b7040b02400240200028024c4101470d002000280250210120002802582205200210a80320012005200210b8040c010b200341086a200028025011020020032802082101200328020c2205200210a80320012005200210b8040b200041f0006a210102400240200028025c4101470d002000280260210520002802682206200210a80320052006200210b9040c010b200320002802601102002003280200210520032802042206200210a80320052006200210b9040b200320002d006c3a00202002200341206a410110642001210020012004470d000b0b200341c0006a24000bca0602027f027e230041f0046b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241a8036a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae42200242808080808020370204200220013602142002200041bc8ec20020011b3602102002200241106a360200200241a8036a200210ab0220022802a8032103200241e0016a200241a8036a41047241c4011085051a0240024020034102460d00200241186a410472200241e0016a41c4011085052101200220033602180240024020022802002802040d00200241a8036a200141c4011085051a0c010b02402002419c016a2d00004103460d0020022d00784102470d0020024180016a280200450d00200241fc006a28020010300b200241186a10b202410221030b20034102460d00200241186a200241a8036a41c4011085051a200220033602a803200241a8036a410472200241186a41c4011085051a200241e0016a200241a8036a10ab034101410220022d00e00122034101461b2201102f2200450d01200241003602b003200220013602ac03200220003602a8030240024020034101470d00200241013a0018200241a8036a200241186a4101106420022d00e10120022d00e20120022d00e301200241a8036a10ac030c010b200241003a0018200241a8036a200241186a41011064024020022d00e40122034108460d00200241013a0018200241a8036a200241186a41011064200320022d00e50120022d00e601200241a8036a10d9010c010b200241003a0018200241a8036a200241186a410110640b20023502b003210420023502a8032105200241f0046a240020052004422086840f0b200241ec016a410d3602002002412c6a41023602002002420237021c200241bc81c100360218200241043602e401200241c082c1003602e0012002200241e0016a3602282002200241a8036a3602e801200241186a41cc81c100103a000b102a000bd21702077f037e230041800d6b22022400200220013602a005200241186a200241a0056a10b30320022802182103200228021c210420022802202105200241a0056a200141c8011085051a200241c0026a200241a0056a10b00220022d00c002210120022f00c102210620022d00c3022107200241b4016a200241c0026a410472418c011085051a024002400240024020014101460d00200241286a200241b4016a41046a4188011085051a200241106a41fc8ac20041101085022002280214210120022802102106200220053602c802200220043602c402200220033602c002200241a0056a2001410020061b10820420022802a005220120022802a805200241c0026a109802024020022802a405450d00200110300b02402004450d00200310300b200241d0036a200241286a10e101200241a0056a200241286a4188011085051a0240024020022d008006450d0041800821030c010b20022802a0054101470d03200241c0026a200241a0056a410472108102024020022d00c0024101460d00200241ec026a2802002106200241e8026a2802002103200241e4026a2802002107200241dc026a2802002105200241d8026a28020021080240200241e0026a2802002201450d002001410c6c21042008210103400240200141046a280200450d00200128020010300b2001410c6a2101200441746a22040d000b0b02402005450d002005410c6c450d00200810300b02402006450d002006410c6c21042007210103400240200141046a280200450d00200128020010300b2001410c6a2101200441746a22040d000b0b2003450d042003410c6c450d04200710300c040b20022d00c10222014102460d0320022f01c20241087420017221030b024020022802a0054101460d000240024002400240024002400240200241a8056a280200417f6a0e09090009010209030405060b200241b0056a280200450d08200241ac056a28020010300c080b200241b0056a280200450d07200241ac056a28020010300c070b200241b0056a280200450d06200241ac056a28020010300c060b200241a0056a410c6a28020021050240200241b4056a2802002201450d00200141186c21042005210103400240200141046a280200450d00200128020010300b0240200141106a280200450d002001410c6a28020010300b200141186a2101200441686a22040d000b0b200241b0056a2802002201450d05200141186c450d05200510300c050b200241a0056a410c6a28020021050240200241b4056a2802002201450d002001410c6c21042005210103400240200141046a280200450d00200128020010300b2001410c6a2101200441746a22040d000b0b200241b0056a2802002201450d042001410c6c450d04200510300c040b200241b0056a280200450d03200241ac056a28020010300c030b200241b0056a280200450d02200241ac056a28020010300c020b02400240024020022d00a405417f6a0e0404000104020b0240200241ac056a280200450d00200241a8056a28020010300b200241dc056a28020021050240200241e4056a2802002201450d002001410c6c21042005210103400240200141046a280200450d00200128020010300b2001410c6a2101200441746a22040d000b0b0240200241e0056a2802002201450d002001410c6c450d00200510300b200241e8056a28020021050240200241f0056a2802002201450d0020014104742104200541086a2101034002402001280200450d002001417c6a28020010300b200141106a2101200441706a22040d000b0b0240200241ec056a28020041ffffffff0071450d00200510300b200241f4056a10e3010c030b200241ac056a280200450d02200241a8056a28020010300c020b200241ac056a280200450d01200241a8056a28020010300c010b2000200620074110747222013b0001200041013a0000200041036a20014110763a00002004450d02200310300c020b20024190046a41086a200241b4016a41086a29020037030020024190046a41106a200241b4016a41106a29020037030020024190046a41186a200241b4016a41186a29020037030020024190046a41206a200241b4016a41206a29020037030020024190046a41286a200241b4016a41286a29020037030020024190046a41306a200241b4016a41306a280200360200200220022902b40137039004200041036a20034110763a0000200020033b0001200041013a00000c010b200241c0026a200241a0056a41e0001085051a200241023a00c804200241f8046a200241c8046a10cd03200241c8046a200241c0026a200241f8046a10e20141082101200241b4016a410c6a200241c8046a41086a290300370200200241b4016a41146a200241c8046a41106a290300370200200241b4016a411c6a200241c8046a41186a290300370200200241b4016a41246a200241c8046a41206a290300370200200241b4016a412c6a200241c8046a41286a290300370200200220022903c8043702b80120024190046a41086a200241b4016a41086a29020037030020024190046a41106a200241b4016a41106a29020037030020024190046a41186a200241b4016a41186a29020037030020024190046a41206a200241b4016a41206a29020037030020024190046a41286a200241b4016a41286a29020037030020024190046a41306a200241b4016a41306a280200360200200220022902b40137039004200241e0036a41286a20024190046a412c6a290200370300200241e0036a41206a220420024190046a41246a290200370300200241e0036a41186a20024190046a411c6a290200370300200241e0036a41106a220320024190046a41146a290200370300200241e0036a41086a220520024190046a410c6a29020037030020022002290294043703e00320022903d00322092003290300220a200a2009561b200920052903004201511b210920022903d803210a0240024020022903e0034201510d002009210b200a2109410021030c010b2002200241e0036a41086a36029004024041002802e4ae424105490d00200241c8046a41186a4200370300200241c8046a41106a22044200370300200241c8046a41086a4200370300200242003703c804200241c8046a41dca4c000410610ab01200441acc0c100410610ab01200241086a200241c8046a4120108502200241cc026a410f360200200241103602c4022002200228020c410020022802081b3602b401200220024190046a3602c8022002200241b4016a3602c0024100280284ad4221044100280280ad42210341002802e8ae422105200241a0056a41106a4202370300200241d4056a418691c100ad4280808080c00a84370200200241c8056a41fb92c100ad4280808080c00184370300200241a0056a41206a4202370300200241a0056a41086a410f360200200241bc056a200241c0026a360200200241dc92c1003602ac052002428180808080b9013702dc05200241003602d005200241ec92c1003602a405200241053602a005200341bc8ec200200541024622051b200241a0056a200441d8f5c10020051b28021011050020022802900441186a21040b2004290204210b20042802002104410121030b200241a0056a41286a20022903c002370300200241a0056a41206a200a370300200241a0056a41186a2009370300200241a0056a41106a200b370300200241ab056a200241b4016a41026a2d00003a0000200241a0056a41306a200241c0026a41086a290300370300200241d8056a200241c0026a41106a290300370300200241e0056a200241c0026a41186a290300370300200241e8056a200241c0026a41206a290300370300200220022f00b4013b00a905200220043602ac05200220033a00a805200242003703a005200241a0056a10e601200241fc8ac20041101085022002200228020441016a410120022802001b22043602a00541fc8ac2004110200241a0056a410441002802fcad421103004100200410ae01024020022903e0034201520d0020022903e8034202510d0020022002290081043703a005200220024188046a2800003600a70520024180046a2d000021010b200041003a0000200041046a20013a0000200041056a20022903a0053700002000410c6a20022800a7053600000b200241800d6a24000bb50301017f230041106b2204240002400240200041ff01714101460d00200441003a000f20032004410f6a410110640240024002400240024002400240024002400240200141ff01710e0a000102030405060708090b0b200441003a000f20032004410f6a410110640c0a0b200441013a000f20032004410f6a410110640c090b200441023a000f20032004410f6a410110640c080b200441033a000f20032004410f6a410110640c070b200441043a000f20032004410f6a410110640c060b200441053a000f20032004410f6a410110640c050b200441063a000f20032004410f6a410110640c040b200441073a000f20032004410f6a41011064200420023a000f20032004410f6a410110640c030b200441083a000f20032004410f6a410110640c020b200441093a000f20032004410f6a410110640c010b200441013a000f20032004410f6a41011064024002400240200141ff01710e03000102030b200441003a000f20032004410f6a410110640c020b200441013a000f20032004410f6a410110640c010b200441023a000f20032004410f6a41011064200420023a000f20032004410f6a410110640b200441106a24000be90902067f017e230041a0016b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241106a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae420240024020010d00200241086a41fc8ac2004110108502200228020c21040240200228020822054101470d0041fc8ac200411041002802b4ad421105000b200241286a22034200370300200241106a41106a22014200370300200241106a41086a220642003703002002420037031020024180016a41dca4c000410610ab01200620024180016a41086a2207290000370300200220022900800137031020024180016a41f0bec100410e10ab0120032007290000370300200120022900800137030020022004410020051b36028001200241106a412020024180016a410441002802fcad421103004101200210ae012003420037030020014200370300200642003703002002420037031020024180016a41dca4c000410610ab0120062007290000370300200220022900800137031020024180016a41acc0c100410610ab012003200729000037030020012002290080013703002002200241106a412010850210ae03200241106a10af03200241003602980120024201370390014120102f2203450d012002422037028401200220033602800120024180016a200241206a4120106420024190016a200228028001220320022802880110640240200228028401450d00200310300b200241106a20024190016a10ee014120102f2203450d012002422037028401200220033602800120024180016a200241c0006a4120106420024190016a200228028001220320022802880110640240200228028401450d00200310300b4120102f2203450d012002422037028401200220033602800120024180016a200241e0006a4120106420024190016a200228028001220320022802880110640240200228028401450d00200310300b2002280214210420024190016a2002411c6a280200220710a5010240200741246c2201450d0020042103034020024180016a200310e70120024190016a200228028001220620022802880110640240200228028401450d00200610300b200341246a21032001415c6a22010d000b0b2002350298012108200228029001210602402007450d00200741246c21012004210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032001415c6a22010d000b0b0240200241186a2802002203450d00200341246c450d00200410300b200241a0016a240020084220862006ad840f0b2002418c016a410d360200200241246a410236020020024202370214200241bc81c1003602102002410436028401200241d882c10036028001200220024180016a3602202002200241106a36028801200241106a41cc81c100103a000b102a000b9b1803057f047e117f230041b0026b22002400200041c0016a41186a22014200370300200041c0016a41106a22024200370300200041c0016a41086a22034200370300200042003703c001200041086a41dca4c000410610ab012003200041086a41086a2204290000370300200020002900083703c001200041086a4198bfc100410b10ab012001200429000037030020022000290008370300200041086a200041c0016a10810420002903082105200041086a41106a290300210620002903102107200041086a41186a2903002108200041086a10d60102402000290310427f427f20074200200542015122011b22052006420020011b7c220620062005541b22052008420020011b7c220620062005541b580d0042001080040b200041e0016a41186a22014200370300200041e0016a41106a22094200370300200041e0016a41086a22034200370300200042003703e001200041086a41e2a4c000410f10ab0120032004290000370300200020002900083703e001200041086a41ecdac000411410ab0120012004290000370300200920002900083703004100210a200041e0016a412041002802b4ad42110500200041086a10b0010240024002400240024020002802084101470d00200041086a41186a280200210b200041086a41106a280200210c200041146a280200210d200041c0016a41186a4200370300200041c0016a41106a4200370300200041c0016a41086a22044200370300200042003703c001200041086a41e2a4c000410f10ab012004200041086a41086a2201290000370300200020002900083703c001200041086a41d4dbc000411610ab01200241086a20012900003700002002200029000837000020004120360284022000200041c0016a3602800220004188026a200041c0016a412041002802d4ad4211040002400240200028028802220e0d000c010b200028028c02210f200020004188026a41086a280200220336029c022000200e360298022003411f2003411f491b200e6a41016a210a200041086a410472211041002104417f2102024002400240034020032004460d01201020046a200e20046a22112d00003a00002000200441016a22013602082000200320026a36029c022000201141016a360298022002417f6a21022001210420014120470d000b200041e9016a200041156a2d00003a0000200041f0016a2000411c6a2d00003a0000200041f7016a200041236a2d00003a0000200020002f010c3b01e001200020002d000e3a00e2012000200041136a2f00003b00e70120002000411a6a2f01003b01ee012000200041216a2f00003b00f501200041246a29020021052000411d6a2800002104200041166a28010021022000200028000f3600e301200020023601ea01200020043600f101200020053703f801200320016b22044104490d00200a35000021052000200e20016a220241046a3602980220002004417c6a220136029c0220014104490d00200241046a35000021062000200441786a36029c022000200241086a36029802200041086a20004198026a109e042000280208220a450d00200028020c2112200041086a20004198026a109e04200028020822130d012012450d002012413c6c450d00200a10300b200042003702e4014100210a200041002802dc94423602e001200041093602a402200020004180026a3602a0022000200041e0016a3602ac022000411c6a41013602002000420137020c200041a0e6c1003602082000200041a0026a360218200041ac026a41d0adc000200041086a10321a20002802e00120002802e80110ad01024020002802e401450d0020002802e00110300b0c010b20064220862005842105200028020c21140b200f450d00200e10300b200a450d00200041f8016a22154200370300200041f0016a22164200370300200041e0016a41086a22174200370300200042003703e001200041086a41e2a4c000410f10ab012017200041086a41086a2218290000370300200020002900083703e001200041086a41c0e1c000411510ab01200941086a221920182900003700002009200029000837000041002103200041086a200041e0016a10bd032000280208220441002802e88f4220041b210f0240200029020c420020041b22064220882207a72210410c6c2211450d004100200d2005a76b22042004200d4b1b2102410021034100200c2005422088a76b22042004200c4b1b2104200b20022002200b4b1b2102200f41086a21012007a7410274417c6a41027641016a210b02400340200420012802006b220e20044b0d012002417f6a220420024b0d012001410c6a2101200341016a210320042102200e2104201141746a22110d000b200b21030b200320104b0d020b201542003703002016420037030020174200370300200042003703e001200041086a41e2a4c000410f10ab0120172018290000370300200020002900083703e001200041086a41f8e0c000410e10ab0120192018290000370000200920002900083700002003410c6c41046a2204417f4c0d020240024020040d00410121020c010b2004102f2202450d040b200041003602102000200436020c20002002360208200041086a200310a50102402003450d00200f2003410c6c6a2102200f210403402004280200200441086a280200200041086a10a6012004410c6a22042002470d000b0b200041e0016a412020002802082204200028021041002802fcad421103000240200028020c450d00200410300b200320104b0d040240024020030d00200642ffffffff0f83420c7e2205422088a70d042005a72204417f4c0d040240024020040d00410421110c010b2004102f2211450d060b2006a7210e2004410c6ead21050c010b201020036b2210ad420c7e2205422088a70d032005a72204417f4c0d030240024020040d00410421020c010b2004102f2202450d050b200642ffffffff0f832003ad4220868421052004410c6e210e200f21112002200f2003410c6c6a2010410c6c108505210f0b02402005422088a72204450d0020112004410c6c6a21012011210403402004410c6a21020240200441046a280200450d00200428020010300b2002210420012002470d000b0b02402005a72204450d002004410c6c450d00201110300b200041f8016a4200370300200041f0016a4200370300200041e0016a41086a22044200370300200042003703e001200041086a41e2a4c000410f10ab012004200041086a41086a2202290000370300200020002900083703e001200041086a41c0e1c000411510ab01200941086a2002290000370000200920002900083700002010410c6c41046a2204417f4c0d020240024020040d00410121020c010b2004102f2202450d040b200041003602102000200436020c20002002360208200041086a201010a50102402010450d00200f2010410c6c6a2102200f210403402004280200200441086a280200200041086a10a6012004410c6a22042002470d000b0b200041e0016a412020002802082204200028021041002802fcad421103000240200028020c450d00200410300b02402010450d002010410c6c2102200f210403400240200441046a280200450d00200428020010300b2004410c6a2104200241746a22020d000b0b0240200e450d00200e410c6c450d00200f10300b200041f8016a22014200370300200041f0016a22034200370300200041e0016a41086a22044200370300200042003703e001200041086a41e2a4c000410f10ab012004200041086a41086a2202290000370300200020002900083703e001200041086a41e0e1c000412110ab01200941086a22112002290000370000200920002900083700002000200041e0016a4120108502024020002802004101470d00200041e0016a412041002802b4ad421105000b200142003703002003420037030020044200370300200042003703e001200041086a41e2a4c000410f10ab0120042002290000370300200020002900083703e001200041086a41a4e0c000411410ab0120112002290000370000200920002900083700004104102f2204450d032000420437020c20002004360208200041086a410010a501200041e0016a412020002802082204200028021041002802fcad421103000240200028020c450d00200410300b02402012450d002012413c6c450d00200a10300b2014450d002014413c6c450d00201310300b200041b0026a24000f0b2003201041b4a2c0001042000b102c000b102a000b200320101038000bc629030c7f027e097f230041e0016b22012400200141d8006a41186a22024200370300200141d8006a41106a22034200370300200141d8006a41086a2204420037030020014200370358200141a8016a41dca4c000410610ab012004200141a8016a41086a2205290000370300200120012900a801370358200141a8016a418cc4c100410e10ab0120022005290000370300200320012900a801370300200141d8006a412041002802b4ad4211050020024200370300200342003703002004420037030020014200370358200141a8016a41dca4c000410610ab0120042005290000370300200120012900a801370358200141a8016a41ccbfc100411010ab0120022005290000370300200320012900a801370300200141d8006a412041002802b4ad4211050020024200370300200342003703002004420037030020014200370358200141a8016a41dca4c000410610ab0120042005290000370300200120012900a801370358200141a8016a41acc0c100410610ab0120022005290000370300200320012900a801370300200141106a200141d8006a4120108502200128021421062001280210210720024200370300200342003703002004420037030020014200370358200141a8016a41dca4c000410610ab0120042005290000370300200120012900a801370358200141a8016a41ccc0c100410a10ab0120022005290000370300200320012900a801370300200141a8016a200141d8006a41201082020240024020012d00a8014101460d00200141186a41186a4200370300200141186a41106a4200370300200141186a41086a4200370300200142003703180c010b200141186a41186a200141c1016a290000370300200141186a41106a200141b9016a290000370300200141186a41086a200141b1016a290000370300200120012900a9013703180b200141f0006a22084200370300200141e8006a22094200370300200141d8006a41086a2202420037030020014200370358200141a8016a41dca4c000410610ab012002200141a8016a41086a2204290000370300200120012900a801370358200141a8016a41e0c0c100410610ab01200341086a220a2004290000370000200320012900a8013700002001412036027c2001200141d8006a36027820014180016a200141d8006a412041002802d4ad421104000240024020012802800122050d004100210b0c010b200128028401210c200120014180016a41086a280200360294012001200536029001200141a8016a20014190016a1083020240024020012802a801220b450d0020012902ac01210d0c010b200142003702d4014100210b200141002802dc94423602d0012001410936029c012001200141f8006a360298012001200141d0016a3602a401200141bc016a4101360200200142013702ac01200141a0e6c1003602a801200120014198016a3602b801200141a4016a41d0adc000200141a8016a10321a20012802d00120012802d80110ad01024020012802d401450d0020012802d00110300b0b200c450d00200510300b20084200370300200942003703002002420037030020014200370358200141a8016a41dca4c000410610ab0120022004290000370300200120012900a801370358200141a8016a41f0bec100410e10ab01200a2004290000370000200320012900a801370000200141086a200141d8006a4120108502200128020c210241002103024020012802084101470d00200141d8006a412041002802b4ad42110500410121030b02402002410020031b2209ad420c7e220e422088a70d00200ea72203417f4c0d000240024002400240024020030d004104210c0c010b2003102f220c450d010b0240024002402003410c6e220f20094f0d00200f41017422022009200220094b1b22024104200241044b1bad420c7e220e422088a7454102742102200ea72104024002402003410b4b0d00200141003602a8010c010b200141b0016a41043602002001200c3602a8012001200f410c6c3602ac010b200141d8006a20042002200141a8016a1069200141e0006a2802002103024020012802584101460d00200128025c210c2003410c6e210f0c020b20030d030c060b20090d00410021090c010b41002802dc9442210a200c2103410021020340200141d8006a2002108204200141a8016a20012802582205200128026022081086020240024020012802a80122040d004200210e200a21040c010b2005200841002802b4ad4211050020012902ac01210e0b200241016a21020240200128025c450d00200510300b20032004360200200341046a200e3702002003410c6a210320092002470d000b0b200120093602b0012001200f3602ac012001200c3602a801200141d8006a200141a8016a10830402402006410020071b220541fc01490d00200141a8016a4100200541857e6a2203200320054b1b10fe0320012802a801220320012802b00141002802b4ad4211050020012802ac01450d00200310300b200141d0016a41002802f4ad4211020020012802d8012202450d02200120012802d00122032d00003a00ac01200141013602a80120024101460d02200120032d00013a00ad01200141023602a80120024102460d02200120032d00023a00ae01200141033602a80120024103460d02200120032d00033a00af01200141043602a80120024104460d02200141b0016a20032d00043a0000200141053602a80120024105460d02200141b1016a20032d00053a0000200141063602a80120024106460d02200141b2016a20032d00063a0000200141073602a80120024107460d02200141b3016a20032d00073a0000200141083602a80120024108460d02200141b4016a20032d00083a0000200141093602a80120024109460d02200141b5016a20032d00093a00002001410a3602a8012002410a460d02200141b6016a20032d000a3a00002001410b3602a8012002410b460d02200141b7016a20032d000b3a00002001410c3602a8012002410c460d02200141b8016a20032d000c3a00002001410d3602a8012002410d460d02200141b9016a20032d000d3a00002001410e3602a8012002410e460d02200141ba016a20032d000e3a00002001410f3602a8012002410f460d02200141bb016a20032d000f3a0000200141103602a80120024110460d02200141bc016a20032d00103a0000200141113602a80120024111460d02200141bd016a20032d00113a0000200141123602a80120024112460d02200141be016a20032d00123a0000200141133602a80120024113460d02200141bf016a20032d00133a0000200141143602a80120024114460d02200141c0016a20032d00143a0000200141153602a80120024115460d02200141c1016a20032d00153a0000200141163602a80120024116460d02200141c2016a20032d00163a0000200141173602a80120024117460d02200141c3016a20032d00173a0000200141183602a80120024118460d02200141c4016a20032d00183a0000200141193602a80120024119460d02200141c5016a20032d00193a00002001411a3602a8012002411a460d02200141c6016a20032d001a3a00002001411b3602a8012002411b460d02200141c7016a20032d001b3a00002001411c3602a8012002411c460d02200141c8016a20032d001c3a00002001411d3602a8012002411d460d02200141c9016a20032d001d3a00002001411e3602a8012002411e460d02200141ca016a20032d001e3a00002001411f3602a8012002411f460d02200141cb016a20032d001f3a000020014198016a41026a2202200141b5016a2d00003a000020014190016a41026a2204200141bc016a2d00003a0000200120012f01ac013b018001200120012d00ae013a0082012001200141b3016a2f00003b0198012001200141ba016a2f01003b019001200141c4016a2802002109200141bd016a280000210a200141b6016a280100210c200141203602a801200141a8016a41206a280200210f20012800af012106200141f8006a41026a200141c3016a2d000022083a0000200141c4006a41026a20012d0082013a0000200141c0006a41026a20022d00003a00002001413c6a41026a20042d00003a00002001200141c1016a2f000022023b0178200120012f0180013b0144200120012f0198013b0140200120012f0190013b013c200141386a41026a20083a0000200120023b0138024020012802d401450d00200310300b200141003602d801200142013703d0014120102f2203450d00200142203702ac01200120033602a801200141a8016a200141186a41201064200141d0016a20012802a801220320012802b0011064024020012802ac01450d00200310300b41002802e88f42210320014180016a20012802d001220220012802d80141002802acad42110400024020012802d401450d00200210300b200d4200200b1b210e200b2003200b1b2104024002402001280280012203450d0020014188016a2802002202450d032001280284012108200120032d00003a00ac01200141013602a80120024101460d03200120032d00013a00ad01200141023602a80120024102460d03200120032d00023a00ae01200141033602a80120024103460d03200120032d00033a00af01200141043602a80120024104460d03200141b0016a20032d00043a0000200141053602a80120024105460d03200141b1016a20032d00053a0000200141063602a80120024106460d03200141b2016a20032d00063a0000200141073602a80120024107460d03200141b3016a20032d00073a0000200141083602a80120024108460d03200141b4016a20032d00083a0000200141093602a80120024109460d03200141b5016a20032d00093a00002001410a3602a8012002410a460d03200141b6016a20032d000a3a00002001410b3602a8012002410b460d03200141b7016a20032d000b3a00002001410c3602a8012002410c460d03200141b8016a20032d000c3a00002001410d3602a8012002410d460d03200141b9016a20032d000d3a00002001410e3602a8012002410e460d03200141ba016a20032d000e3a00002001410f3602a8012002410f460d03200141bb016a20032d000f3a0000200141103602a80120024110460d03200141bc016a20032d00103a0000200141113602a80120024111460d03200141bd016a20032d00113a0000200141123602a80120024112460d03200141be016a20032d00123a0000200141133602a80120024113460d03200141bf016a20032d00133a0000200141143602a80120024114460d03200141c0016a20032d00143a0000200141153602a80120024115460d03200141c1016a20032d00153a0000200141163602a80120024116460d03200141c2016a20032d00163a0000200141173602a80120024117460d03200141c3016a20032d00173a0000200141183602a80120024118460d03200141c4016a20032d00183a0000200141193602a80120024119460d03200141c5016a20032d00193a00002001411a3602a8012002411a460d03200141c6016a20032d001a3a00002001411b3602a8012002411b460d03200141c7016a20032d001b3a00002001411c3602a8012002411c460d03200141c8016a20032d001c3a00002001411d3602a8012002411d460d03200141c9016a20032d001d3a00002001411e3602a8012002411e460d03200141ca016a20032d001e3a00002001411f3602a8012002411f460d03200141a8016a41236a20032d001f3a0000200141d0006a41026a2202200141b5016a2d00003a0000200141cc006a41026a220b200141bc016a2d00003a0000200120012f01ac013b0154200120012d00ae013a00562001200141b3016a2f00003b01502001200141ba016a2f01003b014c200141b6016a2801002110200141bd016a2800002111200141c4016a2802002112200141203602a801200141a8016a41206a280200211320012800af012114200141c8006a41026a2207200141c3016a2d00003a00002001200141c1016a2f00003b014820014198016a41026a221520012d00563a0000200120012f01543b019801200120012f01503b019001200120022d00003a009201200141f8006a41026a2216200b2d00003a0000200120012f014c3b0178200141a4016a41026a220b20072d00003a0000200120012f01483b01a40102400240200e422088a72202200ea7460d00200e210d0c010b200241016a22072002490d0620024101742217200720072017491b22074104200741044b1bad42247e220d422088a7454102742107200da721170240024020020d00200141003602a8010c010b200141b0016a4104360200200120043602a8012001200241246c3602ac010b200141d0016a20172007200141a8016a1069200141d8016a280200210220012802d0014101460d0220012802d4012104200e42808080807083200241246ead84210d200e422088a721020b2004200241246c6a220241003a000020022014360204200241036a20152d00003a0000200220012f0198013b00012002410a6a20012d0092013a0000200220012f0190013b01082002201036000b20022011360112200241116a20162d00003a0000200220012f01783b000f200241186a200b2d00003a0000200220012f01a4013b01162002201336001d20022012360019200220012f00a8013b0021200241236a200141a8016a41026a2d00003a0000200d4280808080107c210e2008450d00200310300b20002001290358370050200020012f01443b0030200041376a20012f01403b00002000413e6a20012f013c3b0000200041e8006a200141d8006a41186a290300370000200041e0006a200141d8006a41106a290300370000200041d8006a200141d8006a41086a290300370000200041326a200141c4006a41026a2d00003a0000200041396a200141c0006a41026a2d00003a0000200041c0006a2001413c6a41026a2d00003a0000200041cc006a200f360000200041c8006a2009360000200041c1006a200a3600002000413a6a200c360000200041336a2006360000200041086a200e3702002000200436020420002005360200200041c7006a200141386a41026a2d00003a0000200041c5006a20012f01383b0000200041286a200141186a41186a290300370000200041206a200141186a41106a290300370000200041186a200141186a41086a29030037000020002001290318370010200141e0016a24000f0b2002450d030b102a000b41a493c100412c200141a8016a41b492c10041e093c1001034000b41a493c100412c200141a8016a41b492c10041d093c1001034000b102c000bfa0903027f017e057f230041d0026b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241f8016a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae422002428080808080203702342002200136027c2002200041bc8ec20020011b3602782002200241f8006a360230200241f8016a200241306a10b1030240024020022802f8014101460d00200241a0016a41086a220320024184026a280200360200200220022902fc013703a0012002280230280204450d01200241a0016a10b2030b200241ac016a410d3602002002418c026a4102360200200242023702fc01200241bc81c1003602f801200241043602a401200241f082c1003602a0012002200241a0016a360288022002200241f8016a3602a801200241f8016a41cc81c100103a000b200241086a20032802002203360200200220022903a0012204370300200241206a41086a200336020020022004370320024002400240024020022802242205450d0020022802202106034020052f018a012207410374210841002100417f210141002103024002400340024020082003470d00200721010c020b41ebb7c000200520036a418c016a41081088052209450d02200141016a21012000410c6a2100200341086a21032009417f4a0d000b0b2006450d022006417f6a2106200520014102746a41e4016a28020021050c010b0b200520006a220341046a280200210120022003410c6a28020036023420022001360230200241f8016a200241306a10ec0120022802f8012200450d0120022f01fc012109200241a0016a200241f8016a41067241d2001085051a200241f8016a200241a0016a41d2001085051a200241a0016a200241f8016a41d2001085051a200241f8016a200241a0016a41d2001085051a20024100360230200241f8006a41a0064108200241306a1069200241f8006a41086a2205280200210120022802784101470d0220010d03102c000b200241f8016a200241a0016a41d2001085051a0b41f3b7c00041c60041bcb8c0001050000b200228027c22032000360208200341023a0004200341013602002003410c6a20093b01002003410e6a200241f8016a41d2001085051a20034184016a41033a000020034180016a20024198016a280200360200200341f8006a20024190016a290200370200200341f0006a20024188016a290200370200200341e8006a20052902003702002003200229027837026020034185016a200241306a41c3001085051a200241206a10b20341cc01102f2200450d00200242cc013702a401200220003602a001200241a0016a410110a50120022003360230200241f8016a200241306a10b303200241a0016a20022802f80122002002280280021064024020022802fc01450d00200010300b20022802a001210020023502a8012104024020034184016a2d00004103460d0020032d00604102470d00200341e8006a280200450d00200341e4006a28020010300b200310b202200141c8017021090240200141c801490d0020012009460d00200310300b200241d0026a240020044220862000ad840f0b102a000bb61a070e7f017e027f017e057f017e077f230041e0006b22022400200241086a200110ac0202400240024002400240024002400240024002400240024002402002280208450d00200041013602000c010b200228020c21032001200128020441016a22043602040240200420012802084b0d00410021050240024002400240024020030d0041002106410021070c010b200241d0006a41086a2108200241d9006a2109200241d0006a410a6a210a200241d0006a410b6a210b41002106410021074100210c034020012802002204280204220d450d032004280200220e2d0000210f2004200d417f6a3602042004200e41016a3602002002200f3a005420012802002204280204220d450d032004280200220e2d0000210f2004200d417f6a3602042004200e41016a3602002002200f3a005520012802002204280204220d450d032004280200220e2d0000210f2004200d417f6a3602042004200e41016a3602002002200f3a005620012802002204280204220d450d032004280200220e2d0000210f2004200d417f6a3602042004200e41016a3602002002200f3a005720012802002204280204220d450d032004280200220e2d0000210f2004200d417f6a3602042004200e41016a3602002008200f3a000020012802002204280204220d450d032004280200220e2d0000210f2004200d417f6a3602042004200e41016a3602002009200f3a000020012802002204280204220d450d032004280200220e2d0000210f2004200d417f6a3602042004200e41016a360200200a200f3a000020012802002204280204220d450d03200b2004280200220e2d00003a00002004200d417f6a3602042004200e41016a360200200229025421102002200110ac0220022802000d032001280200220d280204220e20022802042204490d032004417f4c0d070240024020040d004101210f0c010b2004102f220f450d0f200f410020041087051a2001280200220d280204210e0b200e2004490d02200f200d28020020041085052111200d280204220e2004490d11200d200e20046b360204200d200d28020020046a36020020022010370350024020070d0041e401102f2207450d0f41002112200741003b018a01200741003602000b200c41016a210c2004ad2213422086201384211320072114201221150240024003402014418c016a211620142f018a01221741037421184100210e417f210d4100210402400340024020182004470d002017210d0c020b200241d0006a201420046a418c016a4108108805220f450d03200d41016a210d200e410c6a210e200441086a2104200f417f4a0d000b0b02402015450d002015417f6a21152014200d4102746a41e4016a28020021140c010b0b0240024002400240024002402017410a4b0d00200d2017490d012016200d4103746a2010370000201441046a21040c020b410021154104210402400240200d41054f0d00200d210f0c010b410521044105210f02400240200d417b6a0e020201000b200d41796a210f41012115410621040c010b4100210f410121150b41e401102f220e450d15200e41003b018a01200e4100360200200e20142f018a0122172004417f736a220d3b018a01201620044103746a29000021192008201441046a221a2004410c6c6a221841086a28020036020020022018290200370350200d410c4f0d0f2017200441016a22186b200d470d10200e418c016a201620184103746a200d4103741085051a200e41046a201a2018410c6c6a200d410c6c1085051a201420043b018a01200241c0006a41086a221a200828020036020020022002290350370340200e201420151b2204418c016a210d02400240200f41016a221520042f018a0122184d0d00200d200f4103746a2010370000200441046a210d0c010b200d20154103746a200d200f4103746a220d2018200f6b22174103741086051a200d2010370000200441046a220d2015410c6c6a200d200f410c6c6a2017410c6c1086051a0b200d200f410c6c6a220d2013370204200d20113602002004201841016a3b018a01200241306a41086a221b201a2802002204360200200220022903402210370330200241106a41086a2216200436020020022010370310201428020022040d02410021110c030b2016200d41016a220e4103746a2016200d4103746a22042017200d6b220f4103741086051a20042010370000201441046a2204200e410c6c6a2004200d410c6c6a200f410c6c1086051a0b2004200d410c6c6a22042013370204200420113602002014201741016a3b018a01200641016a21060c040b4100211120192110200e211c034020142f0188012114200241206a41086a221d201628020036020020022002290310370320200422152f018a012217410b490d024100211841042104024020144105490d0020142104024002402014417b6a0e020201000b201441796a211441012118410621040c010b4100211441012118410521040b419402102f220e450d13200e41003b018a01200e4100360200200e20152f018a01221e2004417f736a220d3b018a012015418c016a221f20044103746a29000021192008201541046a22202004410c6c6a220f41086a2802003602002002200f290200370350200d410c4f0d0f201e200441016a220f6b200d470d10200e418c016a201f200f4103746a200d4103741085051a200e41046a2020200f410c6c6a200d410c6c1085051a201520043b018a01201a200828020036020020022002290350370340200e2f018a01220d41016a211e200d410c4f0d11201720046b2204201e470d12201141016a2111200e41e4016a2015200f4102746a41e4016a20044102741085051a4100210402400340200e20044102746a41e4016a280200220f20043b018801200f200e3602002004200d4f0d0120042004200d496a2204200d4d0d000b0b201b201a28020036020020022002290340370330200e201520181b220f418c016a21180240201441016a2204200f2f018a01220d4b221e0d00201820044103746a201820144103746a200d20146b4103741086051a0b201820144103746a20103700002008201d28020036020020022002290320370350200f41046a21170240201e0d0020172004410c6c6a20172014410c6c6a200d20146b410c6c1086051a0b200d41016a211820172014410c6c6a22172002290350370200201741086a2008280200360200200f41e4016a21170240201441026a221e200d41026a221d4f0d002017201e4102746a201720044102746a200d20146b4102741086051a0b201720044102746a201c360200200f20183b018a0102402004201d4f0d00200f20144102746a41e8016a210403402004280200220d201441016a22143b018801200d200f360200200441046a210420182014470d000b0b2016201b2802003602002002200229033037031020192110200e211c20152114201528020022040d000b0b2008201628020036020020022002290310370350419402102f2204450d11200420073602e401200441003b018a0120044100360200200741003b0188012007200436020020122011470d1220042f018a01220d410b4f0d13201241016a21122004200d41016a220f3b018a012004200d4103746a418c016a20193700002004200d410c6c6a220d410c6a2008280200360200200d41046a2002290350370200200441e4016a200f4102746a200e360200200e200f3b018801200e200436020020042107200641016a21060c020b2015418c016a21040240201720144d220e0d00200420144103746a220d41086a200d201720146b4103741086051a0b200420144103746a20103700002008201628020036020020022002290310370350201441016a2104201541046a210d0240200e0d00200d2004410c6c6a200d2014410c6c6a201720146b410c6c1086051a0b201741016a210f200d2014410c6c6a220d2002290350370200200d41086a2008280200360200201541e4016a210d201741026a21180240200e0d002014410274200d6a41086a200d20044102746a201720146b4102741086051a0b2015200f3b018a01200d20044102746a201c3602000240200420184f0d0020152004417f6a22044102746a41e8016a210d0340200d280200220e200441016a22043b018801200e2015360200200d41046a210d200f2004470d000b0b200641016a21060c010b2014200e6a220441086a220d280200210e200d2013370200200441046a220d2802002104200d20113602002004450d00200e450d00200410300b200c2003470d000b0b200020123602042000410c6a2006360200200041086a20073602002002200636025820022007360254200220123602500c020b200f10300b200220063602582002200736025420022012360250200241d0006a10b203410121050b2000200536020020012001280204417f6a3602040c010b200041013602000b200241e0006a24000f0b102c000b200d410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b200d410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b201e410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b102a000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b2004200e41f0f5c100104a000b9a0303067f017e017f200028020421012000410036020402402001450d00024020002802002202450d00034020012802e40121012002417f6a22020d000b0b024020002802082203450d004100210003400240024002400240200020012f018a01490d0041002100034041002102024020012802002204450d00200041016a210520012f0188012106200421020b024041940241e40120001b450d00200110300b024020020d00410021010c050b2005210020022101200620022f018a014f0d000b20022006410c6c6a41046a2104024020050d00200221010c020b200641027420026a41e8016a280200210102402005417f6a2200450d00034020012802e40121012000417f6a22000d000b0b410021000c020b20012000410c6c6a41046a210420002106200121020b200641016a21000b20022006410c6c6a41086a2902002107200428020021080b2008450d022003417f6a210302402007a7450d00200810300b20030d000b0b41002102034020012802002100024041940241e40120021b450d00200110300b2002417f6a21022000210120000d000b0b0b8b0d01077f230041c0006b22022400024041ca01102f2203450d0020002003360200200041046a220441ca01360200200341003b000041022105200041086a410236020020042802002104024002400240200128020022034184016a2d00004103470d00410221010240024020044102470d00200242828080801037021420022000280200360210200241306a41084101200241106a1069200241306a41086a280200210120022802304101460d0120002002280234360200200041046a2001360200200041086a28020021010b200028020020016a41043a0000200041086a2201200128020041016a3602000c020b2001450d020c030b0240024002400240024002400240024020044102470d00200242828080801037021420022000280200360210200241306a41084101200241106a1069200241306a41086a280200210120022802304101460d0120002002280234360200200041046a2001360200200041086a28020021050b200028020020056a4184013a0000200041086a2201200128020041016a36020020032d00600e050102030405060b20010d080c070b200241003a00102000200241106a410110642000200341e1006a412010640c040b200241013a00102000200241106a410110640c030b200241023a00102000200241106a41011064200341e4006a280200200341ec006a280200200010a6010c020b200241033a00102000200241106a410110642000200341e1006a412010640c010b200241043a00102000200241106a410110642000200341e1006a411410640b02400240024020032d0084010e03000102030b200241003a00102000200241106a41011064200020034185016a41c00010640c020b200241013a00102000200241106a41011064200020034185016a41c00010640c010b200241023a00102000200241106a41011064200020034185016a41c10010640b0240024020032802004101460d00200241003a00102000200241106a41011064200341086a200010b1020c010b200241013a00102000200241106a41011064200341046a2000109b020b200041086a28020021034104102f2201450d01200242043702042002200136020002400240024002402003417e6a220341c000490d00200341808001490d012003418080808004490d02200241033a00102002200241106a41011064200220033602102002200241106a410410640c030b200220034102743a00102002200241106a410110640c020b200220034102744101723b01102002200241106a410210640c010b200220034102744102723602102002200241106a410410640b0240200041086a2206280200220141014d0d00200228020821052002280200210420022000360220410021032006410036020020022004360224200241286a200420056a2207360200200241023602102002411c6a2000280200220641026a220836020020022001417e6a220136021420022008360218200241246a21080240024020010d002000200810c1030c010b034020052003460d012002200420036a220141016a360224200620036a20012d00003a00002000200028020841016a360208200341016a22034102470d000b0240024020052003470d00200420036a21010c010b200241106a200520036b10b302024020022802202205280208220320022802102200470d0020022802282107200228022421010c010b200020036b2106200528020020036a21002002280224210320022802282107034020072003460d022002200341016a2201360224200020032d00003a00002005200528020841016a360208200041016a2100200121032006417f6a22060d000b0b200720016b2203417f4c0d020240024020030d00410121000c010b2003102f2200450d040b200241003602382002200336023420022000360230200241306a200810c1032002280234210720022802302108024020022802382203450d00200241106a200310b30220022802202205280208220020022802102201460d00200120006b2106200528020020006a21002008210103402003450d01200020012d00003a00002005200528020841016a3602082003417f6a2103200141016a2101200041016a21002006417f6a22060d000b0b2007450d00200810300b024020022802142203450d000240200228021022052002280220220641086a22012802002200460d002006280200220620006a200620056a20031086051a0b2001200320006a3602000b02402002280204450d00200410300b200241c0006a24000f0b4102200141c4e3c1001042000b102c000b102a000bc80f02087f027e230041e0036b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241186a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae42200242808080808020370204200220013602142002200041bc8ec20020011b3602102002200241106a360200200241f0026a200210a203024020022802f4022201450d00200241fc026a280200210420022802f802210520022802f002210320024190026a20024180036a41e0001085051a200241f0026a200210a303024020022802f00222060d0002402004450d00200441246c21002001210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032000415c6a22000d000b0b2005450d01200541246c450d01200110300c010b200241f0026a41086a280200210720022802f4022108200241b0016a20024190026a41e0001085051a200241f0026a200210b103024020022802f0024101470d0002402004450d00200441246c21002001210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032000415c6a22000d000b0b02402005450d00200541246c450d00200110300b02402007450d00200741c8016c21012006210003400240200022034184016a2d00004103460d00200341e0006a2d00004102470d00200341e8006a280200450d00200341e4006a28020010300b200341c8016a2100200310b202200141b87e6a22010d000b0b2008450d01200841c8016c450d01200610300c010b200241a0016a41086a2200200241f0026a410c6a280200360200200220022902f4023703a001200241286a200241b0016a41e0001085051a20024190016a20073602002002418c016a2008360200200241186a410c6a2004360200200241186a41086a20053602002002419c016a20002802003602002002200636028801200220022903a001370294012002200136021c2002200336021820024194016a21090240024020022802002802040d0020024190026a41086a200941086a28020036020020022009290200370390020c010b02402004450d00200441246c210303400240024002400240024020012d00000e050400010204030b2001410c6a280200450d03200141086a28020010300c030b2001410c6a280200450d02200141086a28020010300c020b2001410c6a280200450d01200141086a28020010300c010b200141086a280200450d00200141046a28020010300b200141246a21012003415c6a22030d000b0b02402005450d00200541246c450d00200228021c10300b02402007450d00200741c8016c21012006210003400240200022034184016a2d00004103460d00200341e0006a2d00004102470d00200341e8006a280200450d00200341e4006a28020010300b200341c8016a2100200310b202200141b87e6a22010d000b0b02402008450d00200841c8016c450d00200610300b200910b203410021010b2001450d00200241b0016a41086a20024190026a41086a28020022033602002002200229039002220a3703b001200241f0026a41086a2003360200200241013b01242002420037021c2002200a3703f002200241f0026a10b20302402004450d00200441246c21002001210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032000415c6a22000d000b0b02402005450d00200541246c450d00200110300b02402007450d00200741c8016c21012006210003400240200022034184016a2d00004103460d00200341e0006a2d00004102470d00200341e8006a280200450d00200341e4006a28020010300b200341c8016a2100200310b202200141b87e6a22010d000b0b02402008450d00200841c8016c450d00200610300b200241003602f802200242013703f002200241013a009002200241f0026a20024190026a41011064200241003a009002200241f0026a20024190026a41011064200241f0026a410010a50120023502f802210a20023502f002210b200241186a10b203200241e0036a2400200b200a422086840f0b200241fc026a410d3602002002412c6a41023602002002420237021c200241bc81c100360218200241043602f4022002418c83c1003602f0022002200241f0026a3602282002200241186a3602f802200241186a41cc81c100103a000bab0f05057f027e057f017e017f23004190086b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241d0016a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b41002104410020033602e4ae4220024280808080802037020c20022001360284072002200041bc8ec20020011b220336028007200220024180076a360208024002400240024002402001450d0020022001417f6a360284072002200341016a3602800702400240024020032d00000e03020001030b410121040c010b410221040b200241a0036a200241086a10ab0220022802a00322014102460d00200241dc016a200241a0036a41047241c4011085052103200220013602d801200220043a00d0010240024020022802082802040d00200241a0036a200341c4011085051a0c010b200241d8016a21010240200241dc026a2d00004103460d00200241b8026a2d00004102470d00200241c0026a280200450d00200241bc026a28020010300b200110b202410221010b20014102460d00200241086a200241a0036a41c4011085051a200220013602a003200241a0036a410472200241086a41c4011085051a2002200241a0036a36028007200241d0016a20024180076a10b303024020022802d401450d0020022802d00110300b200241d0016a200241a0036a41c8011085051a20024180076a200241d0016a10b00220022d008007210120022f008107210320022d0083072100200241f0056a20024180076a410472418c011085051a41012104024020014101460d0041042103200241e8046a200241f0056a41046a4188011085051a20024180076a200241e8046a10e1010240024020022d00c805450d00410021050c010b410121010240024020022802e8044101460d0020024181023b00d1010c010b200241d0016a200241e8046a41047210810220022d00d00121010b410121040240200141ff01714101460d0020024180026a2d00002104200241fc016a2802002100200241f8016a2802002101200241f4016a2802002106200241ec016a2802002103200241e8016a2802002105200241d0016a41106a2903002107200241d0016a41086a29030021084100210941002802e88f42220a210b4100210c0240024002400240200241f0016a280200220d450d00200241003602d001200241f0056a200d4104200d41044b1bad420c7e220ea7200e422088a745410274200241d0016a1069200241f8056a280200210f20022802f0054101460d0120022802f405210b200f410c6e210c0b200b2005200d410c6c1085051a20000d010c070b200f450d010c090b200241003602d001200241f0056a20004104200041044b1bad420c7e220ea7200e422088a745410274200241d0016a1069200241f8056a280200210f024020022802f0054101460d0020022802f405210a200f410c6e21090c060b200f0d080b102c000b20022f00d10120022d00d30141107472220541ffffff077122014110762106200141087621030b0c030b2003200041107472220541ffffff07712201411076210620014108762103410121040c030b200241146a410d360200200241e4016a4102360200200242023702d401200241bc81c1003602d0012002410436020c200241a483c1003602082002200241086a3602e0012002200241d0016a360210200241d0016a41cc81c100103a000b200a20062000410c6c1085051a200441ff0171210f4100210402402003450d002003410c6c450d00200510300b200f410047210f02402001450d002001410c6c450d00200610300c010b0b200241e8046a10b2020b4101102f2201450d00200242013702d401200220013602d001024002402004450d00200241013a00a003200241d0016a200241a0036a41011064200520032006200241d0016a10ac0320022802d801210520022802d00121060c010b200241003a00a003200241d0016a200241a0036a41011064200220083703a003200241d0016a200241a0036a41081064200241d0016a200d10a5010240200d450d00200b200d410c6c6a2103200b210103402001280200200141086a280200200241d0016a10a6012001410c6a22012003470d000b0b200241d0016a200010a50102402000450d00200a2000410c6c6a2103200a210103402001280200200141086a280200200241d0016a10a6012001410c6a22012003470d000b0b200220073703a003200241d0016a200241a0036a410810642002200f3a00a003200241d0016a200241a0036a4101106420022802d001210620022802d801210520040d000240200d450d00200d410c6c2103200b210103400240200141046a280200450d00200128020010300b2001410c6a2101200341746a22030d000b0b0240200c450d00200c410c6c450d00200b10300b02402000450d002000410c6c2103200a210103400240200141046a280200450d00200128020010300b2001410c6a2101200341746a22030d000b0b2009450d002009410c6c450d00200a10300b20024190086a24002005ad4220862006ad840f0b102a000bf11203067f017e0b7f23004190036b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241c0016a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae4220024280808080802037028403200220013602e4022002200041bc8ec20020011b3602e0022002200241e0026a36028003200241c0016a20024180036a10a203200241cc016a280200210420022802c801210520022802c401210620022802c0012107200241e0006a200241d0016a41e0001085051a02400240024002402006450d00024002402002200241e0006a41e0001085052201280280032802040d00200141e0006a200141e0001085051a0c010b02402004450d00200441246c21002006210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032000415c6a22000d000b0b02402005450d00200541246c450d00200610300b410021060b2006450d00200141cc016a2004360200200141c8016a2005360200200120063602c401200120073602c001200141d0016a200141e0006a41e0001085051a2004ad42247e2208422088a70d012008a72209417f4c0d010240024020090d004104210a0c010b2009102f220a450d030b2001200a3602b0022001200941246e220b3602b402024020094124490d0041002100200b210c034020092000460d01200c450d050240024002400240024002400240200620006a22032d00000e06010203040500010b2003410c6a280200220d417f4c0d09200341046a280200210302400240200d0d004101210e0c010b200d102f220e450d0b0b200e2003200d108505410876210f41052110200d21110c050b2001200341146a2900003703c0022001200341196a2900003700c502200341016a2f0000200341036a2d0000411074722112200341046a280000220e410876210f200341106a28000021022003410c6a280000210d200341086a2800002111410021100c040b200341106a2802002202417f4c0d07200341036a2d00002112200341016a2f0000210d200341086a2802002113200341046a2d0000210e410121104101211102402002450d002002102f2211450d090b200d20124110747221122011201320021085051a2002210d0c030b200341106a2802002202417f4c0d06200341036a2d00002112200341016a2f0000210d200341086a2802002110200341046a2d0000210e0240024020020d00410121110c010b2002102f2211450d080b200d20124110747221122011201020021085051a410221102002210d0c020b200341106a2802002202417f4c0d05200341036a2d00002112200341016a2f0000210d200341086a2802002110200341046a2d0000210e0240024020020d00410121110c010b2002102f2211450d070b200d20124110747221122011201020021085051a410321102002210d0c010b41042110200341046a280200210e2003410c6a280200210d200341086a28020021114100210f0b200a20006a220320103a0000200341036a20124110763a0000200341016a20123b0000200341106a20023602002003410c6a200d360200200341086a2011360200200341046a200f410874200e41ff017172360200200341146a20012903c0023702002003411c6a200141c0026a41086a290300370200200041246a2100200c417f6a220c0d000b0b200120043602b8022007200141c0016a41106a200141b0026a410010b7032001200141c0016a10ed01200141e0006a41186a200141186a290300370300200141e0006a41106a200141106a290300370300200141e0006a41086a200141086a29030037030020012001290300370360200141e0026a41dca4c000410610ab01200141c0026a4190e0c100410910ab01200120073602fc022001200141fc026a4104108b023703d0022001418c036a200141fc026a41046a3602002001200141d0026a41086a360284032001200141fc026a360288032001200141d0026a36028003200141f0026a20014180036a10b80320012802f802220041206a2203417f4c0d010240024020030d00410121020c010b2003102f2202450d030b200141003602d802200120033602d402200120023602d002200141d0026a200141e0026a411010b903200141d0026a200141c0026a411010b903200141d0026a20012802f0022203200010b903024020012802f402450d00200310300b20012802d002210320012802d80221004120102f2202450d022001422037028403200120023602800320014180036a200141e0006a4120106420032000200128028003220220012802880341002802fcad421103000240200128028403450d00200210300b024020012802d402450d00200310300b02402004450d00200441246c2100200a210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032000415c6a22000d000b0b024020094124490d00200b41246c450d00200a10300b02402004450d00200441246c21002006210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032000415c6a22000d000b0b02402005450d00200541246c450d00200610300b20014190036a240041003502dc94420f0b2002410c6a410d360200200241d4016a4102360200200242023702c401200241bc81c1003602c00120024104360204200241c083c100360200200220023602d0012002200241c0016a360208200241c0016a41cc81c100103a000b102c000b102a000b200b200b41a0e4c1001033000b9e0a01057f230041c0006b220424004102200410ae012004410036020041fc8ac20041102004410441002802fcad42110300200441186a22054200370300200441106a22064200370300200441086a2207420037030020044200370300200441206a41dca4c000410610ab012007200441206a41086a220829000037030020042004290020370300200441206a41acc0c100410610ab0120052008290000370300200620042900203703002004200036022020044120200441206a410441002802fcad4211030020054200370300200642003703002007420037030020044200370300200441206a41dca4c000410610ab012007200829000037030020042004290020370300200441206a41e0c0c100410610ab012005200829000037030020062004290020370300024002402002280208220841246c41046a2207417f4c0d00200228020021050240024020070d00410121020c010b2007102f2202450d020b200441003602382004200736023420042002360230200441306a200810a5010240200841246c2207450d000340200441206a200510e701200441306a200428022022082004280228106402402004280224450d00200810300b200541246a21052007415c6a22070d000b0b2004412020042802302205200428023841002802fcad4211030002402004280234450d00200510300b200441186a4200370300200441106a4200370300200441086a2205420037030020044200370300200441206a41dca4c000410610ab012005200441206a41086a220729000037030020042004290020370300200441206a41ccc0c100410a10ab01200641086a2007290000370000200620042900203700004120102f2205450d012004422037022420042005360220200441206a2001412010642004412020042802202205200428022841002802fcad4211030002402004280224450d00200510300b200441206a2000417f6a10fe0320042802282107200428022021054120102f2208450d01200442203702042004200836020020042001412010642005200720042802002208200428020841002802fcad4211030002402004280204450d00200810300b02402004280224450d00200510300b200441186a22084200370300200441106a22024200370300200441086a2205420037030020044200370300200441206a41dca4c000410610ab012005200441206a41086a220729000037030020042004290020370300200441206a4198bfc100410b10ab01200641086a22002007290000370000200620042900203700002004412041002802b4ad4211050002402003450d0020084200370300200242003703002005420037030020044200370300200441206a41dca4c000410610ab012005200729000037030020042004290020370300200441206a418cc1c100410610ab0120002007290000370000200620042900203700002004412041002802b4ad4211050020084200370300200242003703002005420037030020044200370300200441206a41dca4c000410610ab012005200729000037030020042004290020370300200441206a41d0c1c100410a10ab0120002007290000370000200620042900203700002004412041002802b4ad4211050020084200370300200242003703002005420037030020044200370300200441206a41dca4c000410610ab012005200729000037030020042004290020370300200441206a41f8dfc100410b10ab0120002007290000370000200620042900203700002004412041002802bcad421105000b200441c0006a24000f0b102c000b102a000beb07010c7f230041206b220224002001410c6a2802002103200128020821042001280204210502400240024002400240024002400240024002400240200128020022060d0020040d012000420137020041002107200041086a220841003602000c060b200520066b2101024020040d00200121090c020b2001200320046b6a220920014f0d01200041046a420037020041002109200041002802dc9442220a360200200041086a21080c020b200320046b21090b2009417f4c0d070240024020090d004101210a410021090c010b2009102f220a450d070b2000200a360200200041086a22084100360200200041046a2009360200024020060d0020040d02410021070c040b200520066b2107024020040d00200721010c030b2007200320046b6a220120074f0d020b0240024020052006460d00200641016a210b0c010b20032004460d044100210b20042106200441016a21040b200041046a210c4100210d034020042107200b210120062d00002104024002400240200d2009470d0002400240024020010d0020070d01410021060c020b200520016b21062007450d01417f2006200320076b6a220b200b2006491b21060c010b200320076b21060b200920096b417f200641016a220b200b2006491b22064f0d00200920066a22062009490d0a2009410174220b2006200b20064b1b22064108200641084b1b21060240024020090d00200241003602100c010b20024101360218200220093602142002200a3602100b200220064101200241106a10692002280208210920022802004101460d0120002002280204220a360200200c20093602000b200a200d6a20043a00002008200d41016a220d3602002001450d0120052001460d01200141016a210b20072104200121060c020b20090d070c080b2007450d0420032007460d04200741016a21044100210b200721060c000b0b200320046b21010b410021070240200920014f0d00200941017422072001200720014b1b22014108200141084b1b21010240024020090d00200241003602100c010b200241106a41086a4101360200200220093602142002200a3602100b200220014101200241106a1069200241086a280200210120022802004101460d0320002002280204220a360200200041046a2001360200200041086a28020021070b200a20076a210102402006450d0020052006460d002005200720066b6a21070340200120062d00003a0000200141016a21012005200641016a2206470d000b0b2004450d0020032004460d00200421060340200120062d00003a0000200141016a21012003200641016a2206470d000b2003200720046b6a21070b200820073602000b200241206a24000f0b2001450d010b102a000b102c000b880201047f230041206b2203240002400240200041046a2802002204200041086a28020022056b2002490d00200028020021040c010b0240200520026a22062005490d00200441017422052006200520064b1b22054108200541084b1b21050240024020040d00200341003602100c010b200341106a41086a410136020020032004360214200320002802003602100b200320054101200341106a1069200341086a2802002105024020032802004101460d00200020032802042204360200200041046a2005360200200041086a28020021050c020b2005450d00102a000b102c000b200420056a200120021085051a200041086a2200200028020020026a360200200341206a24000bea0402037f027e230041306b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241086a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae4220024280808080802037020c200220013602242002200041bc8ec20020011b3602202002200241206a3602082002200241086a10ac020240024002400240024020022802000d002002280224220120022802042203490d002003417f4c0d020240024020030d00410121000c010b2003102f2200450d042000410020031087051a200228022421010b024020012003490d002000200228022020031085052104200228022422012003490d052002200120036b22013602242002200228022020036a3602202001450d022003450d010b200010300b2002412c6a410d3602002002411c6a41023602002002420237020c200241bc81c10036020820024104360224200241d883c1003602202002200241206a3602182002200241086a360228200241086a41cc81c100103a000b02402003450d00200410300b4105102f2203450d012002420537020c20022003360208200241013a0020200241086a200241206a41011064200241086a410010a5012002350210210520023502082106200241306a240020062005422086840f0b102c000b102a000b2003200141f0f5c100104a000ba50502027f027e230041c0006b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241106a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae422002428080808080203702142002200136023c2002200041bc8ec20020011b22033602382002200241386a360210024002400240024002402001450d0020022001417f6a220136023c2002200341016a360238024002400240024020032d00000e020100040b200241086a200241106a10ac0220022802080d03200228023c2200200228020c2201490d032001417f4c0d040240024020010d00410121030c010b2001102f2203450d062003410020011087051a200228023c21000b20002001490d022003200228023820011085051a200228023c22002001490d062002200020016b220036023c2002200228023820016a36023820000d012001ad220442208620048421040c070b20010d02410021030c060b2001450d010b200310300b200241346a410d360200200241246a410236020020024202370214200241bc81c1003602102002410436022c200241f483c1003602282002200241286a3602202002200241106a360230200241106a41cc81c100103a000b102c000b102a000b2001200041f0f5c100104a000b2002420037022c200241002802dc944236022802402003450d002004a7450d00200310300b200241106a200241286a1087022002350218210420023502102105200241c0006a240020052004422086840b920b05077f017e037f017e027f230041d0006b22022400410041002802e8ae422203410120031b3602e8ae4202400240024020030e020001020b410041b480c200360284ad42410041b480c200360280ad42410041023602e8ae420c010b034041002802e8ae424101460d000b0b41052103024002400240024002400240024010000e06010203040506000b41acf9c1004134200241206a41e0f9c10041f0f9c1001034000b410021030c040b410121030c030b410221030c020b410321030c010b410421030b410020033602e4ae42024020010d00200241386a22034200370300200241306a22014200370300200241206a41086a2204420037030020024200370320200241c0006a41e2a4c000410f10ab012004200241c0006a41086a220529000037030020022002290040370320200241c0006a41e0dfc000410d10ab012003200529000037030020012002290040370300200241086a200241206a4120108502200228020c210620022802082107200241106a10aa0120034200370300200142003703002004420037030020024200370320200241c0006a41e2a4c000410f10ab012004200529000037030020022002290040370320200241c0006a41f8e0c000410e10ab012003200529000037030020012002290040370300200241c0006a200241206a10bd03200228024021082002290244210920034200370300200142003703002004420037030020024200370320200241c0006a41e2a4c000410f10ab012004200529000037030020022002290040370320200241c0006a41e8dec000411910ab0120032005290000370300200120022900403703002002200241206a41201085022002280204210a2002280200210b20034200370300200142003703002004420037030020024200370320200241c0006a41e2a4c000410f10ab012004200529000037030020022002290040370320200241c0006a419cdfc000411110ab012003200529000037030020012002290040370300200241c0006a200241206a41201086022002280240210c2002290244210d2002280210210e2002280214210f200228021821042002420137032020024100360228200241206a2009420020081b2209422088a7220510a501200841002802e88f4220081b210802402005450d0020082005410c6c6a21012008210303402003280200200341086a280200200241206a10a6012003410c6a22032001470d000b0b200241206a200410a50102402004450d00200e20044104746a2101200e2103034020022003280200360240200241206a200241c0006a41041064200341046a2802002003410c6a280200200241206a10a601200341106a22032001470d000b0b200a4100200b1b21032006410020071b210102400240200c0d00200241003a0040200241206a200241c0006a410110640c010b200241013a0040200241206a200241c0006a41011064200c200d422088a7200241206a10a6010b2009a7210620022003360240200241206a200241c0006a4104106420022001360240200241206a200241c0006a41041064200228022021072002350228210902402005450d002005410c6c21012008210303400240200341046a280200450d00200328020010300b2003410c6a2103200141746a22010d000b0b02402006450d002006410c6c450d00200810300b02402004450d0020044104742101200e41086a2103034002402003280200450d002003417c6a28020010300b200341106a2103200141706a22010d000b0b0240200f41ffffffff0071450d00200e10300b0240200c450d00200da7450d00200c10300b200241d0006a240020094220862007ad840f0b200241cc006a410d360200200241346a410236020020024202370224200241bc81c100360220200241043602442002419484c1003602402002200241c0006a3602302002200241206a360248200241206a41cc81c100103a000bc00201027f230041e0006b220224002002412036020c20022001360208200241106a2001412041002802d4ad4211040002400240200228021022010d00200041003602000c010b200228021421032002200241106a41086a28020036022420022001360220200241c8006a200241206a10eb01024002402002280248450d0020002002290348370200200041086a200241c8006a41086a2802003602000c010b2002420037022c200241002802dc94423602282002410936023c2002200241086a3602382002200241286a360244200241dc006a41013602002002420137024c200241a0e6c1003602482002200241386a360258200241c4006a41d0adc000200241c8006a10321a2002280228200228023010ad010240200228022c450d00200228022810300b200041003602000b2003450d00200110300b200241e0006a24000bfa0101077f230041d0076b22022400200128020421032001280200210402400240200128020822052001410c6a2802002206470d00200421070c010b2004210702400340200522082d0000410b460d01200241e8036a200841e8031085051a2002200241e8036a10ce022007200241e80310850541e8036a21072006200841e8036a2205470d000b0b200841e8036a21050b024020062005460d00034020051096012006200541e8036a2205470d000b0b2001410036020420002003360204200020043602002001410c6a41002802fce441220536020020012005360208200120053602002000200720046b41e8036d360208200241d0076a24000b6c01017f230041206b22022400200241d086c10036020420022000360200200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241fcefc100200241046a41fcefc100200241086a41d886c100104b000b6c01017f230041206b22022400200241b887c10036020420022000360200200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241ecefc100200241046a41ecefc100200241086a41c887c100104b000bed0201067f230041206b2202240002400240200041046a2802002203200041086a28020022046b200141046a2802002205200128020022066b2207490d00200028020021030c010b0240200420076a22062004490d00200341017422042006200420064b1b22044108200441084b1b21040240024020030d00200241003602100c010b200241106a41086a410136020020022003360214200220002802003602100b200220044101200241106a1069200241086a2802002104024020022802004101460d00200020022802042203360200200041046a2004360200200041086a2802002104200141046a2802002105200128020021060c020b2004450d00102a000b102c000b024020062005460d002001200641016a360200200141046a210502400340200320046a20062d00003a0000200128020022062005280200460d01200441016a21042001200641016a3602000c000b0b200441016a21040b200041086a2004360200200241206a24000bb707030c7f057e037f230041a0016b22022400410041003502e0ac42200241206aad7c42adfed5e4d485fda8d8007e421f883e02e0ac422001280220220341016a2104200141246a280200220541046a2106200141346a21072001412c6a21082005280200417f7321094100210a02402003450d0020052004ad42307ea76b210a0b200520046a21042007280200210b200828020021082001280230210c2009418081828478712101200241206a41086a21070340024002400240024020010d000340024020062004490d00410021010c040b200541c07e6a210520062802002101200641046a220321062001418081828478712201418081828478460d000b2001418081828478732209417f6a200971210d200321060c010b2001417f6a200171210d200121090b200d21012008417f6a2108200541002009684103766b41306c6a220341706a280200220d0d010b02402008450d0003400240024020010d000340200620044f0d04200541c07e6a210520062802002101200641046a220321062001418081828478712201418081828478460d000b2001418081828478732201417f6a2001712107200321060c010b2001417f6a20017121070b2001682103200721012005410020034103766b41306c6a220341746a280200450d00200341706a2802001030200721010c000b0b0240200a450d00200a10300b0240200b450d00200c10300b200241a0016a24000f0b2003417c6a2802002109200341746a290200210e200341506a2203290200210f200341086a2902002110200341106a2902002111200241186a200341186a2902002212370300200241106a2011370300200241086a20103703002002200f370300200241e0006a41186a22032012370300200241e0006a41106a22132011370300200241e0006a41086a221420103703002002200f370360200241206a2000200241e0006a10ca01024020022903204201520d00200241e0006a41286a200741286a290300370300200241e0006a41206a200741206a2903003703002003200741186a2903003703002013200741106a2903003703002014200741086a290300370300200220072903003703602002200936029c012002200e370294012002200d36029001200241e0006a20024190016a10cb010c010b024020022802302214417c6a22032802002213417f4a0d00201441706a21150240201441746a2214280200450d0020152802001030200328020021130b2014200e3702002015200d3602002003201320096a3602000c010b2003201320096a360200200ea7450d00200d10300c000b0ba40204017f027e037f017e230041306b22022400420021034200210402400240024020012d00000e0b0101010202020202020200020b200241206a200141046a28020010c3032002280220410047ad2104200229032821030c010b42002104200141186a2802004198046c2205450d00200141106a280200220620056a2107420021030340024020062d00004107470d002006410c6a28020041e8036c2205450d00200628020421010340200241106a200110c4034201210402402002280210450d000c040b200229031821082002200110c3032002290300a70d03200141e8036a2101200820037c20022903087c2103200541987c6a22050d000b0b20064198046a22062007470d000b420021040b2000200337030820002004370300200241306a24000bda0203017f027e027f230041f0016b220224004200210342c0843d210402400240024002400240024020012d00000e0b0404040505050005050501050b0240200141106a22052802004102470d002002200141f8006a2802003602ec012002200141f0006a2802003602e80120024188016a200241e8016a10e901024020022802880122064102460d002002412c6a20024188016a41047241dc001085051a0b024020052802004102460d00200510b2020b20012006360210200141146a2002412c6a41dc001085051a20064102460d020b200241186a200510e101200229031842c0843d7c21040c040b200241086a200141046a28020010c4032002290308a7450d010b420121030c020b200229031042c0843d7c21040c010b200141186a2802004198046c2201450d00200141e87b6a4198046ead42c0843d7e428089fa007c21040b2000200437030820002003370300200241f0016a24000bca0101027f230041106b2202240002400240024002402000280200220341c000490d00200341808001490d012003418080808004490d02200241033a000020012002410110642002200336020020012002410410640c030b200220034102743a000020012002410110640c020b200220034102744101723b010020012002410210640c010b2002200341027441027236020020012002410410640b2002200041046a10c6032001200228020022002002280208106402402002280204450d00200010300b200241106a24000b960401047f230041106b22022400024002400240024020012802004101470d002001410c6a280200220341046a2204417f4c0d02200128020421010240024002400240024020040d0020004100360208200042013702000c010b2004102f2205450d07200041003602082000200436020420002005360200200341c000490d01200341808001490d022003418080808004490d030b200241033a000c20002002410c6a410110642002200336020c20002002410c6a4104106420002001200310640c040b200220034102743a000c20002002410c6a4101106420002001200310640c030b200220034102744101723b010c20002002410c6a4102106420002001200310640c020b2002200341027441027236020c20002002410c6a4104106420002001200310640c010b200141086a280200220341046a2204417f4c0d012001280204210102400240024002400240024020040d0020004100360208200042013702000c010b2004102f2205450d07200041003602082000200436020420002005360200200341c000490d01200341808001490d022003418080808004490d030b2000410310c0042002200336020c20002002410c6a410410640c030b2000200341027410c0040c020b200220034102744101723b010c20002002410c6a410210640c010b2002200341027441027236020c20002002410c6a410410640b20002001200310640b200241106a24000f0b102c000b102a000b130020004101360200200041086a41023602000b3400200041f1a4c00036020420004100360200200041146a4101360200200041106a41d887c100360200200041086a420d3702000b130020004100360204200041bc8ec2003602000bc40101017f230041306b220324000240024020022001413c6a41201088050d002003200141306a10cb030c010b200341106a41186a200241186a290000370300200341106a41106a200241106a290000370300200341106a41086a200241086a2900003703002003200229000037031002402001200341106a10d3012202450d00200228020c4101480d002003200210cb030c010b200341003602000b20002003290300370204200041003602002000410c6a200341086a280200360200200341306a24000b5c01027f0240024020012802082202417f4c0d00200128020021030240024020020d00410121010c010b2002102f2201450d020b20002002360204200020013602002001200320021085051a200020023602080f0b102c000b102a000b3400200041fea4c00036020420004100360200200041146a4100360200200041106a41bc8ec200360200200041086a420a3702000b960201027f200041003a000020002001290000370001200041216a200141206a2d00003a0000200041196a200141186a290000370000200041116a200141106a290000370000200041096a200141086a29000037000002404110102f2201450d00200141a0a5c00036020c20014101360208200142818080801037020020002001360224024020002d0001450d004110102f2202450d0120024188a5c00036020c20024101360208200242818080801037020020012001280200417f6a2203360200024020030d002001280208200128020c2802001102000240200128020c280204450d00200128020810300b200141046a22032003280200417f6a220336020020030d00200110300b200020023602240b0f0b102a000be90b03027f027e097f230041f0016b2203240041002104200341003602282003200236022420032001360220420321050240024020020d00420021060c010b410121042003410136022842002106024020012d000022070d00420021050c010b0240024002400240024002400240024002400240200741c00171220841c001460d0002402008418001460d00200841c000470d0b2007413f712207413f470d05410221044141210703402004417f6a20024f0d03200320043602280240200120046a417f6a2d0000220841ff01460d00200820076b21070c0c0b200741817e6a2107200441016a2204418302470d000b41ffff03210741820221040c0a0b2007413f712207413f470d05410221044141210703402004417f6a20024f0d03200320043602280240200120046a417f6a2d0000220841ff01460d00200820076b21070c0a0b200741817e6a2107200441016a2204418302470d000b41ffff03210741820221040c080b2007413f712207413f470d05410221044141210703402004417f6a20024f0d03200320043602280240200120046a417f6a2d0000220841ff01460d00200820076b21070c080b200741817e6a2107200441016a2204418302470d000b41ffff03210741820221040c060b2004417f6a21040c080b2004417f6a21040c070b2004417f6a21040c060b410121040c040b410121040c020b410121040b2007ad422086428002842106420121050c020b2007ad4220862106420121050c010b2007ad4220862106420221050b2006422088a72107024002400240024002400240024002402005200684a741ff01710e0401020300010b20004181023b01000c060b200041003a0000200041046a41003602000c050b20074101712209450d03200420024f0d01200120046a2d00004110490d03200041013b01000c040b20074101712208450d010240200420024f0d00200120046a2d00004110490d02200041013b01000c040b2004200241d08dc1001033000b2004200241e08dc1001033000b024002402004200741016a4101766a220120024b0d0020032001360228200341186a200341206a106f2003280218450d0120004181023b01000c030b20004181023b01000c020b024020032802282207200328021c6a220220032802244b0d00200041003a0000200041106a20083602002000410c6a2001360200200041086a2004360200200041186a2002360200200041146a2007360200200041046a4101360200200320023602280c020b20004181023b01000c010b02402004200741016a4101766a220a20024d0d0020004181023b01000c010b2003200a360228024002400240200a41026a220720024b0d00200320073602280240200a417d4b0d002001200a6a2f00002107410021014100210b0240200642800283500d00200341106a200341206a106f20032802100d042003280228220c20032802146a220d20032802244b0d032003200d3602284101210b0b200341023602e401200341023602d801200341023602cc01200341023602c001200341023602b401200341023602a8012003410236029c0120034102360290012003410236028401200341023602782003410236026c2003410236026020034102360254200341023602482003410236023c20034102360230200341306a2102200741ffff0371210e024003400240200e2001410f7176410171450d00200341086a200341206a106f20032802080d02024020032802282208200328020c220f6a220720032802244d0d0020004181023b01000c080b200241086a2007360200200241046a20083602002002200f412047360200200320073602280b2002410c6a2102200141016a22014110470d000b200041206a200341306a41c0011085051a2000411c6a200d360200200041186a200c360200200041146a200b360200200041106a20093602002000410c6a200a360200200041086a2004360200200041046a4104360200200041003a00000c050b20004181023b01000c040b200a200741c08dc1001048000b20004181023b01000c020b20004181023b01000c010b20004181023b01000b200341f0016a24000bf60b05027f017e017f017e077f230041a0016b220224002002200136021c20022000360218200241d0006a200241186a10d0030240024020022802502203450d0020022902542104200241d0006a200241186a10d003024020022802502205450d00200229025421060240200228021c22004104490d002000417c6a2107200228021822082800002109200241d0006a410472210a410021000240034020072000460d012002200820006a220141056a360218200a20006a200141046a2d00003a00002002200041016a22013602502001210020014120470d000b20024198016a41026a200241dd006a2d00003a000020024194016a41026a200241e4006a2d00003a0000200220022f01543b019c01200220022d00563a009e012002200720016b36021c2002200241db006a2f00003b0198012002200241e2006a2f01003b019401200241f0006a2802002100200241ec006a2802002101200241e5006a2800002107200241de006a28010021082002280057210a20024190016a41026a200241eb006a2d00003a00002002200241e9006a2f00003b0190010c040b2002410036021c0b2006a7450d00200510300b02402004a7450d00200310300b410021030c010b410021030b02402003450d00200241106a41026a220b20024198016a41026a2d00003a00002002410c6a41026a220c20024194016a41026a2d00003a0000200241086a41026a220d20024190016a41026a2d00003a0000200220022d009e013a0016200220022f019c013b0114200220022f0198013b0110200220022f0194013b010c200220022f0190013b0108200241e0006a2006370300200241ef006a200a360000200220093602682002200536025c2002200437025420022003360250200241ee006a20022d00163a0000200241f6006a2008360100200220022f01143b016c200241f3006a20022f01103b0000200241f5006a200b2d00003a0000200241fa006a20022f010c3b0100200241fc006a200c2d00003a0000200241fd006a200736000020024183016a200d2d00003a000020024181016a20022f01083b000020024188016a200036020020024184016a2001360200200241186a200241d0006a10d10320024100360258200242013703502002280218210020022802202201200241d0006a10a803200241d0006a2000200110640240024020022802240d00200241003a009c01200241d0006a2002419c016a410110640c010b200241013a009c01200241d0006a2002419c016a41011064200228022421002002412c6a2802002201200241d0006a10a803200241d0006a2000200110640b20022802302109200241386a2802002208200241d0006a10a80302402008450d0020092008410c6c6a210720092100034020002802002101200041086a2802002203200241d0006a10a803200241d0006a2001200310642000410c6a22002007470d000b0b200228023c2105200241c4006a280200220a200241d0006a10a8030240200a450d002005200a4104746a21072005210003402002200028020036029c01200241d0006a2002419c016a41041064200041046a28020021012000410c6a2802002203200241d0006a10a803200241d0006a200120031064200041106a22002007470d000b0b2002200228024836029c01200241d0006a2002419c016a410410642002200228024c36029c01200241d0006a2002419c016a4104106420022802502103200235025821040240200228021c450d00200228021810300b024020022802242200450d00200241286a280200450d00200010300b02402008450d002008410c6c21012009210003400240200041046a280200450d00200028020010300b2000410c6a2100200141746a22010d000b0b0240200241346a2802002200450d002000410c6c450d00200910300b0240200a450d00200a4104742101200541086a2100034002402000280200450d002000417c6a28020010300b200041106a2100200141706a22010d000b0b0240200241c0006a28020041ffffffff0071450d00200510300b200241a0016a240020044220862003ad840f0b4190f6c1004112200241d0006a41a4f6c10041b4f6c1001034000be50302067f017e02400240024020012802042202450d00200128020022032d0000210420012002417f6a22053602042001200341016a3602000240200441037122064103460d000240024020060e03040001040b2005450d0220032d0001210620012002417e6a22053602042001200341026a3602002006410874200472220241ffff0371418002490d02200241fcff037141027621040c040b20054103490d01200341036a2d0000210620032f0001210720012002417c6a22053602042001200341046a3602002007200641107472410874200472220241ffff034d0d01200241027621040c030b200441034b0d0020054104490d002003280001210420012002417b6a22053602042001200341056a360200200441ffffffff034b0d020b200041003602000f0b200441027621040b024002400240024020052004490d002004417f4c0d010240024020040d00410121020c010b2004102f2202450d032002410020041087051a200128020421050b024020052004490d002002200128020020041085052103200128020422022004490d0420002004ad2208422086200884370204200020033602002001200220046b3602042001200128020020046a3602000f0b200210300b200041003602000f0b102c000b102a000b2004200241f0f5c100104a000be56b04077f017e407f037e23004190116b220224002002200141146a2802003602a40d2002200128020c3602a00d200241e8066a200241a00d6a10a0040240024002400240024020022802ec062203450d00200241f4066a280200210420022802f006210520022802e8062106200241d80b6a200241f8066a41e0001085051a200241f0006a200241a00d6a109b01024020022802700d002002280274220720022802a40d41c8016e2208200820074b1bad42c8017e2209422088a70d052009a72208417f4c0d050240024020080d004108210a0c010b2008102f220a450d050b200841c8016e210b0240024002402007450d00200241e8066a410472210c20024190106a410b6a210d20024181076a210e200241fa066a210f200241e8066a410b6a2110200241a5106a21112002419e106a211220024197106a2113200241e8066a410172211441002115410021160340200241e8006a200241a00d6a109b010240024020022802680d000240200228026c2217450d004100210842002109034002402008417f470d0020094280808080705a0d0e2009422088a721080b200942ffffffff0f83200841016a2208ad4220868421092017417f6a22170d000b0b20022802a40d2217450d0020022802a00d22082d0000211820022017417f6a22193602a40d2002200841016a3602a00d201841ff00714104470d004103211a02402018411874411875417f4a0d00024002402019450d0020082d0001211a20022017417e6a22183602a40d2002200841026a3602a00d410121194101211b024002400240024002400240201a0e050005010203060b2017417e6a211c41002118417d211a0340201c2018460d06200c20186a200820186a221d41026a2d00003a00002002201841016a221b3602e80620022017201a6a3602a40d2002201d41036a3602a00d201a417f6a211a201b2118201b4120470d000b201320102f00003b00002012200f2f01003b01002011200e2f00003b0000201341026a201041026a2d00003a0000201241026a200f41026a2d00003a0000201141026a200e41026a2d00003a00002002200c2f01003b0190102002200c41026a2d00003a00921020022800ef06210820022801f606211820022800fd06211a20022002290284073703a8102002201a3600a1102002201836019a1020022008360093102017201b6b417e6a21184100211b410121190c040b200241e0006a200241a00d6a109b0120022802600d0420022802a40d221720022802642208490d042008417f4c0d120240024020080d00410121180c010b2008102f2218450d122018410020081087051a20022802a40d21170b024020172008490d00201820022802a00d2008108505211820022802a40d221720084f0d032008201741f0f5c100104a000b201810300c040b2017417e6a211c41002118417d211a0340201c2018460d04200c20186a200820186a221d41026a2d00003a00002002201841016a221b3602e80620022017201a6a3602a40d2002201d41036a3602a00d201a417f6a211a201b2118201b4120470d000b201320102f00003b00002012200f2f01003b01002011200e2f00003b0000201341026a201041026a2d00003a0000201241026a200f41026a2d00003a0000201141026a200e41026a2d00003a00002002200c2f01003b0190102002200c41026a2d00003a00921020022800ef06210820022801f606211820022800fd06211a20022002290284073703a8102002201a3600a1102002201836019a1020022008360093102017201b6b417e6a21184103211b410121190c020b200241e8066a200241a00d6a10a70120022d00e8064101460d0220024190106a41106a201441106a28000036020020024190106a41086a201441086a29000037030020022014290000370390104104211b4101211920022802a40d21180c010b20022008ad22094220862009843700971020022018360093102002201720086b22183602a40d200220022802a00d20086a3602a00d4102211b410021190b200241f8006a41026a221e20022d0092103a0000200241900a6a41086a221f200d41086a290000370300200241900a6a410d6a200d410d6a290000370000200220022f0190103b01782002200d2900003703900a200228009710211d200228009310211c02402018450d0020022802a00d221a2d0000210820022018417f6a22203602a40d2002201a41016a3602a00d024002400240024020080e03000102040b200241e8066a200241a00d6a10a90120022d00e8064101460d0320022d00a807212120022802a407212220022d00a307212320022d00a207212420022d00a1072125200228009d07212620022d009c07212720022d009b07212820022d009a072129200228019607212a20022d009507212b20022d009407212c20022d009307212d200228008f07212e20022d008e07212f20022d008d07213020022d008c072131200228028807213220022d008707213320022d008607213420022d0085072135200228008107213620022d008007213720022d00ff06213820022d00fe06213920022801fa06213a20022d00f906213b20022d00f806213c20022d00f706213d20022800f306213e20022d00f206213f20022d00f106214020022d00f006214120022802ec06214220022d00eb06214320022d00ea06214420022d00e90621454100211a0c020b200241e8066a200241a00d6a10a90120022d00e8064101460d0220022d00a807212120022802a407212220022d00a307212320022d00a207212420022d00a1072125200228009d07212620022d009c07212720022d009b07212820022d009a072129200228019607212a20022d009507212b20022d009407212c20022d009307212d200228008f07212e20022d008e07212f20022d008d07213020022d008c072131200228028807213220022d008707213320022d008607213420022d0085072135200228008107213620022d008007213720022d00ff06213820022d00fe06213920022801fa06213a20022d00f906213b20022d00f806213c20022d00f706213d20022800f306213e20022d00f206213f20022d00f106214020022d00f006214120022802ec06214220022d00eb06214320022d00ea06214420022d00e90621454101211a0c010b41002108200241003602e8062018417e6a2117034020202008460d02200c20086a201a20086a221841016a2d00003a00002002201841026a3602a00d2002200841016a22183602e806200220173602a40d2017417f6a211720182108201841c100470d000b20022d00ec06214520022d00ed06214420022d00ee06214320022800ef06214220022d00f306214120022d00f406214020022d00f506213f20022801f606213e20022d00fa06213d20022d00fb06213c20022d00fc06213b20022800fd06213a20022d008107213920022d008207213820022d0083072137200228028407213620022d008807213520022d008907213420022d008a072133200228008b07213220022d008f07213120022d009007213020022d009107212f200228019207212e20022d009607212d20022d009707212c20022d009807212b200228009907212a20022d009d07212920022d009e07212820022d009f07212720022802a007212620022d00a407212520022d00a507212420022d00a607212320022800a707212220022d00ab07212120022d00ac0721464102211a0b200241a8056a41026a201e2d00003a0000200241e8066a41086a201f290300370300200241e8066a41106a200241900a6a41106a290300370300200220022f01783b01a805200220022903900a3703e8060c020b2019201d45720d00201c10300b4103211a2047211d2048211c2049211b0b20024180106a41026a2208200241a8056a41026a2d00003a0000200241f8086a41086a2217200241e8066a41086a290300370300200241f8086a41106a2218200241e8066a41106a290300370300200220022f01a8053b018010200220022903e8063703f808201a4103460d01200241800a6a41026a20082d00003a0000200241c8036a41086a2017290300370300200241c8036a41106a2018290300370300200220022f0180103b01800a200220022903f8083703c803201d2147201c2148201b21490b200241e8066a200241a00d6a10e90120022802e8062117200241900a6a200c41dc001085051a20174102470d01201a4103460d00201b41ff01714102470d00201d450d00201c10300b02402016450d00200a211703400240201722084184016a2d00004103460d00200841e0006a2d00004102470d00200841e8006a280200450d00200841e4006a28020010300b200841c8016a2117200810b202201541b87e6a22150d000b0b200b450d05200b41c8016c0d040c050b200241c8056a200241900a6a41dc001085051a200241f00f6a41026a2208200241800a6a41026a2d00003a0000200241c8026a41086a2218200241c8036a41086a290300370300200241c8026a41106a2219200241c8036a41106a290300370300200220022f01800a3b01f00f200220022903c8033703c802200241e80e6a200241c8056a41dc001085051a200241b8036a41026a222020082d00003a0000200241d8016a41086a22082018290300370300200241d8016a41106a22182019290300370300200220022f01f00f3b01b803200220022903c8023703d801200241e00d6a200241e80e6a41dc001085051a200241d40b6a41026a221920202d00003a0000200241c8046a41086a22202008290300370300200241c8046a41106a221e2018290300370300200220022f01b8033b01d40b200220022903d8013703c80402402016200b470d0020164101742208201641016a220b2008200b4b1b22084104200841044b1bad42c8017e2209422088a74541037421082009a7210b0240024020160d00200241003602e8060c010b200241083602f0062002200a3602e8062002201641c8016c3602ec060b200241900a6a200b2008200241e8066a106920022802980a2108024020022802900a4101470d0020080d0a0c0b0b20022802940a210a200841c8016e210b0b200a201641c8016c6a22082017360200200841046a200241e00d6a41dc001085051a200841e0006a201b3a0000200841e8006a201d360200200841e4006a201c360200200841e1006a20022f01d40b3b0000200841e3006a20192d00003a0000201e29030021092020290300214a20022903c804214b200841c0016a2022360000200841b9016a2026360000200841b2016a202a360000200841ab016a202e360000200841a4016a20323600002008419d016a203636000020084196016a203a3600002008418f016a203e36000020084188016a2042360000200841c4016a20213a0000200841bf016a20233a0000200841be016a20243a0000200841bd016a20253a0000200841b8016a20273a0000200841b7016a20283a0000200841b6016a20293a0000200841b1016a202b3a0000200841b0016a202c3a0000200841af016a202d3a0000200841aa016a202f3a0000200841a9016a20303a0000200841a8016a20313a0000200841a3016a20333a0000200841a2016a20343a0000200841a1016a20353a00002008419c016a20373a00002008419b016a20383a00002008419a016a20393a000020084195016a203b3a000020084194016a203c3a000020084193016a203d3a00002008418e016a203f3a00002008418d016a20403a00002008418c016a20413a000020084187016a20433a000020084186016a20443a000020084185016a20453a000020084184016a201a3a0000200841ec006a204b370200200841f4006a204a370200200841fc006a2009370200200841c5016a20463a0000201541c8016a2115201641016a2208211620082007470d000c020b0b200a450d02410021070b200241e8066a200241a00d6a10eb0120022802e80622160d0302402007450d00200741c8016c21154100210803400240200a20086a22174184016a2d00004103460d00201741e0006a2d00004102470d00201741e8006a280200450d00201741e4006a28020010300b201710b2022015200841c8016a2208470d000b0b200b450d01200b41c8016c450d010b200a10300b02402004450d00200441246c21172003210803400240024002400240024020082d00000e050400010204030b2008410c6a280200450d03200841086a28020010300c030b2008410c6a280200450d02200841086a28020010300c020b2008410c6a280200450d01200841086a28020010300c010b200841086a280200450d00200841046a28020010300b200841246a21082017415c6a22170d000b0b2005450d00200541246c450d00200310300b410021030c010b20022902ec06214c200241e8066a200241d80b6a41e0001085051a0b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d00200241f8006a200241e8066a41e0001085051a200220012802083602dc0b200220012802003602d80b200241e8066a200241d80b6a10a00420022802ec06450d01200241d8016a200241e8066a41f0001085051a200241d4026a2004360200200241d0026a2005360200200220033602cc02200220063602c802200241d8026a200241f8006a41e0001085052108200241003602e00b200242013703d80b4120102f2217450d41200242203702ec06200220173602e806200241e8066a200841201064200241d80b6a20022802e806220820022802f0061064024020022802ec06450d00200810300b200241c8026a200241d80b6a10ee014120102f2208450d41200242203702ec06200220083602e806200241e8066a200241f8026a41201064200241d80b6a20022802e806220820022802f0061064024020022802ec06450d00200810300b4120102f2208450d41200242203702ec06200220083602e806200241e8066a20024198036a41201064200241d80b6a20022802e806220820022802f0061064024020022802ec06450d00200810300b200241d80b6a200410a5010240200441246c2208450d000340200241e8066a200310e701200241d80b6a20022802e806221720022802f0061064024020022802ec06450d00201710300b200341246a21032008415c6a22080d000b0b200241b8036a41086a200241d80b6a41086a280200360200200220022903d80b3703b803200241c8036a200241c8026a41f0001085051a200241c0046a2007360200200241bc046a200b3602002002200a3602b804200241e8066a200241d8016a10ed01200241e8066a200241d8036a41201088050d024101102f2203450d41200341003a0000410041003502e0ac42200241e8066aad7c42adfed5e4d485fda8d8007e42218922093e02e0ac42200241d0006a41e0acc200ad224a42a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200241306a200942a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200241c0006a204a42c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200241206a200942c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200241106a2009204a85420042adfed5e4d485fda8d800420010840520024190106a418de2c100410110652002419c056a200241a8106a29030037020020024194056a200241a0106a2903003702002002418c056a20024190106a41086a290300370200200241fc046a428180808010370200200241f0046a4200370300200241ec046a41bcf5c100360200200220022903901037028405200220033602f804200241003602e80420022009200241d0006a41086a2903002002290350857c200241106a41086a29030020022903108542cf829ebbefefde82147c224b893703c8042002200241206a41086a290300200229032085204a7c204b423088893703e00420022009200241c0006a41086a2903002002290340857c204b422088893703d8042002200241306a41086a290300200229033085204a7c204b421088893703d004204ca72104024002400240204c422088a7220a410c6c220b0d00201621030c010b2016410c6a21080240201628020022170d00200821030c010b200a410c6c41746a21150340200241e8066a200241c8046a2017200841786a2902002209422088a710c60102402009a7450d00201710300b2015450d02201541746a2115200828020021172008410c6a2203210820170d000b0b2016200b6a2003460d002016200a410c6c6a211703402003410c6a21080240200341046a280200450d00200328020010300b2008210320172008470d000b0b20024184056a210802402004450d002004410c6c450d00201610300b200241a8056a41186a200241a0026a290300370300200241a8056a41106a200241d8016a41c0006a290300370300200241a8056a41086a200241d8016a41386a29030037030020022002290388023703a80520024188026a21030240200241a8056a20084120108805450d00200241e8066a41186a200341186a290000370300200241e8066a41106a200341106a290000370300200241e8066a41086a200341086a290000370300200220032900003703e806200241c8046a200241e8066a10d3012208450d04200828020c41004c0d040b200241e8066a200241c8046a41e0001085051a200241e0076a200341186a290200370300200241d8076a200341106a290200370300200241d0076a200341086a290200370300200220032902003703c80720024190106a418de2c1004101106520024180086a20024190106a41186a290300370300200241f8076a220320024190106a41106a290300370300200241f0076a20024190106a41086a29030037030020022002290390103703e807200241c8056a200241e8066a41a0011085051a200241e0086a41003a0000200241dc086a410036020020024184086a4200370200200241fc076a41003a000020034100360200200241ac076a4200370200200241b4076a420037020020024190086a420037030020024198086a4200370300200241e8066a41386a420037030020024190076a4200370300200241e8066a41186a4200370300200241002802e88f42223c3602e40820024100360298072002410036028807200241003602f806200242003703f006200241003602e806200241f0086a41003a0000200241e8086a4200370300200241003a00d8092002410036029c09200241003b018c0a2002200241f8086a3602880a2002200241c8056a3602840a2002200241e8066a3602800a41002d00e8ad420d04410041013a00e8ad4241002802e4ad422104410041113602e4ad4241002d0080ae424101710d05410041013a0080ae4241002802fcad422116410041123602fcad4241002d00d8ad424101710d06410041013a00d8ad4241002802d4ad42210a410041133602d4ad4241002d00d0ad420d07410041013a00d0ad4241002802ccad42210b410041143602ccad4241002d00b8ad424101710d08410041013a00b8ad4241002802b4ad422105410041153602b4ad4241002d00f8ad420d09410041013a00f8ad4241002802f4ad422107410041163602f4ad4241002d00c0ad424101710d0a410041013a00c0ad4241002802bcad422118410041173602bcad4241002d00b0ad424101710d0b410041013a00b0ad4241002802acad422106410041183602acad4241002d00a8ad420d0c410041013a00a8ad4241002802a4ad42210c410041193602a4ad4241002d00e0ad424101710d0d410041013a00e0ad4241002802dcad42211a4100411a3602dcad4241002d0088ae424101710d0e410041013a0088ae424100280284ae42211b4100411b360284ae4241002d00f0ad424101710d0f410041013a00f0ad4241002802ecad42211d4100411c3602ecad4241002d00c8ad424101710d10410041013a00c8ad4241002802c4ad42211c4100411d3602c4ad4241002d00a8ae424101710d11410041013a00a8ae4241002802a4ae4221194100411e3602a4ae4241002d00b8ae420d12410041013a00b8ae4241002802b4ae4221204100411f3602b4ae4241002d00c8ae420d13410041013a00c8ae4241002802c4ae42211e410041203602c4ae4241002d0090ae424101710d14410041013a0090ae42410028028cae4221454100412136028cae4241002d00d0ae420d15410041013a00d0ae4241002802ccae422144410041223602ccae4241002d00a0ae420d16410041013a00a0ae42410028029cae4221434100412336029cae4241002d0098ae424101710d17410041013a0098ae424100280294ae42214141004124360294ae4241002d00c0ae420d18410041013a00c0ae4241002802bcae422140410041253602bcae4241002d00b0ae424101710d19410041013a00b0ae4241002802acae42213f410041263602acae4241002d00e0ae424101710d1a410041013a00e0ae4241002802dcae42213e410041273602dcae4241002d00d8ae424101710d1b410041013a00d8ae4241002802d4ae42213d410041283602d4ae42200241900a6a41386a200141386a280200360200200241900a6a41306a200141306a290200370300200241900a6a41286a200141286a290200370300200241900a6a41206a200141206a290200370300200241900a6a41186a200141186a290200370300200241900a6a41106a200141106a290200370300200241900a6a41086a200141086a290200370300200220012902003703900a200241cc0a6a200241c8036a41fc001085051a200241d00b6a200241b8036a41086a280200360200200220022903b8033703c80b410028028cad4241016a220341004c0d1c02404100280290ad424101460d00200241e80e6a4100280288ad42110200200241d80b6a41086a200241e80e6a41086a290300370300200220022903e80e3703d80b410028028cad420d1e4100417f36028cad4202404100280290ad42450d00024041002802a0ad422208450d004100280298ad422103200841027421080340200328020022172017280200417f6a3602000240200328020022172802000d00201741046a22172017280200417f6a3602002003280200221741046a2802000d00201710300b200341046a21032008417c6a22080d000b0b410028029cad4241ffffffff0371450d004100280298ad4210300b41004101360290ad42410020022903d80b370294ad424100200241e00b6a29030037029cad424100410028028cad42220341016a36028cad42200341026a220341004c0d1f0b4100200336028cad424100280294ad420d1f4100417f360294ad424114102f2203450d41200341e0ecc1003602102003410036020820034281808080103702002003200241800a6a36020c0240024002400240024041002802a0ad422208410028029cad42470d00200841016a22172008490d47200841017422152017201520174b1b22174104201741044b1b221741ffffffff03712017464102742115201741027421170240024020080d00200241003602d80b0c010b200241e00b6a4104360200200220084102743602dc0b20024100280298ad423602d80b0b200241e80e6a20172015200241d80b6a1069200241f00e6a280200210820022802e80e4101460d01410020022802ec0e360298ad424100200841027636029cad4241002802a0ad4221080b4100280298ad4220084102746a2003360200410041002802a0ad4241016a3602a0ad4241004100280294ad4241016a360294ad42200241d80b6a200241900a6a41c4011085051a200241a00d6a41386a200241900a6a41386a280200360200200241a00d6a41306a200241900a6a41306a290300370300200241a00d6a41286a200241900a6a41286a290300370300200241a00d6a41206a200241900a6a41206a290300370300200241a00d6a41186a200241900a6a41186a290300370300200241a00d6a41106a200241900a6a41106a290300370300200241a00d6a41086a200241900a6a41086a290300370300200220022903900a3703a00d200241e00d6a200241940c6a221541fc001085051a200241e40e6a200241980d6a280200360200200220022903900d3702dc0e41002802e8ac4241016a220341004c0d24024041002802ecac424101460d0020024190106a41002802e4ac42110200200241e80e6a41086a20024190106a41086a29030037030020022002290390103703e80e41002802e8ac420d264100417f3602e8ac42024041002802ecac42450d00024041002802fcac422208450d0041002802f4ac422103200841027421080340200328020022172017280200417f6a3602000240200328020022172802000d00201741046a22172017280200417f6a3602002003280200221741046a2802000d00201710300b200341046a21032008417c6a22080d000b0b41002802f8ac4241ffffffff0371450d0041002802f4ac4210300b410041013602ecac42410020022903e80e3702f0ac424100200241f00e6a2903003702f8ac42410041002802e8ac42220341016a3602e8ac42200341026a220341004c0d270b410020033602e8ac4241002802f0ac420d274100417f3602f0ac424110102f2203450d452003410036020820034281808080103702002003200241a00d6a36020c41002802fcac42220841002802f8ac42470d03200841016a22172008490d46200841017422012017200120174b1b22174104201741044b1b221741ffffffff037120174641027421012017410274211720080d01200241003602e80e0c020b2008450d450c440b200241f00e6a4104360200200220084102743602ec0e200241002802f4ac423602e80e0b20024190106a20172001200241e80e6a106920024198106a28020021082002280290104101460d3f41002002280294103602f4ac42410020084102763602f8ac4241002802fcac4221080b41002802f4ac4220084102746a2003360200410041002802fcac4241016a3602fcac42410041002802f0ac4241016a3602f0ac42200241e80e6a200241e00d6a4188011085051a20024190106a201541fc001085051a20024190106a10a403200241a8106a2203420037030020024190106a41106a2208420037030020024190106a41086a22174200370300200242003703901020024180106a41e2a4c000410f10ab01201720024180106a41086a221529000037030020022002290080103703901020024180106a419cdfc000411110ab0120032015290000370300200820022900801037030020024180106a20024190106a4120108602200228028010213b2002290284102109200342003703002008420037030020174200370300200242003703901020024180106a41e2a4c000410f10ab012017201529000037030020022002290080103703901020024180106a41f8e0c000410e10ab0120032015290000370300200820022900801037030020024180106a20024190106a10bd032002280280102101200229028410214a200342003703002008420037030020174200370300200242003703901020024180106a41e2a4c000410f10ab012017201529000037030020022002290080103703901020024180106a41e8dec000411910ab01200320152900003703002008200229008010370300200241086a20024190106a4120108502200228020c213a20022802082139200241f00f6a10aa01200342003703002008420037030020174200370300200242003703901020024180106a41e2a4c000410f10ab012017201529000037030020022002290080103703901020024180106a41e0dfc000410d10ab01200320152900003703002008200229008010370300200220024190106a412010850220022802042103200228020021082000411c6a204a420020011b37020020002001203c20011b360218200020022903f00f3702242000412c6a200241f00f6a41086a280200360200200020022902e40f370200200041086a200241ec0f6a28020036020020002003410020081b3602342000203a410020391b360230200041106a20093702002000203b36020c41002802f0ac420d244100417f3602f0ac42024041002802fcac422203450d0041002003417f6a22033602fcac4241002802f4ac4220034102746a2802002203450d0020032003280200417f6a220836020020080d00200341046a22082008280200417f6a220836020020080d00200310300b410041002802f0ac4241016a3602f0ac42410041002802e8ac42417f6a3602e8ac42024020022802a40d450d0020022802a00d10300b0240200241b00d6a280200450d0020022802ac0d10300b4100280294ad420d254100417f360294ad42024041002802a0ad422203450d0041002003417f6a22033602a0ad424100280298ad4220034102746a2802002203450d0020032003280200417f6a220836020020080d00200341046a22082008280200417f6a220836020020080d00200310300b41004100280294ad4241016a360294ad424100410028028cad42417f6a36028cad422004450d26410020043602e4ad42410041003a00e8ad422016450d27410020163602fcad42410041003a0080ae42200a450d284100200a3602d4ad42410041003a00d8ad42200b450d294100200b3602ccad42410041003a00d0ad422005450d2a410020053602b4ad42410041003a00b8ad422007450d2b410020073602f4ad42410041003a00f8ad422018450d2c410020183602bcad42410041003a00c0ad422006450d2d410020063602acad42410041003a00b0ad42200c450d2e4100200c3602a4ad42410041003a00a8ad42201a450d2f4100201a3602dcad42410041003a00e0ad42201b450d304100201b360284ae42410041003a0088ae42201d450d314100201d3602ecad42410041003a00f0ad42201c450d324100201c3602c4ad42410041003a00c8ad422019450d33410020193602a4ae42410041003a00a8ae422020450d34410020203602b4ae42410041003a00b8ae42201e450d354100201e3602c4ae42410041003a00c8ae422045450d364100204536028cae42410041003a0090ae422044450d37410020443602ccae42410041003a00d0ae422043450d384100204336029cae42410041003a00a0ae422041450d3941002041360294ae42410041003a0098ae422040450d3a410020403602bcae42410041003a00c0ae42203f450d3b4100203f3602acae42410041003a00b0ae42203e450d3c4100203e3602dcae42410041003a00e0ae42203d450d3d200241e8066a41c0006a21034100203d3602d4ae42410041003a00d8ae420240200228029c09450d00200241f8086a106c0b20031090040240024020022802b40722174106490d00200241bc076a28020021150240200241c0076a2802002203450d002003410c6c2108201521030340200310d4032003410c6a2103200841746a22080d000b0b2017410c6c450d01201510300c010b2017450d00200241bc076a21032017410c6c21080340200310d4032003410c6a2103200841746a22080d000b0b2002280284082103200241003602840802402003450d0002402002280280082208450d00034020032802d80921032008417f6a22080d000b0b200241003602e00b200220033602dc0b200241003602d80b20022002280288083602e40b200241d80b6a10d9030b200228029008210320024100360290082003450d400240200228028c082208450d00034020032802900d21032008417f6a22080d000b0b2002280294082204450d3f200241d80b6a41186a210a200241f80b6a210b4100211703400240024002400240201720032f018e0d490d0041002117034041002108024020032802002200450d00201741016a210120032f018c0d2115200021080b024041c00d41900d20171b450d00200310300b024020080d00410221010c050b2001211720082103201520082f018e0d4f0d000b200820154107746a418c026a21162008201541186c6a41046a2100024020010d00200821030c020b201541027420086a41940d6a280200210302402001417f6a2217450d00034020032802900d21032017417f6a22170d000b0b410021170c020b200320174107746a418c026a21162003201741186c6a41046a210020172115200321080b201541016a21170b200241e80e6a41106a200041106a290200370300200241e80e6a41086a200041086a290200370300200220002902003703e80e200820154107746a22084190026a280200210120162802002100200241d80b6a20084194026a41f8001085051a0b200241e00d6a41106a2208200241e80e6a41106a290300370300200241e00d6a41086a2215200241e80e6a41086a290300370300200220022903e80e3703e00d200241900a6a200241d80b6a41f8001085051a200241d80b6a41106a2008290300370300200241d80b6a41086a2015290300370300200220022903e00d3703d80b200220013602f40b200220003602f00b200b200241900a6a41f8001085051a024020022802dc0b450d0020022802d80b10300b2004417f6a2104024020022802e80b450d0020022802e40b10300b200a10d90220040d000c400b0b41cfeac100411c20024180106a41eceac10041fceac1001034000b418cebc100411320024180106a41eceac10041a0ebc1001034000b41b0ebc100411341c4ebc100102d000b41d4ebc10041314188ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b4198ecc100413541d0ecc100102d000b41aeaac000411820024180106a41c8aac00041d8aac0001034000b41b082c200411020024180106a41e8aac00041f8aac0001034000b41aeaac000411820024180106a41c8aac0004188abc0001034000b41b082c200411020024180106a41e8aac0004198abc0001034000b41aeaac000411820024180106a41c8aac00041d8aac0001034000b41b082c200411020024180106a41e8aac00041f8aac0001034000b41aeaac000411820024180106a41c8aac0004188abc0001034000b41b082c200411020024180106a41e8aac0004198abc0001034000b41b082c200411020024180106a41ace5c10041bce5c1001034000b41b082c200411020024180106a41ace5c10041bce5c1001034000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b4180eec100412041a0eec1001050000b2008450d030c020b41002108034020032802002117024041c00d41900d20081b450d00200310300b2008417f6a21082017210320170d000b0b0240024020022802980822174106490d00200241a0086a28020021150240200241a4086a2802002203450d002003410c6c2108201521030340200310d6032003410c6a2103200841746a22080d000b0b2017410c6c450d01201510300c010b2017450d00200241a0086a21032017410c6c21080340200310d6032003410c6a2103200841746a22080d000b0b024020022802ec082208450d0020022802e4082103200841186c2108034002402003280200450d002003410c6a280200450d00200341086a28020010300b200341186a2103200841686a22080d000b0b024020022802e8082203450d00200341186c450d0020022802e40810300b200241c8056a106c20022802dc0121170240200241d8016a410c6a2802002203450d00200341246c21082017210303400240024002400240024020032d00000e050400010204030b2003410c6a280200450d03200341086a28020010300c030b2003410c6a280200450d02200341086a28020010300c020b2003410c6a280200450d01200341086a28020010300c010b200341086a280200450d00200341046a28020010300b200341246a21032008415c6a22080d000b0b0240200241e0016a2802002203450d00200341246c450d00201710300b20024190116a24000f0b102a000b102c000b8b0201057f230041206b2202240002400240024020012802042203450d002001280208210420012802002101200321050240034020032f01ae2b2106024020010d002001450d020c050b2001450d042001417f6a2101200320064102746a41b02b6a280200210320052802b02b21050c000b0b2000200136020c200041003602082000200536020420002001360200200041146a2006360200200041106a20033602000c010b4100210420004100360204200041106a41003602000b20002004360218200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b847107027f057e037f017e427f017e037f230041c0096b2204240002404101102f2205450d00200541003a0000410041003502e0ac42200441f8076aad22067c42adfed5e4d485fda8d8007e42218922073e02e0ac42200441e0016a41e0acc200ad220842a4bb99fed1a0bbb023852209420042adfed5e4d485fda8d8004200108405200441c0016a200742a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441d0016a200842c5ecb3fec9ecf7c2c30085220a420042adfed5e4d485fda8d8004200108405200441b0016a200742c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200441a0016a2007200885420042adfed5e4d485fda8d8004200108405200441f8076a418de2c10041011065200441c4026a200441f8076a41186a220b290000370200200441bc026a200441f8076a41106a220c290000370200200441b4026a200441f8076a41086a220d290000370200200441a4026a428180808010370200200441f0016a41286a4200370300200441f0016a41246a41bcf5c100360200200420042900f8073702ac02200420053602a002200441003602900220042007200441e0016a41086a29030020042903e001857c200441a0016a41086a29030020042903a0018542cf829ebbefefde82147c220e893703f0012004200441b0016a41086a29030020042903b0018520087c200e423088893703880220042007200441d0016a41086a29030020042903d001857c200e42208889370380022004200441c0016a41086a29030020042903c0018520087c200e421088893703f801200441d0026a41186a200341186a280200360200200441d0026a41106a200341106a290200370300200441d0026a41086a200341086a290200370300200420032902003703d002200441d8056a410772210f200441f8076a4101722110200441f8056a41e0006a2111200441d1066a211220044198056a4107722113200441f4046a2114200441f8076a410c6a211520044190036a41076a2116200441f8076a410b6a2117200441f8076a410d6a2118200441f8076a410e6a2119200441f8076a410f6a211a200441f8076a41116a211b200441f8076a41126a211c200441f8076a41136a211d200441f8076a41156a211e200441f8076a41166a211f200441f8076a41196a2120200441f8076a411a6a2121200441f8076a411b6a2122200441f8076a411c6a2123200441f8076a411d6a2124200441f8076a411e6a2125200441f8076a411f6a212620044199086a21272004419a086a21282004419b086a21294100212a4100212b4100212c41002802e88f42222d212e0240024002400240024002400240024003400240024020042802e8022203450d0020042003417f6a3602e802200441d0026a410020042802d4021b222f280200213002400240202f2802082231202f28020422032f01d6094f0d00200321050c010b03400240200328020022050d00410021050c020b203041016a213020032f01d409213120052103203120052f01d6094f0d000b0b024002402030450d00203141027420056a41dc096a280200210302402030417f6a2230450d00034020032802d80921032030417f6a22300d000b0b410021300c010b203141016a2130200521030b202f2003360204202f4100360200202f2030360208200441f8076a2005203141e4006c6a4188016a10fa0320042802940822320d010b200441d8056a41186a200241186a280200360200200441d8056a41106a200241106a290200370300200441d8056a41086a200241086a290200370300200420022902003703d805200128020021034101102f2205450d0a200541003a0000410041003502e0ac4220067c42adfed5e4d485fda8d8007e42218922073e02e0ac42200441c0006a41e0acc200ad220e42a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441206a200742a4bb99fed1a0bbb02385420042adfed5e4d485fda8d8004200108405200441306a200e42c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200441106a200742c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d800420010840520042007200e85420042adfed5e4d485fda8d8004200108405200441f8076a418de2c10041011065200441e4036a200441f8076a41186a290000370200200441dc036a200441f8076a41106a290000370200200441d4036a200441f8076a41086a2230290000370200200441c4036a428180808010370200200441b8036a420037030020044190036a41246a41bcf5c100360200200420042900f8073702cc03200420053602c003200441003602b00320042007200441c0006a41086a2903002004290340857c200441086a29030020042903008542cf829ebbefefde82147c220889370390032004200441106a41086a290300200429031085200e7c2008423088893703a80320042007200441306a41086a2903002004290330857c2008422088893703a0032004200441206a41086a290300200429032085200e7c20084210888937039803200341e3006a280000210c200341ea006a2800002133200341f1006a280000210b200341f8006a22052800002114200341fc006a2800002134200341e2006a2d00002135200341e7006a2f00002136200341e9006a2d00002137200341ee006a2f00002110200341f0006a22312d00002111200341f5006a2f00002138200341f7006a2d0000213920032f0160213a200420033602d002200420044190036a3602d402200441b8046a41186a2005290200370300200441b8046a41106a2031290200370300200441b8046a41086a200341e8006a290200370300200420032902603703b804200441f8076a200441d0026a41c4a2c000200441b8046a10fe0220042802fc07210520042802f8072103200441f8066a20304180011085051a20034101460d05200441f8056a200441f8066a4180011085051a20044184076a2205200441d8056a41086a2903003702002004418c076a200441e8056a29030037020020044194076a200441f0056a2802002203360200200441f8066a41246a202e202b41186c6a222f360200200441013602f806200420042903d8053702fc062004202e3602980702400240024002400240024002402003450d0020042003417f6a36029407200441f8066a4104724100200441f8066a41086a223b28020022031b223c2802002130024002402005410820031b223d2802002231203b410420031b223b28020022052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b203b2005360200203d2030360200203c410036020002400240200320314107746a22304188016a28020022054106490d0020304194016a280200210520304190016a28020021300c010b20304190016a21300b2030450d062005450d0620032031410c6c6a2203410c6a213b200341046a210320302005417f6a41186c6a223028020022050d01410021050c020b41002105200441003602f806202f202e460d0e2004202e41186a220336029807202e28020c22300d020c030b203028020821310b203b280200213b2003280200213c417f20044194076a2802002203202f202e6b41186e6a223020302003491b21030c020b202e2802142131203021050b202e280208213b202e280200213c202f20036b41186e21030b417f200341016a223020302003491b220341ffffffff00712003470d0720034104742203417f4c0d072003102f223e450d0b203e203136020c203e2005360208203e203b360204203e203c360200200441f8076a41206a200441f8066a41206a290300370300200441f8076a41186a200441f8066a41186a290300370300200441f8076a41106a200441f8066a41106a290300370300200441f8076a41086a223d200441f8066a41086a290300370300200420042903f8063703f8072003410476213f200441f8076a410c6a2140200441f8076a410472214141012142024002400240034002400240024002400240024020042802f8074101470d0002402004280294082203450d0020042003417f6a360294082041410020042802800822031b222f2802002130024002402040410820031b223b2802002231203d410420031b223c28020022052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b203c2005360200203b2030360200202f410036020020032031410c6c6a2205410c6a2802002130200541046a280200212f02400240200320314107746a22054188016a28020022034106490d0020054194016a280200210320054190016a28020021050c010b20054190016a21050b2005450d0a2003450d0a20052003417f6a41186c6a220328020022050d02410021050c030b200441003602f8070b2004280298082203450d07200428029c082003460d072004200341186a3602980802400240200328020c22050d00410021050c010b200341146a28020021310b200328020821302003280200212f203f2042470d0420042802980822030d02410021030c030b200328020821310b203f2042470d022004280294082103200428029808223b450d01417f2003200428029c08203b6b41186e6a223b203b2003491b21030c010b200428029c0820036b41186e21030b2042417f200341016a223b203b2003491b6a22032042490d0c2042410174223b2003203b20034b1b22034104200341044b1b220341ffffffff0071200346410274213b200341047421030240024020420d0020044100360298050c010b2004203e36029805200441043602a0052004204241047436029c050b20044198046a2003203b20044198056a106920042802a00421032004280298044101460d02200428029c04213e2003410476213f0b203e20424104746a22032005360208200320303602042003202f3602002003410c6a2031360200204241016a21420c000b0b2003450d090c0d0b0240204241144b0d00204241014d0d072042410474203e6a41606a21034101210503402003200541016a220510b602200341706a210320422005470d000c080b0b2042410176220341ffffffff00712003470d0820034104742243417f4c0d082043102f2244450d0c203e41706a2132203e41506a214541002802e88f42214641002147410021482042214903402049213b41002149410121030240203b417f6a2205450d0002400240203e20054104746a2203280200203e203b417e6a22494104746a2205280200222f2005280204220520032802042203200320054b1b10880522300d00417f200320054720032005491b21030c010b417f410120304100481b21030b0240024002400240024002402003417f460d002045203b4104746a21304102210303400240203b2003470d0041002149203b21030c080b024002400240202f2030280200223c203041046a28020022312005200520314b1b108805222f0d00200520314f0d010c020b202f4100480d010b203041706a2130200341016a210320312105203c212f0c010b0b203b20036b21490c010b203b410274213c2045203b4104746a210302400340024020490d00410021490c020b02400240202f20032802002231200341046a28020022302005200520304b1b108805222f0d00200520304f0d030c010b202f417f4a0d020b2049417f6a2149200341706a2103203021052031212f0c000b0b203b2049490d01203b20424b0d02203b20496b22034101762231450d00203e20494104746a21052032203c4102746a21300340200441f8076a41086a222f200541086a223c290200370300200420052902003703f807203041086a223d290200210720052030290200370200203c2007370200203d202f290300370200203020042903f807370200200541106a2105203041706a21302031417f6a22310d000b0b2049450d04200341094b0d04203b20424b0d02203b20496b21032049417f6a2105203220494104746a21300340203b2005490d0b2030200341016a220310b6022005417f6a223120054f0d04203041706a2130203121052003410a490d000c040b0b2049203b41ccf7c0001048000b203b204241ccf7c0001042000b203b2049417f6a2205490d07203b204241dcf7c0001042000b203141016a21490b024020482047470d00204741016a22052047490d0a204741017422302005203020054b1b22054104200541044b1b220541ffffffff01712005464102742130200541037421050240024020470d00200441003602f8070c010b2004410436028008200420463602f807200420474103743602fc070b200441f8066a20052030200441f8076a10692004280280072105024020042802f8064101470d0020050d0f0c0b0b20042802fc062146200541037621470b204620484103746a2205200336020420052049360200204841016a224a21480240204a4102490d00034002400240024002402046204a2248417f6a224a4103746a2203280200450d00204841037420466a223141746a2802002230200328020422054d0d00204841024d0d0520462048417d6a224b4103746a2802042203200520306a4d0d01204841034d0d05203141646a280200200320306a4b0d050c010b20484103490d012003280204210520462048417d6a224b4103746a28020421030b20032005490d010b2048417e6a214b0b02400240024002402048204b41016a22034d0d0002402048204b4d0d0002402046204b4103746a224c280204220d204c2802006a2205204620034103746a224d280200224e490d000240200520424b0d00204c41046a214f203e204e4104746a2230204d280204225041047422316a21032005410474212f02402005204e6b223b20506b22052050490d00204420302031108505220520316a21310240205041014e0d00200521050c080b203b20504a0d06200521050c070b2044200320054104742231108505224120316a213120504101480d0420054101480d042032202f6a2105034002400240203141706a222f280200200341706a223b280200203b280204223c202f280204223d203d203c4b1b10880522400d00417f203d203c47203d203c491b213c0c010b417f410120404100481b213c0b2005203b202f203c417f46223c1b223d290200370200200541086a203d41086a2902003702002031202f203c1b21312030203b2003203c1b22034f0d05200541706a2105203120414b0d000c050b0b20052042418cf8c0001042000b204e2005418cf8c0001048000b204b204841fcf7c0001033000b2003204841ecf7c0001033000b20412105200321300c010b203e202f6a213d20052105034002400240200328020020052802002005280204222f2003280204223b203b202f4b1b108805223c0d00417f203b202f47203b202f491b212f0c010b417f4101203c4100481b212f0b203020032005202f417f46222f1b223b290200370200203041086a203b41086a2902003702002005200541106a202f1b2105203041106a2130200341106a2003202f1b2203203d4f0d0120052031490d000b0b20302005203120056b4170711085051a204f200d20506a360200204c204e360200204d204d41086a2048204b6b41037441706a1086051a41012148204a41014b0d000b0b2049450d060c000b0b418486c20041fc00418087c2001050000b418486c20041fc00418087c2001050000b200441f0026a41186a200b2802002203360200200441f0026a41106a200c2903002207370300200441f0026a41086a200d290300220e370300200420042903f80722513703f002200441f8036a41186a223b2003360200200441f8036a41106a223c2007370300200441f8036a41086a223d200e370300200420513703f8032001280200210520044198046a10ce014101102f2203450d09200341003a0000410041003502e0ac4220067c42adfed5e4d485fda8d8007e42218922073e02e0ac4220044190016a2009420042adfed5e4d485fda8d8004200108405200441f0006a200742a4bb99fed1a0bbb02385420042adfed5e4d485fda8d800420010840520044180016a200a420042adfed5e4d485fda8d8004200108405200441e0006a200742c5ecb3fec9ecf7c2c30085420042adfed5e4d485fda8d8004200108405200441d0006a2007200885420042adfed5e4d485fda8d8004200108405200441f8076a418de2c10041011065201441186a200b290000370000201441106a200c290000370000201441086a200d290000370000201420042900f80737000020044281808080103702ec04200420033602e804200442003703e004200441bcf5c1003602dc04200441003602d8042004200441e0006a41086a29030020042903608520087c200441d0006a41086a29030020042903508542cf829ebbefefde82147c220e423088893703d0042004200720044180016a41086a290300200429038001857c200e422088893703c8042004200441f0006a41086a29030020042903708520087c200e421088893703c0042004200720044190016a41086a290300200429039001857c200e893703b8042032280208223041176a2203417f4c0d05203228020021310240024020030d004101212f0c010b2003102f222f450d0a0b2004410036028008200420033602fc072004202f3602f807200441f8076a418b90c200411710fd02200441f8076a2031203010fd0220042802fc072138200441f8066a200520042802f807225220042802800810e7020240024020042802f8064101470d0020044198056a41186a20044198046a41186a29030037030020044198056a41106a20044198046a41106a29030037030020044198056a41086a20044198046a41086a2903003703002004200429039804370398050c010b024020042802fc062203450d0002402004290380072207422088a72230450d00200420032d00003a00fc0720304101460d00200420032d00013a00fd0720304102460d00200420032d00023a00fe0720304103460d00200420032d00033a00ff0720304104460d00200d20032d00043a000020304105460d00200441f8076a41096a20032d00053a000020304106460d00200441f8076a410a6a20032d00063a000020304107460d00201720032d00073a000020304108460d00201520032d00083a000020304109460d00201820032d00093a00002030410a460d00201920032d000a3a00002030410b460d00201a20032d000b3a00002030410c460d00200c20032d000c3a00002030410d460d00201b20032d000d3a00002030410e460d00201c20032d000e3a00002030410f460d00201d20032d000f3a000020304110460d00200441f8076a41146a223120032d00103a000020304111460d00201e20032d00113a000020304112460d00201f20032d00123a000020304113460d00200441f8076a41176a20032d00133a000020304114460d00200b20032d00143a000020304115460d00202020032d00153a000020304116460d00202120032d00163a000020304117460d00202220032d00173a000020304118460d00202320032d00183a000020304119460d00202420032d00193a00002030411a460d00202520032d001a3a00002030411b460d00202620032d001b3a00002030411c460d00200441f8076a41206a20032d001c3a00002030411d460d00202720032d001d3a00002030411e460d00202820032d001e3a00002030411f460d00202920032d001f3a000020042f00950820262d000041107472410874200428009108223041187672214b20042f01fc0720042d00fe0741107472214020042f00830820182d000041107472212f20042f018a0820312d0000411074722131200428008d082148200428018608214220042800ff072150200428029808214102402007a7450d00200310300b200420303b00ad0520044198056a41176a20304110763a0000200420313b01a60520044198056a41106a20314110763a00002004202f3b009f0520044198056a41096a202f4110763a0000200420413602b4052004204b3602b005200420483600a905200420423601a2052004205036009b05200420403b019805200420404110763a009a050c020b2007a7450d00200310300b20044198056a41186a20044198046a41186a29030037030020044198056a41106a20044198046a41106a29030037030020044198056a41086a20044198046a41086a2903003703002004200429039804370398050b200420053602b8052004200441b8046a3602bc0520322802002103200420322802083602d005200420033602cc052004200441b8056a3602c805200441d8056a41186a20044198056a41186a2239290300370300200441d8056a41106a20044198056a41106a223a290300370300200441d8056a41086a224520044198056a41086a224329030037030020042004290398053703d805200441f8076a200441c8056a4180a3c000200441d8056a10fe0220042802fc07210520042802f8072103200441f8066a200d4180011085051a024002400240024002400240024020034101460d00200441f8056a200441f8066a4180011085051a200441f8066a41186a2235203b2802002203360200200441f8066a41106a2236203c290300370300200441f8066a41086a2237203d290300370300200420042903f8033703f8062003450d0220042003417f6a223b36029007200441f8066a410020042802fc061b222f280200213002400240202f2802082231202f28020422052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b202f2005360204202f4100360200202f203036020802400240200320314107746a22304188016a28020022054106490d0020304194016a280200210520304190016a28020021300c010b20304190016a21300b02400240024002402030450d002005450d000240024020302005417f6a41186c6a220528020022300d00410021300c010b2005280208212f0b417f203b41016a22052005203b491b220541ffffffff00712005470d1020054104742205417f4c0d1020032031410c6c6a2203410c6a2802002131200341046a28020021032005102f223e450d14203e202f36020c203e2030360208203e2031360204203e2003360200200b20352802002203360200200c2036290300370300200d2037290300370300200420042903f8063703f8072005410476213f024020030d004101214a0c040b20042003417f6a223b36029008200441f8076a410020042802fc071b222f280200213002400240202f2802082231202f28020422052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b202f2005360204202f4100360200202f2030360208200320314107746a4188016a210520032031410c6c6a41046a21034101214a024002400340200328020821302003280200213102400240200528020022034106490d00200528020c2103200528020821050c010b200541086a21050b2005450d022003450d020240024020052003417f6a41186c6a220328020022050d00410021050c010b2003280208212f0b0240203f204a470d00203f417f203b41016a22032003203b491b6a2203203f490d14203f410174223b2003203b20034b1b22034104200341044b1b220341ffffffff0071200346410274213b2003410474210302400240203f0d00200441003602b0090c010b2004203e3602b009200441043602b8092004203f4104743602b4090b200441a0096a2003203b200441b0096a106920042802a809210320042802a0094101460d0220042802a409213e2003410476213f0b203e204a4104746a2203200536020820032030360204200320313602002003410c6a202f360200204a41016a214a02402004280290082203450d0020042003417f6a223b36029008200441f8076a410020042802fc071b222f280200213002400240202f2802082231202f28020422052f018a0c4f0d00200521030c010b03400240200528020022030d00410021030c020b203041016a213020052f01880c213120032105203120032f018a0c4f0d000b0b024002402030450d00203141027420036a41900c6a280200210502402030417f6a2230450d000340200528028c0c21052030417f6a22300d000b0b410021300c010b203141016a2130200321050b202f2005360204202f4100360200202f2030360208200320314107746a4188016a210520032031410c6c6a41046a21030c010b0b0240204a41144b0d00204a41014d0d06203e204a4104746a41606a21034101210503402003200541016a220510b602200341706a2103204a2005470d000c070b0b204a410176220341ffffffff00712003470d1220034104742253417f4c0d122053102f2247450d16203e41706a2134203e41506a215441002133202d214b41002148204a21440340024002402044223b417f6a22030d0041012103410021440c010b02400240203e20034104746a2203280200203e203b417e6a22444104746a2205280200222f2005280204220520032802042203200320054b1b10880522300d00417f200320054720032005491b21030c010b417f410120304100481b21030b0240024002400240024002402003417f460d002054203b4104746a21304102210303400240203b2003470d0041002144203b21030c080b024002400240202f2030280200223c203041046a28020022312005200520314b1b108805222f0d00200520314f0d010c020b202f4100480d010b203041706a2130200341016a210320312105203c212f0c010b0b203b20036b21440c010b203b410274213c2054203b4104746a210302400340024020440d00410021440c020b02400240202f20032802002231200341046a28020022302005200520304b1b108805222f0d00200520304f0d030c010b202f417f4a0d020b2044417f6a2144200341706a2103203021052031212f0c000b0b203b2044490d01203b204a4b0d02203b20446b22034101762231450d00203e20444104746a21052034203c4102746a21300340200d200541086a222f290200370300200420052902003703f807203041086a223c290200210720052030290200370200202f2007370200203c200d290300370200203020042903f807370200200541106a2105203041706a21302031417f6a22310d000b0b2044450d04200341094b0d04203b204a4b0d02203b20446b21032044417f6a2105203420444104746a21300340203b2005490d0a2030200341016a220310b6022005417f6a223120054f0d04203041706a2130203121052003410a490d000c040b0b2044203b41ccf7c0001048000b203b204a41ccf7c0001042000b203b2044417f6a2205490d06203b204a41dcf7c0001042000b203141016a21440b024020482033470d00203341016a22052033490d14203341017422302005203020054b1b22054104200541044b1b220541ffffffff01712005464102742130200541037421050240024020330d00200441003602f8070c010b20044104360280082004204b3602f807200420334103743602fc070b200441f8066a20052030200441f8076a10692004280280072105024020042802f8064101470d0020050d190c150b20042802fc06214b200541037621330b204b20484103746a2205200336020420052044360200204841016a224d21480240204d4102490d0003400240024002400240204b204d2248417f6a224d4103746a2203280200450d002048410374204b6a223141746a2802002230200328020422054d0d00204841024d0d05204b2048417d6a22504103746a2802042203200520306a4d0d01204841034d0d05203141646a280200200320306a4b0d050c010b20484103490d0120032802042105204b2048417d6a22504103746a28020421030b20032005490d010b2048417e6a21500b02400240024002402048205041016a22034d0d000240204820504d0d000240204b20504103746a2246280204224f20462802006a2205204b20034103746a224e280200224c490d0002402005204a4b0d00204641046a2149203e204c4104746a2230204e280204224241047422316a21032005410474212f02402005204c6b223b20426b22052042490d00204720302031108505220520316a21310240204241014e0d00200521050c080b203b20424a0d06200521050c070b2047200320054104742231108505224120316a213120424101480d0420054101480d042034202f6a2105034002400240203141706a222f280200200341706a223b280200203b280204223c202f280204223d203d203c4b1b10880522400d00417f203d203c47203d203c491b213c0c010b417f410120404100481b213c0b2005203b202f203c417f46223c1b223d290200370200200541086a203d41086a2902003702002031202f203c1b21312030203b2003203c1b22034f0d05200541706a2105203120414b0d000c050b0b2005204a418cf8c0001042000b204c2005418cf8c0001048000b2050204841fcf7c0001033000b2003204841ecf7c0001033000b20412105200321300c010b203e202f6a213d20052105034002400240200328020020052802002005280204222f2003280204223b203b202f4b1b108805223c0d00417f203b202f47203b202f491b212f0c010b417f4101203c4100481b212f0b203020032005202f417f46222f1b223b290200370200203041086a203b41086a2902003702002005200541106a202f1b2105203041106a2130200341106a2003202f1b2203203d4f0d0120052031490d000b0b20302005203120056b4170711085051a2049204f20426a3602002046204c360200204e204e41086a204820506b41037441706a1086051a41012148204d41014b0d000b0b2044450d050c000b0b20030d150c110b418486c20041fc00418087c2001050000b418486c20041fc00418087c2001050000b2005203b41dcf7c0001048000b0240203341ffffffff0171450d00204b10300b2053450d00204710300b204a450d01203e204a4104746a213d203e21030240034020032802002230450d03200341046a2802002131024002400240200341086a280200222f0d00200441f8076a200441f8056a2030203110ff0220042802fc07210520042802f8074101460d0420042903800821070c010b2003410c6a280200210520044100360280090240024020042d00d0064101460d004100213b0c010b200441c4056a41026a201241026a2d00003a00002037201141086a2902003703002036201141106a2902003703002035201141186a2d00003a0000200420122f00003b01c405200420112902003703f8064101213b0b20042802d406213c201020042f01c4053b0000200d20042903f806370200201041026a200441c4056a41026a2d00003a0000200d41086a2037290300370200200d41106a2036290300370200200d41186a20352802003602002004203b3a00f8072004203c3602fc07200441003602a809200420313602a409200420303602a0092005417f4c0d100240024020050d00410121300c010b2005102f2230450d150b200420053602b409200420303602b0092030202f20051085051a200420053602b80920044190096a200441f8056a200441f8076a200441a0096a200441b0096a20044180096a10800320042802940921052004280290094101460d01200420053602d406200441003a00d006200428028009210520042902840921070b02402005450d002007a7450d00200510300b200341106a2203203d470d010c040b0b2004280280092203450d00200428028409450d00200310300b0240203f41ffffffff0071450d00203e10300b200441f8056a10b1010b20052d00000e0404040304020b203f41ffffffff0071450d00203e10300b200441f8056a10b101200441f8066a41026a20042d00da0522033a0000200d200f41086a290000370300200c200f41106a290000370300200b200f41186a2d00003a0000200420042f01d80522053b01f8062004200f2900003703f807200420053b019805200420033a009a05200420042800db0536009b05201320042903f807370000201341086a200d290300370000201341106a200c290300370000201341186a200b2d00003a00000c030b200541286a280200450d01200541246a28020010300c010b200541086a280200450d00200541046a2802001030200510300c010b200510300b20044198056a20044198046a41201088052105200b2039290300370300200c203a290300370300200d204329030037030020042004290398053703f8072016200441b8046a41e000108505210302402038450d00205210300b200441f8056a41186a200b290300370300200441f8056a41106a200c290300370300200441f8056a41086a200d290300370300200420042903f8073703f805200441f8066a200341e0001085051a2032280208223041176a2203417f4c0d05203228020021310240024020030d004101212f0c010b2003102f222f450d0a0b200d4100360200200420033602fc072004202f3602f807200441f8076a418b90c200411710fd02200441f8076a2031203010fd022045200d280200360200200420042903f8073703d805200441f8076a200441f8066a41e0001085051a200441f0016a200441f8076a10c2030240024020050d00200441b8046a41086a22052045280200360200200420042903d8053703b8040240202b202c470d00202b41016a2203202b490d08202b41017422302003203020034b1b22034104200341044b1bad42187e2207422088a74541027421032007a7213002400240202b0d00200441003602f8070c010b20044104360280082004202e3602f8072004202b41186c3602fc070b20044190036a20302003200441f8076a1069200428029803210302402004280290034101470d0020030d0d0c090b200428029403212e200341186e212c0b202e202b41186c6a220320042903b804370200200528020021052003410036020c200341086a20053602000c010b200d2045280200360200200420042903d8053703f8072004410036028c0820044201370284084120102f2203450d0a2004422037029403200420033602900320044190036a200441f8056a412010642015200428029003220320042802980310640240200428029403450d00200310300b0240202b202c470d00202b41016a2203202b490d07202b41017422052003200520034b1b22034104200341044b1bad42187e2207422088a74541027421032007a7210502400240202b0d0020044100360290030c010b20044104360298032004202e360290032004202b41186c360294030b200441b8046a2005200320044190036a106920042802c0042103024020042802b8044101470d0020030d0c0c080b20042802bc04212e200341186e212c0b202e202b41186c6a220320042903f807370200200341106a200c290300370200200341086a200d2903003702000b202a41186a212a202b41016a212b0c000b0b2005203b41dcf7c0001048000b0240204741ffffffff0171450d00204610300b2043450d00204410300b2042450d02203e20424104746a2148200441f8076a41086a2130200441f8076a410172213c200441d8066a213d200441d1066a2142203e21030240034020032802002231450d04200341046a280200212f024002400240200341086a280200223b0d00200441f8076a200441f8056a2031202f10ff0220042802fc07210520042802f8074101460d0420042903800821070c010b2003410c6a2802002105200441003602f0020240024020042d00d0064101460d00410021400c010b200441c4056a41026a204241026a2d00003a0000200441f8066a41086a203d41086a290200370300200441f8066a41106a203d41106a290200370300200441f8066a41186a203d41186a2d00003a0000200420422f00003b01c4052004203d2902003703f806410121400b20042802d4062141203c20042f01c4053b0000203020042903f806370200203c41026a200441c4056a41026a2d00003a0000203041086a200441f8066a41086a290300370200203041106a200441f8066a41106a290300370200203041186a200441f8066a41186a280200360200200420403a00f807200420413602fc07200441003602a0042004202f36029c0420042031360298042005417f4c0d050240024020050d00410121310c010b2005102f2231450d0a0b2004200536029c0520042031360298052031203b20051085051a200420053602a005200441f8036a200441f8056a200441f8076a20044198046a20044198056a200441f0026a10800320042802fc03210520042802f8034101460d01200420053602d406200441003a00d00620042802f002210520042902f40221070b02402005450d002007a7450d00200510300b200341106a22032048470d010c050b0b20042802f0022203450d0020042802f402450d00200310300b0240203f41ffffffff0071450d00203e10300b200441f8056a10b1010b20394110742103201141107421312037411074212f2035411074213b02400240024020052d00000e0402020002010b200541086a280200450d01200541046a28020010300c010b200541286a280200450d00200541246a28020010300b20382003722130201020317221312036202f72212f203a203b722103200510300c030b102c000b203f41ffffffff0071450d00203e10300b200441f8056a10b10120042f01b80420042d00ba0441107472210320042f00cd04200441cf046a2d000041107472213020042f01c604200441b8046a41106a2d000041107472213120042f00bf04200441c1046a2d000041107472212f20042800bb04210c20042801c204213320042800c904210b20042802d004211420042802d40421340b200441f8076a20044190036a41e0001085051a200041176a20304110763a0000200020303b0015200041106a20314110763a0000200020313b000e200041096a202f4110763a00002000202f3b0007200041026a20034110763a0000200020033b01002000203436001c200020143600182000200b3600112000203336000a2000200c360003200441f8066a200441f8076a41e0001085051a200441f8076a200441f8066a41e0001085051a200441f0016a200441f8076a10c203200041206a200441f0016a41e0001085051a0240202b450d00202e210303400240200341046a280200450d00200328020010300b02402003410c6a2802002205450d00200341106a280200450d00200510300b200341186a2103202a41686a222a0d000b0b0240202c450d00202c41186c450d00202e10300b200441c0096a24000f0b102a000b9a0303067f017e017f200028020421012000410036020402402001450d00024020002802002202450d000340200128028c0121012002417f6a22020d000b0b024020002802082203450d004100210003400240024002400240200020012f018a01490d0041002100034041002102024020012802002204450d00200041016a210520012f0188012106200421020b024041bc01418c0120001b450d00200110300b024020020d00410021010c050b2005210020022101200620022f018a014f0d000b20022006410c6c6a41046a2104024020050d00200221010c020b200641027420026a4190016a280200210102402005417f6a2200450d000340200128028c0121012000417f6a22000d000b0b410021000c020b20012000410c6c6a41046a210420012102200021060b200641016a21000b20022006410c6c6a41086a2902002107200428020021080b2008450d022003417f6a210302402007a7450d00200810300b20030d000b0b41002102034020012802002100024041bc01418c0120021b450d00200110300b2002417f6a21022000210120000d000b0b0bf80101037f230041206b220424000240024002402002450d00200221050240034020022f01d6092106024020010d002001450d020c050b2001450d042001417f6a2101200220064102746a41d8096a280200210220052802d80921050c000b0b2000200136020c200041003602082000200536020420002001360200200041146a2006360200200041106a20023602000c010b4100210320004100360204200041106a41003602000b20002003360218200441206a24000f0b200441146a410136020020044201370204200441f4a9c2003602002004410436021c200441eca9c2003602182004200441186a360210200441fca9c200103a000bb703010a7f200028020421012000410036020402402001450d00024020002802002202450d00034020012802900221012002417f6a22020d000b0b024020002802082203450d004100210003400240024002400240200020012f018e02490d0041002100034041002102024020012802002204450d00200041016a210520012f018c022106200421020b024041c00241900220001b450d00200110300b024020020d00410021010c050b2005210020022101200620022f018e024f0d000b2002200641186c6a41046a2104024020050d00200221010c020b200641027420026a4194026a280200210102402005417f6a2200450d00034020012802900221012000417f6a22000d000b0b410021000c020b2001200041186c6a41046a210420012102200021060b200641016a21000b2002200641186c6a220241146a2802002107200241106a2802002108200241086a28020021092004280200210a0b200a450d0202402009450d00200a10300b2003417f6a210302402007450d00200810300b20030d000b0b41002102034020012802002100024041c00241900220021b450d00200110300b2002417f6a21022000210120000d000b0b0baa18030a7f027e057f230041b0026b22022400200128020821032001280204210420012802002105024002400240024002400240024002400240024002400240024002400240024020012802182206450d002004450d01200320042f018a0c490d02034002400240200428020022010d00410021010c010b200541016a210720042f01880c21030b024041bc0c418c0c20051b450d00200410300b024020010d00410221080c050b2007210520012104200320012f018a0c4f0d000b20012104200721050c020b410021090c030b41b2abc200412b41d4a8c200102d000b200341016a2101200420034107746a22074188016a210920042003410c6c6a220a41046a210b0240024020050d00200121030c010b200420014102746a418c0c6a280200210402402005417f6a2201450d000340200428028c0c21042001417f6a22010d000b0b410021030b2007418c016a2802002108200a41086a290200210c20092802002101200b280200210520024190016a20074190016a41f8001085051a0b200241086a20024190016a41f8001085051a2002200836029401200220013602900120024198016a2207200241086a41f8001085051a0240024020014106490d002002419c016a2208280200210120022802980121070c010b20024190016a21080b2001450d0420082001417f6a22013602002007200141186c6a220128020c2207450d04200241a0026a41086a200141086a280200360200200220012902003703a0020240200141106a29020042ffffffff0383500d00200710300b2006417f6a210920024190016a10d902024020050d00410021050c010b417f200941016a220120012009491bad42187e220d422088a70d07200da72201417f4c0d072001102f220e450d08200e200c370204200e2005360200200e20022903a00237020c200e41146a200241a8026a280200360200200141186e210f024020090d0041012106410021090c0b0b2004450d030240024002400240200320042f018a0c490d0041002105034041002101024020042802002208450d00200541016a210720042f01880c2103200821010b024041bc0c418c0c20051b450d00200410300b024020010d00410221070c050b2007210520012104200320012f018a0c4f0d000b200120034107746a4188016a210a20012003410c6c6a41046a210b024020070d00200121040c020b200341027420016a41900c6a280200210402402007417f6a2205450d000340200428028c0c21042005417f6a22050d000b0b410021050c020b200420034107746a4188016a210a20042003410c6c6a41046a210b200421010b200341016a21050b200120034107746a2208418c016a280200210720012003410c6c6a41086a290200210c200a2802002101200b280200210b20024190016a20084190016a41f8001085051a0b200241086a20024190016a41f8001085051a20024190016a410c6a211020024190016a41086a21114101210a0340200220073602940120022001360290012011200241086a41f80010850521030240024020014106490d00200228029c0121012002280298012103201021070c010b20024190016a2107200321030b2001450d0320072001417f6a22013602002003200141186c6a220128020c2207450d03200241a0026a41086a2203200141086a280200360200200220012902003703a0020240200141106a29020042ffffffff0383500d00200710300b2009417f6a210920024190016a10d9020240200b450d000240200f200a470d00200a417f200941016a220120012009491b6a2201200a490d0a200a41017422072001200720014b1b22014104200141044b1bad42187e220d422088a7454102742101200da7210702400240200a0d0020024100360290010c010b20024104360298012002200e360290012002200a41186c360294010b200241086a2007200120024190016a10692002280210210120022802084101460d09200228020c210e200141186e210f0b200e200a41186c6a2201200c3702042001200b360200200120022903a00237020c200141146a20032802003602002009450d0b2004450d030240024002400240200520042f018a0c490d0041002105034041002101024020042802002208450d00200541016a210720042f01880c2103200821010b024041bc0c418c0c20051b450d00200410300b024020010d00410221070c050b2007210520012104200320012f018a0c4f0d000b200120034107746a4188016a210b20012003410c6c6a41046a2112024020070d00200121040c020b200341027420016a41900c6a280200210402402007417f6a2205450d000340200428028c0c21042005417f6a22050d000b0b410021050c020b200420054107746a4188016a210b20042005410c6c6a41046a211220052103200421010b200341016a21050b200120034107746a2208418c016a280200210720012003410c6c6a41086a290200210c200b28020021012012280200210b20024190016a20084190016a41f8001085051a0b200a41016a210a200241086a20024190016a41f8001085051a0c010b0b20052103200a21060c0a0b20004200370204200041002802e88f423602002004450d0a2009450d0420024190016a410c6a210e200241a4016a210f0340024002400240200320042f018a0c4f0d0020042101200521070c010b034002400240200428020022010d00410021010c010b200541016a210720042f01880c21030b024041bc0c418c0c20051b450d00200410300b024020010d00410221010c030b2007210520012104200320012f018a0c4f0d000b0b200341016a210a200120034107746a22054188016a210b20012003410c6c6a41046a21080240024020070d0020012104200a21030c010b2001200a4102746a418c0c6a280200210402402007417f6a2201450d000340200428028c0c21042001417f6a22010d000b0b410021030b200241a0026a41086a200841086a280200360200200220082902003703a0022005418c016a2802002101200b280200210720024190016a20054190016a41f8001085051a0b2009417f6a210920024180016a41086a2205200241a0026a41086a280200360200200220022903a00237038001200241086a20024190016a41f8001085051a20024190016a41086a2005280200360200200220022903800137039001200220013602a0012002200736029c01200f200241086a41f8001085051a0240200228029401450d0020022802900110300b200e10d9024100210520090d000c050b0b41b2abc200412b41d4a8c200102d000b418486c20041fc0041dc8ac2001050000b41b2abc200412b41d4a8c200102d000b418486c20041fc0041dc8ac2001050000b034020042802002101024041bc0c418c0c20051b450d00200410300b200541016a2105200121042001450d060c000b0b20010d010b102c000b102a000b20052103410021090b02402004450d0002402009450d0020024190016a410c6a210b200241a4016a211203400240024002400240200320042f018a0c490d0041002105034041002101024020042802002208450d00200541016a210320042f01880c2107200821010b024041bc0c418c0c20051b450d00200410300b024020010d00410221010c050b2003210520012104200720012f018a0c4f0d000b200120074107746a4188016a210a20012007410c6c6a41046a2108024020030d00200121040c020b200741027420016a41900c6a280200210402402003417f6a2205450d000340200428028c0c21042005417f6a22050d000b0b410021030c020b200420034107746a4188016a210a20042003410c6c6a41046a210820032107200421010b200741016a21030b200241a0026a41086a200841086a280200360200200220082902003703a002200120074107746a2207418c016a2802002101200a280200210520024190016a20074190016a41f8001085051a0b2009417f6a210920024180016a41086a2207200241a0026a41086a280200360200200220022903a00237038001200241086a20024190016a41f8001085051a20024190016a41086a2007280200360200200220022903800137039001200220013602a0012002200536029c012012200241086a41f8001085051a0240200228029401450d0020022802900110300b200b10d90220090d000b0b41002101034020042802002105024041bc0c418c0c20011b450d00200410300b2001417f6a21012005210420050d000b0b200020063602082000200f3602042000200e3602000b200241b0026a24000bcd0301087f230041d0016b22022400200241086a200141f0001085051a200041086a200141086a28020036020020002001290200370200200241f8006a200241146a41d8001085051a0240024020022802840122034106490d0020024190016a28020021010c010b200321010b0240024020010d000240200228027c22010d004100210141002104410021050c020b20022802800121052002280278210620012104034020012f018a0c21072006450d022006417f6a2106200120074102746a418c0c6a2802002101200428028c0c21040c000b0b41a888c200412c41d488c200102d000b0240024020034106490d002002418c016a2802002108024020024190016a2802002206450d002006410c6c2109200821060340200610d4032006410c6a2106200941746a22090d000b0b2003410c6c450d01200810300c010b2003450d002002418c016a21062003410c6c21090340200610d4032006410c6a2106200941746a22090d000b0b2000410036020c200041246a2005360200200041206a20073602002000411c6a2001360200200041146a4200370200200041106a2004360200200041286a200241ec006a290200370200200041306a200241f4006a280200360200200241d0016a24000b9f07010b7f230041a0026b220124000240200028020c2202450d00200141f0006a410c6a210320014190016a210420014180026a410c6a2105034020002002417f6a36020c2000280200210602400240024020002802082207200028020422082f01d6094f0d0020082102200621090c010b034002400240200828020022020d00410021020c010b200641016a210920082f01d40921070b024041880a41d80920061b450d00200810300b024020020d00410221070c030b2009210620022108200720022f01d6094f0d000b0b200741016a21082002200741e4006c6a22064188016a210a20022007410c6c6a41046a210702402009450d00200220084102746a41d8096a280200210202402009417f6a2208450d00034020022802d80921022008417f6a22080d000b0b410021080b2005200a29020037020020014180026a41086a2209200741086a280200360200200541086a200a41086a290200370200200120072902003703800220064198016a2802002107200141f0006a2006419c016a41d0001085051a200141e0016a41186a20014180026a41186a280200360200200141e0016a41106a20014180026a41106a290300370300200141e0016a41086a200929030037030020012001290380023703e0010b200141d0006a41186a2209200141e0016a41186a280200360200200141d0006a41106a220a200141e0016a41106a290300370300200141d0006a41086a220b200141e0016a41086a290300370300200120012903e0013703502001200141f0006a41d0001085052106200020083602082000200236020420004100360200200641f0006a41186a2009280200360200200641f0006a41106a200a290300370300200641f0006a41086a200b290300370300200620062903503703702006200736028c012004200641d000108505210202402006280274450d00200628027010300b20031090040240024020062802880122074106490d00200628029001210902402006280294012202450d002002410c6c2108200921020340200210d4032002410c6a2102200841746a22080d000b0b2007410c6c450d01200910300c010b2007450d002007410c6c2108200221020340200210d4032002410c6a2102200841746a22080d000b0b024020062802d801450d0020062802d40110300b200028020c22020d000b0b2000280204210620002802002102034020062802002108024041880a41d80920021b450d00200610300b200241016a21022008210620080d000b200141a0026a24000bef8f0104077f017e507f3b7e230041a0296b2205240002402004a70d002005200210c403200528020045ad21040b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004a7450d000240024002400240024002400240024002400240024002400240024002400240024020012903004201520d0020012d00080d00200541e0216a200110db03200541286a41c8036a200241e8031085051a200541286a200541e0216a41c8031085051a20052d00f0030e0b0102050703040610101008100b200042013703002000411636020820021096010c2e0b200541d00b6a200541286a41c8031085051a20054188046a280200210620054184046a280200210720054180046a2802002108200541f8036a2802002109200541f4036a280200210a200541fc036a2802002103200541e8076a4200370300200542003702dc07200a2102024002402003450d00200a41f8036a2102200a280200220b410c470d010b0240200a200341f8036c6a22032002460d0003402002109a012003200241f8036a2202470d000b0b02402009450d00200941f8036c450d00200a10300b200541106a41106a200541d8076a41106a290300370300200541106a41086a200541d8076a41086a290300370300200520052903d8073703102006ad4220862007ad84210c200541d00b6a109c0142002104410021034101210b4101210741012106410121024101210a410121090c2d0b200541c80f6a200a41046a41f4031085051a2005200b3602e021200541e0216a410472200541c80f6a41f4031085051a20004201370300200041124102200b417f6a4107491b360208200341f8036c41887c6a220041f8036d2103200541e0216a109a0102402000450d00200341f8036c210003402002109a01200241f8036a2102200041887c6a22000d000b0b02402009450d00200941f8036c450d00200a10300b200541d8076a10dc03024020052802e8072200450d00024020052802e4072202450d00034020002802b02b21002002417f6a22020d000b0b200541003602e821200520003602e421200541003602e021200520052802ec073602ec21200541e0216a10dd030b2008200610a40102402007450d0020074198046c450d00200810300b200541d00b6a109c0141012108410021070c260b200541e0216a200541286a41c8031085051a20054188046a280200210720054184046a280200210220054180046a2802002108200541f8036a280200210a200541f4036a28020021030240200541fc036a28020022090d0041002109200541003602d80b2005200a3602d40b200520033602d00b200541c80f6a200541d00b6a10de03200541e80f6a2007360200200541e40f6a22032002360200200541106a41086a200541c80f6a41086a290300370300200541106a41106a200541c80f6a41106a290300370300200520052903c80f3703102003290200210c200541e0216a109c01420021044101210b4101210741012106410121024101210a0c2b0b20032802002106200042013703002000411241072006417f6a4107491b3602082008200710a40102402002450d0020024198046c450d00200810300b200941f8036c21022003210003402000109a01200041f8036a2100200241887c6a22020d000b0240200a450d00200a41f8036c450d00200310300b200541e0216a109c0141002108410121070c250b200541d01a6a200541286a41c8031085051a200541981e6a20054180046a41c8031085051a200541f4036a280200220b200541fc036a280200220241f8036c22036a2108200541f8036a280200210d200b210a2002450d1f200341887c6a2109200541e0216a4104722106200541d00b6a4104722107200b21020340200241f8036a210a20022802002203410c460d20200541d8076a200241046a41f4031085051a200520033602d00b2007200541d8076a41f4031085051a02402003417f6a41064b0d0020004201370300200041123602080c090b200541e0216a10c70320052802e0212102200541c80f6a200641bc071085051a20024101460d0720054188176a41106a2202200541c80f6a41106a29020037030020054188176a41086a200541c80f6a41086a290200370300200520052902c80f3703881720054188176a10dc03024020022802002202450d0002402005280294172203450d00034020022802b02b21022003417f6a22030d000b0b200541003602e821200520023602e421200541003602e0212005200528029c173602ec21200541e0216a10dd030b200941887c6a2109200541d00b6a109a01200a2102200a2008470d000c210b0b200541981e6a200541286a41c8031085051a200541f8036a280200210b200541f4036a2802002107200541fc036a2802002106200541d8076a200541286a41e8036a41c8031085051a2007200641f8036c6a210920054188046a280200210e20054184046a280200210d20054180046a280200210f200541d00b6a200541d8076a10f001200541e0216a41047221082007210a03402009200a460d050240200a280200417f6a41064b0d0020004201370300200041123602080c0c0b200541e0216a10c70320052802e0212102200541c80f6a200841bc071085051a20024101460d0a200541d01a6a41106a2202200541c80f6a41106a290200370300200541d01a6a41086a200541c80f6a41086a290200370300200520052902c80f3703d01a200541d01a6a10dc03024020022802002202450d00024020052802dc1a2203450d00034020022802b02b21022003417f6a22030d000b0b200541003602e821200520023602e421200541003602e021200520052802e41a3602ec21200541e0216a10dd030b200a200541d00b6a10df032102200a41f8036a210a2002450d000b20004201370300200041003602080c0a0b200541e0216a200541286a41c8031085051a20054188046a280200210920054184046a280200210220054180046a2802002108200541f8036a280200210a200541f4036a28020021030240200541fc036a2802002207450d0020032802002106200042013703002000411241082006417f6a4107491b3602082008200910a40102402002450d0020024198046c450d00200810300b200741f8036c21022003210003402000109a01200041f8036a2100200241887c6a22020d000b0240200a450d00200a41f8036c450d00200310300b200541e0216a109c014100210341012107410121084101210a41012109410121020c260b41002107200541003602d80b2005200a3602d40b200520033602d00b200541c80f6a200541d00b6a10de03200541e80f6a2009360200200541e40f6a22032002360200200541106a41086a200541c80f6a41086a290300370300200541106a41106a200541c80f6a41106a290300370300200520052903c80f3703102003290200210c200541e0216a109c01420021044101210b0c1f0b200541d00b6a200541286a41c8031085051a200541f8036a2903002104200541f1036a2d0000210a200541d8076a20054180046a41f0001085051a20052802d8072102200541023602d80720024102470d0b200520052802b808360288172005200541c0086a28020036028c17200541c80f6a20054188176a10e90120052802c80f22024102460d0c200541d01a6a200541c80f6a41047241dc001085051a0c1a0b200541286a41d0036a2802002108200541f4036a280200210a200541e0036a2802002110200541d8036a2802002111200541d0036a2802002112200541c0036a2802002113200541b8036a2d00002114200541a8036a2802002115200541a0036a280200211620054198036a280200211720054188036a280200211820054180036a2d00002119200541f0026a280200211a200541e8026a280200211b200541e0026a280200211c200541d0026a280200211d200541c8026a2d0000211e200541b8026a280200211f200541b0026a2802002120200541a8026a280200212120054198026a280200212220054190026a2d0000212320054180026a2802002124200541f8016a2802002125200541f0016a2802002126200541e0016a2802002127200541d8016a2d00002128200541c8016a2802002129200541c0016a280200212a200541b8016a280200212b200541a8016a280200212c200541a0016a2d0000210f20054190016a280200212d20054188016a280200212e20054180016a280200212f200541f0006a2802002130200541e8006a2d0000210e200541d8006a2802002131200541d0006a2802002132200541c8006a2802002133200541286a41106a280200213420052802e403213520052802dc03213620052802d403213720052802c403213820052802bc03213920052802ac03213a20052802a403213b200528029c03213c200528028c03213d200528028403213e20052802f402213f20052802ec02214020052802e402214120052802d402214220052802cc02214320052802bc02214420052802b402214520052802ac022146200528029c0221472005280294022148200528028402214920052802fc01214a20052802f401214b20052802e401214c20052802dc01214d20052802cc01214e20052802c401214f20052802bc01215020052802ac01215120052802a40121522005280294012153200528028c012154200528028401215520052802742156200528026c2157200528025c215820052802542159200528024c215a200528023c215b2005280234215c20052d0030210d2005290328215d0240200541286a41d4036a2802002202450d00200241f8036c2109410021020340024002400240024002400240024002400240200a20026a22032802000e0b0808080800010203040506070b200341086a280200450d07200341046a28020010300c070b200341086a280200450d06200341046a28020010300c060b200341086a109c010c050b200341086a109c010c040b200341086a280200450d03200341046a28020010300c030b0240200341086a280200450d00200341046a28020010300b200341106a2d00004106490d02200341186a280200450d02200341146a28020010300c020b200341086a109c010c010b200341086a109c01200341d0036a2d00004106490d00200341d8036a280200450d00200341d4036a28020010300b2009200241f8036a2202470d000b0b02402008450d00200841f8036c450d00200a10300b42002104410021084101210b4101210741012106410021024101210a410121094101210302400240024002400240024002400240205da70e082e00010203040506070b410021084101210741012106410021024101210a410121094101210302400240024002400240200d0e09323200010232320332040b4101210b4100210220594101470d1c2058450d1c203110300c230b4101210b41002102205c4101470d1b205b450d1b0c210b4101210b4100210220334101470d1a2032450d1a205a10300c210b2034450d20205c10300c200b4101210b41002102205c4101470d18205b0d1e0c180b0240024002400240024002400240200d0e09060600010206060306040b20594101470d052058450d05203110300c050b205c4101470d04205b0d030c040b20334101470d032032450d03205a10300c030b2034450d02205c10300c020b205c4101470d01205b450d010b203410300b410021084101210741012106410021024101210a410121094101210302400240024002400240200e0e09313100010231310331040b4101210b4100210220544101470d1b2053450d1b202d10300c220b4101210b4100210220574101470d1a2056450d1a0c1f0b4101210b41002102202f4101470d19202e450d19205510300c200b2030450d1f205710300c1f0b4101210b4100210220574101470d1720560d1c0c170b0240024002400240024002400240200d0e09060600010206060306040b20594101470d052058450d05203110300c050b205c4101470d04205b0d030c040b20334101470d032032450d03205a10300c030b2034450d02205c10300c020b205c4101470d01205b450d010b203410300b0240024002400240024002400240200e0e09060600010206060306040b20544101470d052053450d05202d10300c050b20574101470d0420560d030c040b202f4101470d03202e450d03205510300c030b2030450d02205710300c020b20574101470d012056450d010b203010300b410021084101210741012106410021024101210a410121094101210302400240024002400240200f0e09303000010230300330040b4101210b41002102204f4101470d1a204e450d1a202910300c210b4101210b4100210220524101470d192051450d190c1d0b4101210b41002102202b4101470d18202a450d18205010300c1f0b202c450d1e205210300c1e0b4101210b4100210220524101470d1620510d1a0c160b0240024002400240024002400240200d0e09060600010206060306040b20594101470d052058450d05203110300c050b205c4101470d04205b0d030c040b20334101470d032032450d03205a10300c030b2034450d02205c10300c020b205c4101470d01205b450d010b203410300b0240024002400240024002400240200e0e09060600010206060306040b20544101470d052053450d05202d10300c050b20574101470d0420560d030c040b202f4101470d03202e450d03205510300c030b2030450d02205710300c020b20574101470d012056450d010b203010300b0240024002400240024002400240200f0e09060600010206060306040b204f4101470d05204e450d05202910300c050b20524101470d0420510d030c040b202b4101470d03202a450d03205010300c030b202c450d02205210300c020b20524101470d012051450d010b202c10300b410021084101210741012106410021024101210a41012109410121030240024002400240024020280e092f2f0001022f2f032f040b4101210b41002102204a4101470d192049450d19202410300c200b4101210b41002102204d4101470d18204c450d180c1b0b4101210b4100210220264101470d172025450d17204b10300c1e0b2027450d1d204d10300c1d0b4101210b41002102204d4101470d15204c0d180c150b0240024002400240024002400240200d0e09060600010206060306040b20594101470d052058450d05203110300c050b205c4101470d04205b0d030c040b20334101470d032032450d03205a10300c030b2034450d02205c10300c020b205c4101470d01205b450d010b203410300b0240024002400240024002400240200e0e09060600010206060306040b20544101470d052053450d05202d10300c050b20574101470d0420560d030c040b202f4101470d03202e450d03205510300c030b2030450d02205710300c020b20574101470d012056450d010b203010300b0240024002400240024002400240200f0e09060600010206060306040b204f4101470d05204e450d05202910300c050b20524101470d0420510d030c040b202b4101470d03202a450d03205010300c030b202c450d02205210300c020b20524101470d012051450d010b202c10300b024002400240024002400240024020280e09060600010206060306040b204a4101470d052049450d05202410300c050b204d4101470d04204c0d030c040b20264101470d032025450d03204b10300c030b2027450d02204d10300c020b204d4101470d01204c450d010b202710300b410021084101210741012106410021024101210a41012109410121030240024002400240024020230e092e2e0001022e2e032e040b4101210b4100210220454101470d182044450d18201f10300c1f0b4101210b4100210220484101470d172047450d170c190b4101210b4100210220214101470d162020450d16204610300c1d0b2022450d1c204810300c1c0b4101210b4100210220484101470d1420470d160c140b0240024002400240024002400240200d0e09060600010206060306040b20594101470d052058450d05203110300c050b205c4101470d04205b0d030c040b20334101470d032032450d03205a10300c030b2034450d02205c10300c020b205c4101470d01205b450d010b203410300b0240024002400240024002400240200e0e09060600010206060306040b20544101470d052053450d05202d10300c050b20574101470d0420560d030c040b202f4101470d03202e450d03205510300c030b2030450d02205710300c020b20574101470d012056450d010b203010300b0240024002400240024002400240200f0e09060600010206060306040b204f4101470d05204e450d05202910300c050b20524101470d0420510d030c040b202b4101470d03202a450d03205010300c030b202c450d02205210300c020b20524101470d012051450d010b202c10300b024002400240024002400240024020280e09060600010206060306040b204a4101470d052049450d05202410300c050b204d4101470d04204c0d030c040b20264101470d032025450d03204b10300c030b2027450d02204d10300c020b204d4101470d01204c450d010b202710300b024002400240024002400240024020230e09060600010206060306040b20454101470d052044450d05201f10300c050b20484101470d0420470d030c040b20214101470d032020450d03204610300c030b2022450d02204810300c020b20484101470d012047450d010b202210300b410021084101210741012106410021024101210a410121094101210302400240024002400240201e0e092d2d0001022d2d032d040b4101210b4100210220404101470d17203f450d17201a10300c1e0b4101210b4100210220434101470d162042450d160c170b4101210b41002102201c4101470d15201b450d15204110300c1c0b201d450d1b204310300c1b0b4101210b4100210220434101470d1320420d140c130b0240024002400240024002400240200d0e09060600010206060306040b20594101470d052058450d05203110300c050b205c4101470d04205b0d030c040b20334101470d032032450d03205a10300c030b2034450d02205c10300c020b205c4101470d01205b450d010b203410300b0240024002400240024002400240200e0e09060600010206060306040b20544101470d052053450d05202d10300c050b20574101470d0420560d030c040b202f4101470d03202e450d03205510300c030b2030450d02205710300c020b20574101470d012056450d010b203010300b0240024002400240024002400240200f0e09060600010206060306040b204f4101470d05204e450d05202910300c050b20524101470d0420510d030c040b202b4101470d03202a450d03205010300c030b202c450d02205210300c020b20524101470d012051450d010b202c10300b024002400240024002400240024020280e09060600010206060306040b204a4101470d052049450d05202410300c050b204d4101470d04204c0d030c040b20264101470d032025450d03204b10300c030b2027450d02204d10300c020b204d4101470d01204c450d010b202710300b024002400240024002400240024020230e09060600010206060306040b20454101470d052044450d05201f10300c050b20484101470d0420470d030c040b20214101470d032020450d03204610300c030b2022450d02204810300c020b20484101470d012047450d010b202210300b0240024002400240024002400240201e0e09060600010206060306040b20404101470d05203f450d05201a10300c050b20434101470d0420420d030c040b201c4101470d03201b450d03204110300c030b201d450d02204310300c020b20434101470d012042450d010b201d10300b410021084101210741012106410021024101210a41012109410121030240024002400240024020190e092c2c0001022c2c032c040b4101210b41002102203b4101470d16203a450d16201510300c1d0b4101210b41002102203e4101470d15203d450d150c140b4101210b4100210220174101470d142016450d14203c1030410021020c140b2018450d11203e1030410021020c130b4101210b41002102203e4101470d12203d0d110c120b0240024002400240024002400240200d0e09060600010206060306040b20594101470d052058450d05203110300c050b205c4101470d04205b0d030c040b20334101470d032032450d03205a10300c030b2034450d02205c10300c020b205c4101470d01205b450d010b203410300b0240024002400240024002400240200e0e09060600010206060306040b20544101470d052053450d05202d10300c050b20574101470d0420560d030c040b202f4101470d03202e450d03205510300c030b2030450d02205710300c020b20574101470d012056450d010b203010300b0240024002400240024002400240200f0e09060600010206060306040b204f4101470d05204e450d05202910300c050b20524101470d0420510d030c040b202b4101470d03202a450d03205010300c030b202c450d02205210300c020b20524101470d012051450d010b202c10300b024002400240024002400240024020280e09060600010206060306040b204a4101470d052049450d05202410300c050b204d4101470d04204c0d030c040b20264101470d032025450d03204b10300c030b2027450d02204d10300c020b204d4101470d01204c450d010b202710300b024002400240024002400240024020230e09060600010206060306040b20454101470d052044450d05201f10300c050b20484101470d0420470d030c040b20214101470d032020450d03204610300c030b2022450d02204810300c020b20484101470d012047450d010b202210300b0240024002400240024002400240201e0e09060600010206060306040b20404101470d05203f450d05201a10300c050b20434101470d0420420d030c040b201c4101470d03201b450d03204110300c030b201d450d02204310300c020b20434101470d012042450d010b201d10300b024002400240024002400240024020190e09060600010206060306040b203b4101470d05203a450d05201510300c050b203e4101470d04203d0d030c040b20174101470d032016450d03203c10300c030b2018450d02203e10300c020b203e4101470d01203d450d010b201810300b410021084101210741012106410021024101210a41012109410121030240024002400240024020140e092b2b0001022b2b032b040b4101210b4100210220364101470d152035450d1520101030410021020c150b4101210b4100210220394101470d142038450d140c110b4101210b4100210220124101470d132011450d1320371030410021020c130b2013450d1020391030410021020c120b4101210b4100210220394101470d112038450d110c0e0b20054188176a200541286a41c8031085051a200541d01a6a200541f8036a41c8031085051a200541f4036a28020021094100210202400340200541d01a6a200210f201220a450d01200241016a2102200a2d00000d000b20004201370300200041063602080c050b200541981e6a200541286a41c8031085051a200541981e6a41186a220229030021042002200541d01a6a41186a29030037030020052903a81e210c200520052903e01a3703a81e20052903a01e215d200520052903d81a3703a01e20052903981e215e200520052903d01a3703981e200541981e6a41206a220b290300215f200541981e6a41286a22082903002160200541981e6a41306a22072903002161200541981e6a41386a22062903002162200541d01a6a41c0036a2903002163200541d01a6a41a0036a2903002164200541d01a6a41a8036a2903002165200541d01a6a41b0036a2903002166200541d01a6a41b8036a2903002167200541d01a6a4180036a2903002168200541d01a6a4188036a2903002169200541d01a6a4190036a290300216a200541d01a6a4198036a290300216b200541d01a6a41e0026a290300216c200541d01a6a41e8026a290300216d200541d01a6a41f0026a290300216e200541d01a6a41f8026a290300216f200541d01a6a41c0026a2903002170200541d01a6a41c8026a2903002171200541d01a6a41d0026a2903002172200541d01a6a41d8026a2903002173200541d01a6a41a0026a2903002174200541d01a6a41a8026a2903002175200541d01a6a41b0026a2903002176200541d01a6a41b8026a2903002177200541d01a6a4180026a2903002178200541d01a6a4188026a2903002179200541d01a6a4190026a290300217a200541d01a6a4198026a290300217b200541d01a6a41e0016a290300217c200541d01a6a41e8016a290300217d200541d01a6a41f0016a290300217e200541d01a6a41f8016a290300217f200541d01a6a41c0016a290300218001200541d01a6a41c8016a290300218101200541d01a6a41d0016a290300218201200541d01a6a41d8016a290300218301200541d01a6a41a0016a290300218401200541d01a6a41a8016a290300218501200541d01a6a41b0016a290300218601200541d01a6a41b8016a290300218701200541d01a6a4180016a290300218801200541d01a6a4188016a290300218901200541d01a6a4190016a290300218a01200541d01a6a4198016a290300218b01200541d01a6a41f8006a290300218c01200541d01a6a41e0006a290300218d01200541d01a6a41e8006a290300218e01200541d01a6a41f0006a290300218f01200541d01a6a41c0006a290300219001200541d01a6a41c8006a290300219101200541d01a6a41d0006a290300219201200541d01a6a41d8006a290300219301200541d01a6a41206a290300219401200541d01a6a41286a290300219501200541d01a6a41306a2903002196012006200541d01a6a41386a29030037030020072096013703002008209501370300200b209401370300200541981e6a41d8006a220b290300219401200b209301370300200541981e6a41d0006a220d290300219301200d209201370300200541981e6a41c8006a220e290300219201200e209101370300200541981e6a41c0006a220f290300219101200f209001370300200541981e6a41f0006a220f290300219001200f208f01370300200541981e6a41e8006a2228290300218f012028208e01370300200541981e6a41e0006a2223290300218e012023208d01370300200541981e6a41f8006a2223290300218d012023208c01370300200541981e6a4180016a2257290300218c01200541981e6a4188016a221e290300219501200541981e6a4190016a225c290300219601200541981e6a4198016a22192903002197012019208b01370300205c208a01370300201e2089013703002057208801370300200541981e6a41a0016a2230290300218801200541981e6a41a8016a2257290300218901200541981e6a41b0016a2234290300218a01200541981e6a41b8016a2252290300218b012052208701370300203420860137030020572085013703002030208401370300200541981e6a41c0016a225b290300218401200541981e6a41c8016a2230290300218501200541981e6a41d0016a224d290300218601200541981e6a41d8016a222c290300218701202c208301370300204d2082013703002030208101370300205b208001370300200541981e6a41e0016a2227290300218001200541981e6a41e8016a225b290300218101200541981e6a41f0016a2256290300218201200541981e6a41f8016a22482903002183012048207f3703002056207e370300205b207d3703002027207c370300200541981e6a4180026a2259290300217c200541981e6a4188026a2227290300217d200541981e6a4190026a2214290300217e200541981e6a4198026a2251290300217f2051207b3703002014207a3703002027207937030020592078370300200541981e6a41a0026a22432903002178200541981e6a41a8026a22592903002179200541981e6a41b0026a2233290300217a200541981e6a41b8026a2222290300217b20222077370300203320763703002059207537030020432074370300200541981e6a41c0026a222f2903002174200541981e6a41c8026a22432903002175200541981e6a41d0026a224c2903002176200541981e6a41d8026a2254290300217720542073370300204c207237030020432071370300202f2070370300200541981e6a41e0026a224f2903002170200541981e6a41e8026a222f2903002171200541981e6a41f0026a22322903002172200541981e6a41f8026a225829030021732058206f3703002032206e370300202f206d370300204f206c370300200541981e6a4180036a2247290300216c200541981e6a4188036a224f290300216d200541981e6a4190036a222b290300216e200541981e6a4198036a221d290300216f201d206b370300202b206a370300204f206937030020472068370300200541981e6a41a0036a223e2903002168200541981e6a41a8036a22472903002169200541981e6a41b0036a222e290300216a200541981e6a41b8036a2253290300216b20532067370300202e206637030020472065370300203e2064370300200541981e6a41c0036a223e2903002164203e2063370300200541e0216a41b8036a206b370300200541e0216a41b0036a206a370300200541e0216a41a8036a2069370300200541e0216a41a0036a2068370300200541e0216a4198036a206f370300200541e0216a4190036a206e370300200541e0216a4188036a206d370300200541e0216a4180036a206c370300200541e0216a41f8026a2073370300200541e0216a41f0026a2072370300200541e0216a41e8026a2071370300200541e0216a41e0026a2070370300200541e0216a41d8026a2077370300200541e0216a41d0026a2076370300200541e0216a41c8026a2075370300200541e0216a41c0026a2074370300200541e0216a41b8026a207b370300200541e0216a41b0026a207a370300200541e0216a41a8026a2079370300200541e0216a41a0026a2078370300200541e0216a4198026a207f370300200541e0216a4190026a207e370300200541e0216a4188026a207d370300200541e0216a4180026a207c370300200541e0216a41f8016a208301370300200541e0216a41f0016a208201370300200541e0216a41e8016a208101370300200541e0216a41e0016a208001370300200541e0216a41d8016a208701370300200541e0216a41d0016a208601370300200541e0216a41c8016a208501370300200541e0216a41c0016a208401370300200541e0216a41b8016a208b01370300200541e0216a41b0016a208a01370300200541e0216a41a8016a208901370300200541e0216a41a0016a208801370300200541e0216a4198016a209701370300200541e0216a4190016a209601370300200541e0216a4188016a209501370300200541e0216a4180016a208c01370300200541e0216a41f8006a208d01370300200541e0216a41f0006a209001370300200541e0216a41e8006a208f01370300200541e0216a41e0006a208e01370300200541e0216a41d8006a209401370300200541e0216a41d0006a209301370300200541e0216a41c8006a209201370300200541e0216a41c0006a209101370300200541e0216a41386a2062370300200541e0216a41306a2061370300200541e0216a41286a2060370300200541e0216a41206a205f370300200541e0216a41186a2004370300200541e0216a41c0036a20643703002005200c3703f0212005205d3703e8212005205e3703e021200541c80f6a200541981e6a200541e0216a10e0030240024020052903c80f4209520d00420921040c010b2002290300215e2002200541c80f6a41186a29030037030020052903a81e215d200520052903d80f3703a81e20052903a01e210c200520052903d00f3703a01e20052903981e2104200520052903c80f3703981e200629030021622007290300216120082903002160200541c80f6a41c0036a290300219401200541c80f6a41a0036a290300219301200541c80f6a41a8036a290300219501200541c80f6a41b0036a290300219601200541c80f6a41b8036a290300219701200541c80f6a4180036a290300218f01200541c80f6a4188036a290300219001200541c80f6a4190036a290300219101200541c80f6a4198036a290300219201200541c80f6a41e0026a290300218b01200541c80f6a41e8026a290300218c01200541c80f6a41f0026a290300218d01200541c80f6a41f8026a290300218e01200541c80f6a41c0026a290300218701200541c80f6a41c8026a290300218801200541c80f6a41d0026a290300218901200541c80f6a41d8026a290300218a01200541c80f6a41a0026a290300218301200541c80f6a41a8026a290300218401200541c80f6a41b0026a290300218501200541c80f6a41b8026a290300218601200541c80f6a4180026a290300217f200541c80f6a4188026a290300218001200541c80f6a4190026a290300218101200541c80f6a4198026a290300218201200541c80f6a41e0016a290300217b200541c80f6a41e8016a290300217c200541c80f6a41f0016a290300217d200541c80f6a41f8016a290300217e200541c80f6a41c0016a2903002177200541c80f6a41c8016a2903002178200541c80f6a41d0016a2903002179200541c80f6a41d8016a290300217a200541c80f6a41a0016a2903002173200541c80f6a41a8016a2903002174200541c80f6a41b0016a2903002175200541c80f6a41b8016a2903002176200541c80f6a4180016a290300216f200541c80f6a4188016a2903002170200541c80f6a4190016a2903002171200541c80f6a4198016a2903002172200541c80f6a41e0006a290300216b200541c80f6a41c0006a2903002167200541c80f6a41206a2903002163200541c80f6a41f8006a290300216c200541c80f6a41e8006a290300216a200541c80f6a41f0006a2903002168200541c80f6a41c8006a2903002169200541c80f6a41d0006a2903002164200541c80f6a41d8006a2903002165200541c80f6a41286a2903002166200541c80f6a41306a290300216d20052903b81e215f2006200541c80f6a41386a2903003703002007206d37030020082066370300200b2903002166200b2065370300200d2903002165200d2064370300200e2903002164200e2069370300200f2903002169200f2068370300202829030021682028206a3703002023290300216a2023206c370300200520633703b81e20052903d81e2163200520673703d81e20052903f81e21672005206b3703f81e2019290300216e205c290300216d201e290300216c20052903981f216b20192072370300205c2071370300201e20703703002005206f3703981f20522903002172203429030021712057290300217020052903b81f216f205220763703002034207537030020572074370300200520733703b81f202c2903002176204d29030021752030290300217420052903d81f2173202c207a370300204d207937030020302078370300200520773703d81f2048290300217a20562903002179205b290300217820052903f81f21772048207e3703002056207d370300205b207c3703002005207b3703f81f2051290300217e2014290300217d2027290300217c200529039820217b2051208201370300201420810137030020272080013703002005207f3703982020222903002182012033290300218101205929030021800120052903b820217f20222086013703002033208501370300205920840137030020052083013703b8202054290300218601204c290300218501204329030021840120052903d8202183012054208a01370300204c208901370300204320880137030020052087013703d8202058290300218a012032290300218901202f29030021880120052903f8202187012058208e013703002032208d01370300202f208c013703002005208b013703f820201d290300218e01202b290300218d01204f290300218c01200529039821218b01201d209201370300202b209101370300204f2090013703002005208f01370398212053290300219201202e290300219101204729030021900120052903b821218f012053209701370300202e209601370300204720950137030020052093013703b82120052903d82121930120052094013703d8210b20044209520d03200541d8076a200541981e6a41c8031085051a200541d00b6a200941e8031085051a200541e0216a200541d8076a200541d00b6a2003420010da0320052903e821210420052903e021210c200541c80f6a200541e0216a41106a41b0071085051a0240200c4201510d00200910304100210a4101210b41002108410121074101210641012102410121090c250b200041106a200541c80f6a41b0071085051a2000420137030020002004370308200910300c0c0b200541e4216a200541d8076a41c8031085051a200541c80f6a200541e0216a41cc031085051a2000410b3602082000410c6a200541c80f6a41cc031085051a200041f0036a200e360200200041ec036a200d360200200041e8036a200f360200200041e4036a2006360200200041e0036a200b360200200041dc036a2007360200200041d8036a41013a000020004201370300200541d00b6a109c010c0a0b200041086a200541cc0f6a41b8071085051a200042013703000b200541d00b6a109a0102402008200a460d000340200a109a01200a41f8036a210a200941887c6a22090d000b0b0240200d450d00200d41f8036c450d00200b10300b200541981e6a109c01200541d01a6a109c014100210041012107410121084101210a4101210941012103410121020c200b20054188256a20900137030020054180256a208f01370300200541e8246a208c01370300200541e0246a208b01370300200541c8246a208801370300200541c0246a208701370300200541a8246a208401370300200541a0246a20830137030020054188246a20800137030020054180246a207f370300200541e8236a207c370300200541e0236a207b370300200541c8236a2078370300200541c0236a2077370300200541a8236a2074370300200541a0236a207337030020054188236a207037030020054180236a206f370300200541e8226a206c370300200541e0226a206b370300200541c8226a2068370300200541c0226a2067370300200541a8226a2064370300200541a0226a206337030020054188226a206037030020054180226a205f370300200541a0256a20930137030020054190256a209101370300200541f0246a208d01370300200541d0246a208901370300200541b0246a20850137030020054190246a208101370300200541f0236a207d370300200541d0236a2079370300200541b0236a207537030020054190236a2071370300200541f0226a206d370300200541d0226a2069370300200541b0226a206537030020054190226a206137030020054198256a209201370300200541f8246a208e01370300200541d8246a208a01370300200541b8246a20860137030020054198246a208201370300200541f8236a207e370300200541d8236a207a370300200541b8236a207637030020054198236a2072370300200541f8226a206e370300200541d8226a206a370300200541b8226a206637030020054198226a2062370300200541f8216a205e370300200520043703e0212005200c3703e8212005205d3703f021200541e0216a109c01200042013703002000410c360208200541981e6a109c010b200910960120091030200a450d07200541d01a6a109c0120054188176a109c010c070b200041086a200541cc0f6a41b8071085051a200042013703000b200541d00b6a109c010240200e450d00200e4198046c2102200f21000340200010a00120004198046a2100200241e87b6a22020d000b0b0240200d450d00200d4198046c450d00200f10300b200541d8076a109c0102402006450d00200641f8036c21022007210003402000109a01200041f8036a2100200241887c6a22020d000b0b200b450d04200b41f8036c450d04200710300c040b2000420137030020004104360208200541286a109c0141012107410121080c170b200042013703002000421537030820021096010c1d0b200541d01a6a200541d8076a41047241dc001085051a0c0e0b200042013703002000410d360208410121000c0e0b200541981e6a109c014100210241012107410121084101210a41012109410121030c160b4100210a41012107410121080c130b20131030410021020c020b410021020c010b20181030410021020b4100210841012107410121060c0d0b201d10300c050b202210300c040b202710300c030b202c10300c020b203010300c010b203410300b410021084101210741012106410021020c060b200541e0216a200541d01a6a41dc001085051a200541981e6a410472200541e0216a41dc001085051a200520023602981e200541c80f6a200541d00b6a41c8031085051a200541e0216a200541c80f6a200a10e1030240024020052802e0214101460d0020054188176a41086a220a200541f4216a29020037030020054188176a41106a2209200541fc216a29020037030020054188176a41186a220820054184226a2802003602002005200541ec216a29020037038817200541e0216a41086a280200210720054188226a280200210220052802e4212106200541e0216a200541981e6a10e101024020052903e021220c2004580d00200042013703002000411336020820022002280200417f6a220036020020000d022002280208200228020c2802001102000240200228020c280204450d00200228020810300b200241046a22002000280200417f6a220036020020000d02200210300c020b200541e0216a200541981e6a41e0001085051a200541d01a6a41086a200529038817370300200541d01a6a41106a200a290300370300200541d01a6a41186a2009290300370300200541f01a6a2008280200360200200520073602d41a200520063602d01a200520023602f41a200541c80f6a200541e0216a200541d01a6a10e2012003427f2003290300225d4200200c200541c80f6a41106a290300200c20052802d00f1b7d22042004200c561b22047c220c200c205d541b3703000240200541bc086a280200450d0020052802b80810300b410021084101210b41012107410021060c060b200541c80f6a200541e8216a41c8031085051a200541c80f6a109c01200042013703002000410e3602080b200541981e6a10b202410021000b0240200541bc086a280200450d0020052802b80810300b02402000450d00200541d00b6a109c010b4100210941012107410121084101210a0c070b2008200a460d000340200a109a012008200a41f8036a220a470d000b0b0240200d450d00200d41f8036c450d00200b10300b200541981e6a109c01200541d01a6a109c014200210441012107410021084100210b0b410121060b410121020b4101210a410121090c050b4101210a0b410121090b41012103410121020b410121000b0240024002400240024002400240024020052d00f0030e0b000102030405060a0a0a070a0b2007450d090240200541fc036a2802002202450d00200541f4036a2802002100200241f8036c210203402000109a01200041f8036a2100200241887c6a22020d000b0b0240200541f8036a2802002200450d00200041f8036c450d0020052802f40310300b20054180046a28020020054188046a28020010a40120054184046a2802002200450d0920004198046c450d0920052802800410300c090b2008450d080240200541fc036a2802002202450d00200541f4036a2802002100200241f8036c210203402000109a01200041f8036a2100200241887c6a22020d000b0b0240200541f8036a2802002200450d00200041f8036c450d0020052802f40310300b20054180046a28020020054188046a28020010a40120054184046a2802002200450d0820004198046c450d0820052802800410300c080b2003450d070240200541fc036a2802002202450d00200541f4036a2802002100200241f8036c210203402000109a01200041f8036a2100200241887c6a22020d000b0b0240200541f8036a2802002200450d00200041f8036c450d0020052802f40310300b20054180046a28020020054188046a28020010a40120054184046a2802002200450d0720004198046c450d0720052802800410300c070b0240200541fc036a2802002202450d00200541f4036a2802002100200241f8036c210203402000109a01200041f8036a2100200241887c6a22020d000b0b200541f8036a2802002200450d06200041f8036c450d0620052802f40310300c060b2000450d050240200541fc036a2802002202450d00200541f4036a2802002100200241f8036c210203402000109a01200041f8036a2100200241887c6a22020d000b0b0240200541f8036a2802002200450d00200041f8036c450d0020052802f40310300b20054180046a109c010c050b2002450d040240200541fc036a2802002202450d00200541f4036a2802002100200241f8036c210203402000109a01200041f8036a2100200241887c6a22020d000b0b0240200541f8036a2802002200450d00200041f8036c450d0020052802f40310300b20054190046a109c01024020054188046a2802002202450d0020054180046a280200210020024198046c21020340200010a00120004198046a2100200241e87b6a22020d000b0b20054184046a2802002200450d0420004198046c450d0420052802800410300c040b2009450d030240200541e4046a280200450d00200541e0046a28020010300b2005280280044102460d0320054180046a10b2020c030b200a450d02200541f8036a109c01200541f4036a2200280200109601200028020010300c020b410121030b02400240024002400240024002400240024020052d00f0030e0b0001020304050608080807080b2003450d070240200541fc036a2802002203450d00200541f4036a2802002102200341f8036c210303402002109a01200241f8036a2102200341887c6a22030d000b0b0240200541f8036a2802002202450d00200241f8036c450d0020052802f40310300b20054180046a28020020054188046a28020010a40120054184046a2802002202450d0720024198046c450d0720052802800410300c070b2009450d060240200541fc036a2802002203450d00200541f4036a2802002102200341f8036c210303402002109a01200241f8036a2102200341887c6a22030d000b0b0240200541f8036a2802002202450d00200241f8036c450d0020052802f40310300b20054180046a28020020054188046a28020010a40120054184046a2802002202450d0620024198046c450d0620052802800410300c060b2007450d050240200541fc036a2802002203450d00200541f4036a2802002102200341f8036c210303402002109a01200241f8036a2102200341887c6a22030d000b0b0240200541f8036a2802002202450d00200241f8036c450d0020052802f40310300b20054180046a28020020054188046a28020010a40120054184046a2802002202450d0520024198046c450d0520052802800410300c050b2002450d040240200541fc036a2802002203450d00200541f4036a2802002102200341f8036c210303402002109a01200241f8036a2102200341887c6a22030d000b0b200541f8036a2802002202450d04200241f8036c450d0420052802f40310300c040b200b450d030240200541fc036a2802002203450d00200541f4036a2802002102200341f8036c210303402002109a01200241f8036a2102200341887c6a22030d000b0b0240200541f8036a2802002202450d00200241f8036c450d0020052802f40310300b20054180046a109c010c030b0240200541fc036a2802002203450d00200541f4036a2802002102200341f8036c210303402002109a01200241f8036a2102200341887c6a22030d000b0b0240200541f8036a2802002202450d00200241f8036c450d0020052802f40310300b20054190046a109c01024020054188046a2802002203450d0020054180046a280200210220034198046c21030340200210a00120024198046a2102200341e87b6a22030d000b0b20054184046a2802002202450d0220024198046c450d0220052802800410300c020b2006450d010240200541e4046a280200450d00200541e0046a28020010300b2005280280044102460d0120054180046a10b2020c010b200a450d00200541f8036a109c01200541f4036a2202280200109601200228020010300b024020080d0020004200370300200020043703080c010b200541d00b6a41106a200541106a41106a290300370300200541d00b6a41086a200541106a41086a290300370300200520052903103703d00b2008200c422088a74198046c22026a2109200ca7210b0240024020020d00200821020c010b200241e87b6a2103200541e0216a41106a2107200541286a41017221062008210202400240034020022d0000220a4108460d022005200a3a00282006200241016a4197041085051a200541e0216a2001200541d00b6a200541286a10e20320052903e821215d20052903e021210c200541c80f6a200741b0071085051a200c4201510d01200341e87b6a2103205d20047c210420024198046a22022009470d000b200921020c020b200041106a200541c80f6a41b0071085051a200042013703002000205d37030820024198046a20034198046d10a4010240200b450d00200b4198046c450d00200810300b200541d00b6a10dc03200541d00b6a41106a22022802002100200241003602002000450d02024020052802dc0b2202450d00034020002802b02b21002002417f6a22020d000b0b200541003602e821200520003602e421200541003602e0212005200541e40b6a2802003602ec21200541e0216a10dd030c020b20024198046a21020b2002200920026b4198046d10a4010240200b450d00200b4198046c450d00200810300b200541d00b6a10dc03200541e00b6a220328020021022003410036020002402002450d00024020052802dc0b2203450d00034020022802b02b21022003417f6a22030d000b0b200541003602e821200520023602e421200541003602e0212005200541e40b6a2802003602ec21200541e0216a10dd030b20004200370300200020043703080b2001109c01200541a0296a24000bfc2b01017f230041c0036b22022400024002400240024002400240024002400240024020012802000e09010203040506070800010b2002200141086a10f101200241386a200141c0006a10f101200241f0006a200141f8006a10f101200241a8016a200141b0016a10f101200241e0016a200141e8016a10f10120024198026a200141a0026a10f101200241d0026a200141d8026a10f10120024188036a20014190036a10f101200041386a200241306a290300370300200041306a200241286a290300370300200041286a200241206a290300370300200041206a200241186a290300370300200041186a200241106a290300370300200041106a200241086a29030037030020002002290300370308200041c0006a2002290338370300200041c8006a200241386a41086a290300370300200041d0006a200241386a41106a290300370300200041d8006a200241386a41186a290300370300200041e0006a200241386a41206a290300370300200041e8006a200241386a41286a290300370300200041f0006a200241386a41306a290300370300200041a8016a200241f0006a41306a290300370300200041a0016a200241f0006a41286a29030037030020004198016a200241f0006a41206a29030037030020004190016a200241f0006a41186a29030037030020004188016a200241f0006a41106a29030037030020004180016a200241f0006a41086a290300370300200041f8006a2002290370370300200041e0016a200241a8016a41306a290300370300200041d8016a200241a8016a41286a290300370300200041d0016a200241a8016a41206a290300370300200041c8016a200241a8016a41186a290300370300200041c0016a200241a8016a41106a290300370300200041b8016a200241a8016a41086a290300370300200041b0016a20022903a80137030020004198026a200241e0016a41306a29030037030020004190026a200241e0016a41286a29030037030020004188026a200241e0016a41206a29030037030020004180026a200241e0016a41186a290300370300200041f8016a200241e0016a41106a290300370300200041f0016a200241e0016a41086a290300370300200041e8016a20022903e001370300200041d0026a20024198026a41306a290300370300200041c8026a20024198026a41286a290300370300200041c0026a20024198026a41206a290300370300200041b8026a20024198026a41186a290300370300200041b0026a20024198026a41106a290300370300200041a8026a20024198026a41086a290300370300200041a0026a20022903980237030020004188036a200241d0026a41306a29030037030020004180036a200241d0026a41286a290300370300200041f8026a200241d0026a41206a290300370300200041f0026a200241d0026a41186a290300370300200041e8026a200241d0026a41106a290300370300200041e0026a200241d0026a41086a290300370300200041d8026a20022903d002370300200041c0036a20024188036a41306a290300370300200041b8036a20024188036a41286a290300370300200041b0036a20024188036a41206a290300370300200041a8036a20024188036a41186a290300370300200041a0036a20024188036a41106a29030037030020004198036a20024188036a41086a29030037030020004190036a200229038803370300200042083703000c080b200042003703000c070b20024188036a200141086a10f10120004201370300200041386a20024188036a41306a290300370300200041306a20024188036a41286a290300370300200041286a20024188036a41206a290300370300200041206a20024188036a41186a290300370300200041186a20024188036a41106a290300370300200041106a20024188036a41086a29030037030020002002290388033703080c060b200241d0026a200141086a10f10120024188036a200141c0006a10f101200041386a200241d0026a41306a290300370300200041306a200241d0026a41286a290300370300200041286a200241d0026a41206a290300370300200041206a200241d0026a41186a290300370300200041186a200241d0026a41106a290300370300200041106a200241d0026a41086a290300370300200020022903d002370308200041c0006a200229038803370300200041c8006a20024188036a41086a290300370300200041d0006a20024188036a41106a290300370300200041d8006a20024188036a41186a290300370300200041e0006a20024188036a41206a290300370300200041e8006a20024188036a41286a290300370300200041f0006a20024188036a41306a290300370300200042023703000c050b20024198026a200141086a10f101200241d0026a200141c0006a10f10120024188036a200141f8006a10f101200041386a20024198026a41306a290300370300200041306a20024198026a41286a290300370300200041286a20024198026a41206a290300370300200041206a20024198026a41186a290300370300200041186a20024198026a41106a290300370300200041106a20024198026a41086a2903003703002000200229039802370308200041c0006a20022903d002370300200041c8006a200241d0026a41086a290300370300200041d0006a200241d0026a41106a290300370300200041d8006a200241d0026a41186a290300370300200041e0006a200241d0026a41206a290300370300200041e8006a200241d0026a41286a290300370300200041f0006a200241d0026a41306a29030037030020004203370300200041a8016a20024188036a41306a290300370300200041a0016a20024188036a41286a29030037030020004198016a20024188036a41206a29030037030020004190016a20024188036a41186a29030037030020004188016a20024188036a41106a29030037030020004180016a20024188036a41086a290300370300200041f8006a2002290388033703000c040b200241e0016a200141086a10f10120024198026a200141c0006a10f101200241d0026a200141f8006a10f10120024188036a200141b0016a10f101200041386a200241e0016a41306a290300370300200041306a200241e0016a41286a290300370300200041286a200241e0016a41206a290300370300200041206a200241e0016a41186a290300370300200041186a200241e0016a41106a290300370300200041106a200241e0016a41086a290300370300200020022903e001370308200041c0006a200229039802370300200041c8006a20024198026a41086a290300370300200041d0006a20024198026a41106a290300370300200041d8006a20024198026a41186a290300370300200041e0006a20024198026a41206a290300370300200041e8006a20024198026a41286a290300370300200041f0006a20024198026a41306a290300370300200041a8016a200241d0026a41306a290300370300200041a0016a200241d0026a41286a29030037030020004198016a200241d0026a41206a29030037030020004190016a200241d0026a41186a29030037030020004188016a200241d0026a41106a29030037030020004180016a200241d0026a41086a290300370300200041f8006a20022903d002370300200041e0016a20024188036a41306a290300370300200041d8016a20024188036a41286a290300370300200041d0016a20024188036a41206a290300370300200041c8016a20024188036a41186a290300370300200041c0016a20024188036a41106a290300370300200041b8016a20024188036a41086a290300370300200041b0016a200229038803370300200042043703000c030b200241a8016a200141086a10f101200241e0016a200141c0006a10f10120024198026a200141f8006a10f101200241d0026a200141b0016a10f10120024188036a200141e8016a10f101200041386a200241a8016a41306a290300370300200041306a200241a8016a41286a290300370300200041286a200241a8016a41206a290300370300200041206a200241a8016a41186a290300370300200041186a200241a8016a41106a290300370300200041106a200241a8016a41086a290300370300200020022903a801370308200041c0006a20022903e001370300200041c8006a200241e0016a41086a290300370300200041d0006a200241e0016a41106a290300370300200041d8006a200241e0016a41186a290300370300200041e0006a200241e0016a41206a290300370300200041e8006a200241e0016a41286a290300370300200041f0006a200241e0016a41306a290300370300200041a8016a20024198026a41306a290300370300200041a0016a20024198026a41286a29030037030020004198016a20024198026a41206a29030037030020004190016a20024198026a41186a29030037030020004188016a20024198026a41106a29030037030020004180016a20024198026a41086a290300370300200041f8006a200229039802370300200041e0016a200241d0026a41306a290300370300200041d8016a200241d0026a41286a290300370300200041d0016a200241d0026a41206a290300370300200041c8016a200241d0026a41186a290300370300200041c0016a200241d0026a41106a290300370300200041b8016a200241d0026a41086a290300370300200041b0016a20022903d00237030020004198026a20024188036a41306a29030037030020004190026a20024188036a41286a29030037030020004188026a20024188036a41206a29030037030020004180026a20024188036a41186a290300370300200041f8016a20024188036a41106a290300370300200041f0016a20024188036a41086a290300370300200041e8016a200229038803370300200042053703000c020b200241f0006a200141086a10f101200241a8016a200141c0006a10f101200241e0016a200141f8006a10f10120024198026a200141b0016a10f101200241d0026a200141e8016a10f10120024188036a200141a0026a10f101200041386a200241f0006a41306a290300370300200041306a200241f0006a41286a290300370300200041286a200241f0006a41206a290300370300200041206a200241f0006a41186a290300370300200041186a200241f0006a41106a290300370300200041106a200241f0006a41086a29030037030020002002290370370308200041c0006a20022903a801370300200041c8006a200241a8016a41086a290300370300200041d0006a200241a8016a41106a290300370300200041d8006a200241a8016a41186a290300370300200041e0006a200241a8016a41206a290300370300200041e8006a200241a8016a41286a290300370300200041f0006a200241a8016a41306a290300370300200041a8016a200241e0016a41306a290300370300200041a0016a200241e0016a41286a29030037030020004198016a200241e0016a41206a29030037030020004190016a200241e0016a41186a29030037030020004188016a200241e0016a41106a29030037030020004180016a200241e0016a41086a290300370300200041f8006a20022903e001370300200041e0016a20024198026a41306a290300370300200041d8016a20024198026a41286a290300370300200041d0016a20024198026a41206a290300370300200041c8016a20024198026a41186a290300370300200041c0016a20024198026a41106a290300370300200041b8016a20024198026a41086a290300370300200041b0016a20022903980237030020004198026a200241d0026a41306a29030037030020004190026a200241d0026a41286a29030037030020004188026a200241d0026a41206a29030037030020004180026a200241d0026a41186a290300370300200041f8016a200241d0026a41106a290300370300200041f0016a200241d0026a41086a290300370300200041e8016a20022903d002370300200041d0026a20024188036a41306a290300370300200041c8026a20024188036a41286a290300370300200041c0026a20024188036a41206a290300370300200041b8026a20024188036a41186a290300370300200041b0026a20024188036a41106a290300370300200041a8026a20024188036a41086a290300370300200041a0026a200229038803370300200042063703000c010b200241386a200141086a10f101200241f0006a200141c0006a10f101200241a8016a200141f8006a10f101200241e0016a200141b0016a10f10120024198026a200141e8016a10f101200241d0026a200141a0026a10f10120024188036a200141d8026a10f101200041386a200241386a41306a290300370300200041306a200241386a41286a290300370300200041286a200241386a41206a290300370300200041206a200241386a41186a290300370300200041186a200241386a41106a290300370300200041106a200241386a41086a29030037030020002002290338370308200041c0006a2002290370370300200041c8006a200241f0006a41086a290300370300200041d0006a200241f0006a41106a290300370300200041d8006a200241f0006a41186a290300370300200041e0006a200241f0006a41206a290300370300200041e8006a200241f0006a41286a290300370300200041f0006a200241f0006a41306a290300370300200041a8016a200241a8016a41306a290300370300200041a0016a200241a8016a41286a29030037030020004198016a200241a8016a41206a29030037030020004190016a200241a8016a41186a29030037030020004188016a200241a8016a41106a29030037030020004180016a200241a8016a41086a290300370300200041f8006a20022903a801370300200041e0016a200241e0016a41306a290300370300200041d8016a200241e0016a41286a290300370300200041d0016a200241e0016a41206a290300370300200041c8016a200241e0016a41186a290300370300200041c0016a200241e0016a41106a290300370300200041b8016a200241e0016a41086a290300370300200041b0016a20022903e00137030020004198026a20024198026a41306a29030037030020004190026a20024198026a41286a29030037030020004188026a20024198026a41206a29030037030020004180026a20024198026a41186a290300370300200041f8016a20024198026a41106a290300370300200041f0016a20024198026a41086a290300370300200041e8016a200229039802370300200041d0026a200241d0026a41306a290300370300200041c8026a200241d0026a41286a290300370300200041c0026a200241d0026a41206a290300370300200041b8026a200241d0026a41186a290300370300200041b0026a200241d0026a41106a290300370300200041a8026a200241d0026a41086a290300370300200041a0026a20022903d00237030020004188036a20024188036a41306a29030037030020004180036a20024188036a41286a290300370300200041f8026a20024188036a41206a290300370300200041f0026a20024188036a41186a290300370300200041e8026a20024188036a41106a290300370300200041e0026a20024188036a41086a290300370300200041d8026a200229038803370300200042073703000b200241c0036a24000bc404020a7f027e230041b0076b22012400200028020421022000410036020402402002450d00024020002802002203450d00034020022802a82921022003417f6a22030d000b0b024020002802082204450d00200141d8036a2105200141d0036a410472210641002107200141a8076a210803400240024002400240200720022f01a629490d0041002100034041002103024020022802a0292209450d00200041016a210a20022f01a4292107200921030b024041d82941a82920001b450d00200210300b024020030d00410221030c050b200a210020032102200720032f01a6294f0d000b2003200741d0036c6a2100200320074104746a220241f8276a290300210b200241f0276a290300210c0240200a0d00200321020c020b200741027420036a41ac296a28020021020240200a417f6a2203450d00034020022802a82921022003417f6a22030d000b0b410021070c020b2002200741d0036c6a2100200220074104746a220341f8276a290300210b200341f0276a290300210c0b200741016a21070b20002802002103200141d0036a200041046a41cc031085051a0b2004417f6a2104200141046a200141d0036a41cc031085051a200120033602d0032006200141046a41cc031085051a2008200b3703002001200c3703a007024020030d002005109c0120040d010c020b024020012802d803450d0020012802d40310300b20040d000b0b41002103034020022802a0292100024041d82941a82920031b450d00200210300b2003417f6a21032000210220000d000b0b200141b0076a24000bfc0301097f230041f0076b220124000240200028020c2202450d0020014180046a2103200141f8036a4104722104034020002002417f6a36020c2000280200210502400240024020002802082206200028020422022f01ae2b4f0d00200521070c010b2002210803400240024020082802a82b22090d00410021020c010b200541016a210720022f01ac2b2106200921020b024041e02b41b02b20051b450d00200810300b024020020d00410221050c030b2007210520022108200620022f01ae2b4f0d000b0b200641016a21082002200641f8036c6a210602402007450d00200220084102746a41b02b6a280200210202402007417f6a2205450d00034020022802b02b21022005417f6a22050d000b0b410021080b20062802002105200141f8036a200641046a41f4031085051a0b200141046a200141f8036a41f4031085051a200020083602082000200236020420004100360200200120053602f8032004200141046a41f4031085051a0240024020050d002003109c010c010b200128028004450d0020012802fc0310300b024020012d00c8074106490d0020012802d007450d0020012802cc0710300b200028020c22020d000b0b2000280204210820002802002102034020082802a82b2105024041e02b41b02b20021b450d00200810300b200241016a21022005210820050d000b200141f0076a24000bd40301067f23004180046b2202240020004200370204200041106a4200370200200128020022032001280208220441f8036c6a21052001280204210620032107024002402004450d00200241086a4104722104200321010340024020012802002207410c470d00200141f8036a21070c020b200220073602082004200141046a41f4031085051a2000200241086a10ed03200141f8036a22012005470d000c020b0b20052007460d0003402007220141f8036a210702400240024002400240024002400240024020012802000e0b0808080800010203040506070b200141086a280200450d07200141046a28020010300c070b200141086a280200450d06200141046a28020010300c060b200141086a109c010c050b200141086a109c010c040b200141086a280200450d03200141046a28020010300c030b0240200141086a280200450d00200141046a28020010300b200141106a2d00004106490d02200141186a280200450d02200141146a28020010300c020b200141086a109c010c010b200141086a109c01200141d0036a2d00004106490d00200141d8036a280200450d00200141d4036a28020010300b20052007470d000b0b02402006450d00200641f8036c450d00200310300b20024180046a24000b935403037f017e4c7f230041a00a6b2202240041002103024020002802002204410b4b0d00410120047441c01971450d00200041086a2100024002400240024002400240024002400240024020012802000e09010203040506070800010b20024198076a200141086a10f101200241d0076a200141c0006a10f10120024188086a200141f8006a10f101200241c0086a200141b0016a10f101200241f8086a200141e8016a10f101200241b0096a200141a0026a10f101200241e8096a200141d8026a10f101200241086a20014190036a10f10120024188046a20024198076a41306a290300370300200241d0036a41306a20024198076a41286a290300370300200241d0036a41286a20024198076a41206a290300370300200241d0036a41206a20024198076a41186a290300370300200241d0036a41186a20024198076a41106a290300370300200241d0036a41106a20024198076a41086a290300370300200241d0036a41c0006a20022903d00737030020024198046a200241d0076a41086a290300370300200241a0046a200241d0076a41106a290300370300200241a8046a200241d0076a41186a290300370300200241b0046a200241d0076a41206a290300370300200241b8046a200241d0076a41286a290300370300200241c0046a200241d0076a41306a29030037030020022002290398073703d803200241f8046a20024188086a41306a290300370300200241f0046a20024188086a41286a290300370300200241e8046a20024188086a41206a290300370300200241e0046a20024188086a41186a290300370300200241d8046a20024188086a41106a290300370300200241d0046a20024188086a41086a290300370300200241d0036a41f8006a200229038808370300200241b0056a200241c0086a41306a290300370300200241a8056a200241c0086a41286a290300370300200241a0056a200241c0086a41206a29030037030020024198056a200241c0086a41186a29030037030020024190056a200241c0086a41106a29030037030020024188056a200241c0086a41086a290300370300200241d0036a41b0016a20022903c008370300200241e8056a200241f8086a41306a290300370300200241e0056a200241f8086a41286a290300370300200241d8056a200241f8086a41206a290300370300200241d0056a200241f8086a41186a290300370300200241c8056a200241f8086a41106a290300370300200241c0056a200241f8086a41086a290300370300200241d0036a41e8016a20022903f808370300200241a0066a200241b0096a41306a29030037030020024198066a200241b0096a41286a29030037030020024190066a200241b0096a41206a29030037030020024188066a200241b0096a41186a29030037030020024180066a200241b0096a41106a290300370300200241f8056a200241b0096a41086a290300370300200241d0036a41a0026a20022903b009370300200241d8066a200241e8096a41306a290300370300200241d0066a200241e8096a41286a290300370300200241c8066a200241e8096a41206a290300370300200241c0066a200241e8096a41186a290300370300200241b8066a200241e8096a41106a290300370300200241b0066a200241e8096a41086a290300370300200241d0036a41d8026a20022903e80937030020024190076a200241086a41306a29030037030020024188076a200241086a41286a29030037030020024180076a200241086a41206a290300370300200241f8066a200241086a41186a290300370300200241f0066a200241086a41106a290300370300200241e8066a200241086a41086a290300370300200241d0036a4190036a2002290308370300200242083703d0030c080b200242003703d0030c070b200241086a200141086a10f10120024188046a200241086a41306a290300370300200241d0036a41306a200241086a41286a290300370300200241d0036a41286a200241086a41206a290300370300200241d0036a41206a200241086a41186a290300370300200241d0036a41186a200241086a41106a290300370300200241d0036a41106a200241086a41086a290300370300200242013703d003200220022903083703d8030c060b200241e8096a200141086a10f101200241086a200141c0006a10f10120024188046a200241e8096a41306a290300370300200241d0036a41306a200241e8096a41286a290300370300200241d0036a41286a200241e8096a41206a290300370300200241d0036a41206a200241e8096a41186a290300370300200241d0036a41186a200241e8096a41106a290300370300200241d0036a41106a200241e8096a41086a290300370300200241d0036a41c0006a200229030837030020024198046a200241086a41086a290300370300200241a0046a200241086a41106a290300370300200241a8046a200241086a41186a290300370300200241b0046a200241086a41206a290300370300200241b8046a200241086a41286a290300370300200241c0046a200241086a41306a290300370300200220022903e8093703d803200242023703d0030c050b200241b0096a200141086a10f101200241e8096a200141c0006a10f101200241086a200141f8006a10f10120024188046a200241b0096a41306a290300370300200241d0036a41306a200241b0096a41286a290300370300200241d0036a41286a200241b0096a41206a290300370300200241d0036a41206a200241b0096a41186a290300370300200241d0036a41186a200241b0096a41106a290300370300200241d0036a41106a200241b0096a41086a290300370300200241d0036a41c0006a20022903e80937030020024198046a200241e8096a41086a290300370300200241a0046a200241e8096a41106a290300370300200241a8046a200241e8096a41186a290300370300200241b0046a200241e8096a41206a290300370300200241b8046a200241e8096a41286a290300370300200241c0046a200241e8096a41306a290300370300200220022903b0093703d803200241f8046a200241086a41306a290300370300200241f0046a200241086a41286a290300370300200241e8046a200241086a41206a290300370300200241e0046a200241086a41186a290300370300200241d8046a200241086a41106a290300370300200241d0046a200241086a41086a290300370300200241d0036a41f8006a2002290308370300200242033703d0030c040b200241f8086a200141086a10f101200241b0096a200141c0006a10f101200241e8096a200141f8006a10f101200241086a200141b0016a10f10120024188046a200241f8086a41306a290300370300200241d0036a41306a200241f8086a41286a290300370300200241d0036a41286a200241f8086a41206a290300370300200241d0036a41206a200241f8086a41186a290300370300200241d0036a41186a200241f8086a41106a290300370300200241d0036a41106a200241f8086a41086a290300370300200241d0036a41c0006a20022903b00937030020024198046a200241b0096a41086a290300370300200241a0046a200241b0096a41106a290300370300200241a8046a200241b0096a41186a290300370300200241b0046a200241b0096a41206a290300370300200241b8046a200241b0096a41286a290300370300200241c0046a200241b0096a41306a290300370300200220022903f8083703d803200241f8046a200241e8096a41306a290300370300200241f0046a200241e8096a41286a290300370300200241e8046a200241e8096a41206a290300370300200241e0046a200241e8096a41186a290300370300200241d8046a200241e8096a41106a290300370300200241d0046a200241e8096a41086a290300370300200241d0036a41f8006a20022903e809370300200241b0056a200241086a41306a290300370300200241a8056a200241086a41286a290300370300200241a0056a200241086a41206a29030037030020024198056a200241086a41186a29030037030020024190056a200241086a41106a29030037030020024188056a200241086a41086a290300370300200241d0036a41b0016a2002290308370300200242043703d0030c030b200241c0086a200141086a10f101200241f8086a200141c0006a10f101200241b0096a200141f8006a10f101200241e8096a200141b0016a10f101200241086a200141e8016a10f10120024188046a200241c0086a41306a290300370300200241d0036a41306a200241c0086a41286a290300370300200241d0036a41286a200241c0086a41206a290300370300200241d0036a41206a200241c0086a41186a290300370300200241d0036a41186a200241c0086a41106a290300370300200241d0036a41106a200241c0086a41086a290300370300200241d0036a41c0006a20022903f80837030020024198046a200241f8086a41086a290300370300200241a0046a200241f8086a41106a290300370300200241a8046a200241f8086a41186a290300370300200241b0046a200241f8086a41206a290300370300200241b8046a200241f8086a41286a290300370300200241c0046a200241f8086a41306a290300370300200220022903c0083703d803200241f8046a200241b0096a41306a290300370300200241f0046a200241b0096a41286a290300370300200241e8046a200241b0096a41206a290300370300200241e0046a200241b0096a41186a290300370300200241d8046a200241b0096a41106a290300370300200241d0046a200241b0096a41086a290300370300200241d0036a41f8006a20022903b009370300200241b0056a200241e8096a41306a290300370300200241a8056a200241e8096a41286a290300370300200241a0056a200241e8096a41206a29030037030020024198056a200241e8096a41186a29030037030020024190056a200241e8096a41106a29030037030020024188056a200241e8096a41086a290300370300200241d0036a41b0016a20022903e809370300200241e8056a200241086a41306a290300370300200241e0056a200241086a41286a290300370300200241d8056a200241086a41206a290300370300200241d0056a200241086a41186a290300370300200241c8056a200241086a41106a290300370300200241c0056a200241086a41086a290300370300200241d0036a41e8016a2002290308370300200242053703d0030c020b20024188086a200141086a10f101200241c0086a200141c0006a10f101200241f8086a200141f8006a10f101200241b0096a200141b0016a10f101200241e8096a200141e8016a10f101200241086a200141a0026a10f10120024188046a20024188086a41306a290300370300200241d0036a41306a20024188086a41286a290300370300200241d0036a41286a20024188086a41206a290300370300200241d0036a41206a20024188086a41186a290300370300200241d0036a41186a20024188086a41106a290300370300200241d0036a41106a20024188086a41086a290300370300200241d0036a41c0006a20022903c00837030020024198046a200241c0086a41086a290300370300200241a0046a200241c0086a41106a290300370300200241a8046a200241c0086a41186a290300370300200241b0046a200241c0086a41206a290300370300200241b8046a200241c0086a41286a290300370300200241c0046a200241c0086a41306a29030037030020022002290388083703d803200241f8046a200241f8086a41306a290300370300200241f0046a200241f8086a41286a290300370300200241e8046a200241f8086a41206a290300370300200241e0046a200241f8086a41186a290300370300200241d8046a200241f8086a41106a290300370300200241d0046a200241f8086a41086a290300370300200241d0036a41f8006a20022903f808370300200241b0056a200241b0096a41306a290300370300200241a8056a200241b0096a41286a290300370300200241a0056a200241b0096a41206a29030037030020024198056a200241b0096a41186a29030037030020024190056a200241b0096a41106a29030037030020024188056a200241b0096a41086a290300370300200241d0036a41b0016a20022903b009370300200241e8056a200241e8096a41306a290300370300200241e0056a200241e8096a41286a290300370300200241d8056a200241e8096a41206a290300370300200241d0056a200241e8096a41186a290300370300200241c8056a200241e8096a41106a290300370300200241c0056a200241e8096a41086a290300370300200241d0036a41e8016a20022903e809370300200241a0066a200241086a41306a29030037030020024198066a200241086a41286a29030037030020024190066a200241086a41206a29030037030020024188066a200241086a41186a29030037030020024180066a200241086a41106a290300370300200241f8056a200241086a41086a290300370300200241d0036a41a0026a2002290308370300200242063703d0030c010b200241d0076a200141086a10f10120024188086a200141c0006a10f101200241c0086a200141f8006a10f101200241f8086a200141b0016a10f101200241b0096a200141e8016a10f101200241e8096a200141a0026a10f101200241086a200141d8026a10f10120024188046a200241d0076a41306a290300370300200241d0036a41306a200241d0076a41286a290300370300200241d0036a41286a200241d0076a41206a290300370300200241d0036a41206a200241d0076a41186a290300370300200241d0036a41186a200241d0076a41106a290300370300200241d0036a41106a200241d0076a41086a290300370300200241d0036a41c0006a20022903880837030020024198046a20024188086a41086a290300370300200241a0046a20024188086a41106a290300370300200241a8046a20024188086a41186a290300370300200241b0046a20024188086a41206a290300370300200241b8046a20024188086a41286a290300370300200241c0046a20024188086a41306a290300370300200220022903d0073703d803200241f8046a200241c0086a41306a290300370300200241f0046a200241c0086a41286a290300370300200241e8046a200241c0086a41206a290300370300200241e0046a200241c0086a41186a290300370300200241d8046a200241c0086a41106a290300370300200241d0046a200241c0086a41086a290300370300200241d0036a41f8006a20022903c008370300200241b0056a200241f8086a41306a290300370300200241a8056a200241f8086a41286a290300370300200241a0056a200241f8086a41206a29030037030020024198056a200241f8086a41186a29030037030020024190056a200241f8086a41106a29030037030020024188056a200241f8086a41086a290300370300200241d0036a41b0016a20022903f808370300200241e8056a200241b0096a41306a290300370300200241e0056a200241b0096a41286a290300370300200241d8056a200241b0096a41206a290300370300200241d0056a200241b0096a41186a290300370300200241c8056a200241b0096a41106a290300370300200241c0056a200241b0096a41086a290300370300200241d0036a41e8016a20022903b009370300200241a0066a200241e8096a41306a29030037030020024198066a200241e8096a41286a29030037030020024190066a200241e8096a41206a29030037030020024188066a200241e8096a41186a29030037030020024180066a200241e8096a41106a290300370300200241f8056a200241e8096a41086a290300370300200241d0036a41a0026a20022903e809370300200241d8066a200241086a41306a290300370300200241d0066a200241086a41286a290300370300200241c8066a200241086a41206a290300370300200241c0066a200241086a41186a290300370300200241b8066a200241086a41106a290300370300200241b0066a200241086a41086a290300370300200241d0036a41d8026a2002290308370300200242073703d0030b200241086a2000200241d0036a10e0030240200229030822054209510d0020024188036a280200210620024180036a2802002107200241f8026a2802002108200241e8026a2802002109200241e0026a2d0000210a200241d0026a280200210b200241c8026a280200210c200241c0026a280200210d200241b0026a280200210e200241a8026a2d0000210f20024198026a280200211020024190026a280200211120024188026a2802002112200241f8016a2802002113200241f0016a2d00002114200241e0016a2802002115200241d8016a2802002116200241d0016a2802002117200241c0016a2802002118200241b8016a2d00002104200241a8016a2802002119200241a0016a280200211a20024198016a280200211b20024188016a280200211c20024180016a2d00002103200241f0006a280200211d200241e8006a280200211e200241e0006a280200211f200241d0006a2802002120200241c8006a2d00002100200241386a2802002121200241306a2802002122200241286a2802002123200241186a2802002124200228028c032125200228028403212620022802fc02212720022802ec02212820022802e402212920022802d402212a20022802cc02212b20022802c402212c20022802b402212d20022802ac02212e200228029c02212f2002280294022130200228028c02213120022802fc01213220022802f401213320022802e401213420022802dc01213520022802d401213620022802c401213720022802bc01213820022802ac01213920022802a401213a200228029c01213b200228028c01213c200228028401213d2002280274213e200228026c213f2002280264214020022802542141200228024c2142200228023c214320022802342144200228022c2145200228021c21462002280214214720022d00102101024002400240024002400240024002402005a70e080800010203040506070b0240024002400240024020010e090c0c0001020c0c030c040b20444101470d0b2043450d0b202110300c0b0b20474101470d0a2046450d0a202410300c0a0b20234101470d092022450d09204510300c090b2024450d08204710300c080b20474101470d072046450d07202410300c070b024002400240024002400240024020010e09060600010206060306040b20444101470d052043450d05202110300c050b20474101470d0420460d030c040b20234101470d032022450d03204510300c030b2024450d02204710300c020b20474101470d012046450d010b202410300b0240024002400240024020000e090b0b0001020b0b030b040b203f4101470d0a203e450d0a201d10300c0a0b20424101470d092041450d09202010300c090b201f4101470d08201e450d08204010300c080b2020450d07204210300c070b20424101470d062041450d06202010300c060b024002400240024002400240024020010e09060600010206060306040b20444101470d052043450d05202110300c050b20474101470d0420460d030c040b20234101470d032022450d03204510300c030b2024450d02204710300c020b20474101470d012046450d010b202410300b024002400240024002400240024020000e09060600010206060306040b203f4101470d05203e450d05201d10300c050b20424101470d0420410d030c040b201f4101470d03201e450d03204010300c030b2020450d02204210300c020b20424101470d012041450d010b202010300b0240024002400240024020030e090a0a0001020a0a030a040b203a4101470d092039450d09201910300c090b203d4101470d08203c450d08201c10300c080b201b4101470d07201a450d07203b10300c070b201c450d06203d10300c060b203d4101470d05203c450d05201c10300c050b024002400240024002400240024020010e09060600010206060306040b20444101470d052043450d05202110300c050b20474101470d0420460d030c040b20234101470d032022450d03204510300c030b2024450d02204710300c020b20474101470d012046450d010b202410300b024002400240024002400240024020000e09060600010206060306040b203f4101470d05203e450d05201d10300c050b20424101470d0420410d030c040b201f4101470d03201e450d03204010300c030b2020450d02204210300c020b20424101470d012041450d010b202010300b024002400240024002400240024020030e09060600010206060306040b203a4101470d052039450d05201910300c050b203d4101470d04203c0d030c040b201b4101470d03201a450d03203b10300c030b201c450d02203d10300c020b203d4101470d01203c450d010b201c10300b0240024002400240024020040e09090900010209090309040b20354101470d082034450d08201510300c080b20384101470d072037450d07201810300c070b20174101470d062016450d06203610300c060b2018450d05203810300c050b20384101470d042037450d04201810300c040b024002400240024002400240024020010e09060600010206060306040b20444101470d052043450d05202110300c050b20474101470d0420460d030c040b20234101470d032022450d03204510300c030b2024450d02204710300c020b20474101470d012046450d010b202410300b024002400240024002400240024020000e09060600010206060306040b203f4101470d05203e450d05201d10300c050b20424101470d0420410d030c040b201f4101470d03201e450d03204010300c030b2020450d02204210300c020b20424101470d012041450d010b202010300b024002400240024002400240024020030e09060600010206060306040b203a4101470d052039450d05201910300c050b203d4101470d04203c0d030c040b201b4101470d03201a450d03203b10300c030b201c450d02203d10300c020b203d4101470d01203c450d010b201c10300b024002400240024002400240024020040e09060600010206060306040b20354101470d052034450d05201510300c050b20384101470d0420370d030c040b20174101470d032016450d03203610300c030b2018450d02203810300c020b20384101470d012037450d010b201810300b0240024002400240024020140e09080800010208080308040b20304101470d07202f450d07201010300c070b20334101470d062032450d06201310300c060b20124101470d052011450d05203110300c050b2013450d04203310300c040b20334101470d032032450d03201310300c030b024002400240024002400240024020010e09060600010206060306040b20444101470d052043450d05202110300c050b20474101470d0420460d030c040b20234101470d032022450d03204510300c030b2024450d02204710300c020b20474101470d012046450d010b202410300b024002400240024002400240024020000e09060600010206060306040b203f4101470d05203e450d05201d10300c050b20424101470d0420410d030c040b201f4101470d03201e450d03204010300c030b2020450d02204210300c020b20424101470d012041450d010b202010300b024002400240024002400240024020030e09060600010206060306040b203a4101470d052039450d05201910300c050b203d4101470d04203c0d030c040b201b4101470d03201a450d03203b10300c030b201c450d02203d10300c020b203d4101470d01203c450d010b201c10300b024002400240024002400240024020040e09060600010206060306040b20354101470d052034450d05201510300c050b20384101470d0420370d030c040b20174101470d032016450d03203610300c030b2018450d02203810300c020b20384101470d012037450d010b201810300b024002400240024002400240024020140e09060600010206060306040b20304101470d05202f450d05201010300c050b20334101470d0420320d030c040b20124101470d032011450d03203110300c030b2013450d02203310300c020b20334101470d012032450d010b201310300b02400240024002400240200f0e09070700010207070307040b202b4101470d06202a450d06200b10300c060b202e4101470d05202d450d05200e10300c050b200d4101470d04200c450d04202c10300c040b200e450d03202e10300c030b202e4101470d02202d450d02200e10300c020b024002400240024002400240024020010e09060600010206060306040b20444101470d052043450d05202110300c050b20474101470d0420460d030c040b20234101470d032022450d03204510300c030b2024450d02204710300c020b20474101470d012046450d010b202410300b024002400240024002400240024020000e09060600010206060306040b203f4101470d05203e450d05201d10300c050b20424101470d0420410d030c040b201f4101470d03201e450d03204010300c030b2020450d02204210300c020b20424101470d012041450d010b202010300b024002400240024002400240024020030e09060600010206060306040b203a4101470d052039450d05201910300c050b203d4101470d04203c0d030c040b201b4101470d03201a450d03203b10300c030b201c450d02203d10300c020b203d4101470d01203c450d010b201c10300b024002400240024002400240024020040e09060600010206060306040b20354101470d052034450d05201510300c050b20384101470d0420370d030c040b20174101470d032016450d03203610300c030b2018450d02203810300c020b20384101470d012037450d010b201810300b024002400240024002400240024020140e09060600010206060306040b20304101470d05202f450d05201010300c050b20334101470d0420320d030c040b20124101470d032011450d03203110300c030b2013450d02203310300c020b20334101470d012032450d010b201310300b0240024002400240024002400240200f0e09060600010206060306040b202b4101470d05202a450d05200b10300c050b202e4101470d04202d0d030c040b200d4101470d03200c450d03202c10300c030b200e450d02202e10300c020b202e4101470d01202d450d010b200e10300b02400240024002400240200a0e09060600010206060306040b20264101470d052025450d05200610300c050b20294101470d042028450d04200910300c040b20084101470d032007450d03202710300c030b2009450d02202910300c020b20294101470d012028450d01200910300c010b200241c0036a2802002148200241b8036a2802002149200241b0036a280200214a200241a0036a280200214b20024198036a2d0000214c20022802c403214d20022802bc03214e20022802b403214f20022802a4032150200228029c032151024002400240024002400240024020010e09060600010206060306040b20444101470d052043450d05202110300c050b20474101470d0420460d030c040b20234101470d032022450d03204510300c030b2024450d02204710300c020b20474101470d012046450d010b202410300b024002400240024002400240024020000e09060600010206060306040b203f4101470d05203e450d05201d10300c050b20424101470d0420410d030c040b201f4101470d03201e450d03204010300c030b2020450d02204210300c020b20424101470d012041450d010b202010300b024002400240024002400240024020030e09060600010206060306040b203a4101470d052039450d05201910300c050b203d4101470d04203c0d030c040b201b4101470d03201a450d03203b10300c030b201c450d02203d10300c020b203d4101470d01203c450d010b201c10300b024002400240024002400240024020040e09060600010206060306040b20354101470d052034450d05201510300c050b20384101470d0420370d030c040b20174101470d032016450d03203610300c030b2018450d02203810300c020b20384101470d012037450d010b201810300b024002400240024002400240024020140e09060600010206060306040b20304101470d05202f450d05201010300c050b20334101470d0420320d030c040b20124101470d032011450d03203110300c030b2013450d02203310300c020b20334101470d012032450d010b201310300b0240024002400240024002400240200f0e09060600010206060306040b202b4101470d05202a450d05200b10300c050b202e4101470d04202d0d030c040b200d4101470d03200c450d03202c10300c030b200e450d02202e10300c020b202e4101470d01202d450d010b200e10300b0240024002400240024002400240200a0e09060600010206060306040b20264101470d052025450d05200610300c050b20294101470d0420280d030c040b20084101470d032007450d03202710300c030b2009450d02202910300c020b20294101470d012028450d010b200910300b024002400240024002400240204c0e09060600010206060306040b204e4101470d05204d450d05204810300c050b20514101470d0420500d030c040b204a4101470d032049450d03204f10300c030b204b450d02205110300c020b20514101470d012050450d010b204b10300b200542095221030b200241a00a6a240020030b9a5205167f017e067f397e2b7f23004180116b22032400200110fb0421044108210541082106024002400240024002400240024002400240200228020022070e09000102030405060708000b410021060c070b410121060c060b410221060c050b410321060c040b410421060c030b410521060c020b410621060c010b410721060b20042006200210fb046b22064b210802400240024002400240024002400240024020012802000e09000102030405060708000b410021050c070b410121050c060b410221050c050b410321050c040b410421050c030b410521050c020b410621050c010b410721050b2006200420081b21064108210402400240024002400240024002400240024020070e09000102030405060708000b410021040c070b410121040c060b410221040c050b410321040c040b410421040c030b410521040c020b410621040c010b410721040b024002400240200520064101746b20046a4109490d002000200241c8031085051a0c010b2003200241c803108505220241086a2105200241c0006a2106200241f8006a2107200241b0016a2108200241e8016a2109200241a0026a210a200241d8026a210b20024190036a210c03404100210402400240024002400240024002400240024020022802000e09080102030405060700080b200c21040c070b200521040c060b200621040c050b200721040c040b200821040c030b200921040c020b200a21040c010b200b21040b02402001290300500d002004450d0020012d000841ff01710d0020042d0000450d00200241a80a6a200210fa04024020022d00a80a2204410a460d000240024002400240024020040e09050500010205050305040b20022802cc0a4101470d0420022802d40a450d0420022802d00a10300c040b20022802ac0a4101470d0320022802b40a450d0320022802b00a10300c030b20022802c00a4101470d0220022802c80a450d0220022802c40a10300c020b20022802b00a450d0120022802ac0a10300c010b20022802ac0a4101470d0020022802b40a450d0020022802b00a10300b200241a80a6a200110f30120022d00a80a2204410a460d010240024002400240024020040e09060600010206060306040b20022802cc0a4101470d0520022802d40a450d0520022802d00a10300c050b20022802ac0a4101470d0420022802b40a450d0420022802b00a10300c040b20022802c00a4101470d0320022802c80a450d0320022802c40a10300c030b20022802b00a450d0220022802ac0a10300c020b20022802ac0a4101470d0120022802b40a450d0120022802b00a10300c010b0b200241c8036a200241c8031085051a200241a80a6a200241c8036a10fa04024020022d00a80a410a460d0020014190036a2104200141d8026a2105200141e8016a2106200141b0016a2107200141f8006a2108200141096a210d200141a0026a2109200141c0006a210a200241a80a6a41d8026a210e200241a80a6a41e8016a210f200241a80a6a41b0016a2110200241a80a6a41f8006a210c200241a80a6a41086a210b200241a80a6a4101722111200241a80a6a41a0026a2112200241a80a6a41c0006a211320022d00a80a2114034020024194076a41026a2215201141026a2d00003a0000200220112f00003b01940720022802ac0a211620022802b00a211720022802b40a211820022903b80a211920022802c00a211a20022802c40a211b20022802c80a211c20022802cc0a211d20022802d00a211e20022802d40a211f20022903d80a21202001290300212120014200370300200141186a2903002122200141286a2903002123200141306a2903002124200141386a2903002125200141c8006a2903002126200141d0006a2903002127200141d8006a2903002128200141e8006a2903002129200141f0006a290300212a2008290300212b20014188016a290300212c20014190016a290300212d20014198016a290300212e200141a8016a290300212f20072903002130200141b8016a2903002131200141c8016a2903002132200141d0016a2903002133200141d8016a290300213420062903002135200141f0016a2903002136200141f8016a290300213720014188026a290300213820014190026a290300213920014198026a290300213a200141a8026a290300213b200141b0026a290300213c200141b8026a290300213d200141c8026a290300213e200141d0026a290300213f20052903002140200141e8026a2903002141200141f0026a2903002142200141f8026a290300214320014188036a29030021442004290300214520014198036a2903002146200141a8036a2903002147200141b0036a290300214820012903c00321492001290308214a2001290310214b2001290320214c2001290340214d2001290360214e200129038001214f20012903a001215020012903c001215120012903e0012152200129038002215320012903a002215420012903c002215520012903e0022156200129038003215720012903a0032158200241a80a6a41b8036a200141b8036a290300370300200241a80a6a41b0036a2048370300200241a80a6a41a8036a2047370300200241a80a6a4198036a2046370300200241a80a6a4190036a2045370300200241a80a6a4188036a2044370300200241a80a6a41f8026a2043370300200241a80a6a41f0026a2042370300200241a80a6a41e8026a2041370300200e2040370300200241a80a6a41d0026a203f370300200241a80a6a41c8026a203e370300200241a80a6a41b8026a203d370300200241a80a6a41b0026a203c370300200241a80a6a41a8026a203b370300200241a80a6a4198026a203a370300200241a80a6a4190026a2039370300200241a80a6a4188026a2038370300200241a80a6a41f8016a2037370300200241a80a6a41f0016a2036370300200f2035370300200241a80a6a41d8016a2034370300200241a80a6a41d0016a2033370300200241a80a6a41c8016a2032370300200241a80a6a41b8016a203137030020102030370300200241a80a6a41a8016a202f370300200241a80a6a4198016a202e370300200241a80a6a4190016a202d370300200241a80a6a4188016a202c370300200c202b370300200241a80a6a41f0006a202a370300200241a80a6a41e8006a2029370300200241a80a6a41d8006a2028370300200241a80a6a41d0006a2027370300200241a80a6a41c8006a2026370300200241a80a6a41386a2025370300200241a80a6a41306a2024370300200241a80a6a41286a2023370300200241a80a6a41186a2022370300200220583703c80d200220573703a80d200220563703880d200220553703e80c200220543703c80c200220533703a80c200220523703880c200220513703e80b200220503703c80b2002204f3703a80b2002204e3703880b2002204d3703e80a2002204c3703c80a2002204b3703b80a2002204a3703b00a200220213703a80a200220493703e80d02400240024002400240024002400240024002402021a722590e080800010203040506070b200241fc106a41026a20152d00003a0000200241c0106a41086a200b41086a290300370300200241c0106a41106a200b41106a290300370300200241c0106a41186a200b41186a290300370300200241c0106a41206a200b41206a290300370300200241c0106a41286a200b41286a290300370300200241c0106a41306a200b41306a290300370300200220022f0194073b01fc102002200b2903003703c010420221210c080b200241fc106a41026a20152d00003a0000200241c0106a41086a200b41086a290300370300200241c0106a41106a200b41106a290300370300200241c0106a41186a200b41186a290300370300200241c0106a41206a200b41206a290300370300200241c0106a41286a200b41286a290300370300200241c0106a41306a200b41306a290300370300200220022f0194073b01fc102002200b2903003703c01020024188106a41306a201341306a29030037030020024188106a41286a201341286a29030037030020024188106a41206a201341206a29030037030020024188106a41186a201341186a29030037030020024188106a41106a201341106a29030037030020024188106a41086a201341086a2903003703002002201329030037038810420321210c070b200241fc106a41026a20152d00003a0000200241c0106a41086a200b41086a290300370300200241c0106a41106a200b41106a290300370300200241c0106a41186a200b41186a290300370300200241c0106a41206a200b41206a290300370300200241c0106a41286a200b41286a290300370300200241c0106a41306a200b41306a290300370300200220022f0194073b01fc102002200b2903003703c01020024188106a41306a201341306a29030037030020024188106a41286a201341286a29030037030020024188106a41206a201341206a29030037030020024188106a41186a201341186a29030037030020024188106a41106a201341106a29030037030020024188106a41086a201341086a290300370300200241d00f6a41306a200c41306a290300370300200241d00f6a41286a200c41286a290300370300200241d00f6a41206a200c41206a290300370300200241d00f6a41186a200c41186a290300370300200241d00f6a41106a200c41106a290300370300200241d00f6a41086a200c41086a29030037030020022013290300370388102002200c2903003703d00f420421210c060b200241fc106a41026a20152d00003a0000200241c0106a41086a200b41086a290300370300200241c0106a41106a200b41106a290300370300200241c0106a41186a200b41186a290300370300200241c0106a41206a200b41206a290300370300200241c0106a41286a200b41286a290300370300200241c0106a41306a200b41306a290300370300200220022f0194073b01fc102002200b2903003703c01020024188106a41306a201341306a29030037030020024188106a41286a201341286a29030037030020024188106a41206a201341206a29030037030020024188106a41186a201341186a29030037030020024188106a41106a201341106a29030037030020024188106a41086a201341086a290300370300200241d00f6a41306a200c41306a290300370300200241d00f6a41286a200c41286a290300370300200241d00f6a41206a200c41206a290300370300200241d00f6a41186a200c41186a290300370300200241d00f6a41106a200c41106a290300370300200241d00f6a41086a200c41086a29030037030020022013290300370388102002200c2903003703d00f200241980f6a41306a201041306a290300370300200241980f6a41286a201041286a290300370300200241980f6a41206a201041206a290300370300200241980f6a41186a201041186a290300370300200241980f6a41106a201041106a290300370300200241980f6a41086a201041086a290300370300200220102903003703980f420521210c050b200241fc106a41026a20152d00003a0000200241c0106a41086a200b41086a290300370300200241c0106a41106a200b41106a290300370300200241c0106a41186a200b41186a290300370300200241c0106a41206a200b41206a290300370300200241c0106a41286a200b41286a290300370300200241c0106a41306a200b41306a290300370300200220022f0194073b01fc102002200b2903003703c01020024188106a41306a201341306a29030037030020024188106a41286a201341286a29030037030020024188106a41206a201341206a29030037030020024188106a41186a201341186a29030037030020024188106a41106a201341106a29030037030020024188106a41086a201341086a290300370300200241d00f6a41306a200c41306a290300370300200241d00f6a41286a200c41286a290300370300200241d00f6a41206a200c41206a290300370300200241d00f6a41186a200c41186a290300370300200241d00f6a41106a200c41106a290300370300200241d00f6a41086a200c41086a29030037030020022013290300370388102002200c2903003703d00f200241980f6a41306a201041306a290300370300200241980f6a41286a201041286a290300370300200241980f6a41206a201041206a290300370300200241980f6a41186a201041186a290300370300200241980f6a41106a201041106a290300370300200241980f6a41086a201041086a290300370300200220102903003703980f200241e00e6a41306a200f41306a290300370300200241e00e6a41286a200f41286a290300370300200241e00e6a41206a200f41206a290300370300200241e00e6a41186a200f41186a290300370300200241e00e6a41106a200f41106a290300370300200241e00e6a41086a200f41086a2903003703002002200f2903003703e00e420621210c040b200241fc106a41026a20152d00003a0000200241c0106a41086a200b41086a290300370300200241c0106a41106a200b41106a290300370300200241c0106a41186a200b41186a290300370300200241c0106a41206a200b41206a290300370300200241c0106a41286a200b41286a290300370300200241c0106a41306a200b41306a290300370300200220022f0194073b01fc102002200b2903003703c01020024188106a41306a201341306a29030037030020024188106a41286a201341286a29030037030020024188106a41206a201341206a29030037030020024188106a41186a201341186a29030037030020024188106a41106a201341106a29030037030020024188106a41086a201341086a290300370300200241d00f6a41306a200c41306a290300370300200241d00f6a41286a200c41286a290300370300200241d00f6a41206a200c41206a290300370300200241d00f6a41186a200c41186a290300370300200241d00f6a41106a200c41106a290300370300200241d00f6a41086a200c41086a29030037030020022013290300370388102002200c2903003703d00f200241980f6a41306a201041306a290300370300200241980f6a41286a201041286a290300370300200241980f6a41206a201041206a290300370300200241980f6a41186a201041186a290300370300200241980f6a41106a201041106a290300370300200241980f6a41086a201041086a290300370300200220102903003703980f200241e00e6a41306a200f41306a290300370300200241e00e6a41286a200f41286a290300370300200241e00e6a41206a200f41206a290300370300200241e00e6a41186a200f41186a290300370300200241e00e6a41106a200f41106a290300370300200241e00e6a41086a200f41086a2903003703002002200f2903003703e00e200241a80e6a41306a201241306a290300370300200241a80e6a41286a201241286a290300370300200241a80e6a41206a201241206a290300370300200241a80e6a41186a201241186a290300370300200241a80e6a41106a201241106a290300370300200241a80e6a41086a201241086a290300370300200220122903003703a80e420721210c030b200241fc106a41026a20152d00003a0000200241c0106a41086a200b41086a290300370300200241c0106a41106a200b41106a290300370300200241c0106a41186a200b41186a290300370300200241c0106a41206a200b41206a290300370300200241c0106a41286a200b41286a290300370300200241c0106a41306a200b41306a290300370300200220022f0194073b01fc102002200b2903003703c01020024188106a41306a201341306a29030037030020024188106a41286a201341286a29030037030020024188106a41206a201341206a29030037030020024188106a41186a201341186a29030037030020024188106a41106a201341106a29030037030020024188106a41086a201341086a290300370300200241d00f6a41306a200c41306a290300370300200241d00f6a41286a200c41286a290300370300200241d00f6a41206a200c41206a290300370300200241d00f6a41186a200c41186a290300370300200241d00f6a41106a200c41106a290300370300200241d00f6a41086a200c41086a29030037030020022013290300370388102002200c2903003703d00f200241980f6a41306a201041306a290300370300200241980f6a41286a201041286a290300370300200241980f6a41206a201041206a290300370300200241980f6a41186a201041186a290300370300200241980f6a41106a201041106a290300370300200241980f6a41086a201041086a290300370300200220102903003703980f200241e00e6a41306a200f41306a290300370300200241e00e6a41286a200f41286a290300370300200241e00e6a41206a200f41206a290300370300200241e00e6a41186a200f41186a290300370300200241e00e6a41106a200f41106a290300370300200241e00e6a41086a200f41086a2903003703002002200f2903003703e00e200241a80e6a41306a201241306a290300370300200241a80e6a41286a201241286a290300370300200241a80e6a41206a201241206a290300370300200241a80e6a41186a201241186a290300370300200241a80e6a41106a201241106a290300370300200241a80e6a41086a201241086a290300370300200220122903003703a80e200241f00d6a41306a200e41306a290300370300200241f00d6a41286a200e41286a290300370300200241f00d6a41206a200e41206a290300370300200241f00d6a41186a200e41186a290300370300200241f00d6a41106a200e41106a290300370300200241f00d6a41086a200e41086a2903003703002002200e2903003703f00d420821210c020b200241a40a6a41026a220b200241b30a6a2d00003a0000200241e8096a41086a2211201341086a290300370300200241e8096a41106a2215201341106a290300370300200241e8096a41186a2259201341186a290300370300200241e8096a41206a225a201341206a290300370300200241e8096a41286a225b201341286a290300370300200241e8096a41306a225c201341306a290300370300200220022f00b10a3b01a40a200220132903003703e809200241b0096a41306a2213200c41306a290300370300200241b0096a41286a225d200c41286a290300370300200241b0096a41206a225e200c41206a290300370300200241b0096a41186a225f200c41186a290300370300200241b0096a41106a2260200c41106a290300370300200241b0096a41086a2261200c41086a290300370300200241f8086a41086a2262201041086a290300370300200241f8086a41106a2263201041106a290300370300200241f8086a41186a2264201041186a290300370300200241f8086a41206a2265201041206a290300370300200241f8086a41286a2266201041286a290300370300200241f8086a41306a2267201041306a2903003703002002200c2903003703b009200220102903003703f808200241c0086a41306a220c200f41306a290300370300200241c0086a41286a2210200f41286a290300370300200241c0086a41206a2268200f41206a290300370300200241c0086a41186a2269200f41186a290300370300200241c0086a41106a226a200f41106a290300370300200241c0086a41086a226b200f41086a29030037030020024188086a41306a226c201241306a29030037030020024188086a41286a226d201241286a29030037030020024188086a41206a226e201241206a29030037030020024188086a41186a226f201241186a29030037030020024188086a41106a2270201241106a29030037030020024188086a41086a2271201241086a2903003703002002200f2903003703c0082002201229030037038808200241d0076a41306a220f200e41306a290300370300200241d0076a41286a2272200e41286a290300370300200241d0076a41206a2273200e41206a290300370300200241d0076a41186a2274200e41186a290300370300200241d0076a41106a2275200e41106a290300370300200241d0076a41086a2276200e41086a2903003703002002200e2903003703d00720024198076a41306a2277200241e80d6a29030037030020024198076a41286a2278200241e00d6a29030037030020024198076a41206a2279200241d80d6a29030037030020024198076a41186a227a200241d00d6a29030037030020024198076a41106a227b200241c80d6a29030037030020024198076a41086a227c200241c00d6a2903003703002002200241b80d6a2903003703980702400240024002400240201441ff01710e090a0a0001020a0a030a040b201d4101470d09201f450d09201e10300c090b20164101470d082018450d08201710300c080b201a4101470d07201c450d07201b10300c070b2017450d06201610300c060b20164101470d052018450d05201710300c050b200241fc106a41026a20152d00003a0000200220022f0194073b01fc10420121210b200241a40a6a41026a2215200241fc106a41026a2d00003a0000200241e8096a41086a225a200241c0106a41086a290300370300200241e8096a41106a225b200241c0106a41106a290300370300200241e8096a41186a225c200241c0106a41186a290300370300200241e8096a41206a225d200241c0106a41206a290300370300200241e8096a41286a225e200241c0106a41286a290300370300200241e8096a41306a225f200241c0106a41306a290300370300200220022f01fc103b01a40a200220022903c0103703e809200241b0096a41306a226020024188106a41306a290300370300200241b0096a41286a226120024188106a41286a290300370300200241b0096a41206a226220024188106a41206a290300370300200241b0096a41186a226320024188106a41186a290300370300200241b0096a41106a226420024188106a41106a290300370300200241b0096a41086a226520024188106a41086a290300370300200241f8086a41086a2266200241d00f6a41086a290300370300200241f8086a41106a2267200241d00f6a41106a290300370300200241f8086a41186a2268200241d00f6a41186a290300370300200241f8086a41206a2269200241d00f6a41206a290300370300200241f8086a41286a226a200241d00f6a41286a290300370300200241f8086a41306a226b200241d00f6a41306a29030037030020022002290388103703b009200220022903d00f3703f808200241c0086a41306a226c200241980f6a41306a290300370300200241c0086a41286a226d200241980f6a41286a290300370300200241c0086a41206a226e200241980f6a41206a290300370300200241c0086a41186a226f200241980f6a41186a290300370300200241c0086a41106a2270200241980f6a41106a290300370300200241c0086a41086a2271200241980f6a41086a29030037030020024188086a41306a2272200241e00e6a41306a29030037030020024188086a41286a2273200241e00e6a41286a29030037030020024188086a41206a2274200241e00e6a41206a29030037030020024188086a41186a2275200241e00e6a41186a29030037030020024188086a41106a2276200241e00e6a41106a29030037030020024188086a41086a2277200241e00e6a41086a290300370300200220022903980f3703c008200220022903e00e37038808200241d0076a41306a2278200241a80e6a41306a290300370300200241d0076a41286a2279200241a80e6a41286a290300370300200241d0076a41206a227a200241a80e6a41206a290300370300200241d0076a41186a227b200241a80e6a41186a290300370300200241d0076a41106a227c200241a80e6a41106a290300370300200241d0076a41086a227d200241a80e6a41086a290300370300200220022903a80e3703d00720024198076a41306a227e200241f00d6a41306a29030037030020024198076a41286a227f200241f00d6a41286a29030037030020024198076a41206a228001200241f00d6a41206a29030037030020024198076a41186a228101200241f00d6a41186a29030037030020024198076a41106a228201200241f00d6a41106a29030037030020024198076a41086a228301200241f00d6a41086a290300370300200220022903f00d3703980702402059417f6a4107490d00200241a80a6a109c010b2001109c01200120143a000820012021370300200120203703382001201f3602342001201e3602302001201d36022c2001201c3602282001201b3602242001201a3602202001201937031820012018360214200120173602102001201636020c200d20022f01a40a3b0000200d41026a20152d00003a0000200a20022903e809370300200a41086a205a290300370300200a41106a205b290300370300200a41186a205c290300370300200a41206a205d290300370300200a41286a205e290300370300200a41306a205f290300370300200841306a2060290300370300200841286a2061290300370300200841206a2062290300370300200841186a2063290300370300200841106a2064290300370300200841086a2065290300370300200820022903b009370300200720022903f808370300200741086a2066290300370300200741106a2067290300370300200741186a2068290300370300200741206a2069290300370300200741286a206a290300370300200741306a206b290300370300200641306a206c290300370300200641286a206d290300370300200641206a206e290300370300200641186a206f290300370300200641106a2070290300370300200641086a2071290300370300200620022903c008370300200941306a2072290300370300200941286a2073290300370300200941206a2074290300370300200941186a2075290300370300200941106a2076290300370300200941086a20772903003703002009200229038808370300200541306a2078290300370300200541286a2079290300370300200541206a207a290300370300200541186a207b290300370300200541106a207c290300370300200541086a207d290300370300200520022903d007370300200441306a207e290300370300200441286a207f290300370300200441206a208001290300370300200441186a208101290300370300200441106a208201290300370300200441086a2083012903003703002004200229039807370300200241a80a6a200241c8036a10fa0420022d00a80a2214410a470d000b0b200241c8036a109c01200042093703000b20034180116a24000f0b2001109c012001204a3c000820012021370300200120233e02282001204c4220883e02242001204c3e0220200d20022f01a40a3b0000200d41026a200b2d00003a0000200120243e0230200120234220883e022c2001204b3e02102001204a4220883e020c200a20022903e809370300200a41086a2011290300370300200a41106a2015290300370300200a41186a2059290300370300200a41206a205a290300370300200a41286a205b290300370300200a41306a205c29030037030020012025370338200120244220883e0234200120223703182001204b4220883e0214200841306a2013290300370300200841286a205d290300370300200841206a205e290300370300200841186a205f290300370300200841106a2060290300370300200841086a2061290300370300200820022903b009370300200720022903f808370300200741086a2062290300370300200741106a2063290300370300200741186a2064290300370300200741206a2065290300370300200741286a2066290300370300200741306a2067290300370300200641306a200c290300370300200641286a2010290300370300200641206a2068290300370300200641186a2069290300370300200641106a206a290300370300200641086a206b290300370300200620022903c008370300200941306a206c290300370300200941286a206d290300370300200941206a206e290300370300200941186a206f290300370300200941106a2070290300370300200941086a20712903003703002009200229038808370300200541306a200f290300370300200541286a2072290300370300200541206a2073290300370300200541186a2074290300370300200541106a2075290300370300200541086a2076290300370300200520022903d007370300200441306a2077290300370300200441286a2078290300370300200441206a2079290300370300200441186a207a290300370300200441106a207b290300370300200441086a207c290300370300200420022903980737030041c09fc2004130200241a80a6a41f09fc2004180a0c2001034000b9d3723027f017e037f017e027f017e067f017e037f017e077f017e037f017e077f017e037f017e077f017e037f017e077f017e037f017e077f017e037f017e067f017e037f017e0e7f230041c0056b22032400024002400240200241ff01714101460d00200341c4006a41026a2001410b6a2d00003a0000200320012f00093b0144200141106a2800002104200141186a2900002105200141206a2800002106200141286a2800002107200141306a2800002108200141386a2900002109200141c0006a2d0000210a20012d0008210b2001290300210c200128000c210d2001280014210e2001280024210f200128002c211020012800342111200341c0006a41026a200141c3006a2d00003a00002003413c6a41026a200141fb006a2d00003a0000200320012f00413b0140200320012f00793b013c200141f8006a2d00002112200141f0006a2900002113200141e8006a2800002114200141e0006a2800002115200141d8006a2800002116200141d0006a2900002117200141c8006a2800002118200128006c21192001280064211a200128005c211b200128004c211c2001280044211d200141b0016a2d0000211e200141a8016a290000211f200141a0016a280000212020014198016a280000212120014190016a280000212220014188016a290000212320014180016a280000212420012800a4012125200128009c01212620012800940121272001280084012128200128007c2129200341386a41026a200141b3016a2d00003a0000200320012f00b1013b0138200141e8016a2d0000212a200141e0016a290000212b200141d8016a280000212c200141d0016a280000212d200141c8016a280000212e200141c0016a290000212f200141b8016a280000213020012800dc01213120012800d401213220012800cc01213320012800bc01213420012800b4012135200341346a41026a200141eb016a2d00003a0000200320012f00e9013b0134200141a0026a2d0000213620014198026a290000213720014190026a280000213820014188026a280000213920014180026a280000213a200141f8016a290000213b200141f0016a280000213c200128009402213d200128008c02213e200128008402213f20012800f401214020012800ec012141200341306a41026a200141a3026a2d00003a0000200320012f00a1023b0130200141d8026a2d00002142200141d0026a2900002143200141c8026a2800002144200141c0026a2800002145200141b8026a2800002146200141b0026a2900002147200141a8026a280000214820012800cc02214920012800c402214a20012800bc02214b20012800ac02214c20012800a402214d2003412c6a41026a200141db026a2d00003a0000200320012f00d9023b012c20014190036a2d0000214e20014188036a290000214f20014180036a2800002150200141f8026a2800002151200141f0026a2800002152200141e8026a2900002153200141e0026a2800002154200128008403215520012800fc02215620012800f402215720012800e402215820012800dc022159200341286a41026a20014193036a2d00003a0000200320012f0091033b0128200141c0036a290000215a200141b8036a280000215b200141b0036a280000215c200141a8036a280000215d200141a0036a290000215e20014198036a280000215f20012800bc03216020012800b403216120012800ac032162200128009c03216320012800940321010c010b20034190056a41026a2001410b6a2d00003a0000200320012f00093b019005200141106a2800002104200141186a2900002105200141206a2800002106200141286a2800002107200141306a2800002108200141386a2900002109200141c0006a2d0000210a20012d0008210b200128000c210d2001280014210e2001280024210f200128002c2110200128003421112001290300210c2003418c056a41026a200141c3006a2d00003a000020034188056a41026a200141fb006a2d00003a0000200320012f00413b018c05200320012f00793b018805200141c8006a2800002118200141d0006a2900002117200141d8006a2800002116200141e0006a2800002115200141e8006a2800002114200141f0006a2900002113200141f8006a2d000021122001280044211d200128004c211c200128005c211b2001280064211a200128006c211920034184056a41026a2264200141b3016a2d00003a0000200320012f00b1013b018405200141b0016a2d0000211e200141a8016a290000211f200141a0016a280000212020014198016a280000212120014190016a280000212220014188016a290000212320014180016a2800002124200141e8016a2d0000212a200141e0016a290000212b200141d8016a280000212c200141d0016a280000212d200141c8016a280000212e200141c0016a290000212f200141b8016a280000213020012800a4012125200128009c01212620012800940121272001280084012128200128007c212920012800dc01213120012800d401213220012800cc01213320012800bc01213420012800b401213520034180056a41026a2265200141eb016a2d00003a0000200320012f00e9013b018005200141a0026a2d0000213620014198026a290000213720014190026a280000213820014188026a280000213920014180026a280000213a200141f8016a290000213b200141f0016a280000213c200128009402213d200128008c02213e200128008402213f20012800f401214020012800ec012141200341fc046a41026a2266200141a3026a2d00003a0000200320012f00a1023b01fc04200141d8026a2d00002142200141d0026a2900002143200141c8026a2800002144200141c0026a2800002145200141b8026a2800002146200141b0026a2900002147200141a8026a280000214820012800cc02214920012800c402214a20012800bc02214b20012800ac02214c20012800a402214d200341f8046a41026a2267200141db026a2d00003a0000200320012f00d9023b01f80420014190036a2d0000214e20014188036a290000214f20014180036a2800002150200141f8026a2800002151200141f0026a2800002152200141e8026a2900002153200141e0026a2800002154200128008403215520012800fc02215620012800f402215720012800e402215820012800dc022159200341f4046a41026a226820014193036a2d00003a0000200320012f0091033b01f404200141f9006a2169200141c1006a216a200141096a216b200141c0036a290000215a200141b8036a280000215b200141b0036a280000215c200141a8036a280000215d200141a0036a290000215e20014198036a280000215f20012800bc03216020012800b403216120012800ac032162200128009c03216320012800940321010240200c4201520d00200b41ff01710d0020034196056a41003a00002003410036009b052003410036029805200341003b0194050b200341c8006a41c0006a200a3a0000200341c8006a41386a2009370300200341c8006a41306a2008360200200341c8006a41286a2007360200200341c8006a41206a2006360200200341c8006a41186a2005370300200341c8006a41106a2004360200200341c8006a410b6a206b41026a2d00003a0000200341c8006a41c3006a206a41026a2d00003a00002003201136027c200320103602742003200f36026c2003200e36025c2003200d3602542003206b2f00003b00512003206a2f00003b0089012003200b3a00502003200c370348200341c8006a41f8006a20123a0000200341c8006a41f0006a2013370300200341c8006a41e8006a2014360200200341c8006a41e0006a2015360200200341c8006a41d8006a2016360200200341c8006a41d0006a2017370300200341c8006a41c8006a2018360200200341c8006a4180016a2024360200200341c8006a4188016a2023370300200341c8006a4190016a2022360200200341c8006a4198016a2021360200200341c8006a41a0016a2020360200200341c8006a41a8016a201f370300200341c8006a41b0016a201e3a0000200341c8006a41fb006a206941026a2d00003a0000200320193602b4012003201a3602ac012003201b3602a4012003201c360294012003201d36028c01200320293602c401200320283602cc01200320273602dc01200320263602e401200320253602ec01200320692f00003b00c101200341c8006a41e8016a202a3a0000200341c8006a41e0016a202b370300200341c8006a41d8016a202c360200200341c8006a41d0016a202d360200200341c8006a41c8016a202e360200200341c8006a41c0016a202f370300200341c8006a41b8016a2030360200200341c8006a41b3016a20642d00003a0000200341c8006a41eb016a20652d00003a0000200320313602a4022003203236029c0220032033360294022003203436028402200320353602fc01200320032f0184053b00f901200320032f0180053b00b102200341c8006a41a0026a20363a0000200341c8006a4198026a2037370300200341c8006a4190026a2038360200200341c8006a4188026a2039360200200341c8006a4180026a203a360200200341c8006a41f8016a203b370300200341c8006a41f0016a203c3602002003203d3602dc022003203e3602d4022003203f3602cc02200320403602bc02200320413602b402200341c8006a41a3026a20662d00003a0000200320032f01fc043b00e902200341c8006a41d8026a20423a0000200341c8006a41d0026a2043370300200341c8006a41c8026a2044360200200341c8006a41c0026a2045360200200341c8006a41b8026a2046360200200341c8006a41b0026a2047370300200341c8006a41a8026a204836020020032049360294032003204a36028c032003204b360284032003204c3602f4022003204d3602ec02200341c8006a41db026a20672d00003a0000200320032f01f8043b00a103200341c8006a4190036a204e3a0000200341c8006a4188036a204f370300200341c8006a4180036a2050360200200341c8006a41f8026a2051360200200341c8006a41f0026a2052360200200341c8006a41e8026a2053370300200341c8006a41e0026a2054360200200320553602cc03200320563602c403200320573602bc03200320583602ac03200320593602a403200341c8006a4193036a20682d00003a0000200320032f01f4043b00d903200341c8006a41c0036a205a370300200341c8006a41b8036a205b360200200341c8006a41b0036a205c360200200341c8006a41a8036a205d360200200341c8006a41a0036a205e370300200341c8006a4198036a205f3602002003206036028404200320613602fc03200320623602f403200320633602e403200320013602dc0302400240200c420151200b41ff0171457122690d00200341e8046a41026a20034190056a41026a2d00003a0000200341e4046a41026a2003418c056a41026a2d00003a0000200341e0046a41026a20034188056a41026a2d00003a0000200341dc046a41026a20034184056a41026a2d00003a0000200341d8046a41026a20034180056a41026a2d00003a0000200320032f0190053b01e804200320032f018c053b01e404200320032f0188053b01e004200320032f0184053b01dc04200320032f0180053b01d804200341d4046a41026a200341fc046a41026a2d00003a0000200341d0046a41026a200341f8046a41026a2d00003a0000200341cc046a41026a200341f4046a41026a2d00003a0000200320032f01fc043b01d404200320032f01f8043b01d004200320032f01f4043b01cc040c010b200341e8046a41026a20034194056a41026a2d00003a00002003200328009b053600ef0420032003280298053602ec04200320032f0194053b01e804200341c8006a109c014200210c4100210d410021044100210e4100210b420021050b200341c0046a41026a226a200341e8046a41026a2d00003a0000200320032802ec043602c404200320032800ef043600c704200320032f01e8043b01c004200341bc046a41026a226b200341e4046a41026a2d00003a0000200320032f01e4043b01bc04200341b8046a41026a2264200341e0046a41026a2d00003a0000200320032f01e0043b01b804200341b4046a41026a2265200341dc046a41026a2d00003a0000200320032f01dc043b01b404200341b0046a41026a2266200341d8046a41026a2d00003a0000200320032f01d8043b01b004200341ac046a41026a2267200341d4046a41026a2d00003a0000200320032f01d4043b01ac04200341a8046a41026a2268200341d0046a41026a2d00003a0000200320032f01d0043b01a804200341a4046a41026a226c200341cc046a41026a2d00003a0000200320032f01cc043b01a404024020690d00200341c4006a41026a206a2d00003a0000200341c0006a41026a206b2d00003a00002003413c6a41026a20642d00003a0000200341386a41026a20652d00003a0000200341346a41026a20662d00003a0000200320032f01c0043b0144200320032f01bc043b0140200320032f01b8043b013c200320032f01b4043b0138200320032f01b0043b0134200341306a41026a20672d00003a00002003412c6a41026a20682d00003a0000200341286a41026a206c2d00003a0000200320032f01ac043b0130200320032f01a8043b012c200320032f01a4043b01280c010b20034198046a41026a2201206a2d00003a0000200320032800c70436009f04200320032802c40436029c04200320032f01c0043b01980420034198056a41106a200b3a000020034198056a41086a200c37030020034198056a41206a20053c000020034198056a411c6a200e36020020034198056a41186a200436020020034198056a41146a200d3602002003200328009f0436009c052003200328029c0436009905200341a9056a20032f0198043b000020034198056a41136a20012d00003a0000200341013a009805200341c8006a20034198056a10cd03200341c4006a41026a2201200341d7006a2d00003a00002003200341d5006a2f00003b0144200341c8006a41106a290300210c200341c8006a41186a280200210b200341c8006a411c6a2902002105200328026c210220032802482104200329024c2109200041106a200341d4006a2d00003a0000200041086a20093702002000200436020420004100360200200041286a2002360000200041206a20053700002000411c6a200b360000200041146a200c370000200020032f01443b0011200041136a20012d00003a0000200020032f01403b0049200041cb006a200341c0006a41026a2d00003a0000200020032f013c3b00810120004183016a2003413c6a41026a2d00003a0000200041bb016a200341386a41026a2d00003a0000200020032f01383b00b901200041f3016a200341346a41026a2d00003a0000200020032f01343b00f101200041ab026a200341306a41026a2d00003a0000200020032f01303b00a902200041e3026a2003412c6a41026a2d00003a0000200020032f012c3b00e1022000419b036a200341286a41026a2d00003a0000200020032f01283b0099030c010b200341246a41026a2269200341c4006a41026a2d00003a0000200341206a41026a226a200341c0006a41026a2d00003a00002003411c6a41026a226b2003413c6a41026a2d00003a0000200341186a41026a2264200341386a41026a2d00003a0000200341146a41026a2265200341346a41026a2d00003a0000200320032f01443b0124200320032f01403b0120200320032f013c3b011c200320032f01383b0118200320032f01343b0114200341106a41026a2266200341306a41026a2d00003a00002003410c6a41026a22672003412c6a41026a2d00003a0000200341086a41026a2268200341286a41026a2d00003a0000200320032f01303b0110200320032f012c3b010c200320032f01283b010802400240200241ff01714102470d00200c4201520d00200b41ff0171450d010b200341d8006a200b3a000020034190016a200a3a000020034188016a200937030020034180016a2008360200200341f8006a2007360200200341f0006a2006360200200341e8006a2005370300200341e0006a2004360200200341db006a20692d00003a00002003200c370350200320032f01243b005920032011360284012003201036027c2003200f3602742003200e3602642003200d36025c200341c8016a20123a0000200341c0016a2013370300200341b8016a2014360200200341b0016a2015360200200341a8016a2016360200200341a0016a201737030020034198016a201836020020034193016a206a2d00003a0000200341cb016a206b2d00003a0000200320193602bc012003201a3602b4012003201b3602ac012003201c36029c012003201d36029401200320032f01203b009101200320032f011c3b00c90120034180026a201e3a0000200341f8016a201f370300200341f0016a2020360200200341e8016a2021360200200341e0016a2022360200200341d8016a2023370300200341d0016a2024360200200320253602f401200320263602ec01200320273602e401200320283602d401200320293602cc0120034183026a20642d00003a0000200320032f01183b008102200341b8026a202a3a0000200341b0026a202b370300200341a8026a202c360200200341a0026a202d36020020034198026a202e36020020034190026a202f37030020034188026a2030360200200320313602ac02200320323602a4022003203336029c022003203436028c022003203536028402200341bb026a20652d00003a0000200320032f01143b00b902200341f0026a20363a0000200341e8026a2037370300200341e0026a2038360200200341d8026a2039360200200341d0026a203a360200200341c8026a203b370300200341c0026a203c3602002003203d3602e4022003203e3602dc022003203f3602d402200320403602c402200320413602bc02200341f3026a20662d00003a0000200320032f01103b00f102200341a8036a20423a0000200341a0036a204337030020034198036a204436020020034190036a204536020020034188036a204636020020034180036a2047370300200341f8026a20483602002003204936029c032003204a360294032003204b36028c032003204c3602fc022003204d3602f402200341ab036a20672d00003a0000200320032f010c3b00a903200341e0036a204e3a0000200341d8036a204f370300200341d0036a2050360200200341c8036a2051360200200341c0036a2052360200200341b8036a2053370300200341b0036a2054360200200320553602d403200320563602cc03200320573602c403200320583602b403200320593602ac03200341e3036a20682d00003a0000200320032f01083b00e103200341c8006a41c8036a205a37030020034188046a205b36020020034180046a205c360200200341f8036a205d360200200341f0036a205e370300200341e8036a205f3602002003206036028c042003206136028404200320623602fc03200320633602ec03200320013602e403200041086a200341c8006a41086a41c8031085051a200041013602000c010b200341003a009805200341c8006a41047220034198056a10cd03200341003602482000200341c8006a41d0031085051a0b200341c0056a24000bcf7b070b7f067e137f017e087f017e037f230041a0236b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020032d0000417f6a0e070001080203040a080b20044190146a200341106a41c8031085051a200441f0086a41086a22052003410c6a2802003602002004200341046a2902003703f008200441086a2002200441f0086a10e303200441c0006a2004280208200428020c200428021010e4032005200441086a41146a280200360200200420042902143703f008200441206a200441f0086a10e503200441e0006a410c6a200441c0006a41086a290300370200200441e0006a41146a200441c0006a41106a290300370200200441fc006a2205200441c0006a41186a28020036020020044184016a20042903203702002004418c016a200441206a41086a29030037020020044194016a200441206a41106a2903003702002004419c016a200441206a41186a28020036020020044101360260200420042903403702642004410136028001200441e0006a4104722106024020052802002205450d0020042005417f6a36027c200441e0006a41086a2802002205450d0720042802642107200441ec006a280200220820052f01a629490d1503400240024020052802a02922090d00410021090c010b200741016a210a20052f01a42921080b024041d82941a82920071b450d00200510300b024020090d00410221070c180b200a210720092105200820092f01a6294f0d000b20092105200a21070c150b2004410c3602f008200610e603200620042902d01f370200200641086a200441d01f6a41086a290200370200200641106a200441d01f6a41106a290200370200200641186a200441d01f6a41186a2802003602004100210b200441003602602004410c3602881820042802f008410c460d13200441f0086a109a010c160b200441801c6a200341206a41c8031085051a200341186a2802002106200341146a280200210a200341106a280200210b200441f0086a41086a2003410c6a2802003602002004200341046a2902003703f00820044188056a2002200441f0086a10e303200441c8016a20044188056a10e703200441e0006a20044188056a410c6a10e803200441b0056a410c6a2209200441c8016a41086a290300370200200441b0056a41146a200441c8016a41106a290300370200200441cc056a2205200441c8016a41186a280200360200200441d4056a2004290360370200200441dc056a200441e0006a41086a290300370200200441e4056a200441e0006a41106a290300370200200441ec056a2207200441e0006a41186a280200360200200441013602b005200420042903c8013702b405200441013602d005024020052802002205450d0020042005417f6a3602cc05200441b0056a4104724100200441b0056a41086a220c28020022051b220d2802002107024002402009410820051b220e2802002208200c410420051b220c28020022092f01a6294f0d00200921050c010b0340024020092802a02922050d00410021050c020b200741016a210720092f01a429210820052109200820052f01a6294f0d000b0b024002402007450d00200841027420056a41ac296a280200210902402007417f6a2207450d00034020092802a82921092007417f6a22070d000b0b410021070c010b200841016a2107200521090b200c2009360200200e2007360200200d4100360200200520084104746a220941f8276a290300210f200941f0276a2903002110024002402005200841d0036c6a22052802004101470d002005410c6a2802002209417f4c0d07200528020421070240024020090d00410121050c010b2009102f2205450d070b200420093602d81f200420053602d41f2005200720091085051a200441dc1f6a20093602004108210920042903d81f211120102112200f21130c010b200441d01f6a41086a200541086a10db03200441e81f6a2903002113200441e01f6a290300211220042903d81f2111200441d0106a200441f01f6a41b0031085051a410a21090b20044188096a2013370300200441f0086a41106a2012370300200441f0086a41086a2011370300200420053602f408200420093602f00820044190096a200441d0106a41b0031085051a200441c80c6a200f370300200441c00c6a2010370300200441d00c6a20042903a810370300200441d80c6a200441a8106a41086a290300370300200441e00c6a200441a8106a41106a29030037030020044188186a200441f0086a41f8031085051a0c0f0b2004410c3602f008200441003602b005200728020022050d0d2004410c360288180c0f0b20044188186a200341206a41c8031085051a200441c8016a41086a2205200341186a2802003602002004200341106a2902003703c801200441f0086a41086a2003410c6a2802003602002004200341046a2902003703f008200441d0106a2002200441f0086a10e303200441f0086a20044188186a10f001200441d0106a200441f0086a10e903200441d01f6a20042802d01020042802d41020042802d81010e40320044190146a41086a200441d0106a41146a280200360200200420042902dc1037039014200441801c6a20044190146a10e503200441ac146a200441d01f6a41186a28020036020020044190146a41146a200441d01f6a41106a29030037020020044190146a410c6a200441d01f6a41086a290300370200200441b4146a20042903801c370200200441bc146a200441801c6a41086a290300370200200441c4146a200441801c6a41106a290300370200200441cc146a200441801c6a41186a280200360200200420042903d01f3702941441012107200441013602b0142004410136029014200441b0056a20044190146a10ea03200441f0086a109c01200429038818210f200441f0086a410b6a200441b0056a41086a280200360000200420042903b0053700f308200420042900f008370390142004200441f7086a29000037009714200041186a20044188186a41086a41c0031085051a41002109200041d8036a41003a0000200041106a200f3702002000410b36020820004201370300200041f0036a2005280200360200200041e8036a20042903c80137020020002004290390143700d903200041e0036a2004290097143700000c060b200341046a290200210f2003410c6a280200210520044188186a200341206a41c8031085051a200441c8016a41086a2207200341186a2802003602002004200341106a2902003703c801200420053602f8082004200f3703f008200441d0106a2002200441f0086a10e303200441f0086a20044188186a10f001200441d0106a200441f0086a10e903200441d01f6a20042802d01020042802d41020042802d81010e40320044190146a41086a200441d0106a41146a280200360200200420042902dc1037039014200441801c6a20044190146a10e503200441ac146a200441d01f6a41186a28020036020020044190146a41146a200441d01f6a41106a29030037020020044190146a410c6a200441d01f6a41086a290300370200200441b4146a20042903801c370200200441bc146a200441801c6a41086a290300370200200441c4146a200441801c6a41106a290300370200200441cc146a200441801c6a41186a280200360200200420042903d01f3702941441012109200441013602b0142004410136029014200441b0056a20044190146a10ea03200441f0086a109c01200429038818210f200441f0086a410b6a200441b0056a41086a280200360000200420042903b0053700f308200420042900f008370390142004200441f7086a29000037009714200041186a20044188186a41086a41c0031085051a200041d8036a41023a0000200041106a200f3702002000410b36020820004201370300200041f0036a2007280200360200200041e8036a20042903c80137020020002004290390143700d903200041e0036a200429009714370000410021070c050b200341106a2903002114200441d01f6a200341186a41c8031085051a200341086a2802002115200341046a28020021162003410c6a2802002117200441e0006a41106a22184200370300200442003702640240201741f8036c22050d00200441d0106a21050c070b201620056a2119200441e0006a410c6a211a2002410c6a211b20044188186a41106a211c200441f0086a41086a210e200441f01b6a211d200441f0086a410c6a211e20044188186a41e0036a210a20044188186a41206a210c200441f0086a41206a211f20044188186a41086a2120200241146a2121200441e01b6a210d20044188186a41d3036a21222016210b034002400240024002400240024002400240024002400240024002400240200b28020022050e0c0d000102030c0b0a090809080d0b02400240200241086a2802000d00200442003702d4100c010b20022802042205450d07200441d0106a2002280200200510eb030b02400240200241146a2802000d00200441e0106a42003703000c010b20022802102205450d06200441dc106a201b280200200510ec030b200441e0006a10dc03200428027021052004410036027002402005450d000240200428026c2209450d00034020052802b02b21052009417f6a22090d000b0b200441003602f808200420053602f408200441003602f008200420042802743602fc08200441f0086a10dd030b200441d0106a21050c150b02400240200241086a2802000d00200442003702f4080c010b20022802042205450d04200441f0086a2002280200200510eb030b201e201a290200370200201e41086a201a41086a280200360200200441e0006a10dc032018200441f0086a41106a290300370300200441e0006a41086a200e290300370300200420042903f0083703600c0b0b200e200441e0006a41086a2207280200360200200420042903603703f0080240024020212802000d0020044200370380090c010b20022802102205450d02201e201b280200200510ec030b200428027021052004410036027002402005450d000240200428026c2209450d00034020052802b02b21052009417f6a22090d000b0b20044100360290182004200536028c182004410036028818200420042802743602941820044188186a10dd030b2018200441f0086a41106a2903003703002007200e290300370300200420042903f0083703600c0a0b200441d0106a200210e703200441801c6a41186a200441d0106a41186a2802002205360200200441801c6a41106a200441d0106a41106a290300370300200441801c6a41086a200441d0106a41086a290300370300200420042903d0103703801c2005450d0920042005417f6a3602981c200441801c6a410020042802841c1b220628020021070240024020062802082208200628020422092f01a6294f0d00200921050c010b0340024020092802a02922050d00410021050c020b200741016a210720092f01a429210820052109200820052f01a6294f0d000b0b024002402007450d00200841027420056a41ac296a280200210902402007417f6a2207450d00034020092802a82921092007417f6a22070d000b0b410021070c010b200841016a2107200521090b2006200936020420064100360200200620073602082005200841d0036c6a2109200520084104746a41f0276a21050340200541086a290300210f2005290300211002400240200928020022084101470d002009410c6a2802002207417f4c0d0f200928020421090240024020070d00410121050c010b2007102f2205450d0f0b200420073602f808200420053602f4082005200920071085051a200420073602fc084108210920042903f808211120102112200f21130c010b200e200941086a10db03200441f0086a41186a2903002113200429038009211220042903f808211120044188186a201f41b0031085051a410a21090b20044190146a20044188186a41b0031085051a200441c8016a41086a2207200441b0056a41086a290300370300200441c8016a41106a2206200441b0056a41106a290300370300200420042903b0053703c80120044188186a41186a201337030020042012370398182004200536028c1820042009360288182004201137039018200c20044190146a41b0031085051a200d200f370300200a20042903c801370300200a41086a2007290300370300200a41106a2006290300370300200420103703d81b024002402008450d00200b28020c2011422088a72209470d00200b280204200520091088050d00200441f0086a20044188186a41f8031085051a200441e0006a200441f0086a10ed030c010b20044188186a109a010b20042802981c2205450d0a20042005417f6a3602981c200441801c6a410020042802841c1b220628020021070240024020062802082208200628020422092f01a6294f0d00200921050c010b0340024020092802a02922050d00410021050c020b200741016a210720092f01a429210820052109200820052f01a6294f0d000b0b024002402007450d00200841027420056a41ac296a280200210902402007417f6a2207450d00034020092802a82921092007417f6a22070d000b0b410021070c010b200841016a2107200521090b2006200936020420064100360200200620073602082005200841d0036c6a2109200520084104746a41f0276a21050c000b0b41b2abc200412b41a082c200102d000b41b2abc200412b41a082c200102d000b41b2abc200412b41a082c200102d000b41b2abc200412b41a082c200102d000b0240024002400240200541776a0e03020001000b41d8a5c200412841c0dfc100102d000b200441f0086a200b41086a10db0320042802f408210620042802f008210520044188186a200e41c0031085051a41002108410021070240024002400240024002400240200b2d00d0030e0706010203040500060b200b41dc036a2802002223417f4c0d0f200b41d4036a28020021090240024020230d00410121240c010b2023102f2224450d0f0b20234108762125202420092023108505410876212641062107202321270c050b200b41e0036a2903002128200b2903d803220f422088a72123200f420888a72125200fa72127410121070c040b200b2f00d103200b41d3036a2d0000411074722129200b2d00d4032124410221070c030b200b2800d40322244108762126200b2f00d103200b41d3036a2d0000411074722129200b2d00d8032127410321070c020b202842807e83200b3100e003842128200b2800d80322274108762125200b2800d40322244108762126200b2f00d103200b41d3036a2d0000411074722129200b2800dc032123410421070c010b20044190146a41086a200b41f0036a2d00003a00002004200b2900e80337039014200b2800d40322244108762126200b2f00d103200b41d3036a2d0000411074722129200b41e0036a2900002128200b2900d803220f422088a72123200f420888a72125200fa72127410521070b200441f0086a20044188186a41c0031085051a200441801c6a41086a20044190146a41086a29030037030020042004290390143703801c2026410874202441ff017172212a2023ad4220862025410874202741ff017172ad84210f20292109202821100c010b200b410c6a2802002205417f4c0d08200b28020421090240024020050d004101212b0c010b2005102f222b450d080b202b200920051085051a410021070240024002400240024002400240200b2d00100e0706010203040500060b200b411c6a280200222c417f4c0d0e200b41146a280200210902400240202c0d004101212d0c010b202c102f222d450d0e0b202c410876212e202d2009202c108505410876212f41062107202c21300c050b200b41206a2903002131200b290318220f422088a7212c200f420888a7212e200fa72130410121070c040b200b2f0011200b41136a2d0000411074722132200b2d0014212d410221070c030b200b280014222d410876212f200b2f0011200b41136a2d0000411074722132200b2d00182130410321070c020b203142807e83200b310020842131200b2800182230410876212e200b280014222d410876212f200b2f0011200b41136a2d0000411074722132200b28001c212c410421070c010b200e200b41306a2d00003a00002004200b2900283703f008200b280014222d410876212f200b2f0011200b41136a2d0000411074722132200b41206a2900002131200b290018220f422088a7212c200f420888a7212e200fa72130410521070b200441801c6a41086a200e290300370300200420042903f0083703801c202f410874202d41ff017172212a202cad422086202e410874203041ff017172ad84210f410121082005210620322109203121100b20044190146a200441f0086a41c0031085051a200441d0106a41086a2233200441801c6a41086a290300370300200420042903801c3703d010200420063602941820042005360290182004202b36028c18201c20044190146a41c0031085051a200a2010370300201d20042903d010370300201d41086a2033290300370300200420093b00d91b202220094110763a00002004200f3703e01b2004202a3602dc1b200420073a00d81b2004200836028818024020022802102206450d00201b280200212a034020062f01ae2b223341f8036c2105417f21072006210902400340024020050d00203321070c020b200741016a2107200541887c6a210520044188186a20091090012108200941f8036a2109200841ff01714101460d000b0240200841187441187541016a0e020100010b200441f0086a20044188186a41f8031085051a201a200441f0086a10ee030c070b0240202a450d00202a417f6a212a200620074102746a41b02b6a28020021060c010b0b20042802881821080b0240024020080d002020109c010c010b200428029018450d00200428028c1810300b20042d00d81b4106490d0420042802e01b450d0420042802dc1b10300c040b0240024002400240200541786a0e03020001000b41d8a5c200412841b0dfc100102d000b200441f0086a200b41086a10db0320042802f408210620042802f008210520044190146a200e41c0031085051a200b41d0036a2109410021080c010b200b410c6a2802002205417f4c0d07200b2802042106410121084101210702402005450d002005102f2207450d070b200b41106a21092007200620051085051a200521060b200941086a290300210f20092903002110200420063602941820042005360290182004200736028c182004200836028818201c20044190146a41c0031085051a02402002280204222a450d00200228020021330340202a41e0276a2108202a2f01a629223441d0036c2105417f2107202a210902400340024020050d00203421070c020b200741016a2107200841106a2108200541b07c6a210520044188186a20091091012106200941d0036a2109200641ff01714101460d000b0240200641187441187541016a0e020100010b200441f0086a20044188186a41d0031085051a200441e0006a200441f0086a2008290300221120102010201156200f200841086a290300221156200f2011511b22051b2011200f20051b10ef030c060b02402033450d002033417f6a2133202a20074102746a41a8296a280200212a0c010b0b20042802881821080b024020080d002020109c010c040b200428029018450d03200428028c1810300c030b200441d0106a201b10e803200441801c6a41186a200441d0106a41186a280200360200200441801c6a41106a200441d0106a41106a290300370300200441801c6a41086a200441d0106a41086a290300370300200420042903d0103703801c200b41086a212a034020042802981c2205450d0320042005417f6a3602981c200441801c6a410020042802841c1b220628020021070240024020062802082208200628020422092f01ae2b4f0d00200921050c010b200921050340024020052802a82b22050d00410021050c020b200741016a210720092f01ac2b210820052109200820052f01ae2b4f0d000b0b024002402007450d00200841027420056a41b42b6a280200210902402007417f6a2207450d00034020092802b02b21092007417f6a22070d000b0b410021070c010b200841016a2107200521090b200620093602042006410036020020062007360208200441f0086a2005200841f8036c6a10f00320042802f008410c460d0320044190146a200441f0086a41f8031085051a20044188186a20044190146a41f8031085051a0240200428028818410b470d00202a202010f103450d00200441f0086a20044188186a41f8031085051a200441e0006a200441f0086a10ed030c010b20044188186a109a010c000b0b200441d0106a200210e703200441801c6a41186a200441d0106a41186a2802002205360200200441801c6a41106a200441d0106a41106a290300370300200441801c6a41086a200441d0106a41086a290300370300200420042903d0103703801c2005450d0120042005417f6a3602981c200441801c6a410020042802841c1b220628020021070240024020062802082208200628020422092f01a6294f0d00200921050c010b0340024020092802a02922050d00410021050c020b200741016a210720092f01a429210820052109200820052f01a6294f0d000b0b024002402007450d00200841027420056a41ac296a280200210902402007417f6a2207450d00034020092802a82921092007417f6a22070d000b0b410021070c010b200841016a2107200521090b200b41086a212a2006200936020420064100360200200620073602082005200841d0036c6a2109200520084104746a41f0276a21050340200541086a290300210f2005290300211002400240200928020022084101470d002009410c6a2802002207417f4c0d07200928020421090240024020070d00410121050c010b2007102f2205450d070b200420073602f808200420053602f4082005200920071085051a200420073602fc084108210920042903f808211120102112200f21130c010b200e200941086a10db03200441f0086a41186a2903002113200429038009211220042903f808211120044188186a201f41b0031085051a410a21090b20044190146a20044188186a41b0031085051a200441c8016a41086a2207200441b0056a41086a290300370300200441c8016a41106a2206200441b0056a41106a290300370300200420042903b0053703c80120044188186a41186a2013370300200420123703981820042011370390182004200536028c182004200936028818200c20044190146a41b0031085051a200d200f370300200a20042903c801370300200a41086a2007290300370300200a41106a2006290300370300200420103703d81b0240024020080d00202a202010f103450d00200441f0086a20044188186a41f8031085051a200441e0006a200441f0086a10ed030c010b20044188186a109a010b20042802981c2205450d0220042005417f6a3602981c200441801c6a410020042802841c1b220628020021070240024020062802082208200628020422092f01a6294f0d00200921050c010b0340024020092802a02922050d00410021050c020b200741016a210720092f01a429210820052109200820052f01a6294f0d000b0b024002402007450d00200841027420056a41ac296a280200210902402007417f6a2207450d00034020092802a82921092007417f6a22070d000b0b410021070c010b200841016a2107200521090b2006200936020420064100360200200620073602082005200841d0036c6a2109200520084104746a41f0276a21050c000b0b200441d0106a201b10e803200441801c6a41186a200441d0106a41186a280200360200200441801c6a41106a200441d0106a41106a290300370300200441801c6a41086a200441d0106a41086a290300370300200420042903d0103703801c034020042802981c2205450d0120042005417f6a3602981c200441801c6a410020042802841c1b220628020021070240024020062802082208200628020422092f01ae2b4f0d00200921050c010b200921050340024020052802a82b22050d00410021050c020b200741016a210720092f01ac2b210820052109200820052f01ae2b4f0d000b0b024002402007450d00200841027420056a41b42b6a280200210902402007417f6a2207450d00034020092802b02b21092007417f6a22070d000b0b410021070c010b200841016a2107200521090b200620093602042006410036020020062007360208200441f0086a2005200841f8036c6a10f00320042802f008410c460d0120044190146a200441f0086a41f8031085051a20044188186a20044190146a41f8031085051a02402004280288184109470d00200b28020c2205200428029418470d00200b280204200428028c1820051088050d00200441f0086a20044190146a41f8031085051a200441e0006a200441f0086a10ed030c010b20044188186a109a010c000b0b200b41f8036a220b2019470d000b200441d0106a21050c060b102a000b102c000b41b2abc200412b41d4a8c200102d000b200042013703002000410536020841012109410121070b410121080c030b20044188186a200341106a41f8031085051a2003410c6a2802002105200341086a2802002107200341046a28020021080240024020034188046a290300220f20034190046a2903007c200f54220a0d0020044188186a41206a2109200441e01b6a2903002112200441d81b6a290300211320044188186a41186a290300211020044188186a41106a290300211120044188186a41086a290300210f200428028c18210602400240024002400240024002400240024002400240024002402004280288180e0c01000a0b0608070903050204010b2002290200210f2002290208211020024200370204200441dc106a2010370200200241106a2209290200211020094200370200200441e4106a2010370200200441003602d0102004200f3702d4100c0b0b200441e4106a4200370200200441d8106a4200370300200441003602d0100c0a0b20044190146a41186a2010370300200441a0146a20113703002004200f3703981420044190146a41206a200941b0031085051a2004410036029014200441d0106a200220044190146a2013201210f2030c090b20044198146a200f37030020042006360294142004410136029014200441d0106a200220044190146a2011201010f2030c080b20044190146a41186a201037030020044190146a41106a20113703002004200f3703981420044190146a41206a200941b0031085051a2004410036029014200441d01f6a41106a200441e81b6a290300370300200441d01f6a41186a200441f01b6a290300370300200441d01f6a41206a200441f81b6a290300370300200420123703d81f200420133703d01f200441d0106a200220044190146a200441d01f6a10f3030c070b20044190146a41086a200f37030020042006360294142004410136029014200441d01f6a41106a2009290300370300200441d01f6a41186a200941086a290300370300200441d01f6a41206a200941106a290300370300200420103703d81f200420113703d01f200441d0106a200220044190146a200441d01f6a10f3030c060b200441801c6a41086a220b200f370300200441c0056a22094200370300200442003702b405200420063602841c200441013602801c20044190146a2002200441801c6a10f40302402004280290144102460d00200441e8176a290300210f20042903e0172110200441d01f6a20044190146a41d0031085051a200441b0056a200441d01f6a2010200f10f5030b200441dc106a200441b0056a41086a290300370200200441e4106a2009290300370200200420042903b0053702d410200441003602d010024020042802801c0d00200b109c010c060b20042802881c450d0520042802841c10300c050b200441801c6a41186a2010370300200441801c6a41106a20113703002004200f3703881c200441801c6a41206a200941b0031085051a200441b0056a41106a22094200370300200442003702b405200441003602801c20044190146a2002200441801c6a10f40302402004280290144102460d00200441e8176a290300210f20042903e0172110200441d01f6a20044190146a41d0031085051a200441b0056a200441d01f6a2010200f10f5030b200441dc106a200441b0056a41086a290300370200200441e4106a2009290300370200200420042903b0053702d410200441003602d010024020042802801c0d00200441801c6a41086a109c010c050b20042802881c450d0420042802841c10300c040b20044198146a2209200f37030020042006360294142004410136029014200441d0106a410472200220044190146a10f603200441003602d01002402004280290140d002009109c010c040b200428029814450d0320042802941410300c030b20044190146a41186a2010370300200441a0146a20113703002004200f3703981420044190146a41206a200941b0031085051a2004410036029014200441d0106a410472200220044190146a10f603200441003602d01002402004280290140d0020044198146a109c010c030b200428029814450d0220042802941410300c020b2002290200210f2002280208210920024200370204200441e4106a4200370200200441dc106a2009360200200441003602d0102004200f3702d4100c010b200441d0106a41106a200229020c370300200441d8106a4200370300200241146a2802002109200241106a4200370200200441d0106a41186a2009360200200441003602d0100b024020042802d0104101470d0020004201370300200041143602080c020b200441d0016a200441e4106a290200220f3703002004200441d0106a410c6a29020022103703c80120042902d410211120044180096a200f370300200420113703f008200420103703f808200441f0086a10f703200441f0086a410c6a10f80320004201370300200041023602080c010b20004201370300200042013703080b02402005450d00200541e8036c21092008210503402005109601200541e8036a2105200941987c6a22090d000b0b02402007450d00200741e8036c450d00200810300b0240200a450d0020044188186a109a010b4100210a4101210941012107410121080c030b200441d0106a41106a200441e0006a41106a290300370300200441d0106a41086a200441e0006a41086a290300370300200420042903603703d0100b200441f0086a200441d01f6a10f001200441d0106a200441f0086a10e90320044190146a20042802d01020042802d41020042802d81010e40320044188186a41086a200441d0106a41146a280200360200200420042902dc1037038818200441801c6a20044188186a10e503200441a4186a20044190146a41186a28020036020020044188186a41146a20044190146a41106a29030037020020044194186a20044190146a41086a290300370200200441ac186a20042903801c370200200441b4186a200441801c6a41086a290300370200200441bc186a200441801c6a41106a290300370200200441c4186a200441801c6a41186a280200360200200420042903901437028c18200441013602a8182004410136028818200441e0006a20044188186a10ea03200441f0086a109c0120042903d01f210f20044190146a200441d01f6a41086a41c0031085051a200441b0056a410b6a200441e0006a41086a280200360000200420042903603700b305200420042900b0053703c8012004200441b7056a2900003700cf0120044188186a200441f0086a41d0031085051a200520044190146a41c0031085051a200441801c6a20044190146a41c0031085051a200041186a200441801c6a41c0031085051a200041f0036a20044188186a41d0031085051a200041d8036a41033a0000200041106a200f3702002000202b36020c2000410b360208200020042903c8013700d903200041e0036a20042900cf01370000200041e8036a20143703002000420137030002402017450d00201741f8036c21092016210503402005109a01200541f8036a2105200941887c6a22090d000b0b02402015450d00201541f8036c450d00201610300b4100210841012109410121070b4101210a0b41012106410121050c0b0b20042005417f6a3602ec05200441d4056a4100200441d8056a220928020022051b220c280200210702400240200441dc056a410820051b220d28020022082009410420051b220e28020022092f01ae2b4f0d00200921050c010b200921050340024020052802a82b22050d00410021050c020b200741016a210720092f01ac2b210820052109200820052f01ae2b4f0d000b0b024002402007450d00200841027420056a41b42b6a280200210902402007417f6a2207450d00034020092802b02b21092007417f6a22070d000b0b410021070c010b200841016a2107200521090b200e2009360200200c4100360200200d200736020020044188186a2005200841f8036c6a10f00320042802f008410c460d00200441f0086a109a010b200428028818410c470d010b200441d0106a41106a20044188056a41106a290300370300200441d0106a41086a220520044188056a41086a29030037030020042004290388053703d010200441f0086a200441801c6a10f001200441d0106a200441f0086a10e90320044190146a20042802d01020042802d410200528020010e40320044188186a41086a200441d0106a41146a280200360200200420042902dc1037038818200441d01f6a20044188186a10e503200441a4186a20044190146a41186a28020036020020044188186a41146a20044190146a41106a29030037020020044194186a20044190146a41086a290300370200200441ac186a20042903d01f370200200441b4186a200441d01f6a41086a290300370200200441bc186a200441d01f6a41106a290300370200200441c4186a200441d01f6a41186a280200360200200420042903901437028c18200441013602a8182004410136028818200441b0056a20044188186a10ea03200441f0086a109c0120042903801c210f200441f0086a410b6a200441b0056a41086a280200360000200420042903b0053700f308200420042900f008370388182004200441f7086a29000037008f18200041186a200441801c6a41086a41c0031085051a200041d8036a41013a0000200041106a200f3702002000410b360208200041f0036a2006360200200041ec036a200a360200200041e8036a200b3602002000420137030020002004290388183700d903200041e0036a200429008f183700000c010b20044190146a20044188186a41f8031085051a200441f0086a20044190146a41f8031085051a2000420137030020004102360208200441f0086a109a0120044188056a10dc03024020044198056a2802002205450d0002402004280294052209450d00034020052802b02b21052009417f6a22090d000b0b200441003602f808200420053602f408200441003602f00820042004419c056a2802003602fc08200441f0086a10dd030b02402006450d0020064198046c2109200b21050340200510a00120054198046a2105200941e87b6a22090d000b0b0240200a450d00200a4198046c450d00200b10300b200441801c6a109c010b410021064101210941012107410121084101210a410121050c060b4100210b0c030b200841016a21092005200841d0036c6a210a200520084104746a220841f8276a210b200841f0276a210802402007450d00200520094102746a41a8296a280200210502402007417f6a2209450d00034020052802a82921052009417f6a22090d000b0b410021090b200b29030021102008290300210f200a2802082108200a28020c210b200a280204210c200a2802002107200441d01f6a200a41106a41c0031085051a0b200441801c6a200441d01f6a41c0031085051a2004200936026c2004200536026820044100360264024002402007450d0020044188096a201037030020044180096a200f3703002004200c3602f408410821050c010b20044180096a200441801c6a41c0031085051a200441c80c6a2010370300200441c00c6a200f370300410a21050b200441fc086a200b360200200441f8086a2008360200200420053602f00820044188186a200441f0086a41f8031085051a4101210b0b2004280288182205410c460d0020044188186a410c6a280200210920044188186a41086a2802002108200428028c18210a200441b0056a20044188186a41106a41c0031085051a200441a8056a200441f81b6a290300370300200441a0056a200441f01b6a29030037030020044188056a41106a200441e81b6a29030037030020044188056a41086a200441e01b6a2903003703002004200441d81b6a290300370388050c010b0240024002402004280280014101470d002004419c016a2802002205450d0020042005417f6a36029c01024020044188016a2802002209450d00200428028401210702402004418c016a280200220820092f01ae2b4f0d00200921052007210a0c030b03400240024020092802a82b22050d00410021050c010b200741016a210a20092f01ac2b21080b024041e02b41b02b20071b450d00200910300b024020050d004102210d0c050b20052109200a2107200820052f01ae2b490d030c000b0b41b2abc200412b41d4a8c200102d000b0240200b450d00200610e6030b0240200428028001450d0020044188016a2802002205450d002004418c016a2802002109200428028401210720042004419c016a2802003602fc08200420093602f808200420053602f408200420073602f008200441f0086a10dd030b20044190146a109c01200041086a420037030020004200370300024020032d0000220541074b0d00410120057441f601710d050b200310f9030c040b200841016a210c2005200841f8036c6a21070240200a450d002005200c4102746a41b02b6a28020021050240200a417f6a2209450d00034020052802b02b21052009417f6a22090d000b0b4100210c0b20072802082108200728020c21092007280204210a2007280200210d200441f0086a200741106a41c0031085051a200441a01c6a200741f0036a290200370300200441981c6a200741e8036a290200370300200441801c6a41106a200741e0036a290200370300200441881c6a200741d8036a290200370300200420072902d0033703801c0b200441d01f6a200441f0086a41c0031085051a200441a8106a41206a2207200441801c6a41206a290300370300200441a8106a41186a220e200441801c6a41186a290300370300200441a8106a41106a221f200441801c6a41106a290300370300200441a8106a41086a2220200441801c6a41086a290300370300200420042903801c3703a8102004200c36028c012004200536028801200441003602840102400240200d450d00200441b0056a41206a2007290300370300200441b0056a41186a200e290300370300200441b0056a41106a201f290300370300200441b0056a41086a2020290300370300200420042903a8103703b005410921050c010b200441b0056a200441d01f6a41c0031085051a20044188056a41206a200729030037030020044188056a41186a200e29030037030020044188056a41106a201f29030037030020044188056a41086a2020290300370300200420042903a81037038805410b21050b200428028818410c460d0020044188186a109a010b200441c8016a200441b0056a41c0031085051a200441a0016a41206a220720044188056a41206a290300370300200441a0016a41186a220c20044188056a41186a290300370300200441a0016a41106a220d20044188056a41106a290300370300200441a0016a41086a220e20044188056a41086a29030037030020042004290388053703a001200441fc086a2009360200200441f0086a41086a20083602002004200a3602f408200420053602f008200441f0086a41106a200441c8016a41c0031085051a2000410236020820004201370300200441e00c6a2007290300370300200441d80c6a200c290300370300200441d00c6a200d290300370300200441c80c6a200e290300370300200441c00c6a20042903a001370300200441f0086a109a010240200b450d00200610e6030b0240200428028001450d0020044188016a2802002205450d002004418c016a2802002109200428028401210720042004419c016a2802003602fc08200420093602f808200420053602f408200420073602f008200441f0086a10dd030b20044190146a109c01410021054101210941012107410121084101210a410121060b024002400240024002400240024020032d0000417f6a0e0700010602030405060b2005450d0602402003410c6a2802002209450d00200341046a2802002105200941f8036c210903402005109a01200541f8036a2105200941887c6a22090d000b0b0240200341086a2802002205450d00200541f8036c450d00200328020410300b200341106a109c010c060b2006450d0502402003410c6a2802002209450d00200341046a2802002105200941f8036c210903402005109a01200541f8036a2105200941887c6a22090d000b0b0240200341086a2802002205450d00200541f8036c450d00200328020410300b200341206a109c010240200341186a2802002209450d00200341106a280200210520094198046c21090340200510a00120054198046a2105200941e87b6a22090d000b0b200341146a2802002205450d0520054198046c450d05200328021010300c050b2009450d0402402003410c6a2802002209450d00200341046a2802002105200941f8036c210903402005109a01200541f8036a2105200941887c6a22090d000b0b0240200341086a2802002205450d00200541f8036c450d00200328020410300b200341206a109c010240200341186a2802002209450d00200341106a280200210520094198046c21090340200510a00120054198046a2105200941e87b6a22090d000b0b200341146a2802002205450d0420054198046c450d04200328021010300c040b2007450d0302402003410c6a2802002209450d00200341046a2802002105200941f8036c210903402005109a01200541f8036a2105200941887c6a22090d000b0b0240200341086a2802002205450d00200541f8036c450d00200328020410300b200341206a109c010240200341186a2802002209450d00200341106a280200210520094198046c21090340200510a00120054198046a2105200941e87b6a22090d000b0b200341146a2802002205450d0320054198046c450d03200328021010300c030b2008450d02200341186a109c0102402003410c6a2802002209450d00200341046a2802002105200941f8036c210903402005109a01200541f8036a2105200941887c6a22090d000b0b200341086a2802002205450d02200541f8036c450d02200328020410300c020b200a450d01200341106a109a0102402003410c6a2802002209450d00200341046a2802002105200941e8036c210903402005109601200541e8036a2105200941987c6a22090d000b0b200341086a2802002205450d01200541e8036c450d01200328020410300c010b200310f9030b200441a0236a24000bd64104207f037e057f027e230041a0206b22032400200341086a41106a42003703002003420037020c200228020022042002280208220541f8036c22066a210720022802042108200421090240024002402005450d00200341086a410c6a210a2001410c6a210b200641887c6a210c200341981c6a410472210d200341981c6a41d0036a210e20034198146a41cc036a210f200341a0186a41cc036a211020034198146a41086a211120034198146a4104722112200341a0186a4104722113200341a0186a41086a2114200341a0106a4104722115200341a0106a41086a2116200341981c6a41086a2117200341800c6a4104722118200341800c6a41086a211920034190086a410472211a20034190086a41086a211b20034198146a41046a211c200341a0106a41d0036a211d200341800c6a41106a211e200341981c6a41046a211f200341800c6a41d0036a212020034198046a410472212120034198146a41d8036a21222004210903402009220241f8036a210920022802002205410c460d01200341246a200241046a41f4031085051a20032005360298042021200341246a41f4031085051a024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c170001020e0b0d0a07050804170b2001290210212320014200370210200129020021242001290208212520014200370204200041106a2023370200200020253702082000202437020020034198046a109a01024020072009460d0003402009109a01200941f8036a2109200c41887c6a220c0d000b0b02402008450d00200841f8036c450d00200410300b200341086a10dc0320032802182102200341003602182002450d1b024020032802142205450d00034020022802b02b21022005417f6a22050d000b0b200341003602a01c2003200236029c1c200341003602981c2003200328021c3602a41c200341981c6a10dd030c1b0b200128020821022001280204210520014200370204200341a0106a20012802002005200210fd03200341a0186a41186a200341a0106a41186a2802002202360200200341a0186a41106a200341a0106a41106a29030037030020142016290300370300200320032903a0103703a0182002450d1420032002417f6a22263602b81820032802a4182202450d0120032802a018212720032802a818222820022f01a629490d1203400240024020022802a02922050d00410021050c010b202741016a210620022f01a42921280b024041d82941a82920271b450d00200210300b024020050d00410221050c150b2006212720052102202820052f01a6294f0d000b20052102200621270c120b2019200b41086a280200220236020020014100360214200b290200212320014100360210200320233703800c20172002360200200320233703981c200341a0106a200341981c6a10d20320032802a010210620032802a410210220032802a8102128024020032802b81022260d0020022105202821270c100b02402002450d000240202820022f01ae2b4f0d0020022105200621290c0f0b03400240024020022802a82b22050d00410021050c010b200641016a212920022f01ac2b21280b024041e02b41b02b20061b450d00200210300b024020050d00410221020c110b2005210220292106202820052f01ae2b490d0f0c000b0b41b2abc200412b41d4a8c200102d000b41b2abc200412b41d4a8c200102d000b200341800c6a20034198046a41f8031085051a0c010b200341800c6a20034198046a41f8031085051a0b024002400240024020032802800c41776a0e03020001000b41d8a5c200412841c4dec100102d000b201f201941c8031085051a200341a0186a41206a202041206a290300370300200341a0186a41186a202041186a290300370300200341a0186a41106a202041106a2903003703002014202041086a290300370300200320202903003703a01820034198146a200341981c6a41cc031085051a410021020c010b2011201841086a2802003602002014201e41086a290300370300200341a0186a41106a201e41106a290300370300200341a0186a41186a201e41186a290300370300200341a0186a41206a201e41206a29030037030020032018290200370398142003201e2903003703a018410121020b20034190086a20034198146a41cc031085051a200341f80f6a41206a2205200341a0186a41206a290300370300200341f80f6a41186a2206200341a0186a41186a290300370300200341f80f6a41106a2227200341a0186a41106a290300370300200341f80f6a41086a22282014290300370300200320032903a0183703f80f201520034190086a41cc031085051a201d41206a2005290300370300201d41186a2006290300370300201d41106a2027290300370300201d41086a2028290300370300201d20032903f80f370300200320023602a010024020012802102228450d00200b2802002126034020282f01ae2b222a41f8036c21294100210241ac2b2106417f2105024002400340024020292002470d00202a21050c020b200541016a2105200641046a2106202820026a2127200241f8036a2102200341a0106a2027109001222741ff01714101460d000b0240202741187441187541016a0e020100010b200341003a00f00b024002402026450d00202820066a2802002102024020264101460d00410121050340200220022f01ae2b4102746a41b02b6a28020021022026200541016a2205470d000b0b20022f01ae2b2105200341003602a01820032005417f6a410020051b3602a81820032002410020051b3602a418200341981c6a200341a0186a200341f00b6a109504200341a0186a200341981c6a41f8031085051a200328029020210502400240200328029820220620032802942022272f01ae2b4f0d00202721020c010b202721020340024020022802a82b22020d00410021020c020b200541016a210520272f01ac2b210620022127200620022f01ae2b4f0d000b0b200341981c6a2002200641f8036c6a222741f8031085051a2027200341a0186a41f8031085051a02402005450d002005417f6a2205450d00200641027420026a41b42b6a2802002102034020022802b02b21022005417f6a22050d000b0b20034198146a200341981c6a41f8031085051a0c010b200320053602a01c2003202836029c1c200341003602981c20034198146a200341981c6a200341f00b6a1095040b2003280298142102200341a0186a201241f4031085051a20012001280214417f6a36021402400240024020032d00f00b450d0020012802102205450d01200b2802002227450d0220052802b02b210620012027417f6a36020c20012006360210200641003602a82b200510300b20024102460d03200320023602981c200d200341a0186a41f4031085051a200a200341981c6a10ee030c030b41b2abc200412b41d0acc200102d000b41b7a2c200412141d8a2c200102d000b2026450d002026417f6a2126202820054102746a41b02b6a28020021280c010b0b20032802a01021020b0240024020020d002016109c010c010b20032802a810450d0020032802a41010300b024020032d00f0134106490d0020032802f813450d0020032802f41310300b024020032802800c41776a0e03120012000b200341800c6a109a010c110b200341981c6a20034198046a41f8031085051a0c010b200341981c6a20034198046a41f8031085051a0b024002400240024020032802981c41786a0e03020001000b41d8a5c200412841b4dec100102d000b200341981c6a41d8036a290300212320032903e81f2124201c201741c8031085051a200341a0186a20034198146a41cc031085051a410021020c010b2014200d41086a2802003602002003200d2902003703a018200341981c6a41186a290300212320032903a81c2124410121020b200320023602800c2018200341a0186a41cc031085051a0240024020012802042229450d00200128020021260340202941e0276a212720292f01a629222a41d0036c2102417f21062029210502400340024020020d00202a21060c020b200641016a2106202741106a2127200241b07c6a2102200341800c6a20051091012128200541d0036a2105202841ff01714101460d000b0240202841187441187541016a0e020100010b0240024002402027290300222b202458202741086a290300222520235820252023511b0d000240024020032802800c4101470d00200328028c0c2202417f4c0d0420032802840c2127410121054101210602402002450d002002102f2206450d040b200320023602a0142003200636029c142006202720021085051a200320023602a4140c010b2011201910db03410021050b2003200536029814200120034198146a202b20247d202520237d202b202454ad7d108d0420034198146a200341800c6a41d0031085051a200341086a20034198146a2024202310ef030c060b024020012802042228450d0020012802002126034020282f01a629222a41d0036c21294100210241a4292106417f210502400340024020292002470d00202a21050c020b202820026a2127200541016a2105200641046a2106200241d0036a2102200341800c6a2027109101222741ff01714101460d000b0240202741187441187541016a0e020100010b200341003a009008024002402026450d00202820066a2802002102024020264101460d00410121050340200220022f01a6294102746a41a8296a28020021022026200541016a2205470d000b0b20022f01a6292105200341003602a01020032005417f6a410020051b3602a81020032002410020051b3602a41020034198146a200341a0106a20034190086a108b01200341a0106a20034198146a41d0031085051a2022290300212320032903e817212420032802f817212702400240200328028018220620032802fc1722052f01a6294f0d00200521020c010b0340024020052802a02922020d00410021020c020b202741016a212720052f01a429210620022105200620022f01a6294f0d000b0b20034198146a2002200641d0036c6a220541d0031085051a2005200341a0106a41d0031085051a200220064104746a220541f0276a2228290300212c20282024370300200541f8276a220529030021242005202337030002402027450d002027417f6a2205450d00200641027420026a41ac296a2802002102034020022802a82921022005417f6a22050d000b0b200341a0186a20034198146a41d0031085051a200341a0186a41d8036a20243703002003202c3703f01b0c010b200320053602a0142003202836029c142003410036029814200341a0186a20034198146a20034190086a108b010b20032802a0182102200341a0106a201341dc031085051a20012001280208417f6a36020802400240024020032d009008450d0020012802042205450d0120012802002227450d0220052802a829210620012027417f6a36020020012006360204200641003602a029200510300b20024102460d0420032002360298142012200341a0106a41dc031085051a024020020d002011109c010c050b20032802a014450d04200328029c1410300c040b41b2abc200412b41d0acc200102d000b41b7a2c200412141d8a2c200102d000b2026450d012026417f6a2126202820054102746a41a8296a28020021280c000b0b20034198146a200341800c6a41d0031085051a200341086a20034198146a202b202510ef030c050b102a000b102c000b02402026450d002026417f6a2126202920064102746a41a8296a28020021290c010b0b20032802800c21020b024020020d002019109c010c010b20032802880c450d0020032802840c10300b024020032802981c41786a0e030f000f000b200341981c6a109a010c0e0b20034198146a20034198046a41f8031085051a0c010b20034198146a20034198046a41f8031085051a0b0240024002400240200328029814417b6a0e03020001000b41d8a5c200412841a4dec100102d000b201b201141c8031085051a410021020c010b201a2012290200370200201a41086a201241086a280200360200410121020b2003200236029008200342003702e40b200341f00b6a41086a200b41086a222a280200220236020020014100360214200b290200212320014100360210200320233703f00b20172002360200200320233703981c200341f80f6a200341981c6a10d20320032802f80f210620032802fc0f210220032802801021280240024020032802901022260d0020022105202821270c010b0240024002402002450d000240202820022f01ae2b4f0d0020022105200621290c020b03400240024020022802a82b22050d00410021050c010b200641016a212920022f01ac2b21280b024041e02b41b02b20061b450d00200210300b024020050d00410221020c040b2005210220292106202820052f01ae2b490d020c000b0b41b2abc200412b41d4a8c200102d000b202841016a21272005202841f8036c6a210602402029450d00200520274102746a41b02b6a280200210502402029417f6a2202450d00034020052802b02b21052002417f6a22020d000b0b410021270b20062802002102200341981c6a200641046a41f4031085051a0b200341a0106a200341981c6a41f4031085051a0340200341a0186a200341a0106a41f4031085051a200320023602800c2018200341a0106a41cc031085051a2026417f6a2126024002402003280290082002470d000240024020024101460d00201b201910f1030d010c020b200328029c082202200328028c0c470d0120032802940820032802840c20021088050d010b200341981c6a200341800c6a41d0031085051a200e41206a201041206a290200370200200e41186a201041186a290200370200200e41106a201041106a290200370200200e41086a201041086a290200370200200e2010290200370200200a200341981c6a1096040c010b200341981c6a200341800c6a41d0031085051a200e41206a201041206a290200370200200e41186a201041186a290200370200200e41106a201041106a290200370200200e41086a201041086a290200370200200e2010290200370200200341e00b6a200341981c6a10ee030b024020260d00410021060c020b02402005450d000240024002400240202720052f01ae2b490d0041002106034041002102024020052802a82b2229450d00200641016a212820052f01ac2b2127202921020b024041e02b41b02b20061b450d00200510300b024020020d00410221020c050b2002210520282106202720022f01ae2b4f0d000b2002202741f8036c6a2106024020280d00200221050c020b202741027420026a41b42b6a280200210502402028417f6a2202450d00034020052802b02b21052002417f6a22020d000b0b410021270c020b2005202741f8036c6a21060b202741016a21270b20062802002102200341981c6a200641046a41f4031085051a0b200341a0106a200341981c6a41f4031085051a0c010b0b41b2abc200412b41d4a8c200102d000b02402005450d00200341003602a41c200320273602a01c2003200536029c1c200320063602981c200341981c6a10dd030b2014200341e00b6a41086a2802003602002001280210210220014100360210200320032903e00b3703a01802402002450d000240200128020c2205450d00034020022802b02b21022005417f6a22050d000b0b200341003602a01c2003200236029c1c200341003602981c200320012802143602a41c200341981c6a10dd030b200b20032903a018370200202a2014280200360200024002402003280290080d00201b109c010c010b200328029808450d0020032802940810300b0240200328029814417b6a0e030c000c000b20034198146a109a010c0b0b200341981c6a20034198046a41f8031085051a0c010b200341981c6a20034198046a41f8031085051a0b024002400240024020032802981c417c6a0e03020001000b41d8a5c20041284194dec100102d000b2016201741c8031085051a410021020c010b2015200d290200370200201541086a200d41086a280200360200410121020b200320023602a010200128020421022001280208210520014200370204200342003702f40b200341f80f6a20012802002002200510fd0320034190086a41186a200341f80f6a41186a280200220236020020034190086a41106a200341f80f6a41106a290300370300201b200341f80f6a41086a290300370300200320032903f80f3703900802402002450d0020032002417f6a22263602a8080240024002402003280294082202450d002003280290082127200328029808222820022f01a629490d0103400240024020022802a02922050d00410021050c010b202741016a210620022f01a42921280b024041d82941a82920271b450d00200210300b024020050d00410221050c040b2006212720052102202820052f01a6294f0d000b20052102200621270c010b41b2abc200412b41d4a8c200102d000b202841016a21062002202841d0036c6a2129200220284104746a220541f8276a2128200541f0276a212a02402027450d00200220064102746a41a8296a280200210202402027417f6a2205450d00034020022802a82921022005417f6a22050d000b0b410021060b20282903002124202a29030021232029280200210520034198146a202941046a41cc031085051a0b200341800c6a20034198146a41cc031085051a0340200320063602980820032002360294082003410036029008200320053602a0182013200341800c6a41cc031085051a02400240200520032802a010470d000240024020054101460d002014201610f103450d020c010b20032802ac18220520032802ac10470d0120032802a41820032802a41020051088050d010b20034198146a200341a0186a41d0031085051a200341086a20034198146a2023202410ef030c010b20034198146a200341a0186a41d0031085051a200341f00b6a20034198146a20232024108d040b2026450d0120032026417f6a22263602a80802400240024002402002450d00200620022f01a629490d0141002106034041002105024020022802a0292229450d00200641016a212820022f01a4292127202921050b024041d82941a82920061b450d00200210300b024020050d00410221050c050b2028210620052102202720052f01a6294f0d000b202741016a21062005202741d0036c6a2129200520274104746a220241f8276a2903002124200241f0276a2903002123024020280d00200521020c030b200520064102746a41a8296a280200210202402028417f6a2205450d00034020022802a82921022005417f6a22050d000b0b410021060c020b41b2abc200412b41d4a8c200102d000b2002200641d0036c6a2129200220064104746a220541f8276a2903002124200541f0276a2903002123200641016a21060b2029280200210520034198146a202941046a41cc031085051a0b200341800c6a20034198146a41cc031085051a0c000b0b20034190086a10e603200110dc03200141086a200341f00b6a41086a280200360200200120032903f00b3702000240024020032802a0100d002016109c010c010b20032802a810450d0020032802a41010300b024020032802981c417c6a0e03090009000b200341981c6a109a010c080b202841016a21272005202841f8036c6a210602402029450d00200520274102746a41b02b6a280200210502402029417f6a2202450d00034020052802b02b21052002417f6a22020d000b0b410021270b20062802002102200341981c6a200641046a41f4031085051a0b200341a0186a200341981c6a41f4031085051a0240034020034198146a200341a0186a41f4031085051a200320023602981c200d200341a0186a41cc031085051a200e41206a200f41206a290200370200200e41186a200f41186a290200370200200e41106a200f41106a290200370200200e41086a200f41086a290200370200200e200f290200370200200a200341981c6a1096042026417f6a2226450d012005450d030240024002400240202720052f01ae2b490d0041002106034041002102024020052802a82b2229450d00200641016a212820052f01ac2b2127202921020b024041e02b41b02b20061b450d00200510300b024020020d00410221020c050b2002210520282106202720022f01ae2b4f0d000b2002202741f8036c6a2106024020280d00200221050c020b202741027420026a41b42b6a280200210502402028417f6a2202450d00034020052802b02b21052002417f6a22020d000b0b410021270c020b2005202741f8036c6a21060b202741016a21270b20062802002102200341981c6a200641046a41f4031085051a0b200341a0186a200341981c6a41f4031085051a0c000b0b410021060b2005450d04200341003602a41c200320273602a01c2003200536029c1c200320063602981c200341981c6a10dd030c040b41b2abc200412b41d4a8c200102d000b202841016a21062002202841d0036c6a2129200220284104746a220541f8276a2128200541f0276a212a02402027450d00200220064102746a41a8296a280200210202402027417f6a2205450d00034020022802a82921022005417f6a22050d000b0b410021060b20282903002124202a290300212320292802002105200341981c6a202941046a41cc031085051a0b20034198146a200341981c6a41cc031085051a0340200320063602a818200320023602a418200341003602a018200320053602981c200d20034198146a41cc031085051a200341086a200341981c6a2023202410ef032026450d0120032026417f6a22263602b81802400240024002402002450d00200620022f01a629490d0141002106034041002105024020022802a0292229450d00200641016a212820022f01a4292127202921050b024041d82941a82920061b450d00200210300b024020050d00410221050c050b2028210620052102202720052f01a6294f0d000b202741016a21062005202741d0036c6a2129200520274104746a220241f8276a2903002124200241f0276a2903002123024020280d00200521020c030b200520064102746a41a8296a280200210202402028417f6a2205450d00034020022802a82921022005417f6a22050d000b0b410021060c020b41b2abc200412b41d4a8c200102d000b2002200641d0036c6a2129200220064104746a220541f8276a2903002124200541f0276a2903002123200641016a21060b20292802002105200341981c6a202941046a41cc031085051a0b20034198146a200341981c6a41cc031085051a0c000b0b200341a0186a10e6030b20034198046a109a010b200c41887c6a210c20092007470d000c020b0b20072009460d0003402009109a012007200941f8036a2209470d000b0b02402008450d00200841f8036c450d00200410300b20002003290308370200200041106a200341086a41106a290300370200200041086a200341086a41086a2903003702000b200341a0206a24000bf80101037f230041206b220424000240024002402002450d00200221050240034020022f01a6292106024020010d002001450d020c050b2001450d042001417f6a2101200220064102746a41a8296a280200210220052802a82921050c000b0b2000200136020c200041003602082000200536020420002001360200200041146a2006360200200041106a20023602000c010b4100210320004100360204200041106a41003602000b20002003360218200441206a24000f0b200441146a410136020020044201370204200441f4a9c2003602002004410436021c200441eca9c2003602182004200441186a360210200441fca9c200103a000b8b0201057f230041206b2202240002400240024020012802042203450d002001280208210420012802002101200321050240034020032f01ae2b2106024020010d002001450d020c050b2001450d042001417f6a2101200320064102746a41b02b6a280200210320052802b02b21050c000b0b2000200136020c200041003602082000200536020420002001360200200041146a2006360200200041106a20033602000c010b4100210420004100360204200041106a41003602000b20002004360218200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b9004020c7f027e230041b0076b22012400200028020421022000410036020402402002450d0020002802002103024020002802182204450d0020002802082105200141d8036a2106200141d0036a4104722107200141a8076a21080340024002400240200520022f01a6294f0d0020022100200321090c010b03400240024020022802a02922000d00410021000c010b200341016a210920022f01a42921050b024041d82941a82920031b450d00200210300b024020000d00410221000c030b2009210320002102200520002f01a6294f0d000b0b200541016a210a2000200541d0036c6a2103200020054104746a220241f8276a210b200241f0276a210c0240024020090d0020002102200a21050c010b2000200a4102746a41a8296a280200210202402009417f6a2200450d00034020022802a82921022000417f6a22000d000b0b410021050b200b290300210d200c290300210e20032802002100200141d0036a200341046a41cc031085051a0b2004417f6a2104200141046a200141d0036a41cc031085051a200120003602d0032007200141046a41cc031085051a2008200d3703002001200e3703a0070240024020000d002006109c010c010b20012802d803450d0020012802d40310300b4100210320040d000b0b034020022802a0292100024041d82941a82920031b450d00200210300b200341016a21032000210220000d000b0b200141b0076a24000b8a0201057f230041206b22022400024002400240200128020422030d004100210420004100360204200041106a41003602000c010b20012802002104200321050240034020032f01a6292106024020040d002004450d020c040b2004450d032004417f6a2104200320064102746a41a8296a280200210320052802a82921050c000b0b2000200436020c200041003602082000200536020420002004360200200041146a2006360200200041106a2003360200200128020821040b20002004360218200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b8f0203047f017e017f230041206b22022400024002400240200128020422030d004100210341002104410021010c010b20012802002205ad4220862106200321040240034020032f01ae2b2107024020050d002005450d020c040b2005450d0320064280808080707c21062005417f6a2105200320074102746a41b02b6a280200210320042802b02b21040c000b0b200128020821010b20002001360218200020063702082000200436020420002005360200200041146a2007360200200041106a2003360200200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b9c0f03087f027e037f230041c00f6b22022400200028020821032000280204210420004200370204200241c80b6a20002802002004200310e403200242003702fc0720022802cc0b210320022802c80b210402400240024002400240024020022802e00b2205450d000240024002402003450d0020022802d00b220620032f01a629490d0103400240024020032802a02922070d00410021070c010b200441016a210820032f01a42921060b024041d82941a82920041b450d00200310300b024020070d00410221040c040b2008210420072103200620072f01a6294f0d000b20072103200821040c010b41b2abc200412b41d4a8c200102d000b200641016a21082003200641d0036c6a2107200320064104746a220641f8276a2109200641f0276a210602402004450d00200320084102746a41a8296a280200210302402004417f6a2204450d00034020032802a82921032004417f6a22040d000b0b410021080b2009290300210a2006290300210b20072802002104200241c80b6a200741046a41cc031085051a0b2002410c6a200241c80b6a41cc031085051a200241c80b6a410472210c02400340200220043602c80b200c2002410c6a41cc031085051a200241c80b6a200110800520024180046a200241c80b6a41d0031085051a200241c80b6a20024180046a41d0031085051a200241f8076a200241c80b6a200b200a10f5032005417f6a2205450d012003450d030240024002400240200820032f01a629490d0041002107034041002104024020032802a0292209450d00200741016a210620032f01a4292108200921040b024041d82941a82920071b450d00200310300b024020040d00410221040c050b2006210720042103200820042f01a6294f0d000b2004200841d0036c6a2107200420084104746a220341f8276a290300210a200341f0276a290300210b024020060d00200421030c020b200841027420046a41ac296a280200210302402006417f6a2204450d00034020032802a82921032004417f6a22040d000b0b410021080c020b2003200841d0036c6a2107200320084104746a220441f8276a290300210a200441f0276a290300210b0b200841016a21080b20072802002104200241c80b6a200741046a41cc031085051a0b2002410c6a200241c80b6a41cc031085051a0c000b0b410021040b02402003450d00034020032802a0292107024041d82941a82920041b450d00200310300b200441016a21042007210320070d000b0b200010f703200041086a200241f8076a41086a280200360200200020022903f807370200200041146a2802002103200029020c210b200041106a420037020020022003360288042002200b37038004200241c80b6a20024180046a10e5032002420037020420022802c80b210420022802cc0b2107024020022802e00b220d0d00200721030c040b02402007450d00024020022802d00b220620072f01ae2b4f0d0020072103200421090c030b03400240024020072802a82b22030d00410021030c010b200441016a210920072f01ac2b21060b024041e02b41b02b20041b450d00200710300b024020030d00410221040c050b2003210720092104200620032f01ae2b490d030c000b0b41b2abc200412b41d4a8c200102d000b41b2abc200412b41d4a8c200102d000b200641016a21082003200641f8036c6a210702402009450d00200320084102746a41b02b6a280200210302402009417f6a2204450d00034020032802b02b21032004417f6a22040d000b0b410021080b20072802002104200241c80b6a200741046a41f4031085051a0b2002410c6a200241c80b6a41f4031085051a200241c80b6a41cc036a210520024180046a41d0036a210c200241f8076a410472210e02400340200241c80b6a2002410c6a41f4031085051a200220043602f807200e2002410c6a41cc031085051a200241f8076a200110800520024180046a200241f8076a41d0031085051a200c41206a200541206a290200370200200c41186a200541186a290200370200200c41106a200541106a290200370200200c41086a200541086a290200370200200c2005290200370200200241c80b6a20024180046a41f8031085051a2002200241c80b6a109604200d417f6a220d450d012003450d030240024002400240200820032f01ae2b490d0041002107034041002104024020032802a82b2209450d00200741016a210620032f01ac2b2108200921040b024041e02b41b02b20071b450d00200310300b024020040d00410221040c050b2004210320062107200820042f01ae2b4f0d000b2004200841f8036c6a2107024020060d00200421030c020b200841027420046a41b42b6a280200210302402006417f6a2204450d00034020032802b02b21032004417f6a22040d000b0b410021080c020b2003200841f8036c6a21070b200841016a21080b20072802002104200241c80b6a200741046a41f4031085051a0b2002410c6a200241c80b6a41f4031085051a0c000b0b410021040b2000410c6a210802402003450d00034020032802a82b2107024041e02b41b02b20041b450d00200310300b200441016a21042007210320070d000b0b200810f803200841086a200241086a28020036020020082002290300370200200241c00f6a24000f0b41b2abc200412b41d4a8c200102d000b9e0903027f017e047f230041a0056b22022400200241086a41386a200141386a290200370300200241086a41306a200141306a290200370300200241086a41286a200141286a290200370300200241086a41206a200141206a290200370300200241086a41186a200141186a290200370300200241086a41106a200141106a290200370300200241086a41086a200141086a2902003703002002200129020037030820024188016a200241086a109f040240024002400240200228028801410c460d00200228022821030240024020022802084101460d00410021012003450d01200241c4006a28020021010c010b200241246a28020021012003450d00417f2001200241c4006a2802006a220320032001491b21010b0240417f200141016a220320032001491bad42f8037e2204422088a70d002004a72201417f4c0d002001102f2205450d02200520024188016a41f8031085051a200241c8006a41386a200241086a41386a290300370300200241c8006a41306a200241086a41306a290300370300200241c8006a41286a200241086a41286a290300370300200241c8006a41206a200241086a41206a290300370300200241c8006a41186a200241086a41186a290300370300200241c8006a41106a200241086a41106a290300370300200241c8006a41086a200241086a41086a29030037030020022002290308370348200141f8036e210620024188016a200241c8006a109f040240200228028801410c470d00410121010c040b41f8032103410221074101210102400340024020012006470d00200228026821080240024020022802484101460d00200228028401410020081b21060c010b200228026421062008450d00417f20062002280284016a220820082006491b21060b2001417f200641016a220820082006491b6a22062001490d0320072006200720064b1b22064104200641044b1bad42f8037e2204422088a74541037421062004a721080240024020010d0020024100360290050c010b2002410836029805200220033602940520022005360290050b20024180056a2008200620024190056a106920022802880521062002280280054101460d022002280284052105200641f8036e21060b200520036a20024188016a41f8031085051a200341f8036a2103200741026a2107200141016a210120024188016a200241c8006a109f04200228028801410c460d050c000b0b20060d020b102c000b20004200370204200041002802fce44136020002402002280208450d00200241086a41047210e6030b2002280228450d02200241306a2802002201450d022002412c6a2802002103200241346a28020021072002200241c4006a2802003602940120022007360290012002200136028c01200220033602880120024188016a10dd030c020b102a000b02402002280248450d00200241c8006a41047210e6030b02402002280268450d00200241f0006a2802002203450d00200241ec006a2802002107200241f4006a2802002108200220024184016a2802003602940120022008360290012002200336028c01200220073602880120024188016a10dd030b2000200136020820002006360204200020053602000b200241a0056a24000bb006030b7f027e037f230041f0036b2203240002400240024002402001450d0020032001417f6a220420022802a82910eb030240024020032802042201450d00200328020021050c010b41a829102f2201450d0341002105200141003b01a629200141003602a0290b41d829102f2206450d02200620013602a82941002107200641003b01a629200641003602a029200141003b01a429200120063602a029200320063602042003200541016a360200024020022f01a629450d00200641a8296a2108200241f0276a2109200241ac296a210a200641f0276a210b2003280208210c2002210d024002400340200341106a200d108e04200941086a290300210e2009290300210f200341e0036a2004200a28020010eb0320032802e80321100240024020032802e4032201450d0020032802e00321110c010b41a829102f2201450d0741002111200141003b01a629200141003602a0290b024020052011470d0020062f01a6292211410b4f0d022006201141016a22123b01a6292006201141d0036c6a200341106a41d0031085051a200b20114104746a2211200e3703082011200f370300200820124102746a2001360200200120123b01a429200120063602a029200d41d0036a210d200941106a2109200a41046a210a2010200c6a41016a210c200741016a220720022f01a6294f0d030c010b0b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b2003200c3602080b20002003290300370200200041086a200341086a2802003602000c010b41a829102f2209450d01200941003b01a629200941003602a0294100210a024020022f01a629450d00200241f0276a2101200941f0276a210d4100210a200221110340200341106a2011108e0420092f01a6292206410b4f0d04200141086a290300210e2001290300210f2009200641016a3b01a6292009200641d0036c6a200341106a41d0031085051a200d20064104746a2206200e3703082006200f370300201141d0036a2111200141106a2101200a41016a220a20022f01a629490d000b0b2000200a36020820002009360204200041003602000b200341f0036a24000f0b102a000b41aca1c200412041fc80c200102d000bae0b01107f230041a0046b22032400024002400240024002402001450d00200341086a2001417f6a220420022802b02b10ec0302400240200328020c2201450d00200328020821050c010b41b02b102f2201450d0341002105200141003b01ae2b200141003602a82b0b41e02b102f2206450d02200620013602b02b200641003b01ae2b200641003602a82b200141003b01ac2b200120063602a82b2003200636020c2003200541016a360208024020022f01ae2b450d00200641b02b6a2107200241b42b6a210820032802102109200341186a41d1036a220a41086a210b200a41186a210c200a41106a210d200221014100210e024002400340200341186a2001108e0402400240024002400240024002400240200141d0036a2d00000e0701020304050600010b200141dc036a280200220f417f4c0d0e200141d4036a280200211002400240200f0d00410121110c010b200f102f2211450d0e0b2003200f3602f003200320113602ec0320112010200f1085051a200341063a00e8032003200f3602f4030c060b200341003a00e8030c050b200341186a41e0036a200141e0036a290300370300200341013a00e8032003200141d8036a2903003703f0030c040b200341023a00e8032003200141d1036a2800003600e9030c030b200341033a00e8032003200141d1036a2900003700e9030c020b200b200141d9036a290000370000200a200141d1036a290000370000200341043a00e8030c010b200c200141e9036a290000370000200d200141e1036a290000370000200b200141d9036a290000370000200a200141d1036a290000370000200341053a00e8030b20034190046a2004200828020010ec03200328029804211202400240200328029404220f450d0020032802900421110c010b41b02b102f220f450d0741002111200f41003b01ae2b200f41003602a82b0b024020052011470d0020062f01ae2b2211410b4f0d022006201141016a22103b01ae2b2006201141f8036c6a200341186a41f8031085051a200720104102746a200f360200200f20103b01ac2b200f20063602a82b200141f8036a2101200841046a2108201220096a41016a2109200e41016a220e20022f01ae2b4f0d030c010b0b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b200320093602100b20002003290308370200200041086a200341086a41086a2802003602000c010b41b02b102f220f450d01200f41003b01ae2b200f41003602a82b41002108024020022f01ae2b450d00200341186a41d1036a221041086a2109201041186a2112201041106a210520022101410021080340200341186a2001108e0402400240024002400240024002400240200141d0036a2d00000e0701020304050600010b200141dc036a2802002206417f4c0d0b200141d4036a280200210e0240024020060d00410121110c010b2006102f2211450d0b0b200320063602f003200320113602ec032011200e20061085051a200341063a00e803200320063602f4030c060b200341003a00e8030c050b200341186a41e0036a200141e0036a290300370300200341013a00e8032003200141d8036a2903003703f0030c040b200341023a00e8032003200141d1036a2800003600e9030c030b200341033a00e8032003200141d1036a2900003700e9030c020b2009200141d9036a2900003700002010200141d1036a290000370000200341043a00e8030c010b2012200141e9036a2900003700002005200141e1036a2900003700002009200141d9036a2900003700002010200141d1036a290000370000200341053a00e8030b200f2f01ae2b2206410b4f0d05200f200641016a3b01ae2b200f200641f8036c6a200341186a41f8031085051a200141f8036a2101200841016a220820022f01ae2b490d000b0b200020083602082000200f360204200041003602000b200341a0046a24000f0b102a000b102c000b41aca1c200412041fc80c200102d000bf50c04067f027e037f017e230041900b6b2202240041012103410121044101210541012106024002400240024002400240024002400240024002400240024002402001280200220741786a0e0403020001060b200141d8036a2903002108200141d0036a2903002109200241086a41046a200141086a41c8031085051a200241003602980720024198076a410472200241086a41cc031085051a0240024020002802042205450d002000280200210a0c010b41a829102f2205450d074100210a200541003b01a629200541003602a02920002005360204200041003602000b0240034020052f01a629220b41d0036c210c4100210741e0272103417f2106024003400240200c2007470d00200b21060c020b200520076a2104200641016a2106200341106a2103200741d0036a210720024198076a2004109101220441ff01714101460d000b0240200441187441187541016a0e020100010b20024198076a108105200520036a2207427f2007290300220d20097c22092009200d542206200741086a2207290300220920087c2006ad7c220820095420082009511b22061b3703002007427f200820061b3703000c020b0240200a450d00200a417f6a210a200520064102746a41a8296a28020021050c010b0b200241a0076a22072802002103200229039807210d200241d4036a200241a4076a220441c4031085051a200720033602002002200d370398072004200241d4036a41c4031085051a200241f00a6a2006360200200241ec0a6a2005360200200220003602f40a200241003602e80a20024198076a200920081082051a0b4101210441002103410121050c030b200241086a41046a200141086a41c8031085051a41002105200241003602980720024198076a410472200241086a41cc031085051a20024198076a41f0036a200141f0036a29030037030020024198076a41e8036a200141e8036a29030037030020024198076a41e0036a200141e0036a29030037030020024198076a41d8036a200141d8036a2903003703002002200141d0036a2903003703e80a2000410c6a20024198076a10960441012103410121040c020b20024198076a410c6a2001410c6a280200360200200241f00a6a200141186a290300370300200241f80a6a200141206a290300370300200241800b6a200141286a290300370300200241880b6a200141306a2903003703004101210320024101360298072002200129020437029c072002200141106a2903003703e80a2000410c6a20024198076a1096044100210641012104410121050c020b200141186a2903002108200141106a290300210920024198076a410c6a2001410c6a28020036020020024101360298072002200129020437029c070240024020002802042205450d002000280200210a0c010b41a829102f2205450d044100210a200541003b01a629200541003602a02920002005360204200041003602000b0240034020052f01a629220b41d0036c210c4100210741e0272103417f2106024003400240200c2007470d00200b21060c020b200520076a2104200641016a2106200341106a2103200741d0036a210720024198076a2004109101220441ff01714101460d000b0240200441187441187541016a0e020100010b20024198076a108105200520036a2207427f2007290300220d20097c22092009200d542206200741086a2207290300220920087c2006ad7c220820095420082009511b22061b3703002007427f200820061b3703000c020b0240200a450d00200a417f6a210a200520064102746a41a8296a28020021050c010b0b200241a0076a22072802002103200229039807210d200241086a200241a4076a220441c4031085051a200720033602002002200d370398072004200241086a41c4031085051a200241f00a6a2006360200200241ec0a6a2005360200200220003602f40a200241003602e80a20024198076a200920081082051a0b4100210441012103410121050b410121060b200128020021070b200741786a0e0405040302010b102a000b2001109a010c040b2005450d03200141086a109c01200141d0036a2d00004106490d03200141d8036a280200450d03200141d4036a28020010300c030b2003450d02200141086a109c010c020b2006450d010240200141086a280200450d00200128020410300b200141106a2d00004106490d01200141186a280200450d01200141146a28020010300c010b2004450d00200141086a280200450d00200128020410300b200241900b6a24000b9a1203077f017e097f230041b0176b22022400200241f8036a200141f8031085051a0240024002400240024002400240024002400240024002400240024020002802042203450d00200028020021040c010b41b02b102f2203450d0141002104200341003b01ae2b200341003602a82b20002003360204200041003602000b034020032f01ae2b220541f8036c210641002101417f210702400340024020062001470d00200521070c020b200741016a2107200320016a2108200141f8036a2101200241f8036a2008109001220841ff01714101460d000b0240200841187441187541016a0e020100010b0240024020022802f8030d0020024180046a109c010c010b200228028004450d0020022802fc0310300b20022d00c8074106490d0d200241d0076a280200450d0d200241cc076a28020010300c0d0b02402004450d002004417f6a2104200320074102746a41b02b6a28020021030c010b0b20024180046a280200210620022903f80321092002410c6a20024184046a41ec031085051a024020032f01ae2b2201410a4b0d00200241f8036a2002410c6a41ec031085051a0240200720014f0d002003200741f8036c6a220841f8036a2008200120076b41f8036c1086051a0b2003200741f8036c6a22072006360208200720093703002007410c6a200241f8036a41ec031085051a2003200141016a3b01ae2b0c0b0b410521014100210502400240200741054f0d0041042101200721080c010b41052108024002402007417b6a0e020201000b200741796a210841012105410621010c010b41002108410121050b41b02b102f220a450d00200a41003b01ae2b200a41003602a82b200a20032f01ae2b220b2001417f736a22073b01ae2b2003200141f8036c6a2204280204210c2004280200210d200241f8036a200441086a41f0031085051a2007410c4f0d01200b200141016a22046b2007470d02200a2003200441f8036c6a200741f8036c1085052104200320013b01ae2b200241c0136a200241f8036a41f0031085051a2004200320051b22012f01ae2b2107200241f8036a2002410c6a41ec031085051a0240200841016a220520074b0d002001200541f8036c6a2001200841f8036c6a200720086b41f8036c1086051a0b2001200841f8036c6a22082006360208200820093703002008410c6a200241f8036a41ec031085051a2001200741016a3b01ae2b200241d00f6a200241c0136a41f0031085051a200241e00b6a200241d00f6a41f0031085051a02400240024020032802a82b22010d004100210e0c010b4100210e2004210f200c2110200d2111034020032f01ac2b2106200122052f01ae2b2203410b490d024100210441042101024020064105490d0020062101024002402006417b6a0e020201000b200641796a210641012104410621010c010b4100210641012104410521010b41e02b102f220a450d03200a41003b01ae2b200a41003602a82b200a20052f01ae2b220b2001417f736a22073b01ae2b2005200141f8036c6a2208280204210c2008280200210d200241f8036a200841086a41f0031085051a2007410c4f0d06200b200141016a22126b2007470d07200a200841f8036a200741f8036c1085052108200520013b01ae2b200241c0136a200241f8036a41f0031085051a20082f01ae2b220741016a210b2007410c4f0d08200320016b2201200b470d09200e41016a210e200841b02b6a200520124102746a41b02b6a20014102741085051a4100210102400340200820014102746a41b02b6a280200220320013b01ac2b200320083602a82b200120074f0d01200120012007496a220120074d0d000b0b200241d00f6a200241c0136a41f0031085051a2008200520041b22032f01ae2b2101200241f8036a200241e00b6a41f0031085051a0240200641016a220720014b0d002003200741f8036c6a2003200641f8036c6a200120066b41f8036c1086051a0b200141016a21042003200641f8036c6a220b2010360204200b2011360200200b41086a200241f8036a41f0031085051a200341b02b6a210b0240200641026a2211200141026a22104f0d00200b20114102746a200b20074102746a200120066b4102741086051a0b200b20074102746a200f360200200320043b01ae2b0240200720104f0d00200320064102746a41b42b6a2101034020012802002207200641016a22063b01ac2b200720033602a82b200141046a210120042006470d000b0b200241e00b6a200241d00f6a41f0031085051a200521032008210f200c2110200d211120052802a82b22010d000b0b200241f0076a200241e00b6a41f0031085051a20002802042207450d082000280200210841e02b102f2201450d01200120073602b02b200141003b01ae2b200141003602a82b200741003b01ac2b200720013602a82b200020013602042000200841016a3602002008200e470d0920012f01ae2b2207410b4f0d0a2001200741016a22083b01ae2b2001200741f8036c6a2207200c3602042007200d360200200741086a200241f0076a41f0031085051a200141b02b6a20084102746a200a360200200a20083b01ac2b200a20013602a82b2000200028020841016a3602080c0c0b200241f8036a200241e00b6a41f0031085051a200641016a21010240200320064d22080d002005200141f8036c6a2005200641f8036c6a200320066b41f8036c1086051a0b200341016a21042005200641f8036c6a2207201036020420072011360200200741086a200241f8036a41f0031085051a200541b02b6a2107200341026a210a024020080d00200641027420076a41086a200720014102746a200320066b4102741086051a0b200520043b01ae2b200720014102746a200f3602002001200a4f0d0a200341016a210320052001417f6a22014102746a41b42b6a2107034020072802002208200141016a22013b01ac2b200820053602a82b200741046a210720032001470d000c0b0b0b102a000b2007410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2007410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b200b410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b2000200028020841016a3602080b200241b0176a24000be30302087f017e230041b0076b22042400200441d0036a200141d0031085051a02400240024020002802042205450d00200028020021060c010b41a829102f2205450d0141002106200541003b01a629200541003602a02920002005360204200041003602000b0240034020052f01a629220741d0036c21084100210141e0272109417f210a02400340024020082001470d002007210a0c020b200520016a210b200a41016a210a200941106a2109200141d0036a2101200441d0036a200b109101220b41ff01714101460d000b0240200b41187441187541016a0e020100010b200441d0036a108105200520096a2201427f2001290300220c20027c22022002200c54220a200141086a2201290300220220037c200aad7c220320025420032002511b220a1b3703002001427f2003200a1b3703000c020b02402006450d002006417f6a21062005200a4102746a41a8296a28020021050c010b0b200441d8036a2201280200210920042903d003210c2004410c6a200441dc036a220b41c4031085051a200120093602002004200c3703d003200b2004410c6a41c4031085051a200441a8076a200a360200200441a4076a2005360200200420003602ac07200441003602a007200441d0036a200220031082051a0b200441b0076a24000f0b102a000bf20b02097f027e230041b0076b22022400024002400240024020012802004101470d002001410c6a2802002203417f4c0d02200128020421040240024020030d00410121050c010b2003102f2205450d040b200220033602102002200536020c2005200420031085051a200241086a410c6a2003360200200241a0076a41086a2206200241086a410472220341086a280200360200200220032902003703a007410021074100210841002109024002400240024002400240024020012d00d0030e0706010203040500060b200141dc036a2802002205417f4c0d08200141d4036a28020021010240024020050d00410121040c010b2005102f2204450d0a0b200541807e71210820042001200510850541807e712107410621092005210a0c050b200141d8036a290300220ba7220541807e712108200141e0036a290300210c200b422088a7210a41012109410021070c040b200141d1036a2f0000200141d3036a2d0000411074722103200141d4036a2d000021044102210941002107410021080c030b200141d1036a2f0000200141d3036a2d0000411074722103200141d4036a280200220441807e712107200141d8036a2d0000210541032109410021080c020b200141d1036a2f0000200141d3036a2d0000411074722103200141d8036a280200220541807e712108200141d4036a280200220441807e712107200141e0036a310000210c200141dc036a280200210a410421090c010b200241d8036a41086a200141f0036a2d00003a00002002200141e8036a2903003703d803200141d1036a2f0000200141d3036a2d0000411074722103200141d4036a280200220441807e712107200141d8036a290300220ba7220541807e712108200141e0036a290300210c200b422088a7210a410521090b200020022903a00737020420004109360200200041136a20034110763a0000200041116a20033b0000200041206a200c370300200041106a20093a0000200041286a20022903d8033703002000410c6a2006280200360200200041146a2007200441ff017172360200200041306a200241d8036a41086a290300370300200041186a200aad4220862008200541ff017172ad843703000c010b200241086a41086a2203200141086a10db034100210720024100360208200241d8036a200341c8031085051a4100210841002109024002400240024002400240024020012d00d0030e0706010203040500060b200141dc036a2802002205417f4c0d07200141d4036a28020021010240024020050d00410121040c010b2005102f2204450d090b200541807e71210820042001200510850541807e712107410621092005210a0c050b200141d8036a290300220ba7220541807e712108200141e0036a290300210c200b422088a7210a41012109410021070c040b200141d1036a2f0000200141d3036a2d0000411074722103200141d4036a2d000021044102210941002107410021080c030b200141d1036a2f0000200141d3036a2d0000411074722103200141d4036a280200220441807e712107200141d8036a2d0000210541032109410021080c020b200141d1036a2f0000200141d3036a2d0000411074722103200141d8036a280200220541807e712108200141d4036a280200220441807e712107200141e0036a310000210c200141dc036a280200210a410421090c010b200241a0076a41086a200141f0036a2d00003a00002002200141e8036a2903003703a007200141d1036a2f0000200141d3036a2d0000411074722103200141d4036a280200220441807e712107200141d8036a290300220ba7220541807e712108200141e0036a290300210c200b422088a7210a410521090b200041086a200241d8036a41c8031085051a200041d3036a20034110763a0000200041d1036a20033b0000200041e0036a200c370300200041d4036a2007200441ff017172360200200041d0036a20093a00002000410b360200200041e8036a20022903a007370300200041f0036a200241a0076a41086a290300370300200041d8036a200aad4220862008200541ff017172ad843703000b200241b0076a24000f0b102c000b102a000be20602027f017e410021020240024002400240024002400240024002402000280200220320012903002204a7470d004101210202400240024002400240024002400240024002400240024002400240024002400240024002402003417f6a0e080e00010203040506130b20044202520d12200041086a200141086a1097040d060c1a0b20044203520d11200041086a200141086a1097040d060c180b20044204520d10200041086a200141086a1097040d060c160b20044205520d0f200041086a200141086a1097040d060c140b20044206520d0e200041086a200141086a1097040d060c120b20044207520d0d200041086a200141086a1097040d060c100b20044208520d0c200041086a200141086a1097040d060c0e0b200041c0006a200141c0006a109704450d130c0b0b200041c0006a200141c0006a109704450d11200041f8006a200141f8006a109704450d110c0a0b200041c0006a200141c0006a109704450d0f200041f8006a200141f8006a109704450d0f200041b0016a200141b0016a109704450d0f0c090b200041c0006a200141c0006a109704450d0d200041f8006a200141f8006a1097040d070c0d0b200041c0006a200141c0006a109704450d0b200041f8006a200141f8006a109704450d0b200041b0016a200141b0016a1097040d050c0b0b200041c0006a200141c0006a109704450d09200041f8006a200141f8006a1097040d030c090b200041c0006a200141c0006a109704450d07200041f8006a200141f8006a109704450d07200041b0016a200141b0016a1097040d010c070b20044201510d050c040b200041e8016a200141e8016a109704450d05200041a0026a200141a0026a109704450d05200041d8026a200141d8026a109704450d0520004190036a20014190036a109704450d050c030b200041b0016a200141b0016a109704450d05200041e8016a200141e8016a109704450d05200041a0026a200141a0026a109704450d05200041d8026a200141d8026a109704450d050c020b200041e8016a200141e8016a109704450d05200041a0026a200141a0026a109704450d050c010b200041b0016a200141b0016a109704450d05200041e8016a200141e8016a109704450d050b20020f0b200041086a200141086a1097040f0b41000f0b41000f0b41000f0b41000f0b41000f0b41000f0b41000b920402087f037e230041b0076b220524000240024020012802042206450d00200128020021070340200641e0276a210820062f01a629220941d0036c2101417f210a2006210b02400340024020010d002009210a0c020b200a41016a210a200841106a2108200141b07c6a21012002200b109101210c200b41d0036a210b200c41ff01714101460d000b0240200c41187441187541016a0e020100010b2008290300220d20037d220e200d56200841086a290300220f20047d200d200354ad7d220d200f56200d200f511b0d022008200e3703002008200d370308200241086a290200210d0240024020022802004101470d00200228020421014108210b2003210f2004210e0c010b200241186a290200210e200241106a290200210f200541086a200241206a41b0031085051a410a210b0b200041146a4200370200200041086a4200370200200541d0036a200e370300200541c8036a200f370300200541b8036a41086a200d370300200520013602bc032005200b3602b803200541d8036a200541086a41b0031085051a20054190076a200437030020054188076a2003370300200041046a200541b8036a10ed03200041003602000c030b2007450d012007417f6a21072006200a4102746a41a8296a28020021060c000b0b20004101360200200241086a2101024020022802000d002001109c010c010b2001280200450d00200228020410300b200541b0076a24000be80a01037f23004180146b220424002004200241d003108505220241f0036a200341206a290300370300200241e8036a200341186a290300370300200241e0036a200341106a290300370300200241d8036a200341086a290300370300200220032903003703d0030240024002400240200141106a2802002203450d00200241f0076a200128020c2003200210ff0420022802f0074101460d00200241fc076a2802002103200241f8076a280200210520022802f4072104200241003a008708024002402004450d00200520034102746a41b02b6a280200210302402004417f6a2204450d000340200320032f01ae2b4102746a41b02b6a28020021032004417f6a22040d000b0b20032f01ae2b2104200241003602881020022004417f6a410020041b3602901020022003410020041b36028c10200241800c6a20024188106a20024187086a10950420024188086a200241800c6a41f8031085051a20022802f80f21040240024020024180106a2802002205200241fc0f6a28020022062f01ae2b4f0d00200621030c010b200621030340024020032802a82b22030d00410021030c020b200441016a210420062f01ac2b210520032106200520032f01ae2b4f0d000b0b20024188106a2003200541f8036c6a220641f8031085051a200620024188086a41f8031085051a02402004450d002004417f6a2204450d00200541027420036a41b42b6a2802002103034020032802b02b21032004417f6a22040d000b0b200241800c6a20024188106a41f8031085051a0c010b20022003360290102002200536028c102002410036028810200241800c6a20024188106a20024187086a1095040b20022802800c2103200241fc036a200241800c6a41047241f4031085051a200141146a22042004280200417f6a360200024020022d008708450d0020012802102204450d03200128020c2206450d0420042802b02b210520012006417f6a36020c20012005360210200541003602a82b200410300b20034102460d00200220033602800c200241800c6a410472200241fc036a41f4031085051a200241800c6a108105024020022d00d00f4106490d00200241d80f6a280200450d00200241d40f6a28020010300b200241d0036a210320022802002104200241800c6a2002410472220141cc031085051a0240024020044101470d0020024188106a41086a200141086a2802003602002002419c106a200341086a290200370200200241a4106a200341106a290200370200200241ac106a200341186a290200370200200241b4106a200341206a29020037020020022001290200370388102002200329020037029410410921030c010b20024188106a41046a200241800c6a41046a41c8031085051a20024188086a41206a200341206a29030037030020024188086a41186a200341186a29030037030020024188086a41106a200341106a29030037030020024188086a41086a200341086a2903003703002002200329030037038808410b21030b200041146a4200370200200041086a4200370200200220033602800c200241800c6a41047220024188106a41cc031085051a200241f00f6a200241a8086a290300370300200241e80f6a200241a0086a290300370300200241e00f6a20024198086a290300370300200241d80f6a20024188086a41086a290300370300200241d00f6a200229038808370300200041046a200241800c6a10ed03200041003602000c010b200041013602000240024020022802000d00200241086a109c010c010b2002280208450d00200228020410300b20022d00d0034106490d00200241d8036a280200450d00200241d4036a28020010300b20024180146a24000f0b41b2abc200412b41d0acc200102d000b41b7a2c200412141d8a2c200102d000bd40602097f037e230041a00b6b220324000240024020012802042204450d0020012802002105034020042f01a629220641d0036c21074100210841a4292109417f210a02400340024020072008470d002006210a0c020b200420086a210b200a41016a210a200941046a2109200841d0036a21082002200b109101220b41ff01714101460d000b0240200b41187441187541016a0e020100010b200341003a000f024002402005450d00200420096a2802002108024020054101460d004101210a0340200820082f01a6294102746a41a8296a28020021082005200a41016a220a470d000b0b20082f01a629210a200341003602d0072003200a417f6a4100200a1b3602d807200320084100200a1b3602d407200341e0036a200341d0076a2003410f6a10fe04200341106a200341e0036a41d0031085051a200341b8076a290300210c20032903b007210d20032802c007210b02400240200341c8076a2802002209200341c4076a280200220a2f01a6294f0d00200a21080c010b03400240200a2802a02922080d00410021080c020b200b41016a210b200a2f01a42921092008210a200920082f01a6294f0d000b0b200341d0076a2008200941d0036c6a220a41d0031085051a200a200341106a41d0031085051a200820094104746a220a41f0276a2204290300210e2004200d370300200a41f8276a220a290300210d200a200c3703000240200b450d00200b417f6a220a450d00200941027420086a41ac296a2802002108034020082802a8292108200a417f6a220a0d000b0b200341e0036a200341d0076a41d0031085051a200341b8076a200d3703002003200e3703b0070c010b2003200a3602d807200320043602d407200341003602d007200341e0036a200341d0076a2003410f6a10fe040b2000200341e0036a41e0031085051a20012001280208417f6a36020820032d000f450d030240024020012802042208450d0020012802002209450d0120082802a829210a20012009417f6a3602002001200a360204200a41003602a029200810300c050b41b2abc200412b41d0acc200102d000b41b7a2c200412141d8a2c200102d000b02402005450d002005417f6a21052004200a4102746a41a8296a28020021040c010b0b200041023602000c010b200041023602000b200341a00b6a24000ba80302087f017e230041b0076b22042400200441d0036a200141d0031085051a02400240024020002802042205450d00200028020021060c010b41a829102f2205450d0141002106200541003b01a629200541003602a02920002005360204200041003602000b02400340200541e0276a210720052f01a629220841d0036c2101417f21092005210a02400340024020010d00200821090c020b200941016a2109200741106a2107200141b07c6a2101200441d0036a200a109101210b200a41d0036a210a200b41ff01714101460d000b0240200b41187441187541016a0e020100010b200441d0036a10810520072003370308200720023703000c020b02402006450d002006417f6a2106200520094102746a41a8296a28020021050c010b0b200441d8036a2201280200210a20042903d003210c2004410c6a200441dc036a220741c4031085051a2001200a3602002004200c3703d00320072004410c6a41c4031085051a200441a8076a2009360200200441a4076a2005360200200420003602ac07200441003602a007200441d0036a200220031082051a0b200441b0076a24000f0b102a000be50e03027f017e1f7f23004190106b2203240020004200370204200041106a4200370200200341086a41086a200141146a2802002204360200200129020c2105200141106a420037020020032005370308200341980c6a41086a2004360200200320053703980c200341186a200341980c6a10e50320032802182106200328021c210702400240200328023022080d00200721040c010b0240024002402007450d0002402003280220220920072f01ae2b4f0d00200721042006210a0c020b03400240024020072802a82b22040d00410021040c010b200641016a210a20072f01ac2b21090b024041e02b41b02b20061b450d00200710300b024020040d00410221060c040b20042107200a2106200920042f01ae2b490d020c000b0b41b2abc200412b41d4a8c200102d000b200941016a210b2004200941f8036c6a21070240200a450d002004200b4102746a41b02b6a28020021040240200a417f6a2206450d00034020042802b02b21042006417f6a22060d000b0b4100210b0b20072802002106200341980c6a200741046a41f4031085051a0b2001410c6a210c2000410c6a210d200341386a200341980c6a41f4031085051a200241c8006a210e20024198036a210f200241e0026a2110200241a8026a2111200241f0016a2112200241b8016a211320024180016a2114200241106a2115200341980c6a41d0036a2100200341ac046a41cc036a2101200341a0086a4104722116200341a0086a41c8006a2117200341a0086a4198036a2118200341a0086a41e0026a2119200341a0086a41a8026a211a200341a0086a41f0016a211b200341a0086a41b8016a211c200341a0086a4180016a211d200341a0086a41106a211e2002280200211f0340200341ac046a200341386a41f4031085051a200320063602a0082016200341386a41cc031085051a200341f00b6a41206a2207200141206a2220290200370300200341f00b6a41186a2209200141186a2221290200370300200341f00b6a41106a220a200141106a2222290200370300200341f00b6a41086a2223200141086a2224290200370300200320012902003703f00b2008417f6a2108024002402006201f470d000240024002400240201f0d0020032802a808220620022903082205a7470d0402400240024002400240024002402006417f6a0e0808000102030405060a0b20054202520d09201e2015109704450d0a2017200e109704450d0a0c090b20054203520d08201e2015109704450d092017200e109704450d09201d2014109704450d090c080b20054204520d07201e2015109704450d082017200e109704450d08201d2014109704450d08201c2013109704450d080c070b20054205520d06201e2015109704450d072017200e109704450d07201d2014109704450d07201c2013109704450d07201b2012109704450d070c060b20054206520d05201e2015109704450d062017200e109704450d06201d2014109704450d06201c2013109704450d06201b2012109704450d06201a2011109704450d060c050b20054207520d04201e2015109704450d052017200e109704450d05201d2014109704450d05201c2013109704450d05201b2012109704450d05201a2011109704450d0520192010109704450d050c040b20054208520d03201e2015109704450d042017200e109704450d04201d2014109704450d04201c20131097040d020c040b20032802ac082206200228020c470d0320032802a408200228020420061088050d030c020b20054201520d01201e2015109704450d020c010b201b2012109704450d01201a2011109704450d0120192010109704450d012018200f109704450d010b200341980c6a200341a0086a41d0031085051a200041206a2020290200370200200041186a2021290200370200200041106a2022290200370200200041086a202429020037020020002001290200370200200d200341980c6a1096040c010b200341980c6a200341a0086a41d0031085051a200041206a2007290300370300200041186a2009290300370300200041106a200a290300370300200041086a2023290300370300200020032903f00b370300200c200341980c6a1096040b024020080d00410021060c020b02402004450d000240024002400240200b20042f01ae2b490d0041002107034041002106024020042802a82b220a450d00200741016a210920042f01ac2b210b200a21060b024041e02b41b02b20071b450d00200410300b024020060d00410221060c050b2006210420092107200b20062f01ae2b4f0d000b2006200b41f8036c6a2107024020090d00200621040c020b200b41027420066a41b42b6a280200210402402009417f6a2206450d00034020042802b02b21042006417f6a22060d000b0b4100210b0c020b2004200b41f8036c6a21070b200b41016a210b0b20072802002106200341980c6a200741046a41f4031085051a0b200341386a200341980c6a41f4031085051a0c010b0b41b2abc200412b41d4a8c200102d000b02402004450d00034020042802a82b2107024041e02b41b02b20061b450d00200410300b200641016a21062007210420070d000b0b20034190106a24000b9f0402097f027e230041b0076b22012400200028020421022000410036020402402002450d00024020002802002203450d00034020022802a82921022003417f6a22030d000b0b024020002802082204450d00200141d0036a410472210541002106200141a8076a210703402004417f6a21040240024002400240200620022f01a629490d0041002100034041002103024020022802a0292208450d00200041016a210920022f01a4292106200821030b024041d82941a82920001b450d00200210300b024020030d00410221030c050b2009210020032102200620032f01a6294f0d000b2003200641d0036c6a2100200320064104746a220241f8276a290300210a200241f0276a290300210b024020090d00200321020c020b200641027420036a41ac296a280200210202402009417f6a2203450d00034020022802a82921022003417f6a22030d000b0b410021060c020b2002200641d0036c6a2100200220064104746a220341f8276a290300210a200341f0276a290300210b0b200641016a21060b20002802002103200141d0036a200041046a41cc031085051a0b200141046a200141d0036a41cc031085051a200120033602d0032005200141046a41cc031085051a2007200a3703002001200b3703a007200141d0036a10810520040d000b0b41002103034020022802a0292100024041d82941a82920031b450d00200210300b2003417f6a21032000210220000d000b0b200141b0076a24000be90301087f230041f0076b22012400200028020421022000410036020402402002450d00024020002802002203450d00034020022802b02b21022003417f6a22030d000b0b024020002802082204450d00200141f8036a41047221054100210603400240024002400240200620022f01ae2b490d0041002100034041002103024020022802a82b2207450d00200041016a210820022f01ac2b2106200721030b024041e02b41b02b20001b450d00200210300b024020030d00410221030c050b2003210220082100200620032f01ae2b4f0d000b2003200641f8036c6a2100024020080d00200321020c020b200641027420036a41b42b6a280200210202402008417f6a2203450d00034020022802b02b21022003417f6a22030d000b0b410021060c020b2002200641f8036c6a21000b200641016a21060b20002802002103200141f8036a200041046a41f4031085051a0b2004417f6a2104200141046a200141f8036a41f4031085051a200120033602f8032005200141046a41f4031085051a200141f8036a108105024020012d00c8074106490d0020012802d007450d0020012802cc0710300b20040d000b0b41002103034020022802a82b2100024041e02b41b02b20031b450d00200210300b2003417f6a21032000210220000d000b0b200141f0076a24000bc50801027f0240024002400240024002400240024020002d00000e0707000102030405060b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041106a109c010f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0520024198046c450d05200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b0240200041186a2802002201450d00200041106a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b200041146a2802002202450d04200241f8036c450d04200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0320024198046c450d03200028021010300f0b02402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b0240200041086a2802002202450d00200241f8036c450d00200028020410300b200041206a109c010240200041186a2802002201450d00200041106a280200210220014198046c21010340200210a00120024198046a2102200141e87b6a22010d000b0b200041146a2802002202450d0220024198046c450d02200028021010300f0b200041186a109c0102402000410c6a2802002201450d00200041046a2802002102200141f8036c210103402002109a01200241f8036a2102200141887c6a22010d000b0b200041086a2802002202450d01200241f8036c450d01200028020410300c010b200041106a109a0102402000410c6a2802002201450d00200041046a2802002102200141e8036c210103402002109601200241e8036a2102200141987c6a22010d000b0b200041086a2802002202450d00200241e8036c450d00200028020410300f0b0b950201057f230041206b22022400024002400240200128020422030d004100210420004100360204200041106a41003602000c010b20012802002104200321050240034020032f018a0c2106024020040d002004450d020c040b2004450d032004417f6a2104200320064102746a418c0c6a2802002103200528028c0c21050c000b0b2000200436020c200041003602082000200536020420002004360200200041146a2006360200200041106a2003360200200128020821040b200020043602182000200141d8006a36021c200241206a24000f0b200241146a410136020020024201370204200241f4a9c2003602002002410436021c200241eca9c2003602182002200241186a360210200241fca9c200103a000b7e01027f230041306b22022400200241146a4104360200200241ac8fc2003602102002410436020c200241a48fc2003602082001411c6a2802002103200128021821012002412c6a41023602002002420237021c200241b48fc2003602182002200241086a36022820012003200241186a10322101200241306a240020010b8e0101037f230041106b220224002000280200210320012000280208220010a501024002402000450d002000410574210003404120102f2204450d02200242203702042002200436020020022003412010642001200228020022042002280208106402402002280204450d00200410300b200341206a2103200041606a22000d000b0b200241106a24000f0b102a000bf80101037f230041206b220424000240024002402002450d00200221050240034020022f01a6292106024020010d002001450d020c050b2001450d042001417f6a2101200220064102746a41a8296a280200210220052802a82921050c000b0b2000200136020c200041003602082000200536020420002001360200200041146a2006360200200041106a20023602000c010b4100210320004100360204200041106a41003602000b20002003360218200441206a24000f0b200441146a410136020020044201370204200441f4a9c2003602002004410436021c200441eca9c2003602182004200441186a360210200441fca9c200103a000b890201037f230041d0006b22022400200241086a41dca4c000410610ab01200241186a4190e0c100410910ab01200220013602342002200241346a4104108b02370338200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a10b803024002402002280230220341206a2201417f4c0d000240024020010d00410121040c010b2001102f2204450d020b2000410036020820002001360204200020043602002000200241086a411010b9032000200241186a411010b903200020022802282201200310b9030240200228022c450d00200110300b200241d0006a24000f0b102c000b102a000bb70201037f23004180016b22022400024002400240024020012802002203411071450d0020002802002103410021000340200220006a41ff006a2003410f712204413072200441d7006a2004410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d02200141a8f7c1004102200220006a4180016a410020006b104021000c010b02402003412071450d0020002802002103410021000340200220006a41ff006a2003410f712204413072200441376a2004410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d03200141a8f7c1004102200220006a4180016a410020006b104021000c010b20003502002001103c21000b20024180016a240020000f0b2003418001419087c000104a000b2003418001419087c000104a000bd00302057f047e230041d0006b22012400200141286a41186a22024200370300200141286a41106a22034200370300200141286a41086a2204420037030020014200370328200141086a41dca4c000410610ab012004200141086a41086a220529000037030020012001290008370328200141086a4198bfc100410b10ab012002200529000037030020032001290008370300200141086a200141286a108104200141086a41186a2903002106200141086a41106a2903002107200129031021082001290308210920024200370300200342003703002004420037030020014200370328200141086a41dca4c000410610ab012004200529000037030020012001290008370328200141086a4198bfc100410b10ab0120022005290000370300200320012900083703002001420137030820014100360210200120084200200942015122021b370348200141086a200141c8006a4108106420012007420020021b370348200141086a200141c8006a410810642001427f2006420020021b220620007c220020002006541b370348200141086a200141c8006a41081064200141286a412020012802082202200128021041002802fcad421103000240200128020c450d00200210300b200141d0006a24000bc40202037f017e230041d0006b220224002002412036020420022001360200200241086a2001412041002802d4ad4211040002400240200228020822010d00200042003703000c010b200228020c2103024002400240200241086a41086a28020022044108490d00200441787141786a0e09000101010101010100010b420021052002420037021c200241002802dc94423602182002410936022c200220023602282002200241186a360234200241cc006a41013602002002420137023c200241a0e6c1003602382002200241286a360248200241346a41d0adc000200241386a10321a2002280218200228022010ad01200228021c450d01200228021810300c010b200041186a2001290010370300200041106a200129000837030020002001290000370308420121050b200020053703002003450d00200110300b200241d0006a24000b890201037f230041d0006b22022400200241086a41dca4c000410610ab01200241186a4183e0c100410d10ab01200220013602342002200241346a4104108b02370338200241cc006a200241346a41046a3602002002200241c0006a3602442002200241346a3602482002200241386a360240200241286a200241c0006a10b803024002402002280230220341206a2201417f4c0d000240024020010d00410121040c010b2001102f2204450d020b2000410036020820002001360204200020043602002000200241086a411010b9032000200241186a411010b903200020022802282201200310b9030240200228022c450d00200110300b200241d0006a24000f0b102c000b102a000bc40301097f230041206b220224000240024020012802082203410c6c41046a2204417f4c0d00200128020021050240024020040d00410121060c010b2004102f2206450d020b2002410036020820022004360204200220063602002003200210a80302402003450d0020052003410c6c6a210720052104034020042802002106200441086a2802002208200210a80320022006200810642004410c6a22042007470d000b0b2002280204210920023502084220862002280200220aad8410142104200241186a22064200370300200241106a22084200370300200241086a22074200370300200242003703002007200441086a2900003703002008200441106a2900003703002006200441186a2900003703002002200429000037030020041030200041186a2006290300370000200041106a2008290300370000200041086a20072903003700002000200229030037000002402009450d00200a10300b02402003450d002003410c6c21062005210403400240200441046a280200450d00200428020010300b2004410c6a2104200641746a22060d000b0b0240200141046a2802002204450d002004410c6c450d00200510300b200241206a24000f0b102c000b102a000b13002000410a360204200041909ac1003602000b3400200041dca4c00036020420004100360200200041146a4110360200200041106a41a4b3c100360200200041086a42063702000b130020004106360204200041dccfc1003602000b4201027f230041106b2202240002404101102f22030d00102a000b20004201370204200020033602002002412a3a000f20002002410f6a41011064200241106a24000b920101017f230041c0006b22022400200241386a41002903f8a340370300200241306a41002903f0a340370300200241286a41002903e8a340370300200241206a41002903e0a340370300200241186a41002903d8a340370300200241106a41002903d0a340370300200241086a41002903c8a340370300200241002903c0a3403703002000200210a003200241c0006a24000b4601017f230041106b220224002000410036020820004201370200200242003703082000200241086a41081064200242003703082000200241086a41081064200241106a24000b4301027f230041106b2202240002404104102f22030d00102a000b2000420437020420002003360200200241fa0136020c20002002410c6a41041064200241106a24000b6101017f230041106b2202240020004100360208200042013702002002418080f0013602082000200241086a410410642002418080c00236020c20002002410c6a410410642002418080c0023602042000200241046a41041064200241106a24000b7701017f230041c0016b22022400200210d6012000410036020820004201370200200220022903003703b8012000200241b8016a41081064200220022903083703b8012000200241b8016a41081064200241106a200010ef01200241c8006a200010ef0120024180016a200010ef01200241c0016a24000bfe1505087f017e047f027e057f230041c0156b22042400200441d0036a200141d0031085051a0240024002400240024002400240024002400240024002400240024020002802042205450d00200028020021060c010b41a829102f2205450d0141002106200541003b01a629200541003602a02920002005360204200041003602000b034020052f01a629220741d0036c21084100210141e0272109417f210a02400340024020082001470d002007210a0c020b200520016a210b200a41016a210a200941106a2109200141d0036a2101200441d0036a200b109101220b41ff01714101460d000b0240200b41187441187541016a0e020100010b0240024020042802d0030d00200441d8036a109c010c010b20042802d803450d0020042802d40310300b200520096a22012003370308200120023703000c0d0b02402006450d002006417f6a21062005200a4102746a41a8296a28020021050c010b0b200441d8036a280200210b20042903d003210c2004410c6a200441dc036a41c4031085051a02400240024002400240024020052f01a6292201410a4b0d00200441d0036a2004410c6a41c4031085051a2005200a41d0036c6a2109200a2001490d012009200c3703002009200b3602082009410c6a200441d0036a41c4031085051a200541f0276a21090c020b410521014100210d02400240200a41054f0d0041042101200a21090c010b4105210902400240200a417b6a0e020201000b200a41796a21094101210d410621010c010b410021094101210d0b41a829102f2207450d05200741003b01a629200741003602a029200720052f01a62922062001417f736a220a3b01a6292005200141d0036c6a2208280204210e2008280200210f200441d0036a200841086a41c8031085051a200a410c4f0d062006200141016a22086b200a470d07200541f0276a221020014104746a220641086a29030021112006290300211220072005200841d0036c6a200a41d0036c108505220641f0276a201020084104746a200a4104741085051a200520013b01a629200441f8116a200441d0036a41c8031085051a20062005200d1b22012f01a6292108200441d0036a2004410c6a41c4031085051a2001200941d0036c6a210a02400240200941016a220d20084d0d00200a200c370300200a200b360208200a410c6a200441d0036a41c4031085051a200141f0276a210a0c010b2001200d41d0036c6a200a200820096b221041d0036c1086051a200a200b360208200a200c370300200a410c6a200441d0036a41c4031085051a200141f0276a220a200d4104746a200a20094104746a20104104741086051a0b200a20094104746a220a2003370308200a20023703002001200841016a3b01a629200441b00e6a200441f8116a41c8031085051a200441e80a6a200441b00e6a41c8031085051a20052802a02922010d02410021100c030b2005200a41016a220841d0036c6a20092001200a6b220641d0036c1086051a2009200b3602082009200c3703002009410c6a200441d0036a41c4031085051a200541f0276a220920084104746a2009200a4104746a20064104741086051a0b2009200a4104746a220a2003370308200a20023703002005200141016a3b01a6290c0d0b20122102201121034100211020062113200e2114200f2115034020052f01a4292105200122062f01a629220d410b490d024100210841042101024020054105490d0020052101024002402005417b6a0e020201000b200541796a210541012108410621010c010b4100210541012108410521010b41d829102f2207450d03200741003b01a629200741003602a029200720062f01a62922162001417f736a220a3b01a6292006200141d0036c6a2209280204210e2009280200210f200441d0036a200941086a41c8031085051a200a410c4f0d062016200141016a220b6b200a470d07200641f0276a221620014104746a221741086a2903002111201729030021122007200941d0036a200a41d0036c108505220941f0276a2016200b4104746a200a4104741085051a200620013b01a629200441f8116a200441d0036a41c8031085051a20092f01a629220a41016a2116200a410c4f0d08200d20016b22012016470d09201041016a2110200941a8296a2006200b4102746a41a8296a20014102741085051a4100210102400340200920014102746a41a8296a280200220b20013b01a429200b20093602a0292001200a4f0d0120012001200a496a2201200a4d0d000b0b200441b00e6a200441f8116a41c8031085051a2009200620081b220b2f01a6292101200441d0036a200441e80a6a41c8031085051a0240200541016a220a20014b22160d00200b200a41d0036c6a200b200541d0036c6a200120056b41d0036c1086051a0b200b200541d0036c6a2208201436020420082015360200200841086a200441d0036a41c8031085051a200b41f0276a210d024020160d00200d200a4104746a200d20054104746a200120056b4104741086051a0b200141016a2108200d20054104746a220d2003370308200d2002370300200b41a8296a210d0240200541026a2215200141026a22144f0d00200d20154102746a200d200a4102746a200120056b4102741086051a0b200d200a4102746a2013360200200b20083b01a6290240200a20144f0d00200b20054102746a41ac296a210103402001280200220a200541016a22053b01a429200a200b3602a029200141046a210120082005470d000b0b200441e80a6a200441b00e6a41c8031085051a20122102201121032006210520092113200e2114200f211520062802a02922010d000b0b200441a0076a200441e80a6a41c8031085051a2000280204220a450d082000280200210941d829102f2201450d012001200a3602a829200141003b01a629200141003602a029200a41003b01a429200a20013602a029200020013602042000200941016a36020020092010470d0920012f01a629220a410b4f0d0a2001200a41016a22093b01a6292001200a41d0036c6a220b200e360204200b200f360200200b41086a200441a0076a41c8031085051a2001200a4104746a220a41f8276a2011370300200a41f0276a2012370300200141a8296a20094102746a2007360200200720093b01a429200720013602a0292000200028020841016a3602080c0c0b200441d0036a200441e80a6a41c8031085051a0240200d20054d0d002006200541d0036c6a220141d0036a2001200d20056b41d0036c1086051a0b200d41016a21092006200541d0036c6a2201201436020420012015360200200141086a200441d0036a41c8031085051a200641f0276a220b20054104746a210a200541016a210102400240200d20054b0d00200a2002370300200a2003370308200641a8296a210a200d41026a210b0c010b200b20014104746a200a200d20056b220b4104741086051a200a2003370308200a20023703002005410274200641a8296a220a6a41086a200a20014102746a200b4102741086051a200d41026a210b0b200a200141027422056a2013360200200620093b01a6292001200b4f0d0a200520066a41a8296a210a0340200a280200220920013b01a429200920063602a029200a41046a210a200b200141016a2201470d000c0b0b0b102a000b200a410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b200a410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2016410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b2000200028020841016a3602080b200441c0156a24000bcf0e02037f017e230041c0036b22022400024002400240024020012802004101470d002001410c6a2802002203417f4c0d02200128020421044101210102402003450d002003102f2201450d040b20002001360204200041086a20033602002001200420031085051a200041013602002000410c6a20033602000c010b42002105024002400240024002400240024002400240200141086a2802000e09080102030405060700080b20024188036a200141106a10f101200241d0026a200141c8006a10f10120024198026a20014180016a10f101200241e0016a200141b8016a10f101200241a8016a200141f0016a10f101200241f0006a200141a8026a10f101200241386a200141e0026a10f101200220014198036a10f101420821050c070b20024188036a200141106a10f101420121050c060b20024188036a200141106a10f101200241d0026a200141c8006a10f101420221050c050b20024188036a200141106a10f101200241d0026a200141c8006a10f10120024198026a20014180016a10f101420321050c040b20024188036a200141106a10f101200241d0026a200141c8006a10f10120024198026a20014180016a10f101200241e0016a200141b8016a10f101420421050c030b20024188036a200141106a10f101200241d0026a200141c8006a10f10120024198026a20014180016a10f101200241e0016a200141b8016a10f101200241a8016a200141f0016a10f101420521050c020b20024188036a200141106a10f101200241d0026a200141c8006a10f10120024198026a20014180016a10f101200241e0016a200141b8016a10f101200241a8016a200141f0016a10f101200241f0006a200141a8026a10f101420621050c010b20024188036a200141106a10f101200241d0026a200141c8006a10f10120024198026a20014180016a10f101200241e0016a200141b8016a10f101200241a8016a200141f0016a10f101200241f0006a200141a8026a10f101200241386a200141e0026a10f101420721050b200041086a2005370300200041106a200229038803370300200041c8006a20022903d002370300200041186a20024188036a41086a290300370300200041206a20024188036a41106a290300370300200041286a20024188036a41186a290300370300200041306a20024188036a41206a290300370300200041386a20024188036a41286a290300370300200041c0006a20024188036a41306a290300370300200041d0006a200241d0026a41086a290300370300200041d8006a200241d0026a41106a290300370300200041e0006a200241d0026a41186a290300370300200041e8006a200241d0026a41206a290300370300200041f0006a200241d0026a41286a290300370300200041f8006a200241d0026a41306a290300370300200041b0016a20024198026a41306a290300370300200041a8016a20024198026a41286a290300370300200041a0016a20024198026a41206a29030037030020004198016a20024198026a41186a29030037030020004190016a20024198026a41106a29030037030020004188016a20024198026a41086a29030037030020004180016a200229039802370300200041e8016a200241e0016a41306a290300370300200041e0016a200241e0016a41286a290300370300200041d8016a200241e0016a41206a290300370300200041d0016a200241e0016a41186a290300370300200041c8016a200241e0016a41106a290300370300200041c0016a200241e0016a41086a290300370300200041b8016a20022903e001370300200041a0026a200241a8016a41306a29030037030020004198026a200241a8016a41286a29030037030020004190026a200241a8016a41206a29030037030020004188026a200241a8016a41186a29030037030020004180026a200241a8016a41106a290300370300200041f8016a200241a8016a41086a290300370300200041f0016a20022903a801370300200041d8026a200241f0006a41306a290300370300200041d0026a200241f0006a41286a290300370300200041c8026a200241f0006a41206a290300370300200041c0026a200241f0006a41186a290300370300200041b8026a200241f0006a41106a290300370300200041b0026a200241f0006a41086a290300370300200041a8026a200229037037030020004190036a200241386a41306a29030037030020004188036a200241386a41286a29030037030020004180036a200241386a41206a290300370300200041f8026a200241386a41186a290300370300200041f0026a200241386a41106a290300370300200041e8026a200241386a41086a290300370300200041e0026a2002290338370300200041c8036a200241306a290300370300200041c0036a200241286a290300370300200041b8036a200241206a290300370300200041b0036a200241186a290300370300200041a8036a200241106a290300370300200041a0036a200241086a29030037030020004198036a2002290300370300200041003602000b200241c0036a24000f0b102c000b102a000b130020004105360204200041e0d8c1003602000b8605010a7f230041b0026b22012400200028020421022000410036020402402002450d00024020002802002203450d000340200228028c0c21022003417f6a22030d000b0b024020002802082204450d0020014190016a410c6a2105200141a4016a21064100210003400240024002400240200020022f018a0c490d0041002100034041002103024020022802002207450d00200041016a210820022f01880c2109200721030b024041bc0c418c0c20001b450d00200210300b024020030d00410221030c050b2008210020032102200920032f018a0c4f0d000b200320094107746a4188016a210a20032009410c6c6a41046a2107024020080d00200321020c020b200941027420036a41900c6a280200210202402008417f6a2200450d000340200228028c0c21022000417f6a22000d000b0b410021000c020b200220004107746a4188016a210a20022000410c6c6a41046a210720002109200221030b200941016a21000b200141a0026a41086a200741086a280200360200200120072902003703a002200320094107746a2208418c016a2802002103200a280200210920014190016a20084190016a41f8001085051a0b2004417f6a210420014180016a41086a2208200141a0026a41086a280200360200200120012903a00237038001200141086a20014190016a41f8001085051a20014190016a41086a2008280200360200200120012903800137039001200120033602a0012001200936029c012006200141086a41f8001085051a0240200128029401450d0020012802900110300b200510d90220040d000b0b41002103034020022802002100024041bc0c418c0c20031b450d00200210300b2003417f6a21032000210220000d000b0b200141b0026a24000bbf1703027f047e1e7f230041f0086b22042400200441086a41086a2001280208220541086a2900002206370300200441086a41106a200541106a2900002207370300200441086a41186a200541186a29000022083703002004200529000022093703082001280204210a2001280200210b200441286a41186a220c2008370300200441286a41106a220d2007370300200441286a41086a220e2006370300200420093703282003410174210f20044190076a4102722110200441f0016a4104722111200441d0036a41026a2112200441286a410772211320044190076a41186a211420044190076a410c6a2115200441f0016a41206a2116410021054100211741002118024002400240024002400240024002400240024002400240024002400240024002400340201841017621010240024020184101710d00200120034b0d03200441003a009807200420013602940720042002360290070c010b200120034b0d03200120034f0d04200441013a009807200420023602900720042001360294072004200220016a2d000041f001713a0099070b200441d0036a200b200441286a20044190076a200a28020c110300024020042802d00322190d0020044190076a41186a2205200441286a41186a29030037030020044190076a41106a221a200441286a41106a29030037030020044190076a41086a221b200441286a41086a29030037030020042004290328370390074130102f22010d100c120b20042802d403211c20044190076a201920042802d803221b10ce0320042d009107211a20042d0090072101200441d0036a201041de011085051a20014101460d0d201741016a2117200441b0056a201241dc011085051a2011200441b0056a2019201b10700340200428028c02211d200428028802211e200428028402211f200428028002211b20042802fc01211a20042802f801212020042802f4012101200441c8006a201641a8011085051a20042802bc03212120042802b803212202400240024002400240024020010e050001020304000b200042003702000c140b410021230240201a410174201b6b200f20056b221d470d00410021234100210102400240201d450d00410021010340201b20016a22224101762221201a4f0d0d200520016a2224410176222520034f0d0e202020216a2d00002221410f71202141f0017141047620224101711b200220256a2d00002221410f71202141047620244101711b470d01201d200141016a2201470d000c020b0b2001201d470d010b201e417f4c0d0c02400240201e0d00410121230c010b201e102f2223450d180b2023201f201e1085051a201ead220642208620068421060b2000202336020420004100360200200041086a20063702000c130b410021010240201a410174201b6b2226200f20056b2221202120264b1b2223450d000340200520016a2222410176222120034f0d0d201b20016a22244101762225201a4f0d0e200220216a2d00002221410f71202141f0017141047620224101711b202020256a2d00002221410f71202141047620244101711b470d012023200141016a2201470d000b202321010b024020012026470d00202621010c030b200042003702000c120b2004201d3602a4072004201e3602a0072004201f36029c072004201b360298072004201a3602940720042020360290072014200441c8006a41a8011085051a02400240200f2005460d002005410176220120034f0d0e20044190076a200220016a2d00002201410f71200141047620054101711b410c6c6a2201280200221f4102470d01200042003702000c130b4100210102402022450d002021417f4c0d0b0240024020210d00410121010c010b2021102f2201450d170b2001202220211085051a0b20002001360204200041003602002000410c6a2021360200200041086a20213602000c120b2001280204211e200141086a280200211d41012126410121010c010b20042802c803212620042802c403212720042802c00321012004201d360298072004201e360294072004201f360290072015200441c8006a41a8011085051a200420013602cc08200420213602c808200420223602c408410021010240201a410174201b6b221e200f20056b22232023201e4b1b221d450d000340200520016a2222410176222120034f0d0e201b20016a22244101762225201a4f0d0f200220216a2d00002221410f71202141f0017141047620224101711b202020256a2d00002221410f71202141047620244101711b470d01201d200141016a2201470d000b201d21010b02402001201e460d00200042003702000c110b024002402023201e460d00201e20056a221a410176220120034f0d1020044190076a200220016a2d00002201410f712001410476201a4101711b410c6c6a221a280200221f4102470d01200042003702000c120b4100210102402027450d002026417f4c0d0a0240024020260d00410121010c010b2026102f2201450d160b2001202720261085051a0b20002001360204200041003602002000410c6a2026360200200041086a20263602000c110b201e41016a2126201e41016a2101201a280204211e201a41086a280200211d0b200120186a2118200520266a21050240201f450d0020044190076a201e201d10ce0320042d009107211a20042d0090072101200441d0036a201041de011085051a20014101460d0f200441b0056a201241dc011085051a2011200441b0056a201e201d1070200441003a00f0010c010b0b02400240201d4120460d002014200c29030037030020044190076a41106a221a200d29030037030020044190076a41086a221b200e2903003703002004200429032837039007201d417f4c0d0802400240201d0d00410121010c010b201d102f2201450d140b2001201e201d10850521204130102f2201450d13200141043a000020012004290390073700012001201d36002c2001201d36002820012020360024200141096a201b290300370000200141116a201a290300370000200141196a20142903003700000c010b20044190076a41026a41003a0000200441003b019007201e2f0000211a200441f0016a41026a201e41026a2d00003a0000201e411f6a2d0000211b201e41176a2900002106201e2800032101201e2900072107200441b0056a41086a2220201e410f6a290000370300200441b0056a41106a22212006370300200441b0056a41186a2222201b3a00002004201a3b01f001200420073703b005201420222d00003a000020044190076a41106a202129030037030020044190076a41086a2020290300370300200420042903b005370390070b200441cc036a41026a221a200441f0016a41026a2d00003a0000200441d0036a41086a221b20044190076a41086a290300370300200441d0036a41106a222020044190076a41106a290300370300200441d0036a41186a22212014280200360200200420042f01f0013b01cc0320042004290390073703d0030240201d4120470d00201320042903d003370000201341086a201b290300370000201341106a2020290300370000201341186a20212d00003a0000200420042f01cc033b01282004200136002b2004201a2d00003a002a201c450d01201910300c010b0b20004101360200200020013602040c0d0b2001200341a099c2001042000b2001200341b099c2001042000b2001200341c099c2001033000b2021201a41e098c2001033000b2025200341e098c2001033000b102c000b2021200341e098c2001033000b2025201a41e098c2001033000b2001200341e098c2001033000b2021200341e098c2001033000b2025201a41e098c2001033000b2001200341e098c2001033000b4130102f2201450d03200141033a000020012004290328370001200141096a200441306a290300370000200141116a200441386a290300370000200141196a200441c0006a2903003700002001201a41ff01714100473a002120002001360204200041013602000b201c450d01201910300c010b2001200429039007370001200120174100473a0000200141096a201b290300370000200141116a201a290300370000200141196a200529030037000020004101360200200020013602040b200441f0086a24000f0b102a000b2802017f017e41002103024020002001200210db022204420183500d002004422088a721030b20030b950201067f024020002802202201450d0002402000412c6a280200450d00200041246a280200220241046a2103200120026a41016a21042002280200417f73418081828478712101024003400240024020010d000340200320044f0d04200241c07e6a210220032802002101200341046a220521032001418081828478712201418081828478460d000b2001418081828478732201417f6a2001712106200521030c010b2001417f6a20017121060b2001682105200621012002410020054103766b41306c6a220541746a280200450d00200541706a2802001030200621010c000b0b200028022021010b200041246a280200200141016aad42307ea76b10300b0240200041346a280200450d00200028023010300b0b8d0101017f230041106b22042400024002400240200220014180016a41201088050d004101102f2202450d02200042818080801037020420002002360200200241003a00000c010b20042001200210ca03024020042802004101470d00200041003602000c010b20002004290204370200200041086a2004410c6a2802003602000b200441106a24000f0b102a000b8b0b010a7f230041b0086b2203240020012802002104200128020422052f01ae2b210620034188046a20052001280208220741f8036c6a220141f8031085051a2001200141f8036a20062007417f736a41f8036c1086051a20052006417f6a22013b01ae2b200341106a20034188046a41f8031085051a0240200141ffff037141044b0d0002400240024020052802a82b2206450d00200441016a21080240024020052f01ac2b22090d0020062f01ae2b0d012003419c046a41013602002003420137028c04200341f4a9c20036028804200341043602940820034188a4c20036029008200320034190086a3602980420034188046a4190a4c200103a000b024020062009417f6a22094102746a41b02b6a280200220a2f01ae2b200141ffff03716a41016a410b4b0d00200341a0046a200536020020034198046a200a3602002003200436029c04200320043602940420032009360290042003200636028c04200320083602880420034180086a20034188046a4101200710fc040c040b200341a0046a200536020020034198046a200a3602002003200436029c04200320043602940420032009360290042003200636028c04200320083602880420034188046a410110fd042003200741016a360288080c020b0240200141ffff0371200941027420066a41b42b6a28020022012f01ae2b6a41016a410b4b0d00200341a0046a200136020020034198046a20053602002003200436029c04200320043602940420032009360290042003200636028c04200320083602880420034180086a20034188046a4100200710fc040c030b200341a0046a200136020020034198046a20053602002003200436029c04200320043602940420032009360290042003200636028c04200320083602880420034188046a41011089010b20032007360288080b200320053602840820032004360280080b2003280288082107200328028008210420032802840822052802a82b2201450d0020012f01ae2b220841044b0d00200441016a21060240034020012802a82b2209450d01200841ffff03712108200641016a210b024002400240024020012f01ac2b220a0d0020092f01ae2b0d012003419c046a41013602002003420137028c04200341f4a9c20036028804200341043602940820034188a4c20036029008200320034190086a3602980420034188046a4190a4c200103a000b2009200a417f6a220c4102746a41b02b6a280200210a200320013602a808200320063602a4082003200a3602a0082003200636029c082003200c3602980820032009360294082003200b3602900802402008200a2f01ae2b6a41016a410b4b0d0020034188046a41186a20034190086a41186a28020036020020034188046a41106a20034190086a41106a29030037030020034188046a41086a20034190086a41086a290300370300200320032903900837038804200341086a20034188046a108a01200328020c2101200328020821060c030b20034190086a410520086b10fd040c010b2003200a41027420096a41b42b6a280200220c3602a808200320063602a408200320013602a0082003200636029c082003200a3602980820032009360294082003200b3602900802402008200c2f01ae2b6a41016a410b4b0d0020034188046a41186a20034190086a41186a28020036020020034188046a41106a20034190086a41106a29030037030020034188046a41086a20034190086a41086a290300370300200320032903900837038804200320034188046a108a0120032802042101200328020021060c020b20034190086a410520086b1089010b410021010b2001450d0220012f01ae2b220841044d0d000c020b0b200841ffff03710d00200241013a00000b2000200341106a41f80310850522014180046a2007360200200141fc036a2005360200200120043602f803200341b0086a24000bd71103037f017e0d7f230041b0176b22022400200241f8036a200141f8031085051a02400240024002400240024002400240024002400240024002400240024020002802042201450d00200028020021030c010b41b02b102f2201450d0141002103200141003b01ae2b200141003602a82b20002001360204200041003602000b200241c0136a20032001200241f8036a10ff04024020022802c0134101460d00200241f8036a10810520022d00c8074106490d0d200241d0076a280200450d0d200241cc076a28020010300c0d0b200241f8036a41086a280200210420022903f80321052002410c6a200241f8036a410c6a41ec031085051a200241c0136a410c6a28020021030240200241c0136a41086a28020022012f01ae2b2206410a4b0d00200241f8036a2002410c6a41ec031085051a0240200341016a220720064b0d002001200741f8036c6a2001200341f8036c6a200620036b41f8036c1086051a0b2001200341f8036c6a22032004360208200320053703002003410c6a200241f8036a41ec031085051a2001200641016a3b01ae2b0c0c0b410521064100210802400240200341054f0d0041042106200321070c010b41052107024002402003417b6a0e020201000b200341796a210741012108410621060c010b41002107410121080b20022802c413210941b02b102f220a450d00200a41003b01ae2b200a41003602a82b200a20012f01ae2b220b2006417f736a22033b01ae2b2001200641f8036c6a220c280204210d200c280200210e200241f8036a200c41086a41f0031085051a2003410c4f0d01200b200641016a220c6b2003470d02200a2001200c41f8036c6a200341f8036c108505210c200120063b01ae2b200241c0136a200241f8036a41f0031085051a200c200120081b22032f01ae2b2106200241f8036a2002410c6a41ec031085051a0240200741016a220820064b0d002003200841f8036c6a2003200741f8036c6a200620076b41f8036c1086051a0b2003200741f8036c6a22072004360208200720053703002007410c6a200241f8036a41ec031085051a2003200641016a3b01ae2b200241d00f6a200241c0136a41f0031085051a200241e00b6a200241d00f6a41f0031085051a02400240024020012802a82b22030d00410021090c010b41002107200c210f200d2110200e211103402003210820092007470d0620012f01ac2b210420082f01ae2b2207410b490d024100210c41042101024020044105490d0020042101024002402004417b6a0e020201000b200441796a21044101210c410621010c010b410021044101210c410521010b41e02b102f220a450d03200a41003b01ae2b200a41003602a82b200a20082f01ae2b220b2001417f736a22033b01ae2b2008200141f8036c6a2206280204210d2006280200210e200241f8036a200641086a41f0031085051a2003410c4f0d07200b200141016a22126b2003470d08200a200641f8036a200341f8036c1085052106200820013b01ae2b200241c0136a200241f8036a41f0031085051a20062f01ae2b220341016a210b2003410c4f0d09200720016b2201200b470d0a200941016a2109200641b02b6a200820124102746a41b02b6a20014102741085051a4100210102400340200620014102746a41b02b6a280200220720013b01ac2b200720063602a82b200120034f0d01200120012003496a220120034d0d000b0b200241d00f6a200241c0136a41f0031085051a20062008200c1b22072f01ae2b2101200241f8036a200241e00b6a41f0031085051a0240200441016a220320014b0d002007200341f8036c6a2007200441f8036c6a200120046b41f8036c1086051a0b200141016a210c2007200441f8036c6a220b2010360204200b2011360200200b41086a200241f8036a41f0031085051a200741b02b6a210b0240200441026a2211200141026a22104f0d00200b20114102746a200b20034102746a200120046b4102741086051a0b200b20034102746a200f3602002007200c3b01ae2b0240200320104f0d00200720044102746a41b42b6a2101034020012802002203200441016a22043b01ac2b200320073602a82b200141046a2101200c2004470d000b0b200241e00b6a200241d00f6a41f0031085051a20082101200921072006210f200d2110200e211120082802a82b22030d000b0b200241f0076a200241e00b6a41f0031085051a20002802042203450d092000280200210641e02b102f2201450d01200120033602b02b200141003b01ae2b200141003602a82b200341003b01ac2b200320013602a82b200020013602042000200641016a36020020062009470d0a20012f01ae2b2203410b4f0d0b2001200341016a22063b01ae2b2001200341f8036c6a2203200d3602042003200e360200200341086a200241f0076a41f0031085051a200141b02b6a20064102746a200a360200200a20063b01ac2b200a20013602a82b2000200028020841016a3602080c0d0b200241f8036a200241e00b6a41f0031085051a200441016a21010240200720044d22060d002008200141f8036c6a2008200441f8036c6a200720046b41f8036c1086051a0b200741016a210c2008200441f8036c6a2203201036020420032011360200200341086a200241f8036a41f0031085051a200841b02b6a2103200741026a210a024020060d00200441027420036a41086a200320014102746a200720046b4102741086051a0b2008200c3b01ae2b200320014102746a200f3602002001200a4f0d0b200741016a210720082001417f6a22014102746a41b42b6a2103034020032802002206200141016a22013b01ac2b200620083602a82b200341046a210320072001470d000c0c0b0b102a000b2003410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b41b0a3c200413541e8a3c200102d000b2003410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b200b410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b2000200028020841016a3602080b200241b0176a24000bae0601047f410021020240024002400240024020002d0000220320012d0000470d0041012102024002400240024002400240024002400240024002402003417f6a0e09010203040506070b000b0b20034109470d0a200041046a2802002203200141046a280200470d0b2003417f6a0e020708090b4101210220034101470d09200041046a280200200141046a280200460f0b20034102470d08200041246a2802002203200141246a280200470d0c41012102024020034101470d00200041306a2802002203200141306a280200470d0d200041286a280200200141286a28020020031088050d0d0b200041016a200141016a41201088050d0c0c080b20034103470d07200041046a2802002203200141046a280200470d0a41012102024020034101470d00200041106a2802002203200141106a280200470d0b200041086a280200200141086a28020020031088050d0b0b200041186a290300200141186a290300520d0a0c070b20034104470d06200041186a2802002203200141186a280200470d0841012102024020034101470d00200041246a2802002203200141246a280200470d092000411c6a2802002001411c6a28020020031088050d090b200041016a200141016a41141088050d080c060b20034105470d0520002d000120012d0001460f0b20034106470d04200041086a290300200141086a29030085200041106a290300200141106a2903008584500f0b20034107470d03410021022000410c6a28020022032001410c6a280200470d03200041046a280200200141046a2802002003108805450f0b200041106a2802002203200141106a280200470d03200041086a280200200141086a2802002003108805450d010c030b200041086a280200200141086a280200470d020b200041146a2802002203200141146a280200470d012001411c6a2802002104200141186a28020021012000411c6a2802002105200041186a280200210002400240024002402003417f6a0e0400010203040b20002001470d040c030b20002001470d0320052004470d030c020b20002001470d0220052004470d020c010b20002001470d0120052004470d010b20020f0b41000f0b41000f0b41000f0b41000b1000200020012802042003200410c6010baf0201047f23004180016b220324000240200120002802042200413c6a4120108805450d00200341c0006a41186a2204200141186a290000370300200341c0006a41106a2205200141106a290000370300200341c0006a41086a2206200141086a2900003703002003200129000037034020032000200341c0006a10ca01024020032903004201520d00200341c0006a41286a200341306a290300370300200341c0006a41206a200341286a2903003703002004200341206a2903003703002005200341186a2903003703002006200341106a290300370300200320032903083703402003417f36027c20034200370274200341002802dc9442360270200341c0006a200341f0006a10cb010c010b200341106a280200417c6a22012001280200417f6a3602000b20034180016a24000b7e01017f230041306b2204240020002802042100200441186a200141186a290000370300200441106a200141106a290000370300200441086a200141086a29000037030020042001290000370300200441206a41086a200341086a2802003602002004200329020037032020002004200441206a10c801200441306a24000b1300200041d0dfc100360204200020013602000b1300200041d0dfc100360204200020013602000ba10402057f027e230041106b220224002002420037030802400240200128020022032802042204450d00200328020022052d0000210620032004417f6a360204200241013602082003200541016a360200200220063a000c200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020024102360208200220063a000d200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a36020020024103360208200220063a000e200128020022032802042204450d00200328020022052d0000210620032004417f6a3602042003200541016a360200200220063a000f20024104360208024020022903082207a741044f0d0041fef8c100411b419cf9c100102d000b2002200110ac02024002400240024020022802000d0020012802002204280204220520022802042203490d002003417f4c0d010240024020030d00410121060c010b2003102f2206450d032006410020031087051a2001280200220428020421050b024020052003490d002006200428020020031085052105200428020422012003490d0420002003ad22084220862008843702082000200536020420002007422088a73602002004200120036b3602042004200428020020036a3602000c060b200610300b200041003602040c040b102c000b102a000b2003200141f0f5c100104a000b200041003602040b200241106a24000bdb0d03037f017e1d7f23004180016b2202240020022001109b01024002402002280200450d00200041003602000c010b02400240200228020422032001280204413c6e2204200420034b1bad423c7e2205422088a70d002005a72204417f4c0d0002400240024020040d00410421060c010b2004102f2206450d010b2004413c6e2107024020030d00410021030c030b200241c8006a4104722108200241c8006a41196a2109200241da006a210a200241d3006a210b4100210c0340024002402001280204220d41044f0d004102210e0c010b20012802002204280000210f2001200d417c6a220e3602042001200441046a3602000240200e41044f0d004102210e0c010b200428000421102001200d41786a220e3602042001200441086a3602000240200e41044f0d004102210e0c010b200428000821112001200d41746a220e36020420012004410c6a3602000240200e41044f0d004102210e0c010b200428000c21122001200d41706a220e3602042001200441106a3602000240200e41044f0d004102210e0c010b200428001021132001200d416c6a220e3602042001200441146a3602000240200e41044f0d004102210e0c010b200428001421142001200d41686a22153602042001200441186a220e36020002402015450d00200e2d000021152001200d41676a22163602042001200e41016a3602004100210e0240024020150e020100020b4100210e20024100360248200d41666a210d03402016200e460d022004200e6a221541196a2d000021172001200d36020420012015411a6a3602002008200e6a20173a00002002200e41016a2215360248200d417f6a210d2015210e20154120470d000b200241c4006a41026a200b41026a2d00003a0000200241c0006a41026a200a41026a2d00003a0000200220082f01003b01702002200b2f00003b01442002200a2f00003b01402002200841026a2d00003a00722002280268211820022802642119200228005d211a2002280156211b200228004f211c2002413c6a41026a200941026a2d00003a0000200220092f00003b013c4101210e0b200241c8006a41026a20022d00723a0000200241386a41026a200241c4006a41026a2d00003a0000200241346a41026a200241c0006a41026a2d00003a0000200241306a41026a2002413c6a41026a2d00003a0000200220022f01703b0148200220022f01443b0138200220022f01403b0134200220022f013c3b01302014211d2013211e2012211f2011212020102121200f21220c010b4102210e0b2002412c6a41026a2204200241c8006a41026a2d00003a0000200241286a41026a220d200241386a41026a2d00003a0000200241246a41026a220f200241346a41026a2d00003a0000200241206a41026a2210200241306a41026a2d00003a00002002411c6a41026a2215200241f0006a41026a2d00003a0000200220022f01483b012c200220022f01383b0128200220022f01343b0124200220022f01303b0120200220022f00703b011c0240200e4102460d00200241186a41026a221120042d00003a0000200241146a41026a2217200d2d00003a0000200241106a41026a220d200f2d00003a00002002410c6a41026a220f20102d00003a0000200241086a41026a221020152d00003a0000200220022f012c3b0118200220022f01283b0114200220022f01243b0110200220022f01203b010c200220022f011c3b01080240200c2007470d00200c4101742204200c41016a2215200420154b1b22044104200441044b1bad423c7e2205422088a74541027421042005a7211502400240200c0d00200241003602480c010b20024104360250200220063602482002200c413c6c36024c0b200241f0006a20152004200241c8006a106920022802782104024020022802704101470d0020040d040c050b200228027421062004413c6e21070b2006200c413c6c6a220441186a200e3a00002004411b6a20112d00003a0000200441196a20022f01183b00002004202136020420042022360200200441146a201d360200200441106a201e3602002004410c6a201f360200200441086a20203602002004411c6a201c360000200441226a20172d00003a0000200441206a20022f01143b0000200441236a201b360000200441296a200d2d00003a0000200441276a20022f01103b00002004412a6a201a360000200441306a200f2d00003a00002004412e6a20022f010c3b0000200441356a2018360000200441316a20193600002004413b6a20102d00003a0000200441396a20022f01083b0000200c41016a2204210c20042003460d040c010b0b200041003602002007450d032007413c6c450d03200610300c030b102a000b102c000b2000200736020420002006360200200041086a20033602000b20024180016a24000bdd0a02077f027e230041b00f6b2202240002400240024020012802004101460d002002410c3602000c010b02400240024002402001411c6a2802002203450d0020012003417f6a36021c200141086a2802002203450d01200128020421042001410c6a280200220520032f01a629490d0203400240024020032802a02922060d00410021060c010b200441016a210720032f01a42921050b024041d82941a82920041b450d00200310300b024020060d00410221040c050b2007210420062103200520062f01a6294f0d000b20062103200721040c020b2002410c3602f803200141046a220310e60320014100360200200320022902f007370200200341086a200241f0076a41086a290200370200200341106a200241f0076a41106a290200370200200341186a200241f0076a41186a2802003602002002410c3602000c030b41b2abc200412b41d4a8c200102d000b200541016a21062003200541d0036c6a2107200320054104746a220541f8276a2108200541f0276a210502402004450d00200320064102746a41a8296a280200210302402004417f6a2206450d00034020032802a82921032006417f6a22060d000b0b410021060b200829030021092005290300210a200728020021042002200741046a41cc031085051a0b200241f0076a200241cc031085051a2001200636020c2001200336020820014100360204200241e40b6a200241f0076a41cc031085051a024002402004450d0020024190046a200937030020024188046a200a3703004108210320024184046a200241f0076a41086a280200360200200220022902f0073702fc030c010b20024180046a200241e80b6a41c8031085051a200241d0076a2009370300200241c8076a200a370300410a21030b200220033602f8032002200241f8036a41f8031085052203280200410c460d002000200341f8031085051a0c010b024020012802204101460d002000410c3602000c010b0240024002402001413c6a2802002203450d0020012003417f6a36023c0240200141286a2802002206450d00200141246a280200210402402001412c6a280200220520062f01ae2b4f0d0020062103200421070c030b03400240024020062802a82b22030d00410021030c010b200441016a210720062f01ac2b21050b024041e02b41b02b20041b450d00200610300b024020030d00410221050c050b2003210620072104200520032f01ae2b490d030c000b0b41b2abc200412b41d4a8c200102d000b2000410c3602000c020b200541016a21062003200541f8036c6a210402402007450d00200320064102746a41b02b6a280200210302402007417f6a2206450d00034020032802b02b21032006417f6a22060d000b0b410021060b20042802002105200241f8036a200441046a41f4031085051a0b200241f0076a200241f8036a41f4031085051a2001200636022c2001200336022820014100360224200241f8036a200241f0076a41f4031085051a200241e40b6a200241f0076a41cc031085051a024002402005450d00200020022902f007370204200041106a20022902c4073702002000410c6a200241f8076a280200360200200041186a200241cc076a290200370200200041206a200241d4076a290200370200200041286a200241dc076a290200370200200041306a200241e4076a290200370200410921030c010b200041086a200241e80b6a41c8031085051a200041f0036a200241e4076a290200370200200041e8036a200241dc076a290200370200200041e0036a200241d4076a290200370200200041d8036a200241cc076a290200370200200041d0036a20022902c407370200410b21030b200020033602002002280200410c460d002002109a010b200241b00f6a24000bfb1102167f017e23004180016b22022400200241d0006a4104722103200128020421044100210502400240034020042206450d01200128020022072d0000210820012006417f6a22043602042001200741016a360200200320056a20083a00002002200541016a22073602502007210520074120470d000b200241c8006a41026a2205200241dd006a2d00003a00002002200241e9006a22072800003602782002200241ec006a28000036007b200220022f01543b014c200220022d00563a004e2002200241db006a2f00003b0148200241de006a2801002109200241e5006a280000210a200241f0006a280200210b2002280057210c200228007b210d200241f8006a41026a2204200241e4006a2d00003a00002002200241e2006a2f01003b0178200241c4006a41026a2208200241eb006a2d00003a0000200220072f00003b0144200241d0006a41026a20022d004e3a0000200220022f014c3b0150200241c0006a41026a20052d00003a0000200220022f01483b01402002413c6a41026a20042d00003a0000200220022f01783b013c200241386a41026a20082d00003a0000200220022f01443b01380c010b0b200241146a41026a200241d0006a41026a2d00003a0000200241106a41026a200241c0006a41026a2d00003a00002002410c6a41026a2002413c6a41026a2d00003a0000200241086a41026a200241386a41026a2d00003a0000200220022f01503b0114200220022f01403b0110200220022f013c3b010c200220022f01383b0108024002400240024002402006450d0020022001109b0120022802000d012002280204210e200128020421074104210502400240034020072204450d01200241d0006a20056a200128020022062d00003a000020012004417f6a22073602042001200641016a36020020022005417d6a360250200541016a22054124470d000b200241c8006a41026a2205200241dd006a2d00003a00002002200241e9006a22062800003602782002200241ec006a28000036007b200220022f01543b014c200220022d00563a004e2002200241db006a2f00003b0148200241de006a280100210f200241e5006a2800002110200241f0006a280200211120022800572112200228007b2113200241f8006a41026a2208200241e4006a2d00003a00002002200241e2006a2f01003b0178200241c4006a41026a2203200241eb006a2d00003a0000200220062f00003b0144200241d0006a41026a20022d004e3a0000200220022f014c3b0150200241c0006a41026a20052d00003a0000200220022f01483b01402002413c6a41026a20082d00003a0000200220022f01783b013c200241386a41026a20032d00003a0000200220022f01443b01380c010b410021070b200241246a41026a200241d0006a41026a2d00003a0000200241206a41026a200241c0006a41026a2d00003a00002002411c6a41026a2002413c6a41026a2d00003a0000200241186a41026a200241386a41026a2d00003a0000200220022f01503b0124200220022f01403b0120200220022f013c3b011c200220022f01383b01182004450d02200241d0006a41047221034100210502400240034020072206450d01200128020022042d0000210820012006417f6a22073602042001200441016a360200200320056a20083a00002002200541016a22043602502004210520044120470d000b200241c8006a41026a2214200241dd006a2d00003a00002002200241e9006a22152800003602782002200241ec006a28000036007b200220022f01543b014c200220022d00563a004e2002200241db006a2f00003b0148200241de006a2801002105200241e5006a2800002107200241f0006a280200210420022800572108200228007b2103200241f8006a41026a2216200241e4006a2d00003a00002002200241e2006a2f01003b0178200241c4006a41026a2217200241eb006a2d00003a0000200220152f00003b0144200241d0006a41026a20022d004e3a0000200220022f014c3b0150200241c0006a41026a20142d00003a0000200220022f01483b01402002413c6a41026a20162d00003a0000200220022f01783b013c200241386a41026a20172d00003a0000200220022f01443b01380c010b0b200241346a41026a200241d0006a41026a2d00003a0000200241306a41026a200241c0006a41026a2d00003a00002002412c6a41026a2002413c6a41026a2d00003a0000200241286a41026a200241386a41026a2d00003a0000200220022f01503b0134200220022f01403b0130200220022f013c3b012c200220022f01383b01282006450d03200241d0006a2001108302024020022802502201450d0020022902542118200020022f01103b00172000200936001a200020022f010c3b001e2000200a360021200020022f01083b0025200041106a20022f01143b0000200041136a200c360000200041126a200241146a41026a2d00003a0000200041196a200241106a41026a2d00003a0000200041206a2002410c6a41026a2d00003a0000200041276a200241086a41026a2d00003a00002000412c6a200b360000200041286a200d360000200041336a20123600002000200f36003a20002010360041200041306a20022f01243b0000200041326a200241246a41026a2d00003a0000200041396a200241206a41026a2d00003a0000200020022f01203b0037200041c0006a2002411c6a41026a2d00003a0000200020022f011c3b003e200020022f01183b0045200041c7006a200241186a41026a2d00003a0000200041cc006a2011360000200041c8006a2013360000200041d2006a200241346a41026a2d00003a0000200041d0006a20022f01343b0000200041d3006a2008360000200041d9006a200241306a41026a2d00003a0000200020022f01303b00572000200536005a200041e0006a2002412c6a41026a2d00003a0000200020022f012c3b005e20002007360061200041e7006a200241286a41026a2d00003a0000200020022f01283b0065200041ec006a2004360000200041e8006a200336000020002018370208200020013602042000200e3602000c050b200041003602040c040b200041003602040c030b200041003602040c020b200041003602040c010b200041003602040b20024180016a24000b8c0201037f230041d0006b220124002001412036020420012000360200200141086a2000412041002802d4ad4211040002400240200128020822020d00410221000c010b200128020c210302400240200141106a280200450d0041002100024020022d00000e020200010b410121000c010b2001420037021c200141002802dc94423602182001410936022c200120013602282001200141186a360234200141cc006a41013602002001420137023c200141a0e6c1003602382001200141286a360248200141346a41d0adc000200141386a10321a2001280218200128022010ad010240200128021c450d00200128021810300b410221000b2003450d00200210300b200141d0006a240020000b040010050b070010024101460b0e002001ad4220862000ad8410150b8f0201027f20014180feff07714108762102024002402001410171450d00411f2103419580c200210102400240200241ff01710e03000103000b41c100210341d4ffc10021010c020b41c10021034193ffc10021010c010b411f210341f4fec1002101024002400240024002400240024002400240200241ff01710e0a00060102030405090708000b4120210341d4fec10021010c080b4127210341f4fdc10021010c070b4117210341ddfdc10021010c060b41befdc10021010c050b412621034198fdc10021010c040b412a210341eefcc10021010c030b41392103419bfec10021010c020b413b210341b3fcc10021010c010b41d200210341e1fbc10021010b20002003360204200020013602000b6901017f230041206b220324002003200136020420032000360200200341086a41106a200241106a290200370300200341086a41086a200241086a29020037030020032002290200370308200341dce9c100200341046a41dce9c100200341086a41d0e7c100104b000b1c0020012802184199f7c100410f2001411c6a28020028020c1100000bb00301097f230041306b22032400024002400240024020022d000422044102470d00200041023a00000c010b20012802042105024002402001280200220628020422014125490d00200641106a28020021012006410c6a28020021070c010b200641096a21070b200228020021082006280200220941017621062005280200280200210a024002402009410171450d00200120064d0d04200341013a0008200341106a2001200641016a220b6b36020020032007200b6a36020c2003200720066a2d0000410f713a00090c010b20012006490d02200341106a200120066b360200200341003b01082003200720066a36020c0b200a200341086a10b501200a200810b60120052802042802002106200341116a200241056a220241086a290000370000200341196a200241106a290000370000200341216a200241186a290000370000200341286a2002411f6a280000360000200320043a00082003200229000037000920002006200341086a200528020028020010b7012005280200280200200141017420096b41016a10b8010b200341306a24000f0b2006200141e097c200104a000b2006200141f097c2001033000b850404047f017e027f017e230041d0026b22032400200041d0006a2802002104200028024c2105200341d0016a41086a2206200241086a280200360200200320022902003703d001200341d8006a20052001200341d0016a200428020c1103000240024002400240200328025822020d004130102f2200450d03200041013a000020002001290000370001200041096a200141086a290000370000200041116a200141106a290000370000200041196a200141186a2900003700000c010b200329025c2107200341b0016a41186a200141186a2205290000370300200341b0016a41106a200141106a2208290000370300200341b0016a41086a200141086a290000370300200320012900003703b001200341d0016a200341b0016a20022007422088a7200041306a220910ad0420032802d401210020032802d0012104200341d8006a200641d4001085051a024020044101460d00200341046a200341d8006a41d4001085051a200341f8016a200341046a41d4001085051a200341e9016a2005290000370000200341e1016a2008290000370000200341d9016a200141086a290000370000200320003602f401200341013a00d001200320012900003700d1012009200341d0016a10b30121004200210a2007a7450d02200210300c020b2007a7450d00200210300b4201210a0b200341d0026a24002000ad422086200a840f0b102a000ba25302127f047e23004180056b22062400200641086a200341086a280200360200200620032902003703000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802000e050104000203010b20064198016a2002412c6a29020037030020064190016a200241246a29020037030020064188016a2002411c6a29020037030020064180016a2207200241146a290200370300200641f0006a41086a2002410c6a29020037030020062002290204370370200241346a2108200241386a2109024002402006280274220a4125490d002007280200210a200641f0006a410c6a280200210b0c010b200641f9006a210b0b2002413c6a210c200241356a210d20082d0000210e2009280200210f2006200628027022103602a8012006200b3602a00120062802042111200628020821122006200a3602a4010240200a410174221320106b2214201141017420126b2202200220144b1b2215450d00410021022006280200211602400340201220026a2209410176220820114f0d10201020026a22174101762207200a4f0d11201620086a2d00002208410f71200841f0017141047620094101711b200b20076a2d00002208410f71200841047620174101711b470d012015200241016a2202470d000b201521020b20020d060b20132010470d0441ccf0c100412a41f8f0c100102d000b4101210920062802042203200628020822084101762202490d0e20064180046a410472200628020020026a200320026b10ab04200641286a41086a20064180046a41186a290300370300200641286a41106a200641a0046a290300370300200641286a41186a200641a8046a290300370300200620064180046a41106a290300370328200841017121022006418c046a280200210320064180046a41086a2802002107200429020421182004280200210c2006280284042117410021080c2a0b200241106a28020021102002410c6a280200210b200241086a280200210a2002280204210202402006280204220941017420062802082208470d0020042802082103410021080240200a450d0020102003470d00200a20042802002010108805452108201021030b2004280204210720042802002117024020052802002209450d00200541046a280200450d00200910300b2005200b3602042005200a360200200541086a2010360200410321090c2a0b2008410176220720094f0d0e200628020020076a2d000021092003200328020841016a36020820022009410f71200941047620084101711b220741246c6a22092d00002108200941023a00000240024020084102470d0020032802042217200328020822054101762208490d112006418c046a200328020020086a201720086b10ab04200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a200541017136020041002108200641003a0080042002200741246c6a41046a200141306a20064180046a10b301360200200941003a00000c010b20064180046a41096a200941096a29000037000020064180046a41116a200941116a29000037000020064180046a41196a200941196a29000037000020064180046a41206a200941206a280000360000200620083a0080042006200929000137008104200641a8036a41086a200441086a280200360200200620042902003703a803200641d0026a200120064180046a2003200641a8036a200510800320062802d402210320062802d0024101460d0b200641d0026a41086a2d0000211741002108200941003a00002002200741246c6a41046a2003360200201741ff0171450d090b4103210920102103200b2107200a21170c290b200641a0026a2002412c6a29020037030020064198026a200241246a29020037030020064190026a2002411c6a29020037030020064188026a2217200241146a290200370300200641f8016a41086a2002410c6a290200370300200620022902043703f801200241346a2108200241386a21092002413c6a2107200241c0006a21020240024020062802fc01220a4125490d002017280200210a200641f8016a410c6a280200210b0c010b20064181026a210b0b2008280200210c2009280200210e200728020021132002280200210f200620062802f80122103602d0012006200b3602c80120062802042111200628020821122006200a3602cc01410021020240200a41017420106b2214201141017420126b220d200d20144b1b2215450d00200628020021160340201220026a2209410176220820114f0d11201020026a22174101762207200a4f0d12201620086a2d00002208410f71200841f0017141047620094101711b200b20076a2d00002208410f71200841047620174101711b470d012015200241016a2202470d000b201521020b0240024002400240024002400240024020022014470d002014200d460d010b200220144f0d01200a2010200241016a22076a22084101762203490d19200641d0026a410472200b20036a200a20036b10ab04200620084101713602d002201020026a22084101762203200a4f0d1a200b20036a2d0000210341c004102f2209450d1b200941023a009c04200941023a00f803200941023a00d403200941023a00b003200941023a008c03200941023a00e802200941023a00c402200941023a00a002200941023a00fc01200941023a00d801200941023a00b401200941023a009001200941023a006c200941023a0048200941023a0024200941023a000020064180046a41306a200641d0026a41286a29030037030020064180046a41286a2217200641d0026a41206a29030037030020064180046a41206a220a200641d0026a41186a29030037030020064180046a41186a2210200641d0026a41106a29030037030020064180046a41106a2205200641d0026a41086a29030037030020064180046a41086a220b20062903d002370300200641c4046a200f360200200641c0046a2013360200200641bc046a200e360200200641b8046a200c360200200641003a008004200641043602840420092003410f71200341f0017141047620084101711b41246c6a2203200141306a221120064180046a10b301360204200341003a000020062802042203410174200628020822086b2002470d0220064180046a200641c8016a200210ae04200641286a41086a2010290300370300200641286a41106a200a290300370300200641286a41186a2017290300370300200620052903003703282006418c046a2802002103200b28020021072004280208210a20042902002118200628028404211720062802800421020c030b410021080240200e450d00200f2004280208470d00200e2004280200200f1088054521080b200a20104101762202490d1720064180046a410472200b20026a200a20026b10ab04200641a8036a41086a220920064180046a41186a290300370300200641a8036a41106a220b200641a0046a290300370300200641a8036a41186a2211200641a8046a290300370300200620064180046a41106a2903003703a803201041017121022006418c046a280200210320064180046a41086a28020021072004280208210a200429020021182006280284042117024020052802002204450d00200541046a280200450d00200410300b200520133602042005200e360200200541086a200f360200200641286a41086a2009290300370300200641286a41106a200b290300370300200641286a41186a2011290300370300200620062903a8033703280c050b201220026a2209410176220820114f0d1a200628020020086a2d000021082003200220032802086a41016a360208200c2008410f71200841047620094101711b220941246c6a22022d00002108200241023a000020084102470d0220032802042207200328020822174101762208490d1d2006418c046a200328020020086a200720086b10ab04200641b8046a2004290200370300200641c0046a200441086a280200360200200641013602840420064180046a41086a2017410171360200200641003a008004200c200941246c6a41046a200141306a20064180046a10b301360200200241003a00000c030b200820026a220a410176221720034f0d1a2003200820076a22104101762208490d1b2006280200220520176a2d00002107200641a8036a41046a200520086a200320086b10ab04200620104101713602a803200641b0046a200641a8036a41286a29020037030020064180046a41286a2203200641a8036a41206a29020037030020064180046a41206a2208200641a8036a41186a29020037030020064180046a41186a2217200641a8036a41106a29020037030020064180046a41106a2210200641a8036a41086a29020037030020064180046a41086a220520062902a803370300200641b8046a2004290200370300200641c0046a200441086a2802003602002006410136028404200641003a00800420092007410f71200741f00171410476200a4101711b41246c6a2207201120064180046a10b301360204200741003a000020064180046a200641c8016a200210ae04200641286a41086a2017290300370300200641286a41106a2008290300370300200641286a41186a2003290300370300200620102903003703282006418c046a28020021032005280200210720062802840421172006280280042102420021180b410021082009210c0c020b20064180046a41096a200241096a29000037000020064180046a41116a200241116a29000037000020064180046a41196a200241196a29000037000020064180046a41206a200241206a280000360000200620083a0080042006200229000137008104200641a8036a41086a200441086a280200360200200620042902003703a803200641d0026a200120064180046a2003200641a8036a200510800320062802d402210320062802d0024101460d0a200641d0026a41086a2d00002108200241003a0000200c200941246c6a41046a2003360200200841ff0171450d080b200a20104101762202490d1a20064180046a410472200b20026a200a20026b10ab04200641286a41086a20064180046a41186a290300370300200641286a41106a200641a0046a290300370300200641286a41186a200641a8046a290300370300200620064180046a41106a290300370328201041017121022013ad422086200ead8421182006418c046a280200210320064180046a41086a2802002107200628028404211741002108200f210a0b024020062802fc014125490d0020064184026a28020010300b410421090c290b200641a0026a2002412c6a29020037030020064198026a200241246a29020037030020064190026a2002411c6a29020037030020064188026a2207200241146a290200370300200641f8016a41086a2002410c6a290200370300200620022902043703f8012002413c6a2108200241386a2109200241346a21020240024020062802fc01220d4125490d002007280200210a200641f8016a410c6a280200210b0c010b20064181026a210b200d210a0b2008280200210e200928020021132002280200210f410021020240200a41017420062802f80122106b220c20062802042211410174200628020822126b22142014200c4b1b2215450d00200628020021160340201220026a2209410176220820114f0d1b201020026a22174101762207200a4f0d1c201620086a2d00002208410f71200841f0017141047620094101711b200b20076a2d00002208410f71200841047620174101711b470d012015200241016a2202470d000b201521020b02400240024002402002200c470d00200c2014460d010b2002200c4f0d0141c004102f2209450d16200941023a009c04200941023a00f803200941023a00d403200941023a00b003200941023a008c03200941023a00e802200941023a00c402200941023a00a002200941023a00fc01200941023a00d801200941023a00b401200941023a009001200941023a006c200941023a0048200941023a0024200941023a0000201020026a22074101762217200a4f0d1e200a200741016a22104101762208490d1f200b20176a2d00002117200641a8036a41046a200b20086a200a20086b10ab04200620104101713602a80320064180046a41306a200641a8036a41286a29020037030020064180046a41286a220b200641a8036a41206a29020037030020064180046a41206a2211200641a8036a41186a29020037030020064180046a41186a220a200641a8036a41106a221229020037030020064180046a41106a2210200641a8036a41086a221529020037030020064180046a41086a221620062902a803370300200641c0046a2214200e360200200641bc046a220c201336020020064180046a41386a200f360200200641013602840441002108200641003a00800420092017410f71201741f0017141047620074101711b41246c6a2207200141306a20064180046a10b301360204200741003a000020064180046a2006200210ae04200641c8006a41086a22022006418c046a2207280200360200200641f0006a41086a2217200a290300370300200641f0006a41106a220d2011290300370300200641f0006a41186a2211200b29030037030020062006290284043703482006201029030037037020062006280280043602ac03200641043602a8032015200629034837030020122002280200360200200641a8036a41386a4100360200200641a8036a41346a2009360200200641a8036a41146a2006290370370200200641a8036a411c6a2017290300370200200641a8036a41246a200d290300370200200641a8036a412c6a2011290300370200200641a0016a41086a200441086a280200360200200620042902003703a00120064180046a2001200641a8036a2003200641a0016a200510aa04200641d0026a41086a220520064180046a41246a290200370300200641d0026a41106a220b20064180046a412c6a290200370300200641d0026a41186a221120064180046a41346a290200370300200620064180046a411c6a2902003703d00220162802002109200728020021022010280200211720064180046a41146a2802002107200a2802002103200c280200210c20142903002118200641c8046a280200210a20062802840421102006280280042104200641b0016a41106a2212200641dc046a280200360200200641b0016a41086a2215200641d4046a2902003703002006200641cc046a2902003703b00120044101460d07200641c8016a41186a20112903002219370300200641c8016a41106a200b290300221a370300200641c8016a41086a2005290300221b370300200641d8006a41086a22042015290300370300200641d8006a41106a22102012280200360200200641286a41086a201b370300200641286a41106a201a370300200641286a41186a2019370300200620062903d00222193703c801200620062903b00137035820062019370328200641106a41106a2010280200360200200641106a41086a2004290300370300200620062903583703100c020b410021020240200e2004280208470d00200f2004280200200e1088054521020b024020052802002203450d00200541046a280200450d00200310300b200520133602042005200f360200200541086a200e360200024020020d00200620103602800420064180046a410472210302400240200d4125490d0020064188026a280200210d20064184026a28020021020c010b20064181026a21020b4100210820064180046a41086a220941003a00002006410036028404200320022002200d6a10bc02200641286a41086a20064180046a41186a290300370300200641286a41106a200641a0046a290300370300200641286a41186a200641a8046a290300370300200620064180046a41106a2903003703282006418c046a280200210320092802002107200429020421182004280200210c20062802840421172006280280042102410121090c020b200620103602800420064180046a410472210302400240200d4125490d0020064188026a280200210d20064184026a28020021020c010b20064181026a21020b20064180046a41086a220841003a00002006410036028404200320022002200d6a10bc02200641286a41086a20064180046a41186a290300370300200641286a41106a200641a0046a290300370300200641286a41186a200641a8046a290300370300200620064180046a41106a2903003703282006418c046a280200210320082802002107200429020421182004280200210c2006280284042117200628028004210241012109410121080c010b200a20104101762202490d1e20064180046a410472200b20026a200a20026b10ab04200620104101713602800441c004102f2202450d14200241023a009c04200241023a00f803200241023a00d403200241023a00b003200241023a008c03200241023a00e802200241023a00c402200241023a00a002200241023a00fc01200241023a00d801200241023a00b401200241023a009001200241023a006c200241023a0048200241023a0024200241023a0000200641d0026a41086a220820064180046a41086a2209290300370300200641d0026a41106a220720064180046a41106a2217290300370300200641d0026a41186a220a20064180046a41186a2210290300370300200641d0026a41206a220b20064180046a41206a290300370300200641d0026a41286a221120064180046a41286a29030037030020062006290380043703d002200641a8036a410c6a2008290300370200200641a8036a41146a2007290300370200200641a8036a411c6a200a290300370200200641a8036a41246a200b290300370200200641a8036a412c6a2011290300370200200641a8036a41c0006a200e360200200641a8036a413c6a2013360200200641e0036a200f360200200641a8036a41346a2002360200200641043602a803200620062903d0023702ac03200641a0016a41086a200441086a280200360200200620042902003703a00120064180046a2001200641a8036a2003200641a0016a200510aa04200641c8016a41086a220420064180046a41246a290200370300200641c8016a41106a220520064180046a412c6a290200370300200641c8016a41186a220b20064180046a41346a290200370300200620064180046a411c6a2902003703c8012009280200210920064180046a410c6a28020021022017280200211720064180046a41146a28020021072010280200210320064180046a413c6a280200210c20064180046a41c0006a2903002118200641c8046a280200210a20062802840421102006280280042108200641b0016a41106a2211200641dc046a280200360200200641b0016a41086a2212200641d4046a2902003703002006200641cc046a2902003703b00120084101460d1f200641f0006a41186a200b2903002219370300200641f0006a41106a2005290300221a370300200641f0006a41086a2004290300221b370300200641d8006a41086a22082012290300370300200641d8006a41106a22042011280200360200200641286a41086a201b370300200641286a41106a201a370300200641286a41186a2019370300200620062903c8012219370370200620062903b00137035820062019370328200641106a41106a2004280200360200200641106a41086a200829030037030020062006290358370310410021080b20062802fc014125490d2820064184026a28020010300c280b20104101762202200a4f0d1e200b20026a2d0000210841c004102f2202450d12200241023a009c04200241023a00f803200241023a00d403200241023a00b003200241023a008c03200241023a00e802200241023a00c402200241023a00a002200241023a00fc01200241023a00d801200241023a00b401200241023a009001200241023a006c200241023a0048200241023a0024200241023a00000240024020144101470d00200641a8036a41026a200d41026a2d00003a000020064180046a41086a200c41086a29020037030020064180046a41106a200c41106a29020037030020064180046a41186a200c41186a2802003602002006200d2f00003b01a8032006200c290200370380040c010b200a201041016a22074101762209490d20200641ac036a200b20096a200a20096b10ab04200620074101713602a80320064180046a41306a200641a8036a41286a29020037030020064180046a41286a200641a8036a41206a29020037030020064180046a41206a200641a8036a41186a29020037030020064180046a41186a200641a8036a41106a29020037030020064180046a41106a200641a8036a41086a29020037030020064180046a41086a20062902a803370300200641b9046a200d2f00003b0000200641bb046a200d41026a2d00003a0000200641c0046a200c290200370300200641c8046a200c41086a290200370300200641d0046a200c41106a290200370300200641d8046a200c41186a280200360200200641bc046a200f360200200641b8046a200e3a000020064102360284044100210e200641003a008004200141306a20064180046a10b301210f0b20022008410f71200841047620104101711b41246c6a2208200e3a0000200820062f01a8033b00012008200f3602042008200629038004370208200841036a200641aa036a2d00003a0000200841106a20064180046a41086a2209290300370200200841186a20064180046a41106a2207290300370200200841206a20064180046a41186a220a28020036020041002108200641a8036a41086a4100360200200620023602ac03200641033602a803200641d8006a41086a200441086a2802003602002006200429020037035820064180046a2001200641a8036a2003200641d8006a200510aa04200641d0026a41086a221020064180046a41246a290200370300200641d0026a41106a2205200641ac046a290200370300200641d0026a41186a220b200641b4046a29020037030020062006419c046a2902003703d002200928020021092006418c046a28020021022007280200211720064194046a2802002107200a2802002103200641bc046a280200210c200641c0046a2903002118200641c8046a280200210a20062802840421112006280280042104200641c8016a41106a2212200641dc046a280200360200200641c8016a41086a2215200641d4046a2902003703002006200641cc046a2902003703c80120044101460d01200641f8016a41186a200b2903002219370300200641f8016a41106a2005290300221a370300200641f8016a41086a2010290300221b370300200641b0016a41086a22042015290300370300200641b0016a41106a22102012280200360200200641286a41086a201b370300200641286a41106a201a370300200641286a41186a2019370300200620062903d00222193703f801200620062903c8013703b00120062019370328200641106a41106a2010280200360200200641106a41086a2004290300370300200620062903b0013703100c250b0240024020022014460d00200a201020026a22094101762208490d21200641c8016a41046a200b20086a200a20086b10ab042003200328020820026a360208200620094101713602c801200641b4036a2208200641c8016a41086a290200370200200641bc036a200641c8016a41106a290200370200200641c4036a200641c8016a41186a290200370200200641cc036a200641c8016a41206a290200370200200641d4036a200641c8016a41286a290200370200200641dc036a200e3a000041022109200641023602a803200641df036a200d41026a2d00003a0000200620062902c8013702ac032006200d2f00003b00dd03200641e0036a200f360200200641e4036a200c290200370200200641ec036a200c41086a290200370200200641f4036a200c41106a290200370200200641fc036a200c41186a280200360200200641b0016a41086a200441086a280200360200200620042902003703b00120064180046a2001200641a8036a2003200641b0016a200510aa0420062802840421072006280280042103200641d0026a20064180046a41086a41d8001085051a20034101460d01200641f8016a200641d0026a41d8001085051a200641a8036a200641a0016a200210ae0420064180046a410472200641f8016a41d8001085051a4100210c200641003a008004200141306a20064180046a10b3012102200641286a41086a200641a8036a41186a290300370300200641286a41106a200641a8036a41206a290300370300200641286a41186a200641a8036a41286a2903003703002006200641a8036a41106a2903003703282002ad2118200641a8036a41086a28020021072008280200210320062802a803210220062802ac032117410021080c260b2003200328020820146a36020820064180046a41086a200c29020037030020064180046a41106a200c41086a29020037030020064180046a41186a200c41106a290200370300200641a0046a200c41186a2802003602002006200e3a0080042006200f360284042006200d2f00003b0081042006200d41026a2d00003a008304200641a8036a41086a200441086a280200360200200620042902003703a803200641d0026a200120064180046a2003200641a8036a200510800320062802d4022109024020062802d0024101460d00200a20104101762202490d22200641d0026a41086a2d0000210320064180046a410472200b20026a200a20026b10ab04200641a8036a41186a200641a8046a2903002218370300200641a8036a41106a200641a0046a2903002219370300200641286a41086a20064180046a41186a290300370300200641286a41106a2019370300200641286a41186a2018370300200620064180046a41106a29030037032820104101712102200341ff01714521082006418c046a280200210320064180046a41086a280200210720062802840421172009ad2118410221094100210c0c260b20004101360200200020093602040c020b20004101360200200020073602040c010b20004101360200200020113602040b20062802744125490d25200641fc006a28020010300c250b20004101360200200020103602040c200b200a20104101762202490d1d20064184046a200b20026a200a20026b10ab04200041c8006a200f360200200041c4006a2013360200200041c0006a200e3602002000413c6a200c36020020004281808080c000370204200041146a20064188046a2902003702002000411c6a20064190046a290200370200200041246a20064198046a2902003702002000412c6a200641a0046a290200370200200041346a200641a8046a29020037020020062010410171360280042000410c6a200629028004370200200041003602000c1e0b2000428080808010370200200041186a2010360200200041146a200b360200200041106a200a3602002000410c6a2002360200200041086a41033602000c220b20004101360200200020033602040240200e450d002013450d00200e10300b200c10300c1c0b20004101360200200020033602040240200a450d00200b450d00200a10300b200210300c200b2008201141e098c2001033000b2007200a41e098c2001033000b2002200341f098c200104a000b2007200941e098c2001033000b2008201741f098c200104a000b2008201141e098c2001033000b2007200a41e098c2001033000b2002200a41f098c200104a000b2003200a41f098c200104a000b2003200a41e098c2001033000b102a000b2008201141e098c2001033000b2017200341e098c2001033000b2008200341f098c200104a000b2008200741f098c200104a000b2002200a41f098c200104a000b2008201141e098c2001033000b2007200a41e098c2001033000b2017200a41e098c2001033000b2008200a41f098c200104a000b2002200a41f098c200104a000b20004101360200200020103602040c060b2002200a41e098c2001033000b2009200a41f098c200104a000b2008200a41f098c200104a000b2002200a41f098c200104a000b2002200a41f098c200104a000b20062802fc014125490d0420064184026a28020010300c040b20062802fc014125490d0320064184026a28020010300c030b20062802744125490d01200641fc006a28020010300c010b0b20002008360204200041186a2003360200200041146a2007360200200041106a20173602002000410c6a2002360200200041086a20093602002000411c6a2006290328370200200041c8006a200a360200200041c0006a20183702002000413c6a200c360200200041cc006a2006290310370200200041246a200641286a41086a2903003702002000412c6a200641286a41106a290300370200200041346a200641286a41186a290300370200200041d4006a200641106a41086a290300370200200041dc006a200641106a41106a280200360200200041003602000b20064180056a24000bc30301087f230041106b22032400200041003a00042000410036020020032000200210bd020240024020032802004101470d00200341086a2802000d0141d099c200411141e499c200102d000b02400240200028020022044125490d002000410c6a22052802002106200041086a28020021070c010b200041056a21072004210620002105412421040b02400240024020062004490d00200121080c010b2002210920012108024003402009450d01200720066a20082d00003a00002009417f6a2109200841016a21082004200641016a2206470d000b200421060c010b200520063602000c010b200520063602002008200120026a2201460d002000410c6a2105200041056a210a034002400240200028020022044125490d00200028020c210620002802082107200521090c010b2004210620002109200a2107412421040b20082d00002102024020062004470d0020032000410110bd02024020032802004101470d00200341086a2802000d0441d099c200411141e499c200102d000b200028020c210620002802082107200521090b200720066a20023a00002009200928020041016a3602002001200841016a2208470d000b0b200341106a24000f0b102a000b940b03017f057e197f230041e0016b22022400200241e8006a200141d0001085051a200241c0016a41186a200029031820002903088522033703002002200029031022043703c801200241e8006a41186a290300210520022004200029030022068522073703d001200241c8006a2003200585420020072002290378854200108405200241d8006a2003200241e8006a41086a29030085420020072002290368854200108405200220042004200642adfed5e4d485fda8d8007e200241c8006a41086a2903002002290348857c42a0cbbf9599b5a19f0a7c85421789200241d8006a41086a2903002002290358857c854217893703c00120024188016a200241c0016a10ff0102400240200241b4016a2d000022080d00200241186a20022903c001420042adfed5e4d485fda8d8004200108405200241186a41086a29030020022903188521040c010b200241386a20022903c001420185420042adfed5e4d485fda8d8004200108405200241286a200241386a41086a290300200229033885200241b5016a31000085420042adfed5e4d485fda8d8004200108405200241286a41086a29030020022903288521040b200241086a20022903c801420020044200108405200041246a2802002209200041206a220a280200220b200241106a290300200229030885200489a7220c71220d6a280000220e200c411976220f41818284086c2210732211417f73201141fffdfb776a71418081828478712112200d41046a200b71211341042114200d2115200e2111024002400240024003402013211620120d012011201141017471418081828478710d022010200920166a2800002211732212417f73201241fffdfb776a71418081828478712112200b201620146a41046a712113201441046a2114201621150c000b0b2012417f6a201271211320152012684103766a2117200241e8006a41256a211820024194016a280200211920024190016a280200211a200228028801211b200241e8006a41cd006a2d000041ff0171211c03400240200241e8006a20094100200b2017716b41d0006c6a221241b07f6a221d41201088050d00201241506a211e201a211f201921170240201b41254f0d002018211f201b21170b02400240201e28020022204125490d002012415c6a2802002120201241586a280200211e0c010b201e41056a211e0b20172020470d00201f201e20171088050d0020082012417c6a2d0000470d002008450d03201c201d41cd006a2d000041ff0171460d030b024003402016211220130d012011201141017471418081828478710d032010200920126a2800002211732216417f73201641fffdfb776a71418081828478712113200b201220146a41046a712116201441046a2114201221150c000b0b20152013684103766a2117201221162013417f6a20137121130c000b0b200220003602bc014104211102400340200e4180818284787122160d01200d20116a2116201141046a211120092016200b71220d6a280000210e0c000b0b02402009201668410376200d6a200b7122116a2c000022164100480d0020092009280200418081828478716841037622116a2d000021160b200041286a280200211402402016410171220d450d0020140d00200241c0016a200a200241bc016a10fe012000280220220b200c712116200041246a28020021094104211103402016221420116a200b712116201141046a2111200920146a28000041808182847871220e450d000b02402009200e6841037620146a200b7122116a2c00004100480d002009280200418081828478716841037621110b200028022821140b20002014200d6b360228200920116a200f3a0000200b2011417c6a7120096a41046a200f3a00002009410020116b41d0006c6a41b07f6a200141d0001085051a2000412c6a2211201128020041016a3602000c010b201b4125490d00201a10300b200241e0016a24000bf17c1f057f017e027f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e017f017e1e7f230041d0106b22052400200541f00e6a2002200310ce0320052d00f10e210620052d00f00e2107200541900d6a200541f00e6a41027241de011085051a024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020074101470d002005200641ff017141004722033a00094130102f22020d010c2a0b200541b00b6a200541900d6a41026a41dc011085051a200541086a410472200541b00b6a200220031070200541086a41086a22082802002109200541086a410c6a290200210a200541086a41146a2802002106200541086a41186a2802002102200541086a411c6a280200210b200541086a41206a280200210c200541086a41246a290200210d200541346a280200210e200541086a41306a290300210f200541086a41386a2802002110200541086a413c6a2902002111200541086a41c4006a2802002112200541086a41c8006a2903002113200541086a41d0006a2802002114200541dc006a2902002115200541e4006a2802002116200541e8006a2903002117200541f0006a2802002118200541f4006a2902002119200541fc006a280200211a20054180016a290300211b20054188016a280200211c2005418c016a290200211d20054194016a280200211e20054198016a290300211f200541a0016a2802002120200541a4016a2902002121200541ac016a2802002122200541b0016a2903002123200541b8016a2802002124200541bc016a2902002125200541c4016a2802002126200541c8016a2903002127200541d0016a2802002128200541d4016a28020021294100212a200528020c0e050702030401070b200241033a0000200220033a002120022001290000370001200241096a200141086a290000370000200241116a200141106a290000370000200241196a200141186a29000037000020004101360200200020023602040c270b200541d8016a2802002103200541dc016a280200212b200541e0016a28020021074102212c4102212d024020064102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200541b00b6a41086a200b360200200520023602b40b200520063602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212d20052802f00e4101460d17200541a0056a41186a200541900f6a290300370300200541a0056a41106a200541f00e6a41186a290300370300200541a0056a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0050b20054180056a41186a200541a0056a41186a29030037030020054180056a41106a200541a0056a41106a29030037030020054180056a41086a200541a0056a41086a290300370300200520052903a005370380050240200c4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005200d3702b40b2005200c3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212c20052802f00e4101460d18200541e0056a41186a200541900f6a290300370300200541e0056a41106a200541f00e6a41186a290300370300200541e0056a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0050b200541c0056a41186a200541e0056a41186a290300370300200541c0056a41106a200541e0056a41106a290300370300200541c0056a41086a200541e0056a41086a290300370300200520052903e0053703c00541022106410221020240200e4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005200f3702b40b2005200e3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210220052802f00e4101460d19200541a0066a41186a200541900f6a290300370300200541a0066a41106a200541f00e6a41186a290300370300200541a0066a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0060b20054180066a41186a200541a0066a41186a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41086a200541a0066a41086a290300370300200520052903a00637038006024020104102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520113702b40b200520103602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210620052802f00e4101460d1a200541e0066a41186a200541900f6a290300370300200541e0066a41106a200541f00e6a41186a290300370300200541e0066a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0060b200541c0066a41186a200541e0066a41186a290300370300200541c0066a41106a200541e0066a41106a290300370300200541c0066a41086a200541e0066a41086a290300370300200520052903e0063703c0064102212e4102212a024020124102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520133702b40b200520123602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212a20052802f00e4101460d1b200541a0076a41186a200541900f6a290300370300200541a0076a41106a200541f00e6a41186a290300370300200541a0076a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0070b20054180076a41186a200541a0076a41186a29030037030020054180076a41106a200541a0076a41106a29030037030020054180076a41086a200541a0076a41086a290300370300200520052903a00737038007024020144102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520153702b40b200520143602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212e20052802f00e4101460d1c200541e0076a41186a200541900f6a290300370300200541e0076a41106a200541f00e6a41186a290300370300200541e0076a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0070b200541c0076a41186a200541e0076a41186a290300370300200541c0076a41106a200541e0076a41106a290300370300200541c0076a41086a200541e0076a41086a290300370300200520052903e0073703c0074102210c4102210b024020164102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520173702b40b200520163602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210b20052802f00e4101460d1d200541a0086a41186a200541900f6a290300370300200541a0086a41106a200541f00e6a41186a290300370300200541a0086a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0080b20054180086a41186a200541a0086a41186a29030037030020054180086a41106a200541a0086a41106a29030037030020054180086a41086a200541a0086a41086a290300370300200520052903a00837038008024020184102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520193702b40b200520183602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210c20052802f00e4101460d1e200541e0086a41186a200541900f6a290300370300200541e0086a41106a200541f00e6a41186a290300370300200541e0086a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0080b200541c0086a41186a200541e0086a41186a290300370300200541c0086a41106a200541e0086a41106a290300370300200541c0086a41086a200541e0086a41086a290300370300200520052903e0083703c008410221104102210e0240201a4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005201b3702b40b2005201a3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210e20052802f00e4101460d1f200541a0096a41186a200541900f6a290300370300200541a0096a41106a200541f00e6a41186a290300370300200541a0096a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0090b20054180096a41186a200541a0096a41186a29030037030020054180096a41106a200541a0096a41106a29030037030020054180096a41086a200541a0096a41086a290300370300200520052903a009370380090240201c4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005201d3702b40b2005201c3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e211020052802f00e4101460d20200541e0096a41186a200541900f6a290300370300200541e0096a41106a200541f00e6a41186a290300370300200541e0096a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0090b200541c0096a41186a200541e0096a41186a290300370300200541c0096a41106a200541e0096a41106a290300370300200541c0096a41086a200541e0096a41086a290300370300200520052903e0093703c00941022112410221080240201e4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005201f3702b40b2005201e3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210820052802f00e4101460d21200541a00a6a41186a200541900f6a290300370300200541a00a6a41106a200541f00e6a41186a290300370300200541a00a6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a00a0b200541800a6a41186a200541a00a6a41186a290300370300200541800a6a41106a200541a00a6a41106a290300370300200541800a6a41086a200541a00a6a41086a290300370300200520052903a00a3703800a024020204102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520213702b40b200520203602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e211220052802f00e4101460d22200541c00a6a41186a200541900f6a290300370300200541c00a6a41106a200541f00e6a41186a290300370300200541c00a6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703c00a0b4102211641022114024020224102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520233702b40b200520223602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e211420052802f00e4101460d23200541e00a6a41186a200541900f6a290300370300200541e00a6a41106a200541f00e6a41186a290300370300200541e00a6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e00a0b024020244102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520253702b40b200520243602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e211620052802f00e4101460d24200541800b6a41186a200541900f6a290300370300200541800b6a41106a200541f00e6a41186a290300370300200541800b6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703800b0b4102211a41022118024020264102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520273702b40b200520263602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e211820052802f00e4101460d25200541086a41186a200541900f6a290300370300200541086a41106a200541f00e6a41186a290300370300200541086a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703080b024020284102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200541a00b6a41086a2003360200200520293602a40b200520283602a00b200541f00e6a200541900d6a200541a00b6a200410af0420052802f40e211a20052802f00e4101460d26200541b00b6a41186a200541900f6a290300370300200541b00b6a41106a200541f00e6a41186a290300370300200541b00b6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703b00b0b200541e0046a41186a220120054180056a41186a290300370300200541e0046a41106a220420054180056a41106a290300370300200541e0046a41086a222920054180056a41086a290300370300200541c0046a41086a221c200541c0056a41086a290300370300200541c0046a41106a221e200541c0056a41106a290300370300200541c0046a41186a2220200541c0056a41186a290300370300200541a0046a41086a222220054180066a41086a290300370300200541a0046a41106a222420054180066a41106a290300370300200541a0046a41186a222620054180066a41186a29030037030020052005290380053703e004200520052903c0053703c00420052005290380063703a00420054180046a41186a2228200541c0066a41186a29030037030020054180046a41106a222f200541c0066a41106a29030037030020054180046a41086a2230200541c0066a41086a290300370300200541e0036a41086a223120054180076a41086a290300370300200541e0036a41106a223220054180076a41106a290300370300200541e0036a41186a223320054180076a41186a290300370300200541c0036a41086a2234200541c0076a41086a290300370300200541c0036a41106a2235200541c0076a41106a290300370300200541c0036a41186a2236200541c0076a41186a290300370300200520052903c0063703800420052005290380073703e003200520052903c0073703c003200541a0036a41186a223720054180086a41186a290300370300200541a0036a41106a223820054180086a41106a290300370300200541a0036a41086a223920054180086a41086a29030037030020054180036a41186a223a200541c0086a41186a29030037030020054180036a41106a223b200541c0086a41106a29030037030020054180036a41086a223c200541c0086a41086a290300370300200541e0026a41186a223d20054180096a41186a290300370300200541e0026a41106a223e20054180096a41106a290300370300200541e0026a41086a223f20054180096a41086a29030037030020052005290380083703a003200520052903c0083703800320052005290380093703e002200541c0026a41186a2240200541c0096a41186a290300370300200541c0026a41106a2241200541c0096a41106a290300370300200541c0026a41086a2242200541c0096a41086a290300370300200520052903c0093703c002200541a0026a41186a2243200541800a6a41186a290300370300200541a0026a41106a2244200541800a6a41106a290300370300200541a0026a41086a2245200541800a6a41086a290300370300200520052903800a3703a00241c004102f2203450d272003202d360200200320052903e0043702042003202c360224200320052903c0043702282003410c6a2029290300370200200341146a20042903003702002003411c6a2001290300370200200341306a201c290300370200200341386a201e290300370200200341c0006a2020290300370200200320023602482003200636026c200320052903a00437024c200341d4006a2022290300370200200341dc006a2024290300370200200341e4006a20262903003702002003200529038004370270200341f8006a203029030037020020034180016a202f29030037020020034188016a20282903003702002003202a360290012003202e3602b401200341ac016a2033290300370200200341a4016a20322903003702002003419c016a2031290300370200200320052903e00337029401200341d0016a2036290300370200200341c8016a2035290300370200200341c0016a2034290300370200200320052903c0033702b8012003200b3602d801200341f4016a2037290300370200200341ec016a2038290300370200200341e4016a2039290300370200200320052903a0033702dc012003200c3602fc0120034198026a203a29030037020020034190026a203b29030037020020034188026a203c2903003702002003200529038003370280022003200e3602a002200341bc026a203d290300370200200341b4026a203e290300370200200341ac026a203f290300370200200320052903e0023702a402200320103602c402200341e0026a2040290300370200200341d8026a2041290300370200200341d0026a2042290300370200200320052903c0023702c802200320083602e80220034184036a2043290300370200200341fc026a2044290300370200200341f4026a2045290300370200200320052903a0023702ec022003201236028c03200341a8036a200541c00a6a41186a290300370200200341a0036a200541c00a6a41106a29030037020020034198036a200541c00a6a41086a290300370200200320052903c00a37029003200320143602b003200341cc036a200541e00a6a41186a290300370200200341c4036a200541e00a6a41106a290300370200200341bc036a200541e00a6a41086a290300370200200320052903e00a3702b403200320163602d403200341f0036a200541800b6a41186a290300370200200341e8036a200541800b6a41106a290300370200200341e0036a200541800b6a41086a290300370200200320052903800b3702d803200320183602f80320034194046a200541086a41186a2903003702002003418c046a200541086a41106a29030037020020034184046a200541086a41086a290300370200200320052903083702fc032003201a36029c04200341b8046a200541b00b6a41186a290300370200200341b0046a200541b00b6a41106a290300370200200341a8046a200541b00b6a41086a290300370200200320052903b00b3702a0044104212a200541f00e6a4104722009200aa710ab04202b0d03410021020c040b200541f00e6a4104722009200aa710ab042002417f4c0d064101212a4101210302402002450d002002102f2203450d270b200a422088a7212d2003200620021085051a20054180026a41086a200541f00e6a41186a29030037030020054180026a41106a200541900f6a29030037030020054180026a41186a200541980f6a2903003703002005200541f00e6a41106a29030037038002200541fc0e6a280200212b200541f00e6a41086a280200212920052802f40e212c2002212e0c040b200541f00e6a4104722009200aa710ab04200541b00b6a41186a200141186a290000370300200541b00b6a41106a200141106a290000370300200541b00b6a41086a200141086a290000370300200520012900003703b00b200541800b6a41086a200b360200200520023602840b200520063602800b200541900d6a200541b00b6a200541800b6a200410af042008200541900d6a411c6a290200370300200541086a41106a2201200541900d6a41246a2802003602002005200541900d6a41146a29020037030820052802940d2103024020052802900d4101460d00200541900d6a41086a290300210d200541900d6a41106a2802002107200541e8016a41106a2001280200360200200541e8016a41086a200541086a41086a29030037030020054180026a41086a200541f00e6a41186a29030037030020054180026a41106a200541900f6a29030037030020054180026a41186a200541980f6a290300370300200520052903083703e8012005200541f00e6a41106a29030037038002200d422088a7212e200a422088a7212d200541f00e6a41086a2802002129200541fc0e6a280200212b20052802f40e212c200da721024102212a0c040b200041013602002000200336020420052802f40e4125490d24200541fc0e6a28020010300c240b4102210741022103024020094102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005200a3702b40b200520093602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210320052802f00e4101460d04200541a0056a41186a200541900f6a290300370300200541a0056a41106a200541f00e6a41186a290300370300200541a0056a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0050b20054180056a41186a200541a0056a41186a29030037030020054180056a41106a200541a0056a41106a29030037030020054180056a41086a200541a0056a41086a290300370300200520052903a00537038005024020064102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200541b00b6a41086a200b360200200520023602b40b200520063602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210720052802f00e4101460d06200541e0056a41186a200541900f6a290300370300200541e0056a41106a200541f00e6a41186a290300370300200541e0056a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0050b200541c0056a41186a200541e0056a41186a290300370300200541c0056a41106a200541e0056a41106a290300370300200541c0056a41086a200541e0056a41086a290300370300200520052903e0053703c00541022106410221020240200c4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005200d3702b40b2005200c3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210220052802f00e4101460d07200541a0066a41186a200541900f6a290300370300200541a0066a41106a200541f00e6a41186a290300370300200541a0066a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0060b20054180066a41186a200541a0066a41186a29030037030020054180066a41106a200541a0066a41106a29030037030020054180066a41086a200541a0066a41086a290300370300200520052903a006370380060240200e4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005200f3702b40b2005200e3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210620052802f00e4101460d08200541e0066a41186a200541900f6a290300370300200541e0066a41106a200541f00e6a41186a290300370300200541e0066a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0060b200541c0066a41186a200541e0066a41186a290300370300200541c0066a41106a200541e0066a41106a290300370300200541c0066a41086a200541e0066a41086a290300370300200520052903e0063703c0064102212a4102212c024020104102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520113702b40b200520103602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212c20052802f00e4101460d09200541a0076a41186a200541900f6a290300370300200541a0076a41106a200541f00e6a41186a290300370300200541a0076a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0070b20054180076a41186a200541a0076a41186a29030037030020054180076a41106a200541a0076a41106a29030037030020054180076a41086a200541a0076a41086a290300370300200520052903a00737038007024020124102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520133702b40b200520123602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212a20052802f00e4101460d0a200541e0076a41186a200541900f6a290300370300200541e0076a41106a200541f00e6a41186a290300370300200541e0076a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0070b200541c0076a41186a200541e0076a41186a290300370300200541c0076a41106a200541e0076a41106a290300370300200541c0076a41086a200541e0076a41086a290300370300200520052903e0073703c0074102212e4102212b024020144102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520153702b40b200520143602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212b20052802f00e4101460d0b200541a0086a41186a200541900f6a290300370300200541a0086a41106a200541f00e6a41186a290300370300200541a0086a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0080b20054180086a41186a200541a0086a41186a29030037030020054180086a41106a200541a0086a41106a29030037030020054180086a41086a200541a0086a41086a290300370300200520052903a00837038008024020164102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520173702b40b200520163602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e212e20052802f00e4101460d0c200541e0086a41186a200541900f6a290300370300200541e0086a41106a200541f00e6a41186a290300370300200541e0086a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0080b200541c0086a41186a200541e0086a41186a290300370300200541c0086a41106a200541e0086a41106a290300370300200541c0086a41086a200541e0086a41086a290300370300200520052903e0083703c0084102210b41022109024020184102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520193702b40b200520183602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210920052802f00e4101460d0d200541a0096a41186a200541900f6a290300370300200541a0096a41106a200541f00e6a41186a290300370300200541a0096a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a0090b20054180096a41186a200541a0096a41186a29030037030020054180096a41106a200541a0096a41106a29030037030020054180096a41086a200541a0096a41086a290300370300200520052903a009370380090240201a4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005201b3702b40b2005201a3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210b20052802f00e4101460d0e200541e0096a41186a200541900f6a290300370300200541e0096a41106a200541f00e6a41186a290300370300200541e0096a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e0090b200541c0096a41186a200541e0096a41186a290300370300200541c0096a41106a200541e0096a41106a290300370300200541c0096a41086a200541e0096a41086a290300370300200520052903e0093703c0094102210e4102210c0240201c4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005201d3702b40b2005201c3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210c20052802f00e4101460d0f200541a00a6a41186a200541900f6a290300370300200541a00a6a41106a200541f00e6a41186a290300370300200541a00a6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703a00a0b200541800a6a41186a200541a00a6a41186a290300370300200541800a6a41106a200541a00a6a41106a290300370300200541800a6a41086a200541a00a6a41086a290300370300200520052903a00a3703800a0240201e4102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d2005201f3702b40b2005201e3602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210e20052802f00e4101460d10200541c00a6a41186a200541900f6a290300370300200541c00a6a41106a200541f00e6a41186a290300370300200541c00a6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703c00a0b4102210841022110024020204102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520213702b40b200520203602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e211020052802f00e4101460d11200541e00a6a41186a200541900f6a290300370300200541e00a6a41106a200541f00e6a41186a290300370300200541e00a6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703e00a0b024020224102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520233702b40b200520223602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e210820052802f00e4101460d12200541800b6a41186a200541900f6a290300370300200541800b6a41106a200541f00e6a41186a290300370300200541800b6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703800b0b4102211441022112024020244102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520253702b40b200520243602b00b200541f00e6a200541900d6a200541b00b6a200410af0420052802f40e211220052802f00e4101460d13200541086a41186a200541900f6a290300370300200541086a41106a200541f00e6a41186a290300370300200541086a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703080b0240024020264102460d00200541900d6a41186a200141186a290000370300200541900d6a41106a200141106a290000370300200541900d6a41086a200141086a290000370300200520012900003703900d200520273702a40b200520263602a00b200541f00e6a200541900d6a200541a00b6a200410af0420052802f40e211420052802f00e4101460d01200541b00b6a41186a200541900f6a290300370300200541b00b6a41106a200541f00e6a41186a290300370300200541b00b6a41086a200541f00e6a41106a2903003703002005200541f00e6a41086a2903003703b00b0b200541e0046a41186a220120054180056a41186a290300370300200541e0046a41106a220420054180056a41106a290300370300200541e0046a41086a221620054180056a41086a290300370300200541c0046a41086a2218200541c0056a41086a290300370300200541c0046a41106a221a200541c0056a41106a290300370300200541c0046a41186a221c200541c0056a41186a290300370300200541a0046a41086a221e20054180066a41086a290300370300200541a0046a41106a222020054180066a41106a290300370300200541a0046a41186a222220054180066a41186a29030037030020052005290380053703e004200520052903c0053703c00420052005290380063703a00420054180046a41186a2224200541c0066a41186a29030037030020054180046a41106a2226200541c0066a41106a29030037030020054180046a41086a222f200541c0066a41086a290300370300200541e0036a41086a223020054180076a41086a290300370300200541e0036a41106a223120054180076a41106a290300370300200541e0036a41186a223220054180076a41186a290300370300200541c0036a41086a2233200541c0076a41086a290300370300200541c0036a41106a2234200541c0076a41106a290300370300200541c0036a41186a2235200541c0076a41186a290300370300200520052903c0063703800420052005290380073703e003200520052903c0073703c003200541a0036a41186a223620054180086a41186a290300370300200541a0036a41106a223720054180086a41106a290300370300200541a0036a41086a223820054180086a41086a29030037030020054180036a41186a2239200541c0086a41186a29030037030020054180036a41106a223a200541c0086a41106a29030037030020054180036a41086a223b200541c0086a41086a290300370300200541e0026a41186a223c20054180096a41186a290300370300200541e0026a41106a223d20054180096a41106a290300370300200541e0026a41086a223e20054180096a41086a29030037030020052005290380083703a003200520052903c0083703800320052005290380093703e002200541c0026a41186a223f200541c0096a41186a290300370300200541c0026a41106a2240200541c0096a41106a290300370300200541c0026a41086a2241200541c0096a41086a290300370300200520052903c0093703c002200541a0026a41186a2242200541800a6a41186a290300370300200541a0026a41106a2243200541800a6a41106a290300370300200541a0026a41086a2244200541800a6a41086a290300370300200520052903800a3703a00241c004102f222d450d25202d2003360200202d20052903e004370204202d2007360224202d20052903c004370228202d410c6a2016290300370200202d41146a2004290300370200202d411c6a2001290300370200202d41306a2018290300370200202d41386a201a290300370200202d41c0006a201c290300370200202d2002360248202d200636026c202d20052903a00437024c202d41d4006a201e290300370200202d41dc006a2020290300370200202d41e4006a2022290300370200202d200529038004370270202d41f8006a202f290300370200202d4180016a2026290300370200202d4188016a2024290300370200202d202c36029001202d202a3602b401202d41ac016a2032290300370200202d41a4016a2031290300370200202d419c016a2030290300370200202d20052903e00337029401202d41d0016a2035290300370200202d41c8016a2034290300370200202d41c0016a2033290300370200202d20052903c0033702b801202d202b3602d801202d41f4016a2036290300370200202d41ec016a2037290300370200202d41e4016a2038290300370200202d20052903a0033702dc01202d202e3602fc01202d4198026a2039290300370200202d4190026a203a290300370200202d4188026a203b290300370200202d20052903800337028002202d20093602a002202d41bc026a203c290300370200202d41b4026a203d290300370200202d41ac026a203e290300370200202d20052903e0023702a402202d200b3602c402202d41e0026a203f290300370200202d41d8026a2040290300370200202d41d0026a2041290300370200202d20052903c0023702c802202d200c3602e802202d4184036a2042290300370200202d41fc026a2043290300370200202d41f4026a2044290300370200202d20052903a0023702ec02202d200e36028c03202d41a8036a200541c00a6a41186a290300370200202d41a0036a200541c00a6a41106a290300370200202d4198036a200541c00a6a41086a290300370200202d20052903c00a37029003202d20103602b003202d41cc036a200541e00a6a41186a290300370200202d41c4036a200541e00a6a41106a290300370200202d41bc036a200541e00a6a41086a290300370200202d20052903e00a3702b403202d20083602d403202d41f0036a200541800b6a41186a290300370200202d41e8036a200541800b6a41106a290300370200202d41e0036a200541800b6a41086a290300370200202d20052903800b3702d803202d20123602f803202d4194046a200541086a41186a290300370200202d418c046a200541086a41106a290300370200202d4184046a200541086a41086a290300370200202d20052903083702fc03202d201436029c04202d41b8046a200541b00b6a41186a290300370200202d41b0046a200541b00b6a41106a290300370200202d41a8046a200541b00b6a41086a290300370200202d20052903b00b3702a0044103212a024020280d004100212c2029212b0c040b2029417f4c0d050240024020290d004101212c0c010b2029102f222c450d260b202c202820291085051a2029212b0c030b20004101360200200020143602040c230b2007417f4c0d030240024020070d00410121020c010b2007102f2202450d240b2002202b20071085051a0b200a422088a7212d20054180026a41086a200541f00e6a41186a29030037030020054180026a41106a200541900f6a29030037030020054180026a41186a200541980f6a2903003703002005200541f00e6a41106a29030037038002200541f00e6a410c6a280200212b200541f00e6a41086a280200212920052802f40e212c2007212e0b2000202a360204200041186a200529038002370200200041c8006a20052903e801370200200041c4006a2007360200200041386a2003360200200041146a202b360200200041106a20293602002000410c6a202c360200200041086a202d360200200041306a20054180026a41186a290300370200200041286a20054180026a41106a290300370200200041206a20054180026a41086a290300370200200041d0006a200541e8016a41086a290300370200200041d8006a200541e8016a41106a2802003602002000413c6a202ead4220862002ad84370200200041003602000c200b20004101360200200020033602040c1f0b102c000b20004101360200200020073602040c1d0b20004101360200200020023602040c1c0b20004101360200200020063602040c1b0b200041013602002000202c3602040c1a0b200041013602002000202a3602040c190b200041013602002000202b3602040c180b200041013602002000202e3602040c170b20004101360200200020093602040c160b200041013602002000200b3602040c150b200041013602002000200c3602040c140b200041013602002000200e3602040c130b20004101360200200020103602040c120b20004101360200200020083602040c110b20004101360200200020123602040c100b200041013602002000202d3602040c0f0b200041013602002000202c3602040c0e0b20004101360200200020023602040c0d0b20004101360200200020063602040c0c0b200041013602002000202a3602040c0b0b200041013602002000202e3602040c0a0b200041013602002000200b3602040c090b200041013602002000200c3602040c080b200041013602002000200e3602040c070b20004101360200200020103602040c060b20004101360200200020083602040c050b20004101360200200020123602040c040b20004101360200200020143602040c030b20004101360200200020163602040c020b20004101360200200020183602040c010b200041013602002000201a3602040b200541d0106a24000f0b102a000b810601067f230041e0006b22032400024002400240024002400240024002400240200141046a2802002204410174200141086a28020022056b20024b0d00200420054101762202490d02200041046a200128020020026a200420026b10ab04200020054101713602000c010b20054101762106200520026a22074101762108024020074101710d0020082006490d0320042008490d04200128020020066a210202400240200820066b220141244b0d00200041096a200220011085051a410021020c010b2001417f4c0d062001102f2204450d072004200220011085052102200041106a20013602002000410c6a2002360200410121020b2000200136020420002005410171360200200041086a20023a00000c010b200841016a22072006490d06200820044f0d07200128020020066a210402400240200720066b220141244b0d00200341096a200420011085051a410021040c010b2001417f4c0d052001102f2206450d062006200420011085052104200320013600102003200436000c410121040b200341306a41086a20043a0000200341396a2003290009370000200341c1006a200341096a41086a290000370000200341c9006a200341096a41106a290000370000200341d1006a200341216a290000370000200341d8006a200341286a2900003700002003200136023420032005410171360230200341306a200241017110f90402400240200328023422014125490d00200341306a41106a220528020021010c010b200341306a41047221050b02402001450d0020052001417f6a3602000b20002003290330370200200041286a200341306a41286a290300370200200041206a200341306a41206a290300370200200041186a200341306a41186a290300370200200041106a200341306a41106a290300370200200041086a200341306a41086a2903003702000b200341e0006a24000f0b2002200441f098c200104a000b20062008418099c2001048000b20082004418099c2001042000b102c000b102a000b20062007419099c2001048000b20072004419099c2001042000bfd0601047f230041f0026b22042400200241086a280200210520022802042106024002400240024002400240024020022802004101470d00200441d0016a41186a200141186a290000370300200441d0016a41106a200141106a290000370300200441d0016a41086a200141086a290000370300200420012900003703d001200441f0016a200441d0016a20062005200310ad0420042802f401210120042802f0012102200441f8006a200441f0016a41086a41d4001085051a20024101460d05200441246a200441f8006a41d4001085051a200441f8016a200441246a41d4001085051a41002105200441003a00f001200420013602f4012003200441f0016a10b30121020c010b0240024020054120460d002005417f4c0d040240024020050d00410121020c010b2005102f2202450d060b20022006200510850521064130102f2202450d05200241043a00002002200536002c200220053600282002200636002420022001290000370001200241096a200141086a290000370000200241116a200141106a290000370000200241196a200141186a2900003700000c010b200441246a41026a200641026a2d00003a0000200441f8016a2006410f6a29000037030020044180026a200641176a29000037030020044188026a2006411f6a2d00003a0000200420062f00003b0124200420062900073703f001200628000321020b200441d0016a41026a2201200441246a41026a2d00003a0000200441f8006a41086a2206200441f0016a41086a290300370300200441f8006a41106a2203200441f0016a41106a290300370300200441f8006a41186a2207200441f0016a41186a2d00003a0000200420042f01243b01d001200420042903f00137037820054120470d01200441206a41026a20012d00003a0000200441086a2006290300370300200441106a2003290300370300200441186a20072d00003a0000200420042f01d0013b012020042004290378370300410121050b200020053a0004200041003602002000410c6a2004290300370200200041056a20042f01203b0000200041086a2002360200200041246a200441186a2802003602002000411c6a200441106a290300370200200041146a200441086a290300370200200041076a200441226a2d00003a00000c040b20004101360200200020023602040c030b102c000b102a000b20004101360200200020013602040b200441f0026a24000bb00e03027f017e047f23004190066b220524000240024002400240024002400240024002400240024002400240024002400240024020022d00004101470d0020054180036a200241196a290000370300200541f8026a200241116a290000370300200541f0026a200241096a290000370300200520022900013703e8022003280208220641017621020240024020064101710d00200328020422062002490d04200541003a00f003200520023602ec03200520032802003602e8030c010b200328020422062002490d04200220064f0d052005200328020022063602e803200520023602ec03200541f1036a200620026a2d000041f001713a0000200541013a00f0030b2001200541e8026a200541e8036a10a9042207422088a721022007a70d070240200141c8006a220828020022062006417f6a2209200141c0006a220a28020022062001413c6a220b2802006b716b4101470d00200b10b2012008280200417f6a2109200a28020021060b200a2009200641016a71360200200141c4006a28020020064102746a2002360200200141386a280200220620024d0d062001280230200241fc006c6a22022d0000210620022f00012109200241036a2d0000210a2005200241046a220841f8001085051a20084100360200200241003a00002009200a4110747221090c010b200241046a28020021020240200141c8006a220828020022062006417f6a2209200141c0006a220a28020022062001413c6a220b2802006b716b4101470d00200b10b2012008280200417f6a2109200a28020021060b200a2009200641016a71360200200141c4006a28020020064102746a2002360200200141386a280200220620024d0d042001280230200241fc006c6a22022d0000210620022f00012109200241036a2d0000210a2005200241046a220841f8001085051a20084100360200200241003a00002009200a4110747221090b200541f0016a200541f8001085051a024002400240024002400240200641ff01714101470d00200328020821062003280204210a20032802002108200541b8056a20054190026a41d8001085051a200541e8026a2001200541b8056a2003200410b10420052802ec02210220052802e8022103200541e0046a200541f0026a41d8001085051a20034101460d0520020e03020401020b200541b8056a200541d8001085051a200541e8026a2001200541b8056a2003200410b10420052802ec02210220052802e8022103200541e0046a200541f0026a41d8001085051a20034101460d0441022103024020020e03000313000b200541e8036a200541e0046a41d8001085051a0c110b200641017621020240024020064101710d00200a2002490d0c410021030c010b200a2002490d0c2002200a4f0d0d200820026a2d00004170712106410121030b20054188036a2008200210ab04200541b5036a20063a0000200541b4036a20033a0000200541f3026a200541086a290000370000200541fb026a200541106a29000037000020054180036a200541156a290000370000200520052900003700eb02200520093b01e802200520094110763a00ea022001200541e8026a10ac04410221030c110b20054180036a200541156a290000370000200541fb026a200541106a290000370000200541f3026a200541086a290000370000200520052900003700eb02200641017621020240024020064101710d00200a2002490d0e410021030c010b200a2002490d0e2002200a4f0d0f200820026a2d00004170712106410121030b20054188036a2008200210ab04200541b5036a20063a0000200541b4036a20033a0000200520093b01e802200520094110763a00ea022001200541e8026a10ac04200541e8036a200541e0046a41d8001085051a0c0f0b200541e8036a200541e0046a41d8001085051a41002104410021030c0f0b200541e8026a41156a200541156a290000370000200541e8026a41106a200541106a290000370300200541e8026a41086a200541086a290000370300200520052900003703e80220054188036a200541e0046a41d8001085051a200541e8036a200541e8026a41f8001085051a41012103410021040c0e0b20004101360200200020023602040c0e0b2002200641a099c2001042000b2002200641b099c2001042000b2002200641c099c2001033000b2002200641acf0c1001033000b2002200641acf0c1001033000b20004101360200200020023602040c080b2002200a41a099c2001042000b2002200a41b099c2001042000b2002200a41c099c2001033000b2002200a41a099c2001042000b2002200a41b099c2001042000b2002200a41c099c2001033000b41002103410121040b200541f8006a200541e8036a41f8001085051a41022102024020034102460d00200520032009410874723602e802200541e8026a410472200541f8006a41f8001085051a20044101712102200141306a200541e8026a10b30121060b2000200636020420004100360200200041086a20023a00000b20054190066a24000b853305067f017e027f017e0b7f230041a0036b22052400200241146a2106200328020422074101742108200328020821092003280200210a2002413c6a290200210b200241386a280200210c200241346a280200210d2002410c6a290200210e200241086a280200210f200228020421104102211102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022802000e052207000102220b200541a8016a41086a200e370300200541a8016a41106a2006290200370300200541a8016a41186a200641086a290200370300200541c8016a200641106a290200370300200541d0016a200641186a290200370300200520103602a8012005200f3602ac01200e422088a7211202400240200f4125490d0020052802b8012113201221140c010b200541b1016a2114200f21130b410021150240200820096b2211201341017420106b2216201620114b1b2217450d000340201020156a2208410176221120134f0d15200920156a2218410176221920074f0d16201420116a2d00002211410f71201141f0017141047620084101711b200a20196a2d00002211410f71201141047620184101711b470d012017201541016a2215470d000b201721150b200241c4006a210220152016470d07200541d8016a41086a200341086a22152802003602002015200920166a360200200520032902003703d801200541e8016a41086a200b370300200541e8016a41106a200229020037030020054180026a200241086a29020037030020054188026a200241106a2802003602002005200c3602ec012005200d3602e801200541c8026a2001200541e8016a2003200410b00420052802cc02210c20052802c8024101460d10200541c8026a41086a2d0000220241ff01714102460d0f4101211120024101710d08200541186a41186a200641186a290200370300200541186a41106a200641106a290200370300200541186a41086a200641086a29020037030020052006290200370318410221154100210d0c210b20082009470d03200f0d0141012111410321154100210f0c200b20082009470d03200c0d01200541186a41186a200641186a290200370300200541186a41106a200641106a290200370300200541186a41086a200641086a2902003703002005200629020037031841012111410421154100210c0c1f0b024020042802002202450d00200441046a280200450d00200210300b2004200e3702042004200f36020041002111200541c8026a41086a4100360200200520103602cc02200541033602c80220054188016a41086a200341086a2802003602002005200329020037038801200541e8016a2001200541c8026a20054188016a10b204200541a8016a41086a220220054188026a290300370300200541a8016a41106a220920054190026a290300370300200541a8016a41186a220720054198026a290300370300200541386a41086a220a200541b8026a290300370300200541386a41106a2203200541c0026a2802003602002005200541e8016a41186a2903003703a8012005200541b0026a29030037033820052802ec012115024020052802e8014101460d00200541e8016a41086a2802002110200541f4016a280200210f200541e8016a41106a290300210e200541a0026a280200210d200541a4026a280200210c200541a8026a290300210b200541186a41186a2007290300370300200541186a41106a2009290300370300200541186a41086a2002290300370300200541086a200a290300370300200541106a2003280200360200200520052903a801370318200520052903383703000c1f0b200041013602000c1a0b024020042802002202450d00200441046a280200450d00200210300b2004200b3702042004200c36020041002111200541c8026a41386a4100360200200541fc026a200d360200200541c8026a410c6a200e370200200541c8026a41086a200f360200200541f4026a200641186a290200370200200541ec026a200641106a290200370200200541e4026a200641086a290200370200200541dc026a2006290200370200200520103602cc02200541043602c80220054188016a41086a200341086a2802003602002005200329020037038801200541e8016a2001200541c8026a20054188016a10b204200541a8016a41086a220220054188026a290300370300200541a8016a41106a220920054190026a290300370300200541a8016a41186a220720054198026a290300370300200541386a41086a220a200541b8026a290300370300200541386a41106a2203200541c0026a2802003602002005200541e8016a41186a2903003703a8012005200541b0026a29030037033820052802ec012115024020052802e8014101460d00200541e8016a41086a2802002110200541e8016a410c6a280200210f200541e8016a41106a290300210e200541e8016a41386a280200210d200541a4026a280200210c200541a8026a290300210b200541186a41186a2007290300370300200541186a41106a2009290300370300200541186a41086a2002290300370300200541086a200a290300370300200541106a2003280200360200200520052903a801370318200520052903383703000c1e0b200041013602000c190b410121112009410176220220074f0d102010200a20026a2d00002202410f71200241047620094101711b220741246c6a22022d00002109200241023a000041032115024020094102470d000c1d0b200541c7016a220a200241206a280000360000200541c0016a2206200241196a290000370300200541b8016a2211200241116a290000370300200541a8016a41086a2208200241096a290000370300200520022900013703a801200541d8016a41086a200341086a221928020022183602002019201841016a360200200520032902003703d801200541e8016a41196a2006290300370000200541e8016a41206a200a280000360000200520093a00e801200541e8016a41096a2008290300370000200541e8016a41116a2011290300370000200520052903a8013700e901200541c8026a2001200541e8016a2003200410b00420052802cc02210920052802c8024101460d0d200541c8026a41086a2d0000220a41ff01714102470d11200541c8026a410c6a200e370200200541c8026a41086a200f360200200520103602cc02200541033602c802200541f0006a41086a200541d8016a41086a280200360200200520052903d801370370200541e8016a2001200541c8026a200541f0006a10b204200541386a41086a220220054188026a290300370300200541386a41106a220920054190026a290300370300200541386a41186a220720054198026a29030037030020054188016a41086a220a200541b8026a29030037030020054188016a41106a2203200541c0026a2802003602002005200541e8016a41186a2903003703382005200541b0026a2903003703880120052802ec01211520052802e8014101460d08200541e8016a41086a2802002110200541e8016a410c6a280200210f200541e8016a41106a290300210e200541a0026a280200210d200541a4026a280200210c200541a8026a290300210b200541186a41186a2007290300370300200541186a41106a2009290300370300200541186a41086a2002290300370300200541086a200a290300370300200541106a20032802003602002005200529033837031820052005290388013703000c040b200541a8016a41086a200e370300200541a8016a41106a2006290200370300200541a8016a41186a200641086a290200370300200541c8016a200641106a290200370300200541d0016a200641186a290200370300200520103602a8012005200f3602ac01200e422088a7211202400240200f4125490d0020052802b8012118201221130c010b200541b1016a2113200f21180b410021020240200820096b2216201841017420106b2217201720164b1b2214450d000340201020026a2211410176221520184f0d13200920026a2219410176220820074f0d14201320156a2d00002215410f71201541f0017141047620114101711b200a20086a2d00002215410f71201541047620194101711b470d012014200241016a2202470d000b201421020b02400240024020022017470d0020172016460d010b200220174f0d01200541186a41186a200641186a290200370300200541186a41106a200641106a290200370300200541186a41086a200641086a2902003703002005200629020037031841042115410121110c1d0b200c450d09024020042802002202450d00200441046a280200450d00200210300b2004200b3702042004200c360200200541f4026a200541a8016a41286a290300370200200541ec026a200541a8016a41206a290300370200200541e4026a200541a8016a41186a290300370200200541dc026a200541a8016a41106a290300370200200541c8026a410c6a200541a8016a41086a29030037020041002111200541c8026a41386a4100360200200541fc026a200d360200200520052903a8013702cc02200541043602c802200541386a41086a200341086a28020036020020052003290200370338200541e8016a2001200541c8026a200541386a10b20420052802ec01211520052802e8014101460d07200541186a41086a200541e8016a41206a290300370300200541186a41106a200541e8016a41286a290300370300200541186a41186a20054198026a290300370300200541086a200541b8026a290300370300200541106a200541c0026a2802003602002005200541e8016a41186a2903003703182005200541b0026a290300370300200541e8016a41086a2802002110200541e8016a410c6a280200210f200541e8016a41106a290300210e200541e8016a41386a280200210d200541a4026a280200210c200541a8026a290300210b0c1c0b200920026a2211410176220920074f0d1341042115200d200a20096a2d00002209410f71200941047620114101711b220a41246c6a22092d00002107200941023a0000024020074102470d00200541186a41186a200641186a290200370300200541186a41106a200641106a290200370300200541186a41086a200641086a29020037030020052006290200370318410121110c1c0b200541d7006a2215200941206a280000360000200541d0006a2211200941196a290000370300200541c8006a2208200941116a290000370300200541386a41086a2219200941096a29000037030020052009290001370338200541e0006a41086a200341086a221828020022133602002018200220136a41016a36020020052003290200370360200541e8016a41196a2011290300370000200541e8016a41206a2015280000360000200520073a00e801200541e8016a41096a2019290300370000200541e8016a41116a2008290300370000200520052903383700e901200541c8026a2001200541e8016a2003200410b00420052802cc02210220052802c80222154101460d05200541c8026a41086a2d0000220741ff01714102470d14200541f4026a200541a8016a41286a290300370200200541ec026a200541a8016a41206a290300370200200541e4026a200541a8016a41186a290300370200200541dc026a200541a8016a41106a290300370200200541c8026a410c6a200541a8016a41086a290300370200200541c8026a413c6a200b370200200541c8026a41386a200c360200200541fc026a200d360200200520052903a8013702cc02200541043602c802200541d8016a41086a200541e0006a41086a280200360200200520052903603703d801200541e8016a2001200541c8026a200541d8016a10b20420054188016a41086a2202200541e8016a41206a29030037030020054188016a41106a2209200541e8016a41286a29030037030020054188016a41186a220720054198026a290300370300200541f0006a41086a220a200541b8026a290300370300200541f0006a41106a2203200541c0026a2802003602002005200541e8016a41186a290300370388012005200541b0026a29030037037020052802ec01211520052802e8014101460d0b200541e8016a41086a2802002110200541e8016a410c6a280200210f200541e8016a41106a290300210e200541e8016a41386a280200210d200541e8016a413c6a280200210c200541a8026a290300210b200541186a41186a2007290300370300200541186a41106a2009290300370300200541186a41086a2002290300370300200541086a200a290300370300200541106a20032802003602002005200529038801370318200520052903703703000c030b200541e8016a41086a200e370300200541e8016a41106a2006290200370300200541e8016a41186a200641086a29020037030020054188026a200641106a29020037030020054190026a200641186a290200370300200520103602e8012005200f3602ec01200e422088a7211702400240200f4125490d0020052802f8012118201721140c010b200541f1016a2114200f21180b201841017420106b200820096b2213470d18410021022013450d170340201020026a2203410176221520184f0d15200920026a2219410176220820074f0d16201420156a2d00002215410f71201541f0017141047620034101711b200a20086a2d00002215410f71201541047620194101711b470d182013200241016a2202470d000c1a0b0b200541186a41186a200641186a290200370300200541186a41106a200641106a290200370300200541186a41086a200641086a290200370300200541086a200241086a290200370300200541106a200241106a280200360200200520062902003703182005200229020037030041022115410121110c190b200541f4026a200541a8016a41286a290300370200200541ec026a200541a8016a41206a290300370200200541e4026a200541a8016a41186a290300370200200541dc026a200541a8016a41106a290300370200200541c8026a410c6a200541a8016a41086a290300370200200541c8026a41386a200c360200200541fc026a4100360200200520052903a8013702cc02200541023602c802200541f0006a41086a200541d8016a41086a280200360200200520052903d801370370200541e8016a2001200541c8026a200541f0006a10b204200541386a41086a2202200541e8016a41206a290300370300200541386a41106a2209200541e8016a41286a290300370300200541386a41186a220720054198026a29030037030020054188016a41086a220a200541b8026a29030037030020054188016a41106a2203200541c0026a2802003602002005200541e8016a41186a2903003703382005200541b0026a2903003703880120052802ec01211520052802e8014101460d01200541e8016a41086a2802002110200541e8016a410c6a280200210f200541e8016a41106a290300210e200541e8016a41386a280200210d200541a4026a280200210c200541a8026a290300210b200541186a41186a2007290300370300200541186a41106a2009290300370300200541186a41086a2002290300370300200541086a200a290300370300200541106a20032802003602002005200529033837031820052005290388013703000b410021110c170b200041013602000c120b2000410136020020002002360204024020154101470d00200c450d00200ba7450d00200c10300b200d1030200f4125490d16201210300c160b200041013602000c100b200041013602000c0f0b200541186a41186a200641186a290200370300200541186a41106a200641106a290200370300200541186a41086a200641086a290200370300200520062902003703184100210c41042115410121110c120b0240200f4125490d00201210300b410221110c110b200041013602002000200c360204200f4125490d11201210300c110b200041013602000c0b0b20004101360200200020093602040240200f450d00200ea7450d00200f10300b201010300c0f0b2011201341e098c2001033000b2019200741e098c2001033000b2002200741e098c2001033000b200241003a00002010200741246c6a41046a2009360200200a417f7341017121110c0a0b2015201841e098c2001033000b2008200741e098c2001033000b2009200741e098c2001033000b200941003a0000200541186a41086a200641086a290200370300200541186a41106a200641106a290200370300200541186a41186a200641186a29020037030041042115200d200a41246c6a41046a2002360200200520062902003703182007417f7341017121110c060b2015201841e098c2001033000b2008200741e098c2001033000b200020153602040c040b20022013460d010b200541186a41186a200641186a290200370300200541186a41106a200641106a290200370300200541186a41086a200641086a29020037030020052006290200370318200b42ffffffff0f83210b41012115410121110c010b200ba72102024020042802002215450d00200441046a280200450d00201510300b2004200c3602042004200d360200200441086a20023602000240200f4125490d00201710300b410121150b20002011360204200041146a200e370200200041106a200f3602002000410c6a2010360200200041086a20153602002000411c6a2005290318370200200041c4006a200b370200200041c0006a200c3602002000413c6a200d360200200041cc006a2005290300370200200041246a200541186a41086a2903003702002000412c6a200541186a41106a290300370200200041346a200541306a290300370200200041d4006a200541086a290300370200200041dc006a200541106a280200360200200041003602000b200541a0036a24000bde4903037f017e107f230041c0056b220424000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002280200417e6a0e03020001030b20022802042205415c6a21062002410c6a2902002107200241086a2802002108417f2109024003402009410f460d01200941016a2109200641246a22062d00004102460d000b4110200941016a20094110491b20096b210a200641246a210b02400340200a417f6a220a450d01200b2d0000210c200b41246a210b200c4102460d000c230b0b20080d21200420093a00c004200441c0036a410472200441c0046a410110ab04200441013602c00320062d00002109200641023a000020094102460d04200441f4046a20093a0000200441cc046a200441c0036a41086a290300370200200441d4046a200441d0036a290300370200200441dc046a200441d8036a290300370200200441e4046a200441c0036a41206a290300370200200441ec046a200441e8036a290300370200200441fd046a200641096a29000037000020044185056a200641116a2900003700002004418d056a200641196a29000037000020044194056a200641206a280000360000200441023602c004200420042903c0033702c4042004200641016a2900003700f50420044188016a41086a200341086a280200360200200420032902003703880120002001200441c0046a20044188016a10b2040c1f0b2008450d1f200441c4046a41bc8ec200410010ab042000413c6a2007370200200041386a20083602002000428080808010370200200041106a200441c0046a41086a290200370200200041186a200441c0046a41106a290200370200200041206a200441c0046a41186a290200370200200041286a200441c0046a41206a290200370200200041306a200441c0046a41286a290200370200200441003602c004200041086a20042902c0043702000c1e0b200441b0036a41026a2002410f6a2d00003a0000200441d8006a41086a200241206a290200370300200441d8006a41106a200241286a290200370300200441d8006a41186a200241306a280200360200200420022f000d3b01b0032004200241186a22052902003703582002410d6a210d2002413c6a2902002107200241386a280200210e200241346a280200210a200241146a280200210f200241106a28020021102002410c6a2d00002111200241086a28020021122002280204211341002109417f210602400340200941c004460d01200641016a2106200a20096a210b200941246a220c2109200b2d00004102460d000b4110200641016a20064110491b20066b210b200a200c6a210902400340200b417f6a220b450d0120092d00002108200941246a210920084102460d000c1f0b0b200e0d1d200a200c6a2209415c6a220b2d00002108200b41023a000020084102460d04200941606a2802002105200441386a41026a2009415d6a220b41026a2d00003a0000200441086a41086a200941646a220941086a290200370300200441086a41106a200941106a290200370300200441086a41186a200941186a2802003602002004200b2f00003b0138200420092902003703082003280208210c200f210b0240201241254f0d002012210b0b2003280204210920032802002103200c200b41017420136b6a220c410176210b02400240200c410171220d0d002009200b4f0d01200b200941a099c2001042000b2009200b490d06200b20094f0d072003200b6a22092d00002114200441003a00c404200441003602c004200441c0046a2003200910bc02024002400240024020042802c00422094125490d00200441c0046a410c6a220c280200220e2009460d01200441c8046a28020021150c170b4124210e20094124460d01200441c0046a4105722115200441c0046a210c2009210e0c160b200441c0046a410c6a280200210c2009210e0c010b2009210c0b200e200c470d1202400240200c41016a220e200c490d004100417f200e417f6a6776200e4102491b220e41016a220c200e490d000240024020094125490d00200441cc046a280200210e200441c8046a2802002115200921160c010b200441c0046a4105722115412421162009210e0b200e200c4b0d0a200c41244b0d01200941244d0d14200441003a00c404200441c0046a4105722015200e1085051a2004200e3602c004201510300c140b41d099c200411141e499c200102d000b2016200c470d110c120b2006410474210e4102210c0c130b200e450d1b20004101360204200041106a20113a00002000410c6a2012360200200041086a20133602002000200d2f00003b0011200041186a200f360200200041146a20103602002000411c6a2005290200370200200041386a200e3602002000413c6a2007370200200041136a200d41026a2d00003a0000200041246a200541086a2902003702002000412c6a200541106a290200370200200041346a200541186a280200360200200041003602000c1a0b200441306a2002412c6a290200370300200441286a200241246a290200370300200441086a41186a2002411c6a290200370300200441086a41106a2206200241146a290200370300200441086a41086a2002410c6a29020037030020042002290204370308200441d6006a200241376a2d00003a0000200441386a41086a200241c4006a290200370300200441386a41106a200241cc006a290200370300200441386a41186a200241d4006a2802003602002004200241356a2f00003b015420042002413c6a29020037033802400240200428020c22094125490d00200628020021060c010b200921060b2006417f6a21060240024020094125490d00200441186a280200210b200441146a280200210a0c010b200441116a210a2009210b0b200b20064d0d06200241346a210b200241386a210c200a20066a2d0000210620032802082108024020094125490d00200441186a28020021090b200b2d00002105200c280200210a2006410f71210d2003280204210b2003280200210c200820094101742004280208417f736a6a2209410176210602400240200941017122080d00200b20064f0d012006200b41a099c2001042000b200b2006490d082006200b4f0d09200c20066a22092d00002112200441003a00c404200441003602c004200441c0046a200c200910bc02024002400240024020042802c00422094125490d00200441c0046a410c6a220b280200220e2009460d01200441c8046a28020021130c110b4124210e20094124460d01200441c0046a4105722113200441c0046a210b2009210e0c100b200441c0046a410c6a280200210b2009210e0c010b2009210b0b200e200b470d0c02400240200b41016a220e200b490d004100417f200e417f6a6776200e4102491b220e41016a220b200e490d000240024020094125490d00200441cc046a280200210e200441c8046a28020021132009210f0c010b200441c0046a41057221134124210f2009210e0b200e200b4b0d0c200b41244b0d01200941244d0d0e200441003a00c404200441c0046a4105722013200e1085051a2004200e3602c004201310300c0e0b41d099c200411141e499c200102d000b200f200b470d0b0c0c0b200d410474210d4102210b0c0d0b200041046a200241d8001085051a200041003602000c1f0b41c8f1c100412441ecf1c1001050000b41c8f1c1004124418cf2c1001050000b200b200941b099c2001042000b200b200941c099c2001033000b41c29ac200412041e49ac200102d000b2006200b41acf2c1001033000b2006200b41b099c2001042000b2006200b41c099c2001033000b41c29ac200412041e49ac200102d000b200b102f211002400240200941244b0d002010450d0c20102013200e1085051a0c010b2010450d0b20102013200b200f200f200b4b1b1085051a201310300b200441cc046a200e360200200441c8046a2010360200200441013a00c4042004200b3602c0040b200441cc046a220b280200210e200441c8046a28020021130b2013200e6a2012417071200d723a0000200b200b28020041016a360200200441c8036a200441cd046a290000370300200441d0036a200441d5046a290000370300200441d8036a200441dd046a290000370300200441df036a200441e4046a290000370000200420042900c5043703c00320042d00c404210b20042802c00421090b200441e5006a200441c8036a290300370000200441ed006a200441d0036a290300370000200441f5006a200441d8036a290300370000200441fc006a200441df036a29000037000020042009360258200420042903c00337005d2004200b3a005c02400240200b41ff01714102470d004100210b0c010b024020094125490d00200441e4006a2802002109200441e0006a280200210b0c010b200441d8006a410572210b0b20092006200b1b210e20084101732108200b200c200b1b2106024002400240024002402005410171450d00200441cf046a200441c0006a290300370000200441d7046a200441c8006a290300370000200441df046a200441d0006a2d00003a0000200420042f01543b01c0042004200a3600c304200420042903383700c7042004200441d4006a41026a2d00003a00c204200441c9036a200d3a0000200420083a00c8032004200e3602c403200420063602c0032001200441c0046a200441c0036a10a9042207422088a721092007a70d010240200141c8006a2205280200220b200b417f6a220c200141c0006a220a280200220b2001413c6a22122802006b716b4101470d00201210b2012005280200417f6a210c200a280200210b0b200a200c200b41016a71360200200141c4006a280200200b4102746a2009360200200141386a280200220b20094d0d032001280230200941fc006c6a220b2d0000210920044188016a200b41016a41fb001085051a200b41046a4100360200200b41003a00000c040b0240200141c8006a220528020022092009417f6a220b200141c0006a220c28020022092001413c6a22122802006b716b4101470d00201210b2012005280200417f6a210b200c28020021090b200c200b200941016a71360200200141c4006a28020020094102746a200a360200200141386a2802002209200a4d0d012001280230200a41fc006c6a220b2d0000210920044188016a200b41016a41fb001085051a200b41046a4100360200200b41003a00000c030b2000410136020020002009360204024020042d005c4102460d0020042802584125490d00200441e0006a28020010300b200428020c4125490d07200441146a28020010300c070b200a200941acf0c1001033000b2009200b41acf0c1001033000b02400240200941ff01714101470d00200441c0046a200441ab016a41d8001085051a200441c0036a41186a20044188016a41186a290000370300200441c0036a41106a20044188016a41106a290000370300200441c0036a41086a20044188016a41086a29000037030020042004290088013703c0030c010b200441c0046a2004418b016a41d8001085051a0b20044188026a200441c0046a41d8001085051a200441e0026a41186a200441c0036a41186a220b290300370300200441e0026a41106a200441c0036a41106a220a290300370300200441e0026a41086a200441c0036a41086a220c290300370300200420042903c0033703e0020240024002400240200428028802417f6a0e020100020b20044180036a41286a200441b4026a29020037030020044180036a41206a200441ac026a29020037030020044180036a41186a200441a4026a29020037030020044180036a41106a2004419c026a29020037030020044180036a41086a20044194026a2902003703002004200429028c02370380030240200941ff01714101470d00200441c0046a41186a200441e0026a41186a290300370300200441c0046a41106a200441e0026a41106a290300370300200441c0046a41086a200441e0026a41086a290300370300200420042903e0023703c004200441003a00c403200441003602c003200441c0036a20062006200e6a10bc022004418d056a200d3a00002004418c056a20083a000020044188056a200441c0036a41286a28020036020020044180056a200441c0036a41206a290300370300200441f8046a200441c0036a41186a290300370300200441f0046a200441c0036a41106a290300370300200441c0046a41286a200441c0036a41086a290300370300200420042903c0033703e0042001200441c0046a10ac040b200441bc026a2109200441c0036a41286a200441086a41286a290300370300200441c0036a41206a200441086a41206a290300370300200441c0036a41186a200441086a41186a290300370300200441c0036a41106a200441086a41106a290300370300200441c0036a41086a200441086a41086a290300370300200420042903083703c003200428028003210b0240024020042802840322064125490d0020044180036a41106a28020021062004418c036a280200210a0c010b20044189036a210a0b200441c0046a41086a20063602002004200a3602c4042004200b3602c004200441c0036a200441c0046a10b304200441ec046a200441e8036a290300370200200441e4046a200441c0036a41206a290300370200200441dc046a200441c0036a41186a290300370200200441d4046a200441c0036a41106a290300370200200441c0046a410c6a200441c0036a41086a290300370200200441f4046a2009290200370200200441fc046a200941086a29020037020020044184056a200941106a2902003702002004418c056a200941186a29020037020020044194056a200941206a280200360200200420042903c0033702c404200441023602c004200441b0036a41086a200341086a280200360200200420032902003703b00320002001200441c0046a200441b0036a10b2042004280284034125490d0220044180036a410c6a28020010300c020b200441c0036a41286a200441b4026a290200370300200441c0036a41206a200441ac026a290200370300200b200441a4026a290200370300200a2004419c026a290200370300200c20044194026a2902003703002004200429028c023703c0030240200941ff01714101470d00200441c0046a41186a200441e0026a41186a290300370300200441c0046a41106a200441e0026a41106a290300370300200441c0046a41086a200441e0026a41086a290300370300200420042903e0023703c004200441003a008403200441003602800320044180036a20062006200e6a10bc022004418d056a200d3a00002004418c056a20083a000020044188056a20044180036a41286a28020036020020044180056a20044180036a41206a290300370300200441f8046a20044180036a41186a290300370300200441f0046a20044180036a41106a290300370300200441c0046a41286a20044180036a41086a29030037030020042004290380033703e0042001200441c0046a10ac040b200441bc026a2109200441c0046a41286a200441086a41286a290300370300200441c0046a41206a200441086a41206a290300370300200441c0046a41186a200441086a41186a290300370300200441c0046a41106a200441086a41106a290300370300200441c0046a41086a200441086a41086a290300370300200420042903083703c00420042802c003210b0240024020042802c40322064125490d00200441c0036a41106a2802002106200441cc036a280200210a0c010b200441c9036a210a0b20044180036a41086a20063602002004200a360284032004200b36028003200441c0046a20044180036a10b304200041306a200441c0046a41286a290300370200200041286a200441c0046a41206a290300370200200041206a200441c0046a41186a290300370200200041186a200441c0046a41106a290300370200200041106a200441c0046a41086a290300370200200041086a20042903c0043702002000428080808010370200200041386a2009290200370200200041c0006a200941086a28020036020020042802c4034125490d01200441cc036a28020010300c010b4101210602400240200941ff01714101460d00200441c3036a20044188026a41d8001085051a410021060c010b200441c0036a41186a200441e0026a41186a290300370300200441c0036a41106a200441e0026a41106a290300370300200441c0036a41086a200441e0026a41086a290300370300200420042903e0023703c003200441e3036a20044188026a41d8001085051a0b200420063a00c004200441c0046a410172200441c0036a41fb001085051a200141306a200441c0046a10b30121092000428080808020370200200041086a2004290308370200200041106a200441086a41086a290300370200200041186a200441086a41106a290300370200200041206a200441086a41186a290300370200200041286a200441086a41206a290300370200200041306a200441086a41286a2903003702002000413c6a2009360200200041386a41003a00000b20042d005c4102460d1120042802584125490d11200441e0006a28020010300c110b200c102f211702400240200941244b0d002017450d0820172015200e1085051a0c010b2017450d0720172015200c20162016200c4b1b1085051a201510300b200441cc046a200e360200200441c8046a2017360200200441013a00c4042004200c3602c0040b200441cc046a220c280200210e200441c8046a28020021150b2015200e6a20144170712006723a0000200c200c28020041016a360200200441c8036a200441cd046a290000370300200441d0036a200441d5046a290000370300200441d8036a200441dd046a290000370300200441df036a200441e4046a290000370000200420042900c5043703c00320042d00c404210c20042802c00421090b2004418d036a200441c8036a29030037000020044195036a200441d0036a2903003700002004419d036a200441d8036a290300370000200441a4036a200441df036a2900003700002004200936028003200420042903c003370085032004200c3a00840302400240200c41ff01714102470d004100210c0c010b024020094125490d002004418c036a280200210920044188036a280200210c0c010b20044180036a410572210c0b2009200b200c1b2114200d410173210d200c2003200c1b210902400240024020084101470d00200441cf036a200441106a290300370000200441d7036a200441186a290300370000200441df036a200441206a2d00003a0000200420042f01383b01c003200420053600c303200420042903083700c7032004200441386a41026a2d00003a00c20320044191016a200e3a00002004200d3a0090012004201436028c0120042009360288012001200441c0036a20044188016a10a9042207422088a7210b2007a70d020240200141c8006a2205280200220c200c417f6a2203200141c0006a2208280200220c2001413c6a22152802006b716b4101470d00201510b2012005280200417f6a21032008280200210c0b20082003200c41016a71360200200141c4006a280200200c4102746a200b360200200141386a280200220c200b4d0d082001280230200b41fc006c6a220b2d0000210c200441c0046a200b41016a41fb001085051a200b41046a4100360200200b41003a00000c010b0240200141c8006a2203280200220b200b417f6a2208200141c0006a220c280200220b2001413c6a22152802006b716b4101470d00201510b2012003280200417f6a2108200c280200210b0b200c2008200b41016a71360200200141c4006a280200200b4102746a2005360200200141386a280200220b20054d0d062001280230200541fc006c6a220b2d0000210c200441c0046a200b41016a41fb001085051a200b41046a4100360200200b41003a00000b200c41ff01714101470d02200441c0036a41186a200441c0046a41186a290000370300200441c0036a41106a200441c0046a41106a290000370300200441c0036a41086a200441c0046a41086a290000370300200420042900c0043703c003200441003a008c01200441003602880120044188016a2009200920146a10bc022004418d046a200e3a00002004418c046a200d3a000020044188046a20044188016a41286a28020036020020044180046a200441a8016a290300370300200441f8036a20044188016a41186a290300370300200441f0036a20044188016a41106a290300370300200441c0036a41286a20044188016a41086a29030037030020042004290388013703e0032001200441c0036a10ac04200441c0036a200441e3046a41d8001085051a0c030b200041013602002000200b360204024020042d0084034102460d002004280280034125490d0020044188036a28020010300b200a103020124125490d00201010300b2002280200417e6a4103490d0d200210be010c0d0b200441c0036a200441c3046a41d8001085051a0b02400240024020042802c003417f6a0e0401000002000b41d8a5c2004128419cf2c100102d000b200441b0026a200441c0036a412c6a290200370300200441a8026a200441c0036a41246a29020037030020044188026a41186a200441c0036a411c6a29020037030020044188026a41106a220c200441c0036a41146a29020037030020044188026a41086a200441c0036a410c6a290200370300200420042902c4033703880220044188016a41086a20113a000020044188016a41096a20042f01b0033b000020044193016a200441b2036a2d00003a000020044188016a41106a200f36020020044188016a410c6a20103602002004201236028c01200420133602880120044188016a41146a200429035837020020044188016a411c6a200441d8006a41086a29030037020020044188016a41246a200441d8006a41106a29030037020020044188016a412c6a200441d8006a41186a280200360200200441e0026a41086a4101360200200441013602e002200420063a00542004200441d4006a3602e40220044188016a200441e0026a10b304200441f4036a2109200428028802210b02400240200428028c0222064125490d00200c280200210620044188026a410c6a280200210c0c010b20044188026a41096a210c0b200441e0026a41086a20063602002004200c3602e4022004200b3602e00220044188016a200441e0026a10b304200041306a20044188016a41286a290300370200200041286a20044188016a41206a290300370200200041206a20044188016a41186a290300370200200041186a20044188016a41106a290300370200200041106a20044188016a41086a290300370200200041086a2004290388013702002000428080808010370200200041386a2009290200370200200041c0006a200941086a280200360200200428028c024125490d0420044194026a28020010300c040b200441b0026a200441c0036a412c6a290200370300200441a8026a200441c0036a41246a29020037030020044188026a41186a200441c0036a411c6a29020037030020044188026a41106a2208200441c0036a41146a29020037030020044188026a41086a200441c0036a410c6a290200370300200420042902c40337038802200441f4036a280200210b20044188016a41086a20113a000020044188016a41106a200f36020020044188016a410c6a20103602002004201236028c01200420133602880120044188016a41096a20042f01b0033b000020044193016a200441b2036a2d00003a000020044188016a41146a200429035837020020044188016a411c6a200441d8006a41086a29030037020020044188016a41246a200441d8006a41106a29030037020020044188016a412c6a200441d8006a41186a280200360200200441e0026a41086a4101360200200441013602e002200420063a00542004200441d4006a3602e40220044188016a200441e0026a10b304200441f8036a2109200428028802210c02400240200428028c0222064125490d002008280200210620044188026a410c6a28020021080c010b20044188026a41096a21080b200441e0026a41086a2006360200200420083602e4022004200c3602e00220044188016a200441e0026a10b304200041306a20044188016a41286a290300370200200041286a20044188016a41206a290300370200200041206a20044188016a41186a290300370200200041186a20044188016a41106a290300370200200041106a20044188016a41086a290300370200200041086a200429038801370200200041386a200b360200200041043602042000413c6a2009290200370200200041c4006a200941086a28020036020020004100360200200428028c024125490d0320044194026a28020010300c030b102a000b2005200b41acf0c1001033000b200b200c41acf0c1001033000b20042d0084034102460d002004280280034125490d0020044188036a2802001030200a10300c060b200a10300c050b4188f1c100412f41fcf1c100102d000b20004104360204200041106a20113a00002000410c6a2012360200200041086a20133602002000200d2f00003b0011200041186a200f360200200041146a20103602002000411c6a2005290200370200200041386a200a3602002000413c6a200e360200200041c0006a2007370200200041136a200d41026a2d00003a0000200041246a200541086a2902003702002000412c6a200541106a290200370200200041346a200541186a280200360200200041003602000c030b200510300c020b4188f1c100412f41b8f1c100102d000b2000428080808030370200200041106a20073702002000410c6a2008360200200041086a20053602000b2002280200417e6a4103490d00200210be010b200441c0056a24000bd003010a7f230041106b2202240020002001280200220320002802006a41017110f9040240024002400240024020030d00200141086a2802002104410021030c010b02400240200028020422034125490d00200041106a28020021050c010b200321050b200141086a2802002204450d012005417f6a21050240024020034125490d00200041106a28020021032000410c6a28020021060c010b200041096a21060b200320054d0d02200620056a220320032d000020012802042d0000410f71723a0000410121030b0240200320044f0d00200420036b2107200041106a2108200041096a2109200041046a210a200128020420036a2104034002400240200a28020022054125490d0020002802102101200028020c2106200821030c010b20052101200a210320092106412421050b20042d0000210b024020012005470d002002200a410110bd02024020022802004101470d00200241086a2802000d0641d099c200411141e499c200102d000b20002802102101200028020c2106200821030b200620016a200b3a00002003200328020041016a360200200441016a21042007417f6a22070d000b0b200241106a24000f0b4100410041dc9ec2001033000b2005200341cc9ec2001033000b102a000bf20201047f02402001450d0020002001412c6c6a2103034002400240200022042802004101470d002004280204210120042802082205200210a80320022001200510640c010b2004280204210120042802082205200210a80320022001200510640b02400240200428020c4101470d002004280210210120042802182205200210a80320012005200210b5040c010b20042802102101200441146a2802002205200210a80320012005200210b5040b2004412c6a210002400240200428021c4101470d002004280220210120042802282204200210a80320044103742204450d01200120046a2106034020012802002104200141046a2802002205200210a8032002200420051064200141086a22012006470d000c020b0b2004280220210120042802242204200210a80320044103742204450d00200120046a2106034020012802002104200141046a2802002205200210a8032002200420051064200141086a22012006470d000b0b20002003470d000b0b0bd00101027f02402001450d002000200141186c6a210103400240024020002802004101470d00200041046a2802002103200041086a2802002204200210a80320022003200410640c010b200041046a2802002103200041086a2802002204200210a80320022003200410640b024002402000410c6a2802004101470d00200041106a2802002103200041146a2802002204200210a80320022003200410640c010b200041106a2802002103200041146a2802002204200210a80320022003200410640b200041186a22002001470d000b0b0b8a0801057f230041106b2203240002402001450d002000200141d8006c6a2104034002400240200022052802004101470d002005280204210120052802082206200210a80320022001200610640c010b2005280204210120052802082206200210a80320022001200610640b0240024020052d00544101460d00200341003a000f20022003410f6a410110640c010b200341013a000f20022003410f6a410110640b024002400240024020052d000c0e03000102030b200341003a000f20022003410f6a41011064024020052802104101470d002005280214210120052802182206200210a80320022001200610640c030b2005280214210120052802182206200210a80320022001200610640c020b200341013a000f20022003410f6a410110642005410d6a2d0000200210ba040240024020052802104101470d002005280214210120052802182206200210a80320022001200610640c010b2005280214210120052802182206200210a80320022001200610640b02400240200528021c4101470d002005280220210120052802242206200210a80320022001200610640c010b2005280220210120052802242206200210a80320022001200610640b200320052d000e3a000f20022003410f6a410110640c010b200341023a000f20022003410f6a410110642005410d6a2d0000200210ba040240024020052802104101470d002005280214210120052802182206200210a80320022001200610640c010b2005280214210120052802182206200210a80320022001200610640b02400240200528021c4101470d002005280220210120052802242206200210a80320022001200610640c010b2005280220210120052802242206200210a80320022001200610640b0240024020052802284101470d00200528022c210120052802302206200210a80320022001200610640c010b200528022c210120052802302206200210a80320022001200610640b20052d000e200210ba040b0240024020052802344101470d002005280238210120052802402206200210a80320022001200610640c010b20032005280238200528023c28020c1105002003280200210120032802082206200210a80320022001200610642003280204450d00200110300b200541d8006a21000240024020052802444101470d002005280248210120052802502205200210a80320054103742205450d01200120056a2107034020012802002105200141046a2802002206200210a8032002200520061064200141086a22012007470d000c020b0b20052802482101200528024c2205200210a80320054103742205450d00200120056a2107034020012802002105200141046a2802002206200210a8032002200520061064200141086a22012007470d000b0b20002004470d000b0b200341106a24000bd90301057f02402001450d0020002001412c6c6a2103034002400240200022042802004101470d002004280204210120042802082205200210a80320022001200510640c010b2004280204210120042802082205200210a80320022001200510640b02400240200428020c4101470d002004280210210120042802182205200210a80320054103742205450d01200120056a2106034020012802002105200141046a2802002207200210a8032002200520071064200141086a22012006470d000c020b0b2004280210210120042802142205200210a80320054103742205450d00200120056a2106034020012802002105200141046a2802002207200210a8032002200520071064200141086a22012006470d000b0b2004412c6a210002400240200428021c4101470d002004280220210120042802282205200210a80320054103742205450d01200120056a2106034020012802002105200141046a2802002207200210a8032002200520071064200141086a22012006470d000c020b0b2004280220210120042802242205200210a80320054103742205450d00200120056a2106034020012802002105200141046a2802002207200210a8032002200520071064200141086a22012006470d000b0b20002003470d000b0b0be30301057f230041106b2203240002402001450d002000200141386c6a2104034002400240200022052802004101470d002005280204210120052802082206200210a80320022001200610640c010b2005280204210120052802082206200210a80320022001200610640b02400240200528020c4101470d002005280210210120052802142206200210a80320022001200610640c010b2005280210210120052802142206200210a80320022001200610640b0240024020052802184101470d00200528021c210120052802242206200210a80320022001200610640c010b2003200528021c200528022028020c1105002003280200210120032802082206200210a80320022001200610642003280204450d00200110300b200541386a21000240024020052802284101470d00200528022c210120052802342205200210a80320054103742205450d01200120056a2107034020012802002105200141046a2802002206200210a8032002200520061064200141086a22012007470d000c020b0b200528022c210120052802302205200210a80320054103742205450d00200120056a2107034020012802002105200141046a2802002206200210a8032002200520061064200141086a22012007470d000b0b20002004470d000b0b200341106a24000ba50201047f02402001450d0020002001411c6c6a2103034002400240200022042802004101470d002004280204210120042802082205200210a80320022001200510640c010b2004280204210120042802082205200210a80320022001200510640b2004411c6a210002400240200428020c4101470d002004280210210120042802182204200210a80320044103742204450d01200120046a2106034020012802002104200141046a2802002205200210a8032002200420051064200141086a22012006470d000c020b0b2004280210210120042802142204200210a80320044103742204450d00200120046a2106034020012802002104200141046a2802002205200210a8032002200420051064200141086a22012006470d000b0b20002003470d000b0b0bc60101017f230041106b2202240002400240024002400240024002400240200041ff01710e0700010203040506070b200241003a000f20012002410f6a410110640c060b200241013a000f20012002410f6a410110640c050b200241023a000f20012002410f6a410110640c040b200241033a000f20012002410f6a410110640c030b200241043a000f20012002410f6a410110640c020b200241053a000f20012002410f6a410110640c010b200241063a000f20012002410f6a410110640b200241106a24000b1c0020012802184199f7c100410f2001411c6a28020028020c1100000b040041000b02000b02000b1c002001280218418bf6c10041052001411c6a28020028020c1100000b800201047f230041206b2202240002400240200041046a280200200041086a2802002203460d00200028020021040c010b0240200341016a22042003490d00200341017422052004200520044b1b22044108200441084b1b21040240024020030d00200241003602100c010b200241106a41086a410136020020022003360214200220002802003602100b200220044101200241106a1069200241086a2802002103024020022802004101460d00200020022802042204360200200041046a2003360200200041086a28020021030c020b2003450d00102a000b102c000b200420036a20013a0000200041086a2200200028020041016a360200200241206a24000b970101037f23004180016b2202240020002802002d00002103410021000340200220006a41ff006a2003410f712204413072200441d7006a2004410a491b3a00002000417f6a21002003410476410f7122030d000b024020004180016a2203418101490d002003418001419087c000104a000b200141a8f7c1004102200220006a4180016a410020006b1040210020024180016a240020000bf90101027f230041106b22022400024002402000280204450d0020024280808080104200200128021841f4f7c10041082001411c6a28020028020c1100001b2001ad843703002002200036020c200241fcf7c10041062002410c6a4184f8c100105322002d0004210120002d0005450d01200141ff017121004101210120000d0120022802002201411c6a28020028020c210020012802182103024020012d0000410471450d00200341e49dc0004101200011000021010c020b200341e59dc0004102200011000021010c010b20012802184194f8c10041102001411c6a28020028020c11000021010b200241106a2400200141ff01714100470bf80101027f230041106b220224002000280200210020024280808080104200200128021841889fc00041062001411c6a28020028020c1100001b2001ad843703002002200036020c2002418e9fc00041052002410c6a41f89ec000105321012002200041046a36020c200141939fc00041062002410c6a419c9fc000105322002d00042101024020002d0005450d00200141ff017121004101210120000d0020022802002201411c6a28020028020c210020012802182103024020012d0000410471450d00200341e49dc0004101200011000021010c010b200341e59dc0004102200011000021010b200241106a2400200141ff01714100470b1f0020004100360200200041086a4200370200200041002802e88f423602040b7a01057f230041106b2202240002402001422088a72203450d0041002104024002402001a722052d00000e020100020b2003417f6a4104490d0120052800012106410121040b200510302000200636020420002004360200200241106a24000f0b41e8fac100412e200241086a4198fbc10041a8fbc1001034000ba40302077f017e230041106b2202240002402001422088a72203450d004100210402400240024002402001a722052d00000e020100040b20034101460d032003417e6a21040240024020052d0001220641037122074103460d00200541026a210802400240024020070e03000102000b200641027621060c030b2004450d0620082d0000410874200672220641ffff0371418002490d06200541036a21082003417d6a2104200641fcff037141027621060c020b20044103490d0520052f0002200541046a2d000041107472410874200672220641ffff034d0d052003417b6a2104200541056a2108200641027621060c010b200641034b0d0420044104490d0420052800022206418080808004490d042003417a6a2104200541066a21080b20042006490d032006417f4c0d010240024020060d00410121040c010b2006102f2204450d032004410020061087051a0b2004200820061085051a2006ad220142208620018421090b200020093702042000200436020020051030200241106a24000f0b102c000b102a000b41e8fac100412e200241086a4198fbc10041a8fbc1001034000b18002001ad4220862000ad842003ad4220862002ad8410060b18002001ad4220862000ad842003ad4220862002ad8410070b1b002001ad4220862000ad842003ad4220862002ad8410084101460b1d0020002002ad4220862001ad842004ad4220862003ad84100910c6040b1d0020002002ad4220862001ad842004ad4220862003ad84100a10c6040b5201017f230041106b22082400200841086a2002ad4220862001ad842004ad4220862003ad842006ad4220862005ad842007100b10c504200020082802083602002000200828020c360204200841106a24000b4801017e024002402002ad4220862001ad84100c2203422088a722010d0041002101200041002802dc94423602000c010b20002003a73602000b20002001360208200020013602040b22002001ad4220862000ad842003ad4220862002ad842005ad4220862004ad84100d0bb60202037f017e230041106b220524000240024041054101200341014622031b2206102f2207450d002002ad4220862001ad8421082005410036020820052006360204200520073602000240024020030d00200541003a000c20052005410c6a410110640c010b200541013a000c20052005410c6a410110642005200436020c20052005410c6a410410640b200528020421062008200535020842208620052802002207ad84100e2208422088a72203450d0141002101200541003a000c2003417f6a21020240024002402008a722032d00000e020100040b41012101200241034b0d010c030b20024104490d020b200328000121022003103002402006450d00200710300b2000200236020420002001360200200541106a24000f0b102a000b41e8fac100412e20054198fbc10041a8fbc1001034000b0d00200141e8a0c200410210430bb10301047f230041c0006b2202240020002802002103410121000240200128021841f79bc000410c2001411c6a28020028020c1100000d0002400240200328020822000d0020032802002200200328020428020c11090042f4f99ee6eea3aaf9fe00520d012002200036020c2002412936021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241849cc0003602282002200241106a36023820042005200241286a10320d020c010b2002200036020c2002412a36021420022002410c6a36021020012802182104200128021c2105410121002002413c6a41013602002002420237022c200241849cc0003602282002200241106a36023820042005200241286a10320d010b200328020c2100200241106a41146a4102360200200241106a410c6a410236020020022000410c6a3602202002200041086a360218200241043602142002200036021020012802182100200128021c2101200241286a41146a41033602002002420337022c200241949cc0003602282002200241106a36023820002001200241286a103221000b200241c0006a240020000b6901037f230041206b220224002001411c6a280200210320012802182104200241086a41106a2000280200220141106a290200370300200241086a41086a200141086a2902003703002002200129020037030820042003200241086a10322101200241206a240020010b5601017f4104210502400240024002400240200041ff0171417f6a0e050001020304000b410021050c030b410121050c020b410221050c010b410321050b20052002ad4220862001ad842004ad4220862003ad8410250b31002001ad4220862000ad84200235020842208620022802002200ad8410180240200241046a280200450d00200010300b0b130020002002ad4220862001ad84101910c6040b0e002001ad4220862000ad84101a0b0e002001ad4220862000ad84101b0b0400101c0b11002001ad4220862000ad84101d4101460b130020002002ad4220862001ad84101e10c6040b130020002002ad4220862001ad84101f10c6040b4801017f230041106b22062400200641086a2002ad4220862001ad842004ad4220862003ad842005102010c504200020062802083602002000200628020c360204200641106a24000b040010210b4002017e017f0240024010222201422088a722020d0041002102200041002802dc94423602000c010b20002001a73602000b20002002360208200020023602040b18002001ad4220862000ad842003ad4220862002ad8410230b040010240b0e002001ad4220862000ad8410260b18002001ad4220862000ad842003ad4220862002ad8410270b040041010b9c0301057f230041c0006b220224002002420037020c41002103200241002802dc94423602082002412a36021c20022001410c6a3602202002200241206a3602182002200241086a3602242002413c6a41013602002002420137022c200241cc80c2003602282002200241186a360238200241246a41d480c200200241286a10321a02400240024002400240024002402001280200417f6a0e050102030400010b200141086a280200210441042103200141046a28020021010c040b200141086a2802002104200141046a28020021010c030b200141086a2802002104200141046a28020021012002280210210520022802082106410121030c030b200141086a2802002104200141046a28020021012002280210210520022802082106410221030c020b200141086a2802002104200141046a28020021012002280210210520022802082106410321030c010b20022802102105200228020821060b200220033a0029200241003a002820032004ad4220862001ad842005ad4220862006ad8410250240200228020c450d00200228020810300b200241c0006a24000b0f00200028020020012002106441000b6301017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41d480c200200241086a10322101200241206a240020010b8c0c010a7f230041e0036b2203240020012802002104200128020422052f018e0d2106200341b0016a41106a220720052001280208220841186c6a220141146a290200370300200341b0016a41086a22092001410c6a2902003703002003200141046a220a2902003703b001200a2001411c6a20062008417f736a220141186c1086051a200341c8016a2005418c026a220a20084107746a220b4180011085051a200b200a200841016a220c4107746a20014107741086051a20052006417f6a22013b018e0d200341c8026a41106a2007290300370300200341c8026a41086a2009290300370300200320032903b0013703c802200341c8026a41186a200341c8016a4180011085051a200341186a200341c8026a4198011085051a200341c8026a200341186a4198011085051a0240200141ffff037141044b0d0002400240024020052802002206450d00200441016a21090240024020052f018c0d22070d0020062f018e0d0d012003412c6a41013602002003420137021c200341f4a9c200360218200341043602cc0120034188a4c2003602c8012003200341c8016a360228200341186a4190a4c200103a000b024020062007417f6a22074102746a41900d6a280200220a2f018e0d200141ffff03716a41016a410b4b0d00200341306a2005360200200341286a200a3602002003200436022c20032004360224200320073602202003200636021c20032009360218200341b0016a200341186a4101200810e8040c040b200341306a2005360200200341286a200a3602002003200436022c20032004360224200320073602202003200636021c20032009360218200341186a410110e9042003200c3602b8010c020b0240200141ffff0371200741027420066a41940d6a28020022012f018e0d6a41016a410b4b0d00200341306a2001360200200341286a20053602002003200436022c20032004360224200320073602202003200636021c20032009360218200341b0016a200341186a4100200810e8040c030b200341306a2001360200200341286a20053602002003200436022c20032004360224200320073602202003200636021c20032009360218200341186a410110ea040b200320083602b8010b200320053602b401200320043602b0010b20032802b801210820032802b001210420032802b40122052802002201450d0020012f018e0d220941044b0d00200441016a21060240034020012802002207450d01200941ffff03712109200641016a210b024002400240024020012f018c0d220a0d0020072f018e0d0d012003412c6a41013602002003420137021c200341f4a9c200360218200341043602cc0120034188a4c2003602c8012003200341c8016a360228200341186a4190a4c200103a000b2007200a417f6a220c4102746a41900d6a280200210a200320013602e001200320063602dc012003200a3602d801200320063602d4012003200c3602d001200320073602cc012003200b3602c80102402009200a2f018e0d6a41016a410b4b0d00200341186a41186a200341c8016a41186a280200360200200341186a41106a200341c8016a41106a290300370300200341186a41086a200341c8016a41086a290300370300200320032903c801370318200341106a200341186a10eb0420032802142101200328021021060c030b200341c8016a410520096b10e9040c010b2003200a41027420076a41940d6a280200220c3602e001200320063602dc01200320013602d801200320063602d4012003200a3602d001200320073602cc012003200b3602c80102402009200c2f018e0d6a41016a410b4b0d00200341186a41186a200341c8016a41186a280200360200200341186a41106a200341c8016a41106a290300370300200341186a41086a200341c8016a41086a290300370300200320032903c801370318200341086a200341186a10eb04200328020c2101200328020821060c020b200341c8016a410520096b10ea040b410021010b2001450d0220012f018e0d220941044d0d000c020b0b200941ffff03710d00200241013a00000b2000200341c8026a419801108505220141a0016a20083602002001419c016a20053602002001200436029801200341e0036a24000bc40501107f230041a0016b22042400024002400240200141186a28020022052f018e0d2206200141106a28020022072f018e0d220820021b2003490d00200841016a220920066a220a410c4f0d01200128020c210b2001280208210c2001280200210d2001280204220e2f018e0d210f2007200a3b018e0d200441086a41106a2210200e200c41186c6a220141146a290200370300200441086a41086a22112001410c6a2902003703002004200141046a221229020037030820122001411c6a200f200c417f736a221341186c1086051a200741046a2212200841186c6a220141106a2010290300370200200141086a2011290300370200200120042903083702002012200941186c6a200541046a200641186c1085051a200441206a200e418c026a2210200c4107746a22114180011085051a20112010200c41016a22014107746a20134107741086051a2007418c026a221020084107746a200441206a4180011085051a201020094107746a2005418c026a20064107741085051a200e41900d6a221020014102746a200c410274220c20106a41086a20134102741086051a02402001200f4f0d00200c200e6a41940d6a210c0340200c280200221320013b018c0d2013200e360200200c41046a210c200f200141016a2201470d000b0b200e200e2f018e0d417f6a3b018e0d0240200d4102490d002006200a20096b470d03200720094102746a41900d6a200541900d6a200641016a22134102741085051a200a20084d0d00200720084102746a41940d6a21012009210c03402001280200220e200c3b018c0d200e2007360200200141046a2101200c41016a210c2013417f6a22130d000b0b20051030200020073602042000200b36020020002009410020021b20036a360208200441a0016a24000f0b419ca7c20041910141b0a8c200102d000b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000bd306040a7f027e027f017e230041b0036b220224000240024002400240200041186a2802002f018e0d220320016a2204410c4f0d00200041106a28020022052f018e0d22062001490d012005200620016b22073b018e0d200041186a220528020020043b018e0d200528020041046a2208200141186c6a2008200341186c1086051a2005280200418c026a220820014107746a200820034107741086051a2006200741016a22036b22062001417f6a470d02200528020041046a200041106a2208280200200341186c6a41046a200641186c22091085051a2005280200418c026a200828020020034107746a418c026a2006410774220a1085051a20022008280200220b20074107746a418c026a4180011085052106200b200741186c6a220741046a290200210c200741146a290200210d200041046a280200220b2000280208220e41186c6a2202410c6a220f2902002110200f2007410c6a29020037020020064198016a41086a22072010370300200241146a220f2902002110200f200d37020020064198016a41106a220f2010370300200241046a2202290200210d2002200c3702002006200d37039801200641b0026a200b200e4107746a418c026a22024180011085051a200220064180011085051a20064198016a41186a200641b0026a418001108505210220064180016a41106a220b200f29030037030020064180016a41086a220e2007290300370300200620062903980137038001200641b0026a20024180011085051a200528020020096a220741146a200b2903003702002007410c6a200e290300370200200741046a2006290380013702002005280200200a6a418c026a200641b0026a4180011085051a200028020c21070240024020002802140d002007450d010c050b2007450d04200828020021082005280200220741900d6a2200200141027422056a2000200420016b41027441046a1086051a2000200820034102746a41900d6a20051085051a200441016a21034100210103402000280200220520013b018c0d20052007360200200041046a21002003200141016a2201470d000b0b200641b0036a24000f0b4190a6c200413341c4a6c200102d000b41d4a6c200412741fca6c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c2004128418ca7c200102d000ba307040a7f027e037f017e230041b0036b220224000240024002400240200041106a28020022032f018e0d220420016a2205410c4f0d00200041186a2802002f018e0d22062001490d01200320053b018e0d200041186a2203280200200620016b22073b018e0d2002200328020022082001417f6a2209410774220a6a418c026a41800110850521062008200941186c220b6a220241046a290200210c200241146a290200210d200041046a280200220e2000280208220f41186c6a2208410c6a2210290200211120102002410c6a29020037020020064198016a41086a22022011370300200841146a221029020021112010200d37020020064198016a41106a22102011370300200841046a2208290200210d2008200c3702002006200d37039801200641b0026a200e200f4107746a418c026a22084180011085051a200820064180011085051a20064198016a41186a200641b0026a418001108505210820064180016a41106a220e201029030037030020064180016a41086a220f2002290300370300200620062903980137038001200641b0026a20084180011085051a200041106a2208280200200441186c6a220241146a200e2903003702002002410c6a200f290300370200200241046a200629038001370200200828020020044107746a418c026a200641b0026a4180011085051a20092005200441016a22026b470d022008280200200241186c6a41046a200328020041046a200b1085051a200828020020024107746a418c026a2003280200418c026a200a1085051a200328020041046a22092009200141186c6a200741186c1086051a2003280200418c026a2209200920014107746a20074107741086051a200028020c21090240024020002802140d002009450d010c050b2009450d042008280200220920024102746a41900d6a2003280200220841900d6a2200200141027422031085051a2000200020036a200741027441046a1086051a0240200520044d0d00200441027420096a41940d6a210003402000280200220320023b018c0d20032009360200200041046a2100200241016a21022001417f6a22010d000b0b2007417f460d00200841900d6a2102200741016a21034100210003402002280200220120003b018c0d20012008360200200241046a21022003200041016a2200470d000b0b200641b0036a24000f0b41dca4c20041324190a5c200102d000b41a0a5c200412841c8a5c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c20041284180a6c200102d000b8b05010f7f230041a0016b2202240002400240200141106a28020022032f018e0d220441016a2205200141186a28020022062f018e0d22076a2208410c4f0d00200128020821092001280200210a2001280204220b2f018e0d210c200320083b018e0d200241086a41106a220d200b200941186c6a220141146a290200370300200241086a41086a220e2001410c6a2902003703002002200141046a220f290200370308200f2001411c6a200c2009417f736a221041186c1086051a200341046a220f200441186c6a220141106a200d290300370200200141086a200e29030037020020012002290308370200200f200541186c6a200641046a200741186c1085051a200241206a200b418c026a220d20094107746a220e4180011085051a200e200d200941016a22014107746a20104107741086051a2003418c026a220d20044107746a200241206a4180011085051a200d20054107746a2006418c026a20074107741085051a200b41900d6a220d20014102746a20094102742209200d6a41086a20104102741086051a02402001200c4f0d002009200b6a41940d6a210903402009280200221020013b018c0d2010200b360200200941046a2109200c200141016a2201470d000b0b200b200b2f018e0d417f6a3b018e0d0240200a4102490d002007200820056b470d02200320054102746a41900d6a200641900d6a200741016a22094102741085051a200820044d0d00200441027420036a41940d6a210103402001280200221020053b018c0d20102003360200200141046a2101200541016a21052009417f6a22090d000b0b200610302000200b3602042000200a360200200241a0016a24000f0b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000be20b010a7f230041c0036b2203240020012802002104200128020422052f018a0c2106200341a0016a41086a2207200520012802082208410c6c6a2201410c6a2802003602002003200141046a22092902003703a0012009200141106a20062008417f736a2201410c6c1086051a200341b0016a20054188016a220920084107746a220a4180011085051a200a2009200841016a220b4107746a20014107741086051a20052006417f6a22013b018a0c200341b0026a41086a2007280200360200200320032903a0013703b002200341b0026a410c6a200341b0016a4180011085051a200341106a200341b0026a418c011085051a200341b0026a200341106a418c011085051a0240200141ffff037141044b0d0002400240024020052802002206450d00200441016a21090240024020052f01880c22070d0020062f018a0c0d01200341246a410136020020034201370214200341f4a9c200360210200341043602b40120034188a4c2003602b0012003200341b0016a360220200341106a4190a4c200103a000b024020062007417f6a22074102746a418c0c6a280200220a2f018a0c200141ffff03716a41016a410b4b0d00200341286a2005360200200341206a200a360200200320043602242003200436021c200320073602182003200636021420032009360210200341a0016a200341106a4101200810ed040c040b200341286a2005360200200341206a200a360200200320043602242003200436021c200320073602182003200636021420032009360210200341106a410110ee042003200b3602a8010c020b0240200141ffff0371200741027420066a41900c6a28020022012f018a0c6a41016a410b4b0d00200341286a2001360200200341206a2005360200200320043602242003200436021c200320073602182003200636021420032009360210200341a0016a200341106a4100200810ed040c030b200341286a2001360200200341206a2005360200200320043602242003200436021c200320073602182003200636021420032009360210200341106a410110ef040b200320083602a8010b200320053602a401200320043602a0010b20032802a801210820032802a001210420032802a40122052802002201450d0020012f018a0c220941044b0d00200441016a21060240034020012802002207450d01200941ffff03712109200641016a210b024002400240024020012f01880c220a0d0020072f018a0c0d01200341246a410136020020034201370214200341f4a9c200360210200341043602b40120034188a4c2003602b0012003200341b0016a360220200341106a4190a4c200103a000b2007200a417f6a220c4102746a418c0c6a280200210a200320013602c801200320063602c4012003200a3602c001200320063602bc012003200c3602b801200320073602b4012003200b3602b00102402009200a2f018a0c6a41016a410b4b0d00200341106a41186a200341b0016a41186a280200360200200341106a41106a200341b0016a41106a290300370300200341106a41086a200341b0016a41086a290300370300200320032903b001370310200341086a200341106a10f004200328020c2101200328020821060c030b200341b0016a410520096b10ee040c010b2003200a41027420076a41900c6a280200220c3602c801200320063602c401200320013602c001200320063602bc012003200a3602b801200320073602b4012003200b3602b00102402009200c2f018a0c6a41016a410b4b0d00200341106a41186a200341b0016a41186a280200360200200341106a41106a200341b0016a41106a290300370300200341106a41086a200341b0016a41086a290300370300200320032903b0013703102003200341106a10f00420032802042101200328020021060c020b200341b0016a410520096b10ef040b410021010b2001450d0220012f018a0c220941044d0d000c020b0b200941ffff03710d00200241013a00000b2000200341b0026a418c0110850522014194016a200836020020014190016a20053602002001200436028c01200341c0036a24000b9f05010f7f23004190016b22042400024002400240200141186a28020022052f018a0c2206200141106a28020022072f018a0c220820021b2003490d00200841016a220920066a220a410c4f0d01200128020c210b2001280208210c2001280200210d2001280204220e2f018a0c210f2007200a3b018a0c200441086a2210200e200c410c6c6a2201410c6a2802003602002004200141046a22112902003703002011200141106a200f200c417f736a2212410c6c1086051a200741046a22012008410c6c6a221141086a20102802003602002011200429030037020020012009410c6c6a200541046a2006410c6c1085051a200441106a200e4188016a2210200c4107746a22114180011085051a20112010200c41016a22014107746a20124107741086051a20074188016a221020084107746a200441106a4180011085051a201020094107746a20054188016a20064107741085051a200e418c0c6a221020014102746a200c410274220c20106a41086a20124102741086051a02402001200f4f0d00200c200e6a41900c6a210c0340200c280200221220013b01880c2012200e360200200c41046a210c200f200141016a2201470d000b0b200e200e2f018a0c417f6a3b018a0c0240200d4102490d002006200a20096b470d03200720094102746a418c0c6a2005418c0c6a200641016a22124102741085051a200a20084d0d00200720084102746a41900c6a21012009210c03402001280200220e200c3b01880c200e2007360200200141046a2101200c41016a210c2012417f6a22120d000b0b20051030200020073602042000200b36020020002009410020021b20036a36020820044190016a24000f0b419ca7c20041910141b0a8c200102d000b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000b8606040a7f017e037f017e230041a0036b220224000240024002400240200041186a2802002f018a0c220320016a2204410c4f0d00200041106a28020022052f018a0c22062001490d012005200620016b22073b018a0c200041186a220528020020043b018a0c200528020041046a22082001410c6c6a20082003410c6c1086051a20052802004188016a220820014107746a200820034107741086051a2006200741016a22036b22062001417f6a470d02200528020041046a200041106a22082802002003410c6c6a41046a2006410c6c22091085051a20052802004188016a200828020020034107746a4188016a2006410774220a1085051a20022008280200220b20074107746a4188016a4180011085052106200b2007410c6c6a220741046a290200210c200041046a28020022022000280208220b410c6c6a220d410c6a220e280200210f200e2007410c6a28020036020020064190016a41086a2207200f360200200d41046a220d2902002110200d200c3702002006201037039001200641a0026a2002200b4107746a4188016a22024180011085051a200220064180011085051a20064190016a410c6a200641a0026a418001108505210220064180016a41086a220b2007280200360200200620062903900137038001200641a0026a20024180011085051a200528020020096a2207410c6a200b280200360200200741046a2006290380013702002005280200200a6a4188016a200641a0026a4180011085051a200028020c21070240024020002802140d002007450d010c050b2007450d042008280200210820052802002207418c0c6a2200200141027422056a2000200420016b41027441046a1086051a2000200820034102746a418c0c6a20051085051a200441016a21034100210103402000280200220520013b01880c20052007360200200041046a21002003200141016a2201470d000b0b200641a0036a24000f0b4190a6c200413341c4a6c200102d000b41d4a6c200412741fca6c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c2004128418ca7c200102d000bd606040a7f017e047f017e230041a0036b220224000240024002400240200041106a28020022032f018a0c220420016a2205410c4f0d00200041186a2802002f018a0c22062001490d01200320053b018a0c200041186a2203280200200620016b22073b018a0c2002200328020022082001417f6a2209410774220a6a4188016a418001108505210620082009410c6c220b6a220241046a290200210c200041046a28020022082000280208220d410c6c6a220e410c6a220f2802002110200f2002410c6a28020036020020064190016a41086a22022010360200200e41046a220e2902002111200e200c3702002006201137039001200641a0026a2008200d4107746a4188016a22084180011085051a200820064180011085051a20064190016a410c6a200641a0026a418001108505210820064180016a41086a220d2002280200360200200620062903900137038001200641a0026a20084180011085051a200041106a22082802002004410c6c6a2202410c6a200d280200360200200241046a200629038001370200200828020020044107746a4188016a200641a0026a4180011085051a20092005200441016a22026b470d0220082802002002410c6c6a41046a200328020041046a200b1085051a200828020020024107746a4188016a20032802004188016a200a1085051a200328020041046a220920092001410c6c6a2007410c6c1086051a20032802004188016a2209200920014107746a20074107741086051a200028020c21090240024020002802140d002009450d010c050b2009450d042008280200220920024102746a418c0c6a20032802002208418c0c6a2200200141027422031085051a2000200020036a200741027441046a1086051a0240200520044d0d00200441027420096a41900c6a210003402000280200220320023b01880c20032009360200200041046a2100200241016a21022001417f6a22010d000b0b2007417f460d002008418c0c6a2102200741016a21034100210003402002280200220120003b01880c20012008360200200241046a21022003200041016a2200470d000b0b200641a0036a24000f0b41dca4c20041324190a5c200102d000b41a0a5c200412841c8a5c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c20041284180a6c200102d000be604010e7f23004190016b2202240002400240200141106a28020022032f018a0c220441016a2205200141186a28020022062f018a0c22076a2208410c4f0d00200128020821092001280200210a2001280204220b2f018a0c210c200320083b018a0c200241086a220d200b2009410c6c6a2201410c6a2802003602002002200141046a220e290200370300200e200141106a200c2009417f736a220f410c6c1086051a200341046a22012004410c6c6a220e41086a200d280200360200200e200229030037020020012005410c6c6a200641046a2007410c6c1085051a200241106a200b4188016a220d20094107746a220e4180011085051a200e200d200941016a22014107746a200f4107741086051a20034188016a220d20044107746a200241106a4180011085051a200d20054107746a20064188016a20074107741085051a200b418c0c6a220d20014102746a20094102742209200d6a41086a200f4102741086051a02402001200c4f0d002009200b6a41900c6a210903402009280200220f20013b01880c200f200b360200200941046a2109200c200141016a2201470d000b0b200b200b2f018a0c417f6a3b018a0c0240200a4102490d002007200820056b470d02200320054102746a418c0c6a2006418c0c6a200741016a22094102741085051a200820044d0d00200441027420036a41900c6a210103402001280200220f20053b01880c200f2003360200200141046a2101200541016a21052009417f6a22090d000b0b200610302000200b3602042000200a36020020024190016a24000f0b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000bc80201087f200341146a2802002104200328020c210520032802082106200328020021070340200241186a210320022f018e0d21084100210902400240034020082009460d0202400240024020072003416c6a220a280200200a41086a280200220a20062006200a4b1b108805220b0d002006200a490d042006200a47220a0d022005200341786a2802002003280200220a20042004200a4b1b108805220b0d012004200a490d042004200a47210a0c020b4101210a200b417f4a0d010c030b4101210a200b4100480d020b200941016a2109200341186a2103200a0d000b20002001360204200041003602002000410c6a2009417f6a360200200041086a20023602000f0b200921080b02402001450d002001417f6a2101200220084102746a41900d6a28020021020c010b0b200042013702002000410c6a2008360200200041086a20023602000b9f06010e7f230041206b22032400024002400240024002402001450d0020032001417f6a2204200228028c0110f2040240024020032802042201450d00200328020021050c010b418c01102f2201450d0341002105200141003b018a01200141003602000b41bc01102f2206450d022006200136028c0141002107200641003b018a012006410036020020012006360200200141003b018801200320063602042003200541016a36020002400240024020022f018a01450d002006418c016a21082002410c6a210920024190016a210a200641046a210b034020092802002201417f4c0d07200941786a280200210c0240024020010d004101210d0c010b2001102f220d450d070b200d200c2001108505210e200341106a2004200a28020010f2042003280218210f024002402003280214220c450d002003280210210d0c010b418c01102f220c450d074100210d200c41003b018a01200c41003602000b2005200d470d0220062f018a01220d410b4f0d032006200d41016a22103b018a01200b200d410c6c6a220d2001360204200d200e360200200d2001360208200820104102746a200c360200200c2006360200200c20103b0188012003200f20032802086a41016a3602082009410c6a2109200a41046a210a200741016a220720022f018a01490d000b0b20002003290300370200200041086a200341086a2802003602000c030b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b418c01102f2206450d01200641003b018a01200641003602004100210a024020022f018a01450d002002410c6a210c200641046a21104100210a0340200c2802002201417f4c0d04200c41786a28020021090240024020010d004101210d0c010b2001102f220d450d040b200d20092001108505210d20062f018a012209410b4f0d052006200941016a3b018a0120102009410c6c6a22092001360208200920013602042009200d360200200c410c6a210c200a41016a220a20022f018a01490d000b0b2000200a36020820002006360204200041003602000b200341206a24000f0b102a000b102c000b41aca1c200412041fc80c200102d000bb81505017f017e0e7f017e067f23004190016b22022400200141106a2902002103200128020c210420012802082105200128020421062001280200210702400240024020002802042208450d00200028020021090c010b419002102f2208450d0141002109200841003b018e022008410036020020002008360204200041003602000b2003422088a7210a034020082f018e02220b41186c210c4100210d200841046a220e21014100210f034002400240024002400240200c200d470d00200b210f0c010b024020072001280200200128020822102005200520104b1b10880522110d0020052010490d01024020052010460d00200520104721100c030b024020042008200d6a221041106a280200201041186a2802002210200a2010200a491b10880522110d002010200a4b0d022010200a4721100c030b2011417f4c0d010c040b2011417f4a0d030b02402009450d002009417f6a21092008200f4102746a4190026a28020021080c050b02400240200b410a4b0d000240200f200b4f0d00200e200f41186c6a220141186a2001200b200f6b41186c1086051a0b200e200f41186c6a22012007360200200120033702102001200436020c20012005360208200120063602042008200b41016a3b018e020c010b410521014100210c02400240200f41054f0d0041042101200f210d0c010b4105210d02400240200f417b6a0e020201000b200f41796a210d4101210c410621010c010b4100210d4101210c0b419002102f2210450d06201041003b018e0220104100360200201020082f018e02220a2001417f736a22113b018e02200e200141186c6a220f280200210920024188016a200f41146a28020036020020024180016a200f410c6a2902003703002002200f2902043703780240024002400240024002400240024002402011410c4f0d00200a200141016a220f6b2011470d01201041046a200e200f41186c6a201141186c1085051a200820013b018e02200241e0006a41086a220a200241f8006a41086a290300370300200241e0006a41106a220b200241f8006a41106a2802003602002002200229037837036020102008200c1b220f41046a21010240200d41016a220c200f2f018e0222114b0d002001200c41186c6a2001200d41186c6a2011200d6b41186c1086051a0b2001200d41186c6a22012007360200200120033702102001200436020c2001200536020820012006360204200f201141016a3b018e02200241c8006a41086a200a2903002203370300200241c8006a41106a200b2802002201360200200220022903602212370348200241186a41106a2001360200200241186a41086a200337030020022012370318024002400240200828020022010d00410021040c010b410021042010210b2009210e034020082f018c02210f200241306a41106a2206200241186a41106a2213280200360200200241306a41086a2214200241186a41086a2215290300370300200220022903183703302001220c2f018e02220a410b490d0241002111410421010240200f4105490d00200f210102400240200f417b6a0e020201000b200f41796a210f41012111410621010c010b4100210f41012111410521010b41c002102f2210450d12201041003b018e02201041003602002010200c2f018e0222092001417f736a22053b018e02200241f8006a41086a2207200c200141186c6a220d41106a290200370300200241f8006a41106a2208200d41186a2802003602002002200d41086a2902003703782005410c4f0d052009200141016a22166b2005470d06200d41046a2802002109201041046a200d411c6a200541186c1085051a200c20013b018e02200241e0006a41086a22172007290300370300200241e0006a41106a221820082802003602002002200229037837036020102f018e02220d41016a2105200d410c4f0d07200a20016b22012005470d08200441016a210420104190026a200c20164102746a4190026a20014102741085051a4100210102400340201020014102746a4190026a280200220520013b018c02200520103602002001200d4f0d0120012001200d496a2201200d4d0d000b0b200241c8006a41106a22162018280200360200200241c8006a41086a22182017290300370300200220022903603703482010200c20111b22052f018e022101200820062802003602002007201429030037030020022002290330370378200541046a210a0240200f41016a220d20014b0d00200a200d41186c6a200a200f41186c6a2001200f6b41186c1086051a0b200141016a2111200a200f41186c6a220a200e360200200a2002290378370204200a410c6a2007290300370200200a41146a200828020036020020054190026a21070240200f41026a220a200141026a22084f0d002007200a4102746a2007200d4102746a2001200f6b4102741086051a0b2007200d4102746a200b360200200520113b018e020240200d20084f0d002005200f4102746a4194026a210103402001280200220d200f41016a220f3b018c02200d2005360200200141046a21012011200f470d000b0b201320162802003602002015201829030037030020022002290348370318200c21082010210b2009210e200c28020022010d000b0b200241106a200241186a41106a280200360200200241086a200241186a41086a2903003703002002200229031837030020002802042201450d072000280200210541c002102f220d450d10200d200136029002200d41003b018e02200d4100360200200141003b018c022001200d3602002000200d3602042000200541016a36020020052004470d08200d2f018e022205410b4f0d0941012101200d200541016a220f3b018e02200d200541186c6a220541106a200241086a290300370200200541186a200241106a280200360200200541086a2002290300370200200541046a2009360200200d4190026a200f4102746a20103602002010200f3b018c022010200d3602002000200028020841016a3602080c0c0b200241f8006a41106a2205200241186a41106a280200360200200241f8006a41086a2210200241186a41086a29030037030020022002290318370378200f41016a2101200c41046a210d0240200a200f4d22110d00200d200141186c6a200d200f41186c6a200a200f6b41186c1086051a0b200a41016a2107200d200f41186c6a220d200e360200200d2002290378370204200d410c6a2010290300370200200d41146a2005280200360200200c4190026a210d200a41026a2105024020110d00200f410274200d6a41086a200d20014102746a200a200f6b4102741086051a0b200c20073b018e02200d20014102746a200b360200200120054f0d09200a41016a2110200c2001417f6a22014102746a4194026a210d0340200d2802002205200141016a22013b018c022005200c360200200d41046a210d20102001470d000c0a0b0b2011410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2005410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2005410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b410121012000200028020841016a3602080c010b20100d0102402006450d00200710300b410021012003a7450d00200410300b20024190016a240020010f0b200f41016a210f200141186a2101200d41186a210d0c000b0b0b102a000bbf1905107f017e087f017e017f230041c0066b2202240002400240024020002d00540d00200028020c21030c010b02400240200028020c22034106490d00200041186a28020021040c010b200321040b41012105200420002802504d0d010b2000410c6a21060240024020034106490d00200041186a22042802002103200041146a28020021070c010b200041146a2107200621040b024020030d00410121050c010b20042003417f6a22033602004100210520072003410c6c6a22042802042203450d00200428020821082004280200210420032109024003402004450d012004417f6a2104200320032f018a014102746a418c016a2802002103200928028c0121090c000b0b02402008450d0002400240024020092f018a010d004100210403404100210302402009280200220a450d00200441016a210b20092f0188012107200a21030b024041bc01418c0120041b450d00200910300b200b210420032109200720032f018a014f0d000b20032007410c6c6a41046a210a0240200b0d00200321090c020b200741027420036a4190016a28020021090240200b417f6a2204450d000340200928028c0121092004417f6a22040d000b0b4100210c0c020b200941046a210a41002107200921030b200741016a210c0b2008417f6a210d20032007410c6c6a220341086a280200210e0240200a280200220f450d00200041146a21102003410c6a2802002211ad422086200ead842112200241086a211320024180026a41146a2114200241a8046a410c6a211520024198036a410c6a2116034002400240024002400240024020002802042217450d002012422088a72104200028020021180340201741046a210320172f018a0c2219410c6c2107410021084100210a0340024002402007450d0002400240200f20032802002003280208220b2004200b2004491b108805221a0d00200b20044b0d01200b200447210b0c030b4101210b201a41004e0d020b200a21190b2018450d032018417f6a2118201720194102746a418c0c6a28020021170c020b2003410c6a2103200a41016a210a20084180016a2108200741746a2107200b0d000b0b201720086a220341086a21070240024002400240024002402001450d0002400240200341086a2208280200220b4106490d00200341146a2207280200210b200341106a280200210a0c010b200341106a210a0b200b450d022007200b417f6a220b360200200a200b41186c6a220728020c220b450d02200741106a290200211b02402007280200220a450d002007280204450d00200a10300b0240201b42ffffffff0383500d00200b10300b200828020022074106490d01200341146a2802000d080c070b02400240200628020022044106490d00200028021821042000280214210b0c010b2010210b0b02400240200b4520044572220a450d00200341086a2802002204210b024020044106490d00200341146a280200210b0b200b41024f0d010c090b200220123702ac042002200f3602a8042004410c6c200b6a41746a200241a8046a10e1020d0b200341086a28020021040b0240024020044106490d00200341146a22072802002104200341106a280200210b0c010b200341106a210b0b2004450d0220072004417f6a2204360200200b200441186c6a220428020c220b450d02200441106a290200211b200241a8046a41086a2208200441086a280200360200200220042902003703a80402400240200341086a221a28020022044106490d00200341146a2802002104200341106a28020021070c010b200341106a21070b2007450d032004450d03024020072004417f6a41186c6a22042802002207450d00200441046a280200450d00200710300b200420022903a804370200200441086a200828020036020002400240201a28020022044106490d00200341146a2802002104200341106a28020021030c010b200341106a21030b2003450d042004450d04200441186c20036a220341746a22042003417c6a2203280200201b422088a74102742207410275220810f302200428020020032802004102746a200b20071085051a2003200328020020086a3602000240201b42ffffffff0383500d00200b10300b200a0d070c0a0b2007450d050c060b418486c20041fc0041dc8ac2001050000b418486c20041fc0041dc8ac2001050000b418486c20041fc00418888c2001050000b418486c20041fc00419888c2001050000b41f588c20041d50141cc8ac2001050000b20002802042219450d00200028020021180340201941880c6a211a201941046a210320192f018a0c221c410c6c210741002108417f210a0340024002402007450d0002400240200f20032802002003280208220b2004200b2004491b10880522170d00200b20044b0d01200b200447210b0c030b4101210b201741004e0d022008211c0c010b200a41016a211c0b2018450d032018417f6a21182019201c4102746a418c0c6a28020021190c020b2003410c6a2103200841016a2108200a41016a210a201a41046a211a200741746a2107200b0d000b0b200241003a00ff01024002402018450d00201a2802002103024020184101460d00410121040340200320032f018a0c4102746a418c0c6a28020021032018200441016a2204470d000b0b20032f018a0c2104200241003602980320022004417f6a410020041b3602a00320022003410020041b36029c03200241a8046a20024198036a200241ff016a10ec0420024198036a200241a8046a418c011085051a20022802b405210b0240024020022802bc05220720022802b80522042f018a0c4f0d00200421030c010b03400240200428020022030d00410021030c020b200b41016a210b20042f01880c210720032104200720032f018a0c4f0d000b0b200241a8046a41086a20032007410c6c6a2204410c6a220a280200360200200441046a2204290200211b2004200229039803370200200a20024198036a41086a2802003602002002201b3703a804200241c0056a200320074107746a4188016a22044180011085051a200420164180011085051a2015200241c0056a4180011085051a0240200b450d00200b417f6a2204450d00200741027420036a41900c6a28020021030340200328028c0c21032004417f6a22040d000b0b20024180026a200241a8046a418c011085051a0c010b2002200a3602b004200220193602ac04200241003602a80420024180026a200241a8046a200241ff016a10ec040b2002280290022103200229038802211b200228028402210b200228028002210a20024184016a201441f8001085051a20002000280208417f6a360208024020022d00ff01450d0020002802042204450d0220002802002208450d03200428028c0c210720002008417f6a3602002000200736020420074100360200200410300b20034102460d00200241a8046a20024184016a41f8001085051a201b422088a721040240200b450d00200a10300b20022003360204200220043602002013200241a8046a41f8001085051a200210d9020b2012a7450d02200f10300c020b41b2abc200412b41d0acc200102d000b41b7a2c200412141d8a2c200102d000b200d450d020240024002400240200c20092f018a01490d004100210403404100210302402009280200220b450d00200441016a210720092f018801210c200b21030b024041bc01418c0120041b450d00200910300b024020030d00410021090c050b2007210420032109200c20032f018a014f0d000b2003200c410c6c6a41046a210b024020070d00200321090c020b200c41027420036a4190016a280200210902402007417f6a2204450d000340200928028c0121092004417f6a22040d000b0b410021040c020b2009200c410c6c6a41046a210b200921030b200c41016a21040b2003200c410c6c6a2203410c6a2802002111200341086a280200210e200b280200210f0b200d417f6a210d0240200f0d002004210c0c020b2011ad422086200ead8421122004210c0c000b0b200d450d0003400240024002400240200c20092f018a01490d004100210403404100210302402009280200220a450d00200441016a210b20092f0188012107200a21030b024041bc01418c0120041b450d00200910300b024020030d00410021090c050b200b210420032109200720032f018a014f0d000b20032007410c6c6a41046a210a0240200b0d00200321090c020b200741027420036a4190016a28020021090240200b417f6a2204450d000340200928028c0121092004417f6a22040d000b0b4100210c0c020b2009200c410c6c6a41046a210a20092103200c21070b200741016a210c0b20032007410c6c6a41086a280200210e200a280200210f0b200f450d02200d417f6a210d0240200e450d00200f10300b200d0d000b0b41002103034020092802002104024041bc01418c0120031b450d00200910300b2003417f6a21032004210920040d000b410021050b200241c0066a240020050b1c00200128021841e488c20041112001411c6a28020028020c1100000bac1b03177f017e037f23004190076b2202240002400240024020002d00540d00200028020c21030c010b02400240200028020c22034106490d00200041186a28020021040c010b200321040b41012105200420002802504d0d010b2000410c6a21060240024020034106490d00200041186a22042802002103200041146a28020021070c010b200041146a2107200621040b024020030d00410121050c010b20042003417f6a22033602004100210520072003410c6c6a22032802042204450d00200328020821082003280200210720042103024003402007450d012007417f6a2107200420042f018e024102746a4190026a280200210420032802900221030c000b0b0240024002402008450d000240024002400240024020032f018e020d0041002107034041002104024020032802002209450d00200741016a210a20032f018c02210b200921040b024041c00241900220071b450d00200310300b2004450d04200a210720042103200b20042f018e024f0d000b2004200b41186c6a41046a21090240200a0d00200421030c020b200b41027420046a4194026a28020021030240200a417f6a2207450d00034020032802900221032007417f6a22070d000b0b410021070c020b200341046a21094100210b200321040b200b41016a21070b2008417f6a21082004200b41186c6a220441146a280200210c200441106a280200210d200441086a280200210e2009280200220f450d01200041146a21102004410c6a2802002111200441186a2802002112200241186a410c6a2113200241186a41086a2114200241c8026a2115200241e8046a41186a2116200241d0036a41186a21170340200220123602142002200c3602102002200d36020c200220113602082002200e3602042002200f36020020002802042204450d05200241e8046a20002802002004200210f10420022802e8044101460d0520022802f00420022802f4044107746a2204418c026a210b024002400240024002400240024002400240024002402001450d0002400240200b280200220a4106490d0020044198026a2209280200210a20044194026a28020021180c010b20044194026a2118200b21090b200a450d022009200a417f6a220a3602002018200a41186c6a220a28020c2209450d02200a41106a29020021190240200a2802002218450d00200a280204450d00201810300b0240201942ffffffff0383500d00200910300b200b280200220b4106490d0120044198026a2802000d070c060b024002402006280200220a4106490d002000280218210a200028021421090c010b201021090b02400240200945200a45722218450d00200b280200220a21090240200a4106490d0020044198026a28020021090b200941024f0d010c080b200241e8046a41106a200241106a290300370300200241e8046a41086a200241086a290300370300200220022903003703e804200a410c6c20096a41746a200241e8046a10f3040d0a200b280200210a0b02400240200a4106490d0020044198026a2209280200210a20044194026a280200211a0c010b20044194026a211a200b21090b200a450d022009200a417f6a220a360200201a200a41186c6a220a28020c221a450d02200a41106a2902002119200241e8046a41086a221b200a41086a2802003602002002200a2902003703e80402400240200b280200220a4106490d0020044198026a280200210a20044194026a28020021090c010b20044194026a21090b2009450d03200a450d0302402009200a417f6a41186c6a220a2802002209450d00200a41046a280200450d00200910300b200a20022903e804370200200a41086a201b28020036020002400240200b280200220b4106490d0020044198026a280200210b20044194026a28020021040c010b20044194026a21040b2004450d04200b450d04200b41186c20046a220441746a220b2004417c6a22042802002019422088a7410274220a410275220910f302200b28020020042802004102746a201a200a1085051a2004200428020020096a3602000240201942ffffffff0383500d00201a10300b20180d060c090b200b450d040c050b418486c20041fc0041dc8ac2001050000b418486c20041fc0041dc8ac2001050000b418486c20041fc00418888c2001050000b418486c20041fc00419888c2001050000b20002802042204450d0020024190026a20002802002004200210f1042002280290024101460d00200228029c022104200228029802210a200228029402210b200241003a00a70202400240200b450d00200a20044102746a41900d6a28020021040240200b417f6a220b450d000340200420042f018e0d4102746a41900d6a2802002104200b417f6a220b0d000b0b20042f018e0d210b200241003602d0032002200b417f6a4100200b1b3602d803200220044100200b1b3602d403200241e8046a200241d0036a200241a7026a10e704200241d0036a200241e8046a4198011085051a200228028006210902400240200228028806220a200228028406220b2f018e0d4f0d00200b21040c010b03400240200b28020022040d00410021040c020b200941016a2109200b2f018c0d210a2004210b200a20042f018e0d4f0d000b0b200241e8046a41106a2004200a41186c6a220b41146a2218290200370300200241e8046a41086a200b410c6a221a290200370300200b41046a220b2902002119200b20022903d003370200201a200241d0036a41086a2903003702002018200241d0036a41106a290300370200200220193703e80420024190066a2004200a4107746a418c026a220b4180011085051a200b20174180011085051a201620024190066a4180011085051a02402009450d002009417f6a220b450d00200a41027420046a41940d6a2802002104034020042802900d2104200b417f6a220b0d000b0b200241a8026a200241e8046a4198011085051a0c010b200220043602f0042002200a3602ec04200241003602e804200241a8026a200241e8046a200241a7026a10e7040b20022802c402210420022902bc02211920022802b802211820022802b402211a20022802ac02210920022802a802211b20024198016a201541f8001085051a20002000280208417f6a360208024020022d00a702450d002000280204220b450d022000280200221c450d03200b2802900d210a2000201c417f6a3602002000200a360204200a4100360200200b10300b20044102460d00200241e8046a20024198016a41f8001085051a2019422088211902402009450d00201b10300b2019a7210902402018450d00201a10300b2002200436021c200220093602182014200241e8046a41f8001085052104024020094106490d0020022802202118024020022802242204450d002018200441186c6a210a20182104034002402004280200220b450d00200441046a280200450d00200b10300b0240200441106a28020041ffffffff0371450d002004410c6a28020010300b200441186a2204200a470d000b0b200941186c450d01201810300c010b2009450d002004200941186c6a210920132104034002402004417c6a220b280200220a450d002004280200450d00200a10300b0240200b41106a28020041ffffffff0371450d00200441086a28020010300b200441186a2104200b41186a2009470d000b0b02402002280204450d00200228020010300b2002280210450d02200228020c10300c020b41b2abc200412b41d0acc200102d000b41b7a2c200412141d8a2c200102d000b2008450d0302402003450d000240024002400240200720032f018e02490d0041002107034041002104024020032802002209450d00200741016a210a20032f018c02210b200921040b024041c00241900220071b450d00200310300b024020040d00410021030c050b200a210720042103200b20042f018e024f0d000b2004200b41186c6a41046a21090240200a0d00200421030c020b200b41027420046a4194026a28020021030240200a417f6a2207450d00034020032802900221032007417f6a22070d000b0b410021070c020b2003200741186c6a41046a2109200321042007210b0b200b41016a21070b2004200b41186c6a220441186a2802002112200441146a280200210c200441106a280200210d2004410c6a2802002111200441086a280200210e2009280200210f0b2008417f6a2108200f0d010c030b0b41b2abc200412b41d4a8c200102d000b00000b2008450d014100210003400240024002400240200720032f018e02490d0041002107034041002104024020032802002209450d00200741016a210a20032f018c02210b200921040b024041c00241900220071b450d00200310300b024020040d00410021030c050b200a210720042103200b20042f018e024f0d000b2004200b41186c6a41046a21090240200a0d00200421030c020b200b41027420046a4194026a28020021030240200a417f6a2207450d00034020032802900221032007417f6a22070d000b0b410021070c020b2003200741186c6a41046a2109200321042007210b0b200b41016a21070b2004200b41186c6a220441146a280200210c200441106a280200210d200441086a280200210e200928020021000b024020000d00410021050c050b0240200e450d00200010300b2008417f6a21080240200c450d00200d10300b2008450d020c000b0b2003450d020b41002104034020032802002107024041c00241900220041b450d00200310300b2004417f6a21042007210320070d000b410021050c010b41f588c20041d50141cc8ac2001050000b20024190076a240020050b1c00200128021841ec8ac20041102001411c6a28020028020c1100000b1c00200128021841f08fc200410c2001411c6a28020028020c1100000ba20a010a7f230041206b220224002000280200210320002001360200200220003602040240024002400240024002400240024002400240024002400240024002400240200320014d0d0002400240200028020422034125490d00200041106a28020021010c010b200321010b2001417f6a2204450d0c2001417e6a210541002101034002400240200341254922060d00200041106a28020021072000410c6a28020021080c010b200041096a2108200321070b200720014d0d02200141016a2107200820016a2d000021080240024020060d00200041106a2206280200220320074d0d0b200628020021032000410c6a22002802002106200028020020016a41016a2d000021000c010b200320074d0d0a200041096a2106200020016a410a6a2d000021000b200320014d0d03200620016a20084104742000411874411c76723a000020022802042100024020052001460d0020002802042103200721010c010b0b02400240200028020422014125490d00200041106a2203280200220120044d0d0b200328020021012000410c6a22002802002103200028020020046a2d000021000c010b200120044d0d0a200041096a220320046a2d000021000b200120044d0d03200320046a21010c0d0b200320014f0d0d200241043602082002410436020c200041046a210802400240200028020422074125490d00200041106a220328020021012000410c6a28020021060c010b200041096a21062007210120082103412421070b024020012007470d00200241106a2008410110bd02024020022802104101470d00200241186a2802000d0541d099c200411141e499c200102d000b200041106a220328020021012000410c6a28020021060b200620016a41003a00002003200328020041016a360200024002402002280204220328020422004125490d00200341106a28020021010c010b200021010b024020014102490d00200341086a21092001417e6a2101200228020c410771210a2002280208410771210b200341096a2104034002400240200041254922060d0020032802102107200328020c21080c010b20042108200021070b200720014d0d06200141016a2107200820016a2d000021080240024020060d002003280210220020074d0d0d200328020c20016a41016a2d0000200a76210620032802102100200328020c21050c010b200020074d0d0c200920016a41026a2d0000200a762106200421050b200020074d0d07200520016a41016a20062008200b74723a00002001417f6a210120032802042100200741014b0d000b0b0240024020004125490d00200341106a2201280200450d0c200128020021002003410c6a2201280200210320012802002d000021070c010b2000450d0b200341096a22032d000021070b200228020c21012000450d062003200741ff01712001410771763a00000c0d0b2001200741dc9dc2001033000b2001200341fc9dc2001033000b20042001419c9ec2001033000b102a000b2001200741a49bc2001033000b200141016a200041c49bc2001033000b4100410041bc9ec2001033000b200141016a200341ec9dc2001033000b20042001418c9ec2001033000b200141016a200041b49bc2001033000b4100410041ac9ec2001033000b0240024020034125490d00200041106a2201280200450d04200128020021032000410c6a2200280200210120002802002d000021000c010b2003450d03200041096a22012d000021000b20030d0041004100419c9ec2001033000b200120004104743a00000b200241206a24000f0b41004100418c9ec2001033000b882251027f027e017f017e017f017e017f027e017f017e017f017e017f027e017f017e017f017e017f027e017f017e017f017e017f027e017f017e017f017e017f027e017f017e017f017e017f017e017f017e017f017e017f027e017f017e017f017e017f037e017f027e017f017e017f017e017f027e017f017e017f017e017f017e017f027e017f017e017f017e017f037e017f027e017f017e017f017e017f037e137f230022022103200241a0046b41607122022400200129030021044200210520014200370300200141386a22062903002107200141306a22082903002109200141286a220a290300210b200141206a290300210c20014198016a220d290300210e20014190016a220f290300211020014188016a2211290300211220014180016a2903002113200141d8016a22142903002115200141d0016a22162903002117200141c8016a22182903002119200141c0016a290300211a20014198026a221b290300211c20014190026a221d290300211e20014188026a221f290300212020014180026a2903002121200141f8026a22222903002123200141f0026a22242903002125200141e8026a22262903002127200141e0026a2903002128200141b8036a2229290300212a200141b0036a222b290300212c200141a8036a222d290300212e200141a0036a222f2903002130200141c0036a2231290300213220014180036a2233290300213420014188036a290300213520014190036a2236290300213720014198036a22382903002139200141c0026a223a290300213b200141c8026a290300213c200141d0026a290300213d200141d8026a223e290300213f200141a0026a2903002140200141a8026a22412903002142200141b0026a22432903002144200141b8026a22452903002146200141e0016a2903002147200141e8016a22482903002149200141f0016a224a290300214b200141f8016a224c290300214d200141a0016a224e290300214f200141a8016a2903002150200141b0016a22512903002152200141b8016a22532903002154200141e0006a22552903002156200141e8006a2903002157200141f0006a2903002158200141f8006a2259290300215a200141c0006a290300215b200141c8006a225c290300215d200141d0006a225e290300215f200141d8006a2260290300216120012903082162200129031021632002200141186a226429030037039801200220633703900120022062370388012002200437038001200220613703182002205f3703102002205d3703082002205b3703002002205a37039804200220583703900420022057370388042002205637038004200220543703f803200220523703f003200220503703e8032002204f3703e0032002204d3703d8032002204b3703d003200220493703c803200220473703c003200220463703b803200220443703b003200220423703a803200220403703a0032002203f370398032002203d370390032002203c370388032002203b37038003200220393703f802200220373703f002200220353703e802200220343703e002410a21650240024002400240024002400240024002402004a70e09080102030405060700080b200241c8026a41106a200229039801370300200241c8026a41086a200229039001370300200241b0026a41086a200229038804370300200241b0026a41106a200229039004370300200241a0026a41086a20022903e80337030020024190026a41086a20022903f80337030020022002290388013703c80220022002290380043703b002200220022903e0033703a002200220022903f00337039002200241f8016a41106a20022903d803370300200241f8016a41086a20022903d003370300200241e0016a41086a200229038803370300200241e0016a41106a200229039003370300200241d0016a41086a20022903e802370300200220022903c8033703f80120022002290380033703e001200220022903e0023703d001200220022800f102360278200220022800f40236007b200241c8006a41206a202a370300200241c8006a41186a202c370300200241c8006a41106a202e3703002002203037035020022032370370200220393703482037a72165420721050c070b200241c8006a41186a200b370300200241d0006a200229039801370300200241c8006a41206a2009370300200241c8006a41286a20073703002002200c3703582002200228008c0136007b200220022800890136027820022002290390013703482062a721650c060b200241c8026a41106a200229039801370300200241c8026a41086a200229039001370300200241c8006a41086a2002290310370300200241c8006a41106a2002290318370300200241c8006a41286a200229039004370300200241c8006a41206a20022903880437030020022002290388013703c802200220022800013602782002200228000436007b200220022903083703482002200229038004370360205ba72165420121050c050b200241c8026a41106a200229039801370300200241c8026a41086a200229039001370300200241b0026a41086a200229038804370300200241b0026a41106a200229039004370300200241c8006a41186a200e3703002002201337034820022002290388013703c80220022002290380043703b00220022002280099043602782002200228009c0436007b2002201237035020022010370358200241c8006a41286a20022903e803370300200220022903e003370368205aa72165420221050c040b200241c8026a41106a200229039801370300200241c8026a41086a200229039001370300200241b0026a41086a200229038804370300200241b0026a41106a200229039004370300200241a0026a41086a20022903e80337030020022002290388013703c80220022002290380043703b002200220022903e0033703a002200220022800f40336007b200220022800f103360278200241c8006a41186a2017370300200241c8006a41106a2019370300200241c8006a41206a20153703002002201a37035020022047370370200220543703482052a72165420321050c030b200241c8026a41106a200229039801370300200241c8026a41086a200229039001370300200241b0026a41086a200229038804370300200241b0026a41106a200229039004370300200241a0026a41086a20022903e80337030020024190026a41086a20022903f80337030020022002290388013703c80220022002290380043703b002200220022903e0033703a002200220022903f00337039002200241c8006a41206a201e370300200241c8006a41186a2020370300200241c8006a41086a20022903d803370300200241c8006a41286a201c37030020022021370358200220022800cc0336007b200220022800c903360278200220022903d0033703482049a72165420421050c020b200241c8026a41106a200229039801370300200241c8026a41086a200229039001370300200241b0026a41086a200229038804370300200241b0026a41106a200229039004370300200241a0026a41086a20022903e80337030020024190026a41086a20022903f80337030020022002290388013703c80220022002290380043703b002200220022903e0033703a002200220022903f00337039002200241f8016a41106a20022903d803370300200241f8016a41086a20022903d003370300200241c8006a41086a20022903b003370300200241c8006a41106a20022903b803370300200241c8006a41206a200229038803370300200241c8006a41286a200229039003370300200220022903c8033703f801200220022800a103360278200220022800a40336007b200220022903a80337034820022002290380033703602040a72165420521050c010b200241c8026a41106a200229039801370300200241c8026a41086a200229039001370300200241b0026a41086a200229038804370300200241b0026a41106a200229039004370300200241a0026a41086a20022903e80337030020024190026a41086a20022903f80337030020022002290388013703c80220022002290380043703b002200220022903e0033703a002200220022903f00337039002200241f8016a41106a20022903d803370300200241f8016a41086a20022903d003370300200241e0016a41086a200229038803370300200241e0016a41106a200229039003370300200241c8006a41186a2023370300200220253703582002202737035020022028370348200220022903c8033703f80120022002290380033703e00120022002280099033602782002200228009c0336007b200241c8006a41286a20022903e802370300200220022903e002370368203fa72165420621050b20024180046a41086a2266200241c8026a41086a29030037030020024180046a41106a2267200241c8026a41106a290300370300200220022903c80237038004200241e0036a41086a2268200241b0026a41086a290300370300200241e0036a41106a2269200241b0026a41106a290300370300200220022903b0023703e00320024180036a41086a226a200241a0026a41086a290300370300200220022903a00237038003200241e0026a41086a226b20024190026a41086a29030037030020022002290390023703e002200241c0036a41106a226c200241f8016a41106a290300370300200241c0036a41086a226d200241f8016a41086a290300370300200220022903f8013703c003200241a0036a41106a226e200241e0016a41106a290300370300200241a0036a41086a226f200241e0016a41086a290300370300200220022903e0013703a003200241386a41086a2270200241d0016a41086a290300370300200220022903d001370338200241306a227120024180016a41306a290300370300200241286a227220024180016a41286a290300370300200241206a227320024180016a41206a290300370300200241186a227420024180016a41186a290300370300200241106a227520024180016a41106a290300370300200241086a227620024180016a41086a2903003703002002200229038001370300200020653a0000200041046a200228007b36000020002002280278360001200041306a200241c8006a41286a290300370000200041286a200241c8006a41206a290300370000200041206a200241c8006a41186a290300370000200041186a200241c8006a41106a290300370000200041106a200241c8006a41086a290300370000200041086a20022903483700002001109c0120602061370300205e205f370300205c205d3703002001205b3703402006200737030020082009370300200a200b3703002001200c370320200d200e370300200f2010370300201120123703002001201337038001200120053703002059205a3703002001200229038004370308200141106a206629030037030020642067290300370300205520022903e003370300205541086a2068290300370300205541106a2069290300370300204e200229038003370300204e41086a206a290300370300200120473703e0012014201537030020162017370300201820193703002001201a3703c001204520463703002043204437030020412042370300200120403703a002201b201c370300201d201e370300201f202037030020012021370380022053206b290300370300205120022903e002370300204820022903c003370300204a206d290300370300204c206c290300370300200120283703e002202620273703002024202537030020222023370300203e203f370300203a41106a206e290300370300203a41086a206f290300370300203a20022903a003370300203341086a2070290300370300203320022903383703002031207129030037030020292072290300370300202b2073290300370300202d2074290300370300202f20752903003703002038207629030037030020362002290300370300200324000b970401017f410021010240024002400240024002400240024002402000280200417f6a0e080001020304050607080b20002d0008450f0b20002d00080d0641014102200041c0006a2d00001b0f0b20002d00080d0541012101200041c0006a2d00000d0541024103200041f8006a2d00001b0f0b20002d00080d0441012101200041c0006a2d00000d0441022101200041f8006a2d00000d0441034104200041b0016a2d00001b0f0b20002d00080d0341012101200041c0006a2d00000d0341022101200041f8006a2d00000d0341032101200041b0016a2d00000d0341044105200041e8016a2d00001b0f0b20002d00080d0241012101200041c0006a2d00000d0241022101200041f8006a2d00000d0241032101200041b0016a2d00000d0241042101200041e8016a2d00000d0241054106200041a0026a2d00001b0f0b20002d00080d0141012101200041c0006a2d00000d0141022101200041f8006a2d00000d0141032101200041b0016a2d00000d0141042101200041e8016a2d00000d0141052101200041a0026a2d00000d0141064107200041d8026a2d00001b21010c010b20002d00080d0041012101200041c0006a2d00000d0041022101200041f8006a2d00000d0041032101200041b0016a2d00000d0041042101200041e8016a2d00000d0041052101200041a0026a2d00000d0041062101200041d8026a2d00000d004107410820004190036a2d00001b0f0b20010ba104010e7f23004180046b22042400024002400240200141186a28020022052f01ae2b2206200141106a28020022072f01ae2b220820021b2003490d00200841016a220920066a220a410c4f0d01200128020c210b2001280208210c2001280200210d2001280204220e2f01ae2b210f2007200a3b01ae2b200441086a200e200c41f8036c6a220141f8031085051a2001200141f8036a200f200c417f736a221041f8036c1086051a2007200841f8036c6a200441086a41f8031085051a2007200941f8036c6a2005200641f8036c1085051a200e41b02b6a2211200c41016a22014102746a200c410274220c20116a41086a20104102741086051a02402001200f4f0d00200c200e6a41b42b6a210c0340200c280200221020013b01ac2b2010200e3602a82b200c41046a210c200f200141016a2201470d000b0b200e200e2f01ae2b417f6a3b01ae2b0240200d4102490d002006200a20096b470d03200720094102746a41b02b6a200541b02b6a200641016a22104102741085051a200a20084d0d00200841027420076a41b42b6a21012009210c03402001280200220e200c3b01ac2b200e20073602a82b200141046a2101200c41016a210c2010417f6a22100d000b0b20051030200020073602042000200b36020020002009410020021b20036a36020820044180046a24000f0b419ca7c20041910141b0a8c200102d000b41a0a4c200412a41cca4c200102d000b41f8a2c200412841a0a3c200102d000beb0301097f230041f0076b220224000240024002400240200041186a2802002f01ae2b220320016a2204410c4f0d00200041106a28020022052f01ae2b22062001490d012005200620016b22073b01ae2b200041186a220528020020043b01ae2b20052802002208200141f8036c6a2008200341f8036c1086051a2006200741016a22036b22062001417f6a470d022005280200200041106a2208280200200341f8036c6a200641f8036c22091085051a20082802002106200241f8036a200041046a280200200028020841f8036c6a220a41f8031085051a200a2006200741f8036c6a41f8031086051a2002200241f8036a41f8031085052106200528020020096a200641f8031085051a200028020c21020240024020002802140d002002450d010c050b2002450d04200828020021072005280200220241b02b6a2200200141027422056a2000200420016b41027441046a1086051a2000200720034102746a41b02b6a20051085051a200441016a21044100210103402000280200220520013b01ac2b200520023602a82b200041046a21002004200141016a2201470d000b0b200641f0076a24000f0b4190a6c200413341c4a6c200102d000b41d4a6c200412741fca6c200102d000b41f8a2c200412841a0a3c200102d000b41d8a5c2004128418ca7c200102d000bd80b03077f027e037f230041e0076b2203240020012802002104200128020422052f01a6292106200341e0036a20052001280208220741d0036c6a220141d0031085051a2001200141d0036a20062007417f736a220841d0036c1086051a200541f0276a220920074104746a220141086a290300210a2001290300210b20012009200741016a220c4104746a20084104741086051a20052006417f6a22013b01a629200341106a200341e0036a41d0031085051a0240200141ffff037141044b0d0002400240024020052802a0292206450d00200441016a21090240024020052f01a42922080d0020062f01a6290d01200341f4036a4101360200200342013702e403200341f4a9c2003602e003200341043602c40720034188a4c2003602c0072003200341c0076a3602f003200341e0036a4190a4c200103a000b024020062008417f6a22084102746a41a8296a280200220d2f01a629200141ffff03716a41016a410b4b0d00200341f8036a2005360200200341f0036a200d360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341b0076a200341e0036a41012007108c010c040b200341f8036a2005360200200341f0036a200d360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341e0036a4101108d012003200c3602b8070c020b0240200141ffff0371200841027420066a41ac296a28020022012f01a6296a41016a410b4b0d00200341f8036a2001360200200341f0036a2005360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341b0076a200341e0036a41002007108c010c030b200341f8036a2001360200200341f0036a2005360200200320043602f403200320043602ec03200320083602e803200320063602e403200320093602e003200341e0036a4101108e010b200320073602b8070b200320053602b407200320043602b0070b20032802b807210720032802b007210420032802b40722052802a0292201450d0020012f01a629220941044b0d00200441016a21060240034020012802a0292208450d01200941ffff03712109200641016a210d024002400240024020012f01a429220c0d0020082f01a6290d01200341f4036a4101360200200342013702e403200341f4a9c2003602e003200341043602c40720034188a4c2003602c0072003200341c0076a3602f003200341e0036a4190a4c200103a000b2008200c417f6a220e4102746a41a8296a280200210c200320013602d807200320063602d4072003200c3602d007200320063602cc072003200e3602c807200320083602c4072003200d3602c00702402009200c2f01a6296a41016a410b4b0d00200341e0036a41186a200341c0076a41186a280200360200200341e0036a41106a200341c0076a41106a290300370300200341e0036a41086a200341c0076a41086a290300370300200320032903c0073703e003200341086a200341e0036a108f01200328020c2101200328020821060c030b200341c0076a410520096b108d010c010b2003200c41027420086a41ac296a280200220e3602d807200320063602d407200320013602d007200320063602cc072003200c3602c807200320083602c4072003200d3602c00702402009200e2f01a6296a41016a410b4b0d00200341e0036a41186a200341c0076a41186a280200360200200341e0036a41106a200341c0076a41106a290300370300200341e0036a41086a200341c0076a41086a290300370300200320032903c0073703e0032003200341e0036a108f0120032802042101200328020021060c020b200341c0076a410520096b108e010b410021010b2001450d0220012f01a629220941044d0d000c020b0b200941ffff03710d00200241013a00000b2000200341106a41d003108505220141d8036a200a3703002001200b3703d003200141e8036a2007360200200141e4036a2005360200200120043602e003200341e0076a24000bd80402077f047e200341d1036a2104034020022f01ae2b210520022106410021070240024003400240200722082005470d00200521080c030b024020032006109101220941ff01710d00024002400240024002400240024020032d00d003220920062d00d0032207470d002009417f6a0e06060102030405090b417f410120092007491b21090c060b20094102470d072004200641d1036a41041088052209450d07417f410120094100481b21090c050b20094103470d062004200641d1036a41081088052209450d06417f410120094100481b21090c040b20094104470d052004200641d1036a41101088052209450d05417f410120094100481b21090c030b20094105470d042004200641d1036a41201088052209450d04417f410120094100481b21090c020b20094106470d03024020032802d403200641d4036a280200200641dc036a280200220920032802dc032207200720094b1b108805220a0d00417f200720094720072009491b21090c020b417f4101200a4100481b21090c010b20094101470d02417f20032903d803220b20062903d803220c85200341e0036a290300220d200641e0036a290300220e8584420052200b200c54200d200e54200d200e511b1b21090b200841016a2107200641f8036a2106200941ff01714101460d000b200941187441187541016a0e020100010b20002001360204200041003602002000410c6a2008360200200041086a20023602000f0b02402001450d002001417f6a2101200220084102746a41b02b6a28020021020c010b0b200042013702002000410c6a2008360200200041086a20023602000b952f01017f230041d00a6b22022400024020002802000d00200041086a2100024002400240024002400240024002400240024020012802000e09010203040506070800010b200241c8036a200141086a10f10120024180046a200141c0006a10f101200241b8046a200141f8006a10f101200241f0046a200141b0016a10f101200241a8056a200141e8016a10f101200241e0056a200141a0026a10f10120024198066a200141d8026a10f101200241d0066a20014190036a10f101200241c0076a200241c8036a41306a29030037030020024188076a41306a200241c8036a41286a29030037030020024188076a41286a200241c8036a41206a29030037030020024188076a41206a200241c8036a41186a29030037030020024188076a41186a200241c8036a41106a29030037030020024188076a41106a200241c8036a41086a29030037030020024188076a41c0006a200229038004370300200241d0076a20024180046a41086a290300370300200241d8076a20024180046a41106a290300370300200241e0076a20024180046a41186a290300370300200241e8076a20024180046a41206a290300370300200241f0076a20024180046a41286a290300370300200241f8076a20024180046a41306a290300370300200220022903c80337039007200241b0086a200241b8046a41306a290300370300200241a8086a200241b8046a41286a290300370300200241a0086a200241b8046a41206a29030037030020024198086a200241b8046a41186a29030037030020024190086a200241b8046a41106a29030037030020024188086a200241b8046a41086a29030037030020024188076a41f8006a20022903b804370300200241e8086a200241f0046a41306a290300370300200241e0086a200241f0046a41286a290300370300200241d8086a200241f0046a41206a290300370300200241d0086a200241f0046a41186a290300370300200241c8086a200241f0046a41106a290300370300200241c0086a200241f0046a41086a29030037030020024188076a41b0016a20022903f004370300200241a0096a200241a8056a41306a29030037030020024198096a200241a8056a41286a29030037030020024190096a200241a8056a41206a29030037030020024188096a200241a8056a41186a29030037030020024180096a200241a8056a41106a290300370300200241f8086a200241a8056a41086a29030037030020024188076a41e8016a20022903a805370300200241d8096a200241e0056a41306a290300370300200241d0096a200241e0056a41286a290300370300200241c8096a200241e0056a41206a290300370300200241c0096a200241e0056a41186a290300370300200241b8096a200241e0056a41106a290300370300200241b0096a200241e0056a41086a29030037030020024188076a41a0026a20022903e005370300200241900a6a20024198066a41306a290300370300200241880a6a20024198066a41286a290300370300200241800a6a20024198066a41206a290300370300200241f8096a20024198066a41186a290300370300200241f0096a20024198066a41106a290300370300200241e8096a20024198066a41086a29030037030020024188076a41d8026a200229039806370300200241c80a6a200241d0066a41306a290300370300200241c00a6a200241d0066a41286a290300370300200241b80a6a200241d0066a41206a290300370300200241b00a6a200241d0066a41186a290300370300200241a80a6a200241d0066a41106a290300370300200241a00a6a200241d0066a41086a29030037030020024188076a4190036a20022903d00637030020024208370388070c080b20024200370388070c070b200241d0066a200141086a10f101200241c0076a200241d0066a41306a29030037030020024188076a41306a200241d0066a41286a29030037030020024188076a41286a200241d0066a41206a29030037030020024188076a41206a200241d0066a41186a29030037030020024188076a41186a200241d0066a41106a29030037030020024188076a41106a200241d0066a41086a2903003703002002420137038807200220022903d006370390070c060b20024198066a200141086a10f101200241d0066a200141c0006a10f101200241c0076a20024198066a41306a29030037030020024188076a41306a20024198066a41286a29030037030020024188076a41286a20024198066a41206a29030037030020024188076a41206a20024198066a41186a29030037030020024188076a41186a20024198066a41106a29030037030020024188076a41106a20024198066a41086a29030037030020024188076a41c0006a20022903d006370300200241d0076a200241d0066a41086a290300370300200241d8076a200241d0066a41106a290300370300200241e0076a200241d0066a41186a290300370300200241e8076a200241d0066a41206a290300370300200241f0076a200241d0066a41286a290300370300200241f8076a200241d0066a41306a29030037030020022002290398063703900720024202370388070c050b200241e0056a200141086a10f10120024198066a200141c0006a10f101200241d0066a200141f8006a10f101200241c0076a200241e0056a41306a29030037030020024188076a41306a200241e0056a41286a29030037030020024188076a41286a200241e0056a41206a29030037030020024188076a41206a200241e0056a41186a29030037030020024188076a41186a200241e0056a41106a29030037030020024188076a41106a200241e0056a41086a29030037030020024188076a41c0006a200229039806370300200241d0076a20024198066a41086a290300370300200241d8076a20024198066a41106a290300370300200241e0076a20024198066a41186a290300370300200241e8076a20024198066a41206a290300370300200241f0076a20024198066a41286a290300370300200241f8076a20024198066a41306a290300370300200220022903e00537039007200241b0086a200241d0066a41306a290300370300200241a8086a200241d0066a41286a290300370300200241a0086a200241d0066a41206a29030037030020024198086a200241d0066a41186a29030037030020024190086a200241d0066a41106a29030037030020024188086a200241d0066a41086a29030037030020024188076a41f8006a20022903d00637030020024203370388070c040b200241a8056a200141086a10f101200241e0056a200141c0006a10f10120024198066a200141f8006a10f101200241d0066a200141b0016a10f101200241c0076a200241a8056a41306a29030037030020024188076a41306a200241a8056a41286a29030037030020024188076a41286a200241a8056a41206a29030037030020024188076a41206a200241a8056a41186a29030037030020024188076a41186a200241a8056a41106a29030037030020024188076a41106a200241a8056a41086a29030037030020024188076a41c0006a20022903e005370300200241d0076a200241e0056a41086a290300370300200241d8076a200241e0056a41106a290300370300200241e0076a200241e0056a41186a290300370300200241e8076a200241e0056a41206a290300370300200241f0076a200241e0056a41286a290300370300200241f8076a200241e0056a41306a290300370300200220022903a80537039007200241b0086a20024198066a41306a290300370300200241a8086a20024198066a41286a290300370300200241a0086a20024198066a41206a29030037030020024198086a20024198066a41186a29030037030020024190086a20024198066a41106a29030037030020024188086a20024198066a41086a29030037030020024188076a41f8006a200229039806370300200241e8086a200241d0066a41306a290300370300200241e0086a200241d0066a41286a290300370300200241d8086a200241d0066a41206a290300370300200241d0086a200241d0066a41186a290300370300200241c8086a200241d0066a41106a290300370300200241c0086a200241d0066a41086a29030037030020024188076a41b0016a20022903d00637030020024204370388070c030b200241f0046a200141086a10f101200241a8056a200141c0006a10f101200241e0056a200141f8006a10f10120024198066a200141b0016a10f101200241d0066a200141e8016a10f101200241c0076a200241f0046a41306a29030037030020024188076a41306a200241f0046a41286a29030037030020024188076a41286a200241f0046a41206a29030037030020024188076a41206a200241f0046a41186a29030037030020024188076a41186a200241f0046a41106a29030037030020024188076a41106a200241f0046a41086a29030037030020024188076a41c0006a20022903a805370300200241d0076a200241a8056a41086a290300370300200241d8076a200241a8056a41106a290300370300200241e0076a200241a8056a41186a290300370300200241e8076a200241a8056a41206a290300370300200241f0076a200241a8056a41286a290300370300200241f8076a200241a8056a41306a290300370300200220022903f00437039007200241b0086a200241e0056a41306a290300370300200241a8086a200241e0056a41286a290300370300200241a0086a200241e0056a41206a29030037030020024198086a200241e0056a41186a29030037030020024190086a200241e0056a41106a29030037030020024188086a200241e0056a41086a29030037030020024188076a41f8006a20022903e005370300200241e8086a20024198066a41306a290300370300200241e0086a20024198066a41286a290300370300200241d8086a20024198066a41206a290300370300200241d0086a20024198066a41186a290300370300200241c8086a20024198066a41106a290300370300200241c0086a20024198066a41086a29030037030020024188076a41b0016a200229039806370300200241a0096a200241d0066a41306a29030037030020024198096a200241d0066a41286a29030037030020024190096a200241d0066a41206a29030037030020024188096a200241d0066a41186a29030037030020024180096a200241d0066a41106a290300370300200241f8086a200241d0066a41086a29030037030020024188076a41e8016a20022903d00637030020024205370388070c020b200241b8046a200141086a10f101200241f0046a200141c0006a10f101200241a8056a200141f8006a10f101200241e0056a200141b0016a10f10120024198066a200141e8016a10f101200241d0066a200141a0026a10f101200241c0076a200241b8046a41306a29030037030020024188076a41306a200241b8046a41286a29030037030020024188076a41286a200241b8046a41206a29030037030020024188076a41206a200241b8046a41186a29030037030020024188076a41186a200241b8046a41106a29030037030020024188076a41106a200241b8046a41086a29030037030020024188076a41c0006a20022903f004370300200241d0076a200241f0046a41086a290300370300200241d8076a200241f0046a41106a290300370300200241e0076a200241f0046a41186a290300370300200241e8076a200241f0046a41206a290300370300200241f0076a200241f0046a41286a290300370300200241f8076a200241f0046a41306a290300370300200220022903b80437039007200241b0086a200241a8056a41306a290300370300200241a8086a200241a8056a41286a290300370300200241a0086a200241a8056a41206a29030037030020024198086a200241a8056a41186a29030037030020024190086a200241a8056a41106a29030037030020024188086a200241a8056a41086a29030037030020024188076a41f8006a20022903a805370300200241e8086a200241e0056a41306a290300370300200241e0086a200241e0056a41286a290300370300200241d8086a200241e0056a41206a290300370300200241d0086a200241e0056a41186a290300370300200241c8086a200241e0056a41106a290300370300200241c0086a200241e0056a41086a29030037030020024188076a41b0016a20022903e005370300200241a0096a20024198066a41306a29030037030020024198096a20024198066a41286a29030037030020024190096a20024198066a41206a29030037030020024188096a20024198066a41186a29030037030020024180096a20024198066a41106a290300370300200241f8086a20024198066a41086a29030037030020024188076a41e8016a200229039806370300200241d8096a200241d0066a41306a290300370300200241d0096a200241d0066a41286a290300370300200241c8096a200241d0066a41206a290300370300200241c0096a200241d0066a41186a290300370300200241b8096a200241d0066a41106a290300370300200241b0096a200241d0066a41086a29030037030020024188076a41a0026a20022903d00637030020024206370388070c010b20024180046a200141086a10f101200241b8046a200141c0006a10f101200241f0046a200141f8006a10f101200241a8056a200141b0016a10f101200241e0056a200141e8016a10f10120024198066a200141a0026a10f101200241d0066a200141d8026a10f101200241c0076a20024180046a41306a29030037030020024188076a41306a20024180046a41286a29030037030020024188076a41286a20024180046a41206a29030037030020024188076a41206a20024180046a41186a29030037030020024188076a41186a20024180046a41106a29030037030020024188076a41106a20024180046a41086a29030037030020024188076a41c0006a20022903b804370300200241d0076a200241b8046a41086a290300370300200241d8076a200241b8046a41106a290300370300200241e0076a200241b8046a41186a290300370300200241e8076a200241b8046a41206a290300370300200241f0076a200241b8046a41286a290300370300200241f8076a200241b8046a41306a290300370300200220022903800437039007200241b0086a200241f0046a41306a290300370300200241a8086a200241f0046a41286a290300370300200241a0086a200241f0046a41206a29030037030020024198086a200241f0046a41186a29030037030020024190086a200241f0046a41106a29030037030020024188086a200241f0046a41086a29030037030020024188076a41f8006a20022903f004370300200241e8086a200241a8056a41306a290300370300200241e0086a200241a8056a41286a290300370300200241d8086a200241a8056a41206a290300370300200241d0086a200241a8056a41186a290300370300200241c8086a200241a8056a41106a290300370300200241c0086a200241a8056a41086a29030037030020024188076a41b0016a20022903a805370300200241a0096a200241e0056a41306a29030037030020024198096a200241e0056a41286a29030037030020024190096a200241e0056a41206a29030037030020024188096a200241e0056a41186a29030037030020024180096a200241e0056a41106a290300370300200241f8086a200241e0056a41086a29030037030020024188076a41e8016a20022903e005370300200241d8096a20024198066a41306a290300370300200241d0096a20024198066a41286a290300370300200241c8096a20024198066a41206a290300370300200241c0096a20024198066a41186a290300370300200241b8096a20024198066a41106a290300370300200241b0096a20024198066a41086a29030037030020024188076a41a0026a200229039806370300200241900a6a200241d0066a41306a290300370300200241880a6a200241d0066a41286a290300370300200241800a6a200241d0066a41206a290300370300200241f8096a200241d0066a41186a290300370300200241f0096a200241d0066a41106a290300370300200241e8096a200241d0066a41086a29030037030020024188076a41d8026a20022903d00637030020024207370388070b2002200020024188076a10e00320022903004209510d0020024188076a200241c8031085051a20024188076a109c010b200241d00a6a24000b9003000240024020002802000d0002400240024002400240024002400240200041086a2802000e080900010203040506070b200041106a10f4010f0b200041106a10f401200041c8006a10f4010f0b200041106a10f401200041c8006a10f40120004180016a10f4010f0b200041106a10f401200041c8006a10f40120004180016a10f401200041b8016a10f4010f0b200041106a10f401200041c8006a10f40120004180016a10f401200041b8016a10f401200041f0016a10f4010f0b200041106a10f401200041c8006a10f40120004180016a10f401200041b8016a10f401200041f0016a10f401200041a8026a10f4010f0b200041106a10f401200041c8006a10f40120004180016a10f401200041b8016a10f401200041f0016a10f401200041a8026a10f401200041e0026a10f4010f0b200041106a10f401200041c8006a10f40120004180016a10f401200041b8016a10f401200041f0016a10f401200041a8026a10f401200041e0026a10f40120004198036a10f4010f0b200041086a280200450d00200028020410300b0be212030d7f027e077f230041a00e6b22032400200041d8036a28020021040240024002400240024002400240024002400240024002400240024002400240024002400240200041d4036a28020022052f01a6292206410a4b0d002005200441d0036c6a2107200441016a220820064d0d012007200041d0031085051a200541f0276a21070c020b410521064100210902400240200441054f0d0041042106200421070c010b41052107024002402004417b6a0e020201000b200441796a210741012109410621060c010b41002107410121090b20002802d003210a41a829102f220b450d05200b41003b01a629200b41003602a029200b20052f01a629220c2006417f736a22043b01a6292005200641d0036c6a2208280204210d2008280200210e200341d80a6a200841086a41c8031085051a2004410c4f0d06200c200641016a22086b2004470d07200541f0276a220f20064104746a220c41086a2903002110200c2903002111200b2005200841d0036c6a200441d0036c108505220c41f0276a200f20084104746a20044104741085051a200520063b01a62920034190076a200341d80a6a41c8031085051a200c200520091b2204200741d0036c6a210602400240200741016a220920042f01a62922084d0d002006200041d0031085051a200441f0276a21060c010b2004200941d0036c6a2006200820076b220f41d0036c1086051a2006200041d0031085051a200441f0276a220620094104746a200620074104746a200f4104741086051a0b200620074104746a22122002370308201220013703002004200841016a3b01a629200341c8036a20034190076a41c8031085051a2003200341c8036a41c803108505210f20052802a02922040d024100210a0c030b2005200841d0036c6a2007200620046b220c41d0036c1086051a2007200041d0031085051a200541f0276a220720084104746a200720044104746a200c4104741086051a0b200720044104746a22122002370308201220013703002005200641016a3b01a6290c0e0b201121012010210241002107200c2113200d2114200e2115034020042109200a2007470d0620052f01a429210820092f01a6292216410b490d024100210c41042105024020084105490d0020082105024002402008417b6a0e020201000b200841796a21084101210c410621050c010b410021084101210c410521050b41d829102f220b450d03200b41003b01a629200b41003602a029200b20092f01a62922172005417f736a22043b01a6292009200541d0036c6a2206280204210d2006280200210e200f41d80a6a200641086a41c8031085051a2004410c4f0d072017200541016a22076b2004470d08200941f0276a221720054104746a221841086a290300211020182903002111200b200641d0036a200441d0036c108505220641f0276a201720074104746a20044104741085051a200920053b01a629200f4190076a200f41d80a6a41c8031085051a20062f01a629220441016a21172004410c4f0d09201620056b22052017470d0a200a41016a210a200641a8296a200920074102746a41a8296a20054102741085051a4100210502400340200620054102746a41a8296a280200220720053b01a429200720063602a029200520044f0d01200520052004496a220520044d0d000b0b200f41c8036a200f4190076a41c8031085051a20062009200c1b22072f01a6292105200f41d80a6a200f41c8031085051a0240200841016a220420054b22170d002007200441d0036c6a2007200841d0036c6a200520086b41d0036c1086051a0b2007200841d0036c6a220c2014360204200c2015360200200c41086a200f41d80a6a41c8031085051a200741f0276a2116024020170d00201620044104746a201620084104746a200520086b4104741086051a0b200541016a210c201620084104746a2216200237030820162001370300200741a8296a21160240200841026a2215200541026a22144f0d00201620154102746a201620044102746a200520086b4102741086051a0b201620044102746a20133602002007200c3b01a6290240200420144f0d00200720084102746a41ac296a2105034020052802002204200841016a22083b01a429200420073602a029200541046a2105200c2008470d000b0b200f200f41c8036a41c8031085051a201121012010210220092105200a210720062113200d2114200e211520092802a02922040d000b0b200f41d80a6a200f41c8031085051a20002802dc0322042802042206450d092004280200210741d829102f2205450d01200520063602a829200541003b01a629200541003602a029200641003b01a429200620053602a029200420053602042004200741016a3602002007200a470d0a20052f01a6292206410b4f0d0b2005200641016a22073b01a6292005200641d0036c6a2208200d3602042008200e360200200841086a200f41d80a6a41c8031085051a200520064104746a220641f8276a2010370300200641f0276a2011370300200541a8296a20074102746a200b360200200b20073b01a429200b20053602a0292004200428020841016a3602080c0d0b200f41d80a6a200f41c8031085051a0240201620084d0d002009200841d0036c6a220541d0036a2005201620086b41d0036c1086051a0b201641016a21062009200841d0036c6a2205201436020420052015360200200541086a200f41d80a6a41c8031085051a200941f0276a220720084104746a2104200841016a210502400240201620084b0d002004200137030020042002370308200941a8296a2104201641026a21070c010b200720054104746a2004201620086b22074104741086051a20042002370308200420013703002008410274200941a8296a22046a41086a200420054102746a20074102741086051a201641026a21070b2004200541027422086a2013360200200920063b01a629200520074f0d0b200820096a41a8296a210403402004280200220620053b01a429200620093602a029200441046a21042007200541016a2205470d000c0c0b0b102a000b2004410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b41b0a3c200413541e8a3c200102d000b2004410b41e8a2c2001042000b41f8a2c200412841a0a3c200102d000b2017410c41f8a3c2001042000b41f8a2c200412841a0a3c200102d000b41b2abc200412b41e0abc200102d000b41eaa0c2004130419ca1c200102d000b41aca1c200412041cca1c200102d000b20002802dc032205200528020841016a3602080b200341a00e6a240020120b5801017e02400240200341c00071450d0020022003413f71ad882101420021020c010b2003450d002002410020036b413f71ad8620012003413f71ad220488842101200220048821020b20002001370300200020023703080b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322067e22072003422088220820067e22062005200142208822097e7c22054220867c220a3703002000200820097e200420017e200320027e7c7c2005200654ad4220862005422088847c200a200754ad7c3703080b3601017f02402002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b6f01017f02400240200020016b20024f0d002001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b20030b5801017e02400240200341c00071450d0020012003413f71ad862102420021010c010b2003450d0020022003413f71ad2204862001410020036b413f71ad88842102200120048621010b20002001370300200020023703080b0b88af020300418080c0000be0ac02100010001c00000018020000050000006c6962726172792f616c6c6f632f7372632f7261775f7665632e7273c00010004b0000005a010000130000002b00000004000000040000002c0000002d0000002e0000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f72002b00000000000000010000002f000000a800100018000000420200001c0000006c6962726172792f616c6c6f632f7372632f666d742e72732f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f636f72652f7372632f666d742f6d6f642e72736c6962726172792f616c6c6f632f7372632f7665632f6d6f642e7273292073686f756c64206265203c3d206c656e2028697320000068011000150000002701100017000000eb0e1000010000000b0110001c000000d50600000d000000606174602073706c697420696e6465782028697320000000a001100020000000c0011000120000002b000000000000000100000030000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e6465782069732030303031303230333034303530363037303830393130313131323133313431353136313731383139323032313232323332343235323632373238323933303331333233333334333533363337333833393430343134323433343434353436343734383439353035313532353335343535353635373538353936303631363236333634363536363637363836393730373137323733373437353736373737383739383038313832383338343835383638373838383939303931393239333934393539363937393839390000ac02100010000000bc0210002200000072616e676520656e6420696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e677468205b2e2e2e5d00440310000b0000004a0d1000160000008303100001000000280d10000e000000360d1000040000003a0d1000100000008303100001000000440310000b0000004f0310002600000075031000080000007d0310000600000083031000010000006279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060608c031000020000002e2e0000c20310001b0000006500000014000000b003100012000000bc0210002200000072616e676520737461727420696e646578206c6962726172792f636f72652f7372632f666d742f6e756d2e727300010305050606030706080809110a1c0b190c140d100e0d0f0410031212130916011705180219031a071c021d011f1620032b032c022d0b2e01300331023201a702a902aa04ab08fa02fb05fd04fe03ff090046091000250000000a0000001c000000ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f00d11454964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f7475962f5f262e2fa7afb7bfc7cfd7df9a409798308f1fc0c1ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab35280b80e003190801042f043404070301070607110a500f1207550703041c0a090308030703020303030c0405030b06010e15053a0311070605100757070207150d500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a06213f4c042d0374083c030f033c0738082b0582ff1118082f112d032010210f808c048297190b158894052f053b07020e180980b32d740c80d61a0c0580ff0580df0cee0d03848d033709815c1480b80880cb2a38030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0046091000250000001a000000360000000006010103010402080809020a050b020e041001110212051311140115021702190d1c051d0824016a036b02bc02d102d40cd509d602d702da01e005e102e802ee20f004f802f902fa02fb010c273b3e4e4f8f9e9e9f060709363d3e56f3d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf79cc6e6f935e227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a8126524e28082a561c1417094e041e0f430e19070a0648082709750b3f412a063b050a0651060105100305808b621e48080a80a65e22450b0a060d1339070a362c041080c03c64530c48090a46451b4808531d398107460a1d03474937030e080a0639070a81361980b7010f320d839b66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b654b0439071140050b020e97f80884d62a09a2f7811f3103110408818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b80d52d031a040281703a0501850080d7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c040907020e06809a83d8080d030d03740c59070c140c0438080a062808224e81540c15030305070919070709030d072980cb250a84066c6962726172792f636f72652f7372632f756e69636f64652f7072696e7461626c652e7273007c09100016000000920910000d000000736c69636520696e64657820737461727473206174202062757420656e647320617420000003000083042000910560005d13a0001217a01e0c20e01eef2c202b2a30a02b6fa6602c02a8e02c1efbe02d00fea0359effe035fd016136010aa136240d6137ab0ee1382f182139301c6146f31ea14af06a614e4f6fa14e9dbc214f65d1e14f00da215000e0e15130e16153ece2a154d0e8e15420002e55f001bf55000d100028000000520000003e00000000700007002d0101010201020101480b30151001650702060202010423011e1b5b0b3a09090118040109010301052b03770f0120370101010408040103070a021d013a0101010204080109010a021a010202390104020402020303011e0203010b0239010405010204011402160601013a0101020104080107030a021e013b0101010c0109012801030139030503010407020b021d013a01020102010301050207020b021c02390201010204080109010a021d0148010401020301010801510102070c08620102090b064a021b0101010101370e01050102050b0124090166040106010202021902040310040d01020206010f01000300031d031d021e02400201070801020b09012d03770222017603040209010603db0202013a010107010101010208060a020130113f0430070101050128090c0220040202010338010102030101033a0802029803010d0107040106010302c63a01050001c32100038d016020000669020004010a200250020001030104011902050197021a120d012608190b2e0330010204020227014306020202020c0108012f01330101030202050201012a020801ee010201040100010010101000020001e201950500030102050428030401a50200040002990bb001360f3803310402024503240501083e010c0234090a0402015f03020101020601a0010308150239020101010116010e070305c308020301011701510102060101020101020102eb010204060201021b025508020101026a0101010206010165030204010500090102f5010a0201010401900402020401200a280602040801090602032e0d010200070106010152160207010201027a060301010201070101480203010101000200053b0700013f0451010002000101030405080802071e0494030037043208010e011605010f000701110207010201050007000400076d07006080f000000000000d1000280000004b00000028000000000d10002800000057000000160000006c6962726172792f636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f6620603d3d0000a40d100019000000bd0d100012000000cf0d10000c0000008303100001000000a40d100019000000bd0d100012000000cf0d10000c000000db0d100003000000617373657274696f6e206661696c65643a2060286c6566742020726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20426f72726f774572726f72426f72726f774d75744572726f7270616e69636b656420617420002d0e1000010000002e0e1000030000003c871000000000002c0e1000010000002c0e1000010000003a27272c2020202020000000580e1000200000003200000021000000580e10002000000033000000120000006c6962726172792f636f72652f7372632f666d742f6275696c646572732e7273880e1000200000005a000000050000006c6962726172792f636f72652f7372632f736c6963652f6d656d6368722e7273207b202c20207b0a2b0000000c000000040000003100000032000000330000002c0a00002b00000004000000040000003400000035000000360000007d207d28280a2c290a5d617373657274696f6e206661696c65643a202a63757272203e2031390000c20310001b000000e6010000050000005b000000380f1000150000004d0f10002b000000eb0e100001000000736f7572636520736c696365206c656e67746820282920646f6573206e6f74206d617463682064657374696e6174696f6e20736c696365206c656e67746820282b0000000400000004000000370000004c61796f757473697a655f616c69676e5f0000002b0000000400000004000000380000002b00000000000000010000003a0000002b00000000000000010000003b00000006de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e38548726d704368616e6e656c002b00000004000000040000000f0000002b00000004000000040000003c000000526f6f744d69736d61746368436f6e666967446d714d71634865616452656c61794469737061746368517565756553697a6548726d70496e67726573734368616e6e656c496e64657848726d704567726573734368616e6e656c496e646578416273656e7450726f6f664465636f6465456e7669726f6e6d656e74616c2065787465726e616c6974696573206e6f74207365742e95771000440000002b0000002d0000004e6f206f70656e207472616e73616374696f6e20746861742063616e20626520726f6c6c6564206261636b2e9577100044000000c30000000a0000004e6f206f70656e207472616e73616374696f6e20746861742063616e20626520636f6d6d69747465642e00009577100044000000c80000000a0000004c1c10002a000000a40000002b0000002b00000008000000040000003d0000003e0000003f0000004000000041000000420000004300000044000000a00000000800000045000000460000002b0000000c000000040000004700000048000000490000004a0000004b0000004c0000004d0000002b0000000c000000040000004e0000004f00000000000000000000000012100005000000000000000000000000121000050000000000000001000000020000000000000000000000081210000700000000000000010000007368656c6c000000df6acb689907609b0300000037e397fc7c91f5e40100000040fe3ad401f8959a05000000d2bc9897eed08f1502000000f78b278be53f454c02000000ab3c0572291feb8b01000000ea93e3f16f3d69620100000053797374656d50617261636861696e53797374656d50617261636861696e496e666f43756d756c757358636d2b00000000000000010000005000000051000000520000002b0000000000000001000000500000005000000052000000446973616c6c6f775369676e65640000000000005c121000060000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000055000000000000000000000000000000560000000000000000000000000000005700000000000000000000000000000000000000621210000f000000000000005800000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000005a0000000000000000000000000000005b0000000000000000000000000000005c00000000000000000000000100000000000000711210000d000000000000005d0000000000000000000000000000000000000000000000000000000200000000000000000000000000000002000000000000000000000000000000000000005b0000000000000000000000000000005b000000000000000000000002000000000000007e1210000a000000000000005e000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000005f0000000000000000000000000000005b0000000000000000000000000000005b0000000000000000000000030000006c6f636174696f6e20616e6420726573756c7420626567696e20657175616c3b2073616d652073697a653b2071656400c8141000660000009e0000001f0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f706f6c6b61646f742d343033386632376435653465613265382f363239623836392f78636d2f78636d2d6275696c6465722f7372632f6c6f636174696f6e5f636f6e76657273696f6e2e7273616c7265616479206d757461626c7920626f72726f77656400002b00000000000000010000003a000000a81510005900000021000000170000002b00000000000000010000003b000000a8151000590000002300000019000000a8151000590000002800000018000000cc721000530000006d0000000b0000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f656e7669726f6e6d656e74616c2d312e312e322f7372632f6c6f63616c5f6b65792e7273000000cc721000530000008a00000016000000cc721000530000008f00000029000000b4161000190000004c1c10002a0000008c0200000d00000093161000210000004c1c10002a000000900200000d0000006c161000270000004c1c10002a000000940200000d00000052656c617920706172656e742073746f7261676520726f6f7420646f65736e2774206d6174636852656c617920706172656e74206e756d62657220646f65736e2774206d61746368506172656e74206865616420646f65736e2774206d617463680000002b00000004000000040000006000000061000000620000002c17100066000000200000000e000000617373657274696f6e206661696c65643a206d6964203c3d2073656c662e6c656e2829009c8810004d000000ff050000090000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f7665635f64657175652f72696e675f736c696365732e727348617368207461626c65206361706163697479206f766572666c6f770000c0171000530000004f000000280000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e392e312f7372632f7261772f6d6f642e72730000000000f4181000130000000000000008191000010000000000000000000000101910001400000000000000241910000100000000000000000000002c191000060000000000000034191000020000000000000000000000441910001a0000000000000060191000010000000000000000000000681910001d0000000000000088191000010000000000000000000000901910000c000000000000009c191000010000000000000000000000a41910001100000000000000b8191000010000000000000000000000c01910000c00000000000000cc19100001000000000000004f7665726c617070696e67557067726164657300a51b10004600000050726f686962697465644279506f6c6b61646f74521b100053000000546f6f4269670000f11a100052000000431b10000f00000056616c69646174696f6e446174614e6f74417661696c61626c650000aa1a100047000000486f7374436f6e66696775726174696f6e4e6f74417661696c61626c65000000601a10004a0000004e6f745363686564756c6564291a1000370000004e6f7468696e67417574686f72697a6564000000041a100025000000556e617574686f72697a6564d4191000300000002054686520676976656e20636f6465207570677261646520686173206e6f74206265656e20617574686f72697a65642e204e6f20636f6465207570677261646520686173206265656e20617574686f72697a65642e204e6f2076616c69646174696f6e2066756e6374696f6e20757067726164652069732063757272656e746c79207363686564756c65642e2054686520696e686572656e7420776869636820737570706c6965732074686520686f737420636f6e66696775726174696f6e20646964206e6f742072756e207468697320626c6f636b2054686520696e686572656e7420776869636820737570706c696573207468652076616c69646174696f6e206461746120646964206e6f742072756e207468697320626c6f636b2054686520737570706c6965642076616c69646174696f6e2066756e6374696f6e2068617320636f6d70696c656420696e746f206120626c6f62206c6172676572207468616e20506f6c6b61646f742069732077696c6c696e6720746f2072756e20506f6c6b61646f742063757272656e746c792070726f68696269747320746869732070617261636861696e2066726f6d20757067726164696e67206974732076616c69646174696f6e2066756e6374696f6e20417474656d707420746f20757067726164652076616c69646174696f6e2066756e6374696f6e207768696c65206578697374696e6720757067726164652070656e64696e67737973693133333776616c69646174696f6e2066756e6374696f6e20706172616d732061726520616c7761797320696e6a656374656420696e746f20696e686572656e7420646174613b207165640000004c1c10002a00000025020000120000002f6275696c642f70616c6c6574732f70617261636861696e2d73797374656d2f7372632f6c69622e7273656e6163745f617574686f72697a65645f75706772616465617574686f72697a655f757067726164657375646f5f73656e645f7570776172645f6d6573736167657365745f76616c69646174696f6e5f646174617365745f757067726164655f626c6f636b56616c69646174696f6e44617461206d7573742062652075706461746564206f6e6c79206f6e636520696e206120626c6f636b00004c1c10002a0000001c0100000d0000003a636f6465000000f01d1000220000004c1c10002a0000003f010000190000004c1c10002a000000c002000009000000617373657274696f6e206661696c65643a20696e67726573735f6368616e6e656c732e62696e6172795f7365617263685f62795f6b65792873656e6465722c207c2628732c205f297c2073292e69735f6f6b28294c1c10002a000000db0200000d000000617373657274696f6e206661696c65643a206375725f68656164203d3d207461726765745f686561640000004c1c10002a000000230300000d000000696e76616c69642072656c617920636861696e206d65726b6c652070726f6f663a20000000000000f01e10001800000000000000081f1000010000000000000000000000101f1000020000000000000000000000201f10001900000000000000081f10000100000000000000000000003c1f1000010000000000000000000000441f10001100000000000000581f1000010000000000000000000000601f1000010000000000000000000000681f10001800000000000000801f1000010000000000000000000000881f1000020000000000000000000000981f10001900000000000000b41f1000020000000000000000000000c41f1000020000000000000056616c69646174696f6e46756e6374696f6e53746f726564682110001500000006211000540000005a2110000e00000056616c69646174696f6e46756e6374696f6e4170706c696564000000b42010005200000055706772616465417574686f72697a65640000004e4c1000040000009420100020000000446f776e776172644d65737361676573526563656976656413541000030000004720100041000000882010000c000000446f776e776172644d6573736167657350726f63657373656400000030201000060000003620100011000000d41f1000390000000d2010002300000020446f776e77617264206d6573736167657320776572652070726f636573736564207573696e672074686520676976656e207765696768742e205c5b207765696768745f757365642c20726573756c745f6d71635f68656164205c5d57656967687472656c61795f636861696e3a3a4861736820536f6d6520646f776e77617264206d657373616765732068617665206265656e20726563656976656420616e642077696c6c2062652070726f6365737365642e205c5b20636f756e74205c5d20416e207570677261646520686173206265656e20617574686f72697a65642e205468652076616c69646174696f6e2066756e6374696f6e20776173206170706c696564206173206f662074686520636f6e7461696e65642072656c617920636861696e20626c6f636b206e756d6265722e205468652076616c69646174696f6e2066756e6374696f6e20686173206265656e207363686564756c656420746f206170706c79206173206f662074686520636f6e7461696e65642072656c617920636861696e20626c6f636b206e756d6265722e52656c6179436861696e426c6f636b4e756d62657200000000000000ca1c100011000000000000005c22100001000000000000000000000074221000060000000000000000000000b71c10001300000000000000a4221000010000000000000000000000bc2210000900000000000000000000009f1c10001800000000000000042310000100000000000000000000003c8710000000000000000000000000008e1c100011000000000000001c2310000100000000000000000000003c871000000000000000000000000000761c10001800000000000000804f10000100000000000000000000003c87100000000000000000000000000006261000110000000000000068211000150000009f241000580000003c87100000000000f7241000550000004c25100056000000a225100055000000f72510000f000000000000008624100004000000000000008a2410001500000051231000210000003c871000000000007223100051000000c3231000230000003c87100000000000e6231000350000003c871000000000001b241000490000006424100022000000000000003d2310000700000000000000442310000d00000000000000342310000900000000000000f25f100007000000636f64655f686173686d6573736167655570776172644d65737361676520536574207468652063757272656e742076616c69646174696f6e20646174612e20546869732073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e207068617365206966207468652063616c6c20776173206e6f7420696e766f6b65642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e746020417320612073696465206566666563742c20746869732066756e6374696f6e207570677261646573207468652063757272656e742076616c69646174696f6e2066756e6374696f6e2069662074686520617070726f7072696174652074696d652068617320636f6d652e6461746150617261636861696e496e686572656e744461746120466f72636520616e20616c7265616479207363686564756c65642076616c69646174696f6e2066756e6374696f6e207570677261646520746f2068617070656e206f6e206120706172746963756c617220626c6f636b2e204e6f7465207468617420636f6f7264696e6174696e67207468697320626c6f636b20666f722074686520757067726164652068617320746f2068617070656e20696e646570656e64656e746c79206f6e207468652072656c617920636861696e20616e6420746869732070617261636861696e2e2053796e6368726f6e697a696e672074686520626c6f636b20666f722074686520757067726164652069732073656e7369746976652c20616e64207468697320627970617373657320616c6c20636865636b7320616e6420616e64206e6f726d616c2070726f746f636f6c732e2056657279206561737920746f20627269636b20796f757220636861696e20696620646f6e652077726f6e672e72656c61795f636861696e5f626c6f636b0000000000a02c10001c00000000000000000000006821100015000000000000000000000000000000000000000000000000000000000000003c871000bc2c10000000000000000000cc2c100004000000000000000000000000000000ec2c10001500000000000000000000008a52100007000000000000000000000000000000000000000000000000000000000000003c871000042d10000000000000000000142d1000030000000000000001000000000000002c2d10000e00000000000000000000003a2d100017000000000000000000000000000000000000000000000000000000000000003c871000542d10000000000000000000642d1000010000000000000000000000000000006c2d1000140000000000000000000000c561100004000000000000000000000000000000000000000000000000000000000000003c871000802d10000000000000000000902d100001000000000000000100000000000000982d10000b0000000000000000000000a32d100018000000000000000000000000000000000000000000000000000000000000003c871000bc2d10000000000000000000cc2d100001000000000000000100000000000000d42d1000160000000000000000000000ea2d100016000000000000000000000000000000000000000000000000000000000000003c871000002e10000000000000000000102e100007000000000000000000000000000000482e1000110000000000000000000000592e100019000000000000000000000000000000000000000000000000000000000000003c871000742e10000000000000000000842e100006000000000000000000000000000000b42e10000e0000000000000000000000c22e100011000000000000000000000000000000000000000000000000000000000000003c871000d42e10000000000000000000e42e100004000000000000000100000000000000042f1000100000000000000000000000142f100023000000000000000000000000000000000000000000000000000000000000003c871000382f10000000000000000000482f100004000000000000000100000000000000682f10001900000000000000000000001354100003000000000000000000000000000000000000000000000000000000000000003c871000bc2d10000000000000000000842f1000030000000000000001000000000000009c2f10001100000000000000000000008a52100007000000000000000000000000000000000000000000000000000000000000003c871000b02f10000000000000000000c02f100004000000000000000000000000000000e02f10000d0000000000000000000000ed2f10001c000000000000000000000000000000000000000000000000000000000000003c871000bc2d100000000000000000000c30100003000000000000000100000000000000243010001400000000000000000000003830100018000000000000000000000000000000000000000000000000000000000000003c8710005030100000000000000000006030100003000000000000000100000000000000783010000e00000000000000000000008630100012000000000000000000000000000000000000000000000000000000000000003c871000983010000000000000000000a830100003000000000000000100000000000000c03010001500000000000000000000008630100012000000000000000000000000000000000000000000000000000000000000003c871000983010000000000000000000d830100001000000000000000100000000000000e03010002100000000000000000000001354100003000000000000000000000000000000000000000000000000000000000000003c871000bc2d100000000000000000000431100002000000000000000100000000000000143110001a00000000000000000000003020100006000000000000000000000000000000000000000000000000000000000000003c8710003031100000000000000000004031100002000000000000000000000000000000503110001900000000000000000000003020100006000000000000000000000000000000000000000000000000000000000000003c8710003031100000000000000000006c311000020000000000000000000000000000007c311000110000000000000000000000f25f100007000000000000000000000000000000000000000000000000000000000000003c871000903110000000000000000000a031100001000000000000000000000050656e64696e6752656c6179436861696e426c6f636b4e756d6265722b0000000000000001000000630000001e3910004200000060391000280000008839100042000000ca3910004900000050656e64696e6756616c69646174696f6e436f64650000002b0000000000000001000000640000005138100044000000953810004a000000df3810003f00000056616c69646174696f6e4461746150657273697374656456616c69646174696f6e446174610000002b0000000000000001000000630000001d3810003400000044696453657456616c69646174696f6e436f64652b000000000000000100000063000000e5371000380000004c6173745570677261646572656c61795f636861696e3a3a426c6f636b4e756d626572002b0000000000000001000000650000009a3710004b00000052656c6576616e744d6573736167696e6753746174654d6573736167696e675374617465536e617073686f742b0000000000000001000000630000002f3710005900000088371000120000003c87100000000000563610005b000000b1361000530000003c87100000000000043710002b000000486f7374436f6e66696775726174696f6e4162726964676564486f7374436f6e66696775726174696f6e00002b0000000000000001000000630000000c3610004a0000003c87100000000000563610005b000000b1361000530000003c87100000000000043710002b0000004c617374446d714d7163486561644d6573736167655175657565436861696e002b000000000000000100000066000000cf3510003d0000003c871000000000005e35100059000000b7351000180000004c61737448726d704d7163486561647342547265654d61703c5061726149642c204d6573736167655175657565436861696e3e002b0000000000000001000000670000000c351000520000003c871000000000005e35100059000000b73510001800000050726f636573736564446f776e776172644d65737361676573000000da341000320000003c87100000000000bd3310003b0000004e657756616c69646174696f6e436f64650000002b000000000000000100000063000000493410002d0000003c871000000000007634100059000000cf3410000b00000048726d7057617465726d61726b72656c61795f636861696e3a3a76313a3a426c6f636b4e756d62657200000021341000280000003c87100000000000bd3310003b00000048726d704f7574626f756e644d657373616765735665633c4f7574626f756e6448726d704d6573736167653e2b000000000000000100000068000000f8331000290000003c87100000000000bd3310003b0000005570776172644d657373616765735665633c5570776172644d6573736167653e2b000000000000000100000068000000923310002b0000003c87100000000000bd3310003b00000050656e64696e675570776172644d65737361676573000000463310004c000000416e6e6f756e63656448726d704d6573736167657350657243616e646964617465000000b1321000590000000a3310003c000000526573657276656458636d705765696768744f7665727269646500002b0000000000000001000000630000005a321000570000002c3210002e0000005265736572766564446d705765696768744f76657272696465000000d6311000560000002c3210002e000000417574686f72697a6564557067726164650000002b000000000000000100000063000000a83110002e00000020546865206e65787420617574686f72697a656420757067726164652c206966207468657265206973206f6e652e205468652077656967687420776520726573657276652061742074686520626567696e6e696e67206f662074686520626c6f636b20666f722070726f63657373696e6720444d50206d657373616765732e2054686973206f76657272696465732074686520616d6f756e742073657420696e2074686520436f6e6669672074726169742e205468652077656967687420776520726573657276652061742074686520626567696e6e696e67206f662074686520626c6f636b20666f722070726f63657373696e672058434d50206d657373616765732e205468697320546865206e756d626572206f662048524d50206d65737361676573207765206f6273657276656420696e20606f6e5f696e697469616c697a656020616e64207468757320757365642074686174206e756d62657220666f7220616e6e6f756e63696e672074686520776569676874206f6620606f6e5f696e697469616c697a656020616e6420606f6e5f66696e616c697a65602e20557077617264206d65737361676573207468617420617265207374696c6c2070656e64696e6720616e64206e6f74207965742073656e6420746f207468652072656c617920636861696e2e20557077617264206d65737361676573207468617420776572652073656e7420696e206120626c6f636b2e20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b2e2048524d50206d65737361676573207468617420776572652073656e7420696e206120626c6f636b2e2048524d502077617465726d61726b2074686174207761732073657420696e206120626c6f636b2e204e65772076616c69646174696f6e20636f64652074686174207761732073657420696e206120626c6f636b2e20546869732077696c6c20626520636c656172656420696e20606f6e5f696e697469616c697a6560206f662065616368206e657720626c6f636b206966206e6f206f746865722070616c6c657420616c726561647920736574207468652076616c75652e204e756d626572206f6620646f776e77617264206d657373616765732070726f63657373656420696e206120626c6f636b2e20546865206d65737361676520717565756520636861696e2068656164732077652068617665206f62736572766564207065722065616368206368616e6e656c20696e636f6d696e67206368616e6e656c2e20546869732076616c7565206973206c6f61646564206265666f726520616e642073617665642061667465722070726f63657373696e6720696e626f756e6420646f776e77617264206d657373616765732063617272696564206279207468652073797374656d20696e686572656e742e20546865206c61737420646f776e77617264206d65737361676520717565756520636861696e20686561642077652068617665206f627365727665642e205468652070617261636861696e20686f737420636f6e66696775726174696f6e207468617420776173206f627461696e65642066726f6d207468652072656c617920706172656e742e2054686973206669656c64206973206d65616e7420746f2062652075706461746564206561636820626c6f636b2077697468207468652076616c69646174696f6e206461746120696e686572656e742e205468657265666f72652c206265666f72652070726f63657373696e67206f662074686520696e686572656e742c20652e672e20696e20606f6e5f696e697469616c697a656020746869732064617461206d6179206265207374616c652e2054686973206461746120697320616c736f20616273656e742066726f6d207468652067656e657369732e2054686520736e617073686f74206f6620736f6d652073746174652072656c6174656420746f206d6573736167696e672072656c6576616e7420746f207468652063757272656e742070617261636861696e20617320706572207468652072656c617920706172656e742e20546865206c6173742072656c617920706172656e7420626c6f636b206e756d626572206174207768696368207765207369676e616c6c65642074686520636f646520757067726164652e2057657265207468652076616c69646174696f6e20646174612073657420746f206e6f74696679207468652072656c617920636861696e3f20546865205b6050657273697374656456616c69646174696f6e44617461605d2073657420666f72207468697320626c6f636b2e20546865206e65772076616c69646174696f6e2066756e6374696f6e2077652077696c6c207570677261646520746f207768656e207468652072656c617920636861696e2072656163686573205b6050656e64696e6752656c6179436861696e426c6f636b4e756d626572605d2e2041207265616c2076616c69646174696f6e2066756e6374696f6e206d7573742065786973742068657265206173206c6f6e67206173205b6050656e64696e6752656c6179436861696e426c6f636b4e756d626572605d206973207365742e205765206e65656420746f2073746f726520746865206e65772076616c69646174696f6e2066756e6374696f6e20666f7220746865207370616e206265747765656e2073657474696e6720697420616e64206170706c79696e672069742e2049662069742068617320612076616c75652c207468656e205b6050656e64696e6756616c69646174696f6e436f6465605d206d75737420686176652061207265616c2076616c75652c20616e6420746f6765746865722077696c6c20636f6f7264696e6174652074686520626c6f636b206e756d6265722077686572652074686520757067726164652077696c6c2068617070656e2e63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65744469676573744974656d206e6f7420657175616c0000803a100050000000840000001e000000803a1000500000008400000026000000803a100050000000840000002c0000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d726f6f742d302e31362e302f7372632f6c69622e7273617373657274696f6e206661696c65643a2073656c662e6361702829203d3d206f6c645f636170202a2032000c3b10005e0000002d0800000d0000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f7665635f64657175652f6d6f642e727300002b000000010000000100000069000000803a100050000000fb00000022000000803a1000500000000c01000031000000803a1000500000002b0100002f000000803a1000500000002c0100002e000000803a1000500000003b0100001a000000307210004a0000003604000015000000307210004a000000440400001e000000307210004a0000004d04000018000000307210004a0000004e04000019000000307210004a000000510400001a000000307210004a00000071030000360000004372756d623a3a696e6372656d656e7420616e64205472696544424e6f64654974657261746f722061726520696d706c656d656e74656420736f2074686174207468652061626f76652061726d732061726520746865206f6e6c7920706f737369626c652073746174657300983d100053000000460100001a0000006d6574686f6420776f756c6420686176652065786974656420617420746f70206f662070726576696f757320626c6f636b20696620747269616c207765726520656d7074793b747269616c20636f756c64206e6f742068617665206265656e206d6f6469666965642077697468696e2074686520626c6f636b2073696e63652069742077617320696d6d757461626c7920626f72726f7765643b716564000000983d100053000000760100001a000000983d100053000000500100001a000000983d1000530000005e0100001a000000983d1000530000006c0100001a000000983d100053000000380100002f0000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e322f7372632f6974657261746f722e727364657363656e645f696e746f5f6e6f6465207075736865732061206372756d62206f6e746f2074686520747269616c3b20746875732074686520747261696c206973206e6f6e2d656d7074793b20716564983d10005300000076000000160000002b00000008000000040000006a0000002b00000000000000010000006b000000a444100060000000e40000003f000000a444100060000000f900000016000000a4441000600000002201000033000000a4441000600000004601000043000000a4441000600000001101000016000000a444100060000000cb00000027000000a4441000600000003901000012000000a4441000600000005b0100000e000000a444100060000000b20200000b0000005765206861766520726573657420746865206f7665726c61792061626f76652c20736f2077652063616e206e6f7420626520696e207468652072756e74696d653b207165640000002b00000000000000010000006c000000a444100060000000b70200000e000000546869732069732061207370656369616c20666e206f6e6c7920666f722062656e63686d61726b696e67207768657265206120646174616261736520636f6d6d69742068617070656e732066726f6d207468652072756e74696d652e0a09466f72207468617420726561736f6e20636c69656e742073746172746564207472616e73616374696f6e73206265666f72652063616c6c696e6720696e746f2072756e74696d6520617265206e6f7420616c6c6f7765642e0a09576974686f757420636c69656e74207472616e73616374696f6e7320746865206c6f6f7020636f6e646974696f6e20676172616e7475656573207468652073756363657373206f662074686520747820636c6f73652e00002b00000000000000010000006d000000a444100060000000aa02000031000000a444100060000000c40200000b000000a444100060000000bc0200002f000000f740100007000000dc4010001b000000c48710000200000090471000330000002a0100000100000042616420696e70757420646174612070726f766964656420746f2076657273696f6e0000084110000d000000657865637574655f626c6f636b0000002041100010000000696e697469616c697a655f626c6f636b38411000080000006d65746164617461484110000f0000006170706c795f65787472696e73696300604110000e00000066696e616c697a655f626c6f636b00007841100013000000696e686572656e745f65787472696e7369637300944110000f000000636865636b5f696e686572656e747300ac4110001400000076616c69646174655f7472616e73616374696f6ec84110000f0000006f6666636861696e5f776f726b657200e0411000130000006465636f64655f73657373696f6e5f6b65797300fc4110001500000067656e65726174655f73657373696f6e5f6b6579730000001c42100016000000636f6c6c6563745f636f6c6c6174696f6e5f696e666f2f6275696c642f70616c6c6574732f78636d2f7372632f6c69622e727300cc42100015000000e14210001d00000070617261636861696e5f696e666f3a3a70616c6c65742f6275696c642f706f6c6b61646f742d70617261636861696e732f70616c6c6574732f70617261636861696e2d696e666f2f7372632f6c69622e727363756d756c75735f70616c6c65745f78636d3a3a70616c6c6574e29c85206e6f206d6967726174696f6e20666f72202c2073657474696e672073746f726167652076657273696f6e20746f2050726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564868210005c0000005701000011000000684310003d000000000000000000000000000000868210005c0000005e01000011000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b20716564000000868210005c000000830100001100000000000000000000000000000000000000868210005c0000008a0100001100000000000000304410000b00000000000000000000003b44100006000000000000000000000000000000000000000000000000000000000000003c8710004444100000000000000000003c87100000000000000000000100000050617261636861696e49645061726149640000002b00000000000000010000006e00000045787465726e616c6974696573206e6f7420616c6c6f77656420746f206661696c2077697468696e2072756e74696d652b00000000000000010000006b000000a444100060000000fb010000260000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f73746174652d6d616368696e652f7372632f6578742e727390831000780000008b0000002100000000000000984510000d00000000000000a8451000010000000000000000000000b0451000020000000000000000000000c04510001200000000000000a8451000010000000000000000000000d4451000020000000000000000000000e44510001000000000000000f4451000020000000000000000000000044610000200000000000000496e76616c6964466f726d617400000058461000070000009f461000210000009646100009000000556e737570706f7274656456657273696f6e0000664610003000000096461000090000004578656375746564446f776e7761726458461000070000005f461000070000001446100032000000464610001200000020446f776e77617264206d65737361676520657865637574656420776974682074686520676976656e206f7574636f6d652e205c5b2069642c206f7574636f6d65205c5d5b75383b20385d4f7574636f6d6520446f776e77617264206d65737361676520697320756e737570706f727465642076657273696f6e206f662058434d2e205c5b206964205c5d20446f776e77617264206d65737361676520697320696e76616c69642058434d2efc8810005e000000710000002e000000fc8810005e0000009000000034000000fc8810005e0000006900000034000000fc8810005e000000ba00000009000000fc8810005e000000b300000009000000fc8810005e000000d400000011000000fc8810005e000000d9000000090000003a5f5f50414c4c45545f56455253494f4e5f5f3a5472616e73616374696f6e207761732062652067656e6572617465642061732070617274206f66206073746f726167655f726f6f74603b20716564002c861000720000002b0200000e0000002f6275696c642f706f6c6b61646f742d70617261636861696e732f7368656c6c2d72756e74696d652f7372632f6c69622e727372656d61726b5f776974685f6576656e746b696c6c5f7072656669786b696c6c5f73746f726167657365745f73746f726167657365745f6368616e6765735f747269655f636f6e6669677365745f636f64655f776974686f75745f636865636b737365745f636f64657365745f686561705f706167657372656d61726b66696c6c5f626c6f636b0000da48100007000000e14810005200000072756e74696d653a3a6672616d652d737570706f72746672616d655f73797374656d3a3a70616c6c65742f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f6672616d652f73797374656d2f7372632f6c69622e7273e29aa0efb88f20206465636c6172657320696e7465726e616c206d6967726174696f6e7320287768696368202a6d696768742a2065786563757465292c2073657474696e672073746f726167652076657273696f6e20746f20002b00000000000000010000006f0000003a6865617070616765733a6368616e6765735f7472696500874910001a000000a14910000300000072756e74696d653a3a73797374656d6672616d655f73797374656d45787472696e736963206661696c656420617420626c6f636b28293a204e6f646520697320636f6e6669677572656420746f20757365207468652073616d6520686173683b2071656486481000540000005f0500000e000000864810005400000067050000160000004e6f6e44656661756c74436f6d706f736974654661696c6564546f4578747261637452756e74696d6556657273696f6e5370656356657273696f6e4e65656473546f496e637265617365496e76616c6964537065634e616d654e6f6e5a65726f526566436f756e7400000000604b10001000000000000000704b1000010000000000000000000000784b1000010000000000000000000000804b10000f00000000000000904b1000020000000000000000000000a04b1000010000000000000000000000a84b10000b000000000000003c871000000000000000000000000000b44b1000010000000000000000000000bc4b10000a00000000000000c84b1000010000000000000000000000d04b1000010000000000000000000000d84b10000d00000000000000c84b1000010000000000000000000000e84b1000010000000000000000000000f04b10000800000000000000f84b1000020000000000000000000000084c1000010000000000000045787472696e73696353756363657373d34c10000c000000df4c10002e00000045787472696e7369634661696c656400c64c10000d000000d34c10000c000000a14c100025000000436f646555706461746564008c4c1000150000004e65774163636f756e740000454c1000090000006d4c10001f0000004b696c6c65644163636f756e74000000524c10001b00000052656d61726b6564454c1000090000004e4c100004000000104c100035000000204f6e206f6e2d636861696e2072656d61726b2068617070656e65642e205c5b6f726967696e2c2072656d61726b5f686173685c5d4163636f756e7449644861736820416e205c5b6163636f756e745c5d20776173207265617065642e2041206e6577205c5b6163636f756e745c5d2077617320637265617465642e20603a636f6465602077617320757064617465642e20416e2065787472696e736963206661696c65642e205c5b6572726f722c20696e666f5c5d44697370617463684572726f724469737061746368496e666f20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205c5b696e666f5c5d00000000000000404810000a00000000000000c84e1000010000000000000000000000e04e10000100000000000000000000003a4810000600000000000000e84e1000010000000000000000000000004f10000500000000000000000000002c4810000e00000000000000284f1000010000000000000000000000404f1000080000000000000000000000244810000800000000000000804f1000010000000000000000000000984f10000a00000000000000000000000d4810001700000000000000804f1000010000000000000000000000e84f1000080000000000000000000000f6471000170000000000000028501000010000000000000000000000405010000a0000000000000000000000eb4710000b0000000000000090501000010000000000000000000000a8501000080000000000000000000000df4710000c00000000000000e850100001000000000000000000000000511000080000000000000000000000d44710000b0000000000000040511000020000000000000000000000705110000b0000000000000000000000c34710001100000000000000c8511000010000000000000000000000e05110000600000000000000000000009759100006000000000000009d591000070000005559100042000000000000004e59100007000000000000008a52100007000000335910001b0000003c871000000000003a5210000b00000084551000090000007e5210000c000000000000002b59100005000000000000003059100003000000a85810003f0000003c871000000000003a5210000b0000008455100009000000e758100013000000fa5810001900000013591000180000007e5210000c00000000000000a458100004000000000000008a521000070000005c5710001a0000003c871000000000003a5210000b000000765710004d000000dd56100022000000c35710005e000000735210000b000000215810005f00000080581000240000007e5210000c00000072561000470000003c871000000000003a5210000b000000b956100024000000dd56100022000000735210000b000000ff5610005d0000007e5210000c000000000000003f561000130000000000000052561000200000005c551000280000003c871000000000003a5210000b00000084551000090000008d5510002c000000b955100036000000ef55100019000000085610000d000000155610002a0000007e5210000c000000000000004a55100005000000000000004f5510000d000000ce5410001b0000003c871000000000003a5210000b000000e9541000250000000e5510001f0000002d5510001d000000a85410001a0000007e5210000c00000000000000c25410000400000000000000c654100008000000165410001e0000003c871000000000003a5210000b000000345410003f00000073541000190000008c5410001c000000a85410001a0000007e5210000c000000000000000254100006000000000000000854100003000000000000000b5410000800000000000000135410000300000091521000450000003c87100000000000d65210004f00000025531000500000003c871000000000003a5210000b0000007553100037000000ac53100019000000c55310001d000000e2531000200000007e5210000c000000000000003a48100006000000000000008a52100007000000105210002a0000003c871000000000003a5210000b000000455210002e000000735210000b0000007e5210000c000000204d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e2023203c7765696768743e202d20604f28622960207768657265206220697320746865206c656e677468206f66207468652072656d61726b2e202d2031206576656e742e2023203c2f7765696768743e5665633c75383e204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465722074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e202d20604f285029602077686572652060506020616d6f756e74206f66206b657973207769746820707265666978206070726566697860202d206050602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a20302e383334202a205020c2b573202d205772697465733a204e756d626572206f66207375626b657973202b20317072656669784b65795f7375626b657973753332204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b6579202d206049602073746f726167652064656c6574696f6e732e202d2042617365205765696768743a202e333738202a206920c2b573202d205772697465733a204e756d626572206f66206974656d736b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e202d20604f2849296020776865726520604960206c656e677468206f6620606974656d7360202d206049602073746f72616765207772697465732028604f28312960292e202d2042617365205765696768743a20302e353638202a206920c2b5736974656d735665633c4b657956616c75653e2053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e202d20604f28312960202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292e202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f283129202d2042617365205765696768743a20372e32313820c2b573202d204442205765696768743a20202020202d205772697465733a204368616e67657320547269652c2053797374656d204469676573746368616e6765735f747269655f636f6e6669674f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e2053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e202d20604f2843296020776865726520604360206c656e677468206f662060636f646560202d20312073746f726167652077726974652028636f64656320604f28432960292e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2053657420746865206e65772072756e74696d6520636f64652e202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f646560202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e636f64652053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e202d20312073746f726167652077726974652e202d2042617365205765696768743a20312e34303520c2b573202d203120777269746520746f20484541505f50414745537061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e5f726174696f50657262696c6c0000000019701000070000000102000000000000245f10000c00000000000000305f100025000000000000000000000000000000000000003c871000585f10000000000000000000685f100001000000000000000100000000000000705f10000e00000000000000000000001354100003000000000000000000000000000000000000000000000000000000000000003c871000805f10000000000000000000905f100001000000000000000000000000000000985f10000b0000000000000000000000a35f10000e000000000000000000000000000000000000000000000000000000000000003c871000b45f10000000000000000000c45f100001000000000000000100000000000000cc5f10001000000000000000000000001354100003000000000000000000000000000000000000000000000000000000000000003c871000805f10000000000000000000dc5f10000100000000000000000000000000000010701000090000000105000000000000e45f10000e00000000000000f25f100007000000000000000000000000000000000000003c871000fc5f100000000000000000000c60100001000000000000000100000000000000037010000d00000001050000000000001354100003000000000000008a52100007000000000000000000000000000000000000003c87100014601000000000000000000024601000010000000000000001000000000000002c601000060000000000000000000000e45f10000e000000000000000000000000000000000000000000000000000000000000003c87100034601000000000000000000044601000010000000000000001000000000000004c6010000a0000000000000000000000f25f100007000000000000000000000000000000000000000000000000000000000000003c871000fc5f10000000000000000000586010000100000000000000010000000000000060601000060000000000000000000000666010000b000000000000000000000000000000000000000000000000000000000000003c87100074601000000000000000000084601000010000000000000001000000000000008c6010000600000000000000000000009260100023000000000000000000000000000000000000000000000000000000000000003c871000b86010000000000000000000c860100001000000000000000100000000000000d06010000a0000000000000000000000da6010000a000000000000000000000000000000000000000000000000000000000000003c871000346010000000000000000000e460100001000000000000000100000000000000f86f10000b0000000102000000000000f25f10000700000000000000ec60100021000000000000000000000000000000000000003c871000106110000000000000000000206110000a000000000000000100000000000000706110001200000000000000000000008261100016000000000000000000000000000000000000000000000000000000000000003c871000986110000000000000000000a861100001000000000000000000000000000000b0611000150000000000000000000000c561100004000000000000000000000000000000000000000000000000000000000000003c871000cc6110000000000000000000dc61100001000000000000000100000000000000e4611000180000000000000000000000c561100004000000000000000000000000000000000000000000000000000000000000003c871000cc6110000000000000000000fc611000020000000000000001000000000000000c6210000e00000000000000000000001a62100005000000000000000000000000000000000000000000000000000000000000003c87100020621000000000000000000030621000010000000000000000000000543a3a4163636f756e7449644163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e0000002b000000000000000100000070000000a26710003a00000045787472696e736963436f756e7400002b000000000000000100000063000000746710002e000000426c6f636b576569676874436f6e73756d65645765696768740000002b0000000000000001000000710000005267100022000000416c6c45787472696e736963734c656e0267100050000000543a3a426c6f636b4e756d626572543a3a486173680000002b000000000000000100000072000000dc661000260000002b0000000000000001000000640000008d6610004f0000004e756d62657200002b0000000000000001000000650000004b66100042000000506172656e744861736800002f6610001c0000004469676573744469676573744f663c543e0000002b000000000000000100000073000000f36510003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e0000002b000000000000000100000068000000cb651000280000004576656e74436f756e744576656e74496e6465789d6510002e0000005665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e0000002b0000000000000001000000740000006b63100049000000b4631000250000003c87100000000000d9631000540000002d641000510000007e641000390000003c87100000000000b7641000530000000a651000530000005d651000400000004c61737452756e74696d65557067726164654c61737452756e74696d6555706772616465496e666f2b00000000000000010000006300000016631000550000005570677261646564546f553332526566436f756e74626f6f6c0000002b000000000000000100000063000000c3621000530000005570677261646564546f547269706c65526566436f756e745a62100057000000b162100012000000457865637574696f6e50686173655068617365002b00000000000000010000006300000038621000220000002054686520657865637574696f6e207068617365206f662074686520626c6f636b2e2054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c7365202864656661756c7429206966206e6f742e2054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e2053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e205468652063757272656e742077656967687420666f722074686520626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e000000002c6910000c000000000000003869100014000000000000003c8710004c69100000000000000000005c691000010000000000000000000000646910000b000000000000006f69100013000000000000003c871000846910000000000000000000946910000100000000000000000000009c6910000e00000000000000e45f10000e000000000000003c871000ac6910000000000000000000bc691000010000000000000000000000c46910000800000000000000cc6910000f000000000000003c871000dc6910000000000000000000ec691000010000000000000000000000f46910000700000000000000fb6910000e000000000000003c8710000c6a100000000000000000001c6a1000010000000000000000000000246a10000a000000000000002e6a100002000000000000003c871000306a10000000000000000000406a10000500000000000000426c6f636b576569676874736c696d6974733a3a426c6f636b576569676874732b0000000000000001000000750000002a6c100034000000426c6f636b4c656e6774686c696d6974733a3a426c6f636b4c656e67746800002b000000000000000100000076000000006c10002a000000426c6f636b48617368436f756e7400002b000000000000000100000077000000ab6b100055000000446257656967687452756e74696d654462576569676874002b000000000000000100000078000000696b10004200000056657273696f6e52756e74696d6556657273696f6e0000002b000000000000000100000079000000486b1000210000005353353850726566697875382b00000000000000010000007a000000686a10002a0000003c87100000000000926a10004e000000e06a10004c0000002c6b10001c000000205468652064657369676e61746564205353383520707265666978206f66207468697320636861696e2e2054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e2069732074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f6620697420617320616e206964656e746966696572206f662074686520636861696e2e204765742074686520636861696e27732063757272656e742076657273696f6e2e2054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e20546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e20426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e0000000000003a4a10000f00000000000000ec6c1000020000000000000000000000204a10001a00000000000000fc6c1000020000000000000000000000034a10001d000000000000000c6d1000030000000000000000000000f04910001300000000000000246d1000010000000000000000000000494a10000f000000000000002c6d10000100000000000000a76e100045000000926e100015000000416e100051000000926e100015000000c26d10003c0000003c87100000000000fe6d100043000000826d100040000000346d10004e0000002054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e20537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6520616e6420746865206e65772072756e74696d652e20546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d652b0000000c000000040000004e0000004f0000007b000000a0000000080000004500000046000000546f10005a000000ce0100001e000000546f10005a000000e00100001e000000546f10005a000000f20100001e000000546f10005a000000050200001e0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f706f6c6b61646f742d343033386632376435653465613265382f363239623836392f78636d2f78636d2d6578656375746f722f7372632f6173736574732e72730000546f10005a000000830100001e000000546f10005a0000008d0100001e0000002b00000008000000040000003d0000003e0000003f000000400000004100000042000000430000004576656e74546f7069637345787472696e73696344617461426c6f636b486173684163636f756e74e27010002b000000bd701000250000006672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61702f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f6672616d652f737570706f72742f7372632f73746f726167652f67656e657261746f722f6d61702e7273496e76616c6964207472616e736c6174653a206661696c20746f206465636f6465206b6579496e76616c6964207472616e736c6174653a206661696c20746f206465636f6465206f6c642076616c7565006e6f7420696d706c656d656e7465640000003071100064000000fb000000090000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f73746174652d6d616368696e652f7372632f6261636b656e642e72733071100064000000e9000000090000003071100064000000ee000000090000003071100064000000e400000009000000d47110004c00000074060000240000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f7665632f6d6f642e7273307210004a000000c4000000110000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f736c6963652e727300000800000000000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f0000002b00000000000000010000003b000000cc7210005300000078000000230000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f656e7669726f6e6d656e74616c2d312e312e322f7372632f6c69622e727300287310001a0000004552524f523a20436f7272757074656420737461746520617420506172656e7420686173682073686f756c642062652076616c69642e0000847410005700000038010000090000001e7510003100000084741000570000003f0100000d0000008474100057000000640100000d0000005369676e617475726520766572696669636174696f6e206661696c65642e000084741000570000005501000011000000ec741000320000008474100057000000c001000009000000446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e008474100057000000c80100000d00000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e8474100057000000ce010000090000005472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e8474100057000000d0010000090000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f6672616d652f6578656375746976652f7372632f6c69622e7273002b00000004000000040000007c0000004e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e496e76616c696420696e686572656e7420706f736974696f6e20666f722065787472696e73696320617420696e64657820496e76616c69642070617261636861696e20626c6f636b2064617461002b00000000000000010000006f0000009577100044000000350000000e000000496e76616c696420706172656e742068656164009577100044000000380000003b000000496e76616c696420706172656e7420686173680095771000440000003f000000050000005769746e657373206461746120646f6573206e6f7420636f6e7461696e20676976656e2073746f7261676520726f6f742e00000095771000440000004700000009000000547279696e6720746f207265706c61636520616e20616c7265616479207265706c6163656420696d706c656d656e746174696f6e210000003077100065000000710000000d0000002b00000010000000040000007d0000007e0000007f000000800000008100000082000000830000008400000085000000860000008700000088000000890000008a0000008b0000008c0000008d0000008e0000008f000000900000009100000092000000930000009400000095000000960000009700000098000000990000009a0000009b0000009c0000009d0000009e0000009f000000a0000000a100000056616c7565206973206f6e6c792074616b656e206f6e2064726f703b2071656430771000650000008e0000003a0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f7761736d2e72732f6275696c642f70616c6c6574732f70617261636861696e2d73797374656d2f7372632f76616c69646174655f626c6f636b2f696d706c656d656e746174696f6e2e72730000002b00000004000000040000000f0000002b0000000400000004000000a20000002b0000000400000004000000a30000002b00000004000000040000007c0000002b0000000400000004000000a40000006c8f100054000000740100001b0000006c8f100054000000670100000d000000617373657274696f6e206661696c65643a20216578697374696e675f6b65792e69735f656d707479282900006c8f10005400000080030000150000004272616e63682077697468206e6f2073756276616c7565732e20536f6d657468696e672077656e742077726f6e672e006c8f100054000000ad04000019000000757365645f696e646578206f6e6c7920736574206966206f636375706965643b207165646c8f100054000000b30400001e0000006c8f100054000000db040000190000006c8f100054000000df0400001e0000006c8f10005400000015050000220000006c8f100054000000290500001c00000000010200b1791000260000006672616d655f737570706f72743a3a686173682f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f6672616d652f737570706f72742f7372632f686173682e7273496e76616c696420726576657273653a2068617368206c656e67746820746f6f2073686f7274002b0000000100000001000000a50000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f6672616d652f73797374656d2f7372632f6c696d6974732e72734275696c6465722066696e6973686564207769746820606275696c645f6f725f70616e6963603b205468652070616e69632069732065787065637465642069662072756e74696d65207765696768747320617265206e6f7420636f727265637400e879100057000000aa010000160000003c8710000000000000000000ffffffff2b0000000000000001000000a6000000a7000000a80000002b0000000000000001000000a6000000a7000000a8000000247c10005a0000006700000012000000436f646563206572726f724572726f72496e76616c696420696e707574206461746100002b00000000000000010000006f000000447b1000550000001d000000340000002f636172676f2d686f6d652f6769742f636865636b6f7574732f706f6c6b61646f742d343033386632376435653465613265382f363239623836392f70617261636861696e2f7372632f7761736d5f6170692e72733c7761736d3a73747269707065643e30780000a87b10000200000000000000200000000400000002000000000000000200000000000000030000000000000020000000080000000200000000000000000000000200000003000000416c6c6f634572726c61796f757400002b0000000400000004000000a900000043617061636974794f766572666c6f772f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d322e312e302f7372632f636f6465632e72735765206465636f646520604e6020656c656d656e74733b20716564000000247c10005a000000c602000017000000486f737420746f207761736d2070726f766964657320612076616c696420656e756d206469736372696d696e616e743b207165642b0000000000000001000000c0000000007d100068000000bb0100001a0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f72756e74696d652d696e746572666163652f7372632f706173735f62792e7273486f737420746f207761736d2076616c7565732061726520656e636f64656420636f72726563746c793b2071656400002b00000000000000010000006f000000007d100068000000090100002600000072756e74696d6552756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e675472616e73616374696f6e206469737061746368206973206d616e6461746f72793b207472616e73616374696f6e73206d6179206e6f742068617665206d616e6461746f727920646973706174636865732e412063616c6c20776173206c6162656c6c6564206173206d616e6461746f72792c2062757420726573756c74656420696e20616e204572726f722e5472616e73616374696f6e20776f756c6420657868617573742074686520626c6f636b206c696d6974735472616e73616374696f6e2068617320616e20616e6369656e7420626972746820626c6f636b5472616e73616374696f6e20686173206120626164207369676e61747572655472616e73616374696f6e206973206f757464617465645472616e73616374696f6e2077696c6c2062652076616c696420696e2074686520667574757265496e6162696c69747920746f2070617920736f6d6520666565732028652e672e206163636f756e742062616c616e636520746f6f206c6f77295472616e73616374696f6e2063616c6c206973206e6f74206578706563746564496e76616c69645472616e73616374696f6e20637573746f6d206572726f72436f756c64206e6f742066696e6420616e20756e7369676e65642076616c696461746f7220666f722074686520756e7369676e6564207472616e73616374696f6e436f756c64206e6f74206c6f6f6b757020696e666f726d6174696f6e20726571756972656420746f2076616c696461746520746865207472616e73616374696f6e556e6b6e6f776e5472616e73616374696f6e20637573746f6d206572726f722b0000000000000001000000c3000000c4000000a80000003c871000000000002b00000004000000040000006000000061000000c500000048617368206e6f7420657175616c0000dc9010005b0000005c020000090000004f726420697320696c6c2d646566696e656420696e2042547265654d61702072616e6765c08010005d00000076000000110000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f7365617263682e7273000000649410005a000000e40000002e000000616c726561647920626f72726f7765642b00000000000000010000003b0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f73746174652d6d616368696e652f7372632f73746174732e7273000050811000620000007b0000001e00000050811000620000007c000000230000005081100062000000800000001e00000050811000620000008100000024000000248210006200000091000000090000002482100062000000910000003500000024821000620000007b0000000d0000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d322e312e302f7372632f656e636f64655f617070656e642e72732f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d7363616c652d636f6465632d322e312e302f7372632f636f6d706163742e727300002b00000008000000040000006a000000f48c10004e0000000c0100002e000000416e204f7665726c617956616c756520697320616c7761797320637265617465642077697468206174206c65617374206f6e65207472616e73616374696f6e20616e642064726f7070656420617320736f6f6e0a09617320746865206c617374207472616e73616374696f6e2069732072656d6f7665643b20716564908310007800000086000000230000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f73746174652d6d616368696e652f7372632f6f7665726c617965645f6368616e6765732f6368616e67657365742e72739083100078000000970000002b0000009083100078000000a10000002b000000447261696e206973206e6f7420616c6c6f7765642077697468206f70656e207472616e73616374696f6e732e908310007800000006010000090000004e6f4f70656e5472616e73616374696f6e4120777269746520746f20616e204f7665726c6179656456616c7565206973207265636f7264656420696e20746865206469727479206b6579207365742e204265666f726520616e0a090909094f7665726c6179656456616c75652069732072656d6f7665642c2069747320636f6e7461696e696e67206469727479207365742069732072656d6f7665642e20546869730a0909090966756e6374696f6e206973206f6e6c792063616c6c656420666f72206b65797320746861742061726520696e20746865206469727479207365742e2071656400009083100078000000580100003800000090831000780000009c00000021000000416c7265616479496e52756e74696d653a65787472696e7369635f696e646578546f7020616e64206368696c6472656e206368616e67657365747320617265207374617274656420696e206c6f636b737465703b207165642b00000000000000010000006d0000002c86100072000000a501000012000000546f7020616e64206f6666636861696e206368616e67657365747320617265207374617274656420696e206c6f636b737465703b207165642c86100072000000a90100000e0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f73746174652d6d616368696e652f7372632f6f7665726c617965645f6368616e6765732f6d6f642e727300002c86100072000000b80100000e0000002c86100072000000b5010000120000002b00000000000000010000006c0000002c86100072000000c70100000e000000546f7020616e64206368696c6472656e206368616e6765736574732061726520656e746572696e672072756e74696d6520696e206c6f636b737465703b207165640000002c86100072000000c40100001200000073746f72616765004c8710005800000027000000200000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f61727261797665632d302e372e302f7372632f61727261797665635f696d706c2e7273db8710000d000000c6871000150000003c87100000000000c4871000020000003a20696e73756666696369656e7420636170616369747943617061636974794572726f72040000000000000044656661756c744572726f723a6368696c645f73746f726167653a3a6368696c645f73746f726167653a64656661756c743a000034881000570000007d010000050000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f747269652f7372632f6c69622e7273009c8810004d000000e80b00000d0000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f636f72652f7372632f736c6963652f6d6f642e7273000000fc8810005e000000470000001f0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f747269652f7372632f6e6f64655f636f6465632e72730000fc8810005e00000050000000140000007c8910004e0000005b050000150000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f636f72652f7372632f736c6963652f697465722e72730000ec8910005f0000004000000040000000ec8910005f000000400000004d0000002f636172676f2d686f6d652f6769742f636865636b6f7574732f7375627374726174652d376530383433336434633337306132312f336631313031392f7072696d6974697665732f747269652f7372632f747269655f73747265616d2e727300ec8910005f0000003f0000003100000001000000000000006c656e20213d20302073696e6365206c656e2025203220213d20303b20696e6e6572206861732061206c61737420656c656d656e743b207165640000b08a10005b0000003d000000120000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e322f7372632f6e6962626c652f6e6962626c657665632e72736c656e20213d20303b20696e6e657220686173206c61737420656c656d3b20716564000000b08a10005b0000004800000025000000b08a10005b0000006000000033000000b08a10005b000000600000000d000000b08a10005b000000690000000f000000b08a10005b0000006b0000000f000000b08a10005b0000006b0000003e000000b08a10005b0000009100000039000000b08a10005b0000009100000011000000b08a10005b0000009300000011000000b08a10005b0000009400000040000000b08a10005b000000940000004e000000008c10005d0000009800000017000000008c10005d00000096000000290000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e322f7372632f6e6962626c652f6e6962626c65736c6963652e7273000000848e1000550000004d0000001c000000008c10005d0000004000000012000000008c10005d0000004f0000002d000000008c10005d0000005500000032000000008c10005d000000dd0000000f000000008c10005d000000df0000000f000000008c10005d000000df0000003d0000006361706163697479206f766572666c6f77000000f48c10004e000000fb000000360000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f736d616c6c7665632d312e362e312f7372632f6c69622e7273617373657274696f6e206661696c65643a206e65775f636170203e3d206c656e0000f48c10004e000000320300000d000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e0000f48c10004e0000005f05000009000000848e1000550000008d0000003c000000848e1000550000008d00000051000000848e1000550000008d00000031000000f48d10004f0000004b00000042000000f48d10004f0000004a0000003e0000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e322f7372632f6e6f64652e727300f48d10004f0000006b00000022000000f48d10004f0000009a00000032000000f48d10004f000000a20000003e000000f48d10004f000000aa0000003e0000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e322f7372632f6e6962626c652f6d6f642e7273000000848e1000550000008600000031000000848e1000550000008600000042000000848e1000550000008600000026000000848e100055000000870000001d000000848e100055000000870000000d000000848e1000550000008e00000018000000848e1000550000008e0000000d0000006c8f10005400000042060000090000006c8f10005400000042060000320000002f636172676f2d686f6d652f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f747269652d64622d302e32322e322f7372632f7472696564626d75742e72736c656e202b20707265666978206d696e757320322a736b6970706564206973206c657373207468616e20343b207165642b0000000000000001000000c0000000109010005800000054020000200000002f636172676f2d686f6d652f6769742f636865636b6f7574732f706f6c6b61646f742d343033386632376435653465613265382f363239623836392f78636d2f7372632f76302f6d756c74695f6c6f636174696f6e2e72732829617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e686569676874202d20310000dc9010005b0000007902000009000000617373657274696f6e206661696c65643a20696478203c204341504143495459dc9010005b0000007d020000090000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e7273617373657274696f6e206661696c65643a2073656c662e686569676874203e2030dc9010005b000000d400000009000000dc9010005b0000002604000016000000617373657274696f6e206661696c65643a207372632e6c656e2829203d3d206473742e6c656e2829dc9010005b000000a706000005000000617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e686569676874202d2031000000dc9010005b0000009403000009000000dc9010005b00000063040000160000004094100013000000dc9010005b0000009f0400001f000000617373657274696f6e206661696c65643a206e65775f6c6566745f6c656e203c3d2043415041434954590000dc9010005b000000d304000009000000617373657274696f6e206661696c65643a206f6c645f6c6566745f6c656e202b20636f756e74203c3d2043415041434954590000dc9010005b000000860500000d000000617373657274696f6e206661696c65643a206f6c645f72696768745f6c656e203e3d20636f756e74dc9010005b000000870500000d000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f6465dc9010005b000000b705000016000000617373657274696f6e206661696c65643a206f6c645f72696768745f6c656e202b20636f756e74203c3d20434150414349545900dc9010005b000000470500000d000000617373657274696f6e206661696c65643a206f6c645f6c6566745f6c656e203e3d20636f756e7400dc9010005b000000480500000d000000dc9010005b0000007705000016000000617373657274696f6e206661696c65643a206d6174636820747261636b5f656467655f696478207b5c6e202020204c6566744f7252696768743a3a4c6566742869647829203d3e20696478203c3d206f6c645f6c6566745f6c656e2c5c6e202020204c6566744f7252696768743a3a52696768742869647829203d3e20696478203c3d2072696768745f6c656e2c5c6e7d000000dc9010005b0000001905000009000000656d70747920696e7465726e616c206e6f646500649410005a000000d2050000350000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6d61702e727363616c6c65642060526573756c743a3a756e77726170282960206f6e20616e2060457272602076616c7565000000959510001d0000006b9510002a0000000c9510005f0000005c000000120000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e7273696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a2042547265654d61702068617320646966666572656e742064657074687363616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c7565000000f095100060000000450100002e0000002f72757374632f643665616561316338383630616462353330326432666261616434303965333635383561623231372f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e7273f095100060000000fb0100002a0000000041e0acc2000b84024f8167f7390000000000000000000000000000000000000000000000000000003c871000c07a100039000000000000000000000000000000000000000000000000000000aa00000000000000ab00000000000000ac00000000000000ad00000000000000ae00000000000000af00000000000000b000000000000000b100000000000000b200000000000000b300000000000000b400000000000000b500000000000000b600000000000000b700000000000000b800000000000000b900000000000000ba00000000000000bb00000000000000bc00000000000000bd00000000000000be00000000000000bf00000000000000c100000000000000c2000000000000000041e4aec2000b080000000000000000009ebe03046e616d650195be038a05001f6578745f6c6f6767696e675f6d61785f6c6576656c5f76657273696f6e5f3101236578745f63727970746f5f656432353531395f7665726966795f76657273696f6e5f3102286578745f63727970746f5f66696e6973685f62617463685f7665726966795f76657273696f6e5f3103376578745f63727970746f5f736563703235366b315f65636473615f7265636f7665725f636f6d707265737365645f76657273696f6e5f3104236578745f63727970746f5f737232353531395f7665726966795f76657273696f6e5f3205276578745f63727970746f5f73746172745f62617463685f7665726966795f76657273696f6e5f3106296578745f64656661756c745f6368696c645f73746f726167655f636c6561725f76657273696f6e5f3107306578745f64656661756c745f6368696c645f73746f726167655f636c6561725f7072656669785f76657273696f6e5f31082a6578745f64656661756c745f6368696c645f73746f726167655f6578697374735f76657273696f6e5f3109276578745f64656661756c745f6368696c645f73746f726167655f6765745f76657273696f6e5f310a2c6578745f64656661756c745f6368696c645f73746f726167655f6e6578745f6b65795f76657273696f6e5f310b286578745f64656661756c745f6368696c645f73746f726167655f726561645f76657273696f6e5f310c286578745f64656661756c745f6368696c645f73746f726167655f726f6f745f76657273696f6e5f310d276578745f64656661756c745f6368696c645f73746f726167655f7365745f76657273696f6e5f310e306578745f64656661756c745f6368696c645f73746f726167655f73746f726167655f6b696c6c5f76657273696f6e5f330f206578745f68617368696e675f626c616b65325f3235365f76657273696f6e5f31101e6578745f68617368696e675f74776f785f3132385f76657273696f6e5f31111d6578745f68617368696e675f74776f785f36345f76657273696f6e5f31121c6578745f616c6c6f6361746f725f667265655f76657273696f6e5f31131e6578745f616c6c6f6361746f725f6d616c6c6f635f76657273696f6e5f31142a6578745f747269655f626c616b65325f3235365f6f7264657265645f726f6f745f76657273696f6e5f31151c6578745f6d6973635f7072696e745f6865785f76657273696f6e5f31161d6578745f6d6973635f7072696e745f757466385f76657273696f6e5f3117226578745f6d6973635f72756e74696d655f76657273696f6e5f76657273696f6e5f31181c6578745f73746f726167655f617070656e645f76657273696f6e5f3119226578745f73746f726167655f6368616e6765735f726f6f745f76657273696f6e5f311a1b6578745f73746f726167655f636c6561725f76657273696f6e5f311b226578745f73746f726167655f636c6561725f7072656669785f76657273696f6e5f311c286578745f73746f726167655f636f6d6d69745f7472616e73616374696f6e5f76657273696f6e5f311d1c6578745f73746f726167655f6578697374735f76657273696f6e5f311e196578745f73746f726167655f6765745f76657273696f6e5f311f1e6578745f73746f726167655f6e6578745f6b65795f76657273696f6e5f31201a6578745f73746f726167655f726561645f76657273696f6e5f31212a6578745f73746f726167655f726f6c6c6261636b5f7472616e73616374696f6e5f76657273696f6e5f31221a6578745f73746f726167655f726f6f745f76657273696f6e5f3123196578745f73746f726167655f7365745f76657273696f6e5f3124276578745f73746f726167655f73746172745f7472616e73616374696f6e5f76657273696f6e5f3125196578745f6c6f6767696e675f6c6f675f76657273696f6e5f3126226578745f6f6666636861696e5f696e6465785f636c6561725f76657273696f6e5f3127206578745f6f6666636861696e5f696e6465785f7365745f76657273696f6e5f31281a5f5f727573745f616c6c6f635f6572726f725f68616e646c657229085f5f72675f6f6f6d2a33616c6c6f633a3a616c6c6f633a3a68616e646c655f616c6c6f635f6572726f723a3a68333061346538636637383161313439352b08727573745f6f6f6d2c34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68613038323933633636383239313437322d29636f72653a3a70616e69636b696e673a3a70616e69633a3a68633634663937353362386131626537362e2e616c6c6f633a3a7261775f7665633a3a66696e6973685f67726f773a3a68656339623739316366306636613034362f4773705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6d616c6c6f633a3a6834326331343661653530346433356666304573705f696f3a3a616c6c6f6361746f723a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a667265653a3a68626366333766366332326536363666383125616c6c6f633a3a666d743a3a666f726d61743a3a68643432303262663434353165343131393223636f72653a3a666d743a3a77726974653a3a68333430663261356164623035383937333336636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68646437306131633532326639613438643433636f72653a3a6f7074696f6e3a3a6578706563745f6e6f6e655f6661696c65643a3a6831376562363366633533333530333131353a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6838353961653439643663393635393637363b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6831616337353235653037303435346637373a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68643763656436386638663462396463343841616c6c6f633a3a7665633a3a5665633c542c413e3a3a73706c69745f6f66663a3a6173736572745f6661696c65643a3a6863396261303864613362366438653238394e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a68306334353861313332393630653838363a2d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68666131356635343732656635653535373b39636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a68373638663331393138346165616262633c2f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68643763323462363139653738396437373d11727573745f626567696e5f756e77696e643e6f636f72653a3a7074723a3a64726f705f696e5f706c6163653c26636f72653a3a697465723a3a61646170746572733a3a636f706965643a3a436f706965643c636f72653a3a736c6963653a3a697465723a3a497465723c75383e3e3e3a3a68303337356532313964323463386639343f313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a68313033663031323363306638356437354035636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68383135303965336538336430303731664143636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6839636664666535336133306563353732423f636f72653a3a736c6963653a3a696e6465783a3a736c6963655f656e645f696e6465785f6c656e5f6661696c3a3a6862306437653965636439326333383039432c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6863353362303232656334613136333438442e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a683435336562653238633361336438346345323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6837303937326161326135396364643266464a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686362346137653762616233323061356547323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863663462376533363964353837643838483d636f72653a3a736c6963653a3a696e6465783a3a736c6963655f696e6465785f6f726465725f6661696c3a3a6864656239323832323238363332653738494c636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68643064663134366464616534363035322e33364a41636f72653a3a736c6963653a3a696e6465783a3a736c6963655f73746172745f696e6465785f6c656e5f6661696c3a3a68613439303565646262633466653039634b37636f72653a3a70616e69636b696e673a3a6173736572745f6661696c65645f696e6e65723a3a68316666313534376234653230616232334c303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68633565373764323837313130393962384d443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68363136303135393134303964616134324e453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68623430393836373563346430353330394f483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6865613965386466313938353365636338502e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a683366636136316461313636313733646451323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a683366383035316236663836346364353552533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6838333664333462346532333465316661533a636f72653a3a666d743a3a6275696c646572733a3a44656275675374727563743a3a6669656c643a3a6865643034343232393336373231643836542f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a6861353338356234313535363961373963552e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a6861646464353133356664303638666132563a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6861343030363464633465653062613966573b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6864643133613937613137353537313131583a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68383034393062363733333362616238375939636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a68373230316338653237323030613438375a31636f72653a3a666d743a3a6e756d3a3a70617273655f7536345f696e746f3a3a68373835633739313239623639613262665b4e636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6c656e5f6d69736d617463685f6661696c3a3a68333365376137316534376537386531325c303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663265663039353738633135656166385d3e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68326334373934386661323433313635635e303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68633762393632303431633931303134615f773c73705f73746174655f6d616368696e653a3a747269655f6261636b656e643a3a547269654261636b656e643c532c483e2061732073705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643c483e3e3a3a73746f726167653a3a6830303739336430363738623464663839608b013c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c532c483e20617320686173685f64623a3a4861736844425265663c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a636f6e7461696e733a3a68333838643038333434323963346131656186013c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c532c483e20617320686173685f64623a3a4861736844425265663c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a6765743a3a68623866393636653961653939306636356239747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633a3a6465636f64653a3a6838643539323031363638363233353531633473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a683066633834336633356333363139323264423c73705f7374643a3a57726974657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6865323538316239383066346463346339654973705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235363a3a6838306530653565363235346161613533663473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a683262373164383663316338393034386367366861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a6765743a3a6835346630383263316361303466633165685463756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a72656c61795f73746174655f736e617073686f743a3a726561645f656e7472793a3a6835656466636537313634633266616334692e616c6c6f633a3a7261775f7665633a3a66696e6973685f67726f773a3a68303330616262643135383366393962646a5463756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a72656c61795f73746174655f736e617073686f743a3a726561645f656e7472793a3a68373361363432626132653235373430346b757072696d69746976655f74797065733a3a636f6465633a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72207072696d69746976655f74797065733a3a483235363e3a3a6465636f64653a3a68323734313330393838666632343837616ca901636f72653a3a7074723a3a64726f705f696e5f706c6163653c6d656d6f72795f64623a3a4d656d6f727944423c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235362c6d656d6f72795f64623a3a486173684b65793c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235363e2c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a68313661373931313365396365303365396d6a3c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a72656c61795f73746174655f736e617073686f743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68616263373364366564396131383038376e303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68636135633062393531653633333134306f6b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68366439343735383634666262386239637031747269655f64623a3a6e6f64653a3a4e6f6465506c616e3a3a6275696c643a3a6862663363343030313637663962363830716563756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f726561643a3a6832343936643135356665386532383039726463756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f7365743a3a6839633630663033326335356535633530736463756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f6765743a3a6831653530393234366132333433653962746763756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f6578697374733a3a6838656536356239386238326233393032756663756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f636c6561723a3a6838623634623937643033336462383537766563756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f726f6f743a3a6865396561653766663961663937366562776d63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f636c6561725f7072656669783a3a6866303932303361346638346663656264786d63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f6368616e6765735f726f6f743a3a6832656436646534383037346161303531796763756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f617070656e643a3a68663361376164363966393638363666617a6963756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f6e6578745f6b65793a3a68306431343231656536613133633465327b7263756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f73746172745f7472616e73616374696f6e3a3a68323635373333396330383138313664347c7563756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f726f6c6c6261636b5f7472616e73616374696f6e3a3a68323830663161363465346563663564657d7363756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f73746f726167655f636f6d6d69745f7472616e73616374696f6e3a3a68343461356430396132333663353861657e7263756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f6765743a3a68303166643439303938336539306538627f7363756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f726561643a3a683561663664313734343335313533376680017263756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f7365743a3a683336626362363262636638326130303081017463756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f636c6561723a3a683635626230316334333232636534323882017b63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f73746f726167655f6b696c6c3a3a683838613964386232653037633730346183017563756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f6578697374733a3a683031366535653465386161336631626584017b63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f636c6561725f7072656669783a3a686365326335613336323933386361303485017363756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f726f6f743a3a686435646635346534333836363166336686017763756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f64656661756c745f6368696c645f73746f726167655f6e6578745f6b65793a3a686166383234326335376538366539646187016b63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f6f6666636861696e5f696e6465785f7365743a3a683337376536333238326664623664623588016d63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a686f73745f6f6666636861696e5f696e6465785f636c6561723a3a683162393662616661616265323062633589015b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f72696768743a3a68393232636436316339656534393564398a0160616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f706172656e743a3a68353961356333626639333232396630358b01aa02616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a72656d6f76653a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75742c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561663e2c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4b563e3e3a3a72656d6f76655f6c6561665f6b763a3a68396235323838383563316239366638668c0164616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f6368696c645f656467653a3a68663636336334343939336461346130388d015a616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f6c6566743a3a68346566333866613433323135613866348e015b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f72696768743a3a68346235373338633066663432313762308f0160616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f706172656e743a3a6833616562653162313030626433336162900144636f72653a3a7475706c653a3a3c696d706c20636f72653a3a636d703a3a4f726420666f722028412c42293e3a3a636d703a3a68613034643064623062616230383134339101493c78636d5f6578656375746f723a3a6173736574733a3a4173736574496420617320636f72653a3a636d703a3a4f72643e3a3a636d703a3a68303636383864366535653636373865659201473c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e20617320636f72653a3a636d703a3a4f72643e3a3a636d703a3a68646662343164666361366133313635379301df01616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e617669676174653a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a496d6d75742c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561664f72496e7465726e616c3e3e3a3a66756c6c5f72616e67653a3a68393134396666333234396466643435339401417061726974795f7363616c655f636f6465633a3a636f6465633a3a6465636f64655f7665635f776974685f6c656e3a3a683264373937333463383331313630326295016678636d3a3a76303a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a58636d3c43616c6c3e3e3a3a6465636f64653a3a6835306336626135386330616138616634960156636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d3a3a76303a3a58636d3c63756d756c75735f7368656c6c5f72756e74696d653a3a43616c6c3e3e3a3a68313336383831376432363135346263349701417061726974795f7363616c655f636f6465633a3a636f6465633a3a6465636f64655f7665635f776974685f6c656e3a3a68396231393235336435353862323061369801543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683535303331346331393834356537616299018a0178636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3e3a3a6465636f64653a3a68353933653363656563306661613662329a014d636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d3a3a76303a3a6d756c74695f61737365743a3a4d756c746941737365743e3a3a68323738636637323934616561376561649b016b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68393030333064336133633037653464359c0153636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3e3a3a68363135313237383266376333633632309d016b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68643632326537333366613938363866359e01810178636d3a3a76303a3a6d756c74695f61737365743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6d756c74695f61737365743a3a4d756c746941737365743e3a3a6465636f64653a3a68363234376232346239643861613030359f01417061726974795f7363616c655f636f6465633a3a636f6465633a3a6465636f64655f7665635f776974685f6c656e3a3a6862396263626564656438646661343733a00146636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d3a3a76303a3a6f726465723a3a4f726465723c28293e3e3a3a6834363736633432643364656534303461a1016678636d3a3a76303a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a58636d3c43616c6c3e3e3a3a6465636f64653a3a6865313536363964623264303164613730a20142636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d3a3a76303a3a58636d3c28293e3e3a3a68613738356331663539613539376436312e31353539a301417061726974795f7363616c655f636f6465633a3a636f6465633a3a6465636f64655f7665635f776974685f6c656e3a3a6865646566366137313461386231396465a40161636f72653a3a7074723a3a64726f705f696e5f706c6163653c5b78636d3a3a76303a3a6f726465723a3a4f726465723c63756d756c75735f7368656c6c5f72756e74696d653a3a43616c6c3e5d3e3a3a6834653766663530323632636265323266a501437061726974795f7363616c655f636f6465633a3a636f6465633a3a636f6d706163745f656e636f64655f6c656e5f746f3a3a6863616132616138366137616631306265a601483c5b545d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6861343063636637616237646337363864a701483c5b543b204e5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837303636363630646233663138326237a801483c5b543b204e5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837373234323638316264363037396230a901483c5b543b204e5d206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864393866656562666237326136623766aa016a6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a76616c75653a3a53746f7261676556616c75653c5072656669782c56616c75652c51756572794b696e642c4f6e456d7074793e3a3a6765743a3a6865643763376635653136333435653231ab014773705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f3132383a3a6830316533306565373533323661303130ac01303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834363732643331666161323165336564ad014673705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f757466383a3a6838616365353236353938326665656362ae016a6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a76616c75653a3a53746f7261676556616c75653c5072656669782c56616c75652c51756572794b696e642c4f6e456d7074793e3a3a7075743a3a6836303063643331636339323333643164af01766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6837313366643331356566323537346131b001766672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a76616c75653a3a3c696d706c206672616d655f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e20666f7220473e3a3a6765743a3a6861626537373734396634383130613536b1017c636f72653a3a7074723a3a64726f705f696e5f706c6163653c747269655f64623a3a7472696564626d75743a3a5472696544424d75743c73705f747269653a3a4c61796f75743c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235363e3e3e3a3a6834646337376364306536306561613431b20143616c6c6f633a3a636f6c6c656374696f6e733a3a7665635f64657175653a3a56656344657175653c543e3a3a67726f773a3a6838613638653561613766666632646530b3013c747269655f64623a3a7472696564626d75743a3a4e6f646553746f726167653c483e3a3a616c6c6f633a3a6839366165663935626663323133333033b4014473705f747269653a3a6e6f64655f636f6465633a3a7061727469616c5f66726f6d5f6974657261746f725f656e636f64653a3a6866626162363863363963666365343235b50160747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a617070656e645f7061727469616c3a3a6862643663643737303237643839326162b60156747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a707573683a3a6863663630363336346237373163376238b70141747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a636f6d6d69745f6368696c643a3a6830666634643134653731346536633661b8015c747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a64726f705f6c617374733a3a6862616238663962306165326162313032b901633c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a6c6561665f6e6f64653a3a6830663336376164663265303138363634ba0160747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a72696768745f697465723a3a6865313261376161656463326131363630bb0172747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a617070656e645f6f7074696f6e616c5f736c6963655f616e645f6e6962626c653a3a6834356235366663323661333337313231bc01683c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a657874656e73696f6e5f6e6f64653a3a6838366632663838613939623139343935bd01653c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a6272616e63685f6e6f64653a3a6861303330343036333537356432636165be015c636f72653a3a7074723a3a64726f705f696e5f706c6163653c747269655f64623a3a7472696564626d75743a3a4e6f64653c7072696d69746976655f74797065733a3a483235363e3e3a3a6866373835336133336663356239353233bf018502636f72653a3a7074723a3a64726f705f696e5f706c6163653c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c6d656d6f72795f64623a3a4d656d6f727944423c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235362c6d656d6f72795f64623a3a486173684b65793c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235363e2c616c6c6f633a3a7665633a3a5665633c75383e3e2c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235363e3e3a3a6831323262313561333965653465333131c0014f3c73705f747269653a3a4b657953706163656444424d75743c44422c483e20617320686173685f64623a3a4861736844423c482c543e3e3a3a6765743a3a6831346534653638373962383333363636c1013473705f747269653a3a6b657973706163655f61735f7072656669785f616c6c6f633a3a6862663837306231326431353733623835c2017a3c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a457068656d6572616c3c532c483e20617320686173685f64623a3a4861736844423c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a6765743a3a6864353739343566393433346266336230c301543c73705f747269653a3a4b657953706163656444424d75743c44422c483e20617320686173685f64623a3a4861736844423c482c543e3e3a3a636f6e7461696e733a3a6835313936613133366239633965663066c4017f3c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a457068656d6572616c3c532c483e20617320686173685f64623a3a4861736844423c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a636f6e7461696e733a3a6838316563323563643766363030323335c501523c73705f747269653a3a4b657953706163656444424d75743c44422c483e20617320686173685f64623a3a4861736844423c482c543e3e3a3a696e736572743a3a6830323439636163376663636364316431c601523c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a696e736572743a3a6834643230613866613063613130656462c701533c73705f747269653a3a4b657953706163656444424d75743c44422c483e20617320686173685f64623a3a4861736844423c482c543e3e3a3a656d706c6163653a3a6837616364666338393937623566306630c801533c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c542c4d3e20617320686173685f64623a3a4861736844423c482c543e3e3a3a656d706c6163653a3a6831316566303234393338343834356564c901523c73705f747269653a3a4b657953706163656444424d75743c44422c483e20617320686173685f64623a3a4861736844423c482c543e3e3a3a72656d6f76653a3a6839376635353630636533363966393639ca01386861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a656e7472793a3a6835613638306366633565333736656362cb013d6861736862726f776e3a3a6d61703a3a566163616e74456e7472793c4b2c562c533e3a3a696e736572743a3a6839343531326630623937383231346631cc01583c73705f747269653a3a4b657953706163656444424d75743c44422c483e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64623a3a6865303339633736656232626633396633cd015c3c73705f747269653a3a4b657953706163656444424d75743c44422c483e20617320686173685f64623a3a41734861736844423c482c543e3e3a3a61735f686173685f64625f6d75743a3a6866323362663739353136633534353463ce013173705f747269653a3a656d7074795f6368696c645f747269655f726f6f743a3a6832343639333138656635643431616533cf0146616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a6b6579733a3a6865613735613538666464326466373631d0016a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6830383334323165306133663439303062d10128747269655f726f6f743a3a6275696c645f747269653a3a6837623231336466373963613635616638d2014f3c73705f747269653a3a4b657953706163656444423c44422c483e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a6765743a3a6830316332363261666431633336643338d301366861736862726f776e3a3a6d61703a3a486173684d61703c4b2c562c533e3a3a6765743a3a6833613031353031393962313365316561d401543c73705f747269653a3a4b657953706163656444423c44422c483e20617320686173685f64623a3a4861736844425265663c482c543e3e3a3a636f6e7461696e733a3a6862336162663734633763313434643331d5018b013c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c532c483e20617320686173685f64623a3a4861736844425265663c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a636f6e7461696e733a3a6830366364353430336465346636363439d6016b3c63756d756c75735f7368656c6c5f72756e74696d653a3a52756e74696d65426c6f636b57656967687473206173206672616d655f737570706f72743a3a7472616974733a3a6d6973633a3a4765743c493e3e3a3a6765743a3a6838393130336366333734323738353439d701810163756d756c75735f7368656c6c5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722063756d756c75735f7368656c6c5f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6834623161323438303335616533343062d8018a016672616d655f737570706f72743a3a776569676874733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f737570706f72743a3a776569676874733a3a4469737061746368496e666f3e3a3a656e636f64655f746f3a3a6863333638666137356230386332323639d9017373705f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073705f72756e74696d653a3a44697370617463684572726f723e3a3a656e636f64655f746f3a3a6864393533626230303937326438623239da017578636d3a3a76303a3a7472616974733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a7472616974733a3a4572726f723e3a3a656e636f64655f746f3a3a6830303936323135613461396230353434db014f63756d756c75735f7368656c6c5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6672616d655f73797374656d3a3a6833373235626461383063646565386166dc016263756d756c75735f7368656c6c5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a6832363638303335333466316631633636dd015563756d756c75735f7368656c6c5f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f63756d756c75735f70616c6c65745f78636d3a3a6831333433386637303335383839383939de0137636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4d75743a3a63616c6c5f6d75743a3a6839613236303363346365396462393861df0148636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63657b7b767461626c652e7368696d7d7d3a3a6831646562646664343237316532393132e00181013c63756d756c75735f7368656c6c5f72756e74696d653a3a4f726967696e20617320636f72653a3a636f6e766572743a3a46726f6d3c63756d756c75735f7368656c6c5f72756e74696d653a3a4f726967696e43616c6c65723e3e3a3a66726f6d3a3a7b7b636c6f737572657d7d3a3a6838376139363063656139306335326336e1016e3c63756d756c75735f7368656c6c5f72756e74696d653a3a43616c6c206173206672616d655f737570706f72743a3a776569676874733a3a4765744469737061746368496e666f3e3a3a6765745f64697370617463685f696e666f3a3a6863376163643662393736326231393430e2015e3c63756d756c75735f7368656c6c5f72756e74696d653a3a43616c6c2061732073705f72756e74696d653a3a7472616974733a3a446973706174636861626c653e3a3a64697370617463683a3a6865343265636335356162653935623962e301613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831383939633931353863623661623536e4014b73705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a72756e74696d655f76657273696f6e3a3a6865306163633236393063313830333763e50198013c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a43616c6c3c543e206173206672616d655f737570706f72743a3a7472616974733a3a64697370617463683a3a556e66696c7465726564446973706174636861626c653e3a3a64697370617463685f6279706173735f66696c7465723a3a6835343531663865653266626430333331e6015e6672616d655f73797374656d3a3a3c696d706c206672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3e3a3a6465706f7369745f6576656e745f696e64657865643a3a6866333639616164346636343364656533e7016f3c73705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6832383362393231353932626537653162e8017c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a3c696d706c2063756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3e3a3a7365745f636f64655f696d706c3a3a6830623733356333373064343665326464e9017d63756d756c75735f7368656c6c5f72756e74696d653a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722063756d756c75735f7368656c6c5f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6833396337646530373861346662386638ea01593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830323634353533663965353761353664eb01543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866363762306539353363383033656535ec01ae0163756d756c75735f7072696d6974697665735f70617261636861696e5f696e686572656e743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722063756d756c75735f7072696d6974697665735f70617261636861696e5f696e686572656e743a3a50617261636861696e496e686572656e74446174613e3a3a6465636f64653a3a6864623432376462353838353935316261ed013473705f72756e74696d653a3a7472616974733a3a486173683a3a686173685f6f663a3a6835656663326464323864373136333630ee01713c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6837383761373236613430313732363265ef0189016672616d655f73797374656d3a3a6c696d6974733a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f73797374656d3a3a6c696d6974733a3a57656967687473506572436c6173733e3a3a656e636f64655f746f3a3a6864613136626136386366356530653861f00196013c78636d5f6275696c6465723a3a6c6f636174696f6e5f636f6e76657273696f6e3a3a4c6f636174696f6e496e7665727465723c416e6365737472793e2061732078636d5f6578656375746f723a3a7472616974733a3a636f6e76657273696f6e3a3a496e766572744c6f636174696f6e3e3a3a696e766572745f6c6f636174696f6e3a3a6831373331656531333538353136663139f1014d3c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6861616166613664613866303866616439f2013d78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3a3a61743a3a6835333739313765616339303366623761f3014578636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3a3a74616b655f66697273743a3a6835353561303665663362383065343861f4014d636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e3e3a3a68313234333763346266356133303532392e31333031f5019901706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a50657273697374656456616c69646174696f6e446174613c482c4e3e3e3a3a6465636f64653a3a6863636562346533396563306432633035f6019c01706f6c6b61646f745f7072696d6974697665733a3a76313a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f7220706f6c6b61646f745f7072696d6974697665733a3a76313a3a50657273697374656456616c69646174696f6e446174613c482c4e3e3e3a3a656e636f64655f746f3a3a6839633061656131383833323666313662f701303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830326266343763653164616261396165f8013b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6831653731663866333935386365623561f9013a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6862326531656339393035366366633437fa01553c73705f72756e74696d653a3a4d756c74695369676e61747572652061732073705f72756e74696d653a3a7472616974733a3a5665726966793e3a3a7665726966793a3a6865306634353139393466313137306134fb014c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a656432353531395f7665726966793a3a6861646465353763386438666236353633fc014c73705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a737232353531395f7665726966793a3a6830373365333231666464343138356334fd016073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a736563703235366b315f65636473615f7265636f7665725f636f6d707265737365643a3a6863626362636165653737396333623837fe013e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6836356339326337386331306562333936ff01443c736d616c6c7665633a3a536d616c6c5665633c413e20617320636f72653a3a686173683a3a486173683e3a3a686173683a3a683965616139663264323336343936666480023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a68373436306562363966316238383136388102a90163756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a3c696d706c2073705f72756e74696d653a3a7472616974733a3a56616c6964617465556e7369676e656420666f722063756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3e3a3a76616c69646174655f756e7369676e65643a3a68373162353434666536306332323035668202386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68653064383534303830333966343433328302910173705f72756e74696d653a3a67656e657269633a3a6469676573743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722073705f72756e74696d653a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3e3a3a6465636f64653a3a68326436386536396534316233343034668402783c63756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68653834326536616234353530663232388502386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68386262303865396562636333653536648602386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68323836636537656164646239353730398702433c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6863383638313961366630373466656137880231636f72653a3a70616e69636b696e673a3a6173736572745f6661696c65643a3a6836386461336534386264626164613663890231636f72653a3a70616e69636b696e673a3a6173736572745f6661696c65643a3a68656461386636303235633263633436308a0231636f72653a3a70616e69636b696e673a3a6173736572745f6661696c65643a3a68663232626463616464326266363230348b024673705f696f3a3a68617368696e673a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a74776f785f36343a3a68623231383463663832313433303439318c02633c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a737065635f66726f6d5f697465723a3a5370656346726f6d497465723c542c493e3e3a3a66726f6d5f697465723a3a68393432313338323666616664343732388d024a706f6c6b61646f745f7072696d6974697665733a3a76313a3a77656c6c5f6b6e6f776e5f6b6579733a3a68726d705f6368616e6e656c733a3a68386562323265343164623261356230348e02463c616c6c6f633a3a7665633a3a5665633c542c413e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68393337663861386633306233366264668f02463c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68653061613130306563383264346137369002386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a686138373037656265326334346365396391023b78636d3a3a76303a3a7472616974733a3a4578656375746558636d3a3a657865637574655f78636d3a3a68373437646434623038383937343664379202723c636f72653a3a697465723a3a61646170746572733a3a666c617474656e3a3a466c61744d61703c492c552c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68613032336261653231616265336163359302613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683030373633313837643162363763373894022c616c6c6f633a3a736c6963653a3a696e736572745f686561643a3a68373162623766316662316161323839319502613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6863626339343933356135316239323238960247616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a656e7472793a3a6836383737663065303936653930393433970252616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a656e7472793a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a68643635326133306462396135616236349802386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a683737373262323933636665323866663199025563756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a63616c6c5f66756e6374696f6e733a3a68313839333161623465623533363939369a025763756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a73746f726167655f6d657461646174613a3a68643964356265393830613164623866639b02a70163756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722063756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a70616c6c65743a3a43616c6c3c543e3e3a3a656e636f64655f746f3a3a68636432376237353366336530323063399c027978636d3a3a76303a3a6a756e6374696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e3e3a3a6465636f64653a3a68656434343132646534396564313064319d028d0178636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3e3a3a656e636f64655f746f3a3a68616362303431633239626665376635629e027c78636d3a3a76303a3a6a756e6374696f6e3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e3e3a3a656e636f64655f746f3a3a68656334376465626134376562313938659f027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830316261303162663866316632323038a0027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830643932613761323131373735616362a1027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831383533333462356530373636303564a2027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836633039623862616362366166653932a3027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839323138373663366631383166383064a4027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839333033623564356438356165653534a5027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839626434383338303463623936343332a6027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861333933316537373664386464323663a7027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863396665353639363663353637633962a8027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864373931616330653961616166363331a9027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864616432613463666632393234666339aa027d3c6672616d655f737570706f72743a3a73746f726167653a3a74797065733a3a4f6e456d7074794765747465723c56616c75652c4f6e456d7074793e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865616137313036346666333832653733ab029c013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864663066383633663737313963333331ac026b3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c7533323e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864656463663364666331333830633764ad02593c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835663932353537363033373738333033ae02543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831626166316664313834313066376361af0248616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6863643664653830333664333739303066b0029f013c73705f72756e74696d653a3a67656e657269633a3a756e636865636b65645f65787472696e7369633a3a556e636865636b656445787472696e7369633c416464726573732c43616c6c2c5369676e61747572652c45787472613e2061732073705f72756e74696d653a3a7472616974733a3a436865636b61626c653c4c6f6f6b75703e3e3a3a636865636b3a3a6865336661663562316434393330313866b10281016672616d655f73797374656d3a3a70616c6c65743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f73797374656d3a3a70616c6c65743a3a43616c6c3c543e3e3a3a656e636f64655f746f3a3a6835666136613336656664383631646539b20248636f72653a3a7074723a3a64726f705f696e5f706c6163653c63756d756c75735f7368656c6c5f72756e74696d653a3a43616c6c3e3a3a6862376362633435363964323033376232b30256616c6c6f633a3a7665633a3a73706c6963653a3a3c696d706c20616c6c6f633a3a7665633a3a647261696e3a3a447261696e3c542c413e3e3a3a6d6f76655f7461696c3a3a6838353232613461386337353261353763b4022e616c6c6f633a3a7261775f7665633a3a66696e6973685f67726f773a3a6834626437663734376237353665643138b502623c616c6c6f633a3a7665633a3a5665633c542c413e20617320616c6c6f633a3a7665633a3a737065635f657874656e643a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6832646338336165623263356131653134b6022c616c6c6f633a3a736c6963653a3a696e736572745f686561643a3a6837306362303531333764613238396535b7026d3c747269655f64623a3a6974657261746f723a3a5472696544424e6f64654974657261746f723c4c3e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864636435616631633839316538316165b80255747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a706f703a3a6830336636386263323566353364363939b9025b747269655f64623a3a6e6962626c653a3a6e6962626c657665633a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c655665633e3a3a61735f7072656669783a3a6835663464373436643738336535353035ba0240747269655f64623a3a7472696564623a3a5472696544423c4c3e3a3a6765745f7261775f6f725f6c6f6f6b75703a3a6830623564613362613666333963666162bb0230616c6c6f633a3a7665633a3a5665633c542c413e3a3a726573657276653a3a6861633834386537393536616163336534bc02773c736d616c6c7665633a3a536d616c6c5665633c413e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a457874656e643c3c4120617320736d616c6c7665633a3a41727261793e3a3a4974656d3e3e3a3a657874656e643a3a6863643564626365663964623363376639bd0235736d616c6c7665633a3a536d616c6c5665633c413e3a3a7472795f726573657276653a3a6838316330343865636136656463306634be027c3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a657874656e73696f6e733a3a457874656e73696f6e53746f72653e3a3a657874656e73696f6e5f62795f747970655f69643a3a6836346432396161643233363634626537bf0287013c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a657874656e73696f6e733a3a457874656e73696f6e53746f72653e3a3a646572656769737465725f657874656e73696f6e5f62795f747970655f69643a3a6830633637656262616562373361383831c00287013c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a657874656e73696f6e733a3a457874656e73696f6e53746f72653e3a3a72656769737465725f657874656e73696f6e5f776974685f747970655f69643a3a6839303036363861373637653462333839c1023f73705f65787465726e616c69746965733a3a45787465726e616c69746965733a3a7365745f73746f726167653a3a6832386666643731613232316465363062c202683c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a706c6163655f73746f726167653a3a6838646439383539343631363066303665c3025973705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a4f7665726c617965644368616e6765733a3a65787472696e7369635f696e6465783a3a6837626532656639376266623938303962c4025973705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c4b2c563e3a3a7365743a3a6837646362323563623163373162636536c5024173705f65787465726e616c69746965733a3a45787465726e616c69746965733a3a636c6561725f73746f726167653a3a6831356361616133613438343866623631c6024573705f65787465726e616c69746965733a3a45787465726e616c69746965733a3a7365745f6368696c645f73746f726167653a3a6861646437366236336339373965346462c7025b73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a4f7665726c617965644368616e6765733a3a7365745f6368696c645f73746f726167653a3a6864663731343138623232376234386262c8024773705f65787465726e616c69746965733a3a45787465726e616c69746965733a3a636c6561725f6368696c645f73746f726167653a3a6863623336336635613935613237613137c9026c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834376331656331646338363564643533ca02840178636d3a3a76303a3a6d756c74695f61737365743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f722078636d3a3a76303a3a6d756c74695f61737365743a3a4173736574496e7374616e63653e3a3a6465636f64653a3a6866346133623034373566386530353033cb02840178636d3a3a76303a3a6d756c74695f61737365743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a6d756c74695f61737365743a3a4d756c746941737365743e3a3a656e636f64655f746f3a3a6839623631666332333332383863373566cc02723c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c753132383e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6835356662346430663131373166323961cd02870178636d3a3a76303a3a6d756c74695f61737365743a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a6d756c74695f61737365743a3a4173736574496e7374616e63653e3a3a656e636f64655f746f3a3a6830333431363639346262383061353166ce022b78636d3a3a76303a3a58636d3c43616c6c3e3a3a66726f6d3a3a6863643332373162653563373563393865cf026c3c636f72653a3a697465723a3a61646170746572733a3a6d61703a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6831373165343932393432653337346463d0026978636d3a3a76303a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a58636d3c43616c6c3e3e3a3a656e636f64655f746f3a3a6838313265386532656231366636323939d1027978636d3a3a76303a3a6f726465723a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722078636d3a3a76303a3a6f726465723a3a4f726465723c43616c6c3e3e3a3a656e636f64655f746f3a3a6838333532623031323263373163326263d202713c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163745265663c7536343e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834303161353730623233613133323733d302303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833333134353631393431316531613735d402303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833376565363165663031616561343963d502303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833653331333538326332363836356531d602303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864653231383832643832653738393431d702333c265420617320636f72653a3a666d743a3a4c6f7765724865783e3a3a666d743a3a6832656437393964646534616261306234d802303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6866346366323763313964353362303837d902493c736d616c6c7665633a3a536d616c6c5665633c413e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6833343833373661363265336132373035da0240747269655f64623a3a6974657261746f723a3a5472696544424e6f64654974657261746f723c4c3e3a3a6e65773a3a6861366635393231306638373039656463db0248747269655f64623a3a6974657261746f723a3a5472696544424e6f64654974657261746f723c4c3e3a3a7365656b5f7072656669783a3a6832626435373665393862333961303539dc027b747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20636f72653a3a636d703a3a5061727469616c4f726420666f7220747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a7061727469616c5f636d703a3a6864366231393034343662353135653837dd02653c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a70726f6f665f73697a653a3a6863313764656535376132396661613030de024173705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643a3a70726f6f665f73697a653a3a6864353861663265666138633638666235df02673c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a636c6561725f7072656669783a3a6836616630373130366139333837376434e0024a616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a697465725f6d75743a3a6862393131663233323632303631643236e10246616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a696e736572743a3a6831373934336136343638303436653765e2025973705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c61796564456e7472793c563e3a3a7365743a3a6863393666313466663462316361396334e30243747269655f64623a3a7472696564623a3a5472696544424974657261746f723c4c3e3a3a6e65775f70726566697865643a3a6831363434633638666463393163313436e402673c747269655f64623a3a7472696564623a3a5472696544424974657261746f723c4c3e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6861663866633264636238323137336565e502673c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f686173683a3a6833396230346461666231393938623537e6025973705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c4b2c563e3a3a6765743a3a6862353239646436353236383433656263e7025b73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c532c483e3a3a73746f726167653a3a6862633033633539363438663763316338e802673c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f726f6f743a3a6835663264303939636364396361646430e9025d73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c4b2c563e3a3a6368616e6765733a3a6834663363646565343132653439336464ea025273705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a4f7665726c617965644368616e6765733a3a6368696c6472656e3a3a6839353734653431343031393530623265eb024873705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643a3a66756c6c5f73746f726167655f726f6f743a3a6837393938636130663836376363613438ec02683c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6368696c645f73746f726167653a3a6830653737343130336461623338396332ed0245616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a6765743a3a6838376466303834393062376266653863ee027d3c73705f73746174655f6d616368696e653a3a747269655f6261636b656e643a3a547269654261636b656e643c532c483e2061732073705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643c483e3e3a3a6368696c645f73746f726167653a3a6830643035306535636432323965393237ef02683c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6765745f77686974656c6973743a3a6837626233616637626436383161383966f002683c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a7365745f77686974656c6973743a3a6839643566623465623539323863356366f102693c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6578697374735f73746f726167653a3a6865383364643464383438366165613032f202693c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f617070656e643a3a6832393362333931363631666461343366f30237616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6830383662613565663438386139343936f402437061726974795f7363616c655f636f6465633a3a636f6465633a3a636f6d706163745f656e636f64655f6c656e5f746f3a3a6837336436323962336465343065633564f502703c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6861623833356636323534343263306639f6026b3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6e6578745f73746f726167655f6b65793a3a6864616365336365616165393762313935f7026e73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c532c483e3a3a6e6578745f73746f726167655f6b65795f66726f6d5f726f6f743a3a6832336263636434653039373361626231f8029b0173705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c616c6c6f633a3a7665633a3a5665633c75383e2c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a6e6578745f6368616e67653a3a6835333730303332376365316336646163f9026b3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a726561645f77726974655f636f756e743a3a6861323066636631633836343664313438fa024773705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643a3a726561645f77726974655f636f756e743a3a6863316466643231366631636466346536fb026d3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6368696c645f73746f726167655f686173683a3a6831346430396331393939663863623536fc026d3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6368696c645f73746f726167655f726f6f743a3a6832306231323135303338343734653335fd023a616c6c6f633a3a7665633a3a5665633c542c413e3a3a657874656e645f66726f6d5f736c6963653a3a6835393261306166653430653764343434fe0242747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a66726f6d5f6578697374696e673a3a6839303966633064643765333332373336ff02543c747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e20617320747269655f64623a3a547269654d75743c4c3e3e3a3a72656d6f76653a3a683063383563666661323134333735656680033e747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f61743a3a683835666361316163376439613863363881036d3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a636c6561725f6368696c645f7072656669783a3a6835616234366634636135393832616666820347616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a656e7472793a3a686130393866383330353064363864633383036173705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c4b2c563e3a3a737061776e5f6368696c643a3a6863363466303439373135323431333761840352616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a656e7472793a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a683836663033366537666531363139363585036d3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6b696c6c5f6368696c645f73746f726167653a3a683931646231623936626139386338646686037e636f72653a3a7074723a3a64726f705f696e5f706c6163653c747269655f64623a3a7472696564623a3a5472696544424974657261746f723c73705f747269653a3a4c61796f75743c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235363e3e3e3a3a683666383263313532313035363839353887036e3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a706c6163655f6368696c645f73746f726167653a3a683261343837653962336630316335396188036f3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6578697374735f6368696c645f73746f726167653a3a683661346635616264613266306230373889036f3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a7365745f6f6666636861696e5f73746f726167653a3a68653064353638346139343733393066628a035973705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c4b2c563e3a3a7365743a3a68636265383332396336303039313866348b036f3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f6368616e6765735f726f6f743a3a68353037323664616638376339363866618c03713c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a6e6578745f6368696c645f73746f726167655f6b65793a3a68643761633535613438366637643434318d03713c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a72657365745f726561645f77726974655f636f756e743a3a68643062386438666362663237333861648e034d73705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643a3a72657365745f726561645f77726974655f636f756e743a3a68323530643033623437383130346430388f03743c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f696e6465785f7472616e73616374696f6e3a3a686636393832363132316238663838623390035f73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a4f7665726c617965644368616e6765733a3a6164645f7472616e73616374696f6e5f696e6465783a3a68326137643261366437666237386362649103743c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f73746172745f7472616e73616374696f6e3a3a6866646331663461393130616434623765920335736d616c6c7665633a3a536d616c6c5665633c413e3a3a7472795f726573657276653a3a683235663932353733653737643235666293034a616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a697465725f6d75743a3a68336263643637613035613562616462369403753c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f636f6d6d69745f7472616e73616374696f6e3a3a683138373932326561306337376534343695035c73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a4f7665726c617965644368616e6765733a3a636f6d6d69745f7472616e73616374696f6e3a3a68306334613732656430646332383935369603773c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f726f6c6c6261636b5f7472616e73616374696f6e3a3a683466623561613631303061316637336597035e73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a4f7665726c617965644368616e6765733a3a726f6c6c6261636b5f7472616e73616374696f6e3a3a686363303436653666656138383136363998037a3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167655f72656e65775f7472616e73616374696f6e5f696e6465783a3a683333633963383736636362656661656699035f3c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a776970653a3a68383865333737343530396563346563629a035f73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a4f7665726c617965644368616e6765733a3a647261696e5f73746f726167655f6368616e6765733a3a68333438396366366563393538313230349b03613c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a636f6d6d69743a3a68376161623936666332643834393961649c033d73705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643a3a636f6d6d69743a3a68393939353035633834366535376337649d03623c73705f73746174655f6d616368696e653a3a6578743a3a4578743c482c4e2c423e2061732073705f65787465726e616c69746965733a3a45787465726e616c69746965733e3a3a73746f726167653a3a68386335306162383431623836633137649e030c436f72655f76657273696f6e9f03503c7061726974795f7363616c655f636f6465633a3a6572726f723a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6837313936356535623339363630316139a0033c7061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653a3a656e636f64653a3a6865663338353965333632323338313431a10312436f72655f657865637574655f626c6f636ba203723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836663861376562333534393435383035a303543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863646436313533343439373064356330a40381016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c50616c6c6574732c434f6e52756e74696d65557067726164653e3a3a657865637574655f626c6f636b3a3a6838663665653161313266383835323237a50315436f72655f696e697469616c697a655f626c6f636ba60384016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c50616c6c6574732c434f6e52756e74696d65557067726164653e3a3a696e697469616c697a655f626c6f636b3a3a6839313361353637653962643466623462a703114d657461646174615f6d65746164617461a8036c3c7061726974795f7363616c655f636f6465633a3a636f6d706163743a3a436f6d706163743c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834613236303135633036326537366335a903417061726974795f7363616c655f636f6465633a3a636f6465633a3a656e636f64655f736c6963655f6e6f5f6c656e3a3a6861383832616363623062396162306539aa031c426c6f636b4275696c6465725f6170706c795f65787472696e736963ab0383016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c50616c6c6574732c434f6e52756e74696d65557067726164653e3a3a6170706c795f65787472696e7369633a3a6865636563643932623363336332396534ac03aa0173705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f722073705f72756e74696d653a3a7472616e73616374696f6e5f76616c69646974793a3a5472616e73616374696f6e56616c69646974794572726f723e3a3a656e636f64655f746f3a3a6832343638303535306436623933646561ad031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636bae038a016672616d655f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c556e7369676e656456616c696461746f722c416c6c50616c6c6574732c434f6e52756e74696d65557067726164653e3a3a69646c655f616e645f66696e616c697a655f686f6f6b3a3a6834376531663639303538356436333230af03516672616d655f73797374656d3a3a3c696d706c206672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3e3a3a66696e616c697a653a3a6830373137323738373030666662326333b00320426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373b1036f3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866386434656266623039383062646336b203613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6836646237336466623364623738363665b3033e73705f72756e74696d653a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a6862373336623339353730393630373364b4031c426c6f636b4275696c6465725f636865636b5f696e686572656e7473b5032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6eb603214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572b703536672616d655f73797374656d3a3a3c696d706c206672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3e3a3a696e697469616c697a653a3a6832633438663832666437626366313861b803633c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a737065635f66726f6d5f697465723a3a5370656346726f6d497465723c542c493e3e3a3a66726f6d5f697465723a3a6864373866643332346635313133633366b9033a616c6c6f633a3a7665633a3a5665633c542c413e3a3a657874656e645f66726f6d5f736c6963653a3a6863363633663537396561356330316138ba031f53657373696f6e4b6579735f6465636f64655f73657373696f6e5f6b657973bb032153657373696f6e4b6579735f67656e65726174655f73657373696f6e5f6b657973bc032b436f6c6c656374436f6c6c6174696f6e496e666f5f636f6c6c6563745f636f6c6c6174696f6e5f696e666fbd03386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6832326663616663646436616565663663be038901616c6c6f633a3a7665633a3a736f757263655f697465725f6d61726b65723a3a3c696d706c20616c6c6f633a3a7665633a3a737065635f66726f6d5f697465723a3a5370656346726f6d497465723c542c493e20666f7220616c6c6f633a3a7665633a3a5665633c543e3e3a3a66726f6d5f697465723a3a6837363332646637393437343930373338bf0331636f72653a3a70616e69636b696e673a3a6173736572745f6661696c65643a3a6864656131313935383830323236646432c00331636f72653a3a70616e69636b696e673a3a6173736572745f6661696c65643a3a6838343433653966326535313362343762c103623c616c6c6f633a3a7665633a3a5665633c542c413e20617320616c6c6f633a3a7665633a3a737065635f657874656e643a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6864653537323965316335653531666164c203793c6d656d6f72795f64623a3a4d656d6f727944423c482c4b462c616c6c6f633a3a7665633a3a5665633c75383e3e2061732073705f73746174655f6d616368696e653a3a6261636b656e643a3a436f6e736f6c69646174653e3a3a636f6e736f6c69646174653a3a6864393638616564623438616632666534c303773c78636d5f6275696c6465723a3a7765696768743a3a4669786564576569676874426f756e64733c542c433e2061732078636d5f6578656375746f723a3a7472616974733a3a7765696768743a3a576569676874426f756e64733c433e3e3a3a646565703a3a6864396662623965623534623463376135c4037a3c78636d5f6275696c6465723a3a7765696768743a3a4669786564576569676874426f756e64733c542c433e2061732078636d5f6578656375746f723a3a7472616974733a3a7765696768743a3a576569676874426f756e64733c433e3e3a3a7368616c6c6f773a3a6838346532616638643534323064613533c50380016672616d655f73797374656d3a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f73797374656d3a3a4c61737452756e74696d6555706772616465496e666f3e3a3a656e636f64655f746f3a3a6866656139646632306262313536353265c6036b3c73705f72756e74696d653a3a72756e74696d655f737472696e673a3a52756e74696d65537472696e67206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6865303530353962643031393932633335c7035678636d5f6578656375746f723a3a7472616974733a3a7472616e736163745f61737365743a3a5472616e7361637441737365743a3a74656c65706f72745f61737365743a3a6862623462656638623564343363363265c8034670617261636861696e5f696e666f3a3a70616c6c65743a3a50616c6c65743c543e3a3a73746f726167655f6d657461646174613a3a6836383865333962323636653336613938c9034f70617261636861696e5f696e666f3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a6837643665313733613335613736663934ca039b013c6d656d6f72795f64623a3a4d656d6f727944423c482c6d656d6f72795f64623a3a486173684b65793c483e2c616c6c6f633a3a7665633a3a5665633c75383e3e2061732073705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e6453746f726167653c483e3e3a3a6765743a3a6862663364363833646463616232633361cb03463c616c6c6f633a3a7665633a3a5665633c542c413e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6832633965323732376331313531323134cc034a63756d756c75735f70616c6c65745f78636d3a3a70616c6c65743a3a50616c6c65743c543e3a3a73746f726167655f6d657461646174613a3a6837626333613265363165356335616438cd03363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6839326166656332393933386139356166ce03653c73705f747269653a3a6e6f64655f636f6465633a3a4e6f6465436f6465633c483e20617320747269655f64623a3a6e6f64655f636f6465633a3a4e6f6465436f6465633e3a3a6465636f64655f706c616e3a3a6831356466366335353430613630386339cf030e76616c69646174655f626c6f636bd003543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833313462633738386635656234343731d1036263756d756c75735f70616c6c65745f70617261636861696e5f73797374656d3a3a76616c69646174655f626c6f636b3a3a696d706c656d656e746174696f6e3a3a76616c69646174655f626c6f636b3a3a6836353931336562346264326162383663d203783c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6866643065393337386465353937646334d3034873705f73746174655f6d616368696e653a3a6261636b656e643a3a4261636b656e643a3a66756c6c5f73746f726167655f726f6f743a3a6835346565666161666363666165316334d403613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6835343030386234333333623262613261d5037a3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6865383831643839623230663063616161d603613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6832636362613566396136616239396265d703633c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a737065635f66726f6d5f697465723a3a5370656346726f6d497465723c542c493e3e3a3a66726f6d5f697465723a3a6838303837623030333561353437646435d8036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6831343433303464626232613261623663d903fd01636f72653a3a7074723a3a64726f705f696e5f706c6163653c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a44726f707065723c616c6c6f633a3a7665633a3a5665633c75383e2c2873705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c616c6c6f633a3a7665633a3a5665633c75383e2c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c616c6c6f633a3a7665633a3a5665633c75383e3e3e2c73705f73746f726167653a3a4368696c64496e666f293e3e3a3a6837346332663764333938626662316335da034478636d5f6578656375746f723a3a58636d4578656375746f723c436f6e6669673e3a3a646f5f657865637574655f78636d3a3a6838313231333865653036373534376435db03583c78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6832323233306433333363653735626233dc03613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6865323736376564393139356161386333dd039c01636f72653a3a7074723a3a64726f705f696e5f706c6163653c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a44726f707065723c2878636d5f6578656375746f723a3a6173736574733a3a417373657449642c78636d3a3a76303a3a6d756c74695f61737365743a3a4173736574496e7374616e6365292c28293e3e3a3a6865623464356661633237633035363231de0381013c78636d5f6578656375746f723a3a6173736574733a3a41737365747320617320636f72653a3a636f6e766572743a3a46726f6d3c616c6c6f633a3a7665633a3a5665633c78636d3a3a76303a3a6d756c74695f61737365743a3a4d756c746941737365743e3e3e3a3a66726f6d3a3a6836303636326435373530323162663234df033d78636d3a3a76303a3a6d756c74695f61737365743a3a4d756c746941737365743a3a7265616e63686f723a3a6837333566613030303839373130323765e0034778636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3a3a70726570656e645f776974683a3a6831616335636432636663326166356635e103783c285475706c65456c656d656e74302c5475706c65456c656d656e7431292061732078636d5f6578656375746f723a3a7472616974733a3a636f6e76657273696f6e3a3a436f6e766572744f726967696e3c4f3e3e3a3a636f6e766572745f6f726967696e3a3a6837656436393463613461666237613833e2034578636d5f6578656375746f723a3a58636d4578656375746f723c436f6e6669673e3a3a657865637574655f656666656374733a3a6835373861343161313634613462333435e3034078636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a73617475726174696e675f74616b653a3a6836653133383465626364643436353030e4037a3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6839663339313561666662333665376435e503783c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6862346539363132303666636139633163e603613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831633861633538636430636437393137e70346616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a697465723a3a6834383537623232383964636336373162e80344616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a697465723a3a6866623435373336316137656230363165e9034178636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a70726570656e645f6c6f636174696f6e3a3a6834643863363535303338353433323635ea03633c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a737065635f66726f6d5f697465723a3a5370656346726f6d497465723c542c493e3e3a3a66726f6d5f697465723a3a6836386331373362353861363237353530eb036e3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a636c6f6e655f737562747265653a3a6838346535623634323934653737366235ec036e3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a636c6f6e655f737562747265653a3a6863373533366364623334316330316166ed034378636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a73617475726174696e675f73756273756d653a3a6833636563333031323733343833363136ee0346616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a696e736572743a3a6837646466666530333238363036376663ef034c78636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a73617475726174696e675f73756273756d655f66756e6769626c653a3a6834666364323332643538313636626434f0036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6834636536613134393036363039623036f103573c78636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e20617320636f72653a3a636d703a3a5061727469616c45713e3a3a65713a3a6865393136633431666561363838303065f2034278636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a7472795f74616b655f66756e6769626c653a3a6838366531313033613365333232626234f3034678636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a7472795f74616b655f6e6f6e5f66756e6769626c653a3a6864633735653630373566336436326138f4034e616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a72656d6f76655f656e7472793a3a6835666137643533646539383761336235f50348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6838613134323532613065656130373066f6034278636d5f6578656375746f723a3a6173736574733a3a4173736574733a3a74616b655f6e6f6e5f66756e6769626c653a3a6838323738363264353363646235363338f703613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6862383037643630653735613537313666f803613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6835343431396664313062653237636439f9035f636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d3a3a76303a3a6f726465723a3a4f726465723c63756d756c75735f7368656c6c5f72756e74696d653a3a43616c6c3e3e3a3a6862653437653531373264613463313862fa036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6865633533663338666339646664386331fb03503c61727261797665633a3a6572726f72733a3a43617061636974794572726f723c543e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6865636165363036373164656464643635fc03463c58206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6866306636353264363534396362393035fd037a3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a636f6c6c6563743a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a6866613335363136313431376463323135fe035c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a6862633865653564613263393761633466ff034c636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207533323e3a3a666d743a3a68313065656165346362323030373437362e313537398004686672616d655f73797374656d3a3a3c696d706c206672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3e3a3a72656769737465725f65787472615f7765696768745f756e636865636b65643a3a68653732393633323565336631343031348104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a683632326165383536326164386137666182045c6672616d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a6d61703a3a53746f726167654d61703a3a73746f726167655f6d61705f66696e616c5f6b65793a3a686433656533303566336531643962353583045373705f696f3a3a747269653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a626c616b65325f3235365f6f7264657265645f726f6f743a3a68306561376462613364313537323961308404426672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a63616c6c5f66756e6374696f6e733a3a68333261613062333564313764326534388504446672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a73746f726167655f6d657461646174613a3a683061326162666261666638653664376386044d6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a683531306635373834303764653135366387049c013c6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a5353353850726566697844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866323633346661656530323062663465880499013c6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a56657273696f6e44656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683865363536653836636464383435326689049a013c6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a446257656967687444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68373935343030346231656364323731368a04a0013c6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b48617368436f756e7444656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68643135653864663461643331663131328b049d013c6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b4c656e67746844656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68323162623536633235363936376230638c049e013c6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e3a3a6d6f64756c655f636f6e7374616e74735f6d657461646174613a3a426c6f636b5765696768747344656661756c74427974654765747465723c543e206173206672616d655f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68636336303936643766313934666332668d0448616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a68326632356436616337663838643533658e044f3c78636d5f6578656375746f723a3a6173736574733a3a4173736574496420617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68336462396433646230343635636664618f04653c6672616d655f73797374656d3a3a70616c6c65743a3a50616c6c65743c543e206173206672616d655f6d657461646174613a3a4d6f64756c654572726f724d657461646174613e3a3a6d657461646174613a3a68343537353034623237303936383335319004613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831356535313461636166333365383864910425747269655f64623a3a547269653a3a6765743a3a68653536343939343838323838396632319204593c747269655f64623a3a7472696564623a3a5472696544424974657261746f723c4c3e20617320747269655f64623a3a547269654974657261746f723c4c3e3e3a3a7365656b3a3a686136363638373631663533383033363593048a02636f72653a3a7074723a3a64726f705f696e5f706c6163653c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c6d656d6f72795f64623a3a4d656d6f727944423c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235362c6d656d6f72795f64623a3a486173684b65793c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235363e2c616c6c6f633a3a7665633a3a5665633c75383e3e2c73705f72756e74696d653a3a7472616974733a3a426c616b6554776f3235363e3e3a3a68313232623135613339656534653331312e31373139940486013c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a547269654261636b656e64457373656e63653c532c483e20617320686173685f64623a3a4861736844425265663c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a6765743a3a68313136386232366139376531306638649504aa02616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a72656d6f76653a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75742c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561663e2c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4b563e3e3a3a72656d6f76655f6c6561665f6b763a3a6833616366653634653763363835616664960446616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a696e736572743a3a683062343433613265663331396539313097044c3c78636d3a3a76303a3a6a756e6374696f6e3a3a4a756e6374696f6e20617320636f72653a3a636d703a3a5061727469616c45713e3a3a65713a3a686139383930316530353339353562323398047d3c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a457068656d6572616c3c532c483e20617320686173685f64623a3a4861736844423c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a696e736572743a3a686438353465353834343166303166356399047d3c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a457068656d6572616c3c532c483e20617320686173685f64623a3a4861736844423c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a72656d6f76653a3a68633133306133346536633731343563309a047e3c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a457068656d6572616c3c532c483e20617320686173685f64623a3a4861736844423c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a656d706c6163653a3a68643861373031366130613166623530359b0483013c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a457068656d6572616c3c532c483e20617320686173685f64623a3a41734861736844423c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a61735f686173685f64623a3a68326632376162653465613661323436399c0487013c73705f73746174655f6d616368696e653a3a747269655f6261636b656e645f657373656e63653a3a457068656d6572616c3c532c483e20617320686173685f64623a3a41734861736844423c482c616c6c6f633a3a7665633a3a5665633c75383e3e3e3a3a61735f686173685f64625f6d75743a3a68646564353439353233353330663165319d047c7061726974795f7363616c655f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f646520666f72202851302c5230293e3a3a6465636f64653a3a68633539653461663333393538383661389e04543c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68626235373765633132313530303433619f046c3c636f72653a3a697465723a3a61646170746572733a3a636861696e3a3a436861696e3c412c423e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6863396134393164356430346562643632a004723c73705f72756e74696d653a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f7363616c655f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862626266373431656433306566663131a104386672616d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6865636365356138306364636463613364a2045073705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a73746172745f62617463685f7665726966793a3a6836356465336238396535643461373434a3045173705f696f3a3a63727970746f3a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a66696e6973685f62617463685f7665726966793a3a6839646161386332633466333633626365a4044573705f696f3a3a6d6973633a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7072696e745f6865783a3a6833313037363666636634346663383233a504363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6862363630326565303930623965643130a60431636f72653a3a70616e69636b696e673a3a6173736572745f6661696c65643a3a6831323237313063663435666163643130a7045c3c6672616d655f737570706f72743a3a7472616974733a3a6d657461646174613a3a50616c6c657456657273696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863343733333632393238353666353238a8046a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6838313662383939386361376235643163a9043a747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a63616368653a3a6834316431393136343866653530326330aa0445747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a696e736572745f696e73706563746f723a3a6839323635663466303437663639376566ab04363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a6839336631356634623161396665336538ac04376861736862726f776e3a3a7365743a3a486173685365743c542c533e3a3a696e736572743a3a6861646633386430306331623961393466ad043c747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a66726f6d5f656e636f6465643a3a6865653830316163346164656533393332ae0465747269655f64623a3a6e6962626c653a3a6e6962626c65736c6963653a3a3c696d706c20747269655f64623a3a6e6962626c653a3a4e6962626c65536c6963653e3a3a746f5f73746f7265645f72616e67653a3a6832313566393262343438373337363632af043e747269655f64623a3a7472696564626d75743a3a4e6f64653c4f3e3a3a696e6c696e655f6f725f686173683a3a6866626265653931643164663532653665b0043e747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a72656d6f76655f61743a3a6863313966313831386436636331663837b10445747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a72656d6f76655f696e73706563746f723a3a6834333036646661663563646130343638b20438747269655f64623a3a7472696564626d75743a3a5472696544424d75743c4c3e3a3a6669783a3a6833616664323564386635326636343730b30432747269655f64623a3a7472696564626d75743a3a636f6d62696e655f6b65793a3a6835303732363836373338303630633137b404417061726974795f7363616c655f636f6465633a3a636f6465633a3a656e636f64655f736c6963655f6e6f5f6c656e3a3a6830313366383837663665356364303462b504417061726974795f7363616c655f636f6465633a3a636f6465633a3a656e636f64655f736c6963655f6e6f5f6c656e3a3a6863663339623665333530353637313162b604417061726974795f7363616c655f636f6465633a3a636f6465633a3a656e636f64655f736c6963655f6e6f5f6c656e3a3a6861386634393663663264383663313565b704417061726974795f7363616c655f636f6465633a3a636f6465633a3a656e636f64655f736c6963655f6e6f5f6c656e3a3a6862353035333964623761663936633865b804417061726974795f7363616c655f636f6465633a3a636f6465633a3a656e636f64655f736c6963655f6e6f5f6c656e3a3a6864343264613063613365363339333339b904417061726974795f7363616c655f636f6465633a3a636f6465633a3a656e636f64655f736c6963655f6e6f5f6c656e3a3a6861623262363533336235316362613464ba047b6672616d655f6d657461646174613a3a5f3a3a3c696d706c207061726974795f7363616c655f636f6465633a3a636f6465633a3a456e636f646520666f72206672616d655f6d657461646174613a3a53746f726167654861736865723e3a3a656e636f64655f746f3a3a6866663737316562373031663434386239bb04543c6672616d655f73797374656d3a3a6c696d6974733a3a56616c69646174696f6e4572726f727320617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839396439363464376533383639616334bc04383c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a6863353833386563616566616462336238bd04343c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a6833373036613530626563623430313461be04363c6c6f673a3a4e6f704c6f67676572206173206c6f673a3a4c6f673e3a3a666c7573683a3a6833323266663961303132303133383362bf044e3c7061726974795f7363616c655f636f6465633a3a6572726f723a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835636238353930626239303132393432c0043f7061726974795f7363616c655f636f6465633a3a636f6465633a3a4f75747075743a3a707573685f627974653a3a6835346432343330353734623164636462c104333c265420617320636f72653a3a666d743a3a4c6f7765724865783e3a3a666d743a3a6839356532343834346664356661633335c2044a3c736d616c6c7665633a3a436f6c6c656374696f6e416c6c6f6345727220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838346665636338613465323536393566c304303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837376161316435366631333932393538c4044273705f65787465726e616c69746965733a3a73636f70655f6c696d697465643a3a474c4f42414c3a3a5f5f696e69743a3a6834396138633561666465646638326363c5047773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a46726f6d46464956616c756520666f7220543e3a3a66726f6d5f6666695f76616c75653a3a6831636264363561343838363639313838c6047773705f72756e74696d655f696e746572666163653a3a706173735f62793a3a3c696d706c2073705f72756e74696d655f696e746572666163653a3a7761736d3a3a46726f6d46464956616c756520666f7220543e3a3a66726f6d5f6666695f76616c75653a3a6834326337353836363163616465336536c7045273705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561723a3a6832626232396431663837393530376332c8045973705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561725f7072656669783a3a6862626633326661623562386566313532c9045373705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6578697374733a3a6832373939396236383861326564643734ca045073705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6765743a3a6839303165396231313831623664306237cb045573705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6578745f6b65793a3a6836396237343631363136646636303136cc045173705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726561643a3a6866653064373337633439333732656436cd045173705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726f6f743a3a6835366232636463386439383435623564ce045073705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7365743a3a6837343739636530396331363863663030cf045973705f696f3a3a64656661756c745f6368696c645f73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a73746f726167655f6b696c6c3a3a6836326131393234613631366666663864d004303c282920617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6833373731373337333431623563313236d104323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6833613033656638373937343232653262d204323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6831633632343063396537613866326539d3042673705f696f3a3a6c6f6767696e673a3a6c6f673a3a6831363533396131366539326363386638d4044573705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a617070656e643a3a6864333761616236613235353131363238d5044b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6368616e6765735f726f6f743a3a6835656663356564626666326565636230d6044473705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561723a3a6836373964666331346631313130663433d7044b73705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561725f7072656669783a3a6862653863333066343062333534663236d8045173705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636f6d6d69745f7472616e73616374696f6e3a3a6862383433373166626335393534633034d9044573705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6578697374733a3a6835663138613336356466333830356631da044273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6765743a3a6832326566373862376362346332313035db044773705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a6e6578745f6b65793a3a6830653935363231396661613931373139dc044373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726561643a3a6831333365326136303638353566313964dd045373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726f6c6c6261636b5f7472616e73616374696f6e3a3a6832303731316162356135353462616234de044373705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a726f6f743a3a6838346636626261376363626163316231df044273705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7365743a3a6830366363366538376363316137313137e0045073705f696f3a3a73746f726167653a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a73746172745f7472616e73616374696f6e3a3a6862343263393537383130346631626337e1044b73705f696f3a3a6f6666636861696e5f696e6465783a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a636c6561723a3a6837636433393038303034666331316434e2044973705f696f3a3a6f6666636861696e5f696e6465783a3a65787465726e5f686f73745f66756e6374696f6e5f696d706c733a3a7365743a3a6832613733646436323361363630666636e304533c73705f72756e74696d653a3a72756e74696d655f6c6f676765723a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a656e61626c65643a3a6839666230313735633266363431616165e4044f3c73705f72756e74696d653a3a72756e74696d655f6c6f676765723a3a52756e74696d654c6f67676572206173206c6f673a3a4c6f673e3a3a6c6f673a3a6832613666313566373266636435393838e5043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6864336531323563623934326332663332e6043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6835353665646366393938373039333936e704aa02616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a72656d6f76653a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75742c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561663e2c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4b563e3e3a3a72656d6f76655f6c6561665f6b763a3a6834313863323165663033383532336339e80464616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f6368696c645f656467653a3a6862353465656538363436376535376331e9045a616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f6c6566743a3a6861623038323664663333326432363139ea045b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f72696768743a3a6866393439646337366165336631386233eb0460616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f706172656e743a3a6862343435663836366533306234656461ec04aa02616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a72656d6f76653a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75742c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561663e2c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4b563e3e3a3a72656d6f76655f6c6561665f6b763a3a6830633561626338366632383335626136ed0464616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f6368696c645f656467653a3a6866626136626332653265363235313737ee045a616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f6c6566743a3a6864643966373737643537393636326234ef045b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f72696768743a3a6833323936636534346135643932316538f00460616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f706172656e743a3a6861333333616631383038363565653463f104ba01616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c426f72726f77547970652c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561664f72496e7465726e616c3e3e3a3a7365617263685f747265653a3a6833393064323636373564316338646663f2046e3c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a636c6f6e655f737562747265653a3a6839306235643433663438613564643364f30446616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365743a3a42547265655365743c543e3a3a696e736572743a3a6832623136316138366564643438376463f4046773705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c4b2c563e3a3a636c6f73655f7472616e73616374696f6e3a3a6838316564363663363163303466613866f5046f3c73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4e6f4f70656e5472616e73616374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839393062613539356334303738366330f6046773705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a4f7665726c617965644d61703c4b2c563e3a3a636c6f73655f7472616e73616374696f6e3a3a6835306464383261356237333036346132f7046e3c73705f73746174655f6d616368696e653a3a6f7665726c617965645f6368616e6765733a3a6368616e67657365743a3a416c7265616479496e52756e74696d6520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839633431386138396131646333396662f8044c3c73705f73746174655f6d616368696e653a3a44656661756c744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839353362366335636161383664346438f90439747269655f64623a3a6e6962626c653a3a6e6962626c655f6f70733a3a73686966745f6b65793a3a6836323266313733343737643339613130fa044478636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3a3a74616b655f6c6173743a3a6831626337353231633337353332366463fb044778636d3a3a76303a3a6d756c74695f6c6f636174696f6e3a3a4d756c74694c6f636174696f6e3a3a706172656e745f636f756e743a3a6865386133306562386264666663373765fc0464616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a6d657267655f747261636b696e675f6368696c645f656467653a3a6863323861633434663635353935323132fd045a616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a42616c616e63696e67436f6e746578743c4b2c563e3a3a62756c6b5f737465616c5f6c6566743a3a6831646565613831336165346363313562fe04aa02616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a72656d6f76653a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75742c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561663e2c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4b563e3e3a3a72656d6f76655f6c6561665f6b763a3a6866323834643231653432363761303565ff04ba01616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a7365617263683a3a3c696d706c20616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a4e6f64655265663c426f72726f77547970652c4b2c562c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561664f72496e7465726e616c3e3e3a3a7365617263685f747265653a3a686237306635613461623737643366303380054278636d5f6578656375746f723a3a6173736574733a3a417373657449643a3a70726570656e645f6c6f636174696f6e3a3a686336633265373764613739316331346281054a636f72653a3a7074723a3a64726f705f696e5f706c6163653c78636d5f6578656375746f723a3a6173736574733a3a417373657449643e3a3a6837373566333563626334623630313436820552616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a656e7472793a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a68616238393164666666353031633736638305095f5f6c7368727469338405085f5f6d756c7469338505066d656d6370798605076d656d6d6f76658705066d656d73657488050462636d708905095f5f6173686c74693300550970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d62790105727573746325312e35322e302d6e696768746c79202864366561656131633820323032312d30332d313429", - "0x0d715f2646c8f85767b5d2764bb27826878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x45323df7cc47150b3930e2666b0aa313878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x79e2fe5d327165001f8232643023ed8b878d434d6125b40443fe11fd292d13a4": "0x00000100" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis-values.json b/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis-values.json deleted file mode 100644 index 0325288dfeb9..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis-values.json +++ /dev/null @@ -1 +0,0 @@ -[["0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1","0x00000000"],["0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a","0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3"],["0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505","0x00a0acb9030000000000000000000000"],["0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x267ada16405529c2f7ef2727d71edbde4e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x3a63","0x"],["0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d","0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3"],["0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d","0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3"],["0x5e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1","0x01"],["0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80","0x00000000000000000000000000000000"],["0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30b1aeeca675702f24c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421","0x4c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421"],["0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb314f6a7e973c2c34dc5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762","0xc5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762"],["0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34cb6fa5260704ee40b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3","0x0b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3"],["0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35242002c980f9df1c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811","0xc7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811"],["0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502fe5f80e8854f64761757261804c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421","0x4c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421"],["0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a3f059d7e690a34f6175726180c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811","0xc7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811"],["0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c41649dd3c9d26696175726180c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762","0xc5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762"],["0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fa571e62466b970561757261800b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3","0x0b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3"],["0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903","0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3"],["0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609","0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d54214c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b30b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3"],["0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429","0x0000"],["0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4","0x02000000"],["0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429","0x0000"]] \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis-values.scale b/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis-values.scale deleted file mode 100644 index bea223edb330..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis-values.scale +++ /dev/null @@ -1 +0,0 @@ -0x0006908015464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf110000000008015464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea4290800008015464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a0502104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b38015464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe185054000a0acb9030000000000000000000000801809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea42908000080267ada16405529c2f7ef2727d71edbde4e7b9012096b41c4eb3aaf947f6ea429080000083a6300803c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429080000803c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d0502104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3803f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea4290800008057f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea4290800008057f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d0502104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3805e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea42908000080682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429080000807474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429080000807b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea42908000080c2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1040180c2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea42908000080c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80400000000000000000000000000000000080cd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea4290800002101cec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30b1aeeca675702f24c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421804c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d54212101cec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb314f6a7e973c2c34dc5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b76280c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7622101cec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34cb6fa5260704ee40b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3800b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b32101cec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35242002c980f9df1c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d781180c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d781180cec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea4290800003501cec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502fe5f80e8854f64761757261804c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421804c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d54213501cec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a3f059d7e690a34f6175726180c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d781180c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d78113501cec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c41649dd3c9d26696175726180c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b76280c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7623501cec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fa571e62466b970561757261800b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3800b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b380cec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e169030502104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b380cec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d46090504104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d54214c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b30b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b380d57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea42908000080d5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea42908000080e38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea42908000080e38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4100200000080f0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429080000 \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis.json b/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis.json deleted file mode 100644 index fff9bbe1ea14..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-polkadot-genesis.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "Polkadot Asset Hub", - "id": "asset-hub-polkadot", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.65.251.121/tcp/30334/p2p/12D3KooWG3GrM6XKMM4gp3cvemdwUvu96ziYoJmqmetLZBXE8bSa", - "/ip4/34.65.35.228/tcp/30334/p2p/12D3KooWMRyTLrCEPcAQD6c4EnudL3vVzg9zji3whvsMYPUYevpq", - "/ip4/34.83.247.146/tcp/30334/p2p/12D3KooWE4jFh5FpJDkWVZhnWtFnbSqRhdjvC7Dp9b8b3FTuubQC", - "/ip4/104.199.117.230/tcp/30334/p2p/12D3KooWG9R8pVXKumVo2rdkeVD4j5PVhRTqmYgLHY3a4yPYgLqM" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 0, - "tokenDecimals": 10, - "tokenSymbol": "DOT" - }, - "relay_chain": "polkadot", - "para_id": 1000, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da934fe21438e43955d2917f11ffd2f74d24c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3a63": "0x", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x02000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c41649dd3c9d26696175726180c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762": "0xc5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30b1aeeca675702f24c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421": "0x4c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a3f059d7e690a34f6175726180c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811": "0xc7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da905f2cada6eda1538ae80ad25967fae940b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da974ba036f69b844c7eca06cadee15075fc7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x65092473746174656d696e74", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35242002c980f9df1c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811": "0xc7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb314f6a7e973c2c34dc5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762": "0xc5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fa571e62466b970561757261800b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3": "0x0b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34cb6fa5260704ee40b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3": "0x0b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502fe5f80e8854f64761757261804c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421": "0x4c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00585c7e041e77c5fb10511050cc281d0a5d5a68f2912d7947b66df0402a93fdc40fd8d34ccf97153632d5506b6f047cb3b14b842c862c8526c60739957875e9fb17988ed9cb8436b4b7bfbdfdc38aeedbb6b6b7245b6e29a54c29057e1102108d103d9dea97524ac73ae523b9a33dd375d0677344ba7c2e9f159fe5d3e37bd1a2720abfe5964bdede176a8b3b9a2e1b305dba505b5c55bdc59b1159ce55f8d1df36b7d7336e47483dccf9beaabea98d11de789eb33fef8de779bbe5743ae56c06a1df15522d679f9b451be3cc48bbe5736b7f47da2dcbe37425f9cf69bc2e4f7a2e7d6e67a4f44b5e5b742991b8e9a7d3b729c97f2eb7daff3cfaabfc6f72bb429e91f8fc68bae5f425619ea4249f7a12d29e61627a259cbf5c09fb93530c730cc3b0337fed0e798e6d95ff615b74ca64fe727ada906278de21d3df56fba7473f15457fdcf4976fb600d55fdcae90e942fdb6ca3fbd3323d127f75ce8bd8d3d6ef4397dd8dbdad908ff73c869279e778c60897e32449a9e76940d740adb2967cb371a6ffc4b033d39b5a1bebef39a0ef4d7b5a1e6fa16e1dfcd7708d0afc723d14f4e4f5b63a72dfa6645278f427ddaf6f9b23833326df8e96644cb375a77974fb79c33a21357557f72a127d4d686da6077ebd746e33685bff214c64edbe571db87f435bf5783f49ec7c8fbe993f31db2ce1fb78b3bb27cfa69db8719d2fce89b35c0f2c96136bb3758edf975d8ad737644fafac908ffec6ee5c6237dbd3031fd009e5a5bb57c3aa59b5d5c55fde5a7adf22f40f5c5ef0a39f974a177dad8e7b64f19dbece290deb7cf7624f8d12b74c921f1474e6571fc816e1a5cb4a4a1628318a40933b419dd4675c7ae75c71ea45567ecd999c8b3b3c3d0a9f8ecdea9256305569edda7837888bfb6f0bccebe3efcdadf368376f45c85afcf4e778b54a08faa38c3e9238dd0ebe3ead23faf1703768e8fdc16e8d177831eb709acd006184d43eb6fab3dfcabd29fa89678cbebd247df7d617785ba2b21c2bc12bfc541d9328ff49a9a5e725b7a585f5255716608724cb5878f5c7d5eaf6f177a6f53e12963705bdfcc029b4696a17d9b0aff9658d5af71d075aa0a97a68ba9de4e96071070d4f9eff97bfe9ebf0744977fefbdf7842e91d6be2b2a5ebe7d625a0b54068d7ddb85f5a57463d076058415ef547b4354a7da7d3a05bf573f9cf976ac83de10fc2ae4bbe7db19280a65e7ad3b9fb681eeb753f6c75e1ffbf3653f7a424d79eb5ffd1499c1cfcefc141c1bda186fefb3291223f353b09a2d92c44c8f14c3b3b76f960432313d1fd198b04eedb753c6768bb0d7caff360368fccfd7372be266778b649b9e775b9f7edc40a0fbdba9dabe0edbd9ebfa76b7dd413780d69ea4fd68b9ed0e728f136a55f303e8c6a041afa88f0ed4a93a8974aa6a5da72ad0478fde42a7de4732b238e3a3f774500fc1f0f1ab908fae75aa3d7a4ea79e478f8e758a3dfafa44ee68574b747d7d2ad03fa7bbf153ce886077ecdb1d7355e93d6cce88983b027db77d4a372b925cf5973e3b5bbe81dd7155e9fd895ad4ba2eae5e7ef2cbc2b45fd73a65f9f39c4e5dfe9c5edb76b7dd61ce59113fec0ee32ae6276c537a7f39e55e7e356b6dfb74db3f5da85f9f2fe88a0f6dffec0ea93dbf5c951efd397dbbfb70abfc53e257263f39a5f8eb9b112df6ed9436b699e4aaeaa5f3b6dbcb966f28cc766fb0ee7cba7b6eb977f77c3322ebc90d561e5ee9bdf4ddb46dbb6be78c4872919bdd699ddaffe770dbf7f9822013131313d3d0f36e8bbc7fee03f49b82eac49108ba07d076e5c31abf2b263406f85df960e5fddb3723a2ad98c87c85df2ed4937dce7d41db3f557bf6aa7d9ddf0e3bb5debe9db27c1d764afafaecd4fe3a95dbbeb5f1d35d417b18674416e78226bd3322e99bcdb02f3d3b62b9e4aae596d3ce8e686ff966b03be89b1145979be59b3dbad9c9e756e7e5a72d89f48bab6ccd0a8f2edfdf8ce8723ab72ac34ba79b4daece9f2eb7baab976e6dd59a41490d4c70d061bb932ef4e67684f49a9a9ad0fcf47d6bdb975b85e1a153c6e6063d099197d78664fde42aff94f792ab3cbc74ca98b5ed6f2639a5f791e1b6ddb1bf6dbbab39cfbe3e7d31a44281e868eb2be9768abdce5fdf4eb5afd3def87963c67adb879d8abe4e99b1c84e1b4b69ed3b3555b4e7edd15f461439173476fab0b8f177c6bed973a1de8ca85da82963bcedf7c6bf9903f6d9855aa855cc8c02ba2c68d4667daa1604fbe7f93add1534ce88b6bb3afff96645fcdbdd73a16e41e367e761dfdfeed67990cc6f9fdf1c0f9276e8ed9053e2676ebbabf0d79f6f7684bdb9dace2ed4da6f0aaa6615dd18b4f68afae7cf519d5a7fded329f6e7b08378e8b9d6a9fdb2451eff7c3bb55f73fef9fa3ceec87f53503117d12d80b6ab1f98fee6f78b16287e6fe86e7bd1b8df551962bcf5bb2aa38be75f1dba02d036d27d4157d8ab34f7cea955d1decf73f675d40bba22bd4a94915b5a315cf4a8b2461936f69862e8ca1caad2beb462b8e851658d326cec31c55015d4fb79cedc15d45015f6e696560c173daaac51868d3da618ba3287aab42fad182e7a5459a30c1b7b4c3154857d0ae8eb4bcd7d0665df4ed575e6b6bbf57515f30fba2b262dbf165d206d23dd01681bb338f804545270aa61ca9ab23bb22e321d646d64623221647064633237b22ab233b21b64696466646864646441c8bc6463646f6476645f64ab0c0b9a062d032b236b80c92053224b024b238322730156844904b403c382de8165715dc15a8071c1b6602cc0a4c0a2c0a0b8f2b88a6095218740d1907744166456cc1fe819b30a3602ec4a842352116b10bb886e4431221d718e2847e4412413e3883d883a885f4432a21631075009518d6845c4416c23aee21ad10ba8075c024c039310b78863442ce297c8060c038a01c1e831ed46a7d161ba8c3ea371d036e81bb41a8d46c7d13e68207499de41f3a0c9f40fba072d47cfd1669a0e4a053645cc8276c1564091a02aa029a0495014d025a812a71f4e3e5c7b5c7a5c69ae255c4ab89270a1b990701da1c1602a681bf00a76051c024684f602c3e31d31b35c43642f8043bc275e13cd823ed3681a09991a6d470fa1eb6821644ff41bad477fd1ab86416fc9c2740ab23238080c0436c33b1822240210e02ab0217238bac1860d34615243d113185e286224fb41e645c64526461646064694828a6912d020741ef407f40dde4296a1435c54a81b3c03ba83be42c7502c340b354146033a82931ed91cd40aad42a950a653d3c4a38d70f9c0634e7b5020a80ff30e5a86c201c7805250339709e81569062523d1a040c0ac70163d029e820a81cb301db407548e2b0bfd813a61c561c9718282fae0aad2696809e61e748e99860e818bc075d038280f380c4a47c760d231cbf01b9815d81c93ccec810587a54657b1d2b0d0c8b6a027b0c0585f2c322c312ea68802cb4b2481b5b2beb0bcb06a60756171616d618d81f980d661656161615d9115915199406026805b5033b023402e280e2811281874c55998082e019380b1f0087808bec25658080e82ab301506827f601f9849b524821e4200820fcc2649c7d423a3232b93f940ee8092203323e79072c8382419d903c9031e422f81ea21eb90769c92704273fd005120bf902b78073c73013197703ac2c9085309a73c4e458078c0234023cc39e60fa60f6612388f1311269a131ea733a73b4e765834b0c2b0c09848380de154c73c02e3719d00b20042019f9846380961f260ca31e39879cc229c827002c224c2c9cce907271f9ce8804cc024e012d0065005a732b08cd31cd0cb298e1399530f4e3b38c101c19cde38b9711ab303122fe124e6d4c63c63c980b938e9e0c4c6698d530e4e3868199c6e00bf9cc29cd438a5713ae3640613a1a9e03b4e659c6c20cf7855b01bcc03968375d054ba04348888444c41f685124185884744236211f104d104314b242296a0a580486828601eb0089008bd455701c9e823c028e00aa012fd44d3c03ae3c1e059f1a87831682eba8bae41dfd157506002ad45cfa0b3682b3a8a2682d3b4123a096c04fe01fb80c9f01c1c07f780db60316c0306c3abd7a5adf018ec057b6131180cee82bfe01a74165e01c78061c028682c8c04a7608ad2052ca0a4e1484012070cc13028fff2a4e3ea6724a5c90696e8d0c40887254b28bf1ba0182d59725a367ab281264a5076e0c012251b8c929cdc00c5c9922541e4126aa40b6c58128503508e3c791245014a36183d7912450103902d58294f9c345132ba61899111075490526c140e4071b2e40349463b202d71a2c32b4131cae1034d94b88c628d6c801205ca92264b9ce8f046364089e20025283b44b1c18637413a7143141b8c6e404132b1523e6074b4448a940f18218112c58914294611d8a412eb01273a7c92d15152140a24d924116ba4d4e406274f9a4c5962b483d10e0fa0e106a30e74a0090d03905856ca910d4638d820abac142528464946384071e292098a130ef04425ac0d4ea4407192a4c483d1920f3cd14187264b928c6e78e26487a1231ba23c19ea89683687254d949adcd044c9a80137d1082070f2a489132527509cfc8844d8231ba23cd9c01223a51d6c30e2c108279ed9a4280ac0e210568a9113252749517050daa1898f58c74289e244a949d20e372c518af244ca12273a7c93a41dfe079088c5faf2c6995f15dd1513d3b3ea0591500c2806ebc0168c4168775728861862e06e18f9bdf82284dd2c5ccc1dfbb15004c378237337c32110728ccc0dd926c238e30f88358430be392194f39d229404903172d7c4860988188661ddd1826fee8b91e3bb5ec708991b0131068116ecc82a442cc6d831325318b787c438230c70c6b80fce176384fd42336cab1b8b5000565b59775b6dd3998d8dc5dccccdfbe083323e026c8471c68e56b42c2b5a56b422437880222f62588cf100302832910e1224c6564185f92084168cd00030461887047547d82fd5dded42470b420c8b9161ec1638428f303e0823846f4e660827853c9962b13b1863010cd031c2180b103b42d8cd4264e6187508400018615b31c68b9939c60761dbbcc80273c4626c1d9d06823a5027469d5803e30a3a10ea449dd89de9bc173beab44e479d8e3a5127461d9df8628c59bf7e96d5338b59c739dfbcde9cf3d4f2c1f8fac199c5281fdc18e77c51ee23000164165f96c118e38331c2f72084b1bb1bc3608436f104874418237c11760b19c00062ecf8b48e3531760b2036fcc1b06ea634c668a910bb18218410c61863c78ed18ab061c7183b768cf0b58416bf385fe4c7cc70ce8d1c63376cb831be185f84cccc1d993966af330921673342c8fc209c12facc79a9707a5005156ca605610780193204408ca718394218636cd81d21f3db181b76c38edc1c19c618238cdd31368cdd2f3ec8dc3de17c5127f28b00e81863ecee086184f14d78bae6933e33cb3208e1ecc8f04919bb1bce86313233dc14b85de66576de2ce6b9cc11324366960be1e5b41b05c811468ecc3b37b63521ccb2ec04cbcab22c8e6c8e6783831427509c70a0c3c106a5261b50a1002998c001274946536e304a61e706a324a31b92a22c49b950002327494a02486aa2244585203d3b473634d9c093275104c0b3f3e3841f41767a32251b9a4881d22449698992931c7288d2f9e078a41875004a131c6ce0a018e9a043931e2b875e168c9238b024298a52131ba23c79d2a4470bc283d10d509c2c81e2a4090e3670800351765a4899c043140f289d9072a100be5300169614c0e8a8c9930d2ce90014273848698283e7e04409ca0e495c10221c50dac18420cb82110e4b94a03849d261890d529ce4d08332526a926404c5a8034b0ec0820b2e142009003a5b002329528c9274c8218a0d4b928ca644b1c1286949132937d860b48485a3940b05d0c10623294ba228e9f081241b820cf0c4c9111010292afc508a1225e786264649dd078c8e9628f1600445880f25a30ea8c0821425294e783012c0cd168007271c304ad201484b6a62f4c48625461d6892144549ca921b9e38c1c186254a4f7668c201a31b7e6c9e184d317ab284872639a030058ad1ab5916964089e2444a92d194251d88f2644907a038e94007a23c59a2c483519029508c1ecef60792a2e46094839c02c5e80d20134243261b7b899754966a696969e952bd25152fa954d692eac46449055591c92ea9544f0599a878554bcd649754cd6497541693552da99e6a3e26aaa55e5a5a523d264bbc8f898a9798c92e3113d5122f319325562d2d2d41264bbcb4b4b4b4f498ecd2523351f132d9a525d563b2cb64899754cd6449653151b12a3251b18a99ac4a325995aa99ecaa542a1564b22a6e262a56a9548fc93f31bcbb9c8394261bdc94201fc46b74ea371bd28df3388ddb94f7387447238754e315f329ef71d8e1d9aaea6f886a1c738a6d353a067fb39dddae621c52106ecb159457d171940eeae43a393ebc8ab63f3ffc34b98afa1f8ef3c37d7895dd1f205c9dff438aeaa7bcc7e1c6db71bcc6a90b35bd36cc6f362946b8e8d7867171ebad2eadbefd654934bf6e7ab3f19ccdc7a6bd9f769c0df57eda6f3629367eda7a3835e104162a38e20b33b40cedfb69d7b66ab98d5f5b856f53b365db94f7d1e9562384469d9bbe5e8e39674418e782c6557a715b4eded9162b3e74e2968086a6884ee3c673047ef4f9f0c748019aeff91d0305699e36163b50550fc57aa5f7d155481c391e249747bfb8e80d98c23f399e23f3a53fb17eca7be891f3b7d4aa5e7a2a6b8955d6d4c4d06dba3dc37b2834efa1ba7bf0e606e6f7de833046f8de7b10c2278760599675f95acd5951ffc63bc4f26b83dd59bea71b1abad3a26545c8cd4c2dcbb2ae6bb2e530336259d69c9c0b5acf6e4b8e25c8408730c66daf1ba1ee34089763dc655ee68510c227655cc8cc9816d921185d73d70149cb92cc80b62c19638c52ca28e38010f24208a5438f0fa1cf7b31c65d8710c218a58c90194218638443d065415b02b50419d99ddcdd778381eea657b75ccbe95474e915f51ba377ebeed3a9ce889673417bfbb6c870d9b27a512fa565cd69adf336bfccc8329c5b4d158d3923b22c695531e1f4cd88849aa5b33377c495399e23565f1e9b7bba9bbcedcf29b9e79cf374bae69cf3baaec91d01592ee0d85df4f9d8c33c6fbaeeb49804bb9b9bb99bbbd93fa2de4f0cd345c3b2ea3ebed7cd96259b5fa322d6cd3d3bc5edbc7137cb1eac0105171ea040e285fcae9ea8e33766cdeff5b6d68d52f37bbdcc6cc7ee72af57d87da3033373f37bddcccddcbbbbcf798390dbf7dab9979957072f088b71df8d0c49f0e38310be9826a7bbad90d917dee0d05d7b74a0c75c12acb37bd2a1fb739fd7bb1cd6dddb5ddeddf57dba5b6d24565353d31ebfbefcb4f7f380feed32f32e6bdae674d0f39e7fbb2b8b8da0e92b659cdb13f8208c0f42f850107f09d4126490f8a5a85e4a9f9bb54179a3443af427a5f46749a26959525a525a31c6d8c3755dd725ad28a58c3fd05da6b31fd1ec8e2b7c6fb66fbc61d2cdddaf217caffb753f6666d8db83cffb7177f3109aa64108a5b7576d51ac750a7a7b4ea7ac8c08722e6872d3b63857d36053d1dd0f42ef0a639c7b0343775a770febee3d87efc1172384efc1f76077770f52722f427fb0df7b1d7980c6667d8ac69c3913175ad6844e8475f72c2b7a73162d6e76f720840ea1dcf6174628658c104608e37befc1adc2874e539a65714f4687f141089f0e76056d09d4126422ac504a785383e50be5269f0bb59c61ff396aa7a68a74ad53d2a1e750c96cc9e830ca684919a38c5142ed610f6f79dc684a935272fb2ce951c218235734e60ce48e5cd66146176b469725504b9091d616ea73631e24d0a74f0e7a9d1ccf91e89647b7b82d567c887297bfd51370bccfefea892c7efa5e1cd69df4a23167525a85735abeefa6a73b2d097e9daf7acb6536bbb35cf54563d0ace5316b400f5f959ae8e28adca05234064da72a7396c46a6a2a1a83e6a9c55e34e6cce4bec80da6aa3d9a0e9aef47faa6f8374c17ed778c1d60f931ce58fdae58b0c4a37ec7d8c1125f34264d4684f48adc60ea6ebf87bfdcda2a7ccb694a3bf989dbecb4dd4dcb85deb529f54fb7b6a23169ba9b5c911b54badb2f1a73a653aadfe76cfba6684c1dddedd709df2a1a93c766492c8b2b1a73a6bb7d8f2dbf4887ed193b85584a7b2f23b22495118319117b67d05f46f49cb319f699398a9ed2ddddf095badfc8f3a67ffe1cfee378903c8ffe18729535ee12352290e0c50b3196c54e2dcb820e34ef8816574377d1eb8629a2a13b56f282a43b74a11724b9d308ac7041104bf0a0893ad200e3e44699c855fe4e652d882f3e415b094dfefa5e0f083e20a07618bd3dbee617d440ccefaa8b2b0af0bbea828cf717c4549ac37c642c1f994aff446726fea2699d6a879cd65de4877043d1c5dec643a720775d1c7d18cc8a1e97a3bd201dde4ff4a87dd4a1bbe87d84c60fbdee998fce59915277d1618cfc6f9bbf535345db30cf4c1f5d07a50ed29898987c188a0e8924e782365fa8df4619d3624e07ed50f4cd2037bb8b8e02cd3bc5ff3c76e1e5a3dfd029e8d171e017f8a3efdb17c44395c8aaae97871ed44375e1780e03f3a0eb5397ccb3eba0d55d09bd2025ef87bde66bce8a89892988a1daf3eda362a28a156e542973c7127430d43e3b757daf9c38e35b30e69bab4f80be5d49775234fefdba618276883da78384e60b027a3fec455fe0e86e7f86eed86b0e0fd59e87a2d50df3ec4a68e8d43e7b0d9d6a67c740a79a3d4943fdae9e30c19f7e574f08f115e8c9b418ba608250fdb345563a14ed796de1d7b14ed54e75aab9e7fdd31eb7ed0eb25721bfde750ad2a0ed971650e182c46ff61eab0105f5dbdd06bbebe6419bff04f5d079a0d27ba22d925b420d4dc183043e3b7ce67890b047e77f5c2fb10a3637419fd39d9a20de9603ea8f9e63dd71a73a68df4f4a7b822262afd22defe8d0eb13d45bdbecae7d6e5134e9bd9d9a5c911a59badb6fb78276a89db32453f899935c0ea88fdc1174c86d7716b7101ac008107fbf78618606348a45cb1bc2cab3cd736ac3b52f3fed6d7a670c507dd11b4f17ea2b68fee4935e7e44fde4944a4cfa74e854d3e32136b77aca32efcc85bab1b9d578633636fe32a29ecd6db1f19a88ed4a1a01c8c2e6b64b781ba7b1799fb471a1dec80d6b309fdbc2f1af5de8453f9a7ef23a7d1d9efc6545eca7534f9f73ba50737664fac969cd96796fef6db22ccbb22ccbb2cce9c36ab6cc29c46a6a2c2c664499c32cc97c99c70c035a96395db853533df099f7d65fb36d1e9f71495de34af231a757f795d578276197e5588d3fdfe690b8a9664342e1eabf2ccb31ccb3fee676855c1bdd2e5f9f95b3e51bc969dc430ed55dbb502fb10aeb9315954dedd4e9a14339c7430ee93535cd0bfac541995c9dfe4455c59997dcece1a1b34f7f1bf4cd906c1a44fce4b6442abd2e7d659f50104065f5d22be42a0fffa06c1a595e7a05c1c3c941d9324ab878b1421b61c02b577ccfefea0a124f1b93db12431613101e5401041098a0f3162613482085115a9200a0250660989474d832bf85698536c2609a82002a2b1e40f0d2b7fcb065862c8e69cb0c2dd7c3fa1214269c18e3431a26a6a1c8315161627a5cd5e11fdc9e77b6d9046ee2e0010bf600a2a9696867c8f9d7aa5ee28ef20bda59fe796f336847d255f82a39c6d21d16a32d9204f45bd655eb0367dfe5204725882143d0adf818627fce583a95f3cf776a84d0ea93672cdd3d07a243091588835619cb3faf4bc73fef615d7b3faaa135c21233686206549061621a82ce43bc31c11794008a1f9ea8c1109520860cb15bf131b45482e8a1e8561230c40e372b0918ea610a1ad87b5012e69f43ef610a1aa243ae07a1f7f33c723d4c410374e67af0f7f31c7240fb7eeafcbaab157bdd307b04216cb065086eb8200e1cd40ca1ed90ea88336ac004136088b1a208433bb45e81687026a621762c9d5281b32cb58a1f64e241b845876ccd18fdf98c6ec52889fa88eea2bf2c3affae8478e251dd45246e7ae832427ed82dc773087d7d6e91f8f84d7f973fe94ffaf34bfa94d29fa3de7bcf236dac57005da8dba5b3741ee8fcfd3cb009e9d19210ce3e638312680d5a6757bc3c13cabe3e55abc126c3b6c8abe92c09642ec2ae3e3adc22718b700bdd45218a78a0eea26ff66a0dd35fd0c9a3772f887af49e4ec1eea64727b2457c874c8f4e37ad7fa69fb6d93fd3e70b42f5cff4e8a84e5d1e753efa5ef1b5858faeb345f8a3cb97c5a73fff25838b09bea7bb399dc7f2f7fd3c16b72b2152f0bb12e2884775375d6e7c71dbdd8c3b647d33b843d6975a15fb5dc14cdf42ac9e9982f62b33f5ef8a0b379e9db324ecc32f57992983bedb14f8eb704362f3eb6fdb2d5221e4906c7eeb367d7dbebf8ea43dfb3477c44c615024fe7622a83c12e898d37d80b6ab12e4f1985fd17b93c2df0eb319f62fee286eb53f3a6f49bc43a22bcd47daa6a70e3323989f4e94db01f54aa867aea30bbddef8b1eddaa8c42ee7adf2b35f5b6f55f5cd5bbdfcf9cb9040c7bcb32397635e643975dea85f1be69d219946a633b73b845da8b1ad36c73b84fd72bad57e76a1775abfa6cc477a7b30fdbab5552556496e335a7c14e31f98f767a7ab006d574970791b24fee874b3a2e6a243aeae9430f36da4fdb9d083db7edcaaeaa1bf8d074914e3287ae56f6eca8f47e386b44d4d4d49fcd999ab2ab84df951070adf2ed4708b62fcdb94fa5178da6f3b6a874efbf9cb8cb0c7c829d1dfeeeaae9230f34afd8fabed53f8fddfe6dfdb3e6f4af4d75591bb0eda4e21d59842acb7e51be82ac88d0a103a4807c2a607d5d03acf91d32f8764f35394fa99db223dfab6f1404f211c2f372abb8a4600924b78b951716bb7d5e3e5060413229a9a9a9a86a4d3f89ae1465983c44dbfc58a0fc96dc8b0263abbd0a3ef291120ce0ce00d2cbe4a19830595e3abd208e44035f155894b13355f95e4e0c11926f6b0beee60822f7f4283cc236d5313995fcf80d631f85d9d80cab796df151165befb5d1161c4afd3c6609601ed65f1bb42c197e7d5efea08215e00bf2b2364906432311d814c4cebbcf55368c7d38811e1a96c9829a4583fa5bf03494c84016d9dbeccc8c2f1eb74e19b28d4540ffc72bcf5c76df3f8e53415fe7142dd1bbf8a9758055fa4833e5f1ffa360d68ec15fe428f3e31d446986940635f7ec852e81640833e80df2f6a20f1eed331c1a10451c4a169d5f15148a7ea73e991e7086482ffb4fecd8e30d3bf4fa72c2ec9e2756a5d2ed416f6ec8bb4d3db69ef5e9bf4f6e91412377d63d696a4249f7d3a6748b8078fc41b120a6f399d5bfb6eb53323d22bef26b9cabe16b72ba439a1e67f4edfe69b1979cf1fe58c68623530090387202cf3d1813e764a6ae8545c300ce814dc15098cf8e82d74d01b8a2f82f908f43c96b73b7d10e3aca83b236ae70cc9638b43c21e9d5a5b5c61a9437a742c70bce5fbec6eb9dcd8adadf21e7a4054a7a26b39146272dba79b152d31bde46a0f2fbdf558c01e6f393731a08946ccda6a33bdf46da6b7b82a7d7de854bfc8570c8460fa76e95b016d57419c79e9fbdd1c6f70a550bf8c01cb511b7ece881e7498152191de5b643d3a955b3b4d22bdddda8ea4b753886d5176441e59975ce5930b353d6df5e40ba9f3dc6a75ba1dad5bde99116b01daae86d0e22ddf6dc0e5cb7186c403951f7c60faa4934b51fd893b3952f5c012f4687a291b868b11433c7529aaa7dc7677e2ea22b9b8cac35b98cc8a4e2fa58c314208df7bdd2f3323fd96bfccc8496646f8ad17b1ce8c9cb8f5981939fdee907ada789058bebed86efbd7567958ee683a520f5fdf4f9f6fb950cfad4a67177aed72db1bec7715c4190f77488cdb7c1becae2f8e79fca0cc9019ba13ba3168eced5aa72aaaa753efdbb79b25303100d428417f5754b23caa278c6f44b4e7ecbb8be2e61b280334a8d1e51bac3be8394a3a55bd4a1e9d925f778d870e5d427f093d062d7a5d312f9d884cd53943a7aa8643a7a4c3d0a9f7d26be8d4ae8230e2a563a083e0d05b31ebe565ce57222f7d33a14669f1d2035c5d257c73c63edef3d02daea2721ebae4aa863de47822d7c2ac985673503dfe15e82bd096edd8e9d6b31dfb69436dc77e6d39dbb1cf4d5b6ce7c2edb8637fd8f3109513238c11c2c7edfb610e033574d7eebf2b28ca3c2f3dd5b5c42a8651055060780243bf200bbfc0bffc42fbf02bd45be4e49548f6f3bbcd9a3317087e3f1237b1bf984d14bece8f5e7ffc8fbf2677b143a203418ea73923fdec1657b5672e736a1a0ae55e3b200c6c11f667390d356420faa4431bc24794119e29cdc796ce4c2f8881b03fd1230a1505cae4557bc6c30ac649d068fbc099917ee6d8cc0e89ce4a6895c998f9e8a74ddbae9dc974aae67c994ed527cf3e176ed7fe34ccc8fce79c1981ff38a41e9e99632a3e36c75dba8bce5cba8b9d65a9557089551cada6c751682e83502572c63fa7a153d089fc73f89cc80b6228346eafec1b7bedfeb10b01ea1473cf7753ec3572405cd7dddbef1ed07cae3d476d500c3378224c0c94500518590c3df70d4200531172d0658a24b46863880c18ba3e6e05f183fd93d2d6df72bb45d8d7adb90f9b7d76ea71567b407b0e7dbbf6ce8e40fa22ecd4c9a3cf4ed1679d7c39a5fe13c783849bd2cf48af29cd2ffdf3a692b748d30df60f44c24d8fb43ba4b71a43f0cf216f279dc29835e03535fdc5255dae343f4949fb15364bf2a8c43abbb629fd97d389bd2c097c767a619b35e0fdf59a5fcdc9fb4f1cd2fb8babaa7fd99bdcbedf67291e9457e8fad449c5f3a734197d1ebf076b7687c8c82b5f3a679273419b157b1cdf2d406a5c3a8ed39711e1702e68353835dc6611d821204e2186636546f8779c0a35ddd9f8295090ceb72dd283926ed1c67636245d1689b65f9ac0f2cfe31237be19910fdfc971e83c9b7adbe53874548e43143ec72bea4f395eb53fd97c8ed7f927df0db2f627c74f4e2726264898870fcc439fed3685e3d2856c0a276e3555a2530de794cdb08fe38fe3424d37ebf19aada6e035ae6d55f3e8f484edec03b41dc307233efa0931a270b89de741fc4b135d3cca719ce6e4e4780f4f4e4e36c37e8ed31f3b71e34f61e3c7d9b6bb9ce83b4162c432a2204e338cb3a258436b7c3323356e511e87289d9e1caa83ed5001e241f810106e8a1452701f974e4f4821055436c37e0aee2323f2715a83e16c389eb3c1ee703ca6b0557ef71f9991fe1e6ebbc3e1ea13ec7990f8717c0afce848361fb92cc9f3c84de1c7e16a8dbb6f66c41d05176a1f59913be794730ec293d37eda0972e1e4701c0f1277141c058779742a884387683a95a653d22b91878ef538ccd91e15dd41f7d9de15dd414f617b5ad460714bc15159510a1e7d6743c1290acebeb3c3394f909d9d1d6fbf389f3b41845e4481e3419282eff84e0a9c8cd8664591738759110f123fe75360106fe741e2dff129f091f8cce33892cde3e0388f5b5992e741b829fc1c57a3d7b8cc92a01c879bc2afe3422f12b9476cc7887347356ef9918e2bf1a376faf1eec41ae93b9bf420dbe3d21df4b8bd2edd71f9cc2b914fd31df49c8dd17407bd67e33cba83aeb3f119d4c675f06c5c060b0dc773569d0ad329141cfa5ba353eed09f986b7b6774ca04874eb74dc7e50679f5356a79a8bde42a57eca35369a653288745fe3bcee3153ecab31d0ef264d922f14f41b279e941aa3c7346a6b16284962e5a78090387192b0f262c48cc283ad50f9da2b0f14b339de21c3ac67115732c9b530910cd3404645feeae504ff01ca7d991fea3138e9ce03146aef69f407da092d10ceb318143e26dd371ce9048e76a4e77d051e0a499eea04dc65768559239c1a1db644870fc04ae4ee1d7f19e8d7f0ca63c1ec7759cde603d47341dcff135415b8eb0860a10ffe1fc1188d31f5b37bf17e58f8d87806c549a692808af3c8ef2a6fb5ace88e950d456df1e8ff2b8e38ee33aa8ad2ef9f028a716a6b3f50f1fb7d7d4f49c1535d3c7a6e7e17687ec70357a10332db32438aec3a1b6aec1c76d3fc856f963f8c821c500b3a25d3d8ae951ab477148bcfae842fd2372bb437276489ae9143f741d9d1dda0ce7c7f68624994ee5387459a653380e5d9a117a39db8dfbd8b84c77d0713636d31d749badf2db38bdc1a2d720355e6f5ee278bd5efa6e91a27d1b97ce1bf456ef07ba741ba07fab173471b83a6bb8aa3deae35bdd704c46065a4555b6c11641e233effcd03b4bf2903c8fab4e79e914982db20f3d66489ea6b9d0dbf66db6fd9a6d3fdbaa635bc5bebe5545fd694bb2fedaea83e3a1cf2d097e65320fddda50b1a22aea7979abeea05ba145ae2e99fa560f2715bf29a86a965a75f35c0863e401860c27c86881a2532787cf2dcbb22ccbb22cabaa2a5b48d643eec8f2f72ccb9f15a1843156e8905ecdd5f9d3b2a48c11c2f7dcb44a3fcde9d61f4d975b952e45f553167107874693d013a53123a298538c528c6e27670a3322ba1d6544b099c6ecc8c9f9c8ea2cc9c999ab47963f3fb99511b1d31375de929c9c7235ba506f36a19ffc65d14f1b95d1379b1063eb8239188a5f45f914076d4f69fbb39c0f8dca14cbbec46c025d16349b46c36980fce08b99a634efae61f0e96eaf5dd503fcb2f0ebbf35e7d7c7c66bb78eddfc2c00f685ccd755d822359a2f901fcdd4a9c7d44c8c26cd039293e342cd699a09420c4e9d0d5a598ed394e6c3178772b587a7de75aaebae79bc12d9f10a14c46b87f2ea28132a76a150e4047f2ef985e98fab4f60f8e73a5d77ed3a9bb7407b5ebdc8a7bbf6942651d898ca0e693f61e32a3ba47d6e1c04afd06ec2c656ba6befd9184b77ed4a9a87abdd0e573d0857515f370c77e2eae47272b9c616e96f97a7adb56cd12ece87d3cda753506078e83adede5919910ee782a6037d8be554ca8ca897b0fe013bc4c2ac89a534e8332392a1bb865b24fe7ac43098116d598261680a09e4474ef415230f2c638e2084306de0e1644650022c679060082c7a091f1bceb6dd3d252cd02033752a72455fe0602a706b2d8d44778e7de555186734ee5d5cf1c1156cd0c1944410364d155de080e9052508a3c5e281822e5910c1a58c1d2b58305d6ec094e6056a3055a1a1bbcea2bfad83d0b6ddeef9cd06b77b4946e023f5f0d18fc08fdc969b6d5f7bfd36f92c85568392308ca6915835128c86d104410424a8e08c1269c03082aa881398e1c30f98c268a18206228c5007134ff4000a25248088368ac045056f14010c9ad2647841fe7edaa7d7295de7dbfd05c9fd795ef3cf275727907f2eb936e19fcd1677c8f39a0dee90e7d9d6bbc2736ce31df2389ed517f161837688c9044395af6c11e9ed0cc61609838318cdfb690ff295571a0ebe7d39084d19685e5023f17edaa9d779623497a3f9f66e24da6923a1e97cdd303a6f631f76c80ffcd3deac821f9ce0bbf9a7f21062be3966da21ed42bd84565b8b6fd7a253d1dbbb8b4e80151fb2b8c831957629b4192027e41c855679f5ddceab4e79e95465a65fa3536768f9f65598efca62be5dc90b622834f8b59168243ac5b441aa2c76100183167891811d730cb5b3950dc286c00512ee504112a228c2503b67d920d50ae408021858b6d4600f3486da19890d3262020a36be6479c10dbe186a7f1b6be98ebd57a8137ca03c27dfaffe27a727a4e7d53af98674f2132765be0a29c44edb7549c949995382bcf4b53824c96db902bd4a8c107adcc80ea157899cf67ed6ab400ef57ed69b5b57c5a556f57b7bd0f5a9bd7a88f29416e4c6df86729ad27a769c36b6d16b0f8fd7ecdffbb9bcfef8d7b3b3e3cf85748a3f057f0eb708e7cfe30631d3fb81fe5ed7a9a3e99d904ee970955f889fbcf6e05e9f53a76f73eadb09276c7ee29cf3611368d0816cd6750791f8a7d3fab8c99d309d9e7c3a7d7e820bbd375170a1e61f3f9c87abf32b335d5cd556e77f78e4aace5766ea6cc729c45ee5a1c7779cc7e9dc78b8aaf497ebf09777e600fe4937ab4afe423a798d97ef53df36a4cb2fee7229aabf38293cfe22877472ead3a3432425feb7f966449ba3e0713b21856d8be6dcb6c58a0f69be3d97a2fac749e1e19e383725c89be02870bb5d3d81433281db7205f30cf36cbe1f5805e3a0675e05731baf52c3695ec586abf193538d63b23fd06be6cc348cab4be6618f6f0f7dcf4654fa52da9bbed94e8d156dc79f530b4b6940dd41b732a216ba834e799c3a5d16525a54fa7834e53d0ed1f7a79f36a4e8f56d278fa7371d6649ae93cf8dfa69ab3c943a6d8c67cb74fce4708bec2f96d2a65389c5ccc80ebfc4382bda71225b4d156dc783f8736cc73723dab9c922b043371cc530e6f2aba5b69687de4cd38a96a59178e8641e3aed6c067eac3b7642abac85b5bca039356d7f2aaac68ae68ff3047ba9f428946f4684f227d8cfb9e580fde38e509ee394b320a8ad628fda727cb3a21c7f6eb9ce3e90edc79614bfb296879eb3d527d8c7a02b375e45bbd1b0f982aed47895ac26cbfce68a8d57a9b1a9a9f11b878e7a41577c78151b1f376ea3f90d77053554459be2f21bd7fcc66d1cba03756a569f874eb75d5541e5f705edd0d6161e3a1ba1f1ef183f58c2e3701586877eb3edfb79ae6d3644fe79cdb6ef27dbf6fd60dbb5ad75a37547fdf2b7ad75835d34a59de8cd7647b91357f486994ef15cfefce28ade30c38230fffc6da776c5c4f4977346746df6b8a237cc4c5ffe0db6b6c42a5e92aa197fa001020292a249df07ba42f705ad7345fad755cc4b2833a1d5fcbe71041b4050e10515692c61688becf41a247a35e1e4150581d41b2236d22bceafef16a9a77f61f20aed755a5ee90b18afd0be3ba4bd3ee8955fd85de10de0db4f5ced27c22f2caf50717cbefde26a7f25a2b32f2c77f584dfae02e07b3205b243dadb317e218757686f7f4108914eed768fab41be6adfd5846f67aeb6ff73ad6bfce972e9e316e197ae55f893abcf2dc93d871c3cda5516eafcd775f337bf413ec8b543da7909ad6b768740176ac8b03bee5f9fe62c286f10ef4feaf97ac5beb9a22f7008f9f5163a55a4461622bfde9b153a3bb503fca3e7d0f7e950b56d5f90e5d0e7660f00401c3f4091822f7804d1c490c5edfb6122f99cb7e7715382cf3ebb7b5c6f4bac8acd2a50a2e784df95165abe7fc9e84208607a08ad0201bda08985043ac8a20638d852461a5c645cf8b0e2e24a3c21e1b28313d2c6c0238d55b3da820c06c41844c0a284ce2f193280e27dfcaeb880c125053b27a155ed57051a3b1313d30f43bc7124010f378408820982b0827dbbf682381006134650a185126de460a8bf376b3e015d9faa3d873bd12b74e6e073f8fc08bae42874b84d081d76d7b0c87bc9fc2b5780bf9b4aea7d21891f22d92d12c3bfe98206197a84dcbb42531acfa96915f5cbdc8d46650af6207c688af6f56500f3fb4077053642abfe975bbe9ed21e3333572f4741480b30f86cea79bddc727a6d1bfccbdf1f5d0edf96d21ed7d02b2a7ad5a4d7f9d7f38bab939bdc16a1f9efb7e4ea8c5cd5767f6acfa382e0feb03f7f38d42e68f027bf37e8fa7092b5043df668facb9126951f7cb0fee268c4a64bbff1b855fe1ba7bb45e24d04e294b1aa5594b5e3b5fb1bdf2dc24d0fc42965cc72b73cba099bf7cf7cab3bf98e6f07e538f5ed201382705cd3fc729ccb4dd0285751bfe397e76cdb3f1757513b1efdb46dff604d4fbd06732459c34d09f23f76875c5c8d47e02349977254e3377e54e311935e2f7a7148d22fc73c6e15d6e8578dd31ac76a38a41fdc962b387ec2c1f1d309e7d4a3d38ef2e1554eaee35570dc874b9c6df747e3eafc1d3f6dbb3f3b6e6dd57fc77babdaefdc38c6f4bb438070f5868b8e39aa47c787505b8ea5763bccabe5d85b97c7edf2cd8ebc8f9ec4f2e89b21f15ffbd7d19625a0a1292cb77198111d41e73932bfc69f589f790d75e71f0ec4ebd4b4e915e5ffc3bbffe1b5fb189d7a855fa923d578eda1081655fbe68ebc9bbba05da7983925f4737a66caf248c53fe74132dd721b7f5ea757cb331fbe3b04c727cee663abd36f9cb324cfeb742bcc3ff7e15fac3e623d9ddab99d3cc7f2cb797748f531a44e87feb224cf7d709d25894e6bb09ce896b33bcec31c67e3915ee3dadc6cfc66ab96b76b1b0f92e8361edd86e391ce83a4c631afe17a1ce3212bbb2c54cfb6238c9b4fb77d3feca7ede8e2b41adde272e612abe07b6366f59798d7f9d809c3bce63c86f53cc655e9d06db69a2ada74cc6dfc896c3817349b0d7e4db6615b4e9f66d89f5c67459623b1f4e753e23fd819117c8edf4831344d550d7710be74d1add471ab405f9fb480f506cf74d7b13778a6851e92f5d6d24779e62ba5cfa1f7f61c6eb00e5ea13ddac12bb443875fcc00f3fbbfbd6d77937bd93b55556df1a38372124a3caabb6d87c01db2dc126d575eacdefa5d794183a732053bcfcdefca0b2e3fa4b5afbc08d356be20f396bf18b7a397f2275d3af4239911e970080b75f75db345f8d92d9841608780d8a615d350e632e3e6fb791ea3cbf8acedf9ca2d2952a7118bd4af33d775720cdba69f4e578c4eafdad3afe995ff8a3172356300c69991e716b645a4f0633b842d6e48ade124b495aaf721d2020c90898ed0965dbcf7de537aed4aef9be32e44883491eed7539ed27bfc628c213641d7a797d0ea7c1fef2fec3e1ffe7195997e91d83cf4b74d810f9fefbedd7687f01240cc75a89e5517467c0bf9764ca899885651efbcf1a3e0e850db03aa02b9c881d52d868d0d0a4ccf165dbeb92d86f0f1810e0dd4f841832d80448173820c88130daa2811e477c5c511591374770fab062d7ea02334c34ac94a0b35504ac2ac68109a410b2f84f861c4fcf5b2c517d84154a607e143939b82776a84d0daf7a1f791f6e7db946e0074de15a0c3f6f7afbd93a42bcde71dd24bdd586f53fa6573bc1d8c0f43f0d911f8efa5657148ef2507bb975825fb71a11072486640a56abbca228fb7498142a7d18fba81d0da2307b923ed2f00a161450f0dd5d309f9768ed0e3dba45fdb91e792839b9539043d6e5482203204ddca1c8a96d7b5b6c4ba55587578f97edecf5e5ed74fdc751d19e0aded487253deaf6bbf1992fdc12fb785477a0fbb1afa00f40f449882af7d02f225f1bb74b8be0ffa663ccb29892e3908ec50e4f6fd4c2086c76d24838c338cf8d42f1966ece0e9f21e5a9dcf4315c59992e72de576641d726fb332871e743a37ebdaf22aac3c3c7c3feb35fae4e2918f97db11e4a6bccd90a8f091dbf2019882af5f5353bf1093f8b7a969e8798c1be32af56f79bed90462e00781402184b03bc8319a23ecc25d087376e12e8412421f60842fee908510429893e3a307f5acc748607ac29a4963871042afa8df89edfabaa350df361234e6ee5ff3c21a9feed6198310c279c2208410ee09831042b810c2d38513c61968bece35cee0d2006dc94083cbd75961165ebe1d897fb26684c46000a88533353c08b906224cc46040b6f0e37144805aa8e105013990e4c47c0b3560e0070c9d8a10eb1ff65d9df113e80b500b383c39138170860c9317d465e1829dd79101ea847450cb0205399692ae863034402144ec6a85c708c80c418519450c208b32405c27844993ce6b26617058327f039317d4418885199d2e9221c3e406221dceef184858f91fbf2b2c72f0b53b2391a0b4a3b4e635af69c9d8d6b4e656778586a930d35ac4749496b464ec8e32a2612acc7484b15fdd159a6e6208e135af9a851042f8c0ec9075d5e4eb0bba3ef591f9ee0ab949973b82bccdeeb47dd810d5ef750f853c8493087646041f7cf0c1f8a07cd09a70ced73cdf8b0fca79c1eb7acdd77c4f3e68c179a539c1d3e9359fe67b569c66ea2873f24221a53defcd072f7882148318f69ab149039a344a34c8339775a261a249a304311a329865af399b444e93ae1718b21a5853f39a6b2697b9fad6e2dbe98545710273c6b7675e28977f5dbebd260a1b6863f39a6de69967e54c1e75bc2c67f2a8c38c1661c06821068e35b468a646224d6b69a6a692060d183262c09ce1c54c1d65c09ce165c559984b162c8f8a4dcc191ad0a4515a310b070d0edfae7c5a74d63c36f3edb5a9f876b881212306cc195eccd45106cc195e56d1cab7c30d6ef569f9f633cfca637a599e110fcb993cea30a345183062e058438b2efa8aa6a2991a89ced25a3a8a5ea2999a4a1a3460c88831534719306778597116e6c25ade632af80aeec259d808c6c256de8a39b3661e0d68d228ad98858386dd218fab90a83b2be2a7fd5edd159197227e18ba73a222fe9e9550cad72ce55583da21729e66cd7308ecd07c3fad046d2157c4baf6e6db27e67b681f19a320f6bd17e3beb7dd3bfdc5c830f51ebff71e7c0ddf7baf5ff77bef75775befbdd7affbcdeddd8e3a6dacb7d718e383fceca0dba9f79aa332c2ddde6d98ead82ff46ed7eeee85cfbb5ff7b36124ecf66ec36eabc60a025aab1c20e16429015343181aa40cdd311164d268834c98336928e1c5500be09b0d21703308b5920b1a112d29b9304354608c203831449712b8c1c550fcf918576c94f1919b41a83b255d688c1f2d6e06370d3fcaa8ad0146c2f7403112b9c83894410667cb95bca0c909c5d8f331faf888e563150f64f50b12fa52831b584033ec4a06a135d060fd84be8c11855661645052830c3330e0f4bbca811b9ffd82818616afe6083232086758c93003165a20c4428b87d0678ec31ac2bc9ffde7abe40ab361584f080b2edabcaeb0724516122c80082f7e88220c2ea83cd1818186164a9ec53d2094bc8e4a948421230a153c4b8e531e5670c85c4568faf1eb050858be50414643a02602d402d00b125ac980ca0585facdf778e7776545107615264c0ccf5e5378087db77d0101bb025b21e6a1c399e3dc82e99f20212bc2f4cf7e9ddacb4d062c10425885180f1f2774464806a016525048eb293a0112ef671fc217343931bef8f8fbc5045cbece3024784035903390f37765851c5f3b2bd437273ad61dcbaa45d82ac8ac02da5579af3b31409d90ee0529a94206f0b5921aba2aa878afbb8eed78cd3d1ea3045bbcf52bc698d5d72e888b044a50224c0804841086c1c4e521197498f99adf30da288119ba3ef126a73b9ef65d5561c443979ed31c64f973214464e814cf1ead7fd6abcff40a747985e15f77fdfcdab4fee99f766b935bd11b65b6a23165b6a2316160331bbfb07b05dae9d737e75281ea057b607981102f30a2cb0954c0030c152ec08ad86e20a60b231801c41d4c04000f3454a4800a212c6107524a0821bc01f6d2a794972b81d3e9755d42524a2ac47859f3d2674e1829a59432c29601fb25230c111f7fc1904109221800000000f6084ee89107113870638a280070398153c61523f04109326d84f119c211ae189439b981fd92c103183891aa44eaae5e868539557b01132dc44ebb69e8ee925c0d9c92d8dd5f6860e5bb7d1ed62fa87b3ffc38bfba174443ffb0f3e33a250c259114bc94448831a68aeb065909168e2baaece00661b0d1460a59885113032e31a022c35c4b5029a40f6034a180bb5fb082d67ec740a3ca1bef082536f0624c1a4170238939382f5fc8ac625044ceef0a06679efe92c183322cb42fcf639fd0f971bdc3185a0431a7b80253f85d75f1c16763621122bca34b195f819ed34c2a6f0572a861c5cb1d4448c2e6821f3411494004165148714410418c29c25b30832e50c8ee2f65acbeb15f30d018238a2e6074972c2815b20b14b0065d92e8559725de18681cf1f077d5a5099bdf318ef092d2784e4d08b3c100ba2b58edefbdf7de7befcdf79e7cdeddd49a524a29a5945242b7a4e4e8afb37919e1ad5ad64c329df72757ada38cc8daf6e511299f74ce9e4b097b534d965c700eb4aaf16c8700a5733dbaafc7f5a3b86c595c85912dcb8a965567557abcccccccccccbc1b618cf071b61e618cf0ad648b89525a517c032d6ad35aab626fa9a199a135cb2234b95d95e2b32f97a1b137127899999979d7799977977977b7779ff0f1f169620a84ec48dbd4a4049f392dd4a377ec54fb7ec386d1bb46dfd811f6e327075df8def37e0eb9ad880753f0f5bfa6a67ee18f92f86ddaebeb4da95f05f9ada01dbee7537b3f8deaae6ad021b7efa79df26698091c0414dea68b10746829028d20e4b1b2538bc5ca8f4d249792a7bed9919daafae22975ea94c3b623fb467664c178762cc92ee1d9b1231bc7f3f6e0f9e4428d6dfcf4b46d4674454ab7ca3e89a8cf23d499933e935078e276915cce17676dcfe55351864950205e20f1b57bd688748a9d9f575e58e9214679d709016ae17546049dc9b8bada4917fca0090f2de0b8c28e13e050d77542bc07d5fdec402d68f9f61cd40b5a8284153946e0c41a4c5a0c99f0ed9d13dfdd70eb61d417ad76cfde0961dffefe1204123f5f2eb1aa616ce284657f7086103148a2084f2471841e3c9e58e1d105c8ef0a0f2c8ffdaef0602a024b41101b28b6f0e144850b6a858c2d560004143451c50d9e2ebc6cf1a5816c64b0c543cf4179a74e0fbde3e219084b12401acadda713427d7db4e007119a0893823254c021841d17ac5c8082499538c12a0b11ccd00117470469c3cccd11aa165049c11c2f00e3cb0bea405511864d0a6cae6031033b7a80458935745af0041932c00280df159732ffe3d74b196566008d00c30a3abc845105ce17403e250435b6c4e1021fc0b18733198f88344850811d4118a186123ff8d1822c2d28c21ac1a9055798c998c3070f3da753f4a12f6a8ca62f2eb8416441ce138da08e2a80b0810f7040c76326341fdf0124acdc08134711427063687d7d005dd4dda71392fa5104e526bde8c569171720c6705a116ae8b801e2b4c6439bdf159733a616355e541866771d84f1bbe2e3e3c334d0ea8651f28284565cb0b8dcb7087fc7db0cdd49afbb92a13bae8e7d447d44e38b8f1f7d3ef1f9c85a68ef71417ec900429acf7e575cb87c057a96fcbef09d9a9683ea6147f55c28fc92c114c5dffcae58d0050bd2a4f9e872d5290ec36b685886e41d91d1dae676248fc81c9485e479ace3e3b297ca607ea1756479f4ce903c8be35e4a9fb24b978f2ea3cb339e5b702c92e7f1cb13677c74a9dd689a86e3237215fb28db2f2d43c252bab5eddb6447a64bb72c8be339b93c7146fa6b74da2ff4360ce50304c30c343079c20353e12cbc0473e12b72b0d3ae432c43c24f74f1af01cf23cd8e488f7e4d2b3b32ad1fd876ea487af4b5aabcac0cc973cb65766472dc11c945fa1af2be58c32b4c0cdd4e415f9d21f3cf557fe6cc476762ea92f48024fe731ab1b94de9239089a957602e8908628624fa9bec326b00373dd24bb25c69beabfe393bb5fc71b5ff59d39a93437a6f7130496c40e4a0c54f08ca56aca04de67eb09d9b9b3173003fd61d6fa71aa83ba6923976427bceefc1f0ecedafdba057584084cd8a054734efabd91db2ddad13cade50ce1356a361bc152d3be58d9d785477bbcccf378a34308a3b98b91f90252206218451ea583131cbb2ac7901b101c54ea7d38962a71ed4605996653536f2772505106e304dd3b41b1c9cdf151760e4603e7cf8f091f3438a3b74302019d16a7954770b244382bf3b648164443ba41d884e86c4288cb7f5cd1eb7ed1869bb9202cb57ecbbf2b545766e1132807854774130deb0df95147a3c6aaf69c9085ff39e6afa66cca908af3307a0af407f695a0eaa076e39ddb1153462e0b1471a2b9882054ee03c748d89875cbdb827403f39ad3b2d67c2cd41f5683936bf2b2eca3cfc05a30a187cd5f8bd20783915a5c7e8fc9aa0d3a9b30b8136375bc6808272de9dcfe42e4d7ba287343d2042055f7a30041adc6c29020a4a29a5d337c810aa2c4670260c9631aa1c61867666b5e5ca45b93ab7ee629eaebda013e7183401849b842bb4a842082158a152c410b479c882320f73b08387d07d87509dd350dc875d48a7e0dbdca77f5cf85d45b1c503f95d4511c55707b2b2b09c7fb7c8e32d22ebd233c723e525f5233dce08fce73ccc1979fcfb92e73dc7b7c11f80154b304581c5109040840d4210c05801142910c388379658f5def302773dfe6efbbcf144eeae9134684c4c4c4c4316d79cd35dfbdc95900c9daa1a0d9deaf6edde1688b4d082b6418f0d33dac801d31473a031d48eda209511617800e60459c8600b1c0cb5fb06a9946022097bac11c40f2d6062a8bddba0080ca146172c3c78630b252c19869136e4201b5f5f0ef2e5750b70900d57c3edca91711b04cbeb12e1db97531ca268a8646ad7a933410c42a790a1191a09124001a3154030301c128b85a37926aaba0f14000f8dae4c5a4296089328885114c5208314328418020c00108021a2990800b0353a01e5d012f35fa88901f7756d592e264343de5e98b4769878813146afde9ceced14585a9734ca47f39e9b2bf3886e63847a598816575f957ea587051b9cfcd86cfd648e0e5965816ffbdb901f53caece2404fb02a92df9b5834f1ca320375e394c7c644dfdc248171ba2374420e56a17934936cd306fd795da17be2961c2dac8f8dd796607ad6ea51185604c30453cc3ae4646c738369e5617ab29f9943250abe550ea1071489dc29da30599156b2f167202f3551ab1d6c515daa2d3356f78365f28d2a412e872872b5a740ed772c65603ff774dfbe2ee1f754ed892724605d25eead0ba5a22e29f6263e0695df310fc723038e53060bbaf5c1f5e72c538396dc4e80d564b882535a70e3d5ce31042786698a81e4e4f31322ff2a1ad078587d6646d26f6608c9c0c436fdf04dd645645e61c056aed5fcd8f87e6dd05dd4cd0e4d8a5599b049deda193c102d42100965fb79db91525570779bea88b1d881ce218d843e163e9ed126d045af87efd46cbbd926e6e90dfbc952c9d19cf65fb87ec297574df540a5a094822084b046df9119a351de71d734ba9ed31456337cd9ab93a276bcc9bc8b97d557e5f618660afb664c4c6a6c335eb62c26d34df896c22c6e1da77f84914ff24d668786898bfa807870e6229add040d37f3dc7ee2fd575462aab60d1300d4730f7259c3302bd7bfd344a584d0688c4aec602345d9660159a0234a3bd1ce63eb2d25ce40a5f19049719652fa924be986f6a11dc551f149011eee93064e1e9b42f615c229cd4bf4f1b0ea80f8345ce8c8df377113919508961a6154963432afe1ed2332ed7fc30b7d7f17bf2c13e883b67acfaeac88d5ddd0986b4ec472ef3865375a61e55adfe93281fb164554dde958d8cd23ffbf298e081a54e9f9925ba9228e8727626680c5503d3b7bc2d5bc1e1e5d0a1d15879923c069da1ac1839752a85933125f207263eeaf42b77de89e9643b57fed46e8fed0a1da23244f0f598c2e0a83b288c01e661a3f18b3760f1f747fd7f4be16f7f785be1a79f199268a34db2e4b69b4644dec2447ba85f5a3d56f6a318ffdfd7bb65ab94a4a381034388533d14f3294fef2dbacd39fc957d2cb8b7ca51ec3ee579c39009b88121c0076a5af2e3e7655c9fe7b50a7ca19cc03248b537aa93e3ef2c4cc8efc6f46ebfab46a12ef09e7e0f6a25c41024d8fa60d42e9327ad7e7adcae1262c0ccde15ab35778c5dfb1dfc3e664b1082660fae3244fb405753b658da4942db3ba2528ab7f76586a9bb20a340aecd581fdd7c66c2f48e4c8809d5e04ca1a9aed1d1f72c154fc91e6e203b14d7fa4553b4f35bc7ad083c16a209eedad66ee1b77f6070085cf3045b28acb182d29935b8bf39375cbf8ff502e3087993a534f3ad9273ee829665b9f0e34d4ebea72d85ffb9dd787eaa23fecfb72e6f20ea7d048d4ccf29205bd11de4f4394209918950a2d66d1536c54e8d114245acfb3787be1d9f56be36da2e6c0fd3ce817494c70f754a330c672f66d523ea48cb3e376d8c2e9aae1eea888b2900e34d0178a5dd28f135b576278cdf06199fe9862ab6a469c679141620a4cfb0a590191284cc435ce57db6cf94333ae923a08aa13180d3f587064f47da0fc7cee243df123600c22bb570692d6f9094ec51bd5bb7f41f841e2c75ae9f2e2f32efb4fa38b77ce17bdfbcd5155fd56eaf1087e13fd078ece32292e69826c6fd976209a055a7f9aeb87788071c8d43753a9dc063224cf0441f355b584aca82bcdad858f2798989c540637f6b04eb584bc03c53141e2f848a9a05a97af814bb536f1967216a811470c5b4668001da47f507573508cb05ba00c2ec9d808cdb20b2e5dfb9e91e04b12cbd0109a5d3211b859504194fc937a2c9f5aa1f5a4843a799380b40d63b2eb21fddbc607ec288a61937cd1fbb5e028b2071c356c39c6d896b4203515ac9198500cdfdda23ed18c0de6a4670151127a6d969500e880efb401e2b03036fd8c425fa432be0898bdb5c000f96e33352c2c2b871e246d3087f0216b714c98de72580eed403013dfaa9f41448106c6ba6971ca15772e59b777aecafabfc9149f6c714c259559508670dcbddd3bdb5b977a9a02e9d69948d892e1564b22dbedcff8f30bb72059e8f86d45419931620664efc9c6cc93ef9d5a94bbe526800e081f31d7052802b766630ca384cd792cbe83cafba3ceba323d6c014d6a1d4214122cbd81c2e46902984e8feb7e92264c9ae15ba2919d11696c71c9f79899bad77c87ee35c269f458a3434494087d9abf55f82006c3c105f097ca45c3017619c6b67cddc0c47b802c06fa83c0a134e2222f4425efc7a3820a00965393ecbe2326d151663f51af7547729afc60ea8a3f704fc40db2ca06242efc22dee06e6bd6a873ad14eee6198a31adaeb48e2fe188466699b1e0aacc0414b0ba916a54abff617a3d22cf8e519dbce32fb95d11915271025c5e720a7a6ebe2d7a7655d7913f83037c21d7c2c719a444ecf83f139279a12350023d895cb099a4bf09c70de07a92b1b6ac1c8ffbb01736818300ffb3eb284533954b19ae7797462467388aacfe82e2e1585b44df61ab7f3532b3b261b3746c68c0cf93f89b68b12f43dd682dc8d90dfa8ac44dc0f681519428e85f445b1f4b9d7f6d90a7a4d8a880dfe2848549acd00f117f7ce85a477287211626613ff16023739d90dbfd728acd49d708683463b8b58b67bc9f3f2beaf885987c39feaa28ec8008a0e1451bcd05de122f911343ed017e6313dc04a68320b5c4968819ff60b7e323c74b063e2c511ffb31fdd64d101c34819f06618658affda62ef5dd2a176d9212a6afa22506a74c9b499e20ce3a28882100be4351689c7f611f11c0ec7b6726b7ed0fc986c1c3cc33546d2d0b728373f2f1d878c89acbff235a39c0d1e900b8f8af19cc9f175650eabab48b7d445768bb7ae7daba6ead725ddf4753424cc9acf9b388adcb9a4f7fe1a09079e4914c31287762c3443fc2883c66e631380fe4ca817b3ef4fef931531380d77a5938e4d8c69cb9c16b6561cd347a099945798bbc8777f99369e419a2f6f0b1d177a0cb899e6332768db48ad175a9e0637aac1c873bc429618e9edfbc4cfa4c9acf6d4c0645cd7bb72a6ae205986668d32c9521de70d02cd30ff78a24685f4c3d6669266fffb1ce0bef64b3dff733ca4ac4c6521763b68c2a79a9f32c5d8a885a98fd43140354b93373f8c2a5ea526ca093f4487d7d182329e4124611a7ae3c0a94e5ad795f039ef62132d294ba2236cb12a869b1e3b3b5294ecc3dd2881568811ee02835a048950580126bc47f73b09d795a59195e6a512204d55436013985eeeebdb5f2e88c1c30cb22dedf92803ad03323d84347851bdea3801c62c694facad29aa174a2ca0d31899290c214846a51c2bc296478704d09a428e309855325f61e8353b3bbd4ed82d83b561fab8f987d9dc3db0df9cc6c7938b27d97608c60be458967f32d0d67dc3ff18f5825e9002c9891c1dc249fa90b09f9c444d5502d2ec4cfafd67f86520bdb61c6950787b988597bc2e1c1bc90290490d60b95049f33a830b576595ae69e8ad08d7f8ddcdf5e8b788226cf22e69c1fd2b42d14c3ca325d6225713c18a01ac56d1c20110ed13c3aaa1067ee16dcb28e84c7fb16e7ebe0e5a852a22a0ae2e25515fd4113c032ed0c86f3c13dc47aff64876f8847bc168f84ca824ac2b1c4c3738e0aa7c08f39c0229a6e3d78596a422f379ff55b43452609fc2d91fe79d7b25ceb67ec326eb21d96014e78025ee700ca55bfc8e445f1890fb770aed851f377f5dff6009111051b59f007323019b36d5298faf307a0d727ae6b12135a6d74c26b1bda6ba5df8605ace4e8e8bc6b73ea41e14e9e789b9b1b29f1d6f9c9fde6a3d91f5961f4e79bd6cf91f1a5d19948419cc26b1bdac9a5df8a8d5527a1f38747817ead070691d85d420b70a8a0c5ad459123efe5a93e00623abc71096090f02e84dc32fcd2195ecd686a58bd2f3652f4313a4063d24c290503ded8a2f77b0af828e9895ee81e72db7b3cd58a0faff669abe92564587dd441d1a01b9de5a7984860d09b9759bf8bba7fe0dd3ae1e5216d76c6bb88be7f82a7501f5af023af569cac39082d6801143afb3eb27baec566bea6d2789dd0510e0789d840023d2446f70d4df12726e6d9a2c86831535e2b4346c58c980da25f7b912a4d0500ccde688f866d36f23f7716551fb23f5a58bc94097615b62cacaef8d91b951886f5f7196b366c91fe9ac47367c4eed036d9397062375b879fb318ccc3f0354e4863ef5e5d0989067f4c8da9edfc22a89e7feb31b459f5702ceb4437b3244c3bf14b68d12c4e0722894f2c5cf6b89eec48e15396f3560b32bf3245f6604d989d6f19c25a65be570e9a9cb03d9259dd8d4022607bf79b7d5ca6a8f6f291e4a5229ed006e4faa6139ad30cfeaf4917666e1030217302cec8fdca44a719a21b00d86a31220a450ffd38837f4542ee4a757526e3ec6c527546024c820fcff0493bc588b72f137cec45f00138e236da8a555fc5cedf31960e4a1c22ab9728ce24c15a3233af662ca9c62e085cc6c63ae386ae9151471f51013e79a7bf327d29ba97e9e5e77c6d83a388d26172d5e9f4472ba6cd60f6e2c34bda6501419fe1cc9c918c4abd0fd062e6e8b66e00781ffb53b43ae3b9b557dc3f2d659ed758b9e6c93d25996fbe57ee01ed42fde4179d2db86523c585f88a9a22a783bccfda75aaa71f32f732669976577cfa4a29f5cb5b7a56749546154a6295aa99ecd2f759bbfea2a45bfd0e19542cc4d2c0f0fe3983c967a403dec309499b42628397c963b9334b8109e7628942b28990d4d114c7eef6afa8a2b5995fa385aaeb8b26af9bb9a4eb78a94dd34117ba0bfb8414a00dc72a0f03869378b9e28ef056bd0d9eaa67e14ad7ed5362bef5f44bfd78b2597882cf2d3d4069f1de6e7bc1e1ca45a0d6b5c0c8d3c49b64b84392cbf9f97120ec9eaf588273a000c7a007ee2c347e30162c02e9220e3da06370b8e57b82204c42c45e8eb7e72f4701c41fa381b2d8afe9f32340ba78f32c85b1a86b94f899b80d58ea14400c6784eb83f936a1968886c4b1d2ab6a7dbf1d21e06b2afe2dded61c8871d38b893dd260f9d1401dc42aaf72db76d4aad51de87e63af153277b972363ae7622b1c0b60cc9bdd971fafb5f27ef05eaa73fc4dd09884b7cb836a02ee3973c0c155ef42e1be2029defa5438307cbfc406a9be2eeaf6b526fc805c677a89f4699cbea00a96c198e59663c926caaebf12aad7c48dc927bd34b3b6fba29d3b7617a374d4d0bfbe39b436efa3f1f9256271708607caf8bce30c3cf49d1e23d5858ad2b72dbc1e58897449e0332f94c33818a3626e442a3ade86080c01e832d65214600517ae72099c103847fe4fd3d8a6664d7edcc777691835716b488f3e23d24148c0480f7089253226abee7d000bac126a43c47a205f2fab4a86cf028e48f244211e165844f030ed80f1bc1e54220144754ad3ee04fa3644f4f7970b3c24ac630d74a02154c36cf32510f0edf74358b070ca978ff17ba26e4b4ae4913ae184ca3f83829f8c8f13fd56568a288f1756f5b9d3f3d09d6419c32aa4322120f3f1346b32192a839c81b9e8c74ba02a39264ba2f0ddd73c716370bc093ba2bccae5ada10165037246e98d04d0c4edb7aa24975bc900f4866c4114cafc5754364808d74fd97292c2b046e68244a0dd1f37c3263bd0e268d4579da332423f61467d3b025d230a1c8bd6d8d08d26e5f83cd67da859cd9878871d65cdc41ca5382e95acf60e42688a182bbe10ea96570302ac695065b28e2a322ff939cee0072ae6b31616248aa0cf84cf6e5363014e9373bc8d9411cc2d037d8cda219cf083710f9811543f1fa2f53bb8c28fb9f79cfebe45d14772876106876bee7c671a22dbfaddd30c7b177d91bc8bb22e7eb154178702fa970f8eec1194324abae0562906746e224ad2cd1f2bdfd7f35b50dd9f543247cbef3489381ca9fafc0bcc1510945142a55d7cad6e4967574fcb5aca32e1cb8fb384e19848285fbd623ec4f497db90e27d32542a5e546bd29198137ad205195421c9c1476ac9d10e812930fe3803233bda225a2a4688c9588ea0b67528b5058ca4c3558ec6faa2351cbd9423f710e42d0351744cba7003884deb346a57e3a2eaa65de9c2bbeadc8344467b2574225ea5a8adaeee5fa20f373cf7b07b386374a9003d7e6613fa1b824df34792cc75ea4c74bda79b61e21469dd83bb4a0f6718c2c05d8bde49c9843e94bd5a6df60a39280bdc512f50f20e4b135fb4ab48303325b80292809c5528145ddbac6bc3e9000ebb82ffbb6b61d4d6a0d091db644e0b38c2fa0fbb8fe2339d15221e93ea15ca1fbbc53a88c40f52044afc936e685ca53b33f4c4476db615f2f635dd8c3e3cae69f11cb08eb11595570349a09dd48c6424a9eca8355c4dab869797d2b5ed24a21acd0ded15f33612ddb03205746dd889945503c7ed40868feb20b4cd4113a37074379e1a1f2cb177336307bf047a8cc554df912b2094afd8c7f9af1fbff3ca3a94ef91921a03df0e024a51ca54ddec15411d05acb28f6eca794ed97970714548b632a7dcb2525936d73b013d5548d881f24c3c9e417aafa398f97c7541495f7eda20e0c39b102d781f48fb475f5af38b3e20003fb8ee2807712a98d1f99f3407b9bf22dbfd62292d87ea31e9b3088c78dd42c416c0a1a3ac3bc2bf78cf44ef2ac509de98b702048c0368bc1656a0cf71cd7e8bb199075013f20fbe490023b932e80ba27f9c471a04fd0ec160c427a3f0b5657d40ac20a291dcef69b49d945cd977283cebdf8c7da3c1c09e1a053a7b76c258e455af9db4982fdf9f877461dce9f07f58669615c4d938f5f3e6a2f2ca101df90338a8da2f869da347c29704e0fe4d0b9c7fc99a682db4110271d90683f7122569085e5408773688418d7dd684e38679a987b912184eedc35123d5a4fe4ecd7e77b1051cd1b213f823c1898d4bd0aa2782d133c8d20a155667cca1a805a5fabbb387a099f93a83acb2369c4b30eaa61c36afa43ce447214bc927b501d05b36f0e68b73fcd695c910d44778a13169064bd9571c91f4a43437302be5441e642e8630eb544253fe8511a53994c826f9313109230771ac2e0170790f9954d3de84a2e3b853e715369cf41362a798f12e3966489890dac47380372420b10c3a2812dbef45e827faf53b906e3f70cc91af0948d25e849acf4dc2f86017203270fccabd0d2e967798899bcc128499ac7712a838e650f61024a4c51128168499d4eca669207546609075c280ce31c001813116f3e0d7fcbbb1634289de0548dc818da5badbfe9285cd05ef77d804af93821759441a6d5fe38e044422bd2a39abb13d9646b1f7b53ef1c7a6941c394f0dc2860fc8082a3b0ac2dc889c0104007186a320d2e2ff4ddb83ccbc11a0ab90003d6d52d04c5ab3c38eb8d9901645188a606c4153693d149aef7fab2787f66e3ed42937107310354c13cc13064ebe4398bdffadd97ac6172482de7856a228059895a39ac78c606705940f101df506113c71d0f588673a7b6f8c3ef081d8bd4f0fe537a2745839eaa2c527c22839a92491085fc99e278a604eb87030ba89e2f261a14fdc8efaf7bf104aef08fd9f759ed32f66e44d3f5407c72a8848324d910a6b24c14447d79c42e37cbe10a25f7afe235c98220bb9b3edc00747705fefa711f91f2312f709fb54c4ee7b07cdcb18aca162a8f7bd5f8783215d26397d8c414431d0db0c9956ddb1fd29ee1f804fcb30b14327a0f911558612c0e768259425735045a7b837eaacf9f7630685448a23d99d0154b5dd902fc7547a7266d9e224ba0c9396d134ec0c53f54f67267a884f12098130a2f4555c05e974cb551798d2233aa06222e369fbd74b2764f98fce0dec72006f626760f803deefa86be349fbeeeeabef94327d10feef96b88caa4e6fa254f67392b17aa81899d1eca8e59dfa5f2924722a4c37d67a3c9268e9e9c649da28f416209f7e9d1c9a82c520ffea3db91d23a00b6957ea336a1ecc289dda951f589c037622f8bf225d31d319c1716e710211b9d2555de381ba4af92b8af955cd894d9bbd675b05bab89a10f3e5559a45ca1189b269131a91db9b087d73fa1a768bc4288036455827407fa947102537fd347f8eb7a6295d67a3b42fa44c8bb9e0a4182a27da4db708513e3b579a2a382a2f17573234d0b9bbb1dddaa1a0436e013aa1514007223cc4f17ab3799a65a66596fad5ca718ddb4bcd8869f1abf26c903f3995013695686ca3a23440da2639d273beac9079baef6072fd20805e3317f4493c7429404ae501d40a6df96708d7e5d529782e01bbda494d729db97ff68048f613f73da408b524e00203c7f0b3761d30e4e6117564eed999f0a77b762ed6e03e55a735217fd2650be7c4133e51cb553d230d5109f0b204b68b81349b7fe0be49d3e2ad372a1af4cc24fa3ace1a532ca21e651e52ed11faecb5db47577876462b49f139d876be1ffda14534d5d5792f871427c75ee6e14af561b0e3bc62ea60ea4f4d20b81615858988950fd99c5ee29d938eb8198c6d463fa07690a46319b47c02d5bcfecec95a1e66af2744e757c05bea2777cace9241fd20eb7bb301042f5717fe0468d60f09b75a6062a3e17e9f43803f60937b2805439c4d801ed528402abc95d84ff7eb5b48563a22e5ba429f9c509ebe15ba17a6b4223246eb5c9eb35aa815120d8315dee55b95158ed35f23cd0a580180ce0909be4220d0617f2b5ec470f3aa76c55b62604b316f33139be36d1c1aed2e2d02d6265336026532cdc00c2a1807973405f91b48bd852e74ee4a5b58604690c61669b5c7276c3b304736f4fcf911938319d5acea2ab3f0a1c3463df4517b7ec9e99a25e90a0819c6d28e84f9c646289478c75dff4a302043f2aca41106e2a32310888e2ee4f589a4ef20e65570c4ca13d68ed6a81e2e358b0d8f2ebb08048245080b616c613450316c986c00d5ed72ec4f442027781e6a27c574cb0bbe981a5097c26de00ed8c11bc3f8086511679c24f0c2f7c955fa2a206fb0ccf00df751bab8dc308b00ff825c625d37e5c0ad21b42f29a9daecf5cf859989175bdbaf088238a1efc6559113cd255d0cf9400ebed7bc5e86417e3aed010ee511dfb418ea1ad8983f92ffa7980f9c0c081d663a9dfd60be1749513fa443f2cb02b5740cde2e008aff771b8ce0a6c4c6ec108cf44ccd60792294e863852c8848d4e71f09c0f8a7adaa14205a5929fabe91a202e9bc965a69aa9ed3a796df871cce5b10a52e74430b514559d650e6731a6b8286168c8dfbc1d711dab9d28c850b3018a0c1983066edf42bc96e490c29c0916178d0fb11125b5229df85a28bddf0b696ca6a259712e7add005df56d0c91d6b73f22963017c612986a320884a102fe8d54fb49bbb765b1422888dc8e3dc15a8492bbb88d3e0d1044e263f2b4940fdcaa69786219afa404ae893a938d0e9a30728d4cf1a5a0705cd25502795d3b3f8977ad6f333300989560c7a2719f6988e6898fa9bb27662174b54a263e9f59ba30f94411efd484b912bdd533e60c0ac5e145f22329992cfb7175dba3be34b100f1fc87a9952b8d25cc61fcae0519936c65bad968474d04f7ee01e1a444c768770818a13a4a6f7deaf8211f9f323a207b0177ff1d2b298324dd1352fa2458dc1d0817501600433bac16fd8a64102eeebdc734bcbf653b545a7801e458652fbc60dc89b5140847285a42f20d0a07b1caa5dfd6228716ae25283fa384a02d23f6784f5cbd71ac9a84b4ec2f482ee6321fc164da88025f69c671a4256f757ab1148b9bd9c8016b4e1ae4929ae31ab3d4132125c7c28161f4619eb0dc3f19bfab5effe2018095af3991f54c8ac68c0e4bc255c850e585abeb1796faddb480ae49e3061b1c1439dd116659846c8ba2b67239df1b07785b60b7bb944bd33745b4ed4461b7573305edfbfb2b954c05d2b031d0731c48c6744c1cb8aad892f540aba9602e986c54f074ea28b1a11095b2ec56129b474ed2b8b353b6d34734d17cb66c8868b0c43976cf2514aa72f3c80dd9f50cd0a3363c7e58dbc9d35d4cf27018c8e48dfd1c2c95853ece0f6093c3011b90135f853d46e000ba488e6b59f65e1dc10a24395b6ae4c406850be20bb14d953c453ccb71559d9221262b263b782614d1decd43feae533703ef632d339e9db12132a73ecb03a2a7f18f85dc1c8910b222e3815d4c4b1c9f936e6deabbc4fa666479eb78994c58d9643551d11cc0b4c8de45d08689f72a1ff7745522c46456222c082448712676c2c7cf68f39009032f7098d77f3ec86c192b1b7c576248228e8b7ee160de8330887e4e962be6a5ccebe03e3c54c8438200890f43efb307b10919d073f88e30f39143c08d1b5bb54a3c48d10f166ffbc3fcf1cdf34bf721707abcadcde2acfa1daa75e3cca3ec6b2b09244b48270b8891051360bfaad14a2ae900ff96b71387dde9cdfe84f130e445ffe50ba86b123670e053b19c58c7716a5d4bda6b1331606d0af1a18e89925aa21833858b81919d091c5807cf201ce3beb087c9eb0d7294fe7c6218d9c04f197cbc026701cf3f6abbe70229a4d9746d0adb996d45e2334a8ce9bdef2c81490b90f295de806aeb44aa184f207202f8a025e2892e07d3957b64146caec1b69b93edda845f715be04da57fe17c3b316b228a1e10b20e0230a6105e068e4d86abcd48499db5b7c8a7c612c7cbb9cce1f8f4c79539d9649ade233b31b3b385e211e0c8a2c7f60f2a72fb649b92d706ad8cbff473340c3ab568ce79c73246dc32890b062f40310522c2651f063d62aafc9b5fc76576a84aea8945f6d009fab8816f2c6619dabdbaf370e39d5129744f1eca58c0a4f5ee4819235b21b7b1f7815e9b1c54325978b8504e83f29ed235e5ce8aedd178a5c737946baedea76887104071047107d7f9da6299ad1ea3939b3438b2976a600f1fb22efcd6a660bef7dce0d9710eb7541e7342dbfa479dd72b73566e6d3c4319604734ea5347423165e1fea08ecc33f662fb62f00e7de78f12817aae9b4b7438a48b97810be59a524fed6b229c83fb1f40403b6aab99f4d5cdc1e54435126944c32c07337234ea9125ed1c6b76c45d420936e5166118a164ee6d97204ac42560c21b69335c3f385e55222d7db630a9ecf4e126ee2181546f3493a9dc35e2f839b5a15025ada2e0cd6a6c82a327d0846c62e326ca73c26cfedb422033903ac888f13d9bfbeb3e05ef1fd418471e6d105a4b87437c2eb09b162406152f0fcdcc39cc08d84061b091d68c333c311a57259db61ec4690895dfdf9fe05f332838b8d032a7ecc4f3cbacfe5e6d9a7604f774f5049c1d4657d4b110be26f2bf3fa655bbdcb78a4030888e89e6acf481803f6591ea2279cee898ef72c5dd1934ef7828efb2d8ef813a7fb40477d16a7e88970fabc526fd98d3d59aeab57f62c1cf127d3570064edfb3b34abb7fd7d73c922245c50368c9bd42ab7d66e8faff1953d5e2e7dff8ed3f9fa7e425aa990e4829f31d347843e8a9a6d644cfd5d61f674c5a0cf37cffba4cd1bb15476f87aa45f791a4ac33cf530163cd24df05c84ea6726f938bc3bebdb69be1a237b121a14e646c4d0378e9d22730d933d350df857f343bd95d2e0f20ae77133433be658e8ad37d154e5705b53d3a75cdf9d2d856c964e126dd62f78c77343b67fe385d86866fe935b09fb710691cdaf5726fbaa61d0f3ad118005eea6b32e5e7797f84aa9d3cdfd5c491d5a8173ef6e4fae544d59bab13e3aa65af2e7548b601a9d2c76aa3a2652ccaa012f6d9023c5cb035f219b823d02ffc8240e7a3251802fa4ab146104b91c7f0d16ef1b100835ef858a211e0b7aee3a1ea421cd789041ae3996772e7e3d451c2d0d93f6947865f6616d044914e73c90f27e76da0d43a58260c5e45d549e6e1a789ee7ca12321b030959321693637aee58952d363e5bf13cc504e9286343608d852d50b208e18d658d6a39d84a091ae6bf6ae41ec529b16d2ec6726247f875f464bb5132de7ddf7571a0745f2098ae958d528728d4a86aab80455157d03176d8d3cab108491658c92f9c1d6312f6d22c82fcff3da1beac981583dd08e5d9d26c0487187dd864831b9ce5226e458123453dcdde21cdae7ff6ff4078082f0da1ccd92a11db28d35937170c9a74cf7b6a700c08db024df88672dbfa135c46085043c25f05e6aeadb9732077cae48f44f320fe0d42ac2203630d26e94fe22279c8b7e9ccd985efce1445e1211d6c0d4e37802c625f4bdbdd0ea2e6c8edff37ec7344536b21b941efed96f1e45ee171383c2a149e867da9a941e4312d040e97dec6b7e11a93ca5c5b73a89dbd128e5e38f3c692051c1afd7940fd8521c49074626590417ed84ca3d7a2cdcf3e7b5326e403e466c20260628d9bd079ea526111da81a46bd981e5920a18b0359d6532f668fa22d932e4489747c0517e7070a608d1cad524adc1b88110e1947b4c12547aaf6aea5b050bfa0364f78693f567db1e09f75279cc46143dab67494d3e1fdda14104c7fb88989f8b58babd530b16952b0a7651a193d9885f091584766eafedc8cf7b15e58e21f086417f2cda8936041a07bc9ced52b866059e5203a527c62715676a1211a2edc08e39652195e0dcf2e71fb68b9cc458cb103825942a7029af57ff108c6289a80d5cf0d243c644ee89ba0824963ed39f899a4f2ca6c9d9407f2f9ac2d33f86f7784d1efbcd9a45fa6ab382ec58524484d1c54003bd313ee8b024aed036d9ca784e4bbcffa165acb261995437ab9ccc9d7261c01b019472e22c0c6379c0e1f931a38a1c493de7dab342034ab2d1111c04532b62565cfc455a10895ea6d59221e823fa9da9214888768977ce6a9cd78ac9255979ab97bd1731dd2f58d49c337689573901d33eab3a3bca2619f91b684148d9d2e9ffce823086dfd062deeee44a180a5242c11ad517b51f9c519c305a842244c11089c31b8a24da84b6067ebc96aee7a91f9eae5e19dc49265f29ee7368c778ba7386e2fc2b1d50acb6246c562cf12b6a5aafb6378d4dff6edcab4129b08ab4d66b24f764e55836222c2c888d320bd8c1492ce090c0e4c91992949f79786ef73d61c9b45cb9adc23257887c37915507488127babdac9a7a2c56e99245ddfafb3b0462e57c6713091d37d47d58be326f4684c7e3076c56ed4e774670a6992e04486b7e25c8295c2a22f07aedd2f80e09601a993fa518e564833b265ec5b5c3d0dea33c4c4c9cb0ff956511f9376e783da708afb860329a24713215fd3fc8003fb891218b3b6cad38911668b78581339a9ca26eeb3809a6a1a99f84cba1a1ca003c7584e4e8eb9782b7a6368d0d925cca897cfea7f2e639ca78bf11d594d701049439ef1f397f9640e33e8401aac93967d9b704cf7e5c4d1e7ce368482ab5b1b42f538701a814305009e7aee21f914ac1fae8e20c604c750247b64ddb379a5b677516c5145688a43a7b23405d49188554119c7fe80c5d6bc85425e5b918723ed06eed4c58a83fb5e307eb9a1a32f1944333aa28b71b9da69f8eb51f888a3ff3fa2b502107a9173f7800118f7a244339820f0080af35bb9bc5be5f46a7338905e89c489420714408aac158a616bf859bec643ebeed9be43fc636638d82ff009e54d4125fee67313e29b4fc66501a5c4d161c5c107cf68e144b7d82a2cee55d75863c28a74497886aae04201e3698e7923f38ba8ec29bf8457981b509b957f3d2ed001aa38267f6fbc50d3ec03f3a6862a028d3ed00466b3b7886a33cd504a5f5806453ba8341333cf6cbb1d87625f32d5f130ffdeb6e2c1ea713841eb56d0362c2fce1d2e7e25e6569999daa8c62b85e242cefff9c3e9f17fdc35983f62ca7233fa2feada5f9645f4ed4bbc9ec8fe74847a2da9d80a085c4d0298241b66357fdf904f997f37555c630c39da1cd2b2ced7419674e9328cf5c14ffa9f2e06654eda760d150130120666e2b7957a59ee5818c58248c987ab72ce6518501bb1093efef72f682cf0f1f5bcd8270f88d3f073b66e39f3eba3d2ef896fffbd890f213a782d27d818c52542852bee45ff090501dda68fc738bc235f85e90f771ad85ed97fc0e49ef6f67123154dcd2151dfb72197be77658fc23c57ae3d3986ac1074019af44167786f30c82653fd7394afe8ad14c88424cf8b84349322e291dd94c11a3abd3f35a5934af11a3a256e3fff8864804871612ede039275780e71a517887fc49da4cdd6fec94279c601cc44ca6711a5b94c252c737810a6ef3807572fdf99af328ca31747608d202b54877444893bd9d0dd380ae124b15e53ecf38c164a46fea8e96be264320ecd3117fae354bc17fbdffa20665023777985f0c9d85e3360d0f88a53e3b773e38411124ad007576348bfaefbdd6156ee86386c89f6f51d3d25c4ff51318ad8b01e897218821ddd5076b9deacfb4ab715f703679ce8794759b2c4449dcbbfe2c2cf8a588b17ea8315bb9ae6ebc80ae52f28f176229b560151e7bd1ab9ecc8d080fcc64574ef7e0d3bf68e36cf845ade6236012873b69534517b74c66694445876defd07fedd714de6602ea26be9013c88111822e1c81f057c2215e56968f2fa3a21f0d23b124b76569479dfd0336881715c0f2898ee7a1727d784cc82d7996434e7bcaed8b90b6a4b65a06042e7e2b19861fa81c53ac6777ca5e4eba850c315faf651c6ac1074401ce45e4fd073eeac5e909d7d303f2068915741e408673a3528ae92d0098f778f6247151127693b2d730ed116699cb186177052986f6058a35f7c11b7ff70fe56cf459de3cdb9f85c77f78e7b38d78ae18104317426dd53b62c9e53ab9c24cf9322d95515014a3b21696ecfe080eb11a3f61c54c9087060c4aac7421423d6bedb32a8f217e6cc4814b33276428a6d70f902956007d4e8c2d166e1157b8f2a3999c4eb1e9ec81617a523cfd40c90736aa0225615236e358c9d12bf823841e41ad7ed2f8753ba58683607e20d5a8a510d1e4bcc7fc08d13cac4aa9dfa8fa8b0da5d1c6e9a95ecfceddeb74de349e4fcdb9ab64344bca759c089357dab8140b40e175cf99c3aba2cc8893c7aec8268ab89f6833221d9a6f851614b5bebd216118619885a61765688146907821a9bdc84d6896da83ce2cfe02ad827c6ea9622651cbd895c83979d84c5ebabe4859dc3747bcd8ea263949b967de635cd183169fe711d6e02f820092b33e809759e509d63bded41225fc0bb20b50c3652b09750c8e2c28c9f29812ee0ee68a1439f53fce5cc91bd9b9a52647921db01a8cd179f212ffc4b6d4efa9fabe02dc01c33fd2c1f002bd0b37d6ec69b73846385b426e6bb2a9533a57ec8c041c754c88d8d4a114313b2e11cda125a50aa5e27810f6581e041b8c8c6cfcff4d5cf3dca05f9c642e30b28c00893f04207a1284453b18e9b453026032fc8453bcd37743c769b0dba3be296056d2e20430c6a56db1b028cd859d592388183804ec54f99187e50b59ac853e7279535d94ed9657650ace0dcf317dbb59b9eb11484c268049c43b8fe2c271217d24be038faffe3f268619a90fed3893ab9ecfbe97b6bc1249f3d46351b13c6219366f3756eddca111ea5a779ad3127019ebd57db5fc0ec6acf726c381804f0087730651e0a409f07165c389948cd8e646a014bef3963d52224791ede90145ae5a156327a1d9104bc7561b2ba15ff3d528f99959430a5c13753004e0ac58e1266d3702cd6661f4a923803faecf4c3e283a304d7bbb21ba9bc3512166e43d3c1c81184a14ea9bc2b39a0927ad01f559909e81ed4247553af44c6aa1a9e8b200e014b38ac40dc3849329013628f029129c792b052f5164d7d531e1ec719d9b61abf36c490dc188b2a2fd0be2b4ea1d36261d5a70e709df05fc6191f8e0a565ddb31bfc567570e9cfe5294b049860c92c96701423c72b75a15927485b427dc9edbe067a8447990bfb6c99508b30dcf5d8b6e6a3714228757e83b77121fb0f4e0ce26534958704a9d02d4d8415a9ae6b0ebf15d8509bf045d6edaa900a7985cd1ffbc14854c579e9001d7bd3f3bb2b2c76e9c04190d1a93fff49b978181c40a2a26e894846b0b5aefd0fd03726c4ec7f1e176a6847deef9e51c69049ae202f4df9442218755fc32312bd72e043b15cc97b248ac06625d8f01d156c30113bb465bdef83e376ddc75a0a2368bbe5613b840d799485bb4cbc0b7dcf9aee98f16253cddded0549ab7a7e7b8bb1d81d99a433080ed0d4e37a7596809adbebcaaeda34269938567e6dc45934ea9c713e19034acf7ae41e9df7d42a3f23947682b297aa855777f42046fa70a0efaada5a1c8728364982e6670338e2eac7c53be3a7943bd926346989114018ee952bc88c014c45d643fb5a5a6998f34c2faaca280189dc80a53da665462218a04d888a55e7306a7fa5548df7330784ecd7cc1e65e87c61747e202b35398722ec5f386d17a2e34f4d9162f2be348a9eb42e30354a7456c2a3221cae421d2d71090b97c009357005c2ee0f8319398eae8929c2405a0bb7ee80af5344c8045b78ee447ed2331931cec105e3e47fef698f2089b8a28007c68101c61b119af17565ee5185df30893c48376864cb8ceb28b06cfe3cbdf2233e2dd21b886919a8c6ca8c923dbf4a1e1c25e6b0dd0d8c5a0e0cc92bd5b8287e05ed3071db306a3a1b222cdd84d14221c5be3b851dd65e635bc75f501b50c484d2cd76a8ac16e63c297e68e48a3a39a4630831cee12d8c188c2cc271022af494e76b771ff28152a8b1d7921a3025fab1f2e925407bd264e475c0c10d05bfbb020957bc7f1a86669fc5c652ad7578e7cad7bb3dca1b548a920aa2919ad7a9aab4abdcda01e4265d70818eca9c968d2567e809d101d0d29a74128e0de4627bf6c441b815d255d02baf0a0eb21161c9524bddcf543aeeded631b1ef2386ea396f039250f52ce017e3be5cc04ca4c3fb64eac95aae3cc39589dfdcb0894509b0a73298a0d6b93eab4d9c8c93fc799477c226c8232e02b863270f607e752c62cd07766ff790886571e2157dc46742d5e17c0448bd6e5b5cdd8b681b7810db84c28e53ac995a6266348e54c1ef5f17c11f4aaa82a0b27500828756db1c625aecd4ba16f21b2b7ae8a28705668c516c8460f5cf268728f324f6ff25ff8090c489810abaf10a905a5033075b2e1b79950ca95d506d507eefee8910953c82a78263c306c7436a19116a76d70b96407f93ae3dd98e33bd2e4fd6367e66b68ca62e15622b50af1f43489cd23086df5e5a2b5c70ec255db05e4e44ddd2106946a096918bb940d87f7b86b3abde0fb28462550928af56c313d3fe3766949194bfe9728618a611fbf976bdec4e9744e08f023009a58525a27f98b8b12596604c0242516451080da19c72e857126029ab488bcd1b276fcc9e14b10ba6972b20c40063a0c66dee1a6f6074f49e268aef4b0004dd8c541c31398d07250061672598e96cdfe545dea26e73384bbfbe5d2ea6536ed092c5fa676cbc6af2f4b9d9b4542dcd8b5ec0a939491a668ee1cf3e862feb0e942db231359fc276043fa21948155c7edd04d166426ac894073bd342b45bdd3df50bece808c13f82f6a9cac81cb4403931daebd4e2d9bc71eca67ec9c3b9c790f892b083a9959a2d3998cce057079efd7e002cf04eeb313e2c8f9d40244ef73283b531da5dee458fa3e2746f804444cbf910e665922b738c68836829f70ee9b9c878881b4500a362dfa4fde9eadfac47b7b9bf38c443c5d97245fcb6fef8a60c6438c223b34514253737bc8a4bbf2f24794a5cf246ef5beb1e418099803ead8dc4c24cac2435209df112b2a440785fcef8975cf559fb971ec0a3626cf7b088b25640d043168194418da5234cdb8a424ff472a6751706232e9b7df7dbea53acf072b9872fabfb60998df69bad14d31150cb2958abce918f8420b7518a67255114ca06b474ec60460674495b6fd664a1938de7e8ccf25341cd7874f4fdc12d3fd0008c73d17df08a97796282605ba8664b333a863913bd103b382946f32743f8d7a86bc1cc9cc04558b3345972eeba5afc5adb5429c1502ef96b2c1987dea0e2e9429c635b0ad3865abc77067d7f8c51503b685a995234332792a05343cd0603a4cfedacb92186f504f25801244bd06786079215d72621811574028eeff6f6aaf22ce2074b4c9f60bcffd20d971c42969b4c393a886a528378d57a31d8dd1dbc8689d0e18958b29b81a021421b3d16a6ce55351614a46ae8f10a9217439a5bf1ca48a3c4218db4ac6ff43e81ed9399de56f7c5633f5ba42053fbc6bfffc56b4c27ed14c64e366e4fb9c53d6db1cd8e8981cc0f85116e45cdcf7c5b3419691bd46ca01354c21d79faea67a53bd621b401809caaf08b8568c073e4bd1693e6f0c713432899afa0a4a1289d0f69a1eb153c838f41824eca6ea107f81bb8d2c99106392c0da5d88d6732220926a8a1875e8d6e62f133ffa529e7c6a2a57ed4ddefc65f9077dc4cec67c6457e579cd35a3eb159e3876ddd9d4dc58238c44ed5d06c54f01d295b9d9d7e454d482725a3526115af8e18a6fba96d00271d39ada8b5bb75be3178c105133a6098a1a32d271719c38a042e210d74b9a0cdec5d7de47d8591d11c573185490a781601baafb21bd225cae959713858a53347a6085cbfd0b362b47a027cbe98cae4555ded40193d47a94e6b65b773937c71bd5191fad25dc0089038f87d007c9124b746734ef191d9265c99326e0cd961ab2056e7dd74f2ac13009dc7de2814f79673aaf56f7d43f48f514c7e9b4d758e9e7a33df45d6afc965c43a72cd40edd518a7e75a901466fbf9f39ae3e810ba803c5295b68a55d0bf3ade0beb1b396147af60b48c1afecb2b6e6ecac6a530d8f6e2337d4fd72ad30270f2c35dc9c6fd92557f3bd6f9cdde64e3dcae769458b3a45e03b207e41f07e08a903c20fe5d8f69658239ebacad62272552442c4692640568209eccf3dd51fe19be2033afdcc827f6c0afdd959cdd641fbeff864c6f3cee55142ec8424c7f91c638bdc1336d82c776677ec49979d8fc4018cffcc4e7c123de0090dbf9a8dff925c4b55cff4e96cd7163a27a707fc9bfb4b7759d1ee1a37046da9eeaeafe56e9e422b9b2bd7abb092f652f232fa46a752483f1404a6e4dad27fb341487011b63816020f00424e1c2018c20539ad93f01824dfa8cb0d8210d5cc44b381596641abb7c3cf9a3bdd4854e5ececcc01e5bc3e69b10b8507e6d0ec099518950db00b00b649af47f4785bb79f200e77804409cd5256801c16a069ad77bf8bf73949ae9f43479676ce709138297b0e610002835ece8d6bdda7be40000e59ea67247a101de55b8013081d7d20c97d8c84c81e5544c6702014386f3acbe2a97d92ed81048720f312e101afa80d0484221e52f08ad9126d4cbe731c9c10c7f8c1fd355a64fbd455623cf640f0b1b22c70cd7875d5f64d1536bffb44715d0496a3b417ac2908968315e33973cd63d26e8535c5e90d90ad191995736e42973e817b3ded977b95fe6e14070ebb77ffddf70d6e122e7ab8a44403c7f34c9d3df958952dcd185be8d8a020f0521d152388cb8a1b09556a2cb21599cd4eccc355a903d80e2d442e97758af9cb109e016cb7f349a023ef08836dcc5ef489a60656bd00ff4113270ea4f67257dc384a009420c765d89fe01245ce89d7d2449668befaffaa0e40b1467c910d9e7f7cd999bfc2601e487d58c13e5a3b15613f88b0be7257cc7c4b21abd119847d093067b1bd7c160b4cd5d9486afc98313cc7c387ec8c6d963d96ab92f90c853f4f0db5e9f6eda1043223bd881e2dbdcf9c16cdb50baf3af1d77ac95a9c9cd69da46680e9765ef7a96c8de34bc9701ce5c88f75ffc71a83a44eaa4af624a69174d3f196650a445cfcd6b52348c1641a20a9fbcead0b800c0adb9521743966e915804f0ebda331d9602308ec8301f88615767047409b58531fc216cf089f84f4a5564519d63a0277dae31211c50246c8c33cb14991732590edef9f381c9623325597e041a68bb9b2053d7526c5d499413c63daf8bb8f5bff9a35c9bed031cd1490f58eae57133d8dbce203b40e48cdf795f80fab836d67818bc9f26e5093b52344888ef7854bd30b38ce672c98c69ebfc2ef5ccbff4109634600ec7910cf6c47df5c95a52ed46cd5dc66b8f5ad2005274f5a958d2f613789225bc1d09459d8d519bc8d242a90789e527b05dce6b116ae169e42e0420885644b0d647f0a2b484b92cdec64a41155644824ed1a5aba0ba60de895f2e6de9a4845e5be0521e8ff99a9958c9bc13a01f57dc098509507d2f330f362c6c524a0c8dc1bef8ba6427f262ee96202825600f0df8642c4bba1addf2302d5a57bf81257a82c49f579780ee54cab8ff1f526587835e8922054ae484639bbd999c35abd41dba917cf423843434c100152e0c83694084ff519fe33a92e19bd6a0652d0a404e94e7604d1ba2210933b3fe091b570b48eca5ff713a14c3b7883060cf1e72cb83fc81763b7516cf300259ff6281ec878e50d16258c28a8861b55103c2a564362c8c750f722f8a44ad79c5c0b1704d0043040762c630720831554c0b9bbba1f55b90907fdbd286eb5114f08147b4fdc22b2ed4446bb98857f00faef3522486b725f02dfe0739614cda2ba4ee9f35f951483fad59996fca9639f1cb7fa1f2a1999faf07bc6cb3b6f4be3eb9621a69fb0bedecc86ab824751f972600d1a8946f5d546acaf8e55eb57d1434975c2acf104fa1b1f194ef18ed15903193fc8d73deca0419ff1e109c7beef9df0851af9f4400ae089ed8c8a951630b49bbcf804154fdcfefcba35b9f48ad31364482ea79f2ae8fc6252b9a6b120fc85ba9974de25e6e5de70158ef728a5f041ce61055b2364eaa64bd8489624c18c89b17a4fbfa4e745cf95142a9aee6fd9487ebeab984ff921725ddf877dc43a69cc4d1cda019fa432013340b0972d8d042767da2c1e67f34e86734bdeb898b4d311e20d64b657f2b197be8fd408fd675067ffdd969e06ab19a8e6e692f54d5f0e6457575ad71c84dcee7e027a8307d75dde73ba3769df4670383aef3012c02367bc829ba3692f371cbb9221b997628dab437dbaaa2c6036bb37660f037e239e4ba3a59886842107f819ccdd2285e0fc5d98998ea26808e3c1f862d56deb8875b37e925d8bf5dfc312a70be641a6f0c05c0d5af28134b74d8148ab152863c0042b30a18b8338e1f958976b5cce1a1ef89a8540470067b74b45cf4c1e32c5457be88b8121aa4bfcfbec5530d99baf3300759ba14bbaa0e7df554b6d03bd88783fe0ee934ffaca5e04545721aaca8eb1853b8534a863d3d268d1d04962e59fc01002ee3118810307b6af1140c572e151f70d412d603856966d0639b88ef2caa9611e45d7a031372b89b4d635dc03a72c9552d98139e9bb4bbd580d2e2c59e6c5049ea4b696055c8fb232120d3c9b0c22b3b6bf4924a166aa66b70959a176d41920888671ee0a026e755ace21d443b387e11fca72b3ad3d15d09208129344de4f684cc948482750913009da9fc7802c6b8737b9b6a45580604a725da78efe54af0113b1818d1682c45bf27e6e7fa5392ee7844b3bb6e8633b2b7be0a4d0361979790a13740c10e847c833125880edc4039997c0c109ed5e4185597cc4ab20693a9af27775c862c100316d83ed3f64e1b1159cb1a4a292548daad910be6b20783191838311c085b6cf474c117a4aa6a757ce563d597c444fb31a672d455e96b20432e1d3d166c5a94d625d1cb367f730025cd9360396f464c61d25f445eb25179f95652a4a4262539dfb4e2400223530a5bb61771f0c211d7eb5623f9c8a059ce51353bf9aff3a946ef9f2c269e6ac749efff54c2a096fbe795a2327b2bc7e0b7d84e06a25c27b324aab1ca9b838649bf7419cd8ee33c037a83b614c46b75c813117cf3b0a89c89af87e2a35d58c75cb61f6faf99348388c3f66fab3579bf09e0243b3c2485de22cbf1ae90e9771a20124f6b3b48d8b32032f07179eab6ec15ce4dc022a7fcc79c8ba8eea5eda7a37347ab9e361c9b07d720d6233ecf236148f3e0698f748f44080e8c9806bb29830d7b6e36524098172239001400733a23e30e079c8aa3501c08333cd2dab9f43d8e9456a15114b24cb70654df884be57bd494cf8f75a35998fec65131a11970cef58b3233bd8a56da5a9dc0b28f0868379da4818290bc3001c7bd7f111fec4f41f18ec64554cfa9f14573598e5b493e5528bd5b39fbd8c1e69a4cea31096b5ae3caefa98af4eaa7c1260f6ab042ebbe1292b8676ba157aeb85ad1bf5052e8cb5fe823124d4c4d24d54f52caafe153b710cf637fc7f36480e856f5a10bf46441e58d896980f6262b5f9aaf6c6160a58e41e4d312ca6a3759c42688b0b34e1c45234cde8771a4ba8ab5016b8b258d79f5cf3b262630d43ac6b9dd414100b19a78142aaa569ba1187fec4f04393db3784101770426627e7cfa43bb5d169cfe7142c8d0a7eb2bc08b40b7eea66a80d91455bbe9ff40f63b1a375805c7c1ca3c3fdf4c8dce65134465a99ac86d8cc75c3d29df602fe3d55442152e877429a19280903041776822543eaa32f1692b42b9fed0537efa65258666ff35d45600b292aa9a38c7aa6807a4cd0fade15ad0d3a330ab595b07148d46bfb88cec6aaff501abeaae689e601757b890b1c533f4642b0359a234b7f4764f89ee93f4019f349371c827a997712acb8a4e56e32da59cd48d378352bcc760620368d63cf384cf69ff653e620f40035eb042ae74e500458a319f32848166bd96067719052333fb187e23149bc50ee4dd80020f7b9d0ec78e280d844f13ea30fb2757d32b1e279807df88625528dd562c754115a284cc5290e23216c971a0eed620b71165f67f7596a74b02a906d2cf725904a16908edf8f4aec2eb9341d70702f6864d5921951067e5f9574fb8b9b0913424def5813c7713520775c974c93ca1f7b39d11db01844c1cd366ea22c4bae41c65c9142de73f4ab2cdee6c374167c3a2065437e90c80b76a7048fc39433687288ba1f2f88d61c09752e78e8dd25034e3c54d6d516024dd2cf1ad4cec000f692ef5e069f312755922c2e74c17b15ea5a66ec44d75e3de73eb8d71d73d9e2c10b8b155187d473a3f404a1c423fea0d28195bab8021a4ce8b45b829ec4a399cffb277df146b210d8275bb904a7f6b02c47decf166691842fd79dfe94cf80c6a6235b374d50a5a1a2308b1ea2a590387ff1937832fd59eebb6386f7e22f01c95ed2156151a4fdd8c64e2a3efad12d62058d7b5e4c00b1246b65f8bdcd810e4870cfe818b99d61059ee30dbaa808c2889eb14afc313bb02d3f714421be7884aa5ae8342ff4129a60c5dc44dab5037fdd1bb515c02b49d991602454a6d07a85acd8b3a13f6a8189716af8f393a6e4b5919883f8359b769a006ebe18de4673e9bc8a1bd016c0e4ed8145622251cea772c2e4041cac55b0e16574d0840c488bcedc043b861a3a23f30d14efa4bbe070723b60b2c142d8b0f97a8d481a12dca031468dcbe71008f5c559b0e18a16a982d3f5a581bc3bb613acc4d896df23d0c1a1f90111e0741984253cb60a6ed31409b4b12ab73f247408946b3b48205b7033106580bec838eb267e5b58daae1a4998dfac13b7575173d4bad8b255a80b8a982bb44056c154080d39aafd06aa189bb9a447e4f1cd6701aa69dfe2568ee3eda71fac10b9bd6de06dd0467ea8177d2832de2a92c342f4eca7881c5cef3513118ff5b74150574ee0435dac74acb22c5068b9fc5202bb529da06f718cc867466323cf9b5775bd6a370b1d068bb0283a89b15fa3f31d107538ac7aa81a9a8554cf57cd2f4d3d00e0b1aa183150f6fce47f434c891f9f0349c66f311971bb4c64b6959e0fc49ddbf88d7cae144a90d96ce987fd5f00e6fe03d5ac443edd679b3a88fddc81829ff56288ba0c65a133b65cea2c5817998aa02b2b5ee98fd646656c47d4e7ef2dad15c22acf20128009a8e281d46178866060390978469c101ae268cd0cad1ddfded793afdae22db431aef934f00b0629fffa50103773cc41994115cff161509e9fa6581067cab2e1a21a363fde8c46f2a45115427021c421f55eb6d7ac4a69a3ad477b238d16dc684eb95099bacd5cf4114b73570818a150c846afad6610dec0caa9b05e726c63d9ba92ddd1bc2e180b7982f545101db480b3b7cbf32556ec235731210eca142fbc792c74c124a93a4550a697d34aa2305e11bb7be59adf222fbea11c50f08ce34e26b8b91ea24b84218b2970ab83b04c457ffee80c69a55e16c7493b6c3abef2abccb46365699d524038c778d577b48e050ce57a070a9394b2475c21a9c0312462d853e0f85f400bdbdcc041ae6d347bb78abb9a34f226caba591265ae0e7876908a7cff46b9fed27e4c7baee886b5969ea9aa7432df6594be824216d7414f2ae311c0dd1c565b414d100cfffb6e1806244621301ca4e25ed5d160ec85a0ba2fba900a56d2b297904c0d46c04d71ce51892bad32ce9fec211587b74cfe619a7da4ec56d7c8dd84d6dc9632ab5e00fe5cb4893c3a907a36040cb0a8856de4a2f4b043556b5d9a4861d4b6a2e4ab9d7a663af849ada59db15527523fa6d181f6269e563e58ef2a2ecbb7000d06e5c25b0945417a87a975b473b78730a1db749fe2b3327d049b0780b6fee76f0ce4824e891f804002039eba981d0d87d6ef7d9cbb10759e355f084fe4233616662b03691fe91b4c2274d27c09d0c756ab6282c6f4f03057cbdc9cf8ed7429f902e13eafb679d129ce06f07c70c7721a8caeeea5ddef767bc706806eb8da249bdccb66f761d4a0005dcaddddaab4ae016a51838fb1fc0acedd1d98a83097e00dca02d8b214dec5e871c3900d42c05f7f89982fd1de3ecafd6bf05182de238cac774a34b58a2d20f9bd35e9fbb75a3d1cae65eac12d28f314645a1eb0d6a19d7918ac1f72cdf22d941c8709a1ba79c65ea45b199ba8d3f87f45365d86f27e485c5e952808c27911ba2e323ae9c1f76be6d1d3d44f0ae33c88bb9557952ccad88860996f38752625b8984a612f5f614213d05ac4ae3660c92e1a2919299b3c9e59d68616818fe617954042be7349228ae24c77bd093b4da5127b74e2c2ef8d089ade025b6ae62f442e2d828463472f0b44a3df90815df138d7850068f39572838f408c209d699923cb7971bc97b001e0e696e63f564613fa8729dc937d332b77ee54f3f7a42d6ff2d9b15574c2aed98a3e24cc87cd106cee81289d61ddd788fec74f081f69d30ea1e7c085b20b0c48d21041a4ff68bee355419d847d80e8c8382563b5f912ec1af35d2dea3652ceb48d70d582e4f6885fdf95de8635483b5d4efdf202f3117549d63d5a0d69ef05e3918e4fd3e340201b8c3e0098893e54121c13c7a18800119068e029cf72fd403a09519b8bf50995131e97f9da04966b2b9a4fd6261b81d41f4494ec9dfca67cfaad11070983d37db4b4fc75f23906dd45ee1129280dc591e4fbfb53110dbd571dae676c84d27247041b12dbc8cb49af33426da634a0258250dc0cf0fcf7fd36c81c6fe4ff157bedb23bee54e1cc9db9a939aced96931833d8b1cb6b69efd65867d71df29c28437a8c3a589201cdc19a9eaf398e4904386cd2f837b6814cf5d9fc64bfec8436ad0de3291648a83e1a410ff2b9ddaafa7065cc7042dbe3ec61ce9d642d1172b6e61eb33eec9d17834052b9aa78a3095218900bebf1bcf3733e8e8def65fd0bd9a3137e1dcaae32d469990a8d8cdf6f4b4f5011a41f92bdf89b4734279e1931541391c3c3106a6db84b5f66df014e214ac2c419abb8b4e92fe25dcd83a382b93e4980e3267aa9f20dcddc05477c55400d788d67366f796f82b21e8927eed54a8ba039738f2cb693766e6ac838b9dbd20a1d2e61f3f4b9616836a5a407f1abb2147feaff3a991289d65a1be298bca4c69c155d60356622a2400f9f06f16eb7cc30de69824df39ac87787ea01331636cf6a73fd412e5052564776f89ed38f6db469dbb0c866611bc2f7751f1996a28d9b32ef84a069f0de8df43f2c6e3930edcf7af15806592712b9877852f07b369fe9a8a936f142fd6eecd969ede299bc3bf00804b41a3e516b7808c17e0e89f91748128dbeaffd6bdc8138a7f3933dbcc157da4062baa707d51b6099278b835c4d483e2af1710e1865c62e8e0fb44a30b9e5a5afc871dab118eeeff3b4ffe75c2b88df651f374020d845de4fb29d76ecbc871bda85b55111ac0b80f63ac35566bb38aa9f0120949feda2eb31c4fecd1199401aca98da6d70f92e48a2ddf5c2fcccbae780bac2c6de544688c823b59dd743f517182a9041cc0492108410b914a3cd036c7f0b9749505c16bd12beb08fe1e47aa2be23b1b03b1362f8db0b31ee9afa985b3e5b4c9ded38981ec4ee311ffab17008a2f9c4102decaeb977f0fd0c2ec887b988595d1f164cadfb7b65e37eec4b7a46bc6396586c7764100c21497edce3828bc6e2551ebdffdaecfbf15ef1c9be7bc79c2f94e61a917d7927b20c44a95b43f930f7a18747f06b625f452e52bda9af59adc12fe1ba08c26946cf853273245a762d0b6b35a29efa8a17659d9daa08f0663a7bb0faddb4b2995aea1c8a986fd8db86e79a312c9b5ba169378a7d5fa11ca31de51e96937e8d3f7912eb22f4aed3cf43731fd79d6e0748fb0e72a706b445fe9eb4230d92d9c730d9661a8e41ee134a52192e71a8c22422e9175e885b9a85d42aae9fa8ecc88e3b577c8f235e90283a4432fcca8325ef7d226b1b9ae87c1634248368bc3eae8b6616012a3b0b02eb8b3d3cb02815992a4f78c90934942fabf70a436d4b6c012e3417c4832984d3e0e7b81c08f089ba4b7247e8655844005b835d9e43046af4332ff3d5dc2211edc16da5ff537ffb46366b0fffea6ae8876b4b86f64b0b44a1e73cac4951eb68032b7b63edb0033612875ed916aa7b5328516746eb355d0a5c6282166087c53712a1f3894ab21091c7c05d04b856a44637edafe7b139254265211ee47beaabcdca0e5c2579a680f9aa59ae3c896fb61c4265593c457795df3714a8b9ed3c71df55212ac6e98768458392001cdc9f21489ccb5cc5edd789d5fa54ad75aeb34dae3a37dee05269ea353e971c89f0a330778bc000f0a0d04505b761497d0c1da39a15fc9e23edd21f62ae0afa183d0b262f0a8387b1786ac54604d33b430fe520130deacb2f6469dc9e2442fbcda02eabe4e895930d4e1a439055a0e1f0db4a47fa8febe2e3e2f1e8ade19ac1dccdd061dbd4d065a0e1fe399691e7fc8a3933b2be4b9229cd10f0ecee1bededa3a8321c339703873477b63e1c898641df18fcdf57fb3dbdab6dd8d741321213b1b085f089e09778964828926ba216c1ad4ec98e0ea8e49e75cafee92a8defa86ebb06fc07e5df60d3fd799bf8ef50df3d721ddb9e80e0676707f77c8901c1e4ef51c0fa7babbede1e8f070aa63a0014d67c7c3a92ea4014da7df80a6837d3e372bf34da7826f3ad8730e3b8187531db3639edb185c6de0e15497d6e958b6e9b42582ab673fb432b87acdb2d4a58d7794014dc7fd3c9c0a3ebb1f1d8ab82435d75fcd75f87e16824add1afaa6433dde1a7a6b74a0de80a6439d07a713ef74e2b15b73fdd65cb786017d781edc5f76499a8eb44ea7f5dd5f106e2ff8ccf0a1a30d204c1ead88268ad801762db052040e8a40428b2122580865da9010c854dc868682b0a94f2198b0af4f3b085470886a5155f7218437416ce07edb0ad8c0f0f258bf7eddb2d767a3d8cd3a60ecb0adcca6faf7b236e53ac4574b6dc3a0fe0f47a3cfd2f4b20d8921cc3d913a66a3cdc736d3341354f8f678654704601d954c09dfb661ca0af101c7c78830ba08bcb71b2987a0e0e346148432434b601bb8110d15c1538e10c21896bf5e06dfc08dc88921ec44103ee146e4640c7642099e78bac0722ace5dd01df999534b9f8e4483dc60d29bee901e70d3b4a5c7f012e90fb809977ed99e886378a33b313484aec5ec6a183e73ea4906d76eee82e2205f78cc5167e8b4fe827d6169ec08b31006dbfa74635b9feacd6d085b77612d1a3337b7226c1d27bbb959c1d663a082ad93ac97ac146cfd645d061b65bbd9445d39e70becef53bb153fafebe61c5bb658b132654a5111eeab0d5df185751794c70c8f37412b6c1abc029269ba63454b4377ae6bd3a7f693bdbd99b757df1ee9ed955cfc3c1c6e08c671dedee9edc920e331b87018ec6f3e67455114d5d3550300455555163807e0920280a3015ee174549700703468b83424ceb33c3d57199e4d313c1f869baa9255d5a015700b179d04c0743dfd8392647094b25693e93f93ba220df3f250d3452769703200b7ba356560bcbd166c5e33e3327e17ee6d8356d02083e76798e1267718d3c5efdb3be933ea6d661ee326ab068d1b8017d7a57117d73b9ba9a4be5eba6e0d1701a05145255555b90baf80569068b0f400b0f33bde0c3334f7f370bcf0c6b9599e6eaea3cb70b389e631dcfcc370f3e9e6661b2f5c57e6de6cc3de6ce3c56f3eb970f38966c6cd9771f34736379b6a6e3661316eae2ddc5c4d17c61dbae0b31c1dbfc8e1e2661b2f4a379f684837bfce38ead6b5dc154e4794b25693e9d6c9b2ac5bdd9ab7eee5a97eddfafbe164b6812feb3a752d7bdd1a2ac7c3d1de25df393339666eb66123bbf9747237ff397258f77a0c520396cf416ac0d6671e2303223b89f290e7b1dc2b058261f91c4fca5a4da6df7a3ee19c035b3707a9015f9fb9d906ce397026afbb0baf7035e2e73cbcc2e968785ed5555555557d475fd7855754ef511ce6b52edf2ebc629a6c1abc02923129c927bc0147c4d46cb0de9f96ad2ace8d04f79b4dc42d341b0a30f34775f8a161b72cc437105fed92d6cc2f2b719879b436378d029bebf6d0f87adfe6667ee633c6686c3d06e5615d8806209eb70762ea4e8859f6619bceb1de7ffff4a98b641acb36b6e99c864163d7679e6d7e334d7367feba59879c6ac93ecd5f36888d19e4065f9f56056eb07579e6eb295b811bcc3373ebd22ec13e67bd65f30db6ae9b6fb0f58a237b6bfad6266c5157bcf94a4877430f87fb7917713794dd2cb145af1bc28d0675dd8f75ebf1fee0be2e92cd3478e68d5acfd60d7283673e2bccb20d771133efbb2d1a07f6ced168f4672c66dbc3b9ac6533fa4677e87c4f203b5cb14561d8b27ed959350ce075d5ec96cd3d10cfcb471bc484314b23a55acf18b67e5dbea76d5806b12fe60b2c521cb2c0fd5652b32bf38087d3638890640e0bbb4e50af670cd3cc6abeb2b225d8929feb608fd751eae3c2174679d466fd6af8b2acbba0ceb96ed94677ae0b27668bd03c88eb8c3e2725a5a42c0f6d3352521412ec42cedc99494b333737a62fdddc73d287b37533c456aed867880fd7cc1fb8b2238267e63e60cbe687af43dae361ea3e78c6ebf2ee7839bea777e615f28054bf240ff519ebf48dceefe8995b91de99cfe9e2ccbc3fa8cfc4c7c882a8b9a727764b5e1eeaf4d67dd0cbb2f3d6d0c7cfebd6cd3dae5bb7ee2890ebd61de07e9c0eebf2366cb978764178bedaec70fd88f290b72e8ff59967725e2eeebc68e64793521ed73c765d530e51eb3045511445677e5c8deb92361cadf592cd7ed97892adbee3d56a5d0760b6c8e8415c07bb6551caa27236e68c381dd961ab61993d9d6f6e58707c8c2c88daf3307579ae5b9f97ee8a0f07fc21ad53b7e7e1ebd6ada11e4fadc7f9dcb0607ae773cfab3eb2ad6fd06316f60d7a73cfcb6c8e9794c73c8fbcf4150582e1396fce800fb64eab6aa7b26cc49475d4653307f0f5ec017c5df882989ad8baee333fe7ade1011e7b03e0b1eb832d9b25b66cb61e2be923af33e26ac4e90067c4e96841783a8c6a42b8bd80f9e07c9c0fae9bf2f872b57cf36c835b8413b31e0ed3ad0fe79de6b68773d90c887a3dcbee8d4a65d4654f54b351390a939a0d38d66603c4eff534ae683ae7faa39e4d74e7ba372a755988336bd327eac27743d3386c1ae7d1748e4d9fba6d3a67e6efb5d9e0f023ddcce61b9c3daa52970d86f17c4c51a59bb3bf78b51910f57afd0dae3ee7455d30ec1b8dead5d2f4a9ba75d15b9407a5951c95aca3386477f11d2fbbc12ebea3693ae7c5dfb5c00d76f12c2dbaf3e2dea82e5eb8b02eee129a5734d7871b9d2633f7a6361b1a7e6f16d4d9b2539b2ba6bf6cbe40aeb882b87ac6703549548e2c95ddbdcc62b7b2f3d4666cde1bf53a65b13e750f105f9fd7afdb03b165511162aae76128c43d12b468406567e1e8771f0380f1e285005eb87061c3050d4d0d9a999900cc944a344a24120da45a015047a31946598693517aa218260336670cf3ba60b82cebc692f2055955b7a2288b5fc4afd170cf8fb8ef42b301f667bcd7683cdc97d1dd68b83fdcd7bdbe4db3213aba1327746d09740defac7d37944d2431c618af58547da6558b3481f177b6b6e41d87279238595d8f29b13ec93751ad6af5224d2275f976231b4075941aab8c8983c3b026c2767a9f8f3e1e868fcdf512f71d6da4aa7daaa0a8afb6879321ce353838ecaec4186e3755d7224dfabd9966ab912b8e8865e7b4d6e2ad81170717710ce22774ed14b34f73f12ec11d98ad467d3b1180701b2202113800b80d0d010b9e4de3e78cb6e19c1a8bb8dbe4598fa7aaea0dc75355657b68aa5b0d78f781aeac1e1a5799ca1df8d1ed0429cbe6c6d0651f9e6b7d97b877842148c16d880849e01a701b2a3a0237da83c2eebada74cc568b3479f0425c1670b373beee9de65ceb27b5a7716b6f2d444170cef523da7289a64008234544a68808364126de111515e16b1781da868a9018819b6d2713ba60831f243740021278304516525c208026d4173cf17380217cd0a407537019f3848d285d32dc86888c3c21060b28421cc18a2762ac60832c4cc8d4d04204822858e0891bd10d62306400284f51957c47138e94e908ad321a8a1265883a140507d884db501416c02b7eb06630144508ec5a07876f1d54dc86885e50bd274ae063892856c054c1822cb4e8c00060f8441164c06de8092c98c26d8828091045a4115c62804418284430040d259e48822ddc869e8042740d31e4a40ab8c2cd0991110a547758dbf5a640aa537149f6739d6cc80dd91dd2447e4813ead9ad47faa38d80c08fdea88f897d478fe44797a72f4fbdcc369d6e3ee0a7759daaae4c0849f5abf181a99bdd9bef09414a134758491031af3ffa235e9ed6970fc7101f1dd9fa7431c04391d6371ececbd7af2b1f4e03896f375bb7f2d034051279aa8bf5a95dbae7ac7e45ddafa937ea9d7d043ffa1ccd9cda5c661dbbad6f203d9fa240a8b7fc8e9d3ac9fe5c8734e406d21dd2fa46fb10d27d687da3bef58df8768afea03f46cfac377b3ddaf9cabe936cd369f4c7087b76084f2d661b9e97056ff6c1d0a23fda293704b7cd43704f377d7f7407c6b74c881aef7a1a53547cd630084fb6c023f86c0644cdb071f7501e315e9ef7d968b73e457871db9e8ecebd205c1549e953e5b0932db8354c04572925ceb2af8b9d4cc16d684809ae81db9093227033e99c3604050bbe01be7a7793eebe2e1bc7f5d63ffdb353c300787f9c8ef53e0f458240808ef51fa7230f2b9396449fb0cbe621f83ab5f9439aecd08777087cdf21fdac4815d2b660faa6d3fa46be9e3d9b70d574a06d3a244bf310dc4c7a1a5f3274fa872382ebed89f8ba2dd434a08f01d4392e74ce8b9b4e6df69c4a9f535db00ebfb00edf3a1cc344e9f536674ead6f74e73bdae464b4aaca7ea8d6e5df1df0702ad279ae93acc00d374cca3e38cb62fc9a1696599bd15b9f6ceee88febf2b4ebf474c6100cf4307a4fe9a4ebc6d0188ff1477f5412c907539bcfb03c56880b9847c61ba60e8fac1017b00c9b47ba53f3ccde3a2bfa543d86756464d8295460f88ece7ed119d26bc4726a6f895ffa44268b3e5dd9af9baf67d79101423abd395f37033eb834afd26beb9c1f33375f91fea8f5a4934a27d92ed3646c1ec2937d3426033e40b297aed2d54deafb1959d69687e3117938d58c2db8fa9c31e3c5af17bf8e6534c3e619331e9119f6fd3c223366bc228fc8fba971e1e2bd38a53ba5f7dcc29b0279f1ebe6179fa78fc9dce8d7cdd9cd800f9e715a4fbf9361c1a367cf6ef6f1399d460ae43abdb9fe20dd7c3dd38f3ea26f0a64468fec336ea625fa92757836a1a4e3dc50432f067870eff300efdef7037d773fe00eff8121ee36a9efc3db849e74487f641f7dcef04681bcf0d21bf531e3a5cb737dc61b9df98eae97e18d02b9af3e60bc5e9eeb304e6da333d89e629bce651b76617ddcc3b8d907dfcf581f2f7cc6cd3ef885936c1e82330c3f8d8e63b30fbe79a33b37279b09516178c3305c86186c4381617413e5311adddce19bfb176e5b7944c8e0eab9a7e0ea8fc82b82c3c875deafcba03b579789417af6ce82cc9c4177b28c644d97a989f4e9befabc37cbeaafd1492f1d0a106e434e20c1f911c1d513254f84f0a4b06bf37de9b3d11ed9cd3e387bbde8290ae43ae9e651067c7076487fd467a7f7f493da1ebab68b4843b8fab420767b907ebd91eab33794ceb9ee50e714754e9b81ee507a7343795c57e9a537daa374bb48073d9cea733ada49541e46ade4e154dfd130498c4e22f70fae84ca2cf125bb314d744eee22b84ad24a1e8eea1df470b81f771ddad637f275692c0f8f86eded9b32a0e9f46d7d23f734ceeeca38fa23bb3cd9af5fb789fcb8fe440abdd93ebbee8b2353a473eca579f51daf6950fdb687c63577c1f6d018c6a71bf3703493316e8cb342a87332fd457afd655b28b3cde43acff54ea24fd5c708916c4f63faab61da4c5a0889dc4c80d09392e81cd2eda131e9d9abb79045229de6d030e9bec7437fbdd11ff43a3237bb2f7daaeee23bbacccc297df5292f6a21eee7d4eb4c928ce924aaab8e666683944e673cb33d04a1a79f617d3c9cbd6483945e23847ec72b5987332be3d43696416de392957125d0fa34f3cc3a6c53f38629bd376a4d4d8c1831487798f41660bc6193e9dea83060bc78531e2f5edc1a1f0ebbb8c32e6e7698e6f2907e9148bf1eeb8e2bea5375487748d086a00f4f6d86983eb319e2ec17c5c1dd40a40f6f91d637b207711d78faa63dae93ea61931a1f0e67779887bef48bee5cef249d537af52682be7a2be91cd2ab976c2644a56fb8f48a627a7b9a07e9b7c607be48d74de9537567a54fd547d661e953f5cbba2d7daa6e055749aaefe8ae41cdce0a9387c33161c20457ef240f8763e2e154afaa171549b12c9993054b606702dc889e5082e708366cbdd2b15a6bad4a96275397f701a36a3d8655cebaabdfd1d80f19ef3023d8cdb0622f612fd512f652fd8e57dd2d4ff686b14a2addec834b98cd10631fd58fee8e87b946774a57c8c3a5ef6892cd3e601eecf53bba347a4f63ec2357612a5a1fc9aa54efe824d21d398af4d63959625255ca15d793de48f5b0de7d743123cf2c6c12ebd3c4d7cdd4ad9abebc23579179428a13508af00070238282043f25b8fa7b406fbe995fae8dc9f746f10819821b06d443c8c34d429cdd9b7beb37ccbdf5e0ce58129cdf2176363fdcf86ab7613f4e471f3a0b853cec7ec018591035436cdd9e9b31204cfd092250acd01deb8e627d6a2df7549674afaff3561f0b8241ca83a7afc7e8a9303cf6883c9c0a83a74158c6ba734f85b1f7732bc1d55dd0c3313a0dc2d5e9338b61fa567af6999b49b7de9185986257f609cedb536147bde5e589d5bdcdc7c4f16677783123aec6bb4f096e2fd027b118c2ef0e28083b24d85d6739ea2e261f082eecba2c56b90b6d086aae0f87137a38ef5256d3a30d67a1f2588f383b21ec429d335f31d1395713503a87fabb2bea1cacfa7b75f980d8badff12877449f9438264e893ba2732293ce7157744c3a67fefd81e08a1710ced42352e59b539285ea70aed61f86b3c31933e26ab81b84337521af21a03622274738212122f0bb5ba2731e7e4e88e0779a7c83197135a88bfdb81a114620b1858032d6420f87532284df31234e87bbb1c2eeb9a7c244f075734f85e58f107e413270ebdd1c04c3f2caca29c18cb81af60d4d234c1cb39b005a4aad34269b3149c013b7a1314438d7c7fee1647a636e801f6e4e722005e7131e33032a0bd60e8fb2e41817545878967caf1a83e40a6346b0c598106821a60a561043a60a62c4941193850a62aa4c418c142988799285181f44410c0eb010c3040a626040468c0a9e208604578829e284305a5811068b2ac230a10961b63021cc12c684318298304f8409d30498304a7c0953032f618ae8122609973025d81226082d60ae90054c165480a9020b982e538091e20a9829528021b20226084b00a303258049a20a1823a880694114604c9004303f48f89285295fa670842f4e30c2972f45f83285942f4980e2cb1088f06568085f7850f4c506445f6410e50b114f7c4101942f469e7c0181135eca38275e9ee086bc847142f042850b82172a0e085ea0704d7871c2fdc04b0f9c0fbc08b91e7859e298f0f202c7032f29703bf002e474e0e507b744172b3825ba40c1e5a0cb1887832e5a9c501725b81b742982b3411728ae49971fb824bae4c021d18506ae065d94381a74598163d2e5885bd2050837032e5bc8c0b40397281c618a914b138ce0c225065cac14c1e5084ab8447130e00204f7022e4b38177041c211c125066e082e2c702de012e458c0450897640b16dc0ab648c1a9608b152e055bbc38245bae38146c41823bc1962267822d4270415b76e04ab0a5893bb2e50847822d4338a02d277023d8220267640b1127022d54703f5aae70426801e382d082c501b18396282c57c404a1162258ee072d4e2c17022d4c580e045a6e6039225a666065418b0b2c2c6841625d41cb08ac2db484c0d2224b152c2b64216355218b18ab4c962c1615b254b1a690458a25852c4fac2cb2f8c08a42161c585864616241210b0c2c325954603d210b09ac2bb214b19c408516961554606155410513ac2650b1c56202154bb0c65061044b0c154f5861a868c202b303154a585f6ca840027ac110420861f51e841042f8a2115d86e082822d548c400b153f64d1828a2860a9620a2f57a690220a2b502ce189127e5045092a48446144128640020aa66019c111b0fc60042d8a1005295540e18508530c218a2228889ec42838c61863945515638c3156ef074f2811a1e018638c5156558c31c6583d249e3860ca0e531821a31318420821acde831042085f1cc2c914288871680a044c71c395035c31c0151d576cb852802b39aee0b89273e5c6951aae10e0ca00ae08e08a8d2b35ae04400a1a52d0200500a498418a29248e1451c89314504819a478226390e2071206299490375220215f90c208796d62dbd8dddd1d2bf8e01018428b218410c2ea3d082184f045145c8a11b820c50f33b49011059b2a6abcc498a285284c50c078f2e2072e94a04162c688d2102414542b231859f921d3824601ab627a911716ab8a344245440dc51ec01c3c1312d174938de9e1d041d6251c1163d4c114639431461bef9e20751a5a0211313a269acedb420955a86444417822bb583a4c19da61470e55aaa8826452444248818a30805590c05e151e6055142008c92a4faa0b671bd2c9ac8284480829c0004302e3411420085579e2c0cc2a548882f064a84a9786548a444105e75c3f22a82031f5c9592a3c90d8a332c6499010e0eb47650a95a26959b811010109ce5229834d1766d11dcbb2ae8beebc0bab14c151889e902daf30638545ec6a470282aaaa41b1020b43404105323920d2a972e0aa1a824204b87a2daba82a1b7db23eabaa0ac1105014dde008241013040e2ae06a874a565515c5175c5555553d7982aa02620657ae8041c21644b0824e9583ab6a8808607045450833dc86a290521135d5538a80bb9b52d2fd83127c6142132b18820c1374fa06ee7612650bee04d4e01605083f98845b14a22570b6418461d8acd9210e818ff7d1a9e1813e7b76fa666a3f351be4dbabb43c1a3e351aa746c3c987e34e2d366db01bec3a9b4699e475eb12cb41306cbd7614ea750b088f5523b4950fede3e08b62f667db9deca7bec33e41dcb0c4edd8a79d0ed33928b020f102a21efcc8a0062678e1c10e8260c5139cb4a086865263e4a8f97483fbe4743a4b3700dc745c0fa6c30d424104fc83f0f260b61a3508d61304c3afb2ae07fbc2508b34a94c98ec1c78b3f57cbdbad7af37cf75294abe47f99ca0282a08f6ac9837b5c1f9c212f7daba7b6be3696b831445bdc61c5c988183c3322a69dad4066b62b43073aaa9166912c425ee1a66bb2d9204eed3503156b12640031a16aa500323ae08f3822a64a1d32609eb538e9a4fcf712af205f7696803383c00dcee16a1e2f01b7a24980aa88d1b919013a60b9a5247a9a39ad19acdd7148edaeabbbc5936e72e568b348919c32f579a53f0997abcb54fefd479a84bd34e54771d455953ad34946d8dc69b2376d00539d5b5193a46cf6f18960c58e773e97a7e4159f479e2a6c3e46abce7ae36b8664337a7a3f4f7763a487f874e47acfe6e723aa8bf4ba7a36471365d4e07690098d3116f6b353200f0b36934deab75a19d2c7e1fd9d66ac4672fe0771a037ec766c0ef93067ebf0480dfad46c3e9a86e7335f24d753aa82ba3d578b706b0b8df9b8ebbe0820d2ecc985180193264e490616383c3a6a626a726468c1b315a68a186164c26029860c008a73e6a3359361a5119cdb3532f80ccbfb8b9a92ca33279eb254f51f2d4557dc012522bebb19f2bbb3c234881d453ead7e8a73f469fbfa6bc3ca34f7a8d469f30bb1f9acbc3c6e1c2d11ff38ea85b93fd7a253d3b229824e5a5a48e51574a9931208cf278717979e4e7e70b9b1da6249209c645bdb8652251148c174d64991c59ecc7d5a08fb4e1cbca537b7dc6d6bbb0a5d360ed642b431a4952361bc38c381d9775734f45efc5835dbaab6688a9cdee074b4a2f951f5d6a47bf5e1f76cd54facf4879d0f36497741863e67a7e44707cc9c2c6c95ed92018a43793302325ba53a58d78641d8547d6610cc38e8de47d70367ab50e53a7a853f216c58c5cad1d33e230203c1dd6a84bea1575218d262e73841969b4cb6c35ea48871da0ec60db2709aa0326d0398dfb1b885865279192252a7ac5f968ab5b11370a84c2550eafb1bbe34d7b519f107b000f7cb6280c779f6a3c1bdbb282fadefdf94cef623ed3451b380cb7f71e7cf0518fed14d58f040d4b53b3e99cf8b8816ed75bcce93017254a16b80d553146ca165876ce12ebef581148f071235292059e10626f9f1596535b7cc43e2d2ca7ca43bae4e73acd9258db257d477fc4eb985d62ed5cd6f501a338c0e3467f440c4f498963c4f0d6f4685cbd0709f8e03e75ea309e8a917a104b139ac0d0476d434d4802bbf7298f3ebc8b38b6cec140438c9d0e0c38fce0d332c77cc13915ba1e2c6dc6b01b4939bb7b5edd7366d9977c3f4e797b1a5bf3f2dc88496bf6678698b684ef96ce8803aa74c7b57cf2bae47577c9bb249694d292b7faba3c56f57eb2a7ab9bdb015dd6b16787f5654b797777d75cdfe980b203c2f3108eb05ba3d14836f58a2a3561599665598d59f2147d763eb3f495a5f07c5874f213c6c39c20184ff5eb59fab8dc65c4a22cb5b071a89b836014169d11676486eecccb3a5c5555555dd7b40ef398eff99eeff7e7953e58da20d803a2227c3d5f2905eeb361d46613a6a69c0adf7467c9bba33546d227c56a8cb15a1e388ab156194777745a2fe14715c21fa4c3e9b08e77260af175d4c785a9fb4579ccc737da3075ee1dd439f4ee24bae3a26d7487de1c24cc48ceb9d11b68d444e07892e5c1ee0376148d27d1931a098e23d231fa1ddd479c8ed123cd1d769a9b1b933ac85d7747a463248a5d4a8a393c1c34bf7ed0bb9b7bd03b20f42ebe819c0ef7786b8c0c885a2fca23c25b14088629a5b9b9cec419cb4aca239e6774b3abe23553456b668844229148a4a63d2686247a8a362ced295b9f59eb9595d97c0e627277965eba36ea9514e278ee4e9ed149a33bec245a731b0f470e0fa773b35124711f213d0731519407e93c14088649cfe1e1808d43ad8c74f3556b3d0ddda9365218b30e8f46236747236c5eca5b96b500f7ebf54d7d5caf3daed75fafb7bede4c2f0fabe5515f1f49f5f1f1f5caf94679d06323dbb0b312b3414c78de3ee26abc4ff93ee27404e1e9300bf649622fb030613706bbab8e556c0bbb63f7e383b0dfa133423d8a89d7dd0dbbbbbb6dc3ddddf0f53de5a212b3ddb486edc178dfeb204841aaa9573d1b0f2d051bc8d578a7608cefbd82af620256efbd3e39075f7cd03aba13773cd75e060f6f82d9411dd4417da483700f35501fe9a00e4a32674e85ed622d0731e176c8c3b43304bb2026ec226e22b39d6b25a8b3b50de076275bebd80333e26ad87e6bd78e0161ac6aaf51d1361c9dc580fae4b257e3de1cde71f7a11c64320fed83f1c1166f861bc0efd1ce188554f8f9802b092151123d9c1157039e7ab4f0cf5635ef0e08bb26b0fb6911daf84681402b29261ed61cdd818fd61db6061fdb9b0fbef6e27bf7b15c2432eaf8648f85e58a9b095292b216f6ebb23c7a5c575e192b1f5c517147cf062d25381dceb282dbe5de0c66c37354fd59a76cd56cc67083332ea0e18b47dfbaa33efaead1b7deb7aedca1ee83e3b594e06abc37bbe341e99c9620ed8b65c5b26259b1a8584ab0ac88911204c3803020ec07336205030a334dcfce87d9bebc9b9ff0c13b080f8f61c76ebede0b6818b33cb053a7deb407466ff6536b7c60a74e1dbb0d5f414cb8a5cfe5ba8a921a5fa95a6bad14a8d65abba2e2476f8d836694de51b5c1f4a3cb51d6a68ae9117a841ea147945811a2411488060961cf356b0bebeefa2e59966549694953b53293c964a24784a04fed4a084a6628102562668606d123f4c8cccccc29d00c2562668602512433333334a8813ed34037592fbdc12cf1e8b9ca97666c707de9b294a5a9627a841ea147e81125d5c9140805d1200a4489a04014090da2412653bf24f46a920c1332e1ec9260d8cd0d448f3db75092beb9cebc4f73330dee976ee92e6c6b9c52e3cc58930953ac81e8117a841ea147841eb49c6c49420476eed2d41a4491942954ac60d92244cd265754642a3215995e91a2222953a858c18251207a64092126849660c25df10561f31b1a4e36e8111a048449a84875269bdfd070b2418f5024a7a22229261b1ae8110a642a4a827317998abae859565d84dfe9116c021599ee842e677242f4c8963297a3787275781f6245e9631cc58f843c5951efa2a3111d51cb33df307d36ba9462f4d8e80a7999f5793ac28e55543cd6238a3dcb2ed634cb463767c0277bd3eb8ef565c99b2b2abece5ca50494224f9ac004c08de8c90f6c3663406e3aeb6a634d4a299dfc730fcb999d7c9205960137a22752a41cfd92f496cc4aafa47cb59574cc4aec2552cdb2f7e8f654b87a76b3fbb16c0644a5370886ab79ec6608298fecc333ef75595635d5a6b0884206cf801b511428510299a3a8f42a576ea318754ad1cc00008000f315000030140c0605a3b1348c92bc1f14000e93c04c541dc9624190821888812806611804b200008000000021c41823e301366f3648f4627b20633f5c24de3aa3fce0962b3cccaf203561a7c58bfdfa9a33c9fd9427e8359de523140be686f41493e62afcea7624791b16970c811d12e32a895dbb3b989cde26b3d6503e9e3225a49080660fb0cd0e1ebd6cfc10159a94f1b1b23688fa92c8b6dd9912da2a378d46c1d72ddb8024ff1516608c830187ab45b4b788bdc41f2fd5be2d67d0accaf04702ba0574f62515e0325cfb83f35fbd1db32d2b923da49231644690fa3c06bc0514f955c37029b569b3a7e5a1f9546535a2acfd7c350a248f3671ad075d5af9efbfcfa46546805a3c113df146812926ddc35d0cbef5108e69cbdd7b655ba0baecac7860f787b758ce9577791f16b81a71f725f979cb0ccdbb2d67b16f3d69e1ff5b66546b84fa92204f89d0f5adf88b46445b60dcc59ee0e874aa30e4da0c2d5e8e5f620ae7bc9f9de3071075aba4b03215ad131b45a77a017093fea7fd934e9c6f8409f4e839a98e496e994f35453aaf334959a8ae012f911e618b39fad6630f7d57876cb20f125147f41de1f0efd8fe69d5fc2bdab2206a58ad81475b8b03073bc80866a8889f3a110a9e0a3d2f7c4318f16e3afa77057359cecfef22a1bc8dd1ba2d31de83279a4d554a1c75bbb015429a4d9f6856724a8d05e4be3f83c2cb12fac0a459a011fd366f98a44514f28ddea7614359e0c11268f46ba83c80d52cd5eca50398c75e40175d192b74e7c607bd6f68e79cfed445355a0b7e38d60874c760eb43bbbc5cb001ef2cdd605a823c771146f61f7ea407d715b1f60f7af557a4536387ac0781aef40c711b2636affd2b280e0e529edbe091e23c20bcc56c0763b3c20ddc6ec30980d91e1cfa97baf2612f83d9b89fa477a0deeec5d88b7f04b520b338732b4551050cc346c81d6c0a8c8ee659d2bb143328e653a475995578ae24f7cdbb15f336293998ddc540b5ad3320af46700681bb36cd96c8ddad475b61e385920950a42dc8f1a90238e9e74dbae4c7d19bf1c14e04e74fe78366717b0ee97de6b5844410fa3e65b42853b39f9cab48672071583383337781ec8f76d6fba3b995d9f99ae09f13f89320f6edcd545b3407c743f26fe0077c2eef892ecfcd1db6ca9253c1bae059a575c1cb0acd3ea075bbdfca178ad2bd5ca1be73382582803c8300eed4bba53ee67b61b1d4f475693e8aa68d5548bfc56854f2b6da559021643ad151679ec2cb2eb229304620408a773c24958ae6697ce7db249a1958f2f2c9d1ff580c919bec2fc7415e8154de4c9c403495a674dc9e0ac5a9fcc60b2f712a086aebe9d414b8f3dbc66b4ba68381672ce8f4c375839a46ded4073860e6fac859176ae52d6f9da9248482aa02255aa472de3125337d3a74dcbd718690810d0cb9ddd16e1f748fbb9beca5994721b55041ed4054287793c2046781556d9c31ac43ec2636e650b80dad176ab60670a01db1aacbf3e14bfe575d91ad2fdb93a4324cc13aeb361933f64cb86eaaddfbf67d57cebbc68acf4a1a9dcf024171d339bccabbac97dc91daf1315be3f319017b7f4f6b66c969e97e58eb4fdee71dc31472062081fa8c723d85d668af78d30104f3a1cdf0a0984bb17c7c3544a843052503ee1dab7fc2c479d75e03020bf91e93ea1afca700d7d7ac8728caa5d3e2a043d26603e2fa9ace6f7fe936d47d6ab6f430ad388ba13b3f7e76ab107d7a5a7db271ab41f7ac3ce1348550f3669ce4e1b4b9d5cbc4a5aece59bb2ce47810a59135d4ba303739e0bfcf323a941db8386381acd49f9e3cef5d44665a2531a1d03b862d501799b4dba3148df16139e35b56351cb6a18e65d05d2f4c67b4e8b30130706100b1a220a76074ad6303ce5c93a964c504e1384fa6db40f85e34ca048aca7c4c6ff2e81c3660febfb51e64be314090313840a094a16e1169882e69380ede3485b449b7a1d001b659b70a7f2311f517e15e7e3b3b89aeb5f0c0c14efc2b5d6b897a745fc9b01435249488f61e6037ba761d68fdad136ebbfd796d3bd92738d4edefdfd6ea25b24cba9b5918b5bd22c6275736c448768382a4d4502009b3a82680b769516d77ba1b133f664052f04b4fc66e9c315601c491b6d10f4e59c741c865a51dbf5bc58efef46f2e9ef26789ab5bdf1b8ededa3619351a6697d4570020cbac52981deab8a100e38ac0739b1a04bb2630a3e200e29f3003e3dd513444f79210c9aed1468ff7780b004cbe6de77c302e67707a7395d1a819851b75c5be5e1c6155ccdce22305b0eaa03864c6dc38bf2b99a66f6f584e2d8024e41fb0453dea4acfaed74a1a93dace3154793bffc1ce4bdc0f7d8c91b03dafb7a059415a90a306e4831b39d17f248400477846aad116acd9ebd90236c93048a168773eaeb64961107625b53579de662926fe01d838e61b19fbd69afcc09ae09d7d0a4eb0745cf0dcb33fd2fa834a0e615a70322acc98769069c3203c9e37537baa657fadfd07c5506bf8dd470c857709bc2b7ded047e53dc157be74a366fa778366d32676d5c87e14623351d98f63b29012b60857756d96dcc646f91a6bb593108de678ed510082b0e17ade786d0fb9ce8586dc417b7df0e3559fc58a9a4c0ab1e0c5be0cb73ae9ae698e185f0551139c7fbeff2bf50c4855ff2a0658e9eb1df42691d2ea89c9143f4e641bdc7345a9362f9960f7de43bd9471587083db1cd0f32446fd00098b8f73628dd7d4d436fe6275eaff0b109c11b61f80ce5e637d2c1ec040ff098921ed3498b8e34feb4bdb3e340e0f5d1341fabf63dc2ffcffa92dbed07962843e4c0058a43d433158b1739f0c4646770feb009ff1a5a4b93d9fc4ce030c043b05d2f49969ed7a69dfa53196d7e0e6dc8f0620fe51c480341499d488c1929a14e58111042ba4f283575f64e6d5a6ea9644683b8d773ff46f15125b5a636cdc1688fb287a5b4d1095d9b0969cb3d2b53ccd4b2e9ab99cb6de6e94db4692b9f66c2a4a9126a2ef063b2cba000613007f603ac4781d5c5fa9280997a1ba3e0d9fa30bf3dc95c27d10244b28ecd4a9d9a109dd4f5ddf0e7e0862872e5a6cf98f6627219a483aecc9271b62c6269fed5fe0c5acfa1e023c5833292dfee00656200ed05291fca703fe414810499b87601c4a5011a9459a4fc25d5d8129136b8218be9ae90c5d9f1fa3d60d0391917743d8a94f7cda671cc28cc4d2a375615ca55de6d6f181b402daeca8a0faf96a8f262da4ad4842680fa00c2307719df8840f765551cc75401ef2524e6625e400da3de1cbd3df77ca47b8eb0c0c3c53ff7c26421bc13ab6abae669e37b95872cc90b864157d7e43dec670d338b99d5b92cc08b99473e221f06518db36d541600da7df306302914c00935d07df26487664d844ffdcdd698d4c71303ad8a1d08e35b5b15becb115ba84e76e2240df7d87f699f02219fe492fee8242e2035565283b9f4d0eed9401fc8ace12d99986c95d54498588287a81b090e4e00c0bd9f320d7c61c7ca6e49c3255a0471a18f199c0ecb4b20755a17e29882fda1dac2a9709133bec9649f728531b8f8cc327ae27dd255e4769c9c2d1a5b64a12458cd1b8de78cbc5c3a0845182e08cf2f32ed59314ba5c4f11b2364048c0fe2ae61d4948541a61eb36b427d67adb9d1749e6f20471856de194f7243adbad67b25554396b39dcec1ee90f3726a374548d150bf7b96d563b82f8b2456dd2eee53ea1fdc61116ed2f11bc7158a7d2ae31b02544afb92cba2c94c3ddf5bbf50add5eff595e176f350c50dcdcdc1ec1c78e5d86b92000f8640405682123f249003539748a015e607e789607221ab66d91dc1728ebaf4f8e55a5d37d09db68c35bc1d04a306c9ac2844502c2531fb8ff3f349e0b1cd65c27efd3f53d465d1d4262c38211d76f5aa9afe35b577974ccdcc5a30f3f308ecf270b155e49f0dedba3548c63920472ab301fc0d993c676b255f6071909ea6b370f6458c37db7b573112c5c06ae7c5df2c2dca44d9b6eb99b4d999aabc662d796914badb1370a45b636348ef19930f44a6c97df6062a7c2d40ac4944074373753e7d13868af31167f374fbb8b65f8db5b675120046917c86cf4e1a0f60351ab577ce6631e565cbaa681ee011312587d7e1300d725d23573a7b36809f5e807277f8a39d2ff0d51f597b594929ae8ab442fb086b1fc6b1bdabf995901d79b62ec0858f52c7b0e558865259df3bd5cfe511dac6c50caefd62ba3699f2978686cfa0c97a657cf9498263b6253ce81100af5538a332684e0db7c8ea7646f1bf8b55af2d83f34156b4b7b43c83b4726d926479f4e668e19b1611ed4c08210b320ad4a79a3fc5ce8f1e7259c29b4170ac0ac7cc07f3c5dd6036e204268d7716ceeaca48e1873ec0d0432d020744fe73e2d4ad64bb27177b514db275f96f2622134c7b9dc411a8f9b717388a39733a8af80f2b13c8f63ff5461d67130c421961ae6f416f21d33403d2d4ad196b2a43441120d55ac71904212003a7e483c2c7489df07d57ca732b3e17949762d31f93ec18f5f24b149b7fb3f1cbdbfdc513dc0cd53a403a88629694420369cb30f7fbafdfe13ba2817f07ab75ebbbb4dc484c14d2fe7ca0b7481d9842cb32334993a72bde12a69a297f6c6285f68afb8c5701d35c82f026680c068b6d0d25b103265cec9670c803e2b016405aeea937354d34d60fe6b82cb1078ac058f673aabb0872746ceb686db068f643be325ef7181da00bcfd167c7db0919af5dda39473bd59eea87cc26d1f7f08dae9892b503c617b8f1a88871503e701205a032973ef1628de82991c82814600c72b28a2a771426eab7315db0c428198256b894defd768d4f9349e09c879f176a83eb9ce59cbdf8780421d73970b1a888aae6391071b3c5f1abf1c2033e2ddaea62d94efbf4f46ac97703231809d59e3f55da6c3d4d823584fc04f862988f26bdb498550d0bc25a2a1cda1851369e39c4cc27859fb12d59a658d1e013839ff885eb0230446933bd4c07a06ce54399bb7e06c80fcffdf2efbc49cebc3089e53d16a50f9d0c722d6374351b02cbc6b225fce8eb88e125ba701ca203b01a000b7e5fc4b0ac77b5c47cb37f44f527df82eb9a18a80cbb4bc3ccd3a40e7a54ecbf5700ce17f8ea8eac7e81565d0b069dae3eeaf5c6b9d0982c3f087ae4c108cf0b7475e5437e89124a8a7ab448d064e236adba64799e0b78072658650951a049ae12e9ca129fed9612be9676ce5e06505431fea4a0db10289d63c2c83981557960a30e1719f1487ca2a9aa3a2e02b825a21025c7fa5a6237982f5490584190b0cee001de1bde90cc11112b13d245d79d73d1853e3eb7f30fe06a161bab90185c78fa2a55e5056b3073c65528291e8fdfd7b86b72baf0ff2867cda3b4f2cbbf72bb9f8da70b2dee5c7910c62feab31d7e8496c4923bffd92dd2afa86933fcf9ffef8234a0c7ec7b31322e6773d3d887371ec0e6b9d6f620a1633ab61b91f1c47b212d33e73e3ddca030deac0e9411d266cea0b23b4dc6d36c537358d98905f5256aa38d8052bf840aea4298306a75f60c84a6b03459142140d7539cf740a6b0af82ed77c6150d3f9604f6e3d2c79f081c4be6685250b0317141a94603b0ff41d347884be80f7f4e76c8d0719fc63ed4443a3923e07946a05ed9b8b9f0ab5efcf0d5d329fa20a483fd0885c888f20137c10062e5a738198948a52dd79696d00552d4bf67c9c4fbe17f774134f72d12aff40f4141fcfdc377501924076ff95b18098099267307b05691f6a5c74c7741a597795fcf4ab4da73ce99afc71996ca6d170078ba618ec6de85a83f707fd704d57466b3f28865b6d7ce916ac498556e1756515db0a53e2940997c3f766b3ffcb145ae1086b52193a2a665d5a4ade9643a2ef39873bbe23ac1735169ce446bdc2d1e31a3381419d4f4cf912b8579dd72a673ad23557c9a1cb4140f1812f2cfd6c8d15c774b34344ce211f3223e600b9240945027b49ef38d80ab6216f854ed9c4c86c8e32ccc3f1d5ef2d3bc845a30c7c7efcfb1d4f3323951929621c6ea48f87814d2c22e9808c67aee4ad55656c3bfdd56ba15f7f87419a2018f18eb5d9328b1510bf497b43882df0b19018cfc506299378e21e68e681f2596e9a475312fbb37fe9c8de8036c55815f5de45f0950134b6289675e7804806b92f01b9a82d2aa998ef2a07130b1cc741f7b21b2bffc4ebedb128fbb0521e0dadfa986b13f918870f75b79aebca7f0fa4dac4110794e3135e720118a250d1adf1bedd22417f306a68dafa28a1d948755b06f6d2f9531e0d50744679903dcbaead4a877b38c9edc56e56989ddc5ca2058c646cf53018740752e79b38a4406e81a74b1e41372ad30416fc9c1d570fc6d01e3563e928491e868271d9d9984b0a0932d22998f0ca90e0cb54a4ad679941a782933d07bb29f69423c1feb67d9cff5ecbe6b42f55ee9209d076558a341307d138e5046236ef8354fc30f9a579114aac35682a9859fe14d35834ab9e28fead02b263435019905a0a956426cab50dff5be5e95c60789bc30e2a7504dc019aef24c676719750270217dd57264d33a68aa0fa8aa867ab4eee1153bd5f8b7f73070041e3021510d83e8bb50f3bde69259ef6a94006aa280dd9336086c43ca1fcac4abc3828f9321582c46bbccd0aa5b37008520c1e09219e25ede1203255152adf3ab5c27610c7021f33cfe0430e684a5dd2a7f4a3ab19961fe4091661982206e5a8d19d8c12a7cae170bafbbb09d46853dd3f015e08bb6d58f214c65f4c83e82bc9ee1622295f133524445af1748936c87fde5e58e14496084da5d628d95929a789da80f8733a4516391c68a49b338bb6b62b0b08fe6669bb47d417833ecc778e9edc62770333aaad3a13cbe704ad790fe67d816b58567fddc054021ba86570251a39b0a4a6d1e07f829b103290f81fe209009319952a3e1290914f59cde90016c9b958cc82a8c481e8a6df0b538f91268a6e0c5f4d8d12dc51b3373ca6ba359c6923458c74ec7a2b24ac3ccc0ad788f6a781473a32e5693aab930ccb0560cb31cb59e81c46623f50560ab8dbb991fb1dfabbb35c73e45b5d525dba279c5c5212dcbcdc0d25e0d8026cbec05b23f2bc1c66f3740c56185a53f9b780327744ce0e4aeca2aa483237b5857b3c262d5121402e2a3c71e7c545dfafc1188c5ab107d7836f3c1a3dbdb40b9fce685566111cc41bd19d159caeaae45aa88658043b7ea10022c608844eccd5f2a695e2a2f6c0b4a8523f7db1ab42765a437f748555f21b5bf325230e11c35e768ed13bd0bb0358f508369308187d90aded71fd09dabf92091622686aa69347d834ec4280b6b1b86231a8c33f478e775407d45ba6fab85370d9b7c237bded0b5f578941e2b730f5c6a0a5af28a80e155b587dc2890b4d535e4de559998faeec59c6d7d92a15cca2639ad2497929c4797115db10d8becdf0ab239261be64a363d008e5c61858b58128f8ee1c445ec49bce1886521ca4e874a626902d9ac8b829e6057810f66731cf3a3e967d429610d0d5d332e6bdf0d8cdd4febd887caac86eecf145de319ba892bc9bab5c6257f69da28a5c6aa253f1a919fecefc131f84ffd52e0229ec3855538e7119722817f4bdea95007c0262f5582f4b0ad72a3a0d274ca6741284b635ebc51e10f0e870db1ab1ae727ea4cb4c81b1374b7646968b8ffac42c70623874e19b28c927e317a6b3592b1bab48b2bcee152cfc46107ac9ad376f3ba265e615d6d88252fb2148fbc9f473e6b2d811c1053b16cabb2c44bba7c88915c09848d4ba06c5074df49b6a62e7cde762168ccc5b8ae8d95ba3c40161987a3d60ba128c6324354cb0d2b60f092c0ac4b1a838184ca0ceecdfc76c25408106e2744e3b36d1855256166c360285a9cb8b300c6084584d1de635f07ad53008605fcc69ff94a1f1aed7c008b1f2e8404324455790d2e2e57a97f39e09316d63eeb0a41978270d8726c4bb61a2a51a45f1b814abb605a028ad6110e66b0b7bfc3ac5e6585a3d9f19883a6a7cecca952ce22c447597547591b2c612549885365ff6365c6fa5d2674077790f27f07ed984260eb86ada60065191461e60cd482213a3d9b682d0b76693a74a1030e7e68d2a4d9a1a0127c319a706000240bc6b0705de3cb4d56510f1ed93664816147d711056c785837b84072a094452ad4c6e24f15c04f9056e66789feea4a88c006335211ee7bc7c05117c60fc4c60b50112f554876a8d5e7b16b1e1a4690a781c275353711f42fd38a34bc468408a86d302547125f0e23a8a3971addac4d395b8a8591dd380a97da26ba71158c3ce2a7943362ab824da5280c4fa552cc0bbfd0ee0ceb01ee719d7d20a5a05d10697687a8dfe901b775da26831afb1d8c4523269bd4634842bc3a4d522aa7cc6fd5a40c34d7cb0626e88ebd1494871862ebd09cc43ed59d3d071e4cfcb68220c54d123157d0279709318e09434bf2a540517a6bf83a0ddc47b04ace60b5629c1cbecaaa7d9b91d751c67b60480f02acc8975bdc73ba6977951b7231ee066e5c62b4dc3ff5b936397389a7e5feaec5ddc49d4b849afbaf3ed7264f2ef174dcdf75b89b787289d171ffd6e1dae4c9259e8efbbb0e77134f2e313af6df3a5c9b3cb9c4d3717fd7e16ee2c92546c7fd5b876b932797783aeeef3adc4d3cb9c4e8b87feb706df2e4124fc7fd5d87bb892797181df76f1dae4d9e5ce2e9b8bfeb7037f1e412a3e3feadc3b5c9934b3c1df7771dee269e5c6274dcbf75b836797289a763ffaec3ddc4934b8c8efbb70ed7264f2e715b712bd89e5b29ecb814b1e0aebc2daeca587129d89e5ba9edb81561c1a59c2deeca5a7155c09e4ba9edb8156dc1ad1c5b5cca587157d09eab52ecb8146dc1ad7c5bdccab0e252c09ebb52edb82a62c1a57c5bdccab6e256803d9752ce1e7e06951a1a8d064ad4abb423ffd697fe06dc711caffe1422697826f749deb1cc05259e7bb39fbb587a2e1ff0731d351ff72139b88ee3c5fd582eee07f273390a1fd7a139b88fcb8beb182eee07f2733f2a1f974338b88ecf8bfb985c5c07f0733f2a1ff74339b81cc78bebd85cdc07e4e73a0a1ff74339b81fcf8bcb315c5c07e6e73e4af2d9f48fa2fe08bc148e3b9bdce5cf5b3e33f92ccd0205ca3d59cb30d7f36a53ee21a9c0b97a96cfdc213d4f5c8cfe27dc94de332e4cff0377a4c72b17d1fb991ba5f3c085d37fe44ee978e06274bfe7a6f43c7161fa1fb8333ddeb888feafdc249d272e98fe13774ecf132ea2ff1937a4ef810bd3fbca9de9f1cc85e87ee046e93d72d1741fb8733ade7311bdff58cf4120ea5bc2eff0cbb3c02d1ac0e305062551be845f9e1c1b0db6586de83c5cefa201c5c4a530fdd6a5343e6b9715da9d6e952b942057f3be5b64aafb8fded5c877174b77fdd3ba1af6dda229dd1ffaae06afbb28bdeb4fdbd5dceb164fedfed0e26ae0e72e4ee9fad1763576ba4553bb7ff45d4d5e7771aaeb87de050dfe7744cec08931ae1468ecb47537d4eba5699c8bae592de0df09d6117163ed3c1aff04ac5e59015801fe012f132cf075ab7c501dfe3be0ffef7816b0917858e068784443232047c48f6f9311ec73b856e155003757d5bf1c0dd83ad3ea4017337e0d65299bd92bf7fd98bbbfc32542e7fed5726d70b84453b9fff5dc4d3c2e318afba7ceb581e3129fe6feae7337e1b9c451dc3f75ae0d0e97683af7b78ebb81cf2546e5fed7e55ad61ae53ebd36c03d9002c6d55939cc75bc33e23e490ec8ddb032cc357bbf719b7d43106ce66d03bee18b20d7d2fbf938b75300231576de42f8dffae9c9f4eaa145f9d99f5f4c87f6e24d4a078f3a4e55bf7dbade038d8b0b8e3b67b82b07a88b73a89b3bb49b03b48b0bd29d1bde950bd6c519d2cd19d2cd05eae20075e70e75e50275710fc3cd19223717781707a43b376c26b7cd083675efa4815d7a325de5b3dd65735d65d9eea599eee5b92e65c864fd94e29d0192c1b9f1089b739aa7c3f47f5e247c0099a66ca6f5db98a6bd3402bb29265f653ade8db366b7aedcc4c9699ae4d801005f0b07bfe21fb397b53b7618d2d943d41c412036e93dbd24e3ef0a8a3abf6d89c431930de668ec63a0a7a1cd200182cc02c1620fe650dd3396ff12fd3299f7c0dd3c9591755a7c806cc4f214ef60be7ea4ecbe32117a7966d3a276c79a069db5809efc10cf6d23abe7476488944d6094500690825119f428742bac05011904fc1615ec2f8921ded8a25590090b75e5948bbe5c45b9b45e8e52180a1c87d45d9c5c7dbedb5e1167d2884884547692ee2b6161abe66780eeefdf714dc9828c0393a7fea95dab169250c13a2e0fd06e79cc03c2698ea929c218e1aee8b45c695c94ab08bedf39dbe44ca4944269300e1cb95e8691f51bac257c91fa996686889e935df6da8a72f62603a023207d444efeb8c9a5cedde149b44fddff3f01ee1721f2139a00006cee9d4cd649f2968226b86e429316269a14e60749be0dc93c1609a23633877dd551a3cb5beea028c10643595a0ea5619f70b5fd91722ba6441d0609b8b18476754b3b2a8d115475da34ef4ac1d2e8a379b34debf40f6caf41fb891cc822f88264d0ef823461ac056ed345448f4df9f0b046b1df9b889b96fe7b1c756689bbec8ee2e04931c0d09a41e42e2e1127ee56afa3a40a2f720d237edd16c39e40f429a5f67d0739af5fba25f75d9fa7dc0117a234d4dc57170d88111d26ea8747a0e53e5eee19a6cb9ee7f4d8e786ac7fb06ee4e6202d403b3a4872ef1ed32a8443abfe069ab0c4815e9184f83a41b2c115122c818e63b666f61c540dcc016b47d00ec3b20cc377a0fc12d8875aa60fad005a548c1cfc2fcdbb891bd9d51f3e77a4b05c61b6ed979456a28387d63046c17b9b7af68c190478385ecc98a03ef87ccaa70ea706760cd0aaad639bd3ad84a72476c61d55f9c1c4dca90fb85ce27e012bc257aed8ce865a83c70db48ab87d89cebbaf0274bec4bb6261691314b6fffa36191d58c026ad9f6a18ca230ca3357e87309ebbeeb81e43fcb5756ded0f841282c11901939e5358e1b1fd21f071328296af62b7b8b01fc1351add3dae821074fe753bd4d44043dd9571ed1a4768cb61e180823d238c5550ed754b5bcce11c02028e9b8e19dbdd40071120755dbec29e34e2d905dce90a6a42000c82f255444c95ee3ef50d88e8e8543ec193bbafeeec2dc9cdca0846625261d38a742e8e802eaaf7561df6f0891b207ffe294224108afe819671ab1bbfd278612ed774e572217951e99b90e5cba5e25fbc26b99c72d951cdb2c00ca449bd5cd0f1c0974b8197760e8bfe06bd5cb43890a344a1ea9526560eef8d772e6d3c03d3597cd0d159a186e719443017e01dc086aa8fea1d6912563f7fcc45715bd15f40cd8c62f131b29ac110074dd3fc7da9953adf8b0e4322ae61da2c7987b0e24c8488509f26e696102dba389c5bc6889140493c90786b4d3e9886d63208270f212c6c111b0133c5a7446693dad22d370f6809871e18f67a515a601f86941269ad7db2633e5907d1e6f29906c69c067b576e6217ab7d3ddf8f2e46004a82349b2560e6786a8501ffa83253a851122093eecf904ac28c62e299eda98f02877c5cc76985ea11e680e17d44bb1477c77a430430496643615fb9f35891f4e38398dda1c5ad70e5584605b45e2aed44f50bc8ddfcf1b59ecd1a0577bfa86d2b017c1e56434238f252c3b2481a55faea0adc817e94351d35dfcf3fec02f27b614d4e1466a08093b6805c7e41275630fa31fdb4722d0c4d10b5da6f4c849c3ea30abe0b7e6e589983cc3d52c7236b7a6d25c85d5f8868edfd8f073048dc26680d44ce97ae780b05a104a0a17106572df1e252e770fcf03355839327278a13e8714ff783ae1a13a8e377e9fd0bb55c61bd587ab7fa3a27c6a76b22e8036009d2b0543ae760141f930828972bc7e9d031c68a7f2ad3e282b0ca19efa9fb85865a76ac3b1209edb0c289131d6dd15b244c04c1a1f7d665bebb8d2a0809e21090b29d08ba1671ccfe7c23ecc3dae65f6668e4e45382e788d0ba0640492120a6b65b109b0ab9bf1ac32e23c39305628dc55b9b7295cd2d2cd48e0502dbb2c6b6521097deb920dfeda7f3e97c519df159e1b0f06d90b89e5e0349508ac879deaa0f38c00957c8bcc8d05b6b6db6e08ce0afea79ef095b16f303b5a64c3afa113dba7b0d7dd249debe0ac782786b179d91ae8c49a3bfb2d1674f66119d4316e603060a400f31c600487c3140e3f9954cc61e47f1979e4e59dcd64af4af79780adf91288ef74accf0316caef77b37327805a7dbf6f6672dda57923ceab56169c312918feb0f818db9bdca5fbeb3e8a39499b3eb1ce10907fe9a56dbeea15ddf07ec41bcffbb525be6484f2d03105bdde151cf18830948bae374f0e7ceca3ad973360d77bde952f22f5196be2f1f19e26c8ec342275609ea2cf0337f82e90420e182ca34fb57e116b5f377420b6140d080626005f9b81c15424fc6b0a2616d7839f0848b66244c86448335e38f113e9033f3070a95d2e8978eb432be5559804e2f718405081d747015ae9f687cbdcd06550dea45b4f369b702537afc3e484d12be99152ab15edbae2aaac876ae6c3570aa1c71882e317c8395cb63eddd317ab3e7567b333b4741b77ec4bbce3f613e6feda60bdc72ce3226fc3160370a9e92ab96bfefed7de07d753a01e4f8d68c522795552357a8fe586b7742f218feda114ab2a54572fdb251a8462b30b382f70206a3e542a01ffe8bcc50ee5c202f2eec8c60f00792e80d17a2d57cdb321d0a97621ec9c0762d13290dad9c15b80db6ada7dd55547288e11d87f1348bc8492cf9ccf4a76d1e51e274d5618d2db07684342a63092928210956b7dc289488334eea07d3bdb32aae3a8f0746dc89713ba9c028237d3abf2b0847171695733785e1ff1d506dd701d7091d4cded16c53862d992462a526112edfe5f9a69e74b39407a0285600ab1f81638735abeee524876ad5f235e705fde16d5a8282823174924a546550b3d208cd2a594a28d56219e897f3b16cc4ef8e5ebd264584c0f254f1347823a75d2f99db154440b70b3c4cc4d9d0805080f751dbbdc43d709d3e8347628d525a82f225785dc20051126e44ef92e0547906cb4908309978150cbf112db1205b921bc107acd0b20a4ca3a238997d95fc92b4fc6b46c55f538bd69d5ae7dce31157ef97596d5b16307f722d69f8e5689317f66b240dbad20a34132deb54806362c1a002982494915c6431df7a8def54ff9c1e1c5488340401f307329045e6641f695b29cd95977781588a049ff46aeb1ad4a10e318930082052bd1afe3740bf6cb6ea460538a2f6beca0926b9e9f05e42f2e6ef7a41f26c689cd429cd923d866d923bb62434030042eac01996f18bb140c26ca632755dea9a8daf823488a74e8b29207c45ef44684d0c5cf3ce530499f49c7d851cc8e275842ae864e0fecc0666b4cf49a00aa843e34db3465a8b56fc33098ed6227d37c6720c45215527e0bc73c73615fe375b1aadecb99c070b347391ebac3c07d5c45a35c6d875d08286b2c2bde1cce7cbb3111d1b483d2a8a8571f0c922ca400a98260eeec0e7bb8b43e9a62d059e5caa664d2b2ca42fbb82820c7eca59ab2ae452f2d77e6adafa7a6fc6f5fa29bd51c915072d705ebb90d240bfefec14b49ef4aed117ada9fc10ed8bf3c4aa08116f5a350e254d414e78f9887920823765026019f02379563a02109c5ed01b074d1b4f8116381a71b17c4469eee99af48e2ab5280ccfaf29144074df5f88fb574c9f70624344df2ec0303c06a0017498543f79b82b02fa651bab9970b028955b6d032e5fd913368253b0587fd6d8218e3bac7609f71ce14f2057620380269ab81e6faf3a15e164886bd3ea4e3e1508c196c0b92371b0be7f8669875d0e2bf3414fe4a209c83a0384b8297b058e1563ddc812c92867d618ea547325faea9767eae3f20023daeba0a53f4a2657c601a7be938882b3552da2a2101d06f10d129eea5db0b5443a4a8bb996cd6daca711a369dddb8f22dad0bd158fecd58b98f795fcaff09b4cfe74e2e606bde28872a7c1ff98075613682f5473ba4828080c9b7e42e93c1dce0c83881c0e2325e30a03755de8f55d392ce185a37e41306c54c3d86923957a5350bd6b2851a752b12cfb8e30fdde6dda1660173095e1d9fb8cb82d6846f37b9ba5432d7b45435f305748c1a542eb2d0ca5a18a68f2177020425dbf7188f0edd00e8381a1e2bbc37a4c14e31cacffb233352032366804fc363c89847ea34066155a2ca9437803551044652b7c154f91e8697f72c7d286dffa251351d380a302d5167c400b691d76a1705f97ea30583ca29b026600010ebd460f36c2b11d2c32d7469cf9e4962f325626d856ec3646b85c5ac08ae5d91d017bacb0fa921abaa8e16d54b5824ae6670a96ed4e6f227378e4bb56889433436d66bff95a2d54676cbe2e0a7b29ce6af31371ff0d7dc6c15cd9019b53eb48bb29eaf0a4a8b1899a55dd6c92be0740cc7220403889295ac3b64f1e3065db342b6b05343250a397df1ba8b30e3234704501733ba39fd2c79822ba7eacd1f05420fd8d6f28768321bb7456645407f2c182fed8104477333637a9aaca8c1017d0809a0e8176408610f84ca7eebfae845d837a871484479d0a2c5801da6f4fe87d350547addf60121e52119b727471fb86ac4d11eafae1fef31f7e6cc9b268a4ea5456ce25793fb60034a9f44f85de8a405d18f403f470efa7265dc54c5b64c9e9f8b3db7a9a030659391d42ea0ccaa241623a3b2cc020fe52c4a524b1f8253fa4b6c5a063b59096fd9b6534f2beff3d0cfdd533663da13b3d76fe3f8305a81605384c6d750ec0ab6981e3a5a4d1264c71b8ceb868233bf75f5db32f3e510e1a79b89556fa476400aef9db1b2bf0988e61d0e5da6e4a5fe68399f5d27c9dec04b65a4583d5ec923ca1e3031a422de7fae6a277dcea8a7fa942698f490ccd73253eee11e3a3f55493ab2190b4addb38af299dab06a31c8df227076ca8062a7352664fffa41ed6151bd52b7250cd89723d9c876cb4314c78eb91370fb24e9889b66a3f40bddb2eb70c24802df6d8c65aa102656d4648f6851110cda94c50eaff328310de98287770ef075d0ca018f4f91fea92e28c8b257d8ba45b4e3447703b502aa66a16f83c375077820701b6d36aa3f532eeef75bf78a4973640b4ea48c25653ae67f3645675f51420e107059bf9b83ced6b2f0b705ffeeabb27689b0d105267f9ce0a7c7ccbb6e925b1c228f05e1d66dd8e74f58a911a282cb93362e2db84bdba133c99eb284f1925e899868d800aa045a0ebada8277cd46b65fa014ce43f202e8502d3a07072f09cc08936197acba0594eac4247f72beceb0d53d9c03fbabbf4b56e15b1a8833093c6c17ad24f4ce201ec97b3716745cf6d73f33a384bb9315de26fd16788c9b8936756bf02ae92efd1328e3e7ba238a8b13937bdb5df951c1e19b4e1a8cbac6f33b11eb4785e8a11c086d36aa29c33c19bd78ed7c72d936c2176d1ccb27ff0e47e5183ed520d7cc61b5e70fe4a5dee91dee3904c04dd6011355fd913c221d72f8110bb8b3739e514ba84b3fd0ab445d63e8354a657d0b92588cf4f99df880abe8880bf7ef081e024136b374aaa442eba00b2a05687d2e6272e9d51dc9d403d365be5545589a18f3b34bc3f5ef3066cf24f05cb035d7e556f166e2bebabf2540ce7b2c3e6c4823501586906020c69b547c668dc4c88c6dfad5956fb6d2dd1ba2b1b477a5437e00e21600419d19f0b748299091099c7c04bc07f0d8f1279e72095fec54b6f024321caa1dd27842ff58e881e9a197b8539334551357148031de1d5c109aa70308859a9528307d5301c57961ece6c10a155d66044adb8c0ec8730c03479dad252f939a430b1edc1c2a8a88966da7a7bae14e8791cf4ca1dc8fa08899019e100ca58d1c391846fccbd7812e6d2700e25468e1f14bd0cc624d39e068c8e9f096e894340814d0c95db7c9b51bcb1910175d0f277653d0f76b415257f5626ad22d34e059d0e4e6dfcd9f007cfaa8495747962b947411c256ed49b9acebe1085c64579f49e0ffe14d4f565bf824b494aa225a51d7a71588966e2664dc811e50ee8ae7919bbc2cabbc977f8a3e7589243fa5dc2f1174eb38325375bcad6b384642205a9bfcec03d79d0494ab0059a3a38f12fd7a6690641628f160e2b9249221cd699ec733b787a7d337a8a31a62d324c3c5e10cf84e053c7d0329b598ebf841cadb0c5c2a48bfeaa4fd38cf0a2b0acc954741d7f8f7e4d509ab1103a49a376db82f2e3463ef89c3b9f0315165b8755a18ba96291677524e2d4a1a14a251d98cb79695d3f7bd9163de59afba4289bf02bad7407cd830a8281df37e7e9bbfe9190f6a2e6383dc4273bab3e07879da7999602198848161cb91949707d947ebc12240d3241667d03d2e8a234c51dd67b41c177d6c8f83e621f705b2ae7f4d61c0d9ec75031e78c0aa7a8473c0fb982e04a7045a79ac549eb03a773ddf292d6d6b0cf104206af3073f781acbb55e016bf085c2fc99bca130e9873dcad681ddecd64efc291dddbd6839a504a246b3a27425f8b110f74823aa00f8fa5259e665692b76b3645f23a9d90cfc6d27e73e4361a9a458b38fcd925e277668df429c239eb3a1fabcad446d880360c42bebd7b5abf9868b0748d83e152272e1cf48e17ebb1f0aa7a69d499d15cf76f79e9270df08c7fa6e341c06869984b9f413cc080c04e9b80238939020e3cff1de253654f6833b6919d6f545bc6ea2a19dfbdd020abe224a72e98646806a028cd9668f5303748679cdbe10612d03078528488135e34b79f40168ba80731f7c8517ca4a25f2b7043047084e761c9816b74e0cf111cc159ce6075e2f51c854a2e3c30118e83e1981c0a21517d78404c34e69db5f8c2940304d4308134d0fc16cb4feb8baab9112264837b0b539f33cc9d6b854644f482166c6c98acd185ac9f96c81ef5fe7f0a40429a8b0e827fa4832e7acf1eb1b64a71c16c73582eb4832d5da0e9cf646281608b4eea404eff1050ea693a9ff5c38a4f6e8ac244b9d6c4748d0127281edb628c2d16c085da7c5897fffc1581074b8ab7725411d1dd25b735557c2bdcdf9bd1fe6c8768484d40d54fe868b135fabc9232085df2478e9173ac1a2d7030645b012f7cdbfab542a3ee696dd98e5bb86abfc0d332c958dddcf1df1cd67b73846bec5d0c8073d527c83d4e6691704a42156037d7b82bf3d21d3f0de9420941570e664c2d9931f33f675d60bf3a944a13297ac94e0a942bb0cb30f60b9507770de61c851a56cd97d896641b59de79842f20e7bf6f350736e281dc8249d2e9e5b0454453fffb889438d20e58f426cd3397fa57deee7952377039cbfdde1dbd7eb54de2e5e048ad7be1be2b150cb5453c3756bfaf22f13fe8abbbc02ce7b40f530d63fe6c03099de634a1403623c323c0f9f58e43fc872d722f1f811d89d29c0504d1713b3ffbaf14c1b755289fe42fcd3437b4cc304973c0b5822e1bef14140ff4b822d7d9021b3ed8ef70fc9e713b5cb9469fb56bda3a6695addb31ca61fc5b1151adbceb82e0ceae8421f6916dc18d9a183c1522fc1bd19138135e516a40cbbd473698a017a15358cd65ae4ff244278d4e6dab8f933a332b164779a3e51f3aa7c82432c60bcba67d937581a2713b7d3b88255ee6d16125be587f961494084bf3fdca1be59a144add74372b00906ec080b0769beecbdc7da102062e556a2d81427708af741cbb6ca025e896efd777f04ea3974b857dd473ff64a21fafef8050c9a53bec5dd6a5f19bcfaa0b6bcf213de1462f46aed79e6c6b1fa1d28719a554e49f87c28d7dc07c31868be789c0b9c3f01ed257ccaf9bf158128aac6a0a7e24e0979c799dd428aeedd26d826bc58e71f9e26c14f658f2362ca73124c3fa560a44282a8e989d0cc07c722d8601b1162e0795adc1554c4ace37e9691e86e98b7ec3e1613172fd64bce3e78e2643cb54efe8e21b9ed83486df8ded52b6a301c6aa9680a83532e6ee774f93cea91776e222cf628e887d083674a9caa441a9263cd1085364688b84912631b089fa19511ef9670bcee3fa17c8238590a24014f7251d6ee8f83167994d455f27766657a6387ba32c1c5167484ef57685d2fe0a392e62eea3254b7548c750286c2efd7812a95fa7beffa883266cceae766e197455ded6bda05695e7131907116e226453c6ebd84850b6fd720bc9f075469bf52ad14108b75e26331cefbad181ac07023c37e17ed6ce9bfcac047b080202b6a14410f26ae662777b671c040c1cc9670313e1d431b3432b829569af000dfa214e7276954a4106ae13c8b4a2d134c0d70481c01a80f02d844c202ac13e53fcb9135816e6c659eb9ad15ef859f66eecd9e0a2a89a35c39d6d16d9a79a25deb8f876d0529bad88109622bfd0e873c3e5f38d9e29515b0bffef51fed2233ab078ca9feae99e17be285cefd0e1351d3f2e4fb2f09537c6454df77033bfe6f82a187259a06b5048dd42f83259311bd14b55734b23b23e80e7968967b3c958f788a9e718db0c459a007f9ab2554dfc031d6c31ab6899f1492ec3d3dae35a49b9498d615fa6a59305da3a4823b6019d218586df73354d9fa2b5334d1589f7a5c5432328d40ae9b56ed36f1791269938c8679f7d47203b282cd44d5c2bdb51ecb4d34d6c9cad58d974be871fe4031f7442d11b9803d2051db030a02cc74f1b56205c46a521f573260f6dc0def93793cf0585ff1417bca0e6ac5e41d6e8acacac22c7c4887b6c5041a9645df0852f95b4d7a7144006404f3ef1b696001ca7856893434f6f1e95fa1e4f5162fe32cd46ab7e79d308f2603b3089e35d7212ede782831c1f54041c15f45ae1c6ffe3090569ff080c3eec5c68589da9b1d237c1060bc70d41d1824c357c2a302b548a3c129e50ddb1f7c143eabcc31f48a70451b1d78bf19027f2fdec47434d52a0c88c5306ea700c2590609a00374e735c6033790159c8194f993c899c156b5fcec47237df7a45577fcd040fba447c70efa6bd64b2639a5743fab61fdc0903901879fdc8bf36d6e23eddb28daafd614e26eb34ff0dafc86100ac498dcd8cbd84c141f1774e419b3f7e7b61e455115984786da53faf54195b5ff72b96ca3d670e63cd46cbc404c90ef773c4411696a0499ee19a75aabe2c15362c7a4adcb726708eac68b112d1ac4134d310aa875fb2ce5c4e839ae677a7fd61e25ab5d686235542e2d86e117faa30e5979e86d4b148c5338c0b6a5b00c3c357a1477b05de6a8c83b19f6bd976da56003cd1d41738319a17b4f2e42c3b35a3479a49cd71fc33936a2264e9a4d1e178cdfb561fd6b88de486b239e12a3e3c818db3da8c0306bf0f328a66f88bc0c1566bed1c49c8289521eba9c594d17e200524544bda1e6578afd5b81f4596acc4dddf420aac029fcfa1ea813472d7024ef7374d111463d8931011e7acdccc1eaf8b2933b33f4c5c1a30591d1c495a6ec6008b848ac28a8cf013c36b44009bb55fe8020773779cf147bf388d47e548890f847b42017691128c709549790ca760a1338cd66c1ac927be7522955d366c6cb842a47b21a44fda41b6fd89e53c2aa410e28a87173f4a27a72d35e16263437d440a2cd9d099929c1ba8c2225e7f583bfe8002a5e9dbd91cabf74e8772322565b5f3f04975e00ce9e78871e9da937199102a8934a4baa04be4300f26c37f66498942ed4b33406bac88e67ed63b3ca04f152109709c11cd0a020d5c87fc8a1408414e5f92757573e8420042739036470dc5fce62f18e396d5374d56fa9c31e5ceb366f5770aa8d3f3c94136ce6f70ec8a0043482abfc13c97ad6fe8d0f57b295c8c7f88f74f1c008d957fbcb7f97cae8b6c300ace49b27fd3db7cf2ceae437b58a702f5575cc4c94737ee8c7fda8188264fec32252da19a83f93ce93d21abab6224553e9e704c43ebded499092d95ca63b29b87d5bb862f93edf4316520582d6b82fc4b8370e8d33a8920af317ec07eaa0f2b649db19a3a7469c11b145534021c79f8c87052f945cafe21c84c2f62dc25e7fd2e82685bfceba6eb644e9af4d428283e1d4e351f917a8d10257b1960ef6acb61a295c004d059a24bafafb7db79ddf19838979b81b7a7a7c80ee13a5a4cf2cdbe467607994290933420a27641066691ea14cdd6e442931c3ccd9d083df6ba44a79ddbd066ba6c7a411631396ef40226232ef09fa3a7709c794747bcf99e7b9a7b40a176d5c0707ed8753c06e69d3396e49111378ecaf0843941cd6457794ef18a2e4cec7a32b6f041861c611e1991b6b41cf65945a024340f3348e30713c645d030d0492e0447973626d2040fba4f30efea974f551f0eb86e715999186d70b2a687d5ebef6578c9864b18c5d111862bfa56b209448314a832b43292f0beda6269a34054f7bab9c16318904c381e64a31a450264a47885e3da314ee948334786063805cc77023aeed95e5850da8dd301e5c645ef24ba8602005b403dec0237e845455f9fb4f6271b296a9cf2ac9a1b11887adee02e8fff7d6c17220080ba3b365b27d6c2e55546e4075aca26dcd9d1ef8dbe2a62500dcb6fb2edbde5de524a995292328505d8050c063b6cf770aebf674003fc61455f831705e5f50977dffff47f98d69d03fbde9f06b65bc1ccfcb8c79c6b2f57cae88e3defe84bc7c0dafbac5802112e87de0df81e638c514a39a7945232c7805b059642918dc8dc3d08a38b306eb4d0c57d37a8d40d17721cca17ff6d1de842cb5c11908511d05b471f73901b6acc1d0387dc37008118e485117cee8b977ccc37ffcacd9576d557fd75c90a6ad93fccaa338bd03b42092ff7f830d8f7d687cdb73408af1cf5fb1dd351afaf0f2f8e862ed7adb68be2e8fab8e1f36cc2a9c1eb15469c598ab1fcb0bb3b5e8039ae0073dc1dbd3d766bf6a1d6a6084cc09ba830f42cb56375362cc6e2e2fa0e9a2e8ab92e180ce672380cee2350580c162329ef90a5cbd5632a8fa9ad62fd9b5bf701555812d80e2c095985c49137ccf1c7518cc7700a0f11a7604978f412d88eb9b871149de0141ae6e2e1f02e16cc99f8c7e312b7c33a678510f68cfe306e5605ba9dc780b4ae43ef991ac09c0fcce168e95415ceaf228c30ceca3ce08c23184755c58345b7210f1e5804a112b68ba351ab7017d6f1e71deeb1070d73f0866cf79e5b25e35a25dbe2a84ff8b1b975b46e717479d402cbdfc5d173fb3c4bfc028d802f551cc9a95d48c57f363a99badc2bb8e9c2e9c227dc77d345680ad3d5ee33c2143d4a3d6ab3c0762897411e855362ccde36b7285e727a5c1ae67a684cea939b79ede8793b421af2ddd1d42af6b971fa849f4f7aebfc5eb7b7cee58a31a26217cc71dc823976134ee3f415dd0b7f6b1bfc7f19a22f1cdcda5b66b01d47f1ae353f8a762fe92debfe993dcfce1cfed4b6d0f5cd5dc6183fbac7f6109ccb1faeea43ac25b39d87dfcdd8d688e0eb5b0c184734d6dd1d37f5097ff4e831ba893f5a2d6eb1256a1de431dfb5da7136d63c6c7c1713a754cfef3ffcc4299e6d1b6889df026b7c4fe79d6f1171e3cfbeb4eee55e1fb196eb2b967572c0871df8dd716a2f3773b92ed64ff31f7e6a930b6c474d973f20ae3a65cef9cee8f1c5be301e7ca8de2d533d32048c494ce29426aeef67299ac7888c30b7bfbafb5f7e695dea937ecbfaab8254183f6e4d5c5f43ea7ba0c5a2553db5744888b560db259f311d240f19b683fcea2b104c47f5b2aa2a104c87acdc7f7b91b3bed2ac979a5bf176a95d3ad622ffc25a2aeb3b2ae5b643bcfed71090ad56c2d677b96e15a78962b556dda7b2f4fa38162363894f9abaf40e26dfdd1f8b01c15a3c4a5a925aa7d64a29a52fa3b4d64833fbd1ed8c9452b7957f553db6c3bf921db64410f38db82ee9574c7ec46445e3cbeab1fa4f04dffad3b50e8bb99848d5f9367d3a9ff4bb6f3ee5e654877cef41fe0e98837fdc2aef30acc2b01c23ef5b10fef3af91ea613e8eea93fe765087e5901f44dc46de922028838a9e18630391fe2323375783976af0d65abf563a356c0796437ee731cdbfd2b0cfb4eaad16e2d13a0be2a8db2fa2759ffbe952078332b7b168b34829a5d4d6a7347b9a04cc619b9d6f2ea00a6231c61863e51df49dfec529d6d3b7ac723dc5b28d668f7dc5a34bad42bb141fa31e13d407f9ce6f5537fb91c6f76c1defb8588846eb77ad5b07d2596a37acfa743496226af166f266f166d8d6a73ee9971defb81d115f53ac256fb80a2631d71fb25d976e33e9f6578f25516131be85ec1f7dba2daf364d2dbefc2e35169ce2df924698aa69a88118117c5bea1f11ad8fb1082de0715f18f71521892cdcda8133cc3de63e8eb5bcf7273b2ab7776db452fa746bc2faabc25aa4d58455bdc4e8bf5a5d106ba91b88e5097ec674e0a78fedc0f2ab4965bc14d3319f27c574f0cfad83535e527b54877865bcb52ffa53be7c299fb71da2e5301ce6c6ef25ac7fff1039f8d2a75fbd7daa71f3b05dc3dc0efb86e9233a6435c7b4ee731fdd2e86698649b115111dedba7404c3be6297a45947efd641abc21ef657e84ac1b58353b0a7dfc15aa8a40d03f2b576b22ccb023036048a7991cce9044fa3d168341aa57260421cc322ef6d341a8d46a31149098dcb59200c0cc11828128944229148044f7dc24fad0581feb91324c19bf7e0a9592412894422084ff0044ff0044ff0f468985ccd8292e2507fe212a5d68240ff1c87b242616c0814f3224e0652d07322ca9b488aa2c8452daa71c91ff6afd72accc2a5c6ba72fdde3ba1fa7189625b47afadb32010ddba7fb9751ce75b6f1dcaa55fb5ab63ac0581fe390ea5eb50875ee8dd80c2c2ef3a44ab2c3e7c375aa562791884800aeab3c15298cb6fbb8f6fdd25b2ce1c8371a97cf7ed628ebbdb658eebcacd433fb0f03b0f852e7f063ae7ca67a72cb973ba73ae3b5318527d363acfe9760dcc7508502e12827ca8b9b8e83a0a73cd31d7ef41085538d8a8a7b2d227fd22df75eaf3ef750e73fd3df454ecfb7bcc530179e7978343e12f057b7ffa523aef7fbd94ecfded5389ef21ef5be7e2a27b3d77692841b0f05e39ae0d65a5559ca64f5a64ebe8c7b3d2f9d3e2f63b1430079a036883d4bcaaaa58af96c2f2bde256546af33a4d536a6dd3946efdce4b35d52710082121209d064234fb6e58214034fa4ee0d67de0caf74ee8953918a6c3757f90d594d4e4f55286fd50b174a2f65813201b0bbf03c5f8b1b193d18b66160404c4baa4d6376a1d5489533a28e67a80805c4db21d1d6135d5035b533e1ae7763535bafd20d80f154b4df9a0825173426aaaa66e7ff55c29167b0fd6e2d239b7f31eaca55344e8c29cebdf35167ba8b974cecdb24bf6cd9dffb01f2a96b875507de2838ed6e982b9fe4ceba498ebf7602dd8d64131d7df3d2cfcfac16826ff7a37aeed75ada98e976e4f0d75bb064ec9808b38144e79f43ecce3bfb819e12296274a7ccb808bae33073d277eb18c802f1c435cc029a006941b5e869005099c4062a20c472829e0f2dbff80da8af6313cca0d2b0a789e2f6480e227f000156a1002230a6638021672f822e60b1ed717475c398f02f2052e507ec56a81625750be55ac0dc557e0eefe0526a0a070361e6545012837f0c917527c01c5ed50ea0f280e385c1cec3b4e2084293001072ca861c1e1f25b0b6e2101f779b1049a2a9081095884c10c375f20ddf87cc11c28b4a15f6e3af863fc77e5c38edf37a8448534b022f7fdfb303337b3efa06748e0852e608f5b3bfccf46e73258cb58783bc8444b74b8c5f516d94ec2a6586aed7575f7f538983e89398f14cc791e07b7c85adf49d8772fc09ce72bc09ce7bde871df8d1778dc95fb6ebc10c68d57b34c0b3321b2f53b090b4b5730e77988c39ce7dbc49ca73fdf419c9a6243fe612d209f592b2f68e214be9e27e991ed9a24ba9eae49d7f3edf95e825340def32dc329d87bbe99e094773ddf234ef9bce7db094e1979cf374dedebf37911ad7b11791c5c476c8ccf322d47a6238b913df6d8672197f672adcb75473e9fc7d1f3f3f3f355169f17f930f7d99cb9b985e721d68201e63cffb0a68185eff9ea85e014fb9eaf40abf8d0271ecf9621615fe97670899b7d933a4473bb896ef64d0addec218cb9d986912e945abcbed6a855a621e6a57546dcac937530ec63d615d32a2cda3d665a7f0f9d4b2b5337fdbe1e96bd6bd96318f695e95aa18b8333c65afc31addfad4c1ac45a30acc2085f67925bd45df0add303e3c2a7a292f8ef365ce2be6f99fb9e06167a0c68831012ed3f1bf069632a99052d2cc77cf8b1a38953ac875af59834e5052184d65f15c2ebfa713b0bd62d882c3e64ebd882d082ae75f6be146144fc5761d1d5166fc4ed083dbed55d6582167de7e1b2da65d3b7856f415c5f752e97c7aa02f2cd43657d7c2ae5d7aa233ed643fcb6bec202e6d06f6ddd9d7f57992ec5b01c21df5b10fdd55f2154ca8e9fe8a9d6d6412b7ea4f598e689fd21d20addda5abcb02facb0c8117f52cdbfa3d107d1b2af1af660e9a1a025adad1fbeb45b3ffd8e6e41f4c7a7df5d4ee95b5b773d2bca4dbe3f854c72795b5cebafef542b5a5bdccea5f399e67c723da6b9585bc781972a0bda42a776c58edded3257145962892deca0b9fe2d032bff19d02aaf3eed31d723db3d1cea4ff21eca3071df8381e5fcfde34e0356d88d8779e90734edbd134c07bd1efa81594c4250181975c92464122322f223dfcd9c140ae726468c181dbda07fad0292917a38cce83aa19151abd4b0df7542f58a1f6b2fccaf894623f56ef4cf53abd0c89960e8990a79cf7733c754aaa19184686ac83b3b3a2113d2e73b1352a8139a9185ed464651a3612ba1f1347c7ca9f5ada19184faa4df440a3ee937213dc176429d1dac42d2834ffa496898c322ab24342624279890a8a091f37098f1fdae75214f42d32af1fb41be0b3121999066d4da49b1233d464820cf7636425341ae143be204084deddc431ff0c1748b58a208996e82ed8a90b90e5d3c74fde136e2c4480fe67a64c45cd3d3adbeab3223a33ee966ceedafa1563121d55028e65abf69249a4662ea93fed748487dd26f42f2adb3203536121a26c01713edbd1b2d5e040ded3d6e6e8dba1dc9c8e8eac09784a644424333f9336694685d5f92ada3a185db2f43eb4844b74b31b48ea474fb47b48e24c70405b7ffa375d4a37524a78ec6174c48b7df92d0747ebb4ea82331dd7eac23a932b7bf92d090a0464623a3596a7e6f9678963698f822a3468a88a803ff100b8897b7d1a45172197e37f2b9ccdf7542eec32e7f67f177b4bacbf908f0387e995dfe2872f95b23c08cc7c1ad9371f9df436919d46703a5d65e0b04ea938e560916de6e5077d3ad27a8e15d7937926037006fb772e9658988376e1d882239670d807084cb6341b04e16725d4888a95930333314b06681b2d6a240f605f6c38556630ce007654128141560d492fe774b74b8f079e3fb30c8828229e8a4f38929240aa41393d2f98413534ce18413f22d17c41020a063c377d2b1a37b773f03742fb76f7774efee185d4a23f845b2f74008130309c96cc733e71570a494b1a3ec19a577778c2fa5bb3f7c19b71b57cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc48197b7b3110d6489f52ea70ddb979a808949da5fba3e20b8faf2340129c9a77b7bb1bc0622d130309c96cc73371ec9c9855d58ab5d8acd3b12accaa6aadf5b29d6c3382676b2b6c887fe04eef144176ec14b60a225011b31b8c085460211e4fd6e9dcd84e76638940859dc2763e584b7693bd887d11acc5669d0e9dc27644b096ec66c41ddb1e73737b57b52adac24fb11de6bf6a45f5f7a85f1032bba458cbdc73116f2e1282fd1cfeaec971e91686f0997fdac0b24ba360d7d8396911da45ed22286aed34a9494d9a296b41a04ebb56c6da0f171aea23425dff690394adef469c01fca02c0885bae84c05a13e1b5d8db9fc15b6d792c9743aa1ee44a5264e69e234c9cecb7a0ee4735620141414943ed1615e9418a2146bf1afbe03cdf73e35da5813af4f68ac76434b57d6b4ae780e33712ef3c49938f58a975f14e6a2b0f0b18b53f8e2940bab567565f1abb7c582fa5ae509f9f4018e80f81e00e906df49e501dad1dd2fa94520f4c4102b3708eebeb0d02a6e1d3c823e124f0cb1f29e013ac7cb65c9123bbe7e7907cf8d5fe515ddbd87be1a6b7ac9273ac0b2bb67cce6d601be51cab8bd1cd4fa9cce68b9b81afc7a5a0a0c94a669dad34e39a9d3160dd3479cb630f1e886498cc357f0889d60991487182605068f1418285209872485e907490a480361443006ca4026200c3c2207e7991a755f17576c10c2f7dd28f7dd705f7c90be1bef2b0a517c4008d988cb0fb918029f2ee1b321fe8b8c758d9777a0311ee2f3102a84dc99261bb1964e8a752ceefb69d221bb74df4f93ede894d129ad1917eab301e1098671f91be630a32ebfdc62fa9ccd70ce2a83a76e38aae2f2c71b96259aaacae048ca97a2a18a087e2be7aa32212c6b058bcb7f951853c03b759e756b9ba1b555e74ab11dac65033ee3f2838038c483e580176a1f2c07bcfe445c44a4198a8854d95b79a951953f6c15f18b5a5756e3299bf8c4a8544ec37468341a8d46a3911028290ef527906965e5354a8b5aa6474dd3a4bee998fb7ecae8bdb2b2b2b2b2021fadd965433e53868e2c0d88f4371c0e0a9750a3d168341a8d84585959e1132a95d3301d92d17965656565656505e4738d802444a5729e4824128944a2d168341a8d4642a478c424be611c2e451f8d46a3111422f5522ff5522ff55223312e1925918692ec0d08e74b9c49440364b0d4766846317a515ae55404dcd725c0bf3bc0026e2840010870430002e0ef02f03f80cbdfd590410348c68c8e4e114aeb9555adf3387e4b83c03be1af34073cc87523977fd2b8fc04b8fcf00009b8fc107855f8b07508b81dbd0fcbf16e6ea43e3893a0e4c3c3e16dc03d09b56b33d0dc674518a3db752e771e0e500795405599ffde0918706ec97d376070e23eac077a9b988f836dabcc8d3b768e8dcf2f41109986c0a77b112dbb45c0d11f0ef1f939fa739892f7ef6eefe2a094de8e3eedbcb394dfffb91f8a003ac1767f6dd470f9e113ac5f167810be14f756a1747673370390b048d87f16660a4871fb6f9433c6edbef8146a2956d6efa8159f4618e33ff94f3ef95a6484144a09250ede7c7beeaf0a224c94b972dfd6cda7fe3528854e8464266ac3ed3b7fa93d9e1bb4a1737e0fdda1bb3b74f7f7d3af5642a5ff34fab5c2cd21ecde7b6f7b2f9d2bf8de66e1cfaf53737e3fb7475d3efe44f5e17667efa44fa57af86c10f3e5eb933e790ba27473083ba72e28ac82989919e4400a5ba044281ba0b840c970514351261442a150315ea494f02215938a4961576e1e53e920c682a6943e82d0c4a4d5aa1a64b1428fc5a2a91ede88ce513815981bb29781d239a594527a4b29e937a54054414e297d5851535353535353535353535353535353535353535353535353535353535353535353d55435550d12923e48279df2258c42b20f5a040c9f3384106a113fd2c00a0f3284504a0821a425346cbc665263060d2525252536685c24322e4c7b931a566652030402cd38d14069a041622d25259a2c297949ab50d1f87c44b4af61323232d28911e3470935f9ee541256958df5b1d6fa5169808084686f5263c6147c7864897cf5c7b56d25337e3399a1c5f5e39a828f928ebd4aaeeb47d6b9ba09767e8516be4e474a6a2bed6b589609159c86e6ef867bc9d61531437b6ff3ec47a7a464f3cd496480628c887c3c2120b6936157b52a3ae30ba805b5762e246c37014267a67e753333333373c38d2f242cbd66c90ad46140171256c6cc19a4c0b8ef5fce7dff52f7a11ec84ad12ccd522a66ce20e5456a2a61e1f5028ba99e888949a55262a8cf4697dd5c1bcc85acfc877d9b4cd5c39b474a5939749226a9c6cc6be5a080a5d26c13f4090bbfa394727356187cc2564e85215d7e9e9b95d3276ce55c7e293b766737f7d16044f4a844b54db09d430821430819367c2641d5667c29a594514a1965bb74de6b0c08c8f20364c9816961e94b7806ee61d6f9158f1d57be0301592c068259ac6e209ac5faead7d4dc1d0867b1628c1188c8627d95d7d4a49452022159acaff39ada9c73ce09c464b1b429d322d449d2f0282775438a210853ba523e9d1b7605dbb9e8caaf3020288bf5d57a90dba39c34eb5eba09cb63aefc39b7121dd5cfcf516d26f92fb7fae9a12b7f6efd21c8b92e1ea25d7920e32138e7940f25f53e61ff36b54a7cdf5c3cc4570c2cbca0ba7574824ccc12b7998282a8ebd3ed5ce42176660fb587a890b98f86ee78062b64e131a760f804b99fcb14b7bf38dbe39334c7a37cb38a723e6ac94969a5752836ba1e596e91eefb5aafa7752dbaefaf140a876422e5405b03153483274a7dd86ec57db88fcaa6b2a96c2a9bcaa6b2a96c2a1bf751d95436954d6553d95436958dfba86c2a9bcaa6b2a96c2a1bf751d95436954d6553d9b88fcaa6b2a96c2a1bf751d95436958dfba86c2a9bcac64637c2de9d577f92f85dffe893876cd7a76e1373cd59bf6c09db3469b84e9a5b43a1cb58dcaceeb8dc65a71f2a96109a3ee17752088dc30739937c99670f3ee149c31cd710cde5af214ed9c12afd834ff8b94dcc317326bf47609eb0c1ccd2076866490ab3d4044bdb5fbb3bc98e1612c7744892d0bbd1ef980f24307d3242c35c8f8c02e03f6f76785c7f37a5b8fed3e6a53060921e0e26efaf34ea3ca67398a7d2a73e113d15edfd5de6a96ca9a792f354febdcd60a716d4c62cdd39a360e19d739e18c02933b5c34b9960785c00b699d3a756a900e8d38c3edd2a6386db3fb5803974908036fcb85d2764a2d14095903c364f372be1c084da74bb91ce47cd84546538c5e406c6c8902183a44724a131451b5b0798aea8b40cd96a7ad4a99911000080002316000028140c894462a1248cf53cfa0114800d7c924870509a89235110a3280883304821620c2000006008014368066811848b3710962a7456151ee41eb72616af81f51a61b936e75bd911a4f5f26cc6905ae8420b22417df489ab6e479c42ed5975dd4d54f1f99096a5db4da76ee2a762ee6f898552119584cc4cc514919c8d3d9e0284418838e36d09aa30ecc6e71c40aeb29d8d377f31e0c3dd4c52302876a291ad675b375bf4259c1ad60d8001c09c52a08977bd455e7328ed82a952658709b894722c445b6c4b8d0675a2144d33409dc2c015adb48d3a138075086f5ead0820b8e288500ba00e21d383091d0b7a436906c6393d9443a400f2c7169f7c0c6bd4b8431f680f0733b265ba1630a9fc2c8d8f08899096b644cbdbfc6443ff6f955305a070a1a5f5805ea5af338e4a04d48b8088ab87666f59abba299be8b8accfdd9803296f5612ce505bd2f90c4ed43a0270350056f563b7de39dc3356138ca1b5c164a84b2b30c77d5b3465e02c86f9c4557e096c1cddc505711460b8284fbf501061cfaec38ee97586340f91c29ef649037dcca2688641876886b8e0489e417ebac76ba04f00823b26003d7dbf84932158960bb55f8de9b34a91d6a793eda5d788f02984c3428530ee1a311617a2b4539c11b1827ee83bf081801e414b52c76de260a6cd4554c2f40fd4391cf7767602a953dd1725e348c81537c1dfd1b244c4845b2d82bbbb7f6e29a3667e8152be33e8c4ab1c8ddc9953f39fe6456f4684a2f31fb1fe78674e9fafdce369141d60482a010018d5b781a2c6616d0af4c04833441124d2f884f29595dbcc25c975505b6f0982b981b404e92f8c2e6f6cf42dd0e90d8ecb453f88cf6542b4d990f56bd71b577e37c00292edd125f3cff53f37ba744088560de5cf9ad4362aa4a15e6daca44bbbee18313669ad00820f54013198b9069ad13eb13f007e94eb6573bf09c7aa76f4fd26ba754aa203fc4d54aefae4b24bd3812857b275c1f003484c91b581d245eb50cfe9e951aae9822d9dba7b8810b1ab8d9fc1507e1c22d47f9965318360a266d91d1e41c972c93a8ebba2e20eb0c0bdc748b08ddead51950e7054a6208858fdc0639bc955baed7e99841eb7710e28fcc31aa2388a0cf4c45f5a7e141b8e1c701256daa95702a22822e744bbbae8eff4fa8df2230fc70191346bcbb78df1df282ea57e2bc50006c8cd141104b0b3219b488c2dcb787750100048a195f4381fc6f51c90a076bf15440836484147841cf1062845db1b51e151a873a006a83654966b1930f9d8e42952014943d788c2f2876947cb2dfe066f044375534686dc5d5f4f838259c9f3333fc3a077fe01caa3e1611f5ddb561463e7d5e3ea26151723705ec54cbc8f38226ba0c0a0c1fc35c45b7dd02d6213527dd91a2c1f58b8cabf72c15d4da006e8d0f50025cb5769494abf2b540b6e808b0001c8d63429fc8f8eed443b61712922d78f5013369620b371c4d5421ac5d6dff6325b202cd6daa047c7606cf5d816d2ae05d6186b91aa3b7817b2e606c5e7b04619be07ac151d1dc32060b4802bed35c6c7c42f1a54ad0ed8014d60500c52cfa77d473604cd398bf3e21105484541d78236acfc696a566dc94471b1c6d8298e266b74e9960f1948cbd25da077e7d987754f8fb7fc845008fa94426b9c115103114c9b851b82ef74e86117940bba75f14bf82e6ad230338f772f6d96c3af34acb4b883ea2047358d79d6376384d59929b594c2a4f7eb95753276e4247014184ab423b5cd2c79ea0e218893b528e90f9b529ffc3188c483362245933d2befa3dd8ec8ecd7ba6a4e095a886492ad52d21f3f072c5e5f7bcf547b07bb9e8aa422b5652e12b52ad3d427a56d2d31322be3aafe18b9c91785991901e8c9d3f92955d889545a5499dd21dace4815d39c30fdc02d2497463d3df8699ac7f732d79c46a62c59f23a1c1702f08c7839207193c51921e996916b88e26fe360209290690379b81d2311a7450864cc4537024ee5639635c2815dca37f36a25730bb9b98ad5203dc64e5ac11d1ac942a2d2da333c3067fa6966b03ca298e1525c1f1516711beb8302fb646cc04f2d522eadfedad5d0f2136b8c777efa0d036c8df484563a7484e51cee3d77cc527c7023d4d1b522a0eb960f7007df08d55e2337e145179a4057bc3287f4085d3aef042862bd46d463e422bc85a0df3a1ea15ea755023b2595a7deab4574122a37c0f014274cb0e3393cf0388a266cbe68d89fa1f89f881d5e5c87940d356c0da33c6411bb04f350cf2c735ab316db3fa6c24b03974eb1359c80842bd18e28b1bf56c64e6577861eebe59a98f9e6c66cf5a1012c31bfcbba58c4818a551d550cec96d822109ed858ffe85d48773d5c6e8fbdac9239b389176727cd1d3b2e648edec2f210a40b640b65b9184af62250da99ea5872db0fb96c0bf864bfe43e3c4a83c2a7fae1d9111287c53ada8d18135d1807e27d33f8bd9ec80f6f4bf9779abe840de5fc48b4e1ff2825e136f5496d03a6444515e3deb295d14e0f3e1744db513a1d8c87728f7426256a4f2206d0f9fb7d3f6aac629cf3b5509a7d7715e7717a9a6cf08d80562b95b7addb999d38122a6fb2a3f6bea26de04bd9776daef54aa851c2fd7e2543e3fef95670dd61829a44c577fcb50c247a65972579b2bfae1fea4b990c93b85665cfc38a54d7c4db8dd0bd9b1a81746e8ecbb6c2f7b5a32804883b0fc6e87a78df2aad076bcb58e3cdecbe806b1d07fca667dcaa44983088a807918893d933f9253048ae19a0ad7bdb407c276a99825214269d3e7e2cbbc3187dd73657f4926b484b6cdbd9162002a96ac2a24d800d7c1498f8f32da06dd055901f292a259c843d7b594bfd0e066d2c8ba4ddbd9946f9bf5da649920b04fefa23e65279e2ef198a2fc3d07df13ad1c9513ad18389c94770d1e3623bd766f3a24d276fc73aea289cd609a1d7307384874ebfb08ee0fcf3db277f7574813237111f06e509d983153bb2f37d1a4327255803d278955aab6152c195754bd0524d31dd6459ff422960fb703f750c764b4a55d849d6eb95c1da62eff6456692b81ddd1d46636bd980be402128a265259319139617df303cc52729adcc8e84f90cbd43f88bfae3cae31f9fa04ea0f5254059f40c85c3f8e2cf1b58e04d4c86c62a6ab13dc803dc1d21dfd62397882e22fe3e76881edc97dabfd9d4efc7745accd9dcd4fb0908a54d8f104aa2dacc2cc0ca559cc64355379356e62545e863a2ee6fb9ff5a3270c444dc76da06735f2548240a10f29f7b1b87732f925d0ebc88d03cdbab324ef35a96f645d2aa7952c2365f8afcdcded72a0584a844c765f88d92c307582cd05304f1b39d8c84f67c5da7c8ad9b6abfda2bcef0408fa812c5b201c079673f5f769606c511f3f896d32e313e9b5d9b57f7e568068f56f0751a873eb83c256b57a5fdb35f973c2b30a488520afbaf2dc51a2c4dfe51e6afe1d6736324a4757f9429fdce59292f8d136b4f953d7abd2389f64eb96882a59ff5f7ee036b09b70f33114e4678b3648071514cdd89b00fd748a1abf12b360bd72bd31ce788e63132598a600fd1aa8d18c11f2a456ae209113784888a14206842dbf08e01227e64fce3060c245d8d6be410dd4a98a2f2341c12441b5c39b115e731e31577ffc83328ee445101026d5496cb014da5a877db046283c9e994277f5691038145fa10dc9ce0a560d5acc5af723bcdb846df1b3e31fcd45f41ce8fe17202e1c32941b5f99a0f9ce383588b3a9721f3809be7e04f16b78ee7e633b4ce912fe0fb141fa5a46ac7ac30187a05062b34326ae408e508b3327ccda2d8622f2754affe7854ab97e218101fdea9ae6ce834d18720ab5d8e34bf1f874ec8df247d1bf38d6d7c1e2522486ced42b40535eeaeb17645da787744956dd2cece0a176f4b523dca8cbcf5a960dc03d971dd8b708e07eb5ba9a32320297d3a9b602e84c9d0c84ebc22842573ec356f95b817419788688bd29464258fe72deda2c17b0a204e6e7a1e98c36add63d49bbfe6dc767586634d01b700b57e5e91954f06ecb51966f5b3b0240f5aa20b51cbcfa8e7dfd00f4010720aeaf4c4e34702b514d411a889a49c816b9a6a2331ac31156157e7ccf18cf3c185439221c907c290a719c9b029e1b56e3415dd27b04e4a83437429e456f863226c419360b989f05a10555185768f1f0c52251f531b2eb2e0232f7776b731cbe9617f9cceb7acb1facfa7b2ec0a6455fb3bcde200cb9f16bd0de30a43d6d8686b5f118fb4b69734a6732d73d2b69fb9f8360834acac0b9aa5efca1f16b6e37dc36bae874899d3ea0c86b010547e63c31ab7f8c71370902ad51eca08fd43ee6931e73b496251a2d96e867bc69c514785ff4ab9fb6fbe42a42560ab944a63f5999a0b6811a144015ff643efa4ea7bed1e24b77385319b95c0d98987fedf4a7b45d37982c234ec0f4cbd9485517eb9242eaa37a6b3f0559649a7d1f466444294e18299c0bcd4d06f02bfd03279e0f0842fd3c123b14e24bc5832645971875bc93482197eceb07d898d1dc2c2f2d91630d9261cf80aa97d1aeec74a3d7c44b46a15327b2e711f58a168f00a230ab2d02800aa8506501fe2c2aa452f99d5e22e1c51fac251309885d5013af2031443a201321c455194f150680b5834e7481cf1526912e30df30ae1101120872306de51490f5587aa4ef4673b7c47e1a17718b211dd6e9cdf57d6cdf3c5c97378e1a828c2dcd31ea229f71d73f990fd023f14005d989e1673cc27f00f995ab6e4430d1523be39a6d2ff8af1196e96e77c92bb042d588c4b7302445e50b418dd8841129f1f7031961c8d31beeba52c5e8589e35c99ad476d18dc8f7052f5f812b6491f1be6b2d167181315f59861dee69c9c3a7843bd93cf3113d5ee9bc55e24f5644f25f6fc9ccaa9a6f4a067b6d72cf693bca53d8c98439def3d3de5ee9ac71e24f7642f26a6e1e5c1404de941cf6caf59ec3d7708f11b877ae72c8e912696a33afd7ad8c98e559cc1875986f6a1aa8a71ce4031173ca92cf3612b7b2c47011c41e8f9c7a1ab62431437a1b9a8f187c973b31a255b90d503be7244e966c5a7025ca969914aa0dc53c3b0d0c701c3abf7736d5c86d871e558f1e63bc8498bd44d377ab7d46d32a0d5ceafadaa1325dc0b28363c9cae05655638617805d19bfdc98027c9fd1804df743ac3b4b62859cf44fe90bd8fd4580d0c73196c31e831505d86cbbc13bf7e37e12e548269b483dc082033dba8f8eec5f8b56d4ab82b2d06599d027cf8c544076e64b94e88d71b17eb00d2280214951f9cab4a06a612dc7c162c7ba46e140e3be5ffe9a7f458429e9c847fc25ab64e57b7093d197d1fe389721d2bed11a8ad82615c965510bf1dc350f8e9b70193d498ef322efccba7551221ca18f0ade7ee57810e0a04d68e4707170417b4050f1b30c00d1f72b8955dc2f1f3f06c1ea25b0f797cdc8cf4c9799826981d041225db7de8a5307738b54bb36b003509bc1984e520edec5f888be5aac7172bc7ddc12e7ce55f9fc32a1fad9c4a0702fd7dc8a4c8234afd6f3597fcef27ab9101dafe016311650a6927f77a654696dfa9efa2cf444d523c076d030e7a0b7eb3731081efe12098e00b840e41e53f58a597496b188e88483be165e8637df707b035414471a058e85f1436282b4dbb9c8c974a79d03ffcfca84505c82cd01db53b0397dc81a3bbae755fd63c0c1ce6af775fadc6be94204981b3742526623d2062affbc4e421e33e4a6190910449deea5d2cb153868ce27f21ce0d4f8ba9b19d4d270496b24173bc5e8c4973a68b7ebcb471fa232c1561532131eb9615a8a0185c4f17e6f18ba5a856b187ff69193fdac664aa970a2830413b23dd5890ee3c5cbd0abd00c7a3215c02cc9735f8f2307c083a25c0aeca04daed1c24639fd1eb479239f37361521a35f4e9d1c0a437b8fc08a5104dc10b0fc5d0831997050f145f6172988a45ec663313b485de82631e0b04d3a846515e9097ee054741f652d80bcadbf75f8fd73e91d64c69230b4201c995e6b7d14665a48fd062adf73b933f948d64c254b3a04fe8ea033677b5de5fa43d6cd564c11cef2d826d2d669e1604c9aea602620d8c4d31be28a2484ea2b8a71c53f0fd787daf3bc4c3971311d83fb100e577a708b141dec08f1ab7aa1cce2f986180bb5f802ed102a5dfbc215274dab00ab1ad7fecec71b60fbb58112d5e221de34cb148596a65e8065bdf0a42c6842b846ee6577d542fdec87f671bb14f12bdf3416a74ad0e3dc045e343d759836b44f6b63ff6c2543145a4a003a4a4ba600bcb11dbf73c508d2c06f2a2edc0f72376db88e0863f21f9f40038bd6e801411718a48af61632ef9fc93bcb394eb779273565cfd0b93d3486f86b32ed705dd917a34b7974e03dd66745f6a8b60351192375eb797669946fe1162d5e1fd2cb8434a949ac7642c0c80e2f36be8ae940795d8a4d567813285d302a1d366817e1c76e6873f85a8975ae804390b8d7659a86a6be25910f82f619b047e53a82847ac8a6228858441e393e571d0a9af2fab06362dfa357fd3a2bf6e7f30da848ec426e001ef2639b765ec6cfc62caa75c09fdc6e329c9663461f279d7cd72dc92bdc3743cfb8898146a121e7d98b834b11b60ae85862794151a483c68d543d4620d7b62c0ee98440a042488584a8836942e14e6f5adee02badb974790ae760d1e674bf7a05a565f1cc8462cf54291b943ba1311e9b8784a575fa22aa18c1244131195f5bdb004073a36d7da391213c1c712bc106e4594f6bdaa01bc47d032024ee8d0541f974fa67e484d807aa1d3df8bcbf7ded3ebce9724240b81c29fc01db7d04c9da12c03a68ca94cbca24146b7b24f7210f40beaccabc87947d4d21709638104940c78d87f3bf9f58332a0b92f2114377302451044b14a32e380a1b199d674e72cccd02392871a3de1debdacf12287445cef70e0fc054af3df7fd9681593097e0e70fbc6ec8d3d2a08adf461594b0a3c0d317fe7131463866fb9c52828c368d66e5fa027c8488a0a0286436882e89ba0c95b37c7f24929b49a040186d92a243913a4c757fca5b5d49d2dc6e65f3188584bea5c880692a01b97fe53a5decad4e45ba7a8a510e4eb12f40e82d36176029cd0a5697f1e5f2cf922e304acd74d79e05747be65331f40a5114737c5214a22d0fd5f3e80fb95c4fb32e88875f348ff869a5e544acbb740073e6cc17596a91640cc87509fc42590e6f5939031deadc5fb03cf8d269f8b3aa0bdb18e60a59b9ea094cb5dcf8d2dd5876e0874ba6b02b4baa581eea01b43dd37e626b8eaa209e88b57eed01e819bee4d084da497117b46dc8457a1e859c323eaeb5ab7d18d4b51b8c3051fa25fb2f3533551703e01dee14ed3bf161cc04d16738257a048010ed686938a2e8a3b7605ccabfb31a183fdf2a331fd4a957fbb165229f6f901f2be4272dc717bffe1b6d3e2fafc076a21d18336da761bff0ae4c1b4aa4cf93faf4ece6b1005fbbb3fd058c4eaef563d0f5497ae5efee69a3fc77f91eeec44837b02e19ac403efc86011f848753d07b980115d7c0ace123775f86d6082bcc09db01b5a24eedf25593f94e9d4505375f10e51f9e8fadd950b6115b07165662f974fb7f10f7f0bb3db89fc3c9895560f18c8f573461e8285919f3cb223f52085e4af08d07266278ae6c683c6a1fa06e9077f7ad86fe244de6f5101fc7935f2e7946725f85f7b1818f5b25aa5fc8502a8433c9e0f52216fac7015157558737859a899745995356d47957dd9d583101abd4d5e87cb20075484133f24c95f14b3666d75f053c110552a297f40b97eb94de27d66a31e58e25ff9cb399a2f9af8e371980ea590e22f72a55c332480e1eafddcba12afa1f8e154c44beffaa5ac7e1d8ad17a540c6582d04fdb0e5e6217f28249d82623edbc735f6de189e2bf73779eb006bacc9c3edc2bd5659b3d50bfba9fd65be10fdb4f710023fa0eb4ed270a1326eb4f30c16677822eea35bcd3bf5c5acc0a944464528a951a8c8a2843360a2840c8a20693e9df1dad98575ab78ad6281be32fa672eae261a76ac6f017a5e2078001dec4c4c0da7810c97cc7421e181b32b5b7ad974c4c90014379ac59f2feb81603810bb6bbbce51074d1c40d98aa53de0dca0fb121b83ba23d1881efce6cb31cf7fc5379c4f4eefca13b4fb488244790a38f858ef74619f14f469b1f2b24007f8879a187e2e72ce0933c1ddb1dc4da29a930aed51d5aaf1ffee4af83025d64a3953d2e06fe64bb77ff72eaf56731ca40594ba4697c2aec8ec60178f9dfb52c1f814713e66fdacc0c08f4ab889f5b873689ba073c52db92804831a4281daf51ab9e8e56dc26adf59cc52bc9fe5958e70fa2af8ebd5595dda715ac525177ee5b31cf2f198b2baef62bc5e74a6994a240dbf60cdfe03fed21840d9a36f749fdb70219982e0d82caf6fbf506f6a06ee6a8865518612d92ac22f7239a8a82360f8e0a6f94e46754444fecb24cfa9faa19ec9ac40239bf883793eadda8d274e57a7a51f03bd58c6bc5b24fa21160680e2045ac4ee4d02af770d697a4838e9100b8e42b0af3669254d1feed3f2f4268b7c32dc3ca891b325eb2eb4dc9ce34e5a88fa70ba25291430d55d6a4bba0cc87b8119cf210a04eba0a3b7d9577e53b9a488ddb307f1ec4f63b7cb908413978bf4710a2253fc958861e06c79a627365f86a1bea6de56a990733a667a0537108ac6455aa6cb9be01e9e11354e510340175675e6312831b3a87a954324ea7d808a94cf63e934f4ec062689049d554b61cb9483756648346eac32e85df11cab530242e54147580a8e67e9588cf1423969f1d5c3566c764f6f0d10c4a8f8bf5ca3072b7bed238dc71ec5a809b6f6cd12cabee7904c29f8501e013666052d70a92a67974274aa8d6effd1acc413ab2d138da691ff832919af638a22663c36646b6fee02f4a6691b2a36bba8dc08e21073aa0aa0ec02ba1c49f767cb0b62d50616f71e7512c7bc817c673ffeeb93c15f092b05f27d4ea74e613b3dfe12660b75055413d09845070044d3fa208671023a2d20b08cd31dcc6d01d0b198f348c76f4e03ace5ab80aa53e06ecc2d273ca237744325895e87dcc008b4581343fe731bc0d5296509951e0be221b5df38d4b95ebe4c60ddd4a99aa57e1510bf469b53c6fa10ef667a3050992d9fa91cecc3db620a9186c9159e348dffa9b2b62eaba97c737961eb934b8de7f0596f83954ab91b9cfd85c9d447d0c5d423b69f2255893ee5f418082e6310cabfe4a5f27c46cc43555223d464347ef6f71083a55f15b7d6f3daabf662b9b9e1f64ef1beb38d053465bc5d93bf45bd16f5342c801f623a8e0e35315675d5e77bf44dfb7d14a369401500330da4b8f2352c1f632a41103b41f18bc2330e27f282c0cf8a3e4cb5269658023ac27a20a1de4fec8284d7b065816b309b05cf734d3035e35b3a831ff8a8f834bcc49655e1f51557d26bd5cc14ae934e69044d4ca388727a10e53b0d80c861c566478f83252d5d678fe01cf8f987e13a025039501b8bc63d8aa84a5aa13a56fd2b3950b86275e38fcf65d1aa4078bebbd48ee95da0a2c8d5d09f80a27087ac88c75e2f2fbde114a400200f73a223a78c5cfc02eaf24dc7c71a073398926ab39167c74732432de55bea95f63a85253d2b65dd6a9ef970fd04007413bca6f47b6e4df9645d826ce36828665c403b0ac3e8584bc4f774facb5ba8f918891214fa87d64e3ceb725efecd271eb8376dab8ff1d51769c56d4efcd5142032055ddb18a6cfe14e1bb6d0bf161e8f5c236013c28ba85a7ede1271793e217c543ef03c12d0ee0421fbf75f444b33e5730bd7dad8c2ae180a8983a50325779fc3285b62c11d408ceb2533f4fed775bc0972c8a0b73df75a12b092a448f7a7de081db2f1121d92ccafff959bf5f7876eb1e0bd9832b68e61cf1639971c7a83bc66e1e5f67ac39e68e72638d8e3582954e497a11dae6ca856984450c0c4215c721d1d26be28c668ca93b8a028ea8c3c8a4f25fe93a46b8a881c2f86e0af4e4334a649616942d6621e2321654a9c15e63a992ecd18d6d4a20df6ddfee0a712d3c4fde4c6b7c2544ebd21170c5c67fe9cef501f83c020a3401c5420185730165624095c1cbe451bfc67dccea5dfd0bc2cade0edfbd9dcf02054e663a8f0305f60325d9473cba5f82f14f7ddbb6bc3c81277adeb148002531202a4febae8ce6264f88ab91b224d25764c970db5d214c903ba4015d4608424c3705f497cd6fe3da7b6c7fb27def83d9c9bc0f69b36abcec4d70d49e043edaf7ffa05dfa0fed52ffe001f0a0947a6d53d7dcb194b48f0d6f33dbfc0e8daabd1a9a198ddb5af36a2c2e66aab1db5ae82f7fdbe4546311662ebbde6a594548d3290572b1dd11ad2de5222fc0ed6ccec4a5fb1951cfecae96fcceb5e3476cea64da68424ad31afcbe2810c02810875120885120a46b11750df5c4716da92b0369ee0ebb7ac73a581e64b00598d839db94952a773904c895287688c823758cc6f3256a2bb1b4a91252b3daf9e080127e7dbd9d5577dda3e8ffed60fe75c3ea5836578959e64bd603b26e1600a016fdc135f01cdad4f074e73905789412e625e1bb09f92daf09bb1d57c08db803eeb5bfcdac1b74154464ad585bc3ecf92d8f19ad65ca2c50714ce77c6425074774a25e544459a25a234ab7d5e8599bd2cd4f56686c314fc0f9713f9d7f7168de79d12ec5b6f928146d8201301e82a3830c8e47f68bd3c5ec9ff50fccbbbeb6b79b971d5214d3b5cb7edeb1567810213a44402e6da93d46267596f81a126a8dee5e62b05350d17a64b6ff21550785b24099a4e20452fe402a6fd8627211fd13c600db763e43ccfc99b79aa619de642774ce352f3c755387acb0298a9d5dde2f8ad7a2ec5aa1248296104e53323b3c62d5930b21787d888b9535deaa1fa283e7d04b9dd0354bd0e1027ad180d2335511726e30e3a68a586daca671b2fc2db65c45ad2ef64cc2c6303279cd90c16766f6987e4baf7091341f24e646c752f5361992601e3be111f0f581fba2ceada20d3c18d3d142c0a256ca2e64e5fb119e1dcc3620ef17108c00111288be640dcfdab23c7ef2ae9fe727b5b18ef9039bad5c4b8fe64e1198a6f208192896723c97e06a44a81cce94f278f30654db53d9de82d23c26033a0b75a6318adb6ecc12e852a219e3c8494ce8977e40921c0b55b40584f8d0f070cd3c2c57ddacf9f89dda6e45ae4b62eae3e304f4de2ac7972d45162b59e37d6a4e79d4ef725b768a2cae646cd4a5f9c9786556b3f8aecab94ea9cd7dad82de8d16c1ea2121a88201c7cc96df3000830f365f6937d137509034e400f1c3805744cf9b6c32f1b9225e0611ac28acd5108c7eff4cb9c2a2abae1c33063c4f7495f6e74c0649a666f81b89055b7d267202b1ff4476963ad8221806d4a495cf84aa1f11a1ac156a035bd9f2cad54084d71c70317902dc48662b0b50f946785f8af1b96e42f9470f6ebfa9d90a745186730648c95d66053be6248bc5d795a4bd76ace804da8e37e30e1b764d1fb2a00be0b3b902db92bdaba544bca542773cfe30ce7f5b3cdd9e918105c305054a268773e6b48e282627daee0f02f236461267cc93d5455072921d20c517eaee7c2a66abbd2865bbbfc036f70e20a885ad475c4fb5391ced218721352b78a2727fc49658b7a51888a004448a1451fbcb70071d719682f04462194e01e088753c621b8d3a9dcd75267a93443afea4a9de2dc1cc7027f313a0d9996ca958371f950a266e70cdc5c68f37a677112ff1da181e5644403c76b3396e4fa872f8e4fe5a3249c6f1b20aeb1ff7cc9abe905b1b34704300d048348cab493adb8800cea21057e06c3d4523b6a4b70610b4ff64b7857fc2d58497ef33c6ba6260cbc65a57dd010bf3287845aa1d696924e49c94827a5ea405b5c517187f530ee4e7e7cee1da1946f2eff30c723e892dc1fdb364ccaf52abe5d80ba03d909ab424a51aa525e8e22be5ad111b57166c2022afaad74947f4a97807d935b06fa3f87972d2828223ac2958c140a020ce534df1fcd4bf3d988d33f0b03c79d6bfae58413b9f09d82cbcdb41e747f7bf128e2b6a4f9b43266853bc1e8505188f81a6f6998cf10b39c70c8b47d829d769450a623f19be9fe59fd80e26a2fb2da52eb08ef881054a17eecbaca07a4975b906fd64c9c38b73d1fad8b3887fac8fb9fb55c965ed18c25d87fd0d7eaff8a44d2bd0bdffbf256c4891229073bb74dccd4c5492273dbf26819c38cdf7dc4526ca55f4c708a2c3f32592830efad9ebdc328158025f246c1324123a6738ba7e821d5ac8f4e6fef34dec0cb62602ddeb9f2b94346aa81a02268f15a76586ee61bbb297f56ae94e43abadba4cfe383a13285d17e44870ea5ffab50ece8bc250941b3c07ee9c2292b646a6113d8077b7aa64890109dfa1c73d07759e5434e6ecdda84a6206264982c9e561b9d791176a16eb03fec61e6d1c4a3b23589a31da2b89e07bcd02f3d61b40b039423f7ed843533a87a7966f007573d98c4e437f3abae3606d9efa0a5d54c31a4a19c868947987830f3d2fadce46e908732f3652733a120cbd14da38b5cc7167935cf056785fad42e6beb6a66d70d4666019a74486e0a83278d91810dfa8ba51416e1339244e998fcc846c97812c76ac4b253e3c2799e8e9e79f7c8392d35fdae0941b645cf002918fb9cf8fcd680615bf33d134aeee87f5bd55272edb24070cfe08f1f5f4d782ecfbdabf2ecdadfd9a51333158462e28722380ff7795af19e31291a706454cdffa82c1525331f5871e90f2059d74995d12b532c620bd805aac5111a5d1db4428297a47a89360b97c686561372b73466c426bd3a06d9ac4d2233bd7e356aea208e2a63f25f91caacf346c0729ef9149b97bc302603ba1cd347484f9c1a7f7aaa1bfdf390257bfb3a11abe487a43e863a297670a48bf86be2d6ea7c86c86e0315a53a6a788a4d7ac98128457f65a00804036c7f69688733c2f14f88144ae1fe530839799dce13ba4a80fc1e7cd01d453e9b52bf32cc298a66e4020477ebe8adab7b1080c01ddf7e97dedace79f4e9d67d929f8bc2701d0556212c114291ae08da691afe861e8c5f9f3aa168826ff908cf60dbc5511f80df7d57db33cd64a9ab9497d912bf2fcb765e1118f15737ee0c9855a9de3080745ab531449868b07a15e58e846c09f1e5d375a004223ed37fc1bcd8485d98223711d1f881ade3a271074bf6e74aaa5146600acc6d202370b70b9679cc6ca3ad380e184c456168ff698b2e26f054944b913b19cb4c53682ebba02f56c1d921db36134756df46ef3ecb2c7c1d4478c10b862904382cd287584629032ab6b03eb7e0c1ea363427402a3999e8c6411921bf51bc9b77d71948a4d7a5ec13face7774510f62b2e347908512440acc9e89a6f6a3cb851cb74ccf0e6bf35a83a90a9d245185242fbacc3546a85e2de93c8aa3ffe1bf0007959a162c96aef9bc4e1aef4fec506951ef8f5f3f0df5d5d3e44be992f689fea3e5fb4c47c6c71f19e071d5f99d7933916825c31949caa925ad26e559511a4d83c9a6483cba6c509a6dd4c72b012f7aedb26abc2da719fd9363e43ceecb7b74b9ae1098bd6e3baf1cf0d39d1a0e784796c45337566a6518bc35ca7b23e1256fb82858718a63c0da031fe071b43db522b82ad0a4e84086a1df696f646b4646b45cb6cb5d27f95a0bf1f304cd5bacf44c3af0def085e06f64d36afa06a0e34f92a9830b562bbf2349dea1aeeaefbae0f1934c64388dd5aaf4436fd015661efa61517e46a301d76ab6cadf663306787f14ee41b21389263af5384e10cd1bb0801ded645585892537aa143ad10f6ca8a61f425c0747208528c5d82831e72c9af166238bd4b7f41dd07fe90feeadacb825ec78e327a95ad36179465e724e215e09a2fb68e341d463bc3c511ff8bd5259a431aa41dcbddff60e6e9b249a6d0c663949fb318a235973bd9599b7267fa60849d3d08412ffacf2d78308836cc5bae3b4ebfb85043567d03de381f698f5bba1d6d49ed544a287fbb451f822510b1067e6647746920cc2833884fa5a8fa5ea0b3fe50558123e51982a2c74a0c93053a0272eb53b639bb75f879f57c5c6f015db176ba10fc7cff9708fb7257d14be775a74d496b39e736d88025d187f796a446117a67b0393941349c044f4674214b564cfe205d574c0846828a29f902665652819877467dff5a51ff1d038e45848a0c7ec53e238ff8473dec3615a811cf2110f0453354a502a85e77bb62de13bf3f025afad4127070190f2c7770dc226f81d571323ab893e91c4ba2d7033fff1055002d09c415ffc5cbff2fcc96b6ad6f418ca9dcb923581d7d855f7e4f1bc8b88441df15a003f81a0af75a7454cbc48f8a1b313a85e2d8ad8d2358eb4532699a9fcf609a767d6498ecc4b0c983b985a54a99da8d45075626c9f523bd4ae602aa6019bef1853291df871b33816be70eff5a553e335bf867ea077470270d827e03ba78579da9a9f2de7cf5052c3a661db7eb6d05e6ad7e07ce6c447c4f13c7a53285d31a23be889fa8e105838d1848104a0997f266378f8660b0445d4182e068ac54324702d1cfbec562d4386b43c5857e0fd934d8fdd17645d6019e0a0d5a67fbcba56b64dd5fa95861510d78b83cd2da80405cc048dc237b92df2124e3fe9ade01fc3b889c34142c8e9c1d1e64b4efc0fe0c65df76c96368d04f1928eeadd3e7f2886ff86aeb8dd045d816d5e29ad8ec6269439dfb7d720da3e284ed9369eb9a7d0ef14e76ff8a2704041fd63f5d417950ccd066038f80688a2f12dee909853084880769cbcb129b408f3ae6bfcd2c95fc0ee33236350caa9c9915f43579e508eb757fb3b79b75d0f6bfc2194f23f18e7b2419f1d72b88bba5990d0d1aa38cafdb329ec25754f6b187207986be073a988082adf01084968bee840e7f31663bdfa33971571b73d77e386785a723076e6be750d067aa19b9d9c1c2bcc93be54e62716e8661207086ddeac8b6f728bc0e25fb6eedafc53f180883e949c555fe961ef4de50ee9b18ca90b5b112812dca2a24ca25bf8ee3de70e254a8d2315ea7480f511c64bd1ebb2b3868fd86b1e2294a25bb2824670103048e36e548c978c49d923f49b4bc02e824d1419cd89d2ad95c579839b38d9f974e444f45c2b9f2e61887189387d30059986d41f96d57775d381178c0464d396753cbdb7267db01312339e88539105bc8646b01085babf256c169d0b3eb80a01e7ca4244fa4e91e362b0416084be67c34d79438df21f202607ea79a65c423d5a37086690fc62abb6344fe84f4c0896d7d3d824b7d6390550ce5820e30c81bdb5aff4da182c1c983ab4d0576ebc18a83908d6d82487b44c0d01446173455415f299c21a908cd1f354539b62ad6dc15fb82341ef60c150f36551b0da2805f01a30b5fdc639a9e18e3ce36ffcc48e460207255987ddc3ac7fec0a0994d807f79b0ca9ba0f8819675c859355bd3442e55ead092e8ec456b9b4f77827373ca99389178734ed6fa9ff196d865175c316c004b73f3c4759cceb8e2eace7dbab92901056973f3e9ec1aa54534f06e229efbc49bdef16d980162f01180196ad6ab323c78ede33e8da726b15f26b2798748c4de8104175024950a1fe581a00eccacea6d28261639ec65e91a08d8eb2961512a63dd206de12f9c6714524952cfac23e8668701f11dc841102e8f4f9b5dc2a5dbc1e084e26dddbbd3ada4489a8184e2c0319e78a8e72114faaaf2a65481f6399ad33ba8db08c5589c37705764a289d405e40e67d47d4d32c7f4a82ae9eb0ac9e19abc952af6a0bdef0a2075256406c3159ca995d13ac3fbba3595c659a5870afc969906ca98676ea1206866625e4684bb2faf75ef103612907305a4139f9425d0cd402331fff79ac812e2395e9ba618d1506580b87af933270a2f833acfcf4ec8da4e65cc0240e125368bb451aba6468308a9f2839d7f8eb7aed006cad1467415dc0d1a87703a2467a7563447e722bd135a96703a52eff9854e906a80f0aa78b30b0d334863263c3964ab14871e1bfdb3f5d7138f653a80960c30c4cf80b2c08015b35f1bdb926a227b0c165f97c0c68df1843606f35c9bc72f04b3e002da238d07bbfd92157c497cf24bf458a06187e90bce63a4d6b049576fc37b8ceb315097a5203d2d0d99bf764d3183480a59ee0aec09f931f6357920230c8e42ad32f02683b2d67e6b9979d0baa4816d4255ba862d41500abdf1adbed7f677572f6bf5ece55a21ff5adb50e5d95158b6090dbd868b9d6b49c0b15cb70497ebb04032e518e6bb73ba658aa7569829e715295116bd5670020cb6ef930355ed4115ad9781d7996d1eab77806229f1c83a034118698f549cb44f247158d07a1fca6fae178a48bea65663d77081fd143c965016a9298edfd825915af9df42bea3b19f0e8b7bda08fceb57af546f485dbb8fc36c88ac20f194231677b75e0f3b5496076c9129b340ab4185cca6ebdcb1f0c31733fe36d3ca881e8e65e9206cdfaa4bd055ff37aa91c068ecd26616b78757ed80fb260c520629d43160195bf6f0a39caa643880c04e128678418cd63f4d034031ef5f235f3fb63106ce59530b5af23cde86af9947f6fdd92a30518df029997443d6006766fb5493493f6cdf3d547a29b87b798866332cf0a8bbc18000bcda4896026a0c841a10477d2175bbcd4dccd7b816dad06518caac80844a712ff475867acf8f1e63063bac88f1f4249ab6485e3bad38e882c186837ec06825776376b587ce33a6835c6ef204cf1684d7da1afcd9ef4d9e7f26df4871c58fa6762c26123df5bbed1c801a5815fd90b49d1af9775ecd4110244c5e7ba6ae5c9dd84b79a663c577671474648fda7642a2f4e73daaaeb298339684988571447ab9529a8b0a0f80dbd5ae71054612e51f9d77645960473e0ab5d7114550e2bc3e707699571f3e42f6ebe8ef39cd98f37c03f8433afc1857dac1d7c9989f4404fe5aca0a262ca266086d81f0bb40db89ac17f9fbc88a2b94c08ae16703bd00925f66050f1e5910d72e185ddad632d014115dd87aed95097001b5677478604b9d7554fba407535e3efa6001f4a22d093216b9a1515767ceea4a2bf0758002922d4a3e340b9082388ee5234ba6203e7709b8c0818f6159924bec2987642388ddeac766ded2ed9afb580bdd08a85cdf2a6a29b4d60329f022cc091d4e1c97bb105320a89b9479a5fdbbff716e0b893d8c1cd9a46e3fd66e3218dd0617564e2f14580e6e6a902cf58ec9f13052ee930275bc016316a92257830a4f814c4f9e0898e6bc68e60a3d4e22cf4180b625ab1513102dbaef0e0fc259ad1b591af2c4654aa0c52988c3d0ce937db83ae1fd72c3ac44d24ed611cdbd98f2896bc61049d89a160163401d0d4935c7297274ec3b2f5224cd7d64c96cb3e9e8caee28d5c9c59221e9f8058c762f46edab747cefc56ef4b87027add3b7b37609c9d1d5f62f548eac4813c159347451f80b2fdd68a560b3c43ce21d7e3989df1a3c95f8b282e28f0462e4a2c4519365ca74d4afde470d0589487e72bc703ff43d6482ce4291418b7f3b99de86a267d6f064e28a0800478ff1d5c747af47e1098b874bbdccdbf42e3036809986132138cd0dd12bc4b277582890d9d04d24156a460f70f78e25b8f9a1e46d35550cbd48fb67f9f08c23cbf5b20f1b2c7457dc254801bfb1a52e6f4ff7924057768833b4af6756523379e58f32a5f1958b5ca19207541cb07cf06ecac8a4fe8bd7c05cfe2815c73c0e8a845da3e72d90c3bb0fcc99733ba00168617695c1fe016e0018afe8f95d77363800c2d9a873244409f4611d4c35b9b4d455be674ea17b29bc9735abd81754c743bd00655ddaefe7707c38c086ef73cf91a1cbd6c5daacdfd5c40e1580ffe35789daf2553879a7714cd0352e96d0b6375f9506ff9f74ca60a107ce163d0eb7d354a4106ebad057cf41f838001710d64b25450b48aa1c3344671c6fc99a8b1f44a8abe7ddd0d0865aef8052fa02c23528f7e61b4e0ea1a4c6c5766fea96840bc226943b7ca22b4137651ab78adb8c1b10d446ad8a157676cf3afbb2a9a14879e0da53278883b840ab266d7af2e4f85410fe14e2d0d721abc4767cd7766c28f20408983aeb753254c016ba472af3dc5f1a15a064e282f19553d0d0652f5582b3660588d2a6100a92d6a011470c662730ec5f2d805bcab19a2a09f8a0f3c843d82896abb31151f05a77c3b24a1d08806e0240090074de42c97510642d78d510db0694f89b9e975f7989f3360104f3ffc3e5eec49cee26c56c8e417f9381ab271fbda8cb4570f6775808ffb69e71caff85e7f88fed07566c4096c5351a529935af60fa0a8ebf55fa29c03da360f86b04c612662d1e0428eb05c684e8abfa8218733b6db53c1cf1d4ca5073a967d264a84af0d86bd497f7990448d09ea54ca0ffbd75373817c15b8135fc5bbbd216d3b3d793e59d984671ef23c593736464c0766243fd97bbc1c6be37ba1d748a68187cbfc75026a2647109fee9a31172021b8081241dfcf3beb659d8ed3fbace18b3e1c3e7fcc350bd99e181d1957113140a5d1ddf530b72e0006e9c485e61677822295006e18e759e323ff9c1ba99c034877f801becfd25df2ce933dcfa419fb55fa52f826867cffd2e8cece4eca93bc37673c1b4c5b572e2198f418c30dcc717b37bacbf46031887105a86c0a92763bea9f14384650fe01b8ed20b7315384aabd85c9f44405a53c4a03c6746c9d4d24199d802e68f8cc015b4c0cb9bba8b9b507954890c96dceda36cff86ac2a4e1be7a7ac5831f3fa87c054e56743d0abb36c66379a2791ddd300006fd7d0906f31768af684e4d3847438e4962196403a8ba213ea70b185746d6e7438e47488456b6e920c6fb005cb598b16100a2c775895a0c1772d2503c203bba2bf2c104d6819151a6cc268020636d976a0b0ff47ee182ccb10109f2901b414bc9bf5ae1ea1b02916070f9cc33ed7e0655c70b6cbb6fdd3b59272d5f914b2b0af16b14e81ca000844680853f36efa85eff7fc12a1e19a2f3df5f44b0e408701d0ceb597f52e1793c6fee7d6f79d714410685908507a1d3bf2341e63dca0ec94c29c82c6d96a625661479d9294db6614480729c68789c2cc00fd091129a60f696ab809bb144fab63f1040c15f94457fded49acebeab04543c231e711beb850dcd8342855c7b0f10266e9b5c5196e492ccff54feb8de122d813d32c16e54793ee8fe1ae94760f03abd794947bb1575cc2b6e7eb144f8d9e8dfd45daf8bf9e4e7411f3c2c6654f0301495434f2f9555b77f19f1d5bcac431753d1778c7377ab211d447469d851c08258c561fbd8813625bfc30b8afec73fc02658f24e9014f989fe29bd1bb8f952fc9d16e6ebd5efea41825242245d4965fdeb821f4751c5641e59fe7efd6fd5d9f4e8450d2a84050ff897320679f5145471edcf320e5cc40ea03c87189128672bd0807978482cd7d40a657d6e18101a0ac4c71c69041e5005e30b5eb469f3a4792cfe49136b2a400b2b292be29f768d32bf77cedd69b5b042757ab832bfc7e8ba04942aaf530e201711a2dc395cf80ca136762e3372062bf2097ef666663a19ce1e5f4865ded6ab09ee59479d606a5ce497cdf0c43577c8cccdc3bca745d189c85b68f096fad2d731833c86659d000441e029ff35d781f08c805849e3fd2f932d9d5ee6cd531a9c9743490c77753e57f95cfe0bb29e46939dc5ddb1056e9b49784e2df07ccc985168df1a9b22144991e7530a8d0bcf7b5f1d5789c58ecf925fa6ab079bfe44f0d43f9ba5add2cafdfbc2f568fe9282eca7187a1adb000dbf838dc12ffc52313fbfdb2156e5bb2f10f9573b2048cfc03aae743c6531040ec28e95411d84cb6cb145d7ec15a1381aca571f068f1daf366fabba08de0b5d70712f0fff8cbe529e3812c1a7078901236f9e26d3f18e64db986caa6661bf6124fde8bffc5ffa4354248238410b2f79632a70c540c580c48903cca098772c2097fa2e44e94283913ca7c0485c7a866519816857b8d86b6ed30688371496513956f18285e0ce5d8d6b6c91a6a1c8907008d47e251a0b753426f8ebddc956ecae0a8768f764751ee20f5fe51d455147c8a7ecfa1aa8734f51d9a731d1a9e87ee7c4575ee4379de4357ff417dcea23def2468d1db8822f116fd7120947521b4f52014c8875021df800639a5437ebac139a0f495fe1d500efe43eb3fa01ddc03faf317fde02eeac143a0af83405d07a2219c0805e14528d045a0443e022df2202ac24ba0239c041af423b4841ba1247c881eb910357213e8d089a8d09350138e8412fd049ae44a2892a3404f781380b6d1bb00b493781fd126c05b09da05782f41fbe8cd046d25de48b4977837419b89b7016823bd0f40bb89b713b40df07e82f601de08a0edc41b0ada4fbcc7d046c03b0ada50bc13407bcc5b01b4a3784b413b01ef29682be0bd00da52bc19407b8a3719da0b7853419b01ef06d026f376006d2ade55d06ec0db0ada0e783f807615ef2b685bf14ea2fd807719da57bc21403be91d01da65de12a00d813716b423f09e006d09bcb3a08dc55b89f604de5ad0cee24d01da4aef0ad0d6e2bd056d0abccdd0aec0db02b4b7787341dbccfb0c6d0bbcbba0cdc5fb02b4cfbc3140bb8bb717b42ff0fe823606de19a0edc53b0cda5f3ca32103c56f948586b20d43e3917831341e99f26ddb39dadda3dc51d4fb287815fd9ea2aa90e6e8d01d9efbd0d57ba8cf7fd09eb3e88fb728eb4068eb42289007a1423e8406f90674c829dde0a7f41cd0bf520ede01adffa11dfc03fa730fe8077f510feea2af87405d07818670200ac28950a017a1442e022df211a8080fa223bc041a741268093f4249b8117ae443d4c885e8d04da04227a2263c09253a129ae427502457424f380a54c96114854b0afb122a2f868689b2fd4b5b56c651cad445c2aea26b93763ee12c33d0f6c9447802bd3f90d04b93d0fb22a277047a4d10a297d30cd1cb6518a197dd1ca197d920815e8ea3047ab98e207af98e11e8e53d44a0b79328426f374184de8e0288dea6a24c08f4b6162e7abb8b17bd1d8607f4769a0fe8ed327ee86d371dd0db6c547a3b8e3a4e6fdf41e9ed3d36a037263184ded844107a631442e88d5400a1379669d11bb5b0f4c62ee88d61d8cbdd98c687de5886bddc8d6e78e88d6c587a631c96de5887bd9c8d77d8cbc53dece5ae4cc25eeeca26ece5a2a0c2ca32f672576a612f776517615c99c65e8ece2542b60dc6197c62eda624e1341814e41390ae0af3f88e61611ecf1df10b1ef1abca61d81146fcf218f1ebf383614614f12ba488df2194614580f9ed00ccef072f868121e2178888df2223308c88217e8f0cf13b6402c38618c0ef0903f845c1326c006bbefc329b280cfb728610bf8c46158609a186975f5e2306867979a3cb2fc37103c3bac811c42fd3e103c3826881007ed98e2e0c13401e40fcb21e45300c881f7e998f1fcec17e5082cb6f33d104c3b83cb1e5b7a18882615ba6b8bfcd002a1876adf0e1b7af28c3301fb0d0f2db5968c1302d667af86d2eba60580f5ff0f0db6084c1301e38b0c36f8f01db618d0ebfcda60c86e970460ebf8d861b86e5a0060ebfbd061b0cc3e18d1b7e1b8e381876831c597e9b8e3a1896a50501f86d3bee605800f2b0e1b7f5e83d1866031f35fc761f4930ac062568f88d4c34c1301a9e98e137421105c366984286dfc8002a1826831531fcc62bca302c062cb0fcc62cb46018163330fc462eba60180c5f5cf98d6084c1b02b1c78e1378e9186612facb1f21bd994c1302b67b8f01bd170c33017d468e137aec106c35a78a3ca6f84230e86559183ca6fa4a30e865169010bbfd18e3b18c6421e2bfc463de21e0c5b818f29bfb18f2418364509157e25134d304c8527a4fc4a28a26098942952f8950ca08261295811e5575e51866151b080f22bb3d0826150cc3cf9955c74c1b0275f38f9956084c130271c60f22bc748c330266b62bf924d190c8b9dd1e457a2e186614d7e02d2d55082141403c0af5cc3b2c13000bc7b67a0deb0bfa897e5bdbda8f78d817a5de0fb02f5067517f512f5997a79a9b9a8979972de16a8979bc2b7997af9cdce7b8b7a198ecebb02f5b213cf9b02f5f2d3eaad45bd1ca795ea6da39e7716f536d28ff704eaed31ac3716f53699d65b02f57612907704ea6d25216f08d4db6782bccbd4db6886bc93eaeda50dde57d4db4cf4fd807abba9ada8b7df70f0aea2de8653df0ea8b79d3a7837a0de7efa7953516fc7f9e04da6de68e4c19b01f546a4d77b01f5c631aef714f5463221bca5a8372681f05640bd5109e89d807ae31922ef28ea8d688abcc7d41b97447843516f641ae18d807a6353d0fb897ae39b12de4ed41be190f03e40bdd1e9c8db00f5c62723ef26ea8d7186de48f54a23a13713f54a2413de4bd42bc710bd95a8579249f23eaa5726217917a05ea974c29b00f5ca334ade49d42bd1a0f036aa572ec15e54af6442a25ed904006a9f51ed4d28001ea34dce84c6ee8432f913eae450e89347a1509e028d72293485ab40a57c0a55e12bd0296781ae702a948557a154de02ad7217680bb7425df80bd4caafd0170e03bd722c1486c740b15c061ac367a0329c063ac36ba034dc065ac303406d78161a80df40b31c077ac373a0385c079ac377a03a9c07bac37ba03c5c0bede13e502dbfd4876fa1f75ce896ff40b91c08fac305408178105400ef4283b817dae542502fff4285f800e8970f41077022e810074389781114cc8da045fc086ac4c5d023241c9982f930b4a57dcb6cbff9485fcc8f10a3023bdb0f7323c2f8f0e4d8fe112fe28821427ed8be110763c4071d50db2fe244145104e865fb603e0498a12323d83e111f0011289c6082ed0ff12f43301b5e33800b31004683cfe0326cffcbbd7ce135580d7663fb42bc8b100c07bfc16cd8be9707e185e96039380edbef720174613bb8055c87ed07712082603d380fbec3f605f01f04c07d301fbc87ed03712e4030a14412b6ffc3b7fc00c5134dd83e975f2e0c98220adbdf721fb65c6105155a6e165894b17d1fde830f5c98d1c2f6b59c072d607cd185edf7f01d7a18830361d83e0fd78107366bd2d8fe0ecf610734ce28c3f675380e3aaca1861bdbcfe137e400c71b6cd83e0ecf82031d72c461fb373c0037d8d1823a6c3fcb6dc8a2471e77d87e005e4300ba8fe6a3f7b07d1b4e830d4c289184edd7f0196a80e289266c9f86cb400303a688c2f667780c335c610515b62fc3b1c8900516656c3f86c310031766b4b07d2cbf82058c2fbab07d18fe020c6370200cdbbf722b57d8ac4963fb2fdc8517d038a30cdbb7f216acaca1861bdb77e1555c80e30d366cbf855369810e39e2b0fd2a67a18a1d2da8c3f6a97c052a7ae47187edb3f0292cc43e221f710fdb5fe12aacc0841249d8fe944b9902c5134dd8be0a4f4105064c1185ed4b79142957584185eda770282964814519db8ff22751b830a385ed43b91328607cd185ed3f3993276370200cdb77f29813366bd2d83e93376182c61965d87eec00a02dedb135d47063fbf6688930c63cc295709470e51b47ae64a355998160b4a51d76d94701c664fb4a942cd9fe094a90203963fb499028d93e115192ed9b4044c6f68584c6d8fe909044b27d2346a491ed1f3112c7f64920e1c9f64b20c1c9f68382e0d8fe08416f6c5f04119a6cbf88084cb64f84c892ed03114163fb208070c6f6430041c9f65dae24db7fb9c8d8be071e8cb1fd0f3c8848b6fff3138d6cbf839f38b65feb93ed73509d6cff8763fbf46f6c7f830d9a6c7fc80641822cd9be9020686c1f089033b6df02a264fb2cd67fb07a7a7c7a56ab36b27d9e551cdbd7d179b2fd1d1d27db0fc39c309552a52a33d0f781b485425d7af2288ebb7c8bd5d2aa93b6599d9c6da0ed8c650e908852a40489138a5098dd84181eff64da3da190155d310809c2138564d0c0c85e233612b5b1f14ae250c7629b184f240a9d60e35941e210c7621dd3287368bfe88a31d833e7491b5e4417dbdbbe8de7a69ed18cc73f979b729eb4b14574b10d6fef5b0c450eb5b8b6aa64d76e25d36a18335cad68e76a18adb6b6ee61b2dadaceb1ecdc8b62971d4769468fc2255c2f075a26a3024ff64dc8595e83822be28c66f887901eed3747fb55a1b8eef2ce54f3708730e739b0436adc800a799021ad0d8008f91184d5f201926559cfacf707f76d0bc76d3cac6d5bf96cdbb6d3b36d9b0ecfb66d39ab6ddbc29d6ddb543aa91c30fc545e4ad33414a8695af7699ac6c97abd0da56d5a269f49f98c91b81828665bb2bb180967f5095b17d73d259873669964a099622491c5d878061949334724efc80c7f092e6646f6b45968955331927999926222c848e62b03f18c8591cc83b4cce56224dabded1362f9f6e878d9b7d997b3b399cd963508b5c729b32cca675a47166e27e784a1699ab67160b4ad0806cade3db3c940d92f77c4c648e49c61344612a514132723899ff54dab241d8b5c21365eae55ec8a2bcb754cfc929f154cd5c140b29db8a43753e4ae086f3bb55314e24b2fadf057a41b2b50401fb1ee9273d00bf89cda0aefe4349de42b45a91c1d658f3ffa52b46d3b715ccaa915562a5d6d85ef5e14636ba5bb5b89efb22ac68c15d4bb8bd99e3dd656f8f8a2584eb5a271d7b4c75bd11e6b1833390fb3d556f82ca75ad950b515d65695f8ec57fa9baaed9b498b0cbd5fd677a7cbcd248738d6f4c6361c2bbda38e8ebe673fe2defd48fbd64f2c5f5da6756cfb28c738ca318f72ec487bf6a38d63dda6a3ed245f1b95d7a8bc3645d84dcd145d525e9322e45339ea92665186045714b51e3cbc28b1d09025ba22c7418a4297084c9876c2467e7339ab040b0d5b1091e88a9fdf1091f88adf5061a7decd0545d753c8fdba9e10d1e86b104472088b7cc5b757c11a25b41f16e9f11b46d5376fda8239c34bdb2cc8f6e35d415c6c2082ec4f9df7ff89abf09b53e3c2e3225eba206164e5abb0bc39f63213c7c197ebb0b3ebe614e1acdae38994445796f3a40d35d1c544617eae3cf76fbf1c4764b9cf471717392ee49887a0f02b9eab7709258a4aa264b151a89b6fd275f3decaea8a2ea190c82a89425f1224873a025176528e5183ee4ac56e91ef3ea50859bee4ab5b51a000560e1df5921956a3822fece52c67320baee31264b7195fb1356fa702c2cb4c50e21663d81bdacb6fc21ccb6b50e0867be3f1cf55353d857caf7be6649743aa33f4491b29882eb6df13e1559d41c920bc219a2894bdefc5ceb2abce44970a4d74a9bc88aededaa0c9aa0a4d74f5556754675468a210dbcf2dca883cebd6b4356d693c8537b4fc585bbcc139ca32195d94c066f56e4f1b5314e26acb898cb6bf35c9a18e6d6db637b68fc6f23d2fa3d27a42a16a49a526ba5ac5b4a4dac2f6b7a7287455491b9cfe968238d41b1eb6afda6229290a5d15190944a1136c5fb51485ae5213873816ad27b9e9c59e2c539c355179212d83b3aace4457abced8be8a4c14eaabaa8842aa257ef565bd5cac970b5396c93873017b3738aa25dba1dde0709361e6021b1c5553a787d79f5184505488dc17ae5841fef3d9cb4c41cc648f6c3fe4be70c50af21f2246ecfd38a3ee264f1a592e8addb02ddf1fd04a3fd2492fcbce389be25bb5c5b6c83a117e2ef16b7e36d540f26331ae437eb5e5ecac5dc0d839ab8c4b16806379c9cc187b231ccb4b1630b2310e2369dbd78c6cac81ed33eadda9749d18d43baffbf7f59bae36a1faa9e378ed84aacd245f632292d2994693c435f1d2e58a77d4a9a0cee095d615d4bf7f558c77546dc5a35e14e3588bca77b00b15b0b27c55d08af7161596af304531962f24620c5a69c54a85e58b412c61bc88a6abbd34999ab237b6631c6d5de9ce9d636a5de1debdab629cba3b99323259d2189b2965646cc39143dcfb773acd37f2d5e76aeb8a9819e39a5079b23de1d80e13c6cc9576c1176618c5ba1bad625d2500123e2b88c3286624dd58811446b1eeb3c92983d375e7b233b6ef64bac2bdab41ec9a4df2d57732d9ae70526488c08c31468dc64d1a225063b4741b0d1e7ce8d1c628b67d4e26f9eaee99647b2ac5b1d3c85eb96499e038f1531c89248de410c7fa318e1cd26962400a8c62fdc984662e2539e3024b3189e6ca335bbd41568b73639cacdee9342b93ac77be89f5ce26cd688b2052c74c4a29a594524ad960949c6c1ae379d1fe85b3f3d27a42e16cad76bf340a75fdedc931f9d9d37ed3eaec6a85cf126ca1fb89d08b2096a006b174937cc9b7ac7ca8da4bf225ffd596152e4c5765927cc973b5285614f31abc325be858873a57148b8fa015d4b91a863bca8b5226c5e678a5510b1d73c9d7ec2a4bbe5a56f8dcb91a865f14631af36689bbbc4c9243ad798e7597974672a8356b958e79e7180a8d6d2669245ff2282a91426e2220ec3772481af14b26f14bde4826c537a167998c3373d82b8d6492959f4f849793c2a6498dfd12edb7adb6d816d925d189f0560e71fc925c68998c0af0616f281fdf849ae53527c0c352cd6a45594455e1718ca7d7b292bddf350c7f39ad2b7ded5a1513e3672f8a7991ca2f87bd6980b0cf6fb20d3e71c26ae648c3ca7abf44db8a12ad7cb4b22e892d23653573b4b148c422197b03cccc6fb228e7d43239b34cdb9cb29969dac66599b66d5c97691bc775a80e5dbd32f213ae9a4832dd994689d1a48aec090f27344d4c68c478e3061a3132242060a904e7cdd436aeeb50280fe579df07a2bcef03c1542aa55285618eced4d191b1759e9c98e274ec28e59c59a6cd4cd3b68de336aeeb5028cf4379df0782a9940afc3af5b5aac39c9caf7576e6ce8e8cbdb3f3f18ae90db9c78735592c199b95e3e9f4ce6ac5c3d3e3337d7c646c9f25b8258e73a69d92e21b0ec016b898f7133ba66e111d68d994a96b84071eaae366ea1ef1414ea84a8159ea8671b17c7a78563b5aea8a797dc8064282b4806ca98b04082fd7071e74f0c341e5525e085baadf3db73336f645578c728ca390f62f463bc68c64bbaceb0ab27c897889995297df84979f786e8ff971fb8c10becdb4c1ed38966f34fae0463496f94a24cb573259beb2e9cd925f09473a49165cf0aac4fcf288f9f5b13cc47207963fb00c64b988e52396872c9f601905cb43f010cc675866342c7fe12f2c040bc15ed80b77e12e1c0407c102e03e2c03c140f00ffc0373612ebc85b7f0e5cb3eb00fac85b5700f3c86651e9807de817760352cebc039700e8c03e3c037b01d96f3b0ac87653e2cf761d906b6816be01a9806a68167e0195806968163e018180b6361181806bec257f8057e81adb01576815de016b805aec255980a53611698055e8157e0293c85556015580a4be11438058ec251180a43e127fc849d301bcb4c180dcb318ef11b96e1b02c87653a2c9fe3e7304cccf93f1876c4f99461469cff625811e78fc03030e79bc03022ceb70c1be2fc280c1bc0f95518f6e5fc181826c4f93730cccbf93e30accbf95d1816c4f945304c006720ce3f9cb99cb79cefd987b396730f671ece3b9cdf6e18a6c33987330ee71bce59ce0138db70aee14cc37986b30ce718ce58ce309caf9c5f385b39bb706ee15ce54ce5ccc27985f394b30a6729e714ce51ce50ce4fce4ece9765308cc9f9d20dc362e74b3618d6e47c1907c30070bed7609346f3183d8a493c12e04ce851f7f1687427f4a8f978d7e04fe851cfe04d8343a147bdc75b068f428f5a8f779ca7408f3a8f770c2e851e350cde785c057ad477bc5ff029f4a8ed783f7d057ad42d78bbe02cd0a35ec19b05a7428fba8eb70a5e851e351d6fa7b7408f5a8ef71c77811e350ade29b8157ad471bc4ff017e851c3f186f32bf4a8df789be030d0a32ec1db8d63a147cdc6bb8dc7408f7a8df79bcb408f5a8d37093e033dea11bcd3380df4a8ddbc45f01ae851a3f16eba0df4a8cf7887e001a0470d82779b67a1475dc6db8cdf408f9acd9be938d0a35ef326e339d0a3fec05bcd75a0479de6ed81ef408f7a8cf7d279a047cd817707de033dea0dbcc5b8167a64df1ab80ff448cb7df8a5473cbc876fa1473a7c8773a147383c87ff408fb2fc8603418f6c78002e007a44c36b7810f44886cff02ef408cb63b8177a74e5305c087a64e52ffc0b3d6ae12e7c00f488caab7c087ab4c2593811f448854f39187a94c2a5bc087a04e5516e043d72f2273f821ec5cee4de440a1b8c33488593af30ce65e0de174779711003ff2e7055174f9d790e170f2df01d33d7d9e23c15f88a02f7d1e23d4aff91c55913780b8b0391c08544e04120f02165be41d2e915ff03ce8115af55bc0307fca701ff808a7b40e62f06dcb5808730c54190e2400a389104bc48141761cc4780e2410878094f9c04277ee4003762800f357121a49bc0c489967812258ee4e82714e04a08701492388c3203b5d12301b4c724b468d4bdfbe8ba06dc9b0fae69e0bd67e0b50c50ef3d50a8771cf0ad0708be63f0bdf3f8be371eaa370c54aaf70b52ef3b52a9f753cedb8e9c9cb70bc2770bc266c1ce7b053b3b6f15e8bcebd0d1793bf1bce9e0e179cfb17acbb1ea14f8bc51e0e3f33e41cf3b8e9e9e379c1f6f387efc789b80f57e83c57abbd17a97a0d57ab701e4cd061020ef3742de6b0811f2264190b71a4182bcd318f21ec190216f116cf076b3c106ef26fa4683d27708fe3ee37fb7e1e00d020e38789b51df65d4fa66eae0cda6830ede64fcbcd7fcfcbcd57cf0fec0071fbc3de0c13b8d071ebc975eef315eaf77075c6f0eb85c6f3128f39110de1b082184b70640b8050184fb00742d4040ef81c8792042e43b14b90e458a3c07118e830822fc86119e6584111e80a0db1014f41a4a380d2594f01948b80c2490f0188e1ccb912387c1c8af1831f217866e6568e82e08bd0521a15731e1544c30e12c107d0522a24f4972159224b914244f21e1af68adae55c2a77e25ac4a61cc58495dbba2aaadd5306cc6089cd418c552f5f2a53281144b318e993913859a2932c99764e2e2b25bfaa82982d0fb930e8cd2f71e99e450e4b8308c49b7de08dfa49c8702ec4637dbe09421d6bbc7a094dee219f9269d7ad88d76b64127eda4c8667fc271cf2a67b5e5047cf65614f0d99f80cfea0f036d2fb23cdfdfefb45bbd5c5c1fa2ed3cea91eda45ef78f7a9936aa6124dd9f6c1c2b65cbf7167128b6091284292ac92da29b309219135db329bc8d34468b747a62a712be8d7a36a3ac068f38eca49b8d1404db54da6e6a92435a90909090b46c35fcd17146bea65a18487ea2116e473e2d5c3ca14f0b2389d67a445a1849085aa995e45037352935293529452109c421edf24635627881b445bf91c2cd49483ed6668a6da24bce33c2ecb79fac7c2cc34f37263dc5a4a7a4d9268ccdaf7ec775d30f392977b7c83203f551461a12526a342c1da6146464645480589f61470569a1536481309878801b2307ac792316c9e091220cff1f17117e176c0609e274c0092990ca18c11a0e6ca1460d38e7e030613dcb6be0a081192798230f11b4e1740124353114cc130ae5acddcdf83d45bf6bf472b1da7de86deb9303de4b51364c676cffd3a93e71d5d3b3d2ae23ed96effd948e0e083e07bcd4d101bf263cffa4b4edfb54297d5519465675d693d59ec304c76a4fddf3bcfec22814e441d82fd26ec9b9f6cbd90dbec17ff05cc8876c096265534fd52daa87577dc7e7a99ea7de200be1554f8aecea2bbba3b3a3b3a3b3aa2d9db7a2f47cf5273dab28abebfcc9ea3a453baafbd0ab737e0a3c5fada0face7768caf31894023ebc8a5e2e2ca46aabe7a9eb7ce7216df57cf5cb5995cf6fd8eaa94ebefbfcc9e75339ba563eeff9139ff7548eae22bbaa3a557575cea9ce2094b63c5f12c19a52220ceb79aeaa5b78beaa5b58579dcbcaaa9ea237ac5c5696a7cee8dae03bacf387d00c94d2577d82515895a36b83d4b7abea15526774fda85372ae693b4fdd4bd11d3aa32bf5cefe814e529fffc0282b3b9fa241acecfca20bf4eea574b0e194abface537546574ebd6276eaac777b078912ad568304497d6ada5c0ab52adfbd2696200b28ef3cf472b13cd7a1f2071753a9a756cff9ea3a4fd19dd439a69e7af7f8fc49789fbab23ddfa9a917f17c15455ada962587e463ea3ba9af2e73ce5128e73fe273bef35694f0ab3fc9f9aac8eed45614d577fe24a75e2eab9d148353da82758bf72f8ac7a343b7a4a4f494ce820f57aa9d9e9d0359e984f7ac9df0ac68c1fec7b4f424ac37daf03faea2d76555dfa1178bdde1f9ca67e73ae751e9bc1564e73a074239bbf31ecad1b57349574239adf79ce31090fbf03c27b4aaf3bc4539be78eae5accaa7de95ddb9ea4028c797ead5536f10bbf315fdb13b5f225594f530e7dd7fd02e5b1f7df45103bbf3083a69bb5387680b3e94609468c1ba25f5effbe7240c4315db54cebf7bf14bd1fb1d2cb22d9db756ef7991d5a92d9f832fb22aaaf31daa4ad1cbc5a60ed227aaefdc874651a5bef31efa44e7aaaf68149dcad195ba2acc39ea3cf422e1a4c8b6c2b7a2a8befa139daf6a910d6b2bcacec33fd9d1a9178bbdfc9cca6565bf87aa7ab9ac6ceafca25b047ed4fb12d947d1cbe462b16cf99b2a14d9599158c5cc0cd1b6cf63837a62e0f108f277da3bd53cb5b1215856f3f4000936b951d62df39185f9e44b731c6d8309279745898f5bba6ca9b186657850d8b67c4b39c44232295d3d6f63562f8b2524e4b9a0e5ecc9e5198fe338ee7c4ebec555276c34808745a1693571e848d27c4be102a339a69d8842acc6090e6abb2432be40c3de16c3ce2663e73994cc12478728c41f98d2f6490958105d6cc1c8a13671962420e45aa8a3bc73f62551d616aa2e89315140781b694993e12529a84b5498e89a2dee8baef9e944288faa60a26b6689aea94374cd0ffcfd3ef9efdf515f12419a25ba3ef0737e1f0f3512bfc07bf740da46140c0d135d134c14f2509f1e0aa525bae63c982814260ab5d19c0f627ed2934be4eb1a2f851cd7d51b6e2c9656b32a43db84842ceaacd3c37bc2d60d7b3f1bb5a0019b2cdab0d1220f1b9940cb6c30c0823cbcb981b0cf5fd7755dc7691ba77559373bd9655cccb28ccbbe0eec8c8f2ccbc094941ed0deb9407393b5013c0ec264baaeeb3ad971ddd6a1a0755937bbd875c75c97bdf3c2e39f2b9b6cbc97a5940839f97aa3a995f8ecf85c306527e5949c9452ca29e59c5293724a29a594724a39a594524a29a594524e29a794524a296527a594724a39a594524a29a594524a29a59c534a29a59452ca29e594724ed952ce4f32330a155ae17953ce385b8620cbb2f9cab2599b8f64d99c9a9665b12ccbb2a9695996cd2c9b5a9aaf3fefcd39e7ac5f9d60acf1f8e7b65186ca3e1a7e755659ba881784171a7af5b98102bb5696c9b0f193cfb0f1599ac80b238131507c7c109d444917898f6b9a0b57e34e087ed03903889c360208411084ca8c2ea932bc804c427c6cbe78640c00b566884e0d11dc07c06c1e28424b638477040a61606226d8e43bd1094868da46010f8c8f0b909b1bd7a1b840792078c6fbbc4f03bf2b6124de3d0f85426d4d322e52280d04531a17462aa58a3f2e22413fcee8c87121672afbd6a9c26e30c2ecb37bd498d9ceddf95ecc8b9f27bfcdab7386b38d8c8c8c3a225ef312f4b2cfb3323bd97ca455e5bb772c5ff58e859f6a22ecc271b8b3932d8a15c5a2468fba87f4c83bcb172a751476e138b1ef9f13e9a190c84029254c3193691189ac9399947282296eca6d6669c8ef68fb128f6dd54c5fdbd29f513cd9679b7d66dd5d3faee1f03aca3937249db6228aaea985463569bd6c5223d203dbe77d5b8abbc631126ee388f849782808f98a42fc011b83e027ae43695d371b95799315e427274706214757967199e76ddcd785f2c5c9971a8fe338b642e1fc077a6922cfc51f171122222213f815ef840fbb29894d669d5b80b179ce94f6ce403919a59d91a06cfc6a0006186080010618dd603003c9cb4c36791de59c4682829444908868669afcf989b85cdad6744583b0e6e77199f64cb2e1c5f839e7149a32c62491bb638c91636419a3161e47e618638caa28639493cc1c692c699a030e4f26e5a9449794f24b229539f2d06112e7a083891e230540d161454e44c118a569990d146f50793021d78000101972d060fb8f1d1030c3eb078430cbe79d263b123099cc98c929ed384a695b8d31ca28a594525a89dde55057a9c857df0929659a33dc58a9e1112e098a4c9cd080086cd4661683c0b1319e1b9ab118441464446ada7c10b7a9714153144f5cb889824c18643035c5a207d460b1c6c6ad562ad1c5240b579b96f1520463e0440fc7c6684d0816e0b39d81c08eb606ce175f4646539a702eb941493664d82095d92295252c4d56b0b07953825076538c910919467392603bb2920471917e54a38215e458592f971f2a6842266bd0c4fefd892249be580be2b82f5c31b5acc6090e7b79091c8137bb98596cdaf462ced56a871f842535b96120ec67dcc4c01683d0155d2c7b4ea5397baa48e07933d336ae4371a899691bd76ddd9b99691ba77133d3b66c73cab4a9cd3251c6b814673ece5926eccbd83176dd91e98eecc6f299638d55862b8dcb0497656d041e72053192797ec8db17c44862c798da2a3390762dbb4b5e976d284d3d2b33d0fcf4815ff17784bc4727a1c5698c16b326420ec08274c39e38e77151a4a9a2065b98600f3563542036d3849126a5b2aca60e0b90f1bc5e220d060a80fa61adc21f17919d5ea30705ec3c91a0357420c0a22cafa1e3889b0bc888828c048541d3011ca0c009cc38801c2808410262f301411b1e414137e2fab91122254029cb6c105087075a565347994c634197a68f36380fa503e79deb3fff8e9890c38e2c922c20871e1140018f042ce1a1001001403078c156c6e3b22ab40534010b011b718524148c595a92428c26181bb6b3f32c20cb64cc31c6ce138942a92035751865aa197c6dc2d6f6ee1c6b6dddaf64efaa183356ba6b17c3fd8ac6b17bcbd125c9900983f4f93ccc6c6a9fdbeb85389b6c677b60590d1d4cd6b3ac668e34f63e4816c0e32261bbe22d5fce11c63683cbde5ea6e51234bb242b9f595484c271ccd473a65241444141fdd439160f7e8694d5f4609d6193287c2ecfdf6fefc1497013dd1d8a1cf2a93c2c961786328af00e96d1cadec3ca9884958f4d58792dfec62433aa2f895b94097b0e7ebe9d643fc9a19d4b34acdf982473c21b9158b59da44f65c9f15496af9c1a561abf43b5ebd0ec1fe59090905694633b94633a9463edf414c746238e798d460e493472886368aa4c1182b5cf28492991de62f96e92432deebab398eeb1b6f8b1a728473a8f9ce450075c1a5e88ea386e2a6ddc0781b03f359e3c594f5b66a0c94a75725fe823b92f0cb7387f640cd4339b3da95b5482d6b3f118e15661b783921bd7a1bc4fe7f3501dc7495ece866220be0c559c524aa9c0f0cbf1503bdde4429eae01536933d2a3f964acf98325cf1f5368ca68bf805262922c03f265d916a717cd414215112f598e39213d3cab1d9d9c5095023f0fd5719be643c2374b10f69b741cd76d2b08ef67b77fda547279d04532e982b0df31104f998aaa4fbaa0cc2c419714f63b6020bebc23070582bd22ecbb644700bb111101a18bc816847d962f6947d8ef18888958ee1e10f6519d151f3865cbd445627b4916847dad8bb4edaa08fb4b84ad8a2a96a95b64b368b33abb083712970539e6b24cd2946acb2606daf52ccbb68d0b73b62959324b9dc99a4ed8fc659c3117266d9bac5f74cd15c76faf73409c7653414720ec332779224f79449c3ab8e38724e3d8ec9901c23e171967db36aeabacdbb66dcbb66ddb38cb7cbe8e4c9cac4f5b4167ccccc54e0afb5cd754fbcb0ef075dca665a821aa0eb32ccb64e59e70ca2ccbb22c8c3b19cf97c56ecff8ccf33dbf85e997ccf2575ce58c47e71ba31d85fd269bfd0d1c27a19051dec7654b36639a4a4221a3bc8fb9af7aa80a2e911de5c24f969fd32b9d8f7948c5427386aa20f9e26bd93b06e2f9ad24cf16dff46cbd4d9fae01ecb1b4d42db2a89dc973f5499e4f28e4ceb22cdbdefd687e6de78760138ecd942d33330ad531456d2899a25bf78c369a54a3a14b6497cd767c6fdbce20dff3da8b2e929de96d999d63a133d045b27be746135d594fb34c8147314da3c9577dc0266d46c86e789e8c41d859b76d537e994dde966d5bcdf842de65a1b6cdabdbb6c90c5539e3733a60936ce3b68d59b7a8379eaffb380a71578ec59fcfe6fdf89e717616d884affdf83a2ac27e365b3208c76d51486f30b32ccbb80ec97a42550ad5715b8f2a15b9864006e034992aa24b765274b964a3b1f2721c342d46b7b1b2c98009d364ba0a562395d83662fb974810f0b358b8c334192c72084c87a83055c97c4de6dd64ae6a3260beaea8388da6d1b01a56c36a5a7650ac19a38c1517702c0a96d758408df5c2592f5f381befa5cb46032323fb25b4a87f61d98ec91b617fda53f5f2e197de348bd4276512b9a3b8775cf5a2020003c95b2e22ef75901cfa7e899e3489aaba04fc7731de531703fefb77f06252f72ee63bf899baf72bdf41efa95ff1beb37ca52a9b8929d79770711708fbf7cd1c95cde09421b6ab2bbab62126bc74cf4be7a53f0a6df627062d892ef93642adb26ac84bfd784e6e6178adfe4f0ce55010bff8cc1c64198c6a720d8a2ea2ae44d548744512f450188b4b22d3bb9a42969125650c830b6369b832ecf61bb21bbb7ddbbe24de20bb8546a2d0edb6dd6863379239fb4946799b95a8e9122542dddbb62d417d63b150754925a24aa26b0bad1b2652128780c4b6330f31c1830d7e3110dbca682b9b4e6c44dbb7cb6da1dd184ef6028f8b6ce1b573e778283e566e869404a17c9c614c22118ba2ec2f3cfeb9dd8c72e81b82b3d987905e74ee253bfa0e65ce39e7ccb85f01c1736015b3fdab1c0b220a0a3ac7be4fd5b39c7970fe9b5395e56cefe6d43eb309c626ba0d8a1cd22ac76281356462f23ee7ecd9b3e7e4e637439d997ace7526cfe79c73fe98ace933b59eabce3f2aabb27ca52a93d743bff350ee28aacd39e79c3d94633c9463e09c73665b879a73ce9953fb8c4e6d25a4993373bc6ccea933756aab0a78ed57b86b1c7731dbc1daca39c7c0730c9c932955755453f56cead4397b765f825e5ad9d675d1792a759ddacace714e4e394e9e47cdb4c031ef2a4ac5ab4747dab9f7544dd554cdac52d96a2bfbd6d556565b55be6fb7f27dab61cc640f03fe7b56ad84d196c4a609826ffbaab5738eb5766a158e8d59d546f2e6a743379bd1686473287b076fc53b58c398d9791879ef3bd50aea5a0d130fd2782687724646f6a36678cd05d058069bb4aa80ff7e05fc57c598b112ff5d8c3cf82bdfb92a26eaac8caca7a2a9d94d6d6e738639f3216daba2a939e7dcae75f750e0bf6c7ef3dafc36e73bd4bc370fcef92511a41ce358b7cdd9533e7659d18604571427ab0a97cb256726a594524a29a55482858638c431577449d7a3507d74c9ed9c814d32094a51d9d6a8253239a1a0e8925b4e079ce4081791433befff7c8712c9977ca99e4337caf2f505b9baaed9d57f5ffe2775f97daa1a655ad533508a661f7fa290aaca67609354fd892e792c1294d193cfe4e519e190958f5273d9e63a6e6e5b45c215330384cbfe4849571c721db784116e8bb03f6bd0b92dc247a1ec28ac44d115330a84fd1bb4595eb32486bdcf2caf4941996e293c6624b7c88ba3f16041a49f8db4b3defc8c6ca49ef5b24f6a9f8c94b35cea1645bad9a2d8dd018f1934cab2ac0d2361373c34c97057b04b9e8c1cca98e4bc82853234d8cbd0d8ec9c4d50a418934d392b9de48bb3738ef0664c6494502ab0f299193d2499e48ba99344232b259c13846d58295f9908229fdbc232cf49c4728353b26e35b6a79d6b4ee046c8248758ac3064c964e54123cd4cfc0dc1f25f9c84eb22f3fcd943a97ecdf3fd509dea2123fd9a4769e7be7e7147d50bc4decf72bbaa35d29d244c17999fe716aadeb97a817c3d84b297043b2fd3c0ce47ee0b43d6fdbcd76593af5dee7e5f98db81ed0f6a608d8c8c8cec6ca939419d8bad34b9da5da35cbd4cab75dcfbd9f63e8aae8df616adaead145df33cdd848d145df3596da3e89a9f6dd459c0e31fe984c42ce880bd20bcc21fdced640aa20bd5e9d808c4468efd8a9f73cacb735d8efd61a984f334cf78fc73511c8b71d1e24638efc96ceb38c189822c524497548a2ed95b34951eb7e2bc9d8e1d834f38ebe5780ddea39c9d69843726e5806738abf31cd09585d6f7548d473f85495014b0cc064969e707787fec1651bc022dec925f3bd1e4ab4e389b7d358bd49744a130e3fe4529e24bbe23082293f6a6710c03c97b138d707bca9024c785218bd57850279ced2c52f7e21723d864fb1be1b7fa58adaf9f3a09a751002bdf2f6024784421694f08bdf77423cc1ec7309218c7b4f5ceddebc06deb6d4e54b3133b699aa6715c7c7c07b2301feb16d4e751344b96e8cac2706213d296058562e17b4b0ab8053cdb26a4b9fda3add402cf36a23c6f8bf3f4c48a2e27c2c7a47e62eefa2445189ba2cb354b10c6a628c44af195c4e465ce5f76622424242d69429da6a6262a4d394a4a3b4d394d3f7eb0c0ecd9817c20cd42fbdce8109ced473a443804cb76f5126304ca7011edac4bc96a2cd88f348bd4357ab4c4633ea958639296a4699aa6add1e4b46488185a18f192b41b056152ce76ddb26db46bf422dd12c78cb9714cffc7c6c96a9cc4df223b3b8eb96ffa2cb69bde1f9bcd548d6f985a1fb8655f646a23f46a8fe16a23b1a1593bc207fefe585a396024251c00290ef51316d28a4d4949e93b179745c5321088116020f98d46098034a9eb1be94414baad6459c0924734d82a1e596d5a23f484c20f75907276a3ac268f03d88c463bb1d8f8a63132498e73b2fdd8ef938babd5cf5a7dce66d7c8149562529292929212b5afa7119e4c78fa34da4b4da5f5ea53a7f1064ebfe926351ae929494949699b07abc7c1d74f46be1e81953f58a89bd8251b019d642ac5a4981493e420417823536c231fdfc8a10e3ea1b0df4f8c647b2c83b71a9918680421c7d80c1490f166a96bad3f8c84875a6973590eec9c276d88d1c4145d31c9aa11ca6b71a60b344b488c24abcd40fdc8e2739e162dc7a614a1f6548c1248b5e91a95628d494c494a5a7411c3f068b4de07ac8717a37aea62580f4fe4dba1ed868144c040f291f60818487e453b8de8927f814e38ebd56e0acfba98d45517139ef5d7d760ab8aeaa95f613dbcd760ab4aeaaa5f495d55c398b1a23aeb57c2b3543548bee47d7e83622c333d3d0f1201a7ccaceb502814d8d373d404016cd253639b38d44ff225b9348cdcb032a6c0ca8734f2d02cb41a25105ff2290af4ad28af09638cdda120580ffc9298e426d4a93da63652925223292929293d71f66976247c415fa4b10c1acd000103b5a1247071c536d19546d894b3350b2639a4d556922ff92842cfcac7368c445a79f90423e95ac043fd14cf603986259508f978ca8353237c436a92b35d23d30854d72e267cea6254d7be294528c68c15edaa8b493dbc18edaa3769f5afa41ea2e3a8b48b97c84345e8a099190000008080004316002030140c088442b13cc9113dd5071480107c985a74501787a338464114859041c4184200010000316468684a1b0035b56e440c112d12e3df6789cd13a19b4e8df83776fc62847fd75ac84bf66e0d36bb2bd61ff5a84abef1a7013d7c2a5e16d5eb4c785c0f6d431d8d0bab2fe282ddfd7a2d08307ffd3232b0deff8879c1a6fb63424a1440bfeb35461715aba6abe5e6cfdf2555fe463dcfa6e7cb27c91c799ef7d207dd7e1c9a33e44d56acafe409c8bd204674bca2fa27b9e5368c89e1286d09b62ca65a3278280799b9f9082eed4436b339ee858a2cf17eb277e7ff2260fbc741857b5d77df42a5031db026272ab15ddaa6ceb485d04ef8f6f4f63660915854ea5221ccc4228a346e63b3ba9474b5a22cccfafe532bf37ec70788f182afca4bbb3c21417e10146e3da0a1afc09e94166b04b94e97520c90d0c2adb372b47b06d66e79a8a48ea46015ab301fec96b81748585ea2f88f5ceb4949b78e2aafe75757035d2e0066fec31d3b5983065e17e9dbef30accbc5fe90a65dd1982eff595bfef4c8a25aa0d09398824662b440034d6a5499945fb4dc4552bb5d1281ad31ccafd06edb1cfd057d6ac3f67d44000028af3c32fffedca3da58dcd421ac83c071362f2b902ef666540f484f0cca0ae96d9398677f4ba6b4557baee9af7cef9aa9aad5aadfee8d6ae6871f2e0a66a6f6442a83c2958976155d60750567ceecfdf792bd1c1f475c7951622bc4c90180710a83d62ef04040299f4df1756ce48e134ac35935cf5c67e0c9e31131a36d60bc0efcb941f88f6d3bec3075281d79c7396a5e201ba857d404b878bbe4a0c6db2716ebd4e7cf37d4420cf4f2cccd9de650aafa735ab37001348996d721f433cc1deb0d72cefbc742fb49e6763272a6a6232b3108d68fe3266170b312769dbdd67f742a00f36626549a364b1015a0790c1f5804c2dd60ca339264b5944678a5b934149aac5f94652528942f07c0f8a500c06e18ae5951955e3deb6bc334c4cf6532de14deab5bd9457dbaa5ad509b1f0f4d61337fb605d18a67d9549f994de336677847c1fb1f6db8fe07152678a145aeef76d1b97a891c02c60fc01bc264b59d4d2907c7c4b9f8fa9dda29883494d69dc2a391a926cabcef518f6ce441a01984389f26684268c709a40596be20ad6206b834510d172b5b5bc0a9434ff2f946c5d0a5715fb93e10664cf3bca86ea65addfc82fbdb52bc62d3be252e4257aa1f9500452a1f96d5ebb7da45891b68afb9643c4168f0e735a462703bd0c5a0061fcc48b532703d3f68ff9a1a112f36313fbfa84b35042a23b4d24184661d8c3f948d75acb0fdb178bd0b5d2948cbcd7c1f7c2de07d803c6a02a5c592a074cc99969e8ae0b121d8dee9d74e35b7909eaa7aa435fafbba2f4bc8a3e3dbdf40ea216705c9bddae74c22be323869cc37c8f238bd8961d96e4344ac883348ae70193201c27a71600bd1d41bc420916bf2196f16b683b00e016690b6c0e074bb822e785ed3b80052f145f9ac995ea4a8e097af8c162616fed41294db1dadff24c1d2a369a74463f4b1fcec2234009f71a907b8dd0405a887f9c1dec059c90e1241fc6ae4f82ef78752da11c9ef7bd239ca9cc4b67de361073037c48e209d6020c98b9116e2d3e1aa97440026128a2e0ba97edf1587d46d0792adb5dc0333308b6202ac7bad2f6bcb0336521e7020d7ec15249cfce822a7bdce1cae72dc98f05392ce831493ae7d9233e33351ddc2fcff4262f59db0e13bb6362c019585e47f919d3820a6347c3751ee9e8acb5e58a7e2c8c27e835ca3c919f640f8f4b0f3b65b8f805423a24772b03b51b0485bdb68e64da1d012145048f62044e76f3ab8990be6c272a12045d2b330545931e4c81aa2f1c76a3e93226c49d57fff02a7910a051417de90b30900ca0f5a150a7277118dfc973ae24c204b765a5ae1993e410a104873e0f2cc8baf49f3ba2252a67d381e30d5a36eaa846d1a82f6b96c4d092c479f63c33854f7e576cc543b3d533530ba1c4b403239c6002b379761673d0ecfcedddef080d7b24ad299b0d880803ba2080f39115c09fc246cb5bff59be0fd67cab83648d338cb797747b4a422976e72c67207fbcbe8438c5481ef50809201adec19dbc98f807bccd24009d6a0be13052e91ccd4b7d58e92d2568d19208426894ad665c235cfca7fe24375ac29734768962ed97c6e71dde270c02fd52a5bc140366dc5af960ced8499661931627bec69c721c4d8d868e810f9cf45323a8e22108fe6441445b9e72b48bd16406ddf47a04e042c28bb516e17364b10a414d93fe45e5e1ae2cc37667d9275981f15099f7226c615601608ae30f144447b36852b520c92ff17d9d93e71a848eee2384ad9055e1de9d76ef6b419ecb6070458a16ed238358beb219ed49cf901036b7cccfb1a22f4142c641405fe700ff2c67e3a11313108b90424d4c555ac222083768cfd141bb6f1347b2b0c3fae87b1569595f4a3ce8ddb18cebe22e7275f4bcd1498d0b96c3434b0e89d66af693cc52ed876f4a5f4a0be88348eb8abe54f686612ab9d31ce973136df39ac91470e92d3bbf258640a49f243f7d5b90452df45fcc6047dc66b52531e5c2850688bb2622568c5d5c633eb676692d1270060cf0853624de0e0387a157cdc6af70bc0116c9a5743deb570ff3791ddcc1844f0fcff8b3dfbadde8a350a4d994273c141bd07a5e64843443c0c9cd43822c11edef329d163cb66e118bc1b13a52a6f25eb053dbb41dd4bbb5ad8ea6a29cf8f6088c50a4890f8cbf6f543e8cd477b001e29245ce4d99f272a526d65edc6309d5066ace9c3f4331627cc67cd2777b41b64282b9ce679a14a71636654ca4939cddb1ce8a72de74de1f3b2d77af2aebb6a9c28d7a3cb4ef27ce53319d6c539fdda34979d5fff7d4173affcbc467050ad998be36aa359794a8fb10c57442b8fe8894232ff908826cd17413df0035158daf907a1ea07050ebfa1520e06dccf4014dde6002be5264ab0ed1fb60a93320cb17347334e1c869807eb192dbdf1bc2763848b3ab3b60dc18d74abae913596a13ec924d92a069e18d50b0b7d96b06940217313655147a639c6983807d3bd32e327eeb9d83f89a49790a1d7c4d9ef26fa1e63c4da2cae498162386acb438175222bc118c43a0e957cad81f3c6a665be2f94b7f215e4affbdbf49a2bb49e2ca42a53a247cbf9d76fc040bb266739cb5c98ae471f15803f8c60168669aaacd94a0c73e88734920ef4c0a863f89baa9f19bf15c2fa0549cdec054b6d58ecce385d821801ce5e750b55422ef9f0b478d31053110859f878008f7f81d6ae8f389afc1234917947441c8412fd40bb3ca68ab8ed6f1e7b088e7db8a7ea1b72640f05ad27ff1e0c4a5bdf29b36b80d7a22fbd66ecc7c33b88895ff1c1d9c15ffa39ea97255bbb7bf2cc56f6cf7354fdc07852a887e57baa27c7b75639c7b0c0578f94949786ad4cbed5aeab9d208c23ac99807ea0b4c9f498befb83a57206ab85050b567b2704c16e44611ecac0ea7f082c08e55d0455ec5f4004ee53521ba046ba6c369824e2dcc12ed5411b4d1d8db36258c7a5bcb8a658f92f814de419f2dc69b603961c25767e4ed7d8f9b521fb8aa02fa8b3fbd8c5b712c5abb69700c288adb5c1031272568d721508c4da1957eb6d44f637d39fe8f0db24ad694b090d4eae3e87da86272c17ead6d977a1a9e844d7d245ed1f3af9ee402d0250b54b169f6945c3acf550852360a8d8ad50edff4ca8bf2aee801d7708451704335630d4a1bb9f0493153ec2b05b22e9db5c8e6e0a04b9b82b13478feedcb60b200f2e875151e1abdd94ac242182cb0d6982290a5af4f15e0824710318a08984aee25a0de2eab4002369baf7b0ea086feee229ff2ded65ace0bec8fbb548a66006366eaa3311eb3684ee2b1077ac48254c4f7518302aafaeb90850c99b1fcde72fa888c291fd9d5d3dd06c13c1e514fa79aea58423d145788e044e87282eb392ab0c221896992f5da763d8075dd3038a55a512853b108f61c2b462de070a95b505095718b9075fc1df0763b48512f69998b5482316edecbdbcafa6237c37c6acd4852a4e036f4599c7dd2c1c077978e80ecee2943dca593e33444edd59f81688e0579a9ea5f2e73c4b5af00d1b3524cc48b3aae2711836298d1619b8bdcfec844cdff94a88bb787eb3d45577c5f161af12268c7c4bb861f625c04b801db117e04f50300eddc9a9898864ecb6c014c9237dd520a43c88f6a1c769f737d268e1b20d58f3a0ec335c885a9f574ad61073529675648833d77bb93b031096f098e5c50586fd6068672536e1510eb55fb19de3f66b58792764fb3f47aab802be7d17342b6d414a3ebe2840daf57fcf7b76b66fe1fc466c4aaabf21e57ec319714f38f0b1c8072531ff005434537098b11e73d1a667646a172fc1fb8ba552fe6cd0bebbbf5aa86ee16045986f50d8608a052e805c783fec5a27193c868f1b868a41cd6ec8f797534dd7f3a09fbfb1a752dd53ba3915a42ed54f4d05215cf32796d7c2557838d36f1210d2187b77e9d324ec10f2113b0ddb32200070111ac86ffbe490ae8ab4b87f4f9d007c480afe040d7268fdbe7de67aec72a4b9f9ab7b13fcac2b9ce94e49735844ebb83ffd84449b3be48ee8598009d58e88852c6953a06018f769c1ee1f6e0d387921fa6a078f115f864a67eae11a8808838177789d9a5f7a5ad3b1aac05b010c54e96888b7f1cd890c30f9d31a9640293a2bf2d59e642b7760aedd50515a554e779d7487447b52277f77423decbf16c0159e435503a18165f595dce4e1a2c1e97f31fd7535f32f80b0f467ed61e7ae459cafea5ef448a7d417fb82f9f07b50b8611b2b82cd6aedefda0a35793585d9b16ce66697469b5b9a781f2b7dbfde9ab87c03ec5cb5b2ab483d5fa22914ed4523c88171ff70ca131843cb0ac77b180dbcc67b0457b22b0a0f06ac658a860b29018624469852d03ec715b9c9e9add8e57d6671e913b3a150f062b4b0a3a46adf01d22029d1523689789483dc408ca6098a3ab0ec4e77e3a669299b29235b4577b6bf6865271a0d158daa116f1e75447bafd86447780b8d412ded9d1f8ccb12316f5211d1bd24e456368f2dfbfae0acb724a196828cdef54fe88ecd92928716e52f2107325af6a1ae2cbe4b8bddec44a9443c52f9a2057abd621d224b9c230f710142ac7a814ce36916ac2d4328a3ea53ca8d0b1c6e3958bd1ddd17ed16b7ec6883b38c00fc71394b3406240c8225110b79e0f59823764d55d7240bbc871dbea2f37f52cbbea20954402d8549be48df97b8a0394a20963a77d337feb4f47b22feaf3b0852793351d6aa6b59f8f6f51307fcdfefa25ea6597e158e67ee7931e4caea7983d3f84a4ed1c473f3d72351c88b49aee4be1079e40c811fa756c19f3aa5b8329220bffe2e3ca47e6ea28c49d4988830bf5a36ace94568be3d6a0af48c6c3ef7e646daa27d71444c080ffdc082dc26273e2bfa73883e53b0c00e4952cac28611741ffbacc33cd58ed26cd766e7fe19e2ed91c75a5930e030fc2b836dd22bb721de6a3b0798f1e9cf3177b118aa18e2e8cf32eacd0670e0d755d6921bfa8b555fbb78c3e524ba9e89ce52cad7d28b4c216956b50f6f328fa77f4a1948c0e69eb1b340ed4f0c0df8fad6d936b63dd3e50e980eb1546d43d7286e25e13d276d867b9ef86e93961798bc9d91d2d71607b986f0bae0f5f2321803b605fbf8e2819982c04ed4253d0540c1dffcd29b8a52f136ace5547ce379a542afeff1e667d8a5962bb8dd232f0e2589afdf846bbdaff6385e3f6ca487440bbc306d1c69ccae67cf465fedc6f30711ce5bdd4643882ece62634bee9cf54af2ccc042e7f3f2f088b9cd0cb05c80900f4fa07c76f97efc88adbb76e858a3c5c027901f9dfebb6e3e2bd95e31d9e1a56dd3f85a3753e36b9dc32cdb6343cd0ec9cdf0950ba110d9f5e1d317b919ad8e5f989e9cc314bb7cd816a63a71e2664f67bcafb1ee00c5cd4285aa75909d63c47def4766943bbe6ffb0d3ee808e84ab7fabfb8d96171c46d53d55e416989d079e8651dd72f59e4bba7104363283cde9c0ec8de223c1c4a22a053d55a2e9592e345a200ae3396797cdea526f3f3860a9aebd28a7f70e28817b805f5c93ca35532d1bae33564180f9ea935110e5173070d261061487351b5b21ef29ba06bd4747ee5dae47933bb55b08306e53d98559543453b6aeeb876a1d1dfa294c2e94481968aea7335c1a734d685c54a09cb112e6b6481ea8fc1eb5ca41efa4c772d38cf458fb65d94a837b6ffacafbbfbfc51912169437c9561011e02fc8ee662b6a71de79d829527fc41550d9226232c693b6e387949d2ec66147bf8f1f4e42705993adc2aeab7f5b121ce1762eccb7fb80cb4ed8122cc5165697bd3809da59ecc573f132caf460c232d3e8a5a26f6bc8d77884a8dd6a65c411c0ab5a635b6ac309f64423794b8fefe58943fd026eb0da667b5ed1e9d3cbfbcd215f93ad0dfa3ebfa6cad39bc620c040024bd6922ec940d6c65ec9f8821df7d58bbae80f935118aa402940743b0e20f61a590ad7cecd1b5bf96e15a667d5c31d2652f07f66e9b4e246bfe2963cab9c1d57598a62a38c3bcc6b835f020521bff793001bd33ce1674bb9de20c551d7e1721ab55744ba6ba46009253d858b613bf7a10865759790c49cb897beba2682f96872c35acb1f23b47e41268b4010b5ccd1c08e70be198e8693f0a04d7fd3151b9ccfcb3b004e78528d21e232c57632cfb2103725966679d2c60d71db7a2e2bdb0801b7aac7202b096fbc35944cf7a2bdfd84a970a8b1da6b700a792a65ab6033943e59b27540677a074868da348baaf61b41b5f153a60d145ec9869a5e3fedb00fdec24318a9ec0c58c0d99f2c8984fd2edc508873ae215452928086cd3b1e9288c2dda7be2e1e0f2fd1f9184db527b65e6c00322fcdf35968199f796b0a4b9c38a31ec84e911c1ad13f18188e021dfa82e599b4885ad894f0d1b18641f932c3649d6f66e600826c58bab450cb1a17e3a904cadc09e32fdc61fa0eac22e143c0544703108c89f81ba6e70e9379184d288c1a627e48765808408f3c1d62a3d4d3cac8feb10d21316a9ac56b4c1e77d98d4253888053a5fd12c0f39f4f4ef8803368f93aa65afbbc170d02d1a0a3b788ddc7a6acfa6838023c1acb612688c406b466a689a7be8d3addba234cbb20109ae594e57df421b9f2130c5a7480e3cdb1634e5fef998df4241e4a95a29d0af4f4d0cd3867cb2a0a0c1719ce42d97c7bd22b63de8b4af4460d42b7a10ae8b1817a6d891327c8c44df44b320c63b57f83204f26954a1ff585765e6ba9ef52beac98d7632890d5c3151b977de4353d9ddd1f9248b68f4ab1b13d7f6e93e4cba47e6b21e51febe5809609428b54ef14167bd6f5d1b3687a6e11fc57136363904cc2dce7a293c2f8ce1ce034d0d97de0e31a63bf7ea8a8ed5d4c96b74f961b7044c2ec4d29dde5aecfdfb080efca148dfdfa3bdf53d826c952e66515c0b7726be89fa34565a716edd4865c755cb016e6c42c92a623d0b6639a14cc700190fda4509751611764e1cdbe07c4a2aad028ae898310ed44cf93cf2e50849c40b6198c32d2f3d70313629eb6a35111df4d8dfd1f4df75e429cad8cdd93b78ca0143d3fb29049efd186fec6013e5579b1249f5f03057cf26d207167a5c0ff558a50468b1507b2ed261c836a0f0cbf325fd0cc40843a941d8938a09cbdb1e474071dc3baeff732c54e57f0ed459c6e133b924334e1113b5b20daee5ed9b14eddd810077be3db6480933998b4840a6596c0d6febdfe1f7085fb3391b8fe0848f3276e365d8a9e02e37ab25806415e4f6b4ccc4f5d3d2c60c22246dc92fe45594aca8693e8b77e6eb61cf784fc5fac78011a23c3b6b66e88c3a0bd2c0e4912f4b5de1813467bec802c1e624910a078af0418833f0507b63c85fdfc1f6b57169c04caf19cb61fad0044db7f473ac707a338999cba364d129b268ac516da36255f8acdd6bfbd18a2d0418d7473d1b7a5c52a254fa170b7a69ee1e106c3130bd2569004beea8677ba3b7785851df905ece04d02809758e0fd564c9846c0b05d8d125619d6d36d1bb4d4d68b0cf9ac0a5073d70a7471d1a679b02cb786116333d612f648cadaf1189a8b937793d84dbeb7a94d7bf6f6b814bbad30ffc45c85791db3a136f65d54862a8853969c806bf65776fd163902434c3c354c952258e2f7a68edc28f128a9156ea9248e7437112aa0ead03e5d4606fb638b3d6a97d9867defc3af518b2047cb3e049fd5d5935282eacb51c491b3ce54bc670f4258395dbadc3e740be5ad42673819eeaee0d6f4992a0032ff53a7679e141038b0f01126553bb722db1b7db65ae0194a4b1c757940a73fa4db02f41b5e58d0979bb6c8038018a8e9e408abe7efc41a5bc0371882e8f41f49c599c02a1896fd5cf8e7d278bce861eb523accd79c0ddc7d045259ded5f2b94910f4c6fec881d8d1fc8595b0e110a5daffe5b2d66b98f6a1d42f6b74c964c51303a4b3bb6733175e65c5339ae833af44048b52373c4221d5742da9ef0c762e4a7c568eba6bc30146d96f8576c7e7a89b2c7b6d6d7c6278a339ca8675deeaa4eac07d6af1117b393ca235e2393f29af7a2501a06c642f2ff1d3a3b0f53c20c30cc686a6adb6d92fff10b9cc7bddef324ec9e709541dd51ba3d07def30da56309ea6fefda60adc97a3047901397330cfa144e08317cab279c5d52649c9e1010ee40478c79b1291d22c4953668c195d03ac0867a943ab20c902260d9c717070b09644681d713313efb2c2b76bcbfcc9db3b5050a1467d7d3d08066d0b6c23c02d9dd15e5dfd7f02d2ebdb7ad8ebb090f7de61b5d3bfce226ba66caec0362121b8e52342be58224ca644a834169cd104ff2334d69f6c37ce8456774a0a71818b5cecd35a872cec02768508bc393c392bc3543629aaa4f323fc911edd2d6389ee0e87c0a1e0c54d61f69098ed81f7ab3ab0b3127289121a7779ce885e26b2822401d8fb4b29828bc00479f1c097b494d8318617bef6f090344c596912138a755c028e2e3f93fa469d44ad4bea94d5106844459ebdf148012f962cd59ff567ee3c18403561663a10434c8085809d6078106aee620658a6f3dda17041e53e8956b36f59f57c1a80a8c2e2a493f8c2ca16bed969479b0ee88c4caab67e15d3c91ea7b6ecd31af05b5b204955a4c8823a280584ce8d4188ba90d18eaf392c5ffbb604b40f49fef995da19bd1d491d42181f6ab64ef7dde58708f9b8bbd691132a71697c4dd844cd6c5f1f2c9f37f21d1ec7c5a02d6c34f637758a3498311dfe60a142ecaef3ec68abd4cffcf2a1e6432a5e98c9d3da47dd415e62705fb5068cc93a57b4a5b0a1bda2bfbe928c39427c57c9f48bf4baf08be440c4a1d944b97421936c001654fc907acd6483875267615ef047b9a7dabfb5cdad7e38e2fe2144ef1d0e73771521db4040fc518f487012363c1c8202f866fad5ef51cc312f94f5f70502c96ccc782b6c592ff53d3e736043ee6ce5d1422d7870af3ee402411f9f8b229105cb82b4ab200e81d9e6726034ad7a542fe2ee72f6e6ccedcfc6e16b66883ea9d833814c4ad3d37b0da87ab3b1d45a7819597f50b8e947b01e7363586ecf1bae16fc76b4d04740b9adb8981a719b6650a2edd0175e9584f2c04134bf18b59c64df96b0125d30ac055e48ae01c4ad07c4fe773cd5830a5bc80fb2468567861f60844506abfd70b26fc433e611c553bd2a261bcb0e6b441ef0ac9eb2bec2dc0704007f9c51b4ebdd9982bea561fd38b5e63a3febfd180770b15b3840c0c69f5442a6c570e86d38d4be443e19bc87d22d99f5847d3755283dedde95075ccfe7ca03b621323bf1603bfef5bad9a102355ffa0ee4e422297b0100a2f25ca29b5d90248cdb9d41a1ccd422d82290f21527217dbaba91e5b6de3d448241fbc512ff283b39b68d17d0b7c12fab878783856e020b2f6502ab0cf85522a703a912ad66eb2639f05d3b54ef79da573c16d7693d7e0c7463efd17ed4240676cf758d3891d9450a9f9f0da5be00e898c8c15969409771c54307381f7b2c9e954b628cb4008e165dfc7e47e4f52f2e399ec234ebd7b074143bab1b65af5d3358d55df3bb310c87797f840a72922ac4739e7ae5bb424a95410c34559614a15c319934d00269ed062ccf554a976869db5cda29a9a95273fc276972d0c4b20be57beaa1ae53d15af97f7497ac6a211dcb9746517ae421fc6cfa895daadffc971789681e2baee196bfee17e01646472b5420048a4f11092fe8b736653d6cabf844bcffffbac482e8ad5fc897b7e5666745595194deeb7d3dc15a7c5b010f752f486eb483a66637adec65fe09b2a720e165a4ee6b3089ed2c916c899744de786a787932c0880622f52318d50ef3db4d72151610a621ad8c018b763b8d2e02887cab034f621868422b8c8acfa6400da08a6850cb2fe2061489250ff037873209fc90bb8240dca17a181d2889059119775ec13a5d615a91c489220b1d0be44d05b61b6c3a759f12d4675b5893af8c4b076ca470afa4c9e5654d3bc83fd2223348c95d0adbf87455001ab2f01d4abf54b37ce9e0090d45297642410dbaa5e436146cb128832c5c0e631c8a635ddb215fc7c16ffddb2f0023a067eaf4c84907466379f11c50f630b013e6cdd37d5baa6ceb7bd1e4b0021f28717d6f17200677817b727b761bd0e0fbedf1eac2fb41ce2207ea476e939cb57f0af14189b04f0db8438e8611e9d58c167109cea7de766e9c1fa4a7ec7d10cb716900c186c9246eea5aa9bf8cc69e9f95284d7080d33e2db7945379b829bb32eb693e1e615595b91acdb6a213770c6ff8fa8a015d6c701fb06516c82cc2f7fbba46771b3e3de0ceda8081a10aa44317095bef8467638c39fa350489ce275219f24397861a435fe0a21a73ac22355019bf44a751bb071bdd43ce22f0135e2092075e8f3fb5b59c43c1f2b178dc8b9e2add33b18043a58a1c2b0fdf54fba4e0833bbd30588946f85174e9934b73525eff976c1455dcd4eb6649f805e85fe9fc25eedcbd7a815026e8fad62641e9b9fa71be324eef4d319d512c74cdea1c5f585f0397966917c50e1e64e338441f57e3f1cf11f152743cf1ff9c0ede0e3ef0b9ad745ac7c4458f6c24ea4a89b2b40b3830c008c4b863be2e64dae24b7098f2c798bfc64daa85020562125a3e20971659ab4f589e2d2dccdbd0327e33a10d20c29af240e5beea57b6e8c489a167f959d93b537fe4fbacbbac97d422b1ccf8ead02b10c53b2269b42fa6751cdf1784e63d9e72f0b44e469c02ad945c88302d99854167f2388669832e9877cfe8ea6ae7fda161d85ce243d2974a948f9490809fe0e831ee22c89fe6abe593644915389872bb49bc1d42368fe07a19141c00343b1961643f522f39f75144b2896c9a0656381afadf3a20cca6c99b146740b1369a2a6df94827da2b428e12d8bb4f8b43d9a8a4db02aaf5a7fe900a943bc6bd6117cbc53ab80a1783c1e75697dd9abe4f899b02e17d9436ae2f0a7108bb0c4699abdd0102ae47821ac2503c95f16452ca1708702d10488abf378579319a926fe429da962a1317ce9a6634d8b9b49a78b3e6356e97dec90ba5c0dc2982b70852365983f4e4c3590ab369578832f2bfd739dc6fbef152bd6d74c871ed744d17f4ee5a9e53b9fa19880bcc5c812086cc1f07e9ee287696747107d1d5da312ea8a698653fbbc5421e0c5554ed7226139832a11a8a8bcef63603d7cbf55d67435e5d827454a01bc90e7b6f4b0f65bdda2403d3305eba5f8f8ad23b84ee583f0dda761e85315cadacf8596cb2ec19c4a6accfe312d323f25ea82d5463257dfbcd61484c79ed5258cc00aa7b8e3ceef00c049636f144075eb4c614811dc6f3577ccbd0a01c641e92e2f57b9f4b69d5314fa39f7a739b86e346de0b35bc2120f0e861b8e2e6fc360521ec0914a398e9c5d76d0450382dac1282e04496de74fb658575a4b7491cb81443348da2356aafb19e49d842d912a0b4af9873835d97ac863c4bb8939a4411e8ffb7f503e5390e12d5701aef85cf9c7831d815a7d66e9dcf7e1fb8fe41752a682d4cd3b82187229acf88322c2e71d24761d14ebfd32a296cc83537c4e72d2ea2cd1c0981c1e521a079aeaef054db9d2d65719c620fe06d229cf1484136a074b1bdb8befe34c390e8bf8025b7da7bee0190b3791646678a8116b0cda244359b2adb6db7df4af79c7c74e2c02614403bde57e069defc4489ced10d182e1e2ac9edf6265f387f14f0d2e251d115808017951a7703fe47f020c2af48126169284d07de59c87dd5392cea13d98115bcc7d23ba272c65c036c4f16321a2ffa063c9008a38e8230f5c23b62aa50c03b17dbcc19fda401aa5350676a14a84eef13f644d0da3cdd6721138e0cc2e49257026577d571225e6c8a265cb4347df2e11c2be102bc421e2f5378c642283792ae60e252f36d84b972ee94406a891e3ffc1fcaf0a970857d8d9b1dd132d2adac4c327e139944c8d972b5815fe702e7166328c0998643bd95c925e24c8e0c08c7449a2885cc86a2ed1c0a8c916e1669f2560b28e2df43fe9073d5753fa473d4ee612cf642bf7cefab39ae4510ddc3447614e89115acc6595f4c8f27008ed6081d5f7ab4f419011a48cd6438fe5128e7331c21b33397a44530e0c95b62c17b17e41d1e4b2c4a9ab52e9ca54749ef47c770e4a4426e93c415202e858194e924ae4108d9da9a68b0c3ba22f50f2e47abd60467a4935a2dd5725899e13d51c556a2a15c1b46ceb96d53a5cbd511d6b5af2666c9b29622cf8e2684ba9e7d41285604434fd72a9a38903418fa0ca5be7702e0c5c24181929a5e9267d8960ad1f89fc53cae943819dc62a527ff09f204bd4da51085533ffa3fd6acf80ce0bb40ad44a4fdb0e6362bbd48aa4230aa41ff5b45dce5ead02de5b86a9a9679b07280254492d6af9fea3876a1ff917ee8bb126f77c631b13c24f488b8e80c1f699f2e89e7195e6773281d561255e93ac84143b2bbdf4226d55ff8f085a7d51e90c5e8572422055d0995da8cd1d369fb81d4b448ac80ff867b092767a91d824aab50cd437fbf4e69daf6162b808bd7a3eef298d96f6ec3266475619748fc0095c359ba153255d847a8867421aa3841df98bae5565d699e861c92f93eaa9e65ba718018c5ad75a0dc9ac65c77c394060de79310cf6cd9d1bf1c48389a4f4996f1f814f97911f4fa561a2ddd811d6de2c03622aede859988811c69c4348f14e52faccb78fc05fe9066c9de8a029c285ec3486dc5768c474d725e5441e815f0de05b01e9d4f7c1ebfb8781970a9972f5d6c8aa4a87c6b9262001d42f3bd6c46deb8a097bb3d60910b91c9046fbe8c4e36dbb68b72046fe3aeef3c24d5034a6a9db23f0d3fb91cc3d657ea7dd2b613344134a2aa13a531f812901eec412b5503fa79993be12f0830a1240ffb1ba4a0c10152ef870ba656cdb5a78c587871d1e02c0cd433a93d2f144cd243ec6e52d32d3765a35af5367bf0b02d54eef0fda777324f0b916845cdbb2f482d5dd8d452bdaa0c4a94621364ce85ce2b1d7ceb79d408f6390e4975e00a836777fbb5137437afee9cbe5b061ebe09fb90e5de1be89606d6e9b5124a980bcb95c3f9d03ecc4a71ea6d168cefec5d9e463bcf18722a010b25c58f7edb0032c1ef905c0a9704d793e72acb4e9bd27b4eaab2a6c2d4dff79c28db95293ab7830710442cdc66402b78c5befba953010b50acf4bab4445845c4ed4121af406cc54bce660ec8cd936fd5025c864121c2daf38a67fddd0ca1799663a1d13d22648821ddb3721eee503e59986492f93017b8260960310e67200623007500c7302c66c4e400ce6048e69ce8098e60c8cc11c0031cc1118c31c8131980338a6992327e4de62fa9b58de72aa29e1e91d04313c8b93186aabc2549ddb202aa706e4c4e38ca08c53b11e981c7b0a029e8915fd5ee42b384cc47b5c481343be7e74eea8e4ad4c6b1c486296a19401756724e4bb1186a13a60a0d2f582d3c1bbd69744de4c19f9d745b9178b962bd9a1610e877e4ed7cb0ad63f167e28761fb4446ae42e6e4d2037f9062e71d898d581ed76482eb45201d1cd6955cf5e4adcc2964ccbdc87aa5140174546705f6f374f511c61b6493d7e604d7d21f01fade53e96026f6f20e31c0997202ff8c8668cae35b28d1147e4915e359aeeae0524766542e49228db2267cc39399126318f3db55ee994be414fefb0118fe598ebd33c375bbdb871201f1f6e8d10ec1cf33f77aa9ce5979298cb45663d5fe3065ea36137d468e4acd12f33b5bfb9af723cf10e664dae4593a524548c2a9256ed30a05f1ab5385a4cafb39ae82260f45a4db6686efd1e77c336c9be2687fc46a4a151e2e024315734a8d318b623649619964289c88ec896886c20b52c4b05864dc9886f1b0983911a9a34f2d008d5c48338346950249313345ef9b0afb6fc2c9fd8404b0c9a9732225d677ecf72a18f3e98812916ca3e9d48f0d872dc354513ecc329e4980af37db8302d4e7e8ad7371ac25d67d2a2c1c92945d957d280f10b0ba64ca9a9c2953cc8bd170fdda7c3f3e0e20bf6445980417cbc11ca069b761381b1b11831b7a853245ce36d0a06e7da8ad104b6259416d2e3abc79773546b2e86b4203c02869695fbf20fa5618eb80c792efe77576917ab30ea817a340d0f23038e70e8462c63eb082d46e83e28b57a62580edad4625559aedb3fe0f168e2f11cc2fddcf7d0390c10b467695e20e46f4180675c2641108f3684da3f3312dc9d93547530d79d53b4c9a0ad0603e007e4bc014f76657a9028ea99c8634837b0a987a0d97eccb79dc108a6b2f9b7d8e7506665da1a22e05c30a81e629cca087c5c180e6f48053186daf7421502584fa239cc27ccf439d823c4bce6b3ac9cac1def470e016827c67545334d18cf906f537c68ae7c29ddee3537d071db1ea964cc3e6a41bc0f370a284603ac8314bfccd9837676aa28b6f2fc0b35fe4b873b30857f5275b5880b907c37a61f25c0f6c1b781e4c08c008a8da441db70637b503a43686458b89cf1b39234fb11f67cb60adc5fe0933b5e9780bd50819333ba20e8b5b01188d2b99787a397f401be589b2b9230a0b10802066eb133fe052e54bf3b37628eb8d30c988d8fb343ae008f956229f19a119b5236550b6badbee4fd83f2ea6115dcb344294124728d14f5de115843000d24080dd834c8beccbe767f039033833bf20dc640a88caf6a5e4c4d296ed6e03bb582f43431c13464ae332dd078c87bbc242dd7a28e3bbcbcf26b862b44c50e0520a2cf6b65e585f26c4b587bb53f4f1844b6b0050c9deeb3273410d23532656d0d50aa113d9b3fa2726d04fc33ead384c4ee42d1bbcc0bca79d260e95b46d96858e1121c035ef596780957a45d3f5a28d0abff8a60d9206d3bfb5d5fbd8ac430d8ac738b316f077aedc0f3b5ac63504b8f3973abd8fa2851faf97633832f6387b82d631ec9bd33162730f5d131f6b5987af2aca0414006a277d7c7e3c595af87d0934b2ccab93f388a60816ef54e744addd983df115e04fc3c83746b2d01b0ed19f603f89d58372de619dc79cce9ca7c177d2becc50f534d743e943383d0cfbc120be47c587b40c2c2c87e575bd70e77c6d93a56638ff6f1ab20918da420ca7cf60b541dc5ea33d22e8d1108c2c234e5694dd8c15fbac53c21f40de1c5c21d8f20d63af453f52c3b918944b080145758eb2baacb80c71d3b48f738cccf47dd256bd3fe933b0426969eace8f6a9efab30f468192b6772e253f733dd70613eacf38d0f59d6bef031dafeb423a749ced50de018a68a079b9ed937543be684eb462e76060e151275e50a19621d841ebdfc060d5f8988a2bdd67b2178e2dca046d17a5a635432aae79be443c984de9ce4914ac97e228ea1285afd50a4ec27e494c05699f4796b9fd126af7c736aaf6c53ed08d9753379884d9e35d7f77137a0dcd87d1530a0b1fe3f1da97995daaac4171186debdc931c5af7dbffc9970f1361b3bb7c51398629407238dac41a37295b4bba4a8bde3737f3e1311ca4899018cb749824fe6fa16baee39cf147d04fc5461ec5abc70784b44360208a61b113be6cdc56a087701d592117cf66d3604c30e90525781037896061e027efcd3bbc59d96d14fc9af8e4e65c6ad868187bc59ee3686843dd8c2ba9bb756fb12e6bfa838e3d6736c859d1e810f75b49d5f755f9e461124508062361f185e4061cc1421b3b6db4ca1ba5cfc236e100e2ec1ba22b5f8f28974230a574191d505f7da174d05aa1524e3c96f32ee7acc5a6657780164b7ae1a1b7a201ed3d44d2c680f6357bca5d2300b0492261b68b02feb6fd4ea19f2d86934695d252e611347939d94f891d09c405e9bde99a72707ebb27b671e6f9d250f8f5e71dd1761b187d8a95a46c9c837c37d30e0ed1f4c8de2f6062ba66115465c0a645df7d0ac615712532bcfbee238624a2bba32e1e6a0e6a25e54e9a7d1ecbc5c0ca3bc2fd13679ebc7d845a0805197f2f7de50eed5d4a1b4aac736fe02090f672e3239739554216b281d5dda8c331bd6d3861a36bbce402c8f27be116f9e282f08d7cf1dda1b5eb98c9c6d304d8125474b044401d98cfce6569782589e3c11b131c8ed64ee11a976e2cea3fef8869878006e2448112ff614bb77c426abcd7bea05789be21004e958bb5d9245d1aff207c19f247dc7803f976506800b0b64e05b16a5e123bd0a044f74b21c276416346cbedda160b3a521f4c3a061cdd09de81a5a7687849b915324ee9d8857dccfc9f627a770dcc9c2158a932312428063ef5c2b8b69f4ba47ea219a6c632ecc52a488a58fb56e11e23d173a7e745f16aca1ad374c28f02037f2d92e261b72f5ce96eda7fcc29271a35cc74d841f7e4019259207ca17d31f9638ae881bf96f5f528bd733f19cc00b8c70a3d03f3b4902b9a4dd4df098276064268c67315f185f3cc08d1a1be4edaebc0c825c3a427ea13dfb6998387136aacb158f146dea7b188bb71101f6c1489f0e49c8943db402b88462b881fd204dda768bb271166e23a03d3eb25291286336bb2f5cd8d4a473a61c37ffb41f9a44698c37b001c4a74e941c3bd4e1a11ea05332acfcff560a508c393939f848514f9d3a54fb790df6c2d52a0a584052e540ced13b4f46c8d34680f8063f6d854d7466acdc4132c2337490a34bc6e8195197ec5a2207a79157f2238c2a79f2f7fda1b95efbc09a74c93498eb5bc65821aea03051d691fbc47eab9501227906e66363043117cbe7d3167ba1c889893c5ac8a0275b69f60c22cd0042f70827345fe9643a3bf8691c1cea64d829ebd95eca5b6fae8402a4a508bf2ce37fdbc32fd66907aa2b2f0ef6fd3ffc62cf01826d79342bb1106e46e49c1211776d881c8ba2576d34b4dfd2855b71c3ca80097ed995a76bbc3c4e31079f901141e8002f0fcace586c86a5ea5ad31cb1061b07b5c06a0338acd60f07be44218595063e22cb919850a2ca6ebe7ea343bfdae7a2b3dba31dc88a814c02022f261247a3a45ec3f3261f20d9e34e9da0ba455704f69072192d11bcb8bd960002ec393095b4a5330afa9de20089eb91852da325ddc938dca79f2db7f37a1a22a670e812a8cb150e2c3214a81ab5a4c6f854a52036b2cfadebf07414c197ac89fc8f29090ea0da80d07de5d77882dbb1ed95a5d75ce1e5f8e45f5c41b86424c901b0afa8cf8d01109cba334bcfea1debfe6c2755d918ca420146013733ae72f509855d4e1ce3cd79acec4ed82452f0c13385ab16c8ac23d2e693e3eb74c4d701d62debb8d160159d462257c1df3e565a0eab6d6a3c41c01a34eb74b51c8e6805fa10d63656b3d539207d26b94b59cdf48b01074039603fa3b875d77157d9f060c00a1ad6bc984f5dfd359fa7f14783dee4da14e37cfdf8e58f96caf56af8d353878d5acd44d805ffca63168239b554863a2d83260b511498123a79f48622f46e44557027aa7e32313bfd50756589a83a0aeb9d69f713a2aa554bd6818668d06d30e8ec63ce254516f521b231882dc22521604f39599ad4cfda2163dff0c1e472d42127dac5c48122607db48fc36f58e205e164559e4f3754a3a2efe7d6724f5d1fae4ad1baadf07ebaa09d72f6615336bb32682c9deb650c13974879f077c2d24ac7a47dedbc748bdb962a19814e459b170f21f0159ac41f8fe8279ad5f71c21118658f9e5fdf9238a588f10048313df746981b62004f5d2c2e371d221d74f551cf5584313fbe0fdc69f520063c309f60660d82b27fb6279beecd76063398460915dcab30a2f1e3f90a4300e62dbb9e67a2b4c74ef345145a56f5b794e69aeed09c312c2889401625315965418f422571eb1b5886ecb4c47e921e5fedbf5c2a86d25fa0ac2ef661974398828e2b12cd08b25c86c944b559d033a979abd33f4bd11db037d09d11d1af4217e754239504eda40571d86d7d282c2a73ebca1cbdbc412dc28b6f60be879bf401493643c49a1afe7b10d254e12c9fc4aa34165697c5cd2c85cc2bada96009f5d9d8409c919c927b8aa5c5ecb1d111a2dcc4a163d9b356ca34217025616ab693080d7c23138768026cbccf06357cbd60a4b3e3662791852e4d8860a683433fc8de10469051b8710717b181947d6cf5adaab2cd50a86abc7b8fe311ffc10a081818b6d29e3a29d5dae997249cf102ac4a4611e5cb0c62fe8748d881613aec5dd680610c439f51ce12989d0aad0dac2896685247202406c246a9d9fd53f7ad0d21ea0c2602792aad4dcc57b3e386784420c6f181b7d04628b180abbe7b9211c7f08893bdda38fb465f13c87c77544ab959e7e9f0994049e5c39f1b28d68b59ce24d704d708fb57819cdaeae84617a839593938a78e20c01cfbe9825c5adeafbeb09b08051d4955748f685af74d505c920f0cf2f191302f0c07a6ebe8ddfed291d85b063219659cfb598462d872d3d0f5c0fe2aac90bc7dd73aba7fb06144263a29cea91345f57d7d500227f1507890b65bc2b33de7ad108f653e52b9d98b5353a22af69085258f5c986786f1ef8452ebd1c0c567fe29af86b70bedd2eda8ceb0d1d773c13bc4d42ec104ab614de9a61e6ce8818526181ffe6bf47848295247e80f27e5a72f0d0dc518fd24c024d3ff14bd751b34dcba21453880c2241d46da85080d6e25e9fe0c06d6fd2e081a83ca4832cf0e9580f294dae0a448cfdf32e4746dcc6647c23cac5fc3c029d986648e553d3dd6d0c80a6938607e8f1a837fa7499c1c49c8b65a88afa2aad8e30a5d833984f0061c02b7aed38b1fac1843bdf070ada0783d46f7000dfe4a0a42e30d5bc991fe9ed4c859e18066652c30a59d494f7eedf0b2369b35bfb101abad01b95e496bcc6646b6c6d7da755941fe588cc86f1eb8f0b633499e6b2c3aa1a6a24f5d33ab78bff36a87428dc0dc26034705c1498a52962b9812d982c56558cf11c0a2e2c3ab76896192375e4375d8816b16f53336abb908142da1ee94b578c28911a89167492519676b87238ba4511cd04a2cabe343f68a8f9c7af1b7cf87f9021718226c8355b3c1dfa314d4871b8bddbed11790ea5d9c2f0521414e2d58fcb82919ad55df9a2caef4a3c111c1755b70b87816dccea4e3d701505cae8dedbbc20abc5a207df3cd46e3066bf4ae10b3caa5ae9423b7317834f8a624584fdf8e6d62b0fa3e2167954bc7a6821a167994589366a3d08dac59d0d257d923a03b5d0b3fc8e1209666587ab46abff9de0a32448c55051c66653bb6ec1dc53a47ae09115773ad3ca4e7ec3072c105a083015a2601f3a96ea7c9512c0660d04d54e922306e3ad49576ae7b3b1663ee031577680896c1a5040abb904fa56e9f789039e081f0e19d646af0202327131c8a8892c15d15dd364199e67c6d91126b7066d97e713fb2e2af0b69e9a520ad19bac5d7b98d33a5abb440f6da86e1d0a0531de8cb57453f41686d592adcee3d4a77741514361623a70f40a6becbc8295044a19102919797d49c8ed7f3f214e22324b49ef298c8b09b840110fa2fa10b1f7f327b2e511fd13c0ba4205907f43737612917dcab4db9aec8c70abb51bddc534c085fc4e439fe74ae0eb14f8c54660b72262be13ee116dd845df5855d37ba35c118d0654c854dd583a2211e74b16b5205158d045d53b1ae05d878b2d547d3ce025bd393a059638d5ea89489f4f5b0e4dd2ddc7270ed51808f30a27d0b4b9b02dc38155058f2e3d13c446fa77bf0ee3079480f8d56b4572a8dcad51ca3362dc1b79272b1af14b3b418d85f4c80dd82e48fc23ea6e3c65a6b53fcfcb69a07328ee860c02b7e89002d9162977b66199beefdb20056418fa363fdb9c571cc738c89c84d96ffee6f88d1f0c14035ac22f6cd1c601b37b3bd1a963cdc2211f9b19e82521ab0a7d9f8c0be80a5cc7ae513718f51f022db7d0be24d219ddb8f5f73b6a6ebc067cf10ac5a09ff49e0ae9ec1e4e80d55968c9808e1388a50962e90212a221d35cb36713517782568468dd66dc531079444ce1235a6f3854885d5ae46d00ca97b8c4389d06cff01b685ee532da98e345ee940bcc0944ecce594cf2a2664fda5b7093865bfd06431b367c938965acd33033e030789b255e93bbc93344ce7fade361e7ba5d33776ea64b0ab93951691883b2d90a42736c1c6c2ac83ca04062573bd3f6b288cc66e0eb9fcd7236ceb71db4b14bb82170f7523ba2959934a14c359cc934c50c5719db08f14cafa43ceaac51281a4f8555580af91a0f53cc37c822eb9bf21f2bf2d0ddde98332ec27def21a31795fa587a8839ffb43d7d12bd962b0e856ede16522df1fe1d6ab886c30abe867068baa00a665f9b3934f9b05b8c6f22bd41ad1ce3ed44100b7d715f811b49699bf8cd6fa75ece2bc72a48c28825e44d0dd725d086239ee7235c718df06d1ee14b38c235b4ea11728c7cbc2d6f307413e4348e197b220307b17c12720f608633ac5ed6e9b23a5fcd881b9b389d1c1b30a59411e54e96673e0b6e49b9319bf65ca71b21b6482c608789b4f1826122953edb32c2008e1527ba7c02d60a872d8913c873169038055c7b8adda4f0adacd8d9210d9de46f0f90ec3824c30dd1b71d030cf2bc00419f03a56751575f9c755310c7ed1388860a647b804e2858e89a08590b69d957a9adeb16862c28597f49e2161a310e22c2ca1345530542d3f80090cc2b09c8f608ccc8e8e56018c8ee995ba6c461253d735755935b9f1baa128a921808a96b37fc7ab4c9b078e938f354ebcde95b7fb024ad09d724142eb6f083b32fbf8fd026c2259eab86f2c9cc05e75a03ae5fa6d96ef1865437a47a04592f32a89d1f67fa1899ec30852fda34a981b82812caac079c00d21bf3a37d6529c18b4dbaaab8c2f53073195e6bb41c92ed058966bc9980134ab751167122ffe52f89b2fa1a7696cf99a50052c38e61fe04d6b3505a994417c5f9a5eb18794f09bf5ed7efcd58bfd2e92a4256076ec5c22d6c9ac2985686890b2b7543d56acf7feb84d74435c2e91c2e2e57c5ad5e7c33a41d65be0ecc1eca252e063073443383248ff0300dd6f8ed6da093196130c089dd451a60b1ab377b2557f1ab7833d00f0957aac9a68fc0d545c176080681ac8b8b1b01bda800642fd560451f96dadfe05f0662ad4d744492f70313781d4c77076b1111024a05f3285aead5cc76bd0711a4deb665b8a62b1c4e9452c501a901da0e41893f2441fd82b2082e54570ced103372f67d1051c0e489a99bbe101da646c19eb7241348a639542888630d528f4a5d1d68b56d0ae0a6c1d936c17fd421d88ee11b009da68f19c20892744333ec7796101e020b66855345ccb03ed17d468c469bb5ea596b83c0e20bcdea04981f59260d8241dda31fa12dc30a7a905222fa44e9157dc1f54f560695c6743e4141cd2e272c256eb05159d885ba606e3d5204d1348f2c6f2e9e12a42ee68fd23130f940711a883d5c59282021d8c383c1c127548a063c555ca578fa6e8de0029f23e05b474502082acf7024bd25153d20eae3db2f0100b93195a0984f3062e71ec31d1b41fa66b0be4fec3fa93e5e0054db4b94605f01f2bab45dc1f2213a4b037af4bf466c972f212c0e7482814b497a0d963774f0528b623ed588ddf34aa387ad3a69ce85f7cd228b9361025e1b5ad19fd2d63b20f54d05146a025c97f1631a33ba601f9c228b66eda5c3e48882fd6273933f042e09b081bee0907b2f9ead74eb1b47b8cfe08965d6f5baca5899f7f92fe3bed459d5a3dd5d7169bbd7d525b5393dce7060855f515a41db164dcef10430b38c928171d42b7b759b40eb0a818dc9512fc2c38487cddfcc3bd7d26906718f2e93c42b2aa4366b0f442d50f25f065d702996c04414062faf93adf3e584462b799592158eb3d8448127c4dbca285d11029fcf61555a004a3f100e715361aa1c672b946e37fa05165005b77ecf5220bae5f64abf229b67f7280656fa53a5280441c178d0276048652b5d48cf97bf659615c0ed9b56e7c9ea35fd263a53ac4a6d205752ee61d03c45614a3e5dbeb880bc14b0f9a0c1e84b547bf29863818a5f852c057b128ab80102942129f54d0deafb3a0a3ab0a21209828cd5a751ae2c95655948ff81b58b92a6ab0d2ec00ff0117cc4fb000b9c94acb360d10b0cc9703717a093306f76d882a3e05cf6de4ba1cc2a10a0902873c3f2eba08c300433a4e1bf7a051194de27a3bd420b9449d5290ace513a7af13589ff3059a617d9c40b6d9ed4e185b3ffd4279642bc22f9645e4daf3767509a0225123c7b92ec81cb95e8420ba5f3d34efd789b273f981675e1e349f08f4333786263d28b4c2e238fc98c43b7e1f6bd50e7c6c083784e5fe0b016c150273d7ce628a1d3c3856b667d0be1b26fa3732d4fd411518892c560bc9a4797376335b2a17e2f4e32349d1e8cb03eab0887baed550a9d4c9d0e5da86a596775a843afdd12138b15fe40dc57c04c64b0fe8683c96f6a1ee4e0a44ceb41e29e12166a9cf5459dfe8d526c138801e978a9ca7c511a29f60983f3657202e2e45902d190c21f7f505cbb30b952c7b0c83db07acde171c2d2bf3508e61b394154c561a8383187919e1d7d43b81e1c195e328526ca6781d655482c8b298e5f525d61fdaf0bd78a40f8ff30b00e1c81af0e351ec361bcb0fa0181f6a9861e21251a6a25a2337bfd08733481372753f003731d824ffd4e8d075f21fcf6a815116be217813b38dc7c8c00b16fc43c2f808b9458a79e578171e7c80ab4f46d21a0b5d17f983e61fbd85dd325a7ee46ff915d9fb0c764fe3d97f5b8ce8e9f061bfb9b30b506efa10562939bf1aa6917faf07135089704bb4ede159af478e31a842d8233a7d71b3661e0700e0956820bb9765c8af33a6ce9836eeb763b91c25679ec3955c11a343cf6054774705ca6b008fdecec6bbbf369b85a58095c663a2a41fb8446bbdda91eb6aa9ae7fb5501db9ed8a52e6bc8b613b668d41f22f6bbec805061125f2e9092aabf327747297c5099d4e92c210f0ed7fb226a7687f5a2e0658e0ce85431b69ea337bcde13df907a8ad2b1d47cc2f47125c167646d5fecd105f2342124e2ffd1a0ebd0649c945439c700653e49a333e405f58e1aa1b2483bfeec994479fe8fac55c4afb85dabf9ed048bb9f3891bcd25581c3a413e2f338d4ff8c8f7b0d48493ff5ff4d4ff574b3935143b50788d8f757afa390c64e3222a866a67d3669db7a21e5cdb3819f46122f365189e15cfdc9c87847d1e9ee58d123aead3f806628f3ab6fb1b0f297f7dd5553821a8c85512e29c42c238ad67701ccf51eb706bf21c7ce459508e1dcb91632e270c3f1f2f3427e0eb9cf03989aa3b6ca3e30a0f86cb74fab4ba3f481d8aedeff65847f9fe5ef43aca2454cf21b203a77600745463c01d6727d51076a72ba6fa07df21716ec455f01c56ad6811cf6df07256c7e34ebc0c9df2f41d2f7fd23c44cacb0d0c7a944d8f5248cf53590ff80f5f4ef6c05b77c6c13d9edc9d217c4f8778e76fe243dadf1b553e54f7ce8d1dfa28a4f551d819cbec59c4eab84f91407958aa27d6a6243ad454eed18f73d01b31954589fcb432656d6fba86e514c4f0a979f9d38a4854f5c7a820cc52cdb34c1d0bf17a3fd12b6376d565015641a98555a838ece58fb1f67063d7b19225495156432db36747cd2a033fbbc4092d21c5b4dc6ebfae735a9b87772d20415b0dcdda961c76ab9ae76d384eb884c8e19ab425b774ae5c650ebae1f8e81244ae6ba089dda2937755c3da02a49597d268ded21f7bad99ed6de22597d04fdfdc8d7e85c9fdee22028c282c60921e821fe2dfed75cacbd19a772dc35e30d3f60a741d7663f530b540e2d5618995f4563c7ab3d8664cc647d019238272acd0abe3e905649bf1209f038e8c1046b28a8e9387d727db4655f90c6c6554009755ba5d9e3cc66c3b4ae653909a51816b56e98bf3f02867fb183c1f81794609fc59491fd0a397a16dc60f7d04693422d8d10a3d949ede95b619dbf43990d3082151abe88e7a7849b56db4aacf40b04605c65aa573ebc913d7b623be3e05ff1a15506cae9dd34f13cc6ebd47ada032ede32cb57520588318636d16dcba6613d75a9959065946fc19a97d2508c33ed1b14eb98c433f5b0ed400266c3623b79a0c4e974339f0b19d298e5729ec29287de0a33fdb2cb06438a8252d04091f9aea892502a37ee20830823498491684948aa8255819d346d7ac0f3a75934f30a350936cb4122c55544fc1c8a9f6f96a69e0aa65020b229235e52430daaa4eba0b100e06d664b93afa6ac6401757e29e1959c9051a94839d3959ae8ebc9930d3455571a74676128106e56c674e96aba22ee6cc609ab52ef16ea80e2c8a87b18be51fd050f2d30b5500b22a94649018c945647cb2b88a1524af68c13c8b1794bda8c11d8b1aa033f1ff9e34b5fa8060bfe2b50d4fa92a09b711dffea37112c3a6b81a2a4dbac1d2b91c2e2df541d35b1c3445cd61d2580d9526dd60e95c0e9796faa0e92d0e9aa2e63069ac864a936eb0742e874b4b7dd0f416074d51739834363558a8ec2d99cc9fc976a89c23953751e846cc3736a254c564974ccee473b4d48ffeab183422cc343352a0d884637667e5bb5cd285ee4b7c6a11a69a1857a964c23d46e7260f0671a83839cad0eafb43c6bab2fff66ad9e23c109173d2ab4f4400fe305bc866b68489641960e06772ced897921c8682fd403b628c144354e6c457fd94d7949e080fd11a44d521fd331161a414a03a1c2208966b3444e47d4a30b2e6094b1311143ed441b01fc2958476ecaf92650d1542ebe102036c5a6d32cf620a5e64edeae517572ebb7c75a985237d0fbc7c0e3a4b165bbcb4689b9354dba303271c1dbaea8c3b2456ef2eb45690247186a038c8592a430853d3442f053b9a0b924976bab272a99ac00b4f00087b1502cf2c132abc504948d2b8f448e30d4f90598767bf9ce6bd95eee729b3eee332faa37c9d357b3e4ed73d64d8b1b674a7d62f4730006eec5b54d4da76d2bfb2a09b9ae1d0a9dfde681ba40f4c60cf0879a667b2a9ac26826fdcacce65cd70f9a750ac366c9422ff7329edb4d725249a0b518849b6633944c9c4d778a4c4642b124449e60f38e3bb888951bf9505741af1bde1888e8aaca588221fcf0944420cfc284490606839830019e2681c79a2d1d02812b2e7872ce484d86d110489c11708066ac57153b3029ecbd08db97f2d23c46d83224c4cbc4a4444ce9f13888418f8518820c1d0720431c96efc160252dc3f28d2e4c5ad4804c4fc2b8988c8c133854812033d0710104c2ccd114c063a8d4546f41c1086946cfb2d832c2178331a2131ec8a025172f8cc211262e0f7210404736b700493114ff1c811d237271010232e2d112707cd0d2221c67c08424830bb16432019f8181e39d16c880849b2f9c72d3242f0f62904c4b86b48c4c9890f97065417b18ee344e23a40d0d75b10094c2378c07ba7c58aa9f7f0de4309a1b2c29337bc37edcdb444cfa89fb25e8a416d217cc5da2570ea84c497119fb55a29689805add4d7162b0d87a6268a8cfd9a254acaa5c91321733fcd82f272da0462cd489fb3a274393685286c862afb08b0ba0e8f3c12ec6381cff8461e3a40031195e2418da17409ac6df304aa3abf1f38890f9dfbb66349c8b65caeae3cc3312e85f70da12a113256b3aff2313a6da42dee8ebcbff0f2cdb6a7d019196082c6a3b7d895a406da242fcfead933d64bdbdbba3d9e204648fc3a49615582ee28c7fabc5a1b53295e3ac4974d98c7c5cef005805a004b25120fa43c1dde60885b81b522480732ae0f6f30c4adc05a11a40319d7873718e25660ad08d2418c4475b2c1eeab011d95282c91ea9469f32f6e17d78a201dc8b83ebcc110b7026b45900e645c1fde60885b81b522480732ae0f6f30c4adc05a11a40319d787571bbfcacd33a85f28256b3cd7f61f6127aa544d1c92397e7ac381b00254aa260ec91c3fbde14058012a41356f29da9b209f0f733d0b8ea10818dd3c5bea3b3281efa542707feea86543145d8d0612d52bdb3c8dada6e43213a46d47261a01a0c877adc049e9b5ccdb64ea19fba5da9d28784bbdcb0c4da33f7a176940ba97b200b6e9d4649249af27b65aa7d59e075bdd4b32ad3cfc6dce281bb7bb5cae0e20abfd81f49fbd8ccf81f225cb32005ca832d955678f0902dd2892911de2da574ed2983d5c368e215cb617b00bf32c162d46b76a14cce737f2b2448c1521560ac0ccd50232fe1da5c3e05b68f9373ac72a4237df4414678514f18a70bfb220b3cd96bbcbbd923f876127fcfd4e4d3c526f274ddec78c0d20a5a287565a474d138b5d3bd13c3f126cecc2a00062a77b44005d12f491b06d584a74d0e63aa28a7e683fe6925151f22b756975610e644ffcb4ee664b11f84f83d1b8511fab5e00d4d0d3703d52cffe3dd279f8bb6d1f3b9855f67d932f7076d1be5889c67fdaeda39dd08114f209d00a5c232cc8d08be3f9167feda9dc4f1ba09ae39305b61c4a7da6653fa7a05570ddd24ec971b5388c112e37db39c677c0b00e8476061ae7b520ae549256bd0d2ea688a035fab1ccfe1190ed9c217301ce3a505e6e73aeea5e01e9df0a544ff84e74d125d40421ac204f36ff32ff0abc9b78490d2a3052616946d48982ac078e0d1546caae0bb9945da09413dd2ee55276812ae5cbc2d5a4eb7746d506ac270d530f56df82b94aebeb0bd6d9a8c5a022a13448f7b8b281e295427084d7a07f3a6ca4e4853834a2eb297e4e9ba4b0538985fc7de1e2929d402b27dc5d0858a7b259e6a1e88a1834c2358bf6ff76d88812b83856be70ba90735be00e12405db9b4b76fd499ae9fce2adc16e5868d931950bab67569839d6b4353fbeac0b89dd365407ef948124ff8eb2e0f82f0e3c318d22d9962af239e8cc3c05c07de1b79cfb8ea8e38d1464f031e04856e01b405213b95bc4871ed053656eaa1acba6e9c5e68cd69cdee3ff736f507e6aae9d517fabf1d67fc1818080a0c47fc83ce01e533988e5e73b12106d6c8b2363d5195ccaaf67324cccbaf9bc97c9edc8cca089ad3b36805716a1edb279ca781fadd6e7d415b0929bbbb473a28e3632794757593abb9e122e3d35e2465276b4037937b94c399d8ebfe9175abd26f88db0504c969bb8efd7ebe7f8ee1273380219fa8a8eff5505eeb87aa679e6c57d9f569fbab0db4d340db9e4e7d49b6a34d4371ee0446493eb6bb5bea4de5230a56129ebf331e1e2f023bf81c7ab54586e402773efd7f6f9101bdb8413e74b687e76d06782a54190620eb876618ed3c41bb3e4ca6cff22042f834f4114d6ae1023dee8ca0b966a1d1ed3e97b1116383fb6f9658e516a943ded1eeb97d9e9a3a88dcc558d6390bc79560d05e7b2310590f0f320cd77c15cce1864f1d7f079d4cc19b40b4a29a70453f2f5c393f1b34520f381320af5b5273f0e09ab326e0674bfbf9b713888dec30b2dc325b0459aad3fdbb3f37ae78f61cee14d185419bc1a72cf6d5cabe2af0461cc50e8a36d8b6cd1d702d971645dd03d3284bad39fde399b5ce5d0409b7b324b724447ef707014c67035a9a328158301a16a503fe680f9b9350253f6be6ccc3e89f673c1754cde75de7274c4bf013bba8ba57ff21401f0837ee8691e739ae3557b0b3407e1f1679ea00c5a088e3a2923b2d2bf64a87b5f25b42628924646fb9b79452a694a40c43084208b5074dea476d09f8526b2dc912b4524a6146bf4229e79c53e7e9e0afab9aa4e24c9d29279d3aafc7ab492066d597d55a56a69a4f330b5e9452cd88ebac3ce1e9e09f3ada3c62ee84518553ddca132e0b8dc1a9ebf945439ca2cf2f3a83531d7dfe9527bc1e6fea388eedea535dffbca0ffacf99effd38c74952b7b5409583e7a9b3a2dc3320ad94e24a4338f60199e3ada653d1fb48661a5bc9cdcae8580a68effd49af4d316ba1e803a502cdceaeae910427e27fa595dfee9adae5a4668c5091591d0eb51a966518d5ed71e73549bd7b5096993f8b2266119aeab2958915027a2015e9793beab62d98a0f50ba28a94f89a582cbef38567661096c956621ecd0ede8a5178af19c35c6ac437d3b2ca77cd2985806fee329f2ed710a36d45ebc7ee1eb019f0e88b5d61765e3632e8fc15ae3ebddf06bcd5411de19dbbac47039ee0c26e3ccf5ae3aef8be1d964ae2ecb9c9639f55f4a52791cbfbc828b1fee9de6e986d23e41546888c7af389ccea17685c2f91c4e676746880b7a2054d0a316f51cff701f6481e80fc7e367504996f0a7dfd14b45529132a769245004dae1825332fe70aa31ad3a1681aac4cbaba02afcb2f573c5ebf1c5c582530d0673553c19da8bb7a3ab7829f8b8c8f2875f52190292f163046007bdb44fcbf0536a2d0af5cf71edd3945a8b423d8f5be5869f526b51a87f77e24e200f3fa5d6a250ff2ee44271a765f82350cbf0536a2d0af5cf717187526b51a8ff0814817e9a46e6344ed3c899198efb47a1accde11f4aad45a1feb9206ca457b20eec2a3388799c5c66279279862ee476a138c41e771c42811c2350c35527732ecb1cbe518b41d84e52b9fcded9e973251b004e54f87a7450137f1821f1dfbdc1ae56dd32cd2d846d2af0f5800dd43290e190c77ffdd137b8034a193d7af4ee23f136b482caed7980e51e899c467d3bb865e8f718b8036efcd0d26d053eb8572e2f413d446d9d7f7cd8587cb951eb29872c437cb851e6227c4b9d8e40ea80dfb236e79c54fb4929fdb703fd0e89763da5943e47a691e3a433ce8e1dd34dacedebba28b59e5ed765515683beb837078e1849c6da088b31d7df8d033b8225a4ff4cbba53d731e7fc8ebf162ed608df1e79cff7698df21b9736a1fc86898ef9ab5757e3b1f7c6ca0ef96253bf9f33dc7331763988ba3ebdbf319d2e2be0cc8e8d2f8437d31dd166c672fa4407d3b6c5bb87a0f460b6f3065948e909be172709163eafc84bed8096ac20f4c6841122c2e73979f13c2e5cf3133451650a60dd408e392de778d151319a3b707b97b8c33ae4690359b7dae1a50b27077f7f6fee9ee21ed51aaf163a7c31f3e33fce802162cf3b8e02e74c1326a4c29af25de1ee4dedddd575fdb4dd32335d66456438acc7b48501a4e260a90acaa5c21658c1d1cf1431057445903a787ed86b93844072154463f097951db6715a131aaace2c383453482ced082e568e4ac6a0b6d61688a1339f47241070b2c98770b4e3026ea12ca3da1b0c2b27051f1c417528c3ac58ba04ac5123c6ddd3705182b29959261dfbf79030e39a860e8867356ab950ac8e062e4d29210e7be284d480271bcbb7b48ec1814a3908edd4377f717340a3b540b35abd56a954346164ab3e6e787cf0c3f5e942c3059b910cb3fabd5aa8821a89cf2061c5e9431782e7f8c3c448cc0c8221e719f518128cefcc0c0238a1967ecdcc7292b080154f941320a98059005194c86a87133b550031e5aad562e9881cff0e345015a41283108295c81c383229c20c5131758b1440d26373babd5ca043ca2d8373d0c1de981b917e507e8f2cfbd699a1a27abd5ea043fc0e4e42a33fc00ba2f0a149600fdac562b227c74a81b8525745f9427045d16424114220cc1445e4baab005253b0082126930414a1559ac9103aa85234cf37c58655c188756ab550a6ecab8e2f2fbb46a7c5e14299cf1aae86c210329668005137c9e08029532acf0c1e56dbbe9e1032ec4323942109870051a4b58f003113e980a2d2c410b54e0a0f7108f30076f86340ddd6e7cc902b2a8c2e51bea379cea23427a3872c3dc90de86a494f11304577d002f08d0e48ab878a8015cec3e296640218d34ce589db1aa52a58a19679851c58c2a660c993134065cc2129690e9d4ea5d58f8af8a2aaa10230654a0827b61e163190da3fb987b52ee7b2b845ac3701c66c7b1dd43c7a1ee18f52c4629e7f4c2c24929ad58176a4d59081b8a65281076bbc7e88c592902a11682eb4008a133e642b6a1507a01512184cc3cc67ddf2d242446963c27a490330821846f1a8d50261ba3cc065a4b226dbe92a98cac642af81a4208218410c2debcb45222d952a9542ab9946c505f4c17ad26d818638cfc356a1d7409613bf8201448323117b70e628e9f0e8e3b458c210615c2b01dbd2e643bdacfcc53983f9cd30dbdbbbbbbbbdd319819e92a770438fd036ba4ab38efc0716c43b1fc5aa6a34818220003a2b75092040bc276260c082fb01fb01f989999312fea23d517733961e1bb58ea65cd814ae4c2f750f7029713de0842ca14270a607c613b13146c87d129b12e6c8c944a1f7ea0930b9f91dc38637760c04c336c2ec8768f4ae7c3e5ad8e9c42ebea601aef396b22201e0a80618ea8b548d74a2d61a6ec246219b5b0d69958eb78c0f04876247ac95eb07abdbcbc306431f232157bcc8535cc9e0385fdde8ba20ec93512f386a8655d8c61196ba217b127d82e807e30f71e1637f6885fe61f056014835db14c851de930a819c13053a63282e2cd9d60e1d661a291253d197da57905ae58a20ec9c5ec48a4aacfdaf748a495955209061e33ef994c2716969616930a655d5cacea25b3e1fb9e0e110c0c0c0c4cf46618f84e514e9a59d955bd338622118c09eaf3d7fe9ef37beeefb96f26e61eed39279c739b74f6494ed32b3d4a5728a9b3c0d9e09ec3376d953da975d591c60596892c186456443118d6847d7be80724a6acc0a8ecf7b29968f49d0d1fb87590abcfcc590d315ddd308e39d8047c6b46013f6e1862a487249c624ef1e5cbcc2930384e8dbe1f8eb6ce24b2725e30ab8104f79a17f7ae1f9200e1776cdb01462803e450360b12c39c0d0e3661bb8736d8cc067eff1de09d2f1f37941f7f468d7bbe38659db4eb6649ebf5737ebcb5b9f3e1873bbf5a986b0cc49d5aafb1c6e5cc8657d7d7b8747b4f47dd3ae738756ddfc1a971101870e7b60303eeb4793e343cbaed007dee9c9c8fff214b94a4bea669de8640f950c2dfdb10d4871225fd4aec9379cfdb53d29b6d19f84a7883ef034316620b2ea005e40789459837981feff226c2b11f2f0ff03292eb1a7f3ca2be08b0035d78e19412085df9d1794a09a8dc77dfa52cc3cf908cda4e9e60828a27a078020bc7814038e3720efb3413a71e136c409140020927b5561d211abc874fc77b4ecb3ccacc8ed332efa30998b9993b3a43cc99b9991bd51cbdfd4513787333b764e6c8ddddddecdcccedccfdde7bac7133f7637ecc0f8b42f38b47d572ea3cced3efbdeeee7e19dddddd3dbe777b7cefbdf73ccef75efeeb6e3ad9a2dddeed17f6b2b77522108a35b0f0bd85b2eedfdd5dc55b6beff6fe4da4831d2cbba2b8a2b8a2108da2186551645164515812a43590420a29be9841c5ac27d613eb49267a22c29e604fb027236b85155610c1c493f7b8af0a31586f6f5427c6a062d613eb89f524133d11614fb0275856f3c4a793345407ca3c0a03083baa735de7e1363f19977cd995527b94810f3c7613241229c695f6e8038fddc44ae9054e944aa593c9648a91a53d32f1c46337713af99f3295bfd7ff626c698f4c3cf1d84db044b8535b8a57337bb64f94f161ef558fb55eec538099aadd37aa13843207bf1bb36e10f293030e403a0c091a614e1ff0c361e6d90c35cfc75692b4a4305b58c86fdf82f48d32caaba1581216ee241ee12402960f7712c59b70283e766565a5e44f47a765a2946640759e0c3f35e2d9c0097346d8acc9b70c7f4b31994c2c6c03853a9d4e2dd0642d0b96b2fe2c99ca084ba68addadc3a9f7a20e4a47670896ee5caae3d3825d161549f9b0d58a119e65f84e6a6cc112ee96c40e6ac0048d2c10f10424262023094220c28f0c86a04409f46209030f67c1c543032a57e8c10d8238010ea0c878880f91201d88009520d0cc8129811392b04510860004168088502311d62c8115aecb58ba6f4a1128b8d97d538af8c18ceaa49b096b4261b190375cb79b8951d43899e8829dfe3033334b6666666666666666666666666666666627cc197ec439e79c33c61824638c31c638e3508c50881b18dcee30f06829eb4d8c31c618671c8a510adcde3f7c66f811e79c73ce8e71ce39e78c73ce38a38c42dcce3de7acb36e42628c31c69e7d7359df5926a8c0d46f7a183a126fc0e9a1e48b29a814810a5b1042127800852564e5313743bc87212a9840e366b77b4117c780858cd29b996b66de06fb80de47c5136154513906d6ba2624dc1794040cbc404208142ce1e3e3fd3b552803fb8e7023b082222ca105501a558ce1e3fd33fdb812aae46b0891201d7c23929a4774c1091fa4208c287e9270828b283943e0828beb72ce79d3eeeeeed3299552a858b1cc9055b0c800c3884bdef4d54489ce39e79caddd70596498716d9b10e66e5a8a112eb3664862652cb1691871cd39e79c424615ee94c2022a6778ccc0c083054878608512385aa021861298f0318d7027132cb38c26ae6a82248480041e10b1022bc4f8d9a20c9d27b6b866a85cc334250aa690924a2aaf1f2244527a5d65f8101f22413a1071222ae003842da421b4460e138a50850a26c68842d704fdf099e107c50923075e34e184215c71c5eaa78ca027c2b8a4a4418460c8890ea400a5062c50438b2b74810328321ee2432448072297943ea4696a2495b2460e4a17cfa039e725e5471f72d129a458e2cef99453f5e79b38c53f64e69ca08a1890f1021e4491441322dcf9f6883bb9b0c19d955ef4a2f26f660ae644f28449159230c41249acc2f031b3b873ca5009eeb4e2cead13127d880e375b0f426ec021871400f9bc8f8a27bab87d1f154f38e11c5b48ef76f87f23c2eef6a674b677bbbff710b6777b84afdfeb396150abf7f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f47885f1047d752fb1f0a3d5dddeedd6e7ebf7dadbbb7db6773b6d8b2f5831111d42f486ee9b019e0e865b0eb8a3df1697df153a502755825a5717bce974e931faed6077c5b4601f7358d66bd8c75c265a42243fb648a8ce51bd6488dfd1eb773c8edf4a5d7e014019e4f6e08eae0794216e18783d7a0894c1b70777f4e601bfbcc5d0bd9fd93bb8023c9a210818c283a0f6c8719c0cd7990dd6e90f364e10c8382377bc1ef1f94611b8017c04ada349c03938ca29c33d1d695838e15b000ef531bfc9dc7c65a19d943aa16f8ae2cfa1d81811a59c0a61d5c2cef9f3b6a32e4259f5bb8b6037307f6e91f71e84f3af6756b98939b6d11616b3ebadccae4f59ebfeefbd4fc1beaf69d78c4cf64c5539bbbe6a61f9eb14d50cbe16694bcc7b69998965468ecd88cd6a611042f84aabd7dd534a593578fd4a59ebadfa56a6aa6f5999cdb3ae4c0896a98c6098ff7bef3d7feff97bd9fbeca3a8eeac9cc131f08fba95a1bb32f463bbd2cad0e52f2de1d4aa94a484c329bf34fe59c12ccdffe732ed5ac22cad5eab35198d4cd689deca82cd6bab069f0eb63429b228a69665b960145eab35c17e54c2b9fc97f6222dc912fe42bc8f52128e81bf662adf4aab9faeb4c329242a8f125866735dd7c2d69da763347f766880ce27ac6af05e998df99e8cde16bd188e6c88e663f74524849d5a5c0fc07b6ddcb941dfe82b5df186112b53768cda12d0bafa07caed268fbb53ed4929638c70ce395fca97994ace7f1aa50116b6c484410c562961855766437aebdf0af415087164aa68adac7cad10420831138426cc04b11613f62d96c94b8f3d84903e49bb329b164cb6b450abfe84b0a44169d2ead734497bf14994a4bd0ba1dc486f3d6983356c41af752b6d1d8c10420e92482412c982d6c21cda955f81b62553d92d060b6377c4087663d46aad3faa293ba2d68d2ef2c70fe6ead7afd8129ad37714b32e2bb35979eb6be2d7181f5bb265aa68d1da39b596dcddbff458dc4ba59cdb59ced2f2d2a565eb986fe96bd872b73c6e169211501b9f623a4548efc38d6ee55b9dfd237c650db36026b0dd11fe97d5507a125fd2926b9b6a356ea527d95290d29362cbc777a6417d2c7d7c98d540da3059fa68c5ad8bd1da68b414cb6c5c3e6e45e293beba489897cbe52d98179701642a5a2a954aa512c996e4c7ec5d6b9f45a38faae9959598d3b1e4b164f9cbd1b6f2b6c8ca474ba3afbcb5f926357ffb3427c7b23ce96de417b1b60eba64d94ed69b2cd2d6b92c511c998aaeacacacac78249156ac15cd4b4fa966437fd29fffb212fdf9f3e968256a9d5f5b3303a7ec5792f6ae2953599256c39cad23eca5a4180e6cfd8e8a94d8f9a63adddddfa594ff7690d64b29ad4d6a2f4e19e3cb9fd1a547f79c95d880a1fa76d833eced947def991e3eadc9831ce3667ae2efdf7f0dbfcdbb8e047353a944ae3f6f98814a451791992164c853cc20e862fff741eeafaccd003355938c79cbb619ba86b9189f4c3183a1dbcdf8702e24589dd8eefd08891cdf76941667367f316a6d747b14cbde9926fbf82fd3687d0cc3b6ae6e345a7aa7352dcab64cfc199f462ab6b377333117df32175f0ac1ca33c078f18140b91b63eedec0fac7445ed51703e190d7035eb875631f99a184ccd8d6c18f2f8848cbf8d3ba75d45e5b67a516b6a397be3f4a3e8c846370ca7a879b3fe370ca4d9c12aa813a30c29c27ef51c29e906ed18987f1cdf7bcb8fd615c4a061ab73f42df7cbca7a393a82fa6a33f577e6589dff13b7eaf3ccc542c4fa10ca6977fbd1efdf2eb4ba1eabf47b37d676f45dddaf2f5515a3faee54dda7b3b5abea4b5fca6b574a3dbf2adb5e0b8cc95ac12f3b8973a7d7f8e973af5e95bfc743afde9c693fa25002ff10350fa97af24ec318df636fe7dd5b424da0bf13eb46d89966f7997b7f15594a96c6c31d8161b2dd98f775bbec2cce6a4ddf88addd0e03db568ce82bdbcbc3ccccbcbcbc33cec110da3c75025d3cb9769ccd54c52b316cd992b7ddfd03a784f5f596edce81bffdf5f4d376e7cf6e3dd1b5f51367c5d4aa5e7c16fff0ea3db9b28b3217e6f3cc05bdabad19fbeba608ef53fcc6c4e6fe35f6673fa7eada505ab2d1b4c90d3db781b278a04a7605e3ee5e1d4cbcba74a70aa3f7369e1d4e9e5b7d63bccc97fad91604efe0dad795a38a3e18666e3ab8d87281b4a5766431ca96c6c30416efccbbfdcd82476fa088000bcc3a0deca6c881f808d077801b075fda3a7990d2598adeb377d4db7ea64437b576636a7adc8e8e71731fd11784b6f437bb7ba609d4b6bafc7e8fbdf69a44932a0c77e18ad75b43e8239f92fa2efb82bff24bf458342ccc977d12018ccc937c92f69b00be6e4a33408241ffebc1e3e68272f2225167671dbc99572e8e9901f95b0a76ff94e0eb5682bcfa24526ccc93f69518739f976d4a536b5fd7ef868e450cbc897434d4d5b474b5b67477268658b39cc49122687e0578946ff10a71cc620f1e5903c4356793d5e90f84dd278809744d2de1d7d26873a54d53c302f3974651773ae7cfa73a4296d4961d81484cdbbf02b84453c4e7d3bec0f5cdc27658d3166ee9b5284116e1dd108a196e1d65d9b908e4a1aae65fca3101c38f5fc29fda14148d3704fc69f721032b14984781ff3e7c3948d5cd3506aed7376f7ea72238c39984bd926f42bd6bd35991bcefba074c3b61cef3eb1fd53c8608c1bbfe36016e30f6cf77eba1774e3c717e2373e6d1a19a70960627f3c006fc7c11b987321ccf9df46c2f6bf21ca4563eecf992f77ae5bc765ef33535d17bbb33b3b650e3e4ec100718716fde91032674aa849e6278989d0877c5fb526f28f803b4c3320382e8494524a19b611d6ad6f1c58ebbbc219b7aeed3b7be6acaf5aa6ba2eeb35b11ddca96d3df481523885c15b99b3d9049e0f09e13fe67ca34d30d71009e678e5a3a62c8e4b2407e6da855c88cde4c0dc8ef585cd8169504c2e95258c824978a43173c61be33e3072e02a581e3c666638ee8180ac2b582018ff47c513675c7fa8c1f8e6ede296ffcbde2359e6b871681a9b1704b1ccbb2f1062ee5dd7dc8746c22d0aa2be98f7ccc91b4f87fcc6e845a977ec186313466ea8d6c5586d592e7a4fc7252408e883b44526ec9b328534eef53370ea05ddebe5c3a0001e573e91eec611d48dd7035ef938702abe7c548e23ace847d75fdf3da094b52e8d6f604efea535134bdf0876af2762e4a652ed06e6b2bf341c98cbaeed01cc65fff5afaeb4fea5d5c78153ef4aeba78601b136678e5e4f87b0359de3ca1c36fb19183865bdaccfe349b9b2d630977dd52ae7e054f79796fd48b3ccc9176926e6e4370e6cf61f233f83d4b22c0c7bcbb2b61db0adf37bbd45e9776643fd0bc3b04aa735e984ccfd95af2356d0c51ddd37450541f791ea8b3db04fd6ce827ddff33bf8f0611118e10ea34b9fdfeb9159daabef661a5ce3625ae7c30f407875314c74238bd6b89806936d34601fbf08b6c10059c08dbf801b3f6e3040bad7907f045eff6bebe87d2f4898bd05f5c5741e743be27898a96af62208e1bf1de05708256416bda45a976d1d74adf3cc12e9c6e873ef2ab136c2360eecd53bccccc329ebfd67fabaaeeb5d8b79774f59ff9bbfd837aab3236cbb61ae3f66e42d39227dc3a9d78243833a1a640297409ce61e15a8c51bb5d0a772c54b71108fb3e2f5f0ef8754a00c924bf0641aca20375edd68282dbc31104f477fe749dcfee7ec9108b6e39d1798af6198d948e797a958b4e66999cec2ee6061e1bfbcb4fff23053d9fb02a3bd5b19736bbaee5bc75febc45e96fd48eb6eeee8b18a8445a277ec5ff696dd5dbe4c6e9efdcbbfa870f8967d4d5f1c5a1078adfd91d6f1bf5cfb353bd77fab22c709a77cc3f15c0ddbbff0f09d535dcc0fe0e1d609e079739ecd9dec70738b3090cca10d922b5fc4228701225ff436f245f2452f829f699dfc977740cc8b200037911200bc7df8823f0effed6bd43091d6dd5cdf60eafb4b98faf069460353371a908c6080d4cfdea67e36aabe3973f26faebf48ebe40700c63c7d6c1329b1743bf20078cf6c8879b8158979d156e485872fb7237e63367fe15fbeb320f65fd81eb71de9bbfd003617c076a42f8e1a70fcb675f0e2781c95c22ac25216002fca543658fb0a452e9f3ec4b17524b8a2ade33fd2d09d38d18ef475cd9d388f8ff55782b97ed7ac26eb4b4dfb17b4eee6bef09da9b4af94639ebe734a4451f02b0e1b70c4fc630ebef0236deb9da661f9a694651c80e48e44315add8a689a7c59105b8375eb6b54049f04e19f34d1d77fe15944ff42fd22f5315bab632fb3116d1d5fd1c73cd5baef865c0847d9936836b2978e581ec793b4c73238b6d146ffa4b1688f65b2ad4335d55e78d1e86f7c0cfce601defa22eddd17b4eee53d03823dcc82d8c71ee3cc01483ab3a1d63ada6a7d50935feb8d2803221ffecb449b08e7b34d84bd66531fab1a5f8afd53981fef56181bf8b442df7c7bf9237eb77ff9ed6adad7740d6b9a7dad13725ffe86d60db92f1f00adbbb92fec4a8c321500b618ac8dafd903905c1bdb11bffef5f100af7d9801395dfb30da8bff5c616180f8d7af5bfbd8effcc7c6ed434da4514a21b5c276bd53d35683cec3e33c5c708a07f71fa0fa5eebd74c559dceb7c60603849f3e752acc490d420861cc5b613be7c9dea1702afb7ea7c229ec2914b751b70afba6900114b78343bc6a1a4885ca0af20ac2214ef1100d07e6a8344c13961cf0f00270de070b8bf3b046a59f0a8b6817e3d03d66aa2627ce54b409cb86f33e4ef32429123b1d3ffd9697f0254b96ac62b8c32ffa16177e5a84be0ba552caada3dff295b6b8d016972b53b56c315817171c98739747a46986607925279613e9a6698628bd9295d2ca4a0f4d3384e995944ca513cbf7c355d30c817a252614cb9b4e2c27f92c7f7a96377d3fd4e114a5e91d0e1ec1a3849326a04071bb4f268da449d1cb67293f65ad486459f2cb29ba70652a662b53d148c5768f8a532982bc7595aa1cd6dea1d45a2a165ec83b4dd339b8fd3db8fdedc4edad773ae7b9fd3c4a6846883017a9b0d6cf87cd17ab7d02eb2faf214f877c7f7e7e9e96cbdf5050299eccbbdd88861834f164dea55bc75af3f44e23d149d896fb6ed73b403470fd7ba79178915bae6f41a25893040824e2e3e6adb33ac63825942ee34b19a3a494d2f894b28c31c6fa24dd226f476ea2fcf831c618639c52ce18f9c295e419438a7d728a1f2841d923126c49733bfb33b7672a55bf4de61fb079d7379b777b9bb093a8f2eb5b50b0392416b31cccc92ad231186386b1c644beb070eb2e5b62582e077372865350ce871ac7028be4be191154c065182ec75cb6515d3e3f6b6f04472317c1cce772d4a29efb19eef6d6f1b81d47843969c40ab67b423638d5ff58eb62484c22b9e8d630ca8504e18b321524225f6b6f8a50cec59e74c2d64f7d3bfcbd2ad29230a55b13d1271189688c4e5fa6e28f919932ea32a594d6b48c7f1220983ca0183395f53153d13adb79581a3fd5e2db78006b426e60ce7f44b1fd987455f6b08b6f0415eba4941fda5c4118c8d58f6d3698a38f69f55babd16660ce9df2a8699502ae3f296d99f3374561bbbfce8306363845b7982877caf7200b0a2d18e3be29453471bbce999e73fbe7ecd856d794a53e62005deba58f1854aef525eba58f1850924c3105e7760ea79a9c1a8b5a876192e6a4925a777777b7fcaef4a38d73be7398b3b622a522f4e55b1990d25b1beb3027dfda5a87b9fe99016981a5df59cba9ae5b27a7995452a6c230eb5f27bf48e9e957b79e7e7fe93bfa72a3d6538b96348ec29e34a9d39dd47949b72272631d262db0a5ef3aa7733865531a8d9e8ebe864bf1fa7d1910b85ab18fcd80583fda4a1abc9594d5401fbe1df4491990be2bf4573295f5d584751684bec99405e966d8a252896efdcd3971ce2f61b77a8c9607a6653973d9b30e3c661e63c92f194515dbbad2d79246e5088e468fd5169820f64b5fda9a9cde3ef6f351f65d9a9cbec22c2b61a3d1fc8a3a6d3ea07c2c114b599092361f93b2a3f1b644295b3220f1651cbdd4e69766bc356273c619e7fc181fcb54f2230df347f56f58d49af48666356d6acd84b9e8194cdc82c43b7fded177267f6a7e7a4b6b72da9208f13e4e7f7aaac1cca7618a4e13d4bf6c996ac226a70de77da026f07ca0369d66c2dc497b3e3a87b99e7f3d9df033d5a439754a6d078bb9d1530d636ef4f147a3b781996a56c66036636c91a3955f79092184107b10420b2eb92553a0dba8d4ac598872142aa20100000000a315002020100c888422b15012a5b92afd14800d7da65070581cc8a230465110841022c41043080006802120244334ea00c54967018875b6d58b55c0ae2ff8487cfd09755f91c47746cb7af41b2aab27080257660ba95f26053e1979baf8e32bdf612d5e5089d2bb5e053e6811384bd26e5ba3a5b5d401655f0e45422940983eacee2d41b7b37d72c90f7ba48d4c0f11d699580bed33415032fa4e3ac8419cd4c82435d957f6e97961f8bd82b6e190524305aa88417aea54436acbef9620b578ec713f3e5e52250e38ca0a0f05b036b45559ebf3a0d16c1baa7f45a9ccec4f2c547c4e8399b4d4cd131957cf50a7f721f76c88edb2ca298e39eacde01aa6d7a337300453a7edaf20d6b3d162fedc01020925295179d1aa1996c63a4b7d0ac70bd1dedcf2517ec8ffbd9980df2922c218f006506d3e254079f01bb2ce800cd1a370bf109d6310d6819b7c581a94250aaee90ab1142c727ca517c1205da9173b2524d0cf033b04aec17c814d89414fc224f059d3a7f40a2f5e664e24d483ad97bc842b8d32571e79c01e5321538435fedaf18cf12b6f82b59baf2e83c9fd687d6e63f0970344a66e80ead622558c5536a4e7027642b0b0d2fc7f19e8ee6e62e976af0e436e0e872bf4053ed814205301d7d03e42b95238b4b993b5fbfb16c37256fbf6bcbe004350cff1bd97a3a0b9b81a0224fdd0d3f3d9aec9fc7897590090eefd5d57296bbb14725bae1ff1cf5cfcf276de7cc28636fff3cf812f5d5b580ef8eb10ac84beb76d91667a185cb5397c2426f1a2f40711b7e18a6f441d2ed58dab4998cb01faedf0c9c192cada2e05ce34d6068c27e01d869c29831c37ddd6869a6f28628126898f49270b3a2018a2b8de446ce7ce4d904d46eaa956031dbd5341e3988aa65b02f38d0b23d4dd7fa24f4e2398560ed79b92f808260f2206b3496da311564fa0f36719eb5f34663de99d87e2661697aa5ef071ee9dde13a4d0976e20d708116c74d7042c5d6a70446bd08a9e8e025ae56ae50ee231bd084e3471a5103db0f34a1401c59d30976ba53b012de9d18ccc5510f2f011228427023a6b30bc27a4dfa142e22f1afad2d6eb64b98aa9811c31c87b338bce01dd83082070e7e024d2100c7352fb43f794552c4af56a8acfc4334fae7bbee76e191c12315e7cf86526d887686d70e36111261d46be794f04e7272e5865eca9c53bb96191c17c02f21055867d2154ea28979fdf9328d6939fdb2ab5acfeffb0fb9ea8e33dfe053f2660fb024ec6766f972da92a187441408978bce736c167398572f656a5aa3016c7206f7e5ff856d44664102e3e7b9b00ff22e06e2049859dab95400ceaf89e94700ecd7ee93f5771c5515542858dc4a36bcd49b699860f378b619541bc53427cea348168de0a093b574d3af0ffd4e26d217acddd00f273cb494a4cf9dbd285a2f4e02956a7c7a0ccd552c335e4318adb712d582565107251f9f9b4486b989399537768dd07c68bbd96b1e1ce8742ca866f4826a331f6ff7bdb45904abe09991a66fb0499b724fe86d8273d0bc18d8e0b27a6d4a0865981b540cd98ae076db16f4242dc86597d5de1434563a17650e02769f3b2f4051513f9d3e94369ad93deae9f087c507ef818dc370287a2571f740b50a540663b07d4c23d280f28e7b2eb0272ae253cf965281bc3a947b4f9f0591c9a6a3623f7b779a399b194616371df1fdddc9c16a47e93248cd0fe382b396a470ca71ec602fcf4a74519f0da23c6c1efeed8e140f3a85abacdee51bcf946b66b16e81b165d5c69fb87f03e01ca876e506e02fad393e2fd2488adc036e36847f77b5883f8f7c08c79e6db27ced74e2f93184113e5035d77d5edce9ceee79263144010a4d57dbb7e869bdc09110ea78efed83d942510dd64ae4979bd3a488e84cc7e0491dc31472a74113f87f402ce98c6308fda41d3af151cd617253699ed84936c55c07f630700cc5f53c9dccbdbced66ae7cf10e31e00402d6a42b852ac373ac17deb0606b61b10e853a05192ea46990fbf346db4c6ba18b584fbe2864a5a2820f225d72fb9a503b099470de36cd5ed8682630d8f31577106cad66e1178784e6f0a4ddaf3cbc563e50f1042cf3f2f4b021d3990e1d42fba43896a1452894cb52df4273a6e34622020461ea9660e502068b15cc700ea8ad80ca8ca4b69641c05a238c5be3fa542740ca9cab76bc22e0f7f14732da218e93ef22a4808c0306fd1bc77166d314311411268352e220ed19bb506eafa026b35cbf7ce1bc9bd7d687a1075c42553111c2aa4581cf41824b2f92cbde422364e174c8c0d5670d5da7bf3231862eb0771e51a2ee61dee9ffaa2946716739cd4239c62960081ddde2877b12290b90993adae84d3a1ea9b71c649b95d60f4ec12c7b6c18bebfdaa567292b0fcfd228d5bf01e6061148fb59e631ad869f2d8058468f3d0f6b49d55de77347059bbecdc2cc04493492d90a1fb80b68d46c3fe047406fdd631832c2fdcae33702eeccf1a57c15adc8c88ee098d2285892ef8440042e8f6e972c1ba37a971f03db666a3fa78ed9843050d3f12bea964bcda389dc5b4fa0a180d00bc5f8fcd6a2103d690c2fd9ec4aa1edeadbac80b8c2cc9adf39294352cda624908502e57d0e590b658abc9b57682857be52687a5e92c271fb9f72d913804cc0883a0fbe6f7e78f2fa790916cf869a7698c319f0e5f6e473855041dd55325b9c8eb099782fec920b83d44b4e1e0a83800f542a13b28532571ffb416cacfc957113b1a9ca79d2a89ab0ba24663091b3661d45d6ec8f0e78f80aaca69864cd2ac7926620a76f82ab95af8ca3a46373ef7642c190f42f0eee45be10b6f83474ebc726e6f718caa7185b8ea5649fc463b3d909729d6b834648ff504904abeb069abbce74907800fb7f2b5c6dc6db438e4a5e88d9d663a5511684a8abbbec3844dc525695852d8c119167247699ad8388c99b460a13b8cc6fdb05ad2de2c334af183c9862418b3553ef427a1d12253ac2e48e4d989788078ffce7dafaf4249842f63eb59a3aa45eebd5da61ee7d2c16a95425cdcb05dce1ff7bd209b5d6c581d6f8f647443696f584c0c07216c623eae9675ae472978290337d05bb07549cd5fba1807bef44313de98832192ef8d2c4d062e19968895451744f0edd7d548c6dc07cfe5f8fb0f572f556d1bc1ce5bf1d264a01eb40c6a10c4142a580c86dfa7b4d15de5a2ee9c24d164980cd2a5ba3af2dcc4e552a92f52d72bc6a9133dfec535b2a121ff6bdedb960b0964b2cc21f04470a3e9dd88546ba6398eee5f24af0a7b5c5e4438248f7f312e33e0051ab18ed7fd36b049b067b7554ff58852f37a55187738a543b6c2bdc045b49963497c534c87bc4ff78ec1afd1640da565de615c5e66af1b3845dc6875a725cf3872abbe6104107c8c0ad8e14387d64bc1e432cd49a6d11f83667cab526636fbaacae506212f438ea7ecce7f32466740482af21e2e900c09be00238809b29930cae550bb74477eeff559128b7476a8be9bde21aaf7aa109f0432d11c0d0aae69d64ae55cfa5e426b81bda6d16d40944b79007a0cac389ea5989b7f263d719c3496991eb8f0ad0672703620f414d4845b29387a97fd3a412bd88534539fe412d0d2befcbd7d120384cdbc6201440dec1dc9bf450567b8b033ec5e37edf0657783c5643b66fd0f81998d8b7cfa6103132e50daa29ec9dab9a1db7a052cd902b55fe139e912351ae631d6a01587690da88e3cc6c1f7765004ec0e218546a96ad8f0ca42f8d7a429a6c97a422aefc4ee7cdb42d8147b1dda9d0f8915d7b3f5927706e0626ec860fb0433be11f5b18c5852ad761a8f39aef58a28f39f0194489bea7e3b5579c9e9d6c57d18418ea94ff5a41523a77863f68c45a18ceb68480807113448924f34149a16c4aa813259576f8386c2490f3a8a202339be365b0184fe7cf630a562597eb191ce6c4acb764d8784db1e2c0d0aebcea44101c3502b32cda65fea9d284cae3cc2c8916d3ac9dc0ecebb39157d5bc7972190c0ddafae115ecc7ec6a25b8c62b478d7c86c06a73f53923f95a61283ea689d2635f10faac8150c9d7eca8ed81295c96fa418f4877890f525d085428cfa7f2d9a7ebcfe02b2ca5a6ff35e5b0495a48995af09c0525145b4bb9afe5bc8b8b3283a060325f5d95cf0e9b5d51a9c699cfa2b7742cb9ca14ba8d75317b30f8ad295b14772ff830d6c1f9109b9c36a277b06f7927a4e51ca6bf6498c4dd2cf9c8e73b09f44cc4b005f43a0d78fc1fe14cb0fa55a3f8dbdca2d1b353aef9aeccf949644ba3c7acfac75cc221d2c009e15eaa38ec6cd498dc0161f598bd65d9dd8383e5e65ce08923507db1ece630817e050c35ca7f3133124681477336ba317677cf321b19479b00329f0eca9c089effce413039a5f109eda055bb2433a767e4d1a02a30541df94ab165e87d346479ea038f39fd08a3e003e0ae10678a24649f798a3b197f23e04a87edc68302c60fd4b842b8dd221119aaa9767ac4415f17f53179ef1b1a53bc217e49950131d4957cafafb8ad26b8c23ada30332d386b553cf00098ee87e0f33fef09962b68cde36a3989f916d9c0c9d6e80db5d1247c0eeda6d373d3d4ff72c0aa3b34c37e770531ad280d10c1642ffb97a9506f0defa1d74ebc99a5c64e6c03caf314eb0bbbc2a16cf60e69092c34c6ad3b5b77931c44ee2402b8384ddeb23dbf8cb54003d86358688575c7129b97e04e6eb88b8d51681e8e390dacf0bbc2735bbefed0a03886d27c808ffee0014950b313fe874fca0f1159b3a97608a4fae728a2c03ed69b51b90d0fcabf11bc27c2052faa26810b8415b5a4fc08b4c78938182e412be58b68b8efcad23ae761c2c0c70aa4b82deac3851d7681fef3af023046273332e6e47133721c7d366c2a6215404f32ed13ac4446abcca0cdc9ee522079d1c5e66dbcd5fe0885d970d19a292e3d28a04719d5f457dcda6c6f9543abc9f453bb85c7370f9fd54ec2802aae2417f35c0e89f2b67c61e69cc9b37ae03f386522b8990347d5b595390a93f05a30bc117247b0fad17aae180a2bbbb6bec27aee90cc4774ef86c1e22b28d42df8f6e5e454f26bc2d264ff0921ac02fefac5492c5628d091002f537605256683de3634b3e6e0eac4f3930400de47115cc8eec7f17f5c5cd9d7a8e2b886bbb1f6182425be4c6aab484c92a9868af7049802784c1760cd9365a6be6dbd03dd176a2b6f7903471b67133c2dc86918f6010ae704ae31eff365a103e986bf278e35aed0c15379e318b69c964100ffd7087c3c8b682b136a04308c98366d9255ef416821b21c3653d1fbcb784996ff64ee160db2659872e4b17ea205bac9220bdcef7ea9d62953231066dbd0f243266a3880ccb1e7d21147fbaaa300c134493919703bb3c8e731c693b413278080373a04d56d5c539766e461ccfe77981e286932282705a3e58dd890ee3b4d30f089b0d294df409fe32aa17713991bb27ebe621e89ecf71ac86e182482e888f4bbe087a506fc94c7883d668ce10c49b373474d51898934fb97911da8734244683cc89ac9b28e4fb3f4e938302f36e6276b6d904479cbf01a0b94f968d51c2eb905cf9e582e434fb90e812b4d877c2db631a2028b2034fe33079d2898657b6dca438efc58a9a0c40fe4a4dbd2e01082e0712f2485569bc4a0117e52d5d2b00d6dff85573d95e4c9e9102f20d543bee16a97c0fe98c0511268e6c2758f189d1b7bd4d78253d5eb83177ddf0dd143588502e00fa27e30e33af3a820d3d02e100cec45a5c33ef01e63cbbc283ffad616203963ba49c09471928e5e006b0b4c66ea7b5d45e0980364c387638bf7154510032e0e660f38059fc1200660647b4f8d865ebfb4c9b4124030622df42578b1e610ab9d9ace7344080f6ad7ad8f0007748580c98f6b32123252835388dc0863b4f8648860934826210fa0cad825231b2d28c1500c87bb75f972406d81487027c210f93e7da31a38b4283a9a606ea35398bce13785e98ca948a5a59591fbbaee76fc6adb417f292f8434167acdb47438d403979d6fb74f3fdd2d4aeebf535ac6800095024cfe817eafbc99bb6484fd30c20b21d40a28688a4bb6fea313ec77a78faad7ef992b249a253d41dd63fc1e45a1b7ee1d4110f52bb2eb6b5c45e8337da067cc7d9bad4258aa68caf3f6f15a6e9313f1f42c2d0275267b234e705e171efaafe0dd7d8051ea85d6751884e2437f187b2f4dd0529cbe80d8bd8b8596b2023ed5978d60c664ea3a352e6548f8db080becb1a2aa55e0f8423e07356bb6eebee24a32cdf27758465cd9b6d04afdd972d6c15e74772b371ece2769d626c92fc7c60819ff89a8d0645a43a9a4185aab96045dcecb5c37a6c8c6b61d703f13639936c23864bcdd7d605761848c9556a35fbd7f6ba7a421c40669067d18ee6fc5e7a605640eb286c903495a17b993f27b14a9edd9d7694d7e284c4ad4403bdf785a674085505c1da95efe9e8c279ff1c87f5065dc3f98e72a7c23bcdc5c41687405ca32d7464308d9ecb8c7d54e011fe2b6047ba610ed305d51a54d249b126c6855e6870d5b0b0306eb13ef95ae5587da5f8a0a2d3125963f2c19d296a810d9a2c5966fe81d2f8265f48cb769d692c7c74908716b53ab775917481e7e0b1a72a0ee4ae40e6faf5176973b5870f83d928bad42ae6eed4a1a7f1d650afe3415dc80f72a3aab410ddb2a1354d31ae5e03600f34c8c5829927650ee46d27c5816ea14b8ea1aef340fa25e87ba59addd1242791826528cc4b6d1da12c98249d536618a269a10dc04da4b509837fbaa1db5414b52755a2a24397855809ab0a2beb62c8ab74998dacc52f297ecbca86eaf2698180a2a32fcd9c9dd3691ffc26689fdcf9a1d9ff1d7c908f974f6b5a0dcae04ee1f26955cb3a0787038b78b50cc0f3f2bf3eaa1673ceab6ee6eb2300ee5e453dfa370a1502f6521477e15e41e623fc9a2038edfe0898a49e0e87c379ecc96091e4f0c13020555ee8dfbda5713410627ebb2bee022dec82ef2e3bc05c86e94d53aceceb060f47c86ba738afee3a1c3816ef1545f42226e2a13e8e13828885c17e3cbd412da49214c11bd4965b982ee7eb095a4fff9b18bf416d8dac08bf09ba157c8bc31004b68f9c9883e763fa3d6bfabf16a8dec119748582b672bd8f4665a042b75d220a4ebea0d7cdd7da69abc1eb21e35241292d74aba1c21c0b2563e7ace0f073bd88f0d12c10bc61f9de6dc02e59fcd231d68ccb6a371013baaddf547b245a65ba320cac48c36ddac67dd62685790a5004019c182258d1a68e73ae11bff9265fbd109e711777245f9dc70707aa6110579891d7c02e2ada26b37c5cc65c18f95d02ac0decc7942c0837b9ebc6846e3467754cbf18144ff5e05d5aa3d1cce226c7239cc507c7492bb63f4d604b93a3b296d406e9dc8efb22d93bf08670eeba85d18d0dce5d22722149b8b1454de8a6184d5240fa764eda4cc4b1529b30a14bc896bc923d6ebaaec42230b78b5bdccbb601c06365f81107f2f9430b548ef3f28acdbe686bd06b1db3dae42fdd399c329a377430c74dba4ee8e67ce5269fc2f6f50644c5bcbd8cee92ff8abbd009a1280a3648bce3748e1a7db0116e9bfe78d2a9678ea546a492d486a12349c8fdfede30a073fb251c882f1b62700833aa6b62169c9934e4a4271e80d1b07d042c90065b1528514dbddd20cdbd731f7d85b01e561084827ccd888f6582246e576b089937900bd176b229df00b3a0da421f04151cb9f1545a812272c7b69129897765dca884e84f9e1b8cb8aa791df50522297312b6d92948e39b419e15382cdef54f4dff6846b6293681f84a067c8f87ee74a305f2ddf7ca9b3b371e946924998c42fa09eba70decad0fbf93172be5c3de95c0897aba78ac964be4eb8db5ea6c60a995488767569d8c754321a770fb41b640c2b3b3186d69a5e9fbc5256cf871a0c6974801af4176ef02b654e948a2ca91bf7e2917aeb1f5413ad4cd847a71711293d1075ab67a33a1004e009460327f8004a0deae85d7c0b5052e605596edcfcdb76cb3a1a065bdfd1cec7e687e8a73acafdd80f4957ea3882b99ce4f9a011359939b1050caa778830ec7b0a820f7417f096963ec361f8eef70ef7092d40f209dfcfc1a30ef1593931773a12a8524481728a70d3912f2f33c0ad16ff6f7fe7d7b8ca1eee994cc224a5190b6733d8094fd3a317bfb363685b06566e2430c1cf6193f23a6494c80017021a8196507990f88fdf02637194ff84d3bc02e745425e0b1c5a2ff1c684f61864a91477d4d000f4f980c5c802c01f3c49b2b388e316524e737e098b7c041510a59a895ccc1746bf44cffd3809e4260c608eae05ea5763c969c51f6662b54ac91a9ca453ca0479074d4b5fc44ad902291f53f48d505679df3214099511c46f41c6df30fb9a8b4c164a5e26bc592eab4e61bfc9a2daa2f1dfc592a708d8face44d1a5fd448deb6214eeef157fbb5855a406ec259e8c109b7d037b228c18ff82072474344fa9c896e699c5307a0282992b1ea0592740bb7ea9d4ae88675f725596fb1ddef0bd9e2a7463e984037cd30d0bd8887e114315d2ce5fe9b72d0f8df998ca3c1f04f446b50a2f665d9cfec307ea44e1ed5c81a0757c300e1b01d0655e26099c7ea3020d6d71b41f8df10b52c94c00b1d3a7dadd54c0347251d95d2c21a44a643c2f442d7e00ed887b0e87819e0081a9b54c663d54c7169b82a55a712b9591746a8c90a178066700900cd6f209801987d2abf6429d8d17b4a615e2399c4f7cd5721f4c1e11f246c596d28427cb0d87296cd5ae16ec68028072cb82eca576f044bc5007468917e0891a8f89e157b13c9be9abc4ebb601f920f89771fcb5020235d404bda513e5110add72ff059e1ef6bf49032371ddb3daf7b712ea42088cc73ee68a9685ca55c1d497417b1d8bc789ee075a1a25f1e030fc87bdabd20856363b156e5fe338b746314afd8443176320e2e094a77c7bd18a00153161e2c15caefd0dd9a931f43412ab44f568406c22a83fb6357d7c2b79d01828e7a8f919216ba78ae1b7eeed2bc9cd66b41c67341af56ad459f8a07f2ba69ea3bec7c8eb41fa2c77860ca2449124f4fe094f43cc9cd84bf06c1a713c7bcf46a88c457c80b62ad01e819793b3d2108935e4089bd80f105e1b4161a81b0c9fc402170914e308712a0ac238266a54d838917aaf3abc569715af9a140c09ddf1f09118a62c5f8898542056363722dabe24c92641ab471a213d50c0dfdbe19acdc4aadea731238a5157d74699470d1ac3d818940ac6418db62899581af62400e9150d4addd1a21522ce2ae12766f24eea144109aa51bc4511d20e546a8600ba41812578b4b4561f153061e97f2a0ec5db42fae6bb995c8bea078245e6a204c3ee4021604f8673b3efab3c5d5b13267852ad71cc7a809b43baeb3c1565cb41148c82720d550e45e959dc1b81cb2a6c2c58ff76408f8c04b00686691c01743d382ea1e78160b05bf8b76b7a101b0b3c22c5114444810d97521dfa068f4ee6a8ccdf0280f0ccf23b0cb039d18d42c7599988cc0ca0760c6e5d7d41ae725f08d8c2835b6a2efcc1c379df299fcb26a3790c1de9f7261cf6d8a95daf0a1b096ceb31f78c12d5d7e7a08fbdf9237abf7f201242fd15e9712e31cc813d01c300732c6a9ba88439cc3f8c9742bf5e497fb758eb044f4ab08c0f8289e2a76bb72dedc990062642733bb709065b8c173538e44aa8b2b6882198075eb2f08d8ad9644ce00b218dff486af1baa1e59e1e0d39b8a151ee396d8017376776c254d4018c38f0b9a11b8875818eb6653d10894292866ad0f43eedf43489791202786125325e90f3e4159c7d355765ced5e0a42dd9a16ce139a6247b0bcf8f68798417893433c5853e9cb90eec8c5e69e308977019989fa712badff54b827a67b8e30501620cd6617e19404bb3122982f9453827da7fea07c3855cc4838ed1384b3f7be54950d5144f6feb22cbca9b08e7d67a8f18b322afcebb8f800403c96df4f0ad4068ad378d8f9b89c4442ac95481377a7928df7ff037d2f22b1c0d819228f8a0972268510be8d07822792d4f66d8a61f5df007f2c48752ad4e52a9741537f6d8f5e46df4b49402a890b2de5531ae460bde28fa0b0092146a40a57e94e729d9055df199fb38e8fc01092cca9ff91776530e6c181f5b37dec5ea84241429884f3a6f0a8a839296574e37d135d927009b4cb26e5dfe00016dd166dbfb38928e18a3d873c918426f01c1da404f11dc7be600af12373b1224ca19bb233abcbda85b425e6a0a619ed06f4f101145e855db7e9df3c209974f4aedcdfa645ccb8d0b6654ef437a1c187cb72c0e8f36100a02266a9007a0eb06f8aa28426b403bb0531c639e33372ed5a8cdb3bba239c536005d071ffbe8fbfe8c1ef0b92a95591a653c84ffed872bf22a320d52cf6f04828b9a3f9a319c781809b64995f40bdd565ee6808123c9aa86573f74431560dae9e3a7184538bcfd82abbbd4bcccf7b383a867cb4340ec437636ef7619f6ea93cf8b3ccbd08aaf862c92df5e7362cc13a0248251800057c6f4da869f80a0a0f50d484f87250fa0599ec7b6e30c1c58c0f191b8df856b706acdf041e559d96ab2e92e915b4a3fa4a472fc31d36f23c94c59d0dee250611b6cc6b1f054c81c00636e904af21f5d29b4132b804d5abce6efddc62a81bc253069c6670431f3a863e21833b8aad2699650781cb596ac08cfbfe7e038c56d88a7ee1feb94d114aee76703af0c855ccc7bc013154ae0043c94def90643e4d5ca3fa7b7386395d0055486453a3a7714b133109b34e2805f740f74447307b88e37cb94782b98de9f087c0815da79976522a01c6f4068002fd91b7b7112667107d8074c8a5caea6d3eb8f054a94945c0bfdfbc153f02707c4f2ef833673662c735124d49858d63e7f7f3a14cc0a4bfa00987055c9395889f5484e184d87c1acae992be8e770d39027635744fbb6ab99fa5adec724e710d3d1ec8063457b2736b5557b2d722fa191586a7bf3e93dad7fbc0b71c95cef8175726f3b7c8eabb7174fc513cabb34e55395c6bea74631273253a9c1fb843386e2250d11ba3e868a05e4bd32702ed8c58f5dcba627e1f81d851571062c0c0da331711377e214246bb2cad851c18426605b567a574d1c0d83edc0e19f490ee50b286f15eff3fc610bafa6e6dfb1209fd4d889f02e49d8e4cd5460830ad7bf4ce08886ad69d85768bb340d47bb18510bd9bafbd50124c4669fa40c27a48ad0107a97352dfabd9144bcfb4ca790e86e9ac4c1da99ec4b85d71c759af9665f0334f78b89e5978332420e2414182a3f45ebad725984b2f82d7f185fe926db295dd386b48d20e059c2a655a86fbea02066e610c17701d400bba0b2c5295e2159adf2c63eeae8d5d5d835433e92825996ca2872414574e6e624d191f5541a178f98cae26b66f57c720865fd67d71a747cd9a14aa1a78af3bada0aa4cd3550b5084225fc146b0d2c72bbf74ad5e0f5c8face850545dc923d6626eb81ec1078d676dd6c310be3dc104bfc6b20f9f3ddcea0554f1c44589b26eaffc0dcc9b560cb45f3b0fb32313469f1faa83ee673dd408eff8c614dc02c612346e00bd72143b3461f214bfad05df9aeba2470418e0dd8b3d13146bccea4a2c3eeb00082b83717fd7e40a142944e8bb639915a4ffb578ce19694e0dbc2a572065f30807cd4edc701250e6bb1d0983d0e1ac1453e507421178d2bab080ba1ef48ece070cb22aaf0f4c5abfd8eef77e60e75c7734d21b06b059aa502f16c5382bde9108e9cd3ff3869775caa4313ddec4f3509d7a714a6f1c14c37d3f508f536aaa4542f04e3c57d6fddb6aa30f0764760e8e3b27575c54000d94841e5e1532c709a2bc146bdffe8f5b8d86312abe0221c693c0bed6abaff3f8fa6e5dc746354cc635e5d6bce324cfb5fe5f574dccafb67366ce3abf6aeeac118a90edc4ee3f5e3e176cfca4aeb4c25da02eda21c145f78a4e8cc6d1234ae8cfc78b0ad737ac0bdf79f063b5438fb6c734cc6d7dd8a9dca3cba3b4aecfd8ac7f4605788658bd9fef6b6659b0fd941d64646fb4b98b6d7d6e8a4a915d3472c467a95972934d3c9b3f365b640be16452950abc7e020d4706c6c4739ab2ca3d429538f5f23ae5dbdd78c94ce46eefe85ffae21e7a540c94c1d60b7f4eed14cf2718c2a32de72b9694332016892815e44d3a79cb93612206330c751d54e877fb626598e8c0780d8c358a1d4a86157e1f3e93d4ff3f8751d42e22f73c3d4328ab30e16253fa57094ac363db2ba6ec53429beea2fb174b0285bb1c76710fc4eb87ae279e6a343c3fc1e7ca5f20b7616bb877fd4b8f6fe88c45bf10f28228b7ad4017265e774a2bae2d7704fbf20e9bd1fb9af07791682b9cee5050ed99076599c62eb8ec059fed83ff8128d4dc1960204fefe7f5c20c1be7852c265e192cec5288bb22052f8d590900ae2938ffda217d578e5744f285e3bbd83dc85fca99fad2cf83e050c37d5e344c769f92f8ba5d2ad123143b9076d76c0fb22f71b654e2b759017182869897915459571a2ed9b3641109ef341282614c42448e25c8f758be4457e953c65004b5456c542e8fbf1575fffab46f32c1690d6bfdbd5674889bc8ecb95ceb891f35e7662f71e62b7b170f1b200c8ce4f57181a600d5d54bac359df7138b136c2f91e9a8cb88e3d182808bbb0cc35ffc32e82596d710e4d3ea25f7be393aab992143642483f7ca4b6c26532ec3afd33ed116d91757fe6ddd77ae6628a09da63915bfb860244588314fa88655e0c46990da1a319c9952e8b4cba021c62fed81c2a575fb0b0ea65152bb7e494c325e5e4e413ed111bf84bab20ed34d8020da0e4288f1d88c6ebe53c17f505f61119876e57b37d59114b84dc020150dbf1d8d7b417385aba5f5eec5e1635cf8d294138f7239954b8e2e0bb0eeb3eca032b0318327b37afb7942955d7da7319f1d5c25efc58104f8c64b362dda9b870888a92d62bf50596a2c860845edbeec4a10e88bd4b112c600fc9b6e1c3aa22162097709fe8c8be8814082cf19d2c3a62ecba8aca0c1de1c9bead5d0ff1a3ddadca7d83b355c399aa4e2b1bebcf2c9291accaf023bfb7c8bbad2a07530292f33815e026169381de3dae4e4f45705bf3bc50ea33b0a5b01c2bc04fff618861d088dd88f7279612e3477ddaae61fb4f13c39ab755bdc1f7a622b55bad55572953d73485f487a249760a35c9bbd47b9234ddb58ea0dae4db0c3972f3b39b8bbc3ed84347d2d0162949ed7fb4b3c828f44628a4407c7bfa25b84977a1cfc7a5e19967754dcf7c4459f3c3f1369434f506cf0c5409bae249eadfcdace20c26ba9cbfdbc2e452cfe7028e8b03a7950e90cbe9c30188da545188c3500263731ef372b292cd60320e91c405e183d4f771b96655b382b6eb45ccd6dbde02091800b10b9ee3099876f3cc9a265b5857d490015700a6cdddb90eeea686ac5ea00056e71df3cc045eac6c433a33e7b9798a8e782cf3a2b63326a48b0d6210339cf92b48f8bd60ed3a41a1b86ecb6048269ba2a3769d11ab356947b3d7b4f45d5e4dd1947c5813d9c08a5722665620cb62ec87761e71f39a6370e013c4a73a725316eefc184de4e5c3d362f955b2ddc70b1d96036a4fe5b9c71c23e9c3e88363969e35824881f82308ec1f85beea0326bacce87e22f38b61b8b6f03a5a1123a0ae2f0d96a834972355f06ca14960f1c7e6a9c28cfe3da98b2c5c9b29daf9617968d254ea9c8a300137b3731e2443e2dc84f825a4a209f63974478aa2bfeca6c91e19a586d46c3ea6fa9c7b946804ad96634cb8ec4981beef5d63a0d66b0c141101426d6f9fc6050f23f09fc6561c72dd0d6cd383b517731e6e9e5adc986641af61c0852e87d67eede089c6b4f0d9242031bf9f5deea64ac54d027dc0ba45b96628551c99a19418e73cba968c25ad639958eee3400dc298150589211be9c663761f99b294073a67b2a8300b008d9e3a59fdd07184a3346c0e351258026a3f8dd8f8b518dd653458ca34fcc3fc2fe159e765d9d47f48c3413561afab7129d84bcf02244d95d42f47022920aff40d5a464b57b8dbde9c1c584d7988a30f3d8ad9356c9e41ea632509ae9d7ba7812c2c58f106a7709d14289492afc03112467a95fd3878f012f062a567c68d92c0fed907a2703472339dc950c4a47fd0343170aa617bf701a111524cf154ec3531497646167837896f4e35644ac7b8abdd32b01634e090309db87e62d98a1c30a441291e581201537c5a0614228a43b7e242483a2f3b05836f5f80aca7ce7d1bafeba0284e4604a5583289a0dfaabccd92b08c9e8787716d25bccd05f449c1bfd8ac4024d65774fb145231a3ef217980bd8adc6852b8e25fc992059299697b498e4d435f54b99043c7bce0cd562763d1bfebed84918bd3a9a572a50a90879151b9ddaf5892bf37e6431c8936a8abd52800b63407cb43291fcaf625e3f3d91c8bbfcc946e921d5009822152d49064e8d41492fc32c2f9424b3623a5013cb21b3c43a2b8bac0c628deeda606b91e91f74b236e130aae6f9b1de87821e6145591b19310940777794a14f4ecdf61df6705dfe9820250b3f11c70580dcc25552bb3a0cd3dca0d7166c18de4ee7a1b16b8d7c187a5ddd06b9bb893764e8202d2bbd29c6831e1598a4488ff816ca04a6c82c24a38632076249367c883de42e0f0cb4fe382eeab016b4eaf58a17958447acdcd5a1b565b0e7163956d74a3676dc72af56b1acd63bb6a9f1569640c5f87ab22fca7030c775e0a96fc90360f7c7f16ffa92ead5fd5941588041b491fe5264947123ec20ca809826cb18b487411d74888e20c93b2ad427961c3807781a0bba2445a410399dba5151a61b930242c241a266297f8a838e103292ac4bd8825878e98c5456ea608da7eb00060b0966e1373fee327adb7db641d91f68c05a4729f0aa713bc37e6d3eff0c3359ef78f397fbecce08268072ee46f1be24a44c01ce45a6322653cc677156988fac347a3730ff9883034d3f14d938b851821f5df69e4217ddfb6c548a1eacbe1c9e971cb9f2be3701f78698a8ec526c3faf18ebad23943fecba224a1d4c4411068a954ef42c41281598b51011445d2c64233566af9d5ca5a4d1240d046f24f35d59a120d37584d939ec775c0eb31329f83660c557f70edb7bd6efbe806ae37b08d8b04201e6270022566eeeb02658c4e3d02b78e2e0f001d1b7c5b94cadd932c01f960faab9c3c6802787c0d0a311da550a12f9f3944001cf7788be17fa062034b85c640df14fc9c1a40dae70563c95ac2121af6c59ef1134ee13f8a309191501a62865a401cd24eabdc018392c3a9b1c6e50a3986856916f732546e30fc0d65032b079fc3a78c4ab167a6e24f4a6f74c076a93f529fe05d9121af3e0d317c8e1ecd446fd53d948bfc4edd7d0b0795eaf282680e180d40f83f101ed49fba576bf72e4f469eb45293d57471e52dbfbc5cdcef20eaa4779bfeb1af2bb79d1f561a62b10cb19fcf5c68ebeae5dfc1f8e70011e7f63f99f1e6592c4a3e8c3b795802bb48ed2cdf7938df7065834723e2fc4f8fafe224970ebcd4c4291d24948f782af75a1fac36bc3e5f7cf407b17d95067fb4b58d42f4f68d6259d87c9ffdfa8edf24f1ac8e1089013359727d0c9db1ae18650a7a8b9ff33ac479776aa32b9885001ea889dfed14a05dc8da350e3646e829b56672c134f97094aa3d5e6f205f8a4dadb56f340645699101ad78e224fbc95e633b9d5d7a470bb9cca29b98348f0a8a2383e7a85498ed91005e08d5727f07045f9764a302eea83189288870a60b4c1fbb267e6d102edc9ae97b0b62b854c1efa8cd217d1d3e8072fe234e4f5a27addf22ad12146c88d54f591b1d3d173f3c502e1502ae829c784080e12406b7037f3e9ad4ceaa0a9c7db5b011d06ef48f9a26b8a6969c7dbf21f0fb9c4d8f18655a17bc4e0cd6ae6613e71b1227b6c0f5be1393b291c806cf6a43c9114cdf6b4834cee402db59b844b9ef8ca3d872d1b185f28d54824ed539f79725bc7fc41ce4214ff9093575a42376ce6ef8f929807db7ada7b8e67053a3334cfb46c9476c0627d95c38532c53b8395300815008cc7e84f7b0328c2033dff905be38602a841af379de3ca9fa402a2513492ace5f7974a1950117a3625743a244dc49fa10d5a7c317a6e4dac6778b0bd57e702805c53bce5479d963e38fc7108fd903ee604e61f2f9e7d821f9c14ccf61810800ce57fc2ac5ad41a5f08bff7d140db2a50a884def11684617e631d746b4c246431e1af38cd6a4f165a6302dc9e70bb20659eaefd809ed3b1239211c30a5b0a31b2ce401a37abe8f36644e320b699e2be353549dade07c83a73068b5b3052276016fe25884d4330265645c7cccd01e004a182817e09d39388c0c7a2c62e83fe2ae340fc709ac644572de1720ae1426eb7430f0e15efa05938b9ba782e6afd638e880b1cd8aa1ed06ad19ffcbd244f1ab7d041cfc0a4aba50bef4862ab024d5cdecaee5b8a5bacda8f604cc8bd970ef2f8df6380f505306b1f5dbe5852687ab14d8fe04378b6ec1a3ea1b28a3272fbb05bda0e4a12ac6eb8a3360b955fbba9196044ea6e5ec6d99c3dc34138b9dce4604e4035f767dfd010b0d12eaa5674ecf121b8e1a27e411e9448894d424e1d83c343a3976f0ce167ba9a23601e8f92bd6511c115e74fbcfd67e5380d673754bb8ac6b111e21e4549be68605ac4c444ec5b9a439fadca030098d9092bdda64bcbf74ef5abd1c0e95b86c07e4307c41fd80752a60e204c4e5b1e0d91a9b821310f0c633a34fb6e20b6d1a7719c8cd2fb9c6521848902470c5db32c036d003ddc6c485326f6308b562867b396e025558ee525c8755a7ef35f619249dc4468f6c7d52b8a13f46c79abf2453a99b05dfa8a4d8117c6ffbd3a99908dfe2369ce0cff5056be164be0ba9be0b8c0a25e6f498d280b687bf9a698e5c0f256a99a2aa23c7acbeedc0784b95c2e162571eaade53917886c661d8b78091bba4cfdd266a3cb943bec7ed8b43793f2fcb2acfe8256a64595b0ae8c25f1551a06c1c311c6e917b1bb73a4ed0259de4f8bf335db850e0b4fb2456e8298f28db71a6ec91e40523787b5dd40d639c8912914452b81490740e2f07f445c763f47fcff47188ad5a5aa60cdecf81f0105992955a501287aba2c110ca6a31b9283637f4fc943aea3f29165ab21a1417c7fde3713f6245b06e8685566ecda7526219ba960d4209868bc5e8bca881a259c319d23899e8ef2c30e4b60d17e7d749dd7853c173bf7b8f43ab2473f2cddbb1b500f59ed74cba0f135fe13194f4175309979d9dfd82edaea2e248d22c13f6c5f7225328f7476ef2a051fd850a29a8e311f1e24d46772c8dcb455bafa53cd6cc1a1a9c449acc2719f9054f0bae394568fac3a4e6975a21db76a4fb95de92dbca01c3d87beefa2a450ed698f11481713aa289b47ea0da8a2b60cd0a9eff9c1782d415d1f940901e5ee323e6602bdff1d80b64c1c401f5790d4ec07bcb31695744c15f9c2304b01a902f257b1fcc8bf6dff560a5f2480c7030e1835f5dfb3715e5c470e2517453e197bd65d0cbfce8c0801f0208446687015a040b71cdc08ceb22f3a72975712a7e0d55f11dbf774da4eda41264ac7fdacab8fb301f83fb98b8372c13274b1a70578196ea76d56239369e045c6dd919868c6514b7167b4009eef77e3d35d178e4e87a0f5329170d068f659f99897863fdf3f2ddf050249b60c99c09bb8151c48ba256c207e744c1f3788e0c1e16ddac6ff04fa0cdab53dcec07757642f25e65732b61131def8824c4cf6619aadaf1b9228251c190df87621bbc1ccb991e6d52484ef05dc838db82a4efcf653d8ecd6f52acdc201218d7031aeee0260e78624757a07e86255be821afe2d1605358d625e2d4414db5e1f577311131a343f22fce888bce183706e112a075c628f387834e256630e782b56faf1b6f5bcbec01d614b95ebed23b7deabf8d76a3d98ef3affd657f64d0f466ba3591c6566ade30abd61320ac8f380cdbcd222ad206acd7a621118574d4a853256d8e526df3363251d4f44cceb70bbc992a62614b45fa75353762c52d035767d8b5f8887ba4dff8ed437bdb93177a1badb20e2124104c9fa62369293a017ebcce74f82454473457eb4bb2da58169054655f18e32110d9c3846e5c86eaf8dc9829bb6c7dd808c4117faae5128841f622098d5823aad7691e3380d6a748e000b32c13e4dfa92ee73c779f31ba31e4bfc542bc1251118e437b5e318963e532fcb511829c17d79191a9f2ee735070e6c118128456c86111c3efb672921b3e4c1994d5e36e7efd8f669d4aa58778f0ed597bb07ad96572140a106a38908c8316640da04ad2c43a4d888664e570c7e2c4d4e5fede8b3f42ccdebc686b189208564a4c5e38cf5bee871acdb5fa44b11b2c6902cfebae4838bfc905f8ab9875209badf81314cb55c85ff14ee8c496dacf5424be36a2a9c720955514f513b12cd75b30daf0aa6b8fe96fa87d3c3cee1350e148db10cf244d1c9609a5bcec8c9b217da2a45a3409c7899734920afffa98465fc13fadcb7bbbd5ae694a535e3382df90e787eb3a25543aebcce51490e83a7cd84f94702dbfcdfeeef118c591ac28a2ceb95805806ac914bb44f498b606393687edb23f747b96f650eb1bdebf8821c204f90187a4d6a2588f2ef51c4a8ed62526cfe0b4cc3060dbd311ef006f3592ff3b18f383260f92959460bd411548327941a8d01a9ade29a045401fde9a5a661face21339fe87c7f09e073f80a589d6c6ed83bb9d6429e60b0203d143a4330033baa3f1cb7704c752e5733ff6e95c0c4d3543d3f1192efda29d573cc7bc83f49d03754660568e1a2d9a9b24f4f81c389f0fd4a3709cccd9600453052e5e34ffa1fc3bb8922236cf66b47bc18bb36dc3af5c086890400279a85fb8fb6cda93626ddf74d5307c4ecfe0e9dd9521d3bf412bc13847b8210f1a17a29f7b70cee67d70f4b849aa9d0eb35ee2f04e7a364a1084ce29d029085471532d8e488a5b75f38be68a1ad385a726e96371ce3a4134fb1653e177290ca120dfbd9db014fada366e6fc32de8c6c5155de2510e647d4bb6366aade8d7104a9291cbf0bd8272e18f8dffb33fa73f8d74b4848dfd0ab5114174d08d6bc79173d5d9901eb0dd136ab891188da55f861bfd873837d7c31556c49ad1e42551ff437dce60190268e9c0eb6115cb9b269f64a798ecb5515ad02fe1f978ad63406a963f1e9ec55923a83f54dc213fad77b341c2aeedbd8f67709234edff52d27d6fdb8b04291f4e4f741239caa23052de1f826df58bc6532a386771a5d25e7d24a17fb074c933c6238062c319472d6f4812cce498c1b388f0d4daff123b3699165074c570688000caebf71bfda7db7fcabbaf8416f5ae545d4c388de86955a98ad891affc0e7148014355f6130c241b112feb186a2fc8f97b39a2b96de7a54c49b2911fc5defb55821b430f9836689e8b42d241e487414a486e7e58b92481af5d2a071c7179a3edbbb380719d2eb83ff940f46dd0e8d060d5837a39f6392779e3febcfa0d59ffa2dffbf8dd18331b87f4b6fbe4f674468ffe2877de2eaaee7790e5761fff0dd808dc61dcb8ccd20e044bb265835495ce8cd549ba924da04074fa04248c4d951a291508266a9c63d82da7c947f625fe9f37aec5e34c2224ee92dc4170d1a12c07d663944883eda92407de9352ef4264a33dc385c79eed12744f0a61332bb562319a4c528e8d37b4dfe7b365630ff370434feeee76cd77136a53c95049c467b2039d32ffa3a3761e083ebfffe08281db24190751b424f1157c22de3e5980e6b0c50e6f7022434b6d20337cc19cffeba0a599f5f0442e2acc8c9339d8fd6cfdbe2b641028310da8593cae05244cf6e99668a4e16eef7680df5fcb65498491913e48a7406428911b08b313878e2c26916cea5153bfd076bccd31a1eba0cb13fad4f683ce984b111298faf8448b5eb91b5104be3869c7f16484c477d590573e32688dba801db56bd0dd07b72ca1f6e95fba72870b493bcf7af90e8f70b59ce4fdea40c1c0e08ff2952060171a2cef4949d7d42fb4df7e28f4bcb3f07e3598b7cb0e8084c04b5a95cb60c48c0f9f14fe92602e643fe708c9e7f7ff3a246a0961fffe63cf14e621092f22db02b7b6c9a48400c6540fb10f4b1844becbed1eaa340d7c3cf0938b42eecc69f861b14523d11224ea95207087d12b263570f61db440f85415344d08975acd00f0b7318373272c0b761c71744aa3f6e90824e4101f610e1053050093c8ee62b559443a610a90e25c0edb90c5d230fb2b80ec5dae349751505892a2df8eaa5b74390a49404ffe35f2b40022b39b23a9df9cd4894dad96ec917a2622d69e87f7617b883f302ce29953c00dcac47bd71927c57215b84f8eb75146d06fbba31f398b18ca769f82a474a6ba472c7a15416c5ae2b347de9a79a80b7e2776652e35948d59947d93d5ba83d73e388364d37544b201e08379da3579497798ea68a8576261b7fc40b8e1de23a4ccbc5bda57970e04fc374446a34cf3c17b8048a0091ce8b61096515d0d83c01bad29423d80a4528c31a7b6c5f0b53ca5348a7a3f4081c2134ce1b2188a11182f3a414108d3aeacfc308a1cc172108074a09b9e5577a38592f7052203c0243319c022c3cdde4b9a34981e042990b47207f3167a7f84020e2ff85a5c10ece7fee3e77ad1a8a33d0e3a48aee831d50443239456c68c961147b5b478a8c9957ff090c8e0e4ce079f41ce44446e3db42df9cbc272d9f3908d0dd1775598874c2f0cb31ff13d2199ebb5d43f152bea84b65b2512c8eb1065f0a0f23f45dd99b52f0e02d393d14370a4c4429645e230241ea6b3a1611528c924c240c19dff44ff972b841e4781fbc2584ab3589506e283555d3caedead92b7e89a1ce0b9fd9f1d694c65e464c3ac1cac9f27e3f4105ac01457d17b1e4135371f0e28bd4f151bc8a377e5a9c62cf77cd63bbde0ec6ab21acfe5821ef9f1fe4db3edce1c843fb3907c09438745a0e2c79fdfe15dc7fe3ec885c3f0d1defff9ae5fe1ea84072bba820c56ec5031b376948e853093320f8dbb38eb954eb562a043995af08e317289ef5bf377891c5b08982b48c22794c7a8b632ffcc0fe30153254fd1d8ff5a8c922242df0876d5b16269778ec5e4522f303879d2faa45761bcbb4d4bed8b635da288f17b01c968b0747ae09cca4f3ee5d46bf83cc3741182f52c84b6f6fbab94efa96ebab660117e60f4c307d68bfad24fdcecfcc98651eee62d93a4844c200a76b92e531601db53050459d0615ef3077eded0e41a7cc8ae64e2a8805b6e84b6f3fb8c12bfba6b2170631ad573b9dbd80fab947c8999e0b2cdec188603a8a053055791344bebe04d262d4bc611ad6d02fec814044647308a57207f9a9c46c68e1fbcfc703c1f5237f3ce3e20f11ba8f6223cf8cc8841e0dd54aa285f9b096395da8aae04e7dda2c3ef0d338e8fe3d6c923ab7577987fdbea6f7cf203deadea82e11677b909a9ec463fd787bb5edefc1b2b256b3e882b8821b846d759c24307047e139825880a1e3acfe3cee21aea25ee53c8b033b82af6cb70071a2390d0b67a2c6a343825d42b86149775561a4400368fa5f1d23eb8c9d0409122a912e31e329eb844a2bcf7195d2f1e0902d5a6db56b423cbb9ce28ae589846e131e872c2dd21b6ead93182f63507afc49df81ba72201d705ed25e3c40020403cce109a75ad4408e76dee1f8b255b6fb2cf4fd25ee3613ddaa59478abb1422f0ab33dad434513d78cc3cecd908e850cb2a64e2610664b787d1bb91754e31da1355a584ad0a3b1f439520d659ac72de3fb6d1549e2d9a9aac36eaa9d4f83a408dd0ac8e6fe37fbd57997efa2160edf651c49485d822d82838cada2c907b99c0a26f1345dd82efb9c1c207771beff47b860eaf666d73b1c6ea7bd2a3dc2fde42ca85470bd1833bce7f305113867f09ce03ebee4e1be383936fa82972a82b22fd83e01de862be240e71a8fbd76a3ce7f5866adcec13b1d629bfb7f3865265cf5fde1052c35ceec1e04b22e6cfdd4bd2c3b2e383d091ceb0c15b21998222fe0a423ae41d2d099e4ded9409185c2552eb148a01a1a5a7aa852ba768b82930bcdc436c77b8ff286176105bd073adb8156ab4ae6159fee7ad032346bfb4f7ca3678f847429f08361ebe105104a2e299e1ff42370e7e19a8558026be26124f19382326d15ba473848a7c93d8e8c6de1d2dfae4db56f1d4839d3663d94b8c9a16835b0a8eacb5021c42ff23bbeda2a0e819947a4896fa83a9b45230261ec62d3d2a525b30d525b2e7771828b2b6141754ede4528024c5da127a04837328fb0baa005329ce4ba5c7a0455a7e2502b61712789be928af730735dd88202d2edb63b1c8638e4badc178fa280a344b23cb7d1538c5c4ec3f687be8f19858da8119751f2929f4301868d1f5100ecf47b134ad82d7a272d052f90796c3483365b9029e0d36324e016e6a27b422d911968671b15fa8a1f824bb09405bd032473558c9508345a021d2503e38d65d4d0ba3fc48e06e115f9c5844c4f9b0fa6d138849b6bf155080e6342437ab2c9629bb82d8d05452d915f8623c18ae6a1619e8e96cc51a88f1447da0aed8c64c061c0c236dfeb42d0ec413fa6934ff79544f977e77531cc1eb8d63d5627eaa75e0bc16143d88f4850b824f28778accc79b349ac8476e3f25579d506634119a7ac8e8aaa6cbc57cc1f30e2383d629f9ffb465e237edc8b7c254bd5ece4332966f7e47fb8501571bca81b1164564bd46cf4b2632a39e932d7a00a67b1f8c2ac24d3ac2ab00b982226e296c233cd734e8c977586c4a7a91bcbb3a8896e0927c30ef271ce5015f3674a045158d2692c9e835b8e61cc70a80905f1a1c8251dba5acde10b160c382f8908faa89dca89798c5ad16645f1d222a403902eedf39b98c92818c8d911d66592e6708ad735d09f536d99b60fb52c525b398a567f0fcb19bc83db44d374a5c52a4484afa4dbd51a904ec355cb02524c3814eba586a665940e0745e16658ce22a897e6c0c9359ce8b54d1b2aa12998aa69774c3907b7e48d689489898537112aad9c25c84596561ce6364536fbb2589071136f776896a5420638478977a3e9bcc01d484f5e175336d27f011ac35141d9100d8c4f2a79cf41103859bc295728b7bf17f337c029a653a86deef95c96aaef41fb7e12d4b825288e9b05672a2c4d99ed0422916e208f751c6b625ce807013cb911c23b24358d167e9f3937f3561b8e275f98679f4c8e01e739acb51fed8a90a516c9850e112a7cad57a220a994f37066da84abe3969aafe61537e3c8804793105b36676d85e8aa3dfddc99010b0801f1dd9d05c5a9a5e6d89d8e6653153f72004d0fdc7915c1e4dc66e2bc55c23ee08c5d9fefa9d32f45ee95a8b98ad444aa59f5587a2e554329af83707bf298fea7c0a71fa983c940b8f927d3ef134707a3de5e3c1557e4dd61f6a95f973729212e55e0cb7808f7688abbcc459169ed411c9b7b13c3f7a18fd60350691fcad448b824a0ca4c6333b1865172d964ccfa8b7fc8cedb0fd5ee7ff5a5c4776ade822db351223817f3e536e6e2f6fa3a87cbf493e66143ef849b80591028df7ea57f5e0735551b80b31a08b24bc250e548265c03f1cfd3d74c1e367a0bbd121a0dca77c31a6a2b030db1865a70bdefb294b6a370214d95d44f60174ae164828b0dc51f474d748a904929f42cd77f23dde477fad0818a53d348ec71cbc8066a50bd6512b0034bf5ea10eec7a7bb427745ebfc4a5907f26fab245a9f186b776787f54572111eda2a71598202ce9575dc2a89d7bc25905d2c96172f2c8888a961c4a7d4c47a2e20554582f250287c530d1904615939009edd634ca599c58e328f350c5fa4d595165701ff45033cdf2e84f7ef64c4c84b6741f1fe493454ca4a205f79c0e375c58ca04450115be6f99386cddf23902bf7ed7e064e9a90fa4d04a003f0a05ccf7c27a101356d873c416e4a5133e5889b1975b331cf46b8d4b38690522edf50f701f5c39ce418e9fb7de724078fbbfce5e9e55feb853aed331e1a92787a0b3fa07229516c748d57877db940f029d0947397ff733837cf386d586e76b50106ba2bcb774e2035798e71065a809d79fb467791aadd5acb29bdd06a5a0942d090ff61dcdadcf7750b662f212d43834faf796911bf6d2443a497d4d18de7c71ef970e6efca7c2b36c8db655bbab703e9244a6145aba807f9d0f195fcdead597ef1e1e835221b7384f146179376564484106859a9ec2d4b4e887ff5049223513f42a18aebdfbb29bbf29efab876ea45efb33ca72f53f2bd6c2abd65d1a883fa3d71f0b2e1d95090e3d15f055bafe928cc5c6ec2927af846e02946bca87605a0cd6b5a69c44eca755829ab94f71e783445648316dbc21c9346a37b98696ecb2327bf8ca82405ab3a537003512d5f0d1f8ac08911cdb72c2939c2d1b20667761360b83ca365166b46ffe5b484f0237c84ee2c42253fa52821635bdc04cd9f619465c733ae710c41ebd541ec0c2db17112686fdf3c5cfc476d58438346be6de40c5b2c1e67468d48cc4385852190710b66d02a56e48d06d8bdd0ec3b49684b3554d2391095fbbc540a1f282bd5f31a0a286d05a81769ec3f11cc115a0c3eaa14f661939aa2d4786656d442e415e858f8e56d22e1fcad7caf534fe4c56ab43d0fff95aa7a6336a08ff0ae168314c0eef8ff85a19f5f25651fe5b1a37020011056a09ada43a30570825715e5a2d0302c368b492805e8ef248d39eecdcfc16d12b800bbf4811850019028e3e6ba866cc98d6afa2764364cc47dd3efb4222fd79fff6d6b741cfc6d3fb8308a3a95753b08f76fd197ab3dc126ef34400f59e43bf289a114d859bad6adb7ef8ff3e0cd2b75c1aae56c83c34f2d1e667ba12ecf69ad42d928e570325aeadfc748c808ebf41a9856f4bc7e05121e288052698a02b32ea427c58a226221344e858c99b996f6a087dc00bedc1649a7ad35b976eea20c5546e2f8016b4ecce03063862ad17ff184cfdd36b44aa78eef62ab28a8c39f607c50340b7e8209e8d3b1038fe5eb4fe972f87095e901fbbeaa71613ba56cc9345f67622f38c73e04c39de10aa94525d01f3ebb22ad77ace514dce159b5c83a6d3a06ff058b197a6567560920c32e51db0f81d977ef6e630c5f1afb5c90778798eac13934ad18bed078b8d31510d2aa2a242313b27b401780335234568f428a8c469a7e392f644b4185de35e1452d1bfa0aaac5c003af67869ee91f50a409cd833054caf000f41abfd5ee8b254dfe755007aa55656299400b20efa9f8bd38c168dc95a40443b05a7a769f2305fafd3239bc82e304675518f1b3a19952145c9a53ee6aeed9cf7d8fdec5e4261a50ff3848c18fb80595672e26b72b20d904bc4e861bd15373e343d6bfbd2d2abd45897e3ec74ecd2b072480d1256ae6875d42a7f3ed719ca72a78e22d239daca34f55f00ebfc257e36371d4d555d3d346a445570035503903932d075f444198aaf9fa93569d8a5f4e3287226c14e71643177553cdc5b81a7707c8139f1a733d5382ad4506e6538337361c0d6bf9bafe92e312b80d4616a0c3cd81642cf289ee42e862d8f0599d00a36a838bf3b7217924490c9457652ee840880a357eeb46de2eb4f5982cb1c05150909fd74bf945393c737ed7c948e257373a54f9733e8b8a1139e69b6a6358e10529dfd6237c6beacb51ccae18bf3d52c1cd17484e711daec9c5cedd8f08a410ce9b8cec33b1a4332d312249d8df3dc4138b8639b4551659a4655ce503b54e7f7c41ee8209e7b98e01ec6ecd77685da0a17110d86d0f5a783e07735042ddd6a4f2a232aeeda7176384936e6c5a791c82bf110d1bd15beede48bd7d6eff886e1f3f271a35c353609c2cecbeeb4bc2413fbe46ac419770e7bc0ab5728f0e9abc5ad3d5dddf7ffee22b42be0a8c8432e74ed93ac86e13062133b288bbb97719450981089fbf727d91109f3b469f1da59ca24248d22d6555d2fc241c821b3d30f0b3036135a147bcb13a6670be6f36564320fdb2a53b5e916655560e7659bbf2b0602415b950a3c4ad4bfe48d96e374346fb83bb7b0a1a1e2488f6f4d9b4b76ac7da19c0098abf299e82d71a93248365b5e72d103b6c7fe9f5a34fbf5a96f138ce09875cbb4a2d9689acbf330a8677b4216c36e8dfafbe43d7a68389ef5c1c12e6c6c8bf06557676622d0ca7a398a802c2289f045738733d928cf8558d24e19bb128d008454146aa3b24bd7a53b270b10fc6292671f9b2749a5a289c687913ac317c559c061b2ff79f131dbfe2d881d8e197f1a35be26b0f529dd9ad9303c0c301a6476ed58ac10cd1044d52dd9db90026ab07e2827bba4ac89412ed11e7a59d10e84f732aa31c4996eea2d99e08a1b204bc80541ea2491c37ff43dbc1c3eea54572335053d7908fe79dba1998de2c3969cf8b54b41f0e8330e0d3743edd0331a8d40a31681bbc2ef91aed12836dc619a67744d2ebef0c43c7671d9a0c5f24780bd852a7b7c4509b3ba0b0ed7e0391d339864e931a5822571eed5d83fd33c4a2e06f8160e2c9f51194345152c4ada21f52bafd8e7f6fda514e3f72986796c8a67cad571535116ab8db64a0a2b8658e1f8a9b8ebe1267ac3073ce17016206374bb6b80d0b8b2b0c481c09fd4bd3cdc0f62e3b5d853d134612361e75278842390464b6f1391b51a927655844c71e7c918d26d3e2db5c3f860d548d7310871806955f92982570b1290d98f778fabe10033f8d45dbf80c5aa6b51063141ced4a4ee0d2bd3440eccf5cef4c38cb97a13ad199141038e21d79e2a117461bb1584ad15d0aa4b99274524ca989caf8fe8ebf3a07978a843d274311a0021b4f0a1180dac1ee3c22b27d288a62c16d04b12879a9e5a6086dea7904b63e59e1ada0021e7aa8b2ae493db18b68ed7df5c822f97e4dfc55f9115dd07581ee074302b5b09afdbe88a4ccff5950d310d2a19fb0ae49bd268076c7b26d1ada5d3d4d2cf6a7a5e67e5ab519388d3336b6fc0745e3710f8df33815f8e54b7a909df5dfdc9d18c58a47b079b6cff2de77045938793803faf0116b8dfc261790c78a28a57e833e36f9fd32017e73e2b6872130c03c2ccb736e87066af17714b5dcf9a64b8ce6b37f57e201bf0dabe8294f2cd9d2f1e5776ee3d800d846a93858fa040a12500f7c03e8ac86f4d3616d97a712d233815b3279b09149c388858a570b464c51a7b1ce8980d00f7ca353f0ed06192fd41878615a764c1627f31283390f709d7b5b6de59ffe1f75cbd969bd28235e0e48f7877a70b52d914ff43791d616b1d987991ccf15ca697101f4e02286e4d74a4df17c1c94e738096ee458673d8352f35386d128e24303e7ec5ff66fd6dc9fc73b182a4a001da10bbfa6f4f1b9427461b31a97d06d2cc71acc89e001e2dbb9b672e23b711943cb95da0e3fea8fc4ba6b2aa243da09a4d265e8323b5c4f3eb3534dd752337da9aa7e491afae0a4d95e3b6737f66140e364705358d57bded2c97570f3f1e4e7412ab7f8e6b3bd7b3e07a9400c4041c68049a8b3fba5920d2324e07daf1836cac3dee3c864cf64a4e1164e3e4d95e9447079d43600e9458b8fa701b03e99ade4cc0e03430d28108ecf31fb7dd990d1f5f5ef84cc079aa47ac36d47d10c4f72d3f51ce101112d2f6de7b4bb9e59629c9b10ad70b250be4f64ee898eb79dd15737c273a904f7172ebedff8aa52f1dd62ed8f612422999abe82a6f0eb14c6dbfbd7c1bd3bf3ddd7e73a9706a0c5f1f6e610a4e728f5470fc165221c10c8f113227f4d73eea042ee98c3e4d810a35d029be6d56f2062ef1ffba7498c37a7498caf5da80a43809042ee98c0b35a235677d4f67606e4a2ba5bf81ef22d83050b42f5c6eaf98b3fc15c559eeaceaac29ce728f2177d95252b95c0266bbb5ab49e721f73f51e68efda47f9c0cd353dcdb4a5fe9bf2136cc24a67009e6b25dfdc4c9edc745bfa3b4268fac05daea20fc463ab44567abbc91e1a6a393379d5767c712d3b1c883a8692ca7101ecb299b33da9a2bd25892e158fee8aa2599a93796afdae69cdccff2de7efa556c61da502630fd6d26d36d76a233b32a338a3c85c6e892679636ba0ce539644314157cce115c6102e915a60d1d6b415372d97326cc1176d6fcd3f7ff6a26773e890dba67504a0a4efa04d251b26fdbb69dc417e9492c4f4fe76fa5eeeb3f09b3c55190e7100d5fb20d4f4ea7d34f184ea7ffa878ff743a9d9e8a773c89f32b3dd5bf65377626d34cb616d4a19a7f6732054115f81304c13104412579524ac39fe21295495c35491241714cbb727f67a1e438f9056fe375277408ec2f843af53e755882adb76ddb92f8e810dddd64534a29a59452babd10ca719c376d6f223efa5cb2e8e40e87804e52203c73d953fa57ce72d54cc3363a522084a6ff747dbf1fec1beaac6c6a7b2bd6afa37fb1bef2b76e95cafdfa1e956b43ee3b5676d09df3b9f9210af3ed6fbe59ce7fbafb7cf7b7d6dfb164dab16902ec2cab9a5faa1cc833477f5b027e16f4ee17eb8bdb4fb13ebd47a925639e3c7901f62f7b4c7655277880d2033cb9315be0c97d9cf884e3e856ebd3cbb3fd1215482f0eb16cfff3d7a07fb4432af76b1478fbcf76a40281cdf5c2b457acadc9d5e7a1e7fcbab1384d7d3a769016b8f42dc569be558f0dbbf7ab16b8ec20dae3aac31eb5c01d867fc3f38460a6422291a0e49a85862ecab5fb2e1c62bb7bfbef492792de8ad4361627eb93c416ea2c5b5011beff99bef4427c927e89aa4914248114fc2c68e99b2ebddfd7bc49ec5c9aa0934ae6c55fde2224121d31eee924b17f442ae183e2d8509c86a640ff89b326ed59bfebc086a2a4ce27d77dd01927bf4a81bf065370d6a4a34a8aceb569579893b583be073d7fe3cac9dab0726e2989e50493eb6f22932d0525fd64455b1df47df825beb05ca91098c956e909b217e4d6af457865b461197c377886fab6fd36dbda3937db02ae562b15a9bb6c92330ba9e5609233573b25af7ea0e1ca96c24d6c4eceeea176d52e79c11699b900d3a67e9dd5ae004d6a01c8aca356f043fbf6b3a257b26665534e7a6f4515c9867bafb514872789652a7b317c3f69768ad749cf76e3f679b57ab576b5859c65bfb3d8ee76b7d6afb5d65a6badf7952c79c159ddd7b7dd7b5d2862d1eb2ec7719cb5dcf775d6fbeefb3ecb71334e72b36ef65d995dc17388f6324188d0069ca5c20a2ccc700ec618e7ac643aabd56c365361a53333418810aedbacd56debad7b04ff03c5f9e534aa49e0159c355568e2acf2b6b00167f9d75fe2ac39040650e6feeb9cf329f71f67821050ac5f4e23ef5998b3dffdbeb1f44623db28a45e7c2dd702c70931328d36159ef8fa77fb5a7df04d1ed81a71d256d12d79a1b35f67af846c12c3c7e2def61667f5dbb79f8c85bd4ff4dc50c86cbb276b565fca49fc9fa872127f23e8243681ff7d078246acf757049df4c6cdc96e04bfcf4e5ad95bb22d5319bf922531803f6bd93e2d7b18cfdc7de3d65bec7f9856b1f647f83e8f521f706984b66a9cc67e4eb63648b6368b1149a1d8ee952c79c1f3813f0c7e3406b87b67d1b73fd3dd7baff79d38e3e47dcf9bb9fb500cdf133dcffb4f0c474fecbacf13c33004bbf7feebae77bbdb334f886fa280671632b2647f7be54af697f919b2e4cfb67b141060f2f7444c5cc9f6bfff4a2e5021c19cf11861ad5b7b2d0d1d00def2fbc639bfeeb38c11cb02c893880568e40e1d00be83a3b3f06a8ef97c6c0a8e2c9cb36d2499396dfcb73c33c7959373ec5c80bbefa009040bfeb2c3e431df59e6ce06ba89196682f1f9657609cb0e0af22ede4a6172f992fbbb80c9edd9fd73cc96104a270b7c7f3b59f6fdbfc9fa5aa577d2fbb88293dda8228d6577101627bb55f22f2718a61e2db058125f0667959d6550a93a685cc1491fb76b9a71f2fb0e6a0a4bc149ff4f1c372c23ec3081a1dbc8a46f72f3f7a5cc7b900ba130822c23f35fcf3021bd7d506cd2197cf03ffb61e80031db9162a9d13e7d4fdba9949eb64ae3bd1446b3cbbee0b2b30b39be49e70e65bf535f92903fec354ad3ff3d4adcbec0f73b1a9e34115ef5ed8208df79a8efff50a857bd08a22776064307748fea1ef59f83287166114e40e5f840e71c63abc4ced2b26e6c2c2a51876c02f15a5853ff51f023bd75da99443f146bb592845c7ad9894c3a0b89711712f220275dc8835ce685b88b32a30b39d93ec3b5d50a819d35e99409a42b2950d8cf91814b0fa2b0de69ffd3b5434ea30ffc81a6825db0dfa44b17c0fffe0bbbb39d19ecee9dd508fccd7a04eebe6007c29fcbf0976e443a970d0c02fbcf0c0281ed7fef2ee4de4fb138d9f8857845023f2ded834f7d9840fc5db0ffc150ca0fe62e74c0f70ec498fcbdfbf742fc7ea05b3693bfc7e2ac2fa8af0b39abb14cf0977414674dd2b340d2969149e30f26fb97ec8f1a4fe324bb497663b9e90499a4ff08a29049fa6331c8a4f1afa20993f42f8978d2f86ca9264deff4bcf15fa9c8ec231d93bff70f06f0af6f4f60921d473b4e5976ffad2467b77145f0595885ecc20768ee5ec9fdefeb1e1c41179d9c2cdc421de4648d93a70fdf6b1ec68f7aa7bff44d8b2de46416271b14bb3f892a8829385980ee4b954a84ee3b08cb53186df9c5b0dcaf4484b1bcaab1c4373ec758aac0b1fcdec9f12599a9c8e07b9f037c1ce25006ff060232f8261f3603983460e9dbf4a8f13496aa6c1269c02789ef24188e33d3061ccb257306fef7578401fcd249064550f4c0586ee50884f2f71d160147185ca43b30a9977263d9dfb5c6a73833d31c7542aa0708fab8204e72dca43d13c80ce224f73a4e5681cb5bebfe7156b5dfae7ee2ac6a64c6f042131458299c307772dec804629f5361ee3b5f550ec771acccddd7f6c3b7813dd5379dbe3daee0e458aac818ebd83369b6efe9829b852433f9c8dc99e99940ea6f1bf95da399ded122f71f7d6d8bdc5f12a0f6cf69d3efaa3ed08d524ab7cd0a16d94629a54f54696032f20463fea0f436904a24ef826fc3077e1f0edf063004495fc201bf0d212e7d482a91ec979ef4a50fbffcb9854b9e73d6ac7482e4f9a54ff4eadbeeed576b9f85ebedbaf1566bbfbead5b912d84b86f7533fddc6eb64e38b75c7c73a63baac3c9e652d9da2599a696a4b2b76b8cc1c996a186316390c15b9367899517826c50cb8e25272a71b2dfc382654ee0de726fdf8e0d33bd0bf6ef92211d84bf67cee2e22cef9bf4fddddb97f0fb1b4c4b318da51392d8452cfc79404e3697ee32f6ac085ccea354c662d957727f0cf762ac52fd93e4eaa89c471d482979c1599dfb5e2aa592cc09250a6e649439817ef82ed0af3fb393fc6da0154eec19155cf62cf7c720c3f7f713d2e6d14f8134a6e064d85f5b3aae208393fd648b012c0297e411eb491d232938abfb7e162697dcdf7d97af2a02b70e5bcaf6e20f6c9c5f6751ecb3b3ff5f274122700c3d5d351225cde0bb01cae6df4685a3941b3f8fce25e69cdf156f5f7bf7dfee992d378cb384644edc7cc8555cd1d65d959d375816e244beade01ef5207b8ff7c806818fb2ffea7af83ae39b33650a2877108cbadcc88b7aab9ce5ece5c016fb76deb7b5f781613718b61008b6d8a41a3605c9bc8a03b9cb5f359aac28a863fd6aa0761db5530ad688e5a4cdd4d494c0d9f5757b3481705b85b21d6d6aa43181500c54a76c4737db119e52a5ecd88eb6a36d8cb36ade7f3ba235373b301090e97467b5d69b5a436d6e76d8d01d3b6caa8c569b9b1d363b6c64b4deecb0a135766b19ada9dcb5379d8d5df5f8acac8fcfeadabbeaf159d91e9f95bd3d3e2b7b6d8fcfaa723774878dd12633323aa16aad3db5a395dbd1b3dac1ad563b6e8cbb3b7a563bb89ed58e18777b563b385a6d8ca3d7b3b5a7db61adf5b1618dad363e3736f5e6c6c6566be37363537d6e6caaf5b9b1a91f08abb603659f4ce613da7c383c7ae07c3d7ae0801f88c3a307cec7a307ce07f2e881f3811f8f1e38d7ebe1563b8c62b6f3a9373630192a75848ab6ded5119cd5c5c1597db0fbad8ee0acee119c15ec7e477056b772b05b3f1277c4ae78d4881db53c7a6c4f8f673d198f1ecba3c77a321e3d56c6b9bc9093c9643cbaaeebd1996a3a6e470f9f1d9c8fcf8e8eeb76f4f0d9c1f5f0d9c1753d7cb812a671351d88c7b187a9e4835562b17009fb60957cb04ad807ab844b3e58a4231707e6853c6c8fccd5813d389f182d164bddc8a1a2e53c9f1c1e3e1e0f1e3e248fe493c3c3c7cbe1e1b3b93c520e0f1f8fdb5c1e473ae5581f1fb6ae7cac5661b892f958f95885321f324a0b4d3299cc8765d588df65e15c1c1cf0823116ce65e15c30c6c2b9313bbb14c4b118ebfbbe239f78e3b3477a6c4fcf27c67eb0233df6488f18fbc18ef458182a25c67ea5140c05831db981fa81048504490a95fa8104f503092af503092a85fa818474caf178b842938fae870cc4ac8b139b7da523b60726e6060e1d10b4608f0eab0764b17a4ca0a94787d503eab07a280d34e9b07a404b69a035e1d061f5fcf83ecee7878f0fc63eb21f3e3f7cb0ec878ccef00d994cf6e322b9484a624a312448c494624862624aa9582c86e4e6d4886197d3a3ebd183d491727a74393dbc74a49c1eddf54249a89b1386e17f1dfa08ef87a208e1f58173717042a21bfac0b93e70886ee803e7e65011ddf0a41a738c3e44c891a495a3d552e5502569e548d2caa14ad2caa1ca91a465c2a103b2280ddff8f11d919552483c1e6248a89cae07cc4b78f271718870e40842225d124e901c1c524e0e4e8a94c2099283430a92834367a454901c1cd205677446baa91182e4e02409437b6549506250b22449c4a0644964625022c864b224add6c9cb29d66a7939c55a312f27552c166b753add4a67b53299563a2b9d9509a6b3aab06acaa1d3ad7ed48825eaddfce071e3f1e071833d7cf383c78df783c78d877ff0b8f168778447318eee47e9e6eb129252490440a943d2a3ebd1a3d49568487a74487a74251a921e1d4d464757baa1832643a32101800c901d999d1d1d323a80ecc800d991d101644746870c909dd4084148394646281192843ec49c542d90e5c59443e73b428471fcf078946e20e97ad0c0990a9cd555a69eb050a65e2928f8a9c875996e4794a6739b63ebf125be8281b00b7a671383734c3112c241524a5c25863b9883b09a2fafac5f0c7eff1c01f83225a51aa560d428f532a2342c70a310ff6a1a4883ee604d6fa5f6ae97743b83b307344f090708129c1212243838bc9470e0c88020c129014182e3a584430604094ee9cabc942e0e00c86432204870766ac46a493d3b393da49c9c9e1b44a41b3db19d9c1ed24e4e0f11e9466c27a787646344247b43472c16dba93d41c2af112b17fa04f1e113faf0e1930a533e417cf884417cf86c4784a90d16c4874fc86db023422e250383c182549f24e0d7885efd1a709584b50259ac150a44ad92b0566012d66a530188da5c49582bb06e2ebaa900aca811e8e6da5c4956353fc3215dd3aaf9be4634d16f9e1a70f6ddb48edc7c478edc9cd8f84e37b4d6919baf75e4868def0476a1b58edc7cf467b445df868d8f9e44f06835345aebc89b6e4c5ff795ec54744a5028fb53108bf72651fc6fd6ad56a75d2fa9e6996cb9046136e295a168405fd7d72d8a368170b56e3bbe448d41d150281a2a0c30b84429533f2957f62d4ee35fa6a094a81aea08058656f357f632597ff3803ff40efd029402c226909af7077d98404cef25b825ff58621909637985e82c287b09c6b28b63796119037d5d5fb740130857eb3683fc3c8fcd97f84a760ce4256017f48ed7372dc404f2efe06c4b76b25471f12cd9816c80f0146791f0fe186802e97ba78dd84d9b7e12c049691200cec019d561daf407204bee67419c9406d3283fc449693623da12d33b740721a32023d762daf403408492fb8120c1a1c98ebcf48ef380fec8a8cb859836fd3ab8907c8a03f5c484887ac75d308bc9620dc6b4e99711a5e4fe206208c6874f1fd13b1d86c35eb096c1b46932495f99946625ba684b05bdd33330c22e104c9b7e11c4fe16158f88ae4969288db6d8e89d10f44dbf57c10d44cbd3a65fe5d5883bc44969bee81d9ebe9d53ba6db5725be5386befedeced3acffb3ed0fb40300c49a452482a953036994e18ac318135a7135883428135a91b38361c38a8378ec601768e1c60ab441841669391a1de3235628d58eac8359f23075823aa6afe538135a208df1c611b6104ea3d42d7b4ea927c44ba015103a2114ae39f01510906c46e41ec0b886d01b12b203a0ba227111d89e847c41e7f0a90131025b0822c023308143d80a68203c406f40f03fa9542c350e82a0be8d8091d64a465457a46a48b8634cd0451017dc4f3935f426009a852420c014141643b3320453f683a5e6bf911ebc7c72b078653a547cc01b4662c3bd76cdf3ce08cd2f88741b8dcc059f6df8ec01fdaf279ff2ba32d9bf7bf33daba79ff5b445babf7bf34dadac0fb773fb4a581f7efaad05606debf93d11606debfa3d1560befeffdd0d605dedfab425b16787f4f465b15787f8f465b2cfcd05612da42f2fe9f8cb68ebcff47a3ad9edf21a3c01fe0276d4de00df093b624b04204be003f690b024f809fb4f5801fc0cffca42d07bc0018f0e24fda4ae1ff276da1f024fca4ad057c007ed2d6090f809fb465e475fca4ad222ff393b688fc083f696bc88bf093b64c78d54fda52c0e7c0f193b6f2dff8d44fda4a40097ffa495b08f8208fbff4a49fb4f5e3c3077fd2568be523e72fcef7781e5f7f25deec10af4d8d38f301c492348028d399b2399b4593366b0210cb79f4f3827595008865c73aa8653deb225ad78e7e5eb02ab120d9cc8b9c068aa5d7fca8a43f2f5849ab943456cb2b038bb253d9b4e94ffd707200772a50f0af06a1e01c4639bee4a039abda69e3a10c97178be028df10f1a7ea6f4e6bb42da8bfa4335a947b439d2a3dcaf7bf8ae4cccb70b9015509c1f82de6e4cc4806d196ccdd8274b866a04cac47994e8656a3c315a32d142d16cb6144a32d124890d116094694c6652418c9b2c7c04789a52afe7d58bcf1a098fa2a764f4530cf09a44bf82715f0bffa65128c688b84234c8251f69f429c044ac251f62e7f47f7de3cc34b452f875f7e47a81aa5f13789281a6944d1288d7fa5d57218d156e952213d2876a9561249e3f79b152ae05bb1bc394401d1d6c51b50f6ff999aa35cd6f477e4ca5e7e47d9ffb35f966adb0f98b1b3caed27771130f788a2bd00cb04d116f8be791d0d1c45918e2535ca650ea3ec8fa26557f983750432f32b4f0190e07a5b290a1ea4d830a67e81673864e6da00a64a96ef6b109c242d5b8aba4a056d48843e37378cdfd2f0049b4d582c9dc06033a6e1103c964e66b6a52ffd0c49a527bd154b4f123b2e7d63b77048691442ed876fc5ae0804bbef41d17ed730f77c5b4a587ff36f27a6ae437c73053c896861f24e9e44b425f2c7c2f63e37cbdb930b05479960c2ac8a645488ea509d70ce27372adbde8e332a64059639c1fefd6b858ad02c4e6e7ff459d23b8cde8b313df2467113dab23839ab2a90c21cf61d905d7cbb5534e8c3824b5a672c7c046e284eb37d942b054fb1e2301c8f63dc5e1763958a14ca927b9302845f35bf1206814b0a83ddf8ed6915d36f4f839c2563fa9953bfdd78f008dcbf9d7efb7ee1df64f0cf8c2aefe97598e59a3c87749892371785519a4d86dc63e91ffed0eb4b1d23d22327303dba019639618b79b8c4dc7f4d856d4ee52c1448998e00983655866e42e6eeee2e6732ddaae0992a549452fa4b66b870087db27b864bccfd3bc975b78e69c3bd4e897353814bdc2a67cd1c345139c9b51def6ffdef02a594d23929a59def7425a59476f3aa9cb5d1adf41dbabdca5974a4e2969a197b6ea7a3cac9717b21fea40e4b9c5dd58f9d5439abc7fe928e2a9c3155a581cbbfe20a231e451ecbdd2c64eeeb67abad757b4e5c329329c569e023ac4369fac171cb01973a360778ea20b302f8f8f128037ef09df07c58ec14dc40e4e271ce5e53111e709979ab2c0093ed36961773e30c3f3158e436fac5ec2626ca0c92a8bf51ae56a56bbdc371305bc772ca4ab97418176a94a80b0bd03514451938745e33fa02a446173b842aa09a15586d082e82b801886d40532c11024da10595532804a5730d4129820952490808f0a5c58625bad0d2c5baa8c264e31ab2011443423ee0c25aa122622f78c25630b6dacc35461741e0622f1d70b9403a382397130ca69ced224c16d8ca1ab3d628d010ec0706396c94b3a5ff74cd5973a88b35727fdb8c0245b1b121338ef8f13ad7e68a01ecbe6210b44307e48311d114247eb0616dc8ca0cb52122c6101541c3055f9da58c99500d42d41bae19119618cc6a40d405c7558eb35ccdd56da4e5061718b121d49cadfee3ac39f425062c9b3b87d1970e8714d9020c7e2b563470a9535f086d9dbe3f06199ce56ffa7ed48bf0aaef57425b393e2c91fe7370db46229e7b331a92c1eb4500926b08899a6a48063f5b38a47546b8238c443c8ff0deb7100b5225f7506f3df96a424534816b42450035cf08deb5332cb245a942b9ca158617f26d98142098ceeb0471d8d1186721c0a55c1d93c6be4aac9934f6738841268d7d1ce29c3437c4396950223869ec9f52774ed2fe67c20a1bc8f7cb26442e912d7b230c32dcd15ffe73a50aa134ad93a9802fc431e5c63188eb38d9d3a89bd35a3be9a83369c010ca756c87d53a7a2ac0a54e6e9555e54964854ab52f5347229ee973af13a45f89b3504026386b12e1604b7d17c20198fe663970e57282c9cd534e59912d683067952b2067fdf4ceeca3deb13fa507b9742b9f185cead4f1469e435b6a0c6897c2647b9dbcc8651d672efde787b69a67fef4d1cf4f1f6d5a7ca03879ac07bacbf7e790112ccfb048976588749b169988735f15dd7f1c8abf9c24bb2677d93587b914b792fb3b8cff38142bba148721819b2e91d3639cecf73e72b275668cd096c3a60e6df9cfa4e9f71f9d539e44b1137455a5bca5e334fd36db9dfbf6b7fb98be4ac438f5dd7f7f2df771ef89b78a4b6672ca5bd3639f5dc014df9cf9da29ddeed3cad96b5f45c346b348683aa5f186e2345fbf3c355bfd013a77482dfb5b15fbd53f459e18614a7d28e26f72f3e91b465b5d45ac43f0d84126918afd92d829b1b3384d139cbb0926e68dff49fcc0cd786c2c46f87795ce3dfa7d547e2e4f0d24b4d1461b6cb878ec9b442aa8c7359050fb146a7c82fa1b9e07351ab13d180e0943703c6db9e46f125ba8839cf4ef7ef074320cc12f81a590d424909422859854a2a5b004d252e96be880adf4381c521a7d907078c2f68d137fa68e7a4f9335dd8e143e97b770482d6bee462e44e13694edfdbe7fbf6add36bad1196e4647a8844633d2515c1f7da6c32769ab999834fe51ac6e90bd8ae9bf0636fa48d04e6a354d91d58a68341818d9962e1dc67f84da74f0dbb6a654363332fac265cc9299fc1bad362ba2c966fedb1631b8ec996c6664f4854b97be49acb14697cc46961e62034beeef271de59b8d20f6cdef0c5cd2222eb9bfa44378e57edaa5298d82c9fdb44c0a49c933790e8d39ca5fa955291dfdb36defeed77dc94cbeef1d927eb0c09fef3b16380b4cca53280760f20c87dc76e5d5d098582e409e43637ef21a5b7200f21c5ac34afee617c6650666d20467ba8516f3a6ef7f9bd7da1ce7d65a7ac32261916debbaca15f169b3715fd222c7c2c3016f9e054ee549a4a58becdfed9edddd299d93a4352452647b17b7bc8545c62dfbd75c43d20ff6221e16a99654644e9bee7d2cef7ba9fe2d2ce26f9f727196f7d399b3720d3498a30177cfcd803f16a6dbf6750cbeeeeee3dd38e0b3eca30ba5cfec7f335ab406febedbf500ca2384fe767fac919809f71e68229ebdff3a719c33cfebc4c7179c9cb48b9398b67a8649d38f834a87f60177f74f2ab0f75f2670e9a4a281e7d31a8a7b0d6121dbefdbb7adb864266f9be74b9cf4df38d01ba11397388df79bb3caef85fb4a68abfb3bfa129fe52bbee0a47338e0eb2fc48df2f7e53ca27951f67b6d77778fd62ee1c221f73d51899310a03cddb8551942396b210ad7674a5ef86838c4bbdd77e8b30ef8cc8edb164e4a655bc408712f4bb9253e224330f731730d8329b592a9e568964cc79206b9aca8c85973080757f6ef2ecea28ec5b7f49770fbafddbfdf0a2c4b7c967f13671e412cf76f3fc06503653acb944e4a33cef7bec525cecdf994524a7fc6bd85bc2ad9bfb3e23f82cb3c4874a16d742c6678d9b39e396bb6dee56f8594aebd177c41283737ca5dbfd6b9bcb1289d746e354e367dd2e78cd3e97313dfc92cf0fc7e7f7df585b80fff4d34420606a234b3ca8de12095d0cbc819a599437e504469660bcef259d443cbfe2c083181cb982e355a460b79f3f63a29fd2936a9d9dd7f8ecdc4c71ec2abe92a4767256b28aea5045b5acde30dc55926ac72bcb9b76fc4599efd5370d6d462c3cf136f915e43687cc93e85b257170da4d8101a617239c71415d9e28b58448b2f62112d68ce9a43629ae0b2bf09cea2cee520444ec18d6cc12529bb647b7fa9eaefd7e64548a9a35394fd83a874d4cc2cf5e70c4d401b6db4c123aa9c741ffe758c6d94e99f3c419cc6df65fa479d2a045ceae84c37228a5c84b73c87ba00a30a2c5548995b0d09c073e8074bf67fbf92fd274af6dfbce53cde2597334fda881e18f17c638a6c01c6595a665d7213cf1ed886f0ccdfe75f9c3573112d684245b6f8e22c9971e6959bf17df3cbfed9e1e82404399166501c12fe570abf43229fc8a4c9d64ffb9d0271c922e4490454cb1f05492451e684f0491f492c8bccfc823ffd0ef8d3fc856249a433290cbd90f44d0a2b892412e91c3eb73d280ed9a8e721dd9ee77db5d6caddb6b61b67df5c3bcebe292f76276173537c13857e530960d9f4f5bf1238969b68fa8f85c3ef3f7714fc7df8df684414624218f8c32f97a472fdd26f6f826f210afda6a7e109e19bc6b27ef8db83251573e70e13264c98904a8fbf04bf49cd45664e71b9c8cc2a27b72f894d6c2e32b30e27b7c7229326f7bb198ffc6ac0559843d26952ca45660ee2e4f624910913264c8acc3c7bf34b7391999b6cb9c8bce1287b4119ff3754822a197cff09a4f425e9e7d73cd4af23f8a6c93df8dcbb009a3616078e269a4da66b1269bee2c6daa8b7d186ef84e053269de797e08763088ed3c97034715c28d6ef908889494f9bf09b6c794e1bd39b1ef4024601780e79e992679e996402df33f843409913eacb803f73f9817792bf5adbd69248e7fa443a7723112bcef0af3824ac26b133c924faf7df36c3225f49ec36b227962498c15dd9337d5712bd83a173d74e2a49904d6f828104df873f39d14519d3cf36327e4f94313de967fe7a84a14b1f3e497481448434ca9c50420ebf840c7e0882a30bfe20386e4e6e50640f387165500cbcbd0a2b388b0404fff6159840c2df48f0256fe5a4e56ddab80ce95d08b128431a89840fbe935c0ac9e048c4fb4fe68412325842f62e4b1f6e4bb2297c502c53794e9bf2fb2d74001e85d012fc39725fa22411ac23916ddbb66ddb4417fc3f14bcfffeb320f893759b8722a07f8728f87f0f8a32287c0f3e38cae0efbf7286e148644e9bf0e7b43195e0775f7a1211f0c12a92c407c7ea8d9d78c55b9dd47fa3f6cd99327c658765ee493b961cf8ab991344477c2770cf3cad74bc47d3c6ff8659054539954a99d800e222c4633299accbba68c8a8df5028ae668219e4d3e964a2ae4c5db4656926d4732098289070f16084962db678a10005ae2488bea032132205b924f3cc69fa4d26532a25e2acc3cc0b2c3818f1100414a4b0b8097820c12b400e36e8e284153cf4a0891c4a4229b0b44643c73de1217840224a185a1059a106948a9a29214c27d1d6b8544a8a8c42a14ea722be18bd52a00415d80c27985bac49e8f4a8ff4ea8d3e9878a6cfacd8403956c7ad05932f974011a40b1c58a34a640c30b1354d33c411183d349cbcf956c329952b4226b516fbf835ac87ad97ecfec972dcdd22cd7af8649e144b6a56cadfd157a5a50f2820fb2fd26d6f4f6496bad162856b245655b648bacb54261b2b5312229b6e8a45229da1919f51b0a8542a1504051b8b088028bcc65043c11c25a4e50944f5c2ef7831ea47015d1a084cbd5b2d768cbd26ced64ea93586727b8c17543971354d138a08ab0d6de10e92b95ba91126994d4f8540c37a652230a452404944d2693a98221a2072970f8c10816fc8071c690106e38038d1dd0e81274a09d5a5af4e52693c7052ee9eb8927b2fdcdfe8d922d906c89a098225b6b4ded03032228631c01810644dc4086145b68d1431821bc80066d03caf4a7d164b2358e4631fdc7994e7f1a4d237d611a9ce8091bb2fd91adf5aa30a38c2a3830ca810ffd649a84387126139113b51bb4d3d777988dd51bd5f4f59b563b721711b98a902badd26a2a48a8653df322d76f2ececa91eb77958aea57c31a48895cbfa7c4405bb7ca0a3df55ba8afe4051ee4eae55a548b66c85aeb0b8192eb29d757b541438c5cebdbd88d3136664c3e9d4ea73564904f9f3abdaa04f9f43a9c25803f9180650817cfe9741a0214d9f49bc9641a73826cb2229bc6f4209bb2c964dac18ce6e231e12f39f55b2a65caa20610198542993e9b4c4545680ce186081d643942a3284b1a542080f31245e8f5cafd5eaeb3406c3f65b3a0e1826c6ff057d0b25437b22bd7d10c5a20e4c59516d4109ea0b8c1e41ec57126d3585a6bade7c5dad3494c1207489db8e0408d57cd082964f4408315c2921a51e3693c8d25f7361674b3c03c6da240d3fe508518b25c2b98fadef778df82f74abc7f614bf63ccff36648ef573a429e642fcc1ecda3799ef7788bfc791fc3d0133aecd82f58bec0c2892672fd542d09f172f1545a0d829a4081d8041242434d8cb165084b138f83307820c5e5f98c3b951004172f4894f143ada867a8a6af64789eb596eb13c90ba12760be3072e204edda01fa4209294fb06c216ba34be2e40dd5808701c4ae944a8fc7c825542e959e2c954a440c65eed2da132517a22d1bab4276760630e30b22143021460eaee0299f8d5c92a51978cdc50679597811e607319e10f9c086356ac907998b5d2995aed8c07482106461cac0020a2d448ce93a68b4b1a0d89520eeda7925091c348d8e84a045500da6dc00c610c28a44168e8b59eeca00809090b92ed11520d4e75f9efceca043098a50230d357289d7b016288902780230228a9f217ec0e58a1bd2c825cec944560b5cda187d7d36668380d8428b20ae74017a094085069230b820220223053e80e22835c4142de0411720683000dc8169810f51d45e18838c159461440b8850028d5caa9ec44355c6589aad791eb7b3d990ad4be941904b9a5934c7021ae4fa5b1d9282825ca9c025d20699fb594e99b596f3e168841f7618fa618c5cb57ce7c488214c00c694305018c5408cadd3132ae20a4c5fd32688eb495f13086d1fbab8d181326881b5d6deeb4314a3a5795e008070c4123a90053d41c41931226badf5f265bd318a1dabb7915144aebfd56a2d098a243c9f4e4464d4904b642e956a271ba33458b624818234b860e28728c2e432270791b95a6b5c72c9c8e572dd5013d045098c5c33ec40831866d45a6364e45a7aefbf9257a2b48a46e67640148429b808c10599cb420847598c31c5cc52db21735fc3ad4a482891050e3dd0808ba32765dcc825892a9d8680e28d9656e3803c1a5c06b9f45ba9748119dc90831a30c1c3112f20c38404058289030365003430479e510a9e18c20c3a9461a5f695c63a460d03d0b2822a5d9e78d102e322c8676494db4b0f3df4600c2c3018c20d637c5a9c4e5eff7c7922229e0c801b4b4eb07441c50b2b683008138510be6a4414dea9f44443dc40e665a393128819c3041541d042461a3c3308b9549520f4829215654891e5ce521427d1d268dd40ba54b22207b9deeae406368010824d39418d053c60f2299b506b95c110b99ec6aeb5cec27c1551a818aaa28b212b66208298159cf183900d82608003318cd842c1c038c01b1541a06286452701e1113ae8e6a61093eb145464a1c11e68e54b5100bc2370f8a129982001ec186d595a293c4268865180ea99aa0c689e374600b280c921d71ed49ce58d5dbea99ed8c8dc68694eb6b79d4e624c21d64ce092840bb6e8e0831a3398210c2f9739d90a149506e68befb72c6204913dcfab795284d5c690d8c1fbd27f9e686b25d1d2bc2762c1d43c1dd8d848a38c1100cd8221911e9b91493893484f9248cf058e0a7af8a14505530c4035f3466a5802404b84041092b829819b60bcc0f37e10610a6d24714c11677411ea828a185780914b9c936342d60b239b7080379edeb4f4c083fdbaef9f186cd77d4f272b2207da982c38a060069e8e96bb7f818cdc75b48e36e3acefbb27bb5f75dd0b5141ee54b903ea80baae7b9c82dc756f63634c8d23726561ef4bfb9646b9d140bc22a969d35fda278956889728cc5976ecd2dfd9dabe3496f649237d519867ed486178cb257d591d3cad237f2c4ca38cf42835811499f56ffd1b13083562daf4d3236735ed056d64127d39b592fb471acd0c213297059119687c997b1c86862bc2608180cc3db943e6ae38c38bcc7d0ef73a42942865ee8d64c9dca7e02c9cb957818b0032f73d2cb4e0ac4924068dccfd069c752373af044ae67e094784c62c73dfc4593c32f731cc90b997c159ae1f1b32f70d859b44475a64ee3b0a511ab1cc7d4be1d4f8c91c29735cb54044656cc9dff77139007531d4239d2e37c88105500c99a0064020d95a3b888a9f1ab0e800085d0069f9c2448232daa0b06644163568e2e57261eeeff7dc6f41c90b3cc8f79b38ebcbf7fb49ffdc37425b3676ef93f757f7759ce5e5fb425290ef9be0ac9b2fedd2ee7d1c837c3fe5ac5337c670975841b636b01b7db100014334286ae51e3425bef0d1458c28ae70c86dc1075938b1031d846848c30c1e2fca9c2384e8ba56220812947822933db760010b9ca88551431b3ef8924bf25e28c4581b54ebbd57c4d00439a9c204d200b02244102ef012c6146a7491cb9c6c8580e0388eb3b68d1d43578cb801e64ac8a56a0910b468a2055860e122c4533e17b9242df74360087996e34a7fe77deebf2b46b9f7bbf1efbc1cfebe24a2e42a936bad43492091eb4c656dc2226a9ebfee6c0dcd40080430027ea4b189f9e5571d863b50410e3fe5ac30873f438663f82a6fd1170d42e6aec8dc5f2c8432f7e00a7630948510c8bca3b6ca369680ced620d62f6dcc5e69211b1bc4953773387326a8a04357ce9a4432f06216653bda201b93e1f9c3d3dc1017293336e62cd05e714f0b2e6f1467c1bc35672e97cb061efafe435b37c85f1ead46bf8fe8bbab0599be3f71966763411307579a5822882c382ca104cffc41a64c04656a69cbd2fac94fbf686b4ad1c61940f400468b0980e0a10d1425b36ea61f036d59204ad3bf424f0bf49538cbcbf45fc892e9377116291ba1ad5b85d2b42da234e48ab69cd8d0c5115774c9e1053b18e2a1afe3ace9834c5fc8974cdf8425b09081451844a8e0090ff592e9e32332fd94b3c04cff067d6390911399e31e0321739fe27ea0449e5b32c7c50c5907e9d9c6624652b298bd9f950c5cd25710e5624041558462b9a98c465bf435d27c6045ee7eebba92fbaebbf6b6be336a423cdd05b24063e48b45bef745a39c8c6e15daa2af5bc54b0db23540b696c29ce5422ed7c789227dd157e69e467112e62c6eec9acb954b6ea430fa72b2e98bb69ac716d1d6b545b97ba046aebf392b27d79bb7171116b9e7fe6271b21f4669b8e6c62b74839ceca0fc0aba4239e00994bd215c32cad7284f01b81315ed3ca88c2746d872c68e4ffe0cf9e48c934e3bd2493a71a892fdb79ff196f3e450a7b489e77e6b59d4a6ca2dd790b966e6cc2c5e33d3578676f23e1597ccdc2099fed6ab07c792beddc4254172df9f77eca7df294ad688fddfa693b7996bc1eba4c5bdb590e9b758be2a53b149dddeb76de3c6b249a6ef94b67fdf7b2215326dbca76239b364af83e87c544cd31c27bd1a27bd27673eafbbbb7538e97d11b1c73248eebaa7629a8a4fa52377ff7daafefbf72b815f676e94e9e7fefecd779441e17efddb2734769248d77509e6ae7b225db72448eef7be13b1935e4feabdcaf374781501aa45a8148c590a83da212201000082a0002316000020100e87c462c1344de344ef3d14000c7ba24e6058a54803254641100529658c328610203002233043e200b8924026032abbc5a554c12dc72a7b4e3a79ecb0decce720638e75506e1b43bc899edf780ea1b18597dd294619d032a09a5e9bc78d6bf456404f59222bf0d9920b61fa447aacd78f3642823ed36cdf4cb5b0db8eb3d7c8561e7e97e44c0bb1b2aa45c5593565f1a1e309b1f2510839c285ed655ed50bb425597b33d866266c0a1fc5ef4da63d7343cf4e150add20210f7f67731e97dd3b516794e191ae3bdc71662e3ee25915da493d050775be58acab87e90e97c259b90f45690b263ad3bef465b580962b2801c80dd8bbcc670a19158b73e13b21c9e3073d959bda28b18fafc951691f23b53bf08ad0f0e07df48bb050a604697fad1d451670baa51fa26881e322a590b052b1a3e87fa23c23c21f7b7167fe3947345d860f7f6021932d0909d9cbdb5191d0a03bb7c537f66490ff1ac41fe94655c23ca41a394c2dbf7a3f59b45847ea980c79213b4168a46689106d165b51928bb9c86669bc1a7ec9b3678637ae8aafda0d774481fbc2d1e67e7538b7184a3872e629a8c7e71e1969c33147e5cd3b82439f4912a9854b7fdc7aa553ceb41d9cf5f2e69ea643fe760838b159726a7cc47f2c0770622f30d6a686985795501c322ff4a23369c62eb4e86f61949f03236f54b8d64a26b7117f0254809df9cdd1932dc6dfca3193cef258f385a5583c774179f851a78129847ae9f0e9ba3b228496e288c2ae5809640aad910785774d0f9291d0708bd0958079d42004ab2c8a5a80d11d393a98fdd2056f293d9396ab39af151c22751eaa4ea32e0b8c0182067294405e64a86bfd69aa6e710404a5ce4cd4dd6c9c3aed0f9e97a9267e104d720da366a68d7e602ee3d1a25852265c734c9bf2792ecf19fa3eb0f91e4b025e4d18af52139c8557eefd8d7020bc63b7c98e996f9c77a1c263af5924f33eecf518cab91f033135f0921d94791db80448a03017f59d16e8c46250f170773026f7c120d24e548dd10a8412a4e687d31f169e62f952ffc3468f529146ac28dbc90ae4a9365eb1a0a864433107f6269eac89251496edc4ca24f7485185c017388ae9d0e80179d1de402621d2c0058e45fe1ce0300c953b025c5b828b343ab00667f13229a142270b0415b4b465b46c24c547057ddd872cc8ae235a56309f79879b551015ae4d5e028c649958c137caa22e337e1e17729575af85600d189f55fca094eb128444cc52b5eb15dbf83327e12964e676369fae507e83e7b37e9fa653ba3b2a0c3d311e35089e20a6cc22f143558122fdfd294693841fd703be7e0828d1de2903645c354d5e0ebdeea55ddfb78404fa2b9c149e879058aec5ee1d081620c1b137d1328b67b741997641ca078c09a5d1cee2848a5f30c01d289b30e09d809c0122b4be159f119aef4ca0b9d37cf58d8053c4ad762af9bed92dac07fb6311bda1bca462877b0540c17cd94aa1e2148ee6678a5ddd740c7d6e141e7e14ef39c1f3c30f0f2d8d0f01aa390c4a83db0472d3f92811c035ce197ec8d7371bc3bee20f4968e41133c469ee7b9abed126785fd9395da19adbca780570bdf71365da95341caaae6d498b55a08236c4c655d966dbdb97e666009523694fcc38dbba841f706cf3dd7d71f52158edee12eaf39eda08e8c30e651f1da3679fc0cb19468c7ecc09edeb72be8425d6c99e6909e4b56b0a7c52980176d6625a9bfcb3b6475cb5922754c3a85ca3a1869a1344e26f43d8fbd9bcd3ff8918a44eb745d7590386e9ea3e44d57b2bbe816eaa78174c263b8c50762c528c2e44983dcfd42bd0a7b932e1bcb7c244317748b64347ca6d9508f6924795e1bc40d2f30ea5b4d4ac040f343874f06f0622431754d8d31a0c8cb856ebb99024379a1b3f59e3d5c39c2a9ff8c6cba47e76f7396e43b817b8727f45ad2a087297294cb6cb577784a0640a17de482a2baee9d27f7549b58b7a7c83e75fddfe4f08bf37f9f8eb8470e39899b7d32ad18e41e479e1d63edc964ab6043341cd87b10aa4a61ceec8073286a8fe47ed1a4ebbfb648da727796178cddf7fa0174c7e6c38882c186b208d7f7b005158113606e34b1626b0907bc53eda88a1d7624fd3c9298aa1c2d3d4201d8c854f13fbd15583605c4a4ed87c9c0a70895566ba027ac804682b7216b59c55acbf8b26de979cabc10fda83c5d2fdd515497ca0d7d7bb70b09aa912837190b82aea25fa9180afe905a4db7067611bdeee4b4082c92dd0cd41e9c32c6f9a748d2f9746651743b8151c93b083d74dce4425ad08e9b540bb385fbf79fa55202def20359c199e2341034d715f8e60608906c40d16c7e2ee02396a37e4cd2a22324bd5599cc15116ec53abcbba72f39bc8073d3d029b78f5de58f01fb8c6a35d04913fe10642cfa4f7aa69faf8a2a89afa94d6a0f0e913e9a06bb5e24766fcc6a78c192c74f910c5a17596ee82c2cfe60073a70452159077e2ea54d9cb83ec3f0f0a146a0fed9a7d7429c6348e1074757a3b7080376a2968297d867ea7e23b141cc0d7fff3713a4a950118ab91d471c7a8361f38aa53fbf0e237c6389cb5f732e52068b8d90d9d7dbf8363265a66547744098504eae08ffaf26cb629d51be4809314ea095ea41a8574670f58fe0ea744f2d45a15288583211c461c81a8a7a7cb41eec0e06980d9c55b5654f8b91794cbfee1efc54bbf4a62baf9a08378259618ccccc4885a8189bc1bf78ee6b3935da64b8e2a03fa0c32ddffcb89c8ebb89f25b1b161b1a62e6309d2be55a51a2a6417b84235ccaae1dd82d80c4e206affa8cd4ee522040e369dfefbb27718d76c1d7ec2514a9b328edd7a29a694e20cb614dad8f430011c3daf6452f78d21033bddb11c4d4d5d3052a9e329e4db0460ebdeea113a524609c5b12ebb6c87e1744954d97bd23a367fdc7980118d9265345bd76e9506d0d1fa4cfae6c83993961b5257b61473a4ddc295b67a6fc5d186626c701d1414d034dc42750412d810b4ef6650f90932ab9c2bda43029599a8e78b504bec1d95ed50d5f710b5450b15b81f53f297a8205d59c22504cacf08e14a1137c850c4c1fc786c52878f3d990b0896da8d4f1fa8f5f79d7dbfc5afd034f25839a8be3933ff3ac200e8c21a782f19051b2a07ce0174da0566a3fb0c640605104a03c283d116d873f046b729e3da38ba90ac0fd95654839c071c92db0d781714b4aefd6705f4b3f587d6741de3d73c91b4f1703da4b1255771b1f315ae6ef942f60d887d2a45e0a909be0d4140f326848e9201dd11886d949cbeae68216e2b8c341a0aa6d08cdd0e65033305990e2da6179661eea2a8725f7da9b4316cdc2264e8b37b6fd5fc33403399ca56e05269472d806c0167a87a5299144f619b597e682413c2af5bbddba4c42d61d83c5e55f539661e1eaa7108dea16c43e1f3a4cbe602005f97f9e6bf64787fdeeb55f4b873142190b2444b75466a68ef052deb6b67d6a8afc08f850a019f8f0094c1beb39b5567c0cdf904a40484206d6fa8b3cd668e8c08e46a5f1e7a38b63d2af507202da4d6560e7509a502554e7d7e696c671d2f9569797ff44ea544f1f78e9b96198484b6c37dc38524b47f259c358baec7b4f8b61624ebbfff33d12e1296f5c0216747c6f0e01c497882f5a71ab49e9bc33dec34d9bd0f8a4c86bc0f54fd4252d1652bb2d106a1c4e96891216c665dfc5ab1e14e7551e208113008543de9cb59e90a3c795a17972d320a7ee99d6232be5509ff6548688f11f7b9fcad1f6771ce6f8ee5c33d420a1aee772ef2142eca31a70352483fb3ea346610fd5e686b9b3f3aba5109fcabf8f8ae8497a68627c681f73964c889bcb50fa178fc7c3730f4cbcf3fd89162dec2c712ac85a1bedf52b2583fcae50b02885ef9afcd06c848fb56336214b97d502fa2092cff033f0ba2309fe75f6c67724ce9e161b18294b8a37c33c62adf90c298b580f94ab9cf05a5c52b5573bdd4428f5ba8d36e4f5081323666f1a310bdcf07079a3d6aa4ba5eab09aa41dfdd015d3e1237ba87aebf61cd511a17314b63ba360e01b9612763aa5df3a6de63b41223967284d2f3515cf94b605db7cdcb36b63aad02211467cc8cdd47c941b0a72ebaeadf5c3a1512df107d3e30b863809899c3471526b96aacc0f82fdf3cf07eb0c736ddc7dcebb90a9cdc9d07e309ee36c5c0637e80bfcac16238da72254a3453a4201f60c0e52dcf88c0fa0b8e6e0c0943d83db1276733a450d81492050c77ea55cd342c995f876b2fe3e946d97253d57e9bd44cafa96e57bd299c1ab8665ba4c6d6f6307f2585a4e57d5134b9a20f7d5d390a1649afe4584c61a90886e19826408d2cdda2fe13a8696bbdf95c4f564e3fa7c4f88d332afee0e765625a60843f33308db6ff17662cc388cad0b1fda9d64fd5092222454e8f0f15babd817fa86257326ee75c12536600fdfbbd347dc5929f0ecaefbe4c5479c1417e985a9b2a4fcf357ca78383ab7607bd5c9faf29fa6a89448b6b575959ec50e089d1d849d4aa25d3d05b103875e6a6681d529eb9778c5f0a10d1b47e46a350135dde0f3f06989a0b59dafd7df1b5246923b624ca14d4bd69c87b244a0640d7b0e2c4eda600bb7e200106d87267e166cbbb3eea4b6c221c9b669fbc688722c1831610848c431aeaa6493d45887d3c3a09d2938c29c0d4b65ecc1a04448c50c765fa5c9d29080371a0f30c8fa78620f1c47f1e9f4297d854c52ff1c2e7d5b71cf8ae3dbd37c97b17be573cb10f5cd5f8e450f87e5b90a2f5dee34d421fc91cb58d5efdba3322d81bef53a53344052ce8aae7fe0d2c7db6d9cb25dfb7eebff4a05d3aa2840a1c29e69972bf65257a348e2d5999d67e7630270c8aebe44e8bc4c7c680db75c53794371a5ca5e4fa2b750efe8127a023e4b9090d68f8b60efc9e122d8c413c41ad563dc1169697910f8a204c9611fc48366cb5a7133d1ac91716ba311b5994dbe154a961219deaf00f528434c3bf8103164a2828ae9f98c54b05924ea16413c3d213ccaff3f18f2c0072f2fcd8873a34e328f60cf432ff04175800f9d2adeb6dcebb6455e1065849652724cfe6f5ce681ab519a7047566447513b951747627a1cc33c3418f6a9326495f97b49c78116b93a2ebfbe3f96aa9169e9d88235df94a3b556a5d5d777cf3e4638e76f1592615fee8c5b37db31a0b64aea23ef114714210987e2c9e0fe2b9f12e1814249d11e4c0b66e7d6fd60ee26c8088b1ea7a4c379d9eae29e1e6580e4007006b0b2b98b3cd34f42ac6d8b0af0d6f74ac8991576257220834341e86978e53c550f9615d098566a0c61b24232149e1e27af384c203b9ba5f71d93835b8c52537eaee22d6b6668bf9e30f3adfb41daac446299b0615d96c989e293ea491fa666cfa3b52fbf5cc8f4f42b337737d812fc89b7dc014dce37fab614cbada98f0df85fc6cfc5522924207e224779dd1f538e50c8f2925ec5fae80d284bbca4c3408977a9743bb8d3df923c753a92de0bb5438ff05b2221f3c1fc746388ca6f82aa58a729282904aaa7e8fb8eb7f00ce8b23d251c94ad5c988f0395cd87a3058c5a0527df02da9df2727d847d93f557e9fb68509be9d440b172d1d32345f72302386da537d91e861c9af497fafa3cf5bf9a5ede1627498302636825166f4c893b401f03f626991759f21988082e0e161d94445425bbf11914b2120760bdc4bdb8766c29b846b6360050de877ab092ddeeab981ce49713b8d5ff694f6c614c8f5dae1edc26e33952319620a864979636bf54b4d9b4d99e3f8f2e671a06fa1a9d68f14392dfa43ad950a82844fb29dd2f397ade16c00d25ff4458abdc4d66052cb31265b7fb085b8ecdc04469bfa7d9e0be07fb616a3411fa92ef4e9c7beffd37cb4a649808d1ad4b4781ab82e31c5daeb3af948d18f822b96b838029d99ddb8a7b2a6add118c0248fe69184b418a4548b1e4717578312289725955a071fd4c9e3f61fea25895460af366aa870265795283c9d0b3225e6a34c6384a0a086de0f1dab8d5332ab5cb969c364462666e641c3456c696b03dbe8258fb52f2354a93b351dfa90303ee200e00b711dc8758905b4833084e5e6590a2765a2708e168570e82b20522b89ba93f861579b4c280c8d0fb0ef711544fd4bd4bf261edc0058148ed51c6a4b7aa0db5c4351bb466d572022d612717db1d9e0419cfaab9cada3485844e982a5a1e3df15928fea1669877daf09430e565a430c3f10d2bd3b23284298dbaf552df40d5dfccfac73ca132a1685d99bc972c0d0da7afeb34e9fc881e5247273e8a98e9c090745c268ce5d74d5539d298f25da54b38cf9a69366f409af2d45dd3a8a288c9e47e2f63cd7eb60e83da7bcf065cfc0e2e4585a9b73169590f78ac3b51e53d986491342486fe4cb2123caf97998247d5b1a7184491bff3daafb60f2f0901e73b79d0c60ae57d60ed05c2619fcbf2cbd7875c4b7de43e6003872caf03932cd0a41d1f02e789071c6a8006f68358b56d5ef3548d10ce66d747dfa35be009d463518efb0361dde9719070c67b9d46e52f0693510aedda2beb08f00246e5cfc434ab608455926c9bede98701fd9d6110db387b97bc1711acea2eed5d4d261234a5bb766f8098e584c6f24aba801cc5c1cdc8e97839550156b80db631a2f11d142afe8a306e431042bda2ea88695e9574263127edfa35a442bf7561e9477ccaa32f15ae95f0fb167b2f429ebec7ddf83499a00750ee99aeb68501b66d331a54c028bb4c2a87f37cf8959c8fdbf23c76938340d4a5ee46a69c49c95ef1d4872e94658c35cc619b35511e83c927235c94092d5b95856a5358cd78bb15e081d48df8574f58f9b36d04c1d18cbf596db8904c39f7d0d062cde2e0276b9665bdf8df678f45e5cc4e9625de723ddb6d3c960c0812e022699b18045abd7ea027ceb697e5ff272d80a3290ce35fc8f9ed0711cfb204556e999abdab4b67e45f06689b6bb12d30d89072436af6a0a15f7c6f8fdf07913e887ce855d72b41a04ab370313d94d862a8befa904104e57a964ad0dcf48e9c7f1e6f6404fd24e1c0ea35786ed05a45c5db7397826e449a420f482a85b6dca2350e21d39818ed8bd81a54d9e1cd4cc14e9cb69027e9f63d4173b838068c2a82a72d4f02d7f5f96e6305e8e019681579d5f863731cf16575476b15f872a69de31ecc5df24d78564340131a69648faba8e37d987ab2e80980dd052c46270f9ef6f7d938523d1e33e9314aa478c81af5a0fc13ae2833646dfa8f28ae8c3b0f314198597c687cd2ec52fc12a4cddade46d918bd0331a9f307a0ce9579abcacddb18ff2637b0a17db336e0f6508e04f2015f716d82e22905d550de10ed58a86c4c89a43c47f2a253c5f7c00a5d76f6780536b9eca2559626005501ab2a5edb60ca86056e7cbaafb95acf8023c0c0bff82d061a69a2e8c5cba4edf39b22e839e135d2a93c4f48b17073cfb3c4488e7977dc121100822641ae5daee16de1cdf72124c219ca07f216aceeabd1689beb6909a95be6b9b3f4bbedbd25bc2ed1bc7e82bc0c92fdeb5bc836865dc2e0718ae76a4e77e5491a0daa4b7977b536cf2e89f3d2fc76ee242354c7c76e694c27fe1aac329f652f46e82630744e489fd216ff63f9594cc5e210361a537a80f8b494f7111632467c4950d9753c3472bb8ddbe5d5f85b7c0418bbd060ced9a2ad3905d831a4b6f39d2c9ea6661d09cd27e47ca1c0cddfc005d762b5ccef1d96112ccf1c4a7e449b7299d270e155d053947116455cc473f649d9e5391270cf343eaa9509b8062f6b6d02f3817999ded3056c5c435ae4404edf2ee576037c67efacc3d9041e1c0edd0ad485dc18fa6650598a68e66995473efc8593190236eab7624d0905fccc403652b6a5925da3000c316f00771b6321a4ad7072c208df35d4b717791796b4394046c5a1a8ffb397e7a30b02be5d52230f870a5d24513a11f0684e3db2240507e86c03c8fe68c153889b27060626c94f77c205423e356c340d2cb9b76b09bed60e3021011e7edcef6165b848d5846fa22cf3d6364f430142e0bd9af6a74da4494cd64109fe9a5703dc4e8223850bc491b4a96b22ab9923f703aa28f6adf4e9984b1fb6aef6cc8ea3efb1d8e9f546da55072fe98d2da3b90e8ca247d8d9838051d9fdf1e4c4a2c7f8592b1bbf6dc0a991494228173c1b56010a27e0649b4bedf1fc230d0dc8e1855ec1d5faee2ec7ebf48a24c005fbde12209078ebc2c6abd70723e5218c5016a805355ab82ec0771610c86c2bc8d42f4816069ffc3255d2813c91970fdabd3694abed54e39036f73829bfd8e0f2846b27b3addcc1574be0ca039bb800335ad758ebecae63d0b138b3a2b570de19b2f3419372e6dfc461d694c11b9458760c2102df9fc3c3a439228b750019d5c45957d0c7de50330cf85123e657b4ee209856e022178fca91597dc88377312dde94c2bc8c89f23ba91025e22994f4fa87871ee626c0debe4e0d8148288987257455d4ab04ea224c8964f9b8c91b8951c1e8627503f94ce62b599ed99f1dc8ae205484c5b448cc6f625d26a151ae9d9139274630ce9eaac3af561465a7ebaa259a25b0420af3ccb397a284fd3b9fd0149379d2f8d8bf964391b96e04a5ec77eea7dc5eab4af335227df1bd58caf25c67b5aa103699f3304328c5d3b55415575853fb87fc9410e4722fd2399d179a1e9e2004ca175df11ded75717ba77124c470d882811215b0b75c9372e64ea35c0baea0302b105ad59b3ca0c1de4af16eca53018b989b6a98a3673e958d772d9cbcc787e5723153d78dec4a39024431668aaff14bb4a219fdcbe765b10d5a342adfe1ae7cfa39ecbd4ce7d1cf27e6d05b809cc416db4f501da2b0ac3fb677c657b86ca16fe96c0d4a80a0ed028d65fe66e4ce89b50b8f8957858fb5b5e018fbceab62d9e5c1923623d2589d38f142a354a6e606dba1ac376363ce8f062223fccbaf8c8ee3a1084ac6a6321bf671c0dffe1f2020d1bae296a7fc7863c100333fdf9999399e6c8afd952cd18c93ef2a206e9b58ce4c6689549d04c45d7c60c2457bea91165a72f5be1b4f47665010b52002fc69aa222725309fc74ea649204c4e66f311c2243e6c91054451fc6162d8574e0d5089085a446136c6ccb307f1b156509cd8db2217a3eeae800504f059a20620f4275a30350f9e0a072c0e8c0d8e2f67a1e936e214bb12055e1d27be57638256bc2c805d626e45d4243371ccb60970b9886de53201ddd70ec217895850bf39961519764e200e18056f401ff030a92eb080314b5a1b212d4546265979f454c13df1f73a1cf5c93ce4b0fe9abaa3436c7f94a19520636f149a0ed889aa948389ba615ac14531a2f1174fa3b7f8a11981e96331b8fcafb9bdf385711e7914ccaa0a42b67e0d93171983efb57d6d063bfc05a45215debc314f73c543401b1cd9f1285754b3586c09ee2d8507a7a06f8d53b07b64a80d121044cda553912e875f42a68e244bdb260d1b3006e5b8b9f79a6ba80644f8174f4c2b181ef4c00e6bd068f8525a04aeec2e9173045cbaf0afa35d361abb329c10c66984de991afac5cb50f40a65d1c3212a166e10ad5793a35a45742db33828397dc97de72669810c61d42e93af6d116ae72f8bd086a6d2a71a7e0e24ba42cd3e626d35edf94720008be16e1531bc7e74ddff5e4e023b62b7a5baf8725c02d268853db3f23d4c93e1c9374c98984e4be389bd18e69a3157623538b7e538a8ba44e7d07c1607451ef560235093f880e21b0f0be51282bc5f50a9392b3331aa49161baccf42c1a593dc4b2e6441175871d211484160c971184d17a34686e0af675eb7e6973cccb5c0a459102602bf7552dbf9b2227d333ee94fcf5223743b0908552efadf77416cf0b2cb30c074a5c13c169a92cb0eb23dcc598524534d2645ee9ac8b46c4a224683c8b502ff3796cf21c59937629eba068372f274c21d48f9e4c40b048174cd57ab1b9b14aa8227d15b1367de62dd0115010134f69c248d35b60b8ac18bd4c3bf80069573884c93ffdf1854dcd137a4535cbc6d049553144a30cb48e1994d55b530fef64e3d2d421b016ea1564e2d0484434ba2df0a06d802e0fcd4d55c55e95181b58342dab67a491a12a131654531b1a395293caa68de93adb7264931587161020bce443ca156666c4053feda34c0dbca132b7cb268d823b71b8f92cc2319786bbc035cf762debb3e43c67a4c3c6c657dbb752c6329477fca2e879c9b45a8e0471e888146431d53b238c7af2d31819c20ac1cd8832a490a7c654b3d6407ace9596aa62a4162f8e058e3586c36ade4e9b51b83706ddd432ff71e4cee10838371bac512f87188fed3763b09164a1af6def00506e49b2f030a937513169646909f772e4d2bd7dad39b7bc72c4cce3aa97661e7a5df409ee81f6ab2ed7013201d0c1df7e16edf7087be9761b50be668f38339c684fa364f38bc75858e740ae8a134323369899188652ce7ef206ba69e565e5ad70b3531cc68741fe18859684b79f2bd998d3e8581bdb56212f1e600a3812c59882ecc8e91a6a1f21f713697b522d50116e1f4bf12f2084e1290f381a36c190dd0a4748e48fce9d34a248317165a7c311ed56a0578ecf2d9ffd03b78988dcad04114694c54554d76e2c74782f0b1c7b13e405a7916123cfcb18094a7043a2c69d82e75f23c6b8193d6cb1ef0de79f292ede738c70b8cc22a6aa6388ff9acc5ddbbb5d8c7c5b59277c65328bc3c34fee3d0188d72f5eaa06b722a84c979407f508e34d53927f3727bf091043da1a2b1b23b136c8e8a34e1a8990e7d8a60c6becbe4a7c1ae98ba0e221bed13996c32f85d76b82d2039006736ee155d0d02d481ebda9ec0b369a7028ce44243a35949565e4cf139ff5ec71718696883bafc5b21347dcda836b3040fe74d972946738345ec7eac3633517412ec369ee1035e788bc23b79d3ce594b0a4610fdfa3ca84aef2a3d65ea9f1810d90b660a8970904fe3ad9a96eb4735a127b13bb3b634d421a11deb61e71ec5e4f3e6be6198cade7f1b49fbf47a29a02cc80531b69ed1972e7b4b5f416b9b91f0806b60347ccdb01a51dd6ce77ab139857c2bf23471eeb18cdb607bc9594587127f7ba5c15f6b48d511d2547ae2da08ea5788a331d0d7713f41d9987a9a6825adc60aee5f79b45b87ec8b8739e3f7bcfc1146ec154ccd00f645636a15cc723ca7635b2a228d22cba950962334a862ba60e5011058c068e0d1e60b8b7d51b82548c4fb1239683d9b3c619a2a2155ac39d3b4fac9e165c90aa7614ca5f2222a0bf29ac08ca81b6a1392825ded915c128acc22f69e8873604a6eebe7bb207ca101f27a899d8ce57e2161ed12cd7d2d61abee85d83ff183e78d206c84ade88eb21b5bb8862ab28dc488528ec03bf8a47bc46a6880236e46f910f435be0ef98378583f9f6e295d7d63a86c65908b4e46d57a04ee7c1c59f36812bdcdafbc46514abc97029c0d3be29ebd868ebb27f348180b614060374836f07577d8e03a927224126640c5aedbbfff453cc7c5598fc6198151a017c0e014fd628b7bd65366302b05ab2438605c598df49c29a5e4833b3e9f14c2d7cc9816130f33d90a05826ca4026cdab1f2c7a2d36a8d3a77e842217eb0981d2e53224e8d7c04537a53ad684804d09c3945801f819c822139c5ad2ee81cdb70be121e5225393b93c50279086711158e0c476c07213015d6383c017958892947da00bd989217164af97989fd60a8f1fa52aec917cba58f75e8498e6b27dd7d115490653d28bd77216dc53fb4a4d4c0714d74399859bc823c102a055bb3bf444a9cc059dac470000e386f0ad19c8a05d4718021d6beccfee266d6517990e164bbb6e5a18a16fcd86d9889cb83116eb3c048fbf76735349017d1cb18777948174a12208edf3d6a46f992155dc90b3ed4957342dcac6efd944aec0f6c488526682090a602d4132e4eac79ff77f261151e48b5c20fbef867791b71cde115ad5ea30f84f6bbbf12ef6b05478b36041a6d5e26bbeb725a7152d474deebf1d8f5c93c5d143216ac8d19169953f3cf028da7aefdc8bf379833a53886def405aeef3ed59870547aae5742967371efd61d7629fabf146f94de48f85e78a7f9fe31eb71b4908f610143c7068eecaa9c6ab6fa85cd1ffd3f20b48ec196e82268e2bd1b3ae4b54d43dba8a57006cd5e70baa0d4cf9f00fae6e218a7c4f0a084916a81c153e9cc1375c973f8dfb24ccda83699dd695ae34bac902ebd80c99902560fb4652fa0ad510f53d1e540027d532a355823d36710f0a6e67d9f99d8e7e663a90f83b741673c8cb470682ac45457c90eb7af36102f5c2738ce640e1762689fb1c8f5e7d3c2ddb828c243667cd5baf33a91f7feb699f59bdd3e8d50226c6dec7b0d5dd7826684d130283d6de60ed5d7eaaa5588ba2b76bff52fe9ee044c595e207731c822b16740d49a176cb33f105140ac1bab695962eb83742b8a82002a1ad7a0a692743273d233357ed8cc0d40199a07288bce15a53ca22ed443e3a0c3a8d83ca8f27b1c1a2d9cea45688888d8cb0a25a9c98d4171283bf8950229aa13d9d20a232dd30d53841beb9779091409ca211a086be5425218a1ef4fcfa283adf565d768706bedc7a1884b253ae2f8ef9fd65cc31c2a5167151d0101d60b22ea88c3cc074ef556e52072ae90485adf995e67a489d729aa7d684a8b51bc8895612fe2c7ce837647926421e819edb799316ef3bf88118825153dabbed4517d3ecb7df35c117519535238fa4f8bb776c9b834677886be96230efea64450f525dcc69500cdb03fe8d365db9998b7a34b60ee232544137506b35485be5ecefe3756fa839a0456fc255388aa8d4b8b92f4ec1aae85de6e0ac4256168980b09f2ed99ebdeb683c452b2db92fa9862a0de36c105c1035f045a4fc89c2328cc1750d25950c3e923be4a60362e788d1f549d525e8a43d701fcc89e22826952544a31189a03beee929c4cdc3ab211a3a60351439af046bb70739b87cef2857196573e4294afedc6828d2b4bde7bc9a076ddc7b019d34b82ccad1c6c77105759fd4173242ce54a56d58b1bd27969d2fec133bda6ad3f907f03861cf4f7ba1fcf9fd0c1c70dc7298058ea47ecff79c2e636a109722832641b44d8f49856d053a3285b649e2b7bc582108610cfa7f9e237eb8cbbc26bcf14d269c3e4c9bc9ff62110b9129242a6b27ed64bdd2e7ba57b071e4ad7782b4028e9d5f00fb2021abb987e7e67610599d91bc86279bbf532959987ea0dcd5d09732df78170cd510543c13deca3a3468089a78fc4e4d9f8d2e3982d6a8f8d8b45d4cbf96f61f417ab758706c47d80673e8648f79d78e45c87057bc1ebbe2c014a56b17a7a84a11b725cb557cf9d6510f2c459b071339a8405efe21ff242074b1c3f1074fec221250326722a53edcf14495a2d0e55ff0368d9882f074d7279d0725968b215748cc0a9bedc71f8bee734b4cc8218de82475fcc2d7aa5295550e9e05b3a51a4568ded446ea4da21a8dd17fdb0077fb27fc00851e68ea1a296da2ad1a86fdff71465b7edeafa50bcddc8e38ad78972cb69bc1d501e8a27a46853d7ab7175fa309e11ab1296892e2b48b10bbf3c4faa6a0498a29a9b0a6da39432cc2a98f0b35db59798e174eafb5955c2dee241ea202faf958c742e60bf96c6600a8065bb173ebc927e7cbf6ac69d495286c35993e75c21b5fedff17280e2e817ee79b2c9baf36442c7265508a3ae32d3a83574ea4cdf10672d5bdab467b514740312d8b65502d14cb8846a7c2a11a3a7e55e6e782a896f29c06858456e1b74895da08d1ae3a118b6d0ca6bdabe1797523e2f671e96b2852e12747ea93d7d814292e523652ab4fa4e5f4e366f4ff26f868208643f58a7db46ac959a7c94fb5997a5ab2d4efd5447946be16cfe99488ed4896fbb5c188b78c2bd60cc759969f8206fbcec8dc266e2f12f6cbaaba9e7c619ee229ee58930c72b8e21c64af298357b385d0d06aab0609ad70b4efedf2d0f44aa4ba4f8334679c5dbde8533b3c288b0356ab8beee2da02ed141e2faf4ff99a5b4d67392fba91164a5f9d4d9fdc2ae28fd01090d442b746f649f41a3a2dcc4d320bdcce70bdd31ae17a8c1cd943f803521e98fcc3134ce00903b90b43f8012013f567dfa90a5c4c24d1daf38167a5e156771705aafc23ffc22daa4195a765dbb9149a897e10c38d04f883971c6a6230704a8cdcbac56dccb4eec842d145895373e788b8f20dad28e4289ff21a815658b4e9d6bb0762f6b95abe6fefcf36a880a1a0f9119dbafd822195171272dfddba80f03601e5e0c30fbc00a58d86cafc2764f1ceee61e5aa9c412352fe67a4ec000ac841a5c7a356142e485c861b4266be8fddd946359a8c48a3a6643008b17ead6f4004a6b4744d16428fe0f6806e992c8ca64285e8e79340e5808c5aa9bedd2e72d12a3c980c24a68f5aa29e6b41aa5190d88adecba21e7140a19eb7994a9675a9b83c5032d57d60653302537e285e79f4d49bedb5cf399b340b068e21d66e645e21f46be1511274d51c05fa58a343fe8b96c0c23965d59cb66640a4b7b2ed217ade0777cc516c9b6684fd2cfdffaf35ded76d817a955ae149d55b52c88dd040fd74bd7f8b4fc55d71289c24228fd7b3210a21dabb5bbce70fbea6268f160e4ede6f121323a8a1b52e86589ab8b078856ab7c4d75a3abcbafc3eca804d4166ce19bd6699e3d9e6f66fa8971374f9a71651450775792d411ec6659fb8adc5df5d8b4fcea2d553923b671ab164cb3e73278bd3d7a1c4a400b1059dede82ee9a5496b0993cd1c5676c0dc7e77404e87548bd764fa84a9c00cfd6c2a8c02d25e8a7e967c031e84e9d4d4747c5f8192a138c2a1d5c799ebc4a47de0df0db81dd4147be141a09d4361bedd4c935a8d47eb9b4d16e2817fe25e264102c5823e6d395d57cb688ebfce89a655b6b19f5613aeec8283264b3ca7b748d1737e2461f174e98990be9ac1d9fabad25bfef400ea00769c0c979eebe5e1bf1b0970b4384c034da9baac9ba761016bbaae6d87f1017da8fae26e31a43cbe406d8651cda3bd42a37ce61465725a0b9b436fee029fdd4b3565b97105274e659940f754c7c08c60e5a3d8944c25549d2dd561f9f9b167895942038394257cbdcf4833f52d49adf11570966a6b09c4cb646042278865e937da82bbf958d835756b4756a0e26657c33f2fbee7774ee83d4e51805d2b6159ed6eb7ace9952065719d1d1119f24bb4e3db5814e3322d401d4d0f3a27e1a302974a6342331a3f130fdb42f0f654fa584bdbcfc5e6a4314d6a99ff08a1a33120c97235049863c64c1ab6024d7531b02152f7b048e8c24620554589b7ca763dfb3a24e9c340d67c7c578aba8c5d0b068f0096a32eabd941ce5c026ce1e1ea3ae163745be12d00acee9eac7446154456268e0bc89112d95d3bdaf07b32dc36ba713203468d355692400b2cde2a84ccb45cdf267a432678fb8c289cd73abe0a2235aa7ce6d901b3e309f2e087c68b95936ad079e506d09e153052da89573436a02867334b0036ef2d7e91c64ba6b6726e8cc968cd3b8ec2badb912618cdc8570c4cdd0175a8d128ecced95b7f7c70059e88669b5150f2449718fb3e86b27b85ce404c60a457dc85e90f60d47b47b79cbe62db70f1807022d10ada9cfdec09c59a5e2e180774dac2a3b1e7a3c6eb8206487451fd37c7a2217061c6ef836637885ab7682ef50fb8332022618de19c471fca063fb72dcfb9724282a61527ec7fa327a782d85da6953c71572f19f257817b3fa4bf109a8158999d15b88fe393578a44c654ff588fbfc3a7bee6171c921f00417699e3835325426c1d703920b194c84be10d3462c2073f3c64187dcbec70da2950f4cdf039ef7b744caf9ee0f6d938aaaa358051fefe1d65ebc819c4f6644ed6ade906e599e0c89e5cf31c6383c0e281b87d62d2136603785be5fddcb206a9f4796c8ffcda33602937c8e1d783e42ab31e4f683a22dadaf449c4b25bce0fd99621287bb80f4579576fb0ff8a8a7e0825d3e3bbe70e331cc20552be47f9868ebe0a9a630248f85cbfd8c9c182b4b51ccb8b6e39176ef13ee3dced35051b58eab91a02ca8a6c2074a36dd0d5ce9be1a7b0cd8ccd55d13a79e914e57c9899b562d6ae8767355915c8c69958da65da035f940158a56b4171621fb1d42284bb688d6d7dffe39aae3f88c1ced9b967652dd6c6adc1f4debdadea97766916d42216a56300b5bb726c94a135caf2f3e26835f145b83ed6bdc87f97c40e3f95a1b9140ec8d0bb8c7fed8170905f7849ab930629b3a165c52f2ffec92563eeb3f320977cbdc2fa407a2001a7cb3dc7276fd6e64aa343970147cfc7498a0852d118ba5e22b76fb15fff4391a083e55df050cf0972ff2bfe3b97f21365fc868a0cbd0f11377ad9191fd9d999b8da80bb7b8ff3ccbc5669d82dbd36207f1d1e4b9d5e11174eda2814030a0b776b216119d9ac1b0998da14ead3895bea74fbf949e2e6843ad97cd0221a9d073df7fac0922fed6cc58d96c24ceee8a80e92b69169858e176df80d9d2b532c2c6592edf9bb4f3a36b412b38f4fd4454488ebc8a70812bb3d6d6801139154e0a32f3ad4d8a208dc243bbd74f9cdca51b270a1a32d66d372edd1feaadb88cf718c7df79ff5f909dbb3628f92fa8cbcbc37057f748f927efa97dce9d90dcba38834317d7e62f36d0f01f343ceac0d99444227ff04c654f1d497f498645ddb1d9357ef3d8a48091efea6ff21e9f6fd450c4434e16713cb092944c8c9debd947393ab4d7de4b59742baff463b959f9fb4fa6347aa18db86066a7771f01b898a9cb01ce8b2fd170f26d46597a91190cb384d88e37600ea4787776659f75a7b4bad0e1eaeb44c0269742ef97435251ad62cbc03a85ac1da38e4a1a8b60f6102740ccf6a1aac21d0dbf768a852a91659b3559b04112aa76517252bb830683e023cd82adbf58c80cac441a8baf82c0bfa23e868932a7eb7cb9e3a4090f2ee19e7e6b1b6532768d0ae38caed0ae8547c2a26a296c7d7cf98a40e3cd1a68a0d703d260580d66bafbc92621f41f278166e35b5e6d389bc9d3977011c9a86b58facc4456614dec3ed8030c2e52de638ae84180aa50847b8829230242e23be9fe82c3141518b666817604e73d3eb48d1e62d052104ff86c7fbed1ecad8ee2efad2ed02d52e4bab84f17e221df296cf245a4ddd5a690c970b3468de4fc7d95d7ae9cf5debfc6c9a6035bc7889b2331b3d9be2c08d4e6e52e0a09f585f1025275ef22a3cdbab16019bb3b9d3906eac2602c5d2a75fb54f5666fcbb0969b50449ba5e68f9444f7ca3decd2bb40c15ad2b0be603185e85e832a42ee2e74cee4e3164947c87a2ec4fd91d65dfba5aa1caf2d902630a0d3da05e2a8155db40f9a087f58a7aad270dce810376371a9266aa3aae9e17209d5c389b31ed144302ff5f6114fb337b47e1bb6e3a3820ee73ba3f112b9e6012841f919d4a537234a736ceb14ea876ecf2f1fbe4e7952ca4bf11a48b8543019f4d8ddb68473059d0309183152d82347b1387385d98c604e84a9f5ff73d4de67dec0ca15a0d5178e57618f6d226201bfee37ad0b616ec15cc70bb43711934a183cd198e7d5cd3be4388c25e2255b68333388448ea559eda4b826445b9961da52dcf543124f8cc03ed4149adea06cb095495f665bf2a500eb744a03339f8003da87ce2d515667140c8d6ca9d1a6e96b7383d25b22e7da6b8f3a299e0e254fbb72c1a25f6f667b493b2a0c7813d18cb5811bd81931d179061aa84ddecab0f2f434bfad4a2d007f2e9fd99effc24390e0a55cd52bb544f3b42326c75a9a38724901bf4eb4e71a89e23f13fe32e8ac73c7166169848d68a6256b0062b59e11e7b3d622d511b20bc536e4a9f110945f1582ad343eb11661d6241d9cde307cc95eadfecf4dac78d38c64c98879832dbeca470cb2d3e2446a7af29f7d712784c5e9be3855e5105194548bd5d6ac9c04cf7962355cca8eb950a756bd1615c775c3a364c0930d5a53e79180f40143b89d4b3a550e1224452d7d26c2f1d841dd535d13975ef32c1cbe68663664f1af97a96153fa4fca0655cd028a7be0bcd14a06470846e2a3941b676aa33de2cb6f289b1d151a41b50a4cf2c9b312e97e5c4ff48030fea3202224e39179a89445e2480463bc714571ec785a4725827e51532b86f2a380ba603da8590be29c430fb61c728e55c7113aa73e8bfed8a0709fbf5f9544427d0e0621984354b805e0422ddb44753a2821f25668e326a456aed00538043a0b2394d3d78f490f0aca3dcf777def9137a35f8668492147d560ce54e1531e10297696194b0599f490bf6f24e9069a6b866d40aa2931deba81a70575158f9a1160e5dfc8a6fbb0a5ac41967c614229479b327852fb7f021315d6d973bd15f686e2381b2bdf50bfd18d2cd33970d50b451a165b6edf46f4c37ef25dc428402935c42a5e5333520ad9b6e11cc884578c7012dfaa31c7ce891e74ac0f5cee36e596e435cff33bb53e15b473a3910e777d23f11979e20c9b12cef68a5375c2ed066ec04b85497dced128672b0e11acb4c60eaaaa81ed1909ebd6c625da786839f2b053ae865050e71923331a689bd4c02297e96195a71fe4b88c3632a7f0e6e9ec515a295a84fe826e2f45ee543ab1660c77c6bec1ff488aaad3a15851714aaf309cc2a405d667ec2b0f4c48422602a965d0a7143428f5ab5dc69f9f53c091d6233fbe1632ce5a47853aa38d4bf8534000bd35f7a20df20eb2a713cadf4985660823b088c832e0eea9f562702f0ee876e5b106947742faa37fe4a51dd42dee60f17089722743931967556ac8916b4b0993242fb5a9ec8d08a75911f97565aa56d30c39383158abf723242e872d052bfa65a1d7480ad517564cb5ceed8e2471f7dce8ab6ba0a5a621a657206e2da59b317850bb7fb08318f5d6d2ef4d714e815a7a23c6a88417575f92bc232f6285088f4a67a60f08fd55f25c3685f01e0ae75aa9e0efdd53dc5db21bc5e2e4e5332c06214e28c8b9300361214721aa7129abc210f005dfce3ba2c256359c8d726848b4b80bc415def1487e2b9127d736ea370ce53718f1e5a690c960f54d4bddc879aff75f15e54a8f700404970b92d3d532a8935695cf0c3dff318e72aba4ecf258e39d7d8be29d10a5bb52a082d2a4cff13906d8072d99c04b1f40849063c862de788ef5f2758ddc9d6e9ec1fb0ef6a165cb700b9e7587be7a14752ed2aa8386ca1705d5f6026416a4bf31346252724933101d65c45be5f9c624d2ba26ea6e889130fae8761e66c983b96de005ea1a7cb56bceb6539f17d532a16b716b9ec03a50602a90e257dd1725c268ddfba7080f5806a338735aeb97c397d3b395304e3d3a6fbc70d1176a68090adeb216ee3d37587fc9daeac84ff6ae49b3ea2c8dc639be56b88e333f5f13a5e97a714a8039c6026c3839de616c4bf4016f01a97448e2d0037a8fdde8f63f8ed143d753943c30a52fab567a29796b096813362bfb34a03ee37cf45cb9de20e4746902cb022aa29a47271001b7ca489dac22d8ec74b49c6765fea47b3cbb51927628e33690671cdbcd915c295dbf9889887be5cae3ff1fe5dbc6711998b6a822a40d12a2ea62f77498af54bbee7b24c7cb1279edc20ef2b30b6bb4ead73e3c4bb65b34016918850812bda9d781ec6bb6b6986e2bdbe0bfd4ada035c2bde2515312ccf141d3ab46fa3887ed78ad73afcfac142403fb92b8c61a75a4833282b7faa03481d33d89dc6c422dff03a99483663da4eca3a51826f13b33255a8e998a29251810f3adf1104c130b5d3ab74e28a0007d5ecf8d4368f5e848305db020fddfc8b20be607370d6e0c8c93edf3639d6bc4e3929bc1c7462f14aff0ff6305497ed39ac76bb528e32b1237c146ed02b614a560d0f3c44154abec79fb01fb710b621aa0a07441c7480c30d307e011f75b0ac12057fe96e7d9da2ccfb8979aa38710a01f39294410ed677368b2241bc1a6754611075ba8942d9e4c19fc8fba63355a4a247185bf4098ee80a870358c05232b146770a636bb37a7380ee0b712075ca0476d602e19ed3c31082c6d7b65b21ac2bf55f49dadd455fbaefa0ea92f3e53a48c0430fb43725e6bbf821cb0155e6efad17f0d59ce25f0fb74c5289fe7175f07190b9ed08a72fd2d15e3a283baa6bac786ae9e0771e20a1c9c38a53a9869db681724143e63f7737f64ace88ff77a6dd027690d2fdc3eab866d14e0f65dacfbb9d02df3acecc81b8af736b318b74594a3ec124e9e0dfdd115e26a8b5c70acbcfb587e182f396248a4fadcafe709d14d29b945b301dd579a8ce2eed89470ca3d7c47b4886979e3cf248046145734d34a7de3fa6c51707f11a1ff260e481a19f9e0c0abe70f6f9fe9d01488a38bb9beeb3f07773f0302461d047bccca4ebc1bc8ac32b1ad8bc1d0f270e490349d04fc3d60c330d9c385984313e40f9fc7acde6c0d163f4587339c6325e3bc81f745d44f432c7eb729084460f696e15829cbcb4a6b7a73b7a3785d3c07d857cdc0400120d81fd3773a80f63d7eac234c2effc128372647f62ec7d24b4215dc190d0a53566fed956e2341c8940b44f67ad2dcb2e9f2c3b78d244e1b7c8d56ac6de3ea861919e2608311bdb362f3f102144ff2349878321223ef115c11584d921d466295ca478c71c76d63ae57a168aef2a38f9e76f74c9fc89a197f539d3b11f109abf81e658be9d551106d2a8336581fe4b2fdebd1d715e1cfb0714da89912079cf616bce84b906c2883b22f2311847370f445a2142692296c7def3c704001e01617d654500ea94c59cae6bd187d1ec2d8e88556b96545043c67997982f93916224827e3b6b52cf3a2eda575b961d35e3d16c8c76df5601af9544936d8d6bb71e564d9f97305f758b053d5121fce23195e16a2c1f956c2a420fcf9ccedd54e4c016c6a0aa691287bb0bfaa345b1dbf448c7b35279f69ae9ce6991ad4510207845dcad639834f6da749e53ac22e6c1f8e85db048617ae6a8b100b0b40072d8e6410f056816e3f0ec54405a37d1917dcca7d702d74fb1bb3aee8733b9a7f5896db32ff8869629d0fd85549d448270e3110c4b22e7d191213a8c1d6d2c644fa41131ac9569dd6f43324e09d136d5db32a2756042a4b9c66562697d0746d6b93eb6cd4b30c26b789863c1bc50138faef8d8ec9c6d4a2cf3b22dbbb0b610aabdc47d04ebd0d116621a8211065e4b2ecabb408bf6708b90cce5bd74750e97fac2c067f77a793bfcb4b1f8858826774304645a8669da88a45ea2a55c13417643826cdca9909c3877a19181f13352be0394279fa0a093d882bd830a27013878a40de13169893ea6504cc225f6a6866d700f33fa9caa1fcb1418d049f2c270928c204855366a15eb055a168363204519a2b9507aea69e7931922311d172a620d5f15c9419ed2547e3f92d2a4bc807a20cf85d09a39085cf46d0487b6070248a5d1054dc9363c5d4048a35180010be59c230d185c1347a4e848b01768cb99f668b76599881951349af99d506768cdb2cd42368231bf1bfd07ca8cc0f17e54de77fd66cd90a25d3a11a1c6d87529c23aac061ab9ec5695ac2d4b11a65cb0879b4237337b6b211e017954c556dda20045f9af0285ec336b654947b05f26f6f2c3baa9994f4b049fc4d5b418041b48a4d4de9fc60515f11737bc54109cf4414727055bbd7364b15cf7e25be8957e503f616cd89081a4d8bba7003aade703b724000625ef1d935c806d88e103b9044e356f3ae7e310146080073b5c84a70af0fd54bbf0f3ef910ba98141172184f4bea7aecefc38963007ebc3bc0e708589fd1f8bed191f9be66ce663baec83371963ffb348d3d1f26838c2cd607b461fa9563f1daad85d25c3cc2668946ce10f9c96e14a3a9842e6bfff20751384ac8a2762ab14742a87b0507f1fa282b491bab321e8cb3faeac7107747585883121cd29b2b8fa6ba6700728ce149cfad02369ebc04e6997f06141ad0f9800c57df55862d32d2a47330d4fefeaddbaf28ea717367302f4b9485bf9acd65c383674ead7217b5b066321493054d5cb7465ede5764ac0486d907d4ebaf63920a219160e6d000ae18022fa0a87f87b8070b098bb0a874f957d708018d52d0f0eb51151381c4ae8e0e01ff8130e940569b609073c313638a4dfb18483d42c34382c054d5f976d3238088353348f200c0e19ef15e160b2e682c3aad6211c80105970e02508c2a1f219151ccc78180fe70f0507e3f3303974bff66dcf38d988b703051632ec1588e0a01c7c646530d47dd779ff7acda87debf7a2bf740a650df44da87229aef5d79a2b6a5252a3e05842f4d7e832136e8225a19471e2d7a69473395ce2c968868e2682f918e0251d82655dafbca0f49c73c0a20d880bea5f1226413f05ba4dac3cb58021f31acc149ed4e6920d36f00156cf6cd672efd5d35699a4210a5ca23ebd3f810a14b7db85a1b70aca40805d4ae851eb2e86015a2dbda9f142bf115408bf1027ac71721f99d890a0a094c20ba259bd80b0f3864f6680ffec5139328ff4c18601b6a44e66474bb27425d0a56dda184d550962e4fd54c5482efeed580e3025c5fcdf2e2d95e31efa92b7c59cc5879cc946f5157c84e10a60521ca63d8c9a82dca0100fd7c22288e238938b4f242467373441468da6ba2d4e4e1483192ff5372915a19ca03fffcc50a08d884cc86fdfdbe2a1989522f24e9199409d795581862087d8a31b32d53c8f940c4740bd71977fd13930ae612789ee7e258344a68d53ea4ebb8c0b323cdbbcdaf5c203e17406ec795186def8de4ac40a1d7ecd8efa3a3a61b676c233c2537aa8b569797da3192b3f38db374b43853aa739277ca9353992249d6d56666d21b6e835e21872df1f0301b3a610a25d2d2fe69caa719146ad9643c2bd50078e6ee4a6b8c31d4ae1ec1967cef230c645207f984c90e6528c893500d4570ada13b61e37d10b9aa7a00825be66ab36b76dc00aea0f120bddf5442b29577591e0578d094f700586433b6f69ae2656908a29310b7e73af6e566db494db580b06efd72b42fe11a4b5c36c260b811e5df2290b34872e10989f160699f540117fc4dd1e412e10a2ec9aa92f0e98281f4cdb08f13b56ce67dfc037b7ecab433dff73f607455551173ab8183b53d5aeff9cd66a69ad4af8b9a3c64a542904bbb41c5013907fcb3faef3eaae60c1304e1807eba4133c7921a4cb4dd35794b31e615af55c8e48a80665080368634a0d1c967939b4e8725bc242bc0ee183be52aa79b69701ec2379f55009454c870644b3c4471a6bf92ff634370956a04c81d0eb5f65c4c9d96144251ee098e7b2243ea846357896eca15af66ad8eb3910f274ac70136bb9fa1a71b2b6bb62cba54b6b86654d728fe76f1f30572911e8fd46ca6eb9dfd595f5a78dae6deac967a7207355094887690c5d1fda7296d6b27115feb973515615c4aa368b8dbf58dea8ebf6286d89380fe8e2ee04e8a25f4082f11567aaec12edef37219078e3b1e02f99e52054eb9f7208b453c0c63e640b284a4392aef74dc71f6b84c6d629d0cecae106fa117143063fb09b6116c38854e8aca5e1478d887cfb4520a98be0eff8b8a6ef491e136fefaf2e207b448f16f52bd312c2ceaa2a360c2606991c68ead2577fc8fc3a7e1f9f3088a5f6fdb48f8f1d71c55f32ffe070200c1034d60d3233e95a4c6dbb5c21306503aa51e88bfbae681734f03b31b4ee2cfe65c7f3ac15cd229702bf533e54cd6dca282771f809373b54dad008d4068a74e378b4d0b4c574434155f00ffa83a488ea87dd9b2a62fae1252049e670e76d26d592501483b09e1c4bbdcd511fbbdcbc84d767c935cdcb859c197c7a2cafb5c56d303b16358cbcef7664340623355455000196e20c4c1e0654a2d032d60703ec99de0227a02d91ffc18530342986f8ce8419880d2d4de030a4375043b2add64c7990e86859ff8196dc3eb5eb19b9660f825ef3ac4fc53b53589e5ba63e8514bc346bc2ee51e62c7777d1cd3c88a43ac52f886e77b95280c8e7e34a38aba8e6eb15dcb6381f603aa0b2e2acb3150cba8848c3e93c0cf119f882854858a36db844a993f3923b484ad728406f4ab42152b9f046644a2281e1360e354fd70c2734ee364d9fae00ca1a1b68bde66c41d6bb84443d12f2f4337654a98c9a57387296c1e4c750c8a9e9446a0b7c74b4173dfd500c40544cd5d15e0a4e8b9460273ddefdbb5db8102a3debf1f5b438600cede3d288e18bc97d64cad6681548ec079866deb5339644634f6736af11f4c05280b8c394fa2ff490d570ed09b4117b87903e8827364ae49502e195f815c3ef0d437fc5b9eded949f3f8efcdfed7d01930f2922253d69907f8cac204e003411be4f3f762144ccd52081b47b882371d79712f41e92a5c0820ef7997af49456f93979e5d82298c65d1e442b51cf3c52a26320bb2417a7750b7374c5eab9fd68b428b0fadcf8f40e50980cc7368676ba7e71258f4f71dd39cd673af37cbcdcbb14ec1cb193313e6fb23cd0daa08be6d768b88ed6eaa55ccf6b2ff8fddcbf5fc014f3c6ba588e2ee2981bce00bbcde2983212c85f294d2e06cb97413a120ccac402f5706556a4e1104e888f9b22aa5297ae82e4c906b299198cf91919e39d5304e43c46527ac34658b91b9480804414be779aeaef256027d8b0a068dd0c0203f0b53c0d370c22e2817cb93b4def82bafd718b353d5d67030784745ca722494df0af08be3f3de2e16a8b9a9692ce6dac49012f6238ab65fb6c57bfed031f431756a17416b1c2eb9b4c97fb6a7a8bef0c86d8238db585eb686484984ea44d7eb88620e1e14d794998144ba8ed1c9f52c8c11ba67e48d918a92f25ad5344b20edc4c7cce726dee2b7f4495bada9d8e6283e7bbc7538d01e1823bb1162a3cba9ecaafcc4b5c469dc98ec7d84f047df78877e44a5106164daa26f487e485e84ed5138b735a56064fdfbbc15bcb44720ed4a69c863db3cce9cb7a63cb510f4d70af2aa60d6bfdb6614e4d2d5d73297b3562cb4c2cd76044b0c61adb6454af6368ce89588d4b5cc4c0a38f3bec1e9b24730dba0821e2e2a12ba0f1a1975c966e8b80f5b4d40ebc980d79b7cfb443e1e6bc9681d0efa8e79a4a3e6338fb4eecbaeb975158f1ce92b6cfcd752369d876042c232d3d2ee72bf6a4675d99861ffb8c5b226e3b10f34806ab29a73798c4b3a4671aa606eca4d907aa0f36ae50cf7b82f81f2261086543c534552cbb90c73a8b52a57e6ce363d100543385f32d44aa69454688209b717cdd33c501dec16247a0356bec052671c9cc72c5513d7b6bfcb0134a7dc1dce0e77b07141ede89076e8c26fc067f8d9f0b26517b690d6935ebdf70e75c8d8c513880c931f86789f11c4d38949be6c4f11e8b71c6c324962d348c29e62af339dbe71b3b18bf61038eee6da134758567ae7d474b4e3000170e07c953274bf64104b5ca08c2c6aec1e6744f6ecec7ce4362ba7686b64564423781fbeb27b2c9ac1d7837e9a45cf1a4cf2d25b81e23548def7aa94ba02990af2c0406970d7a5ef242ff5954446fba5aad0f0dd50f73b5a268696316ccf3dae7def7d74e52909b5266fd80d221e5a9070ccbc45a81086a4919c53ba222e6da2a8d3602b92d08408e646fe352feed4ff5ef182296cfdabe50184599ab1edc441799fc4120c3caaaf8d34326c4d28cb07aa2ab68623cf711d55b453550488b120498602284128c64cd4eccdc3dc2201be552c29fe206ccf44592236914809e79d54efab489ccb2440adb7244c5f9f93e3b65c6e12ac1b400bae6089e61ce63724d4a1b6fb9fe14458fcaeef8fbe7daa2192d448bcba1c368f10377541663f5d6bf535acc00a3ec7af656699c832074070d02758d9fe72048e698eff829c4b18893995a6323b0f8aad5f0b632cbdc5d40de24c424dce64b4293ca6d8f8e30780d178a9a89f7da7750d6ad498d3a8f3400b714b10cc2f90b24ce51daaba0827f0a53ee20a56385919e26186cd64d05ed05ddb5b421fc91c4259d9e82bf9d89cf81664df440b992cfe0094b1b86334f7450a7e0d01d809aa28df65b94e115702bf78e9189b6f903913148b3b223acb550ad9c055c8682327ea59bb2e7d98bb37e96ebfbd4ce613935460823b5a5bcfd10e49ebdb7d18b1e2d9273b65dc200562eecda8034b20d382da529fc08da7e3cbe207ac2714f2811ef83cdad140262d0152097be5170b93842577a633b6c44874110b45e7642f4e5cafad1c81d0973eb42e603e2632c792ca91d8dc85878702f899eb76cda79198d67c8031752454f3712ed88d005bd39144672927aa58da4acce348917388aa8be77d0cd2e5a0b122a4eec0ccb5c8813429014f429421588ab4972e2d715b8f24e7d8cf0edd14307aa20065c5806eb36624419feeb91e03bc5e021a314cab3cce4fec6ebec78002331b293b200a8040370d1880907f31be7eeea7e0f93fe7f75197a84310865c3f71b91d94d8315e3010b4854ef62c86ede9b96dd63753cf07657ed914d16447cdaebb8b8d48b8d036f8fd04d46564a670912b4c9cd99cb722e8d682cc7c044386ac343aeba697680e993919638b78348109fde32df5696e7a064d91b9516341d61ee09aa7ef89222cbf9eb30e133b5b2c264f5a0e6e5750b53cb594fa1b0f7b817da44bae435fcbca33d4705fc6d539ba42341eebc8c9f500fb5e91e27ec8af68e5be592db603582529fa37213ad52c28953b23e17a203d3c7f0a0f1b2fc384d3e399dc3ec1c632bdcb96053d3c39e9f186419745daf69dcc097fecbe66bda196872530ab2262ff0686f65cd4d2541558df38b0805589d358084a3035ab70719684e676e1374d84febfa8197747bda05c82eea0ef2c8a167be65a56202152161b448de69c8e23f405dfdd86b22e390a9d22f900549e38fe2424a2d2476e800c7bd011a7b1d5395b27b6f93f8809bb05b8030b04d2d896ab8169cbf2d565d7c7c9e926c469189b2c0ddd03c32b13e80ab011e6c2c59963a65b4783d81463358619152ac59d246a0c4ad1ad9c51ed28495c453bc43e6ee5e90d455beaa9eec13553ca578048b0eb8d50bcf6961d37aaa406c7ae99e0e33541df13eb479559aa2c1a9e01d5e7c9f7fbda898ecbfb8853a4bc8e79a944731e8f56dbbf179bfeff7a78c671fa9704fae5010026c32ab665999ac5e4f40aa477dc848cce25df8d04883e81e8185a001f673c04656bff83779d19edb913b1d7b6265d90ac2a61f295ac44635ddb6f729c9ee9cfabf575401ac12ddbae9666ee8bed61753150ed46aa1b159f3475f445ab9c784bf8ad6385bbe821259cb4a69d62489ef17d8e5c64dec15d3637f1a50f96fbccce15c567ca53487d647055c7829244de8f9bac085cca33c82ecab82eda2aca53bae8235167b2a83015800eb53945cbb45dea2cc9669df33b15a8689a33850779b5774796e8daab131516217e82c01765040c482d32cb4b054079bf7472cd3f33e89126d5e23db64a1c99996efecaeb730963f84819dd51d2ad53d60d92c083c6cd833f93698753679e2bd8c9835568862cffac1406362102f6dbc55c15628b0f52589a57b0ba731c2a1045360db883ab09eff93606ab334583095543c420214a959b777581fbcb049d17731a5e7cc77154aa72e48cdc2e86bf6c89828f6fdeab38934c92ecfb2a042e15c804bccc1b9ad9bfd5b433291daa442aec5832e5f1a50019bc62284235c9d0833992d58d0267ec1c98cfe01c2b6c5afbc95a20b584e9ad8c35cfc66ac8e0e67d5fde83a86ca9a3398956cbb3a0c721f0b5d7fb4fda3a0090eed508a64833281a22556ee301172c795742f7c721c735d68d61d2aca401e9403d21286617e95286151c6b10d29d46cc7a9ecdc971513ceaa12271162bccc45423e56a110ca5f327fc5195e01303894a8450bfef1f0ec2cea9d547f1e2d8d897cb5d815188ea1a7d098ffd0408664026c85a90111bda314d7ea7a9f86aecd087a2e289eaddcfcc23ba0cb1e8305375ed924ec2606bafc8da399739abf8d3fd1d1df077d6c89b6adc39a9c63dbfde858c24633594be2faa28c368f44dfb157b526fe8473f89caa2980b651ac433434a63b129d6ce6549d6d16aa994a9ffb54178284e5cc61121b78366d646354556a97c7e3f2577dc60847d177c332885eee9f15d7cf551488452590cb6a5785286424d0d93cccb6dd4cabcd7b580f4ff420ff8c6965a073f8b201fb0542e4b0385a9613df693a23435efde68069300675ae9141462505fd1a50abe528ed3e99260cf8bcaa69f6894b182e2b42fb5eabc4689fe48a97da73095622ccf6f5a0cafff52ee8891ea0a3202c6d84f634d9b3509ba9381943757bb3275114a81950ebe1284d5da6ad2ecbac11e58d851f6dcb5535cc18a91bd83c54720a60c37d6ac06f1fbcc04f6498f32c992f141ca99958fbce74fc1ade64503e6ca566bfab448c88f1621e1805779264f2782b44432e772fbffcaa0728f1d406bbce60303661a747079a8aad07065aa8be6a36d1939498e8eb94bb4f2d80158fd96ca0898d9608809464844550675a9e9a2b4fce6a13565cc4e591701271de76e4ae2a9b9e42b40d429aac978b3894c6acf1bd861428ab489a8b7da7f044466a57b96bad2826231c41724ca23f6a88618ab9efbb5ee52177b36360bfba2be8b606864761282d24b141f92959b85c13486d253332ce969f1404d96a76acd748a6a577ceb6d5afe6a43550e77a2e3714d7534c51b8a56970c10c28cca9226ee36e4123cb8e45170271b04863afed31b751ba4e9a7a513f28c9a93d217676a29fb2afa2145004f224b63dae228e5aa611c343079bed5bc2cd5f6cb4de2053481770c9f545d3205a388019885c720317075c4647773e85a327f95ed015e2ed5cd5eb2d85c0d5e6221d55b6adb09b6f537f3a23dfaecccf056cc1a2256b61012a35a35ec09183accf292c5803182debcb06ee2a96937c0661269f1d3fdb83197da176a89906735de4295772a69bb215ac2db19561d415ba5f40cfb36cf5676102b4d2c3a5304a2b275d648b19cf566e0627590f434f48c10079609279c433cf21bac747a83d7ddc024ba25de8c2a09d326aa14bcbb6fc735c2c3ce08cd8e4a03f11986eff7c20f312bea9f8801ed0f4f058026044b9d7e68b6bc267c6b99f45886c6fcbeb632c4ab11149e6682eb0a564984c2f7f13894d1c898f6146225fb299c3962552bc2a81bd9e0c2aa23f341cf4c2ca8f58e11a0521848d92a8fa54e720ac90d7a8d4febab517b753723b1f1e803dc522098aa151e36afc6f2ec918b5e25ad555e51d260129fc195527344aceccc822ecd6cae73698206d951cfe62fa1f1af522f7aeab34d437b1cc1542a9e80194fa13d1648d629b2efd34cefb25485a645681b10f5aa37a00047a092dcdebb71de26ac2eefe62c488598132785d99c0db00626babc47b28a0ddc26e8a1ee38a91a24dc40f2afa89ffb843fe1d84560ebfd4952fdc45450b7336d623701db4448c8ee3fef151d748e0093404f2bb40c6a876f08a1452f8ea07fc0949c60678fab0a26c4ff5a124b04a2265cf7b2e33e49d1187a940013e1519da7f72bbe6071b28dc1e5538bbe8c370c56f21e53f4dc4376b826c9e715e8ad368125ba29f7e9c64fd67b5da57b64f05aefbb5148da5069ca89f89693e9c5534319e7586f6d3aee2c9ba2ff159a2fb264b08a24a60d97f2145db444bcb592e670b5f7f77c37ac256d85670af296f4538bc68ac633d3dd69388a9f81908e8db382f3d7a80974eb3ac27cec73bb318b08225cc8a0694df415e04c855386a609c81c0f905da47d4789e3902133423304da86a334184c865fa76ee1f1f9ae4a806c4c1660a3762baec1faa6a0b94ee40649643b094730e37d11159429bf378a656daf5ff948ce4595519a20c60e2160bc83faa3168e0b5a698318b418642147766965eee82465997bb447842364e537085ae080bb154dfa73aebf3985771e0833af7f782daf3540c7de15ed4318e123a1ffdb4f85548125e2edb134a78f3a7c67f506fa7eacc61e149101b5802c211c9e0b47d89810930c1667baf7a745133d329c73f65c3c22660ef960bd18c570d8dc8989c3b4064e705d3da54adfe8ff77ea513be081380fe65aa985cc239ed0c2f13d995bb6ff50decc6c27f3a5e6f29b4b72e87e7b029e5d4536e28dc1da1a8858a775078628f022ec70d3d3f5523a33198a74a14c68fccbb53116914e11c79faf37b130046835065b93b005ea93d22720e30a0267597f27cb7e65bea558e2105149da12c6104c64f628f79f804464333d861556a057f1e7e92dca3655a7be427447f432e6e6f8e1efef266906085540b646bd1059a34b932f6ccc2a0f625f08d50e3d1b2709c83360e4f8ca1a261c85a83d45fe242b5bf8d86772bd78f1726b12bc9cb6064a52aff1a4e2261b92e473acbc91d981c9803df45ef872d0f6e64c7a46542333270cb928a482cec8d57a0982c720ea4113c74a2be85c91aa329a8382af67980f817d585dbf10603fe927004dc0b1cef5dc827a0a80366139c7cac9b418a3315f63799a4422362c9625e8974780f0da7072a67810e7b0515dc409395c7bd0079f4373d3e3b08d849783d26517593eca3414ca58bea2f73dd18c2a6bff0a7203c13a77a23c08d780f8322d1be23eb6a3ad12014d68b40acaf4140074978e808c4002e6311f96e7f7b91498c9e5c9dcd4eb3e4a597f3bda90c2336d2c2e72f4d0c2669ab6e55009ed5046ad87086534fde1ec539a49f8fe738f7c702fd2e397a309116fc31ec9324ab37fa2633972d1aa542b8410095a34f4939063e9a9f26a580326c75fd03c757905b4eeb87d1e5705d49aba83f91e8148074eb98709ffb52cfe0319b2d492e641914a6921c4f157d89026a0dba895733c7a237eceb40ac3a9fccaf48011f64fc8a7f9e0926e1c6cb45a64adde3a7a55d8bc6e3cbb9e0e59a02b9eb4746852384c5873709fcf926531c8cb3aac0a084e80858dd7ac51d943b611896d2594ac593e84a08c08ada8756f891ea3d815925a3c0d90da0a82fe168276d4ba823fd9f5fb61f89078c5143262d542dc87861b209c1a04076d9d513610168c03ff9181adf240058223a24294bec3a975b214e0b2fb1be1ba1be5114a5f503f84dba339f50342bf5afc280f900543155b43763c05712dd07fb8a5be65154d085f25121f3bdb2b82c5faa453c49b50295b1ad9f458cbec88be64e8235effa4c9b912c69431d7420002db9c29f749b510041eaf6496743872e859e8054c60f999ded0b2860aec44371758853dbe38ced856dfcf031c54edba9398e205c4160f8849cd44887f0dd19e0008bc517bbbd8a6714481ef275a60c2dc0bf81174c99d7dc9110a039143af3384de4f2958f0ec6438b2f5067bfe98750565b185dac4d763e2ad060d3f59e821d4147256a6bd8788b251511718b66fdefe6ace600e04d33530cbe764271fb034cf711aeb2e0dd4e30e8fd7f06343c273341c35f843107e02a6c9b2ff22c041942b90eb3c75313786bfe9d444963f1655922a40ac208705f34417ffd2b66167231696e82757b11a66ab2b102fd30c55c5c60f3059c68fb22a00395bf46d39a6b33dd70d00c5a067d0d5dcb986f61ce22d72207e090ca7885d1273b56127123602ea8482aad352d8c3f7df64de0225414712461066229a59bc80e975594258082749cb72417715e7e431108a24fc568443b0d132d3d70fdc1eb364e043c4c2b277d05b05f1130e42f8cdcb231048534ef6971739005329b813ac233ce5b2a7b0a0f435ace129b29aadcfabd085e6e02be5e7553e555a9759342d6d8e6b797b1ed4c94856a98d4414873df224e7f284accccc62eaadf80d2118951be0247d4106bf7c060618cca87f5642b655a968b90cd274dd0db543c7a946fcc1d2a1412db8a6527a4b57ed11537d0fc330c78b956eb0f992eb2506fcc5d88ff826e713ba66fb5dda2f105c770d61cf28cc94f37522594a687d86ae55074818b7b471222683b4019fc9a1ca11c25bf8774ed103b9bdc142ead89182cca2229bef518e0063b37534e2a08b823579348118dc30fb7e3cb20124ef3376c24e08cb750ca9b29bc01253a622a873dcde188062ca447919deaf9fb8f5f15c8c3d3c7553b7778dd21fc55d2bf534994b414f91e2a4a203e74232b49d4fb0235153eb4aef6c7e64c55fcf1625f04a3066f6b3cee74a04501470d8d24f18004aa27e4aaf5cdd494d34112a501de61518642a0cd8b2282792ed64bd68303768479c862156f1d8bf0879510eaaabb83f552e67163af7359660a3fb5a76e89d21337ca5b05d9d3c3af9769fb3c6523d5edb7dcb4d4676fb4f81d68e9b863fa9e6c0db1849a4c42b5b85685ea4842d8624c910e5a6a3bc3971f4f7cb6adeeff6b446a19dd20703962b87bf0e0cdc1f87ceaceca2a694915cef12862ef6c53e67f91fea2179b91b8eb78c793016a061432fbf37a11677dd7e41531850f38a008e63d14840156e1a11442e45a8094840a9f0e53c7aae4ef495d1f8f973abcd3ea43ca2f16c82e092a800855870032e5b33edb2c1e8b2d41c690f964bad7e99bf9c11fd92665fb9ddd98934a3a6ea103c77e0b601dd218f6fd1fb40f3f263d63c8cdca68cc5dd2e2a5118b52065f7c90067a84f993381f49dae948f76340b357ee230175c4265e7b9f56177c13a2f94197e7ceed8b3749461fbf0b159b11af695a3fa2b181e4b58572ca1daf49297815dcbe1b841be578e89a510a8e7a9b075bf42fd3e4425070e2ee9cf465f71f41ae5760f26fc0f876d21301a0d97019ae846b3c0b3a376da3b219c64d85d840c530d315b1d50f2176a4f69930caf059f32ffbe58fba0f93329d5e91a75ead9579f87cf86400fa163c8ee6658a28dd15104326c1cb9483fa4f813ecdbc8c0ce41fdeee54294a52f5fb8212c03cef533423b7dfbd1915bd6e38c5ce42f501a33bcf26b85422e8985476f353ccbf6cbcd280d1564f428c2f37398677e574e5a093245bf9ca3e4a1948a2c60f4c567212cb9c58d312bb666c96425024dd6477b76b478eb92a9ac6ab5d5c52a8e18e14693763c789c88d7d0366be6215c2bcb80076306007b293ae2192dc754064a8f2f7b6cc19e9eeb6d8a184fa9bf24502bfd0a0d11a610193f7e924d70e84480f620d12fa48ecb5dd5739031492770d184005902b42032d57b5f3cdd04cff8bee86dc1b1131f523ecac58af7ec8ffdd0174c893bba6160963318113d9251f32bbf6f52951ff6efc72967a674deff1d733cfa921d9576327569876993a252b13baa473bc5047c54966200feaa0ad9b5ee2a54ccf72e0289303d66b82a8dc5de5869f391fe943a1106ee75b4d6c48a321901e90b3ad78368e9b321d485ba00f49401dc8aa5d1301e8fee94cec0a073c3e6c595410ae245f906ea219339c295646f4934844feae41090350df0c13741a4afcafbbb29b338d042ca2be044db44624056d5dda6dbba082dcc104f80b3ced169e36c49b9ddc068204ee5dd2049912035992eef4723409b34dc3973d1e09b6df10a508d1b29a2595d70b8033c0bf90f42062b8c26f6898ca248975755d8b636f4dd4f2e93d0117aa8d80d2f16e61e04fc6c38f55c2a11a82d2db9701512c95405bf574a1415c3b61eeb14120ffd7b95e4a16d77a60a89a67c013d851d0410aa5409959f53313467be6ef3a13063ecac52bd73f3026dfe74c8b8aa94492a6034280cf00eb14cae6f91df1caec61c5a4bbb617bf5b844eb1aad87cc9af2eef455096d9ba2b97998ac2ec244e9707d568ca6e5d154fbf316c32afcab62a7dcd46dbf7e05222129fb89a157210b90e1d046f2bde9346cea9019cb0750e7a4aa25d14a964e254249a5281e22926dab9c499962d2cd561e7f4428a8e632bff0c05d6e264f36fa1859699114905156b93515b2372c972462b2256b77e67beb67c9f67b6e18da850002c35a5daca918f1abbe22e88d82e0553f7d05ec8a2d7a439b086573157f5475a15b3f99612e93ecadf7a5155a4a7020a7cfc0fb64841c4dd041e6e84190e5b201232e27455e755df78aec480f618ce78b767c4849e6f72803d8639d7dff762723bba9b7de2fdf1752563ad5390326a553ee86e00ab2a0c0c8cf6768e8308ba00bda1dff3f815e5fff066a2dcc71087fd806fdd444444c8de72efa30e8b0d9d0d3b36f5527d3822c8b3632e52940e0be4c9b1729fd4439269419eb8531297d32afbadf65429465e402720bb954fae658505e44992b148b24aeb3aeb3a4588190c2bd31a37204edf589c7b7371362e0247421a6c5742262193ad82afa1cdee3c3a7b0f3bf19c4942bf81e76075b0abd329a55527d39fb505f3b3ba2a122a8e7e104a536934509a4aa507a5a93e15476391e923402b4057e4e9354075804e6f0395813680aab653fa4c696a9513864caf83d2d45ac5d107a034d54ac5d13f04c8f42e509afaa300aa124fafa2aaf0f438a86a3c3d8aaa4200a034f58a0daa4374d7aa5936d560235171f4bdd3251904379f3d13432857dcb428c8fab36948a834ed828aa3d2f44e0d1a954ad34930159f4ad33ca54f954ad34b5e2577bf646a95a69bc4fcec86d1f8a934edc454af74cca6fa335a9a8544a5e9292ea834b7053b95e64e41a2c64eee77924a73693c95e652595269aecfabd2dc2a4d2acdad551c7d9ca4e4f91299578e695269ae152795e6fe541c31bbba3a3da5d2dc2615479f06cce4842475ca9a5b5e1a9595a25a328d9b4e73cb4bbfada251baa9a4f4460b7e81c1b751254c592470ba0bbe3905a9a6cbabe9825ba2797aeb9a392effc1335fde95d5ec11c8354ff8071f42a6cbdbecf3e6a5acb400a4f7b8a3e4f29ac6274e1e9de52e25a50518e1dba81925d28845049a51228d58444d03ed843e1890b96fe7b86da481c632b783ccdd5e1c63a054640e9ff7e16becdd76b61daa437c2b6999cceef78a89d59233a3553242728d8eb0e820416ff4cf15d3bdc26a61e5ccc869955a4648465c23d71196230ae896c0676751d9796b82aa5c9079a80e2474ba2572ff1cad12b90f2a93e4227cd058be5c1d69a054e48b9bd6a8e6682c87e29d52693656cb145aa5d97266d0a8549aad55a2e253693623249f2a9566738daad42acd7684a55669369d8a4364a5d26c482a8efee602563522f75b583943b8727f464ecba2c00291fba59611cbb23de43ec9888b8c2be4fe08f7b72395460a2c47727fd3e92f72bfc1c87d11d6d994941b13ed8415d8207cc87df1ca14727fec30727f7301d5d14da03790549aa6527128a148766c11f7e2b3b71c7a38ee00bd69adba3984cfdbd87e2c63b8e7387badbd78c3f23ab9b027b749a5b95272df283a3707f4c66db2650fdfef061796835d5993b659c719706ede819691b95b7bce5a54a3faa8ed757371bcadb3a1454871905eab552738f3745a756eb00d16cbfdcd89d7f2906c4f405acb733502fae156866d7aa36d16c8edf57aae5679ad56d9538a4f15c75033ed5cf38605f2f4c89a5dddd75a25ad6986dd5b932dc910ae902737cbed64db6077b6c12e6cdb6954dbd57ddf961bcc6bc16ab0e6c5de760572a755e7f6da5e5b932dc910a68034cfa365da0421b4c0020c938aacabceb86f25c76dd6da99771cd02bf7aee4388ee3388ee340ffca1304da8101210e37e5ce6b6ba92c7bf74e3d7c0e79217bddd775e0b91fbc61541cdc3d5b76dcade56d27df2a1cd71cb81db4b7666d89e479e50d2d76e1bb92071f5d0677e872f79b0c7a357f3f8059efdf39d0e3ba5757ae1f7843a338afe4b8b1babaae4fdce9587ee599237ff75e9ee7799ee7e1f313951ecf1132f4d08cc75bd2a8fa25f486e87d658eecc13c8f244df7408eecbd865eefbd5a5559700887f069321d9f28540ecd844eeb38034ef66a0e93c9c987b793c31b0a6bbb8024358a6c1df2f4589eab551e26527309efd8765a75da4eb3f823b9e2d3d3e9645d4fd704d6a8fa96b273d2cde8763a98d36bbab3e2e1f30654097e2f9bbaa48d7b08c395300fcbd394377c8ae410548e391d77d0e8aa5889427207c1cd5c5747706b9d955cdfedd82a91cb83e370075099c6472954c7cdf51e11284de7a238ea3b09432859c291329c788259a1e40af38e0545c8d58b92abd7d30f4397872a728646f5b89427a56d358dda388ee3388ee366b12d47a336ecf29a76e900a5650e0b71b9cc3b5aabcad7872ea5cccbb224739773a5cb47a35c521fe4d133a5f1601447fde8853cba0b3d7a8e56d98f60c8a3d7501d01f8e830adba713e8f6ea3552d1fa146621e7df4d147f75824f660dc9602c0eb0180aa713aeea8f19a0ecf19549ec9762693ded548a47bef482b8fd5750fbdebba6db34e6c9346559652c9bdc7b2154ce2e27ed4c53399c3de51efc6db93ca73c84c7e39eaa5f3a959902f34bc546915873d604fb3b596b3364c262f0f5bca9a4d0268e1b585df286b9e615d2ebc0ee0032809700ff6d7fff45405789d651ca7e30e1cafe93054915d970386ce729d2d3b20a4bbe9d6643a0c796bf97be685bc9156a5192cdfee6d5b5beffb3c580b9e516291b72cafde6bb5aa9e545eeea4b25f409e1ecc83d955cc7ea66c40a3b8b3943fe80d4e548640e5c7e5e814e77525eeca996fe53904863c9ebba93c87cc3c1ccbb1b43b4020ed91b46ac31e80216ff51680fb4c491b858353722fbe81c16462310170a9a4f94649b30be5004a0194a44d714f95b729eea8728646710f407903bdc1bd8592ab51d246bd603c53636f5da3d777537a5532eb65ca3344cb1d1ec9316507509906160273ae73d2aaee05c3f2a384074faa30a50a54ccfa8ea755f5491e4fb987cf1c874f7b98d7583b04657560b075954d20fd80fdfc64518419fc80e183ec79246932fd5bed41e6de042a3237061252a6200421bac081b9612e8a1540062431934217603811c305544011a20a08c813170c8c2fb0c8a28b58480962a90a6050e1890b7e98d2030f9e8c2105f40129624b866022093aad1de8fc261349da6dab02595da65681565881c4000ba82086942568f1048f597590399418e282aaba9dd094dc0f45e9877afaa119d57180dc0fc5eccab29ac5b22b1c2198c07c62e00420f8a004b31f6ab5aa3ac9fd90cbae6815aee80192d6124c6062f6433aadaa39c8fdd08e5de1d800f672c289294c8042ccec87785a5571f06a1282f5434e5ad59141551e0fe84aeefaa01faac300b90faad5403b76459fb08412444c29824e0f53987d104fabea14b90f7ad99545c28b2a2c209678e104b30f82b50a14b32bca454fce0f52764c00c40ecc3e48d6aa7a831e2933d014d01154d5cd4048721f6404e402e9501d02c87d10cbae9a76825ab93fc6ec4a072a5e9044064350f1f9c2ec8fb256551be4fed8635794093660e20739d8810c7a7a30fbe3ac55b506b93fd2ec8a2ee104b32338310321aed4ccfee8d3aadaa466e5a73f5e19a7a0aace353ac9fd71c938c2a88e54ee8f3b76d53de7c893fb22cdaece2e6845c8420ab0183c31fba24fabaa14b92fd6ec0a003c90c14c468419f0e006665ffc69558d22f747965dd15084184cc4a00952687184d91f5badaa50b88eb44aa73f2211b9a0aa8ed5b1a2b42af4bed823cea80e54ee8b4e7a655da7f824f745965de1cc604aec081243e42c6109665f6cb5aabe725f74d91525c3a5a383d712586c5133fba24eabea13b92feed8958d2872c03a228c31624430fb224fab2a0d725f7cf5c526bdeacc7e4806557135ae165ec9fdb04a580b7fa88e32f7439a5d752cb6635738466001250cd70d8220e50bb31ff2b4aa32c9fdf065572a17c08478410a7a808211b31fc25a5597e47e18b32b983164e01346ad095450c2ec87b25655277aa4ccfae194561d41553d454f118661a843753cf7c197cbcf3027f74119d863572e4e6c006546032c787460f6c159abea0c721fa4d9150c5284410422c0c00751b062f6419f56d526721fac59e91568f6c129a8aa610003d049ee834bc01708a33a64721fdcb1abe6699066572f7c61829917b01d3029c2ec7f3eadfa6a7645a978828a207e5e57a0e008b3fffdb4aa2ac97d906557340b970f7400e3010dae7082d9075badaa32701d01755ad507917c5c505503d1407c5372ff8bf2f57c33aa2326f7bf985d75f7c7b22bea8513460ca18c2a4c19230cb3ffb55a556390fb9fcbae58bcb0424dca8e0e643230fb9f4eabbe1dbbc271a2021fc0c0c14b8c29e498fd8fa755958957930fd6ff9cb4ea2383aaaa18625ca952fba13a4c34bbaa3f36e5c3036b1595b58af648f16660e4be37c53b82aa2a175c784872df33e2b93c1daaa325f73d965d551aad259bb58afab48ad6acfcf4bb2bad9a82aa2a155438c9fd6e49bf3a18d5b1635755c6d1ec2a88125518e9a107276061c7ec733eadaa4be43e57b3ab22607c210428a608220645985d6190fb1dcbae282d49176448b1842ae4e00766bf6bb5aaeeb88e743afd0e49abbadce7b8a0aada4413dc94dce7a2703ddc8cea28e53e17b3abfa7a712cbbda80185e2c61891f253168c2ec73ad56d517e43ee7b2ab16a69441042b8a00eb4106669fd369557541ee733b76457d30032940d14512558a90c2ec733cadaa4abc9a70302d729f73d22a1119545557b0822bb9bf6db5ed87ea20e5fe46b33a3eb9bfedd8d54a055630c20232643010c2ec6f3cadaab0985de1f8708513265f74e1c4164598fd4dd6aa9a448f94597f9bb21d415535881a44ae9b91cdb5e9501d577ad5f974aa8a7e6e39b9a94fab686d0a2bbd0299fd3b0555ed208693dcbf4b5af55d18d511f260537deb43a9ebc8d5e95f24ad625145808b295edfcea80e30f76dccae70a0b1ec8a8ad1c44b09141b1c518203b36f5badaa48e4c6b981114634a10c2a72ca8082d93f22378b143ac869556184138430bbeabc9ab4aa6f9db44a9529157d25f7bb4ad7faa76976d5a3a9acdf2365d6ef29ad1a55a91492dcefb7ab759a655733198b2008614a173f689202b38dc8fd3aa3b5afbfacc214558f97b44a7cbfbe7470b02b1c25be3842070a226650841b98fd1c5a555b80b3c414a8d8020b4ab4769060d62272bfb2ec8a52010b307ce073850a267461d623b9fbf548ab42b96d3e4fb93e025475a2a8faf6581ecbcef0a37fc310597081850a9a90c203b389c87dd2ae68127e00230b5230618b2f8c60360b3cf0022da65c21c6c4932dcc15642558692bad32fdf874ed49ab5a643d335a16997b5381d955e7c3cd38f7d6e99de67921c9dcbb49abbccced70dcab0ff75a03b9778ec7c3956031d913522a4fcda92d8e7bdd292273a4ccb938d7e8dc6fc0218756dd18658ec5752c8ee51cc75dc171358e0b820a993ba97bbd6017fc5241926cf24cb16c32f9f858c92d2d2d2d2d2d3b3b43e820cf7021cf9831a3b2f28c191801e44d41135924b222056564d14c1689444678904ba5522c092e962912898408f8ec86790ca6afb130e51022f9743bfa7896c143c47c7a1d7d9c5e7a8f3ec27c92e1743a1d7d98f2792a1d6321a57fef7e471f252cc4bec63f2cc4be7c684bda6216d22fdcaf5a71f4ef486f74635cbe87b525ad38bed38ae3b4d9a1968193bf9bd3cbb8fc57764ce9fbc2af1442df390ce9e843e620b60fc1ef31b734c8fc8d7ae9ef7bf9fef25292c12dfce3c607d45ce3ab39a63cc97cb6702237d7a851e3df697c2fd5b8fd5efa4ee30d6b55e9df4fef74e10134fe9d6ee3169f0078c7fcfb287dbffcf4f20b3ec9e0d37fefc79467f816ee801304e8c1f751b48c79cced6979ea90e9eb48c3874f2fff0e9e5e1edecaac4e2fd8870e5987fc9d3e7c0a3c9df63198c851a7230da78358c8e92f58084c49e4668b2fcc5bf836ca50e33098ba8089d84ce336f00500266273e97d3b3ea0741af8acb9f4efa3afa88be38e006ce31fdaf0034f6f4bdff73a3e80e21b7ef6fb60aafffbfddeb0b25f31f23b8f6ef2f2f7505bbe9e3a6499db71c701f053cc3d2c8d9f604e1b558a398d92be549ea75152d0ca9cd200f337ea44a3acb9875dddd3e9b7bc9d3afd44030ca68d3afd2de0ffe5f8e53556062c694dbfb4a7a3056528dd64409987a741654e23acf197975b99c31c2c6979e290292dc59ca38ff9567a9992abeda5c79c52275cc2e0b792760a8ca17199b374011c86bea94c49338dd28e3e3a87588895a1c65f5eac7d395f1e029c6c1f96272d4399d24788e9635efa001e539e37f905877cb6f0122672f3cb6fb66fe1e5351dd2fc52fe35b6c607509e3f720b174079e2905b78aa3c75c82d7493bee30e14460019806fe30c38390098c8cd23a83e4ab9460b650c4a932c9369ec0919528ce401640a6508b45c46924c639942c902952aa2b892654e615e7a8d977b1feed1a89a0e1ff6b84326262606743de1ca13aeb818e1095662401fddad56d5739586e69797df4af3fde55ea5a17f91f9e981e0cd316f564cd92d26c898c7e06ec900be95dcd3f2444fe3347fe589e21868a6dfc1965146d3191a557fe01e8de2c61d4aeea9f703d2de07c5609f40fc0cf4d06186245926d7e7607968557dcde915d58256ab6021c9f53780b4ebb8a3e9c19ac351c9bd37cad0f8d4b7f1fe0c1c1312f7e82fc8eff627953d6087d37837ee50cbc83f2d85f4650010735a7a31bfa30c67cd3195fab00f87c090417cf647503348e96b9aca940d80b265517016c897bfece88d977fe5ad385e4ea3f42a8e9773f4c6cb6bba549e627e79c88935cad3e9c8e3f41aafe997b2f41a5b2af16b9434db2861cae3875c8d7204377fac56d9162e4fdd367bdfe9dec8e374c2271fe5bf97f8d4df4b2ffd7b58c6698b61456cd4e9819455665a45142c88b9fd64646464ee6b9a48ee7f1ff82e8788adc794a013907db08cb92d6f99d3fd7d4c64b0107a19261e1095dc87e0077ee0078aa60fa132e8485fd3df454b85987779c6d0febc7147f71031d3c3fc44441d6590f91fd211c45dbefc2bc353fa8285d0d75186efe1cbb3e611743e6d3291ce32b725580e11b3ccbff224833dc900be1c3c3dc9d042c2f7b34c37e9548ee161c514dcaf25343e9853152f255eca1e3334aadec554b694b45133f08f2c902795d1a8e4fa0d6401c9c3084e686004d318a44cab78e205df47655540e1c307c409fc1b665727109f6ad87e1fa4bb6751023a0e7720f7dc3f0cc43b08db84eedd86fb3d8e1986381c20a073d886c9771bf1a07f180869433a791cf3ec178e79cb7bd08378e77011eede41b8081320dcbd17019d0371dea979faf0a906d0b907019d7b119174f64b02a19fbe771f7fcbd3779228963826697496937eea902c4124e81e88f1d93120a26fefb206113ef5a9297efb570219f1a93f9ed6c5122b54d861b14cd24522128e2902dd3be81ecb6854e2982ce4efc9df9f4de298f714a49af7459800119d3c358b88f0e93b77fa7090d0b987b08d0d93d38fd06da0660807e17e5af085124ac8582c93b4a9fa569ba1dfb0b89fdd036953b7a97aeb44881a6491059510ee0154e298de29c83dd5504def9e4bc18e35cf7e35cba65ab17ed955efd0543deb6b964d9d7e7cf538665715901333a959cd93ca66ca9b3323cab40a288cb028b162a6553ce10416a5b4fe9ec00468450836390ecf1f36990ee27ef5bb49a3c2d386f5ab51af5635397d9f7d4ddfb3594d3a55ff95fd0ae306164dd59bc21ff2fe9e82dc0b96df57efe9c32a46c974e4f1e1935af183ec7be70f9f381f58522b7e90e55b9e827845eebd1b2e3e01b936a7efd4dc7ef1e9c33554f39e9a9c4765afdecabe4390af97c5642dd31a38a69bcf6e374421a4365e3fd3aa5353279490433af2a8546c143dbd0a539d331e6caa11ee3fdcf4dee4bdd60eb1915be481d508e87339f697c583b5349fda0df7b6bbdf300f8dba36b1dc34c7e5214ffac3eaaced300f75c6946bf350593e903d90277a1b65579587f2605795c7547938139074ac9722a5f6478530a4adeaf7d695dafae5d08aed8d31745c8e61eb446e8c61f3c4cee62d8670e4b1596bcb12a7ebc54218d6873ca80c4d3b06aeb9ee7bb790e3461e74a31ba5dbc55dd739f4c49abd92f2a0951ea7ebb60318152908a217cb7d5210a827cb1e1534d5f7786caabd1d32487b9a49b256597ca2b9dfa72a5ba3a8fe5da61669c7f0bc9f24c7b2296bc730e52fa7517dbbd990dbea13571541a871ac5b7b54904f522d37c93ee4368ed5aaf3cbc9ad3a79596c5457596e2bf2c919c9e7581ccbe29334e3580fb8f9cb695577de8e4db5a773aaa19af4a7201db59e6bc7ae3c29bd6377f079d1db597dad4ef5f1295e181b2ee4d3ebc92bd005ba701b2618523ebf9c2f277758c3eb43cf491e175de93b251fc43b898be0224c807c21d48c87f281ec0629f17ea82693d33d10efe0edeb874ff545be77f70e3e8877f0df8b80f73e5c63530d92203e55f0dd2b06f23d74da1a136a30a3019424b440428f499a3a32070cbd08e9de49cfe9fee1221df64e7a90efa197d40c95d40ce9a99e48cda77b20a277b7afb9a643e4c193ca53c5a78b6b10bd7b101179f0e48b7417bd08138b8190a18bcb83944a772961975a5dcada62b12ae939e8e0437dae2d9df498253d6123fd9458a187311c3385ca6ab65aad96e9c78cd7b4f80406a4f8fb7a928cd463572e3d5947ec29b972786ebb25fd945a34304906833def84398cff82512ea5899a3d339a4f26d54a2497929aa1d8a393fb3d76454d7176b128136321cd15d25cae9026ba42daa9be880d131ba809be0b95a78a6da0660e785a0f7a41ba83ff3cafee783a3adbb5d5d288414071051109f930140ffeebeefdebec771024c964e4ab5130b0be5e99dbc0984d7517bcb606f68831306653ddacfcbd7b90ef5df722debfaf03df755d49928d3fc251e48e204fd67bf720de3b5c840990eee08b7cf7f0c906018b7407f1c9da83f51eb1a0a723baaaeb47ced78de115c87a8ab42be429d28e204ff774c107091dc445980001efbd08f9103edd201e780f9f2e8ec1a4a615a95caf24c9423da2cf86459ac52d5ace21b1fd197fd89a4d5d81ac2fc204c877f045bc77f75ee4ebba7b0ff21d3cf8ef4717faf7106642769de8a1bbfcfb49ca21bd3b59e6944e3efc7a662e258ef99538266d1e929ad474a195567b67e4d01b7d9792e443da1f5b3382ac3884358ac7a6c2970f647df84c3ab5ab1079122e423a493a49be48e9211c3a35cf9ddaf247df6053fd509913620e9f24dab8e35d416fb472d8ea6e6bb66557336e3a7994c94492321bce98f15bfe988173725e1e7a8ecb4d0fab78a949b316ff28e1937d89844f169f6a08bd7420a197b00d137b9b97876e3110d34927611b979b8e63ae803c49329216d4e382f42237e909b94ffac92516086e11a4870e84f410b661526f233ae9150329dd846d484ccdd26b5aa49966bcb87c865d912d3fc556eeeea207011f1261f04544ef4ecd701b7fe4b47c86e92fcf21ef427ae9356da5514dea61e57e4be94223bd94d474214b6ab694d49c5152932b82b43fb616b644a71a44ef7e43e8a069491c8265f80a6195822c880b894af2216c53c225f23624dc75e5a93e741cd3a6e2530dddc10339886d98540c047c08db906c7c6c8a8e362821ef4110438da1e6530dd5ec0efe14047ce8a183dfbed98c67c6f3d5beb0f5852d2b90a09f24994873d154ffa348ab66480b59464148a2933035ed435bde4dd420eeb52459f99e2e49468ad22a5a45cf4f29a757346224293112e924b99c10463e495748b3dcd5d65a758a342badaa55649116d246f8644fcd93c53554d3d64cfb6353439022adb1483b05012fba0817091d3c35ef7843e8e02f39a3373a8333bb7ae5a6367582305aee19d5e1d9d06647bea66376f5cd6caaef7931d005d692a709e449929da02bf74d3c61183eb4b6d64a92511d34ebc0a2ae444f08a411aa12449a5d7d309bea77fe667605ce66a1c9147eb59a5d892eebfa60a2eb83891f2cf7ab0846b24ba6b12d6af9fa406f949c09288e3ec9c0ca1c2b87570c3d84459a4db94e5274894c26922469a08b04ba40504fc4cb242c2a8e7ec8f984a42be88de646111486e21091e403a292fb6395dc359215928c43823cb929999b917e406ff44957501c4d92d11b7dae05e476ef88833fc573f7fe557c8520b1e7b2a9bed8d36161e55045d62a90b564a44b4772bfd4b235928c24b335926cc6d672844f1ad5ae5c3ad2a93ea9a78424f74bad1c39666650a8df44aab56a7645cd66b55c3a3b24994d75280b4fd211f214c3580dd4044f471baad9916676656b9424b3ab3046537d5b339164b96d2d7718e3a434aa0f961c8f4df5b91e0e96fb5f2cf73d4e56ab48ab222db7d8612e9b0fcdc39b0f951aaa796336d55d90bd51e99567f6edfdb12b1a63b172b830efcf5bcbed13b3a93bcbf7f6d49f1b2bf7d643eed34ae37d5b22f75f3c5977249f1bcdf5fdd854df8b7d311d1d1d227484d0f121c34829e8e6446e9865e2f34031aa7cdbcfd0b5c303a734aa411a06678ddab012d04f70568ea132ca28230be6888bf4603fde06fc884f41c611333141a5a5e635423e74d1995d852c9aeabb6a2c7016ba587605c24a25920c8f805d704171f441985d81149c010184815462b961d682315006022177a8137a5390349fa12be7efa73dd224a33af215e84aa4a9da18b4ab40551e3d4d2de2d32aa143bd4266fa4a6b5bd03dddbaa707f9ec21f22bf7c539d8547d9be1ce76d338957b99424f8f072da0dc151bb581c29f82049390b5293e67f2fdeed775dc3dc5e7ff61b212416ea73f491a36dca351f742e8498dba354090fd1abb9948fa7b13a5ef92527c6ee7b6d3fb0d9fe47dbe0fc920ef9bf6cc00042601d3286b4df486ad3fb7514fa02bebbab76f1faaa3af2346b63b64646b4d90ededcb95ad75d9d5f66353f6b6fb71d1d1066bdef3ebc9b7dc7eec8a3b82a6ec61906d13d972506c3f6012e409b2b2a5d228eb43fb643af486bdfdc9e9641bbe68d98a3a3665cded0aa4fd19be7236c956992449baa06ab72074a73696346a494d62ad1dcbfbbab032c8f3be82a0376ed4daddfbba16769b547c61b8499ff7e50d1139d87dd57ce2e4dba4652f2d6bcb0b727b68530d03129540b2c7fbec8aeba1f5e2cee9059f2f8d443884024919227ef7528f0787047982564a28284d9b00acdd4e4aee571a25f73d500f88ec79511d7407fcbc91ccaeb8f7c524dc4f94282e119d3cc98295ec92e993325cf91cd5588d3de978ba259d13100804da46b091935193d19270c4037a81a00049713149c66c6aa463572c30980e4c0736d219e9c02ee2f148d0e4dd6bc91fd09429f9733b2bf2882fd18928036171a7ebba26b64575d03e9d7e88a7d9061c93033dc9a091bbb51808f711db9ceccfdd663c791ba869b219f171cccf9067b90dd4f4b00d9d3949d2cf99cda426cb6fffc3a6fa38a6589e2c060110ee3d6caa2f629b1a8c63be9ae4884f40c4731731130f2839c96032b91731137b7b0eb3b81fe26da0a6f820d524e929c8780a524deed5e43ec658ac1c564a2badb158792c2fcca6fa923fa38865fa8c076969f98c969617997193e9d4fcde8d6c4b692a699446fe905464d97b913f249523c6968f0fd2f2119b5e64c65bf0a97bcba919c47497bbe022e34df8d461137965ab426ff44d654bf912b1c89f468d66e44feed7f147ce0c2c1bc96c8a364a54b2942319a805e43d7905bdd1a7e70e56f1c1e06ca4e375a467b2ff463a2d05f2147774c4f7414dba84511f3e4fb2dcc3e24e87499874921b9b9e90217c3eca88a55cda14cff3c498f84474223681e5165f8de284a0ffc61d5f95dc541ad5a329b9e9682604d53102320341695a5447bd52404171dc970a384cc66caa33c5a48c85954732bb62f17c46b291cc6724f319c940e28e8fd7819ee436953553eb59d086a7d6da907a9e772b8e3b3c1ae8ede79d7adebdd34681fe5950c7823aa00ea86341ddea9a213e6f1e777821c560cf28caa986ca15418e7a46b246813a3216cf234993e987c17210ae8878eed4a4215716e981fb789b119f8250d386fb8865355093c3604c2c999c78b06914fd117746b2916c24cbcdd2f22c199a4096164b2bf73f96d6ccb36468026733118f8834dd8a7850f904498127f7efbdf77af82451bbc231fb5c89638262514033aaa3763e41a01708b32922c80d9f602d6671121dd08bdee8df57c7f37a35aac9859d1d0fb70292825e59556f13d0ab55a7caaa398deadfd78dd915e845536d57e20ee8755fe2ce7d815e3f76755ddfcff7f3fdd4188f5d7526a0a93e10de0aaeab3b22f76b8f3537d7bde2ba535837b76ffa8ee6127a20a506fae3d61e074732adc2064870a655e02049b63712b2dbc8c3e61a7ac35e5482e8f628bb2225401ebc28884d85c2cb34c9d2b3296b7fbbaaa13d3fac7dc86e8dcf211b8f6a933b0cbbf1763f0435119bc7d07b587e074b6a53df59796ce89ade5e63bbf29cd9b00e8d6a984a5333cde25c0e4968add09f2b21586935d05a30ec388f456335159f6cdf757fddbbdcae8defebaf1c6223575aa3ecb91fc8d3cbd6be7d383bcbb65219833465fbae753da7950561c43ec9fd1c26b4eba6aa87c9b67e35ac11d0a725cda8869df4fd6a54c368f390c1d7900a4829482b155a5b1547ddec57bb5ade4a2da8db68e9354adc30d9b086d1b25f17779312acea6818ee57bf48f4463593646bdf3d6d2d1d62a3090ac8ca03a3a58da96869618dea675a62eba4513d046961b9edaaea585827e92555e74a3efbf5c2a580084ec22a722920692602929aeb47eedad7d37bb551955ed5b5d5d6da32d46c2bf73ada7c6f7dadb715df2ec8be77edafadb409d93c64735490fdfbd06b15a5820a4b45b6ef58166239dbb56e3972cccca050bfc944929cd742b65f00e48a3d6b83dea84782ec774eb6bf6de6d063764fdeaa488370ab6dcd6a6e25a529cfb6bdb77617d13dddd33d975291e220451d32254b22b73d1a25d39f64be30642a527a923c181b99da74ca07363c1c611385ac2610ec6efef06d140968aaeff52dadb7f7f4dadbdfd9b2d8c44aa552a954721fa9ad4aa5526185e18b08c3a1803c4da7f7c39389e613bde172a2a9555405f3ec42ae2d154976c9d40a2b5839b4e2f673add85a57a9f9629f5cebc595ca59a9e4d1efbd671199ee724a57347e6e6f390e76f56153772f8a4429112ef5a948f4d03b9a72294127204d7888984d3f8788378feef296127402d244be1bbde575e421c4fe661316429a5cf0797325624f2236b3bc65cb5508cb4d1fbd47194c23d159b010fb2ddb91862d5b5c89741e5d846f4987e44bbaa46c3b40ca170ba9379dca5bd65c433ab2e0d306d7d896d7740d82a53c7132cbc53bd8cc22be94a5d35174d1ed39cb71b799e3ca7b2b956edc712f2a4f9cbbe3b29430f8ac19e6b62cbdbcb64aa5572aad7a79e9dcb8a3841140f6911c56b154bed4d147986dab481ab7c71df6d77e54d21c92afe30e25341ef371c708e31083e9884679c71d241ebdc68e4acf743af230bdfee577fba9a41986d6207adcf1821140562aa3d7215954aaa6caf2b096dd470fc326e5da55743b7ad79685c5e292c90e21557c6e3f713819be75db3bef1d2d0059ff92439df18097579796c3dce2f3f48b71c039dc5f2c84bb3df7d16b793b975aff2283e8f6dc39a4f351f1e9dcc95b9611cb87e413874df81c92eb497c0ec97674b25cbca257965f6e0432993b49f98e46f8d4836616fc3bbaa83c596668b9e8dbd8a3e6968f70574708d43cbaa8453484943fc2425a2ec2425c6e5bf07591a1bb7d8f3e5c309d8189d8fcf27b8b4f187c4ff7b5bed4578e03c718eac183a30f920ea40cde0c34aa432396079ca373b7d872f8e25b6fc5a151fd1c6c0e38d40e752743a4e8b60c99ca734836ddd2b6a39746f8acb6e4ea080193e9a3515933673f2a9546a5bb70a5b794f0b9dd6251887c8d35b19434240a8d422513f7efa5342a5d7412d742caa59344dd49b284cfcea5cff8a83c5137648e83099d5efe9d4af22465130bcce9a56545fa42a5c9bae0d3cba39b30cba824bdc4f2f133b8372e89c8ee24d983e3489963c1443a0fd9327910493e0438671d2140cf21a016e9d518b8b370079da53c6f3279433eb77378082993f65b285476af0db8210fc9db7168d5c51900b192ef1b41ed8034aa7f38398d9471b0ab9a1f4038527e13e449633d5a75b6e46e400bd541b377f2f660745371ba1b0024f80049a6508e40e546a650a880921b06b467603a34b022891a08c18ad93e58d2032af927f7d93bd94aae39477a896dba1579358f8779706dd97792caa29bc7f37d3f7ba76ea509c4b5ded756893bb6ad6d51db9d75e88b65297610d0890035d3860035933c1704f9de4135cb665a05144c40d154bee303ba2c4299c22bd32a328562c52787db46850eb6bf5522ae34a84968a5a13feb926c9f43ddc11d3e360141d27c9a50a8b3772a1542060197cfcadac9a938bab25ae48962d9aeab544a0f677400cee9510c6a911e85628596c1d7d86c89d8ccbd2b371e417085b55f7f85430179d69d5b8f74ae25ed9d46e5d81fc8b3777650526c695961b304e1dece3bfdf697eef5f4b52f840241dad3b252b2e260d623cbb48a2b3a2e645a454f12b946298d9d39bc59ad245d913374f523878bc8768e46d5afca2a2cd72ab349ae6dce56bbd12aab3df7880e76556bb5ca83abaceeecb4eae2aaaa3a221e4688d2a82a8e3b6a9446d59e930cde3bf082ec9de6b3ca58bcc8de1b0ae4596535dc3fae2e296b944ed56fe0ab8c0919e2ea69415eb02c6d4d8f3148ee349f34d680565dec0131dfd7efb4ddde4b3b7cb2b72ee954fd0c8f0ec8ca23a3e9a0877c569e2b68aa5e0b8f0b52f60ab3ab2ad3e106219f55468d90fdca236b2ce3a97196c509243eb946a6552451851c520790d40ad92bd7b869860bf842bfef05be6011dc1cf6d70d829bc317132af9a4331d4822378be00ab1e5cb431d72df5e10bc2dc19c4655dc2d91459e54865f3f43afbcd7d2ebb8e3f4f0fcbeef212d65be3ea9ec03f1674f2f35fe4aa734947ec242ca53e6949e43c44c83f609737afa1a4ba314523acd326529a63cf988793fc613e9c823e632f8ac5906e6343e2ca4f4ef74a4a1fbe574994b039f5e86b985c13e3ac7d011e6357d7ac9d2db7ed954ed615f4e8f294f9729fb65eb0b0c16523adec41216727a29e632a77f80bdcc0364febd4b8bcf6f7f011fbe9872ccc17725579234f57d2b3d9aa2a92fd494ca144a0a74322853284254b1519821c9df06ca85b7eebdf7c93db70120532846c6c860a65084b04215ba8ddb6f59b38abc140779efbd17542af9fee2d5eeb35eb6f4bcefdef7ecc3eddefb4aef2937eeb8d872efdebd555dd7955ea36e67ed8db4a0183102c58811284672baa4508ce4e4ae39681bab04d0543f07bd6102d29e17a37e6df4df2a6e092b400218d9661152aae32ec0872c2291bb14854e8053e42fdb9256218523729760f69e745ae42ec7cc21217709ca612776b955c9b7dcf2d511237769b240e42e59722791bbf4320d724843f0f34628473081636be7200c434e70c226b65ce1a6e05e30ee0656085c0db81a7036e06a40adb56175acab46b32cdaed2ee5ba4a6ba595564a69a5b4525ac5afd25a69a595525a29ad9456d007a22c5fade62383cd603fb7765b7bc9ead5b6f6de6de32af8d14a6bad95565a2bad95d6f1abe4472badb5565a69adb4565a479fe96bf966c04dc1c1b81b7036707135e05e5c144da4e0a2e05e1c141c1441845d6bc57589308402142e57a905611f4b85b66d0df39b4ca4b68142fd30265b2399c8c6a7c8bdc87a917b82acb87e87985c710b0a6aa35c9841c96eb0d6be01d65a6bed7dc25a6bc95888726106459fe4385128177aece8d1a8fef9dbb03516521b67157f43a328d0281ce80fb5922bf5e1c186480e436ea04067c3711cc7755d8a87eedb9b55f260731133e17e8417c21d7ce5bc872f201490dc69f6b008a45115c5fd07877f00e1b613a77af824c336829b31a9bc998ea4bd0179d29edfb20135a61cad3a4d3098ec8a87fae3ea5680ca210495dca700ca051828954d1cad05dd96446e264916cf63115d10757fa2b2fdaddf30ead49d2af91e5e7b0a4f33287ea655f58e6f71a6a266502e80be8148f2270ac5725bb2b09427ef5890227cf24eb392d64d1459be614a93c8847ca6818f0796a24ba65540410605fa8625e489aa443841921a85cad103b5a4964f3ae302c9ec4acdde549c6e135fd083c3cfcf93dcdfaefc004285cba9b17626078ae4386c796c9246edd81d8b6d9246b54d59cb53b1e5c176c7b33b9687da2496c7eeb4382524c7e24cf06353149f37f693dbeedc96dd996277664eaaf7643c82e31975461d1bfb496339ecca7ae34de18ce77dbcf7d13b6b8fce56723da14d551cb35b8d3abdecbd7fda4ecdd386518dea3ed3ad9c6ed9aeab1deda9b1629027207def7d0f77ddcadd41413031a98deede16b8b27d38a3a729b6f5b65d21cfeb6a2bfdd3354bc3cd4d391e9bba0269ed3d575bf1f2c9b5ce2d96633cb9bf3df1449828a7cfdea3abd3f7fdde6fd8c6fbbd4d67c9f7145aab2afe596f69b39ec9d04d3b2b6e5acf1ad53d6b1a0f69bb67f446ff70ac7caaef7c4ef5dd56cb5def8170c7364c2a0672dfe1d926b3a9de68b9b79edc5bcca628de78d0bc4d416f981bde5e36b5c572734490169ff6677b79b3b36756063d9b219141cf8a7065c369db8911521ca4cc43097124f75de831c3941768ec544335b93fbbd0c396d5554f71dd4932b36d272a6f77dbb6cfa01a857261e6525a7986806ad5ab9e2f3c57cff34c9e0ce579af46f9d00245b9407981ea71d69aa44911a694a7eab5eea597ae3898fa7bbb2f3d22a405204de495dc27cdbcf00426f7edc83d47ab6cc533395ea002b9cde4e8ba9f33332fe4187bd0fac2e52eb68ac338c70c1364d3f74cab785831a50034d54f00155774be33f446f7bb97288293258a800489dbdab4525bb7ad6dbf7fc9086d8f3b94f4ade8f53721f577c3a646d9ab48987ec5f76218db03d284c50321a438c8991eb4dc7721070c34ca0b3fdce4ca9a32c70e797a6d226b4b213921ae808217f9cc91433beea014e69a6c985e60dae205a62d68b6371b745b8ae23ccfa3a9de70a078ab78a651fd2190278de5385f684014ca832df269b22f2e87ecdfebd17c7ea8480f9fdefd5667ac8ab4f7bcae9bb39bada4f56e2d88d805c18e21367278503c2d87d8a855487baf4d2db3a9ae2941f6392464ff6c19a903111e46986c3b4b23fa594740662b3ea4657750b9814e4076b7271fdeae66db956459de1cb6e5380b2a3b8740173dec684804eae847ef428f76359325a53746216fec4133a8a459243ae80d042b2a2d0e52449de4412597c3d7f2bb392c3d60237f074b1f363e25dea9876f6c984cb6d7f4164eb640120b4550d0ec996ca05099cee09827694f99965c4374452dd541756cafdfa80eeef55c475554f5d97187fd4a0cd00b500b9415282930017a830395e6862a4421f725406ff4abc9be9a5ce82a47995b3413017a23875d49a052316810a090832a21f78370034df5ec0929329dd9a6ddf57a955b22a436b659a3ec7b7aecaa9a7d6b6b144e87bcd83382a49566c309d5917996e4202b2bf7121c14d0aa25343115c70e4c4d2a925e55994d7b39f4550754c776939516159394d593ec1d3c51b95b30f4ea33fd42ab40a7cfd1aad0e9c9dbd5785a632a4de5a938ec2dfee82fb5e0e072a2f16ed95565d528657ebb6a1e9b5a75ab063e3d8c4fafc4c7311807bbaa3e3c34f06982c1a7897cc127894dd634039f2692e57924196e1b5640dd69d5b980dcdd9e66de9e008aea50a0736501284a0179e391371940f84440ee6e4f1af2466b832a9ea1373ab12469aadb70c8db396c3b5c771a6577d0216f1bae495addea56b77c7c7c7c643299ac9ba00d45ee29b27d53d13cf4860542f3d42496d428eb84eae8ee9e19371cce664327b0636c30b002074b00c35a8f9af9b129ef0824cda71f39fd7a51ae5bcdcdca37fce97160f5c195d628f02cffee41419e95567daaf97d09992b9546815620491f3dac22e92316d5610fbefebc4d4075cc38f85ab3ab91cebc59a3c07bf93b42f2a0335efa366b55ed691438130f0484a915f1a905c86daaf4119f5a70bdf822fdf141c4227546d92610c78af20e9edeecd59e0c52532ca9c5cdea21832f954a5a374fde733c8f6576359284ab4fa3c08f70a581350abd01bea66b8d057bf42382a499e6f1a0d703099d6a10bd3e88e855844f66903e898b886f7cfa700c150bb9cb5afbca66d11be0bb5a770472fba986fa7e90fac6fd22e3eb83f48b88ef7ba56512028563d917cbfaa33390362b16cb6a86ef5733ace50f8e596bad51607d8756a494b6057da4afb44be80df05db6cba6c0d792d3214d8d02df61b251206704796fc3db8c74fc91933362f0dc7344dc3c36053e7c79fab852e7f45dec9d0c7ee181700fff3d0c2f621bf021ae3f3605de063c07d69a4d8166d89d07edd7b3d632786a03c442eceba6c3a91684053599d5ac5526dbbad3549da1a9ead158be33f9e21d7410f30e36f96e1bdec126df9e0b4413fd511db4a45d3821859819d624aca899612f9104ccdc41941d17fcd044672716860e94263d20821198e0318960c5156466f8d5bc9899d5080cb288417141154a40e123c50744c4e0083f37600dc2789917579811c46899a18807463cf163862c3b7859416686231b5a052498c0320bc0831f12a7842860e6c5370bc842ccdc702599208c9719d2d20c255e2ed3f61643fc80c7ac2a904941c71ce207495a4820e16386db1656d03143ce08193233ec84906304ccbc09f5749144113533fcbaa8d2c5cbbc0940cb069427bc7899612884235576cc5054410a66663842296206323304f508c16552295498c8cc903c02868e198ac45b76105f44d163b6eb0716bccc70c484292d332489b7ac41c8aed831c3927823fe6220e3cd769a84277258e34107619b1bf1e3bdcd4dcb175eb0cced3637e11330809922a68d009b9bef0456a0991b667292a113c2bdc3f9269c02899a7931130ee3cc106f499f4881082d336c6901421665cc4c5b91e08512570aca70f263d62154a0849a196ee22d2b0c9a80c48e19722f988266d229537e30a351a278f998408082143133048700851ff4a028d8b384292fd3d624ae30899937df137ccc4d095170c063de904c68e6fdb6d980e765de7c64c0cc8b841888c163de7c62f4bc3013e45efcc536550b2e90a063dadcc8ec98db6f4251d831ef452c621b7a451445b84cf123b6a9489600c48f29621bf137a0ceccbc1fb10d45821742c04c1b11df847acccd855c7ff32981655e4c03842862e6c5f7856dbe1e2a35261e1124354d631686e0b22c50c28ce39e2004cbbcf8be88d86167d021dbd75ade12440529764c9bfb9bae42851f9309781cf3b6f4fe9534d87b6559636d29c43bbd3456ce1c539baa38a6b5a5902bd99ee6d330b383cd23b899c8cd5d77d393bddb92da154704694fe47ae56df8b02b7ff4004f40823480338ca0c78f73487d65f0f6a15789b42dbdec8d3c4010571c7553404e8ce33ad2f3bcee2613a8223f0a82750685a2b24ad6f7eb25763d99d6f46dd2a88ee338ef9d579eb8dbe0982af29635399a204fcfe5b9bc23ad84aebc1d9aeaa13a44b9be9342e98a9ab5e6ce2f2113943a91fb63682753d1c3a2d85dc711c70c39f1b648eedc58c3676edb086225f75b796336853d8e7eb1dcaf5f88e33c8feb3ccef33a8f6b91f5a1b186cfbcb112c7f4460fdfd74965b1bb5304f7d37b2704b2da59aebf3b4690de7de11cb2fbb52449925d29099eee182a7802336b0f4718f131434fbc65fd020b3de8984f1083a592e9c86c5646d440c7bce924c844baa9a63802cbb42228de925a015bc28e49673a08e3c7a44368c968666d018f949949b128830634330c714680220a9ff0960ac889753e66570abaa01327df7b13ea31c726a21673610b9a793193930f9c41e22d6da88f12996973737f1333031ff3e29078cb9b999c22ec94348c2858a099a18845bca30214e165de743e266d049c241b1f42f7a72017dff4f07b1a2044c183326e581bbeb02b962a0541274ea66060c1729936ac94dbae05750d8116e0041bd44c5b76f65edc4de3f45585202b534f96fb4a53d60b0d357b8f4946d21849ad8fb52e58d7ea8c669a913d30938924375af81e82f45ecfd5c8b36bacbc037bf16c3e5ef771dff67dd8fbb7f96c9b8e89db5a9b4fabaee01fda46e55af1a9b5d65a6bb94977e4dc689b4fab3caf4f3e42d97ba866ef352b29813d919b95b0704b342dbeb21e9b6aef1bad5101a71da8a42c93a6a9a0864cd18c00000000c3130020301410098562d16038a08bcaec0314800d95ae4e7a561aa7491043c818420801000000000000000240d000f7a975f1ecc365b3a1d418e87be3b2ff676bb57a159c0d527a16b355916b6be1b82c7529a16e42e37a374dde9a508387c283942ffc3f425695acc825546e5f8e807ce6d06f20c5e41561993cc2f80044e395809ad31a7a259e145b776407fae05c7d2ac8b80141d6287fac1735cc06ecfcc7f055214dfbe810733c054a09e4b07d937285cd6581feb8947de3beba25ead8f2c02c601905e7eca45323fcbf008c236792b77f9e58a3b469d6e82cdeac44315da0f88ee1e7840ecaedbfdb3e1fc0eb1abab7f15ed7e634e93c4e1cdd1fa761fe4a63e2eb88fcca873b7dcd0d8d066f351547c006d2146cb09cac7d9ce1dd60838d394ce8bfd1edef808993b0812e1a36e0510452afab0dcf9f07567382466e9770332fe08d316c40f4eff9c3c2488ca1639fb9a4725c0b19c6141a29acbf71600dc3ee743d988a4255be90f3e9b4a496a3e7b89a5c2def67ad928a8a9660d54b2aa45702fc4c2a8ea8a7894857d73b7c48df6d4d105ce7b90e27a8a8f914eae6c3cd237c2cbfff5d035770fd59160daa5245871f2d472c5596dadb7bcc755fada132c7c860a088e42c51912b3eef1b1a681aa873e1fc567c39fad407ab67e87b3d2daf4caee6c7501d95dfb44e6cab4c5291ca56c9ece478adcc8fe2ad36d98bc77044b4a1f556059016b7522cab61b24d90810f86598c7a1934c4b99cab5439c81f5ede8f7ebdb86aef47e028bd7e1170b0ba39a1adc4ca09380bf5f76f3fb2f7f89e790b16988ccd4aa8c61e1ead3ec53644af2eaf9f30bda13caa5a2f1bb41f1f7ba77f3e009bbdee58ea1fbc51e85ce583d8161ac2d7933cd22fc2ed22553300ac54376a064735d711dc9e59b578701703b619cc2ee5cc57dedcdcd445d533fe0ed91c5558cad71fd4fbfc28bd0fe8c43f2caf28f15c05c5bf5c92ad3dcf916ea092372d6d97c224f2a8610d957595c6d24caaf405a3cc84c37c8257694ae55967939f347bdd419e06ef1811050b2b4439b17d6e1ea59d7243bb6798ed4a6fc0d68d8f2f8562b523284ac1a2524c0797d75d07b853ced0f2ec63bbe675bbf9f0096d92d98ff6b5fe7ad9a2f238cc1f0cb1fce1ef3a558e83f586b00f8fbdd6a05bafb54514a47a5628a2fafc79eb10f1eea959fd4bf31e7878bffd98e1444da1aad9ffe4a6d257dd96a36ec80dec17c86b6dbd27f489743fd44cc2c5f8b3c884f9f3dc05729feb6783965426a8896b2f2f7d901030e0fef4bc64a94d68a8252aa8c295db97c971235e811eab121c7263cb1e8b3d96ed3172d2aa26ab1173d79a9b159c5bf10d14fd41d8c74a95848d4b26762d42de5d36415c514a3863d79a4b2959c9fa3db4e648c867a9aa497b0bd0372ea56c5c36c2b7a29a1082bad6d53342bad6a777a16b4d672ec74060772554fd95bdc3861c39246223a49850d8c72d97616b09511a3896691fa953536b9c911b974d1f048e138f1bcf26bd50edf0a316bd3adbf7442c120dd74ae71ef0d7d234d68dfc54c696bbecef5213be2f639b6b3821deaff3bb71d8cbf8186f64ddbeaf5ee7eda7a87bf52d9205c266b4d7fb00bc4384703e4ebdcb1e389bd82a39e62c350749d093cad1ac7eef3ce9fb32ba8be09575bae97b01d7ebc5b0240019c927020856a9934c5d3ebd28cc5fa25a5a5f835ffd1c8a4f577faa8526e268a5b22e401294330cbddcc602e95dc8587eac1f68585616d2b448f9bb82755be2ab5777f1cbc7984ad1b63468a266c1fc5b82c195a0f4f93a805ae3ae8a37964409daca101464d5caef529357b3638c4eab247923a835abf327cd609bbc2d997c98c71c9ce7bc88d6dbcff09e39723ab4ced147e75c502faaf03cb07908790b55a709405c0d1c0fdc88a2925d05d30f17689143d39cb0db3cb92d8617458510fbc22678dd294af2aa288fe009f9060efba985b1da4fb7452bdb1b33b5c02611c9d9b445722e235f7d7446dab519245481fac2dccd387ef3117fb9badf54560007bf7b0b26cda15256aacb2afe0335b72fbcabe2770dc5aa12019128324f877dd81cabe8b6a1309232452d75f01838bcf8347c12f8da73196cf642ec0a127d5c41086a56b8ec6a0599b083e5452111694ee95de64872931564e596dbeb9bdfaea1be36f8a109ed0cd15e9d545a5b9b64259c268656c9c0b45d733df331dc773bf25f503f3f2a3ffec76170081ea21078669711727dba945597235d6966c0fba6fbc26f504cb296c94ac77ddfcfe9dda55e4b182fe9d060eea6fced98d6930d50bd17fc79d3e342a64b890c1b81804d54555f80da95f6a03f9df44f46427ad7ba6322069501d0a886dbbff444dbd578ec9347332f1dcf0dc6510b4572cd3a1e70e640ca55f50de4a172df68d01afecbce68771276be15bcdd711dba28ac8f74088bf5dcda4f0e219b189c0af43d9193460cc7b4845d5dff94e0d148cb62c855699adde08df722677169fe23219103a62c7f32076a20dc9bc6741e6b4825b7cc10aa1f2e44033ce9da338e55e72cb624949d95c6c64577c3f3ad6ed31b345e46e5dcf6f44b6018e03dc50c7476e700c139f6ad27b2155910c353e5ebe9f64116d75fbe80046f98d365172000a4ef67c7fc94e5810ce1e8951235c5790c4c8eaf442d2dd25b821536a13720230f7c15d470f884e89fd801af61d18a34eacb3a14127cae46c820d513fa710eedd790f3588e5a221b4dfc5bcf01f5c6956e1ca5f3f09e138d52e22e008f6dff83e8138736b2db3dd46e50ff38ca2690fceda2005c52b93b4946dffdcc980146c3ff6f1aa660672e66a00841d47a66884a92fd70541d2a796366de5ac776b64b11e43a3d8c36361aae8cd3619c9c4469ea448f9d06b06d40a0f929fa1fe599707231076fcd7c66b01d699e5c36259a798f37627b882875307400be0594668477a9be885f04be0273d23d7f9041261aed93a31ce038dc010a69e52b8c900a48e17f62e5f77c6e55b233f18615f0af89ed67661f0d69a48b2e803e28934dd57be19e8f1ec010620751fe9d5611ef140638a4ee8542410425008bf12a600294318ee806a4908e47d6bf254c52e88cb4a8b186dd4498a42e691db4fea6d1d39f30f17d3ac5b3e6396253f683ff018948577765cd220acd2cda34b031691db27449c74219092080f6f8f18a44cddb9077f4d20428228831a892221fed43880dec7d96de52754e88e21a79b9c155dda937167b15f14c7cb8a89d3e305e0dfb544618f1010c9b2adb2a9e3f2de8b7a260e9c95f07b36fdf084e8a5d9519938aee4919c8c7ca39578fac9ca1497ce964c639939ed567ad125e17a4d3df358698f1e695cda2e3620edab1f99a83f19f119a2e9c00a395f12c5ed4599dcecc8b483e836ea5514f70942e81306826fb31611d8e85b6481951706ab9d3d4a890b436e4a7a433c8dadf1dae815ccb17ddbe7330324da753d3c8d3d364e5dd0a41e3c864782378b857236e9f6d38eafca1f462536526826c878e8aa6e61dadc6234f4a82e78116808f6513ba763e84e8088b6115fa867c2023ac6f1ea0782584db9b1a7dee89bf3978f2ca5027ad4c8d67fd719abc27cd3e8e0405b1cca26edeaf818b169f4d22a19457320b09ebcbc32c9795b3b9f6b7f78ba843b56fbcc8264834c7697827a8901293a03883decee5794510f0785862ea3ace74013280a40e47a6f3bf096655a8998f011a7096dd5e4ab7eac72bbb8d5fe5ce68419f55b932328ecf27072dfbc847ae99aa6c6424389e66f62abe3f210f39d083076830e27e7d596ff81bbf72dd3168c5845d6dc4b701621851ecc7ad8b0d74bcfd7b2c01a223c0be1841dc3bf6173f9c9bed74d7f543be03361d4a7b219a6b02397977ca6e865c29d0e2093ac080ce5ed35827e44be7058d190ae84e09d9fd90282e5e2e3f74974b385e474d15abbb7850edde985f6c4959bbcbf7938e08466fc6cf99cb425d9d6662ed551b2247b7900a2c6e7add6801acfe9aa7be40a2a3d6619b5e359309bb0725e2f13b898896fab9888a11f4242c367a8ae11ac7acca5a8336a343d017c24f8c9de23ea3bb56b484f572f6a1c3a4f360688638660de022ea1a1fea26aa3b3f88deff9139721ae4a5879d111797d2ad7e0ced5a620231885711b3edb5b7774b184b7c1d5f54ad4f3d2bccd5835481509fdee2160e328d1d86cb1df1fd70e47b7dcf05c7693956d3865865b7389a4adef6ef4f3fecbf2fa7a1b602f8d72606c4dddb0cd509a1178aa3bed1fff8258cf9537f4ab3a2a6db9087ed3a745e704a891a9b5f45e7ebf977912866b8ff2cfcaa2836ea40f4a4d69ac598490d5c19eca4bc697ded443564ee7462d5e59c3d3113dea99fed7aafec4f565b3354b027f14ecebbd8ed9464f9648e1563a743490cd05f994787c5e47007ca6dbae6b58366cf04dc13e6211256adf17284d097dbcf810dd171bd7b923ec052c81c3c8dcfeafb27d4e60530e2c1124d555e145b4d52facc62040ca3edc7d58dc35b72644e0886fded67c7dafd09399fef011645b5ed008c89a2ec77c5fa84395cac772b6685ab65ff5e108a7a5ed261f505e67a7837737637a8e7a01fc2712ab021de2a43ff2b93974d8df894ce336ecaafa91d2e8b5ce4d3143557093ed02ab5781c4ddb7e2d2545b9f429006e5ae792a85a6c64e6bae80163765232c284d7defe346d5a36700ae13a60edba2f23b9df8f4b835d9ef2ad679b94ddffca1ab0236c889bcad96a5453cf19c046e450b05a461253f3cc13cf192c7c0d539b2b11a28bb8e0dd25d40fb05fc4269883e50857e4cfb78f54fdcb2373798f33ef9573d8b17b3203c6228d8ebc10c5dae270d9f5053234be076f7c0c35aa267c8e57d2c09f5b9d394ecf4ec7304e8e3db93af883741072f815055082406cbbcf3d7412d7c1f369e7a961fdcc61eae9e2383bb5937bfe11c673f244acc69cf4b8353c4b5ba971359a472e5d8eb852c46455a0200f79a5839f434d10d4a5972a1e157b473ec4fc3fb1754f9fe3be8831262477a409044ff6db9e3ba230229119869a5df46a7ed81fd4ded130c028cba8df8efcc226625e9bcba3e24a84e56ef2ccf0d03b70af361d97e5c0954131d54f312d41a610d7ff15933a83bc063e098bece534fa1e14129b7985f67e99bb4621157b7af287662428e4b6f74961605be3bf44ddf240ace5b59862cad33e432fe8fd51bbc422064b2e42000f84831914375f855e0e7f22308d5c1a7edc82e3e423a7259d02baeacd1f7649308a54748039d691ee49cc3b0ce86762c66b569aa1198370e468e92a0b3efe8703f6a1ecb07a7dedd4da218e8636521d7eedd48aca6a7f3bf9204a5f836a13cec04b071495270c155fca0fb6b6265ff395c14021ee3d6d78e1a98500c9039670116a087a77c9088307c8dabcd30bbdd4880da3d4b987193b7b64804786d8a3c3cdc77c3916b15c796b68f61d4358af4d71c3410d684cffa480473eac59c45bd2cb4fed73b6822089fc94ffa335a12d67c8d998c1a4d6fef52d8dfddd84364944f3064a739ccd040ba09d34c3bccf19700f27599f03927960cf9df4a6a1b8cb46b7e27c76c50d2b059c41448324dc051211addd51a9a7366b0ca5f53f587cb2e0a4a964f135deb89144e83d7e3f553ac1342ce9ad2c52dc26610f78c03c332836b4f59a75242c399548a28da8c59c691ae6693abce577a1917aaa83f8512d8b1cbb523bcca7e3f718da81d68ab60e913134a8b4cb7f6175a19913bdc42054315094e270edf962c3e8f4e3fd70ad172d3ae64cea499f86ad183ec5030f7861c32b3ee9a3a2aa1ed539d43cfd2b3abc4765dc83314a1b354a9a308a905c44de45ddf534d1a33b9a6fb200736534430b25270cd39800357207e7051f1615c08a5a0148db9b9974f2cd0a2e6bb1db12285146cb7f14f1296608cb8d97628a75436cd4d64be6a03f4876fb99feba17bd5f6e0bd86a1a70174ef9bc289c34239f2cc22b5177e52cc76890ebb9c5092d17586e9d5489ee16a217dda18a827f11a9dc0a545791cc0944ed22a3c2529fec1464e93a3721e30e90dec950410176dd989b3469c2b11700fa5d416857c512b18063dfd7190ff46ed2a05d0fccae495ddfdac8ee3516c0d0aba5abeefc2f84b0b8e179d713b39ad8b3a6322c8709dd38454ff10a32a0405981b9ca8d05bdc9d78445862c83e69ad69c4abb5c14b3dfe925c3ecbf75e187d356891fd0dbe3e77946bb94e5bde829e03de588931f88601be1ff958ca21e261d511b95097834120c69c24ac2a248580a28629ea55916263e62b87d55f40aa50715312ff044bbcbc016208a496d78fe1f3503e6631673a98572f252043870b928796c8e3eb4e69b8736571a5b1c1578817dc89fb4d4b44d8e4059b74da9bdb098ade0730516796639a2d968a49b214b1c0c79bd3cfa9e09586149227d990de1a569514a946ef8657bbcd7379a65c8b8f52061cc493518ef52e41c836a50c93ecf28abea6fd216e83d772cf92f23a4c1d7775dd431b6906cb5cdaaa4f578f83888889a7ced09aa9e0b9e846741fbc743b605004ac36197c231435eeecf82fa0df5b08b3091e5e10cf1154decfd6318f61244591e209a9a418382c481d2989e5c6fa9c19d024456f11b866cb9f3c71ec74e859f4844b841c5a4319b4a16a2aefbe8508cdb591df691be674d9e191feaddf587a572f3e81bd7630f0d43713d62510cfed94beb8f8f5fc51bdcc310f092fca35615e363b22d126720eca539aee27788711e3a6fe63e7950ffa09903214ad85314b52e49dd9593da5e4e26dbc78e94fa448b951f3398a0fd2522b7b79f4291bac4203802f8d3a23c801a983999222d99bced9d8d91e0c3be7a78795b6db590cb5af4bbe006f7a9bbf4cf617b19b6c2a47bbce12b66d78dc1d5bbf4b841632b0aa3304a8baf4ba1850a10b4b00722ff7b9045c8103a729ee9c9c962becfba199f2dacb09a2db9611100f0d9923b6cded354a617bd9ad8603c5e0df0f01c7a7e9d9e1ef20322f941a5d801c9ce5a85583e119faaf944eda3062d656d2ce300167bd46aeb6c7d03146a24c609c074aed6435ae9dcd6c3e57f7f06ceb0f0cf14a5b236ead36e3af0ff762560247aa0cddff978221d485ebc368d0ab7ab8240a2575a1104c277d745908943c95c364f672b6015008f466f5a5f028fcfa5ebfbc5e7121f8313d335be5e81d6eed6c1b9b14d739908c85e26218d7d1f23bddd9d4b0fdbbd8acf2d26fa0b537f424463796220f014e8f080ff69a0b23dde8eb5646e3043e7271ee868644513a10fcd8ff5132b1c3ff67ef970eb9d45105cd088ec5d299331ccec58068881dfddfdefcd472d47f908b9d1e5633aee4d3482fee2116d2de01b4a25c203e6bb9a634c0dcdbb8f28358b9cf06c0c5e6c4043a2678ab6390ba77e36b786fba2b994713d08d30891a62cf96274228c66f4e98addedd8511551327631f59410fe45972e48f75350e1b95bed3ead1195f5a9db7a06ba95e259b69babf02b36800a6746162603ddc7fb839813c3af20c5f40758cdb407b77e15ff812d5c1950b8477210d5d1c7d165a1bb816a3e3a3da6d75b9665b7a25b73ca9e2d6ad7878845fdb717e3b11f4daf7d1d05d3262f4cc8f248ec5cec38ac3970d8ce6265d4dacc993e78b691a69acd1279c21ea8e343600cd67d1153525cb261ce722a74762d1b63291fcbb89131b7db499276d0ac14213bc1109fb5c182936d78205af74b1ac69533d9482d5a8f42d309aed297aa37bdb4b1e5606b433ccfafe023a9538ad6f7f9af802b08c7060044d1c5cbd9fe64a589452b6db525df33826e3ab78f3e8b7912f1886c93729ac6f6032d4b84fa77cb34392f7a8446430f6d2d8c662343c1ed727262c63204a38941dee6575fcb2ebfb94335cbb04a6f225b6facea5d6b6ed3517d8d2b216a5cfe29d3ba32c3625bb1f85c2cd8c558facf4e3bbb7521d8c176b13fffda9c9fa5d47efac5a20af7c38366b2993349b2cba9288d375461c2d61100d7a95ec70957b774d21a81bc025d3a779938201f1ba52b91299c87ba6a633fada7993acb585a57802084e78083c3f4d96e91dfec9dc2d961eec1c8d9658c9d3d66199c1e447830090e06c23513eef8b8d924b7db917296e67d7bc6717c7c5ed860a2aa9c8c8268ff7fb3228062d38662b7621c605ae8803d168a569863f42c92d421fa54b1978d4552293335e3199d7729af9054454403ae8bd6339f7ba81c9514bfb7f88229c76e380601c1dcf23e04d9f62a9f06b582b106f060dadabbbcb70d23581ee5909978ab1350d42ea25e8a345206140888b65270c72ea73d601a81aaa6e6823382dae9320008e758a97cb7f0f282ae4b2430ccebca78a377d207c4d96ab112a678ff1eca86d1e445312009071a7c0219d969e688bce4abf33ba629ef8ab6255b819573c4f8c7e89c1fea41bd6059eeec29c694d39d35b7362cdc081430baf7b1a791b2e35f0fccf15947b6e3abc68da1e7ed5f39d944897f198a5b370339ed707e5a46b99d03c106e847bafa7b7b7390ed4cde937cce407f2410f701fb595604a8cbc9bb19a4b55b6735aaf26e554e56da21f5fbdf3930e7533d100d108607b2861091c4588ab3866fdec0eddc41c00947d6ce1b23dd113a07a20de1f2fdaeb36614812bc5b98d0208aa486af7111f40313f62533f7b4a31237f2315a83c734bbaf7163a0167876cbab215293ca997960bea9d82e91e44fc5699dc8be73dffbe086277af735366b88f96b61bb0efd91f06ce93ee24c439c06281df8ef9be8ad58c1e9b9a308a688521803bd25d4d155bd963eba374912aabb661ddb1540708d5e1b6a2b3f1982730ea302bf455d5b5b6f3ea864d5a3e09adc2c2dac9a8d63f9e20171b423a5e28116386f0c732d2a1ad2f0450260e30711a379cbdd9580fc4bb3adc46f2c854c3028cb2b56ae5509488e78e68ba063ef3f66c8e30a1d29e476503d5d4b50ea1e01b0c8f9a49bd1628367ca3fe4d6c071667620b5830f8146cb18cbba84d191abe45b977bba22d61c30885f3f70cc5bf79aea404184474638020e9a9a10932d7f042c4847a899609f76d925024ab2b35e977ac488cd0d9cd94b241aa6fb6992df92e256d727459e0ba44c187a4ec75a96565c0383dc94904c3eecd04d761484f4fc1409e06cb9cb766801e8b5ddcf895cb5459ce2d6c6a3db9d2de516d9e40a3b66b0980d1056a93e39727b78476eb5bb0a8e3a9757c566e6954e92905e70915b14de48c4e532380298bc60cbe3763c595763f38c75be1cd012cb1fcce48883a4682a8f348f8904199e7a789b4a3ab674388defcf957dd9632ebf29eec4fa80f44481d103e032fac7c6c9cdf24eb10acf81dd83f071eb172fe2b72153591c558ebf7435c174a2ac0fdb960d69373f4ea41551865887a62bc1eefe32b8864a86a116243159a741482f7ef7a285b1450db158df3a15bf800f6d199e7a44939fc549947ca90710e3b678b12cce2b7c7cd0913054685108e10cee525c42a10b3b6b1583d41f1b109a2dc5293f5b0ce3389a51ffaaf12eb53208cd285b9109c34997db8c7996ec2c61169811c1cba35539626b420ff540f5537349da2d9d2ae2b0197aa2a8f0020a51ae9bd3349d1fc2764da04e39bf82260cbff9410361249b7f8b4bd168ba59d16937bfb6a834fa0d92e27dc3ed751287ea8f49a89ce8f429210449b4bb507fc738983dcfed67b11e32288511b4cd87f08a2b9ded83d2d537539b5034d25ab61e17060d09b30dcfb57d9aa6228eae8d68972bed4abbaa29d51bd8cb0eb73cfc29a9a0b0a3a80e6d61ca17ed4fd80651a8ccf85111d50e44be1bb13045e1eda4cd4f4f156035a0b3a0062adebc53697e49a4628a6822015faf1d1c7d4820d60535b7081d2c9461a72bc42ba4a3332a558e5991886ae04ce51399d37aaeaeb134971479f434a5f91f2b7fe25ad31aa135fa448c2c4c7e60d3a6f1b38d4ec0f30ee5ba974a2ab39c3f1690872ab7b30c46603f1eee95267af0654960a89741109d9bf10a6236747762d74c566b42b78a249317cedbaad3824d2b0ac0cc87016b867cf322016df44085a2be8b38af11991bddada6f1ca2fb78ee1626e7fb2e019108430400c5136ef07e902cd994f8d9d87a18cd3d409ccd4491e127621ddf589af4ae6b0cc3a6c8ebeb30b0961b51bac4b7fb713fa6dacb392b8c8e3c7c71e86e2c81996962ea607e8a8b4781625d82afc18ad45a7800fcffb970a3ed68a100b9d1fa9aa9cde48c20c8073eb93bb97d3a9c744e3a8c07565723711ea4ef61631b1582b5b9dbfe0be3bf4300124bd5fdbb2515e7ae0329a9a2bbd223d188c46f3accdac86928eafa47c2a356a4716bba7b5b35d3b8980aae7cf257d248d4ba466578053a1bd46adc924b549ad14e22ae36e159979eec148157a0fb60306ac03745c8b8a70de5005c2c50a0869c93bda05a0e17163a44509541f02061536b6015fad7050060dfd92598a117351da460e5706d764280f81f56be12339ece7209daef937e81f7cb9a3a218e63a99c3b7a5283f86bb65c73997f96a2aa0205d78dec63e21870503bc3c0291fe8a2da5898d7878a4a93bd8b0d5de9142a51fd341c16231e5696c57979d704896faf7cfc0bddd5b9b4098c1fabbe6dbffb97e4c49ec65e7606bf51152cfa0b1e8e0be738194c2d92969988aa55139509f3f3d5410ae009924c66319a19d90c9bb853149665e5fc5fd9d9186ec9e670c1db86e7dd5798020d8d45437dcd975b42f541cd462fa5f6e439a968271322036085f2ee3bb1529655997c47d0d629d4081ed7c6c8401dba66c498c4fdedaf126cecb71f86ba1b8a9b4510d8b8cf30f086b20f637472874800e05a52a6c966c27b8273f8686c3b28f81b0467c83781a929284e5dc6bbaba6b2d8ed2e8bb07fae8625f67d1ced08d7881f877e35030429c2514ab96c5622be194600a3795af496c068851caf56340d875f3224aeb499a7b783307484a87e89fdea483bb95d6d7bdd8399ec0a1b47425b9b29d8bedb016788cf8f9578c0a517f3b8faba8d8a0df4c9fdd8df111447c4408b661255d0cde50223a36d082f4a8a7446c2f38721535abd6c6945090c6c56d3618351fcd681b1225259da63c58d2e5b0b96142cb254ee48efeaaf6d8f2cbbd6cec19ab209d590104bd1b12bc65319bf0f73dda257f1569c5c273511c42e4a3a923bc5a0f64243d704d839ca56b448406822fc28f9b1fb47f1033f9258ef5f053a7dcb83e7f64f18f6277995afb2995f7810cadfd92a16f2bf589a3481217aac4ca8b750d926afed169206c949cd9cd5244ca6878ada7e18458e371b1867dac803ae78306a7a4ab7dd9569dc33626de29ae06d87b323d7ad116ae1898f31863ba6f683cc8b9d0ef316d2498709f39717f2dfb0d154d340d660473f2ff3b57754f8a1476b1d2b6802b30fc60b1d4881463446ddb56ffe8991139e03d3cb854a6a91a1e9f1ba9607890efcad88aa25dc11bd8738a1cff2072da9fc2ca519319e8a11efdade016d3c46b2c91437fadfce92cd965650dfdfe9353b494133fb8f694ca1b06a84ac42c47bc8de842916d2aa924fb532ae7b1b66b8917caac9b189b6e0690e2e30dfd2b278b3fd3ba456f4eb6a39d38c6931ccff416b51967fba3a4281207b9afdb73e1200750d0e68d61aac3dec885f02dce2e05456541d296eacfd0c8de65effed5d0ad28504f97aef5fb1a03dc40345f3d88c4e6cd313acb21e5f6d3310d939c1f873d53547b99db198dc1b0e93d9119ac6f65df1ae819d9bc042de48246707bdb16cafb7f7de92f49e24542ca81d802bceb297230fddfbf3cd7e7021d7b7ce41b29544a33c592db10d9a10abaa50214e954a2064ee88ecbf1e3f63f918896fb4aee521fd222fa5ba513b59817aa05a93272e69ff648913122d5e17ca227d6e63928cffc4ea194f0c48d454a485dd6689c84b8f3ca83af32e177950f481f8eacbefd4cbe1c39fec2c208dd354bacbd9f702abd04815fe26868d00344cd52ad64fa4e9339663914c7a0e2722d697ec94004e6a8dc0cdf72e4c8d3e0827385ac05f660b6c16aade2c038c9d90f299e71e91f53f15fdbfa989b781c904a74590a03544f7e719a4c255d60056de70f8d5b5722afda5455e000ec965fc02a7fee20c417da3c6972d938bd790b1cf677c2c034d048ffae057bd5f1da29d0c0c845a0969182960a4c6ce39672821d007fc0b2ad79ee4cc1c0daaee4b6bf4bfcce3f84b86b7e52ffd913c46585572bc874c648528755d410d86d02070a204540708ea3bbd5f0f83e20d4f0908075d02ea75af132a492237b820eaaa127f445df2af45823eee084460493e2670601e5c24564916e0f824f37e49c8267c5cca9433aec94ae630eb684944161dabb137c016c979072a21039cb6be08b4112853b4bbf549025955fcdf3d892081ccbd3f602e8600141db59a69323b4bf0ca2fa85b462768a4651c5001e81c5470c0643db3040b38bd0a55fff27c86185786a4499ac81f35695c4a74aa0c0c4bf77a8f33352dbbc33c6ec93253740a97c21f82278c87268de28e2ea5e2f82cc191a709e953c0898f2bf60873905082e30b85eacd25ac2724910070a72b256a62adfca0657514e365c62b526ebec2414829c6e31ec6847561a5a7416fff9c80f2c887776da443d418845ac7755535bc285ebdd321fc0455bf5e6d0292ff0a4f408336005b66d83d1793de3ebb596dc9f775568812cc777f2d267dfb5ca7da978fcdf412e6ec7c20e5ff4a83574f85e68498b0b8922b806c7562d8a676fd50d80895f5182008301bf92f617c20865bd4b7043ae85dc3f9a85fc2f6c9fd68374025dadc037f405444aefc78b6a1ab15da3c49701b9d026e0b4587249c03ffaa2b27a196361eeb8079cb90ece846213363db03f220dc7d541265c3fd9bb7e8204d01b6285832023846db285077ca203fc842ef82ca98b519e2481e37d89901edd786b4cdfa95c5c440b2bcef325dec462838cc0f9fc95a638fc04175586ae07d0c37ca322b92e8f0ac1c3d294c693255beed8f5e35836916d6f603bfaee3d7b8fe23393180ec95d4362a928b056065ae4b17afa81657a2e345ff6ea2affa8977b0a00a1436d568cbf43741097085ced91fa390c2e3c0155b1d72b0a7b0f2e43af4db43ce49854816cff28f9c997bc8610242a81ac41f98bdd607261e831540d8373215d659fd40be08efd6365351a485f07f7fcd5d75c28205421827baade14f395b68a856c605dcd223ad3a8faec27526212779a55c70565e8e635a46236da95ab33ac165dc65a507b6cbd8fd8f29e07be5f62149ef2a20c5e867120d167ae288e72faed4a78961e8d4726c3f505f26e0d843a9a442c31c2a44b25758f9a4b333c0f9c6cf17f463ad1375659e3d89d8b2e42db819075bd7891db4e69707e55b50dfc57e2341c909486aeec7ff032538613403769e5ed720d356d38c66f44dd800b87f602aacead36403682928915fcf38d1d4a74a4c256c2ff57c83abc5893887a953880527f1eaca4d31058644fe52c2e387345eb95b8fabcba070fd931bc67047d4a1cb288e7a467f7a7b4e7388401ab85755cc15565120dd014a877de189d20cfa44383aeeb2c583c586eb1207960df4a2fd5244b906d564790a16487acaa639d6430972de7e147eace058c75d05ff4ca77ced5083d9673daf69b145d872353e404e8c483ac22fd56abd266ee7af2752647fe6b42415208ef5475788d5962e6ee0b1eff88ce685debbb67c30a5b7edc31227eae6d96cc9af1645cc62281effd844ca917186d5caaaf039c688be61a555d2035f449881e26d309f68136967ab17fece95e2fd5d7bd4aa18c69dbe4860655d709befae3e3b0ee14dc9dc1ac03625c906775386d8977122e7d0b26d62c9fcac768cc47a6da43c172b030b7339f567ede09786a82dab563306342ecc2d4a73a942e4e0e9ebf1a695eb68453e36484014d0ad580cc19b3a1c989ca0b3bebae8d15be4392eca35239a6322a9fb23cb4dfa810f0ae32259e64cc8e8884a7e4ee4fa60d8450610f48d09c4a347cec2460acbc37f5a412b8107003f833c405ad26c36d6ddc33671d9e665283a7109acd8e70774e60cbea65aee910b4987dfcafcab264854438d9af1dcaa6c60da106e4b8c2106e566edf04bfdb1a5fc5473e80f3d5e9b03c0a6c2b7631493010a9e37717b5e24e5c948505919da928bfc393d32a37921059341070868bb90476d9ff0e225c8be837065f01875f30a73dde51f1c1341a90f00258b0e1b489f4e317d268af86590cf13db9124d54efdc376821fcf2129ca7f2119aa321467a0d3915621786e71efe284f203767968c7793e0c3d7c5839e8ee1dfdb26b1be93af21dfbb7f43e2b232658cb1e19429b43940851ec020a03f5e0a54f347de7ef798d7c3a61ce553c2056935dcf15d5d292ad829576af84e082e673f9c5a76cf3a72f984296e5574617ef906bd4b2f310c46e04f2eba41da8da9dcd5441cd646867a26dd4601effd18d4ea44cf96c80377664b0fd7984a9f1bf23dc603fcda19b0fec2cafc67dcc19027262b1f25bffb7dd57c9400af2184b4ce489749feb202cabe2874affcf89a973c80c85c57db5c5193e4e0f56c8af6beb1d435d410c9e857687c9441c095b47b670c57487624182f89b88411d92391dac38a61da44023d670ee99cb8d3c92332035c97827b2243f2349dc5da26c5d8047e5887b1e94b21af9580a0e9623081c1b5b662736df4f9da12cac74de78682e4942da67de90b7111c66b1fdaa80091a19b6a32f4229e156028faf46322bf59ea8290f52b023f3ab47712e542871136c708952cfe5554993dd92dd76bbbca317092e21b0aea72f565b2ab4c933abff053055853733f64befba3bc189133aaa90f4360a91f1bb2191fb1aab655416b2f8aead6f51e7383845b65662e8e606710e1f256a63430b36c4f90d8b723c72a949e11a01992e8cb431b482cc1c450bef33806b2771a10b6674e154d93a9ac5be5fd46d239486192d7e0d15c7a56f166de14115ee97773ff29b2832c55a8c980dcc15e65755eb145c0d656f39688f561f5bda780592ffabfb3e4f6d3dd874714523d94773ae879fdb841174927340eef4b681f1399698250461b6fd9881a66f6fb30551afb3c35cac596e95f767ab260289b9d2534c38e09dc147182f33472137967664a241769c9e20dae4f935cad54a3015b174613d30928914ca8bee7972e3d8efed0716b47164dc95a4b3e6cc1a51f773dd20325fdabbd9452bacc5ce030a13a1d20d24938d34a371194c50cf6e1b4125cd12e41f5d324cb817a84426b141ddf4119f4033162a3f199812f265c0b11e7f5e3dd4fa43d38e4ddf4182168a7b0f9302d8fc18fd6046b9980dbcebe219ed38da2411f49df5ea67100a09e5b41bb9d3a23a4234a6efc26745d32486bd7ed1377203d53b9e4641d89b297805e95ec6e10c27cc4c9b023336f42142c2206998edf8a733235ed410e13d287bc84f138dc9dc09976489c624c2f46b723903cf15dc878821817db89fe17d2288dbd68852039fd223594c2368aca854a01cde024aa8013b9f82d6307e9bea766e3d2b4a79f91f538bb7ed8b2dd62db190ddc0359afcaba6ccbe71c56d67d4b8a32ac03f5355435d74b097ad7cc8b97470371a887176829b3b85b1b2f8a3730a99bda517adf7b4469e46869a6232c98fe58baf8ca1a0bee9ca7b84b5a77a8badb83112f541fd57050e537d439182d5c171bacb99af60b15498d3f21761a23c443772b7997666159b872b76dd2587532a0e185604e3c50e89b0ba8854fe8343c1181f29a6be4def67a704364491306cc207c4e0b998150761fb3d10633a142d0d0c1579662869ba2cc061117334c34b8ea47910c259b1aa9fb3552158d835a46f6530c0fa01de51fc5dc855f5d8435b11afaf785d52b7a6398253614351c0659b1a07275767419655297fb1218ff9cc9376d976c96549856d1005f5364843dc0c42a9a2a3d78c54506e6e46799f688d9fa2e528aa1bcab20ea229f1d728291045e99955b724cb01164de95603d480ddf2c59d8f8dfc93ebb20a9b996086c8ba1dcb3da9e9b3721c292ac2cb6604bbe7eedf68685172895647805f6d2e06ff23ecd9f0e2615663175759b59bc62cf1ec40bd75f14d03ab2bf9a0c6967dfcb49357a9c5ed82d03de6b902a084350c0d04bc9820f7eb2499e08d4bcba15536b8eb51a32a75d225473197ed3ae3aa4d446cbfa7f7dc7e6da66364336492efe646cdce25b4fc09a4c0dd186ffa9bbe3662f72a826b541b35f17668fdf34b2f095629d0b292c3b508ce45a80de3e3e7da3dc8e4633046ceba69c5c2f1cb70cd9d2631deefaac278aa300b0663935cc74c491a12c92680c66846f5c4a1558d02f7c3536f148bf309268ca37bdfa6ecdc9c16cbff0fba9664275b7e50ebd0038895bbd28d6453a4b20780fb3a0b5a116253722558d7f2e3bf17fe38ff2240beb2228c9cc207633c1b8f78f9c3bfaf480d2943fe75d0fa67370345295c7863572eba5877d01feece2ba2245ff8d708ac3a2077c75fdc4b84d54a0e11a52ecc01a9c06a236d8c89526555d37062c09ee0b5cf38e851b96272af69f5b0db706e307ed1064208509d72ab8747cb2cf0bab09b830a9e27a323ee213883b358a30cb4ca24505a2e1c67522bfb827db8803745c2bb5327ed84cc7e63204e9c229298b0a6a6c756a4cfea5333a2d3cb839cedce487780ea98291116a1e31e2900483568a7b2d0f0623746ef5528d5e25329c84000f05e20dbf08bb5e36b94bdf08be1ae940ec406ee9e13fc227af5fa04e5860ec2658f1d08b44241ac4f4befdb8afe86ab18626fa8e1afe2c1e144cd90706b01c7796fa392cdf6163834285115619c48528a3a19e56bade1b4b115fa103aa2325e4050bf7f3fd11f081677a486f733c3cbe540896d035788f6849e5e78f421d4c6b1264651c8e4a42253ccbc7abec426dab17ed8c6f876b1427fbe8989b6b8b45b7134d038a935b13015131132774e78c7333122e03beac278d0a874b810045ca2101c99b0a81495e3025f0b84babf2156c4be334b99e0406f5f229b49715d6c0ca8de9f8bbbbe3b66735a63d54ddc41c15b7de254a1bd0255115949d30fed55bef79b81c2cf383ea415b4091cefd4387eee09b3931ba561d70ea2fa37fbbeddf3e258c45db861b05c0c60ff3011315b284ef4d52a578a126e2660a067fce79e4fdd9b019b4a3398eadd8cd958461e3fa3860c397c805ac543b9d59287b952a98d5135c3f98cafabd2e2ba56c198fe30497f1492149d73cb81ca62af1f5b9b2cbb5da673f2ac71552afb60707692e0d3668b6dd1d13147c09d344e36c8e01bef3ede50ce3d9040e407198c49922a75cf26ef7ab44ad25d60b692c4980ce986aec1062995d48129f56c640e41e2fecd789ea105bde9b5cfca6d930b49a23e484dcf90b8a4a342a1d52190306c90c16a8cc8594142a74a90062db86dd056e1511a6f0dda7e3f0062c083226c18f19225908999252854f2bb111eef6b722e24a504ff57be9a8f007e2d000580628437d5b486296b0af69eb32f919bcc329cdca43106ca4f0610523f67c7e38fa2c611e0d28afd87e4a58c231a53e04ab87f6dc9a78f50b09b48117b79f804c6631f1ce780c5baca9696cfb8beb26991878292ec740ee095d89e461eee01f2d090d89c5f52a354a40110d2a6028fd29254620d5882ecdbaaf7401205313b17c923d9763f75ad57a3316f9b632105e14a0dd1c7be81f6f507a22585269bb0d1c82b74900e8b057d4e621b03604f5210ab01cb269522db7fa49c8a1ac17e5713d061460a917f586d830550e2c4afc19bd4aa532e21a358175dff6ac9199598c68d9f27d98b07cf98e267a3918aedd7fe953c9d6c26fe1907d9ad3bc35b984f2a9332a6d8dbfb614ba69d0359e38672c2200692251797a061e332721beb87cfe7741c4ba282b59655570a85932e3c0db4abacced47015642198109a39da58d9a14d833c6652f10e11961d5bd36ce87748f70eaf2ffa746300c3ed574a5778b72a3ccc6dc8c7d31ed2d41ee8a5b02df88a7b0ca0b82271c69a4050a862f378306b0e093be3e374111026b26524b9ff6bd2d80a3a32176b0c1e82d5362eb637acd40d6fa69a8adee0f70081d200ae580c054d907820b0210a47279df77e72ac55506cba2f006feea8098ac4dd4d6ec79df0ffc7d3366b82196fbc95ee971a52d17d3e6a45dffa4fd29996f5c4b2ae17839db4d3615bd773ffa721ee0912eaf165bffa83ca0723e9e90d42554881ec0ccb4fe5de60991f4d8da465f2776a9893d0b3345665e0e708e88684cc4f4f4843e41218e44e9bd6b63296917bec88923952a5aade34e3987253108d6e6b6bcfc0dc2f8f56c6c6b48fb40dfddff6193f7b7af60326553a2e8837f8e9e245940efa1f694f89334e62e7e6df8b256ea1440f63ba39a20a4612cb323040585c7379f0f9f9d0aa2b3f910dfe6223f36bdad9f4550c7f152187fd844d5121d6c10a66190e5cae798ca330bbd094fcf00a0cbd38ad237d3675499d4251480af84a1f55b47cc156b55b8b4c63035ddfcfc5fff5c403274af090c121dffc852df5d8d518f5f561048c71591f928459ca359b288a27a7df9ab4237b0ffce7d52b796719561cd5e5dd4167003d7862c3fe5eb1bff619babefe62d3b7743ff71719b7369b67116a43ee61f0ca2988b52f6a3596c3f999929a71de1aa614157c8507a811da28cdd8625022bc8e3d61903537c474177f4ebedd2abb38a1a6514ff6b1da8cd88aeb6985d37445a1ac7ed1405c33e1a8a3b3ef163a8d6468c081f5237b3947cf06675f2acd059a3ff1aa8c96352da0d4173cd3b635d52cb5a03ec7a41d10424923a7e61238654b32fa4323b2d2a9ef97dd1202cd9c02b05f8ddd93496babdc1bf647300c4d91c737320611fb0d3852844efd97fbb2bb6e61b0a5b7fd03336c52aaec4ee0fe162c16a0a2816cca4684fb56fa638c3b4b4dc2fc1b95ddbf0e3dc308d0c69aa8697d53c8e1dffdbe4f7c57e8c2d0bff24af91a7068e777437bd87cef99b2ce7fd49ca12770c86f8b96e72f626d2983bf5f2d072c5ba9bc2f175a1d3b2dd4841a2fc380238b593d819a9f3517c68c889bc559965a12408abe2609a2af9e9f206fd0a6d772dc0db63e70abf96f3f2d04e406c0e8431cd69d6600c8599d05c0c3c7aa2eb1a05a73c33fc55ade9df2fa8fe303ef92548653b91ac771e4b0f78d005a1248f0a40f1a226a0b7502c554eb21edfffa7d0d52c679d12eb07569f4eb290629ff6cf6cb3048d8eb5f9a55cf4a4735c8d1065e5ab5ed3a957e9fd25f4f07268468ebf54fc9b412a96159fc9f6d78fa8f5c3dba26f4248cce9299053ad2c35dd60a1ffa3338a1f9807f182781510f815e38da2f435c187ec0c8e9486fde0dba6a5589178941cbbc19fe6e2a4b95d4e597ad5903413e3755611c32019eb9de5f6ea7f89d1be93ba6f30527abacc9c48984f262e8173ac31ca732ed00b156c78837d1addf6c0a5908302e5fd15cc3ff175067081dc89c5c3a5318cbbaacb9bde0ba78cd258d4233b3e0a5412d38f3c56e91ed08a78609debfc46c049708397bfebbbe4df9fa47c50608303b19e226ffca76454b6081d1950e33f3d3d901104ffbb37733a216b4be6126d67fb3bff5025409756da0d4acf1d28a40d1a3b80b6babb400a526959ae9a5280bdcaaaf79a993e1e503b565a0587385a6662560ccc673328e5e474ee1aec432e14ea86914a6007af3123d7573ff4d1fed9fc6e4445f96a0b1649e6323fe8da8264ed4e10c8ae223e51c89ea1d868ca7ab4cc4e8c65e7c3940b460e728a4c22f8f644e948e69a444bc3c109898df932561764e84d028623867db6cceec5dc4de69fa24ac188042f42c9cdf449d06163c8c5b6e980364f8ae0ab07cae26cd490f5eb1d25dbd0d7f155599ca8191cca3f91f1b4037d5443d693016980efdb4489eb5dc1469304e242fdfd631ab12c427e6a21f5b41ae1d01b05301d2ef8000f485a4b134604f9fdb8c74cd7371ea5a33bbb7330a0f735f544ddd85e632d3bd6407880866cf9ea0944ac483107678233b36a0a2cae57252338d986401d7dd55368068fdb10a2a09366973ce563c730da7d8bc53cd1861c067cb98c2f5da9bfa9aca912e5e0184d9ec0211a126ae7fc7edfe03356b1f3c53b660e14e2b7ff797ef886c1053e589af9fa96880d13874aeae903359233c805991bca3cc5a01dfda58161993adbf0bd896412003abefd28ebe0c335c1a038a1dc357118b0571b086af6c04272c047733220def64634c4f09ce617382956491b7212592e222267610b40bcfc100fa20893b19e2e4335c9c96e9b8f1b47f578a3afa6d059d993691ea6f924038ac0bb3ee3fd82b59b30516316c877af657e49c6cb8c0629b87beb0ca1cb2dac4ee24e98fca6727ab9ecc22d3aa0f17e6b306461cc5a0fda26e28525fb7816d02316167d24fdc2d6ef3651629829d1932d69ceef3b32d133cba438e5ce78af8d4d54c5436f5c638a67d51a340c661933cbbd9e056a7eb123b42e2039199e0f743b0cf704b2a3553de859840c155c7694a4708394552af1b906af17651134992d07b019b70a877c01c2b11900d3042620551013e67e2b704fc617852fb20a9d097ab426329d73e197be9627f837c3fcc192f299c32a49b09922d5c98cb7e408f2e0a4a441bc58bc1be20b9eeef7c1ecfa1572ea6705ba3144092cab91c47fd0a516d50759fe2764033be5d8815d2623667e5263c107809a2f8706dad399650acd35dc547e258b0b060216b6fe14e3fa46f0934f2514a39e106b401e21bb13655d1e5ab3cce0127b900eb3d69ea89bf3ddbbbbda7ed1364f237a92cca38524f2e02164daf8164f23f0f948778f4c6629b887a6394ac58fd4e0ece1151efa65cd5c020a570457afeaeb5b0ce050b507ff49a3d206e38bb8fe0a2200666b5c47cbfe394834362063b15c32f885b4d94fee09afee0c5f140a44abad32b0cbc9ff66b7580f4d1833b94c98e9ebe00c10a83a7687c7e839a3c220f97a4d97a56bf2f48ea5dfd0b383a6e4a4ef7e9654b1a6ac24f59692abf4f7a893d8e7b24011a306fe991180d98ec79658bd68bc1359743b88d816de56bb656655063149ee7bc93fd056f80e0dcee3bf0ed4af62e56083255dc167cd02d22f172d02c89097cccf579c34ecf0cedf5b6c7f700cece27f482f9ff82bbc9a621ffa04a455809cb32162c61aa89fe3e935174954298758faf3b65f500b59cf524d439595f82ef59e146982a52124bc8d5b371c8ffddc34211fc88d7e525376221a7704610130c5a738eb9df729632ad86593b2678f03c693173d9ff34ba0df16379361b12708d4f959609a2a7126efdcb62191a8470cd41f1ef9ff69617b197c9f5cf673b3b682064804b91645aba20aaaa2f58b4809fea1b62e92516086f3cefed94fbfcef371ffc5997f5e415b243db4fff1192d85b2202413bb5b7968bfbe4378478c2d4bcd6913c6ea339c204be367454d8ec87453afef800416eab94155326c549a98b995544c98ab19d68ee0e3e6c18cfb106360b420a8143bcac0ae0dfb8b26604e4b909146d9932014aad0c71d5e1d9827ea9c7bcda5fb04320051f129e69222e540eaaa414bd598a153736cc642e885a9251c6e8b9b91a97758489610ce53482af84236c8e438493fbadf84e61f6080851ab96688868f39923dafa41ce606abcc6c334e55329d765bce30add94088d519dc2d1369de700f961ea4015276f8a64e857016fff32873036028ab09fc567ca82b7c5a1ae5920ec8cf5d8a7b89b2705a0a0495f23e9f1f5e7f8607316374926b72d846107f7ec01bcf93bebf4c841716d4b5790a6dad43be600b26e9d2855f05acb30ab1d51437da23d20d13e1786aea610081ddc6d6e295116abba9a0c6cc539cab892bc4787002862c52a04264aea726e08a807519ebbc1286a423c302fdf168c87126585c8ed2a93358ae1e90399cfa6c8ce40521897ce04287c60ea9797db8139f1cfad83309bfc9dc0ea9636a18b405f7b15fca7c7ffdd40115d4bb035617b7bda943ac47d4313a066236c22efcccec1606222217fb7c67f7d6e0044b3cd3c8cebc4d04316e1f3eefe5dba756cdc237a774f2c977b334cb40d5163664bbb774ee9f52493a65b06c252bdf9559d8ade1157a27d3be1d6889aa4fd65ac8639c67dea0908d131f0d15bbfb562617639147daedddc6b5ec928cdb7809eb22f86af0ac690a717dfa0437bc16aee48c8b3a4696f3e45d1bf45df9bafd0c064b6564de54d4fc72c1ad9335402a3237741d11073f7d70f678a7c6d6de930d9a7659020f0d73e881dd3181af400d75c1c6457c50294aa8def1c5de2658f6c397ecbf87627770b94cedc153a583c07b87414354df5ca75808befc27f2429157cab8ada142f3df4cd7085b192418ab01af727856f594d601b4e0d0c814fea8d3b8a4f4eb7ca6fd5dfd4bce03526e7005723fb6193ff6b32290500eac13cb09a2e8871b168045a8d6bcc3cf700bb87e7c1f29c20e9e949a5cd67c89ab5c88e0899f17eee51291c02aec3f2c1a53488095d162ba684a6fecbe1bd25069ea0532c28cd4d5e76e08220ebaafdacfedd603c714441473cd8733e2fdadf8a600231703c0ca39ae4c816b8ae672ac68a17bf26b4f477d59081cc59e3361e51fb1b81809343df3d8687ec86180548cd0650ae2b3d10ccba4a6a0851483e54f1dd665fc89a1f41f9cbce2849d43984adbd09828be82a86c5c22b9da22ae38b2f1574dbc9a631df0900ab4e778afbe04c68a8c121ffdb4333d7ba1f1fd3cb54059e6cbad1d1bb378e7ae3468337dabedab9f12ab7c7c57a550bca8ea46fd02f6a1c3269b5a28fc4c27efd9bd961b7bc5b042eb051fbdd6c164ca9be99f08e7e16e8e98eab7bdaca7bd7dc9d8799474435e5020a571a502b5f4457393ba18119fbb0e630ced9889ad76bc7f65f955a355c6d4f121eea9903eb769c676ae134debe6ee9c3dc29f5485ea6614fcde4b611733d4669a8356c52ed7d4d81ed58451e2c6666b110178efc13c460cb5c47015c716075b71756973b829c3ee98019cb3113d977ca87de8ca51082e83962c08b07fcc8a909fcded9a4b2520280823d6a1e65e4c8d5067608d115d384242690b1ab75f68af558bae5f5cd4fb0572ede726a20e449203a4b6218c482471452c624c49ff64916fd22d0064cd8c63ca0ababa7593b8fc86353a2694754d246c97c61023d9d080ff53766238c032a363e50822ccbe27a603bcebb85d695f045498b867acb465ac9168dac745dca08c8c707e566a1e166052029f43ef6f75beb037f62e035b1849bfbd8ad5f4228cf133d2e54e46909d3eab11d2a1960724ceb797e295119a6a2b0c6f01396c4da3adeef4bc9bdbd5ddb0b014226c1024632318afa90c18e2f06f2919f4fd177f562a37ba4ab94ea5520100d05fccf67fdeee07ede84ec81437f218684e905e4aaa6b016599f1bd13edb0e86d1a99aa6b30b340a98f3b5ba6edb97698976ef3b85677d36bc94f7bb03b931828ffc68096dee11456243cd7ffe84b95b314ee24d35c940ae12278813730c71576ec3a2c87e8abfbb867582c665dc7eb85925da379999f7e3492340f7b81dfcd3e62281ac187485e63c9a35483d371b3b24cc4c9606d1ac62d6e4d6c27092661782057984c6ce81a238e68048a4057cbcd25f3da66566a10e5ddb82335bf251849401c73c9bea96eb2bc02775ec47d1c92201a968e693b4a0a96eea50f4cb631ff0067ba22ae8a0370e66c9cf95b227adac4645b49365b12a9945932eb0e11fbda4a7d24bf8ab088f05747b2a5210adc732636f39bb8c7de1cca9e3bdf8464a64ab0addf2d3d5a4845d43077f7502e15663df3a5c39d3055c840fee6567f80187b26b071ea62f7ae2b2c65c799e4dc9d7d7e135c709217c9c6da159d38fd5e48158091c31b5888c65e3a1fc4855f10dbff64972213d53dc389d2ca1c688cd89405aff0e19011a0a5cb55424613c640375cdf2fe510f00077b7cbceffe39aed9055dcf7a6f1093519bf9a191e3ecc4ed8353da0910d63854387bed4e5210499608754ff4cbf7d97d36c7d18e2ba07b5e23e68084154be1d6c257b558b6088c6c5582c89d90d628024d6a086e56f25fd5c669d8dae7ccc20eac68c3516c18962546c16a767ee8d913768189e3f9f8a61d3ca088a66ca648bbc3e8395066bafbf5826206d6a3aea0b925a666fdb58a467e74ec028e1c49dc2f705399b0efd21af7162268f740e123c352d8dd88b67a7572aa4c93d61687d80af2bde124fe622baa6a98ace09a2fab514e03fdf11d01f00dffa68bb076a21c76b802ad1945da3741312e4a28891680882ef32413174d5843e13e4143dfffca9ac1383d3dd84206fb333fb9cd462b84f3d3a52ef96c2297c7ca8ca544c65be81508585aa951f17ec430df85b86c4ccdbbe525a14dce9f088d78d26a957b24737820b9b7af3f067b3d8d84d500e1a5e358bb6f26d6207491fa9489309c7564b34efba1c11ec7c2e6dd926c5cc57627727dfd40a760120f9305616832ddfc8c68012140c37f19a5d34a7f5769b09d81a8a28ed12fa43137ff348bf8583fb305fa11942b5bf491db77315b90242e98afe269c833e4518f552a935d388072be1c3611f6c409e127e5b0e45d0b438891623777ddbca33c8e182e41582606cc28521e6b72ac51ee7267970b586b3fd3ccea1d83c2615f6746816ec983f9304390a7988a64726f67cd2e990b18b91353bc39384e026cbc358e3c092c84e07e6596b29957440e4b42a6643609e3734a79dd7948fda9b2b981c2ec44b0219f06464776de5a7cd490c9ebd07d5ef3ea0803651eb6a27a67f0e33f3146580b8e44b958b32c2bb96339d8d429eb81dc40102e67d2495859ce22df82e7c1a83bb1290f16c7c8a5557e677a19ac30c39f32cf2fd6fad8a1e404d909a5d1d6d7b8e173540a3acacf73f10770af5a1f33bcb6dad046fea9c84a371435a9c482e1e96d966afde71c028fa0e13912c867d1fb69c557ae9f9622386a7154b084e540cd3742db6d3eef4638ed1830fba7a1480f98cfc022007507c3c1903bfd6bb75f50ce34be11656441b3b92d3dbbabdc5dbf4b237044b8025ccaf64688f66c636e8262c4298300ad9278c4b6d2a186b9115e4aa4b132d9e4992d0ae18ade97b260ba919b76bfaf9ddd2c1f06ffd1bca069d0b3e01866718e5678347da17bd6924d6b096ebff4a7bf912ec398dccf111be907e4b511defdbe1b02e3af35ef324e77494f1864c08f995f7d6ae9d9045a1585ac34cb0f1c27d02693dbc25fa53c9ee781101c764c0dc0f28623b75df545f4d065800cbc3b28a21f909b9545d4f150f5a818664d4fb96204084b293f55a1ea4f4b4a94befb41f572be8425d3b426569d43efb04d5892d1aba43f1e7895641a1fc0b1a0c04ec19b44b1306a47c110a19c3424b7173af0d02d85053523886cc02e8f4187091a6f2de42c84b08ba75425f728f076c605eb276052778b18c555e82fb2b2a4df7626cea29f06d1a58ba94b1963f2a31edce3d49c470ad3a8f1a37c2c3db61833a4c15bfffbf53f3c69b804711460e6d2ea6a5fb22dd473cfad0634d7850eefc152a19bf9471bf19185de951a5188601971fa1fb345719848ba0eba2ca4500296dc49055966f87955275ce042f09e01d8adffacbb57292f9bc89a810cec9f9ef665927443edfc2c3dc7ca803b7085b96a5bd90dafbcf155308fb440f871dc32e55ff4e9c4c72eb22e18e9a69d6331e38f36fed6115c4029274555e7a291e601b76c2a4b2083c86b682c357e81fa6dc86afe98b2fb9c1127db822c71ccba94c0d03b236ab4c6e18251d36e960e24ce97095b92fb1c0f504440a3e0c49136b9ab8b9c583cf8a74e15aa729862c19fcb2d0ca1e4c366baf9781e80972b283307f1e45e94c6217fc18e05c9cd2a055e2df2c9315a2782b14fa96b346d59f7568247bb1e7e43e5c2422337fa274fbf2de7ab265a87ff0a88c1cc82a2423d2b0674951da48f1cbaa8586f73f5cfc6a6fb9c792c63f1b9bcddaa74a1681a2adbdf34cd911802e41674f49036b4c353ca7f1010ce690e50d4d5d17f542c76640eed1af99663b2521b137ee5e4ad1a289c8cd4b1e4480d73a79ab611c1ed31788ca2dccb8ccb77c037595316a8a0d6a62a991b789b285d7dd7be4b7a8d1ffe1bcace69523d1d406afb1ff3ad8f9aee4f94600ab5fe3054237b03fc44655d225327013b7136098f18c6b28219077e4843397f6134524f65c61b43912431ab1127b8284f7fe8b7a038dc3a1c33282ca632eeae1488969d9af64645c535655b9f7446aee6c39b75d152b4d27037c99cb98e96c03e780ddf36f950b306a25c036aa30e0b11e1e4d1471bc1a39f716bbc1bae1fead620999ea6d69134ffe126cb76ceaabd2b876b68ae825f53021d318f4370df94d2e7b861f54961a46d6d52c06e1234edc7ac5c3b0e537be28e3e68e8504e2f34fe76a2784823238276661af2bb02793a827df1b13804b138f2ada97582d0351aebd3e0e86d95d835bf89e4200dffe24d48d007618755565abbfed064aa925dce750bb0b4d212af86e0fbd17e83187bd0bfda3c140fda808bf2fc35a4515a2af7e44d8f4c415992870b6fb01f5840892024a4fca5841f05527431dff2de503f9d0f57b34f40fbe9adf0991960151088b228356eb46a9d52b45d3333da3c6ba774624ae25fb0b115bc2e9cbca8bbc504719c43815385ec034c7fec0ff07705616e682aec1ef84abbd141446a43d03edb578b21f1f36ecd8078852e6a9527905b00bee572950b353e47501209ad2a815cf7e413cef10a36cdeb3a040137f36e930d2280eedaf6f7fd192869190ffaf60e25a80a8d82911c33c353df25f4c67f66e8606d602e2bff36826e219933ce9b6205d097173f99064ac1524ccdea03493c54b193989433809d6cb2d740cfbb39d3fcf14534f039177e74f011f6580e059f1ea1392dd4ee8665eda9117d8f13096ff145e76c0134ca49ea9aab740d22325bc0f4d23c39824345fc0d23351cd2b839e0ffba6be9dd11dad5ff48727407df009f1c9ce6043ce23c029de72820ea47bfe1a970f37053a86b27e8cd5e6ed39c6deafe4288a60f909aef25adc1c4679d140f3e02d39945f956eeb89ae2ab607ddf6a56a696ec2a5026edb5ee96e17db0e8ab6ba910e043ca0d6119cc83fbd95a60eec9c1b673771b0d1c83871b82632f208cd0c89176e70a9defe4151514e852bb06e18716933af83524c36674943791021f4b7b6e84550136cbbf39de1fe0a557ab377f8a6fd852e55d36639914f46fd1a92f41633ade6dcc76a4ea71c6e03be604afd374c69b7b0c306e929243c190d49f980935ed73eeab380e80ae29bee34b4c9b887230058d2f60a9a94fc5a219a645b492de664828a4abcbdb51cdefbf7b4a799889a649a90eec4fe6d58dd63ca02cb715d3818db80027339c18d8099927b948f84a45fc2848352ff4b843003ce05448f1d0f84fd7a5544a2b7d39773644c8fe5c788798b3f4f32df8a6363165df9af635f2ab7682bd8404cd61fda77188dc2466e167c868da0330798d248f9111f6de4b73dc10fa6f462d0d311cc89a9ad6f022d08b5e62e5316fb0533d76a589e0645249e90ce1e64af7b762fd67e08878f62ac70e87860d1a13f8b870d7d4f8addb8d00ae5319039a3941c1d4f051932b3fb4ad6ee7d900f500fe04d4849ef10094699ae4b3c9ac1be6350def9b6f60c4b88d571e4ad1020076d92f782f5ec3465ffd365f419cc7d2de169f43807f744cf573c4f3d358a99e0016fda3faa49f77226ebc94f35cf5ecce5405af3368f42f8c01733968093df95719359a49c3981231484423d76d106045a622d5718e37b5e07e9a11b6f6d1ccab00880a07c7369d3498b67b8bbb09d09114d25907b8da39fc39206cc77ee4c6b1cc01bd06737480f446f578527d662869b0294e2cf3799cf8a9548425e8a91c0c721a7609b311ae7fbe8962aa35e0f00503215b23bc6036cab290c543aca0b23dbe9a11fa329fd06b42920de5ce5056cebbca8ddb88a0957b8e391af6178f27c8959c64970b89c77c325793749aba68ced52a7226fc7d593d589415153950a630a1db12001124ab5518183af9ce413346e848320062f094e6e9a586a392b3d905fd8e22cae11a99fe77cde72aeeb36bc519f303b461de503f9507e28ec940b2dd232286ade82bafb1ce2da1245bd32f280b731438147136b65c2046e4e96fa0a2786821dd783580f741aeb8d10f84e5e0b30aa74d4aebe22a2e5773bf83434591c014d0dabbf93820b6ca10ea87fbf1f4915dbb4e6fa2e1db51cde32a0e313820f5dca645569a2950bad052868a53949cbea3bcf1d8c23d7709428cfc2def7ef516184fc429f1c9f4da6409f27ea5107b383b43b7e1b85810cecb1b48d8f23e4319923adf36cbe2f073b017a7a8f5827f9b999fbf05633c6a5c3953e7faec1d38a680fb27a0eed67254accdb94b3928ad78a5011dc67a02292f98d8859570b7b4a41ca91fbe6cb9555d862b34e52c5f93e3635bb7bd0a37db0dfe99492c47d96c54bec8665d45eebd4fb647962453e7315109930a720182b663634a220881d6b54f87420aae6daf548737cf4a7906e09bdecf4a513a5f501b2e99c1f375e613b5d912189746a84c9f0a5c1ab7822e1f24e38accf1c98ca88985897b79bd241e734c1f65aee6f200f8b8ba7fc6654f2675bcd7b3262433e67c742c7d147d196dbeb729c95d0d848c643c1e7e073d754213109cfb9504836a92343eae0388d3f21372ed4455140f567f0d13f7760c3c8b012f5791bdebc4f448da0f10c8ac621785c4de0436db71e2cad89965685b56fac466f335e2e6dc445230dceee851dc7c3f21c1d02ecab4c01a6a0764b32954889224ddbdf82b2cd30a2b5ad09b69589737fb0a074255ab4cd1aeef31bdb0514c9acc26628e9d8a55c45140ceb0377bc9a4ce4995c8a8f83ad54a7aee24fd01ac3a170d62b71c0f0293e9e3025c70cfa70b0d6cb86022dc5bd03b63611d844cb02ae285ed43b085c8e6a2f9a8cdcc6c6cfe051121c61d0054ed62d6dea3a1bf7f85546bb03087b9f2f9d7fa77e12ea79220cfc35d9982b940fed02798f1037434ee8364474254ce004627d152ad889c137ef8e80215ba1bf677a6950c283506032143a580756b9f8b190c6d459bf5abec01dd746a98ddbebaff85e0509e23dd3ddf4ace3dffdbf343681af8d734f33d5b26148ec2c13feb9c7ae746f886beaf84b451d895b3dbd62d1864848ab81a053f1636afdb8da66d1f8907309fddf91e44b79bcba53ca0108346b363b2ff5bf33c0b609a2e78055d79c63cbaf967a1d8290a99a5a53e4cf9f264e71f9b2b6e00805d115460f7b00492d85379987ba5066071247cd3e4351b4ab35508649ac0a32f118206777ce8549b6f507b010b0d45493a7480892d8161f7df196be510304d90bb9d201f67f9db2a2d626eb7ebc0397d2018747a023eecf5826c22019929ad2ff5d198f62104ef40a5292b8599c2e91e21ec271cb504883ea93c24c45346a4397bfa1dac76908a82a9af562a2068800c06c6d02e5d76d11577e975a6b9561c98d4264cf5e0694932691d543a0574b1e274c8e084d6fa4cc593af1d6477f4428c19d243ac57b14eed9a7d8f3ba91c7ae8cad34370fba02110f4aa085fe2d0eb0b49208345684ecdf2ca725428b74a17a7a6405af949d4125d40ad66d56ce1fa431525c69302d3eed9828b3e376ce4734388dd5a835c7079cbb5ede9a103adbf10e4ec8e39448d767d71add6f54dc56e5bc92836b89d987ac22fb9ea89e50efb6b8275a8d09464d678504b4059f009958a33a33ac78709029cb96f7c25dcb72e6b9702ad1a3e72f9c670a3ea07fa3e6ac0a5bb44538579d082bec13bba198a331b3c417a108f4df03668df248425b8271aed5793aa047091ff49e31c07f08f793bf5c2722f22868a0f67b5df07f0eab387ef163bb3badd9b2f5caf50fd1578104e06306692c4f949a4834a766b55ed8d9d93c4299edb0aa466a370050576fc889730aa5c7a83826745f84fa4843c4251c323f313a067de1bc872931963e87b71b06ca0b731a6ba8be777cf1a86f5b998e96c56380abf2e77cf50c27200b642850284f8bcc51716f27941ca8535f8af603b8fbdc11727be84aa815b6ef994c8d79d3b770bdf3492818674b7d4b1dba81bbca724ba1ff2041606933355c4fa24a0716ef8844d327676787f1bc129c65e7e677b60ccd391d2ef3a4c7eb5eaec5a045fc86c0ace70970169f4975a280598aef03917d000643b1eecf2f9242069eebd348dcd4ab3d63120c69658802ee49b4da787cf9f73698b1edea40fb2294e9e0228b05bb0252da6d073f312f79df265665dfd2f45fa1ec1cca3fd8f2acc6a53c7df8d48bbabc770b56e6058ac58d84884c0a71ef551fe573c91e37dd23b95911c2a3895937a531d5fa43c78255d263ca7357c00b372becbea8a590f78e407f4e1e6445b07012a4a0de7ceb2988f192041f824b23ced8ef793ddae83b8e1f0e1986f61e22a3ec904b2ca3e1d5bb02c5694aa0f3cab9737f61eb593a901a6fe0a770479d949f1eabe1ddbd802f5effddd8ffb77bfeee7fe62f7733ecd07f3f77c99b959208b41aa55a4255660b697a7047a8112f7bc5d02deff2a4f60903b344ec43d87b224fd0d9838141cab37e53b350486d1f0dde5a12a990d70bc551ca380e82cd8ebf42b83dc1683241b57b270218d23b9f892c593c4e37feb427c98a8479a4c3525c9e1462e562beae21a711763176b31f89159940bc4c6e4022af1106f076cded991e3d2d9e9558a24136d269e874675b85aa818e8cc797c91cd53a8e1dcc34256638e53c73ba2eb411270890f0d0e880ee0db1357ac96256e29b94f63686e98e462232cda974b8d465f3a0cf179bf171c6b6892f0daf660faa3d4f7a11b84ccff03870c9f11e02ac08fa3a1ab70bb90df4bc0b83b98b3c47cf6deb44758b0874d357e9dc6f709184300ec4a495387c00a1a06cdf225b76f98471a491aa5569e6a6964f0ab985ba7a53a8d6ca7145ab09afa143c4dc3e1139469723f510fe30a8be7a6822b335a9a0fa46541e2a87b1fd728bd035d497ee39f5db97fc484733c05581c0608074262df16fb20b9b9b145ebe5df541d5581b3288ee5d9122206a949c3fd72d6e192c34186c86d1acd57537b79a4494735df8a44499faf17fb1426453f58ce5ba773a7c03ff7639acc7ea766f2a7598e124aaeeead5f4fde8671d2a5d4e59b97864e984c7232e383e4369bda60bd5cf3e22cf1a9dedbaaa5d77a5ae40c671beab23298a16f9533fba852e573207d9bdba740323e4595472d2f211f15730d4d94f80a47bcc8ce327a24ab61d0a19ee9ff43c05f4e405fe010e024f2b536f553cea2a408b9f8e11e15eac70c52386496de7b4a45d2f6d2d3804c0a57463af9cad3c94e89e0fdc0566ef82794fbd3857c7d947f9820cfa34492fffe2c18d1161986b1982e599acdaacb57586ca1f1f9bed21147e111f1fdc4dec8c838d524f09598eb7c7804eee8689ee2c204d075f70af318e20109f833632e0607fff11f49ea0736a0553cd35102563b0e1c0d3d7a06f74aeb1c1560858a649f07a00e8737255f4d7674be13712790aff484f953469ab56713843fe31b0a6312301243ba57d21903ee2c63c8cadd49a9bfcb11da3472a89db4c966ba6c8a1c642c038b857102309e96e86d5dbd45582d61b16175abac08b136af41697046e0585b811de33bb8159edce3107de3cbd66cbe347f6096a1e726a85e2c00d01a2b49831e5e3236b1460a5ab887a9030856e7ad509c00a2bf262c144e2c9d671915b1c5d4a3a0f3b4d56f4744662be6397c387c5e2acc2cdcea744ea0de3f448f7a41c34401d8953bd01c644761e0c8dfc107209707fd05fd1640d5fa3cb50d81cf9e031f84abfd63dd06fa47e8ccc287a9e7d826751f068e8079e1f56e01eec9323a971b65841dbd3550562dfa1c00feccd79640ca9d24c133a8e3420dd16fee60bbaa5950303afc0a5405f89f5703c6aaf95ab1987b997bbd07c1e090d0dea28f8c74030626986d5983f3e38f37194323da1c64e0c90703741a8d01e7e0d85eebb87c20775a38c545a4fb5090bec4b65618de1d1fe2c3d585e75a6b7cc86dfcffcbcc45a17f5faae081710e3c26124608b0cd6c56069165b84fc4026edf13ee7b1abf3e83a0390a7c14ed5454a880139c7b06ae2a4c81bb32aff07981d1228002c8f2b97c151ebad79c2d802797f3b0e8b97612ad449742971c9a9cf1a7d74f66df67c3f68e816a5f5c2a69b06c7865c6d4efa39f26a84288218cda46383580c489b8b98d0542bb7edc7ff640118d828bf407ad690fd41af56dbe8ab8697bcafac61c017e26c57f6b0b04db7cbea90615d3b1541af837a90c811106b790ad64439964f6087409df0661f0a8c563014d717c291257264504013d762f69b2fe1247f613c4415b20061a2e1c8a6ae85bec835bf10ce95877a49624b1acd15a429a75632243cbd5c4adacfa9662e2c16967c81c5c18284d6ccffd6002f8759107a51e63d7eaeb5f3db6942f98d19d1feeec29a5a254db29d14cd34c7ef6f04a9cbdc45b638dc4ce166bda77448101e6bcec518541c66af6ebc886295c7daa5d2ced5acf46721810a6603136ae4e929fe249a9c99a08c3f58cc98d414720fe75cd369622ff061f4a12170ec443a1e6790f00478b90d7a957fda8fb9a39a07e11dbba0bc5b022a8d26c8e0d435631c1b8e66feb0aea9e739aae020f740dc2ea9ddbf848202e34fbab66d30190069131b8e9decd2540206fbb1ae1af1d96eb84b3c849f856befd9f9f5f0c03b666ae25b0e3a423a7e81ff79ce3a2923b79ba6d1937fa40a37980f6ebaf77f95bce8b0a5418d84c1275da41651828455e00182b1480bd9ae24c6881166af3623995c5bd327e8283b0021f31e34afc114ded53cd5816ee19ee297a96f92ae9cdf1d484c254946f95a5fd2f01c97ce20b1e380594821ea42879a2e62fbf911d712ae59f917479c302c69348715dd754420856f6a05ef880325528102e5bc9b22afcffa28968afd34d1a2821c6095ffc298ee1e89ed9b0f6e283b49065c38acd0f8f5abff3ee7005a21e68954118b206de208ec4ad58b573f43c5d99c82e2bda25a7a434d0bcbacc6dcc09328b5a513d252519241ff52d9e32724c332a87e60f0f380dfc724ab8152ff8069f82d222729fda293e86621899b5585967da3f0530b1409db1e9fc17837b76356d2e02ae4bc3e5d788630eaa94d371299a18ce8844d7d8a718be0f0d2f2f32274bb76124a3aedb8bd1f0507e23501cf4c98d0b5955bfbee239dce2d653857c3c27768dcbd8996dfcdf6d8638b2ac7def151c1d644bfb1fbd24f65f1226928ddc1550932d208801333b03d21345973b93f8b53dc90d21393570f4601ce0a598c1cc34a34afd19414186eae540a1f15e6579f7184beeba0866e4087246d87b272a33a746ee057743abc8c06748e6b362e6292c2e70d0e0eb423e2babaae730baaa1b9089193d70d2c1c91f857ba93994025d006b4d392546434b9d687947b237c8905afc7fb145c29ef9ef6bfa0f6460fcff27f838cc8030133b0fe3fd4511d466dbf4fe950c4f50415599baeea13e1f474cbcc25500fe8ad168d63999f5637794cc4454425ea68dd2e74a7adef1794513b74b478df59aa75db8c773fd169ce12eea3d003735eb01d307c0d0d364811a722dbab40f98488e848196e48c4a83f8bc986735d446e5218043670811c14c7742dcd00a591511fcccf96f2b5654f7d6a4e0b6e53e45a208e1fc784a23b19290c894178dd87142b7740c07effde0a9a61398dcf01cfd4e85ead4db0810979e0a7f6775827c33e8042005e62534e241c39d02de60a60df8db480e51594ecc15e201365e191b49fa50f49ec523f0ba83e5d5050466cf5b1a74f300e141b12d607d82d602eb5375c0ca641a277567511bfb3fa91f5c0b253c8d3ed4cc1524fe9679ac47b89aed3afdbc39f81f019abf297080f59b56b71e3ff36ba8e4e7ab03976861011b2e1461ca39e12c5d7cbbd30a5a7b4b759a6fcb10e3dda33a661c73874d7d77221b8a920962a198cfc3078054269ff4ef7fb4908386b43fd0ec0638849d8d6b328439c9faa5b8b4ed337722e56c6dc16f26232015c88080de63f2fb604ac2f5b00c9ab350505587a75082bd6209afa90bfaa22a580ac7ea33e52de1b486aa794e662d00cd7331d6731460cf4bff64c1924cb536d512cdbefe6401eebcd1d17e81c52ea50f884f915907dc38f7151ead777b3e74213deaadb10e7fc7afa23e23d3b5befdd0106bf358867a728d00f868910d84dbbb6ace22c00fcae2e9ad95d428ca5bb0d12a87131a2c1ed6c235b836eb1563615fa53de839d02158a8070d6408164139cee4c0b1c2fe6a5fc6a46519d8552cca0f67dd7455eb3be018fd3e4ddf16a18b4d3d3104edad93fcdbb32acdae3883c036e5490fc2ae2350a7387d9c04bcdf4d6bc8e9861b427c56b5d5e134e3a9f638e78c6f022c07421d243075e386a8d8b15e68a88a275b87be1454449a03789bb751fdf6d1f23d20ec5b19da9bccf894cb94ea4da3c6f33ea7a27aa59e4924eee486881ce5925a41ab266c9ab4ed73a84254fc4cd53837fe41046ce18fc5283b8bd25d1aae2d6edd78065411038044fc6e587b66174336fbd3486571fdc7083aff93c13befd6401ecf8d9560afe467b9892a98868bd1bdbf1833a6a7c9e05cd4f521cbf88c9668ae99a65d6ca64c58cbb4733207d58271b66593d026ae3823f3677f5269f24132d3063f3be12f412eaab50fc39a09834762255dfc1ac0c22c8b4e288eabe2a9da6a72e056caf8612ddb3c3fe10a9b101073730ae78b9ed054cdcc6f12b3e9a9d08e15904a9801797958d6bcb70b6fc8a8221b69babf64020ad832993d9dde88b7a0585f6d2c161d4432d2e7a0bef0cf1c8f9dc9f51f5728c0a39d26dcd99497a90e73771608b432708c81a9913eb5bec1dc8a69c65514e072ebce1952d83fadd4f9533c36b1081e25f3750ed246db037e55e5f97dcd7fb759364b669005bcf22325b71b1864bb2e94e0bc07759597cc7dc1782408f43964835bb9226897510fc7100e8e5fc96211b0f19cbc339b58bf6587b006199d04c22209569f14439216625daecc1f3b0509bcdda94e78f7d4552b4753f59843cd4fb8ff001e1a41b84945b3d962a1c7cf0e939871659f2ab4cfadb784ad32ac3e6f7d2724e56c7f54f03d6866ac53784fa4261422ad603d78ecdcff279bc48656fdbbbb26719c7d83b285f11b268f3e54ea78b3d237b0b4eaa26da3b81a48f7582f94baa54c80c58462ed3233ccea88b6f2aa9704db3f831571ded396d5cbd221a49ab56014a826297f12610152561599d9fcd27cab4e9e6822abf595a63bf3eaf1d5f10780c56b7e36f956b3c2cef87485dc05de40b5dfebc192cd9297509d332e5b2edd847e4ca7a59643bf077623ae79090a343705bcc930ca2f9ac779322f738ff8400207fdc7418842255a0ce941d1004b346d0ce6923ef161249ad2d3b2f02be238cbd32a95a8cd623f82b3e6d5a0560ee5f68da62edaa6a4ad554d3e6b22e833b13cc347fd3cf78dad3c753ec804eac56f216365a3816465baae504f3717d3c4b4d29bfe675731fbd4eaaa35daa790e4db48583e177bde92da68f46e1b9a9ed6c718f084c625a173da8eaf9899a1e0ad1e55f21df0690ce71c82fd62ae21678601be01cc3e045ad25fc357205a5951634d8b305ddd9dd4c1bc21121ae795e01a774622c06d4c764730a1de980c5f6fe9d146070866658fbeb80ea0141062014041165f5078daece8a60a1df0c1ccdb2c9577afe7f146d28d64ef1222f7de524a2903bf0b4b0c500c7246e5a4bfcea864295728cf52aeee8a46f92c9dbe4dbf9fa26f17a1bf6b600052df2c8df884d0df102c52a7be020ff17de3e8efe6cb1b7061994f4d515dd10275167808ea2beecd1b70b99f59ca718bf210370f49c949a83c254565e52932e53f5654fe63e52dff9192c5ba9247fd474b4ed5957cca5952afd17db748255d61d44f584561e838c3cbb0944fc799770f99f910df7f1387bf7888f01b478743cc6f1c3df306661706017ef41b5ec428b2b6a5147b9efb08f31872848ccd12f377b648af24b6cc39475324fabc688a44f3749451cd57a9a296c32971e013de1265494e29250aac0f3a5a0be8fa8eebacf78a7ba4aa8ff5a9b2f5e272eeb8b09e9ca9b4bab2ae2e67c6584af35e606e891cedbb9c18f753bb9c9b33072459f69b723fa7943929bd18c63f181d8e5ef1afce1d9d528f29f8b0412fb7f525db202674b4a0d6e137ef5bc3c6b9ee23cb84ce4c1b7b1b445b52cf9dbab2f76e5ea410b7f5b155758fe35634777bcef3384ff5af25e2b80c6f6eb8dcfabc74f1287fc112e53bb57229574ed9205b750872b4b7a76b9034d3556f6f7d6aaae64a9b31f6a9a3a42ea65eca55089265dfe25c14c45d65f29e5ae6f6bb08dded0e18f17f1cc8454104c06ba8cc7fdf91604844eef5bbfa8cbf321f4fc31b997f32404c2de3024b0d232373189c4dc62b0c2e877379d378cddc0f67abf75ecf558ee3eabb73b5de1fef978f57ddcb7000dc63c8dcf360d4cad5ba5ffee2ba28c2c6b82aef2f5ee564eec980f17a2f071a1586c7c5b828bcc9c13159fde35eeebd73d57bc9bb7295fbe16c9c6da5c29c8d8e3f4c5c7ce52355bf787516de1ad0acd7f066e5cdb8e7c1dc73d8e3626238d661300c95c7c1bcc0fc7f99c1adbcabca3c5677b1ca2e5e53595746f57befe552f4e2bd5c7516f77296ea3c54772173172e7e5ff2a6fae533eee17d18917718ee1ecc636260f27e8849afa91e66fd05e63b7c06c7a9fe82a5665d55e671efe233fc41e62eeee2de17954a05935ff0cfe17b95ea9ef772cffddefcfca2c22ebe52dd85aac6bb0b8cbbf7928fd02e3ec2f8b8c252ab60e48da35de4d50acbbce253cd0e2fb81f8e494a781323db10739c948324237300e0ce4797e381c75dce7f3b24f3dde57432af2a7c5fb037bdcef3ac585357703ff5964491fb912fef7cd44e47064f7defff1f8637cf36c4faae0b0580533f8474f1a1de3b779b925b4147dbe55414e2e67efe16bec5e1f6b7e79a7043b4956fcfdd68cbc54bb2d26a6044ef2aabb43a435f79dfebca34b9ca686b5721928eaddb77f63576ab33f776f33684f40efbb0dcb25cc5f2199795e53197926537f7c384443a89deecef156ff3d612bbae765d1772350f21659ddb8406903661b63f7545c2d2a6da2474acf78ee32810f5cda23bd4774977a8897a0786371deaf33e56751c3760cec3b33f60fef2287bd8fed0d1c75e40d773b7a3ce87b692c8ee928e33794f5b0f2b2dee34467b90d8c835b20e795fa99ad112936b8b93975c5f710e6dc1c87b6a18b7ddcbf70ad53f15a6b7278830bee996360329cd43a57aa7c2d6091d9fbc86c2f83f19fe30786b40c36817b576ddcb8baa7630bfd8058f1f46ed3a0a7a56d58d1f63fefcd7d418fcc3d4307ebc71348cc3e05d3ffe03c1131e358cd7d01a15b7ee2a32da8a7997c34faf21102a67bdce388dd7bc657eca3446c7987799cab8fbf077aa7787d597efeba2cadc3b958b0ff72f87ddbfa85efe922df7e37d3f3e0033fef21a3a002eaf0ee31c77568c4a770ebbf8c1c5bdeca27af797d77bd84575eaa2ca3b70b4eaf72fe7fea96054d8c507d57f98ea8751fdffcb251d5ff2d680f6ee6370335e435de422ecea360c62c6b9cc63c65f320fd6b95f5c84d55e2ec2ea19b9d6f00718ac2c73c84554adf2d3b9bc69642b938ba83ae6a7cf10881895bca78e794cc79dc3f343b5c4d5bf14f084c7938c7ff57a31a78ef36edea7ee84694c36b58c775d3ec9e8687fc23446471b04e6325eee61199f81b706f48cd7f046c6bf4b63ceddc2ce05e12266c68f592fafa1d6a7ce90cead0280a3efc3bdea327c26e9a8aeba31325e320f1987b98c0cf39a3a03ff00e3e5323ceed68b6abddcfdcb67d4fb192f3c5e0e03e33030f76ede54dfc79cc3156f09e85aafba88533dfc67487771117ede6288255d712bd58cdf1fe531357360ea975f2cf58cf125f3f00ef319fe00e33097a10fde613cef3e88979797fdac7a7939c75def66d50b86b98c97c3bc60aa615eba0c77e068ce656a1cede2433d775895e14b26e9882e3f549bed111ae6e3251d39d64756de381ae635f4054f2d034b0d8365c8c030de6d21f47814bc25a0c7c7c05b037a3cdd9e06298537ab5128001c2d8e601cc653301d31bdd1f105a53b27b465ed8d8ef6d3890f7ef97db97dc1d77bf1382f5b697de808034fed5367e8bda24fcc873eb9d196eaf63547f572954a7530bc51651b62d7712e3e745d06529a87775a3b8ea6b6f3688c8ec72fdf05f18b970f863bea698d8ed6488cb6aab61c9725772fbce1ee71dc2bc77119a4a3b5a7b121a4c7ea0c294b2a55afb6fe5e51a4ffae3e5088d2091a34d19c16e4edb91f0ee8f6dc12d97a71cba5415b8e0cda725368bbe78ebebdc0f395f692b79c2267ba242063e66ddef20d2999065192614b2ee8f9dd8d405beb5357b58984ced4f1a994789bb84944263e79df3a19f50cd1fbfea70aabfd8703ee9e71f763a93147b58bac823dcfcb1b476a9594d7fa14ae9ebb0aaee7546aaaca399c7295a75cb3c05345e55dd7b1f8cd8ab7c09baec02e787b3689b667c144cc54a511e1e94d6fda5e2505854fd6fea45034d69924beff187da390747b1952484ac2f41fa08974302485a487271dbc7d8d100ea033d64795e406894df24ed9aefb46af2bafe4bdc3d22b8174bcd9e6ce47949246d6d06e674687c3711398c11490d0614d5b1cea6f823c50d01fe561a2293e8d78c8608ff0b481e2aba3ad678498a6f864041f688a53f42732426d0a9f11ba001e01094db1a83f097e23512849478ce044538c5285da2f2353e3c6abce8cbc121091c4135ec0821da8800b3588c2083551e6891a375e5744a5646a007553180511bf1ddc20d8d81551a92fccc01b43f7040f8cd015d03cc1840d688ea4008a929702207c41744b9005af04429dc59dfeacad3a26d0148fa80e104d7128a5488e7ec020a1a1b0063d91a049688a43bc72240a4b688a4113c8a08f364aa22d1ee98f2681e726c1091e1434c5a42ea76383f74409cea0ef0d3e5112be204722d089242cf1c1a5d547cfb07e624fa8f46d755454aa4d454545a5da6ab555395d528b4e826b333a5539bdd784b652ae53ca5bb433cb836d8180628b68db84f67ceeb75dc1b62eb856c7fbb631a081f76d6d90a3fbb637d041f76d87e4b0dfb607af6d7fa0a967d3340d72f53344a5d09e19bc243ade50d579c1103445b93a75e5ba406c1086eaf686ea378adede909e3a7acb9a4e5d69192fd0f4771523694c54a7885e923944a36f1623169963746abf5fec370c4d8f650e4b1f63e6e0c4d4be3ef9a8a8a8a8fcd251e5329c43bc9ff090fbdaddb23cf5958fec476f398775441b24def04484b9ebdc46a4729573f8ee40d2a06fc177466dd0b3e06b0349833e852f0da40ef42bf8c640daa0f3232ca70efb12d1f4d70692e674fa5b03f9d291b1093201a0731b2fc70ee6cc12df49706d2eea079ade66847d2031df60333a09ae8d68888e2852c1d5162459a69208434f1609e6d3b936a27c51c2959492b4b1b3a6b15fe8f93a54a1d0f307c5e280477838d4966a5ff7afc343ece04ebf0365879db44a4bda38b0fa067ca7e3282303fb500850ef15450aa328bda75db182d62959f3338459217cfc90f5078cbb21e988b4c2bace09f1d2196e1c4d69f642d8955744a2e7a8f8e83f8a89804d5dad8e8fd5d1e16a358f463b22ee2a1312d2b75bad3675a64e77441491a6aef2f786c266a6f43bb277fb68b572afa1d5a6a44a51a1d0dbebd1f77aea8c37932c286c2b4af4aeb62a85ded546ab44a2e52b14b2d5a3a5acb57ab5babd1faf6b42dc5eaddbde9abf191d9bf07aa64b0ad93e9a17a46af94f487fd3270d9ae293fea80934c52cf457c1219ae216fd59ce092998a02946d13874ce1f5f6d22cecba368293fb5a43635eb8036344b1a798fa07306f946484c800b55bc01095a18788cd85828908c4462c7e93b7b32d11bdce9016a198f711ae18d8c8b32da122222a12d1b6de938052521fa8f1a514d8e8b92b0f98f1d6c76d861566792b8f90f9b1b9b1a9b8b9ec48effb8d921fa4d8da8e675d16b2efacda54d4267389a4592694c507973b520cad9269a72b49afb9b7b9b1d72dcbf5c7ffd62e995c057bef8f5967841970bbcafd7ef5ff7f5fb1ae1cd7dbd4678f3baa10e33d60511f79c8dac123b43f5757a79f816b5cbe5cafb75d4bf17ae3b55e7f5e2a1e6e810aa1f26c2bef2be769d5e1daea372d571e1bae3faae3a2e25e8487550ea13bbaf3b3aeefa4ee9d7e516f5ebf5ca5b47ae3b3a52e67de9ca957ba039843757a7d2180d425b950ad194037780d096d4a3d1ef0d6f786f0fd5f70ac3300cf3be1ffd857b501f1d8e684564f0c4c81c0dc9eb33bce931c39b9bc3f07e74efbdcfa3bf1ebe700d52635536357d78d3f4be02d3c5d97ccf1dbdc39d321ddf33080fdf33d6d257def4bd06ea4ccd576c94beaeefaaef559286e6f72f9206c7ef5f489a1bbf872169667e3fca56ebf73092c6c6ef5992a6c6ef67481a1d7e1f235b39fc5e074943e3f735248dccef6d489a98dfb7646bc6ef69240debf72e4903f3fb97a491f17b00c8568cdf6b49b3fabd8da4197fcf83a481f17b1db2f5e2f73d489a97dffb206954bf0f80a4c1e1f73fc856fe7d109206ff5e0849f3df1340d2b8f87d0164abc5ef13206958fc5e019266c5ef1720695c7ecf00d96af9fd03240dcbef21206952bf8f80a459f9bd04644be5f713903429bfa780a401c0ef413a73babfbfb4255d3dcc18fa7bf3ee416374a4b21ad3344895813b37f0f4275b9d41bdf2bea86cd3f43da0d8a60bcc261e94adce78b5ba9ab31943ef923daf6caba16ca46f7047d3d3bf5a4db7a5dbd31086a2c3ccd1849878a6cb749b31b53a73335d17e5f4662963c47b35af36673bb2a45bbcc928327db3781ef0d49c8efb1af180a57e8577077a9b21299ab84b333d656a9e23c7a74d8e9a1c3b5c54934980048a4d8e539bd2ec1eb1039e92c67d8e3bca346e78637a17c2a82e85791fa1c3534ebb3ec39b17d500c09c13c9320319e4380631485613213a4ef105c9f2c216e468d382646501688e4a7e24eb0a5490e314a4902c1f24747c42149205c5113936e104c96a8212e698042392858422c891092248163d0ecc15912c26e8fb1acad14aaf7d8ffab6da95f7fde668f7e0391a6ddd53f017d3e039411a2c350ecc05017342902cfa19ccb5b00d5c03eb80b92348167d0e9843821ce969606e0992452f83b99a64d1c7608e0992453f03734d98233d0b734e48163d0ce69e902c7a19988b813928e448bfc21c14248b7ec45c14248b1e06e6a42059f42f30f782b9249245afc25c15248b1e07cc5941b2e833e6ae20477a8cb92592457fcc31912c7a1798c302978539d2b3c01c17248b7e05e6ba2059f42e980b922cfa16cc79418ef42c9803031706c9a25fc11c15986bc20d49164753c3e83574465ba8bca70e7146e165726da57c7fa020eed2ecc766de9766a38da3c3d28c8e34978884f8e7061161f5cd08cc355665398cf0d5b59688641da51957a371348e8733a2b92274a41791402ccd680b7c89086da5d82a4e8d690b03cf8e96b522ec689396b522c834285522190d88a25f95c41bec015214a53574fcbeef7b7d59dea0231d5de61ee69c13c43dd0d687459fb8875d440f74bc3560e8d8c3770a7e7fdff781de47f273ca1e503ae848df83fcbfeff99a1e3e3f730f3aa60d7d0f4f44e944d39b8f1943a519c4a0a5e85b7a612a21bba0e91df07dcb2f687ab96516347d8d0e3a63394f0bba332267c6d0cfd88ca999313692451ffaa8a2cf0ee93e0b4a5c6fc4744d1f39d33575c29ce99a4a4cd7dcb19134930592e563527a920f4d3f75e414423c67206172a4bfa0ac82a6ff6414e413340b24cd0ec99a2e1d336606542ad154cb99f711326ffacde9d12f58f3e52d2fbabcbfb465842733b8a22510f73d62524eecc267eb11755ee0733940adaff536bbd8dc65970374f7ee71efaae5f21254bee625e6716c8ee0e69cad842b292452ca179e4ee14527a5504a5f3a0f4a293d9d4ea7d3e9746231a5c2b38447a5fee374d4a9e521dea26ec9bb874c6997584c29944ca8b2a2625554c21b862d60122c676161616119a5a04ea8952c733a0275a232e04562d027eb4cb5f7b5bbb9fec7d680de52d23a63b3e5c4faee3fec3b792b4f3b799ba5a4213f2da546d8d7734bd0d72ceb0a735ad22c8f98d3725ff8aecbb94f4a1ace8563f16f7a2e972cfe0d49a9116be84a9c4939f57050bda594af627af8897ebae82a510a87954adea97c435319fd894439059faeb8305409ef721e61181e0cf3102a794812a38f7e6af1d16578934f282e65f4e5ad8194d1a55c711d58d1a2533ea5903e1296d206f7931152eac0fd84a33777d1294b4983139d84a5cde987a945469c3e7a4aca1222119674747119faf0a245f8239c721a9d72eaa315a896a75abef21fa3af9c44f854c42d18e3fda2bd1fbbc01b467b47f1de026f0905edb9b0c8db05b522f28e72e98c0fd249701bd36c51f9ee217dc2305cf98fd4c3afe0150c05adf295549d362b92b52512ad920695cb3a935a49a93c45e5a3ff9072a5f2d37fa88c4eafbf7506f55108509e82e5c5a2092f615f12f1f68e7211ca12e17b789a031547fa7014671e61712ac8b282effb2428a505e4e510f21bc75e4a9987b079db236a41543b0fce9ecf7e73f4520f412f29fd067034cd1be8ee5d1ea42d8f7bcd43d8bcbd1bef204649969c38de9c60888155f4373b1c70ba620c5a2654292815f24a511361588253e71cfac454cb0adaaa97401fa55c57bbda759d8739bcaf8b3c0fed61179971f4aed154b228c76d9c0ecf37e88af71122d03547db537ae96b97e741e573687a99a5a452d24965ade293c7586fd93384e5ca7ee543c3e24b96a55410ed4f3f61ec98fa8578fb3a776a09268d0a1f45839542748a8eb202a27c2206324d3fcf658973145242424223f83e506f29ab9475081f773b91d0e56aadb40a69c95559a5acd6566bad95af978e13043ff1ca5a8720ce739503bf1024755f10e76b58adb5d6da3a2d290449a21b92ea4d25e0a4945216b1525a292d01a6ac363488f3a0e538ee5a8eb3353b4105fd0ef94f26ce4eca3a69adf4fb6aadb5561b869d300c71dce5aa8cbbb1ba92efc0e0a1749eb443f06cb752ce0ad5ced6b4e4385b3910dc3a30d82a652724ce7f4621e25a7b6c0eb532ee1c8f96928ed24ec14d8eab529260a044cb329c40470455eca089cc888c8217863082369c41b686297e9270058d23832958c0c38519f8a00290af9ee067064cf4e890a00a20a8c00a4c14610208b525b0960c22d051c31180a0e04815882034d2f209232831a48296244f7ee854f1b3d393240a267a660dc449058d23041640e1022ef860043918f2dd244220db411524d059010a64730a4f9ee8810f6f04a73304e11789a01a61ae7a624893cb58317c1df7024bedf49129c8c0932548c18814393d3890a2083a1ca535b72372395be3799e77d1a33a6a647a90a949fa041184a045bd65b81e998e1b0313a0887af2074cc117786ab08311d4a650820de7a3b92a08d1dc90e6445dc8257183e6b2adc209bccef33c09d499cb711cc7715ce7755dd7892c67028e8319eac114a62052862c68c1869382e67a3467042534c7759ca8076077bb6e07639081c8d56adc1803122b56470f229157451091edac04d0105609d42c206d13b0c0092492321cc10b5140218a375011852a8630d123b255e4402423f2ba70a2325df72d53e38697029c25b8400d32f081220843ba0005dd5d0c92c4099b85a0e3020e6091dc86d0442412e52d8ae10aa0eebadcc387829736f49c600cb32ca8600a243dbaebf2b62291c85e02a32a7e703feded76ba0e092250c1056950d2862cd874f309baeb9e284213bae36abaae3be20220e8aefb95c20e8abb10743c0049cb232eb881e6b43c2286266018913306d4099a6230470a9ae2528e2da7891541125c0e34c51d0f34c528274490044df129099f0442acdf77db36e8686ba555d90a30a1e97d7f8010e591254ef4bedbf2e8fa5bef053ed90189f2081321254c66dd8fb8a4899eb7e2b4a9360ec5d40b6ddea8ce3e845d202040406aa54550181010daaa3220204040e8988182d09916054281768e6021c93c8285223aa5e5112c04d11f0561404ab444185090aa39ae080a038ac18064403b404ae8c080249012f762f049d516ed6dadb5bbb4f2b425afbcbcb493b2935dd775d2fb44b5ebba8e9b1d91365428882118699347538c028204c88f058104c9278054d1719df7840b44a029361149a5529e4894770f997911b6c010f79ce8738a82007f02b13473bae9f4357526e594c5e98590342d5634097519a7396c49ca530e5ba272a96b78a372d89295af1cb6a496bad45c78933a6c090fcba5eec21b96c396d05a2eb517deb41cb66426f50d6f5c0e5b225b71a945e1cd8ac396c4585cea5178c3e2b0253b2d2ef517deb4386c898e8b4b0d86372e0e5b92d3bad46178d33a0ce8f64b4d0a6f7e18d090d428e10d3e0c4848d2489d2fb518dee4c3806c92466a1c2e7529bcc1e130a01f4923b5ea529bc21bd561403e9246ea974b7d0a6f5e0e037af1178701c1b8d429e10d8cc380c64bad12de8c8701ad2ef54a78b3bad4312e752abc89f19111c4cdd1624ecf15a12def3c4d68caf5e8181e74d8d0c0b545587d3ac9d05a06eb32bc61cdbc867a439e13cfe605794d3c9b17c412c294dc9aa00ca1a0040129a184ac2504a9a43328172962224a4257f4f2a6a233a6db53b4e5e2725dfebab82e6d6a3ec217bc2694780aa2b68f7e492d08a22b5b692657f4a85b98b389881371a36ca6d84f69e612c2a68621ee2238d3cc87cdc9c9c9c9b159624508c4bd8946c79311daba7948cde9fd8e23313c829acbf000624e4ececd27db2988aee8c7206e940d3554674e36b93ad5e48ade86ba9d4eb6534dd3d760295757df84383cba874abf7e714965ba996ea6dbed46a9086d5d7aafa8c3300c7f040d41fa5a1e410313b40c4fb6307cd1a14a877964830289c641cb2350cc74a9086dbd420e1c75e0e8ce6be2a9333b4ef70d31f52da3b78947efc837f7da88e20ea9548ebf661c4532aebc6fa06ca69be976a7be52b24a4450361eaf4f2dc39b57a9880612b769a6e94db13a83f289b9be4b339de283da27db37ca26ca8080c8644031d91282c8503c18101020d7a6e9bd3f75456b360bded05e5c397a4b41e84cd8535734f411e2ca1b44a2eb4c789341b135a17778bb3d610d0a9d4aedbc3d17c9f66a3789177465a911855667aa0e4a8d15b9571453a9f0262313de3c22297daf0552a0f688f448794594d0444809429d2d09a3774cee0d6f78bb1f3a1a09c3d70b773ea1cbd5f5d0917648a8be98ead1eb32bcf9bedd03949d8eee7c50f0e60deafb0f0962d8f9188d32f7e4082088b91bc739a1a34847a484a6f7769f887cd0f1deee139892a1a17bfddd1b4a8da395dce8283569464722e15d17bb5c79db307c0d8378fdbea6ba5caf3088a624213a46479410ca464754101d29aa89649540046520ed0b310884b6c23c4434d3f4a12844dcc16c99dc30474a7388b2e9466d089900303d993ad0d391dea69be82384a6414d23040ae2424b275e404483408268faf04f40626b1204a3e5112dd4e45138fcbd37c415854281a79cd1eba31bc674985f794f30fc61a4bf1086e3af9b6eb475c33088b6c21736ddc26c7ab2a3c36ffcfb4097cbe53a287370b9c0cffd72e5907980ff683c74fd950328f37b190641236faabfcbe44d5f375cae97cbf41a8d469fa339a437ea55728d46a8bf3e5fa8912bf3004b6110af1c46478120f89a41ba073802ef28f30027ea0bf19efa753f4320bed7c3bc5fd9c575d447a2acc675787dea4cd7fd2b8fee7d1df53d83f4e838f09e1ac749218cc66fe671ff3da481f7d4a38bb21a3364c0178d7fafd78c920c0d95f066e4c25383200882ae2fa35e8345cf018f5e5371601c35a7bf91f7adc9628dac43beaf5706f35daeebfac2bb3e141005ee7c2d2412b85e0f3f7a18ba328fd7e82e54de2ebced2ea2ce10883083d985b3cb77d447077744599d0177262a048fa385f403bc6bf41bc2c2f30073e91eb843c1bc71e46d35ea7374690254d087a77ebd5e7f5d863e70faa5bf8bba2f7ddfe87640dfbff09efa15baf29e4a68d471b4e9465b52b750476123660cd91c3163c8467431bc41813bd5f484ce481b2dd0b43c828526b43c9285271adc015720697ef0745873c3d75010c8057784f8d03bbccdc09d2913b728bb3b105997c1294157f440c25b10928e901d254498921b6ddd7c480d53f224c430201f46805dd944a6efc5f0e6c294dc604039148c697ac11d0d53e2c4270992264370a26d68e9c4108ce84fd210bf15e05532a4e4498e11f6f557def635c230201f2bc21b9812274a865c42989221254de82859b4dc9692213a4a7d6a325df7898847d2488fc6d178ea8cb4e17c2497120a6292a443a23d21da9be570b79c7b4531957a8ed64d28f7848eb4c98e666979840a9bfebedff857c399833b95965e7ae974df1993e9395c66a7340e1dbe458d83c6f7d53870fce341ea2ea7eac0dc101d9d608e07dcc5e0ce078f782f041d5167fd0074445d8637a8df68eb74faca1b47bf5cdf568fee68a4e32eecfae89f8df0663472e177a3bcc3f3f0595fd8868ed3eb10dee8e001eba023ca096dd9c81cb0dc900e6cb53ddd86b0d3290be0db81584347d46fd011f51997c1283aa21edeea4c4aae50bf469d46de17751d2e51aff11cb04847d46730e98768fa7430992c1d51b7214847142abbec9842f497a78c8e9f0ee12da577789b813717a4e95978734f7ad06c75ec0e1d2913da9a5568a969306c09135bca9684b6e690963a05c39624f959f941425b930c5a6a150c5b82c447c5a709da9a63d052af60d892267a527a8cd0d61483963a85614b8cd450b522b4359b68a959306c49119e130f11da9a5468a95b306c09119a892684b66618b4d42e18b644c8ac340b425b130c5aea1518b624884c9401a1ad29a4a56681614b80c450624ad0d69c424bdd02c39628b143da59e283b6e617b4d42e306c890f9d50e7096d4d2f68a95b1806f464490eb824c7096dcd202df5310cc8c9edbb35a1add9052d35c630a02643a3a120da9a5cd052670c030a12120931a1adb9052d350e1806c4c4766d49686bdab4d42a0c034af2e3fd20a1ada9052df50b860121f1e97c9aa0ad99052df50b0c036aa287eb31425b130b5a6a18180664a4666b45686b32d1528f18065484a7f210a1adb9444bbdc294265952c38084d0d604d252c7c03020217494347388a9614033c992faa3d5198e87a7c6eddc5ea0e9e5fe803c6181a65f0b5cdf1f0cf637832f07a8ef6f88fe7ca0757c7f40b0b19618e3727519deacc2f0f7de180f710f50cbb0b7e90277660cfdebf40df8c406794a831ce9417c32833c512157f42e7c9a429ec09dd1e939da74bdf2c936ca363a239cf9375f1e13a4e7844f9aeefa6c1cfc4783c678839a8cd0919ec566ea10de5c704eed3141b65e397efabefa245ba79b6ea599e9569a996edb7443dd3019b93112677444d9a0200a559ae1384d89228ea3522c259437e670888ef42853cd9a6a374cb51bd8c463e2311931d56ed0f0c94126fc8dc1711d6af8fb1b76e18ed26bcc3cc433f4eb37308c89c764847e9587ef8bb27d8633ff5e78eaaff4193c035f70a6f41aaf3cc47c830e6fabd4751ef2be3af2976d2eccfa0b4b1d1231758c0c8d1c36d51bdce1bc1a11536faf1603b644d663c21b94203abe747cc42841612800a9ef7a0f19fdca1bc0d14380dfa3d75d7888d7378e7ebd5edf008e7ee50da0c0bb1ee26dc38fee0b7f5f18e60da0c2df511e22cc436a6475457f886cec3f44b7f98f1cd9ceea8a7e87ffb0c936c7c16c79ac115a9dd921e7b85787ef934d0796ba2586a3d128c453df8bb820de22882650760324c6c3657813d6501421dad291f7d43aa4943acefaa703a30851145b14c4a9757ca3a004bd864a29c30ccae89812128e463da2fd467833e268212a8707332dbc2b8f3afc2b8761068158cfd64a0a57340f190442477a19fab0a2c12037ccf7550796da8489b03acc222ac4152d9da041117d5f35368c8aaea028ade31bd477e79e86ac697047d491395ade1c8da3c9688e76436f70872b32067187b76d633a87b6f6c9163ea12de9040d649a9ee483e534543a09c950e444e46894b3d1162bef381243f96680e0ce749d6c272eb040d3db780d3d05d1991c7f7d9f9cd47c9f9ae81cd9abd5e42bcad9abb142d7bf96a8630a9d8284f4fdd712efe5684f9bd6f110f7984233fdb9f0d42c25fd12e9d7b1a4b97fbd6c5e8f096f5ef767859647c280041d86275a1e210311bd515a1e0983903e42854c9fb43c428512da891ccd812e2c3547a323578443f2d3840f6724743d09855e2c257d455ace8cfaf5b00910af1c0a854e4441228f22a60683441eaf1731f5fd0b83412818a3a317c42dca68e548e00e1da7900ebf83d3928ea32a44922b87371b0b12a45f23b025864dee47e14d38a4e95d78ea17be01da1056e3a55f5cfa498804df089f84f0c9c68438fa8908e2166527a124fa65c1570ee244bf7e6fc320ee5fff5e58244247facaa28c8ef435f52b8b488a889ba309e90dee885e438788f23704711f11d3bbc714d2a3eb7828445b72df1f70e71382a8c4882e82eacbc3399aa4a1497e4623da2482781fe298f98d771c11f16649c7f0fabe468d31c3ddc09bc2601dd7016f9b04c788b6af3681019cac542a954aa5924a2412894422d1f77ddff77dcf2df9873c3398c74c29a594ce66b3d96cb6030c8920872418b6dc821229858442cb6b3943bbf1c6e8ac8650680af3e72dca88f11ff26c35a35728b5481d0197752645002fef62924675fa2e067246049377a924236f1696187963bcca7bb5d2bb8bed1069550e5be45446404ec902c82ff9b914fb21cf0ce6315b6badb5d65a6badadb5d65a2ba594d2da236900f1bd1ac0370ee29b45cbef929617c919025cd28c97a7b63a43801c3241aee88510dd204ae2007258b3e92ce56a63bdc35a5d8dbaaa60cc614db29810b7c85693c9643259b5d9aaaddaaa4d666d32ce56ea624c44d1f7893ed127fa449fe813d96e58aba3b0360a6ba3b0360a6b614d24ea62a22e26ea62a22e26baa814ab33f78a622a754bb15b8ad93ccfe6d93c9b67f36c1e27eb3a4ed671b28e93759cace3641d27b3719c8db371b63d6adbbde337125dc9eaa4647197219855558a485d6cacf1cc683c2b2b2b2b3cb459acead49d1a4ba552a91aab3b55a7e6dc84866e2c2d2d79d3db9090eda7c7e7a7a5a5a5e5c7a7a74667341ed18b172f84c0543600206e8cead01d1a73717171a131ba437568ce4d68e8b662c58a15b72121db4f8fcf0f0b162c58fcf8f4d47866349e162d5ab4e0a1cd625367eecc980b172e5cfc1702cfd8dc993addadce0071a1a12d6f23f8fff0bf5c081c04964340743f754688d32d7bb89cf385c0410c0008dcf1d499039c0271037c8f05f8be3180833ffce500bf0618c502e08f27c08d97bc5342a47ec85b0ce203c0b2aec6dcc580c013c716e0da08007f3e50bd3d30ba0f55ef0f8840d0853e707a1be1fdebc01d82ee9f07de230480b97ff787ff80a50e00def2c707bca54f0f78cb1e18de726807de52684f9e3d67371bbce7d0a63c9bd2e82c07ded4070078d39e1a73e15d7568f0aeb34aab3c337853a116de7488dea8ce0e8df54c9fa913eb625dac8bed2eb6bbd8ee625d6c77b12ed6c57ebcbb9b17f378bc1fef76632c78dfdb16c5b68867a7883011e2c9da624488a598a647b1b6ab77582342d45b14a33f177bf8266b5dacce489b2124a079946c3ad3e88e98f6888bf3c3d7298105b3cacf075442a441f45e0cc4edfdcc8aa74689f968ca6594585d51a1d8e781134fed31a123e5bc6aa7a494f3481b477b3f74a4afb6eafd50bdaf0ac7833a54eb90cd123f50a15921d187b3f57a5de5113b91c8c34bcc91cfb51608e2f674c4d1a8eb6a1dbdaa0041b2a8a9666ac2d4a302846ed48954802069a4f77badb6956423fd70b604e226f9785e87a54824baf77a6087e76834b217553be4bb879798aff8621f4b74dff77dd67a3e5bb0b887e733c2a3203a12a22325f9906cb46593d0562531b9a9266924ee52218765c543bedf6c3d53eda607682de7dd51d0ec0e82528ab839e79c72ce29e7e45eb90254efa65afdf184d0192f8f82e88ade7079648381e8d38d44076fa727f6308802b6c47aab2392c03ad22db1d6a16aa3239be686781f85371cc9c746f2912c6aaa55ef9e4c9b6a9ecc14932c6aaa917cea8c779a7d4cb54cf2a92b3ab2f98c6c1d16d90b76f86aaec39ee6ec1d553aa568f49da6250e96850e3ea9da3372746d319356476e1b9b59f9b63297ef6a6bb17cd7a016df5568c5eb0d09caf562465b52df224de9574b2f06e256a15999e7d9a6ebfb413589a6209bf6b40b667163f1848e2d745aecd421af65566b6d915be4c4c4dde2d682d6722ada1a5a2be935bc21a1e04ea7f01017dd6e1912b2d5550b91165a0b4fada5c7a5ceb8684173d10411d65a6bb9cb715c7893f202886c58fc9393ce39ad96e991ca9c2f88d055cb3f518b8b4b8b7d417369c12f662c5e3f318b544b44dd3413f5e65dd1bd37f589ab76c13927fbd0b117b14a11baaa5985060371b7a45e6f710af4bcf026e55e5800918df84f4e3ae76c69a15ac43e9620a1ccf456f951f15171c1f8869fe4acc05927efa8d0ac56a185a47f1fd811418ca13e31ca697883d2019ae7b305cfe73148f8c50cbf48e117b41788bb65d6c2435b3322b485465ba8d7b714a1adddc3c63478d4abb4e28b59e66969c92d1f11c4164644e14d8b1a1deb1444eedffca6aca4163c2d8a8c462d7852a916455a18b177c159878ef52c382b41c7fa1638efd415680ad2f529dc82a705adae627ab7d864ba7e4505b7b0c02da69e3a23aba947ecd1f52b72cbacae5cd0d382465b36487bef2e5b667404226e9596196da1bc5ea5086d918c68d337f862f682465be0953457d74ca32d10ccbb471dd2e159de22e24c84aeea3fc982f3ac05e2d4e1770e6199081debc3d3695b5c684d0df1d479465b2cafcf44328f666179b621d6215d4377e6d15514def4a8429a74517843ba88a54d0bb642a215d2a914c64015d233f3b04ffdb3795721929e2ddf2d68960cfbc54cd7995b6692c502d105937e88750acdf2183149333f2d46790b2662b2c488e98a72195a9b7b54211d1e855657f5f7ee169dad42d3f52ab43a23be5e8587b6c0d7af6059572a588e6e8a78141e220e5d53de5f92129e92652f62143b43d0eafd2551b1e97a51cb6cabd05a664458ae05ed4a568d6970468e0d3b1a326fa74e41d6a11ad4644e4be9b5e08a5aef8a3f859a33855a71ad056d8e6a1cbfe22be614e7ad4346ec783be2ec51a9e791e6afe90530226030989c13074f09abe321e1215179bc13549e09d6daa3de2a0dab686badf5b6a2a445c1b5afafb8a67e7edecbb2bb0c1db377ef14e58aebbcdf9c392ee71e6e1c6052a188f92a88362f200b414735881b9443ad2d8524a0b7f411e2c8ec89dea2a8735c70e448ad76e486463b7223931db9e98e0809dd6eb5a747b2a030e79c74ce49e7a4f952f094f04e1086af524a29a5d40859ac4a2aefac4cc8531c7848e87824b0413f440f09cf87e7e3082b10b7c7d315d144d8e9d1b4fcb67a5bd21010de6874596f3647cfbaaa4236df75a88e540a1972a4557f5759cd779dedf05d6939be2b0f00beeb9c9b0ee1f8a6b71bdf3567e6bbeab436a5511e5acbe19bf6501f996f1af33d6f33be690e6bd21d19df3416e3aa397b5e7c4f1f18dff3679c7bceb9e70e9e73d6627ece39bf65f494289fa177a923d719aba3639369481957e77dc59abcc51d728e3c0220eff1c64fbd57a4c95b4ce1c83bf51b797f26efb195777aeaccbc36f2be628dbcc554ea39e4fd9146dea34cbe31795f7146de628a9577ea30795f46de638c4c631d8fcc2a6f9971cc7b3c8cbc9f7a91774a7cc95b54e57b453195fa3b1eead3f1509f6e68262333aec87bbc4bde4fb5e49d12556aadd666a9eccd6acd9bd54653de32df3f114f1bbb53677c2c91f293cae9ad12b445c44da7b7275839bd4d42ba566e5647d2943ebb591d159cf212eeb489f4434cf97c2a954ac99c379b2f61ab5570133d2fd6a153d529584a96e984a536a570909e5fd9829e221e1ae2889cec914c37655b094b2d6dacce0efd179e0b6f48d9861866142cf58d3a6365322bb3322bb3322bfbf9f9f9f9f9f9e176b81d6e87dbe176b81d6ee75e514ca5cef5d08ea7aee87362f78a622af58f238f2723338e7f2a258add90cebda2984afde3e8cd401688f3a47fb25b63b61f4da7fdf16c7447cfcaf57043d4e6589e8e47538ea7ea6e48d3dd0d51fd1d6481e87920096f31ccf9db313ad77d5443531dcd65c0ea68eedbcadfab65c849ab63b344cd32d45be9c0ca3b77b4504f04e2b67ad251d44960321536ab28526bed8a9a4ac10a206da6978239e7153e5aabd1689d4c76df20eebaa367f7062aa3322121daed266bdd1bc47def9d9d139f54edc464331a4fedc72634446f393ab2198da7d6e323748774e66c67ce62d396a3b31393cd648646a1db523fd447fadc1e991ba3ccc7d4c594587b9010e7ad3b3f7aee1bdecf96439a5239d45199509d714276daeca471b17aa31df5a1361c12bbea4c9b89f7f56ced91ac795ac3269f8c117db40b2d8f5041d35f4bd4719a4b7c68162d8f0051a1bfae04a258a3638f87842b11a12d3aba8cf20eaa419e3ae3c31b0222b283a60769608db69a908141c98c8916a4a629b5994d330c115d86b0254d3c247446f48f2ec2f982f7ba8ed02e51086d491d5ed72bfceb77f4ba778dc2f0baf0e8217efd093c5494cd4422f78661884521e2ac465b74f4108f6638c235958637e10cba978a3291465b6178b1165e6a712444472aded3d6d4f20810114d47e19551e468ace51128986807e8308a21bd4f464c333d445b281b6dc923510439d1b40c7a9f9a1c8942882e6979248a9d244ee420475f4b276e30346ba27168e9040f72526cfaf5bab3c82442c7916d1434f21925d174c444c396d86802a496a8a44bf5b6a1a0654aa19101000000084315000030180c888442c16896e4a92afb14000e88ae56704a19e75918a31462c8100208010000000000302232d20000583d0b36df0f99cfac998599ab1ed685ac3e8644c2e6ef001d68853ef40aa78697720d9cf6f53f50b7e2d32f056906beeb23c85bef01bd2001700f060509a6f640384810d883b820814f28a6b69f3271caa4fed4a94c8a4f44e05adbce283c2a6b4fe02470710f6d5294df6aadad471165bc8faf40f7ed4424b37d7d0fa87b53535dde4a90d62e3f935f4f0c9ce260fb312516a78fd8a62f1f54f363ccff0ae2fb84ff77ef2ed97b3f2411e07e07ecec33aa4fe6ab8b29ba5b316d7612528a5558e4779d3fc3d904d6ade7249d7285ddad9a92c6b2735aeed86de3b9083368adda9a717f725403c83ded04a94e726572f9bdf2f76d37f6eaa4d283ccea36af51f7708354a44dcbaab369b897a4a293799b2fd92f0fd2f8bd7cb37baf345e31ccc7a8201c8bea69c9cdf6a03abd2375e1a94df3d121a7de508dded514115a7402a65e54a2170904ec3a327342d38f27427e884dc1e9e441b8b5da743528d0743468416f906e851274187b0b1efc123dc5e57c86fe2847bc8a3ee5e03c85faa9865a742ba28cf6f115f83efc869ad9febe04bca7cfd033b0dfd780b0cfa963c7612292d9debe02ce7dfc5cdeb5baa86ad79f474334bbc1b381c40b3415d5009f52b1508c5d2c98848b0fa27d0a0f75bd9858d27085094dc69677bcb084f0543ae52eeba43269eb8c0985b7cc761fe0a652f36bdf6373ef0c780e0e7a4b7f3cba67b853d3d686b765a65f2c0054820aafbd2b26c02c2ad35e4e129a79f72534e4f0452445852e63c3855dbea5b11c4c539ee08855dda5189ca6533ed46a27469260b8ce6d32345ff5ad2a95569d49e2fbf00de00eb6106bca7508e9f75c795b39fd32c2ba4b770a64137ab84b57f4823998135d6c1975d05b24dbc20228e94c60237f8041c8a2df0f1198b72dfa46be4f9307ef82b963c95e75a7024d75b3d4f7dc08304f928c02ac4ca07d556ad7b9eba2645f80590f32b27c020fec1ec4e845dd1a7845c84eb43227689a688517a4b905086f9f8ce6809ee0c916fe08ac9b458c4d47d395ae8d648d3ea7e64be44ddbb8c003717416281b03d683d96ee3bc6e94296463377cad607b7774314669ed25ee4980953567bac7786f10e2383f601af40e9282b71b0c18d72bb8443901633302765b23653d61709ffe158cf20e9209341702b78b75eb219d11a7df3d7e6ff7f1703e0b8f9008e637b3bfa5a92d415bc4b94b54d36c38fb759bddbff3aba608e2febbe071fcde357d3d63241f924569d5f6a1f193faf6f884d7d0e507ed049cca0c4c14a29dbe7012119f94406c81735604233599d9717778835abbf58c81e484bacdcec8205b0aa17926b165eb7e8f3cb0b56ec33ac9a79eb48c957617633d7c5186241f928d6ad9de83f09ff2f5f484d7a4b7d22916f546fe4324257a261fc532d789f89867d844c4cfc8a25ae03d211a9cb61be5b01fdaa83a1877e14f07b30077d292deba832dd69b801a610d28b0f2e4a88fbab951ea8660158883cccd46b53f7f939bac1379f6d48c7a6a6eb205386cce4dbefa52ab69bd37dd08a9bd3b459c34a6c7004f1fa2725b8446612566744a4d5bca4ca5e750eae84ceea705a7ea24612a321bef4d53bc1c3a19312dd1489d2005a6453fd1f82c6924a301d81254fecec7835449faa6defbdbe045481a7022460892ff5e6a47867b04e962d78d4b12e0c404f8efe46d459bfe61222af788500ad7b96210eda1e2d23e2e07a808dde0f99e03ad4e84734f5b20afe46e91b46521f05e45406ff73922f56e2ec5c830e218215616070cee4108b9b66f0dc87be2b0c564445c009ad837d38a8b0cb6486fe603a9fd0172136268ae270c5295830d33bd692c388435f5b1d0374f99d0fcbfe788d9eaff1ab45283e7cf1404c1970f9a89357f26524ebded67ba32b0ebff954ce9f50f21c1c9cb9047bc98e75d27ae7c04a228cdb4560976670524a6bc7b6789ff3b4bb6cd9f29f9f02c4b8b677daceb429aaa6722d8ba0a49d6a5990cd6b2fd4eceba0e736978d6b646053e41e2da4a69816fc4a09c8c2710e614620f387cdac7cf5378f46ba737e31b97a90d5400fb6d82385abc31a3423455c94470c0c078073afe3132391d8b6f7d5398feca8c20aa32f5ba7cf1789cf6c84954834e6a8c84b17a04fdf0fb32b127242be11f214b4f6e8b59f873d41832403cec5eedef8e2af5534d9c447c951f39fdf10b3dcfa3ba3f2ae4d5395315cd660105f116d8e732e5e1d2193e4133b5955b6034b02114157bc64ac5b8701905bb4ce31e6b05418649d489d443e3d22630bd3741e0723e6397a95db0d592bf6b274696e32748004b62cbd44c6ba1822a74495943bab2e09d4ef2f0f59c875d6028ab8a50b131351166ee1b752f69def8841796dfe801595031e594402a08aef3e42f6c18d27e2c57aab5d72d35468f650c0db1a6f947dd815ce4ba91644bf3d6ab1ea641da60790d1d106c619cf5d4aa6148800325cb4416c6faee9c631aa8024cf44f7eb1ad5b8c61a7a89b99d5d900a7066f0cba2ac3eb830cc1875006375b216b42811d984ee739bd6a6415fe4527fe705c5a390b3368a6d2abba47fa69332ce61ceb8e70163c32ca5d148e0f7e0f5e234d48b112839d069a9a64368ba5740f871bab7280225961b52a7027f8c0bbca75909e084cef01211e7d1b9d27f42d62e51819c84fe406c80900be88bdd0611b61fce8f6b3b0bc7eacf05dc91b0dc1a60aea98676ed8d5617266a176078c0ad8475314b43fa9657894e32a87f8c1f56435ec6a7c1908bb61a2fd1e0356a3a087e52d2a3c961660b73728120d1ea87a6e6f583e7a9fd99142ced849766261b5670488689bf8e3e2d21a7458eb2f1db46fcbabe34c4f23499f6f7a38416ef1d0d5093978c61e749801c99b24e3c25ffcf36847cfdb2c6779d285b78a5f676f7205e4cae0e119287572bffc5e29af427923480f8de0299d3142b5aea9617292d4eaa25bf96f9f91141090c03bd8fdb00cd870545ca772a0325da23e3a6ccd3b351faffe9df17a879c59d15f54432f09336e90385c2602dcaad2fe70a90b1e2dfd063efa7826a96a62d60dcbcea1e2ba15c9f96ac8498509fd02c831fabf4028e824ead09d434cd5ae0272fb78e11dbcac8d6e54ea62f536060f8f9f6862a1822ae58aaac50d6243c1c96c6316eb0419cb0d7d9b729ca6cb28772a969ebca6f77525d0722d6de821af90eb5213896ca2f16df1109baf14b5a31a308381ca5e3c494ff1ca829957441dd3e0eb94ba43cc012c8db98a5aaa5e9fff0b500bcb816c1bcedf574c545387a59ec0314a19654ab39855984029ff70dbfeb575a2d26c3631d30ca3b5ddf71f00a0081c64a34db07ab7bfe3b38696397b0f7f310f37db4fc3b950b1edc96caeafb2e5d8f9e9d8531f7d6647cc96a19d66fd6514820178abeecc6478fb0c2d11645293c15a9011b9fd868d9a14978555cdf7523982f761719bf049f6e2e0a997cdd7c39c837dfcc85556335156ffff40d647ea2415ee592b899d738c892a735c756ad1364bd0ff416b865610e1a30484b2dba72ce1e34c85a1008d25a261346b30413192c7d7aa4a4bc04090d0b356b028fc4a34d42bc2851b32e5531df3380ad236f3ccb0dad192a56b107f3bce687b1b2919b1df296ae8575848c404a8de81561b4226541babaccf80bd2b4d9475566f746efd4febd12e1c678b677321ed385a9f0349f6072d13f9281456f011544044cb16a49dedafab0845796b3bb9c8be341cb465935b28d3f4bef9376d7de0d220e97bf365782f377509b601484e7ab34ae3eb05e17e2530efd860040b5f00ef59e9953c0d1092717fc86de15f99ae00937d95c9dfe6e0696dca8a47e7c8ce6763c0b01103bf655d38622abbf405d09ec0a0ac1327ac5358f236e9e22c404afa82c78a4e00f7987c26de82312877904ae56f87fb080a1017bc5939c5aef68779965630cbfd2bbc411e904613e5c6d8c89cf5b818dbb3a58c89850affc00efe1b7f08efb7f825ce2724a9b3a609152fa96d52c1dcc85a6efbcb88f2df4200d7a6b37454be6bcbd165f8f5a20e7d912377b53482be8bdecb11dae5a8db98770b43797b46cb7de00414cd1a213705376d73fa5f8d825577005bc28bfa497efbe3fd150a8013a9afd8badb31e9766084d134c9ace3136ee062fd3f70a26291c463ffb080b05748b43dfd543a5c85ed331ed11d48756444089ac784811421bcd25956bf957514250f04838ae82415b3e32db20203fd42fb50fe1e9b5d6df2ac05e1926470b1e95401b8ab331cfadccf591013b2389c6b3ff2a2c587b9286a4a1802f1c2d25de429220d417c402f5d889c91190284174c8649cb0606b7e2c50b4acf8e13dc3cf0fd872e5ddc9cbcba140ccd08f57cb6c620c99caeac66e3b96d37954c8e636710258585cfcde6e567a8bdfcd09af4aad1127abe3833306a91511f42bc5c1b39db15196a24b722e31ef4a10b5253c07322efb6ed810de8dd379b787daef144d7af338180635a1b8d9698142ba16a9772c19155fe9c4f75e362ebeff429fbf4e0f9cfca4084531b0ab162888f8227b3b321779cd80041837569427e7761bd250249ca67d77563860c80401de14179932f77893584f90c8497ebf03c4f33bea15c3a720ce5f8f5975da1f6bea8e1725f709e380dfa3cd9470a041f9a895e11974d8afa5886ae9e275c2b228c880dc798aa206eea2eebb5dfd8b0585b2519983aeba8891b0edb56185d39a8b03ba003e43044abba1c4ad261063e6efab90488aff45f83a2e027a4b6dfb02459fff0f4c0cd528325cf3c92b49d06a57175475646762b3512009caa4fa99272201da01d7a108a0a6d76f181a254caf9537d6975a9e4f6cfb672e6307270555daf7cbce66f88c3d89fda3e8911b4dd368d823cb0b6ff963d7f9746e7f37516951c4920706ba5a338f2795412f7b025b3d1029c2f7f98ec1e722849441055a64d2f30bc11bba8911d1f15de09e49ef51f46cbc457bb965b1dbd6d6c074b611c852aa0dae67b39014c4566461ff42555a4c80486f23e89db321776ad75c64ba4179a95827868e6e76008f012f1027f76a2c62f7beb9880bb4045edc808dca32c10680997f327821d7aca7fdad7e084085428327c5a7e22767fb80cc624df19fe4b4dde756417ab88806de14e4a2da3562e2fecf2c1de217d44026b3f913a05cd7cff64c0ef942c0464d31c8c2288834be6ab8590c54407b29edf8f31f6fb3976852a67197c333e25eca44f779a01d67575c6bb0e7198bf8036886255a6311faccc83ad7cf2287c44ec8d0db6f412de383a63831c5ba74dcba81241db94801dc788dab6791693715f439f7be8fc44ed734703e959dccc5676510e5ecfc3e5c50473e8e1df9489b3bc61a4207a2916683bb8c7e23c22af446b3febef9b1ee09820ce1537559be375b4cc623d51fba12dfd1d3b1a24c698a5789028accd69d7586f4cb034a76992cee8dbf11e2b6184e38d1402943804cac4148019738e5840037b2a155d67318494783c3d8c42e3f6e34f5e4116e5669ad74a0f7cb29a7a41e39631b1843e85c0e79c2547cfec68c47c31892bb74f38bd0b74624de1344929ad6ac61efbc038650611bf7c309fc89c2397072da027c4e4cfea63ad910bfcf97b1426581a58d8a64e4cabc8dafa4a9959dc0ccf0476dbccea28693dd56c47e3ba998b9d92b28000d554f76c3374f2bf9df55d66b5f4a0be4d971cc80d0bbb7b91b059eeccbd04888a2eccbdad2eebe579cfc8124b069afeeb745b15e6508d1a8912336d9c7f1cc0d261b412ebc51b4b5a1738562e31ce8955ab191807e8db5513736b268508d8b4970ec5ae99cc8dbc65ca12fd8f9ba8a4625e9aae70ee3c173bcf1589a3ea044095a4b52bfad2b1585ab6e15e44ffe083cc5f169ba57760849c87918858fa66741c9f405ff9e9423952e242caeecff62d8b332ce34c18b7c2f5d03844a7e27e9802ae64b3665c3adec24b53f58d1884da67a9cae7282d975d51dcac6f9c6ae7d21df516193b61fe9585e4279ebd48f7d400420f2e6763d73175967bbc280a8a749be93622c8c53a34b43a32b2242c289a6d3f2115706dc70ce8b133cb57ff07724fe7ce277f345aadeb94a8fd6c09682fb9fe973b514f870bc8ee2f927b913bf489302242279dab63dfca8839ffc5e59a2e17ce59a62b256624dfe6afdb6c96916adcbe516a5e011d2c1167ca19d523146e293e0ff5d3583875ef460717fdb159ee96910ff3a00a0c7959beae6cafa5d063f610111926f864868769d3dea952f18b745bec7d2762f23fbe8c9baf21c7e789065169564c0042cf54963f4e5f82d981ea63919f20cb3f321f909b281e95455fa73539b7a82cfe5de03dbe50107861c0e6adef9e75be644d8727c92abc3de4710c8ff2c67dfe553c0aff284900edec1470f4298baea0a2ee3e2ea89d1fcc67595f21643501ddd0562da5511d49470ce6adb2e4c17e7aab33ece00cc115be36e83afcb20b1a74013dd6867026e374f3d008a3f21ddb565bda8b8dd01790e80e7455beccc9bb79c8bd2fd2b00e20a40710e9f4cbbf7c73a72ab1a8f5280fea760bae1dcc037e6f0e32bb385873534abfaebc967a51a605bc5ff2ae83273e7a6649563cace9a417f1852c13acb25e5b4d5fba02efa1464f5ae012d5ba7c6c85fcc13b46b2b33eda8257dc3ee8e05114ae1474acaf4c383019de2883125cf694061470f0426d7cb536781db0f560637f9915288cc9bce613a2d0210da7a44d1259a38522f16337c66534c3bf5c4bf4788d35785bae155bfc42816e6f5e3285e8ef1b986a56236579ca5920d45999f6e51320bb3fd0047f6b405bb4f502c8f82621fd06b27fe30870dd0f50f556087cc4edd7d7daec16a813377ea7b0e571386d11b2b27d0a64f707e9f36f136f8d961e63227c142fc7ac92385f8ed964c477c1c1567648afe4100ab2c8724cdaaf9fde76ebf80756084b1b384b8fc7ec98e52bb3320b94f5000123ab17b7f85e3726b3d855de3cd6424b7fee8c42a2679466402b3020a721ed9c6444042d2ce6f0744267e49e88f9616009a01b193fa8532e6aa0756a930fc6635f62e4324ad10e2b0acc525a3a5f8521c3146803974f6fa1f7dcfbdb4141ed2f49d121e8b2bc6528c20babce58461021bc515f804afe3ee855f9bb2086e93acbc8db9789fd4bf6f59c445c98e90ebb6fa3c311177afc4912e669852a84c8f0dd983750605e1166c7a0cbe11373db8db825f095e66c06d470caab7ce0989d7a5cb9853b1e4c7ab1a196b7ea22bb40eedd534b8108729099a004c06ade9a381064c7124463d2a74f4950705b7f95a5b85981ee1f787fb3558abf50d2a0c2dc9f68dd0e57d3b66c3a9fc51f080270b5b7ad16de82995f4c26f2dd688d6ca334fe863834a156b0c256c68ad64b611af5c433d1279a130313f7ced673c58a08c3aefb0558f25c33f54db69740e72358ecf7a091c49ace2a57bfc3b5b34758248a58b4be606d27ee1eb889a36e40be0c98f32d77021e9acb2c68f79c4126ac2d2ffe442e3cca99b3bb261ef48d646ff80b17f16d0842a475bdc1284a935e7890b4ddb7100a8adbe56511cba3e1f0d01600337d57b3001bbd270da3be018219cf4dc7384b2619f305a965091d248c06db0c492a6825b02deb32476e57fdab544be31344ba0932d28059e709029f697c57fd96d85dacda24b305c877eb3f98524be9f40cfa6e14da0c7e81faa5a027ddb2553dd1b5d44789c339f2757976767ba375c37c541137094f72ae790d711d09e840fb1550ddccba4624274883bf8e08562a2156972f9a08d19b447c1ba0cd2538c8e0cd46dfd7227020cf44157046173cbc7a48e9993247185704ddc2fd0a5bb13f26854fd0faabf02256184d0c0a8602e1a60dd6a47a11fb437a6adb97f66a4a18b8eb1bc000c0400be997a9072ceaa928112a9ffd73422147a65dff40ebe8dfbe5a277b595279b5d02bc220f4b02ddccf5153196b913533fbe316307b42f572cb91b5a2e7f22a4bd64ca3787885b8ebdbd9e349b398b3d6f2d97b4b80da6ef14bb69e4d83562a79299d56e679c26f0006e0336badf3716a2d8d4da55b696142c3b9c240a4252ad1156b69fc575a6b57d5a4d3e102cd8958b03728adf921e62e5106d0f061f3d196d7f0a0bd2de2ab848b88bdb4bff5f6025053f75cf926de8b441d5ec098db645719aa8274f0e96de8607408e85349906e9cb3625f2ba85615423c95d9302a121308bc9c042d0dfcca6215a3a02d8e96a02065d9e4db00cd32ecb5f44c674e0ebc330740958bd1559cf9c392cb4688b1a62b5d7de555d75f92784ddcf63b9ddab84a53f2038854da03a05771dd155a8819a54dbccd9ed9ea420f0f696363dac82e71b99ea15511da80a41bf04c2ca161ea806989d55ab0e17ec32ea1390c314a3f80c4abb8aa2aab6583c0c8b1b034d69bdf2813c21549a96b43066b6d1b84fb066aa07920328a6ef4ea1292ab26917cb9b481f960b2ae49aab79f8da262ccb203cc32c52c950c9ca64fb00416a041044eb80e06c0b85c696bb3c21427cb4d8edd4e2c44b6fd57ad7031c632a9ae519a18cb0910d57f7a04c5c6c813ef43121054d140d6bf64acee56f1ac95249312225cf5c22c5dcc56f1e04de1d1c97dd7b8e463d12dc796aada4c48dbff2aa1430715dbbdb78537ce9df978edb3e7c5ce34200523684d2fe6242f7c181935dec742dc1e2a9e6088d443d38081fa678478100d8da0df944cf13c22a8fb7c0a9aecbe65f2088918a9ba36815e8b743f01b0f01b6f90d6f6418a6dcc5c45c51188f6d859b1cdaea0b7c5f2fcfa879cf8d445cf8dfed40fc574fc1441b694687685fef04af1a530bfd07b3c422a0b22458f500f46e963e8dd49cf4f75ac47b0d4cd11c5efe2e96358d1399da8f9a2549f5c111556a7d588dbf26ffadce21b0632a08af7a838ac2f4be13154829802e819be13e8f87b557403e5bedf9cc70954fe8f8ac1de605705066991aa42a3baf355fb13ed5e684fdca0ac9e3d6120099c9ccd5e35df20704044be53ac530a6f0c6b3abe212382c0a2082f9c09f433d13b4c10b252e4ae47d77bb74aa03ab618c01a53314d74334319c67a88c9c0cbcfea291d847a2cd48412a49fd83c3d52c8f15466a95846d35b5c1a9f14001f898528cb1c04b2b930da0d70a7d0a1a9b34beab0b1060547d66063c1c3df19e8fb9c8d1073cf56cdd95211cff155c502705163a67900dccc901bb874ce072202259d184da3ae1f949df6b28ee4b746dceb00395ae09352fea439865fb9e8de03bc48ba062bda7290a50356991d6e1b56a31b2cae72a3c666ed652b417e6eb141313f671399de6985130801776a4db72b781e52bcb49c753aecadf6c5ea50cb62426b91860d1b1f4598fa3948cf629d51559e29b01edb632eb24e160c36b3a5aa147fd969b6857016f75f1868c1b250c10a8c02d551ebcf5c486beb340b8bad747aa1b5bd662f3cb75c8f85f896fa88179a3d50fa4fe352ed6fe57afbe3b931fa9b2e9def3b52bc6ef2553c4b4e18f6bdbddda6a67795087875f43efb1b91b7b9efbdce237af57abc9e343f101a5f6bf2da767353dd520cf39803bf762dc562bdd942ee8d936a34493259623f99c04da4df3c107a5962bcd654ec544a95f66c6d1e00b0333eed1b781a8b891c71a41a7b24591d0f3b02e771ab2e5e4b76459532a559b10442867b6c52454064cb3ac53934cc6d4d0a7ebd27c299c99f94e93fa80a641b4b552d16e4131b029dcc6ea1bb7a91beaa7fba7a4a3e09baade8fe02a523d45250566260b94371ab05eb9c922d043f33841ae51df3fa2c5a6c0d846c50feaca3d6ee6efb593d15bbedc7eefc27ac0f865f55a1902345bf12d6f1ecc0bdf0fb0d946111137543936608fb5df504b060fdcebfbf48cf8b01cfb8abf3769e0b6afa64d5e135d937ddf4a1c0a83d92cbbb9a08ae8522e7d1e1291c1739998efad40c3bc8ce1e258464374eb5aa6ea5d481546b30c9b64d62f3e6c08f2e71fd8bde263841ebc3ad7a474a2056912e3a4ffde44011c5fdb2b55f430ef37765c7902f63c602ed1af73a0490cb652c182289b1807ec3bc1790421a2f5f088770710d6e1dbbb19b0865ee523b6ef41a0cb139bc51cee61c8bcc2ec8a7b72fc824d9613040c349693fb6e4a4e9c5615f0072167448677f4f0e8094498ccfc9cdb53c85a9f382417dbee8fbeec360f262f1edc3fb62a0629d8203ad82b0cd121d3c111d9aa58e9d70a1d6f6612a1028cbbf489e61cf16a071064b70f64cd8f486a716e0ae2b53e3c62bb25b1d20d589d6ebec26b9f89ae404bcce76a7d04eb83f2147d03bdc71ea7f2dbcf65c0b1630702f9004e39f6528b27a4c5507796d4b1ae10d1a3a94bd2be15a53b6e85499ad41c9d3f6264be9d38feaec2f13d23c0dc55827a3a27cf2098f1f9eb644bf3e0b0e6ad77d835701d5f9b6c56d1da613c2275289157fb0b1d97a2873e02f087e8bb6113c4f2ee064a6cfaec30a4e596fcc29f6bdfcf14c4c7a025f9aa9d5f4e4cfb86961af5d13a064805c58d9246809bff9150ac134042e1df65b15fdb593e6ad3d806f6ef1bab559b9b5a7de321f22eeec06c5563a3ce2ddff86ea3e86d552ab1f24d59a518162641bbe1f5d50ad82421c33f6baa0e44c7e9ced0e86e183910dc5b01d1dcea0fe158a50ee590de0f2b3591cf075339a6bc308e068004441619bf35d0c267a3efc0d347e83e0a259792d69e23e80a61d01526fd2d28b90f513ccc596b6b0e282bd4f52cdc14b58dd517898272172ce48d10c4ae6b42528502ae77948f2990acd4531908013dcb7382beae573c2c738a423d610c9599b625ea6cfa39313b296cc05cab42d1d61236369b7940311f2064680ee9679aa8d7a1f7734daad9618a17489146dffa3147fa563cfb2321550d6ea2a7b6f18e8fd39f47d40f78d07adca15bb4ef993cb2a40fdecd742407648a321625513e0b957eec524352db0456efcc6d89f647d8c7f466db3fedb007c75313b8680e0ad7940b740ed7fd41cd4695d1dafcadbf602d0453c9fd37b927a189008a9498a724dfa0e330f938409aa5b7f002d953c7bcb386926bdae35dd5a9345efbea1c2ebf0592026c0044db5ef8bc2fa842a7ccdbd3900c6c796d4d734a79009364cc262a06a64b03b083e9c1c042b82b1a1013f08c8325ba667c0fe5bc6bdaaa5888766d498282c4388f9e1fb6ae834b5be4c25224d86500f3022f88377b53406f653fd502caf24f0649230e91099c9a7d6ebb4356b2b6db5f750459e2073a4a354461ae86fc0fa89bfda390c91802c0d801fbdb380d6bb474a8e46446a3c5370213fa94ed61e56cc8c0d5377251aa39f47d34022adab5b24f30a44cda6030147fa7cbe98cbe8cd84f72db9b3e6f65b6aaf70a9495297bbc590081dffef67372b105682dddf495d3a327e877bfa91b31b2337f48bce95542e9fd506073640a876901913c2eb64b8b238f00a7213b2ffd21ad133fbbadd8efe130c31c623310538e624830bec17e6a339c340fdc85610511ba5a1f8ee898287fdfc078176223106100e9f4adfaeb6b4bb5ace5e80c2018fe9d9c58e0303280e87431aa49890190055497af0146d60da80de185d4f750774c903e326963373b31ec47bcfd23e76f1f8de78a48bb61232e86d98c1e2c25097a035474d4ffc652b341ffbc013dc014df1d84e9d0a2e218d9a47cfa15d0d4b0a1a972d97431e02800147adb6d758f69994ce422f7809c9d0d733bf760697b80508c8d96e248f29211ffec52d4b53294972e1b0e074898ab00812d56e8bcb3a601ab031cc4b4d1239df1dfb2317fac265e7e70b187eb2ac706451a556ce6c87fcb1ce4d608b6ebe1bc34a37e86992d8a5c88c83bdd49e1ba2e74557c23a5ba417c2e5a0feaf3bebe97d825e265defe2b278a234115ff205526b0cb8ac2bc8b6744b2271e459bfb8c2c8a28d206485a5e201858fa5c7bc3b0730d5ba70aea6b0dca510ec54005b355827fe6712bdaed4b885e0c65b55b4b5f2b244d580774605f54a267b48bfaea18b264439036f7ddf0b50029f7744e2e0ed0a10352af166079c52bb86ecb7546d711814924f5a34f18ca634c8d4a001120d38186ac9a2cf7a1f2d6266920da1058d4c7e1a83d6b75eea7589fdb11d843dec938a129d239454453908be960fe393b42eb09ae02e8964957202ab7b445c72bfc858ec350a8e5ea943ddd751e8fe8c9aa513c61292cc83697595c25d750ac77e38f7017b8e283de296d997e73a9919096a790d7192470f8c4672086fc88e4d9b5f692afbd53f75e592073c2e083113fc65de8444864da11fdc327aebe2b1811e57232e4d4f45ad51222406b7ececb1b4abeb765b9b8465158063e77ad25901f18e6cc835e1648c881e0052fc459fda668aecd8929bcafb9d3df2c48d05e93fb28446b899c20dd3eadd620cb8abb679f68873de15b7f6be428988d58165ec2d1a928921c84d87c856c33fe310b1b2e19c568cc412cb168fc60a0e5b3547140ff495972f2231f45ec0606bad60922ba680d9da9a8800ad996618c066b63eeabc670962aeba10c40fa12d0b20198b976fdb7ebfabfa25cc2a6710ca9788d315a722c55e210a7d18229c6aca5b2e89c1fa5bfe9dbbda6911cf3adb01c1268f1b666806935eb97a4141592525025848346277ba87be731fba826d0566a12c82a14be425d806b4a490ebaea39cfa5ea5c97d1c7479c3b88ff602029d5fe636acadb2ce8421100df1d4f3fee3220aeb8c78795bf4772b25ef4a02881e47e1ff098da157276467450b1ba11fc1f45d1d80f5538fa72a080724472913ba9f43359d2b57403cc07043d72a5cb6f71363c0cda9bf173bc906e0547c17c9b0fd9829d0ceef851d91d3b067f37dc91238311accb6b1f66ec647f45be506c0428e58b01f6c3f78334463a39509466d8a3206ffa5a2a0c6e8b1e28296c8648601aac0f61c127bdd5b007f350c676d063c4ae10b640cc5e35c5f8ce485b796e2dca15c79bb5dfb109f2966d4683d51f6c40a5fbf041991cbf2df5f2b9231a5e47bc63b7977dd3ca1ab47bdf0ef8048d03da90b8effdc52ffe72ad4e7905b64a31c98fefc1f6baa648535adbbbcb073cadf99ed27986da4860bb783fc5d18f05d79a782635955e540a5204d2c200aff0f021cc33cc653a160e22624cf828667deb283211cd5e9fb5722b5cc55b52078bbb04ed49a33231e3bf08d2c0f52e38bedf1a9f7c02caa5301a0d58c9adcaf8d2122f65acefefff15982a6de33329f67e554507d52d964ccb19707410517f75c4405e10707887301dd4a7b1641353a60e36e58990b85337c439cc6821b8bd8f78515135aa7cc863a288796f7d0b6d9d5e6fdb982a51c5727bedb2bf7f277e5e13f5e6ddefe2bd6cbfd6aa3bfbb722f9f573ebef3956d833d469a129e3c91e5eab5cfcf950ce77035f9fc5e71d7b7ab0ffef54afbec5fb97cceaf9aeda75d177d20fdbb6a3ee472d0f8a0dcd04ef20b3deece9760335e907987c2779bcac1b47c6c308c6c7e1ff060ff749a6947a8e9396d5b24c9d9bb9a38580bc728fa61b2697bf191d33f52d12571d1d212066fc1e4375b2072d04dca48462541665ed983ab0ada53786ccef503c1edb1ddc1a762cfba9045d5d18f9d9bb8b69e96e8c234c5ed1f36341816b0272a9576e8084a152921e1517b40643e2dcfc2777aebaced1bcc2786b6b61340b3f69d7c7ae426047f8bd3ee3122ec33c9918109469f9c50e07d35de983f4c77a5deb154c03cb8947d7d470950a14b5cfe5a18bb38088871b48cadba464bef7b05274e8697b716e540d5a787d007918c8d87c26b0aa5e3301a276a6901bed8fc048188b78dc60d0d17b0573c2a2bf48e7761955619fb86a458d83ba7a7f1482605ed9e043ff89410a689dde7f5c6ecf92b33ef4030260c37491b3fd3fb924937f3ac3c0e480266baccf48903fd687161ff66a059e9cdc92b74a15131893bebe453c72aee4ca6131fdd88f152adad2d49850742c4f9eb47721eb0bccc11afc7a200c1d46ac86b1a30c519c7fa47e86b7c9b5363a98e365e6989b7303dfe0ff4cc64fd011c1f1012c2c3d7a91d96dd1717099b07d4048deba0bb0df9e09882ed07cf6c9ce88463f5d1f6cf72cc8273f1d9a7922af64c8558f025615392e474c972f263cfd10e57b60fe46eb0c01db91a5f0b64ceab6819e65dea2c676e316ab32b35cb37bf1ceeb06f4710bea3ae0e8320c281ab2070d4b8bdaac75adc1b4f3c0cb01d1c541a36ca289d5b893d4bb9b41f7f581b721d581a94a58f78cac4e20ba46991644d1c14a475c8147dfde6e2950facb588f8ee059e40ead4c1e75884a0a5ac05213aa764acc82efce846d45ec44278d81f9802e305bafc1f97d8cb7d2234bb63031329daa84a658372c55f48dcc032b403fc02b8536b18027a2d20d123c062a9b0afa5560262bb09a82e758d7be62e4f9fd8f696b7023cc30cbc7201ab2340d8d87cbdcb26c976d05f28abd9e15e877afea5ec4a1267e689aafeea36852be19f6d3410c970096ad839ab50b1a4c3c44352e2055aedbb51ec2efc618db1afcaad71f05c5cd575bdce9bae70c7454931daf8152d943a8777848d809cdc6b6da22ac634b72d65ac1d4c18375f5d8ddd8297b1cdb747359db07c55e635ec324b338b954b31a33eca5e13f3ceaa1b52e8cdab0ac86b64569c83fc0d59ac22676975ed64fa33531285aee8a7489d2bd680ab2227410573acd8898f2e2348ea68eb4c71ed65e4639368978ccea3800a0824b1d70e56576392e25164653b9796b024e8e6b640a380ba08b26164eea12cac15f13c20a15607d6c10977f772471c71cc05da277191e09ca405223e66a40ad983a1efdb3b6eb7bb2ec5d00a7cf179f9e7c34042c8e49ab10a02398342106861188f35febc05c1f1051b7178532b70855216fa54f8e84e8909657a02d94aa1e0e5455703ca60c24f9ac09318b41da329fd919e086499c454a92bc98db0853edbb5b4c29a407f7d4eac1a0fb669f27e09f33e82980e3e5da10b29da2cc1338944adebe591bb8704b594348c2b6022c1dc4a289fb2bf943a3bdf498751defbae9da35636b3ed7ba840357791e0e6ffe474c804188694603556b92a51703bd9b0a6681e3c7ae55956a8d21a893930f36fa190b1ea1614af322e5dadfbdf6efeee2893146e31dc6237333b7c04ca4f6bb12d477c26e07a7a0f71bab4702304a2fba2924f4fffdef3eeff8479dd7272c7db585a5cee45f5b86bfdc8ee12292d42f0a4d68680fd7fb53eab5290985f1bc89584e84530b4cb97a62ce674368bc67e5b1801f68968900b496dbe883689312eb9d66f9525bb657006563e199a36b692d46314120a9ab156810400da4789b5795431a2fd99c9bbc515eaa9610786a215fa51ca9450eade8b155dc163828e0333552ba98dcec0221481d2846f6c454a8b191990fe00b51d0db97f0f123f5318f9e68e40377e854dcb3713b45850fb21fb0114448ee5b6f96220fc6a77fd7a9c9cc9d8a709517f80a0203e6d5f76432cffaf7c7c72cbd705116ea7990f661df90b6928c50f8c0b9abb83d7770da9adf07aeeb3454dca3e9a58ab94d348aa414ae6e7f17a9a5e2845e2b5a3f096096216a779173c83348446e82b0928f058da7983eaaf77f41b70dd7c65ea9e37ff7c255a315cb7d11ceb68a7c5fae434e3c3f0dd6a0636e54a75a57dc3c8409b6678a07c030a9a2e9c05d312d2d27f30a5bea2df0bafa0eb5b5cb5b84a4031c6898ecccc236742667e94398c086aed036b5defced9d6019b0a8c2acfe690fb5679b1b98e80901f9a6042485febfd855e7e23633b8ff14b95358c7504b1b8858f03ca9c43b4f9e2a0fcb07a621eb27151e6b5cb33651c5d354be5c924605a516198c5ae5df1859ef2a82d91261a76d9b85d9c9b2e631b16a3428a4bfc8ef622633544826ec794377dbc3cb401f88df2027b7ab5745880e62967817ebe5a0f4f53e2c48c51349e0c015b23c4d8ebef96fc3e59f545780530df64f8f832b9a0aac908aa0cd55b7dcf57501ae78ecbeb178391ef0c4da1ca82e11f204530eb194b5f9dd6efb2f9e808c839977425043908a631c682257482eb915ecabc479fc2cf48b0a2d0d862492dbec1d73ceeb6189d1d80b66f2f9af6d2c0a28d8ec8d25e3c426033286aac0c39a548d2c521f998376975d1d580c5009c3f64bff8d97a6a8fbb96013340c401100dec7226e2d395860565c2211649d78c559088029114c23295307049810e0375e1a5e21cbf1ccb1ba480790be649ed3ace37c71498b7304e2254c3b2f12335ad718b8e00ec0f906b7de21a913112e6667e49b31525cef659644c879b9dcd2de3fabe68fb871257dadf4f7de460f1b55d37dc33b1ef779c660c4586834acdbdd62e28403e79cc63a3c83def8dcd07a556f86ab5918984cd049bcf11561923ab8f5c5c935fd8ade9e17babdebe0bb256b13112abaee8b708053894df85b5e3bed76706a3298daf2e1f6ee975552bd3ecb0c3b4d7e199abe5b0bc27935a5458620976ab992d8ae1c9e96f8e7f636a1ab5c32a1a8af3e519d461366552c417d946c8fd793d33b28015a704d7b371ef2eb54c7c571072ddefa1bdd864696c19fb1cf82a8f9952bfc91b3444a9d5618573352fb434cc4fb57efcc378bf9aaae22faa66acc54f0406aeca2eb1d596f42c74c0b8e16b2991055873358f66d41003625e90cd8eafd4aff0d3af846d4b1bc0d1bc19a0751316d541ec55f333a8ee144e0aa7119b45b4801efe9d22947b8114fa72261f541b33e84a00e0d4e17f049f35d0b781f32fd896402327e47c80370b2e1f582b06151168d60c730192fb205a028824e16506b75b687c80590d58e840651fa41d20ae108e3d18640f250fc8ea83c107c2fa20a0039035e1c383072f42c7e91879e0e61cd079132752bbea6ee1b07a4b113137f45fa7eaa3196237ecd9939924f96fa6b5d4ce68a3367570d609a4b28d4a0eaa6c37fd7962c7f769163daa2f680c23ed0fc20ffe74de7e1cd3b06545074aed1020a50325ff2edd1306deb3e18f0edc6324f2dacdec634851dc42f2550af65930ebb5022d43d35a60f2bc0bcf3071b6d60c11ce7d013cc869adce6d49c64baffcf5b44f2eebac1ba6d20637a0c8373c06ec5a0c4f44aba0e74cfc0a073f27d68060c828306ef7d9f4cc490c7a767b606b4db7b311cc19be6ebdf5ace1e4bec90d9ff838b6dea17bad573c727421336f69c7fb486bb0c2fa17fe56355c616b31881ade73bfefde5b10c207bb796c440d05a35a85162b989d5e51082584da20c58322fb2e813f4e683c251d15e192521c0824bedb3023b1bfb1370e70885dc32dc4a878a933738497b2c9a207fe49cf4e5a1d43f7585b3b7d3e677246017480eb19e55335888e3fca4c921762dded20efc8ba958559ece41ab2909aeb4e8ab03c00183bb75359934b35acab60a76b060aeb69db443f81efb667bea68ba5f30528735e31815a36a00fec540d6be30c3ea72a94d54c668a138957e0fbcd018e922bdb7ce2c267222ae4b28b4135955d614d51ada072a8d0521ffc611b3596ee8f9bd83d25623b107463a346a62d00962ab08426a505ab9278cdef5a9ee7d6ecf803ac23686404301e20488361ad83fb85f981c8603c5f590bae2c0412b16adbfdafd82413b5a6b0319259e91f5f9c01e4a00d3d648de84634f413b3f62a09523371fdb9a78da345490e70a0293faeeaa31eb7c662c0a467467f321cfb3a495154ca3296618f56c055bd7700ccba15d553a867ba7cd4b17c31577b4330f4e18832d5b29083a1b487369ca10bfb54c3d544a1efa4ce05fe75e8d7541ecfbfcb140eb898e64da45a80af1848288fcc418f2c54fe682931f7b3c631c9f8a51a148e1db5bdf8f4827bb583ed8dcd23461394d41bc937bd4260a425093dd143818f1419b76b3ecdf32611eb74dc45fca40aca43c2bdcf6da5667d9463a5c5fc2442a52b249b8633d24fcc9491b5105f66865b3b509d7f6268dc1cd289e49ef18b15f1d5dee29a87ac79af26d65457768efb028ac3cab159a55d84c6b5c09dc367ccc7d08618ee09a3a6242fd14b2587e122b8f98bd8e8a2bdf6e9b223003c3c793f3a2b97681b6c5202a2a7ac5048387b0c1f5388508a92db666165fe932d310adbbb63c0eef2f416ae7160a8abe3d56cbb0adac320f3acf406462b999452a895746f93341fc983a3cae961a6204fafaa965700994a7213d3e1aaef3aaec1e5d9c2658c85d63807b92c05934bbbb7602f358e123f0535fa1a07a166667c5061d8684609f1a1010d6ed407e8581deebfd3a72140ee2c66658eb09961e3c3ba239b8eda3dd73133e3f670ec254bd5d6ada9858346fd5c910fb7dc10778dccf6e351a9a81d04062ff5f9c177dece8cc38683483dfb158000af7818330168dbc2c601f30ee8d719830f148d312cd83d89d0b2e97ebceb2ebcdb60d68c7ee3152f16ca1f249b192fa5dfff9bdbc4ee74b372f79b83653120e7b46c22c3ef9834fd23cb497abdbd20f2781ae0c0e462ef5fff9ef3574ef46e6d9df6e517d1fcd01a7a8ca55edfc6791e11f8b205c0e20d9d4a600febf8af991ca7910173523f976dcdccd332796563c3539e18a3b9cf22f2cad096720768e8d5e300e08ceba89939ed2d630b71338e801209323dff4247dd6cbbe95e164e5b57100a7163f0dae0b4f2ed35c7af3b33d9f24e1eba3c919265e0c8aaa2b263a0939ff86028f87e5e0488b9181b5ebff0cf876a5c74df97fcfa4b2b28ee2ce4cf6c8a4694f4edc50dc5c5a210ca0468f860d9644f3a69f540f1a2f1e00372c5c53be2a78be0a170a2ca609480e20a1b2e9192542912131e801dd552dc0414fb27a4615373278fd990e70139a0fac479ad9127de47c550802dc788185294a605d34244ab242465024d3ec3d1cc1692a627beaf7c9e45a75a3e5c1f9287490debde0fe9a1a1091338ec4ca4777f1b31d627a81a1218b805839a2e6c366857e0aa3b963db6e759aef9da9276d75c2100592ebfc380d6ca4517d414acae444021e64d0d7e8f1f6404913144aae65684e4185d67cf3eec8609c5a77c70e0299510037d818e5fc0e358cd70b752e18c2e9ca01036e8753194894c79f81d3754ba6270ccce49c2d01d043b6462877b993efe4643ad71845c1e6d299d9654b6cd0c7e3fcd87d36d8abcc9e45f1c90404b4a22867912ff1389345b691f09077ca6555f5f3beeab8ac40afd55e69cfb869ab538685cab1ec3b7b0e0a390a9398087973eb0d9646c1d0e26764de9cfd082a7d73c4e078095daf91053122f45aff32871c55915f420527057dc0f8b7cc56b6661bcee81220eaa9fc8ecb074ccc54e9b7089c17e03758f62baefbdb801fcb47660d3eb395015e351f47bc4ba3e15cb24242ccf453dc094c65da6522d8d923ce2e334b056745773cb8f8bd8f67900ad68b123ae03b119c656cc79b385ff699c451a845d52855e664f074b325a6b5077c83cec207e7cc5f176aab6235ee827b5236e6dcc27868669f180d8b2625f49b980024c86b26e9dd7f01b8df13f26e9fbcc92454d45afcca3b52cf8af9311dd0f05a6a97e2a327d876035520fe2ad83d0d14c217ebac20f04bba2427c170aa34906c3d9500d800a1dec89226711a098bf2f996f76cfa7da2da06fff1f17f76cc39026ff0ec434c3aa3a5934d546cb89e6b2e6b0fbdb26992eacb35baccd722465fdb8455c86a281bd9e08088287923d725637acda6b6e71c6ec8f9c1e0534cabedbeb22ca6551fd3773d13b32d51780bf3e8b0cf2178c676f954b9021c04ed3bc916b32c868637ebb7ae5b49a2bb88ed230facb0e769c6f4a6410194b4ff3e96b448e3d69b90f950ff99b1929c63afa33ca596f0c748294d6c3ec2870ef7f15b04bcf7030b0d0acff1a256d8111945cd6faca7e512fb7d8ecfd646bc8825599fd1b9dfe72ab4f4b1478701c2f48abd0ffbbc6305818343be2036879fcaf036f2481dffe7a8ebf787482b098c2a21bd43ebcdfe434367a7c3b31e175bf00b0d0f4ee02c0a82f57d7f4845627a7685a68b53f4cd03323df433dd1896a0e437b4fcb84cf1deeab4bddebc3554d6609a8f1d07a6e83c01c00f9fb8cedbb26481a17964c8efbbc2307d5764eae49bbd6e7355858dd31d3c5e1813ea6ccd24a01e2fb5de4c0d87ce11fedc894d8a58a9be1dfdb281a9949050f714a1131563145d2dd798f4c91172d0283561dc82a1b259764d3c18147b0cd30f36ef04a3a43db73e653ec23794dc7e9a09f9dc3659deb30ee062facdc932599aed7db6efe8c655d148650a37976082cd9975884327dccc3c12d3ed5849c330bb91d0d728e2c1815da2befbe41e7859ba37cb6f6726194af8f3fc8f78af2f994c84505af5f2b4920bc207a064d2fe90cf17a0cb65c55660f37c9ce6b493f25cf929975d911147989592f08aa4c69400d4dc04a5406ada93d9b4629bfd54a62a04a8c066a468919e8c8044e0f985ed4fc3b2da0eec76aa62fa713dfa28b9541d581bfb801b1c4db6b1a548d2ec6403941e4a1df5a2fef52faa868b5770db722c96e4aa60f6bc9a6dd6b6131ca39a62d5f411c2bcf6565b0db413f181596adf9062363da74a94a17225bb57711569b565188d20744a5b35bb094095c36910994801628c5c8d93fac9cd805faa1fd82fc9541b7546e838a39a8c4b4dd0b8953526ca4b67042af15c5657ad281732a5fc3de1debe0624e91660485d8c12dd5f4578b097589ef49280c31f3e8812e7d69175a0e1fb2c29becb5849a67697a0f4a54c9c1639dad4e9233458e9f4c965d72e6a2c3dcd02e202aef4c0a78dbe971c05f57aac7eef05aed49596a4ce1ce7becccf68332e4b31c415db60c69964ff710b73a4b205b596ab79ac737ec59c6badc9e4ced12d4af26d68901468cf08ed7900235f4680181a8f6f9e9b3728ddc0a3c5de0842386ae4b34f41669c8de73686ca715aa2be194d93ad4ea605756dd0ba02a6a16e803c2877135da1fc9961f7e2436a33adb81d087d399efa564c31cd90aa7e21536bfe96a84384ff30e502150cb7f868d24fbe5392345ba4075382f64e7ed764592d2a9d563de8bff41ba2003c4ad6f2fa04afa8a9cfb72c50a98d6d9fb0a84b19c828a54722a1a183a61173ae8b255756b3037ae882e9c9e5203d6d370b5ba220e0f095de1318d51fca661839294e1a76a1b3c1634f6e36f9868e135e0db50b7093b7be58dc2e12fc52904d50271525a3bde64cb87f32baa2ee36b3e379e9e2fae026152a2bd3c8d3e1240cd3a085862f468e1bc88fc8a75d75dc39b2666b879044753246a60b1ffc540f5ab10911a59742482b6eea323cd378b811c2c1b8694ce806eb2376eecd323452b4fc36d2489722567a9c2a95d73265fb98dad431cb3f506ac79e1a5c2c4c39946041d0f70a8feb2994a05e70f4de618b8ef50ca0b66cec5503ffac56d68cde1814ebddbd875e9eb8c5e0e4d4437975868fb76c494370b0a2132ed05b45dc7064fc70b7a12469a7882f973c109d6951c15b67c757fc9d42705b1476f9233726600659495cb32c3289cc3fe16acf74775de81fa68fdad9aa8fd315a4050aceb20f7a39ed09f646de37f4bf7afae733cfd2a60864fd84b74860a421b3d35e796cca5506317b4234f4f7b61cff0e13568ac3b0ae61e5913b345d011b7f3b3dc7b4003ef2c2d5938272b55433878fd2e8a0eff8321cf08cddaff656a97870408eafb12dc0c29a856ea14cc82a3ad6be41fe35581e3240d5d19361b4ab6226c7b3f36abffd0a8429588c0e59e2a00901c553d70756f103eee28951edfbaed79cd0472d20007ffb9ac39cbc145089af50da1d4ef88b7cac0b239599851bfe90c4c9a48fbd7f1302180b3e7f7580e3d5697ffd24633ff357fdc9502668b9405e1e38895fc67e0156bf9d648dc1640edc0aab81881871b9ba1e8edcfcf667abaf830ee4ff2ae1425b7844a80497dd68bc10afc99334d29e88928a758fe53f60296d51992f117c42e2b5bacf3606ebd8a4c302602a469a6c8abb08c15f6382464709b16848cdb57e00220079796a8082016662053e3069a3185cc0db985ef51217767e15a11bea7082dd3112b6e80db442b712302677ba96ea29e97cf1d7d3a7c2ae5150e8ed96b44b8264f8c57ef1e10fc2d355494f3c05e93d5e1e0bc081949745369a91ddfd347820451b9ad140713bba236eeacc02d3f68a19701d5b2bec90207e5751a0485318db0947b15b4f43d455fe34699aa652c0307a8472b5fa6541b44cd6fca4bb981468195a07eb36d858b9c1b0daee31300ec981fe561fa6f9d13ea9822d9eca7ba937a55b84b0bd7c5f1efea8fbda19f4e37620777fe279688bdcbbdd33847bf747706071662f66d4767b8f3839bab60a29defdc0b33fc81e6ae6a5af06f3673159a2965f4db0f1a15d5aa8cc85f6acf1b8469aede9d1197a3d2a3be48ef0030cd4cda17a6a90cd932bddc43090fb22255e5b31c4b33ff8ded0a14e8a1178894cbc48dfbdf9f69f47491f45c347a4a1f286d255c308930cefd21f416f6e839f9101a045898f2d328d8f8c516c5205f9d487dcc4e2d58c84280c00983c8a06b5231caf58dd8d10f276cbfce5a2f2947fd5e8486601887fa023b6d80708d7912c073d86aa926b31f358577bf05a5c286c4452e6c956f51c9436f6aa987230c7c1c81a079960195bf4c8e0d068da7cd254ceeea852d1c8c1bc96ce0edf24d38c93b60acb9ac78a2579ba62f8fce5a341bbee099189be3b6fe2bc6cd13e3f575dfdba001348909450ea6ce8f00eeb61b4d25b0ddde58ea0c9a07bd3ed8f1a6b0fd92c9a2b873610f0a5422b74dd9654e991596bb5629b2dbdc1d864f03c012ce6380c5252601f33ac55e70d0a0d0c32748bdcd1c4795674dae1c9e2d603a052ec27e4ec64d618125834e3c85874ba14412a065b0db416fb722270a1e2a5aed39b3e798ec10f96c12d6e01608ccaebdf9cf6130b6e216052169039a3c0f8c8d224b9471da888d0a8289a403d61c77b90a45febd3556691e0b1ce18688646931d741b63e37809ed5172d8c2ee1717bd668dc756e19f375a7bdee9feaf125230714ee280b4c01ea157368603292c02e8bc14f2bcd292ead98d5b7116cbacd5b949ccfaab2e8a9092dd0c3e5447a7d78ee317bb88a9247cc56dd9be3aa0c29ce9d60290964fb77b255e8b8abf91f97a34ad92c7a11737a555939c4ee5da369ae20a71b49410ed319934bc64d0f6dcff0c77639cd30cac7fd72173cb64247b568ee41b7db3520997223d5c2247e28f5261953e4b9246449d9c82c65f3ade89055e97055e15c3128dd8d54d78b5c427a0ef884355a43170731b9005b1aa57823c0209054dc544b2259fe3202809031dc3eaec965e5c8cae709743cae7757e984e5d67144da311b898670983d1e1fd6d55e7bad4bf6868e69efc7eba66fa9d22e99147a33f0c57d9c251bb66706706fe2aa93b6847dd453643451869f6151b1b1bbb55b6c54e93e912d580fd848d1074d2c06d59a18e98ab1160fa73db19d6baad0f1df367ad2a8f148ff37a50efe270c7b15897d10434e19c8174223753f8de571db54c6144dc4b7ea0a42798620f395b21fb65ea58c2622c42c6ee001200dd0a5d64a2bf0944c07a27368808710701b723cab700c05ef5ed190c6e5a1fc8987ddd0187c75be7e1d5d1f7e91b9651fa5e8f5a627b0253d1eec475ac612b25a060891e1dc5814e63d3fa26b670ec52d3d9895a662464efa710e804443978d0be705a327ee4f97aaf3dfe707550f36fc068b9568c110a0a1bf96522d30adcb7127cfbda04771517d57970c78da54561b5b4f9c1eb0f65c4198998b0709b797982ef613a6842c7aa6ef1d9829451f900d1d1b34d619a5b27014913e67376ae1d4d262261061078b398621865452e495e24b501180916dfa47b2e8accb568da7d36eecd19ba2873897c8ef0ab0ba70b375864ff70bce80ae5538a3e91133e52665d0e24f3584407e3e846b47c39c5bb57d2577515d5183292f58f9314024902e7ed5985151997db3ce10c4c5ff48ca399a880920da2e81e9bdaca6bc1c541d4b0ac3043c1f176fee7bb58fadd4302d49956f02584397ef23acb0260c3b836b98f49ecca203e85e03bd30f856ab23d29a4118f16d6c5443add6d6464c7ccd5c726fd279f926726d3eac80cac1a82beb8881e5cf022e3149471c977078279ca7a33ddb8d3a5b0f7439da7cdefb6542b5d0d841f9fa1f51865523f2cb048c38720a2273c54f53307082dafdf12ab1be75c74e28c677a3a88d485cc8cd45054df88218295b5e828d1dae54ec46e1c47e3d227f18480e9fa09f33b8ca63c956a93d545c7b97ad575ee7c6e6be32762d7cef7ae9b744d8f051d0d63df8f70613ff50b37c885c84c1f0f371b9ec4f2c1c632540cd949f9cfa134a719ee6760c14562640eb41a75b4aa785e8701b832c4ad037fc5ffe1f3b91c6f5fa9f2add4fd3ef2a12a5cc022c6ae01639ca781c507e4b6750b13bfa3007f02bd48842a95c27cffa4cd63d49021574cd71a5f622232901f0f5b11db8918159a556cce76ac789c6c75ad5b591ce12d0fc09d3b3f40072a9828c0a86edb1c242eab38da52130de810167164f4cce31ee3ef6f0acbb7fd365602b6935e5173af5a4564d3132b26724f643f913261a9a76ca23c1e7a1316923b4e129580490c819e8301dfc73cb168255b007cfc6380696016689ff37c41f0fc0d18216feb0768b8eee2921475e22be89beac907d1cc152764043034da6399765406aa00100e1a0ee8bfc650ae2b04179de136ac74cc40fe9d0332cc722d4770221ffa05f51482d63de511a71dccff1417fbf471cbd28f772103529166e212b6a5502254ee69f29f5eb91fbf3572100364c0316a20b92d38b60fe0139c6c11c1e52f8d47ce5603bece820f7af89d615814d74f314c0361937774d705e15c300130159970c85410ab69acc1459aea9ce9d837cd7684f842506f58ba0312b22d3923c7097bce0b8cf8e94388ee7eb56fd5f611a354acc37849e46a0c6c0ec9bf2e08094520fc3fdf7ddad1213a7e051edc5407c310eb02db7445aa52a9cd094c1af878885447b2b6000b818e8f5cacc3a7c9d98284e652f9177ec8731f636a93b82d606143aed9fe8f8d5fedee7618c25df407ec00bb62aa70b5c4ca46d87df84062d481ec5acc7a9f32d7976d5079936344918fc458d5831b71f513f60cc01d6ab234cf45fe8f84618be66268facb30b3a57930d917073242a8ccacec2824a1af3dadce459654fd03a322101a4d6ad481e62be143653158cd061f5d8a550da86c28ad503b164e5095826c2247d92283c8899ac1ed8190d3849bda95ef540fd7733107c8d5a654142d7a5fa0fcc52a4ddd5236c0ec6ba63d294ab1eb136bfb627d81a220b0972fafb80060304001e3fe005cb050ac52a5b606d88d537009116cc356dc04d65070e07934f71f56a066c3bc2c8bba30d1013550f8733e78daaa79019b4c9b37a7881db48e7ba96bc214bb64ddacc28449d88a9cc2c6524b0b13a76f5d8e2d2d553f73db57aeab837b3d0d6d9bb99f90a84206873f0b0271b13b07cddd5b30300ca6ee7fe1baa250de781243ac04d69b3dbcdbf7258b8e8eac9fac575b90295ac6979824b47f5dcab654846a572e8d62103490758ace701b85f393af6ea69d744dacd35d29066c37d42cd13ee79f574161bb322559e69f5341ea4642ce851ae1a680156afc7649f2f2647a9af47a6cf476d075d52de9c92e1b9c8372a5357c60259e969cff4345123c1139a28faf4f358015c0c6cc226bbb10ef823b15fc12f4be0e6e9a460cb34161c2b1672201d7b1cbe67a9c32317824ca528c3be4ad75f7c8e850f7978d41ea04d6e3373f075d87e403d73dfa775bdbec2561f1877336b4be2f5f3f137bcdfed42e29dd659a50709f25b031b34e7418a6a723c480d7c0d6271d6929869c324fe7a630d49ba88d91d547c477b66f011f08dc884942e880e746c104d98a60efc9eb465a04752486df2f8a5c042c54b942592324fb2baf759dba84cc1a07be08199a85642e7d118be33a5a47c2c95813aefa8567955b3d3dae737a07a639de96dd0ddb2a87f6b13a7b442650c5fa5e50427f8f8671d03b5bf629afc8abc647090395693abee2aed785a3e51543790337ecf59f34e2dfb8f961d1eeac1252ab8bb23c00e9dd267f2e5c982ecf8818d281745c6e88eb6a8bf95b731b5d27f944106aff2849265941fde411c827632f0d8631312b7cf34cc88d968087683a39f282420c28bb809bbfc9ad7b642093d08f2ab7003c97fde386104ac5e2ecf304a2c048739088b06575d8e1f41ef4f4ea5088271782617b2b989a344f09b50f9c67953547d0f5cad8a93ef69612020e83c660841954ff0095cd006ea868c1d7011508140140a882969045d87e0689b30ee1fc083b9d9d13e38e0650581e817b00d935af926ee7b6ac40d27a442841b821da606bcf367c6c94cd0f3c7c18ebb3b75a321efb4b475a50e8d84003b639ff12fb88a8239030519de060640233c016d5177c87759fe4ba40a64240a3f529aaad661c602dd0990c23e98638e9d15db318be040225671f07320b1a7c6a80745fb1bfe754e04f88bf8e5c4ee90e0b168a6753379107a0955dd8cf3fa760705d7fda0faeed7ef92d027ff58283b941bd80e0ba50e2511a213b63ffa11b36a30261f383593cfa5a92d644d22c82f10ab851aec38bbcba51df105536e3530c2980f5e9b258170c2623715106d6a65ac9334621ae91fec3f5d307f2b4cc32e6da8b9bc552c29073da51b0b508839f1a7a0b8c819c4b162caf577078187c0c0371e48a3a64ec2eb5101c18b7c405eb69d5497fc5097fb46ac7558b73c23eabbadacb3ca6209561b3bec47b023522d1a07c3a9c7bf15a2656c330212699069446d1727525e228e452a8c018c36f8efd6a2806f9ae63946548779c41ba5ce6f79b27c6ea2382a49842f59a00a41017a3174eeb56c844b2577f206bb3db80aa02436abc3ad8aad35bc35750cf94fcd2dffb0eb4f0245bbe76f6cf66a817004f940addfba492c53e886a0a23c62782defc9b3970dbb72ebf3e55846889d72beb3775c0f3877f417ed794b1259e82f14d2fbac77cad9440e5c9e9a412a2f27ae77a4fe5a2cd5a4a41b8f10e3295092afdd33aba87841c4d8813efc9b4f32c81b6bda1dc474ed90f9e6dbca9418ab2cd85ba6f0ab81303e2cb0b810914325e0c452489951f4ee774c360b4f7ecc4b59fd136b71ab6986b0cdb7f2afc01af1228c78601652602ef2e56a29b3b614d8c07cc9339d56cebcbf3096eeab92380dfe842cbe17d32102a98a4090ac6912e59534be0f8fb1661659e949f0db3b2012cc11f72aa7a2cbcfc0c81a24820b4a8335c1d696cc0ad308dd4aa984f1bb8ef9c386524e9415d8403abf13c51c3cdc06462125b385a6c40f103df2076bd02c965b56124a02be1373755a9c08280ba2d91336d8f9b5140c1ab6499ad1d07cfd0021c504c25953578666842941bfa37be9b4b49e14e7304e7e1dd3d1fcea64683e304d0775159c823b69e87cddb9b879d1a61ed2970162112288246a98a8047fc30952fd001176756959d3790a023f40c0602950f6ce9fca9f200870ebe32ba2e5473a60d0890b58bc3575fc030489dc9064572bfa7a48c46ce38b430d8c28f160cbc1700b42b7e6ae4908a7c3935f7ddde7955e1ede21df56e619c3515299589151f160e992dca20cc7c8c6ebe7102f6f7161df5b43078ab65df97bbf7d0936f49511e8099360d5ca578531c11cb3ce512bc8be272f7f270f0afde4aee332b535eddf06d192f20b2c870dc3b2352270a9ee3d07691ec0a588d2079d00198fb149e8cb694b1bea80aba12dfdd8eda80e691782a92413af5d37b1d538aef1d83ae3b72cbc634ed8d407697f147529edb9d4b21f8d18038ec519713e20c71ce6bb1e0dff834c10a7671e9fbe325de07c9543dbcdf65043ce6d0b3f7f3a74a05fe109f91f406c04c29f7dc8bb09d2651b9a72d8c0475fabe4e44a28de9c31d3bb8e6d2d27b89881c3ade834c05188056a6b085738775dcfc9c79ef57b29951f0e5965cd32d916823401725c89a5a085f5f5938c606c69107d74552c0c459bd312ab375132c67dd08fd042efb91661cbf720af110673e4ddfdf61375377e19ddcf4ed5666ccf2ef4e38d78c31d5c19aa15947c1eaf5fce74ea2a82cd9369e594d0aeff03396a208140407d9f52ec10bfbae7ec80eddf2f474280b3e43ecbde1d5fae36487c2f0c305dc28e354eb99392f275bd2a2c7e073054efa04670d1ad3fb338fa6dca5c6a3157d544b91a9e9b1e839d552bdb0494d14b669bbb81518c1c77038bc0065b60b093a3a3b30e33c1380a7d5695222922b5d2070efe040519e8e44f344cc7dc284211a3ed7e980153bde755d9a5b1ab6cc57ff47c57e3a7430c006118b94ae3c6256dd864e54b7159fca456448285ac50957ebd0da9f46f23fab9aefc42c4fb2f1a973c8a1ae8e9c4d85516fc2904fee7f9360867fc0dee374849c77857521b1611b1b3bd33019b56ec9569ae81616cef011d1689e0e2a916142ca39786f3f5863757832858c130dd67ea32d0dbd46e62f799f0c7b408415db918111220b8a30563a36b52e360aaeca148f15fa028412b11b16fced79f11bb377fe307741aef35711bf66bbd97abeafe42b31ed9a564b6688a784ccaa6a0a0014ac8d57c1b34280771f944fbb7dd43c44978a581000e02380744be1f065483a9c11cf84e263cf600361bd1e4a08b1b79952dfab4a1aecc37252044a0603145ac1b31cb4ef0b1c01b3cea08cbc2433ded18e301b023b8759f8b6a9447f480bcda25ac3594a4a3c07c772a42f3923791914c06ae89545b8855ac9fe9ad0b34942be367ad21a56bf5595b672e4bcb6edd7ca19ba272dcc1d514cd6fb225deadc52a895901fbede20bbfb6c6cb5dcbc1074e5571c8b3166d198b2c509a53675b637c8b71c4b5e02f8fb57ba734cdad645d1cc9860e96f41c1dfc594d32279528293764b23a86f16e02ad915b23e0a8ad36dd76c3697459b908a052c3e566ead3a65e4454c251bb0d453cfdc5200c4ef4aa6e608926ba5af3491ff2e66bb146d7bb80d7ab8c301da4b35be1f34282b59a6cc4e58ebad3e9c1d6911901e1e0d9e9b4b968799825a2806cd412b5f9444756e837682eff9fc5ddb05e6de8035c724e65ed27bc9d78d52a02eaa59353f124c0e4231e8f7adbb1b47adecd5c89968ed72861c463fb2b5b962aa1e25109c093c4820090fd77cfd4691c407b77b34591a00140a178dc6592e7447ab1a9b82e166d2c4fbc275ff5cd0446728968ed3e6492917d3ffd8564369664703a26b4aa20e7c26eada9993857f36086bc1a7cbfd3591bfcb94bda38ce57c10b2ece85668775e24eab36c6a0eba74126075d0aa2cf55787df20dba9cfe7cae5d0eb7dd9cef559c37b906f4ff4c6a827e930d170234ba1e2c254b5c0b0d525f723c9fc5a666f0220498b7b898be3669e58b3107003b83d3f670af10a33090b38aec5af5b97b1e63901119969c72347f6d2166656b1fd7940a24b1618afbc9e79c0d5c8ba02d90591bd62732abe5085d5ef9d0eb7b5be6258947109d744df4863e120b5ae3d4340f8f2133006b23a120866290142cbed0824fddd562ed9ec2f310743dfcb6248281f27c69f4c3382e897406ec1adf6659e6cb69b1cefd26280d81b4a25ed5edb6d0e20bd7eab9e119fdfa7c271818ec6e37665a2ecb3ee195f722e43548ee067fcc51f7d7d613493473b358cab0a6780b6db999aab8cb7f5b43a84de9f27644a440440e766e4ec2e340a56f7bbb9ed6997555adda0284e39ffb89345d51a375bbb698270b78673e26c310c96df2c4abb29c36fac8ca35fae88e24a465eaf6236b173710a4a533c48480340faa596810a1b6ce73fb45d4cf4436363404d3d0646b66abcfef77ddf98355d65f533b17d99c25d0579eb96083bcd4f6fafee46933a31ce95f87bfbba8b93ad9ab4851e06ae98500e58de16ef49bc91760eaacaff708d69e57c6effc6d54566f89e53cf672c6957dd976bbd019ad0254a746927d1603784b72936dd644691568b78c21509899b3e9a8991b8bcda17af53e0c2433252432837165b22707776d0e30e0fce8ffcb8b23311223d183c74db9c4fa553a9df0795d22a71e8fb61a783a55f4dd21dbf5375918357e9cab4220a296a3b85750ed1a8d2a0e287651e02efcbf79ff3d351a3f8e9c396feb04485c84bfed809da93e439f4e593d58d9fe1d7d48a89102f53b905c70ecd7587a5936282605ddd4894d23a23d2ae5f88be6b77edb5a0656786d0193478810e74cf61fa5c44e93a2c8b45045320cb881fd477c81ce01f171a650dedf8e3213ea0af51cc087f02ed41ead681232b12b6b5a25c96c00e259132506377b65463b215bc0181ab0d3b02159e2ec386a898808cb0e4ae6a13fc55ad1bbad2a41ceb77187fdccc517244396ec2e8a23202afacece5dad10e36b917689ebc634566c2f14fd08596272d0082300ca640acc86a5ba3e5fe88906afbf0d2fbb0009c25cd4b9d49bd70788f2f7feff23cefb8336a3d8e0dd491c4e7faef308aa932b77b09ca66c03178aab984c997394e9c991b4bde5cf46c3824276a52dcebc8bfdab0bbd16b011c2735a4c43e56b29a6b084ff9280aec5cd906f6a0d49c69e0e1c9541b8ba3c3ef69ca705c91782d88d9f043031d99177c55ec5771d9e16381485426395bf66ee39058c2fbff3fd87f1b23441acbef63a39d47393124255e3deece2ba8f9fedf2f1b7d941726fe8a56f62ad4389e7e7d0209a19de508e6a0e2cceb6a24c50db53f37308466f1b6246741584eeb81d8058a513d1140f3ab69d5e5a1597a9dc691287114fa9ea102b54e3ffac7c4e754c57a374bd649ac3d9f1b02ad8c126d02e072415e83d60c3471506264a5769d95ab53bf093ca58b856d9aaf56d980133059a5485d5722ba46217151594e61a803fcb7909c68789ccf82fda97af4961668c3a54a804ca104fadbed59f7fe54c20b3c343403bab7c02fccdcf8ed164bb70b78e14f79f4b3e8e321692263ee21dff94aab8ef73723207200a0ba7355f8b724df42261c77402f214c8d4a1170e25f2b714a7c123f1eedb3efa04908c26b90a6e780888695486462fea7e039bb2a912d37a714d020d96a6898a45d3c8b9cf60c2eb95dd9ff87c6a6504399ab6457431375ef87494b17555cbb60e9d8450fea6eb15cb98a2514094afdbf13d337cdc397fec910f050409efe461177cc4740006e1f23d6156abd28fbeb1bd06214760ae2998dfea7ef9242b9e1f581508d324cc7602dae3455f5940d8d5a60d0484c03ff1fb0bd02b73e42eb1cff0d0a717a330ffdbc2a55e1bd95be96a0c174a6caa62200fe5def184a92348f42ad03e3ebd4cc52bd742868e8ac895ff0413223251c2e0f7356277439266641389eceeeeee1dc505cf05130634dc1056b164cc983366c80867ccc01b2c7a23da41daf54ccb324cf55ab026bc51ad1bdb3b5fd6de7883bb7a92326f73a35bdd344a699c734ecc25939d95b70d9fceb0f37c3284326a6ca4b7ed4ceab44cea37320032dc6fcbdb0c40c6b6204047809c231b202320635b54965c991c208bdeb3de8e957f9f1f4b68e3f8e9f8d7a70e77ac68b48336441b37f0183c3ecbf6d7ca0800168c3504d3f0f80a0043c7d4a14346a84307defc78dcc9d10f6dd3609493567b6987a185c53c6c0bcdbdd506de88f6d7f276ccfe0f782ca4ef5ecc93892a1da1c718638c31edb3eb120039623530e1f11330b3294044c3e3ebc0c0e0f1af00e4b8398c8b6a2fb6aeff8c3101da1037d626ffc5541869635cc42dfed8780b70c7ec3018b8c9d3f12b1ac7c11ded7047b9403bdac9513d59b452f14619151976c15c5cf265b9b8e00da67a38b25376c25437eaa9864c0afdcaecdeec3e5da9eb3a4a84c78794524a29adb5d65a6bbd4129a594e200ee981dda6024b28466873b2c4a29a594524a29a535ac4052e923bba9c40453e4d429a59452da7dd77dd191ba158d9b44787c8d524a29a5ff298548db0aa594524a29a5d4b29ebd103f91003229946144bdad0b9957b41069cf39e79c3f43309360ee1aa594524ae9a694524a29a5940e800019a6e69c73ce99a2f13568ac56abd56ab5eab6004693aeebbaaeeb2cab5bad56abd5ca860264d2861cfa783e423364a8984c2693c964ea565c71a4f7de7bef514e5a2dabc318638cf1bdf7de7badb5d65a5b6badb5564a29a5941a0073c9d70da40db95419416a21b19047f89b82bf9752bc9144bd2b8b7434ab1a4ec2f4de7befbdf7de7bef1245922889922889821205a515787cd016638c31c68d54ebcae71891bad07e1c3e52477b02f2b61fcf0ac8f0c96e761822bd845d93dcc12e77df853a52ec477aefbd4393c96432994c4d7cf423bdd3a0b5d6524a29a594524a056412dc919f126520c30ba3c9176fa4a19de917a5958052afda6272c8f4de7bef7d76bdf7de7bd792a4ad685a3780c74f81f55443a45a49a0185fe22796e24a8471dbf28748a18802d1b0ea477aefbd83602a95caa9d93d1d2bb39bddec66976232994c2693a95b71c591de7befbdbf262d2d1b782218c65bf1e00f881b7cd20ee2e1f8715dd7755d97655996655918638c31bef7de7bafb5d65a6b6badb5d61ae5a4d58aac6b5996b5c92f4a0087980aefb05f8ab6ebbaaeebba2ccbb22ccbc218638cf1bdf7de7badb5d65aebe3c53cadb5d60bc87043be41de801c63177109d108518b88057f1f8fbc918f58633fa554313233bdf7de7bf7915fccca8bf90fbd1818ffb3e57a82f594eb69a59e3e44dae48b941214823905145f40af751d0966940d85426d2bf8a3715956d2381a68d8fbb302575214ff5e0d0241bccd2dc01dd909da103f863efe6cf274fc47243944f3497f6d3bf21f9b09cebefc8a79db965f326fbbf21ffbb55c336fdb8fcd448d961f5fa9d8b6e4356b1c9c82c3bc6dc8eb498e70979de08e20d006c8e11cee3017de086bc2c5394c85bb77b1b5c9bfedc731951cc1299e08fe110e51bb888703fe6f2374d8d04482a719bb7befbdf75a6badb536954aa552a994c96432994cdc01b932d15bc4539422421195280319c2782368929446c94d691528e665b619d9655996655946bbde7befbd9b3693c964327d48e33a73ce39e7cc38479e73ce3967966559966599474a29a594b913bb7ea4f7de7bdf6ed000bd7cec97e69c73ce39e79c73628c31c678257e0c45524ca552a954ca01d925d32e835f4ca18b251881bf875abc114c4da8a4d65a6bad59966519edbaaeeb3a98a2017af94d4b4952eae5805de0f1b37c4b7a05f41fca9f8f5f69805eb6fa9f7b573a4cd2b82d6730cbb26cd3b21c6fd0eee9d83e3e6d423bdad18e76b4a3dd768306e8e553eaddb22ccbb2ac15edb59046d2a09635b85ac1155cb964148f72ced07310058fc029a014a5e72014fc4125f87b23de08aea8cc5996655996c115e93f1a77a7c0e397344e7f016a12c6ea431a1775b0ddab3508f4bf91b4e7441a070b261918f1b1888f349205afb94d77d82193526659e7b93d5b98608223c57356a0823f4981f678b82d5b9e780246e5031639c19f10f11a05cfeda8830e25c8ba1c99e0e3c35584443ebe469d9cfc5533b7614b6923e18187cf4e9bcd07f5f99514451a29d2fff45f3697361238c5432ae01430063f04066404afffba7883c487e7112d1e3b398235f8f891468e5af031898f1f6be448c84768838fd0f44a7c7cb94304664a8ee012dfc3c79f34720499f8f873254770881cc1263ec21bc81174e2e1130f61fee3531a39825040177cd4e1e3632a2c468ee00b3e3e262347308a8f8fcdc81184c1fb00a77888838f8f6b70b02b6a8a5d79d8f5b46bcd0db6ed61db1df64dd960df991a6c7ca2c1c63333d83825837d6ba4d8f75464db1922db9e62b06b0a06fb4911041e46b19f14e5f0f005fb49918fd7e1d5b8a0c74328707808e3f2f009254e6cd8c47e52e4808743366402d22cb125b023b07fc4192536346d213b09d9828dc43e6207d946ec22360bf693a21b7e055b05fb49d1013e051b059b887d826d825d824d823d820d640fb19f1489b8fd5a7cd8a5bdfd057369d7f057cca50d80bf642eed95bf662eed1b7fd15cda36feaab9b4b5bf30c69b5adaf95ff6c33c88ed895be935b09380e081d819104108fefa61472e02987fd81004fff222d042b0731134084a2fa51fb4976db9054affc30fda0dfae5870d39c45ebef44a7fd9fcb22bbf6e7ed9945f3867607be02fb0917ce0873db90636cc6df9c007b189780f07e7e1a520fefac01ef2e39df8961f5a929797efc07bc003da0dfae5e579440f6cc881d8907740062ffd7cb90184f6e2f6b225076223f9f11ad84984d04052547a0bec214938f04e7c4b122184f897e7c05f17e6c201ed062dc43fcc4588e7113900f94b4988d20fda06367c384a1f8406b4d267e0c703b191fcd04a8f81c84bffb2e3059e97de02bbf415d84392bc3c13f60c6738434b05fe7ad920537ed9da6432f12be6977d4d26130f6d9ad013f897a7c05f1bcc8502da0d7a027fc14c810df9c326f0b24b13d04a73f3a2953ee7970df90fbbf4d7b3b00d2784bffc4b6952fa4e51c62b608698604acef8621e185d2cbd078627d303f252dca20f1329e74d8630979029053fb4dfdce02a0a98788a348035500cb88a4ab2882898825ec8c00eaa2012600a7657ae16e364f9324193c96432e1cbc29665599665618c31c638c668adb5d6da5a6badb5ea544ca552a954ca5e1b2488655996655994524a299d73ce3967963bb93259c9d56ab55ad5ae49d7755dd7614a29a5b4d65a6bad94524a29ed7850138542a150a868857befbdf75a96655996e5c935d218638c51628c31c6b84a29a594d3b22ccbb22c8c31c618df7befbd97524a29a573ce39e7b42ccbb22ccbce39e79c938491b62da3f23f0c4aabcbb126621266c88c3176db1637b94d29e5155158546d3871498c596433cb648459863711052f486fae4c6c862bb85a555bbb15571ce9bdf7de7b4b0bc618638cefbdf7de6badb5d6da5a6badb566a88842a15028d49c4182743ac618638c73c66227bb4e1299d65a6badc518638c71adb3ce3aebacb3ce49e9a4934e3ae9a4534a29a5c4643789dc7befbd17638c31de346badb5d6d65a6bad95ce39e79c13638c31c6b5f7de7bef18622edbf60fcb524a29e79452c2ca84c9cc598431c618a394b2a5a5df7befbdd75a6badb5b5d65a6b95514a292791183bcebdf7de7badb5d65a7bdd8c6d31bb8cd65a6badddb45a6badb5524a29a574ce8ec8bdf7de7b6badb5d6da7befbdf77befbdf7d28bb964992196ff615b9e73332767524d6736e78b1df6de7bef530ab1c55a6badb573ce39671789c82e08bdcf1dccde65077704e9dd5a6badb55dd7755dd7f5de7bef53d2de7b87d95a6badb5b5d65a6bc5185b6b6796655996598c520ea59ad6ac9ed0ae86fef302a2417b7c2f4789069542add5486409e9f89f63c841d256b40ab59ab5c985d9cdae65765d76eab1cfae070992d513a594524a6badb5d62a29a594525a5db6cf44405a13e5cc9ba3349c8211b7483b0ecce289ec4ccfcb4ea007d7c44f448929d506968ce5853503a1dcf4296514686868045084cbbfded3a15f25453457ae5413a6f3dc2ca2a2929112039f9b77b4794e8338fa8ab84954dc644a7f3852ae8e4a8eec8c14c98f63c4c01dd713ec8c1c716ed6b81b6738628cc1e55f7a5bce9191231baaab3932526a9c7c6b85e6e6633d3247b2791b2a29b5d61aa7d2b9b4a1a2cfd5804a8991a294981d0089da0a9a93d7bbf2b991806a4071c498307a4947266e12ca4d27a6c305a59d18ad3b5c74967454714b394203a2344bba07a6c663dab61c27bd29a594d65a67ad95019bc74015039d3cbe3a9aebba249fbb131337c945bc0183d11adbdc3bb58eaa0bd868f31d2e3aaaecefaba8224b7ebd23dfec2149f2bd0fafd73abfb6a17a38644a4cca92b8d1305464228b8a8bc882a2b224b2709f976f4355034a8e362fed7b1ef1f318e531e682f27998ff3d1e71098a66a6f3f7ea1497f4e74e9189db84d1d04ad11abede40644d8a0fb865a3a5509a8e4a4595b2248a644a8c3dc284aba8a44a4c64c97ff25ca7468e5eecd0c891e7e5775672d4f9c8794ba486ccc989c601913429bbc69228923562baae11c3e547ac478d259f123386fc2a2a4ceb93bb21af111359b2975f634996491ace23daa8f10597d8e3cfe753f66b81455661e811c8955e69bdca1c5ecfd5204335d850719912439dd07943151586fdb58980998a0a7b5caf38ca63dcb5447e47a59f4744d9fc6723d9bca7b33b9f7fb2b989e27308cf34ce732de16cf8704ccd51c225e73862f08e8a8acb182ebfd680e2924b89b132022872d50134a18a2a661349052ad0318c500baf2b661a5dff925309d3b2a2dd43925cd6add73527a5d7d36bce6b5a3fe5c472de7b2dcbc2185ff8563a2dfa16e642bba87346b993c0b7f4af9cf3c573525aeb15eaa49948a5b5e25be9bcf295749fa84e54275c409959f47d0cc35febc5165f0cbb1ec35c2efadea39b0372a99457de795995eec7e1b678dd48f0b3e86ae5bd8f31974b45c516e30a37e6b752b8afe5775ebb392d10897c5a95686e23c371e0f08d4cdc4c72a461787c2824424b4306555441853542c57bef456adf5b7befbd36f00b37622e537ac1dfc351b7d0dce5efaf795defd929347c89e170f909327f717bfbefe54cfdf79ca4e16f55334d179c79d79c1bf23a2489cc4ff7256be494339289e6726ec825e472468e629c50ce0d570497da1422a515c215ffb228cdbd181fa538a21f21ad73ce2a6dd0dc06335fde88a2f858179acbc165c6410f39784838613884e1309c476cc1ba905d8ab02468ee724064cd9499614851f25f6828e39f4a8dc361c26112591260a7c0e906c988cf001e91bb30e0f1390678a1ad1438dd8501c74aa1e3731c4ea72889e27a0ad0cf094358c29f1394acbec09f13b4307194efa428a5b9ecf4b2010cfcf0f13325723424091019f8f8594a5ee09db82d155045160a701113592660811fc20447034140d30f2560139bbe516d38260e47c5e9b4498e82c8d1113f42e2e3eb6ee3e1c53c19eecd708f867b2beed57010867b0e1649e23978e2208a834a389812f21c8ce1a00c9ce1200d07571cace1220c178b70f1c4455454c2c5141763b828c3c5192ed27071c5c51a4ec270b208274f9c44b5e039a92485c4c6a723f60db2ef8c14ddd43dd5589b720114bbd648519d6962c8ae2829aaddb4710ba00ca014b008111803238a60c10a549002141071021394800423003204841102a76022890d6100a378c1121288800f3df0b0830e3f489b839cf417cc62432a84008487596c18848f4afe8a52ce2c31f8839f49b2d850084f3117a8c5532afe7af52afd5ddd1a1f3c77b1784ea39e032179eef9d683e736bef1e0b91c7ccb6440573c7739e8df0e9ebb3c64c50dffe4a88867f9274746fce8efe9a6e468878f6f676c4d7f4ef39523cf5dbef26fe5df0d1d3c77f90d041cc0000de0f18f1720870d6f8bc8910edcc7b739a041a38ae7347f23cf5dfe1d784ef3976c8227c0e31880000220fae7e35f0eff20f032a585b0b393163b33a26467a820ec2c0b20ec4c49929d11218b9da5e2161ffe606748885bc41df481c65d8d85c669104ae340ff5b0f346e833cd032193992287885267375778f68b06b51071acc81a6abd0ae91d8018dd317b76d1249bc44c519401a08f988c473fa88d741fe2473bbb69436921f0fa980013c2216a3b979ea747e93a3c9f977a242c991072545f1661e150401a1a053a7468a3c264f86da681e8faa456523317fc62791c07c191a12327efe8c8d84cacf788f69c67e5284c1968b45f7162c0ba0534643f9e419e291b1392a7ba2503c0c69a2090f8c498a7a789478db1637980f1e259e283ea70c4f14f96603a335c76ff1cd5f335bfcd64fac07e59bbf68bed8064667ef193206d6c31385a687c4adf2cd5f75e3313d1cf1371aa70673c19ed0f4b98cf9005b66f03063766ae468c6c77fdcf30aaaf724459b86e7ac38357224e3a3c713551e45e3244d289fe4e85dfa5ae334fd4c3bd1dfdcd39ea151adf33ca247761e93a70827573880b47985f6e2669fa3d93fd142160492615fc53ed4e48c14d9ffc8c2cd1b9125829eeece7f3e7f3d8c528ebee73fff64addac9773627e464932097ffd98f7bec53cc855e298af451e867f23b9d4fa19fd1470175fa1d8d0b7d7d8bfd4079fa4f3f0d5f35d049a3da109dafdff94f0e9ca79d1ef00cdcf39dff7834fa9fe7213bbbf3f621a0ffe479441d3e9f4dbfb3371bee881aaaa99c3cfdce7fbe6e9593f77c7dce5639d13ceff9ce73de53bf4339cf5b1dfd3c62d5364d68fc0fdb417f471b42ff893644ca779e6eae6a9ff2f6294692dff989e590a2bd50fd8ec6d1a04d9056294d82538f67c38b93eddf6b8209c32ff657e7847edef31df9c3a37d2aedd01c22a70fea9105d431c9e906f5b89de873209091cd63d867d95f21adf39fedf9fcc370f87c76f6275b73b0b7efd138da10d86f306df33c64f63092e43c8fd8f987753e13e6e4398ff21e8f76f228cf91bff9ebf5b0f94e8f934ff9cfe66e11fe798fe743a14d13f93f7be3849e303cd33e5c3e7d36ca9f647f7d8ae7a3b602c8397fb21f47d91c10fb1c6d88ce6f1e6224f99b7f38783c1ecf77a07ecfe6af983b9bdb3c0a8470cf73aece7f36a605dde9bc67633878fee479482ce3c0b160c539fb990664c2f0cdebb75ae3847036dc6cece5e7cda18086dbbf36c78215b76f6dee881a6e1f748a2c156404c315c01c3e5cbefd1c594810ff6a2a0325092824ce4f725d2c5a82d1f1806581033126b411b3473883376cb97bc2489a396910592a8f3fe79cb286f269829950bc117ca23927cc2c325f30a398503c16f8b619792c02797c3ade06cbb96fcc715633e8d96347e6897d39e7944f7ed1c82f9be586fc09cddd6bbec6412ee3f59c3d599d144525376238d0dc4142c57a40de31b22dbd9bce13dac4ade738327c269b417772c4b9576b10e87feb780ebee99e0ecb39e5313477673832f2b5648e35c35d235c87085ca7d3a9c944162b0acd793a32fcd990b2c6e07a37b80028e1f7b168f97c78efaf67d133bff71e7cefc1f772ce7bbe47e99ed75bf3c99a0b6ec8ad1e8f630f37f6134643082fcda2e78666096d034575b5ca46e7f7ed0f347efc1c8d191a3372149291a26b434bd1b558e8904cc88b78c5a0a85054147bfa76e62dd14229ddec87d28437d23aad8302c57e1691a3fa987decad0cf6d60beced0cf6b6c320c7301b7392c22ebb21af47d074b31ff781e64e525a17370d8c1a04168db2e2744ea71734fd7a043d9180b0d09cb6e2f7b55564a17f5f13a3e3f43b4aea862d9d941cbd16fa28aba703e3f451c4882cf0e9a3d4a498220b11ce114e2da7219927ba4f2d4e9fd39f8e0ea7ff3ec4435578231b2629ba2f84057edf2aa18fa02d3f82ae11a3da0d9a868adb1e68ee2455cda0391b43311f624b7d8bd23a1b43224bfefb36603e14923949f5105b68a0a4e8be45a2b90d8ded81c63e9b5a86e48b447f43c3ef3f1e684ed65ca77c45882dcedd997f6ec8e97befbdf71ebdfe5d18ff11390a1798cba5a1a85054364c77cefb55d298a9fcd298b9381a33fc8664f8dd2c0d452545f79da0391b267e9f4351f1fb364c015042538670bd1b9d0c075d0db21e7f4452f9bbf893af08de128c493f6fcc4172f4a2dd16efe4b5e3d5648c9531f6c42386ff6153ce5cdb499125eb14c3752941094ab0c2ce2cb1e976c679e3a8be7d1903b7cae494db5879d52c8c2503c3e35b32f5239dd38a68173467c9049ab4a854ce9704b1646a460000004001b3170000201408860341a06661928a6b14000b5174525c50321e120da491508c126294329200600000001000810119220a004b8f995f714cb180f0a05b8c2d3319398c7331ca117f563b5a8691076a73527f0e60eac859658f6a75b27cdac0f8963ba8dadba6852abf004c29a9eaca1dd6898c63885b68583ecd00323f1ccc8b4ddc1d96e3ccb21c3a2c4c265e2cbf148215055355a9b0dd64ff8bd13609bf3fe562c5489da49d118b5779bf24b1ff65d887e9bc464329418fda745ac65db0e44944ad04122d9b163e209156156a2822253d860f0e9a2f49b4ebbb6786e8c7a9153ed5c0f0a9e303b3c2c89c5092e81d6a8d88323b81b3be19bc1ad88b055b5fb00f2889d20492a8d03944f1fed363140db87e763b9a368e1dc5791dbd79dd527821911894032ee8e39f63db3b8b52eda518df412d02f40fa08c1e0a91e2059ef635d306ffee25c4687cd356389e0456f30832ec465b79db2680d20992a7494a539f7ba5606203dd70119dec3b9f6526b6affb9ae4d8db0369319d56a77bb5c663df1d5cee8628f0153e373b0330fda88d017176fffec027df5aadc0d40e8e2e2cf7f51ac93f6597e087a84d2acfeaa66ca20ccf0c2a756bb1f90bac5e9fe7fdd08b7ddb8a7bba08ac063210e4587ea32cf3b8f50a771ec2e420f06dbe8b47a487a723acf76d1db96adb2b31dd362f86e0cca03a58894190ec878c5df8bff250242b23fc5b32f58cf1b0d65a5176db22f112832bbb8dd3d89894d34278c117f83b0694bcb4276bf914d2077834366400e13647aead14cfdf559016578e16c1cd7933bbd6c99084c181a26ccbd8f64d31c70a46df6c214f0e7d87885ac62bf120115ca18c48e86a4342b1c4e7fc74ff49f71b718b53aeacf16143c24f64a12c09aa7292f38643801c29611bd7bf535d82546b1e22c8070b5894c829580c168464d0f7f165c9f1062717b51ed182a27bdd377f4abb3c03c3624deab84c045c5d0c19d1322f432ba9625394faa99b866b8bbbd0f933b1464b10eef1699406e7f2b1f2b2892424d6507f303e98782ab168bd783c7036242ebeeaa12e30704d4c00f98dfe539df7e36c1cd0b1e754d01aef7c0fd236acd78ab2fc5e80e0c7c9f4a4a5df7da8d31e9595b18e659e89f3391430f886eb7c2b47da7fe05aa392a91bdaa190143aa0bafd07ce524747b45c1c9040e9201f070b6e02796146c9340c68e291b53c42fae7aa17c6fd440f646046505cad80dcd2ace01d7822ac94eed2d0a0a2dbd5691e01958ef305bf919211aa108d442165e4f6efc05360e147bab516125ef759911c15715b221291ad2b4a9cbd099c76135daf25b72d02aace1eca5c8f1859a677e04a45be578bd54a00bac64951dd072a2eff600d7aee64cc6f58e91123ae21e32e570882b8016d8cd6d97b2e3ec28e9570632c19a7f7245945bc24fc2bf2d66227f51fa392ef928ead0981cd8315a1bd55019928d3d85adf7571d26b25487603ccc809a9e8eb1e92cdaa5e675e498f71d0d6d83ad5d6f1abb335345a4e803f0875e3aaf8485a769c0d1496ecb9a883b367fc638418e66fefe010d5ee2bd3b8d655bf4cde227927af48d09c00b21ef10ab1bc3741e9969cea197a764dc21678e7a6918a1acd91a07bbed2523bae40d12912191ab551fdec1c19a02e786827e6472354888d1dba19eb647e5efc5e83dc1354d46b457257f3b25120b075236d7fc6c605fe52dd48da57b44b72a43de308a1166146a4d878ac0cfe022a2566fdf55f22875682992615105b130e695120892c09893cea049fa9b375d44cb15d4a11f88ac0021051b10acf3c3524c331701735e73a84aa2d69d5696faeacd1ec3635e1d6ff818e95736b5d171404eb581403437a9a10d600f0fd9733b29d04a9581f8a8b2f39b337c42356110cd8c9f25a66b760403c76bb2880cc9d4cb19199323b6ca6d8e9deb7b5f20025d18b0fe005cc8a65a8fbb40f17ec9ef60b3f9d669aeacb05cce0bc7b4c2407dc6d631fd04d529dd459173fc7879575caa0607c366f606016d0870a6622b9350a70c28c9d43cdd88c94a5f5141cd3e5f98ba574429b6ec428eb2574b3a8aaa7b72bb7805122f031a47bdd0feb2d71a25620b95de2d021219bdd3d654b93b69815523e41558a0cb3a25314306320cf63dfa35c9e73584a9f8228994dd342deaf141a3a93fa1b4f68c9d3ded04086e4094de2d6c6fb28a4f3dfa03713d75f014985c9e7f62eb8d52c84c7b28c5934e56b9401e39f1004e44b1949f87591125b7276c8e2250003415298c625689fc5a162f52d61ec8f08a36fd5d45f651772e363285c02ced46a914f271df35594720d21c63cf2144502aeaa8f3c859d6f7ae7f307db9e07a8d4881352a1044566fe2f979ffe184e215121643b0d496ea19787c26716e848fa2fc1a2608f971f030b63ccb675695dce43c13ed622d615bdd3e1b8b96e88348493a13d9ae5dde9389f0a1837862124003300e09956ae7bfdad19ba37065694e9eacfb01caa58514abc439822621517993e301cfa521d5b84b397f232d18d8f9c880bc9c51b199d99c4e2e748dced14ad5ac9da0a76447d229173226218e01a6a51484948cb9224f531c09c5b092939856f4cc21c9c968e001a10afa4a3f040a1009322340a5e10ec7a0d09d1967a28580cad50f33befd1646073da7556628cfdd8ebbb9141168885a4e1075f03dca672be7cce66438012f72a24b287700fb00b8db8ae15d891d4a236a4b4cec93e464f0113112224815bea33609d2709822994901b6d53409a56acf5582d350614d1b886a746ec88de46183937b59470482baeac96e39406e656694b29558c9d996e95a0b9577db78dd83557d929a631239d96f350dfb4040020a0b633f6fb619d771b384e7ed04486d407d6f5745541052de5650a5e12dbba1b1cc4973a2216676cd572a3555a449505db672039a732bcff43aa6cc824d48c37c929bad773941decbc374596e0b7b5260393efc00e82bc15d104976a3264818c8a06b4c0b4e096569bc04112e854a65d4c1a5e85e85410e9491317110cc3d05b826730e03a051822c1fc8ba432e12adc6cbbc7cc31a2af15d86ac01d2398d33b31a8033825111f940009fa40b34f2a9650f144e673fb988845161a3135624153113ac3d2cc0fc937221480dca13c4c95b8a31ef4697eca32af2390b847048d04a4617acb98a387ea5350f1913cb86d454c0244d407a4cf973102070f0de43035305ea16d456f780a6a932583b64166ccf2a39dfa09fdb2a7767f5f37b2ddfc63f0e7a5f77e26e23c1f79ff892737dfef821e509068e0613f3f011de3a55dcad7544bc0299689c2dc91c821338ab28d947a6dc46481117f64420d76c6f595e994d12c379661063cdc6f7223b8a5277d3f47ebad5ac62cfcc4532670f7ad08008f76bd00a227124612c18a5e97963ac930a6271de082fdf3cdaf4c01673c6210c316d671498754d49349e2ac8e276e0f3eebdcf47035ed0eb702fa6fd223cf8f54d913f22c0e825bc032e842ff20ba49c3bdc7b16254b359200e550a38cb7b9003382c8f9163413279c84a93b886958c868d44ea61688159e4c373006eb9e8c67d2ddea7ab56927e0d87514dd441939eb6ace7b377c95b5ace274ee1c620b732ff708abc3a7c6090c49ed1a939ebeda518d824025ee08b1e6a86008bb3ef17d41e67f818b9593387bb4ebfded5c2773c1da5534f4a5caabf5c316493a39b8030e67ba04be9bae304287eb9b30414160622dbcef4ade05ec43b379c7b1e8bbb4f5d5a183636e024807a5aa6320ebc592ff7769823687ce4a53bfdf81932988cc61814fef881d64935da887dccd2b64f9ba2a38997416ad6d0d788d64454e8238fdb02eac67a4b30d3ac409710c76bef220444e342a463dac5a30fcacffb1e4f21abdc02571371c283aedeb4facc6084858a8e3ad1020a286a8b4270949367e913adacb89056b6b511bdda4508e2aaeec27804f19823eca571460f7d584ee06d8abcafbea461dc639f719f5931d17dd10226d3ba73da7705f51ad543f23d4add24930548ddfc78b00b14d6731740faba687128ee85a17250432cb34d648edc48dfba80a1e8dc942cb2056d3b44c680b925a285ce058f1b6c7d5cc6c086d4564342c767ff80f0a408c40ff14c6a216d64a3edb844a30c95c8b2f2c287231a0a82cd03e19567362b18cf26acc95c89b8c8b498ff2e13266efe495b57ff9a3fd764989d6b579632bb44f9dc36604dcab2582f9d382d1a2fdfb6da3f00b3721894695ea08b56459138260ebd303028d7d316406b8dca3132b26d76b09886ba5af80e4c4a7ff6b8ee5dbb38ef75d5e72659f4c894117ca42c647126a0fcdf732764932f387344fbfb205f50f59e60c0c6f519ca8d34966ef34be5a0af2fb308c6bb17cc2f5940f445deb20fc44ee5a248c4e742d139ef1d73840ff245e397eff0243f2490f8a727a33e102ab21f009a387426576f00ab9d296e76ba3a47068d68eed722f7aac3f15b120fe6c22a16d6dac3f2519fcf80d9c7830711204322e898a897747dcc0f6536e560617eaa122713f0d8dac291ce46bf3c94612a1d421767067d123066071b946216077eb391889545aa3fd5d9fa4470709cce7d4c8e02cb742f4278c68e528305d9ae741f30b4f550ac0f0c02c95784818ad4c5a3f963842907427ccd09521bd9be4ff38365985958aa976a85d0cc440e004404b324de1cfe30624bfe608e76c02c6fe9ca9179882592981b121ec9ec297ec163e4acd4510e8d74788ec1c677d6cda4f68563a90af8cb6bbc0b08d4fcc6b8b8c9345c06b8960e10680bf3fd252aa136b4119dac67aebf197278d0001b84aa28ea8685916311c8bac0d25b84cbd71c8b7ec31c44025938ae9b1a1d5a15466d51f165058d38ec8d40e9b53540697810b2345ed2ccef22dab076baefde375c3c9b514f2fd50aa824d2c832dc91a7163aec95691b3c395f38b63a8984a34b6091aa67a0d90f0d69429cbd6284860f8d5dcd33bd417dbff5168b3006be231c582e891c113e5c17991965c541cb6dc4cf5500115a329d1fcee0b555f6ff9aff9f0f26e34344cd3ca198fa6d5bfff983828201402a9a0929fcee83ee3ebbb586232214729c3cd9f42d6a077840d688d592d3850b83e01998ed1c66c6477ae6fff271420e7c756d67fe8b440a6ec294f94ba1799fa57261be81f59705eeb36f71c0fe1af2664b7f247b71ee59c0003128599fcb69a021b8674d543590b84dee93cb7f4d6aacd03e0c1681857a051982e0da11cfdb40430b0ac3b40d78cb59d4f09e16c01a79941433a748820600fa0aeb204e9f8e9e109de712b4e3d23828fa4f321f2b903b8a0e2c53af4012641bd0d91fa61a3cf5b53b8f82c1cbfa012e41dba002ea3b9b352e6f5cba1a55e6849bafc8688fdf874c407325d059f84165cc1adfac855fbfec9b99ad688bec0801b40db4e601f881414a4c738acc3951cc1bb06d40052d2d0a91783e969dae78dfb91b967026b5df803a8ab6c1167a2b3f0deca7038898691b3cddb8ff05e17b9ae7ed5384180e788dff5b806148e42d8c67f348fd2fef8062be1a0052339465ddc1e638050b793918cc4921643310b22f1e03dd22fd05ea3ca3367820073c89583f9e6b580351d082a63007b2bdd4e4c2ff57860ae842c94f03a7d071925440c8350c62f1cca5dbe0937a64fedaa1178155d094fd79c12b1d503a144c574582d346da54c45f9fb9286e32d53cc6f567e967b25eaa2bb8e47457303730224d4b25f844b5a66d0d4eece5dffc4f6932be212fef9028bd6c4c080bae49cbfb73a53484ffa15b5bf25772dd340d4e7ff0b4cf204d3b6b2eff87e36af9ab19a4e9b93e5075f46cdc9def632e709e59f5dca3f768b56f251d53455e754179b21eab584dedba9bbbc42f5ecbc4ce1b0a4f378804f393403e0877a0faa51fe6dcd3a2f07f018b24eba9e2a1978afdab50d8a0c0379e7c9805b67c463488a6dd708d519b8b6ecee534a21cae9158bc3a8ee1047104d6d22bb209cf4b536fc4a532fdb7c5c128cd0c18fd8708035672fa54a6e5539a4a599eaf9dbb04654f82d190047d5c3cd7ca1c4e9c812e686398b2d9309248a3ecdc4d7be490a79db30854a6293bb3866c3a8bbbfcd7b4334b3b199c0cf4963eb10f62ec277bcae0d6886c1af15354c90f9833ba6c47442af54a2f7ad5d0954fb0bc16d976d1925ceee5c9c5355a1a8dca64b18481d62a44a3b59432793682c7e9ce6bade906e28ca0d00a83945b5cba48d0c0a56f25f984972d035f9cce1e3efae090e38d5fd3ec76db4a04e3a6186d6944a7b5e9256fa6c0510aed58edd745949385a98fe9744e2908471422fcb69a898c6dac858c48435725bdeb833cbc8c90a9de9765b850ed685e7a6b088a4bf8d25d726df6f653017ca0c42e17dd0cf177eef332412698b4dbadd16820586190605d769105d846be91f8d6a0e7be64fbaf5fa2f3ee8df171f6368873e0965e4aace08c7319d4adca10218dcddbc9aa55ebb8c5ffe1f5c607244cbe6864f8dbf382459ec83fecf0c8745f6e90900134a47c8ffddc7545c7e80568a008b0c30a1ab191b16fe6c0536e32c5e9014c23cf02aae2483dd12295b6315f5d3cc6dec2ddcf491227dbc19bd56616ba5da762818aa1c99456721b301293cea2b4fa5a5757bd38b90682145f8a580634bb6a77845b23baa22bd80ca0927e7e97677ab188f6e88020272636213e7fde3ccc06471cc400f403fe53b235243070f1ad52e85fc5e3cc7af458c5e11de70c4af23be2aa0528a533c366044fb29c177704abdddbee0858ad9c7d6c196bb72ec87b3ff949ae93b0182ea570e149615b525da257a15eb21bab7f218c7f438a56066a896fd65d37b05fbfb583cd7d49ef73263233abcd29fa22e66f7a5bd2b8121dbcf9d29cef144fed79077551eb0222360693f332970872e7c49f34ca2e341ac21c4b46bbacd47d4e52c5190c933c82303ac9ef0c453a144d50722c647d852e65cfd947ef0a1762cbf3429c71e00a66985a1adcada0ef00d1a32d2431efe5e292a511b2f1e7068c5049ef6519059cd8c3cf60ebcdbd5dc3503a1b05b2f04446e64cac911043648c6be03d279fba56041dd5a27d523d7aa699d2d8f0a5fbc033ccf18c14902fc573c9a53fb195beea7d10a7a21b8b321b8a38758f78b52c9a514d77ba7af2e58450ac6248f2c1e229d61ac014cdb0f2893c535fa2a4a0af1c244eed8942388765e053d80b62baac2fd7a26df56cff57ae2ffd7ca8f88d773208c8c5524668f279370cf467b87165aeb5d65b8694dbf8f6fb17b83898e21096eba07aa189c3fd2f2674ab5a83e3ace39c2f03eaed29a832ca929baa11410d06f71a3fbdb84e8e2e48814ece2a693987100aa915f817f9175af00618e0f40ec29a1f60c391d04dee483a8e808c0ad061749986bdd349708a2c63bddb5687593dcc654e796112160661964fa290751dfeea9c802682a33461318c0a2c18ab090570a814c1e6a9185a3db4451ca810c9849ce32bfa77b28c48654f23bd762644220e8077ae2d60063393a5057bf0a46e9818475801c7642be0d44244821e6183233550c871dcd980449ae5991146f4f0082e25db203b2f0466d3ba8171eac2814e744abf9a3abd8aceae4815ea2fd68c12b902baa628efc7f9ecab5326fe8408eabbd4310072190aa8f0ff7e7d13049067bd3dec65270515a9848f85036e6f0094ffad7703ce90004410c8d2010038808c0e00e701781b553f482fb0080a9409c173d057877e44f432e7b7449220009601c227010b2a657a0fe77c02940062180014ffdfde4d815d1bec09c216acfee0dccf771fc391f33abf59fa75231c00c68c8c1519402a231b85545f6d0ab7aef4a2ee017abb64fd43549ebf0e27fbec582718f6a51f465a36961d53811beedf1c6b0a59ea5d449b51c6fd0e324d24c7a8525b2b192e41860f7036f7c52085fcfcaff742b4ba4b7a33227d1cd074112dcad8b0cef632d7713b0d33c905b8be2fecd17013e40130ec3545f8a22b922452d22d849fb64a9de4222992e19f228864276273bd88994419ed6b368bc5eba2bb2f38acab3b52c0965c5929451bfe14bb673a8b2312ec0ae6763d2377992bed737d50185e1fed62023d2a5278dfa84cc196027c6c6e6be61f4e1aa01d7b72738f9202a31764020a27531595ee2f1c8880ac797ec59ec6badc9d487be97f46b1a8a349695b6fb2facf4e2ac02f0ff4c34901f4b84ec4ec945a1fecd97c2a43d9722bfa168d2bbc55f1045c4d277ca8e1daab836126d28efc6247de63afd8e034a89a1e6fccbba8e7a19467ecc8070fafb7956676662f6ecf4dcc7135585392a1778217bf6caaa77a8160bb0e445bb65926d804fc46a2928c206eb73623b9f23b159d922b51c101f707dcb3d74bc10081225506e5d3393b5bb8021621de3a49fcf679785664abe0c6bac86600ca71d2c6055818e5b03a385aebf94eb1f1b087f49ce1b674b1c7520abae9ac5785400f98918bd80e5456fd8308c322a1c2205291a7539848bdd9bf88f753083e3df862caf992ce81c887c18c7a0434341ab02ff0cbb11f24d07ae45e58bfdc6e9d44d42518d34deb0f70a84bd026536dbc677a0979a46bf91fb32594387760ffed0b3b43ecd6def8f211a64a7a7993344dc6af8332b861a941bcb6c439525d12e19d06c6016c2de9c42f3aa94730cad07c97be8fef4572e3ba30166d2b094fc7543445ae72173b6ef97b37bc26572003df419fa9b854b0b7490c7d0e02c42767b77d22baea7c2fc3216a705d2559c2940e2e4e35f45c6c0fb992ed2dc75bc3856c4624a59ccde65721bad01f02befb783e374b3b1e88277de1f20f610413d3b0c56a01256f38fc5e99b42f327feda59bbd7dcacd6d2540dbe5f29a4247302c0f73c5ba092db4645847d8adb45f582220eca030df2d5cea1f64e246560dce0d6486e958a16a371f0f48e3af897018f73790b17f9a8ae06700bc748e23a0fcdb90670f2c19bf882d7dcd0196e1d7462f9b09483f22d249c5482ffe917e1bd21ddc3d8fa5457abc70a44b23df10db39abed0f2359255da431e94bc34927ff4f7a711aa5df839bd291376c47d20f2f3dc2bf74c1334c5f3fce742246d30b5535fd7e62d311839b1ec9fda68b1737252e74dbb4411cb6a403b920dabb303a2186d46a5a6156ea65cfd53d07d70705c164d25c83e867f0673868da382defa8db73d72dae539255c6b13b099996c280fca313ef0b2e5074d0b40ef403f31e7e9188375274075d2e651f480a9a80343f81b929aacb05508b26edefcf7c557c175efc8606f9003afa943396de8d6361526baac6df3f81a39f5df875f68412304c4142ef0bd9fba5924f6209e3e8cb07590ad104b4c2292e4322ff4ac24196ffeed1f72839236a97e7b6d614f003f214f394bc084ceb2d32737e43e7f937f9289d60f7f4a2f166fc1723eeb5725bef3f1bfb8d53fc180670b3699051f8c1ba8bed59307a7ec882c1d991aa5ebe792d44fa5114e1660bfb64faa62a67ba286679ac8680523da92d03eb2da38be500132bc92ded6444f2430e9abc77ca8bc60ef1d6b5122e8ad6ce20114463a3bd9929b6945c39187c80b0e38fd8934512a33612e71f3556c6bcb6cc84f8f1ce5ea194478ccd1ef10837acf04bbcde7469adb28c47958a89023079de48ab16b117e1e2b835d98682da89b8f60425213e98303a5622811e63a36d7f726c66e065d56887ba31ac0ba69d1fa48269673e35eaad955d955d11a466d3080fff8c5d145a34b13b40c387e84278069e69a18212edd063f6e7e4345ddab9e455638d91e65129a030352f2259fee18783a3178131e39f183a80caad5cc95b04b292366a0556b3ca5fab65e715781d21c0f1207316c03a050d02db53726f82cdcc83979bfa912ed8fc77feea1faa1b04ba39521a96a6917cadd4d1583a3f2c503b5c21fc542ca5d73c168382d888cdc79344e777509505f7c2d4e6375fa3a9643b66c6336959abdd82d4bceefdb57767fddf12e4fd180f87ca63fbb0a24489f40f56d5e1590b1cbdbcea9591375881e846ffd718d0c2deea8b2d43d16e07e01e85279a1d0fde32810ca973233254dd3c922172919b0cad548e510f9e45ca114ae131faad36dc0b0914b7581f1b76e3f0a5e322272e4cc764d4edd052dd1821c6802ccc207a3954eb4514c184fb2c2cebd92b530f96ba41587e51383f34b6e815cb88fa8df39acc7781cfb518eb486b4b8e7bf9794f6a67f9afd0ab9d4f842190f00ce08eced928a161d0bee178ed17127ec2df7b22105d7a5a7649a100a485bfeab7c830f5c6beb7ef6fef0d281296485fde9b35177698342560266f64dd030dcff12662202a23a9e9c9480f46328a3b4346a25a2272486c8b4444ef47dd140645198483897b2361982e7e45c6edf1d7d1cb0d1676b1490ea28214489a7d28514699ee5bfae8eda0d06f41cbd6d4101def5c3ac6e3a3b8a66bda9d8dd2c4848eda54cc8579a88b79231e7f0cf1301ce3311e2cae42f6a2f41c0c537c4678f21af37c8610585ee099e9c6811aaf5295efc806755145bf05595e864f3ff4426fe82d644feab13c4185eadb34d13d81f1c391a58d7a19cb1b590d94e89c0d45b8b3e82e7af3ee2d6ece79f9f2fecef5d824a06c5ea55e57ea16f092c9a67aaf86bdb038f94b2ab98d20d6f8665b8c2b817414e1e6988a83b9820f75684c4383dcbd37700d47dad03348369d65f506705347f2a44ffa5aa22ae9fd3bd5ddda139a9fbb48daac13ee1631f89e7bca77b896f30ada71c020f1a603b1e988a0be7f2f0e8e715bbdec0e50ae6e7c28b7ddec27f8c9f6088a842cadffaa3f2eb173350cf0296dd7b477ea5638cf71190eda540f244a17850ee97da89f15565779fc63b67ddce8fa95b5ef2afa52be756b3ae60dca30747a4b912ed578d18b15133935e9250bd031f29b0a2204880a4cb6540efb81f68c3f8e78f681b741e316081572746187c4c7b6cb837528ecc5271bbdb63f1f9d5784078fe8d4f998008e7f65140478f6caf2475e69e40c29fbf6eb4424cf44fcd5802a8ae82cbd6c7cbb5afaef832375277118c8fcb370f89efe21e4194d2bef104aaeb4a10cfc07fb1da6a55febf10f51d4a3974cd72bebc7707b6f69a8ba7799bd43707d898883c058958ed1752b551c390188bb97bf7893ce311ed9794b19a3c33d75759cc5f358f7eba1aec1c937b8a9d6c008ab6215bf86430059586bbdc0d75e792d6d0ea131418cf6d622cd22d17ba914831335e2a84ee4bd5a9725695aea1fd0b6f9c51d38fb67e67d185acff42facc0b9b7c90acd098ed6d672bdc5091902ad932aa2c8fd970921302e5ef28e2431de4dfa814d30d62c4c5d1f0348dd8c492bb2e8b7e0cbcb74108ff73c1947e351dcd37b5efb2c3f0970b4d0ae8668425457749528e94a2dbf4cddff563645633653b35d76dced86d5662add7ff808edd1534263c9b3ef202c0b43c686bd2ccc6e67ea641b5c4a80b39253d6d0586ab9a21f05ac8bff080b5eb29d33a8c5bda9158ef1f2c55878a15d1c0669b2aafd8521a4cf8d63e8014d03d6c61f37b7529390ede37f7323e7c5fbeb77d71db9999bb99a6b7bb7b76b0aefc1166cc12dd84e326b0979efe28c493b059aefae8cfa4e857fdf5ff04b6849c7fc2e376140a0ad77f67d7e52674465ad9f18f9b4058000898018162d2a081765c8e94e8342b042a4f58781660a305cf1f5ffcbc8d6af0a2c00431eb46ced5f8d4cf61b081a152280a86ed66f126e15569cf1ad0a86292cb62fde7d261651259ea05ef9af79ecca89046224086f3308d1ce0787b1bd77013c8fbe06c2815874f58265d616c6a38aa4b54ca69d74a3a50ce715eb7b3e1de754e3ad401246db83f5f119bd84f31524fe0343d89b53423269573c8721f1c486bf1f837b43f18db7e83fcb999b37e921365cd2723df3d95392584b4104fcca55934626fbb0155f0827a2c2be6ef2066fcede8b45a71aa23855c36b412122a5bde841181c37934a282b8dff71a759ae635e013234174869458c58e9619067558f609be6b78fec0176141cd2437b545dbf97630d5c238558191bd3fafc371a72e08b89ebe0f69178a3fc1c829729fe45d0084469a637b600e4ea3ad5cdf5c65b9ef95d58581f26286ea17e3cd8cd0436b49815c47520b2d79121f9f57280df176e82bc015338ef9391e70e04b53d2d480900af1dfc9e03d3d3b08a6f7bc0ca0032224372713a1bd11d00743ea06efd0bb7653ac8cbe5d982f3901d38fe563396ee6630890b35a9444221914864e75c771b7e933779d267f22e2db3be37541c418b9769dc2e65ebbf8bbbf550395484ac405e0c333fdb81e278c67a4d51c7472b383a95f19702d7e9581e76e058047e72b9d88125be4aa3105c04fe38e10406cd59781fc8d01ad00ef2db7ca2266d3b9f1068cf19276e3e5cfbc5e8d1b96c536f72598935ede064875b5deff0ef2d1608e0477c318a3f4d76897978e4ef2d33d3232a804b9e0a6966c51204ba55888481001740614182c695f9b9331f4293a2d834d40bcda28fd37aa78f25f6c5e63c74ea98d43044bf9b66fc2fdecb61efeef29777b0ae77874bcaee04e600a395f57f2f6f274b99cf6668a50b702a4cf8705c89da38294b72f27c1b88a014c44ecb69c3b52d0e2041f4c366462b90fbe123cae6010b00fcf95953fe9116fa181baa94ce8e3c6ec202e42c17c8e9f4bc26fe58dc66d69f6ac4b63f755aeefed47b6d8476c116824cac8fb6ce4de10dfdcc8da71d269c7e8a391b8f7893ea3a22f5e4919c93333dd31e3ea8c2a2faba90c2aaf6e8cbe4499b8c399bbf3acf8894b766830ee2244fe403e47ada55ad38abf52ba1066aa48ff44cad70ebd7734d3ad858ab73552cd701395aa15f26c2910ef650940a62b71ac9ce4e5d481c85e529c06d13c8d8e3d0be2ebf09431f986d727e35155eaccacd9552d5aacd661d3108cee356078de695175fd4a500906f8f81f21e162d45f753b72b45423984266491308a699d4298e4613b65835c2f855cecd72ed364954c217c0d154f28f8daa953ca7b10bd6d08d36a13c22eaf8220a5ed80a097d50f742260e0746396259b9e2d8d7de35ab917b2e0a7dfcc02786d6987aa3aeb86d91d574a2f74308900ce1b4fd83d22da3837d5de8d54e7ebc61299cb48364b2fa1d6ab2077356d6b1b5f8ba4ab03eb2016d6a6cf41fb6afebfffd9ac8a3119e7d44ecc2f58b11d33debce5432617b3d55b4688c8db9e8b12db53f3ab3d914ada1be09498cf0e3da4ecd36e334e4219e9239712967a0a2753188d7d9a7a4d264d64a56bf9a03c507b45a5a08e69d9827a497049371b9dbd28c73b50154da73e8f2341e5916f45dda19503e1c016840cd128e4dcf69157a08f10c3c1f1a07819981dc7b2ade85bfcc36bb165b8bf6d92f650103a50cf089d37b2848eddffa384aad2eea037534468660562ca4ede7554cb806d47d5509f10c5db4d685abc7d5b2ce38d9b001bec8295bacabf552f67635992b395fe99901f476355ffd3918c4d92b63717f6d479bda76841ccc9d188b6f369c1d37c9e1758e728798915e40975e85247dcda31a706b1ef74bae8dffa991f8acc09dff55fa5df70cd9b1cd378ec4dc1dfd5594d3099ce322de777bb1b9d94a5a36b30df14a6ea53d66dfd2bfa224c26b7ff98c1b0068cb15c5c93359ca335c8c094c36ccce411031ef78cb03dfb59b730360e4aba3fc49c6f6584f8af63bc09a1cfba13d7b1c5e5c79ab4a70bc4a32213c75442a0f69f061197ba49bc148336b28d9ba2433679da73b6bf7e829a6604dd41004a4be715c1ae30f3380da5500b5b6bbb06630fa06228ee197769452ede8d34dc233bd3a413e69091385bb0765dc91f4f3166dd404a4c740d7a18a9035e121049123833736f43036020f68c0934275a46b264dbbc67fd09825d36c7660a5fba92225eb211e19e45dc333fa6ff8fb5050410d8edb4ec98a96fa9878a58a8f6f788d1dbf4a31df8e9ae813cf31e61104d18af1ebb66cf7b2aeb78889d4e34d6454cd15437063e6e62931adf6de700eded50707a4860a0bd1ba886e9f864d80d302f0477c41adbc4bbec2855e8d973e1bd218c8ed865356d870136cc94766a7a1843b49a8f8eea2ee330c9bd63be64eedf3a8c9f70b0670498600b89e138c951a123bc21d3a9a0487fb2314c789264eb2e69217ccd7e43ec97d6604fd70698a8d9a5dc23e4b8f8d3a7de3c3bd0c8e94d0deea3d3b5aee4eaa06ff5dd294081a46ecb5343ca3e9fd86dcc056996c13c084fed2c11678186d744ea94c7cd28f270e8dc3aca67772ccc9940f1412ce90a1efe77f20397e4bd3ff4bf4fdbdb1916bbbf81f77cfda1219596a467099a5a67352014aca33f33e2624d084eee16a928b1f16291db16c36dc88710617d77caf03aa4976ac6ab56e0c25f75ca3784284ce2960b6e9978413addac9ac8a5de56495141e4b0fbc05ca6a179a2d341a13b52c363eb035997bfdc4379c0be7581e61609b4ecdaf831b78231ddac9b0c7789afbeaeccc877444ecf8851e2163e5f9e1e7b001216d826b84208f7861fc43810dcb6b96471e88a4975d9a5c0116225bbb4cdc15c9a7aa2841fb94b5f32ead54963a61bde6951703d318e56dce0ed7ea64a9f8fa1c52426cde126fbcaa9e866982f7aee91977e0fbce4077d17bec061b6418cfe4168a2b1fe5e10c88f206279e1de82e9a0859c2384bb2b967b8b7636f901a058b80241c081078c671e2c113081cb4a1a2d1f4c53897b44a52699a85a60b344c587850b7147db7e0d050badee5e9634167fc699fd23b4c53afa6aa4aed5ddea88c65bc20ef18d55208edbd7fd42d08275f165093e02962104d5303feaa22e5a8e2814bd50b8ded4a61e825d82c83b63a8f485875db3ef2f1b0b8b9f47af2c0230ea25c6b5833c643f2a3097b8ead327779a06e550d250ee912eca7da18f72a7751cd167d553f83db4c52d4d489026aa54135eda5013ae354c139adb5ae47ccd896ec2c8b2254b4b87bdf9feb7ef4105096c6b7eb3c178710b3b71c6d07f517a10ce9673451fec8e5ccf677100002ef2f9298c2e5674d26dfa46ae516693fbfb65279a0853d3d4a59229c4f2b028c98e9a110c63b00b5fbc62bbc863c23eccb7495c2cf1fb271a37daaaff7951932fa9cd735ec572642a817e6a6f3e84dc97c2dd20bc711736e55be6aea860afca563b200ee3122fcc5d3d6b9db05ec463a666cd1a69d4a86e5ef0161563df0c00c140551898522b51ce54e0131223f99435813ec5c2d8a72a55f869129e7e223a8fa5749c144294562edf88d81135a25951602a46710ace6d1b32dcb50a15d6e5d52a413fa11659400771e64dde6610de2c0afb0f589a273fac860c8f1a74b9813cacc46b6e94c29d37ea128464d8ef201f8750415f854104e56a7b9ce22db58c069a52a30187c1383812063a750824821116531a2fbcf069404e43f70a59b403fae5ff96be6dec82308968af52d9ec8cb123b675a480ff66bfa8e4d8af82793fe57afc61213f73db7f08d1782fdee58d8bb3b0b8b8853e95af9a0294db51070519549787ee04441b378250ed7fc97a0c145c1aa4a7fb7903b19b15a27ff39a6275bd495e25eba448879e3467122809341f4a54a946c9810042eff737418306b6291e5a251df65e950c7fddaa0808ed826eb28306c691b7389b3987e48d6e1e91a6ed665f3c1dd0f93da1ef7f69742843d162094cbd328125beffe2e58886c991ed66f31c5f4da90a45b381be8720aa8ddd5f66843da5f2f485d92616acb9b8c83fcf41af8b8164747143b15c2cf146a9d2a0e3e29376fe310f8e1e5e4d2fe595e89621370b4df9157e31e73b4ed67d6795ae4a8105f69a0d86878f073fd5bd776bd60aeba2e64e1e4eb024f11f1e1a4805998ca996e12a557774e7eee84e55145fe2355aa36bbc952fa120b342250b166ed70a207797b4765708a4775d1923dd2382dcc552c3249446ab64d20110d788862d70f4fd860234ac389cc19a6e6325017973cea2f57abb7f769e34d3feaa74f2c3eccf012799fa27ebea6a36ec2ca958011d2593d688955cf5e8b1a8c72b6f9fd1df4a7297ac117f89763a869899da3711800f0f074ed0f977d25c03a4c7d99d20a334e9954cd3373b61dc5c95b6f4ffd2664e7494460ab0b165a61e710d30cdbf0c4c0adca7ba1a577ad8a446f170c95d3be7e238d69fef447dd7ffd87123f7f171571d233445d7b166bc158b3e952365757b7936477d1d8c870c294ad5239940efe3ed995b79896ee8b0c3e5fbdc57d51adc65b98ed09d1a61c6374f10f77367edffa1793f6ee5a46cbaf9ba6973f53665e7a6230873621befb1387e2b151bbd05cbda612a9396170f21b4db96367cf3a9e4c1827add1ce452c2d91b43bb7963888337cee4da8d291efe7708db9123b2589096f8888fa426f8a93b7c04238e1d73fcd8e311b6132713602d35bec66040f03d9e44a215fa1eb14695dcda9dd1a4a48c39d2159a62dc76bc112eee77454dda8bd68b6538632cf4178641f5956b92c08adcf70d2d0c5ffac7bf8385c5dbf9afe4dd8843ac8b42fbcb0b14c2ce2e4c03a1a990ad951d1705b6556373253a496b10db34d636328f353bdcaa295ad30037e055c5dc1db4b38fb7b1f6f61022456d8bcd77cc06e0c6c3da32c5684357587e8d23382c8318b24aa8736c39bd8ced938a550b1d239dcf49792bf4b50a47029c35422a376cbdebbfa61b2536b6b4653317c8fa544f37fddeba54e64ee7405bd4b8015ea2328b25078ecec980d639f6faafb69441c4d877f52fa8503e94bb65c9e2abd5be71b77d14908061367313ea48dcb5de8cd7ddbb4dee11f07dd919440319519cc7208ae5621efb8d9f31f6cfc4aab113a33b0bd0d40e84071e0b048e6faf1298ae22a76c78ecd5e6a241628cbdb9b0c27e4049a20927363ddccdf34042014172ebb594c4c307793344fd895795f7d81a4b3251605e753eccbb0da9850cec594275297b194bb1842a007bf2b8aec0b0fbd2773b1a77a15673e38300dc125c06812e87e9608600e1b17b33038a68c912ecb4ddb2eb57944fd68bfd068a26d0e75bb5dfbab8cdb1e66a63057a80cc64dfa12aedacc7f99a1929e0302ab47c61861560a8f96b874a51a6c4696b581646fd95906c0533abc568cc205ec0a96ddd37130835f0b9229c246be2c202a35b8bab696253053719123db40a1deea51aedf08b7b05779cc7f78b767914e1c0b9476da96de84f008302ca9e5d1113ba76858c5b2cefff08d8a7b5c6bb6b9b1990afff225b0f84c932a5b52ee843619dafccdc8ec9407cf83871a3cebfb3668db01e6f4faa5824b907e78fdab41f5903e4d79f5bcd911000a930d53d91de98c260321183984249bf7c46cb2414a101f2f7f28b6ed339e62b9fee694374bcb3eeaea378ded5ef5b52bdeb6f5c97e12dd8822d587d1c0510a4a2a036db77cab56362ef0cb7872b1af96ebe40a2d1b9e03b075f714ddb52c2fb06e7aebdbf41e98cb481f19fa1c65105e67bd6270cdccee33135bdca0ea1a74c38d5bb55f4caa4feb7b47696fff8589b75d1f1b6eeb79ee9b9db12cae5900416de32869f28857e4911334b847b4787bb9748893f9ccd10d7da88e76b89df9489bfccfbd185f5d690c81810f593df177880963e28feab6fb809eb8bd2841cacc0e323740bd7e6242e6338238726bed2e5847974a6624a6b59b9aa69734b22286747ab63448773087f4adbf8942fe22e359e9c58b34800c1753b6dc6a2793074ab16a38310387eeb563e732a3960c0a6d8bcd8553a1b3883ab0367face3e831382239d11cc7cf0082232e7062e0e092dee6934c2f0377ae7ca42dc93d4a15380fcf7b2251f3a6dd8c41969d8b42964d89033c3b05913736153b15ac651c65a0c43f21eb14d2265f511d080be71f541805e1f47fede21b783901444076a9350f30068bb92bc08c0da2b2552903df32f291684babf07a144fae0fe4d8584b8ecb92858b44b4c4eb630ebf38f429da8e925c5ede4f26b7f60480b614cb866fd6a2e75cd04a774c44f04c2a678f8723d0c494799c809a845be679be513d46b11ac26067e6c0f8fbfc777c408a0500ce11361a26541b064eff0ac9f9fa85a050fea0770421e58c6ad30b513ce909208e12b85ebd9a2da69a90ddb4f186419693e774d9518ce2f963a6d228fa7e06e56bb16f4c813c3ed6afc7fb4517aed0cb2bb632ff3ed06ebba2c106c9d69b426fc9f7cfef0f9dd07a32d9da1e9d4a135485a761cc8eac06cc290291c1a509c76bfee86cc9ae78ffc7a3202f30d9ee683acabc499a4e238135e4f08943c7c2688f4f9180ff53ce523b4b602493ceb5f198b094ef5d617c52509bf79f272a85de31f0247c1f08133a0bc14bc5cb932b805b37cbf71737aa179799d64a1cc3897acd0668d1070eeb4dd49eacbead8faf054d3d368f3990fa1c59f9aeeadcde7426d7fe20e307833e67d185ac7f42face0a9b7c949ed9c78452995c3e29dafd4b58d8721f91eeffea51e441e574c133679077324904260ae1c737118577833e50e6017ef68656c050005352e2cc15edddc466c2e6f6b406ad9014b713106f053feffed75b15c6acf252bc9db9bfacdea422e876f412ba03888d55802cff03b330e2fb471180ac39ddece6b1af2529f598356ac76d3c1382d4b568b7cf02846006dbf34c51c2accf0bd950d8a42caa539adff09b5e57a88521d008da421e64b9a6ad2a489c6414fa3a53fc676ecaf46020eb5816266c1703ff83290b54e4f942528b80578f50f090909cedee9bcaeae6e9db49bb98c1222d9b0b361675913f69ae2db7a041cdf0b5247df87327e7c06fdb52235716e89fc83bcb77a5fbcbfd81bba00b2cccad0054b0a5d7947e884a441553e12344a9c829430d9b57fff20f49fb608d5924142abf999503ebd51e891b00af504d5cdbb396e70371b0feda3fdb4d7746868e4d621adc891bec1cbceb7598dd5bedabbb95fe7700bf6d016ecc1b6b5816e04219d040ebac6a67a87df855903f68f31e037ca8a2fac35f5f22e730250618c3e28c5da7019fa93105fd92643fa5a639c4aca05923f42adaf80eeeae244fae1c5e754e7c2e3b3edd23a273f08b0bc0c7352cb3936490a44d1af95ea74fc24fa74ec690b75f8941a75c429a9ab83dfa9a3485c64fc257042c2fc4198e3f0bd31445ac6d3725c113028134996bbe7318e780832fc6c56a798c8b0f04b417aaee2235ce0f71979c235eab6a28bd03593a65470e22fcae3a614696d0b96e3b0a2fa22035c81735ca0f79a3103f61c168bd5b166b89c55b0cbd32bffb83b19ff9028debafe885a9e73838f0b2cf18364684e76372939ebdf6b4976edfc3b9af963b482507a0c85301ccae30b83d0aa1f4c93614226ddf439e81aa198e77c0f738790608e19f4cb05d1d4e2c64cb0e0330cf24e9c84539647d0489c4b4782bd7186380950c869a0120ce4c9401a85d3558e11ace9d4c8194d4c8f6b9c50c874efc43140a6d3289ce151aa1081d3d94c773b0b9187f8701f73239ee1c03a53bf70078fdef46bb632abfa6377f63bdb374ae489479c39c8be0b4e579eac1a999ebe135cdd74214231962fde93814593a4cfc66f733a528f2299b702ce839ae40cc855285f038598297526ba9aeea249def002e5987c203c979719a554ac85c4651c1f15d967002647e2d161e4ef692a53106eb583c27cb6e1b80f8cd2fe5df0ef1a930a2313a50709ff89b539b2a143951f19cc2dd323e9b430f1a78d4edf86122fed3ae0b2b33554390269b4d9dac94273845e074a641194ed84d4bcc21d090c8fc92df87b94ea56175106cf4d8d806a69542904ea97e3bd561058c96a3ac207406aa0a61b9e65e7a8fc68a8d71019e7a7a17fb4c8948651c1e2804831dd44190000871fa0c35576db613f4b4c11b7d7b88459aace55e2b6390bd8d5166f03964b879e112fe94df6de7b6f29654a32c20bf70bc10b6d6484696e31f9cab3679a7b666b69f115ce57aec7e259dcfc71952d9b169c2b21cf9d5cf7fa2ec24e5ec7f8d34edee6e608a87f57f81faff28a489a21a721a299b9e9f32f4cc38446e6264d1337a7a091ef8b0338b5847cd5921d41572d26a8795f87956b09e0efb764fe57872dcbcd4d2ddec2d11dad30a8d91283b6c8a03b5a65b4d93aa3cdfb228f934dadb25a3057d97cd51272d3e60874d53a829aae82e5fbb57c59392fc03a382cbbbe73b3eb3a0a06814c06df855f647675d7759f80a6e1161314b85504ba029ffac082ae5cb88545165bd8b2dcb4e0c210839af7740679dadc6e684d50f3fe59330ece4ecee666a3c55736389b2d36391b326ccc307d304d6026690d791317b7a2d09cfbfd046ec1809aad19e056d29496528b8a3b815b4b48b8650514dce20135ef3b41cddb9ab9793f8576426cd1a88f250ce05b4cbe727d8b467d74462a73f8c9a165e81edbb5667ebfe5c4dfc771dadcfa094cb30bd3dc5030cd8d84696e2730cd7d8469b641d04ec850239567cd397fd69c42cea7f0ed8451e6f15ff6512b4beb467dbcfe7ecb0bbaeaa2bfdf0283aedae8efb7c2a03e7af6f75b4de8553bf9fbad27f4aa9ffc7d700402640ceaa381283dc13e4938c13e46b479bf67d8a708bae37e1b611f1450f37e17611f21a879ff857d6274c77d17f609f2811de11f4d6eded73144801759f89173f3a6325804f2bcc185af93eb56f899f7f18554eeca16d30bc85327e7ab9395eb749a9cd53a643a84dcbcd9e6ab548dcdcd1bffc20a405678202ffe38d9184903cb36469e748949c9e55b4c60631cd928976995222c2a645aa5484b6e61415937b8aa8ac9acf041888c581838302ff2bd0173570a99d11df705f05d9e3966d1bf00be8d4eb2bafc79872a3e99419e3a399d5c65b15e7f7eae3f4999d7a155562b7193ab2ca0bf8f03abac227f1f47a8b25af6f77168f7716af7717095d54cfcfd1d4295d54dfefe0e5a65b50afefe8e5a65f50afefe0e5c65350bfefe00842aab87fefe006895d52df8fb03a85556bbe0ef0f005759ddc4dfcf11aaac2692b1c1bce14f1e18f8b34706fea44bb44699e88de268eeecd8d9422deb192de9eca5b36bcd743b1b7776eef4980bb9ecf4d9e9344ff225af31f9cd719e8b9d55e8acb2b3ce3a891b5cd20d0e7f4de0cf05f86b01f686b0c702ecad007b2ac05d13dc3171614be06b93e1aba404fe6c49d0909831c14718516345e484704b6e4430a1a0a664e9044943d08498c570102e940403910bc2fd703301930fddb02524493dd07898ed202b0126c1087222c085e00602a60f6400033d6ee0618379878ae04bbbb33bc4ca55d6f72acf8f74952729f36f76ac5cb36c1064cbe6268157bdcd0d862f9f47f58f6c49239b801785a481e515bec5b4c29f37b83fbf9c673e777983f382fc9e1e5a59393d39b9ca62e12365645eece9e9e9e91142ab2cdad32324895a51caf76f7016e7e4fce8e432b88484a14713ff2a648a9b574948d21021b4aac26273d3e5e9d8621242abaabb93abacef2349199904fcf9a7cdcde6e6e68d84a1e61e4d84d02acb7bee8bac9caf4022c8939563e56e7051c8f306d7cfcab19a7cb50198af3a10f3552bf11507847c8583cc57ae264344bef2c0dfef81d483e6ab1cfe7e0f29bed2e1eff798e22bf06f063d80c3d701879f036edd5a38376f4b8b9b17073cd38fc3f77700cff477e0fb398067fa39f0e16f00cff46fe0c3d28567686e6571f33ed3090a647fe71a26f0e70d4ec89f3a39263f7000b9b9cb161314e48fdc8fa6b326374eeefa3b3957ddef1722813f6d6e41be15a415e44f32b7de621a59553dcee774872a0becb94f03b331f2bc433f34305f0539d1c0c46f6400d863cb165355dd3b7487aaea4ae0cf1a9a22308d0cb573001e17b28e8f1e03fcf0f97901c8b55ef546000543f134a272a06884e88efb38f2488187a1511fdddfb6e51c5eed8d609a8fe0f388571b957c8523df22f2a599a2d4f3270d957c6996ae58c9f76996a0b4053827f98eb928f93e0e189af8278d50b8c5cd8b67be7c763ebd5542761f9637b80fcb4dce575d795d7f82603ff8a00bb798dc04cbf3b3eb69846884a8ea3e589eae0f5f74e19bdc0d0edf6ca137385f857fff66cb4dce1586b83f77d9b2e548a529f2491ec18cef83a18d3698154923e4669767e70569e43b234f23f434429846d66f0e91278d108dec96343237ef9f9272f760982437eff7601823188636932de93ab10343300489203defefd3d03c4c330d135f19791a190d915f1add4c4883e4ab1386d6d108d130c9924f349a24251a2af769ac380bc646d3c457b48a2c54f27d9aa1d0eb6068be92e2ab2e23c9571698a2e4ab910acc92af2af0f761acdc6fd9ba6f31a580f44ebac4846782780fb3c5f3304ccd0b1f660bcc15372f6e61399541825760683034376f0b8b9bf76fb10ce213e64abe74299fa3adc5d4c2e22b0eb46cbe6a1a21db5d1ed5bfb5f14c903e51442f5414cccdfb332fd4dc3d0a15544f6590272a28df172d0d124f6490a3cdcdfbb7538e3c47db6843058d597c65e4bbff1c715df8278ac92ddf3fc72df98eb913058b2941c9f26de2fa134594af113c0a8d4cdcbc0fe2b1c938e4e67dd19e7a84c19e5803d8bae96357eae02a472237ef7be52813eb17f9198080be48c9031422f6817800fa5a52938769e6537d12cb60b23e10487a80de3e10487a8afce71b60922a6ba6cb191980de862702f4367cbf0de50e50ba2452e46f2877b05fa4c8ef501fa8047a243d1ff2b879bf086e55d57d206c83c8ca82a1519550658d36aaba7f9fd6322c4f9a59be5f37daf2b58f4f4b5575bfc823e9e9ae9c89407dfb4480be48b90394ee814ab306f4b544f2fa6224ed0182a1d108f9aafb938608a419ca9746c84d1a219a26f9fe690cb2863f69606837604380feb4545919781e80de86bf7fca55d60c11fb45be48b9c30db79ce9722602405fe467c0c0d79fa1c867a0e401e88b7c2d79804204a89c2172c3dbf037943333d4077aa092871e1bca935255dd2f529e3050d29e2ecf53cd96a75c55ddafe509575517286bb0003ebd0ae07384e5fb14c03af404f0f949009f6404f0394ac9f72180cf7196efd380cf6a7b00d6c1ce804fd2013944f0d9007cd61c03f0f9c9804f7bca2c009f16a6007cd2a52cf2fd18f0f90981019f3509c067650a82cf536b0708d6c1be804ff2079fa40f3eff07d6a1079fd5966960f93e0fd6c1eee0f38425df47c0fd03e0f373019fd48a967c5f079f36e6039f940741f96281056b2797efaff059710560e5f2fd1658c8e5fb2cd4d8f2fd15b00e96003a86f27d1ef82c73e814b97c7f00748996efefc06799adb8c1a70a2ae0b35ea1c2e767e2d3868c7cdf462797efebc0a70a02c067bda2069f952900f82c4b8ccf5a2bf3499798ce6a0500f0f934f83473e01307eb6071e4e4f2fd1bf82465f069730c3e4f36f0596f30f8b46142be5f039f74c908f9fe0b3e7188f27d177c7e34487c9e52e70d2edf1f63b0f1fe38f315ea843b295516ed49421acbf3943b95e7c9b6946f2ddf177167c61d7226e350d7643295e2c1a82083c98b55aa821aa2820c25d8dcf2fdf30637dae81213193937068e9c030032a53b3a77f7a28fde8f8d913dfe746f4706d0c6e7a5658f66ad944bbb48a70fa94bcfbb486ede121c7fba5f91578a9bf7bb7bea462077d6deeea81cea0700905f00c8fd6187bdd849232403d80343abaaeb619a6168f9de5955dd47f5977788eeb8ff4d417e5555cb99f0697ea1e6c6e2e6979b89eeb82f36754775cd4d591d897c4fabaa2b5fb297430ad92b29dd7196e076c4ab9de22dfc60b020f2ab6190014310d319eadb9287efabcdadd6625aaaaafbfdfd1b9caf6e7cbe8ac954a9eca4b1696ebad73fe379ddcdf72f91af68155d08e5fbb7e62b9aef5f2cce0295ee5f245fd12a92803b73e0c8e79d29e58bbb275896a67cde2bf99e9796ef7b5dd308d5869466beba4fc3c457fd847c9f46e62b7f31f249d3848628df2df9cc914f1aa17cebdfefa5cab25f13ca34005f0f8da4470f3c908c3d744820d04323a96285f2024a298580e8e0778f1801f0bf7287f0c1bfd8c7efc50f7f557547fb1f0edf6222df87e50e641501ed68f481ac5f3f5b1ae93207a5eede3450270932a53bee0bf7bb0731edf1ce23f769966c4b23344bfeebbe24d29a33c7b8449e32d9ebbfd06a5efb396ed7755dde1532d7e50dee47657dcc4eae65b3823c77725f9076e8f4c48993d98b2fdcb3d92300e8af0d1b36dedaaf405fed033d4d88145f254df1550d7fdf4a4c51519191d18d222615e806777ab19ace233d60252b974aa5584d3d60363799ee98ee74be5d80f90a7cfd09becb153e18bec01708bedef5e2cbd585ae8ee61be38fab2c00d9759d4c1792ad33d3b2feaed4c9b9f90387ebcf300cdf48e80abf8fb698a8caf5e08b2eec024c27d7a493ab2177af43f38c4e4ea7c905188eee4a1fd88d9d1c55ddbf948adde38fcbf53efeb8c4ce0bdaafefcaf30e4182ffc2e7919a6b1d90fdb66f31b9d9b275afb065c332f4fa7bbecaef46775c6aad1d7f5cdf98cc47f53bdc69721558dee0c29b2daeba6f6b2d2fe8fa3bfeb8da2bcaa65d6f83bba1b59858b97c3b568e953bc5221001294952a6c4844892ecd85821f0d459107871458e48e36ca4ed30c21a46e3b422c3a7d1752d5b8ba9b26ef41c89a0aa6e8e07753a9501824f86d84c43104210703bd1a4c910d8508888706238497060384138b1300c719234e1c07082706238309c244d70827062384938309c245d04e22469c281e124693a014e129c184e9232481f7f2a83d4e922cccab1d2d4d4d4a4d3d474836b6a025ff4ae8ec20ca03d4140d8af0f449107fa3ad672a74899532b7f305595bdf6765fe791de08c4e61e5bb4c71be0bf11c8cd0da43ffc6f0cd21f7e3782252a46cec0d03fb0943956aeb8d97d97394be58f1add71cb710852c7c2c621481fe310a44e97c5578d05cb879d4516382210e1c39caf1a0b2cbe8362be8a41490c4c64be6a289a10f9d864c8572f9c2438b12c320d4108418082f43cde34dc484f3cd1648888e8890771233d1d1bca0cd3dc351fe0a67df700f7ec9b07b8a17882bb27a310937194897587fe2e83d4dc4ebaee41b0c157e55cdfeffaeec33074a29d085de5d93d2e40cca1ab3c9164d787b85f15beaa4985fe1f7f9aa786b8df85db8993f244d2473f0af9aa8f8efef5fa367a5553ebd0dc462ac05e9f026d0c22e62ade13adac227f9a4b407f9ab5b03c8f9c9dd33937c5dc1d0bdef8d33f0a411ae9fee66ffc696fdd7cf52aa99b6179aa00cbaf7ffd7d3d4fed84dc3c9141baf027328000e1fa45b0bd2204b9936381c7793c672964cdfc4e8e4e91b334f3a74eee473d7772aca7ac9d5c9618f1138274f9ee99f91b5c17ede46e70edf2e74eee1485748106eaa8ced03db5dc01490f4f35c2afafd87b5a4c42967cd559f1555fb952f3550301084c8dc557fd831f08b1f9aaaf2867fafb8aefbf2fe4e62b508b109c902d429a6280c510e4ab1894f8ebf5c231febc6a3ef89ee1ee010fdaa8a3e09e3d7932ca7c45b3ac061428344cc0cdcbb4001bdcbc35dc314676ff729533324071fd0eafd255d612494ff8b4fb236ede77b9796b6c371cfc9584bc2f00588dad0637d6d8b2f8aabbd5e06ab6f8aa2b47a19adcc8448792affaaf8e216fa3d731a48348c74c074d87141d49a725a047a21401fb404fa4c80ef56d1124fe04d213fd64d64fbae88520613e416efac4dcf451f264867f34ed8c4090e70dee093e91b8d8af17887f34d92ff2250f5088d4b70ff4250ff5edcf0c012a33ad2a97eb5ff844925fefe3cfebc50e43fc05411a81aeef30920ce2d3c8f52e17ee59dff29355cf0ef0d459407f00db135a650195d45531b67cc93957dcbc4c34a74677e42cdde462783a7611ee7c82028924d39ddc8c753f66fc691bc3b3aaba37567e6e6aa99bd438e446a9aab4d8e0544f479b1b0e3c545577027fdadcc41046e6d4dcfca13beebbe43b23698c2fa4728d0e1d4cdcc4cdcc60677860cf13abaa5bcb136ee7d4d12fe8cec147f1b7d6302ecb003c417b28a88f8ef2f7717ca03840501c217086e8150e11bd6a287f5f147380855011a214051632a33bace0ee9b06b85bba017e59815fdf3ad8016ea377e2ef11a88d2da7be6d1650c82af2426c8e70549e35a790c223fd9993cb4d6855187487175475b35595482f8d993e0adf0cf2d5a993eba3f205cf7d6473b3d162cb2ff9be19338560473821df3765661367058d362647e4fb2691b3646a948a236af9be4d1f853a395a658c7c5d08f25537856158aadec5a65653d3398052463b711446d142c3addb132d9b9b364d2613374d590bb9bb39649ab01f33c82647775cd5d35186a38f0979eae47472e69f32d9c6fc93cc36e69f5fb6b1f93ec2e6909b446e9666131b1cf5d1364d268cfa789940984298439844dc24511f5dd8472aa8f0386e96aa54817b4605767d53c19d9517e4c831fe844e94397414a640c2016ea36fa51be0d7ef4007567c4b81fbc9b70d703bf99e827bb654a58aef1a601715df34c01d95ef240c7ed3b0ebfb09dc798aaf3f205d5e5c9147df476118864fc73e3a0ac3f067c0b65515f531030c822f87dfb265b969c185210619659c311340e740c7116e1c7c885be90652d860ca3714b86bf01d056e1a247dfd417e7db96710866118ceccf4d19175a26c31f92afc232040a040cddb48f81f480e081456e4eb619c7898f1a79d783de5f1ae43fa0e1ff16a22cce90657593ab98ff2b878054933f82ec07c75f6d1777fbf91fe3ce2d5c40ebb00d3c9b9798fdebb3efa332c8fbe91badfd2d56bd54e7cff89aedac9773f00c47ab2319206e62b9beff8036963ff7aa73914676666709c56643b791ce3cf93c731fef413271fe2b39dccf48febc5761f7227caf13ee20cb9d975476a0ea7899b17870887c85a9cd90bce909b38b2aee906d759047167f78220710c41d2bce87d3646e6482273e0c846209e6fb6dce4a020675a59746c6e9d103545b3d9ebf5fa7ef2a2ead432c0aeef1860b06836ab3f78bd9ec745fbe4c93b71b25a0249f317b9c1ede42aebfb7aa7c9cdbb03e9067793e381953b3937c3d207e66611ec13a354847ee4ae0fdf17e47983bbc1e5245506bcf0f97a9e2aded30b77111d5f34309a205f81344a7c4573cbe041fc653187078f01ac7012596061fce9a3d7ebf57af5ebf5ea17019e3ca53c5ef4213e8f146dc048177d3b791175b23192bcdfbaf19d19a4cbc9fb81bc40e28b57736a091d91c3ea812dd32a3c98651632adc283a4ec8280d36802f284a1d52a6b8648ade558abaa4b4722f52d4c5255dd8aed873802f56db943cfbeeb8e7af4e17618468a9b2b0f20c95dc24ce9aa0b2e7c40c0255d18ba40d005865df881018207187f8efe00e34f1ff5930f4f4edac977d1bff0297e439008f89ca59a4ae5d46a7d22f6eb0ef52d907da04f08f2bcc1e1e81e07f838be1859df7ece528e959c5ace155fd5f05648202b24be01c22ac0da089f48721b197d4190617db067ff2e24b98f54a6dcb3527546e780e22834325181af3aa37568065f0598111e85dcbc23132149a8f167847521e8d2b1b9b9caf3034b9d1ecb2e2abbe879ea0b3f29c2fde4e9e8a49ff493231a1879a29746b7b6f41dca9f0b0253caf783c48228a19225df0fc2c459281ba5828a50bedfba8550c8f76f9ac8310651ec538df1a72b63801b063546203872f82edc521ec40d83175b8a18621c19fc10879996e54c58f278cca9a560d7370c30f82106b348cb2e1c93c53e55c92e9c4216bda6ee59540b8b2a562421bbf08d2cfaa96110e6d066e490eeb8efe1481b9c07fe69738b426ea3faf667a86fdf3e0f45befe0cf679007afb94c76db42400091b9ccdad9b42522a968822dbd095002674c77d8b5b4c5546dee49420c1b265731308b76ed707b2c3b731127f5fb498840cede4605df430e3cfebfbc9ebbbe85d8a66af9dd38a74fd0ef83be30fe872ed8c403ad30cb9d9d11021dd38852303c09e1fb608214a9505f67c33a770fc492185146e6edeb0eb3af043b0468b9bb726cb08a4738d0d4ca13bd97cbf850511a88ff059c85555126c6e3ab9f087ee398d33d8073a82fcb22075722fa4322b17853c7378c078f8407d8414c78bf8e4d1aadbdc62dce616e336b718b7b9d9dc5c753fe6a97f1f6d7c8a02e999a05656ddc9ddd8c9dda095b573e33d1879d6d8729f417eb79ddcce0ece1174871135b61a5bd5315493e3648b606ad9a88f2f696708356a5e8c9401ecf991abaa9b23078eacaa6eb6e088256d479535378e10dd61d32153750c49e0af043e2ccf4f02df952729816f1d43344a55557393c381d59ce8f87a3db8046c1047c8575d548469bec1e1c06e70375b5c384138315fb9fe668b9b374d37391c184e104eec0677836b27ff9a7d39fef4ec03e0e4c9cce64403abac96adc62aab75ab2ad13cd1b18bbae8c125e18760832011ad9caf0215531d1e34a7eb5baf4ae03c2b9123f310223c5cb688b4e6a4369eaf0bf2bcfa74b6eb3c6f0276250f8f7ae6c85ea655a28892c54cabd0a0c85ad16d41a7e082890f84aef820092a4460816488308620450f6a2bb8011028a892eafcbabbbbbbbb7b570324a2d8a2480552d8a009576282ecb75ee7e1ee3d842b4bb27bdd7577774781fb09b28c1859c99e32a5a2083031444f0a499f7a240f1b0c0623c2480731b603290e8448caee38777777b7d5dd4b777777afeeeeee5e6fadb5d6b7eeeeeeeed5edb5464ea4f0e1c00441b9beb5a71378000c1a64b141c9010fcce8a93e44ae382cb956a14151aea5b59dd109de7a3528b96c36b894042951a2848992264a88942075b706af030300f6764caea2b6ef46f2888193f91abceeca0d7b6f0d3597cd06971057882bc415e20a417315cde79b348c4042831f3c312387051532724234c955084aae35dca229f27d7beb5f9b6fdfdb127215957d43e44c86e62a562622c955d4e3210e5144100e8a58528da835b64469c9d214af0ea1a1468406a64c7190240b53ad54342197ab134a45d31551b4e08c2368711284501556a828a6d61e3c5ae8418452ad4549e45aabf795a7b6dcac2d25336499e632f515ea878f2442aeddb5d7deefe25097a875024b828a104294259860414ff524b956a11f72bdd60eb98f83086eed706febadd5885cdfd65cabe72161f383284330396952fb01885c856e90ab1013727de150591f0e95895aab07e55a97dc72add58710a9256e852888a2d7100aa4afdcddcb76fffa383289bfba57f76aabbb7b75af34d39b4414a9affc4f4a2bb54964bfdb761b73daeedf3a20eb457d6e52a75f29ad94d64e3976baa3d6eab57af5a63ba8dfdbed1f1d6fb42a1cc9922686f8a10c2024e16089ffe0852bd9c2850f48c8200643c094701314a1bb4a6a57d0c8278feced400613040541064c50ca220a1ffa69d72d81a28a1761e589521528acc89ee77945781ebde2091435d32a5050c93632ad42a355c129f1805414a1e05ecfee4beeee5b94b85f112e2a4fc8c19228bc608b2087d996783c50e982de19a96e08e84364efb00fd86d0902797820154463789de49dc08cec2fd3953c2d1f2570c84988688c2563c020c909980ea26084ec2f0346769ed657030fe849b8af70b4c5043b805121832d7afc8cec4a4e60ca4ea365f7e7f1d2b6ba3e350cb1aef3e3f169097127d2924f5aa3b87109abf3fba343a4bfb56fed09487fefee691e4f88628ad21fc120a957a23aa526d5a54aa5ce2a51b5f6deaef36ed779def781def78160982514c13014c55393d3f8a1a8783a8d230a951a83723f0a864a35a6a125f72df7bb142b4b4c57925c4a933371211ff2260e6bca51c1c274cbb24445a99534d150d3905aa895740cfbcdabdd72af88ed5eabb5b7bd566befedeced3acffb40ef03c130144fa1783a8d230a951a51a91449d2a0e1e2f252a3060c8c8d188acf1cb95f78bcd438519811486711e6447350ba03e64379f655ca3acbbaaa1fe55d69bd28df711369cd0704b2716e561a40888094c3b9f9de0cc8765c6df54685a47f569bbf85752f21d29a33e6a32f3abed906d1c96084c2dda9a5d1fdc7c02c1186c81453657da9a5ca8a817d368bc2a1b6a072626a69c957f7e6d40f9a85c25120f2120a47041817b93eed54ec8b5c5fb437f24cd5dafde77641de2eb554c517b22c327576a559169956e14313b9f1cc7d307759b437f0f4734b18399b6d21cf1898f731b0ca4a255555fd90c8f05332374f4190349fa9a4dc39d76b22cf14514aa644aeef7d9d33c6d0bdf8628ae62b314573b375683ebffbf6c8298b0f96a9998853b41a293e929bf5c5ef82656ae6664dd14e5490676a66bd205356c69f23292ba92bb9b675544ae6666d32c6d07d58a686dccc2922171efcdbfd878ddcef5eb4e30bde8be21117f2f7dd1825610c931859aeffc534c9352676464a094f8a9b3595aa95270a9797baeec6c06260314131315f598fd6d61ba11061b9864d1566bb089bc4a05c3fccb98925d7b7ef4b6ed6d4522a2935c5cdfa16a7949420c3ba25b514e672fd54fe4e407a4b218eeef0665555bd598ccb116a38e6f77ddf0bc8fe1e2db4a0259f643e3f2391d69c2eb6ec36462691350a79a6c4a114ec963ad8ec2b8fbe47233d2d74f07ca660add3d945a3ec5e0a865331203743419ea29028e42bfbfe22131cd9da272b6bfcb13360b943f778e5ccf7b4c77b243d5f0a260e5155270e45518150763115e4a6a76229d813e4596f371919175ba601b8f6ee80523a8e630060f91b495fdd1fbfc638febdf7de7befbdb4ad11a250f6af472953c425ddde8f44dd1dd12c8778ec5e962f0d11cd9d67ef87d29739d97a44919e2ee075385b9e70630c36c2aa6a8c7978949234c5cdf0ef8f48cea23d3324374f4cbe6a09fc49e69d09fcf9659a9da7ce1a951a8f63ad8e4aed75dd38fad48514afeb51c98c18eca9010d1879ef45b2eb6e77ffa2bb4f2bd276acbbeb7b6fd739fe656ac8d4c8417a27cfebeeeeaefbfbbed3676135a6f9393e874c777777d75d87e2e9749bc8aeeb71fc39e28d3f5d18beed82ec9ea7866128f35d239592a991234592240d1a34da65fce9baaeebbab0ebbab07b30ecaef1e93d4f35824fcfabe52e8d787fe4c87bdfd87b232f8e35261a5855dd4b031b4dd0941a19e520da0017853ac22093bba411a23b6ce012d115bac2b00302e4f38b5e6d6e3323239fa299cf8fa2f77cd2298a8abe67a2ffc879d19d5aad96cd0dec5ce1133bb99d265ff513fe3e0fcc579dfbfb3c311e25be6a31fe3e8f90af7a8cbfcfd364c8574d46c953060f0f14789a789aa050c6b713dc64844f84df47d8f5fd0487654b8bebd57de772638cf1ddf7139ef0e0b718623c58b6b0cc7443689af802feb4b975b53bb99d5a1775effafb1fba5cddbbe7f355862716ebbbe83a19182003035e869d1556781a269dcdad766f33274eced7cce7c7eb3dbfbe6774698b6e053ca52c1d05fca893ab5df969214f9b9b4ecee6467d509b9b8ecd4d47c7e6a6a322b2b9d9e07ae8f4e8c162d9dc6c6e37b4991327b3978941268697791f8b00a1b84623c81f395f754bf8fb3e305f35eeeffbc47c94f8aac1f8fb3e42be6a26fc7d1f99affa892643beea30caf0effb10f9aa9b50fa20f9d07cd54e287da4f8aab7943e537cd5484ee0def27d84db09df4f7037e143dc617c23b99ec71b093714650be7a6ebfbe80976956d54b66ee0370ec704263cf8bd84257c177d838167c06f30be8bca169619b0a194ad2c1298397935e0ab4c89d1f6ee26e200220e78226fb3e5c726e7e69dc1464b18dae03a7ac3f7d7681bbe9f7479c003bed391931b8b2045162a8b855c65b1901322ebdb5109a91292d48517b7578296bf2f84467df4ec8b3fa91518e4fb42a2509dfe82068d247c17b86fdf332db70fbf95f0edc5edc598f1a7957053c2ed793ce6d697aa421c55853597c319b6d9f5ed451765b551b3938083ea8d12204cc20cd7dc5de06aa33bc26f2d4a282935eda967d8732b0163c9aeef2fb2c82e2cb26b863bb717b7ee021fd5b2da921032d11d61e752bd0bfcd0c79f5004d9f58d7bf62e97ebf5fa30ecf0418c13d439383037c37f3d1d178093a473fa5f2f4c731be1ce1d4eacebbaaf6945b5d14f1721e13bdc595e6c24e0fece82c7266e169d40b08e3f2fd5cb4f6528e911d423e6e6ed3a56ae85585d42f6b7f0dd10110b4490e69581201090ab5d8fa3be4b0748874e01e472b95e2f172be772b962c61f172bc76a4ab232142969553d50596d55057e3debad00354f9db4d12bbc65579e64ae216572cdbbca53a6e67b8a1bdc88021ecfa955561014db165afc4a072e8ef0f77396681be1cf9c1de4fb3956509d3642797eaba795b52ac29f3936dc5a7ce32ea380205b8bef6f2eb478f1c6f8d35c9405205b0b2e5a8b9ac54df06f6851562d6e8297d29af3d602572dd4ec2d6c65bd5133a8e22801c0ffa107584f17e1c5da365c6f7d040c822f371765cd424df045db5ce09a85ee00bf8d007e3502cd015fbc6ddb021fc5be9efaad05aeb7aa02bf8b80c1077f5442822e57152be8327abd304f2dc19f95365adc2c6db6b09abc47ec065cc3545534d870edd76a73b337b81b1c08161591affa456c68a09fe186c7c0cf00541fe83150cb1922367c91b7c186b7a108d00d279b07936964a7905e1a408840a5efd01d02bd4c56db01494dcb75e32441a42e3237bd89cb90cc53126bbe3a514cd9a3e2acee39bd2bd95f94f9ea749165f703347116ed711bce3862d34dd03aab7bfab6a3cef3bebbbdee12c7551f0fd4d72b06a04a64f7dddf8702b26d8d678e654d22c1ec9542de52657534934570efbdf127d52376a58bacaafc654d1df5a9d27778e5bb399635f5844f1742cf537a9387bbf762d3d1f3bab2876aabb65c533f833d34127b412bea7fa62fd6f66ffbf5766ead771b217e38aafb5318c415596b3c4957a49bb4d2b1bed0dde180e207520fecfebcff5defdecefbefdeeb791ff8951ea69976f7262d7da4ccc3cc1893f9e4a764be0cf92dd5da0884afca6c3d3eeb7c86bbb8249bd4b0da30ba5447209027d93ddd63bfa1192d496969369bcd66b3190e3c7226ee6f32b61e3d48992aebe12fba67bbe1721556635568369bcd66b3190e3d64be478f1eb6598fdad19294966a4c32994c2693c966b3d96c369be140711447711447713e9bd98bcb39cc634232994c2693c966b3d96c369be1643dbb494a4b35265bdf6432994c2693b5ad6d49b20ef6c5482119d90f99b3da2393c9643299ac6132efab2cef8979cd6b74c99ff6d0caaa31a11a8bc562e30fc89374b3dfc70c3a117cefd2f01e7cdbc4579e9d05c57c65a3b2dc4ab153fcad9210c440b0b8ad4ebb549bfc3b25d28f868c9b6fc47bf04fcfcb1a62e73f03e60041d3ba8dee69c1df057f12f4baeadfe5a03b426c6316e6a69ff6ebe77df795d655fe35c8ae763758e2f12532fd1cd407cdb576d77e8b79da4d6f7df7de75ddd7aef4aeeb6cbdd5ba00fc7ef868cd897219ffb332656a561bfe95a92cd09b794570bf21a63d21ee16de62409ee1adef89e4711689cbe12baae4c450be4f69678f7cbf860c3d2995c6c9f7fbf33aeff647d1ac5f18b556883344465a658a2660e323e9a135270e5ccee225c9cd7e99e266cffc782fba1f852f3e1664f7bc2c856510f9e48b22f59f2377b49789bc7ec4c7201409d97b71073a460a9000eb39bd878dd8a7d9472038b2854121c91d868ccc7ce70f1fa14eef31552c157cc767b57ddf5f11bc6ed9dffb6f012f8e3bbb3c8cfb8bdbfa9546eccfbc0d2f2d926c03c3d079e6bd93fc23d59667dececcbc7f0d7f1b3330fe36fc6bc8b48df7540c35de9f5a1a7fcb33e66d4996326e762d8d5cefe5bd1750ff3bab2d836590fa42ba28e0962820682e7e7951b43d2ec0cb99f7dee299fbcddc328808b27dd07e2dbfe7a91f005c6cf9344fc705b8fc2d8db87c2d8dc0fcfd23d5665d4a5bc23cf9778461e6efdb31084c4953e5abe61a4f6d4cf9aad9c65b1ba20dbffe827f8e478d411ce3506d3987ade16677d56df85baf7edd4977d3ad5522bdfb97975a997c05f3f72b96b2c6c7b878d8c6d7c0f7ba601410decb5fec5916a466dc3906a380b84f03572c6ede05c094b77bd22b6b69a47bb02bc1e7a92f30ccd4ee7e5f791ea9b697af0ff39e57be3cccd79907c107f252bafc874f4f297fef3d0e5412d2c6e34001f19264e33f8c4a42565bb6517e8f61fee5b4f129bc8be7952fb534721f9c79f03e88e41f3cc1f700927c5fdec3f5bfef5f70905ad2fb3672f7fdbf0d7cf610c42bbff248b565f0cf2364d9753ff38f4f112465f253c0a7089432f900c0e70e43997c3247575b4f0cf7a0dec720307986f690355cd54f0e818c5285e8332f3f4f08e49285bdd4b285b53f2bc5f40d79f9a2e426d3f9f2628509874762e8b61910da78d16d585855d1d0e27071117160d45bd2b1984c2926d2fe67ed8be2773ae1b04b0d6d91bd0fc3728648f8a847858fa4a7860ce9668bb9ca3a2dbd58e9947792508c2c662886c8cdfeb9ff8269be2f6f3fa10f565937bebfd3077bd88df225a95ea13e6aa47d1b93fb6d380e6286501f045209954e41930c947a508fa4c716419e2f491df5e1dfff4225465659329f5a4a31c9a0b21785b430efe6d94efe82e466bfd05e6640204f30cf66cbd299419e62cec3777f1e9575fa71f0438cfa8a6bf65e06daf30d55555bd189a03e2c7710c5c029f5a05e7419c01e0bbb9d62baff92f403f2fc86eaadaafa4fb8e2aa2ac734447a5790e7e7dd97a533664889afc0efff842a4bfc5622e4d548cfe707f3ee45351114ea3bc59cc4148d18991799effb3ea1aafabc0f046dd89079decbe7bd80a7b7f11293a2e1551cd9f23d7d2f34bf50c9fdb244643c7df8a1b822bd2c6ef64b92af62be5d5cbe20b1e9f4f74acfe6a677735b1af1f7b288392fcffbf6aded236cf9be11fbfec1dcb4309686fd86ec3764bd9bcdcbe2d9b27ba3cdcbe2dd4eb02ff60252cc7d395f9d60be3a5f66b9c94fbdd088895516eafb245f929450380656554aa0855d1a76c6fb6f8af53cfbdfd247f40d7d335fd950a21f16675126087d484c72ff47ab2cefe9f7ae3dc14e41be7225727ff590204f32774f28ae488fc131426eb64bf9925455fdd148e1dc6c23b64cd9525afccf9724fb2f577ce5f74e217a51f2950da697db8b1667059d6c64e4fe972dcea2600cbd50f115ad629625f7bf2cd56bbd7a12b97f4c6da13bfa3ffc117d333753596ef66de4d0d946969b9bfd588e4226376ff93225654b4a69f1fef4fcf294ea9c3aa7ffe553385f3912b93fb585fae86c53365f79f8921496a47ba7dcf6efbdfe3cfebef2effffebcb71de6e62d5d48fa92f4924455fd3224aee1667bef91357c3c3fdbd2c68040da1a397c55e3fbbfa1caea2648f025c93b9f6a30a5b29c293172bf0b1e4ae1d3e6f365e63d20ee1e457b460c0b7b5e942aedc1d6c26c908d5918e9d972fffbea4c31917d5a265f9ddf0172bf85f9ca06058525947b9b7c65e4bef7fd202ec55cd7796cd17c4b2b368939a7d6514d7778ce57a737f9aac5fc11b9d9fe923494fb3f98af5e922a8b7c494aca8d0397690090743d5424600f17097821d084d96da665a665966596850a273d60f2e237bc5a4bc9e7c89301bf275c6c0cf87549b0e86c2ddf5b877834d4880cf98e603d985a4bc9e776d6ab4117a71a3570c28b0f302e49a068109d485a98a20188ba62639cf205cc694a145cc42252e1100c1883f1cb41cabb02ec6c40041cd7065b6858206ed415c87835223218bd76dd95e2f3eed64a848609d068a975d79b47ad078f16bcbac4f37ae084157e04e5c113316c8d7c7e3532ad42c3e25a71ef469164ab8f47040aae7f5e14b5d4751e65d7791e93ae6ba222053dc059219302454fc724771d13b9f31cfc8ed079b612e9baeef360d65e6bcb4f0b92fcaf31716812d6d6400b1734016105592cf5d82368b6665a8506b41eba6d0543dcc1751fe2799e57dd93628bb0e3d13520a4d841ae3e4a437878409f215278f10da9d57cdcec245ee73384c8101a6a3e2d2155a4a8652fd32a5284914f1e9f1386f80e6e7435358405439505b3ca025a654192bbbb7b75afb319d440b5d0a3c856742bc215e5ee8d914a3133ac9022092f7c30820576361473c796924f8b96731585c57214216babb5d6da6aebf5662780e94e439468a811a1c105482e90e282295e1dc2d65aadb5d65a5bed3d3a631497a82dc1b4848d891741c3222815e509db79dd5118e3b5a1920d2ea32946548cacc86ab8560806830971448418d08603274db9beb54bd95a5b7540daafd6420f26b0309185092d4c6c9161a2e94d24a81959a820c9091090ae4411aaa2d65aadb5d6569be4e23d91e5092d4f6c79a2098aa05bf4d215c18a62454245b27bedbdf75e7badb5d6d65a6badd5d6ee22417ab7a5e4d342d282b405a9094a10142549402ceebdf726b185f65a6badadb5d65aabad3c3a7b8482cfbb56a9851e4ddc9ac035912382b98a666badb5436aadd5da6aeff58e60a3ad2d259f960ab2a8408b0ab6a8a0c9ab3666adfdc18b6c6badd65a6badadf676d768092e9ef5214a34d488d0d08221db82996d01cdb620c9b640e95e1b84cc0ee98cbeb05e13a5264b4d6a37885a951ce5ea755d39c45e6badb528a8b5daea5e3542ae6f2d585237bfb20637a9b88a5ab1198a2b324c10b084041751a8485206173dd597e45aa3bc20d7eb09304a018d53ae95861a111a94883981129780c9a2088728d1502342831146902128a3f231b15d317a3cb596114b5aa086d090044ccbe5693149928521338406246642b8f0b4924862e273a56c446ec8124d886e6badd55a990459264ac81aa597a844ccd5564d8e3a54242000000000d315003020140c878582d178248749a9fa14000b7fb05474521ac8c2280c619062c8004208210400088c00888c9046008a422355b1ed8ac5c436d0ade9c4081a17c51e1ca13e6a1bda7233ad1dc50e891f9e2a8f3e5f8e8a0b96d84e59780679ffe0abd9c1aa7073b2a51da72e3807f7ca60561bd5e96aeb8d29da2c890a49773a310a9931f3cb4010833e41952d245cc21d53b2853a9a97d4573ce53ed76b6c1b9b83ceed9189783ade1e230aded5a9850ab955d5131e0c4c26f2471d0b5220efb9f438e56e4d9665989e6557374d0f66e4f5b32c9b8a50acb3766c52c4647f5139d1a49f1c647d6aa754cade7ea7fb619f3828f120dc4fb4ffff33eb07b1e42aa5ece7677440f6120ef3a296419a6598c59dbbb564fcd92e85a8c96b696a5ece5af60304cfef468c1002986a234a3b0132f40e3146cea089410034d82f8bfded654666ae37f30f7b78dab9fd2bd4c038ac033e73c92da1618e46a25df4405ea3a4158471408feb1ff248e6ac4dff02c763c501a207b6d1fa63fedcba9951f264733db6e8feb594e6e3b307918dd0d2c00e5e8a9b0ffe1a309551510517783be9a1f8fcd8835b70f4138e04519a3b9ba6a8678b8db2b17d695b88a8a8eea0f4a547d4a73f45d24f51f5d114d857fc7623ff07529a5ec079d08b2fbe9f6790b6e750dd4fd176e698b0d259a3660e1715a43fea78991ab2106492ed9ad54f45d9b270c5edc5a1b50f3b7da21a6c0068386a111c8e0f2b38da6ce2fa065d669a0dc9a805d301daf8f81ee8bb3ca8a759d70ef9875c40f18827bc3258f62aa70c65fec7564d825a610f0bb194ed4745320a798da90ab7bf74dddc3ee92eb01979922d1a87ca4254fa4c1a900d9579d3bed8f6f435be16ff1c3aecc731379bac6bd3981118e0a2810638f87f70066052abf9c09d22da8a91f9a395a2b4a1f971a7d076271ea316caab6cf0402826b6628c60a12555bc5209cda5c8e5c06685950444f6a982f969245b314ae710ac4072555b311884615e4a2dfa1143e0f82069293803139e6b75bc9047a8d83a804a085712f3b47570cb4bb534ddeedff5f516c072dc813681c31370fe3b1f75abb22370604910d7266f4e4303cdd8f0ae312c58e6da9137e21b7478f9b488d7a469080e5dbeb6cfd107d5e6da0829ba946a41d280f969f1024d32110cd15e44cbb8b97505b979bd66fca6dd92b8eaf5eb712e2591eec1dabf3a5d07a397d0244a24b18a9cbbf68f10404fb72e4b89524914b0f842f541484f4c284d3e625e2e0ec86b65fcb109c7eab7c5378e9a4f8c6b93d36fbc1c725f32900299090e79ab5249e68c4824f23ba955e431fe1dd3ecef43061d785962eae35965c07fe1b0000c360c05660f904d10408ddf53bd2e02e11e03e35bcfea7be443f4fdb27b0f16eabe184510aab1806b62de8c1f0c8f98042d658979cd5d83eef80dee588391f9cc5f06d2df96983b52ba9b080907804b2370993959aedbff86f7503bed03a3571f966d3603db2d0012ac05f70d773b13715a1c216a4a54d0448a85850107d36588998285bb2128583f8820a4101051ba4cd0d42d1de18816e37d118b770124b839ede72f1b012f1eeb7bec29aa054981a2c6cb480be403f861f08b40ca5296cc6ad80da435415b86721b89d54dc6afac1d9e3a4bd01525fdade106c7b981c3d2595208c1621542f81206055173410340593a86431f4fd253c786f8b7e9b24ec6e6372823896f27c1dec73f048e2a83646a7ca33b4032de1c198df729d592a005f2f3e2c796d092ac98d0bc1bd4bbe905d9ac60c91ce6df86e4a76c7c6cf1ee9c24d001eab16669d09b4f920b344269cce14b8d78c5b2a448eae257ad9b794964863c8dc2e8d3fa3a885dc785d90da243a039e3aa36887c8c491e0797425d40b469f02c266c096b4c35d209f2ae0062633abe8677d9e493ddb04327725c51ecbab8980013af298e70ec00878e6eb72e91c6d0939f22e2595450150c769f2b33af23a8e39b83e61c193ef8005671cb14f41b20aa32dff259a4672b0040f3f29a8ec154d3cec16550353e04c8d7f8086bd8f8f85116f319fdc6c7ad07c7c789a458d43eebbc0f632dc17179de716004047e01dff027183c0840298e1ebc0a298a9d21a008f53871a2e31f98bbfadf2cd657ce83fc11d8b47437c551c78e77e83a601471baed3acb7c62097da1aae815d55505c2488b1585f7051fbf414ab6828caf98d87cc53b06d7a57149680f455d9a11188369ac223a8c1105f433688c51241b648c062b5f88e662018d7ce8d83adaa967595158413802945bf6af8c58ff755117d739405dcc6d06ea623a2160b1a72a46ded194776d52f983533db8949ff3f20ad5e635cc0c970089cbeefb9026e1efab72454c6d7ce46673ca5b1c1d801922cc689586b4f9779990495ae9b65226e4d8947940875efff1b1aec9824e7cce169d156c2dc82b6d3d5925712c5b9da9bf309d32d29a818c78145378c6c40fbbc5b8b0567712fb60f5a796982b2e7fe212e0138b8dbbd0f3a5fa54cd617d47f15bfc08ad6053b372823ab8ccf33aadf74fef3fb968d4ad9aa72b96a8d71423c8394b7204cb16558a50338002e83301731c22ce04bd4d1016c087353ac14058e0b00c092fb94962729b28e29ea077e56d6e19fbf68addef15070a9e2f093a939be288eda730058c5380c35bbf7a75835536be238890afc84d2db54227ce99ba2ea88e5b12396828d83d1421145e739cc51024329ef19c875fb5fe667be2aed067292990e03b66d2e2930c36bcf1a6e677911c57a1dfda4e6545af5c70ec471025898e9d870d52ac2d1515660e2c2a130601ef2fb6e887a6e9398737549b1f527512c1a8557450c72846d55d06b1e8306a6cc2b2d3e2f54bd8b999ed1cd9153b6560b03ad0afdb6ce3d0f84528d8d4929d147f742f0b9a76b1b4558a269a4b49639684496739217577dc2c45f2b66d35f5a88880be22544f488ad2f16e555da7d2f479f786af671526c62ae9d64970ff6c6e056a0f026d316ceb30315ea993ed93bf5d0be7aabd23ebd88b4f5f9fc0506f10e6860fff37a7211198ae9ecb2afce5e6cc43f363252bd14ee0c24f24e4113abd1b8bab02633798b8dc9f85008d5c9a78d0c8b005789bb32aa9cb2f3ec146a5bf5c7284ddb93d6e8729a9fc0105cabc89691eb93ee9cccaaeaaac3926962d30b9456caeadce34b230a205d28a63ba919df84d23ed3c52dbcfc287f951647b635677f14036d09bac86a27d0b6743e9cd910149c7d06835084907cd6cdd8a66557f0c3836dd6a209c79baf353620316c93d8aed890526b3e3ac03599161ae809b017db2f816caed5b88f71843567f2ef3892aa7dd253a4f5b8624d6fbb23fa4b1f32aafc54caa48622c257b573aca459b3449dbf0c1512f53587cfd821901123f805da5e0acd0d20666a557e9f4610ad456c8b810e2b4f2ca0f987015dcc6577f872bc5b32739daaa69541522fdc7a981bd647046691d0b483710f37c14713861de263fe01f846849dad91cc912c446fce6412bd09eb5a80cedf820315f826095e1aae5fc2cb8ff72bd7d21125833d98dc9dcf1d8337b7a6b4fd16290bc3d4e8d1b4a152496b9aadcde72d2c25fc7de2231c863c7c126f602a1cf56b446d6e1c6bef0d370a2577f02990304c2907fcfb491d708f9fc7c71cf421a21b11722687786473504ca18392a15207d15eb23e701d80f376df88e5dd2f2a76602935a21da0be0e528148284b45e6a77251c7901a76f438042669d43561e3bac5e987194333a6b7221e679e03115578f20637e4eede85ccc3d13b2ea5fee842aecb5c765eb1abe9248ee6a69d50db9bc6627d25998a3aca8b473041b05f782222f27740938a3536eb6c9093f8a6c14f63dd4a15892753127fc8cca540853f158b89c50a46338eee71beafde4b0b814e9afcd09880e0215bf5faa2b424d29c4d8ba3321cb525cd544ee8e869de5e039bfe4637ce8cae46c016701e82206dd408c08d9ec68f30f27aef7002a7c2e9fbbc3fb341a429676612882028de50e8b9e1bc1a6caf75e17e0bcd776eed889a3a753890fb99f138d1b196c98a8f3200b2e28ba154bbd7bf96dd554e395fc5d59f4422ba5ce58fd973041cf539b3ae34a1056fa8b72770d47c84cbeabf8a6acaaf357d761a23016122726567f667723f5960e14cccfd014ef8095c6d69b3a0953f19b1199d3725931b5f8df79e85e74463a72da47cf9b728366c928c303d1577284249ca2d1224e99d0883a54b14804d54b755683d0c4b8a1c8ec2d9bf3e03acb9384685295585587e9aceca3659973093399358bc1be1bd7e0789439239e4a59ce96be6125156365ce28e714ee99b2e20985514b8be6cb1792874203338691a2aad68b02e68f392e8d0e631db21a4a33f1aa9032e704d29cd8b0febcf9b795eb39e2e430c49265ced9824dfc8ebfd5870807b9ddb2d3a0a368b82e4fb4e97ee769de00180aad824fc341ce4b30216a1e6fb6623f685c5ed42ebdd5166d1b28bc0f81ccdb9e28623e9026f6f4b894fd6b14f117ffcf9fe4f0180c41a94ec025b1ca2e81afa7215ec3a45ca5e614945b2d74fc0d89bb28288e9953e9bb3d9de6864b14aa7b5c5091579e07960562689b799d26d3c1d3220aafd40c351c5667d414672f321aeb585d374088c177e83eaadfda788ae691d7f02b7d56c5802d93f9f67ee1d34b843f5b94e5de368ab772ef6fb7374c014697ea90cb178421cdbe70d7db75dc7ce8b559f49ac0db49d66ba8efbf7727c33d8020073374e01b02912b01c89713ed2f073cd5aa3758e6cf8f73c376efa8615a63a0475c19e70d05bfd9bbfdcce09a30d2e024381b1270f2c02fc9140dda36f2536b311ae9b219f2552f7a8a22db3903a9f56015936358e57e0321a65ae5a47f88bcb889f46a5bfabb5a1b00d614ed553907621a067b15f0b6ff01bf6d7d8cc3eaa6f169e1328e22275e248d37d6a504e5d1be6eb891e5fc7bbc7ad1823a13252df64dcbebcb4ca1a5150e5437a300f2ebd4266d827cc524d010c8ac791b5e380a88df077f729fcc9230ca3b31cbadbf01c372e6106a49623928c612f296ae00eb42f9aa92b0c71f8547229e6f130a0af737c7e712508e3547b84c50b3ca7fa3a348505fb7f0e68449091c1a3a06e3fcc5dbfe50facb05aeb2060f2d33498e40811bf09e331a686c78222f2e19439a8b5d80f0f74e402cc75a5cc060562e2fcf4f0e78d4a0bfec41b5cd926b1c5b82d3d92e64e21c1765e738afa70f8600096802c79ec42880487f46c523beae1fcd0692eb30e962e7c4fe317526233573c1739f294a67185d6686dfa5ba352352b1b919f484a8603b95c5b0ad7b3e14b52fade506b01d5049308db4b39b59c10d0b1885d090ee9657c23f5829bd1015d3309a5ebef0d31cb7a3cfcae1137242313f0553c04de6e3b02baf888935e47d7a9aa663387f1063b9619c7e74b9b61b50c312237ec613c38b94c79fda9a57bdf773efd9aaa9ca88714b2cceda7b3c415c16109acae7764316a812b20c9d771dd3fbf19de3153cce0ad23bd7ed5c9a527735811e5262d17ab678a8a8c6d9426b23eb042680ae20673627a804e8fbbc52fa910d601a97117b148d96356cf32a3c68c69ad4ce8d1bacb18d03c56b265f4a7bd8cc2dfe14a2631b72c560461b19612395938551c104757703b740b29c4a29207c51ecddfa6fcdc1be2df19bb537016929f487ce21b68035fcb256cdd5a0a1475258f902893169d36652b4890e7a857f3f1635b6e707d72d1a9248b3667e05c40dbc7fe527af04ac69b38302c51958081d7381f23507e9e3c1075276564f7c4df43d4f0e703ecc3cc7c1607565430b8ec52cee59d30cbf7eb4b2a5847d35142def32e90c0d0017cdfec11e1f09c1dbe53beb9041b55c01b49f0aae374c3c71dfd0de15cd69f61b5b82c9e4a3cd87648f56b8f6e08fa7b0b15d1d5600f055f2736a2ccca8da611c5e64484d9948c31bbb416c0828ff12c161f553ecf459b30ec30a9bac9c50da4a9b67e0915b0b85df447f334d1e3b31796a267d1ee5b550a18b56474e2e80492455f205b47f7d8a71cbfb83f9e3fa3c6f89815d7a160f7e1489ef968b0d4af6177e1a045eb65ceaa79ac1b9e462ee843d2bcaa1692c709408a265ebcc9cf51640d5f9def2c5f2d2d60d9404c0456c785d03ee86b60afb590fab2e8abce4b9d3d50a746936c12379daa3b92520f0dd31d095cc1270f05b9b2e58fdd7c2c5ead8b5523d7b7f8a4aa657bfe004e065bd6843785fe560114e86b65fc45df08fc653522fb4b10409e2aa171a84408103d40b45f8896132231aa0c19443ef477dd8aa22bf01bb8e49c78d6276b05c2fc8439195b96975bbc4482eefe71d399884e002b3ff25a4e3e8e296ed064d32d8e9e0e4a154cc691ae41dc79a36df2c7bee01f6c01bb12fc9657eed2e0da6b26fb6036ae6cbbd92e284e0ed4f336a37a27a8136767296cd4493843992c86b9323c28a1357d70056f5cbc537b06f7ad5123b16361911b4ba6134bb2760a27dd6b77986629e72aa7309032ee5a0745eb14c62e9c7b45b081533ac4a4a4bb3604f110009f850f637fa3781660f38288aee82bc9f31abd154d88d11c0979f4eeb543758174684963c5a337b045e099ff64043c6af202224082429bf87f65fbd700a2b4cc1986ddf38553cdb72a9e7bb801bb8051beb5d28b0cb618980985e65db2c0a228032298d92951d71edac258b2dc921685640559113768cfc291689ef0aee5879561d45b7851117efe02c1b19507f1d158ff6035c5834b7c17b9007095d19ba3a2bc9059858f857288adfedba17480f69e1145fe2d1c82519dcaa2969045a801e719ebe8cfa602ff917f27ebb3409c561d8a2c010046a7bf90d29a1b7bd2d59ce02cb95a95ae3bd781ac432426cd62c23b8a308fe5d3565d400fa3f926951fe577358b83ab54830e45efdfc563f584c99fd18c8042a22451e5929939d38ba50208afda328e72666bb8f09f57b325dc7b19379462a228d4e2963649101d4aee18ab9344c364bbafd46868b82c36a44c34e359415be47cd156996cf2baf38a814b0c06f9bd3e1951eadd1ef661ae77691f9d0cdf05230a3aa64f710bcd791cb7f0a23cb46f8e5b3bb4697ff923dddf209162ed744386d02b5cb2a067a0f53b69c3e037c46ec7ce04fac4cf6e34cf6d28b6b922e67b522ea8c166f5cf092bdb883d1a509b49532ce3b39087904a24bc6324110e67d466ba18e91f15c19a8e2fea0d25dcd93b427d29f3f8c45648d99f431d5b10b0173c95ad271ae8e12fc3690581daa39292dbe85d69c4f08ded8351a44d90f54f59b237895108315e518165a427674063b37fb3ca4b1441c0ef0ba39221e817334cac8a16d46f207a8596bdd5a43652d64650205f2da2685c9571a06690d2603f4bbc6e1b8269302f29dc600796d1381c9571a06d11a2604e86b0de1bc369302e28b86815ca349c0fc3b8d03c91a4c04e8f710051281042d4c173ac93cccd9130e6c72202660a91b68dbc874032020e6c36e1c06578e61337a68d402716d01d0a09f1a155bf3cdc3ecf23c8e7445509553f306eacf2c128bb46b850323eea790dffd0f95f648e9e19ff5f6c9befe701184f61f93f3d8bc9382bd43ff001192d1a2bcd165f3e349b1264d39e59cb2e4183e80487aaac81a776401f801659f2ee2165abd520acacf708854ef6c4d459631e4837350c67e1d4880094b3f0a7cd2eb6b5689e2c5298e1688827d7a794a8ea7ef9095e5d16d1a8f87d0f4cabcb82803ee29ce9d51e8d5979fd9630dff70b2d8fd1215aec3289e2632c975bd8fd1bc8b87c646396b7b4d8d93533e948b2e4146db40f20158175a83dafb0a444f644922216460a7b6829206e476676b3650b7fd15e046944a5da42a522f6404758f4734d4f57092fa753d82f1f18de9c435f5fdbad6ab363f022a8529e0e7c431176436e8734843103176fbf42d7336c2b923fc170273a2f308b61dcf98d5ad360011b9c5c7a69f902bd3c3d2f4840873d2f6e6b45c04027a67810968e357fa5851c6c2805590490b33834a6f9383a26ee61f05c5898c4a3215178dd36cfeb9e901a861059f5d61afcc9cd2015ca8a716ccd63c0850420a77fb68db17ad0d04324ca2e96760fe20ef08f924dac5239040183fda40462d9eb27c4ec543fe34597b8e8a9a7f62b14708e7271a6c7a251525e0d19fad2ed164223b92c31f1debb3fc2720fce04af5e84fc8b6defdd8b17a315b0f5d3ae90b21dd321ed2ed2be5201fe0a7629c166f810814d02d94fd055e1b291ff0fe7fa9a20586b0532a2594b094451ba6c3fb90680697395ce609d30c96310119b23a8e125948b03e00b182555dbfbab87e1de6b35d9920184867d5280e6ce91474cc2770b980bfc22b19aa12105be2b6dbef46b7a065638d91eca3539b187bf510d7301b94483a8c049e31a6a62ee0a59adc61d6cecfe434c4fff16ffdc7e56ed071b21b3dd9dfe4dc3dfd4d1631cb94e66ecf9bfb653c5f343b234fe95a8ae77200ad3b666e31ccbe0bca9c3901aa71548990f0e42d151e1b450a5c9a277c370923bf2967efa7e8e9357ca6d44e0f7a91b03a9a78f83ee7fbe3a257fd348e541dcb36f61515e3cc5251b1e000c3db5d8301a4bd9443d5e1db5a86046266aa16c89783099a279ab85fab8b02c3a46b311fddf0a4d87ac2583e177703d91c67bc6d770463ca949cd8da78c8e47a20df11f74e2ab0ec162c7be759153880feb80b4962d218efe4e5100d87ada712d6dc08407a34b392a4ec3ab0260f54c872daa071023a923f45febe8666a196a9d984b34d13de47659258ed5d64de265690c0bf7421804a86b0411ec1713040fca53c4c04a53371b0ecdaf195305ebbcd41c14dbd523d92240ee37d320ed980dc27a0ec4dc94b864f9116869502531e323c482a6d4c3b0161f0dc4f57c9b905e5f06a3d14dda90057488c0eee648b9e144b60b781c42fe66f4ddc3a148fcde6a260665df75e4992a3e57f677939574a63b0851cb3bf810ea59aa4f2328fb328a1c14a410c1e37f39569a8e1193ef0fc239a76a35bc78cfc3bcf6f128f9831f41bd8c69c75a0633d7718dca38ee394219aeafcd5488436a9ed76da32e51f15b8437a50eb4bc23f25c436922e0d7c76a2104427561492161984fc39c7c447c85aab228415494682acd4bd8814296796839df6fd58af6b0e1134f9e163e8de516b2d20f31f5fff64a4d4660fa246bad87d6918ee027173602143a7d40217ab54360f857c4abdad31f7e9bdd4052f721b8d6ed3f881127f446687c2457b431d0a466a9c364ef54a4703dbfe45b721877ccd90382a43d6005d4b9dc80fb44936581166178b0768c72a11ff31f0c3cfb524ab5d3fb843016f45792aac97f875471ddd184148ddc5467641c38b54be2654412cfcd10d9807197eeb527d26465398e8080c0eb2fd7566289df4f191eb23b326971eddcb2ce522d7f2730bb547aa5b884db94e744e4bc7698ecaba15f29aa09034e027e8c90454499430a1241b296a0d15e27428bcf0cb526fc5b60f5bcd44377a65d72b748c950eadc76bc39bb3e35cad9a8bac86eb86cdc6a6021028e1dcf9d7a30c6a92750a615a0681aebe8802e0a6795b0c625510eef4d551c635819d1220aac3a85bf92240ad9132c5a706a839713981c5a77af30b04231e5c23b4807671d2dee16ce46f805d24c4ebc1ae04daa70da73c9ee5ea2fba7c9cda763445502974522cb26a1a7df6635865f962b1e36b7e5a681b0da444a7d4e9648fc8fe9836cb1d50939cac4936bfa053722350c35fd49ff6fcfa41709d6113dd4fd03fc317fa335adce7f4374179750149119b526288aba64faf7f6a26a4cd207c3496c5956612daef34e17cb062a66dc6e66f1e3d1574a1c47ab1cb3d335487e4535c848f16cc8b7f60ab49eec18dae790f2a61a920a923ddb754da0b65bceafd8a55a2c19f49c9c2483ba6078e7edcb4f7705aa5870426de9f20c782005e2add0d72e634f18090a0b7f8b3bd3557d65aa9c67cb18f7d0aa432a2f7c5cdede222bf2b06fa697883891575421e925d0219213d7ed4242dd0f0cffb0449829bcbf3a3e10d9ba2b7146d46f214953a53ee49c87612b90bdcb43a22db64b29c86e145c1ac30dcd4fb69574bc3c12127e3347a58363080370b2d24467456e0ac86b58cf7eaedcc65165c9202282e988c4270113b03eb97042c1893913ecc6437539f4636d5a0491dbf01679cb20ecc041d129f100e06bbcca00b28b65ab32cf3e0c18cd303a9176b293b3ab8ce6dd1aef2f52290ec1e9129d623da330cac3c1fd0f9bec7b3f6ea5864e8d33717d600f37e5c8f0bd9fdf1d59eef0ee58dd602e6ea153fc5431dbe155356f2546b250c8b0f3bc0a7a8b4d54a0fdf2a28d6c075d171658ca23d4fc4a80f8b1c530cbeb2ad80862ed8f940f15c0cab63ef348c32e5597d6b72be30477449b32c0e21719f722ed8914c7cdce506ca9ed6c4b40e29892af239d2ccd577d11d537aa0b262dd5b5000d823d800c5321ddc51b7642c9c03566550771957a7dc540f388173143b300104bd0f82637056d9503a9a5fd3a087a422cc6acb8cebe5fdfd81ff5b47d5dd9755817b22a637b01d8593ba69a2b65505d196a4cc7c7f38694932cd4684339e47ab40b14601e7d2f248384209088ef3adf7a66599896e4b6d78556b724ecc99cd64bc04cbce219a6aa5a2c37a0b16aa001f6e30db84ce859e41242eacf1f05bf3590fdc51c3e5a42faf4e5251e73f4c74413e0aa8313a7e24b152f4d237908e362f13a0ccb3802584495317af68fbba5320515e0e17645d024bf406001019ad5d0ac1033e744619f2659d03c072a90f379439f3039dc0d8fdc0021eed0756d407ab4e87edd8c68d33d78ffc02bd9e2e59c8999e7d96a9087ade2297a669d4bcb04024ece4360f21dfd233d9e4d031586e627bd03ea53e692353371b43211c8b407efcb24dedca48dc4ed8a7407fd21ec1bd53156e8ddd260a83a887ecfcc538eb6ee04385f00e6a0913554133488b131e03a447b797547e17b03c59edbc103e6c8c87b738acbe6827bb2302f855aab72b7d2d51a30ed2e4ae9ceed0e758eef385b10beff76b9a57df5e9464d907e9fe8ba7d38481051d8a1ddcf5233c34133033e6d0576edf50b32e97a9d6e3efb3445bf01024e01c22a49c0dd3fa1590fc345df143b80b0240cd8acf1024e926273715ac867d4e79ac3683bb82d656834257907931efa5f3104185a9e3804d7cc40fa23284e485a6aab387588672e513513b3dc584c7b4b8d1cfb79715f6503a06fca8f03ae0190e7b8412e13da3fd5a88f3e75cef3536099437e9bc5f6a3f4210740037f3e97b225d3b943fac828ed0362134c1231c947843bd587556aa77e2250391e3d32af7a698506fe5afb03e7ca22fe7a98d6ba8dc041e1353703be147f706d2bcf2222218540ec642093f86ff24c84e39ddd165c8de3d8607198721dd6750112077a868d6b247e31b8f31dbf38a3a5bf77728568fad1d21455eaf3bea84181c287fa9b371eed0fda550ed55a6f9ab970a3d651a2cc20a6baccf8d0c26d6d61eeb1d00980290d500f1180a09cc48bf8606310b254b764d0b951d4d8b0babdf463a19a2cb49efd474bb8cdc8321b7ca1a4c0e9a502237e0d485238a20cabc473228e4d142e3556a9b37ee182b878dc22ef5202125ad1c89031fddb6c16d5da80c57f6e2fd36a2bb40f1b77179e74010d2306226b8896932fd3f03e2446328ea21a25b5998143814fb483da6ef9f4731f03628e78d220dff46ab066748f4d55835d8dc843de2537f1766d4028eda71b2382c23f5683c01d231184d1128e2ed2deaf662cf16247f7c403c066a5822a1dbdfe8c00b1cd35e5c70102d353c8f9a5d598984763317e2c1f03ead325a1b7d1d83d00178bcd1503b7987ae385eb7e8f363b43ad9dd890c973ac010082be373ef97f7118931dce2f1e6819ef046bb0cdf4f865ce4e7030414aab50ee042026ff4aa96dd40d6ed0f70b655b621d6761b5336a05c114cd155c95712ecc5c7c707a2b6fe94dcb2c2c225d2d0d26c370b84ab6fbe92ec0d0937a3d82f96554eecfa69a120080ea11d6631d775be92220508d3127cc98bc7850113703ae9e95a090ec2ab1cc0bdeaf5bc08c9a832f64f9418634dcc768517c24cb767050bfdb00cfa9412253f2803b0f8da9bf0c5d0dd654a18cd32920891d13546c3f5dcc4c528c83cc7f75a04c48e4dacc56615d6d2ac4595a5914192f1085a50886260a58b10251cc2dbbb2f89c1370ede962951312ee42b98c444a266841c406ed582bf4491f7c46cb6eebb9dc091924ebc3281b18b881326f58a9728a5462b9330079e09af75c396d4b441747f8ad267e4af4d5faf3815f05a3d916b642ae3b4950de53fd83f8c3e9e8f9daaed8b2a88fa9c483ffe5a5cb81873c94acdc6ee414499ef3568a55cabc0f8992a71831894cbb08244abb29401550fd8698122a1e83a6a79c40a112c4a4bd9d1e9445dc271388c158bd6fbb4afd833c73d066319f79598ede08aa53b62de7ba8b54f611fdc49d9a7f71e866d86f02ccb8d1cdd8702dd000f8959729983ce664af98fec682fa491510541dbb8f4a0f6b688c2f2acce3977d2da0a9e9e4b8c6100225fe9bc2ec578156a444e64afb0b00d51211f358bbc95c69c30ab5db14ba750d22b37ebb72c17c3c11a0711175f04c140706b2a1284391a925f07fc38f874ff2ff0c89318d26a55aaf258d522ec1f63f32c197e48c78b01485ee4be4b5350cf671eed4c23a0cd23ebd285e1883f288e2e2361a75ffcb91db16d086917ba346dd564cbbf915706c3cc302e29a9f2ef88f7e738186791adab91c6962058b82cc0874d7e451a2e59956520ea4cd81605e7ea961c60f8c17ee902f4a44b60c22de492150cffa1d2215c7d3e5229357d07c9252a0aa81e77a06aceee3611093e3a870d2ddf99077d67b51811216bbae888edee536982809390920a0c08335762cff8b0122b3a675320c9af0cc3f7ee926662b03a013a6441b3df8481d251f49f061d572d825bb765c3e11a0c6073cc63d0a347549908a9c3585ed820ce912242d8ad46f797b0f6f95d27ee478087f60a4670ad9af6924774511b67471d2e6385c6fd612e4d8e05a13be537f1621b952725bda4da4de749d54437565f1d8428e37f94f1f2f1e362db03f42a4a9f9de54c14fe52544b0d299b1d0711cd99b6343f29603ec31f6d57844a9556e0c7a8d534b09c757d01738df8e3c9ab956911587dcf856874a4b3107ea10f063c11ff8d544f7642cf67ff91ac8c79058bec18950cc31c233cf8205835a4230f8313d477f27717370f872068b13f84387032bddab6b1c8d981334bf76aca0d6e50e90dac82e5a1d37df0e81abff5330c651c06719c627fddaa326a1cb40678e14e291aa1af7a9fe045619197baa4c772aa059b319742fd106c395ed606c49b0961c3a86d659b186299880778683c5ea1969fec0832ba49a97b0afe80633f37cf851dbcfee4ba8a7ef0abf611b86682179766ee1344ffc0c77647840279cb293275337a156eb63663cc706674a195d4d294f8bb6f32c6d56b5398a2ba271597523fd4368356ad2bb4789fa7773e4e0894756eb4136f3014e0d28810355daaf20ee38284d15caa94b0a239b9ad365448dacc1577e972481a52810096415201b960bf4872bb68dc11813d471c704b87dfe1b570b1e5eb4f31dc514f925d11be2c4d3b4c243be822d8f380904591ac004675ad066f1ae3451b944cc651aeae7bc724ec427b0b1e5a73c2cfb476695389a1b464193c82d7b82ff20ea3daab12b53ebf3bcb084d8d142c7af375382c35d10fa28b68e5ca895309434fd8901e04eee2041cd26084ca31f0f8278490e1c7b2b8f76cb43ac5e59dc301bb2791672eac22a5b77df4f50452c3724c53087dd72e9f3e7a573a4e1f95581a406bc093948979657ac074cfc86c7c3a97143b6c2294c74a1cf1d0e8c2260d58ae4f14de8d77699dda8f84489a8452f73895ead6146c4ba395809a64714d1688ee116d13966416d708cbbf3f81a0716b8d44b8e497c020551205cbebc18b797dd04ab08b7eb7bc571522828d7ba55600f6371f49189971b4371ff53f62ec970e1e720bbbb56ff73c4986619487059a180d4a2040c7885b25d01b31b11f418dbad92b21625dcf5325b451956ba047d7cede4c31276786c96ff187c4b254b12406cf14d30914dae6ea020d8937d0d485ba3efcea83ce365a56e562b387cf098216a19d31484637d76a4e65f5a3d34e9d8253cda322ac6ff6ffe56fa533062d60ca85f44ef7de028033926346bfcdf9aa7b755e17ed5988c0bd9868e18e21f6a5e0b028d99d270d432ef4128640e12101947956e3bc92375663c91e99a0296632257640d5bb79270602f59ef205bf42517785f0c04faf7e6598730ee38fe53145d869105e3986db4f0a19064546cc53e1fb9ef684b10f87d798d92251f4d2c72591d069ccaeea7910406e5f38ab5a09f1b9cb1d15f2c2e9bbea35c964ee22ab360a9055100f24c8aa73e7e25821afadebb1c08bb6f20cd6640802ef2a22ffc59c3a78afc6b0143cef11c065e2174e494dbaca496c7b346b66aee0718afdc9eaf885ec480ba44b15775f0b6a4812b50f074b06e69fd19014c001842a97923d977196c43a8b6215001304b3d71708b176f2362ffbc5c1d7fa9af96784153c1db1d9488658c7007d2d1bab61e07834d681ab11ba91c9500b1baf96cc0050cd2aa69d20b839d74a7c5865f5eca13954560404393abdde8cbe4001a3e5564a156de1eb891227d9c2154e49deea8a04a78ca814126dc016e691f28c22ccc97018fbb173901932eaab59515302c0c8abf7576d505d86bac79a5eeb8a3858f0ea093a2212f9fef896a48575f5508cf0483c2df9d59ff3cf1b80758701fb80006a63603de9b2d4b913e61ea8e5b7f978ebb7114b4f23bdad8f56db13361a18604d1952ea57f48fab59032b63885f5fd8dcd67be5478b803d8438426479d441b20a0f53001004beaa95cab53a08e2249facad870e5fa73dcd08e786e06709c0fc08b6060cfc67760c30e340ede83172a2501772da0d88efca887b372d0b847df89fefc3821f8925eb1b008c7fcf7eaf60541f6c5aca270d3a93a025eb3721f51d9a09b60cc4e0f8f1a104a0fbd7c685ae0c818c8984554f0248b321057cf3cc18b28d83c69e6ab425e56e6195e4db3e27a5909c0999aa48a2918b53fd4ab9b30828d8e38b7a96a35fc7bf3dcfbc12710ca14efed4c64cba939793d425eb075e14c0100cb164ad5eb3418dab446fff98875c1d897aab16084a87765c49ee1206273ba5d0dc4f696b503ad0f755d11f391f6884df78aa61b529d0f3d00ffa2fd5c723c398910332a00679c26fb83a259a881f5aa16d3ba732e18a257b71682a54b75ce8cd6508e77a0354869aad9c58907892772b98b9d22754316061c04d35a00d4af09986c51b141e6a1744657dddbe9a1a29512ad1163cf2c6387e1533f59420a41957a62c848382f106bf151cd16dadafee609e74f5a3d123ff22cd3599c201402c1facc835274c4763b052fad92cb13c09b4f4bd9c689291aa02d84d60a662a82a403497af4f7952093bfde43082d547e84d8e0dce7c637d3de748c8380fb1fcd9a114c0443300f1b9fc6a2997ecabaec3d0b0becf824be67cd2b17777a969dc2eb35f86c8ba8a357b1f8a1a41165b21409412261579a345c79f174433dc7271b1df8e3c7930c6161f743b02664c7076ff90102354c1302f9d98e6989ea091e6f061ba73898b47fd1d977c401ebb4cf63beedd8c0499c558d504232969f4ac746a0cf365bfc73bde7b6a15fcc927e2707e4a366c8630f753a9cd216c29b2b724552b5c12843ce5b8906f70511d49fd38975a23c4141a94b1ff8758ef94daa03d6aadc056dfce29252246d463bf284fed7c23a641796740ba8debd1ebab27e5ecf4f9f83f386a303fc28fb9b13849d52e8e875fee66a9e4940e54dc6e7e150cb948e1a520a11571459452f74e6d6d259684c1a61001b2a7d5ba1d8aa008d96457a03060898c4cd0f11dbedbf8528d163e70e68e8da64eae210348afaa0882b82cdac21291b7aab52975163a911a1df3b12880e04b8bd2102212161323cef85e13b495ca4572d6b363f6d5b0e7d5dd1d391875d74fd91422afdd9922ee7f3cad04c29e5fda106bda02e65c4ebc36f38cda75fb499a7aa6f628329dd71a8176cd8046ed211bb40211cadf8e45a4cb125dbae20751466880feadf57c7dd7112b839ddd152cb68a2c68bb35fe7848b3310f7787c09335399c1ef273b680c17da36c091ccdb447ec0923b2a686e7f8dc254227d5eab99b4b0c799d417b7aaa391e9a32dd70f2cc0ee1af8b34f11cfb7a1250f8769c2a48f3e184a1b02e591af36ea4b0c8eb12fe1f5e1f04e366654c6c2e8921604c35ac417463e87f41c6ce3d8e3c7c4d753930e7c033569e28762e93ed116cb0a8e3c2f857dbad5d6c3d75664817baa2e36b82fe6bc0a23665dadf86a4b1e162a97085c8e10b200c7225ad6fb2d73bd40ecaa36d18daa1cdd0cfaf0e934de463b14e57f7c07a25d04514447cb09d99e6dd3f0808785148e40559e6f786a0465cd4421640594d748df725eba38354b3d254cb11c8756ffd1408316eb288d81ccb6fb43f81d566411e5c0c7ef1c92ad66d68b289a44c2079a8e9f344952c2b51a6873068f1451b019438c78a2f0ae200e45cea7ff10d0a5c3e490ea5dcd4ec6df1f55dcd1a1320127aff99cac9784a2cbe97d8c567c6dc18ceadd380f1e5d85bdeb1d29e8131ddee40a36e7608009e0d736f5eb456f978c00959bf88dc49e1a50948933ebbf399e9bff0d9e112f9411fc701a71dd8726962d3c43a9b617442c40f24be707a263406e46c07a25681cf93187dea2e5341bc3f6f12e506bac26612650fb385501211895528cf03d12447a15b88eee18a25142792c463ff31683a203fc137c4976f1df8fb9defa8e17c5297ac2a0521912bcb891d3880f86497b1f8dd4c5886038ede3f29865022c1921379b06a9dfedf1c72d4e12eeda9a5c5e1c967ce41af66ca59fa52d7c337bd7dbc24483cb1236977541444d615cd2cfb1a73abb96f9dffc9a82e612d26fa7ac62a5632c15fea2b662c6de3ef375a91d50eef0db8c114ae28ffe4a4bd488d2073bcd1ba81188202fbef7f998422e5b743607db6cf9d189397c76f1dd48a9d41684e5baad1149da01da82d40856a82c5bc2e777f6860cc41e07527721f1a5aa0101fd6d0cd428ac126cd17388f473606731c75ebf19357d6ecdc30ceffe6011bd9e6387bfee1729e8215037120995ef245872f8e8208b1461492108e08ce82187b1efe2b893c36e3cddad825cd951262b171939bc88c549a5030ae7d18e75b488a6b866ef8fdef2991e5ed42467a36ad202577270001a63d94a69901e2b049e02abfd62c1cfc19385fdee80a3c32b3c0eb57323941a3de487a837e72a8385531c9940848eda4837fb806f328d525115271c8d238c0d5674c782721bba9f5dc7777e473b345e3b5df801d150a72b0b99c8478d75720164012f511121f4804a41d431b886674601602c69faacc13b8ff0bec316cbf6c16889bcc990e91d6d0415cdbd265c40b76a6442f710cdfaa632bc092f47fccc0c48a2d46f40002b74ca89279cdf9d060fcf33550d6e1f64b5bed02ac307193df5c576f4d095fe689458e75e05672a6483accc6ce7ce2991849a36b3ad036601004459af7b3485e81cd995aa3c8c6de99bc0b8792fb0bd9e618c26473e1e06998b63195a9501fd5eb46b1b2d9225293b3ca45396c4b09d82ffd5329db28ba37fe99fe3b2b19cb87da08b129cee484d71146af625f73352c5df5802bf1401b74143083e0a2ea5a8557d145199d49369c766ac5e0e81a46fdec3ca5450098aa3012e28c4ea3e99a74513014e77ff333226990ace4a3d4a9069b23808119a0713f154dcfa00d9d85626bce8c3db8f2084faec845ca62c860a594ff3eae5c4e58465a3e7ba3dc32420c7aa70cebde3b32dab68c141b39a3f55f16f2c7557223a06c1d205bb06f8bc40ec2987eea40d8a3c49728cbc6759e0d91412493a003782ee0c83e246214440e8f840e858ec06072753b5a94a5a185d8ec33f461b7d34672b7c99446adb2677f594459b194a9fda80d3acae423c08d4c9539c05e0d1247b6f6f06dc3b09044b60e4ac4ff0a6a0a5d62267ff27fc025997ac7580079046b168591e74e8fde8037a3c9731681394ca32de9fbe8b9538609589c20dd91fc04afdedd4c031f99b0aee6ecc6cede1810ebc0e095b2fd510d82e4c24eb41b8806c0fecf13c32908e5cade1eb01959fcb95aef0ea1b3de97d4cb2b157620c042bed34d2c43827a976da50abb50140f92ada20ed32961b77ab17f594fc3bf03908574f0437c3e9e3e8f64bc2c28c580bc44d4fffa0307c0154b4d4bf047a45a127f1c856cafcca3a98a84c8a691bb00bc8a90906f05f29423ea75565a395b56a40d3c522cdfc1c4bc2159fe41e6d02a5680a2120fdd1ef4491d1058707218a3a6cf3b0294c3f6da7c9bf59f5ef213d5157f51fab734620c53ee63a690716eb0dcd654b1d5a2ace51941c032c352473013c22ae76beaabac5aa209521fe2f86f31aff1f6353724a8d7f68794fb20da61642d5910c408d60d18345e916cea82925dfe49f8f471bd7a03a7eeca30e8f02dc3ff86e464f9e3d8a31f3c4c9dadda0cb2ac74b6621f16afe6098a066ed306749a52f8dd6fe61259a324da19d6c1abbb0a5a9647684f154c30f294f3686681a31ad16c03f0065625a507be8021114a6fcb92d2726e31512225d398da8857aebcffbb50b27c7ee6b598fd035222bbfa2582cef56e71b5003e48c9a5b82df661ff0ed45b94c0d73f4a70740cf967e77d2e51fe75109a08c4b9b7a4f37a60148b80b94d509e28e4530fd0633db4322535f7a601f22640c2bebaa80e9ad063c44cd128ac4b6a12b792598a6aa3a559708eb1bb9f1a5d4946815e65cf50d20d10f7bf1e03dca88d192a972d01816aa28a4df838e6e8896a5121f3011e2669597f0a807d66053dff893e886f783581337c32d91606f66c22e197d92535211860df08db82c28c9082fc75c70662a0643684032a9d7c0d963e22b4043f32063bc108d56b37289efa78cb513982c4cbd4c2abe8dc0387ace74d3bac6013b980bddb7c2579d3e7266c1350e6e8f6fc98fb1fd75231c706725b96052d76d66f9bd452007bf3995ba767fa7836aa2afc787e54f0d4bd3b227ce5a8523ad85e08bd3f9ec07b0d797a9607f4ca34975c0749a2e34b966a084c1b743c9977fc0159e6f275839366755e3ca2f71eeb98aea49129a34d6c60229993696795e171523ceca478037183e437b884def14ae796bcf1bc0bc46ce9bb896487f6bf1dd84744e3ec320b567182c8a94e02f977dfa90db73a6843ce5813b4053213ec35ec16c3e6abfce9fb5178921b188560705839025436ee51ae1de270b14bcb0d4af75c94af61d8a0686742d85a8d77b9baf38700c8ddb0588d99a247cb2818c876b84fce48f43f76853b155b2b7378ad5775ccc64829e25950ded7c1431a32b1336b36bb15c1f8110ca7f704812b19df184da3990dd4ba14087f3c6c94e652d98f398c1dfd16cebccbbbbc94fe5c1591ab8b3296e17091522da1a1d0bec42121533ff1ce3e59052064c6ae1f66da42a2ae847bc447c233a74f8ae15deae404ab4537b797c9f5c26cb8db0a9994fd9f5eb7af70ae613a952499d7628fac666fcf3133d905ecc97d3a440321afc742bb939ffe9c0da49c51cd20ed6917a4b770573f80aec0462a4530adac7fa152162955eb89f053614971335ba956f82bd4a79fb3800fa1f14f4a38cba78bc0d40b82ce3a6122f8de449f0881fceea6d8e162f6a4808928b02d15fe4c439bb874a1559daa8c51d991cecd14b49d0234bda216e734b56982d029fccc4a3c03ad1211f130409a13b3c48e4965d51ffc016cd0ba46518c0f3073aa1b53c644d5c959ad95ca4929fb3724ef6e9a097799de19780d4200de09c13fac587820ea2792672a9b7a2b133384d1e652024c79148c9b7583a0683bf13fe8efff1f9ffd37c4d80f673292f9d995a3dbe40cec863e4cc621e4a2ae0592dc21b8d059352112f510419ef83ca8f77ae508884c2a6ccb47133f87d3995e2758e0ea40ac22667ade49826003c33e98456bd0e2d525b1fb018f4bd4159d979a0fa3f4b5c6629370bf7be8e697d6fce19eb6b13fe72109f26bf7678ad1c25061b67aa574ae4091d09b9c2a5bf2247f055352662b6a29d11956072d365914b389cd864bbb2d15a8c24669d997a0535ff21b3a804992c650f3d2041ea844fb14f07497a5188b5bdfc3801c40757750a8006811422e3e3602584521cfa54b4c82112520802712326772b88bde4fbb81700494d507ade16ff8056e0a1601ef38fcef61a561dae89c1f2c2ea34108b038b7aca9ab6d213b1904acb1cfb39b648f08b188801980ec20e9b2c05cfb640651e0520766eed41b426d91afcfcfeb1545c7eb6498e2f36e2520803be1cd98b370a451daaad00c5aa5950ad0392e944d9b08a89837f6385179d7a99bb35e3faf52e46472a242d9e784167a16bdfb5ab80b8eb82c2d7622dc84ff61616419a0b2b737462164625b727709bf108a989a18f47de63ff53b225629e01e17a3946f0f89630a513b7bad2838aeb2977661157e3d20b5d420502add11a2dc56fc1b50fa60c3ac9f308960c1592834d1c4486f7586c69fec08caeaf64d3bd74da5d78b7b8445c4bec22708cacfd5611f966dc07b37b045830a47248ea5699216d3e9be371226a1e388edd73a09a9c7ea6c550c065017d32f023e052ca0600421c5ca8e046f782b11ca3403fccb199498c41405a38d05b4aebdedafb75637473e149cf4702ba68bd10631c7a869cdd680f12a68e6a842c89fd168d5b80199682a41cbf34feebf53147f674767153f162be32bef76697cb290ac9cb06127501fe9f7bfe85ac3c85baa167b9651c62addc164980370fb51664756c167882f66b68427f6d5f34deace1011e48102cd7eaa558332d11664e87f4bc1819471f62287c19333180cce7af582c64b01443a49fe13a909c6cb18e0ba0287a7171867544a5a145623ef1d6f0d193c23c70a3a5910efebca8b29f6b4099369cf72b5db497910b8c2d1c5774346b2217219818f0e5c19a0822e9def8b72de287aed638edd6725b5ccb1b9585a49957c30b488ed4526689591e61007c7cc5d364ea553821b18dd6ec72f43b1becbb7307bc932de07bd7c1fc135256175d097e84d5d82da08042baf99d16f65b926edcfb5ed98db12280415fc82809690ffd98fbfa9dbca247aa7ebf3c207a080f7f3c982aeb7341ae2adf2e1291afea1de408fd9f10da6bd096705e9732f33827348a35af73473ca03938320b8c6772de4acab330333522017e93a852b6c7f4ab04152f12f06bad84c9e3a189061b1122fa360c5978461690b51ff2407bba0e016acac093416c66863c1ba653a64639c7555a1c5da98534348b1a53c7021f2b652fdcb80f88ebb3faa767fe8bd54a54f963029069a10ac3781fce046ac45a091689bcddfe272d099e272e3c53fa39b3caea2e4c2ea2843d2be4183a25ea723f47841c5821784e0491a794f2d4a1ebf1018af896b33382bb8c340dc2cf779b058bfe4c3cdfe2efd56b3dbec153a495023102bda8cee2504d3fcd8ef67b8b96e5fa6acfcf157d942a3bb56711eac30bfc815fc455d018c8689a33fbf28d15fcc72158e59916e6b0d86f70b5dbf2e3a927469ccd0714e63bb7090b3901244d198575f1f483d6187029a0ed5cd35f040d7a5a2cb378811fcf5d8189987728c1a75b26d861966a740d59666502903c9f3b79456f16d52ee4bd5944d44cc460296ef43be541768f44dde6bcd9700fce47efcf5db54e732d38df2294882b8ecd96a844d6f1dc15da994fa18c5abbf4ec58d2c20f301858af10789264f736e1ad4705d586ab6099a23401379c7634055ed5f4a4d7a2641e90c79da3775b38e8690d3e528f79d3e81f5738b7411c5dda319c64270426631526f346459ee991d154896a25d0253b0ddd9e1c7308e3e5c0684a69983d65fbbf983c59566920bb4685a74ff605f56d41e87ba77e84db4dc893dd876d6d1ee7d73d16b4e975c98a7c4bef058f57a229374ae80f9189647ca437a0356c69fb0bcd17d7a0608c88d75314c7290797eb0f9517d7f4cf6557567484e2ad06bc93b7d6c9bc3d10e522319392f35ceec647ed68e700b9af3de72c41176414290f63c8be3a10a79600c799067b475a6f03bb87bd0191ad38ff888a60ddf7db37f0de7bcbec62ff206aed35f137c550aea691a1682a95454a4dc0a819ad8aa376c67c3e84c2704058dbe56087f8c6f410334fa20ab104c69d219e6ec17720c15be6a857172e4c8d69c21dd9baa865730e4741033dbb08c950027c9df39c95fd42f1755cd20c2a2bb4b0cbbbccdd14545b68217908365dd169a3e9bebe6025c4151733e37b775188711e4dacba9bd927ecf6895f143c5a2069306e51f44f2d932411a1c4f3cfe1e829a790717eeee07e758f5f0357aeced7fe1d78094266ce32f499637cd37d1fb7fcbd5a3c0ded8400e6ca9d45ba09c1bade845fb912f8a963a405687c0079d3635c4257962b205fa3ac8e97cd8020374ba2b96b174a287df8089d17e7236078cc4d5f1b0c724905c98d6114e31b9e6cb409bcc5de16bc81f5bf05746ec683d5b417c3686f94aa0b6ed306fa62c0e1ba5e17b157d75878dbc5a65ba0cb328e58eccaf16eeb947a44476c9f320080a65f27ccac3f5709367ebab9c045e3c8f7ff9af04ae2114a35728811d1be12bc3273a513ae7a90111081907eeb772d6b20c9fdf6c60d6eefc303c3a62cdc6fddf57b6832d0617c8976a96ff3d67d4cfa51282e05a5a928749d04c78a5644274f33814a38c094beb6342ff73f45ca04f2110b783a160a0a42c321759fe21fa76e010df25ea13adbd135c770b691e6dd09e578b38a757bdf2d63ff268c9ec84e4e5decdd32a8a71a5032fadf7ceb98783a81c9c05585069bcafbae9f933df82bb96b6dea4c5e0f6c2ce08401ba98409b45e1981c040fcf5931ab529bbb843d915c3d10c9daafb054e7d373c9699cebec7fab9db58de34acff8975d58948d08e2827f143f3b563cbc3dc3b175fc80257429bfa05d6c8c6cd584547700720cdad628952193e4b879f79122c70c4594a1655593bcb8faef212283041a61c7bc4ff49e94d62bcfd2637d6dce6a4393108b795df5263f8847c44c2b19c5f00a9315e1b9006a0c8abbd2d8164b7e76e867eb912f8907b0ffa6b2af2e12d0d8998885ec9687f6a3ba3ff593721688a540c7ef52d6aa65582fc7e423de0bb182294db182c00e35ed175b29e4e02b20378c77c87c2c7e201cc19658dd31046dd1795ad74ded1930bce2c6f3ae5d0e997ce4d3197830914270900a827ec944a765da6e36024f5719330b3b831c383d64103738181ef39ae54f1e79d320386fc51095555341cdcf8f290eaebaf8f01cf80855c29188cbf877e31d336289ab4554599ba7cef80198ef1d1ec8653cef99f06a9eae1f4aa5172ea7c3d040bf95c20abe6eba04a8cb66a9fd60403534e44a007e6027f0a5e20aa0ed929a02b3a006a861ee218bcd434e0ab46f17e335aafeec175f34db40d8877b4d73afc55921941c161194ee1cf015d9957dcc6211044669617c534eb81d213d94cedfa228e04b7754cd56959d59b2221127704acf5cc122df041933874337c34e9f348c4aa25018ac0ad6ce9738f5350ddffb925a72b44bb876cfcc91c45574c4a87d9b71667b12d18688548bc6431ddeb0b7911cafa9f9e5d73ef9ae9fc3711f180377244012201e9c1fbacf995dc8ac78bd7da5590fb295cf4aac09d22cac7b5ed2638f515a9a35ec69169056d90f2995019ee38307d2903e230ba0ccb59ab181b68ea076a807f4bdd5b6920a28399188131655c265b045ce1bd1982af1ec88dd18ac50f8c0c8e11d874370bc70fc821d5753ead2053c894c105c44f56c8dc05391b6b0b53adc014c8aa81ebe724ad03597fb4bcedf99cc94a1026745f3975130cee3b419222530c741e0b6d54ebbbf215e5890b3d6e183f0dd3336ee0bf3a2296d3d771d02e65a5273fb2b33ec9dcce530182624e6f470fa5b331497a14eeb01543d4d724d673bb60d1847e23f986d28b03b98f7b5da1a7269052dc533e7bd4e52df67bff9c87a564a352c5ae0e2b0e1f7a400759a4b68f1e603267961019547543993ff2210501ab046844cdb39e44339ead118cec2f3615b1f3a8a644a8796cf85468acfdafbba57b104d8e132cdd9173407072d366acb14640e56cde088b198eaddc7959385ceeed326ebc0a81630480f395105a00a03434ca678068bbafb3acfe5b7dbad27896e86fba0d4ed1104549eee3b9948c64d3ec88a328c0b7f2fa84c00501419b513befa094698193ccd8c6c48d5fd766750ce528d742f2789d99f8daf39f0f8fda18575a2ecd4819c664bd01e2ec28a8076e2bc62ba6c09338fc5b9a12594a93998c5992b18d599d08e98bccfc9bc7ea0b31514f63a5382f6d2cd654c5baaeb60eed2e8947a9dbd96ba74a6b6a5c3ea8ce9ebf1763ba32fc86590390ad946eaed2149f154d0c8bbd10b81a2094b5147ab125434a845d4a7d6441d183090637819cfe14266ca170d04c547067de143e165ddbade01431137a927f6ec1b68c0005a93089e4b838bf078452e19ab7715a14431d7f49c68a702038058da51c9e028dbd64ae48b6eb94cdbdc6b3d39528d0be802ace023a28cd209e55fc5dca8fe8a6063aec20ff407d15cacadfa9b0dbbe8bb7b2ccdda188404b4cf043133d31820d384d1a805581a78b5d22493a2394041ab8f40aece6041aa6c1430589d9223f09a2182a973623f16862475422198029313eee11abe606fbabc6f3187280b6de847164afd9da32e01804c3c12df412c515044024a4529465532ad72dfb84aa5b78e8f5af4bb1b5c1acbcc97550d8af25cf92d8f82067e04c92ce25c48599a1904e318beb098a682ec0b816a0e7159cdd754469a339624ad9dd5e46dd7b255d1031614294b5bc32f5294a067181a44fd8f2a0e75ea55426f60717943129942cc15b212b4134367ad61cae9812b8c4a2d7664ccbe7533b36bce808dc485873e78336f7a308eb3d48d40d2fcdae7843f8c90521126a73f6b32964f062e5258829c01da07564e8aa3b914d2d1f80ac7074d3ba82dcbdad9486bb722c8fc820c6d08f4f05a2f9df4005324bcb0dc70113e028c4581e978742030dbc7d57c07749ab6dc5c050c74e2470b4af2514565325a403a5ab37732c71a997489dad996aaf0dc19662d1bb6bc6ff5213929593ba5f939d4ab88568c3844c337a55777c9d552d5c6e65ad9fbfa5520fa0de56661e9174bf6d73f9cffaeb30089cde6f9c646ddef105f85fcf1a4cfbcdba3f9d69863bb1c45fa2ece4c1e28516f9edb125e51adc3bc44e8401e8c7e6d527991cdc492dea5094c7681e301bbd1d0695564712301ffd036bc3c566cab552f157eb09a8d9261230bda78de809153445245240b76826a85f38270d592d8364d6c191cdc16600ae09e5b46db19418ce272f8de2aca611a47f27e2c9edc07e48f4da041cab390ea70ef8974e11a8b4862a603cfa9ba7469320f9024ae574a38c19521da48233cac6694cb3ffd22d1d7613392cd5e13c56c9791538da0c910ebf88694a27e3e51a5ba6867beddf646b2cb3fbd99a05a93be9dc3b83946e2d595b2285eb9545dce914dd93d3db7a009ae172ba1a2c142395d5a0ffcd1f868b243ad4e426c3d334d57d881a8a8c780970ce414e362db29c072f09dd158bfa066af2ad159a2d7a96fff8ce1d74881854375736a76c1d3488542a8a6f995d29e3cf528f347a4b186905f5430dc0725b9e7d9a55ab3b612a8fb1a8a42b31098d105acc8e096bca1f8924e5b392027298e1942c710a5e97830d240ebe0d033ea6b215ec50b0799c12bc63f6d4a1beaf61b4aa40cafe09700f133db954744dbf4232d38151e6805d7df613d73254171c52625a0078dff4c2adb1cf3db79313ee21f56c05d0724cad0ee34c5c19ed7383d6d928a5a645a177c86795e79c5835720d533f3d96b4fcef0dbce891ddfe2195275bbf6f5150ed47c116e00fff08475fd3a5aabf836600942ace09e90b307f666346ff897485ed761b04a74ec4ea58991a841a99fb933b4248a23fe36991705379b7f66c8106153645033106ec4697cd26ed6ade1f13e6b1873066fa440908ff9eff827d1f06ccf2ecb0fae82545d859cc69457cbb03130f0e916a7f36a38679032076af878a68936492c049755706c264d76e08669bc66450b119e09b11877e01063d0b89cbac268e9174628239fd148e0f3828d51eb3587570da9ad9069513d48db1173ea2a261257159ff866ca54b3125e70e96922058ca3ee500304b47afd6f71b15e281b1214703c40c5a600e168c66f0ba4313b0e9fce520554487e7fdf89cc76a7f1e8ea234ab72319f272551fdb576c230359513e6390992c3eb1aecb6e3d12691133d859e3d3afba19a85032849d324cbc1f5a2531fcfbbcfedb5511423be739a62daf21ce9c114756e923c45d1314d5e03abeff73fcb4bb01f9ebac70a68062b5e9b5d4a7063a9fb0734514fd0ea0509679048942ac6fd12c4ef774e485ea9f41acc56cbcb06d2f48db22086a64843215bccaddf2a48822bef756983b4713f34f1281d480cba39f21b946da5f97d332a2a20ca2b4012d6e0e262a2ce0619c3e9d25b87cbb7eeca5463ebb61780e0170156881f7fd867b1d92984ba4a917c046c32a478767db6e4861601db3beb1002b3b0f86b89702f2dc441c25c384138330a10b4bc49fc4e13e166da339fdbd25fdc1d1e0459b9ab2906f8ef6541b3113f8d02063f6d28889ff62f9b9f3615393fed9793566f971051ef17f1a47728f0a37638011c38ab2f991c3b6b5cb9213b9cc5218b5c442f5bce09cd16bfd5c70227b8c73297e00f3bf7246637476366971bd887057772630d7fe864874b74b2cd553a59e49ff02c3941783679233c3bf9213c6b2e0acf361fddc50267f5ec32974ac40297d154e40c13f428cd95f78933ed421f7b73aa2b43d337cda5658f3189a11860288b989fe23d32902a2565a3b68ad0dc1901fe66f40d8c5a04a0259ea722ba182384eb221e56f66bb0efbe4c9b8ae23d9e76870cf138327554b8a7673dcd8500c398113d338166e020254687f495a084f15bb068de0b62c1c751408fd4e11d392c9a018e69a0c3563f8cf2573cadb1528fcea141bb50140e59945b73f244012ab2d6016a978f6c7a67cf60012b188094ec668162d95daa15360c4180dffead039480fb5655164b53f5e879ba4e67e0b480656197531523bb00057b019c5b32b0e2964258122751f8442faa5fa6e59a367568f0fefb81369271d55f8e4d2f1045f5547db20a0296d8da31ba290d6d0f33ffa12f1fded90eaba92c1b5ef17707e543da95a146b05931129e00e9180b1590a4f12f44a63bbf246c55529bd5485892e01c12f5d58d9f280dfab3bc94b5de7f7f5eaa72b3da910862bac4de9e35d9bbe6da1d3c2bbf7cb80374133e620ba142c01cb0df43406b0bcee40a8aa13496d331926907580583cba8f49b3861ae188843e8db85613d51f26ffd0b2e8673761351713d0765a52719200c36277430e119089dcc408432ae155fa525b58803f3c761195cbd7e7c4f240ca9564b62516ad9e2a47b75639730a645b5efa5a6e024ecef71ffb6ceb7ca59154313210e23134fa74053a1c954c8f820cf4e2a79efc25a130b0b7713f5478ab2bfc308519edf86fd7ec0a6c7c15f34fdf6b556c820d0aae7cdaff72878063c8c139712cc518d22d25c37878f47b17ff9c66fb3d8d20cfba14e3849f705eb9e1e0482a4eda5fcc6674c1c8c23879ecf6a5c2a3363474990284596eac451dab9abb473f4e7d4247152f089c3791bfa8366f9b95c4224130337d2cc510cf17f189d3dc81c640a53e68904c0eb7a6109eb67560c8e72f1a94280642c5119830c5c13905f476b4aa9840cb01346ec3dfe38109ca8afd95e11d8ee339e0862165d083da24da913b9daf25523e217d5b441c2178bea0a2914adc79ecf844c5deb02c7db675db4c3dbbf1ea0a1828e7dbe717dcc3cc6564e61873c78c4aa6de1adfd59a21e05493f528c2b2c8873d51a4cf99bfa279ffe930b05ee315cbb30cd36598723198473c945a321e4f1f0e363254c6aa21e9132eaae38502bb150c0d3895cd442143936d4dbf0c49f29c2b5b1669b9dff54dc405acf1d0ce03cf81559575e2c1e28518e74257437afb4e9c4ddd842ffda7ff277a165dca204f4de7becc30423e4b553a2656264bab81b62cf088958d39d9963cc345758c3180d42e9854fa1d4353da4e526490ef0c9a04f43a02f82fd2ab89e4c894e0863290a1206ec8552816f5f299c15175921d732140b77a9f0d51516eaa8b6581f40f5e6afca6c3e7306b1a803f7aef9ce6fc943b67f2515f7b4d00b82e3a7a847264ef889152841135c00ef3b90ae54a6621b4af428253baaafc2639105b0d83a98211af15b3c9a66bb473a16440372a91c6a98f00fdf31a71f070dec6e353b25bfd21921a59d37730bab7d2460a6489e2b2b46ca5c5f2eee3a571e1dc567fbc16db0cfa77dabe49ceff7a2458d1839b0294dc5f2903c3a4f79ece495c44c2212dac7a1ba01f5e7045094e8d2d76cec738f739983254902afcd9838bd6c2a871dfcd67be1710cd70d96859776a588981372d65b0bb28d4041e0a25a040a341403feaf3af2c06e38e98b103fd6ea774c7de3176e265d050fec7abe544238d063988114392189bddfde31ee77c5e0e2278b7dd1c33b9602f98138c92ed61e67f5cb18971687bddd95ea5f52f0c7fcf6bc6cd840a82411fc93330bfca67598653d44bf6b56b3fdfbc86150dc94540d5c54fce80410b1b4d6f9124238927d2293a1372310b1ecf8f7d58f4ee886e30f2fea5866f58dbe74256a444c4415ec03fdbaa1d97becf6904fd9dc1e5a1508a5e7e2bd7fd5361fcdffef631485971dde3d5712b8e0a241ed8b62a3f9253a80a36e58d801f5622cfd93eeb61762e4e3fe286aba5881834690a20b56c229120bf96f33e199124236d803e8df9ee5978c36970a0d6f3a11fa6543158c8116ea7f38abd145a76c867d7da2b3ffb55acbce08d54bf57987a878d3ec6410f446c65acfa4611676939faefa32c3db22010c5e31866c1ef37177465f901f5fa2a6b781fc87254e3a2a34195ede33d5eb76fbbfebfca4ea15bdbfcb3c8a497675d93f6084936e3e9ab948c0afccc64770382e08c194bf6f33beeb7b02f95da7c46538f34c2bfdd8fa8fcbfa6564de5eb68ad0cfc6154fa50e91ebb847ce9af1be72b13209206041bafb56e3a7a78dac0c86a3f47019155da090037d12aed23fa956780f3671a5a0cdd1e16d735561eeb52da004faaabaad87e1e6af16dc05b6bf143284a680c00f4aef64d8aa4badb1b881a14eb8a1108b413521dce384550be7d6a9a63458c9403d876d1399873cf29ce0879aa6e3a7a2c7e7ff682f47a6610ed105ab64a5ba6199dd56fd8a385051f447b7695ea86b695eac49fb64d0005d62ced43bd3e80f281018b70bcf301d407c4fba11b437a1b304f51b5a53a64e39644a4343c5ea290baedc1768eb7228cf842d98494e42bba64edf28e369e6b08d3245c7c00cfcebf78fa510fca0dad33744aea0955268b8011207b444fd42f931df2028b2fb4502634d85c0007347236227d4bd5a974f40eb462b4bc7fd452f2e3bf58761103a76bed2bf4118ebec0bf0d74faed60a5e3fa0814b753cded62410e372488c50ae4d3d06ee43861899e061a31b2960e31f84fba7b5dfc8fb88d32b0cc48f5244713a5bb87ffa7bd381419e0275c9c6b0fc7050c8c580f52ac582387d256ab0ee8e9ee183df1b97eff46f194ee7beb17431c6819a861b429d7121d8700263a3384030a6aa516063352154e2f326fe8c612f1416dcd54de4e077c7d736abb200778c28f6fa52cbb35eebaadb1f304916b9fb29955913fcc33519180bbef5b83da9b9b6d002aa706df94e5861a44b8486d6ca85de17a893e985b6941015eaa4b57d8e00165325f96a91ccb0e50798d99e33a004b0489c937cbcb463108b82dd339e249aee82e1cf5f6389d0f0c1a8ed7a07f0421f8daee7c91d6745f1d81cf544ccb2def65536d02171cb2f74a80eb3b2c960654de7c3bcbe0b593b8f6d81120c7881502dd0ac0b85c5e62c07c70e74105a0e052d9d35438ffebdd4360a22b730cd53b5a290ae8bd875db17c67c52cb4f4470e1767de6d9c0d153371fdfe625d2df6b882edc57ec5d7db1d64030915bb44f1f1e2fcfa6a0c5ef7c978a045e408636c7873b18ce36d555255daae874fd9e4472a59aac2c3af3be804158dd4a896c4fb044d4f6e23c7a06db30d5cb66e4c43c51d93649578d9f8f1f9cc7fd4455c988268f7faee9bbfcf0cad97faba8bd99ea06336379aa36d5215a2d9b230ab55041b1a09f113f0f93c18b38eb70490380efcafdd8cd1b50157b3c8e9b654dce3b4242d51760857ad86a6870953ebe82b37f8c4ca933f44a64201989d7d73de7813284bd5e4b17ede103910922e20904a9fc55c844d454df5c8ca87837645f073ddf0226b3a5251210f197704fb9a8aa1f7769e5a325de66ebc666e3e6aa4cc3be1a7a3874b46c67a3dfb86c62a9d190262030ef5cb020a074d038c10d0fb20c8bcf8eb29522f1038ee0a56fbe850f4503284aa94698488193341dcc810c4c7e112515217d3c63e5dafd40af7405576968fafa9782d00cae040a8a6bae58309c15a70359f93e8535ca21c51909cfd1b7e21d8453e7ea53ab4b7f9dc24a83436a6ace214ac75966158b876f4a0f90fa9aac1ec62cf3262283e26886bedefd3a0636c72e151cdc60ffb1fc26adedbdf796524a99929401cb0ab90a150b1886bd0d1f994e69ea31a5a139194959b9adc68a2ef87ca0a47b7c80933d43577e15b0ef083e1892bb2d1fc10733c8fd1b1c83567fbc07a1901a5b0021ec3e82144772b765298ae41157c3ade00d2500a3edb76d9dc6dda1bb3b74082174082184eeeeeefde210be1cee34dc5d72c1a6e8bf1831061aec2352df51155b9947f4bbc7f0a84b52629fe10efbcefe713c74cef07b2e32f5e5cbaf37469ba4e88d58f92fdd4ce0a41de944792eb4ce8961b656dc515c71ec25a819ec9bdec976e9c53cff18929143efd46f7aa5f6fb52a5e7d210d72ebdc02ae2ecaf0f55bff1fbf9f75117e1fbc373e91f696fbef926767fbfc10b00319ccfbe9f2fb37be291b55576fc023635babda66334b2b63ef8f46fa02fd9dbdbfb61eabb39d88721fc0be32f307d7aa57fffe2a8f7f26247af2546b70cdf811623f4fffeee8daea84bf13dc51f5ff317c5d1b514c205d83e4108a77c5be0c8d8d8b14b295fd2ef963146d91237e1513406eb3fb25db0f0df17f13ec2a785f662bc0c4067840422bc04d46aed68f45f80f79edc6c85379d73038f3892ecdf42ba83d42d0887aa1b6e188dacadd5dad1a8ffce0fc251308b77d3aa327031da22bb16cf55ab1db94f0c779e4b9c81edba69fa044476c4374ef0450cb659140d481e92e821203a9d4b32462dd5513346fe4379b261b42fa673f3682f46f702450fe59d5ebc92c7b45b3c7a2efeb2940a0f7bd0eddeddddddddb1bbbbbbdd3f7ec448c81c5d8a8f3f5f778c3f6ba4313e8d31c618638cb15f6cecee3ed99893131f621a8e8235883142d1839a9f1172208227682f460e9d0ef9f9a8a587a080af82bc201cb56178a44dfeee2bcfe0cd1756eeaff98b150d76eb33c9aff704a44fdd1019fe2b49d92561c44c863d74c9250d06f4296298be2f5eb030885a5d306746d1cad1b97b46a80167f4fb07f1026f8866b0852cd8fa14a0cdfc3e07fab4a0044c9fb8945c91e4f8ae037d1a8e61e677302fe53f6c9f3d10db67587b1ed86f18088d47f61a7e6ea2412cf674e4a698030ffef02116d1fa393c973aaa6fbad3579c01edf7d3298e2dcfc5ff75c94efaf5a1a2cdb17d408758681dcced1e83e71247a2f8af4beeb14b6e3f3efd08853c17ece7f5f8953e794b6ab5b6be383f763ae4c69ec348468c4c9f69e2eacfcea63f78d9d7a51b38a17dcb8b692bea1376cabeb5e7b13f8ddf73f9183846971c53e50c132152710f6df21b3b90f71db7bc986ee94bfcc5e3bb3fd4418708a1a02262417b38c4d6288f8d4cd81b7de272fc1e5e0c4a8edf8017e31f679cddc316ac3f8e2ec56faa058bbd0e19c88eb4ef8fa2dc7d8eddfddbfb684cfa81fbed678cf4cfd8e77270bffd866740cfe1e798015d8a5fe30ecf14ff65c7379e4b043d8fededf3e01ef45d4b0bf4dcf3b0bf3d0fd073dfb5e4fec1fef640809e7b0d72a41fb6b70fc4f616cf18c9611ff440700fc233167f4c60047eb4297f216fffa5e607937e4079fb40a0bcc53c8ce4e0de3e8fed5130e6c1bd05dd97d25e4a8717d39ffff8e8e2d683fc5eba1473c83abc98ce913302e6e9b86277745b367789cf803e757c9a053bea528c4f99d8fe1811135155b047fba8b1ae40838179310df362fc1f921c4a323ec6a8c58ada2451375c468c96dc8944a2245c4820421444c8af5afb5e4f57929f808782506068f35c6660bb6a5f09c6e89f04cabe7e40a88235b0489634304896de3c80727b7c9d59f352801703b37ff2c9279fdc5e5e4ca33c17941c5f930ff6a7b17d2e7e6f0dbb83cdf14b6e8595df95b2fc174ba52084c8e1e964f9325e5e6b09cc43f25ed109da838f52c1c27f5f03e6d04edd7be81f318e201e86c9e1b8ddfd6110dddefe82c09123078e20de83892f3a3c1d74c01184b7cdcde406f1096cf85d7737fc86ddddddddddddddb0bb1b366cd87d9fd01e0e36467b7777f777c96b8530b8d4257f79ff203c3ef8e0d339bde4e893f4e8fe2ff205eec2f0da57f2cf6e7d269fc9f15f1239d62068a41c9594039b814c6ca8a0939ac17e467e0f23fd3e5215dbc97105b683ac22af3931165210424eea0841588d03113cc949f5c4b3c742345c810a34a98a85c574b0a9238e88d89769604afe0f122c20253149fb967f291a98226998241f08d2b72ce94210554a3ee9819033333508d2449592ff521d46d2fea54897a4e11f600ab2661333c8a4c2bab04c8561aafc26ae4bb850c44392e97becd93317f190f44d4eee20b703bdd9fba022c7e9c3f4ec21a93bd5e584edaa0bda806ee8a28b2e522b4fa37bf89c6c8af66874ffc7ef6c09cb819eeab2c143612af8c43bc11214c9f66934a6c43b41b70d64c121d0064316b4d9288691fe8675746908fa4374090ea163883ebda845a4fd5955510626b00c4e9aceea82620ad8f1fde7ed7e3e8599b6fc42d422e5a2fcc9a6788cb8f3cf8c58c0902cfb2cda184156b57634fa3cef09099959984dadd9534e26c308b094e2b800c8da8a6051be83583c141cd2546c71448b0c61912cf2ff68e4d949c746048bf2dddb494949e11ee56364c2769095e1086e0f352186702d6cf7761e2661081d42cc2362de31b3df8991e80b859845c3e9fdfcbcdac7dbfd4562e6f95293991892083c1708e3858e9c39e9e79330a6aa7564513ab408bc18983f346f07e58340790ae02022f05c7438aa867438eaa5ea0e4a8a922ee970c116d525d8148ce974a95e613b8cd5f2ac1fb5608c610d772318df3b667677c8d6e7623918923e518cc4ccf43f2d181f0a7fc6171f449f400f9f02117831365e86714994fe8b4ba258071cd226c8eab1d8cfccf4d04c9084554a7e8f1caeb0852a85612344f46fb64f5dfc0eda5cc8f280cc19de21734f38a451d84321da04597da278880e2876b0027b5fb2f6984dc8a65814bb43e6fec882b9abcb43b8ab29ae891f8da6f70848311636c4dbe5a6ea729405e0162e1f75f645bc644d7b1a1dafbd8f521dcf057ea4c2ea64f830669f15f192374c44629a4fc94b4462d2fc479a6f6309ab0f0da9c67975b0200e01850993ce8e1e9383448b272d98270b463a04c98aba1433fcd76df6ed54576339f3471887122edfb5a4eeb87638a0438820fad461393faa2b13a24db6c374a64d86d8902e410c63e5f4a983ac8ca44fdf514041a3331b56674b70aa4c3fde2eaa5c3d3aaf164fce8e2a87a6056b329d94520a73b2f67dfdb3eb43bfe30ee69713e9a493ce09fabe44d07f141be1b98319899935dcd1c83b66a6dd0e9923bec2d27ff4bb4f8d91903770f4a9db3149fd46d8e8e7a6b4419fae6052832014ec103a200b63f5a9abae7ca44f4b740861c40d5d74d145c694740936d76d8298ebcd91a80433b33fe6c274722ca64487a3a0c55d1d8970f721dc955070079331d666b186bbaac5148c82bb6af1863116ad2e2b8e80f1ea604a30579f66dc31f3c4241e322466eea1a54ba3d1e7e1f780b52e86e483b19c2ec1c7b09c8ca93015a6cab083acb793b5c0769045dfa70eacd8b2efe0866b74deb487ac3ec92519be25a8a0154a32fc1d2a32fcd7412b9ae40eb6a012a8654832fc47fa1ca34bacd1c6040b57c85d7571e04393dfa7343ae99c71a33f6f0e90e4e0484ec9cf0839a0419691d12558badacb7690359f6e43b01d065913632c47c920482f291837c19742b0f0c6513a9e097e75ed5457112caa2bc37fa6a99dac07b15d75d149673fbd1d058a8891a35f22f2e3950fbfca2b04acae3e35ae4b1aeb783b8ed251e1dbc176b61e1db3091451c9d74ef6c68d2e4126190e51047c21fa044b377a28a24d708824f0e5005f4a43f08c1e8f1fd17c67ce37ddd50ddf2ba2fb05db3d462927ed473d4a3927a5584f9413cb7a32addd6394f1bdc4b0dc8eab592f9e168e8b0b34d40619a321c8185d22638f3231c59b54489fe463d8cca2621645e5a50a68067de482de9e8ca97ca7ea55892e37a9dca805db4d9ce88a583cd447d78b81a317281873b94d0c6261928c7d75c256158d5a31cee180a83f71dcc402dbb94de8be4640877de46a80aa10cbfd9b3833c7dad10c83d51cc33868d030df81dbf80edcc651728929692a0cb8c71e3a69947dec270ea665657825ecbb120abe601972e0ab7174820d7d7d78b29c7dc8a5fc8c911ca1af782684ab9bb0c7404fac54a99752c2bbe82265a4bfab3047ad6ef0d527507f27c246ecd0d808b7f1f268e5b674097b6963e147dccad8bfc03067341f83385dc21ec2c0b024ba84fdbf9dd1632cbfa24263e2b8097bacaa8870676d484bb92f732f35711c059f893e9683d2ca18fd6eeae4946be365ed61104b0405d37ccae2d7260e530d3fed1df5523019c34a1973d49ce299b02742090919fbee2563930919fb0e266313e7b9607dc25e02c1260ef6938a3e7d1efb8904cee8c7b4bf3c3c2ce44c9b22a794a34fd10414ef62e487bbd1e717a394e3ab4bd87f2e74d225ecb9fba4aec076922663d84f1c87d6622f69fc3149e3c363d21f03c344642c48b10058e164eb0b98d426aa0baa0b4ce03b7d5259d8dded3b8f4643fb46ddcdef3d0804edfd142c7c0ce8d2cc0fc219af094a28c0c6a712d2e75774c9e3eb78f81a953519bb33c31bca8fc31c003386ab98220719bb32c3ab921fd7838ffca1a132c72722b1bb14f4b9be2f66fbf7f8c57cfe3d005ecc7c31bc927fd7929f7c75d59e46cb579f60ba2486779af14aa6ec11bed173f8f5c1ad4dfef0d62ef5099a26bb2f5565ee2a74f7cf5e8c12d93bdb3725731fcf5add40d733775f155334217fae674d6ef5c574f6d7287d2fa6c6bb49eed7288bd7583413b2236144043b857c45215f6e82a232615d509db0b40bdb8d62103b5f9b57d8ada74d91ec3fafb0fd5d9d47b0fc381bdc1c92fd274bcb30bae9827935b11d65bd463e1ac9178dcb97ec51d1c09733429ec93323a51f3919f990c7510980813c8ea1bc18715c9d1f257c88e5ae69ba1739e6f03223ede66a85cd15369f8bcaf79ecdb81f600ac64dfe2db0d977f295fdb7efe68ae6c5bc255e0c0767cb9774027a4779af23143c99c0d30558dbfac2eba22ff57eae56a0ed7e2eb7816e67edb3812e85f76917a6b68b4445c22231cab43661e36b763bd94861fad4343de39dfa04af742717d30ccfc57fde7986e7e20fbaefb97c9e6b9882f7e53ec17492fde716afe4efddec994f325565ff913d855d528e0cfbacb70ca61ef7034c4d979be68e9b3c6aa106c1e2a1e6ca4dae17036db6d022cf9a2c602a0b6c7c6dae1cf55236ac5993578eea259ec99f891a17b0723f6193bd699e8b4f57f6f7cffe5265bba6090267d04091fd1b489fe8f7ebd025475257305dfe10d3d050966b2ee9d34e9fa40f8f49960978267fcaea60b23f0b253301072626b15dd33c9ad3c37dcc0880560e1554e4e4e0e0e014395204a7084e919b2237313a00a8b4b090e6f75c6876ce9dc8f4291392625eed91f28f1a4e9f0fb713746fef94bd7f7da7fafedb3b61ef6f458d9aef3fdc499ba0d718631119a74919b760a3f6327a4f97dc499720ebb9c0f757107b738484d3272ab46769f16375df56197e9792fd1f8c34fe0d5151054d228028f862e29be0b7298b90ca1767bcf1c560d9375a6f8c301c45ef2465ff8cb3fd999774a44da49b23845831040f15528586846c4245321cc233c10f0d21b4654d545360bb18c25922f7c7a80ae14415e9a6f6936c48f2498e45476265784943da04a592bc24c397d895a1a6135531e21aa421a41bad0ad24d8630cb4b75324f260d89373e889371141419894940ba04e593827469153189a64bd0e3166cc88e4338cf057e4b8eaae75285ed4238a49a3e752129327cf8a4d0140fe52f0f918064d22a9382c097e2c53cf732bc5882ec2f255e3c819cb4467fdcc731005452c445ef7477ef401d68355e7b949362d816da33807d47b861e5527e474852840c7a651771f981b27fdd7d6b4d75a23651997808d032c4753502cd45a09dec9fa96caaecaf72b52e5e01fc455743c33b807f76352e1e02b49ee7e22f4b60bbbad27a888844b80669937f4d81ed913f63a43a2d5d72f70fa9b3fc1a43a66e46a01087c4c8fa3c8229ad8748c6725486e3ca4dfe108e609f624d5ca1c056ffba83057fade26f8e6371d4157e107790a702a9402a900aa402a11548ad40ec5720b43d4629a59c734e4a29a5b5d65a2bf71db4f97cf75ea0ef60b27d94ef6ea47ce763b57dd7c32533abb0a1ef7ab06afdd49a2ef5a8b1a1ed3c177f1c99e8693491ec8988f07353d763958a9595fd536e87adb23fcaedb056075fa0db65385dd66936d95d3b64ae4f6f561a7689645f6390b8ca6e4b9b9cc6203e8a82dd681c357a5a8fa3eaea997c5b65ad27bb4f34d8674540eca6c25a4f979c2e61412f1a4757886a889352729788ed23257d8ea3bfa373959f4dfb4ab7dfd1b2f3f6946edbe7b74e864abe261f56fbb5622871c51a6723fb28e387d79b794fbd9dcdd5c70cc7c908f2b94460dba7fe077732807c5e721b26e2b3c920019cc1bdecfa10e521ee3a638f82bba63d0f31f7794c7e2731d9411feac397a192f103ce80cf6109219536440f3111f0b7d744f2e1d39795cb381bf589e0448f552925acf0459293d134f8819fcfe71333f67979e987aef62917f428d73e0daf1be56a06e96bafdcfd201eedf520c63211f0e1571eb88a49d8d3faf4b98b61f9f3f4b5cf567b6eecd2a73e7d1924d85e7b192a1924989c8c965d50932ef5430821c4649000e2407185209ebc45efb954892b37ad4b8078383358900c950c12c0192f3be4647c0bed7c424e68f0487edf37ed2c17c2c36427ca17259d14ab980661a66ddcdb1e07da98704ff2fb4fcf07f47ee4f798e4d74590e4e824e99b2ed2364e1a48d3f438e971f2a242894e0e153b4b72a8c0813f1eb419f2233f156492dff74efbfbd8243f9924bffa69f718a58c724e4a6ba515c3b24cd3326ddb38eef301814628291625252514128954448f85657ba3d1f65ebcd81e0cd1066f27ca6fa5b4c2f2e0ed46f9bd26b0b0b296b54ff917a3fbe464ff19f1e663a64712a6271108112b54d3a4fc1d9d275dc97ebeecfe1dad494dc3dbcaca773ba4a66972a58bb801f4572086a19474b286bb4829eee2863bc8f19065ed37ce46fded5f9f34ed638cdac7774e266ef771329aa665af69ddc45df431d343db3a1e79fed61100482602f43df25cf9ed76306fa69eed6947801ff4a3461fb4f2dbd36895ee15dc75067d08779de9134095e3cf9f18b423763be28c5d0d3dd688a00f8a1ae601143109f4f2b52c8bda6f6f7a0267c4df300d87f11981ed08a0cadac6d960f9888988bff21a8b966571b26853d3304bc6d9982c8f4d2dd3b438e3b368f1ca0cba70524a9fc61b3368855ed3138883f695b331e3f7457978ed6b57becac542f713a5b374b2fff633a333c344c4224c698033e4a77c75547f0aa6f1354c44fcf9da6f506eb893df955a79be066cb808f9a0d7719f2f77c4ac7db723e6edb3ef4aad0cc29f11d822dc95b5df50aebdad2c9f7236b42762cb7e723e6c59cb5e1bee8a901aee3ae023cfcf3059afbb66a617e61863a6f8fdfb702ee242ebd7ba41a41de0bfb701ff35ec07b4fb033cc6c83d204a29e503e49c73ce074c4a29a5f40134155f03798dd7ececb44ddbbc5e38385005552dcc59c176b6a6e2f77b63221137b6e1d847069176c8f8f5803ebaab10caca7a7a28abd68a736419f691aaf529cb3ffee8d3cb9e68aadc95b25ee74a72e38e165142b14b6d021fa44f358ee26ef20340f5d1510134f50691a6361169224d6da2da80341a62246f11a34cbd238415a39e3f5996f4768e194b4d970d9ffcc48f188e589f662dbd3497a02c9ea95f8bdc4f31680b9f4a66ce5a83b0290aec7c0d65ab938e3ef5663a93b65a13cb9f0b73dc54a7e6dc033a5531c45962fb5f579a3198e907fceda03dd91f6d66dfb096c91c67a2b75e0cfd2933757234d00e15a8c6c950125822f5319792ea6437e6cac94cc94d013a79bd6a70d80d5e131e9e1a9a9c816de83c7acb3ce3368a024be9086c76db5d6218438285f493691a8fa3a4009dbc5e1c06c5f326b903ed845c2026219796595acfa55fb2b4fc435d3ab6030b5fb31125657b7dc23e291af8dc6cfefc1438637e376126ef0e986dbc0c619ce176686f886111e7879eca5633396a8921faae44802ce30546879c96cabfed2161b3e881785c31be5012393e0ca9482c7ba53c694ea6be06391f2a8700b961d00e16856a722a3919d16b91e381e6a8e2a2948fc4a230a5f7c341fea4da7c947ea146951a50e6c570ff425950401743f5a27d2700191bfd6ee600bc18ecdf479973c7d2e26444906369b13c01422c77fbadd969c6b4d7a5ec47937291850ce389e3aca30b97b85c9009dc89f33d1ca4dcaecc91def870883fb91d3a539f536ed729e56a5028d0dba338ff95227e3bc43cf1e36a5028d4edc2d7084b82858f71356ac6b02758f8f282b2782e578038f4fb08b46361f6acd229a36359e53dcc638ca116128cd76cd85ea33e36f73bb86a1e377cf7bac830be7b4f5e36bca02a378558be7bae95d1776f875311fdfb6cd4f23152be83c999311f89507ecfd2bad8de385d25b135e0950ac3de63c971e7e3724517e624bee22bcbb2158e096bb512fdfc274ae132255127eaa85c152d496cc516b6c59b68136da24d07da11e50d49ccc951b9a1fc5a0271d021e12c71e1bc7815283f37aedc4424d2b49060e0d015e1ae8e9a5052abbe5021e170714864a564bff14754a9542e8ab66d307be23d3d2ad766bfeec45faf0f8769a03c2f1235cb8fdbc317ddf75c267e1a8e3b68e23c3cd6da4f5eb944ec872e91cf8f2e119a6701edb8a92d13dfd951b95c6889bbdca572b7ecd795b88eeba85c2dfbf5242a9cb7bca572b315249ee3392a17cb94c542853bcb76b229cfc2c970cfc2d9e8ed35bbad5c229f0f5d22f6472c97ae42ae9aedf58fabbcc877b8f93564561195361c728d8ef88ddfbc78f1026553b9d4553d3d3d2f3c88af1a7b189c0c7d189c8d56b973c7e572c170d2af17894452b93207070787d44a5a47a7a525368bfbd935202cb41ce99b1b158c36d942161e0efd3504e955af546eb37ae66f44e0ab5f342f080bcfc58606d2344d939bfe0d2c9bca8539e512f93c57ef7b26cada38eee16793c3a84a668961931b38c8c3339f46afb0bc0721ecd3e706feb88140601096efde93fc813783268138f42739437edfbd1efbca3c3a6eea6f1285fc1e026f066d0271e8b749422e37f573bd254f490e30dd01b20c2a9d8e669096a4fc7bf962b27f3fb594bb92e59d4f306ef6cc9e939d2aee64be5e295794fd4e263b3b4d346ef2f0d050a6201e99a944898ece928d9b2e574eb9299943c2e5cc9c24b3d5a2ffc1b6948b92e9ca51a09d9d2e398136611e993718136ea8f870130787ded024700655411c6e9254120ec4c1512c94057120b5dcd46ff3e7c3c968ff892a22ee1f27b3127acd391b9d21cb0531b91a8ff75315558558300907bf48382c2dca626971a416a995fb41b308889b36d30664b91a7309426a6a86586eb226eb3381d04c9a205d5aad503819ed51b81c72b9585aa4252026f4e5261d47511daa439b70db0531d9b20fe1ce6a29b886cc117378c32f4f993fa66aaaee96e9ea49e84988933d3d2957cbf24a27224ebe526e96e5954d5438c9f3d952e41297743159e1e44ecaadd9af4cd26a2961e1a48e4ecaa579f2c838d64132e2644e4eca9d561cb9b9a1e205277170e45cc21016ab080c4eda682b5bca8d795ed00e880969890dc1ea9595c8fd1da90ab987e4570659ad849038595393723d7bcb1512480b2769244d0d35703274b4d15586c760e1d3e894db35c81a38a992aa940bb34fd50e5dd96003177b5c8ad833ffc576a99336f56bb407f7d017465fd409f654c4c9404c9dcce9fe104a2821c445c457971a4402d7c07be5497bb219e79befbd524634f05ef9617884833728dc7c14181be4de0caa0371e8874f27338275302fc77ef75c289fc119dbbf9ae9bfa73a7046c8456ac1191ba6372ff814a2e80b047a2e08cbc2f98f66c6197df161868d469cff0b49310cf7bc80b1bde0fc6144c8aa353535305ebce064b07fa1c98dbb9e210d54ed7409c4a44bf759d57dc1d59099629624e47e1289f36f218283033c43b4f8d7c0d9688e48fd78897c5ecb2e7d394ae309b9e00c96d6772157eeff5c1a30f1663661693dc9fd180639c9fd11b3b4727f0d9ff92a24ada55f88f814b65b6818f2abf2cda0af1861703062c0e0fea1bc3c2f380394c5c3a1bfad0ad4935be30161e1b9f477340cb99fb46345e747e7fbcfa7357032d80756b6b4b470a39127c91da849ee1a766c98df2f6ad85e9fe09b4f8337cb36dc70032743a46299d21bea7332492cfc0e442f27b3f3380cc4b365d9d9a793d20b004e66e3348e8593d134eec596027332d9c7fb19817d0d001b8c4f09ac54d130b783c41b57e1cb202692a74f6f4a22f5b1aa8151bedcc45c8dce98122400620ccfb29f497e00b81d2a04316953bf00389989413b300f80f3c19774214808f2fcd98120fbbf92fc01703b94b096df4267a558a6d18d72212a5289d4296d0a5f0e9ff910c3dc2710c9f6883e640fe8634a288519b41783dbb46eeb2a28d2e852f61f7cc34dfe1cc65fdddddddffd6ff4d0a8979a9a733ed89c610674c9ff86a332f04cfe8e61f78fad219e8b13a958be5b71f26700c534bae4cd007fe9a3b5f02a954a9593ea627ed147d9ddbb9f10bb5f60be146dad0f451fc35d9c2f7bbe1e6494f24697e464804f5c257eb2beb2ff83331e11701c3221bbc317f3ea1350881ea2883e511566eb372773440a727a229413a74f54f4e919414795fd210f64620722e9d3abc2084ef6ef608ec326d95bd9fd677cdf9f892463b87b095184fc91cb3b72933facf535b5d05e8c2782281299b016785ae47e5ce4bea41d1ecc3247c87fd2267709ec6be520deaa75b4a700ebb163fc1d32c37f7ec50e425e9f48f15f26f9c3fa025f72200db4ee07b1ad436cb4a25a035b6960e1c71c27e6bb6b0578a6f95acdc9d9c3bcd8dcfdb56dcf39bf7147ffe6d0a549310c7632580a61b4c8c94028ca14e66bb52fcf34dfdf39193f59c8e157f1bbbb7bcee1604091dffb16b9b3dd4b9e73ce79237e71828d78c6480eecb39f3192233ef63398112464ee6ec874cea7d115a64b737ea581eda7e34ecf506f506d509bb00f85097844cc5da539a718c445ad961819420674a9f2fc8f46b66974a906d661a5817ddfbd54a1bd185dc6cad88befc26c0366d06bbeb9f69e64cc7e7347c8704f9f93f1a717e6e7a899fa333d428ff2332adfc348f62cdfd994c672b323b4522a97250b455ca9d065c149d5fbcaf0822ca852598d2ba572392657d049852e482755ef0c2b789093aa35b69b381d805904334685682ba0e814da8056248d566560572067848d7ff7e5a7d15ae76ee28844d10ad115ade0360ec5739be70203fb522fd5491ab7e1e0e352b08de40f95583d212735d303a49342f91992ff8b261cc149b1c4800727d5c348f624ffacc695c2aea04a7516a34cd02568086870319930dac26a31b3f88945c69e9601be668ecf569f561efb591f7b1596d165b92af73d53773349c630ba22bab14bd8cf253d72629b30c9d8d71858ece14be3a6bb7332dc6b5bee260e7cd184e51c15aaa14bca51677832f6356424abb5d6d8c9c543d17013f6623a634f87bc18fa9854012d92b10d3040e6b61b0630d17845cd019613bbcaa99d6c9639929ca681b036109abc65ff66e2a1b0d591ec4f40a14462899f9b74681486a1ebe18c911cdc4b0e5b3749a83db96dd3435a486377bbab0ca7604751a5b0ad823d5daa3eb0af4b8e27ee74c8525aa86380dcd7a54cf25cfc3df7ed0c757474746a1ccbe91ed0c78cb4a5bd18dda69337ed81c05ec33ce867f433cc43f4187ea9d18fbae1bcafba49c6d67495aa868a585e6b9aecb70742d37ed33009bed48d8b236bb55e4582f3453ed62a1556d1e8d8b2214565b6404fa38990c58b09bd945864299990a544820d58054ff90a5de8c473812b16a36038c27114dc7153cd68f46aec48d6c825208c63f4f0b5e468542be8278cad56b57634fa6fbdbc68b55a3b1aa94a2f30524a88d1ac407876ecd3d4624b246b244b4ad9fa01b6301d8ec340a05779d852e91882dbd969a99ebc0961d8e252a4900b771cd5b55af95ed36f04097eef34cdf6929493b39333ea5e42ad02a98c809ee5d2fbdc645f74b9fbb9da88fb948b83c33f7eb47cf63f48bfc5245d8a3aa3fb522aa87158f6dce7c89ecb1ee21cdb732bb793349d5c856eefc08c5e76e4836e0760e8b7eb2a3725e9134827ca557dc90b53b246caff6cf20929a1c8524691a59c22cb4cea7cfe65204f58fba107c1d48b4ef26429751e868ac4a901cb9a4ab296056b302ef62f6ef6a3cb52abb52ff5e2be9428c5aa71947cc9236308c7158df38040ce03721ed077a38d2341f7fff8f3f87cfcf7b924887f78299dc6b1d58a49e00c9112597ebca28a28ce90bb9abba824cbf75596524a297f6e2495e7fea5e4c71b476dcf611edc6b4fb18649283cb4df3009e5a57e05e5262165b491358e729e67922f57b08a73280fba52880b9e4b8dcab25db48935926e550425c81add2677044945e3de7e734684de3e0c6192ca7fbd5e034a41113df63f583e43a97159511ee55554fef33e521c26a97c3e07f61f1155c11a9e6159b944b60f5dd1af685f3f87f615cf1851f9198a49a1e73eaec857c139b417e1990d934298f4437cee81f0fffce7fd3599a27dcb8e24e876de8219e576d1e6e578831373b6e7fe87f61fec335091ac462b6d35dc95b706fbdc8070b491ef485ae526f9b5dad1975e3a18995b722fbf57cdea1b99c92a677dfa037bedf35c4cd225ee4a964e965f5d593e96691b4e96ff913692469dd8ea9294f2e1aa4f4ebc189837d883fae81e90ce68025bc5cecf273c40ee76c5e8c4c5d9a879fa6717898b844562941bc3255df2252f26cbf4bde332975b25611fe912c510e773c88dfb29d481ae23f621deb2842db91bde748966d8f0c66bb576d4165bb54cc243d20f49c3203c97e811cf1cba749233fa9bff2015cf25c62fd56edbd58226bd2da190186b1d8de0fb9e3d5fd582846d80fc3286d560ab9fd80aabc156f3d6bed683e4b85c5b3fd121c8628a28a068173413bd04d4620b2e8e141902834020f00793265008056674a855c9ac710263cd1a04f196901e20bfd7a8121ceec5688d86a64210bc89ae51d023c80ec790dd6116b273195a911d3e21fb4788bb51900feeecc8896d529960b8ab48269e69dcbd960e10de2db764084752c24b731fc181b53bb0f07b83520a71e7dd6d6c947446a48138f8bf7fb5ce2e6c21fb532d647f0999647fed6221fbbb0d18320d9cd13bdbbf5483b60f06e2c363fb0f7e241edae6d985e394a1f61538dc3a2d79ca2cb7bc9ee18dbbe38ef379b7dcbd935d4e0d461769a67fc409839d4fdfb3a4b93588e12d77dcc19a0aa100b60a2da8b229bf2ab2a02467f2e13ff80f460861acd2238cf86489609eb96fb8c5479a2689902f23d3342dab15c3b6b72ec12a7bbe48596bad3034ba74eaa00a87924971ec1c5d1ab5bc0e2bcaf1f2ca1923e76814076ef4d0fd3a5031d53d26b939b063be0963a94f8e7b72371022835190190a542619c6e0c5c8ffd7a1df8a1e0825a4c2a2baa106d2c6dd60430d2d24182f462c2b2aa2500a8a057db8ad061b327def2e90ef8b372f4a0d182042650356c88be9d6691fd23f2bd05e8cce57d9abc70aa3782e3c782e3d80476ad6e8166ced24f6e6d5257742e34b6c29bdfe8352ec34aefae1347d6aec15deb809c3d055d969faf4fa759b8ac1c697de3a14fb8f2eb9d3b82a07b683372a9cd699b6b11bc9a1fdf66f267b0d63f026c32428e4b9608fbdd5e0e37c80d866a343c630fc1f519522c1a78ca852343abe23d03c51a3332cf25cfc00b9e2c0562d58f81e7d451b53ad72bce1a81684f005e6e505d6382a7e1e3eac819109ed23d75c68d9f6360ec7fc06f2846579fbf23b7eef382a63e59457f9e7a8178f02fa88425ef30277ad2b16057f7057d2522ef7d9dd60add6c27675a5e6c9b15f39764f8e2aad6b3c7efc9a6871af9aa65d11ba7254c2c2d7beffa522d79847ffd692873f87b97fa9ffbc7a63db3c53c51c0a6ce5d8583c9718db26b6ab5df1e3fd20fb20d05b4cfad4386a7e842d47d56f979ba2ed1a58a3c3139fc7c8031e0e8a5152edb29dcddf8d38d207e3704cfa60d207937ee0b8cfcf6839b6ef6f3c9319f9bcc6ddf9dba58ff5b72bc7ef2ce2b72bb61639f61639361739b62b46eee7e7e07ee21923283fe3cf3d0aceb13dc533eddfff328d86f9e5bee99c1c7febde05e5b68933de681f7f0847d178128eaa1f3bb81a71387ed09f9a90de71d5aba779dac5aa69574db682b147f5d175747393e76bf189d114368a3c2714ae036bdce40f7a203e9f074599c9d14b795fbc15dae4e48963a63d10fe9a066fe078adf9f2e65560fc45da58158a616b2e91555a8e827034b22ab8b33636b089c438b6aff3a64997e6e7e16b9feb0fb99a7b84ca1f417f385c59952a6b711b8d6a15d2a509218459a438b2624d9436da839e46cb9ea99adf4d26f284a0ef66cc1ecbb0e791fdb625d1a5f9d885aaada787ca271276c37ecdafd5daf93a8204b3f856beb52f3109b68ea3fac555ec47a3cf35225fdb3e4f2f8e0ffef163f4dcffc0de6f70f27caa228218478649f03f1193e0e77370ff19610c718e8a6167615f4547453cb3d1e883a7eb740066fb9adfd10847191cfe4cd810bcce732e91e76422cfe9823c330e23a117f28495aff214a6e6cb2ba58d8d8d8d8d8dec995fabb5a3d17fa9f4f2227b7a1cf5522a9a55cdbcd1c93c8e7aa9579e2a58b26ae64797cf6a475f124597e83b985c3f836e3e0fc23c40fff90c7f3ecf43fb8849f4df5b7a757469fee70ee1a6f9f1c61f76d2384ada3cd3fc195dcf34abc5dd5c55185d2af3fd562e9ecb943dcf85653b69236d66603bd9237b8e20c9073dca43ce8823503eebc95395a7e6d788cac5e1f8c70fec3fffa37e96923d5eabb529df8d32c6a161108e4f935b0c3294ef9f8ffc19ec3f2f718eac42ce081e605ef91f60caa1ec7113922ecd5fb9ad08fdf3fe40647149972e69e55f8ab4827f78a9d9848d3b2c38bae6b3b61be020ad7c24adf8afe01cda831e84679ce5a6f9dafb48d168af71d47c5f394aa39942d0fbe700bde319232b3f131f84e7afe01ca0d7f08c3f08fbca4d536e11fae779c4073d109fcf300fffcfd36815912a6b2198a58dc4991f59b126dac456c4893a314774bb5893e7873a6993a58da35eea0627cb9c3cb1ba7115db60d47ce5a85eb9697eadd68e46ffa5d2cb4baff2f4559e352c9b1b9c9c3c5bf62fcc5de328d0cfef95a33e3fbf598eda7e663fbf731c557fce396570fcc0be6acffd8fec37d07f6811ed73a7ca4df3eb4d9e8fe1e4f9192bcfd7eefc6d95e773773ee8d2e4d903ba2ff5b92f359bb0f246da7469ce9f416c7f276df27cd8a44ffd1eab5ca8146e1466492b158d0c000000006314002030100c0945c3f1702c8e0439f31d14800d80aa4880641cc95912530819630c21c40000000000000024610000c0b1a389590ae6f3835f47f1a61b7d2147dda83d2845a3f34651aeac01b1ac6d338f8106b2ffa6b89195c169e0579edd123b587cb2a1e6adb9ef04b7cd7cd87762bc5ea052546615101c91e7160b97e039ea9146bbe9288b64a77f9ee0123a481db4dffb86eb06310917e58409180a1b8e9287a0c32dc8ee3c7a3d4d00eefe280214d6debe3657cd2df7640a15f7ea0d4eb52e2c58b17f7366aa7cafa37200873d6e8ec75926b4f593658a3caf78b7c1c87b86fc3371df210b46d3b53ff79836cef3512eb1d6d42a4b208ca479c5b0333a134d2cebcd6048bb1d67410c579c4524c8843b4523ccfa99d18f736a36484f37d1fed8106e76ab72d913b4701d667703d433390010bef9475bda1cd65dbdc6340195ad3a8db5ef96128d07ba9448e9f94cd3c9281a20e72fc6769c674cc84c44784a72686a26ae500186f698b45cf3d6271c7fde840a69684c41e2afa3a015d3ade0e1b2a69a83a47b633902254c9f4c755e8ecebcf66bc4b4b842014ad3b93967350263d3fb1449ede1a8db237d9d66078e6a916cbce9c7da0b51655a9833d48bb1af313a3a59ea771331c73d027e657384f5bec209fce69790b1db3593a99135757ea9f35ed6217d64ef0322378fd6853662598a797ad6eee99f3d7244e891063dd9efa5e6c804a6b642c09bf7a8c043784ae64d36c1122153a184cc77200a335c665d1d92d0a002b7d132a9a4bd40c97eacb3b08f26285cebbbf9a4d5886194181714c9887d1eaee36113274ff3d5e117ca0e4c2e6fd3378e27009a927f4c9dd23c936ffcf719aee7c7fc9534d40ac8efea98098d90d84c939f0e7263dc26f69450653718145f376aba475d274b006a6dd600cc9127287926bbe9ea85a459fcb96c34c70c25bcfc638c74d54f5c01d233456f78e6e747b18741ae241121a82ec83e00e6137f15fe213898af1f559593b76cbaaeb7f920349d6e6e692fa0b6b076539c899b420ef9add52e967ec373e3b10b29407a432972bd58d78a6a88404949a473d5020cf4526db7c5048cf04c3b0938e0dbdaab88761773c186a02155a5660f04b7fd0751e04847ba38fe32ca87f495b64d364d0fb1314c8b7795269dc64d35bb7fb05e7f1fea363fd859ffd702e310a7c50860218b537e1b4b0ecfc4d2a410d62914981642732c55ee636ca105ee2ccd7af6e5fbd4417d40f7e1e136147818d127e9ab442917c3431601e8e83270188f29dc884b9855f40999ac1ff16b0a9913b5eafe98a6ef2b3448044ae8478a94955b38eb5deeb54b07e7b9ebb0ba84ca382968c258f8b09c178414b1993f80546be530a6dcf10f45aee494750b8cdafe2b9a0e9dd5bac525ab686a21bd822972e3e241146dc249b267cb267d17e735d08a8c9340b941c7d8de3c4aee6235947ba318cf70b8b8504513e52c64e463f295c7e936951829399aa4c1cd2025dba1164c98f64d8a43cf2eabc7619107a63319eeac39b0053d7fdf78d6cb4c4511f79d2f8e43d50ce204c610ee75e1aedd4843aea7aabe82d85f93f8f8543f31904510d092ed264487002fa8da4378df24d68868eb4e3f0c56c643abb763790509588b6ae9689c9bc8c28f0cb5c09eccf94dd7e0651ea77bc140a5b4296d7bfda03b01b646712b83c7b2908087d829cd4281c22853a809ee31523721d1b77b23ab23ff5f294e25bc0433afbfccf489228c31481f43ac4a53be518d20d7fd36ae351a7a7f06b71e906933c29c348c1804e47250b6b1b7151364f7502b07ecf38c7dae14be6729e96c4c87e13cd27b011f631db59992417639dc85c23de19528094ef9c37d8796083cbdedbbc008c35cec3440df4ea9769a8617f761700e8e518ba02106a60f0a57aafad52afabd12bd1ec34a2544d225b0cf50f9dddeca59d984cdbd186360578156192e989a0fce0d4a54adca1ad954889bb6d9e88d7393c7b44556ef13a4a0c10734451d016008394c2720745163cd0b6817473e0cdff401aa390112928c619506cebd734e8ca5cff8545bc1d872e8e462b6af783e113ed761c1ad4bdb220ef58747d3bf9d66ec760c0ec32e934be37f3ffd3e0f38c1f8bb4293ab00e15b9811d04cbe97f52d43a9f80ee1d6184de82bbd68310f975cc9dda2939ce887aa8707bf2f0356ec381333ce644e72563025d3441914ce85f9323797c8e4d501689941c440152e31d6b37c616e8d14b0de9648a82b2df1a03f273fa417c5f280a9f2917c63604d2f606396535c032a47fa90e69db59d79470f7aefaeb073787b73a3653182eaffa3db5198cc2d8308fe9c6c5d38a07fc0e6895fd44b207c58c658a8868e88512f3d8efbb969aeda6d221ab06a6cb474541f8719a00fcd52c41d2f88794029b6346a70377f3152b61ea71d22b0c5d215e83b31c17372b53b462789e53ce2f9b3c4a79d7f014eb14477a480edad0ae4730c5628389f69dfa4564616b91d689f27035df9c6703cc35c8c98ff4723d2654d7b09f609226d8fc5cd328a03f1361ae915f341c0c9d3f9124f05f3e3440f1fefbf456142823f747d694306155cddbd910d1bcb0703060cc8303b000aa3674322700072ad6300fc43ed8e85cd1c589027c6c90fb824844206421a7310e18512d2a841d238238972c995d6d89304c2e93a8e6fe2a70c25a50aa249bb4af2f31d4684a5b178661f0674789cabdf73fbf16addb9f4690055e2d8e22e32c785c4a1916d70b4ebc64fd4217c77fd8451adf983e04c8ba80d61d8a9e4b88ff9de17e882bd57ee99aaf34a5675e15ae9b2ab7e5905a47464c448a0b016b07a0441102a83d30556d48dd248dc88151409a234ea644ecfebc7216c189dc7b3379269ece99e5f56bb6fdfa0de7f051828da4c96887e7384ba35044c10db9031cee4ba17501459ac95f20c4212bcdc7cf10392e1c6960768862beb3a4b6b8910a6bbfea00ca43e9083fd881e0c7ceeccc1f89c6122e8453ef7b99c82657d6ce123119ddd42ed34a0c22bebd569a7520cd4beb94454ddd981df163249fd6b8c67dfa2d615f784f0988bed73f5bca24a262e64f067b3acc2a8ba816e03393ce888d5833d26b5f1151fb6acfb8c717e20c6ee270857f58e13d87ec7e4938866f81982a46d20f07a281dd61628572d65f3d229332c701bbaf7070f21f197190b36d018ee378e0909b057ff0703792e736bbb11c6022af19976be46f17cdace96011c0a59ec22eb8ac70e31c6754ac049825bd50daf30231000fe81237d9ec1b3886fbc514c8d5ed5fde4fe9132f2ee65734779e8e2784670cc97d47401ae2382e7548fbcfb89713264adbfe631c82c7a04f236963e070641d7d5388c015b7fae0650ef9c6a36b2ccc3cd79475763731e417ad22769437c728d78b8502b6b3928dd127a9db1a4d0552a2171cdce5fb341660ee19333a6780d62495aa0876cce5a2bc4c6a89458122d3121800bfbaf0b66d6d8901ae16cebb9072c50a9418310ff386e139d3c1bc5c018e8c23e4cf0b3b35c9a62e10bd9481f9a83fde6d550ac3f4bf39f550e5d96a8783dab334e395303bcc37c03513913f3c72d31efa64668759a03f5be1288cc4f6e8f82d2557d79236a733af281925d476fed9d3c7fbd91f7c6d9f826c08745c620e9e0c17bd990711ad094741b48ebddd6ba4c583a003a6b155621010bfef29a9fe266eee2d55466080d2ef382275fdf548edf371a7004d7dd5101e082004efda81cf88cbb96ccfde551f98d8bac9d8e2236122a6deb14731d5b0be5f9be5ea5b350d8e46cc41e542d2bd13a546d2d88957eb0dfa6860f6db30745e38618873ca26f485a74e0944db34c1c4edf294ac56993e565303568018f6af7287073a9cdcf67d07f20a2c1357c63ffc0e8815dac9fadcd6024cbea1e151958f4effeff8f28b6ee59c14a59172e22810471630dac5b4fdd236813f4b0f165019d8760ac5e3d8a81802ea25bf20268325c8ca50071fa3c998a9b4eb4c3dcf7e2941ed0885092dfd648876afdb26c5ac348a7c69755c0fc9ede2a8d75b3c29d97d628d212227c56054ab9303a0553adeaebbb7b8d3e2103d75bd80161ad8f1e571d2977433e71afdefb7a562c202021c2a3e92fe91e9c5df80e0f4ed03b3ab122390de11d450c8fd5dc6b89ad638a21210244bcf17dbdf1ce865765edede602354985ede6e57a3c3d3a28f074e751f51f8f6dc8a72c414dde0c9363480b5e3b035d59e11ec4005908b37ce73f6388a404cb3161c7e0bc360cb2c27af9e2c1996e1a64f2d2c97248baa9a1ba250b51a05ec3caeeca30e64fe7cf951876dde16700b6b88b7ac41c672c807e7dfa5c3e54e7a6b8feecf71bc323916614d82e2d1b8de44ae46b1aaaa130af1bf4d369bcdf47f0786bb23daabcb8e517b1c84f889827a4b1cd5460e74dc84cdb0b6427dc440f55fa75e8a3a209465cdf2a4dfd9c5d8e11281913b35c2c60a39ed3c95000ce8bcf7eda568a385d79c907878f84d1c5095392f2e0298cb5d0921cb0ea491c70a537876710a0dd8b4b2ec51b77db983be1a88292803afbbfe58da27aa5031621814593adace7533195f83222e993452fa499faa373729c9d77f4d3aa03e1b8f0347988199b84cc37855402070da12331c5f4929d15b806cca412d97413fc2c184aca91809612412bd8652525210029461d7243c8048f6e0e1ae06a5bb03efa0da6d69375670c45d97aa91b5ab0316845542134b96ff34aa21cd6eba5fe791b338e10c2872d1735c981f6837203ed356885fa8b3603225a20e76da32e436c853a8cf1bfd45820678c1737028d9074fb010d3366eab17d207635dcd2049314974df221e3befb44f087208bf469b1269f9815e67bab0c5f3f64562bda0d5371c94d02a6dc327f2877515dc0c2f2ed457ff051e3ab63f326007c90bd590a52c4d0aeed3812f3704b2ada8d01a76c8d21b37c5f1f8218a2ef981b4e88280e82e954ca050dc19846b1653889ede699ec472c5448241045381af81bce248b52e348208d42edb828a254776bc1971ab0c0b7aae1fda8d0095ec8196d66829fe1d61200115adc868aae6115d8bbf3b4baa691056fe7987a09b1b81cbc739b5564471fe40d437feaf6d690e5871697145d9357b133d298197bac65deec934d8119da8a2650224fa84a812ea35e7c6a8aefa6c4a99620aafd8755244ad2488a7cf03b54201015b4775ef3c0dc93b8dca490f0cc00a4cf45e8b348212b05ad4bfde3f9de4db3a09deac06410acf9c4e7c1c58d332026790d79dda9b982eee3db4ddec4252e3208e566105502069e24ee24bb6b85c77a742d8a5d64884c06acb5526bd943767e77534debcfea916151acdd9c9bbcad35ceea1fd73ae8dc0a3289f57d95dc0b988508c37b55ce2f32a0665ec90a009616ab0c4cbaafbe01d1a3b0ccbf543263e89fc908989b424132ac79db38ce4d44a570771c1ec4031324838c7048ae035084e24686b0772ca5beeb188aa7800dfdef468635b7398ec98a10fb4502b50311bb57c0cc7789446d920ba90727f4837e41ae8264980293e2a589d5de5278093fec9894174ed67507a044d32641325000e2b5dacc64d8ffb0f7990cfdc9ab1be34424c9583aa4bb8a45e2b2c1d4c75dbca797a5c20e3eb3eb763102413bb574ba9ecac9dd595f58ed8c914dd710b408e7e9ffcb139690a884f35d1c2833fba95f297b17c9311ee384f89dc9ad0d99cb396793c0aadb28f16d24ea1872da9ae587a2a4c151f3dae8cab0b12a1c64a3fa3c2658346d0b628ecc8766dc220f8c720c828be5a9eddc62e9b7192d45572a771d8268ee1d4af1008bcaa3caedd83aa0fc94c293b8f7cf210102fa713943a7f0fdb9b7c3fb1cfe5e8aca3ca47a09c5ddd5da889a31d8b695ec9c06f00a431810932e6268c8fd2dbd50bc947a76086968af865245b3cbfb41d010943ca8eec06d91590f7a24c4c1c17221cb6d40ca61f5992773a50cbf7b3ef70519ae2801802771411cbe7d297350e011c2e4134a3e329ae8a2accbac00dc838e1c63b941bb71d800f29ab7633bced1bd7960b2f088df1f2268b7ef452c6cbd712d2bd35616adcecc3168410434fa8ad065deb4ac1971aa33d00e5282108bfeea7775a2c2e32c8ae8cb8c097ab20423631bf80468b7f033733f027125f6eb8f75945e99df7a5878e0c0d73228ab5d086b9c08e679302cf63b6880047f5bf6c7590504ad3b11dc1d9fa5d78aa0b608292a50ab7a86a9ac509c343c37d985322ebe5e7f1229cb8dc793f146548114a6f45214e6d594b32892ea59191cf45f94a0cefa3dbfcff349a69b6c7a799fd1e2f1a622da649b2e0e0b60edb78bf7ac581b1cabf2a077ec9201d19b3f2119d0f47b0bcbc1a3fc4d7a59318861e99c0fda4f502d4039afea4ef47e71d79fce39d3c83337aff547356d410edc5d16bd749654aeb96f7bc442ebd3b25543f397dff1151c92101e3a81853053ef54a8d1309bda9bc036be00f033527f2f89e924dee03f1bd893e4aa4bcdec549fcd8cbe9bbb9f4d94e1ec27b0436fc20511dbd7738f061c66eaa0ad4072e2208c80044c052491fb2d601500f8bc9fe8b3099821689f6af7349bc3e8fc605b1b0ccc5a0c4f0c484d29adce90199cc1848689a726460496fbe322156ce0d65b6fa8977a10a95eab0d6f6e7f9364915e844f35e2e4f6dc9ad894511be66c55ca42e63e8d273f6a2ab89b4d2d2e01880e16c9e2c273d8bcec4f9187bd1bce137eea0f60780bd6699e30075fc5295f39381f9e7401bc6754a2c7b81ba896518fe6ad277bc69663a0908c4a5b8cfa8927e80a3aff9f3ea3114fef6997a62b3b0b6b4b86b16a88500d2b796c66be8ef6a74ad570f7e70baf1295b9e8bfc9e1ed1a2e0c23e02c5c9aa7b071a57868ea914bb972c14ec8856b4ba4f0ce50b7dd94067d8fd9864dee4ef741b6933b0fcd2ec310db126d7d8330ac952f2aa4e334ae60ad09bfd77bdc8314591cc27cfe93c3d6393f9d8c624742e7d64dd65721db706e2fc942eb924c63e65eba8559bbc6a97e36d5680de6bbb5645f5a75e28fb139a024b944707ee78cd1c46495b7066f9a6a8f3d84550a368ce870630983ff6ad2d1792e8b320fd737b194391438464a56ef2b2724837d5fae88533ff9fc7d0d6b539326599ea9110775202eff89dce052ed95a2d97822411ff63883c72e7141a8c9dd36931becee041da5bab8d2f4686e8e546ddb44bc74a854181262de30cd894345d26223a4d4d12afcd037b4ad3d356b119342299aba981ed67bec5f0f4ae000048976067887fefabdc4b313cf48cf96cd0929aeeca7b50f9a158b2e10c4a9eb574eab1fa8b4680beffc243d5e495d2e9b0d8ad6a340331278f35bc733279ec64b772d8667544614d5190b700191cb5ee4742e0d103a81c4ddfe9b82aeaa73ee1cea1c8bf94655ea7fde1e011c8c762649bd25e50fef96a0109525e5b01a091699e38d2cedc3d8b528b1d398017c74c3460cd0a5f517f0b452461ae03559d832e7408a8740358ccda21ee21e24261c135c1344381e83f031c1c2c670db17d551f6023ac4967065d578ca2d8e9b407187d8287c16429cf0830abf2c66c360249dba3e2303477ed9043deedf02bb886db8f327ff261bc83efa610200658fcba0a15594be9712d087bb202225444980738049358dc12332460b1d29098018fde60507d247d27d4f741e0253cb5b344c47378d37e05f1189a5acc4ad84e3b8aa5590de7be84b9f4bc0853ba5c07a3ac766c7697c1a627da7964fcb698453dc8efca4e094ccc9e0e4c853a1716203acb15859de15ccbcb770e2b66f4e15ab63fff80acc8da0189b904d14a8a66a3423fac576c3964bd89a246ecf54ba3804dcacbb90abf18704e866ec7a97a3595a00f05e25c15147240800b9aae0edefafabdb25e029ff17c3b334ab98a00a221f4d29b0a76263ac255e915327c040c39069762d9c95888f3a8e449fb0f093056087e99af0adfe21f097a7f57250acae1c5bf42d79a23e0ce7a6e87e89bec1365ebc5c6cb3fd8a366e08acb59b2f7cd15a7f6bb19ec4120509845d77c106f0bf1e217b261e6b65e39e1ba5cdacd7609e11e479dd3ca50f2c775893f76435557f42232c4f8e52146b3559b02dae4a1797a1a7274b2a519c2421a1b3457c6dafb927c442cb04392658d1b2e6d7172fc0d41bd7e7a30c3d447bac7c60f01e90fe818d6cc6bb631dc87ab6c204b7e47ba002514a0e901cc71812f44c253883329f897093458af1d32de1b80fe104bcc2f1307275063780fb8f53d9c670f57d2c8572584429430a3a00bb99c886fbd5fe7399b7bdf4e826edc46aaabb221634ba1fdcf59365d202f3fb4edc4ee58e116406ed02b215a179605c93a6346214f811f8d5e4a0601a7570625322041b22f0197eabc31689330cab1ecb2e6b1c4b6cf0ca19404b6eac69b424812706ca0a9db229f5b08863efe8682263ed00ec03eaf942611268ddb54f51012dc9ce32f04b7abcf3978324d0939cebdbed8ed461ca151d02c60ed1630fcb410ab8e83a22d5827d59001b122a02ff955e208cdb44f476798b0f9e91e2fbd9b402cfbc09efec0e97e654064885bb7fdf134823c53a4c898ce00c12f1a7a992d40b14d40d8dbe74c9173050df2fcdf46cc5ddfb02b981ae012f897848e8b92bc262ed318c9c64c9a12f3c558712da706ef77bbe09ba201028f8151d2ee5c424978a035721a44d96cf86c0c209a89d49a55cac88a67acdb7e8bbcb2be683d3ef890b3a96e913f5a7312d5798dbbda2d614176e2a574677ab1da5e44097af241b5c59d6da33a7b9b3e1ec9b0df548a32ef44381e67000da36e1edc481dedb2077f9ac725411ac170b6842997aca8452e020ea25a2cbc826daeb95ad78f5fe07d3137a985daf8867fe62fe158c4571f7e4c068a90154f67cb0cdd98d8baf35817851fcf9456bef9fb18b37ab29dd44e740eb4f838af8cfa86c3c6807ea02c3279b5219c5665462f3b351bae3d98bf98bd11687850d0a3f8c7d56ca88ec30e256f14487a0f4e1dbd77f1e6d458b8695ebf0f5e03e627616ef1c8d4c2b4e144cb955427f75cc79bae6f4409351886b052ce169fbe3346a6428c9c4ba026562f870b19c2e539b9b49880809b85323d0d28be20d89e5fcc300dec5cf587680eff0757a90ecb5b4408b969190a2196a6774f8cbb4509865000a9a9d6fb362b0c05be2b76619ad7f423a3aaae2574aee95315af4d26bacd8cf8daefc8ac24671dd6318cb36ad8d7b224e686ed1483bfd0a346af5d821e39f2d6255923204a96127d320d69e8405c965b495e63502559d9e0f6e762378d1ee2f52de5ab6f5f3d9b7d64f7398e557fcc0bd002b5903dd3bad07b9f2fd0bc714926201ee5c9e5551e9da7a4a8c92307adfa25306062ad70a09768b2bfd84c5e32b044d5186e07b12f8f388f69f1ddd73e275603b3900091c8616c56de2733b21908af69e1354ea2a031ad7e6b627f8a39ec0ed1fa05924a46246505c2e965d68eb25dc5d8992034919e9bb099790fcbec2d2693b00a604453bc382682a25c58d06fccbaedd40c1fdf5ccf660e09b5edf2822330ca9e395141f83355bec12b9a80eddc74b30662843bda2c0b5856241a5e995d0b6207c4743e0ec49ffc77138a79a27cabc0c5d38013aaa0516b422e4693333ec48b18cdd460ae839ee8c2cb96d2cefe1cb8782c95791cc752cf5582578915e6eb874201d62dfdb0c97c95ea5001203ac9de4878bc86766a483e2e0cd66a7c597d01f58e985ce32766a655d1c7e20bc48429a9cb80290f5ea9cc7aa1fe60586d578f98b76ba0efd3962d31175bf6aba2bfe6e36e27c85f8d2f04d25e59bff25e2699bb003091b9de5bc84fdfcc82d687d5da0635a6f3c036cdf779edb5cd5703f7291b099bce79dd271db86ca668f09b4452cf356d8f15c26da1db8be9f644554ceb567082bd3d7717c850c4052242d6bca229ac9b2b025012f9647b8cff94e618dc8c02a5554f47fee5bf23994dca8459ad6672a55936374c49e52b7ae28aa2398e0f8fde6949adf3bd89533a0eb6ff81a8d5ddadc8c6b4641d5bb922b7b18a77194b321300e6858100a07c8540762faa040b823dc9ff8466d7b1f3f604d90afaeb57912be23a97a393450c0b0ca55b2d5b8f5df405e2add25fd023755e65239a7dcc65258c1d8518277a15bc426d2e17e82ec226dbbd40e8d2630ba3cda5ced7426937d9adfb51fae52ab17ab510379e12d0d69d5c50db54487f2fc39d518590befe5112b18a3f4db702cd6478f4fc7ab4d36d761e2587626835993c6b107980c0277a7b3ede98130b828405cd269bea02ac77e1d0c1745a800b8b14c665c64d459c40d17ba07437f7fe5b9827a5c2701657ca7479ff540088df24c21460ef10091ee8c5120d36f8746c6f0ab3d675800659457203c3c25921f6a34073f1d6f50706e0284a972008e04344d345f540c75fee1bbb70bc51ae2be4b454fee2472e8064d3a7ef7dac24f4029cb0eaa3e222a6bae085c5971f60ead435759a33f5dbbeb657eed78d521278415e67f9d91243fd4b86bf8538f6048ea68970fb2b8f90d608279844c07eea5236df58b5a38c73800aa01df3f22f06ea3326e19ee3219b6117f1868397e470ec1db66c2512d0a8fef1aeefbf5fec1e9347f751c2f341e50e8f7d5ea929ddb739b18ee85b1f1606271afbce69eb6803cbee91b793295dfebdd26a75d76c473015f4b588302c6cba0de00dc9f79c017ac96e84bf2a097eb21eb658924491f34b71a092d77ef2f1ce942e51946d713e48ad29cf142f99ab0b034c136f7016f619430ec827fd0bcea7aec6f0deb3f401f616c586b060303fb99ebfa3d773db59df4f033f14823b83823dd4a4d1dd2cdd778bed576181d11433408ff12ecdd43328628099e5249e93b0d58228db6212f149a646a9bb04a0f43ceb641510d80e7218b5a67e91cbd83a0110a607f3beb8182a2bdc58ea9cb156a5449c695375e6514296dff52aa8fac3505a888ca092fc332ac2dc28b7a532bcadb00b7796255f8a7449ae1a042e4df4d6a101df347ae0f66ee36c2e197e869f898024b1121f07e516b03e3874cf4312700c52d9d0c030a1a2495ed2611906fa2dfc0a5af275e67e9d0a784e783430c8977173c6bcd407a096acfb754d435352497628f08b13d883a87a670926f89e7bccb03768e48c5663388dc50d5f0566464b842189a81b15d1fd517f4da562bed4ebaf461e79602b99f5260f56a00092bd9f0575e0cc4b496b9c5ed78672f4a62c839b834e204d78000848a6b9b29b422a466c2a27983f3017bd93afe7864e74d9f61efe2c5ace52953f9093b4b6da42a6a5c1e44ceb74f1c2a11e3f30b811f88f936bec29911984ad3d7c7ceb78e98e4fd2d8d609b5dc102fa9cf29990b88f5507aa9bb38baf17e84fa4f32837eae8f6844b909486c7671ae98bf996c72ce120f09f66ef6b00788f92fd4080a43be05bc5f0ded761e373a5df71547f9ea332cd852d2da9ac0c423b01a765fb65d205ffca956084f02bebbe36268f6cf5fb2c7770e9ed1c6ec520291c0b7ab798bb658b920b6175ef84f752a2aaabecbd4183d7bcfe9b074a9a69ff8b566d598f6eb40e343df3a1c68d96d657499b41502e695bd4af20df002c74cbf12ef1fddb48819a8058df217da99569d6c0274273b7cde1683e2b29d280fa9c0f83056d4b83fa45b3e61c9b8ca33607c1391dd125af76f841fab1ce2df791dd7064c64406a27f6c1c6b37c40aa3d737da4613b57b6b119d2b9544a7825f57d9410cc0bf936e1a3675de9b1c3dab9e5640c92ed37043f3018d9567738886d5465764f30eef2afae3a4d242ca1d132887523f25ed6991938862036e8f582cc92772c5cf45a4d33ced8153173dbabb8ace016d4f8af77e3cb2fe1d4537705ff9232e2a51c990e5c7ae3107c1c651b03b0a8153a7c6e24e58bc95e5eb17412d04b921f0b138022bb8820f6f0b7f4ae57d5d1bbb153ad99b93fd2d1c078e2c2658c91972f190ea33fcbfb1cd697737195123cdc5b234b1fe15313ae710f252d4fbd3d95f2950306463eb2024b78ca0fc5941e297bd92f0619baae817276db24f7c5dcfec3a3b57f20e389453b11b96ba4efcf6e386b4eb597e185171d74df0e3b69d45e818409b14509850a3cabbf788875d182dcca566d1f5cde227963fd7c0d6d7dd36ebd7ff6e79cb451dde27b850980ac4972949ca51762e1c0ab8fd1742874f9a83b452bd056ebad75a4198306e3edc9f1434967b8ce07c7520fa767f40503fbc0b3a3126809a841909d0dce87a3fdf4486e50bc11f4c1a165464d68be975e368649cf3400683872ea9a977618efcec937341a2b2c0e9f2d8d636cf6d0d0491baef67ea620d69bc58a899f080469deba7a9630c101c70c7885e300bc2ccf6de2b46e9f7172700c65f9c614e3748684a2326938670fb5105183ae670ee460faaa1a42188c6213277cac4037531d54701066160afb3eb05d2f451c458efaa6b40e338ea5e7cc08811c82a2bd3884673135f11ad5d2bf84fe70e4ecacc3a79d123f6ef057e5504845aac06de495be253be1eb9d54b3c854487b151ed443d2caffeb9bceb3769c271bf97962bfd66e20fc97b2dc066856f17f017c5421c99bb430ba3ce4c10f8e105f92b35baad41a5b838e6602b8173956ebcad17d9cb29bb7064f20346d22233605d9f91030386520d0c5ebdf933be50c419e8437fcdebc0303c9ea35b98e5c14052fd688bdce3afaf4e9c0e51829882049400fb6b601e6f762ff2307c120c0888299522755b576a287468f3afc9cf709dd676e385557588f8242e9bc2f19970c15d14101cefef15df58fbe7bc360f3820d40392034422352d088f095affd3c037d3753cc001d1a0a13907911c249dfae88420b8fe06caa8b3d9cd9e4186afbf85ecd0ae39f78af2a4cb59c5e0b34572fff8ea011327898d2260b25b3f462b34e1a65c5768b6509a1fa067626239b556d3f718840e61d433e738f0a9ea3f1a912b4c86cfd6356c3d1db66e9e223a7270efa20d7f2a9b076cdc133d07ae61b54c20d5a8318af2f40fdcdc6f047910882d3a6491c6e8ccb124428dfa1972f4cedb952f9ff278da06e9da200acdd087c5a38f4c9e2dffc9a8c4d791cd178457b5be6c11657a2855433cb0c7e62a19df60dcce7634f97f4315ec957909b46805e44b39838224a2c3b3d3943916a560d368af0af43b8634c47d47d8f542ebac13166c01e28443bf099cf677c73e70fa9ac47e2eb955e0e79634d221e9c84419a702e18336b0299853c4ee981d4ed7ce71ddc2702fbaa2fd41e4c8461e6b408311b5406f0d93adbd60b78855e7ad3510855ee737f8c4943e32308c4f3a4ca2c73de77b64cad903beb195307c5a327f3919040fb16c29a9bb04f93f0ffa649edbab6213db5408a8095797c2477cc4934e4a20b5b2f1d0022b91194eb648b3be512cfb68b4864952cc998b93f918ee11e87053b4003cb6d2379d0f82c2c05708f7828331641e71d7d618c3390583f24b608e53492fb7ce891ebb70dc841e3baa3c0d95c2f0521001cbe47da51069f5c90ab5cc7a28c4f21e83d0c4871e276c707010f03323290c9c5955ca9ee90e1ac67936bd69c24f2a1028eff80f6ac58d6d62aa21a727207fe8bc2a566451359658902fb5daa76d996d90f120993b82a09f5e501a9443db5cfb156c1bba9f43433d50ba8ecc4a4410f4e90727f98d5332d1bb1933f89e0e1bb66e3ea4118eebb9944189bf7c947932aa6e755c14d754e85c9b1047bbd49b536120cb8161e3698eec0337818876e758fc89a08a9614c10ba7be5965528adc3cf9c6a93f3c9a0726c7c9602fec1a383d8b05082ffd16191df03e7a589b000adf763215768e812001373696b8dd987bf1b0001031926626243477a9c553b87d9c85a7bff1e111ed0356885c4350446c8c607c1bc78b0781c243b8aaea012122fb3b625684bd068b88034ce4c39e489b810f83e0b5a5226a44dcf728ea05e5f90d21248a7859379ec4db2f427554ea88447789b27399f0e22618d8bcc4f02574e4b27c7bd6fa4fb91e951c481056e93f8e122efec59037e3b6cae0faffb3f9a3a53531e768a747cddc5345ac755d917482f3c13d39da4c92dbae3cadb8d8469b43605c6ef99f0e1fc49766f2cd7c5a4ca867f384d8707efc9fffc86ba2093888b5029ee8f3b0b5216abd118be12211a3dc3a17a1e36ee201a74e5d0cc3ae500ef00bedbe0d6749371e0477f870eff3c237f052e8daca6a807499bbb93210c79a10d76876d4177ac55520af78f6a2003300daa95449f3a5a17a09b4fbb334dc032cf9cdac9bb746b3dbf5d4bd275a2e774fd8169a4b927bf192887e1daf58a31b387d99d0d0cb94277c7d68201f4731cba3931ff9ec059b417e23e192e6dcd8837069bf8622b333c62bcde75c1cb38830039ecddab59a5bcc016198f2c0aeb5b0fb00d602cbf64dcbfcc7eb801866fcea0df4d33cb617c65fdd9b94427fae22c8449e18c1d527ae2b3443c5da1e4348d440c4c2a4d17979662b5d9260ab625fd2556cbb44ebb04ab645b4baab8d604aed597bd42603e161a292377ffe01505d4ab17ec66d5eb39ee0c93dbf80b8369fd19d5d931308b575cd2d63e674b1bc08e7fcfe06dd5510db9792ad2c995f1b801fe2c82d9711e49b0d706c3deee4a9a38d0cd0ab94ce7a4ecf043883e797e6214ff495f6c2de36a6a3877b9dc4f4901428bd9f2527cc0fd96e7920407c05ce56d8d9e60d9c2cd034733212a8b84497bf33cd728bf505cc1e6a4afaef68597a8f793180cf1a67fa1fe233cc6be1211091c6c2a4d8d5ff17bbcc5285837fddbfc81b4d72be6b217cc0085f4baf9dd1dbf4e39cf21a3c2e19c1aff3b9e5c4d5b2fefc848fe378475c15757b4b826e935b398254713fdc1cdf02a70dc7a3df878365fb73618ef70a936c3b300572821ca9e838bd37794c32451a94deb7d85f8d52db032645b63aa01c4a2e04d109ec2ffabf60d8abf7cce162f576b57048a59133e52e8683a0533d1b457a94c7c7edaaf2b000d3e7a5d4e1681a02357d0ad0c1464adbac7685ff69b3df839f70671d440e5ce549f048e1b68d2e79156505087795de3e7cf8159ab0b8c97836ce9562cbcef7a1435cb811ad682ed6acb5e45948b00bb6e3b340fae4d2f45fe573c84263118b3d1d012a8f6d9dc074e0c490e7e2a7f74548bc1fc94a118d75f18de2953450d7d01c07a85018dc667e411fd3c25c9806cab084fa0b3e058ba75d0eb91de4a196648d02f9e75f100dc72fb3dd47f50bb02162ef452d3bd140fead4be99f01bc3ccbfca9cea528fff03fdc50b594e1a0ed53a75757f711dfa55bdd549db48c837a42f9b174173a4c80dc954ed772815a9232488c95f8dd905644853a08a68f4172525d2b82926c7a7401358b8002401c743348c2f443addef1b8531946945d968977d1e3823bf1cd0248eac75fa9ce1602146a8bb9021b1fba36408e34b8352340f99fc058f549231592145a8defb268a276eea6a9c2cdb0c2de4b3a8f727970856d45508bb9406b9951fd80c6863f833c095f08ba2d23e38078773a1ca5fe6d7a856a73c210198097b5a88d789fb209bfbbb354920e911736733da99c58e90772a12771f0a44aa01e924adf1a54035f141b9c15e72f8a44b2519a7d311a834217a587890ab563aad95c89689fa68ac1328893fe17099f1989f6d4d4251e478847fefe476ed6f1b809399f1ddf64ae3c424b6361ef5de115476692b811f3400b50867c1b0b5b8e60e04125d12fac70a13df4900b8c4dc066f138480e87a856899dc67979a8f3945429eff00f0df5451286574708112c7bf945a2551d5d613f695cb5207aab68eff2c00b36a60a5e1f1f2477871ed6a0c136b991df0fdbe7a0aa814a7eebbe27ab4a2816074d4faa4aee100d23446a65963a6c791c6a889499ecb0d677317e55738f219d3ee5a61f85949acc237449cd04c0b002bdcb1fa0eb102abd21ecee762f2497ccb60ac5714511a0931d7415de4db36f0da26783ac11575facff457e1172efe2c491392c6d26f8696dd19f1f267ef1a821ba7b78630f65d4c1a38fd15946f75a36b006f6e0e5a748e117056e063454fc23459d96055070733d195f8200af9a749b21b7964c55bf5cdad626d5fea42fbbc7f961771cdb2e6d097df73374a75fcbc6d78b9a9145a19a910f6e1a3cfc8cad7508bac8f8308c7430aa256bd95245d998265fa3d7fb2811fff56a0c3ecee1d4ddfd0d6aa1016197d0b908064db5da657d391d7efa49a6f9577b12f71975712651e5aa40c3e58a8e3245e162c1f97beebd5176a067f8c03e7840cb624af0163227a0ea51b3b7bdd66e6493dbf5ed1715917a4f1380deb5527f3e88d7939ea2c00a902cd4e26349d8e11f0da4242520244b41d1cbf737a8f89f673f14a5ed51e035922c58fdc167b1ff83e3d3793bf0b0535ff4e90d3c2061787d828745a19efcbfd8c6eb32a648a65719a157c80bf6ad0d82302b5ea34739997d5f524abe4c4f307906845e572bafaa91883299f9e372687a587802004a624cf16804adfb3873c30c85306a284481d4bd7cbff5331c147abe89c8a4547ff21a1a3b8c03a8ea604f9fe54f1f009ce0666e52d9dfcb8f526b8a07a4f6a99d47e8ebf1525be111dfa1d968caa1e1a7fbc093eab583f598c0e293760216ac6b5b71289994e230a95e00a59434231aba089183806fedd7b71c13714f04a3a0392ee15665b4c898d95f72da2280eb81592690dc67c2cc88ac9181a56050dee232ba1b07f177e0af52cd850e2db96ef714dce87738e6ee5de42466a276628da974f03f492dd2b7e069a23a4f806de2a189e154b73e33bdf270b46a71c25a1f4ee5552fa6d997494f3b5e73786a4cb8e4f7fefd13afeed9cfcc20b0c28c24716545086113423e7b8aadef41a762b027c2d041af8de130cd25d5e5b5d294e68d4615c59541aebb2ebf3a8b5b4d1b4b3db75863505f1101cde7b615e0b6ae90880aa588423761d631f9bbb4907e3cb4f71bc570d7d631e2338e3e153a479ca71039d8946f6187d8dd0227186c18ad3af1dc699b67ea5b23e26384d7332edd1a071c6d04c022173935a357aac33e3fe9d5d4ca7f748a3aecf463e2aad17ed37507a87d47bcb5adc99054a6ccc021a75d899ea1d4094a5bf595cf44d811359a762dd5b5458dda5c9426871207317ebdba439eaac45e6c775050de2318f41a23529518b6d3ef989eeff633d22d6ba5969182992d739b4d5fbd71aab18fee594b5e31a62332adfa79d675913ce23c71ceaa7042cf15b42750fe3bdca38273e6e99173bd6a04002b71067e13d07bd30ccc85196cc6c616199644e8cd88f4e1047da950343f77a7b8424446f0fb47989cd71a44dd2d517268278816c216a962c71f3fc657ddc12ee56fefa7b01dae888e3106ac690162423f2fc014b52af452cc8e22d3d025538e95c5ccedfe4a8ed4e69390aa2d5cdd992b0830395562d0460a9ead7327879f3764b1d3ce9f1ac214e5e1b1d13b4654f228385e31d1843ef899bcd78b716b107db33249dff9ccd5b50d82eeb09d55c8d3cfd5dec381bc4b21bffa5b801a545a1f07d7f772067d61f33bcdeb95c850259789a7b101e478a6dcb6a945be2b9a2638215eaa824692a0d845d8ef29c1918c80f01d03d4803c759539efad1a6e6e9e4593a671b5c2c38f2e1fd176a24a8525b52876f3553911967996869af62e324e052df8820aaa60b810ac0cfe9973bc5a8cb77ee31c8e0a243a13697d1ab341a5cf68bb8db1f0b380371d80de4645191b23a82422712683c12678926b18e02be871c0f86f1bc48a8a0d88f80a6bb22227b34e3ecaf140abe45a79fd90fbf889c9f909da389ad1db2badc87525d024facc5cf812c0ee4b589be6aa54881b3a869786cb8adfac73bbb915bdbe18d2a841e1a3ac8e0bc20e59277500423646080e4a58156a2c3017a500df5d650f9faa14a78cc88eea2ba1df4aa6219532608023c4d4c14891a0a5efefb1c8024cbbef45dc6602f9913122163332623018481f6e25807459adb28de5ef17459dd3a90bd4f42cd5686d73287c388c179efce0545f4d5f1468403af27ef0fadf7ead4314c9b2b0b8113e2943a871c3a93e036b8e195905f22ccf1e463dc71bbefe12de54a200e0c0f93c52e0b823ea01f2c9eb35391edde58a9b66be90d2d4024c832b44c7c99645d534d35228a30a49e32047adfc597fa81f09f5253530d00a9de96e46db3afa4b9549520d1323f2ae73138df3fdde9a607ff3aac30e6e343180e853a402ea86a5b986606ff51d11aafec98f1d6918274fff15f02dc2730988bd306853bad4099ae1041a219a87f777b8b50da389565a3603f3649cab922feb7ce303b2a87c94c6794b2b5bcff5165ae0c21500529e2e2bc3cbe890f74f1589e0654463983f871e69af1785205b0ffea98779d66c0f9fcfc8e0ad7789c7409072587991cced99e0bf45e59922c1d7ed1aecf02893199b04e3d26e058273ac73550ce29b044844a505a726eb40552c150e399f8e67a3b15d7dff158dd88f35742b140820b9b7805eed61695193f9aa71ef181fe53f0ffc29624807cb6459071fd2a888a079240c53a949d1d38a6cd408435f21caa846223f883b3b31a9d85abf97cd8639449c28b6b7e77f1a06f794fc5e585b0b60f9e1e8363a476c81528ce051db1dacf71a85fea8ec96b9e8c16170f916955c6bdb80f3a9d479b2f05243fc312cdc225d19228c2df64ed191e175a481b1f70c029afac4cab5e4718de45f0232d5d4c53523e8fd2e8914f096cc6846387b6eb520433fa0f619b2a46cd1c0e1da17470b13aa4994132aca9518c5d02e98a71f0bedaea4027cd62cc1fff8bec03f828a09fcab6be1798b587add9f0de1db2447cb1f7b8d258b1d6449bd4c077d658350cad985b6640d3ed2041acdc50cf35269a1f0e98a11dd9de4092b2d9d55843e0cc5c7740b88ace799d9e62760efa1dcd796301d6ffbbd247b58d1c2fd22dd7fa5c57b24dd82ddcfcd6c1ee1d25b03e09dad45f925959ee0a0aab6723b371698d15102726fe33e4e3564623d023a1cfe6ae39f61a8cbb3ad498b5b5a9885121f97126a9de6af8d5835e591fbb97b7a05e8af226f90d44f5d14b0199bd16665ae6d9de8b50a30a49737dcf3a946b7eb1d4009c21d8c25c216851afd467b3352dec66ed94077a8d0aa0139ec2a534b178e3882dceb550e8009e60cb40ea76722995c8a34a72a3afc56bc6e54a333544e4929335ce54d8a46fd3a9499ddc7e77932fdecb493b0b450be4fcac3f7143d7203af3aefc395e81e83c297863c71f39cdae15232e00e0d10159f04a52cd51b0c1d0fdac08c131d1525c42fdab1a0d7c837cc4b6953ff5f1a21ab05878cd52165ed03db20de92780f40904aad0733100576149f5801f4eae046f1d8f2de7e473829b7b0a4bf2afc8476d283a53f1cecebd964f455f148c871a834438ed74f68ffb78b3e1e716188d3d92a5af4c79291daa004daa8aeddd4d9efbe199c15f07099eb540de0f18a22c64a00fdd9fcfde9f4eb1a4435f17dd2f7b0c6d10ab3a26a8da998498858a34005509d3e1cc52e727fc0adfa3eef1c5572c4da0575e2cff604ae35134f44269bc80145422be270c10f44eeb2e6f7c8cc3776fbf94821e85d78c2ca914f27a2f56dff1a61a69143eb2baafa75064c27a75b98609a90a158f3795ff414633703158a3ee34be6c828a2774f8af402abdb2f6645a7d8793441f2cae7c6d84978c15015666494bfe0c24cdee756d8059db2c244fa2505b7968619040320985ac4003e9060ccadcc3281a30aa14ef416a4e78f62ca9277b276c06c882a50929e831e09a1ac3bece341eae6a6aeaa23e11cbdf09c294057375eb15b9c9d27025c3f867f4fa0b95d2ae0c9e58af70349a2cf1b8aab974c4430c444a2b3e8774e14878baf0c9dc1575a20f56dbfd2a82eb85abe9990ae4adf92c0dfb51d5d265a2d2e52e754298a1b449817b5c75a2808ba152a5d86941e3ae97a63a3fdc09b6fe71f22ef2a4f542fd18f1c5ec9cfd52966aff3c0817113e3763adceb1b84f59c773a543d8d09768e5ac8e47369ccb9f6685c493d99cd38e232a085d1472cf99f121cac878c5213f1963908ea44734d2e154ac71f153f859a846f435073596b8074eb46eeb45326a96f432372198c40c1b26385850142d6acc3c42562203dfc67d57fc73b010433dba9246888514a4bba55ea29477a886d4e0bfa7644ae10fea55f10fed750f1f0e4267e4663a9323084cb96a351d2b5ac52bf20347ad695bea8dde6af091fee858c64cf0fd3be093f81a6696753dc9a0da6068a585cdfb201c8841d30e8760b3a3389e3887d66a77c70b5f2471afd6695094ddb12eb59f52f058b36330dc86cfb514ab1168f393612e3ab0901f1c3291770d11068daf6b75484a65d5cb499ed690b11e9b273b1f192488c72d00b38c5940f8521ab59157adbb8bd0e67b24cef9596271796874516904b402e0fe3a45e45d91efb6aebed5c98885e35e1f87f0df8fe7ba70e6baa3f6f0b4ca76e6b16ebc644e2905da9738568c582ba3e6b2c18d9b060c4468df1709f18bc6911d6995cd72950460fa949e755f9a950f0141adffbec6a3c200ce715ff2f07e2d0fcef8534029b8fd9fa29194551a1f8218187813f6ad1e07b3ed04f50cb6d623c22923d55ca01ddff00e8c69f20d2c148503788b49e325b1208b890b6215cd3e6fea0d1f49da2949066b5562b177bf62ce07c13317417b5087e35ec20bb5120e6fcb06ee6feff558e3cd1c43d89f12df357b2c2778d289771888e3aad47f27115c4e439bf4f1aaa6bc13665535be4e0b37fb54c7243b9997c4d31faee7d46950d2fc8f0730539285d5185b7251d214a4aaf47a6fb28f78c55c6ede5e218b504df5700b190c59d02d553bd12e05508bd99ab18078b815227caf1e79907eed00a3c36fa49a7388d09f867ac4a838f0e6d93ae1583c750182de7f4587b811f8b3fe31708386a6179e7bda9276ee9f8528b63350ce04ac674a8bec9c654ff9db01c4023b7001863b9e5eaea47fb08f33f95c741dd1684e6c8ca78d53c7f068e0d34071632e08b90f79f48f370baa603a08b8dce071fc9818daec2c655b53c03455ab04779a7c74b79c27c80c1e25d5c4eb38933466fad1cac05b15e6d8546a66aba0c3b10fc355d2894be0a048d3a178251c743a413e5d7f3c274fba27c2f5cfe5dfad19dd2bf57ffd4ead541062c74935ec5a8c5b1c446956dc4065f1acb09f1b07181c32da0c270816625594398209a05925389953c0ebf61830f1a8cd9e3f0d21bb8bb3c494b5e827483a7e3fc70a52189a09455ef4fc0044d127ecb57e7037a9ca8a45cc8d3ad6eb7a08d4a5199879542149c905166568e89856d646a504717b9bafe7aeda4e3bfda39252a6375525ccec04d7ac6468dc61b3eba13ef41fb4faa034e0fd799072f76dd566c5287d204c9625c4709631af31a1c50d959e68d5b8b63e2fa4c41d8b1fb9336f510831258f4c6b177b757f45d96f7569d21058cbdcd63bff2e29903cc3c7274b23c90560b56149fe11e3eba75c001226e638d74f71bc1422efe93f4a1589d46919585df871b36b97086069aab416080ff032b1afcbe9cf692fbcdd6f6d5757df5fd0a21e8a9aaeda48ec78684b90515bfed8e80e76422b1bc8eb4908e88512801c99d753acc96e5ebb51ccf4e22ecf1f83b8211edf0b616a42c36c7dab0df7218701e1ac004e4aa42ac6aa6e5552cee55f4ea01b641eaec8039924c1d069dd0bb955fc15caeebda98490ed1605e5d102db05854a1aea5845fc7d578fe4e9b1b4a64fb3f42e570192168e14c6e7c294e4d45ea65a87df723ef7f3ccbba0dab63aa8a62ab3fdc9ea2c11cab0574e0a351ea2714c372f04203b09918d6c77b1b1017982bdc8ff41fc926cb51d86f45c829dd1abf33599e13327340aacc26225389eb25e3b8208f0526be45603d8097b69ecc80e4e7a51557bbbc5ac8b6fa645f912217c3ef60b656b60a98b0ecc861b2d1ef298338e64714e1626e31cebe0e6ead3f00879166a4ba5da290ac3c4c69f11109dedba6680a273afdc381b4594e59f78b0dd5e175d0e42bed4240876b1146d44f9d116e96d27db03fce6374d02d055110fb62debabc144c9fa350305e5213bee400e2e33e2e311d6593a04e0a6e86e4225c5740a27837dbd8f6c953c2659003f25d645e613d28a3e271d8dc1d65d8bf1e468b6193e229d0cc4780e2b93043cb12b1de396fa6688a28557bca8224d18e0c2c1138e5ef238ca9040efef6f7eef05aa18f3bf0e6c1c68796a096bb6c53257d3594913af7ef9aaa4ea73fdb60b03322bdab82849797929a577b85e34e14b525f179a71802b9aa64c213f8f716bc4fa4ca20101ca8584d68acc4ff60739249e5acaab81dba87241d5cdd15e9a0679a444028c2c07868cdfa69057a7ddc087c0a54a0fdc5854406048a2215f0a40e698d7d274a710e2176d0324e394a3446af64ce1c71b2c37a3a263fe2f3ef9fae6157180cf192d6cdececd6c2a31bdcc713282fcadb25ef2e1158f87b5c08c3de7e1670680d11bfd42c57cb50c8f633bbfcac97753b5f9218ea9fd194f6c422480fb3d90a574394065e9a4c98d97141bfac26e6fcc4c95076f26b03c1dc6a62fe40f61b824408f496d6074d1c1af0b946c72369ebed99f40a28d665b65ad47a9b03d390347a1341f7ab2b6ff7939914ccbf762870ab15a6cdd807e7307c5060f2dc9db1dd85c1b8a1b74911510802a5d960e9d15fbfae7b09b5858000dff29c0544f3d67bf784203d6d3702a45f80c44658148229d1a2dc8b4327cd3c154f6c07ad3c0a0dda5b19da02567afe9f1c4b3c9c4f26e0abcb5a754c1cf83f854afd4ff0fa50f895e215f9bc1d1264c5db1868c9c34efb4c7b9671fbd9694442f83b134d34a5a56b6b51da16c213d32361028fe880411b281200ddc8c70bfa552c4640eae8e6a0a692d29ad5d2ddbbff0f426c4309a267a48ed829ac7f588209eac49ae4490b1d827b007db834d51d715328bda9a0d1c25a9a2424c162772f90de3612f3e3b1ab250c205663600a01aafb51bea4d5d9ce9c39d59f00fa1d3c768b8bde5620f8726a6438999fa357ee77dca04a9e8f707e9659e04a65949acc353060d05b719be7bd89d2afc0552ac84d0a488650b7850e43c4b761eb8b40bff16a3a1fd616a0124cf7a2bf49af87f0d0300102563e5c46833f7d21fc836941ef91f011b77f2f3efc4fa027d57fbe087c25f13b8bf4b4b2ed669af4ed6ea396c60dd3dac645e262d3b7f6b630bd214470e80320d8b88392dca605ca58cf8000e26e598b037d7e4711c66b85ae482e0efc4d9ac3eb8c051f1191f7bafaeaa302986049075d0d3bab0eed07c8b55f2831656a8eccf75f89059d4db5ea437ad5e627a89c078f5240bd81c6e338d4017a531e874a931c0009620211bf516f59f7df73b2eb3399dc1faea1c9068b4bfe9393b1d9e3b846ed27912a493bceca74aef13918f6d0cafaf89e85c05c8dc0d5d5026c838327210bb9b4c94d0219c418b9ed8dc4f17b5ecbf201eb6acd0819e3bf3a8c1fbcf506c87d0280c1918787f18a333e2817266519d3d50bd3ba7504a88b0e94015af0524cd1569ba44e79ab59195c423e0192c4a416a4fb13a07412093327d8872188cdf3d04911d00681e047b59fb063121f364e4d2cd4e1847e18a9ff60ebd7623340d29a5ffae1e48718a04b83c19601857d9a2d60969d3392e5d08713ad9e81f9a41ea1fb755afc508215e9a02ce0d67026420aefb548f8c6dfe3896c5b569963b0c3e042104495d6e5094629680ea4445810dd1b035eb42a98d32d8bf753023cf8c1b0399f0e76d4a8f40236a4af955fc7380d87b50d5871fd8bd269c7e00dd58751ef2ec2f54d143f612d283b9499ac8e131c4eb0d972d4ea31f767a8aed7b0853fb296dee9c21c22d26890f61be81ae7453658c3bfd7a709267da1c40acf002c53eabb86d91363fc3edbace31b2432c3e19935e4ad1d2cdc155fa6f6c3595a5056780307a2cc4cb1a3745bc2eb85360f9676e083c76799b8abd68a905942fe80d135d8d5ce1abb553b441cbe02c06df0c305f53c02c99b6f0030e6d1fc4637c44f13a312ddd140a1e143960f786cbc2a320c388120010251655eb7f340d2506984ecfdf0bff80700e1231c64a099913ed6a12e0140ff1605157d448395999510589c8f4ebf22bd008f91d8323635115eab107ba2ce03d0336ca3864b6102848236f511ba1e06433518639cf1d42c606b95dbf725d56b8ca6e2720c3d3774d66acf5313966e9196224c18d69b491f0c9f658f7a8f3322ca281b4bc37d437c47e4347f4c8c0826f81210716eb3b4dfcb09b25a0b56521a85a9bd467c841759cf0be787ae8f6f912aa7e178fa7e55c622336957063e6748721ab4a12fb26f90e432c4e791d3706d0ad53d5a8422c41b6a7e48c85e679d268df11a8c620f5a8eaede6ee1d9632d575565edc5765ddffd0f17c7dee0af1f5355b390cb02adacf63ae2dd2f37f940ad5d698dad83d9bcd3e6cae13d9e3a6f30c6a859cd936f949b86231a2ea0f8707203b2cbf8ca9a04bc0059ff0cd01726811993280a10f0d23b5a55c65f753f3ccc0e82649f1a9a38775737aab0b3cd678fa44162d432341092222e1e443c9c441ff5d452cf3ca0bbfa733e0f62b9363a1e389b5a69b81be8faab0a1b536b55a152ffb32f6c7f8de9d9591d7c78ec38f639804c04294ef754b0743a4081138e1b9b3b9f850f000f90ece8de3021c58cb062f173c3bac670583cb269d09e1a5b2c756b449a08a666b9497f852fd4e094ff8888e7b84dea928d3799fa85f04de6f9119c9780b2180a9a424d2dc94aa4910c9cac812c3c763778601ab4c0c6b6972726e8a490fceba0de690d69cc37e16448a6ae0c5bbe665f3ea4ec55700d9b0ce6485e25b57e60e8d6be435aa1cd7c6bb10124dc9a1c92f17ec41d19ac333217bd73bf39ea2ead376f466f44778956b96ea731c579f64ab3e262d1066290dee1d24c49e85ae9a7096148abdebfddc8f8cd56d688dbf7ec4727c2f084d578ba1f32572b36cef86f3db765c674115bb86bd8d6c9c241378e830e1845118a565da66c99896f75d878d08d73d8014551aaac8b1e05fa4d3f29e6c5766edc570e8ace197046d35414f6ca7bc9c7d3a5bbccfe7d73d37b272117f12cd7e4e27751899349e6e9fa4fdae779bc93da05bdf87f6e8584639cb62d98005f21035811e94076c8670dfbf46b2c138da3b37847e872ed545a6d3e9274043417d4b32b6afa34e834216d43946a716b78528a3bfe5cae3d5f8d9fac16f5cfda0e376401ee3c57a18631f1f069c47bf38f460101830ee1c75c94833dd8ffd664f8c5f2bf61eef766f2d80ab6122eafa849d8ab43e449094b7f110ad91a81e1e78ab2a0e9e75e30b7c52ffeb6d376db8e82dd155fe8f08e682536cc981a4fffb78e0052b34b56fd4541f0ac70df028795ee6f84883804825f454c328567aa10ac16992828f48fecc35b92a9419d139fba64cffaa8ed0d4c5253bab337b79a34313e3bb58ae1f8df1ac470119742fa769461b61ab64502e0dbcc890bae2864d8cd8098b7eae80113d07d874aaf94547ad7434f4442bda13ea2e696d86215607be4afc940069a88ca96d6d4adf1c330b9f978d3828fc5cf104f02fc5fe108b2f0a47d42a488b59bdb3c6cd65f1e0a09c5ba52d79eeaaff14cc03a0944dca32c3ec1e78d28d035518d755e0c364f7e817402e489e2b24023c182b4ab010fa23bc98a3b8072ec668af244941c0adbfc5b0d0d4e94ed0a3f20132346ea3804e8331e09ad04930f522df720ae314fe4cd8909161be02d27709ec8b5db635a5d9c16b1687bc497489612f74669cb85f3672bb8b04a0b5c158b5bcde355bc33b7f0930fcbb534974da38436d8950694e4dbaaee0b023b29e5c4533f9615e1055bc59e35aa348ed0e9c2c2f6cf5431550b5b99eac00f639025e08492158aaa469dc12f7583139b3efe72e263b9b59109e8bb971332e0d95d5738ab66ef2059effe2ab7471a30e4fca1e5aebd47629aeec0613ad3185702823e6c344b4f3709f7f068add1e2062e4d22c0eba62c600b9b3207709a6a47e1468844574e5963bda3c6d1a387d8103ff06dd911165e8cbd87292aedc6e0387545550efa37fd89d85c5c9b0a103e35084d16b7855282510c5e61ea8c77e27429f46e2d792bd3c32594b099e00567b1167f237934f5211294204b036a810f179b90a747b2841cda8ae9d187250ec1d948bc5132080ae3c01c17a1eac394e03e4bf9bb34118966ac396831febd8ad09054683acc251bfc8c9f48d4d7c5c7f24aed16b5b04741b38d9960a80677f961f24df8c6bc9b03923fb188d6aa2b0665059658399a913a3bb9646c330de39d4084ab6d848357a400665f1c5c2cb861bd990a1cfa54561bb42cdb809e1d29fbfeb03a175943818d279795cfbb84ea1be79c999ce7792407a38f079224789c58a21d60994517a936049487af1bee759dd2aacbccd2b5f3118e7e62fc71555ee8c40e86fa5f62ca7817a995b351f815ff6e50deda502a0f325c522fe2df586b7b46aa80460ffb056732669bf94c138db34f2bd981d9a36774eb130eb98a97715503df44fa22323209df6d119e72eb3617a096f46e8ee2f253b58fa22c619ac3eaa3669dd956ce7005c300fdb1bbba4c366b458d7344de73d4a0b604381ef1142103c41158249180cd9c0487b57c5abd57a9108e83eb7dc987b2a76e80c10200c6c0ccf41dd5c95728ed9559b6090340aef2134afddb6afb8914533dbe31308494bf3034c52e115674ab46a44293dd711785785ca1e8b8ff2e7a4aa9feea3293b07144cf94d0ee0b2a7952b14eb9e704c89268c21cb7625f8d273276a1c4c12be996fade71246e50e52b06239de97c83c1b5c3f999f893e6c781bed71c4ce4e30f8d5069d2aab6965df0910ff8cc5e68c867348f897ec4473ee0334f2d237fd41c4cfa211ff8988fc3870ed75a185e95266c0d5d008264a077470b008852bc8d2f5aed319014155d46717c0cf4981b14cf28a8eb5327c85f29c5ac866690994da1731b8548d15dd909d7f7784d74020bb12205f1e244e93523671f08a852bd18d343fe26b8debcb377966cda81c467df2382c975fb1d9d7c4982df87ec2e9dd4b4a3083110e79134d07e9294bd5e3c2485a0a647b27e2628863761149e5590d9c879e47726685575ebc068dc9552f0c99fef01aafa6e3539799aeff4f75a3d11b8e6fd3842e2e298bb41c9cf5e7b223af5ad0c716bea0581c1abcf6340ee8436ce541da85de646f25d2d3abcb872a874b6349255d7b517125bd3dd52c098d65ce6ef3077fb2ac9ad52ff5b67e5925fda1090d040b8e909e47117d3921c86e5577d27491860c29b073dc00806d20b1deaad1be45e021858f103ba2bc164ef12e162b7dc8d608a62f5067d69fbb988301aeb1302155200f44845688a42f3a160d790486ac3c41915e8160345daa382cb10e82eb0ac2c08df23d065210c9cfaf5dc03e18f6ac76181523ab409c30c6c169c537a502d3567b4899fde39b1b12889ef280028f9df9d66766efea3e229aaf37d57e36a626a0e90bbd881caefbfb370d58274fed6aa3ff491b07aaf95fb89588464ffb583148b3411281fa26c3674f00eaeb39fec7d934f2ce9a8c6cb70c48f892c2a8508e6556d877f8cca9f04f8cc482d5ab9376fcbe0fcce3276a17f68299e59742d0d441c82bfcf0389e773f8a4fd9eee6ac16f1a950c9ef90a02d2c38f529c27e20cbb0cc5660f3859d79b88b4668a4e34bfe3581e28cadb94131a469c4889e16154b913b2d8f5fda7517f2e83a9ec0f630487e065d6209521ba0ec10bc767c89344f6e29bec582103e0782efb2872d3878be70cd2152247cff516068272ad4bc677d65b7e40949bc01f954e057831dee2eb299ee7c4f258429738bcf0d14a3a982cc7f92ab94c5618325f8ddf381f01a2df4aa3b33119abf40ece629633827c73c0af000d4dd4db77a868b33b4c6740eebb5a65f14cef9f45e652ad60947c1847c6345157c3dd87ce04966e6c5c0c74c2197e8720ea380b3554d78c0f27e220ea0c13389d4e25bf49b570a6661c2b5a619282c502040612c9f1644315c8e077726c22cde6c46d2511b71d3a28faa0a590290f146a8ec32b16e8f08655527ff99ce9edd90757755121291b6e384e6c64401000844e5863576e599d3a9ab5fb8ab546bf9642df8399b8658a0a5a15e9433823c6b1f868fba0ab1c0c84b7cd414d3deca94058d70299ce817ef063159b0648c259f5c592cfd1a0e9ee6b099ad227d0de7662f4275f2615424080eb9798ef6b02275ff9b34c8a0e810bc670ea6f450f6998b3d5ce29cad9d2b405c425852988b24147cd61e6b7ad3b0d12d2669255ad322db550cdc18d5b156650cc9754d07a219d8491d56cd66dddf60b9553a0c3d2b1da3fd0583ab7d30f286b2ea0828b21dde136c6b39e3b2e35c80013fad60a99ffc32d2e4081a8555e78a0eb75032fd1b1f8ba67e4c673e1f0b3056a3bb05d2be41e61fc79c159968f5ccf4046df5bfa0a0beb031ee708b400a92b28fe7a6a6eaad1e4d19aaa8ddc22e1edfbc2e175f6a35a76ed8533a13d6429e4d3b77ecd6c62f41cd612b7ac20d5cd4707a46c7f95822e8ab35c1fbbcc052f46286ce76f6e2d06439585f761eca9bde03d6d6a58b65826c936bb4ad477cfbc0e2afcc06253f5aec4901510c5dd59cca000e00bd1e3ad82d6adfc06f65bc81e8a3bb6935074e9a13434c6bef0d6ca99d1ae14525f5ca424c98e0b7e401d6184607d3d9a00ae09ce4a1c5151ce45114e22f08292694a47b2c5d328e1515209ae8d733861791981bb269b780a8897800a21450902d049404be22dad76d7792944c0fd399f9c0713774ba3e87c401e68cb8c05422069b88282b3f40cf49f9ad69019b4586d818e042d2053b4e62c4bb56f07963d86a4a1ab5c6f61c745bfe7c1d0a7958037bccb877c9346035a59eed09a9b161ee51090807031c45f78410665fa7a8ee0449502a66808b32cffb8d8b61eac88294d41bc907764a48d7483a52cccf05fee503df9940454e0ad74ce508696c24265af522d577d43b6ec123a1c69dc952ed15d4b7b8886e61c4f0c2e37c6cad7aab0864c7cc8fbf5795a6b414a12e4893bf7bf12ceb420e59c5c30134ebc15c0767dff33a8ac86a7c4bcf4218e13fca3187c257e66246ea12e60a243ec7cdee7a08c50083df43228be7674dadb1ff266bf175b0282ff682eb4a2bbf6d11e2d5be1619ca7395ee9d1cc457f3eae3ece5db805e914a25ad4eb05902be0216785fc70de1923500dd7281dabfeb0f6b0dfb9bf2cdbb347c9f55e3342e68be9dc70c29b5415654c90e7cb59895256034485c95fedcb8a4dcaabe8ced7bf241fcdec3279758a71574931d37c9013c9e9946c5dfe1f6a841334f9286a641c2ce6166adc448091b1e229943d85ac715b6a148187515aaa6dcdaa58e8c7d11a44bda5091d6b7d2febe0a0384428810ebfc25e284a63acedb095ab05deb15c0bfdb75c3aebecddba7e76d9cbbbc4813a3919bf6a29da5c8b024c82dd98006f03765779fbf00fecae13f5c5e1ca7cf6c38fd4339d28afa17bca45732af9a5752b32ba1c76fb9d77d929cfce5cf8676138859825a01b437dac1834e0f47450c47722e80373dd5a521232218b43ccc4298858ba73c815834bcab5efb4284a437ba20683db3e89caa59d7051028ba70666340e7056c51d97090ca80526c48761755e11332c00b3d1346ea469fac38f980db6fc2e3cfa070978d3d9892ff074b001c35f74f4cc83d30710986c13000dc490e188844826f131adbbd44c487660f7e364655a377707b57e2eb7aa86273ee6752e8c7e4102901b7b0de876f00dc276d8eb4c9cfa4426b61491a2fecbc98226e8698df076c2de9a3db82f9af50da6a79fa8e72715d7a04d296a600f8159c6783c9e255a331a6818ca0f4e170faad8bbb1ecd28dfb91d011533b65ec0b725cfd7502e07f7cd57d7f9f7253dc856bedd433e102080dbb65d070008dad922cefc18ccf91489b76af8f68740e08083b3a81575a59d039899b6c9e6066591c64b41908154bf97e5d1ad09d6abae955b1edc1d5340227c087d7e2ef9235e2346ff2cddc479c00ec1d84a5c6e41ae1d2fbd60c1651c63fc0076a0137c172137ba6a7c2a0d237066c2adc9b83d2969d2795223e05aea2926bfcd8cd4f8371b80b28f3007767d009a8bc9061aa9a026137f101167f04b701fc8465ad19dd4cc230a7bf834e71ca77fa0097c87757f195ee500810879b8fe62af5531dbd57549f2b1fe82ec5a48cee212abf0ff0d715cea818aa3aba47859f0f95294f7482ca20413a5d4f8ceeae14e4fbfd75a4aa6ab73536ebb2b10619b428b0252ca2f74911e595477aef0c067f6d0b2ba16712509cce62d20a3c890a1bb3e7df5969a2167cb33f7e1ad36013a7bc3f10b174cf93bd0e5db4daf6b22ea57089d0eab3a06982e8ea864d0caeb61291a19336f99f8929f1869aea8dc5543f39e51efe2b2d006c1a016eb81693b0a25a359a3358288fd6193ef3f514cb6a803afc2b01eff2d9a9112fb5eb38c30ea842e97a69748d9a9ae54189235f3e11d0e501db68d2cb7d04f2e25e8575f5fba9e9c9c320df12a0f52188b12885c031e245bb501afaa84d1cc3e30da13e128015662419515f4229aaa7f6551449fcd1c7f63120e3a7ac0a27f384c26a88099ab5f0716a75b6a4d25beaab2a861d2e132b59ad1ab4bc05098a8b7609ce3fb32d95e4aa40aa92868553394c51de9c7c0c4a145e3253d7f5f916a500b525b0c9d783a10b73b23b0a986dbaa26476ace67d84084ee87522933715b1c3afee05397e96c1591a382607e70652aa2baf824c38818173e0161732a6936f19ab9b76926335bb8ac0e1e78f0cd8c94923f80b9da82c864236cce0a015350695c2c5dab638f144c9cb85dd3e7461574e55b464bfd4abbacf06bd0c65084f4d273601156f08a3de44351d4a8fec75d011692cf90f33194ae772b281e8a1ff5ed7c47a9303480f90938311c71e6b681a7e06cde7c0a5b508659e52138ee0efb2745f90e739d1801d702a0116860f3ef9451a9fc486c0a3d23bd7f6032b393e4966d50b472813032061d296802969c474056c75669926e69e66140ed322a0a305a27adb0416e60383a9d88cc855aef192b5e197e08cffb1109893f10007fb581dda565e34e385080ab8129acae0318a7970fdb00a3036e3dbf60a2e8836c0c384fea2cf79c3330e5c49121ed366bc2bd3135db850602a1739952b3b370e6b4af0ec93c159170c74f8636bf3c7c0d55b81c702e7b67f8ad25b31c3ea9f51ce1fac7fbd57548f1d34e2a7cea15e228d9de771415cc0e4d817b146b82fe0c02e11e58d62d852ac7f176f49c9e5a17c2b0fa51fd0ca787c82f62656c13f7f76ea2b0d25e4081f04b35b58d274ebc414eb1b0a75e1a7b62c0c898709a3f6f0091d57d6fac5350cd465b7a170cc5d9ab7e2e1f2d58cebbb8a4963e0b259b03446a579815aa7c34fbb7a0654a0aa701353c7b462186c810495904604ba3d5bd14791caaa3672ffc86eeb8cbff93ff907280e702fdd53e66f01e87229faf9639d72f92c1a37485296456f6bdb282956ddcedef14b28f2289e6dadd612106f054a986edb1b109f0c4c5d8e31e73d05ac8f7c24ab61bdc1ffccff67a3a48d72256cf51a77d03f1916728102649a6897fdf03dac3d345871ae307e3e738e42e4854a6c4b515a70dcde17533b5779c9595dafa0a630f8ab68a55a0e655da00e5b66281b3b2e070b3604384dbf5732556127127e14ab5253491600f907ed5c4df4a223cc4f3b7262700a76456245a8891bbeef7a441ec891194c6d28b23d3a7aa98a441f43e05a4a219784952ee534ff831d3fe899f2835e170352845a01748e4346a1c8349e14c0de11344c1a04d17d6eb2da16cb5a5954b1eb73f3f821cc32429006e4f3f0324a2101993f5d8719504e3a7458917f6741c22bf49b6845729bc803dca049cf048466a8abdb6479be70d23b7d206b4ea820cf2dacc990a4449fbc2bad9cd8b3923a76d159a1567d862a200587ef134a87f552f2c2406e280edea86640f56a860e4a8f3a55157cb81eab2000f2603e0fdb9b1dcb4d2f52dd5169d3fc308a4d08188f00ff8d42553ab2041514ed608eb9a7a035ddcc10530187f46ef5080703e97c575956595ce53a45ad52bd179d31597b3fc05f1553cd658b74a04feba2283177f4fcf4da9b0530bf33e387af92774edd7d03d6e5cea9cd182838471837571279a629257011694eb40ef22feb400ceb45940da635ab83981048a90b405d00198bfe8f3c32d5d4386a0988c8c368c41a5ff271f1d536ef4dc4de0e3531708d22c3580bd06c771f62bb1ded8293f85428636f0df6db16ad0d26afc6417fed7dad3a494d4c3d16615ac6f9291d5aefe7191196902038b730bb429011ac7acbf19d5ea69155f387d65b8033d88db8d643bd6202b7edc56a97349770dbce7c5356bc50db1e8a24992704cdd9de4ea4d772fd481a23386823c8895c12708a87170ea1525b2259315b996a054768b02c376f849a1cb5d8b650c0ce91c8975a30655dbda9ce34854808744b7cb484b8febada4fb1ea97c00f55e5f202b182852571eb1ea083cb669502c0d70fd776147802b16f7e07f1706ae0017b0fdf2014d9d4dea16dd3afc1a7826c9b168d09eadef5d53651b61ceb3412cc96c200c5b7fa1355d991941a982d9a41d80da2e7355d3fde36634051adadbe345ba6a86085bc77655f1c0c481d0494c55e59a47c65c1c87b9970858fb89cccd65a91645ef61d10654bde18a1c2eb7441bd6a730772162e5e5721dfeb56a9932187e6b528fc741fd051e2c4b14a35aa2cd55013d006de0eee5d1246d7432448f2d2e88a847bf96b73ed586ac02efa946538265cf7fba26f957a6043c195901fbad6bc93d12e8d9b8aed3c1898c439aeecc057974285f89e8a7fc0d25ce04aa2df73eab81cef48fa787740e4fed0a6e6e7972b8c3aabe2e8d1dd0a8a9654b4ecc6fcfcf83b18ef9b29b5714a36a374950a29e758e0a7d288aa1eadbb9eb4c88382818d800145fd691e4e1bb084d1e881c8f0076f45e3a8bf52ed2df19348dacf6367ee2ca9bf346f6d597006756fdbff7958a32ce54ff719560864820413a6de2bea74b3a0945c412a3fa72c3c199aa31992723bd7f8a5d13aa05337abe83daac980c1f76b969c9ff8482cb5f45681be48f9355c6fcf357f80460615f59687aa105bc3e071d3519940a6a8d8cbc94a1559fb186b9f0398ef17720c816ec5cd7e6f07faf35384a92368f1a4b8417a3870e506cf37c6dd54f976eb4c1c85632e41e6210d1000843252d28b8e33f6d6875d7391a70dcf6ce0937699b2df7a048e3c705c8a9b999936243a881ec54974f3e7a4d763ba46409658448185c859b08ce9954122abe2e73d88a0388219003372c14647bbb36c5d089164e506b0c2d6a31cc0c09b520f42ca36eccce8fbae6a35a01cb151f43f775ce5cce6ff7ae3a124b078a0642c10bc03c227859b7fb8b866ad16ca51e9d4d866c755116eacb2e1815ace285e78bc9fa182afbb79ba24032310c370f282acf064dd4428199479df3b1e0bd6964883ef06870837d19b9d0f91169cb644d4b7b1ca2d2250af07e00027511111a865172705c76c954c14baf011782fbe5a4961b0d2fcd1d477842160fc3017e42442f4a31d5e14421dfaf77bb619ca98b7267622e63c0e9abf2491f6aadfd1b199ab4b8c9223684d5066fc0969659f9a377421946c21eba5fb9ca1949a5092afae0ba9280d454aa0a71e2a17ac9f55ae682f1d5f404cc61d6169892552f38052e6e2442541892daa2255f59d2453fba8a4a83a21d46853e0c25860b91417c069a123504d45ad7554fd1db078aac2957698816c4dd65cb7ad7c9cf75aefaae63da64c4a99962dddfa1cfd51c158421c4db788338469d413bc25ed24f27670310002c312e240b96fde34c5a23a7e13564a19938e84114a3223f0c79203526d2b2191bf43388341be39bbdbba90593d9af08870765b2d4889f72a0dbc4ceb4ed7db1214e354b6ea1320728b1711a4f914fb5907c5c4572b7a9a5a12161924b1ce607d9aa5162f53973c790f6cde621e7dce3520907705c75da04ea5cc3634d74d92bc00606a1a2107522f9e842a27a74722e1be82d13f64d205791b4e08f4e2450ab5a0741b226c4387c889a14942a9c07e341fd2ab0bdb3cc7c1492b3b6004b53a575a889cfbd1bc98feb81c05e7f6a94f395af18c64a7761288eed0dd44a725a28a2805ec3e543eec3a2b3831975f804882a443553d12d6c2360e0634dce42582a64780accf1e7ed3424d93a7db429ac1f09d8aebd38bd38e9021055743940f44ced9293d7969f9b726c602c39a8006fe626447a6becb3f4074f5b98b3f33938008c307d8ad93a3ed216ea5bd2a978c7a82d0fb80227532cfd5e6fc097ae402b3505365c6fce9d6dbe227f37d83123ddd2ba2db5de37c6967c6ef618287ac0037a885534dc082b79e1821c1ea1fdb60f0ddebd450605bcba7d3d9c5817a4efc38f004a54f5d744b4f034ab29556fb6f344f8d30ddd1531a45ee23fd361d4846224d2f188b5a95ea206a4d4597dcbb28add904ca7b42a7b34c9b4baa94f9100ab52f87d2a9ba7da01d0efdaf4faca6efe187085e7b806d92ca4f076b42bf519b023854ec1bac6c6beee63578ea212e58cd4edf9bb8875cace982baf97b06133acac6779fd9e8c467d485268c488c4da39437661776e0b687c209b16c0b6d27696bf72a5f59a772d293ab2afd5522600071812f6a7e713a87c6c86b9e723bd8bb99492e026d1b5e64e1375ec527d77ad4f4f0a326ffd5b8ef48ff1f73928435c2edd9c48c40bd6d279f560ef2ad7d33b428fd76d516b3ef494a763d96f0e7768a9fe91eb106111966a96534acd0858e20c077ba7e220b4106510a01a347983ce95b6fd14b4f84bdc5c05da47bfe99a17fc2fab1444599f14c4d3a8930a2a52884f3452907e9895fa2d2be71c587bd271500ffaebc4c1f846c498e1004445dd53c58b5d11ccca36c4b772c066044cdcea882b5b34bf02a306922fe0471348919bffeccbd208f22b645cf934e039b17a5d2ec659ab1a0ccc0349ab9a87df7f561914e329ddcf26091b751abfb554787a05063e45cf7e7d7370df488d45fbefcbc975a348a84ae03720182d3c51f9d4b61d9a8572c9272f45a99c8b150400b21d56b7996ed81dc3f59b994d94241f2890d77e25207ba00063e33c033d620846c407e7550ab4dc2e0d28832823f4082e74ffab763652561c9a3bc835254cc051b2f472decc8b70ac07f3abe58ca19cd803e807db21bc563a8032c8c381076ae5fb8e3b392bd6ef94e5fc2c212d0f6e47fd29ddb57e06d32ac865b7f26e3a15400cf1a9992d0b54ba3648280d138788948244e4242aa0da628150615c14dad84610452a66d6800f8fcd4c5cec7bead5a258bf271bb6a9622334f1291d62570c48e6692067e57fe2b4de718986367e0a123f09da7a82bd7a9d5a26265abbd4225b2a30037eca48727a1a41d7916f65988e06d0fbf6704b55dd54a9e870394459d593306709589a371520ae8d4373c31774217f02f07867d13633b8c622451fa44c7f1126797b2139259d310bf7f0914ef5e8ccbb4a7e2bb89990102c9b3e792b77ee819810f1a72c86bbe3c7485bdf90874a824d75b80f824c3ce94e8575da00b91785f94e0b616bfa38e8a8d23db32fc6d19451db8016e30dccca87451186efac59a111b6f253774794661b5f0be6c324b6807e19663859b69b8690a3dd6858906f9fd727ba44af3c7d058534dfada29b7d07344aa0b719542c64788b4d03d6d8eac89f9eb13167c310a6329005ef7058b3fdc4aaa40fdc1bedefbc4adb367dffa8b3ffcd08ab26ad2d4a70452d06f7bf507d3612c5101b5778e87165acf6be13ad6f94f67a58d61dae9ff8c623e08624cc94eff6e2f682689e99b012399a7687ad9df224aa9608a69ebed5588ef9777f7a79215e386436af789fe39fb2b4ddf5693b396279b2c8bf2d5a6d08975134d902843530f1e0616966950edfc594678068c99dee3154522b17ccf275c874526d42738f3f40951c0b89a2402c4769f8d51e11049ae0cec1574b01cf2799c293ffb88ae8a9537621b94afc9d7fa721a96f2b5963f7398872001cba286a79546cba942e5cf96ed5917d5e893857194ce0fe87603b5a1ae849623386a2d47df41b4fc94d8ba5781ff7e517a7c652f6ff49be47570c93ef9eaf3f29675e3f882dc07d80bbcac540cda7e140d7cb3915198e044299b461c5204a13d28e057c1b9e64177e8e7ecbf01cb09cb95ac87bd94a8bbe4a06c1d001718bc6b7a25cf9054bd3c46b256be3bf287ab003d4692feea6795223e942ed648d70f3636c9b0a273aae869fe327d7afce2162a7e5517eb35d023fc31144eff9d47d7334b8ac407fa970ec9928f80708050a2ba944202e1d3a02c0e4207a7712e2398f72a157a845c15c1cfe9e6f3ba64502827a3c3066bd9c7889b129f974b3614009a149c4d9b8d90d539d4159183f5093acc7da8b856c9b93069a90701961648fa960c858c2578a64eae42b392bc90b49e4d4de03e38e07889c461ceacb0ad5f2b099da361e54dad0bd4a85d09f43407bb9c4078629eb659b9b2747dbb766d98bed2114c19ba341048825996393b79d994e79182009d466f65504284233b8d7f381c097cbd203e115308af85346ef900aee18bfb9f11f667c0b413f8985df0fa5780af5e3aedebcd2ce9fbc046ef4dd684583f2426673c78ef645bb52034721a79c254af05ab7dfe914140301a5f108e933751998302ee51a5f1cb9f9ae4c8d18e1043bb5e2c8c48a8669456458e42d8509f3c268f356f2decd35c63b2c190840eaddcc21d4f20cf1b78aa12278e23d1cd528055a0acff56342c34b09078f50c4d1f8390aa5853fd7a84077dd7e3cad2ee613f1a18586f873f685d4c3e9081203fe1740335a493971433ad4245d6c9faca6af642d8b250fa20176bd9eec5354a245dec560fecb4a7b13a2c0760dd70369192e4aab372ba7135bdd9b6b6ec31440ef82b13694bc7144eee1cd3bb2950ebb75e2ab65455b8ef8e55251c2a74a7364b1c410da06c2542f67be2d05ab2968ac084c0e47b34d88fbeef2e5a2f2f020aa5205279e40f31f907e9ed2876ba1d55c637d8d2eacc33bb57d3d71755a0f112ff10054e8272a80125b8b7e4f1c84c43d4cc6bf61c1a8bbea899d211a6f2bc0982e9a5f4eb941cda4324cc4f635e9bacc8c8fd93c20c20d99d290b8e621905ce5ecdec3c4897a810e4930db91a229da7add5406d3d9a8ba9d5de1890df93f0009eae44a90057efd251e2d50da34aa66418a882729df7dc02c0202486749af89dd5b3a4998851752e7ed715dadd16cb38ab181a921b7a66e2d29878c90983b8e3a40a14d2cfe9cfb670cd0be637c7347e2fb2b0cb79fec4919c17b44b74d9345eb5d4e7b819e5215d253bc7db85cf8085a4e6208cbcecc485dcbfe7d198bbd844b6bf989dc8dc2d43049d6b48df71795845661152b7d2202f91762e2fcf4bd45a265502c290685aba79e1bf50df631a9e29ece184cd47fa14ca960c9c2902696931d803163837ac0ccd1ea7096fc247bbeb2633002a8572e09d510f7015d23c7f660ba961c5f08edb75a3e46d18d453f6a09fb30f83f5fc3d1d54b332b5ae0c2c6cec6ab40a83ec693521fa02d4c123d8adee50c3a3e59d705ad8f31b8f3d4633b300a38c04a03548ad4151fcaf967c2165a403f810517c0b07c453cc10ce34f8616b20b991f4c5366aa3430c06c84e25bed95e607b3de4c045310c7a21c5f887e0d5d2066974f8408e71f8f2b55415cfa19e3243e1a9f36bd8f1c8c94535a2f212f3e701f0446bc012d393b602c393ed1c9b084d550c36a25fa3eeea947908fc6a1e30ba6e0c615c87a827b6cedf1e22c975f70bdbee48091916949077c7ddafe11ec5f17ed346a45770998461206ae04705fcde04165178a751989aefc29c0305c4dc70a8839ebb01f2d12b127ee37fb5b43426ea968cde536af9c02e54d39967b49b933451ccc921bc9188663f0c592e49d823471d4086ea7dd08af111c8cc98070945c04a8e3233c687676e38d2cc58fea116aa2b7e6dc0e2ef217e017711d4b13928c788fd178bda07b1737f87de33cc117ad4fd15bd0973d4fe883df77ddab6276210a01ba404034a4152745c3050329b0e5a34e10b1813ae1ad97f5d773061fed72c32a3dda6ffbbef0a42a6869be9bc38715ed9aee47b3ad37dbf0e56610844350015ca0960312c5914054bc78184e02f52c8b21651cb5eb95fec108cb2d1daeeb6a59432a524650d070f07bd07bce3455cb173a7016344bd5e5c13a37785dc4ccacece73ce39e7e4e9bdd109a5882b6ae5ade7c74cc89c7388132a4eccae01430c4aca0b47067072a5a5eb17358e08888c2cb5156c0d002387172819ccd112320dd80194206aab0664319ab568dd121cafc0bbb9f1230cfd629bee3b4d14f6450d8e40edb0c34b061e5ec10e3da1b66ee9b46ec05e8cd0066a55aa4537ef80b5880e31348794b0d4839290a51c64b9a10890ad597010a0a00ccc208acb1fc3622692aab85d8b756394242951928ee892981c83169f505554e19a68a5015538b11066e639416f16f88fdba0f31d5a54ba4195cbdf0d2be2668ee172ed201a509092174997bffb7570f3a41e25498555e5ee76e29a78c562f1a2b2b086b82636e08bb0521ac58184a6502498b0d3ce46afd70b062849bce068559a22cb65a21b19a733d2fd050f5bcf9f147bf7ecf57a15611e9addaf55d66e54aac193ac4d214f322094189941090a46a84049a6421897bb9bde7082288a84c080e50712941a9ec0804642fb0fd064f1c591f14317ac5c7e9b968c1ba1f410ab7165a349f9434aaa3fc7963ff539f85329a1d53348239f27f5fd44262975b8d58a0e36090cc4ec1573cca33c4c8b3864e6522f525a71f9fa9267e69f9e2ea5efe2198b69d3653220c758208d2ff5331ff7dbd73dc7e8c75446f2a99f38266b12944d32dad26dbf7bc5750e4dfd14070a81342fb4aa954bc9289f2017e1903e33118ec9a8285f35d0909219636d8dd5b71c33834343aa4ffd50f71c7f9187e90ceae0cf0aa4f1b70dd2b87da0d4db871981431d2f787c846394d21920f54fe6cacf53bffa1cdcb77c34fe1f8d833422ac5ec6e76879d6af5e868c6ff958bda271000d8fcbb765e6571fcd64b5bc8c8f6672385e8c4c9a9169611241ce624029a3efdf76e5e715fd587d0522cf0aecd1a3e5552bb0c7eabb8faa1ffb15883c16eca1040604e27efb1eaa4fedb07f30577eb6e847ea73b4ac5e880385f8579f4bc6521f15a33256a9e417c3d88869f453b4a3328ef14b16e9d8d139bdd1640d1544d933e79472cefff83987524a17c37379b31baeabe5c56f234b56899d1e0ed9bbbbbb63ecf189b1d5a3e3139b88e1e28491fd412ec92a9226e5c74fce386492335983810bbaed38fcb9c2cb71c6186d5c06bdb3315e8dea373e05638cef81f046961269e0c9c7c28bd15a168b3dc638eef39863bcd8751cc68e63dcdd06b25be2a00a9513eb328b156ff841af89d9926803065ef8565a38ae6fddf86b23ca6e2a9e8b75230ea7c98375625b609ba0314a830d6b63f82d1b1b9b0ba589107cc36a052fd278878e588302414bd95866415cd73bc170853dc2933c78f12b161f78cbad72f49b71595786cf5c99161eb76bacb1d7c65c8e76f483f95eeee5b68e7edee5521dfd5a2ed7ad2ed775f4535d4ec5ad3afa71377539976ebbf67230f472319d0c37d3c96075342c193468ace6c74a271815e096c6b5eed2594677cac38cbfc335fc31e725fb0db738052d6537962444ab5aea3f707917c3bccbbd7759d5bbbad58bc71c27ea9a26e290bd8843f61847b4b272f93923c671b53822ae8843725d4ed4bae1448ce3453a9f5f4e761c9113f9b7ac5aba7b5685a09a73ced49c3335a7ea73753bcc2ad573aeeabe53a926624655082b1c6ff5def2ae0aa1a59b73ce39e79cefea5e7ee5ef85fc306098ea1c8e08a481f01289fc7651648b03f85a28dd070287717655a0ce12cf15cef93bcc3e3bd51763cd4702449da303f7dda78394d78671dc27edd9cdf9f96d99376711e8bb7a2e5582f726d89bfa164a7d1c6f542a7eef93f146f5a996d59cfcdcf3739facb43945bb8438def84f5508294925c811854432f28a5170ebf34fa77fc3eaa10de354f0abc121b338e47ed072f82d797255bb71005bc330cd39e79473cef920441cde9db3e7a437e68d7833bf5ee1d9232a144fc175d7df8b3cfafcf286fc7ede88836fbcf1b745782ecb4888d86d629a782eafbbf3fb37d0e21a6e1b9d88837eff02e6f7bf7d097831defdb6e1b0fbb75ec00e38e3223c8f55e33964eb35707593326e35f1a6e946e91686485cb4e1b2466e03a48126de0e1e1187fcfe12228e78bbdb45c5b0b8f6e293cbeb78f9180d441c31f5fd3a9d23f3ad63e3ba746ed5a1d5aae40477c0bccc0bcd7ccc0bc13ceca8f3205ae6615e28e6675e48e6613ed28830f3319f63e663c01e4a80626a72c0b0ba46460371d80ff3e9744dffcc4c8f1e31a08bdf7b9807b00658373e9d9655eccba3af0435e05d8d2f7c9b7b6d119e4e68e47585c1cc85ebfa6891f0408837fdaa88a3e5f6330b11077f17b962408838e4b43acd52fac736c9638eb3ed7dd407a2600f250c02d5dfc01ef36b0ffbd487d37cfa42f6eb0bcda7ef8a563ae620b1550eb0d7417fc29b2f447fbe2b5af91cf3697dfb39ea5bfb93feb42dadc49b7e1b799adb3ed52f54df82b43bf280106f1c94350efbed111e73d5e2061b0c3eda601abcf83d351c8e0dc6517dfc30e268e956ffabefb7c10f3e87ac0a510aec08ad3468cce3408fc3fa29d07258b70f76ab8ce230068f7e1df26f1b15ecc08674e300e8dc62c0cd6e5326dbad56d7b45cdcd17d117131171764c8e560b769b6c9abb19ea23a668dbc23d67777cd3e7950ac0fbb8f2c922763cd9e29a4c59a5a4661ecbb69db2b4a66671e138b76bb9f18c77e77df420a8fde686661ada8b0427d549545f1733feb9aeeb61ca5555693966e63e19c18a3bac438118a9425b7ff55e5f675d5596daab57aa5d617e3b8c20a631c974d1daa436247bb72f9b8345a4465a044b408ad42a34c8c23b74babd026fe64f02780dbbeaa4ce20d1dda94f07fde9571edb36e012e8dfb77c6cdb9dfe56ab5bfc332b7bb5c73de3d373bfe52973e7fdd47bbaa49f1a6bf22f1a92efd644bb73fc933bffa225a621c39639c6ec88b573245d122134adfb5ddd9113d839bc438ed5499c40f5a06f1004c228e8c21e53aeb1c5957fa01791e255c552174d63bebb13eeceeb7d6f358acff307c92b6bb6bd3a876a7d1b4d6f358acff30b4d6f358acff9032c128138c32c128138c32c12813ecf6f7ac3ba7cabaa6bfd50ac37f16cbf35e336b3d8fc5fa0fc32aebcee548b793fe54b9d66c446fd73d9be6ed9cc8659332f5ed3e977cd9cf555fddc72e8fc1f82fafb0f9dce7a8f5b9ca8134ddc7b71eab6b86bcfa8a35b2cea14cec5f6d79f93aed4784488b328851dc7e6eeb5a2e106ec7599551260bc4a3293425dac28b55565f114765126f508839d50859d35f9d784db9f5c9ed7eae323b3d59955559955519f70a6db8d98d03a80718837e74f50bde0b948950de41d29974e9f805ca977789a22ead4bbbcfde0a86e76218cc1671c83c7d261271cc3c7dae41e248280ee9537b3b9087c41bfacc420b2ec41b0e8b66aef054cfefdf94fbed8138d56f204df7dbfb50bd05b7ad0381da6b1f443e86c9d0c535c80f8c5c1a79646ecb801c8b377c2b941703320c28a3bada75dfa30363fb50752e86d149bd49572afbe2e1a4aaaaae7409b80c7b014317f0b9ab1f078937f4bd8f85c41bfaab8f53106fe8ab3e1ec22151f7d1cb314c7e608138904b19263fe015540ff0715530f90105c23486d188e06f3f87aa0291a7a565c57d34f519b67d3435166fe8479e0ab5eaa1a47e0fffed2b08c47d8f7e8e9338a4df7dbd146fe8731fc3f8a86be86f96c63ceab13a678602c9530585438a816465de8cc5f4b4b0e9722d16154bbd6229582c45144bc56229a358eac86933a731398de6b426a7d59cf6e434a8cbb0ae8159222fc632faa31009266b6daf30eaa1584f5eedf2ac6916b346de118beb51e7d0a7aee188a39fbfb68842d8b3a23c28a4a7566d0a5b1fb29e3e7948b5cbae969367d40cc93ec5a8a819927d9ad4459f2eff74591dfce7b6b9b8dcb8855782bc2edbd97823fdc64e41b900a1545cba7394214650b27c4b33276719c3eaec27002997931d7d8ebb5ebafc7997f3aecae54fc6e5a68cb3573cfaa6de05595cfe589773da1497bf025c6e0e5dfe685c8e1ab9fcfde56a1297bf19d709282e7f3997db5cd0c2e5efbb5c2a55573cea8d3317fc307f50176a27bf278e5cfafcd1d08fb9db73b61be2f297ba5bb5fe821771387ba2c9f6c5f893712547a34feaab6fc6955cede2d3b8fee3ed91d75f6cf7b3f09ca846e34ed089aec86fa888e38b375dc41c50d6f4f702a0128042f4e0fab7ddb65978fcaeefafdfc79b7e6b83efa7793be785c8e6caed8f4d6bca12a1346501c07585aa5914447a7abb1c0be3c81ddcfee2ba5a7e0d7e37e2b8e0a20d97bfe2bb091bd751bad9c0dcba6d4e764dab0d1079003abff6dbcf25a7f7db00a1d48652fafef4b3815d1bd9dd61ff6c5e1c527aa9fbfbab8ad9440517ea2d1f5e96ce39ab6066669a440ebcdafc03ad6be25dc2c91830a74edd7fbabd69dddd3d5b9dc415d5e50d1d1f7ce8eeee6e6fafb913e19e9e84145c2375bf2c211db9bbbb7777cf9d1e28160a349ee877db4d935169e97e827a9418c9acc0703b3e3e485cac523fb3201a50d053d744cbf5e840c40466654c886c8d490ca68707232649647aa8bdf41c3db9f4e430633203979e244f4cb0b4747777cf0eee09e8567b0f445d132d8d85028c13ebdf46681346993f7cdb3c77772a5d5cb7c18af16c84369ee25a6e8c9244c8dd6e8c9284c8cce1851def367abd5e35f0e0a465f64e8fcf920d4c5ca65d2393480eb080725284c20c61786104832ae69cedafd7eb069ac7b31b3ab11b9788405d7ef7981314da9ab4d7eba584879aa555f2d38d4b32bcf8899999a348819028b0e5880796d082081841c660220adb3014437b77ff98b294430a6240e1e1296609c9d0e5293a18c2658964b15000000c9c099d1bd4106d0e35cdf6f6ee0984b53b3d3e2820754db4fe23e3a1d69f201a50d093a700e5b9c75e2a6dd16ee88861450c2731ae00f911c489d11843ac88b18591a5a1dae54aa94fafb94f9f73523a652da4aa4f9f598f4f0a30f71f19105bdd81825e34f722b2a4eaec308cda7d4e9f73323333f3644ab158669e313354d7444b821fe4f20b511a4d23d165708149111cf8904513465cf8210655b458e143450c706207238a3c010bc3098ffb00041620c068b96c0b92540b5c8b3a10770204918492205a9e4eeb46eb5bdc909620840822c62dbffeacce49001753c862b044162ab0018fff330e2bb9fea115d7df8671bcd5ba4173231426a24b6f84c224e4ba5ab38d099b1ba12cf1bade8d50a480616b08420516ed43dcbd05d7ad9442851b7323142958c4a0242391c4e5ff2697bf35bbfc3b4e2eff8f7c72f975f0ef600e02c213435e40b2028c28537a48526da5468cc2d02285231c825c611e8c383b867c419180e5c5b9b316ca5afb3bfc437bc9c9e3680d83852e45c1a56aad9577b8b556196aadf5052edc5a6da5b5d65a29adb5d65aadfd826c2a750395eb98eda88db0a3b2d0821923642415d9c40f5050069c07db0838c2d93074cc14a0629acae888da511b6107550275797ab70fbdd01af334c390d70c2b1825a4a3ee766ef6e9dd4dfa7243e7c90e9e98b9bdbd9b8d307315676666666666666e9e482d2e37384d6fa2f27688bafdee3d57508790828889119614bc4005213e7dbaaba00b2a62d04553124b8838cda4f4304b5ac910040859136fdaede303a3ddfe391b36673d5284ce305b56475e31b21b78aa276358e994805ce194521842432a09d4914d69e8e84789db9f5a100d28288604085a9584cc59c4466160826d30c42b4f703006143e6776eed07c663d3e4748b77f4ea7deea2e027b4aa2032f9414b1c083143114710484121320ce84b7cfacc747490824cbc213a522a2948a78c1e820489125623a283245871d9fad34a4e9f6cfd9afaebbbb9f6081e176f5eeeeee6e6fdee8a45ba55e10cd59844c871f20294058e082c28fb8c165d299280a44ed32517b7b370745126fafb9cf39fb882532b4caf8cc7a7c5ef074f9dd69b389f6a67553fae354b4d01a0314f444480fdded3d5b0b0fe6890d592eb391d501a55e7bbd5e3330f132e90bd28d4f922c21b5b77733333333b30a94c2a8478acce0edee4db4773733333373f35422c6a5a8a8c9a778f17c663d3e49556eff9c505b77b714b727cd7fe8a07386558b8e2747989a7e20e9563d3e44643dc60ee80adefdfa717bfa8f30acea86ce12a723b4495f33a8f0d2211135271729e77e82684041381c4dda518ef8a2f39ad2f1e4862bb7db040e9538ad3b3eb31e1f2586e60482da27423071fbdd7b6755775e709a3e6b73e200439fb8428bccec74c1102de2d499dc6737749e485912e59309ef9d96cfacc7e78993a7db3f678d524aabb4f213238e886a0b50c85c8801094813123940b1c2ed67b5709b0412980035db7bf2ec21283a5abb69dd5da9bc3ac6757777b7fbf4e9ae6a226e77adbbbb9bb8ddb3bbbbbbdbdb841aa1da6740e91320439466f76c6f5ab70e6621cc2c85081b7030777a9272382189e937106d4d992a3d51653611556dddd0894a4d58894f74ce540afc993f6d69402ea093915eaf570c3f516ec861b6056bec46252866b14b676c842e96a0f243101f8ab48043539352d314b3bd87d2e9519010e18a6a141cb278a1952e2111550312850b4b4934fd8d517288d11f6ab42854aab011b5d90e95146dc9ccfd04aae9a7735ab427de3b33286c6d71f8248b1e56e8a2a9e827088806f4b3d33916fc5961a98b297e268d02b56eb48280669ad4ea1395c6744619c348ca9b08184db5d02dc8b283295598aaa08291104144440dd367dc28450523af4a9bde524aeaa6952ea1cd0fa88398000a2909163216c420460b86a00df1843714a5174c1578c6ea6e01cdaeb4c965f2ce0a53be9882cebeae1a50725003568ef3f8ac2c2c9142a540d3053f5ea00033edd2942297eb07e432b89c5670430d62886a8113370471c5d214a720a09d9e16ad003742f1a288730255d3d151a4e8c0797beaee21ae0c8165882c440c11318488223a7d84e9308eda16932a97df9d2b1f5d661d3b46a88da0a373b60dd4d135f2a9cc0b5268d0e13174ee2d9f598f4f931e9a2c6992d464a909134daa34b1d2c4c9670eabe1048abb0d1c53a519d744264bf39a58b57f0aa1b8262a45316521880926a850810a2434a880053f2cf1c9838c199d40a942bb14460151a844a93991e14f5e4d5edb67d6e3139d2081a476a9cb44415244676de5f58799974ca63f5e394cdfa94c790b3a2533c3b82612c56646acd9d1872bc8306d3182b5a27ef1031df100f2a33061494db644d4ea0a1608f25a32848b283568c1c347a4a870d989142197778cf003e43b93eea0cd6a92c5254cb91280256eb6530e959999af245de62b5e70b92b4dc08d2c9838d9e0c8f4c0064438bd6c8d1642cc2006a71a6ad87305c90a1d9c60b09f164a646044189c00a08e6a53b06c01b8b1050e5558b1a2ce5c610115504eb8c8dcf082035dc860062c88d201871d6c98020c29a9989ddac34591295260834db5745a37b4a8c18a113ab7ee1db0d639b7a0210648b381762c182dd36299e1d6ba2445d2ad1368078a1558e84e1655c6706b5d8ac2895b69e4126a2b7c142986ac414a229ecb932946baf5e3b51ea3506b65d547726b57e79ccec2611d52fdeaf92ba17bfaacb2297b55d1e94541f9c4617dee536f81f0a0eacba7ca7d6a49bca9dd150eeb772ddfc1220efb55f575fbbafa2a6b1c5aae314eed56ef550fe481342e402b90c645f5de7ba050d7577d32aa6beaaf9ae6d7afd6561672eb5728af0594501cd6ef40f9545fa5fa1cab57a95ec87f355542fd2a39b347f46554add4be78a0becee975559f92ceea5c882af3e4d777213cf936461a33988606a594d6a094d2a842882fa77811ac414363064bc64c0d069953520040386e8b39d32c64cb3ce2c58f4c133f5e1b2b98f73782ae9f1b5f469062f1d8639cf821f0712318828e89381a3c61c6b5208f09ea10c45f05db35ec3389c7b6735cace76620ddbded7ca4d4990c6e3378d76b2f7ad183a1159f9f23d8e2ec112fbe3f833227b2964adc964ec82828b7f1b6b90c351f9236e7cea33bd30025738ecd342cdff0f71ba91cbcf852709cab4b01b93edc7ba4dedf47f52812585c976520b673224fa511c1e5530ff442532fe4df813952dfa010f7292ebcef7aeb0b3948b3fa548eed8538fbfd5b7dafdfb2bd742e2d2a1afb40fea907eae756bf7df7f613c13f05a6521b48337f7b9ad5c37ce471f997cfe1f22fdc6fffc2bd7ce411dade05a459810ee0ab7a978f3c912715c6554517d5e7c59bfa15ca9bb57c1ebdab8f935dcbd739fdb8f6ab77f58095ad32a97ef771df774dfdd4b7859289c3fa1694330eebd7a734cc6e7d4963b740a05001636bf79fa61fb48982a8f8671644030ac2016c0619cccccc5c6366284d2869a7f1dc002984279a9258c25aa1ee48d7bdb7ee54ae3fc7a5dcc720e2ba6a6623b4b9b9224b7d1b49a0b6221c0e286c33dc086dfc0d1d10b6d60d2a32505181bec0e6d54df1663e1777d84970dbddbd5afa5d67fb90cd74771b980d2c89e3b839674d148ee7d6baed3c7879f0b2fe1f55d552770f5ed703a4bbc31c9d5f6bc4f0e0e5c1ab082ae2d449ab7d6e66ee6ef72ffc3a2f26c6a61ae9e863f8e828e6fb09e2d03ecf1864d956e44120ded89f793e6a49398921307379177f3fc7df2725c8491cce6c0e833c03258f7d3efa1889432ffa034d70e6fd81be6b66644a06f7c0a14db15e0653c431e3edb31211078db7cf53240e1b71689f4b819c146feccf2ff2708c44bcb14f3f4e22ded897f9b849bcb15f7be95a66126fac2cded899ef97c1b37d96314e77ad6d6bad8de2da21d8b5562582f7343e5622ded8e7de07cffc68ea7ca0edc11e4a2a08e43d07f6e0de037bccdf401f3c6c34e5dab74d5c6bbf7867cca8501e0b64240eedcb00f928e6da972b90a65a90a66eef8142de6f1eb8813a5d635fc841ff1cdbbfbcbf10cc6f395ce8e51d8c3c332190b7fbfeba996799d7a04bcafc0ecfccd8174f026acf1449c5a018f04726c54120e2b01231b42e6f5fa773ecdb8fad63a3fc20da77710199294585d7ea9cf9f6c3cee1de3e573b1927d9ce19a704f926d85b8209deede74fe21acb47c41bfbfc31937800fb9c94599995321799fc8002e91787f6ed14af53f3559f63be8afa6ffeab07f25fbd7f0c08b47d0feeb7eda389f918d0017c9929ded88f5d13792a944c9dc2eb5fbd3fd0ea1deca124e67b4c9066f5312090f73d3890a6823ce43dc1a3e9603ec7f630dc0bcddf3e07f72fa0d073ef7523b87c7c8543fba9afb1c41bfbdec7b2aeb1dff2f1ea8bf669ccdbc1a1b54f69f0a47d56e77020cfdeb28c431b2f0f79ebcfb76ced06c53ee4363389ae3f17376e7321c6eeafe563c71d4be9799fcbcb9727ba5e3fbef1e3dbd27b39846b3c268fe217af1ce21ce5e42b55db6f2d782ee9abf7d4fb47d0258964116974fda7ca32bf3c80c695a0ad81d72f8770e849184c0b8fbfae38cb4d971809639c79fde5102cd75fcae412e7ccd46491153fbaee32e93a4f6ab33f8ce3721d8ce3ea801847eec0bf704b81e9bfe26c807825f84c8125db95bc9cc749fb2e5bdff5deb532aee57e87af2dc0b534aefd6b675c9b736dfdbe6b39996bbb6b5faea5d9b6af1fcdf6313755bfd4b5db6faceb35ae7fc7621cfbdbadb1d5addabbd56fc6e5d8ae4cf844f0a9ae4d7d4e020b9e7c57f41f119e22ed5d5b7f2be290411e0131470a913533ae4bc2581be892355c7f97cb75b5ae5bd025614855180c2661f1c6dfb97f12752f3facf53c162bc610f8709b0ec80f39f4f76d3e8f1ab7f86df4e7d36ddbbe9d8ee057f039a4519e3f0de5c7438227f4dd21011f36ae08f238a1ef8eede78750ffdb647fe49af82c63b4d1d49d8e9020393a32323252a28812464a1829115322d6b28d60c6b0bd5f7247f667f6e1522a71d1869c52728e0dd7707f583de684be73be8c1fb4fc7c8f38dccfb7b18b39f4a7cb3c7f808dcb735f093ce418f7e54db037e6753ac7876906c17c3ad05f7d3a46e01afe160cc41bfe0bc403f0c77c27d8fb024e80df27285e550674a81cc0f7050c6a527d4af54955089db45615c26a45adb5bd6d758bd936be2df4e58700a0dee5d361c87b20cfe3814ae6a75a542d60e470f5295508ab954da578c8ab0305fde5c9e738da2c23e7dcdc561cbd51a6c0c8e1f6b9e6b5a02b5ef161539fbb3fb7c1a38426021fb07127e8cf21c7db4538f7848b365cd2c8dd3b77c68992f5e435c56875581f92a02d0956082a8144c1ca201ec89285429e48a8c48c5a895ac90c1100000008c3160000200c0a074422712449125554720714000d63ac3c64603e1047e3490c83280c62108621c600028021c800609052905105006b7594415a32e045de136a09781e023ae2da0042e537d575416fb981aff879927b08f55f5e564701711b9583df37262745c28f590dd00ebf7873603150f5cbd01f68239cb0d921cfd659231c95c112672801044031afe425a635fa629011ea89370a64ea58591d2d10be0e241c45ccef37b7c898cb43ae0d17c8962ccf49c1bed0a796e551a2da6a670cc953a665b6f9a2928fae5a79fe4d04b438d77b71633b6acbaf6a5b1a6217be330cd17e52a699f62a5b778e20f8d82681f81cf39abd5320f6bf43a88e268edbed6ddd9212307ac665644034926d152e80e3feb794adab3dfe9881c778e95e3966a21b90837f8095d07c2b8fe3f8639ed51b2987207869c9cfef974353ec03ee0cdc730f46b7d46016aaaa731e8c4ff74f83e779560a98db4b9f971730b1c0843d37d499f1daf56c8ddaca0af0a4ce9eb19ab1365003ad9b91be8d868354703aab49308f3e333969dbe6a9c39dbe5c70f78f8d8bf71f8c196137a5de3822b4f98e3e671495172cd71a8d6f148be0465b525262f2c31705b5b505297e1a03fb4a1900d80b477991debce9dcfa96c1ea3a11b4b1168eecf6824d23c7a6293180e61d17740084b55f18130f7ee9688aacfbc9d437a6466a0af67836858b8c02faca2cd8d4fe61d28038ea621651c598cd9a310c22c032904f1be234a82d73146a8322b7a1907b6f5bc260599e242a58524bb04714335e3716c0984b5bb0e471a1c1f5e06ea3162c59a5202a53d3894d098a0878a0ea9ef23e2b90041cbe22a5fa920842c09e1463f2915bf15d885cafb85413a1629068f5dc11b57322069cbc1a003d2b28164b491821f01b94e71f5a15d53bf9dfd7021d10e85d6b49ba47d806a836ba02a1ea58657505d3273ec12baca7b3f2ee86f3ade4aaa3b3305d4b961aaa3e837e20d2efa55965088f135964e405b01188eebd52e4c1c8af60bba878f767d12cdb32c71f03c6cfb3015db284cb00fe6984f1d4e46d1260e613177a488efc74482a033cc71c04dda21c4fee6eda395639c3c9d4116196898b2afa5a257914aa4de0de6f517b8f41700d467821fa4876045ec290ceb75d9696df31e70afcb72cebdeb919ee37b182e699c77cdf19ca7159e3b2bac1071e20a74dec1f60bc3254eb04b2efdd2c47417c4e4a41836d97bfae78398c7e58791a579cee5c604aa27a42390d58a0bb042276fc03e4f781b0d6659061088c40f0f524b77f9dcbb414f7d5d9896f4e24e2771aeeeaa42e5666a8a27c913e2405292de811cd67170383b0fdfbe33d574dc6348d9de534ae1bbe0a9910e03d631a1a7fbea07d6a988c262e0dd839ee6c9bed181bc487271c8c5edbf7db46afe36e7bfdb95dcbf0786b93ff5ef8abcff6d6e901f88c0d6521b5d13be3eea0d0caa1ec9eea3f56ba3f1253b1a45f934aec8c599fa43ee7bece91fbabc5960091441a945f8ef219fd69416c50db08fe7b32d360ab466e928c348f789311f7ca795dd0b6f3b40eafe2249fcf7922c0bda0c88964a8b4ec125920f10e4c4f5ac3fefeadc11b0986b8ce532dcee785aca7258a19c33abff054cf4b63635579a42426286a763253ae5689b0db3bbd9c021f0bee7c8e46d62b9d1ef025c25227a944818f82cfc5a789c81d6fcf157d46a4c2fda789e483c85621446f332590912d222f12b8e96f4c59097d1d8a69a24e6be51f3887c54a38937c2f9cf026d21a3390dee600b38a76634122d08712884d852886236d25fa3afaba90d1413779e77b9336f1bf1f6695ac1db55b2ed1d6eaba524155ddd1fc8d45b29a9acd88f19c2384a223cac8cc7990911ed1da01ff22d27f14e8eeef576a456adaa893fc06d3cad300e3c05398f41f6b9b86abeef241260ab48be1fdcc49bf41797af735246fe87b3a25bcd3e29c11ec7215cee3ac70429e36cb35d097ebc94838b9b0b30af6f94f4d0a10abc95b23d8d475e703fcce91761dc6f7441e89be4d7c8fc0e06f9320352fabb13744a1569cbdfe6920fac21880c48759e68c749233de88a73dfc7441c144fa20ce17bfe68a46d3ade97628885c186be207f0e2910bc63e1b5627059117e9a47599dd0cc8832263b9536b4b78638e77716c022644c310570319438198212ee63b5d356b3b10ca02ba755cb0036b801b0e1f2fc8d70dd3ce05dff32f88d54181f9a2a74ae3b9a341e1e3c24af1a0238f91548e6e8fa81155e8d3366f37d4dba0122c099463c7c3cf54aa7458098d3dac9b0c586f1797a0128bffeb53a14e641e082ac1503aa0ab399ba0120929f544750bcbd674047d48ba4c48c640625cd8d200a7a2dff3b954fec9e5c413da4e5717b069e78a479d58d84d8c375b528b375fe90b54fa629496ae7eb032c576fba7beef792d3e1c6fe944fecb9dd8dd064a2bdba471e8638602e999fb87849248c90aac57ac3aa5392d3cb5ea76eab014f4cd78bb5ce1770825c81c0afa231ad4cd29d45d948513e7fbe2833761bfbda5fc84f0b97fbfe327f9853a7d70324b248a4405c53e91026ff52ccab07c598e7517ea694f771d801a90e829af8320247e0e1ec2ce416a289463a6eb8fb5c8597820a7520ec9e98b7cb86a16a4d039252349e281760e7af2a3a30fcedb7201bc868684090c834f0540078db1df7c36c89f4089184a75ff09197333a6bdc126876b6b411aa9cd9a054427cc936f824e474d2eeec297e3845ca2f37592402e53f07ff912f518b316255e235b8342867e2dbbfb134e296b0780ad29784817a34285fc88e1c0fe272fdfef192001211f5a21efa9b925b492d4190913c3cbc472e39aca406784c91114703a232abf6d601c7afd5080a41b09d3b5602ce63cd0f2f6080862eafba32e63869c11836391888bc6d5cf1a2ee084eebfdde852e01923ffa45e8e42cad4c9b07011968ad71624268eef54a3eb3bec5550e6cbf789768f70be4162db3b2ca3a3bd9ac4b650c73e42174c2e77a28780deac2ebc1713315664d2485955adb4c507052f4c0f3e63a1e78fe1470d5811d9da982d5e5329c07d9bd2e30694d89f13d14d5ff743d0fbe09bee30328d78963e342f00470d3b98ab5a250a7fc2aa6502aa3ba7089f81a22fbcffd088a44c84fe35c9557dfe0a6733186867d3a8e98c12c8824608ad7512ed5e14437323f2ea1d8d61f103be10490a42358d0aa05bfa07801f05442c8db9c966e03da093921bbf71e57a586f22b32a2266e519b63ee2311bda0d3675deeb0a9f80d68584a01c39314fd425da56e8ddfc8d07d494fab57a28d255642f5b719fb5f52e5fdf79e09b912aa05f8f15fe8d14333be19e24db1be50b34de6035118089a8cf960bbdb0c816a1e938663c6615bacee15897697923ec17ff146b59a83850795b6702895ac42e24fda7bed2f50b9357f1df74e9dc032c789c9c3e405c9ccfc983e391f1fe3effd1e456d00cbaaf656061550c2d61dad78cfebb4406706ea1e0984c88c715b1caef090df7181c4c414b6f1bf62c35c4d3fa31b35983c6ac17b083b855f766d8e8f0040e8cdd24aad1c086daf8fed38b71c28c6fd4f0056e52b02d8c0dc54964f407ef939c562240405f844bc42dd0c2fa94c7f1a8488e087ff1b334d1250d3c91b23907fd24a969e7c0306ad4095ad0210b08e1d0021de785083002a647147b5070316fdc1348354dedb06cddf0fcbd172644d6f5522d28f640529d7852e27ea481b011e944a0b07adbbe523f4fec816e4c11a69dc8080bbe00aae90b24a92fb0caa11d30e55434dcc483facc5d3e5387fcd0e82630203b576eae839e86c0005a0ad18c97e5d43b91634be44c19064d39d8ca0de1a041aff2e03ceced32a6ca7dd03b6c0341fd852524fc5e710c9235acdb20e273e0fac05c33b108aa96035bccaf298ca644b7e8f94bd54103db62cbbb67888345ec8aecbca1734ba499fd8e9491a4db18001424a68f3bbf66b25c2c32d8e5ca6dbb97c5cb658797fb151dd5574e2b76f47d0658b2284cb73731cee7ec5ee64f4bfa8d7a74335e44f16baad10dbb3c76d2d324e064120597ecaefce926c62f2c40023d1d00057802f3956a722eb789475bf7ff5e7c89180b06901936e1ae303541a0a763108ad2602f105a3e2e6228f5e62fa77512c21ab7445eee6dacc8cc305b92fb90891951b4c021e6f09764328022d2330596b24048c7d715763bf2e7ccd57c2fa242615bbc49090fde8da6891d8011bbd79f002e1c89de5f25e3015575a07c22da84ab0fbeb79e293022fcde5a8ca5589275d7ad831e460da87a6e2341e849b4c706951aebe23bf2ad0bd0c502c8dc282a78b5a5c52c883fbf7aaca45202fc65c7306c6a42a501a56355ae96dc3d26fbb05d12c9291ed3bff3939a7a98e268ef495d207c526efb995d1dab86d6209e8a81a1d400931cf2c1d9f2ef0ba5904a351bfdc31065b671098408a165111a3eda2f4f4a58401ff979908102341a468cbae11ac4c2240dce2f2f124bb94488ad1bf104e8ec44f041538ef0fa7386da444e3182001a1fe6fc80d971bd788273d7cc8eb1c10ce1e8a9c638aa5e48233c8a3c6b7dd3a010fd05a0052499b871d5e16635640f293190eb54b141665123898fced250c91c797696fda47c50a140a8941c9db029db86b7b13b00835c706b5be6c67c2b829ac7e84918d8b72ceb3a0a0b996a7a3c4035dcbdd3434a858c1f14139dde894d9398b850c1c09f8d505d22ee5c9a53d5afd5a0cf1b41e1b79cbfc6c9708488d68632e137de9026b96c2c33c41784c880299c3e9eb8eea2a497009063cdea4d7f32f10f0ec7c6a907ab83b4a7b42689e214d6bc745aac744d696d4f588f3f9cae690456df98b5543d46ef853ba269800eaa8867a875277eda7768f0d364c68122d4074169f7a5460ee41c8370788cd9dcbfbd26d2c5a0fc0fd56388320e5a6d2e72012cd833e38cca64146d7a7f0c32e15d987256fb79f1d1666b891a48c2861fc015820deeb673abb83f953d6662c6cd6d0ca476878b7bbf8fceb10388f66696e1f9e47b5a77be4fb271d25ad2103efa5558ceba3f145a8426435905c79ce319c42b3fa61e62124c42660a712bcf838eb61a68526235bfa5d42c6916f25277d7ec5066aafd0ffaa060943da57422c7f655fb78f4db58351a3a018990e5f504bf12bedc5a9ee09e35156a34441a2549142e05f6b8340d12b7ea0e562e5dfde3670a6f6abadcec380c86b826fc6d61f8074711790b6823a4921f8ece3a390bc3f670fecb8165de8aeb84c413ff804d631ff87a70e7eb7e8f1c2fa5641f144e3c4e3d9881cb2455df9cbe163723c6da8c558ad7d347b428c6340f1592864a1c9216e3549193bd1b4e488fd99d8a2d19bda40ddc71e67ba5080a8769a3ffd9d10c4fee51a3ec296e9ba81d810f3aeda326eee54783a4588bc659139af87294ac11a404d7d41e8d61f47521e2ac8e8e660aee3d9ab11650e0513765793d24daf4997f232c4633b71d8a52344770d83a7a61560f3a532b814935c8fe0dd2a116c7505ab94960ea227094a97ca7dc278a2944eb9ada2f6870076ecc27fab0e96ef05181195111536c03cecbb5949713d01998c93dd96e4e1a2f3a6160c802836e528c0fd230fd39a395a31b84e69ee3458aa96c34bf7312134633d60c9d03e3f577ab86702eb6f6ab8c386b96cd397fbe8e04d631f274d5a63356eaa4bf3ded2d2ec31b6844ba04356a8a186b45a4ca8c1a436cfffa5cfe2d48f884f9818dafd7a7b1e281d487e081b3ba225729c8e34a133bcd68a8e21af55a07b60d813440e99ce6808753fb2603c8f1234cb2c3392434863e77e2cd6a082556ce99831bf156d249b242799bc27a55b1754e955d63b16ad6a5370f90d620a948263415c623b8d545121abf9c8eeefd84e18e557a00dcd6d40dcbc8daa2f9a5e335058eb7b4e471ecbd69c07004148cf13fc741729b6d925497e96f580cbb59eae77032131ef521a2ab5ad91fe3aadd9f6c702b35eb20caf05d23280e65b7ee74137d1b6be073bd339f7a7f4dd499e9fb95864f69326667d83b3887ed94552c68552892f65c8b4228923822e9531274ff09b0ee97d3d40a8b04a3c2006c6a5ae19501ecafc875c3cc011f36a8fcc6550d45b81d396e309298fefe122b96f53cbb51c93712e5026e9c1c38da5d975cd19c9fcd50d17e7a5ed6ef7571314a75803f6b396448abbcc35b4aeca606f2e3af3556329f299745253c9572d8edd2c4795d3b772169834dc580d2fb2471c65c179cdcab870ce2fe1a0e0624054c2d8bc2e74361857510e239d9b0e71bc5048db8e9c3cb8f69f8d8143bad636fda89633e07de247aa60a173dea460880708ebd146edf8b97a2615afc0ea1aa95716b8f02e8e5e2bec4e393dce7113de33d185b8833c9c44ac63549ce6413565c1376f55da3896e272cc9cb33c50dfc3268c8e76c2263a949943853375850fa8e70be7151edde8cfb2409fb507df055733a9a8a2c2b657b072eb6dd24e4622a2d40fc732d72da757a03f2880ef3c4ca5b05262fbe05878038956d238862192b92d32926cec3a18516be352204d12f83830194039f80d6e4ca0c149180e5d2f9d57a60b5c47d96bcec337da0502ada948c93659d50cab7d75bee72dca5f3ee9039fd2e10ba1b8889e403dfdfa6e671c544ac113f54797204933c312d2238e5766ab193a29ce955e80a4157ef7a93799f15f7c4562d764ba82c543760334d3b8d239c45cc449fc7d3dc8cb65b7b60b66407b2f504f638c78fa908453d376696e535c745bef46e3f7a23f567b21c3fbb63dacf609d5e32f4b65f9337bce8f7063abcff5182111c3c3880ec8ca7eb31458a75ce7df102018e43ed1c985aa17367872bc2d4da8171d80ce93c0030311d8ba240d10f23bd464203e022e119d817c632750fb98f344e09761215c7c8b8da406292e8c3f5728189d42da8849f45fb9a1d70570aae5732e903ced03a271b4a10962e0638a40a5eada5107708dda5f2d08e714ebfc11dc474ce8703313475647cd73cd3839567ca58c691673ced93e264a8722290de2bcb084a790e0e6074479fa5ccf514d64c0a4a6e1c71876294c49511fb04c008d60caaa785f0bfecaaf934e8fd8d7fbdc90621d40a49eee6d3070aaf202e0ed899b404f66153c7a84a0a206922d6e9a1d6215ec814d0c70ffe1f6ba8af1f17ce8d2436e97d357d1ae3c16cdf06fca5a26daa3712c70195f56768fb3f9aabc04f3ffff97f9e3d2d80a7b571fa5692a83eccd0d3c9b851527b94d51c2356c6651e080ce3fb8c814d4af1c3de6044af8a87570cc771021e6134ca6834b322c995ec2415b0d4781ffb9637ef6c841250c5e1494efa7cbbcea816339b14553e5696450cf5ad1df0e7493765963c59cdff61d664d68e4417c2f1f839e5eeb5c1a64a8d16277abb40d6b494bebcf1a0d178db4ea2debaf2577a09dffb07711cf145532c4da694d6fbc1e5745772ce9012d55b59071392e972219a1e2e2ffcde5455de4a9d9334eed7e08f64ad604bac925db177a2c400def499dbf0ef7f15b46c66e7774a15ce035c574689e68ac6197312c99d2847123d7144566c61e1e699f47b2a077540d1041191b7361faa49719df01bf60a98596b1fc2b7b33882f3f0b20f71078660a54dc57719af113d74e305c0977a70944075a0ab4f9efe18f870eb9fcb5c534b3d43210d96378ee074e905913aca75cb8f97ef84cad316760ef51eb27b0ede9de01e9a5e49033d4f8f84f8e109fa4fa1d769c4a69141ce6dbfb86173acc707f00b1b666599d80593c654700fc0eef19b41d81dfada966f2c59c16938a5ecce089cdd33e5ae27d100c44c51eaeb1aff6fb4b07c6206a59de2a43874735a3749012502191bb072f3de880f63f8ce061f1b7206e420d230201e1aa65f8ada3c4e2dcfdc6a57b64c377213a335982a526f9ac5003b8b3d8957530449905cd853a6f6d19fb8707e847757bcb8d2c5b94db1b13f013de5eedc1b5ace246b4accd8571770f7c3dd74a503786c34ba6e63ffde8e680a9fd9dd0bf49e21797c024bfd8dd2387d4088b7e5e31c809ca629d8089884e2accb4458b5884a169fbbcf58a271b1bcaed330e8fe664c471fcfe2875949de21d4d1e2de9d8436bb3514ededf5211111912e4d05b3706e015b1cca8e9e5bb09a6670ffd17070090bd09b7770251ff5d228c1f05a5d1d98b3bf1ea211e0a0fa195803ef091db5af301283abe8a4f0893e10f4366a11aca4701193d21bd407acc4ef926bd631186890742f1ac0d9a0b39f583a41b841b97c77c44bd20ad69177f3bfefa0369fc449576411ec7ff986b5d1c6ed4a8715fd144ff493d65cfe46956ad96e3974fbf258e76bca5a3cb408117179177f3fda984e177e0340f3eea8f8ae84f1e72b42d399a2cb8fee57e2a3381ae2ff1a0e8694a5283fa8ea0e3f0ff7c41c3abfe019e185fe533c267df33563c1b1613a1d047432c4329f2b99d5ecd14a446b6b934c53a871d68d9b762b9e650dbc6af291bb49d8e6020ad23ff3a3b131656aa989e462825f4400f4cfa0124145a60aa472b6f37294a6626a7b738c011467aa2514ff95d0f669d64509eaed9bc2959e0b6a9d16ed9f9a3f49cdfcfe1f878295fd8cd108420c0506fcac4e4260051945ee2f3ac165d0f08f35699eec5e1fa0be6d39f1b1ec7e0574f0fdda1af55425b80b763cf01d14af3218e65bee9502cb1c85e1361721b236cccf72f767099cc9459974d276f5854a099d842303a7ab28c34617dc04d10f65b3c8c7da8f6949c2409b3f5a30825679ce3de2431b2826b7d321dfb1de3f45586f886bf0d5faff9c6708c2d3f630074f0354cb4ea2ec5a58bb31666711319592c10c1c65bd762c3a26899737df31f26410bb7288cc4f87961680ff998f1cf558914156119d9fd59231b7b7a636265513bf8a42978ffa88ad62624451d28a01b919c7364283c0bd351942373f39fd18b84673415315bbdc7bdffe69a11f1e6a30579f028830c9ef9b39b860430a869723214b1fd2e019d24f72285902aa840c42b40e02717b4944a411f12c4730f86d74ca81140c7106180da141fd6f3ab846ea69a2f9ba44f4bf6b0b8194d63e69a475a8e659a19bded9dda96673a68c0983b86b0214b6d4383df6c99d8579cbe7fece6cb2fdebf094dc1a7fbb005257798734b4682d287eeb00fcc3199e71aee4e0ee73719b406d354b7bce01a2099a24388b44f8f81e7a6161440e5b249e64118529d7aa722e8047826b02206a0048afd3e5b062a9902ba6a7b7712beb87df46356b909c96191a20f83af3383e137d1ad1a4870fb2acdb4893bd3628c2b71dcfcfe86b967dbe36c9d0c453e99214eebff4aafe7b1a4613ab45d68e1f149ae563b8d6edc646877c90156490b22eebfb595ddf3e1e25785c1c01c671d62a9fd88e23bab8c40833bd23916d24d842b2fd6d8a3f44d545d153c776e509ad83868e6c60f6d4d2fb006e4a5b00d5940ff9e1d1759e9c909d003c4e27235b41a386b20e44b230f8047d64b9cfa4e5c8ce51352da76cb826948801851ea5d86690c58dc22a4d9f70477e1808dac21e78f2183f8188eea45f5d80018ea3cc4c525a88ca73cdd73766faed201c30dbe38a9092d14533fedf840c0d7544d20dfadf73dc10f927e4cc0cb3427aca85a58b8bdcb22e8278db5abf433f3da271a11ccd3cedb25e213d9bfc2d7d0c352d93bf577a69076ca71122a6e5e16029fca43b3df8f0b78fe7d3553f9d9618038bd77de004c4622205dca388bccce64ad92df5b26489d43ed65736beef90eebfba067ea921132deb9aafbb4ac055e7d2d7640271fb9b332033a1c4df85f82fea92fe4aef7a31af0862fd6ca6eccc763602075d6b98c7345c9da299e175c6f441a16f1222c23cd29d849280ba9c28cddeaf63356f64013062f966b59d571d6b32e71af1be02aeacc60312006652147479ea602891513fdb603939fdfb3624d44d3c4d0ddc533d1a795c2b21ba73bfb4ce87460427506015e469744911b4c36ec725df5125c19d04187e09a0c1ea79ecf1576f045a4f4ce07abfd1525e60f8af973495460203ea04921fec886c017ecc9f135cbfc04d832944eab839db533c551fddf5bb18e1bc9f0cd8f57b438b479bca874b4557b8d4c766e33a725046ea2f7b6f4d6fb7c946bd23041c382e4636777f7f48739c1020f5bb8957d66085ef941d1e55bdcd377316a7e243b26edcf119801f2e91259ed3e321215d534c06c8972a999093014a18124903c98af429f19f9c69712678de0063aab44ad1022906766241291da5f73dc55046cf197a577aea44af2ca573a155a870947007d2dcc738cd2242970fdd8a3cae427c2ff3ea8e2219d8d9636539094c99a44d63b4054a81e004113ee88e676e7e1a05281602fb1158e0a0cb4a3f5c426a073a7da8c56fcd4dab5539e6fba0e1b5103240adaaeb724d20d10979ac4e2d634ac8fb854ee14017e569b1162d47f5c2153ff194364be4b4bc5009aa7044d4aa3e8ddfdcbe604dcb13bac1cfa39a4927e4f08112ed1082c5b45429e4c7dcf14c38a5ba2e96565b318e54c59be894ea6232ad7f500455a762a587c1f488463b80305d5a9514f6531987c45bdaebed697d4127588daa95da05d3231a356c006db4f8030399dff56122342c9fe464a7bceae2a62ace06fa199b169288cd7bbb2b01029efa79917a6791a72720c4e940bf2ed42255eefe117e10c394bc7aaa15ad0c7a240df4eae63463863efe04c104992c41ac86d4f2844af81b704123b698c586048a5dcb23577408f00efd664f9f410a29e282a14853fa5d80a855cce66b701cb60550788cf856d18c26d374cdf24317470a18cda90413d4eae468b8f0aaa7aa16048c2ee2c0ba1d667d2ca8b36a65b369d00e087098876ea7796072612fefcbcd2b31ffd88de83283241ff522aef5f21060814908c59b75fe42b28af74fb39e72040b88aabaaa576287857460560e7754c0c146b9e561124ac4a77869b7951c91c574d18da19c81aed9c0c3eef3fa68e0007bd9bc931b36474522edf32063fd481e5e4b8905f2b8164d6a76745b34146dead100e46af860a3600ca20ded5359bef985577f4643736376b59fd9602ea6a90d14bc3f143be06b95f1c31ecc31815eef3a5f6f140013c7a06db0aa380e5380a5ab33921379995f85c62f7ceaa20d75a6dcf664795ccf1153eacc5a01301ba400332c85b9dc609474acaca841d60847e0752ec228ffbe710c35fbd4500553394b59d07b7121015ae7a4fb76a98ad46263a0ebf5f79b5beba52bfc0ada0819c6eeba34b1c55e685992e804d97fba09680df41d46eb05593f668d5b10760703a8f92a844615291ca86cdfa77f8583c347cf108a037ad98f6b92c3fa5485a5158f41196f43c9c8f697d7b206341243a6cc0cc08d057010d8d5ac07089ccf341e47979e0e8c1b692167eeae5f20ffd76f0c8abf4cbdead6c38da670d2251c7da2bdd9e3fd6ed5dc1fe854b2f475f366c70a71b5e9b4d227bba0869e70f8c0ed07160dfd195aac63f6f3eb4ac65b3126d24662f5b1c6f3477da20f34c5ff64d2d80a1f8a483d974dbe62c108fef0f96d9a847485f1c7a7fcec4ebf0dbb04a280440b210a29ead013ff957a8fc7e28ea5508c6a1a818e03de6b7ddd40c1734e15535a53d276b21d38f21a90f587824ebbbce3abf4c134592e2400798b0fb4420c710db0202f5a3159def490a68a1acf52e73b5f4d7e05f6ad18c56fe0467b73214d3e6559f0bad9cafa9295f5a534e55369c6ea30e7b6809d0131fd1bad47a50a86b1db438011380d55b5a7f539d8f433d279dbf2fcd4c27c57389d7500f9f6bae93c3d3e90bcc6195db7bea5699025579d538fd59416b3428e09cf2b150c0955d6dbd20230be246b383630c3d43120fc43cd768311a3ddc3a8f896f4ece7d4cce2bd712658b67725381ff97ffcb5c7f770c22b5dd47c688d57532b5e716179e1779db1195945d849838b97c1f8a448226d4e92cd8ed6e2c808211856436749acabaa46ca44e9c851956490c8ca2812b333c951fd06295b97f488c34824f09b743d9c187f0bf52ffd325d8062c6e23b9fa57813b0d62a75a56651097bf590e12b09ac1725dc69b98a8c6d469ba568393c9b45258083b4a8a21c818fb75e45906ba7d56bf54b10e0b0d971cba5c2841b7c3c19928a7c107311f943260843a641f9f29dc5cbc6ee58896c5af3a844648db60929a60875e384fcf7dd556513de56c0b72d61b7e7108d6ae0f4cd376f09c755db44c4c171828f5b8c59dd931227b64d08a670bf8b36c1968438c1729be0ae73ab924af22693b5b651be4ebfe673484c1c5a0c6bdf133bf31d50d50060aad5d73275bcbef9bd4a39e1f82f0e53825d15f9062419a04626ef41a8074de3e98ceb29b8e5dc8c464761ec19d8d8e08d23ccfa2c33226e0c690c74cc05a7393cf68e45a9d62eb1001c02e9135d036824fa4810b855709818b0ecf5f1fee6896004a14c11a440bc451a9c62e73d15f7b78235f066938275544aa368c27dbe58aec954432446fe158bc41da78017d6dfa0877f69f28ab0d105a6150afdab28eaaf0bb9552f49ad1fc246faf88c14f305a2122e44eb2a217ea4214e4affb7d2cac723a31a486d9aa838aeaf1ff243a02a7ddbc07ba6ae1453410503dc91383fecc82bf5143b2a18eea97765cda82c8209d21a7624fbc928479d723fd805219d28245e8bca6249353af8f43ad11caf031c0747a8ae20beeb3b0b62d44eba04019037b2045d53a978033de99a440531e12b563cc909ab8922fd9960b7e1c72bb94a86bc81236b3c3411d46240640dd6a62c3afce3b28b794c19581fed34b47219dfc9dea97249dcce2efc32247992e7412dbc4aea66c5be27657e4d1daa5cc905403537b6264aa7247b117ccc3f23e6fc8856f4ecd9da915ae0001e8e44d3024b1f96d3829a53650832533f23a60e01aa926af381eb3f98f53f232e46b769a2a4dedfbb9b65638e7bc383a7e32976c2552044bc6b553ce2d55d91a2daa1ce4e7154ef67c42b44eea8963ee8bd4153b3531d35cedb839ea2b88afa0ced0bb7b82a40cf158dddd3a5e96807ef957380a35eb0fb6e37ef0031f75334ac203126c879ff113002383af3296be283b75b3b2a27ab3ffaf57c05691ec99778e25979e31d591b1685a5b2b8dd014c53f9af89722fcbe47f09a4821c0761239aa50d0abcc28e7a75ee9ec102bafc3da49dadf1667f3188fabe2c5d1d39102fef9143387467da39720461a6677fb63ddae82a79ad4d8bd34d6189d9c1bb1a950a521caf40422ec00c01bb593a823150d8e19e63cf8bf7b5f6ef532c6c918ba4bd609141bf5fc9630180104fedc1228e3eaf249d96ce7c8e5ab6b3afcf0efb00ba52c0b16d139a430cbc1516037c543abaa2ea6af71a44b5e937309b0d9dae103a8d0d3a1d063a7d3fa73981ad7435fb1cda1678e02afd4320371c6615eaa5ca23854672912e9c83971194640b524e206177120451b191be89fd8c057ee6cf1115de69fb99bbd60a6be530c29e17a0d18951142487107a9188941867e4fcc49b5380cc5ba4f8313d07343a15acd909739772e092e809cd08be42d0d4fc05ee5ca47562ac06900ce4576e9d4d16d4811e33617d017ea1594207b7f801398da5e0e5ce16f05de5877d680c5793853badc1c1a5a9dfc50f39a68599f1b9b000c10c39c66de4464ad71dda740efc207986ad5f66aa42d047252063e1fdc169c0fdb6939c2876ee2d23e5444d27c56a7ac9d2115eb9952202da13805ccafa578c252fc07d45084543fe55a6fc6d3dee08bda53096a06399c40e841c77d0075731ad794cddfbb0ea2d67bef1195b72140a5c5d1d1dd6eaf2510d8c287d791194e6f57a2d53cd64dcd686340c46b34f6e8880a559bf2078c4ae9ef405fb9d7a4604e8dd09a3623db5f94ce3dca2d93d9dac783be6e328d547a562c9ce6ace58896dd55642d7bdbe517d50e4e47afe5fe7de8e4818674742795abf5ad84da5de84a41009783d71d6b2ea8a183ef9f604ebf5543e2a179b0228e7b4d99ca32933b2d7984f54852398a54875d1ffe1a1fcdf50fd8ad7a56ddd5df524f519f33c95061d02b11cfc9ccb393910e5da077b031edc40a1c48133d9d713345e63352a6335c2b346f5b245d2044d9411acbb9ac9e9dd904484daf1351f8f9fe7791dcf62fced3ca3b6d6c766437ef4c43edbb22f2e93397eea6654bbd56cd5eb3a06698c1fb00f43de3d2991e8ec279f6a1c1bb86de281f7126ba0b2c8f0f64c8ca3c76eb40107d8afe8e8da8b7c364ee6d7f5ab459564b75630a0c31b26efbaa9baed4444dad820814aed114f3c46966d7acf10aa0db0bc10208e820ecc121aa72b9ad1fa1ec2533bc3a59d7322515040cfbb4f81f76fd5c25d0067de8bee8af287a48e712eae7fffbd1ed5144ad91553787bfd3f64568ff1fa629979a3ef222a75e262e9ce77206984d18716657b5980be8ba95bf5e47118e6dad22569dee48accf543f3d2c80e4fd2e036569c27e85d8fa21fb36a832c53f6c5bd2230eb111cc1a390be2fa12203e6f8526a2d31ea9020ffda2965b0b8306a896681919967484c6a51be2508e66a4f7e306a3918244bc226dbcaffbe16357d0d491d8c5a5f8b580459590263ae501558b8383b7f30ea1075eb0cfe29d5b4b92ac2add209e207a3c650c0bcbd695511b6e64cb0460c465db9539a479c10b59dd0d5ea07a3ae4749c1db0b0b5128d161b9277ebfd08adc866022bdee24ddbef1255fe902068b588e86711376db3ac64f41d36448cf0f332491c11ee62bd0ac17407533d769833219f9de70ba682201fa6bde3fd9e516bf1f7a4872a3417600da520ae683f9912dc2350f6aa3f1aafa7742803e60a2bebf472981028e6c1356f6a13b1631872f0a1d6a0f9315546c4481f74e644a0b83dad2c515cc8aaaa7152532f144a617e3dca76e7ba1a9c88ac58884af896b1ba3a32a426ff04ef1e7deeacddd003d42fae8efd9d5b3b0e6f8d91b3409ee5010f30661fa1eb422a99f3e41947cd424358f95732e9a6b450a91335c506f61e97cc6ab83d91128976c7ae54084801e0683e29262acb6068378b1dce23b89234e603042dee54577079da1c45364eafe47e382d355156232624d5c29fccd7d5ba94f456e9b444b4384cfdb7554f539d115f0be8bfd94f79460b15a9ba7b6d441de0f14e2141bde68b610fac1714714af54faf24dcdd7ad0b61a20785ae3c83cf4071596f79e253749e5babdd28699df32710c680439b6b92517e0d13ab37246d3318719dafb1f3d499c47cc565fd634e29a28abbe1985c79936582dd79ec42a4f7cc677fefec759432f7ec72be310316ce04013251603b9ea52a7db5d451ff58d8b996ed3e23b285e328ae58992b3fab31856f1c7084b7935f7852bab091812e7b5e0137173290b7c1b3b7e7371ed568d96a33efa2639fa1d7a9073da819af7401f1aeaf38dbce0551e6249910f24dd84e3786bf1bab23858e0fc47ae40a9fde2021fce89ffe99536d9732ad91937006e8a30c4f1b27223077bb90626e32483563fd0838e44e6d90755d57836458dc1b154c5fb2a5a06179377a5846f6b7392d46b6fd78029df54fdf24efb102d0b5cdcbf6ba4ae9407d342cd292583ecef283da565c63a6f143eb05ef9674646830e6ce8c082b07701521c81a0ddc879b188e11cac4b913cd252440d3b52cadeb67b8a8452003ec8ded5a96fb5b8add9b5543eb458dcbcf13ff4e24c95f23d1d9c3c3af518e4a21cb673b6cd90a91707af931c85ccba2d333fc7a0a5dc78185999b321d09d682564c680c009f5f2c8a060460cf7013124197e5577b2b56bc3155537da63b64baff052ac5ff15a4f68db2468f576fbd525f94668501ddd4138326009a9d6175d32e6303a06a053b496704934381168ce795d9cb7418b9ae23dd354c6915e69e3c709d68a7bac8a3ad4a09bd74209200ab043924c6d6df9544d8e5ee0c743e3c36fac52a18af831b87551fdafb07ebcee8735c6a90b663a6906e05bf2df919a90c1278d442ab1562f611c7fdfbbe3200061df1e63e1e87f10c103fa648c720abcb81160eabeb1a3cf561df37e72e689d1c4794c3c5199f734c9fcfa70ffa8b8c211dbc8e82d846908af5faf7e7f9c97a641f0bd4c5561ec2be62bd0eaeb7b727b1eb66f9fa901695585f4114d7ce09adc792698f75c68d8d1fda0d545bdf8141ae6e3a35e2dceb7ec0e028038eb267e3188d91217d1de49d2924889889b2f33150b9035a44428529b12b0ed9ee4458f943dfb94b2ab1209fac4d9b41bd866b9823aa3c863ebd0b76ab566cd69902ebf30112cb693081b9b3d4f89621c87bbf1f15d96dc51fc1d228726c157d6e030c1137d8474d8f9cb433ec1a4ca4825ad18c3459966456bfd5999ccdde467a02181058dd73def7c182e82aa6c31d22b03d8e0387822aaef1a4431f91fdb64892a25773b63336084708adc22349d59a3806a6d0762f33c8d0cead8789fd925fb356bcb67d9346dfe9c16cd01f83d955a0903a40d7a6a1eda85e48facb0d62e06d49ffac89ef311f7fc547ca74785f0cdc9e841d17d4436f089536365f92e7189b4e952eead9c20055ff830762120660793e265c063744e2b4305e07d055c1e45af0e9155ae6f002d46c3c13bf450f0c42265ae2977b7b222121849df44099dbcfcacc5e8cd61d862ec2a9f0649a86a1710011b59f9938bddded2903784c267353482f4ae48dec9a697562446fe406a315d4f53e53d124e53e76babed81c0c0133d70b7b86d5245f89276ac1b458fa1acad85d5b1e70040223e3eb3b2090c68fc4c728c95fb3cb4ed64f5064acf658418d30766c4648dcfab91bd345c05e2d054918a85c22ce9c421a548a52739609f090dfbdc2d29648a8a6ef4f52fcadde6c2c50470a39bee902eb5134426f24c93735a04cac9bf80c694e745c0ac0cb8ab5969172d25fbddc533523da7af670474c7b6a64497ef00b2b6e7c8b91583c7b775496c7ce5b14d8969abc36aeb4228e103b9a12cb0f892f1473734751d32138b2f491862befc8f61294dd50f9421887765a532a7fdd5d586f48ff9d6c10bbf2b25e28d9c4b15d0ded9f0d3e063c9ef03ccd8b14bffd1070c33659d76e95bd6c04ee796ed13489dc04c82377eb02adf51b1532456a1e34b35a3ab66d4975786d59bb82aa17333306b3359d8811fa2bb6691d32696cfdce06050d4d0f26141638badb14d161972cc0b2692468ade9e87b01d96465440a8cf09d6292c4f96215b48bc334c79f3d18c18a8bb65ca124cbde6677850f42575ff9e9a2a761291b75b302366fc8eb868672df5bd511c37cd72d54ac4a9248b6ee2261d6b28f8d35008ed35b85b83266928eb0aa9bc59e011eae673f14a161d03040ff4a1635559c2c2c97465fbed296a0108216cea7010586158cfff5f2eaedc735a1ad9c87fbd2881036fd02f7ce42f5c5ddf950c6485086f1c7060389fe3c72b1793b5235a3f776a41eb6e62767e44e02367e1d8a8508d14e21a08023bae121537e1da7c71dbcb8e47d8bf0a1936650b51185a61c958a7eb0d644b3d0f26d9e184735e5bf28b620c1a5f9745b452fdd5360443f2ea1af6716f4d2d66482cc33af4962591ac9726bf20449ddcfe8d3e746b3d8201d49cbaa59adab718ec9f57362a866985ded95f72a58803a18742311fbda1077a3e764afb31f71695ff252092c2655372ca90b0b7a6c02a43b111f44c91af1b0ae50869be62439e07c504c41e58899bffdbabeaa4b665bda91b8fb17bacdd6327a76ed4df6dddcde31d513fab91bd449beea82d8d74082084962259f390865fff800897983820abea72de84d82bc84da42a5e48fba4395229c6a5f9a9fd0fb1257e18d89dd1889603a17b1c22b83d3df0f5dd7385bf0f1fa197148d8b6c1ae1c8520bfc078a913e1d1037c8097be3fa1badb7791c5cb6bed5d8aa6161afa49a19a4a217900d7c1c4479dd294da30f77bcc8127da86bda8d86c98b841ed6dc2c4b5f83393bebd28a83d272be10372b415f85a142026a45187ae5a000e831b32037ed8bdc4c2702afddb46c1fa6bc0c98400fb2a328852bc11ca77833e0e55c812cdd0318ed8a4cfca65d30524e64a7f4513322c86ed7d07a367e5b9fb8a34b56132425d2b03b21cb9317134c9cdc685f56adbd580dc30ad1c5106255d2d1f7ea069079882e3377da59f313b73f83ef0238e4c72c2f3226ed132710bea812fdcc64e5dc0f36949e7b054053203e5ba40268aceed2e9f40fd5ffb84d0231a9c27813367a9c315953e8d22787c8529fe1c75c26728ed9b310985231cc3c120dd31591aefa3497a92b51a83cbbc66b46e91166ed71b0334d3b7a2910e93977a81ed14cfe54fa2ba47608c37c4f1f9118e96ff5f9a71b59a2533ca5cf3f8020d4e098510b48c36be27f65c3532cadac703209dd691be8ea83c1f52b4a1ffe5f7e35325488fe6e411fb237f0cff057b7b4124971ea9b794bf4b31a7ccf965e54d7347abb86835d707e487db4e95ad2fb7e1597f8dad95ec93f144a0528f58d37fd7c2baab581418b0870473b45c23aee6e674f37ca0bfa2fc404ae712d55f7662001fd465301fb5b3b1b86c9506b76846ede496842279775bca8fe4660772f5761c65a8818c8cc93cae3e4a31b22f77f79c3f6a50872750e8efd7d23a14baccfd29675314c6a6fcec6ec99d088d200e2b776e0a36e76d2bb3fb8f879b183413b2f59f636666ca8e90bfa4e5e5d94eb80e59b714d1c6bd22ecd15f0ed5a52104f1fa49d45b5b028c4492154c58d9540b1f5c839cd3e8bde451dfb8e85093c74fc6219b46b40ea9bcff495272ca2082081d6fe466bd49e560ae91ab30bf9d24f9e74385741239e021f1c20322271907e8bfde8ca516edefcffeece540aadeb4039aa682a1348780cd9ceeaa12393d5b421ed7c56fffa34ac7f7e578f84fd83c431294e827a8f8de867cd8135e3ce11843f40ae8a0a7399d4d8fb426646c26a2b2c0a34f04fd906e697a2db50591cf08bff6f134b2bd9d523624c2286d41a08bf5358384195201f903b17830bbda8de0615b496acc2252516d02d6ff01bc4e122f274bec214537a10fd51790b62621e20c85f776d3bcd90e44ad33b4aba80c502dd299ac927183755abb3f91755c2f2e31213630673fd70aef7aceec5e9fac906e226ef1aca57b93a7b6fcc600fc548a2723d93d4aaa7daaf2119baf4492bb6f650b747224b9cfc5e509c273a20e8aeba0f841901ec25bd95cf0161f5153d3b124768a28110c7772b4b7f510ca118f1cc0fe7b0363b690aa70c47a5d630f6360d8fe93295cf37f16140ac813ee1051bb38ad52ed86f027d5b9aa23b737e150d9b0fc5eeb5d040095a825606b974904002a800198ff08e466652183c89a69356fa7cd790465d644a141eeb33b456597087b10a8723d2d253d0209e85154ef3e1d390d674345f4600e3415e284a861f04ec902117d8c96089dc753c8a71f8d9f16901a7481872fb060d18d5c8f89a52d5e607e1e988ba8fc98ec45038184969d5b001769114872421829389a9b8f361bd1eb11fec016158c3b5c4ac4a4e1c2fae7df7dca9d49dd378f02a11b45db04cafd4711fbd637ba08a05545e0da8433d1344581ba2b9be6e1ecc8d061d62004572ebf43ac66933e483b31fc9500c63dbeb1615323b9592161dcc8ad9632537e07b5e241f9cea6960d51e218a58a7b49b988d3f91d7e7405277d24be58787a9007050de0f4f77cc5de3978150dfc737ce85d001d973be8f995092e3f3e24a74a8a837787a3318166c47fc1170c091c0c16452a5e66652a14102fbadf6c48571a3eadf4b141b5bd424115e71905972d8704aa36357292683a1189c2540ae40ad9059d9976ff954a6d1f54b8552794fc3d8210941ba4a34259441ae922f85575803fd11b484c7157a87f12b4e5172bc4b0509ac5576389f26670ef56e9ee39e75e903774fe7e4c9f863f0eff27e55e1fbcfc26aa4eda5070189a66cd2a7745d33f430628b622981203322057ef2b4950eb55dae39384508095cf97f3f3061a710360e4cbf1d6b825d240f7ccd444509e62c258f6e5b7344e830ab3b9efce97376cac371d826c12d0ebe083207be4c6ad34bdc965f413d41344f69cd8786abd1f0ecec2d03d2766e390db342ccb1c288a11d9870e75a9919aa946ba32dd815a8c0ff6c083704bd42d3d636bd2c57f4333e8084d2b84b890f1f8b0b4282dea9890c1eedad6c1a9bc0b189fddc1f02b2e14eee1d084c0fbc1907a39230c60a33d63c2506fb89bc883a84407da6a18224b967864d1cb2b848d99db18035208eca51c88802bdbfa2cd36a7e0543e9ca642f8bcd4fcf39c9c15f4ccdaff13ec10042e0d877887d720aa1f52a8962406f8330becec4a9cc19d1d4b642d254a5c5e9f6c11486fa3837786e2b941d2b837e6ef4c238a4fc381832fe8c96df40d809a2a63793e6b926833f838625611529ede0cf28c5849c861ec2479668ab4a9792733424c7d38788652d9a0ae701c1b27f3abaf84ede3c9af5d1847ff9f35aa0c656105c3b233c0e58fa42599fef6236fdf9b5d4c32e0cf295404dc34adb085734e1115dc0c73cc4774883a7c7ea644a45e6107ccbbaccf0f9f4c681e289d068902e345fe3ca25421a72f0934ec1c8cd6fc7e32a6479cca2d43020134dcde394d064265bc6d445d33bb429cb5bda1c736c18b7d8a409d2e5c9295a1e44d73f8dab1a0f581fa3d190798d14667e9af0707ff70a6904cba7f2bb5b6a4306a516419023092c1c2accb240c7fc50b046cd03fd8b83beaecb1fe795e4d43f0ab4ebabaa0995b7186ceab624d580366408d19138fc564009c75d8ac5ae4515cf19961b3f289a145dcccd6047666bb1ac401fc408d6ca1a7a48623ad2ba014df6e1be2aa15aba04948e848abe350e208da4ae5bdbb0bfccc8939b6549a31999cc027c19639b3a74d16244c949af471fa42256f14608efc86c9acd2787170b3fc1b6363084a038b8c49bf30d681505df0cfcf275f8adfabb7e5f239cf10b1f1448c255dae99414688c7f699ee4bc1115c848778d50e7d73c37785d3910e6f5ace59aa063321b7c56719f9157557c8ba5a4b6fec4cd84424403cfaeae9c607ea2c858c0ad248e767ff1049971d7dc781f3273b6581a5eba95590aed3d5bbf91aa0aa810323d63e295f54d6f3e5b6c13fee5298f93360bc9a2b592f12fa0949dd119360b0b18d112686d007641405b20e43f14476887e10c2a33d318aea350111278f62592cae81f1c884abb0b65a4ab5be3dae8df5ed7a661c8730ec90cd8276fbda2551e1a15968e6894cd7dc79f073d36fbcce58f0e88545ea88f90344191cc56cc19f53222c1f0775540a1489f9dd33d710ca459a3158de7821fbe58eb5a8a4c8d8539a6c446ac1f8033d56ab47906eb727e92e5836bff3d5e40e64c3fd34176a6e428bf6afbbb1caaa81e967850092182ed2fe11c1df535db346599457ed2e38fa5db4ba44b7cd9bc20be78837a53bd22abb79121039e96aa3269422f501ec5f5f2a7888e8c587e9f434650fca65d804a091b2e19f23b8123990725632e6c8dc4674f1bea7b899ec150e941178a080eba932b92620f617eb21f67880679aff56f76aaf0e831a0a61ca7f9f346738805e18a1ca5e0eb576105aba2158ac975a520fd744fa56e0a1f7a1522c117bc04f04309af545332228270c3904f344a74be82f612382343d7569f67e76488377778e41c48ba105134489e53b8dc984649137a5993d6640f464f517282fe914151f01f81f003f0eb7da05cd70ad7f1a06f7ad265eabd806bea7993a944c6d4d5cbf1499acc4e853043a0e5c8e23456aa134c711f032c7f01f6566942c7c3af138503f1ce0702b81de9d40742462941acb45ee3235ee61f08cc4ae00700cbaa13035348518ad997c296b7cfa82f4b835a28ef34e1be6c505c9b4c4d5f3307fde4cf39f8d093eab167fc307afe03f53fc2fef5a7c70e2a9f047c3fe613bb948d56ca55056cc052bbe9f7454b26c4b92e2f4534aba1f1326c5e61bb5bfde953f29cbe9bdede233f7ed217793db1322bffac05bcaadc2a256e371676c020e878c5734e10f35614bf0ead1a07a9e993b132af8910741433b34a46f6a2ea8d27c0798228e54f4be436086dbe6818937d61f60acc364fb9e2c39ebdc5b4293037cf8f9e2559394d6b53d3af2d2cca0ff6818c02e88769b1b4ea0245127c7a26db5a3135a8f63992dce482e61f937576ee42b2708d01a00975e6bdf7e4c7cc4ed021d63e575caada7eabbe24da1b2594db937ecd7a43a5a38fd9330d920b0d09d671b7fac9bc0e4416cab7cd5739f317af5360a6f8c095fce1f912bf1cbb8d0d4aade997d391c260b8cb399c1cb3d74a21d3e572c62684fb60d0ff5c5ce4a0df70c1967a79aeb3425d89b540bd2a4b86d2b01434b2e543d98eefdc48232b6ead5fc7dfc03ba656e128424388ca75ac9bebdf3903c33d922c91e3fcbfa4323fcbc066f6add67f6bb530eb4a25c915fca2b75a3412b60237db4515aa3a16d6d074d552b351aca18c28d4e38654a71bd6cac398c8cd421190a7c0cb5587add63110641258b2c64f8fe2f6818c16ce4476796c7a69ead97ea51cc43c8c61cfe5de51e674e6914a5a0b0f7bda85243fad0808b3fba3455a3dda071cdf592054fac509624e828a908361a9ade481cdaa14fce50ec11e510a911213ce21d52ed0312c235ab9e426c67a3a86b5d60b2515cf0b3c5438b21423a7b1f086931d299b1124d828ff36e73e250683b667a11c77d9e976c85736e0aecbe9371d26af91def22a350afe6b21927066ebff6ebafa81b8d000a63b04321ca798708731150d4f1c0fc5a35cfbb7f478a054c196af40d105cfcbb82dae474472397bbdd05b50feb977dc9fc4e1654191added6f8050fffdd565131170bca0ba8311d5a578b13c0543478b5fccfb897234ee2aedf0edb74b2ca672595f145b5b522a0880bc5674311fa7e94e824a54f189c45754e1219a22bd06a6b64ea63767e3eb195062bfb2474a01ca5a04267006a7b3b0722e5e5ecc4a78506171381ace49d4e6d928f07858130f406290971c0aab572b18488810f43b01d3dbbc21343c46b1f201c02db2b2558134e2f43aa339ede025eca163fbafcaecf832281cdcfea85ed983de6cbb4d9f766a433ad8105600c6e4777fbc4c340eca8bf721bb13f309132a07677c25fcdfb35f17771adf3b3ee77adf24706c5752f715fca5a4706b573c56192d54e5cb73ae4f167a8431948e15013054fc2bec7283787707fa798261ebc5235ab6fe1eeb8e9600a30425359322966d3f54b14195bb5a8119ecfa73f9b85f668beaa8725939a467d1fcc4df8d439189ddb5f7983ae19c87b43b465dfffe5cd34634245d90a0bae1de4bd9fa1b5e06cbfc9e8a32948e5a0b891c301158841c72ef515de150fb464a1d81eaeae33acda9410c7948bc1c42edf87bff6044366fa51b3b2b5c33cd16052b19f6d181ef4ec0e68e6c772aeb9eeb4e12344694679bdc1173d4b58d82792044244b34c294d26b24062a8efab1c173df416e7b21624195fc12093efb58b63328cdb102975938a5352b987b43ad135eb40ad83060193068fc41afd6bc248451140fddf70cac4477c47934849c7ce92aa9d426e4fd188d2ad1c1e35ba0bbc59683b06a36e046c153df4a0b27b8d96836bdba3441675e4f12c057860ffad473e7ce61e611b983d10571ec8ac8b12a0268577b89ea1785996ff1709311fa2d86d75e6fd80c8a9a37304d059bb2aaa25ff8ccaea9ca6c0945809c9076e52b0c2c708621b15c42ef938a284a0bf875c2f813c60b688db5e45d5690d9de5e010f595b989729f5fdb0e4c4b92fb42086383097be9eafb3c7e8c98d004c89442cf3e05a0637d897b4572dbfe17edd505216245f454d9af3f802ef27cd19eca1ec371b8cee06a35073497d8b2595cbb48ed670da7e5298664dde44d67fe590b149907f83a20e932975b91ae65ca03b754e63dd96e4f19b476aa9bbb447963ca9db262eeed3b6aee6512befd4be766c1843cbcd56f15bec39784a1ae3b79ad8e9cf0302699bbae253f9778182b29ab0569976039f585b974ec1fc73fe26af5057bc0b6926d748e3b7a6a168697b3be2231e36cb87f82ca72542f043527c13ac17bb8689df0b2bd34ce27ea008e219c3e2b4e4ae9f8ebcb73572f4f953851bccb61a4fc41590484b4c059f85215850a6e9375cc2572d54e908a338bf5d1f77784750c16a449de8e71cb6ee7403850ab6954d690ce2526a3e0023bc0755b63462762d477a444cd91b8703d4f0f40c5a2137a2cc040cca81d7de837615cf7e0989c9d2c8703eab96e8a5b405815511bf9d9e949e6cf889dea3d352dcd20a7220f4d171de2f53628522d22c3e252d3e11a6f54987b0c8b54553890dd71c3f17f86fe27b726a03147e198975bf61094e0ecef81282550455f976fedff8488705b4224b2bb7b07b808a40870083a66e35a9573f15c37e7a229cab5b81f55148391bc4a53f7beb5755e5e7f93b411d7ba5ceca12930c80ee27ed0950ff4b916e7daf88bb06eb54ada103d75f0874ef2ccb5b8db3e6058e7cc8c916b31598b6bcd70adf001a07d928a3fddf6f97c3ed3fea9ce89e7866727fba8f9e26e6e6e5098269c9922add3ff44d8c63107b1d0e9979468fb261a078b44ab46819ac9898eb17f52f1b6f9fed371ad19039c712d0ee7da0e39886244c099914ec522189cd9b8bdf20e07a584f234aaaadaaf8f8ac99e2e89b818595470907f9430b9c447eac8d8664aeaaabb32c6f69a2edba27827272e4e76ea167bc4225d94c1ba381399106962131b0e3a7d14189d5ce6edbde6624c84d51f45984ce5ff9a31361d8a8a55d6268b75fa1bfd5cabac8f83b36d0c4393090c438e8a44fe75cceb18efde1ebcbeddbbc38ab03d7ba703b1478405e9c97c146331169c99bcfcd6cbdcdbdac6f62c322155f49dd0a9f8840845a78f4531115686ed6e78eb980ef3faaf652caeb5db2a176ffdcf513ac66e5ba7dd9fceb99762b14d617e6d0aa7d2e5605bd13155847562ec5a6bade5630fa6debd18136130b1a7bb2b2b3aebac37ce7edd51b19fffdadffedabb627fdbd65afb2a5ac6f2114d51151d86b2a7883d74e58349848931ba1259dbd9ce844d253b1ba71061fbd260539cadcf599596e1fab4628f0a1d53b9083b4284ada856ca159345c78034219081cac6579ff38583f9a248c84d6e380a74c33ab04fa90ecacc8ffaf35217b594457f501725814cd1fb9b10b9a2339b8e64c1fcfd8d47b262fc7df197d2d404c0b624ebbe842053f4af0e4dcd48168cbf6f6924eb86bf5f659255c3dfaf33c9b2e1efeaefd79a64b1fe7e8d491897bf9727d5efbf48560b8b9b51198333c374a1292c177f3f9426b95af1f74be44ac5dffb97f3af9cb6f8a62e9aa29cfea029fa9c53978bfd0389142baf62793a43575d8b9240ae3a21648a7ee7f25e34758520575e0e64eabee873b3ca02639c19660c700bd30500dcecc4a72c36699bb699b319c98471da66f2f0745d37634635cd98815d666c54cacfe8bad287c4514350550a47b96a702a4253a7d949a677107fd014155b22daacaae80681f6cd0c11225186b1678d1bf6d4b1993939fc650debf2644d08e75b57388a4227d92956526222e6882f91469c115d62ab542bfd974e442f114c94234a0205a5a6aa86d0c852ed45afca72e1fd286a9b79336fbecedb36e80343188f6ca1285477538372c962301eea22c8dd1c0cb70dca90c54eb0138f0c8e4a7919efc26422a919e27402a348e1204df4025fa2203204b17c31f6090c669ff0bcd8273a9d105d6bf463e7aaa139adf629565514c6a35343227935259a1f2dad45aa2dcaa129d10ba4893f8234d14bf4e244cccc807211c2516c6d5bf71436ec93ec143bb1b8008142a24bbc51b14522686a4624a20169376c140c164893ab172974ba5c628b76940ba655dbc6c5a7d83618e60287e1bbd828d7cd0c111c57c3fea1aa5c885c8844da8602b595dc536c1b17afda36189ca9aa5755d11491f3c8c5b6bbbeb215b003ac010b883980871d99b20b9003cfb6b7be22eea4107752f600444d43b5c1be6d7c929425b6dea463c4d611d864d2376a6fd1c2944948485e5e46946bdbf7e56dd82735ec139e139d97f772f09132f5f9fca3974323aed8a28ba6688b08273009c3df7b94abb2f48b2db1c55f5e484852fe7462718bcc643bc8aaa241ab1252be87141a348f3c16db55db067f8a6dc38285e8d5fd28b6503755257a618e726d2e9b64b15129cfe2746279d48a47e998157fefbd77de7be7bd2c2a9ee56950d467528a6d837f658b2d30d6e9b76caeda0c61d9a8151b354353f4556c94d8e2fe72db559947db84dba6a954aaa464db93061a68303111536c1b955f51e1a89457795110aa4ae122b125fea02cd410f444c75c8e72f584f3514c6289641a894ca6edf9dfb79773495377eff154ab45084ff64bd4194f4ee8f45128576b4c99c4d6abd32f89ad1a843e8aadef23ca650a89ad13139d7e88728d2f7d44b9c69219b18542b9c69320a44694eb06f7f4075df9b0c17a8bba388ceddfbff3c8acedd450667a70b60735e9317d585046175e4cecececd4bab3b3b393842424210375e31c4dd560d21ac5a4d1748744382bd7da681beda660a3d19a65d5045d376448ed66c0c4cece4ead3b3b3b3b7376c01e11ce2a55f8e222b8ce73f5705dc799b0f6b91eef0a439ad8e96962a7a7899d1efcf8d6ca656904b5d68e062ab8f934385bb3355514c3dc973f3330e7a78fb3050528406126836fa6cfcf15569fabac1aeb9b6bfe6442de0fac4f9e208492527ae39ba15dc8526504619d7e9672a6b57ccd75496d78a04055fd505542c28f84f9d00e06e11c67ab96bb02e4c0a3801d1ab0009c98a7f50068e0e8689654dd3260c0f834385bf408cab2351aa456ebb40c77a3f6fb12739f57b352b03109fb21597636a342a79ecb739d80d39130f8294fcd72cfc5f1782ecf656416862128e485c073791ef048d0698d9966eb5a5bb3b5f963b69ca8ac2d0461576bdc10c2ff681b9329140a8d48741486229188549a5eb5ae3e7f846d10da9ae86da0d3d9922afa42483a3d50ab55158db1352a849208656d7455b925381ecfe5b9bc2128cb1ea12afab4666b3a7fee4b0bc2484bc8f2a7f4669dba535e69b265c68026ab4085c9fa300464596badb5721d88647e06abbc72547539765c2d5265db4eca84fc39a494d55e7b635c3a7b0e206697dc8e2167296124ad95dec0097041387fcb40ae5ba01447d782707e0832a59452fafdde97f84e21483ef6808d130af3250015a860f2d094fca993038e03398f46225badadd65669a5b4a0c9f4ddd26aada5b70a59fe581fd7bb3de6d2f6ed71ddecb61a08671f4150c2cc6aa3882c517d9452ca89e5a98f524a697340824d7dc418632bde524743b2db88f36c0e268db433188a70fe26ea3e3924db783e202e7f36b9e9c816b985b56631d618636fc3601f31c698e69379f2f7d9a36d71a6cfdb72648bc4bad230b65ef7c11fafe330c623177ab6264b19eaec4db7f6269c379be5bced3157f23a1aeeeb4cb6488c31c6b6269c8fa59432265be4e36ddb01f4a50aa5524a276410295f261538caa1640d5a03bfac81e7065ea8b5532e4185ce1e15aaa2fc7542f9e3536a31a520b8c2be01c6050058305c5e5eac5a66ace02d5835ecbd778bfd03891595940a003354542d5654b80cce65a864bc8a8c16147f197c4585136145851361f5e2c3f04321d69e3560ecdfb2c649768aa15025628ef81269c419d125b64a35120a0ac944f48255554e559d9cc0ec528b169b8484efd286f19c4e3058ab172f2e2da2d8828484efd28e218b9d60279e181cc53fc6b710c537d59090b4e0aa15981b5ca88860b0562f5e5c5a4623128d8ad42e6dbef2e2d2a2a26a1186a0162b42a10f066bf5c2054f6d9b16bfd2a26af12a2088725595cb6ed162abac6c9b169f527d3455d54265857395159eda36701d3d5add86df36ee2b2a9ca35c2a6aa881b3e09c058b7f716951a9b058a1e2c5defc5970cec2398b2ac5f22a2c2b5a50fc59b86aab734ed5ab54a8f8d48aca0a151b35831a22b5a2c29f06beb26d52bc4a0a8ee29f82af6c9b945749e128fe297cef473931399198c41269240a81c0afd2921856a034af07cc3e11daa751ade5b870b4cd570942eec711d837dee180d3f1e8ca87f9e242cb513a5ff34569950bd9562b53d65a3bbb8f3b2710cea772d622b85a61c87bafb572278a8c92d97afdadd7972d944b9aea52cf191925b3f5f9dc949beb19e47a9673eb3eeebcc06c499d1cb3b2ea7fb7f48849c7bcdd6d6249e967fb9c16cf99812c55c650b27e20c183762b370ecbfcf556e1c67750fb6d20b476ea1ce48d5bcf60478ee36edf5ee23e7b4a4cb3d79dc9011a8d4a1ab520d018c231352fadb5baa4564896696cd1a9c9ce7bb1bc550459ba84f4e57c49a98f3977a8b37f844cd9e75ec038ffe23795b0bc7451b6d09f9b860378d042384a1d53c9abd0d5b8c3f6140d1e1c40573b9831e49cdbfeb7471ffdfbd21e7fe82593e8c3cf73e7009f764953a19fe3fbb001f2fadf83e62e7d7d9a0ac3307c9328b4b3e3afb4c7f917730ed84625fcb53e697e29671f7da248a3e94f5ff9488239f8f5c1b733ac0fe200fdf7a00da142fe71f02bb8bfbf4f00d387de0020f8f6bbf9e01689be3e084e8e0afdfcef6de84121880a811ec4c71f7ee813f49fcf545f347198fee3394c1fe239485f7f871d4ddc92fee2afa8d1895b9239c1d27cfbe0d431fa037d0f96c00ff4003bdf721e68ea01329f0ebeddfa07d28f1e6b4ed38b644a2f692adca137edef261cecd7b083de96fe694a641259d1934aa2fbdfd3a8a09dc3dec0d682c21af21d367cf047b5f27104e2ffbeb7a407edf1471e7aada6d28bdb14f690a9c4412f6e13e8453cc4417bf4e18e27d51a6ed947dbe2fffeb3d68af60edabf3d7e0fe6ba410feef10719109734057ef834aa1ec1f73efcea7d90efb0a93bbbfeb8fef7f6b843bf9f3f9b07ba72808ee9f88b02f898af434ece63764cea78bb470867c7b82406584aca7161490c7648d534045a25be3b2c27b1b51c7e5c438ec318e30d7fbeca602b69c7d9cf5b38b2d6768fa6fa87da33e011a531167fb6db147a219ca31dddebb607afdbdf3e631d68d0115df9e085a60dcf59bdca3deea5d63a852c5546d4147bacad766ef6d383a4f5fac3d3f3de4fb5ff117bba0fefacfe2ad7b2b7e26bc24bf86a056badb5d6cfa459edc51f19de62b16ee36ab5f6de8e67fb6cddc675ae9bfdf35b057a3765eab37dbaad4e6c31fe5a6b15614ce4cab5eeb5976b45616bedf6087d83abb5b3b1f6ded96d3f1f77dbec94b05f676bad8b62a25865893022dc8e0657848962b926f6d4c0590d38db2c67419b707e0ee9f4d112634925d018816f77777e9d40b7f3e59d25d1d63931be95cede0d4194249f7ab74e87b0cd1e188e320e59290eb196f4f3c351ad326d84f4a28a302ec6e2ab43796443624f278450d214fedc5aef0e67229909791e109a994fa7b9d6b5dbe7ba3f1d9ce9d0f4c05965815fe8f4e5ec28ad75ebdba7db62cf4702e1dc6223b3d98c82961f7fb6942e996f41b879dfbef570d9aebd36b6cabb2084d8cbbb6edb9637357dba0f3783c071ad8e7737d878a7138a4cc81625984458683b09be15df5a31be557bb92422899f3908ce6aa2ecf4229544a31089adf86edd276b6f4e70b6f991e9a273a436239b919d5e3058d74929764bb3b3d9acfb715badcfe753d27c83e9e87c8ae44f112bb332128c482c663dab936373467dd47b60b0d11675ae5559a29891e9926b28148f91dae94724375403d2d0204123f690843087d114091f3953888f22910d85e24ea320af9dd76887badd96889999d1067924fa73d6d9cba01dc2ba5ca31d76bbed0fdbdab12d0cf6b97970bdbe6cf1789e9d08031da9d5c230fcba68db804f2a89b0aaa233611495461b6d6d64b6331b6dafdb5d8bc87664a39dbbdd95482c36da9f524f8555d868771dc3604bf0ecf0682f8b48db062ce9e45a07777d7d37a19b1b1146533d9e28360add5ca3d586e8e890909080bcd1deea4c75195153733a85bcd1c6b4d96c567f9c746dd5160a25f246fbc27878788ac84a4a4a6ca6da86ded0d75b6c42b6e49221544767245b88884d902df4c5254817fa2646d4d48c36fda88bb6f27bb415ca5b6c42b6d022687668f0ada33dbbf660f93333bf1e4799476a3bb59a4f284fca39e7894c26abd56666668e1ca9d572cd88cea653edc546eade86e8f4e6da5cf6daedc7476f2dbb711434da91da4eede258bf402822931999edcc748f86c188c4766258a7b2445855c168ea07d807f7b3498492a696f834e6e1914d8ee3c257ada378a60b05672823a85855855d5616cc484c679b628f28269a89622f1126f6b44a2213a29122281e7006ce742c899c1c1e1c717313e4f5c245d0601a236a766ab65c0367463a7dd2886b6d478e74aab908932d38a25868e35c4b2c221a691131b33323c27444780891c62e17feb153f73d52dba9d97d8dcc6651d07668765f22b11b2b7265b21bb3bc073d3018ce101d9dbbc4e5e1e14190d72b899c9d9c8b8d1811b9a023ca442f6ca1cfecbe46d4d41c71b37363b7d84353b14e4811343b34263a069bbc4d8757228492a63613224cf49d991161b44d47e75e9734d9b81fa11f18bad03668cff93b2b84f94793df7495c3e41fe6e4ef5b11807dbfc93ed9b39f348e7ffc8f3fb3bcce0a21d8b9ef6621f7ba06e1ed9f61bc958d848d1413936cadfcb9596b7fbf89c6415f721eb3673edec75fa271fc5b3ede4731e1a81b29cf9f7f0acaff6f8c7f6a19fcff275b768a79d88e5f07d849481eeff9251a077dfb37681b968ffcf18b5e8a2551c87af6a996b1ff6fb265af5ac7ec286f378fd9513ac95f8d0357f9acf253e380d2317bc9f3b027bf1fa5637693e761bb8e49ebf975803df3f9238de3ff84f3981de5451a07fdcc79cc6ec247fb5885a36ef04ff914ce73a0ec98fd790e133b9afce9c3fca09631c99d779fa36ea0e438f91db39b3cca0789109f70139ec3fefd120e7e5ac672d3f61986e7691cf08b3ecb6a4f9ba32912f14ddc6a19f12df7c695d1a45b52b733ddad8785d03e49de1fbd2a3b1eedf19661c7ec14d774213e86203e9a2e1fe911e13dd2ebe39acaba6590aafa25e8f5413e9a3e106220bdbec63545bac789b033dd15c21fadab7ef83442575cd65aa58c5cc2c7b0cb1df22abcf76e3dbcdc6bb18c539518e4fab9ee59c3f2ce48987a79a12f3408399bb1ae95fb2d73dde36d7b34f579cbddcfdeece7aa6dd0fb185f2e557a4c6844962ee18f3e1f07e9f5ab117d3e26a2cfaf29d24fba54a26648df8173a7b76d7fcf4dfc737fcf7d2a5defb17bdb7d49df61eadf8f2b18323d3d71081ffff739dce06ffbf39c971ffc10c74a0767d7efd9983e3aeac6ec9f3f7bf4bae440f0b07d723bb50ef8e7d43754fa7c49531cfef1ea80eb76f1cec1c7d97db4ccfccfe328ad3fa9c661c7ec5e67e9560875807dce0727570558bfd50817c53c227f74991aa2cbf1a50361fb4847d06fad15c56dfc930bb2e5bea41d114a169d31ed9064c6a3aafb74a65eda4ca5cdccf47ba51c41775e4f5aae56dacbd74d9b316a17aa176a1824cb1b4111a56f3fa2f4b1ee4d5699da5cc4be7db7fbf6a37b0d7c8d8e2381ff5437cf44d2eb54912916b9c25f5f6e7bc3d8c6735cd254bd9313830a681da64b2552009340cc97b205ffb83ddeb61d176f96521cae7cbced5fabc23284228ce8bc4b258a68f52ced8f3878b2edebc6bfa9cc5ec7fa96cbb795851a210fe9f383f4f9f4fed43adc2ee94b8e4feed1140b5dd567197de09f4fa3d23d7a747bfceed1721db3d7e7317be539e67cca59684a7e150203ad2eb3d0a5122d227a06e9f673fbf9bdf7720975604a6440d6e70aba540203333d77dd9c730c47a0072f68038160689995fe4253b47a12463ff876aebc079ff3e66a3ee83d37371d3fe8d75a07fd3068eabf0d4366fec66574bafdfc360cfa7243a56ffc456a8ecf06d014053fbfa5d1550efd5f080aefc3d77b9cddd31ac7f7def7de67ea79de4b2de38574f859d710ba9b85a39d592374356ecf4998efe95b2824ccfc1cdb7b3f5ada7ceeb74fe3f07e7a3fbf4d93a03a3cb36f9c0ea1295c299ef61b7d749aa38350d25403e80a147a3a7ee9496ffafb5c6599b89d5591ff68228d38973fb469ce96415333e79c4924b869cf734eeff3043990f3e6c85b317dce395495f37b5808f38f92a6a8e4e82af4e08f26ad731cb771bfe59cf3b595d6cfd2547e0e04c19c33f82017691bb6db178fae32979bbe317b38fb7808f20e8a70f41e7cf0479a93848491214d4d6fd30eee3cf58daf83b40cd841744b9afa3e4fdac70ba0646a0fbff6d973b5dfd67bb43df371873e8a5032b5e7af3df3b14707dffb0c7ef65860a4836e7c0f2ed1c10fb3bcf13d78c401c0f75a3f7ae881dbf6ce0aa1ecf6f3a773d638c0cfe0e79cb597bdd70fee4f6b194ff469cf5349d114cb2c1c690e4d22f43447f8a0a74f73248ce8e953211206dc3a40f0431d7c110ed0832c38d2410f822f3b8fd943fea13d86af1fb473840f3ea76f7c0ffea665420ef2fc794481d02468ce15c2d1c6c055ce4f48181d9396ffd321bff779f4dfae0f7a9f47d232f93dee7d38f27fef6d53094dcd8f83cf637690cb5802465739bc079f6efac654e20549f4efc19f5b76ac65bc0773b867d57b1267d2bd5fe9de8fa66e6774e6c916cf0a61f8f6bb2ad8a05dd2540ef383dbf6aa6f803dfc0cda5ecf25af2b128eb38b5e5785b02b12e6789acabf63f61c269aca5f4253f92dc9fd6acf2d1700edae872c2eb6f51b7bf411099d92c47e96a6bc07f5e63caf8e267da43934679c45faf832e21c2048f7fa08d11528725e85322b3d942f3b7c0f2f38dd135d14ba2874b2ee894ed645a193421785ce89ce09bce10d0bb973ce0c6081c5458a158ee3666cdb8c6a9a3103bb709c131d143e50c8396721590a1e0a4a0c2eba70c13591ef091f11d0099048f88493c889c00989805ee08088846ae02e5cf0901051144638239c110e09a78453c229e1882df8cf6f51830bcbca4bcb8a14e72693132424242c5c48489c389d4edb7612929292c239b7381ad8aeb0d116fd818560219b108ee3b60db7709c13dd133e4fc8396721590adec9098c1022bbd402e59a9e27446b222424fc097b7f444027402261ea09bbb489c00989805a84421f0cd6ea850b8e0322127211d222d462864242445118e18c704638249c124e09a78423da401422cefdf36b104d26d3b63d61b3606132919090b06c1bcbc8b2b04461b6581212274ea7fd271db3b76d9f849c38229c84c47094132952a470222525c5c489937d6336b75bdf361c9831e06db3b6d6f9e2b870c3182727cbd4bdd65e0bf4fa7646205669f2d62597b245c690cf75c9a76cb1b6da39011bd8c006f9da797be07c614e24cc23e0e0e0c450017397ff89c14d17ba994e35347291299791d4579dbe4ae8246158c896198365bad01f55954e5f744acad1ebcf916cb13f06a0531100463d8842334410088164847c0085314011084198f007f0bb01d4f169181f10da63e920bcbcf276e4cf8b2c814fe7e2c3a3e35a7413e0361b3ae528b0495c43a7bf4929a544820d90707f6a16bce06db3b656ccbf9a2cde30c514e70557a6ac4cd95ae79c38594ace081a00f0a68eb1e18549902b292b2b4588f8718563c8839fb57d49cb86374b5ab2a5be874b5afd8675420f7fc6502e8472084fd4f0844bd0552c9c8546425a18055d795f1ff483ae461fc27aed2112cac222bd86b5f048af23a8d5ebcb94e995d2bd5518faaebfeb182f2509fdd9002753fa4d2f3deee89e9529fda0e9f5a5e8f4fa34b40daeebcf363cba290d5ac39b1a07db35d76181ee7d0d2d63bbc74d4104a0636c4a1203d03197a7e4985ea6571014d84689d13193a3c09a103efe1105d6ebe320930204214c3948c9a9ac9087b6e8caf4923a7828eec65c8578ee941cd952df2e118e214f4eaf3fba191d4157ddf39047c2d0373d910b306b24a1d7df9215f248557d99d2835e7f2c49c991a9fadbe7f3678f5e34554d21cfabd720bd0b5c089fe03ee4e9558745902d9fcfe7f3f98445901c13a1137a7da257283a1f7df42adbb588cdc631eff44925d1447242c912936b2b0d35dac7478b6021cb1a421eb6a26ced367e87ed93d76858a79ee7c96835e6da3cb0e59677238646a02a71fe74a452a5b9dce9b1acb23e03a055d667f699d5d85c74b58940a63c2073abb2369ade6a05a00580564b464e0c0e83ad388d7bc15d2e1bb8cbf52c7cfcd40a3ea654704f56595cadb2ba57ad563399fe5fa9d7acd254d6a7868f2fff2653c87d78ada99f1acec79475f5efb368cf1a1f5a89fec7085d01f1c902143246ae34a4177d481b77fcf9f9dde74ff729f2e1177799b46daf22dc953eb954fb67ebe8d1a2bdcb5478a2e445bbf4e136251c3fc59cb465aff1997d681fe6669fba6f3495955b2d9a164d8ba645d3a269d1f49c9c0d96b3c1723658ce06cbd960aecaca349a2bd35c99e6ca3457a6b932adb2bc9b1b9d1b9d1b9d1b9d1b9d9b5a6579b2ee5559da9371354fc6d53c1957f3645ccd9371358fabe9eea5bb97ee5eba7be9eea5bb57a7dfcd2a4b7e6a2aabbebca452ff26531876338e0b4393e93f95fad42c219cb9d5e99c399b2cd3bc9b4eebcda579b24ef7e8c96c9fdc1e354dafb3f5bd5e42388695262409517bdc88b0ae4e72f2c1ba3ac989bf08494e96c4e463acb59caaa2535655302e0623d35255d3689aaaa29f37f9e8e5ee5141c2f008bd27640cfdf3734e657937d5934918f1e77b45e80af4a13973fa9cbcf462e9e7839ef4992b814a58e7207b89df10a8c7bbb911895419691413771dc5c44d3b49b6e82698104b241249dcb27fba37df9b5596e82717edaeeb9a0f5f035f0309d2d3d745d05549ab40c2f008350a640cfd95a6aaa88401953e247dfee898127f11924a24ee864aa34a03dab693f6872353ed252e692adcb29736103b42519f2fa5cb08ea537692e8edd6d1a3d547dc46c4650ded904bd902da52777a0bf7a769425d5359af3f9adb70a7a945d0e86b1a4dd375cfd539dcdfebefe7839fbfeffb1c64ff38c771dea7bdc76fc3f368683aad6d3ed4daddac7daa798f5aab8144d5a91ed30747b71942cc1813b34bcb00f9534ed9514a29a5b5d69744a0a09f658b8d1944cf2183745aab6dd46aa3f22d5beadf7a6bf53a90e9775f08e7ebead14ba957b58ddaeb672c27fd460b746bc3f2fd638f8eb2e175dba7d769ad75522bc064fa40e050bb9d2ef371f874f91c9d22c879154a29e59c9c874ca7c6a19301e954e3087dcce9856e350ece82f50c7d7ea542bf1a47d7271f2dc0751db3f3e8a38f6e65cbfc79e405443ed1398d63abc07c54ef348edb270775ccce4307ca19fafccd0cfda3715c20677cb3b59eed3c8ebb3a7b5efd461edfa5d3cafa6d9f8f39a991dfdf735ff763fe9efbfa7aebf8beeffb207cf48f07e175dccf393f4ba963f4d7397910de7cc933d731efb5f62f7e20f63e10fb9f078279f8c1df71f8562965b545e8ff4c4d4c690e1cfc0ee441f8e83a3e3f7ae0776f4110043f081f1de441e8cf8f9652fade579052fa93536ec381fb4030bef7f1dc1ec8c50fe47e7e201b0fab6a3ef740323755d5fced3fbc9bd6be9d1797a052ea810660197ebda1d71f6be8355c91aafa5d4baf2fc25e6588bdd2eac955f83f74d0536d000eca3f5ed0f83a400fe2a00fc24707f12074fecfdf69d33db83f6b7910da5eaec3721bcc39801fc8b661fc1bf740f0f640f07b0f84e36155c9ef1e88c74d9ff987ff7c8ee3363e3f5768ff8573d7faa877830de196e8b3478654cde7ba108e522787138d01dcfb960bc3ef965e1cf302a3df2b822c553c6e5769350164f7688a0518638c3196b287f46fc51efeeccfd3ddd55a2b1fd114f6e1a58f2f3b748b758cb5d6e698efc38b475755766f87239ac2f6727fb90d5f1dbab75fed386f89bdfc3faf6dccf7680ad38deb73bc3312deb73f729f2bac57cbd4bf183f1e758c31c618638c31c618cf994f1334084d51578dd11b499d9aa2b5ca2174fae34aaf2f4f2feeb25096f7f4476f1c7594e64f119d3ea64674fadb119d8e29574f51fa825118d51942579762ced556a741a50adda82d43962ae39c3159bb43ad9206b51686943af2e768c471616832fd57558785703e107634eed07b78e9759443e538dac3cb88aeb0cdd97a1863ece998f9728e5cb742d0568dab63769bcb3b231c5d4dfbb191ac64a6c2d2ad8b6eed8f72480e05d8c29ce990c83f849867a841c3ff48f1425433b46a6880abb142c3ca9e3572f568d8b2c6ca9635526c59635659d45555f66d177ec8f2fba00ff73d225baec9db9cadb5d6dadf0450c4109d3e3ea2d3c7a8c7f837fcdb6369ff4fe8e79cdf04f537053a5d32d1a5122830d255782b3c1628ff25bf4285c66172f234aa0d2e9e0d2d2c2ca60a95aaf4fcf1104b83be31b54c7ebb7d8a256713bb75803d9becd955acfdccb2015b9bc2fe8ab52bd6da14cbadb5dcda16a38a7dce626bed46d138e85b17da060c8f86fd63d648c135f03552fccad680a9460a6e89a02feee716dee8ef1ddd97f573ef6318ae19ed8c13620fc357f6fb28fa067dfca5cd63f6121f671ff9971e0f39fd7dcc83756836d137508f51a8ef255a667b6cb225aea9ac39d3df83355707a19ea8346c19ab7a562a1a11000000e315000020100c878462b15018e46132e80e1400107696546a5a1e8aa328865114849041c618420800800021203433449c002a03b660de055c564c7a9a95f673f56a309b3e38eab283b64f58ddc68652819279fdb83ad86c6bf884cbff452b23538286d3f5047318486df1cf94af480910694884842aa67a62450257ad490595d18712187099bedb478e178d0c677ef9ff7a7790df579d2274d1bcc5e576f4e7b67a7c2f18081486833022439747f112a6c4da1b8d674c297c99f4a1947b78c07e52c8db33bc2510b0965349c6ae4a05dbd748226e116d9cf5a2319e255e7e6dd622cc66c1b318e082d586ec3f28f9363ee2c5b1da5cae87a5cbb03f019a3ce63d1337b7e73eca31aafa56e63ddbd55831b65891cca492e27d1f41f0cfd5324052be9086342f524878b659b20357528aa6945bdcbb3a506fce5b752517bdeb6bd8a4fa276a40885435b387f8df8229f4da306ba5ec048bb37d77b95286dea6b18e5efdb30d7a6836bd37bc59b7b1fd94113b77e18c05ce50d4bbe73e70f98a09b8e847b1755f4c79717228bd56ea5d203523716569c33180d0a94278ba664ac3557b044d3ba9ed9fddf17dd829f05e3a1bcf2039452798938a2ec898df7662c424c4bba44196de7170b3bb4c1cbbf8973bc93683e063e2b9601e1c67644660cc4b97976e90ea790016d49c7e37be6fd147831d23a9e78a7842d425c6ba1d5d48423a7e405c0c009bb8f8da80256f5ab51d235c5f07c252f3464caa318f4d1a49df0ea653ee48842882b05aa3eb2e70b6ecc16cc179e87f0715a9563a54955018786256a44fa87320ca2012ce640fc339334264437cf22de88ddea53b6676828629fb33aff7ee947fcb22b7a85f054f0b0b3ea4743943c3cf232a0bf67664fd606912186a759df295a4de00759d68f789d882f15ab92ca6ebc4046d12c4cb38998f589373d0f952ec484e648f33a082f9d71db265c808d275da00237209f6eee919b22ed3755aa882607dbb6a71c8d7bfd7880c9e98e1e384589aebc4bd62e66a80c2f4e4adad156d220717b9ea83a55311a5c20882a40e38c50c0e061c162c08b99f491ad8b6c21f861498a1971a552419ac7bc002a4387e2d0ef016c132610d0dc8565910676080f355c12981ebd4b2bdbb2b0450e0010badea4b1491b7179113371bbd7eb447ef5a03ed068098a10dc0753221c011b67103ae538f003cf1419b02560020100b4c00ae13bae758209a9af8b7689cc9bd75d431717a05ae13b118fb8ac74edf598d00042813ff9df64882e01a6291c9c1ad1515766920b84745f0e838e0a505906a68ee51f2a65e4db5ea7ceeeb844dc77bb4cd20f1530680ebb47b10580b46670ab06c08abdd1dcb5881bf1bd2d39d812105bf1b420ef92ce10529da717f6b10438915040092fd0cd6bdda692182d752516db10e75b3ef6880ebe5561ea35fc73719e9cad5749d644c355110069a0544a8bd4c5bb2e4ccad72c2acb0b07d6c1829fa2b4e09fd47e9dee74e81dfb351e23af34c9225227cbdbb9243102343f3aec242b1047881cff97d45305dc328a7cf5c5760eb7fdabdb2a44c4d68c74c0d30c9c31ec5038bc69692c083587688e2b121986185ec6694fcecf1677db9afb018dc6d13f3f6d03e4792ec3a1552238377c54cc832b9bf89a3a4aba64817f145876c71f3bf46d1630f700f2705611f7b09242424431c5dd54a7490eab1dce5f7b09d34312df79cc8f70fcfd17f5e6c309b5da706459d6bdaeb58bc31de97c8f48b07304308613ac4705aca3b1d148720dfb7f4d4817354c0dccf86ae1f4f393ab23fc7e7f480a717302b1c929be4117aad3f168d5600b2ee26a74705af1faa5f7c4f9a3fa7f9d956e887ae202843879bfddbc15b1d06895f257dd2b97e488527fc3610397dbda11e6993b8679fca3253156d2933f567f725e835342202ab3ba473cfbd6023c048b28f42ce6bd8eb1066d9c04cfe6d6efef2d1facc69b265508a90ca1126a741c88d8dac0ff2b30621a125ba9d28b1822fdfc64c3dce0db8824f57b9c8a817ff8de5eb342dfd0e74f075c6318590bb65d123d96885a93a22b083fcd413ea2bfd1ed28f8a2b7237a14548f8671864c21e9ce2cfee8d071de6ccb393814603573f182d32b0136fb661211212dc6660274825aa93763f42ff83252a377214f4d5dcd07d1d71c7bfeb0edb6276660acbf16bd61e1e9ffda4d44e9ce22f2427227b1d6353d1f617446474789470e24b5480baadcc67fe3fef900ded96b23fde6f2eb609731833874b685fc08e7d352324c6da08cb658241545706a0a353d9e8ef86e875ca1f9fb13553784328bd57c495c8e4db96a730d6e0735a7545abfec373efe4482a3f5b7639d8d8329094f8c71dff3e75f2a5a7b0abbb21ea64ab7c925d56117e61e96bc1e970b6723f79314de51f594ae3690287f1cab514ef70c8f25b995e05a5e93d331f4070059f796e45858e5c9a741a3667aaf2e670314ded167269137bdfb780551058605d8e989588cbe240b000cd9b4f17075c01f718d744830d77db16e208b3d22479242ad62805fa9cf0d9e659917662edab75d4b19480252597708bb6b50b4c2d30fef2c25872cc94dd3b2980000cec287367da7ea09935fdff40b2276145a05ba5490bdedc70bdfad60850023a00e3d1ba528f6f3ed87861571d03636672c0659a1978beb5c65c939909e0df9e5e808a6fb7694fb83dde5c764ebf59a857cc988ee38011b2d881757ba4addb4c585e931c7911f57c34e8d15bbb61a62cda3debe7c97340b59c9704c592c9f4cc44607b1bc4533cc60ae8a2ad5b8b96e746d464f8fc75c45c41cc8df804a574526565e1a050091a17a1dd0d9f8fdae2eb40813fabbf5dd35228a3f7366aa025e7ef2e9cee0246e0717001f34f4eac51b3dd1e5974e4588c5281fd79c083aa984e4fbd3f70a25267cdf9ea8c8583384c96ed1c31a46c40323e8140ada594c49a45ac9504ee01b0af4f57a85c9864425308137f900718046a0de8cc5311d6477f04378512b69f0a090f0c8d60fb304e7bbf7dbee3ff50f699471368e051b494b3f335bc40113e07d8672222166f75790949f862b91def3dd3945c88de009bb9ccf5d11ce9b3f36bfb352d42b232b991213cf72b4bd7afd6a98993480bbd9cb99704c7ef20d9e7dcea8670fa30c4c970113f0eeef377187d2847d48dd7b4bef0211d490c6be4cd7389fca780c15d0a55a8ac8ba700d0eb055b537e7345b9164e1fd320fc3b9b179ddc0947869aaacc877f4786b069199e38252df415c127815638f4bc2555bc09389126db4cbe7720935e004eef9d46722d0a61a4769ef5131eaf0d1dff57d2a13cf128c17c93edf8e8375ddd70dc19ada0e6bd4addb4f6834a8b6fcacfb84dcb01a8dfaa8a9f5052faa1d32268688f2738feb579c3811edacaf6c987705d7bf0839b068202df4eb9d7db3e23c317744db9384ca521e0f251bcfa943df6187040d987fdaff72192ddf56c7ef5e1a9d6cb454fd5eb0cc3ea91942edf70b787afd92a83fc952740290b38728d6f1c7b118a69a1d7747c6a03a77f422003e9cd56880941c1ca2a34b59d7b3658311ad7b22435260e03d66ae880b74e3f391bf00ba72d5b77452ee111ac263d5f8d6a94a018b45e8e3a042315c5e311488d00f9183f8cda34aaaed760b305f57799a96757e0984db093a3143802b3a7379db4094ca9573d9c6d4b3f1a6f1b524231f6ba98698c6c524c7d65d22ea5a650ead3171d9d9d25d51a5790396e66bbe00572a7e8147b2ce6de19f34f46b9c41a2035359cf665daea64ec68ddfe5bd40e75c6b3f36a2a32ab6165d40c126ed0ca62b9ab44f128be6eca0aca72f8366b5ebbedb783542b7dcb19201d7cfb91bde531ea40a3848ce1fd94cee32809aef990bc53467159a63eab27899bb49c1a3322d81364be356d89717675b1051b9d11e26fc032ed9168ab05beb8600ff6e677cf31e7826178a2777ade9875c32bbe5e5af266022856adcd9d659f95edf79fbfa01a0bcf455b51d236d70e8db9d8259d761499922b94c32b22fa96d8173f504487578b8d5eb4d4c2bb866be41c70dbc5e1885ff0897999df789e9fd871151c666b8c947195d2c0d470ea14b86f39c8cbeacb5fa362680ae8e5f858e2a5aa72d62a4329ede567c2106b5d02fdb54af0f413618faae0a359a8d9dc64a7a1703c56f215469139957a2e3a33ec102275628d91ae96d4ee54d4e2e0ceb09b0403450fa655e353e69c32ee45659c898483dda809798fffb2f4dc72fdc809e41b0ea28c144d4f26702635c20ba22b9af6249746e20b4c1bb401feddcae792c9020af0934eaba7f83d44d1444e41be4c2dd3d30492b4b1133b202871655a50f428e209a551c78ea567466180276e716853ed64e23b0a46067d1e6fa69b84bb4bc1b4b9e621d3e90c26ff09be3b86f1d8c9bca281269ea0956dae3958fdc88397c1799ee7cd39813285c3978a84f3312d57e9264eeef1c522e44b036a9d44ac8cebbf4e12437b2aea6745af3801f348790da7461246c34d0b315a4391ab442c9d0bff3fd13797176f1c0d21af0d49e7cff6f42d8b992a70a01f57660aded7055aad028084eb08ae504c22d37e89a02e03000220d9bf94fb17219309ad5a19f248025cfc7ec0c793dd8bc9a32bed3f5eb27f6e896b51c8996c62822f059461bcb19d5a8365bf52e7488b7368d121448e497ebc728ca5ddfbf44b9cfc7c25a8162790b663160ba5b49e7fe696b8b0f8724d5cf97f58fc3e89c512920591ae1f5b8a04d6b3743b78600fde04a7a53fea3c4de377a2a3971fab777e41daf42a9570c2954b26554771dc492c3d6b906c9b606b25c9b8beb71d053804bba76a46c09f4c39662dfc83bedb7b9ae2accb3dfbd88803ae711210b891a8f9dc0bbcc1e18b64a2d2039beb62df19267c86f623a1918dfcc0485549abb1b55d0c9f694986b92ba8d4be320b4e4ad7a37a0aa3824e3685fe6723306b188e0f2e1e661ba3f6dafc517838253b82ed12e99493139f4b6e01cb0061baa108336a8ccdef469eac0123b828ff9054fff9ce0b0b2e99089e10b1467e5d02236cff80bfab757c7a34a64fbdddd6d9345120c6954d12936fdcbe8895fa8a7d676e505184f8c5f6c6b78e38d4755c895f9f465a7ad2114aa004a1e05972dfe59c0674b97603ce80df2e5696bd33fbd59be50fa5c48c3632832406f2db67265ab65e1f5cc0753e3af2de3ca43a959aeffba41fef065f1c09d004bda5ea35bec50a7074a0b48dee43a59e0ec0d1a2c94168fa6e7cfba0e3a34f80072723453bf65b1a4f11a658cb3e18126133898be3f26cfb4324de2f80c66a45ed0203580fe33483855a35161b2e678a9309b310d3d6ff63c266534655543c90367c7a34de6498c496814c8cdb7f8857b701f91794db02328bd9b240a6801d1c956c70d655675921d04e4c4df6139cdc999cdcb43398c0c2664c888e62e60080f8d47af2872aaec824131e77f465ee2e0834d12d60c0d649d937e222d7f2d3926e2c35b06dc847b139da1755b2187acc01585801ed5c6f71f9a3379bbff97f6f7119d0add333744933ae92596ba4e69734124c6a7e8d58b060432837258530a4db9ccb407c5c4f3fea92396fb21eac4f849f9af540a23a3d4fb41e6c4ff75777cf957f5e2e195773d50ba52b02d368276cb4b72b02537b3e4cbacfc51d39f9c3cca91938b37e02150de3b57e662cf4355c443c6a372965f2cef558eedc32f309146070decbc3615607db18a1679310f0fd91ed8c6951916f19f7ccde8b83bf53beff098dcd187a72a5be2bb3640d8583cedf380bb08c789011dbd03172d82711311bb57ff2a4d005e650f05c4dde7e99c9e513b2b517fb3563c729a189400a1f2fc92941d802e83a9a5f12b7b7bac7e6318d763e3b87ef4fe7b20ae8460be65a8aba25f87cef9202ad116947ae6852382bc84adbc2cf648c295089de9904e094699c02a1a7b3a821071edd32273468c84bd1e15de8bfb0218f16e164118d8838c8b577e81705a9c49a6954145d6d7fb78d060a68fb4cc2833a6d531acf8ec0c0889c277b724eaf62772e1f282fbda607d990e04d20582341d430aa3b13dd066a996cff0e14f4bc972482856fae110dae6807b856baaf00aa00ea37531f653366203abcd000c29484d095b8cc9d63a0694b840e0c457aa4295f6145f7fd4f490064ff79ec6cc7bf11c3ca2b7aa9539598144b5ea22401f0f8988924013c956c4cfb94616a272ba7415202979d508324620a7a85b03015a01cfa548d58b77102342ce594a54257b0622c0f889c0af6e321e9870c263ca23196739ee399d65e1df28d966cee447c6d4da33766b78076e9ca4c4ea383ada7e52701866f8eea3ccec76c73a979763e3a9b6113299ab43d9cf3e6f9abe3ec4fef0cc0200c2f3cd467244a4b99828b7842d3920573a9050c6c20ffcd9b78b18a8a4732830b558e2b8e6add51b7c4ed3a51a9ac0898da02d206245d2313ccde73673d798c17f69d9329c91bcf528c3b57f1530d1c1a8b3cd0d99e9f601cbd970909fba5928f6571ec478f818b32fe815ab41332f1caba88764db00ad36b10876630f3410940fd09e89a6b6d94521351be067aa327bf9dfaf23656ec40688f6f2bc08f3c62f6a2660705fe34038c9dd59c2b3698a29b1870ad375866c9cbfd672300fcf86f1a0d8d15b7eb296becadefd12f01856abd08b5c907ecbb89810f5a48d786cb4a41fffbc22358ab9cf278e7674cd05600c6fa2d3f088c0e8ef4cf5fef7f8ea4ff5c68fddd456b1a264463b6e1b800c9cab7f5e8213834afadf931d28cf7cae6324fdffecc6e5607e77fc4ca5ac928bb0c99edef9abe67d17deb12df8f09c46b5024232f70b8d314cd7c2abaf686607595ad774c64c52c883ed181eb7f0bd535827ddfd6dcaab5d3bca80cd3afa247de609d67a527ba2623234428f86db06d2823de9f512416af359801dac72413dc24b6ac1513815a9dcd0bb71dcd6f86e9d064dbde7c9472c225f15e79b1dff7fbb8db8aed721450f187c4efa43c7cbc4cf70b3b5b291f59afde7d4684271b7786dffbd0de6ade8cf5d4300fc95a279e4b98c91a61a773e091fb7a46968c89b6e41ab94a7a6e720586b0ae2dcc336ee96f1c65dbe6d79ce77b077284a8584e1e2f80324ef65de8c12d684a2ed8db0549fca610e24c5975fb64943412238adc66570e64e3ca8e059c536de876cd7108a47422e62e2d24bc3324ba781d4b1545237653c35c5b7cf4e483583f9d515fc5eb0563e6b85d806068ae88868febeb0b8e1224b85886eb874873348fa07cb98c9995c65d8d57baa85b79e81c3433f947987026515d3c457e7fe6d6b2912f7bf8b74525d3529472e69da5b697a25659f242ab376ef675f71c2f17d4b92f0d9a6eb0cf6ce211346dd76739247b03ae376d4d4eb89c448a991dc616454af7edfbaa029cd63ce17cc447a887351788180cca6f07a3a9201ddbf8256c3a1f627915d002ba71363bf3873ac30940f7f7bfddfd3c770fc835f5e12d52bdb11c90853e6ff443979de7d23bbd0f3b6624a8dc3be650b2193a26f53eda1d7a250def066ebf6305e90dace1e15b10074984eb88fceaa44def7408f07a27401f8459abf92e39580328f7a05fa3130e6bbe13c24a74f422e2a32702ef06f563ea0e5117e8b10fc7b1dcd9854ef1b376ecb1e7dcd851038c0be82a43e0e1ceeab35d544d70a406163d55e2e399d993fa16f4794d3856464929c8b97543f47a73478f443849df055a7fc0df3e6e33065757592990653ce918e97d6ba9455584b900c2389009a6316c48af5f6eb057c1d3a9099d6e68b6e82ac6e7be405e8676096c52bac9de19f486e660a56bdaec884437c7bb617c84e5ca9ec1f560379456efee1a3cae58ff19d756802f174efdf4e833804ea6e89a66a3f0cf9500cad798bd347c5b7f40ee3e011c51cb66a1c971eba7e883e2248781752db6aa5de22b0e777c9ba51ae8ae410708acc2798f87d434ecc33bd1c12055d9ea20849ed453957ed1e6edcfff74c6466b97284dac2acd51169ab23ef5d5d315064ac88529f355804a42205978b7d6109e445823da995339afe4e280fa3f96db56d1cd65c4c5d17e6e3df862826b1612d9405c2090d1d5354b1b7723d56078cfa2758d77a221785d254924d1fc7688489a6623475369d3625c6555068446740d1fb2a9d17558c72caea6010a3282d8e931cc794d8377dcea1770de5af689796e5a3c0c37afa9b7dfb0681f7b65a264c82e979f5797e51573913c2ca21c0952c314c6c13ee2874da4b8b350b0432546096902cd45c90134ff90bc05290b3811e3c747b19eea5ecfa3ae9fa88a51c3169e3f7753696717547ce304c11e4dc7914c844b1e4aa55af07ea6e5c8e81db720e1bd6ee9f721fb6b434ed3b8bbaa53287f248c0aec2a9cb92dc26572b6c49c6b71c3c25bcc5b933fd4b3c44b8f261d45394a83f0119cc01a024a53a8f74c7f9411aea48dd902307bbe70dc6d7097854c041b9fe19637cd7b8d2971e3d62b5dfef20a8661db72e975c3d7de0e50d40cb82e84c8e0a0c5147e5a1f923ede4093d9a30e5a53c870244c2090b737fb5a7e30995b139760fd05887d5383fe3c1e90d5cd6d6fc1b80743d9e85ec36b6a7da81765a40b689e675d88549fc56dbd032f130c0e11ba4590662e723f5524579cdcb3df6a18a0421dd1f5eace72aeaf847a3577f56638caaeacc9e52b4d6fcf1541f9cb6ad4483f937730f5a360d20a7e59a26ffba15534e2f8c0a65e87a6a3e287f23a86f68aee1d83f7d2820268876c75827d87d07755feec891c5c2c616a775fcf8e1c13e42624f1744d7cb117ae3dcb8a484d395f4f775b2d1c50b213610131930aecaac54deb8e3049fc7c32ad9b214e3daece5239b8d4e9dbab7caa5058dfd879e78831bbcb1d77fd575e52c9ee1b8aca523f273856c35c0ae9ac16331b9da25512f026c5350601728a874ddc89369e71cbc941488ae9ee7d70e6b85a36a604240309991ba666b96e6f32b4a53a955540602135b5136f43639597485606a1ce46ae719097280104a0124ab62b3ca3923f1a162463364361f19a264c6e48bd83f17ec0af63b13e14e9c85d1d4b9966402e47870b19123538cde340a2fef47c64cade79754a305d5a17e8e585a7b292677593f569f51134de568da4e7f5c2f5b45dd016140d96417be4dc325dc133d4e7ec4a05102b5936fcf65a5de4e18a22bd4a9b1a7940a8829f513d72bd66528fd334d09ec31641895171065756990ed0392aeb10abb525e532c2bc5aac1fa8d4156d93d844fa76eb5a949ab1abddb2c1ad023c67264ddc86b1d7853c737ac8e44fe86937f6b7de1cea869c95229ae56eb2c0faff5c7603ddc5f057cd4fc0f0f7dc093f2b770a499b499c6e3ff5bd29500b4266dbe9427538c782b1f03a93f97a75f97876a835712821b6d2a6966bf37fc9f93fec83515635bcb43758776c03d1afde66d35f5588ead5f9b1ac66ba5e757d59ceb0b530c1932d6441fe20b45411b10b575a6ec3c376e4da2aa82887fee9720ea35f09128cdf615ae07e5c22c9832aefb58b689159b92ee848bf1dc74eab983e64f342801c2d603a6295f25c2196dd7a369c76a9051897c5b66bf66ee4909cbd1db480395c4a1b196d69db4dcdea0efe8c78c76339ece10a15af88145227389132563ffef7461a90b5d354d701dccc7782f44d3659ad0a9b1fb28531eb69616dc9ffe6deb2116327e00fd76158e10b8e9c85c59a18ed2f4d6fd7d6baac282e0a8ee4c5b990e508302e0d67e8d5260311fe6581dcf4fe6f7a1ad45e93975f2422bef31f346afeb225f2d212406c14e1ac2584ca4dd937beb61187f73ccaca25912027ecfd5ac2da28ee593fb3a650d6623c0c489e3d3c1aee3386374b7277476e6a70cb041d50f5ea2c9dc534df0ab0bd33281b8cc1965b024ded0865ae539c89a5fee47c77ac6391637e5a0160273011efc2ff9609ce5a58cab08a14e5c1de3b47a901c327b6046a91343db45b7969733ea0d50a4660f80825a3e7099a6ccebcfc4a410b3c7b2fba9c6d54e17a5d180a31c5fcc63dbc1aa940fbe48238136a002ca92b0906c3b574534ddd7ae2a8c80929c7a3688b875b185515138f40cf41e6891f2d963c2b560ad2d75ef6764d05ff162ea60b0e20a7c95f0bfd4222dcb4b900ed6b5c8b995dcdb720cb217fa815108b1f5adc237df5ca82e65b39c082bf10ff89f450ed140265ae214a000e1da05d71e0c85f697153a2d8f14b8356741fa348bc86d547bbcd83c4b15801138fd149a5a4fbc0e302371afbd74c3305e349d1079db4a4f5d16adc0c07222ebcb8cdb473e659462d989f297a3f6538e9adba5f93e0fecd520f7f4d20c028500cce8a4efad8bbc5e0c0261cf868fc7405db6d8fe8974b87082fdf3cc083999ce84228e8936465b4d50a5f086bfdb09673465f5974b7952fc4e8b14053bb2894b1b53f531fd9bb8f2339f307e4a58f6177abb7d3f7a6f82bef544b6e9749d9b3812ab48117169f15db70ce286392f64064ae756e7523d40625bd562b0b734ede072e93ecb6b56b24b63dc1391d430c8b0e183f691cce0b63845ee7edcfebfac70f41298b400260dd09c6db1f862c0384164f0797b7e97d1e5233085c7cbddf6553b6acb71496e06b34350d2a0468ef3c3438d7bf767b634a68a6036e432ccfeeb0d879dc8c07aeb54e0889d9c9e4888b371f635349bca52e8968a7aea33f891552db369e355017d6a7743ce4f6de3040974d4021162cbcea47a4e36571e08b2f6a67ef18e5930feb0ad74a0e8b5f2477cedfd9af4f71f0cd514d9681556a5e2489ce376079a308d5626c6ad3300f57c972c474a8b58c8644be71fd47410cfb1bb58612879a0073df604d9da241047f8a05e7958364bceb62989d40d504eea2c870a70b7572eeeec197fc880ff36a4047d99b3002a7d8f874dca47ddfdb0af6c5625f38dbda9a19d3abc75b8cdbbdfb8fc972cbc1c85b0d5ec39c89e3825d7fec53f616626db2dbcb68ea161fedddf276f6fe51a103227d3e92deaaff46cf6e4c7e23f3d6010782bd7753a6c0ea7d1440dc0234882ffec961b451c241eccd1b0d182c99f11e3d9ee43c6f288540bb5007fe5ffafab12f6f3336b6c7ee0906332937628d26301e66b870019224c8a132e85db9ca382c92562c3cc572001fa0de67731be5f7c0f77b517fa663ec991ea56e439871b82f937cf0961d8f1d56bd2106988036f39d740dec3ef5d3e6f6746b4d8dae29737fa31513b4999f843bdd3169a297b7f227d67a57dd320a373a6c6e41daf56e37637fed260542de5be834e6838f826813337498a76bfb00cb0164386ef136ba430f9236efd0acf384da55e04761fd92b7d6ba4fef16e28d49dc903648543cf90eb581c173f865d8c01edfdb06fb45e09f7967d59a11bd3744ece3eafd7ea3a9defa57440e4346cc70cfbba9bfa413ad00f8541875fc7025b4adf9d489aa3783f752884923261326c9e9755cca51f523b68972ceeb6661bffe18a78aa2c4fff044424974420e387091a7b7e70e26ef49627ad517d86c6c2d2dfaf90a70eef4cadf572b80eac3fd494e894f0aa62364a28ba9e8927da30cddd91b376448cfd7fcbbba9c7651d469afd6e57b1793dd258e92cca9d03a2720ffff867064b74a1f8c36f055114c25314140679617fb4f7e030cc5ec86fbe2deeff69c35ce446a8efc2d5bb9c05c8dbc337373f3e8663720a198dc14b9e307198e6aa5587474ec0ae41eabb92b73ac77033bb9491d5d8de743b605257e896748809995677c4aae67666be89fa84c2df2d8a13c2cb107fadafe768129ee14288d3ea33cbc40b4ccf33d8b7c726611a4c30bdfc36509ada310fdd977cbbeb07e011285fd279b1f6f7f4712944ff16f383c8a369216c37b3dfa857aa81f9896eca34a656ece65f3a3b5299059692dea1a3ca1fe46662c09cafef335f2d2b4238d483e23f23d06ddb0b728b6fb138749a70978866f3561543e7500b760ec9d6994308cb7e973a966198dd3572dcc1a0d014868fcbfca3a69fc51ff048aba7388a452a1315de00b184ba356485cd4d8c5cf0b2453628da67eaeef2c35ce062292d371567a83083b5498ce5319824e28e2e5491be6bbe083737ace37b63537449d4c288c4e0832a94eab43bd733ac1fc7256e5f16d62364187723f46df7502ec674505263631bda07d31866cd944bdd3d97a63f65d27ebe985340682b49eb273200ff9c63f3d3b29e69cb719dc8978368ef8a9548fc9ded930632cae638221c54a7da971f684d37621e0c6faa8874ce33996db512bb57b8f0bf2b54d535083c6768cdcd237f361303de324386ab54d867fa1d0bfa0e06b5c6a94767bc85bc68e5be2900ce92d1c6821bdba20455786c1bc7305e7dbf2f6153b5fad607a8106acbc36484588ce545edf8a5257b62439781c56ac4c54ea65cce7053ca4a69eeb479b47c729858fdef1f2040716b157f2f4cc669b85f4563b3dbd98f138790ebd5f737a71cf96b546ecddca06b181f40d05d18d7e86c6e18da93134e6d7c00a051772e8f66b39af9dd56d5931d7dde64f735e3531e92d56cf0be688c7642e29ef7a19101a570f0d166690c8cd3d0c596749ce25a574fdc796e0b797ff90e75603589cffc668b82d860080f193141c22008b7f45f6774205de2859f3dee5ff2a8e91635081b31c8539b408bbfadd6bc19caffd1c08234af16885be021d1fc92a7f6a9ec4dd53db32659d411ce97b4f6ab7f8b2a164c8a16ba20b3e999c6db71bd97b00d3189fe32b40915b2acc0c9f608b72c47481a8315d8029238867aee4f586206b9fe14a9ec363cf98aa0bfd2f3888b180b624fee7ab34710b8f0eed74546e6dcfe0973b15459aa0109aea7c6fffc2333d4d7eef4e7689b24c17beea2c15418bdc6da26e06f280c524e0e61601b636f28ba6629272fa20a5e1e97b105060e18c10c440e38ff4f4b4c242ec977fe8b84f8da7b54dcc0f381be633521208d160865725c38817e83021cb7c6191a798a287e70d3c3cfa80c7df8900f368b84c1db299665cdb5db66a8d712b9b50727dc6868f49e3f7d74a889d2a031c8dddffdd0450a332ebf3224273dda2f8caf86147c4af267d19677cbf0a399dff8a000142cf847897654e34673dafc7f90f76c2f2cd0b3ae48f29072a6ca72cf68e80a9930203043942e93438b115825a537761d3c4680fbbb4f2261090b7e86bfaaa10390848796d05f429c0aca98fd95e8a7b84222510a00f484f436407f23e65eeb95858d075effea380a6d8727a4a0b7c88d228fe30681d06e42aaf1d57344611ad085f5ae13361ad9fcbf0836318107417a16e9b77309d2f2e5a17f343404f38206c4a189c68e9d31cb92023ec9a1c39443f8e4ed9365ad69b6ff798590405663dd0e79ed087d55ee3410327fa932196311068fcd9a52681a040ac5571e820f10175a803932289f8f36bf41271c800d7d467e820815e71aa8a7ce06fad1f3e6462b397a74804db49e338e8a140286a2ec9bc53de0aac83ff96babefdfb50d23fe5b140abd3c2e36709dd67fc5deb62fffb9b025f3f0506c298d51099b2e615eeba0231f0322e627f52e5b1f06f863d1975833daf63d4cfb148cb3c9986923813e9892572ab90d3f7af881141083626f2d0ad0911d4b8f229d907d07468dff264210a09da33ab4e0747007a3aa80738c0da7d1c78ef62dae70ccf23ae2d04210b5a91e3d4e78d20cd3ee041438c24b14284b1280fed122e6edf229cab239d9c167f0a9bfd01935f60eee5ffea8d465005e6578274d233432241e85b2b411114fc6da6ef9732ca95a41e3005585ada52c90257b11315231dd9cdedbd69ffd6a9282fc023d012444856aa43082625d8f39ec0b829dc334a3103fcc1d82eccb55ba67d20b2e74dbb5b08222c6f4640d383a507da198a27944e85bf3cb393b71b9da158bf9c19fdc55c57b45a77518ba8d6576b53d0299be67b19d7079587fc8c4e261b89c0078ad0c674f8956b55b53a93a391f935bdc91164b94add6ab4a9e91fd15fc800286eb6110a2c098dd375ccb04a578e453c09064ea41ded6133afad219c335df975d4bce5710a35138d1a6030e660322bc6aa8b6e6b04aeb84ee4b18445fe332fcc9a8881be7e76155c5e7effcae45b0333cd149294518ce8ce907fac98e0ca32df8388877d242e3415a2bb48cad414d006df127aa47b462226fd2a247e908a3c8c3972073e3885b0ed895ed23c3635de815ebb2984ed75e748f7df02f29397ea3d2a62efffcd8e5d3a1a26f0ac8ce1718f4d5eb336c33845d1782d8b7f7a1d0a08da02ede765ddeabe867246f416ffb978199add922208fbc249677290cf4a7e2a0c7f4ade52fdfc63093f68b5a03c214d2629ff50e50ad0b91b3014c389d8399e84fa9d1cc88146eab7699722e4bef97687d60d8169f504163ecf32f8a1468ca392fbc0889c56cd6dc9674b27b43bb87885dd86f58bcb668fd72c03b6411dd8e2693dad220b63c8d46fe1bc18fef1243576b63f1aa71eb4464e06ae32022e7cad3e93300216a258fd512e7de6ad665c210d5a67b3bb6521b4282664d86ced05cf6dfad514cecdf7bc70c26e5da8e9d8304a1417f53f271d1cb54dc6dd31e4b151f535b1e3e4a624f47cd65929efb8e0c5bdf609a055a923d7c77e3bf9764f25713f8bd2d24ba37168a4e3e26fa28982ccacef1b544963ebc5fb133477ec2fd45d10b28601d60705b2a8a1c93aecdf7e5b22bf5e9f9a2187505975ccb12a9ac598950fabfe511b91f6389c43c18571944df90cee281599143632275268d1403143966ab455c02d5d537f8e208f72be0d73e559f0980f58a2ba20e21922f15796f0c4b52f3a94e63f1c06b9e85cb41e2e67558898bc8b2630de93583eb5b05d7a1bc3878e06b956d09864a209348d00be833356ab8a2670e66b3e4e3d934dba206c3335d7da8a8e5d9bedc1b12bd10e73c047528f4a00e2e8c8cff3f902c8e9bf1bda8003a80f27dc9030e85a914dd85428c004c565d3bc4c71edb556e99ca8092392c33779422f1230592c34d199818f1af0188199766f144297d15190f2f51782ded57e86d4bd33eda277b18e9a7443ce2bec2068d8938435acc98379942089c58304d23de42df2faf3330bd768a06a9240fc63476470f547b4627e1e2f9439aa309eb5b250a50c6dd89e69a480964c849288585a2928650008f6bf9ab305f8bbab8e6485e0f1f6f09578201d2dc2a1437820396381766a6dad4a583949d2abda127b444c741440857e5b343736469e8e6824784425d88c51801b63342a0bc2f4af28bd9be868aa47d238ca05557c576d771ad81afcf578dd0bb8c2c2f1e6088705c66e9477988499631e4397e5975d1d6bd92c4fa3487bf86296bb34d81858e9f1d1206229158bbe10ef974e073990bc016e7f0982ab57ca649603e90cae450c3be0093900ab047bca0ec210da014223dc74108294931335eb178283ad6f6fd5a88fb4bf012008aa204974cf9656230431e906713c83a0b04aef3e320ad2294547617a1575e17d58483b67084276a27743a44b555cc96b6e81d21d98f3c60b9e8f18f3fb2c32c46690d3fbe903608354ae6cdfc7391c396a075563295ce70cf94990c44dbc0b2b65a08b7a411762b8398594b1c425e8b08a6cab62e2441bdbe57fad6ea3e1e1af6475d3bbab700e62625e50fddb4d952358a322bbbbb8ff42a81f2b0894832863b59ba903ecb81c48124f6b3c068068d3482f4ec412de32d98fd15842077ad83d4a19920856c5922cc6c154bfc0955295302a72d5fd31e56e4b99454032931a1671c57ca0b914cd16675c6aab5bfffcb9782a850a157a7f42924a2e04846efb9abbe7e5f4dc356d5abde23d779fa3258b9b668034a820db41420d906a9625ffa5a3b47eee568898fa482d62ab67280b170b57b4db956e694d8c10180cf9f1406c622208b8cace3338b4f6fb3b4d8dd811261c2831208b87473a8a88c881b1fc0dc6d734d538ac5f71467713fc262415aa34c7801cb7b3fc3397ccdc99977cba2984ea28a8b7e8faab5e966afc6503bf8524823dc367ef99765d4bd20bb86fe644b0d5a08d3377986da9d6d4c28327ad199861dcee8caec849e301a14a2644a107a0b3fb59fa0a7512090b2a8f086a36c5d3657ea6cdb488a793137d8f227d2f88ff60f432608daa0a089628ddda69a84648795ab628f5115dca4d3eefc5b339e8334a05bb434275e838e2d98cbb830594515eba783a11bcf622d046b8dae2c65e38ef17102ccd29917b157717ec46fb3343dc06d2c4d078171f5693a4eeef06fa428a6bcb7e97e01ed1dbee39ff29e75225183671919f4bafd807d718c125013ef595b84bb1e236d2efef9403dad3a0335926fa04fc4b5db33db1918d07e9f122d014ec8abd494314570a440698347df8e1e7f267cfe664426e38c146d5f5a90b13ba71b9ac7c40bbfd208eea7604a6e05c6d5b007b20b6805c8c377ef84760a02048197cbba039da0268593eaeab184ee0f42c100dfedd8f2bd2f501381b4c5074317a1ece3c8029d61610fffc29aa66520ce7b33fa9e918fa3aeb5d791554de9f3b34908711cbd5edaf87e5e38cb007663dc10a832ef821ebc96d0517a87c9a71ec0c56a98e42181553a915e041b2cee1ea3b3e028171c861df0e5727e0b9367a7307b586a343eb08d00cdbb85f1cae626cd33195b9d226ec396d818cf037d32b64070b744c070bcb43fcb7ba63717cadc00cbe5454635aa098328060e7c5b86aca4003cb10d8dddf66443d61f54d9060c996ff56251c93dc122c727e841a5be325d0c62500119a29f9238bc5a316cb84426db1600033c49cf9d07604e5ad3abf372ccc580fd4db88b918cc032d6d23369cfae2fa9bf0387ae4b1ea8a9aa4589361651e996787bb7e8518349db541a35b2d17dd149f158ab916db0ba00b7a74e762cdad02f8c8c455c80c0442b7ba3d734a1763f60789af9faac3067584b002b5c305f8423e4db655d5b9c8d867dd4446a09ebd58ff8aebd069ac2d051d5b45282703110c1fd6bf5b4055ab8827bb619f56abde8cece1a87df677c4a6556e3f65017b08a9647cf9cbd8d52f01917290590ea92b0759fc11962ffebc0d8501e5e54c5c21cb29248a3ea27b1a2387d32768627b98556694910b750258a5a363e69788d9bb5d8564d78abc044735edea64a34a646a729621e6bac733e2987b8217ec6b0b8a2b77cf2cab30c421c4aa48b5eb7be4a44cc6332d2b0deb2dfcb84f008ccd42dde1543fe64e1aaa60a7f4b939d7d563e2a3c317b300d7ddc19d80e5d7ea0515a49604e4d6320fbdbdac9358ff480137561331afb571d2be3763ae82946a2ec1f300834d0195b7a1708b547775996fa92ce58e10b7e6cbfd217036ee5732138863faf2641b41e4aad8c7c3113da3d994d0c1476994e9b8daa0061e4c8aec53474666b2eccf7bb6b0056916652fc5c4d5d8454907e400e3431289817f2e8b277360d7c0f5d97b74129b7464e84c6d7055f16b45329e588483c3360bac21f42c203424b435a6f8a503dd0308a64e6f9544f01c8fccba9ed87932810eb108fb3584e709902db515e9ad42bdb76b98033bc874bb212cc4cd8becf3a285476cf844fd5371c5ee3693e3766f8d6eab57b6492b7d9642610fb9566198365813c4ff712b575b5550b9fcac5660660a88df33c5c273df031cd3b488dd61ab1a92d65549c38f2f6818f49c5a309d0c6a4990ee58be58687768279e38b1fef786f976c71fd5637a7c27acb66ebf39cdf1a238debe6cad5ec920f3d2ed244e0595e5d6531ea2ad55d96e349f54555d94e3f5a4bd414022995f14eb83d7ddf30a27af6f83a74a47741b0dbbf53581b06e45685c1bae4505226f5fe4434942656312bc01f0876b6c76c1f67fd41a9937218af8a903d7d4688eeabe87f16aa0a303760bdfacfdad153fd459ab634cedfadf409af040b81fdfe8b0089c8e8a370ade8b27668241422393e2cec4d6306b15968defb197271ac3835fb1da01a9e3dda1a5f87ee35b0b8d0f81df889542761d18506a84dd494cab79efaa86355715d629665fc9ce3a4903fdac20abe4bd13b2f9a85ce205b560f527883cf65e92e538f01a58b2e8f36809ac6c6a5569539be82982b747bbb937903a63cecb14df68d53d86dd070b1ca22446692f624e7e972e019e0f575ce00d25354fc7fb16affd8bcacbb252e330d0e5dacd65a15dcb84b244aba4a0257607e02c9fdb1ef82c690ed7fcc561601b5a2529689cab178359d7f0f54706baadc90b4cb3a4675b66b5b5d671991eff320b2195445ae376a1c7ae2fd76c251fb40a205180e42cb72e7b151534d3f218d21379395276325db69e40b3019d29858a9085f95bf2c77d9979913faae7e422dbef069dd56510ed36751054ea5b78234dabce436795e0b8ff0931e7e1955d16b858d0acee76441fd123f3e12f6d47844a92ceea4ab59b8d133244cee165b9dff155e3da21bb42fa79ccbd1c10d98fdce2710f2b3cda88dd6cd417fa38954ef4278a7e390a2052fa3d5db5aa3e93a8493f7adc00ddec16872367bdf32fc3c32b79b3b94467b542ab881d7a3548417d6a19112a91471596e8a5a3cda9a18bf0225562a958d18b76a95d14c7cebe1d26bb7c7eea83c4686107e64c6dc03d70bccf56f297f1e5a44d52d1d9489cce6a7d8e3404910eeb12eee64ed99b0125f8f501d779f380f9237fbdc4def44ec1bf11302a93f3bc4c6795e25e6965b01407f62dfe24666693909332d34abf9e3ca471c46440fc1085cf4dde2a1f42ca978599a3e8e9f9baa7518bb5d7937bd26d470035e0c2a1b79d05661790cffbb40ca2e96e56d56de1fdd172dbdd45f34d1c47d32b4425f1a242cbd3a15e027c973cd3aa2d741667b1b4a546911963913b7f3157476c395feb9b49651f3da6dd68a1ae6658f2100bd7c3bedb96f9ab18c94b70bc6d4deb516c27c20315c7febeb2f86e56b5f8249ffc4ba70052f766274336f784852aef97a2abfd1a5e63528c0bd810aac9370e2e9abe38b4aae9a39955812c5fbc7d2aef9b5965690a2a57d9482c11585b3f6a434310247ebb97918628cce2a105904107f750f57056a62b3f5a39609c6d0e0aa704047817185e4addbd8130abb4642612c080197c6d25cc2ad9c2d3e984d64dfdf19e3478a51e425a41d66004ba8ae84550de12694634be66fc45725e4e6ecd846e9910fbbad184171f522d9caa9e63c54fb29c0eb12280417c72e11e7b1fbf777298555db7c80fafe5ef30bdd6f117ced6ca391d016f9050e784950408031666f555c72016d39e28d6b541f91f7561566fe5a93b85d358a09a061292a9e6528fb501e1602fd4114dce84c77b870d632815d9c5b35ba529f83134842c88f49c085832cbb010b526cc6a764e2a57b8c7188e65d70c66501f66b545511068bc320f823d75063bbddc6884944aed40e0c2acf6c0553b59f535c37388a671233c183455d238fc07087b985537356614d89b0547817576139e9cf02bf6be9b87e4c09fbbf47274e3fa1f90366156d5055bc217c646810f9eb721d354971bbe3881b1255ab321ca6be4dd43b3d710e891096499b0ad44b47422df48641a4186a35786cd1cc15fdf211a6490322c315c0f9cc91414253c63c6e13c6ac2ac4288e767742b1b9fec9a71355edf1895b76e8eb28aff0946233f4e0a321eafe79a59bc1460749cc48c41b2b8c749e05c7df0042157a0338900825742fba3734e4eeb97d3c54d6d0551944537fca46d3fcebdac82027fed0615915439590957211124a5dc0c9e089bb8ed1fe850d117bf83fec149e125bad75d4521c688f30fc602ace89a22b1c27e6bb3acaef4bfbf3f8e1383a00facd51539644cdd087faceb6c522300b01d20ee6545e40c4edee51f6f8404073de6eef0dcfa37a4e6ceed2770148fbeff603c397725abf69276b0940625abb7042b697fd4da1d59ad37563c81568df409fc38c2a7c923ab98725f13158483f73cf7c8aa8ec4284cc4d81932d3ba871ce3a3840057c5bca5b8c5086635b11291d59916681e768a2dc5cf77609620abb45d07a895cfe13c3ba97950107e0241567f5b0b66a26acd7d49b3ea7259d5ffd84f89460c100fb255ea3936cb0a11d5f2bc75d76e605d67bb58580cd3b5161a1df8300b8e5755091610f5675c7c7ae01bc468c151e0f2bfcb0269546925f212d18212599676c65738d677d91b618ec7256a0ee18a6c547ccad9e7e9373e569fc4b2de0926cd219938e60497808353233257b428f312bdc1b13a9ca58e62412fc292255b8ae1585d8add3873b19de5a22fb2f2ed2dec6b94796293da8e9c783b1a202d7f01d80091f52e2160321065ba619cbb0ac7ea1a54de53111cabd65a3ff1ee1d7e1e0d1d56fdc71ac7ea80d2440c21e6a8346638e62a9b08a1e804417271ace204c8720407fee11e421ab610375e2182ea55836315b8716e11b22341a836634f015a9ccffbf42a11d49ed416b895c4865491abf8ab0ca88fca01649f310ae4f75e0fcb8f1c8f48681cab233d3f8850ea05aba238db3baacdc20bb09139798b9c7b5995753102c1c3ef82522fbb5e1456855b540253e3e738d96f8f6395d4cd8347ab4ebe905a1730f442115cba17b8f5799fbf800e5665de8ef4d0e2583df83e31079c6b4c1f38560d097a58d39c47ba2882bce1585d226b79af2270ac3e8bde0b8a63b596566fe9101cab465a3cc3ee1ddabc93502c280a841468bb0fedf300c72a6ae2278ce2211cab97949983b91da41734b782dd47880c0601c72a35e1375cbcd4bc5eb872428229ab05789a332b694b9d70ace244ffbeae60fd86f075db459a389d1b66a68a63f57e503fae5ccd3ba68c095dc486a2543062904f62d3b5adb19a9853ccd88eaf9c89294aa4122726c777f926ac1cb466790f90b05e9298607328e956fb307c2aca1619d97bd732e8172c68209d69585fe32fd4063744b9e2f2608dd538fff5817d13ee6e6dca4dacb25fa3b2c91c38f7d30a2fb76723a0e4a846c00aab5cd68eee0946c311fd1aa860a7f84ef8dc4e69f5c2bcb1ea0aab4787bf17d6b173b9c16996d56a4e235c3a438240bc29d2dbd52aed17860658d5f4dc48f6563a8adc9b9fbd577bd86c54ad9652c42ae5fac7d44902e7bb49afe99d7d38a8f4cdaaf3517d9470d567b65a698fcb9e9adc520c6af913e1843dcabd43bc872fac1aa85b65468e2db5b91d0b412dba69460550e5a1d9bf2660b23daabfeb73c5338c7bbf7ce6e12f3ead001390ec6fee3032a97d8155c557bb64c2fe94b286eb7328471588cf554502a883ab90dea802ab6bc5f44b7e352bb09a4b2fb23a1dfcb867c5e04910cdd5eec03e5a3b8b3eedd331e8fd00ac56e9bfaccab1b92d785bea9f22e6ab1e6b27088deda4b752c4fdaa7cf205b224e389278eac499263dd2a8888d19ad577bfea49014e34aba3c14bd3c4578bf60e544b4ca968beb75c8231b65f55c1047b00b2bc0afac54c1e87b8f80cc51fa02b6d829dde441b7d36e91843eda55b047468cde9e052fa0294c4fe3926a7b8ff7f4eaac66a6ac4a429a5756b1cf08d44faad9b85397f53e7d10b15b5255b79c90231f57934d3811894b252f5ab922d3e61acdce1db0e268abc93d345c4baab5f359c7de42734c3b5832e6a2765001b60dbc4c43d64c8e6a13daa1961030953f89740f5509e7d1379a7c87c2b8ad0ab8f6d4340cc9a439162bb6aa24831a623101275a9080af9750c845f1582aaa83c1dbafbb2fda557459c53758684b95e670834209d2516a1040f1c1fc77c952725d985f217a97489ba987139b9600c066a01dd45f23104e4e967aa79569dad569958a9fb1b513e44c52629cea5c30a24ded844cdbf02c903a7a99faaee6d78f0c4ba885090bd2e4aeb3a2924eb96316ec50e8e800a05fb54ca4420ba2b8637201c34d7c6e4dbae8ad8d33babd759146ce9622e5dd547eee984783ef680ba48c9bcba05fe5809e7c162ac20c3e2de344d32309437420f68122ee5c10e9ebe4c8590af76bf547593510c342848f56da2fd6c3623b12987d318ac8367dc236d324e7da101a7351dfe5ab94b962d142c311f64f2dadeb26491e91232a637c8ba2f8d162fd01169339422c83e56c76f50473f82ea6ef99001d3d4ebe65b9ffbf1698ad662c58bdbafef47eacfd180ac230354197e5a7dc507401dfe328f1324dc320c822f9d6556a8764c3e58d32ebdcc11aa1eb395012a1a5568c5a1026c0bc9040a0b3b96e8846dbc098e359c8e6118b3c3c738b80bad1ef122cbdc01cd951ac76542627af22fbc38e1992d1df9dfc30ec4b88b366d5850f7560554d6b0435a880e2c5f7822da5473da8ba048d0a25d73dbdf8c32c8e0b04798f320c89e00853eb6bdc5d4f0b1ef4377e2395c4fa7654c46c4ac9a6d428a47f549dec4ef35abdb85159a4b89c76b780c2fdefbe6d87df8d2c58f1b15c39cdde1c30bcb8e669ac1d2a8c612921593c4d0941a7546f7445d784c393de92a7145647884a4ebe03a4b7fe28bac2f317be889035e531b7587c604c00e7727ed45eb1fb93f2aef9ee66ffa3719557a2bb78bf90cceb93dd61aefe7360e79e679f8dd6454b0e7e718551229af15bab1ade87745d6498c8a529bb43aa9f9f91aa9b10f94328c2a6d9974e8c3f68a28a3fac0a8ea5b0c92a5ac3dd672e927a1b98c14a8d2a51622614b5eb02d5dcab25cc0ec372cbdbfb373424201b2e3b69579eeb1fe65c619738f93470b8be6f68fe6ea302679704f0a132b6d49e133a1c156d583a20456b81fe1fdb221602ce1d2494d1a3fd2d8429bac788d4d11a041f2ec1495c21e0d269a52db282922b62fe5fc1069f638408852aaf2d1fc277003c6170e99a87099fa690215136d001626968d8199e2d08a8625ea634ed594a0003b32040e621d9686af1a325f48512179dd9a3543069d7b57de85ce4d44d071d09960b90103cc5d01b7cf050888078025d60c006a3f7adc70c2726455dbcee4aa304ac0500e08e0e0c5202afb0fcad51aa290c9f5a9b55bb99dd46f15e0d15bddc073c0fbae417f4043d6e2add557ad8f42e6823fcf3cbd0baab164c12bd25dbcdf84ab9be780ee351157a110c29459c5ae271e313baa6854ef244c5530a68e68dbc6c1a8a66ed3290f634324ab1b35c931189f271add95163b7d5cc3354960e5db5252119f10efac55b1b1ecbf0b22806ba853c6353697899357daeffb345aca6ff2d5986a979e5783e23dc4b895cd533d8929dbaef82bc18700ca5a4c0045f1576ef6e9108d7684cf28e9a57d1776e703bd5de75ecb5116af0a5ca98155dc5e1b88436a627ae9af6610aaef72519782540be666471f1000684b18caecc19c3e4d6e33aa187d38e4df80d860333ed7c8b8db1d349571df4f3f72e86144505e3710354010ea10e394597edf249f78c70dbd3788baf73cdf794147f94dfde83b4072349b62acfaf13cc29d00755d227e500793e3973d3cd61e0d8a0cfeb9d272298af9764dee660eae7ac31f319ed27509e11a6cf08b6be92fb18398c17ef057e4030aa4fee2f21c9621a0428be12e54dd6bda99a1c34d4198523b7db0e1466b96a7579e3031d011e3fdc7687d1058047bcddbcbaedb8a4d301a62147a8f3b9715a8c73cee85514c892601df7e6138fd25dccf6ca567082ad9113f80f5a148bfd42b9a774557b618af25f975ceb4a2163e0bf55604c52884fbcb062163b5855009a42d0d55d84176285c99f2aba239e645e3e5909d7d9e0662b9f7a67dbc22f4fc1f6e0b0e91ca7833717ed02aefb2bd3aa83f89948155d737c9236def960985c4fef174c8ef8e7e67f4a3d0bf1cb2e4ca1009863d4913334a45d83b6703ffa92e39373939202d7afe6382c40d8570aa0b42b6a62f9c0e5663022693b729a34ac7cba3685c7f7148897a38d8efcf6dc5c4629a1d9a6f5022eaa006c4e1c3aafe23a3bb2a2460dd3db15b2347ac4b220132ed86351b9cd993a14235f2b54b92c65bbc05054d8516897af78a19ae05280c9419386372f49a16474c1c6936a322f38f8020028d88f89c5952cb79818a7cbe1c6f2a7202b74fa650630a47e1984c8204b04e0d354440a70bb351aa91a416d16eb397b254e63135afc92689244e1aec7b5c5762022bb57a018d072de20da409b8ef709074883afd62a77e7f6007ba75a2cd09ba61ab26c2bf8802572da3500b1b67a3d0f9575a7ee97dc9266262f9ba3c36fb7f79891613d498e179c0454311aff94e3e26e5fef76661b17f7f5105bffa596e949298812371db2c223573bc91f79850e14e4997e05b442c018133d9488b1d5c13a1b4a01a942011213057874b35e536326b46d748c77dcf911e8542ce170f79c5b547d6b1c2ec4ed99280ce0d1cc1dd84913493686933ddf086a132d999d514ae8ae0a977d91f417faec56f787be2a2699dfef573acc62cf64b5fd449f9ee1de8d87e21d411374cfa712538f0d64b146592a3860d195bde0781a02dbd3012ded262f3cae85d141b7cef4ba024d80929821046269a8c640a6a714d9606ae9a2bac2c6f2021459379981543129801099cb1ffc93b611b0b6a38a5bc701f8487e2a95458588a50a609165cfdce8d85612c67fdd8ae326ea977c5ed0bbd2e61ca576afdbf9cb59dfab9d7784dc9d0c122e7b54c84f64cdc02b4b2bf0959a962374d742852ba2e12d064ac169a1965c8db4038649e9b0b21998745513856aacf4a47f26a2c4b4b15606b647a029375024921247134a73535737af80978f988f647e7ff0cfc8e10930db298eb01a3944998cdb9f2f386d2c22e60ddba66188804dab13778923b4cc6d4a53134646dd023dae81b209129cc0bbf74dcf00845813fff6b990f186f795e3c4449c1d62987a188778cebc0ff938db309ba9dbbfa80c974aa2e64835ef2fbf568ee8bcc684868a9d12048bc1e59228f75d1496f0270aa286fbe58f256e5fb24587c195b231704aee08cf4d12c002b8af38ecd5b4af16110e9c407176cfb755fc463487cd8b49c7dbb7ed413f101df450fe98c9fb3755fd02ae7fd313e7a2e06551db076d9cda176591dea7228d9df083878ce9331072f0972693ee40931918bb6977b7f870fb1576976ac6c13b8f238178b2ecfbd9dabca9cc32628acd311eefaad54c273f1ee96fdb4abb610a3dfc061f85ac022fdc485f8a0735958f4283540d362fca4b09bd903fb84abf5c9c253e4d17b6fc5a6c721c2aa7c59126a84208e3f032c3ea9d7e35e99694c63e02131ddad45dd94894a195b34e58f452f2cbf1784577618e6297cecdc35d2a8842ce60ac79e8ef1e931b8ae6f6006cf43bae5ac30b99509f48b131cbfc50ef4cbcb39ded8c8fb0714880a0447cb9821e0a8fa874043cbcecbab3ffb050bc55840e2163e8016c8617723edbeb149a1f3c2b80e039a1c96aab7713cb159242b1ab5f0a679ac26b37c351318b8265c6b661ad71078c84cb635510dc5a45d743c557e18d530b1506a5b482c0f8fac85c0b41a6d1c05a13d471e225306cd1b3ab14e9094bff6a1ea4497adeea2adce6c90b1221e2686e2fe621225f404f54eefdf8535270c34159ed9107d085241cfc4efca09d213d46c3d2e777434f4b6d4a1a3d1fb6555f4c3c2efb4f66378f61fde239217b7505b25089116225d58d5b92a2480810f8dc7a80c381402f3339b09f996429fe33661c7a0a8ac08c564717b25eaa6b6af6a67c96fe87bbb271b48c7013d2f9fd04c6b5aa5fc58f6ca722f03f486115b99c33c457419bed95c401e8f7434d6cad30df92a9cedc40a9d144b7f62603edfb001bd41f12d62a6274af832dc3c0daadff27f0fe407131965b3398aca990dfb629346c8f233ebc5adc15ed6105be44091558efa2537f686988769e198e7b24a37a0ed08e435b1d51422364010e41206f4861d1df8fee8cd0a3215381f813b269d510edd6cf7cea5107b764c178f065cf0d0c70b13e3b5541880d9e1dcd79c6519d3cefffec28f18048bf5084c2ad04e4586f9f8f0e3df8f5299322582e22ca17890a3c0963c132e31de6908d24ae5071a01e57a5610330f6b5840452f6f108507e8358c006b162837a4e75bf10d83162ac219db786ceb1da7c9435df534f5b6f6f605fc082764b565578462c1b395df33f653ccb50f4cf0cfea92ac8ed7d47b631e61421bc0ebad363e084612d69d8fc0c512a72fd7568b1919bcf7ab86fd62114a21038d1a0564cdfa4e250082de07c2bf1a16207c260607606ec30f05dd9736bbd7f70dc6e34e0ebdc9567d852911d94bb364f6e90100cd149fb818e5267de9f3f3fb43fd7c9728a989fa8fd822951bc7682c4ce2342b71614706db4868f0fffe99d423d4d909af10484c56c0250360b1362c44d758cdd5ef599949c12d751b449e4c84a2bd2df78044d8852e742d4dde6e7a3edf4d3af25c2ef0047996e3c1d7491303a611ba2aba5fd76a61db2dea51ba78d648955b448ebc55e84abbe74437768e169393df93bcf5a926987eff87b3e4c891fbf504d7ffc77fa6adcaff140a0fb3de1cd23b352d69113a7bb9e2e3f5013d74d784bf4f59eca5bead4449e405dc344810c8e975e4d4b5a88e9aca2b73000a4aef462e9bc818af1afccda3b3c8f554fe2c2ff3095fae1895f550801669516c07401035aa777273f0a5f3acf10831daff387fa0f4db232e3553bd70e1638fbbe10341e016bad0099a3ce91e7e1183e926c3a9e87bfb91fca90575e7a8fb24f80e25884e1163d6b740ab3aaaeb80c4a98b0f4d878078a571332d654ab469158bb8b4e7411363c4a25d243617eb17c70e8428556712d6cbd0b9110ddd3216e3b753785352d2802758cd3468adff05979701cc0b72336563d478b6cfd824dd31312d11961ce0f93225f46a5c71063f8047071975668c04481e29493f1e73ee3ac9356ab3cf10c2a4185ea61f63314df8b3a9021edc409f72886709874ed3c5856dd2692dd2fb9e43b2cd055b65df8de8db2931443622272e049fd5eae517f2c614b13ed9290086093547a2a24a062903c44869953cab8469ba6adf01e60265292855c80f60c3d17d24fa44bbc95591f9cd94287ed2eb188e9d0d00f2a722e0fd2fc9e43fc096f09bccfc333d6986d0c331de3cedea531fb909832fce584f1adf79c7eee35870dd8cc5afb25a3ca5f76a5a909183c26a748191e0ee59bf8b38d0683bad5e67e47a96beeef6a12bcbe20339d4c7192ec68f05e1a4a78b26b2a819915c05023660dcfb9553707ae8e71fe0e88ac62d59d0a69454a43b459438e37746c6c877923805674ec518984b74f891d7380e6ded1af5d0c1406bd9e34fa02e4b8702fd5c3eecbd60720458a6e782a35a084978520772110e84e394b63d304d974fec801c0f9bf6b5556a1797a97f08f10e79f356a6980c5c69643b8fab2554368e4d35e37fe35b87c4f2ce4cc9ef5b30c0d0cd02e1183ca3994d4faff2a995bb455d22b1d9feba754b3a5662c55166c125dcaedd3b8d8620e8bd9cad419789e17216415ec1a2f93e91a2a613fbe681ca6e4d1d66fc4e0b46be7a31a58c3e4704febc6923ca20d1ab936abf609c9378ebc86947b5f645bea577fadbd51d3354d0f8cb5910b2facdbac47e5326d020c3fbefee4c1b82c8f47a6351593c013cc189664d27e9c5efc4cf6009c12e9a807f70e4db199bf00275ceb4f884ed528d29d3464b1106f68cf3a32102d71e01a9a33326500e6f7f96b2406640da5a00524051d6dcfd243879984a6935a41dafa2cbc01b654a4e0d9b5ed56590420990866a6061f04c492b7272597fbe5602688aaf0f3b5807d8401319158f433b54bc5cb71a12a158de341d384826e610149b8039c16336afae73580c2e2352a5b779fd1698a28bf0620590bde1869a6bb7b980f212a451a5b22db844257e340634996aa8dad066150ef3180359ff75744918cbe8d2f7a9007427d47367a253287268f0605abeaf687c3cea85b7b5a138c4976769d6da2d6233ef783804f4653f25383f62447bfdb184fb157f3b1c3909121471d841e7be862095f428fdbd0e8e18eafb0db0124c4284633ec985429480b9cae98cf74439a740f7ef5b1ccbe7bf5eecefef4699afc814a1065b5089a43216d3f2bd6eccd9242a285a2a7edab2fd23d8f1b00a44c75cc24b037b352decde8acae7b43dfdd13f71cc70d82940aad94bc74983c6411cb0da5ab711d4b1930b4be723d68bf28804f44c8db96462d9580f1d0e601b8bb0ca4821cadd32147d285ac279b217e012ed5b50491fe5acc3f45a7a20f2f22024de0bbca6049a931bb95820dad53807dac749e1af8ac3bfc2db206f485a2f5a9aee3fca5cb39b7943b9fdf9a3377c64831fae6205daafabae3389620da58494430564d3ef9bb403c7ee831a76d2f3cf93cd828f8afdc6b7bdeceeee5ed9dd5ba62403620b630ba40b5a601bfb6e80898442274986736b70eadf109c7a347e962c47bfb22c47aab2f42acbb22ccbf25496251ec994624798e0eed255ba6ce9f284386acb12e39b04ecff9d1ecb51aff5bde53efdfe7edffb77eff79d29677a2d8f657a42fcefe71dc498ebb1fc2464f4b36c858143277e4a5d953915688105291c01a71e8d3d633aab22e074937934d546f9f63d282a6adba2ec7472ead16c9ecca2cab34445e925db645b6c261bba4983d138ad817183d39b3ff7ef0a5fea5efebe71aacb05b9665b94ae6894c7c242264688d7f258555459be025e72da789eddd872e955b2581615e2d810872500f71c741055617f167025c21059de7259c44f698843d3f2535a16c9f659347e124284212e77574ecb21d97ed7a5ec839ba8e2aac0604e5de532e425f4de2792a2c04cb29f3db4ec041cead3bbdf87ae3b3b664db66529c07eda0fe268f5ef7495a39f49362ee368d7f41870bac9ac17b0c7c030f42ab0ca8d2ef77b59cca987de4630c705e17943361f6c80bfdf08d021b6c916cbbefefeb68709c52060a78202783aa8a87511c7cdfda6a822c944d5a6695e5d1cc41292ad772096a3d6825816e52a502bdb8f51ba4a97cb099c8ba4fcd42524a521b87b4fdde7fefbedafd9b971aa8b83b6b4ac027fa1108b3f68f96be114c7402e0c5c89d09a658fe6ab014e3d5688b3c93c968a051f498663a557105e8a240347aa4d46928562a2503b2206b4aa2cd60caad2cb9ab0e0cc5067c31632fdc100849e0e421e8d0efc8463a1ee81a4ae1738f45d55722448fe4c2f7f34c0fea54944f4a0bd9fd9e52abacda3208e5af0844b2f1cdb64369849b63d949038aaa66c10d1a3e053a2d308c7bde79daee272e09c3b0077f6171ec4d1d914d8a63eb23bc926db27d57c27098717477e3b7de748c65173a4d2028762be19e08b6546e474069acfea526fd8b8d86430be71b1c96ac8ec540ad8160c999d2acd2aaa728797f8a9df7d08bdcb58d7aeef1082f7d3b8300cf11086381ef21ec6c32fd41336420d71fce45e7291669dea68e9e5a8cdc28b27d9333bd75ab37042901c323bd5bda86ca2a225cbe5270e0c999dfa84e0d4a329220e71d47e688a4f8836304527441ab1e5430c838b55ca8709ac0ba66093329276d9443d09c9f6c5b6e167822d8a35b0eebd7726fb13a012408cb9fefd9c9880ce35b01cb5300eb699b6eb8a314234177ea673df67c54d567e798a9b4c144b57e9da64da972e3fb5ab6e90b9ab15bfd7cc1eda0d451aaf88e7f28ef889f35e209ab9aa240754e4cf0cb3e8fbc40e0e2f78f87a1a195151476db5b9744545e1245493f513defe6b026fffa9700d2c476d29860374478da827121715b57d32a0a6ca3fe1ed434052606976ca47ad3ca2e142481e39514d23262a6abf333bd5a68eee43a78f1ec050812aa5b2a35a53778aaa91154aafed53f10ce52b5b94ab09255896a5cba2b016b874e1d2854bd748350ae2a7cff6b53334e997167de94cbe109da42daac97ee99164de2d2997fb37518876712cc09eca9a42a78f1018325576845ef4a2d343a747634d560605583552712fc0a56ba44a4b976f5713ef7366fa813cc4488ce9ef6a4a5405711fbab749f8c94ffbe2ca4f356c31d429b08aeedf52c0bde15cd127919453e653dd97e2d82d79916d7777df1a84386a71d4eceeeededddda5570dac1e2d039c9264a61bc2abc4d58ca0e1107e4c7cac6a3bdbe7aa640b59ae15d515015b464690b8f013498692b820c996945e4572e9a5648927b92a119243ca55c9124c3249665178490d11baa8c934722542174f6422d81cc91509b912a18b2f32480addacf907e9452b5fbe7d504668443d1921aafce4aa8ada77234aaf8aa2841c1778cba0074321c705ee0c7a5014725ce02e831ef4a1748131c2cfec74fe8b91cd709f816b4ccfe5686da15151de29b9675417ff7e005497edfb69a82ee0f7d7505df0f79ff525c4e916fbfd683d8ddf7f433d91dfdf1525fa36ab4b2dcd6a4d21b35a537b2f3ee8999ecba3f1bc8771d22c2529c14a5798252b2a8bfdcd2c05a1b2585025e4b8c05c066d8d63fe6d8e32a54b7c3785a849fcf3621095b5f7c1d1486541924c941155a419e0b414597e4a81883ff8a9e2ff29624c3f2704a738b6993de3e88a245b95ae6ab27f8e54d5643f1ca94acf92f1d4fcebd13925c940660f6d25144df18b0c9a9e3dd3669014dec739346b16335dc8a0e9edb5b7127e26f756bc15c773f9c9ebad26f1681cf55c3dc0fd453c570cb04ab3720b49a2595b7ba6cde0f92d517ab5f8c397af67baff85f16844552dc0c888914a9bc15e7a394916be157174e9e5ae9a914b2fdb6fb27ed94e8fa64b48dc64dfa3e9971215b5c57ea98aca6237f1c6157d193a5582107df73bca2f43a74a97ff43a543df9d3f7c18d9113a7f94dffd0f233acaef4e95fe940792fa21faee43afa3fbd0f787429f72fa207de87dac7cf74052355553a28fe901821f3afb07d1a994ef11b33d033a95d2fffde587636667c664a904d17df93bba2fcf1f467ea8f48bbefcee7784fecf1f29a7e8cbdff19ff2ff291ffaafc1504af922d24a17eb5644657b36182c85ede18a3d833484a323462a6f4bf97f11dcdc2f8232f7884f6f1f5fa1da20bd7ddc4545952ffa144721db076b084f78fc1ac418fc600d9b0d6e83b5d9cb41b662e8d16c69c9089b0d6ed6ecfe69567377ff88744f92d1d0609348e8491f80d0061b56529ef43bfe57ce1f2bff4f5a397f94bff2ffa417bd111de5af7c4a0a0f730329b3990da417bd8e952f3f24bde877ac7cf9a066049659d40f233f523ef4e3bf7b195f53f6493616a5e2a74a10a3ffdf91f232ce1f323ee5fffc6144878cf3478a8cf7e1e347ca87de888eeeff47a78a7f4d8dbea6de23810cb35539f6b18d47534df6c17396ad47927934d9faeb48f9d0eb78153f8348f9d0eff8ef54fccbaf2991a9e22ffa9a02efe85fa38ff12956f9b4cc37876d965e165553b0582ec9b255f918329ef44146bf1224e5ff55fcbbafa990a9e21ffa9a2a2151e9af26965993fd182a1d9c6c5f464eb6bf62566b22dd64fb29a60d8e5993fd376b8a64d6d48a595332cc9a1a9935a5e266cab709840f233aca4f397d745fbe8fd08b9e83012ec11cb59fbaca8bf06490eda3449535f911f514f68bc7f217883884f6829e75abd951fb7befbdf77a2c51f458d93ec812bad91927a1a24a575493fdd215af320a52bc71739fa58b08ee1cfaee531cc345108bc85c54d448658d504fe2dbc749a8a7b05f44557542b669e965476238bba097e2d8f7f64515f7183727aab2fd4e8198f68b1671a32928f797664ccca597c34a92916415b55d5dfabbb75500c51dddfbc0012715fa2a02113a61aca906aed1a255128511b9cf14db648b4400c20004e0767a66bf5fdc109e156409711071c000832c2c62ccf76e96905416fbe514494a41a826ce09b8cb3db496b09ca2745914690b27c94a2f247efa9c806fe9c5fdfd91aaba90b6181151512425b4c93e090c16690a23921748644b9255966f06830508bbd4c782920c8c524c0adf0b705a7a958090b3e897ad54452d5d514b5874514a420e3ae820c67c398809609203c6b14f490c6c723542ae4a6290440679e0418ce98cc4514bb271d4be0c7e90bf158ef95a80611ce421fc5890bf1560b09eb01695a575806334e28dce38d62d9c92649fe2580dc9c64fa42df39704e6ba484b5789c4517ecb178a89aaac59926d92b0336b2a0a18bf168aeee1bb398496bdce38ba294498c9af39e0aa64092159875c95c0e026b718f3a9005711e5fc52805d656b7555ade84886a2a7d9140077a1a24aaf6adaa2a248325b22813b44a4780cd982a1f83de37d69e945929d69597aa5743c03f4ede0f0a2a6e698ad5445454b556023f809c72a6adfde21b60e0e2f926c6e666ff3eaa89b1ce8af99fb2ab6e7213c13e934ad063880b08a38687c16a2ccfe1c070aafa3376f674a823c84cd35c28f888df0f3934877e270232aea55eb6c9f9248328b1aa9acc9be75243049568a65ab2de94d8663a8cc4f6efdc4b213c76258d62ee6aae4095ac82dde68db034a0f610f3d88fd27083c6290b355e7059c6a36db69bdd7d26b0ee12aa818b37dfc0472b4250ec1356f6f12c39bf4d664fb5e4d75e9776f0943e842b3b141bce1b93c52594a1fd416fb760a213915b16e0eb04823b61c4d2bac15006e6b095b5a6068849b09932baa0202e872d84c982ea71506834f5051daad33c8160678059926db22d9926020cd40b69c54e5e0d26fea79760e30a9d2b822e06e24b27d256e98c8f69dc891a92e55a6b2cc88ad0d8aca625fd479017b4ba82c36462a6291b33af31cc902a7a4ca4fdd172a2a6c89aab00c59a8278d0bf5d4fd82851036cec657d86a8db3100623b6c496d80a61e32b8485b0f1750720000cd8b767066a8b0e21582b68c34dc46a962781c160861016b6748053727613064e4398907ec9406da14175d140652152517eaa4045ed4fe1d748d8c22748c9992d492ebc90b0336c85b0ce4fdef30861e14d785e58b63c2c0af4b74fce2c0a3cbdce5ec4b2ddb59d1bb9fbd241071db81d9ca8a8100cb1f50559858ae261c1bfb956120c953443cb5198f0e642e1279b56586ee227fb1fb18b02f6bef393f79acdd5368e84f5cb76924e6e62abba68cd55a076a1b6c6852529a24f92adce0b1d2562a29aec3b91ad288a1a2c92071108f0795814f8f6c12667d6d429ed043815b1eecba2bc947d1bb284f809f4e499af157d81d0f775a9a82e5ae3ee5150c3fbd4f3f9f47ab883f27c1ac307f0d32fa7f7d5634eef0be4afca229a418789ea43a7ba682e9f0f620401ce90f27c1014d04819d167481921224323e57914d4481921225323e5f9541445b6a296888888265b110f442ef0539113e0a7a21b648b3f1541912dfe546424e6ac95c5ce6ea7b6298dd1e1c62f080a3e555b873494fd6bf3907ab23f698ea2b9d9109f105b2ee14d4dd5f0a63339866c53d289664336790961dd4205f20b3f711a07ea0c769fa89f2c6a4254837ef9debe4806d5257cfb1aac5fbe336c6d672a9ee9bdb0eff5f2f212de54170f6f442cf0615cc4b228b0cec093c7cbeb21c42284d9685516fb62119c92b9a600d0e2414c9512b1c85975a94332666226db1b9c44b65f536c44b62d4c44b64f4aa106c95686042377c8192abcb1a6fa856c9f47bf842d0b5417fb17a81aa8a77e7b5fd664af88754f114bc4ca56b3b1a656bfc074672a7a6778b3852dd186fb1ec498fe1e441cadeae262abed7d595405aac9be773bf775de170f7246ce341bfb30333098bbd6908acab340341334907b7dc8121cd6e538da4f5cd539ce721a3fb9102f92bb73720be99c7ee2a89a6a047426027218c0d10b041036e4903997cc7daabeece896363bf3aca80774b7a242df79ee432609aca91fc5ec4ccfecfad233ddd2cfd9ccbd564fdb73cf819e9b391ced1a4340b3486051fd9ae997aec1b6df73a617773f58d3ac7efc69f91ac3afb997d5a9fd5c57dbc7cec9a5405c8818d336f84c4bf24c71d84e72ffe62c58cddbc36c6909b807bbaedbc39c300600a289315c8fde3c5093e400a2fddecd033549e64e0338da7f03cbd5ce8289e209c0fa7546edeeeeeeeed30de5a8d6d0bb7e7f4370fd07807dbd0fdc7e86d5babbbbbbbb5f47f723a0860d2f2b6a5f3447f52ba8a2f63f13d7b0a215b5a8fdec5e8270b89d20f091bdb5b627ea68f7771bc9115b2b523547cdf0effedcdddd4d8357ae7f03480150a5bf7e91b5775bc3d15a611cad5fc3d15a6badafc34f8f003ff590ebd7b0e137385afd44ebfba97efd197efa5cbfd6af5154410517e4b4da541c9781fdf5dbacd5546bad00e89ebdcad24fe0da59d4aea1a63181eb776db3db341b065cbf2bda9f6ab65a6eabf54cfbfbeb595beb6a3a6bf5fe2e0cff4debcc80d31ad3686cdac96ddf2fc034b4e74eed69983568e41d6ad4a0c1699ba66d3476a8a1699d9bee896cb95cc504b41255936c65e40738ead52608598b716d0145d64c50ae628c667ace5103a7346ec8e9d3f0dfc193b8d75457963e6b0c57821cb59efdf434aac9564b43091148641b23571a346864500998e34c107674e37edbb61bcaf086765fdbac26ef4ecddf3ed170b9ddae0baf673b8566edaa86ec0e8e64323852f58b1d15515d3c57255ba46024037a37fcbe32dfeb209951401fdd875c471cbd71b4d4a464e32807066ce3e80c2bdb24b22d81f28c1942b49b428072f825c125f99dffb0c0e27f43d864d6649f4936e5aaa40957066f8ccf9d314fa9268e7b4e00992b2b0bf7305e969ee761dcf96b921c0982a01598eba442d8c89ee74a5629c4f39f10b00a76d402e04bffc13000bef39ed9f9760108e286014e6ff69e86776caa908fbfb368aa902ffeb8434e87d8328989a3f6afe8b771fdefbde910fe315320f9f3a015557ed8fe7b1cdb7f2790dc66aa99b40792cd213c9bce1cbae5d6f0d74469406f41a04e41d97bd2ecf183f8e3c7e0ffacc0dea79b4cb39e597ad42c6b304b560f1a0060a6428072f8a5df6afc0b02d6aec0e1973e3caf470396cc4d8604ab1cc053958eaad349420537c14e1c45c34fb719e656f301017f1d1510f0c54d706c0b41f99a296e9276544b4a6f7fabe99b4bb9f4d551a5f31db56815f8543940abbcccaf6654484e42a0650e3cc95695ed03c9403e20e0f465b27d991966cd251347164c80805392934c72f2518153928c247314cb1cfd5e24fb24272f0322a5249c265ab9d6e4aa44064b94c8000913ac1c7255c2fa229364353ce4aa84258495c499ab9218dc805d58c51f9a0356bc71ff7bffe18aa0f306e39edf4ccfc7f4f94d611f3c87e8ec9d31dadbc7377ec21a13d12c918c6456d97e3fc0de5bcf0d18a459bd4de8ff7c80bf2358c5df6e51a38424aa54178ab8c6fb1035695893fd4f0afcb1a0bdaf073825c9368fc6a389425471e3a7effa788053d07f3cc0e473677af308df588b7ace1a3bc069e97a27d9e227343a416ae474e436c0a033bd204c9e296ef239f88ce022382dbd3a35f515c1ff819f50e8849350d1b765cc9653842a0ca2b14ac029b609bd8c54b545d45efe4ba9891861f8859255b2aa146a172a3b2b164e714c8b01fe4ff92d2e182938d651a578853bd3d22c7fe925e3c4b195f3249dd59a40f726f8ca593977ab7162c44a3babf3538c933fc5391d15e9573ec537e78963e659ad49bb2ae759ca30433f32bb5f31454f32cb7b53329b1989c6a256d9be4763bf73db649bcc5aeb0fe2aad2a2df517ecaf9a33c55b6ffd05953660e138850ec3b37bcc4512d2a4b0ba7a5570d7aa8f8a7fcf72d8280fbef7bee54f1ef06224810d1873e48f91d8e5954b57603e24f15ff3f43ffaf23f42ffad0fba9a3f3517ea7b289a268c4e8881e38c66a49e18c07f1d707411904fb73ff4a1b17b95a2ce02260ef411a1adb80f7de7b41118747e368c5117190ff8d9f99569c3c7e7bf7787efe5f072a4eee9303df77c6510cafc77181b50c7ab0864ef9177d8aa69c2558892423c94aee0bd8cb690956b390d31293920dbdddcff4dc3255f082953241d8045587e6d7bdc40538255d13257f3509169c90abf8c3963795eeef24d2f5597a692fc04220ddd8920dc9a65324998fae02074850a54ce0bd00079fda0aa73866318e45891fce79954a4c5c15440738c5b19c277ec2a7a8b2a8d0d92d6bb216d59dad2f0738ed56761cab2c321709381da94a5719452d5d2355e92ac14a321b8cc869c926dbb4c424dbd22c5b6ff19e37fa3f157f153f47aad428889bec7f502c40a55d475cf74c4bb391bcfaa5b2e53e3b89a3f62d8cebe0f06248de72eaaa203e5221716d0796ed888991ea06965009bb398e618b0abd9f7f962ca190dbd2ab46dbbe95447193bfefa301b685d8d7dde4ed61fcfb88e0c0802f152aa5a8a87752584d096cbd47aa8f06f3c0051b8e6d9b67fb38a713c451335cb8c64f35891698649b621c2cc34fb00d109ce4cd3b01f50b503b02a72459e8619c24b3a8d07fa9d0597a11c1a8eeb70e9d519645ba2c52d264db4eca22fdd25de82f943bc8441abca13bb33ce2a6328a528aca623f158bc85ae02da78de3343426186b5159a8a8285c8436d9f722db6fac842ac3d546e8ed93b6a8a81111b6ec782459e83cd3ce68b5858d6351a1b72f165151a1b303a22786027a685a68428f8c478603820711c7cd3ec042fc946eabfcaa52541d64fb65ab5f729436788248b6ef676c3c9dc498fed3e742859febfeb6f213378e63100de8bc9c96adca80193907cf9b5953a08efe8e6c376be638b2c6d5dfbf5160d6b8bae6e7fa526a2a8b6505a1ba74e660dca699463847f2bd3e97a3dd23f102c1ba01bcd8b0e149a2e34398a3ba3817c359ec6638edef2266dba759db96a3c522326f157984fa02529149f85cd83180d2a4b2a068a1b658142e64fb48720a729d3c1cbd9f56d94db77d66d7015af701813e3b2a157874df91ca62bf57b60f52f5cbe783fa4d012ae20bc7b1956d19052703bd1cade240fb89de276e76e41ed48307555151dbca9aac14f5f49dc47ef906b9b6f6f63aae56e3aa551ec8c97270324e267edbeab7d5b6fa508b090dd0380e10e6106f741e577eb3b7025cc5ca75def90f2178c29c66c7fb9b16013fc799cee9b8da5cf0b9ae28ba6edfee737d2ed7a64140eb72f48b9f3cb8fb1d71d31745fda4a82c7645bc7173777eae26e2974c5497760204cbb66415a182da46d43ea2b6aa5fb695aa5f703beeb6aa5520d7cde202785814280a10153321e080b4001d00725516fb370a1081d034ad6469e36a0161cbb4ea3ed8c1e938f1134ac91a97e8d1053daeaacb7dfba3129e27a7e32a1c57dfb822c79536aeb4718532ae403e88a2fab0bd7d900b344575194992fc14a405e805ba02040365916d0a8a699f82a848414100090144846cdf2f37821fe9899b06fa783a4d021c179c6cc7e782000420c0c5f0e77ad956600ebf2629a93802e6b464a52ca1bad46cab8bf8e4d754090bcfb4a4c92e50033f4f033bb05fc0735b610dfcb40c43afa0da2b64fbee029ee9e602269c51e8c209d9920fe3ab7ee131db56b765b006726927111ee4f680908b612ea79feb84ef4f408ce99fc0e79240f8b9be282aaa648202a1a6445826c936f67d2984ea444581ca269435bea4c4a28422db284a2abac069c92a65652ca5a65f6aaba4b128fbe5cba2b64f39d22fe3db4f99e997f1e4d12df63f4d59f2694a169fa65c916dca0f3a67ad26f1d39422f84c2192edd9aa941a647bd69425a6a822a589941864fba5937ee1d12d658da3402ef14c7b0549e44e3922a7750a6100c1ca2f72936c556728c550866cbf96ac14e4022288f6c2dcb7caa2c69535d91c5dab62b52b59e504c2cfe5b7412e8b6a225a759588a94a56abca3bae728cab7145a30649e699c08134d74e8c807546aad2e4c69b23438fedadf758c5f872339772fdb18a910ad94fa3086ee6be7b78df0304dd934b5a4195b7ceadb90a57e31ce77f6717c90dd9dc9bdbe43ab949ecdf18b779cc4fa968432ef193c7e0847ba6d9e8008fac4f75bcaa2e7effe3979c91f2f78dde8a2aaf9d29e9b7b34f1a683932c9592b7cdb9172f82a674a0a3fc6197e4a798a674a633c6dbaaeeb7e3b4fccaa2cf6c397a3cf013f439af008087ca8542020814aa5e27e333f400247519366e39acd7d69336da6d9684c341bcd4663a2cd34edc25a381d5960c8724ae2681aac05fe7ede573fa769e48c7c82652c2a88770ea956338e0a12ce703086aa84e68b6c9fc4d9bc491899c44fbe84165a31445259905c974581bf75455c44c007bdf5c3069ee4176ec3238ea2d68645662966226b59896c3f0c427d11736acbcb4f1e45b61f22098b380a7ceb439cc64ffd612b3c029ef7b59dafd6765fb094e3b8f7f0c6516bef256730475f8e22b92f3f6d1efa29d56c6017899f349b9b446c8d2c2732091c1d7f0847ed7f007faa5ceb937b31ae3033d427d5a5bb06699d692a55798494394995a324abde6ca00bc30e6cffea27a9f2bc275adf0dd8a759770938bd2f127bc2f0230e115b8ede005134269a4d48248eddde5bc804ce28535d7a73c23721d9da20db4f3715f83693ed96c4b621c1f9d967cd028faf1b9816c7eeb932c5133518e015683996a688f80ec26491c8e58a80bdcea690854a5ea19e46f206f97ea1bf0229c8d6df05d96e32a85da89b8825b65862ab5fbacff1b56de14d378c0872de59ce5ab71b3776bf89de0c2a84cda6505db67009612cdb2048d538e34eb11536115b214e7833ce481b748b7d949c86308b4f14949c8aad0b54160cb8c906fd5281d00cd90908821d2f05c6082b16301503c0c05416fbad21b70502f50747c66255eb49b6ef5060f03d0d535d9a940259c9197ef0d35be3f9ceff001fff0fcf773ebd3541e0077f47e73d405216054574faf07ce87d80a70f233ac022c0a2b052a5c0d386343147ed8559144a9b5f532826ca8b7e47e8cdd08b42f851ce94c7ac2910d714100cf078a2b57d9ebc7193e39cfc0a837193e37c3bc996a3f6a32a42a56a8d6484adca626149c256080b93b4aacb0d79386a519af494b4c1e97d693318e53dff0a5d999f547ed85e7bedbc32f0f1efe87ce8fce179cff9016bb2df39ef0be5044f22308efc3e1bac1d1630e8b90f5bb615b6da741c472de9c44ff24965b11fc3dca7e48c5c2181bc8e0adccd17a4939c27a0279b9038f9cd0e0c9c92b3fe34848537f745c25a3668b5c8b314860f049c92b3ceaa33e327f23b4964fb1d55cf08ab45819d4a0223a940ce2a6acd9aaa30902b02ee22605875f13b04fcba4943588f0e02a6364c0d5b60d074c1158e417c1191ed83a2ebbec859a7f3b6637a295006f8e1668a2d6b35273d2dfc6e4786dfed3c4d0bbfdb79dae7ecb691ebbc4ff8dd91fb84dfedbc8ee33ee1773b6f6b6920efbb24e769e1773b920bbfdb79dac771e1773b4ffb68a1088adaedc84ff8891af909bfdb899a467ec2ef765c75b1dec86d1a89c751ebbc4ff8dd51fb84dfed3cac699ff0bb9d07f3134782420fd8013b204f0bbfdb81c2ef769ef6e1c2ef769ed6f2d3167ec810877e7129727db0e5069393301e3ea92e66a82ef7533e25cf508327b2c55760912d15c2e817910957e0821326fd223a11c3000531278b6c710d927e196796b0824584f429e6c1caa7f848b68f85d414d300cfc8f8d7113148511eb36c9c75dcf8a45bec8f61541652659f14d22d240d2a0bd9b226fba41592b4a2b29030d858556a8cfa695d5416265416fb631835e1cd58d38d37fcfec4cffdcaa5d81c7eae1dbf2769a0d9d86827776e675792f7492b98b45a5e0a09b3281a248c461815061b671625da58d3f8a45f4427dd12467511c35059ac45893942fa659ce9161a54977189ca925e19b31fb52c6a64599315d565fc416541d22fe3916eb12fca371625b65a35fd62c3464d0e6dfaa5460d9bb0d51a99f4cb0e3b3c61020e23dbb7f80ad5649f0bd9fe8a8d8c3315c53040c149bf6026dd622d0a67514d4b5831d32f1849b7588bc244aac9fee8cc51397378708f88e30faa0b0df2917ec142bac55a143ea29aecf81a734ace443915b164313196ed939509d5c57bfb5a17e18f9fd86a950d30f48bc146b6ff116f8d1a25b7c30ed93e28a583a101ab301afd5b488422ba31c28e59534fde742a59c51b36464e8c277e2a452c1ab40c7a73e13e0fe8d34b8a58a1882562895822562962cd648047757101d531582e549c2a866c732a18550bb50b150cd97e0c6ee340e427fcee38f393a61ac5ae15b65a020887e450b18069f2ebdec51e383c6c5517bf616b073825672d2c85ad225b58b6580719f320dbc734fd42aabac57e0ec4167e416e35815bd96215b420dbc732fd32cebac5fe2c05216c7c75d88dac666915447a9a8d9823b67242efbe0f6156b4e9967612566d988cacba45132e58d93eb943ee07dd50238725f7c72aac2527dbefc2f0de80441b6fc6cde806146db41cc22c84372311c7cd9a8d1478135565c8f60bd93e79436281cc427ef909e364c890e19a8dc68958db6b9c0e3c78e44d65b2831124f89d4f67bc8b0eedb9a33941b369248e762ed85d01d759cfa0ba746e184d9fda07d15211ab036a4f2a8bcd312eece5e8e501de1e8c968846e4ea6c9a678986aece00200440d3108a2dae08d86de0f2dda0a82e47b27dae2b8c3bfdac39dbf7054d61aba5fde741cd14b54423c0da0be972f07d59fc28bfc3f39df347e73d8f72fe30a2a3f39e53e5fef03c3e55eea91201fca1d781f2a2bf2f3a7d18b9a147e97e0316e5d466f00f233ac0efbce77f80dff9f06f26673e8ce8e83cd879f043af7947a73b81f03c036aca73ee00bf7306a99565ff1c04f0372568648e344c0fcb9adacaaca95f3383581be7a14fcffbcdcc9afcc6869c0caaacc94719e8d54279144d156b61c12187c5c401875ff9960751c4989693078c030e0fe32d1f1c6ec08105c5f9d1c814f1fbdf608e39238e35790ea81a653418d3581c50555d56de7ffc8ec64fa337d5f0fedd113fa1ef0fae98386a5eb13213457fe54d0f86c418d3c903464d66e791d9790584761e35c71a47fd6b304719ab5c5939eb3732c3fc269119238cc39109762d1bb326a77159d37847a69749bf32326f26999f70647699f42be19b2b3f32b9ac99418cd04083b6f2a3273d9822c6904e1ef0ca4aad2c24b3f3698e44628e9a57ce91b9e519e65732bf1bf334838c36ce83bf111f3847ebb232471d8ffe473756f62611193432d95f8639d6b8c9df343b18c91c658efa0a1738c52ba34ccba0281c995633bb9635f99f6647634d6f567bbb217eb2aef96924b3269f71431eb5fcd4f96bc93047a68fcc8e118ecc9adf2422e34966b722e3ec861081d3ae5563a494a2100ae8a3d2677a9ffb91f9e5166f5c15b347c79059999575b3aed5b5aea7179bb256f76aa5d84cbbaed5c9bcd3039decfa566bed642923d6d30a2d90ad3441037151072cc03a23c5aaac3dd8b566ed410f6b0acdb5bca92d34ad09f95e4dd3d29b93b5fb60ed5aed48a41fc66b5893f69d8b3744b986a35a9f34ac49eb74806baa3fbdf7a5bdecbaac497b2d6b7f97f8a92a29c34cd6fee678411c1552dd1a3f5525647892351a5f649cd39bef4de36461852ca717075c2929c3909cde279bd3f053aad1c0b876f05387216b36b2e644bbaaead259ab29ad5f7b8dc6da7386a3daffe704feacdd989ffc33e84941880e66adc502f6edad96246b1a1247b57727da3baa59537b65cdcf1b73542b82d3cf9af6afbde6affd453203abbe2a7c83a4d9dd38daddcd774dfc34bee7008603980d349adc1a14b95b732277bfc6029b9c823e591b4791a82ef8351ac89688c920372bb7c644eeaf7db23277416e4d89dc9d9fc96c5060a0d847e6f954cbd5ceacb6bdd6379f13a77a4eff8e9324596b7d2bc654989fec4dcc4f1647e6279b636dfca4a91cedbf81e1c45acb982449f2afa3e457b13e8cdb1bc7b1155575f59bac65b17362d2b43347eb8f62054dcfccb533eb66a69eeb6b66fa79d218b97628fd9501044fb856f0096e6b76a05dd94f0ef409c4f60540ab859c261302e1367182dbb67152c0f6db75532059eb96ba6d27cca1e5b51c9a432ab009b23db52eecacb5d65a6badb5d65a6bed75e738e7dc53212a4e76f47ade674d100c4371ac3160f85181fd64df863dca5de375c907b056ad95d970b4861566a33e1813da0f85084fb85a0d0ad8cf341c4792c4b8138a2329c68015d7dae9743c1ecf0e3568545078c228620c08aaa3a150482412958e6352c251a7cafef5c4c56a13b21198e46a6dfc3af6d2dfd11ad67471a97a19b7ab1a96f5016b72dd178695b197a1363ebb2a2c53ae9e85b668546b82dd189695363f436f58d6e4d7b197dfae7ec9ae0d9e95379fd3aa580d2f6938b632d654fbc5fbd46bade20f9d433b73f4465bf0bde71e845ddbf22ee5f56f46b88b7397d56eb61c586ec15ac646b62a63369e99b68c6c55c6569e99565919dbd2f273efde9845d55a3fdbb137133410bbc538d2dad6b5dfd2078b0f6c0c2a3f747fff9e1ce8efce1edde3fcc1e233bbe27dee037da1ca9c59cb23eecde00d9fdfb5da99ded01c855059c6159ad3cf35c22a0bd7a9dc6fc9bd9fcd77e47b7db26ff67df135f9907cb0ce3d311d33587b95b7e3ab9c63e75e7c566b1ab9911bb99193d91a354acd8c316e348edad4877c471c7d7daecf258adf99ef81c00727f611475fed72b4bf9c96ad4fcb5190999639e926440aed7369dfeb738dabeff5bd3ed777e47339d77523ebd3ca22a7258d4afff64052dbebd07edb5e3b75900d249536926cffd472f92a8f785984c6f4af4268ae2b595d79a4eb4a58ab7c95b1724959530e2969ba1c08d88a98e3ccc81a57ddf7a96551da779f16de8438bab5b46dd59da5908d55b2b621423623f5c573e33dc8f6b722421ca5bdcff8a9fdd41b0fb621d99ee3aaebcc7135b2faefdb3baeee3b2773f45ed639b2c6d53833aec6959f3aef9ab371745c8d2b3f8d4bf07cbf3edf477e007dbbbc54a93268c3bee655a9726535121e1e84fa82a2054772c51539ed6b862a55466982d2a4b2806440aa4fab655a261449c733232b8f30a8630cdcc395011472c2a1e8c60096392a0b18e33bf2b954b81a4e36da5eb0ad385965b17fc1d6ae159cac5ce2a7f4d31ae31c763d24e112ccc9c0d07befc5bf1e06496fb6a5715ccdf8a4f85cb783e1b464d55977e51024313f814f03eb969432173d8675c8e13b7650180023da733dc8f5c11b523a398eda278edaef1102893dbecf6d1a027801e4b0c3870a9f59452d4895de5c7e5136016fa1c58502471123e627951f7aab275090fba9f058591af4b84f04a9401a9c7eaeefc8f7f2138c07cc863604a940445494c985aa4ddb383bde07f52007e8d558ec2b8b7d2e895ccec0860c8d94f63e68ef3f9395adac9d41fc517053dadbafa2f712969e1b2f595ad7c3376e39ad31b206349b0870d301ea0f1e2c64fb5e0e1be09493c5b81a3f31c100c84fa1eafd14ae58a50cca276ad9442d6b504f9eab64895dc427b640a0f85d1b90ca3ea888ea020ae2272b93ed8363e82611f23553e6a6c8076741942d6b2a693aa59d008b376cb9f2d38c9fcab3071dba8c282090cbcb22900be402b940ae745c991d278e825c7d8226a2fab0a9aacbe8f26926b2f5d81664bbca289f760c9ad548f40a5a891663c2300c43313cc75565e9e08c4a5416fb6465f198b5b26ce312ad030ff6351e300e7840a1c9f6412314d93eb7a4bab46f1c57d39c4cfc2e8f1ab39917de566b048140285c0c6b4ae02e9b80b7d0e24281a3485b559e8ff271a0f1b5195cade9a339e227d0cbe527d1a2b4476927e8076db24fa3fb7ba6e805cfb404c30f923f675ad694a01f34aa04598153901210121ec404140a7da6344056c8f6bf941a25704ea8281e1c175c179cac5f402a8e0add6ab5e27894a518d35fa6e438404535113121946513f016b5d4e28b7c83f39939aa72745ccd007f669f1948f589e411409e78c3334a932558fc999f524e96553c36f0f5a08afa4951a7a8a7ee970fecc362ebb61c1dc7c938196cdb4ef8f32b624c58539e3104f2402f90cb412ed00be472b393e349a911ff1396622843e8d39418a43421fa34658a942a98d02f1e14a42ca91e9a94999aa62ce1899d212509cf171e2b54165b36b982e7e673444d02abccb7a33971f4d3e264ba0f928f1595c5fee7a389f161d22d1f285496cf2c25f679f209a3b2d807a92e88654135a826fba2b9a9a0b2a4c0a23e97357d66b84fabf5f93712812b61c8fb0f143eacefbc67e8193f61b83e4ffae523a4fbcc3eb38e861034bba63e214865519c6c48bf6c49804049e0a0fbb42cca53b6c48f15d5c58383ca82a45f3c43ba0566511e1a6b824275f128a92c4cfac593a45bec7f54d604aa41457dc40f0ceccf6551db4cbf1820c90c0ffb61b1727c84f48b0d1b1f2129351e14a430215b8b4ab96248bfa41ce9161cfc20dbcfe22e113d341695520325d565899ca45f5266ba256651e519aae98b7e299d748b15c290ed17a14949229672c48d459551a8a6236a12b2caa2ca9835d92f59d6e4b9b9c2657954399d9cdf92e8971add623f896c35275a8e45a9b6146c2aa82edfdb47117906008578c0cc460f97c3468d859fafd1ad1f42ad53dbccb6da6a6a5b6dabe631858eabe131e36c38590de1b82a9de20174288018d3a5fb9ddb009ce81fe8852297000cf0504035420e1e316c730c6b39ad331e5708b87f5c525dfcbbef16fb67d7dbccffc6da56dc2c073146e464d5c54f18fc1bc403e890bb0763c4186709ddec1b628e7afac0b7ff7dfdb93a71d40b40400e20bef32e0a08f4eef88939be1cae2c945fc8654e4985fc95b37ef99446e0c226a37c5a62516691ed97b07ef9b486f02aa5f0dc748bfdd0fbc0fac513bb670c36fad85a8702127f5b59d4e7fab4fac543f3697dae1c5de87132cf4dbf78646efc1b03a95fa8d4cd72574d2e19a21100000010002314002028100c06840312995015b456e50314800b7b9c4a786ea0c9b32486414a19830820c410100000000001d2a60118335de0586937248997087b0f6c46931923dd1c139c6c99903b456f3bfad5679029ea210226be4a5058e94d345dccbc9c9bf1fac38d30aa648af771077cd5cef7b46c5146361c1a2625b0bff06f623c6b139317cb85e41b8eeb4913cdac38682b7187f198bd0641253177069616c6a3185cb05dd9cb479de6adef4678d1d8cf60e4a4f3f3753b5c2ed67709410b6c318652465c0bd010951629c3e47e06b01f633fcb81ad29e7b57c2324736401fc37034cc5acd69045f11641c87bbb6ae2e44cdb99499abfee4bab8b0a2111739cae07071d30b597ccd5b6f3cd0edbdbc784c29a5d06103303968f506060c482f5324707059c3ba51fea54d7c3325ddd4985f32f33fadf51a2e24c9bf94762ce84e9225e83e53f285f002db6cf1600a762db63d985a444c6d81ee46818d24837a0b34fd70c00ed9a5cc9618b717db3399e4195075e68e2a2234c932db38c81f810de68a02b81603bdb5dba8e6e5ade7edb47cec90c2860231c2afb6071a2b1378d69924badfd0b4c4be93b6a3a729b46726563a5e460b142c11829b82ec8619e9f1c1b1ec11eb3b01d46050579d60e26becdf197185d3f60e3c4411b4ca9ed60f009f7f375fe7b71b85ec24c55cae7e85280cb8d97e6fad8055b13ee1a578d1306c9326e5d6434ebf536e15218301634c0bf6f1d952d679e9a6d0c1e00d665551f7928a560311ad86f9aeada9b94ec5390f75deb4adcbc8471f6cd8f36f3ce54d3e625d1d5dfb01e50d278cf9b4b00dc0696de0359aa416813b31ca6508a12bbde91c4e3b33b33a014152d98b33e4d87f829e0dab68c198181c0e4b6b93469bd8f1f6220bf4122f77b100a1e315eff78d199e59f22e42ec39cd0995854e69ed2702d570b36a0071400f23bbc5a068b1b40461ef69f814a397908a97ead56c9c1a2d3b81749a059d7a41935dd74d02f04c4f883e6adceba256091131f1e046fa54cb455aa34299b7b44ec51b48051eb3c628861999d273bc2c21d71fe7662da72c95fcb8eea9918bcb183437fa488d6242a918c0252c44df1e1a2b993bd9a8ebfa2b35eb4823aca9b883eb9216a5c39c2c21d7ea2bb039f9af71db17423c6f2eef60659e3c6be50e505c52af9870391e34828891008ac64f0382d86aeee68bfb8c1588c6937430f1ca45db8e08911eaec239f828e3e68658434eb8953905381ed141d28d0a727ea027a3d3ccc0065ccff849094e3dd109adf03da11fbc48573275b4f106fc5b9c1df0951c007a65a2e1f61cc817ee4978e0e94df0f346ebefcb05a5139c47d7b24c7c7364c78fceaa98f0e3e08f2c79632e98812c41baed0009243ec3d7f0327f3b10f4d8afdc3d213444449b0357213fb8818d71cb05a7585a74a8db8f2310dfaac1f043f9fca07c082d4e99b47331907fbd09588a6110a82c0906a75495a2f02906665442e15619179c63a17b93cb46c117f234f1e314311f14f1dd7343943cec427fdf9328d297db849edcaa5269909eec885b5b82cef37487a6e8178338a3174fe3650ada79194e2896969175cd5e7953d04e22a07b1c864bcd66edc4bec7c01da24f49627f45860e1effe2f2ecb2165a4c156f39eef7575d4ffa947972c33abf0012793b288291391eb5eb81ae9dac854889dc6eefcbaa0112d64e7f229707008de14c3c2ebc69a2002e7b0dd1998088c0e85bdd7376427bf20676aed473193a91b1abc668a3cc76ec432cbe091af70d40e9b829e2723673f5bbce6b4c801533956935640e059f53d68f50219790b8a0387b66dfc25f419d273f265f208e96362b71a84783f08e73b958671375186445130c1a0335fadb75d47dccff982fe81e2a5abdc7cd327e5f32ba2590b621b3dae607d96ed5844f6f510e7050c84a4bd70801d80d275e3b146dd43f8743d3ddc2b42b3800d33298beacb98cdb063e180c4b02ce87c468138dd345a511aa3752fb27781b48d47231d7a02e048c37fdb826414d28f703e99b91fc5002e68dcdd9264d4c1c06d210aa6855666908645342c913bcab557311c66418d99c81c0f14c955a3db3092de37ed474c62755d199de47578c1aefc5c3f1b40b826dadabb4746b8f5e72addef1055f88c9122ab7423bf92c59ec17664d1a35b7bb8cb8be2ae36065c026aa6a21fcd0143b7ba33e329ddf3d9a3399533197a1a32f661860c3d1a61779d31bb2db7b5bfd9b088352cf01246896fca2eebebdb1db168aae190dbfc7313657490677d936a9c06baa39b25480ed4ff55ed37c56659e0ade6236eabaf00b4fc531eed3a1845645964326ba4964508dba4eb2dd81c8fffcf798664f5d51ea3fd11f4e8a9b54e5055267313b6c7e841d6370eecc73136e6f1b801d7d33046da4f17b40eca20faf89ef8e15eb67ff67b63e543a2070ea0df274409341f88da81b82ff4dcd5f9c3f5fd519e507ba1e77211e234b486138931c619bf6e51a2d3cbc80cb6512b49672a58adeea0ef59b1f7eb8866db03b8257f47087eb5ef89982ca22b37d1bf0c549baefd7d66cda037827e5093dbcb7e1e5632631f18a94870aaf58f4a0abdca30e2fc9ae2b60b8285720ba0d135f9637032a8b10405079035304c63d78cae0ef69523eb326e5b69ab1770ca8f8c1002fa2c623d8b71a36ac18508831e9d65273589e375d7467e83e75e0520ffc047b0797eb2d3c1db09343e6a824e22ee8dd4647b6a7156afb1b27f99e555bff497f02118f41c44fc39d3bf4cf63183f10b0c35100a12c04e9c3ab3ac47b8a96dc232746490676c68a38f72727c69f5af9031b67bb1aafb0687cc2fd27eed34206b18435560e41f221fa7ad32be675e30b3a0a74b4dc6a3af3893f84fc26afb5af5eb9b3cc629054f37937c3531b867c2723392a34e43b5c9d6bd86cd0d019e153a5b5a2ae829fa663d3121ee5b3657b25641db26981c7f3b180a7a792c3bc07ef274d88e829eeb1f594bb17e0cc363893c89ea7a5008e541a91009053dd7d8cd7e36beaee8401c4a12773bf78cfb2b1a4623f95c2555d98a8cb3d9e7b0e448a52a9ffd3d8f5973ab098ea7ebc5e77467a8043dfd242913cb7d763f825832bb0125ade7755a8feed6245e5c3aceff201d16443b27225bf9216b6c3963aecca2f926927204c2f9bee00bacaf198a008ee6d7efca4cbd9063f9f44b1b201b5f8d778f40f9a605a648d6fde1f6c2f2133123825810a1cc47f3c7d1606b3ea88a6b9a028babd7943e8db791b9706926a0688ca17754e83e51f305886fbb1b46f35bf9de5b47ee301957fd3d781bc0bb298ff1362ed42488506827441e4042ce31fc826708645271c6fcd7f4c4ea9b6dc8204549e76f7811b87f05b132ce40037e4a698a9043cc1179358665fbcfe1f9073a13b04702a13fb496108e9e056e17b6a28a2a016c0ab0fd15b00dde25a3a8b0fbf542e93a904467a264973c0ddd5f19e60fb8ff00692bb440faa193fca7542d9bb0ce4c4ba5f933d1907040a952f01b8583481f5a15b860dadcc7eba3699c4938aa9db94999143ef498297d0befd22e63296ec81565d75b404b9d9a7606e98bf8d0b27fa45c29948b7b57158241cfd099f551314afc83182856eb7d88fe60e00c0aea132d9114ea1a7eb76bb251ef8f505161ac4a246e27dc92ca75d4bc0b886d0b21bd17a371ab8799fe85cc0bb97fc2a91a0f5195c6c22ec470ed99605cbda04027b30b10b6ff8a572d2116689a30bab7b60df6225d1d911e77c52fff530766a6673faa818885f5b818856956f4877754dd8d3e2267c017326f73bd3642eeae2a15378892bea0b9a176b7d4f14aba3e10ef94b11cca8a49f57d1f1b8e8b3a11c88605cffeed61ee80e51153044d2c8d748c1b0cf6b5a5c9f8439d8b77d41ae76458113c758e23ec552193fb133e7861bef475bbc19dcb59a808239f2bc9bae3494172f1cbcf54cd00a8552a1a93ca6ee905a3c87d8dfa5da2a1a4e010cb9d0800d47367833ef84ceba67b7fc7792ecf9d90791b8bc579459a23bfdd982ad79c98ce1b359f44a12d8f624eca3f737c7b3b517a21c9cdaae6547e67a5d046d634a37adc894ef77941f3a7f2c169497de78067ed4c6825e0c9f634c08fc77d186e5bbfb64d89fda0297311cd3c91db3b0d70bcde658988aa1c678a539d32ca271cc49e43cb7412ac53baac1117d2d785b6d3993861a3caeb4e349a473e1cbdf81838a391047d4f98e9572e410e7a1bd87d46029fe7423ad6bbef98187dcf523e904f2d1ca7947ab24f0bb2768938710fec9870dc677d2094cd3f86ea1e8a101475a2671fce61063f04f8eefb488985d6640a941ed81b8a05c485e6a67f66b84cae59a61bff7616b8fb72ff832fd1fe890ee5c08d16958df25a9290378e7fc248d56b470aa5b5a096b08db26cbb93e1b8407529994cad672d27a9f4e21a0742f38083b93fe073b646f0e8fdc1a0d6d1a6eb1fd9d91e648f8436f3297da5df474a4e926ccf4cb8ff02b345f36d9ac16cba1cad957f8c0ad16ff9ae5eaef3c93b33fe24b32104136ebde85ceea1d8e3493b7513cd073c9cf81b202f1b4873f03ca4c37b06d3de689e20c1f7406e33ad3e2c26402ee1c53653195042d95137bb541ca72f0913f1ffc01b71f7c834fd1ce12d04b1c06f036ccec4f9ed3fbfa8cfc860bb19ff1c8750086f2bddc09a18de8114928a69533a66c586f7190d6ba9eca5bef60a6f8cd3f07e238bc27ecc2d5c71fad4dff090c1bcdd0e008d3670646aa8d5ffeeef5fe30d6f42a3a33b8baa3b66786fb353b0e670793ba418910ab07644f04d0e0ffcc7b7c27320b6c62d49ec51abfd57b4ab2a1ca1e4dcd8bd85158d13099b02389008a7cb7fdd3b778dcc8196bf34e9acb5a5be0cfb7a188eb269a8fa8ca77b2bd938040c1b836550ac8921fc04845deb7aa7052bcebaa654c0fbface0f50d9bb32faab915990f4b042d3e9de2e4b4f557b9241a92d9a25a92575fe2eed9239ba475293a0ed189cce5d899bc006d6104b82effd43f2023289d3c87f4d4ee1fefb66f8d85ec66010e50defe50dc3b9c72d1672fe05a493efc80aaffe2a9a55b40868045ef7e0f5e09e7a4dc98d4a9e178bf08a6167556329ce1ecef5ded769e5132402a9345972a25d96cf4b41852272f01d4e172bb8ccf8bfbaa8849169240c3d3aed03047c8b43d1dfe871fb46644f70a1dd8a4eed1ce0860777017f2b08dc0ce21c6a604530441ba093af8f45f51a8f594c81289668c33d81afb1db24e117c6fb8089e70b30f868dc19126ad91ce224d33a66016d1bfaa8f2e86dcfc406d4815062a1bd2bb503318f73d28560af96813036be8a2442cd31e0fc97de0181cc7d6f83384bf1ef5b1db944c2db39d6fa6aaee2016326c22aeca45d7f53b4017d248634dcb34cb944584acbfe6f51ca4634f60be226bf0ff25448d95e8f0516dead77f1cbaa4a3b521dcf26273cdc2b6807f21cec4330c758f03ad8cbb6e17b779eb6afd5c762bf1d64c88256722dd5649441d79cbd6ee6f2f56dc7ac6a9778c75bac2c721d97cacb9782f87c74a9fbdb2e58d7741991dd0989be6bd430789d3b32a28446b8cf27d7579979e311417566cb551157ef6cc702f270cdd8ec82bc714002d4fc4d6f00c5cdf078ce93ece4f3a8ede083c3161aedae2e87305ad9f4c6edb73dc007664fac709000b6f62f2315c4296c491a836947210313639fadea2fff5b5a77d45a8ca1a1b50c3dc5a6343d17932d320219ca598bdff99910eb270307308ac1fd2ebb4930df067aba298ed12ed2f7a9024fd4f87027333e2d99066485b05999231792607a177e20e9407f5ff2500bcb2d82f0fbaf5b5d171f19ca91cf21c7d1daf17fe960a17a3b94407038d6d2bc8d6148254b5210a435a93d733326560de8fe0949c3076e347ec6104d61d3176b9c7928691095f80e6c7a41e41e250c3904de8c3f059d13caa538142befb876b9a76e5b847405f5915d9f9231a8c049d50d703207731183fba5bec32b220bfbb45353b5e18052b78e5822b344140f4d0fbae31d2e64bb876601e279a54da4f572ae776691515cd30dbb2021079eacfa16e1abcc648e125718e7159f9d1eaed3bcc133354f38dfd24892e6c519493d6075bd32a9aa20d9043d50f9267559055a257121b616e5615994873a4258665e33065d5aababca8abe36f4557da1eab310b4211519b165367e8dd015c21a5fe73bfe3e7e18509308d69072ea0ca7f780187e0a4af48285d2906e189c5e4a7222841c9f86f2f7b0e5cd79b1bd2784182cc7ea86254b23f08e03b332ea821e3876ac74512ccf88ea9123e59811b3b6273ee4c06508d62b50510e86f63c279fa6cce8015cb30ac1275b9524c50211cf4ceae638c02a924fe524fbc045a77033bc9581d60d7c29648979841d94d49b46552887279d5083c8bf95c0480a1d95c740b55a85811e4224b2dc2aa8380cb07b15b32b0faf30c72f91671805ad75ea7a1217d647a23ab2d79cc2ec6643bd0649f5417c8a80f29744315a435b76704d01f34fb91cecb2a8180e8a8040262ff78a5b1cfe03084621c7b4e648141bfe1df5a5630cdb85b5dacb3829ec831ce0f8716e6dcd9727462953eda02f7be4aad715921e4c73f2026d7a66a3c63c792d3601e49c8e7ab888538f7a65acebd4cbfbaf0c82650b20c93cc221c05349a8d2ca9c035f88c9c2cfffdb24bb74c7b365897a7ce733acac35e17cc610b4db09e31bc3ae445620cd5c7d447c70b22945d9f6985d3f79140680444c64a525d86ce0af56f5e89e161519db1160d1332341536bd58dcd4094ed61713cc70856291b24162a945f0fe5bfc332839217bf1ed0cc4c5aba1770d7c3bc506cb92e5567612e950688ce604c2c6ec2ae87a9b6046547180280cef8f597523ceee085c75012bf080c5a64a200a6683e6bae65816a1f80858808f833ca1501037b243b9e8501d12fc279cb7af32db048409e3aa0481ebc49c96254e2ab2e40e9f22443bc9e532f3ffe0ed776b6ad4fd100aebdc1b5254d69bb1715aee743c304315359aacf22841a9c68dbbce65ff6b18184cefdab7c7f55ba9d524f32e9a0ed745f3dac0817c41abe8c08f644b0143a8e95b05140c5c4c949b6db885d67141d674f61a816a76731ae269979d1aa786c03baa12343332044a93bf2581545999d5f6af0a70553a5f7f334bbfa85ce7055b33c47ea7ca5f158e540a07858e098598ae5ef31964eaf0bdd6e5ce95e5f5d23089523832525d26fbd0637ee3877935a69eaa7213d91adb7bedde1158be8636029af93e6ac5acff3d8d9d8a92b60924d062df0eb2d48ae9def43fa62e9eb0d2c7805dcfe95f4ddccb94bb609a9b7c5af921f97d980e70b428310b4163e0b1d43063813b381117f34f0ba99bfd50b3721f8d9cb7ed6aa8c86a5c6455368dd7c0153077ff70d4d663550d924c0bc686e557964565870a9c8f471106dd8285a7983a564867eabd452c9c07735919b3de33171f6efea25f23a2687b21e8248092290a7ea95166e620d4eb1fb174f39dd000e328142e23a0404e81f40a1b3ee438eb44926f93a8a81206dc37be1a0c7cfa149871c834f509fb044043c596baccb74078d089004081c00111aee292f855a8aa3e3f3911d7d29811942a8f4f128161e682ec171dc05c14a8e68f0e4ec960c22661d4e898646d88d694d798ae769e644973ae5b94664849e51c6bf8cbe95015d87d9b9730c9f85f8543a81daa98457a5c7367a36b06996d9fa63c914e479281bf688f245a74a25264a3267e51d0ae43f46375c6a89a18b2b6b1be974b5be3bbe4f8f8bbde5e73458d40f841cfe039af71b8126ae30ab3455db840467112f84b62d15a3763941fde9d710c5812482861aeb61b8f64523718d56e28412a452aca26529bec0b04f7b49ce926732a06ccea7abbe6c0e0cdc7555e1c555fe44afee8a3c7d7c926f433a1961bed34e3b3216cbe7ef540ce698af302e5c2ade63cd200ce67a28efb19cf7357368657f33df6ef37b7c4e78c1f8b07c36f14fc3c4e95db5d56fa54bcd9f989b7f71d644674c6df0391f37c8678576143a0a3ea00eee24cf10aa6c4fd7369331bebbc4cab279feb64f30b35ebfb765f91a87ec52b640827db5e11d07b16c4e391b49cb301b9a860e6c801ef411e35d68f05806e40a22d1e87ef58afe5c3bbce399af8e8eb4f976f107eb2e826716976a9515d8289e73085cea9cf0b57997072e5fe3d5670dbe1abcca5d5cafe9b8125c888150f7df389cca9505e695cc525e75d2e0c987544119e97e1bfa67a78006774a1d8f6cc53c1e7e33cfd47cec57d2944e48caeed75619944086d625a4c9701cec80a84bdad5ce41090f6d66e46a7a0961556616531c414e60e7c771a519d4548e153af74c739354757529ea338865efd8a4a38f10bda043fb447e4a974d92d9a799a26b20a59136e1cdddbbea8db64be9fd4c4527c779b3793f9a57b2dccb7ce2aa1a897433648ed6b11cda2f695ed9cdca4553381715f5ff8c3f8ab96e93e08d501721d9839958ecb71b65905cd5ea96869a9f19fe0e480bf024141a5eb04017f7c6d6343c5d7e88dd4f62ff8d016d2c9d8e1d77f21e686b1dadd76e480412b4f1be2856907b8d1f85b8fa7fb16167e2cd4e90a50d9b792cda9b321eb728c8382797321a3df88037f5a5d07a2925aba81860fd22137f30c168112b3b18b16ade6012f3f06a5693c2294e5b6b2eabbb815bc6b739220b03790c69434bf460d9fe31d06dc96e33525aafa25a2ce302fa16d1c7b7a787a6459bb63c311790b7c8b8a2d6b452dda7c5adcd3edb052fcd84ca21f84c612eea35ad29568e39db767b2412b5f488d74d2a7253e3f2d1a569b54198bd3016a11444e0aa3689fdc606ee4063d89b0d8eccfee34c48c458cd06d82e793b3893984dae2b431a1a3301f9e63b1497c9a36872cbca5625dfed6d93973292a45624bf83119b03c193513d8f27fe49862fd100d366c428897f26dbb32a88f3dbbb936476ace20289d8f577c04d9334692f7fab13db55b5246ace0ff9cc2916088cce7d4598305458139ded934b9a140e0617f5ea4b3729b30dcb1d8b530b21a1c5d1d5a4084d3409f140e686e24ab8ca1dbb72a84397e0a51a39433b01eb2629a779d7639cc54667e30d1d9a91b5d9104a18011df0e8a3eba9de113d08140756afdc0d5fe2ca73adb6fee74e38aaedcb47c8e73cee701c60a403c31b11ea3443148e0c30626acb96873d0bc51caf321cf90a0955e53cca98fa14b22f352ba444a1093985b6d1548862e6e5e62bbcd08ba19084923726bb69cdcf5781180ac9bfc9f66f37870ff7218e549799e005547c979d18fc9ea7683c152bf05613b26dbcfe2068eda9de20f7c5e205dda09f7c6f2cf5adaae2b80b4ae02e5b41de14036bec040f4e8167301256060f37c0142300fafb0abc12a80403d246a2d111fae68535f843681c3ec08d13e1025a197df0fe8290f815f4facb0ad6a95096d2cc56ea3830a575c0645c6298dec604655d337c62a033dbb2b204164e163f21f0fbd5b431350847ad6a2a145a614c8c840886e2dc5f7e4cb443d02f54fbc13799f6bf9933084b3c02726d66ca470786db9f9ace3b9729c01566cb1404ce7b8653d125d8cefc44f1d05284c3050b6cc0a27fecd3a6cfa7ae4c8f35e122af57a01752c9b4ea729e8618905f066653307d19feabd71c26b84fe110854ee25a8aa55393e110a806f019d02c76da4848a970295758f4efadd2554d066d85ef8ad8e71043e4652bdb3d8e7ffdd63bbe52fe647456274868711dd5c58cb6aeb25f284ce7061bb49359ed1287af96e2e1eeb8370a33a2d97b0cc5b078ea2d7b2c01a82108bfb274c817827a07a6e7c89a0e12aaea007f35736de2c162f0e56fb0967b923de8a30e344f1541ca53916be6833df6fc9b6844a3e5cd68f73e10948da383f910e51a98f899aec09f1201b9907ce630689ede12c253839cec9d6d2c9867f8e309eacd29675c81dc2cd626760e4620b7074a66a25a46b9824e9b853ca417d13231ecd4bb682f3f0468b1e79cd6c73c4c1cce87f3d53ce3dafba7da84cc46117acdac5c12f98a4865a3ede6d84210db17d25ff64df6837a878d22700fb8c81ed348768e64b47875d1cca86a29481607feb9a0481884b97a05d09ffff40d8150442b145be689fac905fd92158a5fd53dec34f11715619cc2f7fea070118939405e0e9f38937902f5851aa316ce8bbaad52a07b0a0513071950eb12ca9f46a8e2da2b496b94d5994483742f56ee1172475dc386358ba92a8858f087a8a8b7b0375a9a05380e87d5110bb52c90b3b3d02b3649e6a297a5b1d23c580a10b0cbda2eefc5aaf0381527691cc7563807c0d61129e24d3a5f5aa3c61fb5368b32a85e76773c58366ff554859e8915e89c092c4d9d6c3e5c8b708f75d07ad741687bcd05721cbf42fb0f3da9e4b9c99f8a2a1506377be5b9b278a24a0b3b124a7090665d6a0af316b42fecb3370d46894051cdbb0b8c55ab37b5445380b4ad3ec8118ce403ca25babe3637a9edcdf5db9495e92bb3d9191e15617294feca07e25e2f5e3f14a66e48694b8bb7f5ce4285be4033d2e7255ae0cf649726f6cd0464aafc05e686e36743686bc3c1927c019b7889b429ac00c46735b2007884b10d2436691677c85e9feb57be502648d5b32ae2f272452ec68a042fda8b5b99768b0aa625c4f4e45f917b1ae558831cb795d85e64f2bc522680ef5f69e6727095e54324c7b1eb989992021a92b5c2f3a5a612fd755180e5bf97af0c8f0e832dc0f1c505aa687d2e9618aa2bffad31136bb02707283593ff647aed4f829a83ea5544278cfb7f73b446c9a454767b29a100f48b1aca744a19de94f1f5023762d9acc5ec792dcbbef3cb528107b520748024ab43e68887aaa2576f71835b0d370f60bbd15d3ed3d9a63345899d1f0868f3b190e156e697086211aff4558571a8654d1e964cdf0823759139cfed2ab37c8ef9b769325b3084ada083db2aef313e11b6f2be1d383a89f9c76b459db090ee9e16276fa7b2b71cdb806d0bc49b372c920e7cd93aaece31c80beef44ccb82354437dd5aa1bb438ed592a3baf1c4ab3fd026ccf84f10efcc1d346020ab4aa8e155efd64244205a02fcbf05fa85920c85c6b7b0c2f6a977bcf5e93200b18f8a22fc0859fa67a7e69b65eb13f50cacdcaf136bf1f6fd7f92104cb16845312dbabc920d55344f09daa7ffac156edbf1f7f28058385bb379406490a24aa52c8d75a050f673f94b16580ec8f978ab6164bd9e2bbf50dc3b8859145663edd0c704035c050814b3ba97bf8d6261fe94cd9a41eafd84cf3e9e6dce57ed6e9b60432b695aefd114d36f159618d6540e190a2e933b749dd34303e709dd2ac4b455840faeee0fecdf1363766db43ce7c22b5016201b0ab1dae7cdb90be18e36ee96d5d60c73d29c10ed790119dd72e9395758a7e967d04a4515db66319cbb290b45bcad127be8105ad0a7768e044a41d80c02ead28c54315f4123209a1c246fd9148c963b0ec51d14eddd17dc15e8709134082675f4e7c6ecde3353940010a0fda03bdd6a1a6b19d029bd5a86682902d1e8ca743fccc84b0316429fe2d3edc8b0bfdc29ef64467487b63992d44cba11c50f3efee14ef47d9a160d5956224e2639413b423e8bb0040899dbb248473265626c3fa52259bfb2ff52f04c21e7b5369aa21ea90470df32585e132f252468944c63f53c3e733d0e8ca5411be6cef6c1e87d9f16937c9c9de08ac48cb8f4449b059c4e1aa61bc2aa17c6cfad0cec1e1fc52ac1848f2a0759b2223501a73fce9ae8d9f8d44a1cb294c3d6ac6591ffa487a57015dbb85be136ac79192f08a228010135fa0cff8d63e8ad5b097a1dddeea2fe64dfa1e9e8821ad8eb945de79a6c2bcc4c2c0144522ba00b59d800db1ab34b9a185174c6507b13e67fbc2303c580f3df495580c8f4398d0698853b48c4259cef3f3ce6a373dec1d3f69b1f1e67a61b0fb87e36cab5be637753233eadde5f82f4dd5af4ab0352c9845c35ae4eaa578db9167a4bf18fb8328bb0d3980752ddb8b3116f045bf72837ad85dcd87f8210ddca55130fa6b073c238aaa4bb26ecff70fef8cabc091d0bcb588a184b6a249eba12c69dedb4095f017f28215197ba07cef9a2b6e85c7aa2bfbd7e7ca50e7596c434c61e625aefbe77e4c723d0965d3e8ca630b9f9e6b04ab62997f371ad1000d6b70f200f98d83fa5a7e3a452987f228b5bc4a95c56130813e8216ccd9730a7284025ae3db0e46879332b5355d2e79eea537edb2561db599ea084a09cd7a38bd2be0fe12d7da7b3b8849ea0a5e423bc3eb01f3334e84a6bf40198c6b892a88c7e1dfd79c233188dfc3df9d6f876de6670c81134a41b6509048fc80fa96bb057ee60bfa31019ebab2f5c27691053b257600de762a89dabdbe36174740932a2ee58ae5c452e11eb4ef7440c92edcabf35e7611578c2a90d3d7458e5aa64bd492719f7075516e0df6401ab7a6512d8c74b13fccaf68cf5cb589b4d2600f4c87c25e0ec0b57cc1856754861122d8063a1afb060b1f3782afbb180f4e56fb4ad02351a80059d667284886f9d178a0f1f8db0daf961cfd179539e31a5bcae0dd6de05c21d7146c69f4065fe20e4f7a8cb8530f6f4a15e28d61f3470a5ece6b936d03e2b887ae5c2e29093a22c4ca91a954a16ff1a3a1c6431b645462caa3afe0b99e2abb2650137b7bdd0c87acf00cb63bf4b0b1b288e3114f3de85a444a9315764018b79b9612425029478bf1bb41b9346aa92ab15330d1c18e47eb41dac3e528b9f29bd848f20319ffc01e7aa97c91b697ae46a03cf2751614459f423d1a9fa9ee3f9d2092816ff6d4c5cc889e5be544c31de65730e008c92c0e3daaac190e282a58d4c00cc633c62920f00b6541334a8fba20938e4e064034e5fa359bee2da569a5bf221b57ef4cfff630e0ae5c147e4a66004a5a690c04f3827b2002ed1e48b97d6c661647d3864b5401d774af46d807d265948c0d8ceaa3650d21db425dbcd4d7e65af7a75bcad03c3f0a01c6ce982ff211abc437f970f1ac23a836cd18fe4b3858304acc70051ec21c9d438fc675fc9cd9479c2460a8452ca9d09198e15e2e8b59671f8d1a883ff4313dbd24bd57d0c999f6f7bf808785309a52de8da3137a6b4b2281ecd470016cf81523bed667d0f6e475a64f11c4ad29cbe2335151b1482e7c12065f7ca5d31e32b1246b262f514e59ccb713683aa08682d28c1726fada6c6e089fc972a09e5d0eb5ab773e42f9647584cf6669bd119bb27857f4ccb33f1c1d4fbc3e8ca32eaaf6d1964bc2a790d028b029a99271ad640a5f442cbb5ab5f155a4b587dbf735d81c46568f4e939cb40554bfc61e9088fb102135d15be2a8e31eb65c7731ff776cf0d62b0c13465d30c6e13c9dd64ddc2a214d97f14a574d452f58ada13fbaff4fffa4901a2e49346c78177e35f33f7025de5028132d3122900e3ebf78f93f1b1d67f4e5f4854d9d6a9177cb22e3f4f0a1b37167fbeb83ac2b4bfcf70d2d70426f68c27398a9bf7f31d9df89357d3f27941f13d565976d7bb3c0bb65380de2b1ea86bef4f1e99866e0bba849da7b46c7f8d711d72a7b921076152bb6aaf0a3425444b1002e2dfee307bf62d9af988ef2c675d7b17c9990cfcc423cac851b767e17db39c20e23cd11dfb64f76cf393fdee6bb2f4a1336f63b0115a57ee48586abd8e116ae3a4df4c4f4da4a8ff9b948978ebbf4d005cd258d2ae9a07db257b681281ae7a95474176602e91d222aba0a8bc965c747f74af2232d3434babe760fa8f4784925337c060b4c53595cb481beb4eaac0389b9e9283370254c0b9382a78ea44b181cc624db32649f6ef8db25a0d57cb45ac1284c25aea61301aa117b42959e09e69a0a01a87ce1725263a2b6a631446f09d759c1d31725fa9b0537d0ac506382dc94eaa82685374554ab9aeefef8e80f6d2027e9b673f36572bceb5d0945bed3f59ee813ff520280264e2aafbc078060b980e0d5a4beb18d5a918fdd8220e54a693000958cb26cef1f90ad4fda526909bbf8c3f5687fb192b65ed63825c920b708e68e3f836a53709373e9cb0b8e57907d732510f308e807076a519f0a61e5766a6520368d064e6ef2a0f70e783d1fa3d46326364ba12eb2d086c22603123d059b7e4614159ec08761021e7f228b63dcb86e0b86defd7d8cbe70186b1850078d6813ca5d9fc1d8806b88a449718074c24fd05970d825bd844c0843bba7cd95fccff8ad16a25f7715dbc22a2f31ac0f7b6d0481a6f280c909ee0b4282d3a1a8d32a06fac78fa103d55f51909a571eb194ba7aa2d448fbb7af865f67c3a84d82d9563ece93104a66abf38da66dba9872cf7efd3a5bd7bdc3ac4017c48c1997991af6182e7fa7cdff17896c75725d7d5e2d9809bd58bb01af1bb8008b447828fa56ccc430d0725114482a3181ee17ef20d7308cfe9577cd607c39f7dbcfbb7f4aeb96305d914196df53513048a46afcbe41782214b2bd55b6d7c5377dba5fd43176906611298314847301f0de0e28a6729ede619fd1714b3ed4a542b0efd2bcacd541f9a87b8d909f0de7807e2990c9649a8e5491d93a905566a52d7d5e3a79db86313ff7666f21d948d1b240ca5ab3d332e25e1239135d641f0798c498da0ffbcb9b7467cf397850c69f12df5af0efe9214cb20a325e8f0b19c0a966aec383ff8234b571511785d17ae56525678fcc0b3bff9cc5667c1992c08e3f081070a860b834522d793bfac32621bfe428eb229b860eec4496ac8540e6d9d92fc5bae3e7b6a4015e24abf0468e70ace4a1a681f0d34f975ce96a473210ef09d4ebbed4d782872f1b6b6d6d5293f3cfe3b3412dacb13cd4856a30ebca95e7af6a94530604a2d5ade596f1d1f1eba5715afa718501f2e2d7efd11f1464bed1ae4d9efa40c42875fb08c1c204013760b483ebbddcec24e8714e2d33c5888b1b2e790487fbd566dd0a470a4b1e67927cae98f71a0d243ba428fa30a7a56b413c39b54e0801bddaadadd04d177e30a3f37269761bafe731ac0b655d8d270e7b566e022887499379566863c74d17d5e9cb797dd23d8e515296296b8da230965b5568427ab3c2102fce51389e5ab525a3192a69e0fc05355fae6f2db0b0701f848778d9d887230623e5b7210e0afa93446b534102b40ddff0362ea3fa41f755307c211543a8b041f5966bd95bdb76bd1c43706107e204608981ee770ba68b30713870c4d7e24632c1b16110ce484e476e6b961eecf7862772fd5c483341d612308a2dcb178bd507ef8af9a93ee43a0da60600de91335ebfd06e1ce8c2b2021cfb35b13511e7620888950183dee77b032f3f55eb89aeed2b157f8db76a73a2bc69cba213b768b898cf5979083f42b6d3e10e077a36cf2dec81d33f60d27ae64888b2ae8ff20585910b7ed259a2ccd7e909315a1d4c84bb01bf2948a64582ee842b32fac61b9a1921bc00df703a91be18ac14b7351841081396615f25af5dafd18c15f1d40853a0de4640046ecd612851440180d9494283c4cfe7f98b637cf240f091afb886999d2b90922b3a4693f01773ce492961d0ce9e46086f8c8e2e075d14cca6726235be4af193f50967939645fde55fad56114082a75091e6133871fd52182e6dacf4f0157beb7dfc45e4a4239fdf97aa509dfe64a9a1a51477d67e704567c2c6dab191760e7687b647572e4d30ef93c49046be8c83c7c3e4aed4689de5ea65a89b3385e2962639af32f5dda0dc28e774546e0661313ea0739eaf42725038455869d524f0ea156c5ca0734b7d42296b678b8a9bc3cf44540fb0ca6660216417a020a1c895df0099113e9226f479cfccc9a4975a7f2071f9c3076dc7b5c8c79eb8f1b1b9413fac69078839e7f078b8a9f8df6d5b465795c01ad304f7b2c4112f9c6495ad2e206eb28ba890eee49dce16b1b9723610dc4cac92e8f8df84a3165fc9d29bfb5f19fa6a2079c0b7eec4a18f73bf8d7ef8dbc16c27feea028134ff776562fbb75a9c146d498f56d177349e4c72ee1ee3d03d6897c2d3bd8633e409a50e70825adca594e959a85013626889df3bba89107fae8c6a951d8a337103f98c75691e5b16c38b8bacf156fa93f828746da3cdf3131cfc16bc9d83838e6efa4472d50ba9b6ecae8c2bf8e481ca0890d772ff49aff02ea4d15f37d23ed0bdeb1e3594441c5de03bd34f630a461f520bde55e575ee7fa15cae3b3d3364b7c47ed6008ea07a8e76d5e538db9f96711dfc6d5c8dc5e34cda888d87fd84b6f11a624964f4b67b8d7cdeb5075c07d3f33ea6689ef558c34419f857ac812ed101b7afc1d15113b0eb5d26de14bc1f8b974963bd17c95aae708efcf46d06cd1bd9e4f11fc7750f262c2b5e1749736e4a0a65332f89b2d1a4d04e7f3ccd41b86a69ca01707ad74bbd0a5617f5a5acb8d685fa7ca6bc4f733a368b6e8aee72608fe0d1532b4d844534ed94dad8da92082354e7506a6ff9c01bf1f1030fbe9a9055837c34d19bdfca7918d026011bb281477bc327251e5f84a6232705da1acd8bb1383a3a2de870cc8f7fadcc30b7314cd07939ec8a659e16091a15db20696b643717770a134dd34003390fbf8c4bd99922fdd071052f2a99e98c4b77874f8625b2c6c9a88a2c1cd952b6a028241f44a6a7303aa0c1454db33484b0b1a47bec82e2842cf7ab5ce04c9b9a21e8ec43e21aa7d3139951f5b70b0e4281e00145a74762d83daa0f1d0494b0bd49f00de842e1cda1e2a425910d595ce726394fcea5e1e66641f56a9c1c640c42e6749aa627652f4018ad1c865fed3b8250c52710634108eddb7e39677a7c6d3c70acdb98d8b8076536f8819de94e3fea932851c67542e9175a65daa2a53f34fdb309e1dc2d125055572f0f5e38fd6123afbeda044d7e0f0e5edead1f79527655e355ad7dc8d70f0a91357ebdc7407b9b4e158959d0c6c1c881db41ce5ea67823b3818299394a4bd52853af9a9f6d1bbdb3290a6a0fa62b5f3ea4521d5151ad04cb816e4113a6f4aa4120be4b3c9a636e9a448d438b7678681dcaab0023583fe79dd2593b6103f5391282e13ee52eaa2994eabbac587561bd410c6582daa7d89a5ceb6524802f6e5681d9efd18e45296a40bdbed2eabdad2a3dbd2557f05ba6d6a5fe0383c051d092aa5128ed8f45072cbbed6dd08f236f6690b9a4190938e3df866c25b2039b2b28d7794aab80b3bca5f698b38bf373342d9ae704ba032a4d7011eb4d69d11dc8968e2334431a3d44f3c61dc7801a4a503a9d6ad00b5c0ccf656327f9427942c72c7d26e113155cb3fe8bbcf8cd492ddefef93cf75d4a15518aecbda864e1138b3ab794372d5d33f06c37131441cc27b8173d590742b6d2dbc50e93a798d00362240e802fb0300daddc782c23d5eb7fc2067125ea8562ac40738961c465c782bfbeece0a118775e36b8da308af09019536f470a18c7aa063e97c867c9f6bf344d28ba205cd9bede9f521ea97ef2b3fc3b0e2066a2227bfcdd140bf2fb5d11bc0625525c09c9ca367c569fa36a635313aaaa54283b09daebe4a7fba8a5e2b40761c63b2a07621e9514bb8b591ce2900dca115285962178d58da7264a9642f921692cef5a96c84d6e8f2e6c5a943ec2133365707832f2fba5f419c856564d539a1771cd88bf88fc996c72363857a4d1a401c80496272fd6fa825bd999dffcbbe189434d8b56af7c6d5e750fe3f50124787a1e50a7fa73dc3e08b2d4ce561e1cddd081483cd2f7c79816370140383edf6187ece1d339c6fd1dfb1837ae418870a3cd445ffbe34564fb9968e4d33d027d95de80b8ffc2545908d4357049fda98bcbbe8567e841f3766b46d41aad21af571956bdd2088a1a701dac9910f6484bfc058ea3794915a343fffac0f17f5e8378c67428e6cbbc3f7a69e146e18898bb8729be9450d1f6cfd062aca514e1b7a3d175086cadf5406c7616f6110f5d4e2cb0a388c97ae686af496a29616b407b31b09d332f5bb0aac4fc3a5fb46ba80b3d965730553c32204f61d54c382a3efdb1ebfe5a92eced4963a590c73347f22ca2a11ebf4035b8eea771c81369a4a06829548e27569a130bf32d18c9b7541120346aa65ddd7deccb6706415b70051e0a1fe490d75c5c21f7054ffb2d0b4b98dbbe36ccff142ca1bb08b354f0db22d981ba85947eb6555b7b883988cda5600f51791537e39448fcf9e617e4cae0e8b3c7abe5835b5384b8b514892e3f9b77679c875eb39662190fa5c3058d47e3462f889fd3119040422885eedc2fc6283a92e45a58f0dc291fde80202ff09c9d255b95cde2a4e26d21db6f0941536fb888251c955f25caa2f4af84317d186da414a316666d5a48406f4c6c41c8ded0fccc3165adbcf88b2644e20dfd1863ca7a1c29d3f45954ab82bbf151c36753a31a01464223b4c3af84e5518d53f26cb75256c09a83ef54bf187c4c41148b26b2517ea8068ec9fbec617fba984e802039d0242c0189ffc515b89c0c6cf206cc2002dad3d19e6ef007630fe5eb06760490cc28065774f2d2d97d3d0a95365eef6fd8d5747c630652ac3da58fd914a98ae912fb6c262f1956677f5a553280904b65e51080bc68d48c967d9fd303d9e0db9ba2c36213534b70e404d64cb7bfad6cb6e3d81516041052937e05e8c1765f30f90fb51c7636b3527ba2d694f24df5aaea12ee439b7c4a6bb166c36bdffb62899115dee6ed914a29b317c4797474aefdd31ea2f4578d39d7c228abb666ac68f1e141499d366f2b53011b56480a0d8dd199c8ac5eb9832d3ab14a91e3281e8a1a6742f56abdf12af2664f1715b01dd07d122c929cb64ee92a97a48bd811fc74beed7bce8f99a38fd16e0cd5d8eda3b8c92afec049af030bab47600794b7c6069fec05fb50d85e81eb4eb2d63066bded4fd13b1b5a3bf916b2c07d2848abdfd8feb99d043f5e405f1837a70d3c201c2e3084f694cd60692360f38781e00fc820c0bb302ce24430be6fb0bfc05b51a10f1778744f8c9864750cd4aeaa03061c76ca25959738e8a006bfd635c12e68f3993fac0ba14855928000864ea68f047edd0956f738c0d40ca27b038362832d9d468baa44866f1bf016632ffaf88d0ef232624111c3b98481260e0bb5802b10d5fb26e6f02bee561b316c0e66f97acfb3310263e7d50240c5787471422f4020808d78573a3ef8cc21b077da11878a09678bd9668aa9f185c78e634e90c87165402b60b1e30b83797bf6eee28966158b1d61e645cc81d650b853addc55c0273170dd37d072dd3f17807b857bc575c70004b8aee8e8aaf521a7f0f119f0b845a530a075cfbcc9922910eb9d2b3e6625dcf593cc1e862875262400050fd74e31e598483ff63ff5a41a0535ad282292aa88eb352d49d6a4ee591d9ef28756f19296f100018e5be8b8ec6b4a38638097e3f5f342a0e1f92b7c62e057a931df5986c51ef4d06215e2d447524132a6f0bb731904719ef804725c662deb4ea34f65442fb3f118f0156043c945924a2e6c667ec60140b215ffbea5be5d54d4900e3f67ca85f4d7db5d7fba2d8deb75e0249fefac68213d958e1273636505bda34e04ca97376bc8526d0a20981ee626e66898d67455bd85b5a14f86008410953034799245f714db96b6b52ff36f80a16e4682513b8f8a8a49b45c0ae3ab8080e21d722ca54a043f1a1097ea59c9be8e30acd94ba048e0a038225690272a8b8f9f4dadb26ce5682835cf4519d1e89c7488a69a3fda6f44bb93e16621a7bf60fe91a23bb887c623ad34243df5125a44c372582576ccd89bac57d8aabaef795227d1adcfacf5425c41394de1578928c704799ddb24512ea5f1840bc7b253a0b4345e818e12bbc6ac3bcf6d9047f211c74d2da40968580fa7915fade71e71198a67636eec834834c377985c33923f517d528881b63d457af8429433b03078e7cb84831039f07ce2a2895a708c1fd7bab18925353c300a1aa818950244011556233a5d15aa8eccc3bef176f73de02027642a66472e45cf69f10cdaec60636ea78722b3c4e178cb581e2d4171e1ece8c2c06f93ab47d0e8f83dfd21b3b0862876496f0a20458b45be4ea9a265666d22f5048165948c7bf8e38e9f49f45667d33623fa89f3e643ae7703f1e055a8c35128839e103124f681744b32cd8bc0e3c0656ea35a997a7f0510a6b84b4f8d4238a5edbf21fbb6771a70c6abfa0d70148f68f36551ce9ff38f52ebe36c4a1c9ea51c12d1732248fef739c7e33c9c15ab1d87deb86bc49215c824894b83f3bbec08c9e87beddf40fd625c0163ee912f1bd83faa6668d953a2aaab4eb8e6b26c74b8c6632a454a9b0413b273c9075922d6ccd2be155578a502db08a12cbe499bd483c1d59b313ae46450ba63792b40ec0d176f7ed5b1a586e180b1ec0a9916ec905041ef806a5bb800dbc5e0ea9eb7bfe4759e75db64d5536acb1677cb80f336416567b909a67960ce855b4d621e8b516221280825d114669b04cce5314d1043a265852b6a651f9d9461b1d35f53781fdcaa448e36cc7c0ffa40ad1847dfdb24410b655550a80030cb4176b690d6a072be773918f6df77c439b329258d64d818025dd4d6002b4d64890a65d9d7a3e6c0fcf1445a698f34d97af5253870d263b3764e6647ddade850d46b0d3c971863e55c4f9c79ec5808617840ac93e651e6ba7f1e9166a7211ac3bb06e0b6bd20286622b0189d4a10f22eee26d3043baec3321ebc1fa9aac82dc0e4a945c3fa4e75ee485810be4ba22dde0325c44b9811accbb714667d0d801d1b7152926f4f424652a73246a26cc07da7261e5843e213f3552e982546abd0dc06db92872c5f306bb32cd31e081ee01ed4bcf6401c0a7a72afeb3d1186d3a9e88631034c45b268497ee7bc2b19715e08d32768b84bf9f19ba66d813a1b8139e137c31a9c81d322c9b542332416988ddda1333c30e0691f14ab0643aa9e509d4b304fdcc382595241b1e2791500a8385c6ae82f85b56bcf2563e22a2f5656f0ed8a4b55dfc56fad170670dcdee6d89676037064f8cdde1cfa1ca4ed1a37f44fe372160edef045db711d9a845ff1762a872cb18b436ab209280919f8dc0f65cca4dd19997a1fb12e38d89eae1973c692612c3804ed0beab3109ea2cffd8b21c839f0400271dd6c27cb0a205494777f5b6c6f571c27829094c0fcc5618edef86c9e995c9296112d5d65142fd799a8b6a0fec6eab8b529e199b77097438db92dc99a52cbb30f77bda5aa91dbe227cf136e61de3cbdee4b0033b643a23e7af6a032de8b01db1d94a37eb2c2bb4fa06827b2dda53e2522a302d56f6ae20c08a7fc2264aa9200e2db8c41c4e7ab0ec66d6cc866d9511c3237c809ac63b137fa7375cc08754fedf726bb1f3b412299ff3dc6c7bb4c5f51c14fc78e2253f506b9dcb3cdb7d734e2a4f210b4dd880081499c609f656a52a14812fda86a7fd91a3b61827971ac3c99f90d66adb9da0207e10770f20b31ba8eefc94f016a7d9cbf0f62646ec7ab3cd3c617e40b670e74907e21069dde5b3fa048554a6067c6c69c203c0546238aed62d6f97f44604b66afe41b0134c240261398ffddb284f055ba1d42dd45ad7e3c68ca4577f3ac7141774ba4d865359d401bff8fa02b88f966ae658f915d3233a6793da1809f9ea91007841d566b45c57ddf40300aa562742192cdb7a289064e28cb3f4e75a6ef34c4a1ff2640af43cbd60a8bd820d18c08801a0c98f971404003687305df92e7a4d56578cde62a847cb6d51467a0ddecb3eaa3b1672fca70b5ae9ed839bd64f3fcc0d31f72e150a2ea3bb3a7980cdd93354ad0e1a9cefcf18404cf51184014d605cfb098bc6a655d66a8f2edc826d3aacb812c238c683474e05aeb9addc3bef3b7fd2102b967b7e9ed8f12e3d5c869051d6a510bf8ad970a00240669d9ae8d47a64a6f2905a615f6e02cfc3c0755582fa3fbe51dce40c310611f2072f1cf629dcceadf777b155dc9916a9309cc5d702d3cba56f788d5d37101c3b7b53a3a989825ebb93571a10996443a40ece6bc6897d33f242136ccad7a59aac3bee8a7da4f8ce022750b3ddf7c7c591ada7489939c3b1eac045bc2d10be53f0dfbadda0b84d95f3ff57e0a16bc64e9f9dd2a3e590dc7a887d80713ffdfa71b6ab422e191f21e6f8b135f86464dcc295c6803f8f3a9eac2d4b6b1824eaba4349a7a3b1f84be4edcc83c433c984d5b8bc5771c77ee84058cba0e6c1dec88de01c7f88e669761e634784695856867917d197334ab1658b6f1d884541cb3d1b52a435a7b77518f4e5629f77e6211e89ac185beb8120a5657357250da6347db1ff2d50d0cbff162e0c8b8634d00bc260ba83e4c1c70d29a40d52a57603ae68d30b51f627895df4fe69b2fd0a7d1eca4fcf66fdc52c6adb90552ea200c314ae0a38d5839b87798b85ad72eb2a8f5c4cb2ee4eda153fa524f69c27f47dfa30b3b7404d3a42e27764cc1194c7667536c15b021efef28051882a9d6d3a7854fc124fd22433adb38faaa60be644523190868972cbd843c685a153392b733c58ad0533d3f790de47481204af4599278e5b9f74474e4385d647d1ad3734905f7a32a9c06a9f0175c06f4e0cb7b90d69e1d76330872eada44c1f3ccfdf2bd656529ad16e0f7d29cec6247127e1d536154cf303d11400fcb4b076bbb5365eabc8685c6c6c21ed6477c367b2db20c6a7dacbbb1ac8b11d9eced819907d0e99de84b09a9387ee315db707ceb6e7587ddc08d37b0d1c1cb99d2a9383f71d0407356f68cfb9ef252a0afe2c2f32aeae264c9935a9151a32ddf4fda19ab3b85499a18b1d8a9b42a20b04edc997cd89355d04cd07b5380689535aa66862c15bbc5afc89ef0cbc630fd656acdedb2dd6c34e118622e1aa2f5ecba7e29d24015343497e54f1488e76a0160313ec4869fa0d1727e266924e3ca8a380310fb216f9ea1dcf1e5326f3f437c64402753402b7f67be6cbe5c418a5248384790e4c40c49318fa64f488e4dbe9ab7ce41d06b08f0769386835e606eb4ba47e941ac6b4539ba841b07bcad18e2d3d8e2b37e831e74f8492bbf85e6fb259c6aedfe0e422a4c01fa9354059111f099e2c109012acf85938f302844096d46326a17f998c9c30403c6d97b3dbc61bb05d7c5cb2e8de934473bc06dec224c5e1a6405ef218fe9976d0f4ed4cdc2c34876e33f36329e7f9cafd6af67e5cab1bfc3403be47cb275fe3c3516f07e8a9aba89ccf03afe51e46a99a374e864a35daa17e20fa68e33c285daa5c09c69881a58883018801a0fc5f65598010338fa852201b17822cb2dcb86da92c2ed13d082cb7808dda45e8088d3441518b78d933a1427189023d7c27dd9621940312cb999d12e49ab0906c3cdf93c782db09b24eac09ab422c66586a590cfcac763cbf39f244aaa4cf2601f8d99fc8a62d6b13ff2822ed68ddcab509d7eeb7a6d377f08c06d317240ce84e6ff027f6ef2d368f54eda117d7fb6b25fdd02f53722b47e5ca0428ec7cbda7f3e1f4064791b4c5504d5923bccfce6909338353634852a0b4aea43eed5912ca8540a65863c5b7eaad228b8d8b1e3217fe778bcf333c8f8a7387d0ec93163a2e1c3a97d6a14f3f95b92ec3089a0cc2673f7d29e87cde269e47368cdd66601966e4a667ad8ba4ae83e7cf05f7d2805ffc2aa11eb065791e3fdd6536032a27ececfc1f3e87f6386c622aa0fd1b5980407c63aee3a17b52b9cd7cc2d72a1f563d1e33dbba05f4896ee8d4a84cd3b7ea6f2ce3397202fe31aa4eaf2ccde2d7e83f4764bec71809733805e06227d4521561d20f23b17bd6d11dc799245d84b035d64491c2cd7fba4832c63d365344393d23056446f184aa51403aaea7b012c41dcc245a2a719f0036184f6a71075c6ac57d1c333391573cd76e85a3bf285f0ef8061ef293a5ae18d093b54a401499a0dd08f08e7567b1877e76a9d48ff1cd19fcd7104e23940e5ea8151a1af5ed530043b9433cf71120870d7e2071d34771a80a86a1e39e2058b953af94390512878e946c37a63206f37d461847561bb264a8baa1ad2dc32d2b88aa667d2f2ffae6c4dd30d8a18f5e8260c46bb3dbe08ca02d6e1df889cac992a9053cb8f1057f588167509a3a398f61f0a0ef47421605be80ad56272dc0920ad0dda0b331800da4118d8e95e7e0a1d5f77cc3bef48859f104e891beac88c67962ca8d9a76806090b85a6762aea5f87bbd45973adbe6146fd2978009c73653fe4773174d8878fe6c9f13b80359c1beb0573e32cb745bcfa361b7322929e69d8a3f0d551fc0ae414f26d999fc9c6aaa7fef72d9304bac0aa962362f839fdfcc115dcbfdd1812ca520ea4d69f2c824af531cd19e7844ba8190851c87140f5207a35a08466748defcc9be593e164e6a79df785f99cdaa39d80cc31c9991c028b13352a30ad02a89b4439ed9be47861c6f10bf85593cfce6d5712c940e319ec4e4a9b77885fc7c6083e0ed5ec1c10b42fa026d939649659ce049d88ac08797768d7618084c6dcab9c8e278dce230b22db289dd6cbac1643a970f6f75de6f70f888d2d43deabc07e1a52875bd2849965946a3d215f943a3c4529fd245b97e727c380f8310222b13499265f08de560380b309867c44eb2cba27b52393ffa3667275718d8eb636d61d53c7446f050914bea07a9ec97a511b8712ce5a7760a95380b63d253305f4b10d1adc1aa1eca8504ca581a00dcea33f030ea029310521b5984d345d14e972cf7166c8c488eea6ce4492f51210f0e0c318d67c004d46b5d64e4fe09aff7148705e2df5f4796c79cbcefa338b0613c36349ad7666e0542efda909e0966a82d5485e1c5a323e10e826361acfa3e501554070b0de8d6015f14d69ac462600b61bdfe140afa20ad6ddc01a49ca3ddd0ef5737adba2f6fda87549b5d1810fa82b61c17a6fab281816fd03aee94cf3f150ab863abb1db94d8af471f8b6aca6c7353664edbb7f113e0a4d4bb04ee790f60c975ce626d5d2074a0a52316219a07220ca506099b680bfdc2c72b91830608c1131dbf34e11b9efc9e47ff8f9e137ff1f0eb1ec8b7f3448119853e9225bd0e28ce562bc77ab684edc5ad65394ec689704f2a5a60fc7d8808fa20f86ebd57aa83c6e52d6f9229715e26a97c3334021e4c523e1659fde530e548b4b4feef32e878d5c09c52cb22453355c84dd0126956acf7f3aa11229178772bbafce6676026d21132971b44d31444f027104ab33c9a11900889aa24c05beb0b7a201b68572ce4731e3788c00bb49ef7749148ff741c9291d637fe9aa48e4007c9045b0cdaf40e315f1adada9fef2e972393a767b4c9aae052e893a88f8c76908964de9114ba260388bfc311fb188ab15750b2e11e49c02f0f71a791a3c34ee57c6e918c5db2f394dc147f53cb1868d08eb738192792b92d80f2fe4f4be15e8e4aa54d750c84d0a1886bfaefc98587afb7820ac575af560389eed159342aee5406a4aa0b9900f06a99d4c74aa3fc5d87ed087020bee7f76e85aa53d73ff31a0790d225849eaa683b30551d2075898ed5795210a78fe8b5bdc4a681c0eda635b1d0c9e66c7f263a15dc0f902da593d95caf935594aef9cd4d65ef8d490a451ed212a7ee8855c896dbc3eed3c98d7e8d4ad623522aaa8b011c1de159c294aa3e15ede54ed3762d952f102959d27cf7c3d00cd68961fd57ee26ef128e87a108daae174e8b1a0a2831b6171983818088b52753722cdb7c6b29946b456bb6550c76379d400820ced00b2d821468b66cea72ecd2c4e27ef235e5892578a91c1d7bdfec927da45f21ca4e682f0cd1c032349d75520c3a96548ec095fd16a458f8b1914ad4cd4918dfe77f79b30b8e9177ee63b4975ec2851ab412a60233710ca60254c8e9af5150bbc217565dc599dbd8b73118709a09bf07421a8862e01a5dd6452875931af630f1124a740f6e4e4a95858a57341d39a142f6438dd32f54dc9507573fa87374ce17cf7e0313e682777591dd56d6c3b89a71a55fc5ac96eff9c29c20bcc6906d8205993f36281364fe3773a46861fca8c2025fd5fbb89dcbdecb5b7b75c9897c49c691591eacc1658fe0d0a6da00dc3709e9830b6d88add12c98c942a36cc8739b160d87c8fa026f4ad20e6fd135ace4af14a30d2fd2469950bdc1ae0abca6da2045e4d47651f821e72b135c05a04df6667b0e62f4c26ccebb87d80cc61859895e0d1fee09b9d7d0a28c7614c20e862e94a50bd90461c16ac3d9f31a5c3d0665621b69aa9d42c89a135f9e9ed4e49b4f6145e14d77c2509213639c20bdeb4ff31308a0fbbb5a4218eec978d0b52c9f3b7baa04209361fc06985325c7b9a47c36eb5198078c0acb31d02d4c0ac3aba9e46d801c6cc699a777a00bb7d58f52cea9336645442a158ab50a0f98fb9cf0d89d40fb8844b5182261b7cf573738f03c775f984a5a9f7edb5f4409abf87208111e6cc05dc63f0d8bb76f659cf233ed554bcc3f965ecfe77446b9e0fbca074e0a8f1909572086ee00c631f6da68d57a72fc623d97f8f1a986322c23f5b2cd1d2ca3ebfa52d6a5d10b853771052f5fa72550d0a0e83b91210545c8fc9a431ce52d2ec27ee6ce26362efd85daf728392459ddca4bc60380dac202fd3829701c66d275d87b28a40cc6e0e118b4478152ed8e80cb854634050400c99869be68692c72d4d10cebf2f5e607dc66426b1a50d7c8428f75e4a17119b91e1a6bebdf0114765b845a566b6ce1b14b95a523578f7f3723f284256a40f38ff092a83f20ffab57ec8e3c8d2e7730f6848930aa94dc3fe1ebd737a525879d800a7985e14144166ac01621f03ab7d985b69afdc085ab2f7b654fb99511c6c789b587867bda8d20ddef5acd8f64ca195bb0274e3bfaa728ba4a8cf692c8d73a28f4883a9982681334070707ccc0b4658e02f5c7d2f0b748062cad9d85b3ca2387148f972543abad67b4cf2ccaae781c63ab3fc0a7d51ca349fbc9005305b6e5a683285fe6a421bdcf15c9c613af70aa9851756f377379579f814540fc97929d6dd811b45b06d314d244ee9c54bcfe22022da78d400a8fb629892c73a95fbd9004e387dbc030087303373f2cf9301faec5c719b9d04bc98ab4dcde54e1af640301c42b85f7ab826730677115ed2d67e42284392f7c37cef94d616b2835ec71ef17d0482e5590484c1ec80dfee89167f4beebdd037472858994de42d5c61524954871ea2c874a52969beb3ada6966e4074aaff56f3b1bc6e6d020c5e33b75c0db38e7113969fcd9bddb4cee3c7fa027f5d6978fd5bc303131c68b59da71e0666fc3954cff749c011270db0299894d049e57f01f8f8cfbffd6a30f4d167c4618f882de048ee28081c506b235bd6e6cf3e7a1d57b68f021a1fb5a0701a6caa8fddf3c986251844965e7199d0253cb077d60ffc11df2ed3757ff86af327a24eb271d430eb2330bd8c76868a2a6d3d237c3919eb436264520fa53ef628553f19ea5518004bf91f7965339810f1cfc258dd118ac940200c1571a7f10683a68ebf6501904810206ff50e0d08bb7fd84ff2c8ca94a9e5be69aafa205627c37fb285030416f613916a1e2b6f89ec2ea5bf9c88561fe125d74c2f04715b2beebc1d9e096de1d40daa7526c5af8fce9702dfc9940f7eaaee13da6e642b4b5239a6bdf7cb1b3414e9aa57153f6ec0f4f1d3fac673cb93db5e9b22bd80d0a70301d6f17c6452b68800b0afcfcf136de87d77d11ea1c3cb9ac30460a7578c797951aaec96a8c9510716d905e07dbbd345d3bf34fa04573c40b7105076fbde515984a1221bd3e016bdf21423ade0304ef4942b13a87c1a639756410a7d3eb17d8a8a1677f1a988be6b42a7718e381859cd61a7843cbb696052f72ba7c03a9487d6e29c1f222e1ee29cfd8b106388bd7c7970c039ab1b3a68df38402f19bd883fa2cc539c9091501ab9da589b6260eb6db0348cb87f5ad2d8bbca1859456687fd781642f68ea3469e8f05aa05830492ecc85c083ed838a166d608037c3e280bf2a0ef72f7cffcc848934c32fb8c7fabb3074cf9678d4317f718da4dc948d95cba6f651615541c4d5189f79b108dda212e057bcd2607049b933b7f58bb55b1b080cf53bdb0e377a053f39fa652c188618b752f3bc5d9b867da2940a8f7f8ef5c54fbc366d6552a6689621ec4f6ebd9e980bd2fa1eda29b2cc47ee8e18201da6ec68eb81229a9f5d889b5a57012f094399bfc386155c4f13c9def5cf105b526e10d001f0acaa0be83a3043b31008c7604661bff647bd0ead20849f5c803dacf752fcde80d0b31e09cb016bb2f605e44110776ae0c96180e4d6d026719fb89837cbd062f3c9e6f9267af7901a28de1a73aef47227f1a544c150cfb3aa8c5c9b7a487fc2e208274446d99e603b1e8bbe918e5d52b6c1fd681c68c9db659f78c276dc3af7cb11cda86195dfc022f3e5ddff1d52c5a306143d37851bdcaf636addfe219ddecc0a42fd3b6b162530dd1293216b613bb1b595338b2e7258c3f9edf5fb26e38e8890e4cbf1d2a0a60eca981e9fe936a7dacf908e03f8f8ce3e2973f1c49ad231a249ab6999dff63ad613ea3b4034799f74ab02a27f9fd6613b9cba6586736dd63b440fadb02426b35f5b321d323055f38d5727b2ae7c0d1a0cdc18f1909d83cef8e690896e41c5e635b3c9586dcf9d9834e828abd834999bf0cd6e0902ce5f5657e3e8e29975a2fe70cf1b5f94e3d12108dc4b350dd3c8c5e73e6498859710ff03fe75dc97c4b8b4ffb43e70c77035c154bf0609e95672da8020f510c9fcdc53038953e87c0b91f952d3b3fb7416f3ad303b1ba2ac93b45484981791e3f4d76e43d1b8d417f07a181dde869afbc9a9dd097f4da192d5bca2c8bae5a92b656f12035bee17a8535c96150d359e6b104201f10ef520daf16f1fd2f40a4da949f15d053b295d9d509abf4c9bfbc233c8beeaece976f488a76dce94566884ace2539a050ef350b00e2b3d836d4cff1f2ee0b02fc25b7b6061272017035e97f4455e7963e6a8cfcfe88770da026697f3c4a944cdd6d63ac15266349414a7d0be169ca0db70aec42238ed3003221e5c33b932718b55875eb5990dfa05b81cf833e0eded0b515a5c8369286f51713d8bc75f40e1b11811aa384932d195f683b22ec0fb5a6a8397c451c6641f36078c30d6d7c550259d1f7b5d1817d84614be8e16a10e45492b705173f42d93c1e5931756d7f25e03759481f86f76fb484bf28e80aa7828338993ebe3360a41106c581a37389a699567d36230e474bd0c843b884dd3904e3d291dd8338d55461b1bfe955aefbe200ef1cd306713a69134e65201b1c82686b427932599035c52bac2296501af8f4d123adf74dbeadf0a733c803bf50f25655c65413abaa410b16f18d1244e52df50afcec3a00a4b1d1819c5e438f8c3d909409083e5fd4121a52f8f2b8c5dc70a1d54d8a3f590e417a016dded1e2e894b5a477bbc3e17399d6202adf514116561b0eca372753f4424d6c669bdce7afb98f34d1c602511e41cff5a8ce1a3269e31b406ea105439213d2a39662086f114cb2d3b80ca79b85e50692e414d18be30d304ee236e3cb4cac5b91a4ac3181cdd7d427fae425848d16a514bd82824dd8e01e7f7b6841451cd0721de90e3b4642fadb0e87b2cdaa738fe5b3dc7b618623164e55ed75530b5860930f99fe9dcffa97b8a122bc124d38de6ce941d362ce71093380512eb77abb16e3cc99ae91201ebb18886308aa1291a7248e914369824dbe7935e2469099f6c9b8dfbf946d9b62ad56f9442372552d65f2897dcee2d5293c6c80ff50477871e444ea8a1f3b8d12886690d109cb492ab06b4c396f8a91229b3a08c05be477a44256511d36d68684d7d2af91ab0c20696d72183b299171b62d00be322a9e4004fdbd9a698603460f86abbdb2de81df7ca26a3b6b30f8eddbdf3f976e78c5b92080adca4ac5d6a3485a06caf356d9c561858f20c21494afc4069b77203babe4d0cb9745d8fd6713de4f4a63610ac1334829a4d9d04c7625f7784aa9df9cd7782828707d0c052f7ed408b96d52f5728bd747490de467a9a0b52d52c56b4f8229e5dabec1db18ceba7576991b0e88e0b9cfcdfc2aa871cd55954f2a535fc0f30970da25bb2d7e6026867c9cc0db9099e3f8f4480dcc09938ba95dbfacc8f04a948ae3cd34f879a41fb1f9bf170babe3c1b1fba54217c7b89ed466cf1d1b0294b165d27826ce3756cdea4f25682b94babb7c68a64c2815d0c62b1c39b7c5c1f162f73a1474cecdc623349106d2ce5a6ac9886a8babd339e12e86d3c5b5381e394c1abaa9c65cba6468b3f873d0db4e56483ca13fee3e0bfd8e50c21af37970391b482ead4594a07e353ea7070baf7114cd7d7ce020ba298200b1fb89ffb253a9582741ba8872c78a26a02165088afdefeb8a3feb6d82e6770f536832428939142f7391bc703ab9f9eca45b243e7c47562a31af5b89bdb463aaf30b71ebb18540546902337ee4ebd0c9394fd9c1e7099025250a5060e8da243f05b23331dc8b991a31ae43fa0f3eaf76df09a248c0860a001c606bd411c31be270d0c80c7da09bd598018c22e544325e32ada9a2d3ccbc35dc1aa4b32c46581f127d1d9c7e142ccc98fc8249a403bdb8792b59b07622f61fc5c47d64c870aab0c75b012d20793bb13b60fc20dab84a10f9a13d2aa594d8d275564bdbd79a5901be5a0dc5a78c8edf3ebc4e716a78bf347b86d89cca78011fb6f3e5e82d3d4e6c301f1498d843030b696c3774a28f42b15c5dfb91c5f86d38ae82c0a5ddd8540efb6c2f18d08c5efa5c170e76782fe5908df90f3dbcb8145131d8f421c3c907eb3f4f14b7ffb152475309be1379a609d719bb5593954dcb77a521e969720f657b8a6dc0a51eb5959484343f435f2a872336734cc98cf57de632e14997fa70222b191800258044c604d2d3fef4085a61216661aecb386be1cb892a99edf58fe8473485984a18c1f656202fe1fd6d49f830e341e39fedd270e16f69971c193623224ab390bfda6dafa6a1f8ee7feff10e9ba5ecb57f5e86de6e0ea7186d3be467dba5784c1551ec21f5f9ef84c90b0b75ac92aad8c43dc6377a83f6c26ead4f295638f6ea74aa775d4568deaeaa9a8ecf6e320cf1be9dd351dcf93e0bdb31fe8695e1a8db2acdbba0d7355e537050b5ba20eca64a107413064948f431282f97b7c435588ea9fe1d457e78d4b4beebdc9b2c8e909871fca161d2ef6585f6a012e4f42ec0a7ae62593fab6cbef9aa918291f21ab283f98912c20dec3023e2d949935b9c27d529a30fe61189eed7108f32ffb35f359b15035919ee27d35f06a0eb0667feb2353a4553c0635839f02d07150ccd3c1644119e2f7634dfdbc122c41854adbc056f1a074f60eea10e87b2e1cb3296b21f3380f515c9c10b1d09034af2380f93e3bdc7784a918595a477954d914e2fe111c3e695fef5d9591481065474d3a2156a223b2e288d3222476c0474677520b7ed4ab362e9f7088a3526790944c1d008878c3f1d471162a3967fc1a3921bc5df2d6dbc01c74ebffc83a657481477155267e296e75a89b8aae7ea627e02a2a67a6acbe235baa5a495a2010cea9de56b47fa541756be14ff02d1f78791ba35e3797393847278cf00dd0a2434a1d9aadc82e106e7d0b8af4052db538d760abe97a328b648d025f6665148471be668468dc5a0c786fd1494a78900071bf25acc49166ccf1b2cf0785ec734504ab7ed10064cecfc2021c1dc65d92c09d1dfa1f6551a76d703e2e5d57aad1fa1107ab2f09e811710a3d598333a4a0a8d981a5a6b6d613629f653c50bdeb98b18836f2ff05950d664e8549f8c9a6d4b01e4b723883b20bb9dc13736900613626c41e628cfca0f58b3a6eb71688fcc8ad8eeafd0fc822016ab036865e09c4db9b4fbb6a723bdaff3a0276360c42716d7ec4c0fac3c148e8c86092b4989335bd641da0032a44ad148dabf6b976b2978e73f25eb9fe9d38645d36818b1cac9edfee75504f772d1d47aa2170b3871e3232af09baa52c2461409585c3bf0675844a0b742c060c9434291079fe4457fb6425ac01e6c13d5b5bc9a88e7723a502dde4a058ea19c9feef5b6a6c044cb04cab7393b74838a0d8a4b8f88345d14ccd10b09202fee5af43e62311010ca016f92d1f2882eadd337febbdf67057be6213f42cbb671dcd20c7062dc69379faf41100401a1bab7e8ff294727aba11ddc370b96fba04ae984cb90b1400b669b40950a793859109969e3103227eef506c0fb8b3fda28d7d4d4aeb112934b0d0cbc224fe1b712dc3ccf354085f5d431995b20f360e0d6df10ad4a28345daaf0818ec6a2bdbbca1711c6da79975d91525b94926255a6215346f6786133be003a7b60fa8482edad4338b6ab9fba04d21d1f27c72852b8193bfcdc304d5245e50f46d3c9ff2f3f1d1213f4e3244c9f8179dbd93a15b45bdde26056bdbbd05dcb86066aa42e9f67265d5d7d6f3960062a1b87163b54e9a77a15297cc2903253cf61a7b1eae8f04519b660b05961fca01fabe92afb8c8bf95f71cb1aa8a055ac7fd160fdb5e81f5d96c5311df1c0d8b124335d5cb081cf29734d04a431a6b54df0c45156326dbe4465db2931e87abd66306851a96a99210e18b0a0406086c5d836e4050a906620f5cd0872e819e0f03516f971a2b6e5d0e78f82a16b6c6ca7f831c3f14280ca3d9d869aaf7b5a4c99b8afa2d26816188a16b9188981280193204394d0cebd21c7d8de6a51ea877c26ab59cc4770bffa72fe50bec1fea0f6435e41048a786f52ac68b1052dcd65f7173bd9bee0c8e79607868b1244efe48dbb397806bb460570c40d78bc664694aae7a002623988e530fddcf6680de9363b013c4100a5e10b364a785b1e816fbdd61a8fec2f026474a3f435d36c61960db16cfaac929d0578a21c09abebad808034d1313b291e0d1941fdee5f0b99b65f227924e2ed9ea94cd3a99367409000977989fb55f0db11517d7fa3dda4854a0301cbf1958282e0b1c20154a19477a97c6dc9e4f2a225fadbd8265eb9be076d11ddfe1660b9b00990f44a55755b8c4f36e65d2da0b1b42d8be3f34678d81518bcb4a7be6b16148a1978ab68c85940089e2e6a22252a3ce5ec359cc45d63b6611ffac733cfbcf155564b5c83730c2af121e263e85c1f920834966142095df6126490e881d9bac5a8881aea4b15d5cd48e9c2a72c327408a53f8464adcb37a3f9d731c89c7472481b0913df18733253116e88e0917e5b5a97a2b5d9cc0cc3a105243d90d247f594e857d75564e5bb9fd145f845daa16235be3298c01a23f7db175d6eee0c6748ece9fd921236b8cf81e4bfba21b2b137bddb288fcf8ce838a62bc4ffd9a6451a60827692ba5d679f27ede83d01b3b2162760e721f117d3af6e34e3c74c1abd1f11c24a13b30b19bc6171a3900a2135f3d0bfb165ef087119172b691174efba4a5d21d3f589c189e7052e9367ad378e5beff4208b0460ac87e038b822fa9c89e23dc114cb82ea418f87bd89d494b70d5e36b329ccadc92e9e4270299f51980f0147b5290e8fd07343e6f1bbba0a7b270ff8d05d652f07c940e1e55448c269b00a38ed056018df231fbc567c18e119df5b8a07ebf2c7287fa7120133c075fb5b0ae2872854cc5c0c2c44657e862c3b3a8a9ea7e2943ebd361da9f8f92a864d0dc212682342ac5ca6d7f955e5c1bf9c78b43a2ab116b947d229c1d50dc25fdc8e59d075b9ebd6beb3c965e76cfb0c9028e8235e285be8aa49f821b58198b7562d4068ce70051b9b28d1240921b03f28d764bfe3880d8eec6f9b32171a2c4d272474f573424d105f0ad46c00d88a230f41312ec4f4a8e64dc8a42db17bef404b57f56faf4689b8ca58f535834c4bc1972a666aa95606c4408e1283d8bb1b7b6a0546cc87646fbd2935e59e8e6c3e614dbefc0fec3f6579471ce486454197934cad62ff870246bb66b631e5bf37c2162a390acfc366526ff94e7a6284c6f72ad49a749fb8511e24dc9b8bc774e62a277b9804315196c202f26b470980df52d3d37299d82c640b96660c6eb07e412c6f78b40bd67fcc5c6306f52c1d4072918024599ae49526411e6a2f9d8fbc08ed623c53d82e572b318bbb4130846b812c050bb68a915eddfd4c77a287c468ce230534009a5dd1670bbe046387d47f7213032c6fb5fff91de601cff0115292cc9bbc59979e87f77ba843ac6abffd46190f1947e5bda454b65a3fb1739830febe37082c1e22e34b617d0d635cc7934158680c33f0023c81270de86b53f263779bfdd1e05779b306a11c7eaf6a4194755badb24cf3d61a0807b63b7f0ee86b0f7d08440c4f6478e77a7fb48852c3cfbd455a5a05eb2246c7ca994557cb0aa9cb73d8c53d87c7b73cd80820a3d335bf03124de8c55dec07fbff09530accc511925f8cda5cf82823aa72c3c0f4931dc91e94ce2e2ecc2b5593366011be134b04dc203ab2b3c04d0a627ab0b1938474fc181e60720e37f07a80c4a7983eadf0bce1fed81dbc9b618e7ab1c5a06aefc837c8801828734cc166a8b1558b2407f0667bc106383bea8f8880c43759af212d2888bfc74f59c001bff0d30b2e2f6c3e9d39ad56411156fa2f11533aab08f30ed770b59ff96b5837c0ac0643329ed5e80cef327ab65fef0b074acc9c0b9fd5b7f81f9029cae04d257039b9749241acbfc76b2005d46376db85cae070e8a64e6226a329c939b351804e94c9929abb1d32c6645760cc7aad6cd19f83f6f61b4f2ca0ead4be06399039d928b12dba300b16e82ba114f4d772750eecfd60db8488595772a873e929108054208de7289f5a39d9bbec1a01ef592a758da3fb1d8f7882844a668b24d5a40c1e96a74abd849bcbfa8af1486cae883484bbfe0c2f57819e618c1192c8f0967af7e46d1ab34186b5de4636ee9abb8c8fc602b41be94484e064211aacf2168d24a3ebd8396590e1a8dd552a022b976121314544e03150710e115e6dc4e1de49810b4371b508444702e4c01d88dafb5c0bf0252836f2da3652721e1e50e2471840826177b060c8c7d0c2ad259ce88a0c7f4a810d3fee19b25337fc6b82a010a6beb611e3da941881781059591069f1b07bcabcbe6afa841db2e4bffa0d14fd1ffd82c044f546cdcb7685dc6dad3ea637551c165b30a0185000b5e503b7f077264d54881dd1dc39e48ed74e5835398d02928f12ceba76b3a860a18a3baeb24a80acd0aac150cf53d8125870bb578d4885d3e13b281f3703974efe62b0e4141d2a64b28d8629d5d26ec3fbd7499b8ce18480213ca825fce935c6ad3dc387ea5b5d41cd240ae856b352841a1de3a7649666a62d6642b7f276b3443ed3dee2205033f5e5558256c0db0c0ae761c41a5c91c77420f519f2f7305948ace7f8a407bc1d6c7f0e1f0e673f6dbc88417c1b071755c5e92179cbd0d9b995f85e0f2126a1fd51a33a5a3f4e8f0f4117e2d81d96d54d0f87a7dd385a49bcb3ba68c91cc0759904cab4de8696e83b2d7c258e445b4e0d1c145e524a05e0b2e975ac202f51efc0e583df5566b3684d703e018fc586bf074d9f98852b1483239f1b021f2819f590b5c98c0566311c11d7fac0a0ec8790a206d0c419a2e243b01b3402069087d02068f203b030fb9382a2f209372487ef5facc623dbc756baf28eaced1e1acbdb4c4896de3282c9b5a526ba77ebd032f7f2ad463c11156cd1a7401389691b5195732d36895472d10a5ba09de88280128e9fab09d9e548a40ee6c1c605af45e4ef53440720fc6467e38c52c00ce100af7cc18d770481c20908f3ec99752f17295373c2cd4858dc7b9521045d6fcea5b33155216b21489263c564f0b863a22767731912630c41c24b442cba6cebed74ff442c1ee8940c1c6ebf0f01a8d7cf167b7edd8692e1eaa5b36770392a10768d616e92890a7ae9eff125d38c6d3adf5603a9593581e7b3428b8ff2c5c22b85eec3f679be862e81d408bd9f0acc9fad1698c0a661a41d93ae864eea0fa705cd69bda76b228e93216d1082671b151d0592cf4ef69e9e839e7ff1dc4d89e59a9c48e8d338df8e0e841976f9a15f65875c255b38b6e78427d2c47cc79015a02194609b5b6b75ac488c858baeb702b809f05a06b8f76e928c974ccf51dbd87f481c693ad7d8124f01395e34572b1461a36f98cda7c2bc4bbb5c9c0bc9b707687da1cf78ac7da987ab481981e2cdc4eee5846aa8be8bb6f9b916b0112eeb787a8af922f76f8ed75d6e59af34feae274dde544f34ec3868eae5394a3b628d712362cb3d60afa4e88df1f0cd6a0c1070fbd608c6c8d4081cb20c4ea0411409eba7192dabe92156d11aa6d075be895d903dbf8ad9ad49b4049df2651bca29f663d8b9dcb5921e43b9aa6f6ce0667edcd5a5f2462979cc69359eba96c77570b83bd72f15a6c128a87a3005e8e19d9cc8c11aea4d918f59e13f4ab4002ab42ccce8c886b8d03cbe89969b14e635e3b5e29bee5f3bebff29423940570cd614c90ad8b86ac549db6eec9ea847ef5c9acfc47b8b96dd7167b2ed32f1063a6f88b2176e0431c0ed03053e66871f1ac249241d775a773a9efb797a8613f08fd9cd7cf0d155a68bd93713e13c19c1506f709b59d767f71e7b57e86b8f71928b6280bf081f1e2354bb08ab9c9ef7a253a8be445fefa93de6bbe15a07602ffbc154d14a9db2612f34f0bfc43e984feb3f53f3f1b7c0795901534474d3026518a87080903b349e5ed1a9396497712f6707ebe5f91e19a0fb3e018a35caf0c8e393440ec25f7bb4dcbe574231db6931cdbe844d6c8db43401199b897109c5413cac9f7ca12ebbb1d6a46a99ace28227156c5f7e83450f5971fd2be67c31be118f2776446c25814a19f9cfd548b2f151a233944a12104ca5d34fd33ae8712118517468c0051f6a1f4df4636a8b61118d0496e3f1c481dbc553438c7f56e968e6046401ae64f07e3cbc56aa2b229ce4b6b7118612da82417d87644083d9717684f36b77039b2efba3f009ee64232b4556c9bb5e760276e2c2dd4b3fad1baff9330cf00f8844bf475254c99cc39036a7d367e5b3054ba4d0705e3bc87e7179dc061860cf39dab28b0fa414732f71956e157e9731fc15ec40053a6bd228a2b2154271a00080143c2193ffa96876e1e2dbf890e5577e3f7a3b169da23951b476add84961a09f9dd9becbda54c294919a60762074c080f9984876c1ff2eb9f657ac839345fe321e704e06d08c07e3401b871514f5321d790603f9c8bfa51855c63ede7e3a2be5678e5a2dec7869db19f56c3b652f65bb1acca7ebf42d1a78142d90dc49bbd4c667fb63f89feb4fd097e290bc4f7c8764f5ffad377fa0c70a8aa7aaf7e295cefb31ac47bd46ff58b3fb64f3dacafe9f3be844a12743fed3d7b84e6be768ad7647a588bbe54bf244eaef6b47e4982aef6a4faa570b58fb1e945eb2c94d1c3ceb240a333650391bb20a8f8845df1474fd0784591888fdd0d032ed41d856229704d7c9a0b639f9116a865680bbf3e884514827788961e06c497ded40687d20bb34c31c1fda88a859884d36eae789ee7fcaa8077e3c7aead0e1a3b3e3f64cb82a7338587c418638ca30a489cdbee10a83b2808892390e88e4131c80a8eb403ceee5793347e41ffd801e19934dbc717f98f0d4d6621d7cc971e83d8e5ee1fe38f3c22e1993737fdb396b0fde7ac5104f1c83ffe28babfe497d2e5779531e8c62f17c61d0fbc31c8bd23f4ea7de34b9cf7123e9a95a0d1b8d815a5fce9b2bf41a7b46e6fb02b3ecd6c91114e2cf1f9853166496290bd4076e7c7c2f50fba5fe423620e1e4622e688dfaf2506dd2497638510c2675716bb8a1166fcbc287f9cc2418e08bfbe7889e49c50407e53a94ac427f51fec9242e462273f2a89513ac7fb947c2e8ec2ac10e58bd7f45149a4d23d92ee3f7a47dd7fab3b1a3d9413ef4869913c0da87a563deb39558d4a5815090c83845facade361591d1409bfe295b2c2d8c52f537bb427e8fc0f0ac54e66402ea5659db0bddc1e5e0870bfb23b56c83e65e17b32e6403ff848f8857a11144151dc8192b287349f46e5768f7ce0bf3fb4d4d3b2fbe3df962ba5ee964626fc12d9516a84eabc159420f94ebedb0e026524352a6117c71564fd46a847b202bf94f00bc2aeaaeaca2fea352aa8e83f4ac4a74455b8d0bd02f9d580fff86b3f6bece0537ea19eff6451557bcf9f0581f881ece3431d589b68f526d508040c43630bacfef95c0afcda80fbf04bd41d8fc8816c3e2768c0ef8f5b2d88f247ee45613b3d30caf04bd401e217c3a123b09d14d8c56e7dd8c55d5e4c1ac62cf45128b4621e25413f180649e7d02941d74b0ef7a31a95cc372f071ca4e1873654e6c22c2b30e37edf01081fd6108b5f047ae75020469f142a03febe912f2ab0e27e364dbc064e24e2769afad2c6ff440fedb3cb25128966a6d977c1ed3ff8a2e7a0084217c759977d0865f5eaaaf5ec82b20c0ee6a070a5f9282234ba817e3066241261971158c48d1029c236b2fdbcadedef58115c6eec7bb79fcb06ca20b48ff5f371e366802b6baefcaf5ef99fcc95d2af9457de6f9385cdfef13ecb977245bb519d417cf8880fb5110b3109bb8fa069dafe8deff2eb0ceb8bf6bba6ab3ebb223f0dbb624673a1f5600d7cb6f1bf7e8f341d04fa7dbbc280cf4373bfbf1ce1d35c18af7ee085976ce25368df0a073b1e0c6c8f81d163400461dda91740a2c4abe847226b02c4c17f610e7e8eefa808bbf87d075ae202e37cb350b487316741591a93fbc530b9237669444636deb9f5f670b39fa460e87c186f160671307caa44c91dd501281189ea6773453faa95dead7e43602d7fab2c9f25bf108cf96d70d81567675e3848d30f7598d556d3e14abb2642a11d3e5c37b827e301fd9e7614a2f32ffcf8ad5671f63bbb1848ded61a0adacfd1db6aece2629d23d2819452cac3ea619c8571fe95ea371d55853a31a89385b97155bd89aa0bbfe8f3735cf08bf42cf2418b08b4e47059ebe1b286c3e5cf8c10bb4388afcc0cc8a3f4da0d5a0c433350192e7771e1720b3ffa9a9ebf0c7589a55c728a51ec5978b23176fda6a69452ce9879e8f35ba294d2d7d8451b0c7f87e17725f3f9e95366c8330b63b2255a3bd65e3a6e25935516dd68a2c1c5503c1222c2f83e9d137522112f638c12be4f0af123137ee544120c159112e6c6381445845f6e841548165f60121a30e6f13bfab0d5d805bbc0a7d25ab8196eacf945222ebfdcae484d4a8c512ecb4b23660985572ebcfc914a3c837bd1fe870d6192182580a5074bf8f3472b5c1163b476e58a48881f382bf4e386c6a8c259a15f3674bf5310cf1855e4e90bee48d65950d313ad7ed9d0d56cfecbb47047e91a02fce74d6efce73cd0fcd73112feeb2f03f89fb1b91f5f1bb1f5d17eadcaba3478d4aa3216764dabae6e6bd4aa295110ad8aca46adea5d4e1bc1eaccd75ac2db9a806fd5d325409df280a803bbe646e5e14e6929a09b32d3d4a84342cd9e6454683c9749e17919f63a7fef33ecf93952c773ad0e0abb355ed8c1743a98bcfc1c1376261fc78474590f79f8e587acf6012b0ae43104e4719f3f1302f6d079fe8c087e99d097df840aa14e8530c7cdc18d0f1302be607cf961558c1ba3401eb1c36454b2273415ea9050075015505bad87fdcc73311dcf8cd5d17a18cfd478bfc60b1bb5bc990a6b5528fe0af0126a269400f8446b55932aeb920d654fb2281db36a303dd45d6c322d37cac8f8e0d18363d2a3f2e0f133efe3b952c7e3c3eaa03c783c8c7d90ba1e787994d1834716f4a5bd8c5ab5741190b36347cdc9f99947c073a68e07015607cdc979182380e6ecc8b1826b52cf6068a2d05694d1c8c308ddf8c2d1815375e8f8997f3d77ea785e5607d5a1e361fc2ae9d081d3aa2430613825970f60801b3006a837373ff30778ceeb780e6075d09b9b87f1014c37341fd66b64acdfdeedc6da4c5f7aae544d3572a4d18b764fea7e6c3f7ad2e8b751d6b284da4c5f626d9f6da612ca7ed956dab2de7eebad1ad99af49244bf54e577764baff12b7ee947fc9af9d2537eb5bef412f6b08939fa4ba577c8037e69f52afa25bbaaf3d3ee47535fb2df919b7aae54f23ccf54f23c53a9f59e6aa5be65fa61b2a514eb53d3965eb52ac54b6d620fd3b7ea557a53953087ea5b2ad5c7abfa1af6e33b3f764056df7a884279aa47adbef52d0bd9b552558738545fea8440681de250fdb40e71b02c6497ca963c6a4ba52a1f9eb05d7a4a99bef45ec9cb29bd4ceaf4f461e9f490fec8279148be7a53fd5cd7f4a5faf9dc5209f5d3847a1aad6b92a95eadde353d8a86ccab4cf3694c934ce5ead7baa54f55c82e94fd686e09fee988b72a7d773fe22dd90dc44bbf3ab53ff24924d277de73dc0941bd497642522921a93f59efb53759d47b0fe3542a954a310a850a92fad3a3aaca6a3ca5520da2faa1d21e452be9bdd3e9b952addca9b27ea8fef4a53fd96bfa24175ed89d2c2b88ea4f0f44f5492e8c83cc94fd92dc94a96aec327da96aec2a5dd609f3e953d34f5b1292fa91b20e7194fe641de2303daae4696fb2df11ef96be04635a23a94a5945bff95ced89f02be3d1c842e11e762c78a82bb2f5619ccd0adbb9424759683fa4694d1ac007342ecc22c5062dd287345f5472f9b5f9dd6de1cfc7e5702ee7dc4dccf1dc437e69efddda37914c347ab8b55831ce711c10fb0cc7b97fff1a373373137bf86bd6864663dc3577daf64bb242ffb4893dbe0fdc8edf4fba7e7d2327e36b2d1f8839fbc3d5b8893d3ea0263d5fd277fddac9959ad6dd764e4efe704ffa8e927bd257ada3edfabd75cbf2973f3d954cdb2f486bafd9a6110303b5f1f2bb0e88f66d7ffa493fd2ec4dcc316554f56dd8e73a20f17f346be39f086722addad1c77e1b93e3ba725dfd3ac926e688bfbdacfdb3ca9fa9ddd7a8f3611d37c92d6b7a1a16b6b2dfcaa4b21fa528eb711f4d27d835a3ae11653623c58c23c51b48218594da0f487e9a25d99ffef91a27a1fda2fc706ed43e760de0ec4dcc119f64bf18e713e11e3669c5d99bd8437b292f47fa98ff70eeec8070ff43b29fec848c2ee92949fb18fbe1dc91bd893d3891bd99736e35fb3870fb3f0ff46dbf59104e4e163a0949aea680158e9aa385ec4a72b5faf9d544f5d3be7f7692ab01f19df626e6687813479e448b2c0507693e5672a3c6af5945cf357bd1188b5e62f149148ab1cfe64acc39d1152afaec230071c4e74439b61aa3c41b381fcdf69ae8372e72b09bb1df0a77e651d52dac85f4ad0f6314ea6766faced41a0fbb1914eb6d789ee76536588ffa9bd883857ad809e16e669965b3eaeeceaaf5bf2477e661ec33d56451b5468dcfdea6468d6f27fccabec6cb8ea786d541fbcae5e2a846cd666a1784bb3731078aeb11bcf2f9b88e73dd3e0af53ead4f9dfe26f640cda0503731072a3ee99c188bb1df6ac68645a1deeb94519c887ec240340f77fadbc41ef0ba6d27ec9a32ffb593fb01e03d12deff93799f3f7a08735c1f80ff68eca7fa548d6f7d8c758ecbfa04c05a211b33f33ed656cbb21fdc72dd7e40727b4d7bff28d436ecb69ddec6bf154ad51818a8ca02c99bb2613f9c568d8181d6b0407c53ff0160b39fc70ec8cff67e53f64765bf784f9fda7ee63f2079553f633f9c3b49b0407cb76ffd276381f8aabe653f9777fe4dec71b23faa4fbdf7dc9d90b2373187672d105f96fd925cef4fafb23fdbcbdb9d1079377b134ff66b27d7ed4dcce1a6ace33179deab6abc51c9ac32af0222f3b1cef16159b7dfeaaadeab9b12adc5b0a34fe738d7cc8fadd4e9bd1f323f51357b95f669f7a3f73b427345afddc41ef066df4eb69f757b55fd925cd5b7ea97c26d3de7ddf98df895fa1feff99e7ed6ec4fd3a25ef570ce39e79c8f4a7d0fbb7c7b51bc3e7dfaf4e9ce929949f936e76b2258ab6a147dab7edb6ba21ff36954a0b95df402ef8b6aaf71dff1709f1980b25aa2dfb69799df9acf1ab57ebe7f36f3367eb35f8d771b63ec6afdb4f10bcdf577fbe33deabd9f7e7af78464af7aef67fd68eedce636b7b9cd2d5359effde7f6a9fa79affd02665ee555076c3f3fc6aba9540a42dcb24eefaffaf9a8ca3a7df6286fa39e6759271b24859bc2f5dfbc276d33a84fd9181828ca0a99f9cdfeccbccafec8fcf65e3f943d427367a6f6b23b41f4db7b1744c6be05eacb7affcd7e36acd7b0407d5b0d68358065bf785b3febc7421704f5db735b456d732b72550df86ccb7e1f6800ca7a2afbf9e677ce2f407db7f718bbe29719e3f4c2ae081f707ad310cc7eaba657d52f5ed5a7ea97c24d7d773ca6e75a777bc8dedd46393ebfb1de0b22f3905d338faa5fbca8df6aeb5915f533f5835a5815f5aa8731cdddfec6f63eeef657528f92f91e76790fbb207db378bddf3ccfa773463faace35de43cf7b1bdeaa13226321bb4caecddeccfe98fe64b2a787754a55218cb337d5ed61e7d5b055e63f35630a000dbd5efdbf9efd8ed0c87cf6abf7e91a9635d34ad9ef69aeccaf32d19f4ebf0191b11f5f99a7f19ef728144a000020a1daff0f40a5a117f5a3d545bdad905dd57efff6a3b937aef73338d7fb968feb7dca7b9fae892f80325cfe67211b29ff3636383b7cd86c5ad8d86844984b6cdec66dd05410735d072f5a9061cb1029f04148059d0d4e182580429b389ac484c1c42517ce7bb80b373e431e7ca3d541fb2561d842031088c6c8be60d7a8e75bc2008104838b1fb6268ea085c66d36706468201045f9a14382b372039d543221384d023145c069720659091b8e309ac478176601e3cb1d5d98258c20530f2c30c59528a224f1a4092da4b8fc74f539743f7466ef17851ac7d96f7e36a786e3e3f26b96f932fccc427f1b12c2cef2a5072880c10d3880c1872e3abce5f2531c281c51b61b60952a4a6c804186a7db151894bcf62e1ad1db6c491959c0384373113c79218c2b2f8cb1692d0a83b329e1fa1759dcedba6f11a1a011ae133176f0020e4c60021dc8882289102e10a207239cb184062d8022ae9e6d520085137ee2c21f78810413347c01a34910a3a883963b812fa490a20a09c090520488e5a2201828ae0813831a9c3079a20a882596808aae1317c6aeb8428822ba58010bbaa0b2dc1e2e0071c5125280881501cbade9c287208680840d2538412c01e52b7702525e50832d59480122073af0a187022380a0041055ac3023062b53d810050882a862e8053f54e9818bc15d3482295c80810536fc20054d34d102108836ab59be1e71e0c4183cd80195218ed061211bd7855884e0c28db9104b10cad046d045bb476097ee320412a9045b70f9b99b7778c1f5774d66056638f172c546034ab121461e51071b60e1048902d0ca821c7280220b1d86f04119c5ccccdcddcd8c8311ae6fd15a312bd0a10a02306fc006b12a7698f28404456019b0c7cccc53bc5ceeee4e414d27050c0e2eb856cc2299688419ee2f6fb2c3cd756fe2448f551360cb163e2063062c96402206d4bbbbe18537be87c00a150d0428655431c21866e820062662dcddbbbb5d933dbb7d751ddeb043026ea022042a58bd0a5a8618a30466c4604b124b94e09430364071f9b511f556ada771ddb0298018556040c30c8ab0010918a48ae042c3922c68889960161ac8d8a20629aab0e10901fc033a0053c40fc020030b139d4f7bc1fde88addbddb2ef9d2c56526582e7791810497954586202e6670b2c50c3db8fc38fc5aed68660578b188209650b9ae91647041123cb0410d3f58a1a3e29d21ccdcddcdcc311081134397eb515c5f32c4edbee4be822fd7bbbbddfd85282e330c26b83c73991906a1cb595cce12430f9799358a4231edee6e61e8b20d2ebf36cae2421197c15c064110977370f98519601336ae24604b9b8e12babeed2a6ad72594d11dc65a0e7f8c9da459882ca9803949661881153260d103972b512811c302f990d9ca2ea2d056510a142ebcb8ee5d2871fd47fc325105a0e2141bb808411542e8a10c21c2e8808b33824c90862be5162fb84e035fd56ce1a2830e38d0102b42e7fb24eee7e2dcdd4570dddd210fc682c9954f7001001641787ec12c5da0b8f269e4bb7eb8f26ff00b0138fccac28a2bdf070cca85555cf93dfc8259b418c295425264c416ee2fbf420bf7d810b0f00208431c010c188e84efb8bb9427aebbd3c08a8b0639b8f28a2bb35cd1c495dfe297cc5dc164c20578bfa7c1121f24519432c5363bdbb29e56e4a035a7b0c05d475a81822a14d5512fccccf309fdfea1ceac428b29e8ea4ad716a70cae70897a1359176d0be59db38a2302408be0e5fad0105b7ce88108c40863c3183aec022e5209839f5fcbe42759ab622394f4de0fe73afcae892fe5db78c12c3f7294f04a4985935b008d5f7147eff08b5ffe10adbefc68093c9e1822a289214c81420b9defaf3ce27eae2be5dbf00b621143e84a1769a12ee96ea59452429d4c5277e9ee6ebfbadcdda594f27ed2bbb9687179c0788a26d1f54443f8715e209b13cee95e27470899237caeb19d40d84d46c31c54cb122ebd3b867b7e2812891876a2cd0929f24590dbc9ed2bd726e6e017c16e7ef95cbbbbb98dab40f1f2b06b1405fddec5af28ff657549c965f54b022bac2f908deac7c2951a949ae8b78736310714595185df09b98939e06b13d67622a58c10fad3b82284af411fc52d088e7b48f3c15119947f0405fd6c6033e4f16577fbed47abdf54a4dfe8a7a6f7b47adb764fcf75f763db509ffd86faec81a0b26d7626d36fa7379d7e55229d54bf9db64fbdc7d7abf1b22c2d7da71e9542499823f5ab2a530f53a9f7e748d5fbee80c423645965fd387df6596659414e9f3d905326843eeb49d57bd8994ca8df4caca7de0951fdd60521bde7598738509bb5f38478451f04eabdea595f7a8e544d26fb01b5eb24444d7f7a48df44dff47134020285b734daaaf6107ea36b325dd36bf0b5bdc9a69e23552d55a11394b4bd431eabdfb637fda9fe6c6f7a6eabdc1c79c7e31007fdd905916fb2a5379d40edb7fd064a4ffa5325fdc6435ad578bd8ec7fb110dbbbae3f11ec6df399ca51c773c47b8ef84a075051580eecff64746b7f5dfe8a260cc811a753cdedbb068ec4e4ff329ee7e94de74535c11aee96d55fa4d8992bbbd167bc0bba51ef55caaae50950e5128dca74ebf55d9fd283d6417eabf152ee472b8ef7eaed2704d53efd9d547a09fcded21b0a61fc626ace99fd4368c7d51c6fde028428ed9549eea613d3b1eefb96c65616cb5fa256179c763b2945ddb43676dcd7a1bfedbc3992fd9afc667d61af16ee94bf6e751bf55d356492790fe3485941ef53056a9ec77e4aa9e4bbde999fea9ce2f556a3299de543259169094a9bb20f05ba753f62708b320a937fd56bd3f55ef4b3583108749853b53476ef6a63b7fab24df9e1551cf71a5cf6ae94d75dbbc8bfae845a19e2b7dde3575424abf6db554f23c6f2b79de5612429f54aa9b893ee94959e94769cb4aa6971d0356bfbdec7a4a6fb2a8ef9ecb465b25bdec1c10efea67fdb6dfec11ef9a3efbee612764f526fbb3facdfe4455fd8e7859fd4af6887757d683446bc302f5f59f093386bb9ebd411cadf8341b8dbae78de6a6c8dd9bb947ac7536bffb06bbdadde3bf8dee9e479c9999e78da673ba673ee79c9333cf32e7a694c42bcf6eb87b3333571be76400bb66899a6edc7bd8059b33676666666666ff1a36e150e3ff20d489399c1b4208218cb0bd07c03d1b421f5cf811aa0071c0e93e99339e73cee9d9e4de7a6631c6d83dbfbb9d2b6436c22e38e79ccccccc36a6d70f36d1dd104298753b333373cdfd9823c7e9cdb033d687e4ba98db59764fcf76cccedcdd61845c159dc111d6c0ffdcd919fe65ed4bd7c0e7b87b464903251121a6a3ee3df29133b9fe530c2ec277f70e73e18f76748bda9db7ee66a16ebb653edd7fd4f138c7dc2c6a08218433dbba218cbce9c0aed1b2d61a42d80eb339bf6be05b77f7769ffd33421c4c1d42d816c2d83da3cf2c88c66e0d7661baf1409f50f1b6ab0bed19343efcfb516a639322e81c8410420821ec11b3c6cccc9eb9db8fe978dcdddd3df2e41b0321849063e49c717777f89ce2f6f6c994a431b7736c8e3472082d8cb00136ee0f7f3e6346ec8212b5cd6c6a59f61f8417e2809dfd9c73665b96f5dce6ecb9cd96de302d54a324db4c4943663627ac97b399f18c9a8c3615f64f86ccf69bdd1366a84dcba648d431db66776dd33550b2f78bc6b7b165704212bf9a217b37c786a6089f19d21ae3ee2ebdddbf7b92b8b2e436028d7fe15ff823888361fd11af0cc401ddf9b264c9f004210efe98188e453882bbce7bf41c3817cfa09851460e33a0428c293c84050764f4740e0cf3821b08510431b098c1153a3ec5f5f749815f3286032bd77421161c18c103a851eaad5ab0cbe2690edd7a5d935d88c5cb94fbd167225cae76c1a43bb9814e142ccb900959bab8bb7b33333373b34b17469e10135630c145936086cb3ff00e9a0c2e33333333eb2004eed423b4d3f34497e9a44c9a7c8650f0592226b32eb859820df508edf44011048550d62d5b761371f7273c7ae58b129444454ad9ddde504c31458c54f1e25574405d0425d9c5707634a1856be09034a1892e2b97eededed4473238836be00b35b49c724ad9dddd2d654684e91cce0e27c0b8bbbbbb7bbbf41e8ca468a7c7842a4cbc08598965f164ca6ca7c704a12197dd3de710219f21147cc264edeede2e85d412d4deddddeeeeeedece39ce0e27a4cb989472666d420cc248b74134e7c62660e942641487c47c8650f031c14a14d9ddeeeeee194b6e6666ce4cb8f2849999b965cb6e6666666e6666eeee6e2b41506e3737911a44ec1b6c490db421423e4328f828f9d2759926bc6006910930d0e2a43361892623120cac03149377098c17273a5e8098ccccccd2a7f4e1945158ac4768a7070c295c038fd00163092957dd2da79c520ee96e695dbabb7b7777777bbb0e22284912ce8e307890613cf1e9d3dd468718e8f4981ea19d1e1bd8c0ddddddbd3de63ea4bdbbddddddbd5d12f942ea880819891531a285c8943a74918d62371892f205054829bb4f4b5073c2a08c38a12f98b8bb6baeb5770b3651174a42b00d89f90ca1e0e3051322d9cc62e505a91131122b62048c4f994315d99098cf100a3e5d04b9bb94339373a7a7064fdcddbdbbbbbbbd7b309243847c8650f0e9e28bbbbbbbb7cb213223c274d789b56cd9edeeeeeeeeeeeede2ea514de3b6c70767ca1a56ba44b29ab700cdbe9c101956c4ee93226a574e9eedddded748999c96ea1ee3066c0d1eeeede4e46cff66e15da891c9edc6e9d1a7c7177f721dddddded3dd43dc30fae4fe71d3924430204260ec161888ac669d1658915222e82b80dd6d343c58a481b22e4e3e34507548a182c624a444d882075b4503275b2e892e97461c224ca48878b2e5b705b2811b5ce1643cc43252e42593469315cc0c4740906051fa12584aeb8941b377babc09449afc24395272dbbbb3b04dcccccdcdddddddc362e008294351165a7092a52b694526e5605093433b9d323a50a4880c06c1b374ba02126d9437c8650f0011a224385980c7ca54a94cb40448a0c614602a402bb6243606251c9eaca112f6c32c264f0a59b89109994411309830b6aa0936d70762851862b7106652762e0836d2b72c4104c71a727084c078559c2cc3cc2f02376a029f1644789284b9c40411831ce85211a1762f981134a0613246f6983b3030b93295d4ac9af4419626b9c1d5dc8e841d4bcd313e46333c9d8c133198570768061c2460491cd49c510326ec860578642d05dc1d2c467080ab01d1ba1981159c860329dab74f1c119236f2b3c744b1f8019b9b4a2649a202644459b488409f264125ab678124fba3412425eba66a1a0a0ae819a134e7c409300e3c40e2d98829e703df84002199c1d543ca1220ac581d4c59452732d86ad7d8061e53d423b3d5c8ee0b2040581a8cb28b5d0d0931eb260311123b12246aa1022d283908cc7d84e154cdc77d0d20eeb21ca6a2856445b3149899551673d3d61a628cd213e3e4c94c446ed12b6d3b3b345cb48890e6ab4fbce14422dc840e34b0b43cc1934d999010f1405de8e14515a60e2b41345171c9e54011323a284365dc6707684e91ab884d4c594d26b28814bb3c7be90d2c9f61ea19d1e26d33f6a0291ec21423e4328f84841a5b97c3102ce9bc8909158112341dd444697bf60127b84767ab6c4ba065ef95da4886848e7882c11666626a2fd8848162fc2d0de42a5bb862427a0a20b1d6ac002053598c1652c534ed1a408ac0566c8500c0730a52bbe909ea092654808a7eb446c861acccc1c450d1e85138f028815141a4076b46c712d56502e4d909e38038a17b886fef042cbf6838803a020a874ec9ac862c9101104000000b3160000180c0887c482d1308c82346eee0114800d6aa83e5e603492c662518e83280a62108661204300210620648c424a61b100b311cb30a6b4532c382e8ee7ba2e6c48180cb7854589bef2d015fee385e09347efb4074240f103f347c3e11605fdd0f548b59166d9848fd34196cf64f82be51aff99c3942cf9b3bf3848de71cad2ab9e7eea2504c6c6cb14029715c0132a3f0256e8df3b800f78fac22e2c2d1e9b67306a9ec5c7e4fee9a2e1ef3f98a9c8aea16471d4eff2dd4e566ade7edef7d859ee433e1f8d75ac5b8847602b529a9729f2072d8bc93e1dd2da5d2b552ab4798ae16ecaad2ec1a9e35209e8e6bf47cc0224cb8b59ac5708b798004af6d6c0d67d18da8062af1aa9b596ef7012a9431b596a0da0cd89ac78ce589fef29a98be3622d6aa251c2a3c120ac45c4e0baef9d8a34a3bd2e39ccf0a104df3548825b83d01b85b3bfd33fdd9ac896282dfa579e5846e9b2a76347870cb9a6652541abf37888ca206b752bbe872f2d1da7de7a6154661e09b968f8ab5b63a9853228059f75f97c3637e0fd5092cfffd174e752ae4290e63e4e076c3601d6f33b85fa97cb42eeb59ebc5b2b63e03152c310288122bb9a7841163d90aee194b734e1292b06bdc6af9329e38adb71730996382d9555024dc60a5d0aebcd30a5a18be948c0e5b86c07fcdacf272a137275982f5c50c380394d864f45f15598ce1545ed5d6957cbb1dffe59f54fbdf217bcb0bea9849fa5758ad6899cd73b68765436a3ed5b4a057b3a3f0c9af085b56180de2430f1bc509d2f29d96b984f5a05e884ee7d7c51601a8af5b53ebd6f7a60173f029167746b0d53ab375f4d11d0c08deb3c8702c8e295e6162e681058ac97a6a0720e3bc14247b1f2c674ef730b211dd83ca89a984837b3c53f61f61b356563d920f21a257b0c41e589382c3d6b492e529a420f2766e1862e791d74ebcf1ca34a0cd9d10ac3e91426741349641f14903a2deca6cfc2bfa71bd8b370dfc9d2fb20964f5ba0fadfc800e9de65e92dbf0b364d505aadb79d9cf479fa9e5418b6290b1d6b89d888f5eb352065366d170b0cbcd9bbe57baf08072dbe4158ee7d14d15c44e657c5820ddb19935c55f6f0a7c1493d1c223e188001182573f73739ca5298284a4e7b006e27b9a797cfbda95f537fe7d64d8441fa0df35d24c5f22bcf400bf2f2d90be2fdf95e4ed1b960b06fb4cd69412d28e7c988a5b362d8ebe37bab7ba140505f8187caa9c7abe089b57ba29d0eeb2c22378c44c0314db9d310a6de3f2c0a851a1b04360f6716f56b06f840b402d427c9084079c21c8eeb308a30ea2b2f2342908a1e4e505a1d00a834361d400d7591fc4232a87a75962a546b45d063f3c4714f7ce124294ce5c17b6a0ab743c782433eb758afec25a46a130cb8abd7df908845e87c1aed5e0d14c881533f0d69207fe4269d269cee11d4614a07b2378d5b024e89f57cf3144145d0cc51ff281cf7652ab078b801f26cf5131d3af04b0584987f4bc45976577e4141de3faef46e2cd5ad5599eaf8eda6b715d09a16dd68009b31b2a0f831fe49570274acb80628795677f019afebcaa59490d198bfd9affc4f4464fdd3dbe63c996b6c8803b47bf57c7cd8ae7c0acd7ab06283b1f5621063ba429c9245e182411d910e6395802e799c46ac07c649ab4ca6e9d39dfc7d0d5e6bcac80bf2c51e5839613b1abc72de15963afe180b9633a08a044677c0571371a0a8b83ec2a720cd3b750ec40891c2cc79b6d26d70904cbe1d86a0059ac3b637f6bb7385ee5ed8c689f9be587d8434601f735b524d3db0a475beb677fe49d87309d84bb6b9867bb9bb07873eaa452c6bc2f0c711da7bb4edb6dead1cd2387debccc17386573c49569a40d13c5d61ea0f8e4a90465bf80553ff1018f82f0fe4a67361520a45b109d1ff3569034dca85d66411d7e8fd5625c34845cb3abe204c886239114e5d276679bca26b77131b40436a61025ef3c1e82d7ddb7449d52fc9ed26308fd3da933d229fa43001d06bf4f534151a6cea84c8421581f4c310359e9a3e4cedaf4a68df493f2c46d69e9c05a08f3491d8a9aa4c1266ae0226c2dd57fe897a508a358c6018add14667ac8b0d2668eb6d60f690ce39f6959a220720329a9137668543d074cc9b0253053be5067e9babbb8b33095f04b8a48dccac0b79c6f5cee200d6f6fc9f09f269fc36be0bf7a67e4e8f71a03468bee107e749fdfa570d90a056b704eae2016902a95ea4e04a6e28aa2d5318c6baa81bf6c67be630a61b1e62aeadbf5a688048830355093799f8b387bdfe88ee93bc60efa08b9507418a3c25853b3e4e0e1d383af486d2995d6f437284886cd65e7df95967ce40a5643209e830b2e58b20c26c7a332f17efdc44744832e5fa027a71391ce441ee7bb58a536e1107c507e39b98eaf25f1ba5bbaba438daa767db9937e80b826d9c1919620d1309c6ff7114161f65acd0c2245b2eaa2171ac843a9ef27727db897fd5b58062fb2bff60c9a33f872525965f427a13418a24edb28e71ee4637311524904eb4ca87dd29ee25978df513d8313b2727b8c71d7a46629fa1025af1d977a7bf293b49c2a53a7de602cab1294c8c60b651b71301600b4094b211566e8f393295aefa9001d83ebdbaca348048ef67eff006ce7db7e600cb8cab1226f7365af6505208ad985995c7807251e12063d5d1a7045926b204582c84dc16be1134919a850642069621c1c0a650deb5207b00c19cf9fc53a54ea0d04822311db58a7b1bf5c47cf3acd17abad72b408e325a56436f0da0efb5b411f0edc1e9c5c56c1c032b03e56342bc18349a55f7eb49306c246ee8bfacf1754b2a585413dc3314bba31c315472bd4c076c799b5fd3aec803005331150ba86e1e626ad6921a7ab0a4d87780e56b1bfc3c6f926199a5bfc930feaba43a0b511b42c22deff29619a8eec9ba2d3570641463ee4295ed0ad947bd1157ded4a92f8673245e5e11bb77742b9b183c6af9b26c0c8d322ab0e39e1df499ed281f20f6c892faf5e2e268fdcd867497db5c97c9f78be3aaac1f2eb9ddaf4f2544519500a405ed82028a4a4bdcc5f894369dbbaea7b74fc7e32c3c2419780ca2cd190b571f1713876ff0678355fa18259e283774ef4d2fc891856f599d937c6f0343863d5366b1b5d1b8035252646a05b57c4ae786dffec14082d42976da6167fcaa6aa751f9d408060d302d66a01f37105540fbfefd5929739b0e3e4b14f3cf178e0209ae7076632cc66e0a7b77f804b9e7e6b12906ee092107a142f1af1eeb5df60cffc5de5d1d626f8e6d398b7420e938592efa69e26beb14a95e2e39e23d262159b62b3850efdba6b551090b301cf3d3f42b50ea173b58e7ce7a30d6229b6f588207e2a5e711aaabeb1c05de191c91dcb5deca68107d3ba13c0665b536c5dc018f1e36135f92c580b35bbda222c0993a3d6f0fc5767bf64b6ccaeda13111b3bcc993cd56ec395aa4d56c67c331b875e758f657169a6422d516182743f517ffb3a8baf6cd060e8ca22e3176a02271e9e9e953b57f1e535f444670bfc22a19279e7efb348215f980634237a2dc84cb76b60234e480097433ab1d675ed0f394d78afecae4961c1a35f0f153ff058164409fc6f588c48dd62771e8b306d4e710d7a7c9ac10cb58d0fb4d5258067b0a4c1009de74f4a1b4fece49b9a1781fb1f4a776bdb4c461a520cbff669404838a1602dc6d4dda10f606d501361b6fc8f9d71ced53c36241fdbb71b56aa65bb5f5ec579ced8e1ae0ca84ffdc4d28a4bada4371c0c2a651602eded161f483f2570228e50efb54da1809f1bb27000674ebf3b3fc5e192a65537bf2c3ec7d29ecb8bf30d434f32e47a4a5ca189b70818022c264e2ac9a01021297e713cc1bb2ff8817a70851e5539817b26851374b39f550a0cf7bdd8bc9da63205fc7642e99729c1ed0e1c69647b12d7d4f7c4e67f0020e8d62a840acba1fb42bb280b3b966c908b65bf312f7e7d3edaadfe48150f53acedcc086e2e8a79456d48e98b5a55e5b4f75dc117ddcc3b2eca71b57b14eebfd5d54ea0bdc0d791c364e9256dff10240d35d5d275280705e2e73a41c0917bef1e0577ce3f4db8a86205ff50497273287448185dc5c8908cb1b9fc20395c565895212c7b38ec9aa33752ece197cbeb29efe4d334590ce40fa69b640c08ca26be689ad28bf1496db199430bafb5ec4c5ec2b3b24f59311bbe0a0153ce685c33f5928021c24fcae522f37475768d72f212ae7dbb8a72768a2807fd375820521324298ac16167b190d0695182816a051e1d2f047b3e26769899272968007b39939139b2d34a103c6c88cbfbec621d4b4439dce3115ace1a39111eba0a6563100fba88530efce4a44e4ddc4a233847973df5b8f89e6182c02e6139a8a10149766c2ddfaaabb2cb90883a13a4b7d31501110055e8ae69be44c888b20313acff510ccad4818987f14dfafa94fad694bab0db3ef61782aaa11ef6d066b051dcd75c92012b9f7e32eb420a64b9f7ab128b8f57c89b73e947238a8e531664b3f23ee2cb1e77bf1e450068630a05676f721518c5ac4db065acf4b76731dbc9f124b14a1801e4baf4a5ca111a84cd657673b87629a9b0cb9772a6015829d9f77dba38e6419a9391ead0656c9e1a4912f5be1e21953002970083ab45b9f81af4b7e1e6e870676b91a345db380a791bcb10661ca4d177ed9eab6b1494f3360d5e33094166e148d728598cba626ca0cf68a9ce554b88a773880413d8af28c64e20ec4426b763ff067d3cdfd01d1a53172272934a24b49f8b8c6f399eb3b18376ca1f44599284378f3c2ee4f88086e123eb28ce48385b84a18654019bff1af78551f2f80321211dd720e005d7f1e98abf2ef9ee40512c53f9428f28e700e49f19ab3e51e1648043ec04f987a196a19c1da2c29410c649f4fecaa9462a6bc7d9d181ec61d4add385c9a6ac2b38a1155a14732b4a174f91a2829ca4ad2cf7d57dabff5ccc7fdb1190313b1f286269c0c9e9527b7c229b159a4a8b76471b1a6524193554139ac6d9590f9f8ce4e107cdcbd05e31b6bf3b9c6bf5e52e10f1dd868c82ae1413e36c3e67ba04968c3d68ec0892017c109708aaf9c7c3ef04cfcb710c8e495bde775f012976cf4209f74cc24897bc03ea99031c03489880460af4fe88788f0292038bff970009b8ee0b610c74a3a7c320fc363be3024cc20c9058dceb9b842b1d3d32cc069f44ee46d21f336db104ec775dd2885eac2becd4c320c6f9cb203c430befee1e113d00b739a085ed509d548c71e2086c151c424f97e4d8f1f0587085285b4409030cd321cc4feefdc087a06d138a04020e47cd7552c9ce075a82dead6aac4b76c5565158b07663fe71cf62acf8949e7c41eab2c1665e0d98bb842d7a97dac215ea58efaa4e80909db1305a459f0cc42691e00e5a7c465ac2842a4110607053b559a87ac170f6cef0d587ab11f494ad1e5c5cf05c6f1a40ad904701bbe5936606e0c63b5e8433088e7982f86f309bb5cd93450b225ef79be48fb774ada76464fe857a5de435ba55b59a9463baa36f986045b7ac6c2a6d9a070632b692de687ce1778ee2ac6888cf7b8872de16a607e55dbc0e543edceba6166300fa8f75a90c6b1cd8e1693801e952fdd10f883f5d21c2684a0c596e34514d0315d911da12e0fe13bc9863711978e2581b27bba52818749530621f15313a3654edbd98f89a2f2e208fadf2572437e2a7765e25a52c44c95294d9fbe232174a04df2929a854ecf921096426d9c8976756eaf6a76caf616494d876eb04f850d99189013f99e3a36e1a43a87d85061e9ce5bf069a657469dd480bf7157430e3a0cb3f07bf46045468d5df6d44ac5a5ace42d1ce1007aaae3b8708ad95df22cd3b8ee0501c84ecfbfc6eb70d8cc00b6967892c9cc820d9be9b1d5daf0d35c6b25f39bd0f3d50204fb12817ea8b15704c83f55addc546a35a81ece9bec86e68614adcd2d9bec0202da4e099511a1f70579a02840278f1732f5922b35add6d2bcc0eb7dd67c0946fa2fd466462780d0aa8439b2df557877657252f397c211ad8768a2f7ed2d12007f21db16515704e7da61fd9ce4127d36eb629405cadd8318be5b739c9cc249789f5356b62faaa4822c302476ca15f380cc570f714168a3004ad01e5bf734c65e6d530c09315c781a6838a3002acfa4491894e360db29020415509feca2902a7bc9b87e71c0180ba73639d8ce0b35910953dc5d77e63a8927aabc288f1320a3523c9d5aa96319244846c4e1a2c6d1eca61d02637cb0f8769d4be2ba32d261e6b712ccd9a582a470324f143abe9bf74a64cfc2b7abe7e1e35315edd9a620b75529e620b5a58ad8dcfae78d6747f82b681eb9f5fbdf3817422ed4248436e28a096768128f74aa15adf1cd049f8ba815b6ce30aa0c43bb0a8fa03c8bdf09e453f41e94ee5611d7925a3abdfdd7ee3f39e0a3daa47864e475b1c33d34999fd895799d294ee41dfabdd755cf09174590c817486c8edb4683d91ea42478d5327d29f4e9b58b814d3a077fd8c57a446bfde41407152e8c33ec090cb0f754a9b1807d121f0593cd622063c33e4776f7207042dc6e741f1a911fb3c0bc0caaeaa89b1a3b419e5d7ad83ebfdc650fc66d334ee2bc09643da482bc1affa19de956388facc81cf11e5b08017c363c930113ac940e0c289c6cef80dfed952486abe5b974f062793c9a7ed9bb9202b61eb6c1ad7380373cd3294473a4fbe3c12523fa650958f17ad066f1ded4e23766adeace721dd13dcead51a176652a1685539eb9154fcbde63b60d5f966a0ae79dee52a56ec82cd285881532b58282a558a4da89d45c5b3d6c52746631b93c965ceb6406a289974bb581049e1a060c9abcc423035685d19748d3b32712e445c2704ff81a9446c6f8173f4d047c7e61f0eebf205873653f20c0299c8f46d7534b5920a068b5b0d0d78ff2abfc03da1af403428a582e6be9dab8721584b5bcc127ca0c07642f00f48a0ac9f8125a23c7f2b50bdc1aa529461999cd61ca01ab372205d619c8d663f85532376609eca9a50a3c3ea3bc7d8e32bc624bce3558abe7948e8fc7beda78b62cc0721c935f02dcf37e0fcc0f9fc889d48519f82e2799eea13fe6cc0b6c46f03f17322f423b1418941313d44cb3928380fa3da1dfab6a1b82c70789ca7f51b52bea7c7319fd6d937022a5c53f5748666a7edd8f077690370454505f3316a3458cdf984f378968728a241ab439dc439751c220f2f98181f6acd24a520696d6c4e209c7aa5c2807d031b96521cf8ec7db13c97053d77a72cbfb106c228aa3bc1310327f1aa33886d205fa2b316f9c2e527826f4801bfebba779d4477afa95600dc9fd27de18eefacbba46a18894339007ffe0985a4d670fbe40d1db11ad009cde27945d5066d0c03e497f073d8765964359314f01750d226860f70bb1a7d5a1226a90062a3ee83b03a98b7dfb3263882341f59d3cd2e0e132bc34c35b426b1b1737f024a7b2090c1135120cff06656642f6cbbe96808b36299dbb83d9df959c94774d304db18bbf80ba3c746241c433dff5c83e60d5978b59c2a61373f2542d83fff1ea8dfb81e9f8fc12bd1de9131fc5479498762769f468354cb39eecfb5e126a291fb46884344d6a24bb3277af079535f6399d22e61ffc6364fca4e8d4017132d373371b5504dde810978f8ff30c70980336b655865642c0ac06837cfea5534aed4105568995d56837c5730ba22ef3cafa1b3d034b8f21d5be7ea2220673e4ee6815a9d6906a2bc187dc034b244b43c9207bee38f791e445e5ce20a7155a1a47e10e628b08c2f6c2e325f030d9113529dd4e330d03f1f787742f5f8a7bc8b26e54ba738ca5a1b470f819963ccc4bc011fd15e3ba5a351832a7c2ce536a534d54f819b4278442fdc2d04c5ec57219a967434a9d3b16efe601739abb55a382fd85d624c7ca8f238745a6fc33e535254520ed45e9ebbc3f0a25cd3360d3e69e488ef7e057fddad52c3be8bb75c2a6687d3de7e52189487166cbcd4bf3c5519ba9c3413709f1473ab986ec7a0bbb4647dd3cc4837cba680346862378dbf69a2318a9f411c2b4ec930c2a992ab105077ce3d62690a176a2fb665b40a6af376a7565f75db8e2dc12e65d92452f30e31ce95aa775fe8a02168e1f2311416553382de95fac0e596b997d0b754de8705918026349ff29e15143a1b7d0b7c676b3ce3075e5c865eb104d1e267e0e0d3657f3d0ca5b3d12cb6bd2c24e202fd11db425f71649e5a3e55aa6b71472354a40af349461984142f49d96cd23e878f8adde7f29b058b9112ec5d3fd076ecb7e56e908fba4f89d55907ab3295d9466ec5341ab27f01bb6c579f9889c92c9c3fc76ff16e443426c0a99fe0dc39ec7adb70541447764751862bc065ac0c807c1816d6770ade34c4209ea550d6f589a7895f99c1f02206af34cdfca9c19370fb02e5ac145c6c11c673576883c96fe7c45bf9a581b824e4eaa527db88c462cec3ad52ee2a955c8652aad4e3d14dde0b89b3a09869112c59b4778130dc6413869ef138ef41de60f58daa193cf53885c2862ca61b00cf733a3c44d4909f22e5b8fa34cc82586085efecb7d9a5145d1b43a106174282021d79b6791eecfcec5e30705c4f56820233edad23fcafacc60c1f8485bb6f40fa4d80eda8f63caa40302c8fd41cb290baaf4a7e5c7c82dfff4bee252827de8af724b61671e0f4d7eab34ea9b2b2e767865642f268011651ed0560d8b4378b3f0b159aae860728f589927fa7fde16552550b8cef0cf9ede55c896e4a70e16896b0234afe2b3a678b15c51717a3e5a11ef0ab159f0aed733b90060ed972fa3f6796e871e4d7c81485f227ab007a495b107aa3e35b72f02b97fc141fce268fe28bf4a650e8ce1e7a39f763cac2d2d5f4c739eb8e3e5e867386d036832244be1778e17003a14c69660f0480b904433ecca8a1eb788f700be2bbb249724d8b23d2fbb1c4db5b674d47936c43de860975a122bf9ba134d9ee9a6684a71e9a9f00f7956d119c6a5f8b530539a2cd9c62b76ed23a596e9acac9f1bebc0118d7224ce40703b48508ecb6aaa099905022c87dfce89c929f7f9c1815ed2009addca12dfe5cb48edd74b4d746a2272cdc058e215e3dc7954aea4811a53ca82e4dbc51f5db4bdae3072b760595c4ca25beaf2eac178b63b91a160f72d95e2b3a0fe9d60a24ca45db278316c5272cdb120e2e6229fbec0dfd9c1fb14fa125ad85751fe8e62bf147d8e0fe0ac7fd25ac1e001e614ff7df1ca9106791df15fa74d17c2df55c79633d6941d3e05582113e3f0949d381f43dae93fb21b2dba6970ee5e33ffda7b1aea09eb53af4fd969454b92f8e39be55cc1c1012618c39ff9b99c669fbcc6fba5db0d06d22506159a920fb266ccc66959f5733a7b2275e8d7dd5da20a65c977fb46114a4f5a24a11096118586c802db57ea8ce3bfc00ea792a15e21528d3d8b374cc8157052acb79b7928d3782149a8c0a875f19df26772405e48af2d509d981d0639990ac8725c9709ea21ace28293a980aa730a7bf948c9c02375fd86654e777ac1028ebba7a0a5356253140ce1feb4ed9a79701562685b66a1e9757e93adbdb0b4e659fe84445868213157f70ba2f3f62fc2e73f852c396d3f04fdf558f2e4c3b37139a1842232da22774839e28f3f9781bf5f0d989cd02ec0855c13c12e158b3a2a94c79cbb5774a58b456da4fa60de238142041fceedbacb4136582f7efc1ba57c0a73d0d1be65dac2e45ca776b5b4e493d78813321a55ebbba333abbb346d45eebcf27401fcf00a514d587ad8da3529ec349fbcc370a35a983d0ff36ef3687b782fc99168acb7c08bfb35bc9a9b555c18b3fe3ca3281032b1110f2ca4b4e7f4048fbba60feefdc186d8700d7df2faf8038a111db6aec0a036382a161ee1a0b1a9594c5a2b3ec2998f0f5e133740e5fb8baa39baf8d7f60d7fb3aac2e06ed03e9670b77c4ab70eac7c4b81415ad109f077c3235985d8fa02fdf781f0a691fc5378521c8d67e1c3159690a1511001ca4d98ba2aba743d43659c88f2bd6040f87ae83fccf63baf2d1d645713234ad5f4fd4999af43cfc16081110c1b0595d4350f84415a745d2c13c93caebd86d6e1e3c8029c2172c8ce38a33f8f183ead7263072e0625e585c95096044869824aed90e21e22be6ebb4e1fff6cd6f5bf3c10cb5532a620565840d0cd55c204714ce5c8ea49f5d25a73541c26e0c9f306100a05290a7c10ed20e36d9e1e2c449058564853a8a459f3cf7ab62faeb1f3233b03abf22fc495c205a9fade2f8106fd773231231cf0aa01f8946961bf330a21a69a03a3bf1fa55c4681d6c0495ef577c39dab16a81a902091b38848f0b193e4524148c66d7f3d092d8375ee8483febe2b74a2ba62b143ffb9acc130d419c1280481db1616db5dc1044db086debd57c291fe2288bf90477650c5a6007337b394e07d59da5c527d5402456832b59a9492db564f949148d448d02735ea367f16d0542debda2092c0605b350a2db92fcb70379a7cf22a8c492afdacd0931ae214056a2c3498d8376a71767335c85f1947b6839c7aef976c6b2c08623ce1be0cc7785678f8a5ec09d0b9e4b0bb57ff9f14027b9561225814bcbbb906b57511a23fe74c797dabbc52d2150d421900c4c9d634ce58831dee2f8d53576e5d9963a90248e1763f9bac528df9f7487c4b81843ad81d7c51a62eee79369ef757460a0db3a342c5a186f6a5a0db6690aaa2e798c74f8e46a1776b46ef1becac952e2824849d822aa716ddb4906257eb5d90f8d2e0d2c690e96d172c174aee2fbd1b49efa4a61136aa95b5a22f9bd99c30bb228c950857929c1ee4ab467832ca43a543f2e760c3cccb7719ac6814c50de7fa11e22a533cd30e70af5e8e5932af0f9d2f877eab9ae28f14f832b3bc57610989bec5702d087d8780b7edfe0b6f38ef9c2d192a75586d45a30ac0421551dd777ac8c5d8d58ee1133e6c3cca6b83436b0236831c6b36489c894bf97711b04f228f1bb76905189839f6288dd541be8cdd22c9c105490b6b67366c4c41051ca6143b334ac3907c374ab32e4e30a956031378e602de1bddce5f2eedc59bc95ba590cfb24e4a8ad2048fe44f85a416ace7ff140845680454d1d10f8f55d613033dc29aafb67e88f1095fc16acc5283db04f87c213056a731768e9bc189693c6ab17e5870f4f1e4754342f7a8c674141209981c653d7930c637349a8d01079c17420216a42fe5094126acf3ae6eb86e9ffaee61210129d1119cfbbc2dfcfab0ee3c286872002538f45827ca5d7b1bf1bbab1736541a013e15b6f1a34a90c6dbb20d089df2ad76987277531f749686561306fe52a26d0120c6e4b65360c8621dc6a11e2cdc4235a7cf2994933e81842e20b0137394491078decdb32a7ef15b60046a112ff4ba5e293912962946aee100a1c5292ec9a2fade2d2323d251c8b70658e366ccf2058c1c582ac76fe06e68fa3fe75368e36329ddbd6e843967e45caa3b4bab8eb67a48b825a0b65b5689d1835c3b3c6e6cfa06129b19594f2352f2456e6c698cd06fa29afd1b3440dd595cb6513aac5ba3ecf94715e56cf456ee3dfcd96ab2105adc88ec132411922b2e7c5166317ec9f11d70c84a2fd9e97a4dd5ceb2f8d08c6d634f53586f145d632773d75c0b95a4c83772afc13e4889f6e0b8ffb5fc5f663275db944aa463217a0ec9552d788c509e028f6da3ac8449d868640b80ba9c52dca3fa90c28023377d03ccd1862003ff2a61e9bfc5744161940769c7a5dbd0345647cf7efe83450225f60944cded96bc51b23c377cbe84f7a6a9a2fecc5dd17d1811e9d20ecfd53127731aa99308f0c2955acd628aa163ec884758746450a71980a59903d73dd49da6ab14fda60ccd54ab6205a6a74d3e9d7b28fb9fada911d30ff0da30e32a53635b663cfe522d28f98454f1423bdb66b26d61fcfe036ab81885746f3f0aa59d25ad194161a94861bf13d53d59e3a68352060b554a69035f3fdf643787f25c47b2af638947726fe80cebcb6a20d252c764545aa175fac03d8e27a24c7cc60490ebc94559aa7413188811109cc205b6fa4040fa5d20f338f98b03a72499b1e40b4ace3ce79df9a2231b23d808fd2097ef9f40ebf1c8fb40ca84669e4832e81badaa2b56b2a17c87a4380644dcfc736d7dc28a474a20cb412dee8cb813280dd4d615a1d79bc81fa833a56b90037469f8fd2b9b2e4455e3e76a62617f6d49ae9fc8a4891e9f7dceeb4b16b0a2d40658d364d1f9fd981f43dfa9eb6b2bbce7938099bdd888da90ba8a98fa5aa54043243a49faaced93894baa56e0478d50e794136d4ddc008a2f469dd6ebfc604489a6aea32bddd940e978d1ebaf2522511315bb49420b591083a80070c563ff9ad15ccc3fb89a3fae2ade074908ff99b9234a91dc202b4173cfc43ae5aa0d6a412dde10a43e23aafb27c6a84baa6f4c62f203be3900ed3f224a234cb9cccfb125598d4484b5bd3766b55f55282cc77842ceb28631de22c55feb94ae182d43860923546faad78889c5cd53ad6542564afd20b39ab500518fa16691d8ac9cc726ac46004ac01950c9b92e8a698401b8481e46b957e0854a3fa193ab15ff56dde004cbd529ea6aa37296e178298b50fd647e8cc9cdfe16bae09d6788fb3ec1940ad5194b141300948186e51d8125446f169f0db7960832936f6372c31e124c0467a039910408242404d7890fd1a8bad072c3fa0e1d91dc8305d2474a97ff77d40f21986de9182f001ed4a48b447266b32b57e681e7f2b4bbe05744a3854406d1dcce5f41dbed5263e1dfd149dc96b0ff7a4f78c669a1b882d2786ed82c7429034d910fa5448c5b935b9e11c19dfd85a41e8f534312431e6e5e7b6e7df981be296dd8b18f110ae85918099b2cca702659cfa970ce0774675e3e58c71a271bbf44a035e1f08615008fac3b71506fb6ce4d1706c222a7d5a718bac3472188b51dd131795d936a6a229dae66db395da350e62b6c99609c370bb8182e008d003a763ed730b9b8d7dc216c67dcdaa6400c798fe7589c042b2bd83de3648f7fc8f28ab59158c7e018d344fee00b82d7cd0ee62ed7543fe7678f2844d83199cef6868d85e29eaba36d3607dc892f33205d6428be626b51e64b82006eed88ed45f655df504c6386f490916d0e5fb38df8948d69c1dfefbda67764c3e031150bdea88ff52bc5cb14796537b7ff1d913332aca4da89ce772cfd6c3f9d4d57653fcefe7b29d8d4da6f432d4aced482d7b0e45ae8188a3eca9540e0a97cc442174f5ee5934c83ea0cb3d6f9431472ff0b206e093bda5223e1e29aebb90f767af111f60af3c5125b4e265582a316cd5c798f9b8e23692e754c2c7bf3b1bd7faec93858a7b5a17334cce99d3a61b9bf0e84fb0d71430680aa9698a2686aa67188c2625e00e2c53f0f534f0166afb07f57aec8abc113e4add39ffbf783854fba828958351f6e27d87077bddeb8808b2425433398e54f4135fa49e030df6836d285c2bb2684210889edc67222f2850db7506260ed9883712e426d8df0c2205b36ca07281144a3f55984db06cb2e49189ccbdedbc00540a5ec2249bde6f4922730b917cdf746ba548dd91b60913961042ab8d271f39e6b382f3f9c98b8464239d1e5a9f66b9efd94a94cb287e1204cae9c4a522525d8f39ae7f3cd3895a8f75c8e7dc7908574b0e59d4542d239d2b19bd660245cc5d122abd4c0dc55d24f3a922a7c8d74ac2cc9fc863b23b11f5b60700461e55573928b140de8351c99a3cb17fe03e573745f04076cded3f179042d2324e93ff2d44bda7f1f2217446e97e435d6f601a1549ec9f5e1b05cda419e518d148b66ab61b114f32073c6e39159c358dbb508c9e83eecace503882a868f174826fba24e0c8698928deadd0958191967014c2dbfe80c9bceccefc14173f05e27f13119d90f4ae9baf4a01e7606e13ceb9965eef8cd14b99d45cb8e8bc7c82dd33dab9569accfa5bef5be67de7c3f9abe22665b9ff9f7553a49e97c3f9f785e9304871e6c64fe5e014713c4e43fbccb391fdaef25ff4754c7b64b11b0468982cdf45f4cdef4546fd6b46b3b7dfed4b9a36789b99f1c51c802fb16d55f40b5aeecce8b95d49cae8c52d83b2c4fdbc7ae7c7d78f29883b24670be8b9d1f06d94cb54416c363f5b185dff601dc1a52a8a33be8a1ce7114368eaba9da3cb619d93e68b76000a2127c2fca59437defb1eacc60e7fc33e4a8e3e204806ea637a2f7d2fa8f48599dc3594c4e8345e4944cebbd33500ba5fa6c5a5b7582ad4a8e8f7c9dd283e135d1a9e51134123a868374533c4a2ecc74baa6786d914ee844e5d5f36aea51e63c369c17f7e49f7c1a74a748f74c36423726b21eb4063f1ce30ac5bbee678dbea2f6234197584646a09f0004f8cca567a263df2edf5640ec0d963379ed62f5563ccab9f47e1caab5afb6b2cccdf13e320f47a95c75f0939fdcef44c0195187eed0d7d204c38ac2fa2a81be191b17f90304d6af2ca68ef0d79c137ce9c9c3fe6a7a803360d578b795f0dbacd94c445bc30d3727939245d14a49140f8449238504ac033af4276cfd43e30c1222e62a1b308864dddbd9cc44be7f83da4d8788cc6eb3ffc3ad6e03840b749557933c21bbc0a8a490c73307a9bc714bc852caf11d67b130972c2c73d07a768adaef2dba5e83a50123d05e963db56ace9c4239461cad3000a9acba99c38e850381907e6598557b7af61af2c58dd3b2c3af08759a6b122725270e535d5690a5e2ea56b01c6c28fd224029abba2e278bb3d31fcb66653fd072b41569abb0b1d5ee331830074f1155da87bd4df6fc109670c3c58e73fac83026ef48d48f9f6070a3e59266f08a4ff16c8dcdcaa81cad628e8bea983430725f757686bd19cc73e2d483dd34d2c888fdb9580d3f67c753ea82e15368d7bbd62f28b56e4692336021d142878e0d1cf4cbf398138dbaf01f7d039b3f6f580285524729f49ac9718e9fdac0a93998b6d9cda554c7659d2c0bd57c220017f03470a078a569c94ede8b045b7e0ec4ef4515e0a78ae5e7e70e73613b6d0266d418b07180ef4042f8e2e6acacf1c1810002639d3671eb09a9504d22ecc5069f9118ce3cec8a1e9994bd2b7c3031753e59fcc29fa7cb1f29201c0957a70fdd32a1e2de3b604006a84cbbb6e59d04bb3e1149051bc2364068ade0c6ee559b2ba6e198561e9778015bcbcf421ca1fc35c488d56f226ebb6cb9a2c7f075b629c74a4272d1cc022ffb8f1fc789ab3fe1c84267db3515ca5efecc09f4b8b0a1c10b50ee573b065d9b1b1927de1542344cadfa73bb51837a94109c69191ae71997e1646d96dcc284096f96b0b829e443ceea4ac6e21e76ab673237abe000b40bebde09493b5a4e6d113fd0e060c0b45ebccd2d876314e76e8ea6271313cf8934961688e44fdf5ddde6a193cdefe4279c1f861c8914f364e4105a4903f009d5de99e871cf6088ea045b9f5e2112330537387388bddc64064e471b7de60c022556ac2657fba040bc549a706dafede4c1ce46e95bf5a132d47f9d1bd1f85c4cd5c239dd3ae973c2dfb9138092c6a8d29615c11e1520698330d0c499bc455bf1118861494ee2232b6724456386b5c84226c43c94ed39e31c863255ae2107bb77f2a7f9a012d2c08a914fa02b12aa2ee3651c0f6ee0bac12589a1b7650de2d63775c75dea4be7c1909a6534237f417d3ae872e43f1c364ffe8a55995ac934c9a784877eeae3da4b6b4878667e98f10a4462cbc9f6d043536d2094b0bafa843427d07b538a6a4620207efab69e4ac52b7196b7d52ab11199012a8c509fdf4545b277ce3b9466fc4c810d8b00465ab65965c894f7ac41b04c7dfa6a56eba043c30061d8a17c485a90990986b2a3b211d3743f1eff4cb107b69ddb584ce5fc392467ee414786ee84e48388cb488d8906ad47dc4dd6bb8c0e48cf57684bdf9d983fa161a81c030edd715a8cf41fd1a20ecd347ee820434a6969b29429fbc99ef8a0ef3e4898bc88377823929c367a6b6e98f38cbc58a08ab8f416ab8a31e83c96cce9335193f4742a0127dcebb0427cc7c8a069c97845894dea308ca39a46e1ef44f5c921a259f2a373c91eb0c8ae1782a3531c33678af2ccb557e3be9ec84dfaec7c9da54831b9b6b4aa685842323216bfd45cde24240560f034c48190ffa0722956ce350b3379b3ad370fc814293b7066591a40dca3f2c09b4c76295d5e7ea23ce20b5e0ff3dc143fb12807c80c7f76a4d5a984b8e56bd10cd23e3878d052473a64e112e83b2782a4fad19da505990f6cec8fdc3b03ad84543d128f7a337b8fefe4796b61cf006ebd065d32a47bf3eac5d96ce97dbfce5506ced45c67394d51ee5ba5df994f2434cd78542e6546b61c741d58c4199661904cf37c46fa52ac78cc9bc912304e94a3557771b30e6e74c9681230dcfb686be256fa868aef2b84b50c5f8464a7bb0b358e71b8f369308192c3deaab34e6319d07e8167d252886f3b81f637e6c845c25abf3f40ebd391139f6b7cd34f6af4439d4be428e7afa2a177f725a7a57a6cd5c119e752ca5507010250deab287320679ff25b2607df5c51efaa4d736f46c84b85d5967a10f6c194e840f1514bd12cb1b2c0240804a29ad8a520cdaedfb596508165f9cf47e85b3ce625454d72e1f77e14ec7fb49be4a69b20f4357297294715927fca946d7f477340fc304b2146c8e600e60c782bd2045e0778d7c78cba4a76b6b57a325b1128b57855922e6c34086e34ffc37c5006ff4a82083b49927f98614fa6fbd402b258b30205e91565038e454b0fc97c1b267296d392abf90848b061fe61fa2142365255b7f1e180b77ebd8fdfed36a2cd6e09180b9b7ca1f7b14fb140b6f94ecef7a131a589ef2e33e67b8f5943e8b83d9d1050c9fa745c07991ebf2ae1836a05595e31626f1aaddb62a64604db5c412f01fa975d2b96f4d8fd0f621397760299a74bab8adbd3c7527ddccc4af904d1d751dc6f7944dcefa978bac2af01668e760a6c621677b4021308cd2b59e659ef984812ac50569f9334247f760b4e977270cb16a668c17338f2caed96d9dd2a676c90827c6f43aebaf86c1da4e18918cfaf728db855710b69f376b45366a973ab8b294749a857eac552025d28def4bf0e86691311b4cab4f93ad8f7590bab3dfaa77366a7471918a64c2d5708f06a40734351221c5346eb0941b84867ee248546fb32f4478462bba6d3bd8f746c389503d321340af511f3c8c4afca4c22fc0021283a9bb016fb8e3a3e1629ac66a7633ec0ae0fb1cc1ca4691d7c054de8da10cb220baa372e3bf8a2f79307c69f6a98fe6d07bff02cc209fcc8f2facffb2e7a6a9aabae515635ff80cb81dc9d2133319f22335346298a32b6bf9f4d853f661de816d481c570af5ff0166c5028c723e86742e2d97134c937dc411c434ed242abceeac3c77286feb0b28a22ff40d9c6aea9800734e4144f4d56815e29d2e7995afb7fb32b0bccd1c6c074a2b084915ef749c89f0962880fc37ece58d0a7932adea73bea7b8052e39bc6b8f22ce5875f745d7f22497ffcca6fbf0ce63524f9268303106928c7801187cbace9618a641a445f00f034b35d71f10a54ebff6efe7c605958b74a4b506eaba884e36edf368400c960a0d120024e4ada4dfd9d52b21d25f76f38be7dcfc1fc8992f2f6c0ea1a0c83bb1142fd1e69af53d33fc94369dce8ddd2d44ac9be126fa803260fe40da8fe1108bcb3bafb6a86242908b1283aa25d9a13ce81089bdd4195bf3a2cb40b30fdb843472a712dcdc3995b69f7139702a04b3262d5fd0769bc7d46a59a667cc7a4840854d9581b953c258b2d91329e4dee6ff4023e995cf69baf2923a7a38a9118892f4efd660be6347adb727934dd9ba99e19eaaec61df4d094e2b78623fc254caed1c6d7033cba236d041b105d164939fdb52d7dd0aac82addb56bbb093d89919945a9395ec1e692614a050c5b177374936ee93ef6c228e0f28b6b92dae0aa04767295a1c4ea1ff17dde5adea4eaa7443c24f6cd9b5d1fc2a487748b60d125cd5ee69bacd8ad9f51ddec0cf7e00e1c72d3a784083cef520c09d8edf4d615a5a3b17f77851a4711b5d4feb6e1e978346eec4f027dc2b2931e301544be42beacc0c294f80b53fe60d9c08a8b9796413ff390e4e39569905513123e27d157e28ab32087a41dfa279a2bc7842f5e95d3702ff220c2c65b779bcf251f947351ff6b822a63fecdb7ec7e8e9560db57d84c11b976b04f16caff2158cc8f6c334b2b02962a034297e266011aa6a5618ad05af4ec2a6f6fef853d377bf9caca7f5dc2ec360c8df320ec1281c11d3c025708a72a5a56fbccf34467ebf2da77b21773a96ce1f0b42ca41203dab641e7837cd1913e9712ce06006f39110711c19404c263a8379124a53b5826e05d6007130a46f765767e5282c54e26ef10b7ab2a3c1faf32bcf9059ae387a7fc90239ea22fc295306aa426e3101088b337bc8b263ce9e82b65698217b922ec7d21505b04b2ac1a683c516ed9ec5c8186c1a4d38e9805b1e5c4cc32307cdb615356eb2c69aa98b9d1ae2e97ce1caf432638a050d045322cebcfdfa13b0e897251750553ac3d5f89ab10575a306412b3968176207abdfe75ab208c59c71bdb9328a70f1a7462dfbb21d67e2bd8d4a770be80c01167e96a9a6828359d62cc3519004cc8d0c31382109d15eb976b55e03022c711b8d7df464a7a789b45594a495fc7fecc9861b8060b93ad080a55952dad5c5cefbf704b7b3f1d919414e8ce9ba8e1bb4eea22abcfe91485594dece03e2887be9b73086b1d14161a525b602eb889f554b9424260b4c1cb1823a90cd2907105d9302081be470416eceadc39b294f09aa9562831d15f0f6b0e3207b7fbe4bafd82db3dabf50eb8ddb14319f3f2b70299a2a2ba6d306bc8c83b761d8b8145b303a8526cdaa49158306f97498496f7c2d6c4180da0b71fe3960f2f55ec09823582fa858af8b1f3686760629213dc00439f3c497e29728ec9263e9dfcc30f40ed6ebb2bad93198019dbe0a79170c2ebb0991b9cf48bb4ec840cf4f006b065a04384c05cbd41450819b7aa9d2fb646828c11e221430c03a71398183740377e73593e9b5a06889508ce275304395ee8f5eef4a10cf892b2b942929f956a7c87d4c24faf6cb1beeb580b7072e0cc020256bfb62417222640b0b582dc8d8a4328916303521c6d31fa5d5abad5413ffa503e7b2e915113da289780ce83b30a14621a141621a87064970df13c62fd7e5fd49c1c6cf82cd23a0d41c159324ce69741a510490f1ffb426f3307515d7651596289aa9ab64638550db31b4e1f507274f14a19ebca4a1b8bf6da8522ceb69998502f44dd2f9cc4c419a26c3adba8a7f5c2239e8fce0a9f18930f5ff1b22aa751c00960d342984a6d5e961a7542c9039936499c4e0f8e74aa1d3cc9f26c84dc841a8d7deecabb5e860ccec896a6c0cc31f4248d691b5e196d28ae6a660cdad909f4010e78ebe2b81a68c3d304c1f7a942e0cce47a07ce3a551c1cf75a89de52a9dbb44b2841945a1c02f738ca8c89a6ec6e5f1d425ef7e0b90fd7354237e404aa76781643db9091e40ea2217baf211dc8dac86fb246de09fdf6c73ba38332ed7d319765d35c4820acaea2e1915b1a7db743213f5d13aefcd74c1f032f7b5c505a094a7e22cb6eb246640c4693d5991d26f32a51024507042233d27c4720de3c43db5e3a1515254c1767506ddbcd5926480cda789b8c3ea5572a1c5ed3e9bbb07ec898e95c52188f3262b46d6091382c86ede257bc756cd2a98b0d4e0bb9859528090e80682f04e530a72ff01267831e83f452e02d01837df62e12566faf1e17ffa09d3984b47893a5b82402339c661acaddc166bf06a084b238cd2032b8c43d610cc5deec204d959035fe68c9d1b48a8e67e59672bf9a29573f80f1b16822912ecd2fb8f526b4f8ecb802739fb052fad80ad3514a188024618f4dbe40fd2586c1cceada58469c6a0b3dc87cf213a2cf7215db28c68df7f3d3833d4befaa524840b3d83f9b36111bd0b56f6d606496f0a412b312cd466f79edd30629cf7e7ac49ed4812d91e65c0e1e73742f16cf80a40fb4dd04a9d3c5d186a2d63eb00988fb0199c9dfab784e44aded4c39190716b934642adf44d13c488716daa541be64c69182abed92f30ee9b949b2a98eef9d1a357535934415e77a9266c910d601a2cbc60cf3d34a763a3192ca037a0a5f985953462679eba71d2410f784e0a5e51cd32b1f287a36a8b46762aa0dc1e2b2c30388027c3440df43ce8c9e457d60e862fc7f95465b11d72e2b1f6497abe2e558f3cff590ef7f2282a458b4a99d0efca9fe7706189cc292d3b82d39622ef74103dbef598ccd6c3c0e5382122b26f406a0b4522d9e86ca22ce628109d04fbfb079b2e9f4da555165ded19aceecfd37da031a21a64470b8b5d999ed5e7e6b824addaece40ac97d8b885e78bdc862a0dd8a91af4f568f437e1368a22bc5c17dd280e9b9e473dd41a3070fe2937fc33858e2b7b6a3b281d69643860004491198f111b31e2f7f50bdcfafedd9c7aa9de8505730df8a3c4537e4a7b7896171ab3679994388f5a1213084f2032fe196b0c92f11e6854395c7a2cde7bd389a537ad3b7763f44e38c6b678ba5283b80805560f16be3f9058e3285104f2ea55e3427a98819b27918e4ac53316efa69928c913857b5e650b74e5813100413bcac7098470bf07f67a290ab4bc21587cb7d6851cf1d6f3b0dc46e9c122bb9b56c146bc31239cb7db6918e72df789dc2b451c969d0d9fd2908b935b2f87b05c2b179a07fd6b6350c45bf87607fcb789a1e7396f6092c4334e86ccdb01431f258a498464184384317bc0a03d0aa1965dd4692a6b705e6a49213ebd1fa8254474e87047b3658d8b6bd668fb11343c828c6193bd3d400b03dd533e28960ca02350c9bd0e7af5d08ea012c20060bda89c07c9b25867823128b1eec6aa705c3a6b53a742a6e6258b219922538d03deb515b432c68aa53a168ad51237d9601f6227bb26cafd346aafd71546c21d25c6d7153101a1ee2a58ceb6d1934a84889f54d50e9a572ab09a393f5146e2d64e5af0e3b3f0e0519622b3ccf0870fc3db1f7258a763387b80685a902326e5ea9e2d00f52c6ca23d00e65f58695f8eb69887197fea4b446a66bb7481440c3acf967d125d38b5f7e23cb6782b392ecaa45cf84258eb48ee757d8c46023e8f6aa9118f4e1900be47693eda844172c45910d54d0e54318af6e58012770ce16bdcf663217f37146b424e1c0eaf5557aa4021bd13713855dcefdd89c0e1d8deff4ede51a53ec9cdae134b3776902d3ba4639e9004cb310c5502f1f3558c64444f002b96f1190b43aaa79074c159b10a291c278314dc1aa4f30c435ae412d3b095b1680d0bf50eefb73f684ababee65a35c1a9b86266407036f2edded34582fd05bdbf0ac77655174a45ebae661c8277edc7b53421b471d6e0d3e1fd5f96d966a0b900d61dcb640e0c03c25dd8d86bcd8a1e489eb387510770fe04316fcd2e365b5596878a9aaef9cc427d1099185dddf16040e0e3e416114607bf8ff279139522e0b11df48aa765482ccfe1aa93c6dad1c40786ada4e762f52e66b5397692b55642d70a98280381ad6a7e49e85e81c0bd9c6274cd431da11604b94476c329b283cc937c7b95d3c981455c2c35eac0f213528d551771d15c62de8b78e6470eeee425760165cb541d7f10b83284acaa8cb6b2b8ee18f4c60017161ccb2feb26481961c7cdd6a6175bdef7489dd10b953943279ad3a15cc9a1f850f661709f3fe802a689d843f11de801ad8f072c6f32d0a3564156909b6ac6bc06450a6023305b14c8e04afe0dffde2eae761b583e020d50dccb83f6ab5d0e19ec66d8ed39bd7c1b8ea67349e2b119d48a806972726b417d20dfb6843cc3de5ec4d43396ca125b6bfe84b50558076c86679442c8fc1394aaceeeb28521955d3ad05589034102dd8ca703cdf549aa33c6316fcb4f23217b84758a006bbfb0d91e9eaf550346bc5b1bf26e872c1711ffba34e856c09464919214c65c0c92443f30422cc58a789662a0ca49dbd0ef02424836512feedb780956e44f32d017ac5b54a23fa6b9072b38aaf827628e325cdb5dada1aa4ba8b71fff2a4c9db7b3f09d20acba079d22ad1bd0fc2ff66304405955a23edd27803607a25bad069664c20093dc993047ee72c25fff5799f5307c08b4d9f997a23354d4ca61d1574560d3e9d4cc3c0fb3529c3249479df43f2721b82dca7ddb4e4a519045503987129c9a080558065e3b93ea4f6ade47febd7277ceece46c8a8e6425173bc5a5428670a91c7ffd74c66671ca25af5783bae7299f5099d6dadbe8295c32da397897e34382eeff4ac9493b85d5e772675ae2711cc7ddba1cc703a83a8e7e254a839def50a71ae8d7e363820c59152a4d7eaf2de96383305a9d467c30d09b4b68d7dc76c7ac0a7d248c23ad9f8f43cffb336f944548238997bf70e0f001ab9af97202a32924e02e4739a8f104ae15f98c6cb02e970524929f1f91f98e86c1ba92ba0430f22ea00657e8523509981902fd77bd48b48f9c27a24d9da8bcace907d777815d9e621adc71d4cf15493d0ae098a87fca4cd3464474953aa5a2d443ed356709bb8f2faeb5a5606f9c2c92ae5fa15210e0a001b86f4b8be8c828590c086b545e76de10e741e35337b90649b3246b01b1cdb83b69c66333153b47b6d63cece3cc4f62a39d3abd53d40537fe3b02af5be9f296e93989f577933b30bc481a3373ba59323b407a9a89655e5c1fab16404e7e6f9be5a103f18450fa63157197b8d849d1cd56dbe78c48b9113209555cb1da83cdf9a38a0658700f848afa61d1f2cd41fad458d280b371129b326ddd4b6c7fe50e0a31c3057262861374a0c9a06db0bb6f8acb0c6f858bc60f8fbf13e557766de5efd37fe81e754bb6aa529532f67636d1bf1c5e79cafe45f1894911a42b0a2ca0dfad9f7c5f935e980c3c2686e2a0261ab1ad20f095d62427751e05c2ab59cccde3e03ecb76c29b281818aea553187f4dcb528f548550eaf4f03a4b3ed35cc1ccc7c4f1343dd3c15e975282cbc082084fae4f20d902589de2069a71d11f7ec42030072afc25d798b216548a1581e4bf3954edea31e2dea1e4aaa7b72a621ec8bfa997315d49f6e94638132f0f45248553d4bb3246522a1078cd4ee0628a55071f73163e7812779d413b54798aa193102df740faa2a613693b35c751288a7b9fc917445193020593a305afb97cf3915702b13c2de009f1056b7e12ab23e3cbf0d3db3db5330545276b4012aaf2413972506a7ec2a5c1edae15834e249e4469f8335c7ec5392f7f413f2569138c7634aebb6ac8cc7eaa3971b43b5a33224d61698371c654cec853d95971d785418a2c3880fd96642a8e1fe7c5b1193d94e5dbc41bbac034c17a846f4df0bce64999b8828a8446eba99c0cc30ca4aa1d10db051a9197cfb640d063510cbbe1c306deb5addddfde94de2be29f3e30ce8cca022a2f3363fc69382e6c7daa32e2ca9c7e7e297a05e83ad4d23f7f1c038cb13871917a021281633d860fe80a3da241ca409d8b34800466074b3e2cf7e5a90c737104fb8664173f8af2855b637ee16a4829c7d201eb8a5f585e80d5da3bbaf12860be12b4a09597b153872bf2cc7e69e2f92e15fdb62b27efca702cce5dc09f5040d40221e31ec81b14a2dd9c16d0a0838dea0daeb8c5546fd1a72eee85aaed669b48da4dddc8a0fa64e3c0dba3a872311fbec5bf6a12cfb340207a409e8864a2cb78d98d44268ee4013eb030da6272f0918e89c501d517872b3c1f21db0ee4b9e49d5d2716abd3e7f9a989ec89dec91b9ce8028287098d17f4bc0cbe8ce802c3aeaa52d5cf245b434fc1663f3a7a19b52a0eafb6c8c7395820da3484dfe0c2f10ca0bf604479520c7b50832ad45d4b4184acb83cbf3ae5d130ac27fe82cf824c1110479b4b5304ac16ea78a9ee24c5f97639fbb9f0c328c30d5a15b4029e13009d36fc990ecef0795ca1e3a685e12f5c20b049b95bb25a9eb3d40fb0e29667aa1734652a7d4bc01cb0754faf673f76e1fd7d052f39f8563bfb3a3e3b38b561d9d6c59067d3a0581ffd75806ba359684b8b3b9dc4405132b70937d353595ac0f05bd54398e3270f3002313d4ff42d8019583f4a9f4f15c04003e2617eb19bc614a0cb76c24fd54ef226e014e894c51edf1b49b23d06cf0230bdc867a3e791bec907b31932c463e94525ebbf26b9388014041c30193a643d897d29176833f742130e30b15a27f3f7a9a1cc18fb851c9ad3a9a4169bfa2b00e88e90db1964d94815319b822a389ed3aa30ff9981f817b4693f408846249d3f078b27de6584b421e2df89e6e5a33bb38e55edbd7dba15d4028ffb95dcc6a33271f8fda00e2584cfc401f3751d81379c4da1e082210234d19f8f971ad07338a0b55ed8f5c35073fb3f56160e4594a17fed5bf8f1d99462c2687212482efe08471fffe44280fdf06f52331e605ac8b1cdb910686d6133054dcde57a7f8bd662288992988698639aafb21587bf65a0e4e0603dbeee16c0e7e9d719c1a836260353a7711301b58495e5b57fcda9c03e2c19b090b3020dfbc22ef24fc81a051cee314aff095aff01d3abc1115486d9f4468c939e6ec32f4927791217301cbf4dd086e07b247648f84eab16082a13629e21f8b7ce0475bb2d3812667586290192f23c5f1a6d7a4e2204ae2e70feef3bbe98a290da0d8d2f3c0b1f19cf6b4b9ead4597f58d2cc9686943f63dd7d31dbd522971e3b9a34fc8ff55ea9081340fd4139467fc333e19f81a574c31cf7b5bb2d80ad6763d059549cda7f18e8fc646467ce0d7f8501fd13999b7041f2404bfc19a5c2f8fbafefa2e5487640238c1b8aabc54417efa93040b249414492e3bc8b074110650780dc16ba84fc68e089009fb4580e4815962e17979dc8cde3b04eab09fd6712a88e4ff5531c20b1e71db66254e03ea40abf2e0a6e86fc458dcdf5d237a95d5c666d803fd1b955c3b37746de90ac7ee370aa2d95485ac94083cd1e79b8c99a70e82c30cfbefa57b0617da50a0610af426e21da073d8c4530e190cab2c227abf042c7304af6a770802332a8d1215389e493b331642f9f510a5af0e1a2bb042299efb3b9def5dd7f4c259858a2baa26fbc94b31eb216b440a467773ca7568caf4fa174e6f8a6cbce905a2f8ec1dd76bfef53adbfefcd82afb58892e0636d2265141c1897a0027ce1378a3ccd94cfe6cb52327d696e25d5e004b186b57ab529cbf073932ddb2876b20961ce00b0d5c8169bb07b55cc36ec972682077b446c47c8da71b7b38f495dd7b401cb8a6fb0dc99c652948c89310d1dadac5a63dbdaf6e1fc1f75c1962e9bdee1229404041e18ef4b41491a0d75f5354d37afd7ca07c4f0e25fbbbaad1014000bfdfb1e1b58bca7dba8aac29d765529b2a8260b72a77ec8d680115210b2a5f223e75ca98ca754ff1db844b70f5dc71a19049ca15fe47331c249d9560c68f43917f2966e1fa6ed72368c6dddc816f293ec735acb5bcbc7d0ae8b894fc8006ca112f22a612ab487eaeb7cf634fc5329e645701b9656596a9692906a58943c720566e48fb2eff51c9bec5e613467deb8a4cd0871bb19da2d713d87b0e740b2961315be816219e6fd09b883329ac44713eb221e119f1aae6eacc896c3418bd03922600c282c05e72b7c6bbb20f103fbdf77b080e001cf9ad6b2e21cc60dd0048df4366190f8c2aab630bbd5b48f414823be2ce27c87d09d2baa7443c034a020d48bdc171413d96d9ddf09c1069c89d2d3e4ff451022a91b14f5c4052b24a07558b88b2c8823c736648308d497482dc6c2d191049155906788604e9553c9a34bcb4c48bebbc77212ef73cd2a803c6013b62ddc5d27b5bd3f31240a583ba8934941ff4e75eded48d1cad9b959becbdf79652ca949294014905b1049d04b6ba37a55a8f0f9ab4a966735baab3ae8dc56e97e97e304674a663e76398d6e32fa5d47a361ae00dfec96da96d685309b1df4694bafc1b12d6f9361a2e130d611d7f23acb3d1f031638770049a0b7f890391ec92050e2e0402106ec0140591202ccd80030e52caee29ad695d57cbb6a465b96004f7024b7e10841ab428aae18a2956f806970262e4c08a2274d0848b12b0b4ac54eb10450a218488308111c6424913ab32a548845c4abfd2297d6975a48b6b5d088508210544616be6b2bbbbff344fb692ca244d6766666677776766694d282ed0c29dd200fad1c5c0d42dcb81b8feee8ebaeeddcabd07bd214a91eb4e2905f271777777eafdf38509ae194bf58b212ca6bb0a1136065aaae1c94a83f9b166265f7e927a2cadd063524a2915a2afbe28a534467129cd5cbaadb65696655b70ecc430c35ad625a7fcb1a82629a594d26ecbad7e39755b6dad2cabad4ccbc1b163599795159c0088524a29dd02cb94344c76152830e7554b27505ca655c2095600ac80718229e5f4c262b2a494dd535ad3baaeabadee9632670c18d994d2a14b8f5c574bab65770760675db4a9d5d6161aa54b96756191565b3ce4ff5c4a29a5d4c75a5221e9a281a825908c22a619e8c72a484affa94cc8901cad1e4b2b3890134934065aada604fae11f342ca822839f26582462b73b678001ca119118a648410f56ae208214c1113b481998c91135e08063878404a48ea8185191e40321785c090a18442845a0200e31c790c1bde14e96bc8494178ae53033333333fba8c08387646666963c97a0722d0184170bc74ebd0107443cd821891e8e8081c80a19242104cda174da60bdeb0946259c30a59094521e7125a5964f8e0f31f467c9742246fe18f5585a413ad72ba64b499906a9c40f574a9f5cd4c5a98d7a2cadf05324046ce987890cfd3399a4ae943da527fde8e81e492c416152827bdd0f1ad12c21bb95c89c690e0e1007609860e504952bb254e169aee23614254e6eb74b49bbbbbb81dc0915239872aee6fc89c1823203a3217ca60a493c22a0830d9244a194e5892e78fa6b23ddee96ed4464934a29a51c22677a151facccd9c9c1b153e78a869a532586199e43ad0c11436b6ae588bb9514f8742d5ea45c72898394f2ab13294fdca74ffff159aa3ed3a73cf2c28a2b25cc4b29650f798394f2abfc3a270f9fce4169e7237390524a39039ffe91cd459607ca8b278ebc7032fbe68a942b6b50c355c3136354203cc114c4daac1c813e68020c1ba8980113475a5031d4c30f82b0c5d10f7ab8428a8fa06257a4a4ae16f00007395286288470ec9070252124b338e2e2041876e111172a286670a5b82eb441c184593b3938723ec7bdc0e1dd3c8e1d12aa85416d595c5c603938a0d0a20949859841851982403183114db0208829e02a0a91922ea2c8208426298872284d40120e222eb8e288890014145d510220a400862421049c1f6cc4600825242a8888c1122db8810fd4e34189d213261d2a87448748d1087eb801861e0c19a1448429757d104458918508988d943e34a1a4091bb02c7982861e8e58914518568d0a8c58c1448b2c624ae001082b8cd8a045468e11a5ffe5e05001912a86f043bda4fca1872aa628e1a18a2455872a489053f3020cbb8600a143e83d84e8eeee0c194877ab308cc6fd206408193503428690999999d9991de6c5a5c56e272dc32eabd229bd194208194296a1819a1123b3356119cf1e0cb7650f4698c1584138bf7073bbb0bbb7b08d2348def8d4d30127689dbd4d37ed39e79c3de1ec31b1ceeb8b2d860c2bd3997173e5e94d004fd2e9dcf574c009de79cff6ba992bf3db402f42089999797a77138b714fc0fddcddd9b9a5db6e40b01bc5cdcdcd93e99cd6ec9e3edaceed03413f9c5a7d753eec713786f1b8b0eb310cbb6a656955ae553aabe0231fd6fab24a775959fe6449274f6646e9a068fe2d0c8ccf39253333b39452ca2a511228684ee9cdccf1b44574545befba2b62ee0bba0e65b5ac9a6d20ab3d5276772f643c49f8e70b91231770e96f66cd21df8fc867ad01db9d47e443ed01d0e8762764b1484600fa9185f83ad8a753f76eeac8a02bb328390d58e0fac8ae3cc5acf3d8cbe93e751365026b1aa54f00f658e3344dcb74f0a5f55c5dc6de9439ac43f9a3f421a517f59f1e3b3b24e8884ea235b904f69881b8a01f43d82e61a76194cb2d86f5695692f707eb401dff3881827ed06e6676f1cafbb302cdd88bdf1d8ace2c089810b6b267c47e962bd049117307f008d75533ec07ec5b9e3fbe6df9ae24588dd446d95716d8af8deabf002ea08499990658b09bc011ae99a791a131436e7f71dd04dee82f212ea05f000dd034ddd731b8fd339d8c4cf77193db45b5a2bcfbfebdcfe388746ba7a3db61efdbf15afe9e7083852e6fb38716f7a2695d0892f070e9ba0e81ed5c93403f46c4f2c7ae8dd87372faefbaaeefeb338804fb0488937dec6e1d8e6c71a6d9d7c1a7ae56dbd1d40eb56d5f1b59df4e4edbb66da72cd33acb38fcd9775923b18ed5b5c535521bb1d7b18d6ec72ccb6c9c2208eb44a59bbafee3a1dbce38fcd7f544438658c5418450344f9459982121fc5e2dceba22330fb10e7f472bc6e8b73f22c5281dbf76ed8473401ea804916ed20b5ea98c3130788365d8ff0795e06b9cc57276bc9cf772e8a8f2f3aefc762e0a6575b5dbb91f34ca89f08d8c9c40ad0873178dc42048b10892918a74e5cfd48a848585a4181581447e8c92d494e54ac9c4aac9d6175b38b9dc85474c485c1ddb31b2f71e3b6f3ec92025f7d9fd1bee080336adebea386871def9e4ee68178b50ec357bfd10f2f0c0aedd2d00596628413a39a02723cc91d338f273e4740e0be2c8973fd8ecaf9fa1dbdbe7b1bda51d0ffb2ddfd281c03e109e582f7671b1abf0866c79c81382eb795a38102499c067efda8c4fd6c9ab838df3bdcd208fe520cf0eebcca0507788d8f85607e4c3e38725f3516a3dfd14ac6781fe601deca5a4924a8a713f8082d8932b147e80826eadd5a21776647b1dac753eecc939b78e6676a8d3c97a16ace7c19e3c697f3a9d340cb3cc2ad4b75ebe0cf69ff5f3318b53c1873df9505ad60a1886fd442963902b5fca4885addd91d4f35c9d334e7c7a038342d1fc671606c6ab152bad5f2d7b1286752250e3c8af563efc6e6ab522f783755c27befca0189d3d296f645b1848b9f0e10bb60346e766602c1e3eebecc5f700066fac2bf67be82fe4803c40a4c33a67852d0fafd5d2d2d2d2927d5fcb1da9bf71474e9c0661774476eeee5ebb5a27cb99046659b1fed669dc5a3c587e68dd5a59fe1a5431abcb8f3db1f05eb0fd9f580dd0a4fb6537e6603f9a5473b0d74b6902e53e9a74e9477129cdbd3a9ac483bde4259f5f47bf4593bcab312b96b22d81d0554e94e5366cb945328c64a4226224f6c2b29dee459138a124b31a15e5a048e8922572d23927a5d5aab5bad64297dfc2529eb253894d59aa454ebb34e5ee45a6f8690a7b7c5a42615e259f2c58900b0bd420f4d1ab2b2d2ef244eee5fae8d5edec5e35baa72e973bb12cddf84d415629a2db9eea8e3f4afc350a2c5f99858165d52425ede2539ae4620583375f0054b0c688a666034272ee1825623f9a940447d076d4b892feb70121399a4b736517b3823776f86256b72609de60aac43adec5d7d1346635a7441a7faec07e3546bd8386e642cd841ad7bb1a377e35469721bcc1d1a500a8a2c0bae10d3aa537679799e8c7a016bbef07031642e92109725990bcfd356908164443206415ab78887160150b7848a23495a6d2541a0e9aea6a46da908683a6d25444486eba948e61b5c89d73ca38e4faa59d90eb4cd84a27bcf4a75441a64b5fd26929b97bf56a29558b5a55fcacd352ba57ea5a52dc5f72f3e7d32fca2ca53bf92da539a77f7f5f91de20c6c8117e1cba31a6288d43337a0f9d83fd62ea7e4154c742990d6543d95066433674b326592ab3211bca8674c0e001ec0e2c82b08e0bace33d75c70feb3baec8c21ebc417c4de0f7cbefdf5d50bcb0db814510f620b445603108c3b34beb57af8f5617d4d6e9eafc5a5d5442db617df6fe37ec794516fb6c074bbf72278d76442216c5a68b3174acc8c6a2aea9c7af5fbc3105ecc62e2ab1839dff3d7f39d7a312b128470201d3b13737767b84406c8a4d1c9b18d0454f38e19c3ddb6ae2af36978294b439172c2e6c84cc529efa07ffeecffcfbc91327f7e6c2274f8a5c15fdfe291e5c000782ea6b28f47b47b50684e0f2cd1ea39c0bf5d6578103f5fd2917143fefd2c73c05ee7ac75637e4aba3e9573febc3bb12b61816fef5d4df3fcb32202c8b80e10816ffb462615c40bcb0765fdf19147a8c312e130bf58362c6b120a5f77b679877fd1aff92e242bc756a26f014ad2723622b2bb1f2fd2b1ca16b7f8d776a29d06ffacef53b9d9273215eafacd31d3b8b17130c1ac0325d78a1948b3d7d6cf317ea8fa18b1084871fde7cbc44e9a2815965710a7b7115e3d3ee43d9b88a514424a9f5441ac01c19e3c42f4e5123129d9cb150e4e96e86e74922f9c88dff79345a3eebcae7600e2e0271e2dbcf8b4aac7373254d166318ec690fa08f7d44bab6eefb4bcba226fd05968b341799f30382317d710a7b9053d080edd20ef2b4fcee5c8b4af3050ec283bdd040625b39f404c0df9b6880fe086304723ffadce7dd1bfb5b8c96d7383f233b13e2cdbc3bdffe76d23a97aeab7c75b4e53e9bfb791feae47df57e5e0b718c7bfde4388031fbf06ea6b2fcf0a173377e03e0c6ffe6ed87dd1bf0aefce9ade4940f75b9c8beb5fd99edef9ac5b7392e1ebeee730ed80e78e1b78410e6406c66322719ec85117e07805cf697ffd916fc3f20d9f5f2a3772dc4ee08865dd2c20e26b1fe7cd3d1064c498c3072ccbd03f694f598558fae49396763619bb9a5e0cf87a722adb562278d085332a4638c9dcc6200eb8c71e61c79f08711879f5a84cd8007d5f934fb0a73c0afdd0e7b3a3812d8f39debb0d341428b61775807e6b03cfed0fd8757af0fab57af5efd07903b8594c2a0acc7078574428f3d97d2d697b26e5b0af059b09e00a7edf4dbb69db20c669e559a03df7a8792f3e0c30cbef559d629c0c20c5a0e7d8704f8d321567ffaacd4dddd9d3dff8b0b7277e8bee303bdfa7c082b7ca020d6b1deff87d5cdd4ba027428ddfd4404060f60836afd96004b6666feebbf39d97fb23f0b73d6679e3c73b0cafd6066a04944586a10dba9feee14111111111111115c352d2925217112272575aa5a8b42fd7bdfce00b244b1d2ddd1d9bb5b7a7b7777b77777c7aaf5b453b1dddeddddddd6b6b4b4e8d81e1faef57477777777b777b49922484b29e56b80051b58786d50e10834972136a4a5b02dad633721444286a858c52c4445648d584291184162c488228f75f7a6da863621eeded36d43ecf9905acf771cf7ffef54ecbf8ee6b86e1312b319d990d4adc83624c6adc8366433b21149ad877b6cba6091a2ba50eae2e2e2d2c49e1476c6258c1e172cd465a5f9b83435ce2664239a79a86d2aad47c6e5a427ecb978b18e8b77be1301e0e30cff9fdb3cf79fed3e3e3699b0df96ba1d376fb52899190f59e63fefcec8b932ffe5dc198fea8a74481a87460d117bfcf1d2ef38be369c5092ee67781e9ba225a7d36953003fc7d5a8d8eb38ce06d76d2a1b44b685e3e2ed3ace29c7c1db71f2cabcfc17a354635453d43835326a8864c0d40c314e4dcac62a75f96d64619d15ebfcf3db088375bae7b7818575bedb86bee336157b42d88b9991e1e295514374f9c3c092715df8885acf771df7ffffcffd3ff7cf7df7cf75df7161b0c75c93e61393d4383233ffd510755cbc16665dffc5285d76b9e15e8a340e92c691e1e09561238a8d24680309dee0879a8f0da3c6e1ba608f5bb1c7340f35ae89bde76abc0d07796e38c8d371f4c2fc2723f4c235b14754f31fd7845959c7b5cb73dc46c46d43dca66a1c9713d2a6a7af03774bc11bfca9ea5fb3d1704d5686fb5c6a88ba251de57e32422f4cf79311e29a72ee57430473bf2d85badf967a495d9611aab1aa21e29a5cb07c8e64cafd6484fe7e5bcabb3108d790020802c3364f79ca53436008398a899133298a31322f55284c92dc5d3259f9d4c283b0378530284c0c557a2114268486c0ae882891db65e480b828f62217c64559b53e71c2c4ccacedb0985ca0c5855d17922256e540a0d89b73ce2cf32f866aad55d35645be11e194456e65b76dd5b49aa28ae2485594b02dd652a42fa6d48c88169796962a3eb8bcb8b8381d82258b9d71e15195185e605e5e54f4087b21068c0c18180fe25950475e68212346868cd5b502cf52bdb02266464ccccb5d9a91bdbcbcbccc9861454a3daaa27451346468d0b0c0c862e5cf5ca0c8ccc8c81459171e5901e3e5c2274e9098a19999c92e3cba3294d92cd54a91152f685cf8c4c909686ad0c01b5792ba632e3cba82c4ed2b46ae105d8ef789931d6ad4d4a8716465c8c2a315968719a3c6a6a6668504bbf0c80ad2bcf06845835fb1c9be05bf10de601b7803de80dd8525e74a53b4475f30ddef665b609fd5a851a3c67f4c14363636361c2783891e8ee3baee68a5f20b9f389104cec0ae0031601e6385c11d04377e9f3e0e506ebac0c0e9811b1fde70f9811b1f08bce15d8dceff3edf6940a526cbe5b711b20972990a1521fa7d6c486c4d2ebfdc8aa85011423261fcb0bbbb63ecd81d23c7f6eeeeee183b7677ecd8dddd1dbb3b73dadeddddddb1bbbbbbfba374777fe91dbbdb7d747b7777777777f0f34181787469e2ee39509fee3cb8539fd233ff20962e7737b76d4936aa0de90a1b6bb05caec1c21ecb6e0612786353eaee6e538237d8842d8a8d6ab3515d7e1d1d69d2fdb6ade8226d51fc624ed86f5b72596e4bd863efee3ebad403fbd9cb31dadcd8d94d493b623723de966c70041880a51547a6262619a3942de57757a6f947c1a060682aef80654b29a594f2e59c92a594524a29a39cb393b276980fa8342d1b09a9643303000101c316000018100687040291240972285b7d07148010668a46685a321148a2b11407511804210cc3300c6080010019431862cc295a050060ad57e22d488c9074d01618c367fa720f311d11c08d42f8e44381d897fb10c3139ec61b88e92240e872b03735cfae5a594066a80cb0f126eb4c070e9ebf03670e1c70ca75a3a4939da10209a97f7593941224da898c1889aae8d5328b6e25a1594c2d2bb4c417380ad068cbcd78612e094e7a4250729d77093ecddf2548c084a8a6cba7946758a557a543a9d43088522defb1de57b474b904a9a5464b7088fd628539c77ae9f03b253b90081b95cb4777f176497902a2c1faaf31095bc99a76eb51fd4a0e2f0bb50c7478bc68eb81fc67c64978884622f99cd5a78fb6e0b3cade41dd121a826788bbee11766fe4560fb5acda6db3ab31ea705e420fad04e00b46b50370c6508a8cb1074d4212991564b8852271765a981a57cba84b7960248c8a97e4b3720950e2ec6d49139d740a7181c279e4a75f27e5256e4f8b584de00ebb02f4ed2b7d49ac1fa64d9849cc87462c61e92289f83394259d80d71985c1651d18fb3a296cc9baceb4e844478e611f2fdca4ff9bf7358d26f22e382a1c6a51d2cec33332afbfabc0855c0059be1419f7eba444513b2138d868528a3e433aa255c847876d9d29f7a000fbe7662b691fb26a8c7d7241876ad33665da0c7f9ea1fd7c7074c63c93d53177001b12e19c06f4d5a6c2192d047d077642f591cca3eed435171abe0f71862ec9ee0ab07c38324e81b63446e3439193a13d474598272198eb2a4d66cc84a78f8c96ebf90ee4e183b6d3f26cb624d4d5148ba6917b4c14ef8f04bb8ebce52b6e59323e8b38130d1d7099e3426900a09aadad0db84e718abb117dcd2eb7e58190b266a84f79448d6bb5002494d349f124d0c37bf36c0d5aa03f460c3a654f9131466481d0f93cbdd1e620d73a97226abf1fe6f6056d24e2c9435c2e570169f90ad4690f2943059e0f1fb9bf9e275657225b4e18e2c58f19cb7a3c44f1a49e7d7d21e4b268197eafbfc6bec7d367bc700d644fc9f5c0eaba099cdf8f49795099249529d6e179f69b30918610e15a1a28fab3060f6a438aec13f6e152f8a55a8ae5fb1fe4f14d6d8f8f12a30b6d1fb2abd285a5f7e41afb1740d889c8657deb448e5c1516670784b40b9beabd3d87543a273e6b530462818881440ec12908b32d8e01537a1e3806eda05f919d15db9953f082c88d90c73c83741a51d54a754374dc16fc04eff8eb2423678ffe14201d80456f520e56182135ab9cbd9dfb39717065d7ecc2e320c958c6d870120ccb14b48664b2372e6a2a43741d38b6bfafce8f6fee40e230f8f5107f5d82560f14370442d74ee41bfbe57743754ca37fc17041446080a1d0f784745ca038268b3adfd3c1aaace50dbbc422d77e9d067427ba2264f34ed6720b2b79214f87562daccbbad6b878d3944ec6f910b195fa9cf78cbe72a25fdd30c0730b946e8f1301e772eb2aa3caa040df846d6ba11080b3cc4fdb229e098f37eb82a26d36ffdb390c820a4232271e30f4b0602df4dd0bafe8da2d136cbb7bf4b82c170ecc79ea3ced58fb3fa17feb040187cdb336644b2e465191ae63c9b7b92dc00d57ecdfb4a2c1a816f5523b591961aafb4c67ae7b7c1d2f9c8f56dc7b2a883bb1bc1058deea7fa1eca56a30fdf45a1d62f5cfc4d5c25bcdc2f3047c7e9f94916f16e939e61e1c5a78006bd7d036212c1b05d7c2eb4711361f04c4017765f56fe3ea32dc7168b6a9ed75fb56812060f7d866568eaecbc35795253411b30cbfc4e1531e9eb9dd7bd5e60efee34d77a5b925cd45000b7fc9dc9464ebd3e78145bf8a0512203e3933a9f3ed61d228001b55b558fdafe63c0d70567aa1ca3bec5f00bfbf1b23cdbb452775b50de96b3981fbb71a767bc251348f44031e329c94cdb20d039f75c6c565e949524de73c3268b67e1a32337aa379cf3512a66e45ca4767ab7e331d76ad4a8c03fc714212d108e207768cb46e5895451944732f41c7938f4ee01f1d1c2a46398684f4a3aedd06e163485cadae8a1c0dd313c017611210cdaf7b2c12b4a496e918cb3147cad4a1da68780fb9201b32528fded62965b1c83d56387349bffc9d8d7d6758ed1d057a625956186f3b9bac7cb7d4947f6d7950666e84d32d8c56ecd40280e8590c673491d2cd19c8b02f18ac230828d14463dd91b51ab1e9182fd8909efa05d6cfd2af1100064209b93d1576f846a8013bb8aa1c36c66f2c28d04057196bfbb7e466c4378627a15ae63f2e660eb67ec1e661697c0db911123720696e6d91512b9199f4329647f539995599545323feb41ca00d082658dd5cd82c83e0bd0fa1f8a98755f60be99df26b1a75e5746178f4e916d0fa17ad36c4df5a6c6f6900c304938f3e354ba2357bb752bc0465c96af36f6503de3aea74cb56cb2d035ee181449e1a8b83c37552c0a509a90b11416a738f1999d7900142a20361e8f49ff0f0ee31ee204855bf9d6c796abd3ba8bf880712d8c34af438c281050455f5a39e7e61ead2da9628a1660e9c842bb6dc5f3fce8c81675bcd8515021fb3499f64fb334cbd4d351968bf786c62800207b5b990fca34252565f8798df16a0802b8d6d009e36029e6d3f1971d0124b0ae34f70d5c6f9e6b6de7064c5fc234e6cc9347cdb8c1e1f48b7521efc5270c3b9a3eaf46bf9642d8dfc7e551d4e89900fd95afae90138a2513d92fe9e6ef1192ae7305ff3eeffe9eaeecdb9caa46368110f13e887935b14853d93712c864d673619d9f22b548dfb544b96dc5afaf5640ba5e966443b76c31959725864c2d78f80edbf1268bb2f16b467b3c57be67a90eb7a9b28f6160929567cc8c2895c4dc90351de8d298cf741e3650f80fbe96e7a1e3a012c36e6586b5831e833634ee8a0688cb1b53e0cd9312394bd150e63fc0b0a73e859c28a07db0b00ca921008763b2d613c8f842e254842cf532dc8eeaf5e1f8bcf219c8e001b0b9db2a17224182edd991ea179999a0b8465422c50c2bb346ba46230d17a1d42cdc3b531c15717b142ab0c52056a27dec9ea26f2348a13373030615ec220b9fcdb7886623f4372585d950a928be2815a856cf20cc64245b9b2f18c86bcca9f8d0febefb6cb20b9cc306f4cbb6c719ffeeb7088904a7ade5bc24f57462e86ef919e72ed5cb576c57d77ca9297f3b9d1ccd96d6857c6510351157aba0d805957035512687fe6a941fa452ebcebba91e5da147cfaad7756e19568a65726181a30f2ea0a52734a4266f39a768d34a3c94c22af1ad1de03834718554e82077a58a3f06aba20ad3caba2c040e12be3f6d38c97af4a3deffb7c3c7a588a9118e2c68c27338eaeb02b7c380e0feea6e9b7d4ac4fb73a875329033475de584688c38ac5e08cea9b360f05322abdcd34630f67c43db48be54a90b02fc32dfdefc00c82ae198ab014c79784defa01a0555ef7492573c6e8f56fb7c4a89019158fea30107789751a2c3f74cd89b2471ebee0c041b30b63ed683195e953f017c34d4557164fbb9a4b1718784d27889b8f7f125b8ee03e7214574ead4e56ce942b0cbace4501668c60de775512692f2dd378d90e75d84fb8ab9b62ac422e55fd5d55aad7706afc3c7eb4e7378e30bb5ace63bd4757a5fbecbcd6b1af1a79962e7f8c030d4dab44d62a79c32a80955b28441f302dc10a0d1f646245752751aba1c1da62edc81291b595b5792a508a6e7350b9071f48cea47c8e1dfb790f573270d61a5f85fed5e00cd495d0ad8948ae330fb1d5d9afbdc2ac0b22733f4481a86583bad6e82cc0c5844a167f2044ab2a346d2dbaf248430be850c6e65afd9bd2e19abe53e6f15741aa8081f33102808afaeb519378b92c1093d8948c1ef64e517b25bc9ecb9ddcd1b988945b37d6040cea2a947db3ab81ce163116738c51b9d05fb14ba241d439558fc6acb5d2436d6df336a18612da93a9ac11682357c817b3eddbe77d25ce6cf502c74292f7a98589448e46389dba0492be54d9a3728d4ef9d1a02db50771b67c2dcc2a02375cb217e29a46c4e9c831c3d045e5162d70519d764636fa757a963d9c4a3164fd3feba3c2bd190ddc1bebb3918db481d74a68c4ab7f0916279d4311b36e1280bc8ffdc98e588f0cb749d0263e3f75a9a61893c58ccfc78086174f6411a8d5f3d6050a8305cb21371843f1ce52be977f27fccb62ac5c7c389e63c132cf6d09ef7379e5fef21f75dba8b178c0e62b333e226c21f33c0d47fa9f64ff6b8f60341c21940f6a3e47659ee7df8a15a306b31df76d94cea2ee4c4c876e7206fa807c632741d04e6ef37b0be7c4207051f0017b9add527f6b392ffd540fe0f983c2548cdd329d195e3917877dec0f7d2a0582124b6677f7d4e6ab55184a7a4630eb7072a9c156db6b3fcdf2d3e1e5cd7b68d643516710f617edecf79346001227f9e5797646a958a24069a38b93de2f2177c66f69691ea880f09a37d3bee02e9b14c167127e1394f05ada8cea99edb3a0681f1ba609bccfbb7d42d30e99fa6a028a20afd8ecf08d375f5f98c04917353521e4f79e0aaf338aad27d82ed22446ab7d4c46d5bed93b866a8c26c3dfcc0dd8d86ec17d5d69520c99191f2aace131b7f888471f951f77486284989edbc2b51252e3170a3d37db82141e6fdd16eebe6caeaa4e4cffb9e4cabb11c6162ca42d3e53ef36e5cf7fae9cce4637c8c9d718bbbdb4cea91b0aa05c02ba9af4a8f710770cde228ebb61fcf0743c3294b9ce6dbf80b561c09687827c4c19e55508ccb649d9bf1412ee8e0243e9f37832a0dda59f31c27b68fe513ca773131d048ea74df70989134001e4140c3c07e491fa29ee91093488fe2109bbc1a231a1e9438e1aa493447bc08f787f5da9c498a1d5d54000448083f38dc3acb01df25a77e7d35151a2b252ba1dba9c6ccdd50f6483c705ca5691b18dfdb2e7d86fcc564aef70e05c0698d52e3b43c9b609b39440889676f014146e26761e0cb259fd0618a9dbc20deabee0f828500f74138892a2b1e541b0b0164ba73d59156fed937653377c8a2d67a44cc2571a1d4a52e6b8b94bbdc417e14c1049a151a6321355763157e55fe50e2477c5a6c980e605aaffa366dcea95a650aba0b916df96b96e76c1d3a86a08e4208fa54fbce16a0e5b7f921be97cc9b4b47dd7cef999325efe243f90dcb80c2406fa9f260a1b4a505a8394396ec60acac13928016608fa5239e60291533ca76a0b05dc0c319416641d5215f004e418946a1ad982eb20f1dbc115d9459e997f6e17cd355b270ad6d4bb82c59955e1413d73709c44accc8b49125fc5832930f22842dd0d43d5b0e4c804ff9f978cc98406dadc8e440c5bf44930cc8454bbc6efe3315f27fc6b1b7d1cd5f429c866587d2306185182b71fb3306199ceeac1ba363320eb1c8b8caaf3eb8714d682056382d209116a964e08ed40330b47f9e052ba52e471213a586acaf66520c6d26da9e8c89866df2dd1f7486d12ff9bce4a96e4c3f5070c56865d83cb4a33d303353243af73aec32a6de1d875e59ad1e65bff6a125e3d7ddda5a8b2054f8feb3b0750b08e9fbe9da44c24ec6ab2e174122a466dd7f73de1da0f2a1031dd6a1074c5b46fbcf1237f49fd8520058a3751390d0edb927692c661c54159abe61f702b5d1826c1fefa2b97dafed2026e706a9553ff8659cf6588b6cacaf21c4ef3ef7d50d961d8d23b03a4214e3d1e3284d03a86390bf793727a93cc7077b187550d2e5666c2ca11bef5f1f16b3a4008dea130a09c3db5ca4427aae7be4ed90de708d20f4832a6a0379f451b03cec4f55f1ccffbdb5667ffa3e2b65c1f9267e5bec3fb3e41f6aedc546a55cfb8eed29fde55275693ba83dd8b2dba4752497028da0c3bd1c7c085b34668e852207f9480d080b55805b1561a0879289fa6989590379c6ce72b416dd22aed33cf9e81322d70a78167ebb93a916b8857332e4125614e10ae8e7df6cc25a87f9c5b0339dcfe7b09495d8d60f120ebeeb7551f5dc177aeb1096b4b68370b03c63db1b5c91f64ca9f615ada535f2d4b9e8512d881551be98207bbb2617216aef3d94a68027b5668dd5acfdbf0390b902cc16bc62a599bbd6b86dca3b0bf0502d51fd008d3efb3a9aeb6ee7de5d7a8f4fef86df7ae497aa23aa02361694b4ebf38e95be71185814806f7fdf3cbd28e581600c63510562732d87cf0da35954d62a68e4de47706b59f43862423849bd22097856930321682db0ddaac1924a94ba97861edb5955c7b65ba59f0c758f4c0403b1cb88445e3f0e8b3e2a13f760ced77838642182bb150c3ec118acc76868d84a888ddbe517758cfe37fa0dc5b2a1bae27174b14fb4fa83b2eafd82bf23ffecda940cd91219c944d18e28aa5471b5cd6f543708f4c03f969f9f887c3677bbafe3fec7e30a5cbaa5865c158d29cfb52d2737e30d1d19d2c43745ea6a9ac7d5cc3eda5efb821f4ce1ff44e6fc4661125cc079b55b799b0c4a8f1583b7a3c481cf496a35f2e72210beddf9356d0ffe74ac90b0b12e571d4a9d07b88a0dc8ba44f9f697abd4fbdeab1c11b78b31c9145fb70b3724054b1208469113983cf46d75c4b560b9782416bf0743ab76dd47885512915df674b70ee1f1c21d64e3ca1d7aad6bc59297ab7d5cab82bf6744ea40e5d140df6d21ac6902b5173732461c4db2fe5d99ecd6444972f12c102d53d1a1be67edb55ae9c573530d1409c9b050bec1b1d502bd13b65a6d0cd3cccfb50843464026cd49e83ae4e4015564c12e90d86ddd05d60f196010964227d1eb198f6606043ff4c4739c234070fd8f699db789a12d3901f2bce6b82ab3313617916bf9c5f2abb3d79243636f329f4d4e63ae4fab94c88b799b0a21881024bcf514400d0a17f0118c2ab7a48a2e015deb7da4a8ff113f00a5d2368ccc990ed309a69b9c9a791fe41f6a93c9988e55009ebe846d7040b92b85262fa0e0a740c42323441bc0c19e28cd79e3527adf2eb82e3f5ebcba79dae2e5bcae07e67684c36f42ff9aa1419e7cf64539b045d1f6e0d3f6c30ff74a212ed4acbd9160406c936eaae439178338cfc26ba0bf35fe5555680d6be43b72d58bc1d9cb4c64044e8102012e812671a5f9e66f5b926f7e9657ded2e45f6b54a4fbac06207ba2e79073e83293842c1852603075db3dcf4ee041aa13799a7b0990eabf21136b136af91b415748bad6d9a888c95d4224df3b6a873626dea6ce0ffe27e647534aefb3fee8b7d918224848bbf90f092b1b182dc41fe842788fb0f6b813fef4cf488d7f6d827b9637c6cbe591ba75684abb7d0e682bac1e4ef784c65fb91c4af2b0bf66973dd1a911981d2da1eec8d231ce8239d07a6fbac46300b54c4b88902d9e0f232b61589fa0db4088ebfbb082d9a49f5f87359fb73163e741c38f25657789e19a8cc918b7b6d4ea50f3ae20f49144b7e2f8f4cb838043236ac287959baf5a01e6e6ffd99f60201a789464bc5cac592a7974532b09f1e72efbe06072e1c3cba70f9b561cde68af3935b6d425f6a93d500cad6314cb64b169acf4a724c55aef28f29353f40007f9842363c4d65819e7b202e7c0dba885ef25117afc207edabfc7aeda6be68a32f49c9f71245cfeb7809cbd0a914b909a7b5df2b228a4d57a276a7497e7c314e2aee2e0e0a5b266ed1bd910b32207670b1e0899e4e9551b15f8163328f4460aa86adfb3c2772189d7dc0b55ed9cafa7627e72d30335595595a53a9b28e07688601b70202c9c32bc858aa60feafdcbc286327923aad16706336119acc9e04a0e2f6116d47ab53f27bb586371d4b3de2e42c9b7fa44222f2e96e74ac80b33da58b83ff6056359a47cb8c43a9d36aa206144433c1da6bdc9922b748a8e1ef84d9ed5fd0b012d6360780fbe35bf5437ea5cf3f2dd160fbd19d9d05227130be78c6c6125af1acbc1525ac9ef1986465381aebce76f2c9cb648609a70645ca5ce8e2749a69a531de522593491de9084ad0c0c7dca81ef6093f01d521ccb09e0d1a6f9307b84c0b7b044c9cc321b704b63051903231f4e08330aa2af6d1077335399a2df62d990bb900d61963c40d63d191d965eb81fc670b69d55bcb344356b381beb117ff73b04d8e12491bb58708f639dd43ee4f20ba99162a121f17ac0a63aa35931c218963d1a81e45321edb19a8825ac2b400ef9a9c4df6eea899a87d89d5ce4e10899ace91759a9cb0983ac3912e993a58b9bf38082c29f67df45a1201e88b0d9acd02e25730d94a19cc6667f8f212a841fcac55926e7693dba72eab7a4d29699f296394cbdcfd75c0db68f9bf11109b27ea429242f1dbe37211cc9c584b373e2c69e138e992a4f909d7747a2d316cde80866852057b837a9c786d5ac39d5200f940d3cae255703e14585ee22e924372a45c54069088a9415708bd48be392551373406ede200b9855602417842299ec8626251ac413b84e9af21e3d3287d5fb678526bc55e03638c2adc366ab4b1959c834a9009f08e61a916ce9bae1f1d0a9b1bd49710e990085228d912118bd31cade9f7eb447185d32562e3ba4ee16f6eefc5a212a84e441dace1fb9a1d255d8718a262b5c45253c10c86c0c526346083bf66cfb62fcb7149302650146a4dd3d72c2592bcdc7409319c67b855187305faed77556822b279a1de88424f9729fd04208a3ab09b5822f75be62d2d5e34453a59f3307e7eff7a2bfcfcb5a9fbeae06da20acf12cec3c96009113515744371c30ce04aa8586728fd5080a1f91f82004ab344a831feeb76f2ed1c827c0a6cccb1c4ca68755adb50c2abcf6de962e911b7f8319261c1465c435af8043266142ffca32be28c1c3852b7094b507e00087698fe7b21eab4136ad74930819ef208f74b22cb4caf0754c412d427373c381f97e017d394521559ed34bd09c312ce75dee13c105f99b1ca4a5f7920e43100639071c555fb6d1d03348a804c812584a0b141369a4a1c9b93ea758025227fd6de006b74f869faa8684121e28efa4ac9d289ff0c0f6cfb81c06dfbc8a40b5202b94a557f9bc07cd0af2c0c4b158e1c956ba94674404ca7d545c070120be1dcda576a76fd73c92233fe6fd10fc96c30640912f5f987af8df15ada502395a04afe2d577874b1bee2be7aa056fa25d9a6c16f6116f1713848c022da3020695fba0d8a016014b2599da1a6d9c592c44266c0942daff216ffce4da0b0d79fa21f5d22268355e79f1b774d0e2a3d5dcb0ec45fbd957d2735e031244c6dff9633f69ae42ca264c69ed6c5d05b2996b8a6319c460ba75183328e69d9be358b2bfd27ea30c040945162aadf523f066654d768d03d9a3d187ecb47b63544159e21b205305d36764a9972eb28e8d22c42afc7613f8da71d3d8f7fc543e3358f3fd59d5a98455b8190efd13ea7feb00c1615fb5bb87f81726388bffa6f01277f387714c11aacc38268bfb51465463120da2869af5d89b9232292525a09e2b21b2352d4d7b2e85a8cbc6dcfebc2f69082f8bf55382abbbe76288926e2ad14df92918c6df6241a9d20b043870d5bd4a916552f5dab7a16d59645c90f43ee8e3b6274ed3a3cc84b80506fc61ab0ed6d8df74210ebce1106847872f0bbc6603a499d2686b0623d9f16ec23bb0fb193e239397a6090041d2b4c8e13ca6c3109e82b1736649a635e11d7846817682fb4f22466a8f797ea4d7d59c4f0dd07295c2dc6ef28e9125724f25c9b68c33175f22b620414204325c16ce69e26047e0efa34e97878d9f947ab8850ebb260d9fd22e3c95675d045e3137f9b84614df67c8c751965ab73a98aa1cc3f64dc0ffd1cfd842be826c6b9cad8ab70dcbf1165fb14a97534501a1b46d450c2366d0539f9014356ef5f45c89518d79140eababae6aeee9142ef16ee69538b585da72a2e3b73bdebd5feb1a4e7c58e423a6071231a586f399d91d28b249081a7b5ebf18f5ace42572fd3c1cd039b25d4616914ce8a28541b469aad9421d1b168d6ed235f99f8109cddd04a09d8e704efe777e9cf0cf601b87e31166f504b45b3527750d5d557f91500bc128d145e5f756bf80e38812f4080a9d0207bf1ff5401144c9e4772b5b49eabcf968b36da4a4419759902f57135e940a24126aa974106c4a0b934ecf5e5a7c5709f0b893b77a57450fe9d15257c21954b3a558fcdffa1cee39739180b8383bee348413f1b89ac6c6b3e2d76f58c304329e77665f14068e22a7a9fce4c8786cabf475f18978fe89fd1d66af2f6e1a9007526f8be6a595efd2fbbba2fdb889fb56075f0b88d148d70db6a0c0f1baa506248d2e3a40b8f89fab5ba2219ec959bb922fa0efa94039fbe65acb906bfdba9fb893268cb39419e15ff42560c88c32fb27afb82e909f754f94ad2644630c2c5ed360d7595d0c6be78c288a55a1addc51855186cea24a05cb584917907d40f81a1f7da5c3cf4b82e05d258ea7220ab87a00b0b408c965055d4202a22c6dc5ab9abef2f1571d2986971b36201ab22c64b1a15ac1a369eae324bc7d7b0590c84460e8c99eadcee8761e938cdd15f44d3c897baa71801957f8ced000663e9b4f2fd4f4903649e44474cfbf6b279c9a2341982e692c960aa959a59f5025751e8bb51a848e673339865aacad33bf8514bed0a0be5cf4c16396f8aaf73cfc8907755078927f2e0a284820b58a75a74aa5541801d4d7e98be45cd5f1877b907e8e416a7f65d65bd34d73d7544d90a3a79e692b55079999763b05454594dc95a5842141bf05d5c057db30905c52fb64bb120c9cfb7fe822b7b83a30f82894f6cd4c3cd34e44f357c5006ebe1d610354916afb463922c3cc5346997e5ad520a1ea9226368b3e60fd200504650fdb9b15874985da4924b433cb17b12a4c20836f9755c3dc393142aea1f4fda8c75f1c58bd6446ab04bcdffeb0f05ced4799298f17a076a47a85ca9c785330cf28b149fff20c3413e4cf9078a3b10e4377f73297950ad0b2d4a625720759cd34330500ab3ec25c3f975b654813a1e6e38d03369f7efe54e10c47da153b25742e4581e918ef2e93fd34f24883292ca07281e3a932e1060fb15fbacf96ffc48d66139d05cbefc8d7301e23ffddfd8cb6766958a20d6b216ee82f68cedcb22d0b617fa439eedbf759c82b992daea6c0d6a78022edeec31ecaaec54ff026cf92b101da426e28172ab0644a9c46168e39b495a283b3a541417539336d2d074625ffb15d15c23f49760e42c6c2a6ca1c21c30f11484540c652cce5680dd4ef3ee93c53cdfbfe417b76844c275535db154412acd2a5d0abaf9b25296c2cd4279fb0ec8548efd7028a98eeb7f6a7418078cd9afe9b1fbe17d1826452a85039da738a5db48edacea6c36ae610e4b745a95aa73860517cb1274d806e1ed5625ee8d326bc39fdc2451ccc4c0cf8b0634f2cb14aecb6c0dcab90173f7beab8f8668c1e7f2a7705e06abaec7db4da5d72a2923bea5d5526c665424180baa1016760b9bad96868130169deec22d32c51231f0b66c281aaf2cb34dd59bb2eb3b51bbabe3bceae10ef355eba7ce8cbb8b56409ac6d2d4072eca2ad6657c6852d33279215e1a2ccaa4f8f634506331548e6fb3b991cee775998b0e3d3853b8619ee8980d5d50386496643c3d614e442f2091e7f3934a677d2196df1483d5191a8453f744ef5877da253b941310c683e8602f345dad4ecba7ecc4bef5767970daacee6b66ac3899652a06ae57092f088a321ae5badcca44ff396daeed9fc970e39efe94d63619ae6fa7b68e5d0f93970bd79212defd68fae5e2adfa708f854f612ddaa7a42497520f98dcc87f2cf9c170eb31b9364b913d179afd179d0597206da47685b12e786688e54561fd277eac617d834eae16134849cc32668bd40a6b4fa00396b4f2ede3411b8959b80f23409544054833ed89d452c69bf0daef89a7426f39c0d6a80972857e2d6631071c84a1839726b0a2adf70053b5b983b198df80e276a0c31bed7a18a0464b16803bcb3e8f6049051d85e00698e2129c6e054a920d5995f177bc8682822c5c6c5937091cc777bbd7c00f92d7b48186feb4aa98682cb1c1168825435e291058278b448508d83dda13ce457ca1c18435209323b583045ac8a14418d9a087997e2e3bb4fb7b359f5286bb8a82b1d09f70c487ec264578923a296b706ac07be8c69c818a61d09b4e9b2ed007d31b07b3593f18c2f3c0aad693ba0144c931886a158323202dd3e71c338de1d3e59997c38d14961126d89ed47a365555768e7c52377fb28a6eba6238916ee6426c8a0ae45f3bce1ac31c0ede2df9268f810d7f3a32476bc29cda02b956492154377dd518c6f6923f28c291e94d4b05d1a0580312304e334381531910d5ea2d43dabc25537b5eb22a035fb0a5b2a8c206dd5f6c3014876b0ae020ecc0bc5619ea3be1cefd9f8a48ac83c3aaa0d5d653f6a595a7e46e1077d66b5cbcacc0e6478ae45d52fbb789488548fd5765d2846a7192ea44ef18984bb51cc3d259e2466f233143e2fc7438dee0cec335baecb48a27cae2faf563ec916c104e4f91b1e3698243b018d488c03440c5afbb11ccfbbcde69255b1d22a5747f7381582c85bd8b1984c3e3a168bbdb006fe932608e3d1376ca91b83c3b459d6cce21a00df1e2dc0915d646d126c62ba73692410597ce7f55b5528359651341da6e2bb131fc7d47db25d6d9018f91b68ae78ac5b1679be1d7436c44b06e82c3fec5597561fcb6a6ca973721b3d53c97531cf7a9187a1e7d9ad59c5c0e6d6c0c2a385c8c128e6b5ac687a21dbc8a3f55222e42a23338b74c8e6742a41740d3ed03d9105a2154bcd2ff03765dd415d7f62488ca9ab404d725163342513a28b7bc61414f24f2161ea5d7fbd4e1044cf851e7be06204087050b091ed929f297e3300d9c9b1a814ad09d29a821bc200fa4eebdd9bcc612d3292a8f25f3238bf8d45548862cef0a9bc67b3ed66d57d863236556f8820912a2876eef4ce14f9820b15f483dd2f6ae84d1157689d595c4a8f4e50fe8f67bde96c883a18ae1db7b286c31152562ea3aeeb22174c02700113f45a8cc1735895d874a0e76efff5d34a438029d0255f688c7428cdade56551ff4ca8efcba1fb2676fe4c6e0e287410ed6d4635555cad86ae105853126f0e3d495f92cdbc3141544043ba84dabd15722e2d04eac6241b266ca85b3444267fa66610411adeaa7fd56fad0d3ceea7a298ace68403da6a1ab61d3c0685ef166a9e62b5514c6526878c658a61f698d0c1d946a5e65821c88a83d766429e9cdb047666402d3677e6fa97f73f6517117a5486c9b4af513f5518c5102d1788ebda5f633c9c25e03f8b8be4a467aa01323484b943c7d7514de897ed1f5dd50f15126770cb7391195c169e0b894a6d20434efc156bf47c960b5e6c98958d652c750544917ca267e6aa8053d59bd4ad4f67d3a43422487af7167417df5fdad4bdc4a402a578d6c312cb764058943d61f6974fd1a26bbd065945315c6e3182ce46299e98275a83c4695a7d7299b88fd83e955778f191b8effb07f2e76d3158f90f861e5b5a905ed24016b97d9e2dcbe00d0bdffb3313742617118bf9cf17984b678bddd424cfd013a7bce3e5b053d9a1c116bc5ac676f74f5eca3b90aa7978a08ad597355711da3c2f420a5f41aae5348b333edcef839bb1ae9b5094a5b6100ebc2bc545893bd349a5ddef8a5b0213d8d404d60566258c12432c91eead6a170e5db7ace243d4bd76146663ca25d2da14b354786d53141632f8a87e4d82a548114f33d22fad6e4cb01a93907be340121811311915be7d5a1881a3aa2653723958eb4b55922d911dcf326786930fbef34a94b1f733ae9a9c5c06414f4eee7a56b70a04ddff415fa822bec935c2ea80d2b77f5c2a965d419419319109ac0ab648c173e125f6267ae0c3feb1d990681f96608f0ad0d577f1545f1ec2c717af7e713e2be3a32dc90a72daa26b694cab11c6e16d5c4931e4151a3824d2234947b6bffc448b448c062f9eef4f9c66b124c3f09b5be2dccdf4801ad9f4b5f2a938f98fd80acb505e969177315b891de3f33342d2e6d70d2d4d8e731c55442402cef765f939a4390589ca78033d55155fd7c22f236b27e78314c1dc7dacd066b95bf3adc356f01c502e6d85fd1492401de4c39f6d4b8b4960caebfaa03a38d279f323640db90a7b586ed8142aef8d445bb969804ae0614d337156daab5fc8a0aa9463cc7bc3b92eadd019d9280a7cf83c07c31b198d5455468e28d240d59eaac047723fffb6a89a3954104d0070217991bfe50e90112adaebcb8d350d81b706199aa03bfa398194d560e086a251823d195c14f3b50e9fcb8477d2396589c36eed86a86ffd3f4d06eb39fe1e141ad4c224e47f597bf7d8dd98dfb96034c23b14a232c8850691bb296fa29aa84b20cfd8c2ded247e3146179d4ff6e47c92f40d221aa743aff00682b0b520512fe0f5a4be5ea2b7ffe0031503e16da0fec3fdb4236d1190586c5630bc5be27d1e88aff3d695ac0ed165908bacddac51fdc557c7a9ec6b665e2062e2d163c2498f35768f119f0b7c9bcf7f6fd6c4cf5d56cb4e172f6cedbc82512a83218e6f316396684ec917f729d11893af6423259205de94e9dce0b0b5b59c6f1e64b674ecb1e2e5c0e29a4b4b4d4fa56de2d3ba1cef81af7c1e9bd556ff6794be3e42f4d1d3888b45a75e643ef718515bb4ad2d9fcbc1fad05bd0f735a689c0e7dbd16c271f05bb1a5a9982c2cfaf7d129727f69aac68133727289017df2385fa597d83621ff76b9ad9239a91ac530374532e8140ecaa28d015f707eafaae4e81321359f210c34f44cfd2df6036d89bf14da85a7215398d8507e5c3bf7706872ec1e839e33d378b648a09f75109b2e88e870b6e4ed83585f1c97f4720547dc1f8b8133c02253f40a425dd6c568312c3bb4170c6acbfd14bfda2466106c7440cc08302949696508f440cd86a923e2e876589be4f63a3afc1a9d475fa5abdb57e8cfa518a16d2535207cf67fe2b1b04d9d3565ebb39c84085dcc97d7906088c4257a538385fa302100e1cf1f85a4c8f56395fd4f175ba64632c5ff7d28cfc10240deb3b07201e3664fe5210006ec49b280416ef6b94dd533a7407a55f26d0b053cfc5e9e694f81cae83840a80860977899f985008962aa2bcfe84787a10625002202a2027c64db909cb392e2a615258168492372ca94aa855d4dc515d391c22e0a87efe4101c226c5c9405cb7a1a479de0574814687a1c469389228d100faa00087e13c291d685a1579cfa3374e86a0d810d1baf3bb16a4b0e2405801ed0ee8350e2d0a0dd4f4778815ad526e5a3f4efbd2afe653421cdf18a1fbf79b6a0675d79751437118e0da802cddcccb6fdb7b2fff9b21156a610e5d1d14388a78a538f3b018b1fe3fd89e5984a5f5362c8bb6c02b51ff8dcc00781c2d5bf560381cd5d83ff035bd61b355446a0e4179a2f6008c8b65a33d7a20bce2a0267cc938c60d1fec6ccba2b95ed777c7bee53b722ef3ada36d8d11bb8223ba92ac2f27ae8bfe46d6e8680fabd5c48f1c8c8669cb357fa46d46474b6360ca146917405bde830da988058a1df7408ce8d28d076614c90c558ee8ccb6e351ef74e3e17c22b313c2cde8d3288a4a00799d7ac3847ba3cd229a640c0e3978da77897b336470eb3cada38e80aa93d340c74953847c9f35768af552c3c22dff1e864fb269580a60a70fab37e523b7968a374d8713a38be44510e04d15b36bc40882be0078460c739a5560e65a579d1f94048cae5a2f035af2254277ad00624bf97694780ada0a1adabdfafc28d0fe240989a09c8f8688d5d10849f7c6af783d4a5cde6025c84e0f14c20bca28833e64fa21ee6f45ff62ccf65805e6441cace68cdaa82f469b2ced24bf1432675f425d518ae3635fc3fc9196903505730ac292d4f7e9a90ae1c03cbbdd2e36a802c6cde6f7b1b27de3067c62909366d115f823b8aaad79e28ca698011234debe0ad4ddb1122b0d8bc2caed863a9c703231077f6a075b6ad5e16b12e288d4e9e21a6b30c4931de4d7ee4d0e95bc5026ad0e4f4051c1f2e34939ce75e0b5d07549d1dce81fdb667d8f047a3ce8c4a434a5d4a672a4746008c183f5ee3aaa64a1a65aa01ed35ec6d0eb889a784a9319d74e2c7ba54e16c75c48eebb59a24830bf48040fb68fe11200d77fdfaac812dcd727a6a7e659d391d80f90c280dbae307ae45b22b17cf65e435f446205fbffb4436341c31639df3dba3558abbcd6f4835ae78b57e9ce19793fb3e12121d7fc0e194b028035fdd4200e58bdafbf5545aa894ff0a245b3bb049ec11d94753f1134543f8ebe606055bf5e9ca2782731c1fd54a0f1eb6a0a433b71c49a3339dd111fe919845b1e45aafe5a0faed0d74eade58b8a65d407a2809059437fa1fbbe9eee7e2c5e7f231e45a5c8e4e55d0d410347d7e7ef4675ff99ef1a9c84cc09639eace9efbeefb74af26b60762b22b93c2a16afe11a94e9a014aeafe5cd751e4fd94ac54055b8782cd888826cc6747e6dd96b7d798d632bb4c2c5281bebb1678664ae68fc2c5ccf174646e06d75e8649b8516504507b929e212082f94b629e121618bc282d404e0009b9cbf7de405bd782abd324dacd00579bbd8c32b09a6769728f3d1c4b7cde566b692c866d52b77874b47245d82a8dc05179e5218b6389c4839ec793b94613626424302d63b8f99ca1f06f55e0508c2aa9b569b10dd7fd62e76e5a9097e83f0471cc675a2014aab6aa215f71c7388a006df59cd8e4c0b39eeca1fa24a07e093c7c4e65001f16603e5af18fd0b9b521b266929c944ec6b1bdf941537092e106bc6e850351aff0f22791a992ab030756c01a7b2f52457de1b264aec09184751466d3ba2b94e9c595d1029e29ab92b7cddcc33e2a4ec20462dbf20a3f1b371bcdc1af4b5dfcab6bf6c1c949b07d0468c6498b90e430a2260fd74f555d438d81dc598ee75413ec8e9e2535dcd6a0cd5231c770d37315289c72a91483ff0f98d2d61469ea8b097012a60673e35ab5a6feb3923d09af9cae32f2f67e2bc23b6f71b1f1223e67d3e4946c87aedff57cbeae60cb91b6bf23cfd8a89a87d8a16c3f07249343b37154d46f18b9c6b60bdb9fb4412fc6cccd1501b9c383afdfe026f82dc6fbcf02e347e185ba8fa3c1c6d0972dfda78473b13aca8249793f53c81c8fe26e2a1aae36ff91ddfcf53c7623b05c153b0ea9c14e181574aadd85f6abded44be7278bc2b0a68bcc2fd4a651ae7a1c30c29debdadb5de900d2dc29da0b6244de3dc349c0fb0654e19777fdb55873103b3e5c946f7c436bdc8a017e619a9e21e1ccc72f7eb5127f9ba7a5687b55607954dee23ee259687b6663bd0f132bd441c4bd26137e3e33d7dca975952a048562a5bb0c8190ab76d958d06deb21b4c5999fb61a0a4e51bd207bb614ca2ac2e477a94ceeabe1e4a10ed32693c8424df0be2e0cb21d39a0b033009a7228dc9ea8c276319d0c26576eae55685a568938d8b2e0813776e4f27c3330ed7ea6bdc05696896b7751d184188cce23bc81658b931129b8dea07cb5b6fe61eaff55ea0e74bad4cafab59f0e2a3bbb846af121a8115e8fd07d1a89ca79cd16c0afb187caf95f031ab52b9ae6f134df82b9a12e6a56564be32c6e2b142c55680b3ce2fbf706e2146da10da3f3bce35a76648c53a1efa57351219f85fc1aeb699642a1dda7c8299c1390f900bea96860114c6afd86581600996ec7608f2177fa482e12bace20f55afa5d287e20aabf1f1b8d0702f6052dd04e95412a50cc2933d7143f4ef82c51d1ff3a2007b6b244addc04c0e2ce1c6b1d87aeb034f564d9b2ebe7fc854b91d43985e8068aecdf9626f0c694d3c2253696f9f5e5e97a7092cc7e9b7724cf56f37fd50cb53fbc97638d1758df6260ed3b4af3257dce701aab5878919dab7fedb1f8428752b98c9fe54a638e6a8a3f4843778cd1d6a31150acf8008be4538c3bc898bdfa8366fe2ca89b6da0369a743373fe594761d26fa7c4340a62abb078ef003b677ebc47e3edd2a23f9bb01e6d2385ced5ff7cc8eace89753f46194990f2fd67ed9264b9b47d6a55d9d1410a7c545e2d8b71bc603c518f651fc4d9b0841ae121b8c2e2d524502ca871a580b390590cace7e960a6c6c9f4ba40b6cc4095dcdc0f3669acc434d29203fd7f41785aeeade4c54b47f8d6b3a8823c474acba1822dee9b05fd066906b9a658bfa4e2a622a44ccc4b8a89717ebd7ba051a21a28f030fca8c5cd3a3f63e19d64d5d5ff4ea6dcd292b86147e82484ebc4797ec0b2e3713dceed49426e26acd69c1e1fd8774117084362fe62a2cd8fdc75968cd8925076a8492f60dd0742297bbf9681f226ba2c8646eb6990fd2b0359ce7430b44d29d1929199d9f7833d074810122a4707cf7c91190dbd09138404426e885bebcf45afc9ca60a26d40b3a153744dc481e2377f781b488f4f1d531a6cf697173542f665a8ad2de11aed010cfb525151107a439aef1390dfaf40202d1171682063058b8bb5c9e85f64a785e071ae1cf42092f60e54f671bfe8af0954ce571966933bbc32fc87cc56de6ff0b6c70c39f7af0f9ac2a52bcdd4470c779d72528dabc4a4c2bc7fcb946ba425939fa29953b5005952ba55097c180a847cedc14a53a25db41cbacda1c0fe1e0d70a4f7e04d588763a767303d3be04fafae1fe9eeb3f99ab1daebb77fe93bdda8b7b7be73bd95b7f3857eecd80c6ddcd041feb43e41e2bf2ca6b0862771e5d4ef86364182f1efddaba9186796a14ff66785f14dfbbe9488393eb8e629a1076ab7356365c684198509e2d691cb7944cc0c8fb97ffc9d48d37244ba31da496c4766010dcfec41a70d22d6bfdd7e09c5bf892ff8a14a10db4335c594d64f9dd72bfd030a45fe9e84167e4f333a79092fc23102836f8c5ddac793e49aa51ec91d20593af8835a97fda454c08b380dcc926930f00b2fb956ea57a1aa12b7633eab8bcb0c93d45093866ec055c3e3ed2c4e58b0f720f565d16603b7c259841f22561669b2922cb93449a22f4881112ee0ce3bed9d70bbec54597bac149f4fe05c50a816042a48eb0abba8a2aa5e21ea6d3f8fa83ac88d12c367b87c275b9aad2d742012306078719694f3b790ac6552e2d6fcf6232b71fe382dd5a0d122989fe15c21dc8e60be137549e73396ec5c44c76698dfa4a8bc9ed5d2924f2bdd2371a76a9c8b4d5947a29c4a0e8064fa5c58390a9c394ef2f0430bd0de6a1d74211f87be9745ad41f12a253b49553869901332b021822d79100bd2568147f9bfadcaa4330dff77bf49c44aacbcc86f4a61780249eeb553a5584e3d2421f2ded016731b92bc1b2b8466b1dc59db4dede0103fa8facfbd7388aff1040209661998d5da19bfe7a78afe55ef4090f07ff147e8943e97d8e6b2d6becb718457fa5a15f9b8e7d81e03fd64c56a6709b743dfb7400d7ec0280e3a4202f01815c58f6551269cf7c1620b2d96210d3cd9b03332a8b17f59b64ce3bc9e29bff52441e912dc053adec5a3c9665eb2606da20446b1af700656e376b59e39aa9cefc98ede342dd2174ead0f63b80961110690f1053185e241697ccdedb45f925696e76e7416f6be4dd189afd1da722e83d9388bd68e6041c5d046a702fac5a305a59493ad530bd479c9141af9bb41d18dc69c9f41ec0fcd49b63124a5e86e0dc42aa3a9ca80f7e410e8349326e4709800500de3616252b36849983b884b13d6b66ec418ae8eca5c3ae6c626b5b238d104208d964efbde5de01eb0a640a810adb3f6abdbb406aadf54814c9152351dafe4d79bbc30da7eba4c44894a4c44a2c70dd08865dd7b1ec462eec46ae7337926937c265df2c0d635d37f16ccf62d8514a35183829019324b92f9f95e4ad4684cecac36b52745fcc1f8ccc3564280f8390187e4572344226e9dce67396b52663dfd2eb636a30467c5f4d8aee8391e733fbb63c62fc49a2e2a5fc759956cc13e9d4173391f6a235d18a24f6c01a31c33e41107dfb4cde8fd6bba36fb196a5b5f5d22c2d8615467b124f0c352d4255346508e30e8f54c19bd823f117238eabf660aacbbe3deeb4b7e211817c7abc59af5c48ccf5f2d6673d6e96b89920b5e95096beb8d3ad046b1ea9c2701c9232f3d6761d0a357439ff722131d30e253f5bfeb9c8ddcdf751b70a9df515bf8eba153077f97cf774ca07cc290bd4e73314ea2e87b95fcca8a35030c35cd4e1b603f5b2e2a2ee90985f70e4696f267991298e485c2ecb10acd17922d96c2ab56499dd74bfae14913e17d9e20912f3cafda650ce9e493074d64d3bfd7864352f71dc69afefe9a7db74bc271c57a6cbbd993099b413745ff3c49d4ec14ed22ac8f3950b5df3441b31be6bbae1749846d7315e565185121f7d21515e1ff5f15989bed66a29e5b6abf574731ec6a1f8a455d827343a2a32fa62518492e7af66826eb637af95a09b7005a14cf2224725d86d9ac2a07bf646d2a9af5f3fadcfb708600dd98fb3beefd723c61e12a34f7bf3f59e204f251a92566918b68cecc7b9ea54cc387145bb62bc197661131c315fd8c218f3fb01abe4b65b107d09e48b56d541677d00f1213114eadb9f2d545a2216892d56b53e2b7555e87cd00b39eae67c8435aec379c11e96fd6e9dde2131c72a596976eaeb7f568bb447f787c42c0f613c22c738446623e22190f8af48a68f97e24ff6984814f9fa0da32970841ec4c4cf495970f864b2bcaaafc85272b22451f2127f3f6a6c64414769e461c19f8bfc3dafe093edf0e7027fa82c6572e491d6c620898231e4b7224b06e4c9023d9411a5dbb1fce0aed61db15dab09d1eeb4334289e18f489ed3aa9131d6d4e48967b4a6983b7367eec418639c704e6b9dce39597432fc63d15f8fb730a492d2d36d07c5134f4bb71d33d3dbc879e17c47f1fcac814c924932a965133a1b6f238fa494401148022520c2981c0f8f98d9a2b7d7deba6571a494794a588178274eac5c5082b99382390f33db044818011246308fd45a6156279cd3ba56670b07f98a314ba759f86fdec2f0474d86ef2bd618a43a785dd785bfabeff7cb5e57a570dad84c6459f6c9a40c8b3ad84594d618a35514fbf0874c8233004a8290929d4f0b9320a4039e4cd3291dec34ea9e076366869c9f8f4ebc223c23185242117e5c1084234cc9ddedb5e7c1780b547753a027f7595039a0c009e2bc2d5051749f07a3bb4ec12828c09363a529c8320863fc411ac172224b82b5428115a48c534a29a59452ca39a5ec18fb05dd039851d0e451f743cbf0303221e7843a86e4f8b6e161b9561b6d64afafb7600dee55081d578ecb421915cb6e8532eab3aad1ed87064476bf07e4f84120c74f891e9d3f257674ce7226616c8ec314c6a838e886278c5121f46a3e7efc8f213a84b8aaad5573809623ee7f4a486545410663203c6cef96055a57c77af491aad2e321f7128e3bf208a9e270f4917107a76caa8b3bedc523ed25a18bab1da4a0e8139f884c3e9a2176644d7ca265a20f09ea7527a451adc59146c551a7bd18590065e263b0b2418e910739461f18234ad1c51c9d4e511b14cd73f4b1a8e843145da09291890cf190c9a394e19c184829c30f56913ff9a6d1832c5625d621fc9c364a08e184f7474cee0e35afbce8c492741f24f28e40f2a8c494ec5c521c3fe0c158e0bdc002f9ebe6b4966ac1239a74d204fc88c90d330f6f866899792d07dde7d1785265a14c7c9453c64318235e26c6683f48248454794d44e45589ade894b645168425d02b5096419d4ae2659a95e492f668d6bdf4882455d6e96312ac613a7d1403ac713a7da422a6a40f97e13805c6a09c76ba710a1883c62318836a8fd687b8b0760b17b919e252463b676f7d08bb7222f62b78088c88cd6ecdd9e94631489f4845a6a7b10c99d27cba89499ae665da6119d41e7d094b2009a4498131e8733cdaf051388a64ad81827004530079eb08e85ff6d86d9ae336ecc2d4c7a31b7b616a128c410f6f2ca4cd7242e7c114c01efb4f3d1179fb8a87c04ea48f3da38de4ca2430063d76e351ef48197a8b949ba79bc15e7bf45f0c4137fbf45248daa08e33c3387177e9a94afea3d8c2beec2215997c4c7bcf5ade93d87bc3dbf4ecdc0d2483cf741632184345f7d948d4c10cd1878798087cbfc8cde7e568638c37ddd440f7cdcccc18750f0e63208f98678b0ba18c3ec4e90a8c212929a9870efea00c50727c172f9dd851c59bf8b1fcf04496d70511842039a2233cc859140215595e68849cf59327595e1b39939a1415c8f2ba90620559de1ba420caf2da200518b2fc4096f72567f6892c2f0032141ac211b2bc3ae40cc33821221cc9f2deaaa20c3939be48c7ce4006afa3f3011f73f207df38608250058472cc894ce4a86a9c3a5fef109d73330f8144a44c25fe96c8b208024a37b0c6570fb303cb1503294125e499fc158137e6e4796f74f1710372205d9618124108c258f2f143c8c75b8fd6fa89088c85830c11df95b803e9301122dd4d8f2f7223f1cf8780a8051a0421e746023008b021850c765045154a722c5ec25ebe485ec1f8c7ea6426d0d94899bebc4248991929d3efee2d14c2b148caf4b1043a7873dd16b9b1b7c88d76ec62b7ae5d1e325b39f6172642a48820068037400c006fae1c0b91ae9eb8da78b09e2fae3a66cb5a784804d2597bbcb1b72043c463980811ec188e4052a61f0d006f74e275228e41dc053a7813e18d76e3506e9c98e30ddc70600e8a445df1178f72ce94dcf88b463730a66b11b9848cd57a12713e5496a759e27f2c313d022a51a8185131a25244a588896e6646fe1e53750a16308217b2511b610423e87eb7c281ee4a5b4e21a9b5ca26b6188288044480065418c212a028bab0032c6ce08ff160bc891ec4c07bccaf4b60ce39dfe589caf007554451c5922be40360c10716f802188aaa5809d9501944679c19d200e441131a44c96da3e386d00d1b9bebc6cc142c28755f1603dd581574d8dc106208218890dddd9fa1992205a96ad341a6e840e6327432854efe662c2e187514415841a7914d5f51fc809e688896d45a629296d01095035478810bbe2005289e504110a6c8fd2e8a2515685a93b6d10d1d4aae293483a66557ea0466f54c774bc9011944c8dd5d69d790bb85701285064ab38d74ac4af1028ab03142c8680a52701285ce4a0d8e32349ab204275460a80888a8c50a194ec1888f0c9890842453468099900110b8c0046180b2a40ab97f6f86c62608390a15720d13304085109c90c00b7ec02225a7a8780119aad8d9c0159e7411b250eef21432a4828a27305006163491e4480ad946100ba224810a1764a1095a84c2092db0000aaba3a12814d180514e0cbc6044258a126eda68c6052df740090a2d1843128640852a3c00857ba073f0840cc1700111e0c00665a0022905f302dd9565d02ab28a800004206449b0d8ad1359122684766aa818bb5bfe9072f240e068f2e8603e89261de56eda160ababed424133979b29c3c9387c64b0aad787a7c80828472767a7c80828486888e90927276563c40414243444546393b2b9e1e1fa423a322221ad8c919b9a28956918f8f8f8f8f8fcf119d44d1486f86a6c887a66bfb345090d010110f0f0f0f0f0f8f8f8f8f8f8f8fcf1110a97b7c243d42e2e1e1e1e1e1e189463e3e3e3e3e3e3e473c3e30486888a8281af1f0f0f0f0f0f0442323a36814813a3086f5273af9b6dea28bb1b08f0e68457f2e40a2c87620d7b18fd2bdf6e0f6afaff5171717179717ec177e0543076f9f95bad459e9d6fb7eb39fdd4676495b617996a1def2f2cae230875971d357cee2190c110980b91fcd302db010f9e5c2acc03c6232cb5950f82b02945f7c00b9feb9bcbcbcbcbc1c8922f90523c1bd3184dee78281f437bfd25d2e5f5c6ef692f6960b2456f1f6e457bc0ce37bc1e11f5647024ce40d0f5991b16bd8af3b8158c5cd0f9422cb13216564bc9958082923a5544915a5d048075146e08dcc53293167a47b59a28bb4c46270599fd9ec7aebaf6b3fb15ff55d71c453db29cbfaf5f8eb1a75dd1119e5da45a9fdc32750080e5579593367303eb92125a51bcab2d26a4b4ad9a65ba673f61b936cdfcf56c0b4514da3624fb51aa8e68b49d8d68245f37e7199118b162bae5d4c5ef8b591e96ba319f96ba3af8da0900d8c7f312d54b18765064dfe6252bdcbac8f3db5a55c3d1637e6f0d7532cee93e3500752caa86334f96ba313fe249215f8933d2dd8843f5477b865bbe9dff60e85dad182bff8b2f5301dc56970eba1bdbfdd98b3161a7663b6a8d2ad5b6f98eb2db66ee9baf09117952c9fb8ac92ebab64d22dc9f54dc8236d147bdaa8a7a70aea18b6385291db48cad4db884951467d774b7662b930b7944e75ae32484a20e92349f04911d8ae679262955ccfc248d6c7a4d8d9985d6274fc582d298a557a9af4d1112028326922296d38166aeb617a764dabe176462266db92a4695416700a5138b15ce648d95997d7a06d55daabef1b93ac9f4e4ad28a92886a7df275935c997cbd24d7fafe81362094517a7dacd2aa235aa6be96fe350cba733fe1253912541347905a27d71f715dda7747b27848cc17fede7fa1a5bae64cdc0bcdbaa85fdcb12b73c5a45c910140c3aeccb05328ce64a77551df50e7509b95d19a43fd43b5bc6fe516b7ada53116d7746dd0525dbd0ddb8e1759487bda57acc3cc06cd5e96eceafc9c565a50d6212af334ed62df2ebca19c65af3e2ae6dac393d432d576a85bde2757dced3feb574c5ac1e18f436d3deca5d546edd5df85be1475a5bf8482ee6ba34d1e4829cb636f299d9a5522c955f6c824b91ed6afc09fb5dd0bfe50285a7bbc9e181d3f564b8a62959e267d7404088a4c9a48608dced85da6509617c2182d729337fd93ef1e6466966d87c44362def0c7c968afaf2ca739e7edb5edb53c26a17012b66efa67bdfbcab6c3c24362b6b19c724635d8aa366a99fa4f3362416ad14931397007e6cf7e35500836d194d0b5dcf44e6e31c9ccd77a62bd56848e5ebec6a45c2394b15edf46b046bf7ec50a138497f5861932731f482937b62d6dc56d87cbbb7497c32d87cbfb25aef4928b7621c762a2a9814228273530ca3764e8a4064bb2dc72b4bcc4b9bcdf2ed8470bb61112b32946e90a01c1846fccb0198244f47ddba8532dafb7366be51467e2703bdde9d96e395caedd6e39b4bffc05b56ddc3b6c3b9052def0af6f5b0fd3393c246614fefa2dd7b61ef61b1e123386bf86e1a1f9b02e24fa68c147b4572fa42186547a773f28865c4b58487b75c6768fe8570ec3aed1d3b696d2de9499d694d7570d4ae7a37f3dc8acc7b61d8d8744ecc63c25953c96643ad761cc4daaebc71bfb06c69cc8048c79c268812ca308a20f941c75dacb494207f13793a1511152d5c9cc985ab4374fffe5c839257004c6b486826ec3c214d006ac21df8749fdf5d19194b2251b6948e8be3eea2bc01a43ba3e8a36ac25b96990fb1a944efefa277730f9ebd6d623bbdc786497bf8d05d85ec8dd636889348806d1a00bbb39628e3da5bdeea32374f4dffca6516e8add2042ba7c3d3b0b0d26650d7ff3bad99261c5b0366c61cf2c2b3b76693550c8baacb7f5b63eeddb62cd08dd278f8eb244e2423eea94858fe41489046bf0b0f0bc85ed9154c5ae7545ed91d906344dab52a56115fb0405c514598323b90f5996c8b252aab3b304dba3919266c70b293218237f39238332ba5961a5dd75b9877ace4308e7fdc192219cd30a2c4e6262621ad546481923a40ad5751ef4a4ca7a5f875459b8011717acc5ddb3d21e544a20b0b0b058452cc088228a3211213409286201d902da8b2cb9d67afb1a518412ed452275eb5b9a7517d03291feba119cb5b23d85368e8832e22df68325736f9c715a141dc71d116d100165c4c3228844a46562dd70b69206815c6d0eac214466fbed2a21d459223c3a379e3046bf724258f6abff0181ac9dbb1f912acc40044ff20f2255988108a4c8558913e9546fdd42a43644e68a87c09aad4166616c2ec3538821302cc49cb9c2bc007b1696ae9bb2958032f1300906f9f39256b14895d718724411e5c485cf68a066a0e7c6fec63a7cd7a7b9c2348ef97ad7c4eb5aa841963ba1d75e7f4232ad95d28e81991358d4540e814a4aa59c924a6a5139e7948f57524ae59453ce5b4a25a5525229a59c544a2a4f29a5945239a93c9592522aa9a4925229b7532aa594f2544eee36d2e4434a49299594524a29a5944a29a59452527a29a5a4537eca39e7f419c2a6e386d3c247d64003d9909a7dc0f6a20721aa059c7047a61516a1e11272e3ce61f31bb1bbfb49ad2e6acc076023aa45bca117f69c2d82ab021a138c04180964900cd270208334261a0e30125887315f5cc125abdc5aaa33dd6e424c00a22ebb9dd23b2cc1d0c59d4e751677b27f3127f3ba1332730b8ed2ad8fd2b9f7a34edc91f70825be997d641732b3e5d1f2d2336b4da71b4ecb2db62fddd81db6f765371d06013002d6e14b2da89b2e4c867a79b6693a7127678a51cc8f221610e14d29cbde75ddcca56757c8cc269696c9be5d9cec59c6e1af48e64c5dd7f2cef4ec99293399745c4e81dfb8e09feed9d4e4666ae9ce52c23ebaaf7046baee2c9888672cb80a74dd612e1deb3a3c7102da3b5d22ba8f482ebd4b5997611a5dd66558c8cc1d86e1c10d99b98439bcd500bb12ed5d21ed7586617b611ded5d1b237437f5e688224a8f89b5b8a2535bb5ecee6e0be7ecd831c8225195b485c434a3f72d6e75a3a09094d182bacf5a946dd40caa51728ad5110d8a23abd5cece0e4f134df0f0ac562b272bd071b2821d272bd871b2821c272bc841d27dd6ae64162855f6fa0f5994e94594bda1dc14de9073438e4c951b72ba9b0e69abb9238d84904505e81b5954042debe8e80809e99b3b7665fbc61e755fcc0a6e06e81b59246524feda481a211569a0b38ca4aa6f3a069d2c92aabe696d25bd90d1cfae53aded684798e4e49e2942cab490ac448ef8a3b73f5851c9b04a863fd0001572563def06dd47e319a1dbbe1101632b62d31eb57b7d3bd2de8eba6575c6e40c22411a9aa67100cacb34f65aab68a095dda0ebcb0d749246fb818a38b5733a27f74eee883b47cb394248cb340cba7eb7cc913a1676d560a73823dd8623a5ecc71ab37f92dbb278711cb74569dd88b596751b6fc4b2aeddc8853bed7a56b16b4e1a332db043af7577778f20839d5af51b7fa56d76afaa55bb696b20ca9875f69128a35fe59c5dfb19daeeee19e567cbd8dd3d538d4f9dfcd0fa084f63d89ed4a20c296307b2ab0bdd373323678cdd506809198cc926a4d4aa47024659a1ad19066f6538ef0c6d4981504a294682d3662d954a1c9cf646aecbda5f46acfd76235876231b76ad6658bda2b4515a185e56fcd392ca0a65476ae7169f4569b1a08f39cad37b29a35503426286e111934d379d7bf411ea7c2eac6ab7de5b262553fcc5e4fa202953bbae2bbb321be86419193a095a922d6fe61eeadd4d93a1666d06618d1a6fe65e47c4ebd550d0c5a2a121a2a066d244f2409909248d6af2278d8e52a51a4f8802b421a34419b0c6f5e9721609219440526688e5c29b282d24254a9ef4b5dedaf1226bedcd967f3546d6761d0af57b7d64d4534c1a1145d2481a5dd2629e3e3aeaa33eea29d6a26c0b3aa5bd2979787a49ee994f744f923ce7e4993d924acb2a79ce39af41a1cba87ccd853c7b8abd7dd41e115266dedaae43a1a0cdd022a19b4fe4f993e7678e3757794e3a2fc30053a79a4f8e01f2e0d244b20a79b69428a3f479c9236d87faac67faf54b8b7d24552de4c915405d9eb33b519e6b0245e4e4e4e448550b4d18bbe75b4ab42187a28c792979be7ba654596984f10bfeaccdd85d69697976eb5dee76c933146d3492a22339948b8e52dd3cb6ed78911390ea662ddd5efaeeda67f77464e76c99d57a4a6f6f554a2d2ccba8454f3125dbebd58cd045530dee735e4a2126c95680aab823a70053d6674c1265ccc79e2a78c2b0da020df4ea5b6ecdbd0189805e3dcb4d0094a9efee02a057bf7295805e7d2c922a237440997aa422580f331c03bd2a537fba28e8556f0749b411a18cfa59e74eb5900461bd5ab5522cab81421583360d73ee22113376d385b1b74079499e4168b64fc41ff8e43f40e5204f1ae46974a51418435201cacca9030032fc0b79ca2c04d10ee488ccfd33fdf4ec24a7184929724a9ef6d4890d9ac838ec967209bb5cd20605bb1a1076337904bbd81176af26d8b5dd835dab0a766b117669092b613f30ad96f23591c018d6b34cbb5c1297b5bb41d9b27635202d6b379347b2ac5dec08cbdabd9a5c59bbb67bac2a56d66e2da24bb43be30ac6b0b42b33fca143625b8ece188e8131acd7982b0bcec8e9a7dbce3299369caebb343afb92e9f32c4ab75b0efb937d7d694aa9c664b8ed30dd84617674367d0803be22a61cb6bedede4f1a0589c93526679876bab03d13fea4119646edcd4fd1d55ff3d2a853522ace2ecd669b7661c670dba6a94101451b1b943163c63a5fdbf501c90e7b7a6be3614fede9e516843d0612731df22151240b7929d36717ce6a6ffdba1fcd8c206891b5ee07a390e76902e28e5425a1911b0aea49d744b5823cfbdaa473a2b4b9c434921745c04e066328a514834de8bf1676d3604e7527d829693229b92650aa226e385aee722313d3c53175d2647a69b98b75cb9275daf6acd3b20b4d379e4e2b5aa9fb89842d39999d3ed278ce64ea366d335d985d70441f214e896a5f306cef45096a93e44e5cc91064faac25332135099276d336994ddbe396a365961297debd246fba319b6ec42ecc5c5c5eb45487facbb6e345de9eeab26bd66428cd7471e42d144a9aceddc82447f4893e526584943913af09cdf5af064318438b1283da06d074c52058833b3d842bb2112d9767c1b03d164c6f6332fd059b6ef107894c77c1a697f007a190e94bdc853086c9c2a56777b933735b0feba697201a145d6e64226423a4ea9e4031e966d1b04b9fd1745b9094b139b97732a5d1885e4fe8fa4a344ff7276c2fe966d2f4d3a809fbf5182376a1e9c61533f7385daec871facab36832994ca6b7fc6432ad60181e2b7efa09af68b9a89d161cdcade9c6ec723b5bfad34e5a6b71acb8e9f266a67b32e1d3238b8bcb8b757171f9cab5ad87f5173c246616fc99ce3ddb7ab4dc057f26181e2e2d7741bde5c69d1626504494e8e181493073d1bec8f2625f725939b6f5b06ef190985ff027cffdda7ab0acb06c395ab00feef63eba0b8999e52bf774961b87daa3dfbe72bfc8834cb793f6c8a43bca2816d1a09611be506e4a994fc3ae9098ad46cab08696f1820cc67cb527d3ebf2c29a64b40748cc36474867594bcd5e487ba8b456761d9d1aa414053dd1469fd229996621d3fa8f0acd0be4086eeb715d7edb785c9775597b9a02a8b25086deba20533a033843a6700a49c953a5b43d878e9a08b547af39a193939ef634add2a95b1464e6249a512559d6483d9976126d3164243a1ba953f04da55349b006eda1f4b2f89b11cab015c32e5b6b0f5784266a902497b48ec141a65d42173f4824849c912814acd13fa87043aeffacfa8f7637947125f4ecad545950c6bedeb3af3567fbafb35e8e5743411761e4fa6efc459f2449e8726a8d811e0c98b2deb9df979675f8eea120803cfad6936cbdf2e8db1244c9f6b569d346cdcc7417644a3ca33d0ad4019901f2199dea7b4599de227440b832a587f0d321d319aac1544cf529b47a5899d520ac01b396a3b501512477631f9547df9e6e3beaede506244e1ff24262eec32932d82920f3b13f3ff1905824461b40d9fae9afa689ba85369695ee64492129d372d26ad90bcbb48d2b75a6d30a4b8bcb0b6a050b981633d0a0b9b85aaadbf1225f255f395d8d4a7b2dc73e3ad6aded88cf507c82e118310bd359309cddad673568f2cecc72352a485a958de7e296abe97430bb684841663e9d4ea7979f4ea7d3c9c54fa7d3e97409e5743a9d2e4fa7d3e9743a9d4e27d44fa7d3e9743a9d4e27eca7d3e974ea9f4ea7d3e9fae9743a9d4ea7d329fe54fae9743a9d4ea7d3a9e527fad3e9743a9d4ea7eea793fce92f369cd369458b171a60565cd030430b9815a713b7c274326d2c9056bc984e5d135e4eb3847a319d2687d595b55d1892e934abd6843e65d769d6c69a10bb8b962c52b56d6313ba993f69d462ad6da9402b5843b28e561d573baf484b2d983b9d4e996efdeb76b275246b5c97acb35877b9d6b3184d5e99592e9c3dad9272fac809246750de3e9174aaf4edb24aaba6d5e98ee46f369137986f9745ad9ad668bb84d229ecdbe592564dcb241335217a92b7cbed72d5aa6979baedf248a7a6b48ad2a642bb0a953a797b1f75eafaf61e6a15b5445d51dede4d3a55bfbd93b48ada27ba4dfbf6ce6915b5ddf6b83d466955b552ba29796bf9f618d4aa0a2465acdb6eab1649267a226f8fdbe3aa53dc513bdb8f6855454901a255d6ea878e4e0561390a8866a637af5516504ca782dce5dbe7761b369c6daea42a5b4919dbadb2f509348126d09c44528561139bd89c48528561139bd844ca16d00a6805b4ca16666dd7adac5322a9ba90a48c756bbbceba88a48c756bbb0e295b1710d00a6805b4cad62b90545d2b2963ddda1510109154592424222422cb12115524a28ab4922a0b04b4025a01adb26557965d0165eba5ab51214242a12ccb7a29c164ab120bbc02856d0d5cfea4d1dd4a78b348db86842195ae3689b655b6888888b2f5671710aab4597781556c5527b6dab0d5c456d93a0d9786542bd28694adcf60235125baac16200de90282a9f99346d70a5fab6b75adb275164ce868fea49145b2d622712c4a39b2b493ad520ed124aa444d745770545ac6e2aa640b85c2524a7bd63f4ba53d8bbb9d2dd0b440d50235104b86b28eecca7ae6727a69d19e7596f6ac77ed59dc2d0e7f9a4b67960b7326addb0e73978b22b14665486a48db0a8572d970c4ac212da1abc790302a9dd230a46c3d5b496bbb2e5bb551a73e8ee8eba674cababc9da5944e458e8883d229edd6b9289de26eb1642fb496db67b91c94f6acafdc8e8b92ad4ba12e09c52175d6336fc339611a37d24d07bc9e01409b9deadbdd52768d00a09cecacf8a43deb25eb8de258b64ecb220d3af90e32ad0b07995943cad6bf6cd539bb418b5b0301d690982b028c411437af3143071fdea226953acd0c55cd002e8d19335ae850e35c10cee339263808e5d084c6108e27344433a0d828ca11a5c648256587a34e7d3abe634aa73e1e9e913af5ddb80d15183076dc88448f725c6c07c78d3e38d7081b9bdfb8f11cc303ce7780a1aa89b10163c68cd3c4d0b0f11c6a8ec30edf9282a892c3e3b91c1c1ecfe9f0f0786e873ba2e3f1dc8ac6e3b926763c9ee3e190fcf078ae87e6f15c121e8fe77c3af5b1704f74eacbc10175eac3f1fc786e49a7be16d188165d493cf9c2f6f271e03810392e6c2fc779d0d0fc871d2d685cd81e8debb83c5cd81e0fc7e1c2f670780e17b697c3b7a04e7d3a1ebf31e9d4b7e3f19b50a7be1f1ebf35e9d4c7e3f1db50a7be3e108fdf9e74eadb1ec4e337a24e7da513e0f11b941e8fdf8a3af5716779fc16c5e5f19b51a73e19473d7e93d2a96fe62b1e3f25d7593c7e9bd2a90fe6423c7e43ead4a7c4be008fdfa874eaa350a2bc00370a712394f6e2612e7d7223517bf12bee45e55e48edc5bbdc6b4a7bf12cf7ea716313edc513e0067181b891c70f77c705a2bd781d57477b3cf0806122f3e62465b4a31e4f8f3ae5f2789a24619e037f2c38f08762711cfcc5dcc09fe703fe66e48f0e79bfc11fcdcc2d45692f5ec62d09e096a0dc12d12d3d692fbe744b43a526ed091149558c47188f2f8ff19d23552b0fc033fe5037dc067fde7bc01fcd7524550078fc852455363cbe783cb62355353c1ee3912afc98d3e00fa5c29f97ba8ea4ea8f8f2ba972f148c3e3a38f8c4134f00cbc3300bc43a37abc109d4a9dc68cc71bd1a999fe009e03fe5872380ef843e1701ef0d742c677c05f4c0dfe3c1bf88351037f334ad7017f342df057933f38945be0af486e7199abf3a3438cabf39303c6d5f9b9f172757e7c08c0d5f9b169b93a3f3ddc70757e6a566e8dff77711bb0cecf07c4f783e5a1b9d80104fe82380f9c44f703fe78b8f821c70e1d2e560800001c9c84b5810036f4b0810610367436dc00c2050d020471205cf0f80f3809eb0288d469b8a0d1037f34f047e30470818db8b8ce4f10f85362c38100000f1bfe831118d7f949e14f898ba768b8388defc0dfa1e3398e639f83e6aaef3836722500780e1c00fc468cebfcd0e04fc94fa3fa55a78186cf40430cd6f9f9747c386c0e6d061c1df8dbf11c38890e07fe72cc80c3079c1b33acfcf022c7e4dbc4d8c4f0384e0c0e3a62ba181b1d160e3fecb88e19721c074ec2cea02387e330030e3cf08703fe70f80f4666b8cecf0efc2989b98e1739628ee305361280ebfce4803f25333c071cf087c371300d3837ee030dd9d2e0c30c1a0680bf011c87066c8406252fee437e719b97ebfcccc09f121a3e6300d9b14c629d9fefc677637dd0b07c037f38f70127d1dde0cf07eca6876c8393b05670d4b083dce135b20687ccf12c39d9c99a1b160e9cdfc07cf80d4ec2623704700ecb813f0e7fdc7160d808769d1f1cfc2991bf51c34d0dd8c80dd7f91100fe94601700873fee1967d9e63d643bd8ac8799df64329e71125a369229a9e13dec50c36b5aaef333833f25d96764e0ef327edd5e9d9f24aceb629d9fcfe6e3c1f6a0ed50739d1f1bfce5f78093e878c05f0f96071b3538096be506639d9fafe635ee57e33a5c1d6eae0fdfe17636b7bb3ad858dd4dbe8dede13ce024acce8f0d0fa577d607fc75f8eb7e63c45ee727e34fc9bd0deee19e078c8dc85ce7a7843f25f6a50e7fdd77c0495859090f3bd4d8ace4aa711d701256e7c7860ed7f9e1e1dabe034e42cb46aeebfcd4e04f09be8d951af83ae024ba8c8dac5ce7a7f1a7e47ae38f4695a231630039e0302343005c8c7b3a8ceb3d00d7fb0dd7bbccf570e9e8e2db70ef5f5cfc987b5fc3c5b844742f2e154999f8dfeb2eae3d0df7fa0c172e09498b4b2d2e96bb5b97c04410a8e4d2b584b0c30419e4ed4a113031a485dcb76280074854c8302f67d1f2152b475d252f9848bc39dde52a69c144fae67496ab6405139137275c32923250287729a8bdc8fdb3ce95f057244e9cd276bfc7d9566a703b6c204a64ab08102b5bdc661db6e854e3219dfbdbe3cf6da5a04e41a11cb3978e6c2c11e5f852518e25a31c3b27c39c5dec0e75eaf3f2934e5daa361b4099781e0021c7e879341995b7a0d322a9da82a0cc905445222813bf05a186be2d6823ba5bd0dd849a74df1694630a6b9de6a4fb2c4bcc12a6227489b8c42cd24bc822bdf11843a651e9e2a1058548f3021114284f9e3c9162488a27523c91a289144db2528b0c6ab95492415dd319326946945008deda0a70bd458e98b5c65a64c9a6ccb22ceb084bdc5724a3268a762c1a8e9db26db4d0e23e2079ca39e79c3d679c736e5ce591c2277f76480a9e203ae8e44952feec378f72dff6fb494c57a9d127734836e96c716492710c6aaf9ebeddbafde677baada7f13ad74955d75d6234d9c65b78db59df6289b3ecf3f1dcd53237f13753ba9c91ce84bf2d961eb71c3ee267e6b00feef1d831fccde4aa61219d4f5848e78be69a611fd7391e1c8e50441916c6423ac3ec17f611238e50600ba1766b8cb3bd587dc463cfa446a4beb6a9d622f1747b7b3ab5a71e59b6384291d95b2d14d546da5b7fbaa6af488587710914f5945a8ae18d50c88c6a75a6fb37235b28525de971136202d0badcadadf59af032be654af8ba8dccaecbdd78630eec1977adc79bdd464eaba12e89d85b4c2114514695b9de39b3cd12d2146d0a6d8a76a44da161419b42bb8276854c9be2a8bb25ec76c2c88ac2064156cf483333c3aa9665d11612ea1b36332d6c8651dc608aa10cc67c7605a38dae40863572c06c1d7ece9861e5752b7de2135dbc303be8e323e640a70008a118b2b439870f7a98a794534e293fd05dd84a2963fe66ae197e56cb900818431e53411771645267dacb7625a9e4c027074fe4e0891c24c9419276a2834fb28cebda600d84d72256af536ccb713adda9f5514aa7aed30bcff66caaeadcb3cc5a9605572ccbdaa3fc6dd60a4bbc40b4617dbb5a58f0d7597b0bfe7ab3accdcaa856f1568408a604f645e08b48dbf5a17d895cef27f3f5b96df44064feecd663fb85d5aa7d2a1bac61ff7e68b562d887bdf68a2f6a7fe54ddb7ee1ba959e55fcedb8ea61dc8936ea375ca5506cdb72b068d758b0cea525c35cb278245396533761adb5d6c69d28e37add60a6f32b17b391a793cac461132ea29670b5ac6bad6ab7cbfa758168e38b186a5e67c151a0f3a1bdfe12223346b3ab6abfb45f15c358a7c7505246c60b5cdbb96b7b56b71cd77d6cf83a6abbdcf0f743abcfae7a4b3bed70db41b366559b8e59bdd7e65aafd58a3b9b61672fb7d3d96fab4264d6b2fbc5232d2567d6adaf15e850d8616ed1297a1859629db10b5bed7ea8498f8a371a0b27591538dff3555a73e21864b046ccb1043b05fbf0a339bec8f3f594470c8d4e5e6e38ee8b8d879cb7688eb3e925ed6e7a79e7298631b9088d12074c54f0e48b35e8b39a3dcecb6b4faf78b167372663f8939f57e7437e0601528231e4a5fcae0c6927e707db83108b9228bbb6192a7dd447f303f5b5cee984346aa2c6b01a9420d8f52c6b0d87ec4cc2d844b266da277d64affcf551a572483ee9d4d73d795ece1971a7459e278d93419eff56f2048a32e6bfab7bd193c086304e4e4342e775d65a388404fafa1a0528333f85e58218f2bcbd53278889d704c81b82423433520a914492e7a79c498a8a8c8aa491ccf6570aea6950133540cad94553d34242f6f5abb75e64d3539dd523792412ab45a1b3763b8a1509d6905f39265482aae8336fa38d16120acaf39f8b17cd5a7b3d88ebf6b2f60585b2f6c53ebbbdbc48481e89443a2199481ac81fa98215ffea5f9ecdb9f25251141593b315999099b51db59e02f1717aa79ea8348df6943d4c99a219010000001315000030100c888442a150248d3331dd3b14000d8ca04674521949b3244941c840630c32000400000000404040d300967e56b7297f9f03a9c7b93eb4d077e9f4ff93f51d529bd069f7f837ee1b133acc9af8cc57da1b0f0b846f42b7f9f0142b97c919aa36e5fe5957fac3df7c4f83b88e78f506712a0031917569fc3dcd274e0d2f9c64160724235c8d63646af1015f88dec2d5918193fbfd884f0811cc7865ea18a2dd32bf8e51636f0237e6e242d12b6b9aef294e2628904bd236e649358ac0773fcb7d7ed31510c0ba79fe65fbc57d00fcb3221e3dfc26e1970b8c1fd24904eac8bddca2eb0d8a42df3f1a0d129ea2f7bb280a9fa054557ed65e1e960cf3bf95174f4cc8247fbc4051b42c49f3f80c7f0de490b6b12845abd8378b6582ebd276301e3352fc338ca6f0175702bba36959e5117fece21d2465c076f50f3065786ebc03ec3ac5bab85ff6b8486a4a515ee16792e150e4762a90691523b8bf717dda7e698354ee121e2a8bedfbb0610b8ebe847eff6a36307725eb21cf046ec0be2d27decfa967d3297c68f02c4366f979602d53f82a38f4658a2a5b5288964e184ce431aac76227dfcebcda60a612c873a6c6a0f513c66e8a2bf87bae64bd1a881b03e81b714b44c9dca0aa9172910bd98c99d8689c5e09db45e7c9bf8e34a2fe3faa6a154654e911b5e8275781230d8cada7c280d57e1f8dcb1670c06972e1fd0815ba9b16221a54375e78fdaff1e266580139c105f9fdad8c597b076904f88b5b6f82c86e00455899a7d4520cddd5d0042b5194e5fd9ab66f06eb7ce30089570c9557dc0b42629463a569ef29852c62187c2205a24c052de2ae25d8ae7d40711c1c86d521c80b62d74630b1beb86af242e4470a8ce804574141dabbe13f855f8ccbc62f2e9397a54bb19f5cc700d508802da96ab888e9f207e1ec5b8602f2e31803ef2f664d7a3971257e6f002518ef962e86474fbc16a7efc8759ed99c4e25dff5ec948fc729fc67c47e7d5ab52ab2c9e5ee45662c103fa46d4f472d5d15de8801191ab3e4c092db19235f52c5b843663009ab5b90c78a9ddb20c2fadcaa3d0bd1192530a267ae228234d6c67c0ab318678dfcad4d3f8ec51c5724803b02c11050a82ed5ffceac664003ac1e15f0babb5e1d44622931c808aeb86914431e535b8bc87734b761316aa7e488de655407845c99bb853eff661c847f83a85f3352afb8552e7a8a9562565f85d27e59a8583481f8f85ad8411ad0173ef0318d9bbd9fb1cf815f27d175f2eddf145032a973cd7bb41d1a25c97f88a905418c201ed9108ddabf70363006cf7be1503d6c148cf72fc6faeba8f61f973faa672685fd53a7ea32ffbeb382ef2980e10a4f029e71f9cff9ac10855d90fe36d00d295afdcb33544761f3c1902ad29e322fec4f3f779bc7ae3effb668b51b1d230a76214765c3e2c1f11f9196e26d90004d833e2e2ba6999f4833f2a1bf958fe4afcaceb487b59da7c4354286e2c227863087128d003670e9421ce65f8699d64f106c2daf001333a5edbd1d93c2022cf3ef123ba4ed40e8b27531f88aa26f0d3262bea1a4be3e10ca25c86240cc4587713c06397b81970cc1ea62ce3adb972b6ba1b9c57d74c60ec0a3a9e11722f0c56a78eead7ce66e0539a0f3425393fe4b0a10a5c465e60be492047eec3727eaae416629cb73cab033daf2412f9a0caed1fc949087fc006ce51fc6204c3c44639242407438b983402616536929fb6af98ee172518abce6f5d705abbf2639e95d2671281a08f49b73368ed0e83b2f8069f96ef0ebe216328a6c644a43640914342f013ab946704d01bceac818766ff0593854a29d083cbb9deacbee0489426c1ad9c46d964280b3b61e3800fd254efea7160df99351552e5ba43ede255a06b53f35338e7de517765fe586e18d1a1d71996999ecb7c8c8a128f1507735fc158a89475157a53360e6eec3a67ab17e3ec3d0c001c1c53b19c290a91538b672ab623c1b4bfd824846aaac5ed91ba0b806540177ad0604904e0b20283d2c9bf7e8b67ad375523d0802e7b43445ff79778181b65e18525ae1b496170f01457efde6fc92a25178ab044473a00e9dbc680efba708448e506904e01b763bca904975b9d4ff40bb7531cd0c9b05d042f4dd7891da1af3d5d820fd953ec3b2c73b4251ef28aea8450367ce4fa0ddfca3ae062355a8b18555326222a1f7412e51c27f34a775f36d8b41865a907caec49d02c1f8c1c517d1dfc3c3097d2c7961c1fd5d4cceda7c42f5292c0ce5dbbbc67a91b9cf71a03334110bc5a6307b818d11fe4bbf13edc052a933313f09f3176ceb8362df7310996baed9ae3a036a1b31f7f5c1ce53a79d41e095984fca487e073b75eb4c9ea8a9de5213d854c2cf944366b9a7c598a3d9fea116fde86e32135aebd56f1e879fb184516991cb0994ea0f24ec741ce5f3236724c5e5b2c865a28a7d234d2714ec9c7a2e902a8f03bbf05060ad2eaa1c11b9087c06fafcf86994f3e58f5f6f05975b7231403abb2f0809344f1f77deb590236fe15be3e29d156cea7906e2d13bd8fa9ba81f8f833e2087fa6b3966516ded8100cb643efe9b35853365f0a67e6d56850e2e0d2bbed29439286f1877c1f71ff36d70252671a78fb2cbcc25aa8f33d3fc6517f7eb086fc14c7425f6e6054290f7154687e2451b4789aa57bebf40f7feea67579e9f62a33d9c92995aacf68eb4977cbd90d51e601eb2baf859f975b08b2c23b82de33c7ad7ec30806346b8b373dd561ee9f13ad2a1d954cbc28aaf123277bca731f04ae69b71db9257112fe0a2c2d869c425fefa0389ce3942df16033968cb763bd89021df10a3e2d3d255feb8c3cb373c5b89fd6eda1a6e94debdfdf6539441147b9eed1b9f8dd4a43e8c67fac9c3c6b91cb88204006e843c7219c5ffc253555ee00a0994099693db5ceb11816cae4a3a4f25f1a0f1a06449aa2d40105b0b5cfea026230843bad88f298ea7b597ee989facf34bfe628ccb3e9904f00e71691f13488059b842b1831344c6d59a44a1b66430146b8c897833918d6747165772a23ae4dad2e3dee850166dbc425ad2d65dd9318e02ce5249a2af34fda05fff2a16d6ec23b28c451bcde461101fc983b1d1540a8b633a79218e12d32bd63df19192a4a639256a627f84ece21fc8a4039caff759740ae470bba2d6d332415728ff2911c8a640694ff57b858c016ed36a979a5fb4dac48efffb5946f2d31d0f0f493a07ffbf6e8e2df43e4b04267c8102aec9d9a4e075b1c17600577aa6d1757c6253fff7855dcfec4bd8fa58675dc35f49be7540ef97ec4d8bbd8af814373135422c4cae30c180fbb407ace8ef0915646a8e2a5a760552ddfb6cd92370a8750b297c553eaac9a5b02a971ae616a1308d74716755f406e26e51a25c359020067e449352c16cd0b0e158ab87229c59a7be3bc589a2b6d190961baffd98f0ee3a426cd2b185b7a96837178aa591312deb4b8243b2483d72f6352b42d827e29d1a44794264e6259278fc21b13a3c3a571d47e3669057ee584a704850026e05acc22ed7cf67fe03b9c4c79f01686341c34f73eaaed4f7dde893ab2f985b44ca9b83150cfc7d1ccc80016f575d01b2e7ea43d30ce5a13ee4a9198a63ff77588e1d624048d172c983b5ec66ec76bce9a09c61671cf68186b663211d886d020586f669235fcfc018758edf5358bb5983c42ba32349761b97979ad107126853b871a0c02dc136cdab90b3b07e0a84be38a50ab86b1b1080774698a0e86159fdcbb404be68d780ea3435f00764c805b34b14f3f996e6c6a7a3b2254a3c3a62a4cd8b35cd02e0f8bae29cea65c7c0e52d7e18e72f51d528c214a21a409d7c7f691445f9e65eb7508051aeb7cfe62d8b0a9b9203e8753039097b9aad78541e894a9db180d4e1b20aa3b22b76e80642212da36a7bfa20a7ccf1bfdb2c5d34eb4d94422d965d0463a2c02d592ac7411bacbbe6f4304b66266a39e6bec87f5d277491b1e30fbd878bb7b8aa289340c8b2922dfc97aede12ccde061298f63c1b55e686202a411cf59643abbf68156a1d6fe9f8d5a8b04187aeadbc50a248a85e99eb96e53503a4a86b961e022c58f7ac56965933a3a1b489d586f5c35b292df91eb50731739a35b19f5685b1a69a26bf32ba5d73ed387bd73cbf58d2fc451b551d8d182c8cdc32b89069cbfd01ac39febee27907741a94303c2b4751a8c7a8ee4870d512efd693e33e47d1ffc25eb6314a41b881d2619f81d965616123300f4c80d9778a6a0f7298d72b644a2479bf75e9d6dc9c6351be9a7d4b382a489f52e85521496c360ce385c6387630390652c553e9595363911608f975b3829bc4321cbc24e0fe77e88c1dffb8c0d99bc08609dfbbfd9ec48cb103ea885151378f1a03150d8502aa3fe698b91497568d280a87534b28069e47752bf283065bc1c52a7df6d5e0b1aa827b685c154c432435d025faf993cc172747ab3c5de4be412f7337e02556fc033a8a1cc6154ba2d1ba8f681cda73175d4cce87d10a8661b98eaf873e8e28c08afb8ea22c6d2485564a25eca2d22d30dfd1cecf8c00cbd0ffa80317ab3ed16772b8c597795f14e8f617b541cd16452b070bded3bf7705c3d346a00fd72d45fb7a028206a305f906259e447c17e50c3caff6fd056d635cf50c4b4823b41f45e9c5c22cc929d41700ddd97bfed8a5423859745f0eca07d1023730d7ab0b80c231d08da6bebb1b0a2d9a25ba8530ca183c1180f9e40b069f69f632f574dc8c14297875a4287d6e4e348c9e3bdf0dc5c94106930e5c7e1942e1501c76d6e67f2ca67e8f8285fa3295a2fddd1112c481e026a127f182004fb16acbfb52be7547352916d0fe1517e43cc0a613b36916849df5437b2912f39631746eabc2b42011b120b78f518ffda3a02c37d105cb97f2e2a3396faa35a0309f982851e93061c5f3966774e52295fb7648d54d5384d015c6fbf1fb273df0e766f4f2f8fa5295af027d520e36c792bf3c51df8df249f58e0e298020e87263c9f3e402e3f783e8b51665b2ea829b408d1fb9d08e3af06f626d851d94475af329928e5682687c80aaaf05c065338c36f592366e296011de075a107a0fc6a1968c48f03ff881ecc373747072e0e4a57a67f2624ac7abc63395d61b0f048ccd2cd7800143ecf0518bce0aa3781c99c8690e6dbcf30e1c6c89411a2fb6cf0a80d7234d7e9a4dcb98f068846ed92e454a6981c15344df352430a2ac7fc0b0e0f1d19bf6783435f413bbee0de2a9aab07120d847dee66933e8bfbe995264224a70f728c69e7b21d4a2f50d0e5ea73f8b36e822fc9ce31b02979923dac478b033a57e8d5764d9927c6388f2bf1729e61c2830388fcf3ee2aede07c3161362b62ddedcbd93263acacaf6d6f743bd8c95207f30c5a27ae995e3a27dcf1b614c1aa052b41dd7e335cfcf80f166829699d8df621173ca8a6c375daefc318ad6e903f0b34ade91a884ca48d6ff9de1254bac2aa948e90cdc4d198c61afb9b330a781f33e00be332c3adbb39b6dab2410a63818681dbbeb9e7eed47daaad04181455d0ea462eea1aa1140e479c7ee308f3a36f4f283b1423cd4d93385340d3b9faa67a3417eb76a5754dd74293ccc9598a4df0756e80e9506dcf8cea357f1afc8e74f8a592d7c0112d2e9643327bc20e6a4b466cbf3ce70c196d02e7d43792a7df64e779f3d3e2330f5af28b149c7c52bdd98ec894bdc28896263f6e05e406d846ed5311be73369810c6f1590b6034fe53766c360b7a45419aa0b69c995ba720ecac27015263347c610acbe20f193e9d6518ecd1b596ed384da456d69461da15339719d1ea6ac64601f972b9459eb7f09b18cc8b25b79d80eddf80ead8678a865592d2e5a9daa65658442a226ff457eaf602355de38ed36225f55d0bf9854cc95c5f6c681a589b626eb3aa00ef802c22c988f05e55a6c494b68d87a76fa94a612e81a841ff7fabf5378540d6fa29c49a51acf528af23255d5c142e965a6086322bb24983d60cc3cd22b72a6421b8ad3898d49ae5dc8e18b8bf79ff0ae58ad7bd916b059f2b80ade508d6b06cb8aeed0b0bd47bfac4f3ff9a52d27241d8bf839502d4aca4d76341628ca28220563af1ba3a72bab1ef8a9a50cc44263159355ab14eef23d5cf46689c3f365510df1c62b202951d946a7adf2ae0d5975a21ffbda1bf2ad9728a5aa671f142e20d49c3529f6bdc033e1e78663ecca97a9e0a0319fb846f0bb39356502c81be24111d86139644e8101c6947eaf80a4aeb36075b71611dc239ea4067293c719e736a111306ad5203da69043cdf1538a6e59c8d90f31852fb64329501a76e51d771980da3e710732ba5b6854aa82297dd216fb39d18d0be38970ce066135aae45fba5af09bae414d69bb8d7c71b909b4bf48ec0241d74a77915e1b2deca73e2a819c267068700fa08674d25d40f0b200981256eeb3fbc03d8b982c4c0506fc2a20fdef39b22ff46a15e0151d4efafffac31dfdf23fa37e377f88e040ff350e3141ed632213b1026c0316eaffcfc5f3b34c4e4e7ace29d5745131258d62b0f35b647aca48114c1a6c0b86f1c56ced1da27964b4abb82ed91d798f8a50e37a09c7701cb2a36a83ef154395cb5c61947c86ff0ea7f73492a3361e2c724e558757d0792c91e8eeb8aef6f8120b73391ebf401d5031bbddb5fa25ce921984c8ad18ce697f42738a230e2eeeba43c56ca5bd3cc9f773b6ed54911b53b428f2eba8e207ca4160ccfb278193609809383a50f23d69dcfc40a9e7209b8db2f512dd34dd455a5cbbc4ca9ae8bc2caa7459778ec73ce71deec2e70b9d2a6b75a5afb82ec160f101844f6e61c36d0e59e75976abad50e9c5126b6a4309213f1a7ab4fdc69714209ed206f4056f3cbaa52dfc29fc281aa60e3fcbf62f1202e9926912f6b63d8fbc852aacdd2e81fdfae021b321959e723c2933ea429f263ac270079260ec017ec8c4f9c9ed0a1cad340ca1f3557dc5f3ecd7470d1a6028a1236a2e8c889734d92fc0f0bee5e8b91e580351489897629bcb7a1ef0778a8778244eaf8f23d5619410c197fc1ea2924f06227d1325a6683041b3cd56c0c319970327b147fbc840c41598da3675a62103fa67bd53a64a46a07a97afee08ddbfbc0906aec6fadcbc5457e5d7ba2c872ed1a1ad6b8671de8d61fb83287d621213e112cc1a943a4bd0ad24774e9822dfea18b3e5f580ca6c5a976e06badfa3f80056d9975d44a975a71a727045d487c459a16900f32582a3a23573291fee5224460920113d6224d5946b5ee849f1608bf3ec7f6932daf06ebf6e628e5a91b69505be49d25ccb236b4092411820257ed1e5c88955db4d3f8f901d648ffc09f2d9b160e31fa25611423646dbb7fce5e017a12f6b1d84695762e6bd24e3a87ceeb2b237c259f448da89d9de58ee36a82de51ec60c26a40f7a0a4a01bf653b3f68eded20bb4568cdc1cdb1cf24ee09d2cf4bea32c97558673363d0813b52dec2903a5200c047040a28d33cf93e5df50ffdb214e9d02a7a5e20ee7baeea38e7a09e475e29e87947576690a7d21b34ddda593fef1ead19e8fda0c14da5ab211034e0b72059792e6fc3ea17138afe1be07e6970aa51a211a2b404af86b873096e8e9308afda4d3fe85ef7a3616aad0a1ae334a3ded64a4fcac91083c5a9d30844f4d782b9a07fd2be4868ae111635e9d0f40ae9661fb382f60474f652d1cc0d9b974df80d5fd9e38f8f7462e7c95b4d18b26ca20eea8c5c93dc9bec6ffa80c93dfed40140c8a2aa972fe66051d1123ab97ece02d4879bd9c5f102c0e1906f451170b0606a24dbedee07afea5bda2fcffeff1b198972838ba461d1935f9f90a810dac5d9f1092ebbdb3a812a426b1286fad9e48817aa91a401d3f704c914c10103e7ef2d494de5c6115e23a97affe8a40c8c1007052cd5519817ef96ca07fd2631792e854a879555dcea6cb539e0be4e1f4258f0279d1b57cd3b3a367465e223160ffd0428a2077fd268da7a8d20c12b23051cab63289beaea02efb1d595b1648472475c2f6fa09a87b8f5026c04344bc4812847df4231fbec4c18e40becf37d087899a722d2f3003de8b128fa794d2193b5b1009454002fbdc067070326442527f25d162fe2a757d0c460b84f9e78ebcc21d8c4e3290b02529b3c89d083e9be03538066d1617809a38d3c4ba21be35d3c630694f2583edecc51a4c653bc8a0da0aad07fe11391806d42b1cb2113f1510e5e71d6e1f6479eb6b5e7edc6211481f6d8337c9816918eb8891d3f79b355fb93df094ac9ab5a3cd4d9eebb96bef642f752daafee45388e598a6aa19400e69d89432017628c6a7f5d7dd6e28e6c21e7dcb4ef4fba4b932ca3d570292d15dd4bbbd9856c79e05e0a1862eb7219dcbd84d2ee5bb6c42529dc5e3fb8f89e05a0801ad6ee1eeb65dfed9fe49c65c10979979572036248134fc75fa354186fd45516cac16944cb11f8abf63b836ddbe389989c1a010b9164132fd90cf68e8868633032f40162fca02f3b6afea8fcf2bd8baca2b90a9e7bb969c200ae88d388221cc914bd643619608c3214e56dd6dd8014024d43bab3d430864e47be9964c6ead826e1cc2e5d1e580cc7dfddea3184579aa93329140a50437689028fc3f45fdd849e4f946c1aa2454a7f3e94c8cad96724238eb54ec9fed2d672a239c46cfa4bd3795c18b1d3de874e3d24599aea302f1f60f4a66c289e85e03e4168db294d48d0c20ee80d3211cedbe7df168665b7716efd26a33d653b02de9f338d65ffc1e50bfa8d295abc4e97c84f4231a8d66242f7a2c9964e5d98c57070a0d9bf6babedf23b952d6001cecd2ddf026ee37d1305722a781a1dd62eac828727a74ba731eed07a48573d6a316a1a54b44c79884d9b678d6675fbb17afc581e68b757d020c115c3027180cae8033dac89992e21d67083356c9478805561e3acff082ae48870d609723d4d7b5ba72a7cdead4015f2fbcc65a5396c4df2415700dbc3fe8a4bff5323e5986409e8dee628288f7813213848b63dbdd2336f4e29943f3dc25289fcf699b9bcb023719648e0aa91196e22d00f7ffab9eb19ab1816fd2f84554a012187cdee5173f98bcc08dc1be5fe034a4b69e55150b2e1ee132a0ccb0d6625cd2d5a7c011be7373bcc20a6fe87bb1bdb78fb68e2401a1bc5062b544f85b61593134d56d3e931f84daf1fb51612200ecf5e74bfd813db67932bf905b0d18be72deef39e211d42f8280ffe2d2e2af0fe29e9181fa93020974d8608c88ff14666b322cd637f6c2cc73fcdf05ba307b04bda1568d839f37175cc8c45db691fceab57f5503a4fc22027f835abf0840a9aa7a3c11734e82c4e34b0a2ea770270b7d1200e32c666a40a035ea39a19d1aa23c38eb8d44e5ada0ae0cd24d548b0d3ed9aa9d84000be65a34e303dbefef35d9083518cc4d864d60056210dea7ce98610458431cfa4728cef7db4fbfb1b1c3e48d4cd0009d4b6a7c32e5a2b5a04454c475822f75f7a5311acabf4901b311b0e2706478d080485158fef2d98315e243c3ed51705c07f7a5d6415c5536938962a048ac7b8dc1a8d9d8f8ce6da12210de809238f717e91c8f31de18b8b1ce990470da9278fc593f181e8a662f1fe1258a4ef080e9c3fd1ac1655196a533cda2fcf35ab9f15c9193244b99cb9cfb0a4880e251efca080c904c1f4478a66bc481a6253c2376d7c1fa5f98013b42a15bf02df374f830136c545d28771534c0d8c03a04a16d9a394945b195b2e11bd8bcdfe1b811d544ccb204e8f3bd598b0cd7e7b7f42d0b31a25e9417160be3a05bb9ecaad748e7757f2eb9b13681b4c1f58e2b7014afc8c331298ad58301cd2a2b01a9b1fcf7544cfc5c9bf70b91e31bb4ffb05d412a44864ee275642f271a6aa6e478b622a0554994630a63b8585094ee4ea9570259bc3293790ff894e431c086fcea81289c7aca86f3981a2995458bd9d1539c32856097bba065e923c3cca6cfd17cc13fa75100eed938903c1602317ca03d3ae9e33964160248979278378b6d6d043fb5a18ee851ea5c403ff0ba04c3f10f4441453cf534d620e1b0d30104307097815ff13f760802a7f09020056d4a52a20a0142cdd39668c1c4029ba0577931eda5ac4889c770505ac323da3098c5cd9e24ef8e8de77195982671880334c33b126e05389106517fefcacb653e5d010cc12452395c8e66cefb632dc5c103bf70466abe716ae667b05da918172a4947d136fd590c8d4aadd2ff578f8b1e257823024f591a6dd81427ef8840e8a3922e10159202e7adc2c06b59cc4502992b08c639016af0fa83328c0de34df67e064072d96cb82d24723385ae1f0351f5730b2f281638cfa0631d80999d5b56e751217b1587642f224a53640c05de2148694f2b86d436905c92862613f0dd6389d20190bf799a0c68e62cd8c9ad5d7b2765d18a566efd794c7ab3058b4b3c51b1a3bca1eb146c89a57ff4a332844780cf0100f75f0dee1310667c6b5636f0d67d2123ea92b6bdaa1ca1177cf8a5b4c8a8735cbcb86881f7821263db5d23ebde1a64d6a3cccf0d568fb9718636824230c309f3f10fd9105467ffb9c79a63d4a31696702f60a29371196ad997d020fc51fcc0a9866c18ac4d6ef9ada633788bd906cfabc84a16db1dae76aa20b17c78aa31c940fc9a9798466375ac5772e365938fc4e75e97d1e018a5c83aeea99e0b56a9da5a3611285c095ab1be66afa70aae827f17c12a4f19fc91e7047fc41ff16a3fb303bdbad704976b6c8c2921b8758518fbafe13285d567c2c33790c4ab45189f87282fcb03741169b12944aa9bb2c1b67553ea1c0529a5e4cf347bac6fb9518b830514bd628780e374b222cdd39c2c29bb6d245d0de9bbde80ad77520ebca52d9985404b024a5af5e6d6327d56ed4a31acf267a33064de907394aabe8fc12ffb3e31ea7c70b41830eff9858781b54d6ba22e2b92f067245d2207b1350819bde50ea32babdf08dffc402f9918f87410e7c7ccbbaaa23c0549b90088aa4c73be8ccf9c971f6c1c025eee980ef16072742d3da211ea2d8821fe5d3dfef5564a717d190801004d1961b1c57baff4326ea24e2355f4a7d23856852874b14d2464a550a60dafcadb965d36ce029a5bc012e8384a58868b5af4f24a5f4ef2c73453661cdd0770d978e862531067a7ad51158fa1b6c46e37d40c88030242105f36477e82dbea1e089c1a14fdbc0931e74e56ef4e9bf243ea67d53adbdbb6692c2578474f36efbb339fef229127dd9176061b46de44ae3c846fe0f96817193892d34e418800521f10f6af712abbf0a356b333dc281c19d7e4088f371a68be3bf7d0809fb93db1fa0ee970d5a9a6c79ce4527045a85730a428f8f311e700bd8116cfe7c4ab32b9b3b1fa8cfc98b88e31d20ef7bf5b755d97c786a063727276ef11418fc0625e436b8a2a3e764fb9bc94de616c3efb8a9295026cdc9d1f9abf4422608a582db041a66b361bc95446368e0263f4c0c660fa90de59537b43c473a1dc5aa2ffc59a03ee04be7f0f3618fe63c28062723deeec0ccf137068139b29ab8a6ae19014d9ae54cff005b9984ddb0dc2fa0a29d8c0a4df4578041282445cb88b5bae8afadfbd8faa573af657aaee476a720fdedb54c515905564405c5b996c18cf8b766769406e549aad7325daca47400a537d82ddfaaa8251e271f9522ec3eb96f230a014ae122c8ef1225bb0f6e0f9a47d03710df77519fff764af073249bbb8a90504e23e9a22812ee7158911a3c3f2fb188c3a85e86dc0fa415b8033709d4c0602eb508f4f58750b4b14832c9dad83a4e568f35ba4ea8eb65a5b80deaf8a9763a44b46bd93b7958c1462b277e20a6e413629f02850a9254719cb68d003fdd242881a173afadac89b442e6fb3ec91ae3d0c032e24392597a7504f39d7b25a104acedbe6c8693f304278e5c19040c51b3a1004c6945db9b99428933f95fae7b34164d29ebd4747dbb88ff4154bae2b12f5151fdb46b0dd90c01b4288e529dfc7f4440580512d0599054c6edb042e2224ad4ab3e5c0442214afc0e1951c17c4723896fd5abd6f6ccec020d6f93f3ad89e08088dbf03701cc10ca4f95666ff78198335a8b388dc29ea2ffeb60a6a4567ef4059f6c88aa88504782267da91b3b8ebcacd18e87218d2a9600a330d02a5beee6aafeb86482dd73b8644dca93dcdc0faca5a42caee1bc042aa34f7b431c43ba2aa084d769432f30d9c33d0df05f93cb84428057dda14ceb7e07e708b35ea703bbb4f464b0f96707763835fd951833ee0baf1ab0281f491dea47d8671b0c0e1aef6e430d40cfb5f1f4bf6035dbd3f10580919d3aaa2194fd161f189093574372c5ed73b9bf4f9183d126f790390be80ba01a88782017e67f76c3cfefb20e50eff75772a8dfc4871410aad89a500079c3702bfc2bfa9a1e9423079984364e204e271be6f5ddb4b8225bea603ed0904c0a253b08036d54b0aeb82805f3a1f6eb30da91f796b6246a284ffb227bb38403c74662d013132fd1422bb27fb4d5198564f68bcebd2aad5b7eb19fe630afa988183488c425952ce1da3586a86a5fe8fbc2bb62fbcad27174b458dd0c941adc1313e76d40887bb2dc600a835f41f31dd3413818befb43274400f2ddb407ff48cc2d9f33322691d251018e016904a4927d614aa07d15df03b052bc6cce20fc8d8a03e95e51def73c918a4335901222eb3ca8624ffa04f924cc84d69ac88a13b56ac2d69ed8ca13b16242564dd4aa13587be2d64ed83a13586f22ab4ed4adce76e2272a59960e81974ab29b8e03325fea26df98d735c725a33d27c2892e6ebaf03d02325fa359519ffea8d72fcb8f7259f3b62a9d4d08a86b27426e928b748a49ba2c3d54729aedb95be56ae731de5bd2b2f155c13dabdc58b11f60c57cb816e4207328d12a5821b19d6dbf34848f3b439ed2093ec40fea93047e04e28caceaf10f5513c40e4b6da8448407c58ce7b6f9e19e450beeb4ef00cde283b0ac560f70dcaafa88a2efb5065c124ba16a6590fdd4092ff9a9c17d5ca584c391b413d3af81640586878172676db047b2825b58c6da3259ee96008027972aaccff59471da576a32558f92e65ecdac3febe560d9496232a08cd4d8cd716ca2a38a524d56972d9baecd2f8c28c9e2b3375307ee830654a0030da81ac93a903ead9872c90ae4365fa2b1a6f8222ef17bf7df24cb332e51155956b3d46549a759bb9ac8b2848749eb8e67f5bfd503591bd38c4992ecaf4185904814b4db394be6b2ac64c6225c562ae8815f26f7c61f4cc80a78578c4be3b22cc9ac3b5956ed1056e8c4209e324316017d215ed82ac5e318851da3791fb05f697b03125fadfa55bb9e06333ac857b4812e87bb87c1430d598170e55a2496a5a26b075a0e0a7a67cbba496f4117f8b2b96f18ec356405182e8a3ba35393bcddf1348d3ea913de1a32743fa6d373d9cac2286d27450bb57523fea83a81c7ff9cca4528d54ec395bc6b2c17554f01ed70b10cab189a92b9a2b55b819447bc8bba0916ef49ea4a8faa16549efcdb0185287a303a33d861f2474591b68acb36eb43fada2114348faf7cd3dff9599582f06951f6eea7073745d00da174f0cddf154c6004bb68c22b4b629fb4dd954c6a319c18ad7afa688794cf739ec05e47ab7891b4cb121564faee44462de74867633c3e0bb03e31e35e0386d317f834dd356c67511df7e0c0aee81def7c13f3dafb44c8371339b073b26a2e05e36971ea1d73a873ddf07082156e2718f970d8f454d711ade60fff437aa88d013aa380774c273b79faf8cb7e444e1b13e6effe1d21a7c478895ff02013793ffd1acd909f06cb2e7542f8b3eff1504568127b4732523a1d9cf18399679ff250dc8276955eeb40a305bd02ff41aef6c9254cf43cb7a56561377c9f6e22a4e85fbe8859c77ee9216f75ae5cf6f0be02d760f448f0d206b0a9c7e5f2c434d108d77c4d45235cf4b7fb500b33523d54c274994544d71f5006da076899525873889de69a0b005e83f047df309b42f7c1ab3216733717c034f66ee040ebe41df98543af0d4613082e26e4df1effa7a104ddfa3489ba3c552e2779b4ba0bc4b64e7b8e4b3f8cc5d919e5b1144bd5daec21689ea5f1edd502452cd3c74992c9b9a309c9c5fd80b651e5394817dc69ff144165d60b68518651e2c89cfeaab78d6123717eaa246436859fd0f84d8eefb5b103c6c1941456b4d4636da04a7a475bde110c1877dfd6f360b3fcfcd247f293ac268c2f9ff25f8808d90c761a1a02b68e2c54144f1c7201fdff4c2fe461562e13cc29bae678aa37cf5eb269257986f1c71732fc82aaa6dca885212874eaa6c7b30202f491a1d0ee256fc676c6287f73c4f1c2c86507821f429ae513775703c494be1cebd33e20124bd3039b4bf7cd815007c47a4dbb652a6a49df6135a0b0d194c637f2e0ee5f844c82b71ebf5c6581e75773c8dc2bb2bf4c3f7f2573dba8da2b5a56631dd8422028f2eecc9bfc7ed12a7559699acc230f6360109daca1a05c1ae02365c13832e3473710cf052f146309bde81bf9065c6a722bbafc65b01abf005727e12db5bd18d403ee515c8f44191f000a0fcc41d60e44c87b679ebe51629752b78ca670c7c6e574b6653c8268dda07c1376b27a8efeee8a2e8f02e877a2c72ad94fc112b33eba0301e823d22b1f992d05ef79a0f9ae50bca6304a97e4003ba9641f030054ed6a24d68215ca58f004f3ba0d89a374fe33ae72b36d07885d4fb6b0cf716bb32c7669b595defbcfd468459aa46446ac2a3f6dd9b4ce842b4a621fd7f9d97781894f7a7a0171860362e3da3ee7bbe95a2fb090f8fcab609d743a6e3fbd29312ebb974e3369ea2388a5c4fc92bb043b5337fb7f45d3d1569e59cd481bedcb65033d5c30309987ed3b69810e4a013b1450bfc530761d81a82fe3f80aa2e8a6fa369a9be79813bd08bc1e6539d5ac5cf3eff14bc1ff0c9d5a1f4d87527bbe52a7e2cb96196ea517fc77b279e76a04c0c0f867bbf5ebd42264ed8b8e106e2243f118e4cc1ba6ef32e32de8732d620fc6c054bc8f455ed0c9c5d46d7e284f18c9dcc466b6380198674bdeecdba48ff47843ece023e3ebc5d947fb00ff96c838cbcbd5fbae494014fb54881814881402777e3c5f5fd5f797f9420e792fd6ee4e688e14ae3c8f47e9e216f16d75dc494c7bcd25e107e9b02cc1452602a9b81e52fe5846625b1f9ee0557e79e04bf1598a84e8fee813e16df7423054cd04712af12570eb18e58ae1151b341a3b19c38690b02030e62663b4c4adbc99c59d5fa74b15211a71a4ce98b76f0877832740290879804c380ba67553f946afdf322f59152d2bd28cfbda8c64d497ac33295cf93ad8f781eb665806874463403d873635460d24ea0c995611985f9b009580de2b34dfea242d790466d850834d4b764c9f673897e6039b59454773d3f36de77e07038a082fb8873934cc8ae14a462429f0392551aa32a66bec50c50627defcea4cb7c31b781f313ad5d3125ed24b728c731d744be390918b53aec1008c76620003c9c9625d20b29784bab2394c67688ec12768c1986ddfb02814d6398d8f32931b84a3d352c5578274804eea4bd270292c519b70ac4e6c5e63bf14c87f761dd379f131ede7dc7f66c6651dc016745b33eb5ffb35d2c47ec42793c1ee87822d5fb19cc85767a8cab2da83973af5625e8a6d611be6321f1f303446a7d91fa762e7ab824453e97224e934323d587d71c6cb17df5b4b8ece1aa4661d5db19c304d364ab477630c4216ec60a7662ca16a13464a9db6ca594c775fe5115bc2b4ce48cd74f1ee60bee949fc4589e803bca60bd17cb0151ffadc0dcb5d2210d9570e3ba85af06d72e19b0fb0662df72da9645db0cb4c92fdbbf05dfadfaa360aadcb047a1a77e49faaa76419cd57e0c2f78750b21fb5fce6068c818ccb7e267d81efa6e02132ca2a2be5c0577fce184e875e45ab9716a65efdded16df55f69017ee76ebcf0a727ea91c16ccf16993bc81ec07aa5c0ab2848b471130c13575a58221b898539660153ff7b3e5e660ea460596596acecce0f40bf1abbc9b7fd83123bc24846d201bc8508fd4fb59c5dc3aaaf25d5f6214f350c157a460ec8231a67e089411400faf6eccdc692646d8f88fdca577d41c95eaaffe43f2a2d615a5d6119250b35b66d29a01af565a22973ddff4a2e14d2353c5455ba922e6b57b6e5fbaccb471c5542384c3998d9f2c24c1f1c0fd50b651309c57bfd13241c6b6c759a276b117e985c7a8e8888d7db48ce38c8889e29450c6d64a66711571a67bc820dfb224bad32d69cdb29632a18f752d102a1cf82c9377df219f448c8d695325e1740a0d7c1ac3997dba274b585c21210f64beb8cee5c95c401d0f2e53e55daa13e841b3107c4566a473714fc6cfcba8b2eca5195485c7f9537c9d2a3bbe38c276fb0f41bd99699ece4c1059afa433919d5f8d1107695d556bc014978cc35de63eb233552a2f08b7345d1c3929118659ed327951c6e4266d4384f1601892b2d80e384a47d52c487f253c24937624f01ce9e49e9cb8ba06133caf99e96b55a8a4ab850a731f4ef59f1d03405b70b8a5abdb021ed13d6b6e85dc9f8a4d17a87cb96fa6458c2a5ec1b154d3c69b37256a0d76c4e6caa690b6bb0a83147d621bc863aecdd4db58abe2715c99eea87c2134aeeae47de18dba8844e627e9f5420ca8f0cc3f24c9ae9fd35ddce5053a715859435fec9396b4b06410ecfcde9046072ce15962747b0106b721b34ad5ef8ec903881c7e93ac1bb04ae41c7f9c1aee2eaecfbe6b94360334e7df8128b3a8abcc9532a2ff66191c5a307f1e18d6ee3658dfe6f7a0be54ad70c34bfe3ef6064cd2a9ea5eefb91bec93404e76ae2c1b4001328131c65c9c0592ef0a263e758069fb9ddb8a10d92dc3190ce1f942a60467df1fb381faafad3ee71563df4ead20515a60a88f6c3b7d17a5f384a65752addd1ed547528a9a82194c765c83467a78c7d77a9f8631bcee660cca09f066e164fb4963f56fc0403d176a306b264a5c834d5be7151c1c5902e4412b27f6829f2ee3c4261292ddb6eed9c0f67e7fbc54efe956813d3fd76a985bad7c834edb30953ebd7cd8fb38061fe88f9b7584ca66c0d7c2d0b9d07e492b7ea69e8d8e0da7f38ddd104a0e78d146fbcd14c09aa21a33d8618af352992039be98bb30a304d562ec84fa8c6805c2d19d01ae98d88f167d08b7bd9d2449904df2b8f43cb2e6f239a5c3045ba37022086a4a0a8431b65df8d38f6e0bba855dc55c17edd1a59c8856a1afee4e28f75c14794ad929b141352940e9be02e46334716f437040be1bf224d541ea831784ffa79733600996f32721a8e77b47c97e7e3d74cbea854a2f9097af4b5c326505b7195b2bb8cf96e5d7e4491bb233ec1a89baeb7db76b8b910293fa3dbb7a34536458501b0e827347ae4e7af72fb6cfe2b153d7bbe83186d487a6415c6458814ab878ba40ad080c475e67629d9c0db5e0e820dc423ec473c9b4f5d54b3e8f1a7d1f739496ef68755420cbc373fe00f2625ee8e8f9b9eae43a7a0b5a887f96aadcb62f85a148e9e281599f083f076713bfeb01b2ccf714b9493cc34f074e8f470c7d7a640afb5e843289a5c0135bd459ad0458149b1028d9e2e74158c05e2ffee324cc6d9a27b8f6e98133c02041b6612a207721053c08eb68791f13306a34b72d5949c602543a349919d5f82186ca5f2173497d64a4eba31272e2db0db4237f84484137ab3319f2e5c0fb36b56abb80539e656e521c0c48f7b4a6a61936bcacb863aa4bb7fafa7a6c6fdf8d7e47bfb8ec82c1d477463bdff5173c862e8bf3efbeb97a945b4f2c978f11ce41a4bc738963389d336b3c6e935d366546eefde05cbdb4780064112435199118d66735c403a6fee4df00448559f85680e8868bb6e202ddf774568becb1da43355814b33c245d999e8b8369add5a15a7c109e477422076c0ba6680364a7bed95bb73560eaeb25a45619ee02af16eae39687d584081203401327cf4ead813ab59dd26e7f186259c70b79e38b396f514ecd33ff6ec957e6e01e7eb8710fe6c9618c7c20a19fd588c243e3a3f7eefa53075f30b284babed8f8f8077f3af92a9d70e2b4cf383b7c37b9707b87160c7b0f76a63392c0a9eb8f4fce3e175349f4a902662829013f46768225b0529de235ad50fca761f3410b9b96d1ef5afe6b209adad2f87d8b406e5c8da7e05243b6a3aaf8ac863bb298920965361db559c5389747864caf932872ea1f72e038d1e349d3d08ca0f55c215e83fef839e551617deb34080c52da99e25862b6da6b4a403242dbd7cee8a0464078b4e690e4a74ebd956dcc724c8fabb6cb3abc04da3e5df72dda1f7141312556c23014dea6a8b66d7429e8445b59db3a484bf89f6174409fe565d7bb86aee83e4b133fe4c35b0c2004cd1a1f3a7916b301f819c68351b0e2702045597c61b7b1e37a4e5be62a1e2f081a8185b54fd91e8f82e5ce77943128e1b035b99ec8bcbfaaca08be86fac5c2e5c26976535d08ebb9bc5e5581388aa8cfde679a7201d79dbb7eaa02717d8e764faf3ae9cb5b9d8d35bfa2a3aafe8bca7f786f5c416c5114e73399c803ee5167d9e7f5d77e01f4c55a3bbe6308216bc15f1d61ecfc5d509b2b94c9694c21e5a89c180b58a9ea09c20f2a770392f61afdd4e1e88b2bb6619519d75ac0f5cd4f6b4d04804e7cd069a362f7783a8a8ea15dd3946c03f0875b2098b4f0da197fea5f6ce3ad9f121e81402ac3e1a660664a0d0c61d49edb32f7cdc04c0f20a358de2c481cd92609bb3c26c9a9e6edf6f679c449f908e5abf9d47e989afc6cd43640f3c263c1a6cc84eb1813571818fd221c4187778d19f954e016070bade605e4c2aae78fb236d392c779a922b92190ce196f0e22c6183c1ceb34e098614c224b5d3a484256ef39f988d5097f18441c0b63779da15519cfd421dd0b53e300f723de9496ffc3a2f08e4748913f1820b8577edbbd9396f4e73e76cd8bcebf157a4a25c223f5b412433239d152afe0b380776cd8189fc840f59445569568b0a2a9616e75061759290cbcd9c01d254eabcaed9296d6dd6c81331d9d1c5d49c243a62585b9f7b3e853c2e69be3159aaf9c3e32b6c53681e729a84ad967ec59882d2818c2b9469920b9abef242ac64622d3706e4fd5db95820c45f5347b9c12c4bb7aec27ab796116f4ecedf519267cc3eb92a80eabb86361bd9c840a06368866c0834b86621637601810cf1c71cfc488d0c2b6664a42893f93d40b3b9b93ab868b3af41726df4b22be3dac9dc059e914fe6e5a29677674651ca8701ff2d97e113d24c0153cffa2281d02737053273f0f1de0f8433fa92359d8df800e1acac8ca5e93bf7906c16f1d9495356b1aa013c409afab48cd18df979b4ae1c33d588cb2fd0e35143d9919851c34862cd7708ac33bb5fbe5fc513958fc3b7ce58e600efdbe37f91efab578a66dc2ac4c9106e562e221f507bf45ae39ffe32cc1936713e7f58f6eacc8815622f3ae1359593c3261933733e84e88d70c2f4f7366e424bb3c03f89b6e34f3f9566393da1a2c942c812aa1a7de520ed081e8afc800daa0d83e00ee20d750a5a8bd9bd651b79ebb708280961cde23cb8a3fef0fe86b68a38ccb3c3eb8790dbc61977e6766a41096b0b9308ceb370c2c605ef799e244fbcea4a593e3910fe155b0329165f939546904a8a1630386566ee02740dd0e65cea6cce2c74e4d1c4cc22d7c4b71126035edcd7c9c02c702ec953583cbfe372fb35f09f0cb402179641c4f5f98f512933c328e2480f21f7c7a6b31c912bf7cb5a8fbcabc748b3cc8104ab6c3a59f9f944ffd2366e895b34fb7f994df8959cd7ce3dd2ee9a02c8c00627e28d2e25de57a1b97eda39213d2b024c357e19772110524cbc5de9112d1b5af589eef7ca33742581e451b54ecf6e040d9f7a8646eb6b2d19e240ce88ac36d0384f34dc353b1497959d99cd0936a17e5a0e151775f875c276efbc96fccd42df801e3e306cbec113e3a90d9bd64312a8f1e9d8fcc626470f4773f2c41eeef3eb61577da61d71fa6330baa6047bffc262a7028c7e514901327066b6c83aa10242d8142f93d20e3c9a6141fcc50858270d639dbd89110bc3dbea213248a345d0d1c1620ba1557d8f44905de4eb74085b5359e2ba19382937029c0db8817311f1b5b3ea266ea7415784c20a25816ee727ff4394c9727ea154a317c65a3a03e7bb123181736b944e22d525b834315022edab2e3e7d1dd0869d51cd72827ddfaf18e3f148bd96450c4fca8d404ff52c6d9f81520483fc02ba07a495c6958539943308fa2c98b3b08c2861100bc55571d39d43b84ae4fdcab553cc7cbabdfdb492b44e9a0aa85f797e41ada7c541ca4c50b69208e1a0e177bcd7c1bd880c6cfdcacc83986b593be7519c28ae925ce8de7cf72fe244e782959384803f79ba09cdc157a2f0f005756ea0601fc8d4235865f18db399d897adb833da614d5da14b63995148e1a902de0f8db0d9ff9c2f7ae005639209af7cc5e719e06cd90c04f8e9f4c6c243e08d77e1b9ab02a48463ddd022473d3ff1229da9f2b4891df6d2e9003d5e73fd3759008994116aeefd72c7d7473e3c140dc7a54bd83c532a89df3c62d8b6c53910c3b74329a35e203457ae4663faa7b874fe0901372ad7a3a224da720ec89c991ae16c69dc5728a3abd3e30c4b0f0bb4694fed06211cb29cce35507c075ab0370e0f33131823a388886537bac326923d6b3b2f0f01a367d8d310c1ba07051c7e60e572a4df5fb0b537ddeb325562a61a1dcaef10dadef456c584490ffe2c68b60d6d454a444fbc3b564110f944029c8a3c45bd2e71ef4c123402a2c493044b6fe555a2d85dd4a5bf4a444084a0b941ef4aba98f9340d7388619e3a8c0d41a8fc08987fa425487d1185c6674b28375c77d2345f267d4b5cec416f1e2c5c0a33ee82662a6ac32c76649226952da46581b97d2ab682bb020252aa243f577e1b5a4416a43a4c0a2df4b05680a29bfa8e4326d486d182921517c13bef32add474c0897bfb314c8c09fd9faf29d4781eff4738d02e20962ab4ebab5c49d3e1329db82ee11316a413d90070f950a5d93a62e0e43155037852a3f396ca1e609d66d136ec3998fe679f2cf36ffb5a09ee474c5de69ff62ef2ab92fe0501b4f120aa7be590638fae1ad23f790ea8e59163cc12fd4041ea0f6db2146e8214c4d4a2e7e3a2bcb0a21402356297be85c1182788735ed073e47cb85bd1e46a25d256b554c47a738c085d3e13af08f8543efe01ccb248ad3ca0b371a83f475e8e20212a5b3e8b506965c6a63068490f4d073ea9fac0fbaaf89136f34b2807d078bfb6ba8278f8b2d47914affacde57d2811ee53767b57a5b3f1428c8e48b5f47dd0841f84fcebc38bdbaa694b6ad9b0f1161b78c1a50b83e5d19fdea767337f001a5c8dd5c9185a4b525eb15a1c7e61d0c971a07a0b4a5df97aebe0924c91709224621f76168a42b01190571fb222c8007b975e76d4fcfbf1ce5a97c6111ffad7d99f222c1acb0a15b22a97f4c6cc0d1f39fee0f607467c3e9a9439c3807b353f043ecc5f3654028757d6364d507dcd65c68e2ab25804765fbda4534756d8593c143ccc1ee75154734cc03afe0b355b0ed4acb22e0b037c529a15aaf1c691ab9983e0ce9e28250070571034025d1ba5d14ca66b022dccc76f7582f8c218fa9f87fdce0e4eee9eb5a9aaa23a4e726a64d1130cc7865dccd4f37415f8d7f1cd5a8c84cba19c31d010aee2f1f38940faaca5f7ffffb2b407735c79c03ed9307f706a7d0cf5ca54065e9ddd4d23cce9e59a50f9db9e46e0b9531d0f7b7743bd11be31744096cefb3799ba7cc008b827c43c0d3dfc35c80ed4282670729462295e7d61755cf0da851884ebbd45cf6c94a060e99205e572150bc7fcdf894158449e7fadafc5e90911893ee28326750761f63e80c11c4d1f360c37c55c6dc4af8ea649ccf89071a21107636add41dce4024372e402175152e3bddf4975598451f57969ff9c60f7aff71d102204ea64cfff4148b4701b072e28718fc836a65fb65cae1a25580026ec8370e2bbe75f21e9c564b7f741897f96a52316a24d9f9dce900ffa879d45db280a607a6531cbf54d1473d08479a957c8f9b8746b5be0254aa7f603d25e4badf95784f4e1fb484a290c1efc18d69ad7f4d52c9bbd3287b14bc5cc071ffc88a7f8f438a9108f63efb96f062221c465a4f2dde0ba9de5e05a54cacf4f533a8e9fb4f614006ad48484050d31cba58c9610d826a2f23921b8671696cdf3126b6447c46356d1a65ced57bc84b199009dbbba33038b39771bf3218c3d3a23c087e740c28762d8ea12527ac82ff7e7293aa7bae69de938c07b48e28dffabf0a150b5f8333d8320d7207c12289d045e620083eab74bdba90944a36a9612eba751b39e05c9dce007b3b4078fb38908ccd547f350cebf9e865e881cf79829ea810cd2cb1636cc8866fcbb3f3802b3fa6a4a9db395e48c4a7a919ca720a9705c5b86d1435c5d3cc74e72a402e9933c2f455a27d77f007fa5e9e659b42b822586d3d6cf796ba807dac056fd9c4a51cbcff51a74bc5cb57ed2d90c35f306995933d3ee9da3fd9352ec2e20a2d66e1b8150b70e52eff34df3b1460fe761016b66fcac53907daf4a0295c20a1ccb63ebb82613dc5a6360837baed37bf42ef063dcaed0ac9726b024d0b8ce665866f461c14b2e5a01a6dae322289193538bc0d4f115d422b0403aed0dea90a9cb571076996b493ceebdb1b6eb040ad966c4e22aa92239adba1d28583dea10bfbef50dc750c49300b7bf4dff5e30c305e00f554c0099db56914416ad30d6335da7788e511440d2afbc8ebdfc83570231698f8eee078752744e1426d15537ca64281f3fa98716aa7a50a026cd6e4548641990d9ff524635f5b5acffc8f8ece5059d631f4cb159d53e012b40d649c72ee3d6f83bfee328a0e946fc052585a1b5d6653a4832b5ef95d06e40cd31d9abc5fa7559c82edb40a3d17fe23f6c3e13dbff66fcbcaf51de40472fa3b19b9b633bd7c8ebef49f17ac6fb56a6a26152a835aa3bbfa83c056232e18b3262163c08808991d74fbae2add0dfbe7e01cee9acd449499e3667e8994332171951004b59efefbf48b9c4fc20c8fcdd5eba11c316b8cd52f67591fc04bc640e4a0a6d441c9391c6f8d0618eee0c0c6ebb380e9ebf53adb5057cb55872d6b21ae2121fcf68c9ed78fdd3c98056460ac38dee13420e2cae17364f52c5111f2fbfce18c49e6a3dc2b642848db2cab24f38700172578fda4e8bff9d7504370fa8f820ded97adb80a9a50d5d9064fe51b041c4c2fae48b8c9ecef5e9caf1236072b1fc4fd662f6a8501f8d2b9d5e20d75994a2a0c823a420e0939b448ebf3246450143315658b7e0be6c01ec33305a880d2b52a9e0890af1b67782e4e6da9438c32045fe178c2d369aea530920ff46d4a444ad417d0e81e2c697df54399c49f2afbff45f1c0a2621da12ec034a70b544f7aae640fb6b826de68700e8d64d42a6a50143e3a57f6c01544479dc3f6e447445e30b40cd19b22e9d092c778cdcb545a9f3c55ffad025de212a3e5fc2d7e71ec393bd1d68d2842b2396f529ba236c445a68ca4134cb7cbbe406bd9481052efb1620b0a0dd3b2d6376e8ed2ca75f9a21a7c63bb2881ed41b5a3e8085a97a9678f17f830e011b2f6cac663f25237c009eaa7f05dfe8881b8281774be62274916c3ddf46d1cba9831be8a15ea91f51d6c8bdbf42d486a1bc60f42896271e5156d4ed176a351a21ee82f4ebd918a70235164cd4354d2637a5682103a43a7f7c389157503ea4623eca4309412119fa868819e581c8422c5a1a4b2b54281044e6ff14c8409cc51cc684d345647332d71c675754bc4921a0388fa94c2f80ea16de44b9e2cebc74f6a2b6556ae8bbaad85ee16dcafd361a5d5b71389b46979869010d593261c96de28bf143b151a3d1ad9b74234b7fe4d417933245ca4b75e0363ab2a1112efe68558c474ca5e5ae6aca0842c6553290e01544badd68850da57704fb359f5785e3612b2543e1b5d556fe24f3caebe2f82019af07e121c1f6a182b6559c18612545dfa2fdc57f5d0afbcfecff286d3cbde797d8f2dd5893d330b2d494240f35bd0e2360d109561706281476551e781d2e5c4c56f0d827326d0417c8163b498440e335c73f3060935e687a6283ffda1fa191648244086e247fc483985b484130cc9a23f92de0a3dcae5dd00102269fd838b0981e03a3e2d52ebd55120270eb9c41f0c4e63f5212820aea6b03cc7252f7ed34f2ac176184638b023961fdbed3c595934e691bac91a4bfb9050a47c616bbba7291207bc346abdd38c812b05716e9e8109eb2d18b5e423b8d5bafedd454a416d800b3a341f5c416dc14ff8892aec3b59aa29f0c95f04efa8138a370b1830113fb7de5abe8e3e9715b48e828150bd6402fb8d8e27ab03632f68e808b4e1495b00ba169c6bd77f05b5f18c8183e2c2a32a2cfb11a16d794f6f0b683f6eee34b413c6ff79f62ccd3f04105fc677ab66c659981dae5512149a6aed27ab934a67af5068d9da90c975ea50e821c7b7321c0624b68820d8060fa63797b489c2a59354c27f200285b6478320f20c816ef15080a9df82f58afd0c9889a22a0e52061d9736faf4511bc518a9ab135024b281285e325fa0d71be4054b9e4464b5f52b4d969d4fff589f8353bdd1c08565dc79df6e346a666464bb2cae6b17411df63b969c6d1585493aa9f424965503321a3d135e78599369926c320128bb6822a3ba56bc027f98e16bde1cb13af528c9795a184162569a5750f3c15d200e8a8cef54431f21cd0b887bb6c124d0c3a2fc752af735af2e8c9864bb561930dc26b78c3fd1f39dae0b27164c5eec8bad813e8a59c84c8f358acf64faf52c754484e7c0c141d07d1ddc71311340a960093910c03aea07efb30a4bd6cbb3ae5d7fc422a9f68444d3210386f519c9fdfca703299d2c4c91ca1602e6ca250a30da2725b23e25895c3e5ab9cc2d8b4ff37ce35b308afa874aec74e17987ae1bca1635b711abe18669d42b3d89278eb502f253cfec72701645e3301954d6b861d09168f1e95f5c97ba8b084c61e115ad1a307530b47840472cf311aeb9b45ee6dea217beb8a1d249a414c279d634e58f03c8b47eb9f2463dcb43eb2d9329d1eac4c9c9de5ef3145263d22302ce4be5fdc7511fee5b2129365de7db440714f840559886c6a2f1a9090b664f6f97ec2d64b68d0b684bfde0b23b4423f4c1ccdce980218f0060aa7ed6f2bde05c49706e52bc0980dbf1b9df2c9c995e58f9ee326bb891b8062ff476a951c308934a88b05d13c9e3f8e9cc51edefbed45581b08488f2a2482d87d8e7f786e8ea736dcaf1f42e263294271e7a456f6c62d57769ce0eea2443c6a982033cba8e81513d4af08606e1951c20264ecf68494839529fa6180ab6bd3e32923504d8ef3315f94a0fa14db48199aa5ee83a50bc59858ae642693ed4cc8f67fe0303f89c1c79712216d208a74cf09eb23338f7211cfc0b7cefa296f0832e219e7c4c07c22e782a1bd909d39cfd34d6528a8d87e27bef702862ed80392e7228db92cb402207be7cf9319898dece040f1368e47cfbf22294e62ccc8100f71d23125d757dd32b0dd216182fbf6695bbd8a89b04ad705867428cba11a0ab9d0d25e1e52ec4d4e2a85612d6214384fa4ec9ea3313bc7f209f42a6884fd3d6ec04b3fe4df6fe2f51260facbb0795a282d805af4274912fbd782b0f412537301c2d1515a8682b48d943e69bc824056a5442c991bec6a36d165cc1328b604b56f1855c9848d867bca01a42468a9a6dfff82e4fc0f6627f227a81c3313c7443f00de5d6c29aebd2bb6d245f373064c413d560add03a07c09e12c90ed3216cbe28348d26eac0b25dfd33af3c846ea9816526b260756005562194c8224cfbafee43e62c9426d0371b4bb39e5594e7502a9236579817a50bb39e9fd8d67b00e36084fd0e0a6d160a401163cf36c318528a048a03874839c7badb4fb6db9efa6eef865d76585434a1eb642d63af80b6a94acacf05ba8a8398eb616cbd9236dc8a8458d354b63846c0668011809ffc5d6cbfa9c6db2c2793e67a1cc0f6586e0685c6eb5285cb7e3fe4ba67fb8420a13bb673a571ed45ab9e34687fc1140dc3237ba4fdb6ee2874db35cebe70d9cbcfba0270e51a4a4cc2dc17ca9496fea4090177227d444c44e93cde37eb666cc3ff3cacc308505b23ed8f51565e365cab960be1e9fb71b0906673f7cc92e5c8b90b3f7d8e206f86d269bbff9912dcd7707e8f01877a23c2a718aef5d52f98d477a08874d331d06804c5652b45c2ed7489c2bcc70482a158d5251c08ed639a5cc3fba49063367488b451cfd00dd9ad0de6fe670c722baee5c302d77174f08a0db5e34a2a733b304857a2282e4f5d9e0d804f57205914676c1298c901f6b6c0216351a53508b2506b325f094bc298030217d670a21c41dca7be0ea34894cb648c517b8c93a6f41724a04ec073453ab5734a2fc87d73fd93d400d15dc86c5c0a121438d64711701517b80d18a986c2d14d33b2f69408f03b271055aa450ca8d96e698c45cfee7810d4860d0e57a5471903d335c62f824b74bb722b96ede3edf3e6bde78b138e94acb59897c5eb06650fae713a2f11c8e51b52dab54cf27067d29801410bcde28f009ac43bc1c7a3ca69a48f4973cb717b98b47446dc59566ce567addce9ee92ae02d8b611587a2f339e81b3dfde650d129b71613c8ef99545d7f5062c5e185ad307530218cc86e67301e8a3385db77c704970d1791c7042b9ab600a823012c942a6ace36b0c44a8debc4352fb328c92f5a66276d5635998146762f33eee1e90e050ed91a1ae6154eb78df2587fe93f862a7e26f203abb1453d908545e85379038b34a6d029cf4980f0c0a157a1a11eabda6b0116248d06ca1a6ea47b11ad902a6ca4cdb02cab0b11d242199d4fd09a4f88d3b4fa99f6318605c321eb137e4eec4abed31ac9fe203fd2450982cb39c9ce23917fc7edf27c6faf44cbca3022f5c7649aa160320b9e6ac59c653bf01583b27dd8ca4e93cecfb0802e6b282744233cbd42d2231774e11d82b1110797f3f7e2e58cf1a7be3e916a271500fa3f9f43a820c63197891c70c4c37ccc71c9e033afe9c63d78232009d1f50d2fea0fa283e5bf650f3a7339a36fbeec6124d94a8e24432f7bc0ee20c82b5e48316acd93a8d7ba6b436fb41f4379fb6ae93b4710bd98e98a0f156f1c24e15756f59893fd4b443a0f086935f5555b21aa08a571a81c20a9289a7af618ba92322507b93e803d61b2e05693e14e4522822e20d7e9f259a70045b0625cbe25c2044a80e8a492611043fe9b40ff2dfb2aad6bdc3f5751aa83aba2f596ffceaca3941b3a90ae45ab505519b8f931af17ae9240aaa378468f73efcd075cd92e9285ca0cf3ca4b88700e85ef4d5c82709477fccf28c5a9ff5058c7eb96807338707e7530381fe1509c80b323bf44d04df44723306511b0f281142f7c0b054adae8209f729ccc4cc75f26ffec6750f381dac965898cad116abbe441423a1816410c95e32c82751fea1bda186a54a3992ff50dd9e4af22db5e368042f33d7666d4c6991d9eeee8d1659684552660acdb9f63cb99d0754c6491de7923513db8db70e430d13ac15a889045d752fd9406a6d8518eabc32c2974d806faba78823f543e59a4cd7828adee173bd4951f780aad0410745d6b9723e345a9da11dee008fa369f7fff721c0af7be9672d8ea052dc4cf03d60f4d4833ceb0b42b820c6c898b2841897b964020b2613b4f362d7d62421311e14861070dc9e00ef409d76d3e77fd35856e906437f091ea364f0588a2b99dbd41f2cc76e46cbc660fd8ed7094b862f4ef6a359eee40c68931227b5f05e1177d642270a5caa967d9358ccb4d2a958242bc6897cea989badc5a3dfe6a366e90a1f6b0c660dc03510add8fef75f3d193dd5c88fa15b8274049f9c126decd8fef6f48f774867611e5cd56b316ab73dfe35290da335ea2fb68e5b333ff74cdd04ebc72662559b5b6b55405740826ee025382363c338ced6471c2e541aec7a855ff849d9936f34a01f922cc7c59d698884ee2570fc457216399c597694c04ae21e0f5a4698c437290536c64112be8ca2a3fb0d442ce234ba1eac9ee5007886c07e6c04d9401886b95a9d9374e6b957ac08464c61842e02441111c01d6d0228f756899d9e9162e80a0eed38cc677c1ff58232cb2abeb9103f579f21a0f6083b78c051f86c050bf6e04e888cbded328614bf62c12aa4592b9a79d0f287ba26d8381df806f74fa59f416a15bd6f11e215457cc66f7b2150f1bdd5690a8526c1a55ca32fbd6ddc135a75692bb0ae6307fa4718614cb0396b27ce7c9fa730426d9c021b10e05f4694c21c57c8de37ba19c055f8eff575dbe1d1c40120c7a3ea8331900abf5b9653204acc99f914726840b05ad3cca8dd53a5595cc6acf486e14bf2d94c9da101a310ee6f28b6cde751f298f5a0c262903a763f0db0f0757fd0576cf45858cd3f7b15b62f0cc5a32e9208ff57e93bb1b067430010cd1b72b307e33cabd84da34ebb3e2be8d4281ce71766947946123346a4fb743f27ed779488683bdff7f8e3c088c2532795871ab4740d21d214885fb1110d34f90af0937566572e55e5664339d3a3ad5242e62a2f4be16b3ee92112f5c71dd637b0be8d58e462435d2798ad1aff1102337d11e5bc813fd31bb1750498f71e7e82e3ff63c18a22234439fc37b33fb80731addff79c027bfe0bf9aef80cbf9e86670c059350c08af7c2fd99c5a7472c8347cd6d69b7dc27232a1c33f84f291114a0901063c804c257b9caf40e80792bad161053aa90b91af2be4bf7ed73f511510ca9a69402126de23e44ee8236ceb52bcd243464eb23dea52d612d015318699bd2d1572712257854a486cd5f44121c6f6562cc8d6e4a7432e2a429f64991763ce737afdbf196c164b8375ddf85a8e5929eadaa037715f90ccd703bd88e51afb913c386f12f3a7a5b9dc921a57d47549354f712085432410e6107d768209c5a79fc730c61d5a9237ab42d9b1d150ccbdd808800eedcd54570226d1ed58191b5611428bf65974193e28e16e5e5ad635de7be7310c4e6f8500904fd117c5f812f719717174fefbc5d9ba5a43de0469f47cf994742e60614df266f8abbf81cca5f14b025715e73212dcb4b01b70ef8f04dbfe2a58734eb27bcf5f1814e302df6e32a531eaaea25060ecebca6e0774010645cc1726dd0c991f8e0ccdf6a0b7d2681181e0c4272a5b59fdb97e97cdfbcd97e77548f3f37a1eac31ce6f353139f23ca952e3610179c3d5a6e0ab6398d70383080564ea8d26bfa4598a1fa7368b9b5ad3ca14d3e5615bd49168c7d99cb5a15baa27a2d02c24ab177aaf7742ff39cb2f63d6987905b50dfead39dedeb5c5fb64042644101202db9ca5ca890daeefa8b6ec5db8a5b4bf833f50c97ba6fac61f5d52a6729abee57cfad499fe8039196f60456df4455afbff2e6158e349607e13e9a3e797976f6e1b8727ec5b06d3675dfd82deba4870b4e961cde19b3e0b9d3e6bfce50fc345a89dc5a788694076f524620ca11e5ddb9508f07b3dd91a246d6db6226913f6c31b1c63c8a183a999fe8fdd9913d3f3dafb9e617d3eb2c9312012179c32b72164c4f1431cadea07cb0f700bc5b01d695c753db68995a0390dcf3600ef0e12a887681fe7e8521cb558fe352afcefc705a9c2a682c87b9c39535c0d4ae5da98997b33ac5f33b5360081285849ffa7b7e3365a4b82c035076bce51dac4615ee8c178ee2f5b618709f600934b8bc007ebfbcbf22b2889cf2ccfce1402ac07bcb31be77d5c19c47f1bd5eca783989d2ba47f3506d99afb411693212b1fe842506ecf7c2c2680445d74a7936d82c161167798337f02f1c9a0d74dc60600c1819381d221ead9c008f37de63da007945ca75e566c2416c4c0ffdbc87a7708fd0fdb4e071c9627bcd9724c7e80040f04042994fedbc13f0c7bc0742851f11d5e9f5aa2eeca8924882e2022e248e497d9b55f12270bd930215233755c7bdb7a8e2295ba477089c7db21cc80cff373a63c980da11dda1af2f6088659d3aa16cab6d56a8076f2f687d022834020ae279029c3c3711adc4f98bf3f6afec6830dff4d23941f88bcd5afa28d3b6487e8d467bcbf4947e6c7d040464030e4c0b996663044a7d9780e8eb39c321aeded2f3cf9b9b007e32ca0cf3a981046739dc2103348c048bb01718d8a2f76d9ee5dc08cb6db1807c09ed99d3ae5c7187fc725224ae13a3b362dc1e8b3d241f35f7a1e5ebec673a34454ae06eb3a4599e91b6c30aa4955c720117c1deac3ac0ee408716c6c73dc3bdf6997865d6aa06ba7304b50dea366a74a2ce744e6f9cba740b82e2054f8d7c4f152641c2426395a9fdeb070b7472b519ea1429daf50d439830d1109b0411ca4da0686f0fdf21176a2126d11366c3fc093bca6fa82bd2371680d5ddc10ed06052e1e54750e41d710cd2ec8091aca4fbf3a77c1810f1021eb5bfcbc80ef50f4ae22b1a56a7d35e40eb3570003076e3bb974ad9a868cf0e7704d74b2715c708c31d8a5702f54d5b0bd1bf6813e55e24b6e559c4c5b9a99c1b234804f9adc0ed5015d773efebffa87c3285da1fa1d02b6861b54b9cb50c69d5997e877a91d13906d11585a7ec73ffc8162262bcbcd35ad19b2580349e6a193f304357d60533f466f86100083a7ddb2eb022373204e02b5e6427c94262c342065e4764cb3994e2b6564ec3c8e0ca315a7b5d7556c3380e41082b77f61c7ecaecd2fdca1b14ae5882a78bfe72c83e24a80247cabecfeaada0e9b9f3bb6ed05c5273f2f173c0ffb3cc40999c5c13aa4694c94f8c4cc3482bbed0e2dfab7d5ae4d89729484e74e1657c5ac26c774a55ec87c573ccc5fba3f0cb3e7bf9083a606c1d05a4e3505809152fe4867c4171526a4c3621febc44919f2375f2eb50d82ceb89b99d7a31b99a7b304ac56ae1e6a190ea7586e14d321f3cef47897e611671e301ba990987335fcc3147029534586148c347f28d5269853bb8aeda16a214f8b193446e98fe438ed52f07a80bd92a1eef4849742487bdc60e75c8546807bc6bd5fac54a696309ae9dcb481e67e33593af05755ea250baa7cf5bbd0f43b10b3700133c7719cc3319b2873119f4dd9c18ce10b6781b08c0d23a27656be34a5f3e5443a7038d6bdf178e582024207bc017802cc7417721165c42461f39e83c3cf6b48967887e0c81dc800d6aa969d93cdcf5178a3c533d2819f05200f44e96c01e24dabbf3a7298ddb3ed1a6ed1d0ef9e5dc612345e346644b7bbb38c697f6be9189bc6e7848e2006efd692df7fd7458adb04449d066a6d1772e80fa7ebc752c98dd23a4969b53365b52b19671d5a3340bd9b18ea3af53b1c20c590b1ccd985d08e07ac6e194cf0b0f4535a231ea87a04f70d27b5ee1fd61d5bfbce070c687d4081611d6e9f1de9a90b2d5789c0cb92678f121a13f1d17cdf07bb9aa30a04df694d29cc27287b8516f64dd2aec9b62c216d1e5dd6522ea5efbaf38378e721314ea45f3e0b01d9e1a7be4b56385e63187206b840f1417978e4189bbe62e07a663a84517320f0b9b75781c5f851a9ffe3212c061a4a83423c3cd0b76b0a10607777479f41f1a44c58215c4ced588440357bc3825039ff5ae49870dd6c1493b27aa619f290565da2778d4f8bf0d36f9386b51cb660a03348b6fefddfe28f315085a88052678a3b53a29603c90fb05c98f917405c109af15de8c0986be80bde2d6bafe950d8821300fb77d0626b2aae8a8c59b0c6c9089cc644c5443cc85c037ecf502fc997c3bc4872426b6fd374e60ab3b5eca997ad933971c1d3979f90cc0af3bf94cdb2e5aef06af7a66de5f02502231c7668668fcfbc8330489b3334b38f3d3d642cc904b304ebe9d843e128a96afc08dd59e1fc9e68553083f42383f68feb986d62f8872ef166a3444f490f4a497ff59d3563c43ee68ac8b216e0e651e8e7f83b79923166b45641052822328d74f40cd10e97a0aa5baad11a2a087fb2bc43a17a24ab94c62f8eb437dcc030a6ccca215527f21d8210b70a05c693b21ba49aad25d75cc18a14b2258e63511a4480e17d41fc29e3246bfae83aeb18c266264337e26209deb16ce9e2f47615f10de0137f4eadc147b5663a661de9f4032531a8cf1ae8a103e682e816caa95ced80da3a37251c5cfada6bbdae92767836d4a8fb4b25f565c0304892deca7f9ea73e1155b12146a43e081dd3f3b70441e64462f1ca440c639d082de64d0b29495661878caf01cc156e1a60cd68041de7ad2f57d5ec24b94eac40ec47d2e1fb3e98e10037a600e214ad8b9c9a89065095fd9d8231366d81625ddf760ec5538a843a9275540707c86ef3f7bbe34449c91531ca4c846b240ab4c58aff7da10837afae9a37e3a3dddd54f231a656a5cc2bdc9076a00ab8d632200677723841ed21b23c3f617b83e4bef727ef34ff3c2b727d44bd84cb130307492465c2058f25becde606c969e48cad34c2033b9581288c19158817fd2fc90c08dd18cc261efb2b3acdf51e97e166e05d3822090bb76dc3cbaa94433acbf198b1b1bdbe5608460e261ea8ba36347f161348b3ad41277b4f3c44580bc8cdd74239901ed390f35731520a08999c022b031579f9699539b02c33f26c4d1214623c4b8ef6e445eddef0cb1fd28c0df576ed545035788f2ec4c647cf2d21e554c9db1f31844a429f4aa73e9877c2325861d3f76afab428460568c2b99ec19505f0a5a47ecb14f874b65181da82f32c636da036427a489f0328c37a87bfe94cd803ac4837eea7f549472e1123fc5e8dd1dbce4eb6a6483f4c85fc7532ffe6c8eaf5bdcbeebd8845853c5dafb976b75db6b216db4a3ff8fbb12fdba265af869da200613eda524c914a30ec3c20d3d4b9f3ad2f415f449dce2d22020d935da785ae54aa106cad64241ee54a34db56d62bbb853c8eb92b0c0f16eb8a75e50b1b17bfc5e527277fa2b8f33ca9d6c9527ccc6a388339a4aae6fdaef0c2a563d33b735b0396c86cfae875fb35927526cbbb4cfa131ddc580202614e6cc92c89ff4f9f211b2a9bb2065b9b48a0baa589201acc44fbfb630f9edfa4ca9470ae6076f4a685b33e3f3468fb5e377da730c7b782bcac85206deb1fe8332c345523c306bf7fe1e10d27b89062bbe9c38392199a4d82348081620b2a61f4aace89a9b92ba5666423efa4561ff786acecd486404d9720bda1259a32024c2b0bc8a8668bf1b12c52eeddd748b369557fbff2579604b6afd92b2867401bc5527a3485bcc39a1551594f31d7698333402c17a388839ed821d5ee14a3715bc0b7b02b690d13282b8683249b20c6df6af5e358d901b352f78f11132dc9857e7a353e722bfc71f28fd879df1b6f5c9d2a1b472cbaed5c07ca9107aad3d4ceda716d23ce3f261cade9f4454534f2b8ba5a25f63ba2657ea3faf66f50d6c2dd00345ab8c1f7c618e96c084cd175a905a926d11cc7ecda2506b51d4410b428f14579f6ae68d0a07cd21b5f8a30ae7c3b238aca7f32f8434e46ca486f408c1f6da8e13b78984f847fae8a88996b8dfbe9b56efb3c1454800aca6601e955945ffbee71fafd6ddb57322b0a596cd595f05ebb6f5a859c6bab6ec9b3af290361aaa384dc5dcccd6f1a285ed03557507834059de4aae8e3c25d140cd99e5dab0141f71bc0bcf400454aacad0a5a5257d481978b7c26a27fb099b9b74c1be25a36905b0fedb15022942a871ab49089f5ae08c07eeea28d5ea0d67f8dedc1cd6e7acdee75b63788b1c598df9d1a8cdb41f4c40b7d8b85e013f63fb670837506f3bd41957555c594025414dee7f103397f5102fc13d0f2f033c2eb1e724b612286dc7bdd548077d9212e638a6b1c91280c997e3bedc30d53a25d063c83b70bc9fb43719afe8f9cda139be319e0336acb2c2c6e0d9851455a28647286c64a82b0950aee096133715ca0eac3f87df0ef807efeaf3e0ca91648236e57d27c4956c757a69988a8440ba7ea02b016d383ac624214b52a754032c7e4440292fc42d246e0c0746df63b081112d2a0c298175c5f882f1ca654afcd7a0fb9b4701e6b8873df30bb943899ab4b2adbdef2d3e36ca27afa9e4ca86365b7dcb4830268a0048a40fb48f883571bd8cae80bd000e7391e0a079ff54311f5f342d4c544cdf0ab83aecf7a02b92ee7071bb190409f1ca21f03d218ceed662c8c53d675bd5ccddf1c24c29110fa71f6f65530f3c2390f609c40b9b368e1cd3f60a0c22285161a7ff147a1b062024b1ef8861e56cb74df6ad9dc2f33c76f95c75b0bb285278bf11960a805eb80f9a37857126c8e8edd3ea03c9c209250aa81c717b66e42663ad2368e7ca1d02658b069321ac05bb0babfb1b7251a14d82669d4c937708001838cfb381a237f3ace8d6a2822b4f2820deb981909536f72f700ccd7ccbabb223fc1d46ece10ec07bf3e437c7a67eb801962ae2e4f7a5c4dd7c3123a47ee83774bd062c15b824e42be25385c94b3c32548d75b6361f2da7d42247e4fc7698909c534364b0849b2be190f6b1a0f6a24f95e618c398f082df960a3256642420eb7dc7d20d36bb3dcadc8b2ef612baa54e0af04c828107531d9e044010b925187d4a1c71dff718c2fe340d05d6f0c02f2b300294c0e3771f2692709a52d5085a8af656fafaca7d60c8d01bcedeb84dbf79180c7d6d4d5e0249864a91f366f134637ab9df57ef983405136190490e8da1a99cabb64c0b52b0fafc1644e4836987c1fdff2b516e0ea01cc64038aa98e865620dc15a703aac98a41a0f11413f4cc162271852ccc38562290f178456a67366253ce004ad8ecbc646900aad0d0b18b8303cfe8d6aecca3cd170677b06cafcf9b63b71a4a3557a3182a6b0cc96e7befbde5de52a6246550085708200892a653267aaaa82f95c2524ed33b5e6ac5f48c78be772afdea7fa3df2808bb4baeeb36d2c01b3e77206383374a348278d2b7ca4b48bc051e023162a064e3b5875e72797acda80f7a79e82598afd122cae16fe8e1ed001e00313abc003e003b1e079902fc0e0fbd44f33a1e7a69e6733cf4d2100fc4432f19f13f3cf49201bef4d04b45bc0f0fbdd4e309f0d04b0878fc4408f1d04b0df81f0fbdc480f7f1d04b0af89a875e4ac033f1d04b12f8251e7a29029fc4432f3de08f78271e7a098a5fc037f1401e7a6902ffc44b2b6ac43ec7741d61b8e58724b80324f50e48eacf2d4ba2f86d5a8ce6a299349b73d34a1aa7d926376dd36c17376da4d968065a223fdb0cbf9764147f81efdf81819b3f1cbfff02b63a297e14d60239383e1415b0c1f1297083e34f0007c79780854e7ae26637e1f811b0d04910b80f40e1f80eb0291cbf01163ac989cb000b9db480ab000b9dd4c44d80854e027273fbe0f808b0d0494cdc256e6e1d1c93b8b977703ce2e65ee168000b9df4e31661a1937cdc1e163aa9e616c0422711e0e6363909dfdc2727117173a39c24c4cd9dc24e02e2f2b0d0493fdc1c7b4a37c796937cb839fa3889879b63ce0e57c7cd71073a29c7cd7125808be38e2c7452006e8e37387e0e163a09877bc34227dd70af854eb2f76d44c514e4813d2d5774432cb6de0c77e0ea474ea277074d1cf2040e0273f0f5d8b11bb0b1cc09a1bb3bbd627bdf6c06e409f70de2fff2f2e2df5d0f2334bddd07dd225b6c5f04f41e905bc43342734575d9de457b97f92ef43459be60d96999cdc67b2d2fb5786bdaf8ec9e4f8fe6b758afe5a4e86d9ff624326868738923f48a9abd1ea7f1f3bd2a9e8f173b6a4b1c69790078dff22200dd97ed416fc3dbf02d02efbe6cf7e500363ce89bb0e182be8996f7dedbaef6458f30c7a4e867d0d8be9f148bfebb99deeee6caddfc3d16391a6af616a6e325efe7c3f92bb9e2159e0d6b71b77b6b699a111abf7957c3711cf76d1f8d252d3fd3347580a669b9be72d28ac8661b5e2bfb9733b8db10e7951ba366af656a19d4b6d92a2de3eff9e07904cff90e2577b33c61ee573ea3dfdf770aee87d979bc4553ee03b7968d342b3cbfc7064f161e158e9bf3d80e8bca39e88178977bd005e23c4ee25e63f9a2472c3b2c3a28a8d97b961d972742718df92c5fd8782214d7f0f35974200f162540205e7e7e0fbdd4f22cde72b1dfb7bd700ddff7dbf87edbba1a1bd787fabd8def9bfbef3a951e7113b6f0c7fde4a6c49f752a7054c34e41b10bf72df688b7e00edc97800a134dcb6fce59efa9c14e41b18deb53e088fb4ddae0fe85e39680280de83feb3d4ee2be85e3beb9cfded2b41789debb1ad16fce6934ba8e86f6332eb2b0abd1b89f69ceb23001cf67c95e2b7b0b67af9585c853b599c3b24bde7325d0e7da4d6a52a42178695eab65b6ffc1518ea668ca6349512d6c70688a32d9b8312a8ca8ea3d08e4d9bc615b0bf4de67f72c0b8865c76bb9b7bcca65829a929f433d9a56d4fc6d4f535b4bfb2b2a77867abd568fe663ad16964272560a0906ce9ebd56e6b02a2df3d23334df6e5f7b2d8eebb9512beaf6796bf90a77eee78ce016e22b2c2f898ca883fb19efb8558b6507cfdf5a2d538533b54c5f2211d7f4cfe7502de3736be179821c969ffd526e5696d6d546b26b64037a454d5d51b3105fe13049313a326a3f4f97b0293d545a55b01f9a440a4993e06e9a2b4f2690276e8c3078e4e815b5e5c308fff3967f52c86e8cda2fb718655723a785f204960a9ca9428895a1e6dac1bb64fe4c17d1a379639cd45b8c97aac7f4f0c19f6968433da28dd5d08e1ef5530cfb2513deaf9622cdf710d332f449312d538ba04ca8f0b1a72693095329bf97ccbf3952d9f5a07e4929bb446a3953710c24b5c76041d8fce18d1c6ae1f8051d0c93f0934ac2176c56d8fb951eec7d976ddf32f623f67a14dfebe1dda7a5efc1963e7bdad5fce0ee757065a81183befbee8cb81ef6a8bb59e669117f3a536112c040454acc073011c75ebdb4473137575c6f96f9ee67fabb1d37785df7a018bb9a98875d4d90eebd2547b4bb45774155d4ee3b9cee21aeaf753555a765206686eac3db78201e64638b3a353edcf8458f1670e335bc647b01425f7bfa46686a5841cd1dce843c628cd0f578c9062f69dd678975781865460f61e97effe78afbc3f11447f1efed70ba9b25b6f7fb5b017033ddac0d37a25231da60632aaa228e2827c5afc1429a18ae061b696268d074385e2ac249f1230f5f07f0de0edffd16bda383b4cfa3518cc97ab2b9f243103ce2e9872082f8a1ae3a1e3428a1613ac38fd3c40f82c70f2dd332393343fca845cbc42a3f64d6aad2dd401e3c5ed2ae08e8dff8f8d98e97b29c1c1c3fe6e6d4a0e60e67ea74382b31ffc2e37fc87a6278dc1e8d79c47cc7e3a5238e7af223718d55573a42554d28032e09e0c664328d800626010c281cbfd3e1f1438cf511468f4c46a5653a0cd87ba814c1c3cdb40ee0e6daddfce124358b0111fd85386f5087f8acd5ddacd5d3a398f5cc9eacd532d027ee30a9a568c3ee78fad24426029ad8d5f8a04477e5ed9ec80ec61d3ed4f8f0d4429a218ebdffa2657cb83b3e3ee9917de95e88effe06fbd2dda933bfe872eaed30312a100ffadce14898a3bbb4479e078614ee5e07186c700d0c9300861cfcd204fc22b3087d130e2f829fe99859f8f4330b1f6465ae9010d6f114091d3dfc773f1b4ba81d4e90fa3a7ca6b8bbd9c8e679370b11826bb511773648f7b5bb4808d3203a7cc4b0abd1e1d6eac4fc9726a03f7c48033b25baefa16473c43dfc8c7b0f1662212c115327d3ee0838be0e36772c1c1f075b24d2c8dfb6ee576c072fc812e9af47dd7bde7d0e60dfbd87e3e1b40cc847881fcfe4f5f0f1bd213ebee7f1f0f13d8f888fef79321fdfb3f171c663d232f987e7f1f1bd9b96c940784e820802db364d22ac36848d421011db4425b132a582da4929a794535e524aafce58915e95524a4d9b6157bcaf1e8539c16081fd65666a192430a796899f7d7735198c0906493c61a9820a13bfb9cfa409c7cf726cf9de0379687f61afd2329a53796fb58cf6ce719b9438bd00e34fd782bb17bc0065c2d8a6bbf768d9cf787f1e068631c1208940c09c5418de60a4464d0ad4f37ea5d6191fbb396f06cda733eea42f3b1ff3b99f35d15bee3e29a8f0359bd9fab1da7ecfd6ef6cc661c271248f7438fafe241f88237d1219384c2d136b28c98744060e13e5ba14541c260ca3f492f2b5eceab0a818898c914ec3ae8d5c7eb160dbbe370fe2cc3201698e54e13de8abe89efbee8074177bee3a4f12106f9fd9e8237bec65f723db2ee8545f8cc87ccac5dea5f428fab8b0365fbbaabc388951acf3e158eb928018039daac4d9c3a09d8f6c5ea06c046b9b8d5889edb5cf7a6cdaf515ccd15d6a45c56e86df1312c9f0bc331e068ebf795448235a4b234cf792f4a7f5fb91ebfcc89f9f9f9f9f9f1ff9f3f3f3237f7e7ee48fc48926a8d3d1fe54d019a8096330a70963823932614e19cc09bba02aa409897633910ccb2cc3599661f9fe30486090c020a12639868d48d6edb2a59cdd2fedd52eb19ffdd88531f5c85bc2209112e6d4dd2e8802e5c8115078d483842798070ca320e184dde02c4ab8458b73bc59429b6b632e621abf493ea41f8f41861419e2b889748e9748671ca69e5c7735fdb1e37aa4837bb483fb66ec3dbb797b7ffa204ab3aff46622d20584c4f32e77b3bbb2d0b9ab3d77f348c72da88abadd2ce4f2918d04d16ef61ee7fb93c88840d01be4b1cb880dcf7bb14d5e59b0582c168bc562b1582c168bc562b1582c168bc562b1582c168bc562b1582c56ffd65e3d1d1c93a9858363c3636393e2c91cc3ae074683285f8c747016e22b8961df4dbb27c5dafda524b99c7235a5bb3b17769c6c37f1493e1287a94718cce125ed3bc69738629cf208a4d14959bc777559d24fd4113b5e3a184fcc46bac88c52c6ae0c3563989496992d237f623718de30e55586eb0b19aba0a18ab2e4098651702005ef8061942527ecbd00421e517c67416765841d21e8f4204707b84538b8b3285e74e3a58dd25abf4f747383635bc518e38ad25abfef9fa3b4d6efd3c9324a6bfdbeffd1c8d4e16038180e8683834369addff73f1ac5c4d86c209bcdc646c768f4ff7d15c4c383f4f0a51555fb8d644716f899c66121de565e9a4169addff73f1ab1a452a8142a854aa15228961d277588d25abfef7f343a994ea693e9643a99626246a3ffefab3587d25abfef7f3412c5c48c46ffdf57eb8d0da5b57e1f8da8278a884976898edf549b6a536daa4db5a93615eedf561cb7adb86dc56d2b6e5b71db8afb15eee7501c8a4371280ec5a1389dcee4214e27c4e984389d10a713e274429c8e67f24c9ec9337926cf84fb3b9cae1513331afd7f5fad2b5d6ba56bad74ad95aeb5d2b556ba16ee07d980783e266634faffbe5a5d644369addff70fe2e9403c34337840a0193ca0193ca0193ca0193ca0193ca0193cb89f8625d5342c3bedbdf7ded3844eb59eeaa99eeaa99eead3847256725672567256725672569e93d669423e948a7c44211f51c847f439868a6e443d5e8a89198dfe6fb2e886e6f85c613e7f0210f5e010f5903eebc05904b2c05d227fe5a505a4bce4251ddfefd97829e6fb3d1c2f31c04b4e7cbfe7e3a5067c7f4d79c901df5f71bcf4806f087c7ff5594979e909097cffcaca4b13f8fe151f2f51e0fb67a466e078098adfe1f397473c7cdee1c367a893e14ee9335c05e087cfb0c50388cf2147548e291c88f89a230efe1b39ee10e0735c79359f632b471f1f7f436ed48fcf9d32c0e7b6c97d7344f66e129f7b07b4c4dbeca5da0701ff409ecb9e6ae20190fdc671a0b05e01eb14b03d01db12b0fd84ed08d8d803011b1f60a38d93e03bc0c69393e037c05ec049f09db04538093e03ecc849f017605dc749f01500bf09f809b0402c02e03361a1936c2c61a193fc938047fc803e2c74520f5b63a1930a6009802d74d28c25c2422761420061e1f3b03f94ac8c0f90871d2cd461694fb3bc0e375396cf71736579989b3f7fccf202b8f971dc3c6279d2cd3a70d67a323cc254331d00abc2fd38d85c6dae3cb8ff069b5754b8ffdabcc283fbadcd334cb8ff6d9ea19a915383b5615fac8bad613fdb62695891cd302794bd546ac566e853b3975a31e55e755ef65250a76d5630fccbb6e2cb8ffc9ac552304747dc5d6173cedf77208f785f8cf08f1f2fec91618f37de931efde6dc06a706f2eba5608e7eec3b27550a99d9cb8ef08b1111cf34ec8ca038078917a778523da956ca27859952d82985a158762e1b969deb866507876527876547876567876567756a9d7c4e97e9749d4e17ea74a54e972ac7493834a7ea7c3bbf1af1e4f4c4dc8c6c5ef5a56afbe053c8679a70df384987eed4d5c7f33da31616dd482c266784f3375fb7971ac5fce8fbfaa5e0d649a146961466d9c11d5976b055e8843b740ae5e0f69cd913f2c11df211dde09ea21bf7c1549d14bc9497a2a16a2a4a467048e0095ff842376c786334fab7f1410861e56c6a7cae06e8cb62cbec1640e46f9193367bcc3a213fbb45a893fcb19d0fdce0eb63b7048ea0f60bc1e80d82dd48d331365c016510d044195b5bffd6b1ebce5d4a29bb39e7bcaeebba30eeea300cc330acbbbca82b9e9e960ff7b1d37176014218f3811dce73e6304207dde891539863a6bb063938a65436373839aee33c3dadf631b99f60c4c9d1d959f1f4c4dc8c6c5ef5a52a2a9a32d4d959f1f4b47c463b3ee61b9d9c429f3306cfdc3b988606eea0522995cac6e6e6c671608eebf060082184d0512a1b9b9b1b1c9c1c0c21843042082184f126e2f8984ca7130a954aa954d0064208757cc70a7a6ced308df20e8c8603adb2a13715e7cb799dde91b075d1449bd8d3f231a16ca6cda4893cfe3834a7ea7c3b7f459e3b53d680650f1bee7c3927934d4299aa49295fb3a550cfae4673ad72156abf711a57ad7cd9d58024c87a1704a216f42e41525ed949ce42ec9ad4a4bc2f466c126f97eb9146b197f44279a11210837a8a41a3d5980d3992ca2be3a46c819498bca6f46c3c1500b01d6c074f29e5f56e7a147360b2c99699c23959060876480a6c1043f8f259009d09d9e3df2fe50dbc58c10e86c1d08b1528c19bd7b00a6e4c4e8c8b9f653172110b3c6be42d62fdc62370556ae11d77b24dc942e0148ee368b6cac0c8a890adb2d5101a8b2ff4551b2dd35dd7752970ef50ddfd4527039b4e8b236a6318e5260c11ea445942cecd1294e0284b488227ce1f8ea28432bab5e83a2d2e9b9703602f1fc8f5f3b12be15771f1541f57f74ff72a257538bb1ae861f8686fef66b5b39ce59225599225276bb2266bb2e6c5ba5817eb625dac0b63612c8c85b13016c6c2288bb2288bb2288bb2288b66ac8c95b13256c6ca58192b63659ab737e8543b7635b3abf17a75355256acab997356dad55cd7755d59578361188655adabb9ca68b57070e8d6f9e8ef5e813245f612fb8778362f9188e38ddebfc532cab8ca88655c65984c383865d8d89471951171ab858373951123175b8f58c64b1110c7d8311169e47759c802134d2331ae2de5da1ac13ffc422f624c0313c730094d30421a9e48c80362c8a3314c42138a803f07638337b2b756dbf7401d7572bef24d938dbd3f84d7bb16b0fb16b0df4f82a494202ba583e8d6d9f8d8102a6216a9c7f99c1d42457cdab28214e78110927ae00ed877ee3c70845dc7d13a0fccc1c1116721be1a6752b03fb502f630b0db88398dfe15ef92ed3a8f93e895573682898139c198fcb70b2626e6068cbbc314e05edc0ddc365a66fecbebe7865d69a8994ae8244d3a46e9bbe3a017bd1cfb49f2f93975a6bb53ec2d0c6fa0ee7d2aec2f4fd51fb3a933c9f59ccdf5530583faf24335b3396d9dd957283d720d4aedc129e9917f4f6d79c29acd150af67709a92ecec68f3082bbedcb8ffeebaf9b43533c94f3d2c3f1f5a110941ea9a0e61014ec21285b9682ea38a4ea91f738e9a6e650084acb84b2cf21306c70e8c649082747e70bec9f432b1c92823d7b88bfcfa129746a3524519f3c1d99dff272c120d1342d6bf96ef92bbb5a6e8ef0c77677f7b7d8979b8db46645375b1797cf4c3048b277f9abab71c934edb339e2efa7af4ba5c198fafac14e40359893e8db66545a144593f4c8afee0ed297a67ee815b50ae8a45c05d672927fc8e4241f9817e0c89f658c8e09cc0b90e4cf320624f977e7c3713fe8542baee143ceaec6b360547e7a8455091de9d185fbb70b84f55c161f98a37f422eaf7d0eb9a4b4d682a65a2c8d19ba30d532599ab448cdec3f0bb1288c1a367b183428ca3dd302bb290b69bafabadc94b2abe97e481113ceb23065613211c9886444b21a5316d29445259221a126acfdfc6e96263c893826927d96c88543a62ca4298b9a3f602292e1d0672299c964c228910cf70f7179449ace50a5a973417df9a17dcbb768974a933c92515aeb756596d34459888644560a89331858e5255ff98afa8afa8a4a53cbb4bcbf3cd2325344ec3f2d2ddf5d4d8bbbbbcf196af6554b952e61539ae42f45ca942954a854c117e73f3de2aa4aa27ae42bff69efe1b97cd5b6c6a7dc18b0318d4c05aa9be92d515796829a250ab7ccf519c4d9f57eb9ffa5658d1b6f18a6839bcacdd767bfc10d762d3717c12d3f6d7fdfd9d2e2b845645d1e7622d1cf965d5f5e6ef6537467763dc987f483c3b47535d78c67f67a9165f96c84e4432223eb6aae16fb4debe2f2a227fdb8b8bce85d5eeb6a5c22e7624539621a982452551d07bbebbb2b6a90f9b3bb5aaa5a46a68c489b96e9d6422ab96a44cf7535df90c63ed8cf15f5ca80f7e0eb06a1477ae4117b5733e7c5a9288bcf16bb16d496bf422a89da7248957963536d9982af0fb54c3e424d3df2a149548f445fc81492a89671ec8ff9b40c87fd6037e1ed08769148d37afbacaf1eeda76df9b85d575fd98811116fdb6b365fcf3de41eeb6a84780fee9e8685f8ea6aba1afddff673be4bffd75fa3bfafe1afc73a246a7ccf9736ae7bdd201cb841a6f6a3e5fbf6ec40d432adc5e6ecb937008d24e66bef7de8af17893e764af47d69f9beec4bcb677fbdc8beb4dc2e49965d3f3b675f69fc4c872ea88aeafdbc41687ccb0de2f2f38578cf75afcb733f3b23b69f2fbb1f2e17f6a86bbc8d2b5f2e11c7df5fef1d12dff7c30e891ab73f53813bcbbcefba1efda0efba1f6d395095f4a863f96db6f6d9cfef661138129976559b88ab4df7cd974d8ffc2f9953fb73555525a167d93ec41262f9ef7bef6a58de086ef9ec353b354da3f1a2ef925496e77e5ed10dc2f221961bfa19ff208b88c5058444cb1d30825b5ef4357ecedbf23544db87429fb5bccb6bdacff9bd0ba88aef350b4252bd077f57d36a7ccbf72bef22fa96ec395168fb5028cbdf25e258881038f43342a1ef80119cbd689b3617497549eafc968754e0d0c3ae4b52f3076e70e67e5e21de83439f85780fa6f1dc773534226661f9ed67d84c440773bfc27db5b9480a735f552d73ddaa24d34077897c4d4ed1fd10b914ebab31aaaf3055f6dc675ff97029dae4b09e2c51dc45554ef2a7b4d6ef83ae7a292da301ef711e5f7909fb2cfb900a67b33bc208bebc87668b971f17cdd99ae3c66830b04a55553df277e94a50618f28941e49940afb6356da9644713da859426999ec60607f7faaa24ae88d3bc18e13fdbde710f25d0a89a59057a29ce4fda94454b49166e28927fbf348e7e6e9b1b19b9681583ee6044b0c074bfabea237fb142c3f73be72927ccd5e18fd993682e325910167c4b1c2727c061bdcb6c79eb35962eee5f512945dd95fd9cfcec77cfa01311e21fec418bb3dd238cf45b508a374828a31b6335122a59c1714274f300ca3991430344ddb3827559c50e9ba0e04ea020b5abbd002dba6e02489f4a28b15eda2099e85ad8b31502c7c00c107084e5640500204327c4c7ca850e9a874543a2a52fec47090e14b467c498f334eacabb92eb7979d525e9b747971556a31c21b2398181923ef0de736ed9a1cc6451ba163b7ce86811a1f7e2b6099b1523d50c76d5a46b16bca31bca38701001b6ab0f1e252e36ba1210ab1cc58a91ea8e3362da3580fbcbefe8aa558822ff4e19113a5999f419ba9009259243b682486612ff42e219f094823bf098f66528add25134e2b6d14353e6c2987d038eeeeeeee8ee38ee3eeeeee38ee5688fb60771f299d65bb4b39e7c5b994735e1716bbdda59c72ceebc230fa048c9d9c273c52729ee070f3ba308cd2acbbbbbbbb27776118a559a6c56e77292746699669da46b34cd3b68dcb6eb42d5a2edaf614ee29f107f7b74ffb91d953babbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb230ceeef517b0f185250fc9916123d5e231e7338210a59b66d14bba6dc36dfb69ec1766d191740b8b87852030d571527e86ef768a36c6123cb40bd985b13be4c0b52ca39a9747104c3304aa36c91925bb0608b9fa9640692b8a2ea48650f7c0b2a4d723021c8e90506052433a69c5975777777777763ed4d542bdec38ee9a939bd07f4923d6370cde9292d6b22048c6210488f302c872639187bc28b895d204d96a0b597dabca05713b6b9caa4d44226dddddd6328d6c591293bc677c4f470f975e510036c768cf409e4fa91d735a5bc308cd2c4a4ad78aab8ae39e709685f32474a79e5ca027c5d4f43d7350b70494aaf2414dbc2c6e58ec7e46ce1640b1e5c4fd8628c313239313912e2411519852656e86ef7c824259b4c81f0e19cd715c16822064a29850f3b08a5c919a030c9f9b813880753e21725284984d19980e1d1a330b9b911850b1b781c080402795e142653b8c83c1c6c5d4ebd914326dcb09e2ebfbfd9a6a9a7486fae9faca711a4369b669b06368d95a6ef6dbc7433bd1e73269b03348d763d2c55733d9970cb8ab31beb097b3cf1723464a23db71085074a68db6c504784418d1e903848bfff46ab93ba360e5a20c10db2882206121ae0999ee9cf2318c4e82243c3089a70822048d1424a0cd436d34da2904d49774edf0b9254018a9312ec80082d2647703759026ef746a271818a196e30842a0c010b343d06dc4d4c4b74132b64584e764dd1e6f53b17e0a94076b915a2243ec5c0cd199e22720a8061d80faed9e40c20974f5c80a70214c3b0274edc8561ee18d6326092a38324a0cee961c75c021639c0b0d913e3c206db85611886f509c3304c0733b8e6bc0208255c010823f0410c5a60021a4c0c188bc2c406635bf0006333e3628b6c3e81653c39d01c1ed8519854c1146798035b5f1a1ca7ddbb7df44f994a6b30c4248679470ccb400378c216e311b08780f2a3d8e53e6510a7a7e9cfa11fc23d1fa23fd78e19e2f43412888e3ae20783903c300f7e8439e25fd2db3615b2250cfa6bb753a63678c365a6f81d1e781d443e47075e00523c69c8efc003073e53ccc3063e53cc43039f2be631c4c521009fc348c81f91813740110f0f10e411603f02a08697ef880950e3f2f1a311f2f131539cc4c3243090800444f115b0c067279e0171e5a197de4bdc47ede1f5335e6ac0470740400254e7833a5047e6030fa14c08e0088a87748a9b69f5c0cdf52372f3f71db8f94752dc3cc2436e8e893b1cd88123ddc0cd54032a1c69066ea6426ea382b42adfae18b8b95ee066da51dc5c2d7033c5a51f0610f33ac07c576931767688e8d6e2056e72d22800387c7f289e13cf9c7125705403478d4e8f53fd26fa406197fcf01d57827f61bff3287f36a0bce42d27f9a030147609135f0407bce4c3e5fb6b7c2e865751a99a060abbc489bf80977c014b786986162fb8617954bd893450d8250df827bc244d4548386a1d2fc5934bd4e8ab15a268aa75a0b04b26f0457829a29c744508a04cc4028efafb3f0a85cd70f378a9876f1fbebf5b5e2a7d7ffb78e9876f20bedf4f5e0ae2fb1de5252188f87e577969e669be0bf0fd8ee3a51eefe3fb5dc74b3fde88ef47e25b89eff71e2f2dc1c4f7bb8f978078a989ef97272f29e0fb254aa6e817513155010a4cc05227c115dc71c0cd50c7090b9dc480bb00ab00db84854e4ac045c03dc05dc24655f431c0fd51840f7b6333c415c206619dc4e3fe60a19376dcec291c656e76949b3cc7556ee337231b000b9d94c3cddd039d74e3de60a193eeb5b64f8dea540d1b75685c918d2b27addc6a4136a69c24552c54787bf701ee6983dff2a21a57030861848e921263ec5e61414a39a78a07c3304a630f6be3344dd3b6cd25de4ce9baae03817cba506bad2b2b3da118435d7c18823647a2fce00bd6260905894cb0753fa8f139d7f901959f4ae42186db9c3550c2440b255840a981939ff8f40bec1f953cc1710a8987c4a799e7806e04a61d1233a35996a9c01187ab5b7e47ed27577b14af74f944e45f2f3b24a2f6d262797344622211b988737c8e4362823a24e2c76cf3ba1a7a6fe075f0ca78034b3ba35322bebf7f9645c785b4425a21ad40c9d7e28b8febb13782cbc0fdf243fbec7d6853d3b4f7cfeecb9088fba79038fb211eceb2876f04cb4e09f9da9d4289f8d99d22d22b3f5a618337302e62bfc95488d50c71cca9f49e714298037bc843a335208902a1fdc03f4c7be8935a29fd98a48938e4713dfdd845d4e27354422ffc99371ec1f44248dae803e91e7a14d332503efdf7d2fcede68f4a76739da2dd4ca57c5fc0a61f3b1f146bf78339e84b2974d7234a9f7251e3e70fdb9952d081024547272727479a200a92275190e44441921305094e142438148b0f6137dfbb4cc6a72f3fb317fee6598c9ca42b9054a76c26601896d197ddfc4cd3368febb66cf3ec11cfeb401fb1dbc9aeeb38bcd56859a669194631d8f5bcc1767c06d2ce97d864c1c42e09af2635e609609f019faea854ec17863deb189a110100000000a315000028140a070422a158284b544dcf1d14000c7ea6446c541cc9c37992a220638c22041143000006c000c80ccccc28093efcb76e8673b481808b1098b9df6c3280ead4a51c0004bd60d7c184664f221aa9aba56906e01e9bbde4e6c560b88103249ce91a15ccc810a23a7264550ae19b3d3be49886d6272272acd5dad876a247fab2ea8796bf2b175a4ea4ce29b6dad27e2b3be0507d9e4f430a64817c3a68d18bdfffb7c0e6bc05a7c677b8659b7cff7957d906210bfb19d57213dcdf1cd79b0946c52b5a789a210033b6a871fe7b87197ce185f18e4fd126f9bddd1a8d3293e0b317160d9939986b389650914a4df9cde61e0ebc1860d3dca00d1ee4fda2ff9c7e7f26c7a7825ed3155c37ad36724f55dee63dbbc832f4982229883b290832153279ffbf12b9cec25f441165f1aadb388dc1b6291d0f9916e358a93b912117467a138d99635acf37a74981202da62b662186ebd22b387409f4a207c2da33b113ca77ffcf4342cb1e8d9af54ac45b00d71f68e32ddbf241cd898d448ce3bd0d42dfee85d5171e61b7be79de6ff7fad9f279d34d5d187dc929644f9e8e27e370f52dacae375c5b78201888fd2a95ab5443b7074991b2fc59e0694d34a3aa916e3b09c6f405cd241c4947425b823e2673871f04c395cd950126abfadf60f19facf42561f5e62f97b493634c8077ac58815fd7c9acbac25dd1134e1a9e8955ba05fc4a7779572924206e495cc1bfe2dc8770729bf03014e2e1067b2d32644b5190bf89d45a148be94be1db30f0074cb6deefb63408de4d1a4832d9fb32761f3f51c9d13ed96be65bd4b8ebad59b7ab818fbf5d4b9bf72f070f7f9efaf0290a99875aee10bbfdd66994b3cf7168ea813ada644f83b3d231446e3d5ba008df269f1dafc7139218a9405420a2086578fb7f345993593ace8b1e951074dc437eeb11f3b2eb8d0d7c92d14b9c5d76126b61d1391599efc75d5066109da8a34ea014fbc717bdbcb9c4db46d4e3c6a97bbb147fbab88679e4806d016e3a073df633dbbfb4b3fe4e16dfc3f25d58bf03ebf761fd1e65adb7ec2dc11473a3a872ddb03773f8aca9b74631c53b1770290969ab7d0a155495f3efdaf7a3b45252680e1fab7760f50e2cdec3d27b587b074bef60f10eacde81c57b587a076bef6015211d415081abb311e247229506e2f6e690c24efc8926a06f8b8be20a59c1db63afbb2dc4fab356c382bf8ae82de198a3b77e70f918a1b72694a792b508bf6bfec3b71f5cc118fc3d8766d2ebe7c4f6a1959e60baf359432f5b133cc4528cff190849a948a89e4cf05f601b599660ce69a46dfa4b798b77091e9871aad0d2d0313a765b86fcbc8dc776cb93984678ec8d02b7cb7b0e77c7d4ed8edcb06c0e6cc6e263f6517be321d06c28050e52bc1cfd4aee99d73efa5a725dd27b18639dad96a9a6f2d8131501ad11f265c3309092cea1685b6d734ad3bdf48135c330ffc47c638db82f3ba4abab34eb3457bd2f49101e00cf386b91d64060411fee4df5b0651437ed64d0190a46263448cc427bced136f61014f6d73ddfe952053587dc8109374fbdf5dcd6d921f94b5097dcc47a0a96e9f92222906ccfc49cbe7f206ec793875f36123eeb07e9c25e20da0a963b60095534280c1d82c49a647a2038e2c6151db43e3d1de9f702b9e5ffa68af35b1bfe1ca942795dd086c27e8cc6a4274522699f40c5e1a29369312f8ba899a28fb4e5228b2c623982af87fea8fdbcefd4629ef230b9087b5a5a7afb04b24d865fde2cd8853806fe97548ed900be54beae0a0b60d3ed3e2ffe76abfc46e78a177e4a7ce8739f70b285aeb16cbb07613a59a870937530a14d5dd2f08d8e965aefce6c1f8ed63954525728693e7c197c3adfd2ceb5b0efda27e866f15ea053be3724ce858b7acdc8e73c630e176e9714f83404c448545a22227e1da05279f4e957aa6aaeedb2d42a1e3e7aca158db5bbac4aa5c3775f59adb91697555171faec29af34666dde82f320566c8edb02869b7782b186312323582439a23950f4f5a39fef3c9f94242aa24833555c2c52f033dfe099a5cbcb697de166205b5e7fb0ed9e236ae8504c9a638229ec0b5f2db3393ec4ba81a033d2d5766c5171099ebeb7ea12942d96c21b0fd02b42bd0dd02bfa26783cf626d720631afbdb54b1decc11b9201eff0cc0cda5faf880a93e02c802de9412c583bfc3701fb5d2d7f8aaf1e360f820e888aebdd8b4c874f2008cc10124144e8976521eaf18c432e8933e349f2cd13e11b088394fb0b97a06608506340108c53a63bafaa0d2587382461e9a4e51633fbaa7bf7120e98d5e7b6e98ed235fa0ff3094f616ae5fe6fe5f007156ef5baa6da1238934129cc84172016b27fb0ed70091d820c331d30068d9840680b416d612be23417c15c1ca0a1136c7b433c92ca222b387736dcc050111bcf8c467b5668d2a898458b80e9b07b767dea9347cb9dd972e2df519017b4386c7bf284ba26262aa44b9f6b9eaddb317bb4209542fadf8671e3c066aa9a34408510ec78b2e94cbaf2d77c861265d8e17b682e4555aba2d0b4b233d046a7e974096793f4e40deaee1ec24f3da208d4b1511de13781ee4e3f04e4605b7563a394cd986669c1f58e055c82bedeb51bc00efe43440ce8616f6a423607e96dbeaecd5dd74d450687f57a2149558ab2aec0c23841c208ec928323831669ef92ab5b4bb6ef016a61267b89b6a4b649dc056d30bb429393a75c560451739b5526a99f25336911fd95d1a309bf345ea7216749b779349e76d97bf33a2d2db4564db61657f1402f3e34bd3568c2c41263daaa75dce2dd621c876990a831f7c3ef0a53d9b594aa54791425ddd51e95fb0276fcd2a747c6426b59b21e5ff5441b1c9853ab155bcafb978d7d6586b152b1725186bb0ae2c986a010235e1f16315b5aca5ae7c6b55402fd5d831971ac729522790f917a30dcc5f337d478f348ad077249a7496648bc102dce1afa0545aedec23d0dd86263a195b20aedceaaed2fe9421a326d7e74095c9551a333d86dc61eff38f41f8b52b3e95638e636e07470210e6aa9a0df10037ff36296a4a4846d56bd1cd1d085cf8b8f0f976eae5ea56e5b0c3eb4b459afe6b43ce15a63ad284b8f5b18d00d561cd5cf0d5463066cb3c758ba9c691257b23f2a8553027f3b59582ac924c2d501f7251bd55bf21f134d99ac2b4e22e050341c7cdb532707d0c900a64cfe9b895edb9575222dc19fecf19bd07a66850c77cc842af465efe1bab92858c2777fa6068a48a01b78584c77fb0da61d33ea1e6358cd16fa8906f5d940479e08958bd32a47d376262dabbfc90b9699f5b8a628f8cf875af71718fabbf2ec356e516b2ffd740048880f23c0512ac31eb80865cf2566f471235b780ff1f6ebb177fb64fca307cbe066f41f2a642d4cee9407940c683267c567a773f054e072e01d9a173027199510af63993d3f916a5ccf0fb8a5b76da1eb18cc910f4f70359704f2289e434c8cfb488f876d2505f8197e46f70efd330f96742ba3f1343f81cdb22b03c26875397e5353a2463b024ccc5a75e6cfe06da6f1b2da36f267c09c10b43aae7e0873cb75c53939abeaab9ba0c96bef27efc2995f538f7d7393962a436f6c272300c1e411c12f00629295323963d439de10a334720be1a2c2aaded80a60b6ae1b6db648f08f94770897238bf96a5c595341be961d3dd445c52a44f4141ef7e94d64331931520ab9372373d676995b4f9b7d2d47ac1a081764dee23383e58937717b591e9725a3c0a2b3323d50e7efd4db70fd3e006cf589a63627687b8bf8362b99b65328cb066e139e132aec0251daa15b178ae5d1df24d8eb190ebdd91889fbccdc42c64629f4c808b6aa0a0bf1364e0bd7181b5f24f1bfbc05f7b64acf8bd47fffc9a30ad4738e698e56237e85e9ce53926415e4625631ae2aa8f0915d1a3b721c89a716b4366c2a48f32ac4b0032257de907dfa8605833dcc484501262a25a6198517ac8cde7e367f70286390208653220c30c0a45f6df6a1085b27b24878bd2ed98c1878bc2182772dd870abe13348d8a7a3735e4a37a5bd801be586e528a7e66d11674627cc87606b71e46c2082d350191d46d9e4f95b74018f40987bf95c7cf96d09e88a34983e02822ff5b3b79675f439682483ef2d9d5daa4a42803488de810623a5c16bb09a4897aed310e4b980f20093e648a27ff6708d15fd47f0771b943f05abce1d754d700049523e95d3019d20ff3d667465035c186478438b5cfc9f4ac0e4b94dcc76ffb8b52ac39b476f5d1ed3db3935170e0da2bdaa7c58bfe6ae54f07dfd7ed73a5a1e87baa89927b44ad227b27b90927aace7e8ff086c10b396f59d591ae79e938e4a29ad242ede8e2c963e048dcf883faee2471f868eb6c3812586fb1b072003da61eadc971e8dc84e955a412bc532a03505ea0db028e04cfac5ce0e870a4dcfcd5c4eef7c039679ee555d70d190883918659eccc2ff599d665690704fa1dd60607932463e6af82fe4617d596e93001a7193853c60ea6a0265b229acd0738e76a58cb0c8fd135413139c63ee5b08177c7235de4d352f761a85e1251413bbae910c752fcd5777b05a40e3e93be8d63f4683080ea8d89fd8ee364339c9958a3010862f476840fd697acf7b9fa31005a050285e4a92c9234aeb3cf985e0db14108e8289052fed0d615b614c8685f171f72f92c1b6b98c1b9e1819997e2057e8c316f767d15ddcc48a4f5df6e1e94047ee0495760ecbf4061fa1983a34cd9ca6e021ce324adb092817d4803dd046df173239144e10aa627f8c42413cc4e88a3b867bc5703f48394d8598ab125513a904598938f0c5cbc480e122e35fb88a98d84dace780844316e52266cdc0b73d69600b4292b167bfaedf7ff69f5524f8ca84f98b306b9fbf78b9d5e767298452bccb15cedc094f08578daa38e7d052aceab50efe546ca79831c0c83b05415b04acf3a6ba5e1afbd862776debe37044372d4a5ab2fabfaae2e9e8391d7fd65dde78e59ea59458112827608f892427ec63f64c2f7d349646a915b0d2d85f4732d1616146c521529ca4d90aa05fb80bf0ef998857ae170bdc763aff362d5953e8d4137c9965bbc3d462e5bd36904314f6f6244102c4af9bee39e6e4d4dcfed381e2b9a0e16a62cfd5b2c925e5105165fff9497dee7590a3672e94e71586b0020996a7b5cf4415cbc4acf5c1807b9fe2e6e01c34ea31c09b1f6507385312ef022fa24ed1ba485a8d55195e62fb61597e39f668fb8898513d82f4dfb2d2ad792dc1ba9bd6453fe1cd94c861c452cd749fad0e17c89fbd7e969a7ee213a6bca8c24da17521535cdae8f59afd5971721639073abb7a64cea878a464bf317942b3bf421f528a6a55e0ec8a6b107253053a9923d54d537446afa1454bb4ddda953e90b2ea96dd30e09a9bf6e1a2a94aa440afec9e190efa60ad0aa502a22d55e34c59df00026d4c57bb71b769d4d27b41c976426839402a52e88400b211344d8b1138876c225a6d31c2639b6402b4cae4c4ceda4c294b5eae6bf0ec6373957f36216922c1906c97f3a07c116fba9b396650f939c32abcf1f7dfe8e5c3e41ca3942c892d07b87bd095a5f7f5661cdef2670b3806c7aced5f4b8b5cdf148110ac279e8731811562f3a5c655755a93c3058c5575c7a10f8f849cbc3dbb8724f12cd852136150ba1bf7a53bc854e401491b5851aff5c3c368296e0d5b9cc1970d405c47be205ee9c8f189b03e103d0a6a6655faaf87f74252e6cbdd9f1501dba15ce4c7bb1cdfd5765edd9ee05965a551ee014aa003747ad686af99641bd5194adb300884feaaac358d970ca605d34d73dbf7a9d6503bb7c89df10c1c1bd68adcc47deff6f88928c2d505b81ed34da7000803b57aad990e3752e2ab50f92babc5a6919ca2b8637312ddb8f5a06bcc3aa4cc6b1c59ea0b38098a09a8dd6ce354888b0ba4bbd8d67dbfd15988a807fb42a740ad3735291092fbfb1301a7895b91f475821d52db17fd8e1c53619f29e0ba2965019872293a89e97681c4e141114cd3be33ddfee9f32ff3951829dda24c3dd064f8132c3669ae193ded1b78e4b000427c29c6d8a6018ceef4967ca91d8f7973fd370a15e2468f91284403898a1e5ef425ef649c3e2e3e88fa54582197023ee4ead4d3fabe73ea3c8ff54e2bf700dd07a59ca3deff5a6b918a00e553b8f67115ed0e1125e19d664ae876aefeb288dc5d3f103ec5c31b0b3cbed78fa0782c894610110038f35c122673792e95fdc693b011d6fcae096756fc521d9a3db27407a6bb0315030326a07f6c57d5cc8c3fc7432a0801f23add9f6ac0f0852ef5a2396b10c483127c541c389343126d24488d97457b605e2905bc2ee5febeaa99c1bdbf962159e56f912beec8aed4826e8080cc459ba130f23b7cf61214dde9486d3c0eedcf439b8bc585c91b1753f378c1c7e8751aa773ea0099e8dcf86580e9a8c391bf98d1a29f036120e12cf5d4c4308dfc21cbf3e8645fa79c190a025142d67ee4eacf6569757d50d70f2332f369fe0ccd1698233691b7b75a33e631eea1d8e52d53b521ceabc0961314501cf5c43bcb796c7b79816cbb02921f90b6c7d918856aa7f6c68048634eeb96106819c4cd8380c5a9870c75065c1855d606f40625fe96e696850c7d95d98ea4b0fb428c87eff4de3ca90f4877010c391aeeb3620148eb7d7356491194a7ba8bb92bd7e479fee02cc9db9579fe6ffa54a44d109898e0a3125871ce2e943e125c77e0222601a191c17a6a7034ac59c997330ce9553472b1c99636cec701f39b22b7e5648edf711bb3fc2ad6a77ab9bd044ef4891157094272352668b2fbeef509ca6be55db486d435809334dabf6f1f2e3ce57da64592abcc25c2ecef493f7288b66661474a66e0d9bb8134dac4541967ee8fe193a0e36d8e98a08b0f831e9f128339c7dc6cc54321c94ae96e28ec6470ff9c4ba6ffd029924ca61efb092a15934282f97742c1ce9c8fa1a6ff29ecba61284bc2fc5cbcc34cc609f15ed0cf73325ad7cdf53f6cc89c9ecaa0c02229d0681ab4124ce80eb2006abcf563890a8051027628bc38e62f09ac7b9bf20f8735b40a6b82b6d56d123fe688bc8b3fa1b21a99a48aa1028580cb0aa308d66ba3634e7bb10ccfeabf235f792845e8ea8f6a6ef87546afbfa796795fa3610873d2d554a2806848f518f3a32054cd85d2b910ab83f2951551e74cae84d503280d125289fa67dfee4e39ba2bffe123fc9c34a5041a2eac49137aa4e9575196576037a3929581c72fdeed9cacb99922832878aedb9c0612d03e980426788d13bef468f900b61c8730db80191c504c7ff983bce091ae5774a0e8f02d0d04923d161922cc7f767c423bade087455c7f5a65eee38f68272a14aba97038134d053cfb60e3bbc38407185692680b234eebdf799a2fadecc5050c5d066a8b5bf224ccac80d9ca3d981de05858875b21d67266d389daeb2da4229c49e4c2663071b369994b54aed62c579ea72f3443b8c9e68a4a586b46d5c5e698f4b6117e5df22b5ad658091a2c388d1dceb32b417415e52d65915382a2f678bbba6aa197663c35088993489a309253f79b0c2496a9a3ff2854223651a1f17f07fbf9f171783c97a40150c22457b816de88c33a4e961cf495aea4f13e32008f8f261cec45d96eee95bb1faba9bb2782687ce4e0a6e02aa99c53d55f944aa69ee79aff8abfa4a3f281f57cfce40508d463c438d6f5ce604934cadb8c9dedb502c5a72772a9fe3e0b54e3983e374e532d0a7dc4c89fce7a049e3f70b38229476cf854d7a06063297d0f290061cc46770ac95b4832dd7341d67d6f184e5805405d3a7b1529a8eced7ba17df0cbaa63528a4ff49ef913a4564a126704ee55a593828be998b6242542e8d52f937a8917739350224ebf3b52208ae09d21df482532cd28dad8df85ebf0152921e78071e197822d4ad99cf7367fe907fa6d336140ab8c7e55c1715cfe46556be98b468f3b118379aaa93d3875398ed73987979c7ff969b6195fe168d3394f303cd218f5c95772532085ef4cf2c180d623c2736bb33043c8a5246435b900c9f856d98b3b53d9d9a71a4015f08bfa1148a1f434d01239a8e9b566b6305f539a1a453e82b47d45163860d48a23f34aabe8fb4be10bd59dd2aea5ff4c9c1956a3731654ddd571e025fa197f08a6001d73af3be1fb98ccf1152d995ec3dfcd3fa69a661e2a876dac360e5c0d8362510233c692f4d53cce7007de840ffc5451df1a11988ff78416741e8d38300b1cb51686adec2eecf24f4a9b366e3fb901b83dab8d76bd25fdb7651fa9388900362992a377a0530574c3e7106f023c228be8ad59f596a89da03324943cf61c541e18512b7beb01f51fb57bf05a799865aecab8ec87a7d88ad3a82db9854b709279e49c15002772db405a368488313175ab72fd5ccbfcde474885815df40c306435538ebcd2d98c0426319c01e4df7f1a91393f9405be928c13df4e34fa0ddc7a4dfece1a25067b29e8f4b14f8d8deef0775b2e0b3b07d1781d6f7789d2de8934fd21c4aea046bf0b8ad384a5234cee4c922a333073b989db1e3a64e06ade838acd88a9a7a8c447e848c5c31b8f9c3cf198c7ae9f8d7a22373dbae008dc2ccd47b5af0d90b52c4d5fc4deae859ecebdd4515c0e756628a047b4eeb3922040cfdfb9be932594abe54c1e6df2785ea4a0006c3580e12629061582a962ee86eaa0095ac1be58ea3f5c736da16863ff0796694bb071a7f6badf2bb1f79c126bc36fd61e45da01982ae97258f5bda0a2f0d40e82cdde70784033dfb296055e7c9c3b4bfd6bbae58777720a3b5c7647727a62cb2ef11e2d291f85ff8162965ac5869021618ac3aa0409aaece77551ae01700bc0a898fa8d05a78ce7d5731da42aa98cd959578df6e5254cba06d69b9d24605d939fb3410791223991f3b420eb9e688d7a1a88d22485e438a5e55a3178f06d5d1be6904b891410d997759f756d11e3dd571d901f238b3d41c8eb1ceadd2415e942f5e8ad05d6c741966d7b41288d1664719f2b4aa4edc96527cdbf5a71d7ac42be47ea5c8f2960acbe5467c6160235eb0e0875f57a06198584cf4fe9d4c0b9289d6ab0c7d95e8325feb408959d34a5de9808a0a6df09e7d20da25637e5c1c359706c40811479d8a3dbcc435809402de8cbf7103f807ddacbc34bbf963e18ea5099370aff05a87c51be1e87bcfe9b2797f4e96795b0aba1127dc660516a0537078a25f025a71ae1c136ff8c8e5a3dca7ecd83bddab0fc6b3a523a9c15aaa1670ff2f2d5640b84da3c421471c7282897a62dda9c228dcff8fade8a0f67d70c16256b24989f9b672f1135dcaa8c79338a805d0aac2e499a6a806c67d186a5d6f297cf49c5156efa47f1bfc93c2755206cee1f1c688a9a4c28a8b1d13600796a8967b2a9f3a4cd9355a90d408a6c9280247bf4baaa173934851a8b9e4994e5efb1a6d9b31ed59406ab788f9ddbcd10aadb8b246b5cc5a6c87b6303f318f44afd4ceed8f7f257d51e9debae806d1e1b2de4e5facecf4df5bd9163380f5f185401b9e2fe1099e25dce0f69813e70c6364c9d11b89e7502618a6fbf21c9c24d800c88dfa3065f8ffa050b6826fc2147177e80a6748f842ecd215282b9c0172868980f63c9d58503a4509b04ba433612da8ef9a2c7fb8386f1e7cd58d50742a3163ad07223cede4906e15a2833bd9b700506052001ec9b05bcb5e03131b12ea8096dae82487608a8c5475bb4ac6163416b2600a6e736ad4a30e089fe73e980867922cb2c82bd990d1d7f21f85c97592ef9d0c7c50ef3a69597da26d3f6dc31e1c2d679c8902194f3539a2e30ad577cf05eb6e208d5f62499b90590c93d56ddbf0556170fcc78ce4c603a8d5886c4e3466260764d54abc8e15407274a5b5a5f3f8e2ceb574630c4ac9cf756c83ef03a19ad67268266c93eb645861bbfbc2a6f51f3a2657d8f44fc50be88335615be2f5df81018fc08bcf079b7956c17598de2b14c1165cc93fde4adf64f4e5a3d4016c2f79c0a688f3a47de807fa823e4cc61ec53adafcda57df371dd8f2639c362713ba8ffbda5c3c6c721c0b5c0b0cd3e02c1b825c52070fe3b47175458e76e1bc782b42bc321904b9a001e5c129b9221fe366d9628779cd556d96a7039804a1c966f9d8c688f85178cdb2d1178735cb1cab2c35cbe2c6b6c545cec9366e644b6cd32c2774725a8d3c6cc9a97cb974cd413edea865b817478b4c4ca096b2df650219199833cd8b10f9f299c7194afc8c4e84e935ab1af8ac592fb49b2f54dd1341b2e866ba8c39713c2d15df0a88f1f09496b62250ee7ad0ed2e709e6314ab5c5e80055aa5a055d98c482d07ac7020e5a75c644e5732710bcc9c78908c74cfaf38ca905751ea0121f7a1d673bc85769a89599a920139a96f80f4e903ae60fdd7d0ee7306762b6c7892d9714f01b363d6abd9d16c0a9f275215a4963bde6a459b53c4098909af500ad729de7d012b9284740da89e45d640c25430ac659d5057785bc238a6bc0c6459da3a96a2a7ebc5c2dba633b0a668f09be3940872a19458619f31e0f43001ae46c47822da000220d1da09279c5bde2293649b7e6cdfc490610695c61a664d44349cd56af20fe0c43a9a517aac7e211db871537d470bb3c8dbdc8ff2a84cd2577cb6f90f08ecaaca572c9e3ab35b1c6508bc227a5b3e251e06c2bb9f2ef8a5a5a3eebbff220205108bed8703460d7759eef982b2deacf380a17ff7c391ad6dc1a403643232790305009c73ae394708f6fdd85c83438859501538dd4230d56303cd62decfec807afff47790de20d70d79df2154198c449ebfd2492fbfa90ce82060b235b63360aa7111a19da121081abffc021d98c11501c9ea5712b8273bb02ce71d3ca9297acb96bd481de9cc5aeb45f7337516cc4dddd81a561a263f2f264ed552e3136bcdc19e31b7931cbc93aae56178c21a3054f7a544a18b2102756aca71825e52d37fce425ad207a24e1395486d0594d35a1f71a640f845a37fbda15cdbf859c0e48215976e5f8749328d534b6f6d43cc47929f9fc42b0589a34bc6b0fa5d9c9adb8fb44c2618a1397d9e4c86b73429b10abd6656888351a9a5c0e26b0f378efda25932caff38baba2fbbe3925283330b9782e75c051848f0f4859054a5221f971e26890af6f38b96b09ade0b2c8825d9d854a5ea68575b146d66471860fcdd88fa5300e43b14c3145657e46a212d821f36b42017b4ccb4a011b72d497a03c17aa62cb28d2501121d7dfa05e7432a307866a7b70c519dbf1a510bc9ce3e7e42054254519e96dcb94698a281c0d3b1c9854067eb88d3e6d276543511fca334a92c1c06a4da15551c8bba39223e86a62f536d42b2dfbf74d09b44172dfe336a4bb3a719eec5ed16f05250be08b7768a8648d0931e531a07061f324e6b8bc903613268ce6fcd603be6762829dbf45c2492c777a51e755626758cccad3c6a5ae1e5843c93b5ba4bb652d3800b8c429b69bc8aa19213a90ab4626b443331200a3af792fe44fe454f3c4df7ed692adf51f7283eaab0fdd69e243682477937dc9b77f47000cd46963befe8b8122fc027381b4119e26cd93c08655f224b024183b987d920edafce15e884399e306d67578f3cb3998417e918ba1c232512755e5b5edd9ca8a1f67d38b3890a4aebebc3b5876c3b4c95f6f54f5e5c403255c091490f934b890ee45377ac5f81e4d121ba3d1078d3e44422a34e8dd5e6887a52ae81b8dadb2b078f6de0be6f474f452fa0752a3c8ecd63ca2d184438bc250c349f109d226739acfb47f1a2e9a6a03774a0f51849ffea0482c84129fe66f2049204cb42745a2bfe18401468f1705113ce75b9fa0006ba637addfa0d6008fa501c3c0738999205bce9c2436af25f596fbf086a0a80d6399a9feaed380a22255bf79d595640bf6c6cbf3d77587f50329c215ea74497489015ca1419404fd4a1762bf752c6f36f50f256e8fdc504edb5281dfd6f4eaaf412458ae8019f1596a17c71c6bbf2bed7172b47774e170a0b7cc8e32fd5012aaca3dc6874444ca3cd1026be3551d37f3598dc62bf7ec6dd9499fe844cc9fa32a7cd647cd7a86efc71e0c03115c576a413ef0bc343fb4a9d061e08078ec85e75432170972827d3edc6240f610b8b82fd664e8f3ffc9f9997e32ef0196cab08691c89d5deeab0812959099ce4fb6726ab6bc849c93ec47c59157522d6d18c329a0cbe89b6d7345216e94ae22261c5abe8a34968e6581cac70a0f92a64b53a916a01d1b4aab719987692d42956d0d0dd687ca42ba8a3993af69b484331762f8b77895e6aea44f04cf9a1bb4833f32b69da5169602d8df20f6bb6c034633749299dbce07c24a5457940a02de958eb35e4f8c4d7c0ba402e061b7be06193f5d53d32c06d741c888d55472efe855df6ddecd81cac55225d1267c46088942a89478da5ce8d4f3036b68b814dfbe3943073d9b081db008fd559a807634ec2151bf16b54a977dceb92cd5c238972602ecbe127b1a1a5355ec9aa529e72366ffadb439ad8c0f86a4af2b306ca2604bf113d7d588406064c30267c5e8fd2d31a3cd050bc448638b1df9d66d22cd0900886e0188c47ed022988614a1a9a7f946807787251b45340057fe526cb71699c079c72daa2fe3e0cfdde365530e9f65e86cb66acd000a6b91a24d6d53df7eb059ce67411bcd1ddeb904563486de896e018c2ebd1cd8c3ca2cc3af50749896d1a49f4ba95a138d64905162f087750c86f1e25aa5119fd2d01acb74d82e5840cfb4e611422102c3093335127a37d2a5dd35804ac8e2eb43e6fe3431e2416375c9f95882fcced17fdcecff10f2f0a7bf270b30ffe23cd266602386cd40ec4301d6acb6a10a22da4ee1d3b905580375cb53c74e6c849a93bbbf0d7414ae656c2df2cd4a9699b69c826edc005ee0a7ae8f035da36bc31e2ab23a5392b7c6c516ac3ce471aad1dc9e325ba7e037729db6b87654d8d990da3f33a0d717c3d803a03fec79c52545bd61f6abc667c02e713607a233164d834b01f01c326a690a33721e7869bed3207c76fddbe7ff1498d2173968c67187ef35c011aa3f47b17b94a98c6b48e92a0058f464bd2363aa36f84409540e196165d3565f739030a7f7d51c6d2ab9cecb8d376f8066a82fb3916a957904943c58fdf2b10581ea8f9e106c9f3f5cc97b190dfd08bfda81f90d800b9bed71c1c7f6b8cd84b6be8baef3cde19aee8070434715a56b2ea42d62b0d3102fc30c1d4a2baa192785a05f50db29fa6ce03e356b16baf4e70dfe2760490c1bc44d1851fd70c30ea2f96054627b0d0926834d518b19ceda02141d32513cde8cf1a919a1daeef60d38417d2b135abe60a24649638d1f8b946013aef2019618bb5a9e72c83cbc457efdb173beb42916ec10518995afd98cc94400ff27a0083fc0625fb4580b4cf3ac40fe4aaa798a1db9c0c85fbfabd5189dab33d6037d0ca87c3ef493c767a13fcff6f75f3ccbf21bf6400aaa1cdc363d50c179a1b657f01accffa7847d711ce5e6f533065656e9d55110899d646d24a5b60f0dbb832c70c5d6fc9c556420129d3061c76fa8d525109a5f3f687630b9b64bfe66728af6fe5eb6348bf230c9ed465cdbb5065d615211b1af7ac9e5db2fe7c89e35d3e1b1f10f07fa210e1473202d64cc21517a6cd89823317b30f22568537a936ebdad9beb8d938a2879f89361f25f207ae3ba88265c73744631d165d1bdf99001371964fed5ee94e973ee86dbda069f0b54353fde701ec729fad07afc2018a8d45737ccb8201fed28d2561fa3d77837cb01916323668269fab614f963e4a258d7c9b4030af1e894ad72da896ee8a9a6d4d629e443514af939ac63caea9fde687b2716727ce6cc82cd9fcfc34bb3117797ddcd36f0e39641d453e0108da0ee90ed8219b7f3b03c30d1c357ce8a7b7ba41bfbe53932c60c467195ca8f9d242889b1f977ca8dfda02bc23d3bbe3eed6f91865b2f7c8f94bc6c0d6b28f69825582942c85465352ed5b90dfd147a66619addd370e58f529e6d948b9143eac3cbb329c87faad6eb7122deb9ef76b5312aaa7d64b899f8f60912d1a2af4791ba2c94219ccb0cf0533f392219a2229d46f98ea42345c01948ca70aed23c95c26c5b4472309e5c41a90fece6f51b4db0bbb13c78d0a11504397f6a6c81941e4279a712aa4690297241a72c10cc3b1ae435c97528861f296bba3cc6660b31dbe3656db24fbcd80c8c6bb37a75902f614f6375fb5c7d7e6747fc742204908dee9e162586ed31c836cab91192b43744d551378f5562a665307a8fd795339e4b08559654f5d90b4acc01ab7856279e2a9f6236b1dd2d6d49e68f16db436bce4afcaf8200718d444d3d21f8ed4db78e242ffe779fa8a52fb9a8519a9d7612777f9bea666370a533cbcab1a6ca5eb6b82cf24352295c0de0435c2d0b227ed6be2b7c8a5c1e34d8ee888769940db9e3a9a2ea383e687dee08b2ed6b3d8e3b7c6ae5e57aa56407ae1e9d3f1c6cb1124f01c3c65912f9f3b14c9c8852e8dbe205f44ebfcb8e7e9d820b71c1c1927ec10ac4c9325d7683c51d3d630223bc529fa1c324b395039ce38ac97214386ccac225b179bc14e819f534280de6df928be80b1599cd4dd8b3ae158d8b29bd58753a707bdc7424a99028f82dfddcca7486aeaa92c1d21d6012606c4e0a5ecc26960c668c0fc035be8f19fe5fb19df1d58526489f7f044a900dae1f73097f2d48549989b271c45c18563a45f58e6df560bc173dac5fb98fe0ae574df893a97cfc72358be8153410d496d772d39e7eaac66b628b9169f787fdbb0cb999383b66ceeed80c3d666502e82eb9ca63ff1e1e0c5f2fcb56429880dd1824c1e7ecd7284138c854f6e69f52266b15100e4e6d750affc094e5bccd2e4bdda74e2b34aafaf93f66d3fbf0804020e121900b6104484a1e3716189854f8bfd266d037e613c010699f34e30d2fa10d75fba35d18b2e803fef3ac181b611285b2a0e5d6323105c1c90b73a011305c74e0fea05782bec9e60f0d17459efeeba62082e24d55577414517e1deace196373ec668538b97ac376e539e3252970329fefb1f188aa125f51567c187ec2877d2f404c3a96f594b60be8d202574a6b66eb6a2339771187acf47bfeb429e5ed86ba6ef50b094beabdcece890007c9d2230019451edb37ebd3b4a101cecad21f466621f9c49b05619b6d6e81e2e869448d9f287a3e20e355c2d24be58a9978d0548c6d418ee43e2a23feca2c3ace9986312530eae50de57203a9cb6ccffe3839fa19df925d6db19fbaa816f65f6c5846fd121412ed6e7baa9d0c8f08677dab4196bb4e10d32707ea6407d0560ca11c4acd156c089a610504fd7d556807a811746c721e11a58b149a7d777d3971bf933cd291f5c46eb4f29a6d9a1fc10922ddc3aa705e11254382f4f124e73cbe9a2ca64aa4282c1c7b522f55895944776fd7aa9cb4905ada43d6e84f4c098e04ada7f8d3d663b8574b71cfa61c7ec54de7e9a1f77f3f4d61db2a2da6cf3e202b386cb60129c7a8a16c1cdcf6e3753c8df8402058133c644e87d5af0bee8d14e8a05464f64f3c44c4d77ab0a381c1e331a8de375862e447a177a38a58cdb863311218db4c9e54cdf50b5b110bd90659b84f244e71e9ff43733857bf40e91c12be5c034c5ecd293279b65a6cd5b895707562a0b0ad05defaa3e574402726e4b3e07cc210532409dc33d288b4b6cdae11e9623c9f0f0f92c1149193c82e224be91829c858c0f3ad8ff0070f9bca9489147ac22e590840c74688ddc499b4c96a90a060ce82b5393053cce0787b52f371e9eae09dbb0462332fc3e8705dd423c53f7758e782eda49d793aa4d65c75fa6258eb93245298ef488476e5f3c53284c9cd47e1c91a09b2c440e5349af49ac5b06f6a39c2ce3fc3552e184006204de61cbd290d1e1b31b62ed1e0514c8d43c28012f085b79e2990ac5001966f3960c806dc8b854ccd01357492c4563bf32481370ea958287218841167fde8a6f8a5e5d09d40a4f9b89343dd4c220ffaa3e5bb5110dc61451750538e4eb97a4ba708fd4eb4e352427a25e7ef34bfbc406331fd7848241bf2adadfdcdc3aca3e560f79642e80298b09958c226c022ca64b2edf1a035196b3dde5db7dacc4b2c68344ddf2a3d6f1825529e05c8cb14b38bac9c6fac9b16e45b36e9e25b8b0657785d220e8aab1958388491108a3e58ce55c5a3d313e2d31a04503590bb94a0fe3fab66711470444897b59a98f99073bad21915a156db8bb1e5bb93496cad3e5071a481f1a57d3b824ed502df7738e5d8d13ef326be6d82df5c9bf1ad72e7ed68661c9a900cccd9c1260f6430d437b63ccdf7bb18a149521c02393d732a2b3d4d6122315cf26d0dbc395261a6a98e88070781adf163f48482117bc2da36a702615255e08fcbe11a3a54e0bc57881b29b5fc276cc3efb0e967e359dbf1822e85cf25dbb152739b1900b4431b0d25713e302dd5600bbba19f32e97eb8a6591c864c10df48a6226a687c007fe5d031fde10dac520f249681b31cd4fde62b48afc3daf3c27e77f93e06a58451b40ea820d5cf37e38ffdd5050dd00f6a5d47904b48dde003f2ea91b407e563a0a6230cd7207b44c3c5bfd8455a3f8fa8fbd5d81bd1157a2ae124a66caab6a8750f96396d7fea25563eb1ccbf259392f67fd3c753a82677dac32cf84888416fc6f6147cf0b5f57ec3f5411629eaa575d5cc0590fa596a5bd1c9a9023a12569ccff6530995eec528480c1b49c2d7321dc7091e21eddaac48475e7c43ad1667a9de633f63280252c3a5d634994ea59e4bf85e1ddb26990bd5ecb3fce85837738d86c8c26dbdf7c3dd8637f986a7bda20ec871c8bb1d197d2cb4f69650a1b16410632f086d6af17d47e8800bbb3017b24710a5c460b4ee28bc9133fa9c0a715e963499cff9e3c0a9226fd6558f9fc1556d57897f0827948b31a467c38d6841e841a2ac2f0fa86e7173053247db72897ecd01b73b84fcd512c09bedec6802301265747046820fd0ffb1185358e16f4eb440bcad5d7880a92abd7b8361a90afb9f69a6b4601f21a57af72f51aa28272e515d75f73f5d7916bd2c0f33ecacc54014f9f50cc95b8dd5ffd48d935494c76f4cf0c1d8cb960410e5751b642877c1571cdd7305f21cf312d76b57c7a2044cc01c45fd126254270960c39a4c434278492f32699e1d8c5a236fec091c98e6aec02f28649af03b324667c043c4cb55fc8e4cd2f40a7ba7666015b9fd38e2f988e92e0130eaca307da7826dccaa88e2eeef298db6aa8d5cb989b40df7c0dcd4f9da0543d786fd4138317b09dbc100d1bd03fe59cad52a65da8ffff8c72a0b174c65acd0117e492ccb81f67a4dc81bf4f46ce499569b3309cc8a76f99666dc32f73f168e2e9e71568ec94e025b06bc2fea632927ca209430a6eb73181e426d6cd52c47d967c2da27d75d451f49b2cb87f93c047d0256f4aa49acf2de146a096daa47ff072701e846332c0a4a5a1c0ec36280d52288943a770c59915082c86ed0e59d61f74ecf383f5082c75032d3f95b7bb3d316d250df7565fc536423f5f1367b56124dbf04e3da65ba46182ab7caafc8628f7343f177e668913102cb194adeb6548bd6b987c5e1e86c2edf61138ba227b48d2b0be4253188cbd3dfd52f7b38d20e4ff03217bef8b8346ba423add4867558cde0159f2befe4d8dd1a35d2dabbecafc67a651624d7f941d441b474437aa091eec100bbb04b05078da23f09d6d0c197e74d6bec01a302742df9ca1e784f0bbdb037860ba452e88005a7f76a46d7b3ec07d77ce8800971bf608839d593d27b354a26f37170cdda58a4852de3a7cd0c09081ba8c39120e9841d7b7e0793f5dbffd0ff34b72820d1376154d188e7316f56830c9a4191be907fe5c82c878089cecac655e3825004048019a5e6ae330ee615e8202bcd8b8e889e421c584b50a2cd65d73fdcf75caf072388fb7dfe345424d596f6c211ca45d55c4cbd27791d1eb8290e6d0bd7fe98e4667291359341a9f1a6e91bf8aad305347a4f046da42b7a2048388a83a5aaf0837077b2fd9548843050b3b867b4d9b0fd52dbfe2f8ec2861b2b7b9d523d2ae084313dea1a84e2a1d573df992f502aa8d5876338ec09e8ac50d706fa9b8a4c1f65797393acca69e218778cc2c455c9c7d06357927938ddfd40caa6403fcdebe820789207111745968de6eccce494c7a0233b04a8d720ef90eb8d23bf012ad5b684559d0e42c2ff9b98adb3019ed6fcc30f86eea21c871b5af84529d23f2a109940530492cdde0f1e88ebadbd3160d1d4b2752cf35e74e435a9317c30b8356f7748bff9071d8d52b4e3c816d41402588c2af825acbd2dc75c127feeb616d872bc2d4e7d51a838eaeae955c6b1a71f2aa399c9a5f28a34c6b0e30410c010784fc5277880004d64146699e30fc5652a5c977764ecdcbe00d5e5a5e19ce776da91036b802704c19620e29a3cfb3a346c3c9c40f3595928dd1870653ff030b8d51376a183416158de6002813422c0642c2a386e41220241f85a42f4d679b97a3689cfe3a369231d2d8d72caee46914b9dc5182180539d000b23c861e8a30323619d5d6d1b75a15a8582b700a5681f73e35ff726cb45c889608ceb5c612c64c2616807c2e10c7e773d1775cc6b5555925d5b0f4b2b6ce76dd363397a79f036f750c8dc6e796b81911f09c106c6ec92fe68e1086d8e0e5b0817f84e2ad168949757e334840c37fbce592563db8c893248f0361a2fbee67b8d96714643f60e8934efa06f89db1896f8ce22d29e0678f91474f339d6db21104acf0803c4859e8fb68d9e2482be781f34d98e048ae7e1d4be7ecfffce9cbba977580f7320a1ebea022e2cb68b0f245562339a79a2f12dabe85d85fde3f5d9adaf0e212205e600c31496379390b24ef3e2f0180e4f7e9651a2ffc49bd1004f120c21e14fc6937b59869d2b7fc1bf9ae4d42a2072474a200ba411a61d3a3cd0f6a50ed84706fd65aff8bf1d2b208fdb0eecce85fc1b062a6fb4157d1308cbf9f8b7a478f86b19c72146d26e1942d41da6aadafa3da8cf45e735c9bb9e9c4007eff9d8ece6adc2a4527a96d3b4b7212e8d937775fcfe5da5c4eecf1f5337be6202d57d9abb5768d3de8c5ad1cff4b90f320b75c39e25a22b16643bf8711223e22301373b36f788c4be021acd09ceeb3bf7965a3ef0ff4b39ab8fba36ac2333d44cc87dc1f1afadac1ec50858b7f1b1c2c1b972cbab68c98841b58f61229139f6e829b8cc435f10fc72a2ba5f4fe2e07805332485a4491f94fb22ef51e0b2fa7ff4aba91c6893eddae1d7fb98e55f6d0b8ce83e12258892991d0b4feb3ce82c35dcdfbc02c629e3aed3017f9136784a1876ec06c8ca2ab36ec6432b9395058bcef72fbf7763d99ba10a4f4bda85e47a90d721a82d6a1ecd32d19951d93e7b126df11650789193d512042ed83a680b9ca2e1bceee65de09897356f3c6f0bc639751c3f2f060996a5b2e4acfc4b3b204257d362fa946e812a2dd693ac22b2f79f384dfd6c43bfb3f02aa2c7ab0d006d2659eb22fe81ab28d4a0966d1953e31a33e28ffb8ad08d5aa810ec72529ec229ccce4d8006631fd1d4156f29abc96d819ad24d93b99800b893b9a8035b53cdbaae5e30d703ac08b32f9c351c05bc910b606f9eb698b4d3b74cc22430704e4e1d53be0a5be486ebe1919edfe4908d3535969388f879ea8dc71365c08b16ec504c9c65514ec6890b1afa2340417fd8493180321c842e00934998afa2871f7fa003eb1244514b943543b8a7fafd82b8dce22624e6fa4bd82ff983d87448ad9ee1325845d6368f3cb33f57976a9ef37bd4ba2ac350e5f24f7d917d612c4866266033bd9d4e22bba6d038294fce510d8cc44a9728ef8e5522161fc25c7655a613e50f4c114cc1509f4e17e8712104d91a50ba915d42a34c495769e5d8a361b1454ca4bb2d36b504613d6fd2cadbcf190c164d0c6effa26e25b9aafcb573a161248074379b5d7fb32e8236dedcf3a97b29db905f5d0b2f9ed60ae8c44e47284a5781942cd6d45d80cae8743cc165a74754786e4424764eea4a80432334bd7b92d7d25259276608ad7070f195478e8fcc8c913b2c359314a8c3410280c84e440c500b460c8008f2802425c05130efde1c004a823aea8046c4d74d03be58779f35328710959ac19fb505afbeaa7128ffda491a8459ee8b6debfe07b20958af611cb08f2492c6bcd84d48efe0ef492d8de5a972385d1814217edb216eb95ef67cb9560d43adbd86e2b2716fd326465c9a8915428edd79f6536d72733c83c69c3c6bde536b602192297a6918bf523b364446fdb261867411d7c1b776175d6939c8d25a5d0a43efa259b603a90e64476404553742daa48705e215fc68fc4cc5d25b36667a99e1a5d80aabbe543fdedefcea4bc5212c2927792d332984d30ad2210290006508bfa6993be43a19d1f74b262d716212cf5d4815a0c408f03f404184cd4edd31c9003109a5119cc74b749e8089d22c83c6b23da92e34da127b32a6a3ac422fa64ca793ff4335f0c45e0c2d652665098ea6a700412cdb1fc56d012957ad12f4051ef466f8fae70212a7d3ffec0ba979be35582e22955ee2db53be844b712641f2f83cb99131a0c6bc41cbbd85fb5c3b001bce553ca5d932ca134304ca0ea4d0edcea01973c93bbfe5fd908495d8a4cd6e5c7c2485c23f1cf8abf6cd7f88c87c0a94751d2b04f16d1264f99ca961297ce60fb0db10f052ef9d2d52092784ecc8f280a2cd5e15db839a9acfd4656ff7ae9b39a315b676f4015e9679c75c619774ede39727f710b505afd12c4ab2f0c7249510f290c54d715c35bef2643a2ab4da1f958b04dc05b22ea3778b7be1d9e0eb281eba1c08c8202600a54f41708920a764fd53cb129e9140c51d14cab20e2c2f4dd57ca056a40394f1bb6d90fb0b95c242b0483bd16a1003428654a1e22e8fa9653ba19bee48dd96def1e6a412798371ee61fd2dfd73c7826c1adff57055ca693baee6991d98046ba19c31a3c1e8fd95612aeb6c2037b24a0cb1beda8509b7e172e0cae53edc1c33fde150d28dcdd6fca39d75959af161c4692b7879f743e7d40b95dbc8f2bb14adc5d9cc1f5b5e0db28febbf5d77ddb8a63b73e16701bc5bfb6fe6b659b88f35a3b2b588bdf09be29f20489af8e992082c46d41f58530c09081d4d22705d649374a42318c6b5607fe704d0ca556957b1361986b55200b630f5c486543087409368006928dd207505645c9962e220c3b1e3071859ed8a3d88a54efc335960299137fa8c49b2dec04090ac51a459f8e23febf32acd1b447d501c443cce29df4ebac7ac419ceca3c54221db4a5e27c5b2a51acc5e75413029d901938123bce2af19068ecd97535706ef7e026a9864af275a8fcccb18fac34f897686b2520c0a48ee3ff0226078d231798f89db13afc277f67075606df72cd2a200a329fe0f719911e6809cb85c66c8d9dd5f8e8b6c4711c0e7015302d26235737f5610e7455452ba6b52b72c63da7f8109031e540ddc6cddb5817b89aebf68aa27101de3e2ed7afe5b2f4b205ad991944d99f9d61a66fd2366872501e906666bd2b0fdb36cde39d1c714bcd3e9a5ba199012ee2dda3d880a506f53c12f84c60c0120cdce535ffff40edec497019757f82791895cee6b34e9e04b5a9baa2db6bef5f70d29b6a45abd19dba3636cbba9729f4a91677cbf7f91230de55b5a61ea6b7405dc2a6ee3d2aeef63366a64004bcbdedaa7c4aef9936c84ff866bc610186229d439d159a2717a97b222c615c85d8b988a76ac7363c606e13998e031e30e57fa95ef897176cc1fe3d20c8d9d09aa75347024057b1e53469dd23836aa3054ab5546dc56ed5201b1c6ae228f99a071eb2141805d9422adff8320a293386e52025aaad9332996d1b3f6ada2ca181c586310d6892ff0c0234da4bc2262e33468378eb6e141619797c48485b2e0fd082b4ea2183640a664975d34e18bae789f262468bbcd4c08af2824c3ad6b3ceaf4aea69ae9748924bc35689b646252c25e0bed5328e45693febd2bb697acce5741091d123e982a4591ba48ee6dcc87cef41ce607b606a82b4ac947dec7f3ef6578bc05ce7d960f3acc8703bf48906d80f18133f8ac10af31e37d8340aa1a9f94d9e860e3e9bdde79bacae74d47a5a7d917f543b7a1c4b7f5b7a051bc5ee44b7179c9c50deae68516d0e75308137781cc418616630d27ba40a2661dad0a6a8802230e06a0bc62e3d04b65e9aa2153e900207d391caf7c88a6e7661a54ab2750f864b97decbc29282d2f0e995133ec6c09341363dd57efea76f8f362c15bc623f91850d88a3a019604ed0b36db8bcc33774485375d76d3a0db153aac859964d18b45b842fc99c6fd0590140bcf3eab5d8aca284ed79cba3bbf695b2a0d7adc3a43fdcf4aa8189ef58fedd331c28d85bafdddebe81411a298560974e7b95d2f1519f0e05bb2517a69ed99bcdc51ddaaceb89652ff47f46a2a1278665864bf2b8d7232cb46dac78288c33eed6c4dc4e4da2b9c750ec17b3a1c8b4d25467314734a86d34c4f48dec1d7cebf8150748215dee7ad7a4ec1755542cd3c6df87ae9758daceaeb3c70c674f37d705fda2dc1d3738bbf3cd86060e1c25a03f6712768d57f54696c35413f5feca0ab6391291690b50704545ddac5fa1348cb5d6552d1b0780ec9c101562ae87ebfb65e1d06c389e250c91e8b5b18e5f0be76ade0d56c3caf6ff766ba886f533021873374df34d17f57157234e586369020de8a9f7f35a091e2708d49d37b2442be88d527fd4acfd967a627f2c793445d7eac0135fbf02b472ab88fe4e7e2c8e7e3ba90a1c45059ade23f139853932780bf81882ed01d29eaa98631dbae5dd04bc26d7570f6f49244f1bf3bf700a1788e668436d362b5c2b1b0dd6da8b523a5bcc86a21360237ac621f64387ee83f62f9ac22fa74f7f5dc3745e7e113398944ad62d4db2407fc39c199137086fda4b4b20c7b92e7e701c152862f0f3459e4cad215af0d998790da447384114221b33f2a2d112199753e884f226d6cf6db284db825c05b9013d9e0a5e28430d8c23f6348e633b675ce3b866a8464f52e5219b84984c08b343f68465e63b4e88eb28d42f0effd3b004a26eb7180693803e363f83d575ad01198bab4008f8623bd2f92f7c0d7ea52238439eadcefd049e112176e5c5a0537f18699f33e85c7c9eec3fa29dbc66bc1a5dda5fafba9f20d3257ecd3698f6131bba04136ad40b4d585e120565781d3e25af0f38b02e2e06a8fe9d2762b928e2a2b4fe6072516653a28485e1d0027138d1506ab2c3369de61dd394706950478308caacc065f3d8bd68610f4b6376929f63fd1d5d2ed46b58f2f850804d493674ff9e0c47d52609de53c922ee379a3da20bbbcaa39a4bec17ec2e9d276539d3aec03b76ea04253f41daeea0335722f9750c58f01dd319ad7e93a77c43086fbc22dea34d8d2ede97bd35c2351e4fd708b5f438a429cc1f7dbb2bba911398e5b91cd9253c21af489b77d6a77ef72e793609ec934f4c69a4973994d4224994ec6b9ad00251f0cad639f16d53c8e07f9030cfa3539cd2abf65cf9cbf0167228da28a72d2243a6c4c0043b6a35bee42baa4b91c303d35c8997c792616a9b70bd92ce25347064a3ab4331600d15d81890dd42d08c005d7cf5b9ebfe2818c472667aa17a1747f415ac4ff7e7032e9f17a9a1d26b890d01e75d87cbf721beba735645181c705c7081015451f441d44058599974188908b8d2ee5e51196f5ea702072988079cd02430c58b48bfe7cfda25d39a6f4e356b66985558c8936644ab27879ce679b929ddbb0dbbdbde771dfe660d28e290e52276c45bfaf5aa25e208bd27e6e41de43d4fe38cfef71e8d78303f956d996d58360195a15c29f8bf577a3ce8c4a38bf62aebd4a7f3716cf8ef4aa297a1893c72c8723009058d57988ef3ffdd52e7079924b7d95da55d26877a666694f29443a4466a46bfe48835ef2c98235be5a12308444f67388941b88cd141bcf91b0da3b360359e9aa0ce93c8b8e40a558f70a575391159564513d3f95b533ee762404a9243096aef80ec55eb2d5faa28f01b126b8c62f7332993526b3017eb29874837698724173514f200a5c7c3fcdd30b5469624c5bd6425d0d54f3e2cfa190206a4981fa88e4a3eb260a3000d9c581e8c38bd0c43b454e397a0882f7bc1d4636727bdb28c5c30c862ad6df303bfdda3a9b0d8feafdc275f122228f6a25fa48bb5c2896aea7961f1f86a5b0b969ec9ddb20a1f44b4e39ffd3e835b88565d131a00293151e2146331f9cc5b50c0449faa01bb0cc28212648441af0136949402f576f6348977283ea5f38d9311bf96cd3d8c0b378556825b342aab360401476318046445a52402a29f3f9ba3e39a966f46894e230dac317dd5c9409aa13a08931f04561c0f25d409881993521dd2cad8bc95d0cbf16e9e5330d536cebceebb128e1c5dd67eef21888d6acfb40dc60f11329873f1beebb0ff9f7179d4272425b40b6da0d582313a01642c710770d6e80693e36f765d7d08a04e09a2094609dcb0b9942f9d345ddadfdc7c9aa463909b848dd74c365ec45ce7afb43b3c4f18c956b0c1aa86bde50203db02a447db48749a62fca6230f25a6e868908363f80791a93dd381f0bcd680212d0fd824a1e18400cebbaf66855ae0d78a3d6e95a3e0bd27aaa9216cb4f7c50b6cfb1f05511fa990a1a9cfbabebf9f04e70d08f4dbd8323fcb5924bcc7f08ff711574744232d6434ba642fba17a0d16841bb984c11ff4f3659a451bd93e808ca9db1b0983d5d4e4b4763c6c42da9b16ae2ce63cf709fb07c0407ddf98ac2469696f7d558c858f0195b633fd0d63028be38936aacf88a89a7fc2f06a006d9cf0ed34e30c84a32407857a09b31473972432ab39bd5dbd525c8d3e8124ecde6d3b544db768e6b7eb20604fdc63557c669ad232dda6a3b00cb3b2d043c628190f0af7317f279451486ec490f5b105e41de3af994d575ced4afca9d685ba9d2c640974c5dfaeef7b279ab6bd0af3229dd133dd0b39caf2283268a8d9043fa6d9b66b22be7036a7c4b0a046632a82beedd0ec140f22178a79c48fcb018bd57eb412eded60a41291df2c284468b0c2f052f71eb69b23a4463cd317fd09cca96291083b1152b0bf6d9ea56dd66d344da3e750cffe8b7b9f97735935c6eeab0ee178af8f7feded5752e37d97f8981f0565fad343eed9ccffed383acdc98915878cb4cc49799cdb7ccccdb8aae5946ad7d07acee03a95f99ccf37c6f2953da47cd7db6f50c0a09d4c34202075162a7acb03fc7a2fc485db0ca0a5297b37e8b42a2d3bb6b86541edfd8c2e2970b2258ce0cf0d4e5d98a89d50ef8309ccce15a11d509cac2090f29ebc1d05f742453067e1a08559522ea107a6c2c0dc7c2eb183e8ce9999c41421b440989bd718b05dd3c4673494170e89cfca1759c79e7dc41aeee617b12e45ac76eef4853f7195f431c2b37e851bfc9a555bfa97b0589e610eae1d66d7e8a177883f15dfa928c82eb3debf8aaa470e3118f91e0844d1f3598066dc6c064d43875e13baad2db635b639387686f36a9fe97acbe453d30fccb3085c4ac52360e6a38f31389fcc416d7630568c5b703c26d6a1c410d1f68268dac84d41a1e1eb961ea271e665619f3ce588662ec444382ce751f495dec0f792d51ace10fa5fafae15512ae09dff5c7eb69b2f915b0c51060982fa74580fdfbb912b009d0c2d6706bc2ec0e0d3cea8efb21c69cf02bba019522a9dd5b7b498010a26425d22e1803112d87d7f03c91712ab5ca583cb55288c83f6ea24b9933c924d3adfdc290547679e52a1b016e499bd4f82a40cf41088010982f8fa7cde8262cd75300801cc515e1ff07f4bc66a8066c4fae901a10ab2bd0a2f794f1504b427f132cd5ca686410b65c5005732fdded7c1161aa32d6be4e3499eb8edbceb63812736baf97edf57500bc0faf4fe3d4e7a6ba53e77805127221286e27ae4c49561e0461c1627fcac27a3855d338ceb7d1ebf5cde0c3bbabe539b357896aecc4859bc90e00d894be49170e89125db88de205831d95fcf50c530571466f6f5404a245a823027cc1da09dcce920210221bc019f48dd6c18a131f47a0e91a02ff710d9e3e40d728b3b56c731a0a007aad55dc85c6b528c554f5f6949a5ac62664da05c0c55e8f61a1baaf726223f56e09ac81dd2cd65d77a24ca4d0b8fdd0341adcf7f51dc5d43331fdf55a3953629e15e8b1534f1e78511a63b6528a3a01bfd56464e9ba155631b39520ec3a8e764431dac44616e1af66c1fc7f85f77e15b1090f36136e40e5e740849fdb15b5b7bba91f8ec974e72ac2f571fa653c537559d4b13b95367daf1effb3016f5513c02d001d5175b146054170b3f5eea7891141d0c758b892b8061919cfe5ae7770423d269f5891510b0f996df6883c63b895c53c49847fd7b530a423415ca5dd61e1459094aaefbfb4ff87c1c5789679c954b4f7991182c67393bc04aaeae556de57c617f12c4e2c6b54780aabd6b5c72fda58d01f361d92463a55bb038b0e914d45ca8c1afeb8ef50e20beff485a442b16e7cc931229db322e7d20359b0c5b91b6f9d7f293d508671f8b1115e44ab8d1c184242f91d7cf8f21fee87c93a5e4fb1864e909ceae034dfe368ca681473be4da9f9ee923fe0e4e62cee29706a0f36dc18d1e9d732102a32cbdddf5efd436661917ffedd007a196d490b3f964704e1508518f4aee8579c8a0cbce396e70e59b4a363804557ae1379c2044f109bba502ba4186b7e7153c6079be86922fb9f1f1966049d40d8774ad2140c8c003faa429d9c28ad006d90ac0293d79dc6044c6b5dd9ec1f6b505886652fdf74520ebc4f116c22e30841c72b80369eace3ddc8b591b54c2d6e97e04bbb1b69396eb07c02986fd5cca32780b141be9d27b0375068b0aa9e9d2983b01f0f1b5cb4b27885f8d46ec6cab75f614f0ac37400447bba2bb7b5535426055edec44c105510588a6c3af883cf4cfe0c937243baf3dbe38675688876b07286df9e72f4951fa627890e895bca8e26e5664dba91b4bbc975d1ce95c1ea6d79cc2430207c46b79324315b57d4b84f2af869492d0000918808d97ba76c11ce0f820fa81398600a11d8f0810e4136c8bce0c24a0a16aca08a0af4f04307580c2bb4b0a8c2f8020419b0a20a2a263085140f3032a3c30674001453dc40c2ec07220c4104b28b80252a2d88c7caca8a2698f051a1c11916b00206d4d3820a2c2bac150c39b8d842e947a322001001f90181031480002844e109c10634708126488ef8f4e05001e582328e702428871e95958a034780a003125840020c104404200081258c8a8278e868e99ce035c16b0325c587e0ad81f28197462a4a878637034f062a66b4c4c073814786f7c5b7018f09b5d4d5c08a2105838b0b5e0bde0a9d0aae14522878aeae857af158522b9e0a8be5ad56290fd57d5da76a17982fc707c6134a8927d410d50eef564928a25581a754aa6575031a45a0a6c041b5d042050654483ca186a8b0b002030e013ca9f880fae1938125ab5a5840583faa958f078e95940a9e585d3ca9a054848acff70023b4e4e02935e529d5f2820c9e5ab20c184f2a385ebc158f944dca89272bb0b8c0002350493cc1c4c0c47c352e1b160ed714235238b07e563d3e98af078b8aa78f088e8d6a4575c5d3c7a27a01f562c1f93a540beab5022485c3ca07d50baa15d5528b0a2d2aa8e0506161e5c3f70423542f7c5818911ae3c9862554e9321b6240c15a60542e54f7d57c42a823171654de0ac92ac7aa28b5c24ba762f952a896effbbc6ff5b13e95151850dfcac80a0598a315d74ab5eabe156a076583ea582e7c398a5099218581a7972b8a70a95039584346a07260848ccc7bca1b3ea0c1192e280305639c35a42698f8e143871c7cae25c2106c74b460582b253f18154d69410c5e30c312374f3060072872300332c41001171ba8c206bc6101675e029b492882141b9811031368d184880028fd90c4a888072033c8d0020b5f78d164031a206208590c305c3bc34b0e70c0a47c9af2c61294a0a4a405165c3310e304231001175b70608903144016001f9018151191d18213b020044f04a9011a64b4400c1388008c0a5061800108a0085266608608c0f8a2034e9e7e24fae17291c20335728002137801822c2cd084123fca02a0a40409d10f1e301a970b192d40c1031cd084931f03000022203f78c05e5c50cd0335c868410a4ee00508b2e08005107000274b004094030f98cf0e0e0d0a2e544fe1811a3848010a4e60022f40c0010b20a0890328e14407b2254a3ad8806e3861881098971bc0c04412064882e446024a1820e794019529df1bde13524ef09ac0c200ea029e05bc2aba1c0fe7bbe940969a0f87cf5998c183a1cbb17ae173a1c3816aa1634125051450f85a2818979796cb0b2d2eb0c0b0e25259b1542b4fa54aa5beaebb5fe895eeb6a15bab21dd8d4df0c919cdb69a379b1faf58eda9ead64a86ee66756bc54277dfd02d95141ac79f73b319f71f2bb6d571f55c9d47cea426b5894eababc068a940d0dd2fdd525dd11d7acdd6b7e19cc673e8e13339f4705b6b3f5309d1dd2cdd5231e90e9d761d57cfb9d91210049574b7ab9b866ea97e1a9b201e2b499b6ccc8c43b752494845b135e31fdd26665a7abed6f1dfd169665e34cf8b5b2912a4aee8d17ea68e5bdd4a2531da97e956ea875410b7e59a7dd269d7ddbc349366ec5fb3d46c25291cd8044d9b587e69f3622571b3c66e19ba594b5036e8ae49774744773744c703201c0f72d33cc51d40403f403e403d403c403b403a40394038403740403f3f3f3e3f3d3f3c3f3b3f3a3f393f383f373f403e3f3e3e3e3d3e3c3e3b3e3a3e393e383e373e403d3f3d3e3d3d3d3c3d3b3d3a3d393d383d373d403c3f3c3e3c3d3c3c3c3b3c3a3c393c383c373c403b3f3b3e3b3d3b3c3b3b3b3a3b393b383b373b403a3f3a3e3a3d3a3c3a3b3a3a3a393a383a373a40393f393e393d393c393b393a3939393839373940383f383e383d383c383b383a3839383838373840373f373e373d373c373b373a37393738373737dddfdd39baf551009b6079da254a56685e332b3343f8101e84fb6be5b5128477df74774c77db7c47d804b1f92359cf99cd9b5774f7ee4e88ee2e88ee0e88ee4675975d14202a4277b774cbe3010cbadb856e79207058183a6ce515860ecbb427dd57429a6cab55d33dd39e9c091d363e59290dd31c72f09ce86eef9697bb1dd77ccedc717d5b76181eed79674ebb9ecfdbdd5fb73c1afa4b870ecfd4c76712aba5b7ee2ee7d1b86e90bb61f924625ed3fc81bba6797d74b7d72d0fd50d82abdb0addeac2e85cc91bf630d390856e75adee46a15bdd13dd246dbae59bddedd29d827537b4be29babb856e7547ba5b856e753eba3b07a71f6d351fdb8a4d70bca58df84d8eeb8cdb27bd87ffcc47f2bc36ec34dd9deaf6725aad063641f19b64386a76370cddde5077e3e8567bd1d8047349b3114d6c235e92a43639939ab34a9ad734df2df5f1ad79e637ddde9a69b65f3e792babe74acdec355b73a6a579694ebb3ba7eeeebacbdd1daebb6beaeece4675775907276668a1050f2a2d40b982860b140871740330926864ecfca085fc3113d3839f3252c0b1c0263cc1461159002a547e6468228053460a2e20017e373c54830e4b4f063001160c56345083a5a13c3dc5fa5bd920091616d6e72344069256bee2423879e23e52492a4fb9104210e1f9e744748e7222549ce52d23c411ee23252304112a324fdc474784ca59322b192254322999cfdb895075d68b798272f20425730453cabd2e25d3b1265f0780af539df7a152aad8ca69b552a9545f2a954a7d2a16160f1543c5502999a54f082162ddd764c96b4f799db72381a5bf0fb584f22ef5c5bc180ac54488a52631265fe705cb11dd1128efdc8b71f224034c7488317ddeb1ce8f40c96480890eb1cf993494d84744d72161b517d142d590eab1e2ddfa7c5a623c67e93a1f2d4310e1b94ae6c9f3ce3b1f2c2cce6259a9a05cc58b71827216ef62866079e7b15a504d583147e8e0e3739518274f3a1f9f1fa1438e1e50dee2491f4b4b8babac384b4a15e384c557582ddec50ca1e21d4b66880c24a978e743acb0b472ac5c8718d3e755e43c6f284b2d554b4cfb588971b2e2aa18272d2d324f4310f1b98accd3e7e489fbe83e971f3e6f89198288cf57649e3e77e9e173cf3b97a4cfbd169598279d0f1567c53ce97cb07c25c6c9113af850f1279d8f1567f1625a50dee23f7ccee2aa1827489af858f1ce8750716f889594ca111960a2436ce59d8f17272d263d25b69261aa22e7791539947bca25470fdf91e7aa98f6c1d2b91c7d9e42a9b410838ca71648e9ee6e6f1e96eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0e8385d52e42bc16942ae6795ecf134c54cc8bb5a35028140ad57d28140a85fa505f7b3d1f0ae5b5bed74d8742a13ed4d72c2b368069c122d6c5566eb4d1354b28293e9914cbeb596a2205aaeb56abd5120b8bce9d4545ccf39515314f0a6fc65b6ae20921a3ea8ad05a9a010b1616ac2cba9881d58456e7284fb560b100159596ae8b752eab95afac7c2e442bce5af9d460b1fcb38137f3f1a08ab1a09ca5858ab1b0be180bcb577eb0562d87f101bcb88baf603ca9250393f4c27217992fca47d3c5589c4525c5e2bdd2c2f2adc8b008d062c92caddcf32fd5b11511a8262a1e8a052b95f7a9582c3f23b6a46a125371e17ddff7c1a4522e29776951c1788b8b0b8d1b2e2f2d2d346dc0ec70e222c3e47b697181819159daf104f3e22c1817189817d5e7d2d2d2d1bc41f306cd1bde8bb7a2e28b1243b5606068da80711a37607624d1828159b56068dea07903058769b5609ca68d96d3b8d182d99144b76496603a4701c651d8e184c9e78269a1d0cde414dce592594261d58251210605d7d26ad582a17983e60d9a37be2830de2a8d97efa96bb13e5775d7bee3a95128f7ba69daa071a3f3de9144d74dd3068d1b4b3b9c348bb5e389c562b5be335cdc43bda058dc8585e5c55d31fdd1bcb0c82c6554ecc55b322a2f2c2e2d2b321915531983e60d9a375658aca0584e48f9ce90512940cb4bcb4b4b1bada56f8d6f8dcf6755c6aa8c6f8d32be3594d05a5a95f1e22a2ece3ac3eb69b14114af478dd51a5ecf4b8b0c8d1b2e346dd0b4b10a63056535c60aca2a8cd5189d4b6a35864b01505f1b4f346f74362e322cd6125a2befa515942725b43a1536a47c48f8dc68e389e60dd6d2aa8c5519ab187c6b7c6c7c6ed0bc41e3c647f306ab4566a99359a5be3568de58ad3e96305c542d314c4b2b473911319598a52f964abda4fc05e57d2b2a322d2afef2f2f2c2c4e21d538179795151e9bca5454685c9177b592282c5bda596cfe5456609c7b4c874ee354b6669a5fabc974ea58594d88e588b7182306227c822d635116b314c20458c05a6d5fe790eafbda7957296cfe52d314badce512da896a597134c4b2a673911b12e66e98bb578b7c4742b15ef56beb2848a2dbd9ec4524ea48bb9bc8e68915942c55a9a084104cad5e22e94eff0a13a8f617af12f8642c125b3d424e67254e730288791d9e16be93c7bb116261f0a314b44c4985afcc58bb9601ca6cb2aab962f651597cc126e126bf197568cca8aaffc2586155b915952b98ae7f09cb59291795219c1044c8431462c27d66284e104eb537d9fd7c2fabc537d315d0cd57d4cbe58175b6a220411ddd2104b2f279852deb18e59fa629ef739ca73d4e7d943ad5ae59eafb8099ec23863c53b971615625e8e68a93c264f4685855a91c92a3115166b85a3a542029456ac73e9645a583103a8b4a8b4b03a1994378384168bf57d1d33428b69c553b12596142d2c29bc1e1667b1aef07a5458783d5d165d783d2d2ccf1e4b45c5ea84a0622b9d0ccb096fe60916135e8f13ab8e25c57ac2c5002c2926df9429362c2b324b4d5c8ed05a79b3ac703142ab8ba9aca0a4e896bad8924c12b12595ebd06a314640456c09c5c4124b8a2862df089e629fa39c405121f372d2d9a4dc281563f24d9912eb625d6ae5aa6ef53aa2b349c9a058505698e0841755789ef77d2c143420861765a854aad50a8a173e78f1e2082b14d17a59c017547c8145ab05060606a6d5520181185fc4e00b20b0d0d2c57c31a50598265a68618105165868a1852fc240ad106b314220850b2e5abc0043821c2a2e80e185588b11023442800431c018008e588b010604c0d82286a3a58b01a3042e5cb0b84861b15c5d8b174e62dfc201030e57cb5340bb08610241b481812c504f504fba09a062ba4fa6055076686d7184940ad58db1c48f173620019406404006611ce1fb3ccff3591d7d3e2b991dbeef3323f669b1c6d0f77daa1494a1a39b245076180a32e425d66270f124b674a37a62f13e551028433bb06a8089b5185ba8115bba8142464c0b22b0785d193bdf6ab5da2289d56ae5040a542b2d4cc0f26e56ab956ab55aad56ab94c7d28205a9151428abd50a56b116438b35c48872b34a65c1044aa5bad9f93ccff3522a2a56a9211456a92cbe58a19e34d9820104884006b0f080163df0610421c4e0db6108d6832cd850c94021804a659303954a85c552a9541ed0220a9514622d86161d88b9c45a0c2d28f0b284cef39c87947bde24f6b97c32398850de390f287f596af2797754b0f4e79df3f079e74d5e9eb43c87a573ef66e666a6861a8ab064563858be16abc592f13c4fe6e5494b05948c4b94560d387010b57bce43cb745dd7f08062c9ac64522e3ca4ba1c449ed7a95cd26875312e515a3ca0dcf315172294cc9458cc5bb900e9bc950f95ea56ada2f2e2f9e7c97cdeaa022c2998944b91826ae212a5d532e3f9d742b154ce02d3759d4a9572958a8c2a470f9e7f9ec47294f7b1509e7f67c47c67b8a462785011a97cf5b9a4645e9eb45a5a505eccd745179f1429df1725cae72cac96548c4b0e582919971c7cceb252c5279392e141955279cabb5893d857a4bb29b1cf8be97c34e9502d38f8bea71aa2a0a4ace1a13ab5fa5ac58a49a93a2656ac8e9112e529ca195d8c61852785f7e43121658d31cee8a2c3a263a293a2256098a33312856ea9d3aec71c16e64c5ac54a7bfbb3d06bc0199c24a19bd75f3eda0f69684070e6c85fd9be498f66729284fe33cf912415eb2d979d242b1207b3d3677bc521878519ff187a0d484428c929bed3fb68298e9aa32d571c39a3372adeec3f2b4f8c69bea52de7c8f133254f91a4a2e3ea35ffb4d152376f16bfc9431c665c49ff919663c5eeff40c09b9da4e225cb6bd21c939fd4dd47ba057b82d5baa85b3017ba415c7f564d11cf4efc38b789d586f39b1d16de5bc47fe6199f441c16865e03e6ea377bce52272294c4cdfab6d1a4b5371d9fee37bb7849a7ce84639992f7cebea96691ca70cde7fdb2e6209a9fd35f3fe78c95fd2c474bf3477b6ff84d8f05f83d2c0a7df447824d1077858e887f04d75b0cd71b6d92d56c35af2d9f94bc95955a99f8373cba96781aaf957d3533ed5ef326c34dd4bd834b0737ba65302c06096ab69a9fed6b8145f7803747b2dac46e022e0f7c313e13e771fb8c99c44bbed368d7474bfd2645042c516ea46f92b1bf19fd747744c0fcf84d9a7ba6f173a4bda23d69b8da921c1cff71b657749cabbfc66fbaa58a8a8aca8aa5fee6a5bd0fcf3d93e7b259c71fcd2bbee9b8fa9f243d327e8e92e63719b9a57eb37bec08170f69747710a881a709190ea803e6d4d4e47235e9ad6de820788674770ddd5dc453b7101dc4ce53d38c6db589b4ac19007952da0ff5f0e45c5cd23351d207351f0683c178787878787878767676767676767676767474747474747474747472727272727272727272707070707070707070706e726e726e726e726e726e726e726e726e726e72808080808080808080807e7e7e7e7e7e7e7e7e7e7c7c7c7c7c7c7c7c7c7c7a7a7a7a7a7a7a7a7a7a7878787878787878787876767676767676767676747474747474747474747272727272727272727270707070707070706e6e6e6e6e6e6e6e6e6e70808080808080808080807e7e7e7e7e7e7e7e7e7e7c7c7c7c7c7c7c7c7c7c7a7a7a7a7a7a7a7a7a7a787878787878787878787676767676767676767674747474747474747474727272727272727272727070707070707070706e70807e7c7a78767472708890349bb72c89bafbd5dd3e743753b77634c17c1bb19a6fbf66e49aff43cec72d2acfb2da4a0477c9f721941fe39835d2dd4131245f6b1fd0dd25804891a35bd4dd45f14c37a9bb73408ce251fc81f4a366f22422646bad9ad747eae3c973bca5d76cb595966fbaf9e589ed15c2e62d1aede936669ea2786dac36d5a1276794acb489dad3dfa45f477c963fcba31d3fd33745ff59ec745cf19f4cdc564fb20fc43569fe26cdb83a3d90fc18d3dcccc7c77dd1dfece39bf56462abdf4ea67bc9b765f3663abead556c4f2b6471d732592334b84bce5ca40ed6c09f71fc4ff32f2ff61cbdf9cd9ecb95ac336a89de3cf349b395242b6efc4c47ec239db92d9b75e6d42d754c6db8f2667c8aa05beab6faf82ffa334a3aa63827492a7a0cc4ff4dd496a3a5631ea5e3ea49243d99bc0dd320dd1d140de8ee9ee8960d5930a0bb5b4077a78037cf0c83d56ccde69dc51c1c3fe393da9cde73e62dbff4eece8916bace91ff27499baca82149e766328ce94da4b49a6ca9ad6535455c472f4ffbf8c7da74cd9b9798e2f00dd2dd2500675c9d10d004909aad5f84a4990219dfa478147f24fa5b2e29f7426ebee5cc253b4b787a9cc7cfa90493dff424499bcccfb6ca32fe5a1d4518eccdaf6612fe5abe24ce974492dd6e1406a3e64965f8c4f6b1bda2ec86c54acece23180c08878727c7c43f393846c677aa40546574b76d17901174675bef4d36be53a5dd9b6da5b83397bada0551450308a0d2dd4d7dcd07c273337fbfd9f3adfc9c6977bb2c752b66a76d3d6b75866bb6dab2ccfc1b0c26bbe19f1c9cd3699eaf254ffce6ed6e26ddf29bf199380fd12db565c7f849c7398a23a9e766de64fe686bf92636c15c673f3938326cfe8d7c9b58f397b65c4d6a8399c05d92667e93512e5791dea85077b704699a3fc44b92b146c110937a229544771b756b0699353f677ab33133b6a1893d403a9f433f679ce18837403a3fdf03849393e3d38383f3f47f7e767cfe67d6b36323667c9a3618a9662bc69548777700a2dc0cdd92618d5a772fe9960c4eb64c6f36b97c03de80383597666bcd9354c4363a393fe203cd4620a09c1e517c9c9af28ae0ecb4e55acb9919d7da9bf6c7ea199f451c67fb65edb1db32bd3949c660b0ee4e09d6d7ed9fe7f86fb92c8b010da79b6c1fbf79646f2d72e21b64c334480de728f9634eb47f327993263b9d6829bb95a6ed331deb68a9ac3ced6852dced74a2e5784599132d31496dad22cd2ee963fcf18af6472926199fdacf54b4570888980406ebee9dee00742b4707b009d61b959598e26c7e80c67f1a8fcdcfe7d0df799ed12787f6a373b35393ef4899c87ba3998e9ecf9baddd5d0be28f57a8bbec6eb15b40441d14f473f610ff48772f218991341a6d0ce7af993429db37cd532887cdafb49a6fd123fdd76846aa5522f6566cfe91f233d128347ebe9da6f9d912f1d0ad1792509b53b7b5fc5cfdc99aadd863dd9dd3ad177080d78e2ee8a0bb8d74cb0525ba7b89d24b89928324f9384cfd65bfa9d6bc666bc666a539edba8339923c69fef9c95b79c5b18e8edf69d747b65f451bc33992ed97397a93e1c7f4c92f82fba2eed6d12d1762babb48b770900166fcb5da893ddb6ab5f4bfe53275f367e569fd6df9b54449a644c9df96ed9767cda4feb6fcf9163938befddb8dda1c539b63c77d91d38f183fd28dec469673e4467623c33922e24ae41f48776780ee0e89eeae00ddc2f164ca942953bafbd22c51c67448cdd5120151496a2b901f39f2768bd56c3533120c26bbe12cd25b79856030f1c72b068932f36f4eb464122f392369be59e644cba01ef6d67c3372a2a558b1ad66767ad9633a0bcad1397b987f64fe1186c1ba0b7477d82d16a4c8e29be6153d5feb6f52c76e3aadfaf859fc9bd33baeee6f4b721ea1ccbcb2d06db9e27c7c1baeb6d2dc0736419c6b59c9eeee49f76f0211712d61306c9fe966180cbf6829497d20990d7d59b33d8be4cc9be9682911929a7f33226969de228c29298473f408bf0fb7089ba00d539b8d0d10900eadc767b4c1c9a1373e3ae2cea8a3b3f373f33e359fa999f1ecc436389f97497c9b68936bcde6d64c2a82364cb4deee8dda7c796d36364c6d305836efed7662d997d4a4ade0d49dcd6bc37e6fb6616a73d863f39bde744bf4b99ab891bef94f93e11cbd0505dd4a33488f1b25f26f26f92069b617886a5e5bd097b2b146cd9b9160b0af6696ddf0679a4793e22cee0ed57099a92cdbc7d9bef9365bf137d55ccb6adea27c1a8d8f84cf4c339225ca51f1475916ab99f19b32d997277ef376cd7124af0dbf69cbb2d1fe0d9ff88368c6af8dd59cc5fc351251931ecdf410ff081665952647e7f4578ece39f340542c1b47fa3699c8a4943129c7ee8e00dddd11b6529bd07777037042bbd73cfaf18a3f94ede3590c5722f9de22237d5becf2f023356b372323fd202213224ccaa107a222fdf9670f3631d31bae43394a7e114b742bcd2018bf59fb712bcd20dd9d003a23c8b796da846ea51904cb3ed38c65394abe0983959f710ecb6ca536919af496af0ddfa845fa4c3352cdd61ac5f88908810229d8c00c1d24f0031ea0c00a1af450b282aa094b8b1597166434e15e00e1d9236c01c30076d0850d300318d28018265c7214f0802cb2a831028e05e0688119161822e2054948e48003d594f173ae6579c526804c229df9f824794dff995b2a7aa6b62c526ca999ddfeedfa2deaee9aee59bb320dbac1fcb8e64a526b7e767a27ed356b93fd41331d72fad1127d8d1efdf92713d9ad1c65f94992de64f824cff21469a643b54ab35728dbf38ab26cabd5c799df7447fbe6677b5ea1afd1a3f1f12923e939d6a63ada2a73a265775784ccd62a49650f44c5f9bc393aa4a53c85bd2a578dcaa1eb55a75cddaa61ba140bdd4bc7ca41f9f4e7044a8695c762a5505fd7750b1ed85e773da074e87ac523d55e775df77941ba6ed5795df7a980f03aaf5b792c14e93a55b76aaf73013f4fa59a59f10ee57928263a54d7792b5d12bc4ea5531dcafbbeeb96bcaef35846bc1c5ee7a9505e1704aff3baceeb3a95d7f5d0b5d0759fc72a41ea5bbd742c74dd0aacaf93a253795de77db2ce43ada8ec782d5d10ab4bd5f0e5d0ad3c0f85f3ad785e4703d3d30581c2616980d7a8f628d0a1be1954caebbe4e29a0d341d75eb75aadeeba43755e37848ee5ede83a2fe5795fd7e974361dab6bf13ccf5309753a3c0fe575371fc8e202eb86ce0585173c067429cf850ed57d5d7b479eaf74a8f6aaaa3dec94f83aa6045def7002efeb541d6ad5b974df139ec7827dddcfd7791ecabd1695992ed575ab1b14ce0c379db7a262795dd775abae83759e57834fd5a978a8afa993f1ceaefb6a3a1516af63ad3a6f074f064f062f86afbfee603a95e7752ea8d687f25cf03caf5375285aa75243c792f2ba54f7e293c303808a45c5eb66ac9695d7f5d0b1baeef33a5417a48bc103f260f058bc9597eabeceeb3c166f85eabed4d7753eddd7cd742a5d4bd7753c3a19bc956fd5b1509dd775b0ae53b1e0a9d0a1bc2e85ea803c96eef364e8becff3501eaa03f2bcee056fa553e95828afeb3a581783b7b2fa3a140bd5759d8f773876b07a7c38a4baaf53e950383a1515188b921c327434a03acf5379abef5a2bdcb004e93aafa6577d6b24533a29486cfb9134d628e3c8143ad080119ac60d521a51ba480c1addc3142ef81e28197d34c5170f388ab94646692c49191223c311784803861ba02970d800d1170cf8a4e152834fcc4ad79346f7849e700a047afc8d064327c850135ae1bda254e0befc66070e52bc883043e82d33780b28b414292ce930d5443b4a00dd5f77774f41dd5da491740be9ee996eb53c81663aca544e566c50c193ca8ac552adaca8522c5f0c2aab2ff5add0925444910c6b46b5c2fa41b5c074a896950f2df973f95aa9330400c593eac55ba9a05e2e31fc68e069e548cb887abd14e1ede448194175aa1e2478ca61c8904b001e6a05358466094f519c7429986b861d8af0502f7c35663ce190c6d30c474e5680f131808f872208f0e4820a921615a07802b2c28d855794f0d423abf01022a0b552f95c524ca8022451040be5fa6a748af081045476c8c009ab0d06bc782ca91d5c2b2094905782851129a4665680acdca05242ed580119f181297830c2054bd8387111872011c613cb497380005c72603a2e9e5ce829626505a45a61bd7c3e443c7c31ac00591541e482c40a92e307901595202d48638f0f3cb5807af5aca86029b8a856587ec804a0024f2bac2032cc0cf094fa5aa94ed5836a25c543b523a603cba9a2831544b5b272c16548a50654914a0b2ac070c30b2cec60cd1415b9a1881516b8d271d1f1213a5ab5a0562fa4605f8f4a0b4a87efb05259ada06c5242503f3b74a91c5f4c8a851b1596f801fde08183b5c2828a4f1142452c3bac19540da81a541778daf1821a4ae1909241a506140c30385f0c463c8136dd47fb6a505f2a08990024e0da0d68a00c28586ce0025420d1640827cc447b310c80d20f498e18413a1a028020b01f9d991b6ca0c103b6621d43445eaff833242d0aa045d522a6852a8b28594491852d8b1f0f14c1035d74e75e48e8b0b19a7ff3d990d78438f742b2d31785fe0a694623d1915708c323fd22b321af0167f05865b96782c170ee85c06049a1e38caf187350c86bc0313bbdadd99e9e7598b7bce2cf700649928a347826f74cf9913c70ebbed95fe535691e205f1ee80e84d14b94c40e3ce9c0ad03352c5152a2949b7998cb26a6b858075e3850c612a5b12a511a39c0c412a5d7e31cfb748b0347351c68f5195838f512257fbd5e5f528bfb222cc20d20a15faf927edec0171bb8752f517a813424b53736b38199ee36af140d401935f06489d25865f931ce1a08bb1bd44006ceb8451978d2dda0793310fac800ab7334e3eab4a6da649e187745946ed03e13cd575cf1c415b941fb4db57645abbb6b68e463b308036b748343448e812d885c1b0e090c963412c16049483058905833cd3058528f0bb4e0024298d7df024e7483df54497afb67f257cb0a265841012b9aac98a10a31aac0550ca9024737187a4d058a5400a4000f28b004056c14d0810228501183ee0e4bfa59961f877eab362c0b73b4b4d7fcdb8931b55debaf30b446402a6454bc1ab4e704ee046224c002090840024a2400c3143d98a20153e09aafb3f2fee019df9bdfe06f1e398ff0da703e6623fdd1aff93ff8a8514b89d8c4b3744cbb45a460420a26296011584204ba88c0520482743748bb355b67b696d95622104803026140a01fd083077401e6c8bfe137474b730da9a8e8ed25a967da930f6889a208518c200a2aa2708ae2060798e1800c38a00a072439a007143e80228cee0e310dbd26ccc171e835210d066b1c9cf11c5c0cbd06461d07bf390e2efe68529be78aa3e479ab96965e9a8f4f8cdfe68a734bc5f3e62ef65cbd66eb49bb916f231af21c2d77cd3cb365f3fa15a9e7ae99f10f4141040a184afa49a3a5af0658d1805bf7b53dc1c513483c91f3c4c7000c30800806cc30206601642c408c05e4eef14d6cd2ee3533a64f7aa6a6f934b366fb0e8e0a78a2802014f052400d2e7042082768126046022e208004fc90009d04b0800029dd199f66c6b6da8c6f5e9ad3bb7d20aadb32ee9ab51af29ad95e11939fa90de7e6c5433fdcd2993074eaf9bce6cdf8347378b3e7cff49233bfb9e28bc461210df7d60cbd06f7e1e77356cd9ca967042ce011b093343e8eda4a6b147749b209349ab040134a4db87d20ae096406c49ee689eb101351bc495b6206ad2522b0049125565a0760c201ac3840020e1053820d251aa0840094f8e9f173e43852c759a48e6b08ab2969d72deeda2f6f36afdf4ecf8e6b48e4e4b5e17b33cf5b794dd196cd8bf34ccd13db1fe098c414491c49e23300160630c2003203b0206106124820413e52b5e7edcdd3f3e3d073b3b20e7130478ef6ab492ba90dbd06bcd9f1684fdacdb68634f649d07170fb24f825b533bec33fe77c987fe438c0287996e6a5995714a9c519b95100320ac04501a228801060383e11933e291abd685e2096d24c479abfa44f0a3d41e3c9114f8878a283006410000a02f05084231c7044d3114747b408e9d60046300027ba1bbc398f30e37be43c44fb356f1e390cff7889e4eacf44f363cc447338be09e673e6df7467f46b8eccb65a25f1f8668eb435e3dc6c7c534cca75f6a379f358c398bf2ddbfb4d97c800564e4ee044024e8e9cfc108012044005783d1c9f8c8da1f934236075b7f44d30974d7aab19cd6a1b9d765fb454c80827186186114718a16344cb1645505144511133c8e0498927a4ee0643a1d071aee58fc7374a921777c99ff9f8e239621ddf446d199f65ced2b2a49fb18e2f6d22fd37c791baade5f8185b9abbd9d68ccfb1869e9b0101ff4d9ae35cf3637c735ab327f53f312632dfe2aeccd652866b8ebcdd4e6c3e10ff26cdd672a4262669d3356f374ade5999c35f528b495a56f14719aedf5433adbd35bff6d956919a34198df657fc376b3f5e5ba4c90edd4b94fe65de71a444a841d2588b882c883089f8e95ea2247bf9ebda70fe52a2e460aeb8b7b1ee86756b0829bd444989526c0829b08e276735d35b79455b8770eab643fc3492106b803e7e4e12e289af3d599baa79fb4c492ae227492a24c4ad0a1124e7e434f2b18f23752156bac11c99edbdf945923d38675050520f9a910dd3202449859cae0f182c8949bca40f182c290815105800e144b779e6dc67fb25f59c1662cee544829693114e36381be03a8053c219353da1a98cee7e7c6db81c1edda2b725c9b2d3875e038a14e76f4bb2855e9374e4e0cdf476b3197a0dade4db7236e616476ff847b74e1d9c0d38914e57664176926b301b7df36b31f5e1987a68de2c5220b1d0699782f6661a1e395122b76ac3e49b55bc1853f770e6b806636f6cdaeecea15b260e93359830c164ec6ef03df7b6ec234d18ce60b3da4b33ce7876eab91911d06f5edccc5b9006ffff4e7197dc1610db5bc9d0fc5bc4fa60756c8ed207e512dd2dd4ad7248192b5b2859c82eba1b3cf21a10c3625e03036b401f2dcd22757a248785a27969d76924b5fdcced75eacf44cb9cd325e99ba1d7c08e401a3c635e5c040c65e34843201c571a922465aa0193049884609a49758b8986a53296a02cd5a515ea12ba1ba95b958a7a54799460b3a21bc76bb6127198d190511248b3d5c4e6e72fa9496faf92e217aeb8864340c06b3e10e3ade6df5cb4e7b596de84fef8b41497f1b974de9ce3d3dfd471de9c35e2204d6813339dc160f90cbfa4f8c95bcde4593ea6a2dbea2f7ad6eaaca4b88ea1d780d5e949dacdfea1d3358f42ffa68a712dcdbffd2ce35b92f49b6e4d183a751c864ebbb48e96fa0b57dc674b4d7ad61c571b7e93e6d42d8ede906c2ed44a50b3351eb51790e668c67c7c7e75bae68e1d60c69774928cedd8e1e093b34a6d1dbfc97cfce6db3b3aade2aecd5f213e6f99b3d7d2d07333bf301e8a888a8ac49080322499ff8c347fb48fad919cd3356f9f69edc91f6d247d9324a968c334080c960483255d9a25a231d10dc668b61b7d7389921225b731da8fbf94283948bb34b7b187d24a94acd15301de4e58d8dd3ebaf53cf0e8d6b784a1798542928af58748cdecf47eb38f5d94d48e4adddd35f3bcd9f76b3e1035b635fe886b808fcb3ff3c7f44df147dc2549f16f58876e895074f79757acb1d73aa6b61fab584fa4dc0b21c93a33ff284816947ba6a0dc0be921fe911faf38c3c02c023302b46645663a66ed48fefa6a2609b9bb8fa11f9c1cd0870667c6c82ff617d151ccc3d0f163230e0b6b9794e19857f4af26a5821ed1a2331aa48707bca199711c123d523884b001615378e342424ce28f9ecf2b63a31b9421408693c9643131744b86eaea3bfcc74707240abd26f74cfef60ac1b96722124214001c000f40abb584084b74b0a489ee1ed2ad253f96bcba1b24c993e6b8be991f898339f39b7e745c3d090c6984668c429f7190e69b2ab67f737a18ec56d90d878e49928a331ed220cd18850ebb393f96592a86b93a854861f8e31543a7dd502844721c5c68c668bc22ee953ca0c400a5264a444a9aa0e40a25b66e1cc7a1c861f87335911cf90edfd1f9016f9efcb1260cc3a3f0e833354f517c9ce3dc33cd4e8c4fcff9de22a63f12dfb163c70ed0a9d2debc51c7e5e74a92d449b20ae9ee58b794c0d0dde0ed745aec071dfca0054db77e4802c76b40269396339c87343330d7f299cc1afb4c94c80f3f3fd0fc80820f4df0610d1fa2f82083960f4fb44d0fa7c171bc06e9070fb123d951ec47101cafc15a90c0796e76401c8721f1c7d487d7809fab89c3f19a900667c628f49aa01e4e0378a36f73ace33d47cecac738367b245fa337a75d7fa4c7d476f498da6e414962bddd8c2b8d76622cd24c47da17b9bd68afa5e60f182cc986a94d76c3f95e531694cf5b50f99968a876c92023180c062b45a71e9e9c204134333d4a3149292649f2432bc90e2436289dba79c59a6979f349edf8b624245b2049a29728f99757cc27c521093ab2c611271a0c698af86b249a09a9d76c6da2b673f49ff10849920a854e8174eb880d40dd32c28691288c0cf5122577a2a5bfce2c527f65f2fcda789a35c73509094910481282e404242bba3ba95b48490d8e3ffebd35cf91333abbe6cd7e9335bfe9d69ca4a7a5441ccc91b38af1bdf9db323eaff9354b479a7cde9bddbcd5bc8df44d5af319109fb736bd79c3f533520e52d32222282245912545584d7b08a307287a187a8d8fa9cddfd21e5c476364f2b4b123021c311db1006589928ff5bc3e7e597336afbfc8db393acdd55f4d6f6bb6dac44c4bfa336a4400a31f8c50bd44c987885e4a9440dc5b37cfeb3797f7faf8b7db3547c714477da4b6581119451b284ae24a944092a4e2b5a1ec99680edd962b13cdb9918e96f65094a308d5dd4b945e2f4c71b116110d10490091a0216b742f51f2d758fda54409b4f776521f2dfdd9cdaf9749cdcfb8da4a4bfc771cbfa9bef8e663cf997f32f9d11ab205d8ad214f9628bd942881376a66172979436a0d396a70b4e7a5bd68df7cda9b41ba35e4cd1b390b9384f8a0258489eea65dcf519c5febd471cdaf2767d426d237ede998e284ec804f2ada8a85b0dad6d2fcfc23d641a45b00c0a2bb414c49f16da2a5356ff6e816006cdde637d9ea3f1bc3b005801dba41f3d28c00a0427777b68f89cee8ee24dd227aeaa6d1ce99486fd869d799444a3ac5376a33ffc841fbd86d759a6bded16f061fac33fe27c6f5bef9b624a2a306cdcf64a52575374eb78854e86ed0fecf7296967e6f5277e3e856901f74f751b78234a0bb419a11e3376f4e5ffdf149c59f89b6a4a0209a99a02092a442305810ce2139a69ed4a3472926092ac5244178fc1e4ed747d0901e4ed707101574774fb7802800a65b408e00b2d320cef8332543af01c7ff99e34abbb6da794d5b16ab3dcbf28a2479f38e6efda0c10f247e00f163a6c1372bfe118f39329b94885012cf596a7ecd5ed2af3529798a4e8b0ce9d01a4241e88beec6757c7b8b6ab68ea5e8147a0d48737b9aed8b6f7ac6b7ac33224249de96679e46b153cf8fd4dd3add120261e0030c1fb6960f97968f2f86452b26447783b93aedfa8e2f2fdec1c3de7a738ec41497db91afdd81ab8d3c6918bf289ed8630efb91645404fe484bfbb6ecaff19f8966da2da99767599d68f9b65c1d575b761a9183f6bead4eb40cdd9ab7f45b04e64892d66cd29b793d478e2f7a58c365e8e6dbf2db705eb3e3d8f46e63e06bfc1749fdbbbb876eed804577afbab583057638b24390eea6ddd2c107b26ee9f024856ee970b674687537f898da44f3bcf93fcd89082579e52c755af597d7c842af013d476fe5e72a93fdd342afc13f9ea4686ba5a34971e6a551a75d5bab6f7ed3c5feb66c3ead156414c4ca618d1c86c861ccc1eb71450fa2ee0640b7784ce15184ee46ea160f08b478f418ea16ac0d301cc297f810201844aef8de7ec85f43806010f6fec89d3e5c89c370169f467b7f0511ba3b11a124b46bafff705898cbb7f2fd67441cfcc7a7e744d1df96415b13d99e571463b78836826ecfd7fc2bf40f04c364b2222322a4223f8ec87ef0102b6294842493c1ba1b4777cfd0d031aeb7c133c9482ade6e92a6bb0f50805ec017b97ec7610ec512dd31dd4894e0760c491f3b2d72c6ba2b30d0dd4d811b71d00171409c1a92dac4bf213925c9162013914421624d677f39acbc266d7684990cba1d766d386c82324b45186c86a242e87698c3608f6f608323b411422374dfdc68c665cdf931be5133a9079a119398311d42331dc25fa347364c83e06cbfc46412ee8b40cfd59e3423d1eb353343bb38f84ee8b89ae6a5e1227c8b6846f934b244e6dbf302c9b728df22dc1d726f921325828464ccf4f645c6fc4819df21199f43e3e3ee687f0c71a244ca9af17b1e3ddf22071dbc19cc6f6fc01b30a7c92f529183f635b321616cde4a3a4873b5671226faf14d958cddfe8520d56ca53f94640bf2de680983c15c49c2eece3dd3cdb0cf94c42678a3a58d79336d41a95d4804d05f5e24c7b5baf4a6f3b8f120e731be0d9f371792ee6e28dd479ee88f4776e8f69aadb63aacd6ee90eeee0216c02429b3c134238cbb29c84a817ccdd224fc4c34e97191dcf835375223d93e52cc9e39d9e33cdac7b9917e11140e08506208abc80edd5d8a4eb2d13ef6c05077abda5564a6db6119fff8359ab1631d65aef669b6393a67f87210772dd3e340daf5f2718e69f7454932e620c6e7ad266d72dcb54cfe43c637af484428c9cd0ed29024f58ce3199f4b336636ab8366a537a7099b7a78723ce7992839cbbd10077135ff6462afdbc45274b2c9dd8cbc7992950219ed238dffe48c5a2344f916e5f2adfcf145f0487d20dda211a967ba97b44bc813dd8da3660e886371d79cd930b5895e0a9b60767a5b7f048d7fbb553363588929ae47774781dbbd4530184e936cc4266853538a4e36a5e8646fc5e69595a2938c480ca22bda61a3ad4cfe7218ac89d0b130a191d0a95c4188c024d29913405ca939d480ee0940a0db003658363ea6a4bfca8abdb7da1b6312ef109ae91036c1b2c629d7d860a72cab407737c58bf616e57275fd5881ec0716dd3dcafe69ae1f5174e7cc3f99fc70d2ddb21fb61f7f04e96e9c7b26d9e71f376d3e937971b21f2ab8d178284ae3a13186b0e8ee66b56b488aa127b7eefea1b0878674b70c5184315443778fb27c49ec72c225d446cbf072d2bdba9dc0a3c301c7877609c1d0dd37600f0e785393ef356bbe9ab91b053c680f0d3378e0ee2c3f12af8cf64e7049d19df29f35b757f4dbbd485456405274cf1488ca0a482dcd494a0750f274d7224377a7d4dd8fee66e85642f70ebabbb64bc8d75dc60c34d0cd34eb46a2b590fd78ed5733534047b7975d55f8d0e38f636c1cffa727b4611a24f45708d2f4e0cc80355fd67ce4448938edd2cc8038788e4ee8d65efbb624077374465ccdbf8140549a19da7d202a0e1db4b48be98c26f74c3318b4b776b3bf6ec6374ac4419c6fd193336a8d8cd6088d7ca45b2493c96436b91b39de52e6943b2ababb29ba29ba79704ac22638abe4a5d95a836d708d8d8e0dbe345b65b9dc57194956a66fba6599c55f7a7394e59cee4b37ad5d3f4a5856b3d56429e1f281d2dd39bec36f54948de4f51c72709a991b15411af9f84f263fcac46fb2c1e41555331ce085718cd9eb232716e1be08f7453eac6e275af6a8d1ded3046632696913edcfdc9ea6f3c04e94080c96e4418ec13b735f123a5122a1921f871ccc980e7190e695cbd59e6579c519f095b394c8bd4918f740ee4d12cab768fc7c8b5c3b4a70edb0a069f04cdd3aeeadd76ca564a5f9874cd0c6460683617b2bb69f9d5e4703ddedb091fac09f47597e3cda3b93e5c4fc324c65d97e137db2bb93407737051226f16d4246b091a1524c722bc5244842b76ac3feea615e20e48caec06032fbe3586db27aa3b21b86c168e4e39349b527169d9e7c2c336f0eea1124de6eb19b648a3538a64ecd33d663247a5b6bf6875090796b9efd28b35796496aebe1747dc060e33bdd190c16144433f3e4ecbc4341e68fa6114e4e538f524c0283dd348d344cd8cc3ba35e93b325d1386dc68d9930942881ae192b666cbd44c99528b96b666626a6630c1d377c6d3abcdb9ea6bfcda5a3bb018bb6270ed79a49499f5d725649d70d478d33ae75566dd7bc1db96e687583632db2218acb8625babbc96ac3c56e467ebc35b45183ab06216af8a18615170d4028af58d66adef06bc4b11fed9de1de3ad19286316890a2bb9b86274f43927cad8b869f76d1c0ea1e22f226993564a0f493336abe25cf264be49662232e9908e0209924e06d56b1d323224582b8646e986e4c1bee361613058c81d23152e0d315f3a4c19830e6c7487d04c160e237c16063c6b21b1e89da8576f91bde05ae2e7fe2f221aff16d22f619d70c529428cdf044b76b865abb6480c10a5c3210400625970c465c32bcb86288812b062a5c313c751b392c1c9b7e80f834bfc928f49ad06121f84c347b8e9635340a1d637a7bb136998f14f435f35633cd7468a41f64a4df746f32275aca6430a40103160dc313484428090c3b340c3320ced14677bb729401e63792c38a1c4fd59523880e9b63a6e2b75f23c5a420f347fa4164b8b7ae1780d08d9f14ede9b47b1414fbf21281c19270d7be80e30596cb052c5c2e8c2ed8b85c980107192e1c50e0f8e1c271d3dd60981fcbcc27474b6dfe405499bda13f13cd309891b1ceb8bd9526a4c19985f9918cc2190ffd67e151989bb9df4a9af1ccbeed46cdbf8dcf749b6c6de18cb667ad05a76e77b50073b5c052a204bebd5f5ecc82152f254a0ec65c2cd830c525b1808387f9a3795790d2a0793d276905280d629a376f39e3394b57b0751bad30d320f9a24b8533ba679e75584f72a960058843bb54f8e9ee76a520e5da580a4f7477c75208d2608ee2727e8b5c29acd060c695c43ded64426f4641413d5cae23b832e0723571b97468496945f1f61681423fcc1881b76a8a35d4ebf8654904330017cc0e2e981a5c309feb8507ae9703b85e96bcb07ab427ed8bf80b2c6becf557cdd696117437d8ae9604b43069b1b95a72b858d6a071add8151b546ee0520143c5c9a56283ca8a8bf5060b8a8b6500174b89a5826b5582956b1573ad6a5c2a25a8a6500971a95229305ca9285ca99a2b95022a042e94045ca822aeef09ae4f4a771bb54b48bbbe23ae6f87cb63c3e531009fe491d7d084a1d3ea8ce3d7929890127f396c87d3eed32ae938d707a2e2f23386790d18bed7809f693e4bc779c18c6c88bc06a441aa5dd2269af4b1e74c6a2bd293354e3f84fec38c51e8b47b833f49efed9a3724274a24f4dc8c8aa08748a12ddf99bf5ed6c86bc01a7b8d780d18d2902415721cfc07c7c191c257356fc52f2307439cf09fa44df5645204345fe1e3f3bc3923a39d710b0bf3b5e19c66c67135af63d15e27721087f8246ffeaaa1c38e40f3ab7965218ed738a555b1665ca9f847cc1bd4e3cb9a64df8673793a746df412a5f16d98925866deda446d3fc3b5d4d1ae6e0c77754eae2e00aeaed54b9488dad55ddc7cba3a49e37f1aa6382457b37a8912cd9bb4199f528229b97b89d225f3795f3f1c4771b129386f38e10d2bba9728c99428817fcbe507ed151f3ba63824dbbf4953a2e460bef78d99b789b8c9634f68c356ab36bf37ff912760d14f78d2dd4f08d24dd25caead27e0b071638df6e14607ba1b3b512278fc92da7f9326c3bd95e1deba3154041f38c189067f96c92c52a71f4ec869021b4d30a3095134816c4250136c9860039aebb6e219df017178c01b7d9b90d780e3b5e52f6920cb6c038f40877d59b30d40407489128ac404206db4d1c609dab8b511c312c4584204967097205bc28b12b850824c092a4918a39b06773063b3ea301f9f34e313000ed2e0cc18d1fc69e619f79bfd9533bfe99de6314969335e995e98da9c24a98c3e792f78abe29b2028e6f7d70b9b9fb33437bbbd793b6fee45cd9fbd681cd770c6f133599aa92dcb9e9c51a722122680841209311cc18d2398c01ea10523a86104288cc08311788ca0a3083528c216450840115c9022042916903293124304361a2c7d0cf9b5b61a790dcd8cdf6a52fb22f68ccd8bf317d68204bed303eaf83079bed6dd438a63322fcec36faa2495ddfe9964e1789234e373c8fc5aad9ad97e1119eeadcc5e180cf745d6c83336bdc61dcce5ea44f3390b65968ab2d06bdc6145c0d39dacad011fc9cdbf5df3f622a958733587bc06346f18fe0331c1b19e4c2a49842e88904483494646453c37b35408cccd9c0e210643f862081318820286f03484a321e00c2125841308a10821ecc00613d830a3bbc36bc3e1f86ba45fc4717070401e1d875521580b12780f0fe893e3b09aad35e048df1c9f3ac6344b74af19d2842fda5b34e3fee6cbbe791df79626242269be49e18971c52425c90a8e45c27f13484899c43ba408b617d337455ccb7fdabf4963e3ec6ef18f04e18a20f810041410ba00820884a106c3d06944fe3fd2f2357e582df5d74df2f214cd2a3a495226a3f00709f801fdc1ca1a5facf16bf0e083293e08a3c1f1859c4668c62824492af498fa80c142a7b7dc0ccf3858b3d5a4f69a8e2b8d08a4c977c643d9f8b06c69ce593a23c96b9637533cf3c10c3ee81e5cd183a41e7c3c88010f9af0200818ce4e2c1b1fbf727076f811fd8c6dad555c337912097164324c69f0ec246f37ea37fbe8e7cd8974fc9f9d37776d745673de9cd32c056bf692f44d206099b3773c1fdf7cfcd13e120f5a6a4401d57892a9b1431bbd032c7a8992ef20dc010d3a88a2032b7470d3c14ca7b1462f51f234b0e834721a47d268458922c3bd8db2812849c0dccc31c5c5a2a8d0dd3988410e9e6c2c073fdd385083663ae2000338b09db967f217ee8b7080e3a544c96f50c63944748327dd7d83b01bb437c0d1dd20c5d1aa0d7ed0a0793da887f847722f2428682482c19282fe1c896a30d6c0074d0d5a3560a1c1051a40a021438315e232f49ad0968e835bf167f812392cc4853470a2410e347839230467303103346680c40c723338ea6e50062f9081123208800c7eda7c8b33030d33ba30e3290656740c6080811a30b8000c9a6030c30b9cf002345ef080179060f8185371c679107101192e88c20540b8e0c605b1d06bc067aac1c173cf34039ab60c2432a690e101324a324432bc05515aa0821668d1825b8323edfa7dda8df1a8e15103eb010b3ec0022858008405ae15e860054eac20d3cc7c79b10c57d0df964f0f6bf69a4842b2525af8e5450a9d46245301115400450549d09a2f928222a4800329509202221420010565a0e0858214c610c118538c31448c2488518518454e30e5046784343433f64910e79cab9335e34c043e2673aea4d3eeab7c1ba66f3abe5987c5950707c737afad556a5eb7b86b99c06c5e1aed6b32fed968627c92b4e9bfc809564c300668022113a810c61961fc28c1114ab002c7b5043c4af042821c90a00a12dc48a0c208d81841142350c29892d78673eae68582032814808204ca4e8b200122f801c613c0f80018b76e3087e089100c7de1842f32f0c5ed0b18be78f1820b2f98e8ee8c69a6a3df8c75d4d827717d5b061d045f8080091014016becb54141fe1a7fb4e7f521fb37695886652f5a9ab1ad1f60a21bcc6575ac2357bfd85fdf54c92ce403b6671aff033f0ddea20fe000bd0b35bafb4d7a8bbab0e102095ca8800bcc45d1164dd862025b146d0143bf68d756a7b1619ab1cf788ecce29b9586a4967e9923497ae273c6bd16a861a8d40f4db7899a644ca981111900000002c3120020301c180bc76472c1689574c50d14000568b45a944e1e09447a10a41452c61844040000044044443448020030a9f2bbe739c689d0e70b61d452fe0ec6ebf152a5cad48860265954efb409fbd0d6b4788f85fe6ee9be78411e7ca2bd76a39b61f139a63b2c8393e6565942cb7537f2e26be2646062f27738e05008fdada743813e73ff25cc0f8730d245c2bd4ccda86be840ce29a04fb9ec8a7c3ba47083d713b30687c17908f27e46f85ab3e64917ed57397d8533815485c1ca12013ae5ff41c234f94b53c12f63ec88ea700e3ce0a480826cf219fe673d47b4736f0b3ac819d9b0bfc4d6d85d2bfe04d56362f2f2f000c56e6f114e25d2d00a2a620035faaee07758334f824ff25afeeb937a3b71e7579ef1a3c28b9fba9ff5c893dad150a8ac7ebad04e51a7931bffde399698617f03a58a495f42ac5d46a54e5b57fd9069e02179d874cf2a8f36921806966d00b08032712a2142640438fc13451d98d28963539c1639955511d37d316987ccdab86688df2b6b0fc7eccf6a94692e927d49bfde5cd77d41495e5c60d2e489cfd498aa6a1e99aeec647228c73ee295c1b2d241d5e19f4776c65d630343114f5050c6e22d04c2ba69c94721064dc42ca3a7158f7080d5a12fd28685b855ecac5d553ddc77a5d60f549a4aae7d68267f1f539b2042275aa61459ede1656baa3d8cc127deeae3a2b16eff5d694e4062a1e66e22e03ee2c7a7c3ea2559bd6b7c49c252534629ab9d27babe7c126a0062501ebddaf598e4c914af6bb164444c665b25f7672a74ccee107e3a8471e5fef54546f7f009c01d879af960ae218273e36f17c60b7a820b097a67965eebf5532ea521e93896970a58fc036b4c80c61c8ee0ba3bac1593d355aa2c352412ea1130051cecb37eccdbdff8592472675f3a0b5991b6bb3630d10dbe3d81173e712a04faf9ddb6de4bb8bf87139d1fe66b42bdcb02f6be8c2822c802a601c33195d62eb057c705ed2f3eb7c64e5ebb0668ddfeb744be5a3a8244747c96bcdc8535c58eb4758a8ef2a52d5c5a089655a30bed05967c760f5faad4cd9a6ff76376fc51d2d488d917298d0018d4d7e3c1278cab9a08286b84570043ab32fd4e26b5f9217c6eb95df16277ac523e95b58d4ebffa44f70fa517befdccfec6283012fd6192a8ce685a9270f51c1fa0b051d3dea932ba0ca88d40f10d8fcac18f3b24ff4dd61e936dd89637acdeddda0a286fae6d71c6e6c8cae4be02131cc2613d6995db0cac9f4d9ee52c66b65e2610d6ae0be1224723263f7b50dfb0f64053aba5cf1d3f8bf7898ec845d3b7476144d3bba604c420504307121b162365477e2c3d0fa1adcad675c01b8eac188b567ae4e9f76180817ffb71c1a1f439481f10d883a70d7337dbd257ff76412c60c102bc8422ceee0c65ce4057eb0d2a1d9d0ddece127e713ecf5f1dc8434cdee12f141ee18686969a12ada97a01ea32eb7e1a63655a0a17b31317a07b11be671e756a28713d421ee77f46fba27382260db24ae2b9dd94e3a1ed5bd64f003891051d9c1e644041c0c2b1f0f9e1599f2bc6ffe5e50b4bc01c7c3ef5d16306722694dc872304a4c9e17b0ecf1965ec67d6dc4ad155bd35eb219a3f632d71f9382bb24cb4b5c3ea9f0975793a33a23fec05970b27f72c7c84afcadcfec3e95e36f86115033cf2f2bd1e5a0e0e69a12062b628ab3ff5ceda830ea19152840e5161a1ec2f0cd67678dcb55c88ec917dcca117bddebb19e2ec465140fa6cefdb5fe8f0d6cbbffc524d634adb788f9d48dc1bb78143760f414aabb10ce03e972228df5859033c6867bfb10329bb5077e107033a80bbc188ba61c240bfe6fe02590c8167798d3710774d4a23baa66625351000cbeb4b52d08910a6fad1f58f616229d25c5f69dc44adcdf674e7555e9675b61ed851b306b2fcf36f0bd78d756aa1188d7600d82e8a4f1efcebb1edc01e4cacc00dd4b2283b65a0b59b5922efdfe895f46881130de14415d8b77384dce1caaee3e1711d9f6f9067e0d10b49481f1388dd7b097fafb5542755fb0d26fd7df3b5a2a4583c17ad32a69a0c114db0a17d6469435b18cf50b9311cae68e67ff0adc7b6e7aace3963c88d2a60e25e9febe50da53c2bac780178b1ce4774c0cf6a8958f675c4c0d85e4095d3998f5d12f4c352f0d50305011a3433d4ab6022d23113c9aa94c24220d8650d40cb80425e52151ce282eef265527f3702a605a03fb15d4418b799d88384aafc0f472ec2a495f62098460806fee0d16376f188c079d7dcef1e1a3688a6932570ce5954e61c20f50269451cb2966af207e63c9dcd447a3d51494de479923949fbbab6d7a29c99ca6bddc78077ec73458167bb00efd200d1cca2c4c85c6c9a30e9ad936c6750d30ac5502c1a0cd14952fa9dd84c17ec6f5965106ba404db505ffc97d7b7e28dc3711fe09fb71c2dea04dd463068a049021a75617344881f48c0b765a99b5e0dbde72a5931f1f87dcaeb27c37d011bbf49e047bf6b8a08adf40a12d91745279b98718671046a4c116d35cf140dc9f4b6f80b6bf8d7fb20b491645117784e77dce9e4272b4c4f450c5d5511e0211915519bd9d7e2f035e0c435ec23d930214b3033ad85dda2065762dfa381421df644720117e93be2fe9868a6252f4559a6bc84fa651ed81dcaad50a8b68836504d0bc7e57e621e606c6e0e074b16e1c49a47d74ff2083724ba31ead72bb006502e98109ea07f76b43ad8b6c4e2dcfa60df81fd7dc3ded4509a24de328172e30b94cfe862ea08daff08ba5bd66fa73ddc8538a41e96cb404cf967b9a1dcbb33bc41c54010e170546e51d2d3659285ab2e3a1d2aa80c41f7e7b21266f4adf3a889d5f3f0c813fd05b04292873d6072e745132341dd5ffa7b85427d4bf47888977332e28793861456b1caa0670fb282cfce384471458712d20c69a61b30226bf175690e972bf215c6dcf6dd3d37dd406d35fd2fec75fa8e075350703f799d1f24dc409c27f2866b8ff5263c29349f4656e5e748add305e4d77be58b4837693251351ec364410270435881841d7b67473eaf8af638570413bc2a7746b3c9e85f56212a9cbd44394f459533b5ec96c985880d9ac41d66fb25ba23f62421f68b1f30afc8552af3aeb7525bc70b61d64a3a68303597c084fa90308730b975b37e400e84c4d8677d07fdcb3c4f3f74ca5dfb6772bc03e78794ae5719690746f0771ae9b885b1038406a36b30728b12a158dadf02d56e1721dca9b5058439e74bbd16a2b1118a40ce416121ae3bb8483f9789b310f746f0d4055f3545516c12e4a6a5e97f034d8c074d045c5402688e7e380b4847116da5fa5ad3264822c7847acd4b18a60def6207c409a39cf9273571e441e85ad37e0f8cb4917b5ac763a6c8bbd1f8f1a022137c37b263fcb69dce95a0d13668323058e59e9ec647aa8bc42562707634e511ffd5bf66570fb05ce3b3748da3b17812bbdf8ac4f433777e3830659c1e5f8310c5fc8a0641402445ef2873a2373431614335477e6f44d5a530451635d7dfb24a5ffa8a07a5bca0e006b2f83e89b05b76c94c732209c4fe362f4b48969273e3a9068596976c0fa662124024c7d1fc27f0522cd06fb8fad8ad9a52e2b5535371c7ec5941164c5fa2d8529b4335c373b64f554f54e3388235520cf5910c2e28dfbdcca70fab07b776ba9288c909a08b94ea4317cd35ababf0f498713a981a63bbe67942e642a79e8e53a4bb7ecd1f692ba9324ad46686d1d34d6888fa80b8182255a5483f52cfdc9d271c3b6ef4a0c056ad830c582bb77199a5b1614ce2e38e69099598097680a6b3933d117cc578981e439925ab5e789f93b572b321cbe4309f9600c492b44702610006d4e990bf16a69d5918ca34ebf0eec5bc4629dfe64dfe09bf5095212ed7c7242303eb887f38b0c5c419d301951966f7683dce0d312e1946881c5778eda8ce988f3c1f3512215f2e31a1e69941ff6c0176bce0cb6fbbcb99b1ad4a4dbe603e87268a98227cac1ed68d9370c06ac857a1d5dfda12a88c26ae3aa6fa68394edc45a8160dd58989ae4de91aca11f5e2edcb8f53d30b665027b773c69874338ead801d74c5863113b0f2c8059aa606510387c617761fe30a05aa95be9743ff581d4c9b59bc9f24016f18c7c6cdc5762209f80473983ded1413865a9e251725f11784505edc8604a748206a429b221e1cb75ff80d722016db43502953214345d0b000cb1dd1a0bfc87d2407ff59585c04767f0e2df035322126910143fde7242f48d45e897683aaafd9ebf2a5aa685d178db12234d2af01e968605b6ab0dcee4e24db8f0640ec0ffacfff9fbf9c65b192667bd1e689e621dca6aa9857a26dcd69f65abc92199421b8520447745e095cbd50cc50b2913244ec3af21be495786fcd59b4fa22c75add0beb5fb70af96a4074be80bd3c33af4c51de0648fe23bab5d9a07f405775093f88a6249ba23bb664bcb1f1438d98a678eddd65749e1078e27140669f358d0338a163825ecf6148c157e7a2fb2194c0fd3948dd0e66d714c486125de17d2302b75667ca9702345935ecf7084e181ad6fb3236728bb708a37ac8624bf4c6573c9022a727b2b778306e61a3cc16790fc956c4133510190721c28c5b1e128b321c4747460f8bce1ff8b81a13783187192bec66a9d0aee62851cb1fd853aea245cb6d483d8239ca94c64c8ea38d931b36f8fc60f8a2ac330c1ae8f4cb30f93154a68eeca5028bb07386683115b80060e5a9facf19af8eeb94220822b165a8efd93dd877de6d59458e3aaa47df600230bebfc886ef68944916880f755fc739163ed4e15ac111135d0b0cffdf060ec02c4af82772f8fa45122bcbf000aaac888ca745b3058b27355f6b96d23bcc15d57fbc4c9539d12b1b37c916d694010604cc508447e908dffb0eb23d3cece01bdbe262609fe1ce02b0bcb8f1fdf9fce22b5f698d87d305f709f5a3d722e9549e29097a53a3dc55b681111510c23ce3fba806278640d797a612299dbe617a742d3baca209e10629a77727fcb5be69bd14a218b6dcf252db6f77ed7ce111eba48ece012f041ba3aee427b1ef0f24d8897095d78c0228db84d606c426ad1a12a1493ab8f03eae1347189170906bb1f9d58614ec8c6d01974145b175895c5ba727f12ed068c9f1ae654d96c50742123c84e9a04cb4350aa2052d54a2ebed53d563feddf1b06b0f4c23b7ba1757944343939fc062c88a17fa19c9b578437180bbc3720bbc91f3c02b46b0f173705a21b824a81d3c285343f51cfe72e16502363cdefee3f6aea16b0dba1af60ee2209ab93c928a5e16867cfe5e33debd1676d5e3632d6aa8048e0d79690e67320aed89f6ec048d4bd2d70648868c9e38f67707673a829e7f2b91e8221a27e20fd6361f81f30b7ce60b301b5aa4c58271525dbe864b6207550b32a0e773ef2e0c00360fdefa5af6f50b35dd856d4d46790dd12611910098d8cf6fe941a33ec75e26de9fd637f14a0154766bf9d9103e985d09350f1acec4fe46ee3926bbe7cc90ac7ddaf3766d50fbada080e1d97895e807b54e425849a52b5e45a3563c5f6f08e548be05c749e87e6f20de472fea854a8ebcde9c6acc7e2599ab1efa9449ecfa2d4796a91d04133b60957a4b52ad59e8db5f4a755d041d4af45dd62c55c879c774d0ef1943c795a5c02e3f0ad150cbcda170399f51e65ed03b18e31391bef774aeab870aa6bc5a6039e6b3524b940573f38e2c937fd977af89cfceba22133178a69214f0ba8695ec61a45c886842a0ee4858a3a830cbaadc7fb2253d7c8eacae22ae05985b778e0ade9ca13ed6e18231d21e351cbcddcadc54be81411b040ea0815056ae600669952a02a6c37356de319a316fa0c7a84f5fe6ed564500646e8575f90974fd53882e8a4b8fb0b285e012504b1f2a099b33c3e4166abe420df7b17ad2c9c06ff5d22e990c80bc2f415756d1de0f43f23b9bdf1103b1d5935c12625894fe675ab579018601aedfa4921c29299962dfafb178a4f8ed8b32672477e98f32adf56ca7491ac386ca4bd2f27b4eefaeea4bc3cd1f8eb333801fb604803a3093c11684a1edb3f97b2a41a29589f51fed4c5ad8cf4c3e2b0bbca04eaa5730632eb02b6ed70ba5d6d72e2f39992cd152e80eb1b7de9a6d084a8ff8220b191a8bed2bf8dad3d529c75cf3d7d14f6c6358d19b793d16ae0d6bcf2d84c94f433056870ffb63ff613a920967372275e6741bfd2de2d1fbeee8095b60e5f33b6abc365f9c1f4ea14944c0ff870890e1304a0c78fd2086ba11b7b30e6878b903f90e26e558c600079cefc1306f1b3d6cdf34573bd926de9d7f0c04196349e92e3eaf934b9632188163700d110071f883b5fbb8ecaa5383c22ee96271c3e1b48f6beeb6b5122f3d5b93c620e1f4f5405052a0bd65542aada396066de5918e86ab70d5bcc959d0eedd1ed6a4f6292a84030104b21b2b56c050a23cb8248212927026b97176884ae09d81cb37a30209dacb6b617b710a76dc6c45be3a51c257b39eeaa558cc1fa0bf78aafb706deaacfcdbd29896d11fbaea0226db543ad571997b635fbe143884bfdc1f46bb05271a363308772f544e8cf37ea686c4fee178b79b68474fcb2281f50f3571bf58b2cfdf74fd8948d2bf13d05197de548520300b6d07fc6f69469a1d156d3e763e5edd1fc96b4211aebf2d86b0954c744ecb25272f5344a2993615c91e6db4807677e9a054f3490ab92ed2598fa8910c9c897e5979ea2ec998d90b8761ca2e10d71e519740111c9184297040d072e48f41bb1446deb4a1e9c0d89de0de2a1a188d18803077972e398add3c1318fa247a0b7d2e4357fdea64fbb2f909e189e44f5d1a1d3daedb369c9b117aa9509556472475dc75975e2829d668e5ad022aaedd33ebc6f7c0dc50372b17fb76e862a8449e090b06f33d8f8c69bc3747a1c3b3d2593695612cd3f500239679f6123f23057890bab16442a024be2230311fe5c40595bfe5caaefbb842fa54be11415f5e1d5b3192ce5b435e1efa3eacf5eb73663cfc1cb91e963db185f51999886ce9c2b54df8907b13cf010313c8213ed58cdf4c670e238daaf14caa7152b40be4155bd5621d563f0414663174110a0ee5807735180ad7f1c22aa2a562ba61c566b0e9151da5c5da18226df952b26f58580b2ebc04b2b787214dc6628e81023a85ee5bb0dd167bf8d311f14751f4433ff75bdc948c521ff3ad2be4c43594cdc3caaea978042c9ca23533f2d412d4d182eedf045956f8b644224cf68a955746e4ed9c3ca5d894cf52b69b69fd6bdc7636d277b419624b494d5ed860a2199a8348b13cb9a589583e53e08c306f9716b56d0f5871cbcc805b3d23d4db8195fff65e3c50ba297a0ce999d31b2ded7fdaf9bff19febcb6bebb44f434bf2732bfe4bb9302e7930012fa9935708e6b738c1123062067fa0f65c96360b626e516d9beae04f2cf272e076d59d21a8b1109ae7adaed56e6478d9a7de45b42f3ac9c109f26df5727df0731c6628c25d8a01cbc8c30671826ebdaa77e1f34362e412ddee77b0d67fd5e11ec687e92b64c9ee11a6f0fe252c1ec1e2760f1e927d8af66a990646319dd278c1198560d0abcdbe461fb101657ed6c686c8a37a24dbc3a1375e6bc5bf7c30cb4d04aa22f46b20ef9318bde45851aaac4834f1265db2956f4f11a8e65bb1c8aad0107a26d1dc0e1511e28a2b19e4a5fed62fb95eed75a2be4c09a439d8795523314eec0b5204bb0abfe98a6468e9b58b4451446978a75abb510a89aff00e35fb09f491d48b2a702288fc654da8953a5a4469e2f4667ebccaabd30f35e7bab382247e2a6e6500e565d167b608839d07ea69dfdf8d3356bea5fd9e88f7bfdad435554df00ce54b1101e46fcfe3c1c2e212748c5d2a9843bc5ae780be6a1e404ab0aa5e3146fc542f85d64eb9999f747d8554080fbe43d57a368690f10cbf390fb6735d9ef982451298ac1df1665706b3aed4ed12268feb7eae5ffd0405de552ea742e2b725cc0fbbc14351aff3361be35e3063d1483aad357a5e146d90bba0cfe7b03b4c88677340c9affef70cd8de3c91d7fe9be92c4f66641108acaa926e6adbf0ea2aedf0cd9726300c1a5ce34b7969d29e6bf403aaa10bf05517a8176ecb04fb0a42633ab5d8983feb447f14938d3d5e8c3cd8a4ad5288d2f8dcde2194967b2816a27c0b4f1527b4e72e2e9b033db7cf31dc757496e949c8963d990b3a203a4521cc4c4c47faea827ac2bd70a79118f31b6aac4524330b4008b3e150c4218c824b1c842d218ea804ef87cdf22df50949a25190593c477c16a70bc6c67f30858a981b0c0d0ce8b5cb241907124242c9d3c00df41170b63cb349fff2875f03ce2d95b4498a224d1d3113982037c842a34575e51a67b14db603f249ecd5b49a277f3b44c89d372345aab1936bcc0fad3b3098f3eb0b9e80fc0071cf8ef78c2dcad98fb48ba66b1ecb56507c696be0a08778ca1a233e5ea6670118cf5e2d89d51c6f8b64f0897cdb39207a68a33a7e081dd1b9d751ac57791ccc09ac20660d6b3b339af9585d8322e1acba77661456f3d8e6f5c4d5aa2c0432cd7dfbefce65314026d85d49e0cdc4379761c6c063427da4046f25f5a353c26d866f5f04ed56a62a9313d82cd6ce1dd8ab3cf7ec9b8976d4bbadc10cdf6a4ec7e08ff21c0d69789a95466293a0d96912ca90ab0857bcc5a0bd9c8e8882a097fc0f261d3a066b0971e60419dd5c1755f0bd45f27a3845d770a4ca7bd5e6385205e01df957f7720564cba31aa83463d3fe2b162e3349cf781ae8cd99e4960ed903253e5803562035a6528907cdc6302e42454535bcacca5dde1b3a3ea473f680172641e935f2e0d8d451ae049ac05fe8d0f55571f7035de6bf265bd085c47b020892722dc3a2f89fa1d1bf79339db0f649c62a2ff0e8d8752b4d7918afca0d6ec0ee005bc3e4c9830206ee8f9cd6d61e55f815b2a0e757c3dd13cc995c2449a7d6c90e3d1d348e953fb4b360a04c8d3f02c0874134a279bd9be621357ebc735a9b0f5dd1baee74b6f84f7ba34726f5872249c17b7310f465c806ab3c0ad337671abfe9ec11c9189579042a6a524fdc34836ea20128b3169950c368b96842989b768a640299452e8de4a9bbe5bf32f224c5178b4e6520fe517072a961fb59d1aefaa1976fd9ea5531fc8f287959f88939e89320d0deacd67e8c796ff70d89338eb3b13e0b8d551896494d357da3708e353355ba96817e962fe17de373a1fc1760fe1d5486b07b81c779fe81c3c0362ea758629e5d714c14cc5d19e7c0dd95a793742fbf7e05a39af73ba78661bd3c90a379deda789670bb41d12da66941cd424368205fc956b5c74d13c8b12e4e8e2c944153b38a7886b696ef4070512764821a3206dcd596a905d2cf8a868c0c595974c665d38c8b7383cc73216a4c04a8b30b34f448ff64e07530a2e197616093781addde12e7a437edd4fc5611157b63f8ab7d8d256301201b4a0532e6092e8b7219afaf74b51b93157c69e3f207bb14d5c03099c14ca8d575978ff794d3ba346f9de06e1bc04ef5782da77fb4ffac741bddf052af6c85107e9c7617dddd881c379e25bbf8f92af58f7afdd4253891c91c27f4dac8f722bfdf8fff53bb6361f67dfacee30a979e53e6c88eb01d8c63f75cef8981f211205abfa750963e60e133f30b77cef21d1d599b1b14b0919af049a264b6dcd09d83512de65af54c7d1143ef4f6526922da64747285c193bc70051198e88e46a66f9b6b1cfe37c23f1044ccb044f51aaa3697b0967b1d0c8cad3d6c5bba93dac3b1f0d593e5a164b894b1520c6d3aa27e9d12521eb0f67823730f21eab1cda927914a6936cc10fe340f4c2a120e99002c14261f516d7ef8a4bd713b8c5e18cae510824a341fe86366b3dc831aee083319fbc8bbb584c13d9632ab29f024b23053f4bade7e6ff0d16a9225a837479165825090ce6e30fff75540137455b4223d1ab0ceb904c2a9a12763300c6cef04480a622b0385765a3dc6abb03932974b20c0b4c02e147667d94c6911824ca9cce303ebd73122550a687e88b2faeba5ad3c9a7c3cb4c08995c045767f6898f48dbd088ca45a878fcc41ef3527e220c0a47b21a7779b59cce4379b4d464b6f1cf41d08b63e47fd6c352a91febe9bff1fce9321fb864a191f890d6c75e1b85f0cb55d2c700a1433cc86a2afa1b95a6343fea861de3e448de0cc5619cbb4b805465152744b8bf20879e4101347ed01915abd425ba6d601fb6c8e1371a30d352d5c2dfcb7fcc2b46946e34124ef9d62aeade5bec241f7f044a491951bb62c1dc08edac59a9da56208d15c911e63d82351a26630589dc2eb498e725ec85d67a7f12f431d82faf58084d226596884cc83c8884d88ccaaa0581633f2ec9da326d7bd8347986d3cf0e08a3b37c36b566548c4495c2e6b0b4e06d7e2e63e4953489261b6980afc233a79847ab8a6c8bcf4c87b9adfa18f991bcbcce4def13d61b26414487a6a2296000a230620ae87ae5dfbce9724564228913f49bbc64947ec4db42803d22b3f67009822a520306253f3eec2882825cfbcda69b4099093d6566511ffe970829d473151e58f494b40df9da67a74185f6f43263348052558bf441c12b14c965e23f46901ec762aea239a06c3791c613206a1c4fe6f5ffc180dc9cccac53ab6bf93343c7fd884cb91c20fab65ff11fd5670be564508afa96a131523b9a6c24c6464a1c78efd7601c003d15a44464784cdfa3f7ca77d91fc5b25feb41bcf8a80c20cfda8e6353783ba7924b007121feb3cc65a23048672c4dd3d2b3b2302050bf8bed332aedb7aebdc83f50a5c76f8b593c9dd45805088de71a31467b7f3e83d1c616664967793d796f2b16a13d88835390b3d21fce411640782560ffcaab9b7374ee5c5def6e4e2efe069f4a7f1d83691a137ac55cb45f8ad45507721da68a82fe55c32225348faf5f9a9a281f1bc24beac6d308477131527a66a72882db504f29b04a8b19a5c7ccc722ca7e412959d0b6f6bc09789a3a59240466d8d7cbbbc8492a0473cb110be4de4f765c5166ba288f967fb605813516e66bb590ae8018857038f90a0e884f0c01339b8e236cd2f54268ba1f9f2e40210b5a68f27caa07ab526def05765a8b5bfb3d8ca2d753e1b20e4e9ad1a761676e1a64a838db5de3af21f0e905395fcb89f77976e2353ada10f84e07bc228d73a8c70b41af84e2165d396c27c3f7009d47f13cddf9722c69c919ee56e441ebe077f94d70990740807b67c5722afc3b3d3d825969c41780abc16059065c4711f9f635ea4a0fcd1f9040e4201129efc1eeddd1eb0b186b08811bfcaafc8c13d0357ff6d10a8191f61b3af8a2f12d1a52303f7a54fd144de0d2a71ff895c6d89d49f8856e107fcf57498dc07c3b8ffe1a2c6c0cae1bed3b599b12e8de59e39ab107213248cecac1d2b35870da364c43119f4be45f328cc8e867e07d4cb7d36dfc2fe2ed409410881a3071aedc4f8995fbcba9dcbdf76003fc652b7c566973ee28ad55b6908c76ff189c326bff01c31adb2f574a98753537dc5fab39e91dab88708ef384859786b307413cf22f06d497e8c3d9ac1c7630660d36f96827a0adb8d62e7cb4762ae085393898e125f5621e8b645e0cf126d94c91a50e252bf5c0af4dbbbf9d8955d8dd7c63b41af6c2ca5ca3a0be368a552d34b0c74c7cceff45f2d6d6a85daa29695179c6d5913c15a10bd81926c71d84c1295debb73b0ef2366e169c86b161eb0160bfc91cb2cf28fc6a6df9abaee2435b278ddca63d42fccc3040db90d98267096265cfd8a622a088a7a0e31c85f308ceae69200a89050a0a3096612154310f05423888d0dec343b02046ccadc08979887d3b856cc19fc125c63c704d0b22e61b5e3be6379dc0adc6ce96df028d1eb63c79ba7092981b238701f1bbf2358fcd792c411a254680069ea7e0203ace41d37cb08f2c8dd0e3a1bcc6c384f1382744e5f1cfcbdab510371b126e44f39fc66376faa1497ee031d3e3d0ca38d52ebc8c69face7e1a09b70607d08345cdd88ee00711fa9ffebc6f5eed7ed2c21473cb13434b291511ec6e1a94943d035e4837dd2a5f6f39ff4bd92b270e43bc9e405fd8c73b40767f548ffcf517e3a8d0ea16df7093a48b62068d05d3c1352e445b0350b47bc8dc04cc6e10ad831d43f8745655fa73a3bbe75bd3bd55e9cdc8275fb36c06cab8e5080f9e12cb2a4063bf7f8f5b5c48be871bac39a3bf8ceceb6483acd4a9acffdc73a2988617bbb87334d4fb22b4ef0735b3fb9cffe20fbec9655ff44ddbbbaff6d70106dbea171b247c337788fc56179e28c99fa09ad9fe38f377140306b7fd2097b9472885b679c178e4875ea16b545201201ad7204715888fefee8080a47ae9d8c8103560146be27cb180b47430b2fe0c0208ae725e007c6e5ecd6bc7e58837bf9dcf10db70a85c02bebbd77e38c109fb66bc487acdfb742fb5c26d92d114dd848928c17063fc2a82a5a911a710fecfb8fe12a15b828e5db8493a7b4a325d655cfafb618e1ddf2fc1be05d99b4871c6caa64e0f6391d94961010c931d4431ea2dfb4e594beaff2108ef396a4cd8db420d9b55ca26f40f9776ddf8fe69ac1e26761ed6f5d49fab37be34e7b8936a528d937164c463f58ac8306cb791b674cba1bec6aae4a0093566480ad342d862a5ec4195b034fdd031f3ac741c9c76653fb7e00c6611338cd420a7972c37073224622e6fb6a148cee76b23f361c2c1242e68c27f088804eb7369194cab799398a391f0420129cc2bb51200e8dd09861e6cec74255f6a31be49e5fa34b2b5bffccd7112eef8dd3062b81ffadb95421c859ea83850df158ff5c371bdede64c42f5934602308a5ba0a7242da05a4696fc7e3ea3c8c3a14b7b5ff0f80de19dab9aeee86f25c4d6c6cb0c10295690ea44d67736a2eae869cb02275f7dae2d7382a5fe59f9ca4aecd5e0a76687f9427fe9d147995e129f4f3afd128fe5e523e82153cfab0fcb1fe0f3098e9d2821f494916bada9d4e94115d35f4426a0109f28399846842ca237b82e201fb34d6783e6f719b2985b87372e56c7e746dc754eec157473de9b0b1622dcdfe8cce9a8fa6e22636c712f04ec659139dd193ba8ea5c2bb0770e65aa77771a463c9d436d399fc29cd9aa17eeedf02a6f65b63acdcb99f7d48e54bf1e61829b7614796fd8729eade4ef1d1c0c5aa94757e338481a2e68f85c8149d8b6a3d97351085f17df025e5afe69d2531d09272cc5d439b09a4244fba23b0868f98a31030a759c48e6cc33db1ae02c50f01354fca3178e35cae4cbd50a4ca456acea78bfec2645d4ba66a99528f59a8fbec767e9347e81f3e019e960785ba8a27aead8f0576fce3bfd35fa081bdb7ef17794dc08109430612b0521fd7d80ebccdbb9bf2eccbdf1be0ff87dea573d4e03628a4980a4bc498e39e3242be57c652db2d06a45f5df8a61676e92c5ec14261775081e5dc2a211574be86d6628164bcd19c2fe3ebcc34e98049f47780e92dd44b683d2d985b4501e05d235999754d0e3387dccc62344e72118654b289f2bd0dce5f8fcab0005c4870281588a989185662880caa1e8ba422bfc289b0cf0e0e3642bffa1e70f1ae6c34a429024f4b36a42402af14ede33baf30608320fb53d52262012e066ef47d05d88379caa2883db4cd44ee9775adc3661d7360a8d9e7c3647ea4c957e69ae5e545a871639f54c3d3bf764689404a4323a17d6dfe6c33e45d09622b94e712140f267a2c6fb8b922f65c708338f1c467889711c55f655afc9b196a39e7c60b5fbb2f3b54d7be77fc4ee3f96b24fb137af5d8bcc2141853c409908847601d19cf8388b7572bb94a57bdb89f93fd4019e4c360a39d1857662dc3bcbdd5d8678e94f742f8db173f25e7822afac7b97cdb73eba7cae20e13714a5cd03c1a2886dc78940157c8535e2913b30cb4e2f5f80aa2905e216a93c90762fb9518edc35e620c3cac0055e65bb774fb9464543df4b122ccadf761750b448e7718c453d2100727d6b4b35607d4f4eb2862eb0e94c31502f1cd11050d45e451cbf4f142f4b364ee2f67bbfe8355adeff059b16adf8ddf6dd07f8bc27e981e8652b682ff598594297f9ceb340054cf148878c922da2cabc19686cf7d1005e3e923db0d6eea6242d5f9c26b250c78125bc00a96eb046224e8e620e085a79de23062eed6c6e80693bf0114781097b689c1bba0b76d500faf94857d590d4ed4b51c20da031d47807fdafd3ce9f45ab9575c91ea4308c3e8703876c29c98490f37b00f30194e81749688e814d881e4f273f96c1b5937ff54167d7bc7312fcca4a7c946963e5f8f66fbc9b16111cf856ffb051e8011d6fe79af12c44899654b0636da6a6e2dfbfcbdef2f79e4cb139a6449946987523563d7e5880281c23c1015d432fce7dc0e1543b2ddde5deb167a6bc09eb2472197748c7c05a93e02202a872de2a6bb913797aaeac66b30eee11128d8983b477ea7e7e653a21cbae41190fa86698d9d8cecbcbd4ea9f2efcd6a6b093e4e04af82cc18aa755429fb599eb58ffd14fcdbd9498cbdf8f2809f1a127f23597a4e6d43d37ffa0bc8c55181ad20168bd38412bcd9b47a31a9f16cbc5028f22bea9600f3ef06ad29e2f57a591647cd1eb2750670d4ea62957e55f884ac928bbfd1e135422ec7fdc6e6da3d187fc9b2b25fda843ac5d0ee93ff0e235a5522fbfbdf9d5366746f9795056b0e03b0e107f3e09af1db9985ae342a47f1fc8279b9cb665ce695f5f029cdae3dc2a6eb363378052cc6554898cd4feb5eefec538fbaeaab52ce54031b2d79435b2e32cd461fc21a2e4fa1107fb3143547fbdb1da3dc0fa5da578981a386753dd978b0f4662e20ede55711dd2dd77b4bea9804ce7dce8ffbf6db4b0db8244e8e597955a388540b17dc75839d6dc15b1d90774044acc16379bed66e78ef52fe79a836c5c23d46b9ba1951b67f3418fbb0d73fd9608e957279f7579054744681cfb4822ffeee23d8ef31094ad787cc547f6de10eb7d454831c4a123ff0d21ccc88f06410697de8b954fcd8815dd3d2b91fc0bb773d0f897dd60a854395d18becac076cb8fd32b48ccb482247c82faba6e025e02a4a26a8afcd0010995a56f75543c94f8a0a31af4aaf370ab5da49e5653f7c415d7e2e82ee8eb46988d04bc4d40fa02e67c39376aee730d881b73f52a2cf99a4f3574ebbb02611728d4a6aed1e1c028ec32a0d5d808d2f64c5f2699678c58ba9e2c6d9e703ff896dee4a3794860e4ad333302e5f8be7949aac9a2a188aaf074be2a15da03f2680e02f28f9719d26e911d05797e7e1f417be5090cc891743a99a8dd96a3e23b5597ea388a08bec6ab5d792a7ac785df9e3acefd481e198c17e1e2188c2f5efb050511f05c43561787d4594cb8dd8f4e00928425c46a144e8139e82dec8e0841f59a7aceb87cf2d6a4add418b96b98bd77513a9d17fc202ead923785de054bb89e054ff7e1487aab91f945bd3c074b08cf51221825910d20bbfd2d8de3910ccc8d7f4b402a37218ab818fdd804d4c4306b0edba3ae40b3aec49349fed951819539ac3a7d2dbdf6162863061a16e1f1da4541f08723cf333e84ba015c72c250b4ff5cffbf6426cb7f1a2360920bd95cce68faae8fd8042013b5200126e4b25dfea439b90865ae206783e016727e75b26d03eb73ffbe2a86afb38199eaa34be19fe0c1ca99a0b6c17f118b9d872999ba6baf359b636844ed8b3487e1e31e9069eb1f42467e435d37707e0781d7df46094d9edbdd7a8f963a54fd301bb470f49282bb46bc2e238fe94ed036b1b8c331669b09e50f6ce9e9fb37af1d6221d083baf3a86b6a2e1078c935142f9cc34b436aeee150995878de94562411033a1ee4041b5effbaa583c6ceae139160ab76d31874362424b4f23cdebe4222239afe3b7495a50400e5877da0677f98a35518bf1f274d95db6fa4e762fc521c8cc5cbe2ea4309f3adf896b37f3ba9f5e8763dc39ef185e24dadee11ffa7d52d6eaf1358edbaca607c0e34ee37b5c8430670c9c6ab5cefabdf2b33913fe2d7ec83b23220f1d5129b2b79574f54dcfce65662cc3309c54fb0c038db16ea5b608038c30e40ddab628f742bfa2bd9f88b2e136c394caff43e24ee8835ed2d725d40fc5ca4bf312a13ef43340afd01ddddcee39329bf0ba9735820ecfaba4276eb03af607e684e77c49c61de3bd36b83fc5fcc9663f7877cdf80f4bb2f2227d51b2ddba941001ef2bb54da22f1ed0f6abf983f47cbf6d0452c0813ec5fb328ed0c19cf25d03044b98cf83044a66c854b34458a8dc06aeb7638f66f9e5deb2656f319f892fb7312164cb8618016cfde0c19e7ec2afd8e4217fb184275cb8f1d22fdbbc348a241a41e4f64f3cba96d5d709f1b160e81d0f36f8801b65c5f48cb904837434ed6c63f2489cb61292c7138d5230587c713a775856b1141370d7ed4dfdc42e258b4780e9afa308d3d3c830e81085d47e9bd15f21f4a64d04bc2c9caf4f0880d9dda9658f343c96a8541a4c55e4cb0c050e2e24988eeeac160acab68382ff35fee0af9147ab803304fa55162d1d26689a8ec01e7ed30c1a5e441b1aa90c9a57885a94ebbf183f3de540b28fbc9a8de1a54f97b52d8fe10c82e55ad90291fafda9bebebd97c28c05905be36cae0bde5a853283ae5b434f747f9dc63c79338b64d6cf640ccc47ec74d8dc194bc5694169e8f3efbe714cd6b2a0650212a5f9fa1bf1d40333e26db4a9df989b271c07dacc864f64d4ce1f19f011ddad1cb9c607afeaff2f7171d9d14231076ffc2b81efc3f82b02fff915faeab1da7972cd0c45ca633b9930514894c3e3e866e9ad13207069b6d9e7c9fe141721409cc53a4d61741704010e19a217d17148d93afab802962118f876784d2007be88e29a7ee11f6e44007153ecc26fb43e4e3f6424ca3e6525df20b927d00fe630596fbec728b74a989f039bc873f1801875b7a43a556b9b9d9a79b6390c7843d09e752b47d0e56a46c4374d6a9b1a12156b210ddd7f9a2d1fe82016d2b3f897953709d98801f3e1f2a33284d8b6d78c53ed91df97bb5891a9a55a4cb7059369276f327a408d37a753dee0936cf4e7884819a684eed6f31539c8f382b7d58654778a811bcd66eaaf72ab1332ad04533b11fb5961f4316d127c72afba121634e1444d24ebbbd1000e7b85ea7a6a497e11426df896915f1f2a1204b03fffa6603328e03257903f29331e818ed38760d5944569055777c3d534312523a48e8e69e0139852d8417a7b25f5a18a0e302ec805be3eb31425ba4559a5c7e1f2e2328ddf2f42c6646b75f78d6971070f80203218095f2573f69e220ec38f8e7a7f813aaf8e718237b5b37574a950c2436b5eb60c170381e23df3d709f1a0a070f1d6e3237d0904faaa35251a5d7728c0ba273b5f2195e7c2f487ea8bc6dd5978c70c6ee6cbe9cd0f0ad5ef25f939860106ea59e351700203d4bd1db021f74a5ce6e1be85e6c021e338c060713d5de578d618ef584a6a69df96c3206b6b5f8f530bfd880622632ecbb1ea4d56902d13fad5122b637aadbbc194776328acf8314413e6565596fc13b91a0fd5cee60d213b0de0b7f9230d68adb848fad952661c4a8598f58d4cdd545e07f7b20eb5fb83923d036b6da04ea97445ca2e8f2827eff6917266cd2649c91b05daf009ca3c496baf65088d29ac417659b91e6268769ba5f17f937221640d6fc6c2488a838acd9d2e8f8e2bbcabc54f9bb9788d6461d7182368fb1754366f88942c368e341e448e85b2bd1ef42de82a467aef7ab6be7743e500016fabae32b80a4296207ac76b7c46ae1382ff120187d9d3611b6754e8fd71e60571182d328dffc70f3122cc0bcc39852d2ea6e72260c32effc4d5efe0a37fa417f92844c4f790a0c4b14bbf71b5cf380260ed56efc5097a085bfa4c9f2b874049b680004518278689b6dcd1cb132b40ee584ab4420e95c450ce0b50f32e80ae3c88db53bce22973193c4a50bb478ea1b0a1d6852e3ab1c3b1ce77273f67f7065d6ca864b0206d85cf80019875a84b8bfd0ebfed5602920d5f14ee86dab61256e45e096e8f33f7f6e5fe6ad194b5fccddd05f38d8316f765b1817da72a96c063298845b11d37cc98533ef609f61035157916084b945835a31d2211bcad1ae71a5ed20d8c71ad3d1472439d7636e4fb6ea7a93269b9e629fc564f1477fa96ec1f9dcbf72d0759d4c51938cd4b19f8ff371c8a2e6c6bf8a287724528cee5eaa7ebc962481f4527bc7cff6c48cac4df49d88d1ca5ccc6f47d6c4c2530d67a54c7f671d2f72e639fd0a5c080df642093f1fc400057bd6c026c4459438b27021f163ec6a61c028cc8c441b0ee1eba2d10e3010f1170327c9938be89da8d33003e2c134a9f77665c0b18ce4bafc28ce42e3dca959fedcecbaa96862eae47935b1e04271f4bb075fa25ed91dffedf31a962fb725056ee0d6151b6e5a43961838d1fbb3a538a564b0a3595216c105084f745faedeee10efad4a192bbfa29c423b1b4caf1bdc9fa3cec82f2a84a28a4cbe388b0c70602424880b628713c18f18e77fcfcdd1f1578590a4dad498f158c12d3566a78293289c20743324b4e08b2bcea461e7878b4db07c03c387c03783b36392e10a349d91d2291d4631cb8690d402693fca8101b8238852001103468205d7506b1ddee7e8bfd6819d2f4e7ce68178b75ae507604186da1c687a35378a86575fffb516f778916010680fc3fb0ed7e116da6d1fa845722f76142aa4874c29a7ef1c5c91fc6ec2b240ecb36150cb146335540851c4882c8640db2158d85be290a2a5e2bae547987411ff7b07c267003a70432e99a72deb2a85ba9a81d1d41b8347a65383b9c0732fcbd5d33acc9274804cabc058f976eb4f5cc2d6ad7c9ed7f95b015bbc257d5b0b746260ed52752bd6dd8a4a35bd71a8f019c0f93f817aa51dda13b3d8135acced48b52109352c3a48975624ac83bed1b0e4d2044f46685a7a3bebe5d6d866bf4f7957ed16651f61196efd77429a3745eb9fa8518aaddaf97eb48077f20253cb13f71dd7a2fce7fc2332df9d0ddd41867cdc38a628bb27d6496c2c4416be30ff29aaf092e499f3305c939b0c9f4812cba1f417351968167fed28ca2586ccef530dd127d6ce951a6348331a4102fa326ee43bf4935c5d03bef76646ccde3f16d06e3ec0337e3736cad277857b5ea1697e0522c265833590e8d7e111ea6a246705a0c65011032f49927e0a9fc902c5748759eacb6ba2a9e91bb2272b23d2315a358ad859caf600019b4dcfd69968974dfcece990ddc3840b8e41a307eaadc4b8d545a2df9aaac81d3b3bf1b79307dec0974923a65bb964fdc5269596cddf3a879af12650dc4dbac7304d7212772828a354b0a0e39ea9bcce2f309a56f62129f54c542f31e238bdf68523295c82543557e4383356c5bbeee8923a7e9619ba45cfa9e358b37b3c48e916fec04cde48989fb13539b49feee5bffe8cdf846147f56119dbadbc6c31a05a58032785799175f37fe0cbad90be7cbf29c4c76a5f15899cbb2d066cd18731b2b00b4237707d0ca43a81d6eee232f7814aa4e47f5710f24056b87a5a1091766ed865dae155b8b6aa545c9629837ee1cb0037173e4c91c86887271e79c3041540651da8f37223046c6b6da2fbb2f49032b2310e03a480b390385900de8145054b056d0a2b7cf1b911ddd6551cbf36cf9833b2e0fd28bc55d1715c97e4c9fdf1397ded4685665371e1cdc37fb6176f47cd3fcfaded01ac55d8c740c7bf94448be99a0fddd020cb2a121f304abb9bf29f0b89e1caac0b409923cc1c3ba586a25a4a0f72e618a3fa360de3dab6c55d0b2a568e44b83494618cedcaad28a2afbd9ca04bd29add523ce316d5acc3f2879a4fbd78b763a8879e312c322e6c37d9df20a0d6d5c4a5af3d2334825fbb267c5c360329b8c1174553edd86cd480bbdccc5a17b72c90cd9005d8abf5be6c2e5f41ef3ded02dd98a77e251c6be28d1724bd965eea63cd58866d687d0cac9eef9e89c55382854d5467c97d0e2f70825c1e8ae44a70e9ed38dc858b1da01926db14188b7341a7c9df75631fdd0d71e9a58ef98eb5b5e910da3ae000cfc98cda220325e9fd0a5da5410be842f6ab02d6a45aef49ae4cf45b9941c19d3f70bf5ce769e202405ef39c1456e918bee90993416fa72cd87e070b117140490206233bea061024fd9ec86874e1277219eefbbde31ef6461c5d5d19fc8818f918fae076bb1b184f66c4da1fd47cb41dc24ca3eed9d0441889cb2950a13b8440ea591e0dbf8c69746e18d2af53fc3ab7881cd9bf98ff179dc9e63804e7cffbf5b99fecd7dc8a196338ebc3703b5285b74d7b373858fe82aa613cf54876ae7d30b8a6b9c42d2f909fb72f68872cd86a164c74704a1e1a22a7513bdcce00600bd38058232e17867fd5b76ba3e64d324e43f2a7dc144fc35c1461fb1e868be64799cc7e364f2bf42a4bc3f76f74f3657e6ed6a6393ac8390d3c3e6a8ea070fdf668a8f61266e98b16f659df1c295a408d0f2674aeb26d31d39ca2f783b492bc6b9bb316b4d5d18b053f262d79f1c4e45ca7fc78c7404f6ed33a8a1f354f7a01b2dd54bb11edd0c2cb4882c17ac9ea09e0f4a32525fb0360019707b8624dc53381da89376fb2ed8fadbe914207545cb7da8a5c1c3c21dc72781e1004fb14a8b159507d25d586dfd75ce77769d47c1afb6a5d8305a6ee1e79ab1e84f41b59efa91bbc7c54a4120b0cee9d62911140e00fd08a8e1a21da43ad89dc768530e7e9fdd637bed9ac92f0941909622e9dc890c8bf729c4d77c4533f8f8567680a545a16e064ca9c4105d91552c840e5daebee01cea32730de651064aafff6ebccaa47bb0c1dc78b382931edcfc809c1eb04e1d317bfeb197ba7d43bfce6c4f26138ed12bcdc910bcb4594195a7c19df5b62fd9d454967f2276b6c82e9e8e713e82b4cdf1ede300f6ca4ecba20cab2a1057d8482385b6aac72e2a5ff315414661fc52b698e6b1172270f25c83b75412e0045bef2ba0284a28c6d880b94c7239f99d89e6e7a90bc8e03b989c62671b546a21d14d31cbf30ba2d41867388d5250f8b998622bba3af4ba825731963c70d93538a0887ba08c191dbe19b10e19895fdf965bbe0b919463e63b4f916e815e7512e0520d8eb2dd90ffb77d3e2f70c031a660ab93972f48e033374456ccb78cdc6b41f9cd8230658104a2f0d62c7c3262e4cf0ee8afcdee6e43875146d5872da896e022e33c12b20cc8ef87f4fb4d97a908adceb6c3efb5d52e4fd6058dba3e7a1520326388d3807e903ff9448c2ad673e8230de6eaf87797cc899dfe93b170ba5f7346e18db876d82da8b92a2eacdeb62e14f0a02f99b18b2f6856a84ed386076ceeeb1679712c75a0ce2b3b39a514057a784130d9905208010693f9a91ec0c93797fcf7b05be2e8020ef7ce2a50d7ae6529fe1f4bad9575ebd8eeea45a12c7505dfb2f35535417e2c411cf67d123332453d0494c51f422da960dfd770893f708c6b6079bd21756b80664f030db5fc0ecbb1c32c6d7b51e91de95d1d9a86245098d146f8e889c7b17edfab693b1fcadf45dffd1135f2c1c6adf23bbd3288115b7122eae2c7ff2d980e925f2af9a58cc0c9f3513ea3a6b2c30e8af0d1c9e1c1dec7d14c795ef33c4ac8cec3456b4b5811de38f9e1db6e4c11a950d83b031d42b4e1a2919373eea19a34743dc5ddbae2ea1085b81b92558d6cf1bb7d14e44b4d3996dcf358d1a6e7f1efb12eda96eda6ea15c0b1964f7aa32cc27f08b635dae12ee05a73c9596fbe5ad682318369d410924b6e74cfd334c1e0c23d7ce504094daaa497d474c230313e82ce808126e02c0da58c39141c004d398d391a23a65f3893edeb54bce2e7fd266b678b977c2a31bb939e308a370af4b6415696ad972fbc6abfa8177ba621cc84e86d4f3405d933898bc30902c8f17645dc226e61cf59ee94b5f164d0a584f49046755deeb812b6fe12e9952394a0f8fc55cbb76ad5694285a23a9a3e4537d50f9dd7b2e4e54e68d6b4645e9cd87c48a7ce852c1322557b32042c976c0ad60000c7b07557974bdd71b82cec41b3bbf2227d6ec127c4dcfffea7554efb7d67a9cfa951c64d8de5062c9fac7dc56342844e8d2df598568199b7a3d9bc2373ce4560a6b2b7862f2dbd674b49978cf883ef3e89a34c93c63f41e08a617c430bde2a87fbdf5d0211125a6c748cad56f3928397edc7f7a5ff9ff7fbb1f437b888a4a797d8efc38d500ac53992b6faf171cb5a85e4064d24265ad2ba4688560d8ae07ad91d31f6ebff22027689a00d2a51dbb615bf04c97a782bff64f91b73cf5652afb9c706b080e18eb2d06cb6a553236c42df2283059b33058058cdf85df23e9868fff118830d7017ba6c874b53986218d70992371eff04f997ff497449a3553ed569183e68b2ab8588cec9cd404520a821308be784bd3dc19c12bf5ff4cadc596b06a661601231ee3397653c38d41cd1ad5fd7560a9ee90a0df1819cc24aea5a3fd29e1bad8be98f8a9c6f2a2def2867ebeaa898af3c7ea811525d88846f13da071f4ef12a81c0608f9c3a9373c263e92ce1e3041ade5ee6d324e81df0296c847399ebf848cf3d4e8dff5a01e4e98fe93936ffcdf6406af4519f7af640653c2f3d5d0ad155062758ab68e556095606e3f9975c1529083be4efd210e45b529aa415859fed133b92eb63b0b61b18808b64378a73ce628bf39b5c154bd08be6383af3383309437fee9e586d8b1e5696be57300da9e96434df6fedbd8e1ee74551b9180d139f43657c0172ebedd9f7da864851db883a95848a68875a5f784c1628ee923ccf6c09c4fd625a3bfbd7dac44c359e4c93026bed0301dca7675e45cb7ca44a9ec5e70ea71bab2628fd49005c7521f7af8faa94f24e64c689cfbdb0b940f6d9a99e8b9db5fdbe51c89a7587e76d0a60dc602ad3c1c8e95340330507800bd11f5714484fbb55dd33e6647c933c1b64db69ba689ae833dd12c34317ca7e32ddf44ad38d0d3eac95763190f105ca3f46a722776de39c6e1b17dd86c919da894d79193613498414a45d449a450065ae20caa51e820018a7e4a36311c4cb25f886e69ee3daf937b39aa4bd2fd0413f46d97291cd5cdfa619ab502c3168ae2aa25fd8c405ec56599f9579c03f6760d1f88fe6204a9784df08c7ff13d92f93d6bf3a74c4b280e28ed4d1c8d97ddac7d07b11125d35349773a0db54ef09be96b816a2fb3163a4c9f7fd1a150cf08911f882daff801154eefb53501acc8acdbd6383fa0a3f80e4e5b57658c52ce5c7a14f7b0c5109e6b69b9d2ca43525fa9f33c37461bc67389ce539de3098633973c85f0edf1aa2d59c1ae71fcbde0915f020eb75e9d181df933009c64052e2f45e6a9d08cb6616b65d814b799d2b047580cd1d97e9064628c4aab1226095db570bd51298b59c68b4ed04f442ced662d37864eac73b37f86817e04197a2d351297590716bd97e7f6d598796bc22a08cd3be444e42779aae8d7611fc6a8cf10d08459199aea8504e083451d399a1c8fd9356fd8c35738f31840180dc4ffb2ab760d0af852f7ff3b2045446a8d3e6505460b5f1bfa826beccdb6598c17912318dadb9bd50b2a350d6b353500c20bea624dc73180bca9006e346e7240bc70235dbe0e5e3f9bdb221bf64c4c804b0d7ce286624ef99021f0ee86c7b01a3fb5188fe91ac3093f22d6b701cf8d290df1a4b8ad59c4cd8fb1da206c45823ce0365da0b3c7884f96d61e81b144235450397a46b746ecd6588bc18721463ca8c643bad751f65c2d5e533ac1387ccf2e35cf0c0edeb1befcddeb97610121e6b4b1ce9488157b2a8aa965fff4dcb06820cf466b8454bf19572f7cfd14a09b5b5348045a171e26246e7d3db4112dd90e7b38473237d38cfe8b8774b3043f06bb5035d8f65a8031ffb02f5b26c4c8265370c1bde9b34e4ee3c7e0af338785711c896520f0ef29ca4c6c684a86e6b4c25c8e3c02fdf5f1bf786acac7eee58dc6bc09c1af10a4a783d78780e2cf9aa04e1de2a552da5c2347980d05533481e601fd07d25acf1fa10a111575794518181dc2cc3083bd12d9568b00b74c74a3782bd3a657ac67384983026753ad3c324a92bc5e4809e8ac5412ea580340dbb9874d054093e57fc76d8aece95178d14ee7af16a64afbfd6705aa510c0cc075314cbdb5b89c5a4b9ef14b19e6eb8e4ae95077e513f2605c70eba20744d2369ecf7cf8c53a45596e2d64dcfe7cad6e2e48be38113a70959e410a7221cab489634cf166da93ab67f437dc09b4c195f689a9d06557599a365da3de71559eacd03ef6e23698829d7c97461b23840de78f957c3e00d2dbcef51be96b24c687d0eb17f353eb76777873c37ccc9b3bf69bae83ae6fae15e61b78fac4e268cb82a165d2669819a809b8f07bd0c796c985c84f271d3bf1e5d9cfc08357aa78fbe294a871b1235de3ce3f645aebd0f5c7a654af8d4446f922800d244dbe491d382767d0896034f454ca823d3d6c886d2b41684d211231803e801d2baa5f106ca41fd2b0e99237306f200f7a144f2694bdb7d94d94a9fa73af01ab5db636912fe1e475bbafdca19dfe9848685a66240ec7444ad3e72291f006b40a996ecb06f3e8f9ec937b237ae7e49cc621f406f1a44273441f78cb92484e516aa023e1d61cb9ebcbc5b8c5107501205ff41055c06b458aef2d90d306e019f584d5f4f4ac676b1c1dc52169a63563e2c0e0d21cc27d4eb0b4880c205bdf5a4f7457bea4175b82e4a91b35671068464700385db88f5e30da4c44cd0df9ef29ef1f68da42214e0125e509bce1c8797f404db4151891ba0d391e14f9e6e11d77447316ab1ba65b49d461e24c4079d6030eefb819ed490bde73fa0c1e41ac40f940d9ba6fa8371b145fb4edaf79f663af0bfe19df0a00921c88ed2c0ace91f26d2e5475158d8372a88246a7f3b090b2aec83ae2971ad61dd75fb2b7a3f1d2b0af62c094f7d482b13f51763139f4891bc2babd93412b70f74c4dc0cf7f59dc7ee4ed15cac20385f729fcb1c33013cde3b6f0e429050df697799b78e3da8efe0d12d4517f3ae759a61a2950569d1bc37bff4c184b99eebdde1fc3bf005f724cd16bb35e1f2549636f1e8030399da32f580a6b6c02fad54de22938c1abbbcbe0e1e57a3b72fc5abb0c1e5eaeb723c7afb5cbe0e1e57a3b72fc5abb0c1e3cfcf6d395fb57b73e3ce7e1f2787d763a1e3e799d76ff0f5fa3fbef93d769f7fff035baff3e799d76ff0f5fa3fbef93d769f7fff035baff3e799d76ff0f5fa3fbef93d769f7fff035baff3e799d76ff0f5fa3fbef93d769f7fff035baffdeec3a5dead37207379f6d1fb45d920d32b6ac6b7bac6dace629b5a3c6385b3faddeac6f3d9c3b783dfcee7bf5ebf3d7e5ed8bcd07b38f5787df7e57ff78feb07cbbbaf974f6f8c5f08befd5afcf5f97b72f361fcc3e5e1d7efb5dfde3f9c3f2edeae6d3d9e317c32fbe57bf3e7f5d39555bd2222a13d2c153aca3635315a3e1a5d64141bec1b468aabb744561b928810f87eefa089c9e9321df561689a8523949c3ef0fc1dd67b2318a600e473c130db915be5f09788415727687720dc29a5ee1246c1dc4e9e51785a2dab47465a17eb6445ce36ae48541c81c30f6351b264584eeac29cc7fa12532ee837f365605b46025ad908f485116b9e3b9f23a907b17fbf443741e3f4fd3cf1c9351bae7a0b16a46e6e6d3f333f3b65940134e39581bc7fb0333ad2530e73f900d501f96dcc030ab88167fe98844c5469f245582c7f8621e5a089a9336d01c8a8b0252dfe35ce500d59dcbf10d4a831cf52a07e457c0de04871977f93860126b702116878c2c110e5d99769d826f8984132a10a40908331ab036b2093e9d356d48b253d2f8a265f116da688cec0b82c56e3bc15c9501730fbaa02864d0142f1d371a94a940fbacc47ea84f9d63c825915ef7c480fff30d2f9dcac9f27451387b125c1d403e4c0aaa2fea6d1e6d238eb5bea6f161991c8805a8dcce4286cab514d34a12e2c6442beb9dc93075febf131e41090b413dfbfe11ebf2937ddcc59fbd4dc52e9d74f02bc89693e035c640c76721ed783f2fc28618eadcc63144037a1f46cee0bb97a8a244945689c4359d2e343d61031a08109e260c61585ced40d6c47112389fcc0ac77f8528230ae79e61fff68759a2c1da45e107cf3ed3560d1b4ceedc93dbd2a38e5dcdd7c4c241a80f31c7133fb0c3eddea3653a8340dec133976fe8e657fbecb715c92082fefd4a4c3ef7979de283d5d1e6872128a5b1ba1fd9f44aa0a84de6dd3edeaf7ba536405db039ff641ee400b3353c3ec42c625cb3d0871166de0f64ff97d79647b16e31cad5d5801d9abe39239cd4ed5f0075966acd46093769128fe907243b37cb827770564deacb1c069f9ee5e4b074cf8d6301b8d083dcb0722a6bc7b39cdbebf5139b78a7a22aad4e06d159ff9dec1ef4044761c221e6762b0d9540d7228891cc72505e69494e37620a976f1204ec7aa2057a8605edfe97e279802e66d37659ce4c58d465fc586a09bb238604685f558a19b3f01a6f5fee2ddfae7654e87432ae90674449031a7c7bf32ae2c58a8d9c415f27d5225ee9ae93deea13cbe8620d31028fe522d21bc31b8412495d27a78fce718a1b1fb45f703e317574922c18117920e5b4e5f5edafb7d7252a974f1c6c8674e9e007df4ed207bad3f54ec682e231a2fe5b0e8e87f6f05277a469449c03c8412400540615d8947a939a8f2c58d40e3297a738fab34cbb8f0bfa7113f90746ec7087eb410dbc95abd8fac8c584c13821b4644696ff2e4cdefb60057f1b823a30971430d4a876a564691f801ab7b39659118d4a0a860d8b0677d85b122c27d55c7d8dbd67ff4ce716b5337a9e83f72ce7e4fc898af6dfb06c9887b68e97478219888623f356b0fffaeb37b04e6b257d3236e376fb3b7b63730085dead418aeac45160e9d11ec78488540fb6559cd011f4711d490abfea3dbac502f76d734554903c07cb87422886b08fb1a1c5cae8fe35d5634052ebf192a43e4d6b8c09aee8a6fa0d1de5d20e623a95bb069332af9c42c0995e3c5fb9c7c268badf2f0646641bffba154eecdb80e97d50757f94abab5c9583bce45b2b72603b9d7404fdd84efa2d16447f51df7b3621bfa23639beb0ff0d9cfe375288cd1a8d6d8082b0fd26fd8b9133feb3bf397f95b8ec97fad76f20c66fcb82d7771912edbf664dcdf6a5945e4606b4bec2b39a8ad79718049ac18421a8fdc2f5b664bc4dcc851eb4b1e90b6ab4867e2770351bc5d5702519b5e8bac03be0a7dbc435702578dfd7bf373c1439120e195debb7956293f2bdcec94f6f02a583827c3d66e8b3a04b49d98e38a0b323bed4191259abcd3b69f0c1f6bd920fce017024a66ebb1cde0c6baef1bffce8bea3297a2673c648cd22a7c411affcc084dde59fdf3e5fd7f98e56c719ee05745e0efb353aa3ed6dafdeddd7dc90e17dfd2db76070c005d5fba37a9d86c04b815eea56b7c5dbcfbf5db2f1f1e73ee24c7c2edf2042f31ec4fbc167260a0ce286f4af0825764eefb9ac16849ba3dd3676103c5b070ec0c2ab7f575aeec39f76e302fe6205e4402095f5930b3dc79ca5c7bb6131d43fd63436c966609f7f6ef87f677e60ccd85f05aace9f8424b80fc4c4f5834aeefbc4cae44c41930194c8a937a2e84d84ca35df7b21214ebdc9fb5cdeb001ffeccee17fead339f7b841d1740545c3d52fc56a0ac30057f39e614c87b3edc11fe8252231fd201009440127c0d690146a08f3b0421bbd3062e37eec57648e7e00f6e281fb0effc9d9dfe4239b278c49b8d1af97bd42571cc88a66f5d695adc1a25957b918d70ae6d482624f01ad5a2074859a68d0a1f0be5976a1515d11a05248eee5c0e521051dfb02055715e6911764cb82dca9dc865cbf53c2fde7270354817df4c69684f9d5bbba7019b4f05c884292e608a797257af689384765d25cdbb3917f29af07aea0c31a2a9d14bc4940a76b7c1ab14c099d806024730e57a851dae04a516ca00b30115158160a1dccf7e4f2e452768b0ed33d07619a28447d440a10b8a86c3c4c28db3b9fd946e8a3b38ba383008c7e8dfb8027fb89a0be50938807f883b7b9a70a43511e64dc328eb286fbefb0e6d740c49f2c2bff052beb6f179eeda5ffdec875f80e45e3a4272d8783dc47f9715aaa3389a15b7c954f7df4a829ba5e88d5075514ec43f031fdb5943425b8781412a49669782f9e5a1e0d281cb69dc34dbd75430782408358200d12b05d15a1830c44703470169d7a313b8c6646d06483e6df4ca36a9b378d8ad550b154216838c4266121888a85e6cd883e985a30f61a4a36e3bc0e7fb30117b79a1bdcbfcb856e1e746290b9d442edb5069d0a10fa3bb82db686675a8d3190657fcb3ec4dfe797ddaf2c02f8c22bf4bb69002e4278957d2fc18c32128dcddbd65dc2c614dbae9eed2654ac7838dce74a2d29d471ee94f0fc3acca484d368c05a4007c009a18c5ba51f761e38899fd6f9eaf4bf270e7f3ecd7576e9919b8beeb6f0c29113729d1d75ccc953e70d3933e49c5c67471d73f2d47943ce0c3927d7d951c79c3c75de903343cec97576d431274f9d37e4cc9073729dbf1ae772b86f6b4e3cb95f36fdbacd77dcc50dd7bc72f2ff53937f9ff63ab3f0c1c645765fbae4d109bdce8c7864e229f387cd39744eaf33231e9978cafc61730e9dd3ebcc8847269e327fd89c43e7f43a7b71cce270ded74df974bf6edaf196e7388b9fd6f9eaf4bf270e7f3ecd7576e9919b8beeb6f0c29113729d1d75ccc953e70d3933e49c5c67471d73f2d47943ce0c3927d7f9ab712e87fbb6e6c493fb65d3afdb7cc75ddc70cd2b27ff3f35f9f769af330b1f6c5c64f7a54b1e9dd0ebcc8847269e327fd89c43e7f43a7b71cce270ded74df974bf6edaf196e7388b9fd6f9eaf4bf270e7f3ecd7576e9919b8beeb6f0c29113729dbf1ae772b86f6b4e3cb95f36fdbacd77dcc50dd7bc72f2ff53937f9ff63afbb960e233fb27fdb9717c4f6f8d1b8cb9ccd41fbae6971b1defcd131ebc339b7f77b90e7abce798454ed67f6df2efd35e67163ed8b8c8ee4b973c3aa1d799118f4c3c65feb03987cee97566c423134f993f6ccea1737a9d19f1c8c453e60f9b73e89c5e67463c32f194f9c3e61c3aa7d799118f4c3c65feb03987cee975f6e298c5e1bcaf9bf2e97e9d8912ce38e241e8d0abd502503d4d18f4260b51cbcc050ad11b43a2095009ba7b74915566b5ecbff9e8cf2f532761c80f1264bce40043c46e4849eb2e56e08e14cb761df9c95fb81236c38e64d82cf0b184701e7b651076ada5fec4cdebccee6c4688b41e02d548e6aa72c3f1714d9b9f37bc88bf5910edbffea81c1285c8dc314ef7c17ecae4ff377e25fd28a63022f59c11c48e8b853b2867c48f9e9c278baec695a8751f812af8588ee1f2231e18945583ae6478476b76115a1fe5b7ed69be8f729fcfdf4e8a3eca331b61ee05cc3fb78b306131fbc8fc69149c475a60fa15dcd3a508119141638f523e0a993e8aea3927d0240e155819c9bfb44be4cf47354d1e9cb56f7204148f778a5d66e33dbe4e2832b9262f138f7e5fc4d72413d8389ed0eb0bb78a78b90e5f4eb4644b5ca2e4f12312058081d170766cb7b0b79d53e444301b04054573da3a12d9f4904bbeb7d0ee63e454ac4f2034520be4e0e3366846c037b3e4f5adec722ab6cf22d6f5545b00e22e334d5ef45cd4d1d5cb0e6e6155e95ecc7026bb16d1b8b644c2a18b39ef0ce8315de8cdf116e8b33369215c46db9ba6d1143a4e08ff2a63225a03128d5d16e8c6fc3c0421fe24b492d70794cc59d7081d1387f4a57dfb1b8f663649f8c2a888e40c256453cff4cdf90eb19cad4c54d8be3c5573e6ec7186f460fb0653f3c200f11f06a9dc68d96ac88addc2712294ac908147bb001b33fa7f27dd9c31026e75b2ff172fefd705428124c917c48f28e12e2bb6f0ea211f0f72e06a4435b47bd35dd4e5b4086234143d3304e8f81047aea891a3b3456dfaf9b4174c7b996b6744d948bc687700c2f8ac622398ebd2ea5b8ccc9de573167548a86a5c9792d86299e92a262760ecf89f726e48e990189f1dbcf2e91ebf32c7edfd8b138b1421475e1fb0936ce61b9bd53a1aa2e99fcce1f1e105de8fd960044695425c0e93ed42148f7553a445f848feb1159cb3c1449c7cc0a57e3ec245eedca4eb89f05a8ed8e0a3d9a62161f6560b361d4f54f70fb5c7994884ba51fbd72f179e15b1316f7bf2283ef83c830f82fa562524a4e59245893f8fed840848f7e2b21f1c0cfeb5e2684a8878608c44514b64f4eea6d41e951206826e02db25faf43d664ecd7c86969768f11cc2a4422f583c26b2113eb094240c8e64cfba1dc026a333d5f7c6243a9204c63a67ee1b735e68c14226479bd55c122d1ecdb4a5dfc3092d282639b808370d6481efc0e1312de7a4b11e8016dde5397953f075b4701de6853bb4f7acc3e288f5dc261841e647428ac3efeec3fb224e25a641511d068f5a31ba586290654274dc8b5d0d98b96f5f732ee8e809f72031def2aa5b25d150d440e5c4b48e7e9f3327e2ec8317cd90793fab119b1394b1b560661cf4f3189e5f6359166a5aae9ebdc14fe3cd8492f43dad665e82d9f990a909afb9f93f76edf4da1ebe58590049a73e788fec6f79a87a3ccf0714c197aa62d4bb291e61f9d0abc2b25dd6dc141599cd70d32e8c060e8f67e07cc8447d2e62509e9609d07c886b7d6e18c3600c6c1163d90f7f66fe05635140c722e42742a2f62e63bf4cb30fd8b3d0ecc8c37def2b466d9eff25ddd80ce9e91ca09a88f19ddca7ba12f275437fa185ea964d45bd8840f2818c6a22cf01d804d010c2f2d18ce075ec9c2fa84d11478702faf5cf031d05e3088a60330f28085edff472142104ef13d24f1bc0262c753a00e91fd715210ee1ba549ac6e77705154e2314812fe9caa7b6f21401a50a0ae1c5cb07a82ca5c33a4d0e3d0af90bd09b6c4c46be4efaf1c1a5551158d1e391bda1b75dc4744ad2bf549c22e41251ecff7e5ceedf5e1118912e7d8bb97367c777071319175f5407854a45292847c1415d2d483278b4efa270304688255ba212c75cda5925e6585444a3b0da950c7d4abc154e12630f9556c0f6446407c80102c713a5c40b409a32c83f25fb8252c5d097d1b4f253df50cced040e7fd8a5538a1ca47e9cbb00118a0f3ea8bf7d51394b7695a888566ed8f1540df1627443b0dca8ac6340e4772408a9c76be056daface6f4d2e2b1159343b2455d4269142a0045eb9a4f0eb6320250057f1f47ce9d7bf807e034053c644a196caad44199f34fe283e4ade2f13d08f3fe5057dfda3cfd7bea7cb34a4b37609066ba9abd43a09a8c6be6efcfa8e7c61a16eefea5c9a55cec8a7911840caea6b181f06d0f58df0f5b22cf088eb77ff6ad5e3793caaebfbbf1798a673af0a9d23e92cd6b33d4373722f73a7cc762d0f859beb8320c13208ef6395fd54888be22920b9cd9e75fa68a9df5157a0efa5c43753e6fa38937ebd28c12f518b1acb6a5a8816af2de8f083d95ee8acfc723735f427b6a84e52a2ae2ae787be453afa35f3d0d35c9dd6977af63099f019a6685d411e6de9d3eed7cb47cd0801efd61a364a877e89f21f196ebed9b957170773cfbd4d66a86cbb14d676e7233906b84f2125fe2c392f65b4622fa2020206f2084222014c80288cee143e5fb5cfa5e3eea4b56a1f27a39dc5baf99f3c7872694087f5f2208c1665887a2f8a4dc80c36d775ec09a561699397628d47ad138fb33f805bc52e91390a10875f2cddba972ed619d9aa6d52230a845a5468949c8499f0e3d2bb70f9716267b1206d137567f0c267507c588eee1bca9260dd7765c1079859f3e60fbe296fee746eb38ae6ce434533c06bc9487ec184d67027e27ee6ab33c9aa8ca977b896dd6954ffc69543b7f3f497cc9d39756309decd5ceaffef9a59cb4f2917b9bb9c1745796fc041e4d0702252a1c12bbfa10278da3544b25794c0b60e251e746d104a06a62aeaae792d0e726d63c58a38f35db21bb77be1f956a468f012eee719af22288e9a2358dff2941fefab7057da0e5a9a1bc59a32be877f5672d0f435ec40f7a625dee7d0531467835d14fd73aa4e8e8ae410aff1e582aa081e6df893ce52bcb4e27320afc2e002b56364d63637767029b46e089412530a52b2ef0226d3bd0b72f44e724f3a6d27b8a701d8de49a00e16c39c11c205710abb79441feeba78e8710613435416b6222f8e57bba385ca6ea162924a104358c0a01e6cf80ec8210aaa1fc9cb36128ef8317ab0456362b44e02c61b07fbda930edb39bab60822e8fe19ac3d0694fcc07f39ffdd8aff3bec37542c23ac7d59ecd028c5f0629732d19948d03e9579ff0d386172a594aac1edecc7c26394227806e6cc5618c737ea8f74d4fb6304cf131353dbfc5b724820ec4c81cf32202ef6ff6072ec14d4367dd8ebd28524695b0ff781cb3006025ffd1432227abc28be5866ad931f2d27f2f889393193eec4af737c00b966bd3ef18d6c4054cb995c532b0a0abdf2f19ca4e0e7755e25d4b3aa715ed9f5547b66bd75ae1f945ad868af09e1b86c9f75af61e85849c08dd022fab98b96c5b9dcbe73726edc682537629c99792001f82feb983f83029cc8199a9d447171ee0cf0cf8a58f6f99b91305fc20bb4060c49f351352f75f09e210327932dffc4bececa59efcfa0936ae6425d94a3685d5c89bd045af026c7fa77ff21a0a528a4ea98a839421a7294f999c1da03c4bac95748b899829620d2cb4aaaa27ff87f33a69e47fa2584ca88189586bace85feee583e871073c2117241d5cc7138b01e364aebf8a49565df36b6e33eb999f2d2d1d0bb3e92d513c6a564eac9d3a01ccd65640b0ee319d6d6c557e83cf5f13dd724e441bdd1570339b0499fe004dbdbbbe110cb5c79ffe714d34183d021fc452edf291a0d2a623d84289df8c5da53a103ff27825dbc27676184b727372a82082946bc3bfcdc13db18616fb8f5ce77a335438a628b474f371cf1f915b1f5d49b4d63129602d5ce6e69c3e5a97068e7d810e79be1db63994aff027fd7599531e35eeee02a6f551a1c0fa0c5f3112ddd6b35f1c78c94bc780c89f07d75239001859c6f36a91677c5f57305eea0b493b172d01d88b07f943e08d7e6861a7b432af43362d3fac11b7902fa2b1b0212927277b7ff096109c918e33f1bfb38e8a458e73835711d353a3bc3467f688f54873f0aa978b7b133b7ca555037e540c61915bb69c13f6837c50a1f7f342cd11bbb142f708e41040bf20e182335ea5005a5c8243982ef535ab2e9552d17b99d459a3005d11c13a5b593eb4e92cc0618d4e8cce52bee855789aa784f15b704214c2067b542678786040d12aec10b9da5eb372878f02ac5e86d087bf4fc3b732b91214dc1382b9a8f97e51f7341845a36cd361f464a2d2a1263e06e9d8795a4e5e90b9388b8cf02c97339ab04b26a232d18b511f7830d138fd126ad55390611d16cc46f52f748f56bf77bcfef141bd5fc59f8feb7fc00f5d291951bc7fe968195940bc15d6fe840bf2ff84c1e358f5b4361408c975e2445f26fd3e77ae2bc7ec2bfb26b4bb07fd919bdd02bd5c144b138a029356d33ea6ef40519dee8a24538ba68398b224effd64027ec3c082b0efd2e063346d0d3d5b24763183d42bf8b52258bf71e4e8f2eb0813677a4c7557379ab709a574a328d29482f2cb59534e13677918a02300b838b0c63cfedbf0988eebbe15a3ae1cf67bc01a530286124bbfe5a5d7d785184d0c40432d5dec53e594ec00aa17f558b1d57802a43f485f446ee38153fbad12565a7f1441394f52eb1b9c8d34a24691e28020448ea0aafd4954996df34bc2710cb24d525816f2b14521be6f8a3b1ea8bb2f9b4553539253d922aced0b9d8a9503d1ee9499c723b086206d2649bd059fb420ad8498e0750353a3f1834f656ad7a79c28ef6e6a3da638d8eb72a609757e8b5ba61f859340d00f89f388bde948639e1b0fecbe500d2f46bfea081d65de387934b4b669c5c6cd764afd7ec2b0f8217e1ece4a40f9fc09d5dacd522d4e145d6cca43756e29db063d631ee1c3a0e2802285d72b706efe375c98e5260ba37f999eb4cb6b00584cb082ed17344aac9dce67a4cbb3737f8929b084fc09666da2a33e41836fab3d065c676257c877736dcf4358e885c2017e9e30e2713e803985b7305b0191a2d008078b6e6041036d24ebef185410c3981e9666cb791897b18a82137246d411004ed7dc60c70083e82ba43bb8d0c6e1c981e022529b4e779964cc4698275056e257afcd79501f99bf5528f1028e92f9f17bbdbae848389c89cf09b37316af6feced1236cdf400391e25c037d7ba1d1e00c8096c3e64475b33be30767ae395dbbc246771530fa0828099bacf6ec99205e46849f826cee5dae31134b13e28a0bb5e57f606f583da8abd554de5f8729f7104ace5c594cac01d67332b76ba969462a37efd73885f8168adac59a9755a365afaa2a0d9f9e3401dec7574a73e5ab4ccd85094ebb2910ea0be87c68cdbc26c99f4bf7927a0ca96f6f5bd6f9417745c1740eea1e972cb9783f4d07f8de452064318deffe3022044f68686142ceb4791e1426e22d6ae0e548e6b5456ea3798eaa323fe824791e680d256d7edc00db993e43e5fbfc5cde04d4f87b3c7439161ef2675a2b4a54ba04e64477ed4a36ad2bb4e2b6f96c0f5d6dffa6109b61577b562ac51972987061d1d678882d8a93d58f61a9089d131edc5637e13263baa50e8ea0f76e4d0e9183542e707490b05e0b1e6ebd32822eb35dd84a2adb950c4f3dd4fa3bed4b28c8b98e17d48e4ad6626764f54c020467b98a92defde8d8065a4c42dd1e452992a637da1853f6a80aacbf27bce8b4106e873f3e1d477a3bb4bf4e3520dce1f703ad947c8f3b82415eb57247cb592f2298c4dcb184c07d0636bddcff5e44fb50454e6b7270d194698fc9710722ae858892fde49a43a338c051166c39fe0109ecabd4efce03af07f51f378050044fa2572774082b16d0fcd625809ffacdaa6ad67a71a814f20c5a501d6e3a06c828d96afe2f548725d3b3555121a10a29adcd9ad0416afe3da80e7be62ae3cdb606666d65790ec2f3cb84eab03459191ffe9b60ddc6afb46e736c35ff1f5487110c972b2629588439c89646ac4410736c9a1f3ba80e6bfe2d17fbff79fcfdfffdff757f4a6b2bc7d6f3ff5cde2b950722f7e1e669ef69f8fa0cbcfd67501d16c893967ae09c706fff13b0f13f2f8acb0f57cd77dbea68129b20c54e18906b562af8f3a93d654bc1ecb3c1b965909ebc1188dbaf630940d0141b68be78c81bd29518c8d026488dd1a658f4bd8440f7314c03a099be30665289809f30ac412420c741fea701d01130b501671fa33b31a67e6c0d805ec1b9a802fadb0b99a23166e47b9860df4708770d80bec401b61eab147fc0e39e170ff8da00af0fc0db9a25d663547bbdb0056b189e45228a0070847fdd16f85af1c770b3dfb85a70c1a07ceb8260c4effa10927801a57a150c9797a1b33d2b82c356db1284abfde106403d74f0bd42a23c4722fc627c8b960d1c01d1c37ba0a2b87f787649e281d9bf80872ef5e101c55e84e6a34168d0ff84e4337b9ba2ae5cad1ce879c87d5771d8c2bb8fc3c0d11287466f60aa8df5cb9f58e5bec50bd9fdf83700ba5f991c48122632f93f3eb0b0e9b508e2ff333800baf4c6d3580fd67d1411afe2d2e78e543800da23939b5e8660876082e528be5852ffe916eb00f68103fd27835089a76b5aca3a3f3c7e0fe6815c29fee10fff83bb522bedf3dfe3ddf4600a9c3ca345502919fe63b3f3bf1e51306041a4450831ff69e77f1114ffa391f44c045eb885b0103e10a8b44d0730333333333333333333d1b52c22be9318b54576b332a52439036ecca008860e0a040766405abda59452262923fa71a028422c36b3ff686d07f213920f620fdbecdbde4b06978a60e5d762d39f7347b82e42ce344dd3e883bcc91c63ed6d3c7bfa6b7e4f8b8b90f8ca1d94adb1c7a69c8fa1ff7b4bce6d8eeaf7b5b6bb83ab2dd418bb394b8e6413ea74de162f6c4c192785a3ef54b25db5c97efd1ce2e2bf5415a7fc87ba8e334dd31464da2897a2103a644c676bdcccad5f4147b4e2225f0c14c4ef393b6e73527eaf13bc54d59ec6f7bbcf9e69e2d0ca3485c00492b1d7e614ecf71c9bacb2d478f99c731cd99b6fa18b378eb80f955ff97019d3f42b1f0e89a0043d9f4d97b255b2e5ac9160c5166583ac9d62313a86c319c83405492342a820846a5b9d377634baa9e88c9b7ad7d82b77067b0625648fbe3d95549c697a618f9ae1a6afd6dca5730a3a8329429cb5634fc516a76be6648f20bd9ceb470817fe9c1ba7c9e3f906a38c28176bf55694adc135ff8b114c19bd35c56e27f3eca6b203c8e3d7f83d576d50a3ee22c33db7603bd6deaa52be1517f93b36a0a27ebc8eacfdbfc998e2f924679a366f8cd6b5e25acb41e5a68392334d2862ec8af19fe4e93d9982ed036134778c13368eacdde5e44cd3e73d9b23ef1f1c2280529f52ce2da770235bce34e9f0e11d67bbb7b339ae74cf99260f87569e5b5a8fe6d4578c33eaba17a172a6c93b9b1b2f1f1cd3f4f2610d414367bc3a7d3a84ef45ce34ddb87103baa8847ee44345c734f9775aa629f4a3ce0654369fce348546201efee918f9b86cb200437e5bafc9e960d46f4a39d3b4ce653362995dec904c32b7bab2b536f94dce34899c0ee6dcbd1fdf5c6d9b1507344ddf1f323e3ca6699a442da098434dc55e69b337a38a2ece09dae0c0c14ff1631bb599ab291d0492495ff998638ba94ec8c507deff49a5946ccd5aebe4dc58cc4513024dcd0b7b5a449d1d9e16968eca34b1b87c7edc788e7bbda5d68a9229b369fac29739c76de35cff76ca51515eaada2a99af9d9139d314624e7be1c58b0a1f3fa7de7b94ba38d3141a8936375e838666e4c2b20195698aaa3d73bb8a716c4d36ce346d4229514dc5a283ab6493906173a6e9479d90110cc0d94fa932b5fb9c999b9c699aa611cb9c260d3cd6ccdff2b6f7b0ed33ce34fd8726184e95bd64f9de4738b5299669126d46221067f30985a0f5dc65a8f8ff59f4f59c6932020aada4ac928f19f355ae4f218b9c69f20f6f403e4dd37403078a112ee3075bbabd20ab634f6363cd99a6954f87c8347d08d45bacc562bb6c0ae1aa66eb9c69da4cd32a0b080400a5fa7917dcd8be5efbc799a669625dbc7655c78da3fedb1739375296c3189b92ed32b6538e334da1ff70b19a83f341e81a64cb9e73a649e4ffa2cde857a6e94619d3b46101f987431c5611a1b080409b95d06603000f6c442ea1cd06021dd0628bcd28c4230e68b130c0810d0636e0bf716d7540031cc8c0033000810b74c00210d050a0020fa0c004b490c005221001085ce0011270004b0324c000cd022ea080751348c0119091110510e0dad264b174b359f9743822e6680e700103c0397299400174f39c8d0408a01b0d0c60b1807af3a10d8bbc7fa3445c5b2dfda20d68d4f212ea2700a60220e2001623100800ce1fd2e204c564f42b1c285151074896b2b1191df92d327a84592a80d10dc8b359f974568efc03a402ec2000730804e659f8431280392822030668a24e0b0f005383010840bac3222881436a042316a1884420e210862804210621884000e20f7ee8031ff6a0873c60f080b9831dae201dc0014490b268c4281303014877480425701c40c290009130afe071893984469fef425a8519626461894dac7c462cf2b888369e4c0e49920090c1218542600cd17c780b2d5a3864e4e3324da19024a904521695c08424b5300b1488808611af748af0293220d874404270e8701f242c205901c94805242d2b242420f9228b49508224f3805748990f603624aa30f29f1210b8e0630214941b5f68b638e21d2d46f3c598ca0891319a2f8646a3d17c4cc002cd11ef6c7ec57fe3082f74a1c409a02f6eccf7947cbe50d16c36ee01d978820e48c630d1c348e49a2fbed07448c443696e90d801123890de411f48089124cd348540a1d0d30006aae1e20b0d27e557fc438f4082f41f1a491208f1a10307101c3a342a9a23fef1111a7dccf0785c78708ef7481e817eb807d4e357d0097284c71081214918258c42a01650e8638697c16997e73102fd00030412d2c221215e4628870be88724654020fa74c2081284a5d3f88f1992249dc2dfe371f92149991b1ff8803a181fe87b3c372429f3857b3a68a84c323c1e1ceee9a02149192f2429337d5ca624652249e765d4f174242903797c403fdc872465dee843fd01e918358e4f67bef34092326e9b04d7295bec85432109f2e4d034561a2c8d4da3a5e1d27869c0341c910822a250ca4615117546cc11b9bc1722cd0f0d17cff246343c3d2f1a224918226ca185689d71883d48923a43cf60e9238bf9ba23ef1fb55e3e8cc6f1f261b8a7c3d1f1e2f990f132ea7838e4e201320a31901707e5f8ee80ce108d11e23112f18b31c2c102fabcb3803e403ecc11f221d018eee3c54139469d8f199284f101181eeece87d32fc423eaacbc181eee74c75d44e03e7ebc7c70485246310b8b5cc24801c6076cbd3c1149caa824655417a310b7485226850b94670105112252e93f63699169525a649a54911b5b4c93480427700af7c6e8452295fe33e05217e87202b5d6b99c60318d17d0458dc55cd840882d44a11406f2a1ef2149190f4852068b1c417e90e143888e1f66886093068e31300818040354e42249990e48920480cc16394c72b8b048ff4e68b4811c3620800f0820dd400b52508244440452188020842894f20ed211f48005378cfca7040b18f552948bfe221e0fb388a43102c183467cf10824184192c890243340e00742fc20c210821084ce0d492242006988d403012e65d1071d48d27ba4ec7cf8d3d178b1341ad07cdea3345f5840f3794f910e87465e78b8f30169248b4ba835ac1181469fcec63fdf9234032d388019c2a7730608086814d2803a46449a3732fa107f3a1a4e736b44a10f9232c408e83364886a3ca0110de182df3d1a9166f422ce4aa7070824c4dd434610e47006491a7d10ff3282e808e21fda81872e6081051601f01fa9a1798e102cb0c0220044a42cf0a0b0c02200295860814500b61071e11fe642d4052bd205a89392226a9077d1c5246a198d385a9c40a4860e2cb0c0220077688424a5f07f403e3c1ed631eab074c448497979222917b880060534d2843a9a11879ec5e5f31f23a28e66f4228d1766889c73bcc88c8f8f1da01f1f33e6f0054902e9d04c6590514619608c8e3c17a2d191df70c88537a0810c4812260a6784c1851c3a925403264862f4e9b07c422e32648439a3d18b443248c20fbc60e968446ca4333b0e62f1a2131ab580469a111f792392e8c5f309b1e68b80a48f77d08f1c3bfcc3d324595c423ad478031644a1945167f422972e3890851bf820795a583a9b97a2b8e82ff2c2a110673070010ccb29303ee081052449c264345dac225d7448c4d24736291eeeb0803e2f1e504b8a08346ae9743c2d2cfc4686780b8b8b5cd1808268525a3a23d1902143345e6ce1018d179a0e683ca0f99f9b8e169a2f342d9dd166f41e2fb668e98cb4680ff7e60b8d66f49e2ebad0a08c442ea121438668525a3a285bb474465a68445cbc7842ece9b07c5c425c8c3ea0d01c3244c39a910fcdca87349f0fa8a53362cdffdc0c19324413ea802ed0d219853a452ea0f9914b0bcb100f933164d4f1b8b0e0d0fcf3f8d14b8e142e42dfa2e10eb7fcfc20a3cf07e11c9cc3d3611e2c9d86730eff7c9094eeb0f0e7c559241a75d8c80804929a7fe182415eb046a4491135d69a037d344640a1158d68c8900fbba8006464a401f967829ed385fbf880422b2b1c4423650e2065029009002a4051862363e848830b2063e84803c88e1b0f0afd0adc539185154a21491219da20a5ac7c3a9e8e4893f22e2b00f5f8803a22174f7f7cb0fcc8c74b68f401e303438668c6a00549d24c9fce86a58f643106325034d334b1f41131a088c10362c8420c5868a6d06fbad04cfea12e3ea0f93b3822eee12c6584f10ed211240c4052c2c00109086c4182a47c461d179064d6a4bc8c427f01d844a20b34182488c67f14024d8a08e4ff7179f780b4d0b4fc1361d18c21468ac83f9368031a4d0a6748cb0b688eb6d042f3220ff3d0a40c19023af2a036a2999d215ba0683144f4a11ffdcf0e8ba8f3614e3f4b7368f445dec38546d49d161c2a13c45a68343c8666c80d212a43fcf3a34fa7f371d1bc78469dee785a3429283d3429438604d1a46c311271a08559b4d0883429a2e78898d3c263a0b478788b4f47a449d9e1a3859f333d0bffe86f09e2032444e4ff3fc00009d1f101fd0085be041fd08f9225940ca10a31e0889803fa91c5153a71854168a62db4e0e903eaf4910a48528602929499802461a2100a8141840c307440031458418940a15f81c7f93d1ad048333b1c111a5950e105926228582f2c21660152050f504113549884240d195244336408199a942d3ad0010da73b9a1fa0e1135050822444a194517b3c9d4924c42bdcb2691189462ea0176d38a38e11333cfc414240462050197fe003260212a6039d0fb568342f92b306294041ea84462e65ad14c5857409e304335840211efe2b9f8e08e4d1316af96e1c657cbe850c1d46fe470b4ba887ff0e211e02a5a4845c402f9a4f4723bb23629912eaa08c441314449312fad9e1a1491169525ea4c608488c4f670ce71cdfd9e11e17101a1c726149ca4840adc58c7019eee3c83b7346a31785f83d1edef87731e2a9f90f283388d14ac9165d1803c92252563ea09011cde8f346342922e922e2f48743394a1620913ca2d332fd452e3662b085162fa31696df883a16d082a40641986009234992966002499224a94708b2a8441a12171f30c0e0d12249520f4992f490c510a024492a902cf0a10f8784fce8a145a6890ea01f2fa12f026a5167c74bc7d3f2cf6374e47fbc8374bc8839403ca30fe29d1d3b44a21696508f9f1c44f4f261380e118bb19819688c409e201c11f71089ded3d20909010971325a583a8dcf8b21f278708c442c86448127488ac8e3f17858ba885240a15f81a853a4e3a17749145904c10d449824cd888ffc6708a090349366c45b6861c365082f5cb4b07804321090a4cc032429e30069c3054b1fe1900b17e984de3722f6787823fd2008076011b1911650e80121079254b2061048423fea60bc90320d90a40c032429b30049ca284092320990b2f8811659fc400219044852260b1f20c2077c982429730049ca18608824a54200a02f5434de611989588c10485f7cb109b9b40d006ca10511d046d449d942a469c1161b0d8a488b0db44083b279919b4d4aa61340fc3dc42deaecc0c1e30425f874ccc0e8c0010a8108f403041ad00a26623620ed4879941d9a50e88b8074a4f1f97456de488a118fa73332234424c42ca11fb1919494eef81761679047828c682448236223ac01893c8c8212e234bfa8c3a0110b68b266f4a2e774589ed3d261d1f8eb30f23f86a8a1f10f8b3a220f818c7c7c68523ca20e48f3c1a1f98026f4686852be131a7160d4197d91130c117544a10732440d97d919d279f9228d66d2801a64e43f27006307193aa669e3f1bc11354ee0f1745044cc056845f4453a2b383429fe1d8f7bbe337d68449f4e4bcb4b0e7f202b9d1c2090101ef18e33708c403f46a01f38403ffc63060c1e61810f8c3e5ce43d5f8606f4d98c7e65880f2cf012eac81c340c002049126bd41031e625f44534a9380526143b32e102247c11179c404a1185527e0c9b16d4a0052b92660a7d271462c9823fb0600b92e65b402dd27c3a413644f88d10e14743f49e960dc85d449bcda8f9f35246470a3e9dc79876442f2249ca1440923051682f999044a194cf26f4a3ce8605149a5df41761e92319026406f0a28c003cdc2311886533e28d246502200a8146192c2409e38323ccf2453a2b92845100c89c4892b40ad1ff94240915a9183d91ee8c24296322da48a7f04ea62443d200960e7b741c69c131fa203d3e88c8c5d3127209f2f916fd8e10bf47478f1ff900431591a48c0d49ca64242983c1bc429230ae90244c2b2409c30a49c2ac429230aa90244c2a2409830a49c29c429230a690244c292409430a49c28c429230a290244c282409030a49c27c4292309e90244c272409c30949c26c4292309a90244c262409830949c25c42923096c0504292309390248c242409130949c2404292308f90248c232449229130a335a421923446cad4c111b124a9b4c42e7088b280d14892b402298b5106faf322d16fea2049183acc4192307280822461e220e170f1ff98d15f64e32f4918384812e60d928471832461da2049183648598840908568316b90248c1a3c04ea2f63f4f922a0f9915cf0f261ac847084214912902c4266485d5880a5d3d0313a0206875c7070c805c707d401cd8f8f344812060d6790248c1924095306324812660c92249160c4100649c280e10b2f127d403fa4960c904092244c8b0330b2f3052814931882262449c260410a5900928035e0e1499284f98010d42003083968021b2449c2ec601315d82254a2b2054992326280f1814aec80033b388524493616f0034078e2084860832024492a514211508121c4e40a10489284a1442982d002561c61124f92241b4b18729204ce1e52f0084992308490ab0e26e8810a1a2149d2e8d36111bd7c1893b0b1089047a4198d2149120824892365f121852894c2c21f1a8936df098dbc80450dba307261f1972c9d461c3e2068c387249386243016404892c4e911b3383f0708cb195888200d3982bf8e699a261e847ec3d2473c1ccf0e4992349ad08f5ad8796307d10d95507f3a7478f1a488341f100a875c706842201e1a518748082402715a1372019140932212b98c38c42d2dac717150a845d3810eb091cfa149117d60f42b1aefecd0a460c13b647879221ed00c19428479c807344434fa159166d4f244be4847c40191488386e6e58968fc5d3a9c979a954f4723facea83b2ca00fa8dfe31212a249d1a48826081402e20307e8c7cb87e1a2970f03f4236cb5e6eb5a2fce54021b32980d4addc6a27267d357fc5742cfe2366210e53e93ae8f5b5c7121679a3cfc23d18688c7454e938e954f478dcc2bbcc5e86f325cdf8af971a6a90891cde4f76cc2b831f9c5403903250c9491cb18d3147a222166995f46460b1957b0b7dcdc28a1bf8dafa9564cf5bcda968cce49f7749461c5be76ce706364e7eb2418d3c4a13723b30ac518b38fcef7df3d7d4e46154c61b7d309e7e2e6ef3a930ad7ed29285745a7cfc5880ad98bfd938fbd4f7eeda770f131336d716364065f0832a6d828192e566b39e6e0b7954c299ad9724fc9663ba59061789021c5f2f6742e93ad0cba84a358ffb6e4af8dfd714de74cd3a72359402d0ae912aac71a976d543b39d3a4829fa61b2a0003c834b5b0740932a1605e0ae54a39d95bf505856a0e1976f763b199dd275aef8492a9d5cd4b4a4846c613ef543b833b97b2d95c7982643ac17ced2a8c4d41e5dc624e8613534dc7a684bb1a83daea4566136daddb576dcd5de67671a649138fdd622761ebab3e679990fd224b562f9b6bfba208131d7d791594fe2eb1de42d90cb9b9269f259e37d5b24db8f6b936d691a9c453cd3fca57dfa632c794805399add92adfa5936f126fc9a7dc52177d55ed4b62277b4d796bdcbd60af4834f673d5c9a6b3c9b90d098dbe7131d6267c6a953fc2c1c80baeb66f6d32381df1da29e856a754ffa0638d9891f775aae95cfecfb8328cf8b75e5d646c4227d5ab2db450519945ac43a6735993ef3feafbc828a229f416a1fb54af9a652258d753b0c56773c6b79c334d1944b8576d7fb7ee41d961640ef1dcbfa9628bad31d3769c698273e49231848373c6c7ed66f7744e72a6a9451d964c21d43da7ac31e5a07cf823438836593ad714638b3decc699a6cc201c4795eaad29bb497ee54c93c7d3212288f5cf53ffad264581e827a562eb549bf1c18d8058f1dffca77e1f5cd71f41e60f8bb767c70725ef2a636664fcc0bee62e654edfebdd0624d38707e7335fea49574fd706c9f08129a67ccaa5ec72f2c73d3054eadbd753b09bb346828c1eda53befad83b2f239387199d6ccf7193ddba0f34faf8c0839c6aa97bcf9e3a5deedda1df6caf955b8fcde2a633a790337cf0e0c1226223d3b43192b14353a5abd49b6acfeb23679a7a64eaa0d8d2b851aee7d643394da00e1d5cb58c4d328cfb8a397d911b8ec8a5659a3e909983846c9bb7626b9794fd3c193944b5d4c36efbbe696c15b588547064e2a0eda9436ea7cf605b0b0e51b5d76c4ae8bd98397b83b6a5cc2dbbf6fe1c25679a36d324068e1c64881182699aa64d8b2847c60df3ddad8def796bc3bec84dc1d974c157f1d90055e3f53b572ac88ca520b306e6746d3f73ee31fe283d1935283fe7a672ead89593fdc9a441364fd9dabdc3f5e90d0d71b2b8de163ffb9bceced0e4ea7dcf0dc225db5c66d89d8c1f64b78fad255ba60ccbd983aba5469e26cc0d3264608aa1ec658ab9ee7aea09c29219834657d8f01942b9de412219316ceb4ae8fef55cea1293844c18a047874c49765e07e59a819941060cca396bfdcbb154deef2fc87c41c128a7631ea5934dcde685d6e2f3f6fed9d87476ee02fc55f5ee3dd674990b5cf0211711c8d32c60c13415e9f88e0c17dcad72cc4d9b5bf9545b707172436f962e2c2fa305fee6a0cfa5dc834d9b39d3d4d2098d449e691a7d3a66ac74724cd394c9828c31c2d570ea6bcb7172a669f322372f9e161e192c4ce5d95c9f41385f639fb9c242e676d5f2c1d7baa98e69521141c60adada339e5123f3e8acb40892a942638d295ba92a9bf33e2ab4d76afa5c6bfd6a75e5d4253385e9da4b3657b9d71e593d20903423238575514209dffbb93eae8ac27b257f367b1ed9c95ece3485402d9b1666d9918102744bb5634b41f95886fe25344d20c83ca1ad5faa695cf1ad4b176ff0b8814325051927a839979c6c2383cea09a9926a86d6cfe54ee39c38415d7737dd03987bcf439d374e386192aa0d1c787cb2c616af4f976675cf2edc3d0077961344046844cd3480931ca953e9b2d54edd63837fe03f2e898a6ff803c8d03854726096ace071fb6c6fc296c67a084f1c920817bcdb8dbfcfabd5f1e237384b92fcaa66dc15e4ae5733ed374639a80a88c3a9e9620a1110a3246602c2e5d773b21bb096311bc3175bbf3b16f4d3a11fa4d6d2e2a0887c0d647d8a25255906583426887d1b9744d496d72ba4c10a48cef295e9dcf96f70f8d1742d440230304b7ba774db5eb5bf3e57ef062bb5abe5c6457afe691ef117a23203158c607dfca1a2eeb75a92e670d323d784aa94727b9b106d9539c0c0f149bec1d93d0ed9472361e6476a033ae63ff73bdd5ca9bd1c15af2e17c7eada9e8ab8590c981da55532e535e12f69a39c8e0e0b57d4dc928675cc67309b981529f6c4a5def31d522741192b18193be5c541d55d95a3c7f646a30e77b5297b9a55c1b7340326bc4f8da7dfa54cbf52ae67891a1817c90bfe374de5853a7462e2d1f1fd0458d0da8ecc8cca0192ba94abab753c5165c1acac860c1d7a6d2185b93ea57ad7351995f860a3231786bbef52b65b3b5aea9ea2b1884cde5b738b9dd9bec8a197baaa8512905d72aa615cf167ccbde6ca7bb8c15f169fbe950a52f39a17c016615f139271f53b61acf8f0cb3038c2af4f1749faf65bf069539d3344d2a214c2a5c32b7f2557bd0bdf5e228c4405a8041c56cae3b9739a971fedc53a8662b2e6f76ad59ec5e01c6142c3a082384cfa22f9b3b31a550713d1655ceefa9d83f527c934b293bb953f952ea02cc28a09bbf645cb7fca1bb63648011857ba878ce96ac8ca99b4530a1f8371d745246e6a2946e8162fd52b94e1f2a11cc273eb6b5cec1a6aabf97e44c53101c184fb0569d93a53a5326d74a01a613d39bffd96aee3dd8260b309c60aeb8bd8d2fdfc2e7c9f996cd660bcc269447b7f1274fe8cfee5c3cd36134d156998c4bd58b70fe47ce6232b1eea13ee7be31757f8fe41590181a1183c46801fd98a6159047056230d1e4aab5ac3dd417a5b6202215c65ce2a9d7cf4596ec0fbdd7118c25d6c5d8ee5647651bf545984aec3687eef0c9b98de9be88394024861291b596f06dbb6dceea4d023afcb64ce59a4f158b2f18494ce554bf07ddbff85e2e071309b73dfde76230f684b1b5000389c5b6d79fdd596b57b506e6115329a7de14aaf6c79547308e502fb2f772a69a2ff59a08d41182694474b25f7184fe4a6a638c980a365bee2274668b35246016e1d43baaf5122e966c3126061845b815a7ceb77c1bcee90d343f3e5c8049849cd0f9b536598b0cc67e0106113b95f466ac5f7c76b5a21706e282398474e9cc5e7c52b1f8dc4f8031842f5f0c5f8becef7645ce34c1a58588bcda3be7abf97cee3ac7c41062a9ca089d3ff63ec29783780959537117bfb52b21e7460f4d7f403ad61d011911a2223182808c5d290599373777b640b4fffb6ac5e07cafb913085143a5070610de6bf2832bc2c68bb10be2ff3123f4181e60fee0eea563cebadcb383ed07c96a6a53b7b43d4a6e7d68ddd69b5cc9945531e5033f854da926db2bd9f2a7e9461a2a3c307b98fd4a755c71d57b548f334da051ebc0e8417b6dabe8d89b7c9f310f10b2f78cc1c874f6938ac1c3f66e5b6aae7de9eb15679a30775071973b84cab97fdf97910e8c1d5ed45dd9de7c6eaa5ef20c943054a6e905983ab4c976b9940ff5497fcc05183ac8d72c772ae6ddadeddef881d243e5079839b8f7b56eb2aae9ff9adb50012307a7ab5232e4d9d8499f44c0c441a908a164efbdb67bd0e1d0ddfceff563bf2daa2201f306f6656ef9d583eda26437bcc852d552155f33d81cba04c1b4c1a9076343d7fa654b573644371f9393b5c7fffbdc0698357047f9fe9582d131a85c0d306a70d3e5fe8add51c1c68b334d129306b70a1fefd3e63edf151a969ad1a7ec65bdcaccd7c09c01eebe5451c2a92037a744c0986141a9525ffb55ec734ace873d40de413fa6e91df49926e98a29036b12eaca85cf9139b746cd2d2c2a443064f8c97c2a75e8d3f5ff9a5f860d306368b0b1d286aabdff7ede4325c70ee9606068801183da573a99ed6ccbaa18260cdf98255c50f17412c2a592020c18a4fad756e373f00beb177331bafc5dc178416d6c712a7653f19b2c481d305d70169b2ac99eb9397583e10263d5e65acacb16774fce346d36a0954d0b305b808d959acbe63356cc31c068e1a3cef6506d9c6fbea859684b417e12aed9cac55f5870cc1bcbf506db6bd622679a4480b9c272c7e484ed4975733629046305a95c59dce71be7420739376ef498a61e284154727c2724649aa669f323563182a942932be5365ee7a462ba383e1a4305a98ddb6cae79bd640e39d3c40333858fccda62c84ccd28372ec04801aa734feed6dce3e51904e50c9430545a788c1666819828bcbfabb2926ebd9d734d5363a0b0fce36aadcde8ec619498273c3fd5cca3473697da202b1827b8c872675425b5797376a3314d788c277496ecf57237a76babc7c605c304f89c5563e91ee4555371a6699a6e4c534f9b0d09304b78ebad7ff59e296d7241ce34b180423c26c728417bf6b75f12be6a6bb9f93b5e468b49c25bc79ceb6f53397310ba0f1a6090e01d99732e63ab37d58db101e608ead2a34e9fb1a34bde2d72a0e0d0e20c8c11d874f6da83defed8b25804d9f4a346e622c3b6ad39d3e403430439d92d66cb247c6cb2861902535d2c999563f6b82d679a2668c3113167314268efa6f2866b779d5cc7f9d0e63d928518e132a6c90887a609049820bcbb26618c2e5dc2c91208eb60efe465d3b5e796e34c1311cc0fdab17d51adb7cec65019c1f8a0b5a83aaad7b61a37d31e28c9609cfa5cfbb52c99078dc55ebadadb8afe9e77e0a683eaacd75bce34b100a383567da81a7b73cba91647981c3c8b91bd6e4ab1e5dc9c221cb8c8265cf75fde58aade80c5770bae9bb3a9647736908b1b7aabed76cf45981ab48d725929a6782574c1acb1e25b6cb2f7dedae27c9c690a6168e02a55aef86cfaeb6d93334d1dcc0c963f7c26216387ccbd71a6092383a8949c7017aa53a762e44c1326066f4926d94b65915be5628141d4b6d3317f3354fa1e679a4620d00bde74c951a9bbef9e7039d3345db0e4dc6552d745f82c23679a565ac0ce2da6227c51ea5a095758c0ff9af5825397a964ce99a6d18b7c05ad3acae6ebfc4ba55c9c6972fed0346dfe253aa7cf4dc6d12d56aa8ef8bf83abdd599bbfd4883b28e7636e4d7d296d428acc079ddb63a80c3add859981cbc3e6ffea563f3ac7e03a172123e99a2d86ccebe6ba8b96c9e9dc4ca9b7520739d364e43fd3c4198d5688553f3be3f68f1b95e280e66703031540d6bfcfbe59bf8538382306324d2adff222649a36de125bc357ab1def8bbb0ab4763dd6acf69bbdb3e24c1368f44111c2020af1e86f09324d2a98353eae4cb2c531427fef0b59d45af6b359b6e8d12dbde1e9a5743da9668cd3157322cd70b5ff6e5b50974d96cde73d2f2da09ea61b2710a2c68f143874bfa47ab59c3a756b2452d14e53afb6315cd8542e2b679ad6b96c5e14e216e54036a7b66fba5d2911c393cfd874fada74fca6e2280983d36dea1fbf17a56ade9c699a2050080c52f2fb756cb9e16cad75c91760742bb693ed0b32c8208753e205d6dd188491df53e7a69c69925d80bed6d9a917997aa99ad3b251e977900e952fe1822ad8eb6fdbc1ee9e8ea3b2a3640bfd56846c2ab5520b1e971dfcb622546e5295646142a6dd4be16bd99325679a620916da7252d58a6faa548b59c91576754eb76693eacc5fb482ab5a51676371b63a094baac0e0eaa6deae709fc346857f533216a37351f5db9b42b3f56b5f3297aa94db971229bcf65cf63aa7ce5e553b2551603ca1e2c52e572bf587c22a3ba57a5b3b7f9ef209aa968253aaf64cfa337502e4863e6774767199b909daf0395bf81d55d359c28426e774cab1d7569c31ea12665b6d71b6e9ed5cc7364b94c091b12755bd5b5f9204d85653a89435e9d6948d8496cc3fe3d477baf3d5119aae5fd1d7bad5563137829b102aef1957d792ea2545f05d2f2e66f97139f63a4d2c2821c26c0e9f3617235b5db5272819425c3a9b4b173b7ef4f93128110284b3b9a90dfdf562f2a9511284d5fe9579f17365e57da40408eef1dd7c8d52b1e8ebfd404ed773bfffb5c4078d3d5b4ebfb5b894fa3541490f9ce96a08a1ceb9145b52b506253c608e11366cc6aa72edf6a06407b297d57a4d45b71aabdaa8354a74a0bdefa9e3e5cfb8b5ca41eb36edd5ac39a8bac51994e000cae5ffe2e2d8dcfab54a6ec00ab2a9dea33e57d64e655362835709b5c585dc16c667ce34b18042f3c64b4808a8a406529f47a8db1edbe85867f323f6a2648d37754a277bbee6e0cf1da384068c672f2727c73757f18fa06406bb3cc22961f764cf5ee3dcb8211a639a36a2d7885883e23efc754cd346a4826944890cd8772e66acade37eb79218f0cbf9abf069943de17ac5aae5b62da696ea94ab24ae60e6eb913557cd542d0b01492b24fb84ff72999a90358241c20ae78c5b3a971ddf3b631c1c24ab50eb79fbb7e23274eee934dde090a8627bf541085d192a3597334d1f2049857c7123549341c64c2ed7021254acc7dc73b0ed8c0eb643305084a8a480e4148ac5f79846b5967dfd4d21a56ad538f2bf09dfa70b49299c7a8fa96c31365765ab8584140cc6552c1d746ec2c8d4938ce23dc2e6607ceeb9b7f9a270d2294f0657b2a8a2374928247bb84a9b9473bd07e7480b24a058169b531f7737368d2d05924fe8ead37e978f395d6e4f3407d5b5c7fcc1b7afb613ae9593cd29c773edaba69c7871dbe2f5582e7f47b28967e9deb1173b07fd39ce34958044134ba5bad9d0d9366b6ccd84da550b2ab7361999ff172498884f614a74e6ef7ebd2ea6ec5404249758a7ce616bebee1a5c8a334d2520b10454fb127eaffaa664932920a9048b0bb23725ab549129368384124e4ea7dcbb7f2212904ca21fea7a1e198b2492684e618a0f9248b4d7a2624eb9a9ee1f33ce34dd40830412d22d6b919bc6a96d9b23790453324eb558af922d5df720718473d8b1b9d2edf52ebd116eed7306db4765ccac9c1d248ce8166173bd3a32e8d0ed119245c0c5abb138275bf33143454826d9956d7cee96af4bc43396f0619c91796c879b97d068062488e0e6525d9f95c5a50e4320a408c921def9edc3077d898ef018282f1f064ae83922ee416208279b2929df53b2c912901402cafd55717732b52f2e219ca182ea562b8dfb22138264104d257bd8e6f4f5f64a100e9fea18a17ca5dcd4403c5eccfe53e113d9b430cba685c730010920e6c6c59cbd9552269d83423c6e40f2079db1dfb12b065da563ce0848fcb0af7197cbefc6cfca1cff746610923e7c4b18d57aab183fd3c699a64d0a091fe6d4773b5b64f74fd7e34cd3c623d9ff63460d48f6c09497ab6750caf91d9d1e1ab68f73d55c6dee3fd5819206491ede3567d9d88bcbe133c4035393fbd5eefa25dbbb3bcc19237cac7059c9365988c40eab6fdbcb8fcddabf5b1d565b1b7fe7628a994d25a14364fc1a5b2f5b8e3937e7d0208bacb12eb8deb0f7fd06247250bccadb297d2637a051103072a0fc40e9a1323a02460b48e2d02f9fe3b76f6f2c5749e0e09cb9d8cab97acb7f97c803246f80ac6f275352bd2e9dcf4505bf83c40d93b1d6095d5fbdb8647c098d5e4242be206903bfe6eb2d285774ab35c73272198343c20667ef0ac27d6fadaf1284640d333ef91e4e7d66389d24510354cb77eaae3a53d64fc3cab7a0b68dca2d8f12a2813b4ec8609badd71f739c1e2467f8756a418d8bf53f8c4ad50cb0ed379baceb53bea670405286e51894b0f9bbd8acdc9190e13da7e23fa5ad65f4df31b02a6d90716bec1c6f1303bbe9aa1d838f2de4666180bcb39dc5e7262b6b07c363e50d95e752ea58db17d455b6251d8b4a41a8ee05e51e7b3c1b3e6bdcda23e982544cddcb5fae1673ee48b8f06f9ff3632775495fb805d6a8dcae570dd5b24f2df0f67218d9742edbff5f48b200a1fbfc56ee92554b27c1c2ea621f15378cdeed52ad80e40a6f36c76daab35cacd4f3787c406285e94d294b385741f3e3e30a245578f97aa9eb1657397bb149a8d04e5bdd5bb157394b1f7dbec8149ef742a7a25a33f26a8740a110183f2091829c4fbec69335c6ccc1a92d2089026b8ca9a72e9f72ab3ede80040a73552efde96a4ac550a540f284e81c7cf3276c5f02891356fdd2a8ee3c9563ca9134c129d60921b766c293acfdef7466b7a252415084a8288164096eae72dfaab5758a29465141028912f629d51af4077fb5091f45a5082449d8c5d1cda87641f97a9a6e7cc840f14f270c1494239df921202aefe261161224b8b95e4a550ec29dab25c78c0f19d3b4427204d92673e785ffefdc9f406204feb6b139d36f0cdf8a2e2d45984c1d93f1ad4a771b1d679a6ebc47b2214888009b7b1b3f366f6ec93c84f677187f5975bf3819679ada0c1221f09c8c958b8b3987aa200a4882f09436bfa9bb66af2b55e47f9000012af8d145e5a24fe58d9c693a83e407b1411715aa656ddf24f4816af3dfbee8fc216c73a98c3e042b243d90af2793d149a87830795b946ded5acfb61567f3a1960dc8a7a904243b90af1aeb8f52aa65d6a6095304121d2c87ce357d537abcb3f9803ceee343c634898880409c2d144581a1854a0b490e9e4be6ce1e6cc73d75e2e007c90d9ce408e17a6ca17a0b2ace348d789a20890d5a9f47e9fe4ea16bd738d3f4122243e5060f15964e8385a4068d4d08e15ccbc5765235ffb84092355494efcd389db5d8cdef0345888a0f1108084b679a564868f0fe8ec9157f3ddcef0f836406be8a7da9e8d6320775ca60ba9fbffa992e7cf09f2406aedb186c6caa5c9f925f21db7dfb4577d90c2ee88affd5eb9f79b9352ad80a6518254be8f1b1c22dcb75e653e5fc17df2a5cbb37e7f2b56f3a564f15da9a9b3fdbe5a6e2b9ddeb7dca6db5fa72a6e9c60605c734d940c53fd894f5ab06d5d466a768a86e79ddebb6d47b69c3140a55dca9ec5c2d29df4bd16fb6d894c5f7a9a0ee3a52c4f9ad7e5d9715631f45e3e61ba154fb8bb9a888614314aabf6dec5d6e29f89e6d84a2bfed2ac9ddda25db16810d50f453d87341e86bc2e5f2138c4529a7736e6b35b59e2756ab8cac4ee95cac793b01d7832f592b5fb89aa90d4ecce7bbdcdc73b8d46b0f860e1b9b5873a73ee7d645f6ab4f1330323374cf29b84ecd4cb4f29b0e7bfe4af5a4c3045cb2573a3309e7dcb82ee1a4aba9d31583b1c5057d369fb7c4369f4ab52eb7f3fbac84b2c2287d6ad3b678314ab874ccfd2e6fe71e9f9c44bf5caf259c70df8beb92d0d776cea8dced572da69190713294dbfe4db6a27a482854c9eabaf4ad5d161fc112c605df2b05bbdd948e9091ad1597abef7bea6d2366fc5de6f8fde3e8ad31a23dc3b871fd5af65ec245e84ee7a6da7687f021ab2274be878eb9bb5dcdb14e846b3f99af92cc198cd31101e19acbb4bdf6bf4c290c6c1c62ca29277b1d77e1526e71d41052b55f0f597b0a7bc5e64c93bf8b4660a3103a55ef926d4ac5bdb809d18f2d1697f6736aa9ff20626c4c53966b56fe987ca553cec711624310ea7d3f5cdf51adbb77225dc34620de7bcdfe1d2bc72ad76a0d6c0082f9db666fb15a2515c23fc0e65eba26fb185dc7e607764d4d091d8ccab955aaf4b0d1877d5e4ec25feb4a971b1f5c39aaf53e236c179bdac33ae6e273cca7fbc872f5005d7caee6c3d994d5b0918797dc9c6c8d49b914468887d9ab3175d23108e77ceb0e72d9c36fd06793d36154e161c30ef259b355b0b9c76494b20e4f3294cfb7a9fa6f7474700ffebed8ae577ca7e21c14eb922f55e1b7a6665b4c0e103a5fe6ebdaf5bfff38688c6bb1862dae7baf291c9a3af658f3f56606d57a43b7d6ad29a50f36f8a689870d37bc36ff95b7d35f77cddbb0cf3d362cd54bf94e5673c9e9730dca18baa98abf7d7c72656043b9d9d8b75ed3d3a0e42e7eecfd636c0b2127880d34348e102a5dad4db9feccc619de5398f2da2e6518df2f5def35ce34dd28c38619de4b56da60e49e7342de81d1818d32acf4b7606c4d9f6d7ccf0619d846775fe5588bdbfc3d9bfe22ef386c8c815974a5d3cddfe8f69d11908ed0b4210619d5af6fd3495e4b361506e7d55832b5fab3ad5e68d80003eb726dd6a2bbd7b66be30b2fa532c5d163ecb664dbf0428b531f6bc59e6b4fbae58878f3f244d64617d4c3753bdd37dff6ae6d70c1b9ea5beddaa9c55e451b5b804eb6843a1932b93a590b12ae9bfb3c7b2ed9afa1c046165477b96a30ee54eacf9cd1879bcf28c30616225be717e1f6947255ab61e30a915d641032838fa9061d679aaca09473d56e7daa361a36aae09349b798d536c75839ce086c50e14d757236179ffc8febd99802c7f555f9f141edd6f9b121059d90bdc89e7aee35d59e334d9b1b37506e40174c136c44a1b58fcbb5760a1b7c704141a373fb4fb272afce1ac8c6137c49572bca6fb229b662c309923bb6bf155df5b79bc03aaa38bf59573b644a85096f4ddee8aa38b2c9f28996d0a62eb7fa96f27e3347021b4a70ec456dff166cf91246ce347d8c708b689a6e4cd3e8d94612266faba7982bfdd88f845dc533f6b37b330927679a5e42a3696a368ef0a67cc776be1675292639d3d462c308bead5ded940a97542cc5b051048610fa5a50e16bb97c114142a6dfea298c4f192b8e1095d107e1616308f2ed832baea5903d462804a6de3f29598c2fd95c425a6c04e139de656df09935291f107c726bde1aaf9eec358f875982f8b0f183d9dcd65caedf526c31e803f664b3f54af5e2dc680185764c93a805c4367a209fb352b2a57afd0c3b04367810277b1ed5ba075d6f836163076eaae9b1f58a51d963d6c1f72aa91efcb5ed5fe9c8658cd08f7ca8c0460ea436f8e453bf4bd731c9d978f81322e35b5e8488306ab08103d9eeea6b42d56c76eb1b48d9e642ed259f0db6b58ddd94c18e30be5703d6e294ebbdb35bed6f630ddea9a2dbd7362aa5d8b241831763537652fd955bebf3216e196263062c95fd0a6bb429578ceb396e6710421aa8bbb596726f1d006600db728f1f93fab05d330064e0a6f74a7eddbb5af406400c9863d9cddb1a43f8d1bde23538d5ba05dd4d6657f07aea1a3ab9dbed582bba25bfc6506e94ddebac68c5d8edeb722725bbb80aa8d66ba89c8baaa53aa98a159594aa637bd6bc5aa5425d8bdfd65ccb3143d7a8884bd9d79c52a9e626cb5330d5b0595b7ced56d74cf1f6bd776abee55e0567299e36665eea373eab6227a4804df152f6fc1c8bf1b551acd662eba51ae408574d513cc6dfb45f53cfe3921d8a7fb329b7df7d2d23645044a80cff5964acdb74fc0997ab5d6beb25d5a9e6279e9070b94af7abb313aa9d54ab717ceb4c2ac70925f97954b0d9644deeda848caa60542fee7bc3239c6882cdc851cae5742e55fc32b17ad75b7c3abfc929212696699b4a1d6b0e3ea9f4e412f1d9ea9573d7615b762796d065d9cfcda254cf155622c2f970b694cc99fd494af89c0c426e4af9bfa3da54e16412dbd0bf397ef1ed7a268957ae59d5b1e922c1df1a9ccc9a3f24a09cafe1742bba545f6dbd7c18282bf4faf261a028144e1ee19a5af3a95dae7a5fb5235c3b85fdbddcb369ab46a8b75585ecb962061923d85c8fcdf6f0e382d2d522fc355eb6ae2bcef5d43c51c4af7cd32d85ac4fadbf9344b8a750a5718288b8af57734cbbbd77b94334f6d699ee72ffb6551b8259640aa5bfe7f98ef50984a8b101119c1442a374f2d5fb235452d70921d46bba9441758ce1543e885510c2658c29782288d5765f7b709f922ab2c81f325084a81c3909c44ae8eb3f6373f3ad8e67a0ac3050340c95918f229c00c29952b778bdaeb673f11f5eb53d3a6427739cf861c5d56464cadfdf4967f1a40f6b7673d89a7b2b3adf75c207d7bb4fa5f6bafea618679a5a70b2079fbc1ac635b54906795b4ef400d72e6ef139d83a27d43c48d7ba5daf97f37937c78343f7e8efc9279fa97a9b933bb883cdd63bc89474aa393b30c66283ec5f8bfb58a51a277550733e29196ba67490704506dd3ad774adc3149ccc617e84d05b73ef26f477393cb73e7f0d36351536a6829338c8d56eaaf5a074fce4370a4ee0f053be7f72a977915f6b6f68eb58fe736ed55d33ba81c17d1fe33f84fafa601bfab94d772fae8eebde6c60add521d3b6183b57bf86d53aae7ecbe691b7e39fa80136275f944b9b3d76cdb59ca461a1bfa7df2ce57bbc7c714ed0e04ac6de085d83ecf8b19333c88e10bec80b7b4a19a7094eccf0715fbbc80b7d36fb9e9461a34ad9bb4b3d3e38219f9061617bba2cd5b579d478320656ce977c7eab9b826b9d88613e5552fd922caaf75afae783a8f84918d6f37e8f9fbeb97129f58213302ca66c196c76e6b91ae44cd30d964ec33f1f248d932f3cd5674aa963703d85ee85b854fbcbd8723d5515f538e94273d5c95c2e3bee8ecb9926314eb8c0f199b6f7d0a546c5cb99a655649a54364c38d98253c7988270fd3f8b629c68c17194b1c5c6de8a6c7f716edcd031068a0e14212a22169c64c1f1ae8acb9e54eba97abac609161aefab8e537d35738e85a6e9c6c9151c5c2ee58c132bf06f63dfd1a1946f14fa222fa191e8fb834325f4d3b431c24915e07bab41f8b62977d08e132af442c898bfe85c2dd75ed514e053a8a4001963578d57e3fe283d0acfcd979d5b4bc5dd0d85f6ec257cadf4df523e9ff05a3a15f79b35e6e48c2a3871027b0ab5096fb997a298a04c2dd76b25fb12a6da7576b7aa5fd932254857b94eb1e8daf9a772a6698c93243c6e9d1a37b276ac30aee00409dabbb0a9ce7f12ae96ca8393234c5da9afdd628a95af75628426612f29a5365b6db8f4a408ec57f3f51e5cfc9863f284084d5fbb72f77a32048fcd98aafaa60cb2b7d21321f46cc820bbe794aed7d64910f6293c01c28bb275e3a96dbd5cfa3f80303ef7facfb187cda53af1014357d65d6bf5c275c699a61e273d806e9df0e0b975b2839ef197ddafd5ad1b6c9c131dfc52b7af968bfbfabd6a39c941dbe993c5a80ac938c1018b1a7f27b77273c679e3e406ebd6890dd8b5afe822b7a9de47118f931a38b74ed6606d9dd06045a9a6f2b753a7afc738d3f4819319c8872ab219dbdae59a82273260dbdc72799b12ae9a4bc7490c542d9d709b8bce62e4a6afd067ddefde846d63f7a70c1357fc47f6f6e99b2fc6c6201a26ad908fa936d9f94b570d95234d5851009355b8e50eaae51c94b2bd9b2f305185da07b7e37aafcbd9480b4c52a15e7bb8266bffa8d0b53ad7771fd43823ef30398572bbc3f61864be1eaa8929a03f9f70a73f95733f60528a5db0559d52b7ec99531c11f708fdc887ca9b90e2db6a8d75bda9be96e328e25aad397d5faca5833112818070461d344e60228ad63bd56c6f2dc9946bea1df4c324144dcdb6bc975255a9b371a6699a6ebccc4ee84d40d19afb15ddb58732ba959f78deba4c65c77e261f7a82a96f4b05dfb59eca9b4927e4942e9bba52dfff6033e1c45c87aa99f967836fe526de6357d34df57eaec558c74413ec9f7674f5edb2ed9c8149265c2d36593675aa74b262e2e3d3673e57fec69f6f7289189b9a4cee7c763ea57a31b1046cb017eca77223ffc74ac038e1fbe68de15ab52425e47bba9edffcc74dba9dc45adf643737f7ab9ad9c544128da9f994be18f5634355c42412fcefbb75aaf5cdc9ff368184721bfbd73b089d1fec17983cc2b18db22d0961844ae9638189239cb98acd5d3167ff4c794c1a11254fffdfa61ae5dba54c18b10aaac5d8bf315ba5b10b268bd8c9d45227dd9b93a97445b48c51b2a50e7fa382cd2411afb239c96f2de7e454ca041112ce65ce4fa762ab2df8017538a38e9112981c62a7f2d99a7c5d8bc9a7268660c9ecd6f6375988b8fecd9dbe185bddc7533021c42aedf5ea3e2a7f6e55104c06b196adb576a9a5a03be904b1534e664c4990e803d27103baf008638c6992be790981589e45e5c524106e19329cf0d5d4e9f843a0cde8578e80727c7fc898a62320b9f9e6d0e6fb0302c304102b97d25ebd0f5bcaa85ce61fde52baf059b7e1f62f3fb47fe9ec3db37cf685441ad487e9915dea54b339a8bc558c98f0212a97ff3aae53ea142b8a4a0e4cf6d0625b50457f2adf3ef7c0440fed2c5b4fb9205ce85ecbc3ce397f63740ccee7b6f940d981091edacff8af4cd52e9513dec1d78351b263f57a49e5941de26aff820fb63eb8da12c3a40eebe3bbd92fd9c3b1811c1b5021c3840e8eb5e55517955cd6aac8309983c286ab62dc9f3f9bba81891cdc495eefa7f6ea5acc95c1240e11b6e5f5e9fc9a4ba5b0600207a62ed5934b5df9f26d2698bce1b5630599aa62be73b5891bd62da614ca29dd7ceb6fd2066d4aadfeb7c712ca1e266cf8e8714a65baae3ce5a481c91ac0305183d334345597628286a8ea523487c9199c0e1333c0dda529243029c35275292664505597623286a8d4a50c3111c3aaba14139884012a753e4cc0b0144ee6625c52fe2a9d265fd8367f75f9daa8e67bb5851628981c9878817dfe43a996fc7f7f5dd8b6b677a7ca0715648e0bd1edd3c8be0cb9db922930d9c206343f3e7478c0440b1c30c9426c4ca90916a4648fa18b0b3e35e563ce8f5c4cae20958a2efa732ddbfeb315369d161c40342655f8fe803e9b4e0b8eef0f68022654688d9553e776c8fc3a857632b2f642b72ed78b52a8804914d69371a7dbf60ce1bb9a40414dc9aa9eb725c7a79e600113273037e95e1737d7feba9ab04e6e8453be19df4a284d98d069c181061916305982f2f6f075b787bdfd20679a6efc88313330518274725735d89c539155e34cd366f4923049c2eb2bc74c41e55cdd3b24c009a3caf554b3d2f87f84f6b637b25fadeb49e8739a4c8cd06ae35b8f3175f1e36a264568fef1ddb6d52bfebf3621823bb63eb673ee19734d8e7e65f4214881c91058b257bfd8f74b7795f7487e828910d88bfb9a5bcf3775fe73a6298849107af995cdb57a1bced580b0b2c2423c60f283255dc3edd75c3f83a21ba32360ac98f880fde475ece1e3a6265b8ec7c39b0d67d4f2de263d1099f0a05b8bbbdca05cdaa6c90e1afc856dbd6c50f2be9be840417fe7cee56ae66e2a931cb04655513219e352ab452f98e0602aa9229bf0b5d46f4f99dce0c5ffc6dbcdace1fb37b181c6a406ae997acf27e57c0f252382c91adc6c327eb1753fe946604203f7a054e80a2ac954130181381eefe8c064066bbe365f49c5363f027dd844061130898173bdbae9c235a3b7e75e461d2d94bc422db7c84dfeecfdb84a54e28a660d19b3fe83102e47ce34d1a0a4156ab957c20ac7cefc962b952bc25f46f17858078aca34619850b28a8d044a54a1a25cddafcce692539553c62b49451625a870873ad5b7d80feabec599a6354a4e115dafdd06d56cd6375d85838412532ca0a414d0450515db3757f2b6c699a61b64e84011793c3850ce300305659a6450428ab89cf972d3cd655637507aa8106990472aa16414082811c55b55cddcbeb6a7e27425a1184009282464dee9d1bdc7e93a4a3e01db599f35f7604b8fadc4130928e944a70507875c702ca084134bb177d19fb16657d039dedf1244966c02aa35d7c25f8c1b5b3372b428d1847317a5f35e6c2e6e1b85f8c8414926de82dca693136383124cb4b6e07b6cb262961cfd86080b259750f3b7d594bf2f9bb9bf28b18474cf93e5daf60d279754e2e972c3b5aea29a0c42ce34857c534209f5ac92cde9b3a56364533209ef5ffbd62bd7a96c55680525925805dfa5c2c762d3a9be2412daeea6e3e5fa1a9bde5c4a20c10a4677ddf1fdbb28f711ac9a94aede7b6ddb3ba23de9abbd164ae94f3e909246f864a7512d674e3eb7e2fce8c32ba31246b466efc1189dbb19ca3646c9229cf57bdaed1c3274ec438a70ddf7c6d0cdd8dac6c79926f78078a0f85069e131543c258958ab2564efd6a3ba32558288e9babebe9f977946a88292434c39dfdac771c528999386604e179cceeffa458568b29b84cba43e6bad49510921d66f6bcee3c6f91add7eb3a7641053ad9f8c4df89433278819f5358f70dfca09670c046c521d43f7989b2fd99c69da885e9ec806342a0104e4764c57636cff309f74cf526d932e76bf182d28f1c3ceb5cdbb8f2753aab93ef04bd798db7ba5fa569c69fa4e48888a90123e3853eb6d2fb84af6d0deb57e83de3ed58baa440f4e3ad4758a6d7431b2e288a132721923c78e1c2579787e56bb3432d5bad6464bf0d0919b1dbfc52fbbd793257770a89a97f96468877fd2359c0fcea5cf6cc3525287b8ebf1bb74d7a754b71094d041d939ca6fddac9be9e34cd31cd63a8d91b1d854dbdd0295c801f28cbe34f6ee7be7f92989437c75183f7a83fa549b1f22257060079b6163a8deb264fe86381d2ad79a2a9f5141ef94b841d95bfe5642e7d84bd9446d78f7a6ae7b8c4e39a996334d2351c7f3a30ec7c866f42b6c702c2a9f3ca7dc9235b4d898ade5d66391f99a256a682f9d9aaee19aae99ae334ad2c03a95b6d854323440c952b96e9fec1a7f0ad140c919e46b775337baf6a662c799a61d9498419735dd5e5dc7ebed96a1cde64f46d7db913d9341fd7f734bc91854d97936a7ef3c99eaa87492e62381248861148320008060bd588302131100303824200f88a3f1b064561b3f140002566c5482522c950aa401511c895114c54010c3300cc2301445218294828e4a4a0056bbd7febacd9b1e852866222e09eed0af701fd0bb862786293ef74001ee6df4b242cdf31bb0f59d4b2b70e07b6f5b7c64a2cbf703d4eb554c2f5d116abdaa82cba56827e95d449557a88d584a5fd0748ce6afb1e7217bffd3c4fa275ebf4ffb07b4f5aaa007aeaf9661a11f3ff88708efd5bdb2aec4f326f2b3ec0db8f202f5d45e5fcadd03da8ee23f067d33477cf8dfa0665d17b1c07810fa1fe0c6f649fcf1873a2f6db89a61bb1b36e444ab22fb98b15117511760f2c4e00b5dbc09567c69c99313909f44cea162c3d1b7ab6b3d502ca5916245bab0127df076b008625eafdf7b7ff5ae76923da8f1423c1f8fa9c00366efea79f1dff3f11ca85c0efd3296eba810ea0af9314f7cdeaf7327d81a0a08d69a3b027c780256841418419e310ef75f82c19ca1d688008691ec2167a8161ff17ce221d8fe47449164015ed18964f30c17fae386891787cfbd476bc1d718d7fb4a08eb57e4c42c018a30a069d8f9ad0ac765d54a5182fefe8ba703a706abeea0822022ae3f731761af34cfee216b61e7dab06e090661c6ed3fa40f348876c4c1ccd9a05fd852ba8358c3afe40a699d348451032bae174ecab05eae2ea1454c23d6f46f485c577004729be4fd1ac692f065b379ab792ff424a153878461fe47d2f586cc2e7af10d977b4a2b7fa303a58de5515a1bd306a04eaa067fcf5e1184c6a9bf4decdac4654aeb5766e4e4be1485fb52b4f9a9a82caa3c3c9f17ccb50d20943fa4373153c76c6dadac29c2615b3728dfbd00679b71e836c39a146982af55d2a6c6363f839cba2fe4be8968279ebe806c7e5e9eea297a5d1e25e665fd7a4656e6a8e8c9ffced64e1544a67cd96e1457702a6d479aef1b3e11d0b9cf7cf0a35579751f5003264a4bdf8b8f554c84d32809feefb8059fe41a84c9ed2a65c0e1891dd2921d412461b0ec3d42ace602dbd651ef94f41a3fca5996201ad3d7a5ec2e4147c742fc588a736cea08acce850a8227e3bb2f4a2c5300c665ec4729183d00f52731f28ea0d5d7ddb939fd0e211038c860508a7d69afa67612bc61d426b55b959f72597aed7ef04fff7c1562a6ecb0f9bd307e8100c0d618cf49fc08666b348079327e2b304cde2cfda5d197afe23660fdc4d3576facde28e0c7981439eb750fa37a84840e8c69133c8004654dccb6e8000cd99340339f7c71323740d985cb02e9f2ef4353ba3a04f4e2c6e29c03bc9177e8feacada17a86452024cbe72223ba07f4b6d9ed832b15da828a9defe9d7fca3c64bc6ca54a6830cba2108b9bbc9f379ab084d252c04033ceea21f901f09e33efb919438bc2dd3f79d8bbc7bb2a5da1186990039fb7c4efcd8fcfc66415bebc4b4fd2a6a65c9ce9c11d03902e2454981e62ae6795987d2729958b436df56460d8ee96d5136a8c91b696b9cdf2f0630f46bc1d70514d0a96d7fe5b82350391020c2fb4ee67bf0dca11b005ed3173a31552d4d36986ce67237cb68524111ba798971f3158615e18294d2d89e8158b503e008ba684fcfc91e105c1f71ef8d7b2559c07342121e39b6a9c473b11927d16ed2364258eee42aea36499b9a4dca60de528d2e4e5c024f4950e69f43f818ed2627e0eea005adb311be44664976b3e1ceb8e1eaa99a3171fc8af9ead60998782296b419736ac85c4618b160791ed1a2777e27ad02bb54d971bd12e9fa5eb2f358d33493e48a351a632f36b06f40e9ea442aeec02561e4dc40744c6e23612f8c333e5a1b1bb5ea61886c4e2076cd51c14ece6b54710b150870e3d1252cd3cbccc40bf142be71a9ad4c605691101491f32b4fb333a67a626a72349ed579129b774329c518e22d9ccb680ccae10f638b8ed094367971bbde9547f368e6c1f1fd878593591820455b8510a5f35ad32603df2c5a48ead1cc0377b0303bba54b69cccfd3afba88660a117a107d126babdae7c3850b0cd95d7e5975db47c39ced3397c7c5675db929bb679d24733892c01846bc2e33cdff7e847150839bcc5ae0e9e5017a934a522d09ea249e11ac6f936b77503f362c2921ec28925b0bfbeeadb954a0ef400c95808d0cfd28dc56664cfbcc1a480ecf1a579efcb44b567f8eaaada24f49cc7c35844eda4c39b90347afd2d188bef65926c3f5b973943d7925966ae9da8bc5973d6f5b399f8edef9ed776a851b1e21e1197070e344cc59714eca9d86795ee6264fa7689eb22ec30e10de3161861307c7f27d2db48b1f69d15e489cf14eaffc149e109df1839762c97871c79ec8add105820cb0f7e7b624d375c305d720f42a8348522569d58e886fe66d356b8ceee9962c57cc5b946e8052356b387876333372f64582271b09731eb8571d6d565f58fa386d6df91619a23eeb05b355ff21bb779c9875beb50aaf24cf86021462825df62570782047bd4f1a53be225220085cd25b9bba87d1680aa1db365e9edd233d71ec249793e18d5a1c199c2bcc18437e369c3bcc014156c86acee170b3e6feb7ea5f435897c67c510bd59b6d51955b664c056b490341ccdd42b4271de07ececb3a7e97d5c81f9b5b5563a6ce88c38f54546d76d8e2225008efe476b333f0ae40d2e7617f8bba106cca27975a29493c73b7fdd89242cbb8bf2b280386a066f26da71a13c2d791d423f3b8719be8c01a6913b59a3eb543f67a66765c871263a9b0fe3f1c0ad4939b79359546260da05dd847c5aa2f62087844e7a82d8a95bba3f87b4da7ae68a34d4b58307581fc509c9d1cec20578555f852c45f6d2546d86afc197c6e32f68963388160111c3282b9e8acc17154f5d9a342f677bce02f8fab403e196882fcd3e941ada82825c21f600c71895dbb46cd4f2112f3ff50d7154f572591c26f84fc5b1634beb89e31bef8dffb578ba7cb7fcb7b7d20f3bfb7b805e8b2ea81c273665ba85127aa953b6873a9434ad4c494a96f6270a2e0b15608f6f93f7e4cef58465c3ce738535186a3ea536ccc25a01180c4ffa56044f32cd1c6778bd6e734efbc99cae188fe7f608d4932894b421dbe029553603c2df9dd0fe7a8f63757040faf8c4debd6490a9faf1d99063c0a45c011c8ecf2d3a50ed2222722d881b80d51557a10a8e7a4320aade4526eceec6be8d431eae24f0bcce9bb0f51a423d10b921cd5f5a29fc34af3e1f345df49396cc8e5deebd93ed4836afef689d8f37d69d9a26c33b2f6f1c6e9784ff8fe91eb69a0618a6ca8273d6a4e20c19401e682c83cb1780de9afaf38885563348f8cd5a520ec490fe4331de2db369d85cd5a55d7e14429538844da98d62516ef6de97d48d96008a238e97dc792e8c13a5bb02ee421697b2a7c29692a61b9a5425025c41f8c3f936fc387a29d90570ec80b9a07030450b2b7ba698aeb43a75015108b8e30d29f112e381fd3f924afdf0cacdda0d11920902cb30ceaa74b9a9db95aa25cc1b749d00bbf4ec97036c9859a02e512ab3f591a4240738b4882f029ab85e0506731bdd70b6b5e1c293ff32135bf9614cd57d3d0b1384061b59b6fe77fa0ad6cb9fe10c5f57efd27339307efb7c0bed617a18344bc45b9381e78323ae0eb8ba3524636c4dc3fa86c02ef20c5649283b9e13d8b9f84a63c86080d6676290c2002088a56666cbcd1fdd97e8312e420491e8ee1a05c820e37ad37c74a08ce115e43be29319e4ca20210be9bb91867524eba1b6f98261c4738b2db8595c5828691d075cd9e81e76e503b3f77dc8cf7777b5b55d3dcf62f428b8b68b7f0a0ced4bc1f34eeb9b9b9cc9e8843c659f9f17cdac5d3efe9ddc3b3d1243a26817cb6bc34a23909b5324c2d82602837150295bed40b52af9404cce4bf7b994fb250bdafdbabb856ef66c5dcc1b3663493cde51d858c7e3d4e0901c2980ddff8413c9f2ced965a24465bd05a1f011eb565de53c2a6398ca59ba2758ba137c3d9c6f4fa0d069b35c17795c0efeb6c5dce0a8a308bfe5581d20c4aa4bafdcdab1fd75a97812533fe809e991444183b0d9d19215600d855e4e3e0e04f2ea9a0700ae240f9d0e3bf64622cf48b7fbf760bcd749f0cd833ac13522614f9cae81e4cdf5de751aef9df0bb3240e4478fde17c97c4668b92daf0a0029419f70c22cdd05120d771faf2722f80bc4d381a1b63f12cd219e17c685605cea58bb624f74a28ccd3f74ceb618958825b06c37f81700ed54f73a4edd523f05de755bb5c80769c929dd001af3dbb079a1bddeadd7e44a645f36af8be659a0098705be7b305c9eff9a98c9ba98b221987c908039b65aa9a045cbd43a16f7892090c1d7e7ac4ba398fb8f3129fae0bc0622a418863a89103788f9eb777e3f8586fb1aeffb0482149a2e4dd0713b0886b6ea74f6181c77315a8a15dcd926983f2b80d9ce0b0cbc6abe46de122ba24f03a1dbafb839637e0406cba1aa1ff4f81c330d19ffca831758c4c154482bbce448385582e844757476f6fe66ed94ca74ace53769970b0c2323d0895cb28e19843d123abe0395de70d63f629c4b5abfbd38101a3cce2969f37cc0dc1299329186536201e29644fa107a5ad41532ea32d64d291bd7bfd5081e9a6ab184260733ad97816db48b4c2ac2cd89f080bbb640db4ef3abc285dd6ad62f9800fa69a5896a66adaa376009ecd3da35ab99eeed566050edc599998af0c4a63455e58f4a070fea0b428ed29a2e0eaab49bfb419fdc28ec350401e556058341a569a45d043b13eabaf0b95eb5afc3b71f28f4bdcb3e15c356280057cea55e70ce1d82ffa40b63c7a8399f4af32052d65ba0111c962c1fcf9c455f586a290aac5800e32206b705c632033ed14f82848288194ad251cc1132b4510219a2eb72893a62551dfab3655120597b945337b54a06d818f1fc2a15a88904455cd57c114bab382435723634f91b497f8d71059062e4f57ae8e1b2ff48d2e173adb130edd019155e70d6cfcac7fde4a99356d95acb3a7297fada2a27d53203adcc1605d58c22689bad1cb9fd42add90774c128fdcafae99f86f1aaf3ab570a3456ae87394132de4b8b9639c36eedaaaf7340e63d0f74a064de884dd4af480dd7d33b26028c9ed015688515222aa42b62bde3fa91dfb345bdb2c39e65d30b98e63f1bbac1cafe4a46382f6fdab4bcca9e23174bb8b3b6f467e82ca5565cb2895b6455a242650d9d0bd458251a30d9cd4ff86787e8b2a43b5073ce70e36653201df104a3222c85ce1b5d2865f4ab28b741055da304528d6cedd54f6f3406786e63451f4dca69bb2092bcd68ae2a5ce4c37bc2fdb6815528eb05426bf7ba4167e3fd64a73e5f83177a58f768bb6a4822d0df9770a73e5228670f52de88e4a442d1882f00b9d9bc1220ac5e3f023cc46385629359476319f1aa32478ade6be86e52864aed640f602dde32d74bcdbbb9012244bcaebc50904efccd9f24299c8c3fd1291ef9191def0a48f5e3df414cb5ac2ad3c8d75a03cc330bd58f7f43f1598f5a6b36db3483e803453b42b3bb7707a666f928ed4c139100d1cb48b6f9cb89b40026946f162679d61645729fd20501678ed00ac0e9cdf806bfec59b64fda986f684555c0a9f8f142fb6cab3ac4f2f52912ca75e6e844c33d783650cb60a55353885debcb018bc28c2de4a785461cda51da4e10fbef1e58742446c9dc3dfc0d3db95d010f692eb9e2c294deb344115b5f733efe051c299083656f99a9d8e763d7e40d8b09aace9ea4ae2a28cfebf2df36d4055e8fc94c10114eb64ed57072e17f752e413b2881dda73e018948aaf5324e4a1386c7801ebdc75862b6a91be1baddfdaf058f446b7cfe7aeced0b4ad6ecc1178a1c1d8af478f6d47f28325c0daeb4568ca25c31cd4e878ced9a58d85d0ee5652e0142b48c1188b255c4068f2db72e78ba62c7987ec609795d28800570795472cd92210a0f52c610c4ce0408450d86e32fb0c10b6084800e2b427981da9a204f31ad21805743d48beb93729df37af51cbcd850fcef3c2c9aa1c36b060d7e871d89fe969fe453e18927baa429ff92dbfc3dd4d5b3f855ea07ff6e35311aac5f4457534ad85b2f81d7d19750631698c04cb579afada9bcb5a55c2961c84c099715cb840ceef76429fe9e736d6a20a944b65e38b201ec12a2acc644c188fb87f2082f3f6016d760f3e5cefff6864b8a9ff895a5af39503278c0b0c846fd0ac30032001beff06b167807ee71d4bcc41309acf1d2c8f702ff336af96f2db4abfce97bf8a1e5c364499f6328a6c61df1c1ce57f8b66ea115a584d985eb83bce45a3bc9d8a038e75dbff354e56a542a414b5ff1861a68a42cf8624d53790fde1d69c6cadf8ad68eab9d14635d78ce496d54da9ee0001ef3124d0ee50b34ce8185443249fae82cc267f14cc6212643db05b2db9ca53134973c0769918ad513ad6fb21fc90d2d5f26c74b195a7f49322315d218d666a747b852deb6456536d7c0e2cd0afc96c363faf93a963fb8cf3f416075c58d1684dbdb72389b8319ab1deb15a37455b8bd369e43ac29c91fb9fe03cc682709998235d22d7037c305fded2f27e83c1e46b9775848ee80d4ad6037f240a3eb53f7276bf9f6bc089895b0cd973cf0cc8adbf0637502f0d321b8a628c3ce7af8f6d5f451a2925aee4bef24c6b60742b993632adabc9a49577c5e0add46983ad4eafb8a7b5c26e76408937ede32b3200ba9099cca4a8e9065b255dc931785bc76e186f0e126070c56de9c75e5c1f55d099adcea754541907c6e1ba7d0746c18d5b3c503010fbb0938022dc57b1b2b34700fe04c9b85b55d763706eb268de49c18bc79a17ee6d795ac1b59037495c239b6902944ff891d1bf3454f7f73dd8d8a2d5e2251d41a7465ff00eea572150be5cd7792e1db4d6c9f3c86148197289a0e4d9d0ca26bcfbb89b29227d36fcba2577422c5998b77368f9515c8ddcc9f27a288ecad925408dd479183835dfb5b32fc26773bca2f80330ec9f4c6cee1c206ca9d9cc36e495b4b1567ebcd23fd51fb8abf38699edb01d0461ea6cd961624201737d85e4d70c220cbd523ae30881b229ecdb671be1ede5b01097adef96f3a02de525a16744120a0f43c55a65aff09eddc8c432865eaa643674aef5c70f0f3276b17cf254af253f0f87b1df914d0372b85de9ddf0fa7df35e220cc2185fd4f6def230a3a1b3d2bc971514bd6665f0ba5a951d5039138ea7342743d1395193948f9ab4f50168c8f65742dfaf98860e395a9e5e5f85e3512b1cf7c1b836511aa23f5b4c706322a15b97520ffda2ef9b27632b7724435a8ca00d937df0e1087aa92c0d2919d7ae1924fd98481088ae4f25127352abba0ca52977e099cc38b29f04bae9df9bf59e0cd513fbc04549d733ea84f7b5eed4c03e906672948d2c895d9ebf9eda8cb698c292c14b7aeafca8480e772d55ea42100590e3ca51c45eab4751788400131edd3913e91171dfa7b6fa3b6bdad3ebf9b5cc0724bd12fc19cd4c6247b43565ca552b4b387b7078bfb11166af721f5d234389f69329372879172144d059724223dcca07f5269e9bfaceed9850af1c535b78a3cabb8a933107c0d6c2c3be2da5c05160981f70787a9244715fdf44853ac03297be4729f59e7753e317490f205487af383a10bb62cbe9e01ab3af45a5bd2167a691eb2f004aa655adcffb1c4b8cb393b3b7ab17e8ee7dbc328865f92ee33043d5da3cfb3b3f02739a9edf738ca86ebd1619be9fff81e4ac896877a020dbdedff4c5f01e80e21f204d630417da545964d89f97ef628a154ddfc057176d16c7c34d94ee5b254bc66e7e3b86addac472bb37ca967f6d4a286ba6c52341343bd169a2e549d7f23c6f21d1a5214c1ae84e00cb418a23a732a5f2d0fc982a4848b8f7d487b3e79b14f4d148870f1ab78a1ece61ee5187d9dd7cba8e976e80d4f476dd836f1bd30dc311db0795da0e68e753085a10881ccc4f220a3760452d1750539c6d494249821edd95c51894a4ab6c648fc684e664d1cfd3c04c47651ff6e075bae0a2bfe6ac811675f3b28762c6085403f97823e4676c78d16adc97a451e7e9314aea78cfd1a404c5b858bddc1d70761f879d7cf9f0200b4e53b036211128452a0ebdce5efa0c474d0f279baa5d00827bc0a0d372ba48d86015fecf2e28a3ba73817779b51474680aa8ee6bac6cf2612df43cb2a9003fbecc63706b9120e6801e3a5032a7c83b15dc55df6de60e1d7a961f54d8eda65641a21c6e0603c0610072a697a2426219c7e5914c2b1311f436923b9c4c61c497ace842c1211cbabe1b161f2b48b1a1b62dcf13db15a809cefef1e376fa5faa88337cbc2e58245772a5d7ac6096e329578a0f05428c87e67aa646d55a4208c80a92e8c7529cc295792d236e989e8a79031ffcc2abf1e3dcf539a316cd9a4e41b0a890c00feef67eb12ee1344adabf6279b18069e528d706842b673e76608710b4096108b71e213a0233669694b0421279f7ba5e8bdb2e0a077e02655f89512a7f2c9d72675b1197a333d2b020c0cbfbdb05169ddd5a3dcfa00d370499e1e32f9a44f4c761f07f103042b0ba4ada254576c384b4e4ce13a561c4ca23ed5979c4db17d055c3ef67855c9e42ba7f1f262c0304ad0ad16f1b44afcf3a965dcd5dc37af7f6010310b52f035594aa7cc443198a0567f06e929193e7577f08d2035ffb3f192677bf1608b5944cdcf5bf1b76afbf6814ce5fe980360c4c3bcbd5208164baa582ce20b7708035a329e336cff803bfb6533426d8db27067a87969c758639508b51c575619a04d4cf0671d1b6a6b8201abdb08e958cc2f583b394177adb02dcb3825fe1a79671ef901302dc2b5813cbc4ec89ed2422d233f8b508eed13548f1d34f0f6ca022661846ad1592207c0403475afd918d0ec3fd912162de16940bb0c66c00a945d6956feb6f71787832e10d8b4a99db98612b9f31ac16c7e9990513c455a300e98c5475be95daabe1a383f65efb347cf4d7507633b3c0638d2618de8b96c2464a35168ae3af12068071cb25bafa54813325736529647e1365402c6d42b76394a59cd18004ba19cb1be221768d5aefaee377ae0deddc5176723b1094da08f36664deba84d89a2f7f187e50ec84ebb9f82bf443ddffd4d38cebd2efe3f6fd0e3ff65643a19fc67a06df6676758e77394b5efa701ff779802a4a24acb96c609ca854f914f2ab730b6ba1cc950c5ab2c2e2533a14962ec38cf64e7b17a18a540c35bfdbeab1d1c9d6bfeccc77f8f6152534a06e1a39e011da075b24247536a83fa770df3fd870d6ebbfb3746d743ea5fb393e36d64e7def0a3d98a3ecf1f891ca7051c51a56bd86ac06f4210c491a6f20b15e2b4f41e9b067b609d38d85fbe64ad66ea8f8e4dacaf2a949026c3dcb81824d23b09f7f945c2006caad179dda954f0caea2bdabde1f2fc8721bb55362d85c880a0b5b97e1c12ca11cc851c039f4872c3bc1bcd726b618d04d490515f2f4832d861beda2b46767f7c78815a680ac6552112f4dc695cb68b31e41138fdac02b6e127c97230b43dded4c17a3356ed14de8c5944017a6f8548cc6b728e9d7ae93736aadd296e3167b6b992e77b620c4dd4f8f3c57ab0b807aa53a0f2cd58655f6bc7f518c55fbb904c7d775853896c5df6efb944cc45b1ac900a6fcec015a8cd2cf3e0b37a8d7cc9fe626b12409a515201ff2d407f7e1275b8917e615b23addddcf8335a4995ec96a4a4a8e9b0952d84a483dd0cb80ac515ef4b81e7f34ae82208d2e858b5e45a83c0721e6df809daa84ba524e797b7484e0c073e2aa92eebeb2ae77dbb95237700b1e51dfbabdd48bf3c0054028825f7f2dddc09a7ed08b351182df6a046d357e5b4484ef179ef54d1ec436b7c3217525c6793ad669be5336f8a204b252a830d46b50b782d9d8168c0b538c02ca689f747970be9e52833663a6113c81cb5a97bb432643faca119afe36846cdd35dd322a56ecb4d863c6b78f8ef88abee895a1635f6855b72fea7b5c24e0704eec11f9a03dcb01604e2ee685b6d0c193483c40602eba0f08481abc3875a64f654d2497267e949d2eae05163a87948baee49db8d0414bff971a6c07c082218065828d1e64bbf3527af6e4003f5a9e1c33d26e79a1411203408e2589c2763d554084281f41873cd2955929bbc74361ff557707d854d2e2441d33d1c99d6953401c83b7e8324e5ea13151e75a99f7623e4468e0a2d9d42bc021ecbee917f9497db9c8c1a8f230b231e9c9c3b5c08c989aef7ab11ff3e30c5e175c4d811fd0edea18913869383ca74ffdf4685daa622d4820be0dff69999428544c9e0498068dc8c74a780d4ec7874ac7e27666c90c143fa8cc634deb5842e046aece96b0cd4a21a351ac5734c6a00a7cecf46b09fe19e5a966a6a26ac9012367781a2745ff77f4542e5c3ee2584728700598dbb39765fb1ec38f05f3e58257d0af13f16f4614bc5cc232e56b91339e9aeda39a3e8776802e7de4bd16bbedabcf5292c9ccd8f2db51fefffcf1a861e50db666d89aef115cef4b8c08852e5bfceee651e4459ff4a06bb8d8adbfd13b9927297d9203c09384dcaf9b11ca2109bd15dadf0002a928b12313f5faba5975efa3f8b37a5a315950772668edcaaa00a5a6236f87c7c05e82ad43c8186b1dbf11c4384ed4189bfaaefac5cfdfa9f7f7709b4ae5662a22a1e691dca8859fa9bf4f60b3e4773c506a4cb97dceaf1065e3fdc36456dbb11b7785b7cf68d12a601fc68dc1d76c12f340e2eeb21c258f8987a90dc01ab0dd06200f0094a4be95a912621fbe22733cb1c69fac0fc0a3d78155f9d7d13b41a3316e6e5e726f9244f40719e5eadefa0208a4a5102f362800c236e6253e52b37f5f243ef743449994f337684ff413b8b4af488080e55d6d4d9c3c708c81ba229e8c9a06ce0d1e23ba7c870729774f3a8059c3ec05262090997cdc34e36ca0a98675009256f430d8257695a7dd32a283696ae6b04980508f68aef30bd0307de0ca509abb14c8f7b8435d20b8d62e5e58f79e3331c0b02404335ae2adc188f1260632686e6763f56bfba7b000931fd3f2569a0591dc17a0bd935710f0de2df26806a870a56cfdb20f21f59cc4dcc43b0d406ffe9344eefacfd38320b2f85b358a83ec82efafced0443b386f829acbac45f09c50a8d3cf7639052fc6d2fbd2f1f134beb57f2b6301f8bb6d6cebe236b705625ade394bb1c3096d3379c39d6ee0458243499f5b58e17983446602cc83915b4c4aa70d20dbe7ee46becc348f11123d4ef40e9431faa06fae86db6fda755a21d927bba2ac5581539400cbb1ad35e800737a84fa30b3c01a7af87d812a3e40c6bff909cd913976710be3fbbcc78066bcd5a0f7676cc9f6e2fe216c7e006f792f30eec70146d772b53cd51600e89d6fcbcf1eae612f520576d21fb6e645b5ce114568a7ba7e5bf56d8dcc620735b067321b226af2f74cd567a9064a0715bd8fa1eca27225b388093cc94d44382bfeacf7a9d4dce97605464059df76fd820c2c45fe2e227098f8030cbe9b031823b4d9f92f5da420303101d44ae81cd54d29b5d8b65632a261af0596d0f4e682239d4cc61b4fce0ac1e10b04248114b33328e143011242b504701e132b07eec412b611c30fd4be0b1c44f4040a7763d7690a5bd2fe3dc86fe998b88e00f578fc866a27353978eb49285b84ecd4052a01cb05a8b431afbb96b0552bf883a0dc0de90082d149677400907c435173f1c3259c8282a723b469168256fc66a49af9eb9e382f01e87190a397dffe489a183f0d4a159fdaaa3647291889ddc6f85fe89122db4d99052dc46d9f93da056b108e078bed628bb67ecdc105b033561809dab1cd9b1fc43e80cb0e9a97691e55422f49fc3d45f00b3617a4cd1444178004cabd386806e7062735141460de143da7d5706b0a22dfd3f2b0621a71390f56e75b1150c85e1e94ad2d26adfdad076d64ffaf38cca842013bfd6dbe1bda740d63296ca9426e6ecb67ab455d2e43f220945ec932840cf1221a1606393c1a3916bc0b0ace42c71daa76c146bce95da374cdee20129e2f567ed6ef63089bd277e1085ad17c73cd9d5071a27adb160aea31739aa1fb4025cd1f4c2c999dfb4925d3976ce1b925003d6c02865031d9c30133a62fbfce0483dcb9148d560293d9ac961767a4fcb9bb1ac30ac939a7df4641f74bb79d6d1c624d74e0ccc897c600620039923b602a65c531f7a808d292e07a06fc94bab1c1b858fec5bb19ec66e05eb0be96eeb371443b6d81e8296c200d4ac643eced375850cc2a3df4379cb6ae0fecab7e2c10f1c2e17d0450031dd6470d7d6fe60ddc8c5289215a97a01914c21d5bb6c7707f1e127f1a1e502b9a85c40972d4fbf8313de387cc0d9b1ba1eee3c32136a51107e2629bee5360afb8e0295d71f21ba65bdfb9d7c61be8ee9b960f91a13db1b2074a65208133e6bc49ccb03fd0b0517b854900d84252beae139edec5e7e3869a5b2dd3a5d3252d01e1f49941bccdaa5d8ca350c7d6a228c6143d55b52186c0293a520dede898792eb7ec1939db7df759bc6f3efaad591def6395d1e6f0967ae67d49707def65c55aced1d3a2d7ddaea04fe11a8ce5ce46261017ff41f2329340b51a79450ade3df4adf8dfce93d716b7e340ea4fb36fca262b02b11c6eb2f9942e6f784b92f056cf9f7d4e26ad1c8d0545d7074cc1c789bc380fda2d17b27edc63c9a91237adaa16a702cce2d3bb36640ae3bce34f570e379f50e05b4276a6677654bc98c93888659b6174cb97fafc1141a56be9fc05e48e967d64b3bad5fa28d7a0790fd296eda72a42a45e99ffaeb250108d93ba059988f85db9ccb886de818aad874af6472013e33670fd54412a08dd09eae2f9ba60102d9ea29423961521ceb490a53b3393f1771e7638c85e5c5e54909099b174956a54cff3fa3ce2015f4e8407cd24c28b6b7d9fce7e862712c03a8c895763d0f1ff25868162d4d58bd92cde634e6138f219cc7da15af60e71bbca00afe0c5d754ad54796768aa5cbe18820b28c77404f7d8a3c155684081338fe14557b475c353a9de52ed99a7a8da0230e96d728491638bf0c4efbaf832c8e1b3b274c1b18333f9a4f2b73110e786ccfc3d58bbb12f0539eddc9da23939f8344f16821c3b0a65ae47997c965f3ff592851785e426b1858663b1ce007ea4be385ed299131d329907f0e37be417515d6add83fd80ad57e3036e5577aeacb34c516fd31604c56fec6ff879cd14d1037c5944f9fd7d9f05c165e99e9b07ca6104578b26483b520b92455c7c65cd7a37b07ca99f7ae0a416e25ab49ebf78773dfd2a1c1a45ff812097880427c151f988c86e0044487526b309c85f2eee4c8e82932dfda8c868adb7b40bbc1c23856328acf15e26e269274a16990df89a4f2e060889e3c0971878e47698cc2e965521b0cb7907f297fa6190122a71493fdeea5856451ea44cc2ddb5e7eb5be2cd3a8fa06aa159c3ba85cfe132c871e3055e3dcf5df809ffdf85f968c322584a8001283489c75bbadae07cf0d63da0bbafa1d9755a1eceeb0cfc98f5f62bbb2e8adc804fe073d7e8879a2f674cd69023224249d862d92ec3ef44c131a8dc66726c69fe848d82f36a551c366ee8054c32332839e71727949f898957e9bb73a3d5d2e36d518ce480be419551bcb8b254cb54fcea6582fb7835941806ab86d22ac1faf66220dd70ef92bc534086a8ef3df3b52ed1495981633d1c17796851bedd0b31af9b54077c08940135a2a2024ecaec1520c54e4da5a1df762721014587d0f281023323a423f32a1754893e05f99f3b0bb195236eb30070516848aac5a2441c973618ef0f995973a40900e3860975a5e12387b4b3b710da17468221d7d2082b79003059e74410d3f1198018069ccdfb19d81878ebe3126eed512a8611b00d4110f903c2650e0ec70c1a32d1a3b7b04c96a09bcb320c742e81dce3f0633cd9408314535d08df588d66b6f0e1f6e36fdd4eacee03cf88e434b86531ef94b181ff509cf14941adc024788aea43004b280627d218d2d883875c2cad77014c72f841649b6f34ddee22583c6146791bca2bf8c672f8894dd92076ab9fa2bcd82f3ef735cff1318f137ecbb5655dbee15960ca2751699bf5a98c53d16dde99a1c79c2d31ccf381a79c3e58e0d0cf875bcee3caf37945af3562b6d5dc3a1c97081c718c2e2f0bbb8e9cafa5491c237c5c92e47b4ee8f4a2516f772cab3077b5f07d6f7f208f349419090568830799c0871344800f2788001f4e10013e9c20027c384104c01f9c5f8ed9d0f6bfe8dd7f985274275cf4d6b045f6fee61ec6ec0f58158e514c0fdfca85f5d3cd2f33efa07f2ad9536d9620f31a456559fd52f2ee847e46797f6710dafc50e271de6e07b025efc6b011361bc90e38f7af36c554a939aacfcb519f8b8d5cf75e511ea9eef9748ed9f6fcb464073f65ec73a19e9db8954343cd1a6cdc34dd35cd9dff567abba442c6378b03e5ae98ece207785157e84c35301e3c1a3beffe0d68603e5c9a93bbceefd5e72cacef96d90a1237eb30bf2874bab55f32c0133bac0d4e2468cdcc6d26123af5da7a234dbb7f732d60d129b4e429b8914179fdfd489766c09fe5fffbc807e6cc053aca9d0b04cdcbf29e0a1f8b2bd1f3cd722b94db1d04c6e783b13987f0cfaf6393ae70d76d7f07b6575ae5ada48c7fcd89dd83757b2dd0d5a570d2aa60cec28afe71ffb66c2cd267ee1e8388c7fc4f83e43fc5e94614b75fcee3707299f7835ce7f27d87a3231b864e3a741f54de632c9bb034630325088a666d54f84564bea4251a200286fc74ea41c10f6cc7e7ddf134b79ad84e41e02b76c91a397f316e7b9253fdd87e84ca1d11d991cde5de7d41b5d3503343e279784862d8182ac6d86ee9676362850eb8089931a41bcab7a6ec4a4e39b7a3a76ca3db2722ae2ef1d4fecd696a0dada2c46b9deb2c6d55b4881a4db4e4f2cb71df697dc3233d401680583b9d56d9e63e7a07bb49008b2758bc93a4f94144ab1641dc0042d1384a3837fc6775deb248e26f24f192c3e31cd17005fac004f71d6d8969fb9540c5f2359a37063a1d53e44a29b8592042df4191893a5e65d38d13001f2670f042d7e75bc9c7fcf3f47026e3dbc07a492281c0472509be80f2efbb5d67928dd67e8e7255ff14f1dfe74dea8dbe7f67bfcd6e26aaa78c8225262701d7eb344d818647936e2896c4c6fc6ab38413ff39fab9a09c3dbadca0e0dd80b1f85b828ad1accfc8df95f5710a3e6968d60c60bf18a49a3173f426007cac40b079bceedfe64984cbdc048fefde1ebe7c5a9cc4c7eb2c5ebea7b3cff992c89ae74f880ffab6d59f3f6fd4427f5a19f7b4f3f925e2566d62ec24611e1441645b5a7d4070f5689c0b3e6276904cdfcc9a9e04971a9b785ddefe9763ac94a5521129da60dbbcd95ba2fbfafe4cc21096d7ef287793cfb30cbb8133ec6dca42b5d689d081ad0c32525754ae953f59821ef1994e689e43733ff72965d4a33ca16864e68dd68cf4428b88e6de89e885d84b964d23a2ea5af3ae1fe724a5516c29bfcb16c8629ee0b539e2ebcea63bfe9f9e29656251b14d71f1eead34ef2e912cd54ebd57d40767f72dd53422dd60f273e7750a63a7e367533d508d560084a92ac4540de6ca395a8527007bc41a20ab286b8ab70133f76fb7321872511ffcf66457a8e1ab298b4a99e1c0bfbfd3137eefdf698747d76673a0e1bfabcae3bde724edf188d939b0ff4639f42b48e972216b869b410da83b00dd66c606a95e9faa2d0181e40c2e38cace8c298b057a11b40ab18b2b08dd9c2142f7171b36f70c63d2194b2b53707e688df949ca025146c89a21dbde67eb0efb29f3140c6dedec074a465cac5cd32c375472dc3bb8445b9c1237f9cb20df79e5a8ddfde7d72cccae97396d3b933e2074df1c967f782b9d14a1fd9fa9ab46660f1ee231413ee1d3b2ddbcd97f93b2588807855d05ac7e6c4a93d1dc7bcbe6592d45b12216ed230408372d359e35f0ba2643b54e02365dec4a42dbd6de553be7c1da0d77c1fcd289c7ae098c85ad54134dde0f17985a2f4036ee9f4df5c88011d0ac91e365b35b1fd8152e4eec2fcfe9b18461f32bc364f3acddefaceccc2127a91c6691ebc36cfb93d0b4b8e8a9c432babba8b51a303eb6329db7c6387e84e97fa4dff01679d60cdc984d9350787f8394fb7e7378a2de53b4712200022af07ee926a613372c3ef75b1fb031f5711cc7f48c3319151ccd82d628a712532b16ec579ac61472077578831b119e8020eb64d613161a5b3c33ae7fcd8594573e8fa030cd263fd55cf3f584b96d268514abbb3cabe757366dfc89763f1315b306bf4905d7078d5be78c2aca51ee28646ff9e57238fdc0835811ee1b5c6121115a617cb1847e8c05a26a81b61e8b066a207048dd4ec330d294de090ad91617afc19a3c8666639f1b56fffc18f5dc6010f4b1bb36d21000d09859fe4a31e21bf42a5dcffad064bb974b0d1dab554cec361f1e40584c077000ea671b5c678807ed2970fb3ee084ffc9d4ceaad4db908f0b12a15b4c1a7b67ae0142e3917908502f9cdc7e8e8eaeff671b5381b0e0e9e8da7e49c98307d10cf0f2e11053c7edb024002e95ca83d2411063b7b510238f4a79187abfc2cb2e31c8bcf0a818a8835853017978775df9c8a6cbccb00b47034cd4d7d6b4d30d1a29853a1969b1fb73afa4d6555ea42aaa30369c9f1074d0123ed3e23339fbca29de0de03aac51192d32a99cb0e64eedeb1e93b0f65f2737937a5e228eeddbbacbd45f35ffcc521994d7a46cee598f0cc3757af401c523a59ebc773cd07eb406d25ae1534ed87086b67060b2594cdd76429709b79cd7c0312b21dc625f311b9f918e566321915e2b8699c13a067a31c5f51b06289225d1c0964cdb7c5700b7dd0cdd6396ed76f330749e64321493205594a05de200933b6e51dc8e5a3342e5ab819318bd9fb5e6bd7a20550541ec447967862a45b16e9e2a295ea041745690e01c9a191031201a72fa5462cc2159adec621aa57f42ee3f5525c0eaf70d8e68d72628ceaf38c7e1aa548ce210cf5f0891a915ceb1e832db5ed6415184aa401871c3ccddefd07d853a3eac53885ffd186509c87e542a789504e4903ff155d5c8693ad10e7dc46170be09cc40f94ef33d4794498c546b307ad31e87d26a5e213582d034af8ce42d993cfc444eca6741ed5ffff1e83a749881894b72160331c46281ab80be07b4199308db2efe60c51e48d1a1c245d591795e2ac364d7e996b91294354ba9c791194ccfdcfd8abb95416f4a7cb89c4bb942c8656f3c9b20ee06b17c184159024e487f1eb4eb83b7f250f681952c9cae9f100ff495c72ecbd6a8059843e8f756918ebefe14ecf9a6fb6122056798fb52018f2751b3eb1a065cdf26f1ec562599cedc334592523b3a07aa41943b7fd9da35f40d2a31cde5cb9c1767cdffe983fe86378ac4808f0db927e7e3858c852d98487fc6822194aa70f7d05a5767bb42adf9e33df192b66df5ecd14267275fe15bb31d493ae51f3af6c508e89da03a1c10c72ca2dbfc7386717ef7ad5fb6d964f93f79896c47aa99004f0c1a1f407e40efd2aa145aa1e3d4774cd3d24fc3f4df55f9fdb5c89ec09b4182c8cf3081b304974f4170654ebcb8b26dafd6a36766c8f7a0db4ab662bbf89a4885a1dc12bc50de465d46c59acf54be84623ba45926392a7f7e773a995ec4ad024a6de64972939622c970e4982f1f70efb2484754f0c64be2ee6bfe3660973e656273c4467decef663749dc972984ba7d359ab93c83fa5d228388b269228ebfe5c0c1f7d0280119a57e53e1fcebd58c28bdee553a07b6beaeb2aaba3c3ed4decd0d11c7d85879c53f97aa9b7914284907ec986ae3e4ef9c748c912f2b492b59aed346242e68bb89ffcd345b469a0ab5e88e94711211bd0d25e6fe8263c144efd43105763a5fc566ef7b4f52aaa2207abf609ae8e233ab383966f0aa7de5a44cb32ff6ac5488069ace8a0fce854bb8372240b74d2cd66b8e5c2c143002156c016a2b8580b171a3981d7246663fab4a755341477e0ce1061fb0be78369364dc3ae966adff7d4d170439e53ff1cc069da501cbc64f05668ae163430b70bd23dfe24ce790d0c0694c98300ebd5aad5c0d25d4d5ba4f639b1246303a2b41d7d8fcfad9200c3b98d6d22a941aaed8f48871e195b83d91399f430ccfe5b40e680c2462345288dda78830d0f9212b3c0c1f18235f0127b2150cf97089eb7c0f22658b90fcdf163212bc07f74a13ad7617655f0c306866f80513901960ef64c904747936258d6995c1631284247296a92b659dece2b0ee6a7ed272ac5b8acd793d630c4ec6f0fd74e6eedc0a988db3e691554515b7258e45e9d87966e49caca146eb7b1afd9030d0281035531b70e3f370f2d1efdd436edf19de24fcee10e995f65b176a1ce83cea3155bcb5871fc9ffe1fd95444d580eb4aa9c0ea8c1e441f11623dec104cf88f01ed14eb4e16da7e3302cabedff126bf531b921efb3cd1583dfa6bff6cf0310b568fd8ab39661440085d643259b524d0c6fb8464635cfc5b605b9b8757ac478eec58db37c76b8f0d533975fd86c0f2c560ade2589244fc1c789e0b6c041deab2f9bffef57c17d3fbe5643db704e4440ba3cbf164f3ef573ac437fdb625fbaa889301d718443ab4a516151567c225a1dfa6c45db5ecb237916f8385bce11a553655db88545c5c448a08b72489265416ca8e721ffec7fbcfd3ff76780855758ab3657970ec60bd67fc976fe081387b164eb483bbaf5359a566464aa8bc2fe88c76aa05736cbff78c8e93f8dd82741ac1b825673750514993c59f552774c92a272176f7d9449b86f857835bcea2f5280deed4188649946b676770f13b8df3b8b59eb8e5ce2bf8fddf143d2613ddf71647f8c83cfe5d04ea3885e51b0906b0ed35cf2c663fc4acc138ff305baf40c09797c1fa29d1756f02f239a1c75e983a860e860d279eda5b190f469660b39caa74e43a484e2230e598135e3ebca8f136c0534ceecbebd9c4e075537ed12a18c54e5aeed28a6f7b882ad6aea2eef470351aa5a2ab832dda4f37a4146e46c7c4ada14e57165d67994b57969f53caf0ef135673a5ddcb295103cd5368a67b99d7985d32303fbc0342ebc5d24ad9ba04261c8b2500de496b2efaf1f632de1cd35248f0d0f05d23d5634632b0021f9a9a3f7ffdfeecbc5caac11cc2b0c2ce11c13701a87542aa523047abfaab5cdbca046feaf381575aa9507c9ab20430947f598b44d8b7c30abb6d4598ca34893c70ca5139b23ecd25465e2428b99e2df28e82f732ef37e58951727684bfbf6f767d297c322317e43f49f44aa9fa5aec32c362db41e538ea061553b39e8288025b8f1d2954460f13df9529e9ce7e9a9c40ae705e532b996022b857cf04ca906a857a92736d3d41b751390124ba31970218aa7a57dbb40cb371560a816501247a9837890de38a0aec480c20cd1189730962f126b38e26de117b8f89f2bde8ec44d01e9fdc587842152987bbf2fcb4abc4c98bedca82b82e86947291653678c949243764664a5bbff8bf221437914fc490d71606ff547c2ad590c81c2fe13d9ba8e20d71479ec91d134a4d884f332e8e98f96e7731992816a52429242e198cfee37d5bf97ec307f061fdd5e91685b31e0ce906a3a406f88928448010911dddcf66ccccc2860c4174805baa0994a341d922540e07d4e114ef322e1e79fdee8be3d63e6f716eceaa0bb68091ca5b999ce15a7e6faf913c2a8761069e921b7f50368c54f5847995c940a35219a12822ad76e908b65525a443e74f58d6330e6db2106f12aa145656852fe86d0646a3ad652cd186bef183ba87be28b47a82f4ce0eb95f31bd083098510127bb8d67d98ad00532d106a27c1779e1325635268ca425e181f9975ec710fc55024d89f0a97716260c76db227834337326a8267b58a8b8378a41efb9ef6773e7020e2538e756edf547bd21777727b6538eb72fc61d4ca0cb1a45b67e2e6fd17031abc23764ca80f5dfcd44419e5a489be7e315379144865f315361763f4d1190329e33115a47eea78ae40cf9744ecf72fdf116d6c196dc4d17cd964606d2a73f14fc3805f9ac37ef60588212a7ea6dacf650e4c9da5cb125a39b4da2a277b55f3065d65e1d0f69e4c4dae5076566924cd9daac20ec1f679e435aa861c68c7856d606f085d43110cfc03caebabc0a99ef09df0b102f01b260214315f794a2e81462c988e6eef20e389dfc6152598df0a1520a0a44ad8ef9742770cf10ccc32833100dc5478fd805edc00991a1feca0280a2a0501b973f44ee8af23ca7751e17a8a3dc055d5e1c7987ccc1d692feb6787b5bacdec01b07e4930b23e1e8b0a23241dab05126ee1de641831b4cc73ac86d2404f37809762e26f1ebe4aa8cee95695f7d2910d60c6a6d57afa3d9551df082b5d880bfaa7e2d162fb229c4813dd88ff353ccc403e66a03ab680f2119e85f1f2587cbb4f84eded450163de53fda4dbd167e94f9c50d937904b1b116a1038a48e9aa40132f38f04f262e0186470139668d134670f3e772c14d47d6512a081a6ba4045dca30434bce49fa911adb65eee80d0207eeed8643d6e9a6901b26d2607cea703ce7a04d65b2cda7f02590a82d2f738532174e752d6e502dbdd19f3582372414a992301d9be534857c2fe1638ebee389e0588be45caeda77a1f155ff3c41acedf6bd24d3c3fcd3f11c49ce0b9a7951311ef035e23e75c93bad422194e2913dfdba112c752ffab5d19ecf52bfefda8635495b501d6c48f3487f96a5169a19bfbfac390cc4ff89426d0830ff1fb4940a40f477ae8e6cade1c4b6e2ddbc61c8a147625f91bb61effe673e3d695f6e9fe1b74d6a0691c9de37bb0a7c77f7c3148757ba4b2340f8c3aaa4c69372f4dfa41246096af09c7bcaf03607fe01f16fe64790d07bb36b6a12248e5d6c69b513060d674c8cbe364a1fdcdcd1ad4ec8c3b7043c2396f1cc9b07d3ea2f56219f53fcf25a25fdfad7379e83dedd9ef5cacbe507c9b60d6413c27b4da6087ad3bba887daf6f1a32aa9f99fa5ee712894ce1d3fc4fd53d4a03595990d80160334a7fe31efbf34d9fb31e164e4ae98609149659713bc69a470e468a9b80071c6ef1d3c032ebe3fb767e4fa9a0dda18e88cc39df22111a9bdeb3429ecc989d38b2403b3bd87bd664c65bbb918c0ee799275dc47d52b0977f1a98ea480da39f8125c59288298f077d85cf1bd388a13f08aba4ca274d6e7ce52c07d8ea19f22358040aa3eb1eea30e9a1b817e9fb8c48ab875d6a267ce14085f6741709fa071d364b4c050a0f453eb5c0a9d13f20ae84a946ef00c2ff2d61087d24eede046644dfd52641272f04f67eb7b537a9f44b4e6d1d12ca643270119c317f2533e16b2a88584575c8b16052c688fac39b4793304ffddd5cc0e6e4a4bf2d39c593b0240bf762e5caf2a0363a84a8c99c92426084ad58e4f7c2040f8a863de8061e5776d7bec9a0807ab376374f41071eb9be6663ce4c56d0a261702488323bf2345604bcc22f186ba8613e193a82c14bd9eaf6ec1ce7b7237362fc0200b681e7c9ca39c3926fc78d6078408893fc5a79f4c7884bf7b656e021594d160a03f367d739679502dc31d40bd7f0f5986cb2ebef98a44f3d7b7f4d4f72180d74f6955215ae64a6e5cc9bfadad0385442af7d43059d9845df6775125061e7f389c64c700e40f2ce7b69fab84548a23af652f3febb04c6c756b2eed857c6bdf2c88b057ecf12e76e8398f32043a9df2c770e33ee67ca4d6424b1cb6874baf22fc8f12659a6f6b673b38b190311cf9b8931d7fcb44feb124493100daeb9ee6bb95c6637b1e89236ed77d411785753cca35af8f6ecd6d897ceefb24538194640c8bc0b8b2e81dc579f4d73d8f44fdcfbdb3f32ad2cc96119b58719e397ca01f3b0dbbeb609daea5bfe70e0ddf1bcf9e3f8589470a3c2b1e36bda5bc7130ab772d578b0a61e411790d0f5ac873448e77621ddbfef2b159feea9100c7450b8b960746f97ec5b94846655d46139558887dafea151ddfe88a3459df176ada64ed84a2bbab8c4e39786d25ffbcac62b2f2bb1f78f9befb5a3f445b8f29e9e8dceecacf6b96bc7161a9af486bad90922f923c49df37e8aa91870643b672070a75c4572e98a307438570d2422b941a54dd3e6cd5ef96be208697bb583281212f9c31a2d3bf011829c238960d3b0d98eb0240112e6db94d64bb0573ac2afa073be535f98b97cb8c7f617fbc572ef935cc3f9feedaa31ad031c18b412eed4460c1f38402c298f233d74217a379413f79536af83ae986934e5033ea11a20df1bb64c8a41ae51cfdbfba54c4acf34256acbade270a51e05e5930b17f8035f822083fe0744a8199c3bffe01c250a6628edf74cb3744ed63ba96d60a35afbf2124a5904fa1a6042f9bddf15a9e77698d6a30e14b645a41fcc2257b82f2e67b6eee1c2c0f48e02f82224fa1dcbd10a225100f9a0b2a8b844d7ed19744c45b4b3df1985dba43b2ba23e9f28f4f52913dfc4fd65834a50ad56ccca8462902a0845918b2e0f5d256838d74a3c0964a271f64ae1998ccea5bc906305a4ae276ec6488f4cc3f6848a70622a04b7d50c6656e5ca695bd99cb496200b016a938ebe0ccc9097a0d39f46f41259b0d61496e07bbcecabae5b4faed6b370fd974c1e6bafaa9add664a42367ddc07c05493912bb7eefa42ad73e208d75ecb0909efc779bab99ff61c5d9d8f65154d868efee81048b9a1fc26ecd94d54f2c172e04abc362bcdea7115fb1e6c4eea8258d68f2525ca0f5264d092097a44d43d73732a96779bc5b529e89dae383ee9a5575c33af3c4499eb13b0439ca0ed501ef5806e0fd6ca8642792be4ee5052ea66fc8842cc093984bd957c4bc359d68c486e090ba9c65c06268823a152025787ec03e554701e606da482330a68cf3a14e7870d0ed416241a24c35d2dc752ede14268792e0128d885c9fd1a9c79da46dc36b6f2845bf92c86156f845559913035c94230c35f5895d8e68e5c38ddeda5b819bb1cca586315f0e5845de52c7a24d4c4b179a3df94af2b95e28ad75dc16a2b539110c2744e6f069bc26183a11e87889b73009658def8e2fc88e3d49cc8106c244b5b7f9621da7cc90d45060dda8fe6149e92136616aa52bcf46bf704ee66292b134f7df068fcc060ec27fdd43cafe481c11051d83c172af838c316c2b0471ce2728d56ed3bb4dbe1b3598b62326e7a44c61350c47167f8de78691ea48d920baa85b8d523fae6648e451c3f8c57c2ad7df1b50e0a573063df06cba6ac3fea8c6020ec3eab0865b84f1a7ac1c4126258edae0e8095bb8d8895216ed72b67924658d502fd9941205db5202d36fba86365b289e9501fec182eb8311151df57bb6dd7dbe48d7487b0e26a888a0ddede09d9d6e444b8e80e63569e9a8bb150332219dfb3c454128adeb30198dbc5342d87a420ed22376678639179187271b713d69238b2ea1bf7366cebfbbab0e60d36df71f997f3fa7d608d68b62b1ffe4350e82bffcc7fa20c2cc2ac51da2b9fd67c9fac2be410eb390e1ea959ce6c627763ae73fbe7a343dec327b9699151dd91c6f14613fec5b920c15e3440238c067c60a85b31addb419201e129e6bfe9e1e77a46dcdd15a02f198eeed70719296a31b31c71a79e22bcb7eb38cff7ea4c4d929d5c22d16f1e2cc35eef91323ba0572d1a90c76326b824573f34a0de3bd5b3824e766d829459e202a49a49f8607afa93e05f1be3fd9f25a3c81a325d5287ecb163a2036ec53a60587cd671a8fe843d9e97c18951a4a6112fd2b0229848f07a0e25c2f66e4982e7773a0f110f2d0f0696ba132b35b5e5b4c42c105473578184646a4ee80e74f75823ae9f593b71e99d24f53c6420929555568a8d96cbc6c058e3c15f3b2352790866be0b5cfc61ba726d06e1f3197b3cf9298e971059711863fb03e22284df429014201216bbf08b52b2e817d4073fef47a58e4b2110467ee42518cefe6c9c3236fa31c207647908f215935e67947dc85b6df2f1576860517e3562edcad932b54abd482af1d49fe729be5392e3950d254ec358e7399e593796864def49da1d15d02955f962d5acc21211c9c827e34c3593f6069355dad54a65e40a2e88455ec70c52869aabdf105d873c1a164e1caf3012a2e0a319748b67626269fb7d8cc3faf23c998998ec2d99f2726a3ccb5237cc24abcfab959230e2de91291c5d9b4712d12c88d7127e2abbc2b406c76930096cff81af83b8a373dd8064975ce570ccc0ad1e92345d80106ffea4d0c7337a7936b074a73dde62fb4c87d03cb3e475d516d4aee6fc606a735e18b9c2b4a9e8593d9edc2449de4162a643b5a756da7a152589d2f4899e45fcae532ad26c7fc3ece1bbba4e7de3a9803d849fcb1658b6acd16b497fdc8e4cd5de3cf52c3a9e2af90dd2b959fe8fcef97a27c87b8a2829359b7919c2b1e7ee4900436a1c5e074da9ebe45241d5b1a7f49b8f254eb25bd5761ca2fa3675efa5e5fb76a6bd09b41e20b0f89be55b016a14380092eefc136a90c6e4c21c7409f00a47b82885ff40ca10e97e446dd47c005e0f1092fc9d79d1e3494dd1fe279b455b6ffd14934673dd00c0f3d4466130478cc5c81e163d274f508f4a1dc15d87415429258d10be8bd1d0583c07344ecf19c08ad8123d0dd0cd0ddf3f71426ef07bcc2e7bbf9e6bc43f5453ee168aa04dda523a8727d3bf88e66a191f95da66defcc40bd8773b17773a874bf927cdb33784c935ccd1a686cb0ec6aa6e9cc1dd539e4336fee89fe94dc4eb90c38d8318bd8533a8400e04e7736ebe6704f83f2a078e2d48fe0ff1f2114a46917cfae7f2220d4c74742475671ae18c43890e4261898bbaa02933e79fcad97ae7505a1d926586d00c1e0fe0239716fff32092dd99a43dd5ce0482040fb7b8e437d8a6e2e5d80c1d9ca7481547fd63253d00bb780d07855e72fb5826826746222170ac4c3c5674f14e031e56cc7d533bcc3dcedfb88d3a6dd37e6fc46e1e6575ba9f0a431112fdbc5e2ed7c6c4cb93b6fcc48fc6071e080c5e34df202d2f28822efea738c01551fada03d1c993d7a6dea9f93030a7da4a794aa1656d8094be99c3c5a31bbf624bd525fd170e85fdd798cb95d64fd5e16ae74996189b26bbe0460bf245fea955f16f101d717956a8211c2481b1612bf4fdb9f7427614218f3dd03a5d77d1fa70baa58c6e0b9fdc3894fec386fbf6ad973cc32179158616b4135bdcb8255a814a7a861175eeb1a9de3a026cda78f8aa7c1722e12c441b5c335684b5dce9223156cbbc71953a32681eda7312b811869011aaf802a75130ae331df7c1a2a97215976f8298c0c3c0c46c3279dde10fbffad1215f0bd71af41f491a5988f6d76923b8680e4f413124f9b1c1bf78085e40672fd45ccd7a6561a7ae1650c56d3593b8ceace4f5f8d1d410f1a9c6c08460dc308f893e778d59be9760cc908bff33aaa807fb43cae52d63d6098044be75c665e47e4088bdb56656e442ac5465b359c2356436880cf9bb10101ec4dc51619013adde01ba4763883450b0a49003f3ffffffffffffffffffbd5b56fdff8770832d444ad0fe7fdf87cecccc94cbc19d1ab881510000000020b6d6da64f451085c087a08b95fa6fc9d41a8d99599a79b33e68b20b6143f212de678a9b80e3a0241e9dc7a4e6838595d401464f234c79f4cf1fd0fc9276586e7123595ecfba138212cbc6649e944b741471fda64ad31f4464f4249f3a18f5933c60f9ff3beb907f63596a71ce7c4f34b0f6cbc5f5a959744678bd09107ca5d3573ea582133eac0837a51e6579e2449cef5183aee80e96f7cfbcb9e543c23222264fc18af800e3be87bd2992425130b4b9ad151077dc3b727d13b74ac8a0e9d5bc84c6bd95573df3187520a0fd50de39f33d421073c955f9818a43c961e07452bdbdc52060ecfa7cce932b386d4f90dc99fd44e3a2d6e70a91437101a69371555d626a60d6a775af093e2075531061d6cc845364f356b4305690d8db977a6ec93839fac1a4e626d27cb2afa9a7d1a94ba98e32649c3a524a2a13dd1f82afbce906a0e9a5df7a4986f723acc7090ec24ff9ce886d03aca50cc54572b0b1d9db21d6450aafdfa63c5c62057c718b63c96623aeff3f325066faca257bc4f493bf7a0230cfb47cb6b673972410603a6335a29aa65c68c1ba1e30b9d94be498c91d9734c5ef0cdc369fad02587eebad0c7b614271de692965cb834455f4bf246ef0b6fe14b0dd3b9be374387166e7993e44bce5bd091056be464cdcfd9cb4aaa030b6cc9ab4a9ca8e1044dc7154e62ec7f4c265983e71d56f0e42de14e2c530361e4e03b3062a33510802d745421938b0a96f44ffa930e2ab8a2bf6d35d561af18e6131a677c8d334cc7148c0cdb8e7e62b472930e291473793ad7dc7f231f143aa2909c54b2b2f1ab63eb8042d973578a444f06b99e70ea253dbd54992c7b3a9cd06ca610e9edcd7cbda309a7b7d6ec6f98a9e990d16f444448d0c1042546335b87ef8a62e958821aa35729ae6c8c717728e1a924d65df2e6fc737624a1fe8ed9bcbf63786c1d4828575c357379d09c3c51e838c21a5b41f4a3fc3f5a2c74186197f6f43bd73abdf4081d45e062c6b2f58caf496b27741081298fe32745ff303bc2a16308dc9410fb66f6c935a6840e21bcfdf91a7b9257399a01303000c605c0b0001815008302604c400130e80802a76977528a960e2058d13296e73771a337bfe8fbe47acf9d5c4c0cfaa21cdae6672ab580a3178b5df4978eb1bb2be3e04575579b264613e6627c17c5d8a45d255aaf9ca42e6c31fd30b569a466930b3c3b5a3871556fe36402072e7c4b935db54a9cc0718bc33a436c9262cedac601872dfc4cb7b897f43efee4038e5a70ef25e9a614ef5427b4c892a68f1db4cea57c2d70cce2fbae8fb99294e4cce00d0e593c51315a6c4de5eb6d061cb1b8e2c9a925f387493761e1645cfebb09c72bf46457d94aad5103e38ad2735aec708d12ba1bc901472b28eb29f91c72c3a5450c3268989170b0220d25e694f3f33568dc8000042800c604c2b8517ec0b10a2c5f9b770c8f631171a8e24cd7274e5f7dbc0a071ca9a03fc4d875f77f8911072aca1226e694ca633aa1720aab4326fdfa8d297f70071ca6a873cd7665553c0f9b1c709402cb5c62a6b875ab511ae120c51eb26e3a45aebde475c0318a3c63cea51b63172d15051fb442be854d3e65c2110a63493145ccefdb3bc6010afca4d113a34f3ad1300e3e29230b1c9f683dbadfc74c580f3d0f383c61c5c9713a79ee6ba9130936917bf93cebcf8713a71863e5bd93dc44bac943f3d2e33d2e9a783647d924a7d51245ce843ef5c9a492ed9844c5c49e7939e6905d97cfbb84fa292f69eada67fa705862f16e8f93b3c4764da9845762f5713473f05051e20d277bae7c38dfbf580d46c03109c37e534e71242f278b248ec14b5ba39364be2712cdba54e88ef1f0f80cfa060f3820b17ababce9fb7ef3da237af98b2be6edd79a3b42934c4286d7d41dd3a711e670927c5be173e379463419b296f745db37bf88a2437b58cd923ba744116f7caaecedbde12a9588a3d2e66e265a320922a2b6a8dd376163cc6139c431e794bf3ed77c9a4a3144b31adee2f474d46cf21c85b0c409f39fbace924c08915ed68a76b2e5133bb4038e41acc15b3cee09759b2782305656d44ace1d4d9c0361e6f4ce75e241da5340283627adafc5dcf8f94321530abb8cfd90ac5f5227cf664655fa905e124e8a93beabbaf960fe923537b5f764ce1eda4f9653ceaf269660e9611d950a2626c5886cf3c066138b19c2e366af38f05059107d1337af70d61d923a6ed292b0d901c9fb0c52519d3374eac05698a99e4bef490d5070d0618bb16f3e5a7e8dcfcce10b77c9d35d2a07b6e4c92488a59057171868e08883c9d5645bd56cd99385c325e529a6cc29379f7d8339bac73bb63ea624dd90d4a355d3f1a477c336645a267ad8f53831772309071b98b698530608ca8001c71a4a6ba2ae1f9dbbc4510dc456f2749529e652c491065bb39d244d7e23227e080e34f425e7e7ae25d9fec071865ae33003ad7194c193442e736bd413ff1a7090a1d964e2ce9a94a42439c680cd66b72bcfc9f76f0e31d46fbee92ea7ab54e408c3c9b249c1cfcb247080810c2f7b9673f162b638be907ec969e27ec9b87a461cc0e10576237457a7fc332ae0e882714bbc24b35a0a38b8708d7c5f957082cb47cfb185533383430ba9d6028e2c9c15b452fcee88d53b2222c281856b83758ca9223774d82be0b882d6f1e43317bb4b1a0e2b605a1512ad563e4ceac69d1cc60d9a040168030715ead7af8fbf6d1f56714c018d52498ecb123fdd81400c38a460cef9dcc1a460beb9430247149abace2586bcb44a2714f0cbbfa9b59aff5de478427a67ed196fd72d7d0a87136ad32a133f69b89e3047134ad98d1afab93dd2e0399890b8a2172e544c3b8b8f9cd1356e20227246d748411826e05842b6a13f6b4a48bff33894805db624e6f877b09b23099d7815cf54450e249455f1d1b19bc494e58888c81964d40841b2010d701ca197924bac67c734741c4668a62bef4d10b924ee45e8d267b71ce3d4e59939024238cd736b38d138e90c4299329b89339a7cdff20f2068be6ba1699526a30263c4466b60021ebfa8d37d9fbadb9bbce60b53e85a5cc9af49776378f4a253bdb7123635d5056fe0c18b66ece39f96490d3c7671b9d65c67738b1aed1c78e8c237b9644be3fb33969582472ed238a5b19673e6c75286072ebc926c2c6d9ccee2fe2dcc9692e789f789b9d5168b9f9826887a74ebce0e3c6a618a4f9a3a26d195b3d0c27c36b329c518ee7b99055b62961a2fe12b798e872c985c37135f57f7658ac5219ba41df5dc9d656c82072c4cd27ab66dfdacee9a577059db4ecedf5d79aa2078b8e2d416a44b125a2c45b115c54e93e2d3523789c92778b04273cf9331df3ff058c57d31469d4bd32b5951c55297379359a63df62d78a422ff2ee9cd3749674950b19f209a935e97776b1ea7c83d938955b91e6e2f5318f39db01ecbc2aac44a8156a8d4174ada8314f6aaca57a897a6d8f11845b211dabbe525a99f1ea238639f18f386d0b03423c12314ce7895d0b153eb78d2031455d6c87ffde613afc7aeccfe1572137b78a2b2cb6c6225ef2ed33a91cde6c5934c8c3db33961a66bab9accfc269ec726caf7143bbbc4c81c4d4d3c9ea4366ef82d396399e82b5dc9ae9d39c3a731a1e76b3d13d4eb347415785c624bf1e50493ba24bb6b89632e493b764c5ece984a58e91e9b438bef47ee41896d42a2ccbb2f5e8a4f62cd50af39caa204ef482261e73d5bc674b72113892ae577934e8cffbd1448dcbfef9937919bae7b44a75252a65f9ef0e97284bed27541356c574e7a34e28d5e5ea33571fa3f23f0bcbaaab9f3788aba7b2c02cbc1840f53cf4311dc546bc5b9ee91087f5ae2d3e6af75571141fda5c95f512dc68a52e07188dae424e8b5897c3addc31067cf8a9b4df84f150b781422ef98a3497f26a6aa4c08536c596ac87862f5c92012635cdc9568a779b5204ee72721e2a9ecc2e738f0088497e2965dea71ae7540f8f139d6a418268f3f24229fa4d7c2927cd248063cfc5045b5e0f37f6dd1317d2849f28987c9101f0af52674ea16b5f5128f3d7c27678e692c86d718d4c353a3b5169fa5bd4e8f3c249aed27b92b75fb969ce0468f8101119132fec68d1ee3d4f0c0836b72cea112357982642307df81323ceee08ecc59b84971a2353b78d943594ec916c38f75385708bd12336cf23c232222367e8ca40c0b28c1830e4ea5249e6ebadd9fcb1c4a31e5927831c9e391cac1fd641557262bfb661c7673994f392599af824352db7cb63f4b2f197c439d9d73528b2ae7b9e28647ea524eae2fa13ddf06c5d3c79453528c9c341bdee8df2badaef6d2c0630d27dfcd9f767552e7a941d3312909955e1afc6c275571a4eb4a424392187d5e36be33647d498cfbea1537ff13339843744af9728e7a97191111b141c3cb10a30c9fe87a1e25a78cf4c95086b8d70b9ba26f163dc680ee8f6b3e49deed8cdb10839a626c69f88a7f3615333cc2f0ed7e499eb6f300033eda3b56766a52d71e5f389aa855d9564ba8288f8894c0c30b09677d557a7a74a130d97c96c2ebfc9f2af0e04249628f2dfc39e4baa57831dec90e786821cfbb2c666379642129bf7c478ba515ab49820716b60e2725e14a242aaf572836d73acef2e8e7663dacd0a695209627a7517b150e1fd38f5992a9606713c39a9f78ec7b32f098029dc3a373ca165ae54a81aaabd37892690ad545e1ef3ca5312d55a84f43e1ac6c255e79b856bd4fd8d7466cd4a33ad3ede184dc6be34cc6b4c5e767e0d184763baf2473fcd6916ce0c18454b6cd2c622c87d3630956dfd5bccaa7890f47ca00c34309c6bdfbcda3191e49d03e36e531cb4d1a9e4186181e4870ec5bcaf2342cb34c81c711d6aad614b47264c7d00f3c8c70f6aebeceb28e16a14711ac8becfa2031b1a577c08308cae6701b4fded94fa9118f21a0ad31c7b23dae93030f21f8de6252fa9c9b728af108c2b993c57c5b3629d7914044c46b58c00308a5b39213836e6eaec68f31469bd1f18b4acaf0a43945e5421dbeb852a512fbcb2ffc676fd4e003dad18be3a3f46d8d8617977d4aad50a9a4b4cb2e8aa3ee2932fd06f14c176cbcbce1d51596d50bc02d3a72a16b6735f13f870e968f8888dca00317c538979ae544c91063c446036cb0831d68a0e3166619abac3c42804692b48808046e88d1354cf08b0e5b909bd2fd5d3332848e5af862495cc5757a4a41072d6ead246bcc9a13aea959147387193fb1b54cf111111132be041db248ec8eb2124fd74c93a02316b7798a9fce5fd3f968023034108609c0c0400742d0018bdd040d954f88efba348d327ee4068d0f74bc22f7d8e9a135633acf97e18ac4d01f53572be5143b15e86885b9fc843d317cf9f437837f1b1ae860c5a3ba163495a7cf33780fbc18354cb0828e55e8a925a215b3fbb8a78a74e2642a54cca28300197f6303222210c841d7a831810984114652c60d3a5261b418472a4474ec319a060c3a5091e707d5fdfe924a2ea151c30c1a376809749c42af2b0fc976d3ea0c051da650c2ece2bc7df60c33ce28e3041da52806abac7997d92de66df41834ce30a3060a40d0820e5250c2d4daf625f5d3cc0331e81805b22e57ae5e296a567dd0218ae3ed0885f1768082783b3e51783b3c91bbd9d189528eaf29d2a2b46309278caf9cbaacaeaf6cd944f5e995c435b54f5a13478dd976f499681265429397acec132ad7fb9828be74a2636577ae7889c44bb5b72331f73359a2f36092f8ee5c893bdde5c50cfaddf55282f5d4304b4b73f7c1495017e64c2a75558b9524fc0d729e3f998612bb487c7942a7b87976163c90f8f7626e93bcec275a1e41ea45137373faef891d716957de9bc86cd1248dc8db4275d474e1e432462426e589b7d86f62d28bd0bcfae52a4bd48a1f45acd3f1b695622fd224114dac6ecefa14e5c4b90311a6cf1233b7d253cfc921fe0cba31eaa456551243b0e9eef79aecbff34921ce90cb22e351b644b183105abc967cbad7f5bcb68670ec3b646c75e8901782f64daf41da4af09411a294713c2c3a675fb44106d1da87c9b953ee63ae111aaf03316c900122085736deca49fa927d8f8004223926979e186df3a402a2c850f2279352b89de41ff28b8c572eba4983ed07b4b65297897d1f4889f9c049bc874c623d6c12e7a18d4f41cdc35d56fb232200c1c3e952dd6ac6b6545c41ee8009561b346a3b06103b20fb1d2e7e8afdfb3175e022daf3644ad1ba3f74a866dd4e3cb2937b2073d0625ab64fb10391c3639ff9a4b3ec92aa8ac32775b62710461962f448054444c6008183b3a2e7a637d112276fe8b5dcf7b5e3c9395940dc9018db2a899bd939a7491b1e17bb960e9ab7cb076183a749eef4d81b9632a606c81aa8cdd59ca4a827859e80a8a1994f926c6ac64a1f4b43b27ac7f0615e3ca95a021034945a2c5692b6cc5f1f12809c813fb104d7d5be8be903628664b9301e5a2f4c4c0840ca608cf1e32759a5d28da605206470c5243a57d6f537f5460d3ea0029031747fc9b266b014a6f34fcc000188184ae1a12759920609439f4eda8f93df0440c0705ab63329c224f1c232422329a3c7681a65d400f982a1f5dd2cacc4a42919a9212202817731c628010840bcf058c4549a1e9fdde488880804c048034817b44d2776b835cd9b0f170cbae69ab72471ddf35b38f4eaecbea66841f110a7396747959759504ff0b7247b070bf5dd09db1f07b942add93b3d25a13a6c6a8547be2fc9d6651592adf533fa784e9ea2c2d9c47896e1bb26c617640a49b90d009182df277796b079a2590b128543738957e6c550fb0181427272b865b089c84d02f28472bf2671a7774caae384728ebfcde871f2c705d2844d3013b3987cdfe14e1026949dd369964ce6f9264bf0fd4c4c255adde5bf94f0a6fa67099ea6634e20494836d13f4bfaae66bdf8000409c87de64a82b4204740adad14801881b316a4089bb52044d0ac6dc00b408690590b03102194d68204e1a9ede4a104ffe4bd830061958e13194c94cede7e91663f2948dbef8bc2a36a0015a3ea648d9116638a7de0a317c634a6b3a7b932c9072fba8aabf4e1bd3eda3618c30c1b5f83022af8d805bab71ba7a5f772525dd09dfb1f3d76fe86fe23172531a624327d6c13c31111111a5d63e40317ed46d7eec5ac87746fe1962473c9c3faa61a66d0a8c0872dd0b308b58fb615aa05f93edd2dedbac9f31fb4386ed9a7c7ec708dd1c72cd8fe4bd1c4c897b5d8882ca8bd287faf8b00031fb13036964ddba59ff5cb2766f873e003168f478da917322f317dbc629317ddbcae69e0c315e6e66af1e89d5660314f3ea664a1b6555658d99b2a4929df7fa7463e56616d4e497ce4f2758c091faad04b6af5a0e9c6e492f3918abcfa7aa72f273c85668cdca8c104c018b1d11af84085796de22ef6272bb9fe8f5318f6c4503fe39be2d43526663d61d5522f05efdfff919fd3a4ad5bf0410a734a7a97aa7ef1931d057f312fcc66541406b3923e5fe593a45086e2fb8c972eb398850a41717e13c346b91cef84ec13df6c9e8952d2577bc813bd98c64d6b279b707527aede7c82775bbceb55051f9c4032a7d0953973aefd37a125bbc814f9cbf16902bff7cda46e6e1fe647262aa93d83daa5ca92b60f4cb8e1254ab6909d64f38f4b14adb5c46d417f262d9805d554a2926b6c63f6e52e4951820c53e26d98b54dc11ef99804de29ebd5d77a92a247021f92583f9c9025688592c42812ed871253ce15df437a90a823aa0674e0e3116f5c92834d4e07cb6147fc31e9a524a51593d03582933c42e6d7c38804cb113a9225a798e7459833c50d7b523cb794fd5084926a03129176927b34de926852ff031174775ece9ca1daaf398479fa9e4e94cc5b2dbb80051af830445269dae933fa75550873a7da0ecb6946f61a34f68310fb973023e2ed9a3355c1c7201235c5f6d3d8eeb9e605c0d8401837caa8c148096e8c51031b4f82197c08c250ea1b25e5b5f38a2319f808c46b3935b7fba2a221053e0061ca206197acb283f6079324bf8a07ab0a91dd0f068938f9c4bcf33fe13e90e2e15f2565d7b81d1ff2246dfc2739cc49af7bd02bc9953b69ee4952f2a18763b0face375b62564a1ea84cafe8cd1353031b343ef04099ac54b8182abd7746c078316a98e0071f772874b47039998da99b7cd8218b29be2693d2b689be19373cf05187c326a934d2426697f8063ee8b09ea749498cce93671b111129a36d50811978df28410d1a23f898839d538449c2e7d9faff21072afdf58a664807953ee2509657b6ad98b53f9d02160883021648defb8c12e4e03b60820f386c49ad8f375c49fd704396d48f36144ef80f29b1311b9d0f36ace1b36af4a73c97b386c3de758a77cfa19d440de6f46af269c5794f5e0e3ed290b954d07829e9a53a1a12d3bfc4a2f37f7b75838f33b4bd2f2a37e94950cddf0634ccb8911f66a8c41445324f33c9979601ebdafcd12b47b5b07d9021978850b1923ac12e36f818c3a6f79349ecf7ce9ffc10c3e92bc6287e72b8953fc2b0a68ebb78a63b967319e800181a0823073f830000e1030ceb59700b27c9f225957ca134274b9a58fe767fd90f2f3c1f5e553178d224653ebaa0cfdfc95e797e70c17482e4a624790a0d1b6d63021f5b48ca3c39ed82eb98a43ff8d0c236d5f1195e7cc5c4f8e0230bdee79974d29a246df8b060f6ab49295e5f3ac31e7c5ce1bccced5e9e8dd1352ef06185f3669492f8dc25f455289b75e6149fe4ffa8f9a0c2fa721ea332be07b5cff89842953c8a76b854abdf48e1182b4613cc2b33ff128542a553fee497fd52a1f094aba593528f4ff204a72d59ef55d809fc6dd7eafb07d97b75f0d184dd543e9824ed4b2735f9608271c43f5c92a3be537e09c5084f93e4d86db96b302e1006191f4a28f5a759d3a8a175c92494a327f5ef604936cf91e0863a31c36664d2944237f838c239f8bba678ef4c77a1313e8c906fa70e1a4efe68f129423f6e5bb952b892e7fd204262a513a37d6b794eeac71078cd31c513d7da946118669c8f0b5062401503aa50418002ca60003560b1019500bf61a306350810801c18068000e0868d1a90600001f818740d6250468fc121001b353a4e0000a3c17100259818376a8cd81883068d8e0324e10c321c0937dec611de06669041c6936180031821076738194f46010e500413e3c61823369a0826c60d1b88910cc1c4b8919841460d68d0e83880107273ed8f41ee54d41cd95235101121e36bd0b08118098de4fdcfb0212262a30c316ed4f831c438830c33dc030708c2929b5bae2c3c0010da4ed2e65b29493c511ff919b40944446c84fc028bae1a1082105ff4962d6236555cdf2ea417675cbc38977b6d5f8aef9a1cb20b3eaebe9e2c2597d81b5d94a35dce294c9c2bf14272b18dc8679a4aa33148b8b04f8ed182a6af9ebd426e71a625b17d2e346cbc436cd1c7897271163fa67412520bcc2a8e859aa4e4ce3008a145c153d20d7daa9f5313320badef924915474bf2284416e6b9f5a5cf3649da2d2416797429ab98ef4af82c10028ba5b5739ed87ad7db5ec17db8ce9a4e2ae1f27785bb9f7652c63a45f55c20a41545ac285bfe9e7a8c492cbd576185f4be4525898856159b6c26a4b4e4eb889c8a84347933cbf3329ee5200415c7fc1f2bc7f360d29f21a728e710d1e062ed235988294e31e6601e7f722cbb21a5f0af4e0c8dfda12bd51a21a4d02b468fd6e73966bde020641494689dbe664e88c9091105361637bff9777d4ba14073d4c6592e692ba311cf40082876a91ecf8f8bf23a6720e413fe499e5c3d4293fc7720c4135766d5003c6feae74a79c310e844f9ab3c2c8359da9e704295cb6d19992d87bf89d36436c983099ae4734d585137c5c7fc31d4d24c249c2464ae1b1bf14e8209effb3e34fa5af2982f516b4c3713d43c75b2442e568216ad1af0f9a449feb552bede0b42285159ac1a1032892ae6ab95248d2392d8e65d273c8c4491c133543cbe9be790c0ea3ac774f268c926fd0856274e56eda90c1b3ba2af94fd5ea6e7aa6a232c212b74e757ae94828c70ff842d7df54df7d52234417c43bd7f3ee5a408f76392bae83a5bfb242239d604d589280411cbff6f8ccb38493e7a8835767d253939fd24c510ff99145464ab422474095d626849e61f11c21ca3694a425d5e9720d1201c0d1d4c743f854ba26484084293c2c41d8bafa9e3099d11120883054b8d0e37100288cb573327cde8a7fffe81efdc565749084ff218e287735ad4ca41c53eed839b2a3bcfa53c1f3e13523c5fd6a718c3903da05129e59f12ddaad4103d6096f73b9ca4663ba7192179783ee74b391b2f5a0a6320040f9b79658fcb4e7ef8eed027e1265be27b2273217620b34efdefea7b366f444404022175b044db9d280d3971628f1181103a24ee315648bb431032072c787c4b09f6336fcbe1334d75294d2d765be2c027b13ac9ae7be13e628cd8a0510687c041ef4a5520e40dd8a5bc2764948c888894000436ca6041881b96d5cbee781f99e3a50420a811821d84b4c1b393cd366830f3fc8e8888bc18216cc0d7c3a5ef3fa4b2640df94dc645bddfb27886a8417dcd65526d07ebd8a7417d13890e52d12431091ab84e99133678863376d3e43449539731439b6c3b642f195206e32243c3bfff450f86904119f314d77a3d6de88c8ce1f9bb4fa984f4e9af4644446adcb011220634ad43938b67dc7a2161f8bc4cea6cf564100206dcb52d5bee289644932f30f6b1b57fb12a068b1736adbaa069215c78e4737a09da9a25ee2d509e223a9a925d496242b470692159c8b4102c2c15afa1be3b461b3be40ad966f824479ba6931262856ad3fce46f8e65a249158c1699d9a4b230aba171a38619362610428527a5bad77fc653e74c908190296016112555d692c839440a5dcaafa251ea3e864c02215138f5e282e7cc506b9f111111287cf24928fd36134ecc9e60ac4ed29a7b2ec40906db0f93c6aa3bfba58190262072e973d84a7f8d1b04214cf8fee2db5cdfbb5bb68435a595323157d8e85b88128e76a7615e93e6d5ee1333ca4842929c4992a5b14768a420040968744f62eac58c3f5ec811f65417638efe492a66428cf0884b869da4a52d07356e94f121082942176325a3fcd249c19c400811125b4a3c598ec828e19021501a5503428460d473ff91cc466ed828430c1191158404e10f5f27e57c6804025f08010225b4bee9e635e9d0b801f28b53eb753d2797999c474444920d80200c1b6fa3c5186302c50601e20bcc63eae47a627799d404407ac1a7ece5966ffe4bbc6a8871684800841785cb9b7f82892771d218c3c6034076614e9790fccffc194a7461e7ed72ff0f15d6aa5c98f7328c85e8a6b8102ed6d571ebf041cde202b9c549122dc3dc648870d516c6293947fab5a48c32406a91244666e712f33ecf474068419da417ba52d04c29194066f154ca1f2c89c15fad97052227a6a709b76c1bc5c2cea81a50253551624e0e5dc932d2011058e497f6a52fbf39f4e51525b14c405cb148c7a7e7f8165aabe4cbb8410802c0099056a81155b1e28ca8ce0059451a5135c00520aa2023905470212a1054e03a16a399def520a738735b788b9ed6e43f013105b79d4e123a5512e3db23222220a5704f948b17c326c55b629dfeb7c92e52011945aa1bca92756a4b72c98888c88d1a9c616306fe23159000882812a7e334cbf667fe7028dc374dcd9a44490b2e0828b2f08c39790efff7f44801f984a1629a5c391c887116c413e67bddf47b72b8b0f10e8074c2d02e4963507bedec73e230ad95724b4e8cc53661cb678a9db724a9f38068425bfbcc57b2b8893154c30c1a5f861863942186880804429009656bee6347e910128ed078104cd8219aad53c7cdb84103e41276cb6a75a8ce923a1982302c919d6c41ec93fdc56a466cb40618a412c7e67ab95f889e8f8350e2603d9119a166af9621c6054026e1bef6ca956fb81411104998fce4f02973874e13a3010190482825a69f684e8d695e482484668ad115e6349f8ff02b66c8101a11111b618800c411b4c6dcf93245b1f6f6133340d008272e7c9fecb6d9be61c4d1fe27896b4bb6ba8853ae0a8d76512a68a608439da8feff6a1da1264237edf0a2a5cf0004116fe5a634e99b53867b883b87750188d5a884d1229150281007828150180c0002a2bd0a831108204040220fc7c231b970b6d90114800140322052482622281a161c1a1a8985a2d048180e05c3a000180c0a8f84501cc6f12858f7067d71f8c39626e069d788b0f1f88121921e747e90f0dfccb66af763c091ff8f8a523561ef70feceef04ec375253b6884288004428a932a6f3ec4a060c0403555cb329a18974d3905113bedf5b3034029e25064a71867c0ed6dfff1d78a21839bf95e845aa82a367a9ee0d5af767f9887829c7be65805f8783d26e1cc45e2448cb0cf20ce40f11c4a2868c698b58fe17efcd8337e0447b9871d38084042eac00bae3a5c4be610eb3c55343ff53d151557ff30937e69c84a73a33413fea163e519931b7520e2f3f89b0be3e30cf1f95db54acab6f3f6efa941fd1815e415907847357aa190b3dad0a7387e8dfb881c3de21f26b8453b0ff3d2d0ccd1cf35877810cabc5ed3e18c637a771bcba2352fdaf68273433e7d1a04449cf334c9b537f50a1dbb021c932ccb83657caaacf92facd74d539750290318e43d49d61301e8ab5027f9d86d274158552b654186aae4a320544a0df7826231ed053fe73cbeefdb87bc49e6681e9356ee82f47e81bbc709faa18da2203e0365c7b4dbdce035b5b0163cc5efbedd94713e7390c06b0ee72751707d062ef6b6532724487415ec50e2dcb2c14a463ce9abd6cd169957f37ea440ae12cb19d6ac0fc60470addee809e8615381be8aefeac5068b109618247417383ed4bbc1972cf1291a9a63c01618b98a46bb0e393ddfd7c85dcde87fc42e944deb73e81f7a9ea45396dc7c654cab92ee9140f3c839e90f70659cd41f8a6706a7a4eaaf88730c2ebbe5d96a99ce2b95a0ac65a94ee18504133196f0cae4f9ecfb2ef770642fa7f992a80e81833bf80e296c7e0084d8f2a8089cfe9a200d10800c41d52636a399f869d1a04a67ad4c65ffdbcbcea2ddaf618c14b8c75f1f3039c7ecb670acf713947459b40eb27affa6d5cf2cad470fd5fa8dff9128539f64a271a93d40308afdc021c6fcb89a731dd99d440c22a370a02a6942de67b65d48dd211a2bd6c323ef02126c970a559fe065c3e1a5e0d5b2475948fc99e604dd908e616863d337fc516bc2061482f579b4717abb01ce2a00e2d7ea56909c8cba9a48de67b5e9d53e0eb0cdd6c081ead89cb226f62b52a5922d2bd013a5660dbc725068a355b73f80a6413976fbf731869a6e96793a38a1e7019e26470f6b4afe367d6048906c15229c77cc8c48762ac018223ad3d065016b34a666054a428cd5f3435fd9dd12cc160f83d9cbe9d141d7b5a3115481aee47bb2973d3108f7be24bf0f6a5c015fde991d11f466f451f09d9c873896e6a869ed3d24c568d0c3d8db8abff4365526bdca85358137e8d057aba2ec90820243f7221eb8d9e053e28e6ab6bf7fbdbe281e657f65b3a12a72ebcbb3ea1407e6964b54533720417610922b9b970d8e8e2c11b1f09f9e6c9c5611f7c9a4f271ab09233d48d01b110aa0d846018df57ce991f3e5389a9bfba80ba0edf1813043d8892f97ac45a6ecbaca029ae7502fda38df851b027e821ccfc1707fa8ad23c83fab242ea6f372a8de7410409199eeb8b846af57bd356d8b9328259558f11f851a90bbe298fd5ac3a74284f8b443e6368d934603db49be5beffc389612172e1762333a51a8cb78a6a32f45534c47d1284f8e32ed9a990119777690a0950d52591a006c36d4a2c4b1ce5a3ed34f72aa5a43029e5a683c5c4a3ca4ebdfb365b34bc4354ce18a0cffc0302f153b51e5d778de143f0ff5d4faa670daa0f4b2d59bdbbb9a91deb4078039f96cd455f1cc6cddc2949cd2eb18200631ffde5a75507f6008aa4284b281f39e3d1f4e541b9c76b35cb16743ff52e1eda5f824a313677cc281df38bc8191c9ebf4e34583d584b3194edacbf39a6c8ea286bc98aebf4bbaf9545c02cf27a9a6b3fce9b02fcf0f71835c1c9102efd95a50a89e3bd8650d59714ca42e089a0ac052275165a8f810f4a8581e03b75baa94321da2496821026d9fd43f3e24a74ee80f9110213c8719d1be7f15c499d10dfa6e2ba47279ce6efe34c2d50b0e8e5081e515385b623cba355be85f6186d1e5223f3a6082aee0de8d4b4502bb83b10c8b312b39392f4658cdb13bdf7a61bd3ad243c21ed8096bba375c4d72e09f04a6077b974987ce85c12f7cb6c61fb79a76cb374d3e7ad5c6ad6bcf7cec6be692bb39bd71fb3616b4bfa9d8e9bfce292c96348d39aea6b0c8afa8fc30fae852411d9363544cbb8fc691fa1a442e9f577ec0f8d27c312fea2c353fe5f85c3afa37307112fd7109c494b75ee45dd0d6e7fd2f1042d42bc95f0b7f3be0237156a82c5f4f39e5db07d5af89a8a41c1e592e2051cdf86946c7711aa94c93cdb1d11a40651afec86699bd2b6663c4d66cdfebeaabb0abcd5b848c49ec67e3a38545f47d4d1ebc38cda6102f64be1edc7b04fbb5886ba12a1029025c1e19c9016e4e9aae07771884199c54d379dbf810441ea808edea4bf064afb85d053dcde54d5aa7628525aabcfed1dceaf7858ab2c7ce6005d202c978b01feb9d96e3afd1055c05106b45850b81ad7c9786acc72e3da8e66312345f3565578f0263428477926fcaee98d386ae30b42f12cc97d5b69aa05a2c72cac1c8124ca2120728930fd5793fe94d90e1b5d6db2129703806864eeaceae2d2641f382460db54a975784c2c11d1895a39d448ca048248bcb3d3297c8ac03d733398337a433604dd356bbc0792470f05e4f91ca30c29c5caa0641c71d718312a315da70b55e3fd1de54b399ac879566c348e98c286eb67d5b556f900965d6926638c91869ba7bb2e953ce2bdf0ab856f4d903a4f19087682de9a981e1598ec265cac7ba53ddc10c57d6e7012938f653c8962c55538022572e2fe3618064f227ad96d6aa93ef555b86b7a9c0173e738fc3a13c10e7e8a3778e71bea76da3a693b231b92204373f186c796d6eeac1e09b13eaa7ded2cac96291f9a3945625a307d3bb8add1159e414990df7a85597fb1fb8d2e27c5ea88dd818f7c210053493cb736725e7d2eb72b8d9ac5519dcd1ff2ad48cae33bd90e0a5851f6af30a41e89e51688b1a8a080cafbb5a82f29f4a0daeb62e7eebc66b14704ffa4c9a50c432203adc739a433f99e136e41f48697b5463cf26a706bef9dc0666c07b4c3e35b830191c3f4aa885ac0305841c8640732226c2f5ff06316f988ab03109d13720c545646d14236453bd7b4ee29f1df40dd646dc7561fe14c0779b0d5b034587f67acbbba44e4679a006987322191fd133aa3eff83b0b6c633df1d967f65d457ff06b0b6f1fe8f7b000cbc914b10757fb404d0cda67a6f2f0051f244154bc565e226da68dd2b044d2918c8dc87d9ed557681987a55e0af82c2d6a3becf6e38d0430b01053e32e752a2815b7caac4aca6a895c0f0adc611f3529d4366efec8ba92882a2f1e13ab999502fe6caa6b93fd9ec0f348e074593d2e645d11ba272f4b87d333e5cbffea0ab3dbc7c4bf2cbdb4722ea73a10cbfe060bcd47e8d3d904827d87b0ccf2019a2bedb16fe9a8c6e39aa32ad52a59eb338a0c570ab5e64b30f1c8e3bb11a524f49b522af11b80f1c72ca9f97dc83140da3a2ac96dfad31835ed4114fbfe384c610b7ac98e5fd4f5d6d148eea1581d6fa8a19c372332c7349ebd41e35c0a492eea531d4afea858a075cc12a69ef90f4edc4872bc17b3cbb73a23454b6182d5a099ba2d4029fea3738a2fc41942f728e8d22ac1f766585732eb135d260c3731f7545c4aedcb996d9280639ba8f2f403c05ce02c04c8157596a149ec5690aa30eab01e6e6579da97e764a700832ac0955e33418d949596ab4033e4cbf312c206ddcf7429a671486d264dd6e37c90c4aa90acfa1fc74980bdab84c57801ff93a1d9c5b5c625e0c468c2465b03f1339a88e080da7eb91cfd742d5fd0c6bea65f890a54d4d4f6ff3e3d8116653253df750b8c43c8b55bcc89b9f1c787a2e3b68278e6837b7931a26e6d094f4b85494ff105a386ec5d2da7efb9f42bc4b60e9e3b755b296ca1650d19a2af0bee91ae247aa05dbfa476ef01cc260cd9199d3452507d6c505db5d0d9deb48b60b570525bdcd1282af8331f4e23c56874d41736792df239bc732aeb293441be383774fc18443b266020c0ad3c006918b4772abcfd18d0ab1b6c1ca01c2afb02aa9b902286ef763dfdabd570076190d352795018179de49d18bb1c0c4c0016a4189a70da27f370e24b8479a482edfe8c10d662a6cf8fe6b03589ce02ddcd11c11182cd1f3276f17927426c594f7b115f529da85c3a9e095122ee5c7c15ad87f1b87419a09a011e4b8ac8b08436ec1ba985b93a14d7be2e85a7c3a20cbbe06e79c5014f8faa503402f9984f909d46651ce23aae47a28ff8a594f011b2d485bc33ebf42ade231d226882c22eb1a9a23b8fe8c407e13260ccf19770dcc65565ed0abf9d55ea72e02a270dda5661931e997f566179b6ab7198f44690d99871781e9d2163e1bb85dfa82f56d125dad9292193002691dd33c381929dea4fb0beb8da0f45be39d01d73755bf75d4dcdbd22ab96964146f431d2f717d70278109c221d47ac68ae0571ba41a5503038ab553bc9ee74ba5e0ab0f7f03c8d14183cc68a1fd3e392e333c380b8f215a8ff7a4a40977da5edb7c04fc7d429dd8fabe18d0effcd6cf836b9fef177cf1431fbef8e6cf520cdaa35a7059b355922e40f2544192138aa823230486a4307ae61981721da0d9983338ae09d5a4d7f8a1f565b9b8666411ed25def838ea6c78ab60c245ca08cca23094aa0623206fa3bbcc0b17fc0391164a755542e0db7b1f87f075abd6c9287149cbff9d4afbe575e758231f733b35cd7ae0c6a8e23a8262be283c36f5a1a39a3cedcc096fa644d64e561ea65c644388b32808829ef6db298e7c5eff06185dfaa6fa8476b473c726f4368dedc108f6ec3d77c52e4f30236a6cce6181f6acdaf713bab87e579362308d6df7b6c5d9d7201555cbcabc42aac5a6abe8a16ef2511e4ad85e175b42e56b46c52e1525e9c6091993142d57ec4828593d66e07c50ab802baeb5d29125b4ae03d1997902505a51204bd915154b3ecf5b26322b75b585e524f97d75fc814de70a4242ca97a1984335ec8fc75b5e55cda232ea0434673f1960e46d191ff94caafba4cec8e8b751f686c15f4cd9d1a559c17cec63f7676632e78eaccefcd8a5c1307ca29cdb3eb58bc5a864e50bd1aab3ef0e340dcb68c14de2340727762e37cbbbdac75fff83d25bd2e700f401ac1985dd4ca2b9ce6f1acb07b72f8cc83f134ae9ddafa94588d6bb3b15a1e0757210c3a52334b883e11b06615b2c4c885eb0f77c96341b17c2829f1fdbc376ad5488e4ba97bc167a0ed99883aaddff5726c3be5bb082b34fe5cf6430f23c49c7053f4b39083b151c82bece6930507a7df30db11c8b8a270c5c107e6e76359304766dc682d51c74f8b013cb5f7435f1b8e7e77bcb64f7a3da04608bd2adc4ec7f5d7fbe8f7e4df35407845a7cb44796d875f26ec9e99fb3ccb9745268cfa51313cb551c5f7bbe5e325165a768e913b9891f554c8703a0c1231113b72fbdb4aa1a4a009f3719734ffe67296eb464f1daa5d85428509741777076de9d95e913b67823a3e0b0b8ff5d9210a28cfb0714e153f97696debebe3a69b6ee93594b99617912fc50a170a56af489079417ff760d67c80da88200ca2a992e45420e817308603ae2c0ee7d59c6755b86b052da6087bbf1b5a1d05419c0f3c1f0130871e1d4c7d5a9fbe2cc62c45b9cf3ccc6b743775f50c1f0d7f9cc4ed7367868a3b9e42cc87bd33b3cba5d29c7ee6777cf561a8868038b04b619917e33b17282b377e3a5a60e7a84f018ecea2e6d9bc4b4d2216388c905305862161fcd56890dcb1a3a818dbb4988b666603ba29b699e2c4fb20050d46edf7801cbfdced3eaa1e070802e02f05a7bba5c9e922f5e9bde84e22eea1ad03593a3796ba9e78bb10a46e412d5f4884c1b0d61eae40271ed83311d8cec0a3de981d151c39bd5e7381cd61f53a6860f119512fe473715e11b65597d559af80a7f217a77badae009758f917975a74831c13a8e0777e5869ba8f2cacb132d39b0c755286ed0fe7e08ecb35574f0a0a3b39dd9e26edcdc79b0c5e1bf0b01a067e9d0b5a6b417bea6ac6c5c237e854e9f48f38a1447d44a9dc80fee7308cc1fba276c6bbc0b1db8e25022b9d9939460489e5aa7461158fde775f69329b01dde4475375c2d9f249de0a60e11f9e5081a915189636a273e5e049fd4d78e93e143583cee8f546825058b48998fa9bb1aaf0ed5519459962ee360e02558e82a0589e1b830f7038bc7a9d5440e1d7b9494c1e9d42b5e9221232e17d71844e2c464ab80fa5e3add8360e76fae025e39cc1f81bddb1f2546007a68e943788c0657091b259ca98bcbeb19eaeeae01f62850999bc5d7d50d76b0261eb2428302cc9e029fd6878a220b4618e614dff239ae8696883ff1b7ae80013ce6cbcdedc8f3d90d0f097ea31b51b2907e007af6a9f9b1396edc89df150001228205c6c2210cf8c733ea3491a23e3094ff9b6d0d80cbdec47993ac2506a89fdef466b56c53402d465b1d5280acece96e0fbb29a0746ae19c571a4f1ddce214f72662d2ee0068140d668d98947642835a010d213674d9e133b16716fead5b7bf998dce77ec3e1ba70757cf8ab12e6dba4061cb93fa579a5fac8fa1bb002f5c953c41269efa9e973f0de14db66f883fa239abd4c703e6558208b39d7ca6dd33037a8f39adec26382495aa69b148ba0be617cbb2e0139d72a61321648583c7e6241844e758c6499c609f54d209b5989c747ef1dd7a391cba65f3c88d2d925a6689d479d6b3175037b26a67375d1ea2cf454939fa105ab51d780e2ade42481b64bf69232a1b7831a80bff776f06fce7830e751e752cdaece050c35b1c97dedd1b48bc44c6716f1e6f1d9db77b512922888189d38791f97ef54c629636624c949c4f1190b2ad6cf809cba4227e35ff3855aa471b8b5051051a2ffe20afa4266780254225a2569d9a6df2443b6661b0ac321e4153d2e196c1dbd0317e23a1bf5bb25697c7177e354c0918b9da0b4a86b87d8113a2735b5b50be67a0dea301f53d149190f6c87d47b8d4822842f3b60b84620f88e01f15294a5b07756aa02f7bb6e3d11ea79a002997f566501d280672f15122fe3ddfe6a6bc6506b65ba511634fadb12fdf89abda99e82cdc3e0e071f75b516ae4e7c57b1384e21f5350b0fe121d722b736fafa88f270f58e8385a30ab4f4f8af815e1bc60ea9d058491f8c9e69c07782301a4f4730a741424a43c35f81aad117fd182c6ce2a7c7c28db61084d41effec4014ebcd79627422cede35e25111373d8299204d27e0057b8c938f1ec4f37ab0a0779baa14a5d09cc499e1aed1a92660cf877480440da749fe9c4fd8b8c3c5259a8f190bd1ec0dfa9cfe471d944a14c552320962e0e77bb6cedfe614d704e7a9181783da1b14e273514fc5dccdb9bcc54ed87cb4b5d4749daa40682e578ed7bc38228535bbbbc691d5952631253856e8d50212af80b169911172fa45b5ef562c10813ba9a943cf93c72f0d42fcc0af4daa2d7104a58735cfd3bdf7d362103ee1d6ed15b79d12c62fc374a2825b51fceecd18f3ff14f21ee8731e85834274ad97a49445fc1d114a4f129d2a9f4b5586d1cd5a846680b5e84af5dfaf548b9d66ac86a909c9e32f3010a4d7e907e66ddf0b1641bc2a19b4d88430478aa6c82a9bb48da9c0d6e74ca14a2321d35b30c088db2e76dc3107227ccc74770a40e4dd21bdbd087a02706f20a1a91dee731170f20f2642ac912ceb4424c491f6a192184db263727188c143e528186ac8edb025392648fa0c4a1d4f8c36e2f85ee119fe1a0932e864c5e9465b72a1acb91c6dd90800ad0fd3ecc2cbc7159b1f7d77f8476f9bb00c590be8f928084c1240e267593e53aa0d7e855000f539a4f821fb88825f9407ed012ad6aa2cf3bce69fbf9c7a3ab93ceed4ccf5e0e6954a2878412d5352a5af699cc4e779c93c8f249a3801ec004e41a9088f3dbff05ceb335221d3543c0f61d7f17c62896461172f038c90a740ffef0b93f3c0c30bcbd7b475ae855080c9b18f07c6a0b60b14d47d985efbea1d71199c26ed43397bd519f22974ff23b39f0334a6013b7edecb71b5a0b94c1d21f639256ca6045771030179134e5f31b7c677f4fe899d707fe53d480315d94ebe1e718009f320c3fee33161b400e0cb6a98705d06bc65ce3f810535b9a43f84ee3502c6dce9a0111a6d62d89d56922591c0e62836c25e6c4d396044fdd08d708b848f85f41c8a39122547811eb1bac6998604724509b7548b59c7e5ac7e2d76d10334bc5d72b75c18a9bc4ca94cecc258052edaebc22aab005953b02b6116a6c1af4037de0742dd78e38b9017604d62f916573eb33355977d7439d2cc909b71c6f2b7ec1604cbe54bea8de1eb3273771f48b9a5a811683bbf457ffe5e4fdc126cb0cb9202e132a3a5f29cd96b69f8944c6f0893a4feeddcea4748cb36f34f22cb2908349cac07696f2f3696cd1ce3df77d2907b5b465e77472fa26194dca53268f3d368d24cde16938c6c9d481a6c1f6d37a1c3d41e2b758e1a4100d8123d5097b8d02a136e8a242ba362b90a4fcf807d6a9d2cf69a017472e7c5cfc94af6c69623886182a0831cae9d0094a257caf7dbe547a99a1df7b506103d43fdf70a0122324edf841686ecef81484a4f4b7a598db66427acb21732b7ac8c9c2e1d6d3978f9ebe6f9d08b133e567d0e22a2c01d5a4c8c72e0db0e6590fa0a68a6b0280308cfcf3fc3e4b62399e531323ea978e13a6cf7b0d94647321b6f7647ee3567c6babd4797457c3f5db34c4e93ec2e44c08fdf59b780c58c16bbd478652a6e73a74fd6862717da61e0ab19dc4a7785e3c70841b7b4b1717370950f4e157074d379763e81786af8a7e50201b4213ba57b099edbd24017c64c95381ddb261241a6f4368b6dd858d36a4dadb86c11df6a50c471577f736227571a985c03f62453ae8e4c18930a782842ee318190916183e79cbdfbc11c7dcd674e12d9408e2d6c882e286c293dcce93b61e77e3b9abc74b538d232f4986c44ae084667610488de0c6fb4a4f1494017bb1d2462c8c9e966c9cf197697e5d53c411f2a6707e9773188b2acd2ddb24938877c75751389f170d3ddc4bb1fd1fb0b7eda80a88ee3d150a9420db2acfa92ac975e3136724d4b0e94a001", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d54214c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b30b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x104c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b7620b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3", - "0x267ada16405529c2f7ef2727d71edbde4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da971163c33bfa29130f6489d001e7a8a29c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/asset-hub-polkadot.json b/cumulus/parachains/chain-specs/asset-hub-polkadot.json deleted file mode 100644 index 46f3e0e4a957..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-polkadot.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "Polkadot Asset Hub", - "id": "asset-hub-polkadot", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.65.251.121/tcp/30334/p2p/12D3KooWG3GrM6XKMM4gp3cvemdwUvu96ziYoJmqmetLZBXE8bSa", - "/ip4/34.65.35.228/tcp/30334/p2p/12D3KooWMRyTLrCEPcAQD6c4EnudL3vVzg9zji3whvsMYPUYevpq", - "/dns/polkadot-asset-hub-connect-0.polkadot.io/tcp/30334/p2p/12D3KooWLHqbcQtoBygf7GJgVjVa3TaeLuf7VbicNdooaCmQM2JZ", - "/dns/polkadot-asset-hub-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWLHqbcQtoBygf7GJgVjVa3TaeLuf7VbicNdooaCmQM2JZ", - "/dns/polkadot-asset-hub-connect-1.polkadot.io/tcp/30334/p2p/12D3KooWNDrKSayoZXGGE2dRSFW2g1iGPq3fTZE2U39ma9yZGKd3", - "/dns/polkadot-asset-hub-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWNDrKSayoZXGGE2dRSFW2g1iGPq3fTZE2U39ma9yZGKd3", - "/dns/polkadot-asset-hub-connect-2.polkadot.io/tcp/30334/p2p/12D3KooWApa2JW4rbLtgzuK7fjLMupLS9HZheX9cdkQKyu6AnGrP", - "/dns/polkadot-asset-hub-connect-2.polkadot.io/tcp/443/wss/p2p/12D3KooWApa2JW4rbLtgzuK7fjLMupLS9HZheX9cdkQKyu6AnGrP", - "/dns/polkadot-asset-hub-connect-3.polkadot.io/tcp/30334/p2p/12D3KooWRsVeHqRs2iKmjLiguxp8myL4G2mDAWhtX2jHwyWujseV", - "/dns/polkadot-asset-hub-connect-3.polkadot.io/tcp/443/wss/p2p/12D3KooWRsVeHqRs2iKmjLiguxp8myL4G2mDAWhtX2jHwyWujseV", - "/dns/boot.stake.plus/tcp/35333/p2p/12D3KooWFrQjYaPZSSLLxEVmoaHFcrF6VoY4awG4KRSLaqy3JCdQ", - "/dns/boot.stake.plus/tcp/35334/wss/p2p/12D3KooWFrQjYaPZSSLLxEVmoaHFcrF6VoY4awG4KRSLaqy3JCdQ", - "/dns/boot.metaspan.io/tcp/16052/p2p/12D3KooWLwiJuvqQUB4kYaSjLenFKH9dWZhGZ4qi7pSb3sUYU651", - "/dns/boot.metaspan.io/tcp/16056/wss/p2p/12D3KooWLwiJuvqQUB4kYaSjLenFKH9dWZhGZ4qi7pSb3sUYU651", - "/dns/boot-cr.gatotech.network/tcp/33110/p2p/12D3KooWKgwQfAeDoJARdtxFNNWfbYmcu6s4yUuSifnNoDgzHZgm", - "/dns/boot-cr.gatotech.network/tcp/35110/wss/p2p/12D3KooWKgwQfAeDoJARdtxFNNWfbYmcu6s4yUuSifnNoDgzHZgm", - "/dns/statemint-bootnode.turboflakes.io/tcp/30315/p2p/12D3KooWL8CyLww3m3pRySQGGYGNJhWDMqko3j5xi67ckP7hDUvo", - "/dns/statemint-bootnode.turboflakes.io/tcp/30415/wss/p2p/12D3KooWL8CyLww3m3pRySQGGYGNJhWDMqko3j5xi67ckP7hDUvo", - "/dns/boot-node.helikon.io/tcp/10220/p2p/12D3KooW9uybhguhDjVJc3U3kgZC3i8rWmAnSpbnJkmuR7C6ZsRW", - "/dns/boot-node.helikon.io/tcp/10222/wss/p2p/12D3KooW9uybhguhDjVJc3U3kgZC3i8rWmAnSpbnJkmuR7C6ZsRW", - "/dns/statemint.bootnode.amforc.com/tcp/30341/p2p/12D3KooWByohP9FXn7ao8syS167qJsbFdpa7fY2Y24xbKtt3r7Ls", - "/dns/statemint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWByohP9FXn7ao8syS167qJsbFdpa7fY2Y24xbKtt3r7Ls", - "/dns/statemint-boot-ng.dwellir.com/tcp/30344/p2p/12D3KooWEFrNuNk8fPdQS2hf34Gmqi6dGSvrETshGJUrqrvfRDZr", - "/dns/statemint-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWEFrNuNk8fPdQS2hf34Gmqi6dGSvrETshGJUrqrvfRDZr" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 0, - "tokenDecimals": 10, - "tokenSymbol": "DOT" - }, - "relay_chain": "polkadot", - "para_id": 1000, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x08147368656c6c", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058449e04ae95c504114c108066940e98db59ddf6af6efb57b7dde0b64469d187d03f0c9208338b0a9eb6f31f3d0dab728101fedf5603adc13d96d400acfcf610cbaa56a582dd86ca95fddffd6def4db6dc52ca94520a3b115310ff106bf4ed568cbaeacc358aede3df1a119009a9ebcf35e2d7a3228081c842f12de71abdbaa558cb26ed8b1e4708e99b4ff5c2375fd2f34d0ec57cfbd42f3fd5d97f5aa37e47cd7ed70809d6d09020c290c54f265f38c2ab0be9118597d725020bb23c10d6c13fb7f4884c8fa6e0f2cf298c88f5f3032ea882fcf98122e8e0495e70f043fae5cb1e607e1299610c252b7e1255b1c232c34fa21498e115066390603046942db480072de0c1b39330226be59f572cd8f2e5cb6b10269b007d9542fc7cf21222f843fae59b5318103d628114fe79931f283d51e9f9a75d5c15bce0350e599606d1a329c8f0cd3736e7f89cb121edeb96bb140b32b45fa273c6829cfff4c6a947537879760a23c23bf8e70f13c2fe56aaf2ec747295679dbdc5c9bfde04beba1e4db182576c487ff9f2ea456f9f1762e0c5dff89df20e8b6fb74194bf31b4cf6e71746e291684a5f3c586ac37395579a61ec5008cc780708bfa2ecea26fde116788c342c80199fb2c9bcc686ffec3968b43fae5cb97f5c688dcf8f56db1c98c2f80d87876587c47227e1bcf6ef1a5584721f676c680b09344d62b9ba61e51a1e589f85b4ef626fbed7de33bde788efa1b89ac572f72cb62581ca47e14d3de2e8daa8777b15d2e3e89a209e751c43c5174b9f82453acf90f6b9cea384248af7228e69b0ce53c117f93549cb7ab17bee72d97077f9746adc3bbf8a4270a232df8f2e5cb1720e7967bbadceec10ced97a702c5819cb3bae506f37c352a18ff62f39fb65ae4576fb1df0a5a40a6fec34f54cb154ca86fc2df8125fb46640ac6ab7754309ebfaf8efa86b7dc2587b79a9bb6b6ef06cc04418bfc1d950eaf1810ffc31cf78bd6c91675372bd6be15c380acbd415920f692b6d8715d310664eb21b082648d4d99a54264cd8378e5e2082578d7311959c20b07443d31deede0d3a4bc72e7a62ae2086946ed3be3875ec57d1d3e4128974076a2f7eb166cff61783dfb7ad9b7bb95eb12a2f7eccf15233274837de3642095cf7daee4bc74f8e45cb10428cb49b9bea85f5191e14501234268408dc378e709e0d3341d41013ecdd20f9fa66631824ffcce7ba878e744b04f03e9174db37ccdcf9ec7a1bc9ddba558107406c25e79c380ecb353d16a18037eb8abc818907576c682d8dde2d8bc00f6f5f5c586f4108c9243d639874f943bb7a8a85fe293f3acc67d894f7a7402162874e796553915a1577152fe288771163d152957cc882227505464a37f51685d5f31210cc52f9fb8bdbcfe50e41666b184406fb7ba1d6c87edf6a98eb323e51052de9473a7ffc3941482eeacc52cab2f224e5e6e294651de0dd961905b1b71dad7db39e2b4b3536e2d96809f57dd31295f5f8c083be50d849d72c5822877d0895ee5d65eaef225edcf61f4f29e5771ee3f77feded07e79e85647a2f7ed2f4e76de73bfa154ddd1fec38a0171de4fcea27f4ec5d92e049d72ab31204b2e5f42f4def22543eac5c8e88966be72a2eb496e5d975fd77579f94a95a7fd8a73bfafe8dc524cc872f9ca2d521c32c0aff240ef38f9a13b270571de3eb45fbe72c51450f49554ddc11810e750b6ff34f55cb4dad917c87e7bcb480bad686f1378d1dc6ab1a41863ba32d97a49bb302ada858025a472e894abf3450a42f2ca7f9814f515aa52b1c5b88709a99c1449bece0ee3dc87be1810e815ccc961d3c6c626dd1fde5db762f62dc58274653236e5b0491b164492b3e849fed316293aafaad8647fee3b27c526fbce2dd665caa92a3aab97bb6186fa7180f4438772bf8a2b8528af9c14f59dab8ffd175d79d41b9f7a5ad0107ce74328afe415a36c9a39afdebcbdc426e8ea2420fb904d0a23ce73edc2c8e883788b8a9372e896a5582567d1574e8a739fe430ce206bf4437bf4aa3c2487fed3a4b85e45f61f86d70e352acee64f0eed3b59f4f645611555898296216c59c31e62500620c52ce5129bd63336ad13914ddfebd7b7c7afaf17c127f7ebce27c5d245caafebb0cf022d11beae3a2b85f4a8d93b2220136a07e2e7af5bee52f5317bde1529a07a67b9e6b3e574f2edb33242cff04e5269ee1a9bbb280121bc80e50b907ac7f9c4f77c9ea4a88aa77c3a79e7aa3f5485987a2445099e689f924a348c1fea2f5ffe492a4fa83b29c2c20b509346f3897772b6cfead97fba23106fedd5a2ba6216d02b44015220be9d6c11376bc1b2f42aea1ad813285ef43376656f47cf0eaf8c08eb275b571680ba5a961220d3a328bc703eb1b39bf8c4cc5164f1dc40cccc4c58eb1b3d094b5f7566f6ecd6aecfeb797723ffd13779185f904f731faafa589f3dd97e076909db635ebec94c8cd5d7c67eacc9bbb87c930b467d2c59a31f32c0afb32b46a4192d262433faf58b4ffa6cf4ab9abdfe50d4cb70b0f4954f939d7d7d36b75aecc9d89bab2b46845da84965534bf9c345bc10b0940059f31e3e4dd8834f3333f169f6bc73e744f0a9bdf3129f144b1c8ede790efb309073e553ff2ce21dbbf31a3eb53b777ef169ddb9ea3829a4474e2c2540e67c9acdc4a7e9dfdeaec327fe3e7a62e5db2ff661a01dcf3f73be5d779358ce5567f67cbbe5e2beb5978bfad6628d4dce357feed8029a53fec396c5eaeae284ef5ce374578bd01563398b9e7565544ee7cd7f9a237417f5b7c50c3a773596d59762413a6c6a5ff7b891a38bd3dfb9d5578b952b06e52c7ae83fdc98aecc84269693a85fd9e49ce4253e356fcf69bb72ae937cafec9d677cda8dca266593e58b05d96f6cb2e4b49ce41bf5ad48d4cf6e2deb368c8bfa5c7ae7b07da67020e59dd9deb92acfcc79e7ed3f0d63e5a498c509ff3963aa32179bd61b9b9eab2f1654499c21944387d7b3532f2a16e42464137b566a51df61fb342323232323a07693fa689d6fef79fda1a85ae785a53e991e4141c6eb11145d78bc1e4191c55bba23d353a64750a8e0f5f5d91b1340760445153fdbb3c37508b57d947766f6eb33fb095f9dbdf1c9b9ab433ee9ab5b8d0535394446b98b945b7b51fec38c1951f4945b8b09794ec9f9fcb9c558d090987ffec32deebba8cf5850736b2f2a3e574cd9346b7e2dc59c9c4ebc732a4ef894bf389f2b9b28ffe917f5a938db8bfa8a3949d4cfa675d5e1b7ccc5a26193a9ebb3944fed13beba6ed46f7c6257b73aea73dcb7b8e37ee3d3babac557c7758b47d65ee38d91356f675f2c88afc5580e91ad5b0d0b5a5facc9c62676cb5d8bad2bd652d9c4fec3d65e1bf71563807e47fd22defd81a500c8ac18d599fecea7c6a676754b77648b05ad2b16645fd9d4fec31b954d137e7b0032f6762be393b249bdbd864febedcaa7fd097f66df6eed95f149bf5db1f51ffe618e3843e0b3c367893384bd397b9344fb2b954db3bdba6242d6594ef6f51fe6dd24584a808cbd5df9344bdfde5ee2937a7b0e9fd6db1bfb2c507bc627e5c2065cbe5df9a43f6bbe5d755a0af9eb0f45bb412c1522d323232e2ff3ca05942baf3296ea8b2293af58d410c553af58d250c6efab8da5a64c9db5ae7c9aea2b954deaea45bb332c3d329af24a59ca93a9b3742753f7b400e40553484f0e2f0e0f0caf0c4f0a2f0c4f0c8f0c8f0bef8bc7c5cbc2d3c20be361e169795b7867785f7860bc313c2abc2a3c2f1e973785f78497e5e9e04d7956bc123c285e94d782c782b782a7829782878207e59de0b9e0e1e0dde055f16cf06af068f0a4bc193c19bc183c2a1e0cde0b1c196e0e4e0e2e0eae8b0ba36de0d4e0b83838bca3ae82c570657066e829382f4d856687ae8223833b432ba3e9a1e5c119c1a5c0cdc0c9c061e170e09ce09ae098e08ee092e096e0b47057381ab81c3818b81fb42f4e076e05ae8a1b82abc201c149712570460e8ab60747859be25ce0b0b820b83b70154f8b77e525c19dc041816fd070683d683c7839705f7062682374111a8bb6d244e821b410d6047c85f6c25f3412d80aec054b81a7c050e02a70172be5c161cbb057582fb60a4b857542103adc97a5410420c001258a68200318b840050e70c4c7007a00bd2d1e1326400197078787d784352a7242822746208210380182261f2062b264a8092694782089d044f2a83c1f382dab048706c7056705e785ab4283d25cb059dc145c96b68246458bb25e78667026682960373430da96e685b78366a5a1a0c160a5d05ed088d058e0be7065383db83d74165a0c0d466fa1a1d05a68366c150d0637468761dde0a27052b827ac065e037771547058705758315c1d96097bb45dec11d60adb83a6413b01a381c3d81b6c171606cb86b685a6a55da159a179c158ec969dc24661b95828ec1316cb6ab149d8256c1b56080b84dd01a761b56c95cdc152591f2c0ff68ad5c16a61bfb0536c0956066b83adc1a260a378c010053c23210e28c2009cc5dad76d68a8b88f30416203459a40e2c812458a58db4a283952a40849f748920d2041a4e4031c284294c4912548945082a448911b07d332502638a0044991248a30c10125429430818408892449983800511247922461e20041740c8890587244c9910ec4a6429984e088501126458e28c14412479428c224044786286102091326471e70a35fa02040d2c42f3922b48489091089ad023d42848412489220d1a4c8910f1cf9400320a0c4910e7400090804d129502642491c592289964299102939b2e4c8124a90781b2941c2011cce832681848912244b889c38522404499a680289224b8e289104c907808492602209500edf413d5004092224944082e8c80264d80e2240920409244448942099c17250a1249848b2812247883e90c411278ecc301c74091307b8645a0c8a8b2b5bbc16597a6464f45bd4378fa7c053d826966aaaaa3a76765cb75de675ccddda39d78dd9355e755ba3b9c66b6d6b40d7dac2d71cc2ca44ea6632c176bb37cc6d9d73cbed9cd3e61cb3e55ceb1acc4d5114e51ac31aae063b08bbc1aa2184eb1aa9c11a4e9d53e8b4e1ba57c335e6edd61a1031ba95bb6e3b07371cadadd3f961d9ad5bc7bc8dd7ed2e4376ce396eae313be79a73ee6a55b5cbcddd5c63d7ad21ec6ecdb5065d7bf2b9768dd755ce6d7330ec5c734ea606e59c73d0ed6e3bc7aebb39e75a43ede61a352ad78ed9f1cdcd8dbb71cdb9beb9b971cceea6dbb91bbee11b66e76e9ccc0db36ce8fa4976ea5e2bb783ad9dd3d6ae356ce7dc3676ce717371bb3599d69c6539c78e1d376edc1c376e8d5d73ccce3576ceb9d6989949ce39b7aead6bcd39e77897dd4d63c76e97ddf23a6eccdc1caf73cd35e798991db773bcccbb8e1b6407e1766b8eb9b5b6636eae612355b09fc31a356ab4d620bb6dfddaed6ebba1baabbb3674b7edeebed696a276176aab6c5ccc3eac73eb761536754cb5d66ad4a84151356a3c2dbc2f8088b9c9a9219404121b489284091d383568d8a07183d5204a0209264a90584254840889073cc084a946c2e03039d20125482c91845472a4892690c8f1001222251f5822613840f4011f8e2c5184480992254d14498209120fe4501eb0c1478e2ce14091254c10219104134992209143c4c907acc7100128e204132020b2d1012548966082c4125e83680912444c80186209931f6e7488234c981c59d284079848a2c892234d9848e2c892224830512289234502207412c0104d247184898fcc12491021b181224b3041a20409074a1c40b2e44893220308800004308412478a3041d444089624f1038f2448847a6c80a0314309248e2c3185e088501122278e28d951d301206834004c88982071e2888e191dc209241c38b2a4899e98231d40620913444c8a289104c9124914214af20124387044891d9924479a1c4952c409243c7023eb0013498a744009920e748089243731479838cc12248e2449a2881347945082a4881224482c91040738c0441122278ec8264a8e34a60128a28409244c961c695284880926961451e2c892234a2c61a2c84900431419e2881012493650e40892254445889c38a2a38992232da31c82254c78e088075e1325477a0793c2eac489132745ce4911171539235ae4c44951512b6a468ad6c916151515751134a24545da46548d3871e2c4899366c449d13a71c2469cac13274eda48d1aa1175e2a4a88da813276c449dac91a275b2469c6cd11a71b24e8ab8883252b445ce48d116ad112d7a46b4a8888da81615151535235ab46ca4688b8a8ada48104cc5aaea7a8009121a2e45e634339ec9f88c9ca20424858c1457907cc6657cc6336fee3d7c82debc08f6d929ba3375bef9d53e0aa493882a5d58f1e29b2bef952fbef9ae20db572c5628e3e74ef9e633517ba75d2666517b27266aefc044ed1d2c7aefb493a25232199b2e277947a5642e925436919c47d6d625a36cbaa4b289e44057acf00987e4ed243de281976f6f5ff846464ff2c582487288acbd622d81ae586193be0e9175f7c238a18aaab6e942599bab363961cb99bd02b19c259aecc915eb2670a02bd88b78972c91edef12b8ed0ab2f61acedb97f0b3e9c7f34951ec3fbc649f88d7c7fa6c0ff5d43e9bb76fce42cd1b9bb8c9d9228c2ac8f67581843423a3c684ac91d1b733260452de24cc1a0cd715043090b187261481065528e37a40141518210e586c610578b0bcb0f8d5b57d8a7090072b6ab0050da290c31740a49fd9b6c0d22332c502041e3cf4cb9f966f57f551a90fe80ae37e17cf4e61014216df764ac6ed98cf9e87f149448ccf1e5cc4537ef934bde573c7b74f366a30dede660ed658e972dcf6e8671f7d674f92d743b71c143e350fe23fe3d0954f323edbc326e78cbc641e06f79b0cc53cc9b32c368771ba2851aaa892c591175bc2f0e2ca8042c514215c795d5858dc7750f814e3ed0f1be29eb0a93d46ce1a36b5c34807854ded30ee3b2c6353fb5a914d67f4ed333b220a36027afec358d427a910f3f2750a23e2e42f38841dcac97f79c3a03b287cbabcbd61500e61bfe42461436228df8611b1e4d03ec97fd8e2b7ca0de6c973e74f8a54a038d073cb455ebe5c5ca0179fb01190091ce80ae816d52e8a9a0f4212e9a22297e061ec2f5f3e8aa7e47402c543b7ae0b4621e85fbe2afa4939143e5144d867d153ff54e4775810033c94430678e81616448fbe32fa6a8fbe92437bf4d01d047250f8b4df4ec57d20c5b8819c917be2a03c2daf3f145d4eb888dbf2c10e7616efb6206bce25e7cdfb8e7b78d79939333232820248d95b182c054016447f9d075b5673238a18b07fa9dc1664edeaebbd3a4bded4f737eef76046147d8f572f4283560e91ed2bf6ee90f92f63a1bd7c734bf9f49e663c32cad5f43c328ab9c1a8f2501e44253ea73c73cb6141991c227b71bf31238afe492a501c28bac557e6835b3f6cf910f7ad6eddba45f5f1fa297f3b05e5696ef1e543d4b76c6cbce4945b950d6563e3038e5b7d598d01b9e1cf2dcb5d5cc31b46a41b23527373035e54d47f35eec309b27c3b8e5b7aaa22458164ca0514284f73956e56298a4746e38a05cd70561fcd5b4f9437d7fdd1595688e6357c9666f6975faeead3557aa7f9e53458107f1ade55da67b37496fdd15eac10cd1be635e42cddc89939afa9223b4bfbb4969b1a8ee398b796f6f9c19bb717fbe3798de3b496e835e4cc7eb69698b7f19bd6f2cd7f8894eed838155b4d361ea3eaceb4791baf89aa3cf3c6dbb8f2dbb417aa42d8f866d91fea433f0bac483a6ad2130da77c879e6828e53834dc2687460dcc88a2a7e18a01f1a7e17bd5d0701b0f2af90f6771daf0cc67e29cd9b711f7df73abc6860d973ed8b081831951f4365cd288356e131b9b6afcd988739f86cfc080d4d4c0d4c849c333b7f11fb6665c8a01a10183d1701bb7a1c165f029c79bb7119f70bc793f81f1cde28596175b0a9b9acbd855b0a9b98dd8534a578c4fa29bc081a2bc02c73dc729b76ce0e0386644d1e3780c1694e35676311684bf24935c8f33b49f7993f6cf8762fe49d9643f73c580646ef90f635ea3864f37de7cbfe053c99bef163ed978f305834f34bcd9f0192c888d1b6eddf0c582e00cedbb37693e780dc719dacff126ed87d6cbe3f850cce348559e89e3ec1846a4c67d904df65dcee7377e6144da716493fd1c399f673724ce101b8ee338522873cb6d48a11b27daaff11fd6b76af0ea4c0d07f3de87a89f133b0a9b9ae3c4a6824dadcac7bcb85eb0a9798db85ad8d4bc26ee176c6a7e13770b9b9a97e282c1a6e63671b9b0a9398db861c8c4b92fe3331890fdcda23ccd174a666253731a9f1175d8d4dca2713d9f37994f191fed9d1a9fd553aeea2388be8c53beeab3597aa739e535b0a0cdd2bc464e98c999cdcd42237d4f90355f9f9e05f531b45e9648fbcbc227f6e6eb059fb4a80f1dd2fe669aeccff84fcf447d99a89f45fd98381d26ce0b8bb3f4575c427d732b12edf773929c30fbe7959cd937dd91d6cdb5182587c87a5eb13541f6e4542ebfbebe59dae76708517847ff670852d8a4efe4843f37cb376f2f3e341a4bb05ef440e985da597d299f3849e927f4e73c9394fe4518350d1974e781d23bf6e7a3404df65736e981d23b29d4bc65c62db0f607490aee6e5e2696ee50f5f181f642eceda7e7dac5abef936c7d12f1eada9c04cac1166cd25f37f1e949202bba00cd1dafdd0e4b1d67d6bc01da855111d890072ee82086190035a9bdc3fc904fd5b367ed5354042098a08a315821c615b000554364fe3f9cb1152c981a9f30f399c5f82c659ef934bd9315f421a664939ba732e3d33974c83ea9190e877e7a0625a94461e333b2448a91b3f4995b7ed5c8093f6bd2bf84737d1a6e398f4c888a931ea02b287f5890f3e70ff249a8f98dafcfeb5fa41c260e399f45ef241320927291469c4e8e9e862f4644c69f62ce3952b1f1928b4c68b84c9c94d3f017677b1ab28af388876ed9c42b9e53f126d6786464347cbf3c948d05514c434a2a2467cc490fd015cead261d9845af847aa27ee745cf5810e743eb7084b4770ebfbdbb89fa36518160d4a321548133e4b9f3a742648ac54a95cf79c56245056f597ab93877975079d0c31ebefcf321f8a404503c93a26f4259ed827c1252179dab3cc65d9cfb316e597ac150eeec43e3ecce3e4e139d774c33333e342ee3ca3e364e79f6bc042939339bec394d54de7972967c262aef587c4dd374199fa599653ea18ff20ebb1372aeaf6c82693fdf979f31febe3c0dff61551f33e08ce734e27497aa8f49f9d07ce2631cbaaa0f279bdc7c8dcf9821fd43d09908cdf018179ae1ae49ff124e0e419fcf9bf42f41e3c921e8cf29777136e76f86bbd85e311a52d534673835430ed5482a53d0b814334e334323a728014941f219390504920273292e9722d31d76928cb4d82f9742752793133ecb79c4cf243d2b14e36b14239dc3384cc4e215b3de61b722293e41b2220747a0410c9c508529404e744b153d48f145185cd8c31540da3b45275593f3f96a3c3b64cf9dcff6ee9f53fedc0971fee4ec7744a8a1fdd7ee0d69b2ff248e10f8cf9350dfa49f7a429a3b39d70917b5132e6a4e5a1145cdd4c052b6948be8eeee6e539bd844013665a66faa995a6bdddddd5a6b3a408aa2288a821445398c8d2493003665ee280a42485110420829a7288a82d0298a720821a4ece05a6bad396fada9baa8950c11179b76db16f639e79cdb1fea412c8879d9313be7f8cdc1b5d65a6b6d9d7bad35fde65ec362e75c6bcef16e6b8dd739e75cb342fdbdf7de736d9923d8047d964c3b66cf37e79cfbf39ca63a5eebd452befeb005ec530bb1a0ddd57d8fa27c5755576a53942ff5de5b2aa32245edab1e5161801042081bb47864d53e5f5f29b4cefe7caec41142712577b009565e55105655554158555555418710c2ca21845e555505a5901e315362f4781763f1c8201674b1c9f90f13f16e07ef38f6c59ebf0765729abb258d59dd733def4cbde3dedb5d666ea6f6294dc8904fcf9d5f7c627ff18d9131b311454fe5400759bc8ed7231d404942c6ef783dca81174a613fac94cc12cf352d41afaaaa32b38c12cccb41bc5275b7bb7bd779d5555579950ddddddd3adf39bcd3aebeae657a2c69df5a6bae8fbabbdb7fb835190cb0a972483de7ddcde1d5aa0823851951f4b839bbc316b0df606bddad3933b7ee6eb1a9a5a0f0a15c7b2a1a79ef39f7babb1f15f89c73ce0ded33297ae8ea8da21646551ee72f3e1904346f4751d4a3de93cebd072184ef3de7ce39e764b0bbbbeb8a0595d8b4cc4e0602eccbbcdecdcccccdccbccbdc5a63e65edfdde57d3070ddddfd7cc21277c3f51f6ed72053e1999939a69d5b5395e95957bfd8d45aebf6b0a0d69a6badb564ee76ceb9eef6d6ecccccaddb3a397477773f570a0ba2562ad6dce291ad2b1694c3a65e7f6e5558d0934364ee614614bdf36f6c65a97573d75e74aeb5e65a6badbbb5f75e6badbdbbbbc9b9fdd4e0dab4b5d69a3f574cce22271573ee5c9b8c116c823e6129874fedcdc53746d6ceeeda150beafdf6acc61bc3396fcd2d8805393944b6eb199b9e53f1614614fd3e77cff9f3862d60dfbde7100b7aef518fffb96bcd397f8fa27eda397fae796badb926857a281384414a18a090d1e58bec150b1ca6f058c090e5f548075dfc34fdf3d22b1630e0a0e754b97a738b47065db1202aa41a6f8c0c6748f3ca2b295439e5cd6725718438a7dc3925a940712092845e4199c3a6b7165f3c32ca17830e1dcad9a042cab5653236656ca22e3651bea4413e153de50d836ca21c480b2e5002991ee5608bd7793dca81942f3a41d7b754171bb20fe5a49ef849c42f81b41003480b2e0d2590165cd8a44fb9bed5fc940369b18592405a6cf1e7c23ea5de79ae0fa405186ff1c880b4e8c2267dcb7a62b6a7dce29155aed86c5fb1f26916bdb2a9a288f8a15311488b30d8a40fa4851841405a6ce153d1eb33566a1fd83bcf5fef4c38e1cf920c90165fb0e9016901069bf4f52939f781b4d8c226fd1f7e4eb6a8319502ab5dd9312b06beaab78b47d65c63412d87c83aae2fe6a4e5ae2613a02f053e35e167665f229b5956c32722fee65c7a6e11c8fa507ff9f2e54bfbf5f62b71866c6b3977bf608002c0bd7261c5150664d61415b4155b7cceeb911538782be65931aa3ee67b72160da9bee37b3e295f399dbcb28985b4535878f996ef8967d72b44b1dae77cd68bef3bce7eaf95e815a27c2b21c093a36f7944952608e1052e9cf816c20b5cc07cc72a809c93461ac6a5578842a252020d03c888004f8ea0105ee0e25131c2318508591a15231f56d0032aa6f0cff526348c37a231062ca25883911190ca27d49d28c1410ebe0045194646404d1acdf695b38987804c19c6e0833d3c31320252ff612368bed909176d534fbaf9b27b94f376caf973ceedeb911555386fcd294f6b662eb4b706d547731ce7fbfc38cef5c88a19b46edfabf4ed4b7943efe7edf039f5dafb79777b7bcf0a295f62d3f3e69e8b8d4db0357f91041eac0a648ce1a00c2359052ef5c13b074b8fde7973eae3458843793f3f0e25f508075bc240049b1c0ec8f81e36395f4cd7fb154b1cb4fc621580a5f6516f9ff621b9f31eeac39507badb815e45c83bd0333e4d1bd83e25de81ee8e70c0e52711efdc467dec3b0b460c7abf1ee1400c5f6213f4a1fdf254d0507b551e48458735e551ffe117f79d7051e3de828c67c741958f6129d4de9c6bfbee73f64d40a64737e8f2edfa8c29c049c516d0ceedec3ffc6263d373c8fe1423d242fd82ec7b72b63fb728df37db295f6f5188a2b021cda90540a7e462434e3c29011446bfe43993a27f726882200f7af8f24c544b152a50f0953329fa4a3e392977fed33f0ce374e21b3604cae9c437a7dca2bce10c69fefc7973c5829e14723ef4c4cf0ef26473c680905e95673e778d0535576c08f5cddbd779bfbd1edda00caf6c52e569c5828aa87551ccb090646fdac1a7f6ed597b0dfb2cd0c3eb023034b05e8f6ec0822fe558aa71557595b074652e36b51acf02366ffe9aff6b4e80cc790f982dc1a7e745f0a9fd730a50f1cf31c03e0de8f5967fdac5bf1edffc87ab88f2cf73f8c4ffde7bcf55e74921f5c262505105142d4a24d32328471f9800b25972ae71bf5404309e3dc7b4e3d95d2cf5eea164e54a0e163678964550810e1664b0c1e2c90c2b70a08184192cac80315b09c2f3cdeb51118680b1c0722fc0b8dcaae2147a5e393bb7f89cddead6bcf2f6966e8528af8050ee60b5556b18665d72c220528cfa9890cab7f295b372c68248be9148e524392ba1e71c2b6fcd15a384dab5cdab284479d5a817a53698155dfbc0b0d87964ea1c557754cec89e5ca1eb4e767db0b89039027ef8d4ed10d0f2eded3dda67bfc856cef59e687271c73ab9a3874f2b658f49dfd43d507d8ab698220d5970010d46356003507ba63e5a06165b68c128082cd07205a8bda43e0640820eb410010f5860d102a8ddd587004673d88210aea8c1152f00b52b972960180cac766acdfca3adaeeeaaebca6555f51d9c80e6680c4380af475dc0c310b43c7b73f629d47c9e4037810341794513d29c65737df66efbde62931837825553bbd6045bc073aa3df1bc2a44fb8bed8b09e96fcc72497322f8cfd9c98bab3c6db5d5d630cf9f1cea6fcad3cdc9163d6e340c81cb6b6b150d82b0071504e10441a042082f00828b128c6106170c360b2860d8320413f4e00939a0d802042880812bf010c6d11562c0706bad41387fb882cbf55e8f9f1e45f4681fd3eb21a762e1cdeb5f768516601a34998a60d346f1de7befc99f1e6cda71bd62394215debd1e75218b1896eacc4cab0a8785e33d28701ca9421dc2404109a2d803171c62f8a97200051bae84e10628ac808b34e8cce08a296f6a96ea8a2990e480450a585460e906818b6a39a27d7eb6cc4c0fceec3f09683ef508016c5aa720c0a61b5052401ec12647c92198a3fee85121eef0fccc4db6cb1c9ff0464ffb5c3d50b51c018177e5d711c0a7f7627005964a08563016a0600858b0000428d0000c5cf8e10a1424014608650801ca5b4265056a6a168aeab1bab002e747b0699d73cfd7df83c20b25700db64fcf3273114515387bc50203287ef6b87665e818d0200b1da6008615f2600617482148e148085440404f8f9ad7a320d0e1ad572c52b04212a05073bbf31572fedc79db38df66915555054655f56c504ea8bb1fb16cf1623122cf574ea176f6f75cb11672de74e562ed8ac122b8ad858ba3d25a12625e8f80808246835e7af4f3c40545b8d2e50a25ccc04a1662152c7e4086e756a06d88a20b3dc8a18a28d4000baf22841f9ce19900075214010c528401873c74e1061743308ae2e57a3d42c3916b81c9d43e3d660f10a0a8b8c74f8f22d8b43e86a558f0f2b033343658ed597c4abcb3aecf67fbd51ae413cb8b4d0b79675b93bd5a7ab7dbdb77db2d5cc9668fdf1eed636a3e7f1003bbab8f7d37f5389fa6dfc1a6f51ebdb3ee28b5c2afcf1ffef9f52fea8f05a810ebef0760f8f7cf618d9c49741e09997e8f22ae963d3d8af841001618b8e00764d8d6b28f3384081674cd39e728caa773ce51ce398a72ce39aa41e79c7bce3de79e73cfbdd6f36a3ab57eddddedffde7bafbb5d7753cbdd989919a6b17639eb91a80ac28a223dcb5d0d6b188ed9ec523e75b70c0c7659a40ac6c0dc288ffa4f666687de4ead79f94737af6b4ebb9d7cfed34cc4dfaebb1dfb730a0b72ddcdce75777773ce756bedc4efb52fd5efbdf74edcaebb9b4fddddd4a57cea6e78299f5ebbeee69ecc170956555555d5d47992e7b08954c32692bbf2901cb2c939e79c73ce39e79c73ce39e7a073ceb9e69c738ec4a4162dab9ddc7b569c24276141fdde73ce39e7d8bdf71eeb2c75ad956c3d8715c29494c7c9536b7eafdf6386eff57befbdf7169e5ab3bf06dbe9f10f2a4ea2f6edee313333e4062f3629e5cc0dfa74ceb9766aed5a7bcd39e7dc73ceeddbaabbf9458a9d7bcebd76ee39f7d8b9e7dc6b90b44678c1523eb173563bb5e6e5f6e95c73ae39d79c6baeb7ef60299f7e9447bd881efdbadf7bfd5ebff7babbbb75de7bafdf7bfddeebd7ef3d2fd55cddafbbfb7577bfeeeed70dd94475bfee7eddefbd7eafdfebd7ef75f7d3d12162079bd4df7befb5a9bbfb7577eb58edd49a977f74bfeed6cddddddded6c5a66cea1dc724c62be2ebe2ebeae6e6d45a2fee7453ce5a7d6555531735744b089f21d6ca27c8b90ad9bd844b9b389726bb97372de7befbde7a512c9adb78e5b7763b78f99e173148cf355e579937ff092c5829c0f6692e38a99d939276bdeb6536b66fec1566bffdebbd844bdf71e33cb0bbeeea13c94bbe7449e0bb17337b7c7ddeccbed7193667bfdc3cdbedcdea31cd5989979c93e8c334911df41edeccccc8f99297d563bb5e6e51fce9dbb7e7beadef6c712b2e9f9be6efeb675fbf75cf7b5f75a77abb540acb01a9248241289e4ed44fd1042087777174228736ad8a49ead7abbd8a4edd49a7ff9072f376f3e77775b846cd2ddddd6e25cafd1eb44d6673bb5860b9db7652f35a165b5536b7e22e61fbc2fb46427917b2cc8676bae35d7d65dabf3e68238d984ac11dc1963145144114a7492e87cf74622d601ba62bdf9b60e37af143a608723306829030cda00061b3847a8f2ebd96afbf5a32348f1e11a05c4a00439b822062d9e1065073e58313c32a6e46241975bd6fe906a1ef19687e12d57cb31229a87b75c31215a86b7dc927b45211a06cdc3be10c5f2eb17112dc3af2b197ee5d07eb9e2be458aaa3cd0190baa547758569cebd0ab5d2cc87228c4f2950e89587225ce7a23495513f4954210b63ff659202eb2b6e1608390ad3fea417fada749a1c00333d8c1080d4798011072bc7d1a1033a41ef37a17cf5e536a1f2579d0e20e5a56a0451aa20031cef30ba0f0cceca28eff20ab5967c5f2822d7e7b5c2b839f482a00f2832a55d80296268c9105a8c637cfccc085511768bc726174f4d72b174630b0c1b71b28b02e74810a1a282a2f40b1a000010575b002961fd4200f35b8e9021cba80075e2abe7df392638912836fbe834fdb93063885e6072150c219ae2c01095788918312952750e9820d6aa81ce10c57a8410f5820031b2a50a8d0402606574a7087279801087140821168f8c00c7388998119b210421954d8028a2c9630834a16585a90061caf473ee0c1cf783d72039426342aba10842e1061e6f588ca171b90a1044be0010f64b085156a5ae0ae63dae1dd022dc30e34788309a8c0820dd440e3032d5ba05a0a5aaba6b0b3f495152ddfbc864fd637d752e9f5e80b3b5471810b82116568030fb650210b6080c30c0bbc7837b78bcd4239fb8b42943b0a5eae810186bb944fab65bf78bd9ae7137aee9cb121429e94d6bee7f0b53b2fdef973fe84d04e6df194432e52208477fedc92b96466646472689c9cd7bbf6cf55cee7559c101ba2efc56042a0bfc626ca5f9438247faeaf184902e1573659fc3fedae924e4f1109808091244e3c89524595cd824ffccdad9a8b54526f17364451b0c5f702da9d850979ee324861422035e3523e09c18b7d66b3663e6757afe29016820d6977de3021cf59ad79b539984b0b5fb2f8f6a237e2c13be7137314627a42dd771321cdc88885584984046d9d97504e048114bdb79cfccd511f52500ef553be00271bb50dc5d21d6dfa573cb276fb16eeca5939d562f31b3b7e1d12f1ebcfe9403e55555579f3169b3f742e399f59d55ec9092525fdf5f9c9099d9cd977ce6f739f06c4aeede1361a32f51baf473d88c1cbbc1ef5a07514625eb1c0800e5a7e7e7e10d0d323e707010930c2c6eb1111eaf0fc8ae50427d0f2034b75b6c8bca77da00ab688810fa280431d9a00862b3261384323c1a02a4214d994f7de7bed3d3047566ed01e0520c0a63da27d9cfb387904470134739eb17c61e5990b28c8f0cc7e049b588f544b0dfbfc24804debb326e7f7c9fad4a35f3f020214c0009fd8e6154b0bf4f034af474590c24ff85c5a572eb01e1b1c1a62c8b0cadb6c522456105d5f5d1a53585eb6290237378d2aba7523bda0b9e69e0adc738f7900e55d7bbd1eeda08c2f51d7c6b5c197d804b5065f6293ba4ae5610a1b5a786d5457aca1f2b0d71063e33eec6824d3a31d80f1f37a6e95fad80116bec4a655eab9d6bc104695479d17638105958643d52acb6a4a390d0a194f88c31eae70832b7c90830ccb196e20a1ccd894d5c0a6595653cac96a625e8f8a10c6b7d7232364f13373aa4fa0a4e79768497a1e5271ce91a83f480e69cfdeb60b4628e3f5c808620cf17a6404257c4ffb2c15bc5cde6d15ef7c960adf283fc87adac79b9c44ed5a34b9963aeeeddc5d15f7099b9c37783184f2c457d51a8d215ba36fd7b7c80f634d1025332ed9dc28efb4385fa37de2bc3d6ff03be6b0c995b864b3e7ddbe73237c6a3d32c295774ec4a7e6ce9dd81ffbce15feece9a959b4f8d42f1c68aa185c5c150bc88aac7776dd73e79ba4f4943b1ff6b9e3d54d5c4431e5655eb9888205afd80c2cd79834402bcb74a05ff8829730aad8c216cc4087981e64d1832e2ccbb22ce87a8382222d52e0458b0aa020450caa00d3833af8800595e556154d6caa7cfaebb069bd7d48beae59fb90a4ffac7101d0ccf9a6f30198d28323c0e1054448421d809a433e61df8e7c20e59bcb2108dfe44cd263da8dc1741f055aa762a9864deb2e664f5c874fcdb7a3b3699da30eefac2f1599005e8f765083a7f17ab483273ffd29275bb48e7282a5eae3c6f9f461961a8d29d323e6f99cf949fa1f7085609f90f269fdb856087618e5619f7d826d7fa80ad1827876929cfc3df687ae107346e7d92b39f9678f6787d1464dec1d7fe89aa68d67d3c4f10cd7a2a13cececd7fea85921d8d97fece8c127555393f3e6d987675f39d93fe3d393ecbc5f93eb1416d45ce325ed67f62c85f4a8c330e59d5bdaa31480b9f3ea33bede340567f65af3546c11b2a97915493103c2cfb2467966e84e73226ef094707cf399bd0fdff6c7b64bfbf2092d9fd9df9837de5179fec3a6f6a140ef3887979c30b34cbfe59d37394b1605da2704bae31c0a2e53bc73eb8277ce57799c73dcdf176453b5bcf3a964c0d4288ffe117c9a3320c0a729f44d4deb55bcd4b40e2354d33a159b9ad654935d40e0b76739f4c4b76f526aefcc357a824dce9dd8294eb668fbd9c0521d664bf747bb74f707437129e563adef3216443d48c549f13aa76207b20ed2ae26b662e31de78a5527ca1dc99d239124113f49e20ca9bcbd6513fef5ca2d8ed38de0dbb992aba6e78b0969bfbed890fecaad6d4f2c600951f6ff7c5588e78c09e95fb778a8bf94f195739cfccf37364c081b7d2597544e045f9587bdb1a02a36e1afdc525e6d18d2dc7e921cea378b1e4a29b2e6dc60e1905c7ffa93dc22c979c4535eb5cf06fdc5381fc9daa08a096c72f3cf553e49658ae65238d79a3b75eb4d96a47032eb1d752964a97794a57a916b5058aa33f7e89b6f955728304a2645bb402f4a8672f9d6b3581011385e0346cb9b7812d193240946cb497109e816c9ad38042184de91249d1c11710ea18b1347cefdcbadbd7060531fba2dc8a64c993b2588bafe15f1cd6bc40b7a8d77846ef1c87eb8fda76bdcd2abb1a092c358f292370c488d9766cce4b8b558d08dd7f069f3307be8aab309a27fe2d7a8779a433923f0d1e711df3e21f0ddae7fc91dfb3bdacfcb872c9f4fdcf0d97eb9894f42d04d7db90dbfdc86bbbb0d97433e481d28b2e6347cee94a17de83f8c139707cad3dc822d2fbf66e340bf2c877e794718673b8eff74431bfec36b64e3cd6bc869f3738d6c6cdcc9095b4f279ee4caa71cbf71cb2dc823533639a22779130ad027b975c493e4d06cd2bf04c99d5bae7fb9c721929324c999143d49326927872cbfbc864377de4344fb6ded458aee8a05b90d771127462a32eeed4c8abe25931a32c90dd9e4e67d701b52d53471e4900f92ca1498c3600e037ba7498149189702f3cca5889159ef349771293219e3d6e53ba57d64a491de691e23715cdb07465aaeed83c91b572ca78d348e9cb0869cd0923323c99939394b50b9cc9d7213f4ee90dd780f9b9a43572cc88df7e8374676e333bcdde29bbee19b19d978077a2936e555d4b7894b1c8d38fdafeb29ca6be24c72bdf39962c6a5909991c160fb4c11e352c0c4c0c064ed3345e652c46431313ee3cd4bed33054daeeca3bcb30dca37e6008a4b031628c87e795dc8a037b7164b80bee5442cf9ee90e10ca1bca24205df3cc87e796a4a4bf9e6aaaaaaea00b85db87cf3dddd5d0750fcac7c6bcecccc0e784d86976fdedded000744f2a32bad39a03907e59b3be7807e5a648539808148be259b4d8a031688e4d675591891ca29b72e388b9e9254482dca37a7248e90ca290f52c92dca53f43f1ce4798f808c6f0ee59b4cd2a03c03e5600bddb68a60a9cebca63c5f6ce2dedde71d1b0b6a5833fad6647c9bdda5d45cbe796f691fe74dce240d8ad562d6846c2f3671a97d9a94de61af9c54b2e42c5da576c4ce580318c849cb4befb03729ed43b925a753959c196c529eb7fc6cd9fa4fb7e6f2134a79bef8a4a441f98cb941e90665c7c8ae298f0d96eacc1c5e9ed2f26df190597ced95dea1dcd5220684fd391ff189ab406df1cda924e889b35047ead3c39b5359d46700de9cbaa23e4ede669b1284cf66a43eae4b1ed4d43e1b8c6fde5fd09323834d51d487086fdea4a88f00bc7973519f1e6fde5dd42700debcbda88f8f376f32d4878737ef2dea43086fb3870ed71ef5519faa79a63e9595de691d6fbeeac387376f7acae1cda19e4cdefcd21310dee44c426979caf90a9bf8e80e195ff9de42f2119bb2f0a93ae22ae8a97a429545cbb7bb2eed7371e91d32f874796193cb839eae39a82908e9bacc67f4edd594f6c9a4f48e95f6c9744c791c95956f6fbe978f48798e18849b220e0722e2f0f73653f83484d481c39beb70abafea884fd995ea097aca96a0a6f6ec28cbb75f5cda87664bef78e1134d976b0e7aa269839afae2322f32be3d93d23e3651b22aed639349c9aac49ab75a6bef5190a2288a8215849044b22ecbb2ae0bbb1666b5616c74c1306ce990c15c4b876ce244a14396b90573e9449cb7666af094de6997c252d8ca0c8c0a57a9f2ed5676e9c41bc934302a0c85a1d4d4d4cc94281d4d7a99b974a2cd5b3468dcf0133662a3196f8a520ce9a506169443ca2e65b0a97dc920e3db651741320b26e4c923e569b7c18e90577a0773c56c70b16e2e22e20ecdf388528bcc226564e44e5c2001c4f58251d92e5dbe77a202e950ad41b1c11ac040398ec8a82a9256241269a6479447f28a0f3ed8b821e546141b64d8f062a38b0d2e36b6d8c4687303c78ae344f101c4d5b2597a470e9ba5b2b1457de0709c28edb37395b89472302abb65b7d490b1bab0b03d3abaae9bec7bc41c56aae4e454507e30da02b3050cb657aec4c4d4e091e1604136bc688ece348c8d2e6ccab978643958504e17363565230c31d8d4578ed85c27c6bc4f944757ac54519eae5103e78651d699cd17365bd864a305270a0e15ea05c70798b789d2353659fce0ca3e3659f04efb0f3e8098a347cc718a39b225645766f8cc8e8c24193e0188d24a9529cad34eb385060db7b14146ef74a9e4ca3e36b8788b385268b0204ae2445921380db655aae0b0d172e335385170a2e0d011378b9a1a6cad58c9c180f0db01e7ca1171b84fdcf153d4e13a11fb00447924af482bca23233373038a8d30d8d46e8a36b8d06034d8c48972f4ed345bdac7464bef34cd966f0110c1c3468b966fa7a103475c1eb0a99d060d6ca774f10103c22fbbd8e1c6f5a64885c7858839ac284ff3c4c47843d813b784515923231c3678e24ae99d761b581025312a1ba5ddf2e1d289969487f9214aefb4036113a57dac097f905d62f540c4244b74216ac2cb134eb45b372e9d083f4754c248bbf5c3453d10d18804b49b22048ec81131c0a6f61c18052c9d6b88b8847fc889d10fe1168f6c8737c7e13a18111cde3c88f8c6c870b8b24987eff020fc87ad20220ed7dfe13ab0a01d72880c875b7bedc0a10333a2e871b862427048226463930ed9d3f3a38351e9d1a39f4dbcda0d4607e58d721d38ae46e1b872441dee03107358c951a577da858839a6288f4f8fb7d3b4a19fe4ed345d48de964f1a2f928cde69ef8936c2e09d0e6ad2061738643b6e60a631b2f51c56d4c78e89134576699f1d6f3f7accdd06171b5c5c474747103a31e775e8b074ae1c5187bb080037c5201c8848b9107187ebc4f6345ebe71a2e8d854691f9e56bd8ea4b233e52b0740fc014aefb4f344e9a577da71a234d9800a6847ca2e75c0b103874e10140e2c48070e1e59109e030b4ad2a0bc0ecf8105e9c0e1b341790aca377f4e1ca1bd337b4b15df5c75e890e9cc27a47cf3f9c4946fb3bb7c108e23ce240dca531e440e2c884927f69b22951d0762c76da2b48f0d2e6d33c586077c0ac2db6daaf04987b7db08814f948e4d946f7731eb9d76c5a8c0de9143b6414429069bda7544e945d2814ded36b874ebc81c1890f673d8d18151593964ebb384e3d2891c4410392e9db83b760071e9447d53c4a1824ded40441c296cca2171a2c421e3e236c2601f2906f360414dca2e6c6a5f2fd93a006e4a363466d4d000312393c598726070b84e24bdce741c519547a7c91f6ca67cbb8c536ef9f618674f21bb11a7c9469c37a67cbb0f71ca247c7b4e9c8d05274e538d387b0a373851bebd1467fb6993c5b7dbc4e934e26c2c33e2f49a386d8e666926ce1e99382516df9ed9e0327b0a3f6597d983c5097fdae0f2d08ab3942307df5ec569fa29bb643f6597676fd810ca790b3ef1153e7af0156b549c2b466901baa2492594966f6cd21c5e5e7fe875c21803c4e0c2ca936f3a7c7b0e174428e3db5b3bbb2bee9578e58b8276b5582158751a0b0d9a003eb7440b28df9e917174842e3fe333de6ec5d4382ba6c65ae8d4c2d0f8c388b477e6104ee8336e913022ce639cc280143d8cf1197d9a3829b77c264eca17e88a3551a8aadc79e53171167de5ec307156de228e906eb784780d9f28af714b7fc6691cc61a9f89599c459f79bbc5d7e5397cc27c557966c633a1b74c4e8c88738811810ee33f0d331865e28cf1e659148a719c21ce63dc798cc41902e395c3c81c2a50a23000906a00485814ba64c6a628547915219ba6734ad6909c6c51b7934356b9624778a128b9ce7276762b6aefb4e6c0903d578a924df8294751158c19253fc0ef7ca8bf7cf9407b27a9c651f080ce0b7573cb5db4dcd4c9e43ce233b72c57d6f92c4acbf7e9bce5304e9d871042084f98b367723a1a2a9227804f938822f814e399b32340c63367272293892698a8ca83456593a9e62dcb92ae9d14276cca71b64e0a2ab0e72dabb59e1e397bbe61707d609c2f3fa21d3b4c7c71c3c86096917c9abec55943e49a5b1b86cc397faebafb7c679d72ef5c0d203dd0f342ad5c5e6b65587037b625d2539eddb2009045797fe522075decc0e87b5eb9d001169e8b2358e141187f5dce050f54f0a6572e7610c6efe08bb7de0aa2959c456ff9f3cb2d1a7f951331e9c9c0640b2f1a2bf6803272421839b33d2ab9b4dc91e4029c53168dcb49dec4d81fce49b379a9e1b33d97b79aad85a2654a162947519e7df6780b4aefb0571811ebafca2b2c880ebfbcc427f59c4adb1b9a972b96b0204be640997066b3347d9aa03cfb1ef98e9b1c08cfe1385c479b188d0e3f79fc6a6fd86101804810009093bdfc453967c1cb7bccd0c8c06441f8e49194573e8750975b8ead00c06d08e1377adc03e07108973cfc076d624c1e7f3e9b9727b98e38f775788505b920a987f390b36708394d301e00395dc67be42cd1b8107266330e8029048f04008505b95cc8e2f18711b9fef21ead3d43e32a63398ce5992585900b009ed76e0af564b5473b3ec3e43480709c1c7e83c36d74bce42e363176449207116bb80e1deea87d968c1d39a149ce0c08394b39e4741c7ba4b347cfbe64b40f5bf941ce9e929c3d524e9329cae9ee72966ec8996536e49261cdc809218d9c59562a6510be9265e3d4e27846c36166b8cc8cd340bf7c562539e4b2fcc959916c6e7068cc98612bed4323674f8f8c9c26138c9cee999ca5d24a2b94b4f27c2521e22d9f4988983d4f5ae74a52be3d2a8730cb4aa54ace2444fce599acb1dede703989e4ed0dfb439f042f08af2bbab7665ced0d106659a95455b3a7874c424412229210f130323dcf5d7a877d96dc347bda726a616424110a86bb64dce57117ee7271171277e9f9e6854756c36d70dce291cdb8459344e7699cb1201ab72a27c5ca2d1e590d9b48a5cae291412ce8826c22491229cef875e333ae58d00d4663c969c4bf7ae2abd2cfb81589dcdf346e6dd5c1585e72c5822c1e99cd0cff611b0c08f4f1c14998bb981acf5cd927c7615cf934777ce53ec41ebdc39e136ba2f6ce53c7a2f60ee55654e59191b3e62bc78995d788ca26183975bef29b5899323973bef299ca69c4525436cd883672b68fc299a99ca527a7ffecf1a69f3d7a2eef2ace4684904bb642d9deb042382fe5687b43f3524283e99d5823aba43e9efa703f00e5619f37ad0b51eb6632d854521f9cf36ed5a053521f69c8980c3e4db642073ecd243dcdc5e002343e5595b3b3158bba4aea837ae630b2997d4507cb9994e5cc9aefa13cec4590e2acc948ce979c4bfce5a458c5997d55795579e556b45e18da9c9dbd58995724777ec524a5af2aafb9c0c82c974ddab3922cff6117db67318997672759243a3cfba2219bdc85bbb48f11edf2ec93bd3cec71c5154366f9bcde923571b6b79e932ce7973fe7964fe89625dd252d399df409a56539cfdc9272ee15277fe6d69b44add810e759e6165f4a919c82a9a8607e79e31315280e84f9252749ce85c188586fc56041649c44aaf4adaaf28dc227cb2b6f2ca822c50c0bb2646393564e13493e1361fcc54a52804d587c52e32670a018b72ce8975b15153f6351b03fa05f42ce2d223372f25b4e434e7eb751feba1c460b3abc3087ce2d877eb962432eafe45ca2c681fe9c647925a710cb2b2296574e013e91fcf285b23f2abf6455cd20390d16e4cabc0623723de9cd908f5443f218d27b3e83e43448cfedd15b5574cef9bbf65088f5d97317170a4d842e13f567228c5b7dcdca5d7549214bca3c49013639c7e293183781036155e5167fe69388a79c0ac6575ee3d92123eacfa410c92fb77c566eade58a2de0aafc49925712e7b97358b99b0ac643f9c6c82651ffe5ce05001d8b8d0500e5246a9808c64fe7375810cb852e09bd0646e47acb929349d1570e298ad27fff6608de724b9719668ee02df7965744dc5bee2dbeb47d9a57be9810ca2daf2c273de5517e12f15b5ef496cdd5245d86f961eb923812688eb9039a63b2e8ab38617b925b579c953ba7a0ff702c7a52d42d5f11f5537251b042506051b03ff4dd4679d73beb1d6b7a0a0d27dc9c2c74b2456c01e5412d9285599765d5bc057d96deb262e21b23836e798c6f9cfe3172882c26b6878958bce26591620539874dae897bc6825afb8dea9e870cf00516c12c87b145ca97bc44e373c73f9f3daf3e337ceadcf8cc7975cdaa29ddc84c6aefd0c4374646e3303030b1d1449352aedbf364d407e522f697f5a4ea2d775111bef52e2a526f511715dfbbb7aa7ecbbaa8c86f5d177551aa3cf3e6d961dee22b531fed3be7619cc66bf844e3fd68e410d9a389ed611a0b42f95053dd5fc3a71c36f1e7f0a9c6dbb319398b7ec661e2d479187fafe61f8dcfd2bf9c7ffeefc1b88d63f18d91d1f873cca988c921321a8cc65d79287f11d2c838c482c8c8c89c3364ed242c68c6170302e334fca76762c96184e83c0dffe11a3ed9784b253a4fc36d6c3c475299e10f9b512375d894a90ffdf63d4356c3de9ea90f8a1dc65f9cd9bff634f0697c5e4fe334723eb79c8a337bca2d99b83ff31c73c582c44498388b1ec61703f29ce43f0d132fd9a43d09632cc892436424d6b74892a87d55c326f67fb149d84eb668a691aa7074042831f85695512abe4b398bb9d89447a505323dca828c7f3dca220effe48a751c99d7a32cb800654646464640ecbb07cb6a6f27eff8c3a649397421ea63312094439e45c00f9bb8c1e5236c71be864c1f3ae5950329fa1edc2ecbdaab41c711d2daf76be530f22b26a4728bba5cb4aab8a4b2aa0bba4572cb2debb965412771f94a0eddb0e2e4b7e29bfb503677a90f26fb9437365dad8528cfbab5ef044a7ab4243d7eb9c716babb9b77db17dddf60f7362fb4d6f44b16d7dc77bb5f6f0668dd2d4bfbcf92146b28e695676760e9bebecae6263e95d8739c8ae71c366dc6a667bfda39a425a874aa96e973450c3ac790a1119a49002883150030301c128a8603124d54541f14000f93a65c56210a644994a3380a520a19c3082084000018112198216d00c95b065e65fd3cc27551dc8222c2552c37d1aac814fe97141a819b4296c99a44d0c5570b689f0544a4bd23e18e8d1de0f2f00bdff97c3598eb29760dc5af787fd2b9959a729a1acd1aa6e45a94c3c7897b6f483a0f1010f2d64052fc3a4ada9e639b0da1e617bb9b42bf2eb277d1acd271d20b9556c18b948106eda9a18de22bcb0a15b194f06e10a61de741ad0f151da3b048c1c4b43df4099d71e353bb50854bb6cf3c9dcf7e3dd9dbba2e8e9e73fd634e960f2d54b9d128afcfa2206ae5474fe07b6aaa7dc04ede8eadd8a4fb2dfc22bcc7b6218ab771148e8007c92b763917a6835dde339e1a1609dfc4fefedf14b48fcae013c9bb39db61c14a2fceb3ee6cc2edb17482c4934700f2c4866012a29df3dc655ac9d9b371d56678f6fc5cda5524777c83b7f612634608a35ca2a35908e8fc83ca2d01143801a4d3707e66d119998ef43a1312ee7eaf2fba9167aec609dba9dd5b69ade8d889b1a839e9fc82ee392bf60daa51b89da1e95f00ca90a99f8f4508c8ce0e3af75b18eb669a12f06f03f340ca157ad6b61c9d5f6e5723f2377c8ca82b82698eb0bc647d64524177f027205d4762662f046bde317b77e2c8de792c9c6a469dc80f3c5d50139cc255d437e030ecddcbed9035a3addc125b3650ab2e3127aee0be17362517e2322e430d31cea3ec7fb2cab225bfd434b3746227fe9a3e9b94bb6ca7fdfc697e48d7387074b893b61d2aff82fe7c222705bc7ab362635b97278c83fb29043f44a20edae8718372c329b64f74c8712c1ffba292ddc8debc6a72bd8a1d698905bdd374fc6109efa95dcc98428ada3c5b048cc4803df212ae7fb7e2a93c2e12c65092f4a2d0113a06942f67f231246d795d697878791937e83ddaaceb8ed7c5a764eec98b6fa08a81eaa2aa744fb1865f170681fc61ebb6170689cf6f6f80a529d33d0aeaf7e85ae3f07582c975ec1f2796b593b32579ddc1a57e0cf17cb8b2ba56c660b380f9e7e40decbe7aa63df7b02ce0ddcdf998ee8a076a0bd8db5ddf8fb4cdae74573cac0d542da0509eab91e79a852d465c5276c92f23d3460189e68a863753bd0a73d377d53c552f4059583f133b429434d918a0a0ac5a71c269f1d43bbad42ed93ed7e2a4b3397227c9eb937a2110a748771a822cb5d68d3430e271100e8760a0163db5e10783e00d16663a580ef36761447b7b8bd40611fe14a60fefba6b509d07f98b45cf40b246e5f967b3fd3e61d94cdc46c54d22eef565e27eb21108d8cccda5bc934a2419020efc5ffb40d463a89f09d03b9060ecd01b890d3503c279f1e0ec57dd45d8d3727c45a1475e9492a04678c1a5c7fba5f3c3c79bdb2be78e775ac81bb5299db2f8aad78770bf84080e0d4aded3f782dff3558977ffee8778f6be59e4294b1c6432aff8ddfe8538d7972502f7faf038f20423fe92fbd57f254184595bcd88267cfbf783295a5eb73efd4f2071f87ee7a778299c8a5e030295f31a7b446c182d44b43ba612551e4409543513253198f101176dc37213d22e54f5b7088b84924c0e4364f1fc2c4a1426fe562f31d12f9c7eb48f2eed985b879d096163cc379a3776f723f23470bb1ea7a6b7e7c0c897d1f1eaa1806239a600e00f716493fba261013804acfb6bf72eae4d19f63a8b9d7db623e93af8f9505208207081e2bda73650eedfa9208f9595dd773cf09a5114e44ff43e785eebaf893f1195500c4bb8b2071213617f0f1939ff25d742fcb45e0ea2c246821a9039513c854bb410ae2c2e743cdc2bc4e30f21bb287d6b7722bbe98cbf2ac0a344b0cbd4e955321e0875b00e752c4b6004988b6af3b9e5638161b9965e2d939410ef8e4c6da6326deb54dd8a4882de02961ddbf50d020cc0a0d2dabd2155e43cb6d29033751f1c9ac910250413f763be3221926e8c201d13451e81c79de799e9ede865bb874f062cbbcb3ae51221105a7ed6b379ba2cd2962cdfb7e1bb0c622d8e8cc88ada46fa45db7d59165720ca69f97b99c791e92ab4508c1ce288290fa1e20367841ff2ed32b8e73c94531fe7eef51dd680000716e1d5d8e881c742e112f10b24bba22972bc0005a0ac761714af9f24629c5a6e3feca756901ddbad75f8a42eae95dae7fa4c61e6eae4e89209e75cc028abcb396d6c14b75d1069d1c70443fc2065093e1679e0422fa20f88b8641992a139f4c956587c48ac870cdfd9699b6606ebe52762757d222a2b0b526101fa775e9ff5ffc7673a13837ae31461a5e4ae140460a6c4c7235097ba548b8f43e77d49c1c5641cf8b9f888adecb8bfb01ea0a033a7d43d3ce4b67754c5bc90094cacf3af48cd2fdbfbaff6c77313502ff851819791bfa70c2776341098c06d3ebd61649ef8d0bf317734afaf83a21163073428ba0c2dc3e6e888e81201972d544e0288dc4ef4ae3d2e78b00604f60b6c014a38628c3b958647318ba032976c4ad903af44a2ddf153fad3967005d58e846a4091ec827d20527e1e36dd76f57ee4c8dcdde9cf8bbdebc8e78e870124da16d1819f6ac93c01a58e456dfde329c5311a1af599a1abbbef95024f36a3e3aa600df54f67364b7c7f457c143450ba0e448af44558f3059e0df615a595d11f115be2b240670fe442a47251fc81ef497e3d478518a30ca0be474fc1ec000e6044205a2312b69c8c011875f496a8e316cd95c513dd9a11db7619904c666dd14f8ac6430fc82c896d95169f408364e923758985fb4692e6a50865371d35deb7798acd8a4110c96979ca6a1fc0cef3f1429345fad6c8fee0a30eac32c72b7968b8ffdc8ea684b5120020e05cbb77e8e28c3c4fa8582d11594d7f60ba1fe7fa2606334069c82843c748909e34e6a5dcd36f5219053ef6227d229ef220809aa18ff7cdd05d7f442cd688e8f46c0dd5404639b7a2b5dcefa5a5c044f68a48d35a4688e51b7681125b3055f971aefe47c648f5669c2925f6397ce1d51ab2645e2e0dbb87717947535e30dcc852264e1bf4cffc90a1a88740685b008b7d0268b577aa56e8ece9ac84962a11c4621e0310f14420da3bdfbe2e2ded15bfdb33c4f69f382b4ef740dcab7c03531a83518c56cac97d60cdc519870c729234911528c866e2929b33af148a66e38ec44943dee2609b72655b35315f2cb43625aa59eb9c70eb7c8cf617c9684e51c933622f87c2312c695881800c2211b9ffb4888b2ce340c401df4c087b47aa738a33092ddd0f4f1f4080c634bed35295050684a98dafc419048af85c6ee267ef94cf640aa02a54a641555ec9b7d245ed862ce6931000e8c7750a2520403887711d6a798b42be5e5e86181de50520a24c1e14c8233d1d4676b1fbd5de487d756e615dc7797253ac84d5a621958600a7166902ec23c657053d3dd189fddb7bf59181392c5c9b02f685e1784c8e5dc120027bddd10d3684462706aae145e52798b45f7e7bce1afd65c3ccbe9cd16a14d78611a3a60617e570819186b17c87308c63bb6df3f38cf3f0fb5bf1740c1a8c23b3ca5a3fda3dad681c8459d00310f58276fe0cf3e8501c32b87bc8af436d8c56005daf7897a5a868853dd41c06fe59b76082af400681235a6179a516607fa3aa6ab15074af0c444bdc846de40e746fe7673115a3e49441aed21ace0eee69aa4536aab617054c3f41af2468db3f4eedfdb972fe40222f65c0511d84e4983e7f793c6effeaa93ea06bd613232671ac02f409ef430e9192962a5b9359531609b4b384aa846eec0f662574624df5968013ae8835aab275586f64ac1de2f12e0457a1e76f851de4b015bdfe559d787501785218b923550d87a09f191e2b4f0ad588d80150510b9f6de8bf57cc108ba1588bd5cb9e81a803a1ad1e0b7fd34773b40978fc6e90653a0ea039ea01a2b53710334d1febde6d5765490b36000a5f4731e55a74d03cf3a967469260fc08ed094e51fdb1d9b667be2fb28108b3f04498e27e4f5f672a6ee52c0e8d11420e372aa6907418c18d55b984dec68ea6aeaba7bd73328ab26e9168b6a31e93d7216a01d209fc9d5fcfc051086eac9dbcd8879bc876b724a39be2b08f27ad117f7d2053267a919fc3acdc70002c15590ffb60a2487b0e5a3bd0c12efd5d66a2bc450c03ce000aaf97d2da5f9c0a2ab897a1e029b40ad09ef8290f7c4c1f594d3481a8f04133c49bea27d9aff27261cc3bee8c73217e55d22af784772b28d180ed6bc50d76779be2460b21e8fb10c215f2207ec98e94d07683a5f07396de7962cb9cc3bd40ad8949e9c2d24f1bb9bdd47eac0c4430963300413fa5cb1c18ba4d74b69e5d745de62c0afa8052cb2e50053e0173bcf1397d289c4e7627891144ab5226d35c1f2c02bc2583d77bbb368d11acbb6c2607f8396be26c9bdaa1ff8e0fca481ca0c956f2b97c224f66c9d93a7438a63a80c9e9c694310eb134c3f12eb6197080dda9e6b6ad46b6d06bed7c515fc6107eaf98b59f5a2e80518c2e04cf1248a48b1ae2d16a090562b54e2d8792cb217a3994608e68f9a78b08dc32b0f7d8ae284460667f965a5ff929cfdc9c5e0b3bccdcde0a1fe53c200c5e36099523e4e469c6580e751dd83cb1b2562cf8e609fc22a377d8c293c1bb4ad68efdd634c12254343f635131eafcfc2910e1df08181697b2e9cb2ce11ff651f68a67a89d5afb941516da95854959d2aa08890b91bbfed95c73f5f15b5d2fa2be4d1fcbd9f0193420d196f75141673c311ff6a28d599693b5618e73f6906046f2d04192eb46a045e8410b45494fd992b5397acf5df0f5f3db052a86762845184f604412402924e32ecaa18aaa80e0939d70be740c51672381539c9d33825759df62df1af3a25ac66dd4fafd9aa3ecdfa786a72cd0e47e662969d16b0aa1565d08b81834b7868fa037514cc3d6d4e637922e36cea616e632dd964c622cdf913a7e38cbd823146e5649caa83f96818ddd0097dfb1627125ff0aeb618462c218e2d5e53a912e0c00b157a69d97e01136431f96e2f9b9802a809404ea9e63c73a76acbef12f9ffbde0b3be1085427b4e6456a3ad3feba1c7173bc841f5c40dc0ac0f109160de47726a5b82a7ef9b0f21e6244e08404c450a6d6a88924852574889d41ee98d84b17150d222abf629c99b95e83e72482f09a3ee4a1856e9b9a3b439e0175d4e1dc9dfdb843ee0932e4a1607ecb5ea63380731946e1019d98485f0686e9c194a87972e5fa6f63392dff881624b96969e886c65c5758dbe4dd9a9d854b88d0d31c9a482b322f0bbde7655ed1dccfc59e1dc09f79880951a1ddc463bc0c0e07f2a2f78621c1e83b2a0c8d7ec916927267f652b82cc97d4a097910c89f020ca1ad881cc4c1601d52d63874b36efce62d87a55c238a61ebdffb6d25adac0329ef29688ecd6272283834db18e51fe93f054cd28d298db18e577da81524da2141d0cc9b9e28b250e6b7f2a1be7f410cc28f71f41e64d31782ddebeb2d4a3f695474aa1be179d9c4971574702b334aa00f1d4541d79a87e3fe9e7b3f358f0de1f347264226f9405ba8fe9af2c090c7479aa736cb74621bdf65618fb656774c38b047eb8c783d6fa9d359d74da4fd82383e6b6c7d7316469bd79786341b0db05a863a7af0cf299c600940cf010bc39c201e778b73ec8634f28c478470d9512d9c6d47e0a2e3f9ec306cc3d402397bb3d3479ffafd720adc480529777b07933396cc5d7ab10065efedafd71932603990fc284112916a92dc7d32745a477c17faa0e7de3db592d92c8439ab364e5cd4309fcd34d00d88b8b89d9d0293092a057addb393014f73e529724e5039485b370ca8baad5cb02629974c0adbd11e06b0258f84816bc6d4d9739aaf13d42365da7264cf14d407c2fe01da8f598cdbf5cacddc99110814174f514b70c9e3fdcf92e841d97c95b8d9a01da7bcf61c4a83fd91969177b099488847579ed9315056cd824fe5ba453437f5afcf6a967bfff076c3a4bb2ca150b5401b9c15eabe193ce7156842280a28e13378ce048a0971f55e7139b93a0acc0918dd28dfa4a84c06a2a51a0005ad9eb0cde939c37987c1050c9e0956de52403d37a4e92143abe92950f6d44e4ea3355b386230a549dd59d23f86daf9d6839d78c30aac71ce5e62524c81cedf922e9c76c5e2fe91546189694da853ec5440cbc870204203ebf520834b1841b574d878c48052217c6c90cf2c380a82cb03bb8f81b65c626e0b0b06028bdee617b22e1138401cb4d0e47d918276180eff010b0ff1959c813db1710b5328f5c419eb61f176d54b4ec01f6777cb8dbddf96f7c598e3704fb368b0ebb202c8438f0a9750060df0285a261e348da01d2f1d6f6c9c59af9bcabc1aa4338efe7a06ab64d5543dc20ba1fcff0e4e38663401e49bd4953dd61f9fa8851cf7e30a15a0223caf425312306165c06eb5efac732425de3ee9c51d567565ddf87b2b711d2f97c5eb542f86ed2b450ab189fb8b988749db7f89a2c2603bee732b80c338ceb36cd7fae73a61e1d407a04150cd62bd19d03f30371b91a6fd16ce71340890196b10abd3763bd1901b7743f8f59bfded775b1c7b499e7b1ee3a49e0c6dd495b58e868ac7f3b004be129d8920ad9c701a4a1144d78ff83816b0780ae73324c2ef8a7b3ec9cce297407bed7d268664e14240cc68f4d2af290066440b8abc62148f390175d54401987a48b24c1f30565ea180bcb8bf581de92ecf280c321eb32eb7beba3b5afb827b9df4415682b2fe31146f790b0bd02609c44ab8954bb8e38e8b6cc3a55630c6242ecee2bbc193e3b0d1f7c42707f769c37c060daeb71510c666a09f8b06eda9cac030d862b4c818b262df0cca22dc4a63542c7ed937106a09b54259c88d49a55c6a39c3d34a2296f71014a7c07b571b35c1f4f9bbe428f2ab8fbea54379fcaa6625677ba5dd5db57421b5c14a9e3992b35b8110c44a442caab50d0a2bceb7220af96eafe1e5a4137cdc51271ca34605e10d29ddf134f8088dac5cf58bd852a2d4bb896f8f012231b298602d3125a4f999f13a7519a2fc013e9a53031c0f30f570e0b3377a4bf5f043e232f3de763652e6d173f0a4720c917a617c63a785ca3617a23fd13ee19190d61152f6d584c19900333098b9b6a4e56ba0e4248fd97555dd7292565f2aa10ae56275a2c3eaaebc2e463e639fec58471c2a7786046f5ad9f6eb4f30d41ebc58f04c6c51c35fe4aaf4467d5a9f8759db3d949614e4f358ac0ba591a0184ab5ea7afebbeb72cd8ea872d392b0fe93a8086994b964a8082c50b7396c38425739eaf46940cb3fdce7a20b97f79a8966c9e29dca688c7c9b1f3ae1fdba70b29ba40e7069f2f742fc4929ae3723f607f4ad464182d0b8b43955e1976f11c9a0f9cf8a7e2eaa88cb17c51c2a80e82ca594e89074ca6a62b156db132738ab2b010f728c07fbbf3dac830670b7ec3dba647032fae1d3940e9eef7ea48086e33e02d6b6ad9824d47ffcf70ff09d332b9294aaa260f4102dcff9c3c6944edf937788abfd71cb69f619966bf191db8b80961755007a685d995f1469564934dc7f50657548834d00705bd0210a1ea937bd3524443b7cf00b791c6b8371911ca86205a51bc0117ebb4cb0089845ca0976337aa85e6e84df82ad3d2ccb44d290446fea2a3b619be4067a24ed5198642955080472e7049bea65a1f5ea6b725e319afeec4caf683f65dcf0781433b68cfdb7964e541f9c39f41a3b04cbe3671fa037c0f3d30c485dd45b056306e155b82324e189f3ccd85a2c741e1425dc5e8918b0e70ac6063db82ac7e202e84636166ee5b750d5f3ec43c496a7098b94032e4d9cdc127dc9252328f20617b3ba095de6a0359153b835e63fe830af1cbb8b520e1e55253cf70ca9f465980718e4aeeb094f1ff06bbf62119ef80feb24b66ec735cd3d5bc16f6c0c453805af24f9b6a53903fc9da9b34f5ec1d51ca03482b7f07b23aff95a99ab46619b50f30e6d06f7590f119e32d7bc6e6b6e4570c391f43adab8189ff73b3ca291a251c2a66b297a64ab577462243ea5bfefb60d5b45f98bb9ca476504b3676157e40edb8174c9153426714dfdef2777795c8fcaa0d9dffde27910993b7307a5fe1d626a28a519dd70ef2f36d21d940a0780e272dd5387606ebca7cdcc4e8ef73ea60dd99fdf72ba0b87eac0dd4c3d1a508898855be3f6a1a4beec30a068dc492eb3cd1b844c6dc4e14509a99e980b18b686f318567097c22ecac9907dd88695864545e852c7f83065fa276107c4a82902b98e0e163bb23062a094c4573e8b756c097ba22e94aadfabab907b908cd81699c07ab628d25a4b9dab8cc5da4ba41d10c10552f0f0897cbdeddeacd1fcdd74d24134199c45e6f51e21adac07c5046501c9bc0b582c31c6760013a72c65c2087fd7da7c40d3ec5741fa1b493fa8b47993d0525816b1192f28cd7023bc9496182bce43f639856a326f359b704ba992dc2906febb9849f8d5490454db87f1ca8cd83ab7ce0d3953349a7ef2d1bc46ad970d5644166e6dd075394b370ccfb8734c7c351e55f14cec14ee5d32fb7811aec50ab32ded47b5b4a75c2689ce8e9311b444466d2b6e0d12539d922035afd61b585035390daa4ec55ffa5321e243dd6f2d8d5494ca2d2dc0d77040203ac867967e2a44788ab7232119890d07103b2ab6c1194d5e7c3b503bd8ed91491fc803b01b5d05861eea051f96514b449a8630f1dd7ed1b07539e5cbd1cea27319a6f0cea5348c3d94e3a10ae69f42e84f16bf922fdd2e88fa0e3642dc039af193b0dfe5089cda711dad2cc4c543fa07aa7f2de933bff9d3f42f8c8f7ffa24ea4b335f5eb52045a46ae36237d097d13ad68acb7259f796551ac7c2518396210765bce2e563d73eb338ae053c33620d78629f61e9de6f85dc0ede045bb7b23c2e9ec8fc46cd37ebd4aa1c853f33389764d6aa47dc6a4dd6fdfb1691b2ada1dc19c655fb1e71cddd16007727eef77de19610908e0fe3246088b497a1029f469160318a45236358f769f65164fc9f3ae08b84d790f70364095618eb57fab490904c2aa01dd6ff81f5837680c6cf730a55861e284f5f518ad6e85712c95042489ef787cb1bf34d2923d3af601f2e09ee579bba0cdd929333b5bf8665a76b6cc39570eba6a74f92243b36558d38eed95bee1c14de21d43aa9fdbfbd32bc0a4fb80bba4b07e04835eea4e08156e315a20ebca38ba5b6f949b514848d019e3cbf54aec2a9bdb9843d5e10d4a93046c5d1a6dcd6000e14c44bc6089ab2d606c6c30169778bec65ad2c44eadc30e8193f76546ac966dfb7f5af83812b5cc53d5e5e97eb7eac16654ceb069bfbb56a1c15f3b2f5cee784c554a2024e23aa93bead1c59d6df34405d5489aad2b1477b38bec8f8ca9b43ca9087ba033166c30a6944fa667e83f72ca3c55f40193a5c63ba4b055fcc3b09573e951d42a73be8406e80d80efd97c37121308997201c156b31611e6952518e9c4d9ebb3f4d774a70f06ac31a2fc25404150f55ec895bffffd387d92866d8bd21af67b2b509efadf4963905dea68a27b37e508b6c365e6946330aa27b9192ddfeceaa21118bae8b474c5142b447b469bce34085e56ae2187d3ec67844c72bbd130e27b4821492dc84bc58f921d0c3bf65e5194f1aa7a559c6e8283b0bcd897f9861e5274f628b3d2cf6efcaba27ac44c487f969baf5d8674a0c921d532028a1e4d7abe8e2c54131335de02580646bfa72fd33ee3808d3c88cc8ff74ae744096815cded3856e4c4f183098e9b9d6b86d34cdeba517d37a2abcee5a961216126eb2b7e20b11c0508b9bb98531576bc6a3e1d19ef2a5d476ffca7568759b0c2dd313456b42da93ee8ff3f3b4d3ea4eeaf27b7eb25bf6e09d2a676e1a42f860ab63ec2e4179418987261e6006bf8a6847243d3d7c2271aabb0f4ab2e6695ee9e5b1799d6dca4c1d071437a784b842179c637004e2aaf80428aa4a6246aea02e0b6c8aa2a9e68bc9b311ba2331a9d6bb0442f257a2386f3aee7dd6e2e46f952142c9db8d82d50390c2b1e50e4ed32a1ca48b643ba21c71242943452829158403ae1615a679985a74fc5ce68be220f47499cfa58c109a1421c2acf9984e85909df51e847b05979f39f0b93043205469278df41a4ac75bb55cc0da143f94d590d62170d9295eba13b54379931cb6cda2a6297c76e246f40eb9be01eecc145d4465dbc720d75d2a2b3b62e2919afa76c41a9629467a08e324f53a5b2a7981dddc362a52d0e73a125812e66711652834ade530da041462dc9443f9b5c341e2dda10d54420c942bdb88863b0d12258e9a8042bfcc7a41155e84c792bb6116477497a3eaba966d492ff704e80f609768bd5835bec28f2fab00b013805ca6166a9eac6a2b6d770ae1f21fba62cf2c548aaa4cf9f11d4c0797364c4e50e0c3983866a2a89bb8a711662020f6ea0b5960dd1c42df07255046d2bab3f2965cba940ac2c3ec5ff323ffd292251542e3ca9270028740a293125a67c584bac8613272fc895edc8e7511d3a1eef141680184aea00fcb3f4ca86fce79ba57060c234a9cf2c21da3bc6f98cbc469c542e18bb3b543ea7388ec1108c207f6c4902f360702057d6055f059c505c88890ca63fa04ef46919698a2f4514ae537472ae108231143b98995c9084848ab8c6b4314fedee23605383496b64b57add89f18e2ed4f59d524b05abdf7c2d96068175c91d120a29a0e7eafd71a60e18a2df3c783a314a68b58fb53197354e1bf68cae8831003c1bc32c24d8f872ddf01064adc490c3d6102850a0eb15a7a0147cc37ae856ec2a36b3853595b668d0c4caf6f88af85c02cf230e8ced70a90aea08ed2d992db6105a8be15b083e6676a99ff8dc0a83fbdc002e69933e4b49fc09f9a3fb83f312e61dcd127e47a266dbf506a9879b24089efc5a6236d64fbf56229186e812700c0ec4d10d48b9bb3d814a363211090909c73ff8427131a67ef226269883cab2cdac8726926255bed597cd4f17ad1b8ace0e870b4f4dd19f3167f9d324c3dc4d6e7d3f9a84236688edd07044cf06583661969e81c9bb7050f9e5a702a087c118b5d4e573df4f4e804f0e9ec1705e88274397f8e41eb9d065b1a0e5dc3c783e15fbedae7620bd3d0cf3ca3503c0e54a73dff838f5811b8c0a4b633410ae4530a41be3598c2ddf7343357d3e22fd5f8016ec71cac219730a32e41107d1fbfc2738fbd52e5c2d203e7784b623ac5f5669dc6b65e6359abb1add5d8d66a6c6b35b6b51adb5a8d6dadc6b656635babb1add5d8d65ae38ab8551a44a5d6d3017dd0d2c2ff004c4f7306bc7e716a8f969700283228cc228ab3d647cd7abce536dcc458b0554c90bc7b744c48119cc1244f07ef39913f8c29d4c6f0b627cd617f402b12b2d768ced8a5e2ccf43aba650ff831ad0ce4e9f1d6f69f6c91301083e16b9dbe81c7d41920d0f48f244dace56112fb67ef8c17e8a8ffca16ff47ec89afdbe7dbbc0611849270ca0c065de20005e16b0f461d8b2dc65d98c32ad78dfe982ec607dbe7042a290a6f42a70abef7eb0c244d080b84c864571fea23a5afcd7b70381e731d34190144fa05cd179b10289f950850ce900732b616adb10aab63525cdb5acb9ee281a3e8b1a7d6b9749ccabc059f77201f352a19b7598ec747096ac20bf73ce5a1527256d0c6f8826d8508580f98348976756437d414911e4df3689ca63f555deb130f77433f66e9f778e13bc7ceab0429d6d26db87411b1e6f30de307d1ddcded3ad15d68df205668f06b734e7efdc0cd710f787212c6b4ab7ecf7ae8f18f0dcbf3a051152a9900bdccb39209e9f4f6b0f2e9d8e4222433b085009f3f449d81a360fbd35dced8f5e26bb1ec286de953f6811e13a46147943b490a22d1a906cd624ef85c09def565cfd86f08f3e0b7fbe0c743e64bee3b5f555ba62173faa90d3981e92bd6627cfd4ef65f4cd676ffa21dff84a2e4b451b8f1fd6b05ebcef5b95724cdfac9ee9a841724af94f4119b0055fa71e27d03cadb6e6496cca3ea1c9b08e06e2e3b38ef0dbd7b5abb4a69c8f98ee271777b7bac2ea9454aed8517cf39bfd37839218466069f3eccf2934d150d33aa4aa6e3ccd624dd40e778d3216a0ec7510a3c08448426424e6ed7a6e95b3b76dcf89dcb2612a82263697666574925c2e68f2d6240d8de5217f9228ae77dff6502d9efe8f1a4b1a5a13405f4a058eca097e3fc480e123f6e4639708c88974b75c33ff99661cd86f234b6c8585385f688d8a7d2b1436e0053622ce715069cdfcbfaaf22f23344c91e20d0d5c90163d325532901a48ca10e2ae2cf76c98362f519f8e502185ca36019ed4bb8b1193fffc1d398c51a3b9123cf1b1124aca1ed38a51734809141e7c7b6c4fbbc41fa41867107dc04a4a7b3fe4cd0c27d8870ac0b862d813d77287fea071e82721bb235f49855076c73aed4ebcac06927621bd866bcecf81c14622d00128bf44001e70d25b442bd4680def4136df25c7bb498cf46e723abdd4aa06c5e5f3618dd95b4733b0a96cc0388f28f2e645c3a23a4277cdac8b01f253a080177760c23ee2a7b8d337c9462cd8457b637c6ea7c683ddd47487bef47018e81165faf472d3a393887b3de67ed0103dec253fc24e5daf8f3343dab3a96684612a9e3c3cdb620ced7d8595ddf28d565fb27cfe71086835e70b8b98dbcd9ff022de443f345ea2dc9d358ae6ddc2772b7fd4d9e2f0b24df170538d0fb89bb45e09c92b8e5abffeff0bf22fe147f7e1d67adfdd7f356f1bcd2f88206f60b80173099fd3ef9ca3aa535f4d8c8051cd622e355aaa59b148683e64e4d1f56c57bce7689cbbf7565cb275c67271527074f27b1b4e52d6cd48d773a71021e5d877ad322d261e0f37c2f1328beaf0bd4dff7b6b44f4da8e3f3097f88848279a5d64b6e4dcf22fa1a91d0b347a7db7d8574503d3ddd17cba3a633c1cc857b902eb2baa1aab26efd6b9098b9caf6007a5f71b6a5d4b0f1075f65d2ec1da4644cad4937723127a0cd4bfb356a7f83e0f5ed1664e3a75f62cbe8e5f78f339c0f551a56b0f8bb1885970052f8411d3fc35daa23c15cab16ea7e893a3648e76e225796fc2003aa14354940fb94711cefe1379ae383e2392242bf288710be4fce2571a5f4138d88a5145b7248e7fe9b357bcf0baf739cd0b9fed4b9a5f6be387aa03a633ad3310e8ef957c45e1213df8874f26b5b64a9fa57700b2c95802b0cdf64bc3df6f1d1db74c26c51ed1ab8125ef0b17f6ce3aa42709b2b75b102b1589913df2204cf230aba77393b18b68cc421132ac29c44412bff8247db5c91a3e73303bbd62aa1469098931726437a7c34df4d6b74d31ad46ccd365e334dbd465a9b934cf1e22da9aa69f424d7ae9e4d7dbc6863f4265decfa1368109479de0881dd0bc024cbb5fea7113eb071b38af3a3e199be7aa0101b5f3a93cc08980dd99e34829df2204823cf42535854637ba67ab976aeebaa7fa1dbd3a906e6f4f7978ee56def1b0786a2b66fffae818a63a501e193ddf3bb11b8fcacfa26b832f972054c3552ddd618d8981a2fdccd9a5d2281b88abbebb3d1844f860883052838778d02729ba3fcc3756c4d6fdc58a33bd5e6611e293483333950a63614442b7faefc989aa5da3efa8f83c9e20a28070d2fe20f7cffb4c834437c0751b9f72f3e58fac8da379dc8b80546e9fbea5e53dcbb172aa4d11e1871408191587b76b01752a68406ebc783402fba05060cd363cf2c03490c8b7766191beca700669bd981b3cf3f220afa9f4a8e2477536de347e14acffa0ca7fd8147d8a9ebc48dc16b6176ab5cf819dac48f20eed3825fbc49fe0e33675c39ba7774e65beb945da4e89d7079482a422c436dead65030103748bfe8a151ff289293d209310a5e8b9fd1cf458bb9621a46b4fe4924e39207bb73e5b37e7a84b34a883447274e92b24df7d5072a4bed8449f0ef1cb565e3c3f1d25c299588859730a66277278929a999ab070f55c6fda4be8ab97b168b3ef0cc2b9610111f85d2cbe7db22935983f60d9dcf2a1be2eaf565f6ab8ef9a58b092a0568239c36b0773e070d5ebefce22da569f66ba73164a342c75c43ebc6b3c81f200ed014387d57285e53d7ba143be9c1071daa5068523c9c6338e96f43cbc2a2391e514759d1e0ed9070abd4d128a5d0ca4c2865f69490005d85fb0c07274c79c165f3e6be1d2607c2ecdb332cc463dc264c4c457872d3aa23e67571fbe4f6bbae9fc5b3e87a66674b22a273f6e824ba5003fc73d860ba1a5685cc0a90802bf72335a1f665dc5c6caa3841b8686f71f07b318a63e62ce44dad9931315b199c1d9b4036b18e09a585bfbb893f37749ba3757556404b6dd9592c4c610d8504548ea4c62f4aec5314e18500e1328b1bf44ff8b080f11867daf6783d01113d05d0051e1a00c3ee106abc3de5dafe6b7be8874e3230ec33652189615200ad969b74d622544093b4397e9818560af21f2af3771bb9b54a514d777815982ac8febcfe542288ac17674241c7412e29038fe5fbfa3a44a9ee05dc1a67ad5af6b7b919a99446adf0f399dc49972b1dac3ad5cbc7641d8c1684e9ff80d1dc023e693a1772327de496d43580e28c76ca01da6752cf82c461410071ba19ab8849f7bbf96ff064431f881e28fd7674eea742896fb3e058fbb0c8eec882ed6950fc640760e103e66c93b301051c7cb39a2a24770be34332d5d7a777e6b309409fc7de7a95f992d840fda36e88e663fb981dee270c329f4ccd6e48d4be5106e587f3dcf252881b7eca0840542aace17efd4123358ae32e10f19328865248cdb29216b4d48a241deb697fc5d662c0cc770444af16f551c9f9fdb9f51c986a5c652aecf58f1b99b1b4f04dbf1b49ff5ca66b5c746442e9a7ec09c79b56bf674030b8861e0289b0398976ae7788b9fd27249e3f32250fd381cb2bea9284849bed6a444bcebf82da66b91649cb1aa5124b49401882f09d8f4d594a0bdcb5933f261fde9ef109947be8c3c90e11b5e3b08961df377a11b5cca56913884de2846e709b79a79420a01f081d1d3eaa7af0d52aacd8c62b1487eca7d817e213f02b1b508dcf9d7a9b6c058f4891f9bdfa17afae3fac3449f51c4fac3ec352e1d01593aee61080a6c34cbf80bd00423faa90f18b8b4900065eb016ca78066dddc38aa000567cabe8368846ae763aeba90c440f9aa339eb5d7e339e5043c84f4ba923d92439afdda28528f8694203cdef868a298a0235be4fac4d455b5ee5ffa6182a133523cb5e873072a84fd67646a10def4ff420740753387cd20c5399a0b407e18b8512986be4cbe2bd538d4d16fe8e156e1c28a2123c62b1f56ed57927e724946535cb425203dd1ec5a948dc0d74cd660f2e9453175974812dc1595c32e1832eb110415898b5dc17da183e62a7befe549e14d1ba7a0c54980e1c9fe6243e5ce0d8e5b4c885eb7b4a9be6f41a3efe27a21397ca8ed6cb8bfc07ddbd23f2d99ffe00757a47e1c486f132f30a140ff5bffd14eaeec74a26274185a89ff2f34a6d1c0bfe2076f0ef7fdc87385f9cddb606bbf8a33988e3d7e7e6449142c9e104f125d2b4fa62c2e567693f13c38e635eaa44e7cf841d86b3c877b76a3ee53bf542bd5d15b6c3b2b68cd58febf1eb92c8514308179e9a5ce872a05564fcf4ab0ec46650164bdeb90c8cc3c1bee82c4eeef82e04ef94d1582b1bb3156ed1863aaeb17dc65533ee90974bcf29b354dde408fedf06856de401a421db5d62efdac88a4a47bc97bd80570e96b4e99065d4e04a776464b85a175c58734486102f1cc5e73c709a1b94062bc3b7f3eba2ebfff30a096e7838c985f90904589f83e32fb2a810a92d43d4daea3e87d6fd8f8ffc6c331f4de087274111feb5490ace1f97f9e2ed6f77f70f2ffa7f8b0fdf0fb79cab72361bb5a37c3aee7f83747485a11e0db7e5eaab44f77403a439e3b600cac894124cb7b411a133b8b26cc5e9824b66e1aa7a694136a99c9738c317a514090bfca9343cc96c02c54d2ac6cdd813ae73d1722a5dd497e6b870b7a7bb4b53ba9723d9631f7a8c4d14a6a39bfa808beb5bdddcd5a618013ec3caf2052ff706b4ce17611e649b315c6da9edeae7c6cb65a8fe2f2b2e564010d3e8d2bb700cc26bc7e98ee0435fc113d62b859e9a3f09de1b8abb3ad3483c6e6c8adcb210f4825e4a1012df401a4cb8c48dc156fb5f0504534b309f40bf498384f5e876017c85d95a8f882d874e2808ddb180650a4e19f231ee79b8981c9511300fbeddebef5c4cf59ca48d8fb206a01d74d5edde221c815c10452de7a8057b2d2853eae9daa8394c0298a264945524d62221ec6aa8fdce526ff7099410f36f945651d6cfc9df932d71b8c86dd239cfc6a39e770913b76c857aa23a08e6f706161e88816dfc5c096cf43bef94cab155400d6ce587b3a51bf8ef8c4103267d6e8d9cddca95d260550e955d9a6c342dd0b8704b84edce4d8b40bf93d20769df94656b45d011b730129f6f1b9cc8eef55e4e48427a1536515a04592a5c0303960f4577d898ab324c0a9f1d351cfeab0f4c4439008831d02ba4246735fe2e0aa739e0d2a572604261f4aa159137d8a3308d9683fea759ea11eb1b70921e69250ff45fa3e96af3df2b878beff7c970b0f095cc5f952480170e27650631b1022a4f4392ffbeaa94ef01a1134a8f4e789a22c35fffa6fabc7f9dea3baf6bed127507ab9d28978bf70e5d513be3f47cbfce1b269f5f45ee3eff945e1b703fa0bfe4d1c6ffb57763f6d452dfcf05ee9784a97fa1c632d5f27e60cfedc48202f421582bf38a8607c821b82ef38c8606e821b82ef38c8606e821b82ef38c1ef412200fc17ad976f67936f09758249ef41e336354f3b5433d89b682f27f2af694073d7dfea9c860630053aa584e7ea0cfc8548081efbf58238c4a6599a0676998f7a6830c8ca04c73877457ee4d30be7d6794350c517eaa25d11908d6148f3a93df7f3268c998cc337c879e14b9add235252d0c0eed8c03d326822792007a895ef60a5943dfe70602572cf070deb5a262e84c55720c7c47735bb2ff671259cdb974cc3d012c08edf400c4330cc30f26653ae1d7411cfce82b3fc1cf617e2460c792c6fae29a1defe33cae4e9865f0cce2ea6fc897250d9869855645ec50c79d814451a24ccba5752221c16ff5315e0a3670f9e5d19608065dc59f81544d77b6108a9ab9fcf391142c8a6595c452d91fd978c355d2c229fffc1ed19c34cf817e86eec6aee7edf9de30fbb822cb0def7a2b0d18f5e025b177f2afb72473347a954c5140f9c2d38fa8caca1d55f8d81999dd2f792a51b6ed20f7a4301daf2f95d8499212b93757364d6e354ac317b26f54b612b48d9243d91cfe25995a21203db99910d3a87678e79ded2182e57093d1c71cbac035acde264ef78467417412160e11e89c9f0f64baf372c4e1989be64cec9b9f7a292fde2193943e456502238a4877fa273b468265956acc5d4a941711b438bb77942aac9885e2b3fea066e1586fb62439b7e2c8b62b3357479728915f47c94063a26b441a90b41a26e5141baba5949c7c2c59517aee95a8a275f262dc808552bf079e98f0f085da752e25ede478d9d4d7e82e047c8400490f354f6de122147ce18339467834d34a453b8d109964b51a2a625bfc79cd29fc462a0d269f5afe556a9f75e33c4b09dcf1f51a1f44cd8716eb95086ad1b1263533fcd130422e7c5b70882497bb782778dc6d99f7d533ff4309cb9473a03b303a733b6c9909bd929325da0346cbe38bb475fd4a93b888ab65673943fda2ff81cbd0a9f76c60ba6fec6809886466fcbb737a2e9762bfba19a86fe690c67ecc1634d583a26722920059a9fa30fb99705984b65e19b76fc3590d98b0ccd22a7c0e60db92cd8221bd243eb998777ddc63e6be1ec0033d56e3fc1fe102c9b0804509dd6506c5c2900632ee379dfe538d6abfabe11e44b89093402811b0c2a93fc1293d9ca691e8359daa560417a7cb3da7d37855b4f1c56368f190dbd195a31019be75d87384428b1b3dd73c39e02b39918e059affa544bf030a19fcc159b9aec36f0bc5a21395fadb54f1852b61fa933f8311f4ac872e1bacc6a3a886ec21c493f6788c13ba801083222d85e3aecaa2a092c22c365994b83ea1a2d701027fedc93626a506f56f3ab87301dfd4c2dc64a54d7fb6133507db69895ee0dff8925e644ff10cf38e8781d2a0a91f12b994b5f41994a2db0787728b3d0256556f9d008133609f03c7235905184e85a5b3c4f257a3afca41ec9e1a748bb2911429ee3ca714a79ea174b50c98fc167ef0d7c2416bf1c1390b47d753a9327df6ac8a95ea8306f968b5dc5d5edeff0e95e24b64b89314173b8ddf8628554aa1ab9f8198eb5659475db6d59031fab8b6c8902a4fc9343c4d8411cfa0d71c7927eac46217053f322f9e9a5dd75b96023d518bb5e673b7942f503ed94258f8c6b6ce9ca7c2440ac3777663d949580302203326792e5ad3fe6fc8c7ab612f1feced835f084d31bcd517c4a655dcdac3e0084b1fcf651fc5a64f5254179079216ceb14d64cbc82edb5ba14716fb551c0bddde2311ebad461164737237a303578648e3caff54b13c7b9fffc21de5082132bcdb55e78c108ca3b3b384771797425c8391d1abeec24a0c04e77c398a31f478e37cae4e31b243acaa179a3fea6db9ef3c7080307efd9fdc04d781c14610257327b74ba223233237be2e9ff2fe4d24e47924e18f3215bedbe5e6099d0f8255886369f92f359acc0e8c185b22854dc423d9b9685ee643c30dc61bd6d681086e97a09e0e02607e95cdde5fc2a39d6e6d2fc4add9b0c81925663bf11122b1d640b2d71bd5ae1e2857a18e93aa4fcc66aeb63b2ebfe50bd9bb5bb1316d1920b4ff4a3f583d891cd704520e8caf22916757f45ffbe3b2eeb755d18092a69528b38a024428dd9060e20dee0d6ab4e3119234c93061494e8a9e8b7110967d74b0bbd4cb208d6f430e589df8782190836a2771c823439d56e09650d4bbe7504b41c227c0332021b5ff445fa8bdba12f8372a5340569624b9a5b62064a1f268f06651547cc32490c48023dc36dff703ac8854d9ccb4a80a8aaf302e70097e267fbcaf8c8c62e099669c4741f7a8d56bd6c90f33f284454ad7a87aeaf055c765abf9a97d52f5cf66963c11ba1e40a18a6e5e29e2b54f1803d0a4161ca43a93cd5be7bf7d1290af54f1440a2b43c11f0eab5e85ea80fb969e5f89db0faf01f74db8d286a5ca3dae65d1901ac0a36450975dc639b49d7c89224fc187bfc22a485edc512d346dde5bd53599b79afa632f5f0bd90bf987684021e8eba99dc8de4e51fa1d82a5e474794e66bf32fd0d1f07a4f8a3012eaa53a03eabed51081fb41a8323e2971588ffc382535b93f5bcf3f827dfee5b785743afe32f6bd5448072aa2579a79680efd34aeadeedacc90865f382ecd393caf50d8c13f0af58737fcbaa6fc941280b280fc397a68c69f27be67dbc8c63f6c111307c63b6181250d89ecaecc1744437b4741aecd3d2d4a231cff71417a92dccf9d084351683cb5d3a1edcb49fa0bf66bdc998e1f0c4bfd01f8749b631b720040d8831e03650fa28f81b1d6d5785d2368b37bee619e52030c6ef0394fca86201e7b50422df196e85f0217096753aae8f5372c14da7ccf447892dd2b1382050b462bb344fa014a67e2f4cac275cbc475bde0024f8830be0b45713488cc4b79d463ba1735f3540e7d63fec5f78dfca7d8aa72d93a47bf83a3b0980aad19a187963e390ec4e05098d6058a73cd3bdb284ea66b671103155321441652575d5af8627a95cb9b6685748632843bf6ec9053bff60865abd5d0f400bddfe3b91f046cd6f385d717c08b89f8028338078f783755da5e610feef1554486f9b2dc972e3e03f85bd0eecbef52c7cd9fdedbddf6fb27762eea552f1ecac088958fbf2593e4da5d12cc11962067839987405ee2cd651045a7ff08b020b0e5953dcec10627b38160b1c490c8e80919ae7eeb925cbdd22926596f007359104de868c4dab8cf8cea13134c0a0c43908c386fc790ec3f95f3773d64f7b501070e7b726f5f742692da2b3c4aee51a60bb8ca6d5779cb7af11f7f7e06c82955d88c5bc5fdb08219f0322e92b50bc4661a953933063ed611265258222e15c75524b23397d8f87b5ae443244ef3c94b7bea9e8e6dbb25d61f0f74a75edcda65aee5eb6c9049bc581c28523c0139f9c998b0c8f825234e4dc3849025809452dc7214fe03006450218d84c7bcba6ea2035d53c46b24e09cc592cc9c189248aee46af958a52441696ef0d142f2f3829f4666612bd95d99cfbe60d67f919eb0a7582ba9679019cbf6f2c20a9d7bf1cc29ec92efaa1e05cc23c86e503792325aa11d9bd54fa66b204901905ce521ca9f65c405653788648619d83f11dcae42d91cc3ac1f501fdd80b6eded079316a26b8aa099e2b3639102371478087aa50a222901a25b67346a6c6951c1967c2c81652b6f1ffa5af80c761233ddb66d747fb0c5ce0d6b1a20e55a525867358f2f4a01de5b5b49de5a9199d8d264cf6321c726520d09d5a732153d01b28c5e3230c045d86c29643807463fc74c55afafd3dd5ab92d9bd12ef059a39b4073a7a8ecd573d9145b63d063bf17835894da6eecb753189fb1ebed5d2b302bdecfab84b3b3a99a0536ca04e76a82140fc7eefe1f97d17046350735d75db8bbedac8d5e69a230198232a57a4c62d04eaa7dcd1d4fa47e480ea17e10ff502aff4df0d8814e62755143a6816a75fe5347a14a5df8620e65a1a444685a8f3d705e21957eb623b4b13b42547dd495e00b3beeaae51bd2e7bf80d476cbba8fc929e5fb104c1745a2ab9181e21378e737129062dac5abdda63992b2e7cf4d842c1353fb39729b9d2c273a5a41884b66fad18ec49f78464a7a62bd503dbfd34af07e42160c6fc034bdf1a75eb5e49ca7e9902b21cd23612cf8b3d590ffc4db3b07210e962e267a6adce230aded3c977119efce5bd356c0231b8d3831b24f1f7175b4d0cd24b92c9723ed47b46360d573442d035b8be82eb1f471efb5b9a406602b17d0b029a30fce50b2ba25bd05d0cd750ace9ae2a572020d8f501a7104d887721eb703ae99f155c95f63399c1d3b0220484723cf76010ef707d6392b06ca529017715f96bd01447db7b2bb4a97ca1e5c7aee0004c2863c00c48e0a23163ec5e393d9d38153ff38b735bf875d9d904222c47da20982d6fcd858e2e18b4edd82bb85e0fdd003d7836486dd3af8ade1fd55ed6e900fb5c4d303110a84f03a3d42b5ca0a8e7b98319d59e5b15778b07909fbe1500eb2873a9a74558051a5bb8df25f230cc9bd240083a9a2955c05c71ac0b4b2a04cd45b8cbc0545c094def6d80108152282a9ee4c3f5344093447bc6677902e7805281b5c6f031c3bc032dd27a5190de4d253b6302fbdb222a377671deaf997277bc6c9470ed7e037efb7920d517b40390195add7259c32a446db9c2e0cf322a9f5790bfa96b80ee282ee34a42db7772420ff29f8806bef1a1f5c77e62c561a6373f8fed949dbc3e1d81da3ac5d9c981ef8f5b57f342e1325f9faefa8c608f03629ffb22783b8a30c99a47cd7e6fb357c51eb4904fcc7ba9cd4c3bd9ca535f7770637e06192031b350fb0b493f9acf4ff65049a930e7117282bc89ecce8c59c7ef2010e3e964adcae55a9d3be8de83b6fbc2c6997845d77b48cfb97fc0355b53a0392e0b298f7ad354c1f900ba76d1e7757eeb929e1e701bdaa436d1aabd7f53d68ab2516c067f955f83a605e33dac3ebc8d82c56bc26c02ad0a70e4513414007174c7867a727079a4da5827010308f2e3cb2d90b1d732e178003f9008ec529d32dad8e38b068e5f2cb65e49451eb997bbbca2c7b956dbd6bd785adc2c531d666e11a326d053833098210950477ec079b2ba037bc42b97625369ee54c5bbe289beb9c17dc0cb824824331c61cbcb310f786abb8b84ce3bea14f7f590fb40f0ea069f1fcddf6a86721c5b169e0da9570bb60c8def577d7d0534ef33ac23f93c679f0d1d05b8c20deb3e0fe97d2aa2cbbb7ace0f8c53e5ac520a2c80f6868b433862298536e59af61d2d4833ccd2f98655efc55e5d1338c8422b9f765629d3147b7f02fcf5095cb4716dfa5365280ebebd8a3fd80f0917b959a612c9d0d95ca811a7b75c9826765e80515d263827b857e7b5ddaa4c780abe59f027426793e6682ef8195af528935b464e0dfb8bfdeb7323aeaa84ed5ad689d61d31855960d34b2929dc8c5363eb5b01aeca89809b19390d5724a6c9c537fd8115ed82cde14c01f37a182dcbb328dc5145219a037c1a6244b517b8188bc12ddc0a6392bb9d6822a6356dd069ff1e960a205455bc9c73dd6bf57997807410456c6fdaacd1e872b384e25b6628ebbdf01a4fba287ee08afb134de7e00f9c06abe3595fa398df17a0a178d4a1ad3ca5d1bb6f84c10734bdcff08f8f7f6aef79e8c8d10e99d74caebe2ddc6939e6c60e8a958723c14e9a32f99de88276ac6e87a8df35dcfcc6c6ce3524bab8602fc714733c093f1a8f0dbc53dd6cc5e73b7c45e049d71e362f947c0f4cb176a72b821f8f19ef910f277665f954270cc10f72a3bd6ae7b37fe9e5cb009cc49d683b9abb4cbea6fc0f62f64a2e3dc90b252ddcdfc9c29d32bbc83e75560f463aaac7538fc1191e0a8067dc90b9343960e5378fb95deae0e63c5901181f06845b8f7169a021671d36b45d25d3b86407ede780af34bbba4de722ed666b39db04bc6067c10f2ca1fe41d4213d6bce1605286b22f05681ad522d11de54dbaf2399dca346a80682651cdcb4cc12c7ecc69ea21b4654368082b5ced2885881819e8fbc00843e89701161d0798dcae303deb6bf66efc9d95e35c27a7e978e2b1b418efb9cd142cbdca6d883c16a41aef3115f30cf87d5ad4c3420f9ec7e119eea0bd24b186b280969ea5e0990cb77baf2a68331a17ae01d7240c0d2fd546bd60448bbb1fd5d430107f87e42d4cf6e622c5044886e5ed6d11de9cc3e9732e9a6efe31ac00e9470830b4eb4d29b3abcba5e07b46a4659cf0d239e58de4ccae4b8f1ca27a5301325be43b4dbe006808dcb0c06f34348e46e5e215548e9e2ddc472c0947c72439418563463ea894682474dc66a4d80bea3291e3b528b70d60563d2c182fabbaca0a0c96aa5804523bb739a9ebf116c203cbeffce0667f9d987ee5fcf5226d75dfdd3da207f5024fbdd26e5e14e4d2cd92f3036bfeb5c593f446d3383463f4fce5c945be5fbdf726dbcd34d228a0784ed5c80740ebd0d3f71743426148269553f8a4fee349602c4ed8cf029ea9f0f6bc5f43d995861ceac159d3ac80fa6e6d40380e9ba730bc2ce9e4df929db5da00cbe8b4ca517d1366376828742f7f1aaa9956a4ca025096a629e004147ed4b1ec6c5a0496558ccb8c107d166c9eaea7ed093aff19baef24d6261d603df13d4e18d5e1deb5df99f0e7edb2ac58563b852bc2039982fa8af99211600d519385617edab89b4e8c6df1eeae030cb0d6463ffef23a7e4810c37e91b57a67cbaa1b8c9a54d1650b02b66cb3af159a2be67a833058d9d2309ee546dd2df7038cbc86582ed2e42c0cb31324a51959b6930103e7f8e795d8ceeccadf08b46087d6db56dd2a8cce632010d182bd05e2a4533b97e7cce9a48844a687d043a7d5df4eb901232ed481c9870765393e12f7e3ef92fad5feb282ddf9cbe9e977adbd788f0980e02fc3f5cf6f54f5aa5dec6d4c7cafdc6da7210ecde5cb6858655d77ef0dde0a09c20346a61e713632b193acc3d8edac4247b875eaf0563aad96d855788722d0be13cabd7cde927bfc9ed2992da658abc3a1537bc4b991ddb7710a7f36a385ac69cfaac701d188f5e418390c99980ac1f29a372d7bb0a41fccb65cbacfcc8b3fa27baee451541019e0abc281b85deed9b03ad372ab4fe361b166490ac2b06b0e148468273dc9675ff8d4f8206ac6ce6521ff637d3c30d478ac3d6528da7214ebfb662b7fcc6b13637942147f7cd414f9f52145d771c31ab24138aa5ef521472e5da3f184a45867cdd6e200dd0f10608a0fe47991fed2ba9800acbf7514e411b67280562ee8b9a0d1cadbf65912f3f41ee0094ccf8a38edf75fd6bf5d4133c150b044fde160835c97f233440e3053a80d74986239dba19a3ad727265553e73d0daa191495c29de6015ec6ab8ccc7cb86574214762c80b5be9f0a3e6c48eb1113997d1b4d0dafafef00a5137a7bfa50803057727ec37b35e65cdcab581919b0bed77d09673bb0bb2b5bb24c978678eddade4eb844d50474c772e773a4684e0812519437339b55d320fe7b4c280addb94cb03fe8f60db9a191a9b911df7378f5d26b9fc01ad478e211aa3b06bc2811f36a082b491c04d732cada6ea1ef9b8e226fe96c3283dc335352e0e909b92350c021858bb3023c266cdff9a0a1b6a7f0359780dea2359b5098e150370090b59acf6fc80cbf6d8c273a509c369e2cca9587ef0f34308ee9bd1310150e55c5770d8ffdf5ec17305257ddebe396ef4f22dd1399bd3d28e6ef9eb96d91fffb15f330bd860095b030f361d0863768248116622872e186e7dcc98727e11d04f289e5aac2ec0023f11a812659877bd25441ca9de8fc8315f0d8419488be480b776916b21f1c17d20aaa31245dad0bd86104de080f9ffec8ac5c3c52ab224348f56da163eda4aa8b3b5a0a16b0190a788978fea424c9908f26068d07b8ec257affc0333cb3b41d3ae4bb87db5f3a9d226aa3f4cc163181cb13f90da5bc14fa18c5aef9bb74aa38bcc266f9ab75ec02d35bc36b49efa9b3a34335848b265b293c7fd0a483f1a2063d9cf5dbb900c9f8afd933f43bcea1452c51195c34262e07aeb790451e63c2f718a02847a968a40a18bbb9b73506c2b098d7b79737185afb5c9528ba8dc50e40e1961a5db340078f09352db5b9d9b752c9bdbb5073bda7ab9437ce9205f2290ef489cee3034622311959fb4feef9bc9279f12f1f6fcaa99d43e55f438eedf298968af6e5bdea9dd9312bdc8ac028e01883e762867e6d1ed0d1adc4f6570408e4e4cac8824b817f2f4d57623d0d87830e336203aa3820ad95194039d635cc8cde6eaa0f8f2a399355b055a926f7300f718c641af6a6274a579424379226dcc8462086f204d2803b30f22a5755b272fad395c10cd282f5ec0ed3cd7ec5cd58b615accf297756098bc134b89555cb71075235b49a3a1dc8fec72cbde65512d571f5e518e028903c9968492fc32393cc9a5ac7858665f6a8a292849189cd99677a39ee34c753dddd46262810465b727f904de44dcd8739f06499793c0f03c529ccf64333471493d2b0919491929209dd8db4b1e195dd83c14bf9b62aabedd4e128874bce750652978078557ff4933c0e0dabd3e846a132d33a0bed2e490c80024910085233eb2bf39e11c25b24e9e8a1f71381c88079eee65f278aafa72c4ce5aa71722fcc60d94540bc434c1ae9b6b3ae329cd2cf34c1996679e1dfa2cf447b5000fa22ae205262d428975101d366fb12c183aef869b160294a716d31d64dfa123f3605557f4cf018db77cacdb416f0a35c0d90d50a9ee207644d9cfd3122aa5bbcdcc5496021f2db2ddaab213fabfcd81b890f77a384e406eea2495f96f7c7f2b668ad0da5510d55c370b13c22fb68748718e6426b68e930528e1e1780c2f7e90baaa326ef504989317e1a1ff6093bfb204c876c944b9eaa68b217c32e4d9e2b275fca96315165f2cfdbaae42a8d8decb9410bcfebdc3b2ac54bcdfc888d21d85f49fb713d978ac813b389e466e60defece9130dc55647bf7498e6bf5e7305424f96aeffc4a2407d6fd0197b8be1cc602ed26d7897808a5a54cbcfe18e49142c331b70cf3db00ea5976383f8206aa110a3d0435a141e22540bbd32ec614b72165d8fe6e99e5908abc6f51414e4180fa377001153a60db8db31c94a77f3dc52872c09bddb730c0097bd4555d7b6bb43af464c7c1fc654a7ad2294ca0f7b3a6ae94576d88bac0f26c18b822f96ba0018002abc60c299561ecd83044c0b008e8d0f1de6cf1b661c4d0d73bc22a4d47233a77ecb935ff99ad64122d09636bc226ae0c87db9238308cbb83d599be7f989e63ff88fdb190521e546fcb9f934579a79f61e18e199af0c4cd0c7bb81922940735431d447981c5712327c716a09d6ccde76d6525f12c7208fc0776b9a4abbae25c671d39a0a42406962aaed383bf1f433462b9a0642c02d1a1cc74aa805a5f7e3912ce3caaa7c0195393864986af451fbce9cc70e6d0df21570f848f09fc06800fbec686fdd7c559fcefa896bb9cbbc2a04591f4cd5bde17ccf7319867f42aba9ac27f3a5e7fc20ea046ddf00d22538712851d7008d72d81316ad0b739974c3d963ca8e8299b48610bbd65dfe0f5f391d0ad003bd005209c80a0aff97017d2d42a209beab8caafe6f89728755d6b9b86d89e817988eb3de6c7e8eb9edd9b5c8bf8a7ef785816c7fac944d02e609a4ab0a907f4616f34681456f5b9c80e7c1d9b1c49b6f49904147a0f4981af89b9b1fc535f6b7ca165428896e9e82fc7deca99b8897cd793791b6b4f8db363d8c938520748f7a83f2a9d697e9588c27180a02cd1c43e2fe2c3ab565cc3e870eebf754ff6800b15d3abbbda36cff9ea910df27c778241dfb7e811a42626815225fa6d1068ae21cb2e7d0dcd2e29b96bcc46e371a852c75b1c2ffcfd30a000716028822357ecaa66d4a9160f53a564976a335561c6b7ff54291e5b3d2aa43c1b2976c358c4840a0a2816d2cdc3e24a793be592325ddb26471de0ac3a3fb582c95f5254cb372f0910cecc487e75f663350f9143498c166f19dab59ddb23ea61a134b9377153cd76a9a7bd39b2d6a58fbef16786eb191e5238e7d6d4f3d7ccd6c414114213ba363f59150906d509fc3d179b9cde2236d65782fc4b7d95fae3741a32369008271c7c835ea0e6b6d427ef1ca2cc6ade97e9c03447d4af29253d6a59c7c01c27495ce11cce358b150a7c43688ea0d37b490f1e72368b5569f79dbf09dfa002a7b7731270455b69e06e8861c06d743fc6091ce6dfa2fc0e975528984cc6e462d1d705fedd390b07d1c88449751f00e5fa9d3efae8cd0e78a87bf11aa2327010101e27b3e668e49ebfbbdc25dbc0eb25e9432c330b3d4859f65cfbd35cf859261c93d3b0a0b1bdd409e94873b6b72071e31a9e940e20e03eaab1187015fb1f01778dbd0722c0f7fdec67202625d771d97cf7df55b66ee5aa20b009530b40b8e777196e2b4ff6062d8e02f5fe1f8906dd00bbe41c99b737ab50eb28e81b3bd469098d4634ad68b5b17030d156f7226ab027a6686115cad97046e77e7514fac4442c9046108822a01b97e0813b8f50522e8f31bf10ee2d5265810e1df5d429432a0c0fd061ace752c70deabc28cd28131b0892901b03edaf5cbba4d28d38d2df110b02e8bf9aa16eef6580186c8f59db72366f387d01ba8da46b7a05fad4017db6c45910cd83e2477fc046a644e4aadec170e6e2c0a3603de5a8a82f24014d89edb1b56da418d97f97b39acb0c6993f1368a01125b1afc6520dc273dc7de5cb66b45f992c99fc6dc8f09855ef42f22ea8fdcb1ce15ea9f47135654b14cb6e9eab9a733163761516184f06ce6f03e24b2083c36cd1efd8334f14ac27efc542265b6e01216e5338bb5cb7f2e1b1fc05056985fce8d5a2b31a55671019c282c49990de758be38de7180b3948f0a5d089adcdd06e3321999a3130d9d64274dc2dce4f5181cb4a2ad0e3e92a4ea19ef82bd512c0d89a84a41a8353443540c75cb9faecd2133cf03edf5bfee36644257713a033b8ba8bf3176cb89ac2472367eb9f3ac4b2603594416bc15ac4ffb283a0a93c87370fe9eb639f708ec8d670cdf521aab75513bdadf321e4a6d0789bb301ee84df465ca206c7d3f1463d95f780cc7a61c620f7eac52aa8424a890145a62cc90110adb91ad8f3ac6d4107f79d946f430f40040609b5ff12ab35bf7e4b068abd0aab09ab52b0d6cc0a17c8e3c246f8ffa2fbec99f4ac8d1e9905c11609d6609cd0d65d44bd63fff3182d7df073704e9b427528b96fea64978ff4926e825817b7f66006f2b70e34a4aad5ca2f07e3deac062cc7b9aedf8575d6e0c5b4e74011aff618ebad67437e616b5624b48808917aecf71f4cd9f6816afcb4cc79a83b262534729433c055abaf6aa7fcc92ce49249b1c247b1ada53e87b04349c4bc11ccc271a617b6cdafbb917abdc215652601dd157133e26489d8872f73a8b1f3a6688fd4c593645e7f897632219b71aa20db141a6626cebadf72eb46c40009a1f07b01b79de9f31f7f2f9b6b3c46c7ceb786cae4d02275671609c1a0cc0526d3d62117e34b6f50f182a972fdc026e1a7e209e65209d1c2df484e4130e26ad84b533376c80ab141d10c2532028f6da76beecd8c6553e3907648a2f720ffc3f9868a50f08f4990d5c0cb6d66cb68dec1f511039f24417ea8b76dce9bd3790b290939291108db295a6198595622d7301d72bbc856e74f619268e25d64c0c4b6c1a2d4c5c00c67141406ab099cb2b069775cccfc2bf7190453b11181010e7cb23f0510c7f36bef7d20504ae67cda30c6a1fc50f412cbe002435403063d0aa0fc07465d25c35880ac53e9f401e415089784a89479c9cd899fa93cdc9f67bd0b7d7f7990bb783fcee782530c283da29cc0f8addcc14bd5fdaccc461c459ed399f822eb47059b3b4373faca5f499f5653702f422038a0b179c55201e555107b96918e506631dda351d8a1d4313f549c619d6e66db8e2803095881966df83ac54d2121ccc4314c34c52b4b927ded58821bdae757f12d38ce7facff5f97a4b68602a5f9f6c5d4bf66eb2f7de52a624659e09a009f7095f4f3e4940341210c988092605792420d28f46990d1fcae48f461939c25f2e4f2372e4d15b7cd63990f675dcdaf0a16c6d09be8fc2f64f987c1326fd08d7fc237f7f7e424e406ddef2f4e32f399c8a9c8048e5e927c9c9f479dded4afd1b914f1a512a432a47a348023a4fb8ec2f2201653f4f3f2d1a76a363699676e293e98a938ea837fa2be111d65abbfb48ae4235ba4ca9cc3b50a6f4e94806f27424f7deaeebbea15cdff32e19c893fcbe4fb43c29d08572fd4b0651f8e52ad691fe38ca6859e140daf2298a444aa156a47146cd214992a552c934ca6c984619a594526a69d759dad1d7716affd2b7a578329d4ae4e9743a9d50469e4fae65d7efb2dee86ae9090b783e9e0f1642ca727a40b93f5cb5f9fda9367f3cd63bf4c763e0d777208f7d5f6be9939b7a3f3c5e8fbf9a7e08e2baf36117f29e196973e4f67ab2975d080abaf3610ff7a0feea771c59bffbba506717ba47c8faa70be57ecf6fdcf62542ca7286b3dc1f52279289b0198716d7ec46daeca0363b09f2f420a06bad87cb9d3d5c9bfdf7887716fbd59f033950c38c74ccfbe1e13c5ca53dea3e9c591384b4da5a5b03ddf6bba6a96fb17bb5b56fbf4ed77c6bc7210c472018a64e4a23d00405e5ae5a759d8a451257dd7822ad5d71c178a586e6e5826752c4dcab62c5f7a980b958567c2d30a6c994f382058b1c1a33f20b16326aece0793cf8f0cf030060b4f0e15dc4d07979e93ceffb40101489c23014ad5d71c1786586e6e5826b52c4dcab62c5f7a980b958567c2d30a6c9240a43511cc7713422914824e924d99592d6aeb860bc3243f372c1352962ee1d4723128924c952c964329d4e7e3a75a5a75abbddddda7b6f672d89244b2593c9743aa150a892122f29e94a4bdc45e28834a14c4652e994422a9d5aa5537962697111c30fcd51367af325da90e0bf4659687252fa1046f471f430618c6843a63e6694a17c0cea4319199791e94a65dc5142d5285bbdaafb945fad54441f57af32ce60b158ad96b75a5d69cbda950f554699cbabb0441b123f6b94ad7cd8126dc8996f8d329a6fbd3e7cd147977ffc21166dc89ac7a32cc5e3980fcbd2cbb22b2deffd108fb2158f4bd186fcbe5c116d48d8afacb0883eae7896efc396961617177771e94a5d4ca616d186ccf9d06594bd7817976843b278d728cbf9d0146d48196f8eb2196f8e336ace1fbe441f5ffc8bc5872fa20d49e35f46598d7fd9e14318188781e94a6160441b32f661cc28bbf91819995116fb7046b4210bf033a3ec003f33cea899001fd2883ede3ccdce8735a20d9980af19650af81a213e4c91c253a4e84a53b45aafd3df4e91d89f0d74f3671b11c09f1d44803f5ba8007f369203fcd94342fcd94912f0a7f328e04fc7c1803f1d0b40fcd950e4f70100fd4343c61852a99a19148a245326a218c49f4e0bc09f5e1bc09f6e33c09f7e43c09f8e5bc09f9ef3d90e0316a080042040880318a000041880000270130b02886f3d007c68c9a0c15299a959a598a444950ad1ddad1d653c7c78451bd287bf9787d6879ee77d2f2f2b44ea316fa779f0f067db7a891efeec1bce873ffb472e488f901fba067d83cc22e745963163071a355efeecda1856ab540a8522c906ea20a121e7f11cfdd3fa01c77817aff330de876ff13dfc3f0f2cfdc24276532346636707173362c8809175705abcf89c568a0a25459e745de779a3acf5e127da902efe1b65305ab4fe65e745a32c86ce87a1e7e920528f753b475a7f56a1ffb322c1f9b30eb5f8b3795cfcd93860fcd93974fe6c2576feec598c3f5b87eccfa68d21f6672d43fe56c0feac41ffab540a85baf9b36d2cfeec5bce9f8d7bf167e7f29fddb3c39fedd3b517d90e3176b20e8c172e5ae4e0b0f8d64dec7a1f6cc58949090a0582a048b421557c188a36e48a0f4315de87e3388e463e1a75a523930926528fdd1d1f2afeacb81f367fd65ccf8a3fab101f223f4574a83fa841c878c5e53543135393c2f4ab552a2534d43c9da3674dab419e0e18e65bb0f9ae5ff12c6f833fac82e53361994fd1aa798969a1819971bdcc92c5e55bf150a7944914c5711c65de8723d1866cf9d12873fd689c51338bf7995e9e1c65304f9a1f964a5e2a75a5a57b633b34090f8ef2cf9a83e5cf3a6bf9b3ea70fd5969e69f75477ea93c64feacb6d69f340e993e07febb150b67455768fd89f9b302d59b492606e6e565ba5c5a58564afc79df2ac3dbb156a6d58a442291e428537d58126dc8d5974a26d328ebde34ce389d4e2894a3505d29cada1b917acc77589290e967da4385a4fc497d68110a448dd0207a44050c47259313540ae579c81ca9d9d3cc5ab50d5d157cc2232631e9572f7e0aeeb00ab38c2cf89527fdc9fd289812c96d2acdb13ca990dc7f82694f6e5279d220b9bf44736279deacc8fde1fdbfb9b961c10247b421c7c71965a4c71967e48836e4fd9c51d67d4e0bd186347d8b5176fa161fba70e12e5c74a52ebe110d9a33b0ca45ac5888d463bd43a2449425533353f2cf1b90e6b0549af6a71415d3667f09a6fe429567cd29c684699ba592c4a4119f26689a2c35e74569fa61a88c4bee2f8d32c0ec258b104724c954eadf346b4e93fe474d2ad3afd3b708593fc411a9871f088eba074547d41bdfca02508494eaa84ef325da6f997ebbcd69ee3b327d771d38ffe13e7c0664a448112024434240468a24f9a9b5480321f1a14cdf8580ac914cdf16714fd279d775a5ddcf8f1caebb7978db7ed85ca66f716dbbbd44a67f9b474f10cf3daf2bf5ba2684e4c8112121244782dc8f1cb1428de3768e4cff368f508724d3ef8ef4cc6b1d99bed74a7cfe7d5de9174469f58113e2d3e3fec3878f8b13527d7a703faa8f9faf48a6ff11011d04bb52b0de8c30c2086b87ee1d67d46c048f8e4ae3a93832fdcf885aab3cea0e918b445da96888d2daed3bd8aedbc1ebc90b00caf43ffa936980427668930247327d5104420fc3ae34fc469952b14d4a76bb8bd65e7a3d4f2459c07146cda251261a67d42cda9035a38c7e38cea839a64d17c5ae54fc46df37a22b7ac26a8d3069ecfbf3f313e5b563949cca27d645c726b924d386b9bf6c495139ec44c7a71c7aa263530e3fd1712987a0e898cca148744ccaa138caa1283a1e73388a8ec51c8e44c7610e49a263510e4ba207e6b0243afe7268121d7b393c898ebb1ca244776c7368223af6dc3944111dd71ca6a854a3ee65ee9d2adb98f7e7575f2489ea184bbffadbeccf5da61fda91bfcb5cafb9ddcd21a41e63c2631d7698090d74be42e460020337790833dfd8e93ea4638def3150a3c85e761847f7493081819b2cba96a6f0eead3ef6706a4c80cac3c3c3f36d80d6f8726d4c00dbbdcd57879b6b48ef082c35d04cd8f17aff7920fb57cfd6c323109e9d897bbf882fdb977559a9fba8bbc480e7dbb6b4d66e210c6d48ef3acfeb3c120d37efe0968c5b5ce0161f2a13cbef7f7a42f8fea79ef05d7c814b1858c7662b69fef2f14d6ce39bd8c637b18d6f621b3366e9e8d76cd602447152bcbf4a952b691e9379d68c357b1a6fc6c5a4797394d1982fd33467fe35e322bee099bff8e66330cdc360ef75308b878171fe05cef91a0c7b1738c59bd8e69335b3794c953be1694173ec75f8b366c59fa6cd9f7fa6485b6e51f690f9c9e0e7e0720807972cf00a8e36fd6f7089abb5c923e77fc2e3311dcab346f42bcad3b429cf57519ea9577992a237cbf393294bdacb7cfb295e268d37e3a27973e6cd5136f32fd33469fe4563be8835d87beb3906f790791813208fb166264226481a46f3fe26430d9b314d806870b9630697351e33b334471936af4106bf9bb85b5a4cd1c4d5c585467b8926a63906ab82c060558f6b94bd94aadc4c959be9e858b9c345a399af97d79b5894cd97695df82c73647f177c7a135a54b9d35c51e5583e780cd9ff4b1a8b35f326ac5439d68c3594fd51587fc29ad594b066b80ba4895693cf9276d2a17c96ac59492b875aa690fd45342a94cf92766bd67544bdd12509f020b4214b40da6603896b65c17f5efa68edbd6437ca2aaa7390b5768a56efb6b66dbf97dee779e148732192d64a2b4d9cad5cc082eb93f38fbffa76de078623592a9528c5194f14a7e4a3ffe10df8eb02fe52831069ec51794213b193381129c511d99f8c86548fb65441ba50f651c69889a8e26c04ee292b115c80103f117800900d0ab4d91fb45211ed4780207c5458967ea5e3cdcd0ea85127e7439bfda791469bfd210bfcf0c50ec7fee77f5224abfbdd0541d0a47bac69b3df3bbfd69a749faf6994d94e825c8df6070932c6feb4194471c2ef9ac7bc6fd1fed81f7087adb5dc6faa34fb638b74ece361fa6a5fedffafbd5df8a7ff78b3af96e28c0d22ff50045a4ab1285618e4ef2b8dd2f4d3ebd77ed816e997570fbfbfdafaa9cbb27c1449964a2b2b2ba5d87d3ab1b08c321b2ca3acfb303c6badb57aa5d42badf7adff0d59467186839c15c140f996f6e7abfde4feaff6f1e898a8a35ffdfd25a3cc4b7126542249e3a87b9227d395ebad17d8a046cc5ca8042e842428ec14926eebfe5524a4a55ebfbbbb6b5b5bdbb6079d362a6dfac9ba5940f6eb38499190970cf4bb170009d999500984b2a5df6712220159b37d8b06d38806a11108095921fa0909017981053a28cb690a656fd166d8891bb8e5da392ab6e1f978af03eb8186cb6c794b6d2a7fda19cb81fce5f8eddb1a8d95f7df9ea8bc7a89adc058babf6953a72b756834ccfbe981c23c283c20d1c72acf4f0528fb874a7892ecef792bfce5b09320bf9f868d823c28286c54066afa8f3ca0ec2f12f29889472424123a43259a3a6d1fb9bb60fb2becf9b62cd1af165bc95049928e611eb8d6eef65a6bdda248d2ededeebd2eb8fb15bed9855982804a25534fcd5a5b92a45f5e32b4f24fa9b4d84e5f326455682bf8f52bdc65212d3c43285409d0cfe39b898909ed18ae3d7d208aa3f2feaad4abd04657e585cd51067e1219e6e97ea81b8378a15a27a1427bc1ddbb6095c7b8f5257e79f9e21fe231f1a0a0bc890785a4611efd5229714d049dca77abd7aab5eaba3100bdc33234643b1731ed60096201c22c3f54c67f94f2fe23f1cf91500e77f10bfd90bf702db4e3afe0161b6eb97da0080441151e2ab6363b09f2fbb08695fa48a5a6b243a5eb56ab6ea5a2b24385870aad4d4f823c712db7d81a89161b4b10c5618d1ed73cd622fd89f293fd698badc546c14f74c12adfd2fa55910cfe69da91fd59b04aad4dff15ac42f3d7593212cafe261e8fb5d8fce524c9c433cba23f4b8630c6f8316eb12db6ecad12d758d60873d589700dd7ecedbcaf52f01ba9fc6a655f65d5a5e0d3b3aa3c59b08073a8d05c483e4d3b700eb3bca16408fb9c2c5d20c2925a6cb866f35932847b700dffa8f050a1994299aef811f7068a679280d2ef1704cd813cc95a6b14e499ea7677d2869329fab743f0b64691a3ce81a4afe3165bcfd22ccd56cf88a5b5a5e5fadded58087db27b90d3fa0541d9ba7b3779d61cf4a980743f55d943317c20fb7bd80ba232fe4d23eb576f77f7200f0a7d3c0c37ffbe0fa742efbc5028f750ee8f27e8cbe142413e5e907f2228d62848d18b74684f8f1b7fe15a240ac1eec52ff526f509c25f5e0e020a9ff0eb56d484a138cafc7b90628f40f8df0ef4624c531cbd91da9a1794bbbd207fb51734226f088adf17966238bc4fe277bc9209f7b73f1a6bf8d7d2b6e97faff5a7b97bd13b17f9b52551047ee2a87bf1362a83cf32fdd03a415227ac135f0b854e24fb4fa6f4a3209bccf4ab5190e7976df77d5f58cb3002c1d0e4a4340253282857adee55b1c86e754f24f15b71c1786586e6e5826b52c458152b4c261530d35b618271b17cadddee6eedbdf7e545a775efb5a2ab56f7aa5864b7ba2792f8adb860bc3243f372c13529626cadddee6eedbdd792ae5addab6291ddea9e48e2576bb7bb5b7befb527afb5dbddadbdf7765f8995b997ec582c56cb962693e9b5b4b4b858989d980b173b31173645cbbbd889bdb4745ac480d12283c68d0b062c40010940801007304001623ba2dcf202001f86c47668b8880143864e8bd64bcb10cf941a4f241352ecae150d796969d1f9cbc34b8cf7bc9b6f7969e9b48801e3c6e4992c30aef16f478a2792fd44435a620f23460b1d1f5adfc3cb4b8b28df0c89edb8880143a745eba5e5a5d5d2f2f2d26ab1e1f82d2f2d9367b2c0b8c66f91ed106327ebc078e1a2f522caa309b66288671a4f2452ecae150d318da3f9a10ad338dad1ff68f24c1618d7df8e144f24fb89868cad77c1b0982b3c6c63328da2fc435a2f2d302e93c5338d433cd37822916277ad6888c91b4793c91b6d091c4ddeed48f144b25fbd8d3231302f2fd3e5d2e29944d95ed66a88671a4f2452ecae150db9d692dd7dd3e974427d6f6f478a27d2271a62bd279d4472d5e1147caf15e56f88671a4f2452ecae150db12e40d1101a443444344474573642c083f2bcee3d922453a9f77c28452281b47f92a8d3ea10b387247f7f5a1d5f0e9e1cdf97c3023e44a67cc88744da3c6e4770e27363691d02f2bcb96931be8ecefdd3854efef4a194d5dbb739680c25f5f6579886bf9cf42798fa8bfc8ba9bf4cce551ea94c2754c9db4f5158c9d2b2f7dd87fe1dbe0101e9b9d3f098fd4ccaf323c9f2244925edf11f478bf3d8f77d246971d93fb4f5a2b0c99f30d959c827048c823c4940619d037992805498f428f87e0a9fbc09935efe6cdf47927ea6f2f9d9b2bf58824940fe2a3f40d69070cde4934827a4b7a3b72f52f9e5911d6a9ece844923dc05c9221210aabd3100e0cec9f497bf37f6787ff977b7b74aa5dadd411449ba48241292cf4f4891ec1f7a2ec1a71f7f759ee78d32f265265190a748cbfe61389280e24002058e1b1aa26968c1124da0c066e40c32a03d4b4c8127090fa4c083c48efff5d1a67fc59ec395a8c235f728bb2dfcd852b39f8eb7244286cd183022dfeff198e616a63954115517776ff706de5849a8c10d2f108a4112206cb8b102153ce10362e0f1a9dd088002361c99810db8700338bc40c115d6607b01146b00b2e3cfc27e93b449f398db7b73dcbd619a5368769cc7e84e3e5d0a34f764f75c769cc7465bff7932da3c56faced2ec249fa30d833fa032fe2a180442a5f15f61d00795f14fc1a010a80cd8447d8150e8b1845a76d008b4ec3f845aa6b9277ab20e99e69e08cae08de274f6077f4071fabb0455b7766b3cfa05e80309d2f2945eab409ee06dc847c3c0200dfb91fd2cdd465b2efb68b3f9749ce31a56ffc6ec0c28e8810e8204e10c5fd8f12fd13c269a81086e40c30bdec0630d3b3764e005320051a24711e600851dff92cd631298c10daac084190fa670841dff8afdd6a6a3e0a766fd145e51b3fe094e51b3be094651b37e09ea642a757759527f75833ec4fe4c73363092cfeed27f1c65d40cde4e4076f3384fbe79ac16e997ff2a9fb5e7de8ee42a92ec7fde9ece01d9c3fbc6017982b70ce2c01f0dab44bcb74fe4727f9829901d3e007df40bbc350ff0f6dddb924c81ec10baa51d2778bad276d9a24dff1b12b9d3848f71b4e589eaf25ce52692eade40daaf3de38cead3a6bfe8c70f70fca1e6aeb936e94e133f1ad6b5dc69a2e787b7d3c40f1f9e8f86f90071d97f342e17a4cd5a6b2da2779ac8ed34d183f3d18de0cd63f7e62fbfdd5b76dc08d71bae3f702e48f6b7d5078fc72a8f7ef9d79eef23c954ea7ebfcc7cd69ed40cfaf2c734a6e32f3f7f00d4f447a1b020daf49f41bb903d0103a0b0234134ac02f406e4597f641f17c8fdf5fc72111677b3652f42ccb5da1097b84011ddb9276ed926d31c4e0eb94719ada51d27686dd2fca34c81c82006e38cce18a851d45aebd766a53254a659daa43f394c89b4b4e3444f9b345bf0d6b0ced64ab5af28de87698ee803b8e62cf6fc612668ae0848e43acaa899da80fc9ac76e8d96661eb3387a7ea55997b534cbbeca14480c78e4f3d6b21351bf773c4c776cc82bb3f65299c6f5b2d03b3a6fe412d5117ec33ca26fd85bc510e4db742090a60e2405a203473e6991ec3537399064ff160ba859d1b057ce7238e2df4e615e7863dd9f285f69fc4b2ae37fbac91018f4755222d9ff522864ffa64bc8fe25c5794165fcfdbfe6b4a834fefe37a4b3a484ec37b90545abc5ca028ba582051595d5cf6a95728594149515542a942aa0a0a488a45227434e4e4ca860625232859212940f0a7592c2e9648a82c9548242a9440a2149d21348a4911346a3b109e328f68862c88430142d4124029500825f90eff392e0791d12baee02b9373b95a91606c571f7ecff82e274bba038f5a605c569d4584b92dad28e13b52aca426843d6fe50f44598aa278b69664a6bfcc6ce4966233bb51d7f4a9e27248a63ff7efd4b71baafdf511cefeb7b14f6c1688b19c410704003a84c7f871980174065fa2d56009599007da16a8e10140d09a03299f69912c26395c7a33f2620eda75068ecc671299fa92c7a0450997e4a653a01350d540a64c85d5f27f542eeffba467e9d794c085a79fa3dfa93ba95a794291018ecc84d03929429902ed8209fb566abdbd17944f692de325db921aa1e0c42ba436dd83200c13f7510fdc9e2540163c5cc0c8c8ccbc59222f79f2eff2a2fb9ff6ca1aca4504c327dda245349ee3f455f18fe6949d4ec17e103d0573f8807f099e47e57c9fdde5591fb2d8bdc7f001a2488f2d4219fdff7654b85b0b6db4b639e8751fd320294533205624409998e407cb987f73a4d7acc2b3bccfdb57af544b6f3dced519caebf6b8ad314a7fba6b7ef105ed051587b6fd70d8116aa4e2655989212ae4ea655c80a5b412e60010b5820caa10515d6d593440209245ce00217b460051d453fedae21206bf9d5ddda7bf18cecce31071fc29fe7894694ca74421ee441ede2cc5e8b047b6dcee63e9bcd5ea76ec8c067cbe5c22ef4c22f1485611886a552e914a2e850ae240cca3eca083311359f9fedb3a5a0a65042d5c9a40a5352c2d5c9b40a59614b059694741948d56873350e399bebe917d99c1c6c10db637336c762b15af7b3f9ab6d2df15ba25f6dbdd4ffcf4291240963fc62a92cef97a3ec7eb5ef1e7eb6137cb625be5bee3fd9927cb610fcba0fc5592d214318865eabd75e0159abbb7bad5e6badee5eabbb7bad5e6badeeb5babbd7eab5d6eaeeb57aadb5ba7bad5e6badeeb5babbd7eab5d6eaee5eabd75aabbb532f29f5b2b082147433f2fbeec6fbbeeffb3c4f241289a2288e2808c11169348aa108e441586b6ddbfd99a029a59492f6deaefb3c59addf2792e2388eb25a5638905da24895564a92a59235555a294ac90d2eb5fed166684dd0b91a3dcc80c964e41d1a3bb8787b010a7bf1f68ba031186fdf080ad3791a4481e80ff549414f9a9b69f3754363df6c4561353533c64b0ccc2d08381fa02fc0c4a0efc763a4dccc63a41af353648af22469ca9f3c33cbaf9a1dede730bb1c837bdc87c16f22d4b0ce6ebef74f61601c303e89df815132616f0d236941a0303206359c8fc74e38a0869d7abe4061a727e07cb2ffc92728fb93721e33b10d79cc04a8a6c634ff532992b4e53269289b18954350247378cc24477ef161d7759e088a429148248ae38836ea1847dacb34cd978e1db3d188245624248da48344a2bd4cd37ce9d831a391aadce9435234714a0e51a24a88244332318a0c69626282ca69f13538e6030b980e2b6c54bc7c6891c32206d361858d2a97ca2a5e5ec9289b2931f1490e5326a7c6712ac931b8dc517b294b5a2b81c248647808050ba18c41e0201d34d2d391354b116558e69477c0250f1e72a1502e195c7764bc64cc9789d2222412894c353016c2411897ac1e568e6563d55834d68c9523c5c5256525a596c223650915904a084b8b2ac7c2c2c2c2c2d2d203c8ca41715eafca794c8666becc1b95495d892fa59c28a6d4c02d403f54e65f84bbe15aad56ab4566f365ae6834951d2aa38c5563d1583a582cdacb34cd978e1db3176cdfc4a44c0363a120a01f2ae32a2a2c96100b092b09ebc6dad13ab166ad56abd56a9d4e709ce46853884795cba98274acdc4153698d720f3566f050e248e2776a7c143b3cbc3f19039296fa93acdd6c34763006faf1c1a1a0bc2ae808ab0666cd5a079b0e5b0a102925252525258564b1aa27882af73ae159fd79c2a3caa972af991b8b467bc1afa781657ec698773016c2411888ca380a55c262b570b489e3c1d2118359339313928989898989c9094995abe13c76c2539281cb9c0c97b81d7059e3e1a19933e68b55d2b09863708f9b77815b80a88cdf984cefe5509904070fd1272412894422d1975f33f365defccac4a14f2657785670ac28b1449b3bda2c098d4aa552a9f42759faf31bd156c00cc38a61bdb0b068e22fbff8b7dccb301ff32fcf3202615ff5e27fac61dffcd0c42ffe6594bd7881c71ad6f4f0c53162c468797d0c4ccd97895de20b9e09afa2e6d090e62eafc035bfba6fee5eb8bf6d5e21aaa839ae4f5198f8f55714d6f2f54b688ec5551aff935cbf44612a5f5f4461abafef1496f2f547d5ab60d7f2f6cd35e5afc8aeaba3d2f85fdadd01da2a8dffebbb52559ad5db3fbeaaa62c8118bf755c5acdb13e7747cdb1446c35c7febc74749766cb1dd96b39becb75b8be069f3772cdd35156f33a0d13ff8c69f9b306e6d65e2a7fb6acfe64a5fc79529a95b9b280b74ae37fa6bcfe44e59a052a53cbd3beeb5fd8fe541a2ba4d278cdb13e95a6e6582295c6bf2b59fe966797dfe5d95d0ff7bb9f71bffb1bf9733debbbc6d7dfc816d3fcc245741e4b1595c6f52aace33538e65d18e643985751736886f9184cf36894c1942a48d791e908f33a6d858cde9f8ebe545a21d93f65854123545309141482c12c983ee0fb5b22adf7b73fe683cfe293bdf5654924fb9f3772d3baf7faae3feb9bafd7f17a7620d7b734d7ab749596d666cdaca73b5898e633cc277803916012e1e5b3342bcda084830c83697ec134575caeda4c15813c2d4d6646a61c6d97661ff2240d7b2733050283388caaa7630d54567dc5174065150d62e66bd31cd227d787f17703795e2017e1790898af6fcb93f5c3ccdb9877f92eefad1ce202e510ddbbbefb767d370261fe6dfbf744657ba280a06d8e33babfa53dbb17fdfd0ebfd47285dd727d980f6910f6657299e6ed873dbcbceb2bbef769f77a177efdc51dbee60b9f36b28b8e40982e1bdd831f7a1d7ef9b08e00a899c64bd9b581bca50dd4f8a1d78d3cc4bcf9e12776d83e1d015073cc79df96fde3d3b146ccdb72889837cb2164deda409db7b481ca31a595e98146a6a4acb208cf33ef52da9ab208cf30df305f7f9829cf9a61fe3c22d78bbbb187b37b1b81ecfa6efcc17f388bf00c539e1ec8e30ffd43995de5d95f847fe31a564b2fc27fdc7c5cdcccc71a2319343f53e3c9333faa21caf7ed08c40d6fac517fe675bce28bedd8039847a78d6c69cb3c6d188cf9f2b45f32e5f9654bbe9016fcd1df7288d1cf7c8f3dd0fcccd7b1c6e8671edf6f7cda18e1ceb47f87b83ff3615847205cfff2757cbdc5dd3786294f1b2f3ca37bfb263e6bee2e9e317fe675fa05bb3a373e6da0f2ccb75c4fdb345db72bcf23f2cc8bccf2b481a2f9469e2947ef34dfc2e70e36b2e8efadaadeaaac066aa6f97e9aaff8b491eb3711c82ecfaff814229fa2b781ca345fc71f6aa6793af680ca34afd31f7444c8c8053b776083e08d06d3fc38c8c81121236d7a5f22d93f6c7c6d68c0e6141e6a9729347297293cdcc8f56f0c61cb5b5e9f219044d81b0d3e6ba6f9c64df37da599f7687b824ca9613f053472442805047f8ab479dec834a84c833bd75156a2e1c813bcf5d4d202a85c5ff4358ba8e8bd2b7b78df8da81d26ca941af553ae91234229d72703360ff193fd16c9fe37f28d4c4719886b1c797d1a4669be3fb25f21d945233e6fe4f1eb281bbf45a28a691611e127532299e6888023e78680245b9aebbd875abfb1fd1f3a1b2db22dcffa1aa8d93ef9b7f1ca5bbcf295b6b95271bfc5b8e2ce1bd99efd4574be40dcafb8ffe2eaa33651696a79cb14b0a761aed2e6dd3eb529c1db57965fcf408a7ef4d1304ad21093d8731e7e0c4a2086b4a6c046a4789bfede6ff4e54ff32739f3672ad7b45ab9c6c55ddcc5e5431b5ca2d14aa98f4a331b4c77da0952c5b3de59df7a3acaba0992754dd0c73541dc689a7fefb709c8fb3a6e9adfc3e6e968dabc10c896e7f641b6ccb77fde9b6dd3e2c05bc3ccf79507711eb3b9dfd9069774f4cbcbd2ec4d5c834660620a94bbb7c1a5d9697133f36de70d13532ad3a0cd062ed1b01f1ddb2142deefb7b497f2559ea95c67d0b9d71290321f6369e58b346d8a3f41a0afb73cbfcf7a79a6b28f444ce687f93adef69857fa85197d0a4c7764301196756b274824fbb7307892e0ed3a718240b23f0c3e8bb02a708a79031de02007cf4e8dbffc3b08e4599aa1640a04062108df53847f6b18e9a3612e26680e68d301857539a8391667830abb34a039b716030ab35f73eeadd2c080e2f8203bce6d0d766ad9dfdaec2dfb9b1f8636e4bd40202fee06de720d0383340cf6bae1a5a1f73b4178178ef9f44b8a433efd158a739f9afe5df7c44f2b53205bc0e57bf31808fec0dd480a040aa0fc7382371f10c9750f480a040a1b981bc205fd00c9024eacb866d0567328a5790268cb4e50d33ffb5fd0084a1092fd2dae8248a8559008190814076c82cadc6a0ee8a3d2f807018b90cf5b6b0d69b5585460b154a6a0a2b2f259ad52a49092a28a824a8502051494949054eae4092727264e30312969424909aa07853a31e174322dc1642a29a15422839024290924d20809a3d108641cc59c288647084391114422b00820f8fdf83e8f089ed70da1ebee13f9e6fae0adad7582e2b87b1314a747a38c6e21509c7a47cfa1c5a5ecc234f70349267197616010400fd31d4a712a18845e41f69f51976b24baf0f571834065fc497c81503613e409deba27df8569ae086cc824f632fd4c40927fff2ccd280eccfbdf1fd0fbc405925f1e66b4790c04427d39d884f10848c8feaf21647fb3ec1a09ba2c0eb374a428e6b0a49fa0e0ede69a40c12964ff5e823cc1db1361bf6badb5d65a6bad96beea83b852ae28b9fe794d4872bc4f6da9be509b34370fc873b479c9965d066580910fbbef7affb0249ac61f689b2718a477409ee0adeb488c5d6267129de2bc695ca24d1ff2242d2cae55c55e0e6dc85bbb3cccf2439648c78abbea639796667734ec77b860e8fb48f2f6e0cda2a44e4c4a5027d39ff5415ce9cfdb0e2e04e901716d7a8bf166d301798e361f6d8eb7d136dec0db78b3efb5fe686b73bcd93f479b2d47077dfc35dac69b0c9000bf7b7bb3e6267bdffd798364ffb691aed2c97b33dddedb4d7dfffb9d7f3baefb9f6a4bf3cfcff527992d88036ffdfd5d09fab0d5559e64aeb6164101710dbb2578c3200ebc95448040faf4b4d9309a55aff2a76321fbe950f8bb908e81b7d389647fcf35ecd6dafcd1b06fbd0fc52e8f0e627d80c4dacc90fd291872b534d742f61616cb63794ccbe3433ee4495c2eeb7299ac9667adacbc4e7b92b63cdd3dbc5f8d2b1fda90e563233279ded4c09c4fbf2ce3aaa1f9fa5dcdb15fcbd3468b5cdf055f1bbeb51e64fdf3d6f2e5d1a683b7174c79a63ca63c3fe63bf056436331d844a5f19fc1a00c067fb419539e264c79fe4bd95d9a75832920cdeffeec59108ad3a36d08c97a57597ee3223a5f1ef65d7e94b9b8609b57de872db1e29b55f8862cb18eb21e47b4d861a26b0bcb4adbaf6f6b12902881853694c1e70a6978a0129c4009212620811076c6254a8c316db3ef8c3cc1dbd9b3db78bc8db636471b3dc1db509e5ea8b4a95c8b82a064a866460000008317002028100c07846192648920f914001472be5e5e4e180874184541104629640c2186000008010020232334630200e2be49081a17149bf9b977d42c95346061a08395c868b7440a6acfdb077563f534a416d5e6e3dcfc5ef89780f9c847d177a6059e8b5ccf2c71060e63b1c126e55572426b893563aca535238e53666e03047f93e23b42e3eaad378327da4c87f73d769f54aa7042671e122422dc9e6c8ffe8ae82a9857a0909edfbab23ef8a9b66f29464be1231780e7f459819e3d3a0be2ef2c7928753cf1f7938f0c4e527875511feebdb86a6d69433e058636dfd35f905b91af79bf44adb6d44dc154193bb6ba74a476b701fe8241c0ec8bb9d59945b500062f1488f6b00d1ee2a4c9a3346c8a488ec589e7b5e5fa53e3d4b94c84802393214ea9937eae22620c322eb6c8658ba8bd9f4318fb23ffe25a67279896da2776b6bb02d73e13770adfbbecc1c887a64ce462fde5e2c6cd7c4a48ca05a28e414b37c67e56d3a31ece39bda6f7440c4ec787cf3b44a6eef184f4ffc772e971dd7ee45839544ee623ddc7624711bd2114a3b871895f9f28d9caec7940586d87af3858990a8e4fd64dba61c75781112205b666dd2758669101050481183cf6db1b53afaa70094ecab594c2041fade5a7487b540a9014ce33ca2679d1c84f00379388aa7b77bda2b2c2d9d4dcbaa1e7d0dba10c13039002b984dcfed0d5ef4dd3f2156b798b7dc50860e408f2be260af78cc48063a909015273cf1757f7c82ccc36288e4d476b1d7761740922bf4c662f8aaf8e66e7cfda00843c7980ddfa20c24c292c5bfb44a879b2a7e2210998655ecdd2c826031b7510fcc885718948454d51c40d75cfde34f06b2b9e1625ba56e1abe47e1c31a82cb348319dff0da691eb14a2e6c1f9418c33e14cdf7b1928e556e4f1293957955d443dd5015f2cc25e792e4a5a9de1cc1490208ad23bd956702af8e676656ef55c69e12a8b2616390bad83cf09a1a8b92f4e61d1586fd09ebfd2e5d94220f7ffbe03705cdd8d83c4070fb01e65371abbebc22ebeb22f4e82f1164f2e1c70e3d1ac2bb4b1580e39e3719bb6da0487e3d2bceb147a89227388b434a90eddb3772407311ea508c16cb592e47e61a55a1e540c79a32d52bd0a40127b2898eab5243185d35e46c03d7bc8161327c7763377631cbee06b812dc4cd946c09768554622ec2d9918d256daf6dd260171c390a431c00a08d5486eb5edaac8e096f813d1bcd9c21f3b3ed347254ad2d07c8fe3d8cc9135e76655ece18590c0299b9833f8b378e7b41629c22c221606f8784058fcaf993ff82c8e13e289710acc0fa8a9cfd156201b29085b115e414198160ea6e2c0ed2748177edf774827436364f252e41583486c0409bc65350ae87be201fb614729127a9b9d2e7373b964a8e159c10549cb915590da2a570b1d76bc5eb7049ac3e989d4d917a61c9000cd9429529c9b948885e413506974758a7973082e2725c39ca3499e4a30879d2848040cbd79694fd7121b1fbfa8d7f8d72363fb90817f948dac04b5ac39e522fbec7aa748a9421deee95cdc3907743be6d8b5882a48f886109f8b6a9ce4910d3be87e3a43506b31044c0fa7c15371d15c2e4420c10cca274c102cf447949102b14534096397fa2f7f713770c00e2eee911c482dc4ba2abcdb3b6b2a5e2a65a603fc1c2e76bd41bc7b24830cc61c916dfb678e253a69a47377a26cf4a798456c530c55c9708e0058e195d54443f34e95d73e542b173036efa52264f7b2a21303d1e92d338008d71643f8b286d428def02f20c15fd02f196c6f14f8bd689b17a851fbe06d9074549b34c9badfd32697b3911ff10ba74b2d67c006dff5de3039707c65182391498caa0bcaf32a75ad4e80668bfeaa1881dfbb51fb986b403839adf832cc7339362fc632aed5b19ba0eade76fdc1e03bd9198a770ecaf0a47184e9d51c4119185a93094736e31c14cb5205e2b87f4392809c45d0ed7a29484a5341716dada8379116ded46ca52dee31a005357c9a9bbec387913a04e3549517abd8037257fb46f808dc4bb08e4db2f479c2e401926cbd9d577feb0a00f77e925d84ab917e8244c4863ae579c8c0cf4801b22227dd6a9193793d2fd15487843e8686481e41b946e94ea918eaa36ee003efda94a139aa0a606396e4888c148c04c4810b5f2c8769dbfb6f70e9f89b26861d2d482b8c8882ca9be8aa118c93b983afba4a3bd9d20b8d851ffc0adade76f991b8242d666094329e7ee727f7cb1c21909afd9932c1dadb02176a92396dc30661c6f3c8923b8cb38ef6e5233a7d07bdd1562391e53108c7fc78f4c4d25c1bf480cac4131ab4058da74425721943c2e3084b48403f6b6da0bcf55282520eb3c0d4e810c0a3024c2cfb54769a5ec0cb5814291840d12a2cc095b1f2696026a41d0fcc8ff783ec31a5f24783307dea8baa0a1df0bf217e6f1080371cd20cf8dd8734692c0736d9bfdbb7873e6fd8c6633eb777b2cdde0c10f6a9e53af6e42df59881c592543fde89eb12f78bcab78c3d8139e3bc7eecdb1607760500d7c8aa91369a7c9f66ab8a11c012ba15d51f54a035d97089e85dbe447a063b42efd60aec43d4ad0f8ea6d9dcb52491721dbdc6a3fbe4e2f1e1f3c0bfa3a60c1a4cdbc32d2edc431d63e2e4b495aa53876f86170c0fb4b0dd35f0083f5eecbf0bf4571f402e644738f5648a804e5ea01fe18743f81d89fcd48d1272e0a3f68d9a22aaf2e61bc53edba86b008374f72b611a3b0ce6ea514602dbafdbfcfc61191cc340be65ef02914ee61cb9ff6e7b398481a455de3f3ec89dacb1c43c255fc19a184177b76e0796ad01583ae1684a2c072c9057b0f194d569d7892b478299613eb4ce33679752361452e0ecc3408c924923a7470b8d0375ad67c06496fa52a8b5e130d8bf7c6323d56afe1b69c99908c40bb09647ffafc98be5ce572f3815c2022f81ee92550c999829d85760ecb23309d0ee9ec2d2893a3e368ba80115d4d94deb397b49a39913c5baf298b1d59bf917d9765e0150454b1402a6aa87d8a6c9b4fe16c2aa335403fe43255cc408ad38bec8e5c04f43609b5802370f40a3baea19908a7debec67d6b022c71bef38a313ef20954c54f869e05e57b01f51356534f5a5d3681bd528abad2bb1966560f6e777f5a5ba5d12db28f2a05ffe5ff5505bff7b96648b1800c407d544a4ae3577ba0e802fd9dbda122ee4774701190a7035030600e8b485d4ee3e2b17c4e81ce731bcf9031b7e79b01e333cc4e1c02f31e0ea20f13e864d0cfb67e0e69c54451bc81b8a4579c014b177f456bc8d9d84e7919b1f5d5bf2dc9c3f31b96116e2f00bc92b6fb3285247ffd604e5db99ef92b6f6d1bf0d2f19a38d4e6b373a084218b16174489b366ae5e0b6a25dfe980ed9546f128c5fac5b4397a060f8bd84dab765a166d6fe47e1f3a5f48fb2d26fd2796d4bd84b35045d926e6b41fb5fda7067e12975e1dc1e3f564df9c6539ba1aa6193b5acbd949e4e3c7b9a0ebe2c748dacea6e2199edb057e6d5762529fa70eab42ae930d39115fcbc63455cbcaf9b3058f637e5a1dee02786736e4a076691b72aa3d0af7d7163c87c19544a5494522222e6d954b9aea00d8ba669cdad3db2ca5ac2655b17d88db2e5e4bbc64ad34f3b945b8b519172be698b99a2adcb34000f46a2d948cc2644e137d004c84bb3f0a8d5121249ee72ccd809f9298a187f8fc3bdd36872ec4c359a6c9eafb0ffde1c70fa1f75e9683ece70eb53a18601ba6d32a936ece38a9530c9a3634f7a449df5e8335880996f7b762d4e5858339029ad26cb7235e3eb7c6ed97270188c4c6abcda10a301f3f1244af05c6f41fbaff9c1e6cc2f1b415edf0b6ecef703b5cd28b945f7d02d7f2c6e9b9eca596e35098b7392d6f36ce3b03819c2002b36ecbc8660ecdf69e8be7e8204c71c575dacf26446716a3f6451d37c2a42dbdb92888d10e7c49a676274769968d32b2e18842888895f4a65ea5d5db06f48ead5bfe56f1aad94ab6e9cd6b075c272578a250d69d4b00a4440329f620d64dab6d31a4407744198970c08ec0224bac204ea8efc8d55f91ca6df5a88b47869b827279ba71f76cce10dcb02600d81bd9c35969e18d70bbe9eaa96c06944fea8b5a8d71b684166dcffde5d95faceba683958dcf520e0f89c06ada0c3b07ab8279d03a453b21ba9b87174312dc4c8ae2edb0917cbfcc7d3ebcf093be5f62d541cacd917b48e404b30e01de613a99c10a8ab5b13524f42b2c44d8ac10a06e6e47d88da355cc6a74e89474ee9a167b430e05a84cd854c2c118fea367f6772124ef4aee8f67fb7d8d16aad29ea93e73769084162c59ed09c561d3d3c9c5cf32361b92df24a81c61e08251971c3d349470fc8cdc3173fc08dca165e240c0076ab3376523bc58b83324180f91a1959659866c8467a09da36677790a2b217c5f0ee06f1589ad96776d058b49e22af13a8114ddec9d59a67730e604284127c8ce7a6122c7f86a1030cb4aef0244395961427c533bece3556435fc89275e18ab93108d63cc975b97b583aae0cda1a930fd34808c1ccdf2a344991b9338144d626045adf174a0191d7da065316476053577bfc8322ed2cbb568cea93e8b696934adf7ae59df4cffaed4cc524b2a05579a3009e320858ab9ba4a981b62a8f5254215605f83226851da8a2e45e64852dd41105d6ffff3ed31db3617c660033b8f84e8ba28196dbae7bc689f17d8fe857b2970d49870da54e8e401d254ce4d3bb0884fb7f9d976eb19d694c24f0a1ca314e6683eb15a53fd08aed397814ff896244ac0d0c2cfc9bac889f0d50147e2c957cc9bc37bee50426a1b6a1786b8958895f978a557ee66d3708b2ecbf9a3b8903ec25536bfdc2d9f64a82f477b86cf54bd23556fbce4bde900658012a63d184009cb9cdfd07cf1a770ef0980fb6263950842f3e92bf9cc08220923489ca9510151cd36b4b8c4d6d93a1a5b6c17a0da3b4a553cc88f1440eee21310027eb7a47c0e5336471d9f295680d25ea0e0f663f540a1eaf99cfb19bbf62a3b556e75e050cb1e777b413f48da4a8f7b578c50beb0a898d0c3cb0103299ce01c238b11411a7d06e8c1f25d56ce6f3bebd3f5e2fd4204e93587acbf7ba251cbefade6534794b5c627ac9182069b9ba57f7fb7f3797b8973ba429c155e72301ba3361245cf6f1f9f33b131a3ff1c5c2c31b611fc483a7612bf995ef1d0f17d96319c849e7ee95ad9a4613b4486037dd7a0c4e506dd0ec9162d30f7d013d0cb6b14134788ed32204a68cb4000af6ad6caf81adacac68a3fc00c9ef874332a2ddc669a2ee5b2ed35d82ed74b0013d223c875a5dd6544e9b4e0150cd8c2df23ec36a1e9563fa415e0c88698801f0deb6e20e756dc8b43c929f14fb45ed5e8d4a7cd307e151e2c4969927e80a153607b8937b39d3f147b0123886b2f52360288893bba91ef50e4e9dac770c3f927d700248dbf92d2eff4aa5585085b6ee6a55d2186f8d77675de92aab92b9e29df4f88d1fd9964506829eeb8090ac0d02eeab520be43941c65466a9c553e5d76e1b08d4db446d671154387c5dcd6e53647dfc0e6fe0df337920dcadfb0eb66245ab9a8a8bff32398029a718fa856af5414cc7d8434fab2318caa6ba709c25a9b6b11fb4dfa8edd864e9832a11561f0cbc60a6caa386f0844313ef4aeb31557fb62bbae093a929fc2d25cfc5623614fc465e80a7b9bcd3f1ddfb56aa4a7855588930a36b860f0825aa93b35215e50ce86d749674972393629b1e1463927a09f36907fc24bdac0baff43ebb5d200d44ac46c1c92085b26cdfb7e5da5212bcb81a5343e8003b8b8c234932bcc1f385a5c747410f7f30ad17d748bf96554ad97afc129df5f1564751cb96586f296a218dcad6a38b1886e7905d4134b4ef2a787b8daf5867660ff0fae41dbdd245320eba0e014805efa09b925d0a6ab579ed9294fa7e7d575282e154b9b81e6d93a8a6429fb540655393a4db8a881d33e8abdb65019778703071fbba9e627d1081fcbcb1a1a32969f09257b5ed9dac589da4c8cb5f7fef93e50bf77043092e4799ac172a0749c26b1354f0c31ea3ef5f690eb256deb1b6a537b17f7d2c14b23432ece0d6b9ff96f16a44005a9b3a1a20c44daa33690f8979f5e32aafedd98ad69c5425f3ab4a761ef52beab386470ccbbe66013812136fb09ff20700f26c1c131de8a385343f5137b18c27323d109ec3c8deacc163684b247bd1662caad3000f6a88efa0361e95c57a0f03b6f60a7916b0a0a0603985f71706fb49a4e8dd355927661ea4096a5337fa365e94e0d4f4a35eb2e49a6a4cd0964c359fcf9ee6b646f454ef417ecf390c81f588ce1f522197cfc8b63660feaff30ca842a0ff5a1b492e85173a7e2e7e661977f15b8d6107f060cd1add887b65cf75c69ef7b8fad10140179bfd35ce9e198f025665b0ab8ea9514289b45a2b12d7f4988e04ae263107d676eba5294603bec57b0543d616cab6ce74d2978a48b6dad13ef2d54ccc82ff179ffcd5c2352f5e9430e4927450f416eb0d8363a5eb2a9462bf01c1ba697e4b0edcc9a91c4b06d4a0af68794374c4d85c9e99bf9e6fa34e0622fd70463649952db89ec69a4769a31aee8b3c3be3b9029e8756dad4a49524158fa1862df5e10cff544108bcbd7f138ed4f45e037c61605716bb6f0364a0471d3ed3088532141b3d71dbbc69d22ea1815496998d9ac9c154d4595a489eb86914d8fc5ffd6c2be03cf4a6c6b9ecb78db9b4745d181b5f10ef35b7040ba9c275635e7912e2793fbe63ccf512bdbb305334a73c2dd4ccf7ddb5492a563956b39779ab1a86d2e815a6433ac8b5087f9a4fed8fd34f5535ebd5c817791747af8c778ae7d3b7c62535b236ae666c07e8248bc4d631b8d957d60a74e5e4ea5fc55b35aabfc6a82f45a45b767fbacc572e12f99a59282c9f66a794e7b100376becdf71ab206c82817c9250688af8dd2651a6156f4e5194111669366ac0d8add23c4223316c7318055b0d18f5e89de6d2eceb712aba0b8580bd34f8a42b41ae4e6de7e75565eec95cffef465fc399e868cb5db1447d435d826970783f08d7823ba8e3c9992d99acaf200122132187bd00a154e0466e4ba05cf4f780233d17016147cfef24258a1139f5b041223b35cfc0bb14394919f3f1c34bd10aea658eacc84e295d15e97292a05ea1f9e254399fdd45a0525b859e723f62546e8d81f3fd86adcbaa796ae819bfe8b39ac4e703a4e38f1867975eeba042841a8bc85564924494d2911e7d1b9f9341216dc1950a86c12090e88e2e859a8fff2fef49f28615b5473e12574c845c973b3acb9dda8f6619a5ad0d354327176686949eb11eee1f75e60e223eccec9b488fc1662f5bacea3b42fa2ddf55253b7bfa0efea77129dbf82ac6ef7313c9bc53c7a7f22fa3bd7747cbf467ab2d711f4b7b636265b9975edc7b43c779bbde587244f41d3b1c3f4e2ccad95f8783c8dd58363ad5bd0c091c2ef673201fec71f88101714adb6a418b7063e13918c84d8b0b87d12ad24682b3d5e820fa25c5a36a4dc1cb9e62d1ebdd2cd3bf3d34529b57cb4ca5ba2e94d5aef319c8975c099fc55773364d62ca51e5fa38330f1e8d3c110046cf4fd30f9418ed0fd03531d0e8cc6681dccaa9702a3907c82497482bd6c2dae3646da78088f379828042b02082b0b16bc3405f9395ddda995dd55fe6662eac66c0dbcec86ad8a3ad41cdaf9a63ab7965b65814645bd73fce6e73647138b70469771a4b739419d4c0cf4466e2bdc6855ff159a928a8ebeae6e2261b6154010c773b7472f1390cbda018fea425213941c2cc38088ffc2add409791cb25788a59d594fa14828509b97beb5fe6b09e1e596aa6abbe5904b5bcd7d3ac584f2aea7c929db96339f6892aacbe2d2e104ff4f7d404e7fb57444e464d95f47f31f0944f87c374d7b1ed817154e7fd2169c3af1448f3eaaad074fb60f59f45eb307c2bf8406dec41b50586e7c5b190c639aed21c423d2d1c9d2f72311aadbc7b14efd7640ad61749b52ae6300555eb8ed66aae199acc87dc78c9f08985a2b1b873cfb94c6190a561bdf61c756fb59b6096755fe8b20dd06742c66bbb49b6cf4c7e667644f63937b2855bc4dae91edbadcbab1cf07836cb75a6ca370208f8d3c975fa20b1101e85bece5ccb0907bdbad7d269bb171bf82344f5a5aebee838d7cdf363e075f3b33f33382e03aabfc7118d6f15ead3a816209d3ea0276085173c32dbb3cd3ce1025c800166cbb75dfc386fcdac17350fc4c3de7681ab4854b24f7704537dfced30227da9a46929c79df33870115a75756b3aa384708cfe5d08b2848cb120ec537df24186cb4b9fc1d6203354e4e4034993cd26056ca242066ef9759965c40599bd0034a1d5811a658e146622be991795f7c05ae88858b218fb2e7f70387920e7669ec2d0d3e14a5082e52e526ebbbf8b37f7e45324bbb2f3e7ee1ab4758a96e347128766183494bf79af8dca7944014a9d9d3332b10002597843df86fe8e5c6f7ec0b6dbda14fef20027bbfa782ddd495b3e0c8aa46848735d0d1eefff9cf7d3d7bedd9ebca5e3a3195f1be405713bb3f56951867eab8a9cd7c33b095a139d2c46f681bf7379b2a4c9c76dc237b3dd39be1b5ef4ff8915c155c66fdc01854ce91655390dee14eb5763f8544af6bfcc813b0793c036efed7d4caccfc8dbb7b072ce1487bccb176e87927edd3d62073d06038b4e451c9aeca2d383aea58780b9e3f0164ac85960e16307d764c42c569fb721eea9ec76c1425ccb62f3fa4643a4911cd88c6962f08e6f17ad3efec79d8f78945ed0e74eee0f37292d50261756ee861e05374078b2b7c1e76ce8de785570332c3c07dbba8ad25fa0f9199b00bd7f75e4cc0ea331edf378b0bba51d3ea63b517cac1ea7b957f0f3a45f4afd339927f0537e9a87ec4fa2afffd37bdd04cd3ea5b1f85336238f4e32bae04a62fc10d5277cfd5a4058a5e7f2864d960fa2adaff986bf1b9c5ec019733169c3ed20faea60cfb9c6418b14733bf61075922103ebc83eb3d21186fba397e5bc52bacbbdfdfafa9c81245b5ec122011b7af3aa0c14ce30cbc06cf33af03e0b0148c7f97dece0eb02cb12ae13a3563c6d1c21a07f3488633e60a1ea2c40787a5ec01a0e810f54102060cbd2b2692e5a3b6b8e86a8296f15a2ac7222752acf05cff260f0a7fa79edaf0d5698a3c93660307fdebf6a2da2f94b39059bfb57e96632f53d229fa2ed3a432d6124b404c28f95e5489c17d1cb69d92162c677b03f33ca17d0273ced5b6cca3448d1fd6dd63d36eeaaa6d684ee60bfb1ae3f666a6d3aea7dea7e4bea4cecc36ccf8998324fe9142eb4b4f9207dc3c0bbba6fc2ef672d2e92bea1dc145d59a6aa882b092a1a49daf04c6dbf53b367d35b8953b4c6daef04fedd96050ed95cc136e552da1ceaa06caa06b40dd0af792290a2de49ee90da173a09714f41e4d6af7b294c63905e1734caa66a1990dcf2ba21a15986752fb038268aed1d29b124e04255ed4fee85f8c115188f7d7da4b894c4f53cae4ebbd26cbf3377dafa25d86c6e2bdd8d9adfe8065f0a9442c8145b83532224b522cf5d3c31107bc925184c68fb159daa06d531d0e83e4bb77eb23c0579cb565bf7db03d913c63cb5590bab849209e7405a716d40d8358e99e91bf845896874cbb70bff190f32bd1caaed03a230b8dcba8dcec7f39614c0ab5b11e1ff1d70e2cff8b3e2989f98d8608e3c08acb98f27fb3590b60b930b1af49a53c62b65ed13be8509e52c8fca11252518dbe8a1c4ec4a3b4e33b53c5dcd85dcf3c4d0a4adbdce7d558f755cccca9b3b74d11c8a338c39a0c16599ae443a02661fb6a128fe89aba3d109f95561796d191f1e820afff658a000b1900c914c926a5aa9326d57c8d7df94cb72ef5b1cd19a05f49da4ae898522edc6d0ba6740ab526fc1e8ee298dddd48114d918d52c1b06a24eedd8ca5174fa598d21de647dfeb3573af4e2a86c9a206d74935ea836255ef6e4cbd6647c1986d1594b0ea00b2a7f1f3b7bd9b3ab92e6e9791dfbd234c4b31a4dd51bdb74d564cea2da7739019416cf25a677ed3c005701db800a6b5d6cdff9b5ed12689674aa1c1a73194deb2d85fc05cd50fd5205bb171f0a85c0b4c43b436283061fe4d6051dd27b3ed139c6615c02ae28275e69aa0e1b5cc2da8c744f12b34f817071a537d31ae872cd3b77aafe5ccdf00b51995c80b2c28a22e393ae84bf57cae478de7fe78aafd95a022caf795ec90b33dd1ab224a717ca6d24d0cc2c9fc8aa87dfc0a8f7b5026ee3a5ed8607278e3868d9b6eda07dec3f6a8ca773daff7fabf29770d610d3d22507aeefad63323ee0078e7c170951aae3de94d5058afe7423359c89f5836ddd0683745bd8d8e5cb7b046ade014f913c4e9ebfe1c7bce4674f0fb257fe2daeab7ba6098247eb015a0b22c92384328d2a1f50778feb88f1fa3fed60f21cf586bcf25bffb870a5292a8b286f8829e46ac793c56a8a898a64ac19fbb5752d2f5df8ed330e8d54aaad46b034d335ac4d111dd32dc3bfdb1d86ff38ce69ecdf32bd7b3e5711772f03ecb783ad9c7a5c32da9f2236daa30e47d8a364f5d2274ef9c15851fe1e9c4b7690469316e4c348c45d2abf22d44f0ee37e9b3bfc694932a5def450e00796df2bd101547e22c7f8f70192b94eb1e13055222e66c72dfd65848753df32551390bcfaf39732687ad00780f3c798e02023afceba776fd6255d5e7e2050f5584476e0124f05609771d4491ce9472a9dfcbbedcd3c9a212aca66fd34726ef451621819d7cb527dabf81c52417259ec9ff478e99c98e65801a84bd79e15b6564a0798593770675a595d77bb54cf5bec1746027b2bb0dfb029eb4eea4c1c1e4b9ad9f6210e35b1df3b5c5c79d75522a2d1b226cdc4cdddd314d4a3e287851e561dd8e75ead054100cda02ab716340b40b21469bb9c09bc1f723378c2f91ceb23f89a317b7f9eeec593bf9eb461ac8c0fbf3621193b2382545234aac3e09527a4f91ba84e41ceb4950c47c84f154a97188109b47a6bef945311d9dc5ffd71c33f8f3d6276d74a633d1259f30c1213a32e552b283fdc4902f0afb62c25ed04d5d105d329ba9fa66e50aebef68bdd953983bb54aed0278ba8c81cea2c2cd0580c7a8a83b5860d2bbf96d21d74cde3f73e205a65ed888e968e4e1d52039b7389cad095eb8573e04fe572add6f525dfd5859f4afaeeb34daf9238fafa374a52ac5ffb142f503de3cbf98eb200f0c62567b2743146439c2208b8ad16521939c5345b8944c39230f45f0cea13b1b97d2c216318310561daa76839137b6b37f272ea54cd0c4c7729dc9bc9ea7d2e74fbf974f41f9402b768ba9345284534e29408248a7f499017c50ae89ff39554d56d41b140fc11dc7e505ccee89d500bd36ce090cc89ae03d8864114dd9ad295b51f55d2c38375864a7109b1294981a908b2280a2acfd15e6a12a0fc7eb4789e977dce23cc636661314eacbe1e0a26a3812836025c23adaed11693f3dc9def0adcf235baa6d39e788fb2d0b72d60a4b452c446c405ca66a08585e7f75cb62fa4a4f62648fc8d9498a7a194aceb0d3837f0150b004b5d8d8b8fc8c0da428f56c52f4bc4a6e9126113c4b4a905284d95d8d4e960947c3bd681aca8a9b590acd0c8a3119b79337b5ef1d635ab0ffac9e691ce665be3b95b2a17872401bd474f45dc04c83d4f918849565cc75174264fafa37c6877dafb263802661ac447fd44b182a615c677ef144afbacfea7d30439f3391d62052a265043503a486f0a93063375e8a937cc08b6485eefc813b177e52c63d69e1bc2b85f613b9a4cb91d121a0012793374dc4ab3e179b9cd92fe553c33df00bc98b24c7299bade13c29af8af93082823ffbe1ff06b9725defaa51bfb6c2b0e67931b492bd7b441a8cd0a42412cb561f26c9e8724452c4c92cd9037997a9cac245a45436a43c47a48ffce21ca807674157336ae38834b8488415c9b02a3db290f4e04a15e94902cc28ca8fe5915e3aaf8d893191263fd253387c53003e3322250a8e48d9122b7a4b9e1f8c485132dfdd14f2247ef22eba0ccc54f932652dbb4d3965b8910ffc2c6b616a33136ce958dbe672180d973a3105e64015e3458c3effe124442f39e8b013c1c19a3675d26e3517d4a2fda4db200a6182da5864173209e5819720b213924450713363e3820e09001d82e597d6d179b22b5006f1008e9765c4cd2b9823a4216929ca8969847e140a50e78e32e49d60eecc006292fe156a3982709413ef3c38e916f521b14ba50715e059325a71122b66fda4a6c54b44431759b34004bcd104760f3747be6aa1e776a3e126a18199c46150e00d44d0717cfeddcccb345ad9b39697577ff11227089db9f517ce9f3c99918681b370603474870dc0b18dc90b1fcd8fc970a727015acc75cbc06f70b05cdcd71762c4e54d02e540ca99fb12137c6e8155e3bd54993ea221ef16f5a3f026b1290b11de7bf7fb243c1282836e5f002671276015292522d9f94df38a87d0d23df81da13f8a05ea79c0fb5effcd8c57e9d8d8f784b8b20d63adf0292c6a8827672cc8bfe0ab50d5edeababa45dc5a34de6a0250663c0ec4bcfb4387ba6591a431ea67222c84bdab148a3b5698f1caeeaa16bb81ba0ece9e786ead99439450ef00b7e9131eeb524183c0043e30c17363fafa822ae4c5447849371083774f311825a4cacfcf3c0ade5b6fd0847a4d31356b43b201e6d5cf442394730ce8ef7babc448a89ac345ada3639030ef881e5373ba0a5c3f3a2b5e8026d93e27c28f8f6a1df81726432104c3a71a5fc9c47691e867e6b48a94047b8573742f9a1a50b589d955f88cb4435c5c7607a7acea67a225aa12b329851b4140eeabc04642a0a2357e247c14a533a602e0698600de401dc63f80a9f768b01cd592192e0e930566d4eb67d889a1241d6353d304198a3ae12f31c8098bc80f8d385000dd1eea205998a5c7f637e3cdef5aa423f3ac57e3522230281d2948af566519f6ca7a50a39959335150c9216fb4a4286cf3014440ac1281f8761e299c4eb8c63d7ea08406857ee8c394cfa894640f093811c0be7d5c7ea12b042eaff1bc9a82531253eb09d00265e21034bf1cee3c64c6b2db98a80d78dd5021e96d138bcea0bdf7d15c47069f614247ba84641808ca4a2444dd49011244630797a6459128298e82e0c064be9326915e44cae319b380216dfe6d2dacc6e9e47367b74740a3798454682518faf64050b1ab63e1491b715bbc9963b4c795116d1348d9c0008aa59a1947cdc9a072b678fade3ff663e093ac707f2120a26932f2accaa1ec2764dbb1636dc87bc59c919f01a2bae4a221ac1ef6d6a0bdd009d392f383495aaa5d48620d2cb38248ca0c2cc422df635af3908224fb9f1878b0854c34e4b2b2786d24874e3953c7d2df1cd45f8111eb746871285b432b4aef3bd3984487bc110d7c8528ea84f7b124284c202ad17ba5ca8317dbeb821c55b0f8aa0d673b0db42b022a24ba5fb346fc5de49ad66e0e43d4b4b33bffb2a50d7e4f6254dd99f221ea9548658916dc5214b203f5a51d29e59759b34e24a5557548945942ee0e90371d3d7941be8715ad7de1c85648d2f70435573e6008e3a1ee05d2711b9229150200a3fd374b9ea3e2948f13e57c24ccea1b81ec4abc650aad1c92118923edddae77a327ba687f91fe03fd072de85e6b0d1c89cd3f794dce0f60d77adee284bd5719565d69500afc75a7938455e3121e1a60f1c6bdaca315e13cebd15aa6dad8868f56bee008b4be96a4d6b72659ad3d4ede242c3b1ab16efd8dd87a9aebd682bdc2de6e1d3e1297aa6e3c9e560961400c32fc8832fa1ebdcd5a17fa9f5cbf1b81d06143052f7f580aa6ce19ce38c23e78cb2058f80c9435935e834c8fafdb0a2cc847e18c0a298e715fbe4d15d2f0e301f9dc7add2dd8b9dab2ad1f2126bedd5da72301d9c7735bd9a87315655df2e83c592ee38e9b7c4c9447df32e39e0fcd417c93773caf01b771bdcf527c6834903360e71f60a7b53c8b660b8e71f6e724837950620ba1aaa9d5e5a05c72255c0fe32ef04a37abbd5dc43cb440fff253d62cc8765c065307a72078abcad8648be2432eeea3b82ee3f5a16a9910e6a4a7596dc9915b1318b50042bd5fae4527e9fecf19e837f9a3f0053eae611be02f04b843af99572c974685168d155f15b0e3ae55eb9fe9158b95ab714e0ea915bd2f3643189b510bb455cb72c816b9104b2839e4eebfd22967d9e192e424bf57446d219fd1057e9c3e8509aa6e438ce20d1ccc2b0a7a000ab147238767ca2fa20cee3c893987228ae6a76f4a082c471cd82c05552fc5af655ee9c4ee4b418ae8de2048a8a4e963defdcb1bca78bcc84163b1d0a702dd9634adf44d564df6153aff172f5b103c8e0035145c71be007ab61858ead72be458be238220563e672eb57fe7e5865958f56b8f7360a745807e551aa96511c319a71ce2ec559afba56f6eeae03a90b2625f6912614db9a234de0b01758181ed045dd2e2edc9c615c549e1eeafe4ba1b58dc41d6d85f88ad53a8041cd920a51426d1819b3ff6f7b179325a83cb089b03f3fef58c7a5d0dfb8d905475cf7caae640c9cf811dc704d1a357c3710375705f191dd652dd84cf01d1852576af21d8766e66fbdaf548d1612d18b84b23f738bdb6d2e775194a7d1cab13f81c4ffcee7bbaaaba5297caa7738a4f47ead369666c4e1ae3a71344e73cb72bc1238d28def03f4c1787247f5a0b62cfadf49f5ebc805ad25526ec46ee39b14c20f20fd43fc35613355a95227acf6522573657101c6123893c034df5ca09e7f5706abf2a8d07c3c9a07f4d52c00815e94f0b86839a04fb973bf63e27f891dbba28fa85940a118448dfb83a2328b448deb65e80c8c23e9159f352e528457bc311a48d8679958a22ed76e57add54a13311f6e6640e3628b8e655ad5f773e7990d100e62655ced290949cd5c8b9df2ca91fc024b43989a612677197aa109e0eb2e11c86b7e10d88206742c39ce5ad5b1f4687e493eef280b2fa6c790306407608db23843d89ecb67803d5f3f2f5ec7fb0c91ba8449b790309d6ec8c73295560d44cdc3bfa365e2eaa71be768ff997c34cbb967c55e26b158d8b85f28a19c7935e40bedb2de7e075e507d0c2d6436316c5b5721adb03a1c68bf218141c94453940c3bf167e22bdb47a0671595049806072b2daffc646301202fb6141fbc694d8c665214b4b564b05de72b929265fab2f51d7f434f08209ab920dba5faf51bd2a2c2b117c28a0aa40516ad6696db65bb5d46a4c5660885ed276ee79b54a067fa8b8d5981d1547144a79dc0ec29375a17563e9a6da8f3a98ab56aaf422c6fbf4757ba2c43ae5521270fb43d1d0e4c010e7ce0de6f1c15880ec527acc8b6b502bae83ffb8a9c6ad361e36606e1eabf8ef8a42e76a304d8c0305e9c6e83e51881f1a4c0135bee5b111a6e00007bc5e561c5fe8eb79d28e1478e9d48ea68c10d569e361e1242d6ab8878169a4636ea13b9ed40819c3628174eda31468dbd471c74552cdb66a2235bf5adbf44ff3e46b1b7c5b8d35ebb3426212519d8fe3564771b972fb1aec77b07765c6bd7d8e07da24293fa456a4e91c01907b72523572eea1c6eab7cf30c6a0b4b83e88073d99306ae05b32b747345c36532c7f5baa878a65ebb20aedbb8666007144263601cefceb17252ec9af8a3f8097cddfccd374c8c1d3c30da0ceaec22e9842d3a8fa3c3da28e8cc23cad28c3523b6f224b6dd1b020af213f8b9eef149ff90faa6d8662a79991bf1ccc88df2446fb35357ec83768fdca50263382b42f46ef612e64558c32a576256b9b1b4a356288ec4bf89ecc87b8c1c3dd26790fd6e92cce696c8010f589e650b91447518a59b95324569d2d0f55d096151d091b57d8bc11d5b7507e7032d93e59b88ce5547be379dd26769977deff0895c92fca2f7b2bf8b410032482ea90aed3c7f45059e7623e02f08a3282abe6b6779fd832d7d1d88ba6ad449a54cf162a538e66f456717ffd48bd6b466e5077f0a5ec1e496a5b24bb83e2c14a9204d250b4bb4363623f992a29ba15c7fb145c25f978c300d196e228c22431df80166923b8984fbe4d8a4e97f13e05b5493e42534ed2521c659e24fdac40606d2ca8139e384e800a251f0c677337331c3e667c2594c4322be10e5a29fbd847fa06d0fbcf203dc4327fb1874809bdbe3bd556cc610c3e8a07aa0ad67e332da610bf880ffe41bca914efd31bc2d8748f8d7241037562df237983813ab1f4fabe9b7a693d3d2184d1f92d941774239addfbc949094727c5750eef086793c2ffaa49e92d79208c0ea52bc70e9d93f447e50688f180fb28fb43f17933b9e3a07b28fca1545f75f592b0fc9430887a32958c91c4b8c741aab5bbc29758b073bfa5d6bc3ca240bc58ef91bc51604eacef49de5860a26ec33d92bfb23af629edc16736a55de97403383a5016cb2cc21d1f7ad156f98a715895d0fb5e415fe70f01ceb87ea83a5cbb47b598427c119ff7256e2c705fac35009fd414e6f3d3d9cc7c2e8bd495e8458d9f5669e028e1618dcecd8ec1b8eae7d75bab0473001f5223d0287ad44866135089353ef080fb28fb43a95e71f5e218cf9530c22a1e58da2f6a4dc69420d47a5de16b0cecbcdf52695e8f48205e6c6fc538a929cee7d3d9ccfc5c16292bf14bfbdaaea7bc5246ae24478468b7e60040492ae9c321e724fca7b4ea8a5c2c8d6e02bf3beb54dc21c010194c95a1da62a0c504e297f1898ff845b53c3d9fcd4ca73369a4ee890a1c1ff1a46329c5c4d2fb6063b1d3263dc7d2a688d7fc6e1a13a2478fca6c02801817126b9469e94e49bfd196343e8889828966a0863b422de36107bfbdaa7939821b5157e9696958e0e7b7766180a650ca6f69a951c455aaebca0b97cccd1e655b05a186bfa8bd3c5ab203f8719e2aac267ef1563945610a83302b4a4b4bf2711f282813900fc61647bfad1ac043e52c17acd2f2632163a34170dabed607383ceb022b788ad022ba645535ba689ca6ea11995b446944af896093ff2f37112797a192e6613c4074dde509d1a392888e7018bf9d53086d44bfa824fae158897ee80f647766389970aeead6db64900498d4c93ed674ca8dbf429acd7d9ab2e83462ab6f76447de1a2eafbf9c73a82471723500464ca9f9c7d10288f1403cda757228660a06b41e6a160b3a94904dd3cc31e06d609b1ce417b91f9048bcfc39b6b8a9b16ab2e268459630032f38b958498fb4e348d150ae15825b02dc677a4c5710e5ef1c6c92bca899748f889de6d957734897af16ee33f986d1e8fb8907b22ea635ca7fbaae171055a8d478aa1bfc6fb73a73a41f2256021a432850758c5729c02049ad73e28ad6565c893f35583911116a8c0d4d55c84188cbc913aaa67654d88cdc2451f47e08bc130c21cc0074822d75280baf7307a4adc161838b27f9b496820edb6f661629c1c01b1aa2ecb209b56df5469a2a656d5cb3ac858f176cae6652c818e57aa3bce95d43df4c0b14d6f29b9ae69e8bb94ea48935bc6ec63995a245342ea7ed7d5d7b2e2619db03d622f638c0ba960d6e0640620477931d8997e4d848f2484771dc89478b849e7c8d7b7eb0f47f08a07a6addb5079a15a6f0ab851f73e3d66d74590a34ad4960ff1250a0c5dc653142f6edb8d8354c095c3c9caa9192baeec9582b7dcccd84dfdca42520f528f8f4c3c469f4734e6595dd95580131ed82346b94ae1b6456da9bd2f8a130051bfdb6232c847c0016f0b0edd626b5589658ace0a10b023e514479d256c7307b73ee0750f23c8f24a5d45e31dee9242b15e211c693ed3e5deffc8219ab007dc062dc9fa2fcf193b326b884991e476f25ac292d02b1c936a5d0f029e283192d2feec251cdf427eae5495c0017ba1c6b53ecd730b7a48a74e3c1a8e5629ecff18fd79f355018530a8016a01c2fe95b0c1a2378a994b948a0ad2af31a169fa8f3d07105f17e009651f2e2efc0712dc1011fab5a756439836c55b5c3e752dad6375a45b7c89e5c15c748491a117dc54f2e38e474c1bf5fab93d5baac3607bc698e9253ece78d6062580437b56fdd6fc6cbf19e75ecf6651a7011a29544aa283257743f4f3aa10c0acb7155455a370439be3f4480d0521d152636c910e2beb9512266f67611266f408755b91cb1c2292fdd30937eebb6849fd20adb5ab19a56b64d123db0c204429059a898d7e607c18302e842093163524d1b86677ba256fa89feb0a6f5f6bee15d6389611d512337debf26460b7669372e2b7eaabb1d4220eb5f3e12c402836f36ed52f51737048c59a005717ba16caba573620d0732c5c68e437972ee2ed3e2fd142b171d81a2528c06c4cfc180990a0de30e15b4a903abc2353591d85c47e9a1db7d09593865e44d9b72dde8b1f4fd5922e0847cac3dd9d70f77ea1f3e4da8e69ad7f04140b4b6c84a85ac716a7e50959e04917f5fba6590e3dad8366cb40565193a0f2a545e02c2dc27eb51abb9e6212feb9cae31389e78009988d995a7dce6a440e5f314d84c41ced9463324463ffbe4d400a93984b7582a68f115b1cafb00324bbfc1cc4ae509c90ff1e6da10c4ec72b25cc2d9531f70936fdd7f641b8a7a667ca0b0129deab856d177edd3b478e907062c71c8497ae8897266d868c07e1a51102ddc4c18cf8b0dd55b72afab5ce1b27ba3b6667faba3cd392b2e337217fabef61386d6916fe89f93f647f0e05fd676822fa2b100dd4e1d7c29a3ca3a62bd784cd7591ec03c8cd9f7c71cf9349ca97cf2ea329891374c8f591ae26692564f403a50f20363cc17cccfce9e3d89196b4cd5fdc7b149da6c3977da8ca79cf01a67f8fa2e576792f1a2a6f67ed1c0ff7c5f8fe296c9bbe58d5d410b786d070bee67bbc562a4d0f089e54fb558af24f7837674028feef51f9e56b7780a104a37909a1710dc0f958dd820fddf50bc1d1a10c60ea3cdc95102b6c6f9b03cb0f90caaeb90ed27ec5ae1fc18db5bf6544432ccf581b8df35ff7508e262148bc3904b676a580989f56327f801f2d26d8acb5420d859df4e2d751f54f38aa8afe5b2c406430026962572fc37e7ffb0b43668b78fd581c1804d3f0d21080a2ee6fff88ab2f3a789f83f17d8255aac4deb56191ba9af475ebb37e8eaac675272a4a1e831d4c3e524fd41481b43087087e887d442655e5b13aba8c31b1800ff8b0f620db41bc37fa0fcd14989d985b768f5d280efeafa0adb9d3184790f98dacfa8e137b7f21f25494c825e05794eaeec4eb2fda0a43d6f15a6a51d4dd89d65fb05586a8c36da9a2acb313adbf5a9d25be4c463fe24005c2c3ab9aa9a4505b1562940ca740f485a4e54228781f69f659a6426c2924467fcb34b37d70598893c8e08b42f83adf5bdbcd5329e7c3b0662096b789ad12d67e68a60cfd418116b8476650a1d459c4f95de13e327b37adf067ea549bdff1dc8856d73315867764b04d223dccfb3c6c2349a77aad176b287f5c7de8b4a903fa60e3eedb64eb4b8cf1e7f61d30dbd0e7e4e1ee53ac00c27109fac9afd36b2901ac61c61a9870dd20d3bdc1a5de0670d86d3a4d0994f934fecba7d9c184444242c8997ebfb5bf3728525f4797b656bdfa42c3b4f64da95b2925b78fd29564e6e6d98bc142bcda6e9acdb42d87afc22eb2e625c30aada1163487ee3b698aec2986d1cc74c7aba6e3b9f5ffc05c1520be40f8855d77e1d889828b871861e360d2d7f5b11524830b85e99502c758195f19f42d74ed5ae6a5cc2585af3031a8bf35c9e6b8d136be42c5a036ac678a41e9bf35727b0a32a4858fa549c80bbb42c3e08030e9d239a29dc8b27a6019db32c64318eb6d50d319d9667f8a5bab3e679a9b9fcbe013c3ec867ae35d8c122663e4e87927127b189bb8a94cf5150fdac54d9fbac01f305ed7cc43bfa610fc6fed78d0c67f820a2e5ec4261607933e40896a2dd32868925503aa25c45af1c6507a66396de23460e78819a5c5a68acca196853205fba5c1e8d24ce832b851606fc510526e4c6ab109c6eddc1073ddf599427cd8b5b9459c996ff806de3fc6d6172460ee01b2c91856c5e076b7b00daa45db1b902587cf9330a4d3209171ad9c7727d8ef99694af61483916438c3b5261d0059ee9e44a0239d44d7809f126a9831fa3acabcc25dbd65987d4952c6c936eb1e453ea65b17fbc6785834ca459a502672877b7f90fa17ab9e151aab4e46a73b6d43937223accf32f5b586c18d666f19838aa4da0e9bb4df7d135866668f05228efa45605e0ce44efc39862c0bf958b1633687f75089b5508941bd10310db7c43bdf657968522eb9eca6e5f6fe0ee206c36e8f1c925e322ba5cb9bac74861391ab91d5e4df0f37b6213ae19d2a14af9f46b6fd3d24cd3e14535db35799bee0297d1259a9ddfc54f5e4799d64b4bc88079f4a594aadf74ad507374b32380dff106c8adeffa3e935ffe19ba567403ea3256662be2077071a13c77dd486a58ea11af6777e567cc1df2a2e60de05012e9a19f44cd0b76d06f3cf79fecd0d6b3207e2deb6c623e2adf154371f13fdc561590b08558832c95753ad9e59b9bc2711d8cc24f85cdf467656a8e82af3fbef323c4f959c67670f867d6eddd60190a5f7e5bb12314a2497fc5acecac8b7257eb7ecbeedfb67618385cda6a09fadfa8eb33dcf88bc724aa311cd79fbacafedc90a48186262f05504db556cfa726cde5c4ec5c02b8bf3068236e3266513d15a947678292fe715d74ee56c401b166d5536f5d7693221fd77b3bc7675c4437f187481fa8f07e782169d5881fef7da70b20a7790bcd9a09427623977625638a8de65f28676aa617b3c387f7a88238e41e17f379857f2c775aaf7b78523a5f75785be04d6a60fddf36e907f7934fe5fbcf23f7226a063ed144da1d18882b041fc052ec014ce650f2c2fad57f741a8d3d0082522bc8e7b7ef0c2a4112fa69308db53fe223c4325a32199dd3f563a59014c8fa23a6622aadba61485e8a3c58dba39d319a5e00e16be5efe1b1968252ba57f27ba219496fb6cda7966da88c31e0e645079f6c6029d74c51ed9a8c4c9dd6ec8ce39b77ab45b7f4439811d57ee4504788778cf1ebc38eec1ae9cd90669d15f5ff59d2b3fa9a9c4ad70421f950d2a5388095723737733146ec0c1afdc139ab36f8f3c9d09ca55bb95146524622bc2c840ce8d10037e093cd20e65dd6041a88eed4d49c7a505ff23d1596edfb50072f120d507e33f7a3632e45f2a6bdd1dac9a8ad43cdbf0c995c665a0e148dc8506327088a6ae7943862c337893e939296bac38c43836842277b11e8c11885c41c3035d4e8628c8d1d91b651af2865b29e4aabd0366064d2a86792a16b49a284d2a26823c86c30b3613c8391ae07d15d8f56f7eafcd430dd280b1c0a53eae51102d2b216c41c6191cce1229905e38c62fff714d841675fb1c1ad185b8696b5754c486cf1ee61b2b439593145e1ece03d10b6ae6d9229f66345eb6deb88b655a60dd1da8c69d3bf5a170c8813331614832649e65dc57b28f9d4a4cea3f1a2e09e468816b6abba66b842b2f69ca73d9b7e5d9986af12a5b5562f34f15f98ef5e2d706fbfbbe947eff53f87c1aa88f550b5ba94837ac487cc3229749535facf3a6e0529a2f2f7dcabdd0f7d7d68fd86c07993ffc5638fd8bbb396c61ee6f01cf5da24dc8975b70aced81da6e02305c6201b2c570c54a1206553c7fdb2c209b56c87ded65f53929e38ad4a1b8a8a46e0c2afcf7e9932c6300f453b82f58c53d50d87d9c5c7dddcb98251282f0dc08b27880d886e6dfbd26d60295a05e623c06057247d9c7c2050eff60416db8cd599e65fd2ed1312904a2fb22d493350ac68b4bd8fb3432276b58499217be25f99c50f5fdf0014d87236caa4b2f10794960dfbe4f7875b49b96dbd47b3d8eeddd603a9012c6dc325c2b32497346383d46fbab0db3be79084664ec8c5fd9a96d90d4a3b544f8c239415e737380796e561ede23ebd0b3ecbe4f83d23025e9255ad80ed905d3bdc0748e57e6228ae822c9afa7d280b6688474c36f4d00be98f7bdb6104c8e60309d9863ebe521a6469a4f4d305d938ad71b9995d55c4344ab047ae827c156209c59a5034d38b21d9e4879183f4703cb71aaced55f0ea86852c569589a983e76de5c05ae071411fc581b8151810020ea80cb4f9c2f30ddfb9269998391fb8f9029b06c2bdc803615dfdf24217b6f42f69652ca9452ec0b890b4c0c56ba4b2155e9d6eea4905255e27594424a25f560199963585bc14fe4d4920dd90df4259b9ed1c8ccb29b274a2dc678038d3c79218aad24bd11f4a352ce39b108b3ccb8ab60543033345e171667dc55302a9819ca1c7d68bace677c8697969b17a234d660da88fe028dae45ae1f656e23628c6d448c31d296e8b2f1bc9012060c09e3459cd327f7c1c03873df75e4437f524bb0458386d0128da804a1873092883e09f483417d604b4648bb0b77c109e1c29ba33d3bd07713d2ee8213220726443bed59576c45403f1a441046d6ccdb82fa32f0718706517b3da9a51687918484ff388987cedcc21798174f2db51713fda341a34a7b1f8ca4870e6910b5277f8b824af05a120d25e834966860814e638b6eb948a23145e9a1d33882adb8037dca0823a93d2bedd928b5b75d596a0f4b7b353c741859606cd15e0d3af0a5c22c156e0123890651aa49522a2825f430fa0c09a5aca490dacbb81d164c910a82addda972e2be541413f7a5801e3a562312e8478348a9535252477f80dd894feaee6cd2da0c893f1cd65e8c5f1701fd2e25a5f632c95246b902201391d1cc7f97522492c1d20aa2d8f9aec8348ce20f527b5f049af98f0691ece20f6c01c12cd0e18a7627337d896a30f4d16526c743fff44be9bad2de16b1e0e7a1634f5ef840bfb0b4b7452a107a488388c9c36b09fb79c84b54aca007ff61400f4f3e34d822163cf90f83022fa59da1a1ba13c594ba13c55177fb3488681cd190d25ecd43a76184e33f1a531efe4783cac39d2128e052e7b07503681b827be26c85215b9aaf868f14e8f59ec1dfb5b97ca1b3842e6bdc8de7450a19267ac59ec123fa6547cf47d12746ee88be0cf1c8fc74c7bec382291a89243320f732b4361c59ca4021238484e8b33bfad95f82da23625b2f4370c5fec2c44b9417277eb02bf60f7bf94126c3c3c3870ea3b1600b4616aef0d981ce575dc80bfba4dd404f534a79f229fdc45836ae7772e8d87a2687aead27bd75396402b1f48a1d2ec12954668af684a09019a2d93c992a84578c1ad42636e1e570e92f5e1b1a434d5885b3ca30d15d2a4acc07ab4c50772c13f43ce7758492118a3e7c297d900c13b14e30d0ebe8bfe873da361e663efaf480b2cb3c69ef7b9142e6e74507db824bf045a6c9b30cd0f391ebe8937102c3b02b667f9142420ac3103d0097602bfaecaa03db8abd8a20d8dd21f3d0b3ebe833de86725e11339d36146f28c8eddaf0d27714f465e8886f8f3e3e5b7c198a3e6bd31e87e82723f4dd3242b1c64b1239f8f9f95982620bb4b3d05930921cbbbbbb7178e8a851edf08eacbbab87ec7bc48d822cc6a2b2e84b7035ae4d03e8161d09fda7adb6929399428790ad0128f40fdba21858f918638cd1972642c0e83fcc8901e8164141e83fec8b3260f2d0b16e8c2540f41d9390016b1013f90830d9756d3c2fa042b4873991ee80a8827ebb84c49f08dc2524ed61ee268facddc18f325d11e6b7480923f4125f92fa4c8eb9d72f7aa8af7f497739997fa7d3d2e599a39cb53b2eee5a723992eefaba5cc992f6ae2597a33cbbea1254458204b67827fafc40d21ecadb952c696f1fc5e5a0d7a5f9a98528f5c3e5323d608e72146744663ffa7e63573b916d347f50d2831f49cb205eacee5a47778dd35d7b0c0eb49d7ddafbf60849bb926626dfbe80f67a8984b4b7fa76960e255b7c23692aa80f1faec811e9aedb757668cf1f7b24be3dc0e2bff88be574077e7da9c316925db5b320b74bdfac47319522bb816ec718b6bbbb2d97837a051cfb2074083dc69ce99fdc5fe8132a59b8bc32c2e616835a644c613ed50ccdc7adaa66aa2f33333333b30fde493a8957b2f5807d735f1198eda09b2add6ebb8ddbc1c89099bdd99999378e44cd7d3cbedd442184ce70b77b45551f23c7b831cab5f954df3054c3e2c6085732332f33f3aef73233af942c659432420eeb0e639392c94dcee3b1e81f005efc5bc1f857df857f319e39a6509be6e2170c86bd50ce79fcf4cca5f27b731fe627df7a4cd7695a5315436d5a85e9aee7338f1b4f264d7eaa5f8ce7f1d2759a023cb0dd08b9863da821b8a7637cc283070f19f6b5f2d19726a359f7ee96caef1a0d595fc00a69cf875de78d3cba5b9cee7659edadafeb68cf7f9dc296ef6a7d5500b457dce03fdfd642b6341f1f3d7bb6b1253a6cf113e8514aa11f3fa9827efc2463eea0f6bee8fc84a170100775c7de0b51973f811cd4defe74b90411bc753831b94acfbe321f5b40a5f7e9b708ca0b8ab4c7cf4ea4bd8b93e1013ee698f773c6cb8e55f8d90dd489ee9885baeb983ef39467266287e1295188dafb78484a7bab67e7284ef46750c378bbab392e44edda5c3c278ea174c7bfdbc5f193ee9887da63e729daf39f51380aff3ce49e2841036e01f51fd8e2284b608b9fec8a9d370b940efcc7519ebd5740e76fd11550fee3279cf1c908e99c7535ac3582383e7cd8a1bdafc3e1d1d5746b77bcbd4ffafadc7e488f1c8dfbd27407a5841e69fc6968e051e65cd7bbf656b8487ebdb72a899867d8a5237adcddd91febbf23daf41a65d679e859e9753a5b2e8a0837b6b713422bd9d2ecba5475075da5a3d3d1d5a866bab53bbb1df4a306b292e3976807426f126a2f08f620946031ae847ec4627c1b5c6046ddc1294d24e586d33997faac45a267d3694d12638c5c92c935c7f8dd80e2a17ffc3dc543a129f0e889a49c601e7b8e3737aed3ed83dd7e8b5200069f953b2e2d15cf0ea53c7bc492f3393c7363a0ed37ea9cdd5fcf6ca7de75cab443270fa53cf558597c335dfec8c137d3f7757a4e9e1b4e9d3929d41d1b15d14f0ac92196526e77ed4c9d52cfba727733bbac2cbe89cd39f8a62995e1b8cf35740a27bffa25e281d243273d1f3bdf2de6e09b9e1eeb0def2a69fda217fbb9bd65e79d6750a3f58b2f87baeba49472480e5529d41decbace85da6b28dae3a12c6e3ef4fc119aef7c86db0845e9ce891aa7dcc7e3a9778c5d51afd8eaa903e0556b438554aaaef3d56ad5e1c0d175ae0357d506ef680d35b84d0d3fa0d46da8a1a686531cd08d4bb1381b2ee6b748892b32a8edd603e535ded51aac86c92aa09f4968b5720601fdb0efdce4385a80600d1cc7c92ac3721bbc06cf3e25f2e51443b589e86712dac170541c6e53bf9eb771de786c3c83da456fa0c11163f49ef7286fc8daf3ac44e2701cae036d2a0dc7516df8ac3c365a8066784dfd60be73564dc2cf6e4395e921f31a3cf31abc7f403b8fdd75ae03bb7aa2513fd3c97be3b9f1cd092841362a8e1a87ce36be9cdd405b805a9cb43c69016a0182595a9cb40f36aec15183f7a83ec3331cb55b7af474f06fa7e4e0df1e6d1178ac94a522c73f1d3e871c1cfc6b3d7f1e73f16beac75fe3d706247bc6b61e315e83c359dd0e9db487c3db4f1b4fb38b1ae32f6a7418150757d51c8f5179b80f5507ffa1e610abc4a468c5f4c48e006ccb9d43fdc175a83e388f1ac373aaca71a8303cd6171e535db8e71d9fac7c3720379cbdc7d7b17fc67bd5ddcdc999996e8e4a34492c9ef176ee87e9332bd3c6c3dc8dbaba2263c9a315cda3521cc3da5c59e21cf913c7d0577ee969f02cbbe12cce991c079ffcf7c3a5b3eb740eceb9e19225036486fbba7f42272f5b80288bc5dd902c7696ef36d312a5bd1d1c7a8b13edf138f41616aca7c3a1b728c15e8b436f21c17a322d23f0e150864b1597afffc5775f7c77c7d70f63856fa0c3fce06ef80ddf6d86eb41fa9461f9caa34b26515e47003fda99c539ec928b2cbf1e7ce51f74f2f1c7b8e48c489fc9c137d1a59301ece0485fdd7002f4c029e9bfe13fe40d1c3c6e40b46f5f02709f8e5f79eb07f7c55f49c7c1a3c7e82e369ec8e59055eecf6755fe39a7ac73b27e643fc3e5e09b15c731896fa212df40e7b0b036d07df8b0f8e686eb409dee51a3f3503de7a939f80e5507d75179784bcd71998a83c7c4d4d5e958857322161a5c06f7754ce29c98856fa05be19cb88566050bbb4372606d943847fa60e11cc9e49d062c0f3d6ec139b209dfc42c9c237f04b0c543971cd81d72046be3c33912886fa0eb386779d83b02b0b556ab981e80efd8f100e0f82683b581de5af95c750cd7c3e472f04dfbca75ba39191d7ec3a34b279c13a70c40063b389209b36cc2392d4023802e8178873f9300b8cecf6f2e80260f3d07e74cbf21bf71fcd3f1b175a8aa1c78d496edd873ea693b761c2adc8edd088bc36188735cece0be4605e0da1bf667dfb8af9fa7e3702daf6e77319e83737a3a0ed137ec4597acc9ebba1c73e9d9bcae1963ac49909c1c6e3f9c4e3fa29f78a04b4511462f81440f423e12c915d98d9d74d7279f279f6e04154618bdd4f6070d5fa4bbc63c3332fde45aec0ecddb33edda7e4c3ff9c749529f99b61fa69f4cd9a995ae98aa745277b005f4eb25252ced2d71cefe8fe8adc5ee4892fac632dd08731ff79269fb21fa0c720203fccc3113cd7123eaebf9205aa4bde9ddb94749a4bb1957c908fa6491452e66a13d04f7707797d06bd88cd7fcf63a0c4cec5667e9553b46a90a96e0db3f1a1ebacde620d99beec2b77f370f7da5f64bdf5b742b739a99afb39c3a4bc6359593c9cab7cf5e7d7de5dbafc6f2ad115be92cf247fa481fc98408f4bb808ca4cfb75f417d057dfb0524bdbfdd076c5ddca79ad80e8ccfebf425f45b6388d8337b3e21db9ae9597b3f81f69123ddcde93b5dab524ad98325731cc50a2a69ba6b24ca0e91b043ae484572a4bb8944baac48ba9b7ed5223dbfd949eb5396695a912348dadbdf3826f140d27154634433a77f304bf41d6c1581abe918f5eec3f9afe328ec4477d38b401c9c13f7b1585de74e957e7a3b817eaa9faa19a7694fe38d775b2847618f32af29af753789a6489aa72bb0a58f7261643d36c68e1d320d5e3d5b1b280d315e9963780dd1716c57fd53d17f3982abe82fbe5b0f780479896fa2c378e53e1575eea3321c106c492198e8bcc439311e39ee53552934c3fd9ae13cc3e70c9799318397766f66f80514e36ba159cf9dbdabe16d5d407015d95f361eaf130c5486cf8091214386c3c858da1dfbd13988caf01929193ec3bf0b88860d97aeaa9fcad9b39818671b598b0d1b36fcc60b1b364e366eb8c4c4d018ee9be1b286b7c8909142c9f430c36b788d199894f6388f8e19b5573d3a36c5058d19329ca8bbe8372a94d25d741b151a75176d547e1975468d2eb556e760d4ea43cf57df8d87631a2c1d03f1d993a49e3954ca751ac63de682d21e0d8f7e05b537c3a35f4cb427c3a3672e367cb71e366a7856c3db5134d06c95abc1c9f460c3ab571bdc8b86d56032270dafe1996ae3a95143db7ce8f919329c999341532b0dde5cf524a9afd5dd511b10e834d048df3620315e390cf073dcc72ee33a9079647c8d1e323823d2536e44c695f0c7b84ed7a8fb198cb6ec5c8543154ed15d7c51194be52cbc45fbd0a8cda47f64d46ec24154c663b4547997e830eac70fc337293cf50f1e5d406b133da65e49ac4d7478062ac341a4eea2c7a0d25df4cc45a31b5f401093e13eac0352c5e0e0d1c216adbb9367fec1a30b05ec4fe206043a035d4eae27bb637b80aec200bfca75a0aaeec3f817f57317f5d360eaa77aa9415c2ef5eb961a447c5a83e8ff2ea08f9eaa4ad8e4d351dc876ddc47b56e6beccec4612ad5ca89cd1822f6348451946d573682424cc5391a0de847658d7169a00978e959724d779c9a471e83d13ee558dd8d0709ca3f1c338982b20f93dda6779dd8c4362ddb6a938871dc598c312e9c291e4aba63ccbb6258479f28d7e986289467b389dca6a32684ce4cdad3aec8db278e7da8877a08ae4e9ef22c5591e88066aeb991ccfbe4df2e29e98efd34f4f1d033a4e2e2fce2ec9cc45658e90a43c13886d25d507b5af7c6b3411490cc99090eea8fa178de6feca5a2dc65bbbce572acfbfaf98bfb8e3876b53631c9db8f8be39fee7c9874473995cabdeb582c25ed510006497b29675fb2dde223b8624ff96e3ca9ab09ea1795f9d18e39061d7a73323ffa53fe0df1d1f77b5e6e3c7c9403faf15ef16126edb17393f632d79c81d8c97f0ce5850c692f955d3df0c6836558e657c56493c77cc35a0261327212eb06fa26fa4ceac0d921e09b20ed49ed080e8ff6bab53bd2e4ec4030d273956737355003bd5f550762df91c58a008d977bbbaa3b9ec1407ccc9de3ff7a624d7c55cf609d65ab61dd7d31623e1b68ce0fbb26e69777c5fcaadd846f1ac3b80e01df3417659889177d98b24328e887edced26f8d14a4e1888c999959b294bd35cca6642921171b5298a18f1b7bec58ddf0070c9dd923735d044c09bbdaff52bf4515bbdabfb80f9b3ba0307ebf25f0103e8c6ec201748bca80e52ff79726c9dcddddddeef3da1dba93be03136874e84184b4b7444cc0f2d287c0160d647bcb377753a1df26119135e849a1d432530fffcb296ced8ec67d58c67d34760b73291bf3df5c7e54db4c5262f425852be9df4ba01f355d30dd4917a2043a840bd249a02d2f236450db76c822d85dbab20914b2942c36126823d11ed1142f3df6a7cb65c9cc2b99a3cca09432c628f9591c5c01ffd1dc68ba2e533c395cc5ed4efa894342807d9d3e6d1e6374194d3146e7c83531b923a617715d73fa5504e645cccb8b98ae791198c98bd038155c71a73561d764f5c02294171532ffe830b286c8308ceeaeef73cd47e949380cc478ccbf75c96b9a2e7d9a4c26d334714930bf38ef4e5241a34fff58917be6964b72f9c726973c97b34b13c75c128c6b02fae5aef56abd3b18eca3b16244318b6c69be6d231a44c802daeb791953be017808808734948685383cf4e53efaf178184f29475df3d3e74928a5d42dd0f394b3c0c97df3ad5ffcd63588f2263047ed7216d8b6fb342ec9724d48ee08e945cc29a5cfcb8b90d38b909e79111747e12a3ae645649ccac461dc856193935ce4a2cbd8d3720a45cf16bb8840bf751f3abe437bd021c6c5e8ed52b029cffed1168f5db1efcc64e59962a0d059ce103af43d8223c83a08343acde0357f5e57162f87575f575f17b770f29452cebf2a4b72ee71071f7419f7e27677777777b70ad063dc6cc6685a6d0ec61f8edf9a4dc6efe59de698ef7a29ff60fcbe7841c37a598e36633d94afcb6c0ee528c45f9c11cd2f00fc0ddf4e311adbb5a36c7c7b66a343abe16bbcd81d33d666866fda615e6a0fa9e6b0f6685cfb073dd3b6fa1adc78807ed2c0ab98db0e73b8fde08c44139c1242e9d8c623e5e4201769523c99c8b6864eb971e1eece5d4e721ff6a97e9d8b90653c99cae3f04b0513501e734d8b928b3e3720d3650ece397974250d399a18e3c9cc28094d3386644efe70392a6a2ccec11cf2f8eb939f8ecb772f2edb80643fb91c5b0f93cfe99b033ab92acfe4a8cfa69d3ccb5cd6e8316aca5705c35f60cbe29c0bca199f315c623e51a8188c9a1b4a439d50280ee5a84d3bcd702c65b81e58621e89ccb88b2f7c71f1c30f7609647250ca78845b8f8972d3068488cfe03e958c249fe13eec73c8f04f0737e35b0f7623d365fcda8068cf73d32627833b796a26b20c8410c3aeeb42cdadc77493bbca690b8c5f95c537d26365d7813115c6a829095baee23eacc561701ffd7ec17d2a1d0e665d38caa17cfaeea665dc75692d73a397a3fc53d2580f284e93d15cb571449cc44e4e2186f22ff6c0dcc889db9c3720da63ce3ef044b9140adbe0665ae5bf2094ff50ab2b77db330e3a63ec13fb823e3113d783a469190c030bd9d6409887f174e2647e9c5c7a8f13d7f358fde2c78f39d4e99ec794f443d7813c70bd8d7ac6d9bccd9a39a093269ad79cf28a17fbe408f91be2796de2152f6e7d72230142c82c70e219ebd6c2c87d47601ec3b893cbbaadc9d6b8efc84b8f1b0f98679ef50624fa6e3f26ccb87559bfeed74f0b5b266f8871d742c9450a53c05d2f6cb7f62ed6bbcb7337c9fae6d667b60b355eeec8cb49f6dd80ec10dc7335dc010c0c0c0da6b560bad5d8c57d1885d978aeab5eaea3bd7d4c076d6fb7130f1dddf1c293b377acf6a64b29fdbaaeabcacb3923996b2ee3835f3abfe46408d0f397f7fc6544e33aef8e9b50124d7e399fb0bf2a0f7d3d17ac1feb4fdc77447b2c064f4e7e55291df34b5e13ab0c05df5c7e9297639cd6dd0c37e3974be9d952e89315d7b5d6c1c4adc7ee2e8e39aeeb8e610deb825817b2a5f96eec5a51b272e58238485159aef9494d491d3d4119832d17eebb0355402eaa4c7417be3b596402fd6850a134886010292ab122e07217dc06da2fe7faa5525184904140bbca55dc065c78fbeeb818e2824b4581591a66f1694fc50eb3b4f7e2e2d03da5e4225348a92add25fdb4c74e83284583a85b34887a053d955aa25ce94f10f5490505c1968c101742b8e05241b0674709b63675e5a5a6020fd89c206b855f6fc07a2f7c9d019b23846fda15b01e0c5f4fc02259f1bb4b5800dff432606d9aae107e9d67737474d89c1df8a6bdb5393ef8a63d0005c8e103ebd77fbd165fdfb19e8bef0d5dcd77e363bcf0a0ed9f4b0eabae97e5e8584ff375189b83135381e8551389319cf322ed55eee32ff2cdbc74986d2181ab760cd0c7fc832fa5f3e6602e3dae57c3a563bbad1897b516e9ae590a5afddba41ed5751a09cdc7cf79967535fe35a34b1bd323176dc4e9fb36bc65da98a9e9d7f663c2559d6ec3864b1b97bc84e8ae1ff14d1b1b55c375da460d3eebcaaf1aff46ddaf816d978cf2aa107b6931c1d0cd643299dc466de2076727c661b61f2618979376dab0d4e9743ac54bfa69fb113dbad878e67cd97ce8f911b919a952fd88df440cc74442d81d97070102a15fcaeeb8bc9d89ae996d3c9189606b77ba32a141ecbc460d22099fe16db812ec6f00c115d0b767b5091abca3c1676de247b513e3372a06b0b7c141b004dbe2172c0bc1176c8b73b042b0c54a3007db622dac126c75935e69e1eb26366aaf60bb761a6a37d1a4bda1b487797b07752bc69b86cfd0f00ffe8c6f7c19dd6486ef077f86c754c62a4b29837cf776cee22e73a1369e8962d911a216354d281a9f5f83a606dc782eaeee57a28fa3f0ed33ead751be5d46fd66ead723f87699181810ed518086489118b737e9a7183f6d313128401383a361300451c178e142c810062c800ad249e7c5a585a676f051001fa84831aa355d77ed2c2b1e0adfce42d0f808cc846f3f55d1f1b11270b8083aec0e0e82f3e01c96c237ed548cf0ed385246871532510bfdd650c91a51645f862b8dc3fed27c100cf46ba1f62e8750c02129edad771bf594264ae29ff63e5f6aef639fa7f2edcca4bd24b682859b6ceb47d8e84d5b87187ae8f563a3b7d2a37fd786c9337739ac47d8e8b375acbbde24e7249f9662f4ed0bc8965983d1613d42c3351196af8fbe89daa85b4a7ba155332df7d975ec4ab6ed7537f769df9ec420f6f07a23307ed2fb88b6717723dce852eec29d2bc3037f8d0eb8ddf6ee569aeee4f6765cef0e6641d7b9af206401c56f51164cbc8edf222b4b9fb5c6557e7cf8fdd99ca84897662b903131c277a24bf7d138b4c71aa471686f2d286cfd148ee06a9168924ac997ba296461f9c0d527fdc0d5fe51d07fd823b5fbf8f9761fda8bdf4740df8df33b4350706b1042395149f80cdf4b547e96f5949d288edadb22259fdfdf191a6a4f06fad050378c22cb6ea01896a5da05740ab39278c4632b8fac212f8c6bc3ad7d3b54a269b4c8b34a93d7941162cdd86226d4d7f3dca85d2bbf2e95325316f4970a25984085124880bf5428310536475411596b81b2af769918a90a159389c2682c1d35271310bb36d2a4e34ab635598c7ecd0823fc758cbb62fcfadcd5baf4862da5e4608c305e41f47337cf397dc619218c10eebc164e6e5d5e975c08a7dc7558674378c9d074d7edb09579c38c73d8a62dd0e841ba5bd6472fc2e6ce8912c208619c52ce29a544a2b0e717a317e1d53997c7eb82179c10c229328b1e84107e47b48f1ee79cf39a978c1e43e90e23cb295931ca18655ca29925969288c0162b8816625c9185c3d281d3852974ba2025898d4811204a004407812d1347c4081a44ba63161124304135a18e0fa21d7c3ce1ca13b0c80ec820916893a4b47490214742862c216df1a8892061063126ebf820dac187164270b5314e2c8810218104aa8819bdcfd15581e88e8b10012288109d2844458020d21de4928aaec0c27f7bb48435f5c117ae2d90a6c0d2329f405484267d88929011830c39123244670b9f1ac44022862491d10c32841b421406a35e6d0c025b3a473050fa683d9323b8da9712b682e460e9940109c220425433344d187d4bb49581c57a12e30e57f4c08b0c6694d825d432a18ecbe4814d0a2c80c212260bb6744cd84c91ea6ac59d8610c2092f245eb24841162db8585de39b817c7c7c8eb0e20583cec26129584ba48535fa198950419325a4d0c2480b2b5a4d9881167ea0129eaf204443575a1ce3f649af36088b42855443bdd2b90251aff6bfae0ae9aea5044a4b5720e267dc0166cefc0b210b5cedac4384b08830ccdb1bbf4447b8f2f1b7e80a2efcb744291ebca884bae0630513c430052a3bde7f34044a9012855191157a708422e090038b455aa445aab9a205a95fc77a194acb7604ac03318ca0d4041a2184f00a1dbf91c6142a38c1083bb08172608918d4221cc18a294df0a04b64c145cc8e2270600a76042ac609385418258231c1910992d0811644b002021d3b6ab052a5000c1b634430a25311b5ec8bd1176c86d0822190214b01086218e530da418e4a093250205d188a0116249f273ce10621dda251085128c1a19c00c5432e18019524e0c00b52c01c104208e10d14fa90cc317a8adc977143ba630fd21d6326eea318b713040e09c24f0e41008215425081ca937c7c7c8c803285960583101328f0200c467881040000820fbe3d621aedf69976a7e970b0babb7bc9c7c7c703b1bb7708b24ed041135ca044132e5cf140b3babbbb83c4f676e0313cb4e2a1634b7897874e61aac8e221141e1249217ae834ed75354020c1e3c0c1a0d8203379910a1b1401e3f14a180106a7bde8588f07b2e042134135c8220c2eb889310c384ba400b52e8aaad081b17c7c7c3a0065c905bff40ce8e7cffe03304821dac11381a8888900688df41903ac17633b76b846413e9887bf4390ab7aaf98e17ff4b9efc85241e3e89020422011df1eb12abef341169e8a1fd0e07b088fc19e0871ca107977bbaf296377ec8edd32767b9b9b646c4cc69e8f7d4df6281365227314a9a5e929d0e93ea0d191b5f2db9d7c018d1eb3ce414c7cf46c6e3ccbe5a0d8624cd02efac7fa701e932ea0df1af9681f82606ec25ca731e938bf2c8cf38ddedde2f0610f570a74592806215b9a4f0225e9d11ff4c9b02a454095fcb779f469ef72e991497b2d2e3dfeb43856fb33de30d7e91ab78a711af491d8e6b465337193d3811bc699362028c75adc949ad395f4d69ff2594da914c5360cc3b0944f0efb817acae4d9a6b54c6fc13e2c3efdb09f1cb699b61e97cfcdb50dc35c6bd2dec6834d6ce3d92276aa2617cf1ce5d8e6da0fe7d08dd380a663aed3da073807e5f3744a6d546bf213a5e44ab94e9feab6f7c2511ebbe5c251a8cd3f94a7b81e18757293b7b8b86c8e71df8fcd31c79c3720db74ed876bf14f6bf22d7e99b61ed331ce08e629c7361717d3a6daaeadc706c3e7a632b9b8565fea346d304c70e369e172506d8acfb02a4f959f52ff53cac4611ffbbc8bd3aafdbca89abba82f0e535bfcba745ab6cf4b4739b6f974f1e913634a29b7396a73978ceb0185b90bf7f16f322e7ef281a7eb29caaf16ed29ca53fec56ff1de7a503782e2a8cf7f4aaec7fce2b4971a7b854a51eeb340cf639eb5b4b4eccf77a9fc1ba5f2a963d4457ea6699a928b3ae69f92eb5b1cc34e59fe833e3e2f27c61dd1de08758d7acabf23dab76c1c10cda9eb744bfdf86993ff4e593582f293cf16dfeaa7e43747d5afc7e7514eb1fa69ef63dfc55b5a6a8f961f2d2e2d3e7d7a0b877587d1cd759aa638545df25b3da2bdc6691fc856fb4056f7596bf2270e9bbcd207255f34493a4a3a4200dd222c4c7eb7f82df2c2cf67a9ad3dbfb025c4f4e5240e92a3ed2dc5b63b3ea27a1e897dc4648f1c41169ffe591b761c448e916a5bc718638cb1bb61470ca354a5d2ba8b44147a8f1fd8c1ec0661777707f923ac6f181ff00455aa0bc68fdd41e660e2e6bb71310bcd228f8f351f3f9a192dc6184d31c6e833c62c0ad3b3d581622ee3f683865775377db539e79c2847b567f2e91426bb816addcd6972ac9e5c4a082184ac87ce30dd4d0ab02618e87784f5987f41fe927e5d521a61c7341853d56885e90ec21a533e5317b73f24e6d96e3f9c20c3cf8877275d09bf115577d267ba8bcbb0a344c17427dde498ebc06bfaa92a4971310b16bd5b3ee06a7e2b85878e9f3534188afb607ebae326dd4df7318d3e1c1c56d7b9ab54d8bc3823763f32b5f644c6447326999f7c693ed6eaee6475774eb57d765841417e9d63d48eb03e9a6aa8163e4b4bbf455ca8f2df2249ed547747abbc9355a1871ca5bb1883dae30df408ebd763ac4d9c3ceb248ac5c40cdb7862c4e21468dc456a290ce1a4f6302bacc46a6f17b684e09d85ab6b6ede5d6ca627c7ba8b11a6bb250257d0672db280ee361efa2337c40aca50baa582ab2747d03f9ea2928233050b0a66e2a1671c050a5b43bc6399540f9da10f81ad85dc878383711f8b75715fd77915da1eb5ee966598fbe83031c675087d79e96a9a946537d0ee76b3200f594758cfde6c8422945e7a11487ff2e83e31ee8e934b8fecb14bc7580bbebb63d7e6dbfe63a417fd4cc47a26f0d91d50890d9600ca6fdb8f25daa22ee27fa1f29e8273ba4ad6538573506580abf22558025b2aef7e92fdb75976a569b0a76824bebd4530451b21e50c4659a66871c43958f8f61fa22642ca188cbc30e5af1c4dc109d011df0ed31cf8f617327c3b56db5d5aaac03954f827ec0e964223710e57e19b2c9aca0f013c64a4f6bef81ff48f91802cd1438e91ba83eed24297e819a9c5751a426fa1d9a96e8ef5e69b4787cb3793b9203339392d5cc90216aea064852a6461850a585cf153904214a69cb0caee90de534e08e5e6bd01d97cf3f5b8fdd836dfd7fcb4691bb6b9dc7e6c9c2637fe2f3c6fc10adf3ec920062c5dd0c2b767e1db4fb00adf6e25080ca83e725ca5bb7625d8430e89cb7ce399f084049be54ad4e5ffd75c1f7afe02aa57a2fae93d21350dd13d2e60cd15d9d6b052129ca8aec02850a87168cff60c55c8c2ca3a14ea2e8a5b591ba1f696fbf8a1509b817e900a58ac4d3b5f21b4d00921869c0c0ffccb71d2f37719e807a3c028df5fa09fea7bc9da3494ef28ab8235899b52987875205b9a2a80200944d0c2ceb600e09f3f2bc70d8d0f0307aed8af0a6d5c5ca74df5eb79939665d0e79c734e2927849a63365cb39149e91042083597366c481b6a70b84e673515870e1e46bf990d2a48bb1d779ab39ebca69e2e79418735f5633df40cbaac9867529315fbdd605c7a19f4279f9784326e816f2edf7771f1abc625b8f1d86058a7cb2a671dd29de61906793b7d004208f44cf49963957ff806fa694877fc01be818ef5bc062b03b16eeabe1337dcc77fe3ec524a29e5119cbf719667acca51a640f9e7c609c79ea9ac0d3b637153f965ed4142690e8e02382f5937dd2c168be5bdf1b024ce0e0d647e489f3e8bfc6e3c60cfce58501d3870380ecf669558c472c266957eaaf10adf4cc7b02df00d0e3f71587738707032d37908c4b2aa551b75a6faa99ae212d7b805be7171592f7fb9352eb563355ba13e7647dc7c87218f39ac1fc5b213125cc59333ccc30b7aacdbc57d9a9278a4fbd40e3caad0940711ffc349f1684f6220fe8ccf30e5bcf548a55cab6c85ee0e24606bb178e24a0f8060042da8d060877d093bfb28218267fe699f3e74774178b94e5f2c1fbabbfc729dee2e974716e9729cee2e4ea59ac0263de48ca8bcc533556d7118357eb65b8f165739ac2a7ff1c2857f5bc5bff0df9c207bc3fee285d7f40b7fe13cdac3fc85ebec0e1afec267daa3c15fb8b757e32f9ca63d1bfc8577edddf88b0fe65fb8d62d00f80b7fe1b1bd197fe12f1c0900b8208f5519ce325cc6318715ae8dbbb384dac3fc844924b015717026c7819ab376b98b8b67dcc2d5053bccfd546d5c5697310eab3bc651846a4063fce32831ec04cd43974236f508eb63228490668706319ed950f96fb819ce36d4cd68a8fc3595ad501aafe19cd9a8373cc88bf34b0dbe42face717844ece49341ee5b241e2f6d749285f39295b90d36cef4c62fb7c17d588de3e03e9c2ce8b7416cf887791ff6330a5ce5a8fb59bcf11c959fb5473795add00f07002c67c769ef268703a02e5cb132d769cc86ba6bc34fa2401b38326ee17784c79f3c930eeb6a898f0da8f415a23dc85180c79f3c73e92bcfe229d650b7bbd5767b8a92831c4e7790861a5ca5d57da843d606fa8c2aa342192a3138558551f75f54eab0b6bba8479f5b79f6971a44bceaa772a9df6ef1ec1a0f7daa96fac106fa549d40f728cec8e6d06166b809455881154da860a28a13769808cfdd6fbedb0e210159189145e8055798c2187636c736252a0425458108289880c9ce66f4db1546bfa17edbba09d013ef20d87a29c20559c080084b2cf164a7bda3b4b742c0d1e40826b2e00112507061a7bd87dadb20c0560f122520a20b2be882154e6065a7bd8dda5b201c51416aef2aed9dbebd93ac746b77bcabb3ec0ef8ddde8d04ae386897da79687708f11659b0b4b77d3b2f29213941a90fed4376c70299f2032954014516a519ecb4141a466520a2045f78820992a8e21b094f041511851e7cc109293bedfcc340ed75ea79202188095c98c1123d88c24ed1bfa0c11542f085282c2185043b3d424a4f8a8092823338418a1d015c01657e3b8e01d693507e3a8864cd4b9a3ff58afdc35e524fbaf41da4079159102b8f6141dabb1a0b9a292dc1d656a1083f36288114aa90e2043bd0394b7b3a3cf4f6d9c2436f26ed9d1e7aff7413e8eda4bd27ddda231f1f4682dc69a887090b9288020faa982245163bd0d9a8bd1c84debb1e3a4731711fc642dee5d08710815ea43dd3434782f4d095b4877ae84b5a08e8cce447034250f0820b9e30918520ecc0a02a3c7466a23dec7dc0168e773d98410665d042951c3401cb4ece43d73142f6d055b0a5000e80810959b8e20a3bb8c2ce0eed2110ae78291dd328085e1e210856bcf41959248417bc749af666badfcda9e1352e07ede721d842b2434020facc637bf5b3acb5609964a474b484f4ccacf41c04b6d80c7f3a9dfcc44327ac484a0c1e63c263d8aec763c841e3e3c0160f0de19ce1af1afeba98a8bd26f2f1f94f569e423ac6f114444b3e3eff498e89b8a145b2545445117e4e5fa524a42323a2a167178ad241fda481faa77d9e3dcb92529223f1c7d200462d244ba44b57d21d33115c2d41d21d2f92eda09742e85ed2ba676608ee8126215dc036094cbe3d52181a4d768c2a557739987fd7453195aa3be6a80a862955c166ac178766a5d47437e74af9b9009a0cce7c4d77d3997637b34c42c87dec7c84c7438f55353908c3338d3323ab94996418618cdf111adf78920840127976583f7f0855bfdd7155221f762f1b425e8992f2080eb3d6de10420877f019233347e60821d4b0f63a46d831c61865c718e31563bc628cf18a31c618638c13cb628ccccc713233333373ebf85d9b0c42f60f4218047f33841042082184ac1be8c02c7a117633d7ef08646666ae818c03da1ebd08679c587bd3b1083f9c871cbb0eccb2e871c723381b8ff4f6628c9143f1d6ae7d4a1e72dd0e7b0cf4a3365478764fef7a84e6255322e8fe3eb4029511a2f9e61b2784e63d3b9b84b9acbf454bc420d502de2c29208272c406862bcebe26d19684bfbdb1cb532d804850fecd8288382e111de18a0c82c212ebc4542f75d2134f5c444f18dd608b474f386118d4040be051134cd88b2c1f78a7679f2ad01b28e6d90d5add3cd639bda5b65ba65a3a8289c9649a31a949d1114d6c684b473c0123e9670bd36493c78728ffdaa7cf125315a24d9c10ecd35e735f73ecb34b7c9aeb2ce378e8cfdce4eca43d262d2484d1bfc0d6ee303925114581025d228a429499e6ce10145f90bf9220f9cbd4a6ba9faa1bb7dbae990810458864396af10e27f949884f22c49b4c3a5897c7b879139afb5f1a2744af7aab9aeb40ad9eea92eed837b6ec481125768c1846378beafa2dfac9827f6c6cd378688c8356d06fb3b0a6eab728055462bb4ce478e88fd397b4079f5d88f6b6e809280c45b75e82b60807505e303f79ee2998080747ffb113cf71369122489c73da03f0df6239da9be917b7417c0457e07cf620220efbd79cef0eec798797b52bf67ef66dde690bf04fcfa6fccbb72809e837ce6cd67e664e42420408de81a523eb20ed7d46dab9203eab9076f8a3856c3da0ebd8b759368bb396b05c7e8b94e0c17f2c557b3df34b2effe06f0ea6d1765577ed1f8559025b44dae457cdb2b53155acbe8447681e2683353be896fccab7d3d4f4d1d3b05277cdcccccccccc6ca5bbfe38c9a79dbdd5fee3a4779d5e9a9593bab3c24a7ce5dbfb522204509ee6b708892c3fe33334ddb1131a7ed2ddddddddddaed3d0fb63a0232494befb2d4282e8b1a058d027947cf0bbf140ee63711f4ba77f7ee6b7080458f8205537e1a22642bdf4404f988967ef25d8a270658506a1847e43c10a5ad424e967fc163521fa6c21156893a567ef2adc4a7d656a340f9110fa1bbf4548fc7cc61b0f4f6f3d9adbb591d1bf468258c02ba8f47ec2043778ee2a9f7b3427bf79e8d123c66ff8104218639c729b62a0edd8d6a39b5b0f467dd0d79b8333959d6c3cd397da9b1c3bec004da23a0d3940d72111949ddfbf911aa997189584ff1aa997c3b428bdbf40bb9b070e42081ba90cf46b24a3effee8b0cae85b5547d86869c9ac3b051aa377c3daa3934cdf1e0df7e1113642d2dd6e57e94e055b9cc4aed851e02c78e618f0ee7007d14e6aa4eea013e8d7f3dc59e8421f1741c8b214d323c4a52b3ac71863e4d8d9888de0111f5b6996c25660942d601418858dd8888d36c258942d4d9499498b1088ee3a4697524a29a59452ca2334f506baad1877e1df2ac178a9a0a8d42c76a5494c992212001000005314002028140c0805a3b16040ac6aea1e14000d92ac5672521b88398e52c820630c01000000000010001098218100208371ff2fc93ac7f3f252315e71ac01cca79290e62a604498accf2dfbc80d742185055b94cfacc7ce1912aeb01ce0638b540ddc368d8739004ffe9ff0d7a44965093e8a9654ead7512d79cae817950721717a39d74e16cbbbc08e3b2583ebad0ef1daf19f853be30a24759d125b692ced0d0dffbf1f2ce565e3829caee38324e3e6c6c8cdfb26e968bcb41df399a82a37876a5252c0e005e9b4b3fae368c80620886bb8eeb100266bfab90fdb519e662c2a2856466f6e30a7b6886cdc4840ebf0abeb307fe2110401cb57b72fff849f137bdef823518e582543f7833bee29eceed08c1db37073fb995e4aa578b7a763cffc045bc1295a97c1144108a42366f560344d8d9c4405c1fa12a52082e437240059a5800bd6da1d3e50ce9c9b243ae3ffdd1ddd75b740d9c9b35e8b75a26a4f4fda238c0ba3705e93b47d59f85d7f607e1fdcfc07f683ffc07ef41f9a0ff6b1ffe03e721fbafeb83bf99098d3860ac8c60e9d5c3af186d823a507e6393ca8b85ba0eee6edcda894ffc062286a64afc4ff869ccf83d91a082a768c3500950799e6efd7e060320d6bce1a646f579b3de1d62dbb84f3da1235087f993b8150269983ac9c6fd9461158b2dbc4aeec490ca4ac248fa184be9864155c38f3c494253e45dcde8d033a5feae7e9ef0982d1b2e7f404fba55c5fb6a36d473d171e22761a069928470998074df3c4f4feccdc6c95ce951a9471afee219b32b92ababb9b93792f113ec8b6922e41a0cbe8e3dddcb6889344b6a648f3d308f5ac8e193f45f0730007dbf4225200c7c75cf801b013e5a43fa706dc1cfa5be9523b61fbaf2b9c1810e16f6d6b7b554388b0170611086cea34944d646fde50c6a4efbbb4b660930151ce61613a6530ce52079a2c0df913c654f0e663c9d91bb6dac56e417f4b821e4ec8055c16a379b889b77467137b60accc46ec5faed1fdf6141a38d601754faec01daf80a7bcf3df2718ceab20475217d7b60267dfadc4fa438749750ca672fdd586d3ca510a60d905cb3c5388cec77a5b388ace77c9daf892f15f6d76d62007029ee2112b246ea82bec213c4a007a9089bfaacc16077bdaee682823fda97477135575841051a435618dc67b224a37f70546ae25b9c21b21df10f796568892f050eac1a906fa6b61209cb9e9b9d29843ec69d1faa63f65d242f19a16befe62974c07bd22dc60f6fde6d001cf2fd4d245304d0fb53eb243fb4f18cedb62a2c3c2511186cc96f2027806651bfc0041470ea95735870eaf15e1f0c621860ea536263b6ba7485070051b6f065ecbeb2c17d472220428c79cd5a2350f95343277a078d87494ca88b6a8fe98153a50cb728f6b8b67e531e251793b3f9e6fb3d504164989726b840fb4c0139e0c68b01682011241b8b86913e548defeae5f3af5253c26ba5c0579205e89e66d129feb101c1acfc6e0ce0155ecfec1c00f228da819d51c0e14fd77c1984110464afd6e4d86febbb837b13c42b78e3f7143b72bafaa2ee6d05b3dca948426c999a5b2ffc15e17df1fc293a3389b9c9a99f1bc0e305faaef12a4058e78c66543944b3b811bd86ca1c7bf843f83fe78ad5d08d69723f75276da2fb771a0af1cde7d3fa3249fc210ebb66720fabc17a3948a96270cfab22601bb9872499b2c8751cc518af520b98206449461a17309f47e10174b6acc0473baa703730763c4d4109eeaa2ed926c760817bdb4f87a911c81d81b11cf51a355e01bfb3899e24fc83df97cba57de979f0c7a3a72251bdefab0868172330c1b776a3180604f33c2c1b7b1e88a62ba46be8df952779884548b991141c01267f1e05a38734824fdd8c7cb6291d62a333d037c1e33d7a6935886865453d697390309317aba68fe2d0a5c35d07481d636ad9f0071dbee5e79dde3143c944beba2ee0d623cb165f83a5d526969f84b9e6b6624e9d702c242eb668a103dea0c72f36aebbb7c92ed4ccdae5e7dab9010fcdee22717312ef68634a1036dc508b3e73d4e0850b35647c67c38059d99330620d68b3595c2ef0fb0fc4c057cedc631602a4cb8d6cf0e316bb3e664af2b60382383660bae0afb910b0806a2db243c567d78dc83a773d8881180268d5ed547744d9dbfff12637da1a895d00181687ca86ca29bb004f454f8811082d75eaa5db2e95593c832299ca895bdc975f3be995a242974c01e315f1b3aa199554e168dac697b6e47213a5de549ac743741b3f1559594b917b0611df478127e48c39f0d202f82e87b0836fbaa403e44d77d10d25a9fb668e5ec978e1bae16e63649d2b512ec06c5f4a9aa0903489f68c283f68370a613147913f56ff8caf5e21c8a3880381f4b4e3efdea9540eb5f9ee3911c644955ca3aff420ec694805b411387258454ae0edc9461a9ec90caf17020308ed3f67477e297ab687e2aba46e87ce3bd3ed4aa67163c8e580c44618211f401ea63e9468558deb4d127ad8bcb5d062f437eeb8b5b14e5f8d59ecc94c090ca9f792d031e4f54f021424450c7f922f145de02d52c5e65f309ecb2687dfe7aaa551191cc95f81247d339732428747f5cb35d0750745258283648ebc76190b51511d03f080bf0a1042be73f56b9a87e043cb8a0127937b677ddc72710421840b8c80766a09e6f2ad059b30c78e5504d67d692ab204045397ed6b8cfc8ebe05b0a045b639573ad19e5aa5005ec206656b348b72a86dcf6b23ec14408ed74bf3a366ee50b82f8724698571140a9b4669286d000f08e6e844e0453950d176039592ddd1850710a372ef04aaa92a3cff407feb8e5e9a8f9b576dc0e8552e01c0c5781d227039685c777a0989d1b58ad5f3d693dd8f37f353d0c9b679a4b11715904b30254765c02d836fb7bf3806cecd432c58be3c17be7b1ea9c3906da2163dc480476429ef0394009a0557fb2d03680a4bcba0bd67a921cd681d5de6c35e40103c312ae20d0deaba44dcf4cda28fb2ec4cc254119bf12a66fe38e93b4c7e58882a4920ed63e24347c5905a25367f419512845e6a368c2372f61a798b58ea4d0030b5f19c1d5474b0874525c53bdb5989c684d3e87a300303a4d61a9d7027020c78289b91b5120b895c67964fd1b6c91207cffc64c276097bea458f8f6b78e02af1a9499367d7c6c34d3c22df09af560914abdabc72cc70f3ab4857c88cb0fae356a05bdffc93e7106c628c45e0ed8f995594f7c2ad02402961a4d6b1be37c19ab31b80aa08880ebfd7edea9a2f3d912705bcc4c5e650712d32b0745ce8376f819df356750f161b6a5d4ac5dbd88a7bc24ab7d2fdad60da6aef19a7aec0492a9d64838229be3ee77dd5dd68ddbc7d8e9d294955847456a3a61239b0ec15218797c1377d9184aeefca31b43b525ca0d388a69990501a429e97c534092891b6646445613e84e2b153d82890fabe4e429739b7c82c347bb49a4b6d24fae3666e843d6a6a2c31585ef5ca20694d7e444233f450ffafe71e4ea15ea0d79f0fad9f6cf6b2e4fe8600904cad223225e62588289b3722895994e76d57f58f0673d961570229c99d1794adee7eb35c111c7ba5de778e7f6869206cf08b3a4b56913526c0ca48eaa23e3cfa5581468dc29184965a85bde7df49592ea06c5042bcc2ae484e90f925302e965d0ff3e340f72d4041cb3a7f115edee3797bc33fcaa43b0f1948ad4397f5ca99bc85feede58f515024c62833509d6d9ac0948688449b73953c7316a678b5a8cbdfb927e2160a01e3cd4cbb2c06493c96b73c8258583dc7724afd90809f9304731a91973ac987866eb51ac9936e23b346bd9858387230f3c26336ea335cfe276a99486d8d5a0846f423ae149a43e04f1b3e1f6bbabe32f1d57e3874ca046c10b71f6da33e224761e440b85d831c65ef60c09677b4705fd2dbec273e350c5f18c274d00ca9ce8142ac7839f507c18efe1ba415d99ff888492691b870ea8f06b735d287d3d007539d825ed8fcfee6a990dd308a5cb3e95a50b8d9257242334ef5dad3880bc58f76d34cf8e0b5d3634cc6f5c016a4bbbdd3d3ed92ded10e045f5fb1306199ac4976fab3d6e253bb5bebf43235e283733d86dbc9acc6d3a0988287154781dd2932e2ee1270d1a28c9340dd5415ac132dc600ed237ff4521555fee34d337815e718bc93737846ff64d6662b03023f9aafec3659262dea610abd5f28047f76f20a254430de20872a9e7d4ac44b93f63d30062d101f2e50a62a17da01f67ed3ff5200856fb064d148a3027ff915a5cfbfd408abf495c050fd8becfd49faa86ddeb08483b2eeb80e08f72b4087c651d09fbaa7c03a8f70fddc867e4c8e7769b4a9edf3b129c560b493095facc28ae9b87220e429965497dc6bbb37f9861761fdc438d3df896ba62f0b7bbcd5871741fd4deaa25a5951774535a71c13dfc85d415111189e432c3cdc05e5aec41bb62c56a963730615776380f6455563ecca96dc60317892612aac68a3a4dd3f010a853dff920605e26f2883d95860588db52229f14236453323e050ca6f73dd2e7bdabd9aeb09f8796f52f8d6bfc15e04f8c2615e1e00427253e3e1d220c4427751c6a3ca333a8ebccb13cd8b32c33b73a683a28230d2ba83577fe95daf6f484273a8ca613bf60b090c4cd0f4fd144fb1c327164bce200b91780070aa3664848917142bcb1f193928eee96224fb0cd123015f49b25c50cc5cbb3165622e1ffc4b04a4d0f994f44c522c74b8c52305a99df21d2c4f24544a89d69a9d66e6d58b5d1ed94566abe11c6f0e38e9e6e7022c253ade8ebb8a64f6b4cf0508c91e9421e70253d204c168122e37abc8b25c44474117d7dd6cd81f63d307809bd56673cfd3fe49d90b527ed85c352862fa91648687185dd1712c5f4829240bd16ce3ed72febf0fa17c08b4cd926d2f135d90012033d4a7502f5e59c16e3889556f0db2bf894d1ad8ea0ea62169c2d23219e46a6e2ce167789d8c4718166bea6d78ee08bd878a603965514441f0098a862f2ecd910d680fa3d233c385fbf6e9eddf8057b70e9bfcc3e50744060821498830c32d56cf540b3e3febfe2e7790ba3b8fdef31c600efe32f9293889b26ce3b0537074d89f956c501f14c6df2e2a3a3063d1037ac33bddf34fe6464c0256561fee02a6814355f2818b6eebd1f59780641816a157a112ab880318ed4509171df33e70db8bfc1a5531e1e492e691247503ab4051178456599186e60dd7e05e61c92b64d8b917358756ddfc6c77638651118ea24f2f77457015290eb8a751fad7f971116c6d9e80daae2a3337be303ccaf87f2150e8945648d0a5360ed572031998097b66fbb02f29ce8112490c9a111b7e8d342a99adbe46f81e9e6a84b84e0a53b4d18487b68321cae18b23747cfa4813d8487a89b057ca623e95e39cbd0692ad440e6f8b3fda31539732494511f3a2e69d23661f5bdbab46feaf199a7a890bb2ed06ba37ef640552eb179ac0bad08536fd01845ec2184e1537d02df40632b642d485fda7d6395a0dde6e214064f5099ef1a4bbc737ab8c099eb978101d729699578065e3e9577015603a485584787603dd8357b36447233abeee6e7c8446671521ac2d6bcfb6f93aaf5c3e1f60da4cb021f0dc0d4be53d8c3a020f8b2537aed1d734a7099bed9c4e4133143c04794d5cec514815915b928ffe66b4c3122121607d1d8c22561bd604b54511b88b24ae501ab6009cc4761767e1bcd7d1aea9a84d50c2009888f363a4bbe92b109c12e53719a0ac0201fa93164ab57383469567d9cc0460ad5d5a0922c158e1784d0c8681371fa24591f45ee11bf6ac34f139e2e93fc8fe36c263699c7535b8b4ea52649a195c3b4c70e0598f4ed5ba82e7ce080889252955c3fdeb44c7f6e75ba5810e130d22c35013ab54450a412f4c81209eb0fdcbc87810d0401ebe97abce7839155c74839b95db9d7727723c9f53c4f0009f34f3cf0cdd48cba5524a6bece72b3000549b5196f0e79f293d25438fe899aae6077e4c9977ff1475390f23ceeaff6e71f38651fb796ea3f324a860d1c51f097291112c4b0ca39006b54e1fd7c131f298f3fdb2c583e42844521bfbf10068da56fdf7187f70d1310fb0eba68d1f3f732f340e6a2492c6de93500425a2e8b4d3f218f987c020fe8314ad3cf0f56a0c762e7947cfc0370413d231ab42ca9e25125bd2e53119d08e7ff190d59ea8176b50a1b88d4d23381023f42ff8cedb83f24f094a2ba6d429b2d13b56e0e9f35e100080189a24e3911aa71247038236e8fd2fd7d4a823bc0ca9c749589a4e73070573943c9c964cee691bf4e650ba4a0e9435adcb164e702de00fc1f9b2da19e18f8b684b600faaf3c00b6636840f223e9ba0929186ab1f2e5df02c8f9fef6c58a910be0b260e0a4b8123f6e964527000c2fc7a7f849b37e5b0d3cdc9dd2dc39c6a132004da5b5004a32aefa49576f88be1214c454fb6145594e12ef546b5f9f332399fdd786d253be7dd1560598001e5b0d59bc14de524d3a70a824d9a61bd77ef7a74bf00f6ce48f735a09c21683dbbe1f6320638f31c1a7ee88b39cd21c766e0d260001b9293bf7527f9c8a7dd18b24b103a1f82f13cdc1bac749b79bd86c800bd5ad5406332529fa23b04fce613e131da3bf5b244f4610c948b40f42d87860a941dd4120c89f32394a76fed97add37049928f8663c2ab8a4499c23cfc2a38739a67398317ac67fe4e4d31dca9fb8b33a34b829a7ffd1dad9d14b26b38248cdfc8ca1cf6d6f9a6f84b3ae90014dc5014351ae69472a05fab684cb3d97d1537cfdc46f508a73185957ad1e7498a44a4183a59939536880b3ad5562099669e790bcbbef4483d8cafca900db6fde0373105fc869e3bf6945392538c547883a1d163e01ba4fa111efcfcdd3cdbc58bdf264d7804d8422466356a883942ac18f529d62110f0dd96795ee10423d8b1fe03e8820714cb9a348b5d87600b85aa9ee578faf94fca3e497c9db58d1c6d6a797d196c840cd2ed67a869ce49052a07f6ee236b2290723ad2314929d2f2890fc5ad0b1dcfc934b358cdf93fdf4216a39a02ad83322a2416cbb2a700ce45d71ec842b3407434a636b7e3c180f5dbc311f5bae996cd2af8d43995d2d42f586ba202a52a7ddfebee520a1b0bf2cc7ebd164a599eb6385083e0dcc40ee16276cc3e3e85d5c7291b5d6b41ffb09ef632efb8a958700c6531da06f5eaa77ef86b013caa3a8c4a790f52508d688231c07d2c54ad947b8195f2945fbce0ec7d84c13d754ac909854d5684ab4c4a67f03acaa46d4ed44d66e020b613721e23eb6e091260d77ffb2a2f09256626b27e86066429b764d8b0d5de72ef40b08269b3cbf93cd9ecd84dfb187fdf5e60f7847e47c77e99a369facbeef368f1e0ffe25f8b9ebd15d57174fb48fde55f5e24c9df5112301a0279de61a5a0a6adb9ebb2a031276ee36d73387e1b782502ac358455239182c1bd199a08f3a6e63d256a0c5e85b6501adee961af1408530584d25e4588b9e0bb320b9b99429bc39d944cd71f853cb34a25b0b0d2a0d0d36f0200c11a25d762571c89a41ab69983af23d17dd0e3c2769d9251842c52098bb4e27e39ca29e1e32f9629c2b5345da0d3f2658bf6881efe30d6c372d532247195119679462407e71a012e345d5d344cf33bfded5f96c83f4e6fb443793a762547c9547e5670aa13c30bbf2c285fcb31c972123e0dea503fb63d11cfd95db8d4759bfdc5e13bde05f0a359e72df53bbe07589484cb0a76e5e88af9121d96821d9c2d0b9f48456d9395f5509e9dce8477dd98fa23c3a97c4ccce057ca8d3257e6bd1ca2253496a512f740cebd6b79d0f43dfc8c20c04b3fdbb54a82a2b574abf0e1728698bf9765893c2e57580a635c7ac738b74ed4ab9741b1aee89835953b963fb5bcdca1ea397400d4c9561e9ef1709b552bd2bcc61e61c90a8afbb000905535932e2f1c431a88fb47596b28f2b77e2e5002599894e9ebfcc57ffd90cd66fd0046c89c54cdb4d5cba9455af5f75af6b4bd9fd40b2e611570b20e016fc696e79794257eca8490544cf69691fe7a91cd0c5766b58e41b09c7aac2efa6e04d4d8d507c345977a41f85139109db972cbc019c7884124dd8fac30dde3d4b04f20aa5f7dfe96d8bf1a689ca3038a268853efef2aa42a16c7144ea5bf52515d417ae7c25306ef4fb5331f2c0e6786a20235f502928c52cd137f3942705938149d778b9fe1ef332bac476bc79c30eaeb4798cd4c6cbeaed99412203aa680a3c32cb1aedaf21a80fc7576aefeb6364574851432b96f5c781dbcc075480827ff236b59b5d112b0e0aab609d5a3f56f33e5f37f44551020c098f46059a1f12600b62ac0969f0ceee551a1fa422fd024bbd73842b44df498103b3d3f6bd413f05db6a707843f3d529782515d35a89bb6371b14009222aa28955180287ca638378df71b40292c7c7975e47e863b607019b7bef6d8f8201fa340864a551783707c326a42b08013a6623738fe81b0df7154725ac842226a8a702b4c5b473b0f3b581653d3140f84a2e905085013943ec910704fa73dc50b856b84c7b7da5bf363aaa67c5a53ea99519696a064ce4868e62927d222606a982162a6db051ea2a0dda2006a98a36cca178225fddd61ac8a386b0cd27281b5e8ab53753ede6ba1fd7c226035bc4486438ab70c7e2f7db34f68155a0e9f72f5ee998a11a1e212280829b2a875b1ac695f5891184d66528ebe23c1f1bf7ca2331d5a6d7e852d394f59d30453821cd2779e19b27adb3913afe4d3eb49ac39a150322860e1302cd48188dab687824337b179d408ca5c62ec109a1164a67dafd702cf74c0fdc5b5a4d45951a7ea7e04712a721eef5a807240394117d85258c296019a1ab601395ef2dd4158c6dcab0272b0a75755fd548962c395656c0a0c768be20ec7b06d3ff04e8196355a46ce5b9876d78d0e1903629ae905e017f5750ef3329c4c91a676469850df96d0067a8b52186e6926384507b6431e31743357dbcbd2de476f00fc8e0280a8faba245c22708b12585643b3bfc4d831f14fc67d2ffe8d5f531471019b2594d79b86b51f720e1e3249fc628234f8784c3f27271cb23faa5b3de11ba8e4de4269d28c22b429c99761cdcf12c5af5b212e0bf07765128082545c84484d485f18df1a884f8667ff17088d171e8d146611ec288bf6935a48a68071ccb702f97f8c14c2b479b6cb966a8188f74101d106e5c46a4a58b90400519d5eccfee18a2724464ff0fe1cf64a46a4a6f036d4207aef125877ee0b5f77283454737cfb374bdf3778f2d6ec075ee5eaa30d3a6b532379fd9c87f1b15a354e8e747b4f32097abca7c804123c116efb877432a9142271a7321486986933f4ae98a4ca4182422d028dd950e6960f1d83545963b056a55c0ec94ed8f7ef9c3450133b87e4d62076ae85afecaa7eaf0466633fbe4300eba9d457eb2cc6a248caeb21d70267f0428646c4df35f6dcdec2dd57188f3dd2ab5828d9748689cab26cbd25ba5b68a8ccd2f9992714bc43c5e74cdae9a5876dc6896f5b2e3bf05a9c50e46039ff6ff74b7da68e8c8b1cf74cd30b2d086c1cf2a12277f78b951969b7b2d44c4cb90c95677941ad416a45a34eda491b9d1bcc3db7a7eda3f241161e6fe54e1c1182ba83e8b5d3ffbfa7300a8178e35e6ecec1a836115371eba3849a4159283812bcc19bc83983925a711bc0c74c24b9fcfdcc56ecea62ac767388edc0096db85603ff8dfd0e0f8eaa43bc07606ad438d571026e21412558b60f4c3cb8b39d35860c9897f302aeae8e845e74e0431b2de4a8396e02f61bb9686269cc18bbc2379de944abfab7a50ad2afa3711950a04d3a58fd253da6e29e02defc1595e2b4e56c31dd0738e64f7079e78a6f07a62f4c3ae8259568d06859d12e826ba13dd0cfa9f6bcdc269d61db438156a585ad373809d3d0ef207ac2e72a8fd28e711f83060b2ad177583e2878dbdcb00f4ade57bac4ac288268a5690173a4dda46f4fe1521dc9c70f6f6becd5ba191d4553b6f6d1b3cf32cb13be7908dcd21a99d833690c01d723791ae77ff9d5ea3fc9b3510b5bc8333a5fd854c7a6cf0b2ec5c3c9b18263ba59ee4e59d31b90548e67692efb8c75086259b30572fe1e736e2fce05c10213f9871a0ea9de9e6664df3b5e3329502dc416e08958c58f87bd150088ed60db305153cd0863f662b9c4e1f1bdeceec780fd6781b13205b2f54337c760861558ed1ba58486d643cf77b51b5dd1369482a245e22cee8c52152996b3da9fea36d898d494a6a75f58dc1b655c3e84c0493c565f4824ee666121796a1e5b7e48e0d6ffe57160cbb53d9059f3c7f9e7df29bf898588e0bc2035c4f044ce99230674f139c3f974e72c86db78811082d657724828228d5d4364b6c4ccbdd28d7d7f218b61a15063d00e41c3694df61c6a5493ebd99648cc30b871c1b6ef7af763be22b3464a3b2915c5f1590cb93ef82ba33e7df3d0c1f6d6caad4db069abc4ba2d8e75767b6b6b389dd9e9acc7bee2ce8f8252076c122125472355480e466c6478046b907e48396d52ff409bc2ecf23b0810da212fe0603d890416804e745cc9ac727d8082c3fe22f9a16a74132b4dbcd20f3cf64d7ac058dd1cdb205a71363370c7777beab14c67a76c72bf1f9c4a94ef2525120b951e09585c12b7aa617642475a4a0a125f02347e44196abedee1b796d6e25133fb387bc211331c3341f1b215b2cfd17f17aa840801eec7a81dabf5a24a5202b7ef11e5321a0470ae8160af25a2f839179ce58042b9bda0872b8f1120d4e2c525cc19c3e101542a23b55c5171ec27b11de4201a8b147c5caff5435e0e26e7c91aba3e467bf52fb84a40da31644b83464640200a87a8b56e7e7c66d2529bb091048c4156c47968028fe845d4a1f9ed85faf352a0708c557e478f3d25624f26ccf33a03122611b95733416ca80431e39a3c31686c14a9be92177d83d479fee0274c89158afebd197abf7b227bd9ae1344041a0986bae79a5c4794821a0a3fd24e396a6df105c474a8d80c5a380c215a602a0b581aa4ab563e8df2560a6cab580c917a651214ba661a3119835c6327b9a841a6226b14da0a1f46d0fe27992d4814fd3ec6d9abfa7585b130084876c6befc177fcdcac5837ee12faa080e02be856dcf0809ca5c4e8d4fe48e3d4f0009931e1f9f419215552e2e3738c51315282b2bcb26f0e44ed0cad2ab671022f39e3c3ac3490fb578a85d3eba7c3b8b5b29047bdcc95f7f3f5709714e9abb739fc23e987c16712d884e487d4b86055f79e34939bcb25cfd71ae8741ca29ac4b341251af4e95dc059d6d5719c019c92a5f69351ddda19d55e819971be757891d7ed5c51ea8e99d8f1d42064d535f68f35222e50de90a5d87cecb60ae584319c9562c0af4f8ecd10e3a70b4a5e4f117ea4ac27b9a0e8c66aebecf507850a4512d435a89eb84aea0f7f1c6341a3c2a01a11f285ab96894d806b50b1c9b0d054f257da2d5fe063c6636c496001ca07a6f962042d452a180e7e30a97402bade149994e162d66ddd89b92aa8436445585f7f0237de7d320662a65c55516330093f450b85013df5200a211ebbf2f317f094790bb394eba2cae64d0029a702242a6a6f4757384978647548416d10d720298dabea33af40d0c608416b358c054b86ea56b447a4f914ff987b2a631c037fb188320d8232b3c82a11856a85b9e0d0afb02e5b4293de50c6b4b48492be1d1867090d1552019368fb07d0ac29a1bab3e5d28c969450a74ffbe328a1a84292db50773f055d1b93d0deb696844e8fbced29092daca1adaeee7e056565241477e15e3eb32812ba0a198d446b250a7a60604c245456c841ba74db5350b20509ed8d0a48e8e88d7be74768c4723b911b55b86859e8b9e5bd2d5dbb13977bd4d75c743deb11ba5e1c1ea10b4d2f37233ed38125b4b93dd211ca9e63afe5b0952374b73b3842df4f12d539dd085db1f6aa052a5e6d6d50deaaffd8e9b9321621a7757b761ccfc5cf5b798174c751f287534ddedfc120e9ce34ae1724d214872cbbdca072454a6bdc877797e41ea04cb3b99cb42b7dbf874274edba3354c85439a95ef28677c93f53b1522ff6ac76d96b5ebe6b67ae5ee7b61bc8ca623e954d6c37c36bbd97236140156a139420c994de88636dcabd57bb2f57e4e0a01ff1f96039a4a3bddf33a774af7fbbfb4328bcdb69b724fb3e4f1031c8f63f3b8fdf15dc5f3ec1e275ac5149f928b84733cbb5fd2d6069fc78f11d1a26cdee3420351f5a55897768924236945d990d497b1642e80fb56a123ac3e0fad002847eb81ab2f0d88d7bc64cab8c411c01734aacc51acffc7e414604ab40be7dbc09778683234f2269896a9268a74b364608b4cac65e1e2103aa26695e822c2fb7ce91e056ea7e77635c34ef87636c361544a72fbc402e6e35372faf6601a29483fd143e31121d105f3b7514d69e58201a0ea0c7daeb6a759205c5116b7efed5031ffd2f5a6c2e7248b7286bde509c93fbfac50a6a12724e9ab265f661cde0639c916f8cad718cf54619e27046c0e50b636dc70818055e541a3959be128b11c858f32cf81e7506aaa46c18ba0c23209fe88ac476ed5266909c5c01887a4cdb7848d245f5cd999c2a71e6023d919faa3c2302b4477edaf172c73e605dbc56dd6137743c3e7449d9f6f37c4b94791b5580008d94ab168f5ba03cd4ab1809c42ac1c431c7fa8726f62caa2eef6ab518d910a113edbff55645c79b3a290c97d3a33518c9575a6ee9ffd4fcb0e4461b640c7c9af0ccdee03198ee9404f58bd8feacbb433af489059c833768b760d8da7c510b64e43c43b9c05a83965e1876d6f06cca0d428721f91ba5c05d0e25727c53e45a1efae588580d6a62808eec7a09c42e39e0d1720c621792e6e791496e4b698cfc12fa6d1ec05555a91705d0c70edafed69161c5b18bd423b4204be7efbcc660313d2f2923deac76b0270d54e1d5c639159f4b0dce7f65049f751ca48199e7facdef8eaa12d97dd5e37776d7b61c45555644e86a363daab0a3b242c2d42d555afcd0b708c2c450e2c6eb5b73c953b13cd4dcb6d6c625083bdff58c0b3816ddefe023bb13e2471ef8d592a4547ef161428a98fd4f9b8e0421175262f63a891e4515f5b2c30ed426ec511b628b9f67b613cfd18fbc07fe489eb1bd984fcbee3e827f9ead1324e981e47c78aaef5b12d1521bfc82a72bd053b2b3817102bc6b352e3811c857cfef8d699d0abce53f4d942e00b92fbe2607a8179f3c5e96ca9a95bff45461641187054b33486f99b1a2bd028c2382e9f6bcaa73514fac563cec8d76f9dbcd55f1b3d9cfdd40211bd393808653714748d7ea0cf62544540ef810c3356fe337968bcc691861cc87b6ae78edc74bc05fbb5da37dd70cdf5e47d7192b7fbd7784d752fe85d32c6c035ac28943959dd942ffad0d949aff8c0846f38d45642012f81f8152e4b7111b9f95b3035a1f7ec91c3f20e457d4787105c2079cd583d083b97e7cb7d1a1034322c70ebafa61d05d9d9c7273b8d2a1c0dc0432893c1987b0d37698ae4434073267b887b34cdaf8f94e43ecdc62ffcfa0c96023a1920f74d1e12defce9c8ce8dfe17d61ff1cfe535df28df0c76c33491aed7dd21d3bc893376667c38e91a91b975995dfffa37eae69dc1439c9db2d8f6924c8c0b12b9fdb55d2fd6ebd93cfd93cc04bef9174643d799b2f2a983892b9331e1ab47da28768004aa50f3475f8c34f282d6c1630e15b85c33229a37b512ce24c8a3a8e062caac3d1a948f20caeba89a6d9b63aa7dfa78061af8d6ecaed9729e7c9c849c19818c5af6b57649f5fa6682b13c0412486823703259b47d1aabef558507293f6bea334172221cb6d3e2bdd4c121c16b58ea107bcc672b0ad0db7959ad5ac03d8c4e5dcc5f5c9958d8efb40e87fa4c2980415233a5570afed5be23ac1398271643e0cf4fcfbb2d858ce728dc9e8ee535a8dbe9660543692ed7e9c44048485833a84d507cbb24dc21b135276d8b288d21678dfcc22222f0507a28e5539e3e374d226bcb87a659bf559ec6a1cf7ee98497b41a0d5154e86c840cd54579027accb0bb68d70887fdc38ab4710288de6c8d1038235101daa0c6d2037d62ef8a6bd79594e5ba16df796597c89736b2772822a37b8370da61d5d6eda9e520087ccec9eb7f2564a759387795efb6eadf606fc14ea3879d962756e664a11c0c83bed60f2c90dd3f9b4a17b517debed14d8fab6aaaafa417fddac7738ed09ba51c7159e00096822e6d518de3b4342319a8b1704479a4893bb2298f2e659dce0764ceaa84c88578998f2ad3365823d2b6daa9bcd1fb09d465b2956876b60931da9581e3919799a0cfc0daa0535fa7e50accb2972d60273d5e49c257a5d2a20c5370c99213b5a051719cedd194bb945d9e1df41c5562b08cc076a02e7317038ac1a195376df483bd56c2d846ef69c54fa051577bf8a937b1348d938bc959a9066ca2eec663d23108e54839d080c6f1f44d8fd79c9df92e218512b15500c621b0337bad62d661e379e07ea42ffc3886976ad3691b16c516caaec2b35d6dd2e4d0aa8ceacb796cb0f7a784b244e074fb3e638ad110ad39ef9aad73ab065fc26acc9e7b6f08556f75ccab843a47ae007806005c9462cb1a39d1b302f2655e8494d7e6de77b9d2968c2b42aa4da1ed6a20cf999a3b31274e671fd3322bbb3360239495c62fea4d3591c286641c17546345100b360ee5b630b3df11ce552fa777a33272ab8635bdee5f3720aaee5832ce0021656cdfc295c0dd8ffdbdca877147ccf3e7b1bcdac2c2c0b94665b3815b3aec9d8a93622f3e8858bdcac3793a864eaf05f8fc92521f823524c0872f7e963eb053b4597bc9bcb714e2b6830f91caaf7b2049f8cc51b24b96749c226a6a9e0fc734043db674aad4c83225ee57691ac97ec69c24c59d838d2479ec136c0bb6120771a59e0a04af5c2efdbe8c071466416ae2a1929ef18e6d0558a288b1294ea90183d3498dc56e0140ff91543439fc868e6e1248e46decb63c4f39b586fab4b218158c8d868013b67b0142242d0d74147fb10748b1c95ce001d58338433b7907435fe2578d2a0320a1482eedab7d62bf594e231bb2058e44055d06bee78b8c97e2e6a775a00dd25eae193c3f48e3b7049ead8727dc23ecb1d0ce12b657b56424b6ad71d246c01236aaa7694636e765379b261d918aa89a9b6b8ccf44fa29b889e2c2d7238df51a1675df84334242acba0b5a49de1a74ef81518c37a0e05e22979a08c465305b6e850701fdda840206e5c161af9fdd451291114213c4227ad4c7409b22f862571424ad67f5b6fd2e76e7dbb190883e1917e132a1119a99b5c60285382c34d7ca6ed1d7eed9f96704180110c199240b04293dd6ecf6306ed5c6e785e9befe0ef80be17f4ffcd8e1a9450777fd694cd1a7e70f14c54e96da2b6cf5c19cf11a84c1f789444fb8c23ab96b58709ed908e00f0c1c71ac91ffe5fb2bf5af5502a6b48fafb62314314b0ff4b76668d54d4ba356ebc93d6c33ee7e37aa5bf0c2e2805ee4cc53586d059c32fd66cc7e6ad62009657e85ee34f515a3098888d50952fe66f9cca949405eea3ddbd74d1880ed979d2deff11e6f7e1e0c89e3fd4ccbdd7d7033ea881d08375c8428c68418fe721e5c709a8e0ca7d2ee833c5bce236771b03dfe292d3018fa71e44049e43127ab0423eb4cdd6e2e02e5b98ebec56344b18c1401d6d503f671b8fe35394d0cf2970594e1a0e51ac5210ea11b87d178e77958d92462c7abbac0365964ed84a1e259e11211200520a80a410077c9a82fc0d053410557304212bef298d9d26a6c26c959ec60709ca09e0b97aa9ff82177a248176653c0d3614a8920624a9b93e68244f1e5007275b68c240e0b9a81f5deaa4a3343d39ed7a5c873502a5bcb2616b8f2dc593f5c96aa567ce079b81cc0e94a888e680c94d1640c8f4622ba0bd23da6a63b0e0779c10fb292eebd965fd7c7b3909435111d95a89b56cfe3bc364e7247b09c13b64d59a7edf8d6037bed26449427ebb70618524b8018f1ab5c92cc8c3bc1ba673506ecf2b6da122f5d56c5b9db80ec7481a128ccda0b3a489c1a08967128493c7f7b80eeb9ecb556be79e91a581862b38820968896f1830e73751233130c54493e150312efd40b5e5ec49dbad661d75045725709e8eaa91f114a310d324fe215dd8bb90e118cf6c6fcef970cb0902526d62f43524037c580f0bdeff2364286593c737c1193190645e514a39bbcdaef6e1a4b5d7508a42ee6c650382a3d75d5198fa57ca6438eac7cb9774c62cfd97029a84f0109bda17834eba62521e78c0e81141235478e7f9c8f4d7260b520b41c771f8185ad74e61c6777e506cb13aaf119d09f6cf1aa7308975791d320edb0990e9e9471b81703e57a8df4f4da1a88bfd530a03824b539f0a6debb4a5ca10781076dd73badc1aff31297bb04848bfcde4c015d04359d06dbdf1053042b7c3c0e8970e2c0eff86ea8dcb2bb67b8cc5531dfceda526d6e1b50842a0698e4c43acd8ab794df658d9550eb5438f64a1f4d89ac747167bb88d09f50e58a44c7ecf9a028522781b9b77fc666375da1f214513de7aca12284c752f4cb3b83b2d7a9827fb76ef76bac041b7f465997da424c813fa806df4de7803089be0f70f245a29e30a7a053457cff9bafb96511376794fdba0f90e9444a9a69ef34a70d3f4686e190001edf29a8a3616332e0f751e727e808986d38ae090ab5d4a1d89aa501ca5345b6d1dbfd28c13e8de57d3d2867b3e7a3a122fa916a142dcf2ca6d7fae033a66012b93abba2b14558e3a6af80af11d0af34c226bdfceae3bb90249edbea84fa4c21a7acd0c636963d26148df51e780bcaeae93ba42a631c7e21ccc2400aa545560ad474ebb26b8d0be7d44821a7c60cd5b3fdc8ccfe853842becf251e62bdbceb4f387de35225bf9ea574ef15fe675da958636e05d39381f7a720ca9ad405111fb337f135e64ce20cadf302463489802d927b954012b9e2f9a41457d4c4e60327daacd1f7233147b7bd2d245a3da81a8fdacec4548a4fea61c31f11ba030f199b6b82dc01bccb521079778cc63d5d1884288c064fec84f7596bd3296e9284a428ad7afe54724c516ca29d6e5e563e5b46fe99f57b2ea68840454f6be28ef43031098228d4517c568360ebf8e2be24bf12a2267f38dae377ac7ebd9b25391af46ed58d21398610f1e8360eb61fcc9c6368118c5ec6d82da7c32bd26fd2a296985933ddd08c15494ad2389aab51572dc91b5edb0d4544c83c253fc604cbaaf6223174e8c54abea6ad72d883c4907ee11136b41760f157620eaa9548600802821adf88c4c8632e207d293a0a418231d5a493e4098af707634ff82ee06ee5b44e0a6824492eef940b721f9a2bbbae517ec592f3696e80013dfdc35402e044ec6f95e0c2d196cda8cf1ccf4fa1ddc5c9fbbb8ce67c3d2859181cc6e81e4c64af9e0fdeb85c1c1779713a09151e6430dc1d29ba9f4b26e800b1edb8b3a18fe46a4ebed6d7f36d2fc4472872ea5de128dbdf8f77732ec603ac40b1843bce4d4de7843465e9a07d44bfd293930dd43558171a1ffb2673880c757572888f8ea2ec23c951b44805e5c3b3b0f8e3288a68c9787421d17e446b9e61f187a8be8ecfc7aa23d0cdadcc230e15ca9a26a70f14ef4b1469c60b7a13023c92f01452911a3a97c17e61b4df5ef4c0980d5abd8b8398eea5cb08238bce7b72be43a673fc5b2617e8b5327f05f1dae85a7ea1f7d0ec6826655ddc56230f550da93a018b163ee31d8ce8534a99478bc98348a66cb833d9b6eb5ec37115c585dfa86c8db801f48b1a46790dc01dde3f37f1e4ba062d58f72127c50ae229427e295a6fd8614ad4f7ccb526c403b73541eb9c4b201c72bab23ad9aa3134a132916491647ac3f1087764d2af00ceac4239667ca62a8483d1b7d1072707378370e1ff46a17aa71b740362c03024868c9e554b9f9d9f695d4a0a65dc1733baeec6b2f5d42305d6b1dddd296bfcb5a5ae7a1479626196f1b2b7948dced62e40a3664136e1d2b6b7cf0bc5e3c31f5ca0fd28ddba703a2109a1752ebae92c3d9ed6214e40782fc125cbf80aa4a158c9551508d4c99569d668c8d7b583c91c2e80e9b8523b71caf234719fe8ced941ae932750a140bee88d35e0d76a2d822952d370c7b503d95999071355c8ea238e1c87b71680a4c728666825b8a7829229af00d431b11cee8c4e67d532d74b8b4a647a09e25fc87dc53acdfec98f959e67bad77cddd35b9e2c02f68c80b9e1dce0224483ed5aaf863b8e0a1e6afc1585e5ec2109ebd86c2e0aa7e2a9785f09a97ab7991bb63c7d5d9c5dcc6966b0326946bbef3793e8175040bc4dcdfd08e7d287c184b8a091316558784ff126fe118fa12978105dbadd24a98c7f46a6c29caf5b0992e184f971a386773ba188dc77ccb2ec0bd99c8503a176d8535b6934b65fae3c1da73c5f6f087b76532beae45970de61532aefac91868783d5eac28e4e37822bf1e7dfb718db5144fba4a7f7340c35be09f9a466f735d545562fc2f58cd3bd8c7984eb31a0eea9af6f8f3b8d3918cbe30d0dd1ed046c11e1e6f05153b86ab6cab39d2de3f3a11bd7950ed2c55d87545eacd43a9cc787b5315f7eb7c7dbc2e38a2c7a9007a025ffb0c9e1a4511296e7431028ae8f5fa6d7d56093a295c33d2797fab2c3ce7b79a52b081597ac1f376c5af084f1125608eddddb06de53f2c5943f107f60b96101b776fd9cf7951dff8dc4e0ae482eb6aaa7e995d36c262916e2106710e84425fd44ba3e6dc40c3d695675086dddc02bf6015b817b91ef5f3ce9085cf57bcfec6ccabf04f6875e0978bb87b89c8740bf31284c1678d41ed985a27ed8bd056a6369e90b74dbcd331a0f9b485e5699d63aeb051beace7f99cb716f973462c4678f1c4827ecafe890b5084799386a44760ad037b041a863c52982be70bb4efb3a4d045b40e13b5f8d7d38c1b4237b7c8096e44549d79ceeeb259ca93d6ba4984219c0594dba8edcf8e0cc9177f2d638c1e5cece4a85a5b05af4091d982975937e201dd7119a59d03893107213c646ee662ef19baaeb645a7918da950b72ec968ed9063c84a6285c75bd6dd741c437fa8d83a633ee690b3249b0e08365d72c5ef5cde257368c991f7a0e7a62a5ad74c835bab17f1987f53589675d07ad771b2681970b4e82202143821e64fb42fc473dea581dc00f3907a065e871b63b36893429bd261ba1ecd946a5c6fd526cb309285c5519b928798b92c1f073a795799be1031bb0ae3b6ac7c26a61d1c2ab2c7a816a1200f6cae1cfa3601db92732421c28fa0b59da4168a06d3925308885707af2e405a0d5101e98b1451d26cdcfce8d8ae6c7cc47f84426af864282a4b9d34f140b6f6841f9cfc8b96eebf073a64d63019cc2a95f25a29c10597eacd0db3b5124697bb0fdc17e32db65be5a0686ac5c53b3f128db50f6773091094d7d2c46cbc812efc977908f94f4f592e3b612552b5f17a3c48363239a4b5481df1c19852816099d6614a3bc566c35303c040e44abf83a53dce99b18a006a9d85711b240de8a8867e371ccba8ee2fb7cc4232f0046ab09a825791328a28b28479f6e249fba1300afaef3c1896e0b55012da5cd955d50ecbfc691893932c6c1cb11c17500839d6f2de8d440de41f05baddf2b23332e97c8a5bb8e401030e4cbb46160347a7987fa399743f09ea1e6ed009174e6ce4e230f9d84fe9e37669a8ab7cc2c51533eaad960b74a05ed1d7f7d015eac711a0085af0859872c524775db8b5ab01a9b0b98ce89d732be0c151a71d0b4cd0c8237160507e316f3ac92db457267a05c84b6103953a595ead162a50cefc1a87321c18777e0e1dd16fd9091df01ff58e7d724fb89311c3176902ccf0ec7f3592abdb2183692523c494e483cc9921a4addc1afbd8cfe459af415f7cd5fd6136985c04732bbe81c41d9488dfba1fa3e8b93976bf397d975732a5d4ce846ddb29f423a39abbce4a8fad1c0009dda2a45b60855d9df0f95650670cf2d69b2d8a61f983de7588d6e0589d29eafed6ff59e25746084589dd3fa5102c2130a0440499dfbd844bb6920909742c038a0d303665756c98a4e01739d45103e30b0189299e1e48bc2c33053a1aeb2d86848e13f2a541821c097ef91373c827966f870658d4034c67fe532249801f3d65217d7475d3572984f31cee826989228eef5b22c5845491849b6660f7c92e2ed4ebe0c9c9fd7b95bd0bda38eb0ba8250d6a79b9b2ca0b37b1bb53a9e9d404155e1b8303e74ed547d6a02e1c48d6ce8dfebca0a8270c418864e081187e10ec25d0b97ef9976b8c8a4f53bc3a4b846d853b5938d109bd8a4cfb215941cdb9b31595362788d5edbc366af009cd4df28662ba1cba000b3a43d841b40356a8ac581c7e197dd436811f99206112ec7409465a7b5861a594b38193f3d24305368ee0652d263aa33902f28ed7e6ff48b70bcec2d602ea9028c28eb05a34f420a130744ab4bcbc89c6b8cca5bc0b64f8f05d08c80854d64810c9d9cee36cc9bc2b10f0604cb022c15d063686e8722450fdf8735833e706a96845b6d5b48e0b0c684f70d5e39b97cf1fd0c81e08ffddc46f595aac8ac4b8ee1d010be7a4791234a422f9f2e3df424ec4c46891ce9c0f2f116883f4ca1ab02a63cd68e3d7adc22457ecfca918fe5eb25ca3a38548e83b638524c08d0f22c91086b542012a9ff50dcd107cb8190c5e515968764a849529f84f3e550dab7a8365d7e63955af5671941e99e29a01f2b6a66eff0b157724779b27c7bd05252e9452000e3fc6dfe14cf44f4caa6408001a6f3920a8d90c411a4f6a081432f852a7b35f54cac322f991d2411a46ca98daf415b10612f45880a7747a8900721c43c9172162ba6f04b711bf589bb1ebd13a792f42244718c5349740e9efd2021122f1b9ef2389e9c0971e2299fafb3afe3f52be8f9a85561c3671de78cbb03b3248d9e8c56e03dfe4b8e430d6d2f99f95e50fda1dc69f08c6e820914101ae48cf3a05440803f98725d74c56492f88ecd90e07e409aa94cf67229bbcf9803737b7410fb61b0f6c91a94ec1bc6e1998431056ef4f40185170d30f810692ecc156a1451dd9ef252a8b6426aa195c18fe9e237a5eef663aad210e1656afe1ea25f19b0350b1e7e488583659344f2f38756d48773818dea120998a5f3d0fa15954061a500f278ef43c84e5b28771f145f4120b882bb1124128a2bc3de6557898ee670d47a2803995021f33d984195f8ed40e4e2471030674eaafc3453713af5cfeeb1d475b85b00c5d8d7763aa5908272f19f3626a54380cabc25b943d999a18b6f0585d3b0769f64a0f8dbfea14b49a0c25b43d74b0c4d8652f690e2a91039bec5798ac8a54e22d6c2bafa03fed4a7cf649adb6c9697ea00ed19f9df0d2e4161aea097a3f9663a2a43e445cd12665d26e4576b0348935e99fe3e9ccb15a4ab083ea86f8a90cba53bd66b229b8ae93d6bbcd2d2ccf086af932498a33a4a281af1b725d9874d6d70fe38e315c5ec59545913e4f83cc6c2c21869b6803bc2f8e9503ce97d167bf8fb9e7a1f0f4f08b232191d8dc0542370bb953d838f0b3230f63c32eccfc82b995bde6a343b46c731d7479232c986c1c60d834c34d7e87c1ff860d6e994f4ce1ddeb0fec497c1d017740280c542093e6d27d0d673a8eb1a40ddb0d64e0fead811a3777a8f75e087d881f94bd28a278617decc4c410e275e81a7f06fd8272ff955d9ade9d281c24fa82062c0fa09863e5bfdcdceb16fae0768142e6fef3976ead0f0cd6c0beca1fbb41dfaef4aae14eb86a25a0fb9d2f1d70c09bf167fd069215c36efe345c3f60299d726dee5cd90df37f42657c69a2c6db2cb639bbc027be6bef959f5d708574ba312710614ad6ee47f6aa2b89791e8ff134607f016deb88ad3b100c49a065f6062e6ef9cacfc28097c3feac7cfe0592b642815de705bb178c88f54567aaa3cb76b6c106a3a1ff04b4cca2a9bafc3f8181172dcc72fed7f822760c920290d1a06e15282edd559f0af037d4aae632db830bd45a0cc130aa13d5a4af7ccef69a880e5ed6febfc5ce314b900eb074aa9770df3355ec9c9519f1810ed445d686a1387bf355a53ab8ef27b10ec13e45b82334af3e41aefdb0181218920227e95e7034f833b083195bd78636a9575b23998e80444fb526a0568a57bb20afcf4d584c02028cbc1d760851def0167fbcbae31e718052b1df96d6c7a01b927d10dc217c398a738b43595e8317d1b295cd507299800b3f73236f1c6540820fea994acfa1e142466197f632a8ed7a166bb1a288a13d52b8c097460a35dd8d3543a1162fe38c224dfe04a4732553a72a7cb31d4cdda6c24e5a9c09373c97fa4294b87edd8424969e1299e3ddd2be3eb10739dd5c9f1c7646131a62096a7f2cfbcc45d32ccd8aa435966590abcea105985331de19cf260875123e48e036c0d558e5170aed318f13b70a28ca55655e1fdb85c777957b2b6e75f10d442525dafe839a46ae12299c0cfc4694c4883199322bae0d752d8f20cdcbad6cb8b00053c333964c71a69dd5f4989ed422c6b512b6ee2be78a0936b507c1f2b05806adf76481b6e4856396c9994b1f307ecf631d5e2d4c7b3fa4adcd4810efd789eef1e70b562472abdc5fc77690eee9e8d1ea4e0766f4e56e007640da223fa6f295e04087c16f4fb9cf89e0b2d446bbcd7d2485812ed5c1db21e3dfec3f0f747c09d6f163f41fce474172fa2359fe23de4d5c72af14d57f826d5e16a2b23439d6f983336f2b076b07251cdd082953dbd97032a440167c4ffc539606fab913904098a19ffa024b560982ee9f8a3c93f743f857692207a4f733909fc07277e64a11c000cc029d6e4185beec04964c202920f7099bdc2ad82b76daea8d1029c90ea46a9c61fc096b202747f1576f1dcb0fccc1aa9b1a33d7112807c26b26dcaf57eb47786ca0b0064cd9f9a0e833125ff97fafe6a5c23a2c565276580f0910430dc2e21123d74dbde11545ceba84594af207f92d2a1810785cc3880ad3be08be90cc1821aa3177cc1d0e0733d078cbf3a5cfbce975f1fc899688535fb132401c264e81ad0c38349234f4c89b81cbca97f2faceb6149576fc662b70253ab4da8a6319a50faf74123b1a8dd2faca311355ea75e5d5006bd0182fbb7724ca94b8b8c9e8d0a05442862c8f7566cef706af56613e4f22195783f41aa329683448f6ef72f0b66c3d44408bb319c5e4db8e85683ae99b1a217e8e0140fc353b3da378410cf7af89a052763bd84d70863fe49335ff7021cb823f02fa4fed52c2022e37d42721ef60fa78a10411fc5d0a7bff3e6d8ef432380a2570f0bfcc3befad8c9ffc8655f18e08bcc0bf6d371de3084c287b4213e8b9cc81f3e6436f8fc039018a654057a68e3e34efc1aeef476e4454d6b53af27f1c0c7bd0914ae62eb68c4f487e148842a62d91d728ddb8f6b140b28555d67dc73a05d370215d293dfe47523d00e81d06957e52ad79f10b0200012145b47f506fea40f3d8c5f33c80e81931f2a7c269ef8ce03677a3e17e17f4f03e879d421e47aa64f0004433ae9e8efcb4ae29f8448f77f30c98a3261ca838b92ab01a36ba3765fcb1b964a7bb8b1cc62e85cbe0d61d64c5a27053d30f3378173e933244aa570f1cd9197480ff0fb2ac3a083cbfb6d55b853750f64e82adfa3db7a2c00277b6b59c782571bf26ea655f2a12c602f7bbee9d43726d7b30d00d4ef717873b2a93a8dc66d2a0f86226c99eada8ab6600fdc21b03fdfb2af0ea5d330a023e19803a0c934e273184ef7668cf980f294faf24af6555abe7d9029cb17493968617e7e981eb4e8aa9192c7902f0c478fef9f31a59a38777fe93037c5146186210b12abf6b8a7c13b8ef567b63bcf47221dbf1cf3855dda4be09f2ef18ef43634d002b5e1468194cabd9a4b6e0ebefe5d8923eebcf9c0ee17504382b2ff125e9dacce5a5feee9c9449a01cf9eaf9c561f91b760a61265a0061ffda06fea7f8713e3f2e62fabe212fd0262cab3f57deeedddfa9e1f6fb6e3444f8dd1ccb4c20c2d9d0ff53434371213b7e2e803cc96b20cb15207feaa7c60d97766fd93d49f000525b2f8e97826e2132e9a75f259229f7a37c34438bf12af7084dcbdd65461eec374a56b3ebc7e3203904f2386c01bf365f3f5b6f80ce8ca51450e399f91fbdc68705e28dae31363c8a81e29857a268a1f967e0baf5d3a18f417b0c5a265d2d2b44c7ae327bc6212c119cb85376a51099d3e77252115b807b9bff3c7ea4568400f71a0bb367cbf6aec3758c7bb4987a0d9264042ce08b0970bf92b622b1e264c09c0ee6a0fa30a377871a025c78392bf5f223432c5d1a67d32ebea96e66b7dbceace4802ca6dddc639f48904ffcd243ff07f001145555174a7fa6321fefeea1d20d53313d1fed47b475420cd49215959b7d82d1c3abe1ce20addf1290ab28571d49b4d29ee1f4083be76459486f7ad6b8ee2a77c128e7864c5a471413f50d066f6e7887070ea48c5eb08d099c1db4a3b46f008ae5a4f90d817d961984ef9f21e4fb0fb30d534ca11e57ec16dfca1fa3af94be9f705862442217200e26569296a6c4c9eb0d71776024cdba6ffdc5cfe039e15584a3b8fbada53782a31e926fd9c72aeeaee0ee575ff51f80148a5421f81ef6ef85e884d6ac93757bd348079d05d9744e1739324366ef9fbb53e2d19f5ebf26bbdad2e1687ce33958f46d87ff441467453b0b2a6b76856a85eea90a848e470f29cd26cda35f128eeabdf1108f6e3fd243a698b5ccc20e21e1369421ea1ecf4b9da392f0440c9cfb5bebe9938bd3b7ac4609710bd1b9c2a68722fcc09d95e58085420b84afcefc51048b4f1d509db83789df5b0239eaa427492d501b7fe1d267b9d13c2a1e114441b6909629cbdf9de2cfd8307610c52a7897c6f40593105db0306f8a62141454c0c23e3663c39127ab9f9ef5441c871096d853a31416b226ea5f72b034c86e9004fd14898286e14df57f46ee8b4dd25276aa9f8ac3b97f0f0d771be6352057b289dfc3a35b31d9dc89b7059af3b1b4db1d915206d7bc120dd313f07aa2fad46b0d652f4f4d276350e9bdc6a7b1668c4aeacd50a3f74132eb511665d3cf2dc53efa7f9b584f977df84eb57ede4a676bf79c323b35b5f9312a8d530fa932137d4dad5b6102b87462c656c3a6abb402f0d624d39d47f54a9f2ca43e364a757f270bd8979e9b8bef5aa999073488d113ba466918b8f980f117f48aef8edfadb2fbbb1095f5d1829fd486e200562d1f1aa0d5cfb120ad6952251ffab3f14c7ede4c0703adc85bf48129a8cef4835124688af1f6cce730c38a0418b16f30efa7fff581125dc188b89c2c9c4f7a15062548b90b8510aae7361c320c2aae17e33d22f544bcfd4139f06c182963ec421f5c34f282f9cd32601a0610af2eba62825f2df77d1b2d8ef779c14d494920ebc1e2e43b6d179fddcfd52acf0e7f613cb1b0ec620f6a18ec2afef53b6dc78d1dcd835bb22c50b9d8a1b7cb8b87484e5bcad3692011cb7096003daefd6288529614fee0c72af470cbada7b99979f50c6b38832a132c205e3fc6e671bfd6234c71234cd4a178d7c3ced167683722dc2cb734b5b68d01959ec35fd6c086527321189d887e7660444a1a957ad35bf7a29a83cda16b2150f1adf979c7b2f62a9263bc8912c899e5fcef41f6e02bc16a5f8fe507de1a3b5e1baf2fd9234ed9d49891341f6c3b0b01a01f5f453d994c4629572f89f8da8300be01e7964c322e1d43e86e7838cc3b08fa088786b98e278fd36d68a932e002c454a459884bcf9538e39e2a645a1e2ef8fa1325bb460015c5c830914ade9ad1a4af3222f9e4dd0aa2a0ed10281b246392cd2408ee7b066b221f9ad6b1ff67d1206b0d5db70b2dd39c87d61d962a3a170a591c59bae753c24e87c147faeacfa5dd5c5d9c6ec52f8976dc71c55cfd7e9f5c093fb92db0ddf44304cfd56bf3258e6a329225d19c1d91d0814768063a97eac770fe37d60a80859765962e73cc0551807cc947157fc52867d494b167e80ae6ea84ffe320c9c617ef4583791f1f746d6b0413fe8961ea7aa19746434ffb52eea8a27cc2f49f57e7d044beb83f8fbf7c0c6d8d70db5ec16d9fcf9716ad5317dab2e60f1855450c9f601871abe81b330e40ddb2606a456792d91bb3ee850eb36e1e3cd102bc1caeafdab95be1c466c5f52b64d252067eb7230b61959d29c6c9ca8416458fef1e95eec9357ab936f4acc073f02edeb05b0e2ecac65d1e3ee68ecbfd6b6bb0dc95c3eb53b3469f4292bb594de36eb062079eeef1cfc5c669b24bd5ebf1f71be6f1ab4c5e2ebb299117c460ad3199b2eceadf024e2b8eb4688c696fccd8d8bde0eefe6d0572ea6d0dd856bd655491ffc1a5e1dd5fc21b88af9c911f973d1f6e327caf2338953972838d5debb62c0d84dbea1acbbd57b1961388feab2c8581d0f4e711dd59aa0ab0b2bdaaec4a48fb37d34b44dd9d23c6d5aaab0d10ca3698d397ce18b053122e0e2549ac6fc6048ff0f7c57dd773b965313d2d8415a039cabb401f22da46bf80086a1aaac3dbef99f500bf40c296e4602f4b4ca2bbb9fb8b6bdc934c7a5e763949e19ee8e0e606f1ba66267182f6813920d7b2efc6160e68ff95b71133a2417bcaf7d26ec3a1313aa5566d7512038a7202046160c042732706c834a8027c97f31840e26b096fb329390fe30defebc9d688b7b56d12bf1392370e41abe274bda4e3dd6b8d596fd5cf9ab804ba429d184d6a2df4e20978a59634e6622c23efb1262635046ddeca1146cf0046fee29fb531800a8703ee505cecb0a8b7300492c2f1645125b7dd437dc841e584a84a306ec8b0648f777565731888269f30be29f3f6f40f0306283e8c38fcd0b0df3521374bc8f1ae714f915bb3a264c27ca531ccb27c4f9974e97c7153a75cc76b5c533f248119f0c936f7cdfc5bb716f25465689e33753bb41a724672630a3f34221770bd0e43d91bf2984e8b6592e196e985cda261530306d25808975b095fc761434e064e43a24c07ac3bafcce9800637d79068102ef869ab2a5c6385039746df0cc254f865c281fc2b18e9ce282c502d82c24bd27af47e8e6a8ba06fbd32c8451c72bc9f18e4d25ee5fdce3bcd362fe2e20eef677498cd78a87cb8cf20b43af3a322590dbff5770d41fc3eb33e917443a639c999b9dc8f7c21a72be8c29d642f7ad8654b19aa1b9af90d217c83246106aea75669cebf3bc32e0b56e0d6f9f53f2f2004ef19f53a42e13ae0d2b214e68fefde72fff8d1992766f4591f12c9829dadebc12e53c8a7dfa9fb151c17a7d704dcdc50b7453bfff4b7b1ba75d781b3f8ed14889f2e455ad3fbf0e5a318ac132d19735be1ef4d7232ef0aef0c540a967f02a8160ab01965f88d439d851cdfed1b2185d10c515ede81a5bd539910069cdf012db4170e7684568d25618923b70ee4db38a00562bf3373889674ed91a812d0729745547db4a953848022bbe7fbaabb0ed75a6e38d605081ed0aa60cf21ad8bf50ead25eb3a5ad470c68545253d2ce7894cd4ed8c2204f2d67ebea9d6e3c5f2bae72c4516c4a3259dca9579e685920ef64a3aa342e0ff00aa5523d3286ea31f50f6ed169947890a3e2b00c0d4ea5658513e2f4a972faa9dcdfa9e53a34dff194cd40c53fbd35efd4afcbba7898ffefdf1809009b32f95f8ee71ff6d3c3b1ac141a32a7e2d44b4e135028a127c4508721b7b72430f6df6c3f782651a12e8959fc493dc282a6deb2bc1588fa5a5ee451270323442af3ea7a7a69bb37f7e97fcfcbf61a9ba7b8887193af22f0a5763d4a454c12c21a516dcb11c0ebe24c07860f04194005778b3a57f610f73f2e1e809b79d16e5e9cd0b381f4973c8fe4b091766cdc50d88fd69deb6f8e06d7d2a9e0da43c2076ed295bbf395348946f45f186f5a9c1152d58b49d836e4646a2da920e5f761c64c4e332926203ad608e0a6338d0e41d1cf28b36128e2c12b260044169b2184d51718f4e9759858114ae00e0b74eb4547a68c09e5efcae8f92f100f44ef337a288084b1e1d870d3a50f51a832fca15dfa0c3671067bc6c1c5b833c12df1e016c810823b567becec469f0b4686b13bcd350b87432b056a7e03354c7bf21905a670caa4b6e7cb5bdeb30a3315208642df66d2e35ad33a1ed8b2da5b55855d359138c90df2a04bc2b5a4f5ed770faf381571b5d3cfe2cb3249ec4902cad3c6afdee3c1dc42254e27ae8197542c522572968f10b0de9425262627d3db01314ed712d00269a88401134254ad879bfe46a67a40b7e22efd38e2d45ab2032c2a39ebf1b69f7d137304a6e0f1a8faf9c19f5e4cf6f01f83ca5ba828c5f9303a16346859e07030a60972ba9fbab42512b7b9d985a13777839302b3861c91ecec4482c7bd20c74f3450c45635a20f1ad21c590ea378501333ce504164bf7a1a5a23bdd15655f39efa147e62ab05cbfac89a4733f6971bf4f4614b0bac41903eec4c09811191102810f045c286ebc42af132da406bf343ea07f3dd2e7ac0ee732ceeb53cb4542fd8d30096b1daff2f804ecf35a8b4243650ab3b289c7bf3f44951cbf89e88cccba5c300de287100af90ef48b875cfc7787ae73bd312a147b23354d2171d0b5617fad8091ab2e03fe18db81fcf115ad55f181bb15afec19e9375eee39638129c7e8d99e68ea0d29be920a5167fb0ba1e55f89468088565bb9e472179a680440d653dab8a802504daf53e1640fc072c0eab7a80ca7ab9c803b29c087cc253f0d4db110cda794e4d23cab100e52a90ad48907fc09fcc1efcee8b36b1148ee13044da4bb8606efab0ff141d3e9e98cf8a5217d15014a0cb648098ba18b7415ac8f478212815903c0ee221370cb0a610dba88bf8a27b230efc657494b4120781a08d4fe79166e316ddc3777a0f0563430eb78b8f706797302d26c0fc5c44887542812043bbf0cf3ebd6454d62d79b3f96cd0c4c93ce550c1eebc980075a2df669129677f58a2237f17db574934372c76106667dbd430e91a85e4eb3a772ecc210a9fc05d0b6672d8cd85382a28ff437a8811f22dba975a7d5862c474fe52f40456923dbadca57412698bd1d1ab93ec3bec4241fbd5c904cb310515893ae00edbfca1b06692bbc68fab07d9c5327ef66ee174fda49450e87e2a744b9d3bd56d1fe969789f80fe98ba29615d251fb29193847a65a95aa8f8f3f4045a5ca37de0c68ba57e81dea95a2c882a04be73f904fc50104090c0481248a110721a06a06387ddc37a157fb3b750347db60ffc775985dd9474a0f3cc8eb2e4f2291faca7ccc32784561a7ac5fad3b6b37cd38fa27655fb9e6cd557d14e46b658dc86bd97f08676d445e5026f836d36eda9c1174e3f4a32da511b75125bb8ae5c91e257f83f89aa8001d180ac0069c4edaa4dcdff8c165c314f2f68b3069e3fc21301ce74d3edfb01f0eb75fe27f6e0e3bb3f40adfd7c75e67c5e3a1c327e1a321933991801d142d3fe8a0d9d7691337210c421fdf3e85f893406a83d0c623ffe81cc7928ee543e7544f16bd0fef95b4668994817614458d059e94ae23f8d3376ec7ad0b8e8a8ed7bbb46911a941d7d43fd2ad06149798576b431a95e4dccd2c717f407343a57e93881cca40455a37a4cae093e7a800de1acc1f1b37020ead0def95f17132d15d60e6157541aa4c1a5d508943a1a673d4feb7360a2062e56744e875f258e1dda0450819f0ed25c145b60924cba90f7a5e3a4b28cee58e8bcac936618aae5ebee4527879fe95b2b0b22eff59dbae97aae1223878037fb5d825aab5e7705550a9f647a3e41416f986aa7197ccc2f837ed7e60953d3f602019ddabc1d196facc9c580571cdd2c0205e9cbe6c1e7c4299554aa20b3797a3614b4aa12d19657b7847de99bbeedf5405fcacdf1aed9290978450cc04f8ff30cdfd111c217495f7082aabc41ef4c2a1f170da820e8a2f2ee013413fe98c81f912b35ab5f84a1e3e901efc746d42e6a8b204dd09027f7bcbec1800f4117984e98bd4707b519606e01c7681538387ffb2666c4eae4658845f021712bb79969274a0f97d1c982353807231e1bdd4c9c7e8ab7387a5412cf1c5c8423cdb28e890af78802cd178522c798d2bde8698ffb6ef426c79174013ad269487a06fee2dc0ba92fa83121a97248b1b216a80133cd5679f779fd1b68f0315c63f8222cfdecac176c24f829d2f287ce93f9db4a464bf66f73fe021e82594eb3e401d28fb1b16334382434f7187b7b74c280219ddd1fee2b889b4381716440755da169088b3a44ec62198504b0608dacabe31fbe8192eb1bda4f20cdf164c965c34269eabbce991c099ce1096a32cf90f7db050c726f68688d2a7f7f14615ad842079dd48601843545e2281c986b1a79e056865c7e15b2635f0fbf20c882aa5972c25c08d1b4fb9aef39767771d34a408842592e02f2b368d3b7888c7d11988ee8c51dafc04f9443a81167e7a01d686f19d841fe1ae52809b8391c426f960ce947a897214389d93e93a3777510355a7f8559c96a7b1a7cc26f9e76d67ada3c1db8f90f9dcb15727e4341812b74a32e5fd6b78a9fb294a9ab29d2af034c96d303fd34255771945bb0fc7eeb238dd4ede69d2d0f50ae73a6885d0b41318394350ce9ba33afd660ff76df0fe06bd3fe2a6f7bb65f9f67b8ed259cfcd03c337e03e0aee1d085139a33c436a402caa23a685db81f743ee932178f2c45fe2877238468f639d1885e9fd3c93dd66c2d7214cd72c3dc7f66f56a29a471ae4ec35b1940a5f827af286adeae98d0ceb0429722faf94534418eb2e44d6356fdb592d29b1a6a86ed1de06713701d129ade08c238996ff75f9c569014283927a479fda624f2379aea1bc4bcd9683dbf9e42e2560cfb8fd22102ba030beeb8bc1948fd54a2b74752c9bc770502b6ed4db8f6e0fbc6543eed5bc6f3de4c035773ed860db1053106be551f2852dc514a3d1670f5a0ddf2e1eee7d3590ce6b62ebebf5888293253a95d0636f2eb28c354224a00a85599187d4ee06bb314ae573b0c3a12639abbe04c2404e8e566919e213bd18a26e15c9bc966960bfc8da7a32e374f2e1dd35f78650d570e678c9bb65d818f34e4f1dbdf2b816dd08a51535324e611a8554d2250258e4b750c75e11d530e6443fec00526984a9759c56b2a9f3089fb3ce8f2612bb5d388731b404930b0fc64a9db1f8f65c07057634c71f4eb70bdb1250c4fde6fee0ebf083e2590041128bcf98caa480311f73fe9ec3e20a7220ae1d2d5d2aa921cdb5d33806eeb10f18b837a71247310c2ea7f9bee8fb1bcc3dcb90e5758292482a45f87f6c572386c6e3701fb824b840260178dcf12376040c086687a8c9af0a39f8f4b1ccdf3a74d279436020ee031e483e0d9674e517f53d382776044fa98140a04435c65660a92d7d3b58c2553f90e84b9ea609a6093f60e0a9a891f014ab704cc581c85099a248e6677ca638af0d60e5f2d9da5cfe6dfc918c055e64760d78d85ff102ae4f54bd2fa3b67dcfa499931c7946455758d9a29006a88b139e915dc51bc7e16060a37b7b0347f4a89526933cc28d944cf826deba6c0ab24cf87a74b501b7cf6dd4e780036b2b6c548c0f5098e52e9a036a7928b2631b240caa58dd34b89d8688ef091a6b0585b388cd1326464f09809434c216d1f628e2f21c2e0e10f78b8403bf890acfde8f0a1b38755ac5e926e708dfef160ba87983f010a654ed667d11ef6463e1ec921a2ae204df4a792da6752073b6716eb215d40f5a1b19e68353fc00e4db74c3ad9ac8a38f158690305a196b75ecc2339f27b074ca64a7328d68010bbc75d9c385a474ff36b8dd9ac325fe6d387515fb2dbcd76d576165e1db47a3ef75cc4cd3398f20da57a0132edf9be9a22a74451d4649959dec7be671d219099b0566501f997aec122eb3d22c34581c141cc818b53a696db650394a2785afdc725ec73d379111ebab0c1a292265d3599e5d4c87fd2d571a0cb563b5760882f20b048f6e684059a379d13b31e6b65890113748327897d3c1fa07348e0c3841f99b44d64462f496bd6eb4bd9159b3ae7a318df2a06d96f80dc9302cebc0678d141020e3c5a0caccf61a9bb2af58a4def44f01b89f0d619d0a43ee455f4bb9636ba2e1f6fa2b6dcb4953fa5222fc0ea08dd36ea9a5ccff18dcd48e7ee2a0a8577afd9d012ad1cba1a5c0c26b1b546d411af7b22befd517523b06e4a173eaa0a4675d1675a884f9ab87d4402f7abf22218ee42e5ce040b5599ab7bf52ee1d74cdf439280026e80e3ec1240eef68d527ce6ccf6c97ceb8e796ef745e092996702bd74a27830c3aa0d2ca1e9df0d97e0be68f1f9b42397a56bb75551c1eda75c6c03e40c55b4aa3f30115bb1ced70b5403110dfa02ef1d1c579b1c11db2aeb2bc94af949a824b6215ad260bf48eb0c9fae460c8e85ca0b4bbe927e8e84b879c6d91943201834d405786e6818d00030dd30267b014ba3a4d592d3c0ea842c32a6484612aea1ad2ab6bf8ed226583a65164edea9f7950c596637bd5850ccee4becbad08d627740787d48233b06c6df21772225900192f21d7f525deb4a3c43b13a19a41e70682632e4d6db6396febc25c8dad39ae2c165889b7d60beea3c038f7fa974390d970a36771132f1bece686dcb47537f047d6c39d4d513ed0815103f4449df05f0d26798ba336077fb1179dc91e0d93c02f4762c319f8838be321fe8472ae6a1f5c9ef619dba1825f72cc6008c808d60b37c7b13e80ae5e74dfd190fe0a68db24dcc7a3e1fdb553c9e5b0af587cc67f608b34a508617f753ff339af40dfc819834099584fb0029cb35b6228dd52b2313f2d83acbb12335b583cfb16dc85a7ca0d07e4aa47f4c8217f5a3bd41e5c41d163f2439579406c9c7c1b3fcd41b4d9198c515c09392210b782ea26d01f4dafdf8c016162057e6154a6467f2eb3fe90075bbe98399fb7d0fb56b593dbc947dda443a30f02171522cf7d921e50207a95a146452b0f4c5c13911e9e8bc496bd60f47589d7af8cf2ee196ebf128eaf16b05a9525d2d8edbeb33ac0d352d18b94835a9a62d727153f8ae1ca733fb8e40f6016aeea7488212f39054a3b284d5ea0b3cb900af1718068da06d4da01612f53c5125d6f7b386a1c5b48c778f7656b3556645ee3e959775ed656bbffaeeafb39d59baec1501118a0670ce6d819948d02fd3275a1093e613754c6ce71ffa03e98e8e49c0d0c667678b52bca684425f0e1ba66244a1bf730fc3fdab78a6d4e179992609a7458c5a19961d3a264ba35d01cc04e7a52c29b59527eb458d3a446b69e07505657c1f13facf7c34a933e50e18279cf7d7a7837492dab88e4bcb7d28389b6582cae7b5e0e041cb929c0ec7f0685706af98dc4a0cbf33a7983555f06712ccc37e4be7dcfb4a9ad240b522eafc38852c303456a02b40a2f91856976ee5845f81b38d7e2cbc1cfa512016fea9daaffdacf6896fcda6cbebe5e173494df7c77576118ea0b0ab65460c1f2378195fb56911e65c37cd8bf59b857bd488262fb4b5a893c993cf4de64ee96e9eb6a0be70fb4eccb545a0b244bf1a699f48b54b9c82b004aa48612bf2eac713f6400ccda45a6ba43bcc7a6e9556962f15671862548d26d5cb385f82eb7433be076c06fc80025dc040f12853494941735613d314d165228f61a34014717cff7aec125a3f255f2bb08301da5274102e4a7a569384e8031f0324dc3927e329e0440c48a1056033c0f4cbc77fd481c0eb57ef215aa85a376cf34e9121c84d80f15a449fe26b8f13d2acaa5cd11e5d42e3495188f72c39de16009f476f0042527f9996eaff2136a3146b1c9472be40d4c3790efdb8eeded3a810377c70507ccd3451db0ff6c5675728c8751e1e621d76372e5c259c7310eef41cf6423d89a93ef5327bcbf8660e7d762a55e7dbc2467cf2629098fc5f723bb3004eb8e034bdef45448ed694fe58b9ff933047b20059982615741a5eaa4a991f8ec0128bfcde32d6a7c37d28365991f815fb4c45c918ca1518cbea30dac226bd272baa75f36a1d2238163ba5c8e6b18ae82e42b8d520bcda77f8e27a0bf06e683973beac56cf7317c31ac305095491d2252084eb89549fb015cf4ea33b15ff247ccb8cf0a8fc54640290f94fba867e66e2eb3367f070b99cc432ade3fe18e00351a2b2527377acdc9424d897812d3387d3180f1276bb9856cbb1e2c14df875a862cc3e7eb5f84ac1aa40559f7a21292f90d5f3df01b737a8789b97963b4b2475faf124d8edbac2f465863ae1f59f7d57da65a9b2d8ad397343a1f05c3e7d78e193e920e8688d57341f5b16d97b71d200a95c87e5e2017799e64e492d53321c3381ab01738c4f3fd067cbfc406206d2e07c59ea18e1e22f0ca1fb8d7cf8391eebde8551150fd3ca58d6f768a2ca08047ff3c87b57b03aac1dfeeabcc36559928fa58bb8b2e9fae422f53a028640bca6af4ea8e27adbb23fd52813d86da478652e7e704cc141e66c37522ec64707a4fe82cf1d94ae712c42d6aa6291907fa02cd26a287359d0352fc7d6193bb3c04ff483ff8ad89755f205938d52ca43f55bb3e6f8959b91789149afceaa116a774b4ccb013c6d7e31f951ed705d6ea87324f2ca991ba1bc9cd889e6736dd725f7ba60b191ca0d15c2c95bb1b97a0bfb614b7b7d4de369aae742f65b34436490a7cb24330c585d0d7096e3e192a7a242ea1182bf99aba952bb7c1b99715961d550586310fdb1929d709a167aedb3fe69fc2c285298bff0e642c2b5546fd6186aa34df5e4b48154050b1e4a7ddbfff762a7421f6739dde08a4cba8574606077eb7e00e311a2094fbb9f2abf63b018864092a6594b595075ff4eee357eea837e38a8d72a3fabac7182a2eef2a48a86a0580db935605c44b57232aa2aa80892ad7a4097467b33c2ed31cd404dd03867f63ef6491990322196c0b2d0badc990f236de84071ed8e75c60ec78bb016a572f1645853a82a6e403dbab4ab0e3a6acd6c2e1186de1dc4aba0086c7a9291e0c9cc52d37216a3feabd26e6192600aa74b2ef783c25cbfa619bf741b9e768f0a546afe7c9554b73a574308fc69d6e58305746fea774d7e85a86be24e48d428353f8d7b725d6ad576ce3c800cf11ab6c5da4ee2852f5510bdfd3bdc7024a6ec7b239c9487a76f4b677fc6b143ef2c24a39a7aff87375a050449b2955bd3f28f1ead218580c63d559510986012f2402a23ac99cfbb82dfcea84ad0a8bcaf76e56718e345a4bb8317d258bf88d53c3dc682440e40dd57d6c05ccc3ee3763ca581c7e3279f5946bb9c59a0acd94f7f5ee8887aa218915704f5ba4c6c30cf2c4ba76adeb4cdb81adfe1d2948d988f8c99aafaaf0d2b3609d349af759239636be83753e3b560a518b54f70d29133de5eaeedf6c55e0c041176de8b803e633401fb9210bc530cb1d0c48f68ba874141bbb6c3ec5eda20effbbae614615ca2df7b7fd089394fd21990feb414b9fca47891b1e6bac36f94412d08e226ac8102b907b2dc9f06590fa16650272dd19bf8462763c55445e1a3f4b568f911609f5b204da77da36c3fb0f6b74eedeecf6c9e1560d01b1109e72b0b15421ce266cb4b494a88b7923c2882fc6e86bae55402fae2281326c2edab9ec192f6db9020211bd4e497b9b940331a8c84afb70bdf0396a496e6bad75e22bc07f7ad3f51944986c04f1941569dfd03f001e34b09c8224ff4d4b46e9c1cc7d93e9181394ca519d67b925ddfe8845d54fa298c0bf45a84d6a6d0cf3b74650420360a939693ba1d9afab123a812156058e4fd0d215752d6b73b9766ce650422e2feacce56c488eb88e637f93a9d60d0b8bf10d08474d0d6c287e09acffb9f2e1c27fcdeab72d979c1f84440251818daa09e9f43ae16077128dfba5e6aa14cd55e4b25fb41ef40208e523ea43d6f024a7adb0986ea9f17cb35f58c291bc9752d41b5d1f2a2dd16e4f77c49a3aa2bc8a8be126856b1dd4c27e2c3248dd8706a220e0b060a4099d2d9a4c3c8b1422f10ca7a49cb289602d30a0ab55c4552925bc9e3c920fe4b55109b25a4f7850b964a97c662b4001ac00bec815e08211c9b9887bf1779a653f950fb36b857b610d0030e809eab35c91889c7ede961d6cc76564a02ed8021700eb47940d4097361ef412c5a2e562e563e351993ed9fcf941e38fcd3aa7184318fe293c3cca26a83b0bb1c286dd1fdcce124bd587897081ba762afd91312265fc3b174f45974c58940c58fa68a46656e27ead1d90e708b20fce15d027f173fab9ffdff117bd473041cd90958aec82326e997efaf1b96112986d7f9e61c70c2256efe3b22cab419caf841a69357589d69c601599348354bf4675cf0a85ff7f43d9997312e29e45a0659bb37fb299e479fcdec3fd1a8520043dd94e8223197a03960baeeb6635472417c914315e039802e185a1de02441c05be8fc4c10e56105086b63918d6c7c60eeb6363877547db62a3bc4d3cddc06f798cd1277b3ab8db727723befffe3a7af11d025ce47ac3629c399bc8b2ae54efaa67792934a7cf97975a45e156f05242aebad99aedaeedeede52a62403400ee50dfa0eb623487c70c004ce661fc9e94467b3a7a521f961a2019ca5d5240ca10752b6f1b36f2dede7055080b2b5b8e2a88a0d095865ab2e2385c97d2489eb081503741248f0029ccd7e8d016cf6ed8924885a0c94584114487076cb119870b6fb5dab76083252b2776d2f12c6aa935e778219e248206a5d42aeb508b5cacafa87e19582c2518b04f39b08ef94328269d55753535252566dbb565c726aa16ebfa00695e65230a8b39e41eda8ae7597ec525dbc2ca1a4b25b79be5db255149cf0b2cb35084cc85e6d8b47ed692694547b9bbe842f5b09909e4992f742d0bdd049d3c3210e4cd4a79829d00bf9ec73154320d065e071f48aff1f4ecd30147a1af1fcfe3b871cbd0ff403d35f04a293bff799f7e99d5dcf3f8ed6c47751bcf9c7d1cbf3f3133e8851472f1a7edf87f2841ee879df1982de091ea8ca2e7ac3d0f3c865ac3c26a8f359ea8139307795634a0294f27dd54959b9ec6fc5ca94ecd67aaef6a45dfbebaf27eae80f4ff7f9e34d76c94cd1fc6351479dc7fefca03f55308ba83d3d3dfe3f9e437de6b4b675ae4e30d3f0aa88a51ad4be547d8aa83dfea3eb6c8d01c237df3c3d29213054186af6ac6a8f7b5d7c96a66e25e39ef2f8a9c7c551ef62b9641c08d62fdf26a75e944735e5681747fd5dd8abca99f56b76995e94a555294b33b2f97b53565bb2a75e14e99e7328eff11c06ccaba55a7320b287578e7aeeda931a74b34f5927661a5ebdc59e97634a3253d41261d6fece39a61b5e894896e6b92ab3342fca0bafbc290be6d0d03a810ad95d88ecee6e65998490c14fd11c545a3865657edfed0fb2db2264b74bc8855396165eb9cc3ffcc2aba9f02abb877382998239d00b78055ad51e0f99f214aa18448b4baa98735af8fe602e2abb37038f0b0fb27b37c8fe22113f1095783a88a27a3508a550833c1984575df3b4b48f7f109c6c41caeed920fba72210fd5e94cffab4ef7db5d6ec79298aa6e1edeab6e59985eb4f5938168e7554bfe65b6bad157bd9b272b9aef83e19253254fe25eddc76083395712b97e17f75e57ee528ea6d873059df99757aae663b8429da38ead65a6badb5d6e644d173ee61e7aa78f1daf47dff0782f65a2539f762656bb55fbfd3adbc50b9955ff917f7d204b732612ed5141eaf9e617be39d5ddb6d470f57cfd6dc5c8dd05d4cff7a866958b1648bc562c9f6eb2effb09eb5b61b08e8e70745ade779e72e5f1bf9c7bd9ee779a1cf52986c6152dcb6d6faf09993d65a4b86b5dafa83dc1e8f23cff7ec289b47e557083aaaa3dcfbc20f64b158e5df07c151243560ee706fd1ddc1511f4bd2b57ce148d280acac86d5ac32f52bfaea2c4132ebef65e1a29b6f47f52eca843d0dc82d6f297e4c817768b5583031d6a7f8919582c52ac73216fbf2c732f6acf2168b855e79de5ac2945e8a1bb252e0fbb1ee591343ab759261c882b1ee0b9b564c4fc127e21d82f82cc81d4911b7c0243fad5564df56ebbfd6dff2d66a3968037a0ac6f1ac5df30e3e13df1f88cfc6f70f5274f378d6c4c0e2e1e6fb290847ffce1d58600271d4adeb50f45f46c68176f0962aad9904deb0d65ab97855e94df2b86467ba48de4daa954b05c6bf5fc3fab1da214c2773f8acf5fe361081ad91f597c53ad3f14df25938bd99f5faf1b4ac4b03ccdf9ff9d7f8459e4d183cbec693848df89ae585fd785ef361a3dff11ba96be48f974566d61973c933ed568a928631c34a18547c0b4c6a2eaff27673a4f871acaf37f1ebadccbf84f97bc9677db3ba2aa76452d7609e84d5d04073a69e3a8c4c43d809037b180ca7373fcda7187f987fcd87f914e692cf3ac9b306e65f3ffe8fa5fd78cf1407eb2f0dacbff7c9f3ded7082b61a8f97bfeb80ffb57cdebc686ac21c99b33bdf9f5296cceb495f2abe695c299f278b19761602e0cec759aa6f9437626e655905f8a37ef3d491679599fe2ef99c2c633edd1922a70cd5eded3b434f1cbf3c7d2c47328f63267579fd15c4f9e30f26160cef4e60b033b7f90cf7a983385b9e4c37c2d6760dd7fc1dcb3e6f5e68f1fbb6fb2605e050d0be661e39b250cacff0173a6ed2a692033eb73388c8a33c5195364f37d18eb7e6c1cbfc78f95b771ac39bf706792c5f2f2c55e663d2bbf7065e148f1ac146fbe706af4434e3e4ec93cdaf246de3753c018c1a468a56cfe906dbd89c177e123d749e57e7535979c83353eeb5f258efb25f9e38f23ebba2e7971dc9165455c43bdd1394705727f481a0463a2188fa878ef9d451103a96788a454ffc54f6d7dfb6957a9a723d9d1cb5bf5af4121aeb536a4b36d2847fd53fb0d55a5ad4079dfb58add4121e5ca825c7725d8e5d14b01542d397c3bc4d9440b91edf3705a23b9cc3f74db4df6c9b6ba267e4a664b25dbf76aada9549f7ba6e109a4a3b27786675d62d6b4abd0200ff972ea48559490905ee0623d00380d3399cf2f0a6698f67b5f772580ca60f86d94eb90fdf07df7bf6757b1ed50aeab52e5892c561cc9955cca9521ccb487aaf8771524abc4547ac1964c360966fd29aaaa1c9f07b4f37ec63bbbd6baadf556f7bc7aad3675aff551d38618a8b2c42e572c4b34f1e48a85045e72356b1daa4e348ca08a656ccdc82fc2a94af5428d5cbff6a7b45cffa7d664689f4ae3616540e98a6c1fd75a6fa933f5a6ce5e6f65603e7d65cbca293ea66b6d05d6ae1a42b54fbffd01fae1b9112307ec6367ea399833750f10b54fd770e84f71a69ea36bb0f36582a20d4409c0a142b1a2bc71efbdf7de7befbdf7de7befbdf7de7befbdf71e3552bd2fdb1257df388bad3d53f0ec5d4389ee32475db35d6b2b00e85ae7daa76bfdd43edd357b3e91dbb3076a4fd720f76fc9fd2edc2ba8687f0b97cd82dc4fc62037142fc84d78a006b50a6a4f77adafb44fbf96ec442e6707b91f24bb84212707470738383739b8b9b199b2b1a9c1414d0dcd0d6868666c30332303858c8c8a1aa8501143839898d813b1188c140c4c8a19a4480193010cf68ac1eb656a314d170c5caed60b5aadd20565494691e4d8827164b180c5129d10c5304b18824d80e0c7c4f77958b2777b97ef5d410db2d6aaa0063954a7e046670b22f9cb56829da37dc5d1de9d0de5684d0cac472244667dfdc202331c712afef82979bff7c00fafbd81697f7cef26dcba9c297e15dfbe1432db6fffb106fc9a3fbfb93a855f43f1acf1d6133f3eb3b4f07f2aee0809d7501d7545cb4f0cdc910ccadac04cfb29b7cebbba4ad515ea04a369696d822aebc712ba20f73fd1a609557bda6c322dd0e50252505566698dbb27685b4c196b0d13f6f66f98150b0670d905738bf957fbb2dfd93f8bb68a54b803af22206486596b613058ad7e85d5b7150613dffe285a11068359d1dab6229daef88eedbf88d317fe9e608a5f21401e29791b15fb495ce54d14ada5023b7fd887518100e9e4ddeb97b42571ddf7b395305f2fe2f465f6ecbaa335d63bcb74346c3fc78a4d47c5eff2268a40c86c675e2634557c8c9731583c3a76bd88fd2d4e710ce2fb59c6e0ef3a7fd411a79d79f09c1ec9459e9dbeaf58141dd7c440925fb3ad89a1fce174bffc9a819019763a7d678d7fb5912eeb1a7f5b06aa7466da566d556764ce34cca6795aa98839ad62478861f2e8be92b7795f82a75c77b9ee9620421e9db4f2726515fa94dcde14923ec5ca9b7c967ace93b06a2fad14ef250ce9689ff60866eaba9691de6c45d1753e4bc5777dcb78fd10bfbe23591a10b5a5d0b326d499aba2fdfdb6df6f642e04ae020d14526426d4a016d93efd2b868882e8ba3e537fd7a7feb0af46d987dcd4f535387272fd9c5cdf75f5ac6697aeb33de7b3b43f57996971bb07ccc6595ad8542db655387a476a6eb09ef53506b83f787fbfdaea7b6f64f3701d5f2cccba72a6378bb58441c435372a16a72c597c2c4ebbdc968553a3cc12d2b96271ba922fae3140f883ad9644e0dfb3c6867ba446fc6af3ce1ada76bfdabe37b219d9c273c8ed10cc3434b19d32d3de49595a5865fd4d5565fd69ef9aaa2f4095d3f085c433b216c74afdcffe17c7f03e81eaf9837f8080f04ffdf407c867f5043a7f6238ea9dff07a80254dc16d1bacfe5a63099303a52bedbfdd65a6badb5d65a8ff4f0a77319fef6c84ccd244198ff7d498030edf7e7d4ace9afd97ee71ad767377d2f18477777777777f7cfbbd6bab5d6dddddd1d7477ef7eadb55aefb6351cab8ca3b7d7570c3fadf56d3dc1cfbbd67b14433bb692f9171b798b2d18ab4efa59d599f54145a7bc5c3da9ec6f7de03d51a1ec0080b0533ebb67cd06cc296ba96a90e5627f506b0d557dfcbf494667de5cf61f1b84f1533395f128f4a632d9a372d4dffb9a6bb75cc9fe1789c9699d25e76fb9f8ac6221c114bfdfbbab94fdb39e47f9acc6cc308e7a8d41762d8e84f93d599a9dfa7496e651764ac6f3a87c9686cefab186b67955accc9f704d0d6d13bfc600e2b39e758aa7d764651e1797f9933036323a3c39f5a8bcaf38edd359993fcaf33a3236264c986d11ccf48bb25566fae9b27ffa4565ffefe79e5fe7fa1e95a535d40f8afecbc898a6134c7fc1e92ea83dfea3b51ef81787f7867f311032b75785cec5bb7c5e3cca31604ef994a350b527c465ebc44c7fb2bbd75b1acaa12c959dba8159f37df57c763f1b475d06a97f5ac9a360507b5c507dfc1b7b5413b33fb553afe3a84dfaac5e5270aa2968c9154b125c320bb93221821364223508f62e92304cf2c5f2c67ab184c1338bacdf4bd49a8c0c54086acdc64604df3eee81984fdb04b9760a72fd76a20699ad447f20571d0d1c516b3aa8940ad41aca0325d7ef226a8da77dfcbbc94f2bf505728d926b3b69a41e22d76f216a2d46fbf87712206a0da86b135a0ab5fb41183fad564cc8b542a14621d74f6b1572fdea968c7baa0766cb744dc8a66b43dfb51774ba0680b7c9791cb46b32b44fd772b48fdbd03e31806e501b9e9a991b36db17ea1a8fa1aef9689faeedd03e40dac71f0bfd2ee74c1de794a16b417274ada87d88b4cf54fbf8df68b191aa8182e69cda32e4c6e2d135bfe2a36bbedba16b9e0548d73caaaf507996aa28ff205d732d455d73a9f6f1af39145df3a9f699ea9a9ba0faf86bb1723741d6c11813b8dc39a61ddd8e149fd1e09eacccea2a776aab526b3592586769a22ef7c398d50c5be38ff6c7a7d6393ed92fcff129f799da44d51efb2cdcb5c7be88435cfb234b18c26c86d97fa8ac88a48dc0f00789b1eaa42c72f5bd233ac64aea8252a014b8059c82e1267b3338c2f3ce18ab18ab8cb303a56a8f8353de8db102b7e47e0f9c02a51cc5d9ddf7ee89b3c3d981542c7249c6b1dd8158873165dababb5f6b43bf37f43c128ab7fa43981163d501a39e6afdf41b2f6e5b8853e42f392547242b6b6a75695965ffdbaacad1a2ca39ea9e57ab55eeaf1888b5ca5fe8c1f2775585cb9e1552f63ccf7bd2627ade077edff7ca61f88121088252366a973387dc11c95199e75d8fb457a699478f0cb12b731975d9471dabab6dc13047a5f226e6b287b57a5ef5c27a8e4a8efac8947d4472d4736d6511b3acacec7b82699f720a466507df62990b3ed1c027f029bb8f4839b553585f5c863febca5177e5aeb2bf4b8acfc2cff98cc9753eebf06944cafe212e338864af72385d0e53b02987e76dda92533b25bb7775aea6fe5234611c5d892b49cd5c6bedae5dabe7f5bd2018dafccbc0c8c0d8985d6bedaa83a26ff3363a32b5d65abbcdd39574aded4a5c49bf109cdce7cdd55875521955b2d7b6019f683bda2b26ceae0685ae29ae27476ff2f53e65b1846d72be670f55ed418119669c5ded71d793cf5250ca7a3d545372ff536e57932b0339f72b032c8b25f08994c552f6b4076797bd21dd4375effdd4d574032783382730db9ec04c5d4d6d6393bdd3d5547bfcc6d5943d5f57151955ac8c55878afd5a5343f9ac272a4fd61355fb35e147adca4636239b8bf74cfb087c163e62fde7c51452af72b5955fe25a5d84a7a3df596d602a93bd8c0146fede8666fdf5d9f72c6cde90882cb4e0077ed6ba6d6b6d2d5be3c983b58da07fe18b57c4b5fa781fe28cc3e67b5e2adf175d6ba9f050ad3d85d8fc799f57bdefbbc0585b307f2c8d75374d776bed597f4e30d61bfd2007bc64f0cbbf6389c791f5ac1f9f7502c0d121fc82a3b70593cbafaeaf8ca11f7cafc431fef8d765dffc71f4c6d11b0243cdb5af8796bca607f3c98036e18b3a2c74e4217fca18ad0c43cd408ede2f7265186a16ba5230d32ac5c3f5f7738c3a6a50cd8d311d42400d62fdbd48b2f823eb6f79135f9e287e8d2c72804b6e3d090507b2e4f249337b67da1f900cc2f0250dad73c88e3f46ef4cc7b3ff7b16f6ca770c04a6a63c6f944ffebdf7de3b8af8873ff92edc250ef24b277fc8c3ef49d6dfa83d60bb7ec4a9f7adeff286f7ac16c6acf24beffcca5a9e178b583860257b4f852db9e61abef7e1fff0eeec5a6fb7a33dc1d0b3a31d4f1b86ad4fc9af4a660d8ed7d7afa75126dffef8c2a6896fb57e2d6fd8ecc243baf68c5f347ec5e90ff0bd2f5dbe6cc9153c6b70b857debcd1bdbe2cf9ba515f2f5c83a3feeb5f675ae37dcd691be5b17ee98dcef5eb8dceafd739be896f636b2ccb1f9d7461f259cec29e2babf4ec8aa1a3f0ec9f90ce9f90f6568a24830fa6a11024d9fb11a7ac07bfc43fc81be4f835b2f7e378fe08fa7b21f63faf0d1dbd61bf55ccd25873787f53249072e7ce588eb83aa22a7f34787fcfd34397f9ebd825f89beefed77a97f67d7d19cfd90f1f0982c3e17036afbc796fed7f58c9dba8f4bb131b6869c193f1bec04c7f7e4cf0de5de760ac3aee2ca89ee7e0e749c06180eb42762d6c1ffb5f48f39dfede8fee7fcf5bc45875b298f6ac325d23a9989ee95d26a018258e9d6c86f776770ca0f000978ce6ca840798727d7da3ab5f03a6fdfac3fb2224ccebb3b4060971dd0eeb0cdf835edf8ec27d7b4bb206d59cdab77fbdefb4e50cf62f0f6de47543b51266bde0f7fd1f5dbdd04b32ebd75df6bc33fdbea845af6b4fdb7ccf113c41e5d167c8150b0932837f9f46fe3ca4d10fefc9ecffc3c553bd4f9e2ae38d91af9873f456efd7d78ced3bd3ae62cf6a7b9775392698e4930cde6738434eeeb375fe6dbffb610d7e83dff6c57426bfaa8c2473a57595f97712665bb517a7e5a890ee4dc2d1dbe46456dbb5cbb264959fba2e27c5674e811af4fdfdfedafbde2a67e8cf3f6f91adabddb7764d29c9912c827de74ed8b7877797bf33c443c2a2ce20e8ead3afec5c1f86a6e9fa54e6b2de7596c63adbcacaee87a169cac8b455edb9bf04d3fcb4ada4d420fbb7d614f5d54de5a1fd21ef299fddefcb1fb2430e56189c02bfce21dee7c2433aa7aeebe2b3dbe47f3b177ad93a9fe96030d8d9ba10d7dc2f93657ada3926476feb1cbd2126bf96ee6ad7e5fb7edfa5987fbf99746368ad7562fd0ffb45edf8c787a31f14e2cae1b3ca19fa41219dad6d11e40b759d5a4f6b9dd5654f32df9ba90cd9495c187c49bfb2be50e42b9e66edb16dfbcb80197ed6eb4bfacc3a954753c5c411520eca9589245a720d1ad25f6b8f91fbf5bc7b3d9d7ced5b9edae33b21ae967cc938b932b1644bd6e57e0f29e5b919fcb16b8f4ef6f0839f38b3c94532b9f545379750d97edab99f40f79e303b7f0bd7dad3faf24710ebe4108fffe11ae29074146ca5fdf7c9af89813584879b6bedb95f4f7b7a390378ced09ff7e10cde8367dfff7ef47bff7dfae1cf3b3d2690bc274cfbcde368fda2ce4db6064c21aedcb5a73ba4c1e82bc81230c265ff7bbfefbbdff7a537fce1d5dcf0dedf28a743d96b4fadc151237b8dece7f5ea5eabcfbeefda75ec28f2c5291220f2f57ca3c8e5ed5aef9a1b7ed6e0a891ebd7c85164f7bc5cc9f6ef8fae4ba373d67286fbf60c53a35cd3eac5bcfde51ea101a6cc42ae5890a8ca9ffff9c3cb9b7defeda7457efeb8ef3378270c45edb3dbb66fd8b7a1a3357c7ba6feee7e1e61034f7945ae583670944757ff58a56c54becb6371884978c9250ddf8b6775d4f14ffd528d8e46fb0133d5c9fe0133bd1948fdf2e368f7155aebd3ba0417cda7f507b93e510d6a1a7ce4886da8d386f005e3e8fdbe37bef70f1c657f99f78097fcf913c5ef3d3725dff7803956db01d36ec0748f32bfdfb538cdf5dd54a8473914b9dfb17d32fd6b7632492f9d5c3fe49603a6f9a9d54149f159cd14a841f77f8867daa96d6a9533f8dfdb227de7b3761709c3ec2cae2b666d4851f80e55d28024cbbcffe827898b3a93e387c91feff7664903cedf69af385aedcb6ff5566ae4d4b23a4b6b9d61689aba1b367bd406ccb4f30f982feacc4ac24c6b55fd527c9a93af8ce956d66ac01c913053abcbfdb6c9673fc467d52015df6f295083b259e2109f058a1f7b15b833ac9c417cd6d7f2c6436798b3a16278264bd4e95135c83f2b7fd8ebab2d533c0f611662ab80cbb60659f361d8ca2acd49c5189cde5d367f6c25ccd47f74dff9cc65644e5c73bfcab01cdb8dceef1d2a75281fb2ed954798a943595dd71c88dc6fa538945ff1dd78a636f380c3461145fe9c5cff83fca2bef887fff7fee387e50cfe1fc94367f2c71147b5bebff23254617badfb43be031016ee9d8da3a5d559b917bfea5a73699f171eb338daac1c32385a557cda22fd3c8eb171647df9fd360d75badcbf83a5ed542d2d725aab9c781ad9df6cff58fbc344595aedd03c53a32ad9ff154512d5a03ab34d66da5057cc6e2ffd25f7d72cad4f4d13d49a0f14a4d54bed92562edd5369457d8bd364705937972ee2a739d95f45a50d595905eb8c74555aeb63efac4f3dfb6983a3f563b8561fd69936eb434bc3a1cafc0190e24c4dd86b4459b8d61eff9b5ea02a54d12a5465fe16bf6056595869323ebad6d5c7ff47067dfb2597279719fc3f9b0173fc1f427e08d59d5194dfa83a290ff81587601a05f811e59d1c99247f87ef47f2472ce4fbc4f7efc92f6dc87ea640aa54fe51b391bf1016ebfb4ef24cef0fbb4f7c2f59effdd86978a65dc1cff57aa78edde5bac28dcacbc2152db4370592c51fbfaf8e4fdeece58f977cf28867f13b6b0d3fd957cb0018e5afc471bfcfa1103a2a031e260dc6d145422106416281620624962186f014b9eea0e0e2d6dddd1d0032bc100a01e0060016b887d6cdf75df85f6efc5a6128610e0179a92272a4bf680720404247beeffb3e0ff4f011978138daf869f8b1fe03df718eb6c0043fad57471c6d1e3c7c8447e349e57bb1c4f1b1f0f704f3c3f1f9103fd657e2f84ed2070f1fdfc9c347f6fffe45d1fd4e1e6ef601633ada95ca06990c009fa532a8a511e9ef9f5c8180720ebaa05ae5a8cafe36d42de3dfdcfaaa430639828bca22b2897238da720a67399c5c3f5a6b6320bd2dfcd1c3dfdb1f229fb5ad9888c85133dfeebe16fc91e8ceae6d2227b2e19637f159f8263e91cffa5b6ca26b0391e7202272d4df06475d14c5d3c6d12a95233cc3f7208e7acd7896678d28be9f452edb2561be5566e10ba3334d234c900ccd1c9616c4b4d50ae77ada99322ec3df3f60a6285a81a26cff0892f7a4d2df65ade78ffe8aa3811c2d71f40b7de5cdda6beb2964bd556b8f053a532021182f77f4fdb9bd1f149d92fd796274bf3d7f78258ebe8f7e7fd73ec9d444511e98db81f06d124cffd0bd2f4cc5bf677534fc9cf02714ad98be288ae00f58cfeaa8d4a3c290064cd99f8cd2b205c6e6b4484171c5770ee5a8dba3d0caaa6aadf5b157397a7adda1cac6ff7e1cb145b238478f1c758be391eddb7c3bd73ed3cff6742b15985539f52b2fd95dc9bd7494a3956671321930c55cb130b140e851b60833eda8a86b6371563644484791cb2f0a73ebd39b4332b75923bf929fdadc7d8e2676fd88bdfc3dc1747dae1f9b2c5dae9afbde3cba0d3f3b62cfaef1c91f451739822e5c5f6f3e89871499997cd78fac6ae612570f475cb3896b45abc94398cbb356d2faa442540b93fb4cede32f37ebed159fb14e08e86428f1b613f80dded7526bf5428ff29e8ad222d504d3e22cceed91cfdae690b49167634bc6b18ea3f5eabddec5a9ad46b7ad134892a471b4b3755baffd2e295b752bd505e723049dcd9e546a7074b6b02134059e7324c779268c86d5d5955515d52e4a6a6a4a2a6ad7f454050aaaca5353e31aa973ad6b5de71aa971343c134655e5995f84afacaaa862343c332646c3f3ce20b8c70dad0bebf1b1f7743c4a84e6fea9f1931b4808904c910c8d333583e06a651df33dba86228b3461649ef452e7623411448a18f1e1fd0120430ea21e382082f408da4a93a0972801d4bb09defb04ef286825fa4aa74005bd6b2ccd4437f19ea59d786741b7a0a356d02e787f010c3a062d839e414bf5134d83f71a341436682d37681cf454eba077d05b9a07dd83f64153f50fde81d03978ef203497f7170211aa8a6084237469242441093d04ab253413bc38e109ef0f85ab2848610a5f9a40852a44c1023cf463db00b707bea1c00d821f3b073813d1c4c9d2932298a044516292d4363f8299daa820b83b70d4f446b82bf048705be06fc0b7ff010bfd11dc48ef036e23de08ee23be086e249e08ee255f84ddd683892857b93211a52aa7f608b932c1f4258722ab6bade43d09d0d3fec6ecfd757c26e3fd514bbb7d0c18ef0f3454837cde3fd7a016dedfd6b59ef77fc1673cef0f009fb1f02b64d97b10efcf43881ee21510d4c3fb17a94132ef6fa46b30ef7fc467e27b03f1deb8f76fa37724efdfba1fde8fbc1351837c78ff16410d32f2fead44d78a1079fff6ef2b435ffb59d0fbb7d48cf717fe5d55835cbc7f17a106fdbc7f1ba16be87b0b16bff3fe7de5389fe9bcb707dedf57bc9fefef3a4bf3d15483f0fbfb1135e8dfdf91e85acefb7b123ec3f99bf7f7293eb3f91d5ff3fe7ec56734afe3eb8ca511d520cf410d6a275df32d4da5464311f2fe4a489656d44aba0f33bd20346237c420097d1b815401a7172c20f4d788a6a3f7ca01b4cd855e62496c9fa83d34681f206c69d8dec076866d95ed6263600b035b1bbe3ef822d51eff16f05d527bfc7bf04d6a1f7f1e7c59c077057c33be327c2780af027ac05706460402df281cbe5a0e80af11be48f02500be3fe07b84081f8c14c1570aede34f04df2f2fece16ad80bca616fc68b225c60af0aea41b9a703f674b09703f6569c3ef063af083837363b6a68f0a7037f4833444d9c2c3d61aa01258a1025fc4531c19f1647a592f09783dae31f047f3d30d8c29f0eb23f6c4bf637a9b2bfc725fbd3b0fabc64ff1bbe2b107794fd08b8a97c4751052a7c998214a27005852738c10b11f0d75485bf238a803f248c80bf24bae06f0a12f0572509f8835202feae0c017fbb25e04f0b13f02715dada0a3bd9be9bc084255829210948e872042314a18a083ac05ed50eb057842dd833020fb0d7a507d8b3f201f6bc5061efea07f8c301017f4741c05f8e0bfe9884803f1d68eb2108814b1080f0032a1ff480075b76a0831860af8a0cb0278219604f0929ec5979027b5034c0de951a606fa7057b5237c0de140eb0b7650a7b549fad73c0227b0a0737b0011435a0c113523390410c76f85e61c1370a4ce02b8526f0fd92057b3827b077d402ece5a2b0c7b402ece95c80bda617602f091860efc9b3b51692ec2bb843f00d8317b820aa052c70224b134c60d9f508f0dd59c1170b09f06562097cb39400df28287cb598005fa913e03b85027cb728812f550af0ed82afd5b5f50a5480bb03df29c07df47d0577d3370a7057e0fb04b82df06d027cfb86c242df25c08df4bd046e23be4980fb886f2bb891f81e01ee254308f13df004de0877108f047795bf012be07fc03de58fe016c1fb80fb036f0477922f825bc913c1f783e00b656dadc40bafe46d2efcc80a5b4e36fe08b38e9c88003b09f9ae829d6a7c0b819d88be91b0535fe01b0a76daf1fd043bf9f80e017622c03708b0930edf54b0d301be9bf41421df41d4f81e82e8852ef01d45c737d38eef251fdf1fc8e1db033a7c77001fb1905c867f9220dd816f269df4ade4be0b1849c6e6c2b712e6c1cc9d743ae9f84e827930f33d9d72f81b3e4ae2c280947f011f25e9286c543a895712da5c38935410c9d278b0a1c35ea4fb74a32c8d86f7bf551e92a50dbdbff76469395e87f71adeff43b2b4fcfedfd3176569b6f7ffaaaaf835458b3efd4981847c5aa314f06995aaf1699d4a6b555aadd27a953652dab9b475fd947695b4a13a2a6da9b4a7d2ae6ac0a76db5c3a77de5804f1d29fdd4733f3e759d0d9ffa138f4fbd0a54013ef528037cea52387cea5308f8d4ab12f0a95b2de053bf62c0a71609029fda5c043eb5ba219fda27097c6aab58281bb607c09eb1d780bdc973e0a6c24d00dc34e0c64d20073ce463870e1eb0dd0d89000418b0800420008701f0b0e147ea801d1a0023e6f1398bc9b8c17181a88602843411459deb2270b5bd0483b92f70bf8d6823928c48fa2f9f4bb097bb02b89d92c04efd747363c0cc48a1ad9fbea5e021f78520c1e596f2635b00fb133e2a7a256f2b3aa974d2277d33f9766aa7a4a41ff276c29ddb02b87333f9924e0bc8386a81bb010e6ce0c73662031c680e6c60031c0037709a46f4126cf3e8916d01ec54f49d047e298d81ef0a9c321ac047543ae9938051441185ad35f02c9ccfbaa933e0b3cec0fb3712b86bcffdbe000eadec7e6300572b3b02d7f6499760ef246ce270b8241ce270b89c81a61f59e5ad9bce176667a033f0689881f3c7d19b541d4dc232381c2e8f1fd94b96603137063095d67d5f001f51690abceec79682ad14ec52704bc135c3e09bdb02b82b808dc09e11f81a81ad11d8735300878eeabe93be29f0a3abbc3505ce1766eb743fe44d01dcb98dc09d3b09873218e5d69da6a3d7085cb3a346e02f8f5d857e090e97e09ac7916495f7fc9c30697c7f10dc447c0381bbc9370eb793ef813bf746b8971e09ee277f03ee22fe07dc4c7f043794f701779437825be98be066f2447027bd104e3bd358d248df3d2c692542bc1de2c74bdab2917af84e12c47b473fde6f6c09e928987cd651dedfea7cd650de9be9fd6d93a57511ffa4972cad73efede4fded159f7593f7b73b4b6b22dedf3ee95a2bbdbf5daa41cde4fd6dae0675d2fbbb5359da8f77171026eed3301b7d6a6693458baf96268047df719696f6aea92c4dc80f9f9a3906494c4c48153bf26998633b3a2bbe5a1ad1ff7cb5341defe25f9cf89f88a5f5b0f1433ebc7056e6463e3573112a2b732242395f2ded85c7b9b1a9a1f96a693e7ec6574bcbe183be5a9a0e5f7b3f82e9df4bb08d42c256cb10d84e29c1768b10d8521d61cb2509b6554160dbc551ff70e7df40ec32d8647146670a4259997f88e44cc31fced404a58e9c2948e5c39986a09595f99b46ced42c72a62191333585ce74b481bf1b6ef82180193e1c6578d106f68204618561c862d9c0f70007f0f43d8600fc88c306b60a50000f215296e680bff1230c2f02c006f61e3d5e68dd7678175e1ca3c2f1478fb481db76b15351d1db28d034411b258a55749ac004de46594b6bc00f7d8ae61fbf5a9acd06066d173b11e07b20c083394b0b9baccc3fdc41599a03797f6b65690f787f1b6569367c4eca04a16ab0513968f8f14129ff10c91fa4b234b1c9caac2c4ddc85612b447aa29232a340ab506c39d560e5b0c9d220f0fee193a50de0fdc32a964680f70fa12ccd86f70f77961681f70fa32cad00ef1f4a599a01fe86f70fa92c2dc8fb87559646f4fea195a5e9d8f1fe22ced2841ce01d87f71775968680f7179b2c6dc8fb8b4f9696807705bcf3787f71676912787f31cad216f0fea294a531e0fdc5294bebf1fe2295a515bdbf5865693ede5fb4b2b41cde5fbcb2341d2cadc6fbb3902c6d02efcfca591a0fefcfd2591a0f7802b8084b00f318825b086eaa20d89b22801d02d8e21e80ed0e08b64d3fb053a5d81d8077c08db332ff06e88073c0d5ca82de07ee8119b0001eb85ad9ec158013801180ab95c5781c70b532187f00bc03ebc044b85ad9cfdf800d800b806dc0d5ca7a9e0078005f03ce8169c002c033601970b532161f030e00c681ab95ad78006018fe06ae56f67fc32fe06a6538ef02b6e18c87b00d5c6d3570b532bf2a626230297efcc8506ccd7c2d854e1a58e887ac10ee5cc34138ad52698d4aabd50ccbc031300cfc02a70e957a151f9cba540f4ead2e5ba4d43ea5b60a8a5be0d4ad52bfcafe3b5807a79e4b5d8771da52694f21754e87a63f3338b5b9d4a762ba4a5aaf70da4dd977d97143caa6ec4fb2422a113724cca94835c4cc290bd73935ca4278e41faca6b3ae40d2fef945e246620c92194642e877a582b1eaa433566dc99085ed16500a940262bd22986e7e0d9b1ac706ad05a168a547b2f8a08841a9ef03cb1b370b21f3180542e1a8b3a66c06bbeb90bb725135883616cc95834d617107a59eba5a07c10f6ca546593c419b3fcf76ea7e6aa7f297d3fb3320d35875d214bbecb5fb034201d37bef882b230b938e7adeed8d278b75a640ac551e5f4c323bb39ef59d59b8b377dff03e3da2cb1fe935a298d6641f6168e50e3f05a3004621a9cc7d8e55b5670933754d8d55aea9d18e55d96f7c279962d721105419f6749f72bdb98b34465959d76aa966349f5a2e339fda2a9acca7d6aa8666aeafc7ba31cad2605351611ea370786b8bd6de2fe6297baef9abcbe67b12339db11a806853f1636d2b1e2e1df32ffb3438f1664f2751fcab834d591ab8bb53760adc02ee2c0db6b3b2fe7037c23098613438940ae5825a59197a5583db664eb4caca5a8693e5723f2cddc9c56431531e2aace342ca4a972b314df32a836f963710a9ab105ebd78a87257c14c3158c67e144918fe720c76b2d1c243857532df99c23b4c8e4a45c9743b13ea46ea46ea068a9b291e2a4bb3a1c1f150d520da6c6cb02ecb90eb331609c31e599665d982e19b6968aa3ce5fe1432fdd5c2683e854df150c9a4b8acdf2c6fb11f5fafd7bfcadb4bd6248b61994ec54b850a0c53a142a686323232310fc3b68a95dc3f2363698e5cd6270dced126cc7427e77d4c18133396640c77861d5181c59ee689a689664a956a652a687056d66f9a3c545b727facbcc17e8c89897d4c798bc5c4bcb5ef504cd8c76020a0d48f0f6058a69349913531f1e30397e9f27e7c5083ea8d544c59836813dfe29a9d9c28d3c53cc974352a6a6a66ac66ae7ce6fd1d674818e64c79b3a2a9a46dc1306b9ea6bc01a1a9cafd8a796badb53136168bb131fb43d6d6fcab86878ba330dc39863bd740e57e9a9f2bb97f06ef78bae4fe1436c543856f74b91fb6b3b498a7348cc176b9657ec8776ea472bf0cdec95959bf0abca3b3b29d1d54ee8f79daa992fb63313b4ffd164b544ac343857524d6ede476260d8ee68806c967df954cca74b95fa69335f9ccfb8e3d787bc5c4bcc5a91b61dad8c7589e2a479b87cb8d06577bfa6398876a0566ba93cbfd290f55eedf69f2594a134b37365fff851a1a1383f9cb3d4cd3849922699af7bd997c0e0e76bae1c771bcf61302c66814c5680869314663acac91d5327f88a041adc79ec4942b3bcfa2e5c606db2795498f196bc5d6c076676539a83d3a689f2d5f968460a7b23217ae9345cd9960425e9190108d1a356cd818ca34683499f136ca1b7e1b43e54de887d033c75ca2597ac1c286a6c50e8ef7433e03058a8b15333f3a37345058eb821e4589c938bab531211913438e24ab6576f91939a7e7494cb9e23bcfe25a7caaf66c71d4a9b87871f48bc54579d23e96c98abd62774d309ab36951b32206b33adb9469d0807d8df2d64c5ebc8df286f33686ca5b33fd502e6f2b3edbc4eef7f2d672713a8162eee09998a4efa49bb751fea242d7bdbc5d1b1a3aef95b79cf79a94372265ad3d313f7ae00541eb0d8262abc3c63607c3dda5bd388af3232526137b128efa14bfe2bb2caec5a77c4b52142ffec5e22c0d6cad143bc5516b25075b1c162d273b4b37b79fd8e8e46255b5f4cfc9a1f92f6f373c8fcb5b67791c74f36779dbf973c50a1daba3e35d7574c496ff8f98ec13b5e40a1df2c67082080bf22bdbc9c330618845a2e8b8f8d719a205462e9e49ab856bc58a1649a2645c2b5a42f4c028c160cf82c50bd20532232c600fc36c25325688c5fee7e715fb16626f832d690364c95bdef05f5a0f3f8c30dc4db6488f6c164946a1d1427913fa167cca5b3b69f13fe50dc9ffb8286f42ef8289c5bf286fff2f2e0c0b0386778501a385f216fb5abbddddda7bcbdbcedf56faf216e5c50b18e5ad25f431cadbfd18505a2fa3bc7512932634b115f33060c4286ffde45f4679bb2f6336a3d1802c1090770502125bfecd44e9dba3bc8fd696b7d68cd25ffc5e79bb792fc9dabfe347822ede2b6fadf7beefc98fe1c3307f1e2c6f3a0f36938fb920818072727e4650508e9050cccb5841e805c4cfcfab84d24203f133fa8047806a139fe2ebdb27b5167e7dcb546738ffe4535b65f6c3a7d6ca8cf6a9859af5f0a9bd92ebceea72f8d4365911d811e4146161c287d9129a9b9d209e1a0b484e94488c2230c4d6955d47b59696eaa34f7b6ac70a974c27f9d48f1cc99584e8616104caaff82e8b12193ee55b9cca53afb2722f7ee55f2cce1e11e0538bf4b1769d822b8d82af2768a82fc11224b0f22350d104ee3cb6c8b2f4bee57299a6399ae4eb35c260b0f1befdf7ae0f6384050b7286cc080b25325668a209fce51c9a68a2096c730e393c69a2091ce61c72c821c9063714283fa62061a5f7291a0626168b758c8c8969152a54acb02b5678d715dd72ad5861cbdb8c8c6b450bf15e79eb8101411004892002c49e9b8826e2c79004979ac035cf70c18f32a48ad27b99d8cc0c0d0d0d0d5953debcafc9b1216d6c7c88ddecd0d0dcf004edd0b080a476a2670c22280cb148ebb8f8d719a289918b3fc2b566e076c133cd44fd7843da94dedfc070707272726039e43f0c632cb332997795c17668686e788276685840523bd1330611148658640677d4b713274e949cb4e0c793c4a5f7e70a72850ea9a3d3d22177765a2c58b4782c0f8f77e569ddecd0d0dcf004edb080a4d6021f3e7cf8683171e2bd6721cbf9162b34138f9637f3512cdf5164e5cd7b5947e1215bb35f61858ee2637d7cbcab4fcb091d3a74e8b8597e64816c756e2759b030b1c33905d8f6820c38601e3e8010e92bb848a3001b39d1184560887d02dc228072e1a3b54081b4a3044bac70c91cb9121309acb03042ba6005194b2350f1837d8b537989dd8b7fb1473687ed52ede90fb17d522d9395629bacac1f08db29d68a3d00b63b560e26798258d041c4091da316f451540b2173a816a010c022e57e1babeba741cd6666cc08aad584847068d0701dd9d9a12d39b2336ba107a1574f7da51ac4d7771dd45a0fb1a5ce6e983ef5ab2f3c9f5a1c1048543b3ef5aa284c21850a9e9f999c153f3230173045aeea175c1f21e5a204c97e20baaf831a81b1e4838fe8e46c6124e3533f42120369e7c511af0275a587590b5dc41150f8b1c07224957c4dd242283935113fe69038a5f739ff18e31193e739ae58b1a284a15bb02db4e05d5b3082be8fe8c36d513bcf16329a189d319090385152c25fde81ab4d494909dbbc63079312f6bc6387120ef38e1d3b9294686c7e1462c2e4471d7245e9bd4eefecb06051decc67918205d9a2bc79df02072551d4d55166b0a8910535fa0f63c908fa3ea20f37278acee19cd013274d96f85146a2a5f7b2d80a2bb0c0020b3116481e9e584f4f4f0c1b2386778d11fb59310353c4450cb3a8a9c15166b0a8f921c88913274e9ae05ee2db891327509cdc2512fcd802d9537adf820fe9f343c23055fc4f7933ff27c50fe9a2bc79ef02e705f9e2058c666934ef4a8b32339323f3330353c44593e0efbd4a51acfcf88284517aff4206cec398a948f1777661982cfcacbc35ee6737c8060579d7a09a6f14dc5674e8d0a1a35b77043fd2ee089c6e78154182040912244851519020e137835f90018711601e3e80b0406ce488a3b83e0a92fda0548e8fc2f04184422a398d642071266faa3d7e84103b47684c7ac09ec5512d3e1504f61c0c815d07d5a7ff06fb16a7722e8e7af12f16678f8eb0c86a9227e70746c70c2b443a4648e0d342875e22c613f62533a9dc2f8cc4429016e5cde66b424236356ae8d47456b8476ab2253e2cbd90f9d4a13e9b506de1eb3b12b5d6f3f53d893aabf928333ef52c1e65e453d792ba943f117dea55b03411a4837021166972f33b46301648829a266705104c7e1a47a48573b68842fab4b5bc7af86109ebd47438b202922b796e49fdd4753c2c1c013d6d2623c657183e5f7f1472ea227eec21794aef7b5a68c1c7a7bc99efe343fefc8c2e5cb818ef0c3b6386779d41e4a7cf16383827d213570b9c1e7e78b58484f09789848484b0cd44442029843d13e13124857098898888949cccfcd84b2f4817a5f72f1a068c183162740c52868c9ecd66425648c8bb0a3592a058ce8a6ff7f29603041374050d8ec84f2f2d2d2d2d619b75d061097bd6418725a6255cb3d013253fd2c859e93d2d06043463c68cd80c32282856abd56236ac0d1bded5468dddfc8d116ce79b200962d16ab55a4f702bf956ab95e44721b2567a2f4483460d1286d941c06043e5adc80fc170e75827f9ee308fb116e2471b24ac730b01d688f9f710d8e986ef208a8a8a8a8a8a8204297a6f14c5239c81b0adbe20030e42b008a2cd68725630b514223262e0b4407afdc004c3a7cb91157c60f2a616b01fd1831d094fc2a7f815df7916d7e2683f0f0b362e8adcec20d9817692d3d54a7ad0d1e1ca6cb8ae9fa84a6e98fe2e424a2c7a51ab3511a241a3468d26366c0cd9a121ef3a6464068b7b83bf6b6e7e7081ff1e71bd68263a45ea43f9b4ab7205e2ebb7116aad715deaac9dcc567cea4a443ef59c33b9ceaae8d3bef225cea44910d90ae70b9db1c9a97d508b2fb8b491723e7cda4c492c8cccd0917695b6d25069ef5a4bda544648be917af8ba44e6614428b87347c14e3afc0844d24aef8166cc080a2a6fe6070591b5f2e67d4d48a8bca12f54c2706bd81a35bc6b8d582dc76629a8c5e30809f990b483236464068b0b050afe7211142850b0cd454550b0e7a2222838cc4545450f05d7ccf4e4c7662244c668d41a35c818ae79b441c66cacf0e39039241b2263998c35c964ecf5a38d8ca13632d6f9da2c2dd5726c96825a3c1326f8cbe3259b09f69830c136e7900313ec39871c98e03043799e1f4bb255debc6fb95ce58d86f9660c77e9fdebf5b0f2863e2c76b3b79b77bdc5787ec78e1d3ba230618105d90a4444444444444182906423e1dc03b6d51764a8611c58c03c7c007194c81219211a1c1f581899010546acc16d25871f5eb85c4655ede922d49e3642f5e92e8e7af122d88f5cc9d1fe1fec4c584482594da23339413b767874dcb8801de9ab7e22fd3abc8882d084849668d4a861c306bae2669bb377cd2cde263643d3a4c97b799b9901c3344d5eec9c17c7c5a71d65ab5fd3ae92ebebebb712b5e6fafa6da5cefac9d759cea70dc5cfa73da5f3696f51fab4a9a072eddd1335583af2c30dba2205cabb9aa546d5b4681b167f3543a303cf809d2f76faa916e483912f42e46be756c24e3e7e64d1f871ac24399634ca1f7e6c99477ec8c716e9fde8ea251826fa26d9e38df976c2c4e4a445d730b1789bd88349f8cb413a097b49f826619b8304e924ec39081ec31c24489067f251a06418ecc7b22c5b240cb397be55de68fc0fef2a6fe6bb4a183a1fa1f16679f3de5c42ff55de56fcab611606f3aeb0b015f39daf976fb659074e921305a843c78f2179719895bee64ec23523f9b17db41723f9580c1c45f1c80f3d76ecd8b163c78e1d3b76bc37ba5cac56587b3a866bf6016723d8c624d40289cd2b1521828d549f2333b871337033bdc0bd833b892ab5a7ff855b04b54789ead3561ced2b8ebac0ad25073714bdc5076e2a2bebaf056156fb902b9cd4a861a103c388fa29574771a27ea6d01d33ca1b0d1a4c356cd8181acad9666d36ef6a7bb20405ca936fb2f417ca8f9e57de6cde83cd9c9fb6ad5e05b1f8fa466a6de7eb1fa9b38ef2356d5d4bc19f7653ae9d443f35ae919a026d01a61f174e706ad29aa52e4935f92b946323244667c5a32dbefe18d3f1638d1a356c9030cc661a2261982e7e7ecc24d38f36128689f3b6f256e324e6633d62d88bb5622c56ab936ec047549a89d28f637f356ad4a831921564b5fc7f5cc41011c5c4e0cfbb644c0c11d147c6101111bd37c2c010168b415b605bf57941068c83f3b0c14088d49e7e16b848ede9dfc146aacf11267d74e2666a291877d30dee2474566056fb908ed6f49328a91c9731d3391dfd8443542454de626758a386d2db286f34707ea884a1f30d8dcfe5cdfbace4e46de5ad9fbc2dca8fd705eb820bded585b015fb232a0de595bc8d8ad0a775aa52317d5ab934e9a56aa544e3e6d3c741531e27fd2405aa55aafea00621d7209baf6fabb59aafff429d35938fd1ccc07ac0603d7a9030ecb9071ec1c64e357e0c49180e738f1e3d7e64892c562be66fc047545a497f8333c670070112d2516433c6f3138346cb3c26a97563c81806f3079231ec85640cdf3c8a640cdb9c2858640c7b51d18f2319c361a6819d84bc37cad49194f1af19866bb6a9c1b6eaf382a332380ecd847d2c6120334a988c8279fa09be01bf95f56828b83ada4d6ae07682ab0b298ab164cc25633e320624631cf310e6d88f2019239231ac3ab25a4361ee249c6b4f7f0bdbf00b3cdc0706e2a8679556a96ca36a0c1eaa3dfd9f3efae3f5b8e15399984f59c8b506d55a33f9fa649d75d2d7e7a931aaacd662624fe3eb8fa363307ff9065c6da3bd79f46ec04972a2f86ec037fc088e20e922ab25c495633ecc8d452698958449fc56d6dfc23c3546457b3ca01b686059f5e98fe1fe2e63ceb0f6b48ead5fc32398eeefed9a9eaa404155796ab2388b64735667753667912c8eaacaeaeacaaa8aca84ddd60ee65f84a7a4a2764d4f55a0a0aa3c799367c2ae7fcc914cd71561d705acf7a8d48a986b733dc91822110000000400c314002030180c88c4a2d180385265c90714000d95be6064248fa320c721840c4184100018000000000000040620d0026dfc17e3ba7e998cfc5bb0d9206f2d1ba68892286bf7cc1e0f614896aa12fab3d175ec582dcc987aa0750e3f671defc7a92b7340428402c25885844c40c90597db4fa43e2030021bc5e7c63ab4556b81a001f222936bab07729ae185997b723d55614a1a76b84076e9c9b0aaf5672361ec58597606512e2dae8cf5c99bed5a730ae3613ce4b54adbf64382e158722d6dbdf01d9fdcc9fa5d580ab102ff839a04a55c87215d1ccf6a6582fc756b8cabdec363840e0d03d142ef6109d3f565f650b0b410226b9073d31379ae4ce4ee3ff148d6280d36d2555c57bb2e0589f469bcdae362818337058c5a38e942df8d071a0141ebf545e5ed3a94efa877418a952655b3c4cecba71a51c27850d0718d2f87b3ef6817175728a3c99065e00a77c02a10e6687c5ba66ba241bc9ddcf43930b1538a54b4622e7aa6c1141daf4bdc5005e21256b6fb3fba25dace6890b55b3ffb564e59ecb257d1d61327f5d7ac13635d6eda2cf476559b359f501f71d2c4fc7d34917d2eccfafd01adb67ebf6aa06d73c5c058c4d76759653eac00d5b2e75f47fa14e68a67693a4704bdf1491f238dbc0e8131368b1c9e46c737515c24919d5373ef04434373590b63f018e3f2d67fb042689ab0e20f89b7514ca97a6eca852c86001f677200c163a98c2ca6db272f7b354666d70760a1dde29da401496ee6f6dd9479c23e84083e2a31f7c833b3f108802b0350602ae7486ae8cb902b17e0ea0509de43c2504e33f2ab1dc923075ff83792dc4412df10ac557fec578517dacab7de705671303db21b000b2a391ca313f1b8aea0a97053e885d8229241a1a12df298114200a615f4834cd0d8b78e1b29dcc9e8787bfd52250efa6a387d1814ed1a68b64070531158ac484c1f89bc6d3f84b96cecf666c4878604147f8de23de33114dfc6c5247201a0df453f7771b3f25de8d18a17e9b1dd92668aeca6614199c029ad0373d48d5225f6eddf1fbd3e51ec4f5b4913815af1c5ca3eaca559a1184cbf79b4433cf7cce57ff7b570f434f94f7e3fe37fb59e44ec4715cfaed9ad925de2c500e137682fc06a4241588629a48f4aefb4e8660f67487a1d1e423737487be8e77a76230acb8ddc869556948e54a99326538981d0a7fa6add4b237c7fbd465244750b4b5c72ca8151eafa3b6cdd2fcf69c7330814e48b4834aa9ed4d2b978ea9299e1ca93bec0247d92fc123a84a12b78888f1779e8f1e1d08856879649874f0c952de8c5b7c8b4fa8d58455b89d9f733ca4dafd614ea87e95a59c2be22e1f5828c455818e606f0855a5d57e6a2af2e8e6182c3f959ce3725e698621d78375a38dfaa06f72c9b748acb4b27272619dc02d395463139f8b0f94e04293e3d4cee0533aaa78552cda212fc56db37dcd8034b58b969ec9f724e6346f7fa9dbef6fbdca34dbeb3aed38aa597295c04d88f5bb4b47be3b0812b9c511b61f76a9311770037f83e7bd36387386d9516c5eeb72899868575e52bccfe8d75715fe8ac726162d97c1d7f92ce70a7e1eb6558bdec8d1fae24540546e4c7f6e067d43085fe4b75855455757a117639c04bc88f4227bfa1e70db766d494af01226440a2abd6882cf69fdeba386d593be5236080168f957fe9033838577b413c2c47438e357714817d67da468b797e2b53060ea04c0df7ee1965fdbc8aedc458606f48f62085c963e4783e5f7c448079086891373e7e9ab1afa9ac9553bc3b98520596a02b81213b5a153810a7a6b214663afe24f093009c19bba67a87bba3756de98e5e560fc8365d9f153dfa3f47a162ea704874846e7492b814a6985dfefd20a668553d3f0e0ede4b1711987896d6196f1018535e7dab46d0f22709300724db564f8b764b4d4598d0d6f8bc9f588aaa0a36a68fb3a038c498a0408d475f50878467b8bfc34f0533a7eb82e00ba3d9d58987beae7f11a745d23dbc37258965dfa5e4a5e84ebaf088d36dc6e13c13d23d1f6ae24d3d95ac61635a706479db20ac927c9a5a8c839be7690faadf52764e8a49df9ec8cf063a6c1626a99401b329c8ce7c10ac35d01ba374097e62cd4e2931c58a9970b073e0cea728fe0c908595238850afcbca9761bb3b01354ea8065ebd35ded8aedbbe6a9cf14a7b5c0bc493b651874d36c437e046a07d040de109f9b58cfd6d2307ef651b02a3a766bf8a2a2f6c6b19c79a41fee1f7a8946fa85e1e51d95746818e3d8d6d4ead40cf6ceccf07ea0099f762f6183cc134d0b3fa939193aaf0c2926cce2efd67a09dbde147ca35e92b63d0dabca85654e3f96c641dc465decc2a1335a49006b5cf81113762371dd5d89f318bfc9f7d49d2043e7e28b4cba3e65cf9a1b9dc646fb4ed74168d7c07528311e3efa85fcc64de3058d0c4672e35deca185e0b9c5908c4219da675cafa2f6d00185649ec2c8f2fdb845d2bfcafd03e75100a654ea2ebb4a2b82e19faf1e16211e8b244ba749149a0f06114aaa4fc8d6240132c11c932f57d750400a84f3d53103232080ea8af68e42dad862bf2b8dad723e3100e81d905e4b3702da400276001795e1df198b8824b497bee5aa9ba6cc1766e311c83541a6c5ecb9ef9ded1e4d792ebf53d398d193388b0718cfe73acfa95c336cb562dafa478094b5768549dec00635fb727af479d4212a88bf9356ece548b5d829e2cb40ad643874f120abdf89f89b5dcec302d46a90f9c3a3d6510929e3a84e3fad1f9f342b818d546c8bcdaece0a6b1372f7604c3a0572d2f6cf3abf33f8c022afc9af3f41413f5b51eb08fb11d60beb995cb92ef47c954d4cdad2afcec74280ac2d9fd0aac5a2d5779e65d2f7b927e715537765f4382a89278a559c9f427b2e983435e988aeaa9940e6e97bfaabd54ec22cd91d74af633a3df3d30d50423a6ff99ab5a5d0e584ee1482dc9a15c86a972a70de09b78c162012cd78896e2d43d9369864db5bb0ce3784a1910d3702dd1ce34430dba709fe6519479564079383394a34c005c86ed4ef9a980fc9b85c789c29050b53bac24095ca8a65368e651359b6f2ce05ff406aace9391e59cc27c3b8cf99dcdf7038a85bc4a04f08e41d2e2a26c87190d8476eec16d7e4cfd1fb70b19329d1b1f616387ee3f2c0a74c252fcdd95c6a9aa10f7f7ca45db1754f3cfc9019f01dc96e644ffd4c70503e5cffb9a515c816b37aa4d0a90d8722c8aed08b024ee32f1dc0fe34bbae851f30b225e3ee24627ec7cd33640fa2c1936504f45eff8b9c5b9c6644072dd864c7957410e54930a6f8756aa5d255e0aa16323a7a102e519ca90880c0beef58336107f1b6bbfdd58311e742a161cf737e0e58bbd4155518039dd1d17d1d484d8d2275b031363c61e85e25a00507ae7c1606c022a77a9f3b9f46cf9310b7aded221092e79d7fcaae768b31ced8da35d385af86cb4ef564da42142ed18c0a60462f6dcea4e50985e06b182676eb3d9a8274b1b1f2a998ea9c178e6139cf1207630e08e82b5dca2988c4dc604513445b0442b58380d2b7563eb931d441508e2a157c75ac677d165141b5e7e84e89c0794ab557b2b9a46758a8243aae3fd8096b1198e5c72c0309884cd07b120593918de152e22f95e1c20e02fe8616f2842cd1ac532241a462be92b2c51157215efc731c5edaedf0efa9712ca20587af92e3c52bc31ddbdafe50b980a36594186c9af91619126d5e7e2c0d464341cbb68e3e0e8cebc1f870eeb5f00370e863a30b05f54b2480ad787e027488df40b73c72fe2582dc6fea7a02cc25860a5bfd574cb1de57dac7065137c048617c7810725e001007829c14fecfeb8008f2214c011b96289b2601f36dd0267ab9abfbc485b2084309e503daa724a60677cb638d04c3c18b8ea65f0a752b1d4cbc321080d93d94d0d8039ad0014d788ecc217a5c2ef6f864aebe438a06018c4ede89b266a492068fad6d1c9cd494169167f6d283cd8484f4c8a75b251f910deba48908640db65e321fe7cdcd8f1b42982501d92d0f8bbafc1d0d37f4c4c157be663eb98d931824022ee67e0020b144a8cafd19c074f07da47bddbca76d20d4d598561cddc08d5c2709a718631430713dbc36d336c4ed67bbbd91a335cc0e336d30c690882f1918c8c78c24e229661fea7f14ed624885b2b65af18868818b8ea452d69b3b0bdeaf5bec9b70f992cf62802b915c13c3d3082d9f08ee7f23ae3b6a03267e03927bed2d2677307d417dd12b58474d20df88c9035764394967b17b57447d5b3be302600a6f91f027557df1cc0909f19a60d5ff205cd62f0da572635f67fee960c7a8713f7ede103e5d6e2085c728b887cb731a105264be8b07d75c5234e3377c5fe6f2a5cdcc95ecafba411db611105b41aad951e93621f095a24520788e936326bd35d19fbdacf3b28317d4339c3d0410a2478771e10d099e99351baa2c6677e0338b3008b211df4e7ac9c24928334dec0ab353a9a3a3721ffbbc0e021b55b9cd0bbd81f7cf1d6471b1c22ca89d0c1de020b3b4f8161f77846e20753c3803a606258c2a43f0e9c1fc74ec474e3a40a17d1457b148b63661b7977bbc6578f1fafe848432429db922653930af8a0c4981a2acdc28c7f5b40cd25a4ddc582ed3168d20dd134df25ce3b9ef33b85158beb3ee7beb31fb9637084a875846b68340d2dcb876ca24a810563c7dc236457301e5bb89fbf296c17fd9c034b3113c71309f41db0c74f4150781732a078ccd11b041b1b0fcf8f6aebfcc426e1e43a3e7117a318e12909079d30bfe99d6a1a424274159e873867d2de3f393958bbce1e7ba598df1bbf67403465ba499ac02e20e73d7bb9e3d8802b6096efc8dc9550b9960769c0109bc9dd9140d256ae18a8a79e0dc931e0926eb1ca50a093185a5fa9adea00ca22748b95f9d28a10f8cfc8f604c1a6895969085195aa35e62683f173876374955635aa5b8b298b93945f824a053eb8f92d7b12c6a4736758a0f3cbd60d160930298a00c37b135d825105f884938bef1449fd2a0a6b238422324a19f0f49f4cbe2b7a844e32d53c48b4eddc2465a7ca8c24d6b7b4178317701c814bcade2d73c4d4877e9958801ec59721b1aba03e08e53dd652a717af65769efb722a0e3ca2d7b6b7ac2d9132942169a109a35995556f9b930b4a817cab4c2b006e43eb0abbbbab9874596cb78c104ddf9600d1e6b14fb27015199ed452d05419cc91529fbb48f0f719c76c5574f952c5ed7b319112a97d56d24c2db1e02c4abba7d4015a8593d9bfc1f860e431f8f914b33cc600fc8295e3a543bcce9b12adaa4e1e3791b7401e7986c6a60cec89ea4247d96c8ea604b50f2939ea2c4590379cce4ffda28fa87c9c82f12e513d49c6573f7452978c1ebf148d18c300f983708783bcb4c54657eb205651c9a5189190c2096c66a57928f533bca7efc92794d6ba875460eee3eb4a9cf785d3772aec60c1467ae601b7a439e62aa5ec9e15bc6b16a3317d8568d48072c7ed2a868a23c7234fa82769b1a9608516c56879dd1b2bc771fd74ff2d25a2eab9fe092eae6d1066b4340c3c522a764202707052e8467d426a4c3269f346aa41b64d62a939f414f0771ced54601db5ff4c0c89954463913f6a831834baef0ef84861fc27a08d11d85f69ee0d95a01999516975be59c9384ee20f66d2cf5ccde270001f3962c4bc775582306b8ab42b8dc636928f2f56f80da34d7809cf10a34815ebdf3950b61790d3c63cd880ec1215e07d5c07f5149a2a87841ef795dce5aa61dac947607b108e976cb15281c79a414e4e090102cee0f47e8e9f569149cfadbe7a5f7588232534e0c97f275c4cd2656cc1a99ad855a72f65f3ecbb64c6ccf4e15539c3af583281025326442acc99f9b29d9189bc7989fdcd26f65f24f8d515b6ac934d9eb11e84d9ba8df033cca89cd02866d3284b2910466b732d9c7e1c80467fd53295c9301ba611f819bc65fcc7668a874f4e0b80c27ab8e1db5abc2de03e564e7318bf272cbc9a65b33581428183044846ef5273d92af7666852c63e94535b305f4ab8901ebafa41507aa83144e1c05b89d97a0bbb8fcc27e5df43f355a865d30e46bc8bb088fe32cfe3e035bd4e82598c63b33eee5d60c9ded42774c0a2d6b67624b67d6fb2ffed653e637c297c78b3f2c295d2102e686b2c1347e587f6cc6c88d4590f0bdc58228448de9560d2297168c11bafed83727ed328f2ea481d234f83515e8f3cbcd035517441fbc276256a60e3e884390ad67d142092b17eac448f2e3d1dc51939b3401b3b94ca8f1df362986ab15466c152c24bb89b6eb25342ce955fd401a19c8bd379b5ad75c90bbb5c8bbec7fbbafa156b64a04be251f5f94e97e4c2d001ea06f9d4d296069621afbcf7d9b6f6aff8f6cbf7b971e1f64d58a9883022955126bd2a0dee5b98691bd82565af9a59b4afdca8351aabf45d225af64a8503a9293ea10303eab2b5ecb86471953d1b6d8729924b48354bafb767db8c65566536e5bfb34f9b119d046781d03d72ac8fca6b32ee3821a0d96f54e4aefbe860380fd8b6f0a1d8927b2399c4b8126012e79622304f82c283d5d703fb547b9f5bae49507c2a65b96bc51aecb87c6ab18b96aa9486fd352cca9dc5cbc3ede9770bb219326ad72fd9aeb79773051f658d275b54f3e7df703df9926de50675662a4496ab3aae0047a5cb99a3f924078f0ace49ef5dfc4ca555c637c72edaabd7f4f33442716524e19533bfc764393fa53218ae9f8b1b56c29f8bd419abef825984a61f545ae980e5ecdeea2ddc35f85a88b02bf2fb6d7e4728a49a7bba0157e8ff7e74ccb9eaba07a51be3052b6972b7d9b5df42ec3b0cec4a6109f84d1c4dd30dad16c00882ef575051f69e488b19e67f281472961d79b22e0dd0021a0b91c5b414d422f64fe04ae5c64fc1a75aea31012d7845ae7cce577cc31738029327df28c13e61790719e24c00ebe26cf650e385a2b04c555503e1366d5ea9f89a639d727866e1ca55872c05f83737700b86c7870f01d094692e4d6dd1355d59f155f2ea0e08cfcde61f015b0bcefb02ece6340a53a4cf2897797d71a048f6c128e53248c06234c39db8e8e749fc431299b12b8da4fd1364f86c42471f640516d3aab634fa0e0636c5a3762a92967f4dd1adc39cf708e747cfb25f7db894d2b12435090a26299dcbd33ae984835095e9a56e0d5b94c88f93c498d3f5c0e9100eed93b04d2a4f5a15cd5002a509791ae98bbb46a6b143a68eb9291ae209cd61e34e28de5d10f440a870fb48df98583bf221bd209cb8b0a8cb382591835570838646b4a39d0116132a85d6d5d598d24d718ab9f141cefeef0d2c27bf34f7afab550926fb53e89be3412b1fd8a8cfe50427ab9b04a829d98a661adcd8a18b27f84284cee32af1d852f197f41d349295b15ccfff43c64fb6c74c35c78cfe19d5b041b0f33d2d5fa2402babc10a114f21a9b1b7c80b1196b3a48f62a6e18198ca3cf90006ee701e1fb90a91951beb6dedb7d3f48f77720d48db95c543a0b2b0deee906f58d29b9ce80a447950ef9584e6b71f606a1a6176f70d2abab0f7e419f1ecaddfdf6783351449f2cb9e7d07cb195c836f79c11f1e40d6bffb5276abe9123d329800e19f7570ede026477e2d8b740a3fcc99c37615b3d37c345f47b3c6a875ed78dea90237f3988495f90b38e97cfbf66d4f7eae6b92f6baa2390299af4659cd8de5d5e874a39b1402751488d640a3038a79d693c9c4487e6b4ebc7a8539b2d01f67b89fcce82af1d9560dfd73a17b8040812e8085ff8d16c0610c0bce9ceac9326f24f913db2a6db13fedf9dcd4389c9e12ba9432befea82cdde810a49acee269456ba9002865d3a0db76cf04490abfeaecc1871803ffdd6c1a089e57af4ce646f06c749ae6d5289b59633c1b9dd6e88d8aa08e4aa219717430504b27e40249f3916e4d3477116e42723882bc638349f706c7e166b149aa04be6e8942528f8399d46f85b7ec615442c6eef9a6fa603a77fc3f92d758adc306352270927fe80217de19b012aabd9e0b9265d4d6e23648dcde23444a5db364530599386c1891ca3708e073150ef868db984203495c83b8bbbccb0d25cffa745a946086ed9e9424312daebfab6b4b36a1b4051cc850d70df0431d00cf2804293a887b0dfe320634642042094bc17b33bc457059d7436436e496425652b1d8800404d3a6610728c8ce4658863af90216776e05e2a22f485c75903582201d486f00310dc11f8894531d015807007bc9ff282968f610713dee7de751707828ef0e276287a233749fe8d019625db01c0288e3be5c70540854861871c3716d48181bb75a63e5d4c0461a9d647c3be71973d599e10503307e320a660c6d89e1046188198cabf862cf5ee0d04547e6420b5bb8d68121240b162e5ba69c9e36b2bd79450d26e652514535223c1576b97fa778e96e2144b1a8dc163402a84b7d242465d5501921d65d1694623099b50754a0a8ef32453647eacdb33a211849bd9586f1079774848ea4128b5ddea559ef07814dd7a333d285b555542e6f14ed91a0b102ca9e356b8c9681cd74c7fb9fdfb8a0c9667183595914ea1e1d2c91b5e6c53d5dc14e19fbc8e0cb422fca617c032c82cc52e43590753300149bc9bf6744ce4c9e920ee92478296d3c87a575af49d1e6209352688d0f4cd43243f19e786a5ff4ea0edb3c3a6365f9b51fd592c2525471caef80607dfe1c06c2614c45a2c398c04eed7ce82aa162e8d3f7739eceb379ea1e749eeb6d9ed0b35cc69a0d098a68dcf9cd8707ff6b8a3a33a3344f19cd939bbc6c6b6eab68bf5938d2dd34e5eb12bae685dcc06b6e802d93b46316ebcb22ae6565b96c5b0a59b590c518b24e43163964850f590591a522b22a91f5f4843faf3f801ae480cdc57735823d7430438364090e18180df6959e153adefa5dadfe6414424565a9bfe757dee29156e3072494d7303a5d60250cc415545b2cc45fc263432a6b0a58b2027a0ec0421b2063222d49ba7156b7ecd8cdf315f01878d562d47bf6da7656cda752fa487ca98fd559b5e960ecd22e6bcc7eb6c92df0272b8d20185be5631781dc086c0632238657cd5f4b7133caafc931f4037743c02b823cb4ebbbed94cf8c22e98ebede457fc703784ac373e2e249f89168ac023f7771dd318fbd626acfb2eca5d6127eb8a4ead35ad29c8face77939e8923c2361ec570c575095490c8efb6a4756b3fa7abb446daf73b4fd07d0fa06d41d0fa17737a7b85011d2c8cf6b41454d0fe90595642fbbe5b0976f34190894f335ba9fbe0781aea2bc8b4df7f8d31e9330b2f8b1fab2fcb64ddf772dd2fcdbfcddba414b0eaf42ad486ae7da3131c0e327a12c996e2c3919970de3cacb97832ef75d1f7780f5a4148947660db6758d98eb8273b97258cc402e321b0772582c59a299176961dd0b12be47b69322456c7f8c64828a56171c1371a69c71ecaa6706b01f337b73c62bcf0abebb441e12d99c92c75209caae92f75b0ab2fd13ce4ef6df131cd6a9710d0756abc58147ed0b345cd4bafeb1e97d869bdcd2fc8711ad09384a0d187889ec96d4e84a3e37625bc0fd7297d50a0c65d2e59ec5cb115b9fbcdf3bd7d6946a60fa8b14b9d4141a4ad8adc23e433f9a2abe75766d377b17a13f396045d0ab0ac63fa5f602e3c7e0f5f2208faba7f0ab2b34c00a327e259df8a38ab945332e19768c9592c3b784fb7bc6721a2192eb794d55741a9659ad20810b3b633a1d210939b9edd3e0548af85f68269584864e175dd65a072bea88700ae4a8a03e847d43331301a03184b46b83c00f2fcf77b1fb3efdf05128a6e291a24f4e7ba0300fce61387399e69af1bea3819d45d1d9e8983d6ab9466253f666f0c64da09f726381ae1347dab8b635cec5343e4a987d4fd3430e937a987c405fe6380ea1c91ec574c91dfdf59b0ea82bf73f55a0386e62013b9a93411ca5552048bae857951f51f513344a4539ac725a51a3716e4c44c3f98f65fdbc8041eee22ebae1358b2e5e9a9adfb51f1e9b2e997a3f34eade35c9ae01ceb59ab79f39ec33d84f1a76f0684af020d7bb4ecc0256501ff5cc59989a7ef0bc313210f494e0f3a4d2193cebe7af7bcbdbb072cbd0ef91b8b2af4aa915d2c0335d904e4515d3aa9105ceb4e3dfcde4784935dcaa2ea30fe69831d96182d3b1dc93f6c9a0a22ce513d13380e403156427803de79cacd53ad1d305d829e42c0fca1149468a12604ca9bdfd4ae8649ff29e78e6676dfc213d2403c24b559fbb0e22db7e0b1a03c1f32e90b385cb5ae19e5feb0bfe9ac855ca5eaa210210945af7ed370828d9617e5041babaa520576af81c18b5fe4cd3e6ecc985ca82bf4944744a0d0efd693be24fe3ea8cf164af7ad0e419427c9e1b8a4ded9082c90c2fda8923578d099edc94c2452f973828746b1ee15ea63a2b379ae5fba134fb8063f1f55486c854ff21de7b2b4ad3ab48e6b2a07434d61fc1db16e4b64ab99518e8030b52637a21757b07c57daf93b4e2371cced9870c57aeda7abe2bc91d2e8f560dddc51e51f9de2d09dd76b22a042a5d66c0e48cc78414e9c9a28c5cef920a6050696de90a1c4b4f5009114be764797e3b27d3c179494d68f3564fb24cbc1d5ff2e2e1238698126810ec55a7e84418108999124fd5a6f81986327dda0d576219d4a92da5641446ab90b8d06aee5d780d8d274a273c76bf1b9cadabd82312903e1f5f9ee37a07ce4b10ba758bb1defb71d3e6b5c054fc6f20b2302d71785178031c175c3c632bd259d2d771c14cb02de9fa2ec829c9c42d280e1600256a3e7c663b7b9162cff7ae98e71f1fe0499b4abb998079d7668e3974b23e063503f68d7c7f3e924dbe7404a9866988564d572e03d3c27a5904d8b27831b04479828479d7190b6f4dfe9365812c5ffcfd83d0a261bd6ead1d9127e871d8442fbcea1087ebbf5e35d53e9735465b4ca72b8ac0aef6816fe4c061be96b68639f8306585e96d16534b03356c6137cbe914c270b5b6fffc8b5416e416903739e71c2c50af2f26e991807c3e9add68f3de7daa21698bca21001f39485f5de76a2fe52ed31490276945bad451e6cf252868e777f8942eb1002977ef3e0fe13fe01f873e0ed060ab7ede5414be1855e146d425decb059c988a2cb326f03edbe9cb8225d0bb4dfbd341e80bed0bd4408c4f41151255278b2d0bd50ba42c192a7b1835e9b5f26c1b88459d092c92293e705d1d12be17783111f40964801ee8f876d4af1ec8cc6b0c607b1719df130334f4eb63e2e7133106e81946ff89a5f6559c838455a310c13a8642a78a991544e43733006b58fa078648766c63078c698c891e319600b6905ac92135c39e8c1e2e264827aa55cb27c861a4ba111f9a79fd1f477c5cd225e0c08b79dc187d6ef89149ad7f583f0ba97bbadb03d4c486566d2128b63296c7aa4ebb8877b4bab41b33d104995a20f2c437123edfc838a4cba5fc820ef2525b97ae277c689b39042f168ef18de4230611431434bdc9376273b5bf88d81b719a97578d525b13ee40592827c2a76e329ffa5c4f59042cd496e7562fbc4c3d29cd2f303d98dc5c9bdf4e1a71a71122bfe338a71b7e22046bce2ff3172fc6897fb7d91cd1cc3514b7519dddd03d72983b309615df4ad0e409b9e067bf13c6996253607cf8c7e925424842256ce26dce9a44ffbde997578db380a6354d5f04403d3571a24c824af958897acf269e79004e1fbccf528228b5e6e1007c7aa76183af237fbad06e9f09fd81575ea055ec7a7344846c536dd69a50c9f5622409fcf59bd22e79fb0f1ca1c73ccd20eda55a985f0c220894d045659711196af4fbdd8644c00692c529f885030ab654a7daf29a4c3d3bdc53de31e9d2be29a43f829e86c98b505aa701d178adc073ec6e73fbc31acc88004888f31ebbbbf1aa61dfd24d9a4ba75ff44c72a4245f4b2220ba75a4fb8a670d54914e65383d8c4aca7167d23d411e106b808ea4f9bbddfa1b4bb661b3c806226fb4a461ff147a86897e2e6b9883cdf1319947c52f7eb8fbb8d0b78c987a0a1fd32d2c36cc4f9ad7361c848c225c490abab15568d5dc0a2186b13ff0d2c22017cf37c08480d976078f4bc478162ccb168150a312f99c5e2952aff99d5c38dcc2cbbaca2fff79ba73955bfe45c25fb494cee4dd00dc110e6cb9cee9ed47115ded5074f34a26fd6c4408be714ab2e7368882eaf8924551a4d17fa50c34847b32419842fea9a16dd31b42efebe57c9d762b6058a56a5381e4c9884c07b146574d12cb6e68783aa27cf755b1b2d503625a692feebc4039304d5e376ed3e3f1440d42e126c25257c5ca38d7342fa65751c48468d8fba9dbe53e262cddc9e4ea24a31ebf7f70535365325bfcf66d3447a32b60236c35e644feef3c110a36612f0d257d89a1c16b02ca3b4c8bcb1c84a6a21c00b7b1db214d892e96f077d5f8149653bee3a2ba0cfc93a0c75a8c9f27335ee3ed4438231d4ff439305a853d1428037087834aa6a3f1a6daf6a4bd6ac6229adfa9b85019c03e29149dd97135ace7aa23e0725b6271c30c61d5a5f56116baa0d54b6140915d851e54a1815f43933bcc6e94df2a44ed0f8b188dc0d7bf319588adc68a13200410f4796dbf2f38fb38250d92046d35d3b3d5bd6818f345f07fa983d6140aadfad08b9f0966aa2ffdff094749651fd87215e2017b2fc57a14d9d30d73602f5806e46e6c00d578ace76579295e38cb6862f86ddf96fb45af93a173ccebde8af3c1a57f4262870fc4dd84000db5e2838a9ccda8f172a164dae66ff709a308c4ef57c758434ac39639a09610acbf55c8187dde7c13cf7a075b6709205d414e6275e95109652a994ac28966349385aa67b28cee6844f50f59cd299cd47668fa9059921b360f0682264eab1918078dbc2bda64dfac285762ab2f73e458e332f54eb36c64be1ade53f6e01958a962aee7410f40e6061a467033dce577dc1d403f1dbf4c3e6aeb3808f71322b7f470e8d9e45f7ae6309317107006e6c9303c879679006243cfbd82b8a6b7a5c1a92ea7baa2f4a72962520daab48bb0e13c52962c64c4c57469d55881eecd340a89162a8d59675a0e7b8d2fb9231fae5abb76488df937824e444d384f085963254b9ab82075e29d371ce05b3cd2241ad91045a9f8ce869b0c2231dcee45b9ad765166d137472f6aa9468fd9257693bf053acee07d7a42fb5b8be2f7a1474b2e210c5422572c8b08d6e14b8554173ed1d398490826c75aa1af58819b71794f2d21d4696dc04a7c80e4b8ea5668a5f72ae0abe65febb08d16c496ae652d41a0b8f9562101873b7a13fabdd5162d1f329b773d92f7b6a05555e5573ee7b85310a61c49fb43ee86d5a8e5ff39e07cd734e91b48d463c6f4a3c0dc8e62b325baeb6ca6fb60749a046ab48ec7f8c0759e57abc27e5f8a96bd86443e0529808a5edb5e2cef6014276428647a9550d3f8fc735bb985a52a6a53ade1b178dc4220126981660a129f620dbe1061945e63a73c79162525c0527dd45bb14950059ded2a8412e832ccf8ae68cee58b94222ce387e2cef112fe3e59a3128e4847cfdb114aa7e6bfec6080a911a95358f654f3269ea5da080ed13a459239270f2332461e0fb007883da1cf44f3a9c09c3302f304db8fb62d75540ce64608faada2a899ce690a3728397952d6271c5ba46662f2cb7ea028a486e2d4c2f71d17205fa75163b84837b2061fdc2f2608b861ec8cdd022d6129d91a570e78a0c7f86eaf199d738fe9bbad54bf7a2764a5e75f047a5baf6223ce03648b283ae55150b5230ab3af3698cc7bbed1c039aa87874f867516d06614ae36c72fb599f7bcde502b49989e4d62d208cdbec1c5c8946c6fe43d05246adebf8aace1ddfdfa8d58b379470b55d95a4c1b49b53a4fbfbd4c47cd8fc8a3c0ffb1ed2e5aacaf29ebcf3645278a42dfa568eec58e32c4c1f49b9ada464cab89988d3332842f736ead60074cd962f939c68d31c07c02bd7ba405a0fccd5b780cafad880efb1239654c8ad70a6788726814d5c713b7712e2a532008153e287c12211fe42da9a592030c15643241e62314b0acbade5b5e25afa119461b7dab121f8061f4d12c6fbc0565cb4dbaf55d75f15104414a5cad9b4f7ce8f81877c720075a966d252cf29c66e263500c20484ac826a80fab96badd5d8a6151815c704165d80411a9b4ae2448dcea7207a913b2f57494ce1c335390ac71d5e569093e72f27724fbe6062d395ecca1edb833ab36bb3ff5820f603e46c8709b696a38ad40a998dda145ab4700538c00ef0024d414ea7a6abe9c3dd30af0a01e8c8eae19d0694617acb5b122ff8e750c79ac2ac9a25da8a1766ab2c32a94989203e42b4830cda11126790e3323dfcc67ce0245344b27e31c20ccb35f7d35cf3b076c4b476efd44ee5f15df58eb5ea5c8c4777e94e23990506e567444de878576b72c9936b9313012f7942acfdd49a803fb8946ec4967420aa207c3e83317eb701b08e15dae713404f031d2c4dc076dd067bb0f23c15225a63ab7eef18137072d6a0023fa3061cea2355d29436c413cde6c22945aefb34ba8dbac456b7ce53143a629a8508c28a4429dbc45cd5e6d05916876367e553dafadcf1885367e01f7291f12cdfc3968e7d6b58c140ba03ce1b6dccc432698707d6182345aef5c5adac45f0d7ea3a9aa3f506d6a024e00e718c530b86da62e9434ef35f5bf9f8e83cc86e5e0329f506b81661196478e22f1df765666edb9200edd4fd2acd6033c5fab8769361e6e1a7904c1569cf14cdc629e1831278e50b76a3308b7f7b0688563124bc82cc9d36832aee202a4797c7d3526810de0da63617df35f4b57d33375ed21f988e8f7252621e3e8e6a3e852e41734f27eefd8c6c02f5765748655d3e5f23228057835c8c406450651fcd92afb425bba61fe04209a554206567f9546ff6b4b3ecb14cf2360a4480f3b0401914fb11300b90e0b58f6ff177f07da18b5c16394447a30e800a60e0ba156384dd97b7c66b5b44e72ef63528d9f65fcb76ca07444067084868aad3394c14e4345940ba8319e89878c18e02b5390bc6aa81687a0c45e039700d7243bc25343ab52ef7827535ded4d8276c03cf39d5a8605d16c30f844e30001f24f2126d21fc907e844d251d3b3a3986c3049419f1baa35975a42e3f810bd48ba14fc52f419ef571104bfa182b7d6f11622a4fe463397295cc574a77d12aa773dbb4f8329a6df13bfc36692a6b7fab7e7365fafbf79f4b5fc8b47eba5295f112b99809ee3c7b64feaddb86c3e8b35ac3f56668833467629d54d037dcb268696544b68d293e7709a9b067618bb220a3ee6de4a3e4028d131aa3e66693c8d04317e92a884b4c70bde512248aa87ac631c3c0988596c720528e4074d0f2b0f64470a3779c99f4f403709f739b15dc25ef2d7bcef74d98e024f3b3256875b4892644f08748889a714e8939cec067801a8e070132f046d4f046536b68953cd4819c2edc476e697b452b77577a17aea43206fd69067f516abf690416c9e75d1324778df8f2c75a0251fa008ab6fd8affe9d9d3dbd03890cef33dd43489e42b672b34a152a2a568ab6883b276e09bdbd05cb303af17cdbde2a6366647fd492f17850ad3d80c27afcd3c7f5a834ec83e0318d6fa3fc978962ca4955fefa1ffe7f1144e42276a77e5bf88e1026ed590ff37a686cf1b86e77275bbe64dfcf79a40fe383d623054b2c7fa248c235028292b619f8b28828a6f207da75faf950375853f9b32d3a3808c728fe4bb33b81c36c5391cebd16e560903ff10696339b5efd0450bfad90e3345c192046f120f356495c291fe267c74d7f7d52b33872e3ec3b7696f2a5287fa64872e21f45ccce23836efcc9ff031ae6732153499096dbaf975710e6061c77897345c5cb2620ea0398750d2130860f5c60819d52a09b1f78be8b7630c868b7367121bc52bd2686bc0ca49f03e0344d9da361aada36caccca43bca38e1db8488e5846728ccbc4f9c415fcfe6374f01b596fcd403f64466a54e8a5a52a765b819f87c2b55b3e86dd80097d49ff93ffe0fab1ee2fc7bd4b50328c26814780fb992b78ea4d6ae8b2c864100058c584c37fc2cd049afd85b28a0e64a9ad26e08167880194785c7289292888b6edad055ce91b4b2eda59eb858f7152345fcfbeb84e34ce0dc173ab75b9548718e1a1a0dddbe95592ca74247da243d0f933c30f90f0878dc21be3114ed50d302f625a9af2bb6e14d62212f124f67b5e891256b011d287b50d84a153695cec013c6b7554f30737b63a807d4923ae71c4c4090094d854a34ef6a1ec35e3eff1448406a4c5d28ec2205e53b0107384caf82ba396d8e852aa828a4c4afe2b0336d6adf5a4d1dcc2a28c88b198482c8ceabad8fe89260c64926faa33bc87c9020e900369590e374ba5bce58494673e9a5a2c32953eb2d4e58d705d5095bea59f539c4b75ea99f757c53da259a1a8a9d0411f83ce0020b517ab7b61c34e74d56aaabfbf754d29e1e1f201144ac2b5b345c3e4ed4f39d2a47b125d492fd6d0573c6e42e50d0500c0bb00a0c7533972a6a43e5011598ec0fb3120f155f4efd82388018325ed6ee5f450a5dd9cfb414b4e9a8104c6ec4e81c3f9e111eb6a6f9830cf94aad7a846cfe895d450627aa921860d342e35bc7f1fbefa2f40ff3387666b40f35cdc4cb3c16cd381bc75c12a3ef34ca3680b37fae4a869d07a6d5339fcb39ac1dc0d17e2b03ff383216700c2ff38f5483556f179ef9bdbe6fb610189406aff8a6ad4c880a3b13269822386313c23e08e55491c2f3aece16f82252ef52ddb5b35e148466d2b8ba78389024796d88170ed5f3328680a4cf6f99436ce626ce194fbeba12032c3e5c884c2db2358198cb12247a4dd7fb67d7a6b53fcc26f082510f1cb7bb9fcc7138e9c1df465eb7be388d29b50aea3f0891e6f99bae38a563e9312b551700289df6258bd538046c264c38e17697721607ee72032ee8e54c1a9ceaa2fadfce35407d4702d620ad7037041658c1992ebd86fe0d2443940a205f701cfc44b7ffafd1e22e7fad99e7b4e741632c663b083febd26d76c72ff757fc58e1b5e063e5763b8de034c233e6ddd353b720babeb1f16132e6ca02c81e21cd87785f1a68622bf67e75e3c1eb0cb6f1280c8332315c4189871ac43b00186acabf51ce912829384aca0c822b6104d7b7f566e1ccc19d1380ce1656fd11828695910191a04a85495d87591638b66047e987db4c7c217a1aff97ab17bc06d6ad08992e9b426e2a08df1f82089380e6ecf76c307c9ccdcaea8c7f2565a783b97ef3500962b877de0eb054d3f40b84934f9c6d7ccc1e2ac0fc4295b36386eb1273e6c5f543b170ec4894ee2f887c2359c0bfbfb8df68284693ec0a712ccca09178b13129eb024d9190d0cf47ed66867744345da20331f8746668b3d6df4be1b09f95e02516b1915cc1a7921d91bdc47969eec49100bfcc36aacd4e3f6d42e5b39a7f10e6816aaa82842bdbd85cc2e5d0c20764443910d3560f529b9b0871099377ef10754979b93c97041a1d6066a178a4d69e6add81f6e8e915d7d0c3a19bcbd5672945b1a0366304862732c0262db59d51038365cb1fd086542888c4972ecc8759472000428470b16ea3508b20f27921a855437a2d2f44461944186202bdeda8de39b948c6a808989ba43d3b15a04c9ab4926f13e95443d45614c51d5e7e3b024bf332c7c875ec3490067c171a3784ede565a2fdf46269a0b3c3ed2ac130afe0d825fa6ca0e6708b6edaf4c2fdedc3d5376e28f82a8a877ccd5e309aaab4379d73541f08f2030a4da0ca5698f64d814e0f1dca502c605f49c28722a579f15565026cb408d7b46612bf5399c65425a4da80be4f7a63bfe62a45a4b0c3031fc2cc419a8889db5f24fe85ea816ff87113621098003253e00444679b1db8579cc9240c89c5cd461a0e2bb9ff1c77a9f20345c06de8c0fdb4baa86fda894231dc9f12fb8e102394125ca99ff233c51b76d202ca99885be0496581f289ff0c255e3e8526f47abf6c7a87d2fab06f09008a31cb0a27411ee16d221a6ddf12ce1543fc81193770bcc0ac0411ed0f89331901eeee63da64532328b412f580b30f848ece912a65365a4ff4aa7ca0595b749084bc952da547f806350817b5026eeae0006e6a9e903ca1bcb1e2f6d91c6f905ad03b80d922e2413d067a7bb900c2be2f0d440ec6d5b53eb0cf49e3cc0eaa3ec23922e500c30e976e30e05c0fffb32fb734704e5a6b8090a9528f5ef9b0e2d0800ff1b55899cd82fa8a84091ec81384329148696cc99bb6cf5575af993d0e59270fbc10661d9de54ab96bbd559bfef1bbd1f63390fc8d29891893346278bc4d74acdca88469fb975670282cc53ae972bba622eee5bdcdd2f423b26970f02cbcc7e6d61507cbae14d3c1aaee71e6321014037c4a41349d72384d0ccc8ab846d44b5a3eeddaedd02dbe81462a24d936205d86789fd4c561c897f55ec45c6948cb9c7a5e0f540ad2d46136f53497912b2e0a626693c527a9b15ff6bf496c8f1001835c3e273ce94d0dc4710f9213714d1fd23c6f39ce042355557d0af770468a1e7e31c6df820980811560ebb100e37e5abf27cf7520d81b2b433b2860f2923238b38397c19663baf539ebaaf5b2df1cb95e4418d7a53a3bd17a926fc31b39d244794fc0d449d0956ab96950bbfcb7a7c5a5ddf80cbdee1f0f71841e8677c92df0ce03cd8cc05c46e216326d397edcdc21bef998ce5f19893e883a08851dbd95aa6d87dffaef7da4056fbf1115a39aad913ed44ea77c42b1e903e11424b4f9b93bafa8c059d379c68e907e775a44ecfa7060aed8ed3733462ba9498c9b079be7e9b0178a4447f70185547a4f9e93861a883cb1c263314899e4b61848c86e078a0d2bc06a29d832db1ec3c9d1426a9cbcba29d6ab04df23e161584d39817e792a0f4205f066e60910b18eb8c29ee3d4e9b0af1d95c218bb792813a478622705f4abcf0c49e189e7b8704ab3c120c7b8034c495d4ab1bf5eca07fb5c70866008d80c63b6bbdba1343f6f4fd2d811c927637180796456c80247c25b982b085b094ca8caa4ad62b0fce47e50349305765ebc2d682ef718b205553fbd3c34293423678114ac0b9b0a60cab22f51d5746aedace914c33be85ebce46a5fac4825885f3880b3b2af683539bff2c4b37ebc9368558fd099c59e09d1954ddb7f5dc44751e2e5c3c8f736d138eaf88549c414dbe4e626ec6d2487cda72409bb264067414d97b3ad71228b2ea84a5860ea595f66fbf13ab28d8e40156b16afb8b3dc1dfe877f16818ad1f8a18895537503aa8eb3848ddb33e35c807db4c10b6cc4927e1f0ea140b0c52a6412f8c146a5a7850ae6e0076f98fa8aa5031beca975f92a08bfdf799a4cd4bf922d0c026523c83b33659ea6475425f21ca5ddd3278633e057e64810b71e1cbad074484ef89554b0e5e556c39da21fa9eb561a24a42c76192cbde08a5bd5ebd02eab89e18fcfcbf45e90eb379af373f772610f7b49c6dc200715ffd5b23eef607aadb0fc0a60cdfc31bfcee251ea7ec904190c7f8492644d4e3806593eb8e20ae43f657dc381f41ee002a2f2572a5aca99d58d3c57896ff1e82a581a4ec5951ccdbd35439f9c19796824be0ac0c91bee12ed96c16f15b7c5bd6197570ee62963e3bcdcc69a978067236f5f8205f6ef73cb8e489b01f000e9c8b42eff11680de68ceeb83dc3b84e931e55cd221056f3c3a160ab456ab01eb9e7198c2c157d18f07e00b88dc8e425b2697ea45e3746c78dfe02e181664e48ae460297e87a26d17f3fb5ec1a47b8c184f519ee6da3fa34319bdeb9972dd3f4243d6b61ce0eed72d1394c422dce64bc299df90662e3c24d4df135b52c34aa41dffb17c43502f4e1fac803dbc3d8a1984631a06f6a274cb3814b98d0c8a7ff377401733592e86048b8a869e6a5c914d3f716c40d0d2721e8b892ced8d422d202162e6081421634a014214b6b758443054ac029b489b61a911acd2e84f6ef41dd88253a33d3c1b3f781589db0cc431d7ec37760d35261f07df1d4393be05e0ac3d53fc11e25ae2d9c08c3d292204052925172201563533fcfa215f604f80418f63da92b7951614d201d3ff3b04b7b6a0150eb13d76419478aa002013a83f1101c7cd2c839900744a5532e85cac6be3265174eaf4121f3a2710ce52d12ee48be1f62903a3f7fbce3ff92709ef5bfced4f915c56fc9d41a72d81233e977751a8f45ca03d7a91df28b82527e2cea5bbf682daf78e27698aaea1da710a1e3bd7148a151a50b81ef0d2ee3c39623650d291e6ce14ea64f49c8442e197174df9a70c34e92c02b5f15008aa4d22a2126349050368edb65206bbf15b3ac711bcf0455df0362e92750a1a4d5355156267e025804ba4f10c6d3a5d87a213a4befb169b4e610c8016ca9c912a8aa803c16b6a43678cf4367d4728775edb6efc91daf240911f93c6a0da6dc8f292551f181431048828dc4eb86c6c456ee1779593224caa4e7ed9d700a396673d55502857dee06027704acee6e32a8a7951d58d042003fc86504899f2c31d0542731995ee9a09f1920484acc0b312d000a8188d601d37e1e43785964616107d43200f57fc68f0ee82c8d31f8ef28f39791ff8362d09626923e036e1a74eac10bad62ed2f53abca6d32f54e45b86da4fe58d54b21d84c9826df5b5357b02e8c752af25d29c9ae7441e495d6290cd6c684a53aab28961728712f66b308e85a14101553483d4b2a8511d7271896905e7318c5298b1c20296bc761e14eecc76e8021d511c4d36043fd5bc373027ab8e8126d823cd47395d4a8060cb51fcc15bff717574691b4378cb219029a37e628625ecb1ff5be7644dfa192204343ccf7ceda091040d87bc232418a9c3809a8538bba9d5f6c5fef3fa5a0fc631841b15d6055cb804e5a9ed93925f74b680479a1cea6ae58da1d95f93ca14dd7af161afb9f986bdc04c6ab67d1472fa238e4b470b84598b93af5aaa2c7125e17f6a472c654f1ae1815854e28da98bafa9b8914de4e80c1fe821ffb83011ae3230941f421dfb05f8d851e6aad667bb06feb45cc0c47d5e4a838f27e5868368c7f3708a8b9d57b25a372539f3da43d5b11f8e71ed3920583cb84cc99a605c21d24831f62740afb4830145ec445996ab9eb1ddc7b361a63c7a07508c2d32ae870ce5c3da3baa5176c10b512a0c691bf395dd35ca3644fa0145f88e6530e03264de976b45ec95591639ac2c67fa46d582daeea4bbd71acf0ad93e6f8ef9c2bf4432f5620dac7dcc1000aaa5f409abf4b5635b69367a02bb977e817774273e549c3211666306281b64f1d88ad1999d5ba026fb60842761c7992fc85b4d4526ed19c3015f4f3cc1671e8ea54cb3d41b5e1b6aa93499ec227d16668c0829b8278065b180bba0904cb41137dad440a20a98a8cb3e1aef5f29337e972440e7a94d58b12c8b7ce0a5325d776adb9e4278916de933d67bfcef2ffc45a05ec758367f67e3cee28b092609e5d75dcd8f4b18f981d8ca061ba86696e786799e4e2f8490bbe5c241103f44f433651803851c6f8c0a70fd7f540011c77fae446d3b2ee52cb660a3193f04585570e2afa664132eaa804f8783a07e051018dc6708c60baaa0640a4034f196d4bfa6bbebc27b50e99c106ec24ef05c4815dc38209ce364d0a8808e61b1bfc4eb8911820a298ecfc47b40b5394c7302f1744034166482ce7201bf7b48f3fcea0ca8c0c50b9a2922d064392b0ec9309fc3d8d4dedfc620abe4f9eff4694b1c75a61895e7131fc32f5df3824bb9d0fb21ba6cfc4f03ba3127e508b441b70431b36db5205be68576f48618fd131b0ddb860f2fa244c12cde62fe46449d6917e21ff24110d203cc5e8e8a2a8a19c66299618947d63d75181e2cc257302ff3c0ae5e76baa94c2893e0b960189c01ad74ed273b7a27e64f4b9039e33fd0fe27072088da9c071057304a4fe77fc6ccebbe01c7dbe18bfda058e9874a94b0d5dc090e786c5c4927f9e95f0673772a15137b4ce5e2459870bf0672692ddf46ddb63a204e31d07648b8bc0f7aa1e33ab5ef79ac442e08409d893c58e6a5cbaa2847c85d02adc44c91098f409d3d30c126a1c1930aa691b50b0ac70b823fba749ff8fa6342efcfc5dcadaacb9c7abc1f4c7d83b7025b36090fe6670ef363d03b9943bd61b812d455316f6336b1b3379a2dc998378c2cf22397b7ab545fb924b2980dbe28b4a0ccb409ea5d9098d8ec4559dfb64a273c30eb6f172c7e51b36af6f3acca33238d1d1cf925b04a4386290df1940aa9f5e6f515d2889620c1799ff7dba19ee4e9bac35f2eade63d5d48127560b34257faaa251cc1ab6bf94d75c16ce72ef621de23bed81fc5a7cb87251edb843ddcfac2395dbcacbd0272a39993e151ff3c7d1c6fa05c03a2ca8c318c1edf205e5a5803bf4250806df48906692dd2c5e7aed27c262c67d6cae3230597d9c34024ba5cd95697345f33537e3aecf2491cd7001bd3c005810eb24c1f69d6e40a9087f8ac313536408e453be3c9019b7c92c71173559ce68c00d0d7f1c17a2b7dbbde3aea4869d2df33400edbea4cba0fa524bd08d8d4c51368d1d5a27da90645eeb877259d698e38431f780a5a03bb9e20732cbe03ada648d2bb8a6e19784c7591e05658e4da41273fc42f0be553d8bcb40c2430efa9c3c06c19488f013251604ad3778a9911012ddc66da37adb11fc2d74ba38bcb0d0084f1f023a12340bf38b088a68a85dac4c55795eb0f9ff4a9a00d0604c38380bd3c124ccc52fcf3e7070138575b2d0c1fae53f0d0418b9a3df1c701032288ce173c371496dd821c14b450d40590908e04e36800a6df3f55eef445128071a10504403b9798aa9fe218bf30b103a3ceb3630b676eaf7481f190d944e0184d7a19ac700adb67c426749834c0d44c020fdc7406faeb8078748691ef0ea1e9ddb75f8f9803619a1ca2a60bb515f997bfb90708d4e506026cf21431ac97bc86e0a1a65a768dc83d5fab9503f1386aa8e61ea00e6a707b102f083b401648469fdbd19cbbe6ce12c100623745acc54274d56621285f2a9b3db9456aaff738f6d0fe75aafe4bee1918b4afce61d9f307b40dacf0841f19538f8450b81dfcf9d9797ff7380172bfcd7254b97cf3c9d6a02e675a9a0b4995d97b847dcc468b785817469e5323633190ea64c52625f033d447cb32c91dd56011ba2c9f4a663874e16a4a4ad436c28fae819e8549c7654a079fc3ca995a1514428c2bfb78391d76b33c1e9228c5a7ba9c62cbb4e8c0b444b4d96ca188f4b8aba736a8ebbf09d45fd625bb6faf0d873eeee060bb6184dcae77e9595cf42c6c4876ccd967f5b2393f490330c90eb598c66f93716054094ffc5e34f4f51c18016de499742c395aec2d0023010d742a10b07fd1eeecd891eb66d29a0bbe5f28786abce83094180eedb624a8fce915bd1be809d0ebd8215e16bbea0199bc790e8f28625a544277767a22dca4a16cc3fe3d346417d92e40d2aca4ddadbf1ebeb9e60ec645a095de486a36dddfa66483535c42d3a6e784d358a58c9fa32eba2abb11e1b81189a4fa092a033435951c17cb577f26ac03a1900b14cbcca24fcf075f1317c0d4c8d0b112fa017d3c4ebf7a5c20743edb1e1771751ac75d69e36ad6de5cd74d087c04be71d3e4d214abf2e65bb7f56e36b047d09cb0723b8ef0a7f504e6340c49f5e1e0e512ad561ff2b68efc8d7b456cb190945ce739f3f9fe07837626401018e6da29b9807e7054eacf2b5d669bb25e5382fa10cb28226d0331985239fef9621534d521c3fe54f080cdb186790ffaf1e070cc95fd29c5a2512cd1fc06d570328925f27f5142b25ed4aa8cb5c1ebddfdff965a4f44bbca4fda705284028fbabc04e338729817d82a83b2f90b03eaa3fe2be57621a0a100c182b7647f7f7d2086d9f6c2fe8bd59ed396ea963e299e9d49792a9f73a18688b639a62adffd9728d778a197e2aed79a769227d7633a742871f784b48bbfe87bc8f29c339b654606999df3db3bacc3cc67c2bb25310a99d1c2a81c4fb3c8d934a4289781f0e76896acfde1c0461929b1a19ff760e253065cf74d00c9921e7ce4577109676fe25a64c2c9f1151239156b722a0233db3b6fb9f3554553ca86ae8fab787521436abdb474ca3bdfb921588e29b4280c969329833d889bc276f0f45aca3130c249c5cab77ce26891f2b6c1598155dcc5d1bb0bad861dc86ed535f281d88a1fb4e170e2e8ac328e7869d515d6d52d0ffdf4409a8dcd167dc0108ee9d4fda88cd51e817e1a7838b0104c70214e83f8169cd02a1e12c6a42956759ec47ebec762c1af4df42efd4756d8659799d6967a952eb246de1906c28f80b750fa44c38f2358a56edc331816ad4e3afdebf51199855c884c2a32637805628473c793f366edfef064e4c3d808409c025a7b11f443eea834bc22ba2350d1b9f9c7c6d2f3d02b26ef30098a154a40dc4cabb2cddfe5d6a1534085e0da3db8ae44bcfcabdc0fda745e5047f5d11e8b71dc1b64fae3aff5f40bf8d56ba6d854d149c43e4ea7c611ab754c664ead9fc1f31802923499f7a06edd8aa6aa480936562664c556df646e45d5f4ad0f034ff16df7904fbe8f082f161c4d800b804b365bb0bb62e719a2bb06965e857d08be3404140cf4b76ba093ddc50d1e3ccf32a1016519164e8000760b79fd0bba8dc4ca2d20c15026b04af4c3e6d16fe2107a78cb451d19f0341d4ff35006762d4eb8ba2151acacf43f66655e16f04de8643b596c13a23b2792bc636687afe7e115c6e92ca3a82be25fe7286929f90ff173ef959cd65d0700470c0f49718428e2a5fcf23a0cf5580ec28b19f708c7a46dcb7e624ee49f1108b9a2177b744468c447d92b787506a759ddf4f49d482af2340862d65fae4e75fd511d5e6fed89e4b5cde4f4289a07f9996fd90b883caeab2f90b31f04fa0117c5148c80ce22c360e8af213fbb25cd309e61e1f3a4f8c5c6f89585a06f81885f1acdf858a8d4660741853cc59b201a07935942aebd336bb7e1b4eace4914635abab0a83e61b38a6e1e275c4f155d973e6283d1df03cc95e3630fbaf96d9c28cfd5529eba442675fdfd417b50c4d0cdc970d934914c487fceecf79e6ee465eac33305267b89e4419eb641c7880f804284da67146fd3996e5deca09ebc6449c52b3cf847ba1777573953367a2b7ba4050ebd02b6c3a2fcd4dbec749cf542e43baece4c5a075a393c4d5a27fc9cca1d0b5baeb2d3d67d3596e446cc64aa7fe7539d3378f64a75bcc9e8e111a1cf94293ea97b9d9ca8c161ceac8435e019b3939a1cb1c72f747c99ca61caf18d28edc06f0c93eb74d7636f4b42518ea821b12c882e129c96d55d4b2efc5dd363d2478675772dbaf94306ff6f6e1667fc57ef25d4c036a06e43b033b1bdcec073de9ba52ca6c9835a9c006ca3665b43d23414f24dd4216a9831810c7d17332470eaab8fd4973190933a48f0a5586863ad9db8ead4bc4ca7b3194612653f3acdb75e30999696cd3da132f83970265222edefb2f233359ea2917053c29d06f9eea7ea8c7223f29328b2e2d2fe29f1b401223fb573013c1a48b837498f790d1910955fde648d661cb1c56760762334f4d87b1891b913eee4a27f62061a5b3a9280babaaec7dd554ba640d2e5d46009e85df4fd1592e60d4b51987dcd8bf14e6f3a42e8a116ec95b9389c9642500a380c484b3f5b2f906ddcdf43d5629e9bc6e86700f415b2411fbaf8ebf409cf2356a109f79eefd105dcb1acb21f752a46e260eaa6ed42964cd34c8f05b3686034379ac958d38a376ddd96f41373fc5126f6f3d0269d7f4fb5e3201945722fe23b4fc587e7db33cfff9f73cb68d5912374ce86c12ce3c0f8700f8a880d132b42b804440f3a11a129bf16815f951923d0f7567d519be8473527fc16fa5b4ff41df7159c5804c4ef7df74d00f403665197aa7e8290b6a587c883f057bbfa37bdcb0722bc44d796d5bda4f0a6f33849ef4a6faf580a4a0fd2bbcde75102f7891a1f09a61fb112f3a86211447e8a3bbde353b41a8bdd84438c0055f273f9c3d1974034601083ab7f6369c1e795a6dc0887dfad16f891d9a46d831500925731881ddb058f76dc7e2241d26731a348cb6a3e28e582592c35247000c01afc140584b2f839426bafdbc0c46e05796dc2d48698025b4d6c11aa706400db06768d9366ff8307428e45c40ada0dcfa3a6e487ae4c60801afc2bf161267bcd327c57860499020e9e4a3e963788c50f36fe50d058a87c34a00ed5e6556969293742ccbff40aae3605ae82ae600b5c53b5252573ffaa641a4d62a315c8ea02a49863d8afff288bb800cba9fff792d5df716285f03942b9c5b1df916651555ec34c15fb727136abc603213aeaf63a5b5aedb5953f526a3a49cebfff0813b8d172ad7d4e31e16ee9bcfe3652d82bf57b0afd075b8ebbee5f6f94e5f880ec7a27e08f802993d60b3695aee70fcf639a4d6a6177f9f0b0fee68f65965367c9e336f98ca4c97097385bcabd7c93d9ed9e1f0ad96c54cdb55a52e3549fe82ee69d4c88b51b0bb236f3fd5fdaef1bdbe007be280081183df237f8c044d3692df706b931cd647e4295c3e122849960e2efb50ca6183028a8ab48741be3f7f2aa60085dc3496069dd3f97dfcdbbdff9107a9c795b1cc34c4948e3423ca48f4d430fe4c39ad451972b16571b86875b2190264fddae84427aaf9c297c02e19ef2e505060193bfe0c94676ad3e262b31106a3150bcfcd24291afd9ba2274525e4aeb81a26843b7f1838f0a844b086f94053b6882f82a18eb3845cfbde27f2234f2a572bad7922f6893368744f05fedc2d65841bb9ca0f6f99cfbe0347ae8b2ddd97a2a4b508d82c929ca06c28b3f275ad8e1f99c85f79201803310bd863cd521cd701708231e17742ea24f30c10245b4b5254df8406edbb5d810351fdf84229e91c3872081d1824626c85890b781641d57f172e4149a2d0e001a23e4866b03e2640180fc2a695cfdcfb2db3c85ae63d68dc92c54797f06e18a437fd12bb08c598796061bc6f171bcff279808be54de43be1bb585ad3c6a67e681ad919390df075cef1918e87cf348578b29562a674eda21bbb362856dbfa7f6256301a862237ffdbacde0d95a3ae33673a6de215e4f8915e49de02fdf88f6155469a2728cf9957586074550cf002ced50d6e4a189ec1aea447096bd0563d7845c005151f2b466fd949c44eb90302724b99c6759670775ba7cdd3ec15e1f8217a692535b42151ffd0538246ad11baa9eb65ecc97b52fe1b862ccb07070dfb2767aacce74070cdc38c97edd58026bab6601e58164c73fd37e5f6a5002645a2dfb0851a5ad6728a50c4678ccd7409d26621b64215f5aa38641449009101bb1b7adb96bec496e1f8fa510e853b442844964473c3ef1514e84c1521739c9fa67c0d384b2d7fd1457fd02d56606f58079de2e6c57cb6fe23148f656e5fb0daca51387d17452f10424ce8f5b6a6e4e25076d80b837db50220f67738312eaec9bc77be471874af78423f6c64b284ba3e172f21d2161426b0e5b1e38ea244718d2e048b5c181410535e7a2a8b4010fc92a9fd2203506cac73c8a1b7792020d7205cb3ad08c116ae64ed11e1fc95884a91ec7af580e90d22de45703d5e5f9dd794566dcc136abea204497eb77f8a0b84aa6dcc3d380236a0fc9a0281d222639d0c5f2412feaef7ae49417330629a6a5438333ae3270d56d5144cdaee3037b246f6d919bbbb66862d4fae151cbb84a0820daa6a07d11965c0a568ec6fb4de53ac11c88b99a8a4404242a10484a12f63843160d7904f3836367ccc583e4d1a92acd5b3412846eb3c0910221365b6e1a88390206e59661e18f5edbaeb820f4e4b95c684d42f418d37adb6504eaae98961f77520fca10bf2598fd69ae1c82d0e735eaecc24f33464a95638d751d4711ce36d3787f6ae925e7e3cae7c268c6e434bfe48b222403059682b92f79f36d83360abf6039516d2055c7a15a993e084e255955a05f83185ee295e92281639a63c9a9fbb7c0dccf732a34ee78ec9d24000c7dd0f5ab1a02d79c324195443468f54755547c2493c232a8357976d3f0cc4af4fadd69282b2c6fb5aad67d9920e09424bbc66c5efde181e80cbfd27394eb3a88db93aead9b5c4a89b03d4be124e78546ac4809776f09441721580516c99cff3f7bac84f0e8bead3ff0363869a291d56fd71fdb10231340ccefc15842620d826ec805e62e8d6a5fc977175cabb78fb60a74ddd27f595b3627d77e4687da60b4ad0e342cd70984bbaf1d50547788627b9e6f6b8596818cdf20a2df70a177b8106bb30d136bf16ea4059cbf6473a687bf41421ef292b4e643526a426c0bc984ee6407c57fa58abfa46757821f08a5e9e09e081336ef99d9d69662bc26e54c2082cc21e1672f2924e412a0e3d6b733c1d3e4e70d7a40e46b72a7f284497a330c002478cae2a2ed27a2e2b2d04263c061cb280b7a78737f521429fe408be040775097e3493eb2e106d14ccbde8da700d0d85ea9138e39a0af42773264a403c2cfbf7b09318446adc83b03b616935956ca1c6bd5e7044ed07102eb29ca27022deff239ca518480477ce40b65c55417443a263c1d15d293f5d1b3edc1229c92389fc71b3a48db4a869e8364e03d1eb7c354470cf005c642cbed53491ac322c670fdce1f497da8211a06d4a1c82d9a863910f8011a951800d4664c7c279f497ebb572ae75709dd14df06c43b2a548034c92626ec5772182cf4c80d60816446a9d0814cd7973cb50e486c07f98b281491001135a00d021b5faf5742888daa9aeccfc6af9933f5e8838277ad53228e11c593018c3b08c5443902a87a62c02320c94504d6420d51f27366e456fed3fe947bbd46bb72f826db9b33dd873046546905e6ea66a6ce2da9a00fc25510faf2fa6fae4892ab985f83cd0a46add4547de02c4c6632b4fa7ee597f45b58502ceff68f0d7cce04a5d7936f7b3fbc6ad13428d60de3c41d51861f145beb3d7a8156ffa718959115388c5bc8e93bab6847cc6ad346328c1a9097ecf8db6aec8f78a5ec190cb5cde3c11fd7e06aaa9d7a16adc686ab62c211e288eed8949890922602fab0753ccf90f3ba2ca93a59ac9400e2d66d5676c284d798fe796a30b6e0fc3bb6f55acca958c78a2dd5801c65e26f881d22719cd347bcf509fdc138031c8a8a2c54f1a45823934505878c6f659a2f5cbd31665729b9ef03206448679dcdcb7d9fdecb24a840299fd1dc13f6ae6aea20c2d17c7ae3044192b1462a1ea062f09b81cec2344835a495654bf3216854655df87c2ff3e71f9b8b2986b06d4761f17ccc20bc6f851bf31a8b031440fa10526601c8da84eac80af1a839caec0941fdecf24c42bd0c1cc726abfcab42e58380e844c3554a1bfc5892dbf3efada3304d4502e828e65fbd0fe9cf6f7b3a66065420bc5166593a664adc72ab0cead1eead7a1e03b4d266ae6d62926ec06427173c3593c081980a566401ef092ef8f7019c3f4dc1b077b082b15c2f18a704782d5415560ade48a62c2fdd51b0314516b0152794feec6f6fda89b963a19da63a637c9d567baade7a23cc3dbd04ef04c8d71ab7238cc5c172978b948b05ecbdc74a57b9818cd9bf29ac0187e009dd0dbbc8d5a85653fab37fdf515931d4b97d4f3d1b1260569871825e08c612e2763942141ba4cbb5f40f6e9f30900035129028a7777f9ff8266bc0b57f00b5a31936fe1d0238833cacf169f0a7ee99a0e4aa8506a234ddc5003ad1ea89bd1ef6edcc544416ffcbc81c3a72e3901242b290d3f8bd58edeb293326cc5f866e887bb17a22deabec2e3a2eaa74c4285728488746ef4fa3efc87b4c7ee5d640f5f407ba896a1a41d72491bbffb5f3d0bde2fafd9d2c2801648f5c616161b444e971890e44b160b134578189bd0855cb3849f1391b2e23a22918994ea5302cd30e9d9c58c203f7d78796b26cf911e577d236476b36f9819522a83cb33ef40cfabd103f4b8852fc525e179032fe60e853b01005258dc240459731c96fb94c4b4e6a40ac95284cd0801ab03160e1aecda3fb744bc23e20575de3efbbc831b374ab77411f089f698950c41bb18d499d10038da82c30e27f6e9155c8f4f2cf073dc9829fa4b6f7c91371d052fbf7ad7af899bd9e011f8c195cc7888d0456cd102225fa7a84ccf7a61af256a3fff23caf49584b852f38d43be7df1437b788590dbab6b7215940c1bc3285fe9ea250dc92f113843c37c29848a6d808b170368bbdd30ac805c5c139cdbe2cc566e58a69941816bc85c399248a29567ff816055a7b079188866b876eb82087898043968662172dfc8fc2d927c0c341dd4f1d556a427efa3f9beff0c409e3d8dc059e1571e408e5d8faba91be22e7f03977a2e145f79730f207611c1ce7535ee1c12b6985cbceabbb6160ffc0fce719e6597cab9a06ae41d1060a606ef513996ef18d574909f0573e1829c658e55f4108357097d1150439ee503ec7e9ffb7e9f6a351ac3ff90d2fd405977e0611ce706753c44bfcc0806bda7a0927772d068a3f47d6a7b45f49c54cf019f2f0d2b7b0d4954eef1be400690b1727f5709c5a674233715bb07a821703b232bd40735b0278080462405e6157b09b223f200bd12f29baa961e860d511b4a6f1558876d6bf1d640c5f09adeca19f25d74043e51d5dbe8fc3c432f5152438bea59997234bf1f4b2ef634c61b8b46f915487f375a0a4328f5fdd3c784003a715d7e8957c0b7c20528b4bdf08e806eba51202d47d5fc893c89c018d076f55383148ce936804610485b772db88b9c117185bbede264dc95fdb0f424610762c748657e9eba5d0aa5144d0cf790d9bb8f3fde03f1c15768e0469057d05f9d183529f1d40175f3f7bc2e4cbb934c123ae4934995a3447884cd28fb62079809df3ad5e41319ad8939f7ef3131520f2fc26a79b394d42dfa9cbce4ac758300e30a88103c284fa71f0683580ee9df05459364827f66d88619a58f59cca59355b9884a07ae6a3a08c9695b8bd52cd447d0bf0c11d10e698b565fee08199f5830991efafebed4b3684f382cdc2e673638be9b41b5d31934d9531cf4de62eb5d81571b5e15ea0136e078395d9ff207bd785cad54fcad54e1110a3b6f1e10f3b158f897f2632e136b4451e6271602b8d7b40fe12159b4b11abd89f727a1543d1587aa7af822e82e79b451bfa2cc3d58c2b29f984b1480a1b5ea2f37b9cd16131a589cd7f734320c0ccbcee23ebca7a7545f88615eb5a5f1c2a16ecd93ab69903c7d5e419d16a6c6040b1687df645df4914e03f08a64611d2198c6d213c5553e9911776ebc183605b86fcccbba06810ecdc7312893716358c733ad3d8c29a52bced5f9c7b84d17efe610776d49dc7f93ae05f3997235f7f8e8199a86ed5e4d83bb3114baa9f5f5ef775d36a96b8774c6c47c73f02ee9a3a8175951daf2982aacbe520a382ce976a25d35b987a8c13b23aede55cbf039571f96abc797c99ba4098d0db4f16b3bf16df256652116088ece3eb3d370b15e3ecdcaa7a233f843ede2b678b43ac646997f588c3fd0ee05a6311be3b56fc40265be22b9907f50180c48a9b4ae425c20031ac90774babe30443b95e54ee8d0ecd1966cd3296eba0513ae38d95e0eb7901abdbffd050c4f39a5e040d0982d4726a344dc163f6d52668d5239e48e5563703de72c59873bedce5a452f3898bca27041b4c5091f1bcfea65622cf70f978b0d7068d2005cbbabefce420d96c388074d905c986cf04a638a71c9e1d5ca550aadf852470dedca8b0700d07e70384e472f9e3b022c1250d02b62883c453ca15f1135f99dc4a9b59a313f7bcff14229f4de222263f6f6f75d945768ebce7f7700d5b9fd7974d54c0e129b9d55ac4710418450d468d2064486d4b29eb151b452ab2d0307ed427dc512fa68e8bf2fb425dd4beefb1b6ad0263137c8a0285964d69d429b1f2903648826be0bbe09fd0c1e6a277b384a4aa805cb2c202895c0d96b91969fca69710781d29dbae9052c1172e8e26f88bc4a8460186306dbaafda0f6dda11a1bfa2dee8d24bb13d30ca9d03c1762c9b32b7c40ea898d41223bb43a7fc083c499571a579b9aa97c0948e299322323c9d605e4eefd44f07f5d65eb889a5bb6fc742df62c6334d56a5de6c8b2c67d7fd2b699b1a444b51080bab93f6814d755985a57094412bc6a545cd8683b119177941d161bba84ee3bf3326c2a42beecd8669dd2126533673e098deab96394eca6b8f984c45cc6ba3515f26d9cce6ef1c2490056dd4083ab68341d790048ad1c97102b985dacbc95195f1ebc93bd388bbcff4408b6696f51064cbe9e82a23332dbf8eb9c4a27aee4ec724d87a25545fe877f5504a0237dbd9298aec721241e6d486d228c4690822622bb39d95dc934b4cb6f4de05eb00b9d2088d82aea561c8ee0479c6dab7ea953c7fa9a9a190a04a2ee7b3bc8b41e232092ab21a39b67d5e2ddac59001cb196085f6005deeb7074938d48f40d3bafaef8eff2a46be875bd89e820eeb0eb25dc5459029ca15fad641002c967bde0afd5202686c50423bd239f98194ba69a1de34ae9eab042566cdef38f8be8058685a8b2c3457e6b15672c4b90c537615d4f27817aae374e5c245dbb6de6bbc6e61b03bfbabf30ac6a0236c4b76739d1ea709e2a62b2883ddc26aa7b0797e0dc026b96f8d4e14892dec95de27a0edb93239d18ab4ee7100e028a503a97fc0228df24148c827a8beee9708338d4635e746310981d8f2f563f82c92a9e208d42b0c77d4cdea8b31cb1091f533fd224979db31bc186e566d4f1847b44d6d42263ef4bfcf91737c0c3f54ee5dcc6aa456548b5f39b817120013b9dedf08a588a00a3d6320317e8685d54866fa6f63e2e73c6aa46b4ed45c79e3e9da9c5bb789987357f0dc62e8686e62852be734888ecff0be60fd2956b1c45a6c633196d8c656ac6289cd58c5526cb18ca5d8c52eb6b18bad5862195bb18a8dfffdaffd53ddfefcf77f41fbf15d8b57f311b78e48ccd40cf62a3754a136f9e06a37b45db9eabf08d7e624f46f983c0240aaccd36c318285ea2c3dd1c2518d9b1cfe447cb9c7cadd18ac47a1b21e9cf7b424f6e6a5db6d89aa67953348a3352367f32f60eaecad1451860a85e05985730c3b3c260f1e6cde05a3e38e50a76d5569529c1ba035de710f5068ee9c89f65e0d8d0612a7bf7afd907fe2f8e7edf16197dfa35e26b32e896bbb435580e438be3b0d598abd15366c175dd9cffc62124822bde21592a9a663fa96395143c8ade2edb8954489134bcc081f0fa196354829eae48969ef639191528c6a41d0ebb80744ad306aab507d2e3dd3b5cc111b42ee6b6f458d248ab85862b65a1f00b59480570d83a276d7cc412ff96aa3d0b5926fde0476736dd1454ec6cb4aabb4516d0b6be6a4fe0fa8bf9e0de580c902fbc47d96f4cabbb90f9ce45a0b9fd374c09ab58d42637e2f1d0f1bc061c85b6f7d7d307bd36a19075015dc32601f0d45dc2e1b8a0111c16f8dd57dddc6119aebd39be42b30d09311a4e52d7e5acbef475e1e40b4bc27c2c0c4b2535ca40e41951f373660c011893fc8299920e45c5faf0879a0b78b7c195600e548a98a810aa416237088a1c1b2754597961b97f9acddf1ea6f35d13fffff7303b6ce2b7c6a55623383c6807202bd5335e465862ade10b67238a28d8b4f0af112388c85c40f90319b71e7ce76e2d4e027c3afc455512817c992329a45402a95941e0742f4b1197a6767607f5fc30c368cca1f57685597fac89ff345818d6bff33f70b3ffb7b5e71eafe7a9b127cf7fe8fb820c46ccf44b999897e4383adb7ac0117890ead20416f623163ca1ade2d481266306e6b4830b9e6f7376a14f74199f578eb4e327b8c3fa478be46f97383baca4645fb80b9e382cf29df570037c747ca6f0e0a02d711f31db0ace08d359bad41c5bcdd7b36af24c27123deb7afcc9c716b97b119cc1ac084efd428b0c1571352b088632c64eb2a4d0956d8f178f97054415132c7c62eccb7a961258d584d5451ff31698a8bd551c3cb9eea95afb0c77f582a803bbbce581b42fa8429482e821c17778aa29757a82adf64ff579e4a758e928d81a20f68c8c19515290c73f440fc263895a090ba2c0ca24aee182f05e52641d39a40132c8cf09a3527cb817aabcbf88d506078d98cbc96eb82f411adebcaf81f271d52f7b6f542529e453b76819ef0f8c80e0940e0802b3e861d28dd39656e8bee68ce5d8c82676ebb8cb8c1e4b29e1a43ec5ed80cda90f53f838ca3e98d167c686e17225090fee818f4eb9731137af1e9ef789710845d68a24487049c94611f0c3af72dc16280cd24fcd5dbde0268ea2d4d0e4c10a5f3662cbb05a13085285c308279207caeea59b4d6fd5fee98c3e74d1cde4e416c32994b628095f088f0a2aabb2498b065c53d9bbed54db13d2887b9c306efcb996243d19d50d7d2fc7f896774d15154fee0e7adb1158fe260292f60194fa88410e0dad7963621f22b13bfd076778724101962246e9095c1b13a9b9de51f011714b66194473ede2e5c1f8f975981db21285fd6912a665dfa7b727d515550fd0f019058b0b4200ace7b2c0f0ae225d722058967fb4110a0661c63bd71f0bbf1374b8b4b100532d0e1166f2d4f33dea00556754ad71f6a0ce4baf4c901a14e174cf002e99c1ba364d5a7e5ac5c5eee23f6e657a979e4510f1c8158fc806e8a99e53e37cc9d7592bff835869d389a268ed98f9aeaae19e5b57a78b5c0db7867152df3f84363834b0a1def7f30a1cf1f2abc11a2425a8d0f14acc08bf794ff74c9fbdf4be7be2e38c8636254d929d910050cd546f05f767aa1d5883b504b4082dd3414d9f694c992d381bf643bae02733e3725471ed4656c775abd2cc76b1e24d92d1900f0a16316b401a110d0f438fb786ee071f9cf0db523f3124a3bcf834b02a4d29d51085f36deb854e63f5aa93a112383ce0387a81641039a58a810b91db338123b82f430e572bf2b1e89f4b2c4b1b6494329d24b28027e38e612cc79b6e81dc42de0b3763ebb801c3accf8c88ab7a96e9e858b5aecaff6ad8611a416a06c1bfda61b6ef5b7589515476a17433304942a2a37ebd0b284602598bb2633bf8d303c06fceb2fb0b8585a03bc7b88628462c1619cc326b170dcc76dfb347c28833ec329c5401bca53f99578e6e115418319f2f689013998dd9a4ea78f752193cd0b4cdb26a1b4eab14b45b517f2498ad83fa184d4cfbf1ed18b372139233b07b821e4d1eeb3d202e9bfde177ca63e1683dabb27263dd58fa79b69abef3c8c13484378410d10966bc5b98c98cfccac6b948a6150bb749fe3cda2ea40255cf207dd020af7f8fbe16f1a05cc5a89e50a000df584a9a610c214b35cac52dff972104821306e62bc4172c2d56c21112dac4ff55efc525ea140f27c12381af7f134b2005803f428b0c32bba55f39e6d6ccf055242fa5632379bf47eaf5b075c5e57784e1fbd3fd7d898d551ac220cb85d4d8d3b48d612757b6b2346a5a7216e25a46e14019ca01e37238e3a31459b271502153a9416cbe387fd8826a4adfbd738dd3c2c356a2947656325df3a349f984ed20c72a4340d44b66a57a2b20d93c3320472f9a45431e921098a958a288e4e04016d10dcf6dcd8582040bbce8d87a757569b061d54f7ff6131ab81e15599f8a23471f09fbabd67c42e9ece680c41b59971619eab318f06ac67e6f091b62c897dfb934f550d080b71ac3c89b84e137739b9fc388942f7ed39732de7c0a47ba9e3cc6dd418191a3f79aa890433fa4d070ab4bfd4d5bd1b49b1c6ce63a6e850e0e8fd62238173b03416b439e05b1711d35e7a3b31449921b023ee833702378470e362e01b71ffb5c2d47829360640458c08cd49e1389476b7326dfe84cd78db427727b76e7f3fbdc7282e0f6cea615cff136f98921f49fd43157f07c2cb4e182fed0c4e4b554f47e5d10ef43430d18726f767114e5ab3569efb1fe9374e165d2978b9a01427f0247d293253dfefcd9384de45c9bc4e6ea568cc9c5cd358c7234fea4a96de607cd393b87912b66c42540eb0f93126b042c0fbf62fc08d6b3079e9c4bcb74874a0783f68c6114bad9cab60761564c3b3545c5ab91f704370237463f006506edc01bb49fe9968bafeed45110f33bb4b23286e8f9cba60fa95ed6d0ba1a9236d433b3c3154a167bd38b36be82a10ed1168a71fcf2771696b91776ec2319a095a3a96e5e40950e34b49abb55bba76fd5957e3570270e97166d76de329b005ce41247a5d7091878a25900c06306f2e033425c35c03ef96fc52b68d28cb84f66976d2553bce7110f0b114f6b1d2aad7f4c4c3efb15e91207f92c4bd434ceee8d87bc846c48b77ad4b5a462e984bbc408c586c28ea437287376929a1efa51ce7d3d6c743f1a15529e8b7da9448e4d5819358892700cde802517bafc064917723f13ad291b39f3de0dd47dba4034e12dd170c2c1114b7097ed2b7ef2368d4d336f7aa4aeb9ae3f0f03ad1b812484a871dcbb27b534e5960e8f953c9ef78f00ade1ce0476d1972f53b13b76016a6980029fdacd5ec4a66542ae4ac57456ed7751e6e5083d2a8dc851039e2a461e3752c78cad50ae335932c70cd6127d9f03e5d926a9bb73437c29ad7b16eecb4b0ef4b101c19775ce6a858f06964d51c026c3924b9715fc53e41cdd7992f9373d30dc437ca1e0a0789412c579bb4fb5607e4e7bf6912f75f59fd5102aeb626dc0bf3f005cc7eec71e728c7de93b4b459c242e1b8e9285852a8162f69304fbe91837867e8434eb7bea66b7a89e6ce39ba03f9ab700a89ac100e95b11630485652f4be58efd7df8e820fc04bcb2dc259f872d7fa58ab2c30371e99471442ec303b3f1ee74bdd2cfe996f28b5697fef2ef77b86ba230b0c424becf4cd155055603736bea845336ca73e38d27881e3ca2c3133c9a6fc5c41d3d10fc7e275c708a59ee5a565fc2600d8648724bd33b969e8a053ac7117fbfd295128d0ae4b4b15f6e203499930feb9b572b37c926abef594e66ea80c41120639f090af4da637d210267a40f0eb63e28d21a1a9b395f5d5f8d140b5764fcfd007304f20d655fb7f64040c2b3704f0177e91d22ee060c6d9601b0ad6ab0a8f7e54df95ca07e55cad2bc07a55b924f87413887672bc1b198c2060151e5ef2bcb9a830e47f0bbadaa1e40ac3884be6eaafe3b8af24c7e96b90b98810c242433b5ee17b6b85f9e3ac62af78de77575f2ee4bdd0a4d26e56901db84952ac3c1011d2ec0ece2ab73265e46b4e0c5edc1f7a0497957134336e6736ec6ab424971a15c9c93189f94ba7be568d8cfda8112a5505538364fba101278e7b034c03369550f7d0cb9e45113cf9566ecb3fde71223f38255bfdf641b62f36750b1adf054e985e6591b0f8c162210e241456ac23c8894fccc43dddcf2ccf6909642cdfda3663beab060cd3ca351a536e783d5a2433f66527c0d8c479a06c4516caf2396660d1d1ec4fdabe5afc6c6ba72f0bfdbedbb76ecef25e96c4ea2309ab7a834b1a477c3bf71ef15b4951e122db1dc4e675dd0392f3d724a239a39d039d5a382c8cadc92c7445aff78f8b67b889b755d8b179157d4df078e41b769c47190ad4db82fafb171c109ed71cbcdef48dc6994fffb8d3239f03f4440234d0035a07e39d5b30561d710e69a0fd5a4fe380229cc0977768965e18852881eff4a000dbabe43ed8e5fa30ca403691c27d3082ffad6ae7bd92a3f9740de623c7e903a915155485f4172fd1de7a18a08f9bb16fffdbcfda77e993d0d2922da59449ca900aba098509369bcd368e2d961071884389b2b269e2c771400234445484080f0a45a6522ad56a457b924ce95a45a2521959ad860005d1fe8e18fb8454467425b4da84955b10908f102150b75464c88d112f802455aa95ae957ec56209f1afe4bbbd23f9200e9188994a133e4384040d7184109428f8a708cd49d779df078261a83dd13d5d13752dbca1d6b5590e47ba16532a954a25140a85e281daa13aa16837cc3412a96432b59c74edff8442919e58fa92ae89ba860aad2667aa18d24875025b30d82c8634529daa378ba9411ad1a0b972ce61d775b318d2c80b3b4d7beffb401004c330d45acf62682f8e46e3389248a55289b424e99592356ad4a8417bd3e98442a1c8542a45f2f0f0f0f0f0dcb8c1c383e3c5eb7baa12217cd624052c961d1e6270cc38120017b0175290518fa017560831c411423ffc0060082bd5cdfed83835861620b6d8ac879be9430568c860d80193830e128fe746a9643a9d50a877adaa1093e984423d49ce4a93ae8d2f2e249952a95eab55e9224b2c564bd76a904bd74aef027abd60309f9f9fd2c6e7e75d2bb717675d6bf9ec8dcfc2327ef9e2e234fc63b9f3e232a3060d9144228de3972f2ea4902c85a4c9743aa1308a2453a971fcb2468d1a35be30d456d35e1c8d46e3cececece38eae8e8e8e8e8e8e8e8e8e8e8340902f48a312a67b60afcd0c4edc74f9092204260fa28c120793c0cd1d19283c5adc78605478c0eeb53d4b47654ec9801abd1a2070d1e590e60ec756dfc374ddacb55b2788cf1a2b96c25cc715de78d5efd3e10a4bd5cdf799fae8dff8561a8add65ea9a6d162c48811c3478f9d9d9d1d1eccb3338eb8495dc2c8ea35fb09d29143089a128b0b0e529123416e85454b0a54000493c5e879b1b1669830746ec468c4ecf0782e5da3bdeba56b28182ca66bb48ffd934662252023b0d66853d616d9cf5dbd4bbc4750b4590c2ef2628d48828c4ca149d022588bc57c7109758df6a10eb528eada0c357ab17cca250bf8181a490b5d890721c410479486b45a86407f7ccad5b3984558318060361c6c66bc784ca6130a4592295d6bf9d47d213e3e3647ec2d1224fefcc0708831a96be593b194aebd4ad764af2a7f1563e95acbb35ab6d5f24a5b2d4fbc3f968ae09f170c09901157cb87b512853cec65b3d96c369bcd66b3d96c3756b2bc982d4248a248092b41acd50f12232f73c1e1486988e7744291642aa552adec6ae595ae5648622e1b14ca88a952ad740df62b9627e220244882ca179298cb46bca531fff80809f548879dfec46ee323402c7305a30931c411422e4fc29fb8d91f5e64a4f5414362a805984cf84fba5642a14812a774adf5a9abb22a9557aa527922f9a3909185a40aa1b956370624a260364738b2092b3f5a4e13f24250a278125ee44a5881d9945e2312d70f50a9643a9d502852d7723cc922e589fea69a0b195a9d5ae9d8d1e3038542a150281a8d86a2d160baf67a584cd758af6b29fecbb2ac7953d7666fb278621502d3355a2bb65ab578bceb9a8a776b752df6f6de0b335d2e988f520bd305c3489121438ce89015c9c1a2055596a6aebd7a9e85a545a66bff321a9792a96be2832c61d5e2bf30c6586cd8a26be2bb84578bdfc35b965998f50dc74cc868bec060e6f83e8c5e60e39364356529ab297900b55a4027242d569e0e1815058ad5bba06bb114ba5657f0296254e81acbab589d1e000058e189e3bb9022aca50b005684174511305c588459c3f4a0b977765f60c18ed9fd17c6159e8e971ad37c0980113e6acc9e2324c9a3a5857c1e2de457c008cbf57ab15404915caf143ce028a14a65bd28195d5bbdcccc0b5debf9172e18306874ad7c9a1a5b53e395d6d4c8e81af994d6eaae6be3bbb5bad67a0bc38505c991a07aa4452ca8e5c95558cb4aa36bb4a7a9d13554ca448b11c3c91d3a7cf488751c51344ceed0e1a3c7c58a01da779ef77dba86fffbc2300c533695f24a539de824b943878f1e71dcd9d9d9d9d161a869af457134d235fca351d7683f9248249665b1bc5256273a49eed0510a499af625d2643a85275dc37f2251ba467b14499224f9b2af9757faea4427c954486adaa754a16ab5d235fc2b96aed19ed56ab59c245ba14bd3be0573e91aeac1d84bd7f0bf60652ce624f9e3a74c376e504ca3a168281acdbbbc0a3a891fe732234a0f1d2a4b3031dbf1820e2f0c015d21c4103e3bc2672e042588911e802451a4849527644a7bbbc0cbb533040f56e8c70bd80d341610236605b612461130b21a2c5841e325071f2e6020f2834f0658a4a0142ef0d4e81aed6b62e81aed63a81e06187c2463663b789c3c2f955034ac22c798198d1a30ece09183a3c293a63d8a2453614ad7f0a752a14ad768af5aad56a52d4bafb41c4732665662852b4d7b56abe572e91a7ed7eb5561305827fa8f64cc0c0618608081f631f2bf2c4bd23449161616f2c5bebc78a52f9de82339923468d0a0d103ed652d2dba867ad02574d135fc2e23ed5fc6d96c446151a0f04a5174a293e3f8128e65dd22499215488c1816a817e0e1b9e1b41b4eab4c9c87a7f4e3c5908fd1e34263ab4b5426583c080fc1103e907abcb0228922259eb037fbc312b145ac111ba4732aed103a329043070f9f01519508d102c4476ca787db0c93c6a8023560d87173006a81c4bb81b241b980c206470c0beb0504c41ad1ca1750cd8c6cc556ab160f1f97d86a07cd0bcc74b9603e5a98ae1e24183f3a84783c0c69c9c1e288add50685c205161c312410eb558e6835b3552b36c38587cfcb0e9a9d1f17cca4d1c2078c1ea41ab79e870952811f5e7512b224071b1b940b2840161616f0b6d89616afb4a5139df50202628d68e50ba86646b662ab558b878f4b6cb583e6458810214284542142901829f260fd6109495948822d362d360fba84644896147c09c917142f2139b3f91b27713c0813923021c9f2375efd69ac1710d08856be806a664f83c64f908a07c3d006e502398e248e27e95acc93487fbac97bef55f1477e682968658a183162c4700145b94447e706be8143493d00b471c45a7f626d220426485999a0566e3f7cf613a42404311e2aa24c392561fa80d18344c41619528447470b8b1c52d0535615d45a44959284cfea508c1435b6d60c971d3b345a946a18918939461c3a3784368a060484f2817ba068403132987fcbc686a6f517860b4bac050e529167d1e2736b0542d17af8c0b018196964c8cae69a955e2f650c56cba4195960b8f8a886c70e1d397c3a0ffc803e1044813e1e0c71d823a401c5c83ad1c9212b234686cc4aae959197f245d61b376ad083201886a1aea17ca0c43ad235d98f604e2229f5902449f63c59da6dcbb61ee59205bc0ff79d1ddfd971dfd9f19d1d14cd69a34f245d098fd283d8517a088c1cf12a9108c1a645c302c3e50707a948d08d1645582b545356262a2cc86f436c2e7f8931c31c7562228b1818342d5ac0d0411ac1a0699103478dcf8b65968a1c295d36fe23fe8dbd58eed6deab6b18639cc39ccd52e91a6f6eb6aec1d0411ac16891e363d0351c1f43edeb8d891845c3a3592aeb0c1ce29c69cf755d576badf5d65ac7711c59c4e8e8e8e8e8e8e8e8d0747494f83451adf8ed87ff04cd8670c44811f3e6d282e467085bc48c20a88a10d41542402d18a41c4ea56413573766613c3636b418316080e1e6c6e7e7c7577eefbdb5ea1a0d15b3f7ea1a0d63f26180a1c4f15bd758fcc6d1b596c719bd00748de60510838d2106af3486184c1909868bec6f4d8b97a0d5583262039491a068b0183e32249b362107aa8201d5873eb14feac4f677ea84ed536e28da5e89d411100bdba77daa927cbdf72a61041bdc1489224535a0538e588c31f6809c5822882a2528c1ed08911220c8d6fbf138175fe7d9eb7eb0d96f66a0423178266beac49c21121b5802576bad496bf8b141a58a119614e140131dec8033655022efa80ccf9f5983cf7e5071d9bc89e17a8c8b0686a0811324424d0002c7bff31fa5b0fd4f2aff771fb0b0fd53b84c18a3daf4890f43d8e1a64f7cd0c13e63beaa770052c71d0f22b68a0fb618638cb13b768c31c6d81d3bc6eed6b1c518638cab63c7f83a768c31c6d831c6d85ac716638c31c68e31c618e3305b6b33768cdd3c6d9410e088b69b3ad41eae96a40052d9e95274cb6a4723d895ed573030e233c56434e5de6b8ea660a2f11c35d9dec467fed72cc240fd6a8ea3281cd10046443122a3a1d1900cae1d1bc5886c277bc865a28ca6d4d114aac2ad0bc69190cb9ca326234a435d8a3000d2b7f65e0ddc6bafb5d65a6b6db5d6560bbafbb5b6bbeec3786f775dffaa93eae4ea303e724dd96cf6ae77c954d65a6badb51d47c41195600052d96912d9f8c16d65f4284db73137446758ecbf85bdb5e74966f5b1b73f5219d5a7feb435a2137405a5c96f4f6ecac6e7f7c4c60f826fdaa858f9ba6261f0abca32895a59544ea12af0672da324b230b01bf954bfae9465cb3c7910710d8cab6f95366c15aa6b18597fe3e595ca52529c5c9636f593e9643a9d9ebae9cfdfa7d936fd39db27255138aea35cd775a4fd3abbfd728d5de7d1cef33c97909326a4a7de3ac74dfa5c8e9b95ff4a0c66b59229574b568fdf55be7e546ae244a8f4ad122bc9f8af2b2ea3cae5682b01fb010b4241fa59f185f1f5848d9bcf706d7dce39e7565ead5a7995ffc6e65a9e2df3f584cfb009fbe133fcbae233cc4a924b71b394af220b833f56fe2082a564b7cc92e5c4c2e08795ac261606ff972c26168695c4c2e0d71555f9aae233fcacf2d584070097e68b8acfb079dbf8cf17958ddfbcfdf018411e87f5f8cd202e533e7ef347f5e5e36f95af0f9f95443f7e16133bf38f9fd5c4cec41e3fcb899d813dd6e29faf2b3b56b21e56c6de2c619f4bbd5949f6ebcfd2958d5d0f869dd8fab25cc2facf1fcb0fcbff2acfcb646797799e76fe5649a98afcac72a5da1d558173aa3c452c6cfc647976a8f284fdd8f84f2410364aa93cad124a8cca9335b4f18be579b5f8c439db272bc9c67f92409cb689f37565e3ef48206c12fb149f184068762611eba3f6a032e904748cbbfc61fdcce960a41b2788237430428023da3ad83ff9cce6603c5ddb5c72ffec5c76e69a8e016b59d0b750401946df14090d684aef8cd5348066908b73ed9f3408dbfe0e31db9ab6d15e72ffeca1f5b66f4975cd366e6b5207024865df077e1f86dabcb16179d623b699fffb340ddf7b593f8f87bef1ebfc69ad31d65a9767ccce3e7e1e7e6d7a06f0c76058f5f75a3bb1e78beddfe8bfa7d7a33bf4bcb0e685a3696762480fcae0dfbd87a8ff8cc0a7c7e19fccd3f1c7616c7636c2d3c73c8732bbd09fea934980d0f43eb3d5c5d8991b521886efd5226a8df79fa9cfd367fd234fcbf0bd67eae03dfe2ed47fc391fa64a2bed3e7f0fb48ee2d2a3c654dc5dddd1d67d31bdfcb5a84fe52697f548e3cf12f68be9d11cd189279bdf00bbffb2f7b5cf8fdf975dee7cfd37f6367688cad469c315b7fde995f65dcefbc1f99670cf8d508ef39b31a5157e0d746d41a9a73588da835dabbef995e28e36af37b2e3469e0fefb1bef6e2ebd4ebeac9ffa8c98627be6e9bd6886e6bd7150eb97c15f7fcf0ebdf20cb7a74beab3d003cdf3f6d8088d30c2c9aeb7f3517b3e8be2c1bd97de5affdedb7d750fc711e4bc191be1e6b87ae2ba1f18739d97e33da76b9e876d675d2602a1bdb56a1bee4bdfda5b041d220252d9291669414aad52150e41ab65e8b62db4ddd3fcf84f4ba5b33055beac5dfd985acb8c6dcde50f226cf818fccece58dfdf013c1b4a99b26d12bbbea552697dcfb4543abaef8de386325158d6edf5da2b9e38c4221fb7c75a6e0a9728bc43184f8a67f23bcecfdd6bedb5f839734990c7c9358ee2e41c8c679773309e315b7606b98f1f8cc158adbd41762d3da6eb3ad90db2a93e80e35c251626d3603c3bee9e34f4126120223f8cfeff83cb67d5962a2746d5d9b32b47b46be9e76c3bade50d55e13118fd4fea1d115b04a432fb9456776b816a756befc5b8ba6c369bcd66b3d96c369bedb65842c42020940861e3430307244998d846ec34870e1e4028c1e106aa26a9b656bf97e56eefb5c1d8b51262edd5b5928b4280eebd38678eeb3a9b15c699e3bacef36c56b534c6ccc81b244992240f0fc9c343beb804190982b584b4c87e7cca95cbc26c9c4ac386cfa6d42025d1e6fe8b07e3cc715de779fe72d96c369bcd66b3d96c98765bac227088222589a21c3a2a0f25364742c3b689784b63d10d140d87055c6b2fc6ae9ccb97ae912d9ad16cc17061391254a4c891161f5484454b0ce3cc715de77926cbc7aac97271ce1cd7759de77d1f17763e7a8020582af9e8b1b3b3b3b3b3b3b3b3b3b3b38323870eba82c76af65222848e1c362d1a1697ba4465a236d12268e35498ccd5636399238c2337441634627678eec539af38ce65833127c4c7133f67aeeb3ceffbc0950dc7759ef77d20b8b27114ad868af142d67b3ee3388ee3582a8d331d5c9ba880223112234aab45f6b3b2c9a1a3aee0f162e9043929c1441cee2771ced3b5f1bd1f100c2add2316d35e63a9542a956ea954725ab964010f629bcd66cb369b67b37558837a091f21413f41ac5511488c380e31806c576ce2c64f10c6610138eb1af9c367e477ba86face836a0dbc2068bd82a027562a567091ac6b2e7c8e71bae67a8ee63b5d7bf9ce2f0b6663c3da91a28505b3d101c3a5d57af560d1e2316a7124c8081050500e23386258681c87a4d3b5eae3adbeefc5ea3aeffb40300c3b9717182d4030d4bad6f35ad4b5d58b235d2b7ff41ac191c51ce99af82321a3ae3949d74a4f2a0119b9e348d2b56ae44b362653cc656fe6b80f85225329956ab5727981d1a2da62cc7079d981d162341ac791542a955c5e4aa6d309852249329552a966cc9831c366b3d974747474747474747474747470e40062bd826a664d52a082d80c1e2f343b954a5da232416b1337fff113a48487214574882d2c6e3d36346c1fa3e5a26207ac46a9070d233cb2219dd3094592a9944ac5623a8b49c3348c693c761859cd5e65a55297a84cb4685c7e70908a04899f434785c5c8765c3d2fac19230c9d2337622c68f0a05229d56af5458ec45c956651367f692389542ae9daf82593c9743a9d6aadb5d65a4ba57b4b2c62489224491e1e928787bc41ea94a8d4252a13b4fa8f1f212e2d487e4c212851586a11ad18319bcfaa9c01d341a154ba46f3291244fe90234046ae8febf55324a8c512b2b2b9e2bb5e369bcd66b3052a9579eed8f785874b8f161fab97511a555d99678fca7461db27cb1305cc39db76547afb3588a95472d23b6954a39837d4547ccbb3ef5b1cdd585e3a134723f3e45187c4b71f8ae6c95d53078ed35cf8a1cee1b8a73b6c317221c7bdd6399c19765687eeefdb325761ecde7bad733adbbdae795ef737ae754e679ecc1a6584818de23242dbbee8c4cac83db60f9242af994e1707e3f9db76dbffdbf4090b7cb6bf537dc220f9b13c9d519ceebdbf717faa1fa499ebbc0f3c7b76564155787d3729f51995f9ec6925853ebba68c08f4517b3e164780325b6b752f6a42e6325df8a3c538ee1befbc4d49bf6ba514097869feb36ce1805e76f4fa7bebe2b206eea9c9833e67b66ee7326eb6ae79808a73bad9d1da955cb653c6f3778c9da16f676eac5721ecd609a11328b1a990098028da54e8043d6c9b6fdbfab0eb531bbae75e06e7bd0ddf7b2fc37baa6b3bd86c003fbf8cfce187660ff073a83fcbc826f82d19b74a65d70f6b15d0ac4416c6ecf1bde7850f8644c0245f13271e93cfa4da86960ddc7bef993dbae7cc967dee7b70284e4bc6f7de531caa6d08a0389f29c3336be8be2583470f8e0f1caa6b685953c614aa757874a659872c51c55376c5c165cb86fcf8f1d0ae9ff3672ab9e80ee1245809918d99e024bb16d919fcf552d9952bef140b63037eee39b3c7c5a1383519556ed1ae3cf2df3e9c6c5ac0c78a202071c3b9e5bf445470d1ae393f369b9c77a8c40f566d03fe6c9e77080115e70e5d220bd30d39e98a441af4e006446e55a80a591e48e901945b151272f259c98215a2dc70ec532243496aadb7c9ae6f89d8993b5422d28012379c4a71aad00db2ab1d222aa252855e39edcdde76b54ec0aa65b0db4d4a55dc5b9e54a80441d8f60eedf30aedfa6e85ba9a1ca84008a7680a511dcab74d597c783dd7c51e2efdbff5f1d7d70177d5a494721ccdb4a3b4a34f29a5945a4be9e590784225cab625edc106eb121fd8b6acd9a037c1876d4b181bb44b0861db12c5066f0fdb962e1bc425d8601edab64c6d9063e2085d28836dcbdf20ed382fd3af0947006b13b4409f3421836d4bfa6483f489136edb96b15db92d68e1b6ebf77875a09f2bfbec4a604545538c97de6b1d7b59ade5329ed54a6797d27bff6b356bbd17bb9dd18caddfca899f09c001d43d1a290796467a6fa330dcf5bdbf25c6f86baeb17fc1de85efa754b6aec2997aa3528674a1aa46ffe98aa570f1c246e8a450e8108d42b3aa119f7e0ba5493d7d1714b4267cfa2aa8cce9e9b3a035a6a7ff02a5293d7d4c6bea4f5d41696a2db1a9aeeccdf79a3c32c6713757562894d50adcd79f4ae3debf56b1f54aadb902a5b1ef4c0cd99c6981b0fdab942849d8fe2a236cff5511285dc10ac2fdcfb39f1debd7f1dc60b15ca08ba03611a168fd18635df2dc0d134130aca5ef7ab333dd77666d62529f552526ecc66efdab3cc7fdfad7ab3c3b9ebb5f5fabc0cc4a85e5fd67aecb3c282bab50eb1ff67ab9fc0bf6b207613218acf5fad8b75ebf322ff559eb5dfeea9cd7c71e8cb55ea797cbebf558e7bccc187ce61f33afcf5a3742b19618ec5f6cc95ead92aec9cc16634bf6fad6cb6c11e0fff5af370ba067187ab5fef52cafdd7a11e055d6c0d7d7075d6585f26ab56e77637fff9a27385485eebf5c0ffbd777a5eb49e62d731546d7ebff573ac7f5b007612fd7d3fdaf75edcd16a3eb5dae67e91c97c900f3faec65520d7bd7eb5d1f2b299dc14cea33d7b35eae56885f158acbb8fe05ea1ae8fa1bf7aecb6c11a0d562e91b5abae6b1ca555969405588382051e5c9240452ad45e14bd3f0f9f5bd0f7e5e16bade1de53bfad1e3bf2fea9cd16393455d3a677447e068e48dfea57346a60d7c5ffa011816c3a4aeb142ea32985a7a415c7e956571cba6a55fd4aeb7339e655c49b9d5e55c57f7c24da8aa5d1fa66bd57cc0b65f4b1b2a91db5c59a1388c3f8baed9bf2e83bd6f08871b63fcbd7d500806e397f1839ff19b740e7ed0bce2bbcec19884453cc26f750ed6d95efc259d733f9b6109fe059fa46b2038c232ecb7ac42da001d149789806a0b0de1cfdeee762a1c2222a0dad767d484e959f883eb6ecedd4fb38bf96fdce66df12916ea9ab5df9ff2eb71bca7d7601996b656986bea9c6e5bdff5fe48e7dcaff64d9d7347ba66ad66c9e675164d7159b74cd360936842100fdbbeac25ff4ad76ea557ccefb74d597a603ebc075b008800f498187c37bbbb7750c8dfe59c04103be3eb3246d6450d56f277392fd9d9f318da0319d90ad5d0849cf3931e92b033be1e83a5de75b72a37c40cc137dff080221a96c80e11141c29820980348107406801be37742cdf05f2bd297c565f50220349688009459001117e30028f9ba5b8e112a1c839e39c67f909b79d77f6cf5e7743510a235682c880107c60420a47888293a53c61c21362ccd90846bacf19c5f12c84b5a68903022a332754c10954f639a3f2e37852b98ab0c54d9f2061689fe357eb4beebd17e72f2d724901092b1be0c110309002cef5818f11b8bdc3122a1a68c2480f4131c0b93db89fc265ee08440c7a38b281162401089cfb2f5c86f260dfbf49c2f6f6fd19eecb70196a837d9ff82c61df6780cb605ab46ffcc6679b3ef1316297367de223c4ad02d2a732dfb5d65aebec854d7d17b556ea5efd07a4389da5303ef3c725c5012badd4134f1cdb86a3dbd774285e073cc5dbbfdc5b4eb5b9e7cc93fb6c826557524a29ad6faf59e9ef6ac6d4188ca78bedfe2f5cb850d1991b0ae3af87ec930a51228b0593e9e433bfd7f4b7b421dbda548e3e231fb427f7eca23ed1997bfad3ee52cda9a321d55aeb9818105495a62f9578a74ca6af6422ffea1cd3df07afe9e926ffd335d26c319a4853677aac734c17a7ea06cf09eccb999e3399678e7d9fce469f75cea5ee22e96f5c55b6de4477ea6e3b9a54c5c8f45e324f1fa6b25215a3cfba467acb954aefaea95c827f55e22825b003cfb877a82b5426cf4ff98308d3a8249fa7dba99baeb404f52bd4abf0a74a0a749bacd1190550190aa03335288cd72435e84cf50085f1231cc6033ba84138c27bf7af443e834fbbbba7e7fdbec7250e0be37f2a797ce65f8908dfbf3229fd2d4b6f2acf9e6dfa1b2e53f23fef735f32a938eb2e99e7fdd1877a00f7497f632f1856ecd78634cc9e38fea62e53c79a58d2adc7b36260fb94ed8ec4955d77996cdf6cb13602e8f4de4ade50530cd4ce802a00ed011da25162464f3f060d9511ff058c176cea8ab3c5ece5bd9775295a33ab2bfc4d9b3e4db1473b738385f1f1861f8c55463663b833a4b0498b48d4c96457fba445dce392bb01bfc90e00ff35c55817b5a68617d8c6265bae441a4762c6ba0c65fce9b29afd19e03230166aa05290b2fdc3b2fad0993f583a805261d32704fa472fcff0c177ed2f3e587e1f926c6705b090852d6cd24ba067934c098ca68dee870578d8239302abedbdf8a249e9ecfc5e9b9f69f3381353cae2a439a83a16c6fe356558189b851f543840ae8e9d01325a18fb173f90fb40a805422d8c9dc1e66861e85b53a5da66aec298f2e13d6e4123409a62bcd6da5bca36577eefd1139f6135bbc7b5e7cccf75657dfab9bcb9bcd5f260a4760620959df8b6731ea5cc461a259c510da55432b55a7bafd7a5b8efba94cc90fd52df79cf21718129df73a4ef1efcf085d13ff07b610c4df6ecc2111c6f38f7e630f999b8509222898cc8a6f98650f2bf7e6c09f3b7e89c96cde33312e7852555954478b5f14f95ca34690f94e6f230125f4977fa4c845bcbc4fa56c284c8724d9a34b14fb8b5e2b609ab842d421d7298fcf608368999948fa282628bd8d956bf2b75ce7b38da99daa40e5d69325ec157c03a3474495788fb71222076fe2286d8f9f1a8635df59c798e2a13ecdc79f7dd575a639974e3a8bc3f5cc6771e4db944f7bc42f705e775c1e90db1f3bfcef1ee2dbf65a25fa51a4f2f754ec3f7e02c9c75f7461dba1d2bd695489d506833a6ea908b14b70ecd3851765b64239e9609780aefcdc2e49fdd1b91798e9c79761d95cd6083481153ea134aa038959f2652ec950bc449d7fcde5c06a6338eabcfaf5387ecccca5cfda962fd39b64a2d935a9699f5009a44d9f9af949d1f659edd4d62e72f99f7f6e55785a52db9f2bc3727df895c2e52c8f22ba94a529c9689bb7ce68685392d1317fbb44cce173e8385c98f7acbe4de6ecc6067ee0f87c94f324f953653e6fde1526f1bedd47bf7169ae73de2649e578834cf0e6596cc8f04de3e30053eec95e25054d310be779df7c478eaa73b9b5d107d6fe2481c8961e86a857ffa93a94389645e5387afd4af4d17369c57de0dfe78c267b91cfd0f2244d3c8eabacfddddc3d27b554971f068bb14f7dcc7bdc7c46172378eaab7964993f1ed9fdde6522d9dd39927f71d0df6532605eafeccd3ddfb30c5bd529c534ae37527ebde7c961f9ca53e2c8cfe671ddad95edbd9b78db67defee7c8fd8f90a5d283b135998ae1b47f354a93ef37c2792cd6083481153ea134aa038959f2652ec950b044b68af6ce7442e63fffb1dae4ae7d8931bfff43eb333968985c94f0245d3bdaaf22b3b9f3121994c2c1326df9ffea069fcefc1aeac6527c4a75a86512783fed37b894496fa759421229719cd7ac52476ce43bd92aa4f7859afd42b1ec493e40761c254f93d57826fed06bd14f5522051e952a86099d4fc9649ce7f79a03395c2789fbbcfffab1589e4fde96d4fc978c6ecd3866cdf280ddd19fffde13275e7fcf4bc4eba4ffdd93d49e77466d7791e67b62870b7f7b6d1f6debd52d3e03df7208ad02bedfec0c7a972fc6efcc6cee4a9db336f178228c2eefef059fe50f563abbbfbd99867fe3bdcfca2ce7193027577a635bdb23e217265a3d8f4099128fb6a19c6373d984bd483a854d7710f7adddb46bbeb9e7c92a6e17bcea440dd29f3f41f7fd43490be336fec8d932d029c4acf537518df64f2d42a84cb7c9fbf5492c0cfa379e347a5a8cb330036dba9133b7f3c2f4e17fb3a8c7f5885cbfe9e9358a7b76231e35bc91300c48f8f3e0eb884fbafa438b4b44ac6b312551ed04a44ab10b6ad48b8dbda3fe9942b65e75b56a22ae50aa367fa77235732c061569ea9e333fba44a64b3691f9705f0192572a24d59eebd40beb7dfdbef2df7cebd73efb79d2b2dad92d0a710055a4369ec675bc53a31ba14280d05fcb385c1ce6faf8c9688ed0668dfd339f63fee7d0a74742ca87aa0af9d65a8bb56f72ab6caa5b2f39f96c8ceef55f267af82daa87a5e2add3eb1d0ce7f4bb762ad30e2b73557b967aeb2f3e94976fe3327e1c09c3d0f2cb7af70e7b8efc107b9f2f3429b5d41f3e386fc2ee9de3bd356613c6d959df3955a85fbd33ab1abb80c67664d03f75ec565f25b2bf60aa5c9f1e74cce926e3608a52afcb9db0583409fb8369c3ef14000698a5b7fa89c58822261f440c491f875e1030143101cf5030975288ef48fa3d723f307150e10110811dc8f5efcd1eb3f3f53296e8bce14369bfee8c5b2b330f875893f8c79efb9c725e54821f72f8cb8f3bc0e73dce3e7e8131228d9987bd7350e575dcb165bbbc24fa9b7f1578aef6fcae283ebc9ce21c107305224800c6da7f6b501dcfa637c73ec3bdeb5744fe124a8d57b9ebaeb5b21c6fb76a62a57e689b767118cdd7fdd0e5de6ac94863bc1e77400294da53ec3949edeaefb9ad73671f13ecb18e37f407d3097b65a6bad6f4b6c9ef6beadd5bfbef52360cc4c48d535d9370a4ef6a9fa0019b065dbe29f31fffd4a3b8a84d1be0dd9be3238f378cef70601a45fcb4e8c5fa5dc33d89992c2dc87b1ef2df7f954c5bd4cc65b3150975c128c6fed8f96885b01043d6bafb5d71619eb5b4ae9bdf75e77ea36de9dbabb67a7945e9fe57a6badb4d6ecb5bea58eadbdd65edbe18ec36567619c526bdd1495b8d984e109c6be67cdbe2cf60d800a001785abaeb827ccbe2cfbded3dcf70cf7ad91d515f76c6d95cdbee5d8f9922e3cd59a99aad6a48871f162a41abd76e927853eab3535d015312e5ea0cc31c528469be20bb31c7d598eff25e96365e961a5e95fe5698602c8a8218a0d5485ff9ec17b7fea7d03e8ccbf55e65067feac120274e6bf52953614e07bf03bf04f477d2e51a83ff377cfda28fdf55328f31c407e3287ad51a4793a0075aa50e6f98053793ad9d87a1c6f94ca30e421955d8763ebaff52f8fad5f34290d776baa04cac4941d6e046c76e6b8ecd96d6caef7bc7cd41e6bb590da7d7f3f2f5f4628a106fef9b273569a94c67bfa2c5f771d0c2fb6dcadef3ffb52764dd9ccba39f399fd6abecfeccc65a8def4090b8eec5057954ae53395162fae55db086b9fbbe38a77104723120e8670f082ea84ceec5b1fc1f87606436b5c6fdf054ad37afb29280deb536f7f05a521df9ededa774169566f3f00b446f5f66728cdf8f661d09ad1dbafa134fac5b74fa335e1db8781d2806f7fd31c3a536f14c6be1d4d1f8407a31090e06ab1f0f64fe5ed4fa24edff62fadf4f65789a6512924b7afb6c39caced418c67bdd59bbbf59bbdbb76a87a82cac467f6eb09a84c114c5ca6a68082a6d0465813bf7b5015de1eaa05a80a1eaaad37aac2be13f1329fc96f4ba2c8815f6fbb96ac4d350d768fef3d690107762d479b6afaa488c806f1eedeb5ae894bea0f87b11f82548fccb3678f4c417c86f42ad3971e34953548bdcd6034d91f7fe3b8d299f8a452e630f6b5ceb95b8563df540e5207eab5ae05a646a8d40a5f27319488460400000000e316000020100a05c341a1280da51c6e1f14801170926c6246a58b9324c8611842c81063000000803100223030435a01d964a9cef42787c22f5b13691c0500ddb7af0f08af2c48a760e163c1923fe9364e380cc641c6fbcfe55aee5f6270e340701eecb9ffe1e230a81a4cf2b528bcc4f5e1e03e7a3d3a524865c95bdb3cc1fe1591cf7642972703fba463e9108bcd60734da82346d1e1473556d16019cc144283df5f2222df7dc9c056dde1b11c111e98a7093db154f7ddbb469b6ae1e8ac85099406a3b5a28230a53ca0e709bf68e7c92587227bb206cf925b376291f27171799694d7864aaeed4cd1146bb9078bbe6fa73c958072fe48680befbd225efb947a9ad22d4f24301124ffe935bdb3e43458eb38729e0b8a1b12ae18a23663229b2ef5dd51b90e8285c4dddf41d27a4e9285eef202c4ddc7a78027e925436798359f3781ab63eecaf6a99af75e71e8f28d1e0b2bb74be2c4eb0434dd2805a3574ac1ee10d7241b09942ed47c17e26b0790b37786e1d7463ee3f835689bdf4ddfd67c74aac3e52eb5c4868616619c0072a09067d624308b74e1781694984f6bc10a73dbb101ad7098f9ed59225c70a98a64670831348ee0f844a15e8b5765814a7028914382704fa27c9d3241c408333526684120cecf12629f3ef7a82964fbc732bf2a4752912799206f8c60a7e1e08c89f0c26f99929dacb0e362928e3f784931d5b2d64f94fbbd20120cbd6f10460323383769ec5efa67772798ff89c96be920f1d5773c9db689d94f1a874ce666525304717ea0cbc86371e220f4649e2bd0292bf964cbb9b24d0be1707560558683061502f1fe8f8fe9646a131cf72371b3e9bbfbc419f3e9b7eaa0f4c5eead13506ba171a6e8697a6d864c3c31da250c32a4e5e7cf6cf8c5106f9a3c8bc4136c34e06a88aab5a69b1e89cdbabb70f8b8992f2f390fcc4c73adf6dfbcef00bf33ff31be00bfa18056c8a37973584675170ce96e78c7a93d01c3d8fd29a70241a72aefef766e4dae34e8e588af10f32ceaf643bd7fc181c0bc3de7133cca3718fc0c7ef43163f4a8a1768ee918b716a527cd7d3d9e86802e058fc81084d6148d0da5c58a2c821aa5850e1edf1fe5d9b416eb1df046973cda39de45c7e632540f94a19a0c079837043b38985586601715d2a0815a650e3ddf3180f4d93005e1e1090775acc92e699698e5713400846a8fd5392216e53720d8764442eb35bb8c1325e2f7aba2ef804ada3fcb17b4a1a249c782c02112b36f3822107952d015b21b4b30867bca0267229678d0248f9942dda436aa3e2b694a26bf794f15b4c82a155081a0a1603d6094a43cf79183e8ceeea8ad0a189d4971eca2ae95f798a831646a207a2e41d349c9db3e18636afb3cba029a26dcc54f5dddb37467d61c46c233425d67135e84ad9a81658adf3fc43b4769b660906dde11c3235a189ea8d023664e411a2e74cb9a4b488583d32576ee0756156ea3f3c068098ac4c9ee6d08608bcd1ab176c830eafa11b1ea000bafb322bc0e59de5ff014ee60bf5b31ac4d49955a82e10833215bda869639724ff3e128b44d760ad3f35768adbf45323f46fe11c0a4013e9ff04f547dac004cab559d599732db7cbd01deb85c28e31b305bf0657ff3c3e82a8a9500bc50a584be5482f59a4bc13ac07ef48990b92bf84c0afa3b0086b6b1c88b48a6dfd91a3440f9a7197646924833463a7deecfc3247ea1aa204a4a7bf7219c6147d70407ecf513bf27de7efb149f86deaa0a6e5c0701fb21e549cfdbc2b3a059db46fb4753df5c0c62d17022b04fe02c528126bab6add93b74e3de0f2890f0a5e9025cdec73a8db438a8b26a29948728072b08323ef760c71d50627d285ffe1a697ce7a4c724a39bbbdcf7ce302e4406929a68250a4e5ddc0387c4bb6a5415da595d5f1306d0d4b47bddec71cfdf4ea3038473fa8912364afa58e398762b3de2d5564c44e8852906edca22d9a9888fa49340a56446c23f48658e8d4fb5996eab30dab12a5da92a420155d611180b1cac69e52d6cea01d8fbcf95e49b9eac70d354304ee4ca67c9af8d3b430525c1615c9acacf503ce30b09463b6eeb12fbbcada250531f5dba85f99f6f239881b21b7e3f857a727371fa616be045804eea1beef0ac128380eb302cee9681962d9d03a46dfd8a1b4f9d086b3d8ea0196e5a952f38fb245efa787e52f43e9bd971c526fffe044838a08a55446eaf2be5ba7707a39c9d98e89477caab9367a0b8278f57e65640eb19f46f0cdb67434bb24acdef7d2a7bd79d3ceccf1777f941cf3f1be05ab86c3fecc096a6db07373b7970277ca05c3ad2a65e35c50aa4d7267495d9f8a5a4b1a4bcbbc880f23a45a2f04114ea27e7be6f00196b3ead4754606c98f53673f9d7675b98734a679f67429cc580ee3353868dfad9858520e9d5e0e8d44e410245a0e9b1a020003d922ad93342bc51fd1fd61868a1a0cd3459f5b9cb4661712fbfd357d358b2f5e7e51c46a03a3374cab3992e8ff31bb2330c62a7d07295c3d99576d3cf6659110da618273449a7d14bc3b9a8e74b725ae1474418a914c5491c1037e3b1395d2316dbf037376616e1555748cad8827d0d57ee426954f41af947f4a5424b92431dc5ed548787d5198690162b7502581d06998bfc374b15c534a39ae9a753e4775cf4683977fa9890de50b2c6e128dec7a291025591bd645bc1dad28f74fa7d59e8aaac4e7ecdf30564c23608926f808188a0bf20ba942b5b62052c9a7bfb8017466b75edd4ee92755d7c377b2df3584cbc15be51dd5a0b4fbed0bc4427ff3ba40629faf1ec13a57b86f7378159f8685636dc013dc0b43ba0e7d6a52e4b3596c91d2dfb1257506a59a4a6d6b9f9347bd3a6e23183d4ed8e28359a7f91ad99f7de7cc1da95771838ec354a6cf1ed1e295d72c73dc17149f2d3979957cdf7196a01fece4f1f0e1c18f4ddb254b1cb1cc7b244a003ab66308087c5b3d717b8fb5e02d8405a66400a0d4e66305ffe5c0fb85f4ac55b3ec3a1945030c6386a5d21cd88b0d501368da89406a213ee532c4a0819fbd39cb99cacb7ed7a8e74c9785c5947f6fe4ac93b76f94978e248b1bd33c7e008b3f9dd10998dae01201161540532aee8c31de74645958b9e15518992ef341585ebf1a5e532b85a22c9c936e90962b5d5fc529c2d2e2421e46f15ca6284439841a492b53503487b1952622189e876e944bcfeb694838ed1596a942fe4ef14423b9f69b232e7f17d0c2e656afa185721b71658faf81b241b54ee9b577017834330bbb65c843f2fcf577d8f368a9ad4fb0a314d41d99a73943bf3c18211a62804baf23c4dba7f0017ed0793471c28c1ef20c6a8d09687b2faccd4e3fc12b4aa0e0e9c59ef03ff930f148cef8586c7447d918372a04db3d1294d231c7137cfb285af52c975dfa9f7b1667fb026fa2ab491fbba61ed42667f37b823fae2eaca4193f62ef331db685ee392893c8102edaa2f1bf8a8d05dafc805ff8dc4d443b41448be19b45d7d3164351b83f0e3baf9b84e123b1c635e0d178098c6068d3a2bb2dfac9366733cdaaf3f680d001b48171799e023d9496dafe912d8892c2539a4d7e4e75969fb4579c01dd0ec0c6d59fe73a2b725992d799d70aafa7427dd8143c15aa3f4bf6756342d3444a0c9e78de027090419ab6102d0cb15d644916205378d4f7b21628b5fcfcfcd7d2720cbd14361018e35aa9b2078148b029c489cdf4b917ad0d0c2e503935c0468bd76e51ff0fb20751cc0853989f862d2a51ff360c8421cb143e01026c301a02597469541d4e62e4ea8a0b568e24e3c87eed8b755e8db2f9ed3de1bf6499d38520760178c33fcb1b92ece6ccd7fc7d43eb73f8269885dcbc962509e92c5fde53999bb0cf35347f080772db1cfdaf4c253910f12dd06004ee8c81d2cde1c125da7c8325a299bb847694cdece449b6d17c7b27f964af73b7999bacead3c23efdd2a1e98396c358fcaea78d31baad6f93d0dea7acd0a6479d04dd3dd84141c223b527d2f4f7e56a0129ef2f018e5f3e1c3510ad0ff791fd3bb20fc876f399d7bf327fe843d73f80626970559afc437913d3baf09eda026de4f94cae7789718ae3638ece85429e95ed90a0e3df38640dd55e4aa49c899a3ea30efa57d404267e32217c0dc1ff7dbd76e8aa3bfbe77bc4986c4e650d06cc8dc0c2c9987742e6a57cf947e5d453ba338156f5c4a5a11a1a15dca3f7a0d0715f6f9332ea225be84c5dd9a0f3fbc90ad9ff0dcfbb2483b10a42152cd47670b93d056bc9439ed4cb2380d320d44d041c81d9ac885c70dac87d80dc1aa1bb33ae682debd8473c792dc70ba189ee83e58a129ae7c6912ba66c7b2696b08982f667de38a13a9e8e30466d33e74a6185a86ff54a6e693e3eaa015e19450c8d0355b2517c7fffc30f31bbf9668df2a61a2488b1ea69ce70e490d959c6b83ef3a5126a6d27050e3e1cc64c229b6d931efcff62c8fcdc4823db1817858656ecaf942af59825980f9f76571856c03832cf81ad74ae273ab4b218a22af0add381e862ae2ec3e11a2a0fd8ce395238f1355db6b4368cb38de2cf621c2fd17495b9c6b0b9d7f0c311f3e1f88a2721f8527e9ed7e13368c6ddb1bb9f5003d4f93e83b8fa36cf99f71ab03a70c642d2ef3539e272010ae4dd15f33e1ee9081d3a5c5d69ec605ae254549c2e6848b64900867aee2fd0e59602dc806c08f0b06f5a0c346c096bb7c63e8e4a6e8094a04e22d8718ac9c5d9e18dccb4c931cb62e1fbc147752c6b9b9969965c1f65c25fd9a98dc2687c21bdfaab2c3354252f230fc7ade5cfff94dd4ea076d2c72a83d0490a6c68a6e1afa66325eb83a6415c94c3b4b26ad9babb3612c916b85d4332cd31fd251293422735742db1f209c987205130a3fd2493827f7e3fe7c692d622ad2ec3bf1e5f1e2f3ec931d6e6584c0d3df8524325ea33acb92d24a1f3802c9517faf937fd3fbdb4fbb2dc986042729fb22b6b5b530916b3e0706cbb21837cd9a49a517dab8d27f25cb647b6122badf616e223ae96a9df9a667234e5d9848eb76e2007b92a201dc1102435d6369d2741d78d6e2c44087f6239fdc3780a61584f360ba45fb53d9ed27f4c3c954f484d1ea9db63e57a5ef3b1032f8c9d96f2286bc1325802fc305dba2e91ddf0f061d51b824d7418160a1b9d03a5c07c4f22d2f78b0c05364a8099a3ad90ea198b904ea4f376f88a39565d99e9af48d0cf7aec991a4b15d7a836616a83fd58207f797545b39c00280f913bc63dbe02dd794e2f77ea041f6717b51174d14c618c7173e9ddeaf6037fdd0856b11d3962cd6a71bb4b4b762df56c1864e9f5685d1c2763f77f535466bd11a15b5b922b5ac0c4ab8f81946e807113c765337572349260b349cbd9a4383a2bb02188107828565140a39f0e4328393b02087e5cf344c3ed9e3784784ebae0db6f6a92fca0e04700b153e219d373ce00b190ded04f91afa5689895cd57b5487b11168c9a5ed0bf1df28b04f561beb6a4680b4e99b7464f2c136cd745ef886a6e0a148f60a09726f08970b01d2d2cd292796b2f83d43db337a910df51f719e7c886c2841d6a6ac16d0bf804c929142f94c786999cf031de8a5e08f60b16631db2c3b54dd4aec38a980facbf78536004f04fbbb0aa2ebd8b826be699f69aed999ab7143cf25d77689d738a9dc788156a2e736bdca1840b772a59ef1a1f4ed82b0427137902e6370ed00d0ca1eae1416388fa150ebbe0cb09915348ebdf04568256e670ad3a4a1c4f45623abc1ec47497e6caf440667371fb2e141f3e4a0e0c2082b083708fb4b6613c0698305c53b530af62f3f0666d2383677d7912c2e188d6c50372521e16e7fd3ac4dca7d2949016e7fdce1e730d87474f42edc4424e13451ebb1c088dbdbdec265ca11c78cc74031ae0082c598533a191c003457e6ccca26ad81e15c0a9fd46d69c1e58aaf0186620ae857c3f05524c717b9a4a086c36d4edc1586f86fad7ac66c1c2cd10d3ec867258913be810522b7d08292b0a3c90edbc9c8ba6881a4302cb668e6b7008394f3a7a80ae8aa63d9e6b8b507cba72fed356910ac5998b323cc0d8fcc1bdf67530cee03948f36fd8968fdd4078f3a8a0b44390814de06cd9418d7d1947a0808cc94cfbec082193a1311119fd131b73049a668898c79a6e2ca0cb9818b7d6194769871af00c60375f6d592e9b7834105999f18a315859d891ef87b413c6f5c1fa6e6460a3f16c7c4181467700fa676d430eaac2f60d8eac0cbadf1c8bb684176d1005d725043ea914c5fdef14abadc8d4e4c6a68f2883d944a3b5e454b50749c3103f9644c5fd74b14e74a3568fe940e504cc9eb9b0c33a38f06e1917fca9e9d092c5da750d18c7f656cc3150868f842e6b23812f0a1fba327658c7d942a9674a97710987962f12443fcc9334fbb49e06002275d66ad9c7b6d772da957bfcd2d8d47a713f5b5910fd7b1e106a1a093004d0f087c79fb675d3318f7391022d738f506ed6d44fe1d11eb1ffad4da404811dfc51d57d35bb12b29db27d07367c4e4915cca3fddd9cea35bc284eddbfaecd7604dbd3a1a432f0d97840fbbaf9baf82e10cb6f08890e5d7557f49f972775526713542827e802591d809c175268a01dd217fe8f2b6ccb6dde466686d3338f93ff102cb31af4bf2a21d4e61be23bd9945d3fc407ea543b6396f3e216bc880afef3271a1e5b850b6324219964a4710e0f5bac9fd75ea82798362b84b52e609de1b057e98b042be6ab850a1fd50fad85387a89c6f4461e68ac49cb666c12dd912e6e19c4fbf0e815d610bcfbcfd2846ebaab6732ee169a256bd5be7a34b9d10e1a58eba69f64d9b159767f20f879aa258f26eca0e2b0cfae001fae8473853545d7814d3d102e0a6f4ae85f4ce545c35520d167f1ac47cec8fa38b7d80d3ff7a5caa2bb0b2380616b51a50d63348a913c2c2827a926a797bc22d1b54d428773a63d21119577a41464dd6ee1e3f940729c3cde6cd6bf78a58e94caacba25180e96c2cb64b3302e1ed45501e417724a9d52fba17c12150082a061c199bb76ce7d9c48884cd975f9415219e850495d6189651f5c931a8bb1b301b15060054187c2a3257fd4cb4c5daed89660f775695449ad572a1dd89d5932a58c01516b4acd3cd9dd311fbfab191afc8a325765607a3cedd50c724f41a401753e5c553caf31d61254ab40d4f44fad201b4f3c82adb7fc4351031e5c604bfa12170d66e660ec1f72a1482e28ef805725683e00740eba8332119f00981ef7934418aa0fc5e5937024a993cb3862807570481f422c5cd17b7fb3523c75e786f4b896e6bdc07160bcc50ad97795d86d9547a8156b206fdab2f4fec9e981df2738088017a840f8f01dec2100715f7d92bc0b39aa98b2bf1bd7383b4a78ca0d7f7d747fe45b18b5e9786bba45bb17ede9b974eb270eb8da06abeede102a404bd3330fcf660eb843d5bc7158a2de8c20f1db852c3855929dfe7395e3447cb98547aee4349ed53c045760ad0c334b9c994ed45e4ce836c65244abad523833d83bc6f642e1c0f49d3bd27e53a40a390a21294f863158a7971e70d48e6429bd775a4daf5c34e733441ce7115af3e34fe48f959bed923264c38dc02f2de8baf46e5a64986bd3b81a87ebb349638bb5c19acc4cb2dbc5e9d1ddd69d853efa97c8b13a4f0811360998f39abf29371710684402f5a9941f0b7f181804693f1e5c7df3dddcc6d75b0ed505e394326c78900158049029131a7bb93c6011b044b4f2b18efdcaec70542ab9401703bec341dc8b75db18c17fbdd4e3a361a39aee31ed39ac50ea90c0987332e48340bc842b007ad330b26c913dc4a46709e63fce31c04472dc98090e4a7a9bface87cce10455794ae8dcb1237201bfd5c28f01e1cc50e229ed8795ab7a6dc12bc8f75444e7090814e84d1918b30de41d389ecc07685db1918f193862cfa816b94470f2b20547296f16e4e5f1b90facc20f7fcbdbba284dfd67e30aac9f5d8c96eb2ae2af22f1514e6edb6615687e5a5d0f96b7c3c682ca619e66e58693ae2f4a4ce429d1ad0246981e1a75357d69ca8851c6572c0ab1f10a22625fe051ae5e4d6f1975d7632f39eccdf813235ddba91a18b9ce3aeb1218e745b3a23e480aa5af248fb82fac1553415c0aa9cf989396069063a654949aa6be9a2e74b4fa8319703537a962494809811a7c0fd0613853ebb445204e764b98026cf914943b1925373c3776c374737af4ebb68595abd69530b294c459c9b899f5bc2097c3b88f7c85bf9448bbb0c4264c15afdd008d90798e558af7c05688b7630fe68133f49146c3d16592e14ba796eef145a760dc6ceb26c46556505294dbf4205168ee8cc39ba33d6a95fdce7820044738ef6d7b4b65d1f90ebeb9e6481de63ae8f1bbb2ce23802ad40998606515b94d4b6bc80f02e9d1027d4c1a95274bcbf126d4bd1cd8bfeb238a4078bbb0e27b7e3723757ce9bca825ed92a97e46692859851d32beae0fc20c529ec0a8a7817c4a425e85e8aeb3f6641b71b46c5c6413c003737c553e59a93a85bc05a70b98bdb430a0bc39d292ac29b3aa75edcd904a203a30cc2c96f5d09b164f21457c4cc080dd0ef3ba42130107784f9200c87a0bf8f482868bd6346de6b9a6383f1935b24ee386e5621acb9eca73ae60c62fffd324cbe300e02fa652c04122fb3151704c5f4ee10808651e749ef244a3a2f79eaa3907eca72040adb0a0a22409397197b3913e3208beb87ce2ef165323ae6237acc4ec38d6a1f57f86f1a206dfa65e484c580d1531f4bd6561928ed2a4b62b26a2b0348c6ce66db3b14564cfdd6ad318a87cc0c58bfdabe8c0e366030c9c99969fa65c24324c55ea143f91a4e1fdd0c42de450c12c628ecb68b63d591f033cb6b8a91f99c726d87d2469ed2885ff1668eae18a6a40302fa04e8a3b4426dc3a6ee731c4af197416e5434a7ce72d5d1c792bb473e59bf6c1fe7fedaa5c408e704c5b713bb91d69ad15964468addf61941e76bb019b3586556fb2adb802a841ea82cfdacde9de718c6d8854601df55fb60705c866af4fa0c9964b11ade228ddf10c255a3445d4c221cfeaefca6f5d9d324f534c68438587a4160c95d7c55a952f01032f4b3ce4d73ec30983772fbcdb84f0e51924b24d6b3bd517090cb0b48a8605bbf153d68121597dfe8e20fa2e219f77831bd318651056b29f9c959b6778dc98b8c608082a5a4c6511db69ec8e53887b14995c104535a188bf8bee7bc85bd1747c4a7264fdaf1950fa4858286019e6fd2c7d0c7509fdea02c321f45e94be203b8c7c59f77abc4062d09428bfcced5dcdfed8d4a084bef5870a18f018dc4998f8694d5411ac5be294bb6b6821037895a2cc99c55a83a0befc7c8622c6a209cca6cd92dbae8327018021274a6ab972e5cd308b019f9810e72e37a396ec7a9388b6899e4de3d0402373183aa9465b955713d6b29c05b7e13812f9d9337fa4bd98fcb3a4fb4d650ef1c80b86f8c9da8e71f1df0991bd0fb58faeed02b49a68254bb84f76ec067ddc345ebfc938a88250262e86b351850a650d0f744510593b5f2918d965c91fa4104401f15068903078e0ad090164d7f410bce46d9454590c6f5e29631177908ece7ef88db6f0768fd82161da0e378afdb7f19d909e85599782730a5576292b7baf9ad32429c76be8beec90918a4dbaba91dc8d6de5e62f65c0699a9485b94008a706d0776b5bc00282d77a6caf9d7e769d6687311506ef100b03689b2eb9268268094663924043d3e99092ac2b22817f6c7d66ba3d0af07ba4a7bac2f3e7542a1679569c13be7dd2f5e0bc178d4321dcde1d32656b25be85da7d392e33e182e93f32d4e01475632aed582bfadc6630eaf415dcce37e6f54455bd995e82b9562a796702aff536659a2d65361548f6f5185f98a24e341b1375061c530c7d9fca62c9b7624e0321601950b50c30c2971af6ef286f716ad5aeb573794f713f38cbb7259815abb887ecd9293d62b50e8705713cd37497dd74d84115a865778bc61f5266042153be31b8cf15f31ca856b393471a5512e3a40a21c5209665a65e67bb8910b93cd021bf5dbec6f79a52dda151de1e319e82879587ddea9052000cc999ae99dc2c993d0ed0d8855f028dd282829127cacd8be24aa2c1ce67c190df6d41de7ce76269d19b74e0d846f49c26d0b53e2f02794fb4bea492a7a9c29c7c844ebb647a7c80b938c7728be37871d9b295d7c0b229224819ba866d7db3b568230c28ba911651588347671dfd0cdbb1afd88fa9f208a9076b4ac303d4c8f8477f24eac4841733bd07af9506eca8abfc7c99a7ae70e1f27cc53a368f3b54672cd692488179365427db23a22dcc6b10b9bbee6fea44ad6deabc62876334479c0ae48d99a960ade877ef44e8493bdcf9c5745fa395e0681a25ad731c3cb1bec65b8ac208a91c26af773344b91ae0980c34117c8aaa9a22ecd8c5976f692832ab7f896ca80980f23f95ceb919a417d429862123c196967225941e5631e573c53639ead533007900afc73cd535c9af08c316da0fe51b6e1aebb478300a1841d4d514b5f7ad6448819cd4dafd046b657e3f2dab1ebbf2a4ea17f0befdfa363d08c0c9868752726f0448a6535d5cb965420a14e461db1522befa980f099e17facfc43f57c0672de496f5d76290c8803c72896c3176986457bd7e2ce5821606518c0a38d21af81dbfb40fb9a1f864dc5df2ef847d57a8629a916c1a1666c2ee0849a63bedae2a92d1e5477cc4bcfd0cbc685aeba5628c81108a2baf8c3c0eba7d072691327534922c6a02ea621ac423be686413173e2bc4b3180371e142d5d4a4b8c618561d9cfdb9156255a0da33527a1c0c9401ab0a3a63f23c7f574acd3716b4fed3733509a6d6c2491d023b5dcd9c1f0b1646d5e790464787bf4be6dae20113c8d7ee2fd19855cd61976c2eb27bcae9be42145ec3383234fb6c3c762080f12f8c908d0b5281dd6d0381e4100dab0127d82cf5b1ea8796562b350af8e9716bff86ef1129486469ba2685c671fcc381a31b9665e588e79b2fe0fa9035035e4e40fbd05dc800cf996fcbb11d933ccf7a44bf795004a9d6e957b8e58a205ba83c1abfe3e46d248f01fd175a15410b8f00212bab1f57617ab80460e414d97107a8aa04bbbe988b6acf8e5f231bb2338fddc12cf52102360749903c076e7742837a34ba36b8109540cd6e46ae27b27dcb3a8c15181e7e159967eb013c58caddfe5569c44bec58ff0e02ad3474e7891956e4c7e30d61c9d13e21b5b51f7bb489ff15dc66d5df340dd0b7786346969aeb8a19fab6140c98c6829cde27f979d10c7740391969eaa7dc54d30c4f074216a8fed9691ae133a4dc400f8fd6050d51d2e30a532be33ca5eba3848e62374f98a4383c3cb8be0d4d0274adcfc1b73f7a9304516d746be8ef664864a7e2f40031900dc168a38156b680360242700bb95cae94b01a0fa0510954b80c0a070c538340c4480208e140518037c93a24a0623c76fa5b4436221a22d111c6eea8504cc109bb0c9f2858b51fad22111a3ad6e894204990045ebea43e86629366724152628641bfa9f41461595ce35d6db12102be5aa3e07248ebc6a955d36a40f23d0050a42225f9cf39b611bac354c13addaf6c3b4f078f4ab159b516267a9be49505664e480b1174fb1a673a079e5c13319d72d2c6a2dd81d685b60c8fd54634da93247eb07e5dc63ca8e69edc0f8fb306db11b9ea07ec87f34071f8f25748d4b5c8b9ee31a82fc5f660c9f0bbeac6a57af018c723e7f0f9ce9a023c4dc5d7af2b90ef6a750525f55f7b6b420f159664eb90d7cb337d4fce6452d0e438049ccd839a8b927142cc1ebfc4b18d577e1758bdf903e01b7cf6b1aa1ffccb6254de65608e3962a3290ff60ad5df7b98c9936df20683a55833037d0faa3146f1489cd2996830fa195b9b69d74b9c6c45e281b32148a6f94d3224775d6205e79b7916b6a1235b567f234c9030a610a20ec2f661b7c8904d7343582768b8b0ffb53a265672e9089f9fdf8a708f50fc30dfec143ec0f5336dce479461044b8f0f4e5b8aafd06b4c7f8ebaf77f1345e838415b94de0b273150d3ebd635590ebe7a289efdd9d865228c29ed2e85dd0cfb148a650623fa293341b9bd1f8cda844aa969aa48e94d986a49cf1f936c18552492b5358cc9e88d69b6ad336bf66214e284ac884bf8e7879c64b2201e3dd8e376e20ca651b0260ef98843531b6c4ba0a4abce08115fcea63fb4c7cf951c4cbe3739514f997bb3ae92463333448ef301caa8780f3f5c5147d851088d431b35ed92f43dae73eb0061b3cb2f207f5d7c1076b881f95d3c055703f41bd0f630619cde2095a1e6f989aa7c2244000dc9dd209b5e8e885219feb27dcc2a900ed1c1c9a3f65b2ae3299595653b9ce822a0c9af19a458270a534003705e9643758aa0048a3e6239f44e6e4d12a1f03ea21e3c58aeaeaffeb03407cdb2b004ee6f273826cf8e1693c40ff7feec1968c0c2dd90b61c082f17b436567842e5a0414d73bb78c62aa3f849d885870102ee8b862813e6a0174ecb5aa7d150254758db38c67b3c8ce3a96c845c3077e3b28fb50d1426fa3897c6f09828187f588c6ed09dc10c613810c642e02023b0ff050d3ff1e206638b106d1484f04fd0175ff40957036544e33a9c2012392aa2f3ac29bd42782265a08af66fa5611b71d4ebdf4e005aacf016c24198738c99a5c3f781521e796870e467ad0136f1f33fd4299ef101939022b5ea62f595bd58a6ae93731b6f0bc2dcc0cb5c55fb2c4c131b830b6bba1a085decfe78a03e9e5e2feb33eb3970adfa659a5a8d07881b6cc6f250f8c54a258e13158e945067df27249b220deac2dbfe29dceef0e1eb5d7e3baf120d1db540c070826f71311a16ed100badfbf13a1d9c2fd4142b7fa66e2e09f1024b19566a0e17a66e8a6f68641d0802fcb451f25388332e2a87a3dedb35aa0818a05f808af2ece500911d166ced27ca994cc3cf47a32df31081056d5eb96ca3e077d83d6e7408d8e184ca076f5b826ec4697f21bf9d9b8eb5807fb430b453f5f3742611a94c9bcee11f1b821882b45af0606522999e3bf714b379332537bbefe46a98a8371f3634fea7a61836bf7ab050b7d5fb6568c5bd5bc84d7a1a708c6a7c31bfa2e4bf199138ef80112521fa265bd445121d3dc62ad9b88af72df1604360332101d457973550dfb92f4d4acacee41a88d7990fa947e09cd6dc26d448844977c230c73622a59cc6d660db5fe5e3a3beb9e12b0db0a6914bb5b788bd6425d564bf95fb12f7c3d2d404018b7f686b29f679815341a058683199f1a9bd55d7500b8b94d8c8faff4a9832331bf4f989839d37fedf34f0f1c885cd08b20b30358906bf8bf0addf07a05572228ef6d5321fe17b8bd45119f76fce6fbc8208f04c37fda22c88c6dd8bd74ca4055b78f0f84922c0e40180c5fecf61d8c1d92b46f3b250cf28870b9f0a4e4f447f1c8abdcc6adfa4aae76df26047257aa60d7987257badc87e751e543e34d3da0b6abaa579635a2494a78741dacea5f2b192f2e34d6f5c5360c9d4c211e6cc05ccc7e3f4891aedab198cd7ae1831411844b9cf7b22225ef712f3805cca9463f03a70c00f0053b0a6b40ac95db0b2fb801e4b66e5dbd1c697a4f43de25655856e3907414d2dac8ba71c1fe08581ead1cf33a0d4606cfc29f75b7300916123d2cdc103ab9bee6b8a1ff0f177451d11023e5aec46537feb75d7831f25e3f2bc3078fc6d1c70fd73bf89363f6c22d4ef2b4c4701a378ec919a3c8d70cee3d6e71523e94290fc3fc537cd1cb5c366e1cdad9cf1e953f5da601754f602f95cfd0e34a85dccbe99b2c4b1af7a99c47ddf5d87d6fd427cda8dd43385fcc0b02237b477b7d35c84cdc2b48918baae5011cb381b1b7c874defc9dcc5e6a1f3ae4f03f785e0eb134e94e3459728dd435fba0bea6ba7722f039e4d5ab16950364951d61da1f91d76af65145363eb93f37155a6a4d554c7f128b04d2e4979816870fec3283e342e3b6f8229f1134e788b907520836adb838b8bf3c59467bb1fadd761cf2fef0a2452afb138acb8068a4de0bcb980b84f49d27af28b11def275c16bdc05b60a0ddeabab306fc354e617d5e81ce80e178c4e69132f7e0b54d56e80e443bf9504b6e393b99915d171f5868636515738dbc823b3a0bae008dd7fb6847930c89ef04c9f18c61dfc6a6bb3f1485b92d3358f74e78a11e00f6c5089f2ff97f9ff6c0f9714000ad85cfb73b50846b77474877dea4d00125c23b8f13f82b79b8773e11132061e0aec14c33fecee72471421103062f7e4828d7269e238cc0f521046abd73dcb57ace5244292b252115811274802579e710e84f8a406dd249681aa77837f83c82d667bdd190e061601a19b66181d8a2e716f2453aae021e5499e71ce7220d6072a801bbbbadc9c648d9680ae3d7e5d89690ec3c33c0009e32474628832c2fdf8eb2c76c8b189d578a40eb9c61d8fcf3aa2524593a1acf9e0d59da1796ec567ae236e3b0afcec71a176d4538f3aba37865a56ccd02bed66ee76abb02c5f71c8958f0bb25786d5b84964a0169a065873d658d410f07b5d324d59e432e52ad7cdf23d5d2a2f2f146b108ced1b21fb0ba71e38b9c314a1c57051ae18d5614b0e4e2ab4458e74851a32cf75daf637fe8ea0bd33139b82c6c141caa423e5d04acd7fe369244adb246d771ad5d93cfd0e65e90cf8bc854de524622f918aa10e1ff818a70741bfc0542b8525b403b7b790680a2bb4545a5d6295517575f8c016914c79a428c776663220643928873a7502290e0f40471b60d2547b10ea8a7e081aece5ed3bfb53108124ecde6e7aecb1526448a36e116f4d040161ae3666b1b3ee82bbd1f6821332bf46a11c051db72c6c0e1128323b1ecdde01300ef58145b360f0d873bda069ddffc0bbce4cbc0bff6b267044920308583d527c36d034b91494307c187d86c91925c92a6a000ca92fcaa14d50deac86b72f7dc2e4356e006d0aa06b547f6d344d2a36534830ec764d19117e212bfaf396fe88f9dddaf30f1c22852966947fba363a581ab4c5f52904a06da57dc92417811afc641de7e014c010e579628e6463d14405a83b56d494464885fe5726df145d008a80106fdf499cab42f256f2f70aab01a97a2e044307a4f0dbf23d07ff60ad29bfaebc804c0651077bbd1532a08e4aeaeea22157925d9794074f15c245030825a034191d022bc6a2002ac54d794deb4f6bcc1fa492cbe460343c032febdf070ff28b46134c16bd0f713c6b45730185906adbef13310bd2ef6519e9a5d5e7b56b8cf4f0cbe18769e3250a62594be039297509b9398e2a01e1822729bf05efd02ba829a33225fd89ad4f040b7ae5f92badbd2c7eed7213fa0633d43bb27e8726ff1a93599f1102bc1347301c1009d00a56788fbd73689367da5859a8a8c1ac0dd96f8f5ceaad89468702a67dff410409268150ea9d81855855fbd01cc2822b59eb1c7d8735410b65d299525c570ab56c11246faa84670ac4aa4631b33bf07721cd03e3d2cadbfcd877201a30266ac3124dc019c3e8e7ff5c566c28e4830de6a9b45313587f4a0455c1c33eeca2a0aef7ce3534f7033925cc82e66626838a53e84d05fc86b1dac1741c0338e089664c357e8539a9145284b48ba53b83eaa6428d031e065ae64867445f63208bc0a6eff9418b9c511ff9f4e9a32820ed871867e5619c8d94cc107a7a5671b88c81f9942c85e145e4a8b110701b9cb25841628dd154b1106076d89b0b032be95ccab12a1550106c9e10df08c3103f717678075764f3a234333cf7ec5cbc4aa611256276dae3a63bfaa23b445c0a856d8240dd84e5972a3907b80ffe6254bda820f19b194f73aeb60f042f26e86ca626ef8920f81ac1a17185aac448341268c692bee8c4b15ed8f1a5a5acb547c219945e6afb6f02e83e0ef05f7f5f2f0202800e4287219689c66523d4cfc1872070110cdc976008c94b3476c5995ccd9a5afec1322b04dee56ac03b7f01782901e6ae3d4fe1ead6330db934eeecdff2e81c202d21611fef0e682d822fa3aa84b08a44550af70a3a9eb69ec61c6b042f5dbf1f59895800116a052cb1536d44f05c29b0bccf7046189e8dfad60fa49e8371488380649d28d730ac4c54d2d7fd6ee182ae691c4ecd2f2ea729f1c303205ae1c010638ec63ce8bb45905a477273732eafd44c10c8a72aee55fa1bcca0ddb2c21b9bd57c98e86c81c4698641ec32d58d8d089aca6ad2ffa244373d339e7a3071f29d753d90f5d2a82fb2f621cc2dfa46479a46b3720dd238b5e0305e264d4cdbaa65f7df13d26cdacf957f2872b6a7a43d60b06c29ea6753a0a9a957c227d63c4608c20dd8ecedfe20ca42cc2e224303b360ebb768e9d6667fc81ade3041dbbbd0103fa92bd6af20c59dc41e812a0909b140ed6447ab0e05a2908e82b7e1fc9eb60d37407c3a962774fe976e22033b2e3f9e012398bb9e9c72164367b8e0bd0f4dbd8faa31c124edef13e3d181821d8f863fb04a76158f044489096704985aca12587fb310286d390d96fab15837289d91a8b81096796457558480919dba05caab20f839241803e144c10b3826fc4cc84dc238616c9cd86588134c30cd500d575fb9f84fc501d0e2ca371215deaeca75b44a0500f0479d5d56b0ceb20040976d6f0d8ed0075c9c45609f7f4eaa8a80f5de5207853921a83582855e8fd3e8864e3bf21293c0050e982709a20ed32a729227b0c18d7572f30ff510a910128fe993cbf8dc1d86d0427b2b274e1cd902b8b6a9054698fa040f6c127cbbea131944a94502203588ed01b5431e0ff78213b8239f334e93110463daed1bea0d4fd88f702bfe8ed1888888703a07479014fe88042414247fb72a13f1d2ce64c9bb250399344b536710c1548e2b0eddfc809dd8119415864bc3f1b409d34dac0931971ebc3fdeff717682afe05fe1a2403b89a055bb561e7dc164177328d27d86c11921963b3e03fc5910cf29b76b8cab120783f14b737c3fe6445cd310c7de2b0be712d2c3626114565a7d0839055cc9d0697022c745f32706a8079b745279607dedcfb090653218e2f16b3f7a70f820a5129ebe7f52f2291e4703cfae064778cb13be36f5090d7d76e2348b17dc5b9bac25d6b00fbbaffde04ff1dfe270ea6ede8a6a7b799d1765c081eb3559e693fe36c2297d6875f198a56b1e3bafa33cefd192c4a91b0d85762c7a51793e25d8924c80f328c42edfbc40e1a15b0a35e4181f042c4a4231682f8e88a5aae28ef196bea40c46182a65877b456de0878950b94adb7844a5b9bd27f0a4e81700e6b1e872b650139b8b8dc0af58cc300388060f252fddcab97dda109a86d7001697f6a3b6612ba5c2e204bd1ba7c2693c0af921e2ad285b3b311fb5f44c29e356d109309341e705569b111ae13025f2fdee98770e37c37592b4d70d6511fbe7d2c446b281c6cecb1d83166f39d31b39682a9c7ca114ffc5c26be3c7d4c82a4075b38babc07be963e8ea1d06c20187839808105777a1783cf32470fd528148a417b255d5e10e4c2b5f25fd12254a9684d9f1375749ee0de5a4061b905931ae269e4b2db1bce13dc47fa008b13cdd63b21e7f1c2abe7e8d0bcb10f89feacf46340a5cc4e9b162223de007c31f2a70147b0773f256046cc66e97fbbb86da512f414f4d31dc20296e5bd2c064cd5d28719ad08b87d8eaa5f99cf132d465aebb916fab3e098001f70100acc7340453421f405f4534f174b9630e1b5476c6c8ecb6c6de7676a64b686276dbedd08394f81cf6dcdeb84d850b61c191723a40530e78a8cbf9d27328cc7acfc4586952ee0ad7c9adf867fd46cd03bd236030893e57138c73a88a8299b2edc05420845245f78888f25095752197d820c306cb42b0087ad55fc646bc318e949870901b8017f47f49510cf782603bba52a09a8a948614e086d723e9b1bd6e2649bae15ba66a29ad7173f19d1477f3ba8531dce0754c95009fa806f377921053c24a0f612598f1da56e2d3e51c3a0857582a40136ad4570e3a617f51a93a365d9a908c9f545eb589b584d0d832d69556f10081ec1745cc9daee2da686e15d0dfb04f736d453c32a3c9ac2cf6258a79a84984be5bfc0abb2f1548297bdded19957dfe207907042e75d51e00096bf5629547258884a91ecd7f7275fec6c7bdab976fd416c1bbc808350d3a693caec0b3f865c41aba1437239f4eb3b1c0c0ec109bad46337630415239b5b932001f6474a141500ce0e9e67282e6761dba9a0b6ccdf0af3ccb937fc801e639c3bc46537308364e7f1e5b667343970ced291c1057e51e9fbbc0005390bce1661d3afcf972e4a473bd184a1cb900201884a2b11613801e6764b1e073231f94a6c9fbd44cb1576583153c1d5a58c67f9e15b8944eb304fc2cdcc2df30150c8e08ba23845553f4f6cc807b0daa35671f53040e17d09dae4aa1881409fc51fe58de2001f18a7393a9bd642b2501a4d0aad71aa0f96c4cbcef7af34e402abb1d00764b3c90064644d820eef22b72251a7eb89d4da2eb0ca97c5e4bd954cc0ad5e8b3bc2a961f60e087095b1947f5517a7dc331347207c5edf228474c3695cbd65042b0a46da07061a58466301196693919603cb535505e74c49c01f58749ad53b61f63401884be77d606b940c01490074cc093cc59e237546fe8715eaa69288f0f7ec27a7768fa3aa634077e1bcebf64102818dd675bf4722e095a8a906bccf1026c2c56476698ceba92525e2c076fc0ba86d0f59daee86dd880a2010d576f5f61fd19bec6f0d7cc65d8fbbc3cc2eaf4af6a1f39884e5a0af0b9567c459f24c61bbf92bba2b9ac31483938f8b81f4dabd4927dc6804f84ce7121811362992283192253892200be22998a648c0d9405623c2d5442c515cc6dfe7484e66d9bbe9f34b8490c6b32ac222143deed0d1a2e9bf814a3aae783eff399e6712c11af8d907182642bb6c9a80805393447c765559ed7f7f126a7c1b595d02647f1f2c5c4e05cbebf0dec13d1c10e0157901abfe3aec99b3bc42f1752ffb1456b983488abbc725130a08cf11f5d21af47111f750a163d52d216ae8665ccc7c767d80ee80fd295cc41df2c37f983cc4dfefc423d3f502bc1ed7e10ff0cc481d71170f9a18bc73a1b5ed102274ec2364e8c34c5b2f84f878ef821281e6c9546a9109db2878bde5128c4b157c6d32f553417429051224c73159131e152e5ba65f7c1e06bd074094cc704111a6916968402402b1d1ae358c9c6011cdf2d4520f03ce99b866a482f563ab7b54a2bb677f7f390233ecff8785db148e9cd20641220dafb7c52456e4e3789433447c736a53824402a6b25bb1d7d215abebce6f77245bb0b0edc399eb7d19043d98b0522ceb71a27b846b0b0a8782f71d3b4dabb74028e2764dbc81cf3d0522c5dd7233feec3293114672a350d1a15d2c8133cc47392599a0c36e792f914bd424e45a5a3f938b8d7a81fc2f6fd18b2a8b75b57b10b0f890c46924e0942ba121853b5ec155a26c2fc30727766b9c25a0c4c7200d334b3e043bd7b4553ff89488f0ade705cfa8d5e0ab0c136ac34fe4739a2d686170bf9ab6b9bae6a0c9d3a7df3c5340a59184d66dbec882306a1352837a3c3315c63628f56551c8bab2015a5956fbb74a608ea36edba74270bd9a864a47e83aa8d9e4a03e7166abfa718a17b7a61a8c741e3378d962b42e4ce052eaceea7a5fcac2d8d8d7241fa30e861f85afe42f07d791d8e487dcff22392fc8ec05cf7e52427bbf240b7bf8682f5bfbe611ba65dd57e456dbd07d8af2bd5ca5dc977ca95a28e62004b55c095825451b742adbbe5609a2e00c608f78a9f839b9225b1cac0e752d0ab748ed9ba47a3116e01056e9fb75cf48c24576a7156cfa29fd65ecae94e08742bbbc611e262d1345fdc1fc635125183978250c56c05b3951d281e871d0db8a55683c184bd5a0c4f923e4f6a328eca6e5430e1a6a87a265f8e92ab2af9ed7ad76c868ffbd0a0e53d00f56b2b0afaf9da62bb586974408ffc4f44eadc6e5c33fffb861e038cdb71a6b61382d22341a920c700337c69ed5981407e3dd90250b0f9d9c12e404c9792a6bbb29d887a8c54ee13256198b670baef0fe9538cc326245b42a1d563a0298f61d5b3ccb7a5a805dc12400e562a0f62e1d757444e890337bea3b9333b823af1e4f5d3f90cce296245b40b4d22af28bf0f867ecc74ff45b8fded05b234a70e9c2ae092214e2da79f4b49244761c96ec67ae8ec224580ce275d8cb5d1c3ae64099f01fb6b548f6cf00990b4c1c09a373073c06bd94aa255163a546d3ae1fdd7c66476250c99e4b722b17b9b0f3d1df70cd71bed9a4973483d716eed4e0c0448b1e02877d5a7a2712a3be4063409cf4c0ae73ad85d406c7b17a5c19cde4f8beafd8f47d2ecd342f5ca169c94a677473a1194b346ff3b3d9322869727becb528a95c9a93ab8b36528d07640b593bacf66dcd1666e6cac8804b9b04bf542efcfcc6d24897db371ae74f36926d9de5136234d6e32534f3f193b85d39aee26dadecdbc83ee29d769f442442211de1ccb5486ccf47935fe78f64718649efd64eda3e26d5830241e7c04a9586e6f73f362f80bee42f0803303c141ba63a6ce965c993561db695a1e682cdda72dfd3b2bc58e068fe57aef48414551c024dabbc611e2254044d7fc8f92369ddfc8aaa260088270f1432c4e8e5ac458a5b400c840e16b06c6787950ab2975970f29fb98ca0ec8156e7756f9e5c32616d1188c4ea836fd59d34f2882c32b5ee209a56f296ac67cfd83cc0e4fea999d47b1b21ebc7584e00cc15ae195214bc2e7d337e3a9990d0b32b43d3057876bb81b632c471eb8ea2d688f3635c00055664942a49f16863018785a68d7974f843ff67d5fe7f18a896549163742bbbc45baa5854982e18b2a6dc8a82503afb9e397c85103d4e37e6c4201120e6bf89bbda902487d405ea74b481df8dbf2777abe4a38407094468508e5fdd49b6ef10efc95e02501585197a2cd4c4f4f722a113c23d4d08cd7cb78b49a2b91e002ffdaf9f3c1729242fa6269725a5c94bdc2a3031462502244dda5506c0914ffd8cc0d2c9f1d448807d28257cbab1edbd93ce6b4f7a1db2e2b630b28f2ee14fd21e53d89587073c9e49ba2a4868f11ddef054e1b38e23c3c97d93bad23b3c4be6ac14339057061e4e67e599e7627cb892bbfd10189fd6a1f44232cb03fe6eec19e622550d1fb3ef77607c15c446caa1bddd12b0e115dbf5cd9f0fc69830efb6dbf4c2a48c8239bb60ae2ef4d27cace65298433aa81e64b615f727268e656d4a91fa6ee18b66acadfade271937c43d5f4df925c1aeba18d6eb14f82e38036c2cd22a031f0d102e52c053b09bfdc77da58ef4ad23728120a9a4895006403a5c73ddc103482cdebd700aa2f55ea92ba34c22f73cf09468347fc5b5505741eeb44ac062eba7665f791a4bb8088b69444185d648188a08ddf3a004b67e415393e2ff07de4f3f1d20a78e61cb80907b40d32cc6afc9cdd56b8bae65385f2e4409e053313960795151edf8b98baac1691b7f2056b60e8dbb7d28e5ac544a787d0574c2ceb5ec0281647220a640efc4aaf1473c68e78da17b0c136e5e81d2f61528fc05607c4d2effd7ea591d6415b3c83390c4efd9084da16947c2672f494a5a1729e03206965a358f9fabe00088376c99dfb1c78592c43983520f5c36cce714433680a639c6e050eb96433d1731a4047344e055155b27b058bb5370ee49f0c4d2bb6f162b70a47e147d4237794989f1791ff940ab3b9daf7f7789acde31fc20b4eb9f5ab216ee8dbed1cec6859d38c4e4d1d0256078524be302884b01c7b907d72ee222f09fd237d54e2cdfe3a9dbc0da6595674bb2301045ef324f60f4c4663d7154eb101258615ccc9d29b927380337e9a05752a9b3f5df893798e4567fb2e85848a2f0863fbfc75ba1df09a09c1c7925495109ec360756b26dc1b1c811a60f2923e21c30280a145176332386165e49709622ae8b0ccbbca36ca0a1a6a3b0a692885a7e2679cae4e39699c4926af0d8c27ccd69ec44ab9e81a17a51636f2b041a62fea15c988fd3a9b3e5ace342a9376b221b3e6906fd567a8a3f7163241c4d5188beddd7aff489304aa5936f25f1291586347d79c50d412febc03c31d7d8224949b8a5c0eb8a2fcc12a42f1c7a90d0460efd84df606e4605dc569ae305d7c6bc5d8fd5adfb343303a020b267c56d8f5bebe57e316f8abd3b69add1a9268e5a8ffa24916062c5a9fd10e6b26a4cd74814e390d284a71bbcb44f1239ce3aa5c315633fb46aa2482cb8e4a32424896c456e7809568acd6d4bf0cc6ef89b6566c636d8c8fdaa89bdfd2d09ec24910df8a85ab624a2f28c89dd84013739815e902846a5d1e1c3287483e545889cca22b947297a5dae3ef218b1e7fa7e95487df79ca0c49d1410391429b0162b81d2992ee6af6c46a4db1328814d64974412479d5228feea4a69d0f5f1acf18914a4ca5562e9993f4ef8e1dc332ad7cf503e7060b250400bbdf916ba2076eee36b543272955ce07ba96ce0887c84be0b0c7dbc3b66512ee8de9ed4c79c00bf8ef772d81299df68716fd21a1c38557bbce80e9a114b831b1d14bd66d2a8325cd6f18dd52adf1614a6f6ff5f28cd3b007312d3a8ca8c3e8d23c6496006e6aebc06477112690448980d447a9f003102f8c746c0823d7d136f49a0d86cbcceddf092d6e461449142c98036a1b98053e4dd237919e5ce0fa5ab06cef68acc802cb0d7711d5b1a582131fd38ed580e98965f9fee90401015a38d61ad7c702484225e2779375b5c49a28a8e9b19128fe023407f740e52c1f3bd67abebac165a181a3d2072666f15970bd5daf93383c375fea1864e3d14348f07f7f3e020d71ddb74a86f51870e313382ff7d48018298f42307974df04ce845bb1c0caf618433de5143c517a1585a8f52af3e9c90c9b1026ff7daa4a6a43fb42f89502de936f6d519faa553181bf237f4c8af81d5a98c2c72d8c8ac6211d59f675c109f2f6e7ee1feb45615747bc0b8c89c895678048b79c2a7fc1bb858ea085336feeb17884ab3a7434998bc99e9206b48acd8fb0714d15a1e0be6802369f616860ef4417308d88ff6d2397b733b07bcd0b69df0f8ba69ad0fa9466c11ab3edc23e9926156a2d1ac94b673313e739f3e1a68c278b4a4c2557a3186683883103a8844ce01ad5515358aaa25f13ef37c1a64d892e8650f0fc819af8bb1a7244e2f6ef4492fbe1468b055a8febecb59038a9f5ffee08b6b68e9fc94f4e61ed8f08ddec2c317bb9666e8fd8269edf5c1162b40a41e54ca01c28df58de65fb667e5abc0677cb3be337eb698eeb18b130409bfed1ecac8e6624205d863bd60a8572fa21d3d8142b1b690f7fcf66caac43ed4acfacbbce9edfdc0c9ed7de8acc6199374573b098373c0165ff58587d2ee3205acff31f0d04be4bb3188008e277c318911c8f50b6dcadb01bee9363e8568821608f060d6589935a52a8dcc980ae5b297db25d5d881c0d16ed227f3eed7b4fe8589bf1f03d1a02c89f30a6f46a0c5cfdff494ece88ed75e1d00f7f13495d7d25eaa60838435508837a9019406e6e2e0b5c0ce9291540946437828edd795220dbe189d023707f5be3f8bc74d059d2fc2e4609f3850af5a05400c94e05bdd991b96574d8c3312ee0da39345d323b657d18fa37cd073d4eabf813813842025c00b6e8fcb523402a76e8f85e90029203cae631ce20bc6b8b8c0c839d8392990c4e8a8d8124efb885229c674b3ae2fdb5e55c09d41e2fc57ab482d51958ea6bb00fd0806bd43dc573cf5119cb90179fbd161f3fa3b63f49b4be3935aa79cbb75dc539d5af3e2af9f7aa6e2caa3cd7ebf73b36ff0329ef6b1ef709aa4f0c6bc80fab16161920bbcb47317bbf9ca447086e3029dc04d6af619745e0e9b5352ea7b45d4635602f38433c02d22b102b511e34acb110ba50c8407aad88147a8a74b4563c3fd8009593e73800fb2ca621bbb007ec598768c08ff0018e207467d7c75767764d6de783b54622530a288213d5f246c05cce42ade08430c83da7f663dd8cef4537bc1de491e7769c317a2840b0215ea11e49868b8fa85c5968596290069abe93d765d2bd0df35f3ac54420cc566093c3f8604ff560c6617c49e260dde750b23068685e24f38d4a625a0854e00a4f8f4c372099bd8cf4053a3139641ee2f4e0da829f582a0342e3d2f4c44daa549335739f041529d98da68b39157b9f28374d8024f7782df9709bd611251d87aeb994486e32299745568dcac4f71b8fa52dd3f7bdbd699310402a60389a98e87f8408825d1afe8d328db9e427b0a8cac7012264354c0417b6f79bde79fc245d064782bd945badf6a55c5bc28b4a7f423e07213fdb82f922dbd739bc76d3274dfe9e01070620b85de0ab1caab50adf8878a65c14fc8477ad21b521dc96428ee1189cd957341dd71da6fdb5cd8e2ccc6adc6d4b938de3ea8d5ab9b4a68650bbc0c39af4c4672eb3fb7bd6504ec855dd2bd70a56ee173b9ac60013a401c9df8aa9f1d5cdf6dcc68d01b5363e219f6b270d23ad3e6fa5c0fd92f2a5ced1b5761c02bb5119d718a700362b57087f951eca2a4dbfe6fdd400de0f35a8b00d07097a49af69c9d274cd430407ce43633c9198f0356f43549b8a1b1ef7ec8bf59825db09da1e2543c812467e1a052cf9385827980512f74baf8e99b26c25dd187ca65bee1457841a1ce666efae8174c3ec8260b51cfdac0869700355dbc6b2340f4e3297217d60727af370fa53749fad8e6be5f1d2ef46021285075fa2850ae7aba1c58361297bb00224d5ceed734dfb55c5024939b6e151de9d58449babd151eacc749ed4ce8d72ce6ee4ac744981e7cd7d4d5190ddda336a7d4003b91deda494d709c05e966ab61bab20cd94240c65aecd9ea83fcd5c8848410c2ecd3846d8aa74c0d6607255760d469c617dc5a7f1a56cf012fd5ba6236286a5f25015240a7dae59e2631e8b8e45695749b7fc439f5ce9e506dfb7fdc0f8b641a24ffa04ad588aa06341ac803d581998c7e9f043140ee45c49a5fea13837acf628272dfa2e3725b22dc68447b6f3417dda8b6c18c0c841e9d51d2ed9902cf8791d86f0b02d36562901d8f2bd94de5e8dc42a1519ed79faed024f37d5b594a99e88475e8e696f331a8bb11b3b08ca3c9c83bea8e9317c6bbca50ac8af5895695ca0aeed4c0e46251fbb42c4c2b443859ab7651c485b6b5c0fcd2522013d6c67a71aa2f694cf8181210080d17ba2d09350b247f1542733da1340e71307e3e65455d919be39b1c0c89a706abe4c9071d4264260b0741ecb171f50ecb4c7af719725c814f3b659540dfcc81635ce002a881953e73ae820a3f619735acd5563317c9ca2c9cfdc6f1186cbc0f3a0049da9a48251ec4a0a0f184a94f284c4dc81775ff80b7393d55a9c9718048906ee3cbfbe4afa98d04dacf34c1f6ae8178a1dcf4dc506302a47db215f41c6882fae30ffcd4895c1fc29eea0ab4f1e408ee524238fb89fee159a4b4689c93bcc996bb84101e2ae384357ba12ea0a385ee8d732cba454e2e2a228fac4f00885ddfc8ec6b41b71751f54aad450c9d3b579053fc5e2ca63e9e218670d03ae611b95ad2e0ce99d121e838e8da19b4661891e1dae187acb65e9e736a933a69a2007d99d0800d4f8d80c99bc0104f82cdeb74e5d87266f338620375ea0eaece3e8f0c947bb03c242812390ce5dba87233a5616c6ce4a4511b521ba01a94df9d09b4797cc31618fd31a6f580b459abbf2b85a9cea7df23f83c7b7c1022906e3f1c732c55892a1c05913dd8a3f978479199306af9909094559ceccbbc9b478b803da226014acdb0f7916cea6a3ac8cc245521a55b43dbe88869635a32d3e888c2ed31e57e7ca58674f04a0f0c84b2b44b2ed303fcbc786f5a87ef621f54fa3ce627b43f9ba507118ed287fadd4a8c178157eda2bceaa382ed7d0fa34540f59398f6e5383839dadf0b48894c20ed87b7ee5860042244329e4c808ce5e415e5544f36e6519634ea9cb989404966d58ff9abdc6c1bcb192efbf8644daf695f67126e35bf7044338a521e6043e3ccefb4a532e0edebb2afe324fc5b881435e8aba566e074a63a80405365498bdafa7d65224dc872369d3303ed1990b663c7c121d982954b72d01eb2f0ed1758c33e128de63fd98ad21ef4d3de721718ed38b7da63c2213c504585a86d26f4d9078d8e3a0c2955720104ea0cda5e0b2e17509313d95e4b6c0178e7b1099521d60e2a0ca77dbc45267d0505c18ad7bf06fffa50b9719fb06ec1570abd83112420b56d8369932564bec6ea213653f0b3fffd3653a67384096945d6ce04b20f045d231b2137740d1b446251bb59a77ed0f6db23c5810e716901eae9d66d09517edcafd61d6bab50649d469bad4a12eb7ca782c47f4e17d91c357682b01613cadd94d3be5b12ceb853f5cf90bb4388244f5b4e27ffdd5b8ab7e1846c42b03a65b95ea8dac8af66cc8a5e03ab523fa8f9ef7a3bfff729685e6d01f2e1a8938b46671fcffa88036e3d8ce186f7dfd5f6ad653c5090b1c6b05cdec584a9ff3e2dd854986c3dfa8f96d815bd065294ca7fd73ac85bd28abb277f003c4a674fc09c0df03827755d81ca4bbc36fe40b34385e09a147cbd88f4591018c6f3a05581a978dd576e92cfa163c07ff09c03403d0ab6df6edc01d1a99a77b8e9f5e7ae2c3fa022035e545ed8b272cb1c61417dafadbbb6c90aabdb0b71b04216ad1af0fc25e295400c5128d3319be35145e22de31f8d1af06eafc8416f8dc7bdabff8cc27709b3a82c164eebdaece5ed7697860f9a208b4df0d2d4878de9ba80a7fb4d19d42a24a8da5efa11bf4b9ea2c87743c06333f05402ff0d3c46d35a893683e0f42338cacc3794820018585e55eefbe0da44c26e327a0a231a7d3b0202a6e3b6c0023da06519d3f460356ea1201e45bfb04b0155db5a9a6ddf9fed77c31b111b4cbcfbae3de8815786ed0b5a5dd1e5137469562f46e83c69a7b2fe48c652c50a8d989c7324f9692319cf31701336e86e9cb1c2dae7d49838f4bf155a563ce1995b22499f63ba1095b9d11abcb05581a963158c5cdf7ecbcaaa967a478933931ca640100faad509c258d287a80015961659c9fd6998a256c7cafee841ee0d07d71a118b583f4e5a72b9c741fc7569a51bf22b2b5629364ae0c30be3761ce0d19de88af904654cacd8016fc23a1f263e5563f39444302dd93f3215f707c437b886850b14afdf5907783a5c6463719a77ed6bd262e766b5b962f2655c336de6e2ce619299a26f38c01f3db9181d50f6050f50513c029d1803300345b732c5ad8933137106551307f8e38ff544ebae485ab5a1a1e1c635e88171a98ad4dceaa58aac42a4fadddccbcda132f5775cc50df07813fa27ad3057f58ea360b8c46c208a29a76b21db7d448084c3a4aa49dbb0c7afb078995f832786c5e3e93eb6756a677bc0bb48004accb887d4e4521f91a2cea4262bdcf731c3b013298b6c48a59352cb85034ac57b6b0a2bf9dea9f1fd28be2f3e75268973ab27ce54e71ab90a6d55d5f7f8593144207e089462213fc7e70394e3f210b5891ac145862a9ca86bf89ee4c5b4d5c05eb2a4ef39ff4b8bf28e9ab13809735d454458590fb96df64cf8fe493b912f6cda05964a9deb7c8b6c52bced696e03c1b0df14ebc2d38253d3c9c6daf02e0288449316efd99a91538205bbe77665c2ecf18cf9d5b6edf725d0d2bfd90efebf84b4e16a39cf1e859914ae7d8b374e7d4914a4e81ded7a81a76d8e3d47102327254cd5488ac3d1301a68942abf739db645ad2812f483cdefae6ae1733191503c180b6dc0a00f317302d93c90ce7a44b2e7050aaa8b8d7e3787e2135856fae1df7c2a1c04b205c35545ffa145678d6500bae8b26e50ff566066bd7323a6c38576ecfd22c8117ed612e8583a8a888378156b21b9e309309673b83b053152f554a5afd7d396b7dfd53469fa65d7def613c99911c7eb9a9feaf0b71e183dc4f27b40a788ef14226ad9dd8f7306e63e1156bc19b0de370bf66a2e4b42102a00213f0f21312a73b012b16f9fbf0343045600009f07d637f37ac9152125777daf4ce9f9ea26d322e97e155c5cb994bfa74188b51434122b6028e1aa76af94060008c6c9f6f739b30554340d38b95b5b7910c0ecaecb9f9145d94ccecd6d3b6d7d7db348811e2d3b73d5da3de087f7efef63347c99d4ff02593fafe4529743c9ee9d3b42f39a95dd531fb4991b542a2f8f87086ab16e1593547f0ed2e6ac2b38aaf415138e44deef0bd45370f8587375bfdf4ead5317317a3ba70f96e2a559aa823f2333ba2f4166632ed139a8f44de20a2f9817baa712dfbbffbc8e91ef0764a32be47979cff998f324053f7bc5b521d52e3315e561314ebe8d9b181af69d25a6e761d164c43c0bbdacc8b5c569748f168c4f46f30379c273e9d57de3a510483e119156ef605daa251f13ceca2ee56fffbb5e582ed5dad167a9fb794b13ad98860fc245a460c30d84165fe65754089754675d27f2b2206f1be348c398b0773e96b4db8a8cd841e163d0d6f34cb21fc8de95a320c12b43006f94cc088407d525d3f90913d93b3f610ba758fc05ba2bf73f61776833d65d7ca4310648c5864024a8c81415c3979552b27769f6beb1f7ff58165fa53bf0fb3ee5f212d4a5baff604c6ab46ada9d329c30adddb3b6fb4c688613c436e7f886dd3f45cf4426708379e34dbc185ff6eece357820ef570ddea1bb44a670235224c4e102529558c66ed3af19214bb09eca62098510bcda95323126dc870ba02b6c270f8f32b4c204d5bb00151328c3eaa2d853a511ce35f6ab68d73cf6b922a7d2849690d4f2d14b899f33737ce9b7dde3874cc95827c0c93e1cfa5ec2b52f14c275998f6810b903db66ba750986d9a9397114d41795f2cb7c2f0f29d29aa850ac051c737bd706049d4a37983293eeca7483fdf38aee9d323736dc0061dc2cc90c4fe943afb8c7a6c48af1ab174469dacd3e2393255ce016dd96617dad1cbf192ac3a4bad9f5130e76bab322100a21d2d43e3ad0d872d3c8acde3194edbf22bbaba2607e22001e9c24f16834379a8adda23fd14a5c89d2c4a759f3ae21b8738ee441f0631498a2f65214f70a1a485039a5f470bfe8e9d2e6677f0b014faa2f7a8df5294830de7c6b15cc96f9180ff508553b6964f6441966e33c95f36ffbd733d09fd1852b9d8b350a716d583d263af396f178a5e7812bea04fd20811acc53b9fc3c3b406be7b2c0f3089289a16f0155de5cc9de76b42914bda52b1f59bc5fd6758dfcfefc3ae4f93daec8f413bd23562d81e5c148f4e336c6d5f0c5531c2af5909dee8c638e040801048a2b276524549d727392c059331dc7980194140523d61cc04774b6288b06ceb38320a62f1398e30292e58bcbb64a6e6332c3f225111418fde9e026587a093905dcece4471844aeb97fcc3337f496139d9518628c362b1ad792f7e5b874bed837ec1c11b7097d0587b2977bb675da3b51ee19eb30f51be963ae2d10390b0d1d7892b7a360dcaa5fcf5dc7d9e90d801c0ab4f121a8fb0dc1e223d312e4f705f2e5c1008a74623840ad6b009476e7fd13438749b1104628c715371f6a32238945b11d42bc3a11304b15c9ced4cb07d9ee49ce98495a9f9081ed122374f19ba0285eabb18c8121c8123a0bf40166e3c5e7236e456eef743a4492b5b9e93f481e2aaf87295c3580f621ecc0d4bc42fd9ea42ba62d1477044ac177ba5a305c15271d994da5d7ebf57abd3e778fad63cd49eee2ea527711d793542aee8b7a21250b13bfdc5f3ed970c0023080c381011054cfdc0d73794c1f56832d58c4df8d642b002813e6dc07a2bfadad19d9468834b237d95bcabd03800bc00b440b2dbad0b7cd062e763eb0ca068634dc41dfbe1d5996691fb77db1ab3da66338fb68ae3679f4856a0f6177f942b42b7571648d2eb6f0674ae559d1659c3bd93563bc9af14e95cb55a97ba9fef1e20d27913b6f830d5cec12362719261176756c4e264c3870e78f3bb387530d3d486247768c58112b92e4cecfce07be31c62d79e7fbc793b3639186f6f9afb3dfb61bb80da4b2433b0a0eef6af7ee16232b0343151f4457fb022e056787495c1abbf1061a0fc714b6a8128dc8f0584295188b745c2ae5e489425c0cafe4913b9d846cdf981b6df7a1f4582ba7529a4d7df4f19057023417e471bd49e9a37b42421a69442a71a34f725f8ce1915e12c3eb2e647b6409d3c3db0937fa646cba9d70a9361d75ea982ee9664aa9ee46694b85a1e4a704490fd7c07aba0898ecd98a80692c7786e8150d617a30d513c830d6a49e4c86084be7a7c0c8aa148c663202c3a8139d70e9b716dce8935d412310f4eea76fde923642e970949cbfb5e06caac2c0c04c18cf48eac867b8973c76374ace2693c9e96447a7d3e9a59bac0918f2b597ba1ca99f4660c8a6d4519cfa442f919e9230182b61301206137de44eafe8777cba1ba04edb4274c99b91d6136968a7a0873749dd44de58100ce5908cca215cfacd05a7f5d52a9f87e83208aad73eb241f6f4cc908d301f41c2d4157ac87530dcd62e984e35e5a7ea46cf3d71a94daf44f45e8fecb91972e941305403199c3ebcc36097f6a5e7222351e8f31c37efe893dcc7895a76a2777743bbfd06721ddf548a879457047a9cc3452c402f7bb8d59d5e22e11677ca973b1475eda7f7ce0dd44fe76f3b7d25a7d34b523f629a1c743b3a0fd11d8d6e3aaacb516f021e216f0a0c4fd77eea72943e3add7b0988f2c3e8a8a34a1f813bb4d227bae90b250d2e25bdf4c921aca2a28744a74fe9d08cd26f37b08cf5061ae2eb8956216ff1b33de4ad60db700c0b64d98c3f46f4b0577bbf7f40209b65d916923ddc4329f7f49c6edc44a25068d467f042eee1420f7721ba28a5d48ee136ed1b5cfafef1f8f666ddb90e071ff46dc4953a7688a79cdc213ef5e1e11e4672016fbe251d72e96d26a7055db316a40769599665da41df32cdc60c8c399d905a7b2ea53e34ebe15606d22e4776fecc7ab815df48da27d2c8b2ac87529ad58470360ea685e88155f330ac9a9a5741976010ed02810488ab1957cd741220aee64150827216c1aaf91e1630c00ff338620d1502441af43d1ecc3ccb67e7559e70e57f1e7b6214ae7c98c39d991121224bde66aa842daa84ec73e704ef7c584d9c72a39d37b66b029735a48e6c999f5e9c40bb640d15d93253150c539ec737aab21a556c8095bcb24c4525b6b2f3559125b6e8393b334f7a9f9bc447e5cea9e283bc6ca50fabd0e0f5a9ce953a7332b34fa60629c5e59e95b91f5458a54a39213b0753183c516140e472d65990c7c6cd3b41dac6795782a15471ab8a3e41dd0f2aa108e44095950f853e1e9d4516b79ebf1e0810c410444cc0474d133752f0116ef127af8a5bdd0f2aa1e915f443052ee8077e0555ddfdc00781e11155d69038bc7b3979c85b63943558891b6badf5dbccaae5326b41b5ce7a813009256efdc671f5db516fb3a0b973de3b6bb5d6823c64ecd6575046c5adaba85a03c316559eb225144ac8054ae0090d755c9a4ad11a73297dbc26df441f0f1f51ec982f39caa5c8e40b2b10bb26242127d4e40beb4d9e7de1bc26e0129789627e3b293131e9ce1d9844d439f19e455689b2ecf42652113763138b42d99309f5fa1218ea30fd7493975cf4279f350143eff4454e996a8966e0c62cf23c91492a95ddc42b79e8a5ee7d47cac424756a9212a5401e25a0900c94fec3740b46537ca12f812a93aa575d02dfab265dc725fded7a5fd52ed34b25d3f652c874ee3f4aeffee374d07f445e4d30b47d1726ade861dad58161cc258d4e1fd3a36f87e781d92938bb2fd52b3ef7fdd840a097d124284dcd4e5bd8625cc5099cf6b3ff989f608c979026cacc2fcac88e63e4217e2271c308445fe6b7ab2fff8377e72afe877dff4736e77f343841af57f23f625cd5f77f54302c2203bd7bf948ccb79c6014fc06b71879d2c8497b2848d24ffbaca735a452e6d8217f822dfa30abc0c0cfadcf7c983a7aae7d36adf5bc54eafd68c4f464643ff05cb8c543ca68257844d06ec75537e7c5967ccf998cced975d62ec7bc7df6c95919bcd76e66de773fa85c09ce0e87fde411cf1d0e06e70e0af690778299123a979ec814a3da3449d4665e0d594edb403b6c2fb8ace3108b88e5914696e4954226eeb4a1b4921d523a98bc386141e126b7b21636f477f07674ec3dd58bc5b2d281484faf28bf7a455f3c7edbe1ab219f131dcedf54ba19e6de6ee026b74c3a7cabd55567f9964337c302c2f0562c2b1dbed5599ac562b14c67b1582c16e92c168bc5b267b1582cd69bc562b158a1b3580360098025c3e2ce625d560c2b00aced2c16005836583db0b4b3583558345833583b9cc58261b9582d960e67b162b064b07860b15c582f2c18ac1767b19ca5c2ca81d5c26281acb35cb0582c560aeb849562b1582816ab9ec5621d876e86350001c8dc980000c0460f3568cc8071b578901103c68b4b4b0e2ae05da49ca450d26463f3448944faf89a4816bc011c795ec8850d2e4020100804028140201197d222856f28b49da09c741ab703aa04b5e9c07707d00b5289546badb5d65aabc6e28d3cbe2f6ce53a2eabd96c0d748d71e070b9171f5ffe84743b7cb2c74a5bd33161a26157e3d9d7cbc76b878fcfb2fa22abf815e4d2bf5ef42cd0b715795fb00eef1f4f08e8da8d982fbe79a70dbb367be3f5c9fb8d05bbac0f0fc8a5fdeef70ebb36cbe3f5dcb6825ba8f75b0a7681ec14fdee770dbb403648bf81301276f1cc434e72b110409f7bb865dfe71c76b1cc43d6b9317d26c22def7d7e825d1c00003c64296c9c6db815baab7b78c8b01a34fa120b69845d3de3a13c2291dcedae8ef58a5ec6786831c1ae0e6513304209c50eef170f252c94af1bc61fd77cc5232ae00dc0ae69430401b8c50f63cc458a8973cd58af5a2cef6eb66917e835038676003602b0b9f41c6b97169301437b633120d55ed6a65df6d52bfa0080a10500f3d8609e1ec0d0d678d178d9196068616c5ca0cda535565faf7665b11618a678e8988c8ec500c3148ce679691e9757cb4b65d3aeec156b178dbd7a459fca010c539e0a187a1968933a18a63c1760e8c5ec0a0ced0427cf6bf26c381bce8693c3898d0db754a7df9ee0d6ead4e6aa423e38a47258c981efc9c777db5edb6b7b6daf4baf8252c14185878787e7d2df60026f001fc3a68f2feae3bb8162b158ecd283a47f7f0c835eed02d9f4eaf502bd4036201b900dc8e6d27fd6850d2ef8923ebe5aac5d9aa6699aa6699aa6dd4b69f16a97a6699aa6699aa66936844e504ef87a1f5f1b6b97b5d65a6badb5d6059732493d86edab5dd65a1bfbb2b12f6b636dac8db5b9f42d365409ea721fdf1a6b57adb5d65a6bad356507d3a9beda556badb5d65a6b4579412abdf8f8eef0f1cd62edca7878623c319e180f0f0fcfa53fc9bc51f66a576693bdb257f6ca6c329bcc26b3b9f4261c128598c6da457978623c319e180f0f0fcfa54fb170aeeef4d52e6ad32b7a6b5fd4e665633d1bf2f14429fa92ce077943ac2f94e4e5cd871bce862305b7f8b4ab696b3daf53ac8f2fcbc7b7d2eb40dff4db0a33f3d7b3b9d2d08b2fde15bd8a7e853e0722971e87292ebdca477f03cea507a1b8f4df1397fe1fbd0bfa16402e7dca073bf9e84dbec8b4a427f2ca54ca217da31ebc4fd4a970df52d84a1bafcf46d0906fb8e15cfaed05273b2dd268f046a446f00dbb9a904f64d1675f280c9145df59847cae8eb4018918c33ba1be498e06e7f2e3e5c090e5c6ee3cec4324baabb8b583bb8a55717bf7d1b66ddb48bbed7a0d5e7c7de43ef088be0fe8383046969041dcbbc730c8c39e7b77fec2d9cc85baf321f592773713232b44e28e9ea1dce4278fdd8d94a37c33f9427a4dbe49ce44883b7aca02eec8e4281fea275fe9b1cb81c345994cbe50476ac46374fb928f87cc221ee12696d1171ed1f701a36f277d3c460f69ee68863790877d3aee8cabbeb0883b437ba89b81016178037836806ccb6c501b361ec302f862aceae1960d1b32b3f119df667c95879edaf88d7a8455f3363e1bd3363e79eb974111e3d60ac80282a12700f08879eb8ccfd71e1b9fbc333ee3965bf633ce714b7ec6bb6e6606fd324a6fd40aa2e05879fdca69ee56ab95d33ec668eecacc0ac5693a84e914dccabec9092b72c3fe99b076754eafe65bc0d05acf638161f760c1ad97ecb95f23e156c83bddb3154186ac21e3f36d84d8ba9fef25c856eb329f6f1e6ed9f87c1fe1160f311e6a498835625c216bc0f87cb914628d97cf18e6e17ed90ca26abef5653890aa79992feb4154cdc380f16c07b2653e86e9990d62cbbc8c4f0691359f41215be66dbc80191551356f781684d832eb73f84b3d0e2ff52a8f9d0f2dee4b4d41b901e524b2eac197faefa5fe2ff536bc4456bd8b97c8aa6ff1524da5941229b2ea515eea4f5e22ab1e06189a3c918928940a75251d175995db501be804d24c9a8dacfad15fea4b350365f725b2ea43edbe6c73069146bf3c9341a4c19155fff22c8a484346567d7906c57ca101d218a650744ebb7848afe6ade5213187def012bc8e0d09a912bc151836099809deb652c3ad1618cadbfa8c9482618ff9f24d5810aff57086f43437664458f5f2ac4837f372baf22c8755b3f518deea17afeb5e3773bf795ca7c00be7cdbd8f612905ab70b6e664778387532134687c520a5ecdd74fd257a4e1430ee129c8e08512677ed6ccdacd64200caf6635a748eb6450704bc6e7b39b4823c6adbd2f8f6c93c896f997cbf8a88f189fbcf406c6e73b89cc5329cf6b992477d25764cde3d0f8329c5ecda984279f3d9c37d4751918df0b0f5f6ba6f518be1f8f18f2eacbe9bb9b99416f839e071c6ef1f018206c9cdedb50e601b8054300803c8ab83beab35f7639609c8228f21e8aac2b0fed4591a00f34f2050587fcca6fc8afbcac7c059cf230be70e52e19f436e879c87e5bcf7e9071dae5a020cacbe9576e9f7d282f97cf603cb4282fa00f34f7e5f22bafdf5e62bc7c28385e0ee3375e0ee3343776315e0ee330c0094e56ad3c2c62e530049057e632c0ac0c5e057b645d0164fe22655e2f41994b7087cc5fc01d77857e61057bcc2b737f683dfb05630cd8a3af8d07200400d8a32f0faf3c9c0261030ce5e5e1f43c7c61129766b754de0211ca67618fbe3c8061052e7dbd54d6f7e8d8c530c5c99e81618fa63c85470f05abe88c9a8b83822fadbfbc7c863d2de2d6cf2e078d0543dbe1a07f794cc39cda6f868decaaf11ebef2c82e1a87f11ebec82b1860686fadaf41e38bbc5a0143db832f8cc3bc7e77ed98f19773f743eb2f971d8e197f59f9a4fdc222aefd8c2fa4b933be7157009abbd2e5c8b2d7577065c66318c6d783efcb37c9cdf876d8bf7c83f1fac9226e16ef4a0ef9fad8adc8d7d7c30057ced9efe533bef817fbf1cd5e6e3f1402c49b5d5e9a8b82a3de9ee6d6c92a5bbf32030c93b82f77dd65e37d01677cc6d77aa8e3ba0ef385455cd7e90db7281424ef200f7484bcadd6e9d728f06a4c8743dcd0f51ef3b63e5badc7b0eb9b30ca7d31876645589593ad7cf16e95a32b9fbc5c3f5a69fd6c952b3060c4589141c10c8787674432222b60d6fae4e5e13362de309391ddb48bdef46a3e06185aef86de641308b78e9813c6ad97cfcf9a974f6ec1f8cbedcbb76ee6a5c11ef43c621659d0dc8d7e1148dd1df42b8ff1455b3ffb6c63fa08a4ee0ef995d3dc182fdfac05b91c6e51709ed4cdd8d39bca7535a4b9dfcb17729782afd9ed512f8c182fdf6a566be56a6e4839986ca9b53e7639380dc8968a423fefcb638028f4f6561820ca0b788d98940814ec3abd018bdc799a43843fc5a91477ced7bdc96e3228c6e0c59a5073c3ca934521b6549f672b48de426c719f671f4ec2ad179f2e9f6728441a3a7c9ea9106bb07c9eb3206bb03ecf5e88357678cb43aec2f52618ee7c953a95c7e5137d209f2dc4d8c28a5fb87c964f0b97afc31723ebc5c785214a95ea0a97a58ebcb11f078455960392651fa701d942296c050c8988476ef6ba72f9b892add04fdb6115a59a911bd6ccd6ecd3ac902df40ad942c109a24829e67c0e5f9819e1cee3f0855911eebcca176644b8f3377ca10de017baf8beb0459862c317a2b8f8c293165f6892f28525285f883a997c6129f585a4922f1ca1be5074c3ec260cdd30bb09bb5276436f42cefbc22aea902a716384bc61767373e7411336a45d51a6553f27ce9d1ae88a32f393045e18633d7b6a3bda4eadf5f6d3aea0af9f0c42c12646e085f1d5a7695aed80116847d838904d192a95cb80e9c1863bef9952591462075620043164600640f0c9a289580c0912ca05976c0925842009cc0a4ad80c2183112748812a01052708e902fd2185076c40050f8450061cac200a5700218786035988e2044d6080091c74000a5db8f3a65457c5058c20796ee812abb42ef1bbb8c880e921ce0d5897ed8a20e091e0721817192e9e8b06d39c10842b58e0b2691f8ce67217fae30a988b8b0c95ca5d5ceef426bd3307044dd85c64f00a0445a09a13364dca6c5bec14a0dd824880ae3d9c004e10f620fbcd726b9f7d4c4b22aa0e03319f813b28c8de64e9c34718421840f053869f199ce109718a40480d3860831c5cc08923c8cc1d2740e1049c3bc1f0ac9a9d1026ca8d547801e7ee6089ee8e9fb4fb737677cbee29a482b657933ed415e86e12e732b0d160a7edcf4d7ed1d6befcfaf4eb31af04e337250d656982adc4c697a22bc6887265e49e19f0e463c7200cef57b2121408e2810d28a1020e402104324e5009e76481b1aa1bf6eea1cdacc3c1b2846ce967f3eb6f14859e05765986dc18deb28fc5876c99afcdf2eaadfb9b8f5d0e962564cb7c463f997ab10f07a4b87d5a05078888e697b18c91a572b34f7bd33e48abdf8e186918c1437463644d56f51b0ce933edc6a6b9f4ebe8b5ce1655421aadcb900e813e80c56db9918a0fc02e0874eedb69e3708970d65acbfd24b1938148180f176a3764188c63200c63552739c2ad20220d1ecb2261122644af4a9f975c0dee7c284350a37164cb7ca831ac5d4d8457f39c6d10d6b1791034b1458e51ce50487381d031f0f85d87a36f9804e9313cd0b7185ebfdac776853bcfe035cf3cccf399371336a72994300924d288371657f3de4629dd6c9f4eb625b7dd0588eddcc6711f3d9db8184779933020dc327d5ed6441adde707ee7c573184d840881d93356064cbfcdb09777612ecb50f857b9f7bd7ddf4a170dfb87e710de3b8fb8834b8cff78fd8af7ea251d022680e7099e9f4edc4712527eea8a3ced56ea6a4e4b69b2981e171df46dc68b4c168d65efbdac6932d6f38b3cf6f57b8f3dd0d03c29d313c49845530edf5bbe70f2fec57fb2042911891d89c73cef97abd5eafd7ebe523c681b618c78dd3384ca48030f57127161c1b993f38ec0cdcf9067267fbe857cc5acfb3b190a738833755319f4efddcf9ba2a0abb1348177ad64d24d2883d6fade7354fbfe699b04d784fa4a0b8f32f96e2ce47c930564d9ee6c0d05acfe30ddc79585c4d582c06db352d8687c3e5582504abe61710591304ba06d248248ddbb46bdbd370374dfba66ddcc6511269e3362ab558c79a48e7441af69308777e563184e88201426c81a60e15729c709370fb49405efbd087b27dfb8ca0da77e4c66d0191c6f679064421b8a57d52018b1d32e878e1cec6c28c1189ac3983105747a820859d26e8cc23e418d19d471197f430f4d2b7d27679e70fdb45177ddbba19ef5c37e3791f0c6fa3020450dced5991fb1babc8000caef62d08088050f1012457e5462a3e9073371bb8ede3db7d3de6ed6e6c17954aa1ee874df4a9dc92e8d35edab68deb6e6cdbe66da51157da385276ee5a97637b76dbe1c8be6ddb6328019adb43725fe4c943b46936940144f669077de1e8ce6ffbb62ce360da15040f56a48a10715d9eb7d385a504e38946d17277f48952e27acc9bdde08efa66e26278a7d067e8a77740a85ced7207753f843eeda84fe56a0f15c1113a0786f286420f9de6c61b3b1cdc4360282f77837be81bf769dfe44471a14f3bf79d3e23e80d674ce56a0f7d2a772be14e33477b08e4ae06ce18ab26169ef6fe2462dadeaf5d0eeddbb30ec7764dfbd6751b18ee28bd87ec8f44129dfbec3c8ce66960e880ab812103aef621aef6d9f9b0dd82e102ae06060feb902b5f779ae7c5abc6403c896c51e5fcc59e4e78f4354cc8266ce4ab57d2c666ce9aee51d9e67b3cc71859e30ad2def1b31c358ecda17c62323733e3d0257874541515bab36e06c416235c36e9b0e9e679811352f0041f34510407324d85db8d84db3a82d0d11144cae8862a190c893a625ccc08829850ab43089d20384687471be20b28a0b566319036b2f5b203ba7ea0012ad0820d82208405361a90e12978c1090bea6055bb622a38022666a5976308101b0001621bd05c605c64c02c21b32350025433900056871041e804b15d3e0ed1ae0dd4f101e698042440d0021a6430851b1f1996c2e5181666906922108388c707f3100e1822e601ac6a1ec9cccc0cba910a11f4dc30c64c5ea029e2f6a5d43e3fcbb16a1e31edbc735e66d0d258c94aa8e088e8a02fe46ed74e4e19782051bc5d157da0e66c94380085de9eb45c8fc0cd03b3779763bb22ee6e884e7feb6714de7c28034feb92c8b9a0ed0b5d6e26a770b9436e0c4b911d0743b825bfc52b4f67e48cc2934364f6812daa1851dd2a822157e5462a44c0c4f571e38d777b9daff576ce09ea7c6023acdab80dc7166dec268efaed5b886b1778fdd03c833e0f024320eab7b95590e596acb49ba931d630e23dacd6e1a89fa07db5df36d0853002f4f9edeb21eff6fa85aabb7d7b0dbcc87539be3bc1faac5e64b2c9cebed0861e8808d5e5be498e3b7db63d86edf6f8596b254b5943b97ddccd6ca0dbd86d6048f31869f4fc7c0c831ed3a2cfb20a3c3945603843b6db3edae198afa079fbda0131b58c1e2143b2e3413cdf8b9ff173143f636b07054320e28f90f4936e1dcf8f2cf0e4ce7b055ee85de69697c2314f4d1c69c8196b6c9695861a0c1bb7b871c648a3bca5dddd2de2297673ce1f7e3bb41404c35473e3e4ccfbe85fa0d7f092e1efc89d1a15584a267faef4e9559665974658958172e7c88d9734e3d8531c18a6bccac5ce314929a594524e125d9c94b7b1181301a910c1cee57c489906b7b96df472475e959049a4baf4d2081014943ba03c92d32ee97311981302c314b871905ec910183e95f23822ac92e720670e62328a9a8bc31057f25926931de472ededdd408e4d18782107b93248160a692e115c65232627f9417429e84d19ee8ebeb318656298c49d32fcf14ba669647348a0220b486ea4220b46ee0e37529105286e0caff490e3b4da76638deea147ba117563490bfbd0450dfaf032d2a85c64f54b5f175bfaa44f1455dd423f2addbe67ba7d11eaf64327b7dfa1dc3ed7209055a1fd58becbb7341e593adc061b5ed8e0c2c5ca458b16aa1629292b29282839a09c9ce0706262a262924add902a29014b50a80f753afd6432d9602a955c9448a416a4d12865e479289e4874220a854c425d97ea38ae84db36d406029d409a66d2ac2dd95a4935cb46d96df9d0a3f37db9234bfe5da471236bab1f5f2ae3ec908c2cee9090c9a0e7b1280949231b0484910ff286bcfe4972ecc831efc0e6ca679f3db3652b5895edf06ded11721e6bb7910959c3aa4cc2260dbcceb2aa23e3e1d1e16917bf3cc97365f69a9d5f200da4df2cb3057db71fbfb9ca36abf65ac66cb3f3676d8c2fb6a94e4424974d29cf3e19f6b8dab36f36e1d96b1f11dccd62d8727340b2d70930125f83d207abd8f4137d8ec0f3a392da4f273cd0466b95e037b3ee5a6b6d597b03f5476f069ecac5cede096fb361153f71e2c99a770dad198e9452d33e419a94de174a292e7f03753353c6899efea8977919cd28a89bd1a4949a3581a76907d96ef91a7a7f5224afe8b309b90c04aa19383f29a574cacb83aef56bf64c6add8c3dc7ad08a4bc21773bc7ec92a71214d29d76f6f292e646273c9b559cacca197923a1b89cbaf2e686d246029913c8d4be5aade4805c6e8acbc1a89493d3806c999f1c631a5097d0404545650b5316894b446a1345d09bfc662b6516d1944a71cde51803e10ec816f9f8188e5c03929d8339e79c733eb5b594da4e36a976856c61fecfb412480d902ba700128223b7c68d548440c8b5a067d18705e2311163928e3b37ce9c768181893f118bf9782927fa28eaa27bdf184582d5b4b1d45e294b29b95e72a5af9ce8a3b75fe8b10bc22d0bceeeee1afbb06bac8b6d74f9fa2485160c2dcbbbf89ae7eb23add3afa2b37cdbe08028110ae8496e06e714cc53caab5dd3344dd4b5cf547253edb39b01452055c3adeef35a6bd3d95cb690d263090788e66e956b1678dee7356e893e3f3baf6de6e5ab5dec8357f3405ea5cf12d8437a48f7cd23760e61d50ada87893ba98e4ffb50b07d1af4d9668dad49cd29d81579e24c22bd89be7837edd376421aadcf22d1b5f717ca2ba27dd1b5afef7d14c5bbb67341b01bc39b48f3ba35ed0ad9a25df4900abc18afc4e2c535a003b9edd3493694129444496951b40485f4d59fbed417ef76eae4fba33216e9217d3ae1a1d807c37e58758272aef9c1695b71ea99d61e42bfb627c927c952a27c210749dd50fe904ebb99fec9576ff2123e9160eaa80d55ab949251cc2c254b59b56e8634849a2ea5949e6efa66fadac7c63b9d1ec324898222bb197a4eb9641f2de46b5cf4100b9e3e795b7ca659039a803525e0ac6196cc2cb7669a8e6b77b2f254f2575976d27633a47712fa698a9c62327db2ab4da673dd8c692b7d2be120d1dce98417ca9f185e6791451659c8b015330c726c3f7eb18f3bb1e016ffa787b46b32f1c3169c38ed8a6c2d8873e76b9fbb2747faba1a29dfa9cb6720fc1cfcfa2de3f8e3aee676b16bcf5f0744b6b4a45dd701d922e94c81471fd39476355d4d07640b3dfd4862f18a52dee05cf9275ef24762f1f18b6b50e035abe8f9934d5cf9e624bf47c879f42382bb3dcf40ee7c0c9361e7b2dc480519a0b8db16b9ede3807407f5bbef03bd3ff9f36295c4e263907db06a327165cce6782f1e9876b9b8a854e1530dd3300dc3383d2f7ffa0c3afd30e66ce17a5e779df27b00fdc683524a2548bf9983df343b0d4160968572668267d5104344567fcba6083cfe42f9baf33453b9fda9b3c9ac20954af5bd4f5a2b6fbf0778df78785e0eee208f7362235789e4329d4f0003e88834b4ce2be9ae7d03083d745b724397605872c3c7f04697dd8c90d23dd2ed65496adb8bb8db91d8b66b3779bca98731c6637b4873b76fdb25407337500226a9a3dc5a7b2d25a5c527a4e429d6821240018598c00c98fee3743a9d4ea8ff309dfec3f493ff4095fcc709ea26a976951cf5d09e1e7aa687a91230461418638cabb8d2c1a40f04e5e3a5ef7bf61ee8035d520a8a9de80bc5585482cc3e7909d0dce89d48706a8fe149d02635edf29a7c949a263f65539a11e588cc39238bb7fd07680365df3260ffa3da5abd766540fb0fab59d0539a06da40fdeda0a8e222e3c6ed8b6d7bd5abe67e0c8f8e26377337c770129586f2f4e96cd2f948e93b9bb31fd39f9335b04595b0fadc5905bb05183446fa2140951529e5e3cae5ca57246863b77e5adbb1a56aad1e3f4ac556f7f894d87af158638d97c750acb1f295c3004fb1867c098c472a9fd81e10a6aea5965218af1f11a94b634c677bf17112f6e12d44d5fcea632b48d5bceae32844d5fc4b156ecbfc8ad7322f190cb7653efba01059f3bc235be63b055ef61901e32e7ff98cc8cef295cf087bd6e56704fd0e30be1eded5e1d9d7c3bb2db75f0faf877745f2865bd3da5a6b05ebb329563ebd977a0b862b60368514ac9aa31730b45e064e29389be28688d4a5bf3181276d9e9037373d4be085d9cdcd6efa2b60682fc130757b08abe614deb39b6fa7210fa98fe14991277a8ca2b981a82a42a4413390ac918113265b26e81604bd821b38351059f3a4d349e90cc5198f02a895c2a8b5c62a915a79aa4e8dddf9da236fed6b37632dad3ad58abaf3b2f28275d8b88dfbcb4a17eafea2bb0e2ca1959addcaccce388c0f6600b39b71dddb9a715b36543030ad19365af7ba5c36fe72eab2e1d2542e970d57066385c677b3b2a95c9fe1b2e172b95c2e1797cbc5356386eb8bd77ed2e5fa6cb87c61ccd5cfc56377a3aa868c70b815573fab35c81af1d29217af3bc291a2e4a65d164499b7e17fbf2404a24c10e500f6a127e0a00d60f3f40af410187b65c1d8530a1e88eecc2a78f5a09bd0bb998b8d88deb92ec0d51a64cbf6ec0b5543ee567758255f8db04aa248c1aa1e8223bb2893c7a3f4dbe426153c52776ecb28cc4597badd0461f3f5baf5d937a7e055245e77728fdda4d73e9a3bbf1edae5409625640bad4758257b5086b4cb471429ef61ef491f450a6e19c1a387bd28efa3e0b478c95168106bb4700152d363bb4447d118fb27ae40eff9baa0d4d748a22a05ec9ea8025df4f9689ff802fa059278c988be71cad73d28df11f69a807d24aa40dfdae4eb2391057a8bbec205bdab105b40df66ca27c4fee41302b332f629b07b7a05bae8037da35cca97fafcb28b92fabcc94fbe23ec4d7d4be9664c40185eca24f5183ed21980e6a6c046c22ad0b72cd650f344d69482077a58cae99d5e818e6283db4785253b252b6edfb453b24758d53c36e4a460579489239cdb1f350fd7c311f1b89cdbf7b8d8ed7b9d0ece1eb13d968743c2957278d56faf095ec8ddb064a764676a9a565fca291581e2e6f64b3f261fecd27c4a56702b5601c591dba59e862207372cf970355030e186252c6e3ff46e95ad6805992152703ddc32dd7e094fbb42ef97ecb44b54b2532ac2ab3e85b52b047220cc54429982558d12bb8d32e4a2e0941829e129d99951f0686eac3b573ee47ab80505cf88a923087679b364a7eb6626d758bb5082b00f3d04228192800ad8871e65ac1016ac3193a9c4d59cae497c7c72a23d9dba99931156b5941ca897253cacea921d9d76d9cbe7d857c5e2ca5a89a85fc58255d2fa28e5b4ab64a70e69174a10a18b2e0291a83abd920f8175880cca043d56f553bdea9bc894724a764a39253bf69ec8933e95cc2478f22659f604af450bef66377a97d905e74293b25659b5739fa1af3e37bbf64160c2ee04430afc5c2226ac040a567509ceedc7929bc8eac74e47894daffa455855d26155db1b96724a39d6f2f0aa1f41282090e5b1478cdcbe56a335c12e938d45c2ad58850d8adcf674b0b87d3f6334c0c20d35d8edae268a58450d3270438d89db329af474b815469d1d6e8514e659c1ad5885db3c37f48cd0cbadb0942333440a588996d2b89e5ef535302cb9094b76726e9feb6957f374b419d7733b2cd9b9fdcd062e66549b73ced9c49d555622260c012c63c1dee955f6fa6507d06462b55a8336ae0b89bc51462a9950273969eaa44589898b981242c191440c9a2e89492b3bd1c4b68928f78514ab58caebc4aaa851c38dbd8adcc4c61de4468e31ee581eafc70746f582619b1bc619127d62d12727fae8dcf4dcf8dcfcdcf0eb866191a757cc13e3c9913c3a926747f2d897074bd53c88ca2688bc71f151f59c27b5c331c70546e57255ea1eeb34ac5f6532192a33655a8665a48c9599577861d75c7918b6893e3d371247f2fc04995778a18545db399125dfed481a5931b2228885bdb18a0e24b952015eaca20347ea8d5574200a973ba7bbb18a0e20410c928a1dd8e5a9c98721091caba467f24c9ec94696fc1ccd7f7615bc21e24a874bdc818d97314c45eb63a3fc43aae1c64b32dc78e985e8b29f12494b232e979a541a37e299ea58cf6baae3d3d67a3e6dade7b510ed319c9dea509deda34ae8db76718d9c351b4806afe8b9a65329aa53a343333993f598f06454a33abdca3a1b59f3b1035d5845df3e3aed334fdf4b8834e8291362ab4f4f9d105d2e5447d660a160b8f431522d5c4aa97069769776b50f8bac613d7b416065b9f45bd7773d8595dc4aebeb4d462ea912552cb195bdbb7edd33cbe2d53e1fda97b88c0646917da3dd4c8330bcacb36c569cd929b14516af8a1f412e7863153ec6703791a453ca7863f217b38c6783f48bf194360babbc209000e7c62edc48c5088270a9cd1663b482eb61dac870b95125bab8c6a65df3876bda357334303c67330a84bcf3a75d5c5cc99b2c07fea8b05c098644b88c40ae51656078b03ef4d0b986998834425f78aa930b558ee356b7dcc621e5b9b886573327b6f0fb918b791d433f127a288653f61b88a38fa18f6fd794e0e51384e74a14dc480509621787e86a5d0ed10db1b45cd685645665a699b81812792352890b854221b0f361de39b9d5a10e8788f3ba6f235257b2a693e5341ca252974374fb9b893bb1e4100a0ebe6105faf2dd4a9853b32ff74530d47143225c6eb79c21141c7dfb7d1b0c93b8a1cf6e15162fbb68443acfdb2cf0e20abc906b98a0d9697067eea1d06be51eaa620350dc50096caec7fdb8202658c562f0e6c3f904b7f8f3865b3beab4e156ff87c801c13df40e477de8b186b699d3ae2eaeea4fb6be3ea75d51c67a33876b16743ef0ed8772782ea1f7c6719d715cfdfafdeea16f47fd81c351450f891efa26e2b22f74d217afe8312ce248a1d081085df4d8cd84bc4ff4edc81ee21e4a819b889b44f0660bbc11d74d8a2c49a47edf0d87d91c0a2b704d39b4884d2496913443d32564d96355d8e2865c5363ef248266d2916c01826dd247ee7c30b18a9952f9801bf689487137b717cee66969d3669af59412b8116f8337e26530c34008423064c810969e9b2f08a974c2a1c6343a25f9f9f141224f4c2614ca8432fd8405c94c32e7c7d2639a730373ce1a9b5f109e464673741acd9e1e243f2693e90709d81a7a4c23941e23a6d3a9449aa69e76a1f4a04c9422a38f765dd7733a15199548a72153c472e69c467a4cdf4627272258d9b06ab50a3253a9d1d7f734648a584e483262ea993da64fde911d9548a71e2986c4727a78aefc098542753323934904debc89450b76c4a205162dccef74ea399d8a24f9f139f9c989cf952793098532a14e7efa42224e925cc982648ee43dc588e42431d2d36342954828530fb766cf9ca6d7d32bcae4c3e2c32ac982c4f4b1f44c21f4142991e69c736e45e69c52957134b41bedcdcae0cd20d332cf8d37b44d42d264b66506b247f6c81e8ee3faa77fba7f9e100155b7eaca37ab98e0e2e242241623326113f60466666e261c416f77cfb76c1fe47904404706073ddc3ae2cae0e008b7e28d323838d2c3e3f87941941ff8603c83f28a2dee000ca74872ca11218cecf01840a7c89471ce504873f94f99f3292a29943eabb7d7586a51d342214d6ce9c5243391e7a434cb6aadd65a2e06253830989430ace2579a5bc170d65a9570e9d72d322232c22d7909a60060ce24dc100097250f072e4b50c4135941f0425528e229c1995e88514a5999abac999473071eadb55a6be93cd7787d0acba4949990fa189e31c6ec339395cedab5e76378b466598682a1609a06d3609aa651a69f10db26f0423eed22917e7e42efca6cd22c9bb47bce466100054301a981a13030511898b09a4d5a61192c9b9f10edf4138282a180b0cb724bca6a727272424249494931d5f909a9a7b567f79cb046c17a4e1da06074523e0a56b3af6928a7a0618b71da94df90b7654e8c524ae6988517b64e901aa4045ebde46aadd6da181eea15513e2e007a6d9bf668a794b2a3c64b789366f3614a7e548741378657716ed83d5feff48a1f4a21f6d92724d4cdf494a49ac8e24f1c7821ead573eb5ba706e950af209f2623937821a9e6b443aaa1326463b35be7a7c9cfd6db4b785dfd26a5340103ea85f28182a15e2660300143a4116fb5a94158d504abf8219b76d983766e2e7fa3a857eb5c9e968235480d721d4e7ef3d24f88a61d4093b1ef90b443aaf94841423635a8972642e1be2844bbfd6097d1c0d013211b5290cb9f6c72727242fa244a4a4a8a697e51c8d34fc87c366f3f1f51d4b770e16226a354047227b23864c3aad013a19b2a6cb81582762ed730c1a420a426b8151231831cb413694494fc502f948f2ff404aff8a86ea6c1900d10bc306473f9a49a5973f9a817a35e11646ba699f8740b18c8eca1aec6ee9deedb688c517bddb0078362a7317ddce2a9c62b2cc0d50fab98be792cc7b326d6844df7e58df69e40affadd0db68b6f64957ddb3737375a070427d5d5c4a87d5d79fb51cbb61ae16195dc892ce983553056b59474b34c33de6c65cb9f76e617abecf99c51695f69a8b1d58f1156b14acef31238ede2beddbe77c29e6dc50d7ba79bb9412f7cd41c9dcb604844efdcba5a4305bd78dd17383786575880563fab35c8160ea863a804ecd70a931a65aa66040000001315000030140a878362b158305145b9fc14000d8da65272529c474914831432c818030c0004000098010081999248002e3302ed9ebd577decbb15e557dd765d8334e0e23d9cfb577cffc74ec4038fecd5bc35b0a119d0c930f272a3a1ae0558ee0cc100b274c5eadd9c2cf8d029451d1fb675b716600b8e69f4b75d0bd43f911abee1da2143d85186648d5dd10fb59df3ed902d147c06747aa9d1fb85fa822388a0f613d086886f137874304ce61c93e75878a9e435b2c4a0268ef24a27e3d9ef1d6333ba599823b0595d1bad0fb265fd64d14e395dce27807770617ef15dd9755d37abf41bee59875acb0cd824d71b99b76e296b41b06210155196441e8367d01327210806aca417765dac381090bd700717002141f4e8925dda174e7d3cacf0997c1d8c71a8f2dc131216d2dd3757f9e18efdae45b4386bb5593e47679ebefda5aa6095abd63c2fe2162b5ad9c6dfd2b11ab819b242206a59d241ac6986c2729a963e9f1956e81914faffc6c28cfef7db1afd67bbfe4199c52f38435fb20aa8b45480eaf1e708b9428864d6add5f457d0e0bfe8b034cfc9f875e16f33d8648960695b19a74ac6ec49061cbbfdc6d9aee2c5e27c247caea0275414ab0c5b782e5d309cfd73312864f532103fd6ee7a4b5e9313c1fa18e7fd6406da3aa86fc3db444c63513c8ec38534392be690663145ac8b948992546e5c826cb52f63231709594dd4ce411237198a65b2eba253801e660d072257c75bdc74f09ce9338612d9715430d04b44ec11eb3d857b73960ce27e6ac4b668ccaa8b01568e92123e6262123f65bf9333bb0b65f0991098371494356308e6fb31f0a4049872e680d66418dc590a136f06b6e09a0a1237e39934cca2aab107469950bfd0fb62cc0c8b83f9360a609b79d5f5c892632ef63ae9a4d6b91e823b978309499f5d1a5686d2ef3e2887c45bec6efb2a2eef32daba0c7079a7cf0b60dbbde876a64f34f43f68868d33a881ee6a2e7339163a01c0d640bf985ab66ccfb45ae8da65570e59a5d468260165e996ee2b38429f3afdd7a12c738a88b1f4c56bad16b5917e932139f5fc1b02b4383a9fa3b3ab336b9294ac8b3a298181720cbff68e80f825ff870bc665be8d22fdc824059e8e1cfc61d23c67b7e17319f3702e7fec287e36fd8914d09d824a2f4e80e4bbfcde40c9877b23bb619c8b57a0e6b05f1c12be4383522c2107e9a49442903e371d2369d97984cb0449d76555e8cca3b2ac6cdcd95371cbda2b89ab872b06abc07b83a7bad16065fbb71e46f4d30558f36b29d3b0d26e967dc96234930df2283bd5f35a72ef569be5fc0883155e7918d55b009f5ae93e9cd079684f99b47eb985c4006b135ee4648632f3890b870e11ae960a70c79f32999ad2bd0e0b55d6813a60ea742d6f808a6ba741acd49e7eae1bd6f4c103f2d4e285f281678ce89d834ff2199f82c280d2286aabd9d25118870572f3e04d9a36a0547751fa260a3e0f307a19a32623463fbb96c73da88f15dcbe0e8748c720ace0a813d2b16a7acf39f62b22a6ac09d53ce7557cc1d5b31aa7b402dc8465824e5dcf053cf44cf7253299ab061c3c247785b9712bc0d79457260a4ef24c6fe8be797f57def745b0ed6c80e0fb7b42742a4168992876fe1aa2ab1991dac4eea23532916a58a0996849acac768b469e98f765342bd10810618d20b2d96da8944bec79d4b2b0e46caac9d89d932ea4d2f275f60d89cb519c8437ba4720f4ed59504fd25b523e4edb31f63a7a82a4543b8b3eef05ca583487b95878712d3f4da1d88b93e42d54f9af46d6f27e72b113cf9a9b774b518dd0a5450f3bf9edaef17cb7a8bb66c65780af482ccabfbf81d76c87fb2fd3aa51ecb069e5e9ee5923ec52d0189c3b98a63f218dd7c5c7329933c2288c6818df195ab473e732d1d7fe1a1a85e43e25d01f53b4b1021cf8f88817254c6cbac4dbac77584755ddecd60a7b0efef4588365ccf0e067ee0a80463bba5590ffba9da832509f2020ca3c78bd81320902cadc084f4fc5427633354a5dc4f934e2a740ee782ef88e8d66ece1e6d4a63ad00721c3d13500917c7f207ef43435274f33a278fc010e12768e47a52b7154a4b94107b50d92c2e1dea11e0dc11260a209b81cce254f492febed7dbec2212446fe3f22e871a12c46b47d83dea917bef7bda9e72580563eb5f3c4d80e2cb5f5ff1c53eb0d41a43aecdfb93af44f7e36fd72bf612a70ed1fc92e44520e436ccfb65975675cc1f14e28087b6f9f5b26769cb8e6a722c3a06ea18e1e7ec38abe30711b352da7235e23d10c4364f8c5f9bc2bd61f4f52f3a75819c673d8f77b176d325f3a4815abb26dc9bc5448dac62822a8a3d74791efe857a53403cdd3cae98b9cf26baf4a4bcb6059a6e4c871678a5abb07c8a26400c03f2493687b4b20df12e4e3364cf5107274b1dacd2c76765f8b8e8123ad02532404e50166eccd88b6485e2eb9ece1e1989a584cb7c43711e08ea619c1d102a5a5b6561908c884cd7f2b786b258273ce834c34103f4430429a21913cc5ee6ff448ee6b16e51a657aa3500ebf76a55b8e6978f15f141ac857225223171ff6383e08a47b2820c38da23b1b1f0fdbf2ca5c7cd1c055c61fb2e5bb78e233c313412819be9755a071a4d44e6eee334f95f720261aaebd5a6c8ee6dea5834a515dfaf7463d7fbbac8729d1448e522dc1d3582b361f89830a23600b537d91e6a755f8be798e54dbc95a7e84acbfa0939d71909b559d1fbbaeaf05f645070fe0d10b34a1a8ff5d70783b0cf2abda80994588d1dd76edd93933b600c4d3d8336d4742fae7e2369872bcb6e3fa2b88b2a73608727a8debb48d732f587abea9ecb5fbfc2cdd56b1d3362405e78b34690c2eade68c32f68ec88839b7fa71ce28838a1ea142c0c065c6e173b026598a7d24310368f50ec9f43f49844564724e226a47c87e11b14e34566521d6388326052d4c9201b6d91de1c51f8e9d54fca6bc5907f8096f2f7bf34864db1d39cc95cf6b154d645f0be1d91db2d9dbe328d542e1bb1b33c58444d6eeb789fab2e3a285e1ae9663968b1a791fd8ad1b6dbbe9ba105880f6f9b87a254612e51d6b41a0551b40a49ae8a9e87783418fad8d6e5131bb578b2113070cf15d7262b2a8133adb85e840c7bbe8777cfcb2bd0713e2df0d8761dcef7e5901e02d36eec894485a2dae60519e4594689ee33ecf842d2103de151bf02f639826fd3978396c0e9d01bedd9c27a7bc4c25b8ba9d4ddf8608302e80b7296d63768beb71009de8d3a15afa21566d06a8929ef1c5093097667eb6ef2fc97130a1c9c6be18ef22525518629f87f1f1874a29cde7c5a6d254f2476cd2838640810a1d2284b4cf86b164dacc4346d4434c2327b1c16c7607695a13a6edd3cf33274aaaa542d9d85c4bda9bfe00d443ea15863b10030c3cb6c738dfff79ef18f4b1600469f8f8879e62a60c381e399f17b51d311eef1ba81efd213166c06c8fe2704d827ef594a36396bfa3ee2116cac554c4ba488ea4f607baa2142b3ca2384a4d0ef88d26ceac3b9a3d8c7712805fe3adf18e82ba5820e236f7f903eb392520649cd6b480a3028dd2e912a0b44cb3ec33c5c6f3273402c492b3a0b515b452b28a4b5c59fc116c17b90d0a0ec82a448ed5bcf5f4ded9f5224993435bc63152af1b8dd74279f4c175a82ef0d803fc5845e25ee0b549a098ca06ea52875f5c481fd5656daacb4d6d9f2551effcd3e51bd12703ed5002a27a48e0d3748c00bb8624a8189911449ceddb054d02f795b8f5df09ee1b070e321c73db961d61980a2c72023e4080fcf5af51d5cf757c3e788836d921785dbdd59b8c1b4671cf07335aeb72069fc03ad6f60cf9225957842627e442809751c8e0b978529897b3763d707c65f460b9d61d1cb911c24ec114a47d1cc4eec6fb81db4f530abd631a9733536887cbec0f2ecf4b10220ae71de4f900339677aa49ef3aec47620c2e57c1a08ca997907ee99d645e3af36dfbfd31bb4aa06bf15dda0d76f29defdf4fcbe1ad2a917c90443ca4d93c7a2f517ef6f745f9ee9532d40cc76e5bd9114ed209682fcfbdb46b6954fe0eb9f62d69f76726209377e681c619b2b60eb94700590de0c5a38a408007a366f5ff88e5c249bb7af4c16b6348204f6d735ebaaef04ddec718bd3dd6d1fe3524a055b39c7be3eee550ee09aacffb4dcb2f8d90d4a6b6f7df60ff505a6d73adcb22417ce490fc7f0dc4a3d70585ffa438e8a17364246c303818c4bf3dc330d0a000c80bf36d94853bc3b6283fdae380048566ca35b4e55802a95cd906ca9588da56da31418008d6fa32abb626495117f81ed13012347558f1ae270c7f1eeab679334c3b9117315a3b288c40ede70214b15e6c77b580dd9766d36d3950af564bb9c9224b3c66ed7d211b97d3bbf16ed832148729f3ee4cf1a63153f21712605d5530eae2f53b18a96bc67dba2fcd570eb7054a65d872aa4031208aeb135282600c7f6daa950801456a7d01d8d07a9e5ff606b9d7053d22f3dbcb6d31b62f773a5882b0464f3070c8c529d3642165f17e629995259e9b094992f26f9a83da40940da25fae73c738f67eb21fa4c2e870800169c8883e3b5c0442266470cecbd397409883beb04eceda7b92220f370335d8deabb9473442989d3bd784b0b737d2b887c90746fc0dbc0db29d295ba81a9c9a568ddf7acb38e206c58c6b8530a5c001acbb1270c7903f0828961e6b40fabcee8fb05dd94eec40a843620e4652f6635e77d0601a396f4c89997583ac5fe71b1ef4ad4b52f3c271bc9b400a1b5df594db22d978967dbb2cb1872c369653f71255fbd429451ec3e8ca1efbe30a572ee68717591bf3f0097ab070c171f3ee11e6857c654601526667da0488b106476aefe63e5ab23cf9adb8f82eb44ce973784416fbdf3a62cddb258059b43d0435528a0bf841dad7a9118508a04fedafec935ab78e4a2cb29d57dcb4dc4a0ab133ac9002dd5a621bd63531ab07db64c2e689568fe8d1ab1b6700973379fb9968f337a57bb02e120fc16b5d59ed33917e72cadffc80a5320c80193c9909b1be42491afc06a825ad0880407fc1d8db9b6d11f6be3678b2283f3a4db0d00ccb66b2626b1fc5a7d837b4bc921ca5904b63ae4ef482317f8398afc2c4619a62f57bc5602c3eaa3290139f7c83c10814c453bfa48d4534bf258e44b12158661c3d3794561ebdfb223cdf1ef311ff86a9f3637fa2c1b74398661c815583e1a642cb340d00ee8bff18ac2dd499daa1d688e9cff0a5463e9d6d28f32075be51aff268c69181c146cd423fc71324376ac97374f4c40932ec811fbb9db8633379a758c44a671c6ece3f59b957b1fff1b79f885128b1c6ba9a71e8c85e1c8ee0b7592a342e9b6dccbd74f9822b13c805d53e0741bbb1d67f4420e96fcd38d8cfd49f804dc1c80dca97bfe0468d39be6e771a2f403ce8b677929bc6e395d185661c3e5eec21f5919d619a71e4995e245402986ccaf212311144664e6d51692d3a18eaffbf16359154e19568a7cf0defbbfa21e0ab2cde56a83597413a542d14f974330eebced71a72b6cea14d763144dba519473805bcac2336bb416364446da00cc76cd0f8695cce4772b274634e9878654561d5d409e3699f1ff8b8dd1c3e8601cd38f2d608ddc03cf97e00c4adf01e1f2e6b0687e38fda2376fe48b6837dffae8987ece72733008687b41402cdaf4dddfe452fdfa9d80f7732aba49ab5779a71f4e6b8ab4235a83e259d549b3620ed09f9c44205eea6c75006b0e731a65b822a431f658c6ed494b50bc5746bc6119f47a400237ec41cebeaaaa446d4f440b83de30885d67732b617f7b9f26d129a2033e0fdb1ebb66d65aa83a6b5eb72c631097d3ddb587a2adc9da59551e961bd99b3c1f5301516089e6bf2e5d4520371b332b48f39aa6e21dc19d19fea18edae7271f86f6d2878b257a2352046b7280f03b48cad4af38315ec142557748945fc52ad3434772fe2136cb32036abd87625bf107d45bcc95a19f96269b2aa3351a2ad2e22d5ef64aefc8f92f703de1e5219a6455786cf1d688700a5c169f0bf25549cde4e3a9d241f870962eb6c86fe4f6f03ceab5fdbc467a5872970d23414bdc4b03bc175c14915b2497c4c8b98415604f5ea0447514c86cb73c75a4f724093436627f4252bfbcb366d88eca72955b2b2a6fe98bc6b7715877b634b36ab6977a458b955de284ee22f1f0ba40cefa48887f073107bdf2c5152692402e711cb7195ab18bbe38eea8a906b89213f8961304e32ebe80af21fa52c2000676561f61d63022ee31fed75dcb4c6ca877392e392ccfaf8afd474c5661cf6f397b037d200773460cb6d09884499ae486c95fad26a0fc7f2514a09720e0b5156c348adfc90799f2eb86efd4b919ddfb5be12f875e0c00fa10009becc94cebc818a56b75d18e09ae4b9c0427cc49c71460560d1d82a6ec779ae86a6e6105522f13a4ae8d3afa8d0c2c4f70a4f1fce61b9b0d4399d4244edd5da44d18b872dda3ee46f0882c7fe5d190e57cdadec3b216c6c2754e89c5bf932e88ed2c878e8b0ce25e98a154dde6791aaa0c96184a43aa4da2b835db485f1fa4f7f6c29bc5c9e24e70405ac120f44e9fd26a91ad114f6e0e481136b471c683e1db7f1d6c38f08e1dd729de455239042b10e34607fc560a8f03146d227af7229ee3fd4bc5ad80d951dd84e748e29e8400ad43f09e3fe5c9a6ffb402de3d1641be69abc9e28680cb2d2c2b0e324f9a7ed579ec935fe3cc4076a714aabd7c79623176f37b53c8641f57fb11b2f6eaaf04013e7cd68867e09c13bd9bb28b0b60f351703cbeee3ed810b7e7ba161a448695779464ee68960936cb2ca59e8b6c8fc643a03356d42d82aa91f0693b561485ac0f58835540d17c6ee0f1af6c58d35d586face8ea0b162acfe091dee4c46080fc5563f26b0db9736cef9bcf9a72f415eea56b739b7a054281d7b268c9733a9cfa148df2828ba3979946a178a446f109ee2c06a290fdbf1a12038f937022f94e3d7c3341d3d4f2aa8d50ded7630821ba6b4503c692c4779d60cee4660b6f3ebbbeb7ecc4f60476768f43a252650fa8c1730396b8f651e39e86b4e1e3c728cc08e90ddbbf0e090724b6d5e5b1169f371197e6705fa3aa5f37a5b46420e38d018c8acc74d7c7f9a453c53cba4b825ea4d604fc4d1951579de74c0a1bbe9dd64c8202611f8ca9b6c2345b363137c1d88e3ef67136941a3309ac9f7efd7912cf130eebffae2092e3c2e1d2ed87fef4e7425d36081e8b0a5889dbc3c2f3a22d1188d307adbbd0e288bbeec422126f48c3159e3a015919b3e0198e4c618fc889e89c896b0a2a552c4d29b81da6d1846ba02fc9ac1b5abd96f1dda97f12ef1bed92d1e61c475a3d611f9b945f459cf6051a4c3962f70af4d525a44a3106e96ae58b28780d0ab0570882472d7847f465692c34c165793e819688383f182e7d4f94eeca3fce276f6edc3c042b8e45a3ab5ed7a4dee2e01763012d13a1f4eb904808569327e1db50743821af3bc32b22c2afc2829dbcc1b67b8c574956511cf4efe0d519d4fd84cb56cd7b2c2648d845814494559cc1268d64bd0aa13b007b6622dd26415a26ccd11f17917bfaaaec38ad3f160876cb6a6b385b380b8be0bafd51a954a5411ef5632a5830bcbb60a6c82a479ce8595bf6f00bed385e895bd07d238c68c958c537f0f4d6865bc606e85c7a46f35b9b1212a0f03328361d144bd85bc148103e71a72dafe2a70562e4a0d59d924e3bf3837197f333cd5317f0ce5154ee03e6488669b5518bb140bc4d4bf9972f0af14776bce86b1d1b73954de37e62b8003a0aa4e5628bce886dccae018b19ef4f504696d156822d4778f72165b9cac3788ea211d2d048650a07947e94af77d621b416a82de9bc4b8138364c3ad866712cd461c827f819a93f0c472da152a761b58590e1307e83e696fe15791018420be5622d9ab4c31411ba9461ee527f28839f5068835eb08f74eff2214209a4b281381962bae835c776dc52fe88a00914e2297f7284215e0f01e9af60a5df1a9fbaa1ccf9494c2663db31bc57d66a932037a466ac7b10e073e66111655296f50f03c5abe701f127f4b07f1a9dbdd4fc861b023de0ff6be66a25b03467c16d0f258fff2dabdb90ce87252b43e75f928bb6e472af96f1e07cc7dc18003273b928bd270ba31b41a8dba814d764b157303cc8a60fc355392e5c5de170177d7af4847a0ad5da9daa9d42d5a00e30a70aa89441c30e22531b67ecfc5fb2bae5dbaee4256af265cfa76594e538c7d2c8327c7c4f67d347fc5813037c81c30b288ebfe2d3ac68cf1de49673f3c17539070fb36cef801b6cc2d44aa7f45771ac15d9131ff3adbbc71132cf7142d207610e5cdb86e7db35394d757a6903bec303a7adec186d701a87ac08e0696904b61c6e32a4e05cbd5c4f5707107b5278e0e89ea8ac99daede145549d01f3f841b12f467b32880380d27080be1ea9d8373c2b36115595df383a637f48b9a09c7eb65d1f578ddbd69c685c38b8e3e40a85c0bba1efd3cca764191e1d84c0447976e43f11d0dbe61141d240cb051c36d12552259d6a10db39ad995bef9ee14046e70901b0a860d4a3131b0d8a0d1140f09097aa540da3bf9aa9990a8fc420a6cfb64d6330b3a010c114aa638cdb669858cb4a3140352876843b3d8ec59ad8b5207193e09b711f1e42a56a9793a9680ae9954572ded55662a815109b6b858f31454628da666c2dc289ae9e781d468ec30d9780fd6e28326a4ac1ef2d22d783f5d311d70a5e16caa28f0239e73ce2cbf1e4bd523cf9d2529ae58f27f96f3608c8c5ab2adb80ed1c426e9a2a4950390df790aa1a2365230fd60002a05fb333dda508f0dce5d792af142436dd7fce0c97e35bcd59228bb5fe7eaa235b49a6144489ad98aa0e74e9cd76fea1b0162edc06e96d7aed8424c48285bc54e0640854d5d7d8fd6ae76190c50f81270000361aa8f248fc8a1ee5e9bd7b9c9d984ccebbe61003635d967d5355f872e01b0e0e0c03f715fb59cc38af5093221abf5bb7a0138c2b6815548ea35f4f701af4706d41bfe02a48d6f3439295a8ede7f01fabd5471abbd70e55c3f7fd49ead75503ca77e35a2bb419f675d0ffde93c5b4be1beb8bdc9185e9283285e09e451e8d894ea192128cba5fcaf07eb5e2f402500570d2c2abeed44a7f70a24eaf5fb895732cc93addd30e9e9ee746e389f88e4798c73918f1017f8c3df34ceec50b873f50a98829a17d46ce205dfbeef8e5d79ced203a91e75fffc057fc5e873991a2a6342b557f8af8eec5831c4854c2fb608c99646863bf952c5feace752952c405e2f4fec2bfd6a2b838afb5d6450ec3978bc1b38d38b9fb8e6d7bd2f7390ce7c54c4e543ab548f2e7ac4204b013467c88631aac7c9f04352254177c792169c34a51220914bf11824bf09f41e2c6fbdce380a2754c0c5db7f801d7209a2919b0f9253d0ed40cc71ca84d8e53491b793949396e8932a464e48a7350ec8378cd710b408037f82e41c0d3f1d01055528a9e446d60abb11c6df8f617e3d91fe09b847d9e812c4789bc885f67d6662ee5eff09095a8c2aa307411e00172c4c7a8051234963d76bc3b9fbf2ac3e7cf7b197a5a3e6d35292a87cc34553194b7d6343ed4ac8c7128c5bdde4ac987c07d1055530ab0ef3c47acbd1a598993bcd9076a5eb1ea46d996fd06235a003c8efa44090061b1a56284d5f9856522a824698d028592c40286035d93222b2315842eedf83c64dfaa419ea7d3f88839779fc5a6a66fa89f870a79a0552a9ccba0bd0af9b9254f78c3fd3cb5e70b424ed7c299583b9b28217a232aa078bf68d5b5371e6918fc3dfbcfd227f666518abc0e9384cfef8c95952ae79cdc8478fb23f09f77346945dc7c4ba0b69d3a6c301e6c637a33cd56e310c403702240717a5cb0fc01117eb4e8b19ea71a58f8023918501a375db8d55db5944fa9c82fbbf1f44c0aa411c81d86347b62e92d0737cf646e67b12d3396a3bc4b924ff1af4826b2bb559f9da9c4c1afc1a99387a92aca2077d38d49232d13d9f2f13c91805ee2d389c72c676877b4831d2b640813525b2d7e01b4a82e7bdb31b28ecb102fa6db0fcfae2dbe5c1136d16d7523d966695217248a34beca6803638d6aa387d15771aa0cbfef1adfe2973af6e63739ee1d238c0e5e3a43ba4818e626cf3828661d440cc9d8dee2b644469ab092158b90438cb1e626cc9ddbb504d83787e6d13c978a2103762f14c0afbc9519198d04591e65c2376e480c54f712ecee46314173dde3c7e758b222b0f097a8e220b3f62feeca5874dabd799e96089651e0c72775b6011745664f1572d4328697197ed04b2bc3472391d1bae0abb1ace14178f4ce4859def01704a3dd9e0603888a2ab08e2b2f728c970b793eb4bd7e370debd3f306008f287a360ae2182735529b464566cec6077f241b957fd8f99406a02a093ae9e9843f50795a3dcecc234096b3d27da1c1362c30dcdc109179323761e8acd63fe28fc563f7da4a41de6650dab33b68d275d2b4135a2800bf013e803113dc9b4917549301cb9219bc662d4a192b3243d8739bc758a68adfc09efa4f34f0a0187cf8da87d7e3ca5b440131a25cce2f6e4453bd070a890fa00d3a06a16eb31bac39370ad74a02ebb2346492317f3671c0d3e63ae529715c32ef78b4f5f844780f179a1ed7555d2c64e68cb917ff50d0b2dbaa5d19b6b7d8adc402597eb75600518710039038b5931931b763aab718c8f28e21ae1362cc9f8b820774cc12f8483194b04afb51fc8fa539cc2397f067c517567808559282e5f0f70741a58cc8b76ced0319d70ae500b15297f7d7b520f0985f4dc85d9fdaf5ad8e65b0744c507eaa2c01f327f36cd418c10947ca52217ca75a0f4603d84ab8ede2c2b8a590d9128a63cfcf0f055073de928c98a750ebac670d8279892b14ea1849e3202515bb04780eecc7c44fb462bae69e80d6dcf308c119b941f4b497af51773fb108a97b03c4d9df490b6188d00977400ae22ae506fa22b1248e04841f290f6d39b6805067ec2a10020b3824f8129285ee8f1f6630aa2369bd48845900bb4ed529977633bcb8830c9194217fb024c3228f89571543ae80567bb85d7f2f14d7f21d281398d0aaa8af297ebdf7cff385e9a2817301907cc4757b1947c98ae570cf099560c72792f01b04ee7064be2e185656f822f16cfcb620ed857c64fe18fe8adc6bdb7273ad2bbe0c7cf320c073afd5aefefc89359e30b0d78fb853d514a6dfd3fd6fa832ab6f5d79fca3d54a4d36b4d16ab46f44980d42a4512fc2d86131bdb0aed452c61c7b0cd2575b158a65f3a1c3be85b237b8aeda9d8ef0b73235ee68ba43e89c8aa7d5cb0f967123d7e62c7329a46c3349df91123cd6c8c0151c50a0436e104b52f95697a6e7c3054f2431c574f8e9fa0cdf5aab4f94ccaa532a345f6b04fc63e883569920a9f0c1b95b211d9b64bb1c15f82c4a1002c4c2bee69596153dcd452d897f58f31d04db8eec9db5ab8578be8a4b35cb57470a4eca89fad8df3203b11ea0f30e0aca9600d54cdad1b11620497b20b4d5d5668e17b6171418de5d32cf12bd1ab65c88bab223ccbc06ce570542f3d356e41f7cd9e9e78a5b71f660365b2b7d84870e89ec6fb6c9de18525e12f94254064450df0cf837ff9fc6556fe4014c09a075dba1a43edb0ea9f4fabf56ba1358b9ebc301d2ba792220dd55bd0bcbb8b9759f44694710bd3097ff106b6d11c4adccf4e613d05dbb8c10f6ab02b94d83e83bf3a0c0dfa9f28d25f3aa4d7422bc648f99c6ba5be9134958c77fb2f97acddffc66cc99765147eeaf9ea5d9cee3f460b9a4b02d75cf76234acb905c478c08232b3deff7c7bf25df6ed4b508e4657d9bf18ff86a61afe076f9b6ac0fffb7a5a4fae9328c0c91e0152aab47fa147690cf6d933d923df5a015457b176b2b2f2fbde115eb87856649846512ca0594187cc06c0abc5e331174c89e9daa6a07afefb5999cedcfeffd0c0714dd02f5964464326e5d54fafc5f44e7b45c3327ebd51ef84a27d5b5d46fbc4686f23303bf940df2a4479b4eb1b96b3f1453baf391310f7ce27df9c278065259b34ffff453c821281ad939f0875ce296d36d308f1821982ffdf2d1c0a9124d339cd0373cdab1e1ab39822150b29f9ef3be2d99d5a39673b1c9abce0cb064715d0b011ce90ad8aaf3652cbdc6bfca2744087b93b1762fae0730f6289d4bfe64698deae84007c67c15d60a89829b7316a43cd79a9a147a802d1a108a5df8ccc7a576276cc4200cb12b6fde43cc43da4620b957362912cf6fcaf9962701759d48c55beeb13e1941f11b22853d25675d0759cfecd74043bcc32da78c879bd133ebac523666a9d9adabf6e6f0a99af3637621c5e3a36642756f980c3b9ca7c3884e9c86eeae042031cab63c880695c95d6ff72d6f00c8c629da27f7f20508837c04c51b1ecf708b2dcbf536f4d7c05b031072fabde9cc47d11d49c2277a9bebec0967efa72c8e9a49e7aee74c11693ba81491665118ddd4958084c89df49cd1c92d8c2bc0a933df5f2592e6a3a3c5097963b3d2b1d4524153cef46e0dd1142b45fa70798d1cabc660dae377f5be74130476b73b224e4a460742e985f14f5b52294d0ff2fe3a495075f74d904bee48562e65b7981c384f1247dda918ef777e3be6b45e5ab61f6e1b249b0659fd8bcb0c813c0d40e9a86d9820817185ea09bb55832f1db9af5531031f7f2492333e1a823b19e7762c701a17170a1e0217fa7360ee1a511fbaf8dee88ae53eb49d9c8574807ffaf3f1c95704042286df338f089706841da6fd50f4e8e6f2e3c42cca26b98fa3c5d273aff3871600c21a36e4497d92b23a04850ae55d7abf5a4f42664d36c7cfa6b9eff4786a1fe44eb4e25fb8cb552c920fb6483b491b80d987956703880c80463932038487c7e5e0c216f7ec44f7c30b45353f4b4d68be5ecb9274229269b85f66e96f7740c4f6c529ba129de3d662e7aab5ba2e4803115726527b13db78e1b9679aad883b4f848c9a1db77a23860ba33b01189726fd793ebda07afb428882e1f06c788a4f9db59c815ae1c7ffe4c28f9a2441919465f5501ba17d88c34162cffcbc8d578ce3dcd902074e672d41ee0cff969826e2ae0cc4b91b8aa852a8c4afd9a3a2822f99c43c6d6f75d2dfb160190ccd0ea6de18373da16e109ae7147c6d6c6428619c263f3e99125861bfb76cc33cd31d0de7bf5795e8bb8a71313935b094348617ec4ad5657bb78b3756e42081bb8657f22c30e4f5f51495b2c89923d1acd044a3ef97b8aeed1e92d890f637205516584ecae84234c2be2860a159011d175ae6adbd10bd30f2110d10d49b4e6dbb9b3129b8b79930c8033b8369994e667900393295f4411b5142ceda6a7e761f701baf47f6a3080b4416bfbf0226a884db4748d82a4a6175dc082731ac8d76b9dd5ba054a9c150254b460440f99e515bff489a2cf9e0a3a7779c6bb0ec882d3ccbc75ad492a855e4e58f3cdbcd4bd219aeeb1ead49f46301013a0563e4a35b6f8ac4e5d1600baea1db625ac2f928f7d13dddd4f6dca4134dc924a2306030932c62087d0e5c6f1505e4fd2bd9bb59bb01732814030aad9a1c494e6298e1b1c2402af2a5cb99af4a98869b4a23b025022b489d1a85a8834814e749229d830a61a4840b09a461b8054ee000c89522d25f5e4d562b0d4c852d9ed77b316ad853803c4e63248e0778f4a03a13d3e45c5e51e3565ae1c904a357e5b8f4044914bb3753f637c2a0845dced065b470a899a6d5138333b285fb1379b5859cc26a73700b5613ff7cffb12c04e206df8f7fa36e06b7e54643332dbad7724fb56172c00068693ce26b857195d2328a3c15d0f6942fdb5ae7b4900f6fbe457aabc0d574678e3be16f238bd691070952f6a301ba7b416765f52a7b7ade7a5de8593e4a071204a60fb8b8dccac986fbbe68cc874188964330f7f13e707e0f05781cf50423e3f6728d0e1b03be8d56443a3fb5f89aeebeb9dc1b271904224af8d39fc2f6ba542b89de9c8fefd97f0ddc0ac27be498deb68af940e6ee13897eeb469b577457f72bfa9d026d94fb2d4aabf576d883bb85535c97e593e7306178b37eb676ce82f45fa78417534025a7fe84f5bcadffa48b9a6c75c5b8c5df2fd8b3960678e35c8474a65f647f34afe9616e112025c92034951506ecfbfc3db88fcf381ae4a076195a17d54a5554d3ba56a118d009e5a021ee959b3a9ebd4b239a74c590c15afec000fa7f25f5e091754a2f6a925828f409cb51c5a0e1b5e9808d559252380ac7b95a0c3f3e004ffab5f5740bf5c3ea7a6e2f79514a225cc170d95f6154b37247fdd63fbe3c38fb116fb81029c798362fb21a3714b75b34c4c2037f45a635ff831c512b70a98ed2e4277c61945c9364a12cff01b4626ba4e0bc2af77e571b05726065414a8b6876d84cf191ee1c35c5d571f9949818d583a5781874103cec56e64c268a670b55841a873a24bd8ef2987e7527fbeb8aa35cd5ebf1399caada5ef15928a06c16ec7703abf85fa45c42554d36fd98533fa80e13582d8a1bc793d8a2be34c347138f682842ee069e26ca9489be0e3ef19d29fdfa598c5416eabbdd5e0571963069b001acccfc1d2728367c4235928663814318a10f70c2167ba43744d553b0b7bf073fe29aced95b3bf2c4222e5ee2e4dc14272c05e7b59a59ac9b73a90a8e839793ed3b13d88086d09b68eeacc35fe45770e1dd0858dad3200458b2ae084b839d5e66eab58c32d333b8b0453a08462c33a372ed965221dc9478d8d5c4cfc865282889dbd86480ada62108924e95d6a281ae30cf5831d7ce560029f22b6c3ba0a51b1e872fb2662ab25798409bf5b48f04c98037cb87246171224af2e8a37160b540c07e8d5c926ff113a60eb673f0ca9ab6b7219ff281a9534fe1f9e8fc1380353ff45ad7619a8bf4745760c3364152bdda821fa97297dd82806052d1d504fc9574692aa25b2e4e160b48e65ccc9573a4478ba742d8ddb8007435dd581492286fb85a13eed4a08d96aa0d40b82837088f8c456eaf025b910d2733b14abd5a0575c5813ae56b1e000c4a0c87f3ab681792c788621d08586bb49436395d046b066e86f9ed2e113b82cf30bc44561e01b44ba89ff779c802b201ef778d749ab42aec97a1c74af81df7f2654e32eea6694dc2ac39f0bbd1087531e9a75851a7afb162d7bdbd80343cc2814d10c45b04051bb1692aec32d8841147066eab0dadbb848f86e9dae9adf2794e9fffa0c0051143b55cc373dc5bd63fab5a59ce8264891a79ccb9091a0945fc83f59832ee345107329ac43a92bd5a5fa216f57be5e936a28bd006375785ddc75d313f23c3ac4e9980746b6b8d8eab9850f1ca46306dd5aba1a8ea79de6f334b21b6e4d95332958a318e3daab2425cb0bf7e00caf9c8b39fd77da59d9cdf1099127e067bcd87dbdab4cb0774f3f1ce992ad79451cc4f36f94e21b4e00d4541db802d47f2242c6b929c5df512b3fe77fdc455014ed90a0d2ddead6fb8f2922f9db39c12e43749031bfa9561fee61b3723b997a23de9800711fc7168068954d641cfb319e7c2c95662693bebc8cfa67fad26ff58e43fa975fbf2f0d110a9975877e139c3fea875eaf37bfabe9434740444888ed0efb5155818fa3a9a2632c6250f106db1d7a90cd0dadfa9b8f1d2234c1fd94db97bf78b8c93c3198c078d9d92729b09559b1c124769f2909ae4751b031b9865d7195124edd607ce14c620b54c3718f64d18f90f28ec363eeb3e94612b5857fdea838fef91188adc54fea9bd6bd16075b62662670a490a88f3eed222a09775bd9ce501d2ba41fada5db657ec4b85410335286b120051a2d05bf9c1e18243eead860c413257997840da5bdf8deddd3905ae6e9ff3230d0ce0f184483bfb3866b02b389039e07c83856eeaf097efe96f1055cc53434c9e8d78fc37bb6d3536fa4b03032e9696af41def658c05786c18282abab17058421c0e9f800adf4fba34a467afa55e1df70cff12132043a31115d75acd0b94a53afa4871dca75efd738630c4974a3724785c91e17aa0e14837f732dfb849cb0d6141c131c252a6e31eabea3db1ebc5a54a65a2798df059c4c54d3abceaf5c9a0bb116e1fdd40c2d57600a2f4d7ef1b7477ccbe4d86ecf3a5253e151b8f709a303e303467badd16ac4a18854c514673746d15e44590f4682f4d8b3df92062f84e909529b4481f4e1e637c8a7e06b05288feaf715c3a0d189ef92efb4fa6484a6ca48f7c818c4de2e0c6a2e072255e916c3c483127201d3b1619d4ca8c05911949f54337ad357f5d665a0def6ac73228606ee03c22a4c215567df632e4c1adf1f34f68c917158fb514ee57c52f76cd1d3e90528da3eedc630c380058bb1fa5fac644597ff5000a204b97ce2890be2fba3702be6d43449ddc21cce6d19a0408e9f38090e9e6c6c9503d0c97b549712d2f35638991de5f7938b7c9a1999b6f824a0eadb686f4bb7035ed124f389967d3764d6982098f0d28c87a702f14354d03aa69db9a3c048fb8eead5b3ffbcd21620e610dad556c1e86be88298105df471c938e9edc00444cde3b3b8720779d93f95408903be91023b3ef83c6592277a17059996206eb2695b675ae741830eaa1f78ecdfb9d9661f8039b2ae823178329b1b9412ea6ba4f7b5bb0075e28590575b1b5a31ca5a96e5b4fb360c113f679b3bb7df8d46465233b4c98e20672695b141fdd3f0acf6af4a71fe5c790137bf64c9ef3251fca61b2319cdce3c346846af39ad73f1d267945fc4c695aba5b8d91c5061d37ffcefb75115990176447687c19be2b550cb444653c610f4ad0cfeeb774d2bfe7a981a21b176784200546cd919d6e88c89effe6f3bcb65b2e461898201dedc881af29cb1e24877dd174885339b7132d6756e2d9c9b987eecad04c79e98dd8af42063b682e00bf42be8707c6654e914fd4757951da9a2bfa0fe73dd4f9eaae128acb6318e522c1c20eb413dfba0bcb46d0743ec4df030f51f9c4ae0fd3cc13c20eb35fc547897a686f594ea684a51759e1e5d0c4bf7463c28c6c75e295c339c10a3f55aab41540c77086822a728dd1254179f95d4ea72c458da71c5ffd99b74ad94c60ea1ebc5f70e6978566e17bb1e9316a75ffbf097b678a4a9e1b8ade66b44b7010138bb5920bd604b6568cfadd6ec8602f92e6b65ef72b88606688bd06dfd4be002a8a132af0b98504bb33e68429bacd260675f48fe1497b218941adbc285f39bead824d15f3db35653b9103194843e939ad60ef12ec18627c49d31f571fba984a05ba50fe8c25013b0ec702391bf3f0831ee13d21333ca82bbc42925aa32c9e366addc4bf07c6e40510e293bd8d3f79e43e68cab852accdae9c1f49ebd825186ea267cad88997d8002f4da2730b44dda7d9d76c652f1c6b6e20aea846b4bb09d04bbda2b3fa452c6071fd1b38f41346436175618d124ba5d50807241077bf5f06f1c16b7f9dfb4f2e103a86e1ca1d81b86c1cd503f25f5339ffb53492b0c6f3e3c29aba46f4a378d786e90ee2ee7c1cacbc1eae718f460aade1b1b1f6ab0b1e981ab0eb4cd0cc14a17a19ddf6600e8efc69a398178286c6aabf2040112a6226632a5947555e71db21059b83837e7f5b97da2a77f3bdf70470be4ce4ffab0482d8c394aee88b590f97a47d3cab03ef4087b579463e380347ed972466ed7d2118934cef58a431434754e128ca286c70ddecb7374507ac64cf7ee876fbdaeaedbb2ce4cf801e56457bff28b258c009dcdda0b87d0ed68317e02cb4fe945bf69b6dee6e76aa1104b24a097656efcbea7ebbbd42ad8e5df60acae4734a9281ceb6941844e2b7345a382cbc603c1a62cec99608e7b02c6b6e140214c14ab06b2097e99b8b5eadcbc93749c359b99a33b52f6e01fa5f5e76d1409f7135c070d10c4596bded43c2c0615f720346730adc01a903e5f7ddf4b3c0a7d26427a7b9256a995600709ce55f84dc45224f53062ef3a0a5b285890d237116fecc5782982040829b5e70927c26d192772af26507aadba66a1c263e2c2fbe7a099562cfb9b07cae0595b92d7d3d0eaaf2fe9924ca39d68ca762f991d0a5f717960c1d9f924e891751becd6244dc792a7be9e4558bf061001d981c40f82e246074ba7feb44b4ae33dd4e17b59175317d5c001a2bec8952eacfe735b318d07a79a47fe523d17c33b046e4b16fd0d2122c8619549d1a064183d6cbf983041f8bccf298171392aaaf99a2c27c07ace33002f8ff2b7b650bca8b025b214b972f638dc8a3926cef14d6ee698db033aca18c80903a33301dd9c134844971a0a41aa6442984161d8564c408286db8acdc1b441408bacc5c22960a11e687534f6537a4d25851d02542092145d2ac10bf597f2b774b67e246cf35ab1dfcba6f0d67f0d69cab68dc2eb5f050c6a097f1d8a0c9c98b02cd2d6c1481dd985be99d4623de43cf592b4d83c447dfcac0c62f610a6e72360554de5c8e7f6f26c840a4071a229d4222e1c34238797b04738065ae7a06b5c607eeaca55c571ca94d2edb4b6129b8b536f3224d04d0a8c94158bc03d173f62cce4f222cf2d25a49a6291e18f24e9a395c28e0d0e1e1dde9c82a886c6ccb57dc65b6b87a250cca9e96a52849c260d42f16dd1298cf1ae93cfd32120a30909a78ad52d40e8c922b312f6a7444a50ea2c2b25a9abc6a9ac409aa5bd251f919c5ac23dc1e9ee10779f59fa35146fe3635d3cacb816201f9177585c58664f7a0d86270b3d697a272024a5ca2b0047fe0335f3267a7a82baf01910c97a3bb147d6c86a97a5c8c4325bcfd2ca5187cacd9d79daf20b925367d1c47708207ba4a9362e8a0ca1a72d310484feb88eae896de41d347e34160496fb621c0204bd2160de853d47650391e15ff796f48391e2dcfe4693c4f516eb30c2ffe6d10cc54390caf452e54c1579dbd62eb8e0201d8ed43abc2146fa38c1d00d4a1aef500985b9418a005f114c136225ca0b2fc0af7d6c3da0ba23efcbd19a296e7d18a20faacedc8e6888754949febcae025d0f88e52deaa24241d42650d5749c136273b50cba80f59172022921be09551e095242c56898a20175b3e9a1b4f29d42aa070b20f676e797758694f5e53625d1dd2c00ff6c0b3943939a40c62b95016777e13cb1b4a3646e9dd80460550906081550340de5da36673467660ddf92da0a3d8ac5c20ccc436b0f631a0110b391a29170bd099a9d62dd0efb02cc68e0aa2dd2d393cf94774c1d135d7c139adaf3bb55a7dd4f1a4b408294f01ec5d3d6186d0158a178302526b2ffa40b609f5cd8d722b1596c7fce958231a56bfe98dfb89c0028bb78009b2cf0dc1e0dfffe6eaf765a73a6fad71b58e74e130956d755975457d010ae9e07643494bc978efdf38011592c93d3a151f17fbfeb1b3c73218a4fcb7708fcda77d6508fee0d0fd27c29ddbc186f2da9a06e2c25ea7b4698f19d4d2d6d74fbf8ad610b4300296e150792f5dd312e5c8cc41cd0cc72911d6f753ab84df7ba30229395509f72a6da0a07312667a961422c05730f6b320b96cd7dad5ab6aebe5eacc8bf07a6cc510ac1cd426db52e548c2389eb6604ecb4c2f459580e109d462be06f3b2a3d0a30c1d4147ca938427175b0e2ee23042ede0c02526ba1eae9643437b79a8acc4d4dc39c33e3432758c03657a046805ecc89c56a441bf566d08f66382f6f6e5422d54af56577195e932faea9d2683d4d59d85b3264a40594559f524ae304137cf16a89181186224af5215388cfd20d5cc4be970255371a31770a95c4931e4a804caf56aa867bdbfe18bee9eaecbedf7c04d07923564582a2c9ce7fada7d39563a073547f850dc2c4aebdadf2ec5f1d8e1ca653407c27aaff7807743d5dfb01c2cff23f101e66a8933a867d2200932d8d0f5461cea1624771b42144f5074522476eca02fe15e1a3a245846f8a1c2f15030eca53d6e1f8a834c69234640941d0751b0a20666d5a353d5698eb59a16ac88b2ef173386dc88524e8c19678644e9a08c19008092f89f318f39ea0d5435664c67a234187ef81dcbf930c84c1c73e40845617d8e1978386de3f914d8c2a7eab5c75f8b43dfc44d613574fbee170e59c44b2cf2d3086717855d1ae3d272098110d027663532cbfffb6d218f6d94012aaa49a2b790188b14416970c40715e681adf0b7eb771800f2b26d035c7c5f38ef23a99afeb1c852bda22b7bb6a3d12dc6175c26954b323a5d68200eb3ac64302bd36083b46b3206137fb19083745ddead774fd22e11e474f6f0bba0b04cef881683d4369e6729b70d1ce05eb52357b0201e010f6cc5ea5a15e621243b154636098a81d4630b6498ab54938c87e3602f4d109ef293d2473c0a2cb4b366d2deebfb7f9981517446bdaebc5a6c70d910c6b13a63592c26a068575d1fc2a98b4e9ed8ca34026cd937de8ec99efe4b3fb552dce3e6ba52607b126e66e18f51ecb2fe02850aa36b31dd9a1395093ed2f43065e99a697264ca7a2387766b51381720bcc1d6cb54c1cb84b0bd93f8fd6058f8398eac419f52ca4e3371d845f25c3c208e0ac619162d23ee8c519f8caa3c42c0aac332d3f2d5da87a0b18179511a6511a74a601fbfc9d1f9f695bbd828a28d94f00e2330035acb94d26f64fc4eb825070dfb8c1216d8a5f3b6350ae0796fb430e80cdab600840a640f94ac3bb46da733dfc0ec4879ed7049f99db8acce9bfdb03dc5f0a1c7ea6eb59c2544debf9ecbf78eb8ab9464d353fd991bc304fccda028cafa5e937f0a0e8df4d1ceac493b83f8a484a9d283ee13f6a65df0f02b70686ad03f464963d0b56d9119c3beea720c326b2ad50b86e2c828ca55492366df369ca826c47c2b5650f19f421d2f0f2b4d91e8cb7d4506deb12d61223e5906a449ccb5d4e3266fdb55f022cd99fc3d987f50e78cce58b51729f5130b05944da63dec208e219106bd63cfcb9da82428baae272b3ee29ab740e2a9ca2f0c16799453baf2b62d824c8a4ec961d8086f3962ae40799e90b76d0b152baf1996e8da4284a13edecb6ecf607780eca07b5b0262c71e3a402a4955283cf2c4cdb7de106fdca2b248a09cd2ac8fc696a0fc549f7b28403079dbb281cff88db9d6348f2db5757a4d9c3dd2f3410d49ee748961d06d5b61900b713b518da3cb44a54511e8ccf6215b9adff34b82acaa92ab70234d96387ab8b70095b4f21456dadc64bb0c00085a2b24e46ce17ab1de3c9a0e50501a52658c737f08c58d94fb861ca42f23abe2dfd59ba36200978cd135ced5e051b169a78b7f92bebc1c49d6b2e030b169e15b501f263aa7f5d5ee5a2369e95b00e6c8fdb218009c6a71ae6ce65c2505e1985fc8d243e2fd7b18539e230902fd78289889918c70d3e3d1430995bcd0abb5620d715758885e3f2950a9f82d1c0c518bdb3691a8d95d5b192b376ef908a59ae4e6afcd52cd84711791b77ab55e96e521a66b7f6f688a3be0daedb4cf204acd8ea5c8077707561fb6021856b76306fd85a7e1d31229d9e3c5fd9ae5f0c3e5b3af32f5069db8a3af4108e52d1792a56dda65c6cfc539ea87441fa4f0a0920cc97e6524a0cccb81daa5b14fb34ce5668c1ac84b2556078be8e9d55f431f60d9b96974d72647afeac0db65ca97b6e0fb794797654f3560e135fbff54072267b21c57f27d311b4e790e888d0e7b56ad294bdc21501e08e2880359f05f620554813f89855407deeb01228bc44c279e5d6dd179597c96470f7df6c30932d3689132a0791dbc49f3eac7c4d65bcc80a1b0f3e19f594a4ffd3e2bf1600c6539223e33856329b4970335e2e4747086716ba46376762e984dfb4c9d0677f6ca1527a7426c818969010b81b575ed4adceb8a9c64d03e8e8ea56d67aa66ee0681da3b37e7398f551f00c122e610d9b7041a427b7ea3385b71c0f2c3b44242bd46e6ad84fc656b823d9ff849c8e9998287bb6d5858fed93ef50acabede20a7c77ef2e5f5bec70f79c9707aa45d81740135b815ad2703b043291b3f40e3bdd3b664216e230fcb30948abafa1a46164c649665bfddbdb29bf817b87b572a797b4249e22a29d1ed528d6c935c334baf0406535287c9aac9bd3e330b6369e10b49c3980ae9e33fd7016bf87205c60f99ba1d2528db8005fecbe733bfffd4a54f5343050345c784abab321abe5791e610cefdc5f512ee907fe1744523095202eb132ec6ed5976f839672ae8d4e8c44148a904409104d91812205fa5efb0213d37da532a9839653b98b8e9a8b9528ca64d524c8f04dfe645045e3fb79d2d7e532dc8da9f13914a98af93c55e89bc757aa421eccd02fb42c2bba308aec3645508871b9814c2b5a34ff6f8473e3783168a146f6b2037e3f8bbb438cca98e9992955dd35e74bf89c4c4ac1f7fa5980f5bda640f51ee227084451a708dbf3b35f8b73626fad0da56589149b568a0b9fae15e0e672a08bb0341af252d0794bf14f19c77fe86785ed996161dcbdf088c499644386259c4a9d97a7fb2d8a00f947f7f2d937e69c8c9f971a9189d6922e5289dc2f453d6163bedeec3816dc32a1db3a9428bbd99f90140a2dfa715a9a57a6f0f70d365185c601fa15fc21f1494556891e9c0f4d11bb6ef296868262232d16dd2c7150f3ac0ecf30beca6baaae8340d40ceb11beaa49fd36e3021a45cadde4fd565042efe2e48fc8a3c0539f0cd17f024532c86fedd4d5ad8a909deaf3b2c2674a73e73a3540bbc0a2135493917596d701212dbd43664303e8125c15837ec5883f6367c7dcdb7ca8dfb59d58b15b020cb7644abdbf6132f55e882fc1ef47ad02f05ccae2a747d915737cea6a2dbaadef8a2b1d14bb2e6b10b10dc9f1daeb19e8bae0f20fd205521f2c82148440e350207216dde6330bc94b0a9f32ea5f29dfb6c393dd170c86497f1f8321667f8f34bc1b7839b581bc82a140e5cdfff350edc1af77f4b57bb085f1adaba3c6f0a4db2397c8ad5f4a3c15b841480a046b8f0a8669b8372ef389b1297e71e6c92374f0d55178d6f0686ba889ce2f454b309af46ef8d0b032f529e9bdc9053299612727b06dfd4d13f1e345fb1b5fb11d500de0295b2d0d8eb56a4ed70c529286314aed2d27882023d66abad1c4e0657092f54eb2c2fc10daa913669257808d71de3102a0e620c03505b76842988ccfc67e9a84e4137d34c23209751d17756a05a17fd4c4015c8b61a80388b01e4d70a9bbb40149eda9b56c7d0419e830fa394e5333731081a72fa0071183b0a1921e0c9451b70e52220ce1578b2cbe379d4008956423d1edb2f88bb284fdbd010dc959c6c5bf525ba2ca95462a9fe958f8d662627075eb80316bd50c30b8d4b974fb9235261572935c472a9f2c3e1ca9451b8d4c7343e380aad3cc05a09c27728462f0e50056028700683461d50802feb87289dcf49e5719e0f446e3465a011116aad2b6e4bb044cc56cb5841adae2b180044f76525d449cf6bc5442bd6d9871252510b088c790bc9692390a24588c03db06979556e0f72048225d4294956b025477899bc1a953bec653f5edca47cba4542109a8348303431dbe5f2330eede4e3ad2710bae318e9d1d3234238645c4243c91c497b38326c9cd0085f9e7fb16550798771ae2162040c5b131136e8033e48e8145a57c4313f669e9819266a5423f783805461ec6739b2629837a0d25ec54f75c7d4032968cb00af6bcf0274c18ab5c5bbdd761ebfcbcedb197dbe7641cde6194ae58428161b88c305999045f98eb48d3ef4585b5a505b58d0cab5f50bc2ffd29fe877da74b4f636f2196d0120cf640877dd5fa3d8bb95002c90556970145c4a18910b4e08558f9854c20c570fb9a46a7a4fb3ae835919999448926292986a66c3b3b5201a4540758d758efa37b62a3f4915c0c23f198f40c1b914c3525f3ad3298d1e1d272338ff16569bcf0bb8b6b3ddd9adc19b577809920f17049fe1649d44982cd6ff5e738b16a21327415c3b5637aeb4e957dab7712a8dc2b4146362e6581756ba53d4e537bf2f724d8864b1c8029aa8c2dab43639d2262e084a50c98f08f15042ab76599fba8b89d99df9a1a999d5f5966c5ba64f57ecc2771eb5206771a86d78f274434be63624f4b2b92303dc5e47a4bc9c25407d0b85ec203dc0ba815d85a564794594b1cb467c0c11b0dc4b04c5cdd61fe60638edbe4d70ff45d7a0aeeb2b45c528a2e7b306bdfe78ab5140922f2b1ccd344c8d994a22a4c623dbead08c0d8b25deff1385e1cbdf862c8f753103ed32d0a400a0356b4a13ddc3a0e648059bd7d0dc02b5da5bd2540ae1e3636492aacbde2263de4dd778bcfa6ba9a1c4fcae910c17f54be33b41d52e5cbffbc80df01c63bbf05c5eece503c859ce0e01418261245d8f6cbc742635f5e0d2400a6a58361dbaaeb817f59f187b90797efdad29995fde39d9196e67d080a21d5412e889a8f47559c128dacece4f003702f27cd8c984b1efde3d0ed3adbe5eb66c17cdcce77676591aa9fa0bdb54830b13756d3becf749ad20293c0d243853857523c8a96f03a7d3a631eb5acb4544e978558eb55cf10a3aa0a9415562e5145bed1041ad7cc00c183ecfe0c5ce396d3e96b877a4f502bf3b41469b5f9658f6ae47d139afe384af8fd42e6b4ed79815e13d2ec4c6dff02f79efd835ced007b08213961aa974996d19f911f10fa765aa5c56f52022769e6a31e35f62a75e2b569bc93f52a3590262ec06e8d4795840dc638bf8e7c974b26f2050b3e48da089fd0b0fce41730646c9e5a452c37de82e6961ae1a181d15b1796472c80d9e778b8847621f55bc241da6c18282aaa2135045683c8d67bab4153034902765eff75ac3bed9e2fe9a62e2d1b00086cd7f2ddf29974d667087251c89c86425979672ca16b74b74f8c5c95485a4d526c926e2c1dda6245e4ddc461070a9d5fd1ad666e4d882698fe7d37d641f9b760091ad6f4f24bc9463bdd187e860877c73061fded036bd49f8d95620229e7a9fa119919ae1004935cb0dc5349ba12ec61351878ecf08efba3b840017fea813bce1b644fdf061f27a351c544775d5611df213e5bdd36e3aabc0286da9507a8cb576f21e684ed7ba860e7702559521bfa9612cb9bc5915d63dc0bc4fa81b12d4d08a3af0013866ecdda2e0c4a867a5d3f70c2e369983ce5209bb12a9b51b1cd5ae43c18eb24855db5b5f00b262d0fbc7c2fbea378c5d205b785a95e8e20c0a88d367e6988f270de1ed5de10ea1d0c73b1edf2dbbc8e3499caa55495deb4835e84b11c4686f13c04c75010a6aef38029bf58efe4b870a6602f9c2d383f149c8693f797ed4692d37b59a41000075c70879775e0f7da90ba6e2995d21923e5f5ed7b547e464a836c81102fc6fe7afda0baae5a67543faa53e9b23db43c6792601e884191666e8c01f330c0e7a44a0965281f46c3589a8cab922a1c801f9193af851cc410c926d6f9bca4c6ae3217023a94627aecc6a2592a1b60d6fe9d91b3dd119911d9597dd5ec85dcd5da63ee8fc349d275b6b49ea319cd31ede314cb5cd6b5129dbd8553aa3cf04a0af03720aea56a95b51a6330c1f40e6fa4c1f92dc00bf14608fa28c3ad030e919f01144731b70fadf8520bcbf1e857795dd789953793e3c6bebbb0926fe0d3efb223838bead63f1417cab514b56e3a1f49fae21b81576c1dfab3ef0fb5f8234aba6197495da03a4f9e2d35edcf7319884d95658800414d7425ced812bed5e686a5243a2acc0a62afcca20806609e927d6cd11d6cc52aabebe343d2337403fff5bedd95934443d1dedd79e0db008d90135b0744e6d740eeeeb990b28f6d7de3cabfbbc655fe5412cb76f35bca29c5efa3eb0af269fcc3fb9ebcc79d5d5d4a787d577a33128d4d9d0afcc810cfbb401ed2affb718195dc97257d673e4db10614de3e9aa6d8f0e17d3d93fc7dafc369e78f046301c4976fd07b1b036bc67bbae7f72a4dce6567be049ab648baa2986da477e1718ff9a96df29dc231e6f857e40638eb65c7e72f811633cddc7d9ab5b1fedf9c2453dd637c18ead88f704bacf7bb123c2da040ca4258c40581530e462c22a11edbdb6857e41d431e7f2336ee26a7177442a19c6108d382db730950dff38bfddce27dc0ea4b9ff944de31b66a33a3ae2af4e648f373bbb6a78f66441b56a19e98a7800e2b2f1b2f16a69113dd33e136f0b61dbae88bf2d8841f715cfd0b73618a6d6e05a0e1ab9898d16c2aea5110b23a5b6034c6bf7ca049eb0b06695962beea3f192c55ead9b1cb569db89ae208498cc6644d73f51c214e4ca3faee6428fbbb7d6c0a13873d109c1049cde6324dc4e376f89ff7e56f433e97cf9e8ab9cd71e318b4b5c34706348a40e5ba800401c88116e88f71c9b26e75d63a44d63eaa159d20dab3c398dcf23db48f7964f287f1a8783c877bea0ef4cd0313ffcfb03579b7bc1dafd7a3a17e5a55df6b90940ca1443ee1ea35eb4e4accfc07eb98a4d9fc02523df742f8ad3fe8caf5a4bec2505ae183a23488181736a83db66de23152ce74e637b71f22624678764b761afe1ec76744f43723ddacca9924bea5f9eab3e53dea7f62415f240bd59117b2c5e2e2d5f53d6c9465f408f5d986a2b435dfa389eaa72c09df3d25990c8953a437f28a6011391296634158fc5a33a10571f1faccf8e6c349c236568261a729f7756868dfa6ecff210a0688df618f93146ad9bb8087d2a95c5a08d3471b4639777f544db145f0fbd34a505b151553ba434b65a11c428426db704a3413f180bc801c5ffd587ab57f37a7f25122bf3f1b08b3f66f65c053544834b25c623b88443a616f708d98d8b72015e6317fd2b5321192f8269d47d9279e51fe21d222fac114fb0fe70fe15947a5eb0582770c038ec2ec345a2f2a463d3bad027438ed7fea691990b6dee5ffec11ae15b36c2382dba55d4a55c78e2b719738e9d39d5450b5f53034edb96ec374a9fa810cd0b68c0366f17d81fc9066aefeb7b04708e32b4b48199956285085f70e0fcf5c3395b5182561a7736e5a4d17cda2cc240d27c318a3dfc414acc5e21cbe9627003d2c7a4405521366f11cca3a1185fa508d2bd71e860296926aa41a68af50ddf2b6aca89225c03462b985ad472981c52ac96de38b51e0cb89ee2ff1d064dfe070bcaaf62581290c15b1c9f05363a05e74171892cfc0b19fed8e8b0ad382313ece7ddf467f9e2a4fd44bf9c007647612ef610ccbde8aca832504226ac6cf794421d79fd93160187352583377d946849d2a8809827b4669616b4870140afdbda3aac212569b5c7e526a7e57e7d358df0896f8ed89d3ef53d6cdbd64abf054c8026992556eab4460c71b182e539c2438b51c09b73bc68966a97dc1d68cbf1cd6480d51b9b06f256cdaa2f88377fbaf8e9cc42ce37c6515670426d5cdbabeca7dfa188382d777094bbcb4c911f715e0ba37477c424959270587e48875833603d1f62bc98cd57cc85384766341fc6513bf39ed940280ff9a66b9163574a6c87e3b95a4852e663bb65bdd1ca16036c5bec121c6ba1c009730f4a06bbf0e97a1203fc1300860252e41a40604039f65739220d80c1c92e2a598e46cc8abf219ed172eeb4a8286ef4a34b2998bba67047b317566892f3e800e97823a361a69f48999351dfc7e59794e4b0fa9068a33945ed97503edfb4a1e961d451fa551338c7c71eba9ff530067646b8fa4f0b4cd0a98b1fde7d6730e06e3e84317c34205ce3f6d50cf26992e2da42524168dd98088122b9130074009d8c70ce5ea053d69b53c3b5fbd0f08655dab06df4bcd422b7f0877eefd534b15ca577d0b11312cef6d64675509bfe43ce72ca37fde0ae2577d3b2c9a97172fcbaaf0b6b81741004a63e2e8b05fea33396f6fc91f11546d02df1e9b85f6ad48480c7f9c19b0802ece9d2cfccdf8157ccc0ca6be995f901ebed92185e657f17d25dbca4f1aec2f12181ed121977d561305e129a1a0b89bcc4543d893adb874511a4ce454eebfa0ee542fb59956aa60859a6951e274d4bf9dfa61ae1d6c2d13ce38ce8c7dbc9207c58b8323187e1e51348b4837c1e0599f75287cb3f417cd0e81547685b0a53ae3a4a133e7c152f9ee303e3f8a2675d867a646767d2cd4121590718f8f0364f8435a4ae924aed396dd2447b1ab356e2856531dc4daf232d3ada15c9f18f3d9dbf8df8187157f0fee5f004979f056033c34f54ff3572a8c592cef6bb2e74b7cfd19a9525b81932cc63e57906941e3ed876c71e1922e700a306a6612946c72d1a961400896cc99e88d409926bc4b14f88b986799d84611fc368068fcf96fa4822116bf3fcafc8024382ba6c4f3f23671fa4854cb24c5c6b0beeaca3592306104b8f33ea60b0c24d681b2cacd0cb40e75ce2c8a3d27e81ae79dfa7ceeb0e018319a5e9ecc75b193e0d8b9f3ffc895650cf7f476bd0d1ca369569fd4e5a8ff5c034308de8489b0717518b53dfe91083ddb1fc90c99c5ca9f39db0e09d8f785d790a99e7d712314bed60e8ce7a2a6a6472741b61b2383f7abee214eb0be6656e75e6053355791a7410cdf9b4a39de2c5e54a7a6e4d2baa740f0144d4e4b184e1b31237ecaf819d2a33e79fe5f4c804a2037f51345e733c27bdd768540bf2a75df52c0569c2adee029c370acbb98594b5b064cd06e550a5bef6409603ad272c7abd29bb7463b86fe76becfe05ea39a66db18be14b91fdffdd0a70a52ab09b15e3e3116b22f9329ef38c085e0a2fbdb8b3dd183bc78cb1c74e293350c1944373ae1492ba1ce378b581cb330c9aa458801cf551373d5ef9c76d7312b8e71e18bdc188fb3ae91743dab2241e5b00986bea03adaff001303a529550ee18ba72db63c9038c2db5fe01c09e76d5d4ad6567629af3782d2e0cec6632c6446877f80ca1345c3c28a949f54d52263451f36082506482c160c9dad92227509ec984490f3225f7993ac0af08c480b8197788e0a16c6db2f817e8044b62ba1c3a63beb1fa2f8e3379acbc5c9760582664b9dc6e849872f2f53076f461e8188071612c6ecc3078d382ef52ca2017b1efc6b00361b12ea9345449c7c4e857e7e30223d0833dcd75d4a5d02311cb12bc62b7bafb1963b0cfd2b5ad40f3250ae0ab435b008a6f1681cf89dbb2b4a333b57cc9a6c73cf42c847272218340e996aab089252c14b1745a49f3bd12b2008b5ac22bfe6a88803981658395e0f3e3c3b3b5ed2ac132d97f2cc0faedcab670d339f2683c46d8580d8d6248d11eeb61f63d0669b12b8e65e6b40f586a01c702df925e03247f31260a55c4b19c08ca181a259ac3679b1eafa44bccfc41504aec279617dd7bb478c6b1444cd7f2b2e902c557150b146c4811ccf6bbcbb18bfabd008df6b218c3aa123451a649d764e38cbb9eeec60972748652395a3d89bd9b3dbf77eeeae3cd3f2e750be0b6bf856c269c60b4462083d1a231c9f1e976a9db64a262974abcb04b0947ec4262017b008204288fff542c99f50717ae0d29607139ba6a96116bfc952671f4ccbb8cbb2a53659cabad65ec849f3da0f733a0402002c4bfd17db1e48f6bcbf5b86c28b43d57c5c216a106b5475878a17218c4a7e020600586350cc81b9c5d9ba315e1e06b10bc672b022e84144ba1ef8735b1edcfb77e828cac260864373502d949526cb710bc27e65d92a5a0d8bc61d52a45df50cacf7e2bd0affd6e11afdd28ad7229f14b39eb23246209c960b579840c9ebf9a6d1e0305c8356bda44c7b08b5e5690be98c05a02c40444f94b42b1a700009f7651bb8e009a7a01eca607fe81ae92f4b84fba8960fdf328f95b9d7101df1f8eda1b3d1dbc6486a0252a26de3c352d37309f3c9d495abf046998eda35522882d2937ea59f04d1b9339eefa00beb5c3d149fc945f73d18d3b72fa914bc9b7ac1401fd6195e67ef0707350dbf8a8e98678fe6bb4370c306cc1833db7f85c8a0845296d12e5abca7f98bc684f53551f65eb0fe3a825aefa142d01c66eff49dc43ea8dbd1971640bc71bcdcd00f03e2de7d9501337d88d0b0f67fd380e5b8a1d84824cc792cc946508babfaf1f9aebd22cd57a5fb7a56d7d10b45499a309515bf6f94e858dcf5a4e08c755a73f11247af666c1790cad53db202e5ea94a230b721dc4366c5ed7e5c4071e44a5908711b603c49d2d8a7150bf7b10a47dd921f5decae06970731936c1575798dd4b29d4f85e48e7ae0a6eef2b3ace5fc0de11832979511b8df77eb3fd883cb1ba85be8a286aaae054cb992719b3fcd4d54005b527c6fdd66309d5d7cead4ceba9a4a8f69ec6ba9a8de3ecd2ada19e5be8f952b23ecf94dc4373e7e79b9dbe2ee260ce8411c784bf67452da3528ba19a4eaa2e70214b19bbabb9e07957e398696a803988ce3fadc5021b5c94c9ebd0b8818841a90b4715729735a2384db4c0c4d1e9d386af5caf34908049dc106b4d7c299fe2d8b02ea10ef39c25e76aeeab575190d31646775630e66a5a2120309075a79536afc6528f129d5d9689f20a0874b5649f96bcb7e66a0c1c9e2db7aaa60a01ca17950790fc2329a95bd7cbcdd590a96184d6d90db5b8cdd55c54fa809307d92d5ab7359ffb401c9488179ad43b15743531b4a0a902d528f78d844af6d978925ac342b17799e68f0f8c288a37afa41edda1cf9429067f66382c4f79137de65a5c27edf1c637dcadce0bd222286eff2e67cec58b75772334a2ef99774537ea7551f9cb5cc852d3ffc49acae0320c7937b74adcba6986ee6ece571188312d75decd0e38690bf72f7f8eecc01638594e2eb57ffbe86c56a091529149ffc495f26e9c7ccdf80adcc2fe5fdd93bc1b6da950423ffbfdf86e664001711838bc54fe2d85bebd13a1c1b86420d4e8e7a76e03dcef3cc2e0a4049fecedb47d0a47177637c9a04c4a3389403af9e40af87e7d87dfd40def9997ace56f35979b4673168057ef1875cbb35f0ca4ea66372392d6a75c2800fd35a58ed7dfa568f8b5ffc31822f211aece049b011bdf6e2230c45238282a4c2a5bc400c3591b1779edb19d25cef553c74fd22f6f8b89529a890f2e64dafe326b375154f34051bed27087651153335aa6996a89b2fde30d17f3bc996e70fd24fdcb217b428e81a1e20d2a7759d01a94a22ba4d417dd3dcb24ece626f00935e84add505391606121a8b26b5a8754917c9822b346cc157d24e7177f67f8d1da162475b34e9f548bde50e9cbd1918fd00ea36454edf72f30f15a76e8d6dbaed3e1e800ef8b090b48a43d88c6c2f9ab69344730d74ec1c66342f6797075f1bf2b712486108b306c561fc4f05550ec3e9340881438554e61809e9bcf9338e6ac74138592415eec7793baee10553a68e457bce35ef2811a1624abed75d0c113b85037ae306fa2d4033b6f2d014478de91c12402384ceab8da3a631a4ad9006b5866171c68c7a4067c1858e6196102d5bf641855a3f45f91262c0574f020750715b6e15f31f223693a3757397aabc24b3a8accea14538a11a6a2f05fe6bb240bfb32a714448b9511cd5823cbeb44ebf2dbc0fcc313614b6fefdd421a8f1d39a623f8a27b040f987a6c47f96076c401988c6235eac50945a57ada9c620db19499bb4857746365c58f8331ad5f6d2e5d777e09a04b76c4358eb2d6fcde630f8f4a6b845b9fb03e32397f6280079e8e0c14689998be5de70abb91118a8df2f519670c3356c84d5a93b9da1c183dcec07db2a31dbf24a6d017479358e07c811f538de75616a3f4d58bd3696ae37f83d2e8c55157f33e6c456b5f903d9cf00f73ecfe54275a8c56500c360bb58a51fc17d1d77589b672a0a83001c7051f00cb68762a8107e0708671b2007e413e06b8ca75a82aa99f0e6ad1e99dd56008a26b2a799ba40fe3a85fdb2e58d1fd0b2dda2c83580447e2466fd02703d55cf68875ee16083d9e4d4485b735b29a870d49c56917a1cd6d45afe1b14268725a216bf3ad9128fc2c28951cfbe8dae128cb46ed424abdc63e593e91090602441d6d44e04edf8add207e63caf43a7a4cba6e54e4f6ca04467c9530ee5f9c29b6d4e8e58d96da12c61680585997e2d8eed83ab47f617f05efaa2ef650e9c6e87e3a8fdeb8a2b183e0ed3a1f5d205844e4a4dc4b124d04532546f3eb8f9579a412e95e02632af3c90a4e4e28721c849a6269a9a1f3a0073db399da4cc422d6a65f263e2bdd5946e3b4f49349ac45d87a8a78cf7dc740ac9c75c78b61c965c30a2bda91e73d9798b21b325df89acaf7e4500725277aefde4358829d4a82eb7b3f11df728a03cfbfb0b88c56c32dd1c2e4651903bbb3a47f0b4e10be031578de13d881b5d8811f98c0052a90400d64a022e6c00e3cf0811358600512488a6520811ee8c0061e8126eeec29626b426d69b43bc43efa3c6a2ad64dded18b62a8b02dc8de4dd46723a4e2266fcc92e12b688c4a1b05f89b3e2f96b642daab46a24df0fe89e0c86852c05f9b2bfa2636acdb2f5395642f61e9f3dab0c0c67142fdff2b4bed0bb40bf17767e9f3cebc8c715cc2b27dc00babe682b78579983e5b04bbc2dcdb74a29fe8fe69a0486b54c8f9b084bb076c587be08bd167a9979a57fcd1d3f4d99b221fc6e1b6a694c5ce35174e4ddbed02ebbdd71fa9c22f03f6c790df02352880dd2968526283fa28ba5b41929305ec4bca1046e1a480e96ade69c17404509c7f5785819e2c2f49045e8fdd1992999f5980796df8704412216c97285fa9e06668dbe7ed0091ee335a14948b7a5e396f16ab8ede34e05cf36c89167b80afc6acd02c2664b10a6fe49e25687748339c34b008cd3b3da5905087b8f153f08c071d829ea34e54f9929c1d4f0f7328fd36a3766fea63270f2758ae44ae7ca344e22f2fea3fcad6e9aedfc80e01f1f4daa05cef247717bfa6d6a48dc013019f4bac0dc06f082dc754a2112723eff81c2e9b0c023e4011b3d67794133fda76ecb7a522c23313af16e8301cf6ef92f6a27a9c283f5ae98524132c3f60435de5634cbca69c956ea33da46852e0108a7d41ca144cd4e0841144efcd93cf6da341bf50f32ff5af1e693f6bad6230d6c12f4560e0ac63d9bcd7b779a442860c3a518d1a40f1332690f34220bc308f337c2e08a4331e818809890dd9e0a781cadade7cb9cbdfcd97ecdf4cf8ec49ad7f49f2017237509b4cf06e044336c7746406432af9d5a15127f20c0bad0e587cf60aabf71230531fd5954dd36b2560e3169a001f0142bd78f4c2c48e6ceab1851822dc4a9e9cac84df1ec3e057e20971e70b8bf4a2d73e8c87730034d1feeb45d6f8d635ed9480e9d769b392addcbb8bfd7212adb196aff5c213d2771ec1fd46f0c15f6430e37651dfbc754ea7d5e66a3096eee202f1d94e2f4d5759c79553ced9d8c9878b30a1dd0feee0fe2c0846de1512a94d1caf97103c8f0d8d515f37f15d486040a3b95d2949296f38ebf8ba27a53eea7ff0ade981cd6e5d1c1605a236b3163d8d473eda968cc6994a08f8d979dd6d3dabd24191b43c8409d2528fa2a30d8fc00decd65ffe9e35a880163a8a5db846756f56fd87636b12a9ce2c015d563c7ab6dd315c84253c287f48dc5b621a0627c904fac5d5e159985ec966f247108eb49725c37a1b6e11bfd10203de7beaf6868e5f31d081681b2a031bd5522015bbb480db17331ecc663991b85d4055687f412e8312293666c27d5462a1bd2ecce1b66e75c23d64fa42db58d0c6393db855a338d7f3d69523917c1063388170f7e0556cc7020e4a4b16b33619d7768f7d4de913d92f0988cc6e21b62f87b3adee92de736fa46c62fba5c246d27e41bee33aaec4db322eac1ed632c527b0571228929d8507bbbed63c024c380c0b109c51f3edca62f22d02fae1eec054d8ea02ae0d96e0d9b557113870247a651ffafb270322d52ab8246aef6c332f353dca3ac513bd4f0a2c725d15ec1d1273a907db645c68bd2d3ac54fb8574f58a88b0a352745296ad7f74e82843a8d5a1125ff34ed0f3431b897802a6a7f610e4a39f099cf5564a8f1aaf3d0aa299bf07d3fb9f058e524f575f4949cf80998adc7edbdb6180e3f896384b2e61b0edf881ac4d8871371b8face84f4d496e03cf0d80182a19e7ad24393d1dbbc14f758525c6df2a4940e33fa759be4c593f69c537feaccbc91bd90917921d910af0e09840f2402640cd1796ab6150cd9ac2061152b02c40349c0b9e45f12f4d005b94feaee80c5623d1616123836eff6c0dc4f0a88b17bf09149f20e2e42bc55846af837003db608da415523245b5aa4a0501f941d56471a7d7e8fe3e0abe264e87b18bfe49f64056d7de1bc37cd287889207107dcb54a81802d8a42c88437b81e20cdf6b56ab9c90fb272b04a84b30d5703c64401324cc19a184577f4377c4ac1f81144ebd285165ec621d19e805f5a33aabca220645f9e9b7b9825d343f9d2fb9db37d9c815f118aea6d8d3048bbde73ceadce552994073ca30c1effec1c8212231310faa7faa2d274c709c54dbbc53eeef6248a5863d23747b4d9b2da291943838a8ec7de2d5e21a56297b9302d56762d2a2873a49a8b22ad3742831bd2a90bc4c8d52a4634275003692de7ce04f5cfdd0d1e7b3a57a15837e5b842ab55bc3cabd0b26f7da0f790a231bde6e68c3d788c4e14873b4b8bc910a3c5b262bd0bcae2a96cece0c49cc1661d9321a9b5b232380309801a50db60e1ec1c637cb9a5a5d2a30f8e87e1ca7fd0cc128a9b2b8ed68bd435ac013cd11c315963ca92985cf384b18130eac6cbcb274c8285487455cf99c929d5e7cf129201f44d04da9bd3b65720dcd5a803d2e58089d1a5e1e268c0a1e00b970f0602c680c084af7be5cc68b818bea29325461881c6370a72451e0b327be5e7681dead969b879d68c71006b1878422d42a9043f9e6f646b96ec267b37d97bef2d939429b50bad0b110b935237a2088ee328a51f781f6534f061ada38c114568e0882d4240c2c0877352eaee45be721ce7ee55aca30c06b8518688213050e43b2c32a0450b880fe7a4d47d94b940101cc799388eab15880b04018415ef09f1df283369ae3055600a29a4a800153ff83085141698a9a2c4715cd78d3215a0e2bd51e687f7c61d13fb508129a4b0c04c153b3c4184c80e505080872788f4d0812854baae23f2de28b30314ff8d3214f86fdc31310f3b3c41a487f78c321d788fcaa78c46294d4c0008c7719ef789042847294d4c0048ca7b469995f7e8f0e128e3c490177d0efa7dea8bb5c6d1377cc88b46855c1455ca264ce845a39485b8e81bfe212f42aed78409c5904c985013d88409e1782f1624180786fd4349264cc849cd8409c9944c98508ecd920913d2719204d76025d806eb2ca9787a611ba3a82a74436f68558807fd32614231ff024c98509326384c98108e3f02264cc8897f8e091392c91a30614239390e983021084c98b19d40113911e188706cce789580fd2f13b07bad6c1c13bb290bd84334d318d8df2446ab2a8ca2bc55d5058df237ad20e0f3d9741385681346c4aa348a7241ab2a151a75695fdcf0336ef8d00d55d51845790542a33cf464ba78a8365d3c0465ba78c8365d3cb4335d3c749b2e1e8a325d5cc4ea625455caca2474e8c98411d13ca94d18514bac41993022232114db8411b93cb69d09233ac2eddc268ce8f5a2fea12813468464ba44c1fe22d68411c1a60b155a05c241a3fcbdcbb21db3621ba7d8c623dbf806db3122db981669325dfc4d338ac241ab4c4e68947f935246cb24d04c185192d68411d5189949686a5a4a8c607f916b8a8e4cd16bc2886ea60b92099b36ae25476e5e4c906018f6efa255622d0ba623d8bfa4e35f7a425573049304ef5f8a4255b304ef6fa2a1aaf97a7f93ab719c9e039f4bb4524d89cf25db129f4b37ccc46713cbd412a36144494a4ec0fea524fe252554355def5f62e25f6ae25f724255d38bf75caa29d904f95cba11f2b914c31bf85cc229c992f85c9a61ff120b1a4654f3b9e402ec4f82e24fdaf12fd150d534f2fe2523543543f0fea5231af84cb2916e457c2eb18cf0cf2557e985c4e7120cfb93c668189192e9e2e1675216b03fc9060d23b2212da1aa89c5fb939850d52cf2fe24275435b3787f520e55cdd6fb9374a86a6af1fea328fe241a7fd211aa9a1e787f1212aa9a57bc3f2909554d9a173f93708081cfa41b526c88cf241c223e936419f84c22d130a906c467128bd40ae233c97581cfa497109f493052cd67920df61f91d130a22550a86ae6fd474fa8aa8af71fe9501515ef3f72425553bcffa8095549f1fea31f348cf73e2203f6d16d64b3c0e751ed87cf239a0f9f472359053e8f704437d3c57fa445c388988c96505507de7fa484aaa278ff5112aa82e2fd4747a8ea89f71f19a12a227f82cf2320e06982cf2310601fc546373d7c1ed950e0f3a88687cf23d8e8b5c3e7910bfb8ba0505513ef2fdaa1aa21ef2f8a42554ebcbf08090d238a4d17ff1b1a87e85da4834534209f45b5097c16d9b08b6e79c41ab59a4c987642ab1abba809f6ef254effe3863b43cc822849c725c1fea21a4f8d922b5282fd4536a20df6172d1997607fd18d888928364f704537d30457c40414c542373cf0de3f14f30f35f10fe17431ae89c749281373c619cbfb8774264cb70b8d0f9d88b2318765869d46488786cddf18d89fc5669005a0189e2eb00b218756843bc86117b21803ec1fe2e264c59a97159194c08a474860452323b061942336dcf1c2864f4460439d2e6c98e3b261132e6cc8640b1b2a09810d9318b1211210d8d0c8076c48a385f5ecb4ac074a16d6f3a488f5e460613d4e68ac87c915d6b3c403d6a3c40aeb41c2b29e2333d6538505a35061c11d8af29fc2825258b00316744251fe5158b00945f94361c1272c48c4824928cadf090b0eb1a0118af26fc2823414e59f623f9bfd6a36c0b03f132fecbf84bf12620bfba74416f6e7c00dfb2761c3fea81af6df000dfb0b9961ff2035c4b03f1237d89f061bec7f440df6370286fd8bb0fe00085dd85f033664617f1b37ec9f01226ad87f081af69f6186fd3120c3fe211cec7f63d85f881bec7f018f0df60fc25383fdad0786fd81f0bcb0bfc9e3c2fe204f0bfb5b8085fd7fb037ecef832d6bd8bf0234ec5f7a19f6ef810231eccfc30df6afb1430d76127c617f1d5cd87f02b6290a086bc5eefc9851cac49a28f6471bfd0425ad8f71582dc5140ca50ef63e8b702a45559a0964634538502873a5d16a13aaaa4f3ccbd5288ab37957acb5a88a62e75af56d201b07dd6037cd3ea29969e65e87c18f03b96eb6ba0be5171fe5020777185cdcd8803b0c2e8c6091105a84d338c0f72c6e2756176e63d8a4501303bb090998162945b26f060e4371ee943b400c5ed3ab6ff89b66d5c5a5fdc3f9ac08c756fe5079f92ae6fd4d0c787f53cd570d787fd3cd5732ef7f7af94ac7fb9f6e7cb5e3fd4f335f39e0fd4f375ff178ff9497af1ef0fe2937beeaf1fe29335f41e0fd536ebecae1fd67bc7c1581f79f71e32b1fef3f63e6ab1fef3fe3e62b09b08c37a36a7c7ef9cf38949f1bc77eeed9fddcb5193eb7cdc6e7be01e0f36cd1f079ba6af83c5fa8cfb326f579dad8f079dedcf079e2b47c9eb21b9fe72c009f67cde5f3b4bd7c9e37da1ac067ea22c067fa2ac0675a6380cfd446f599deac3e531c1c3e53d9013ed3198ecfb406f399da10f099de12f0d95bee5a80d7e0cf6e83b3697683a704acffb0eec3d208589a83a510b0b4879db407d8c9c34e98a7e63bc0eeb042786abe0e2bd300cb00fb796a7e8c759c43011601b61dc6e2c0c1ae700c600b3007e07ab12ed3766376830dd65328eb291a006063069ba72cc8b6a74aeba91a767eec0ff1e6efe411e18870ee874d26c02ec2e91b5c28f34703ffa3e15cdf2b3dcff33ccffb7e52af21873f5f7cfef3d4ac60ccfc901629e7f718a55833cd44382bb7960ffdba9507a3a9f99e0d9e9fbf1decfff97200b261f91ea769664d3393cea9753a627a62da31cd4eac93918f66823de6388efb195cab949527b126fbbeb23c9dbccf626d8296dc30a1aaaec66423c2c9094331ec6c6051549db5ceb0cb91f94a45094df92f9931a135a961577162c39e039a8174a2809f4db352a44566e0a0cc221cafce9c3af2f06a9d5e37bdd7c1a09c19080a0541c15e2f48465134c61f6473f2986634e5eff99a83d2f3dd7cd0b3ddac5e2a4ae7a56e5d7df032012d714255a0076463aac120284fb08374b083726a0c24a3aa89414eb0839a809850d5acb0538db15c58856da1ac0f7e16e13436cd7c65b269a1ec5ee484a2bc1cec8966221d116de6b6967d2aad3ea93578f2a9b54aab4fa6070739a026d8bfa505624251a0d80dc49aa7e25d1d147b624d844283fdc7d79884ae42e2ce0d76469ab135ba4624e20dfb7bb356588dc1a82a7fb4eae20e205cebfbca926bb58c6bb58c6be18085fa34afac5afed06187ece1870e3dc379453822277436ef27d2c1fe4346031ddc61d0c0092600ee3068f0c2205aad730ce5473355286516e198eacf7c4351fef5826c280ab46466d2111d61f64a84d32222b4276b1c1e5c4549c0fe2209c35ccb57624dacf9caa423d6c49a1fb211088d51624351ad9a85328bb5ef2bcbd3e91f857a79e15a3860816be99835908d0c68c29eb436e7cc09896ca3ef89a886fd7b02a58e219ba9ea8765f53f5f953f415f7f445735f6116ba5cc63a5cc57261d9a721314ec9f4b1aaeb5b2544219fa9a5386f50a22af866716cd30946a85b2be13baea188f86a708c757209bcbc1446faa61f9211fa6e16f4a726a1cd3f3296f6241c378de69a238fa4ed5ff6a95e62bb775aa569aed66b94e6b94d75a00f573cc629dd637ea9fba6f789c80ab8b81ebc42cf68bcfd3f85ca759161bfeb41d3e855f7f7c1a96c887c30f678415023338bcb3be5167ad429962b33b0167114e0dc4c47483fd2bf8d59bde6c31827305bdfae0acb785356fa5a8ae53e18c70b0efeb93327b4ff07c8f8b950ae5f79f07d9709f45389f6d9fcf89d37ade136faa8c50074fd17b6eae2decf9708e3233ea14cacf7f9f454aa8ca94c45443551ee945382e9251557d277de65a35ec7f7e26a67a3a7cffb95380e1fd149fd7a1c67fffdd29beaf716762eacde0735f69e5ad5228bb0a06349f9f54ac9136f064a4460d1afb77652f1560e840be7d2a3e57c5fff3e5974f2f15e455f1ab2281f23fcf03bdf9e3c1dab737c5935203153aa1284e36431ccf5f7441136c7187e10218d601acb3798a4bf180dfced5b8f9f33c7af3e3eef04fac1656f9a3c885bec18d469f43d2763ad1fca9e54e7f0805c19b8780787cfae308be5310bc2b3477a54551dc0a8bd55da1cc24174634a31655a9f837ce33231655f5adf194d6185fac4172a171f4ad5028c1cf1e7df1479b2b4e196d0b8d27a54619e2f88ac6b7d3685f7d5e953572d752f263afcfecf734ac6763a2e29067f3c908e67edaef4bf639b1d2c85365e6dd3c9bb7f3b576bed6db1145cdd4ed438e1fd27f04535152b75419930a25f99fcfa71a7f625195ff0c13159f46d286a0bbf81e2b8e4fed388ae328de518ba258239a57d542391ad18c5e2e2594ddd79c920b55e31c7bd4cfe11d2fad1cdda98fb6854551748a23088a20288e9e07c5d1333e0d69cc13abc68735c21a618db0c6e7c7a1e7a37efe288a7b9b67f08f589e8daafc47d3b365cfc199b4f9c4a2317e3eb142908ee253f1a9e7474be9e8e2f81ea7e3f8e2ad308ae2fee97f7d5114f7a3ad4828ea9ffbba85924342553654d52f6acb158ae2be76a1cc27ec6df314d72316fdd0e62bcf16da6ca10d73a0f7c438cdc3af61f30caef17394a9a12201fbe4fb60c9eb437b0a14dd669f552950fae183352ce9434b6de3d2ce18cf56c3dcdf546c372c8a2a3a14a542a328eeb959df001d0aa5533a6b7c8fd4adf8a39dc1b486f8393cb4a21755682adcabe85015131f5e79ee55668d83c69f5e458c86a1f1dec8447e68acccf06c9c67ab3885c6ca0c1596cfe743ca426365060d4abe0af929e487c5a63cb51d5e4979fa335e25e5c3d02833e30ea04c999142bb14fafdc96615276456a5a8d293e168cc674f145569651e9d5854756251159d22f879f233495a958f0a0d73ef2c8ae2beb39599b4b130f7a48daa3ccf3db943de9ee4c6f1562994e3e7112bfb6cd207c3ef71871882cefdec1bf4b3a7a728eec471dc8aabacc267c01ac5091e8669d3d45665f50dbfd94051147def8c406b30fd1518a6bf32f3557d95bf5dd77d2b2fbad219a1ccdf0b16fee8f31d7eb1588daf4ee2778aad08e1e8cacba472aaf1152dc5530da6a7d82886eb4e34a71645951d19e5f7271a3aee381919d15014c5e2cf710787c5b123a32c31e8434fc71d158b2390ee14e8bb53a1f771876371dcd18d027d372af475dc41b138cafca0c1028b538be529daed38b1aee8d637e8cf390299312b1ffa0c3b45fd950f0950aebcc0d0a1beca9d42e5ebafd82966fcca97af98e8765ab1eda994951f2bdfa304664cfd1cd474f3d5ca53b1fb3a4f47ea5e9ea2624c64f3557dfaa29baf549e9e6e2e3169ba4e9f2cddec35f1c53de9e6cf23be5e626ce57277fc149b4f2d4c3fe43490cd27d6c995dd76bfd1576a6c7416c3f4bf97afca17a6af622bcbd6eaf5ec375fd118fa3dae5055c959256a0b971f12a05c41425760c3fe5d90f1e7c78e4a3d5660f47b6ebc392587d273e3e9c79b4ddfdd95d773b7b682743f821ff218bf7b3afaf83c7755c8e71eecac0af9b9fbd0aa909d25df2b7de393fcc71ee28ffff97c37fae0ae4af83f5a95f04995f0eae89e7cf2bbff3cd97139fc10f9dce880893d2f5e21a00f3d6e7c80e73b4b7e8f1198d8d33d79bb3094dd83ef79f206f1fce70621fdf89de756d27bfe2329a5f4dd8f27d3f7dd57fa3ef2c70fb9b147067fcc000e9f1b73f01c32f8e48f971b73a098fb6ea682b474e4e13dc8f1c1f0e66eec56602b30ee2b6757602b2f2625f7796505c98fcf8f48fffc38faf060f1473bfaefeb46991189f4fc68c1f1bb5107f921387e9e9024c99b85783f8ea3fff018ddcfe770d2175acf01c4e28fecf83d8e20f8642786d2f3a1276d90b187f318fff3244992211547db7824f3e79b98c1e48be3f8a0ed96508e9f4950142df9e1371e795ef4a1ed51c713369cbdf75c21b5853f9f471feb2fb2b9891af63ee4fdca6b05097d2f9dc8fcc41ebb0fc307cb0f39eb192ff89c25491de37f7eb63017fe98673028fe98cb17a6df63975fbc413a1f65beef6c27f3dd1e13bbcb24c155bf0f233d19a17fe82e777577379dc9cc39298c524add9dbbdd6aed461997e99837ca90350ce5e3e0f48d7e2884dc16aa11bc5ae777dd247b728d638240a795b7e1a067e3544f9ea29eafac0d4af1ee653a0de90b9ed531393aad8874fe290cdd72b862c761edb8ef3e048d32ddc44e7698f6f7e96e7e556861d1ca289515a5b2be2e0f01db5b582d45ba96d6c7bac20cad0c3def71de79baae03bbd0d3751df87d077e1d48eb0a66778d3ec9f9814cd614e52a342494140965778f324b843db095010fa93f311d7b9ce88794523c6372d5dd41b0fba07c4f444ee4c4285dc59d8f669a7d34118ef82117be58ebf875941945ae082d62abdcd7ff5aaca34cdd2973d5c1f2e0871c128af2bc2337283fcf05c1a762cdbb5f2827f72c3687cf09a92d2cbe694615f075d7343f2ffc289f1bbdfa39ee3a65e0a4ba64c0a414c96a9c8d0cac80b3c8f661cda00b9c4551c0593f9a6946fb6854d579df07065317ad42dd20c4c8111c1081114f2bd54ab6d22df5e2473c20441327353644505183050ae050f4407381fc340cd1840e009820c061baf8cc0f5c5c11c4936e62249c19ad8acfa41a02dc07272610050fcf6a616088059263ba7812403c211bcd76a8d9906880164e0a994a3f72fd08b632b2b9f93c8ad1388920305dfc3da107765c1547163094a30e8ab9568da238282a3c90fffd77a950a94ffef7e4774cb53e46391a116b229428d84716f69146140376110cd8451b767107bb6c86703f795b6663c240a06d4c2f4c5d34ea88ce939d521423acc9d537fc8318f1368ce067165e08f9b9859123c4704212254c9a3811e251ae9f5a04792244f05464f13564e02db0050b5c006587c6c891d6059e060f14f14d84e075d082082ac6c8c212264e72747e781b43fc2c02c56ba0d5c3574163031c8ca2d01c41926402d38a209af82157e8303322634486264e749e4089620a1f3a5005059c30722489922593c80e4f0ce161f4032d80000251941d1c271425eb1b9e68860a90ff58ce763948480207725c677392c1565840c019256641059c0b80b358133b30c4450ba602cea5cecc869a00837080a4f404cf11dc1294e9c5cd259b909b4bb914651ab9d9944d3447dc6cca2623aed36729344c292b5101fb772e29c1d3757329979604b9b9743345704b4d6616b7e4240337977229676e71736966c4cda518344c08496906d8bf3369074f0fdc4cba61274529e2e6126b86e0968c4c2d6e2ee5d211226e2ebdb097905071730926c42575a1614230d217b07f6712130bdc4ccaa42643dc4cc281e26652ce6c5d924e0f97f464d2dc0bdc4cb2617fd20e1a269464ba380fac689850cd15d8bf3389665a7133c9481037935c4d5c129279c52525d1e166520d769292999b49363fdc4cbac13e7232c5cd2319f6518e0f378f661db8a32755dc11140adc3cb2611fed3871f3e836819b49426898909251170d13b2191161e44514378f704677c484871bc5e7d19221178acf23254fdc3caad9e18e9010b9443e8f8e607f91180d1392f9ea8617e12cc249b959a4b372b38806e4aadc263e8b7666dc2cba0df95c009c4538a29b472c273e8f68bc9b47ad79f3c885a226c02624426ce94909ca11b6c4016ba23105a9e199c51626234c2f5c9202154a4a4a42d852939293521136252d8828e1607f2a4aa519ad1483d20ca0b0a41e2c294ae902b674c49690dc4a2cec3f44132517f6d7a1344150aa2175e10b3396f483259172483a4158d293188924c3feb3086986fd354022d5b07f15d646da010f48344e58929109581212120f96d422b9b0fffc00e985fd31408261ff212492cd0dc90ad215b19193510e1076f4640465b4435123d96886fd276b44c3fe3b8c6ad85f8ad1e846c48e8e8c908c94d8d1123b624251a3d7685483fd574636d83f65348ae18c84d02efea32edac59f08232f46345644c38a764439322f5846ae71c4c2fea2e886fdabc826aa617fae03672231dac5454e70c281111c39c201122ca1c4088e30f12a41129f5d5c7091bb1012c4c5c506bc1001122e2eb8c85d0809925d5c6cc00b1120a1810f67ddddddddddddddddddddddddddddddddddddddddddddddddfd7d20e8f17842310c4531013608dbc64e39719e6977f7180ead66bbb15a2e5a637313c391cd6c3756cbf5a2b0971a8af6b3930c67ced80deb6b95aed3eb61a89a971bcaf6b513ad9ce1f0827af76fc678ab5b36a3d56caed70b06aba9b1b1b99975db58edeaee8e691c7c45fb68adbc793138e080030e3828e1ab9acfa6bc39d92e46095fd96e94d5f21a6ed6d4d4d4d4d4f8cd172b714eb2ef268dbe7c3569b4499b34d6d72ae78bbe5e99be64beb2bdd450b49f9d3e2a6bf9eae50585fa3f9dca92cacaef54fe09f52f287fee7e51afc7260e3961db58957ea69ec27c95c3cf20fef3d5e8e7e7124f2456def37d172a69bc4a8a893483adc172430d002040035e0031ef7203e600dfbe7ac0afbe7de580370003f00212f0edab1f9ec7b7af2af03b64be7db5c303f9f61506fec747e0db57403c04be7d6581f7a1071ebe7d45c4ebf0edab215e889f3be58ba941d4b80a3f7f90ef0f83d8cc55a733c68bf97c956a01748ad2cf264c3f041bfc7c513f880571b65f18f18f7ac101899b8f30c27e9ed240068818c20a712f60db53415c202ce0c3adc0a5c0dde1667ac313c8fd717dd8f654042e042e8fb963cadc06d8f614036e8c6d4fe19b696b013753177dc1dc595b5dd52dc0cd3326809b27ce94ddb837dc3c61a959c305c0cdf366869b27cbdeb7d3e52996a97267d8932ddd40b2f15a149edfcd2f38e019533bf6f9a43f8c5e6829922a6376b7f7f7e8c3bb1bf064b8bb4182389de9e6dc226c1bee343afef059fdbe9e312da781ef19dd4685d7e7c32ad2cf771d37ca749f595b96eb4ed5977bad05e03fda274e6b94e3ea2fde6e5477dfe01cb4fd85e7f78bef7ac889a3ad1fda0e835d18caeab14b54c1c2f5c350ac9c57f73ba73f0a01fd14f51d535f54c51de145bf7b9f5c9d5e9d3315c5fdf1cacacc867b06cec719e40f856a09a30651563386be2000f7a9002d53f4ef45ccd9c0fade3dafebca78e19c9211860428bfbe4998dc788d2b498283a793260eabcdd9c273d21d3ce7113c678dde541cee8632594275f09cd4e6e62cce455994264a123c67f79c945277afb5c66ae59ae0e87433cf6b32a1e03939239d91241eec88913995e0d9c2b37b4e4aa9bbd75abb2ec7cbf96a60ceec9e9352eaeeb556cf5b1965e68373dad831714c669263a51fdc2f36f5e9dc87de99001d846d238b688d6b1340ffbeeffb6c14d501283d1c7c5f91d45775813507251315675c391989e3837206c7aaf000bf53f23318b4dfe7d928aa7e2e8aaa9fd716764b71ad60286ddf5796a7d33f0af5f2e2361287744255df4da2b6489983efa30c48bfa04fe90c0eddaaf0f0f7debbd9dd6d14555d14555f64e3293094d9ab929a04d78a04d79d6a04d74a43a3e0fa6eabb5abdf775de6819e67f31539f3929c7d2d5c3f5287aa9aace1fa9f58ca3c551f7c2594600b2b4a94cf6b618d350a652667df27361543dbe743db27b4e5289f7b7908e8f9cfba7fdef71ecfdd7bb7dff779ceb785d25ffcc670e694f343b79ff7d9d4cd3fcf73cfbd0f3defc1ef3ccf3feffb402a94a10dd71975a7ac367246ce3239a336b481e579f781a3587150924fe68cd42169b5a5d532eeb7dea09c0fbedbeffbeedd7eef59f0f3ce1ffc3ea73b74d531e48cd4b1248da2ea572d94ee0aa05fc959a597f442e933116da5060128615fcf9622e473a38f1077640972a112ec3e5dd8759fb0fbb8f243e58365e339ca900d7e2ef8a1af7bb27c92f4bec4654b911616f92d4548b2bac85b8fd4d715caea1f7263e0f96317f07cf1c359b1470a787e38c618ad1283ba6d4e5cab358e4ef41daf950f02bd93ef1f7e481059426006939f197ec2e7843d9e9b5d0c9c4b4c5b8a746d61b5d01469695da16c69c1421878ae0581baf153419f4f98be675ad0cb5419a2f8e5180afd0702813e047d17ba79625088413dee008126c8bacd7728cafd6685b2fa93f663eb13caf1f389a2706ca041e1d8c04a95315dba5baa0c1b58a95baa8c4fb4426903abb242ef7410d20f4916ebe6c66b6a6c369fce798dc1512ccb8fc78296564b913a85d29fbec784aafaabb70457ef06576f7a57acefb9d96960fb8abef75e0dc3f7783eb4550aa5e7f39c1ff7a0c7f58c794d18fac4b0fb1353ad1e08fef7e1e8c37b0ebc4328aef50ea1f8f36ea6b8f415ac5fb220c7954acf3df8a5cf41c71a7e2aca84f13ee45032dc71dfe7bd67dce1792fd57d2a8a0dac0a7ef79ef53c67c1272bb68106e7541913467c8f96483e463753cc7d36b0b0572a5daef4b9f43d9a3e072d79e28b37cca6db837bcea6ca982ede55111ffc8e246bad9f8a3261b8f76eb68165030b77eff1984a13d78e24b9074d5d773a716f02fff3b837bde7b161f23fb62bc8bd09741b1c7296c3a2f87d5fc562e9b3a928d3c57bcf83b67e7e64c71759f1bdf2a7e5c4fa9ec779e2f59c8e957bd2cafc3ff49fafe8876ec5e4e721b5bb333a3194427c86c9db7d57bbfbdc8b1e1b0c7bf7dc0fa9f87bf26f17865288109f850f12c99b5138f5837c57ac32cfc8d5eec5300c9f1b65428ff510b4b3c3a09dd8ab5c579fe33a87eebfebd92c84ebb84bfbc4aaa033a387a610aaf0f09fd55f341aada13573ce09e4a3d128a59402f1dcdd1d4867abb502e1388e0352bb0e88378e0784764c2881cc18cef37dc1ddcf53f3fd7ef5fd298f7afd9601f7b8e34312f69c30b7a9dd5d83f2e449ed5683f2844669adbfdeba9f7bd2ddee4a646cba9f8bf577fd5d77f7dfa2ececdc6e51766cb5f6735dbfd7efed74b72dd684099358ce4c166bc284f644e786e39874314fd6fd1f93eebea9b5eb5adff7ea07fbc1eeee9e94bad7ea79b26e998ca7bbbbfb44a97baddfd78d3ac984dddd08a8a161fa61c8f33ceebf6fa1f95a8c78461ff5a73f4769feaaf538cff3ae87600e5dd79e6fa16969dda837bf3beef8fc375b582d455a5a54e5fde77dacaf6b61b5d04c98aee5bdcf415b8a4c98fa3404f9286fa62d2dec2055f9e1ed7e76efffdebd2af5b9ff7accc1fb79330fefa7f7f37bff169aeb39686e69e10f1c77847ede205fe8f3bce7a1efbeefe3429cdfe05a6778e777b6850664c72fadf8a4adfff9b4b0c8f08629fdf97def7d3fb91ede735785cef73c04f4781fa44eefbf9eefdefcd0e3f9962213a6b1a7c39e372787bd9f2d4526ccb3bcf73cf0fbbcf99e07cfbb03dacab2eee9c8d0af42a1fc9e35dfbb3904c4dccde1610b8baa8ab4b430ad8a39e339a80a21fd9052b29bcedb747e772a12f0be7b201d43838577bb8b05e7a9193cc71d93be97b57e0ee8db9151569c5d0c176307a9c283be7b5df7d941afcfaecffa467f7f0eea2f8871ef2f588dcd4d0ca7e59ac16a2dd70b5663f382fa53f97da7f24fa87f41e1d0f216adc6865372b68be1626c3506a78cc129399c922bb917adc676335938e587cb22aefea982678349e7fc15ac600546bcbaab20ca576f5584c241019f4842f03eb8c350010f3e1177182aa801e8c11d860a5ee0093d1e10c9b461a8a0083e91ba3086a2f0919125498691828a49b8c348410cca1109480c230521c0a7695340239a818511480c524aac74aa318d28388948bc4811e10e03090b9f1a9cf111c7b042c330a4392845d1399150247e83e9bbdbd4ea4930fdea48382698fa8b46a9d76a1467dd6a4e83290dd377772532b40917eb6ca8122f07d3f79c604a6b6c75e766e4bbd62dca0e7d5124b65813264c62393359ac0913da139d1b8e8b7939b219a3ff31a1b4eb683c9ad6f7bd666bd2783c3309a693d53d27a5d4dd6bad3219279f1319f804a4c93c4ec2ee3929a5ee5e6bfd3e907a50989e64c61d1307194cc130fcff1dffe1531b3e1d75844eaa3ca12a4e4547854655eee44f2c5f59f264ed89e5294eac5183734a92fe537c9ed4c1926f6fc7d09bc7174110fc7c2a51379e14f153b75419356ce36e94116bd41f01abee543e91517aa7fa6586923dce897bc1fef279d7b8ae6147f9eac506c7d9a028cf7a40103cc2fb107c8f5dc2f33cef2e01de5cbbafa38fefabf75fc7bd0d8ae2ba23a32471bdfd83284b708f3c483c5d4cc2b651863297d84b7f0a8421014aaf370441320c5b9cfdf9397ffc6fb193193f74b1ea701cd6faf5dd0699eff3aaf478fafe65e4e014dc3f98d9e0d07dfcd8aee3e76355788cf9f3e3cfe0f063f38ec64ad0f74f823e6d4fc7c4e3eb98e3d531f1e77347dc8956c671776719306773155680d3e6991eb30c98ebc4d07e9ed73d787bba7cdeede952ce8cb3f341d87d48eea8efbdf793fb9e651865be6eb6fb274f7c1dfcbe2a442aee5f82c47ddff333d807e5be2f91893b4f5f951e354877874cccdd1ac467c0494b10d6f0343414f9626a7cdbc8600d35ec8c0929c9e6ffa1b1309ca5cff3467f49a4eebd27ae230f920d92455154f72512a9c4228ac052c771f9be534afa928d8f5883ed981ab66368b01d43fafc82bb27bdf75d131ba4f4349ee5fdbb1f348e15ae867e9df1b57e57bfab1d8d6721b17c37e36bfd41921cdc48c0fd83241ee0c492e57e857b1a9f83b2882b760912db2f59168e23558ee3dec6a5aed107fdfae18d1a345c5c5092d87b961a33c6c71d15352305754ba4008835589a1943c32df231347c0d5be41443c305a37e6843a4b092c23e257dc3bf7de520507f1dc8c2fe2c9f3b508b568905d2802dd2d863ac79e2d17f3b2aefffdd6c54451a7bf48c1c667c7d128fee6be9bbfe649e5094f9aa63be43f1ff45b237dbc0ddbb0bcafadeadbf0489eba7a47cb5a44b5d97c8c4dcb78c3a0230030bcb8a7d50d9750e5fb1d45b50e62e86bb265415fb41e3c8f4ed07a197c6e7ae8b81687ca5f1245b9fc536a6f1214a64b14fb2a51cead3f8ff94a72faae26ebecf8d2c57a5c70c7ffffe0c3f471db5e6da5861795b02c08fa30f1acf72894cbc7273fd7f318703c0c655e9717f869fe1de20ff4326a6f13968a52a7b33a92aa12a1a370809fc461ea41a160c1da0fffba52752496f5f8548c54b4c1b8df78c3ee8932e91894b171c7db07cdf5c7fe573b8b5d445517f557a8082acfc9089591e7483703f64be88356cc754aa72fc958c324655346eee5779961ba43b1caa5ab94f515d8f193cfa9e28aafb7abb0f5dc43beee07ec8c4f455ec0c5b52548ae94fb78e3c4c5f5fa42ad3155d700500ae2ca42e368e3aed82126365dd51766217f3d5b47de9e613e9e6b27cf07378632e6441367f60ccf74f56defc91275c759460e75ee6ab0f8c4ef907e1d4834f86fdcbc17c82c1aeea74318a1a42e95ffd3fcf1f664255dfd79befc67c08c0fd75a57f8404e038ae56b0ab62ceac703744a141abc31d060d587896180c1b184fc0c8c11977186014019fc0889960091df5b9d73175d4eb65a9a356991d7447f783068b7e2c66df18712b2b366c9c4e75dce112e8beaf2cebb883ca646fecc828e953aa83eaa02139b137eaf840efc4ee6ecfb747ab615a5bb5956beb73792c8da945ca6cc3e5b7b65aefd1bc5afd72ace7c3aeebba9b6738ee3f9b5132ec75dca92c5d98ba2b07a55f5ae7d5ae725eed3a6e7ea247bb3084fe6d23936878ee94d97b956ee8e2628b101801c107b4686551040b9a2b3c60056ba60a2aa690a20351dcbc26bc219e131e11ef098f892594e040121b10122423718411384af93373d17087c185007087e1aa01fe88d19f59e3287dc845ab455a11b2c8b875c13606ae49410788b9f8fc6df1b90cc1e79311107c46e1f981cf2f78865a7cfe5a9fcb2c3e9f8a7c7e2c68c42b3e7f3897d873c29ec71e14f6bc604fcc53f4a928a5785c51507c7ec14f7c7ec1443ea3b0e78437c46bc263c2bb2df1f953e273c981cfa7243eff063ea3847c7ec141320a89cf9f4f461451fbc0fe2b1b012e0f7ef8122717afb9c56b86e0358dbcc49f20b819353f30b5b8a16cb66e289b59dc50368bdc5036b19834e4bce28aade9812bb6a615576c4dd6155b33555071c5d814578c4971c55807ae188be28a31289eb8f985c8cd28276efe21379f9ab8b96462893bda2871471b0edcd126893bda6ce08e36423eb0f183dcfc72330a899bff889b4f46dc5c16317e60e307367e60e338ceb14787f30c2ee2c397af423098eb05e3e205dbe2050bc10b66e4050381cc57a1ef03377f65793afda38a84323cb1085bb1ef2bcbd3e97fb2c4d68cd8c225153797a7296e3ebd14373f0a15c5cd2fe28dfe68e3abd1cdcb0bea899b514fe4e63f3971f3a91c7273d98478fb98b8f92b97b8b93c2971f3e93970f3a392b819b5819b5f701e6d30fdb1467a1172f30b2ac8cda8cf37ff09899b4fe5113797468cb5af3cfd07161313827d3eb00fec03fbc03eb0cfe717fa5e4c68f67d65793afd8fde452e9274912ed245ba4817f95584f37d65598a70ca2f9f1bb1e8835820168805628158a0cf2fdde886f4a4273de949ef8d6cf44935bef2bcbca050ffa753597afe72797a77c19954d371d58bb85f70fffacc3e345fb93cfd4fcd572f4fff73f355059e3ef9f2950f4f9fbc2167e4cd57403cfdf255de94b3f2067af96a88a70fbaf115114f1f34f355069e3ee8e62b0d3c3da170689c96f50cd536500d794e1aca09803c657346dac8d4455f0ff84c6b32cd9fd90c54f6b999da807ca6372b7e669fdd26fb8d06ac67c03a11960e6129062c15c2d20bd8590bc24e20ecacf154bf05ec6c79aaff077b84a7fa7db00ef0547f052cca53fd3d58c7f1543f0578681a407ed8f6940f1b81fe1c7a8547efb0ed291d2f63db5375468e05d8f6949700db9e3ac1d8f6140e7b805e5995017a00b65f6c7bcac572d643137d006efe6edc5c8abee5e693e86ff0d06cb81925fad4cd2e387b68289bc918492b5925aca48160a01888166261fa352c0dcb6257ac8a9d6153ecc99a6cc992ec674661a2cfac6f387f66d306e7cf2c86e97f6ca633d0d5389dcda0c9b2654a03bdd76786a3c2a30c78debcc42c0376fa144fbff3279eb73fecfee88c329f9dcf8d7e6814f5c475288a92ac5186a4a128fa8942516e5dc635d7d5ae733a3bcfe733eb1bf49bc878454a1e9485737d951edecf9f3708763bbfff28aaddaaf4b841bc39e79c73ceee7ec1d90fb7af42b35968460bcd6aa1992d34bb85661e2b34f35aae0ee6ea6a5c9d8debc61573e1b86a9fade46e27d6b730ed5c229ceec5e26c5837ac180b872563cd58b49bdb0dc7bae15a379ceb867bdd70b09b1a9ba7621f4e293bcd9e86aae151b561ee3373358efa2f37289b7fbd3e33d4cba34e5f7e66deabb6bc182e3413b946acd1cdc8e6bd3eb34abaa18ad54caa8a39e35c114c4079aa3eca5178deea2a7e758481020ed76f5982ebf79001ba2ad1ea1780aa3a8c254870fd5a5f6aebe01ae3b4a4aa5c4f2f85155c6de05abd8bf95f111fd4b9cf41fd43ef3329f3ccb0db915094085697886ea80d07931125712414e5600c014a514c46549950948b48197652e699d9ca0fcd57e4cb53fedf5796a7d33f0af5a17d688dc3c320265f950b4eca7cc5bd77cc6765b3fc617a979865f84a97358ea63028f34824f3ce08b4bb69777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777707a916a8442c17564d102a44230000000001e315002030180c078462a1300e0359b21d14000f76a24a724ea10c8431a694318a18220220000000000000081200eaa783925cc8b116f54a700b934c688af5a58bc9c0854604435c07f68e83e428c0c16090d859095a1b4aa5eda5f0d935ce861c41baabe47d5d9aefc6d139f4020b82b710044fdc28e99c361fde3ad45d154e19ee463940a847658eedd754064271d47fbde75857528fd37d04ca6e6c81658a1f8a36d6e8574954e3ebe759ab4765fa5efa21ed6732cc5c614788e9c70578851d4ff61174cdb2817e3cc9c5fd484395403d8d45cfc4d5ad32df846a2ba10b936909915dd34a519647f7f75f29504114c3e2c90c63034e3eac9ef59e2174936d0f2dc650f71715cef910082803aa56fb1f6a976674b381f39604dff6788b8b2a56460c31fdcc6339baf7b5b8f642a96ebcc1430736bd56eb320468d18086f390d0bfd0f5708661b0223c9ef45af9eb137d38518bb0b9c1fcbac76b1845738327196ed2b917258b36dd570fe30cd007e22904a3b765923bc2b4219bfaa4dbc02aa930baf0b6134c682850026f31307b04d549dc4e1fa467710d73fc5bbe0294deb7cbaa13cb348d6d262ff165c5570f374407130b58c65698fb192fc56f9b59e0a0a6cd73284a2a397b5a8af913010d8f107598cee9ccdff03560b73578b02a44720f626599ca248840e69c6820f88d8ca0b3f3e8a53a3d3d86adc12d790f29ce0e2a453168920fee556ae45fa912415f3affd85641be258c7ec14751c023505acc994b1ab88d6208710c4bb732ef0b1f8f8ade30cf9ba9c42fa0983886637c93338d0373a5a5311570e55d2deb4df4701c92d6df732ebb06b848d09fcebdaa89d9477fd1ae5745b95ddb50707e8374d3168765d5644ad39ea26300b91a3d3d1681320df03c65980e2a415a49b35bc1e484eacc8c2f9085fc522c09c79754cecdac5e8d1889fc58f4ba5d14e568cfc6b5a2ae1875fd0da966d4c3f2a5e2aef8404b378abe8927a56db9c2daac7b9f477b433767e975d248393fc9ba7fa4c5fb9cac968a3b1bde4da134eb29beeb2a947a9e92270904ac66671977ada18708e064433c44458cabde84c2449c2f72614b362f1955481006671213e7745690782dea77844608ee0b223c956c4eeee0d57d04956679895da6748e20815cf10319ca38e1998fa4749f4ec6486f1b18ab95b0a1cc217e6223c50842c8fce95b006edb84cb4a801055357613edaa642ed14be4ccfdb7d6098b6a94c99eaf003e13a5186ddab8c387bdd28b1d4c7cfc1bab430383be007a64a1bf08abcdb73874dcfe7c435964a8c3c468187167868365d50a2f03dfefc5511b6fb093573b77cf87bbbd9cfd847312dde97cb1e5492fed7b60a52d44889c8af0408301c3a2dab28011a65c2e87b2217996a4e160d622553df19129c7c279b7a6a2c990c3d8f3b3a635b95c74588b7b3ea11820dc12c593e2019e0bdab5a6484c26938567727c2f1fe0843ae0423595e9b697df10a6ce46ca0cbdc05f86c28246e61999f7cd41cf8a218a0c75b060a711d7dfc247baef8802ba1cf9fae4c225493abc9892a3dca33243029f254ea05506ca068917397acbeefffd2bfa4f87032cee319613d0be3470aa183431509a1ad004ee78d223c80b4441dbfe3e05fe68a6820aebe3805118e269e6c71da25896f9c2778b642a570a765b005ae3709d52cfd5a7bb140a2ecb15a381a8143c45b443cc355d3f022935f984ce452cb0bc098744a91a47f62747cdf88c9dd67521d50dc539ab04457dca0d7dea6750e1077270b51137d37fe50c5e687179fc86c138ccd49bf90583f7a6598869534a49bd1856782d7d93dd6713f2f3e9f240644db4c76e684b34859d7b1fa418235c4e2d3fa068de93d6b5401fd84e1bef6e271a3a719973eaaf8cd91bddf109256b308fc015319c581d874f35ab47c3c44dcf04f849746545b968583aa4526eb233f2266ba29d075775fd2084151f79fc91b9657c17839c784384e9013fe3afd384bd098e364fa75c5c43d4e7eda6f8fd425eed8e2762ea5624383817d5972996cbea05bf7cc00fbf219eebde7e9c89d5f3836d0d28d33e1b6b4a0f8867cbef1a21cef483d3272fc08125408fc173c86a5e3179b57b56c918bcf8443aecd345bdae0a2c4b1d6ab24de388ca1e314a8fb6f876771dcfaa98544710641e817483638c77e2ca34587441ccfe064461d6481b8036dcff5eed8829229114d329d8f40b50bd03b26e4da738f7eb2afce72b00007cb0297917c509e945db4c52451e38878579b69a1ad0187ef76aacc8c548ead1212c7098046198fb6961592755ca4faa018dd3a1a2c1704d2e6aaafde000f45cc9c5413907e4bd29ed778484cece3d41b8ed845d341f24e6939f41acf48cb6f36bab296262e5dc298cc03214446f53366a80d8a5e0969a05da876e2041a70274082e894fdd09039c90ea6311ed135d399336a04948261402421b30df2721096864830d52986d5b9e2183b8267b840d60e5a30ae0b5400431966009083810cf0d5763005a95ad80325bbb5ea34e567154def40d1956590767ef41b1beb0d9a894dd23e278e70debe7a8a02baebab91a2890e12349d8c35795343cc57de41ef31079a4cc94c0e845c160cf3d016f748a03ed204413d6074bd4018297d51ad56d7a061e462de21ed884d8ef492d64ee3fdfa6733581876a077118c560de57dd0dfb105e92f4c12abe8addf45bee96ee8baf2428bd78832d608f3f2838390c0849569f6b74ee96e40d2452edd4c423e23f961ba6e9a29c98c257a2f0e1ee588b077b47510aa1a362d1a14bd4142c04887032c12a08859a15ffaa6cee5dd35d9a3325d00a1b25b0a2d180c3ffc89a0b286a5556efcff643344be66fb4d3a9b240f67940ea5b522b7c1370c15fd195ca2df85a61831211808f0b7025689458753583956273f4f3fd8c28f60068ee1ab81c0003877b4ec977feb44bfc5f7c451dfb060f1ffab34ef70fda776aa74f06acd45bf9b9bb276635ead6f25f92e1f79aba445ff75e41cc8cba003b8077f64905aa1561d7428fdf03c1a1ee0a62561da016061a8787d5d653e7b01cf04a1fd1fb549c3c84d84d4ff8a715618e200b28c13f727f73edea6dbab461061cb3001a56128797c620a71b4c36b90bb5e8d2bb181bdd13afdf1ca5e66f87d817008e98107c57ee587e84c359f7abb171636076b8c25631c8d907fa6d25a192a85c10825fadcf36f05bea5dd9c4d0cf2439f0a426528117a24ab57007301f4e49281f101bf97cc3349c3968edcbaa01f7c96c5be052b9f48ff59f7f68516b981cb135e29b52ca803eb16f6e30b4e7feba9e4ce8c0d4b19586a8b81ffdbaaf8f175f31a5a2dfeb53030dfb70cc479da02ca634e35330066911374c7427b02c9799de12dae203d61a4a20fae26efb69f577c66a7423e1a0f13c9bdcb4c7633b302d20eceedcbae1b0522b3edb7ac0617c2a13a37cdaa9eac446cd1a3712caa7239544f1eee9d23cf42996027322035970ec22b32821575117c2e8449030090ab1aa61a954c0b42cbe500b1816b4246e20a32205afbd40b8cdecd10de1606012438be4fe2f6d2545932466b2cb8b93fb406c5144584224604dc0a4f9dab9257985bc8b9f25ad1eacfd737e3b604f379528de2a7c7e7c3ffd48cef6b78fdcd1eee62379b32406220896d46044b6821d1f0b434a3af31f669fa32efd614ee8984872dc6a058cc3a53195613847a04cbefe899d6540b116a8cbe5979e82e509d6a9db56a09b2aa60f4d330e676365dab51cbc1e82e04f50105cbc627f60e5fdee81a897fc0e5cbe420e54b11f2fbc42c31f169b125c56ccf59cbe2efd8323586a8fea4bd93cf3daa45c6a3d24545fc4f1bd64ff3cee92f1913897a48ce3b7a46b206a49dda1ce92e8bdb4fa1243404b53899f9df77ca80c162bac62788415c0504871eb029b1d642dffa4f892b9be4eb061642a832dab10a672adae7c24952985c5daed43ad397742d82bc6b13871f1a8da35e358c7d8a1b071c8cf30708712f3e2e7adba40acdfd09f30959b78bc1ca737b9066ddd9888126ffe0304925a805c9a7ce04b703397c237b6355c0047cb4552dc888fe0e31bd57dacaf8f21b2443e85799fea4045d809dc921805ae3ed04a6f5663a7a86d6ecdc6507eb01707b6d3f6ab61c1638a9db5568521adaa73d67735878cfcbe2c9ca3d140f1ad81dc4a913b37f82a93e361ac5afa96542c3e88337fd7cf49a5ea1acb7d4d8babfef792cb880afd3aa4477eeb1a2bd6ab5341b4a6ce598f7026658c00a8efe9dc4e8275e9ea784698210ef173893e5d5c6f8fea7931b4e8584b9ef41575458067076120dcaf636d15c648b21a604e66f4c67ee022fc69c0c82c3527500c47793856d7703474df967076f8ed24ba9154d45dfd414f1752fd400b4478106d04e75cb468bee32a2ac9ed1b408c2cdec5487cef4b7ac814c13e1985e5a44194114dad2fb003b9e6c8da39f5186f2d730d4157fa1f92d41785f226a23441ae43b5a3833269b6e33255981c45ccedd3af73c4ffa87e50903827da4f7d8967eafd789bb82be1efdf13c3be78ff75121cc1cab68ef712f91ebed8dcc58406ba4cdf88a74b6137194ce9391194715e5050669aa6c68c58d152fbb911e897c18b423da60ee8dc40e9c4676cb4a0d687dc5b4621f98714e320df5572a94869e2f188854a931969ac34d3946ac4a2a71a6108285563439504ab6ac4aa63d528c36bd578b898935523cd1c920259d3ab710660c9007dcd1a4b0bec19ceb935463d264a396567d7b8deaff1e08ffe89991c85fdf4bcf76f4a710dcad9c75d88cdcbad87534228f6a1d3dce3948e452c0cbb89ed9e620e1a4197b1fcc7291be9724ac5c13fb647f8c6cc9abd7ac4979408b26c659e77af53be723a4634544f699898874b6720a12fb06e93de58c270255612a3d3a871c396918ef1321175442cd0e44017e555b09c1a4bc86fd1ec629e0e13ee9cbd601db149c61801344d55ac5bc9156524a0258c22c854c4a1b2aab84245cd2de9a54a84a1fa992b124538dc0ae15d44dcadcb18d37146bcb8613e31db9a0848d24c5d1d8c00c7713ccbb876124d1deaaac51d859cad98ee96710a72ad04a01777b47eab8b11016aaf4cbd38682e1ece984d2d060071bcf53cef31a5b28a2c2638ab223053744eaefca4c895e1499380791ebb7bd154c4b9d464513004ae338154fde448b67c0755cb67ae7d1eeacf8228db452f5582eefe0aba6aa1384c4e7f650999c8a2eb622f27e3e14f7c66cbf1118d6e8b8e8f9df82374c8c75ab13d53137a8f4c02b5e46a18d2af6c822b39b3ed0e388d9b010709d25b55e130552149d2013b2334af614a947e45990ac417584283e0e20c10d1b27c3f13df47e4461ea1a71fd45875d6a9131821355d3279c498321fbe3b8fdbd5dae6511ec7aaa37224bddfcb913aa8361f984a0920bcc6675c6a608e0dbfd656192b4ec150baf301ebce1872e050c4e597d61647fff8d66a8b0f908786e37bf4cdf716d6db718592df2fd80d42a9e28b6df0443c42227aa6c4f1853d128ee863feddec4992c1650cdeebd02683382f8d678a13beb5ec48427c23ecfe8a4d341a12559d6d181b86fd28fe6b674aee5bc1a13c132f652df1d3c9f4426f64fef970c5934ce5b0f68a0be9a110f52639463e823679905a749d71e62efce31cc386559120f226cfe62a4099eab7cb1bfad13a4ade2134537736f8034c0a0e20360a693630375815fe24425af1cac7bf4708825456e784cd3a1e5522ecf25a9639d304b11b44bb61b4fcda6148d24e9ace44720ab482ad90160764f959d9c6238a332c21d8c197e9a0a1ef183260badb4c7fe86768c6466a325aa14734b51af0df8419e35b55826d40741c44c55d5582d80b9ab61611569540bcdd8e837dbaaa746274f3b8a7feaab2166751038759558e648064ae934e2f569606e4fb87130dbe19ff71232010263a2792aa5407277da883d3e1cd1a3da1288f0bb77bbeb27aa18396730b567ec8e133836192b5b80a57c327370c7c9e1f1c03e9a91ae13e2bde7ab9462f15f00eb2d61c877b0f9e7ec108eaccb786cbd6979e089427f2561d976337ba4f4ad5868bcb95f000c0919664e8f50aed6fb5752f465a76e1ccb2068efb2a127c7c1c1c9acac109edce24fdc427ec0db328787bae14622e2611e76387d693370409525e7dce42d4f610b209258600b3ae3ebc9d5c358bac8d98605934a5600532e833ea5c5360a0817b537724d8bee104c606c31b6d2a012b99702f7852c5d010e01d3040dca86daa03336f7dd48461cd63686acd438535ba3d3c52dd481d9e35ba73074a73f7f97ac327d9936205abd9b2a915de79d1f1310ba565bbb23503d4e14903d10fddeb74ff05db00b0a789355d5b425e099bc07bccb9f3267ca3e33446947bde0a52c3222143761b169d507ad97117438a697e7b7b8a4b9c4293552fa2dfc73d0351777b71c1f4cb116b56d3a1a92ee27b6afdf83cc132ce1721006c2dd58c1997f139b82aa9fa002b2cdea7b47046620c3ebe2aa91ac80ad677fa633dcba274d2e7d0812b7e80d59e765ccbbe2a4fb45c14f00a1f78bdd71ce9b2d68a733d970254d107aceff4c77a9645e9a4cfa10357fc00ab3dedb8967d559e68b928e0153eb8fecf01999dac3fec74d7ca260e4d44bc2e9f0c2e090c6de614f0b15a2b20da4bb563c6454c0eae4aaa3ec00aaff79a235dd65a71aee752802afa80f59dfe58cfb2289df43974e08a1f60b5a71dd7b2afca132d1705bcc2075eef3547baacb5e25ccfa50055f481fa5f3ed87c62f964d1bbd437733811627a3972507968b8315181c6d55861f13ea585331263f0f15549d54056b0bed31feb5916a5933e870e5cf103acf6b4e35af65579a2e5a28057f8c0ebbde64897b5569cebb914a08a3e50ffcb079b4f2c9f2c7a97fa660e27424c2f470e2a0f0d37262ad0b81a2b2cdea7b47046620c3ebe2aa91ac80ad677fa633dcba274d2e7d0812b7e80d59e765ccbbe2a4fb45c14f00a1f5cffe780cc4ed61f76ba6b65138726225e974f0697048636730af858ad1510eda5da31e32226075725551f6085d77bcd912e6bad38d7732940157da0fe970f369f583e59f42ef5cd1c4e84985e8e1c541e1a6e4c54a071355658bc4f69e18cc4187c7c5552359015ea7ff960f389e59345ef52dfcce14488e9e5c841e5a1e1c644051a5763e53f7f4605967a86b8db7f2d54ae1aca3a13848cc9ff5e26fc5653bcb0e836471934246725aec2c9d9f723ff5250c1d86de758eb959792f53213676e93440ef915cfcbb2f88d8beed4678cc661939b4232f4d774d503ad4fe1e7a79aecd6746791102751c283ee864739d7c689b526cfb892ab55b05ca8fabbc9c30e36138ae7a2a08911a3d3e008b212ef203850ec0ca84f121a358be45560a90870ced6a7b329b8d5f3130f306db5d7f4b45c27f694a48b05ebf41062e80264ec463b441a9d623f872f4048374583cebcdbbe8000b28a4e688bc3816eec3e593db64dbf0782f692b078738c355f5b70778f71ba5d7d0aa5944309fd0254d32faba07d1ac581166c46dda2a180ea39aeac5e34aa729dec4805ce3063d926d5607bdcdbfe7a51bb8f1f6997ebcaf8811240b194b887dbb8070d1770301ae921876a93cfce4e36cbc10f2cc74342fa18077cb6d4efc3c06689752a25aa23630722c1d141fb800a9f0af7d393a12149e730ebcae9f5fd5aaf22b22709a7a8adfd6da6a8b8b8b30dec8bdf7d1ddbabdff7341fba89e2655de630975225780f38405e2dd92983b01e962a255e7c710159ed6cccd4c054b11a410f7cdfb09e5f3e5d76ac85db5a97531f558aec9e2811cf1db85bbf4779e8bb8c16c47b29df7c84522f24d2bd27732b11f46bd91006bc7e95778dd1dcaf2faf3169fc75820893d15f9f63300bf737aaaed1c95f7e2d362e4c2582a70d453fa2ca6ea323cacc60dd80875f36e623e0702bea35250afbacd3da95ce47f59437b9ddb1c0b04824dde93996c6b96c21966523a465ef67b90f5e3f40be8d62a75e7891c438009e9bc302bfe023638824eb81293b09a6742107383653d947bd848dce29fe9aaa51c19923207c205b92c1a15709e5e31cfc400208f048a94c295c29f9bd033b68e653bbcf6edbd2ae956c1f4a701fcadd2769a6d00e52a89e5491c229a0f2013850b66b04865f7555458145bcfad4542451930b76908f5ec81e3a7ab9b8cfbb6f811bb0a5a0c325aa8c6ff431d8e0991c433e0fbd4093588b32bce42339bc4cbd847829206a2a6a2edb478c1dd8cfe20b697d93992c6860aa199dcbb93599888c5bd7c9c30cc51319a1090d684307a18d0df7289b6fd667653a720460b81f48e2aa663d074210555e8da05f112f8df61af7f19aad42eb8d417cb685656b53e1d3519107defcaa4a6a24a1577e2437bfad92cebe1bec3a16182029c402899a0ffa8a084454c79001cd6ced891844100bd174aed2297a1150b51e43d927fe6d64626017288f7783e545a88062534af4591385acd8a69b48ff0651f1e57f7467045a696130b8ccf60018281f351a7326442de4b72251439750d301006285b2a477344325b6b81f6fc0a9d47b031f50d2e096af0055464d6061aefe61272e8b14c60fc8b6210e04581f44073ffd30501988eeb76b1c93bf2a5a18fa6c0f8fe2c7e169848fde7d6493d2e2d1495bde93673f740f4418f5ae332778312000dfe9916fa9ee13f5d3937b9727f3ce6006559f05678f5cf4ec94e7b96ae659a3f2f854f564c1f4ac177a1e359136a183a8cd3ca92ee598500cef80cdce8229e06ca1c989dbc2197fcef170fe4014984fd54ced2b673342ee170c376ad37a1983554f10ef3c8973e8e54b0d9faa891f4b3de4fec02f3e79c5c3c2370d8d240cdaa0918eec0d8cfc70c3211ac131aae2b018a12aba716a93dda791dfe016445ec0a0d23c384ffed6a58bc5408c3ee2de7278031dae6ec1d2d982a207a4fcc9f36e19777e105b8acdf6fa0a975f53a41277e23fb7a3c7d67192aa01bdb037c5eaed2049b633e7b4f347a8852665a6d7e2fdc98abcad01f05094ea9fea0fb8d442d9bb1e8236b5b00b7bd2281a6debcc80cb6b5a826640e5b4afc10ca83a5f3c3b530be7f9c543d2a98585f36267137b6271d3843a011a75f42c91a73d4b9d05e5c7c62d96f51a556797b0f39f5740d36bd5483f010d35acf3cbac13ff41211ad53abbdc5be7f8739ded4b0e9ae3072e0d8cc76d08dd20b093700b3b736e40e5de46dd59840d195e260fb5ba6672a3903fdb571599cca9d788871873a9ab3c85f8d28c8c78a93675ffbfbff312ebfc19519e7959e7079d45ec32baf1c14c24e64a7b19a3b49a8cfde6aa21c75c136719837c1f2a7b6188785ec8b506ca1d49dffae9e68637a3e7bf2bae36da2c57d143aa6c365fe2dbed4f458f256a106921099c898963eff3b8470ce65f2b3d300e77fa6e4a5439449e0e68b8a1ddad5608b434a387cc340539614077810572b7e5ddae6c903888fb27c790de26f13ef440afe61a66cf6aff59443825510db93ec21cc20e8b8a321c4557f6cbb0fda207a3f047a42f77983537f5745e15c1e89dcfac80da89acbf14c4fd1ddfa0747893108cae8eed6af22fb3032ed860c3e5e383a7d2b490fc7ba89e245d3d2d88834bed679c20b58779b0fd0cf02b286886f4e04ff895b37adc0db049c7f16fa16f8ac8fb7f8c8db8bca582adb3aff1e4e6d741e5121c2e337199043492e3e6b4c2a8a1bedac120a3f64e636b09a74645ddcf1834dc4d7db71c00b5ca509816c2fa2caa1166ad252daf6912101dc2365614b1612bb98f4d0ab48d06b77b0b5d082ca5e3f1c508e78d003bc370d821652df4eda49505fef8a662d7870eda1a04f3674345a521b0a2d1483f533275973d2a454f0c392ceac28e31f635f717d3ecb31db734da55f59f9e4202a1da31720edfcbb2e416a15b8b307e3f5b3381a48a11439966480ef01956d50e05bf485cabbae61aa80df0ff292b0f2e0484d1f4ce9a483acba580588b6a46716acfea886f79e4035dc7405aa5f82fa53c266f04d339f1625a8812c4c4124bf81ca2eae2d8ad89b0a3e307f8334e593f50c62089cc854ccb100f74a921899b91411140e3191033d3c9766766dbe7750cea74d3310c8d95ddfccabc02c7c5fff278f1c5e5c082e34aff787f22c850e320b2ed98598e69d11f856366e164be2f168d4121b2a8f607ccf7a479825c7134bf6a9546482c89e0c3cfc42021b973da107900304abf08006335de82bea2f618e8d832a85cfdd513e60da859416e158ef58a789030a3cbe40f97857c84577499c5682a185cf00de6a4ff8d4c60b930b765ce1f967c4fa3e337e540f4913033f2eabf0e1fe6ac88edd68ada5bac5932609d21ec04d2ce755f5f5c49568a334d5b32ebd0cd30a83c0569206d4741b794130fbc9f8a6bc00db7c80755138b433acf8a6c5f53f70195479c5531ab6df990ba65a587c9b86fd0700ea1d32064b2464407e18dd604a6e1419ce1aad74cf47afc9799c5a3401f97f16bb08a7fc00db7fa062d69eb1d329927966952b69073a443b8cadbe75460a8b2e1d68f2e6add4ce7bb0b237a68281fd1766646b13c44d88939093c74d48c624a86b4825d53b0eaa4501a40e6da837c5d012e5e1d38029d9583d6f382bb7713af87ad039c4e01626da84eceb635007cced026127586da1d00dc6ac5c732eab7fbec0e48d53e3d99417e8237a06f32dc44946181cd400e6f15e3c40a706d1f41861cfe16833479a8e63cf35fcec37f37d37cb92a0ad446cdc35bb54eaf9fd879f78abc01c4d2941621bc87372c146870a0efd32df604b5d5447512f123406085af571163208af18d6006c3b0f3a9c88c2144cd75dc9d649426dd20f3f9606d67e118ab6387c125ef8bde37df0d12484dd1409793ab428b1536c73167eb6ab45fdb6096a8731a69e53cd3a5a8072796ac59a438a5820c112370464edf98256a6cbbb0d2fd369be8e252b017e3719e57a7d4d04b6ad3a55d57fd652106449a60a03b34a2f21e1c9f89daad270f9a22e85f927f5a6e8beb65d452ee6a4974de927b6f7bf8d45b4a3d32e136e2592978ea0c3203fca58bdde3330584306fb0402c9aad3be9d68ec9f05acb9e6feb71fac984f73daa7c1ffe0c41257100d77e10510883d8724db57a29d2606392a332cf8895b43ef540d5f19e0c288109e1e377bf561dd67f2e0474a4bbf42c024001c76db8f1b7e153b20eedc67f0e3986503f37fe0c5195e7e1445bac60a7e31ce62187675677d33e3eb1b6a4a216d8c75921ad58c15237e54ba522670cef8ae2f490afbcf204a2634a843e6ad43c3accfcdcdea683427000c2f02ee2e71d42a3298dab2357aa1697b0f222872fdc61499e611702180a0e6f5bda8c3ada403a69c8e3fc8f70fc1a313f5a01f8d35ee89b21ea7f7a4844e414d2d2f9b3dd84d1450c0dec45ecd16a788e9d2a8d0e7b0774fb18d2b30b3aa70e14103705b89e20c812a09a770afcc76922952ccf6ac14826d06fc32fb2258a616aaab895885a9a587ef1d71d22c37ae257377cabd77f5f5db095d1a006a96e5030757d8ba51612bf077aa1c127be0222d0492e9eac9d54202c974ad2ed4da5557a7888bed54aa4a60abfa21b3575fbc5898dd79ad8cf6ebc808777e251e01a4979cc13883ca0c50658bd9d9428e2958eafe5bc8c54e7bac5eb4847ccb84ea2f11aee30a8da0663edfc8892b3ab528a529d92a4402eac340d7d9d057bd34c1fa16f54e0d38f94c8d625c96305d89d5e423de05e78fc4ef11875dbed05ae8cf20dac68210c343c69710781d2fb33bf67228e5e26202f83b07a9a6bde1c122084844a08df22efb6e083b1090e1c01355d6c8521dbb0e0fe603825f7f621c17ed2f560937aef022224ee6228a4947d981f49e13060b04ad163c6831724174a68e57c0ed744b26b4ec7e67b8c58d7e80130b1f083a90e8bfa00d75cc09b3c1424273b2fa59d9f05cce062a87452780115611681d01845aa6898bc41adbe11c7d157631e37d9ae16e3adf20339c79c7528f28b22318dcfc0b8d18197637daf0855410cc037b4c1002519eaa8e8155f5c0aaab387a7346a76e0dde92cc052a8cab8042d3768db45afac78697e958fe1583f182a309408e98736d8c03416992623014715962891755f31b35a387cc40c175a1160eec6c340e410fd9435ed9e84a28758203ccb0060a9472358e8b53144d38d773fbf55b4c2aa9b45bdd7512d7de9f9e0fc98dbd35562518b850bbd0bb4219bff832056ad0f90a3b9fc2c7b093c4d3becef0f4264a540a371554cea7f790a3b28bbdb6302a177b8c2181e09c5a842c3bd504e7eaf3f08f41722cc947de28ade01608625d2ff1080ac2e115e200b159bb7b2c80dd037d5ae2c37e4188843703cf38da5c28bd2439e81d10f94c81344b86854a74c908c769cb53ae28bf23ff0184214450d6bad4718ce37257440b172f0133e4a2db3629f7ccde186195186f32ea47e19c75db9a6d1b99c5dd467ae4ed3474106c29c00d48f3da62e46a06508b10fc479b442077adf68e33597b3b2baef3e00da08a03b9f3def11dfc02c070c18f0d61804da56cefe6e394e409163edf73907fdda1c21ff9c7e5cfb6ec07644b0d71d04633b112c975d1f42b3fcedf9ed453a75acbdf9a828db57fd284c2640eeb976ccb12cc3028bd8f3ab25751a3dbaba2f9fb26405977ae30d2f7e5c3bbba26de88c28dff31657b9ecff047a7036687ea04efab82de6c10999ad65030f7568c63d511700805a8ceb5441ce94c92183ec14e4226b0c34acd7dcbcac7070f9ca2ee5e4018423f41ddbba1d7046674fec79cc94d470f459c35d77609622130e6c6f101274244409b211fc6cac2bb0778440c6998b13736a21d1f0f905d82e6b6e036ef9fe742e8053fc2f15b6620e7ea8a6dabc9e340ee3e9dd88fc4381ad854758abdd480c58866fdd88758c2b698daf5111ef67cc59ea6816034257ecf81d2009248e0d81eb34c3ccf6ca40ec89d7bde6123f7f9b83e832a1e919a0cb0c523942ef9d096e16d7d9714e7f08dead8e5853e631124c023a5e99da36ace6de2901aa49b94cb5a01deceed19a6d6d76a4549b96bf1217227ee5063fd1748839f5e9e61036b916775da0617d4f762a000a1825ce2e938affcedfe9774001d0ff1b4e60e5b98d2073b37a38bbbf67617d0df21d1f17b1d63c730c07d5679c82677e76794e675fc674a7331add765874ea32474c1a16d1c09382bd848e93eab9eb5a01836721c82811a037f330e5cc11e838453d5a32a0831d17b8a94dde27210a025db458201ce24f832675b1fbf71bd84787f7c846e3f62212b04e5b3894a8c92f5dab241186f51e3b958b4f309421e35bc287e937a4b8a93d89db9673386069d6a23017661bb99987ddea1c6cc8eafb58177ab3dcd3902bcfeec81703c8af6b5042884ef0bcdd9183658dabf912d07421a6f200ac34c8cc16b539025addde5aa02e7bae349a79b01ddf69bc8ad528b3f953ac6de0808fe946100ec6b658f555765c4d3f0f36dc35f20123abc7ebf5b461180e30bd21c65f58c9378c1a3429f78ec1d54a356907aa6d61f7a0d2638200f4257ddb799c96cfed6913456e95201421dff067d2077dfdf4417beaef34ce6781073411bba1684f465d9ec43ecb69b2629cdf04442393f93e6b05d170399e63f34f3ffda703cd39302b563395ce40285b11ac7704ced03be053e44e808e9cdb07560e81a45d055a54c60a2953f237aa157b685e67936d7a44003b8d75eb178c2c3678d943c19e19009ea2e46d81745603d58758257c2b7c997ff9d82d9d9003ca274a45a2c4041198f7d22c6fee1878a2865e5e3751afc640e1da112bf284b59b3456a21d51c7c677ff43a6c5b428a4b546b4933886c4e8efc284af5e4a8eb7abc4dd22876940a49d94b5659e98ffc7a302fa0ab6d7fbae2ba1d589ba4da7bfb28e087afe06f4ca9cb18ee8f67becce9bfafae3325ffa99846e62c33638d34f18ad0f1d44fa4384655b859bc2ffa62390033dbe2301b025c187340fabba37a00dca5b7808f1b09f8eb99d6d536955efcac370f2b235078c8e78f6af7b2e92fe36b978223a5688c2f055cc9f6769a0e08ba895e4a9031890f31633d9e54b58b754d1f7627617f02d052a7e9749a9682ecb54da79268147d001fce4cadb76ae2e6160969840083daf30b1efa28bc9a40d8aef64bf23ba7dde063ff8aca1275310e735fbbde6a3a01c0a7273803fa5093c74772d117d75cb1c03dbb010e5939a2c945716fe455634bbcfb0bee6ed39ba01652b607eb936022452e209f3d0568bb22d12494cbbfc1b5cc4ca2b1a39162c608dca8532d0d4078771f5c1bd4aa1463bd46e56b3058acb13dec4e3be22a3226b64d770ade759c324fdfa4a1231fb5b7e232072573da28100667644dc39366f4ee995d7fa96c30c595a648bf2b0157dde760efe0fa01e7120422815249c36169ac6f8932629ccc343508cd26bfc31b4520f98998639133fcd4c3a4b747acdd92f90e0c8e0a052f6904b1d92f29163693032070e174e008855ffd16c5e6e9c1e6e72e33a24ddb608ab0d60d555a81e9f6019d099efed1a99fad9479d3b6de81d7fe0488e442e1bead09054505b9a114bcfdddc5b8f25ba11c8fa63754863c5d22cb7f7eac11dc17438151779b3385f2fe012eaaf403d497a1aaa83f4c65bfb7f3749b0e357b45c4b9e25de22ea6730b1d1b428c0fcb3adc63f6df19095ad270981c7b3cbfd5c7502fc05767e99fcaf0aaa9d90b262fd2028d95cf0008020c86bbde4aa900979f29d18514e5dac38197a46c469ce593b45397d40be60facb9d2a34897f4fbfe6c89d4294750c5fd6addf1a0ea20a77ec75713498d418c3675588900e454ae7865f79b1f1b3c791182ef84b3157611cbbff667162982c993cd5514e590d328713bb1d85ce960794064395ccc314ed5acf1facc3c69ad24a24afd3487e26b5a31144ca08382ba55e5ac9a15e5fd1af627116bdf3d60c8758b194d22e85b6cbc0daa3b1606a1236b1944bc348e892e79268ee3208a5781f60bd1268ada18583aca033ae87713f64d86437fbda16ac02edebba3b4b9b4ef32f8b6341e2d4f6d17d49dd24857a14bcfe1d85701e3138e86e71b1777d61a2d659f49f23f36356e839ddf1ccf86118a8c221298a408480caa521c635540259aef9050177b9033f0a9f30d20f0a34a260b4be45fea55f62fb8312e4f28b0a2fd7517f099caa33f52aadfb6fe291960af597b8b999a8e0e1168b7b12b57a477abd02b8b23bb762a6067b8a6cc57b6a4b0da3583569a0e28f45e17bc8997ba7dcd5335c7e4a739f4945ad094872a0ddc6b4265e21ec44f0949a12625f051f8044a8cd40972bb0a32cf1e420dc620d056530790195cade34d7b8a86f6e6982b2493018c5d1c213513e1a56ce1d4b1859779d0eeec03f9190661e0cb298133d623b796f17f47ec8d58cad2ce05ee7e17b676ff3666a760d1666481543479ae3a68258c130b75110392a0d43c27100f3b9a232416449d7a11be4316cfc52a636b88b05891e645b877aa9f653165537eb6619452e18d54b35309bd0b5c8ae155565e85261b6169386a3ddb934247fa647c48154f02358008903b64f04534912f6f950d763fb606cb1c50e40f5e8dd5885b94af898daa666378da148fa24d28a85e6a462ec92902f7a3ae13096e58d74a528d35ff5f4a9fba7c57fa7e3c0b4441d9d1e5f4b7fe4acb82220cde64d288a8a219bb847d15dc7d0df7c0e1d408d1a50e9b2a6469e5379ac5897ee98999d4c7ff2d98b60717bec349c5737b7e926beeb029bd597fb43ba959b6da5da3f9ebee30d873917d2576d4bc1a6fc3f92c4e2c275a272654b642b616a107d118d48af2c774f85e7fa42a0eefbf2c97b86b38b20795fe87511f16ecf98e697a2e48b405feacab52960f33854c5b34abcf4159f7a89ca35c98de9f92449fa6db94dd6237c3b011604b80a47fccc0cb4bb639f37c126be8ba281ed0c408367af805977fa0018a88d78826996d9b94e0db692ae4081e62f938d4237b5eb888c4f8bc2591593c864d3b31163416e3481faa6d2a300488b4f56df6979ba90f16b456ff2572f4235935ab4fa39ff2f5303afd49bc32789b4d1e5799c299d3d90b9ab40b1c38b3b9d4592a2860912c328c8e514ffc0e5698228ccd5983427d87e4519f7fcb27d64143f3877c3e24fbfc6acf0169a35b7bbe5cd192e2a91d68bbf27749157c7751369a9f3f8b1ffa2c37f3de52e45aef92ae2266540987700e3dc6a7dfcc8b2211b1c1a085b0cfbfedfe80e1caf4756419b982eee91af58dd5327bae7eb8fa690cde97b4f1c58e971b04ab9c885baf7212285a0b4aef200d9aac35d19d4c2a23105305d8aa9ac95ddf23e7ef20e9d86a1eac727292257db7752ba071a430ec77d0c3fccb03008f20a6b0cbd81f8ed8a703f0ee5c24ac4f6d2d5b4edf52b378b11cb30efd134e30c6575db02ddbaa762d546ddee956a9997ab9a744b3f94ff72a01177fbe3ede6db85c7070ce00c9e69d2f877670571090a5dee02f16d7ad0bcbaa60e875c2622036321c9a48f81e27cf7a3f61b5ad160126a26490d1d5feca1cb1ea915e19f824b45dcac3fdfb19e433aa2768550115eb3b3cc4643c295b7092e559abd50a2f717fb17e62da5551ebe760615edf430d6fb25139371da090f478bd600f4e32c7fe1d6302ab44ff2f31e4749aee41f7f6d87f5d6274be83fd319bc045bf38c349ced0db6ce66c6e8f2ba7a0e0bba78346f9208d6284c01ffdee4bd0ad9ac6f55063ad9064fb92e1b39c2479bf16d8d2e9d4edbd2f363c5142e40fcbbdff9dee57807059d355e60f63802727f0883ee09c433dc2bd3b1b27e3d12855963f6df7e7a1fc5cacb68cbcb9101989d7041bf138496bf86235c7b41bdb094d3f5e7fa0570a69d2c59b04f34c39e335b5f9c886b6117934c7beaa4f766f17db01cf00031213c0685e1c3aefee35424004a73250180ab5eed2893c9f8af800b710ca6e63775e03cf5e944eb2088e2d1545122e7fe7c3f6ffeaef039b3885a1e83fa1a8e0e5e27e835730f3bf2948c9518ba5df08432548c70fc9545369964c85ec84d9e061bb6e4d1d607d20d5dc0bcae2260ab9aa01c9f86e03e145912be8b2d8b18646dab1eed1a831276ae34ef317eaceb03cb7cf2c9c71ff341f8c0df5a20e0bf1cdce7f1f1139f7ead07a7b22abcc0951ec5ecfaa0f50995a90801e168071f8c219d5b8965f718ea5a7d71f2b83028ed446dc9bdf980fcf686a98a7da488f2cb635b0d89efe0f8f105d217bc72246822fba4b601315e2d2bab45de92f9ceb65201b1a69c5ab34088daa1e60364e55972f54e5daa7c006ddc732994202cf1a841ccaad27b7165d61062f26abaf2e3479eec7ee334a25c526a5946e7936eeba03f0c42692be04b29d9fc20df07ee775af981ea0b3739b9753add7e091801959e1200791ff82eed2e700d4f0151123448c5a71f04766ac431b55031725ce618269cd0a3ef83373f2d56c87e960ebd1e006191f8fbedf30430a26685663c766f9070c65f2d06f859751fb8396de5c47d1a58465eac2305dbe5d2a55424d530b7331d9e5960aca1cc5d3f8c03ad2e947e825ea9da3f937018a8587d667e00b5cd7c8a740618ff4f8e8c43584c111a986e1575d3858cd8b3090451f9fbf26069f10e1337a63d6b0102c03ad1da936c6e1b3621cba016a0cae63630117930a8349ba1ae1fb30ca610bcb959f60ef28f5f6e761a17b2fd0bc3d5d9a30d474f747e850fdf361ade5f74a6dae058007666585443eaf858c99d33d85488b53635506df929b40210679357967bfa39f3ac8594a5a77d561b2e0f347ffd8b7ea896913b7c1d5379d820f3fa3216683c611ffcadc001b9f5f7c161fad169d2c693970e559c87cd6e2b72c4aea58c03ca22b6c7b91d6b1a47654902adeabcd5cf6ac76b4c560c58d017f5d821b7abe21f78db8a705dd126e2e2e50f43be3cb4824284c13592c6b20d09064a28a132644732c0c37a59d6ca80f5e5668c2029e208fb043c81d4cf40b9297549f76f8730a37f24bf272ff0700a7e17d16ef2ae55983483cca59d66b0f255a1ed0ed4186acb21bf7041eb2db085561c42132801f093d705d4c4d2367f7286025761d2a304e499b703a7c599bd29bc2669d04cc2187e7c595037d015834cd41dacda32b55d8448b2c5979595f43930aab7200cae19f9d97cb5a89509866488da1f17b8d65b85699f943aa7f47660c946df04173367e12c5847f8cca58ba78427281fc2780a5e1fad2dc2bead183c834ce5f3cb9f40063d0cfae7727245646ee36eb347c77c9b7d65acfa9028d46e7790c4e0b565260d669d80f58a96ce0b77b22049e8ddfecb0fcd67ab3faf8aef979467e10904e706fa4ff3d6ce59415d15ea994a555fe44807f3f0b01f92c118348705da1f6daeef86c1bdf25d317d0f0a08fa5e217a9217a76080f1f8e9bf78d6aa64575c237baeea12c491bf9644ad833005a5727eccf57f419f609a93fffb99fe451fdc4d6a7cd81dfe468fd0678b06bcd4250aecdc92ee1762904522ce222ae850841f21b40bf5f0e14468466ba2783e1fc5b2c8fb548b23eeb31d2ad96b92f452bed4f818e8cb406eaecaa8c98c88d1bbc534e5f4b76dcd2352faf819f6f96df30140491a971de2a23467bb6fc3b77b590b2de2e468992c39fb5315548bd159c5d7310e9f49da122aaeeb2f7982755ec09b44b90ff4767a0c674455cddb467a8a898a3f460eb8baa826ba834004d0636105d2ae594435a2bb5084e061ae6ab5a397893b94ab0abccc3260d2d2e41cadff8c6743732c6b35e76ed67d54fbe37f256af1bd7b64e6d19d6df187c3b063839e4ae698d98d8ffba03477483461d287348656c2df11c93936aed88d819e0145291aae2df0e6f989ff2287742c0068817ad67d8e901f068931b3a052849b426aaf04653a548aadd81e2dede22afb3824500043680653a0651dcd9b812a2442e6a1fdfd000c70d5b84aa8fd66538709ae38f17026d6f41e31cb1423627a7a1e73f4f137dea6d813d72d40dcb7f47d2e5cc666f45a107e52c458ec308636689a397a873856664c0ddce8d207533c19b97f85b95d98e69258691a48b2a2ac8d37a02020b03863a80d365fb3faf59f5e8aee6bd733a1b5103cd55744c6f7627a1d74278ecbe05413cd47ad006f2842a9ba906e17af17b532d03726611b797006633132d1da86fe46091a8e2969301ec8de8d43e3f3337d2e9a65b812a8467d30a999a0945adeb35069b4f067a5b4f364e1f937b5d20bf4a49d91cd937e7b97e82b52acd0da959ba7a81a00ab520bdb9566a86cb0f5b9039589d9bd68cf44f4ccd8a2dd917ef76b530acfbc53586267c888ddbc6f0b6b1ef07387f0810afda43ba06b9ef4ded20643b9a242ee1426b7219a9983259315ca2c24dcf0e7c15a48c71cde13d0d4bb1380ca13074647d56b9e86af7dd2b8a6bb520108d3905814374e765c57ca3eac32bad383b5454106cbcef614b02c4ca4824a2d12b1c2c905760ed9b4d20120c472ae99e742eb9ec1ba4a8e8bea3653f784b9b39564158dfff163a6326de2b24ecc74cbf9b14841df10cde47815f8b3cc09f0bd23f238cfc1c205f5cf617608ba790f9b783cb0079c43b238e89e4598ffad3b64227f7404805edc9aada58bba2f641e60540e714063521fc7d78cc3dbef193db6c1017952db1e70116abc01641954fff0d697b8600a12b1571c9d8290d64754c648fe50e0be41a7bfc7a4f691a9c1ec55824ed610b6f3bce1c3827e20bef117c8edc0e3fa81a7674d22a3d9946d8fde412f8fa9476ea15afe70ed65ae0d3a7e18061f7ac1754178ca12cc6a8b8cde65c7791678a87ea80a635257c4fbf0ce2e5be48ffe43d827af2b184a734e3154d0cd91c32fa8547138b1a0b1f0a2b1144523c10e75a989f418742c86d8b7caeccbc02c94f411cfbd2e563e84caab71cb50570ed673bfc4ce4fbba72b492ba63bbc82c0fe8460ee24ab14379ae927437d3e5b410cb01dd1ed590bd836f8502dd48c990618274aa39586331cf1c457d7a00f0d59a0780b5a652628ec3f787110e603862ccc30d828750a1637c720c1404f24a44faeff7d079429bdf214c802f527f14ac0d36ebdf1bed1c9ae78b4aedbac82f73c4a10a530168b24670801bafe2cf770d78ac316d8a05c2f6c84a213376e3fd8a9efb1de313a8101910a4412e1e7576d630954928f1d4209854f40a8477d65bd4ac730291488acb127504b44fc4fbfc1a7654acefc6a4f2066e66cfd3b1684512a0dba98e8fc99d73c357e5bbf6863b3ac156807a9aff99b34463c392e282a01bcec42d0344c9b0551b8c1edb538b97e83d26001165da7d8d141e6d3494ff6d009d50725dd54133c6c25058a2b611d576692ee2b63c0771e9f0400c944d7459a061858a5ed477c59a1b12b8d4e6d2378c711c0ab6f538aaea99dfc682a849f27b553b5ca139547a359b9c17878056c1acb62e6d09a72a9c7e83c73ddac93f72d7718d83cd441dc43c92379fd8fec9f369db74d20d0c8c17831a0fdb4163e1ab237c0d1c2eb4c259ad24e8740c1870b5ac20d1df7342b104bb36e99184eff5c787348a704884a03d3b789114922a5eb15c13b042d194df13440aee0e5017c9ee8f7a33f05d41da6f81a2dc3fb9faabba0d13b30983b12be0b6a78b89fb2eb31cb6317e443829c16c1ba3c26d7936ec84de4878b9b0e8f27daf15037170e838c624e8a3f836f9e06b76c44b8151159c5d50dc06e323e741d0665b544ec1e763fe8c17866b5f89086415f760630c666340b8b1a92c41a813177f96fa602f0c540e667bd745c476018c4cf56daa9a360908816d8fa54b10416436c3ac5123ef6455ddd0da899427173e26d9dc5609ac944d1421384f568ad67be10ef6d07340fe644d00236c24c68a69b01263ef32e63aa3046c09fce533dde600c037eca4346aeee56065475660ac02c2ecf46518b3cbdf41b1ad27e27bb4129cb1cf5a052d3e61c7a7d668455f90d2a483cc95c644ea1f55d5fa75009da88275776a402fddd46eb3da3611e8cd0faa1d89d3d254d97e9485119ec603ad5539cbf0c817dde61e60d1aeedb4990a878e885b105c74d261b986b7c82377c26b2ed5b2207bc3876c431a742fb0a0c72c832af04644c53c6bdf2c90b04dc7ed58b22e79c6ebd25a5039905d5ca2fe4fcda193b2a93b48813e70c50b116fe6099d8a444e77371aa6309db97a2a2bb55fb050379d3d5289bc63fc020d2080fd8af56a36b057b8bb09a28e6b3cde1470df4f392cbdc8afe63fb2c948f80e3b7f7f435cf0f6596fc706dd89288ac714e0b7ef75eef9642f1ac96d4032aac6a9d6a3f9f0eac5bd220d37b0691fb3be586cfdc1020d762f47d9a718b291e0345353c93d4da9b51a822567ca88c3e33c0acde75d9b546cf4d67515eb4f2b0b1654f77ae96abeac24bff92cb9f6b6747f13623dbab70a9a659bbed322a39c9cdce93446f1ab49b7537bf23b5b5b5613e0bad31507f3b3168b442c607fb0dbe7cf5d3710be9bc6a12c054e4c49c01a3145a85fd7af4bfb6dc633b019abe881f2ab0411569363a68749b8e3acfba475b85f003b88c1cb5b6e044dd29dd034f15f75cfc8b04638e620bd66f72423700892040c656f2246185d4c5d04638d3b017309df39c670a47ca8941c8e3339f19cf43abe160bacbf8d173ec4e9554bc3ec145fa4b4871660a478c55e926c9096a993bb4a660c414a621b3d8565758e925d2d0ab574baedf7756f117bd6492089cd058601f9f2346769f1e123ec3880a9ed562d39cf36212ab53ddd478dd5e4be0aa7a4af6da9a1e90c9760f7976c2346e3569a1c0aa17711b66400b6a4208bad751693b87c3b7929ec0c058433f4b4a91780c7377239214f5a07cbb5642c1a792491780d97162af43d5927506771e6013680d8153fb4c93e7adad0fe3a79b807641e3694dd000e29078734ffe50a6bb06bff25cdeb64290c420b5b76a6ae72110a4caeabde753a2efc3ad32173c0bf60b84a935b5def787aed08d2f4ec75bcaec4b1025860d1c7367ee08271daf49764a62f12f6686eb01881b94e83a22f5826957f62582ed14e4d19c007cef8e312186b5d1bd966f59c8a65a56adffc526d1a06028d28c5dbe291ca0a9de084725e5f262ee3dd615b4b0a797a5d813750a325e7abc571cfa84e72d7e96ec198aa28ee9efc3d01383c7cc7aee117b4394eed94bc3d1f57abd2381e2987ac0189f0baa0e23a631846839bdaddb697e4ae5e79dff770c49a9636223fa8dbe8b2703bd730604af7a437520781fc9ecf3f2c77890ac9d3709fa12b99858d5785e38092ba965122d8e071a4750b2bc2e253b08c902304780f8040acfd01a2afe0f4000a4eebc4da7e838a158f255021a29f855a738f5b43ca7ece0342e8a4259bd2431a2265bb46970e16f6b72e37cb4534b6e13c8c136cd54631b8666075bb7a6b7e7f834800eb380c6dd030198a6a442ed974697271fc06011d1468d098b93c0f2327f6a030569367a83f9824e292a7bb3e3d5baa53bc408c3b70583464dc8023704b4dd3650be1b9201008cbfc50f94d958d5d2641c0ee6a1eb30dbd035f69add83b64025aecd8158051a3c5c3b1163e1b40b89333ee14c27ad4c10e8db4e1eb5844e5a644ac6daee1a876e627d7163a6e941b59ff6260a429bf01cdff912f1f9a1b56ce89cad8905746e3eb73aaa33fabdba582e49cff51e1c690c6203c246b02ada9baa0d58f2fdb367fa710b982ac0d146af92dc85a367e241ada40cf593c99c989b285de88b810a44b0a0e45fc59da34ec0a808a2634e618a29e715f5345539d55edeaf7db4c754693d29462201b9e3950858d7fc4394840ff04fe63a75def7fa1f464817b223e0e67a1bd483cb9006649ae4581b509c06e378072d98bc9c3b5a7c01071878a01048706085320b1e9ee6836137bee51d018105a7da87384407619a52c806a66e5618bc0097560c0dfb7adbe1091ee4eddbc6b61d2ce06650540c299f4d46f667d5f83098b9c022505a57059421ced88a485fc03a7826823dc5300a7a78bcf37d069478384472cac0c02cd67c38f87dc160078091913e08f5abbc7fa55b648a3b2643530cdedcb9d05da5ec6d365d5e0483a044065bf1810b5ef89ba25dc6971ec41e343e23bed627e3292b1199b46b3f98c9516923c338804e5a525e828b684924ead05b030a2e26fb5600ff486068056c654b3b0f70d8b6bff66c0ee32f7503342aa0a5cd2b7f5fcc81c4a3f46a9e2dd40495709ddab81478a5f001206b28cfacb49195be0f4140025e0a7b6375d4ba245f9a9a80c53f97d1070e50b376a1413c4add6c649c4e0bbaa4aca39ec930e482ff1ea36a0757cc6c20673bb352944a1a27696a6da2726e94134f36720473092cb6f0324cce185b324ac229de4d2ab14a70a13739a1c890bdf6ba1c7e35b5229449330722e35c299366d43af6d40e566f9a7fea1cc9892128dff49806755e06d93a26f1a988ea5cb7167933d0c7e96a116a47bb21af17399d5c51b5cbb4418b60ca89d776af3249d20df60f38f43af381c12a30e323636a2429359aee60a16161983e76a22cbb5825d1687cbe64add3f817cbfd01e1504b4ac3c79d8aba682bb63acfb4b5f4cb627b74a7c89bb7c07e38f8c61ae2db674f710f3d1a1356e2a3aa4089398e86611cef0117821cbd38488a308da53193173de6c601d38b891b825ed244fef6c6b1f3a1dfd86e4c00109ba0cc9d3482813188f657da66e85f45549d4188fb919e86f89fee77eba431220ae6e9360a28471aea75dd9da2892bddff49636f9481347afcc12d69a15fe20c5e95e6b017512705181f1451098a77c07ea85877b85fa6fb4e06af6af660ff859ebeea6280d147613d21bdbe91f1d34d2c6b06f2bd469451d60522ec448f18d4bd8ab700e621488398163960255bfe5f561c101d1556697962111b482298ea895f9d7be0fb84fe5fa2b3709195ec99db1482cb3caaf94dc4f5881dda33134a70400fda97e3cd5a453559cb3f207c50b91162bd3903ef4a333cdeaa752801f347f090d4434c1b97a75fae63074ea4b1e5cd93e599138855c899aa6ceac918662bb584d8cf06211cec2b927b2918c2827ce6653ecc6d81b5f49ee1c753858c2c8e382810a58504603d08c4b88b78c23ce5ecb98d740a5ca5180a480224d1baf97b2bfeebeff0b2adce55446955ce0b1b9073e84753da60556901ce6cd6ffbca803ad585a42c3532c1b494a2c1f8b6adac0627e6eb1b7823f98106486da9cb96608bf9f2709eb88cd38d1210a955006ca2c3d83bbd833a85ccf5f0221f2f9afbf8c907044f213da16122190059c4a7ec8df7d26898047895154b125ac7eb430ceb58bcff24b58eb1431bf000305720c323e6f97887966a04556fe73b5e3b8d05ceead3dc8c712bc387083c96754210fd50a2820d686d62a4df6d29d1de784ac040d84bfe48cce80f0c3466b01fa177dc7b8efaebe4e569bebf780cfcaa66f254c15f23e265d630c76b5cae029de0b9c963a8e01d2800924837b989b32a5245bf31e2ca92de55894c4982e30d5188082baad63235a7cf573642c78476bfaa08d3703d7a17251b123b4dd10595e20f09b5bde5429791bd49ef044e7f1b28a3badfa987ff5e94eb2be9ad6b783a7ebabde0477a5169561c5930e1b375616d122eb3be7188c93232cb9faf4158e59be2122552b05a547fd1e9fbbee673ce39ebe979a635038ee22fad68e3e8003d247d0d217349bbe45e0c828d04b9fe392be99da14d0d773ecf3a55e7dc6591fe8d953eb23bd456b5d01a5f8177f7bf80dfa330d773cf13ec9f8f9fec9c31d66a3e7963fbe7717f4f8093d290ebdd744cfa9456ff44b6ac7fc64952bd096efbedecfb74d53a7f79025bfd0d577fae6e35a7cd2de7b8fb5e707b2c6c49f53d037989fa7b3978f225f9f6f1c743d279e37d43075e14f84defbec6d7d6c3b9fc41bdf0bfa9e57d495c4d82f1f7bd04c65cc35f231dd5b276051ef9bd84dd2f33c57c0f133f28d128225e91b8b9cc8a7fbaecbf8293e1cf2123ec93400002024b59e4d071f319a9ea6cb4cc59b200e2bfa2345177eb845f058747b106d275c4a34ff2714a4ac79da48f00bf1cb78bb56909ca2e6b6b57c9362a19f013fdf840feadbe3d3410993cb0429405f1f7b312c9ab256c1a2ac3d5d380a296122f450b7ebbe10f8500860bf7db4bfb50bbff0922899484cbd414fd35806b3e13416e5ae57ce4c04dc54d0830791e0e049335a3a9e4146de2cc13187a03b983ed4e8b79cc1a131026d0ebd6a8fe551ff694e680c4153fd17a83c58bd3f2e60c96a1563ce86bae7d23f1eb74dfd7605b0146faaf3adf8bc689773e167018e3398726209e210f70038cfe426977a503bf4edc9dff8a5e638cc737da1fb9ea583c5d3f80ffd61177094d2d99d3bd4443b6b70779477b081971bf194913725f3940819dd02127a93a9c721f63adcfb037cd08be1137d575aabae3f91dbd937f2fcaf05f29db61899d47e2dfdfdec3f5802cc2b03aa4414c59a3c827a6bf5aa056fc51509613df4e4c2196b34b41c45db71f2f745ac5c998f8a7deb5ceb2eba2c1eee9ead180048df1542f8df08c3e2ed535cccbe20455c167c44f19ca9a4f37af397abed1e63a43468d0150571995d0ec208f46dadd92cc023487bb1b4cecf216d3660ba8e7391bc236d9825e8e07c25d2c41a1f10393c26cd0969303738e4b54e89101750354eb982e09251756353550eaca2e63eb2c1c69b5506108effe1b062e51a30d68d276d08c3b806ea66e3a11bb94b060f80aab2b06a3c319f79483606766ea936aa11ac4837ee9b349bc19129bb8f0de9d7c6cfba62189f6a6c4b8ba8fe28c6165b34d0c456fea1e8a3c7d60c7647b34f0e808ab67240031fd81c8725c125982191eee72f178703ca31cc8911be7de3e05e7e00cac3eb6e837337a4787947ab810d56afe8f1af14a3647a517b7c6e3341495011b637c6cd91c1da47214517e6a70ac3af547512d1a31af805c950ab60c663b5681721df8447f5054baaa65b841228544a42ae41ea382c98de95ac6ac8d89b6aaf40b86cda5f041b1522232d3048b645c1372dc878b8e2a14185f7b48c49ecc59cf9454cf64b410663a59911f056b402d17d2f36d4a82e723bbcbac5806d62c792952482e32cbe4e8385871fdfc8ccd452bab7d8556e81df77ae34f0cf84fc7b553ea4c54b61a55705c2e2fd3d868bac900d97a502278c8ac301330e4fc8b589097e0a9d96237afe58b27ac6d3dc32017471b058ad0c1929146d1f68126c3124d40cd3b8ce89fe4a826b6dfa671e669d491f33bc1e6bb4e13481d67a8793e1f54a50e2ca0dae1356fd446236792d4ca131af19ad30fc62ee3e8d7bc6f410ee1cc26a4c1d73cedd9d608fd189a082c8645026244c998da88ba496269c159ecaad3880aa5e9cacdcc83a5e7c7109904645422e81bf47f03b8f6bc510ebddd9c8d1a905b4d864258d44617bf4598851534395f3654e9f2abff9055c6bf2bc8f6a098d459d030fdaf25e95fe6ef12b62554a2766433508378154a1f159802414d4801a6ab48123a88b1b9f0adbd9508c282835264371303e86514c1c3445b9a241272e7d2322695ac9759a6980962127045b3626ca59d4b890930f4ff15be4e1fcac590be4240e757d6893b284d73065a13776fd288843a0198dfddc34091ff4ed733d6d01b89db5d44ca61a81c06b7788bd745e195d02c2d35d5183bc4a4e715d2e9bf5c1888935e22eced9f7f9e176f01349771adda6be0acbf68435f760be957521fcec2ee9bd3703e366e03f21a3072a96d033a81eeee238f0546b742d3dd7be9d95ed0db79216a9864ea59c3b3076aede77e30a8b3e71a316d0d8e5d996d93773def1f23868cfc88286c723aaab41e9920c94888008229a576abd018a00feeee37853e4a3700c1fd21171f7c2d227977ee01a0cde8d9866b77b3399f5bcb758e6fc620bcb9ef35644c66764a2fcb9a80a1e06d2de29fecb081dcb9815dd0f4a59901b9df463103bef6866398c31604f727d843b19575178d8dfdf2d38d6aa7be7d881fd617132d687f975e1121b357cd9452465a6d2c93eb18b57421e0b14513baf8466420c9b38a85bf424dfa4e582ddc1dcc3d053eb54792d1c635d708147e4b50710b5eff6e0b28d4cd18a71adb0b386a73fbc5f9d4273f5d3d1e56503a0d60a7adbd003d9eecf0871a45776aa00f745e9aba05c3ee95bec6946c3f605630f8e5042de83e0be9c7e538d22dd184baf71da5264e08e553491a9489ea7d7f23dea95b1275d5c4418a01f923ea2a89fc6b52568a580f295fda99857cce4ee5caefa5753ca1710ebd4ae06cd2095c16b2bceafa17ca04313710f2f433cc1bf1059b8a52c0f5b1b4881038da545012e7ea469f066bbe465994bf525f88b37335669ea782b1e05a9b92fdbe4080e710aa226a91df45ba69020db5096169b32f4c469d4c0f12654f5be93ed7c7a6c96e585e2b897855b20e093b28bf4a079bdbb9e66e91ac4ae811300c9a0f3e521efe42a338c8703cd76982034eb189acbc62361af7405c3f61e36fc07962b3b3833d3046ed77a4582b8a51a848bc6572e68cfdb9309955e7f42de508692872c4926b8e69a7187ab71062b89079cc7e74b0bc0e8bde1e30deeb70da141db6f31772488ead129a706424ffbc4e68f8c2d36b5e8b9ae2b31077735fa67540e405e08b46433d7d451b1436b107400600b958c280f64df11bfdda356c9a3bf6147706657468fb8beaf06904ec9951431a4b9af90b89a20f53a903ef547f01d89e420f1ca7e7c2235329c75a4190167afa4c7a8e39069d2983bd6be9eb223643337ae0aac186aa77f5e7cd717a98e994c4e269850ec9ed070f1df74ec7ffd53fa254be061afa26903cfcd5fb1d2bda3886ffe7f03cc5dbf58a067313a5d843e01056a640f8547d67e8f092247991eadaa7dfeb64a12d5d06a42708e5c7f87e3a6cd6c33980c3a8bfd03814fd2ccac3c2e0fc4e3c04d7ec7dca8c88be153b5eb0b4e559a212bf49e206538423eef4ae41f0f6b3182c0a58c2c1b7de41fb9da84b17f25732a34df14b805a242ca0917983c1e364dec1274dd4f2cd6e132a0ebb5972e9530e490a6be7d3deb16ef07f04df5bbaf79c0908fcb9664392540bea87d7e73d3c8ccc2e1cd577ab68eb7f293cd8c302968b50444b1ff0ee97fd8845e58b184fb4721f6ef46b121d2db06ebdb4bbec5447a8682fdb22f6df2094001889313d9fa7e4090f2338db0efdff06f510b9d291408878882c6f57431987cc5a931430e6f24942e1a60fa6f9dc2ba0c1c40a8f15ec56724a6ef955dfb9252077a19661e41380c6bb4ef435094b8e9314862a2a251525ad82e6002c48544d01828ba32496a3edf791b7b225e6ae16746df1a98e596d607c720ed1e1c78732b43e10aad657965cc8c502edc3b4ce932f093af16db9a588a8c97342848f27adbf6492ae6b4919ab617c22191071ad022f4abdfd361e9b843cd95207c166539f68831e33f202c343d86ff0e3930615ba522b73d89ed29b4c6ae20764221f519419a54b453c4d1276500e94d0117c5997739d01ade73b6f1b6225c82481d94a0880bee5d2a9118d14295abea10d0a7ae4a760e48b74c1b314083a29522748258d7dfdc350eed5fd96b70f6fee62de6ecf8ca6b69c879b65a52bf11a0b4e92389c612c0ac25fa16e53081f622af84f2942208ad1edaf6799b7e4fd73e255fdef41264261dfc6f0cd1484e7e5999756208bd905ff3ba8f55fbba1571b45021ff178e44ee6439ed601feb37cba3f4d7bf22b3dd25037fd8fa26484004d3aba2883c6ad00b82060119e815c61342a04fa15a43cf3c748dfa3aa587f175105c75c20403291c8e1e75f05eb291a38d0de6921c93af5f0542e6e2c6fd09e71b7a86ac8920d5d4e2eae19dba90c7b0c466f34dbfe3f12841e104bc9ea159626a0b5ffca717bf0cca474d536868c8d7cb22725ab186900ac40589691cbcc22dc96e1f8154220d3dcb186a244b14934d49b10885773a9b3ebd7396a05f5c2bca700bb5649e7a3b3b97a0cb5cd77b5b0311cdac2a20346975a8c4add1dba2ea0b7a6b8a40b3f5120f5ea159eb04786efde4d65118fc086f4a5457bd0d0576f25dc047cebd70e51cf0eae4e96ce38c2bb0c931f7f460cd9642e57275e77e4366368627677ab19c30fe671a019049f705f93f50d77f322113c9c3112336167dcbc89ebbe9d1262a8de74ee34250a586e1dcd53d29742ce3e6b014b4372a953731f3168505354bd01e21e65a25356ba495de44e0507a784a8fa07b23524ae69a9da5c254f584a37db1f62b015dce38dd851f78fbb84d0c3d574eb981c740bd5147b64ccd06e1058ed8bdbbdde03fa58700a6b0068e8b41e5e873a9eda7ab3079dcec000ee19baf98ae52d19c9d412315a77531518d5a9c6978e36b6128788860671838717d7a8b91b0b3b1ee563b26f88518acaa9cbd1e71ec55563bf7744d46d7c302c78278b736998d93c25c93f55a2e0ea32f280b82a59a2b9cc161c65a507822012fffb6c3203072ba727081e54f1bbb6be3ad2e3e7ad5c4a5f3f0cdf5e103a10a74e187e86381c8a344ad6d8dc357c8c60de518e2150dd8610d19dca38461bca289d84b5e01b8443e77ba2a966f26f7c0aedfbc1e2a60c84dde040db9cd9af27c76c9c46615e912d6f097cdd4ae016031578668a388b3c4c808c9d8737a03c6a5fcb3bcecc886baf314be36dc049bd37d85c5f94e75f340b4621094f490e04ca55de39be99944767df5d262ed0899f3a137717ae986dba5bbeb2fe115d2f1b614e1d852ec915de1af4a731f5c0e37ec7a7987a2718798278df804356d85c0064ba127ef49b4347c34913ef0268d7cd8a7ce9ad7f98eb2b1235ec8959b9b0b6db6c69a79a1980c5607f824da17510b1d5a639242c597a4ea6149761b89d622a61c766412d806785f4eb27c8ca408317019decaba9111f1bd493231f6552a04b1acb774b3e5bb375f9342cdb50013817bcb3261fe7a09f9b6bc67b81de49238f5dbf7f65aa6b16d43539ed8353390d7a08d82df154e703ae40a48f222f64fcaabe8d85b80e0233efdedf2a3ab50dfdf2ff88f6415965e8bc941d7a332238f46f0640a681015b17b0debca49ff114c6561dd9279a6b0bf9295a40e24ddc6c8b91bc6c5fab96347318e6fc0159b9b0725da829e24d37c0f19398be8344838d06635fe9962fd5a38e713636bb204c0fc628addf3b84f5459478e513fd3f8205ed439a288526c95bf850cc166d1039688d10a3ed14fe0923e85192dddcd6fc131c31c058c10f4c3bcbdbc27651bd3f570da1faffa4399d4a501114744376100c2f5723784d44d46e2edacb9f0bbda283d64858050fcba7323b776896b118b20dc07ad610491d29410a421540dac6f2227ad232ee132a2f3ccfada0d25d0eb3cbef4c6ef7b68b357c632164bab0e584c89ebdb7570d5e223ed6e1531da2ac84f9c415539a487d0062e97abf7e44d8874675d327616e55954edc4e96eb2ae3ae1b0d37453dbf0c868d5d5c1b08b5e685a9a00467ad53bb94d2bf05159a4527ee922fde35553c74ae277d11dac9f9f2adaf18316231cd394db5c34c236adfffddbe67ad53f93e2953da2679f45d8dd2ef6aed170559b48a650d1ae683295f298dad7657a87ae49f7a420531d2d65664de6248c2cfc93bee46ca884e1c2e18d299f1c679729d328dbe2e554bcbaa48f4c01c7d79adb1636986604421450b0984397a4c252f57f1cab05ff38cd5cb8e4eae7cfc919c5dc74013f4b6b32227d91b708f81ec5427b6df1bf45375247e233e95d35e56b56388a771adc9ee2057a2998f69b6768e8b6c7cbe848c09d0a32a450737de423a1e298e05ccd1ebc9ac3114a2d708e48a21066d737012ac4312c9d5948f375cc996f67ba0ff9c7163b6296d45a938a38944f5675c4528feae9bb66734c41ebf336770c121c0529a410a08d03c8bb05b5f1841570ac56f3d15960ce7e18b82736417348c741af45bf00117d3f61d934f5a0b2ba065bf70bcf701a2379f5b4ab0911d9f622ae615f36bb85889aa6a9579df08670cf32642260276765b1efa3161e49e80b4d7c72619f9d65063a7a29b7ad9af18826c49d9bdd108401006b19f8fc1df20be2be1de6b1d481b68c8eebd7dc00b9740d7b110c1b9c282c1a4113d223991bcf9f2d1630c6141681f8d79e056e7b328a546c8da54477772879f705597c20857d6ef094996a20b873fa837fb15a80081ff11c7063f58f2032429498cfa1dcf664d006084170dad90eaaaaf1d908bb51b94935d87e3f4c1a0770988459fee53331d441e77430a19f7528591c5eb0a4ae39d7b37dbd87abfa402a4463c1f6dff8f3b0fbcaecd1ea153eff8f1727db6227fc374f68fbf2889de93844a1c54ae09420c6e64e453ffc80149c3d99ba98013fd8890d521b60861ddf5c8d7ef7f12191925bfaa5aa5cb7bbf145c1593349dd26c95fc5ce2c78771570a2ba9c05260a3f8db0dccf32220a47061231d6312a19457c5dc552b31090e156db4b987c6b0ec59cd6f2aa09f8be72edf59ee4ee87d481f092d7a20d9b06f309f98574ad1aab78a080b0b86e4b88a95a0b0de65b32d80c1565ba415960b1dfeb6c8a9ef01cce47ad7d503d69f56938a81b4577a1080646d5bf05a95f6fe80b9631117dba983a2099829bc7d3e8bebaf41e533ce76f465d327a8674302577a6c6c665114d8032c2cf0aa687b19911c8c3aa3bf29928a3c16fc80896ea15a9d188410c9834ba7d86a75621a0d13da8a2c84a30b1a881244e3fb249f0ee5460637617c018b4cd482198fe3f20c5f9d2ed059c03537ff118d02e9c1f6053361a506ce348a775eb55f4b8fff79112b4c9763a58fba07645fd942f4e31f4c50cd235f08fd05cbd6b25191f569272a121ceb70dd0f1822178fcf5500edc80a320dba4ca885e5df37c51a400b05951804fe61117c22119d1c3656e01d45b62a36c1397c55db796f8ae37fda39c18dddf9a37d411755cf0013b6c8ab0fe8e784f00ccf8620d4a1974d4567d3bccf54bd6687c344583d1ad7cb541b222959e3f7023c509e1bb64f1a688544156f5e3181828cd44661f07d472c39a049962dc240402a0270ba4eab9e39c89ded66dd4afd090a4a5feb4c5c3fccf460c86b773c194880e598c0dd6c73f0f81a6776faa6b0204c1fad554401369b70dec0a9e24036865e51e5ac3eb3d9d5b24558e5e46511dffd218aecab5dcc0cead763d5fd65e430cf1a37d4f4ee26de9d4eb723e60ed28ccf549b8a5f3187b9f3ea5710c2abc5679667a291bfb36aa52bc526d127ff641d767b3915476cdb0554d12ec1d2ba792c287ee53e2515c099d4f699e0755293a3baa339f2c67779ce26371ac91d58cbd110f42d79965f92b7fd5497add91e601e344e956604a3f4788b2453fabd97c05f488e0d50676e6b10be7f8e75c650df159300a31a4dadcf20f1204ae00867c25d4de1ae5e5b788413bc5963f09d8f7380971390e212f5d6c81a8da9bb15ba037dd4366606852c3b9622d573389adc304a6b85b60e91e565ad38f0c359a100a5a584393d3d57b9b4e2d2c940e8ac478412278797997e9709d3ab3928b0c906b9e69cb9262080853e1c8d0a856f9d3d571f9e48908e8a930a579a8c52314eb82e8d5e1e7662a4aefccb7c447328226aff9f4ca67e594ccbe4b38e0a6fc9c24459067b3cd839081e538b305723f4ebd37e38e73e571c9400bf9d1c73ae9101ed95a6c112ce330ad16e4a1933e510784684b31f86da0c98e335f1faea06964f9fdc8f109f14e89be56763c14b2833892d15bc97a44355adadcf0a624b73c69ff2a523d00b4caed5a22b198c3020d338ff7b5b079d227c074c7e3557ce0467b692aabd9112a6e4d2b2c8890f0e697838d629a6190a0f24dc74f4bf1d7437a2f10a6ed711437a79a763e4cdd3cba2fa8eb28acc2527b9c78ff9acb08e1072418ca9e1dfffda99bec6e0bdbdc8fd016edeefde8db653ebc30178dc5f8ceade90e1c091c5cb92e059bf22664775275c1ad81fe75e70f675fa528e1cb067f872bb0952add0ccaf385395583885c71139cbfb4b730280913baf92d706aa28067ff7b4cd3c3ea2e75dc42a6c9b6d1d0ea02cebb16361a8dbcfe9ebd73f901fccf040adf33c25520d65d491be1f5d7aef10f6581056dc186a4128d9a7d5b4f7b4ec5464bdaa95c7815ba2deb154e9093946a6cb502e0127fe986cc6b4fdfe86ad548fe595966f2aec2c47caf6ba7ae44f6b746ba0959da422b7b73cb8b0b4f0bc70c51272a4949a3f80aa5392037142ae42b08f7e9f455f395e94f3f03b74e534aede5cbea9ca44f29955452ddb9c964a25a13ea934a0d884a299d3399dea4692217e91395a2ce91fa92a252fc222464914751c75dd1b5a9fce5abce8776fc28df399977a8e2ab28857c954df11596e2ed50d70bdeeab600ee50282c80ae023fc15b99e08ebb095e0f77b9145f017593d4e49534a3d7e40f835b5e7de68fafb0186fc78fc078abfbf1e51770077201aeb4dff12bbc95e9e34b25b81395e00e6985d7235ae1688c236c9d546a798648537e92906a6053a6d1d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d05c147551173d72a74773a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a374a3d38fa60876fc79c4d18e6fca520b8f8b8ff3eff89afc62c79762fcc09d077774328cad24bb6085d74366e1e144b823bf4028db0b3bbe520d096a6a6c3061c3460c4bc410430da01a356894a0a1a191040d1a3390983143f5a352cd1c3133233302191919229021232606660c189854185229941828d4f665db4e60389d4c61984c180c8cb5254dbb5fb837fb22cbac17acad5e6ac5ba8061940b94ce2dec29a5d4c2eb1163ccc2ebe1ee58783de00fcda4a1b0a6599ba2b845b118dc9a3a7299d1dc1575a04ff4894ace196173201f2fc2d649156c7e84f847a28efd9814234fd4b15a2ac59baa958a52b04d146cf2670c1a944a5ce4c78f01b7fc6b704b7a7c4c89fe8cfe9e4352d7b68a3d2aed08dd9deae71c7d59e534c146b54a6fcec1230fa7089b4f39b4df0d26328c884c643442c5cb9c73ce095d62d0e7933edde7f439e79c73ce391f36b1515ab7397d7ead6ffe9c73ce39e974edb9730edda5ec629b0082920bb647eff3d594af6916da9e20cee3f0e12cf6d820d6da5ab57dfc36de12ca9759dea8e96bff3e0c1fcb5deec916f0f6b50fb34cbfff61bff2448bf1c48a65b899647006e13e1b9d1b31fc036318d5608c50ca5c717c35cbb28ce21fda6b4fb59b7f9278d67d1a0e23845aca85af4415618c576bf1a27b47d967b895d58b4d7cc36739becd1e730d3c9c938f651b9ccbd962838f278455014cb6bfa6f5c0209e69d9bf8771363dcc9c73d16b3817a3fc9eb73dfb37e9ce664b1d31635821841056582b849826fe83b807e21eed637e5bd352ee6b5fab9e51bc1ccdb778490f290503f9ee65c32124e741fc5d4ab813777c97af879c7bbe4f72f7e8da11734d97a579bae0ae33686eac38eb4fa32d40793feacf2db8a413aa23e3a37432e79c73ce396974f4a7cbb9a893645fe7633848f655573d839c8b3fe977ee7306f96a4e2717e31686decd4f923d0d0a728e3e9d4f27d5158a2dfbeda78b6edbd3ed793ccb343fb7dc3548fd4d7710ee5b357c1cdddbae7f210e12f7f6d78588637cd9f5a510718c3196d40d1f0e7d19b59a39e0bbfe7d55bf8743b574754ca493a0f9dd7caa839cd349e667b2cb5eba32e992aea8135df567746199b6afa43a483a19a2076e89cdbac4270b368899629cc35edb1896510cc35e9391b32c7bcd4a91f1769341b187c12d4ccfb0599ba5c890218320b4a3cb5752647cfce8240661693fa32028ed4eba60340c7b0ceba62ba599708f49462661300e736358889cbbd68905992fe79c271c44f6c8c7fe426d4693d8d70cfb194de64edb99e65c965d95265df283e25f2969a412d5c6249e317b48a5135fd160ffd2a5a71396c985fd1582e6ac39975dfa90e24a1fdb8ad2554f3d37ea279e534fd4cf2c1f02c11d6b53735a2d3578714fccd77f30ff64208437704bd60cb7647ecb18421a70060d0d1a1a8f42e94e8986d210b53d7e0a21fe8fc91dea339cc26f69ead7392bc401b76dc35abea59153afa21f1323374c43d4c36d460a8592337407231e82a2b4456d955bea65ea6bea9b54fc0eadc5a9b9c1c86c0fb747e5b7336e6d305a3a072337cc8c8621965ad65e6a52d77933ede11e49a5ee2c1eb2bd9c91f5537276be639ea66a4c0cfd6e0926a19438d88f791e4ffdbd9af64f0392dbb6750fb97b56dc23f3f5797c255f9352bed6a46a1fce6931f5a89cfaf91ad0ac5f67501635e35133348fa3ea867a38e6791c5567fcf6d27554d6feb432460b99d2a23ef534c87c3964be7c0d08eec89732f53215f7d498c7f090d4a4e9999f64d31d9c7888b6e7d3a464d4d4a4916ad12bf3b4d65afb31292da10b05f3aa2ce367327d1919d4f378955e5f563ddf7ea7444b6921566b34d9a35ebecc43ab53ffba29234bbfb131557e8a090db7689665b8e7dc2feb9610e6b34c2fc19660dd126ccf87401bf551befc1a03f331f36386c07c7d18547dd4a772c764a3b0257bfa6c2b65f6b40707c9b63a6b8ceee446bdcd44ec09a33526e00e148f0f5fa15ebb5a131ee734ad6df8e7c46ad69cb0698fafd4b29c42054694d2f56ea2ccd9325f48efda78cc9c1a5daae89a2ee99252da504929a518a55677f94d8cd23a25955352576af274812526212521c5f9cfa6db7694ce1961f38774d27f72734ed237e1fb8473fa43a9e39194aa0d618416b832ec16bb45165534bf41dae4436afdd57f1a53482ba41042e86e02ec51b0bddcc1a4188c12db0264c9371f7dd8c35e7d533fe9121f7938d1e30ceedbf7f46f3a5e00ecf1c71e5230369a20fed8fb3ffaf3ffe54efee03e1d5b0da2ec6754032739fb1905e195d4d5b92dd59de53aae46a8bb2dc69bdf5cd4812cf99bca68cbbf795b065080a77a46cf39c7fed5a84324c61a6bacbee95f22b56e9b148c8b3a44de8dfc5ab74d059bd834df6e0459b5cd572fc9716bab4e00d714534a299d26786e04641263fdc293c902f9dd128f790f5b5447fa9aafb443edd108c9a4d8cfe085b875a396d1b7ffe07361693f232e28a97c25c5fefc1a56a394d22e530cf764126b23542c2ad83fd5f60ce33085cc0d85cc5d2b74f78983c0f777c71aacfbd137e979297d2f348918d319fe841a9dd5085e4f1066b8a51c723fd34b7cc359ab5ee23bfbab93643f9554596bfd59ef09eeebb089740d0fb9bb5edc837dad4d5c433db3cc5e7b1008ee6415bafc99803bdafb12dfa721f1a43b9f5aabaf4413e20f7507278df6f26fad0f87d48740fa4278718f3fd49954a26d976f714ffd24a75a5dce2b5906a7869fd13765fc36dfc7f283b0d6aaeb6b42340de14f4bed4bdc937d120c6a3b63e241261cb7aea66519ccb409b1ecb444fb9be1eeb97fdf2918fefe57d76a99804cc0269e99c0d313b0e8653d6fcf3c1cfa4c98b1e1669e082ccbb22ccb52daa1b0bda22b4945457c459376f6f47ddca01aaaf11994eb834b881edfd967dfc1a19be5f9c4b66477f595683b7b228a803e0f710bfb0c671955c439d3677907e74c99bec139d3d32fea5f99650f87ae5d82dde7ae7eced9c7aef45596b1af36cb32ccd62ccbb2ecdea7f1e11cfdb783af34aaede01cf5c1571d9cb2e9532ddbf43cf46956ed4f274cf4b753d69ca3ef4ed84c0fa1c0285067534c0586a6bb0dbb1a53bd1b8ae56014c32cc51e8f8d15e5d4ba512eeaf0d83cfa188659ecafc56cc69aa6d98c5fcb40d8bf42586badceb256ebfdccda5bdf7e56df39ccc639cce3c322cd4d45d0c2cb3eed67a48514f643dd379b6c8fdefb3477ec3a1632638cee4ff3e37d7c04ecf83227799a26c80176fc03d00489638c01bb58c10bf2134cf7e91e638cdbf423b6a95f8331cea9242ec528837694414c26ac4fc0f7b21d6acfc697a094c86b463f024412124a2916e9a45a32a7af094310c2128e5064832934c19253903a478a8d6a1dd9c33f127532cdc51bf8524a2939a83b586d964a29a5941e4192740409162ed8c1c676c759b727a0c2e61b892f7227f1b36d5697a32848403ac215479002162e70c211998474040976440809291aa194124897a02e50a691d01196b14ae4e17225462564132578c0842248f1841596175c6820e7c532f7c3c205af24242245549d0d8dfd8ca4bcc05d4a29a59452ca5ab15ab35a6bcdaa75ac62f48b2dbecfe884bb75395be6d427e516a896524a29a59452ca9b65d9fdec667fb35aed575be5bc72aaae812df8c09c9c1a6a1134f41f8bca7ce9d2397f88df399963bf3d709187e3cf13fd7efc1a2f0ad531f17851f7c2e8afa5aea84c83c1a121b86dd74375a883ae5a9fc7a193d7033ad9554322a8c0d8b63054051d38147390fe4815638c9ccd9678036db2acb5fedba8bf40dcbf2ec4bdf7def75c75275128ecfd5e0cf5f71d156f4445faf2a7e0623fa329b2b813fb1951b9b2b140140af5b766215028140a8542bd670ce5140fb9ef28f928aae516690d6dd35d7cecefcc3cde7bfd33edc6d872ed6356a2daa76ce26143967d7e807440b1cd2b9bbbfbc04421a194521281014516c12d63d0e9ef918f79ec31bd3dd657e6f835dbc7f6310c8bf263263f6679a7c4b2af4f62768b2897b6e097735724114b94bc2487e2dc8ce2dc44d59a55999f6cf279a2120d26651972e1dcac1a6a716e6e714e4a1da340716e4e29667c4d8faf68fa2e067de4c2579a1740106d10e68338323f466b1f8a412798dcc5a46250cc8e4151071ee9930ebaf3bba8657814af8db162d895b9ca192516bfca39a38e49cec52e5b221751c020e7e013288bf6bbc124069a6670e73f9b0ebae615e8a3026373e8d01d3a74e8d0a143870e1d3a747777ce9df38a61980442fe9d42482925a63bf922fd29657cf933baf4e85086218ad2be27cfc1f67607a3ec30aaec67b474b479ec67b4e4d23cf131bb65c6a983a7729a126d0f83d3ca9d556c99dd02c21a5f8b134aecaf948b69ef2fd5aeb47fb394fa595ee2bb65f5bc346287d8dc58c6a6a4d3dd3fc97cfaf2e98c5309095fef11ab8f7d7c0c9352ffbdf79594faf06d20d51cf760da088d45853e1ceae00b56d9bee77b213177f015e57c52cad7f32e7c79cf2b352aaf4cddc1211ecec13fe299587c3fb3aa53edf778e27b3fa1f69e7c53bef752bef7b4ac99c68687afe043087fbeb60ebe12ed3a7e33c77f593e75fab26cd74f3bc27f7e620cfce29cffec60f3efe097ad677ca3200055d91e05c21215271eafb3e1c7bbf3700ec20dbd86af608435ee496ef82edddd1d4a97d21d42287586359c83bf6916346cb1c98fb3d3584ac50c903e470451ff4d8a416c3169c3fde73810eeb3e920fe976113bf992f359ce115bf990f4b4f1051624fb1d410c8b9b9e7852fb3d882903ad62022d4f095c5d671187f12cfc24f034619a56029a594d18b3da34c815bacc52dfb6ac52494724278058b73b3de373d8cf0c63799200563332d21c2b9f9f7067183983e4c88357cf9cd4bda7ce0b179f9eafe7ca9e00bce28b621e4869a73536cf2a304e33e4bab8cf56ada57ed4ac17fa7fc7aa5604cfdc88fe27b9628edb52a6925d56ab6d23eb5d6d2b7bae21eedb5a9c9c71acd566bce254569a1f64fa355b6fb4ab46d67c5aacd6ece2aab3558b336e77d4db36fa5977da52a26f9cd95f551ec049693de373dcd597d556327d809b883fdac28d40935e70943611886a9362d443ead3e843abdcc9a66fbec524a5ffec34de08efca92d7675d8b5ed84f98a87d818b97442e92b3f9bd8d3743536fd4ef6cc4f82d1ec7e6ae9d2a7a1bbed74b3ada8d65a6b3d690ff7d8c74d2c769299f0902b93b9fdaefa86799b3becda198cc5d94b6dc7a478735ffe53615ae2501f26264d9dcd37c9b8ef43f7effd19baabf76bc64de00efa5996cf136772ea65b2951193bb989b63fc5beb49bb73ce39757dd4cfd34fd4fd53bd9ae6f4f4ad133f7a17f530df79936d2fea377b3f096ade87d1a86edbd809b873b5b72653f62ca75386bb5a5ba73de5b7277602eed098a469dade979262aff92afbfa9bebe0af5a894ab5af490b997f2dc54ec01d54e31cbbc41bcd6698d5b223155b1793ee777e849db8f9ed13765d6b3f72b9274a35286352f4e2345d46402659cc23b836d3a34bf920c4fc3d3dc3864dd95e739dd7a54674f7d7e3de6a83c18ac7bdddc5bd1f8ecf82294ea49452c297923ea42dbea4704e0c4ef81e841305db94d3f6bc3da558d5cc0f90553d227c3527e5d980706ddae317824e1e1f40324a4d312ae7eea55f6ba514088ad9cc3e86518a515b316bbf52aa65866573764ca08b4227b38bd9f789983fe79c4e6cf73bd59c526c3490a0166a31bba453c36fe6cfa943e5dc9cd813617f5afbd5d2aa594cbf492955ed4955ef66523ae9a4934e3a298d94f2504aa976efd5ee6bd7dacc62b4528cce0ce225262c09a20b1390901029e203d2fbf8fff7c10384e71521212111e10182540489c812228240ea52a7431f2810420861ad7fb36c24be7a7fc4395884c7c70d72d6faded6f3fb6b709dfaf373301a36ccd28c52dd699a474ead5b86599e38710bcbe1f18a64cd3ccecd4702c4112fc2067ffea447dcec9fcd556131c6a83bcb45c543e0cbaac559314d4a29a3c681be76b166b5482079d281544b8cbe945b68b6affe7dab255a2e30ede3f3b8dd02eec0c7709471d3e46f76cbc6a4bc8ffda6837a08a5122112fb88699afbf5678c117bab05eec8c7f4b45bf6cc700f562106534db5664094527ab56a733c3d6adaa8bd70a83d84f1d6aae9635f35ac8560afd578b1ac69eecb9f9d92ed3b08b427fe4ef6c44f527754b2e9533665e93755774aa2ee34c0c46e61b7803b6fcf1de3dcd8c6ec167047e879b193c49fcf0b08e445148a8f4525dafc2a14759e16dafe53db2de08e18e9da8479729fcdfb220f4b1122ce41f964f3413ed9a02bdeb87625dcd86f99b3c7ba2addab2beadc20a2ced59ae260c3fe8873fe98460214751e104a7ce55dd5b69223d1fdfae0abfa6e8790bb833e49e477980c4273dd622651111f6a8c1ab502c2ba6463efc5a864acf61d2fe06d1c35edb5d7aece34938d69bb057c760bbb654b2617c2a48de53887e59eb7913c1ceca7945be10f5096af07dc32d8bab71489f05597b3b13a77ce0e40f8ca1ffb0b9d388761391bb3af445b698f7d0d3c7c05e14dc53887fa9b55cea1fe694dab7f65b5f5de0a0476b3ecabf6cfb92b9db3fa6aedbec6133b2635b3b57e9635205bebbd99aece699aa629c239ec1f74f90aeb8ec9c61767e8720e834ebc48e52e66a39e082c4e273614928b9a526cd8d3b05f1f22412d1babd57a94adcb893a9adf608f61183663b055ec8bb88fbdcdf48bed7ef6f6af5f591ffb1d7ca858c52a56b18ad55a91fe48f58a361e58ad58cdd918177588c88937d8d75ab3b7c9f23b574d18e37fa6c71988ecefe3373dfc4308ac336b6f9669d95ffbce551be7eab3c1741298a441d31086768c71cd94614a712bc37fbf8b663299b437695988394daf6521e69cd344dfe7fd89f57bbe54c3b98333ade94afe844dab5d955ce45391cf63fb34d11cc3d3bf1b548a4adbb67a398f7b13f42ebf6d7ca4d886f62eda959c8b153f7d932b79175fbdd8fd8eef3e3fce4588143f9bc982c595a494524a15c4d34c8d07e171a6a8e344783726ed479d1f757ed4f991ecb25d3b101e4efc2e5a61c797514a698a2dd84ea8e7712fce41dc33f32eb13cbdf84d97a2d7030bf4f9712ece2e148a8bfaecf854487bfa148aafe8d390d2459d380df2d5f3958dd7037f8c2a8f7e95eedbc8110bce7047a52faa6d8bdb7f297a38b18bec2245b09994dcf3e9b7dc45a33804cc1b4c4ade7719241cbaf86ae6695ebe631c54efb38be169fcd4dd0c2da76b1ad3d3985e6a9ac6a47f30d9a6976fbaa6d7bec7f4dad55ed3524bd367b9d3fef432dbf057f9cfd4d86cbca6b9efaffd7c9a69ee9b9ed25cfd83c9be6f7a0dd304b99f7dcffd0c679f691fc436691f638ae16d68fac5667a7f98bf18c50a88e1afe91f5e80490789e14d3a490c7f75921a5a0d21dbd3afa11f8dea250dd7dd8c999733efaa99f7199f6efaa9b9e9e9cf197fe95afa945d7ce53a521a9562971fdb5f7db7bff765e84be93388c7bccf2c334dba63b283d8707683b554ca7457bb9897f94f4964846c4164fe9a5e4646a3549bf493c97292f9f76ff6329b7e4ecdf4d264cab499efcbccbff3be8c39697ae64b2d657467c4be7ffad3cb681999bcbd77447610fbf451c957910b8dd4a7f412d9e397c62836e970fbe9976ca84ce99c74ce39279d94ce49a78f73d1579b5e22f746a16c3441361ae579fc9ab27429a594746e196e29e5944a01357f44103f7c3671909aaf7f6bce7a86ad26d7d4d4e8229508520eb9e68f640ac5dbe15f24db4c75c83402993a71ce7f0b639f82a2e95d47e7bd53d029a8550364f30faf4386c017c93e7ccd70e7c0fd35e5774e7746c039332cabe1446fa018c811865bb5e61b906b3e876c73113be4f7b89c6fad21006eddbb613e6a30cc535424d76f40ae9f43aed5e70745320fdf80ccc3e790b17de98fdff85bdce2e12f0f0fe3780ae4ab0c54a3e9c8f0cf573d7ccdd7e88e87bf99874c7d76b0e5efe84f4dcde7a8791cafe1961255abea9a9aafb5561c5f9395a876c691a98f7339ea5f1a362339bee6251e52f339f49c92e9175b8d91e79ec72f97e7949a7fdbc81b00b78ce8193423f80626bbe61f0e52c3e939a5e6fdb31e72e4f81ddcca9143e6d59093935b389ec7e94fe5e1fd29900e6ef1c0439629193e258336428543b571681b78f0784076c0670ed03f327c910c770332dc39647a376033963db06bdee32340fdec6a597e3ae41ddee6077c91fcb603f2033e874c7703f2db5783cf4df963083ccba65680986b73f1bfc43d64683534ac5215c90df81c72ec38b06bfcddd4c73848dd38fe62ad48cebe0139fb1cb24f215f25a97fdfdf01f5ef49bbf77ebdd9adb93536e0d6bd33a6981a13deb622397f0372fe1c32dcf903feb8ba71fcddf21b011f0e8ebf9863f049537e1e9fe22b1cda3f47edd6e839655f06649b27926ffc90ac3f8514752e5210dcb15b3c553fe847dc4f7dec16b8b32df974db45aa760b03fe4626f23a0ff9cf710fd1d28fc3c7e18e3c823b4e415c8e6d29fb5e40a6581e4e0fae781c0f76f070aebc9c23b2f270727083c70d4df1706c4003c8cd40e8e14889c1e360f0828703e5897350b0e0e1ac00058f737282876382269a3c1c122481c4c3f1c721d39f87e3cf68dfaff96adf5777f5ffbbfada3bfe51bfe68dd8f9a97f7e1b874c45f070fc6fc874040fc75f48a6473c1c7f05e4209902c9b42753261e8eff8f4c49f0e8130fc7df47a6ae87e39f804c4bf070fc59999a0072fe3bd31464aa8287e38f804c831e8eff01325dc1e3fc0d9069140fc7df864c5bf070fc773275c1c3f1ef916901328df270fc79642a45a6327838feab4ca53cce9f0099d6e0e1f8d790e99487e34f43a6541e8eff0c99da0072fe03c8948a87e39f93290e1e8eff8e4cab3c1c7f01649a83c7f9e364aa8387e3af23d300646ac5c3f10740a65768d1c3f18f0e45fdcfef5fb3cef68ac7bd278fe08e7da1bec39ceeaa57f170fc73e80cf78d6cad789c3f0eb9eb4ef60e93edf0af32ddcedeb58c87533f06194960626ac42849c1c880b9002a1593c2c086a24165e0b4bd3ecc1684697b7d1a2721b069330d517f06d6c0d54cda92ece2bb019b691907eac7d80e60dbeb775925826eafaffa885b17f3c09edbab8f12f403536e4f6282403e9cfad4c7919045c4ff09813f9cfa11b7f25f8f336a38f2db36d977fd24f5332bde154fe747864fe25932682af5ebbdf11207c9f28de7815b37f40c5bbd5171903af111e7fc7164b86d7c77355f3fe7ce889da4e6b3b7563c8b05b45abcd5bfbf45721dfac43f5314502720e77f2353251ee76fabf0b72fed3d2503e63bdf329def99d4cbf807f332313ff3bbe66faef92974a37beae3ab9a1bbabb5fbfbbafbd7e9ef839043a7746ecec2f161dca374df7795cc857af3b37023e9c8a15c0a4476e21de18fbfe14aaf1bf7a0a39e7738a7331e48eaa60fbd7c89d0c4dee6068e40eb53bead39db62a777677d4a7c376675f9d49c6ee2cf5e952bba33e7405fbeecebea80bb6ff491ed128b6bf467d8af0d5d518804744409f9bba1fae522c3c6251c1003cda738a5e128473fe5388e2a1ed43819c73da643bd5b2755348f3394500464026358c804cb00c2aa105153ef701fedb703a70147cb8b7d94e7b0b32f633ea828baddacfa80b2cbbfb1cb9056d06edc1580388981f734f23cc79e7a532fb80875493668b6022cef963f2f5a895be1ed8d4f9c178a3d90d1888dd4c9447bcf1c739e766afc7ec31ffe168788896f65693aa5de3b5ef6ca884a931b63f955143dda37b4aaa1d35102e65175fee6bb32cd3b497da4b2d88a6bd7635184dd33a24c7659a868768c5d7b07c55fb4ef5362ecca9c14d7ffe8c963232c6c4a86de8fcc7180fd1b28ffda6d5ef6c74e4c8bb53f0ed20813bba9881c7f94d1463fbc3f7c5f6b7c0eb818147027794cc903942f545296ad7ae96df1c426239eee71c0e627f6a1a2fda9fb1999561add666ac4ebfc249e73369f2dd9396f5c8e075194ab857d6e03936b478481a6dfe75701cc5626aa85455d36ab5f415452e3008e17cfaf4319b19b6f9f2f51022a49b1bbe4f29e5cb996d767c8923f220077b9148ccc209768c5f63a49452ec0926501475010a2e40780212134b5aa862473969d2a51c12a5f4664c3051a2891a308184164869810fbea08521cd39872149dd016043ce0777265541459744a43d62038a592de6943a2a1d818d4db1a022842c36a5540a1ddc112ca2f8b1cee5703ae491ee060cb438e79cdc4c3202912866949c0e8877c79db2c8911b112d8c2a362713929438429655c1920748910f204b43511675811da1414623911d908aec4085d76cc2842c62e4d1c205573a105db88e441d9e986404a74e440bd7098331c60806a478f3624624ea64fa48133f588209b250820a2e5040c2174c88555a2d7cb62805a478f36a13095089e20ad70cae80420abc2085a2298f965257482a229ac14912d901a9c80e611092569060669452ca2900cd9973448e9528c410e59c7336a1896c8293263cd9549b48d4e199483e34a2e40152e40348185c78c2f03203110b4e710a4853d8128f9032a0295a00a9608c2f584102172fb0069b6f624828a594984bc99313813807a116b6a0c10c9e90042f8696ba904455f02be7a494d26a55d5db8cfd8cba88b2b1fd8cbad8418c4a74493aa28405cf0d9aa0a6dd2ea59454488a54508a54e812a9b014957ca212500e9d3973c8c7c78704515c5a7378e4d4c0a3c80947db1fdbb29faf30cb83a772ca29e9113928728215720a69180f90221f40ba787551d4c55117485d6ce922a90ba52eba48201a5d4ce9626816494c56e9e3e3e3032465952d6324911d908aec3086cb6f5e5085b209a986fec515e56c1fe3c86fde2e6a82062dc860c9670a345081185c088318638c805e3133798014f900f28a92b0e414c67d0b4988c2f62d6664d19296231e242cd4c803a4c8079057d405a1a44d331239df51d2911b78c134eb0ef5683fa31134d9fed83bda741e51338224be90133b82ca39e774f9cd0baa50fc468a2146e5a812541ca18fbc228c1ea162896c3e9b3d146fde9612cb487608d2e2a58b137ee04305cbbb2041832e76b03d22215284278b251c5cd9520b9f85160a60042a4350c11550b08417ac2c3cf1aaebd4c8022a4f3201c21ecc408b000a2daa28a51116453d50c14e6d7162b3ce395b00858c1d73ce2925168e307757c37e4c5e3e68820a0a9e70820628c0c29c73ce39a751d07624b8fb4d96229ce004252041d214aceeb73b141f1f1f26585c76c76dcff1953f0f1f44dcdda5bc32853d5fceaf3b9862cfd77c8563cfdf76a0e585f62cc27e463c00a3007b7e4e0d3caea062cfb78107893ddfc77c20be7a46455bf62c7a485264ab2b2f016c510021be2b643145280a4488d203a12bf4780167648516dbb7b8e2823de39f54412b269de8620443480802129660032bc85985146c80824b065513cf39e79c33d299d158851635e2111446bb7ab20a25b088305892c0092975f022c200a04891032d98600a1d78c1624b022868d8667635fc146b22af5edd6dd9d48109648802697b61b11d298aa40bbf0a57a862092f78c214545421562cd6fa82a26767b3e79c44629e1461cfae86f77e03bf561e73ce39e79c930b02d87c3567f8fc81972658d1831148a14404168fa8f3f106fe1076a752da5d0d7bc29c2b6c229d92ba45619bf3a12ee21c7cb90311aa8bec6eca18895e3d2a8d0358ba4fc7a6bb259bbe126dc76a5ff66866adeeaaabb61f2a98aed963fa65d97b26f52cc2e61fa53fa92d944c5c9a22b2084d13691e0043c07a2f9f094be6a87f3ca31c4c810ff7649a1fcf2807429b27c6dc3111021ae520ca36c299b84321c8a7617befd5a3bb76af51cbecb3caf59f58e0f693324af9f1e6fd5339f71cbeefa48c52460c42973427de3c191f7c3146ddc5f83531fe9bf1a0bbbb3f19a573d1dd9d4228dfebd3524a39253dd5ba6defa17e917a7ead8a37ef7d8c0d9af6fbf7dac381104238e3e15c8750c3086b8c5bbc795f1f8cd5e18b31d65021e3bbba6da88edb36d3507f378d1f8919a899c7afa2f1a6d3cc8ceab599bf19896cc6cc8c4945636606e3b755db76828989e1f6844961a8192afa3130a7146a464686fe8c0c19999919999f9179192d840c2d6589984702c6b4f98dbf96d2d8514a72f0cfc7269dcfb1d41329a59452fe7bac1a619393ce79edc4a00a52ea524a50d1f645680a2e4210570187a884a1c5cbd2121884f6330a03cb33dacf280c2fa84cd9cf88ca93dd411fec6734450b1195735ee405765a696db4d6ad85f6d96ab35c881d00e859d83f1a6b36e10ef9dd69c713c0c3f1a779c2bc03618f02f0d05911a0061a6618c0a473ee98908b37fedc8ed763be9c120a206e0ce7f5b0d8d5687c28658c98aea19a11623632ec789d0156db5f86d743000f47c70c991ea86ce0f62300c7c9b7715a8e6a276c8b3a37efc6ff710f870518d6f17ad0f7e7b8a8f358a91a6fb697c2302447bd8009b59ffdcc9d06e10d4c6ad63029f15fd4d5396f725f016f6b1088dee82c853be2c307ff419b0db7efbe9bd1a12c176f68aafe01b7f6f7511fb74fbd09eb1753fa4594ae3a52cfbae5aee6943b9589e3e6cba284db561af9dfe77109775e8dffa0eef286f24ddd416ecffa381615ffd72532d1661686f064d7ec67240431f6a56143f20f572da68c86c0c5c6d9cf6808538a8e20b47fbfa22324b1b40493ee16a8f9683fb78bf6b2ef977dbbbca218e0dfd6b8658067bda61ce0dfceb8758067117d41c0bffdb8858067bd9af0fcdb35b8c5f32c222ff6bf6d03b7f6b388b8b0feed18708bf5acd79304fcdb35702b01cf22e2c2c7bf4d835b3e9ef572d2fab769e056eb59af9f1ffff60cdcfaf12c222f3dffb60ab77a9e45e404c8bf3d835b409e457425c8bf2d835b419e45a405877f5b066ee1f02ca22937fcdb31b875c3b3ac7811f26fc3e096906759f972e4df4ee1d69167113589c0bf8dc2ad083c8b084b0efff6865b393c8be86702fff609b726f02ca2273afcdb26dcd2e15944518afcdb18b78a3c8b28cbd1d670cbf42ca22aafc7dbfbe216f61e83ad9b5eb6df207656445797c82edb93f69d5c38578b2a963a54abd42b75a85641fd388702da969cdbbe54a972e54ad1d111cb8a46f3ffb60d9aec655fb6675efcc63f55b46d5c2755a4f215cd7c243f9f66fe63fdf05d8d27536fa3fe90535a720a2968bb5f4d4ba4b4e4145294ededbbf1b75b2cd2cedc055080817fb175292424d48b65e5ca95a3a3a2a32bb01c6d4b4c6a56c5574c5856aacc2a555cc7a4d4a5ae6c8fba432dd5ba6d2ad53fc7e56c4ba7201b248394f88587221eb24bd00675d565a3d42ab54b477de2ebb565fb979396edeeae72081dfbe29cabaa4fd537ab1aab3f2dc05e2dc0ae602f6ca8cad66151b6ff9531b8e22b0c8a7355f08b89dd820539e7d81325da954fb6fa8f6ed94eb56ca7596ee0a7a3eda72cdb4f2f796fcc322ccef9e9e59c9faec04c774c5eadbab2ac24f98a6525c9b9b75d7b1b4afb193961cbaed9cfc809af6d97a20eaee2378eaf6cffec9d2054a445cb26c07e455aa29873fedbd9ac794e9db3bf8187c4af36dec6c7dc69da86f6b8957d54025f813b70e32ddbdf46eef0d0632edbdf06fe01371e7262fb1a5cf38adff863c97c6616201d996bcb606359494ae2c2b2c28565c58b2cb3ac70b1626359c934cb4a87aa75085c76cc6659498a01c7c0b2b2c5575b585694923cfb7a6fcdb2af590d9c428a3a78480b1734f00d6f578d7af9aaa33e577cd55d245491af58565058e0cee9ca69e9f578d5a702015117145f0d615f7c85e485e86b2862425928169713ec09e6055bda4e3fe3a19e9aa39db5ec1ef28ff6feb489af8cbc3f75f9ca46b5ed1b396efc9554b6fa459c9b4f818f8122cd3fea82d8f16b7e1bdfc92c7b1b997eb1656fe30220b391334db1f84a6a0eb76a06e2dcc4e22b0e485a14f547dca3f55cc2c6c3db18c9314138389d4373b8956551cf873371641e725703cdb2fd7be8a893a965c6adaa65d10b8aafa06bbf6d80cc7a4189a28af212f2157c62bf7d80cc7a09bda6ccbca6102df90a3ab1df464066112d117d9121faf202f2156c62bfcd93592fa0571319af2649be824df6db3bb38892bc88f18248c9579004fb6d5666112911718121e2f20af2156462bf9d80cc7a05bd9ea45e4f88b6f80a2eb1dff69159445b88b8401171e1f21504da6fb732ebe572b23979f9f80a2ab1dffe91592f9fd7cfe9f5d3c5573089fd764f661175f162f2e2f2154462bf0d24b3885c4eb09397afe0cf7e3b486611bdae6857907c058fd86fe3905944485aae1622215fc111ecb76fc82c2221a22919d1942ebe8222d86f0bc92c2b5dbc582f56967c057df6db4732cbca92952fd5ca17205fbd31f6db11c82c22a0265893225fbd30ecb773c82ca2222c148b8faf9e18fbed09641691cfcffc09f2d5fbb2dfd621b388829ec827507cf5c0b0df2e92594450a2c42847be7a61ecb74d99457494c5b33c9cb7594443be7a60ecb7b1cc221a72ee6d165195cd22aaf270ded69062d1162d695b244d491b823bb64aa751b1351c106dcd8aed36bed3aed8aef5e065b15d0bc28def3422ecfb9d5665fbfd4eb372916ef8875b373c8f2f31fd8d3cb378383d78f38a69c59b448ff39779e2e071738a598387336df070fce794ac44db42a6d0a481b5b2fd6f0ecce19e1e7ec880efe3f19b23076e09818031c61863e3f03f70fcd4d595f1f0b2ba6a09de2ae6c891e323b6b12dc51bdf96ec1623f6c9db90279785a2d1b7312bd55d7d1bdab664f3aa6db3d996b42971906ae32d1423168a916c836c907d62a118d1a188d56cd8a06102d9d71c22166d501f237f5d5b23a822e76aadb5fe0070ab62eeb31c81af99fbeb5a5621fed1c3672319c9db205f21797ffbc4dfdb6e703702b93a97730fcfe5b791a2d6378e7cc643750d017398800e457c77d46708595d38e414967b030381fbc6135b477da84fd49942422d23df4da19b3917b30c17612cb88a7331872f61ab7ffdb7e75c87fa0000b7aefb4b9dfdd43e5167a9235fdd18554be6be7fe4efcda9a354d1952d5594c2e2f4bdce342e724e95f10b6371cef11105639bd99ac6559cf39738c8ccc65730e8a68ec9ceb412b6fabe659bd9cfe84b0f7645b2e1a8865d4f453adea606d5b7c1ad7a0ac243f5a7b4f11d8ffd5a773c78e47812b6ee221d6df1553785b6165f3d23171737b4a219af3a87b64fa1fa3870ab4e256cd4c78b7c7544a7b0b80cdccf291eaffbacb2fd65c0b3ba5c2ea834a71811049576adff3a98b4352554d176f2e4bfbe10b8ec2d4730fb1909a1ca164294fd8c84e0a4c67e465996f6a949d5ae986f7602824fc756bb2baafe8b7f6a8243d427a0939397945a6c102f811bbf9c7329b624f197c05dbf4369b175a88caf64fc7a0e619c263ce49cff17fe9f38479f083981b29d36e999fb3997fd603bbd3e05398771c041eaffdfcfaf230a8b738e7a0951515e4cd9f26739e7bf3b342459fb877b7a189a43790a492cdbfd6e0add9f539c73a5dde1a11a6c1dea35877c75df8f701f967d1e0fda9d12a8b4af10704bb15ace603b01e92d5bcd539fd7c3f7f61f63ccb9d11dc6384df5b56c1cdfd9a5ab05094a0e0a7c770afa1bdfe121eaf3704430c61633d35f249f0349e321c8c5eef0d0104e81dcf9ceb9d3b6e96beeea36bd91dccd9f2e67f720e44d7f03a06919c93f2ce4791cf5f2d5159417be7a1bc9d10ff6070720459d256478241e20c3031eb025ea2c51814742860ac8f0830c6fdf97b0c02351010bd8afc00ff607fb3fbcfd0abcbfa5f9e33af6e537fe2eb91cc92f3674579b6cdd6df3f564fb0ff52b505f8607d47740adb5565963fd5875e0568daf03b762cd02805bd9ef2df2e5abeccaf6a2f8b3757ee49fc557f11d89fafc68d9f090af1eaee2abdac2433f4280deceb2afb5d65a6bad357e26e5b561e3ff73f6364cb908e79c081b5577febe74cf8b5724dfbd285821b8c37f70f80e2271c377300921df4125827c079b00f90e36d1f31d74a2f51d3c818fefa093047c0751b0bf832ce0f90e428180efe013037c075fb02b84c1ce77300605f80e0af1f80ece40e73b4803027c07a7a8e13b3844c377f00603f80e5ac9f90e12edf80ebe70be833bd0f11de44100be8357dc7c07b1f458c077d00700f80e1609e03ba88319be8354acbe8335e8f11d8c7280ef6014acef600a7e7c079f782b057c07816e7cf7bce861f33c7cf7b8e81e12b8da3d1f7406e80880e3c2b173e4bb1bbbda40db2970470e456aec9a4de0abee9410e19c2fb1d5efde12dc12757c8b91bf5a08eed82124dabfbaa20ecae57255978b02d54581e7a1baa6c01d5bc5067e1475220fdf430f6f4477dbb6437027bee00e7f237feddd6a320ed48b43bd36f714d09dceee5055e04eaa08eeb0f27aa4b07838a9f8823b3608eef0ef41c7231eb46fbb14752e927da5b0783d6c15469ed39d4e0edde53c0edd7159775fa33bd5eeec52b54b7669bb8d8f5517e19c7f96d5bfb5d6fab3abb6f1595662e3e1967e9b7f10b7ae3c924030a23b9d1c4e77393970e8eeb3ee543535fbaa1921a9f643b60f81acc3fb908bfc9d4096c04b20bc1e5b180fc775727238eedf54ebd52143e0efcc5ff3100f793a29ebc30ecef9cb5d244b0152b17ef86dc97f0bc35f872c99f038ff1cb20cc2934738f29504de5f66719d1fde5f6a711dfb7efa777a9be90f123892290ce00e281ee738be26e3f89c3b26ef39e0cba1bb9ad7fee21f35cfed9cbb10ec9abf9ec3b6f9874aac78a8344c582a831a32342323000000011315002028100c86c442a170384d1459f10114800f92ac546e529aa74910430821430c0102300000000200813430003bbdc2bf263da8a4f0944ef9db508f2d0a90b7a8edf14e0f181c42f4eeab7bb0d81bb00f311372a7cfcb71c1e63f3bec715be85995dbae38faba3a5a1f1010b0c429d8249db05d3dc1ba891390b5c2bf68057c9b201021e4f5b05d981314256a193e4821ab1470ceb4dc6be3b0ab56dafb7f40b9231db0ddac6e2837ab9baa9be54677633f37cab50c7dc28701f887801ee1cf6ef3cd25bd3a2600f706fb0317f04369d9a2a003f8155d692c5b876c848436700cea6e37295897554fbb730ab5015804725db67320b2a1ad73eed44ff9b23772e1564812ff648b1cb9107883a80a23604e240c3228af08aad907bd1a0defadd77828ac92223f76415b3f3bece3c11c1bb0657bda4ec86c76d84aefc608afff5bfa4864265acc3809c65e68a71742f4ec110e845ef5ef6c5e91aeed8c776a5edbec3f878c6b4def036b7f7cbad6f6ff677a10124a38773bd7235d3af7edb539e1f4b930e7e95ca3b2ab03dfb5fefb69061c9e7636b82dcddcc2e465772f0e8fde2b9103583505e073bdf3d46d3f53f73b484ce839f5c9e68a9e2906b55be32cc7b0bd873a54cdfd5791da4691cf61418c4377a6ffb137c13f3c3f5c6609f43fe461ff256f8083e3d7a524da26936a924c62434dd4cc6dd15ab3b6d31a0bde950af9c08654c2fd7cac444ec36110ff8368778369dfbd3df9334b2e97bb974744487a74a0f7028c0a65a51ff405e7d3ea6f29f3d33a5b8f0ff4639801e648dd22f75192e74b5440000642b134bfc9bb83878202170ac0f0ad11d9bc1a3616e0e8a785098e5e8666f61858d3c887da1a121af8be94efaf1278b880d7c4fceb8b70f2cf071ef3721ad44cd5346a2f44e3957361d03a006e3be836b291836a91bdbd69dfc649e8322355b5c057614a759278520c1f2039cf4e4f27187e75f1ee10e6f6e0ee1cb24b0344f473f0556449dbf96f23a9b3702301991256727e4f082e7358a7f2842ccecde1830c76169db4e50bbfce42739fde4858313bf031cba16a76758375aa36305df0e63c1f9b73d9b49b349c4148abef7eaf13747a7d8bc89bd3716dad7c9683032b90d2255426b63a4252aac31971d5003220bd64e7342149886776f3bdda45e9f4b1b5ba42224c182d8bd4af6c5e011eee6a2b2f31f166771a8f0bda80926cdd533a22fe869d95ab028ccc332cd3338a2cd7ef10a3aa53d1fadf172c76749f7d07fe623874cb7f2e28cea638f4b8f3a7637884f00fe52435d33689984b124ccc8396ec9a0c9cf6552fc627499e81c42627f672399e22c8b00ba1d72aada7a64e312cd900160359fa74d704130e0fe051fd6f1d1b3357e9b55202a9a7f73e0ddda122e0323f3ee401e128556f7a6cd89cd56fe3e6bdbe1a983b7b6cc6fcdb6f53e6f09e9b9b077c68d25ce26743e6239f1a37a7f9d5c0bce86333e6567f9b323ffbdcdc1cef4393e6893f1b32d7fcd4b8f9eaaf06e6bc1f9b316ffedb94b9f7e7e6e6ef1f9a3407004eaabd0ee692b908c825a3df98dfa7b67479a4dee1212749aa75680d0fe07988ebc848702833247543e52220cbd8bd173604253ae8f58dcecc389b061e32d72a4e595a4a8403fbeddbc3a1a569bcd55ef030392dafc3e05a942c3418ab35f1a144366514a7e6c07f67040b2eb5deecafd7f9e2f3a3ae13de28cce742f011c4a887a9b510239871510c37a761336762acd94da37c8d7aa4e6f9b7a0b77b758c62e00b4997f04de44639963d56cc133bea67d6056961c4494450b8de5ce5fa6f22c8f7fcc3b6a2dc2422d05d0231412b02d64f4761c2461586ae5fdb89da451e62d3a36274ad077f7891e5288816fdddf033937c6e67c7757830414c091bff0b8a72b9553a6cded2ea71fd63442bf226374f2a864badef11bd5eba19874749c78090dcbb355ffdf7850016b5b83a35755198c1d1d4849ca206c1cb3ab60f67766c1e87fec0b5f1a08d6cc2c5e48d7c94eb1c18aa0b165cd3a6d541756413d201ac569b9c5a6663fadf0357bbd8d4102159f62070abec258c97da55b01f77d31722b84fd8f4e2c2588b85c0f4567a352b72e1e02bf90530b02a972ffceab64fa8536e9aeea2a753c89ac1df576e3432062fc7437a6a34023712120868fe2090287a49f64d3f0708ca70f1c7289667a5876df86e5ae683e6131ab678653f2341db8a23cb26195391c69e86692af5cdba75463e6e12decf6faf8dbc08c76018db2cfc2c06be6e90a269a18d18fea0bec998a2514b3afaa4eefc5c86928c9a9c60e0c53b2e47f12f4a8f2c4ac8572c2e86b36885fa9825f79e8a315f9585587419fde7efad03f8fe23740c9db80c24deeac228d5469ac33456f1df0ad03265cc872455db094c31000cffd7ff76f3342a156cd1c1d132d54fb8165bb619d7c38a842629cbd275c1788824de3d5cb6f03aeb09907d6e4cffe197aa024997a487a3670172e16c8e871bac742025181ec49e15996b10a4b8580d7575242d3f884cbf61588df7f673c5680dd36ccfa1301ccddad086c02bcc1d16ac6c159ad4ef4212423950290e29c89fa3c27aaeff10adb88e33491357d6feafc4559ab0ea73afdcd377d06a020b72a3f6b2dfd567c239cb484f7aa41d8c5f5f09b4ab111a22bf6ce94c5277e136c302acba6e28a6805b53a362a53ed6710a3333a8ea44c75464e959c7299eaec05c248e1395591098861ec03525250c10ffe67ebc2954b3423786898df7b590b7009ce00682998a04cfa6adfcb5a418c77e16b5d6c0f6e902eb8b999e0a1a15759dd6d6edf8414a6fab32606e0b7f9797b27e4f93ef64794dffdaa00749cb5c5ba21d905457aafe9dcb7d65df21c05954add4276fd8861f0af7dc235345245bc0f3006370b89501b4ea31bd318d6aed1429985fdaaef02722aba434320d37bf6cd337f03b45310e6cd17718f259ce60afb0aff3f91541881eef8f4d3ab24cfddc86ca69243b77c6a566bee266e19d4e7e1423e09551ec7a115122ab587b02839a24c5f099e2bd93bbea309affd02c30747cc6953a89737f219d6eb4620b26c3c2ed6d83055ce13f0e7c2fd9b48922d250a65d7cbba9c0cd15a9c1aea1e931c17d9a6a0d198c20ec50b1401ed3a6d4f92b0b1c6e0db8399c59362ab07fcede430c5b5091c5bb0ce89a678ac1302c9b6cb44138cf7cd99903ca94b64d6afde7dd8492535523c9adab42bde0fa1e62a47064f80e2827a002323bcc470750330ce1a610c03b4690a51451fa26210519fd53c08021a0d906121ee3135c3dcd74e9d56ddc4fcb34bb4bcadff40f6f3d32a7476d860ff43c8fc46d32840ab89ef8fe9d35e8600541883f7a55a4e2aa06cbee145a3080f173e18a1150591490f9e216cbdcba22de66a96c0151eba83b197a22599b97582c1d49a925948058a3dd1e6933451ecef080fe5dad21d299b02909abfb4b09efbd3924e180ebf409408899384ccf3ce83d54c0976125fb64a966f5769366efefd399e571668f7a31f466fff988cdfa71c8cddaf2198ff99b04663bef9447790ff1b8f3a47854b1a0c7f9ffba66219fe1515e4dadd97b4fe091e7497bd4fcda1ef7cec9638e25f568c75f5e5e62aa10c03f8d8d0a74d493d22023f721a29e9bd84545059d681cf7c33f056db59d4e7399a3b3baaaa1c58870169945f5683e705ea0715d0a226debfe781d31991399a4e60a4252fefa8046ee5ac24a3352013b154d119b5be8ac6af60a4d26ea8a2813e62210d088f7947d59b687a49d263767fcb09db4810babf18f1bc9e9fbb5bcb482480b623610692c90e66f373820b3ab68a147deaf8ec6f9c169a07c7c60e0239777fcb0ea6a836372d1d01aa6d260d9a3ae347d3dd343335cbaa64bb3c389a2a8d2dcb1aec781aafc5d38e6380e8e0bb047bcd7520584ee6e7adaf245141b322963c7268cfa1092638cf341f1c18318eba1f57e3cffaa255d638570e5d618c6ea7fd0f53505105c1140f54b7365159a164cd9c970a53bb5bb6b3e17b142d79b54f2a8f9a5a828fae2ed59ab3a44895bc0c379094acf27fc85b1235d24c94d3454cf7b7c672c8486d6a5af18a0a5e984d6ef7da93ff49dfd349e2ffec34a642668cd3eb7deca62e318fb019ef54d5ef70112f0d574b831e0e86bbc0ec51e8ed24d21e261ce64af1171d2014df672a1943ec11bc25f318f8ac2328de8debc1ef243e24da23d6238fdda1c0b99bf6b2cdb4c79ccb03e8c636d291cd1eeb183035dc4f243340f69417013f8a779d741b2bc866e0960516938a24f6906722ad83b24050d52f5805045f29d993820168db13cd4ab14647bc36cba17b0926dc86c1136957f5641088699ba210aac1a532564bd48b2a85eb5097dc66a3bab0826cea0d81ad917a13b29612a63498cb911c467e2a1ca92787aa4f4f42714397e6d9c0588ce5170011c078bbbfb6ae689d495a26dc9321479543ebd25eb4f54d4482d2531ec0712a8abb76298d460c32b6164435820f8ada15f0010dabf6e204151dbca90735ea40e8bdc0917ce1cc2b787e107aa51d9aa39412693121b1a402b87fc929b4f5ea6c2d3ec448d49501689a97f484071c65a5e7dc01f0fd546b1c266b1f6d4d98ff1c241450255a8aada08548123afcf1cc00f2b55805b1f699d40a1bcb31b5168e5ae490b8c54cc302397ac5a09fc3e9dd401a694bea829407025c6d0daab8343bb7e8e91ccf64177edc1e2d0b937fb1e6a6fe5f41d95adadf6a16ff2a40e80ef2118abb89b56d087ea0a51e7e3c6695cba8b5f895058f32584a5f188d566b471197d30bc3c237efdc6917284bc8af970e8ea99481783e415162ef71f79c93fe2bb69d60f6f268fd841553bdc7b432aa9317141490cc12c4d3c03a9571ed50db528cee52e58be1812fb6ec0db835f78bf8edc5437f4dc07d893e4fab5ae3797a9c50795198e0b39c170b43ca685cb869c06f30c644e78151a8b99ae5516adf8a7d7e83d8880c7aa8a60fee4296ac279e2d70396afe25686f239298f1b391317f88f61db7bf5491f26f6b47bdb6ef2fd9aff89a8f377a8a599add1684e705432d3988c8ad9a432b0f380ae7480130ed3dbc5b96d5dbdbf61d1e121515cd3169d46c54d1fe7dd446905c2b7668b9a0b8faf592402f3318bb81bd1ed0d183c6e86db08c83c68536c4b9ad1d548253098520e1153a3ec20e4bc59709cc6854f908ecb338c5791b2e8206cdb6490e3c3b06449fa59fe7efa9b6c691a5135c0c37bdd86d2a0504d285eb9750853c3e9c4176b764076e4aaa063d803c355f8658398d4c5c2fb77415cf5ba1913e418cdc81ae41ed6906eec4ec1b070b2426981b11a174488efb637702a2c0d180a5d6bb81dfd631de90a4af364a837844d1c5706360a4c03b823db02c5df14f214216fd671ad15570741554cb62569925fc1f4c523a8a14f52bab558e10d4a8ac22d25de43ce1a1dec68490095dc3c2875f7e557bcfd783f8a8583370f76dc83bd795e7887605ce7685630c48f4f6e553ca2d0003a42e8c1809c178812ac04bf6d17701e301b6f79fc46ce69ccce5bf169d86a2d97b0cca02f259e52efb54eb0c9809c4f31e84e294e0e9a3026ea88839c96c6b1dd9db0111a6c1016a5b2a11dfd0ae118fda5a40c31ac86389a332d2e84565966ad5a03f01597ba0017cbf723e35d77eac690be25c052edd34d69a474e0cae1e46897b4a2ede78e3f62c31d10959050831ece719c82af5677a871198347bacc53343e0bc61d8f3bd8c87521a769ffd69eed79735f42923e705a62b0be9a27f14c1c449d4c0bc222bf8493b8b0862244b4963d9bef7b709b76c0cf5a2cf9f7ef9bef9fd929c426062f95d38e135e38a07684c1ca837faab76c56be0acf9c718de00c05781bc99212e2bbe2e1adb209c2fefd298866928f2d1067a6109bca07022ed1ca06bbb12464b9648fc6963e124278648e07dfd888a62747111c114159e8a25582c287da442c2fb46aec192ef7faa2049e77ad0e25dd5c36e6d03950f4408ef727b8a2d2ff81f049c362d18bb1c64c4957927b4ffbc605af8d05f6a87813baf35642155403311667a032ce149134f6d4f37efa149128bfaadbd4f7b395df56fb558f852be5fe1caf7d4c38cc2d1da8c60afaa439971d3bb5c207bd73b774def5d15b69d4ed5e5dd949fba750101dd41f1342ba21d6b845103fa7c1527609066c58e6d1816dded1797b53257a0f0b3ca1f3e08fa161cdd546fd437827a0c5ead3cea69ce7e5fc84a22332355cfe90ca17eb41f942d368a31c20bd45bfd0ac70764bfcea18ecf805f424332f22678b2eb9654d1f039075c67bf9f46afcc50d92c8ae97079aa291a413e820ed971516d6c4cedb80c34844ad2e66b53750a3691a18d3b48136cd971ac3b2e1fa469c9c26346d585bb3b59aada161ad8c6a6eaa476d98d1de8c868db5c4a45106efde45e2585733e2d62808479b1943f5bc4d0c3df3a74540b2ec119d33c099720e58bcb2dba109e80a46f721857699abfc137f832715f98722c8fb125244c1c965c99216ae6580366b13f919d0e0cecd3ac0e5ee15a8b51d4895e210e58319bc93c54c4926cfec773608c320a85504818b84be397dd64300b04a111fe0f1eaa8315bdd1c00abc9ca1038db07803299e6018410851ce4a1d846acbe8cd2551fe4eef018777b272d19cd4c381c5d230134517f0d3c2e700b7f2e2431fa1ce4e041361fa8a6fe645a910084b2706866a466a8e5e93b671f8781331a90310e840ee893ef3d829b603f9cae580ffa131ab5cde4749744485925645e89e69690f2e70bba28ab4f4876fd553125ecb272d3dc335882e6f1be8cf2d5770bc5053dcad832fb233d45a1e001ee960584850143e9318e8ef033689f44a8ace5328d35879b2acb67aeb708a920e99a7bf3d042a5b32304c665d1739a8eeba96f0c8a5250204f0efd07970f8e411c6bdf09d70495b5fcc5900a3babac455dcae3e224a94f64600992193b86f7b5bc4e19d1cd0b3f3c9334a27c98f086cd3f87a3217a576adef1f2ed27590e071d99c5c8034ffc9241b5091cdc77eabce8f99defe29cacb497b6e926687862c2c4607b622c34a6459b5f23eeb242f61a235b5e1352c42b4aca2bfbb67cd01f8e1d084338bab2563300fa3a9a02117b50be545d7e82da223705756f645f9a04205a87bcf26e4fae0cc0d75eda2e77766a682f5c491206f55b1d29d16051cab198ce1b46a42cd7a04a2f6c8e06b10913b326e1a2ce465e8c54ead43fd02bb25684463811b3d4fae051a809341081aa368f52b7f9582c7b2e2c7d25efe6e6d94adf7454c289f6db0ddcb4b7d3fc3bd1216a16f270a16401e6144feb287bb3c8349ea24196885c953138fa42eec9fdfccb15e63d90da5b034fb63a3208f042f2538e2fff03bbc93397662dedc228dbc6ceca466f5796a6221a0920d8d28b9750c7ad3e7911778041d4aa343b8293efeb8e964534b8bbb999e6c500344bc007f0d2e629e873a43e6546efe180dfed1f98afefe30c70b97450d4590adbd436be8fb097ddccbec0aaf76e6dbcae878b01f4c0e0efcb620b3cb0e361a73e7eb65d7789349fd7044513d6f7982b448f473c99a96c1928362219f0f31a9b2915f83b051d94aec7611273e7cfe53e41ea5f4edf415b17a4bedba9e22eb8d67500631f25e27ec5f21a3b73beea26478fe5cee2abe719f2942191ad433051b78e1065393c3d8b0854aea9deda8267c205fda7b71fdf9a1ff0c7d239196938405146973f367ddbfd89c237c6364eec0de1a70fdc24eed48a9f5ec904c1ae06bb57e76bb717bb813b047c114b9e02799cb749c003ea1288cdf4c486d6b7a039d0f0d7b3e46ad7f3ba3a2bac4156347ae0d3c88e89eae5ae4bf85a5668e94912a33e0908c9d9380a74fab95a9ddfe6d48b729d5fbd43add9a56671823deedc01b9f49bca0e7b006bff7e3ef39085ffc92d889f607234187fc7551301f225fdd8cd698c567c48dc7052a35298bd440b3c4d4a5b7dbe996525d7187a9e4742d348ea71f9c29aa532a0cecdd54786d6b61ad950d8d61b320b2234e961202cf3114bef60d5762ceca506938e1c484d283d2765d8c1c1f9af37bfc1a705d08295d238985ca80d3bccdf2617d1154cfd4271f00080057e6b153745fe5a7412881f2e31d35fb45efd39b99e4911174b87668f908bd544be5ce3c43c3c8491b67ace00384cf830e0b529741bf0a4027b0ab46f428e054c92e11e001b4ea804404f539831902405e201c0b8844710dc01438b004636611d4005514824808e14381118d209e52890100c424cdd82487d08f30178c19b024a071cb72a34fef62ce6be35c05601273d94bd69b961bd5b87e2ea3fe7eeafc43e390ec068d6c3a870e94c2c7ca68d277f758731e6b6cb57000c8cbd047c01f1be581c187b5b7a52af5635d5b97a1f442f5f391e87dcfa03cfe8902d9de50c5948fdf02a2164782494a608d37236225cb440344ee430e3e54d01426372d49b9bb65726247463e370ade1caa09090d42f946b8bb399e20a65048f84f96658df2ae8a0ea2086a65d05f2fcf9078d80ee9fba4798d6c6d7fcbeab915735520f13cf2d6dbd1c033e7a295328ac300190e9e84ea051600a98b4ce6a65be524732166ddb1314f208bd5f9f6a7d006c0472e1ccf679a4517e800991828fe5b35ed68473b2da4c96af2cab404264759930264b4007ab983ccae3acc2cd01cff02d21d448e79929675397ee37eb2f39b1db796f5cbe08d637dadf216fd96068f60e3de03c720e4e2f6062ddb594c9790009ffe0bc7ed45765c900c613b31f0576fbcc90b0ce83b6fb3d17269123d9d3ffb470cd53f91af8aaa10b2f23860c9245aa9fcffe659c0c3d8c0537fd055d1bad01e526a9abd3bf7b401c80b871456f9a74eec74d4d7065ec751a43fb6d24c36734be41e8d0f53167764cb1560302b0881fe80e01c70924e601060c606b914e9894532c4a3e18b757aedcb68249573dc629655d83f9163b961973b623a530e118360dafa18e04c26f3061058391e101f1655d2b725161a0ba1df17860bdaa2c1aa8eaeefcee6cfdb17e565081f7e372cd09d76220094a0144d7fcba5c7d50e335ebcda748e535afe4d4e5cd7acd4b4c299252cde94acab1a4efab6c3d2ff611eb3c276fd43085ee4f508458ee107287d44ac0b027c5220a8bbf7506f8e97eff22318df01ce8a20e4e41e40a35928e29ee6c4e987d4fbf0ca88ddf1c14397b22f35019f8d05b106ae2534b51c9e806d003d8a5b46dcd9ecdfd55511b4415c018cae9a72a9e7c262287453621c4b8d5a39db7bd187d4689a87d386782aff9c5c89434fe8c7650f0697c9fbde1ab4b415fc221cb8c6aba5122e87109a69c216bbe36473d75545121f30f1a87c35a606d32ab06c35ab1f8a95a1e12eb8f0060c8daba066438c23434b2736be98484e05d165833fd5332a061b919b2a463320cd090ae931a67045a266181543051a8c515f55ca1038ca2c9a5d4b9adb88177c82fd8a2b67dacadaf317dbaa9958320c97c54625f604d391bed1c5efd1959082c857cdd44845c24838ac934a8c55883cab6006855aa802a8eaf53d24bccd256823f79ea51b07e5a7febc20338d6f70c1242ef90ab820f00e788a73d2e2f2e208cce0e2f4cc2b981d756d7b973feffc9c4d83484d9e2ff7f9e41e280e8279980b17d545e9ed9632387da35dc09ed98bc84d432d06a525329e5c3259a503bff26663eedff7789b74c8bd499666e960cf8b9c3bef906f8be2d49dd67406e645cd090ce4f7df7270fb1d27451fa30934edc42a5982e92a977310d923b2a2275811b14f3b74088855ad34797b8e1ed60f4cf99fc58f08966431ec66a12444ab03cba6bbdf3a1616bae3f7975b0300c3afff6fcb8ea7a13ac457493cbfc25ada9e32e982e1a6cf76da627972722514f83e817900435dae3d72f0663346b8092411396cdb8ad5de5b35ea120dc26225a0f6380bde52a38f989a385fda7fc51e5ce41838418216ca61534c145efc09cc914db67080df951602d299b203f23edaa1393a6ff19b3f95a3d815c4cdb5e12314f0c7b09106c5628a65f358eee9d96c36367b087be8f5afca30cc6a22970ab120575ee0a7a4ae1f5ee4c6e8a7d248262d3c073d3033285c7c7222d28cb0cde4c95f5db05f47d78c7ca98184c57c4ee38dcccf2974f8c401930c595ed605fabe148ab80a091f705a59d008311a68817f7fcb459f95cab1addd7a66f6cb9208e8804a4d9f647aa425d8ae34d349d0d7163a50f6d0034a80bacb6e3e297d2c76b67014296f9b611af19d33a5f7ac8b9071e59f24a6380d231ee724addf42918256c435e158408f0ad16f65af1c18a23af345141dfbb101eb248ef7be32887def68029b296f922bd8f931572e3134023f61ed74d7e3f88e47a3c78fe32d7b558bdd4e572fc48744320b3167565e5a052149bfc88d45a2548b5b3330f4481cfdcf39b08057a3330927b9c31eadeae3afea070944d1a98216dafcb10cb62330d17b60f1e2efe4ecc34bf40f54302d4fa9d1835cfc9157ec4b8ccdfc3f5c53378d3a9f3121fa098d0964cf51099ff941633a722e2e85e7cc1b32e287ef56e61099faf9f76af095478c6cb2e79b30edd3f1c8cfd215a8c6a029929676539da26511254ac1437087ae780b8037daaf49a5d89efe1c27010e95e20b2b039713502646cb3b7af3470dc553cf16c2110ff22754f74cdf6ce0497ce69123b09e44de0ed16358cb7a21836171041c028f87be00cfdb4595dd519795d03c20da7cda46f52d7596d49b702be94c7a2f588ae2b64ffa83ea6ea5b20c7680a5a730ff9302f5ab7ff67f9320265b1545a079d87c2c55b6075df09b4d8057c5681c659cba1c2e095da5980dc9a796a3ad5e31aa20b6c03819b1580e42e64a7981916c06ab03564b00b2bb7a144f4fa48accddb2d5e7a243a14be950c8f501c9452523f7c0542ad5b745d7d5fe421095e970a3171858b95fe60f5f1455530f64f144206952b18306c9a684485fec05d654a7d00c812181757d3b9e149ede3e3bb882f94de0ebe65d687667443d16bd1597bc4b2b3c5d868115f44b96993c17732fc40ff3d153029454b282701d726ccdc1291fcdd8f780b67a32edee3fddd333b55cd12632696b16e544e5cdaa35f3f62a7a2424b01cec9ab44877472458568cc950cf6803d8c4ff9bfd1f91b56ef78258325e56f2b4feecfed251e6806e13ae297ec29d846980502f4d2fc1575af51d711cfe18fd9f0600a00ab20a566eaffe73e4a632c67295fadbecda3f88630b0f1bf05c8a4d4e432235f8088397b3c4a70c1e68b0053a6aac49d0ca0cca0667c806c1563d906ab359d1c73fb00e17cae3beb594490345015ed3a716690167de40b51b6d0bc5424f0f359054fb99c085200df09281a48e85436a1887d7cacd5cad86ca884c1dbde5d3b2dfc18b79409c47fa064d452430d98fd2b8a410b450afeecd2416440ae8b37ef7fe7c15115e15492dfc732c8c3b634a077e8964cf2a2e8fd041418f1e0f455d5d6dcbb4faf9c404fdce38fc9c04b005682c8718433db8ac3746078043e38a6cdc87c4d0eed863f3e83c4bd5c80f71f11ccb031760a1e51f1e26dd72117082532602015ee03906991902068f8e20ac22dffe2a4dc379f427b517ecf64b441c12f170b107d4e764e192b55c50751de7d08693ea8ff5a5ba5fde86a900073a364c59f6e1ad4601df3969148b778992a2eeba4e16fa534af4c1408ad2557a01cd361056f387fbc737e796e6395c55e4a32fe015394d2b1c8e37c62990a53180efd96ce5787e48107fcaa059d66bed6259f6adba40791b40f1b3f747fcd249f0e3f0a200db5a3d4c8c04ebba1bc104694d2b423210692d271625a956116df84ee3705105d25ebf579a1bf7e65371696e9fe48ef51940ab04260b98faec806eb5e13ca18b14a15cf428c42a509e13923b0f91af07a1f45f6440c99c1535c2bf2ef405f0b3610ad8008c55b3d626c115826e84529c88829a4e39c5f5a35426762ffc7e6aa96597c7f0ff9561507138fe5f9e09dc34594860021f0573228de54d93479887fab4a1878421bc3043aa2656257c602c3a2d76e668002c433bf47b3bfff559ee59618fce5994f9bff3dcb2298ab2254d6d6eec3090fe0be78b4d1ca3a89dd61c1bd577586de639da21e487bcf03ba7912ee3d9e840a2532d5f23132ecd9d551d7246edfc90889be915813cc841818f69638c14910d7896b945206808a481587dd08358b2113aed8967214f4794584fec412547aa5dcca04f4dea2073783a70f74e0eeb333324e1120c00a711005ea1621811fba200411c97d288bb18c75bf21c1a8dc93bd0979837845020c5903de7452a59f8179e66a46b3d42c70ed784d14c239ca8fd129ca6326d5a046b69d31cb056e846058870ff8954f7be279a85e0c6d5172f0ecc96737e32bfb83a2f79af3dcdb57bd988f2e32739ae2d04b210d530a24fd1701d03fd58962ddbec80e05dda843323f09b8995a07a49115e7ed34861df6e30fe0f6c1926797a38932a1d07f9ff2f83750594de88b5a0125ddfb38fbbd1b0146156b1f6b89efe2f53295888290456e06c42eb26b9a7560079128db79138d7cea7d12530dcd836da4a1e8e6ad416b26e8af1a45448798fd787fc24c5973428407de66a82745e049b40c391b0b67a853b0eb3b19359e1051e42aa8bf47d1889c2f983fcc2cc6a6b490fba577073517e3c2036c5ceb83c3ca0afd80b1492377973e256ce08d3dbb49373be673283a03af25518fdea09e9678c1d9a7a6bac0202de0213d7b30958f575341c2f66f133047eaa49a413f327dab6f176663bb9ce1205876ae541a429613d99894e08296f9bd3235f7387264c15f549e28cde630dac9649948d0d95280fb3a043f8d25a336fb351d6d492994d4b89ce46a8aedad30a437e16608d92c5c176eb4de9095fcbf4b29e053c2853c575f73463983eaac3870509b23164fb3ddc871195e157eeaffd8381036a8726a9b1b208368bfccf0dc809a28039cb2fd73dd9d4bd30b7aae769c3e4d9356892d9ac6944224f82802ccc4bb851fd6000df4f52d286fdc1affabf6e26d1bae36b67cd7689fe1d14c51dee26e6682a89a40d5516cc0c0c68b171881bfcf656bda325839a2589465d4d39b866dc4926f341f69e2aa494af9f0597b09bbf92491f92302161d1a54c9428ba0c2ad3e1982d06b87acd00e7afbd45c4407f14aeecb8ba9df46be7fea5b36ee42345c9e8c140ee5c7e77d1114721cc08cdd49a2d64a129dd816270bbe3ed244716433f4b1b89b41e2a37be71ceb57346f3bc79e97539fc8484066f4ad1a6d45951d4583ec0437a44a8dd8b3f4ce7ed4cbe2ef150d68a712c8f6c391669de52856e4c34e5a6b780f855de8778296ecc7ec524874343de43b1d1ffa6369eb56456c45ceab701b2246a8b13353651f3d17dd09f0976763a412512c38e5ad86683f05d2a913be0b2d53aa3b18d09c8161ec2ac9a8b41157a4fb8b905ae1410c61749140a9610c2523cdead96810c6f20ac2f43494536feff6fd5e0fd95cd488aa9acf95677fc7d6a64fa8a5f43e7ed891f157ee0ad7ec9031e6fe58b215f8741f92636242e717c6d44eda8b19b27b420f4c659892c222bdd1ea44a197813f57117396e37196f4d1fcf3d892f7630f2cabfea6c807a8caf0c47a888e71c9677e81c239aea5224fa147f350a56b83a5fc2fb51e10e5c3c1944f8ebf5669c448391130de8c27260315b57cf0a9ad393c58e2b48fc79a98213d0d63eaa7e960b9f76c2e7831debbe525872ffbeb6a86ed33889c568d2480da30768c3fabf89f3a8e92eff43f0a1ee6c6ffec023108e2a0c87e5a08f2bf19ba9071158c5507865ea3d5235f61bb0d0d6a3a154c7e7f2934d19ca1a8ce5226bd10bc683b49f4f3ba259064056317abc448153fb688728fd49c1dc15050a668f2f069e0c302508f59a32a8bf80e4aa2fa1cc9435243c789cc67f48f7b748da8e4ffcaf6a9a44a62e28f2a0baa0d90614f3a281c123d8252dfbcb49140f18b0505d9fc0dab6be41eda901f29ed4d686724333b18639bf0d4e53228ab4cdf7c8bc87d739d2ad3f4622a223c76d6d15b336c9d2b081b3c4f4e6e9112d90e31fc88a25ae27e3888d143287f6d4c133b240635cf890f8f9532864d89ed28942c14115a8129f284146f75f1e8b8be2b3fc93345f40b1d1988dd1b8141e7048d7e18a179cd492a4514f632c831b71b5cdc5d2c296c08e3edc4bd84bec9c46ca631c77735045e9affb18f6573cfc25aaf1d50822dffff4155adb9908befee8466e7ce31f3bad059eef0b93c72b9e158f06a87b77e168b2a67ef910fb84e5b6b17c7eeb690b873af404114a2a2be9f46e8f8e1048425c746f78fefc731c1ab83cd6d7a91fb08cebb99c9a56ae65739f31f057be9f46cce33d465c8d65f478b99604e176b6aa2a09b1537fc73a924ee431cf7d8392dc43ed6ce01a50ba7ff4fe62b53be902e03ce94f0b0e20988cb3c19d00af70bfa220601dc23d3bd6faec1de96ab650f948850246f3a8a3f75810dd8fca430b89150fa43e40aa42a8b21aac22258be0bbdc95e8f78b686e2f22f1d551e667cf2addfa3be4984208f5eceb8ffaf52c5297deae7f811f4c22b197693421a51e0e2e8356c9ad14f2b93d7b019cdc97a4d8725c600914448eac91911eb45c9eb44c352ae10d1e09bec9a80f476476dbb45110411f44644636f154f6eec5eb1629ab7d38e0b0faafe90ccf1583fb74c1172eb03d76546d99d7f9b4dfd1b81ba571050775d56ebb638056d9e2d0c5716c127e0ddef8018d47378e3c7762863ef7f87f030558f375657dea42808145802ee36c5bc16d1d97e32c4d4da1c970e9c2bbb66df29f5dea224b17b98ca9eb4703b51db5a0a8859985edde10d9ff757272825be42cc0a8109ae62c2c801a004c7db08bbad20b84195068d6c4191ba846dc1b9a7603e0c2c4b37c49d0fd1ffbde116c8a191bfb42595fc776946c8434bd0623078c6fc214f99ef9ea6ed35a5cb2e693f074136431dd27a8478c86eb3e50088e0abb26896ca5907f4b1430f8c02126ab4ab5a9b8104608f4e051702c98a216f14a207ba881de28c8540b88fac4d55fe1093dbb2a82c135f117f6875601b16692cd7d14382f926b8c8d1be349f8742e7462c78470cd062897ae19ab3ff359f9166305c51f99eeafec212adc67aec7837c15f4bea665f8f0afd5088b8bd3424b2b611da2bd47badf46609df07818b4d0934e8e951790715d7a601fa4ae010800dbbc1d00388f0861732e8c682349b0c0f49e65b407e21b0a08e9c980b70d32b47ffa798461895bc25f500ac3e4d5fb51d741e58b1f9a167bd5b9945a3ddc09dc42c67353fcb54d1319db3aa3df8c33d6eff9746dd3eb57c776d973ee434d337b9686121737d61ae79f760fe395e8e0c1f4b2bffc23fe3f628aeaba0f0abf686c981aab278e60c908d99a56376604defae8499dcb9743ec28bdacf0067557d11081b838261ef177d3cce8f8952f5aceb93ee5dec05a9b72b0570740849f14206f0f6592decae6798ef6ec2981794ead1a47d797951e8bba032fbe5e5fbc0c48a78764417561a9d163abf62d10749a9f8c0e5fe97974c43a3e22fd9b183d069094736543af9707fde8c3f3c7b70e27886391ce6a50402115338b572028b6780dafbd73c757da226163d25e60fcf33dbed867e44c71837bdcd48fa8a048a412f542044b1a57cae3f193ca693860d8c5a99ba178a2f9701aa638706080c7cdda6d30034eec565b8c9cc0a2956a98c6cde78d379d830ec1de07b796e29bd05fb3ef194f30fcf95f4a014b4648ac43335a442574d14d28bcd5cfade8b47f3a04528e3df87fc40eed310c05c72ba1084fa11f8fb00d328b4a598d2e1f308cc157ce34e372dd4a4ab4daa51fbd758a694c0b456faa04b2dfa8fb62e21578df94b8f5d7c17ccf69a7b1e78d5b855aa31ced252b4d8499dc987cb814677c6a2e1d5b0144835d35d0342391b2c9fc5675e0539b3624e8b70f0985155a0e926c89262b2a0dd9de344bbb12de55f4c2d831f8ca57ba3d7aafb0de8760ad4c2fa1dd68920c5cbb781de8f50588987d9ed8b9a5a31effdb2c7c48a326a925fca91fe34e81306ca7840bd5ed530b2d3da00b7fa47842a40cca56172c4b75e9b846e3e68b28ff9bc93b5823ed0878aedb3b3da7ace3011100281f4833bacd9e843274d8c61106431cd91683e8fbd096b0c8dee8ae9d41530e0c3af3ea547e57ce92dfc137d802ea04c069f1c7f71befb8d50398628df008960b26a1a648986d613f5575b3956c5976a3356b09810a4c6e98a1cd103d5f73bf68d0db59cf20ce28757b325444c563096dfe339d3c639d752b700bc14db2309410451bc6bb7cb7e49a24295c90a4f4942d1361d8495008e1e6c6a82cbd267a1b17a6d8884f0b3caf3d567dedff845404e6341615c74c9fd3b5d3e00f4f755dd580a402494d6241a86fd491401b118df523afcc24b24cadfc49654c1eb0cd113b1730869b3c3d72755c9449ffaaed01bcb8c0255944f86113b9ac94dc00141556b265b584924ce444eaec4baa44c4f52adff27555cda04a242ea2c3bdcf1dff2d3c2b05d4a9595ba1b2834a1315e7c06ef39013708bf2c36ef52dd5d3ac2c4ee9defa4336dfc5f1d637d300009a91ce147c742580f634c27fd45af1dcc4bec61aac8736ad200ddb153d459eb993179a5762271424842978cc607b322c03894225825b5c87dbb4de99be1c20b1f5bb5174483e64180c1c8e100a345857e695434ed0697c127aed7632bf64781a4f42efdbfef0fee4dc4bb6aea5329818334c38edfb5cdd376dedc4b68787d39b085c29912b50d5442552a62cb92041d97c954670b009fc6506502ae4988727d4fda70302c2f52611dc5874e682b6a216f0b2428a871057df407640aa4cb329d0ac730880b9908b7b4aceaa5f92edc6d362b0d4aa72f7ca1731c177aa3080f93881a6835cb1a1be1ba0c9750e2bfc10c57d91e46406eca76b4de8b2e06e076058f06c02f30c46b0af71d01560bb03729fef4c465afe1677f13172efc1b04eff5272a84e2b08d92e1a9f88179191b2842fea8b0d5b776481aa73cb297fbdc4664afede8631dababb6329cec279fcb415a1cea4b146159c24a3bfd1448a4dd15e7dd9df0614cccb864cfa7c68e9a1333e2467f9e4446b03500edbb57404a0eecd08f1247a8452c697775eb99af91c4c799861c490c2401671896b96230ec50762a6ed9d311146d9f6b5678b7ef88fb463d1299e8ad3e5c814405600265d4d10c244c1716db39659eb5f105f1a6376d9eafdb48a02d3f3c4d6e45bb207ae473c55d77313548aa64eb97a49bb58159f5fe1686bc7ad8007c93a5035804f2b05d7ea447865845c7c73f6996ee168f7958ef301bf4867a275c95d8d4c37e7f69986ce677822eb54894886f12ff924968ce47cbbcf7b25228c6ac7a30c68eaf14c9f7faf4458d6544c7564ae0909c13e0382ea518979c67dc96a73a64ef07aa354f7cb53aa5583732c54389cd7ee0dcd894b565ca96db018139a9ceb312b0d7e66775de1f9003c38b4c68210f6c3483849466794713b3c3c46be9001ddbec50c74541c8839029b8aae8912564278165c0fe124b87577cce30079f8e3f1f73d2c22b72fa98cb0baf48e27a1ea176ed20599414c4d12a3dc3e1c21d584527a4d2477c5e0b21a94d102877761815a21f829aa012f652454e14278246f284bf5ee96ccc780a986dbbd1bd150f9c564503ce8aef91b05e60e16d926fd59e0589ff5bfd2d42f9dfeaaefbd2c75f109271d1068f71c57c08f675d4d56837530ceb57f5e87294f951c481424359620220e867f95f407b2f63d28dc14dae1a5d4cc34d0f113da080207531035290ec9ef040bba745d148ba49962f854749a55e45c9788aab6fead516736ad8025a5fc63e92e4d8c69edda99e098a9785bd0ec8d7f21c024e29063abec8c5345c73a127f8cee6c020f4e5e48a2a1a0c6fd2d8b7ebfbc17e5d2e3846213f862d357b5d063cd20ac64f11fa119e2be4ecdbbb573ef290cae652d6538430ace4be6c901973c571c75d3fba6e0f7599e04da256b534dd821b4a0ac31ecf1b2177888bce6f74c796911eb660313b1bc6c741008acd0c088535da93bdc8c51a0a390a26c9c65ac70e5a7afc89b388fec086a419e9c08bbd1a5ef627f87af9ac6587a1988653fd6a2e4df44ad7fe1c44bdda46300ad05f29145283270a4504b87083d15ff538a804bc0fb3b18fc46b5d55c8c4d965a8ed80ea75980865979ce4c69e0020e78050c149ab007140e5c186525a30231dab690c92ff9c5af2141cf5811f87fd81addcc09fa12852fd50f3686df41d1c161394b00b87586a67e220c2b0b3ee2dc82f31e0ec0b0d1b31a7e6523edf4a69eeb54ca07c6d91f1ad384d18b0803169a1212643237a0a01db65fc0cea36a2b4f56192db3d1b557c56e85cc3f8fd63010ea5979358093a0842388f2f80b9da40b8f70f473ee20f44a899e13925f358303e603e6978b8073c6a5263ff649a8ec2c06fde3f988e5982168bdf7178be974766b516d312c4cbc5c3fa153c9d1b941d2c10be3fed8130ec820e785323d05e31cc68a0a5ddbe30a85a830e831e1f26a0133d6483300ffacdcbb79ab2849de617fd0f9c6029fcafa12e57bfe420010560ef8861906530e589548c69127b7322fce3bcdd899da7d1e47b7d3d0cf093db181c9c1096760976ccface6dbd19e57780666a5bd7f51364b731c5b08cc0c20c2f85f44b2118ff6dc6bb498b35b2a24c354df54bb2228430b2f43dd09675311392ab753368ef1c5932296cb7c4f7b45a5b2776012b9b52fa943b0ea6d7abe09f478cf3207b567c106a988e357705229a7ee1714373ca9f1666dca0e8bf86d70a5bc68168418d7aa561738750ca38357ed2e9c7c5b14badea0cef976453fbda87c491958a7bf9b332bfeec1bf65da27124079daadceba65fafda170a0ab00f12ca8af929c2cd95ce502a32ecfb7c0a6b7bed49c7fd0ab1b8cac78861694fd513354b6592defbcddadbbfd8cdee8e4184fd73cf9ef19f230c6e48899b91688f731dccc91ce5905971ba0779107da53723a7130fa3c984623ea27b3e7164f4409918dd16a3ec41bfb32211967b01b800634280d01aa92ed734d8f277c2031532567bf623642866da29cfafd38015e2bfb7fc6507fc6ba80182fa7af191b7ce470dc392a50219cb91ada4828180ad2d34741f83a8d1687d3b522fd53edfc122f035c689058691b8b68c28e3e2feb960cc90b5fdad2cf0063454c98056fb15f762d40ea5dd922b14222d574d4e0b87ec437e01010b8921a26bc3483357c81239004ad834996ab6e6072de1172d13b3a314f8483f731105c623213a5c561b2e2036cbedf334ed7b22f221d702a727b40c27b04162623be80905e7cc9a4d651bcc7947ad49b11b2b945ebc3c366ec451411304206741d38732f108a3d4f6c90369bc1b60122b88f935b1d74e5c7a6c501f7dc74e4030bee3e1d05af36e55dc58920df7354a602fab0d5c382c221070dfdae50918a263294749bcdd39b831e9d814e143667cdcade992ff6e6f8b5561c27448881b27fa8ffc333e1c5e62762fe753ce73f26a2d793a11c905a0a86741a82238117d246ae47f8f42bf65f3111c40222a8b89962af4259d12b6a90656c9cd752a1047a95f7614428fe5ffac7f61f567570c5462279f2180895c0c1608962c328c871488d8fcafccb37038aed4500a23396fe6cef0d42c25acfd2f2831820bb2f28367c86da23f582fdf99e80bdf05443e3cd08c54eaca4285aad8e413c69d8216bc4866384ddc42a6ab965885a083d88d21283cde1294dcae04f45487e52b9c1aea9d7cf24e8b0c5a108f09050e6e59d1410d6e7b4168ea0f7a2853c891a5c7d431b50193ad1b08ba2f69d9ac9fa57b7ddf5641de14606824d2d133d47a641d2ffda4fbb265139e28733899a45631446c5050eee5b2e8a7df90628f4334652126d874b6ed888e926d6174718dacca2a47bd9a766efc17302746d16914733c7b529a06609a1e2511a1c73cd79ca22bd62f8651d5a3f66a506accde7e704b8bf771c41e1eb04c061f364189c4b873f4e6a186c660b858102566c91e83f409ddaac4637e5e314499d009188b7b41be1394e00c7f7b3b18157e321e6525dc3d08adf567363a932577de6aad58ac56361e4c412e5214abedb7132ca68c86a5fb59e942a24b413305f8c0f6c4a0f52eb387d8fb1796a1da74240aecfba0322c880cdf72f1c39cd22c770e4cbc0b363c3c1157263f027249c500f1eb004d598da55862781a4f8122d70ddc53df28ac61da37b17d52f2b274b86d4f2ab15de37b32db7a2d97ba0d21968d9c7c0efa2315f79ce7d14a6b904446bb3ca92c827cbc4218e9099fec778799c147f6ae37083f74c5a7ce9a87885be5acf5077e3f093e6f8c24c0fe087e34af71572dad2ab3085465397cb6f0291a61f97ec23c9703b2c22d27d4b99d6c9e68f0f8740cf3a0abb434875d1111d5c7fbf86911789f053d49f3bca44652964800507de02473ce59b716257a8c059f3da51415652668b879f482db041c737ee41aaef84c3118faebcd7f2af42adb9947d13a9f568255bba055c9b7920fc636508ce79a9b98de6a05de4a6a506fb3d8b620d1002b981df8b07aafa22a099a2f84211a159374a871ca9728348ded20f3b30a49f5583d4208c42c1a9a0ccc3584b001602e2e3c47308dc1a882112e3b2cf6ae3843bcc06d6c9ab2417067ba1baafb4bb3fa623b3281504526718c7861813e1ead418eed80839790296900505adba06043d95efab3ca0a04a7e37eb7fc99c45070505a8017dac560730443f961a8d18f1de924ddab207da8a05328f7c38a45e3969e44db0c4314e0b9ce3ee404ac54b44ee800473f4b82b065f68966f982088bc9cabb83ca7803aba08e38682b20bf497c81224024f812719be280061cd0b4d15cc1c74da8362959fc19e7d01fe12fb02196c6d072622ba9d838f115397e0163f7ff490723bdd74591f12513a39e9995217def063d14a2b8ac78955c0e27c078a4a4e09414d39ed9096751032ea0341139d1302e1c0f1c55c3cea4bc1e2d0711d2c8a218305be3239d29472981f05faeafad98459f55cf4f2ac700db31cc5dd6cd6a0dd3b2650bea8222fad010786e4a8e2bfec7c595bbedfbed7561598294e2dfe452adfa908884c8b13cb5ebfdae5df7c0faab7ad5bacec19b54e84967f2a09d490cb4892aeedbac1603d9beb3b30bbe46c5728e26968fbd36be8531a91164c8edf66d29a97c267f1c241eafd97f1fb5105ad589e4fed285963dc09a45857ed6beb27392b040d1680ca457e0790fa0e0891481df039a147c10946272d7e48ffe9cef35530a2ccc969b5106d90d9d6abb0690b129cb756f8b91b3fdbaf9c2da6add27c41b20668813cd288da71e1b9335e638ac34ce12cba045d40280e6872df8a8f7046ad982c7d54375f3184ce14ddeb07029144e719917ce1266838053c6ee66a1814de84310b64ead62a96be17a0e7a10af48b2133012d920f36d652eb2faae56e715f1f0ab5c3b2d482371fbea69c19b9993444754d2594ca29934670408c81bb27115f478e81f8724eb999067937b5915555485650ed5ed7ab2576e97e138ee7f164411cfb50fbc2fd9480edbc6fc1175a2c5b7eb78a6d98a768332ab1da19e0041170097b2d9082195386c13893cdc9149614e29d3b7d9cd11c583d1669b0460d594fd919bd425616b11d283671b195ec69a603401df79db7732c04eb8599fed9dc5b62ec2d5c006b1f1f2d83dadfe4a7323b40093b9246717752cb7e65e90f62243747fe2987e856b7daeab152fc039fb6f26564833e6abd83a76a60ebeccf0d0bd6261e5a20139efd21ffdab2408860de85f0916287044d259a53f5e18efd01a2fb25d5078a44c0245000204e33e195703b8701e7bcfee2071e242ffc5fef1b18a64b6846569ac04a4347ec80fc18b374b720e3efd919dd78c2e8fcaf7e3182b4d8a7ab3167fdfa38af4d8b65bad2f82a8a60f8e9da2553f9e67e23572bcc447c072998d2118fa4787f5d65376b777dd27f698787bd990926284850ff3c5dd7657d186d4e4d3b2e6691da462a84a6a2c696c07d7e98f95629937534d08a6cf0652ad72ba6b64158e18549e183c274916d3c9dbb488b8ef5dc44b982ee0457b640f598c4065cef04ecd8cff4f9c048155231c75625a605029e381fd70b720abaf3748428bddec56d56d69e6d8906d32f95473717b571d0efbbbc53a63cffcc2e787f52d5b7b9d9b72ccc46766ca8dfa0cba132132def3b12c7132809df225714d2b5397be90865b2187157faf65fc07d9e7e7b402de36b258c51aa819da95529186bcacbc452977d3739e71f8370e65732031ee68ef6d6e6d74616df4e36a08a23ff30ac03536c2c60124438bf34a2826387723ae592f7f568f24777967fb9af202da9925a89fb58006e3db283dbe8fe38c201b9b421da8b3c9e9055c98bb2b4e9df5aaff21b4632e1dfb036558fb4a2b4669a3bf56cf60bb5c77b3aa117a4a15a518d13239e2206d09a4b53840dffe00091520df8d7e75dd39295d95882b21c454b4e209bd42b162830e8bf7f96548321abd195d698f371f1ff3ede47c121524228726f1c78a2a6e6b62316f5f400d6ca85433d2264441645cba220c317a7e9f6bdad69e29860da2d9ce801582d9371538fb0754989501bd20bd5510cdce6261cd1bf951f03fffaa11a541825e982f3d419bfc6affec3d64c9622bd93dab1e80028f7d21903a0ba14deca99079fcfee047be1b454fac45ab618ed190391cd69ba0f06d16964281e838874d30d674a05028418f28f6d4358e0ad2b3e187691c83ff119bcad2168130ac179160ffb4fafdd42a85ece6e0ed3836f8284c9fcc7badf5cfa08b6f8dd8c7de427e01671dcb9dfdfeb88efc756fad02b753f485d27fd0f10750384742e490811a0df075d8ddfb9f89b91db84317fa6a9f2f3311b441bb90d033862b2b0c4c2d4225b3a8e506f02d9a6809916169f40bdb1a2d3797a945a2e3035531ebaf0a4e5a22ff80ccda01c75bc80cb51a443ccd8118cba8f907997d1b6838c4381102cb7e118d85eb88742ba2d4a0f95500c28f3126532fe8d83e774f707a7ba15c4d572421e531e1ba9a48e30aa58f2df2481f4681d4e7a91a8060259610d72f3f492b93d817aa1931d83c134cdbc2b7cc210b0d8c59b39a1189c11abbf2fca25d2e4c9d7d5dc0c592970536423940d38adcedefe4dfb82eac5dfddbfccb4b87a9324ac25c5e1ee053662b7b8ff77860767065449710091edc4d29ddab46b14d2a6adc2941b3cfbf00da915e2fd80302fbe13439097f9c1df4fee84031a859817fb5bed1c0c059784b4dbbad6a6999763b10d92c422db5985b15f7371fc32185a012f832608ba05c8148322a76ecb4a58b305f8ecd5d1b754ae39015f3113d2217d24655704c9ab250d70d087e61283ac9556943440e8b9124e5528f6b1a95f9c8561254ad127131b99de066efef0d6e158e2b43eb83ed34efd80a36722e349d7851c3b4770ca23e7ecbd013ac9009c7846824896987a21aad29f745b60b826f636d467fd9e0775f4eaa3958b8ec6cdb55f3d1578625982c49e87ae04ac8a0de6bab2d6675200e91757c2bb587819e55c2d33ccfd11ea3e2f1ca580c0fe9156e49430c32c981fc9701e50e40f282de6968b85a51e2ad833d8a66dd101c8cc7d4f161d4e9b811329462e4c6ae3a2557d76fb94aaf870ff7dc450c59341956d140c72e1f0f39fac1a0561c5a5f5edfbe8dea88096c18f88fa291ab005ef4b2216aa29458a68f41baade82ee2b2a82dfef8b9e49f62a5649a069f27db03f547b51df5624b2d3bf161ac536a895251b01c5bc9c8ad48eaf58060d61158f9ace219d50c2ca508a2d24355a03a956a402a454aa0e531e032aab8939b72b92547547e51f27b532f8ea8a0520746e50db58a8112f8e2ac5e1459eed3ae78a16e36e939db1bc772f1b8ffe340df329d2dc963979daa1385b7f8eaf73eb4272ccda1860647b6a72e954feef0220216ed1ccce8e9bc69457002a777af9f22ad7bda26631d7eea35819c02ed20440d77cf196e08df6a3f2300efe61f79ed558f064d3f0b9321395a27e82b79f57306f9eb39d0af7c76e422602881804397bf92d2d44a7bda1f4ba809271d44bb70ae909de3994fdbe8b545444d99c14749e5487d8b050bb470e6075685859a74b31649786abc1ed2b6d4a391a6530c41bd959f0b28b98c60d631296d7e781992ea2e1dec56dd8effa14451979a531086b8a4c5fee084ab3d362512bf73c006bf11999c04a32c8f4eeca2ec226beaa6a6836a4d1df9d08f6bb0e674b95da4a1440f3d638a3455745610df21123aec08109e92333edf3a5ffdbd8d4b8ba265880616b8cdfb851dad088077c993e09c6a95cb2ac3ae40b705b141d088436924f5573beb879f80216e1141f172d22d4c1e4ea62a490644357b1d64773ec29d9ef171c8cbb37b23f265057b15220aa045525ebb81e9f744b2cb244bea8edfbf125fdc825232d730473366749b317f2387dc0274f1db006575d6b99f6c8aacb091e4fc25e3b773f9440751a52909a9949ae55ba77b6d4d42c9d0981bc22ed5e9b2ffa44230025ae146493177d735f1d22b9957ee5bb1f403b06e97018836f367281df1b48f3035563564c26d9b557e0547e2095fa815435778fd84c691f8f11d20b0e5081b8fd003146b9c759ce04f997e6b777e3d398be554d060d6aa4b37131692530c0de72f01002fc0154eb6c36e215a2b9ba11d78a68df73fcde1f7da2bb35c9318e8888abf3679812dfada81adf2a1b0acf9b7d6e473ade6bf448e515c282d6422ca9c4110020fce98f03311db4bd3e4148377e279ab0726ec545387e8ce818f0851ee904b87919cce6ae9b8772003e695dffeb83346f239bf4032c4a0ca4b165972ccee7073375c269b1f3892ba1a688052879b2972feb050b168257f6d7312f7430bf385664a798c70028f8e8d94ed3f18f30a09b56d608a366511e23401846c0aff18fe00902be637f440d0f704f10bc1f0c65df0ec7b99d0d12bef4a071e141b4f108f2f4d4b6206d81ae9a765b4c82f284132dc5abcf73ea1952007996a811fb5b4b6457023abde199091af2064132e320431942fd952c3056498d64fa05f51f22bf7316e9386603e4ca7219c2994f7b9845f076c62216b2c50604c9eb1e17c87927dc2893cd0b949164b79d9d61fd0be48d688196eee8b37907d00266c83d60b634e77b260b5fbefc8a0cb8442b1e118049424cb87af41f1c72045d7d07a20520ec027b11866771f705a6730e1e43751b74a880cf76bd4296339d0100ab47eea986981ff52e25b2eaa703764946fbd503f59667f74caefe5df9b697c35ee53c31a5007f6ff02b369c32f376cd79eb8638643e1505d9f516f0f08a10dc31d2bf0406f717a40658f9d85f8a74821239cc5c94368380cd22104fe216c1986c8cfc41e16692d7d038fb162a10492272c2a6d49dc8c2b8f0b2502dde31f63f0d5fb6166c86b0fc4b2208aad8fedd0e63532cdd22c64062926946040ba2d08a7492471c78a65a31fc0f14133c208f19214117ddcbcf057058942fbcbc4161e03e7322d4dfccb0aaf22b5978e5d272c24fa137a7254519f0edb52c4dd60e87b3a46608262dd904a925f1756d375addd971cb4f2a1c6a4a7c12daa2e88ee9fa0143f685d8ef0250dd1d607e87875c94360078bd7101c3b4a12c9278927a74848eda0ab9372818e7204fc10fdb7cc71c325af0cc343ecd59f3bd1a13152fb7277fbba9fe19c2f73f1b933e903102905149a4bc2a788436c2b70507fde4d05d1bc7fe754b9d37cd5d281030333aa96fb66d55aecb0cbdd3f7da1b21a365b6fb9d3bd64176dd31f02a3a4a206cf4007fa9c9679ba1a8568fb555e0a33e34b50f79b10d7be6cc7410c664199cd95bae9a45e56578c940c1b1dbd09f80caf048ffb6356e715935457c5ae1aeafcc326566f9de4cc490fe7de954d81056481e01d599199c571d3150e9c8126713dae268046af531b95619d89193a60b2d8ab5805b2aec567736760ddca112cbaa16e2d4759e4cffa8f665bf477d53d1964f6fcce8530092a21b9d772f013dc3aa6a0206f39f7baaaa9cd2b65956de2521a6a8be45c43d0db52ecddb49922b660b5604a1cd354cd91b836d4d65f58089b317bb44d02a9f14205b08b76188f868136d1b23a506fe4f2056489b403560d70052ada25d43b9563294bcc4abeb1a60c9abc093ade24904871266a0ec06e49b03c1319d7fb77a0815e7dfcd18a41f980105dd181baacd302bfdda9c7f0300084e40a23b1da504a871aeb02f73cd97ac9c7d95204101360c8ff53e2a8764c9cadbd090ad1adeb896f3ef8fc7129e5a2317068deb551efa5d2bf42217b55880c45009260c53f781af5b7f8e64a60eecf0db05c6892c8170089045591fc704d5f16f04dbfe4cd96a197352be4330b0be58e54652717f30a42eb86d5bac1742816a00473cce686b577db435f7585cfb5d466ba0477a75193da25fb4f50339ffeeebbdb9689192bdcaa6ddfcc73edaf9775ae78bb5ee6312d8bf95f90ecebfd5e69ee8ac9cb46e0eae81e67f958d9a1081136dca708f48c3cd561a0c5ccb01841747c4bcc58bad051054c5b03ffb01493d39ce3b6e2238ff16b5998ac60d1e461f2c37d41562b52b55fe72feed90c5519f284f863096b14ed4fdabc4275db3d389d30607a634a8cc1944cdd6e1fa911ea51f9ee97b54f3c7bab1dad92986554e8ab00c5b715c14253ca2b1af9ec9f910befe8163d522ef354f7dfb3bdf13025f5be44cd3f2e2843c53ad033c809f382f06dcc04c1e3395008e3d2593b9f16f7febb43bb7be8ee6cc7db664a6d6c288dbdfb79513b868d7866dfcb85aaf81d4d376065360a214f6cada5885b0f90e547f36350c20d8970680177930925522389cad097cd5c3b3eea7c73310712723889a4330fb7c17c069f39e600e0a26a0bb9a314821660aac6318bf907d6a3462e03bfad9540431962327bc34e4e7e36b017cdcf07f1663a89cb790a4fac4249f7ee4b8ce74b428c75dce83b65d8b3aecf96b50942ac0ca0c10fb1f83a8d25647a44b3e87870c9e97a16fbb4a4b7f55cd8cd493d952328be1f32f03ea1952b6a3270cd9ab0262904f02850e1c48daa14856e448205107e4f0b4036d3ec66ddce3cfa6d3cf339f980322210a43db702445fb8a4ac600b815f80fc11d951c7f50c218afce8573221f27062d3bc48cd9df9a76cdc2afaea9e7869831841bc3cc6fbdd93299e98a6729151657b83e6f62875e571d98a4b3df092d01dc80b64777cd0c8e119bc30487617fbbbc519250aae3e74ecd785a87605ff383ee08314218cd8e8d3c8619d6d0b25b08b0f7f78ac4108f59d452879e949a8290794dbe5390d15a8204d0f58bd450f30348b0914b78c71a4fd2ffa14c489a2f84bd92882625b66fa822540ea2c46964c857bca71101327f6b287461e0e523ab4e3298c52ab66a655f3283b16d5d613edc00adac5c64c54939f1304cda1257093071d2c378cedf910dd05260d4788cb129442005c27dad3526a7e3b39a7d2c6c78fd6eefe48d61d7232d0faef1ce7faf1d81b46c6b9ab63a7f5cb4c798e772c49dd557a1d224485286fdf2839b5eb50fbb5f8b60d090917e63b4d451924606885fba6c736bf2ca686fa384c427a0013286beb4c47c21ca6c525d1ae9107b7599cbd77b8ac45daf7ebc8ff9d7512cdec520cc3e38072d253ca9496dd868c95c1de7bcb2fef3bd765c239b84b42ef207bc75b62cd67781b7406e107bc6a6ac3650db599ea0838a17458810cd818b5a64137fa27afc622f06b188492cb114ab58c42c76318b5d6cc4109b18c428a662885d8cc514733188254662f9a0faa036bc2e2ec1cef97f3134cb59c6fe9dc2ff40e18a8246adb35705cfe3edf903856743f7c4439de7b9f9c449c56bb079eaace771dc727253f038da9c3f56793ee84e3a54799c9a4f9fd5bc0c5aa78e5a1ec6eda777051e63cdd94385e7e3fee4838a5730ebd47503df390ecb382ec1f962b2aeca84bde8f8aa162e8e5a87cd1eea8d975f3a26db7e6d87041da72815c40b3e1a71f838b31e40e51f49555ac5a164e4a22d9cf621658987b8f4650154c30ba4333cdd4ab8986c6c3d9bd20e9399329afeded505233b75e80f480ddd09ed2d8f9bc172fef3a7f894eb6a7f5fdfc96b1e5175fa3be79f7a85ab6a6ef9eecb275dd5ab68bbfe8bf1566fe9c89f015fdd25d1b040758a5a70e9c7deaedb79c0d002d2734360ce82418f1e7e457f6d7ae12502bbe999d564a520863d10c33a1d80194902e2629c72533f21c4c74818744a1190f9bdecda54bb784950b7d1c2a9a9045672314686e6143ac8850df6d895117ab103e5d57411292316b153d4b2fc9ec906870b2e4089ab15c1dc839562ca68de93ca1a5728985497d21586cb19edf551d354ec1293db0e5a32e73173801c9c28988209caa57f27576eb651c4c2f4e010282096fe0a63708f69a3f4a7b692a9fc3aa204faa4e051ad85dafbc563bfde7a11a4e7070756c638773a9ba8ae13036b61f6002f6c551e28b67703dc033867b0804f22d60be3af4c42635009c2f59d48de9b6e68692b0b838c2ce52c70d7cf4f16c695b3f576732876d8ab0c90dfed4f09dd79b3d28b5208d67c614cf83d46fb6ebb84a599c8431b181e06ad6ceb7f8e0ffec11f463e48276a618854f5342a8eee21e42ea568630a56e384003dcd006ab40f957585528357f434526e81355c1f78f8d3613f0d2c452121ae9ebed33d41f35cab4081531eb337faad9e569ed7ab6cca69c6e6690a28437fed56e51ae2f5e1a3fff5b49e119cab8197d476906169743df3d2c85037105316e55220531474bfb0d27a9a7e74535895f30a3605708e12a45a5c608a99441e198193c3d448a3d713e972d1aa98375167abe99b2c33a65c65f16fb62a188b9f6e79a80ee63197f93593b22eee50b3e97c092de008e2960ac6da655558a3194982bf53920174ca53615a3cdcad745310854554c4d9b729f6a5b78f4c79ff2c435211a0310f16c06b2af31d1f2ed06f5d76b1a54f215cdb4dc7c91d2873d690ca928dd865627c307cc4384d50d41c0a8e16421644f13dc163dc23f8843718361a6d411be31d8f781428c637dcd9a99865634f07be508abdd2f51ed85d69a688be5d85167f01c7a6a76b431e611ea646261e5cd05eb6730a85f09ebae16c7e03b6727850265e150a6abfc092a1023301c3c03d2caccfbfd58e6f3c7c00459af06ec694a2cdc843b597293b5de503fa919671dc3af8cb944daffaf94cd6b896840fb92dec6a598c375a7596b4bbea60ed9f79b5d8f2e76d775c31ad22dbef348572da344f76e969c85757b71dfaceb615e56ddb122f1cd9f82a6c54a278c00799b91e83e10425d5f19e7b1e159732d72ae72917e66d8a0ee66c0ada6b6b7e922375ed4d5fb66e82ba1501816ad6ad96cd723d708800c19600861f4d1ebd7e35ac8e6a89b992b4081eec28c668723e148c387735caad5bb76b8251c7d5e2b568ab44871f61f0359094efefe76e1ee50d17978ac0687aca595c73926dc39ce7abeb8341d974d45b6e21ff4478b6c2afa2c2f046e363138627a889314dcc8bd3c0634bbec5c15a1c6b83fa62d559c06f3113700b7253d96429bcf3f1584aab5be9cf596603636a91fbc1caec3bcffbf636aa8b4efacd7a68629e33de05bcbc484b660a31de6ba371423fec87eb16091c9a817103e71fce01707274bc1c5d83ecca0f66ee1ebc4aa35addee3895c058464194845d1dafcb0c459e41c327331471cb2c2c701c6d08d8cef4dc8912d717bc29b5a93d22009a203520fc2cd30c781fa7cc55ca2a30b39e7694e681f32c603ed50e932ad5b66920a485ac438cc369e6558ff914efcdc090fd8594214b9f3e652fd15254421c558efeb45568059fad1a16a815642a04a3e02aabf601c2d552d4091db70fa17d5c2b34a09e653bb759eb4ef19ab34cc34f446fa1bcbb5e5b0af34526d03525308493f37343f74a41b32ccdf406758e8290620f949966fb7f3aa909d4166858f50355b0dc034f20f74ae00b2772d7a4ecbaf294ca3a843ef432a899c17d766e379d1f8826684bfb993782166505e5fb2178a5888b0806974aefa33fb816cdfee28e99502a095fc6203b905bea6e79dd83d27197236d2842282f458d5a99763ba828a9d1a18bbc9a3c6c1fc29e93866e16015c2f66af753f47e9f8282b7405d177708b9b5f35cdb38783239668b79916104545e7e94a0516b12320451022ec1a6d734bfa0d2e295734d5693429d8ae316ac7f487e65b4096feee83a6a385f35dfb44cab51bae73d82db26a01d4bebe5ae283f5ba9898e52b83944c8eccccf1cd80c57471e690642d59a32780d5386ecb222697d6ac932786472acdb66aca4534386ab997080e23898a3c27e5dc566da879a0a9360d1b3c9fb8759ee801c5e4f15c5b50dc628cb791187e6288894b987ef2f101f54a9c915576209afca34f10ea5ae183525dc0146b193e031e4490acff408fcc3651e7117c3eef2ff3aac8f2dc8c7be5c02bc68f2634f143603893d9d5ddc869e89b76add8067f9762fb7fd8553bb56433851755cc75788acda8dda23ba7e6f1c69a60b6edb932cff09cdf411f45bd718c3ad034ec7a7dd0ba0c09e7d1b15a65e5e0e12af7bca2f0533cb10c00663bd80887eed81f7a0d1ffb6f8da899d65d62779932fa20535a20a688d20071b2a241f642a0709a77a875d6f0cd161bc583413de01325bca7ae0407f4006f5b57ae037fcc6ad0ceee78041b3ead096342074f0c36292cf74875dd0487164e4aef8e7a30e4fb1b311b8ab5433e05c7814f59f7140286fc13b63b2e6e5c71720b3c278d67fa0d59d2667b7ae2678bb70d651b7b0e79b5ae61b3703c27341885c7ca07e0a726f66c6263e4fd504a1b1b04bba7b8a9765fd4cb1b9edac491fe75d3cb13f287273c612d62037ece9f92a94d6efb73d6a74d8b878c36192342b40220ee292dd88d3da049616162429a45871a66e22186f2547f54d7374c3a39829889c0e84911a6e634787e94f92d7086319197fe8d021cbd8dc54829be543948cbe2b8aacec34202c541e2854a4b6a30074bde60b1313e65362908f729efba3dc3d92c714ccfb2a2131f1a9039a6d93946a4b04c24e7a8c5dade7cac4503c965d02476816d559c31373000786ad66e8695f53fb483607b91caaf4b169c6df68d6d8ba3b039132b5188479ef17c16d0deea0acb4a7f961546d801fe6295e069a96e34b9bebe6fa91266ada1fa212ead33b1001f5013249bb947a429f68e1213c3e1c85029207415b75db32bb1842fdd768eac568322a691edc48c728763b9fc7a17c5f71f48d9c669c648284e6df56aa47bd84b712297e0342ebdd31d07484b5e716474a71a064fb838bd8dd5391d30e1a537c1445246f74d4b92eedc2990b8c40ea10a857777a08469b9c8fd8b256a4d6da9827d13a11bbcd49565658e08558db8811474c0c086bd1e8a25c100f51c1ce9dc0898285ca6478d56e734a8023063239f4a30645ae0aba737fa5186d9cdb2580cc54bc20058d276dd099e59c904ffceb2dd13f8c7682b62f9e4aeacb1d434b22762707683a50d46715b63035284f337c0bcdca6b13cd4b943d24cfaab738de42092c089519287fea91fb40d8223b7116a4a0a2080bdd7dbb2f4eedede146444ac266ea2df7aadd47c7fa3ad9b9832fdc966710417ad6028bb24ceca791ff22ef5e71c57f98a2aa8a20a6b8ae88881f85f489eafabefa7c901f5910e958711cef1c78742a288e9814b8e87f0a46e45ed94616c4a0e14b5f1857818b959ba3aa0ad396a551c9e86bd385413de9a165989cde21bc5263cffa6f2db55f99d18ab9f78ad23455727ea3ffe282753397ffbcb681e103d1cdcfd5b0a6e9cbaa1bb35a14084869ab427dde546b793552df0d217a45c6e885b9cd344b972910370c6130b7bdbfab1ee51af35e68f54207c27dbe106f527d660db7abdcf05c653dcf5754f0ceda6c2f6a530684de50fb8fdb27058db71b3495b7fa061a22da7c68d02c004ce048e861253a0537156899625d67685cee75f2856bba9f8540c62e01c3ec1f5f927527d639330bd65485abb652a14aed4c6d019e4497172183ce7196056f4f98f7ea348cca50766cef58da64849e0cc30249c5192a8ce86df5641e5b1bbfb5ae7d60f5962c1f5d08a38f9e519895633c129fdb9313a46c01b7b018a2eb0461d5d0ea377cc922d56ca7698016c92f2ab43a74cc6cf49cb8efa4ef94746ca4cf543f49ed0522498177aac8e9a43e330b2fd2a4ba5fc201f576e6388e055f20c722a7659dcc29f5052795aee158b618ddf62ab74d0c5cd1320013f4d4ee186ef20852a0d6056111cff4c4eb9a8238ca97092cd2e65fb265335d1001e91ec5b456665a93fa852205be7a472f0932e199794bf2d0249a6ea49a14aac1df147ff14713d02373231c21bb9d2bf3a48a9d3942c81884bccfe2057a338c869b917adf4d4af062665a182966453cac1a89daba2e2eec89771621df36daa7e2167eca18fbda0d98cbb51e6bf0721e353fe3dfd194cd2c538c1ae3d39f22c089e96423cc5ce829a7c63d3ba68371cec95333f25d44d0dbc0e9cd950c7a140090c04599c2faf5e139df5f699a035b86e2f19840fbfc8dc6e139fa072574bca5c8291615e1b515670880bbf72a8e1a36a97772a6a090a8608bc520df35f6c7f76cc8576de4d452d8b528be9589a82769df80584939883c4dced76abf6f8e932f0c0448b65eb0207d1603b09e36129f2e10be0e41466b75a4b8328a6eea632670f7a35aedf3e300957e8da8b410c98fde0d1dc43e3aa08269b33320e694b4f25eca1b8024d6278fc6cf4aca0b53d07302c3f87d0a0a1d268585b41fcf2dfe033d19c3fd25ab9170a784739de3eff5bcbd4818bce63116a98e636f5bc6e2aae8bedcde5bce35c0fcbfd535591f0102964b91d79206005587ea61ca1d5cff8f534946364d7735171aa0bd9fcc951457791bdee3c80eb4a30bd1ebdbc12ee32c0dc2a37d23ecc21f94276e219b22a634d571eab448a59078dfa105e0ad08aad2aff3bd94fba4cbf8cd4ed81057ef11609048312e090fd9402579ef57494cc29091d810129afa4a302cc855325ce83f940dac4ae195d849d00df031cd4459885e3ce48b8250e18c441b3366639939f6901358c4ce274165e9403512220be273320ad468c087c91b406114219f00a1d1d5257e4444304aa0b8fb2708c43c0133134880d9604a017e83b4400ced98bb4449fb5ad1b80fa8138814cde6c07e67c834e1f228c4e846b514c59990b59edb4cc6a48c1e7aeeff1a5cb1962fc47f8d23e58b4222dd74b1bb346a5c5e7fac800b9ae5172cb754e331e704b7ea4d134a8be13c5332742ce79f47f21e15583e70cdb268cc0bf29b4a3220acf9ccf6d3712430a34b54f1968d5bd386e5a75964b9945cd3cfb89ef4b3e743e669bc07a61965eb3f8261043877dcde449358519d90e0733bccc8cde9098ebe03e6e0b1a41bb028047b3e9868e4c0b448b2db4763be205d89f95e2bf9650c5fc17c825ac12c319b537e83fa3805363d9b47c619518ca75d91256cdc4afd8cb316da1208b35b61dbf6f89eac053a833bee37bde98f6533eadcbc8351d893e11c85e32781ee26ed5fe6d823fb87a21274bf199f1520208209374185402d5182b2a81a9a271588e2eb8173e2ef03f96db2610503511db9757f6c07a5b0ca3862ff5202f6484eef6f4c716a85e839b02b11775964babf2fe5e8bae8cb38c91bfb487f8ca6bf34d63b1090f02cd98cdee190fe884df4fde817ad8c68cb069ed3c708e09b337b884b4c2c9157e24be6c3e502e7172c7a4ba8fb302f36bd11d8244650e1bef94d7be548dbd59ccc55eb2f6d40b2ea3390b9d33d8d9184dba8e9b0a5050555964e88d304010c6a35d2aa2e6f01a94558c75592b907fc6f82c9c04a1aa71d2bb6e4c8066db22ace1df8d14304a3509809a5efd5466fc0664106f1e911d6204eecfe18a44b7f6a1fc0014b6af3f01ed6e36e8dfde4a52189262090828c08e2c953994d9bacd5d8c134f944903af592fb94cd6540b0e3dc040c6e675125156c3215f6074dd730eab6b1ea9e238b328a2f28d336675f95f8bc0586f8315b32bcd8806ac66af669dec8c8727577a93af0c4f482055913c7f2bf4ac85763482a11dd59255a67fe0b8fcb9a0e451922396c21305adae3a8ca08d9de20e75b5563ed1146e78ccc7f902c541ceb382d045faf7c301da460333b8ccd077976cf59aed8ae75f8d8b8c0230ae6233708f6d03a0d2e95ca77d8614018f9eefa54f39bab0c73b979a08579ca1a04921b61e566773b43f70894ef91cdd27000f7ca1078ac3490222ca4f265ebaafed9d05c1d8bd406cc37159477c4ccec90e76cc6891c9e004e3af655f4a2a2328528098549e043d168c46b743ece8e94ec7797cd32bb61855a9f9261240dbafde331117037c88e4923b4f101c4393b11c5183e75ae23c9985cab1c320023c14e837e6ec5ba907931f91c528a1ceaf1f15e0450a9f1887f3e6f05161d97306e1e3fd77a012ecd025c77c23f9918563f1765007b3deb4a3808462b458406f1b182a2f168b30a8e4d0985219a927c97ae89fe29dc9f9f145b6c51539c815c98d557cde01d5b1a55fd41664fa9ef4f347d570343053045842c028bb3c2257bd0d888fc099109d3f8173c0dbf0c2a63f54a3a08861960603d22db0e9d547f9656b66ad7002cc40ebbeb4a897aabc17711074ac74b6c2a39cc19cfabe474785d0db0befd8b6301ddbb8b225e10b851cb170558361223f95cb1a06a001e0710e734b2d33618ad3fb50a00e323859f3b3f3d39acb2fa69e9fa20498601c41d3eccd79a9184285144321db3c472655c1b16430ac7f3f477348310d40592707ab5362ca77bfc8e8e0240938261dea5b51e1936be86d15ec546b6741bb02a7f2c02f84e42211f99a11b2fb24e6afa348e00bbba1a5c67644442b83437a08dc0cea55732e86409e9d0a00ecb8e63d5a6b41ae8b4c4a387cc069eb459065fe3a0ddc27ce177f30c35c58893855037ac46e81e69f64d65036aea0589f112d5df7309a736091e436c8c436ab7d78ccea01147bef111e8f711d5108776c32cff83587533b619c3ea38bcc5be221950b5e364c970fbfaa1aa774d6b710b8567de204d00b6db2c250ba75cdc61efa2c9851ffd3a83f2c4e99b751b9f5582b2f18ca3f4ccacdf93cf8bafc03f47365becaa738534c1fd2409ba614250c600f67e9c5fcde4a71f5198e273641945d96afdf4efc8cbcaefe62c8237931987bde611ac01c8cdb89c603cbff4728e37c528984041095560aceb56883624745101e72840ddb48c2b500800878a89a7007ea2b0c4056c8d8a16d41d4383b7200d78abfb175b1ce373163dc2fd49b86c7a38f9725000122b3534b6177d489e4476c3594abf088d5ebe3f1820cb135e60dc106dc381270bf225e6d26271a324cfc02a6b9a385c719cd0751f4b68a70a37ff43d06f2d53d0f8204676f433073e5351102c1ae50a5064f9d747d0b2414a0abca0eaeaa96e475925a0b22bc3e12036032166af1591d510be94456b311640681c48e2bb4aa16584da403397f658ba6a188e5bde202a3040c78123b96b433d88622d5dbb4050d8a7afd91b71a1ecca1c5b507006c4c585116c5f0f915ee5ac0b33da68140657e665a15b13d80358b5a323d09abd59546502421456b8672739de6554fda8d9ba3c8bbfd2992ffb5080ed37d74f82ca8a83479ac913f03656736567d73648a62a09dd8fb20c97549567ec652c4d978419246431e4c862c56f89374b47092584b4933b9e3a37653df8356118214e45d727911859a1666709a0a866768a919c6b7f9d14be9f1fcd4c165521956dd5c7aee11115d513bbb2d68425aceb6594a777fafe735b5706232990087a2f13ac3bccab356c287908da53faab829b2f5e48cc0cab976191012bc55cced1efe80d6ff07f7b56df8510237193c6c17c4a4fcad4f2b624332f8a2dde1e45ffed36d9a3243c9c2ca38828763d9c41e9b3763cbe522722bcda31dc4ca155f37875e13a1cb33aeb442521640f9cee068cf57ac507710664cebf527c3e5a36ebb929cbeecfd1c5871a78e56f2bad4869a4968da52a25c5819b4f46da82124888b7c03b6f8e40f5c696ca8b9c4bee281f43e2e789927277198d4239f5457316a0c69afeaa165aaff562622ec08de2a3d7362aadffafbef4b5056defba6b9ec64dc45b9859c150e5a20eefcd5765a235a15fdb25b1a25610c9e0a819857cb43a8de43fae5a0cb4dbea90d153f6817e336ae04b8980cc3a49fb30794a9261ea0018bc5996e0ed0c2d076ed98522898729c89e6c7e6bb63671ad847ff5e67206908093cd1f6d81a944563609aa2a5d7ddb55652ec2024d58e6a18ed0cc847cb950b434cdd1f552c03b26a106a061c358e241606c9111a2fb54f605a3899b05ebcc01970a8b659ce10e19edaca1d904122570ceddcdfd80ce805751e9c40e314106dae6dcfc99ba2e509998d5a3b3474c4d95a049db4f2003decc7d80469e2625e7a59e7c1211f4a1b9c7facb2655825ec6a5ce29e25d84dc3fd8560efc93e256e0118352eea96ddc250112353794ff03d72eb79f96753f073ad48e4291e620389cdd3a1b00d116027b8142218d2184e3703346e641e3afa9e52034d035467e5cd36bdd511bc663fba7422ad34a922622db258e1b0ff213bbebbdea14252699a3e1bd4d9f0cd080860c75f430fb523e83cb0913f9408868a4292878fb39a25ff75b2a1e1220d422abd9a64c3732fe8af434a560b295c6d35212641c66b93b7abdecde36fe941dd080287300522ba6f1b75be209bf5c9ee5153370ad5206b9bdc73324b2f05dfda2c3d1cd3e15099ba148184c4a69c1aeb0f3e2bb9e4d17daebccf99e6300a0197a6acbd561df94dad042ec887f9811623bf70b00fd4436794989e1e79a4d413f215fe447090efc2851fc48fd06f279a8701ed45c3b57e5fcce66fd6d95479503ab60d5bb67f28db5037abc3d0973f9345425d11ccaf14e2c27d42265f8c40b57f9ca88d4f4f500071117daa5d92172e6df97cb52b68a58e0af66689a4298baa1eebe79b714809edc426bf93cfad18deaf5c79dd20c3d2506bb01952cc9f6e85cb93c1233e0db9069872b8adb609f4c8b0d211416436677a789b9c58650cabe94075d8f77cd998964fb15cd002fd8cfd9d25a003951aae13f41cb69d533cb0a048ed8b9bacaaa2ff941af186a61d741b356bc738898229ac56c6543c4640cdb4c069ae31a2457c750e8f9a6f280fd0a1f176b20f2e8e3f399648c66f1457b7f7f634b2b26dfc931ed80f53061d9a50dfb3f2f4aa2a5e720d1786b7805ef5b467f5c16ecab2aad4bd77c82e25d7586999633dddefd1cffd01736e88473c5b6f1099574538d5a7738d6b1cc304539dc008a6ad76e246a951bd86a88d0d32bd6c1c5310a29212f7e11ca1391ab441ae5469bbac713a5065862067fe697b15764acfdd19fb4389548aefc457f27032c6984834cfa2e9d706f6258d474d725a20f22a864f49cdbad164112d7dd79af522e6197a8d1a9e0a4816ecedf400405a656a8d6fc6932ec1f88329d51afa66ac24aef5cf9e61340f4706d8204b2846db1b73d1ea0e03b7e4a5ae3479a0aa03d7d0adc3cb2bfe78148c2f324e5310fc32167f10512a4e3e6f4ed4432362957838a9f14d74cc98b4a1681f98c276618492c310f2291e2b458f159fab3f3833ae869fbe91b39985403f86ab1d9220ab6b85caa6f2650f49c6735f560bab920dcfd2646d83475eb3e077221100c84d6790786f6a21228ed03f12cd977cfc3f9248b53a155a3886954bb0aa03d34d92e26bd235194bba6280e3a7f3484cc2841e27a2542942021569acd84d7a5d418fae89fe68f88256014c5e049e4cc4770e56105887dc1c7a86ca1fe539f5efb0121e47b58385cb3f3cbfbc4abbdbc4e91c0820ff610f2902ff188dac89eaea2d7a31c3ce29b909c204735c736872cedd879806a2bf27e9a3a41ae7caed4f90f5f6b6d1922d6592295d0ef00d000fa74725f1bebbfe8f85512cd15bb74d3a78e4e72d2751b76f37297233781ce4657d6f59de775e182eb13fc37f477c2dab93e0b7a305bdefee5f7192d377acd3cfec376b8602c324dedff1bff7581e26b16f2249fba8f0075ffbf7efa902f72f0ff6f9cfebdcba141454f183145d9288420bc25808ac2e98ebc4ca5bf8bb071e45145c740085194cb1842dec037cc7b29af45107f6ebf66f78a4490be67625f0b77fad13201450d084329d17d24dac8bc394873faa0755a83f791e089e7e428cc14fd18c28eca14014ca031fe58148502fc4432d2e1ec41310fd6bbcc036a66cb9de87ed191849de9ae2ad2ab766694bd2161a5c7ce78452ba1e06c118321e63ce0be9364e178b0d168ac4a00782f75eae0be74413de72bc459ccdee3de2fa8e0dfc4d7aa382b8963c538335c3648defa371e369dcb0a81bacef67cc907283068dafc19aa1aa90345ec85dd1e8505cf8e385a71a0f3e88ef57c3060fe47d0cde8bb778d8c3d7f3700dbcc5310d63d01b3906884a388f8b0f97b0f098fee0ff014110630ff585d7fb401b2fc43d1b2c0f75f21e3cb16622794118e4fd7e066b8622ef8c19bf5aad1ea4c13ad5b0610cb8061e3f95d7248d197f5fc85db17a868c8b0545c2f0241734637b4b54a5a490e065994e56098376c9036d10a00983d756b138a607b1c92a79cbf4971504fec1f731c617775e7ab052448e860dc0279640865cdd08435a2ac87e62094e20417b599e145f22ddc33ff74b3d07a35ba562d1a0dec50a3481a7cbea93c913bde518e3d388576f31b8fa136b85df84c9ac6ed0a8f23e342c1632f8c6f79fc0bfe1cf0dd722c58c6f61b9122c6fc2bbb83be1355010c1774ebf833d5cf256d8cd7025ec346e8d1b061c67b8c6384391e06a9cc120c171460bad9c58a1920963102f19bb292326d32d21ce5ccb9de28af11d1b6098301472675248d6c9b5f4abfd8ab7b0f811ed4b7d040e7fc07055e36bfc0c04b90888a6074de3cd491be3eaa4962aef43e39f80f8f14ae271869fb622418c4156dbc0644ea71bfe981e34996c8c356ad4a8710abb26444ce6fb6eb8c449d383a7f4e7f4a2e9c45a79ab3b9417b6b7ac89c6af4edfe1cf8a06ebb4024d2cf0572cd6699c391612371eb328e32d7fce03a23f6ef7fff0512ede65b0660ee6c54a64cd60a852a811f458337caf8731e856c0932b9d4c7e59bee4562c0e9e4921bdcfebde831126e9765490b734e3da6041a342d66c45862afb1d4723a2ac901b4a114de112eeada36c87342fc4395688e242311cbdd329fc3089ea4f8fa3882bf1455fe29c1b43d538b3e17fa1111c7e7fbb92155f12c39f9063b55da17e75798eac64fc8b079f267c57b23f54a15f21bf0f5f883fa7f299f558335f3a9d1efbe9345a7b3a7d873158558ee7348f7af18f5c9ea15be3bf1a658ce1db7186247cfbe15bee5d4994f128f11b9fd83f85e16a062afc1926c54e8629cad72b6fe44c2817ee45a552a9543427d4683fe7f2ac628c2f4657121fb3faf2b8f89f7d472e8f8b71e88eae0a9f267c8b8a8146f5a85035da40fdf7e20f5d1ed1fe67432334279a8fa27a57b9ca94a21967aa14d145944aa552b9950f253acf7dab7af0ed9852fde933dd500018654319a490347f7af13d8ce1f422929338b6b7c47116fef7586419119f7b4ea4119f7bee454f153eea55a990b622c1d1ad589cfba05bb13fac2f911fe6f065d9548c2e7f3aa1def4f83fdfa1a16cf79c29346113eaf1698667a8204e412805a1aa8242a1be300c8308c3d106113ef760db204294b7eeaafb8088faf041cf5a93352da19482a812849213246895ba0f8856e97613f8ecc7323da89aa1c8f0f4f7041a39d95314f29e4623a7ef1e87484edf8d34f2bee7423cb4627156de8792f259079345ecc40f95c4f08a182eb9d28baef42b95a74295a85279ca5722195a09ad8456422b5916c025540a9742a5f04ab8e44aab952bb9d20a7f28d261ac3e55eafbbed4f721abb10883fc5cfc54295f8556422bd7b30097702905830b969488c595520ffeccb960b93ca17fc8c2aa7126c220ddeb54aa7186223d0586ac952bb9d26ae54aab556825b4125ae14236005c8a2c2f5e844ae1951763b8145a79f1a1d28bf0ca8b70c995fe852bfdca85f833172f6e7c2e30cd2ab4125a09ad64112d07c5182c478c5c3ed4873a5914136044181d105797c78201b302b35a8181419829c45c316629540aad34c1a50b9726ba7069e570e0c6e3b069e58456c22b1d13e2eac6e3b069e57040fcdeae6e3c0e9b564e0b0c1818ac6ed8845642a515182ce4ccc1d40003c60a0a5402b37acbe534ae422b63504a60f71ca7e25e65ef673a810fa2dea4528dd704be09a50adf640a416f168657157e2a35863615a6b00af5a9ef94831fb250415c4f59fc032d61b478d182454b155207d95f3030c50cdbb7a3f78ebaa329895f93c9e4f5e9823f0b8d3c71d3173efebeef1b69524fc36aaf498d334ca65cf5a22a157ee0f899c69994bedcdf15378ab88a3263c816c8fe72812ee4970b6c217790fd25892cb290dd7b4dde9e617275f2897d6e6c6fecf0c7fb0e61d4387dbb674abadd77e098a57bf7995dba3ce2771fbe88c9f03b150b4586e3ec43b1da6bc0ef587e1aef9b460f8dcca43cb9e3ccae9ead72c719f6c627f6bbe7ba118f33fbf76639e18eca170c4041e620fb0b06b07cd99205698720fb8b963124a8fa6c38e859eb7d0af5296b7a7b72c1bd1127c317e252c84fbdea51ac192651a97761df45ea512e1e358ae30ca544a63a511c5dfc283e0d0deac5ee2dcd37ce30e9b950e1efd48be3ec234fefbd2a35626f7d286fd9d338ebde64c3ff1b47acb2dc04ac921dfb65936ca031ea6451e3d580f8c4f4dc8752429c89e2fd8fb4e2898b6dc27671eb84170b85ef74e34c8ad799469bc55b374b12bec36df19d6f039cbdcdd9b1fb2dde6940b4e44ccc80f8bd1561ac6ee0f8560c2039b3e4ecf40503559e8beff4170c24d91055c5e2701c9e39179be5d6dc4705617fd87126c59ec67166ab7069824853a598de66f9ba9305b1384211a92f471071042d261509f00ec031dd320215607704223aae6b1de4708404a0301450b7c3410e474001e500840fc886304140617490c3182f0c50d089ec278ec0c584839b83c4beff6a25055b5b44989c1c2e0ee26c725adee2c2e82007ccd958cbc37738dcba453220da6fd900057155f41067dfd730b0ddc79e01dc217ede7220c4bf2ccb91357a88b316992ce40c07e92b8bc3ff06aa4c0b6263900571e56ec700882e04c42136eeba0e002277646415b1e48b34e00a62631552b861439cb24453799fcf7bb80ec7715cc8755444fc2871ca1298fb11c45aee83a23d027e8700f1247a3f6509ee1fc7c7c4d44d11bf14c02296f46c702cdb4830892f899f6beba316fbd8da2040cf365680d8897d6b6c14b1a41d3fef3b2a62f7383c0ee3cf77ec8ebfe5461b782c6239b202d8768b7b2bc57770d3143b2ed17d0dfc6077c31f8c2dee7620efe3b01bbd91e0182e471a2009f7de38dc73b83b4037a6ddaf1fd9b8ebbc6eb47dc3f570b5d817e23709f08adc73dc95622d0da08b5396f01568bf71b0a0b83efe0d83b42b6fd9f71dd40c063913510ee821ce5aee45024d90fe36cee33eceb224c7ba7185ec2d9ca0010b18e1074838210b9f46d1a0bc855b025a2c793f00e215685045ca152666300311dc200b1848800807885fc0bc6004099618c10d764046050d1022d5046922fb091e60e165b62a028b2b6e2d16537600851d28c13ac10b05aa9c21bd64e981972c4ff092250b2f4c2c91ed858924d205d95e38300412544d5962092f36916cd68ac953f358416c7a7ba3bb65e8233dda6041fb20d864e31dcbbd65d9707ace5b4650e40c0441d0f41ecbf4f5e4bc0d0e6f591bbcd516c738ebb7c15bfee0cfec0379cb06dbffc48e3604cd7a7c2b44ffcf07d22d105140fdacb5403da19540fad3ec0f1816c777bc6f2390ce83dfdf89cc774cef7d04b2fbcffeb0572c8ec502c3feb047581cbbf4a1505848d702de407510c8212cd5d02d7f2f07a4fb80f4b77d65d6589058ec8f1b90fe4fde22d12f1aec113d701cb02c07e43b76d6ffbd0d8bf47bdfe4294c77eb1b57dee281ec1e6f04d500d928c4d9eab3f460a538a7fa8057c57f4e0e8f1e20fda2099c80a0213441053f88514111587cf0103ffc60058a05281fa4c8117b7278e49868b200020158088c5bf821073f0081470f902f409c804c91fd05082ea00ac06e8a58437c61c9c6477cc1b264bbb1247d818019945b0b013210c0e28a2f4528f1050b1457cc172c4d903314f9054b07c822b28034563364747ff78b41cedcb13b86f1c2058da84a8528f064fabc8ec3d76d7bbb778d1a29f1ca294ce75d8771bbf707c6abd25e157cddb69fc2d8ae518ebd65410fd5a1b5a82efcf94edf07c35bee71237e93f7733ab9f5c66e0e25aebafbbb176b0182aaeeeb6fadb5d671163c60212d0f59c83b629f0282e0ec9a21bbad7bf7cd45d93362f7597fda35c39272ad7f60a971dfdc8fc2a514fb893059c8991786a379614818e04fecc7b41579efca052f5e5861c60a32e267bb8d08f3a99ef8128132d8881260115c7cef12e6d2dee26e6085186bc6082d6eed1723923e23b22461bb3fa5cf0a1558b7d6afbb1528c020b06203e48ac3d88a2c5cc771aa212ccb8a29e4eaf3bc2ab2a882cc521562aa60c167fa3e0fcca7f4a14a603a994c556ce0049e4e3809339d14e20cb29fa842081005824f5441a58a1f4817a958022a44a170d28a0a2cc2541896a1420ca602cc47050952aa548a0a2da41df35171844a54a9a850faa6d8429c4209342e68684c51a03e21b810e3e2850b174f4c11c5135338f102c68b17282ea829b27c532c4da18027a4280303150346a8833d63b92bc5186c032c0514e4bd2c299a90620bf984145962c88811438aa54bf613522861b29f90a2cac3c842c60c19327a00d6a09302d360053350ab1933ae9c9cc8512289276870e5091a287d67c0158dd54a461068d4a04123c614356cd4a8f1c40ca0c04fcc0004e4ca5b369e988105da468d1ba9ee9b1e6f4a90039b455b6bad756bad75d40dfbdccb2ccddd31c61c57a5ebaa785e95cffbbecf851420b6edde472cc900118bedd72df60e984c9fc9143e74f4e8e0d1b1a3a3870e1e3a76e8d0a14347478e0e1f3a3d3a3c3a3b3a3d7478e8ecd0d1a1a3a393a3e323a72787276727a7470e8f9c1d393a72747272725e35d71bd1bf6a66d9fa2f3576de50a22f427fbda1dd2d01b775f7b7e840bd9a349bfa436b39e4e5cc68d14aa0bb63b4e8abee2839769a4f2ba1a0b59c7677d8cdc5609f882a23ba5b468b3601ddeda2457bc50baf9aad3f33ed817c26fa18ed86cad4af8165286aea8aa1359cb5569453148643c4a3a8ec2182e9e8e84104db9179720f0f5151118f1e3c3d652682e5e410f9c821e22182ede881035bd55b8aa3a6aeb556d4fed3ddab16edd7dd4774b7edee4ed134cd7f961fcb677a5b73fa276aaee57ae65aa6d96ae6af6699ae6f749aeb5ad652b4e8cbee36a2bb23d0dd45e0eec6d2dd2fbaad93ee8ea145fb6aea8265284247658a034b551c184aa395384869991299b4eee6ba7decee1b2db60d862954800004464c33bc2851238216f000848313041545c1230828da4f8bf5839e302f8e3ed713b01041094d0149987ac69a09e88479412308d7b5a94470c030ab82000b7c527808b880ed252989eceb5dc480e07df08edda4946b0500f6dbccbced370aba65b5146b77c0eff29c9e872955de87e381871efceff7601f7f0fa6ffbe471ea8bc0f37f2d08369acf23eb687eebfd11b7be8ec732310aafe1e3a7b5a1615fcf69d35a50a154bc57e97c7abe02955f0b8840e305059420718c8275596d00106f2be0eed85bc36303105132b20574800bbbbfbbb876a87683187fba639af4b8e24dbf5e5c1d884393cf36ab6e06ab4e830c6230c480f437a60bc2eb7c6df1bd30d419c7962bc2becfb7b633c31165bdc1f0ae442360038cc753981dfb0ab31137e8d16618e29a12a47922af5dfe5a1f9145e57ac7a1a560aecb8bf1e82355bd46c51b3c5f594e3284e35666ab4c89154a3458e29399230f6662d30aaeec3a713f8370cd99d5e9c9d5423ed8a49a5c213eaf4e0699c996ab6a8d9c23361ee0858146bccd46891638a58b3458d19f16bb410734c115de448c264f72e6868c6998bd98a69dec5c360f5a54989355bd46c51b3c51da372ae0ad838665e994b845bc68ea622e014caa6503e109f98bc3046106797cce5f1c278612e192f8ce83b5e9830be13fe27c67752578cf17ae09161a1fefbaf468bd064aa3153b3c5e841e12d2fdeba9e170f0a0f4c118870cd24d56cf179607c202611e192f1728950e666e13b384cca91f47d5e182f8c37c525738970b5a8d1a2c60c1994e9c4b2a66fb4974ccd165e991e5c8a774131297bbd334d71378520f737e5e3cc7e8a158e36546ca8d850b9770c78bbeefb3ecfce56530762d0f47d3654441c021a94cd140fdb50b1a13205db28619b2a268fe63dbc9a52e2987afc36546ca8d850c14945808d63f679c16fa78ca7206094c9a23ed30fc427a72f8b10c4a50f2f99be6f8befa094e0f235e13b5d58534e6f9374e2c6efcab7f461f996be2b1f16b00b02676f735b6ca8d8289d3e2cdd0f3a32a2f7f65b32fd4ef7a74f02bc5b6ca8581c703c9db27c59be249678ac4f1236542c4e6733c526092fd95099a952ac1d6da87c427c4964876d926ca6609b2a1f4e6ac26a3a9dbed56432996ca8d850b1a1b2721f7cde37abc64c8d169e97238974af7377d1431f67a7377dc784fb9e377e5eeac12b86fc5e35a35d31e0a3c071b662f29bad98bc3f6b81b962c8ef671fc62d30f78a21ed7f63cd16355bd46c51b385c72161003344c055c81683935ed0e83ae0ad2630011733a894f1945ec8c066f01783e338cee380e0beeb1101460e522f5a10c3450952344830811291b8c04985c411a61412546484488881d2810b308cea24810cc43049e088f09380102acf24841a35a0f14263cbca8810c8863041406174f085010a6a01a00320bee2b31f4d5bd18832e490b8ba41d32f4b7ee21723c6bc3bc0d660051552b861a3068dd50c193160bc704123aa52210a3c99bc0ef8132f5cd03801bc17f78d2a15a2c093e9f33a0e5fb7a5d85fae5cc1c2438421dd41f7eefb1bcdba2498624d692f3313093e262fd9e037cb933a04711452a9d403a1e2418a4fea410e95624d113b6c8eeb514beac30e0adf4b205329d40bf1be82c42fe44e600c697a1bfe74d3a0bc65329964908202b2db66c6fd7dfb9c89d55780dfac4ba6c2243288e0830f5e54c81adb0824c8a14256278104af37c6b6ab919a1d91601624f8b14ee09836ead7ee34cefa4395c13ac0407edd87e9da91a8c763c81e755881d40106d276a7b1dbe6bbd79bf9df915c6116cabf23f4370eb00572d623cd5b345bbfd21c524bf7521a09418fffc3df8ddc3885ca8d0ff7555ef8e0a7f90e0c72462369def2cf21673080a67044e2ac89c043f7ab5b23c5a7977084082620022e6392927c38d6142aeee37d95203ef8395695203e3c2c11849f071bc4f0b04490f7dcc8c3111e9608e21e8f3cb46e8d83692624a0055a8a60030dec8006dd12c4f691e20018980009249e10e30125f8b44ff73e9895843760c5023f54c0043e53a8dcf8e0aff2828615ce9cf1c12d90fe1dc66315ec839f1ba75001e283bf0af6e1b8e7cab87b46b4bd230c6fd95fad6e8d090b1089aadb5afca63782df649fc3d74d636804bf8f7e71636febdf6fc4bf2daa7bee83bae7bc6e1cdbdabee99742ded008c630380ec481e3c68d3b8e3682bae79e490776ddc9ddc81dbbf0c7472fbca311246ecf9026772377ecf7372285f442f74015eaa24ea6cf3b8b4d29bff79404aab807551cd775defb2df39121e3cf5df1864630fe3c6b2dd979dc7b5cf78d69f4c6ee1bfffb419f8f08f8a49078768d74a3167f6ed482c59c61390eb9116585b5d65afbf9181fe3eededd72b9cb5dee729dcf2d53067398c31ce773bf4b170e77491d777d2e37bacf7df04371acce0ad3832a1b48bae7de92524810e4462d77fc8c78df3dc7a47dce9003b03e78bc62ae985be323c55e1c4eb16d9d68c2baf524bc23fcfa8d805204a614914567040ee322c690abceebba22ae3839c176c3e0fb41114edc1be0c009452c7d4554c16206633142378d63f9016969fc06244b8ab53f58c4b8b558c06051a202b88a7577777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777f75ba5cab52f5ce1b37befbdf7de7befbdf7de7befbd66fc0a50065605579cc0f75e514410388caf74e1d2711ea7006bbbbf5c99805b7b05027edd1b70650157a870185ff181882b88d8e20b1144f0ae7c5340c19de0968008100c810825dc5a228ec0442c5d772292b2b0d676eb60cfe00e1bd0832938cc35008a06785935a009aee3b80624b16ac095ceebbc064cb1597c196208a4e3f03ecf1b220c14a6ef1ba2892f437021610c9165882ba924c0ae055f8698b21485cf2900368e998d3224eafb41140b9c71af9924f28efd2896fbcc307379ee278aa771c637ce9eac9105bc662e8f67e6d698fefb44d1cc35b90fd8be8322bf779fee970d995c1ff03d33974755e6d698deb4f2cc90261338ce00736b4c2fc45565aea97b6beaba6bfa1765b090a6bf5088b3196648d3cf5e94214da01633cccc402dba088a6c6f99c68e09e2375a33b31961487f0e8fa8cf4699ee09707697987c3e7d6bc4781632968b99f6a29a7d23cb5333a400b07e859b9aedc0c20a2aa47003a7660668e1868d1a34565c6ac643ab4bcd0e50e381393e1772a4ec4bb1160701368ebbd38373e342cd8e8fdcf1fac89748be828cdf9727008fe3fbf2b4f02cb49ef63208c0cb91314fbec9bb5d21051bef961cf2f3d6cbe5a9f1762503c6db3197c7c8db8f54f2ad442467f8c819be67887d373c01be2f0ff7f6c55b9af0fff45d1e1cdee6f04e0a507ea2b85afdb76cef18a05b9ebfa188abf56d52cb26e590616ca3fd3ed1d6bcd0c68fbc49fe3e3a175176938c8adc27b3b4c0f0b2cbe3638e28a25bad160200809fad324b8b901fba3c37e96eb93549748b02dd5aba5db86496162437cc6dc18501eb7db652814990911aff347e26cef8d9ea22e166d1adccd272c3cb2ecf1d43467c178f8fc04574ebc5a7ac4f6669c1e1878ee06e75abb512c5ccd242f4472e8f5d528055b2e1b64c6083c92c2d3c7fe4f2f8787f9b3f90af727cf78e67d12d7724742bcce5f131d68c9309b32456b935378c3573c558337ec770b9fed7ccd225936549e4b2e4586e0dce2c13e9632e0f8f1eefef652e0f8f8f1f552e0f90f7bf4b97e785cb038390f7bf5b2e97cb43e4f21479ffebe5f2184112c39277a0f7bf652e0f93f7bf662e4fd03b0def8fabe0a5cb63c3e5b9e1fdfb5b5581c56044acefd6b4981c461c0830da50c30c6393118895448618048084d5b7e6c86884c5650b0cacbe3541c6998b01c27a8d33f7d233ce2e969db107eb265d2f37cbdd72b9dc2e2c8c01180130b2585ec5971c0b8dd50c19b706c638b362fad6d08c335b4535ceec12cef2a287ebd77d006395b62c7042db6e3130b06ead0bfcba930173f1bd2bc01cc666a0e03a8efbe2755d7b692b4e18019a42fb85f65b077be68e77498c672163a6bd5851e2b3b2a5bf140c25b07b62c56dc799896c7b258823c856ca42690af20a91841264ffcc92412891de0b3185b48f7b40deb74a5090de5b283a78a4fd3b33fdf4ed15fcefbb4fc2b1302a4ce2a1442801281a94694425cd2ca1902baa84768b6519acc98a2a218d4e53b6a2a0bb4fd0dd9f09badb89ee2e0109ba7b04dddda5bb45d0dd21e86e1074771337c89a8dd272fd175ef8f406f33335ad27a8906aba6ad4e7a146e86dd4160b3cbc4d9a6367565b48f989101291900c96965915424acbd3247299babd0737d46c0d45289adafeff4ff361bfaaa8cc36e90fe4180a7bd91de59fe667d8893e12ed443f96d73266bb7d26fa55bdd5be5c4b2234ac598d9d5915426337359677305354b6de4aa115569eb9bb05d0edaf8e651dfe47b99631743d67a7f92a5279442b6b655adace5bd1f3ecd8a163aa486a27a0bb73b4582bd3ac474a3394fca7f9eb99d59cda3e133dbabe1acbf9fc2fd73226b466554d5d679ad7b5b4e1a4abdadd2c4e08c7a36f0cba7b498b36568db4428b35bab4dac4e83455d54cd2dd1e40b296361ca435c795e3d2b9418b4ef326d34a988ab343470f2cfb208af9f0a1630706cb3a373514e622bac956d308295d55d328a7dd46dd1dd4620d547777a0bb311635cd6691b99e3966feaade98bcba9eb96694d597ada5ed6934f2f5dae9a1e34877dfebaf661bd22a44e386283937158d52d6846cb55466a4d6f25ac6ccd8590ad56e6794b2b69e371486043bf34d879c16c5d2f2c876138a52d682c8d4f2489a896a37254f6028cd07a9a4e598d02d86c25e2f357599b652a8a69647383d884a221f3b3a383d59479979e41e311e1d453d3b7278dcac68ac7c42436d3cba6768714696eee652ae65ecd79bed346139860e39451d86c0447773a0bb973873e6cc99ee6eb4e8449263656a649b61554b19ccd53c91ec60d2cad32cf28344b3d9c828652d96a1a459cd6910a134dba2943598a99e66ba46c94f60288d4828ab25d10a2b6d3574c8eb05cb31141644c78e1b90340345296b41809ca8b9da96d0ca155d85a29435a3d34cd726af97904d4d33906a3520c6b0e91596d31485fd8a9e9fd3f2d5a34fbfc8fc585e61d91625bf6afe6759d0ff18124a51a1a197ade6d1c7b24c354fb3e87dd4d4a5ae66cda475b71276951999b9062222b966aee78d09528aae65ec2c93d0ca34db96d0ca5a8a2a51d5923644452a8150256a2680db5e5354a63e8aae32b594fd2bab698692d33f91a8a94ba696321c9c9da21d1e3b787ae0e8e828737876c078c476ece0d19393796ef25aa6ab4a745371d4f5863e8165190c67358d70720d95dda0466909c391a9a5ecf55a53d466bba942b956a645228c0e7477accc69ce45422a526953d59206cbab991e050962aba54780d8ca2439a7413eb4723dd11dcc1495c54c5a0925c88924d784624d5eaf6ca6ab904dcd6bb9c6d2f2e83c428918a9b5b5145acfacae674eb3ec34d50cc55ccd9a99c6ca2c1382e95013d2a116abd1b1e3f6363a76dc5a79075315cab77cd341289683d4c4b251cc4c89c8b7892129d312a805049669506142e66996b221b9bb37d0dd1ac83114968914a1680ab49e5925227f6cb5f448941c3b91a86a4e8d4e24b65a7a24ef6036c9b77c1b800cb69636d5248254d2329358998fc07448a2438d88915974a2435694d6443593ac28caa4bbb7c840cbe759ca86d86ae9115528afe5aa0a2195b49cbe5eb5bcaa48aad069963258999636a135d368a54d48bdd16eb51b6c4565aaad3c9be4b55c9b189da651a9aa39090278d025002a04c850046b29d4e1000934d1c44d12560f58c9808a0c10e981064141bc9083aebbb560e04cb72b96d7d5acd550d8139ec04aa28f651a0d4d3f13fd59c27e2d652bac54cf325dffcc36f45125dd7dd34da445b48a6bcdaab99ab4f24cf31a253fed445313caf9d3dd17103a8d4c5a29947730d5f586229532747712a7b9aa39f632d85ad6321afb9a56ceb0f486aa2eb428fa1071b40add9f8b8f86aa4c77e3607fe043e7837c9ade60397238d5d89c5aad03fc01badb02dd5d81eea6c0c9a6bbb374f704ba1b89eec6dd584e06f8b77903bc9aba5219ac966b387d438f9abad434c768e68d0867ad1575ef6075b70ed5d7ddffff6fd3420baf2b4421c6e4208583feb5fc587e0233cfd2b6de92a4689afe1ca1698afafc6b68e85f279ba1a17fad4599f67f1aaa59654666fabf16655a6be85fb14c33cba234ab6ad9ddb7c5d402502da6a4a46add4da3c55450f70b2fa8e60fbdd1699e5976f435ff02906fbd00e44fd32813a9a9ab5ccb9850770ddd31747797491a6aafe6356eaf391aebb5ca72326cca7e3a304fdf2b5805cfbf8fc3d7daf6b603c030d8f67e70ed6dadbd7ec45acfbab5b7dbc1ad5bcf6530b1b6b35ebb0d5dd7bbae757a8bddf192c5d6fac92ec1ada9398bfd666b676ead7f33b80db7de61b743706b3bb703b033acbdfea580bb5ecacab036c6776d16dbb9b57e85ace3938987a36c90cf7238ee8f3bd6b93daa1dcb052cc21bb75fc0e2dbc29cdbdb9c032c16b6bd45516cdb165bb746b09fe7b0d639f76bed0e8b633f8b7277ef86d816dcb1db9ceb02697c2cd8d0450d8780e59c86c5f6da7620ff93c5ed66d73f6485b8cd4a816dcebe56e0d776167b36b4178bfbf7bab6e75a77fc8e32b52c67ad978361a0c9b17eea3eb7d65acfda9775bfc1edacc9f18562473fba37d604bafd3ceb425c054fe1a670fbb655d9cedd8658bcd869b8bbed2c2eb2261c16e4dc7236c563adb5d6860ba0034d6e893e94e77600f6b3f6bac5f6884dc17df80d07dd73ce5eebd641f7b0bddcf561af6d599345596b7f5815fc743dfb61ebd6beaced64380c8bdd72d8fa70d05e57c1deeb8e1d5b1feeb6869facc97ed8adb52f9b829fbc6bf187adb53c6f5547d705ce5e6bb278654da61788830d152c00b075efdccb568c91031eb1d6ad5b6b6fda6b5b777790ee66d2ddad16432e33a0c09699c1d51fb403326182288005119a943bc819c00ec63410cb06bd640733c84b584e48400905d0254aca5919015040052514296fe4f860ad707a7690da004f19e2d8a1c0c9ee94360a3dc69c41a247962dfa660c1454b019b3c56d863080ba902527870b6f730415c63c4a852c335c74961739f41037443f06a2fb76c7cebc96af8a279f934daba92bd388caf534531b4e8ea130f3bc75534e017841528d175e93e7d13079dcbd3150413e2819bf5677fa7a300a06ca23006abde10d3f31404420a94bb967c236610a3d1c483ad1808a619b940fcec3063703b61d902f492fc840840608c7272c438d15498d00cbbd6c3e38ae716fa8487201080131543e08b8467c4840120d530d281811482a32e3fcd41313928688103dd30db92758014a3e7c98e6eaace043132a60ca51c594cf0c04520e7242683c1f38868c03971f5e70ad5391130b438e73783e7e1801058cfc300306e04c7122082892c05b911140843a5456044934767c38793ebad397ba3c488cdc144e453c1f7ca4d0e43b62e3a7c8c97404d52406c44b92886d764e9e8f176177027fc6026020e9f41d5181680149dc1539db0da03b713fba1c240ce0cdd4c277a43b79345243542a6025a619306ed090e36b2961c2820fa7cfe5ed0877f02001f250d8abc1bdee8e09855b78219ec93b611c2e06dc23c472362e8b939163fa60d70796a4ef24c3c4e3c3529205797c2d8c03e3e8349094238589702e702a9870e01b2a9d9bc20f492e1c7b8bee0dbe9c01c60210819e304062820361bc70614203490421e50051d42745193654002737d840c30c4d806410c09157cf8e160b0100c0e315a800862001186bd0f0b2c400065a3030801f185e29c440811d144e9060892d5a92b00005b2486086560b464480e886231841086d0003cca2203f4ede962196784c351093812d2f1f3b336080a7cfbb614304217092634b94080049911f24ac2820012ec6f43001131cd080941a68e0d959c1c03308a3041a82bcb063f2ba0920810403962809f2a3059485823fc19de0667099378293f11d7063ac0ddc0aafc244056a0a9f813be14feecce2f852e06e84347c86c7b030685e702e9cc68a38e5207772d3f739b6d7daaebb6b84aa6be39e20090b918465e872b4a288351f682e90c471288f051bf88029a08367a092d84017441296c124e374630544928900f886ab02b876a8afc8d7d39d6e4f8e17247d5d926038f1c1c4738598724323a07490c49d49e25035aa4842ad371f4832ad52eefde070b82b5562803420f003564a52b1c4bf373438df8ae6cc0f9c0b5f8f07e4aa2e906fbd3758061858dda95322e9825d0d6c03ea5c8b51d8e6548473c1234057a33b7533140c140cd30c308647801b851fba1a97cb0f1c98a400cc70ed850290027ea1541d0db6f7e60ec140610ccfbd1a3c91eb3c9afbe262a46c075e0ea3eebd7ebdfb5dd3e906bede0c9e0b15d089c6eb3c7b3dcc03e360fbd1b86392c0568f0d24a594f081a6c3363e223f601dfc300a7d9fd9020835103383302d0073336a72668b21967e7c607881073d8f60049c1644d5e7e170c312256764f084971518908305024222a0032ba260010a44c084161c170b42380fb8ad0c50d32520a1cc15544ca1021048e9a1004e6eb06189122345565061868c273851022638d0c3018452b8819e2ba8523ac8810eb530e9cc164d6082131c66c8a0b182052b7802052208410718604501420520400d4b94208942062b888109b01cb9810da290010b54808213602089052000082494b1820a149cc0090f4c49ca31243f3461191ff440072d50410948d04406861022c76a40f25343134621831648c08821a6e458010480a4c8cf8f572ac4ed831e44210317aca0042468a2031968809529390800c90b3f5e3c3c746a5cd0e03ee3831ee4c0052d58810a4a40820e64a001435811620a162010cac1090c382e2da020430caa140e52b8b1a4b4001b6ac8a980100b408ab2449fba3b002d9a98d0a633770b1c050e0afe846f0358039e01d76275b8cecdb12ef0c66dae0bf765ac6053f01b5e8d4bc357dc0c2bc3f4c2858b2b625598124318281ae08d138de9fb3aef761dc75ddb6aeaaaddceb45c553cd4dd30ba3b77b78d1671daed7275b7b78881f4d017a15ff36a5e91885aff3966aaa7f9aaf9abf93f90d2322d65b02f7f45cf57cd5f9188ba16f14d777f2de20074370b2dde33a110c4f007dd9d6a3114734310e113ba1b6cf166d139b85c2e1c5eb61a9d99f645e8679849533f458b6267fe6c749669778f2d5e5a778b2d5e27dd3e7cf4f8e0f1b1e3a3870f1e3e76f8d0e143c7478e0f1f3d3d3d3c3d3b3d3d7a78f4ece8d1d1a3d393d3e383a78787876787a7070f0f9e1d3c3a78747872787cecf4ecf0ecececf4d8e1b1b36347c78ece4ece8e8f1e3d3d787aecf4e8d183478f1d3d74f4d0e991d3c3078f1e1e3c3c7678f4e0c183c70e1e3a78e8f0c8e1e16347cf0e9e1d3b3b7aece0b163c70e1d3b7476e4ec085084d6ac0e7dec348b8674929cde686659d443ba817cfb682ee55ac616d0dd515adc01869abad628b99da39965d14f774fd147b0a0133a0b3575c5cefc0456129da60c56d66e622d66ecca4c328d66c6709495e4183aa449ac05311b1a89884654ae6769a62594cf273a24d6403d3d9a349141759d66293bd72765edd1f5d31c4bd13fcd4789ca3f42cf27259377c1b24dfd18d29a661b9ada7eece9a1aaa36af6e869d2e46379cdb1168cbceb2c612a5ab3aaa9794b6dbfaa3946435b6fcbf949ed93bcab76ab9951cadae77fa92cfcbb64b2a19ccad6574fb35c6b5a9f555a59e45d433a76dc86866e695011fa43b9569eb06c5387deb5aa28ed33d17f363232d3f57c743d51d8d0907a9be5a32f323fabb71296897ea8c6e6f50a6a0d7db621a939cd6bce456a09fbd3aca9e659ca60b9062bd33543c9b49b556664d25e4569307355cdd3aca579cd311566da4820195d6119ca9735396dfd9749deb5aa26ed878204011952cb9c7e263ad30c259faf9ab17c7b24da6ac24c5a2daf66cc95e658996536aefcaea1a14722fa35377957cd6a3eba7e14b505d556d65aff2e35cbd4525626b1596f365a59f3a7a9d2ca150d7a17112445a789a6f9861355926ba51258b6353991a0416a2c6725b06c6b02438386103951259c111c110408d3dd5c64a5aade5025ffaa69957f03126eb0a2bba5e897adccb2d7d010941f1a5af2ae9a1cabccc8ace568bd4a2bcf57735ad26039f6cf802e47c812012cd4d4457403ed06176ec0d1dd4666edd1f311700416ea0d01a6348d661609d9545568bda15915a2d1cc2742b2d53c12d2e1d2d171e5dc9c47684a24534b19cc869e239456946628b0d256c2fe656a79c46de03ef015d0c095559406fb286bbead67999646ff3614adc17472a9b17c669306fb1355cb9ca66811d3c9a5aa2551f9242d6b32d899893e458bcea2a795262cdb4c2a66908f90d09cd6100601b51edd82b628eb24a7dbfed8155ee86e2674f3402cfaba3b8c151d86030d02a220fa891428badb033278208abcd6a8eb99a1e0f059166432994e331499b51874d42693e9e432994ca71a9cac9644d928966947e8f904e7cc382a0c8de140c93117ce4bb5adabac95838ac3d7d055bd0d31994ca7ee465b6c12a665d0dd316815e7475b1b17daa21a0aaa90d169a69d9582bba67566da0b403e66d652452d32e9d2dd308012cb3afccd4933cb1f27fa44b55b0afbf2d52c536fb6cf31f41442d7d3148a9d19a6e658bee9906342b00c05473d51f3bbe9ee02b43880245ac7e7785b09138ad1d07fe185af69d94a98ab8896d51d1d57cecd8aa2a90d0b3d65002b3575e98082034bd51a2c8a90cdbf6cfe2594665aec2c65423638ff8ae5d8792bca298e7aa3d9d2dbbf5633965398d0690ad56051804220224043806a808e808c809c00b174ec98010d8a759b20cba0d268a43a24cd4064b99644981c6525ab5acab0aaa50c6a0db65a7a44a6964732cd66a6416850cc564b8fa8ab5aca00b321c7d0214d62269113fd5962ab1161a2a62eb32d0e0cf0412da27fc432d123d188caf556ab99aba99a45660cadfda09566ba7e917943cd22f46de8ba9a51728c76438f64e0a2e6954664aa2a6acbb2352d3f434189cacfb215553f96735afe8a24c750253e44b29906a5b0d37cbd886ab77408adbce99067a095b9494e8156146592cd34a86d0e6ba3ad79a2e66ac64e149653dbc750d99a6ba979d321a756a6a62e5836775c3a74b8726e886237d94cd71208c0a6bb5fd0dd2ee8ee160489659bcd4c57f55553cb23200e4377a72df2c0a57b6845d1342d6d7fa4be8484942c41d284c90f0d423f4648264b829a0809bd7e62290acb4ccab5248216c9d4f2080d317035cdc5d0c10d1a7f20964ddb0d0643bf482896d55be325d6331f7daea14ddea512ddd447cf97c1ce32f5e99b54d3425a6db52ca49a2ea4fc4488658dec4a658aee06d3dd2c1852724407caeb55a2a69aba884c1a14d309661ad4841545d347822b462408a2112090d20ce5737a5bcbd3c86cd25601302320b03818b1e9760195e91ae5e7f67ac1cc583e6790a9e591273094e653ae2591a05f4bdb2d4dd121ff62b28409939f7ca3a131f495d792662b6b3838b6b2f67afdd0f809f26376ff2b769a4fdee65f2f989aba70d4d52cd39b1a2c0a4e0d16e5444d557dbd5254a8068b22b4a619ca89c288c0881ce9ced1a163c751c92486244a8e9da5b9d26eb59cc662a4b9d26e497270f236eb0d7d9a1687bcd0dd3a2d0e4175b7cb767b1acd2c7a1acd245bf4e9d2a8b996a9aada441f1bbabbc98f1112480888fc39f2e8fa3a3d7278b8746c6596bdda427e241a512dab2a49946b20a5209d2093201b4006b59a8d4a9b102f48e8fa423620c4869d1ead578790202942d7dc44888d90140c4280214c0771c5b2517ab3bdd16966a2d49661674e73514e1f4df30e65921661c8e96ea3d3cc34537664abe57525bbfba7c52063da15a44bafe8191464a8cf5b1a3363485a0cf2f5dba4689a661c9cbceb85ac963985e5d8114aa3bdc0c3bb86209de51b9d261afbf586be70c30b1c005a0482459116811c612b737a9222909e3e6fe9a3ab79a49aff67699496b42742579aa996b21b10d68f30dd2e9a6aa24a7e54e96e178d762b7ad5cce95ac3bb90d20ce555138946b379d57c576c488662aa67b645c9ffaa0945e8f582a966edf5424d219b3af42a8d56c25a3f54d3a4b564e85f436b5685ce1286b49a51326da8c9d090a126efc20f89a130578b3f96747793165f5abc88f07ac1eb04af9af862bdbeee1c9cfc4abba9397d9b58566f42383871a9b78fe57cf4aa8f29a20f1960514e14a6965f0ea0c59e2edd64cf5017a1b17cde705aec69b52bd75058cd34531b9ada6ca5cd0acb4545f973cc54bf7c951c1afa2c0b72ade859b422f96c5b616594fcb1fc0485729a2e918709dd7da4451e0ef0ecc063437703b5c8f391218204c87a66283f3938f998f9383871251962c3efc4768874770e3d2ea3134d8f3e9f68ec8bccf48622fd13989922a9657ea434d3f02e9586c2d0154d6d4f2b6ba9aa66552d6d484436eab98379a2a90c76223579976aae678e9dd99663a759caf28a2a71a525ed0633d7b4b47df927fa6a8a16d9b901a687da63051e60bacd2722fad5ace58f9d657e5226e151c4c3070fb13ba7b01c9ce0e084147778819945262cdbd45ab923891d43edcaaba9a22bed5616e5d8cd899e652ce79809336f4dba1b86167788dd9d8313b4e8347170f22e241aed56a4aa1906bba91fcb6ba6d96a28ecff24451d62babbd1a213490c493e4da3f347bda967564f7408508e8effd173c3c1fc1cdfc3b3c38564e86f90f293cf271ac3d0908a949f0c7d113a842406243a3a9d21e84821ea3820851675a20441ca3120e527aea1219d95cebb00f4399ec78e1e578e4b3d51f3666808293ff92274086868a806c845bbc16825ec9168792dd31b0c563e9a8f3e8a59245bd31c3b6f7f7b74fd5f5194c9e747aae173e478fd042d51922387ebcf0cc53442ca4fbe546b793569b4f2693433869c21e444912382eede6931c7871c1dddada4459c1ee064e96e15293f21baa94839861c436132b594b9866818426143345a09337f5c47f98495e91a253fba7e91eef669d1a5831f2dba92e8206f5383d93004488a16a1d1ca21b472c8eb757abd56d82d5dd5138509a93976a3c14e53e8ccb1982913326da5904d7dbd8a6859cdc1894c2d654236a76964a6280e4ede15cb39fd9b13fd73897843a6656a79e4f50a8a218191af57500e4efe7170e24a730d75a2bb85b478c383ebcc9908478b3747ba71803c00bec9db64330d1af22f35af665ac3dffcbf0f91bf5141f0e57b7474b878fef5592d7dfea646a7b5e451f56d9000913f141b7a35ab33fc6bc808a509ada68ada726ce8d1f569b412f63a7fe3aa697d5e332dc73e453faf667af4d9a8d4f99ba11a9dd692a1bf0902e401e0ca66babe9a8d8ef2d9e4c6d5dd352dde70364ee8ee558b363be8ee1e2dda2861e3830d926883b6d0a2cd916e21351b9da50c16240866dad0554dd534d76eea89c282d4f28a6455b39149c408a5ad678692a1a036a12865ed2cd79248accc4756144d856a592d6540592d65b6203d3720b04cc3eb05cb505eafd8aa0ad9d4722d63eb794387146526ea7a6613661615dd5434c34ef45c4177aba0bba1e8ee1474f797ee7ea2bbbde41485adb7253ab06267f91956d26c397d744d83d4d4956165519ad7d3bcc1517bba9b01624d171b9ac6fe44ffcc4fca9506b4e8348568341426b4c2328d86c26a6cdd693eb3510d500d8f4ef393143daab92194c59a6e55884cab620b06ddad26babb552db68e28d73256aeb9d6526aaddd2d27dd276aaa69861233a1a0a9ed4b9fb639b22851c2b472badb6bb1154337101433c3321335964d9acd46a6e8daa4882b9f686abecdaf513291d35ccf1b5a2bd51c33d334434187d87096fff9682817c5ce52b69e37f43ccb4fd1a2b5546fafde644767567fcd48bfa2a7ed693473553fa7e5cf507e4ef393b4aca5792d8f1e28099323efca37a45899535af9e8a3e71799bf6655c9513e8bd0b4cc34d867a2582e42ff5d46a7594361a7f92ad1c7b299a625ec5533cd6b51f9b10ca5543f7696b11c2b511a119a8f3e5666d9bf2b964fb35c89d057cb23d554f3998d6a685af4e5a32aad7cd5a4113d5259534dd9fa43273af4a7f92e23577e9b22f4330c4d6d4ff43639458b722a839539d75e353f46cb66d1aba62ce85d69b6bd5a7e7a3b4b289996d3b5a4e534d750f58bd08fa1b0cfb2b53c8d4cf5f3d1cb60a6ece8d7723d735ada56b5a4c1805464aee8f9e8fa6b566b78976aae59fd1c86cab52412cbab6aaa69061ac24135bf7ca313a5bd5afeaa9a5132f9ae1c86d42c839539cdb2155d8f5c67b6d94a59961dfdf96b799ab11445614fa399479f66d99a8dd0f56367492b73fae56728a52c87a11c4387189d66eccc404338fc9965ebdbe41bad84f2e5aba5ec57f38b90bc0b8966b3951f3bcb5fcdacfe99f3d16a5353b4e88ff2995374551f5d3fd7f0b17306d5e8346db6929666284b80907c627935894c199a0219993e01a23ea8e40b57763d4b32a5d0cc0888000000003315002028140e0a458301711cc489e4f5011480097c9a4c6e42174cc482284671100621641421800042000c0001a931880023ebc8a4f917736295e480c3834f10d4848a3dbe44f02cce07f03d76708415f8b2620584da6780e7a4f0e72a51f9d7b84188c268546307c5d0f082027da03e65853aa8329da77b1497e9f22b58f1b2845c5d9eb4d91d0c22a5575109c9c686815d226e668247fe8671c97b579a917bda400fdb4d1b4c3bce7b79835ef30a34e953bb2d832e43281028a78b9f2fdb7332ed61a0cd3c949ff53069c35c685e9d45cce5eaa6dcaadab3202c7ac5f1b436dc114fda13352b78410281b1c7ceba56e2e07e39847fa2b19d8f62f106e4d1c97e74a3414e8c5792adcbc9770e22d4bff0543aa0b8c2b30ba1e0786d5f56da03f1c609187a15cec8632f5ec8cb5ddb66fac8764c31500f8adaddc8b0ac2963c0979539a7d2a631c8cf00b5f25990282debd94f19292f94a92b253353c164eef03288dfb5e475e6ef973440579a5b43b6a0c989e8faa7cc4ff012a2d5b4672c8697042be5a81b5f1f583088eb9db70088a4e1793fc4cf8b0a940eaac2deada6b0b63eed129bb1bd81f7aaacd32f4e2672bf853e9910a1f5e4e44863a5c2f37fa908a302a5ecb2dae420b7acc59e9f30a2dac25a7e9b396e0298168747718ff7f03848adb164f2bbeb01610951a1647df4a5290a1c722c6b90532a25fd8e8868460c0228c9e21440af44d1d350586e9dd1799e2bc69e3de2837c5f8ab19e50ff08727db319132038f9fbd512c93db2a099538d8301efb0044244732259fbe53d656803b09cca243ef7fe54f81d7198d849b839e20af443ca940bde86103c6ab9e989db1349b418d0304579a1f27df42ec78fa90b45a3f02fc4203fe669bd5044a90c3218f8c0849fe8f1b02dbf97cd60b4e183915ff51ffe5dcc2e0d5d653beda23b1ceba39d9ece60903c1386e367133c6fc1804e9335058914964b041564eed8118f65b96e94f98f6d7d05c15bd9c596498426a87111998a5ad2cf73d236f3f7b1503d0001ce611e9a2d0ef44ae010913037235d455d1e3a3dad8e15e557bd2edc79ba4ca4ba050c8f79b3b4b1ab85c360f9b5c1a04cd428b5eccd10ee79675977ea61194d52b299cda55c5eb80c49734255a3cd2c894803f81b62ec7702e57d54046091feae5af06a6fcd9b36c1b1d1ee08ac126b2fcc66ea40a0e3814c7d473023be4ff195174679b5a42282320cf95915a8b2a6ede9641a55ef4ad45cbd91d43ae0d924ecd54c310aed3586b17f76765db96c9d8452e992472848539fbbb2f7b91ea3cd7c0ec82fdf1cb0a56bc2c07a3c25f83ce01562598cf8d43871b92aec3fc17f6f7677193b264744e1695e7c8030e6b7cf78b71dd3132a98c1cb71064326dafb6492b35ee5f288503020e2f9f57e2599bf0e7df3d6dff59c55e488e6cdd350e749669c9d7bf98eb0da20707bd766a3fe1017f0fb30a4be46eb693280a1243d98dbd18d7c5341632fe7ade366f40067f75ffb9c96eddf3dc5268a9160675c787b92c6e462de98ab993cc5462364cd6d2b3a23ac3741a711914151520348db9e6a880ef719f2a11928e4b6d3744327bcc1522034a56a80d6d3c5efc018c1cc2cc2c72e1d67f62dde78fbeb5f3b75660136899a96d16c47ad1f60ec994576cfe486ae81c32be3b408b1a0b437c64077c29d7fcaa4f0594c2a6fdbaab23d760216fbc73d4b03a70dc05cdf79f0545890c74678e7c36e8e989c97259212affc9d1d4efb264628c3d6c8e4f7c9350270614028c7fa2d6d9289e758848109305b76c6a9967ac55b003d4f922aede5e008ce296bf2c6f52b482e28d9c78fcd2087aac33ff8e5f3cb65db9268fbf2c472f3ad74f725eb6008e9eece1dc048ac1162ff228cc05ddaa4ddbab7f9da1430c3dc10f98f4f668185ade23b507093b0505c767188b8192de3713ff3c1f91413b2d6273d7b0f72574b7d36b744c6785f229964d857ea391f509821c55af026f496faf583d73c447a6c9030e9a3c55c64a683d387971ee6e1d6105aa36f770f27fee7d97fd34fb972aeb096f1c7a6ff35b3e189d34a506e8f47a17dd1ad66138fe3bb1bb8c7e40982b0068d727c06ac112d2cd6a338e19343f525c573b07b7c6d7b32814e8102ff82d751f08b02a52bd2b17ae7bde45e1cd77ea4a5754a5b442ddc7bcc2bd1cfb193f0fbed41aed1c9790af5288b53aef36a17b837d646883cbf110e43c7b39b3963bea3a5d12fdcdcef14a8cd39cb0c8555917e30702093fd19f864abadeba080703c0aab008d36b1a823868b891463a3f25a52e31687e1bd5a5a1487918518b743095ff6ad8a545008370c972e4064278a0fb083c32b2bd8a42a7e7119fa534058a3c8fa7ba999eb50a893a490f5d4b10ea4e94c027ed466e34e66d28ece57d1a2035739d206e1aaa1b37f3cb3e84119cb039588a635d795240164e9fddae3318d78b27f90b5a9149034edcc8480785fc34a0e3b8d09456961eb20c23414a25234dee133c4990ec78ada8779bf7d21fde590b48af7fddfbc31abb94679029a87bd4967f0315098fdf60167930fd6b5b5710a4806684879d70894ad8192debfd0269be3c606c6f97f689e359f10fddad1b391437e1d9cb681fa52e8a0acfd63411142b3364067b63b786eaacd10e9cca6d5f37e229ae79e2e8af5e83a76f4d670f253c9b88f52d2b390c8dca3f759f0adbfeab33db221a4b4d11945a8732e78f70860d22848d7afb92a42d233159ac9f3283c2e0ee78d7f779361c2d6d40063f171dab81bd6b94fff2182ae21b1a38d787a960de8fee426f38b3475d5faee528d873eef395d8419c41ce2ac138bf960a682c2bcfed19ccda40256c6992cc677192cdb76df223607773398fbcdc3ab1ac289ba0e7494c165a13739992ccea553f7d58fe8be44533d17eec37dd96d9f4cf490486567c29b03fd1c290cde96bfe45f0291b07cb2755d9336c39946aff671a67694f50921761c151a8166721bdf8fc34c850183a24e00af223e0acc9434a505b115211d0cb3df2d489ef3f147f016a7bfcb19c6d973b6c3cd335f931c9499e70ad2d380aa2578786ae98e719446cc5162729d8bc6a9b4132407f926868fb395557ca773537306aa2a86c48480768639c2d086d5622b2e5f26464d1992e6a6e5a4aca12e012a5ba889d53e461d0e5f86fe8693e3d2ab629100398c503c6efccf98bf7d8ff2c335748643e8db39aeab9eb4838e3675e55224b00ede60b9f63d08264fe38bd5357f6a8d727f60d8f046bbb24075ea302c9b6a345262dc7bef92ff89cfcef0d9d1afe5fb81bcc920fef34a7e9f29e15a16ffbee175b5bb823ca346d953e76667a276b021336c635631a3b31814f0b69c66919907f6d13e383a911a451ff33b2ad662175ec0037780961bd69609cfc0aaf627a8ed5343037006a6a2cad7b6595fcc6b9d0fbbde03fe5d50b548865b8144d4b7465981fe973ad2d661b9e87b9891bf45256af1ac5f6060ae4afa4d01db75d27a0c1fad49bc270a03a0f52d79c84332502ac150840b5259d06b7b43694e4972b16743ea3a3a551eabbe64155f75e324240cec434e0928cf7c03cf9f07acba32330949cdff426c7d681abfd6191b300de39578ee7ec880660223d5624523a7c0618b942d40d89d5227efd251f771e23619f79c74be5fe9d1a7dbbb8f1de2c8bac5e181099f533ae753e8fa69e703d26ede1ab3d88b8153ef204959826a2c65746156b74f96de4a229f9ad0571dfd05b2929fc327f02d8f90cd4a1b1322a95abc923d621c63580ae964d6c57a03044dc1c7829cc041fbb9b5d221379b4c693e3841118f184b253e770e9314f6de2288fb9bf188dbfe0a76141bd99f3f4b286d1e98c47b16ff117f5db3a8a9c3edb61ecc7701b67d1afd05233640ff7d64e7e0c171d93184215c41232bb10617991b4d085c7df7f2b81e5f78d747db783cb96c3cf7c56000601b41c3d9dc6b01e05307d8e5f468168d5896061d17d3636df256003fc5666b11dddf62d3c520b78cb9db0725312c373f084082f34b7325369f3ed026f3c088d18db3f13d6dab320435c88b032736a22ebfa4da3fe240ae2470c883ddfc09053305d0c3e074de804c67f09a0ce53599e0685851276ae3e22aad0a80c037d9e2d4e651c91e330cc2c9761db6de9cc4983cbde0f71bcbc89b312dc7091833f05361dd03345d85d623a1405eb796b9bc68f87a3af23a0e6c6e52c05b4950231102c7b43b9f393f8e2332142a051e8132684b80c52f81e2fec9c8f2d39bdc70f858ad175033709d736115c50a33d6440becb009574da32cb3038afeabb088dfa4e93cc661839554169288ca930bdaf6e43dd29f7ad5cebb8cbcf52e83439cf60a222284ad977adf9dd21c3539492a600e929b2a792a213d629ac9d8dae626badfa5d18a6e1c04a4ad7ef27c2d9119a5c803ccf40838dca47456843943ec8e655014eb8406bcdc4f79f4d722a1682fd98905808d16c01cbcf376c68725357ed1be9c1ae630146ff10f625aa976ecb5d67b9b3ab25a4332c1a4ad57c247ed5be980840d8e2878a809b10fe294f3e60bc459ce9a8471e405a453acb7e7a10ed69fa7db5ade8ce2a712c0db87fc9919b75dd5afe8d6aaac9314e3635f2efaf606e83af39feecfefd42ccf0bae9f028a7f5586613bbc9095c52ca8a9a16f43728ee4d402c005d260295ebf0ed6c89ee350b03ebed63537e2abf27753e9a97ae125d9ac2aad801ef4e17f8de3c3ede27baf2b2e7d8ba86439a5ade1cb69877f278bba35d33c31f1dbe679b7caaffd7739d37b94786a66dba3b3b16a71745ef54bdd93f517484876238a1c62a16cf317dcf14653f1812800c86f2cf2ebedd1d6f3fd7cf4787840719340fbc925ae8a78ef2b38f710f1074fb6da85295e5b168c2bdf253df8737458ad14b4e092752ba2642bfc479f0841264a5b60b1de6737037ffd5f14d3b87cd0dd58131c8ed6978bf08d806b47570ec8311cbbb39f2a77af8e70b01b99f79f8e7dfd074e5264a8ab42d6f8ef75b01aac17fced3db902a9a9dfee3b0411ebc189dd5f5e8f935c58aeef4f87fbdb43c6c3a70c44db4b0ec5b046ff68e0fdb12c66c5bd64ad629516c45647a38c7d4c048ebcc20bd4b0f664cbb886c5defb56e93b6ffbc22dd26fbc91bb711dd34289ea9f663e5e4db65736fe52151b0faea2587a5944c517d966fac48912dc48c1aa21edf5f33a2be21ca375b0a70de06362e210a97b7af071b436daaff2b4fac97b2385b5d123addaf81c707470800338c8e2b91c9f25955ebc80344c7fc069b1d6099c1914f6e0dacb3d0c14cc5e88e11553585d25340a84f50317384b08679e6ba3c199712d74ab63470cbfd179406afd3a929b4110b6eb64775f4d43a44d25b2d706ec5698bfadcc946b77d8f4cce05657cab944af0b0091a1a1e43df054403d67d907a35e10ef2466539aee5f1978dbceaad8ee871b3659b862cb4d4b749a3b7058b1f105429ab4873d2d08cc3fdf95568017d8b3d6207b6e10bbe841df9f04deb20cc67ca0549dd5a293628335dbdbb01a935eda5fba219c2ff9db5e910152079642e4ec320bdf06816a413990aeb538a647c5e7962ab4a9d2247435c9e8cdaabd56ab8dcb100b84075ec8dfafa943fc89bb85eef1cc1ae33bc1759c4676bb9dfd3f65dd267ee52419725c5256186d8f31cafb261d8f530c15fef6f5f8279fd312faef504f89df7e8c3e3ffe5e46a7836845a675b9c66787fb788a2118203a06e4158307f281d39df1f09f06a1040fd837c704026810f0fc4ea6f935ba2d3a3dd058c64b019a055f32ad40b1c741906280d2086f319722e9287aa9c2a1af9ec9005811b52f323e1b7c7329601945f5ddb7d16d79264ddcf3e042ba5fb3d4e0f78d9dd6fb98cce4490f2c225aa51055f05a20567500fa86020c6a9a1b2054cbbe1fe595dacbd73998592780405cb6194f9139d1e373877ae4a6f85aafb87dfef427a9ccfa14bd4774b2e1ef4d0ba685df58e5d7059a9083f7b3b2d61ff1cad13fb432191b280aaf813a94f593f03a5616b9b67eb552d14de366589506cdae7895f081614dabb5649d7703563a24911da4ff3be88ef39497c3840311332ed596134acac5c6eecc271bce8fb81ec31cc8fd4decdbe93e9b6e8367e1cb4ea7b137f4ad1730f37ccb17d34c6ba58a4bfda5b410dcba06659941e2da6b9a0b58fd1b3154f8ed5c50e6544e11a4cfcd3f52ff3c34448c2f5fc12dde6bae13a6aff49ddf4a5b02ef3d80a4914da1ebdecf05eced1a36d801923f5fc03ad2b7dfe8798dbbe1892c2f6b2ce6ac12565800f23166266a34b28dcb2445f33e423b4e5dc72d33decb451b7aa77a238c9953f665b955952699edf8f742754ce5372f905929cd0d3e667eb0045ec63c18cc97ce953b2bc53c10da228676deed336d37131ab160da800637b29c45499bdd02620a7c149e17e65b2c5e150ac0a0d31fc2f296801c4281b79268505cc980038e32a36e798439d1a16463fde11d55f86a58555a22eda54487c67e0b529e00d6aee013e709987c574dfc84fee2dd5c8d7c016ff079d08ceeb34c7c162f72f4cf810f576aff437bebb5cdf7612f6b0eafc862864a537cdd85e195607e91ee084f9243b0396f24d21e2bfa5bf55fd32c804af4d2ac9c8efecefd14d48c37d436d09937fe44f7ff8b71f8cf44fe2610639a09360634f5f7194cef7edfe43e63d9417b5e8e340332ac8606e0f13d37b642a768bbb3216c5e1022c20e4342e84114357af70d09a637a0d6707e247ce891e0b29bea2152942ed6a5c1bbd9ef031842e34f597666062039f082fff5f2ef876abbf8c210e12c68dc31ff9442b1c31e760f1ee58ea336f4070519f297fd17627adf6953e97dd35b7fb252df1fa86b53ed7cccc16b5620ca6c2514ef61193ffab06fd41659590fe9e43423994e6e9e17fcb6bfcdf1074dd1f6376e7eaf3faa20c14f16f4b86c4fb418eed02d2d9f4ae63def65bb2cc1d9da7e86c8f2cc7488791dfdc86ebcb6a797f8e82fb68c6ea0f92191af3f87099e49ab8b1828051fd8c92d4550f6ea4c7b9ff6a0dcf2beef4cae9ee5513e76a9372ac0ee17aadc0f687b5d40ef0f8b6ad867282ab0ef04eb05b9a82a08c6eaa5aaab9e5cb2589978012ade419fbabf88c316e9d393ee3b9dfd1189c09a45fa4e40dc1fd787bf6459853989c9551edc9dfd064efcb4f637780ed0cb11b7c3c309679dd6c56aca2cc7dbb9c2342c6036c34dc89c57c3f101f8d85f9d6d59cf0f66a30be53af0d677fd4f69f89b2dd2ad299527ca25bffe9cf43f8e77de17bf93b1459bd9305c1d55f7ff0704f087ff32eed358856119e8719f760036f7fc4851233b6b3d8dc1359dd5d1184ecade4a92904978a3a43523f27515a5ce66bea03c7cdf1b600f41916ff8ba4ce63d6879165367b415cf5c097e38664c0be38f46933a063daff05b0db8cfc265bad8742612f50ed608fe52249ccb8fc4f6a2f0b17ece81e8758cba9398eda40c0ca35a1a179ff32cfd7a10b8389a7c2b5166239cceb93e82070ccf97d596d7579a20a62d4253e8c16e32499f8a38f8633583f690c64b81016a9781f6fc80a07844ed897fe72449cce45ec09b7c5c8eba63d66a2045e24ee662980463751a31dc745c954545342ea31ba987451f70709300b79063d4d3e46835e77298be462a1081cf5468cd040204e3df669038cae8fc6741d994e34b85a7bfcd11280dfa46085c74eb2d624e32cd09fcbcc0d0e9fbd45e964af7c6a02b56c671293c48a5a82ceea17e14600d6ae368823941ed9fe0285fe88d808eafd9d1bab0fef601aa76774043dde19a70ad96f52585db3617bc9e4e1bbc00b1a0cdb8f2ba780ae73b80615d3f46c90131ddd3a306dfadc334e56386ffe8ada1b7cb41af9502578bcc2812bc9188c77635755d840f354cb965345fc3a28b6fc0b9ae048d405171ef363dd0c1fc39b02ac129360d1653b80a685d80a8d2320cbc6513481ee499d40af7042c497753a25b900932b194b1d685f6982a4c2796fce0849a6f2fda0e92689db0c68de313e725409732391a4a0046a8249cb42068f410f4b96b9c261972474549d415e8dd39837e9e82bfd9dad509bfaa4ffc079207abefa4fbd44d2e26447ec261e34504a8b55c4ea7a467680a4788fb70544b3a3ae8e1eaba04e54d34676476065548d7dad0fd190e1ad42e32d6c94135d3bf98f8f816f536a30316042cbfdc76aa8108190369a52b8ccce111771670869d057d8976d1699c3fe0342a38d7418063ec59d9099f6e4521832cda1b94c7c086da557c22804bf07bb301719dc571811c99970abc56bdbea7a34cd8b18326e03d00974fc48813eb40e203bbbe72dd05f4ac27a9538e608d326adca51ad3cd1aec1d997a74b3b7e9f73c0a067deea051d9316684e3e191cf8c2ac8cb4f596e832ba6831715ab40b09d5511304078918db121e1330805b3d95190a3e66bbcb4a34db6244868b5bf3c308538ad2b300796132f9b64fcfb3f4c00ff13f8f4caf8e8c8207a6c6e1536ae879695f17c061eb6bbba0be947fe075e4d67763213640174ce645b72a434f4f3e0c6c1ed3d937b3592beefe7695db9115fe928372fc8be17a587433db8b5de59d6ea7fd80a24e04f48b0e780ae629bbc4a3ec0f0b79bfc8f3639cb7e3bebfdc31348870fee7f0c0ef573b680e80b647c6dddd165850b7b34e07ff6a4e00b36c338e7c3492f4784041937d983ff97cbc3a08bf760c00d7ae37f41d9c8d6bef0161acf7e2a8af1b2afe7ca92b140a5ae5a57d531fa656feef083190788ff5975780d2312503e11ba792d921b0accaceab9b7e7537d522ba063f18e7ab543174b755c2d6fb70a40de667ba6118918221758f0e06dbb9ecff078edf2a5d7005449d877fb553e087c22e1504f3896bcdb22ba8630889c3892c0346c536ad226b3e60217341107b7ceedfae870ff8500b047b60ed60f868b6d27227b83b68a3d7055d4507e79e4b1997becba2e6c17e50dd697b99dcab7c42d9c5f4c39646e714081b77b26a43f3502da129b6b0f59bb3a0b6508e0f9d50ce9010268e2b24201e4521cd71c152b4322b9300c3c05518bbe4d7c93534c385294011c00ae7f8cc68432d510f0edf4aa121f24a3cc5091af801280c1c536e928ef3e3e4c4fb22b3be74996cfac519e7debb9fa2b54453cf86a62d85bb6fb541134ca8161b5e0129135033a0dd9c5288fd50f5d331b0c20dc093f73c29335bc7043a45cafd136e5b4cccedfe6c8355963e36bb8a6333ce035a1ce2fd57a05e5a332c3e9a36f8c3f5c019fd84226147b864b3556ccdfc4bd520fa483bd57c395e8f91e8ca56d1fc45c4217da54ec92539956446894ba89677bb0445e9c9861268a71da8bb09eebb0fcecbeb2b909461010e71f9a48874b28268c7a1c7343c38579621bebdd160eef3f135ed82ab42183f9318f319fde41e09b0eb1604e5bcae2b0ff6996415098271db9db4f58e15890e15e0bc16e08d9575cb046d2f5b545740cfc543a60380630f842f3ded9ba57184a54afce5f9bcfdb3081a7ceac8e8853d31a886148816ed2d3503b5aa12d11520d17e62594c19bb3805c7ed7b0e488639441466e61885202d987cb9dca55529d738f77289f093fdab7bc958e7c9da35a38ad40157f77c11b999b27e75331e86d21eaaa165355f4642335b2b921f98e7a94d5a4cd3fad544a522840ddaa6b8487a4d6f051a7d833fd1a02c1dc5d33e5b100d3395a0ee6ccb49af4d16ee6f17e8e704bb17d828b3d812caaf5d0e61a5f105fab1a9d22e5b0d1f77a21b1f15427ef6513d118adc17f92bf215cc05a5fee8f4fca48a6152c40c948e59462bebc010503dff0294c37407be705ea82f75174ca2ef23139c78c2a5b9fe5e4025143f3b1bc6784672628733f229b2900586045d055681be74ad1364688621c912a25d3468c42ae54ebd32ea8f57f10a1d92384790e5461386e24cf4bbdbc854936291c78a94918a2a98d4e7495d359ce3997f9bc4dedc51b0cf471680c8c06227b2a69ef6e3075e7d1eadac7e7c1228cd73f82d75c78783ced002948a6d321774badede47b7715e9f5d7c574e4f00eaaec934b54447cf60b0d5937281200c10f93e0ba34c62d89c99fac6a2f72d50f5ac1c4735f1f7ae3dcdc0b9ccaac4c0d6d559b145043da2dbb7601f9a7c81c919a14a0c92ee35cf0eacd07df77e37cfd1a78c312f88ef9f95bc10f2681d688fe7f57e0c126505ab2dfaf830e4681ed997fbf0756d805b646f9f88dc00f8340ea18bffd3dfd895faaf8fe0b5030919e4d5b1438494fcf260a46d27b6a090ae9582c6578b5580e0581ded572325f77b10657f3b8a27ca74b9d360b5a5b93c77ff34da8f240af061f462c35b0c32f135316b33f172cec77846dd10f1343b407c6b96ce49bf871eaca36fe6fab71c2c217d21cdd0634d5ef4bf1d4cbe89a9f33f457d1b647289eaf65af0f57522fdbf6aac23b6fbfe5edbb6fbff5e6776f7bf3def7df7aefbd37dffce66deff2bbfef3dad1cf128198febc61a33feb5feff6d3a3e2b7f8bdfe79999166517888ec6c8163e1f39d38783b1451e29ad229d75567018bacb1cc0ad6ac65c92ad6596289d82d9d5c1cacd138c062803a091fd1b508846b8b0ef6107e832045fa54d64be2347509838660e5de50adcf4262c744ebfd4987c5d7dab1e690291facfcc5e72d09b129584e89bf807aabd84270c0ab7a188ca64b3f211bc27a20880ca0e61ed380ab1c8020c977cbf1b33e4a744a33e73c890cd689dee9f5e9a34462005144c96a574c3ca9c6ad67591e257aab62e8a591a7dc1cf1b17589fb5b30230945a24986d5d8e1c3a186ed600867e68567a9352478635f959cd8ca2683ab4d9d7994cf4c0ede6f9c511c75e6b18912dd5abe9bc28a5bf8254a34896dcf19c26e4c51a21fd5f45e29621c66aae0b985e80a18faa844db4fb73ad4933ce2c4e88e53cace2ace9e94660666941d4ae4e0651a11930f1e1e84245c60019b3b710f10a8b6dd7fdfb1fc62b993d7a5e2170658c0400e447009e8086e6ab8f35c1b184b4b51327bd345ad2be9c47c5ceab2044a33ec9d75239fbe084e7969b85377124d104ec810947831710e7cd073f695d284c7263abcd0f2111d3919cf1922925ab6045dd1416e3c9ae84ba671e27a81e9dc39523c3528dec0ba5ab84c3a0a204570bb3cdcb87fc373ca835a288556c80ca7cb0becfbc5e00b505f9d4f04c32be0e614d863a5354a2f4de17f5f6275c373477792d6b58b19483fa1b1a80efa7534c722eb08cb696769bdf28e46f183799fbcd3a4e2dacc4c0431a3ad1f6218dc2c92e40f6c6170adeb0b6461a0089a17d66e5426be8092c2e0c896601a3825f04cfe80c16d0d40ef7eb484010d95360de4f69c8504c683c3819ca75bb2667815e0f2491883893a0210ffaca92287a98c1654df6f3317694f98777d65178e330c08c46393d02018b9e156dbae3ce3535f0931a6358cac87d839ce79c8535b6f01e706675944450299ee94343bc17880d05087fd3a5c649be4be8f5a777f1d500cc6ea45287f67d530be24996e3e54b45d4ff0a6b260474a483d7dacb2cbf3749530a024b45d0aac7660ecd7644d17001c123e675481a98588a691b3f2386834280f59da60c233071e9194adda5d23efd03c718536c42162a1cfa160382b505f14427a383ee66b4368edd27a62d5c915f981fd4fceccaba288b5c86fbcea310bfe7025b69f610b2453824d9ef1c28d1d030356eeb3ded8bbde5f405fe3898f5ee42c9b2c1488279b3d4f53a97c2e765aa5393bd305c4f7745aca31a26a4a36d64255f06e64c72e05cb9f3ea287e7c8d445a3634562871f46e7724392689f81e0dc9a8400a9bb125123ca20072b36b558444e5eb2219e9f433cf43d6caf40f19ba36cfbf86fd370299aa5ddaaa91332f029f2ed44467fbdec42ba4172d1e9a2388b99dd1b6738e02f950bede874d173b6b1305b58757a8664cffc953ce8f10175b12ff8dd329b22d4452f2b072bdc23128df3a0fff247106fa362804875c030000317eb706347c08ee6fc1e84d1c085ddf60d1f734a71aec5e62e2704315d87f8570b9a2fb0ab29bf820571524bef4e368fb9795d1dfdcdc53b955cf9c592731c02d9512ced812504e11b0dbc2385afa1d075d45e7b61b06adaa47b227e0ff3e309080799040d1aa7783d0a038509b1b0dee0d54d03d9fe259909f4b34b4884a18d5a933d056a55e04fe3529c317883412527b7ed5ced15d0d611aa8556c1805c8ede821d3cae944ada5fecc000428db07f176038d6f63a993704864d9c7e30e1ea112af8ed4b59f90360be3f255c9ff000ae9d98fe866321b087a72fa2b159b5eb3ff2070aec6a4012add92f8cd00119ffb2646d235ca16606ddfc181ca012fe609c51620b2c55c40ebebd44744168a4db2fc88c0fdedbce47f73dcc031ca8211fe3ab0e0525a81309fb6ff522364ade80ce35da76e79e2a9af00557154742a004c3e354e1718b7d231ae11a354723e560a9d69b81717d0875a99d9213f119e7cb23810af267d18fc5c57f8b6bbb8068015f605ddcd7328fe4754c404d5a8ba6ebbe9235954f6922b202e3e4e06c210445cb14280cbd9f66ed3a1bb72a9cd0a1745d45f34d704addf6ccdbb56783c3b9c75e0c8a7b227fb767187a3e000b3628e01d8fdb3f892eb5ea12434a9eac4eb05f5d86298197f1bb7e49106ea9b890f66b7ffe5d30dc7101c7a82b684bb4b40801381d533e305bb8771d8760f4bb0012cab534e114f50b5e6d3788f6c70e27f92ee353a4d8f50db0c557bd23d47a65c693bdc4ef78e191c0554f0962dc25dfe45ee073b0f44ce2aba78931dd926f72aff13b5c7a2571d5d3c5586ec96fa957f81d2f3d9378eaa9626cb7d4b7b4577c8e96de495cf53431a65bfa5bd62bbeea635429a6c34e576242c20e673721732c893344b2279602a6c6b57e103505ee7a1b4ee6fd7055d1dda0359fb6bfeff4895adf2c77b4dbf497144fa1c58fc95ea4dc35aa08eb7dea5af64afe87646f52de1ab588f136752f7b29ff23b227297f8d56c4f49eb895bd967f2d3c156df31f389566fbd7194095b9cbc58ca2acb365a159734d1f885a017bde66a7e93eac5ae83ed8ce47ebaf775d92d67fd635ea66fe49c6a768b147622f216f8d5ec4f49e72977a95ff23a99728bf422b627b4fbacbbcca771d3e9566fb179842b3fdef0c48d55ccbc24cb1ec99b5a0a9b1a60f46ad807bafa6a3793f5c4d743b68e5a3f5f7bb6e52cb3fd31ded36fb25c653b0d823b99728bf862ec47a9fba95bd947f0d2e956efb17988ab6f9ef1c4895b94bc50c91ecb9b5a0a969ad1b445d817bde46a7691f5c5d743b68cba7e9ef7b7d92d677d615e536ff25c65364f15a786adad63f602a65ebdf39904a7397891945d967ab42a3e64a2f88ba0277bd4d4ed37d78b5c87da09d47cbdfd3e488484d43c96673ed51d08216cd59266616659ead0a8d9aebfa20d40a9c9b2a293d9f4d2b953ccf8aedb575b6ad66bf43d05abbdf5170155dd3bfc1edd0d8cb70c7edf4398e0c65de942c31f40c3610d3f8d7bf4706213ee3016322c1c9c3cbfa975dcf37f8cb90381177b897125f93573825a6da231640720901e9434536df2492cb35e66fd51771b5ca510bd471720489b9854011eecea57dbea99758d0cbe7018a0128507ab4fb0a627d1f83f806aa3cb4487257a1b858f21d66289fd203c2fa57994c67b4d86782ca77d2cd2ba426c5dc50b70df9a82ecbd6c00d89399d2cb1a261367e2808b25755ab11a7d5154be0e944d4acda4757c1d7531aa94e2823a06c09f61908a0349f5268df9cfbf3b70b97afa0bf35768eaa4e4938734cbe2dd68070747b2b28b02c3d11d68442f705f1478a8402e1bb5c166cf8857add440afab5caa1325aa3554a8534ec4f8276ca2b21081e03c413546a707b5a60cba4b3adad8db1c2632b630a31c58880d1f86191b354b1b5b0c44a0111901140f0dc602eb90932cdd63921863490334bb882534dc68c356bd79d2232091538016b6b6a0d5a7ff4d309ac0f69eea74c0b4e720033056a6c734299a4d7ea7900269861fa0e53ce775dcea9a94bc343d39adbdd17347f6fa603181b28e08c47014fb183f827cdb1444cc9c0b54a6a5934b981fe1797612d2b1ead2b7c9801c6953a3e2b97172c71afe52df5b1ea0f12d6cc798db5d6d691c8d70c6e10fa4c04450108991e5fb13158ae054070cdc486d47c4a50200c9b4c011032cc7d45c6bbf7f0675724653dd82e07ef0a419aaafac59571896eaf248e80db7df95b4843e81256c00b6c5a73af8742ebcb672d1b7da70e5d41a358b588ec7d341c2a73c0643c0bd307fbbf779aef5ab610b20e5c0177a9007d3b044db7cef35f4ffc4fa01998462e244d47e2145be31bbab98b8357fea9c0999c1c84e5a7ea57701fdd122bc21865a0940f989c938d8ddcf22bff032b41397340bdba126334fa1861d2d821b6aa1504cb0b4e2ab82878bb9cd151b0756d03cfa40bce9d06ab4ce016ac687381be8740e57e3162d9179cd07446dd38b90bb85711685cb585cc723f88188589a5b3ea976cba3e81d5fe7084aed9288e4013c90e01e0975699f0411c5e13c4cf62bff317d35916da2f191cd78daef965e8140cc39afb13cef616d1e9a196c7548e400b576392a57342d22c1292e642489ab442d27685a43f9a4c0730a898ad425604db8ff9bf73b249c6cd181a732407f7abdd7647fc7db8ab24f989dd66e84a391e66f4f2ac9a5d08ecabee96d5bcfb14245f3457a82468a1b1b2aae47858737e0df6e379aadd0559383193a80c589064f754b11464693624e98d97cf261bd9cde4a367818981470a0cfda9ffe96fb2547f98177c99ac1db79620d93f6091ecd212d34352fa3fd594207f9081e33d58faf843a301d2b7a662a5604180c8507d88144e90b1c77b0813f16e52381642e4413a9b95211acc8f362112897744cc67259bb97b84105ac930788f7819ad641ecc171a845c9a05f536600599898e025b0d8d66a5f9ce68625d079a951728ed40e5c5da8a062e15149ecaf3583311581d7769e11232676a6957785d32a5592900568408f7f84b83a2219cb30b6ba15e5256528279207cc41b4c8e95a2f70e314f3e1da0e29fd8397e74708f6acfce068a92db8e98fad0ca7f5575dd1c71112ffa7a0a6e6574ec7b83969772ca8413b1436cd75dae1373720ebdfa8beec3de931a21d971cf8f58233d695f0e59519914db3025e67c2f598aef8506f813389c79b8a6a88d4d338e4ae45cbd792e4661f5c127381e1795d0c5c3e7629e74dd608691d8fb5401261674cc38c8f3325ce8c33f6eb38f931a5c725d68a03eb9bea0c5855e13b09ba6caabaac83135c13819d156038850d78753b501a19bb3ed4df02041bde9b9be74b824057eb5670e1de0136a92baaccc637971e5616ff8e7e9cd7d09a5c1416d7efc39c8f92c635b2b84508ba6f438bec09810b569409a675842aaf3ef0886fdc74159ef9ba84a15fe2911314e3d18d1553ca8925029c4fa555cc4323130d8d34fe0fa7fc8bb4a364b9cf1de2d6f60b9288529a7a4d9735647ac4bcc46f0c02d97e37facc228e908e596e6f694d18ddcd6a9df4d7253a67f4ffec04e919aa54a18a2815c495b654e01e57f622ae6dec4916aaaed19aacc6d2049ab6a5d2eaaad8b93815a62fcecbe04ec3e3a935900fdee12086437113c9bb3711937752f54aee74921fb1b6989d98eb86c0edf64513e35c38f6ac67e751765564dd0cb4b4e9edfd6a89a14e7bb2779e36db233127172e02123de3c208cd83d84cd893fa95e9c236bf6c609acd9528c1f26fbcca9bf50af5237ebcccb29d192da0580ea719c7039fb455cd40797eb2e2b714398e727f13eb487d637bf05f1ea5fc419a06104e5cdeb669386911995dd6c7c6e259ff066f8921a26a25bc3a449ca19c8bb6dd8a8c25f592acab722a6007db8bba0394c01a62d73855a93d5b48d14ad18ed74da8267b82d425771e3a488851c3cc1a2ffb02bb977e29e14f153ceef59bbaa376f9e8681007493ef37e3414eb72402c3500e1f7513f163e2dd70c1564f5bd9ee021d0cbf7c45ecd93d7e6d9d64c478d6a2d617b02138168c253e059b686e2602a62586a247841e1f68259efbf874ebf8fe03c7302ed090bad7d430b9b15efef421880764a98d244556a9a132b86c4dac3032d01500d909fc7800c70119758893d968f0510696c6dafa57d8c8ed016df964a07ba00c62397fd74a0db015936b48efe2289c7ee24e2dceb6abfdc15924bafeb19603cab1891b0d2b24fcf6526d62d8090628655b0047ef13d720f7eb55405cce0cd0cae5c1311111fadb579eb1922a8c981e310a27ef83705537da3fc6c08b90bb42584e655238624335b594bb66cf75e3d095a1b97c9ea4a36755cfa3f73bc2908deafa2f20d025f3f82f50508ceec1bf780987ee332ac02432d602673eed0e711e58860519b2940112d72c955a2c127e8bc5790425c02ab3f6671a2a38931858c652bd77a58d170862d5c3387a24d5efc193251866598be6b43209ef339299b51b53321c0877d2ea084bdf8fd6e065cd7d796585f0a7256e8829b8383299960e98d82a51de1ca0377ad3d4c4e12d46a3b3419850d0a6aed9598da48b7e12cb71dcaa74e8572ae71704904816e2107e690a9913a98aa2dd87ed69800dc08c7c64553e344afd59ce742c1955005af2b1c4d9d87be514366f7f33fc1a4abcffc01699eca3777b10b4ee4a9bb10f2e794db3f85afeaeda7e01ad1b269b07a6766e487c2ee24bf4a4db43183e6e69021bb3f667f0801b0df7f1d578dea61547130968a17fedf37a181e4718668250fa42857258aef85e48c6a64691a9a460858b4690a9160692844e9941411d2abdb2dfde444d1c5ffcf0069aa3f8880c60883807db47193f6aed0a09b4d2bd9145dbdeeda28d80afa034a283b26743308030b181163ff50d7d96b675df072286dee075e3f64b284209098d6ebf5e8225845da2251c4a66a54e56de58a0165e42f6ceadab3aa2105a0da292e2d61f92598fbcb45a6c8b1c396303e9a12839e64e7ac931e60e847d1fd866bcda5d5c4ba3e581fe10ba99b4a45f40e3fcc00204f72c0f745932d052e9a56d8d524cb62230b23cd079f744b5389a35825bb9d2a9aa3fcfa197a073d15b29cc197191f5a9b1bb353b584328f6ae8712b41db5bc0e3dfe60fc746bfb01c855c4c7914267de9a429c5fdb91326ef0d4cd843e4c49721027db1655e7c099e7103168d42f3ae8467e4d788c1d0874294085307499503473c9abdda33a6a61a32aa0867d8fdaa0196db6fcac1f127ecedb00d2820b514844a52886bf6ce3c4d3c47a49dc6032cb29c953310160dd615038943434a478375a7ba90e99a2f8c12611e7ec13850a1ea4a13ef60c6e290779e657feabb185669a835311b6c0235c2c61b0790adfeaa8890ab762ebad010c10db58f84ff0e1616485f87f5609a2817a20a149f3678ae0580a581965e39f562705da09882fe6433217f54f8b64fa31a3480f1e4c809c907d9e138e9bce4404ab02bc55300d93224d12c1c53e3e3c65334720b880a4338904f3f2b8b5a70630118309c8cc6ad8f649c409e1f5f94de664d131a1f3eb724d1d55a1e818e4bcd530729de090dd3bb080d0a45dee2e09a84f5474a03a36945f1cc3ae34baf7cc706649d2cd4a9de4f65c7ee679ccf78a2d5ffff4bf4b595f8e9d5584a255279d0d99fd6efdb0b5c71292c927bfbac515341d83896401f8ec02b4e22af0dd7fb6ec79def4b7321f7f7245bd6b0831e2dda1c9a42f6c7930925fc612bd439afb201b32458555825e085aa69119e11d28370ea8b62c4d40d96a7990010e6f07ad0e9ba6fa275d108c0bfe4df7478be008a7438aa3de44d5348b514e034934df6d4980117cbc082aa112fc260f4bed08f7206cdb71964a971090032d7bb4652d9fceb7bb72337d7ac2fd32436d6bd209aeab38e5d6fbd479e1cf5b426cf59364e160b5f806dd8832917ff2c71cdf9f43a87c2b2c65942e2b13b0df944669a0eec7422c4e94587be9bcd00e955ef4ad1dd324fac0d2584393249e9a9ac80c67ac5b205aacce72154db281c1c554a3dcc3412eeb8b01303d072968714d7d656b9d0a180ee11df4a15bca936c8220849fad013931fd3a72aeb972a0fdf2aa45a7ea1cb83b69e7c6d31bf1c622354220536823a20a72a529c8940254b969179b44a29ec5a87ace8971fe31cc479cac16d575dd109205c7641d9b50ad5e83adb71c4447b8eb6ed9a6eeab69f8d7ff281444f58c9074d029dba8e74efd721c710609b7dc60f801d216738163b888c35e37a6480cbd62eeef63e0933da08f5591416daf58d13701d20530dc0a2b3c1c91c6b6d235090017486b0d537056ad70b178612cede01c81f03e5acf1e802e775e74dee04c0483b28b5e71605ae95565d94e29bac16984e78277dc5115758e48c5a79f7701736aaff7ae9e9d68c7cdfd738c004e4e3a2cd5b66c6c8453260205c777a3fac2596b397e15d56cec5bb23685f23255651d8c0aa4005d377b7307a2306de98222560f449a4f16df7a98caafbc624589f55292f8d95631cf571942f8218cea79739e46c77a8247fa669d52bbc3eea686abd5691ba2f13a61cddfdcd80a9fe37f481d08c6b3d60c75cac448e3605fa10fd053e68c0059ced27e5f2798583f84372cb7d414a830b06001a5db0cbd44b1c19c1c76e0cdc9f58082aec25db7f9e35210c824355565a1c466fe58825522942676163f166c86afa0bb10704aa68ac017fa9bc9b16a4e0dcf558a5415ceec4242bdd546b4ed9a0c3c23cc036ba02efe26911a9da67b5032f61c1403868f3db50f2b29c7f120bc0ecf0350f8dc3400c16e48150dcc70c80f130065ed795a419bf197fdeeace02234df4a22503be046c2339d100287ada6be61f210f7345f1e986d8925e1bb0b88a663872bfa4095fc3d61cfe665fb0b395ff5da3743bbc9f6640dbf135d77976ad0474c24817457d5868a330a1acb13f4bef7bf7d426eaab4a0d8eef32e78c6636842cacd731ddabcdf8f40bd50512cc16d42889e9df9e62d75ea0157e56fc9dc063e18b6c8fbcdab952ad67c978746fcc3a520808aeefc8c170e0f5e8e645a74e864a489f700d180d91471758050ed12a75c410c701ddb434190ba8ed9ddcd8b94f5d29652cbd96eea36290159c8387cd44b98be07502b7d1e9ba95fc7eff6509b398d99324a5c45631e4989a18d463d611e43200d4c2661702c0f334f7ffe3018cf7fa7c66e417bee5b9f2df30d516cb8fb70e53e0e8dcf183dd57a858b1ef3e8fc080c04cd53642ac9efe6a5e5388484fc277c67458bdb037b836c9131d1bb6c9c77b603e72b6894eb7f00690a96b292e6731f9af2566ad8829aa61706eddfbacfcb99ee88b86ea8373ca44330185f995956119da8921926a61c0274f06f6e501da71013ab79cd3d1804fffbfc80bc20419fc2b17598d5ce42fcbc0ac83242625341257809402557da8bf374da655211dddb51bc8d56c4f801a34d0ce795eaffb2f6257937fad756009fbdc686826d6a74ee9c31ebccbdab4209adfb56484bb67d30c4624c8ef6f06ec11557ab585ff35b5d7612726da4f21f11dab75b48a3c9fa2604211a8aa6e6e8a02fa22809a18af5e0abd27f38d6d710446a85a8287f94e2d053ddf6a5ad80a06fd766b154d6ddfa3381a4df327be2218bd4b18a04a475f0e765fe113eccf7bb617251167e6d5b19aa1f71997bfb2bd3c5be744281cbdebc48cc694d464ab60415c68f546043b8d4a047df3d97f31f9c40ec081876101c0b3a8aa21334642939499f6b1cc00fcccc2b248ef229234a42bd233d61ea2ac5982c950c41d9fa207545c9f7e5148df6df1d5197d401bf543905bc56c0cffa148480836987c5291664289fb66b6aadad0a76ce4d1d21786e6c26e429e80683f3d03f5961ac8905fa60d8281108740a48d211240f1c46d163152d5c7f22d2b81b9fb5d77043422f897680ed15be9e9148de15613611ce201d5a961a9749231c1f47ae07ea38e4443a72d30c67731abe7f77e50fb37648fd334f1438aa027ebd92654b1480832a62802e92520735f2ccaa2825048364791cd452470660f08c0de8f0f118e99c9a77122beb5901a26a341efcde9b81d31f92d973f9dbbfdbe49d595a578c31b49e93d9000da3bb53401b038832c9c1b88747706900fe43a244f7cd2e4fbf23f9aa6415cb25425f50b6fb5b4d9d951bd05f3f83d46f37d61e83e367900b9622864e7a0bb3241359494954182740e8394752c7519829de8672e64c3c22adb754146283f8f250b95239f2921e04721d65ca566f7e03cd06d04fb7576303d3dec845165cc38c381f573991e91541c3ff7f34ac5ec87971b68c51f9becc568c8cdf934ba7c0af4373f17f1d98d3236107d510ffa61eff1e07947bf270a15a1c3d22e439173e21bc3038fc0a82a3896e3d5c849cda46a089d744ccc4f5dc7c05f141d700c6c86e1732c56419fad4ae3445b3899f811393948827395650342e36c4a3d3f8815c93999b71e273cb4a194f7a3bf0355da632cc3c636de9db95086f9d9bbd3a948b26700d0dd7180ef6848603e451060544ed20901a85edfc04b1910f55d0d3516f1cd22c96c13c849fa33b5b4c5885002e407a89d275de5aac37ecebd2a4c2e5c016b837020f9de936e7deff1cd4d656129e7282773f948be900c52791977919ffc2e34b5a5f7c87b5f3b7998132ef958faf6d817747d4ff9148d704c660167515fdbb54a88ad5bccd3a9390d440a908b3c278229113e6a30b2a6372171792d57293a5fe056fc96505cda410735c530d22cfecd2e178c5af61482917403617d5408affe89ec58496b80fc12348e08c18da8caa976ddf95a86c6d43a94316d0d60356849595649bd88f11abf4c8e76cb6e0843b8fae5de2d25e05e2e7a1a6dc0b18ee91b815d64f17f938a05715ecc18f8ee136a8bd098fec477babe91a88e496787c7fd4d8a435c9a6931726252363aa99f55d0dad11c2d436d804a2df826e9410492aabe2abb2c061513c426e55cc015ee486e3fe5d2f35b8f977de98d0f1e41afc14a568c8ea6dbf23c81263d76f2114884a18f0eeaac6468577b1b9c5ca3ee4e0b013fc95557009fc39d04463f891f10b1653862a8c99100c19e80c4ae3736a4943ef74cc7812feb13c340069e0574d72e9fbace026ede6d22f836059b51b9f80270c7dcaefdb454dd4baac6613cef53d2b4338dd1f4c0f76774c284da00f8f0e08bee02357896b01bf6b2d73a09a9e98b256c1c0f8d70826d283b6d69e7bc6c97cf5f87f6e9e7a9595c2323f529e342bdbc2708299ed641209b03234c93c0097338293f8ae2134940291a309fa4b439281a651a206385ece16764de1e5886a68eb3efd2f3d1e5bf2592f917272f449ef43e3c3357885545a905982ea058ab204c3b310a018718bf4e983c156a84e94fc50d58ddc566bfaa0349df2101f02f64f0e149e552077a033abea414ce3193c7024b668ff57167037882976b501adee1a61e464a7ab48a160050f1a92b8be29be63ac97c4983b015888daaec9c773fd56b9669028d184ef8e1cca35df8b3ce2255a24ee6f9b72a4c1561b493abbb5510a044efbf84664c2e862a756732b8cfe4e015436508e7c6a6c6c365592aa697f073f70dde809197a894548d47765c517275e5225d8148381b2b58ef866ec477b329985da4ce4c960db3bbbdb4d4f5648032bd9b619356e1a2de3245bb753651d9648ae5c3dd63d536c7854a28fe08fe2234ceb0f7b50d881630fade1cdcf1fec7187253fa5efd8c0ab13469656849288fdb8f06a473031471cb288499e4ce6a87ce318f5e989f12881c7b071e440c60c32ffccff0cdd1e8b06ef509d1a7f1730fa3125bbd4b864e10f208d45d553642f0f2962b5087ee48bdfd5d3edcf64223ec36c3ebf2d9c652eed3983a2287c4673673114b24cfaf99ec3e8d32f93f4a0249c5505450439081859c6fb86f14ceb3fe3179e7800eb0189036698fec97002124724580b027abeecf20dc90080a2bb32567e09777b87bc60d240fac2311883b84e2687b2c9300e9a709d9a24f582db0ca6ea67dae8fa0ad5ad1712187a11e8efb0c1f385ef5c897a117710de7e77e18512859c6046f2b4a58dbbe856f6ce35d639bfa538c2d9049c59e04ad33dcb8e495a87bb38aaab4992f6dfc5efb13f00ecb829f40ebdf1ae3d52aa92efe283b42746826d62a9c88baa77c1a01e059d88b41b899bdc771127896ca7e658b12b1b8c40829ff8b7a6ab6a9555a7a07711773afd282a32ad08047d871b73704750f583f882b5144a3fa1e9d91ac54f473c70e6fccd46861a98b721df2c3a53831ffc6d54601ade56ae3d3822a9679098800a7af13282887078451d030d9eb38fc91ecfe35bcd8643917b1d66d5be28bea303137d04ac138280bcd0d8623d7c480908d6bde33263dfc8071f7b87cd39f8bd8602869a5054477d87542b1499e0c487d56a3398839c195abc43a55c278ae594c90a766eb63283c6f1f0b0c5bf7c4ba1b9d4f263062069d088ef3877debaaa7de3561fe2463fae109eacad45a26fa6b74fe19184bfb361fa44cc9ae29fe2a4bbc7d50292b2e21ae12e2de2bbcbc3465c82540cdc20e4a54152a4ad217807197f2ac9d030084eec584229a1f76d8cbeb7be5cec18c206018f0d40837c1893ae3ee424d650f1e367334ec9bf0dbb22dbe8a3eaf61ac5923844659970745e517c79857031547025181e0bf71e569966ad0e5b065c547318e581f22c8a9e0698a7586d1d2d5420afa295cfc24afe34ec4e0f1c84181260f1ffeca482f82279cfb097d644a487d0dce3d80b7d3264a7903c4187db4cb680681086ee323787b3520084cb121ca8efb5ddb7972454f980286d3bc985552e3fbce2ec06d24261a00c80411b15e40483eeb950e051438108dd908c80dd0e9fc6c2dc1f18d9f07568df2fd51074bf4fd22f07d0628ac8ab3850d4c803dfc873eacc853c0f7c65335c4f00e4d13d79cced8aec43d2ab4630e4b3b347ba728b30402ca2983f2c4574a5fa49a57e9a0baa8bc46ef340962542e08e719049f6636939e93312afbf0303938b1333ca941a345ffa537a7d13ca1441ddd4d9f0dffd85e3b261b09fddd6c82320d6f2cbbf29a484e5f071c20b9efeaf76a0aedf867fed1da6d823218968670a225d9afef1ec31e7aa6ddbd095c6a9882348ce9570bda81c788465f04e74087bb6583ad9313e085345c63fba92527cf3d71bde1ccb7b5ece6e1b2a6d0953e8e098d671a4f64543e336178206b9099422431520a9ac00f63746626a11792d61756148895c06a078dfe988b2a14d2f96e6270e89881ea2c25b481f4c48b1d6841e15d5c9766c5106cdafdde7447dfee522be9d819718313449f026d2dc4dc40c916faaab289d921c774e85ea7dbc28d21180c172c064f9923d2d0115a118dc6ab93552212e0f05dd9a540501445721e8fd4fd41dc447be645704f65ba5356188943851c84739ba4d26db4d59539819afa918b18fd674d614c8dfa75812344d5495ad928f50ba89c053a86082c0d414ecf18c8cf2fe567b39d8cd438f1ae2a2a0511905aa12cab31b1bd00799051a3b7796a48dc1c501fdf044ccbcbf98caaa55d7044f4adaba44e9bab458901e428ded6ca215409a9aa33678794aa0dcd7cbe0ebc7fab7a9ecccb0e7ad3a6e89d490d9f7f9bba4a2d617ca1eb6d1c069561a64ce764e8eef6bdccf7de4f60c735bcfa51082f44bb0bdb87cbb86e23831bdf0454270efd0be66faad605d6888d1efb772e861764b3c36edea9711c3af0d04dc385b7b680e2a5f028a957c9341729dd5b826b71e7d31abe53808b81ced989a748cb027f92b810c81d7adf6b13609430aa830ae5331d42754ddb8abf53c6a88ec4dbbc51b10c05870768c91069cc3676ab4d21c542facf204a849ed831615ee164d8967604916515b75ad4cfd7fdb831101d41a3f7d61143f8a1e2d73e3beb722cabaed4bb5ed97453156443c9f31f50e0432aa49b54fad215c34aca70d46cdd062f9b95eeb0ecc78c5a8ef1437866f2e968c3f5db238a81c050dc0c679b231750b6697216acf4e65d33c10c4fc316a4b11012ff1578c54f03b6a2bc8fd2312d8782e6a7d3009392289eb9fec04830dd52b3ce7ef407ad37f49f6c9813e2e4777961f653e476fa650f358cd01e436fa788c0f9370c36c0e677d19f43830f0c1c78b339da443aa4797686594a1a657f6e35cc75f551543f95e6528c8e75aa18ef80ad562666e364a030cdf82d272bae8d8a78a63561a70a4f67dadc3bce7097db4f6f9419e9f82cfeaa44ffc5990ccc3c1f4c5390f3e4ee8d961c0d8e781afd57c7e894608c733a3392b2df40181a0e66273deba0d962eb87dba75195cd647d32e5d8df1de721ad766cca79c1e514e1fb51cc689b6f8ea811f3c41eeb60b5685d8c67c545c8d4a4d63f04d3997d36024df4a200b17930cc3be6bfa5349768fe6a44e4c956aec1310b8c79e2a62265051089510f2ba5466df1252e3d29c4cefe875025a0dc73c3ae11e5dda46957a1f01554c04c48de29c18eed3b602aa937af486a7a43ae1da6b919a165a30455fd643f8888b556b759264d70322082c32927ba2b87f85bd221426d30dc6b15f0c341c4196195658a333ac5c5980c72468b9101f6156a59226280472c5640a53b5fb568420e88e1985ad93e70d63b84036876c2bc98c3820ab16fc214f66f82c4e4d38014bce6c726422096a2554d5ea2e0a9a48d66b0208ac41c0e0faa3dd55f37ed022f65c2bb953e672f0809f3885c034e9a8f478896970423645c226472661f078a2aed75f00cc4e2fad1162746d220605a95eb3ecce0cfbef5453266e34460c8c297298d82abeb1ccad8726ee097dd5d1c8d498d7d2780d6df64899e342f14cea831cf4d7adfe57c946abbe0cf6beb317c176f4a373c612356821a9588a21fa2467ec0d140fb3c05de2a418978d004cf180c4de05f9631bdd561edf01043e374bde20acf38a7568c20b94383f6fd055d1cccd251c1f40f19b2d6d9bb50c2d2a6a6f4135d0a67bc2c9ee7ac15a052084d6dd5286f3e2ed7008c2d97053d86897a8164efc175361a5de81ce48228b9aeaec7844f1f098fc2e684578ce0e44174f58409c0b801e6a037667244a59c3cbfc8539dff1a27369663ef7a6e5e9450ad6ffcc356bf502365b01b0dafec6e4b7e2e9fd538b04ed6614ed1cb3f6dea86c20a41cc23c0748eef9af7c420620ccde82e429e091a328f539875274160e0667a105542f23813b504cc761f036bb0048728223c34b85123d7ce6ace31880b0e1b69e4f093a95503ef70373f085a3bcece7772a3d8e726050245fe19a3fe0e4c3710b0b0ee10330243b2e013d31c4f60d379e45c347c98faf2124a2b030d35881040bdb8cc8641890cca51910e1813399c2ff9a03efc25331eab88d83fc676867d496d5a8ad73170f80803e40f34ec7ad900d57305744f8ee679107fedad6d056e46eccd6f7995d66ec99a924f10e8757609e5a0aaf449953c225c07405c7e3ce6b8e01c41bc9dfd3152442378b6e1d128b064b3ffd1a1614b95a3ac4d53934e5fb7a93e750fc50bd78411367eeade14718612a582718d335e5ddc78f940081b826596b3dfb3a424f4817b44de80582c0b544ee101ddf9ae9d2c78be9f23178b04370d62aa15caa7a3000a24b5f3dd6735c51cd0ed03df33e391274593155f44a8155f68ab21de62063cdcb6a0483e6cb4f948f7afac3b39e279e0437cfae008fd2bce69379f006032d48b49bfa2b9104594b2b3bb0fa020952ec82900e7c791480f5357fc34679464b4391ac0115e05ba1768250611c16970336bd206d4be5fd9aad7f1264640efe4191e0042e4c947af12433c4a7ebe16bf899e2c629dd26c2b30a39ee99d0210fd33b96c7693c5804cc8b934a94e848c1beca4f32a1d7c988f5348c4246f1d039c49964244e1fff38141d3557199fb253a2111855faf437ae013fb983f4d75354bd721e6f020ccf2afef0e3a97467361fd0fa4308e94e6df07c7496818ce0c31a2c6777fc32ed012d9eeeb435ecc877d7640102b9259d6932c6e9468bc69d50ca1550b1c9135d7c628f6c4b468396bd7b94738039d331dd391b3895a44244ce967a4add5042401b3aecd8218aa23766087ec7bb4af3a14ffbdb8376eca40e95fb77f3971e3bae4e387080dea0d731dbcee095b55e72e3828ce085df5b9f93c9708ec850c551ca1bfcddccc5a9cec7974d66579c6192800b6b2ceb353ab3b76315230e187461d30ce0e0e05d6ef2ccdac58b971e0001f0eb23cb78d85dabedde21a8cef41d5881def8bfab36347b5dc6ec724eeafbbf978b7abb7eb61bc1cf1b2d4b04d9596cf9111ea4199412d6494ade48de3086b5bafd4abd8f23d2b8c4695df2106fd582425ad5c7c8b10ff6c98357dcaca9144e1df0f211955aa49375dc626c3b722bd8d745d88b1de278941ee7e8c38d355f452d2129cd00ac607c0671dbf7ff7bd473e1332b7ad84c53f2deee9b3948e3792f1feb08111d8f72e744cd6c9bcf03e9a769a4c303213a1beafdc66c27a749702aab8575a644aad71d09c671166505addc5c42a4779e61bd8eea4913abb46a0624d58072407c1d27d88fcb28297d0b1dab744fac71e5eeb4df3acdb5ccab15db3054d8295122ca4419473134d2483b7db09c1309d8d8dd412592206fa23b71c42875304a7f59cb44251c53367a2d575a818c13e3a14689ab56a785d2229807294d8e447fceb5f075f34bd78180acd48089dd061fbd84990f0b291665d8ee1d7499035799a1a3a03bd5da4ff23bea40cfaa9b08daa184968da92963251bfdaebea13eed885e127b02ae48e21bc8c830c968b0818d10dc617e785fd454692455b4bc976a820784aea0c9a3f1eebd49a1d2568ee4187c49793dbba165dc5c2554335306fe2a5491507cc6038dc45ea037f103ab1a8d3d80b4f5090d5ccf55e5812475132a90e7c640bd3f26e45ab2666be38e3178133090b80579ec77d7288622e2470b1fecab8809a2b50db7a28cd79544f0f8d1e4f519d98f66b45445a05bfaa8ec6d7ab5df7d26deede736fe218e88d400ba117cf69855ea1be52f5633ecfaad1975c007ad88eba8648d290e781b75c80e5fb82ebea3d29adfb3baff97c844ce928c70d9c05e1a49513f50f18212035ea128c8e8893e54043aed4ab72219c9cbde17f563e009553eef1afbc673ab3c31063717c5358a9d74361c4de0d9286fc804138a8374a21c057d22ad1a94bbbd9b148efb0115ab8432a294e41668c415b984704b68c5aa585a760b74d2aa2829ba6534b14a2a15ee62a19ff4e3205e68bb5bd9bd4852f378d41192b9d206fb99cd2817f41e9954dbd21d48bedeb5b26d422ad180f3fd24b60dc8779c315518c4d0213a4dd6665a05c4e1f755ce1dc747fc5ee2c87ca146b12b104f5c473d7d2f6e55553fafc276846c092bcbb24a2e368a859989f268fa3c8a8c60ae76f6d3a37ca2d9b14982ea70ca121a30596a510143baa35427edb6d60f1dbd518b5a764c8610946d19fbf8afb62c8d669420d79bfd4e8309e790cdf46420f18c14c181bebb5b87bf225892f6c4ffcd88442057230fbf25a6cf48cd7b2256e4b8f9798d078b91149aba8edb290f99936c5743103bb7730d9cdb8ee63e192fa143c68ad9614041a82ff7fac63470264cb35531dec96b07498c3bc16d53e6b4e409c5a56baa4f5061c06d935e18526a45f0ed9e924824edd1b5e6a595549ec3b01418d1909cec184084e6dfdcdf4abd05790fbc099193a3e1a0f199affa652802a26ab4886c8fda9bfa1c11e0d3f3b43b1dc89b9cc94ec963c4fe78b1efe2c86c18b8aea56a8c3a2cf4d5d501d7c774dda59bf19a80e5958011110df98a51088905cb514fa3d97e39db052bf0238a9a23ca50f90ac000a0bd9b01938c7a1a0a6f56d8a5391904d4843f82d3e7c6f24c28261cadcb3346b1817280c30171f32241e01a04eda3830f924d122421ec2192d20968f6de42fa7139fb81c5adcc6572cd9f0f60efdbe2e6ebbddc11b6b8977401a46ac06a48086bd5a317dc50e50c2c82960b60900b2052b44972ce5e558c6c015c8fdfbd3dce04856390899f4a4a303462c18b3d11f253927ce4b096f18a28c79bfed7a966ba320fd684f4ab800dac06f371edcd625ff5ece7aa3f05a0dfd995e7325d9941351297c8a804f466dc8add36b1c1df4b2dd38c11e883c506dda02e75fc54ba3dad5d97da4b3544ffb3323161ecdd51af3d19f3016be372644ed7ee6376d8af751b5c5518fdcc0c2b2a0029e1991e5b87701cd0519287585c20712d1fbcb052506a36c061834ede64e228e2430de9012ea70801eda59d191ded38006381144e98cc47ea51a70a11dda385698a965c1521a7c43aca09d86452c7cb14134146d672f50424da030b2e1694c2e5ab35ba088e591e1df194d2b526ab743112c1c31ed0d1e7f3c622642bf73159959c3a5f27d1125a4a476b4b192ae735ade3ac8d73d111ba95e132eb889c1e9c3bc706b2e389cb310743e55a46b5fd7b216c9a38e0fd4dc4ec05ceecfc92b97ed8b6e416a3413f485cfc6796d8a5befdd7b9a9031fe2b6ad06b73ae5d9801ef533dbf7f9f387881818a11235c611ba4c43bcb4afdbf9f631331768dba9e364a1ed31dfd6099e09006ecc2ff3fdf48cf07c1d2d666d33e146fdb9f799372cb430eba0f174c04d18a40b0b1bd7f3cd9cb8ab322120ec5b708bd1b070407c8360c2aa3aa03e53e69c39de422bb1d6c2168e3676f08789e2904314c7c9bacc62dbea9fb2813bfd192c520e4bae8315b245385a0d6e1340e478a73c2b02f72d16081b2b2d3b4b78ae5850b9bd6da728630173ccb5d56861067c10cd8b3e4bb9e5296546c0bbf64bc48a45169dc58cd94e40b43aeea26754cc19955b51b9ed43f8d583046bf580030208bdefba4b2ac48760b64ae47e3f405a3156722db58dadbde02ad78f73e48dd7783c55bcaa5ae2a4af0b2e8fae333df1a83256adcc2269b4a7909434fd0bea7c1c4f14c81e96a408376b081e484af0c05648cccc98887317940bee0cbdc3bbc8a090083e37170de6038c118829f91ae9018a1f8895e3d36ad4432806d8e526cc3132d59760b13921ab49b73d4d41de89199d2fc8cda8c57ceeeb5fdcfcbb8418939392108c1ede87275fe910056a7f2920e80f71bbf6e86985250bf7684e753944e0a4307a2871867b1e1584882dd2da20df820f579054188bbe66db57b3b69d91f68dc321406ab27c6e0a1b3cb3269d1258399f73673ff45d4338064bea03a307f763147487dbad7b9d5cac3fdc3ba7fa877738613f418f9b633dea744c4d807f5b7f25e09a31e84d687292fd6e5ced23a92f5cbcd8c4e98cad4121a939d3a0a7b6db860659cb0832c3024acd071c7883cf60e36b1461dd0f8ef473fa3fb330c7d2038e8ce0804656c30a9969ea840b98322d74d6f146fe22411c9e61ca079e0498fb8c868713c15e329c1b48f4cca62149177d10038ed444d80d3c10b8dba403fcffffffffffffff31c2f0a325441b914694089229c94c910a55fdca1aff541f151f7fb2b5424a29a594522623cd5cd11020d6d62cd901b80f3b0d3d0dac4fb6e5ba5a07981dac940c9392ef56f25daa8911e443653e193976b4673420d6f07810e833981f6074a0d6be92721d4a95ee9826c695151f3e6c0851c9f19bcf901863ccb480548c6072b09833d6b4aba06a0caec613ead818c2e2f9f490df222446150c0e303858ec9915cbc98be5ea1e82b9817727a9f239e5da69490d17396ce0d8a2e56508286306c606dedbd8d7c27e724ef89aff649ed33cc4089311a311fec448024c0d927b8ab97be8abad26c3d0a0b5cda7e07ab2a5d7e61699417be67e95d47ba76fba11194cc9ecbb9d327dea2d05c5c0ed43eec96aa5760bca356090d8c2d55ecf7dd204d9650d86dfee39f84da92965d3c4c8e16c8aacf102b8e6763ff95ea1bb4ca197f74d31f866c3f578a9f939a25e53ded3c92477264f20234ae75b4ede53a143f5d44829b57a2fd36ca552264d8c20179eea5fcdfe9dae49c83431ba84dceaf69c62cc35976c5f13e30704e554523e3307254baf34316e3efe7e5bf9a7af7a8e5f13a30b1ceeba73dcd263c59cd4c4d8c22c3d6caa4df5a4bccfe281efedf54a3f5f97853c9e0eefdce476c1574f72b2b07c96dab3b4ba1a2ed3c44884b312eb72c7667bcbdd9e481165d5dcfcb4cbcb3bf4a01640f8da9baad7e76ab2d7c4e8fc9f1863ccfca6d3bfa45ccab42f4da51a5fff3a3de6e79e092e915d722d55cfdf594a6b4df5a5d69249cd7dce09aebc7b3f29f7ff39a9abcddf9cce3da5d39d4b8e3d964ce7392f2d1e19e3ca0a86a420887ca9bdd79eb9e78fa5d43431aee69279d0875bb6dfddfcf692f2949ec1d5c41863e885386ee9ded7a77dba1832f99c169721308dd97a7972a85e82f2fb33db2e695b7dbcd69c8fb100ba4eed1c36d953cd879a152cd5bc7ed35b70b57aadb9a10255ffd2abaa5a870f7a0a58976a123a94d0a5b65813a3737e33631412512055a74387f2bd8570361cce63c428e404ac094ae77fdbd0506eb05fbea552b7e77e86624f4dc956932e9f6af086196cc2c91e9b0eaed48d411f65789b6ff6ea53bc1abb152387f392c790f5abddb6f56bdfed4e17221f1c2a3b84c0c4aac1b7efdc75b553321cc2a4567fb186cf5dd3c4f84cb0df4faab66d6a4ec53ee3c5189ef6a7543753fb6a6fe21023b11bb0fddbda995263b82eff051b101197fe3082bcdf9676aed666e3b9aec9803631422049e74bdaccf536f5ed9a18637c96d7b4f087488c5f84c1deeec1e66e2d93ce4d258131e7949d1c6cca6a3147c4a57fe588ff5079221d2623c6129480f55add382597963e093ba0927ea4c51c4aa872f779a6f5a11a6c351564edda9b8d2f5c21f35765e9526de7399923ef9923ef9d11f478c5a694f2a55baaadd99a1875f0f05f95eb27b7d9effd343172f843e4b9a507dbb1b8b9f2f4d43ef90e932646df64bee52514e3ca4b07478c2f1d1ea2b23a52e25fbae073a56d2ea689716565e5b9a87c3ef44345478cfe9b96cf875ad839c6cf87361d5079c99c964c679369f17c3cc64fc893c33b1b231d974c0270a85773bdd9ae977c5d4b13e36a2e9910cb0c01099c3384d0b129df74cf5ae3c970382c637cd911a3d323c618412d1e3882a59e9874afb1a4d8d99cd393096d382d201c2badb85d33b66e176b565d78c19e64eb7e21b335d96a9a95a45c5e98d302daece0b4b06c54626c61d9c4c8e2d209a2f26652cc5a7f7b9c9ef2185f0d0fcb8a081ebfb7bd58334d6caad2c44fac1072fa9e9b56394d8c1fd648114076b8ab992fe51e73dd9a183f215066e58c943352422e2c1d50894f3a53eef7583684b3a126c6cce786639b5482aee93bb76c5b1363a6350675e963da4dfa92f035317e68f331a201b6ffd694ecebb5575d6a628c31c43263e4c082fef8d919fa27c68c3531fe7f260f055bbe67df991cbae4cf1223686642208f26f3317e915c136339b927afb5463c1f223736f53f5ccbd635afd49e2646ef7026e3f118635cc16163888a7c338c30194194572f86ed8a79fa6ca68991486753848b10b066ece9ddba6cef746962ccc4b86eb0783c01e842d364be5029b8144ac63431c6a86cf493dda494dc9e9f7cae89f1f31d102c56357f4ee7ef94a5d4c408f27f50c6ffc86666424f24c69514100b212346168f77f813a306c41a56017d80c5e3c910f9643201e0220372f9643212d8c2031e88400738f0810d48400316c840043090b2c50532608109548002149840062430432e1588c091d7643212b461a10004581eb099ffccccc713620a3860b50a34e0a5cd1cf11809598001443a1b0d8835290bf0800252029c16198d0c716710a08103283580070a10f27808b0c5006c0880880702f001002445e1e2e40226473e02259b4921c1848efc07221457986082149867e18e8909265ac10004741181362d5c002e0001223bb0810c38222eb6f0400738b0010d6400032917a800052620810840e0010e68000316a08004445a3c2025d2220894e802090d0810d9410d64c0114551f48128c2bc02f4b9f1f209753e042dccc2c3097488a2e83b9e2069a4a4113da1141b29d146ca74020c9c1072821929469a208b288a52a247632425c626d8a1095948e3f3e191464a87533a9e9434b8d8a2853f463a2e31a601d2845ade534273e32911f4b9f12126b251833b92090c6002880951282362d0e746184be04411c6074900a208f34544a413e22fc2a10c0783c1f0f8783e9f288acce0c98440cc017d6ebcb8b412d010b1c6484af44f097988803e373e1fe26ca6121aa0851230ef1ec9ffe9b8a4f8c74c442786400217a2774fe7640231e8a8c0868d152f52b838e29b2d42f3c388647cc408cd0f23252525a5a38235528ef826f344fc3345247fdad0031e9824c2c8774caa80041cbc94c08b95f99c8c733c273fbc5001414ae739998c733c5fa204942c84409ee2851729f263b285179ab2f20235a24de9c28b14cd8d27e2ffff0935c98608a838c1901f3a708c8143478a4aca11df04a0a4c5c40c9331809884a1c3849944208ac4e8fcf8908ea4468c2cf2480e278345a2e19d32a2088369e1cf101e1ecf10d07f0f229d4d103234d20588c733c4f3e99411fa785a76fc0b36428e301090ffcb233c9ce3f1f19ce690274814617a788678c7c5d323e409c2399ed39b1f214f100ec7a5c727d429c3bf53c67b826078ec2083c37109d229c33fb461d9841145911930f1f32097cfb7b808e910d9fce7d5f00809c222d18822cc4a4a47db1c5184c1b15ef8f3c1e1dfd9ccf74e19ede1e488224c23c108a295ffc88e474714619cc4f19cde10e9b8f4e8788278d17199518451d94c31382288224cfcd0a6b399bf238a30d0399b33b8d802f4b991518c247ec08328c258c0059b176c40cfb2f1b0a484d8c8773a2c8257c393027a11805a9012a48b147f0ee78da4f0e43c288d28c23c353621e68036443e0c0ecb4d47237f088fd0a65306873772e32e250881f8c308e1e04f8f50e79be581bcdc78cc60f174de593c1d4f8be73346873543fee3011245911930ce9f8583bc7470300b835cc070ce46a3e385d311238a30eee5c1c0b42fa2288ac5cb0e87409d1fa1e770d8cb17d1f4f26060563bf2dec12cf5f118097d27298fa2c80c9814fa704b1461f625b4e1f0c78533461461d484c523e43b9e20abb9e41012448c1f43740429a3041934700049e91049f1745232a0cf8d102c46013b6044146142104551006e44118b0b28e531281fcfe6f3a158b484e1d068683034161a0a8d84c6a2f19ff71145982e1e1aa0cf8d900b4bfb6f3e21941c390c200403443be8800e74e0052b38a1887b4a10819103154451b42608c2091754524ad65831f21d7763bb90af0687c32c208c4651e4c5242211456588410220390045a48407ac20d2e2069a288a8220e1080928c24a9128da18204a238a7c3ca77bd351400a222d6c008128fa7ca7b34911414ae1404ae7399ae20506523acf1962c4a3a30504071a582202b126c4633c0b778874e49b01dab4e0006d5a98d3c2b2017d6e24e5e2348001e8379fd08a8a7c3332a01feee94411093e1fda9cc81978144504f80426eac1ff09817ef3090189a22fa228ca445ac80006511463047d6e705a5836197743bb90afc60b7f3eec81288ad088b4880124223b10e96c3e1feafc1e0a41064c1a305788426488960f818a480f27a5b3f9ce7f9cb3d1c816cf90d8f981430a1820d18d972fc221d2d9d810800004208001e448b9117ad04be8b3f10fe3f816313c415e7103b4e1cf8e2b34e14121f0d7811a1e16010ca0e3f1805a5a3c1f0f81f83929214e7949e9e0c0810315445184880078668dce26251e31c4914d4451c48af062124535a0010cd688a2a8232d8c8022c421d016bc5386e7f32878c9d1f16c401b35363b3aff02cfa7870e1617964d6703c48887f3397eb3c3392e9e3340de71e9e109d2f9229e2163788210e96c3a1b6679323ecfe2c271710f9030429e8e2624060e06b9e4c1c3391d239e4e914e19a11697221e0f07d47149e93017463c9c971de6706f9102fa9f2fdc12da7036cd9d1fff7109b94c508a73a7843e9b4ee9704ae7464a87f99b39386e80fe8559441045181b63c07c60e5b9c448a4b3097d3c8d23c58535473ee5e5e3617996144c1491e185e3ef1ed9f994ff803e375e3a0302710b17a228d2445a7cf01045180b843adcd9b06c3e12b4f1141697cea7f88605c446401e1f2481007d4a1a41d248f93f636fa81ba90bf9ee915dbc84361f6ef187cb58fa8018e4f23da19697cf0a925a6d05ac715e8de770588d4c6c0171389bfefc18a0cce75b62949bd0b368429b0f675a4062e888228c169ccf8787f4703838381cd6e1df21b21102daecf0ccce8f28c2200063000c02a208738028c21800d31b2f3ca5b8c4113c114511e6079fb800179f13952f44514412068f1164e2071ef8c12aa2282a69c01008218a2530010e8688a2e8c409496005061151162488a208838954140106b058c2255c1445254f4803004dd0fca1059388a2a80502182d5ab408416404086788220ee8c361e95137f6c676c161e7f74007f41e27830d1d09a0a183830c9d8e2221f4a0b34614451088a2688b48035b78c009222d3a8288a2480ba0cf0dff10e83b99cf87361916cf67868e7c08e4abc1388c4387288a3c9f7f41ca4ba7bc6fd4d8384778d08208694411a600041800460042425f446e422c1be6e838b2c1117a213e5e8810efb8cc004451c4a0fff9e292834867e31c8f8f1f9f576343e4080f00648e30cbc7d382b2a3b321b2f988f1e1e7e8f87842443a1b9087a323d4f94dcb46fec73fd4f252e288cc1002bd8b0b9e8cceb788a1c3c8076961f9f88822cc09876508e461c984388331c194b0c82321d07b144569bc7c782337f33bdfa0d08340fcf9798459a20843f289220cc6379997cfbbb8e0411d4f0be8c978f9bc8b09fc431f4fcb737ec88e28c244a107817018e18f6b429b337af391a0760175cae0705e039a451131a22892c5e7c3238aa23462018b57b882155114ad228a22554451948a534451648a288a4a114511294411455128a228024514459f88a2c813511475228a224e4451b489288a3411455126a228c28425a228aa4414459488a26812511449228aa24844510489288a1e11459123a2286a4414458c88a26811511429228aa24468818334026efedc77ac5f82d086cae79ddf07860924a730c5fa395dbd5aadad96a0d4c448520a5e49dbb6f6f518645e4d8c3e484851009251f09acb7a29e7c4d4aff21dcf69178f3b8928946cea69dd74fcda96f2ce060c151c24a170eafedb10f2baa9dba0f8442b5e572bb54dab1aff16483cb1d059377ffdef4bbb13aaa4f27b4d7ba772f84f20e1044ff6d5966bf02d4ebb4e20d9c47aea74cd36374d7ead9a98ab92ba337d6bb29d539264e253534db197beffea1a09269ad3746ec9a632a5105ee2adc6de5367abccf15b9a33482ce1fc13544d3a645d70b94a4c5f95b01faa09bf156a280193ea5f4db9a50b5f5d13e34ae82731596be61e7c505f4bce3531c6184f402289f6f261d29fd33531ea2089c4b2b6e07a6ae9737e5d99ce6b4219202490589241989e2ed6a47e530bc923f6db6c2e156c56b6ce9ac692c7c8902fc29c1c2a322071847cdf6ffff9fb544d2a22248d60497a3f4f73364c5be43f0c95cd6748182a2a2720618464e8d6b3d4ba5f53872b61a890806411ce5ba64eaab7a77afa2fd2e9902882674bcfeea04be76b08074812b1eb98a5b9af528e1d2a3976f84b6e11f2f260a80c214104b7a4166c0dc2f99ab56796e4103c934bec7cb29373e1d3a480c4100fc2d4fddc6bcafd5ebe48c6ff478c2b24859012aedea4785d7aaf5713998410ee9653c7acde6a6bbb577ca8bc3c181a10fbc03c8164100a366fce4cb1e4d6254722886d8fddfb5beae05c2b69620cb9b06476401208f80fead3fde6da54d69a0c8841386e400208365d4ad9206cd8da946e06247fe8956dfdcdf65ec1574c08891f74d57bd225a7af6d9b521323cbcb80a40fabd53fd8ed3c2dc93c8d80840f53659373b2a40b57f3d5ece15d6bc6a67aaed664ed80d81862a30718367ca8e4d80144850c123db09d70ea2fc66f3d768d01491e946bfa93c1870adde7e3f087c70b48f0e0a4b756f8bd9a9f39be83affa5de57a32a73c5d1348ecd0e46ca8baa527999ceeeba0187bf0594fde6fe94e13e3cb27d4e111eab06433c820a1c3ec56d0f9ec65af10c22f48e6e01e7b4d25985a73d05d9283e4f9a473cca52bebc548e2f0bb5cbb97987ada6c190e3d77b97bb7f7dc0caaa6b3217943cf778f1793ef0e195c6e50f7aaa1ff53ccba5cdb007bc9670bddddb7dbec61a30c1b3f545a184888393d62ec7c28c49ca9f22161c32ab9b83d572cf52e630d1a2f0292352cf85e9d4fd8acde3fa118fd55583c9f1e2f9f21d143a2864d03091ae0d2d5cd293bf766bb75869d6fd5eab9da92ddee9a1849ccc072a9b5d85a4f5df34d246558eef7584339d372eb960c29ad4dceaaff41e88bc720135bde6bdb7a6e9f849a2511834ae62b216b6fceb92d6962840149181abe526a2e9b2939b81c0918b4274c8b25ab6dd79e6a62d441f2050697b25debabe0927079619d84ab5677f3d589bb074917b43df7e6adae909b4a122e24b6ef3bf1ae36db7b690b53a9fbfa6eaeaf49b12f86a8bc0b87d520d102eff62ec6eaced9b50c755e8d5f610149165eab5287ea3e35960eb1a08db9874f49e8cb25c5245778beaf7c59314faaadb3022f57fba64e7d6e77b526c60ca7b953468c1c0eeb60024915d8d2e4ab49f8d85a9fed1d974742852617dba9703595a4eed4c44832857e4f9b5cfc2d2df95e3531663a653cc6062452e8e51a32bf73bfa22346154c1348a2c0ae5e37ed7db9ea0d6a627c8e6f321d0fc77f74c4881154c4e3d1a48038850b1bca630b154902855f7335d5d6bbf9d292eb096f77d97fad752ced2b151f244e687eec2d37596312aaf5b409fe7c9983ca1f4ed654a93241613776d630b1e6d6722f4896d0dd7ed373fa4d719a50098c75927071823ba7f4e6628b1e2449d0d5d26d6a2a95154324b8e4d48d96ae35ed5e90e911dc99d5dbb573934a698de0503ae726177a6bc9a916c1a95b373ab1563967b3a7d2adac20052c202142532b79a996d27bdcd21cc24b50c9265d32a8ce0c85909a5b377afacae78eb9996482b3e3d9fc8831a5802408d03f2dc74e3205753910d872ebc6aad4ef6dba7d92e1531689c60fe062385d652f9b904de683b51ad46e6e397debb90a8b4423c69d243d788dd3ece50bbe6ea84be5f3fe1123c6334878a0ccd7fc552fd70e9c7be9c60a21d181ec9654aa255f39756ce6003226bff12eb94d3ea84870c0f82d73a9cd65723566243748b3f75df2c95e17b644620387db0c55fe844db59c243550d9f259bda99fcf956b0d4868b0d8aa1b102ec3a5899d7bf13e0d1a9859bcf6dc7b6ecedf5bef4a13e34a46816064017f366bd59cb3d92f5bd5079858a86c269dce7e6eb9f283059c70ddc3e4782df93ebd42beba6d726e820c4ad6342b2d9ecf8e185b3c1ff781718583fc8a2df86e539a2cb562aaa4d6b1e3245d3ab533c0b042b66e6fb6d9da29c8bc470e30ab78add8ec36d936f892b9a454d1bea162e6977aa5648cc1012615abdae467de8fa9d7d8d3c4b8528218836050f1de9a9a9e6a6aea29753b1e738a7706df33a85c7b70faaf668a7749c17f4bcea55c5a0eb1dc705a5cfc3dae0930a5604eec3f4128576aaf15299acb4d4aea92aa0ae76a62ec3c27235f8d8ce3c08c42bfe5749ae052cbe95b93e1705c7e7cc498fc619861030c1b211716961ff3c9980446144cf53198da3fe7143bc6c516a1686bae6e4a155bcfe04a6d41c1546763cb67f3ae55fc5c84603ee1a673d58a5ffd5c0927c7e3e932309ef06d6ff8ebbabbadfbe785bcf0191e2343621401a613bdb4fb417fc79292e9710226973c715adadc796a9b78523ae9af35cf953a77e5c7e78b7c982583e9014613ebda9363a952d2f53e9e964c0bb3ecc064a23599feb9eaf64afae73f64c448020c261e365c6b7152a5dacad6ac7cc7c3d111e3773c1c89c3460fcc25263f099553eff1eaf96ea5c70a0e9516602cb15eef6abb9cc276df26104c2564e2d59abbb4767bed91efc4b812e3182aa10da745c827c4020c25d6ae76525f92ceb5b927d1a46c73ce55d7ef498792785e5df532bd67b9988b44af365d3dc98da94ad5209160aba41ef3c7fa945c8f9070addb67ad92c1d6c9118a49c77465729adcf220292218928233308d6877df744e3667af299711ae4d1b32d656ce26153bf23e3e6fc41386c22c623f2565e98f2db6560301a388d7ef0caa36f76cb29289f8b750fd924e2af3d632473c46423d308898cb97f267ac4a3d7b4b13638c190ee78dc4b86a940073085fd6da995abcafe1274378b7c2f7f857399842b0a770d35be8925b8d6d0f308450ad20f4b66d59277f3b043388e494cdf5566a5ead1a042388f9a0ae55e993e4d5328d81094452aaadc365f3d7b16517ce6c1840a4a5f6bbbf9bd2b6d2d22ccc1f9aa5d7aabc4d06d7748cd34cc413c61321e209a3c5132446221e8ecac3f8c1c9349d5aefef17bbd9402a8ce9034c33a99c50353ff5dc0361f8a070e57a5ee709d56ad6983df084dfbf53579b53613b82d1837b0fb663eb395feeb679f84fac14eb62ea57555f3078586bdff26b756c7973abc1dc61eeb37fe57dcc566a0c038c1dda659a8cc9b69e4c4d360e3075505dbdd09f5cec4bc13f82a103e4b4fe947bd5a54931508c433073988e597bbfc9d66373ad1f122307c66037a5d69b9fbe4e0c0d307150ebe05a4caa35b9f9aac6317048fee0735d8da5d7da6cabb9bce17193eae782ac6afd6bcfecfc8801c60d0abe061fb3f35d925f9301a60dce256475c6967f39c79a18635cc1d11836305fc89f9abfdab76f0d0dd99c6c7d5a4d552f03bdf01820178c1a563b359743ff6d658fcd505901260d69a55a757638536b4dd190e4620ace34db35745ddff232e425e48239034fc7ad4da9da33fc5566780ba75b0adbc2d6b4189031d6aa11e3b3f067627a8029c3bb05a5e46e53beb4a1cc0a86a440c507860c8ba72e4cd0ede495528de15fb6c6186cb8ba1faa1876b9b7a6b6ecf952590a4373303d86adfff5aa7a302c0593d356fde4932c4d4d8c3188c17f5c401e8e5c638d18df5d38ff69f9826aec1aaaee9d3df79917d8e1afe76dedb1bba69a1855305d589b18b25ce5f39d6a6b860d3054629401860b93d7af67493687ddbf31c06ca1d59f3a27d5594e55416cf8501902460b4efe27c6bee7eefcc71ce21d58c06441616307ffa17afdd2312460b000df54ecaa57b9941e5ea1f164961aefbe5cc97a458509182bf4337399da648ebde75a157c5535a5aced6253bed7c4d861ce188ba182f29baad327e6d3212f9522982974626ecdd27f4367ca7560a4007b395cb33df89f74362460a2d02afd642fd9540e997250706e55ef544f49f8e44bff7103cc13d253eddabb833331a70aa3038c13a4ebc6143eb9cc7a629a00155b9e16fe339652934a0b304c689341f92ca1bea95cd9fc1d32c697900ecc12761bff73ca9ae3d77f221825a44ddd64ef4aaad5d24d8252134a574cbe7333b937468c9a10b7c4f8124a182424a74fdd83caa5a9ecb50c260f9823b42a26f51f4b4ffa4eae34967c805c30464872b1aa5b275daaf9ba084cb683afcaaadeba6c0886086ce9b3dff6bed6ed94426c9861030c951606d2c22c0f3304a6fb9c74af4c39e9fc3b3186382424468911826a4ddebc98933ff5d6c4f8031384768d575a734dc6d653100304d59a64c92974f556aed5c4e899185778645e421b34544a80f981fb7fa74af9ea26e7835f3cd753d55c33bfd21589e9c1940a197b93955d3b734d8c1fe3bb27488c31b6430c0f9eeae41fa3706d6e36de24fb41d95014abca57a765b8547aed11e96c5e769884a2997aff5663a7f22907353730018554fac9b909173b255d73d8c0a1126367c31af989a594748b994dc836ada562e28996939932e58b5bab529a18bdf342dca413ad2f3166cd4d31b99e3e1e8decf07f4860c2095fb87c996bdced716f42dd4b703275de1a4ef934e1cd89a5ece61c5c5e9f89f565bcfc6ea5836c35cd0e134cf074ed958b69f76f9a2697604d1b3bc97c26dfb4890c134b3c377536c554cbfef4d6874925166cf046ebbe56b79cdbc5a94d28e1d4ff4afd6f5b7bee5de885984c82d784cd96a5934a39bdc63f62ec309104b7066792adcd0d134c414c22d18a7b7b7d1bf2fbdc1d269070db9274c57cc1f61a04f2c2e4116f3194ae5bfb3793825313e3e2c0c411aeee3d25fb3de9d41f6a6274c1c7b8e2021e63c4d8c222cd306984db6d50a6d69fca4d4d8c78acb1b5d3bd97adcdd44c16d16ebe967edfae4ede07c4441153c9de4ed0fd2ec90f13f1e07b72364e69dd7cdd10f1de3b7775cd3915746ec8172687504b39dff932a94a6d394d8c1b151689c60f134398148235e7aad84d351532bf092156314eaff4f53567980cc27127b99a2575424c04c1dcf4799a6afe6afe4e029340385bfe891b4b8672bb57fbc204103fe19ccae7cfd4d6faf4875d2a29d6ce3d6650be663e9e8c11fe64424fc4c40f909d39a926956acb96a7a50c933ee84b093aa74e13ea6bcb62c207d5c6cd15af74a8dab63db8c4bcca2fa792a97dd3037bfd5e50b69f6c425e267950edd58dd95be7fc70e2e139b6aa29d91672e375877f3029d9eede3f9bbe1d649372fd5cce6cb99eb20eda782a832f973e7edb74e0b49662dbce3b95399c03b74badf9a6c75a72e7e4e0f6b525e59cf0675a6dc5a1b1fa4ebc9cf436a12738bc77f219db769792e27d83636be206985882ccf5b76b43394ddaf0ba1bd46736e1d2c9920d0bc2e9f337bd9a6c2a9335b07bd7d45a4f767bad654cd4f0cdb972aaedebb676c234b0326f9d1273c552da4783fe73f6e7269b26462e6cf88f2d9c6072863567eac76a49d58a1d3483eaa514ff928be77cee32aca7ec7659754f4f4f01c1840c9297522d59b9b97a6ebec9189aa92735534bdb94746b2286a7cf165407dfdc9e92352ea08c4918ba17fc05a1db872bbdff610286b9af3d3fabedc4edde13ca68402e2d61987c81a9e6b3b596be4db51233f1027c0d654a4db125e55ced9dcdcb0eabe11ce38a8e229243423e1913987441dd635e6c1533f692ad26c6344cb8a0eb2de7b72e4939d96f614275e7af935b139caf89310c132df85ba9f17c2fb9a6724d8d49161cd3d91e6b6d39ec87c9040b0e3e4c69f12bd654a7da5859b1b1f25cb6b0b1f25c3e3b62617205d798fe4ac92a31365f32b102930ebeb576e7bf572a995461d7ced5a654f66a99950a4dfe54af7ed52b7f4bfd309902abe9529b49269602943f1b74fd268490d9d2ac7c3c217e814914be616396e073dfeff44ca0a05c21cb965e3f053bb9ce863f9e3179829470219b922dd7b049e884e9e0c3c9d4724c597ba789d103ea7874bc983461d7cbf652e2c7ad94a9091364b3267fd0b172d5ee352b65982c81b99964d81cf232574f235760a204f6784de59c7beac136c32409fd7eae756d7e2dd73f132430b7b7986afd3d42fab71eee374b4f95731323f854add7bda7b46fe5dae0a1c2625284a95ef3768bf183d075a97866670d1322ec3ff69e6349cdb6e06f58362b406ce8b0314405e41d174f0eff239b1e317e3ec3228f083119823b08595255acbd72652204b70b2e57869339f4a53b3009427af97cb7f5f49eef12174a860d35c1169c16975006062640989fd6ddb2af9b4971ff80a5261393ab1c848ba99af8805b2ac6d493bad0a9f297d032e981a6c52674966c77b55e334c78f09ecfb92e5b6bff9093c90e7cd9bae6e072b7ec206b31d1c1eb345bd373b5ddd4539d4db3786432c9c162ac2d7bf796716bb834311ed9cc678283fea52677f7be5792491e263780c9bdb135f549971a261b784b2efb41f8d67dbf167201f29bcf9021263570e98f57ba43d84dbea789f1e3c97c67c3e96c625c11c38406f3a9c993dba92f566f352d99593cdd6750e16b6a7972b04416ee75eb4feb57697694c462a54cbd74bde96a29960ffd8871e5853f1f1c38545478c4a822df0c0e875984c4a862a404169ca0b37313b677e75cf97b425ff28ae9fef01f530ab99d95182aae909f145caae9957db71fa2127a211a10fb8025ad988df93d742d9d36f6c98ad6f6937752aeac494e4d8c2da0ce8647c92a5c726e8c9de2f7d6d34896b144154d993b259b4ad5c418e2cc4a492a1a536eeeeebfba316e54b4d9dfd8d437e15b394a4ec1dcbf32a65cd75b9d821253a85a10a67756ebe92a2b8582da2bbdb3247fd98a8d2e9490825fab5e6e7da576ea5b8c2095314a46c14efde47dcb5cee6a86841251f03fd8535572eb99c7b8f232379f37a38c9250b4b6cbc5cbbdfbf9ea12507c6be2f4df7c7b954a9f80eea91bcb925b4a327dffb56b4b3cc1d3f56b8ee563b02d4f4d8c669474422dd5e07acd164c0e27e444afb45a29b7f64b19849a18f9133af29a924d2875e8d69c4aaac79c743f5442ff852cd104dc75ec8e5bb71194644232e9bf78b9b4e02e6b2bc1c46237d35b5dddd479b3924b2ca7fb7829fda4ad2b35311e794d89259e75f9a5c6e6379d2e6962f4945442e57cdb64f3fc65a75c13a3094a28211bb35cfbdcaaf53b46c924563e742e29b69eb37f2689d76d6aab92f03597e4cb9248f8ecd5e0f4b752d2fd2652028987c96743675f3fdf27969247f4c20455a7279b9b4b4123943802aed65899e3091b2159a92ff5ed69fe72c5085e76eff5d36f2d2d7d8b90f3b9a4bc98ffd4e5b3855b18880a4a14f1cf76f73df8e67370be4a114a129194724e39c1d5dae2264b10d190f7a76a4b1def4f2f39446ad031974d17f34e89211a634eca94be367d991d79efd87095269414a299f3c3a458257fd7241a258448cf2777bfe652fa2b1ec44aeb35f9d0ff137c3071b1450a7c940862ea532e5f595f5b53d7c32909c4af6c0bd5946cf95dcabc12403853ba1e4c6eb2abfa1f20dcc92ee16a2b534bca0fcc98f2e79a42f90e26ed8392cebba77bcb565a2ef928e183ef2f9ebd5c7aef9cae3d38b79ce13f9838c957b2440f4ea5c2e9d682ba1264b3240faa95bec94a4228e15bfd82123cc0e5a95c7339e1b7552bdf0c2094dce1217bbcd27c0b726ad57678a76daea57cb66e7a85d141491dde33de6e6fae63b89e3b9b32543ca1ce0f2f4ae8c0164af65455ae620bb9640eefaa70b2b24fb5ea4939404e4b533f65b5e46fc7613da8aadfd69afa0fb294c0e1c1345b6349e76bfc98b694bc61a9edc79673cf746a732eb6b0a182c941891bd46aa96aa5c53ab9d4c6c3c60f9550c74523a448491b363d2ba666d2a7dde6beb42e256c60f07bdfc24fdd2e75aea139b5a4fcb174b545891ad284ce92fefb2aabe21694a4a1e5bfb4ca9282b2798f1234bc5f8db9aa656d2c695341c9197ca97790b1cfd70fba45a3c40c497d2639a1eaf2f65a65505d1036847397901232b0e64bbd345d3526dd1719256358770d5d4b73b919f70f2911c3cfc46d972fa598adda0c88332fb905f4f24542615095493e96124f85c93fe402448c1230a4b9aafeb2797aab774d8c2b2aef9e202a28f982522eb95b2fad722b5bd2c80e7fda0bcd3629d636795b6d9f349a922ef0924d7d3f5baa0c2a6b5a3c9f122eb8c470e9da86cd0edd6a625c79b9e108d902439f4bba3419644eab34314e7e4e8c2b3e546489165462bccba55227d5934e13232804628e0a4ab2b0d0d95b394f06a1dab0b08481a3040bfb9ad49b09b227e76e5b3a66945c0126d5b7d8316def255f9a18399ce11857e49b11248d122b40c79c2fe738ed324becdd13e44baae024a7a6dabaf51a5366ef9e202554d8fef496bffae4d2db19a30b7e878e9229a8f3d5349bf53d3515865c80c0a0440a2bb5fffe93ccbdda4a2551784c9bb5dca5dcfad78682329e132e3ba66f9f73c9139ef972cec15d8aade598c68c1227f47450727250265fbbec3f4a9af098be564db25c4fee7109133cb1bbf5f978b532e896a0040c942441c8054a90d02bf1bafcb4bcd34c4913e3f4643420f6b14a8eb069c1718618182831429249b526e7bef6ddbc4a8af0ada59974d5a9ce5f2582775a69b165ced44d6599d01309fd17b364089f1cb2f595fc0e5b2995e7341791afd131851221402597a69da9b5264621254100c20ffcdfb5345b3fe89cdca989b1c4079325c758da09d33ee659d203e54dbdd4de521743090fa074b339b9ff3ec9a98b4b76e0e4ab941c7bf5e4538d3d253a00a594e44032fffeb6ce9b9b4969090ef49f5b4e299996bf53a68931c6151394dce0b1326c4d5bf93e98541363118f47c3f18d0f4a6ca0ffa69b4a5d2d55ceb025c69597500b0b8f8e1836bcb301e3e5f32e26b061a30525359840090d949c3bdd52b29f6baf0f44320b4e4ba9e98cb5753c9b8d6f38ec051259f054faa6b636df9bb5a689f10624b1504bbdef730725536aa515fe848ef0b06183c3611d3654ca88110305125890bc42cd999aee4e663f7f2a3214892b5ab198dfedcf275f5d3ad3c448c28a0690ac82dd4b9d2dfbc9b7eb5cb322860e1b200e07870d336c848e7ca8e3d161e3d5d8d4804415fb3c257d9f2c57737a9a184940928aa6a9adf7aa72674939092a1e6a5cb8eda269179b34a56c91a23714bbb11538c1bc74170588422017324c304f845d887498130012d0e7a58b7b3e2d020012b5b0c836416945e841ac78353c2c2ccf02009455bcb448966741415185ca640280920ab509713420ce640480820ab5097d34204e2623009453706325196c8eddfb2917088a29b8d93e6bedb9df1f27cd17e1213182c24029c553b8eff519fc9518dc8c18a498e9579ab0f725c76fe9286693df58a9263fadc44a14c949b59a42a714fe32170a35d76c133a3fd89e540b144dce85df3a1fc3c92b3ff1e939b78ae76b2c392f4fc097da26e85eeddcb5be130b3ed45e754cfe5b2c714297d9faa9e0eab657de84da6f0535419ebd1a639a504f296eacf12f6eddcf842feba5ba789dfa3f63c2dbaaa7ad15f357cca54bb0d7a48249e5a6a98aad06c512709737e97213833a57aa84d3e4524a505b62c8f629b1a95f6ba558fb24526be75c72c7eff5845212cc0d7a7a8a41e6a0ff8b44eb6fd627593d4848a94eaee92e5d6beaf688c476f9674b72bdbdb91cc1fdaea64f995423e44af786f355ad5ad766a030c27bf683ad6df37d2dd317288bf8e5a6d6b9dd54a689c14051844a10ae94ad74cec99e27e23905e17b72a9ca04792162bef4e483cb9f7298563a84520b4ea789e99b3e1f33446bd2a9f54f4a57fd7c1642766a8d7f394e50f162427837db96ef9f1a264e8370cc31e8d237e8d6b247114493fc6e55fbbf9b2e3d9440e892ad4c3e5669654f06847c73e9aed4857f68eab9e96be17cfd6f991f1c3ab9647aaf5c2e65fb03a50f6abdc9d6cf6e727943c987b54ff152cc29aff9aff7c0ee56b973effeb83947d10343876c4a9514ca5e9662f402250ff2ed92bf4daea7507d62ce0850f0b0702ec59cbd394d4e7d51ee90927cf773aec54f7a6b767829599b5c704162a0d441cac94ae1936b39a81443a1036cc75aa5c46687e64603caa0ccc1b1a7cad6d7af279b7b463c3a629c287248aa966b49a65733b173287170d2df67af520837a54581c3d4e5e44aa6ebd4432551de00953fd7d2f324e15ad30d492e63cd35b65c2696300c9436246f69e12a08d54d095307850dce4165cfdb5bfbcbffade1c1d9b8b56763271fa3a84136e65232a6509f42222869980dba7a4acd94bea74b1434bc2475cad40bbd49b75c07e50c9d7e31d896ca5532f1ca7ccbcb901c2a3388467ef8411837a098012ad8a63f5d69aefa2ec35cf86eb27bc8cf1923837c70b6a70e26568c558fc131b83c5be2c5dce2b46268d35db59accabd62b158605593967b375ab2519fc0fb7a4810206a69eb36ccc5baf06dbd37c5280f2056fadeee562eb586305353172f843a04c118e4ba300c50b89d5f23a5567069d883f91cfb310e96c72384a17dc196cf916be427d6c6a6254a348c60c3080907801850bbacbab4d28a5dc750735285b600a273ba86baa5ad9a644d102e34f4bfa7be6285980fb2b255fbc982646100b7fb845080e142cfcfc9f8a3d98f413db47b9024ccdeb93520b97aa5b8d15bcdde56cd95e3535330d4a15dab57e6a8db7d9eaf6c440a182842e673b66e94c4da9384250a6a09493b2dd757e4bdd93c2e46e6faa666f2954f281a2d0f6dbf14bb6ca5e4287423bd84ef539b8ea2d7d423763cb579bba533de63a509c00d964d8ef9c7b0ba1a62f509ab03df535d98bb1f5664b4c902fa5d6544a69ade90d97b0debfd6b37bfc74ed54422b6ec834ed27f5e75a12d4540a2183abda3fa6bc0305099fbabd2a6b9adedfef113cf95cea395790fb41453102c39dce4ef957a63715175ba8284a11b8296b3b39a957d8e62302744bad7bac5ff2959e030da19f9a2d35d7c4522f9642e84eafc1c4e4eaf9b4a104c1f542f7bdbf332d5557060a10a4f7375b0bf71d9b50a1fcc07975b1c7ce57e14b89e203d91c4c337d62a8ce54f580bd74fdeca1ff83ebc113a0f0c0357409ae6bbff5246b64a0ec80db6b29ad9a9a5a2e569e50e7870e1c9b32a56df61c48d8dacd6ed656a5d75093d9cc39e4478f1e2c2036f2d231668ca0e0a0dd767ae72a2937339703e506eef9b34dce2d9e537da2d860eebfc9bc925bb39553941accf9a052c93b95746e8b42837d955231e5607a37ddd4c49889310c1c39c408e38b18fdbfc52341394e66c112cba65e49a9dff3b12cda3de59ce325e17ad0cd9358b8c397562d29d77b5a6dc1092c2483ef25297dad5ecee9e4157025d9694a7dde0fd39eb822a5d96fb9f996f9b17e1d25386945f2a64ab22a73ccdb72561ce064152f555a2ddd7450aea4709ea8626eeb245bb6675eec899ca4422eee991a2f05f777424d8c6a8071820ad814cad678f1a7967e59361a901a6bace1e3e414cab9c7bcdf4de55a621f7201e24e4ce1925a4dfd7a0917f27a9a183b3df4a414fee43276cd16fbc3e9a458707d3a7fbbfb2bf3289c4ff9d4bf753d5f4aed4414eb9aea3eb76eea52705d4e42e11032cbc44b290c4e40f1942db9de6a33c67ee7c927dabb37b854b5f6c838f1445bdf1e3e95763536a79e74e231fbe9bcee9413bdfbcadb4b5787eabb09f7563ed99e41d6d26c4b13cee04b6eaac63a1389359e9a94af5bdded30d1ea9957295e8ba5e7e4259e777ae933b15dce0b5aa213f3c66b429695804fb59da17c9468efdcf926d9dfbca99e845a6b4f242177baf5dc635dcbdbbd934848c64e356937b92d17ee4262bde5cdd96cc6e6548bd9e0e4116bae75f716640a75d7114eae8509b6b657df0c9e71d2886fed9b5bc95b72b3b13c678b13464ca9ea49b67465f393ade99345b8afb9543db9103ae7d689229e9c2eb9c2c7ecb9f53b4904d4e678b6aefae670f90411ef957bee7d5f63a6520fa15eb1bba9feb5d5e532f4e1315edc93e3e5c410abade19c3d7f2e36590bb1ee75976a7777c974ce1342a4a5a0beb95a95ba5f3608b9de0c3ea8cb25a594b99c08629552d5c5cc5b3fc81c88b756b7d5d649faa6b69a1340a86fbd7057ee7a6f7193c1c91ffaad9dea9827f50fb5854efcc03cadb2d458a50999ad3e34995e2d766e4e79c287f6bebd606b77c3c46ac7c91e78c96549216b0ff67ffb0b39d1c37bf5a4b24dfbed9ce5b69ce481bd87739553a88badab1e277880afb1c4d83f97eddc52179cdca1956c2edf41d689a9f52776504fe792eee1943b1deb933a249f2c556afde69b4eb917277458ce264b4e6aba25994e4d8c7c3287754cbab92cb55f90b5656324732287e549a5723dd5f4d68919f9ce9fc461aa4308613b93caea89052770f096a6cf9fcd2da5dcb99337347ddc92335606e57c5005276e58d3e173aad3a7cb491b94b6f94c5b826c504dbf3e13379f0dced7b09335b8b69458793ffca9aa6ad086cdada5eedf355c5013631ade7c53994c6eae5abb7c8c1334bc6350aae720a757dbf8431d26123a398363afbadeab36b19e0bc889199edc76ec6a5542674a65ca905aa9b5bd60d3397da91f2a9d0f754ec8f0968253595328156c5f276358b834296f4fcd666f77c18918a442a7be95b34efd260c83ab739f89df6b6ccd76203038a5cee1fc9d2b77d51ff40526174fb57ee7744ab2f49c782149e6e042e66f49a76a764ebae06b4ae7a6eae7d6cc05b7b43d3974d8e4b74b5b78d3e5fe466324e3099d68e11f4ac91a5370a74cfe4eb2d04ee1a6f50ee7f2e5ef18e116d00916a073b5de4cfdd4c91594b2769f5c4befe17cb682dc6e76d93cc125995a55e0097b657a4e1364c593e5840a3f5fb55ade8abd7f29a7901a5b6b3ed72ed5ead771f14821b9f66d31d6e65b69b56962cc60a2701205f786eb39d77ebaf3ba26c6222750f0c7eb3d872aada758ce969327787353d01f9bad3565eec4096a95576eafc4f45de326ac7ccade42c80cf6f2036d4e98305933f898f2dd061d36d0129c7d616b70d564fc2468c3f9d0466324137a224ad877b572bf395e8d2de6719204864ed7b69418ec954a9e20614df76b41d5e58e00dd635533412657a5572246902e5b7aeedd63d94d6a11963377289fdbe452bf3b21822bedb94aeabef4653e19425bb22997ad252ec18910bae77aad5bdb77f8e623721284e91a4a6deca65b9db3e500424b8d39bb07593373d3e3f9fcc90fd65466a88d4185ea2df3ce084e7cc09cbba4d4b1e41e6cc73dd84daba0aaeaf5e69a4e78009535b8a4aa36abcb79b283b9e633c9491f9b3b25b7e044078c5d8213aa564cbff1cb41abb78350b59554d7aec1090e52ef93afa5b3d7569a930627375049a5e75cbbb5ebe5fdc5890d54cddf9d4ab2e7b58cf138a9c1926ae9b67aee9eb576384e68f0cff96a572b93ba63ad89714563328bdfa593f9daf950d79b9a18631c81892ca49cf05d9f724aa6f63a16bce6f25b6f9dbe3575bd9bc0425b63cacf4aa9f4de539997fe8f2724a4e3d980402da020367ca8848ef08081c92b5ed792be9a63cdc1d7d626ae704ecfd4639dacc9c4b82224c81a26ad70a6ad94838b1dbffffa3061c54fb66f557b9edeafff55c8ff5d6dcd97bb4ac90dc34415cce684ae50e5b76489a542bdc650eaaec2d6da739a18a1092a3e39e6d2e3f7948685bf6324c3e414afedabe9ce3da589f1e51302bdece050f97c8c1925989862db2ba6e93506bbfdad492918538fb5c61af3df66d6c4e8384c48b18b4da6e4aef489936a4d8c992fc2a11841018fa2a844108623792410898281200642103a346604004311002030282412880412c18856ed1c1400025560546c4228281847439238200c06e3288882188661188622290ca2304529a70572ce17aa34df4519b01c7adfb7a2546be4a3f3edbc7e5df3f2a5cb5c3f82625af1a308da8ef45ac6e2ca9281651e422b142b0af118ffe4fe7dce3eff7758cd82664f96d21aedc3b7bd1a40c7d563f4b8c66ad0d709b6cdf920c3418c3db5712464af9c3a446db762b4ef9ae2649f5043bbe3b2e48ea356d0e93b19e20cf1b314592739d84d68bdf9a4e07da45aa4ddb8bba8843dfa6cc350aeccfdf444421fb812ee2287a847cc2c42237aab22c3ae98a332466e88236025aeceab87ed7d51205fa935693d03f85380d9b4b3ce38af92271298ab3ad2638e6a0c52f39f1fe77ae7772f384f4a694e838baa0fa71923de196ff15e5f4ed185847fe982544d99efc9b0548b3d5111ca71a546fdd0c1af0500053dcfd5a6c88e28e375ea961f44c2478065c30757cb50853b41d5453af7f38f14b8ac24a937da2f0569a62d3eb0af5ce8acdbce017b1774040ebf3bb66ca0c6a423ab648acae421b2872ffe1f3d6158d2b544076fe58e6242aa1e02ddf49b7a637a77601261eaa95373c43fc2e39ddc2eacd3f66446bc35bf0c6ce50df4932c7bdc0dd5b0754f66894c89755d4399793072c70c4042f44591636155e4922ded81a5698584ee496a54c37ab280bdb3cd8640642f6045dad5102cfb4ae6ddb9390cec444c2ed2e81c011f9d2d556c9eddc81b66d2bb3973aafc55dd79b9c56557c6f6792ef0a74482922dded87ff2905c5b4ed6cd3103894808e49f34e2c4d1f9d6730792534f0ce7d7fadc58982005eb8f80c01635c1986b983f03ad3b43c407d83e2a9d837f4d486f3b5f5c49ec17e5096715031b4ce374ae1d607df1a17d931e0b27965d2502d5d7a401db378d8705c8a813e20bdd078dce4cf4ff12e782a15686e7703399257342331d1d3c98c89576418dd0b88e0a5af0af9336dfab0caf7691d9f6fdba97833008d831baf3332694a9c6703876acd8638897d37563ac2f3e5c49f65b1354e29bc65fd31e199fc88c196d59a8c79545767810579a22f2e1e002bfe2c45eac9472fb1533ce79dbad6d39f44bcef35969e80742d34ecd995e0a7e34c00c87679431633b4363bf33d1207089754b495f55a1c0df1d574184a1d3ee9a99e425c4b9be4892bd334c11b668e0c1889db4108e3f195a1427a26f0f1e0f9411a7ab343ee214c0d21bdc001a6ae6a8cb4afb3d686c7575804c1c94990b7a6f09f74075b765d4ad92b50f7c4a9521f3c0bd986247c1649379dae0f16822d8bda98c42418fe714ff3a2cfafd2fe734b76f8922ec603493a8e08860963359e4644486cbec2c4d743292d60b14f97b652aa4a6ac6b69d771cc4a7b1c9c55f4e3cdd45b79bfc7dee5a00a34e7e5b0d92e7410dc8127586c0f8ad7f9dd53fbded2cbc434aa1c91cd50dee6661bb8782c97138ad6faf1fab9c73e63def36c0d7844095eddce8670aadd46bf45eab750b0e299c22f241b0f7f5c7f9bf90a3de24d4c3ff6ae6b732811b752c5b5d16356aa35edb4c404be84428b63d5644db51f50965ab573ab97b79c9a052017857df658d5af82df9757f0d14c5089af0930febb69dc9eb2eca574dff70f6a46bfee746451a2b6890210c2365f969cceb884b265cb130f4b5480d56790326d5aaad228c38db99221f1e359288b7809c4621d315a482e3ffdd7e284c0328a6d965970972825887ce6d3d0984323753b3a72fa8f8e248cd016135002c0abdfbc153e1bad27f9025149573b14fd6f75e9886e08c58679a1bb45a5da05f4ddb9be7a512f04a7307be432c6fdd2d9cf17164cc392a80db8fcdfd4f551892a0d5e97e0d429d8e020de8fa2b52df40f480a6ed52381d9424b5e91c645092735f4611e42340555b2b7c227b5b35da1206b881e2f5ab0ca69aa7cac213713de4a9c46a1a7e3e060ae613a7b9940faba873dfb07d438609e918c17204d673224fc2f5a9f8671dc1da5b96d58ef4af83e54b0b0e9394c9b2d645ed9fc6032cb92116686052ccab9cf8b694b6414063948b8cc30cfdb03ed62137792afb881640e9aa3d4422224973ce345216307c9bd51a2f2958b6da5d27f99e47eef114a105aaa5395a176cb6d1c092ab6bcf53a7164f6f85249cbb508afb9dcadc1c34a8299c1d04b1dc52da2ed3aeac41460cb23fde5ab4fedad4fb351c14f0e0959312cd4eca21bb4bb706e0c781854bdb804b014b405b337df436c25709112ac9109c11b3a451bcab6bc756af8cd5ef7c4577ba2be02161f69cc2fa0a83537250803d39a98a6cdcf238409cb54f86cdfe6110cd34c213fe254d149b45a650f436b1d8205bd18bd132ceb9755d0a37789e403f91c7420f59a0dcb78ab7ec39cd7ca01b63160a92781619c713d67d5adf91ebca97c87135e3bf535615077a535ed50365dee072bd2a470c6711252ba0da66433fdf56cd3472a86a46449db80c0aa5b8fac194f1877d0b0a949cb962b830c853feb2293a04ca7f7762e743469f8e62ce300869d2b29c21541c8b3e500094a026979cc12ac26ba50a6b212a2d22cef4ffaa735008bb4916c2d5a72100108df57889e377b5c8a5b7d88a9996f989063120d3e3dca0fcdc73947a78fd4e738b56771c895eb4599438fe60f5f536968f9e31d9f61a99c1ec2568ca6c6b525b9a22b36e56421e7c43af72e14c93e8f602c8468dfec08f92170225ee7057ba84259d6bb38ef84c23779ce8b00bac43985e2a1f10803b9764f066da14abf6549830e6322323a11356553d5f1c2a17a08eb2c1526751ce5ea3cb97f308dc8e0525226bc9512846a799a743faef154e2a42c575a0673981f24c81069d77f1cd6c0b4d9f800e670bad9ee8db3ac6938d3a40b24d5c5633417de31a35efbb203a8f6bea99837235b4ccbe3bc578e6d605fceafd2a13f2802d0971e16c177fafc47e602e68caf3e2ac89e0537b20c7193e4863508fd7f55b9288700227432d43f12b6999443d7a2eb3cf26edde8b66dcb0bc56409c61f1441065ec13ff381fe48de811b136480fe4ca6e4235b1aada71396d102730f3c5e227daf1b183fa16609028cd27490727066c9c5cda5172aabd26c62e547c28a5b84d09d873c7607b95f0c83b8bb09e2414269e3baa9a18a67a35ec9f969d6ff55589b6729a01f5cea86d97a06d57e98556c78e0dedb1ec30be610337a6a35dd0c78a8a3f589bcd078076243f1618e320b815a39dc8b8aa9e2a028ba96f2aa3cd1321c21a26df4f156bcd080307975da62ddf323b1c6ef38f3857310a142783889a543ac016f0d5e67b59be56faad8950f4a96e811f9826faf696ec73b3efbc2e1d44e4be062f13f5fc4804b7c5d4e0f010bb98b577169a3a65c730d9cdb2b1c32151166d0d40bb07fed5f6489ed66ea2299a90b00b9c0a7e01e6054f0b71b384dc147771945bab1f3629bb6d6729a946bf39f5e30e5688733872a6d5fbe8cd99652bc3400b9630dad5c1272384b978269b9ac5b70275f6a4936d366893957bace15c56349f0afb689f23b8027e670b5353020fa2b19e405332b7dbee0892700adc1e9c699263e074ce6c128732f036c4196c408fae6cb07ac2d1449b6aa08c271cb168eb9ef6e6a75cb78209a55c214e72ea18dd3beb4e436594c12ffa76b3cfb39deeb8ef7c602f1e86034f88e0aa9a7d46449f45d41eb0dc4602050fd748109cac9641f56b2f1fe2db6cd7fe41ecd61fea3095eb7ec6b2cdb74bb6474fd85457a3b635dca6bde52d59c13ae210afe6aa57f0ee3200e564fdd0a336506e500429ca783533ff0888924d0a5689996b087f7a3dc49251f728a0abc53748402b640bde320b5fcbf536ef6801c53c4764e8338ae54d04fd13b0e67b8106aaeabcb86ac812ecf678da086169682411115e86741d7bebda4cf396b7f7bcb7f8f1814daabac88fa967f001e3ec331609e25f8dddb04ba1bc9548bf5a959b9f434231c0878664481dc9cf972d5fc8dceec45c251bfc95df6ea161baf3814f4944a45c7095c40355112e1752519c587f58482ea89ae834c669db1653789dd48929cb46d7894455671c94b669d31c47fce0d85d11a229b84a9a0197279e2201025ef9176b95a1fc9cc11507f59ca02c8752c272bf7041909b11611fcd8d2085f1f222c1f582ddb361966842f8b08921f122d651b4314ca4dd4b060c118d45ecb944fa391f80bf0872f4ba6735d5a83a685796d0b4f7dd4740689796db0837cc614827b2200d171705528c23e3021a55c901152048d51eba2f9bc72b7c445f0ac44c6c38cf25bbf69399d8450804beba8eb4a9d483e300e48a9036f8b3f9341d41448fe112c9341e622646ada5e1b0db2c2b63d4740c7db20a591458ee091a5d2d947554acb010e0a3cab7b808001123b4ebe1e5259b6240d57863f1b5f0bfc03aa83d0e492cc1eaf17aba0c6ed33e9fb936f53d10bad33880a66e4bd9fc65665a3ee20b3be7ef568388abeb1e3acfad81b4e1d5d06e18f5b8c30d392fec4813e31d9cccb1f02852800a5abf9dd9ef1056ba2c4bf6f941e225831234137c7015bdd30743278817b87a0eb0638587a34bb1c5ef832ea5f2901d89d71a076f282cb4ac9a855e30e1aa054f147c4b8e2d9b731f667aa873ef05946596f35a158475140d1f2218b9833b0cb1e8792f805e93feae199bfefd4224b2eab02b61587e6da13dfd42b2169b917d0a5e57a8701087abcce6a0868f281f633c0ce74d29092f8cf5215e10cf2e0997499940e28fd85e9ad1fc9e595bf6f765f646caaa685291656e594f742ae45004d9b6348ed91cab4def32dae565bf52ba4d282363844526f2150bbd3c2b4a690895fcd44ff5ad116084b2890d43acb2d7a11384d06a97cc48147484d478497f11d5500c78a680341f5ffb4ddf08f6cefccc5e686983e9d9cc2fd2e8c7c3e4aa8bd796739500dbf4cdf2c293d0859f42fed39ae0384fd506c0372bd3ea10a1d99d673dd3df1a2fb5ac03dafb37663bc3bff3fdd9ef446b9fa4d3aacb3f3d0417bbe36ad6b13fffe9d8245b38f7af6611adac30326034592038dec1e0d05dbe1077d4d44d8c6c0014a9fb9b78f31b6d82815285486d283dbcd3f00515ad73fa6f5be50b6aa9a0cd23b646c2a0d0cfe18306866e5db060e6634fe1f16c00dfcc19b99010be6e4697c10f1d594563d7e0f606dac264b45be437d637feb66388ff708b587afc25cd1e0072a2587b389902abc2468fc8c0700f058ee1e45d198fdc6de79b27f5db5a1856cf5e4bbf3400e010f811a7c6027e8002bf8e7548f96152c49a6c0e3dbd86d6c369e64299e3922a1c17183f4a16fc8c65e7ce14454dfcdd7145c623486aac4e9716057e78dc2d0e84bd7ab75d61fd441353ed323621c48df2dbbaf6ebc379711f64e001f445b56b4858cde9e230d00d3a19b86347f66c5ef385a812e394703c05bfad87890ffa1b02a6fc84f2b382e412a5bd0c6707171012ae0c9ed286c24b032f533828652bd98b7e894693f4e5ec1887485bb7a59498fce48467caf218798b5546faa7f9d4dca2f6d8b76c6d583c7a9aa49e0e3b146e29ec3641b3b9e97e81ee1b0666fabb17d42bbe166e0419f61ca7b78bc3f4a142c9e81fdda7693419adcf4384b0113f1cb0f60f4d70f9bf9ec5cdcaa26b6f85aa07a1ae24851c7c4870bec2b4bc498ea04195fa573882ca9daefe25d316c7b6904f0cbb1a7da57d430cd745f8552c1bac4f25affd0c6498f4208a3cdda45871471f1a03023be269ac423b263b0f616a36bc085a78cdbfe2fe1395ec96741fb03a0722c3d369afc1a01633f0d7498a85c92915cf3e40ec394a47ff353432f05f4660a95b80833b280ea1f5f0300f41b9aeafa0a65bda0cc15860c80868c96a4f7e14441cff6f6a5a00b900762360a722b6a41e4ad8ccc2c1d325d3629f54cb9fcdce715c835db41a14224fde99c6bd88f7edb9f2b052bdbd03f8136f0c30769b33228e0d76ac12b4b700305b976ce6a40f3689a1ac54582601ab69cda93bb9a95a8b4aba71d3764f5229941b8680551be0055d55876f2ae36fdbaf27f9b13c6a33d580518be1fde5fdc854ecab05bc05c10eb6dd76767a1aeef8d778c1490cd7674ae1d0da61c21dc6cbf7180658fd1f3db6d55bb484d0db6799e99365ad3e61675af9742f3f596065e6bc0f4687640adf3fbc78c2e1e42c268816d01fd8590e4625d68be2c798aaefc68d2ab34ec39df2bcb0ab0e52eeed2ab74728199efbe0d42a36fc3c598178d64851279f9374e2fcf2eb1cd54513b6aeb25f96c8950a390689acfb50f02ba1a8f0baa23acb770e7de1b8be13746aa1605e50f1fea3a67e6b31f73857a6f7a7ffb1ca8d12a5d70828d566938128909b27dd007845c8d3569436027eb44c5858c42212d0a6bcb20cafec1b0c8043afbb84c9247661aa33ccb2d6702736b10b0fb69796c9197bf7205582bfd6b91934e0b7d2e56a67c4ea9c43c30d4083e49e387a8ecf2caf07ef0733028d48676503090e102d08461a9a0e4ab233c5ff551bde6ecb2cd6de4c23f0153d985d5b922d17f6bd3f82984eaa5739e8881fe5e9903104a99bf795780a4c2e558b8c7e6c25fff1870b77adfbe72bdfa648c1cdaa0cafdaa95e206153f06d461c8ca88f4c393216e112ccd54ba7c45f031eb2acdacc6a7b9349596e29941505779c19042f0fd334ddd6a8ec00a434629fd48c8f91b17c85b2611b57980061250d3056b5102c310434d9a33c097b293d55c3070646731b3521a09fee4882c89939e6e27a7af08ed0306ad5c8e5d50b4fa7989088165452a9dd3f4ad8eb1e151f6d2c79fe18c8f6fb83d3ef7acb3e2393d08c22663f05360c573140a82d11ac324e65564a5f376440dd138bb201ed9410519e0e0ad25078c751c9d9d546cbab26c91b279a172611dc5e26e4fd32ab2bba9891d61da65a87bab6586678e38e2b0b03dc621330f08998a0934f0a8499026ada4ff7ce5cd6e19dd1e31334624184761d7b5e7783a834594ddd7e70cfef32236ae1ca9d4e484ec3061a02130fb84de88149569aab587f3bda442139b4dccdfac4f78084ba93230740de608bfdbb449c5569dfa877e9d4f2f8d7ac0c6201ee6848a582505f6d78923c88c41ad0154ff3c8d310c63d9a9a155fcae7a793076a7769c54f6724e7ff42dc6205bd476ae0d63b05c5a479f9369a51546540b42c21189db637d99a02882b5c19c8013a6c3b2f85853bd2c9a025391017f0e1f525707074f9a06e607e501459a307136166784d74928416c8ea9b1b62d8beefe1d81016fd4b17b305700231ac429da782011e080d091191e7c6200ea81c105ae2575a9b682017571afb64b9b1826a5fe256df33e834d006a08cf8b52354ba18e1457b23a271876d77d987bf03931d371e9c50f8f92bdf3c0792d63618a37676dbd9687e14e31d9264c324a56b92628b84f59fdc0c2c5ee1ab1db73cacd6419e30465d44e3a243b669cd803803b86fae6329e7e19ff916ea4cd338c3034433c9aba9f58a66e79b18eea0d801034ed90bf7e3bdf600be8aa5e8eadcc063000eaa7b20d9b84c9602b04e6ed4cbd0f8bbd5fd5bae48fce32f78c9ae393a0e7c3474430813ad810aa4341b5aa1768bbd88c27f96c4d2bb98ea35ff727593609811dbea5baf8fbf3940379b6636f3e81b09aed4d979c3624b7637a257e6d07f944fd1eb730955dccc027985a4eda25be282f84047ad234ef5ee2245590fdaafb50bc92c0ca84e3c9e20c905cafcaa8ac9026eba8c4d24e498296d7ab55a498ef2e10b0a4b0e42dfb8afc3bcb578f1c83a23bee878830898b2f865e4acb25dcf28a50945391205cb3c28081eec105914de4fba31c286c6fefad6908ff69108f9cb6f668e767ce0745bd116231d2c4cfbd667d66416b049f8ea9cdae2a123a04ef66161718b0588d299ac6cf960a191bdd261c870264dcb3279c9f540dfe50d2f586754de0d5fec929d61501caec7b3a9896c720995011f4a26320c60b4275b96c9d3b2f28ffcc5fdad5cbb90e1652884263b4131a76384427909f8b211e8d10171694fed5d9776601d5e442697cbad52f87ee79c710a421db0be3441ad23c59636434e670d6b5bd7a317a197207f36e352d4086b1ce38b852613d00d8843089a73ae82322a7214fe2eb9d29625a269c3481363cd2724df05154326807c4750a530612db45e7d0a33fb6755542d090a52bb261c580ba5b17fd8f2348c215edf06f4312a0181da597367a063a4ea0acf29544ec38f19256248e289a9f2ff34c27c4ed82c00f8789e3f7b6bd8e33f7c4acc6f399d8a7f5f4d77dfa8a5099f79d568357c84153bdbe8b5d3185494cc7aee5e45a44b63b06116cb18205a832e0272c34c44fd0583bbc3d05a7cbe2cb05626e1a9b607546b90c2dfb7a1dd09c3785a6df261bb76f867b1061ac3d313565081edd576fa1d7853152943603e8e681d5ff9bb6fb4893b93272fde6efe74056077f7fd622208b200cd41c6eccdff36b011fe08ca54d20a1a4e80661ce5a4c148d5dd5c137d658f6d373776ec21c83ad929f59a4df868c80be216c4cd5484e74cc74d02095689c965ad134b5e5da33f6c04e0077a8eca494b3bedecab0e03c75bbaf28a26d46e41f3f5e902f9e0a2feaa78e312a9325b45ffba866e8c90cb91bb299fff2adea1c3815c2d430495710800697f7946988f2c6f664aa1dc582c5ebd22fb121ec7c488fc0cbf47c0d3dc16214d5545b050739da298779b42a6dce98244d8bbb915e9c627248e141a2a7092fa05565ac7ee96028866df311b312657d62b948a4cc6f02ab5b1afced3069b1c0b658efdc3365f3ee52aaeb232c95f5e97065d62e02eeb9199aab3246b4331d58fb792f8d342220ec6ef8000b8c98d878ec668472e2105b21ab03fd288e378acaabd51067dab3882570dcf07ad3a299693ee7fc273e9d97bfe2d26f9710a75b1ba04c584a3bb0663d01c63f61ecbd81236145e2ed9fe84a74494db4b56ccfb8d5a02c8a72e097bb0bcd260e9b78fa32091be8c318cdf76d949b423164277dd6e5bb1a4b7bbfffb3083adc55956723878d0e9fff2456d4b0245d32c32860a73d5a9c5ec84f64eac7b70bbad085afdbc4e7bf5cd86f1affb7fa217bc6391703dbe5254fc0351d02279cbc0260a8400d6f30d80d88fee5be6b334b1a2bc3b885df127760c0e3beed7e139088ec912daf319cb31f51121acc55fca45507a21b746cf662074c11be673fc1eb171202e6c70ab0dafb90d8f9f089140cf8a2472857c73ce5a1586f9888a137b14d0ce89feedeaa715b0685229cecc1c5b2452f746d74e4c9ccf4cd211c92d5da6a9606a2b033b647bce0dc1cd849d30ba49f7251384700a6aa77b89f6317cab26d1fe2041d34fcbe0f481b332644a6ad2eaf0b88fd6f2d42ce82cf3ace1b57afe42137ca1cf4ced7c321538a6f7a928e4bba45920f46b39134738be23bc72e65a3dd1f714d458e71535088a5fd2d64ad7f203860978b5ef2ffb9c12cc9f1da67c32612b0770902ee39865835dcdd797637b4362fa22c748b97a1a36b444a40385b5ab83cb87470d04ebef5833667ba88ff9e5a0a9a586608c89dc190b892ab2ee40cb55fc06b632ee660e7191006b8f7323be53b0551d8feb7b8d43a1835f7fb936995ae38745c1ed57894e58d580334cfd01a1b14b937282e933253e1b8f31f05639e38886c434101caf629f7ed6343af136bcdb4125301569fdd6f5e5d7f046e1430569c708a1e3eae322de41d37701cd36f5b5663ec2702972c6b6fc8888bc78146039e117c02535108205431bda2b8217829f4de6b3bf8eddcedb4515e6194366c94b72c9898846412e5a35a97b29071d550cb4f8e2ea286731acde3a38cd38fc75cd21eaf14f21c4e36a0c27aa0ddcca0b3636662071de068b721d22d00565192cc89f4fd57f39632cde06ae28c39f50a5c42779e4908f5b561973d85a510fe9d60075ab066e6651981666f2b739449c561464d93024a6050215f6aeb4b5b88797001ef62766cf7267194f2b1b0cb6157d202b5a751bf9a07a959af7ab5936450837a940750deb8cee160b40ab01aa9fa103554919a4910d48722efeec2452f0770690e95a791d89d1013e75eff2d885dc8a36ba9a1234f937f11bd93e2705d176ee847931c18c440e04f66cdbaf439ae1656ed1b881ad1b575394dc330c54751fac88ec26aaf252560649ba8d555d93b6cf636aafacc688af067a1e2e3d99fa6624d838c3e2fea61f8eaa3df0e06b0ca22159f5833dcd93902c0ce18a49e619bc675b03407563d2ec0668e2636edd8cc9761669e9acddbf20d6f08d988c33f7349c0a3de3acb84079318434411d198720cab68eaea3bc09154eede78c81c3affba9d9b67c2bd4a2425aa22c219b2adea91b4095b4e1b326d154819227af476fac047d9055b829bbe9fda875140368d6649708a53efbe856accf62a4cc928f808f2ddf309759825564f96f146e86e6f03ad5c4760b110cf03b62991e1fc2eae83abef253198c5f4a034ed42e8f0114bf93c69884c906103503e86d5ae14df8a3798cc45f796ad744286770f4623553755ad0bdd48c8cca866704d1aaaa0025d193aa1e404bb25416d5242b079e37ace3f03507c9b787d15e309a2bf71b57e8099e5bb8772926b0e9ae66b77fb92dfe9fdd4fbbc52e432a08cc7aa9197f400547c4bb9106132b28695c7091324eafd8e922d69831488eae16db5452ae464271f5ebf6fa3036930f690bb00e31a884c03d9a80a1229b9958d82193210c234b4dc06aa1d24feccd34914d60855cd32e3b7a5681fc82f9d0333603234082f1538beae1686a4d264aa3fac888d4ed02fddb465c75270f79dab7de7990a2e2165158a041a088ba0da4b327e48a8af2512ddfe21b4534f9297c99487639373be6fd5cdb510ebda12d7d0e57a50838bc4d714fda7d4cb5b0ac089461ae196805ab21edfa815bd7f0ea0bb52c5aa1f009eccf96c1dc6964014e33e616632181196b17c549374bd0784c04ddaede20be2c628d7d1b4ee3d99ed7ee2ae21f034b8f51374941df3b9c181f25189b7fd02154fffbd3bbd67e6a5379ae94c45c909f096ad27da443588e1fccd3091a5c7dbe483581a8dcf675e462f30a9d073b73a0b89f164b7266adcf503d6ae0cac932430eb06d0d67a6d19ccfa6c3f29e228d4b76fab91d0215a222a81a8d49f096ade86ad33ab72e0e7a1bb762fd26c09a4e19131a5e25e9448f47b12515e835c02259e7893d564860b7f00396f3bada08a8bef4fe419e9f64b066400ee6284c66170acb5ff3822c019b51cba00aa2be32b986412ef6983907734d43138162770413480332867494d033b3d4d437d5851b0abea67a4a19e8cf783b1220e68800c1a0674ae0a1627c08f4f8b2f2fc7e12877aeb007b030fa5b72711649d69888c4586b6988f083169f3203ac663023a663871431dc51225bad783014b4006ec44223fd346d6fc600c819c90eaa132ea209ad6b950d8db41bb6a21f340fc7335a9e9d0c2ecf3b819c5121c63c7c421ba843c148db4b4b323dd148eb2b28df30881fa43252535934d2078bbc8eaee920db359e6b502373f9c466bc65a4cb0c8d46ba842e206aa3910e458575991bd50f70703c0312baa3912e1d1f8d549e96ff5c78c29978485efa422ecf5f314bf5386209760d2303cbd27b5305ba67cf6ca9e857acc6cf40638847914ec571b4dc327f84c4e01f46e4528d64f1823960f84e466c5d55cc068957ba76c2443916ae25e697cb5b65c0b9dce3c80d21dbc06065054d2f7eacd4a99ac9fe9245c9af420e269b0e8c035320c7549f18ec5b317f047803dbff70b18f8bc9cc1324ce36b82de2af91fca54d0d7ec1d614d244542eb8d711e55bbe5816aa6af9f4be42e4226d552d33e8da12c99e0086160b69bc0dc20ba5b99a8e7ba344ff354309e516dc3c232720912142206742f43eb1e75b627e75331e73bb57e3ea816f792a311aa5e8d8554d90ad4826de721bc0dd7c73450646dcc3b044cfe1211e854ffc5d20aacc4ffe70225524455760a0f6037065be10389f86f30b9d87166080c70c7898d868286150c7c0e6cdce3736c2df62226354fa9f6a480686af2d9013157956c4191fbdfae467c435afe39f4dafcafe70be9d763080ba84497a54acdd5fe4b32344b0b4ce4708584c99a52997bef8b68f12ee7034555530d955a517203ce0b91aad2ce1da1ec712bb4d7297273547635e07e5e2ab7ef2a1b771cf3b3dea770ccfffe25783c45ef63ad564f61e7c1c6b6943c1a1538d41ebef6658e144c64da3d2fefb41385737b0c9c0837daa2da11418d455d29f1214d9ba566861eb2fe2f1dc1321707033e6beb40a87a02cf1e408a1391f7d880bd61edb2a5fc571294f47d0e2c76fd58bfd39e4c7530df0182fbf8fd08967b58fa0fb8af62ccf0ee824374785025745c7ea078793cdbe02db29d391dc777b303ccf4627e3537aaed9af522ffc456a814cef60cfcbbd71081077e279edc6688abec5faea056429fadfc51613df7d6a8f9bd7a978842371f552be1f1b37ecef5516bffef70909187ebb9c71ce5a7750777fccad05dbd2096592dd1885b1a8750b085b5594a8052adf6182f83d63547285d10d2e0d43cf54342c7382fa8c310e722b2b5d361960ef98e0108ccc73a83e3da11ba94a53995f7b453e4fc00e8ae354d84449fac7de861b3048e22237dec99d527fe1f8e803bcf9cbdd0714cd244d27fa733b9c9c0cdb3d979cb71b1c8bf439021945c5632054a4292ec6c1f74465c2df9e7ce4bc4f66837abcc1736a5ae0af5d9e2d4a4e7593a900a10d02c6dff7ec2e25097a0c5cca624a2e67150889e2f837b2a6a4ac0b420faae41c70f0cafd4b991ec23d4e408c0cca6f833ccbc2d3e5b4135d7c968e7d1166f56d6d821608416af3f489d89a0b8792ee000310fe3b007b1f76d8f79a35fa893a37a17aff71d683a9490a11ef35b46d46e5ee12d18756d48f80d2020fcda722df6600c69d16cce73ddcc9fb5d058be44377b5db386f704e72892e310c0b21ee610e114ad2d1bcc43774f7007f58e0ff4fd974b096fafa078e4f975548869a8cf3233a0c2fa09590f89c203d7daf7afd8f68cc74c1472ac441a4819f950f23cb5ad3edd977b363ee819e74b19baee623b73c0a753ff7f60e70a4bc6130d9da33af1c9c370e7a109bb84e97d906f5e91ec33d37de93656362d27b78df150d2434a8f736372cbd76ff5d455fba73fd25ff3e02cfc34f4d339a64500d93fce8ab0df118247133b5eb5834e3a07b440f7ae8d7123890b0461b8c84a1502b4df6d6c6edcb9c6cbac7bb9ea0b8eeaf7120bb5b005f8514718a204ae4d57021f6f34fb85b2c3c3d8332e846dc992d7e024ccd78b2c7202b197b3c3a67b823906eed092724128695769763553af540512345e5fd42929c22b872c0530ca20082553f46819139cee1c7e8cfde432a868d5449623311f9a9dfddb7a5e0c34b07f2a93e5eb42c472b23970a4eea3f9009c062a711d38057b67930c2f7dd69901860767bf477e4ee36e5a29f8583702a737ecb6ded4bf498676cd1119aedde656b9defaae6a827adbf9718958b50d6cdfe2819330a0ac95246c77a2abb1e4f2de03b18b2a1edffcd21b629694f6c04d5410c9caa196351bac8c445ef094efadc71b1f6a1cc926ec152362cab2b336f93c152df3644bf91ee6bf9b4897b13e6941f907bd78b4660be062f4bc0d5d0934ec5f7afe828f3be1e2e1fae1e9acd1a2dd9fb13df3c151d9777d85e4d7b9b6d8e8c6aee64b6454ee31728336c9977d69abdf58920680e60e8ef5b1e6a83a302f87447f3de1549ca7dbf5f4a32191d72ba0425270bb7bf6f17d282b3a172cb4287b954c625118da112319485a050f5cc97c79871098303bf669d6e8903fd98dc464d6374a24de1f8eb479ffcb2a901882577f95fe9a721cf4b48fce8c3667037dd3c2ed43ba138331e13dc30be40a6dd07ea7dc2b78f527f0e866c442575230a4e3152525cd3225a9280912b287502d9c24d0fecb9f0f8ed52f600a5cdaa157061e270445124d4960c0060e2b1c210c7f1ef6294924342b7c9c033dba5d3fadf6560b87e9b7616c2bfde253b7d2e31860d38bcaccc6699979696c47600bd6c1d8387d25e3b9a9a29d15dcf63d1b9a10717a5aba28948d55d353dc2302e3ee97a9315945d07caf75cf13d30b4c4b7881a0b2ba198336408db7eeff1a72ba35452f2229fd3392d264c1e046109a6a723f283fdd0b295067689d026bd26cc986d97e0da6179199b121565e2455a6fdc4b408e76e13494a23ea8b6ca8c438880a25aaeaa490434f660c58dd74be371b083b4e14cf1a029b8c6d5b7a3f8fb1994df0628a8c0567c43d0739da80aec11785634f9aec6d4bf7f7267ad42b74d0833628cc871718424334368cf24c9c980d22531c71c6329539926d1e3d33df6df9f24c1713a059a704ecf34927c4e4282856a38a0fe2a1685247e6f03de067fa84fafc8ecdf5bf62d68e8c49dafc3c2cc531a75db46bbfac79ff77e32795e2cbb45d2419bc2ea9ee37a2b4ef05da56daac9e55273dde8292e3bfde07d48c6fea5f6b947a8efd0ef5a0e0fe263fa229d1032c8b979f1fa9fd8420eddcdb6566302cd707c662bbc3c3efd024320814b97edd27fe60b29046652381948c605c66d4360dc7f915285d1559d27eb491bf6c58d400c4c2451653e522209f8c7597e5c375f32114510a522ff96350c0dd6e0527004432d4ac2da84a032c86a0e8b75ffe6f1348b4deaa238e09a8ff7a2cf2ce82beba3073d428f6361798ce59cdfbb347c55bc1a17361168841b072cb6c1041e27d0ab3de0f891b8ef913e4c59b23144fd1b84d06887f21a646b2d96bb8894a6759791c1b243812abeefa16a114d1f14ad5a5dd3834e3997cfe62d397371f953f4256def55fb9b88c783641868c5ae4fe4b61fec596ff97ad3662df86cb0b85950bb11929d4e1815247a60c37635afbf45f0ade00407f98f41cec52bb1b73ef2fe81fcb23a6541b8ea233abfea3ebb714439d54ca433ec96d32f40e762541cf9a67c750f7a643101aeb6bee2ce9e69a27f540db51fab67f55c5bc2dac4afd505b6ec7ebad2415cf3c3b311f0e15b4be4a9b1df76d14dc00cc4927ff8ba3d00276d8166dcf9a7c01ee0df2db64e818a821fe0205eeef49f056c3ffff051f94189c6bf6c7669402418417af5447d3b237c1eb9504cfad72fea840798d2077b66fee5e74b040515336957858afb47d595ee1ca3c7bdcf8b4bf477ec1dbd687f99a1209f885cc13c087ea133b42197edf66bfd8339e1f4322cf20b9ef9a5ef8938ff1aa71fdac3ba0698ffdbc3246016712e0e1523cb10bf7f1d0806bf35552b9691ddcd4f0710f6a2ca4a003e6409", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a63": "0x", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/asset-hub-rococo.json b/cumulus/parachains/chain-specs/asset-hub-rococo.json deleted file mode 100644 index 064a2dfc0db8..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-rococo.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "Rococo Asset Hub", - "id": "asset-hub-rococo", - "chainType": "Live", - "bootNodes": [ - "/dns/rococo-asset-hub-bootnode-0.polkadot.io/tcp/30333/p2p/12D3KooWRrZMndHAopzao34uGsN7srjS3gh9nAjTGKLSyJeU31Lg", - "/dns/rococo-asset-hub-bootnode-1.polkadot.io/tcp/30333/p2p/12D3KooWAewimoNJqMaiiV5pYiowA5hLuh5JS5QiRJCCyWVrrSTS", - "/dns/rococo-asset-hub-bootnode-2.polkadot.io/tcp/30333/p2p/12D3KooWA3cVSDJFrN5HEYbt11cK2W7zJbiPHxR2joJXcgqzVt8K", - "/dns/rococo-asset-hub-bootnode-3.polkadot.io/tcp/30333/p2p/12D3KooWPf3MtBZKJ3G6wYyvCTxFCi9vgzxDdHbjJJRCrFu3FgJb" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "tokenDecimals": 12, - "tokenSymbol": "ROC" - }, - "relay_chain": "rococo", - "para_id": 1000, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x1058c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1facf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x50cd2d03000000000000000000000000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x267ada16405529c2f7ef2727d71edbde4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90395122802460ba3fef86b6eef716f2358c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1f": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da936311af37f3d62b64610d04a45b423a8acf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a79b78a206a5c0e4c36a85f8342b9ea5fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dcdb4d826419bfb6cb11a9e4558a0deee803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x110e2473746174656d696e65", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00589c9d04bec6c5c9114f1068ca261d6898ea2b6f604b838543946d20353b4808a1172684cc7f2c32f33a1e6d3deda1da9643964377abf0d25fd0ab56e867512ce027e7200a8d6ec55d3b5793e2e8ddc8de726f29a59432a51480120611ac111ec0dae74809f3f79485ccdfe48839820b0d6400034e6fc09ab3efee0d37fb302380396c2ed7584d726ec34397aa8bf9ba6bbc73e7d0f943e715fbb93560cfebb2f1f0c6a74b5526e952c57ee812741dbad41e3a06de78e81ce81ef7d3968d15f3d0e6eb0d3ebd85cb43cfe9523f8410bad5251d9805ad99be42bdb9c971ddc33fcdb12eed983aca7cb57924b3f9a4a151f2bcb5e82dba74d81a8cad357a855f4a7fbc1d3dee3f2ab320e894b71da053eed3d2a3432abd39146a9794920a61790f4b515191103f7d2f20d7acbda484d07d5a5f403246086343d3777bd81696f7de7befbd4885e2993367eef8e8b32de93eeda850fb98557e9909cdac36cb1bad43fd23af7cee05645dc15e8a2b12e2ab74a178871067fe8a7ce98e064d77de68bdbcf2e72dab58ad553a21a9650821beca15f8d1afc4b762fa98b5ead1dabcf2960df58f3221bee3e74587faa75b54a8fdcc7094f0e99dbb0bc879455b953eddd12bfdce67f7573e798b449fbed7111ab32a84e59d57eed38dd6e71cb36afac87b01452c0fbd51495b7ff32684e55fa3ecb27db5627af626d4fe49a1f6cefb52e2de65416f89fbe77d297959107bcb84b07c6dcf8e7d5374d2389ce6eccd9be2346f8f3e9bf4c957129fdf2d52a3b34b1a675b7c1d698f2e697b53d21ea33729a5efa5048877e200d3b76cb7883cf25c3a841ed43cfa94b48ad09a292afaa11e2fc4675e7a15a1057c5b23cdab0c596ba4f9107ca1057caf91e60d887e272feb034c2fb3dd22adaf23cf5b26dda7cd6635dab32d49d9639b7c21e123fc2ec32ca601e38822333c30818011648cf0d2fb80250ec0a8d97e43e37cbaf6c9d7720dc6947f29302b9f34d3d75752d2799ea2e88d5c5f1cf897fa1ae1f9f5a7e479e5b3a26d55f4f95e482a7f3e5dd17da6225f47240dffdc0b68b9066b12e5d2a3f3055465d5f495fb349f8ef486ba26ad53743e7a85bff215b62a4af9a3fb6eb6e6d64642ed718eb4972e335f23ebfc8f52595074e915dd779790fce77bed105d6634bb3556cdf975e7cd6f9ab4ce5712e8eb956cd2428a037dc51415bd007e465aa34b9fa6a7bca295bf7249ab034c65fc6e91caa5fbb48ab24bba3fd9da8bca84dab7cb7621f7cfab739809f1bfcc14d99d99354c5107122f80038d379af0b3d6dc9ebb5d06bb69123bd624f6f8fc3d5875b69e9d6f7876761dbaf49eddbbb46366d0e5d975ba877ff8ab0dcfebecabc3adbd51245850731abe3efbdcc5a1f2fc333d25d5bff99cd79655a26f5ea91d160affb22fce9f2f75fea8056a408219677ed61bad58be55e8524c517cf44af4cf7773d8ada1ee890826fc107fcca6ec1b2fd4ce9c79987dc1b24e64d2c2cc8fcb8a2a967f596d5ea96ff7698dd2f0932d47d7f7d2c006a1cb4fa3347c236253b72602a94b5ae0e8b996a90db9e6d680b557f9ad796bde9ab796e58a6fadb52665320063df3ec0face2c5cdebbd4deeea64bed3a5d72dfa721cc7cbbd53dedc77d2df29df3ebcc4365b233eda15b77b7e6f25b86b3a4f9f3d62dabfcedbe7db237f6dad89b2f7b505ba6cecc5fe941d37ffa2bf09acddac581bd56fee6ebb3511db0e6eb7b2169999ccd62dafeba022d37fe8a355a1caa70d10b2de0d9dbfb62e28a8a9e9d2f2558d1b35b5ddaefa2a5abd33d85b9bf5daaedebae9dbdae6f93b649ce0f80b533690fda96f9b4a93902736bc09cd79b7fced3a52a6fe852c5485daa3cfffcb90d5d6aff4e4468f9e739ddd33f3afcfb5ae49f635d6a7f6ed3a5e6cf9f5b5d627fbe3a2f0bda13d15c5f9dcaf3cde752fec917906b12fb3689b33ad4de355f409c2971be747fcebd90c0acfa43977d2dd7b8266575a87de5375d9ade3ca74b71468aca2ae59553d1c27e1deb52f4e6365da2bcf98c947f52749bb44db29c2f24fcae4956562daf3cd27d8b0eb5a77c722fb7d146ba3fe97e45ddfcba6c3d46f8cff6ceae919af39b55e8cf9bcfb6eb68e5175ac0baa443efd7faf639dbda0b664c9756f9ebed5aaed9264d77edd6584dd26952f3e8dea4d8207559e587be14a3dba4f697c9263576d3a5fde68eee7b97d69bcbd6e38a9a9316875675be39cfaf0ca68a9f0be62200dbd31045bfa7223a0cf07b12828bf76fdfeb06ec54e4c657f7ed3e2dd9a5dcd6b3bd53b167afd857f9edae4bebeddb25e8ebae4bd17f7d46ba0f29ff5c1eac597c01c18cb1e87b25d9e8932f25d06356a1439f7d29c11efa5eae49cef7027aeed3d0f76a732f9955d34b8fb44a1869751f7d2f20e933d2da808f3ef7a2b21ac4531e69ddd34787b4c2243c60c0c90f40d4203efa3629ba4f83749fa242edcc9933743cf448ab0eef7cb215a97326f1a3a442f16156f96326c467ce9c39f3d5f4cf275b90eeef35d4fe65dba4ea9e1ddd26b137ba4daa36cfbe3a2db9696156f9ebb3293f5366abe9beebd2f3f5c96c3df6d9d662ed43ac2e60cddb9fb70be8658cb1cf663dcadf17fb5ecd7d7a2fa0769f9e6c31dd6fcabf1704f6d97ddaa74dccccc4dc01609366752af6cdb74becedce99ba26359fcb837195df7c2fa06d52739f2e61fcec38ecfbdba4f5ce7096c86f97df19ce92f6e7ed2f1be2e76c9be4b2ea7ebdf95e4ad83babedec3ebd3a2d0bc27e653035e624e66e0c9816e7e5442689d7b2668a8a8a8a7ec0ec9830c4fcfeeacc0d80010a40006cdfdc0660557ebbecd28ea9a3ccb75b5dda93162ddf8e7569bddda64beced378b037ffbea7416e4bf3298981530b7066c4f424cf155febaecd29ec494f975ab7bf867fda64b3ba68e32bfbe5ddaaf39bfbe3a9b05f9af0c26e6054cf6ed525de76c9bb4be6e62fe31f754e4e537ceb501db375700d8beb9d8fa42cb08bca5882b2a6b0a9614ac255841b0946025c162c35ac322825504eb07d6180b0d8b079618eb0bcb0b0b0c2b07161756171613ac32d616d6159611da0e1a196d0c98051807c4026402ba002e31b330e398589857985598549870585f2c2a1e0da21462149c175785ab819381a5868b8193c2d9c045e168d0bef40ede10bc8583819b62aa317f307d307b30d39863261a53cc3c63869966ccd32c63ee607231b7985acc19cc2c261613ccb4625631bf4c2a660de61493065306d3cb9462c260be6042319f984ecc263a09ad84364223a189d045e8367a08cd461fa1d7e8310d8426d33e68335a4c07a1cfe834ba072d84fe8155036b8ab98539c794a3c9b062604961c1c08ac27a810585f544d7a051d164d08afa4c77a1b9d072f4145a0a3d47d7d155682a341c7dea321a4c4fd14f34146e0b6381afc056603738094d0cce81b4825bc02ce0151829c2810d9c00082a534420e549098e98200139e00064b96121c1ea8115c632c33a4d226616be01db80abe02f4c05d780a7601af00c5806ec8563c052300c380a7e0143c14fb013dc0433c12ee0259a4b45a6fa41d583cea3faa2f2a2eaa2e2a2ca41b545a5459545854585830a4c754565457583ca065515d5978a8aaa06d514d518ac846a0624a85e50415135d15fa0b84079c14a83ca02a505ea0a541c1416a839ac332839a82d5056a0aa404d819202f504ca0c4505aa0b54142c329610ac362c1f5847a08e4019812a0245048a0ce504ab09d4102821506c5048a09240b5d1633017bd855202e506d5048a09d412a832141c1414283aa837a82f5041a080c066a83a283b283ca83b2835da0eea071d054a0ccfc159a04e4d0c4506250615060506f505d505c50595036a0b4a0bca07540fa834a831141a140f281b50545035e036282f1c86824163c14ca0bca0cea0c250665065503ba0c6a0744065416141e18002435dc1633018dd0565057503aa0aea0b350545036a06940ca818505274172a0aea051414d413941354131413940ba825a816502ba0ba502aa052402941254121411d41194171a18aa088a0b6505a980b54166a084a08aa489e9179483ce41dd20e5987fc82a4437a81b720bb20b920e79072c82d482d4833320b320e8905790569055905490509879c8294828c827c4342413e413a41ba219b2099209720cb4825c824c836241b1209f208d208720d590449042ec2d243c82148325208320812085c865443fe40fa40f640a6d15bc831128d1646f2408a9167c830d20c7962391a07ac05b90349861c438a21c36021740ad80a0946c3829bc04ee028f014180ed985e4a2b520b7682ea416cd825e42d42282894d4423e0175a08f9256611958048b4114f0b2fcbcb82fbf2d278631c156e066d8dcea285d172d0b6685ab42c1a0efa8bd64187d14fe82d38e926b4180d467bd15af40c7a05d41a4d4467691a341e4d477ba1ef602f7017b80a4c0586024b81dfe02770195e0223a1b53010580d0e02ff807dc06934303c86d1601eb0183e8377c064f017ac031683c3602f5a05ac0567c158740b18070c86af60214c210081059a090ba80005de1561f22f535da86e50ac3cf94013209e40f9a14993c9cd8729509a34a996a148f9c093a12923004193a11ea05489e2c394284d9a08a9b030aaaed043132a2098a2448a142a0c18ea018a142954182080ca0a6b454a942743507c6802050a0868a8a8b0544030254a931254813202a1265180f8a12950445082273c7805c742e9610a95294d9e348902c443e9610a15080c4d1901951e7a7818aa29f840a507283e10a9a4b0564a0025a889152b2580b2640a952856ac409900ada2b0248802c45781125485ca0598d0ea8d8532f4c48728529e5c69026504504610010af800250421784201015450582b413d40f9a10737d6cad0142855a0fc30258a574d9812050438d512b6872856a644a9321404942625900204104f9a5481e283942823f809ea818a949f9caacc8aa0c993a1273e3c1982b2434da504134491f224ca509429517e546c6c500f54a47ca00994a111f4002508283d2a246c152a0cb0aa23ac15285186a254a1f2c3d0089ef8a88cb053a844197a5265043e3419a222c54a932840fc932a23f81f405e12914c1a4e88f935cd3d15153d9b9a10e8d6706b30101c1d0318b00c58c00296015bb9c7cd5c75d5cddccd32bc57c950ad5b57b9dde7e2baaa7231be0729e82aebb957b58bf155eec15745e7d8519583cef5c2f75cdce7aaaa7a303a18ab7695ec57b9aa6a55bb76b1b57e0d5d4357b976f1390aeac4172be8e4bae7de8b313ae762007e02e064a8a273ef558fbbb95f77573939392e2727a7aa72727272ba48d5b1aaaa2a56b1bfaa7a880f2f4001b2ba9a8170bf4ac87575732740871c70a8aaaaeab6aa21dd5d75d5558500aeaac7950c55cbc0c37c43d5d3aa8a5fc5d5907efd7698b9c2b8723b1577f30cef55fdb85455cc554df55ebbaa7a5d5591abaede7b55abfa55556b55ab5a6b55f55e1fc0bdaa498f00cf86aa717cef55d5ab5cf5aa0254068855acaa573d9e57bdf70a400012e5ba7a03a8dceb8ab9ea19aaaa6a9eae5eab5c55bdc7afaabae2ae6aa866a8aaeab9f6d195ab5ef5ba7a5575d355e59eebea55ef41e71c15ab1823350023ce45f7aa2233b4f79c7b0210800b400002f0deabaa9ddee97e6d4855f5ab48edbdf7ba55ef7155bd57b9c734341a666eaeba5fc55c55ae7a55d58fbbe2565515572ecaf8a2e357b9e798b9bb7aef55ccbc15775575f59839ba2a42a713a3a49ce52a6b06f81e5b33bc58cdf0f801a0c1d71673f77b55535555bdf7baabea75c5cddc91691e57afbb9bb92b171d25a3833ad1b2acf76255f173705dc32a565106e7aae79a9febee2a36333b7e9bd15de66526e2fc989d6bb75cbdc75c5555c5ccf06d2589cc6e9cc78f2bae78e356f15996655995d59a65b565040b092d8625c0d0932a50a64009010008e003141960d80220800007384001aac890b3058062c50a942a4088804a0f4daa40b942a50728559a3cb1e2430f509a1020a874800200d103941e1c1fa05481e243152a50a254190a00941f726a40303482264353a2540102069a1fac4499120504240b0451aa40b9d2e4871e869e7c80ca101025a8d2030d3e44106568ca08aa34e9c14a14110c590284808a142198d70401c58729519a4c89f2e4871e4000022a9901a44409e21142c30d2908a947911e340009c00f1ecc0729517ee8a1c99094113c0101141f76aa3c19b242036645c8dc0250a1526548500f4f3e20450a952a01b07902a5ca901240096a321404942931f81882120221232b4356a2040125c75a024ca11265a8872756a63ca932d464288a08444085d4630b1044141040a902445653e50914293de0603e4c810204104f9a4009c1932a5486ace4d0488172058a9426413c1141084240450a111b4a30044185044331dc5000028c4a072840930240097a22e5034d423025ca0f569efce04d04315c9902a5f512a0c9142a51ac548172a50914285540d0a40a95a1273d509122e54993a120a0e45c9902a5f9d82e41152a2280220278650a9416802b4c2f111111918988d7c99a1e9189c8244dce5411352293c9999c245aa2e728274b6432992a9373b244444b44444444c444a6289d9898a8393199d8c444a6e68488c8d49c6c13392726222632111135274444ed6489d8c91211b51313af131313b113222632b5935d2744a6364527265ed373b226e864d76432999c13139bd8c99ab89d98d8643235270d6874f0eeb208ac3cd9557ebd79d75abaa849ae08ec6575dd782e7a27dd20f276c8ccb918f3d8d0de16932e875e46df87fe6896e8584c3fd12753e9916e8940169d69db6187b4a2a0e8a1b78b89738e11d89fe73eddfcd12da69fa58ed6ce1a67ce44fc7a0713a77dbf3aad3c78f4c95657599050f3dacff76916e7584c3fce1f358173a1e6556655be6cca39e7b22dd0a9f6e83e4d561e3eeafc3ae422e4c77953a12f2e33c2f996f79cf3b7bbc3bec5ad3fdfc2eed85f86b59df52dbb3b2ebb693bebfe5be4779fa899fa392f7375aa07451f7975cffcdb7ab068d93ccefc549e658be9874bfca9b26d3b9453535ab24b41cee78d03a1958707e2373e777178374f884fb6863835841a420da1865043bc929eba39f3427c5a59756fb57feda97eaaffb5c73933ca97caaae5a35d232fab9603719f66511e7e442bcf9149e34270665784fc74cb9bee1ab1b2fa9cc6294ae37c29912f04dd4a90e5371e64f9a38134d029a7a1a8e596d3b84f53d4ca84268ef7c0b92ef7e1108756ecaf1bdf0fe243e88dd3f85e48b8e8778d08c9ea4df69c0608a5f120b4f2f034d1875866b0e8345ee5d3f8648bc66b741a57129df2a724fe732651889fa2e8fe83d7f3a6958f502e2586dddcf8535e9df454fbc82bc98ae542d36b10ff7c17072abb22e481787d6ef97cd6cb84a657aa726b3ae5963f4aeb73ca7ddaaba84c0848f6c5881ffea3fa51d9f4f0e15bb6779e63bee565edfb34eec3a75b3b729fb6a1b2edb4fba0376da7bd07dd52d38e6558db69a7a195871ff98cd676c9f279c58b06399fcfa7452d2f60d3f9cc57ca2de70bc8ca18b32c6f599d19957da9bc5d95cf477194b87f2edffd181d88f92abf8d11c38d6fadd1ca7f2504d5f453e20fb57f6e7a217e2fc35942f9732a7b3b5ce197198e12f9d0a5c4bfd23e66d0f9cbac26312482f1f52062ae4eedd316ccb95b1c96ab582f8f416f2fd0ab68d06b67d16083f1cebb4872e92eedc4bb24fc5ab0ca5ed84bb77be9f67af341bcdd1b6c125e40d05bb3a1fd732fca25a5a28c93ad01601750e5998cd3239dde28f429ac49f7a90ba8b9941425259509c547f96c926aee7b51b37974d85c3e8f147d9fe6d3728ddee636b2f1cae7646bb11be70be88be50dc3c1f1b73d97d778bd7a30af3f4ad16b0e8eeb3ce983a4938a14699273c717e5a2b6e33cd25d52748c6edb1942c4dde2900383b7acf2f0550acff7e8e142cf6b104232a13df35f687c362a44480cfe326f92f31e990e67c19c03f1bd4842fcd2a76c59dbe9e13d322126a8f11e3c6442cfa5f790cd85c8cf7677aa10efe13ecd453f7e3891acca1f3e24abd86e69975483fc0f8f590df2958bfac2f176015138de865efa7689f21ac45b9810df0b4848b64dea0b02fc114b05e26556a3f770be807a587660fe356652783e48e8796d7ea5fd17ccf7a557f692a5c6b1987e6a1ca326a8117a5e8778737701f14004ff5c7ef95e12d89f9a1a9ac554f493050bd199329a90052fd881c7999f1adf62faa9c9b68cfcca76776af31e4232a118b22f983f1f42f761a05f6a3c877ee1e23f352e69e5e17bf8881271d1c94b172e5a8610e227cb9ef9a1c9b808f9c1322330bf30cc2fd976dc162cc352c540065d3ce182327ee0e5672fdf82398d6f196558db715ee35b68b29bb6e37ce4eca5f5d4644eda8ef3d110aff2cab6ed0871f68265f5e62b7bb970701cd6dc49f321599542b28a7d5d375acb1ad302e6c6b30061b9cceacdd775435220cb0e8c729e26b99821a1fc8626b9fd46ad2e6094df00b58c31cadd3581fdb1a8ec0b17ffb1b276935529568c71d24af4715613e424becabde21a696c9982ad7629e123b806e994c388e134e7249ec7789f9e14652e5c03f4b8dba4d956a4cde7115c03f4d920749f163d892633a1f836947fb60df4489b4b0a7dce6849ead3e0a524fef44c524ea249d2295a4d4fbd4c287e739f96cd278d968c92b78d6caafd204068f577fe8356795fd9cb3bb7a143fc40d0ab7fbeadc7881adf82d560966c3d468c7ccb35ba2eaf3182c6b78c684623af71e737adc7081fbe85c6478dd3605e931971f3b305cb8c903f5b88968d2af0d8b2c61b46c803cccf163094d738e6354ee32e7ad579e73de88ed1011bbfad677f2ae99daf103fd58677be98741da44b31d84bafabc6bbdda9372fb3c6b46067d011a6866edb918e51d976a4d3dcf0d2473c2ffda2db762ae9a55bd4db8e748a6eabc19a349d7249b7d5584d9a99742a9b8b513e17ab9a346bb64933734da2bccab64914e57b49f7e9244e8cd1251ce994ef69064b385f4054c698fcedd29ef802921963eef792591227c668d2be4f47c6f87d1ad2d7a75f194c1634c947448c2a622aa09e80060daa882edf7bef25e1df8bb249ec1009f4e83ecd316324888a1087194428f306128e50f140081718cff960f2700ed69627b51ef7b3be3af4e32e98fcc874bf10f1fc8061ff02bdd1a1f6405fb8f80fcc88787ec0bc0c6789fbe6ceb9c6679cc1c5ef29cc125f80df53182a9ec9f01a7331e97b010d3520e83edd5efead3b5f773dc048ce51e96da83de5d239e554a9bd6532c31c85d48609ec514ea34b2e7b589ea2b2da1c5e48606683b51e3eb59de7aff2a962fff8d4a4e7ed02cc79e5d33f314d7aee5c5226e3d39cf54ce69ff3a94bd09fb398eec18a8a8ab4fc3c775d720e7dd7dfa71db59a84b51ef7f35a269bf4dca797c0aafcb764befa3faf6be69f3b793e74c9f9f31f3807fee741607b0a33c53b6f5efddb8b736372b57ada6b91dfaac3ef8af95d27d9d03df2671dd2b91dc0768c13d8f89adf316e98f9bdba34fa6a732a2a2a22e2a7e6f4ec4fd579e8db7a7eca48d186171880b9c20b7ea8872719dce0e1182d54f130ab5278fe653223c2f6d9b7f5c81f666f4d5defb0a300bbf93dc980055ffd9e64c0e589d8c4ad6710c57abf63b4408328d8a4915eb1df6af3ebf5e6d72baf3a95546df8dd759e1bbad4dcf4904aafa8e923b5d25e3a0dd532f70298f3e8faa34f67d1502d344e042f019af38fa3a1448079ce3ff3597b452bd27d1aba3f7b45f7e92a086789e5d32d9fdeef685b236b8935b2a253d0712edfafdc519c2b3b4279e555f665beff42428d6f56d074cba7b326854e5d5ef95e4aae6cd748bdbc799509f119be98f45f59509dee9c7faf25fc5556fb839c5b313dbc96f05b59e53e8d29cb0e4c7a8dde96f43bff2a331ce7d09dc70cc7398ecb963c87999297ed1a69ee325e238d884db3610ce612607d27124b345e9dec9f6f37adbcaf0798ca684db99a5e394bca832c9fd3fbba2ef7e9b6da55ab2a13a2a9a9f1ae46d528be6dfc9c15bdf2e713a33818e615e6238a83ad1d3fa2fdedab5135a2c1e347ed694634eed365686823a9c95c939a53d9a4e6230a3da8f2e9d5a79bbe1712f639a7fbf47457129fea555555f9e4afd61a692e79b9d98dbafd80b92221fef2e693a2d53de5eda2f1d69ef28bc64723ca87e08f7cb245d1da4ff945ab8c7c083e8defb5a409cde8a214ddeb0194536a5dd2ca31c39a94fdcb6e9ad4eed3341cb760a2a9cdd9b74bce1d84c2bb4c52cea96c8accaa7429262dcc3ccc249677ce2ebd51170415bcccbe4ce895e82ba4724a02b49c1e7a75590de2db940d4297875e4df04e6653f60d1eaad8410d4808e3b888f99cdf13172a7eb60569143ff14b1110266891850a45cef94b110c4ad460092f5500e0058b348a8680d837fe4b510d4808537425015a4e4198e0a17f1962dff88959d1bef1b3199675a22952c8a00d21ee282afa79599196a2226f5905e29bf5e8baa3cdfbdacb02354e6002157964397366af2436dfdad4446c622236f58365cceef2cd9b22c182a0d3f015669c4493f62727016571a8c2f35fd64d2b0567dfcd5ca68508233fceb9f8f849a24b36df7c88e505ac4a794ea249cd79a2c083163784554ee29bd78dc237c7b28eb51dd3cf72218a2f62f045166e1415fd38e71fa645ce8a14d060881990f1a38508233fec5c7cfc6821a27f9e7351c00fbba35c14f083050c05d8b1f0d0769a33996fee1c0b180a3c7719169fb6d3fc6558c050c0396758bced347719cfb69d2abfeee9c45e97cc76a1881e7cc142126ee00422587860fb6372811a64482185196c6c21c7cffeac571e0a7851d10f7b125da281bb10b5899b93a239479f3b8ef23d6f2e9fc7f7a0a30cd45d34e979bb9ef3ef890833fea6496f368b9dc3c7efba9fd0dc75695d2e0eaf7193de286fd01bf4e6147409a137bf69ad357fd0675b4d86739f6e87ced0711c8e2b03fa8bd0b5991eea984fb0beb8acf14e263f59bff8adc581bdddead2b21c7bfae76e717813521b9af488c8c1f334e9f95eadca27d25b4fe5cf49ad67faf39c2eb926497f7ec3e2e06b44faf349b1de915e51d93bd265ebb9e91de9cf6fba44f90bf2cf7789af36fcf320507acb82cfb8f4e6bf66e461e6739a24a5e3446fdf8ff3d1f744c417bf2722baf89b26498794a96c9b24237d6b648dacfb34a4fc446d7addb89842fc9d0232482c7fded40a7f7b5f49f6a92ce8d1daff9c69155e23cf87e40bed999fded711cbab6a6623b8f9a19be7ac5f537e8bee80cdbd006639e573be4939d3cacf4ed1a6d5f4cdb452dedcf2bd94506eb94f23893e9de9748a5adeae25d2a573b66b84dda72d5a3ba37cd2dacfeed3aa75ea8a7ca19647d1af475a87d804b9dde0a26f2efaf5d93dfb958bbeb6dfd3a90a262cc46f56b9e872bef48afb754797d0ece2509dcb84687eeb9ef9dadc5aea42d8b78c8bc098db3dd279a3fc5afe9df1108a25de3ffadc1f6c4f4fccf1fecee79bee524281297ef015491e4330f83a54140237be0e752912fa3af40432f1eb08563006086eb871a43223c50bed9933792cb9214b169e7d3e8b2fa08a3516bfa71590f9f6f27b5241164ffa3da5c08d6f3edb8257c59a17bf27265af07cfa3d2d51840fc0efa90567be395f4c645111b41c6d2fa996256325fe95fe105461246ec9f3ceeae90553bcf3f6771d7190e22c39e39d3f1af4bc5a31bdcbaefc80f351a13d73e60c13ffe831ab267ae547154788bc739f6eface784887fa9df3b584c8bb25cedb210d72de3ee191e7d1f752f23c6643f3b749754f504cf143fd30abceaff0c346fd21f57743134888ff0212eab61acd9e2f20215754f4ed716ce1e7b31add397e3e0b5e47b6ccb3cf7d1042e81ac2c6104ad288bdbf519e2762d36b0806a3e1ddcf5985e785b85b5ceee62274cbceb9d1fa9c6d3d8f1427fa3e8e92ea5b2644f35786fa91f03c0f294e74fe7e86d47dfb46970bd3598dae1d0f69ffa49ad73d0a8ed6178f67da1e0af199873ee3368e6eb4eed3fc8d6e995fcaeed336734d621ae91af9016b217e9bb45cf332ac4934bccb6e9ac491db14669b8d46c1d8abfb7d59d2f8ee6e7fee8a82b1efbb95b91f6009607b52e28a17c0cfbd00f6bc259146121e30904416adb546ea12ce53220a6961c0491277b81fe75a0a9c701d0c74a9929c74a9623f38779bc63b77fe802eb977ced3a53d2961e69ddbd03defc74917d378e3dd5ee1dde379e745ba549bb73b1c25aec87dc3fa99b3e7adca90f5cf776915f621f84df975ba24c467de625a657d08fe73be9634f9f64785887067bb45f83ac2de7c3e68f175849b375a9b439f90d613fc732c2840015124eaac9abebdadcc6a7b50cc6af3f5fa7c7ddda7dba5a4356f5945c1cb2a7f37bbcfa68d9bf712f6b6841dbaf31c481fddc76c4e4914f18fbec76cbaf4dcf97c94f1c8238fdfebcc16597f94cffc5e455b64dda71fed22219e1f535acc8582351f304b3a21737bc09c73e75c3677be3a6e00edeb349d05d1b6ce3e9dc5d7916bc97ab3ef0730e8fbedec93af23b47d42baff98406f8f34087afb7c96bb1eb0147abb76581cf82f25701d66952bf7e959d15a396baf3a9d270deaebc82ac1a2effa9c7bed40f9667c0905a16508218abe4ae5564c5f552e544960071e67deca92a96289237eba15d3cf6c9b5465759750d985a47a08e17bcf39d75aebee771de18fdede5cabaf2355b6feae23d5ef1aa9fb4b7196445f5f8f3588cd82a42b915fa1733ba45b63fd9e88b8e2dd1a79545213c5ef093fe6d680b1d79b9c2eb56fdf76d73abd4db0f66a6100981b734e97969c4e425772addb99339d430755e197ef8ad379b49a445155ca0def9ca2e488afb6da74d5a3b64bd5f973189b7400cc831e0f015beff648a5fceae83a1847358877ceeb7ecbf867bd86a96cc188d31529b0c214c61633c8a20d3ae490e38a196aa85b220c127444a1c7efc90675b49e1c8c400713c26cd1861800b0c0b40216e8b8230c2858e0051d47e68580d6a150938a8777de2867f5d16a02daecb94f63762ba62f43c9906a8ac13b874d7897ed1ad9acb6ac018ebb47d5f43e4d60ed754f41607b12a3e5d9d7fbed1671ded61badcf57096c526dbe4c5e56b1e03477dfdca7dd2e69b3a055e29e7dc9b41c48d85420830d3efacd151f2194523a94504624624c426267fcbc41e38b981bb4a0cd5184151a4481066108a1032c8a64a0c20ae42f1a4fe0c14e2af2eba429308082175660a30ba72464ee073ed79a6367bc29065f10620a2cb294a1441a3ff49b93c47c3b638e2775a9928a74a93d9ff1c6b3db744feb3cfb0ed6de57e30b887b80c9df7e1d481e6e65cc6d3d4be238820865ae10842694e017a85620002deef0a28c2394380d81c817bc9cbe7002f27bfac20dbeb0c48bf2864da3e47adccf5a5b84cc29ccf810a28262050ffd06ca17a3b34b965c62f46d3d45b8e8e2022d3c11c70ea6f0135d7629868f8e6de1e313787c84cf39c7ccbc739b1be7dea5ea9d93b4c013069ee1c3062724ac2046117ac083a229c060c61a2f3852668920a4a00d25c080053956b8808a1a17541e90a1851a617041420f706e90052b8a689ab05205357070ea220658dc60c80ddc40e3893000f83ddd4007ffe3770c1737683a363333475fac31336795f2e8448ad8a0838e7baad4bc521e7d5294f2a6bc51ac65edbcde540c52599599cc0e80f9ef37ccaa7c59c5bee5fc8ddb1df6ed52f7b89ff675efd3987b622ed6526258d65875fe32e71c66aebd3a5f47a57bd73ec8b96b52abced7fd6ea94af7b5a4c90360fcfbcdb7f5f0cfe65085dfd17ebe96ec8c96a3fcbb380cf5f792057c4be7b89531c40641f8510512d87b5fecf867852f4ba8f9a206cdefe90b1944c82d3abc1c2a3133cb0f30e0a2280a4f58a3e80d21360823cc1598b8b43c41451d79308185327640c68d0dae30c306752801450c1153a49186154728234817141a5fcad880090ccae12c85227edeeb7fd15d86458ebe8cb59e7d6f0c21fc6be2e73d28a133bff7c6f8e29f133fef6199633635bfa731a8f88ab90a4c5e4c81074098c269093ed001902e4898628822e400074518228c1f988b7b03223bac80c20c164f588111365594a9e20acf0c22b0208a234811071a2cf0510512aaf062f3104208c374a18587eb7efc9eaa0883b91f5c5d4458c51546fc4408cd88438d2184fca25105186ffd9eaaf0f215f3e6848e8e57f1b173604ad83b9736cfab6c1fe9c5ccd934895d12e19c738ea1114611ef62760333eca6edb0b357b7deddbc3b7da9e25d515151d1961fe7365995a2f3ceb1267117d83efb6698cd905f33b420c4c3df9318707cc55c7a994d7c81c1dfd03c1a346f6bd24699dc0ecaca1a613d6c2ca648f685f80c0d33c796bf69d2ee3237d9680dccb81a408199bb01e9e29c7b300815d28a3146490121635a555555d3aa8a30b2aeebba4634f0f744c5126a2c0cc3b09a1e3d7e4f2715d8583e7cf8f061f3830a2804b18000010224c88d1a510cb18408112264084ecdef890a2dc060e55c407bfa9b266dce25e43ee70212e2334fad91f69c0b0985e19a3158dce41a691f2284ed898aa2af96e5a8c561e5e240fd9ebe0cf1374d2262b1f57bfa82c4dfcc8a92113ed79ad71aed1a59ffc14415c3ef690c2edfbf6664e10899c46e018a1618010b5cdcb8238e1e769c4e592a2d5070606646efbdf74e6524e15f966a8c1345545023c82f1a4fb4f13e7e4f658c914500c5f1a50b2735bc7cc1849a0e7cc1c416c06002971560016b3ddb8614ec90c20b332df8c2135863606e97d88b8a8a86f8711263bfe952f5bc17ab800b840be012c71086a0820eb470c10f1c3db4821c34bfa71317ef7ecd88230a17d0ac81cd00a7484c1b271d68710116ae1acc600b21ef8867a24205605e40471c7810918535c5991a3861ad200354c0838e3a8ec882125a30a790630c0bc81ce0f734c50e1ec8ef698a2a5e133a49f74d93dc8d6b6657e3439330c8dced9c73103ee79c7bef393a628c51c6183dfa5235146812f662e49632c618294ac618a3f4d9ddb223149c73cbee9c7b8faeacf1695273e6e5f77699d939e79c73bbecd8c2981fbb329a796284fc0086903946d8fde01cce39e71c747f8739e7e07bef3de79c7b0fc2e79c73ef3dc765ee00305f870e77d7d570a049d2a14787fc24c65a6b913ee677bcbedfcbcd0cb1b60379799979a5dcb8cbcd6dd9490a39b2c378924e51b2190671e50c47496cca9fe7344932659612724b29655551524a495194cc82785ac72ad4e079499850438d7508630da9f9e6bbb92164ee6eff77d3761e764512ceb5bb0b88bb9b6384ccaebdeb48b7ec12b743c8ddceb0095338f101b8c250992ff27ba24116ffae6eadb51a20ba7999b98edde5aeae9bb9460a3373736bddecb5bf9d39dbdde5e666a6d9b6d6cdcbccfb84f77a16c275350d70ee3dd79c730d1e816198a458b76ed9beafe6872651dedcf7796bad51925a4dea76d72ddb39ee4c3ad75a6bedda75b773ed5cb7d8dd4e8528c46fc5f410baf4086b7880eebc41081d4a192384efbd07238c10528aa2282a46d8ae23f07d61ee7677cf7abb806493641226d8b99386ceb596020cc39c73d0db9f6f3be71d2f200799b12717c39c6bdd5aeb31babb39e7fdded6e8d024ac49cd6a526baebde75c6bae35d7dddd5c73ed3d08db73ae756bad5f151c4d1226d450e3b918656c527b1e1dfa94cfe3832f93ce3977ee3908df73ee39f75a6bcd3df79ca3d5613166dbe07bae39e7da13a0bbea2094cff7d560a062eba4d505d86ebac40e1deb12bc8060bc92ec634d7a1ea9d5a4f7dcbdd7e28b11c2faf361ef1e7cf03d5add3f08b36d11c2f71c36a18e24f60b77dc8c7105cdea446abaa4fc43ac2e60384b9c4b9799f32a331c25cfa33f8f33a3bc9d68e0e5757e4f33b8e3e353591226d490d54929a3afabc9691256c57d956ffae8f0924d8a6e22edbf6b873ad44f51499858a34bcf179378e64c1226d6e897cefe499828d36b748f6c3bd0f7933041268adfd30cb460bf63a4b8e2c3d891c4ef4906737cbd79e837bf63a418e3a3f705d41750f42e5379e555765559357d1cea979e840937224dc2041b4ddaef0b280913649ab49f840935ba64fa7dbe9230a146d72461228d26ed57f99f840932179318b3244ca8d1a47d588489647fbd6d2b0263df1c2617c15bb0f58ddf7e45f6e643ac2e608df23b20f6be9ab3c376e6299c0ead03e7d042dc704380baf3eb95fe2e55cde66e5a0fa9ed3c97d02bf6442a917f4e6a3d3cb49de75242d237e97b3e6b390747316a51d924e715a5e875a4ffc7ee387f36103172030018deb9b322e5e7a1f500d1769e4b49860ce507827d39ab3fbeddccfbd7a0973edf728f38b35923d892da1bb596d43ea95c527b45ddee111bcc3a228fb877991096972eb33bfe791c02a249cfcd7017a884c6cd3d7cce0df550ff1176216676bc83c754f6445e1cfa975df6c5f209e13abc8036838b83252de74b3a5b40d45e55564d5ff1ab54d2550263e75d52031aeace1c13f73dfdb984ecef4ab2cfd950ff74bfd7cc709654ceced995fef6caab267a766ecd61797677ed5045b61aa0bb4b49fbf62bfdd2eb7be84deb099e1d5e3bb42ae32541879712f7edf05ad25efae46edc4695b72a136a2f2b352b4bd2a5ae779cef0533470411b7832f9847a25b36c09e3b4712f47c88df79cc82da87f8f94dcda5b93a57b01d6385997fee7fd3cdcedb598bb1bb0ba8f97bef416bb1e7f002626fed39c8dc68733595a79da76d939ccbdcbb90f83fe91cd30ba8edb527c78508a157716ee535d8288351419557de3ee1b584ffcd08fd29a91c5610ba75a4ffd1fe8eaf4b8dc5701aacc6efba2969d073e990d617953cd72e252fbe18331ce947fa5fcae8d261352b6b4e5ab1cb1a5d47f8f431abd647276556db291a44732d99987529812e7dafad5c7a76a47f9b34fb7d5ac5d6bad1e1d12109059c480982b570178e82ab602e68fa0705a48a10b3b64b41d09f5555e95da107b996348f71de44792991ecf2b94b099cad1d6f7b23a6f83a626e97bea0e55ba89db9e3d9fb52d2454ed22badc4451f925f65087bf6dd1a38abcea11252758ec53d252878d712f7adb9e9db85c4f4ce65979af3b54347aba5d52e25ae35b791f4bd8eb49799c36cbbe4983c6f3bbccc55fe964953e4a6a3bdca1d00d62ce66fd72debc63f9fb55d72ce1710678cb5bb2bc97e73dff09db116ace9c03d84b93b60cd9f4b37def9ee2f067d2ef67cf205041dbe26356ecd8d768dc02ae4e15b7e0e1ff2f5acb53ec7f78b0c3e047a8e4f7701e5f43581fd91c1275b39947faf1cbaef2e1c9f3e3d7128ffa48bc390f6d05d192ddffc01f1bd806edca26d494284c4dd11b2350871222fc4a9202fc425cd0bf1e8d3e974e9397452978238f4225d0ae2fe51ab0bcfe7ab82b8bc92ec07f1bd808204b974dc07ad33b80fff41eb0f27e213ce68411aa76892f37204561f99a2978447e6adf1d8d011e241bcca6f770c696632af4ecb3b6f2edc5f3a06dd44aba091e823de3d21908867de0432df1cc7e76888c70be879bc8074e0c548603ebc797b0c4ec461f0494383cb0b68069717100d3eab19301a66a061a706dbe921390d3300a0c74e8feed1463bec83f2e17b1df1e17304039118ba2ce144145e2666e1d07d8a9a16911968e5cf7c2e56c4f7021280ef0554c4e7f2721bd110846e938450d7c39281d65c8fcc5be388e8c54c8482735040578bc3be731c1adc799ca24b333800bcca225ee31502f08a05c06be4e29d373ada1c553c4f13980ade5557c4bbdace942cafcd8e77beb5d5f1cea70f0be769709f9eeda37db4110d8ed317927e1d1c217ee857dcbff7bcbdcaaef0c3acfaf0ccf93a92f98eef85241b3204074221412014820361902119ce92cc777c276b5c7469c79d37305a0fc969bc8bbaa4e3ce5b4b73e924bad45dba34c49df712456873a349ce0540db1b4d721e00dae06892f339ad9a0bc90cfe9c089dc171e8fe7c948697d1e07c21c111e2dff12b2e73181c47887f885f71382e44f33838de0e2f26443ccbaef0ef64f5790cfe2e26cd71b22bfc43b2fadc87fbb4474386b36406c7719c2cc8874f9f210b8ac187f889b84f3fba3db8b7f57823e8d077684ba349ce49b4a9d13bce69a06d8d26399f8136369ae41c00b4956952148f7946bb8a21b4a7a0ed250a21b475682f41bb0bed2460a0cd85b61623b0202ec46b33f3ce6bdc69e91e2d60e073e7cd8c2bea52e6ae87b7391a1ded8e2eb93b9fce1a6211a1beae051d19dd2742f95f5ca23a18afbda83b8fd6904b495b44a87b48bfc8e04f86d3d747e61df630ab5cad7f3ea3135d22e20e893f0c1e8357f744fc22925518322b86eb92ee8a10cd43c7a9d1cbbbe8e50a30c4902903479ca3280927a6c8628c34e41a5dea773e65a05ac03c27c27fc0408f4e509f94c5d70e411c66357bead9982db87cb3b06b495ca249ce61566d9ae4fc65d1892639cfe83e76614d72ce5cb01abb1071770141cf683f0eddada15217e27d31217aead18997d57eead8b52488d3ac5ee1cf99f26282bd0b71be9804f11c9f4ef91f6d67ce7c0eed213ec721adf21cfaa4b1883491181cd22a3038f409831371488408112230401fd07a741f3618204e1022b495c01959d6e599102be9af28781c9f4330eb512704067b212142c43de71ca1f99709d1fcf31868fb9b0b09f6426ce688bf10bbb13100a12c48376788b3629839fb0c03e517625930cc68c540f961a0fc39941f1ea9441c1209f1d067eddaf278e85df96370774ee45a12c473b2fac37a48bae81f123ef344b25d233164f5390c9e93c5703109e295ff3519ff2abf107f179205fccb8416f0cf73283fce3e6e37b2d20f24c4a3135de277de2ea0203e84f2c72e5d12e2cee3125d0ae2cea3133e4d0805e23734086d2e4d726e432bbf8dcfca62430899775e6b1e56eaa1efe28064dfc6a1f3f6f834c9f37b01e98b49f3e7d6b5e4b2f8daa1fdf8e10cd892e5ce7d38871bb806e7ce7f16071cd68873e7f506dbb6137db7e7729ff663df07ddef41ab4ba28ac368ed2bde390dad373fa2b5a778e717ad129d5b749754170acf3ee9107ff38a0ac5e63753c0c1f90d9cc3720dcf9defe270e6d9a9acde78e1d9e5cd6f169e3d66015574c9f2f649593de810c7a810ff41f9292a029d0f1ae2d0a7256fe4e4f90173492aaf2bab3cf0fcf4b9d8c8f702da0b683457470acf5f59a3ac4b043a7f6541d3737c424af9a439396ed3a51aefe110ba2f0e411cca1ee7ef87c38cc9b49df6d95ebe6b6aa40c42bf70f12a1fce6bbae5d3a2589320f48bfea035d4a649d07bd01b9ad33b13cbb6493a0f336ac8109f7488ef35736895a2332beb07b3d1a4768cf21a4d6aef41990c0c2a93f9f6bea24b550acf4f1fe2658a2e0919e2ed9d45979692538e7e64d81a69afa1364d6a1742bf38b7e845abcdbb6cdb4edffc80a9f1bd806a1cf32bab377fd18a8dbcba39a74bda2fc06a7b692fadc7797b57d125e8ed17ccaed1e57c0159cf27b5c168957233a90bc826636c4ef73ce49e5d686da8fb2a53e3db6bd2b8997ed12a7fd2ea6f01f18bee8fa810968fd524d480d01b68d5a14636c96a924d478135afd6b7e6738df7df317770793cc43ccfef183c9678eb47d798335e9ef43b260f3ae65b3e7d58cda1cfcaa22ca7b06d3d34cef25a52fd152f243d3cfabefdd7a54bcfa7cf0b68ceec07b5e69555f797573ea2157b78391cc1cbe1c87dda68a8ab8bd6f623df4b497b1b77d3abd1121f04da643695cf20e83540fcf2bd98d86440b2da3f8364b5aabc5e5eafea1a8dacbd90b4af331bf9452bf6262c4441fc6555145ceed32e5a398aa01a27fa496bfbcbaf4b49334d5addcbcba7f4a1fe2b136a5ff9a14f5f1793da5fe3974bf75af99c59e52e2f9d1a6533ab5436d40fb3a1fe4bfa805ee3d3abf4ca5d6c5a8f8f25d06b247f8d0fbf6a668653b9e5f2f2995525974f2697e523672e9cc3f451368178e52e6f790f5af97bf8bc908c7c6641d36bbc1a59f2029249eb92523a7521b92c97d76549ecf41356104208ab1a994d672e3f68e53d30f741697acc0c03b3c6f26a4dab66e496f4e9735a7c04e700b7cc1c6299c1a6d799d52df3d087da8fb2a0cb299fd6e5b0f5b81d46d36566d13ad4fef299e148af1ccea17ecbeb96f92ab3ba800db5b7bc0eb51f392cf375a86986dabb90581e34ca2a771713eb2d2bab564c3fbdcaf808ca471710753df892ee5fb496e02f3fc15f7efde55e2a994fb9b52e7d3a07bad47c4ee7233807fee9d6053433c6b84b97cbe528c3b180731a9780739a6cdbcec84d3f6995d5bde517adfc978f689d7e21995e5dd4f4165d367ed2fd2ae323b88698bd46c4a68a884d1d972cd1dc3b982722c4d0c1df34a9df1a691784edc90c2d1f7f4f629af8268688931829b691b0f17951e9395d92365d8acd7196486f4ee3ad563e7cd7480f97b407f541abf49ae6557a6ceee3593993b2e405045d52cb6dba147d18a99249731f595f4c9ecf9165f33c4aef41790f8a03fdf27dcc7d9ac66b688dde8e519c25cf69fc394d86031d67c9e5945f4e3935f211bda845832695c9afcf6366135b5bc2dc0f60cedb1d4d4e977096489f2e7d3a732fcd884bddbe39e7cdb1109f990fbae9d055115ac0377c58054ee7f0b9222fabedef01fe7cd2584d9b3faaa4bd65ed0bad499df385a4dd496fcee75e4aa45f3e6da8a49537dd7fe39de32cc92a7420ee807e78b7d34c26ce6b7b182defbc993107d00f9714f3a6359ed325cc39ba4f6f195f4c283975bab43e9dd3a5cad99f8ffc519c1f6ee32edda781b8a4384b2807e29403c9707e64474cefc37196d8f8c86d7ce423df8b872cfcc36597003da0db501f3de8b69d1a1ad49c728c56e82da3a14123eca2d127bda149dc59a532e81e29cf75c465f03ad2eebcaf253c3658e16fd9ae91f6ceaab56ba48e9edde488d88435c9466bdc1e0d6a25e73c41cea12b591cf83ae21c1ae106f834695aadc7a6777a3a6e27b03d62fa1b6cd0a1cac6dd46cd67cbb056b246d89bbb0a73fba67d60428a8408ccb09b1c7fe3db75dab1c6e1db2dbee18a1ce6e9a2a984d70837c110c2930c1e429d2edc0ae6c41c8c7b83054e194bfccbb610758210e48b1f3300529d76904445461d300b84d5890c2c08f93d91b1c60c3357a7ae1bdf8a342909cc75b8a124e69b3fa04bed0636beb563a03d4c0b18ce484dca282555d2b317e1e912bf8c272335a9911a8fdc1ed3184648810b2344a1088a2afc34c7b667efd0620c22145991023260fc34bfd99e057c31033258d4a185195efc34f7ed4940911c45b8020c146020e1a7b91b6bcccada18638c31c618a5fb748c9b05456f47a2c7f7de7befbdf79efbb4a0e7ce8ae99fcf4a4a29a594524a29a595054987d0ad985e42aa72cba7555d973319ed5252f9d59792ebbaae8b56ced0ba68d0c82f9f23fafca2cee525bdaf7801451fd1e8176dd3b22cbe9854ce5550e5ecb3a2cf993a26557497557eee9c9dafe74c8364f57c2f6931adbc5dcf2b1a24fb7a337a45a373b68ede5c3c6930b74b55b2d7e6ae35efd6dc65dd5aaf2bb9c6adbd323766666f6627ba478b7422fc476660da69507bf3219617b0f655d2de9ad748b7735f3bb42a90b706d7be5de987192fc9bd7727709712186326d45ce688d804bb6921461c5d6aeb00ccc5b7462c14847047163188d8d2460d10d00417d0186286315ce8720522e4182e64f1d7ef983884780d0c1eea391eb38522b9d239e7e0182d8c6931464a9a8ae470811c65ac78c30a63fcc41b3e8e894308f89ce7c900ca20038f186540d1bc49241d7f1d17c30a9bd84b7a7650e7a9c01d60092bc49c80a0e50c377e5ccf3b27461bef5e146389f79c7361e0f1ae891fe7dc73aed3e3d78c2d4908038eafce039bd8ede961c28e72913fce21a54017fd385f5a897e7194b09787af659508fb7115c24c88a69abe2d1771d13bba6da7ed742b420a8ad24843093313c0d60c24bc7c95d585c1c6b7b724d376b7756badb5d69edbd75a6bad35af1b71934209374845cc38628caf374770419a34d3716b1ec2aedb7539bc6e1dbf11e4d7ae7595d06bf36daf39b7d7563669336e9277ddaeeb75e85e670dbba85d383c44df9f55a685881b7ea273913fd3dbb1d643c599551e29455120be65cd0df0ef5ab253f8967dc1798e654f3f25885e02ca5dc9b5760bfcc4cec155e1f7e78ed3321e287f9904f687cab6edc8b6b3eed3cf596b649d8d8d8f76c367b07af38d8413df9ed33dfc5349df4528d0453f94cf46d71f55d27cb3ca1f332ef287f276b80c597ea1b278d37682f8e620843268a8bf6557da3bf7f1f15a42c3bbec4b09a2bb926bddce9cd975bb6ecf9cf989bb6ed77d89be970516f0135d73aebd6809b9a9f9a57e7b7877d63973e7cc7960eccf35e71aeb7c73cef130119b9e1bb2860a649939f7dacc91706b9b918090f05f40bb48f8a183b0354348f112e6835152724f74701670b417365a17e9714f74701670b41736fac108e9e02ce0682ffde0db131d9c051cfddc890ecea2db9ee8e8ba27c68365954c8d5c6bdad25823eb26c9d41673756a73e37bb7bb4a777c4716d4d80e3becb0c30e3becb0036b1ea51c3977d6b3a0152d2f707416749c980bd781359f4bc99173d9769abf806d75fbd32e5b0fff7463e3bbb9a104d2e7908ae8403d57c9207c6c1f239549e7dcf2e98a47c2bea132795324c618230f892464a60e28a058a24b185e28f1fce09b17813ce001e4017c38064f15214b33675cff9caa320cd21b1b1b4849c8020344810b4f98420842182105073899d1e29f5b2ccc51c9c5a48b2a18c3c51472e0600a58e0e1031bcc6c97076395f188282b78638e2958d1022e4430401c5280557481318b038c17fd06f33356e09ca4f3b035fefdf386f9d3691223f11e035a50441a36c841145438c2cf2bc03f2c0ce19fcb4863cc3c6144e6efc591847fef3d1821b4f12190d9e2f0b9eb54bfa72cdce0afafce23695ec0634159615fb4c0fae8d2a67d946e492933796a3bfbcf27adfc2aaa93820e281103218081630b551c410039c20823471992227d4184128ddd6036376178c15a8fdf784147493a7b9398e43a19894cdbd997d2bd8003db5825185cc0e8a2c4b2c1042fb42c21451c6a74c183853261bca001c975aabfeb90745e16323e92dc49d88debb0a009ce535171c9e86105254609267efc8a49628e31742c3184174d30e2e4050fbc9a3a3cfb74d1822abacf257a679ff2ed1e1f2fa2e89d7decaf242a2fa6f878f2428b8ff0b9eef922b8d176f69d3363056bfcfb35830866a80647174a10d1451144c8df9317648cc1821b59bac8a2a58ba22c3c38e28c8fbf3c408209180770861053982fcb7bef95f907239459ce1822050fcf282ae247bf6748a10820ccd56987d336cd3dd19b17b9a101bdb35e73b0de59af3c3d94571dfe66d3f8ee9d76abd3889ac9351be1d7b90ac6473d41e5748715753cb1852accd4f0852b8ce19e7bcf6a81498a1544b1042f4d14618528065047145cd8808b16b42fa81723175b3ec6181d45c598832f7c8c3152ce27456f9a44c518d70a1f471f3dc6ac4ac9d865968f113eeb370c12a77fbf6192a0e22be6110923468c90400c257891042ba0a1c517466094010f177408a10d23ecf0224711337c40bd970330fe5539c08114ee26a7080d57941c8ea2729c73ce6ffc260b5a6e6eb8b51bf80be128c12578700414a81a5c2970c0181ba881c6174708030a02c8c1113968024638dae28e2db0f01e13a82d4c08f3b0e36194110a11e60c11639c100763bf61f250e371692ea094a0469722ca78c1105f028046992b6cc186cdef690b313f7fc3c4e00534bf691c5184b9cde209efbdf8a2cb82095908e1352fa4169d209cd1061264aca08c1a3b598c89e22901811808c1841258d0c08a364863ae10832cbc4008d338c2cc43eb374c1751c862074664910324e07b2f0b30ffde7bf065e16508436051842c61f228f3eef7944514481688b348028d2226701c8da6877799b010dfb2ca45d7121a7aa5ed36ae617d361b400c0fb81082cb290b22b4c8f07bc2020a581c016b8ea5744e390c75d45405dbd3154e745b1c1cab2089bf21633633bfef5dd5d8340907fa9eb878e39be3c0ec483f74fe2dd2a50d83011fbaa79d360c1e74f06c1a5a5c511e5dbe2e192d56983beef8ba657e9338014693f61f4dc244a3499810d324d7e9120dbf499c38ed92d8a649fb6a9230314793f67d7cc57ec1a0f1eb56977cfcfaea6c16b4668ae6ea14016bbe985bcc39d69acb1aa6050c03317700cc5d701ccb6797cf19ce12f6e7ec2f1baa2e0b0fc81023a68cf4389d73ce39e79c5be79c50fc9705b9dadc8ae988f33625ad324608df73aeb5eecdaa49287e9505412b26e84cab74ca274597d7c0aa4a56d2831c10c5f202a21ccf762991ce590d0a72dea4f3e55cd220e88f2f27adb885aa7c573667d2bcb9926b6de13a2f7cadedb656356f2dcb6952f376ff865943c098d6f5e8d26b8ceb713d2866dba4d70e69e5babe1ea3a375e8fd7a269bb472cbf4dabefeda5de6d8955cdbcea17bbbb3d6edb84d31b95b03b220d0d005e432c96fc5fc80e1b74538f0cf1d8458d6e548d169459ad48874f801e3b0e85c111e770e4ad1e19d6bd993ef7d21bae1070cb3d5da0ddfdc50bb8cbf10e9fc8079debd6fa34e944d8a991c7aff9cfc73b7aede0cbd7f6dba768ef78d768d38ac3df75a66610ca70dcf3e7908d063853042d8dee473f75e9107fdadf7f01a1a7dd6488d3f5a57ccd7e870c328ab3a3ff28a9a5e9d4bcc6553dd347eb9a3d22f9c25f29dcb7719ce92cb9d5fd2e5a5c4f995d5e72ec8b974524ae99c93ef4deab9f79c94cf49f99e93f2bdd168341a8da265494b4a4b4a4b8e7c34b261448b34a9c6493ad362abc6275bd65a394daa7124948f7c52ca929685599665c927e57b4fbef7a47cef4929331b9a349da255879fd67bef3d5293e68befbd77d3a46959cf7aef3debbdf766ce4ff85cfbf92cd73fa1f52c781d71bb469e4f6739e72ce7629396e4d92ce72ce7648c319b5693a65b96f5735a1892fd1bd688b3a26561d67bd67bef49afef59ef49e7de935edfb3de93cebd27bdbe67bd279d9b71d678936a7cbb64f176c95aab06b3a29591b01a6fafe941ab9415f3ce6b726a2a1a1b8a3489721a5a6f78ca67b373eeb5b52ceb3dcb7aefbd6745daae8ddcf52c386325294a567142eb5d6ed4681ae31a6b7459342318d608e5efab73cec167559da79c871091603e7247b1eb9aeebdf75e5f40d650b7656d979e37cbeb7bef59ceede95d96d32487d1aaf36e9b4493f91a71ce44c0f6bdf7de9cefcdf95e8d31c6f99e1bd12a45075e40cf494da2bc49143311b0f5e79c9bdbcd3d1879e528678d508eedb68d313a17bd3ae75c8c317a8c31db97ec9cf318638c31c618638c31c618638c31c618638c31c618637ccfbdf377f368a39ba8c449d9a83341cc39c8109a119a49129000231640303018108b45c38124499a0f14801191a45250204b635112c4280a8320831022c410000c00c0185343449c00ed78fb9a2d8854db1a7d5ab0ab6ef43ef2e84186ec2066fea225ef0081ba52419caa8dd7b794c588fd0ed01338d80c7d8073c8c5b138b6b9521f56cbebb8da8ecb1108e45e91094bd5aaa470500c6d8881010d430e08aa5a78db39a7cee30682885f4d3600af31018f51cd2b5d814687beb70b9ebb5b2c289cb2fbb92e285b4ccab90ea15c5d48104518c094b2c20f19ce1dd0204e9ec193c95a6c40d1bad760f4dd8ed8d3f2dc812ce48f9ef5416662528b6deaac79c6fabdabbbaead5c5d3280604443e9e7c66d18c3cf3639c43a7f29fc8225a76fba766de87eca674222b8f1851e9d88622da398db5e176636e6c6b75655ee3e68e6859359f80e4c51a793ecfce02b85e71ea19217a53abc4c1e93ca8d9f47b43c2d69aa83c7ab409705dc26277528d1e1978819bf9ef612f5bd92637660640aeee08caa88b67595026cc076b86e8d9f71ddeb442b79d426880da338ef3f7a89199b997566f6c9f733e3508222ef6c00fcab618a66ada23d33a744105766deeb8ab0e92eda9491d70d50cf535b7c58ee5650d78db923653381e72d8ab5f1042e7c181b1f65e07e1c44e0d9d5536a0e4739d57ce7eb53a08042f89441571d3b6afb66b189668989a9a53b8ba7952e968728b483dc4289f5c4eefef541c06e7a36327af1729ec9b7a0db95bfe78c44978527b0d387b24a7344cc8f608fd45a26e06b923281a4bf5365758822594b0d14ebbc8a339a12523238ab2351fafac63894bcd9d192c0f3252787b8e6259c8dbe3dd4b8bc1c22f567676ea7dfd733767372d648110875abff3ab6a9362c66389f403559f48cfd9277f61a4890a1daf3c55447da4f8b64d58decea4fb95906e271ffc2a1b42d22beb1ba7879c9a6b6ef2671ec08964a432afc53c1e6fa60f3f5345b49c427ae4f1426029ecb8e82ddba569f17911249eda77988c74e86a28b4dc612151cd583e0dada18aa9d692a2b2f08137aaf23170b4971cf92ce5fb6f3956812efb1882095b5749566d3f1ff953bebd1a446a5b4b1718fe8cdca332396787a384a33f1f62fc59a226d79fe3ca9196d6d0883681aa458b4720e2598b5336726f190c71cd225aa9554c6f28ae8d4082c38ac0552631f4b246e626c740da0a5bb43b31b6734913cf869eccc6ac68664658cb06d5676460284a69c40ca7bf977be3442c3cb514e8b0d883d56b15272e1cc75616793ef8edd69efdc036d4b4b00e30d6b2dc38d242df6ca0e36244955c8dbdbfb26cb0bf25c9f5f220987da291b7a119916b08dddd881d2c1a07ee4db7be3fb4e8ce8607f3fb369e8ed5eb53401c862a090cc5415436586f03d2f3c9394119bce10098f2029f9d4dbaffcb30ba2679cc7d298f9eacf491f80334efede9dcb59aede02ae94ea4464df2421abae4676f502c3725a968f20cb22e1e995df9b5623665e3c814750146126a0f3e6077a0393e187b9a9681dd0333094de60bea8f8e1e042c0181bb34c0c8c5247bee81d50d39152e66258e680ecf56c4d70a7c8d8c8de35cd2ac8a5a4e1546470ec34cb377e49e5b111dbe5f580af8456c92761b2d617e32e61b13596b3c8e46494143461f434cc934bf7507daf9e0af10d3a11c04656cec005bdce7490fea96e125932b5bbc86bfa27264408d7c9a04ec7b91a4c12bac2a7582469e5c61b4b9256c6e363151c8a30c78a3855a1b9754e38de2227cbeb70827d975377b8ae24a824376cd77575cbd4133cacc7cccd7557c1dc0e1f4c805b7714ad9b6de45071f149751475a56f7a86c463736eb62500b6997ac6e8660cc48fd0f3f42a63348d2284676ac17e8e576b3eabc78c1c45361f765eef20c207618230390c39d9dbfa049a3db600873132d552f0fa8834e5f5b1b507afdc891d2d542de4b8981114ab98b08d36d40835565d13c534829a5df8436ab759cf5e717353d51242588e4a55ae6e29e2e2420054b26eb947241e9889f8a8fa1140e84d0688264fb855043fda23adb44fa1d1938dfadc11acdc40018b46c9b5d3727738bd215c1dd8476ee632381d508229771b38875a8dc462b080df022e37bd2f7fb3906e898c166dbd59831f63af791daa02f233bc2d4f4e88e338d099c92becb35ed06630b3e2592e31596fdc1bdeabc436578b850dc9b7e8cb3a2e454e1306d9f2796cc0455799c7d63b121d20fca53d47acae01406da962e6ee12c4c2b0b72450a1b859047835aec6a6f03352505fe79e658d3f938b2e359ffb4d9b35adca8194c6a20e2c34fb7b21db7f91c0c95582cc38228d96c2e45fbeffd4847e52a3f3d321823c4e6345b8aac2c1a6115cc04cab06ebeeca657b162a56f7283e9353af3cc218147d79d8e81751a4bd2a4da2c630f6043b5974a8ca1deeca9430a3c45cf5671d3773f370d80ea99a131c34b01d801a2e4075e850679e1e64565e63a72462e7f4a43c3295bae83dc821eab34c5ceab88d7cc93c268942af3238eff8fce51ff492314fa5835e5dc183de8c35d11f7797e8d4cdef36e47daa69aa3c52a1d5267caf92cddfb7ab59c72295637199f82e607f59fb479cd4160295de168bcbe0f53515314b4f88afcee21c2eaa837f6a7c919bc8e680498361588fa55a017cfa007d02178d853e107a1483a83b176f4310aad34132037619cfe82a932b059149d33999cd2b0338b22f208d99181bc12ae0a903f976b654abcad12e1e4132725da706f9c78e9cc621eefe5f7db155032c6a47f752cd6ad117b3cde346d02e9a102faa6d60915f5f10197026bb27b7f7631d4618f6c05237a3887a30eaad93e9c910301b137aea901a61d5d598a8a64cfc2aa65142ded0f3c27f416b88e3d17841a8002e9bc32af1eca8d48f007fa68bdd441e717179760eacc4ee3a4be3e55728e201b0cb2dbe9538ab0c4b9145303c2bcae7f238d645585cadc3a28d948ed0588d176f347c9d0587bdc5779f741677b027f8f1fb6d64b0a8ad80cbe6b04e343b3a6df10e901e682cae30885233d672fe7c599b08bbf3117784d13f5d2d907e95c039530706a07a0870eccf89a5d28dca951ee4b7c22fdbf4b9db9c736f6c6d2875d022039f473c565ea4c4a54dd5061c87f4b4ab41d3dbcca145c4493d6c6990feb3e092ed7d4703990f84e2654ca95a1a7126ddbf3b6e36b3f7275d359c96b6ef0edadbb220698ae6a872c863811ee2ee040068035ede1b10a340986ac24b27c452b22a25bf4914d6e6f3401357b9f14b79f004900d4c5b146666d5841cb08572f069a2f0a961c7b1067c93d69cd9c98de089063c7d4fadfb261af0d8da6d0e313b210c00a2895ecc94c1e2389d709f8d724ad254355d26e07151d8d1297c6dee0465d2f4b4ce76b48a9c9f481e646ecbbb3f11b78e054123578fdbdb381068ba76c94047c102692b96718217f4872f83d1fbf02044134de7cd9b2a7afa13ace594eecb104f7ce68f91d2da3e6d2b3b7ffffc0fce65d0eef361f6baab90efd7c3a8f5de642e91944a508cba6e681f34a2c984c60b95b4b48a51ca4ced2e91b10300071c79f6635bb2729f983c15af0041ec4d7dca12f2ac37b4be1b9d031ea749bf03b4585c13195daf45e52b5e9b5d7cb476406fe5c7a78271f0b3269ea0fb2bf4603bf6c1f58a3c764b233249fb60a47b3b766a7b8ada6d2aa959a45d9646ad039c235af75fe0e7c0b943e603765b051315af82ca7cb150c6ffc0a70081d217df41f83fd1f215eacd339bc76ca67fc9123b63a0d52fb21308423b25bc799987869fe33d74cf2e11987a345cbffd2d0602bded069741eeb99a88492353c81a9e96d8494653d312cd85f6e8de33ef07104bd4eacac31cdd4b74da3e609dc6f6c351898599c51034e32cedb15660d17027d3b8a28acb53aa968625905ce3b037fe6a43df78291740cf7b7cec106faac57ded46b0d988c6a95bb71397a6219a7a1ce246f650c3096227901b372600fed9c7b9eb2eb120a404c1f2961ebd5baf4f8f3f945c0a51b39d3a6aed8538e0a216b8207e323ad3caacc10344f45082de7e2d73bdf9dd3f513c717e13172d2db49275e2141c3d0859124f39cf255501f6d816f18e05e74f577218b41ad5195af3592e1ddd8779ce5c6fc540532eb8d73c1c6a5459b5c90a4f357b0391443aae221ab70fb0bfd5b330a1e4da18fd8968717d18c0d0dcaf2812a698695c21b250a446ad4619eabb952549baf25006e106434ed0e92bdf9f6f19b8fe7e3cbd8cd8084f6ffd7caa8e783c304b2eb6f70acc562d4c1dec630144fe5a55ebc47c5d1db7635e82a28d9fa45c0a4fe00ece474418861b4ae0df3d345629cf5499ffd28d21be386ae8d94642ac1c6b0d2fc32a840b22d93d53b223d45cf1212e51940b10424ba273b600f2d3bb89a69444af661839f1b385296105b750fc8da288f140f428931b6bd9c24102f5e25c553a728032a9c8416c808ec81e7d89b8bc2febd0bfd65b3c4b4bc6f32d059fa59b611fb3f3f12740a2b614e4fe9bd8f4dde7c12ceb0b90fd9da7965bc0ba701f5c818031e42ad3bd58e1755399293117fa5cccd5f8f2f28c8ea9e09069638f7929837aedc0684c3ea5cc3da48f49563924e501f90471dae30d7c67bb7853c9328d9d578ddf9955ebb9abf1a980c1fb045447b30a63a06fa2affcf1ceea6a7c682f7ad1af03fc8128047485a03ab151fdd1a7086e8b8e0e382934fb6a1e015a57e4f9a2b32033c97eb432574946ce9d3d942052edb73e61aa421969c02e75db2fce1c7ed34ff291aa0144bb79053a9376f98c2a7c269cc0e91cf0995b5f0b87b3270742775596989ba2b6f2ba4910ac66e3a7461bb2607bc402103c6abb0df2d82fe4d8cfe15a8bdd1c71adfd81a4844a80339e66dc217a3cc51b1cb0986984fa20db73afd21b224cf175582e553c694576188fb06eea6f809545a070276f2257f87d697bca6e67b3ec9e1cc294afd10cd9ad65df256282ff12876502bb3f542a896d5b074a9d09e57bdb429b981d7e78e7470c84d056cd2650bb095a431eccd1a9fafdb7696eb6dfe61165841829df2619222332761896de15177a563a70f05a95b6765c72764f647945b022c4ff7d079f326219a29995044950fc87fe9f6c7f94b47da32e247d13b572b2a99578e8b9667520086e0b173467cabc40c41e4fe30553d2bc6b8a4850000f48c23b18109ed0baa6106bd0248bc4cd2e322a6180bfd827a2e667a0e66b0e38a11dc092061646ab75d17fef61108370b05fa376c1923cffc0f60811eb440d256c42e8b6843710c54c1489c6f6ac97b731e795a72857863b0e027ec641512b527c114b1691844953461860326c9c9e28dea8f46b9f363def0a6b6cf0522eec9f27da8416e72d39a71c65d89124eed88caa4a46ca58f9aba05a20c4e2a61db22f469f1731f0537ca3d0c8a157a4904ce466d0185388bbfc43d2dc3cf340a808698f19fbc455c5de54d3c4399e121f0434401cb910e2e2e61baa0681611e81f8c68fc7aceea75976fba87d4a5e29fba4c19ec8d61efed593272cb3907993e920b21b32a305188d4021c7579acf562604428bc6894cb27cffaa3f4ca1325ca24b46bc9a4c74161433445f57816eb6c0b940aa683ddc1eaad4b8382b3cb965f34cf7f3848af8a659cc527e127a0682430711241492a54231d951692a791e8c2731f55f915e612a740424fa6344c802b15cfec869a78a11c4408b94fbf4d06f0caf6154847bdd6194051a26171d5b2076af1301390ca1eac24ebc8ff7543f57d9f1448a20616611f8a9c80515c701fee46c9d8500f54ad67737cfa6cbb09e433338d7a2e3b45e411ab44ba4e2c23aaff3b55d14b8f177be92ba408f9cbf6da68ce2daa6ae36539091159b230b54fe82483e96cb6bb3a757e7d082be05d8d10142cda16c5e61650ca107051e740f1ef407dc25d8d35748ae3deb47b48300d833620ea50faad7890c2004db741677c7ec282cd6be350b4c20e368d0f0b5200cef967927ba9a569ad8d4d53520789cfe45b8340a365c1d0fac705e238d0a3ef41774b1f1c98af5b1bf1ffd9d1f9412f602ee20f04f267c07a60caedc64e0b8af8f4f7f4713df04e377c73076e31d6fc717f9dba593a9056c871150661055a8e26766327fa6d94506c09ee6dfda1b93cac8f6006f9d18a2b925049d7950189a2ec1ee90cd4175e31ed963797a5b55201f0ec49792c2f9e58e36a6d0dcfd1cd7166f0f76fffc5d4551cdb71b2cd7d2c9eb83ab900eb49eb4de34e68c58edebd962753ee653cebedbccb555086c8716580728fb4d5876215de2cd40bbce651e3648e5df5d1ccea8ad868ecb4cbb96fff70e2b0facb7c2fe0d5734ac7cffb3d517d120c9b347877afb5510e7b4bb9ca480feb5481d7895f1354e3d893dd8821d32c87247e4ed06228e2b21d267b7175edb5587b47cc6702f500fc8e81b6f3b1a234f4621ae189007f2fb62871bc22b1f9e4d1ba26e49a1e6c4053d0093cca8ee6a32f8a8b950b2b18044497293ae8a5d1788a90630089f03feeb507782cbb60dfe487092099b611d7d568f40c3b6f49239b90f891a1df5630aac738e34297f32f7e308e84e8601405dc4f6db2d985c74ac62fb68fb76df4f64a05202c3b86ae8422a46b710d23e56be02ad3cdcff6942cbb7c46781141fcc57d404d0b471838bf3e26e0f34fd8294feecf3c12b1c5c68bfa7ddef5ab86a62570b682adde59ca6aaff5537f4b9cfdf6b51d66d7b4d1810e69679d9c9b631be5c34647582e85e0a629202c9fe717966b191a44f6838ee900e4b5708fb1f4e013e9affcbbca193948a7a42d9bafe878d1cc58894db610ec031b2259f31c34caf52f3653c7fd7f11ebd509feb5ef4a9f167346c0009224a9ca496c7cc0d4fbb0e12c59ea5be1984ee5887a08098e4640e81b98d5b9dce3e2d34c9ee77aefb2327d1aaf2a6226d45844f9dc657d168840c022e982bb4264428f7120e3e28130ce793293599450449b8b47b9d2f018b88f611cf09ebf92caeda4147c1c9133ac4fe412a9884621d92990d6db0b5060529fd06d9ff25b0311fae40c96884b07fdece5aa8e9b20a0531b058efafc2407cfd2e838a8a438686b350d2be9f6001667831b013451e5bc11659ba32f8c9be4a61605dada060d7cc8bbf60a27a6561d288813201ee69ed4f70dc5c3cfabca47769bd0423fef3a45c2101a9c072074dde35ac396002d168fe9f0c5c2bb5c238e74f70b07a714956eae2ea413a9c107b265a3aa9d953f024dc83690481dc981ec5707d39d0d81ea38cf8a43485a742acbd59b3bc9e9a41aa100112222dc588cdc197cd11fe487c5b5a441690c63de24827ad04b19862b904ca6c048ebfe97dca61b3719d1852188172d00cd80323656dbc116e75e1dd10bb071de6bfc47db7ac4bc16bfc7e92875402b85a7c7cbe5eb01f9898cb10abee7aa85e10f99d19e1c370418cd6ea034fb5d0863b71286b112b3b4cb319dcc827a4dc70bc0b317a35e46270d7c3291b42101824e164bc498c303605c3045265d0b3f2a5bd5c6d7028fe658cbe323f75bb250f61311534d870bae01174be74924fc17242ef56a4aa98e5acf75fdf2373e38c4a237266b2cf3d93962d44ba81dbb8d218781a8aaaf9cb6c054936375ef175dc9aaafcd6d8099392657ba2374caa41830b7eb344b2e68505c3e6097f0942ad859426e32168a36c0628239fc86c249d89b7e8d561b74f46b8e5d043eaa5ce855c5a45ddc845d062eaf5c065c539358b5ce1b83307e9abc148ab1d34fc0ed09bf4193de1b04492a94abda6f3bd1a29dde59996a0d2333d7aa6aa461def846a4abf37543a11de5b961fbb233f4fbfb213dd4e3efe7879f1c6fcb2aa112f5735dd991e9c0cf117792115efee60cacd91d906e8d9a5ce90d2e5e3a5f22a58a50157e8ff7841de6b511c86f112446ce824dd45a7d05b0086d2515d1f6fe89bd1b6e14b5aef82e58554a47ab148a3319739fb297c123c9760bf615fabdf4ad3cab578c63424f7eb37ac4015e10e735ff69eb4a4007873fb60916f0d17610dfeda7f0698c3fb3282780e3b5da758b453556e256466f9a2609dfef4f8038fbc1b27a24f0dc06fdc2920ac2f68c22a754d8faa789202128444fc5c96489420d4ee37f0899fba18ca53a9b505d3c125152f3c96e4a35c31bc8ffce6d80ff5d8e503b336a4e0f75139e1704f193331e4a03417197af249dbe89ec9b4215f058c77eb18a601d810c5b291ff0bd2e7ea63e7f4ee936887a071297f390d9584fd47b5c2826ad32991ea299067ebc7b2f2e3385b45f82854cea91c3b838068310b41a4bacf88db7abd8cbf95e272b3a9689e2b3e712992ad44d9c055da3aac2be62d7193b2452a5ddc857f7125db888f949ebe5f1d9e7046b9af129589f25bc0f5b336319022c5b50a295e3bcf898ab46dc8218f4d8ffbbc9f58d5e4d0b127b57d365dc7b5aa421d36efb48d713e162c4af93937e1dbb0bd21ea74645fcb3607a7a1de0e100f0ab4dcf621312f277b94a74085d00722d439b7278c94cc27b0c4249f635f05edc7310667385478134b56014e0a2c53d4c1f4e594453595432a4c3359a0f62033f80bde0bee87d49a560cf99c0591953d52ad863d6dbb9b712c15d749890dd009eabeaf005a64e1743f18d576d85661ed6e61275e8e1403b485536fc93db0f4dc137fd16a8a9b797a012f1e5156d5a49cba62ddbfe35b24fd13872b507fded773eeee8342073294ead62893b581efa80186e431683c2c0ae8cd0311360181a7fd31188804b894363a7cad97e8cf07d2d199a9978c2a5446b9a26dfea9df356029a749f69abc0eaf6e299d1bb9bdc6c548e87dbd58a101da4c7708019f51ae8078fc8c22bf541484eb247a69eaa97e11369f888b24a6376939381b94a5f2195520f76243ca1618f53d5c67f6610ea4c331ce77e62d5a7d60cb11977fb6f9b9a2e450f5cee9292da93df008305061051a4897271610f2478f8993586e50a1d22076b6c690ff52b13a1228cbe2712fed34684f25374f46a86d711ccb98cb002ae31946deaf055ab8f28a051e4753deefd70d359b4b1c15867f4508130e3bc4b02129c8ca972f5e3e928672fca6268f1f941aeff29a6a614b15e7cb48b74a1c91178134cac7376819a42c348812d1b02a7d7afaa55df196a700d64dfd69899a2f5eebffe2c7bbb85803088bd31d6a7e204798450b8387b90d20ad3f336793ca4512871453e32f8962a27c7815048bc915c6a33b59a1f2d2ec94289bd14e45362ee9fa7050cc57bcf044eb5f5b1170d12fddcea486849e25a69e675cce489478d8951b567ff80a89207c3a84a010a93027c686b0002ed5e8650179e009b95d737feb5b452e99f0a17a13920ab431864e50feefa07280d015c1ac68a48fc490a4bdedd78aa54d4680c8c9eaf6499684d0497108a8bfc97cf503cc7b08d08fa1022a00b4bad24ff7aa6f90c9d0428b30b30f335f9282cae7a0a018828de1be1ff5a77990fa9d76fdfafa6c27cbc27ca048c36690f62719e50154a2c741366fbebdbd7cf2d2365f9ef273d295c21b58a8cf2592eeea5a046c090300970384c0f770b17fe11ad50f1f64313f4ac05ff1b1a011e4a18134ff11320b3942d63597794474358060b88b0501882806c5628ba6a9ccdf02535f5b364f5a39372d48cc56fb8e593330cc38c42e31c5201f7b98bca68772b76c72f5ac20870f7db7769b0666526885e46f67e4f1a9339b11e37c7964e634f0c92663401acc9da2c8285e0da8dd4464a9d98857bfdd118574eca4caf79df1537415d42ccc8428835e3c42b3797b27fb1bb729a5ed2fc3e5d95d89481ad6a8fc753a27e7c7338663c31133dcd8577157eef48040aa6dbd91cdae1d98c37ff018714e598dd936f8dcf43acf9a59114cb44981f461c4b688047a19e810de0d3d55ff2409640e231530f2c2c069aaa626d8b286d8fd4e75ad270a13b80f074d6c3f0e57b3654377789a7de600058e42681f79983e72cd3af4924242a4d63448fb51eeec962375e4d79eb4f443929415c68542ebbe7e13d466bf856b4c442fa8161fa118d7f1d98019f7a994693e58c54f85d21aa3ad11d9e05b9e6b0615a3e9d294901119d45bdda114f615baa7a7f1552e32003a5730e7831ad5dfaa665d2bf25a942214801afb91f7397f5503e80e65871abac011dc3aad7caa545ca9ff7b657663ddc912fda419d62f0dc220a5057ce4b4f354d5310baaa74f69bd4d6ce8c39e5945ca261bcfb6063303f41a8b9e90949b6b32d07cff7e2648270821e343e4e929d5487687f5a1428b801e45a6ba665a396bc1a4ccb1eba0f142f866f1aa4fed86da9a669332c7e2e4aa4b2760a5e9e25439026eb07fe7e03431ac0ae7d93324d0d7589723833c6fb01c9d618bd0fb349110ca130a08c16c313c526904ac974011360e804e42c7a87a9a08b47601ca22d085aac8dec1196cc84e495462a7fed167e11c1bd0614f97c169c0ca4d44efa7b56a534d5fe4fc9164b227c36a2cd022169989a2b7679c0d642da71cf989ba75b5de869e82f0d6031babd0181bb21e0883a17f96b3d02c5f55d9f34b960cf6d74dae27630fc82280e8b06247cfce19ef7b0c00a9e5a0a663a097cb31e257cce4c0bc3bed66538f8db19a92aa80e03099bc97cfa9cc99cddd7b5dfaa329a5ded2d7a2920a5c162c8c69c8f5fba93c4b04766ef610e336685778462252670bf48f00fa9288101911001ebee252abac0d4bb937755a4701c01959b2d066513e1c630873eb1d883c875c0b74ce99bad8d39cc18da1b3dc8109240fc2df9aff45b3bf6ddefbe67b69f637cd7eb759afcdeeadd92f34ff65f3bd97e699e32db8c2a91ad6d9194410e88b72ad9a112394e3d1b41dfbd55ed1ceb153da524a9509efd2049ef7e871ad22d9d87c77c960837357812fed71e78c31dc4870353fb2b6372b7ea21658269c4d9c47c7741c1983835bc43c2e2cd9b319824b29ee621e3df66259a05354185e27fb13eb56302ccf56b495a8f971af143b8102d3984c18486308e308b6bce251d2b1cf9c036da630fe1cf887638cb871cdb2dddb8ad0ab0566cbee6dfa5193af1bfa10285d34d2d71b43eb10bf802d1b433e4b4425877f0ba11a06074d4c827f3f1d7cba510a818a697013793ec8760e54dd4ce9aa38a53da57cd18ec81ba93ff389d57af0f11d1f1b717d0ff04fb444c955cf525b6809a276402c7db15ea402e8f0585bfa0d1cb44884f7479afd0566db02b4a5c0ed315f72aacc1fa0f972c555d093cde94f08261bf6bd5acd7ceb7cb40d610c55fb813ad309f90b48730c511134b1f16ec15e0145357649cea4e1559d4f35abc3c1dfb0f45f72291488aba4d25342bf5dd842a85e6d4f05d6d20b22c3596bc87ddd95b69d85a43c00dbda903a296497f9be6a8df78ddda52db43ca74211024757d9d22099f2cceb3de52cdb1a04b9b12ab71c669963e335e6b024680082c321e81820870f4c395e687da03ca4a4efce30236656379d7fe3f81e356c8014cff439bb8bc76f8f5e57ee6274a5178d7ddc9bf0e9de409fce4d7d70ddc4a72b37fc8830fa914990818b7139bf2ccc2e94263f1d827d7a81562600e70a6c53a00b431b27c3148e5059055d74719f43bc85f08d35e2194782c9337de564d631d567ac93ebc6cd2aa8c770a00aedcf41fa1137020dab0a9bb2abe86457d900da58d621a33a05037f963868ddd6f422fa0ee879ff12e2c684f9137c15cc5f8d0dba05fcf45cdd030843182372904ce8f121d0af22ef626e4b6acb60faf02ed40ebddb9c72e7f3bd7531735b85a1824dc5e0b82a7bd8df47030b2b5950ec512d18b60ed017f20daccc4349101f2058859e94b227a9416f9c8aabfd10c6fbb2acafceb5ef13085c2e1f8a860d144a00f97e37038e456503a0b5457d4001ace46184db7cc778c8932c2c54268c029ede2d148d6ce5ad68d3de3829538a5b01dd0c0d25233bd8ec27dfec8f18bb3b5637b4e3e6e97b8f81fc971ed8e4b0c416c865bfb3b2c755283185531f836b59aa0e06d61d75e1a4c9428aa0494b6eddfc409c63e2501448759297f345cf5052b62773a738c73b82de0fe8454ec484191de30f358d7a21d0ef3cd62de0a83429f078b19f8af3809be5a9ccd5c3d65c1d597f47a6b5588f4aaa5fd42d98c695f840e81176205e31abe10e5b34e2c3278d6d6c9849a1f17d9cef1c145b08da667f19cbd1e9e65ec358b2efaeff92aa0dd833db884b2f98d1e1d9c5cfb63dc3487023aeff8e9e020c1cc6fdf846c9eda4ffb7114d08ae2b1ec800eb3a8d9def449b454334cc703dfae9abed506b5c1c18f7b81fe3ed501655f2e8456c97c4385aa997397ba04a917f820c843fbebc04f7f576b391052e83052fe630050715f63fc67afb856eec659da4b0efeb155a7f362cdfe47f7aa0aab5fa60093acd369532506c63eef9f39aa83fded5a291f8d27dd84a051d39dc54e8d7509a7e1f586e8a38f75a86a927319647bd6a94f5abad95740c6c9d1ee58c44da86c726b76941607ff150a3aae904dae0d66f35c175026660f7683f7758776609d5e02f6e88e33ee636333ae12d28050f48a931678c9ed72fa36981d8bb2d02519e8480f17dd68f0ab01801ef88ad96c8c55651bfc9c4fecc4eba16261d115b1769f0055c87b7e91ed2b57dd16fa6e2167d92ef643e3e17f6b681d68b2bf0e80dd8e449c5e50696bc6d0601466bc9de2f9285e35edcf58d77a061a3661d6ddeb3f8f058b609fd1b3547f42b6c91fc777b4afcaee7f598b49fa6e5ab759d307d98cfdab6559998f7826d5a213b5b1038f15bd68bad5d95db4b5261b1c8ed137d64ee22442ea065bad02335d045239c3dd1487e0c9385272885fb7adfd0b21f68877171cc5aa459d16adf6db2f4a648235b192fe5d544da852293e93a138109a917df9ad2e52e7771ab436b6c59f29448541c530be8e2c2077becdd632267e8923de3815627fd71f757dd0356fdbf0a82c8a49eceaf88ebf5db00ee524cbd0ef95eb869dcd1a86c96428663d75ccd8974d95271ef104277592632a628f383917ca4c0b1c1868e7f70a35acb518a31a251b1e21c5fc654233d197e55338665ad1c679be1a6c2b991b6f15cbd546d6788b90b0c795852ba92d8e0525d15fcb10391d896e71aade21c195cfc4b4bbb2514ac323efe07b922c87b279da3484c8dba4eb4e2dd7709c73294bf78807a75afe6201cd742d2d985523af063f855e7276d92a2655155041567b2e8cbdca38cd6edda6ac87346135b7b34f3544475e7cea7babe18c3c9d9942aa0ce8605efa9891b73e3a9e22e817851479f3fc6a0d3d52d52a70f0e86e96ec7eeef64cda33c14a11792927011e8ba143fb1d6b665ea08beb65aeb7e328e65d66b3c8e6bcf16f59fc959de882f486ef105fd377a5aa4caab059a52c31f6e4b59f40c962f120046978cf3b7e26e078a2cbf20d340154e4d63a3c44bc96ebc2c9417c61c3449d691910a984003cf8890af02403935f0915264b2fb3350b3c43c61f741b8094b0b23f21c7dc65c531d434d9b79e43509fb56fa73d5c2321783a0e0233eeca33ef3799ff3998f4b1fa50b0383c1fb9caffd62aee2efb1eece7cfd2154e2b675f6adbaf6be4917c85620177679c246bcba34da0e4d59437d0496089d9c3f16b6114c6e54d884ea3a20647e711052e38226d4d7812354397352d6f41b98bfc7dca84003d5f5c10e55ce949c35bd6f0ccae68e089c50f9f1f32dbc4932735a263a3b89fc99247f44a0898aadc9309421088c71327b1a1f8dd9a334f4052ce85d6a69c3139f352ebf78e259337563aae49553fddd04180c75aa7ff3565b5a19d90752c2818fb6916bb501b506d87a0a26b75ddfe16c51d2e69055277cd9f885bff1d4aa5bc7b7d50d39df949986a7f74fb19159ee69aa40b1242e8aa174c38a5c68ec5c2b33964b3d57ba646ae2835342fd523d12817a18e0356a46572fa3710276dd30e4d8dd8b216bfb3ae407cd40a78f5e5c9edbe35f0875eb3c9239e72a09fcf5489247f2e2e841508ff50058146c6ed564904b533ad13e5f34458d35c409d03df19b622de105875be042c4c2625dc8c7e7c10482de352e3aed1c4dc9fc08225d7193f707da2019e8b8c13cd23119bb46afbfc8897fee750bfc961fe8c69ff171af14eee424e7abc58baeddb577c3a952c07a09273719e637094b4b1cf92f7914a240b11a1406dd424436a576112bbfdbc280f7e527c5afa72827b110694d477d501816f86d3340e5d247d08708c527d205e937aea18656d8831ff7eb5654b9ed91836c5b7ace11d4d3f9ac560c7ba68a12a1239b718dde00d5cad4df16aa5439f370b49529510f0de300377a12b052e909fde74fa0aed1ab257415743bb644316c5cd052c26cc2068318beb9066d427cd90e88326e2555092d5e928496b9a21e316350de8444be697f0e099de2a0e339988e92499b0ad303f750e892066d0974441e125cd8a464d09dd16dd5e675c637f30809343471aaec73cac11a17089080e814dcad1b33c2b26a4a580031b8b6fd7595730a3b0831f12073db85cd63d6bce791eecc37580215399c650d5194686666aa1b8433f3c618fcc76460db015813ed7a9739ae961fd6e6c41f7ab8818a42b3db14766b4c01353e65e3d8b4d41cf321da2c8384a154635ee8f369525435c1d1694cacaf5be909bdf985c80f2807f5e289d24089c67bfadd82c3f4ff33d9b12c1671f6ce59e3f49b2fde9bdd42dfa41b237308571fcd747961127d275441f4125e0a9653ba0eb919533ccd59cb6826625af9383866e87b8a0b68637399b47658e5eff18d0b4932fe6a3701e9646198674a550410020127739fc8782e8d0c3151871cde988c0a54d3be75db3cb11651c0e6a205bea52a97c433c16d0e8079977c79daca6257e3928600541af72c0e17e881860f6d5d79e9a172a61d1781d15f6c3c38d5d1a747d0e1edf33280692b99a3e555ac0245b6c4fffc61edaef938291f7c7eea3e3c174aee894e137c19f0a5d310a1f438bb26f13cc3cba20486116b1dc927cb7686270b09aba877166d80f7806aa547900c941256d901d35ddb4d8ae2d01a138c4f9a0095490ff43fdcd09bde6a164c6517d2205d99b72e39b77b9ccef94c2cc1dff98a5ae22af304bdff7cb1eac70bd2dca1ea751b34fa90c6383d99993155384e59f63e9f1e5399be9d0af24196702212f552987c72173fa04dcb27c82912879a265b6c8ae37adb274564c23ab1cc4ded9af082157f503ae3529934f2af7b95f7dfb071576fd07ea84925bcc740e06548bc71d6a3cb8c5a95a9b41cca9d8873d119814c73e7d20c8e12da654375d275645dbd80f08f33ebff4f49fe2eebb1ae98c3ba576b12c121d6950864db467ee968940d40dac19168957662609241c65f478ef9b98cf11619f791a474edd3c6f6b116df0def512164324da12fa3a9c1caaff2f40c54d10a94796054a7c2bceaa3c47b302c9a0b1ea9e69fc9e837024408050609f51985fd3952594cf65ca4c28295c0830c28242ee555140800757581b0ea5626d6311db66ecc1de1ad7f2abc6861c10f20ff12c345238e5dbe56d22198792f9cfb36a1b5a8baa66a60d414f680dd04215f065a2958d4d8bd475f6e70cd9060b38968a46899e5b086121e9c2a7da5f51b04a0a24687f9e0ee8dacd9d399eb2f051267f924adeea8100d3dc820ad055b194854c2ac986a69b3c8e62af4ed1b21378f6c6a1100e3f417d5aa987fdb3900cb4310ef7a085014d4522749b12c6b800190f56e4c31132fce475463dc39c47955d496b95eb43d549315a3258952d243b9d13cbb7082e5faaba57af4e4d9fafdfc745639f4246853fd39281a3b069ae6983c39a31e2d330d75b3ff6ae067c55077b16e2500c081abb01bffddb4c8370dc00b22d9b84915221e40d7849fa70c947a8dac446a09c9a4a03bb0a09bc89397d6e03bd9b35634ed090edfb36b30de5f0481d6048d1ef6abb4c26d4e10bc3d9f3e7492a893b11d49cb9031d04a87e296919264c3f8ec6bbecd4efad8d338bf318b4bca321f754a11e387183955f722e93fe8392d436af9a015e5e6e44676a6c8071fcbf9dc3368271538e684fbd18a5b528759405dad4b300eb4685ecc1d9eeaa2d1630e95e3ef53fe374e1326fe294a1c9ee75813772314793c6319ffa7c43020804e6996e03d5136adfc764bf882494310c48cadd757ad412d1ab64d54445ff98d021a73a5bfea4efc26de09664765ec394a2a97bb94b47376da50527a270a62cf307b1e62083b645a6dd55f829c1463400896fba64cadfadf4bb7c172a9c752d62476962b7b762d2765c740111997263c5a40f3acc08d613c9a0de01cb54cf51593b6cec22cc3b788d39f27c96ec974647cc8b559ed09aae59702c6c83203914e47fed70860d3002ec7e03680080aee2e1457f759fb2311d5ae96a66501efd8211fe199277e415e04b70bab1927d31631259d9ade75c48f0c4203e60efedf8135d958baa87df46da77e6532cda8b3bcd3c9b5ca102228775d14a0fdc88231a877fd5cf0689b7091089db80e10ed138b52758bf8d416d0d9f1748f7d1fb59592e193a8289ed5c2800003bc22ae3cea6a39425c6d7da03f468734ae6d14aa7480204d01de93837c99053901e3c9456683da3657b29a442bbe56ce4b91d58af6d1192aca4a67900b610ecf2e51839e409baaa80a4db40c48d22dcf5864bec2e8700b0b12669b93bfd69d01d6b3d41f58f0beb6bbd4158ab50d7497c70cb1d767745dca3a0437acf93ca5a9739a618addc4f51d73ce13b1de3a74aad5b0d0ba0d0c80cdcd6db48ef30205665cd1ef1d125f285261a8ed7c2749e4dcd00499d0313ee447f360c02d87ac538ef122ebeebd6e6b3360ecac37881dfe0bb9427d2b1cdfdefade4708a803489a37ea93fb670ae18ea1a44a5032718f1fd7afa737cc581ff57adfeefe568247c1832f8d826013506c865718f4af7c41dcd523da6e3c79d5fc3ff5c7d76241389a0649bf1655eed6a0b523425fb82da8e68592e42988b8fbb5ffa203ff5848f6deea367fd8cf8a23e7d262d43de6a2b25f645731d7d8b1b2851700b53853ce88b6fac2bbab9de6ac4b09478a84dd113aaf7d0862bed21f338cb9f076740fd0af9b40e14d96b583e3a2d3ae044280416f8fbb1759eafa39290acc6360d8d60eca3c0ca92bc858aa8f7adae866ce6ff063aec5fbe702dbedca1c1ff276d6943f502d5213610a727cdad5780983b5f05df515a521e9686bf6752027d67d76bdf1c4f7c3e2a0406d710c91c360310137b925176caa8e4e00fae985141693b0c6ac2fa44368701cdda6f0b636bf7035f06c0d8cb9072f3b8744ebb5c3d171920e57343b12df218b26921afadc685ac0c93a70af9af3fd88aae3b1cece07e874ebb2621b47ef96945f255b8e8f6093c4b16187c1e743eb8e32eb8577570cf6cc2e8757c38e7b4f22d8f3ca75500b03c11fa1ff56726d05b32dac32f49ad4c2745c2ffa0897659432a68d4ecf86dfdb3f0305c06c50bb4352330e88aed241587e786b940effa8c114af047aed0f634c47e153163184991657cd6a6c3a80204cff2397c16055a29ec1e6320ac8fe7f01ccb244aae5d8a5cff28d309ffdabc115ea16093fee341befae1d3a64b08b966f5699d03fe5fe37cd0e293112b5fc9cde97b3a30735f49519fb395244d347ed818da27f9243d2abe9474805a7484003c0b9d70d4312665a0a816812f1b6a0c4c4e3928127637f0d3db61bc53071cc8848653fcbc53fa150f943790ea244ac4267fc163a7f6ee778ebb0d8a80dbe86f6486a75b239177216efcd5e1220ced4205918c5b9c924a73645b2828c50c03be0defb616d60587560dbba962fcb05610bcae06b64da5541c888411cce84ade98b687729b9c8690d341a14949640bff9cf367e0b600350fa3a06aa9357862be1fbbaf7fb304c7116d58b9e1fefb9214f63e7736b276fcbab6631f0045fc6d0fb6060a4e82ac5e549fbc2b31a0cde5d40344f52a2ea472be40563aabf2296ddb384411354ba92433aaa704e1c0c041204010c522e095199400b0b2d7f9292b50ceb6eb277d6e701a645848306f7819c1f10c17e581dda6e85f461c9ef9f5792cc011cfc1528172dc0626280086aa798c0bbd9a35b07141155f0b98f424d7e1e0a95d8a355e3cae95e56575f93f28e691d2269b20fe09c7baee3ee7c8a7bec372861846e1d98c6b174299a02178a4578823a0cee91e123bb8ba4fe9b5bd1564224d79f54781e0b8d4f3f2ee396a1d3088882dba29ee299e1d21c40203bec3e6c5801e3bd47b3c6a7264bc025bac52c71e214aab9ae73e843d6ab6304d6a44825e2ca311baac6a2ea354aed28565a63cd2a4b6fe59e07122bab21ce653e16c4b27846332b6f775ac2fc424d77b58d9fd4a6446383dc71d8e09d9ba56667c1e4f9532ea240908e1ccd94f40d7a51fceb2d18fe8461988da30696568d21328eed225e3a49c153563e3c8d9437aac8182ecaed138507ade4c6cf7790997ec4691f095504f95294145960096ac30d379686bb4f25e38ae120abf4ca2a7e4acab2eb1374c4d66baf747d52726a18ef1d99d5d20940f459ac328ab2c0c533700af7005b8817d97109e2b944839f4a810cf06c0fa30f94d7b3927eeff42c347b73335b5a19ee4ece453131c1a36532dabe941140375829e3d1c59df2e034e37b84cb683d6889ad724250388af2ab76c384bba480b409b17d68095c4b2d934d4a2a091b8864ce890a797778bde0f7adb34c2ba957b2ba21b42e7dcebe62b2ccbb837dd262b5942aa43806b524ee342c50a5334e5d329bab8120b8be23259a42ecc5bba5556bfa9293ff7f3e90b4a63d297b970eaf55747e84883d01731a5981d5d7e5d55644ec11b3d2151a37c7f24c8e57f9aa308c1e608628e837e13bbef3f4b7978e945b40f69594765a7537e69f63c09d4b854c6291a6c505b01093fb7136695e97585cbb3576771b2b84395346a6ac2ea117b5f0404e5bd0cc8ee7e479d2b1887dec18e1837e29953a118759c460566526b7ef88a1499e5a541792724ebf863574c2bd8c66ce6a526b8f03dd803a6d268cba2cc9c0765f60551518a35b60780c0265a1395aa6af41d37e7addfc4d03894682ab08e1de4c5d1ce3d02f02cf21a08790e001000c1aecda604059346e4214283fc54958bf822464e2db208459c974f53c102a36a0d5d6c18e345e0dd201491e944419350327a11f1d852758ab16c4672191a9df9c65992e2868497c077af24ce411026f4dba1efa92d8dbb36155074f272b314e905616026ff83f4265daf57174b93974fb327b03e65c79ae4ec12df546360bec01c1a255819d5b88bdab48ca067e4a812ac9c4a21f00eb23fdb5d4d1d3c239ea6fcaac8416eea78dd5ce5ab22df4da91ceab0d075982c29339ed1cfef4cacf6cc95d832bef565c6e41ba82c944e11f12ef402526a5976ce83302770131c55cb0156fcb97647d30252ad0dd8a9537669145a03a1eedfda17dd5876142ff7b2854d405feeb7f172f83ded09edb8d4e0720a0ee47229f70f9f923e4c85610d26686c73adb9f509361a67d616fd9dd103e7ca7e200ce4e103cad51372150a73335b7623448f33a6981f858eb000d386836917a356b5a2613a30745070e318c808580149194ec37eebc6ebea2fd492071a3b8a2236ff604351f750e0d64d75a50bf2c05738c1fcad2fb8720b29e138aa38047dc0f0133e7c795be76697825bc0ed33a3bb28b1e87f7c85918423e182b63e4a8312af160b559cadd76631fd08587429ddae5dacd5995ccfcfefdb3fb3e7d8782f793a21e37319c10930b8fb4d951215c33b5abcbfdd94b55524b7cb1483266f47a4adeb274adf13415791db282512429a60245c2fdf27c40a0c28f2df911b54f917b6a8d473b9bcfaee978cecfd9c6fbc09b8aa517d525ab1d9f6a35b9bf946fe909db051dbaa6029f8178e052bee3e699a570a248282e650f3a4531623bb71cc036e94e0056fcf96c34b0d7715b2466b43434c274a03d2b97107123e8fdb38835572c4cd390f26072fb6984be8f7ff8368d98c81e4052deb6d07a3fa14a3835589b7495184e4e6adf10a43c8d9f964cfbf967f71e1986548cc85ea1a9f300c87077ae7cea4929df51c9db187b6e8ca7f14a999a6c8004773fadc4b0c0e0e6705888ed0cccd8b977404e61977d060aeb8ce8014e810b9aacd234a36b10febf195308dc0bd2285bf2a4370a373d0b6d65864c4946d1e0c15022fdf7572a5429b840f2fe0a9f60e63acbee6a83707ec50857e182d0e77835729efc42b1aeeae8b4b7c48cce2d4fdec1a210f817b42e7d2063f6077a5f82a01e908cd70129c7deaebacff261da55ce1be2c475830ff1cb5ed68301ff4e80e4066621c3fd406f83fa43d4353a044a727ea7c90d7bc00b05d626fcb912a49f3150822b1958916a2a157bedf3c4a8c59160c48bbdb1db1acfd784732e901cd72e07e4b3eaa287f73a05be3bf359e8a2cd3db803a0ca297b337e42ae900c80080785e6045a689bd0ef38f9ba7cfc1e10eb54f966dad615efb7394b98e1061a26b6320185e030a4f373848c51ccfd359285eac2e12f9ae08549e0bee8c9075b939a5ebf0d70d59d27a049329c4172847789b6f7b6c625ca00161a32b6a178cc0e914a1c4d8c22df384e9d157c563734e6470b879e1aef75194e115d841bed04359826d977daf70db14cec4c7a45ca9da57349b3a1764d1c29630b231777f3c7c7ff147725be365ac6c0fc1792c298c09020c59086e748eeb6430e35025b193c2193fabf16f7d3cbae3fbf62040c0957d134dbe6607ae1d43d0653283ac8516285ec6d8612cd217a28b48d27bee104c1c5262c163a6f2d34410a9fa6c25a1c2c28571e5132b455b5088f322541583ead35503dd26242fff300fb0bb844438d5da8d0056e4601aa13e8f3f205270f5b80c20a76678ba12ba39d8995f8f833852441cdf5efee7ae485498513c61629e9b38381143812963843242e98f242c1da484d0c6cc655dd450f53d77223e67fa46d2802eb075e2bacf16893cdd993fed5972cf2c4d4ebfb04b7091b0f716fadb5e434894f3984efe4002aa6d38ca1e5f3302bd398c649a9ee1deeaa43261524fe9084a1385d6ad1fb901116572aae144ce83ebfdbfe18f36845f48d58743711c503bd1be33e67822338324f8b5ed4bdb0a5ee225724fa8bc748d8428efdfade6d6a8475fb46e06df5b931a42b05f8f30424dc03b62cfdebf3ab3074891a0e4506b9a40066fa681f03745c07b170bb07fc835e90bdc144f0f6f4281d48cd1e59cfb62ea7ee6835868c34b2afb4992cc41ca86100f1050971269483152c5e486984c7f9e7833b7f95a2e3ece3aa5fe5ca284a5270075f2cc0c55bf86c034b42dc011c725682710b74734736188b0084a731ee7cf3dece0d819710dac09cf3dac2f808a19b147cad2d2498ccd068124a9cd2ef58ac23759c68736256bcfe6190afc978f508a7c0a691c4e9a944b576ad5f0400720508f497538c5bb945467a882b0e3199fc311a7420a409554951b9805e7d63826a6f899ad8797b1d46ae59df10dda61a7c08e067ffc7b1c00db7f44a5cae356789e997dd77dc99eee48df2f7714691508b4281957a436989420b731ad609c8a9fb21bfc600dc311a618bde38c96c3f6c80d279a2bc83222ba66626c978517f42dd580a31fa19748a63135596a01ab5fd63a956929a43c4db182e266cec412168858bdb0b4f0470119773c357c16b003a04b9918240f00c13dfc5640066920c3740dc7e8ffe0980ea4661ca80abe10171be02d9b4d74aba785d4bbdb9355f18c8477084be84440390fb5cb8d3d1cbef3154c1a394f49731bf3b3a69334628703e0cf3b5d36f773f15d84abdefeb67f3be12c713489eee3d94f3007d5ba7e55913d96f767d0cfa56748e9b75c987a593bc6b39e611c79cb6fc958568aa2d01908f236eb0043db1fb663ce5484af119fd596ada0bad69a68f65b72a5c21190b288db9b684abf1cfc13ecda5c08174474fbe4be1db86eeaefe3422767cf470c39d6d0a75074f51da20c45ae08257b9c5dab08e08177604c21e37465a54fe37dbf7108b5ddd6a83b02fddbcda1955b04b6ccfb230b4c1cb1a462091b3ce483d6a260d5615405e887866a846824e7e00357c4161738546390051475f710941543b033c03516bbf70252de2d99947f3132ff59804a8dc00d4785028f1987e40f6b60492f089b503016778eade38a1880aa3a55bcb54273e0e242fb83c52b7cc9d888ffdf180b525db01bbc8b01f382c5ccc9e6c3e465014b08f69b112b8d32fea6f89c5395ccdf51228d78911323b2f2010500be199dea51bb882c8a139d941875453f6095799f9e9a34e98d10f54eda7daa90b46b835eddfc0d0eac4088bc75cd3f2a6cead1551fc5198873ccc8d8e170d4b1f592f175f0f6f95e5c0dcf827f0d478bf2deeb8da1e31b39229cbdbfc113402e83346394c6483ecfcd0b7b968665d691efcbffa6d5c678a40c5c0e8576dd71613282c6e74284c2785b16ddb76323913b663ec2e9e78979b6dad38006e2bf8f2c693fa159a10251213d8b4409da36fe7b6693f9c6bef0179f4271ec1e65edf630e0b8661d6a51592750625e5858842cf263ca4c0db5e5e9e6707bd715e6074c3965cb317b56357e4c3a0656575c888eb78b95c244d09102d56482e922f21c50d57f456b6479624314fb464fa272da9a5f6a42edc4ff601ee2540e1b4fe07595dd1eb064150a799c2148341f0c52c60a4362e135e08b1f1e809561cec75a18e8dc57b43e80df959da7eaef062f05f2590da821787eb96c6bb041290c3297b07dacf4452ef38b798d3eef1c026d2513c1c574f5944730f4a4f980c22f50e8f9beadd277ca3d811246d14c3183621e9b6c98382725c80cc7f63f4439b5c7ddddcc641749f6713afcdc25892fe1c5daeac0a29b688ce7b8b50a818097c16caf357acd4575ef159cf0a25f28cc99acbe7b278870a35ab61dea9b2d5b88af622153c9f85d737f1d7cde8b5c9b62347ad8b75f379a1fefc4df5f8d6d4fc9dc4fd2074b9b12c4d626542abdf39aa100cf3c45379fc5edba4a763bfe6bf9615ddabb5d10216edf383b4a6426e769fe87364e3c26e9c19148e1ac6468b02a8963ed384623dd653abcdb2e683f9c95951d36f3608fcdf9d32cb7c84b74959380b6f56b647439de5034e64417763c2cbcc07dafe42675996db217585a835ac3f0b0b4a9014b7e0af2efd223063c1bd144e0362ebe976c94a35ed575664d2399ba2122c33f0f062962e2f4f2a47197ea3d9dead4568496970b2207b0e7da3921fded8af3e27270f85511e1eac864f9e7265a38532e893ef470dc4aa82854cbd75b8550b0f8764cc097d7415fb8ff885c494594c913eea9bac5e2d0dbbf2f90f4a6331ec0ddac9809a63f9d529f37d7f64b16ac5fa9f1ab0110b7fd7d8fcb8f6e63d5f63adb7db5d3acb7488a58e964fd032fb7884d53584fa34aadf19651ee47b1190886bbd8cb06c33584adfac195ae0073419cdbb6efb14d90fb0c180af715ebca8ddd5cd7ee885ebbd4efaf9eb5d5711e7d021ea7833c185191b7edf99cd7ee190645cbbfa191d0da565d73c1ca6a0c55f0387c263536822c665f4a3457ce2b078a8aed02324746ecaa177202641c07bd9bbf2380f1419423c58790a75c4e26fc3f658bd3f1cd247a42e2e8b04e2e0fa3420bb656f8450f90c0842154ab4c0bddf7a9229c82bc015191719701ecab3c8227c4c78039c411d6e32ff3bcca6413c0d5600f2e02cb05c842ed9adee6d4c463defdc5f43505cbe4b1b32c2c6a37915eefe9d606046f4a0c0a8919d8fc2bb8c44c21949691bf4e39907ea44c64368d8a66cf38e8ba520ca05db74779dabb2b487c1d1c95f7ff81e4bf971ddf36eb2624b6bb3a45e5c6c6b88012eb3527a6cf7046554a3fe441506af34663a71ce294d53a554c1b9fb7b38d93837b572e24cf967ec71ba4adc512b0c8546f587b162c6fe40c62baa62d0eb17d8d3e141f4131849b14cb2dc842142677a353085d9996d88f5dd969bb40a370d76985ca4bea251a27600b57c74b6fa1f99614d2aa068dfe97fdd2edf6d4f098acd503ba8d255c29f608f6956cb33b6ed9d784a06200c5d0c04876c80fff3e606f0336252e4713b9656db83591ab21cd304744f4340d0bc582c2cc0e7e36dfabcb0d8c30e1b270262c18558292367d1d7631f80b86e8b681c59fee8401b62e8ffa32470b048b3bd9146834582a2187316010005621ced7cf15a0c2d949a47dd4648cf45532528f3057a41e8abf58acd5973d1c82bc181e38ccee64271a4b3ce6e841faa12c1e501555bb0bb67e40699c6b2b4b0f7f919921197c97487c6fa2788d36140dbe060ef125a5cd08336046aefed450f4add073b9c0c8a7c3711b5ac0b8aae1cb7cc4c3a58039af30a8e02617ee18217d659d6eb7fcd61c1cd899e660fe98d942cf002ac777078620911c2206f1a88dba9f9da87e37e9f87338d009872c0a9923ebf21ae580845c4a755a7a1a7e6ec8b8de114c08a78c9de8d33c912150ec6b837e5ec1645f516ec47ed2fa4465226907858c45d74a27cb3710a498dda5b04fde806e61bdf95d97a22aaea98532b32ed3e608d3ca0f87dba246e3a7a020343dcbcb9e78036e1c6072a8eb3e4ea67738b6f0e8b4a2001154091b0cb8a300330067775fdb24eb69c2a5f562463e646d76ecf2b4b744c74ee8fa700aca0efb9e0336d86f8f1c7e0534a089f0cd16d30c83bd965c6eaaf9f756bcc14369e477c6d0495d3fb22b8d9c750dfb11f4182db83f128f9ca5169393ce1d0394d2f0ddbfb4db806f0a3ce56828198925b7a300b858e96ab9310e14d41eed64a7f14b4a533f24394913cb068136f2daf1dddd33227d334003990cdfd40d95d1817f24f3535f6e1bbe4dcbf2a64a923cd6b13c2123901cc2da652c46c77807dd745e7cb9ac223df408f18b33915d0e01a91a0c56f8b46f460cb8cbe19a514fac1fe05f1cdfb9d6ab1062f3122b992188f9a53f56c56445b2ffb6c5e9c976633d20146e73c70d4b1aae093744f91ea3febf1749cae053f723c24606d4a1dab1cb8b5cc13d1e89fa59756f9032c6961f6cb5d2298ab7e20c36710fd40038b5dbcce9b6ef049ec2c8651c0f07a9ef9c4470c81bee036d413e18e3aa8b3dbdb07c1287c6f9b369ec090e0a2e7b2cc2397184ebe0e92f15084298fc993d0f12b0bf302cd72da3350e9d8526303ec97f74939cc9cf70de607e0bc44d863cc36af6baa5f3a849eea92078bbccce2b0dd73bda5bf2e6a0f23892444ec7f2e8996dc8cc0003332b3827771ae4026181a9f3df3b3666068e9160d6a2192036c0b9666199c79b0860f744d23ae9ab433602e0b926e01dd3415abb92471222a85bd8d47b55e4d5d2b0d65aabf2453d902312720d22e88c07abdc186d832df3a3ddc3b23e512507b9e19f6c9fff3685b6cf8fd94ee7cc13bacaa9ec8dfffc6290678ce0066588e763b4a1c354eb97a18daf247b2a34bd0dd9f598380b9d04ce7cbad5c116bc7bde4ea1a0e3446519c034483e79ec19a1ea5c88d6fe4f201781a3a00c460419bc6c7df876f1dadaa4db78b3cd581baf051a2f2378f9acdd6041311632680da2b5ebf07577b4859b83c3ffbc3c738349a8ad70260a4176e1f2bd706d2b50b7b7dac4412ae870217605410528b1e6e84be64f9942840dd46c3899a7ce38ff78c477cec0da437505aba9edd96560b62c4d64e6f8554935cb232b024170b97e24d40e567f5ea6011a72bad5d867055733347c3027abcd908fadd86bd49037fab7afd2b639b4088ace7c8190fa29ec04c57f162ddefce70d61a50e7f646f80cd8383571b72a54801fe73cca31e020008049b059ca9e9fd3ed09bed6bded75da9edee8210e33e07a0fb41d37d743950ffed01b0f9c4968788f1751f9cf1e808c608045f1989a8ab897320e538434bddff56494421d1ded22398bed8f194e6d8f0920fb41ba0c78304138e9e685e2632b5f962b185b3168a491b85f79ef117475896f911b74451b4817a2b80032776d38e78d70e0170601c4a88d0237eef5457c346ee3f9a3eda639af4051022d17a7a26c8f63cb87ff98b82727fcc406c5890bd3fbc2e11efcdc66671962bd2a5a85bbd1e552903a497fe62c07d7e97f9576a4e656462465ea2638c9b5c82394632477aa4f0c3be2770e14e151df678a7b209e4ea45e231392a8d2c58fb43f99d868521f590575a6fe8b9606abfcb0b44a72381553430d2d2cc3268d33ad1eeec75f3357ae8b71c850bd8ffc12ee428cd2227962e7d0283e7ae70ee7f3ccbee3f44f686975267c075566c7e18980f2b0864dde2004501e14b53eacbc4e356cb685443f73f9f0e2f05d6ef1fa945135c9267b4e60d16bf2d13a5e9aedf98ad4b32cc25c883525af21cd97527d91c1049058891ec92048c2e47799f5e30b911da9f4317790b10ec266b56e26c3392ad866c9cd863bdcfece70ead10e5a365c8b8c4c66faf23d8268e7860be01065d34abdd6590b131cb374c1b5e3d9a6b06d5aa62f32c726d9939213db5f27ff73a9eed07745c63302500ff9816ed5e7d7cba1c90c003f4bfc46f8b5d5f76f2311cd3be5842290e0397e81dfd0262c5114f2ff06ff44007c506d72ffc265d0e5b092f0050c642a98197db44f3add294f56cf6c2216d208d9ce8dce016f9d08d7c8e3687c5e46e150e6ae00bc19ff127212e63ba15a63dd036b0061b64640622ae12cb274b1d57a29041607317b6972625cda94ffa9b364ec5de8e54c821a58c29d511c9a424311149c6f833a35a52b88690118782c55327f63147413fe967890fb5a5a0e508ea882d49ce1861f49976140df8192da3ea3000bf79a953fccc4d89128a4909ef4d8198cd80561909845e0380ab1a40cf877727fb9a96474632ef2c8cbe368e5ad9d59db0269a6e44910525b0001b27724513acca42dcfaf6b2a2f440b0814bda0423389e8ffd605d5cbb813eb3356452d6fce83326413d0ae22f398ba66852730ec7023fe65334831b8001297ce1141fa90f02d0f8dd0b775bbac77e248e14478db7b446ae32618cdb714e6814ed9585db0a96fd5d33f0cfdf704e1223ccff8b47304622b246a25f06508bd000b9487ad44177b59cfcdf912e26bdc19159f730cebdb048746269ce1088792b0519c5f657e34cf177a13363c31f824bad6665df627586da470956c9a8b332e6ee3c0b8da159e0f92f18a88d5f5d8563cc33f2cd49a5012afe7b55c67b3f8df61f5d65846f97255af753014ff1fc6d07a108dff1ca6703df834b6cf80b652f1354845782c1b5d61dcc11f61609b1e4f4bec1d7b1e7083ae87d6465d70f6de501cdf9b998bd09f632f7f9388efb1a1f5a39912b689498419621eb0a6ad23b1ad33da7d00d0f39094d6592654a61979d046f42dab6f429edc757e1513f969fb83745884a769ba4af9804f5edc0be06972a37829cd285e73df8b50880e1e1d6a5896a64f29210fcb9695356fb49f8abf305de96fd1a256719be12c2276813e94786da4112128ab01d83345641e46978fb142fcbc5602ac2f9bf6737b631e4691d118380afc73cfc2043701fcf302bac962895830542a4a7305a8ab8f996ce5d48f24022cda533240713e8c753741a6c2f28f867c53f35e61a067ac016874f0c3338702c8fdc1c11c082656e115b0e7e7ddf934393fb9608e85b06d0ceb81beb5dd88f592dd8db46e42427624082b09dc08381846dff0cbcb7595be50eae2e2d272875b6e7698e5e660b7de49f40ca60376f3e88d25a22a88ded483e80d48075a13f4e1339b616b1b8cf4e13dd27a86eb41dc063e3ba44032bd75abc2263039387cdde1eb99cd39a12a3d13b2d263f40c3d95bde1d029bd095d57b34b3743597623c5a1d4bac316767ba74754f3f4883ac8f6113d6a253cd46a1c54c7468fa8d3eb7ec6e8d16844a5d123ea6d04536f237da4aae2cc7597c49f9f34ba21ec2535bb2a98baabd233d6a93b2b4dd37ca8b779ebb06d98b71edb869ddbc85b9f6d83bc75496f2c7ae30305dcdf2542c4197931d43de02e0f763b2f86ba0f1368363fbc18ea3d4ca0d9f427d06ce6e5b3e3916f36fdec8c600abed9cce7f683a94b695dcf8ba13e6d8fa4ee9cbc18ead13a9bca369b764f30f5b90527b5b2775402cdc6f9bc18ead2fb3b1c71535e0c756861acb630d63ca34e1786bed94c972e0cbd303b4c9f40b399ce83b391ee6ca4cf0b63bd0f2f8c04faf03cb853af6cb389d6d9f4dd1f8e222dcd608523fa53942349acb7347ca058c1cda70849e01cb18b8f86883cbcb4ad67c8b4d120fde9e6b41b1f0d111d1bf996e87bbb3ef070a4f50c79488f5e0c7c91d633c8f3009237be182bde9a935b8f4477b86990e939f1ce1b1d74563f2ba8b74c04c3a905a1dea6c93d4ac2496f7644b075d9da86ba04a6dacd1fa0a74016b39908c63ed9ac4304b76a776e53dfda867a8910a92fd204f4d6336041a8eacd5a8756beda6673513c298a9aa669a228ea5d7210091428f0d4eec6b7dbb3924be8a9ddb90d9d3613c1f3ad6da0974893eb449ac8d3cfc30b043ae8e6f40502c9ebf292d4369bb60d4ff7a46abea21a94dae2d88906a1ac792a87eaf3e6f42b6949b3834c6fd2299b894c37eb58360778e9359d63ae51a9372a52d41dd20f260787a7bb67bd0804900a7ad23bc4efe5bc03e92b39d705d97ae0a0c4a767dc1bce2209dc7cb27003cb809b0f165bc08d0299b0bbb5a665fb48c10de3d0022b7aa6f95871822f1c943ce9191877254f7ab418482ba4b0a207b1499502777ad0c00ee6d4e673840d9c27ee9e32708f1825b0c970c220d77bef411ada0e691afa10f77defb92adedfbcae392f1fbd9910529cebbae8b4104bdb7a54d94859e9dd4303de883dd33ad3b5183d75b41a226e8702cef676faf62aea19d0416fd7d16a886fdfd16a08bdb51e7854001919a61a15bed7aa60889db52ea58c969a7025e190c5d16290557a55551662eb593715c4d29b82a36d5cc938a5adb9c77bad8696e7e357b187fedaa3c16e65b9ad4771aa51592e2f2f7a2341a0d75a0c2cb67baac8b61e490b71c83eab8f12c499a5148786a5bb043ba54b766e83dd223d6c9ad4aade9a8e55d42f3d750bfc4e4d526b31e0349ce7cdefd5e3cd4f021d3eebf0810e290e08f4466f4056606baa51250c7128a5015b1063c966196c411863f567631178c9c14fef5d713edea7c33741a18114076ffe4107fef4480743a8037bf4da757b577bcf38d0a345906f5400e76ebfdbbd7e53bb9eae7bcd93facee9e8517bbe00eec307dfcb1009778f9716433b6cf73639284536996a553be0e92ebae7262b44064f1d90799794cdc7148e671d9812bde5d467cfbc3c3be5ee54f3a6ec4d6628653870bca6a71e1e5e82bda65fec8bd5d1a37e8b6d18d4fe3c8bad56d4a3ecf5fdd1a3c1de13cdec18770a7aeb99eba1ccbe47aec61ec9607721c85eb361d7f05da462bc43243cbd8706bcf1c61b78a2a40ec860e9e6dc2ee2409214457cef2d63355b06b5a23744dc5a0c570b96a7cf2f584a1dafd65b8c7533112cdf2a667963c152ba19c678f36c378bf2cb75b38ecf9b4738577a7301b0bc597e6a79e535fd9255ea175a60da8c50438ee71685be651a309574bad95934070b4ff98ae2b09cfea56774e086a3611c6ff00afce9191c3792da971eb5a8c43db1fe1c6b2b79346e8a7bf268dccf8e5b37bbe0ec944c4ec9bc3a4e9fb45c3eb1a6699a1a364d969506ce3c3eb19b33fd350dafb81fa2cf4a62b3b51c63655554895c44527429a508dd68810d92d112e43a7d4b6edcf283a30064720c96381a4d7d01d99e17d397b7654e2ef3e64c6f892edd325f1fcd059c1157b1acba54f3f44a9b795cd18511fd7a743f8fa677787cc7cd2e54bda4e3feec78cbfdc13d0fc9703fe4e7bd743cc31f7c9d85e594e2c8cf9b33dff2292f3785c7cd2ed8b3fb7a73dc21bda2d5338875dc1c25c5a1cfa9ea2d3ac56197ba53b29bef9448e76ba4e8cd755d957ab09ca4098b26c4a2960baf4032606c8ebfd8eb2ef685b3d8869dcd2e2ced028fc6197934bdf3627a26bbe0dcaa54b7e83492e36ecaa3e99ede7934177037bbd4eae61aaf75e7dda157de1ddca73b24bae3e6cc1d973de115f7233b9ce3d39bfb519d8f7ece81e575bcc7a800320dc65945add500f38c03cbbfb41a583e85c880af672132c89b339fe392deecdcf439e96beb10e98e0bb3e3d7a77a8147e394b8b8744fad5570532132e0f82c44062c9dc7b30cbef2f51cf6a5c5109f23e5f844834c1c5f1f0d8ee694c8f7b300622c96cf55de2c44064ccfe366193c3925b8ff02bce27e44faebba446f2e39a569ce39e777e4784dbbf98327e93acefb757530b519ca80e5e7a4d3e688104fab83a51019708e0baf381fd3715cb22f3a7a46bae8b8fc057a06bb3cbcd2647aa6e5f232f4cccbe569e819eaf210703f2ee7a32f1f819ec92ebf43cfd4cb53a067aacb2fa0674433eef20fc0a1d5c0727920ad0698cb3bf8831bc57175b8b86018865171b13bf4a8b760b114ae15d3e79602f71b8b9d7066592cc4b2d51c9fee013c2b9b1dbde41dbdb96e8e539b4d6d08c4b23abdc9aeabf43d337a7a294ead6f7a435f2d0820a67708c4f29985584e93c53e5c33db4e7ad4f3fd6e8266118b6d9c054e1022892ec0200b2f20c3055250c20424b46841141610e1081faca0890a9648010c78546004182828020c2344ac91e4ca10534002060a96b0730421a608e2c9099c38720320626082235c099a308433d20413bca1852efc70410c379ed006175b90a2852ad800c21a4fa8c1240b4aa4d1022c308108349870e48c367ed030a30a57aa94e1051949b8c2155690a20a3c188309316640052553f8c288caca174248e18d28ac010533aa881146184ff0c209598001a509446042145f38416589174a74810417548cd8828a104b7843096b6861c61431b20823095e60918514284820c211a230821351964051a208485ce1851156782144156f50b1c6145d98119b8f180d08c3062f1890c502a0fc20420d5128c0091a96d0283183c40c5d182143174224e00d04ac71003364c4f0118601bc88218b02402100110610458c13a325025022004800800b237a7021040c6fdc35ac19178347182f78b1230b1d50608890230a1c4ebc2c7151a20509962d8c106d2144e88d6c0dcc8c2a06288ccb0b9ac584228910ad27d5139109aa065312120b6011af0ad1f52f55f469094670e37e14bdd5e0e0edeedb262b83d41d00dcdd4dc3bb323474b78f12d8c0dd175d197799d86f8d2dc8e81af628b6f4607e77d0750f214dad5dc3d7574772d3146de561d8333d1bba336424484d93165ce0699a26898214a4aa29529ba6295252a0549de8a58a0ac269fa019e0ea7699a8abcc728050cd0e20a9e24f81e30b8f96821036ce1e6a3c511385f86a24f44221ecec1bfe8e0001064e07e019ae6d97415bdf4ccacb3a79880ce132f8c7882060bc4b032844d93f786869a47a7e1c812b8bbdd3d720486aff93c23a4046ae306050a6bc8177a706fe066e50e1d3039ea9126f0ca2510477dce2652a76c4ba92f957a8fc8834b53515bea0e7983c32c301445519488baa24e97de7a50486428ab0d4aac1e69d2ef2f4b5cdf5addbb0609aa0d4ae8da48baa34020ce3a229053ec514ba957951e01da54d4199237382c3169d5065b0e0fc34bef2e716f246e4a38ba36d312bc30ee0e4b3806b2f578b34752ed91d42c2c42ad6a7b3130ee8ada7a48ce888cf50203379f2cc8c006c0cd278b267095204d75c43d88dbb8db64ba9b1ea7699aa6037924c0ef3db58b364b23d0e1f930351fd21f05f2307c081a479b2711e07789ead06d245da240622e724337d7d712f7dca97e4c48aa1e69d282b84deb198e3469ee4d01f2bdd6a84982af1d164a1c86c2c439d70f8b28ed62010408a1346141058b31f00bdc818ceded4566f85cc734092a859b0f164560881b94222001bb773b24bae013041144048188293888628c06a851a93045067674909ca1868f124e3cb104226c78c235a50a367e00854001105048610c145ce1063860001a6f545348d90196b841b9c2105e5ebadf468c1831d2639361630088aa8dac07c3242a6e3e52bac00223d2a8c2942b4fb8c153059e05f848214200b8f920810a528ed0020b071698c28d8a26661c0992460fb428c1158ad002153fc8d84182125ce1e683042b40505d7dddefbd8643f0c19491233da2da250e0ca7e047d3cf11bea66b0559871b8cb48718ba2c82330bdada97481fdec3fa7c689b4d5b59a8dac764870d84b6d10a72b86b4d3f9aae625d23f8e0e673851bd8076e3e4648017e4c7aa6f918a10ad806782a7bd31b7a93ddc7a4092ab6b798c224f7144cdd7a346263bd815c5c4eb9bc511809c0bbe378381244036caaef389b7878230a859ae8112543430fad0a1e22e12ccb60aa0527bbb99bcf0f35449a50a00f2f11f8be3bbc18ea44da87e3cbfad442bd6e0f36ad67c8105bf7a21ace3fe0da056cbdc5f6e0b075453b6cda361bd9d0369b8c3e74472d9175d8b211591732828748d8ba4b6a134e24c8bedcb259aba04b375dacc3d43a8cbd1c5b6f56bdeee88da337aed5fa76351406a857d6c119b6c43433ec9675b8f54c08609ee38e06c16edd1cebd85b8e757a41a73613f12104a10f11fdba9006c17e617f3a98e6b8ed8107ce8179c321db030f0c7390a52ec79bdee07866bb07b3305447b3d16e54d11bbdb1af69eb3483e17acd7edde596cb2dfa4cce5625bde171496f76dcf794f4887af7647aebba7533bd1fd0c1a1d74b2bf4da72fa0983a441aed7faeb35afdad02ffb5aec539205c91eb2425633a9f9ed60eaf929a12d9719bd69b9aeb7d3333c4efd25e9991da7fe78b25f198f5b56e411a2373caeab9407bde88e5f1467c78e533b1ae6d16221b69ecb258561c9fbcb9b0671b975b3cba5e8d9cdd9ddcdd773763fa083779c1ef48b1e260787a93b4c5d989fc75b6abd97cd42173dfba34140bf6eb60e7ad320f4a19bade72bb39948ce7550901dbfea77dc7cd5bae3ed85466f5e784d4b1876e8c340c1504314ca1118076e3e5754d9e231a1fe9a681a6743fd3dc94f8a2a04030ca1eb030fee7d1ee09dbb247087270111779bf478e8301cd40300bf07c001d0c3362c433d423d1eea118281a237f7525a3cc037a9a1507de8b5eed8f1da72185eaf4aadd96876b30e9e40b36922386749bfe1ebf59252ce467140373b0c7af6b64dae87deda0698ebfac0037cbf2f09faf09200bed9908008bc4daef79b4de8180d72c1f0fb466fee2f1e87e1573d0c370774d9806cc3219b89e06c2fba65b30ea65487965f37ebe096d7f4b5cd86cd81c7ebcd3a98c72b7a93d9372cba15d9696776617e73e0f196f3b8cf48e3ecb9d940729b77fa4a6f6866a71a15a337a2466fb26796d54ebaee784b8bcd0e87b29b7570f6da7aa67b3ed120d6af9b413b6ed90fe8e0ec8dea509f3da3373baeabd60e8b5a2f9c529c175eb8a340427fe1668743976ebe601bde1124f4ece67a5b8a1e510f759417435d64216e71b4a9bc18ea353da547548e66a2e6ae82a977151f2b53c6704246123f3d69f44c6e293075ea3d85caa3a1de511e4d10a7de3ece9ac1ba2c36eb601d7db3b793ece664b76e3fe91175fdba59c7b3db49349396a267745c9653af79ddf3681e9317439dbaaedb4b3c273d93ebafe7ecd2b2cf498fa867f63169a2d25bcf8f09a6baa747d4ab7d4ea434a57b4c72e81b96d76c54ae730bb5e2793114f5217d530fe90de82f33c75ca3369cfd35f198f44c966559665937d6cda1b74e511de86d263777123da2def2562deb583bb12c6aa71a92e2c041df38a80ef4fadc3d98a29ff4865e166299d9c642e8afcb4643cf6c081cce4ead107afa90cde109b9b23b4c1dce2ccca9ebbe60ae065a8f32eb308e379c23c77515470e1c386ea401d3cd1bc0d9ba90173c39cbc6183fcd7961701a9e17863e67fe7dde77fabe0e9eac65f3106c3d46d774b065854c5c499f6c1661a9c61d421cc8265327097409c2de7a48cc3a5c310cc3ac8330ac56090349c76ed5d83c57bb7a73ae57568caf2ed96cebcd1063f5586e1e1c2096f2946ebdd2ad28cebc6c1d0f79e88dc3e145697733946cae5887481109f47607e54e02d75f36a77a11ec6c7e58a2a09b7530c85dd2af3e02e70acab9582ebda65f9d63a9aee6c15574738cd3751774bdbaa4aa5ebaea8501e1f068644487d2ddcd40a4bb4b77f59dc4fd70af1773d8a7b528ce54bd9a301691e8194acfa9373b4aaaf5f056d1a5ae34511f2c2f10c8367c5dd7755df7cbaa79d3a2f48d06b95e3fad677f7934a12bf368b2fb2e8cb336cd7357e6d45ff5eed7ed229c0fd0ab5bd3a00b531dbb75994783c38be95399e96e819e85bc501407f49ceb4ed071788ed7a5517083eebc18f68bde60b24a13ae6cc3b5d65a71753937db1d834bde316ab23e6dd6b999187667b3c3f512b3380d636f8a43551dbbcd6118766140cfc12e1d845d3a865dc2dca96aaf7a41bf405d84f361ddd9fc822d795f3dca831b8db348eb5c459c8e935a9ef862098ce106e58b1560284ea4c0cd078d3408801b949e34308cd2334b26138e7c61055fe1c614dcdcc0ed8a2d2c81a1b4c106a52ec907bfcb366f9ef6b252b2d7f529a56cc97cf6d0a74ff466122d990f3da3d305f175476f8abcd834a1def406ead304a2398424096330401a530f81067470c31805e2a687f07477678fae4f4fa669a26ea8537a23fdba3948d729fb82a8190ec159ba9089a7c3283d23a567b2bfc3295bf44cf597211508067ebfaa9a8659484a93084b78ba33649fbcf7362d2b852e85a63e0253d47df262de33f4c1d913d11c2c8a231f7a6b986a783ae509d11beac21eb5278fc61979e294344facdd3c8fe6f54c3cf85d4a2bcbb2ec56abb2ccb28ec0399455f5d46b9a16e17e640f895eafe8e60e655928cb2ea53443a76cae588748114a3a4d325dba98a249846c4e7c113cd9fc30951d628c7ae8b61e611fd29892b2d029e9589eae83f5989bf2606c9aa61b250bcbb11e1d9683f588859e9117f33e854e5d88431726bb74ecf5b0bc1e7a7bf003427dfa143a4de27e4c0f5da961cf94e7a238f4d3a5546a262fe69de52e375797b760d45fa8b74c8a433d2774b3935428147ac1de4c42a1bbdc66126ab92cb7995014a37cb0b432cbb2ac2c62773a4de27cd0d73c9105bd5af8ca4a97924227d49b1ee81d3a7995824e26e804bf67d89561372794b122dc8fec30765d37f4e97908d57e6e4ee8d827e966e72810ec353b8cb3364775b0b25f53e8d8cd106717c6ba749adf13fc1edf6b8dd3e9100a5fcf43289cbd7aee24587ac1d7b390978c733d27bbd8291a64e28b0d0ca3e0971d64618fb29b8750787a757327c134fbcb5e76b39077dd8c5de9469221dbf0348542a187a62a293729e5c1f4209b7530e84d6f40529a8c4816a7e16049d7fa740983d3b07461b2e748a79eddd946d5c1218bbd519cd0cd8e358c595a84f3415f279b5f5c124c2f9b3b099e3a49d3349be98da23e499af9e9b408f7c3e1e94d7970a3f4c2698fcc07719b799b5897d62beb4d71986a54eaf0d365531c1c8652f50450032965bb7731c61829f762aca22ce405578ff4267e9aa6a97970fcd4144817e15cf3e0f6e924ce8773af6c17e17cb84f3f38275987a727d92c44273a490bef359d1bea3ad8d9e9ef392ae74857c8c4efaf0cd92612e703d35c821a52118786e3711a8e17a67a4ebcf4eace362a0c9078294ed7c1cfe63904bb53b68a3647ca421d6c854c0cef44e27cb83f4bb9c7856c734eda703f4b9a539ad4e1214ce26ea63b0a44ba5b76dab61088ea0e2d6be308bef1334195ee7a7a6c9461650a2320999246196054fdf923031b3ca0e1149bfb994271f3f9a9c239d7ef4a19694008a5e98a922b3c57e674f6ca138a55615996943f55ae6c019ace42f97181b35798502788de8040a05ab59862594ca0a61f1908414dd38f0d3084104ab08a7e9e8094d4ed4d3530a30d49080d32518616128c54486dddfa22aa2258458967024b90ac000565d860084b14e10a981ab518040a52550f265970620d2bd0606206577c3149664041a9c0005aa82184295819e30c2bd85056f89801e5c2cdc78c242825a658092336339060899bcf9537ceb841110de50c154081822b3f3f3f434c5500518320a49f36a0244915b6335690a4a93076ce50429226a9569185733db5c6cf4f1540d4e0a70d21e60aaa304118672881a720cfb8019433547006142f518b2358c02f50a060060d647b34ed093000420655b842250757d8e45805ceb52dd02036c2016db8a0093692f840081ed84c5494318432a898709be2a78d1a5841096e3e558802f6816770d581cb10b07caebd77bd708165cfb783df7b0826b8070a7f0062f9c828034f32dec0d91018a6df7cca88014c5f11a6e6b396152958c6d9b66ad64571dbe653c61358a75dff604e494d9b260d4301e9f4f4128197ae6303c303fdd57ae497f651c56978d46218b5185c9cef2175cc1ef33a1d3ab09b5ea2f5ea71662113576f33aaf52aa7bab5425ba922ade3e0f34246404e97da34fdb519f74c1d4a97d474f8a09b7a4e3a4c364acdd570e9530e0d88506772b0097933dba8efb04738c3341c2100e183f0d1be403e70ee857a24f60cb567e8b78ec94143cda3295270ee81fbc5e5781d40900e37286355591964ac0c811f6e54206982b30ca6262b26a8a47e8fef3d6a7a4f928216ba50473f5c10c38d27b4c1c516a468a10a3680b0c6136a30c9821269b4000b5220020d291c39a38d1f34cca8c2952a6578414612ae708515a4a8020fc660428c195041c914a2608495280421052e44210d285ca14a14c2f8e209539c00058c2134a1074c68e28b1a507981175048411750d8e1e28d2dd45842194ab0a24513a628210b2324c1078b28a4e8000936384212465841942a48a054294111d8b8c20c2ba8508513a8d8620a24f85041841f0cc189109648218320b000086124f94118403cd9421467f8608c1e840145173cc06207563c1104273b7002073ae8698244134f2822074f3801136ee0000b4cacb0040a37a062832c9628420d844003286690831e1a28e1021938812706012d6f3d032fcbbb25f48be5e6ec97f4169b43bfde10f57d09e8135ec8c42d7794e5fa70037fd372095bec4b8f5aa8ccf2eb6990811d17b8f960e188abd64bccb6b4b4b45c1897e7b4fcdda5e5ef2db7e5eff33a58b2d9650f852e129d85e52d36c35f77f406e9188b8d5864270ed98a332bc2d042ac816eeb98ab45372facd2a33e182f0535474845be2878e20ca938c14dbdf7eef786e145f85de9dd494df474d8e112055a0c73fa89459c0e852c2d907d97e319517353c1ee4da5c1e899eaee5da567acc8bb37193d73ddbd7fa048c30d9c053770f341c30a4c036e3e59b0023f24aac3d92d51abcfd782fa767ae4289d2e9b756ee2df3b8852d00df092976c863de66425bb1fec787ae4de11d58db012b7f3687e6881049f11092681a5e711764ab054c1bff9c30e96ee1c0f96ee33e2de6ef4c89d05d53991fbd4e0cc8d0423bde177079d53d2a3062fddec92e8c1ed1d511dcecde755598215b2854c2cfd398a8290a22005a7d75517d04a45a5470ddb565424f81eb4817453ecbf17abea55f054c34b6f0bffecd44fea4f1036b4dd97fe5ada426adbfddab586fd20ecee43d8d26b5a42787ba0a4ee7e77a77ddfa369064dbd3fbba384ef2ea11e257a03a725d4a57bf4bdc989ba45a64d13e9d21d8412861488bbe49c831488bb64e125fc5e950c8e8167c00dca1b4eb0f4d6234327b82fdd27e892c0d12991373f29b80fe58df092e2547710c286e12b2ace5af4e6dd971eb518ebcb4bf567e91b1b2e4a84efa5b171737d4e3ae78674bb9c93d23dbe9b3b3a179d7cef1ebef7e0045f59b139d48be067f3c3d09dc2c7473fa4317441e26117f214fc7ba33ac853cfe68a0aa6342dcf11637f6fb1edc5f8dc697aefd21c79ea8fca539f9ecf9c3eaf022fa6ff28789f75eed3e943a2ece61720f0efefc5575bb81feff14e8f0a7daea8e0a9529cecef82b2e939e23ae5c574882574511cf89c78b35318e37b4a8cef2cf4afe7a10bdfb36a074b296167db84a594d251f4356dab2d9c8f57d53c6c7a9cd5e6096f4f813ceda552c1a0d7741ff23c9a087962853cb89de5a8bb28a57573e0e9a525dd2ca459c9f1be16237d518789ca78ea4a78ebc2509ffec3cb0bce31bf234df37a7e78342e4ac7dbd8887fcd0a96a7bf268a4ec1d98d81fb205b7b9a15b713e5dd1905b7b42a3b29ca360c2184909a6ed585f3f12eaaba703f1c7e56b0bbf41a6c4d054327a2e6b1866c3d76a040ab417ab30253a0c5e0feec0e3d72cdfd30240535b7283fb85ff370a840cf34ee6f000a99f2f15487fb411bad474b5d9270a341266c553811ead8f4146fa54f36de3c714b97f0e3a9f2dd09bf705530fc4352a94bcf6ee73b505ef619517fe819f7e60686900aceee155173f3c10dc2394518de490fb41ebd993e756ee825c862d874ec4ecf6e5d07579b5d6e5632cce678436d1834ef7ed9dc03cf37e76c774a2a7ae3a6a98af1456aa2e00461efb418da5d156bf259814fec9925d5a54fc911511b4ebb01be35d134b16b97dad4e45ba3ac685d5ede25d523bd99ac25d5e327da626b56758bbcdcd09f9ae6d0546c12a62810ea4d755314c8f4beed949d1e5b6c537753ef1c5b6aaa08a0099a87d33a4cdf7bf47a8f3aa5f35def149d77484f13a5976eba43fa4eb34b22f362e09b5a929ea13793cc835236d0a5bcae794da704bf5b36c7cd37795d9fd3b2fe2e7973ac3becf3fa93d3cd0cbb19e85ed6ddb39039dd792f9947f36acef9e9ddedb81fd3dfa5997a5b8be280dc2b10c5a653198b0f746aa264a814d775b97ba75bd6ed381fd4a5a5af794dc9f93cf1bc59c89c7a3aacf72fc68a57e64cb79e85387a9917034f5d38d773aa0bfa24531d56f312c93ce852fa8bde50cbb2ac693a24d37dda86a54b424defbd5f7717b5e6ad296f86489c0f2a5ec925c18d4af385986091520f96fe92f4108fd3387e8ab6df10957afd04ba90092328de09994831d68322e592c49e17233d438c3d2635c6367790cc243d43bdf63cc9b2d51d4ff7cea3793c2c8f14c330ecb465184669c5421389fb81bdc690455fd315c32a86c55b41f1a0b9130f9a4a70aeaacdb15e04470c048a36435c51af150866a057f1395ab9b1950457315e10e87908156f05ba39f4a04b57e5406f1d14ab14a5c77aea460a7af5781e0d74e1c1528c8fb17eeeb81ff1f5825ef3aae79904837e5d2c8f3727de620175cb5de2ab17ea2ea07a592ea95aeb4bf55652af4b8b12ea66962a4a81a584312c62ccaa6e7c4def381fd67cc84ecf2ce8d7152d494994a674a8e429c1d2b14b62b5d6ab3e5f48a89497ba3f37279e1ef49b9db3402020f4f1d861ad7754078a5d0a9938fec22e0c3de8567e3d58e27931d2a57a4b3e879edd0e06c9672133430c7aa438f23958263364322dec11561fbad9ed60eb8e07bb84dd2c64e2faeb929c4840a04ff40624a38469b513a6b6e118638498d22a36bd999711546b3d4ec3f5c260cfa9a75e2f75ecd57530c84af968f3c4f158b539e288033abd6e861389f311b1357770743b31568f317e22713f6612584d14455d27899c8e349cf41cbf8724d7dc7cda4847f6edd1a33f216ac58d8a2439c06da7f63b3c0db8c9b41733c2ef513b94692a92244539bb416f13d4a0be30b8674f6b5a6d49495114451d5287a72efcf5771ddc76deb24ea939c9b7b55984658fe45451a92a4ae9711aa617e67a0e3d754afdb2b959c9935a7ac3bc7ccdabba703ee0084f4e49a37a724948d30a787cd830829b0f1a56708e3e5838026a3d1a91ebedc5bc60577be49c4d7c31ae69bbec345d98860399faa8440bd8c93335ec98a219910000004315002030140c8885c3c1702045613f14800d95ae50643e13469218053110c3300883300003020000000000036044003eaad01da8dbfb18800c46d3e03ecee1fecb271c7330d90780f7e199e6863dbe3e86d2a9c5f2dc501160f14d2b224f282644d4fc403d7087b59d36e5d20f5dc89a848367ed9d6bab737d0f7e952a763dfdd4e31809ee345a4a03b267bd3e7074ddd5b2679714da955de4d6117e1c4acd3be43caf6a45eadbde87ac828841994e204c80749957d5be72b0307b91e90e27cc1d849bb548465301ce2a17f8a1b48f0afbeb612ddb50166513a3d4f7ac6cb9f4164955a17fb20db7d32c8e995241c4f4181c032fd8f5468e7511b4ea1958c059a7444ca364f7c9e26287dce5ad4c5178c7a2eb4b1cab0f73535cddb0b6a75b71f15a0611c1437d4401a2f4aba163d50de8072571f2e34de52189ea83c20814413bae83c4dc090e7a315824620413a5ec09c97f338b59a72f0c940ad7c52de26d9e009aef67424b7c1e45438024f12f40f069d76881b90302f9ed84b320e095b1a8ac14c3e7ac571bf650d9fe2e17c7b3570156add5b3bd32b196e8b1d9196a7c297733a8d91f2902ac5573f650ebdd82b526553c1cae4893b2b7eeb298c2e3ecc0697e16c2cb02af482a0c34d54dc8cdfa97911328f8f19b4f79c6fef3c0028b218d1257bb8d3417e4536ad98c14b41768e5419499c1bdc945f09e5353f7157c08ba61baaf2e4fbc507b8d51982a0058a9ecc358c123828561ed0d84a467edcee1ad7ced3e68aa253897f85b663ae863657c0a3086f3166af20fc4e6de9eef13e5f2d4210f3324448fd549c3d337696dc4630fb6ac07c4aad67d5dddd9121b8024b0cdc29843728ef176a2aed0c167206f858b38a92916496520181cd311791e1e4640b9a04d3d7601bc2407eb8fab9d4907d39d3e6421b8a9c000cd165dccc7131c90d2c26f70823b8d8178284fcd3dc0aa70a401abc58d81692f2cc2bde632d9458724ede2c3f46ab690d474d7ebc829dac7f5ccbac2e7496321bb1f969e77e68121429e682c4145e5f5dc15ed1119c77b805406f1aee009769de4c98cd0d4cb739d922a263f9433914270c91a5dc5dd590dd92cec10ad19bc468b1da37b40019ae09fe4d5238b83cbff75ea56bc37edd0d9e375ccb9efee149b625032235542508734901d5b886d54bf16dafef173491ed3ec4ffb37f5eb303769040422736725e0a70bb507a38905a7102c6e7a78f83f22b6433c6d48432572ad76eca7c40da1722b9dba16a80e0f3b982a90884c1137354fc020b8314abdad577af3ec7b074a1eea8cd743c9c414e8b7ce33f722e9aa33325567c8110f0ba178347a36042c24708c53cfeb0175a684688b867b84869bc773ea4cf4de80eb081e70327f1eccd4e16f3723e42ee2d39453caa5e07467ce0fea244aedb4958b09618b0c48b92c92bc92df52bcde8a5ad407b9cfbed9170b075bcacac0218d4fe02463ff79475ee8ef08ba223e940cb40ed2e7f48f426f0f65e8175b0d2fbdaf1c7afaaf151725f36c3e2b71ae8e056c8c3d0485427b1a46f7ebf646b6daafbfb322c21e906bde61f694fc7ccfc19f676b7d48573b77010573348259bf83f5a50c306455e6862f6ede120931755e3a644434f191d94c26054b01fb4dc8161a9620cd04eed651fa1d8b35062ae91131f3cc300862733f5e5f173bd24a45ebe421489e7fa391262154a8c11fa19b7fc26d9ac1217f0060e0d4708ba406af2c6be2aa83882e110c77b83f6af47b36ae6b02a37347550dd4d7ba3c2f845a394e161a8ff949e7bd447d082d62fc90147e733c6963321d585257929b5305a08002e4839000c4150f5f93390e0cc38b4714cb9a21a02b9e4e303e1c664e5831518b66ba84a349b08bf4be3e197776f3cc034a37329d71cb2ce30df123fdaba34999d626b40d500e5c90da954be0f1b5d630e1642e8f76c04bbb79896f298489e35ad3528bc3db35bc86d04edf582e559bb10f556913a856600241a39df3f5c658e3bdbb35b22e8b9b63edf47223214570fe949b68dcaaa7ddc23195786d9b8df186b64b9b449635b7e7e7114a7d04075b3b659e48f9ba65443f9219e2d5980bf3caa504377ea43d239b1646cda01855aa4458536c613ef0aac84253e8d891b65633b828d7964fa67b42cd88bf0c1c4a9884c0d2b806b853e7bbfdff3fff67c78f4624cc8e85268b8ba266bce992100e3b2f6623073834a7f4fc066dc407b60151161728a99df2bcf015fa2e70a9fafb45ef18c89680e6aa89458a697a4ce23c6f99778fdac2c700e17aa4e0dd75a1bb478dc72c05b3f6e7d423e9a25a2e2dfe8d939ff0a9dc13c637c630cc2bf3e4e01b1563da986232afe52eb5a4806fcac0caf98d60042b9c9bc8a8ca20d31975e06f4f1be2ced24720b53eac467137773288f2a404cceb675256ba1bf3218fcb3d031edee2599529ac55407148058541f2b996e3c9ad81497908f1dae31c68b7cd9c2de783240ce5c04ad4023a44117281bf817de70db0ca17981bae0ff079837d58b5a850ecdf8a19bb7895bce4c6bcda0e292193ef9a5400ac139ccfa629de1827521257d0e029c2f14f5c592e482b2efe28bb418315ba90c4ded229470db4c36f456161bddba0a155eceb38a10c42d1f589adf3b9673a2c21672bad2a3917d6b8a1a9484896a271d586ca13515178b8c1d0a36af96055dbc91785689f7a9acbbe6a71b8ccb92be500237b63ac5c06efdccc709276e186e9380dd4b6c56df605e1361a88deae649480976ebec0c52cceb5f803a37a24cf6cf487fe6b4ae999b5da1a4e151723e5d215950550d0745554a7ef697b074c02d4071ef9a827a99e754a015c389b69a6a5a307ff79d60859cecd9fb67a435c14d97553109778d07b6dd2de1f1855586ccffe41f3f5800fa362949840cee542771a1acad986fc92aa7006f0036fd1d3da3bad8d2aaf05c88efa54a2aeba73d75dba9595d4ad41dff762c5923daee02dcc43f795375ce5d44c11006279b1e94cd9c3c5a44f91c6c37253dd6431c44ff89715dc76971bd945460b9edaf4673921a11e1b62702f886320fed40d52f4e9f302ca494ddcf238480e7a302d97bc20695a4641fedd6bb672d08c4e4bac23884f891dfd85ac1b95a23d81e07c332a6bb32172e0d30fb551bb8301e2884520d908d3df00a94f3cba4546473985dce71bf9f914453fee285d4e06e9c861f4c9b5f74d2b7d61d3793ad9c257356350f6057c47c519250ddb0ab930f2f754f7f5a2bbc6fb2dc86f972648b70befa660be30c336b8db4ebb6dc744a093a42d67c635f07928d0ba0ca142cb1f05698c69e0c19ec6caef68eaec01e1b85c88db05d18e5529b9ada5474d089dbc97ccb34c58389250d1f06656f36fc1f8e04fe16fa6513f14052d84fc2018169042ae6dbe10ec8e7d82c72e289fb20f19433c01f753d1154fb86b565bd16bdfcbc6fe8ee6b43dae33f6c585f30b68794d58c667ef80014b3bc05db5fb2f8f896e0b61229a03042893bfe458dad48e91ed68da7045326a7bb80c809ee709a989656beac98d7d4379861bc4fa9212488e92c89ea66b9f848653d877d65930a99ac105fd69c97cbc5ba128bfd54b3d2c66447bddfa2ccb02d3b3ca236a4bf4c4d9421827a33a93b6fa0896ed09d6e6062520022bf6c0b26b2d1d481fece631ccc344f09b91b43942704df8081b5cdc3f70e4f0829e4c32988470c53a2974f447bf9fc571d2e05a0897bdb64a3a18aa2f68bfd9f08d267c0276af87dae528075b25c4a3d60e6a94cd662d506bd6fa9067cd37bd3b25780c34d6c99e4359d4f4a3cc45d358d4b4b6b0b4732ca24df98d04b22c2736825f041199b59565adb929b57bd0b17b40ef78633ae1405fbf1e7e9ea6d3b4a5e0ed9ee27d7f7d7cc1d6d3e8da115975ee6e99190599149b1a52856ad292a404764defea1cb200eea7e1f0abedd70d1e1e428d665aa7b8b46f94018e33aa3842372961b11c1b89b3dc45a74c4c541cdc5065243ae7a077727e9f848905e6844bfc40ab7924c3d9dcba191e61f8b30a259c9c3da0913e3d1949d9dc06cf10fba293a50435069bae8b6397d701cfbda4251161f36d4c89c645e258e56da7fa5403988cba54a7692ae30d7ce1ddb76c31e0ad3b8b8417710310be44f4a6ffa7bc5b219e3112be7abbe7a7bc1b24caad1849aefc7014cd21af064879041589156903614d138790783edb6ed821de26121e180cd79a56080dd0494d731ee00a7414745133ca31b8421ae5e8736960ed2e4ac2509e2ffaaec1d89b8a16baaec343152508ef594b52125f92e48147071b845282d3ba55cd230983307f4fc51e7d04ccdd71e525f841b81178826ac374c0005c9b4eb44246063a1c8095086a7f5319a8ff7e7f2415fefd56e7529ca8b776563e840682d8944a3cd2ff53d4f236219eb8ea196906cbac7a137b1d424378940cd54185694d8ffd92ea227ac0d846a70eb99d99cf5753f8581d91edeaf18a6f82a75d6c19153a0b03bc3cbe94426e6f243defcdfcc9a7d42a5306a46e268d517e9b991f3e995aaa0014dfa662cd8b062f7f5e016ee5d6fe5daa50ba967dba03705bd2276f60796509196365209a769a36251760aa6df393958a3afc710a796d5ccf726bbc0f7dcadf1612d045261c42548de78756a4fc511b5ac391c15df73c372b432ea1be9e7dce2df7b08f5d664114896652a82b080cadeddbdedfc807aae693f062c03677a0101180127000ab68bd2edf9ab289b4209d0c05360a40dd771a8c08231018b6cfcf860059b5bd1ae838038274ea0fd9898bf9ed33101b82e87b6cdcef350416a206e0125a98fc133e21f2c695b4dbc1538cb451b89fddfc92634aea47b13e88827526e76c745ae910d455a1f5236d1cb9e5f430ba3e4ac163022cbfde98d645ef5cbbc7cbd442a6331723a137747d48d4c372b57a598d0f1ebfdcd31b9009653a5a08c473c839e902ebe4638d180327cc709be49465b8e3f341de98bac01b1da59b2ca929c16172966b34abcf47e3b011133836041d7973487a21e5911f650636ba9ca2cfc238d6303602ab6ac13b964e95e91bf6e0d996c3dddc75cd63da8eff53c84cf4cd767bc381a3f22834e6e3948725160869d822bb401f2c6f292e3ef8213c62b50bb77b85a73cc29765ec2e52d809f393502a8fc0acf1566aeee36a1d0c95b5d1d423380e3338c747defe09bb64d17eb174de7cf551d5132092ba31a8b459a63c88ce139ad020f61f76d89d63aa2f8e0d1a36ae1a32a9ecf362f3615425cd8d60023c9294a68444ae81203c26ebbfbc83611b3ed1a654843054e58001a323917e430f3fa806465f566e05ea38bf522bb20199ba9e6590e78fa7a92d2b211889a5861abcb89aee2dec9dc0c9b33288ccd459deb6cc5f6f31c420e2f11515daa88170bfaf13cc8a85904b2f48141eb9c1e545be0b70f9e289757fb20d93e40fd6a10ff2d9c9c4dffbc5b483b44fe58b46a65189a5334b23f6e0ce369ea202e0d529c1a9bba826a0e9df832f4436f91c3f3445c08e25defa12cc550ae4c2e36392be4faa341b516da8320034be53abff58308f1378c03034fd9c7d553d62cdc2e911701da88c75a8022c18d0bed30b64823c197f5f1424c7a938962037ba71395625e24f2d78d7c8c99152b29e6c6fe21624496b3f7ed02c046604969392aa84dd5c49dd250f6384aebfa022be4533716bceaf06dfdc4b2ced124a110a2ab3e9e4facca1a765ad4626a42f0673ef1d15336757ff3b26bfc5181e21d89e117edd432e464b255c8bc5589875d72df767f2f95d95584e5f872dd0a159f181608a906a4000ee9d2f9014c645478db0cff18040014d2fa96c30eaecc31c52f7007564e643711133e52ca7f2fe92029e29798bc0f4cf28a90fc9a269f69357f66dd4482b5e77391d0867b9656b1beb03d64a59c904cf52138fceda9b86456c10ef4c330440ba47452e1ff104e03eaa0be6fcfe3c21655e17a9d1447ed3384b84239c6584794abfa7ce271b75f44f1ec20f9df202a0927f0e983c94a47e4ba923588241652f0aeda9642e588648f1debe8b833a012887a16649a18ff28f5b6799b102500b31d6e0606a1146dda597b6435111a89bead3521d3a608cb9b8c241c406978583b17241870457620cb373dac65b0216884d0a0a9915a3801ce5c339bcddf7f9752653c42373954c078b21691b8de52c1cb96f0b8b31d21db29754f3cf5d6bdfdbb2c24ecb606a607c6f5b55bd61a25f12173334edb151256b4006764d9ede1ca1ae24c94953d99c5b556471f1ffe1890b3d3d77b406c8f46da0cece2d20d8826765424c546dc80b72b67984db7cec54bce35d64474505540b2f87031c55a1e2c26078774874e2acd6a3b3e5f5159332244909ef3b8f3a0e9537228a378ff8577e8824708c6adeda16648210fdc1b3d472f9db8ebcb529ae98308cc77552c909d85c1b16df1f50b27e97178bf04c8aed4667ee63f89846f6fea1b8781c4797ee9d0c5adb6049720cc5445513179643d067d483c5d7f8955a1d2f9c567b1d478c52dc52cad798b42f2e224ef00e230daf204c8ed5cea785907d64637892128c01054343b77183ef8035ff72d7e94478d1c735bfcf09a7ee9f2287cbb530dd5844aec262cba36b73a169a14f6313e9da7e56d2eb24d231745691cc16d86494aefb2bc15016c126dbbae528edc051274e091930c6b4438673972ab82b70df1a181855ce20a691168033e9627745b49685d73c701e4a5b31e61d848cb8d159de8160fc36b172d2f58f5e78013c9f284e238c6737d16054984160a04ac9825f740e553a921accc52fb766333f456bfa201747efbae18326b4aff93f8a8b764aa83430f6c7d129be840cd19a2026b16b4586dd4459788134cc07c17de3f74952404757b097d7b0cc4e79e910500862e11ad3883777c3a6248d03b051669992c6212ee946a1384bcf97ae0498ea02938742e617dd51333b7403269bd9a8eaf97bf40d72fc4cc83d62190d40285e2c5d4c7ce3ea96b72cd7fdea1a5a15ea2db59ad6a8c2ffcc4b2d48b11f0a6eadad3033ff8481a1f7b2f0bfa3158e9ce61e8e08ad508b9776d4d70a073c80540f2a53fe49b77e36a8679c08f2d99c1594387b9805501387a66fe9cc1223fdbcb90bc4f51fe48c337dea83f286c57b7973aa58b5f91c08c3292cd0a58735bed86267326344d07641c0163660359e944bc8be53b1502b6610d773ed9d2f4d988e89617812eface416e7e8ca0580037bdf290ef0d998ea5626f6330b798e475fd7a6d626d331ddd3b495678815b1dd07308a3f22055d0579cb567dd633fee68bbb39d76c6f9c8ba5d414c4c36c678d7e9f6b8f9c88876a52862cee565156396a4fe60756647393b96c13f839587a06723451326d3a222096083441b561f7db2d65946f753bf3322ee7776d077ac9d1d8a158d43c1a87f1c0ee517d825af464abdd1b9377a51e5ba985a6b72b889f486ba422e1e76fcfe91f1ef547aa0d4c8b1448e808b563e9c98b314e23bb7863cc5b4033d3425e9c41528cadbf72309960135cd8f83088c3ca9fee8527389c0670a8be84d16e1692656b096c6fdce2d8a227ac6059b01190c7a6e4d206f7bc181e41af46ed497644c36039e9f38f6e0914c2abceac004c49cd89efc01f79a04d61139b1d7bb32e87f938f5406b96b75aab5861956641b23b99964ba393260b94c694c601b922698c45e2065980994043502c28d827a4458d485ddc9f5edb5fd90dc696e3e3db18956b75648351aac8b58517ce21c71a98166e4706d4abb34d5c161251488e1ee2f742df8cee45d5ed9eaa413c8fe8a9aeb88402375bcd5ed9ff024849d66d392775035f0d2cdad157a62d34dd1a47ab49bcc16f2b22783b650329968f82d3721bf4608698eb61ea487c929c29e3e4217a96c1034575fb6839fece52113ffea924fa501324f1a8e4f8753b64cc1fadb2ee432428a75b79add51d28874f649f889fa6946bb8ce4dd6130e165666c03ecaa59f7daac789b62b99cfcfcc32143a379df41908b66a58b424104be34d9682f39d5408cc4e3f8f2136588b1aca5767688e8919c692a00d6ce27f3be76a608ea264d733ec98995507b945e547952b00b70b9fc96c4715bd9609be99d78f7ea0e4e74435b35fb8c40b7552afa44ea83ab224c97cec494d26c1ac2bba7d7e2e1ea60faac7e0f3de1c5547c75d0acce891e77d6ffea89c176070a624468d7e8e572d36485ba911cb4889475805d3dbfe0fe81b330e0499f20e6ed6c0e184ea41e90750ce45810a33f4e43d9d11c368a9e4595b8740ff7c1367f8f488a276ded3f337b665a934ed2f85e9967d8e7bbca7b7ced491cb884db90d0acb47eee819b0bb14435455e0bd96c4cb15becfad89dbf6db2d816fae270adb2f5d6ca222bf1e04fd4e1f9e4fab4eb9bdab20a0eb8ba4ac8bbdcd68e3eedf8a0a365ce31ad914a1783bfde3ea4421f61ca212fae856f8f6085f3da619d6043b984103c504302a640ffddd7812f35eee8a658b6d232f40fe3845562caba0fa665d3d72e5dd3996d7a2ae249fb02bab38055c16110a2dae8ea5f48644930cca2aaac0ab16c0adcc84394554436e4546fc18f27e30b546a0bbb68ec51e1ef40ccd361cf7fc8d628fe0183d0e061201833eb9da7c6f07544ef7b22088add3d2caf29689e64036b82fec115faeb633f6856cf86d1a4122b4d6a253682589db01eb3f748916c0c6291f3be317fc0d0e483b2726fd565dc95c40ec4c5f412f0c4900f95f1a0edfd617bf8cccdfafd88686f2c60964e3fd4f45a814fdff7b4b1ed07f919e3a24a21343da0fcddaff5e2699b37f03e75ee41c5460aa01631224cb5216d2521852fb0f89e13269b8f543bb1cfd47ba9ebe6da53704055a5e0e1be72a3bc663afbf4c89aedb1afa0fc15d71323939cf7b02c745bf4ac60080221f8874e35bfdc8756ae4839a10a28184b14e86d224bb15f93af040cc8eb1627a569fe62a7ffd692bcafede399440e54e14f87ee6c02721788769a40a35ce9e4db570556cc6655f69ad07bdcb1564ef403f3fa501de73697a44d1de3589e00faa9ac5855c7ad4770b9c55f4c088ce95c5e15b6b2ea145f1dba2325f2c4678f6382901b8fc4287ebb67d42e9b43db7c6e4bd9e046fc9c43b273602e67b53784c32c75bb346ca534d27b683aab40ecd2d14a4876abf6948e63523174c98555c0f75778c5cc277d27bd3e961653fbcfbc8d02f2d5b5b10b5b8221aa04e2d36b1b962d56e0dd7993e1c621bba5ff77e3121f576a90457f66b8df6c005caf886dd75b2d32b66981090d7c6784cb1c160700adfbbbb20009e91658473d5b45d3525283a28f1260b3934bf8caee32c0ce35aee4c160269dfe7feb53de86fe731971ed5db083057ae9a0d63db225492c110be6b5342088c30022b8ee1595865d8406f716ace64442d0a4578f1c220536fa3bb43f64c82cb376b0e2e303b4bc79e3c74d4f5213b1e3020d76033cbe97196cd996d1c32231e9b66b2169493e59c6dc99a31681e5cacc9406f49d0f358f37a1ead97d63c00b79da72f53954f5a587acc9cc19ae506dedf44a111fc7a8c795271561f623842511174fc411d674d7b61cc95d3e32d635b2e21b1210929b9a13c563bb4c2e2fbaf2f46b3a6987c602770cc32fcaedc80443ab96f9bad9a650e040a2ea514763f9e7d046cc7ebb896c20fe0e1ebdd60cf348bca0329ce4dc800632a0e3187c07d148b2b98c0d8bef9063cd1dfe6d8432422987e9e10767b018356ee8d3864b82d680da4bd3dc06e3b994e6edf720bbd97ebd32cab060194a7bda25d898bec6f3dfddcb34568960ab4c069c05e8b1fb7bc66f148803226659e464d87c3d015f0a2d819bff471b143455907f36d957406103d880f310e35b98a8e35c92f79d4dd814c8472ce4992c68d2ad9cdb5f047596e35ce7c1ec90a45906c04af42adb4095225a615d712154b6b4168d2fde43d7822e540fe00c7c61de6ca15d6aaa9a0e437d45619a0cbc360eb15fbbe7f3481b9c5524fb85337af9b96adb136a57695782f07da2e26f1919642b7a7cb44830619a5aa083f48e9e0ec1475d4af017cda58927f5afe7670e348faac906ce22912191650ea2a7292eaf4f40e7ec6242a3bdd43387b05d3a172239c01f77541af12a7baf073e7fd1a0c3d631fad1f2d6dea439d48fb58d230108b94315662524544ef86711b62bf9ac834cbf4935b0d75e62800062251f587bcb3d5c262d5d4358ae932e6507f2b9b9725500004d2433446b2ceebac4eabb36197a41ce499695294e4e12acbd667af16ba17fce60ce88cd6eb69a74af18f9779079b3960e33aae8342ac8249da93f4ec92d9f7453138f6a710677b60897d938227db8c2041c71f9bae3e30339cf42e7b501a7a70e17b87fe4fcc036c633f0b98f648f8a7a28a30ae17c1a2a58f70c5a4c08cb41401a372446ae25e4bd8dbcf0f8548774bf49b47e0d67a464c55efabd12405d0d7dc88039b17dcdccce6dd508b53cd170c8c92e0d42536e9ab3e253a5f71568601f6fba81a7ed1ec290275c9a1f73f7025bba780ff51aa605e30ee94b0084597da5a2be89b0a13ea1a2482041628ba6c7adb542c4fbcd96428508ec5bab1e37400fcb62bb049e09e01a8962234d79f562ad1157a3674e4f8d62c023d2517650f39ad859744461789ae7e9fe6fdbee924a475a4a46ec4f84a36fe97d3576f889617cc716f83c623905346ff2be78733c608c0f9315a97ac653337f087c732a8e42264f898c4280005c9403b4496ba616a929058973c7311b0a811ee30962a31360e91b22cc7bb6b80780ad747d45727336430ffdba503e875a5f84a1dd838701cc84e266bef1372b8f439d642120cf679002edf8bce548726b20614cd47d2f51b99e66d8dfe5b0a81cbed408ec8049bce8dd48cb874e72dfb645243f0854a0b9498c0d4403441b239c63ba076bce780c6617adfbb708b786f33b1dac715f944ffdfe1acca5073ce2aa0abff3fa2dbb4123377fa053d1982a9fee6326e4016bf7bbffddef411bb7f93912036109cfc6e46d5281db71b321388f9402e2ec626ad36ed75ec31d2547baf6913280a1a2ac2645a7cc088d20f51c484465e6046e94384028f2dfe671cd0e7c965ea7a3ace3a8b9109e9063eb1c4e94eced4d9ba20fdc1820c019de8ea9b27721f42fbbf03e1e08d213b2c7375aee144a3f64ab370fe73712264a96cedcc3f750755f327a7426183503ed3e434dd06cc6631f910a0b9d18ade42f3300176bceec92937cae1ce0051c199d3c920be270038d187af0aa1bfdf7f29423de2d3ceeff71102a9080e8ae9e28122474bf95ed8a832f3b0dd026906b352f134b076d2cfb4023621aa7e95ddc7a75552157eb934ae183a53415f2a040bec6dcfca885e998303460455fa229112d3993ba9f9316bb1059cd4f5426afd6349e979c159002c40a31223c4dccb8722920d86f1cf9027700675be6f08e992246c31e735891cae0a805300dad6570e4ee0a06b010eec5cbedcd4e2e858d64036294873a0ebc112b0842fa5ea457ec533f4183a0f4ace1a2326a965f5349c606d495a4ccbdcbb49f83f4141fac1101d2b2f0f89d0f5d474f7428a304c4f6027dc4a2753ae2da9d6f5881688c91cc0c54165f8d7697fc6e93f7db9527769547a930f54da3d2794de163017740e2c6d23bdaca026b8c0ca18fe487541dc32d01b0bd0604ad81cc82d705c5b00b3d464f3dd163e0118fabe976dee1486c32a831f8775aad935617143b039e22b20ebd690b18a6b91e7452279648490cb5aaf7c892bbd8e0fc5d808bc630ba5e80010a756202d02c32d3c014b3f43b6d68a8f1885424e59553a3c928a0b0a4d074f088d76de0c4592aaf010cb5225c1f24cc7bbd9de951a8966496ad290f1a83361992bc3a71753b64518c30c6d5caf44099ccab57e858f27150dc4459aa7f91cd6f477c42bfcbff5b52aa27c24eb019c0a99a6dba50998f85662f2de69c780956f5626804c355ebbb22f494ee8b15105af06c19da806a093df56fc1356f7455061691dd831df5cdc12ee6a51783d9ccff3f8c874d8413b0088a79f3179a4c534446efd44e40cfbac269af1b87cf3865b6d7d7b94677b66bc5578dd72adb6e6aedb69f46db7d4d669b3450c502bcf80760b7d3beabb351fdd525c6dbd15db73ae6d9afa96737acbd9de2a006de718b72df6adc86f5ae663682dacdbafd4ed8cd7166d7d8b93b6f5646e1701b7f90e5bb6db96f863eb2cb2bd64b17d59ad957d410b5dbfd545d97e60b745025bdc872dd66e6be4bd7d22de2eba6edd2f5bf2efad14cd7607caf6a1999638482ddcf1564bb33de2d99e1b6d955eb6dcabad99cb760acdb62bb575d86e1105b7f286db6d1ab4631f6bcd8eb614575b6fc5f68cdb36adb6e59ade726cb78ac0db3946db967d2bf2bb6532de5ab0a4fd46493be3b54559dfe2486d3d59db0580db9cc396edb625fed93a8b6e2f596f5fd65bf9d7164a2d5a5d14b59f98db82c016ff718b6ddb1a796f9f886d17ae5bb7cb96cc6b2b85bedd81b27d6a6d89835bb8c76ab574688f796c4fc65bc5d72df7656bdebd9d42b3ed48d93a365bc481ad3cc3769b6e3bf2b135e173b57c3d9fd61673fb87d9160b6ef11eb658fbad91d7f68978bbe4b275b96cc9bcb75234db5d68dba7165ae200b570c75b2dddf688777b62bc5578dd7259b6e66edb29b4db8ed4d669b3451cd8ca1bc6b69a6241376aed7ed9a97d6ab6c4035bb887ad767d7bc4637b32b255bc6cb92f5b73aeed34ba6d47cad6b1b1450c6ce518b7dbe869477caf351f6d295fb6ded5ed19f76d4add9633bde5d46c1500b67318b72d9badf8d79679bcb568dd7ea16ce7bcd1a2ada5c551546cbf039fea6ff4d83de5605ffb231d73e61d186d4f4cee625ba567dbd111b6b87db672cf6ca123d872f96fe7866d414bd8eafab7c505bf85a658ed6e1fb570e1b7a22dda72f16f71916f4743dce2e2dbca3db7858670cbe5b79d1bb6053d61abfbef1637fc169ae2ed6edfb57061d08abe78cbcd678b4bbe1d1d618bab6f2bd7dc161ae22d97ff76aef816f484adeeff5b5c305b680ab6bb7c5bb863d28ab6082d379f2d2ef976b4c42deebeaddce75b6808b65c7eb6736163a04b3afa654b0157b155f969eb8b7caba17c3b3af11697df56aef9161a24c2f277a3fa0f7113d233871164ae1c993ffd9a0dd08e04205c29098234a0a30805bc85603546102a39f96ae256b3065dcb4a8877b47c6539da37478c17131b97bbf654e58641176dbb1b9cf5cd04b85544deb2f494abc64dd70df80d66b6ac9e4661882959df2730794c59c6c31c08bbfd84b02fa7e3d681dcc20b86aeefa7c94b1466fc6f6a4e4ab5d4b016b16781b9362c037535649b1bd073ffb94a18dce41bd9a842d71b0ad03e321f719e34b2d220438d2a32b374254ca46771c2e9a8a3424d69be665b72f843aca302a4d6fb7861dc82beb4a978e220e2373ae3798c5965e7e2680c22e5c28c67d509e49686213eb62d88c6e315d0687c699900ce748c55ff7a233de0ae388bb5254089e9e8a1d4e64d48ff4621386cb960d02c31a49f2fb58b68f41d2efdf0aa6c713aa12e8fa114164046c5f1a6a06807e5558a60b82c8ea091094b066848a605b6f0e081e478e3114ed5a6cf68170a9547ebc6cc37682510832260a10400c35e37014b62615cffa2f836101621aea605c3182cea2fd4a769ec43cd8187b92dca4d5d2a018f8e959be1feeb0f278f3d087d2ebe580106b91fb25c95e0381db515368de63d02bb456dcca0490d5ddc31109f4afb84b11756f50b97ee6c25ed44f3276f3cf92a6cbf428fcce5767173816f0f0ce9f3cf7964c163178cbb67a678c3a920adae25efdceb5e281a3a53227827d70a2ea9bb7738db90871a32c3c65bba22ce0ff86fb5c29af4569de59fd845ecbc81599c6a752bf7548cd102afda5c68333fdc277c660512963945d23f6ca447a03499f24b275bd228999ee48c0f60d5e4c63d07857cf32fd9772124f9c30d13f54baf0a110d0aac6a07719cd5989f48466c689370fa59ac00635014872ef948ed2b7908cfcf433c21a0e670d884ae0c1b11e0bc2154dadb094b826a23602cafc5e780685dced46780da4c717858298e8445ca7c3b7c5f3b12bda48b7fc13d56d069ddf2593898beee1e4ea82a5882951e98d5339804b873a9f53cfdade042393fbf4885afcf194e950620529d67e1a8407c19c5f74cc36054e5f21c9f7cd02087870a14b104032698721864a03f376c777f75344a1aab3a59e039e194a15b7edaf3584c6473e9425772d3750a06d5a58829189cb837c2a250353e72bdbda67e95553f9b5321f2c612d84c814a3339ebffd8f76ea0f05cc0a68ac2bbc1075f9ac64ede96ce55c532b2577abe3f6307c55143babe18fdda46ee4061321e291560c0b97848634cf4f15162eb77c740f7db32e5fd813d4ff22f204f21acc1ea08f71c0c1429e6713af196cbebb325f123db8cf5579a42ad149a70c2c73411b9a7aab3fc71e7e6a3c0a4c984176e6b827a7fea034448982db802cc380485ed3785be362d8ac88749f088adf4d9b7d76bde335d03f5048c426ce9f621512666d528592677d52cab5cec6441e5897aa6e2929cb446003ba69f0e53c876854b970808c3590d75d52296f1a9a53d21dcffe29138d62cfe71746bae1dea02ef0f72d8d51f87c13ae3b89c8c005694030e02d8422f4b1b4a3f0edc1356845835c0cd88a032d58a57e2e17fe567d3b2de25807f39e02b1a74c27268cc9669c89db6dd0a8003de8b86c0744fd1f57f139f86dd98297ba72b91b18963eda6f65da7acff39a8bb6c974dea0cee5eb23693f0db0f0b9c5ac3e19c2b9648d3e296b4bc05b0d5089d149a46b67f83ce0d3658b30670a8997d430feca3558098917f00bf2bf97b1cc3aea86af2360798b835b7a2b7eb2b1273fb7dc1cce44826bc0c98dab7c90b2aeaf5755b8db1cc9f0aacd75b8463d5094166d2324cfa617427e9ee0120c952a6eced3f2d21ed28b113b2a67dd77503b436a60044ebffd334de0fd6295a0489ef189c41ffb42bbd781b28c149ac9f8e408fc609101fbfc37191aef37e37d9fab1ff5b3ef061944725ea477955a6a15c0dbcb03dcc36c1ae6b3607d0ce7833742c580b62469fb9cada612241ff8d8e4dcd4f5932212551c5e8c394d265b6c91d0c0d6f7229641e68dfdbf8e41b085189b0085c2a43143c88a205853958e524338755b97c5d760caaedc516d9246be027a44fa334f35a80ededc11d135bb62804e9022f274f34c6ca89ba4c1a2911f705b76258b94d8918067cea47230639fb077cab2ed0841d36478c3df90cc59ec76e725b5bbd9ae4ffe2e8e9a90848e42f7ab3db7abf2e9950e56249b8dba49eca220c1156e8163ec86cdc235e5581c5b2dd00d0bf5de2cee651b0b46f749e4a1fbdc7bf470e2e1e57ecef3bb2bc5ee345ad0301d67d1178d6501cd897db7b1a0f9681f1bdefeb17e91dd1a78f0b63f85c0ceb855b5550be24b2c4cae84adddde25023e7e5cbfa2bdae242f2d17a6fccbad758308a703c5815a01a3d314747876dfb045ac289ed727ba57efb53e9b9450b9f6a6d1aa286c8d4b80b0bb24647e227a3073cb075763e1e70a16fcf38ad07360ae907109ce6c058960e2754308bb6f16c6dceaaadbf322de1f9cc057d6290a4c0b25d3c3ebbd065746720954b95e9d956864499e17edc0a4266f1932220e8da81a4241b0de0e9f215d21b26713608e67006b471c349c636adcec7a123c461d8e0597fad72f0092588df8a1ddb4f17835206007a5f8aaad27152f57fbb40775e81f0ddaf67ac4aa136b1ea5b8523ecef7125365646a4ba7e82a736d5cc0a629142f98d8ac07c8a1355220815b4475845742258f1347699c04169a1ab245e082e1e985460823419dba67f33d9c5c294de2e354cc8160d469cdfdc9775d852168915056e10a139d77a8cd036fd21569e4f90cf9fc41544e84abbd98cc25753d5c3ef0b3cab0e4c22b35aec23b8c5b7ed7c0cb3661b65c61b159f619ed9d58b85b57a1a40ba87145ce58f8c28705371a9a4022e0614276b26d4fbac3a0e22a03b274a34352c13fcfbc3264f248348a7f120fa2394c42d0ce3b623ab87bf57408afad827accf00897b5ca92ba2491ea6bf808499eb420d1a8b955a7e8b09d8e9283afb344613547d73cc0c9650ddd7cd8cbaf14b64b90f40f1dadd704406fbf92a286e223738ebba4231635706b46b5a945d0e8f5c4990a0974770832adfe6639ccfb44dbe6b2b4c8ce8496836a1c0afaea297524989b783ee5f9afde3127248c55ab71197b736047411a1aaacb7de96c2321e67b4f9596d9878fbb47e96f20178de97c1b78ad067cc7a48dccae7ae48e0e8d92c865289a05d9df89d8e7f5b7a5cdadfe342e1e7ce66af705f320ba58ecc0689aa485353a0f841bb40ebe3b526d99e0f2c766da0978e1043b6d1dd6b527efb9ba3a3ae0a6a2cce962074a2dd18e5c019b2c57730974a09f1ed3c9ee080c9a36e3dff44934bf7a7339a07dc1071fc70b58ad2c7ae263089e849b57cebc57918532042c564030e9de7318c4e775c3edd7bd9bfc4a5fbff98db27367a454eef0caeaa89d7e185027888cf363391612697836657b760014ad01f76cd95ff470da757ce4bb64c89ffb14bba35d106de20bdc7755bb0a1e545263e77c4c95232a67fd6a104a602e5a7e2a339ec4d200cb7cab0adfc9f6958386d487ed0a0f0f3df6b38d76af0c3ed7fab5b5e741cadad2547ed1cabb0c72f0b225f1349b1956b8d013ed3557c5c2320e042bf2cee35decd09a2389ea563d3182d078e61d07e7fb234cad17282941fdcd5262d58b70146bd29d4f09736436ca887d376c4e89965367a9868f264a5844422c286e23d7fe2a53adbddd1cc0eb2af3784d0f5cefc7d737374aa9344f0ee173c3234bed4318833a8bc254a228e261f8350ca0bb2bc1837ed34d1a340301a34b660015cdd45ceb927557eee63af6ff411df604b64aa32cb55d8223f4ec8f43a5578497bbffe7a51eea493baf0af5513f0d88ec67c8b1c296550db0c7a9a5224e4c69a8028cbaa8061bfc510ecb1947df4a39cf75e5ad0f43e5381a580466291c5062755356e021eaf120d80303208b7e752d7e4989e53ee6be69cb1546f18be6549f25df89714ecf0edda799f2b1e6cc271da82960c66b5dec298b4575703e48ee5fa48aec9bb889e88d27dea5b800268007275e71a964000d9e8a635eee5da12704599faf1341c412ed98769aac162e3cdfc40d7f304fb3d36993cfd000821159e1d3a37c9dcb8cc28390224927f44a67cfa4a3ced99cdfe723fd899bf294e9689bae986de04bfaf92125cfca36e395411525aafa3b7aaea9ebd7e8349ebbe01b692960f8f9d4bcc4b58a3ee6eb5d2f4e3e7862576e95a1ef9bcee10993af14df309c78b1ae36f1f4664f810e875c6a9f530978385b9185849d13cc2109b746e49082b8c4b8284b8e45a4bfaecc3c131267d62e1fbda7f12918a4b24466a3db856d215eb9f6c7e1e62a4bae1b2c5af4ee900a8c7297f9aebf2a57f057eb7bc2f01bc573dc3c8e170e60ddb6bd546faf13a6e8e1ba864d6e897aa5e42246530f990193130fbe38defaafb28cf79dd1cc2618bf2863faad02268c483424915d45aee2059480cc7b780d801fe851b000437fd79ce66d221408b48a22136042fa3b305ff14c7dec1a0e6059295256f1858ca02b1504f8059a8ebac5492f7f15100af76d8e5a4b4da2bb994d761a886b09b6fb81b203d29c2f427f8e0e548e1a20619782d0621cdcd7219355ea8e11b44cad3127717a3eff0c988b959790f728a8e001287143447f09c6ff7e19f81c07b078f136310f007b8137edd04ef57229abbe20bf0dc0ab5c1e2e4c9aaa7063f27f77f2a06aa4327d37e4481b4b1e7706e909811d045ae2b8573d8fa8b1f6f96424c766c089c839b5bbbdc03c11583672c4eaa039836bf0c14af4a5153de5ba0ef0081549fa7082f871bbc6501e36fcc6266d847484bd518f95ede7ced54d3701129b0b49629d1cfd4bcc18fc0fae648eec475c9cda3ce2fd64eec770b4bb79fbb9c595f052240ec2749eba87538687a1cd5a52e59a643e3d86f97ebe5b05bce38aeb7bfffa9008739e0f32f63d7d1b82cdb7cab3b33126bdbe3725ad12c64770c75ae9372b7a1e10cc8c0073b7e65f2d0ebc964d90e98b5050ffa865147f7e546fbbf9c3d243b6f26b863953f3b4739425a14d3e30e1e031547f97c4818838bca79e5a7071585fc7f857a0b990a29589784fea8adec7685993dee924b80ccf4cc670f10a85166d66a03ba4e38842823208fc41e0184be25471f65f3ae148497d65f8fd667ad90e4c1a6f541163cd43f533aff5b64b886f926be27f42c38b29bf92980a75821e4114842f02d2562570a00039767f009186c4b6ab5a6615bb94bc811ca93ad4b9319e397f1648aa3b2210dd7fcff38996c94d34ca4ef81b99c64cb5fef89543fad8f064ce8f6cbafd3b211203a3c618a761a2d4e930528e8c11d7dd3e0e9b3d3e4b2e96c278126e738f0ad82c3044ec83d8a596035e7e43040669de3ecfc27d62d8c20adc4eb0abbdb2f514d6235dacb5b7bccc3226a8181a186798d03e8f42e73520086a2141bdf67a0292e2a241d82e4db53efb6bcd22dcd584f10db432d2c509963f662fdc134e3b5d43a2cef44a06f2e1c4c11286985fc2b8fd099ff841979357dfda653e66b6ce743b1651d1808ff9afc179553b71e1108a8e29a1ea1f8eb1cdb7b82ce6906db1f64c5e60e2f089ef7e70bb49d39fed2e3455746061036901893d28fb11ab006c84d5bed639a19783d2bfb8bf701f287eee9245c3382437d27077a4f28be92ba0b0788a8d0cd84a65d2a77823ccc42f9816f122bbeefd03853d9ac29401942310552f25f537e6ca354365c96da77cdfb7d2ab9ef774690fdc39a7801cf16eb420fc2b3eb6b35cece531e3b1a14d454057a150b7181b5876d49bc803f08424129c930424a13de17527c02d207b7c74371d2b6cebf4c8df0fef97152477ce60af556a38eed724296399143ff415a2714fd3995416889d7277c23a6686c5dbca5998ff179abbac5eaefc0310471d4284ec67e11556f61073f816691fe2afe917d3139697f230614e0b7305a2f9cedf5b7201a4333b2e2335e3702ea0ca9375d49fef0410b74cff452cd7738f45781d8f744637b8a868508f2e454b0d89e5f59699010cfd9867d0046a0cc7844cdd316026b832f9005f3ccb2df945f38540234097850b8607de88934c5e7dc7570d7bda65db27d340dd1474713cfc14b4ac8667090fd9ea75b8b21a395af0552ce2ca38c17ee138988c8c6723c5f7ae9dce7ebabdd6115ec9f5f873516c4432c8f536534bbe567c0184b506e03313b7520c1aba24789638bd57223aa651a08d0cc62558fe00792fc297ec8d07c9869b451661f446cc5228de61ba3a40c047c66296a53e5f0da809914238e6e65c08d034c1c696f9570e04d20ad0e208674d327a085c06be4a14268bebfb52f8688b43449511830d29caa7c3e19be1026f9bc013062b3208b0516aebbc06ed545f3199efeec08a3ecee39000a6ed5c52edce93399d6ed7c233bbbf41ef72a54d866111772e962842fcc32bfd3bcf01b9af1a0495771fbf5be487e8cbfa241975830ae184d91c13f6fbe4ebfb0ef0f1b29d908f3684b93ef3dbc02705713a4104abfad342e707bef03820f42edc6c512b78b5160eb05801be12f09b519e97ad620a0d657006fb3995f7f302115ab94021351fe310427804f72c3b6073a829deb3d3656b1ff6dccbe4677a905da933c8b50eb8a57162193b117c1d5df495f3526ea93f9fdf8494a233d5a4d8c5e003abc8fb9f60f000168f792f54c3ce05954053ada9a519003d5dc00dbd650e0aa273e6486fd7bdba05e6d4f5c653e25f1e3797b9fa87d8a9faf69862a53827d10d8d4815f862a6fdf5ce3c44fcb5b59fac79ea57eb51ca9e6c839a4a2010d3c975155657ab8e820763c576bb21f05eb37d21efab671f9e80dc235590b6711c14f6a058344963124fed0422d1750c6b2f1d40a74c6ae64d46e977450eb84a981b7f3594842464ad3fc4b2bd4e0d89f5349bfd13375dffd3c03e2a2a81a3b16a02be6eeb14052be601eeecd22618c87510f2257f6cabe8d64c1a5cd6d5bc9280c7d5b74b90086e5841d8e1bf39ccbbe821a5e65a952cd343da48973da806b16a61e22e9269c990bb9357dd4d9a5a173051a0900d6d68e936921f7928b0effa6c403318917b95bf4d3c3b9a03e69c856fc965d85a7b6161f7d7b9471614bca2e8df8b44f8a296eea8859233e402c97761ec9b44dbd4eed4a8ba11b6a3f5366276613284931bf41860453287cb76a19b7cbdb68da587edb7663f19205459819a9c19a959e11a552c5e9cd9ddb181fffbc86ef13970f20eee4f268ac0e273ed051b7f0b6413928abbf848f6844a2e1bb23138ba3fd6d0e417239ba5dfa5f0495f5e15f9fc1fa1d6c0c605c209befebfb4f02c003ba565483672d7e3383b623f07259c20d7c97e2f3598c670f38263e86708d4149bda64b3af084074b311aee33e44891dc0ade30d7e7a6e4d5579156f4543f938fd60e89f1ef0f9cbb2cb8d72f74c1a0431d3016910ac6f87cd8955a74717517a188c89e3a1001b52ca3038aae525e896c3c0fcf99fa42eba1b256b69a6cfbe9114ab3d56d0e0032571a4c7829b1eeef038bb90377b11838bdc367020e27abf9ca9ec194b3c41bebe383f7b0a97d56b50fa35ae96690713294d30b5d35e2e8f1cc6a920ffb78df234e33cbe1ff51694863c52dcb2ce223b43cd5188532940d7f790ccb500b25abcf60f2681db112d513c09dafe2a7ba8354a0a25a906ba861810c4de653b88fd11ac6ee784a2a950a77a1aa2a729d654ee16e3125d2351d86de465204732cac49604a0d75156836c6204b754a6f5b8312e5f8e59f51527aa21db3a34c5a1a9c5027afd4ada60364232e4a336d218c0a76066984664e78d9aab124936eb9263a74494ad32205de0cc08bd3b04ca9c7635cba7ebe5c8943d192bf4ca8189a690044a3027499d6497a0f5b07ef09fcc1fc1d8f9f25d27aa843c3d5d76bf815927efb0e420780682f86dc89c200ef8c5781ced2c1237e29fefd06da2c22076f2edaf80e2129672a8d6e6597df8954669065753afdca9408e7cf9ddf17dbea8522b55e986a0c650714caf07a15babb8d7fc69805bfd25a16cf2654de07d2bf5f35dcd440b6522f23278798c185ac188fea6c377436332fdc0474ed23a9b49b8edd471e4ba4ee6a51918923660c0758c72d19a4221d842bf3452ffc9310a41ab3dd6338d4592656a586f0d7bc7c41b1c8561c5fb08c542eae575f2fd87e91f008ce99b1df9e145dbe94df781bbc264ca6f826595ace0fc84e1113dddb70a06c30b970061d710502b00d09862f69c5c135714040fca921260f8b416e0137779c74c2eb2fa2242fa880eec2e69fa765ba062de7dfe095c9978de6c18d0523c896ae930cce664cb7b960220e1256e0c5e62f77f685c013fed87267b2ca5b2563e74c943d9edbde0826166ef756cfcf8a141c01ba234058999a85590f21ddea979c5d6707153feb2de493ec5c99bb570fbf191b0b39d7ec7aff3a6d587afa0abc5c1b781467f620cd1241454b77b90b94baf24daef503644a03faaeaa8759409c11a703df77a24c4799a3b09f07bff669cba967c70d4e8fbe563a91c6f3b0164e7f3429e720ab95f1519c7d8e6adf81ed126bafd9a581360c58533a0e7827e857a07f5824254b0dccb38df49226bb6dd96d4bb9b74c52ca4a0870089c0853d2e89eea917292c1da1804c9880c64b478937d76d1973aaaffdc16e07f511add9f031678d9f49dfe156ff6a4462cb5d40145d001195aadf00955f0a412b67cdc49010fb0d0441a5af0832065f09230010c930a80c51542acb862081392f05c0adfd1b9a8c28fc0b4c695edbaaecb8a7dd5ce08958e600b2d9420b5c416216059e15d354de4d0cc5c243e9d12ecebba7288d89709b82043a45c58818b23b8c384863291708425608105296ce0040f33625148316ca121a5cdd766d6c044ed1ce296f3c77e911265fa9cf304dad4c00b6a5fff6284cba7cf3967f59a4ffcbf1c3a64a471f92360cf772f7da99400eaf1784c5bd3a2bbefb9b12c93ec2b7f2e3ff6f5f1ba9e7e8c3d6412b99d473c71dd0302f67c7dc20302f6d4273c3802f6d449e68c73461aaf4c89f82f22f6159331deb86c0e30fd2bf7e06ab674fe9856e29038c0f1ef5c8937e6f61ef58407a7ef436e4cbaf423e41c6deca713168aa812f7c7ed986922aad0d18e3c6060dad1967ac2e086780a31dcf51cc6711cc75d90e3380edfcde3d1387a367983dc2041623cb2f620e6c25cf0c2c4d49895cf5ecfbdd7f3df8c99d6e29b2f1753ef95e0bd370826e189812106745320d0850181407f41d04d8140370604025d18096210f67910fecfc7cfbd416e901be40689c18981b93017bce08db93017e6de2d468232c6ffeacfe65aebfcb8e9cfeeb96ddbadf36f901be406b9416236b760d05a53cc9b79b8ecacbe765df8b71e6e2be69d4cdfec71f618ff06933d961f77163d1867d9ddfe6638f341fbed734c1f7367f5e24ddff778f49d5f101be738fbedb9b7736efa6acdea8ffab4f981040ac9b661c71a941328227b003b1a49d2a2d15f66f9616b5dbaf46db54f5a6bb9efd8edb3eaf180acb59f2ec7791ff4c11ecf73da47dd9ece6f3a08d2aeda6f3bbe171e5ae7bf8e671926d1173c6b1120e09eb1634d11454cb1250a76ac218266cb6caa65defdc518e30d892ef3f8b0b7efb2e5bd55665f7bf8be0db0dff9e8be32b9b74d5efd519c3fbc5f5a5cb0bcdfe16f43027fdc177fecf4f7b2bbbfdc6f3052f7f0dd7d8ef9c99fcbe671dfd371fadb62b684d957f69cad9f8fbecf49fc01759eff606cfca0b720fc14ff477f16df97cf69daf9fa9e686f0fdaeee80ffbec4fe6db2ab1b42b98a9418d8188d43eed58f30367ff606d01ec58f3c33d467e785eeb1f79f468d9b187ef6829fd1ae316fd338feb63e729dd84f4f02de98b8b833fba33ed435f6b1f3fd63ebb9fc7bf8347d59fecfc0bf7fc6741ff4d1967f1e8cfee7c3f1f75ca701feabe56fd85767d90fe2c4be8412fca71aa80f4773d1fca1f8d359729696ffa6ada47dd1d9d61d36a1ef2fde7c6837c1d9fba8c6750b05248487d6d0cc2286aa6581db17119ec210e718861108651d44cb13a62b309711bb7712c3698cd8824300e9160a4fcc9631022c148f9d36644121887483052fe04032c71880423e54f9b119b9010af70e8c32870b819b1c1a4f60cf10cc3cf8657d36042d2cb1967c94224bc19c18262c2cc981963254c143419e3f4193d7af42bfe754529dd63cc72b260b5fd258c14b2a5cea40e61acc47d4d57a9b15c03fc91b6fb5b8b493e03cc23fb6b7f9246933473a5f3fed20919ce9528e60a36855ccd154d5f7faff11a9fa26afa82b3d303dd99cee1989444e669669e54f3e4afc9194944aae68a7dd9b9a4ca95c8be7369a701b61ff7479a9901969b0463ae60efff2938cc15faa7bb3fb93f7d63e6097b235d342167e6ca2767485d10d9fe304e92c85cc1b6bfa4992bd1481731db5f3a3159a4e7343788cc01cbb40fd727efa4711639635d7f2f32ebe8cf47fd2448b381ece58c76ad6d9dd9fe58f6d58d418dd9f3c3956ad3411ac528f91117838b517aae04c34c314c99dedcc4d0251da3d1531f8d1a80b99f24d7a36b742fcc3dcd1f478079aa314f73c7e89d1431bdec8f48ef24227b7ef6a7b942faf9380c297d2983ef957ede1081c19d707a8b992718ef796cd37132a43343649e9a9834a53c9d9851cc6c31a32d6634da848c46da9d30588cb3947e62d2476e55e2f47749fa0b916e36233698d1683302038281f33431546a7ff46675b33a62b3193132d98c78313231e190c0df1c72337353823332195242fa9237c9dfcb3679f174d361f29ae47e441a8df08f4641ec8b946390f4e863ec182525cfe56f83d9259fc34df2c9976418ff227fbe4ff4a603869e26cf914aa35169447a1fbd788ea43f93e7ae1fe5efc573f3da5c0478f4743eedc25ce97e8e61ae807e3e6dcd95cfcfa768982b98341a8d603cc765ee43f97bd9a1774a7f943fd21e3d297fa44dfa2b9b98fc8b177f72f23060c4788de61d7163fc74f41cd5273be2a6faa4e44bb61859f471db114397bc08469630fb24cb98fd224b21db24cbd4be32dda48cf7289376c996c3435d06e5ebe23cd8255f806f369c2ebc00cfffe8cd9ea4fdf9ea66d6ecf9d9e91431fd1a03639a5c21a9bb0053ed2ec0f2e54b3ae99cdb8f98734efdd1bf6abde6bd64bdb08b4d7a61f67502cb179c94cea759fa20252625c5e4b6126b22bb223b92d9ec0e98d960387bded7a4dc74883e5c95f877a12f799f4440dee9af65931e943f1fdbf5473f947dcc7de9394d3ef4d4c6552675ea4ea9539b19d225ee4f4bbca4245f4fbbb8d97947235d44a1f24b371d43b8d77ceb41ee23f057634f3b9f0025a497364d7c4a3ece95a82fcc3c7d7edb81cdfea33653359b983479862517669e2e5a12b3bfebfd73cc8ea67dd40bc75948a01a528e53c575bcfef4fa12d7d7cd3ccda7faeac23ccd0bc93c4d98fd519b1aaff1297c3557be175d32fa0dbcecebbaaebfc7f7f5b98c4029fccd1d501b8ac55c09fd7ccaa2a3df4148f4a11fe5ef658fdea389b2ec3affee6f57221285420fcadf0577e873f828e30fe5cf7bf2e71beba8e323b7931eae7dfd057a4f3784f43966092977face13a51fdaf5f7b229be9eaa81362bf7dd7a9099ffe2088c2de38d6bcb57a9b2bada5ac9bd9b7c8d74efd603b548cc95cfc6ecb9432a8c116287ecf9ab78e3b3e5d723b36221bfdecc9539b78c2c5626bed06ab67c4b831873b0e76b9ccc8edb033ad6e47253d34c393ce109148e71bb6b08d5d6d62a9d09dba6a323f3add5da5ab39ad5cf7edb7464f56fc9265fab1b0432ef52cd130dfd8b35e19e54c655a6b6daf5bf58b3c2b366d7974cf0b8cdaef9d6d7a88ccc762af04755327b3e55555f02b65fdfb3e9a89abad65a4f1975e7e4d26c002db0663c0dc6a5d9005a4461e369312ecd2711a07ffda55b0e0024f4a88eaee26971964a31739a4f2818ae9001bd880631fc60e569d9c72aec0008cad3ae1c9d600590958772c113381eed8111319ee7d2dcd2729960057a2d2e1a1970428fbe8bd4c10f1a8fea2b5e740738a07765adc3da3edc74693e40122890f1b4bf34d79420e4c037c496da87532288d8da76696e895fa00116a1e7c2adf4a5d9a5062a0a94b7c4090ff2ebd7978db2852db0522ecd2e39e02c6123a3864bb3d65d9a5dea8d17a70e5ae852ec5b5c504f1f8569974b531a5781027ff46ea92263e6f95e761786f08318cff3d5ee799edb4eaac30b344de6e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4488937b54aa0583db2e3579b1dbfae767c5782b5d66a930614f4969853fb28b827b8a56e8943fc405b906891d972eaaf25b5a5dfec20a89d272ae5143429e59cd3d2ebce03e637f252ef028ec46474cf8d23615dd7856198a597b660fc9342d85a7b2d45a59c4e0f838483a54b81bf7b371ddbb68530873b50f7c11de7d96ed7755d34f1486d0b4d9367c0f1b59863ced8cd9fc7d84c991ba96ac933e0cfda6906b9cd782f467d62128bd5f3f5d847348d8b38ca1877dc2d5fe35c0958927c888bb7bc25e2639b0ef91801b6b780de4a82b76acc53f4fcd58861fcba3d20f3a2ab44ed5260cbb911fc613cc4a5aebc25e2773a9b8e88ef10aabadaf2bd06cb20ea6afbcd8eef46f047ca6cc52e8dbaa669da9491f37c2f9b8b38fedc74d81d91803fea94524a27a59252ba79e816900063608c8422089223823394c08811704a60e4660c45643b3ef1032ef0a0891d43d5cd66ed18327164d7a0ac2d7f65cb8f9ebfffc3bdcf3da741e0f9cbddc7585fed7196dff86acbe7dcc6a39dc65550de4ac9f84c8c067a00c1bde77ff07cdc803801c2f3f8b10601f71e7d62dff32f5ef44e7ef0e2d6e3878fa6d9f221103dac4f7e586df92d2f9ecd96efe2c52d022756ff106ef99e9a2de32681164ed3199f7115f957bbca55683e9f6939b8e16cf9f7fef5184785ceb2da32baca3769b6fc4dcf9a0a3acb44690d82fbdbf7bbd3b20410f20b3e4802ca2362fb1697911659a03c142ae46d9a08c7420b2128ef6a7fff0488fbdbdfdff403a477ff2402f7ef5f7d0201e99dfc70ffeae8454f7a4a7f1eb31d74d496a0550b90a03cf9b2e52cd1933f511d9c4c7f33d519431acc3005cab3fa9b32332a9aaabf1962fa9b2b0f12ac48420cca9bac2dab3862451428ef9b373896c083d0fb268ebdf4f7547f249ffac35b7a3394b5238a0bf6a2cd0e8b8917b0e009314c3001064df0b025a0ba2042ebb3a3112268810858282125dd734e777f7fb95dfb905bca1dacb64b52ca3ccdaf1155e6e33dbf1a7bceebe336d5b866c0273d98b6ff7fae4f78d8527f76cfff5c9fe6699e26dd29be825d010554f0c2f60985261fc974f95facd98101430089408c68d811bb648eb9f29d143057e2147212609e628ddf5f8d1dff84c35c21a97ed8ecefb7951fe56a06dbb7c0396baeccd374d63cc9b746c2235bca1cf3c5a55c817b8c31004f1849020609122448f61422912049b93e5aec4fac5ec0dcf6eb9fdcdddddddd6dc57e8a1d529e77e51855b6bbe3489f49b498a261af69458a40b24f3b1629c289dd79cfcbc7b43b3dcf6d0be8bce7b5cff5481c253207ff18e3db1b6fc41d7f8b37ea735ff2d81092a4d90e78f4993cc99fdc27534b6ddb51fa131393ec2592b962f29ded85a69d9cc5068c50d7755d289aba2e14bad99de95f768f85bee67f9df53777e8734c6c76ddd4d84b8b0b7d09cea752e260537622297a8c769a47e8aba42fc2f4d43ee60e7d9cf327dd13d33c429f0f89648b3e4e96d3d422516807ff18534a3d317dd2d970162160f0207fcea753f49f44b2e997b267dbf13fb7cf9f2cb1bbed90cf03fbd7248665f9760ad95aa80b8542a150a743a23765fa31f2e8737829c72d3a394b8cf707697f1bce12430bf1e97e62150b3d36b1da3d86851e0b2271883e1bc417c40de2d24ef3d018cc1689e2d680f998fee40ece42c21fe3e7c3b7ec74484f7d127afaa217c27fbe08eb68f7a2b7db0eec7974ba62bf43375ff4f847394615dff3452f83544d5e3b8449199a33db1266664f270bc955fcb38f4876dc443fe5e835cb633e8cf7f8a4277d24cfc813a1ded1c813abbd43bc31df9f87384d722465e9bdc872ce3969f01723cef61d24f01760c00f14a8c05cc9ac49cefe458e5b24fa2e7f2fbbdb21936c4a2985d9f4a928846121d1e7f02e9fbc2867afd12bca71bfc8729b783bb8e633cf8d6d12e07ef4718b00f725ba457241e595fc090070bc1600e0781608f8f1bc1403a9818411b0f6dd616a8ab7a852a408223b1a915162d3d8b1081133d83bc41b72fbf310596ad0a47460e4053eb0620c5edd18c9c6ffc974d3f111bd2612fd8eb845fa9e01dbfd49215bf4b108112ed82f7b8af2373f9441212df3cb9e3e7c83b4cce19febb97c6d3be6962f698e3d3f39b3670522639688468a1cf10531575bce7cdd05cc4d1f02d38baef229604f10a8761073b5a91242ccd38cad3d25ca3b599e8236e5b623638560cfcd07fc22c5b0e9e6836df1245bbe5f615f9b0fd996910637b34c22d1a00ac1ae9b0f255b461af26316db6e3ed40fc83fd9d9e6c3b5a5e67ac8cd811ea6245b7eed6277361f4020b7a6619746e9a5d9b5f6dab47bddf371607baed65a6bd25897f44783f4755dd7755d94524a291522e248d627a1106515521409c28e2f99882c42502a552d8bc22029e653271939c3d5d4961024b032dea43f4cd21e14714a1147c660cfb7d1b21ecc914c8f4bdd26436aa01a37ae017c47b6378b3189f4587f5fea74a741516dd5566dd5566de598b5d65a6bcdb22ccbb2cc43d05ad08216b4a0053b3d333333333373e3e2b832075f2208902cfc9f9c9132f8e41112059204f2c78edf81c822672eeffe8bad1dbf8873ba7916c9665b8b3189f47f3ad590335e42c19eefd11f3e62cfe7f44792c19e6fd272e6de40ce3cd69f7cc29eaf1de05e22d85a8c49a4ffaea4ff53f9686f71359c145c0d57c3d570355c8db5d65a6b3b9d4ea7d3e99834d6250dd29d4ea552a9548a255992255992255992b5278e6b807b896cdb0ecef4324aaf6ddc5355bc21faf99489c8926536e8eff309e9cfc4a406fde55ca23f1595fd5115558964682bb5d5b4ddb4f568cb696bd29fc525fdd120dde9b94aa552a954ca8baf1de0ca1c0cfacfc68e01f8ff54f27f59ff6782f2df67c7cf224bcac7b733e52c29fafe882af35132ab3f389b90744ea97c746ad79846b2dde98bba44c09f55a1e66aaee66aaee66aae34035c99833df456e56aa8eaa2acaad3b1aa8e5575acaa63551dabea58cf5e547651d9456517955d547651d65aaab25465a9ca7235b5723595aba95c4de56a2a5753b91686d516565b586d61b5d5baaed6d5ba5a57eb6a5d2d6b312691fe4fa71a0ebab5189348ffa7538dcfc13d3b998d34b08f8e91c655d2712be91869b88d5bb3e36b51da987994803faafaaceaa35665f7f7e210b0a6dcd97898fbeb40f69a5fea01fb1abdd7072a0fd7fe5ab08d076c7f20b8361eeafe5c348b594fe94b9fc7c0c8dfb439c9df9479913f79a322e52fb66258924517b5e787f267bbfcd120ecb9c59effc9df75832b8b8d1df16155ec4a82af16d180dc9f55798c955fe563b2b56348550070c15edce57a295d571a8e68d13b54e0f9de59029e2f52e2d062ca178a1102fe6ecc8d992b42260b9d2af3a711f074163cb1163599b127cd156d5a6f71d826080a6eed16016b737ea7f39cf67ce7adfe7e7f1fe7bd5b66b93bf973160ecd7796b3bcabccbf54a39fb736bd68f6546f1263190ec755e6df9c7066477f36f677635e7c3786522c033ce463d342607a99e66e5c65be5d01fe702a4603747f38b5e763256c6a0cfba34a6cea7fe5540bb8af8ae5efd241786b536d431d1ab826ef47a7a86de53b0eb6d2dabf9ea224a76f6cb2f4f0671af7b6a369195bfcf6b9d72cfe0c5b0e89a3b6a45beb024e866fae904596e3ee441ab693e7e632922b646173dc19bea91efb56b3bcca8a992b9b90b982531489b9626f19b07dee31d6125b4cc57df750ecb2dbe9db1d377adf5a1c9b9b1b5759591b56ca460d8a3aed56cb5524f7d94f7f366bdbb5d842c4b1bd7cb771967ae337f146e8e57b17e68a0646a01795bc749bad41b9e44319db9effbce8b55af225f21a7d8ed41b6799385bde60e12c11c826947d8b62a4311acd2d3ae24df02a4259ee518ebb4404d2433a2d7a918e914628c7ddd97ee32cf5e53b8eb3742f75976d66b62dca59802c117a2cfaf9150d734503a09f5fcf106f7000572e228eede75354bcf179ad6aa12cfa4fc636e896018bb0a8444b2cfa8ea8440443de4fbe688cb34c6dde4fa65b1480ef7188f4c91e22f5704181e6c639ee50f77d3e718bbaafdfc305b5437a48a735ac7a3028636d33b7bbb650ce323feb6cb9623bb5298dc954086a7e6d39cb85c258abad3dbfb3048c5d77ab1767cf6f997a7ef3bcc7c379acb5d7b3e9cf7ef63a1cfb8e96d876b2dd59a643ead3cdad8dd15ce4cb75c558c2867bc61bfef13319332d5ed775e5b061c38de0fad8f680ccbbdeddbdc6e9846118f6a45843da61aed4ac7eb6e9909f09a9f50a2c83a82b9b9aa76963e669be46ffc5d3349aafb73902f42fdd825d65d6d510aa2d5f6e43ac13709d2fabfc88644bcda37e44b225a532b1e6a3129051620706442cb2eb52d46c9198a7f9f20b383e0136b1affd591a245473e5b334db89b912a9d8f3adcc5c894f80307bbe55c236b1e777f7d2ae2c3d8d66110b92dc78293454cc78327a700695a7d14bb38c23658891510513284fc32ecd04e84112663c1d5a00849a2e0c37b0f19e0b213899045b849ed6b934839868d978dabd57a61ecd35fc5862e569f7d20c3a4109581e288915d03c38a4c6d3b84bf3bfe00c294ffb5c9aaf77b99ae08219efd2207d0422569ed6d5902a428da785ee95dda359061559809e26c21ed32d2e980dc23004e5b5b8d06f7121001550ded5e2427100061a8f6a171cab1b909021c878da288e46d3a3b9a40533e369a2924bf38442083db8f144200417c88420fcb10a810f84007ada0b24645a9e76722409222b4f8341c51626b0f15cea4d13d260d3f2b4d2119821d4782d2e231a2f4e1d5cb815a948175acc78da5351c4082d4fcb426a6a3c4d3fa10222339e86422384d08b4c88c206319e26430545dc78320910245a9e66c3a5791251021aac3ced84851095a7a95c9a651126b8c2c6d3665c9abd09d8fe490ff5b3cf340fbb6fb834c72241a8428da7e15052220a75a00fc6c1e408684882a6445641a385cc680747a0f134d2a55902214286d0d34c2ecd52c8cd10623ced050d4e80f2e2113065138f90052222125a47ac3cadc4041ddcc49ca229763c39664d9804d0f31c738b34220d33083d17ec0a29ef1e090315319e4be7870cf6d763ba254271850f40cfa53231e3d1234ee841e8b9605aa008500308dd228f70448be5b5b898643cec5db22d561efd4b9f0071bd06c5ca0832f506e10910ba45a2408b31a4bc96eb5d302d501e7d4db7c42359fca0c66bb9b40bb7f2301cb67c172c0c3753872f8463093c083daaa94ab7602308d2f25cea8db7845b81e5bf789244f2331c81734dec1530507d01a6c633a58934a601aa5064e5514d55ae32ffc5f329f0c9f5aca3d226e6c956edd97bf641b77d9aab912ba0bc16fa2e520a5d58794b74fec5d3720c738da7fa5fbc1c5e730f19bd1ebeada634aa2af0178454ed4e206ce23c424c77777797d6624c22fd77200f67c29dc5a43fc9009970e903eadcdddddddd4917f41be8e3163f206ce28490d472265cda64486d93dae64971daa7dce110619127a208c310e545ea4aa552a954ca0808822088655996655996d2312e089bb819cfb4bb896c08d55022cab22ccbb20c044110046fce5fc9a227e06aadb5d69a65599665d9e6b1d65a6bed755dd7755d94524a2975777777d3c556abd56a15ad0a04411004c1d2cdb22ccbb2ac66201b9b8eeee5068adbe793e3be4444b7e4ba147105d3c4d3fc0f0f618a1ae189e6553bc618e72a664707fd07175b6c218b1d7f4221b2d469236367b08a34697e86a71a5fd96c1eeea3bf13487f39ecf9b4036d1ece84419265350b2467666666663a217070dcdddddddd43b761839aaedb99eaedeced4c9aed786c441af30b70c300a41b3ec5a2d8088b3c11451886611882200982c080200882a0e88eb44f099b246bb65820168bc562cd13b4b63fd5900132e1d294322cc6dbff29fb7c4c4c720695304afd8a3f26ceb3499604b1582c168b35c3b02b496deb4010044110e43e209d3bddd2396795d73a0505622e3f1014dd6ab5728e1e8cb9a236846a289914abd9bdd65a6bad3da5846eadb5d65a10044110047366caa7110dc3300cc3306badb5d676345a6badb5560cc3300cc3dcddddc3300cc33004411004c10b044110b4d65a6b6dadb5d65adf5a6badb558c91d91361d5d4a6edd9b802f56521409c26462de60c79f32882c72266253e6c6e2e01669a226789a313566cac6ddddddc3300cc330fccc1c210397dae6017d38130824b5cd934aa552a954576bede40e5db26416d20a1209eb8341a7e9e1d41ecfc7f3f978729c5250c2224f78147305a384e1294c09c310457b714f723c256ce2e66aae3813f6e86f2699d6624c22fd779c0977a01236a574252dc7c4cd959c2ba96d5fd2ab9964cf97b6c3a4077152db3c9c49635dd21f0dd2f4f3f1e0fcd741a758cdee0d43100441100431ac669debe16232c7300cc330ccdddd3d0cc3300c4319340cc330c4300cc330ecbaaeebbaae945b6badb5d6cbdddddd4f2e8c1be382b089f3cc546ccd94877b93fe48a6c7da4b5a82328ffe3e1f4e7f262626ad1700c2b8fbfceb3fc5b8539bfef38cd759e573fed7e8ed50beabb7bbeee71bde34c362b5633b9eb98a34e6cf2a220d2b3e791ef90f2e81a1bbbbbbbbbb7b383993263b50099b7e7628574bb92d5009cb10499c9b2fb26ce28aab0945a18c300c4330c8ee834b527f6f4f1ecdc99c21522013f70f44bf5f50d6da5a4dc3300cc330acd56ab55ad67235b5e5eeee9a8c2b736ab8eead568b0ee9aeebbaaeebaae1621886611846afebbaaeebfa4b55f9823e25cee3607450060e04db6ab55aad1b251e481c9a9a74974d9dc9d475260f238df95ec49ff028ba0f97046e0abb3ff6f3f1540c5473240e937e20f98b9049bc7f9b3227c51fdf8b384a1f5f017105f451a250d50d32e7f3f97886e880075a6e48814cdc494ea7fa5150a297673c55a5a0d8709d5e98b51d4a69ac663b1eabbaaeebbaaecb29a594524a29a594cab8374a1fdf0311c7e7e3b7c415d09ffe933128ffffc954ca7f121559d65a1c4f3bc698a577332e95287e3b941c3d99b17ddd2e5f5bc3347b25d6a155c33a1eaa8abb94291391c6fc4fa63c9039cc07658a7283ce1f5c02fd3cfdbfa6377de2f447b23b3a8bfe64cfe73ce33fabbc3623474f45e55ed48c7cc37b4eb908179477c3ab6893de538e9e27635bd3cbd3b939dff09f1b9eabe1569d2b6ab5e3c91169743370099472038abea8fb23dee07efe2542e230fdfc0b64ae60151b4a2669a3869c3745d38bd98b4a31e192ca09456ba74b29a594d279ba9f1d9f8851d0f82fdaa8fcff17593352fe8b2b6badb59abc39e3f0da27cb7d51b37b0d876b5576d3fbc9756bd7c534ec7ef2f5791c5e0587d7b2fba95aed78b6b7aa7803f4f32d13f1868c9f6f79207134a11fc87ffeef6f10e9cfa2e88b7295edd1c838e4e82a9ce953b2a673f4665c90e9e37f9d1defa90899c4cb0f24e5ffff23ed486355ae32b51a2e28476fd5960db7bb4454ee2592c38d5b88594428c4df9145b2b049552c1b4225fd7d09eb0439abbcf62a02b82a9555559be98e56ef6f1c67c2a5930a8a4eb9a80b76b4bba5a4bcc67d3e2a32a4b6e51c9146f737a4783297bfc842c9386757fb1cbd0ccad6c35d14fcb9df89443a47ef94a3f7c97153956ac3b8137525a492172fc2300cc31494aee47e2eb92627f74d6094eea3640d0305e5b5ff3fe5e8a5a098c08061ca269da26ba835586badb5b6d65a6bad18866118865dd7755dd765d25a860d324e334e38541c729665599665d65a6badadb5d65a2b866118866136aeebba2e199b0e6dc6cdbafba972738e9ea6dd40e3a26800d4b81a2563f6ea3c036546bc8938031840adb5d65a310cc3300c53c03c793bd2e87e46ee5e25771f6fb800a8715372f432000230809bf38c143de35166bc16809494d774d0a107b74b8f92a3a767aad65a6bad188661188645bbb348a37b53eec81cbac7f9ce53f72ab9fb19b9fb94dcbd2680fb0109e06aa06cb736800bca756b3a5c9da39792a397b1fd397a9a5f50beb6b6a2d9f0ad7311a62429b9082e49922e509ecadc3a17a15fbb713fab3c28cb9d731142a8c8ec4eceecee3f4b8323eb787a70fbf33947ef5372f41c04411004b32ccbb22cb3d65a6b6dadb5d65a2d263d66ca2df3d43dce1e9039745fca1d8834ba5749edee4f397af72839ba8ace1da594524a6dd8b061c3868d3d5fd3e182b2dc5d969be586116786355313059304f307175b6c21b2d8f0eb4665697048aaf9d5c9c659eeeeee6e63d3366cd828d978acbfa8853ddfd3655445555445551d08822008829b0ca981b86d0173b5ea6acb3353de722ebce52d6f79cb5b188661188681200882a0b536a2daa8946e961435ca14a211000000005317000028100a8643b2388f2439c30f14800b6986585e48320e8986c128c77115430629438000808080c8c8ccc40902ec7a292216d937b34ef0c70a37493035e0f43e2e40018f44d3f5482e11fcc385f7f69d1fa6b94bed491bf5eb5eff8779a09c1e7e8a00a2df7e2ab5d4142af5c927d1104537a6dc9ca603fb6c74b12ba059bfd434691e5963252fc06082ec6678e285e35a28af82e051596449a66690b76b829fa9fbcf713794c929f746f63004b71d40ba00e8ca77b496ace688909d60e925d4676860e861e860e90ef6222a9b8bce2d5652451211ac347d21389a2f15d488fa8bf53262502671b86ef2095f806fd74d1b552153b5239061b6017b21c49ad32219cc2015c945f812c3dd98125e91457835f2a2578d3c88f992b9d404b4e69b0e10c2f83bbe34c700f5a6fa781250936375127f6c6a58bf2e08fb933030fee1fdeaff8dafd442817010ee4030a048c80a9c558754b86b6aff8a3ac5653276c92f19959d7f34a03670304bb07d50185053c62fd0f80d918a397ca87f75b0e860d40f134fafd189e055f28ec60f2b55cba9a89b0239eadec2917a5496f9538243649bc92b1d5b1612952476f8f1f4a86fc6a5b553babc81027e8daf7f5d67cb2930621f02accbbe865fd7f9c2d9d8e49d1dd2a501351c77891e4737d7ac3a2c111e372e589376118443e31c2c82d2dc4473c8065feed7a879e300c55d25ee2a534aaf2e731fd7cacef4a8aa455440a45f7cc5b9ee12f26847f0967020102b226f7849901481415973f225580668925aaf2b64f4e00530a02cff5174c171a31b71da3b0b0509869c9d0eb69f56952888b4ee55db401e25d19c6add34e7874acd2185494855fe351db811e5e6468791d0a6694bfaf7e66d8e5422e152257ecf9cec96b0b0ce3593718bf0e7c047830ef2bed061af890ef4d9e8604f930eb90586117f6a90fe3483e8af3a88f31884d07238bc31cc578a5e7e407ee0d4e15c033b58e231dcedcd28d64397147932d96552eea0449c0939459f50a47b8d1dda4de859951552b450151d42280194b877bda42d4fe4136d31625a5221a928e353ff22def425d514e28b11dceac2297c46d59dcbf3b8faa2ec72d13d3de48d9925dfd2ac2ccb9c455918b107c00e67934df944153b058a19872700c4da617f463fbd082173aa888022e3d634b473b093288b115bdc34aa952a4f48e1bff993abf21d7b796ef74fe62b45cef810843b6a30337ba110cc60e88f95180aa6e9792531a6d612b7194aa942b4b08ca365f3ab896625d59e47bacd4f733e4d4900e2c693b865f953cf2a4f3511e1772308c1b265c65676cfdb7a17aabb3f61bbaedaf4149be03e5855f848d13c123f52dffe33381e9376eeb3b6e79fdc12e9e08da5af8f3c18a7f33ebc2fe9229110607a90b8c51934c591554512e897e9693661d6fad3d78a8b488ecd0b90ebe81ca3c4a7357fe29d197a7ff617722750ab95ceb666f18c4a0a8dbb60b1e94f0c87bc4b4a54ba84e2892f89024d0c31dd8c5b2992bd2bc857d0dabed4955eb376669a17e41749434cbc1037a45de18003fd48671eddc87546cbe8827e03a3ebbfd029679b68982f7d05b10f5cece3b73d02ec6b3a45390873fc77a2881e7870bff32c37f30aa873cbf8e924b5b88acb94bcbc5e939dd7b3387d51fc66898118cd01f53f61e8c923c32f857dc956ec12d8d06170d22e3378e6359af715beb4ef9cf0fa4aebe90b4488af9a98986961da75dd5bba37f52ee49e46146ada98080395d1bb40d1d4678e0efb932281f49f3e4862664cf7b52753aef77cd04769c395eb3161b2bc6fd6a7b99c9bc4447b53185a7c69d040a4016dcabecfeab77aa6d46bb1c70a4ec865c249c0379c1994af2af4e52870dac5a1f6030a506d54f07eccce1aa790d177fd96294364dfc6f089a2517d0d099cfc404424dcfad1ca6d48f2c000600097ffb98efc1de4a4fae0247154b1b6ca20b664903d5911c2faad50e38f863a147ac8e1486de7b90d3b04c00adfe7c3a2322b79b11e45a0528f90a7af7b2079aea573da3fb6eec81529cc30834ef07fd8c6c3cc7d7be28a72a201d0e156d6455cd22740448eadc93c8e1441681c5b92dde7a85860070a6258fe6b17b51d3602153f6e1273ba2d415bb8094d73511212298badb0f56f92929c1b4113d34509ede190b3dcc4a692fa882d6f959c80954cffac6924285f5c9a046ae93e21461764173d44fc1f7bb1eb991a321e072e661c2e089e1ab1a373e046031357c5e45ef8f4815ae05febe9de9d25a786ac638156e9797cef1a634683fa6e0a14e0079d5c3bcafccdec82f8b7bbebf16d3b9d296ef749ea7699076fb7f9ff7625c5e0ee66c21357438a742dfe1d05d683d7214ddc4bf05a0be874daa91dc3ba74eb74bb68eaa84c6c836c98c3ef508a2e3f30d47c81d8ca3602e160dbbee4d68574926bae692745984553f7dfd996fce83203fd370f38dd9aeac77c6db7835aee4a3b287d3a82c92a634f8ca98a27f1f759bf1a5e0f84cee5a0ed1ff77fadd1ba43eb38b3ce2f72b9e3dd630640c1b86ef30af9243616c340cacbc6a7f8d413495483aa1ca3feb2b731731d65a0b71f96d24bc856fb083f9296c3fe45756b1ac5188379d4a4d40d99f1d2066116ae4bc935a6fd890a281ac922bf261b340de064c6cd6fb8a2e31ba9347a832917deb04babe8f4a2901f5c994089d0413b7ce5800b08087bfc21042bd937f21c42ddb66e649a3476d81ac481fe069596ceb67d3dbfaf7b141f94451f9b08558701afd657df7a3fb722e55888eaf69eb4dfba4875233b8061161fc62f84bccd4bd2cd68d0a72ced77bc523852b7d11904a5c250da184c0cf079e287f6dd1161fb065940bd3e28db427cd56bec4cd6ca96ac566771ca9d47b9c3a75f87ce73d7711790a77847978407204c35f4824b066482d94c7950a69b24350ae2116f7ffb63494ccaac71c4711bfbfb54db010e8e140b2456fa258024a639f1bbef0cfea22d84683987c0a504d80aa166abb9dafcb118dc3f5145373e4dbc1d2f5dbeee1a2ea6af0713f1b134261e29750c34a5fa67543ac704fa6090ad9eb03453f6d29ca32842d9832083d3a9453690d58a020c0d03fc99121423ecc03807d40a4ffc57317a0e708ea200a1a5ab427569e980147f8f6d71764ebbf42ad3695fa692e0268951cac9f818ca7d3d92e36253be33b4b32a4fe92241a80cbc392c65b3f8b32778d3d4270196a4e61ca6e17f7625fbbe79fb8da6a00bf9b3aa810842dc0dfcb66800c2fb63e7325ca6ac0344d3d6f17fdd7530d77f1d28d0c38e23cc83710c79477a473e63c0ea830f83eb3555ad492be11a147229c7f010045e8cc4205994f72220d583e62bfdc3412bb15e130f78b2a8ffc3e6e5f8dab9dbd30e4d5f150880382d2c2c41fe492f987d50179257d219790fcd684b0eba3aa1e083adfebea69cb827f093a0edb8790894b12635882d44d49825851a2e399ab576a3644de18b4fb197f701bb796fd03062a1a1538844f86c620d6fec25b81d8d04137446308b92fe7b5d318c2b963387c6771038dae56efce5d081ee892c5ce94448989c884ee0262283dd4b99d586681e40b09c73e79697b9c04a1002a78ad5b8a539fc888722ae62b9e7a9b2c7a3fe3e78fb0b8e99c3c1ab5cf10ee10c5ed63e0c4016bc87ff3c392ff932676d8688eb174c2a2b861ce157d02ed661f7bb487d928e41dba907e7ca785c8c2224e3947d2a0122f16e821f77b8c78e7213c7af86a8dc94607d75aa5eefc01a0f254d1c63ccba140ee7f53fc2f01a4cb13f353f4f752ea7888f050d0cf9b11f0cacb2ab977ccef2aa2c993a589c25d153725c1814a7d5b8ae5185b59a152513f07dff094abf8c69002d7b5c0e6f2f8c45fcb766e3576105d31f4e2de4aad483404247ccd8d84e9fc74e214d8ba270a66d499fd34995eb11c6899e1e00f0f079ab990a5ddb78902d8d0845a1dfd975c6d2ba9dad95a71b4b5cc8ab14066f1028f854beef06a110ecf29ccf8f7033e5e903bef6f037146992b9b7c542cd00769e8392a6736cf991552129c21d9faeb0415a87352bc0742e47873d5c4dccfba484218836dc49325dc1931c28176375a92c73c2c41ecfc976db1255dba1e53a91741d94b0519e14eed1fe41ac187ea7b06b7c3947ce9362bf3f05e485b6d77c60b292f43d49d6921732544fdd675cebd3e31e3cb6174d09162073f5cd2cf1a46f1d1a726015a1fe59ef31882bfebcc4a37f554f007c1e48e15548ec527d6045b2fc002b95ff0599a3f1a474fdbc3f958046f603c5568559de557787107aea45d53dde4de7c4b9a009f4f454c6a6bd15fc9049cd395c43c240cf18a49cf446c9b5cc7df6108166d9dc3e30ec261fffcee449b2c8964c5c27de690694b7144099f94aa8b061354eaf400ef14ae6d2ae484ef75d4413fc080e6214d11501d940fcc3b572e3660344d717e28fd69bb4cf4ae3387b95d495960a6d105719cef6966fa55cd2cd41a4ddbe823891d606e39f3088699893d1f11d23d3aa644c8eeee8462da370cf4b5cbe0dc9b592674b7ac489ac474cc48e3ee8ac03e71c505cbbb204d1d4a0ca67381e2da4705de96cc2a21ae0c3b52316576cf7a4b4b9a443f985637a9ba88acea962e0c3efab0420cc56c9e501ab12a6584a9504cf389558081546360f687e3cb7e1c28400bd0b17dfba721de231fb873a46ad10818545a59a04f58854fa8287e486bcb7ccdec9fd45e4898ee2f048b25ecec7916fef910c139bf0c501346ae40502ae5b218e5db58b81f98faf6cdf77dfd8ebd51d9cdee8bd4e25313ce0a1bcac63ac60291cd2dbe430ebdb4200116f6782ed32025bf51b8b774c2027527fbf5d3ab15142fc63849daccc0a9b34d27971a6b71115413ff2d5f017f02db57db88f3fc6151cdfe7839544dd44e27865f0876c4bd4f3003fc5265cbd2e81ed8f8e480b611de5553d24d8e5b83bd2bceba353acb1adf93e76c5360de91ef000fb77958280f31e19f8fb42c143951cdc91c01bebe83c3a4c0fdcb43aa63c08abd644b320fe515e60592dc886fc01f0b887b65926c4dbf6a2332db222460fd324a46b1cf62dacb697322e340cd2b39a360bd0517d570a335cdacace168f5682dec53eb1d6292faf3f70cd6ab51f652b9b8dd34712b8970d81ed407ed6626fdc943b890eb085e32a2b38219bd8b9dbf3c0abadc3ef642451340a97aed999c1d9496fae05735b07490f00e9b843a6bdaa73d01e528a84b402ca9e255fb876c5d29801b16da8c24778d465ca45640b954a8363dc8445553932a2ac7fdbe43f5aa9b0a42dd129fecdbf89abf43dfdfb7e1ffcd526757f0b76f08fb00b948c66e56db93b1a6b8886fe6fc73f3977b181cbc68eb6c9b05ac41a088aa7ccf6a34c31c13a769941c68d10c77a7348680459951d2dca0801d08156c7d36ea3497682cbad6e51526d9ffb78191cad2146bec5f026e38fb754464160032ed4376eecd9d8115f0eb08dc81db697e159739b8402ec10c1f6646dcf703c66bf9e6bed10c78fc201c61cb3f6ea9785192f178e590f0006872cabd01ce96c70a030c070361c0e281c6137b63f3a4c5548e7921ee970244b3af10f938ede8fd2a1b9d68d2b4052b8962824c4fb6d29322f6807e5a6e78cf3b29e0f3c0d276197331de70ed88667be4128da8d62a07b09ecafcc0010967fcc2c10471cc6d48080a40ea1071446447fb83c43c891affc5498fd1119d5ebe50678dc982ee88f9b21e2a849dbf2964891367642a295470c770828f1bf2bb15dbd2974fa19d91fce19ccbb470c38273e8cbb5201d166ea4d22260b5d5862eaea22b60df2df0b24178952215b9bad9fd29de4598bbef0bef4c56752b393687da8d8e20f9c510c32cf1b10a537e24dc69480fd34661e6ee43e6225c37dfc8847a745a8431dc2166210ab07fc10e1f1f09f1ef881bc5bff2cf74c811cd0524f6a0f91892c9fde5e92bc33767662e285daf829ac88caa325fe71ad6c101b6549201cc8665403d94030c06c56f58499dd7647a8593238d236868b6b93b3199f2716c9cff87641157b3139cb88f72391357cd8418963a592502982f51fbd5eda0d89339b3a9d0238a9cf2a2172df03b616531490d820e4ea38f6a24342ca014d09f939ff8caa04bea9e74139cb174d4499e471cfa985dce45651870d1a555590cd911d96986dbc40794ed56fc1edb33fc50c29f35352138dadf42f54dce4c179828723efa87b788c797de74833778bc5d16e0034e7f2f498a56d64fe41821981e09b8051a559aa36be174aa34a18ce08eede665b559f8c7bc54cfa50f41f527be3f8aa7e84e88fa2de14eb91a802eab3ae77d955770dd2ef12cf4512498b98878e5f9396040ee1d6d6c335f68343f10899556b1c60a03f387e26e947c2b7fdb91985f946185cbd82e763c38db0609e49086f199c53fb2cf0dd2a8213c4a9b339c3936780d6167f3095713663869104110ed00eb6186897908bc3209cde38cb3e20523065612e368383fe9b972d43fc362833b3e2a008b5556b7c48736f275f6d0ef6097bdcd9dfe5da9b9fc7bc68dbcc484fdc7c6323fb0354b4cb7d89be2424dc3e90eb7664f435f897b511f63f9a307a9f86addff2130e3a28c1d47ef78d45e2f58968a8580afcf056c0bb0909966feba0527099c38184521cbf03324494ebb4bae39e7d4632846774d538da3ca3064f54ef6f54aab597674e643b1b7ab6fe68c606ac435addac0789e78d277f40dad76ab67729e5d088b906e204fdc97fc3a013d27490c6f43435966fe35c85c202d8aa202df180319facb00ebd233668b33c57f7128e2ddacd0a88254091e2b5d0db122192279332ac77bc438ec65c34c3848fa2a55b28265d349a7a16a98b403ac08c8b06bdb127cf6305118a2d749a28ff29c398b73b3281a93db4dc0a2c87824c885221e9f285beaf7e708aab207c5cdb6c73883318b06b2e4a09df9fd2184a056bd4a4cccb9419365bd2894dbe4a244f6c9a408191ba0bd6822abe564dd3b70fbea1fba2ae7349ecd7f9164ca0fdcd24b2a3581728fdd661efe8d68dcf3693c7ad56a7591ebee5e839588c9962bec7a25a9c30e71159c419c552b10009c45042b8134c717af00ae7bcb2624ae5846bf77849334f5fe4a5388d45b2542bbbd285ebb63091c11e6801f54b606eccd111b68b7e69cc1aa45044b37bbfcbc27c406f54573fa97df0a287b4bb30c22323c1e0c3e1145366fa6c63f9d7abaff603ad223b04b3fe582b818f52f59ad84631835d580409303ce4d507f0688901b3967492284f1548a346d0a9e35bceadd40a9be0f2f23edadb8dbd67de0cc99eba6ae6858455d91682650eae87494c872265a84a71dfbd87abfe1c8d2cb890cd21dcc858407b81d94eff9a292c3d603c3097432ac3ce71737a958bcc8d4338c43b1fc9e2c9f6c79370fde21d30059543995469ecb59252f80f7b6a5af2e9e28ace36f4243980fab113f62182c12801b2100f1f5eaa2add43c37bfa3d4458675b16b1e01e0f7236e1494ed94c12ec17bb9f8fbc047c204ad36c23a1816e86fcf80c8ba82d155572853310323f92f1f43e6475b8edc06c7d452c28496d1fccc327c73468c0d3aee12109e64441aaa591015286a38adccec9898d9fa278cda50c6692c1cedd5270c75a94b17e29a878fa0ec4dea036a17a30945941aa4328c501679a6a3a0a642ec46d5fbc84d98417d88c04d121cd8ed9cd32f4e8dc14059533a13ef20545ac16a9195dbcc32fcff8b926f009ec6c9e96fcd9fd21da99549be6b599b9a91eb9b4488f2e8471388a45aecbda1240b7ec9dce6a39e25d9d97f57014a6895cee1b0f6db888e7fc35189c822e57a1f81a7d4e49d11f1d931651306fa74821f0202da220403e4e62b02eae9ee758bbe8e57b604e72d6d3f9a0c8bda7287af47f29ac3af5eccd81fdf0b7468c10ed6042178a0426b203a1fbc7f908198092acd25a857d00bfe466fb251e6e72ea7dadafd87d188ccf3906acb0886074cb0579c1e14359ec8e2e5d53eecd1b8a1423948409044d7b60f6d1eff56ca1cf6fe28fc61a6a7f928649a50349e96f30c21723a4784c8e29a2361cb249318e1363bd28549b7af41d2dd9fe63d337f4f5ef4a7c08bebe449d7869e0c7714415853238652ae81876d4a964d03fd290f8333c8478c85ffe6a7a60b36885f59d8cfb1121c9cf4c95103523cad763bab3de4fdab5f4337d521c06a761f4422321c4717324c4f26ef538c1d26f1030d57b35c071e1c350c960ad8c80b36c9b2cb96a0004eaaa77d181ee955cacc5ebdc832372ed2d68a68ac9e66ffe0ec21e76d82f9f2e4fde41a3329e0270824cbd1cfcf70a2a88862d78344bfc4792ae9603454a2887df3c8e5ac9d913f8edd23fa44c2e55380015009cd96b26336b36d47423299f2705b77aa964b664c91ac15826770dffe36eb18c5d71e4c389ee20a02b512b1400c9e789f964d9940a68e56e27e4a526b2b136c8561f3d3b6925412bf36bd2d82455625929a3aed8c8ca89782235f4bceff25fb194bd37210e4bd87e981bb6233b4a0e3b29ee66b294abcf8fdc4a6589ef672b93de26c5c295bc184ee6ff1a2440fac593000a2e22e1323d7d4a2b2cfdd597f1c258b59c581729fd93e5ed13f84dccaf6f1537993f7cd85546e88f0d307f7df147d8aa040bf6f1adccd21e4c46581d916ae2d52178967dc7f901ca6267e394e6f762a5964dae4a12fee64284abe2676aa183a3fc51c1fbfbfe203010d19762977acb89c2852c6e8a0ba8f4fdd44ccfd6dc4aa90a9b555d830d0896e16340a7027033207e076808528a05d80a2f7305801cedb1f624f58f5e079efb5207264a909710054e78104319a6a5b254f24f900cd2929e62a8459718c8043a2e4d4954ec68586ad4cbcb61932fa452b626147149cc059187e937b51d1b3b0a0a750a40aec2d7be421f6681c34cb98ebdbc4537ffb2d127b2f7bc8e7e9172b308c5a69c03d9cef77d10ab1f5364112e732d78dde274c95cc37d818b11537ab01b01d9842e217a63a3646434cb2c8f8c7d6ba52cf6166c25efa521daf83beb4746be0fce737e4d0440fa66e0ab4900506e370ee4e122a197add318e24a0cd00b705b32d1906af99826d372ececc193c5584d8c6fdf52be80888dfb4faab749dfc3a8b6c8bd8a14ea544e16af850a2249174a45497b6135ca4645ca5933dd9e12395ea723fc4f63681a6bf6fe086a475d7ecba742de48e9c978d396cf0131f7996f242684e1e549c467a9794a8a3c2181d3caad1b3d4be1f0fe1d577c649e9d6d86426397ff38ea95d3d895973cf52769ed56234ffd209a66c220ca9be353c3cfd0c3c16012943e5bce216ba4c7699ab589a2b55c5c6b87b4359b95bbffd3239ff40491b06f65581a432c070eb06c9ae66ac36ae3fc9f2f56f31ff81d3dc8ca7c4066f11bffc4f05619923675156d3567ea6baff39d35dc54e911e225f67405b9e5d43ec0afb4022939be3a54a004618545b1cbdaad43316930c65e84c89e27342c0dceae51c9c3a6ca786c2686879d1452e2780b400054e63fd0d001b99420085bce200f50ef073c1f432c79647acf2074a031dd314a4b264aa98706536eac1091e5ce02b369652485a8a9235aa72ed705982c4a8fd8a2acc72e32be7dd1f2491865758d11646a1874f034b335ba921d3fe487eeb1e207e5e764297e3c778eb0e287cccd7d297e10674ec622d2090cfca680c066a749fb7349020d46c8ed721f283726bb1372156b666cec43b1e669913f12071c3eac272ccd6b9a61194aae10cb2589aff4772841cdb8964843e32036f36b15b49e844102227b1e86a5cc37a18bc686f81f1d37b65c5dbe1e15373a474d4c8da7c637cd021e57ca00c1bce901e56e49cad30322ce96458e593235ec892ea7b0aafd2c1412134fc88fc17b00f0d1cacfd045316acc5c164fa0faf50ce5afbea52f47299684fe02b8fba1216ea9672bc282e5b2514338bb76de7446c5115588189d649f6e1df777cebf08ec954aca95ee7506c0169d9bc224a77084fa93d8685e077b89c60937057926b829ecfd969ad96db7c4b634706658a955f3a81229d231cd5b3ad2990d09261d9398f655021729bd705bb9a06ee11213aa395800bc60be668a8d04c943e09336d099f038a72913a50c1602eefe9557c84d83442b8c600923b01c5be236737352eb6debe7f02ab85344c75a71734d27adc96d591d6eccbd8843330146eaba4e041496d0408cd59095431715c518d885470233a4683467235ef04967fab492192f78956b7af641a1d6b694377d9ba814cb2d678424290f47d60d2909bb9ce24f312d395909ff3f42a5749514a068d295a1994b7722fe085236a0e12f8e5a4c4630616e61a4e0696c066277a9ed2d008fa5ce5c9d33c59c49280fc7a06b52b3d40e3971508a5207e6a446739e05173dedbf392eef769c20a3607b3c60b8c5cea0dc3fce7f7fdb84c713b42667c38eb89a13d56bbc2559a395997be1ef8cfef716265b0b9e311ee1327c2109bac4c4df06b59118a27768169a86dfde4f7d34cbfc0538d5e1a61014ead2a23c65cb42a29f25a9f8da94b945aadde7bd2d8a50ca4ba966af282923edf70b01056a9318af343275a9496ab04283220897e28c7859d1afb2622f2b3d018d69bd42563c83b35e088f335aec8514688671f996bd6296c28c1c5321899611781472eefbc0aac08f0e122a4761406ec99e2c94218a749665df14c9206aea886ab8e549d57b6f50ebfa8cda8f627989ec72118fcbaccb9ea5521db685baccaee058306cf32ab618d71369219d49ec221511ead929a52a2627a7f0c8f62bd2e7bde3f20817751492d02ebc5bdefdc9e3dd9d3a9d3d89bf8d3ea5064a0c9f52f669ce84f70cba9879ba1968777eddf33a19e0cfe9ede41e0a19a1958ab83773e25c09d166b6c295506be65ae6c19166b6220f05178855032fbaca488644398c094bcf45d93c9720c9a6bf0449012de955475a704a900ca4878e2aaa4597144a1095e599ba60995bcec351e4469e80635c6ebd781f997b8b58eb3abcb8b032337e904404a25e80bec4386c18c55b6303ebeb324d9549902d6b2ab170f4f3d97a1a7ab7981751ae31f8d5c5428471a43e0d77dcf160ca8464f44af436f3b60ffa4e69efe47502bb01408825983f711580ae7645f7eb3a55414f39e28b8483c24811b9a34302a5284ad2b8b2198edaca71889324fbcc910c51434f29aa46878065102ded4f29a3cc383d578eaad516da120f60e751ebeac48b8d193728dab0de53de919c4f938a1b07e78e11fd720535409f30236e6df3d146c9fd11638a9d9a3ca9dcb3897bd28160f23b96464b120c3d5098b23061cdeda15eef8ea489da4e0b4af38f29a605408515d9b04c9a6d29e0b98185c472e481ffd3a52c26ec9de3794abbd36d66f3947004b50f050a6bc6c366b13e8433f03380a30c502162133672b719c807d36a78eb83ebac609273f8c42850ce19421f7f6a69f95315e9017f303ed81fb82f81e3b318a1bdbf3c660ce0f2933d2e390ac41ec39f9dd69f4a0a5a69140cf00b996182c1caa4db8c6f438a14bfbf64b53adeec4cf0c8a26bc9aa72c1d4f7dc6eb8c42faf3e118459c47d14b40c9c9d7d40b4ae46071694dbb1e99a89d231424db4113fae302e8d0cf7bbba71867e187fde72b707e520fc789ff7b6a17e914d09429c3a0e7ddf180b93fb47e52a2e3eec30d4b020410842b7a37d9c8e19aa13362b5d585c87ef8570f05ed89cacc3567b27f7640a4606847a892efa08bad221b9e83ab58c0eebbd726b6938872986523b59b74b2846d2b9335295e285614060569bcde6bf5494adbb59c472f7a4524b4aaedc8ef7e2b5dae5102a4d9201786d0974b08472a814fc904344379ee20903e69fd6a8d7ff29f229125539acaac5f299ccaa9a54aa1017ed24bb215e40860d166e1ce5f331fbabf846e4611cf5710790181992d0d8202a36cda1fbb21936f33a35d352db9789e64cccfd59bf4ada442af3b4c57abbf5e66af62cae2984fdafc7294c4760ac47e56c8d481e5f9fe1cd04b03b9a7fa5c59ad17676b48514d240a7371ca93f3d13404b8c864287cf50fae9e182bab304eb9ad6d0f54b65199bd005f4a8e67a37073af5f10553a4003261d88610661ac8a722ef05b107bcdc63aae2b852ee0ff862567e9187a2c553b47949a5ba6ae53788bb1b89fb18e8877141659c3ad3d25758b1dc58bee1c3b6259440fc556f852a5cf9480d2c06015a8fb70e8b6c6fdbac07b4d5b67b47393864e6bab6a7a9de1a689d698164815c10f6b3a386ab5f0258a262a0415ea68037db7deb0c7068fc7b33edb3f50d3a2f7b760a335e9eb16dc3e283a9b4b4f4fa531252439ad2ce7761089f6a59fe16533cfce98aefbc4df83fc61cdca2e2c5ac4fb3dfb813593b35d6eb49f37138f81be1a26051b72b320d61f067f13f88d06df8c6b0c32607e128e89e28435bf8a09a2c5891257db05616c9a287e3135c438e7f435f761e4d470dc43f2b99263790163b6138707326ccc81d0183ead630522de0f30d1c23d7d13dc8c8d8552241e699a740b9a269a942ea102ed05c93abe145b44ff1f2c337855d3664904fe77c3a60068d76a8d6f1539e4e38983316ca4e3b1c40d22180c903c4f241be3a9eba14be6fb2e917894301f0f82b9352e9d2ac10e6873fa18190b5d016f63f5753c9bde70da00e84a2e04dd14487d4414d348f3d0740511d8425dad644a5816ab0797cd7d0d0ad4114dcada96f2bd5044d0fba9d28295fe232b19e8139767ad4fc17acb58cfc2700b6a20eb17fdc9746cd37cce60910e2399c3c3bf761cde1ec1d61087ef3f1c143d011a36f112c55ff1d17d12ab6fdcac4e36fc6fd08fe8eba1133ebfe64b501c6974e79b19ad1d7a517d3e385d2529a4ee912f0485d41cdad884be8f4736b0ec23226d9b26845a8b05de7efed9dd079f8ff0eb23acb80e14bf36b84bd6e956955c5c821b7b4577773c27282dd158e728b4812b7c16be050d736ef5d081124530ad1545475bc0fba7cb27dfc9a71d6e03d172d52aa1be0389b36921f3e36054b3571e57f73e22dfb088887ae019b89d3778ab0907fb3a3108d1d4e63521f746cc0945749e712c5d7e514b6d9b43681cd459484a4746c715608e1119b83549fa754c193308f450a0eef8b4bd83717a9ab861b2073e0634560b768deadfdc69a06632f3f6c6d51d0c222276b0aac9b656e7353de2a033da3b0a95ac92a99aa3b05e7849775529757691dba208a589b25b63443ac6f0fa48bb8e5fec2082a4311cd828dfba440da2f9cf141fdfe0685b0ae37a127e7508282d67bf1e89720985050a3753611f7669e2a976791538db803444bb9461ed18e892825f497eccee70628839964022856f44490c73c18163311e58e1a0dbce731f234154876d02e56d2057abee794bbad1a3ebb2d57be2d40dff95c30f7091c5491226ca5c8b6e6600a22dbb69fdf452d3be4eb5baee02880d9e644add2c76fa6a3e9c9e5fad4602c8d9c305909b91603351487973ddbe86676177a8f6f610b61a9ea5ad7711020f5965264f10dcd973eac6af98fb80aa2666c37f3c5f3723d613207a066087b134965e5136ff12bc8673cd57b8ac1a177230356f05582132da5040b75dc57a828dce26926f742f124fe53477bf4c5253b132414a22c2c04d4434b243e2fbadbc52f46d30feee6b13d7e0d859c405bdf24c3b8aff304824d59a780ea4dac27724c962eb61d8c48da43326e0a5e99d43dca6c22bf0308d5de3d06d81f19475e70d047abe4fe002426586bb6c0612061cfb5d76c4c7645662aaa7889e28258ea58e28ae5751a8766d73278449e472e79318676668a7ee39e3028a59f4309e76adb7ad47a50e9b04d3005e9e546f78f1165a12deb570f61dd7d2cc88737883e22c84e1429c5a5b7df1f6cc49d0fe3e0a33d0ff011232c3affa8f492624960b1f680f5b38362e026f2facfc2f1749a8944d5e789e3b6ecd161aaf76445897484eb2601431ca147c928e5113b84f2db602c61592c32f82591b1891587993b7c75ac02c400ba2498a6d91ac6c2f22d30d8b8f70a4b14575eaf41debc8c40d5b519813f292966167b90ccc8556ed370ea496b1099224396c1c18b4f6c1aab71fb8226c37949396d6db0acff7c86df0b2c7fe6c265c683f234750ba696ac9ee05491b34a91ecddff8f73984b9e879330c2d0d918d91c46188bfdb3c9429d97e6cd2bbb2cef93f0938f7471dbd8c53fec6ddfbc3b229d5b38d71e1f5b4a82c45a5121218eac026fbafcd0baa32e3755bdfa1a79941935e1054baefb04881c2caa6ddfa59feba253462245c77a09856c1f9f78a3b9c608fa09aa792133d4803bcd74b47bacecd129c2b9171bcb9b6612531cbf5e27bf12b10e03ea23d1aba92f832c52abd07c9402bc2c0e77e0de71e8e3bac20632c23ab492183a9fc51567dbcba171ff37234045d5e981255ef23bce8daebdccf0466cffff3101e4f7745fe434fb87257711f138ddc6280d21de18971327b5e4549c211157d22c30b52718de675a862f0521d81fa5b2842576ec12b7f2c1abc070e042bd32187a2f1a42d313fa228829f42c9d3269c32aaa57d83e5ce9088b09f50e1f2c1633f494395f510d15fdac435b587d9fc37183385dad9015e18cf266683a87d319e01e569f72ecc1db51fce47213e171018cd6e584bacfd00057d28242d0be42fea03350acf413ad4150e5c34a1a00701d5434f3736f74e903a5e97f749524c500f1e6661a916c63d95c2d95d91d8025cca1c81a4fbe16d3596d9098156847e8edf8b263fd95cf68dbc79af06bbec2b9ce0c22256ea28f983140882383848b4d8acff719e4241362f55305413e29423814622bf8d1db6f2c6ef5814f9a9b2463747d4da066952c97b52e94bd75f37a48ceb9303df919e29a1cf5b000fb088e9fa541cd5a3c9c9b9f0e97f7c13d41f3f05ad122fb46cfdf902b890313955a319ed8deb0e30c846a01617b2a7bf4d2f4671edd295507c8d05475681c23d70619d4042c78f983bce002dd1712aacd1a360e134fe0d11ec846cb9b1eb1903e9026d44e1a956de33f1cc6573671b9c66051eab5a76e3bbebd7954e44afdb79dd2af4f76125cc8fc4a401b942e60c5802f4e9f089a2e5f38e51f06259b4a33851eb9bbea5b9d64a705a4e3c7c084cfabf72da7e4fd8bc55e737b394f745c8f4eba29c24c4dc92965fdbfc7dad8948edafd553426b3143dfce62791530a7aa981505c0d49d5726f91eb7e754598a41a632e89c54f543a2776d426e6c7d9c6977fb48db1a56b38ffe9aebf1d8c4639b2ed94313df47881d3d5ab9caa2bf206c227ddcf43fce02fa8bd53af45d0044581a713122324317b45c47b7c3f2adfa195dc5d3c6fa80ee7b16ea67b76938a253fe94ef14510864cdb538c5fb6491fdba42d82dd2dc2de7f19dc8d6e6311154e80f27a7301e53c754dfad417c880b5f236eefe8a124bdc19e25469a87dcbd404efd8148063171cb39e4368e6b7628a63c2c61297d299d57962e3118610b0e3628d35133f6451f3559796f8c2727d13a63bb8b915a93b10c9e2c69899637703888ce939657ca3ac20e30536d73067f45b781f62f7d358e4af41a1b1ef139a4fc276554aa30ec27cc960039bb632ea30e26c1644356c569af394440dc1718367d4930d207b7e488e60dde1a2c8035ff621368625fa4f208711027e8120e083fd7bf7661995c60bbbc4970fe38a65edf5271053e221194087ab64952057506ce86dcea6fee1745d1aefea166dcebd2459d83498ee71bec665d0f36157488dd6d3af237644d9d25272285775abb87c82cec77bd605c02ad7874c4f4d897fb4475959146e1b53d2dc106396ed718ea5371707072018dab3d836d37b9644be0d9d347b6e34acdf0ff84dd240ed38f09d57109a35f0157173d5dbe64247a8fcef8e6fcb6074794688c223acfe5037ea3830818f7f946d6c511448d4c7d96370c02a9cdfdb2edbe88e0a5ad232885f29ecfa741e6065a9983395212c3daddad2d1b50d1639a987113293cd6c7e066fd3dc384a706179861ce8059697df18a3246b6138a6ba006dcd1ff4589e331c348e9314ce7196b1cec67b694a2f00961d434bd6ffd31cf4ea55a3968aa1cf7a4f2305e6a939f0b1b8c3c1057de56e40b7378b0a8da8f016d775d46bd4f04d0b437f5df8840ac5cee3bd624ca97d9e6f8fa469562e568183d0de685b4a0fcf7741299a8971a418fc323a5a240e14f020850a2afac2d966074daee9f1b7104eca0a0ef344bb3d2183bc2ce693a81a9acb804498b1dc8469df25199132d62825b91265a9d353eafaaeb2ae30a626d153cada29c344fce52d44e766636dbf0bcacd2c4b9ae6f31e37784320ba3fb7e2ae6f9fc1584473947080a4a16c9edd6c5bf1d4dac1194a89ccd6590da35d8b77255374374bb03b4b67aa9892cef64ea41e65e098758cb45c16e7a4d529026a12a65a8538779622e9ab1a6491b76969446c9808a17c836dfe018ebe6f0417f55fd67d6f562aac286b9d1810db0bb06df95559a6216d4739f68b47e36dacc549ecf364c465d63e0327e9cc2fa545630594391ddb716ea91b7d29eb64482e5c7b9f173bd2c917fee0b422ab818b07b7772b0cad4c7863ebe7b0d8f8db3a4b53a09ddc20907a8c6079f734e0ecbfaf2c9e6430bb30fc0d9ced86c6036ac50f4b15011142519908867d82b0a0242d2c01c683d0bfa071e18e27b4ad80c085a500f27a595b9c3614a709550807193c055a135d28f4ca2bbc74ab2032785f5f30ee3bd6e2c45b58a171dcb48a622e91c06e49b996b524a3d8805fb4b5d1df6f3e7cdbfd0f0641a5023d01919a4d4ccb8a593dbe86d481a0b65c11306570ceea9de879f85cbc48a0b3a2d609c72671033e0906428c56a941a691ea7b050f8cbf4544cc3f61fb65663025aa9d77015f290cf5cc0b4a971203d5176a95ac17b7eafaddbf350d1aed26cf3162fd2e718d11cd2af2d613c6882c390c40147f194506a8aa8619bc61c9f07088823711eceee155133f25f175e7c7a680be75c4883372588f0b08b09e8e0ca0c2889c46f89a16114913c6b8339b306fbe43f701208c576987cb1e760a5e81b549c43c4ae79e5be1077506e9ca0040dcebab656b1f5fa5b94dc450c2a72914af2f07b7fe0bd16a666ff480fac5166e35cb86fcb0119cf11ee23ac1d1645c1df32815d136b1a3217689bf4a58c805ba033874c4ad84283ab0ddd2693eef96462dd902a94826ea4097f61972dbc08d57c4e843b941749250a20b069df99dde32dacb1bd7bef7899b1e1cfae9ff130f59c140913ab9391539f409c0a6af1332dace4e48a7f00c113aceb50aa78991aee989b711253add09a13a43eb5c1fa52bffb7a9def60fbad8e0859b70296682eeec2c4421f990bacf05fa0538d5848818990d20eb3a6185cd971c221870a8ea71124e14e057e3a346cc17f0ac8187aaff97f4443cc398934ed2fd59faf8e8df11d02e48abf77566d72defea17ac10d910b03676c56e18d09938338aba8d9996bf3e0a2594846703850b8eaf715030cbb25405fa74aaf030676e81fd858c32c8e653c2b77d78c5a567bee016e26dd166a75454cc03ebe97c199f267ece51ac69ac9024183ba0c701d569ae9987d7f2f5be9140ea92f491d2f6056c0e4a5d2b1bd683c14d12b819eae547024f925146fe6681cf767686eedd8e42fdc71009b9987c9dc1a1c556b7c85689f253682143f0a6cc908861f10b2a2668e3a81c49c9bd944e23429f639db15e918a4fa93fbfa59005e38badf10ce47d1106ca978ab779841e78c4d267296bd7ab5e04a133e92b43c3685aead8c944502c67c00420b1d2d01e30fbf64bdc1d21fac30f40ed8019b823468ebc463f9a298047bd3c93e5ba417614dfbbbbc3e7483f012cbf886bde1bc3bf2df3bc8ba05857c0af00b2602cb7a3f07a385faa5180892fde8123891deb7e3c5ccf7c9efe0a55bbda82a944151c319aac45e4cf6c0ef1875f008f6dcc8616d8e23e891f1e21f7e67d3c54009925c590fc4e04005d3b02430b9487220d71e02a04e4eb7e84cff15608679d233e3c4a10c785d3694198fdea34c78eb189c1930c9b2b6c70a828a367fb9cfdee343eb745c29c3057a1d0831c39ee03903767541948e9dccf7a6677f1a123104b9e50d948f69f4775529882b8c3235ecb8ddfc37f32dd7cb34c62e643cbf739b766103a45ada3cd2a66b5c9a1c5063626a4f231bae2c6dd90f4390b91469470ce7ae16c5956bbfab3b4406d0d5dda81c566b8cfbbd13d1c7a83561f2bf0ea66db82e5c3ba21b3cdd5ba24560983594aff86692cca17959a5756d2ddfa382f30e0d229548c721ea6a8c6ffbc4059270054b675a4b9c1809c7db54228a8f431fac587958d277e05ccab6a39169ea1c36665ce444e1b88391f178c3c68b4237b524e0e44d46101dd83da8043264044b810a1232779a7901f1ea0cf717b607de9a4b074cf52b5ed6488a7df5719a2e2c11663692e4332ae6541a970b13007ab392a5731c297c07b5e0b1b6ca4f92fb75356e8f7ba223f7e55c6ad09fe1ea31c23c41aa9e9c2ea3d40148bb50e85e05262d75b4873a0e061dccbbc2c177909f9e6455abd89652ac4e44f0438702181ef25e554c8f1fb16034013a77c3a67995b390e99bb9a91c0e0abe14d6894f894479e18dc6eef03c3a2b615f95887ff275ef8835d63d8f767558997701ea116188ef81a5ca97ab116f569ca9c53bd597847f198a5a3d078c99aceda7b29b535191af995da6ef9c30f33da3ec9452fdbb36734a9e7bc5bce186665768e4ce35644e062f47e63441d010fa6c002da87fa27076b0e91fa1f498f59305836b30f50a7a8d5f5138369b549770a02bae10b2179a36b676330b649a829856e000be938653c4bb86fc37374983929856cf300afa740475a7884c19bd6c40c84369558fcc1a010d9276f0cba37ac2b00063b308aba822e019d3f1db85e1dde1792e3daa6706c16c7e74b03cd2af8df53c4db2aa1ad99cd136846ef33183222ecd1ebc6de24c472036c2d217e88495b3c703ada54a021a2e9eddd4a4bf6d27b027099b869b8ae46743f07d1838c48508d2d8be6735a9ab0f105a40acc3901bd917b8acfa1d570f7e30859e1d4fda0ff531992c0b2bd6a7c31244ff11dc3dfccb4cf324cabded7f34a8447ead15d47476953aa38ff96ebebf76d612a323e002d9d4a12ccfc014d4006fbcbb9bb11184e18209a28691f357a19c48d72c63a0a6cd223f125d101ea1fddf92fdb9d107bd468706227526fb91c22902f8bda86e3573220d3f7d40110d8f74f132fa154b8286421aeec02dc54b421948cede215ea709efa60aa88f1b437771d05cd4e370d44d63ce679c8050637704f4e448bc80ee32c01a588449e9583c3f0f75f7b600c7eec665a11f7620576b8c380d843c31a1be3653b54a07fdbda685e7e97e134adf56e36bb2b079e263139652eb0305d2beea732995185fbd90b10e2e547525c612897f0fc3f426b09d9106527af7a0d1674f224d5ae16653553956e6c2175b83c208de0634f6c93f0832b3cbb933de5f2614d71b1e10dc80a141b1d829626cb02672073814e59c04d01b074486b31f8cc3324aa88bf176daabd40a971b385a67e1a55c34129d1a00f076a36f3db3a999a05a1a00b47315b3756a9d3657d66c2d95aa0ebe9aa0cdee312ce9159e89796171e143ff7a08f8dd499de5a234f833d87d3e2e7b7516ef5c05973381bdaea1e276d2c7614788179653397cd8a6a29296443eb72eae7de3ed287e8403713e87abc8a1e4af48dac344f92790b931a946d839b655f03db419615c490fd464d31d0f07e46e07da6adcdefad28ff0c9e4738052b9e95cfd81053d9a9855153e6a9b9985a9d534daa1bb28aa5e0a22fc22d09437ec524ef898126b6cdbb07593145fdc4df09a04149289bf21ca5bd92b1b27dfb1df8f766ccf1afb2b8f42a074af233ee19615facc18ab2ee548ba02eda6347e50ac27c4871e90678282ce072c9059866b651666866d6db0e0412394bf509c8d9ed4c3bc636a1d1cbf50cad798612e5be2887769e25faf124d5c2aec77f3789ad3840c43628e707ebbe3f21e7f1fd731d8546210c231d14330252cb9077dd361033eb46419f6bc212b21723a9dac45a29cc6a01822f243bf4621e379d4e826be7ba01994b8d4dd02923b673819e0eae71cc423274d63c812dedf200f42cb3059a60d21e4810b24844f66e27b195218bae6333c27eef52251c4c1d0ac1b9f8b0ed4f356dd4d4e745bb23c32535fdcdb116ae774ef0f8870aa0e4297fcea43b9dbc17a8dcb34c04e2ce0b33c31d3cee0ed3931e01c8ca6fbe4210b495b438b9df893cc4922cf8b2576801048ad127aca9d4beee9eb11e18ec30bf72c60743db0affd5182058bff0b0bad4c04c7d1548af84a5d987e515b5f526fff3cf3f2910134353158d53079c5801b455dd170840a9ad0336815753ead38b5a486d7bd94a6f7ce3a234f563f9a4dbc2d3626392b54733db137cc16db63fa09d18b6edabf801e13f4e9a612cb3970029237b32e03e55863f9925467679d81dda8239a7356e416534ea57ecf2b5d03498a076ce2f24cf02dcbe14b24ced40c609bb166640cffd4fc08b85c93aaf67064be83479d204abd11630b15ee5623247a661d5759ce4afa8bc4c04f6321060cb054888703619ca80a7a4389462f040f7e836b9b9c9de5bfa689bc826162789cdc57362cf0d3f3a0006027b947534c3d019f4e77ee71f3a80cba1577260c4d8e97635b7d90d82adb85d03d96ecad02705fb071050ca1d569be593a70893cd30b7d2c9c300ac75fe2a840b04aa7db039d0e89e99ca2a485ac092c7e9072104b9f5a0d371118b45e0ca1a2a19a52466e1c9ea64cdadf0eef6a62b2a99212ace9b984dee4e1269176d3e34e946fd4ee0fb63edb0e07ffb5ed24e56e36d167b45f02b69055a69517101e01db5aca3cd13872bdabbde3f349a972ad0792c5ce224aa4fe50a1131acee621f32091dd23dec1862840684146d749eddbe161948566a04afb30962c5d0e0b90413468519ea22c8ee254cc55adf86f3bcd232a933ee127a9181f3c3ac51ec09cbe19201bdaed8dfeca06e63dbeb1ae8d2a5cd5964d08429b93c86e67357187e5a72d50141c4eeef4170fd40915c6127ecdb700aa3ad3ca6990f67101f9f9d2c9632db8c6f0995c52421eff44ae36745c31cf1aaadb1c5573b8320119017c54a5e3aca06ae2778679ed33415a16a89ec3d09f2c8283b46f1ff06e43deff2677c090156eb94cbfe3e42bf5a44721840fe231268a58daf96208475e998d60f523877c89bc21a963b9e8d39848efce1b0c0a3e0e05ccca148571991718327c40ae417b4e5c46c0ae30812352c6a11c88c479e65f8128966ea26caa3acab2cc827192d62e7053337a9ec12c9d1a928fa4a37a6eef299c5d8de600df805d95dad7b1ba9157074487b2ad2029f5266bcdd7f538d25059caa5af1fcef5446e84047bd9c62381f85a7a8bb0fe0bc4ad617c5e268e916d6b91e6c22866ff69575cf23b18382edbc1443a4af740ff4e72e60d107948765e90437c9a89b3c3c0ea2a12cabcedd28f0c091752757cdc2969e37025cd203e3091da2f1c7b536fb247270b13772e343016d80482da46fdca55001f6b2bf0a8f9ab52b4583a403933a3609370aa855899a89e74d9a95e00e02255a8df919c6308afdccf99704f471a9392ef38725baa8ffa88b3899939125e8e8681adbac91757c1ba49454ea6a3aad875d2cd8d2e34015005a9aa2771e08d4cdae393faf907f9c404addc39e8e9e67e344b1739426ec1dfff54e43302813a9fe9f2d4465dc2661869c918821d732c3ff84bb0bab4942a7f906755995fc3a92ac1b650b8eff2b30c77dc589a48f6ccffc879d15b34f2c0a5a0f96eeb75c4e0148fae882901699b48f8db04a6d614bcc0821285cd3325c3842178a844a9e745e23a93fab580d6a161dfc4e196d22e8bb5cabfc7e9fb83a6a9dc149ae85855dcecbdcfe3f095774457c66d26d7affef91e9612c5a6a143f2f088359c1eba26a167beec78de7f3c7044da721643c0bc0062a59362abf119001d8f1a59a0855b3a56cb418e9d792f8ac25056ca035cafff40c4283abbab16f819ea18d0e69bc482d5f0335cca0a7727ccf144d7832950793c0f0454856350542ad4b79948f34ab779f6c2c1b08871d3e9b4307e5314b32bef574373322fe9177be9c5b1ed5a2a0d411b8ac64c0616dc056f5135d29b42d0d019aa339fae3a9d68f7dabf0b0e8857638db9ea3b6c4e50dd3c16697a18872aba78c399e6da21de9817006f64436f1242194cdcf6aef0bb9b4b13d8f58ed28f45ec2bab6eb4dabdda69e3512124596b72b2d03bd6e31896f6f0b27cf6a373829feef31da9290e8b7375a010e4e651d3516bd33fce799efa4e116a3f3f244b518dd0e1a8259b3b006f65514bce98dda109a9e787eabc3cbc8d77bdb08f69e4adde84f54d513940f6061ba423a6262c7e84ca58e313cc3808d0e8a4243614fa8895276c9bd1d39603741cfa9c7602fe6ac6ce311272396816ba3f0cba259721087354cd78e1af2db1ca3c9ad89e96d5d52a3f83b39db7f54e6d314b4d8ed35b48de53ecca231d4f0243322766783e4fcd61e496493f48a38e00ce0a00c24a4a589986b0153204e59c15579714989c85b006750c6779458cd4e886c72b800417a890717b422420d03cc470c4c9a1e122645604f56fcaae168ece361d05a7e75834d1be80428799d99d8eaaddf4f84308ac71875ca57e98539e001458298cd4a4b876421cdb2240b82c53a4a4cff9bd6543ca8eed1a26391def16f19733682f8c310019244e5dbbc62adf6c2e4f19b55a12e7a681f647e868186cf0853df10e223d6e716e66d5624473108786c820a15e7b16dd1755588114dac2ff6e38362c3147518b1b23c665f965fde0b102b3fef7398913e7bc9207c80a74f8a558b2acffdc4122bd8c3ffbba0a8e2edcf198e2009aedf579d14cf1565bd5a9f8de3ff9a633bedf4329539e2ad5ecd454f767fe1ec3bde20158986e70db005b212783fc55ddbb215f0c5a4169bd060bccd8cfb421ca8a48e9e741e735323da23c7d2a74ec445a89f50f5bf21f7256199131821ca2f271ed7afc365880674f000771de36f7c32ced0ea88f984b9af2df0a0661ff2fee17c62b33b82a0902bfde21ec8ec32bd231026fa32a67c9ad3e64ffded12e57563ad19e8a5b2016a7544564446715d1051a0a0e4ef43cf2603824c26b623111041365fc7a15dd2ef2bd926d45169d7576524f27b1f0f1a172424097c325e2b7c6751b8fcd28c7e304cbc3f2166ada89df2f1fa4a9afd3ae881e890bd2b6c1bb7fb9872f2e329f5ae303059de42ed750095fbdaab806e581cdc144d6d325e8ab76b31058b9bc9efe84546b35700bbddfc66df77b1987e79fabec95318f1771f5646958b174c04bd173052a121afc6f221cff52b4729875ef1626f600a54d8247fdc49e3c2a0bff7a45b15f708908c0270b4252cd9ffc659b694b5e676581891b17bd5ca2d2edb861acd87822d2eca618d649b087fa713c3ec30e715fb7852125f0be672f4e435408213b56c741999215f235171b2209cb3c289675fe0d97ad6db2d8203b1e316297f124f1ebb2ae4ed1c1837d9eedfb6f381c43b6170db958c78a392002faba0e50c7c8711e28dca0bfd8ad81483dfa03fc027017a28c295f32d0aad759efc69bf341c3b61e9a0d83a2355df2be4f11271f732c7e0aa4af05d73c7c12d534b462f1cc5a44ab0eacea035f0399096b94b4ef47d641b5cb1fb6ba887083434d36113944403040581c241b018881b278854766b2fadc195d7aede115443b26fdb218e2927122cfa957636663e300450a5ca33fe7b3fd39b5606c68b063f362cdf0e60b04b52c2107c8b706094a47cdec7c35ebcdec08c194ad741c36e99564b5e18434d301c0dca6ccda83b2b09a8471b028c02240c2c00fb874e1d7c17e9b84149912ee5b0208525b8a916c8a9761ca5a46f2db547ed1e1660be12478999adbe77eed76dd1a4a6b9f9f8edebb0f21384cd08fd2dc37fc44265e086d0f85b36cc47e04c43877521acb8e36a0e8bd8a07d10718fe5cfaba07bbc4a917732a3edbe268b18f1c990f637d77f331ec9f12cee3a9ad7ffbc55e0ab8e961c70d7b5f9aacc0c6904ecd9649f846cb0751117572508f2bbc355fc3158787047f288c388dadd682284ff29c71018f9e0383ed3950fae48d17a103ede16c8675ac032c9e474f98a0978b3b91f41a42d00443a4f9401d1de4710f2d1ecd5181537f378b890470d0da2213489ede720ad72326d8a265150033e5cf0524333794dcc0ba99911fbbef7b76e39991388a2797ba9ce56e0583ee054e431c36dc3ab11b9ad6757621bb0a4bac9dbf0cfbcb8f1baebdf25806d9cc0095be168f361b4489fb4187e56dcc0362b733dc0c747d6a036cbce0ea6b9a826da6c83fe23ed9dbb1f3cc3f246911fbe968d29dbe4f88d7b315c6a3faa292a0a1a31bb93f9f61fdb9e39596dceac341f3f5ffd4fbe7457f1034e79457a543ec5198b8fab3ed231dd5a4354336fc7a5fc0529806fe92138c95f57db86d739c3bbecbeae1407437980344614d41cb6eb8f83c8a179d83af9b60edbc7c9fc797009a4399d069a1786bcbd888862e871f8383bb1bd3108b33896f21c7e2610d0a70e64690723528af7e1e1e0bb1bde64b7209e08cbc1c8503974186f194d845174ecb0d2865b7ff68ed79d0ba0210bfa74bbec4999470bf7e39d89493981056e922085048513b22b2b46a33295419385b0ba977b92344cce7ea942ca630e98dea2db2502b0bfbc3f65f9a92bda3c2bf2162fe6c6a1e8100207c9c0d5cbf27dca49a419b89f33767e85a3a52d43cef601e99a4dc3e77bd7062c6ccf25cdd8208c91667eba1cab0e07ae3b087cca685f073009e1e2e117b7886d73a1593744c364c676d260dd59ef05c30f3d885f7d01f3b562730f143cfd031d2edd71568af50fa7bc93eb830a86652a12bcd70383680b73205a017b3b34dd3b4362c11217426c5529deaac60bf3bc24131d6acc6af71f005bcecaa7ba5f035fda23d785b534719bf18c48740611ae096b7c5aeae4bca81b6ae445449aef6231c6785ab63c1acd43e9b11e4e5191089695e4a02baa20ed2ce4ac1803b0aa2207820a38e89a244b6da21439c24d0786e9e0a5939209d0c9d013ec00c42f761c92b249d8087e75108bb8a8465a3738197872fc80236dd0163239cf50ba8766655eb55c801f9a96081aedaa09b18307c7122e2616c101751441442a2414d03df74efa832633567e8074cef8ff9e9cc3382a934c7417c8129a9cf827a41c02cef47aea582e80aa59febc5ccf3eaeff725792d3eec1ae4ec4147f3a714510c13aa052860f8139ea3d57195420ffe85bcb4a458e0d2149ad026bb8dc6565d307c64f160cc003f0da8d06e077c4bec767036387f384433d8454574874e0a24fedf21be6918c5c49227a5c6a7e482bf418ba689e1332ec681206b3639787882776c48c5caccaa8aeeceafe67f5ebb821e198af74b318f56e5868b422d620482e3c2687dfb1f1e739a94a62b3eeb555719450c1f5db60f039040b6943587186b2fe9ad563abfe79808b63da723216b826b8b51fd491115cb13542632d09224706582051196da5b9db76e37815fb715b03cdbbe154ae12f768e52b48b5a5a4b80a87f4c2029a0b7a6658301a16a5033d71da33244c95ec6e7f832c5f2ce967f95a2a126372c76c239025b743ab6b69517a0378f8f2a885737bde0211d63f731400424e6f739f9a63eb357479abd99b023d69dcd4da3e9184ec2d37915bca94924c0176068f058f06ef3b93f1f514e87b79aa9d945292415f8bf8e1c0630002e0d118f4bd14e8fb6b1383644495929330b593524a9b171a496a41a1efbbad4a270308c09381fc7cc427b3cf2fe1c678b37014766b28d0f73a8ea05fb5ee88006a7c4eb41b241b2c2b2b2a2c2f278574d15129a48932cc655e21f9db536da86b6d918300f0189a9f10a24f067a3d3f555d3c4eda8dee489534506c1723d960f115959594ca3f59303e82ee926cf0bacbca11d47ba31b33d24aa25286cd2b94033b8212c1b59f406e1f87d195bacf09dc987d7eee27f4bd94c1460d732ee6dc7e5bbdde3ee3cdbdc61aeb23f43dc4abfbde440c40ba94dc61d04e567ebbdbfb5bfd25b78c3246cb3118dfb32411ed04fabe9b405fca8892e49352aa686eb160fef249b8d67e471b185c592957ca58e459329b8536fc46637c0495cc47bcefc74750af7c047d95bddbbb9ddb6194a16b629968f476d4391f914c812673dfdb65eef687a4eefbee2e842ebf9c65f1c0c186158dae68f4ba78ec4f1b76310ccbb24c24128d4623121d89b2142c655ea1941469a5bcbd71da26cf88fa38df98186812ba7c922af014501434ce094c500212d06ec571a8b46216e3a33cbc2aad1fd4927d2bb3799c1f415d4a190a5dd7ee9c18866159962de442998d8f80cac5f8f5452736278661d8a345342ccb44a2d1882ee991a4a83b52b9cc06c356b2cc66335166b3321a8d7629a5241289a664369b92b260d47d1b78ecd855515159c96c56329be5565858586cd8b071e3c60daa691a476d4a190f5c77635a442d2d2d2d2dd09b5bdeb288ba2315b3b008bd317e22918b1796b084154da398a43c4ca0efb10cc8a8ee53d57d5950ec047363801ffa2544deb7d05b1b04fc439c1119e3bf4cc92aa1e32b62ad587216b0b887da8679bc2451d781ba1bf37e63687f3f3c50e0d4aecb03c4b35d982622fdfede9c89887f7ff73b6722c245ce442446ae23132bf4a020b784df8811510448d84139b764df088b8b3256a8e6963c23e07b3a73a9f7d0f776988f5bf782be19488457e87f81c7a406732ec6430524eaf248a1892bd4e52143a76e36e457bef32ee40d68376a326aa2aa369ee5b19ba6f9c76c405ffed21181ef2404bea30ff84e73c077df80ef4e350be22d9cada9e1f9e36a6b6878fe98da1a023c0f11fd200242b400111111037e9786ee1ce03b991ebe3b21e0bbf7e13b2d01df51057c27ebe82194add9f1fc50676b6476f84ec6e6bb1390ef9e87efb42042be939547c3f0d31cbe93d1e1bbd38fefbe7ea7a1bea3956480df25bdff6ccd0cffcfef3b5b63c3f3f84ea6c777a79a52f3ddd7141fdf69350587ef684d29c06f0acd773233df9d6ef8ee65f84e0bc077b4aaa840f9ee424a4a356dfeeeec64ea7cc984de4480de4080de3c80de3880de34e02608ba2319c0759212e13aaa2d80ebb40782ebfe87215c27a300ae9309e03aea03d76908e0baaf3d70dde9005c27d35208d7c9203c70406cb81db84ea662a069ac20037028ae723f381db81cb84e46a7001c0e3e6a7a703cb84e060a0dd7c9cc70dde9068e0b00a76393e139f5f2927a49bda45e522fa997ef645e36ec7fb350bc6a2929cd3efbec3b992ac366a9364686ad867fd9b2ff2da21a4724c211e188704438221cd1773255868d867fd944ff1b44b56a34528d5423d54835528dbe93a9326c04f8976df4bf39aa839a9f366ddab469d3ef6464d876fccb46ffb746594124d2939ef4a4277d2723c326f32f1be97f63d4a849f3a78c9aa47ccaa77c4a8a0cdb0cffb2a5fc6f0f85dda8b0accaaaac8a4c55f94e26240a800c9b0ddccba6f23ab6abd6b059381bc34fc31609b0c5d4c6f0efd820948de197d9a0cec6f0cfb0f9cfc6f06f8bd2f153c786e3e7c3746c2e3f19d3b1997e36a6636bf9e9988eadf413623a36ed67c4746c36ac9521510038d7b1dd08015d9e317eea0b4795206b2b4995068f9f14fa32122d5b9665599615141414141414a452a9542a954a3e3933518a0e1d2a2a29a3179a83241ae9e8eeee6e15d5155864a152a92696d9a4fccc48a41c3954b6e65051054d528eed558a91b010dcec895f55454fd151b413bd44ddef152c0ddd919d847b180afbfc04f54de3e830d95171777777ab542a954aa5c2c1c1c1c1c1c1119154728854a89652da3618984e51b12ccbb258be4cb4835319bdd01c3c786cd3f0e0f12aa48d4b51e1f08bca8b8acacb3e7626e548c1c1c1c1c1c1c9b1bd145ef18a9df0170c8668341fb3aa5782f8d11c2f23514677487427a33b22ba33a23b2f7487eed02a54fec896658d46aa2bb0c842a552a9542a1cca612b2934cd23187477b77737fc7f8174e4dd0da5e5edde6f4ffb5d7733eceddddeedddb62c254008bd238c10c2860ea14b612ecf3414bfa1afbbbbbbbbd9dbbbbdb7773b0893a1373343070164e61e330f2dcbdcccddfc9899f979175c48f213f41343564ec3d084de53fe81f7133b76c7b5d690dddd1ea384229b61b777777777508cd0e3f6aec70806e8dec46f22c7081d72fdf3d6a0efe38bdc688b2da47cd0d87e1bd3edddd093348c6cc769988596777ba4dd1ddd9ba1777bb7c3eef6766feff6d8ddb0dddddd1bb6777b84dded0f6e6ff7663ef08217b8df93674408238c314608a315a154430d35c0f09a5499461a69a81ca7f6bbf5e2760da56b28bb1bb7dfef37b700ceab57fe01fa3e8620740bb61523b47c7bb777b777bb5fef766ff75401d759ab67aadd7bef3dd952bbf7de8b52ea33b477a376efbd076d4429a594d25ae928effd0c61efbd0f50fed07bc242b9a1ac826129d36a729126e61da4aaefa2b59352ca33d618bd97499f9bd0d5e49a9ca876524a29c2da875a3bf5fd73b206e5bfa494328a9ca1d06c2852b6cf2461d77b292115ec39914e283f2796b3602f3f243b8a6419bab64eab4fb619cf09e5efb0c7f5cbed7de00dac7d285f7ff519524a7975940e03e50f7d47a1fc57d31d256e7967507ef9ec626a2969376cb88876631ed759bf6f75f25fcc9858ed767dd7a14f779f2b4608238c314608a3156194918372f6637e1816638cd2dda10f7cd83efbddae472bc60bf3b87137621d37eec6ed28ad6193330cc618a168034cac1518f6b333a247f728ca305126f28f4c83e6dc2b869c38794e9e93f55d8f987b9434d6bbbfd6300bddbb4ec61e5720ee6f63f6618c113a84104208bfae5bbf0b1dba432a2d0e49081dbac3cb033e9efa82a7ea3b84103a7487fe1990ab3ad7902910daa57bbbe5eeeeeeedeeeddeedd0bdddddbddddbbdddddbddbdbbddbd95d53c2917808422b6fb777bbbbbb617777c38edddedddddddeed2b2b2adddeed515aebee6eef6eeff6dddeedde7ea127a8543c4eac4ab0fae8967316580f7594ae6c6b2bf261e7b5c80aaff3e9c977d903c567c8d2a621cbe23aebdd72cb0a7170c773429f94d2b276e9c2ecb39680692e599098e672c5f76d3f6e42fc1747a22e092584d6c5b56f10863808a10588e0ea9c4addac07192ae49470a0fd218470bb1fdcef208470bb1fdcef208470bb398e46bc23cf7d0b5e0842e30cf7755f67cc084e7781bedf4da3cdf0776ff7e682bbf7167cdd9ba99840404040404040404040404040404040404040404040404040404040400ea3254397bc1c464b86ac900fe7f4388c968cd261b4a015f498f8c0e831a839a87fd87f967977432f74823997bdfdedb70f7fbf9701e97d61e6377acc16158c58f53c2612980db71b68c787b063e4f8b580ebc0e4efe05b50c27d6bebe737d0e7fb7ec41fc7c0238431c6087d9f50e6f82f5b9979991fcfdcddee3a21e6cb711273b7669907ab6e47f83d265a0ba621fe5b89f00d0afb19b77e6b1312bfe3740c723812c58536a404e3e6fb06e1d661a0c6b7bedbbfb80ded86acb85f43dde59498a23f07a0cf78f3fb8b317e7c2782ab12ffcd4ccb0d811f39201605b92074686ea1117c841d2661aeaca8f8e31a420821840ea1f783bb103e840f61c38d4ca82882bd9d47c5ebc1db793b4f50116b7c08638416d78542d76ea83322c4c917ad8f9bbff54ae01ba8eb21df76436bc9f82adcda1b09befb514aea0e3b5aad8f5c27a5942e16d769756561f6dda1fb478c4f6b410eca4e32616e0ccb49a779142ff326bbe3ef76e4d1d613def1423bae78452c4963612b02b11569612d3934812abf77b9e8c34bb580bf240256e82ceeb2dd35ad9b93dd32ae0d2943d61527f4ec69a11ca1ab3b0a7ddf7262bd592f87c55d111475938df191bc027ddf94a4f1c90af4fdca2b83bea7ed43df7b15e87bbf5e2e6c7986e6fa6e57d2ccdd4d36ccfeb56db5ebee5eaca94003f455242378d412ec97648f64890c4d1b6ccd0fea0d7626073b77b034cfc7b5f3649a6950fb81307f9b5b343f8a29a0c42a6a7fccb976e267157e97d58e53dd4543d9866dda6603e4bd1d38754a5910d61b99e10755facd8694b86f18cd0774073e735ab68f14240935a6ce4e275155c8e9b4c655610149f1905af90eed9ecff3f1e1a109285241523e78fd82949666ea7c0c4ba3fdfe0096c6fa19397350fbb58dc160987e8b9fd4c7f18a573da01da7e2130bd3f10639429e8ba9e5bbafa71d2e26295b282d69daff7b3ea5dfe7d334256e1be6691ce73ca01dafe213b51f86511fd7c1fa7ee34106712aa8ce74b234738aedd7caa062744da89dfdaec442746261fa43245a8a391bb3038a7119d7954853278814b21629881248f049c80130c62e52102590f0692b7680d903b6513284102e9f8a683d743bb6a5b1dee2620ee446a3b7714ed3cc2816a6bfe7143ab567cc41edcf9101b9eae35c07b4e314a7b809ce310076f5dcf88db9914366733dd90163d9b6b27cbd7a6e1859d9764f3772c87c681d32215d6ffcdc0c88232f60f2012e24a1c512254401b50cc3f22bdb0daec3bcae7cb6fdc86cb21f6d6353627db615c1ea8bc230fd2b5b67a48ebe6636a39ff3876732ae595ef20ce959b637da9ecf1434fb1f4c6261217dc3b070570f10595199105949ffa357fe073f1f9e197dff8bc2332cdfff7eb2ec716441b6b2b8a98795cf3ee32e8055d20a87d54c32a1ddd5a3b2c93d8dfeea197d7744d4ecfb53b6dd13e96b064456218cd4ec6be643d794bf9ef04c0ad719a9d993b87ebaed9e46dcd5c3a77ed14fedaf9910af19773d416536300a9ffa4d3e7ceaf71cd0eeeaa9dd7ff55c4faec7b64b0d3ef5ef90d93cee0a8242431fbfbb826a7f90ea4302b06d9a45390e1692de3faf9a8653a9204a34c1a7ad3c06ed7f3d34d6e5b90249dd1aaf3da5e0939382241185099ffa1f3775ea62c102242a1f4165ed624eedef664ed35852308d44f567b22660262013c27546b131ef3de66eaa6a4f26b5753666ce395ff269fe663a5bb3b5a79ca20a9dad797594a48e90a8f38bea845621f915f07e0ec17609eda6ce086774022154ff8eabddd4a9fd338afea9b335fcfd5b6857d49e55d49e53d4de1a4a93b1bddc94585cc745e8292c47a811ef883ba74005b31f4208210bf1d6d07e5d0a1a6be43aed06b47b3bebc3c4661f69059e20d750f8c4bf461de271308783cc48620612ec8977218df71e331a38f28c207787308d2cdc007ea10b395d50420a27e8429226dd5f98ae042b021450a45c83811a4f04354f880ba024f0008d81b39bedbe67468f195fbcf798cdf831a397c023052f240f1a523c3476c03a8fdb99f0820c49299928a36a7c62660e85a410672471cdebe26942c7af154f135ac41823864d2048296596d160c74752bc4d06233a1a41d173c516642469e20418288952ab89c480482924121523452525c57710e4437996e0426545454587878924dc8787891f545e22082b2c2b2b3e86dfb88fb6840d586cb0b0fcfcf0bca008ee23799688818d1b366cbcc004f5358144d5f8a4a2a2a272e346906ce28817a8516a299530c993aa028f125eb4985a5a7e4275b550f244a52e8f1255985c4c26ec06a37579523fd2891f2c780054aacba3448e0b0e171c7069d0048b284bd46e1b3ca84d031c9e256eaa4ce1c88103c74e16b4f0319e470924395e72e4802235eb5ed14409bda2098ea351353efdcb4b6603fdaa7bc5163f3b68a073451465501e27562926ac50353ee1c08103c7bf8d24bcbcbcbc6c1b4b5d1e2684c061dbb66d1ca7c39344106600a389da61953b6b55c45a552e76767a40450f7676eaf3d9416247fcde6366778f3f3126f1247edc8cbabf3f43a4182dd85dedbdc7ccddedee4f63fbc4c8ef2ef0692e2c4b0849bc259658820a73ae124a28e182100b90a0ef31f3482e9f20843146cdb22c26ac95b4a494dec5caf7deafbb43083d7a2a460ff878ca53af05d4a5bc241a8bcddddd856ec30b76d427b553e55e7617cc39f7bbb75f77c3dde67edf7508a1435fe87137d8fbef04f5bdb8f97b9fbb0bbb77bd9b1f4a31e7e6784cd688d58f66ae0013b67d30a4245cb004478276b27a0b68272bf733e9ac15c558f45eb0057dcf9d0bea7479287741f908bf1a7ea5db9f22dd4a7d2e619195caedef4f7dbf6c82e92ca0dd7af1b2f881816ee93f56406dc062978626fe22c19128f8210b7e681b010f945b9665921c4541292d4e09fc1ffd83e1364c06e8b62f99deccccfd9cc0d6223ec8dedddddcddddddd01b7643e7938761eef22e6b376cc0ef9865c33033afa8a490e8489461f30a492b426fe6e55d66e6963ccaa0f05f7c32ef278f1e3e307ecba95205ca19ff3e1411edadb7b43f82921072534749e99d0a5409cea34aff5e2365368fe70c0393faba6b676766bde869c52b6d3af0fdd5c33390736a06394e5d3b97153c03b9f7c3a72950eb55b045c51d32341a1e4fe0d1a347cd18353ea4407de02006c5a100500a904314680e3a4041871f4fa0d6336abe7ffc1ff549e88aaefde4d1238c1e354ea8f1d1046af9c0a10787023081c22f400e4ba0f073d041093ac49c1f60fc58ad56abd5aaae56ab98e349a0da5b4f7b00c007bc729e0fc85d378fb91bbe9e9051af268471810048cfc678edae1eff82aa316faea0a9b335f0fbd9c9d25c410dd3df84aa8219c5c64c1bbca9821f3c986eea004e9d8d81dca5ba763875edf0124bf3ca783e9c7a3e3ebcf22995302d8b5fc25a329bf8da765d21359e8feb0a85a1f64f1c4266d4fece2504b4a77ec8c3551f774d774261edae9ceb72c2d258dc948261faa715397552e184761dc2ab63beca38b5313a5504eddb9ecf7c3e623ecda378dbc078ef07092bbe82521bd3d9b533c4e3d59c39338504da3d9fd4f3e19968822dac20466d307aae9da0a6a102a7462b92d421844c6e88352d7edc33395e5d3b8b83f6fd57154b737de0dab96eea75d3341a17ba70faba292366bcda018d392e4c6a0c3befbba8aafd10c53e0dd37f85b1a72b8c9db9beb0a7be82f834c19816a7be10c4b59baa1d1e0a04414c92a08c8854e8a096a46cfc08990fb03ec84ca68e8e50135b03835da6014b51fb633002b55e7b2e28ac4378cd76541e525fe4ae9badc88e3a392fe8a29ecaf4b8b7b363d3049ffa39874ffdde05e5d5c638b134ec6461fa358d1480374fd809bb82b278c28a2b876766157bea9f5edcd47ee7825a7548087458638d355016f6059ea6c7c51c54848261fa7d8b11c8c0f45660ec3ce153f730793d1da722143c6312021ff7c8e0537f3f28911424093260ed38f5a034b1f5f5d06b8b2a7c76b0a151a769b40f81124aa5d276d78e539cda533f15b4eb6432a9709e814faaab05929d4a12e38bd41749d62ac3b25e16e86ae12449e5aa85139c3a77a615b55f009910ae4152aa186c0058cc0f2194f63f98574da37d6ff6c385d2b898d3847653e75283692c9e596cc6700c16da28fdd00a338410c2f9bc15599954704bc32b01d447437d35f5fdb6355b5f57aaaf2385eafbf71ed75ddb8573dd5c318721c6a914e4302ee6441dbe211567c0bc0834d6211cbe378f58f185e713337ade8a6c16f57ac991a9fc65059f3ad5bd9b6a9a45a152bc721e7aa9ae1d3ef56b41bb6ba787c799e0ef00329bf973a988c1f01171bce213f7f00dddc3330bb797c3272872164ac62beb53389f4a9a33d8cf90d9609c3f2ef43f3a8464a19036c9ab8eca605e04dab5bb7aae9e1d5868738ac33317c73345368beb864f174e16f47d77ddd44672e1f08908b4bb6e4c4f67eb93020bfa7478502312cf84f02b5e0fc5ea6af1011ed4ab2ecf154c883ba8e8173187577149d4b1e1ba0ff398c32b1a306d8b5044299e8fe8c4caf4131bd3df7175b169f952500dd8527f1a329bcb06ec019936d450c30d7bc32c692d6f7d10a52fbdc515b18488c67d11a6c79986580fc4a2acd7dee28a30b224088d2ba2f4d617b18448e92dee08aa8896d79e88f5dabfd738234b3823385e7b2339de5a54cb2f6abe6c08217a78d5f443d8c01f62facd4aa55fd45c1a4d1b346306997eb0bef441585ffa224cef5bbef4d607d1f2a50fc2e54deff2a6d73e4628f8a46d93098e1c2e2da692d6b22dca655b54695b94c90a1a75624e4f505008088eddd9e1819760277070aaf42def711a905586b219ecfb27cfd628317dfff4c1d268df7308b53ffb19c427a2927883a5e155cc79c24e4fdc811040b8cee757af6ed17ce6b8ae562bd3fb966dfbcd1e18adddf331719b9833fd60bdcb07a1bd892bc2f4dabb70452c21627a4dfb2274bcc599f81765fda270f8f492f4106837751e4e56570b1040a9b22ecf1539e8b195b66d98968d4766b3d9d41102a5c13c08b4e3158fcc460813ff0f71f99709114d3a3e88d7451560a04cbfd9e38058940b8704490c8f24c72301c023d91ec9cbe3100288452141627de99168dff2913331374407770465e24c8f33fd60bdcb13b1de8533b2e4bd91d25bff38229a9196d7fe08caf4def48bb236d37b975f54cb667aaffda24a9b0935716c9349c3f4e7d8b6615eb66d986f52fbb755ede77a6a3f00a0d4fe18a64f0c2f8bc2613364ea344cbf69889125444c5f7a23d6bb705b89bc2eaa5002aac419d1dec4b915f4fd381068c7ab2f40c04960267018bc7a3eae1bcee1317af4e8d1a3a6a60687c5e1e646c81546ed2fedccd5b3a7fe2be8f9f83c9f2bc8e7fd44260f8d98f3839c95a874cd59e4b474664600000000008316000018100c0a85a2013dcd82d6fc1400115d7c4a645a38120824d15810c4300c62180a30c620620c40041985a8468a0008a5404ee7e9fbf778161c25a3b31eb41ece4fb5fc4246f9c6cf553c9819f1bfffddb507c54636eb10a50955acaf145662ffbc2308747e6a5923736e6ff8784aba00d302dfeb04d4ca5956256099e0aead3c0f631a45b2cb62a421018216022960460991cc672176d41cea05ac6a6a6d142f5cd97537da51cf90f3a99508117f2b3a1530d5497436f0e5865d726d98a311610b1e0f20ed698c56e0464d715e6a58854dd53213688fb91184c661f087080b1a7611757ebf7573972fbc6a5e8a3f94bdc756b3b571929490fc6a864f42c7956474a1b8f42b8707c9b4cdd7859760f24d0f0c14cab2203e7499bc6aca6f203058670559b876eaff08c6a61b3bfd656951c3eebfd1704bbe9b2d10c18c2d567230d73d6ad32e6ea83bf64ab32873a50b83dd26874e6e26f1d28d25839eef9161ee4a19bf2c23181a1b7a0416c8f6e22b255fc6ebddb465bf9ac4f62575b4e8ec4b69d63a2f3b0ff3d6f2d558ec448fe966da1dcd6e4c9ba3d14d9ad6af111b58e560be7b5193468e612baeb2ace033ddbae92c625d51c4d422fa7d711839b25b5248af5556a0c33bd624511dee040c62c048daaea0fe8a29b1fef41a521a54ab0aa40337a0f805dbefafd0e5c116d82017ce10f81a41d4d3ecf52f868f255e153fe21280f15055bd86564c34b39fc194de4906e985a024a4d09601363ce764d2d92164c50b3dedefed2bd3616f2a5cabd77cd0ef31f1c1adb2c1a1382212f11ecba8ab92adfcc7de13588442adf372ca9c20b43754e180cf6c8c97a4d09ce853a3579bb1a720028b392c65d67dfe1d9c90773e31bd2de327aa080349fd733623b9234764f280aa9400d123bffdbd41b93aa33e862b6a90c40e6963ab200ef9194a149e66fd471028791a6232fcb394cb312f885c6080477cddbcea68b59958d812dc0be91109a0d3e829c30b3e10541cb1c99dc9ec19fa252e70ef315c5e138de8b86c76dba7ca6b88515471042b2b009416d170520266400d691edf73e74f8a71bc69b7b37381f50db83b48da0afa1dc12cda27d743b8911930919043c624e7260cf68f8e18c25347e45b806a00fbc8912ef97320d63046019c5d3200c11d886202d8935f1c361c83fa4c162be9ab79d4e9f7fc5d1b217ac9edb8cc98c879e819fe7a902bf03210008d4a7294551738a83732dcb1c7c67222cd96b7a55e53780a9715b3b5ba67dc202ee798fe53d679c565e62bb5cb7869e4ec0110b83f705fa8e0f4e0075a5b211fb6a08e044a2610cb072f5402b4e3b770ecd93c1b80d98b31a20728b0cbeec2d8af4c6e2dfb35c1e2f3efb27bce91dc872f1625bffb287516d9fd8fb404e97e8515cb7b08b0c6ea03c2ba4519ea89a989485db97c0a95c91c42f09b4ca83a335283e789014683d4cb1382f810f50ee7ef1258a38ffefdd811c62fbd738a34316d1a6881ea6bce641191b7c675c03e476e7a694986e400f4290a94ded64553fa449c3fd1db3f5ed37a3e1b8c42925bc490b02bf5074009fee3f05ba4c9615c04c49310f0fb02029392620534951d5ce026dc649e6975d622203c80ef8e77ee350b4e2ff583edb8ac610ec5a9963695e96e0c48d5577f77431b53a8eb0e2698a9313901a1a8da16a348858dc17bf277bfb4670397f5d2e3e95125ad121ca34668e61e7f7711701b2a3975fe7e65ead70f19bcb87775e24548abc1b412f8d87c96394f5ed7b20d4e86ac089985979dd6be03d1a03e43f245da4383b194c4c7bb28842cc02dc7f81f34b137abf814b015b124829941e41ea83e1e462d6f29ddc566619b2c84821f4feb418101ec04578a8634f8e7f499c8dccae09d5bdd10a7651a2ead719e33aa3c2e5833a00cf46234ddc58d347e7dd57c2a5c4160e3685aed508111f609a9fb57bad073404e772907be94ee741a6772c025912aaefacf33088c3120428903210d5d102e60e0e2f952dfd96df7097979ad461087f2bdfa3dfba08f0554b0101ad18891dc0b3a6af15755000b5b7196bd14002ee02fdcdbd6d04460d22ad75f121874a4a58cf6220291627d2b6a97b3ad1c9efd7544bfa61aaf406f1156ae48afed831ef655a1bbc6551dcea0030293c8965bb986e272a82786b7a8e3773d3a0c4a6bda0cd87f49e0ef6753e058934561776df5d6e5053b33c8d65d61f8ed659e0fea314d84509868847b6ca0132b7996e5c0e14a757b8735afc9c8307f1b5943e54cae235080c54ca04c7ede4572c50c1fea2016f43d0690641ae1f055c067e30cececd45322ecc7d25ffd47c60159a1259fc87428728a76e96910a32aaf88112f1b7b403b0280ff77b8f03cdc070cdcddff14dbf7c364e62555dc85e45916371b0ee0d910b657c8cb5a8c8745ff1a70f18e3bd074f16784ef0f79ce35f72e389fbaf56744c71376a3abccfe3eaa31f149aa93034bfc54e4349c12b60fc3caa9a2a23291c608b185315dd1639cf396e7172e4057e700660fae3d8511f89b3c2b5ad1ab8a85b18a7348c1b992c13cce7f6d21c24fafc2ff8bae1e8fd165b3744c74a64c3b35a405d6d7e34e37081c898d8ebd2fb5fdaf147f2e144324501eaf6d2ced3f381e5a4547c70c7f2c6044905a834eb7178d22744ca683ec199a0b02c0f9f1191cbc1aa8e51ac5692856c4d48325286f2050d7194f0821e76be0b97ed32629a362770b08ab071949717ed4bc477155ce9bf5e2d178a5a9f7da2a8bdcea8d512bbf8f96314cc2c5185f7c4147df86fb9593b56fe908d01db1f032c8a581b32ad27142707bb542757842275cecf13ffc626e2667274e4341e056d404b3d6009804e2968164f05865fa7a834ff902915e963583acd010d203ac6e24d0b2ed21920a46d6f52f275742d06d488bd81d80f0e1f90657001351ba103191c391e6b0766cf419556287d19240b296ba11c865c5dd717efe189405294bac23cc89df632f5a407d8bf216da60a6d7cfe400a2b8a0036b8bd5c0693e16efe89a9c5fd4fc3ca26b898005c522faffd3ddd359a075e8ba30097ae37599faa0f97d114d0e3cfcc11405eb4a159d4ecd98c9689ae6c848df211e5ef4a50f0c7a5e20476d241a3aac4b0d55d1bfef204f857ae8e8b64b69611cbe635bfa88fc380e2e788abf4032e1db274ff74706f7813e3cb90ffd58a236c42cfc6a066e3acde1e60b6478259606feaeb4885ef3f4801187a6fd4ba1c5e32bf3075d2aeffe55797b552435f3e785eb14ced20b0aa364c9c10d556ef72e5681d4a2aede5e600f55faf626c073066fea36aebff2f38c104ebe4dfe8834c3e30cee6783fd5a49a1439343394a68a18e14f2ff0c52700581a65cc35f8972b6a1a82ec2b2e2c66ce7b7d6e1184952e00f7b9cb8fbc2aa79a2191caadbc2322c920d03ac7bd6ec0320bd676953f332e74eb9aa513fd1afef755631ef85dbd2b46bc57b4155a1e2b7377aa06440b8885d43716cef100192d3d4fdc7977d83847555b985d229391252ddcb401e5f0e12161ecb2199439c95211a3d3ecc4c407a817876c7132201aa47d2ed2d4194e53f9e6be9b491a234e1b78388c44d6bbf4b7bf38dcb984e8d0115e0d6de7d0f055d29f8e3befb791e575e82fc82aaed6538aba5d4c3250ccc4430ad94638ae173448b6931b31f1f10cc0a858b9f1aee8ed047ce9a09b120305d812113e8034af8446c6cbf129586ffa57eeb6791358fc15fdff4b3501eb880d936eae0bbb5a23e7cbdc95e34704ea6902cb3a663d9cbdee05190ddf96b6b7998e316e1934e29fd71420f362053fe3d18ee2ebc0819b87fd5e453d908b9525ba85fdea6a595829ee6d470564f88599dd1c834e9805e0da9703b83748e8823854d6b2130db0d37b18b4c119f63ddb65d897ae610f988ff052302f9260a25b8fec7d69649693b6170b1a0b262b7364d3d9fceb6d18058e1f5d39a841377871020df5596f55dda13161b236bbd74ae33e98a80b769f728cf802a891ce7b728827ec54565cd6085f7ea985e827869d4ce17ea8d9a1dc6fd0f9a4b98548838534726ce1757ccfa15023e0540cbacfb5a9dc4829841ae83acdcf51dfe953d17d2c4dfc44ec8cf382f7945681ab2a7154e4bf8303e0c841876a86a6572dd52a95f261360ebe67a3a8977782d9e742a437bbccfcf2e496083bccecb534708b8d7b5e27ec5cc628bcfa9309c753120900bc50d19cc853b49424c2e81f07a4b5ef3574767bf7429f5272479a469b98c6f46bea7e7523fb11f2459af1218252bfefe391c1f410758ff45cc04ed9d43575118264718da0b0406047db545aca037c4cf2f3cc70d81d0a1dbb2cddf0253c8888120b65ac4aa7a12755bff24e6f211175daa11f65798d7d1e96cea5166ffc132e27a063575a644dd7227f388760091b2b3ff6d592c6eaab63ae442f393229be5785178dfd36b8910cbb132d113c6f2e08f48fa09feec771ec1c30ad6f1d2f1b55f25fcf0001f6a85e7d347c3e601cc08624fe6f69126ec058ad0e56eef65bb5907b30e38f802ad80ea33234058e4e363ad5ac537e9af971018c7185ff0b8ac10847446bc946588ee3d250ab5ebb6956a28d2eae9ced23b7dc4bc68757bc9581036f7b818eb9bfdaf601c17cd7836262412da810bcf224a509e1a3b29c20984d4d17e8166c125e8a74a5f04480064bc63174cb50d4107902f718f25e7a8b1a310a8987b21ca7a1dc9700735e310bfdcca1d6d8c10e5170e5df7f771bc23addce22aaa6537586f6ea6d15dfdd00435ea6538dd5cba55d12a4eb263951e4be1b642095325d119b1f0be12c7e555e04649f7f04f03ac80abf57db43ac40bd12b9d5843bdc621205a8c872e6dd05bf437aebc34e05f078e0cd8b10df9a17e0920554635dac8005e3eb159d54f8d62e320f20d9f136ad2d3f36ceb3a00e1426f9b6ace6d5ecf60ec64e73f4f2df9ad829a1e7992cd6b2a564919cd71c1c0a558e895d7158eb1662b0fc8dba85419247082266ca7c90eef12b9727bf89626529c461c186899ad92ce47aae2611dec2c7f484d89da07a30f7749e520bd4abe879cbae0f5ff8fc8dd4c275414420bf22c8102cbf87e50498b23e9ca105e8f39d26990612620a049641e29c71570bcad3fc6dbc74e0cd92634f6334c0c55ea7d716a44d4e0d08e7d9586a860813530d9f72af592d8e7526706bd6d1fe67f8bbcc44590dc83abf11bcf1ace96b951067c884580a29f76d6477f5c91953952fec19cb813058c4f380ed03ede42472f8440dc51e0acadc5f1bc4780a0167f5e9c23d04b79ec75ee289bb35770ee4eb20beda9f42f189e7d9c28bc8426a0d0eb72ba030732617358cd016d36d43f8640a26c25f8c507ce5dc47a0642dbe4667681893c9fb86763a1294f9c6391a8f5e0b16bfd3545f1328476a38229b7c6760e8d0da9bd4b6668312df4c2bb16c9c518e2a8c4a216d04df70714952eb6f8a8f7f089d119e6af8bfe04d2d4cc1f833f6850b7bd1185379117113ecdf9975ec8384d4d0a7719c1dcd63b087a49ddcd8856c8dd8f0d1225221ef37b5c711cd21032dc882dbfabaa0f52c4496be71fd9759ac6776e582720d8106f429ac6b601ddfa19f20b556c57c2c04559354d6f02e78614db1e091a9618422a84a09029cb706fdcf00b5820e1adae8ce8188fe4c01a62d947ed57ce993640501daea239cf5d07c7c03eb2a6278bae3b208ab0d1af1cc12b6b95420294604efbda8ab5dae5c3b1107ca92e8a9981c962b73f2f57b21e9d3d934854da7166bc976d664c1fa492042e9a12e37ee8137c55086fb915a3023c1fcdce6f149f5747a4c98a4de71df36800860ea51e39b88ddeaec3a1b189fe4d6840063009f79eec49795298fdcbe34fc72dffb45217ae62815869d62f52705c958a1b32967011576e372cfd31f5fecdadf2fb6eb0877a5ce437baec5b0a7e92c84a1a06b4db22169ad07b259d34e5206ecb3e12f2aa3c1d9e7a7d988dccc2a9fd862f11b929fe240e6056acaa43dada773fe92fa8549a907d64e84fa2c468dd4b5064491a5401c55a3dd0dc8ba34e35b75fbd3772307ddcced47a58aca5700dbd090e15bab432c2e094027f9231eb25d06946f559a80a2a6b2938699cf50a7072e3febab799dcc40f2c9beb1a268e5bf1896f32fb0cd28bbe6b0b846ce32607980b1c6f91195351d971f82e3825b4b4774f1e33ddaa9555d9834fc8daa40f6fd0a6855eb1cdc831d51e244bf0351c70bfec8d7da41f14a2828bbf17e87ac742196f4dd7bb0dfc44356abb42f02b78ef3578c9191944bf99e5af2d5ff4edf5af2daa401a010a0c154d20430a3d21323701b374ff516a397b99a70ed137709fec89c705958e23b7c32b52edeb6411786840c94cb63ee5469917504e81433de73d0a42494386d22b25aa26a2ef8bd1a2c5b52b021190629fffcea4e2d80fc1c8c7288f3cfb8917a4c20820b4e22851d6a9f10a1fc0e85155042cba0c4214402f43042c76fc73189fd0b8d3b4d84982418d4518fee525883540ea8d5d7c25790a07a593b7de3065e621e1886025311d920d3ab4008471dd85703cca36a395b21620beb5be5d226ba1d51b2907e90c1f2535be57865997804e99503bf727f37e8cd472973927c61a101d84ba71113f93b81ffb18b9342c9ecfbf7900aacc4340497401aef3fc0bc1e0380f8c74fc0fd2551dec0e826eb9d815bfab831a2def961a56e61c8382be8890fa534923221e2f6f95cb17e4c9a59cd32516c5e56bc49f8f5e111e0f39d3c85190e76df3877abc0021b2a4bcef3d995db1f9ffbff8a301e172024c0305dd28fc735a3527632a2a9e4fff8f6e5581617e68dc0883ab25b9c0cf2d22a79150ba7a47743ccc34a7cdcbaf3e11b721a3517e56a7037021266391553f4d3166de82c7093bd69a01137a167e39819110ddffb1366a1c08cef237901a8173bbc905f97bba70a1d8a91c7cd67359b6fda852314b12dfee4117cf573ff529a7f011c90c828b4a358f1a058e2e9fce8c21221e73ce52d4e994917253d60026bda8503ad416110b7aacdaa8f1b5a0996ea6e8beffc17b77505641f057c29caeeb45c07f08776937909ae3a88cb00bde25a9947bdfa3bcd4554370973c4c7411a0f2975a4a8a6591ac24a600ec6f7a5ed1d3f3872cd8d205dc462363af96198ff21f297407aae04789d9352216175a2fc4ac3b00a74c386aa8f48c855bef19e4c9ac2be63a1b60dd83eaafc0a7f2f048860ee596f972eb879b3b350c91c5593c468021c312f8bed4e1afeddbda02a77294402ceffe866793b4c57278389c5c2490bbbf39b5dfae52c7ba3fbe4f906cc93a2fc7ca99a3cd46bdd2c89e34e4d08d250596cd01b1d00377e86cb8e87fd0d7a51c8f71950d0f7a46073f9e19f3381f58497766cd1e3fcfa46018d519e8ce1d294f624bb276eaa472da022dd82d0a6f255019d6349c2070f3e0c63e507d9237b684b00f60f40e142a1ced23327eafb48f85401c5136e1e6e765ecce71d2a8fdc43051b079e0dbf5c190a7b3072092e56a07365a1b733842510a7a1251f35e505d1c18f106dae059dc3f14ad131a65aa4ea97697329269ede820c77cda75edc4c09ef808008f080ea9ff02860574eb19fce93aa0bde1a27000e1df6f08e2177bbfc9405bb755ee8add902217f0392b1edc67bdfe936f937b29504fb2a32679288b4b9d8b4719bf5daa0e651b9163b809b367329cf502a1b95341b9448fd84be73700706470710a692418884f9c5e1ebe71cb31ee3372cb4f817d511a1974c2c687172f168223767cf0836095149456954a0cb2232725e3a184be553f8b4c9801eb33ebc5e1bd326061da8be6ab460ce5977badf37781726ff559d1387c719b43fe562a6af69242134ea5df0db082a7cf73314a1b947ef43856208faf1ce8a6b78bd116b54e10cf1e730d96d8aca445accd91e51a9c65c44eaaa05ed7dfeb5c3f482ad5e7d39232e0286e988ae15446a697137be5c38262c4ddcfd1acde0ed0a67fd995b3c2e850e836485c379226306c20d7c591919b38bd7e64ad86602b4b1e9ed8a1c865ac6d23758df0ddd0f97681f0e865a7d4b984693c7b4bd3daa2ba631bd5cd9cc7f6c57d0a3ae4d4009e05a2e1a10a6eb6e0f0f55ad40e39256a38b5a992c12fce52c5b0d506406b7d77a1c9f04456d4f908b699c861e615667c4f41f63ca97e58f8c921f9324eea417e6a76419cd891539c744d01dce0144e3815d866aff847e519bf041c007184402f5396200ec6c86ae108fd63f7487ad56bc63f55e1a457ae7247ce1f0fcaaa1980c367935f87745e4006decdc04cab26d9da36e0f638b3710f98f853c501afd01d0ac36a2b469ac804fdf7912a431dc57e8bc93cc2b137af28a592bdef2605828531f0ed2191f962a7818813c29a72c71f471a0d4acb56769340ede364f8076c76cf842d6ef573fa09780958a0d14101fe3421eeb54b990b19f5d32814ac471beda1114e9918ae36a9272cdfce547d18f30949d1c4f9a6ff452ffc50a18b48c7409156321b5f280c872265c84d9441184ea841f05e1e358fa6436240c24e984e5d4fd506ceb70187a9f5c68057281289005f547af5446df45bb0f5e3944c6d4e1ade77ee64a5c7f46f8fd9edcdd7fb3372876dfe804eef940b73ff98e561e504500f351b85479b7250d2290eeb68e33ce3faac259c0d83b1e085b8084bf27f67499209e3d55936c5095fabb56ceb8e92c4437d74a4243fb571e5f440e0961ebe4f64348c8555f2baa5cc89339b667625551aef428e6d61601d1dfae59957cc66743412a352c9635e825ce6258dd17a237fc4bca0ba29d1846aeb1830afc834f13b7ad47c31c2bca259aa89a9343054ae8fb7892b9757df6552340da4e09b957ae82254551ebcf3c285dd394670dbb65067926d404c848710b7cfc07f98e92622acb130b1076c585818b4a586bca1bfce95ed5eb9f112e3cef5c77f99c601867ab22bb95c7d024eaaf5b0f488bb9fe61ff255c09ecd23f6e50d4b61e01f2cab2ecfff45e659560c6e2f9db968ebc449f13626b95fadf1d8155aa96dd8541975e326536b8972b3c32f9674bfa91258b5885cdd7c2a911acbb999b5ffb44ffe613ffca37dda4fffb08ff6693eec837fda0fff6cfb9982812c00d50003d51882a712001ebe511f05bacb7595b6aeb4aa2fdd9ae1e581e47e2b73b090693f4c8a4492f23b007885a50f40be53035bdd13a1d45e359e6cb3ef1bffff334431a7b8fc44d3f3186fc053b89912b884f5d094e1739adb601642b9ce5ba25719af3f4908c22217906b712793892fbb819a483bb42edc23660d9c0ded715b5161e89e380d5bedbf96ba5db66177df63f0c99c9f3771c344ef9176e29cef4eb0c057673ec28b8b7cadf4f4a9bbf38924efc2b81f4811566a4d598423a65cbf0d38829d605b83f58a7dd4d84868a6a6a3c2a274322308fe0e96770dd2667dce331450e592cec057374017a907fa04e522f98af830c00964a3fe60a58a36eb8fb57227a3e9787c1c81dd5557154745bc09415a7da731974aa623d20aa733be8dc6b5d9c1cb11481aa0197857949d5120fcb1738ebb918b6f02ff965128a845a3a0f982735cf08481260ea7736db1f016afd152f8558debf1bb715dbe0946234a04f4f0d4fff6acf829ea0f83668a3e51180447f597f9f9a671ca4077599b7c8dd5b939bc41af5fa74f117260bef5cdb41fa82bf5be9b137ee58f5366238c23e60efdc49a65fff3fbf424174875e7d97d0d1ebd39f44dcbc453ff19943447d189a1c03e7b277992df0da58b424e11e771f63d5a6a456baf353dc1b3e4d40088e0d94656bb88d37bf41deb9f39c6d791994ec14850285f80567c030aaf322ed70178e371898ce56b6ba114c317f1023881b25ce5768664292af0c8d0c7578ac95aba14b8779f8cf9e65d17e7ecf664b458e237ebc334c9b8c093216603adca71a444c992d8f3c35b9530cff631a2c00e36b633f5fae30225bd732e81d0ae4913e8792cc957e8ac9b129685eaf6db7947b859b68266a1dd174db3859c447b32126137ca4f3c3624dc49b0e6190728ecd18ed88bf4c93cccdc0cd083a161cfbdbe4e252c62066e86b7cd53a5fcb7912a089002c65a28ed7ae550703edeced8f4e26c3a9a919118a2b4508c56b48b7319af0b8429af70af3bec7fcecc8bf93097e236911509c9cbd892954b59178ce1d0e2ac8a359d74504cd2373f4c4e66f1a29740e03c52089137a53153e01fd9d0323dfab5e95cfe85060a56a02aa9cdb68c807494d5ecef7bad3f7c923d06eec4f704e5cf7f0ec8c815bc93944dc229ef0a804e7a6171a7bbd35f04e3d658fc22cc48a359cc41b3beb581d154aceaecfac308a8806902a720a7b6ad8444478491e606e88b77949eff35479c984be82bec508bdd446b62af98f7fefc04cad1367a1e7d54b381a63993c2a2cafc185c2cba2b5867a9e91fbd90f1023c2ed7972c3635113b540807de3d4bb0fd3b60b54f8f4a3391678f667af53bf9f1839d6f7666955add71e6356bb1320117ff0138fc4d985229e7d7e2d672af14f44ade3abd7fa480700f3cf23f4a9629734fe14f7543bd5e26581dea4406cbb62f0fe44b3081556e51fe212a74c20ed67332815b0f096f6dd8218639ddf8758003945511868f100ee9308dbd98df55cc9f5dc41e5916c3a87a0c4717f13d29eb5eb17c9a2d9181b6ea39f2e5b615d5aa53a799ca3af3e1bbb0d5eb7649da9e4566fc781a766518aa9e1a796f4767baa475e709c78b245293f9c4ba3dc1404f0a1523e0021015bd0122ca0c30a560f5fe9d49ffed6532e4dab61a73b29672d557d1b67cf7da8c549cd92655029146300e924b55e8d51a6ba97d9a536f60fdf2b2c44f18be71d2946127a029b6f2660855f10733cc772ff7b64411f4a130ba5593a28a8c24a5a6de285d5ef3de84f73bbff057df0489f16087ebf68498a808fddf54e97eb203391f5a02d283cf9046124986ff437ef08e48fea1253ca972b0c79cd7ce1c6e78879c4c0d65645b6c5c24aa516384798360ca2f7a5c2d8b7954bf8b140388e6d1b0c19188be60f873919602a692b04c693741e4193f6b4882b8d4bbca34496d5d9d00bd65e8737720ba56ebd02d363531d91200edc2b19df9fc6d7da0116833d17c9e20620f2305f41aad92e067ff2f4e71d17c54d36db7db73f484195d1a5ca2d967c37f9060c72edd03ba30523878cd5f79a750b90587c28837cc2fad11d49859a0c52326e6fcbda901756ebd630b29384a8734904ae2043d53c9b2034119df6fca258c2bb8034799cefa1708bc05cb18906abb4b694664ed685b99cad90e75816338dea5167af3becc3af9a87ea90291462578d244e0064965c752102379a484898b5c1c20bd66a694dd625ecdb67753ec7d24901fc3099a775f494c16eebd0ecc236a0004b9de9b244a1504a134017f64501a1f11a58985846b88175b00adb11b8c2efcef9e16a344108df48becdb3d9f50c54d49616b8ffe4940876eea581deb7e673ed20869e608397419c15b43cd785d605aa6ab74fa88aa6a363f8c714dc07a4ad232e2befa161ae241d12bd8c8573c2cc952173f15e9a7c1d42bb4878715005d2f24ec167333e4ba63d732366c20eafbc92ade0b544de2da06eeaabbea7186ce3b83207ec49f41818cd4048c3eb1bc66c6886a43ea46832ca4b6f905fccee56beb658212069de50c9407cc37d741a0c37f7400a5427d549d3dd61326c5bdc2c16e7ddf98f67a2387e67c388e7325d7f2046af534e0cdb9dd08570e35924ee5c22f0c1581f6ece8df28817ebfcf121729f16315695c786284ea9f44f601ec38dd12c2ed2e93d19b431a2a29564690a51b6374841526b8fc05a4875324f756050d23aa54fa4ec76221056765d001f882eaa2aae27e6ec4c97e4734236a01956da8163a3ac6cdda2a9b869bf1ebdd00ad53b4f154eb45105e8d2344332f85c155f907017b8715e8722a7b25ee4ff3bcfd05027af68fb4d4a24b923d33c6807145b86880809d6abf9b684974ca5beb69426a45e6b2ef336a357c748ee5666514f510e134dda51ddbd090b9eadab91d7269dca7652dade2a4b10625821324fead12d5090916abfafbb4e482061198d94618bfc06b33c340e01145438cfd046e38d821443f63867428a922c8942cff073909be1646e3e0246a9d68c47af1d214edd235a49af3786dbbf15823ae111fa76ef0d5d0fa6f51149f7608497dd5205e04ed2b1d55d9306616bf09575273b71843481b4ec62153a1428974a4e955823ae166eaa0c857abb355be09152112c26cff888453aa5f3c1b322752db012fe2a7c3780802dab155a8f1927239e867c685b444cb66275f77c4beb1314824a6e8f3c1402cc56d398899120d1c608d02b7ee52ffe90557c402f804d610f87e8a46b8239ab3218dd83eb4aefb3226eebc5168d5abaae94fcb0f03857cbb35f731a1eedadbe57da8d1a89c6900ee086449b1bd7b103f1ed0d4582b64c5f7fed585f8289ef5a6fa28a07a5a4f981c7f51b8ff50726c3e61100b435f82504834e55d13c666c082a5e8cf4e846efd59958fe8520100b41af37be08f1184f0d90cf53af80b531024948e722ae401b6840f00089f2c65bec2d04f61ee6ac10979370675eb944bdc55b26d5910ba50d9696de2f0729dba3b26f7ea6362c93b4e140d18afc5b2a5d0ea274edf20f0614d724ebabfc300844d02eaf2397921faa897ccbc72958856716180381be179a6f0e50ce6b7e89bcfc57e5c3cdc04aabd4232d964a81d0846ccfe737260c4e04e8e82ad1dc8992abfd9c74ad4be18e99af9425a3b90eba6fbf4f66d252bc044517a95ddeed3318cccafb5acc69cd8cf862b3443e0bb0469d5c205453478fb668798a7cc03f8d5da96f2eae40ea4302b03ba5814b230f7925b6a9fe6158ef14a2a0c35a66d3d5ca812a36fa62da99ea9ad38f4966d350dfec5805626eed0220af305bba8020ade511f7492e157c2d8227a0427b804c1f57944f57b2ebe2c4109ba98cd76b5ad19fdc74b07e30d5a0061e34466ee9e4768675354de3b35a13d42c7276dde1bc5f562895c487646494b15cd4b1ca7fb2c822863960c2c82908b7061fea3d63b6b9ef0da8428862839993981e65d741d9b4b8ec907a7c8cb17a5e851569400db53288a7e30cf8f46892f7d4985684622665202cba500f64a09f13bd33666efd7090d7899dbe0acf16e1be765a78093b0b907b4d1fa369acc46df1a2b56912742a5efe6c8b252df0028ba9441037c3aedb98fb2b45de6b339e20812516d6c6820474a9da7c06181bc4c48660c45f468f1fbec337e175d54a327c294fedb07bc0c5e57b309475d7a299450192301002ec867dd1d6823fab4378ad59ba3324295f02aefac7a821680d330852c9a945a1d12810079bdcb1baa13a9b3491c2840ba355bfa26286ce9dd3db3386842373d687e4c989f0c861a6bd0ef0fc46dc392552351ffbab90ac0597154b30eff6bd35e284106ba6d0c16fae0d733592bc2c8ec0e45244debbd384c15f9b58ba00c054f698af5b831c159fed11253d5a50ff985c2d4295930629474ed597781933cee37ed3683fc287e6b20f23c62e33333f39c810a9e9c1ae16d9d924fe51ca3cc5086a51200fa474c9399e604a677c6e21092a1ab45921f8f366a36a93127dba861e2c07d152d3eb3d54a99c796f4d69e337d5136587cda6c24a43db96c157c23cfbb7890d59e362b3e33d09bf32c27b32d080cb8a8f8f0ca58290500ac8e1b0e3c599e149fb90a40213ddf3b1e13c0311cdb43be9973b453cc8512365db2477c66f9b3b75e47111b1c0f7fa18b945987139f79e6b5a4e3283c831dc4fff153a6d335c5a716981e44634ef2e013af38abb3f4f80c4a7c44bffe15eb9f4a414958295770a3d34e0484030fa030ac297c16dee52a4d85584db00f012b2c27a6cd539ebff5898174d9b2e93390e03992b42ce5d8e1302d57464fe93cc03db279da6717dd883720bd138ce9e7fa4a1efebc175e8cba1442ef3d0a30e1e3b6290739fd2e5711651d579aa82ea3931642948396c1eaa98b6a04f3c40b411e38773500d3c833692a79c721254384a13adc3733d9d25d584dc61dc4f76c2f0c805e80239ac36134c860f841dcdf30e6b11d35b0486b88c97ac4edf9c870572997e6702a58007c68271fe1ab9c130c50d7932318a3a592ffb6fd864e22756b8c259ab4a572a42bda77e862a5adac88bfa875185efdfba971e74f5e02071bec76516230647a5113fab45e454be8877a67574f9e9a9912d6d2c7114f3179242e9dfe915cab01e927c57e2ba9c0dd5ee59300a49711d58df5a160187c808546d8749b2e3c597af03ee83b51f20190c063212b478431b14eec8335e929aaba40329bcdb237c78a41903eeb8342ec7b931704496c505b101e59af84cfea72e2c8598073065c914f0ab6933f8bdfed267ad0c57eb2537534a620d1ff4ea02c9158bc88e40c12195373379f064858424e67ac6ea8fb1d405152f3b1c541e7037549d59a5a3e224dcbac8852b43a3086354d559c5664aa22bfb397aa397fc3946021f5eae30327558ec07b8b7923a98208ac227a2f90586b39d4c3d50b2cd3c67ac44aa96de74d4350db5e0e73801f5b792eaa76b85e7b8b8e58028196dc098a9b757242ca622f8bdc5bb56949706d3844efb3147e3b03396becb4a18d299ed3fd77a8d39ef84df512706c7d2c0e90558e9a549d895927540126e313b79f5b4edaedfe84ec82a505fa3f34c368baced64a4c103928f70fc7b903ee249c3ac02179741bb95b7b257253c5f7cd8d5b5af238f7ad628f781c713ea70f98b41611953925eac508654aa7322f06177bc0e9ce0d3924bce64e7fcf50edcd4be955a51f1bf513bc36b11c60f8cf1dd4e7d7e959b2474d95232b3c82f8b649744408599e0d32a8b70a868c3466de35bce74fd7a85759e279a869d5b81b1c446d0f0d7fa76a604e219c8a040f6338ca334054ea519965c11db33ab5cf7c58b70b84a1161a6474ab5cae3294ee2353fc8509d8f64b9a1ea0e42d3ae22bd05c4e27365854735078b2cd8a06eb1f5f1fd0b08e5ed07ad630bfe17620e094c69ff3e8ffdae53476a5d4c48b5dcebf9475202b6596a3888804b01a57aeb85eeefb5f3e83ee333af598b00882313b7b4a052c8547b8ab19efa65264f779a319cd0f174e1bbf421d06973d8a32a4ce952cba6210eb6c1e0da4c547f0f3bbd8a73f492d62605a7492d8905fe804ee626c95f9b341cd692061707d47055a6ea4263e4b476163276dbd593ae64c2e0a15679414a2c7b242a5f34c85bd58efc2d666236b70ad77f9b16f514da75ab5497cc9388663ed39508474b938d5389aeb5e0cf553594c89d0fbaee1c61c42169cdc68ce76d4435e2645784ce623318ceddda65c719ae02723d6880289e85b8e59af060518b1d08eaa911d89433873fd0f2828d5e42c0fec0492deaa1cac217bc269ec5cd62400b79072953fe5233d4acd84ad303a5a57084c1a0a084319f470262817cfdbe616129c7dd11ae542dfec9a2302377310a9f359234b7dc75cc230eb8a4b3fd2d6bbf1a20c19dd4b0ce213e7ce35150f1b79dd1bbca0a539f43f180e54954bb0466c894b54b08482e1d2a926b3a96bf84089f830e868a330d7c9685939b0c085782478d261a76dbc891636a86340a322ca389b667c4c512c9777e2a3c509bbe16593f3d8e489686d2e6f542f9266fdcf7f110315ea4510f19177da856085df06f0ee49ff6e93efaedc245a0362cad1ef5a84471dfca56585b3198fd46797344eb00a3ce9518c0e7f7e9079735dbf393cd9612c8c1d8f24c8fd99be39731a8b9371448488a627996427add2c9190bc8931ef462e8526dc214b09f78982ee9a66bba9005180d969843b040a1ab44cc6c4dba3414060e03893aa8deae962497d36a3a011ef02276bda3d7db7f313311834a732a0b619794eee73da91ee6143757e28508d1ec7001396372db52c9f955e019ffba699ad698f5fc7364291f43198b0ce6c2ea69c64aed3237c033353ac06b0f3a9b5ca026c5574ee5effc03a9f5602fe965fd9f0b198529cfae9c6bf90a382a09d32e826c533d8dd523352e0816adb718bc093253f9c5f7c82780c5f515b6de164835120ab902f84247bc3ba4012963ece7d180aa8731e827188c067c620e504699df3be423efd2ff53b32af05476d2b87ad5a743c07d1395bb1ac631767f227740618a5eeaea0958aa27a0a6870a4965c00f6d4b965885e71957cb707642c4d51bb1dc62386678b2410583e288e4581502decdcfe1b5dab99918ae33efa9c6891c137cd129a20450697488c4f047b53fee115c4abf69d00015a5fd250c4dbcb6e1ff0245ec85a3e89839bcdbf2f9f009e45f3a2681ae737181e9303ab5cd57546ffc80df6c212f2384c972a982f39a274fb9dc8667d86224f5463f4e1d4ca876bb3ce7f99957af31cf5cbf3c68971103422a44b00ef8e7bd0e0a0cc481f1ec08784cea6a919a5e14960c03c360ec229639dfa884e05017e6e602221a86351223fad71ebddea5668546da738e195f4cf2af569fb5f60ea51c55d30b1f9fe972bd2e1fd9643126201af561cfedd23a486af9a9839c77c4d1826824a3d2acc6047a6cf910b06f97419c1a8d7cc701c1cd02a4ec09e2ba3ca20f9aab05699e1635e9b3472e32f86cc04879caced6fed094c1c7fbd5ae0c5338aa9f858dde86752a464a6612c3e2b6835fd108d386bcb7df83abbdcd021c03592f28057a0370e04d026a78306fa511af24287b1a29956976d439f5379d73f1503ed71b0b28dcd294de9803c069a3ba9c1bf9076f147980501cd12ada5a05b7a6e4be1c2255452a31d315670498892a45bad2c3c912a32c76848ba41d430100fb5773a1d6a8816d36443a101cd5667ada060d927faaeddf7a27a600950afb889df289e0623ad2cf219e518a4be11686befb2db31342619945615df4a1448e3ea9e8e4c235f5f8279f46ab568ae74bdad1875c2bb8173fbd467443829ff201b563f8e9875f1f03119f305a4499357ca9c941d67a3ecd2b0bce711da6d681f51e2a86e0843a1f1623c45c41efcd970d36b2452cf08b3dad1007cbb854dcb15584e2625874b31cb3c6104cd80983c8c5a5d38d9c0b28bcf67156d026ea167ef22ad63ae09b5c0c12f5e17e22d384595971577146d31d22613919759d28b23f6b04503fe94b8f116e5bda0f3000012a162e62d718efad2cb96c4de35fa8293c772dd606f0cc80496a3b9d0c75ea86680ac3f032c2d11db58dcc37740dd4b77406e04896c5086d758b95cd854c630825ede8b54494ec0771c49177cf7b7050f051ddf0aa509ca85f0e92b52ec3deabe22c5906fc4b972d0ae59102324aebbffd16f126f0e946cac326a49522ea3fef4e3c88ebb3848fa43518232c82a0d40a90274768627d6376f504280b7d6572a60886f2696032a19c2cd70051f86bc24820bde283ec4dd01c3ab05dc5ef33f727a97e1cc6d4aedcb1bc85445a879c89d0bc37257f6987fbe9a1ad643902334279a1aa29e09f21c730afaac7b07a57dd86071c24614c0786f630327a767b5521c6a121278c21b54de96ca564a5077bbc75950b23c065fb0515f21195391a5f15f8d9eaba20153454948f59301f19d740528e4d81c87d501d3a621054bbf00c472cb6d03734ae8cc5385dbc9bee4636a7359fc85170089a3ca299d65ec5cdb10b34b4480bd265916afb25afe720ddcdc4a2b1e3e5c435eb00d48476c46908609f750f0c9c7624e85c1c395ad0301bcb813a302b76aaa5750818ea88fc37d50ba0332863d177a2c355de4003f1a7e8dec23ccd18c7b7428e4dbc46176e7a6386ae55fc5ba12924ea472d9bc4047d258943ef5a9c1bdf15203ebffe53a92974cc824a15264bc9c0fdc13ce105908fe169a945a5ccb813970010aa82f98e66e8c3be7146bb1491d6dbeb898a23afc7b3be15c610a2d32c8c9606b45b5bbf006b8a0c7d76c5a339e125c8a4ab4f9d9d7ce4b09736ee47819daff7106dff0752ee23dd96a72b30612a9204ba78646317b200b50aba235fddf444df48c988334dd727f320e488022470d5a845ce0e74ba37d30480e963dcf87528272ad1074eac00dcef837499d9abf80c90b9e30198c0264e9988a01e9dd389221e8fa83c10287743a014d71d4faa99cb94f64c0959c9889994ae525feb0fb53d6049f5827d085241ce2f68360933e0d2bc3179438020fa335200ee1f45d0a3a91e447ac3a18c300e781da598d17feae6846109cc2474823adef769ca4d874fc5e0180e390a8057b8025cf0718a56f6d22b66750fc38362fabe65ea2c5fa8744e5793861011e07d4ef4469c646c2a14e5cca567283157c0cb6be51e881e23b79376047918c24a3bacdc2af1b14842e95ed779808cb7e3dbb7ecf85c058d73274c4bcd2cfb4aa16e1f9ab04e99b62cdc3d57259ad796488cf5ebca609cd7f85b4a66e07733061b1bf450afc6c2cd6eb86412c96cf5d56de7bb4a2e5f259f29122ebfe8d65e1e166d41775f48d5c070c5a88e0c4639ca03025491b92db6c054130aee5873cd84a81423d95e58b24001ba6dc04091260d375ef06a3b504e54c2faca6c22a362014660dc5f048bc0c3ac122f3c083e07a17e4ece08e69fd9877314d3ffcc3e19c9108a2fc0bb0fabdbdf13452f5ac0c969ae5e55582c7c00201ff2a10164096b9e380247ae763936fb55f80536cdcee27bf2286283a70d9b679b3c70aad10a9ee79473e1886dfd4fdecff24a6e7049e9b0df35d2e65014bdc52c48543f07d979592fc3f5c2dd8ddb8930fc7ca1fb21b71e859b8322ff115ab31dfad46d060331d2bb94d3a97f15a72b32e7fcc2f14ab70ccc260fe8ab6b738f247ca293a75acf0c52a62f9dd930b7c789d1793f8cc05756f51c9e1cd97d477062e00c4089a0466411a49364936d6592cdca82ac43285ddd5df95bf8d0d24f84ea75204153b1d8b7bc841f00c943bd925139d40c6614fa4056bebc3dadede29d24c6a52024ff9a62589271ba7954e4d1b424db3fd637c2339356a4f57e413ab4e4c36b9902343db0afcbd45677c2ca994573f6def7cb1e113e528f8324feca99f46cd842528056da5fabe38a4166cb5baef509f5f74350a3c58cf37eac78c65091520a2b90fbdf2fb90ed4bc271c56eb83471c9ce08dbc6058ba675262d16aa13a5a352d810b8bb8b384d601806b1cb6be4190d4170293d8cd74eb9a8d41dad870422261189ac0e0a4a6e7f35157b031466074b70ba76616feaec9e5dbcdc101f1e7c2ed5392b070272d3050f631b748d47208e862e5e49611ba77b1272397dc3f3a329c8d58c3ed5eae035bb4fe5d146c7abb55df05f4a0fbc37f8a4ff24a89a257b4a42e7c68f7c2934bf533ba23d84d8816630ba4106d049e0de5e5271d827c97b8a570a75b7d424537070c78f74f4439f0b5002b548571ebc7db838eb4ca98991f2e7c661e3eedfdec3c8efade670a415b5c6d686021173e8209621ea07787221364676009eba27cc5cf8e058b2a81cf7c08d857bdeaa5a6fbb474f8dbe2d14eac366374111c6b0fbf305ffba4ae17f7b1c8b4a7b16fd343d35ca5fe90d1546a10db741e54d13e6de6b26a5db86dcdd2953517f01862bbcd68d98c032c2a9af18a6e10320bfab0d42204863fb5d709bf7dcc65aa1e5c832dae9730feea39612c19ec854692ef90f75d00e5ef051216897791281479b109d2ab8d635d226ae507e94af0d08a7af3534e8d696e457f44e10b5773fffbafd431daa5969739f6feb5a8e801f832b68148a95f93ef1765446fe5b000bffe66491207e3236d54ee01dc87524f70fba91a648cc3526dcdc03cbf6a1ea5fbac41b753d14006a10d94a3d7117e71265600568acb58aaaa8cd7cdff11e2269e22eb60aff64279dd01c31209205897214e5b5e821a30d9acaf92d32ba03dcb7fd87356920f9363bcf9d680838d0d40a2ce21bfcc0ae5346d0b651f0064f11ce5214a6d079f055ffaee5abe01e7faeeb2c7cc2021c3d1cb312ddaaf8d03dd5abecc518ee4d39c6ff0227ffd535407e64ef7b16f403d7bc9b77623a9f2285d1ee4b60861ad2eed86346ab3abf101c564447302fac6935a1857843edca484628749104b4e70fa67dfbb92b24c1d9eab43c800144d44c3834586034628aa749502547fbf2687f9dfb290cf9f5db2cbb11d8cdde0150c5b9d8c3b98c9e80e381b7907e969570127ad4248e4a6012a6db2487dc03d93a606d38c06a91d7d130c244d42aa6f19b1c9b361b2a36c867d04945169942aae72046810e6c0abf54aa7e873e512cfe2655cdb1a5e9aa6f5e0e5894314fbce1128e2e44256588288437fa0c80676556cac2e9d58d95d7465de71a9070049adc4f59bffaf8d89b8d0daff3591b7c00b5ad38914a9cbdcfdcc7488b9c80e03b03c757750dc175266ce05176b0268f40969d15894dceabb2df6b991323c1f39f464bb04ff74115646e2176dc1c669823fd23eb8b079a3351fec86831df2a2910000013373db98ccba6d964ea1f80a7526a20f1b17c292496e133c58668fd102b41c7257f3eb183a3b45d28234558e9c12c3d026cc80a12fb447dbbe52fc977852ff2ff88e6cfcf03dd06f0102e921d8f4bb6d580c782a7ab24b59ac79bf8e4a1ed122aa30ee06df0152886d5f04a00c673d12807c2d7a2800591a7358006ad626bc111a72f311a66f6b2dd0169cd60c729cc7ceab3ba63c2ca92766eb13416dc26666ee7872b02865f80d1759e7386c4fcd61474a50daa817e739006804f7245dc54e5677d5bce012db02c74e0843f9bc4cc1f0bfaa96c53201a8f0d4d5b6cb5a429bfc7b79c9ea27b37f1d68d76f857c39591a5d8a314d7c563eabf6e656e09ed37594901876b2cebf4bd44280492bf776a6c4f7abe7daba22471c0d758c4a1e7b4897489cd730b1843e1967066ba884350f6152e480fb7b4b52f788fd8d544b00eb7d228dad3968efc40a5f1b5cb185146eb0db2dace1f3f58003cbd198250c3edb13b5d698d8e73f8aced95a5325dd40f247997873c07c426bc0b2244570d04dc48d6b239e5c2bf2e108aabcd3cb091f6f772b023bbea507a10f4467ba4007a30b54173d00ba967e8a5c5106850ae6acf1bda732239f41974aeab87249352832a9296a93d21148fc81924cb3091a24888b5760ed54caa3d4d12eb0162b164add6cd4df341bbc8a01081b056ff62928d6f3c1915ab4d41a9a9b94c8f5d6034c0285a58267d2f1a214b11baa4455a9904216ee860654170001c33fe5e5e495df28a68faad9925973552b070013f9dd88cd301dc2aedef58fe8b4134eee284a8a3f0eaf4fef896f50bf1f908752112a8b6bd72fee5de708bf16e5b69fee0f7991124ce581bc41108be8df4e4230f5f05bc278d88a089a850cb7dde60b678af98d5372a88f163016ef26fbe9396a8a8208e8e36e3f01de61bab10076ccf96b91c13d7d41f879067ced15e0b8b47fc15d737e52a58560a01582992b5b361eddba20b26d02becf2622f61ffd7b8e1a7b441c8cd70902d693cd39ec99f7cb06143ed99388be50f5af00ef5bc98d9d0065a3f16804ae8b4ef54771d101a69356e03a6800a3833e1585255642068e98f019c84d800bec0982cf0d05190849619ccd09a72a08977c16ab451b2ad8585484022ef3dff7bebb7aa972d21ec37c5dfdf1e25083f53a5fc261bf05acccc6457df267380f781983c097d10b475176fcde9f3875a764204101d4802f3f29a200533728e231fe0cfd34f862a4bf845707fec8d68a4cdaa580f34026906b89829ffdabe0ec4d0b744bb132abf03f88e520293b11c08c65e7b3453f9ac70a55d0c972202f46b1ade26bba1dfe180205eed9142309d4a4d909606a394fd08977a8a02585942d9cb150cfac40e97aca83f261ab966b1385d9094f35288053d26926d175c5eea93485e2e3eaac927565bbb26963fdc30f896b1818f0f2c42c316f5f5f5b3b4ea86ffa62e275ffa15184b0f0dfc0739967a67edc23146feed15a81e05c14555324cc9173a0e3a3f8c43d8cca3dc9d03d765cf7c0bbe924d42eca390db9551f9807d2c7c1375eb137ceb1d449aa6c6943fbfe3d3c983fb5f1f3cfa2693d16fc2659d60199767b6eb30c48ddf3be6f0d7b44ab683e356bdb91f3ead7ff9b9af2494a92cff0edf03bd4a0c5a7de76c5e32dd64a991f9de1d58a34247551e83ba304033aeb93b8c055e4a1205d767c39cd765b77ef81e2446ff8a4f7c02b6776ec3657653ad5755e7d799ae5cd0c2b7544c2c44c86a5ce9207d24b9211681e6964ed221da506918775ca0ddb73057aef51a87b3a7c57b7cb2ba7eee90e8466fc5a4f9e14e83cc9662ccfc5038a7a441a7584234f3872edd6d0c48ea45c64a11fa0ae53f47624f43521296746c6ef1ee1607ecf08f0c247ac31c647d0d8e42392d3067aecbc4c8a5e8d60a6f200f54bc0c4183a2029387b79c46dfb34c1f0620f54c2adb06cf32033cb9130355bbd28d2d86db3d58f7095b1560565e9e535a2ff60ec0356a65ec3bcf16d5ec399352574dda7ff46c9da903b25c8a0f0a1815acb495efcca1fb25c4b640c8981fc5ad1274c150624fc246206c684ae38100158ab5326574eeedc6a8569e1a4173bf2f740cc1c0c2c8005de0fc5dc0f54205c554d3a493bb1e6238d37a6583092b0a4e7677d1ad804f30d19492ce416cb301b56f7c00fc0f11251950b0a4818436be773ce4bcd3e1d3ed7e96a8672fd8917eb5e428f0bae7afddf964823d208217b6fb977fb0f360f990f1805be6f2fef5d14f8ef1e0ccc439b3b1488818839cc77c47c3007bf03e6e0f79cfce150883d8987cc35de6570690ed6c34256fed80d51f30e07a9f98783d87877212b1e16b2926b30b5f17bda0591bdfbec7ad8c0e1869398b94fe31d0e23a6184e62e6d469bc3b05a44ef3d82920c5a56eb844a6919797f6cc34e76449eb8208bb7706b23704cd340a08bbcb8749cc9cc2210ea944733bd3284062eae190c6939899a6060e73320dae711ae77a5e4e736bbc5e1ab9c66dba069e2f326f9ad3384773391f1a97eb9981a579c8f5d00082e636fd923de69c1c62cb32effbf29a1b0ac935b4bb79a171cdfb9efa6cf74198eff00e835732789953f3ef4a99dbf47765eeefb153efd787432da73e53a781e5513dbc7fdf91fa8773bacbefe8522fbf97ad009965709097c7f478c131b79935d7dea800529679e907d898f73f1ce6e4efde0d57b2776bc11bfbebbac796120606dbdf83200ebd5f213975ef7e770432cb5c763d3acbe020fd98771744f69818cff3ba98dbe36849e6c6c45ce686327b3919658ffa0e3e275b8c82b9cc737277ede5edfacadc1ddde5616e0ff0eeb0effedd1e165f764078afb9cd7c0953e75e73c325720cca3baa47f7ef3bba0fe764cffb8e10480eef5358c84a8e59c9fdfb9c1c23f3cb8d39e6bedc66bedcec354440be27dd5048be94a6bb3996b6f44b332dd11148172a776b22037bef3634038bea2143d4046a2541cd22138afebeece136b4636b22a7c8afadefbd174bdbf7d22c5baeb090488943142734d404a3b82422a039882b2773b2447395810db99ea35ac4865ccf572449ab62e47cbe87dc0f6724875c8b890c88e4d824472645820e34d43d41f4e5bb1ba4eb80f06e2f7b7838ec8f40e6ee337ff1eebef0f007864f76372fbeabb67ff3b3a755207d1ff1ccdc7ed1caf3d8b16721cbee71a85faf9316f1c69fc89305797693a2c8dfe2c6b8bbaf4c0ffbb28b703d1d96dddddec3963d53b4b82dc9776b637753e336dd47fdeaef3506b6c6bd0a03fbe12d497f36497f9cc42108b21d325bde246816010de271366ae050e61a4779a8e130099a6bdcc6b91ab76ddc2e7ac2768ddb34b79a469a87e124e88efe11310f0aa0f9cb6ddac6a5b92f2a8897f71b07a1f9cbbdf76d27fd75d8eb4ebb9b28506edc2137cef94c70ca9b4a5dd2dc50669a6f40a6cfb9327da61c7d5a9ee0c353fec0ef8b0265e6b1bb8179ec6e62bcc3bce63387519a83f50e83fbe5dddb4feec5f46b13ea1898873197391773fb48e6f6cb9389b9317bdd8d4cc9fb7c1fcd5cae8833e10d688240544fc15c50e783eb4183ed775f3de4a4d8603ead952edb98c6616ebad5451521801b17c04f7363ae61e3e00d5b8b3c4fe386b3489eb717099ac3f62ef71a3bb8a76ed3369cc4b08df2bc0d9a671234bf7c763b5e5e4a3682d85a496edcda2380bf5c11d0dc3808f7d46d5c9a39d5eda22e6a55b809b513d58d116c8d2be29c7045a91b2641057051f2a66f42db14adfacfd011728f4e14789043cd091b6e40291cb3a70ef9348995f8c66bbe5e9f77d4f7d9dc4fe6cf3cd25b4c2279f6d1ec993ed388f536a0edc8ec38d9afd7abc7f3f6e435b99fa933947bbab7a1b98a31c6e885f43dc04071453c7c7ac1e2e2a17cb7f2505ecea7bf1eae872ba25239d7137b389fd9c386dcb53777fa9b9ddc9ac8ed555f60c36de828cb6f4344527e6bd2df94f3ddbd5df7ad49bffa83f93c7d0f6dd7e110066f4443fdcd701beabed9b3454e4776d10e17b697945c4fa8f5bc26d7f33d3c0c0e531e0e71e4b05ff7ff4a6dc27a0771a87d38bce57a3aae07077da2f405ae88776ff8d9dd745248296b3247dbddafa0dcbdbf1d6daf563d6915e9922b32ad7099f0aba7906753916717b27dd857c41c2df7613e6c29c478d84bb84e9267d84af2fd3f37ce4983f3432f86ba0d0813d5c891490a8ce47eb50a893e1249682d4fc266ef13fccc3f00f537b72301000000c0b9b560b6d606b4016d47405082208c4ddb1b00976f475ae5b2b56a7777bb006dad564517dcdd4d00dedd0d00de97fb817312b38833f33077c625beec6e665c7637f87d37dadd7c381c92bf7346361ee2a079980abf87a7540df83ead98d4e1bd7128e487dcfde596337ab95c9174822be29c34cc6370a8c5c87c06cf9c0687a7b90d1c7eb9c6ed2771669ec66d39c49979eff61c64cd7ceaf651cded2d7e260d0ebf991f19fc13038343edf50298f78dc41c0d73b7a3262c38e3f27efd42ea6e5eb0b4f2e5d28c45613ad62df1030b499372cbed1dc499790e2b795ace4a5c1167d4aad80100800bed3a29a5149e10b1620e6c18aa228b17b9e00544a668a2054860cdcb27332ed6ee4f4b224794358fb6577fdbab0708082866318323497002c8891b702074440b3a5b08210b3a29907db3ccd152cb4de72161cfdd1b238d5f5bdc8376f78821d9e2be794aa02352220937a00da855520570a0430d5e37d8420a39c400065760220d3a433fad1f4ec8018b1cf0600c3da843019ca8220e403500431ca460cdcbedc8d05c6daf6d686bae677bd172638eb1bd668c2bc89c4ede8ef26baefaa7b7578fe7eefda3591c6afd7ad12d37ca58d39771e7a571a646b0dfb20217433c77786b6d40fd63a493b42ae48af24fffcc6e714eb822ae28a7c70d4e0c01084b8ee0063394dad0043abca1065a1889030ecab006298844e1043c50a1811cf4a00b4c7a84a00528a4a088007264b27345ee57ab20cbaeb99d29708e4c76806af63eb989baa7f87987715be2e7bd87fbf8793fdd95f8797f716dfcbcb3dc52fcbcbbb85afcbcaf5c1a3fef2a37c6cffbec8078ee5a72775ab12520b46cdf1d10345b7c84bc54053976de7374f14049e67eb922fd4dccf9703dfde67a5ad5cfddb567fb26c6197bf9b2b89f743d31468042c70812da400738c435ac410a1cf480065228028624fd62828222b9e120575c8f04b38839b6a1383373703e7540c14e8e4c7e767cc8910a464bb21273d54f1a9cef2d56804525622393223eb92bd2d32f174c31545b606350644e1d27272547767c767a6ca3fc4888fee6c3de224f943381c11c32d7571ee572451a9c3dfd455665817d779982bbd9af8982b9124d62a5fcd4e9c9d3ddb124e3f4fa36ddf88899b7579ce9da08aaf111fdeedbd08e98fba8be3c176d67258e71a6bb4d47dc4ffa9b8d1b8848176955d82f23ade27a5a255fb327cfbf7ef2dc9a6cafe8326124e13694875af58aabd9852b54c1051d2466a08235df4771955364480c423048c21198b085b8cab9410eb4c04313159c00083960cd4f9eb86a400bb270848818c0c0843ab0e6fbb64f7f9dd6f54b9ec0865ccf51d83d73d52faee749af226bf258d24b2775372425e6ea4783f357e838e18958e4f90905cbc3e7c7e72776385cc96174b5ec10e254b283ed6ed3ede0e103e403347d8ef0f0016a553fe6d8f1f001f201e2e1f3c3c3a7d54719a857fd9ae0f431c244074d72188f98e8c0490ee3d1bbd5e1f63ccfbbd73e497c8ef818f1f9f1f9f181a25f3c7c8c94ee8d6bd35f7fbb4268fdecf6b18e3e3ffdc56ca369d69e4efff74d15d83ec193dcaf56452627c022cff793a93377fa3575e4ab5faf16f4ab5f793eec17f7ba4b740993475c6865294b730a369eebeeae28fdb9d27ada88961a9d190eeb351c9e349f39b19b44cd3d8db3a28c680536d47a5a4655f6b0359ffe7af2e723b1d6d39fd47a72bdd6e3d3aa58874ce78f3d23ea2fbb620a363c658cdaf08efcb141c63009479c11cd9564650fb326596659508e0f4fb973467f6a9594b9459ec70f17f9281fdec8e1716429a7c892874f10bd3c66e0e2318325465a11294b35eba819e94f6a3ffdc94cfbc9f21916adbaa6d329d822871a4ff6ca5e59f627a3609fed37e7496aad8e09d7974ceabb4b5b0a0c19572dc17e943d29a5b335124a0f9136d6b267cf9eddda741267a44b5fc1459750d3c95405963ed25bf3a6bda6e0524a8c87949aacd5a5023c640c87b1a8d6aae1fac3a09aed2ffb8368d8e2527f5d55da394dd334ad0706398c45da7968b60b42883b73ec6e78f4d73b368c42407a68a707398c453c8eb094a41d45c24074265de67e77777777f749987679cc6009029a5e0322767b31cec8dcf5dec0ddfdd3d4414119340d082d3ac1167278e2d1d44ebc235f2dc83a18d78252899352b68e4eceb08c5f3541eecbec8e204b196bea8c39eb14303356694e6e28f46a077bac486876794a074b1f23ab5e99b18e47a4b8d4aa428c31c618638c31ae808b8f2e933bdd1d31cb3823e59c73ced93d70721a8538c787302198e5e966294392e6a4bf7867d10de57cf144e1899e1c99fc14c957c8518a1bb4b2ad3e79126989e0944325747474badc0f55ba58d30f514a39ea888ff5a169c699f95a3373fdc4b273d90db1ce316735c43ecf61f7ca2db21ca49ef6d7f59c2ce5fa1a7354497bcea6126b7df9da022eba8429b27d5010bff9b045a73714f4d010d743434413d3b02376e610fb31757723a3ddb63cbbafe86e3825aefe261774a475c40691ede494cbdb6cb09109148ee49003026a15ca37a156d9cf73dc10e7a4552b9fe78c620e179fe7d410756c3f916bc22551c2b9b82579e3011bf2ec2b4a1bd751232cfaeb24cbbbbb6139e7c9ad09a14b86f150c6462e460c3c04c787c3c0418213e33de47ca9ef8ba8c7781132def21832300e8cfbd012e33d1cc90f18f7c1a6e5f270b962bc87fff0e13062bc8717e1c361c8784ecb7fa0de72f99696cbc0437064fc848304a7e5590e10238888885042c9ffa8cb78112d3fc6f95b2e03e320f9718c73ba8cb7e02143705a9e1dc98fd3651c855120b84a4c701e7589708392ffd1f2ec3f64fcf4d8a12426a2e5d98b90f15365c2e5f7f3e165a300f0902372c11cd0047df0e1317eee5ec99a53468cb7c838d746454b38659ddc42e7087bd5b1a1968f5a73151343ee2573ce05f390137a79c80d7d2d0fb9a21c80879ccccd1e734f87b93d1cbc30de32e30170f9cbfd871f3b9b96b99115f372232b0037b25a8c5e4746731559f2c5e1ad68234a0922e2b81523ad9278236a17dc0de237bf11adc04ab911c51c5b1eecf6a6c20abe20314657603d105f3908e9253a042b5fda8842ec67333a5234054b7be826049d9ad026534701630b0a8adf3cf613412c8aa048f160c3ed482bc599f993146020aa42f7d08fdcb0faed862fb88b84cc21f6132651b996de8864dd88e66a3bea8d48d6a3b9924678db69288c24f6e106f1e37cfa9b2f021a66f0622d51dda07383a8da7a103f9f566d53e388b0de5c1bbd83954164d876fa4371f77872e8f1d4bbb9fadb82b6b040f3746592564b4e8ac3d38771a849798dbb1bcf1296e34847a42d485b64d2519e1c9ee142d360659779d2543fc9862c8de2370fc2c4c4c1481ca098021c944c010e495e4a5d678e4689da21cb1a255a07a01c6a3f366e68614d97bf893342023812808a0eaad51c867c8480914ada555d57b1e9a0fd864e438f6185430eb6bbf6128e013cb1f4dcb71c71b03974c041c70f593414047859eda447b1511577c2a08029012342bd00a0582900595efb64b81b0278836d1fac091811a2ea0871959d84410113025d9d2e00951b6c0f0fdba77b693bc20d3a8a2884b8ca9e83a443fb6c25e4a9f520cfd3d5e93d70aa551bece93b627e149951c801f9481d51d684346339903a361aeb0a0716963bd5b62ccf5d5943654a9d00546cb0aad51a2cf755182e3e83804c50ead877f726577a2861dcbe8beda65befdd957757e5a59b72eea23c76360dc3dec8e280c422203d601b168c030790b942c51b3157a84822619cecf2248c83041571486f8c8a8facfac89a4ac8bf3807669fe5f1468d42c12a21f18e1c7a81a38de740c4d43666c146f94577d3010e4427d8f89b2350a73f043253965396d317dbfb3bf5f22c1875c23e4818c59291fea34f1ab2bdcf827fc8934ec243eae545b15c3e87d517c582cf726279184fa717e7809025795efa4823bd526925d1aac884073d7227cfccb3335b4140c8a59f1a1c2187128ad30b1620ad8a4c96a024cf4f004504e9fd1fa4371e8284e51c1ea2fdc82ef110ec190ef6faede220f9816114cb2b8e86512c1845441f7b11f2f518bd0c882c17e7b05b7abddc49577b76b7af5cef2ab77bcab547b9a6c7ce870bbcb363b56fb7e96c02fd4d8d2b75d3742718591c98e034024824aadfd18e7df3416ae96f726082f3da05c104e7334cf2e0537fda0f5d0225a7a91503175dac247ddabfeeeeeeee6e9296b9b0240babd736edd9f2b95f72d2e055ea8f4a1d514a11d4520bb965155a2ae9cf2583aa8e95a70ce408895247eb84f1c5611a8771dc16f1e07ac26d58d564506e4c49aba214762092fbd2483ee99564a2482e69558c421349726722e90a6511d723050b88e45062219be4be8661a52875cc96ed61241cfe9501214692557f9aabc8526229b6da2bc719736273e0a24ba8fdc8a8f960ada7ead8782073255912281f49622f70d2c26691a5bca81e39995e1e1192304a74b05128c79c814c504eda041b5f078c6258c52a95328c2e3a85f608cacb879f4d04a58de08d9f3c76b548e3274f5d99a632b5b9e223409029105aae151f3124534ae3c0451a3b5de67c96691a86c3e7ec15c361a645fa1cebc566c723865af7a30d53bf11461c3fe4b6e96977a88ea6d939e30b0662c873626a69132eba845b2b63e7e61312083b983588436d84bd326171ccd5ca2ae5d8413057a44b1ff973a3532cb2c721812cc6421ca74894431cd839d295ac36c28c48dddd2a244db3f674fa81e67f3a613dc878714261e15cc8b8a4f770557eba30fee2a2ce7977612a9da57bec6c5ac68d2c14ae6729d21213366c9d8c9dd348a4ed1ac6d1be69df30aa71b693481a772d499b7d27d8f62143a23ebbd15c2169c1304efa0eea2a9b760c890f3804b275e66ae5d825d15ca9fc855155fb0fd2b5d76b2ae77258a13c6a9e870dc43dec16f663b1732b57b252aed15c6946b3e536bd72238ba3496c6711b1c698c8586b91b114adb3358692fe30970fafaf3ab68d5c8e619f3a333e7beee35cc93800ae76979bf219d7c5f15d39ca4559191765cff27b5f3c769185323457ad8c1deb21ac8932e603ae1d2475344fc6ce65cf2816f626d2cebd08d2378cb39d740ee320f9b19d84518dc35dc3a88eacf7879d74bf09622085820ddb2863dd4dcbe56d2c6677d36a8833d863d7467106934eb0f208548c10c823ea6dbdfd112eae558c8a81391414ac246f07b59225197b07d51fd816ec1c8751f5dc86b9ffd0cee121486ac53f526a46f9e0b6b7dc9abb3b22089963bcbb9b9677e703e5db4555eea22afea17d7badf847ca65e0212b4ff91017d76c6d4992b1c708ca5895d8eb0f6ce796db59fbf62252cec5d88c5c544bcf76512d38b2a812bb01c5c0dbcff693311fdb1910591b46c5f8f61c560c8c2282f4ed3f48dff01024313e04c6498f817fa80c415de539ac964bf3ec5044a09cf41f2827e121485a3e841ee52df807e92a78c83ce9724fb9db4917e52a97440477ed4570d7300e921ff3db71e8399517b13d05e3cc6fb8e5cebc7251f691b572171765710fdf79f11d1757f9cee93b2cdf5979ca23cbc549da5148476d8771516fc280c8423997a2b2e282e5c5a9871e5edcc862b991e5e246d60a2b05e5eeec98bed37d873be93bde774adfd9ae59dc12bb6c72fb3541eca48b7dd3c1def964ecde4f9e4019f358a51b59dc8daced46561b4d109344fd61cfb01cea0fc34e9b601b7bdc5a39ce5802e372e4125a4e6b3e14758c95621806278e1733fcbe9ab8ca9eca0f0d901fae561996690cc70643955cf17c88ca33c6181ff12c8a38babf3cbb25fee2908f59e3d01767e67d60676327c85c797ecb348945891a98e7cdb3077a8a528f25aeb70a393c652933976ca2d9b41ab1b43f6dbe92e0a24bca0a653047263280227391c65a9bee06013db049fa9b4037be7a68b3bc5745c8cabdbc4256728642bd879fce8414dd258cb516e6864b64db9d6739efa6acec3af9eef6fb6d2fb3d7ddfb76b3489e4bb24d77979bdd4d2b91e5bba5779b9e45a4ac324e0ffcc0fe776b640ed3751fe8cd783804c1cbf9703de041ef9db7247bffe214d9c3611275067cd85d06fb741df64050a6eb8ec832182e913b1ce6e4cec6c4ae8b19a286acb1ff9e92359e5743d678ffec3925c0739cbdb3487ff6880cfcbe1be3dd3bccadb9bdcdf5d43c763735f7bacfaeeb5c724df7a9d3755dd7c9bce66e2da0fe8ed0f80c0e7fc8339f5dc90ef635573d4470e673e63233afa191674e13bb539c9939285343032353430303f39898981a35700d5903731817879999498129181818989973b20482b846c80ff9c56756b7f2c0a25a505e77208f432039ac17b292714ec6180097dd8d0ffdf2d495b9c6532e2761345ee24eeacb70defddeb78379df9a206a0e7399213c100471282483e7fad21ce6cadcbb3439303db63f76d6c2d0dc6eff2ff3cd7b63191a181c0ac932cfc91d0f5993ba4cbd461feb0fbcbc27f37ddfbf73d6da98989898980e06c67b5f4af39ad7d05829a5f576c8da0941e3fddaf1f80e805bf3da2d20ecd7e0d21c6c63212b0078ec86a0f10e07a1f1c64130f062212b99c6870581dfc75cb08d370e4b98723889996bdc468da752af914a615a8994c2c94aa9948dd40b7eb98de3c39cebae4763981beda9fb72d2b5f1ee86e8fcf23e6ad50b9e1a4edd3e223d915d8f2d7643e4d41f2b71286bd7a30f2364a5afcc12e65a7777c7c4d4ae4256328c262f31ed82c08781f9aeddeff682e7badb61adb5768898cbb4ecbaced677e0ed77802ded6733b5205a9fe3ba2bfbdd757fc7d7ed88b9cc67d723e63252c65ce6323128203ccfab5de72e27d392bc30d76e04ad166a1705c4f7eedd777c384a8e96663704f8987b41808f790cfe1ebb0ea380e8defd1d1db671e67b631b6762d7f577d84fc3e11219e6f58d85ace4e486b9daf1533766d2a519c60d85e40a002cad0f8fdd8d0f34b70fbd8231de886a3c06872b39e65cd5818539781aadea7352e23035039b7aec2f25c3d51cd89843a67637e00d6506a3ccbd542a891ca42fa494651e96b2bd0684fd0d4bddfbde3753e7644946667bc95c76c581fd2e739ad6c9343d51d8c9354fe4762483b7d7f7dd50e6afcbdd381452cadf65f0f6e4366d7f792df692c87d9b190ec932787b0929e50f6f4750d870d36404fff2486deadfb9d4dd88bebb0d35196ceae136d4a71bc7791c56aadd8d8d3332c7ba1ed825ee3ceb79ff52f76eea3729bc0dd9b81dcc392dca9e9e0d0cc2dc3087c6a5fdc53cca98fb974b33792691fe66bd81ad36b028d74e70bee56afd75cf1f39e470f2d460985b73f06e47faabf19a4b295e329d8ccca5cb6afdc1fce5a88ba239ea329f2e8ae6a7a7ced9b8e0fba6fedd7003ea6ead81fda6c9a4b8c4685ac931afb96958cc8d398d1be6641a97dd0d8d733308fbee395976570fe68037899a2bae216b62685c178fb92cb72c3f40301c14adfa0edec68d20786e5a7bef3bacf79c6cffd590356006c1dbcc98bb0181b7e99a1bae6498d35c246e500fe2f414a6fdc1dc66c2dcbb9df24bbf90a0197563ae7143212b39fbfd76a4b9959b7ec9939ed7758fd749aea77decca59eec2e536cd492e7634381c9269de5d8cdda6e71133d3b0d0a49e7a67adb5600da923d5653085c39c9c3a7825084a093e75b18739b2bb91dda5719aeb028732bba07196a768d0f82cd22a96d338a9bba181a59d4b324bae216bba50e695302e097fc81277328f7305f31a524728738906c71ab2a6fb6baeaa0d5c0387276f2749ee2147a11d9fcccd5205a246e64f4331535247cc12cf22fd35ccb1590408b97a0a4a48e33430ef15e67a6ca06010c709c6f8f2186b3cc69a733d2fd8060eb51a38856b70cde5bbee3237f57e4d0dc4384ca266f032ff707802df9de696e66069e0246a8e799844bd91ed69621e621d96b9ec7604e94e730c0e023e26899abbd33c4ca2e6ef3438bcf1b215cb3c84c14974fe2e83435a73bf86d401e220df636edf5d1031365583c39c0f07e95ef3ec86a8b9c335644de322399435648d74717959cecd928b1b5fec65b7c3bbdd866a6870a88138b4127fb7d7d364623859929930af797797e5bb9d652eccadb9e14b0da923669667b3484e061f23435303c3f50dd2ef1c5efc1d9452ca09e49ca0dc7537e6df8d30d6a6fba793b5f6a64b6b6870f8721998fe4b8e1097ecc91c7343971cbe5c884b26ddbb614e26917eb241aa21f31a191a97a15173991a34f61d730973793904f8d02577d75d77dd7507caee1ef362692c4d9f93b73726660212a3602effbdef5d14ccc17b1d0cee11fb030fe27002d9fb87c30964896962ced1d0d470c91e16e292696afc855443a66a9eaab94ccd656a6464646a649e929149c9d090c1349eb271994be3f5a668d090b161659e3a27939249c9dca66d90fe9d93f6ddb521697763e35cea610b8d872b35de5df3ee5ccd9543d03cf61703f39a2b1f733d19ed46ff905b055ed29c477fb3e6cadcafff74ea3ada60570387da69744fe1f034040d16e2926dfce51607b1f1cfc6e7dd686d74df3b181ce6641830a61fd392bb25d3bce6f83437f61783c353ccc395540ad3bce6c6fe68700c0d0df897c7c4d84cf08613c831f72e8cb53848f78ff4affb2765d75d72b464ef177e0f414e96b7376c7b7b1cb411c61c75f0864be42f2728872f8fc1425cf227c4a5b361e336d3c625a16e985324bf1cdf7002f945e6c6cc6da7ec94b99000703b8f74bfbbdc98bfcbc8212f979923dd3087eba181953bb822f67302b993898101afec7a3c836067bb7bf7cb7d3b67000421f377995fe66397f2cb63872bf9a525bfbc9cbe3ceb6e5efae57d4e20f763cc2bc2bc62cc5cf776322417356e970fb7ac9cfa9b7fe9724efa9bdf8072cc9b50aba6d882ba756890c3cd75c395dc195e6daf15972c71cc696e2824d31ce68632c3d4c89cebcb61980f043f9adb1b83c43c6b191999f0bec6ca5ccac4dcbe361326ccc9d9696ed8bfefae47e7ec9fdd4d4916915d772e3ec076b73194699e3a1759360aa9c09569dee78290b9c669aecc9f07414e62e620a9d33cd4f2761bef9a6b3548277bc0bcc1f7e58e9cfcbdb3d24afb61943daa07f8ef3bc0afc777fb1d5f8eec0e731350f3ef0be82effeeca04212364880edad48ce82f7b3bc9d92b15566291b3cb4bcab1db519f01e92f7b86218bb09a051b365016b12c6259c4b2d7296cff9345facbaeddac5ea1a885e64a9b60764db3364e5994659f473c11c1ec35c8d977903320e4ecb1933d712613ca99d0a6a31991e6d448e17b44d279c41c5223655128ec219348ff5c752769f67423487a89a47128db3389442291488f2ea427a82b6f593663ccb06049d8ebe9fb1722fb761e3147ccdb7bc41cdab7edb4b56dff5c79df34bbe11bc1eddbf650cb1bde708c603880bc3d768f33dba3d0f6edd165c341a8abb19e1c5bb5a9b0344b1c5da2aa3e3a91923a4a4c907297acecc69c1357dd0a922b904e7037b294982b0844905e7b289d2043a6e70e3457a7222dbe9ee4eda27e70db39ec5d14dc6db8cb23b268108e309e5665cfb2ecb58320579f20108e2830a18dd0ddafdd4d03f5d747ba45d4ad29ac0c3fa43ffa2bb81a88ba828866c82588203d131a0b327d68e5134ac419a08cf5d42e7581f4d3fd2aec9459c495f6146d9d4ca516993e3b8eb9d2b034aa38328d33d268ae6e8a0e9912d12c6d8239763eb29150e3c8d228939ae2808b2ea14927570cc3302ca262cc84b2236da7575a51d62428573ae4aacfa66855740dc1956b66946be7720de10c39ccb6c83523ca357392eba38675697b7c2ca1c4fe82ac3d9dfeaf35c1fa784e49de6e64752b4ecd0b3868b1866c5f42ba8188100b09fdbedf5a2e6a9a16856890246f57b2baa569d69e4ebf16390ceb6e304d9b5558ec3613bb3d5f35ed9ee679dec9ce154ef721a81f29df9e825390c37aadef21aefa8908d65779b403a05c49f74e93d8ee0e59e2893804b1ba635826543f04e5db7358b2634064c923948b2a02e5294fc1cd33c17a142c8d265875265833a18af9e47aaca755a6576bada6699af6d8596bb23729c9a667dd8dc93eeb6e2c969666ed58a70099b19efe6acd70e45abd978ea3551d10a6ec61db8dacee8aa0095ee061957004d12e5b19ebdb1a7d164b283c68509f493c640c4b2f5893ce12b262262ab69e19638c311af5974a8139a4aebca2564490bea96b8214f563bba822e8372a3441fa20507a34e537b9a23d13943a5a0708c3c8f451d2944cb5384335adbbbb4f3d4054c3a1cdd829d37b3bcb0791a75be8b44a4a4cce170e49b8ea607ad41fb5597ed53a3a3a3a3060d12622183302de908208c6943c5f7345b588203d139962f3d5d1a3384331a04ae9b71eacb7297af23c273bb9559bcd2a6c562a65380877adbb2ce338cc71dcb3db4cae74ab15b4130d59c2480c5a2cef1cf7528905acf9eda27e6cb7b77888fd247d763724d9cad94b9f55d8302bf5f5806ce520a5c78ce37d08ea07cab7a3e014e4b0ecb7d3249612cd1589351fbb00280fe9933c2916795227f9c86a27abf2d3ebaf09cedb45134415618f72143c7570174d70f6d104a7108260434af49a730a1bca5677d96a95e9f3480ee9fcec803065d3124399bbcdf4ee08ae68b5585bee642b4876d9cadc0d658bbbb5bf0c0b91ad5c1fbb10845c31121bd22a58f99012957a64866d34a0420eb0b091e369441df47fa4420eb6c8510a28004246550c449665628e9b9aa9c9f156eaa0b88b353d717fd2818b2e61495616c42a5934aeb4b9229d3211575a75692ca835c8f4894cb54c6b50a61528d3daca5a9c5e149206b15e641ad41f9598b62608051b59f221356a654a872648872e2d9a203d3da25bb42a32c1c14ea6af403549af5c0cd59d56452650609169ab1639aa3e99ca179339942187f527d36d08074572588fb0429bb1daad56853882865cad0a6951a6a7a7495a15b9b0851c522de4902ed1893964a6c7418be64a9e9e0e4d3a24d32a296c488f327d6324680ebf4c437a84a3bf1a048b4ddca5d66c92a6699af69a655956b1ac6a5957acba3a16697d1f33c43124dfff718202713b66ce8632a179348d8c62a5820d65388db2a1252a3a25ae16c192e24a9d82adaf2d1be515b96224685d39d925764b79bd529e4cf94e71c51cf2f395083d71667e72384e70563cb326294e344cd3663de7532ff7435f2f5ff13ce9f51ce9723f720bce878382a3dd4dcd3429399f9f50c32946294429432945fdcd9427fd4defc8c7dba255269db0947d6ac529af149f231ba64cf1ca33f48e525e79ce942725ef48a6bc525eadeacbd6b9411972f859993245ab8ebc234bbda309ced03bcad3aa70434869e5598b605140e44ee2cc25050bc307cb4ca25604cbe578d93180c4f28cf24c6925818b5be6b098b7750651d6561379befac8895a8565398be615fdc926ad9a93a8bfa22858f94994e92711d7433454b34cca8a433b0319d44f4ec6d8b1b923799e9b5eb05148367439a0febe2fc75a043b73c5e129039ae0c47006345799d00467269409499109e5f989279dcf88f29c44dcc4563003084d5a7aa5664312850d304359e37ebc577db4535ec14a4b258d315e21b116c166747b65ad6e57e67a65ce5c364c19c247337898d859051b723d5aa916c162a5193b98e1d32a2c6b335ca72564ad08590b5158c610575a1aec1bb28659e890b5572858d2490f5988588824e67eb2562a4d267632a94fb045b034c7384127d81086110ca3c3c0a2ae588822a8bdd6674da24abe3e238af55951565f59c01057f8081f99216baf9c0bbbccba26addab22257ca90e92773f509da67178575820d67f064ed33785a25af7d0611ed306014657995d65c49164b2568ae224b9ee5157374599ee509cbd10b9d563961da4196598e2b184611d4be6579d34fcca192250c36c4d50c9f096ad760c4216baf4aec0c9dfeb4e3a3193eb50956862bd7201ba60ce120cdc5f1c419edb16340b398808fb2f6193e30284f0e6118a50c65ed594744b364b826a8bd2ec186269d1a64ebbd577fda371c4d3a732559da4d3c291a146c682292b57bafa96dafac1d862661184d50dbb4cfee0686517fda39184652c66bae344969e6cada5bca78b110bd8820b164bc26a83d94f1ca1a0ca3ac91ae6924cc423441ed5509369ce193b5872c44599be10333d42e45b727bbb04c63b462047118a908b67edb5a3546927c6300f54781a839a5c7c551126c8c9eb94ad1e9c9f4306200d152b4734e4cabb54a6c4e26760e31b193c9260510a0c8d548abc2149d9e1f1f2341ad0a63f4fcb42aecc115a348abe250aba214405b64fa18477ad52c1a4349a659c8610c2814405378b6d36741e65a9f0de5edf56136942b4ed1414298a293b2e1149efe84c21844c835898d52f8e027872e8e60842e8e327d3d824dd1c9f4284731877ce8b5b622a170334a29e293319cd2d39f11600c6158e693a96b825e2b0ecd5576cac4d2d7225852c700122b8b011403688254e61845769b9e45564c2dacbc56157218032806d05c65a7d784bcd6ac422cc270e831b1626ac16b651af6e0caf4d94de999206dd9300650fe2bced0bb20aa44b0f4710ac51c31d35a5dbcfaa3293f991ec32e4fbd4800b1436679a4bf22fdc508ca54c600aa43b0a1cd610c5beb45a273180328d323d1394ce9d9b1230610e20cbdc4294f5019a787c5008a33f4184ee98933f4f9f260188661b536c9b5c600923a62a658a4f4b8144d152f74b75a3d57add39140775ad54fc2459790f66cb922d1ac3d4da37a032bf1ed4c7b9010b99edce79e2751cc2183241639cc5cb933a08e02d0bc4d6b7335df134fa209760694fb1910d723bb9de0a24ba8e2caf495e678c4d65c8fd899e3e37cbfe77358a1cd3cadaa99bed4c35322d21f2df59478a60faa3341fa2a043b1f967860c028cdc1cea31c6a3a2196433ab3a6d35f14a4d720486da73fca71259e1211fa52107d69097da908359269a927d31250a6a556a6252599729bd6aa903b2ad1129106698908f46149275442c3340dd397745a454b3a3b94275fbad31ff6a3566dd12a0c6b3cf56a3a40d029f1947832bd8a2bab02276592202c5bfdd587b26524cbba24ab598649610722b24787c8932c659546962cc9317774513548a10e434d0835d184032c54ce0e71a8113944c3e08008f6e312215776252f25d9660c27c172cd1c98601bc9a19ea2486258ad35ab533eab73665372c1865148081f970d6456bb8344ce63ef29310cff60d36348a6c7d1aa5ae7c4613371a8f94821872fc278b21b33113c5a352319a21533f53b58ecf3218edc40b2ca237b67f4d8fb071b1cfdf5e91696c774613e7210ec4234b0e34cadb8f4d7b7426359bd4252f9346dd6d545694f8e08bb761a8f48d5e46d186b92a5dd18412dce49399ac45e801e88a4923eaa21532212d6554bcf459b9282b51e95db571d4be98d982b1829f9837a7cf570d4c50e43fbe9665fb9a8eae2a22acb45d5171755dfd9342a4581327d8823d314c591a90af6d11fbdc53c56d8c3928e1168b9fe9463bda9fe28cf736aae50f6261c7385b218454496611cd349f74c2761148af70ca350228b3e5a7b0ed853abf268530e84628a72e37629142c07482f9403a198daccbede094000489ca191282b6129a66a5fedeb11d8b5ef905029d88787512c134659fc03bba71dbbc53f48f7eee12159ea4683f4d8a5a938435f7f60edc354a62822b07b2f8274d32d0a45d947967751166b2858eba1ef0e458477ed3fbc6b780812fb21f3de2dfe617a8687f44ddeb36b3a76b3ecd88bc88e611c243ffada71e6338caad74ec2387d0da3aa4da3aa77513b3ba4673b2cd28dfee88d98f4da2bd393e837ae44df6140264871f4475f71aa3f4a4f9be06367be4fb51cbac496d3d4640599755a86450c0332012933209f642925912c31ad790821bb2b04027c640d7fb9edec6b73d5bd7df07804fbdd8d1104d2251c89b85abb9bec15011c76653784cda11119bb101fb9d6acb54c6221a9dcd77210f503a98cd59d2af49041fe943abb22a6e6ec69a3f3935f7018a2c21443b4ce2674326dc248a62ee6a4957e52da9d511c6462b472b5e91b07999f39083da5746a326b6c564aebc43a932433f4c4288655acd2fe2a903db54c8dba8459d16a634929a5941911cf3c7a8dc266456488af58bd93b492f1734e21c4883f196d76eae382fd6efcd0aae6316ffc247b6ab0841c5e8b01155af01272b282f5a415c3b22371495c32052eba70ab946b9d56fba85a895a75054fab8a48273e4fb29547add3442ad697c70c96489f56855f8642bbcd4388fea4103c1090e303cb154c8ddc8f3247ee9495ca6ae5fd1b7374efaf5c252628af72e3044b4f99f12ea30e5944d6c86f0f67ee6eecfae86f89c51e46212180cc95f4099245a40ed944d6c89fc293b525d9a488cc324836d92e3bc8ca96441394d734229f2ccf7557664954ba8c51c87942ae3f9dac8d92283f73f73a7c55251c620e871520555578735ba0763d9e49241b04d44bd2b9ac1bdb2020a7bba9614ee62144abb2cbfbe0babbd1a490b884a282e80fc425b9e2e8b24140ab6ef427bf5378f95385d63307a54b6a905d339965588665b9d2bd05173f65bc9da594524a29a59458a52e2bfd49a961b2e930ffe22726b8f779284b76c2a1f4e1f0f602879a56719c200b8e46384e9062c9e2c0d4347bea233a4fc9823c2513796a21bba33ff427848ffee64f98c7595e75ac11072608e62a31ce84353b2e1d1775713a1969c3b8d2109109ee8d1f5243ea116a2b7ef3b1c8479c995b6712899ba9d46694e998a07882054c9cb230c1a8aea356a18290ef4b5c8f92b004b52adc8c481c4fe5d98c48242e7b6d254a445f291a7145a5a0ae548e39b56d25ec94624af26c4924641ab2471467601045e1c5a14c47531267e6a5d41eb2b478786a5e2f6c2b65a4d40d6fa852af8aac9298d229a8d4765ca082c82e2f63d6565aaaa49cba2c0b4f6d833ddd7098e270f8bdf40e8727ef2c7827bbc09917c5b082431bd1702ae130bae17350c1e117f190537098922aa83c95a7495a86d594a88bba620e29329e2a644e0c5197169e15d10445cbf4040b98c8429a7e4c40797aaf2e3cbfd6993ee6cad38267855734860d888ffe3c2294bccb73503ee33f503ee3f23366dc050fa99f91c39a07e2c35e1c9747168e7dc8c2934d37b25caebdc987e90c882c139e713d14cb9a81eac15d5ee6642cac863bcc6084fd14d71747f66e1cadeaf68622781ca91bd953377084a0bbe92370cc2c45e52a2d2eba1b157ceabaae95bd54eabaae2ba5ac5cdb5f0a0e6ad53c8c1a545b31673f4a1806020924935db0fd4da5bbd9baae54c2309b3eb55cd34020532e6f574a4f4901c1b661dfce21d1dd6c20e878c4cd2563b7faf437efe256286efdb9a91b17878ffb03487fad6c43161e1fad22b50a8a3ea2bb9191942315607086dcc9005cb3a7bb5457f53215c855007011129c07807ca872e9873433b4870140c91ecab0384a107bc892c34cc784a3cc61a6c3440e4d4432774d45486dc3a167594e190e653c001e8df48654398c4338521e8b118e105994c0d284787a86132d92429ee76894a2cd4ea3bbc16e83de2851170b0f0f0b0f0b0fd1e919485a86a94a9d6d5aa5ea6e6a92fee66b506df52b1b6c585b39a8f6f0ae3af60552c7fdbc6d22e6c0f6f3910e76e70471c60d27182622b43c341d41c6435316623c3471e10f4d6ff0e1a1290e7547d6ccb338318da1aa20ce4c1d280c21cecc87a621549eb9da8ca60e34cd8713119c57753b7ce24cdc6e6752e7c263a9b7d7f4d3f50ee3b21c75bbb75c1797714b8f7157fecbe1fbe2d5270525875a66e1992055226b28d104e92422a2ae2984ac994f4db0b6664d75dbed5c7d384ea5545a21bdeb5c644aa40e1eb266de0a4fc8d3c7f3585a7355792a4fcbda26e2ccfcb52f30bd217ef33e5c531ce267a24304a7d461c242d69cc00d79de544504e7f390e777f2fc189ce47919d79485f8cdc7b8262ec46fbee59a8e10bf79d43511217ef3550558c83b5287690a59336f524204a7e9886419826908190aa618c46ffe744d4ec46fde5eef3541efc84483589d58419e7365d299e03419c9f3619775a069d6f680e9d1abbf9479211ea94395c821cbcf26b23c0f1d94d0204a44142404a5291ea954144ac13c96ac73412aad684f54aefc0b9f9ba3ba7494aa8b94292191324ceba124548800a568fb04e86eb24cc7a6bbf9d1dfccd660559e72ef0b5a2e79459e132cfe9aabbac3d3aa2ce67822e6e83ea53657d4253cad44cbc2b2425db0e88dac14951415ec0df5e70d1520257b4a12dd4d23618052a66323532e82ee4686c0c3487d0096569c99676979448d61a46dc348f795692e9aa70ad5a195214ad1661fa2bbe1309656ccd13dbce3986e8f438f22c274fb1f26ece11fd6c56377e362db224f6ea7bf95cb6344f190931cae78428b65c22b4760c08a2c24f34fc41c9d27e69e8833f32a18487ff329d8471ae2d002642b53123d16225e6901a47bd8bb938054c760b71cb2b46c64eddecdde274177d322d0aaaba4611be936a02473e9367d0410d101a51f1a66e1910f59781c5062e1312931f2e2a1e9487e682a0214a1a9065147f59135f30f4d37a8aef007d3135e4a6d911e7a76c03496561118a813a51da9a3fabca1e482a8ea3e5f5a4154713fe11214251a64165c52810b1c6a74c8b3e3b6c8f35c1a22c786a84a712275d496acc90293a8225d212e913a2a8fac992f613460cc5541851f72b819492a445d2ae7b80ef3bc94526ba4adfa442da8218b5cf0c9f3d5555bd555d3aa3cad56e55129792937e2506ce280521d83a53964693da0c4d2e2329247066f8b4b5dfd4d8d844f59c3a7ce1b52831d8264483dc5dbd1b98c25bb5ed1f548d7c3c27b5d6f68821e51e64c37b2b2e869518d2c4b09b3a4c166d7300e392331cc747eb42aa4ae0c44ea489d0d793e4630e4f9308e21cfc72fe4f9eac46298a58785273b044ada6d08743b2240226d58e6435d5d5d1946da284081d20428e01145cec9054a17281991e968dc054a998e2cf9a0b433b3913893611696567ff259489a390c686003a5ec460d8461182406c9b6084b2c3c31470bf13106db398c9e07628e8db228f68a261887e969919a2bcfc87b69150d56c335a8b6fa9b67b0ad232cad23b266b2384148a98ec14eee88238e402222a14191e7c338b419756e2271664a7a457562691125ea6f562296232c4e603992612c2821f14a5f46a753b8195557cc214f6ab01e1918405d5c89a5455dad96c671a5ec0428c85690b920ae5878321da923256ba64a3c1749a4adbaaa8ba585c33593e5e7145aae56cd3c0b4faacb210b0f0b4faacb485b9ce16a240a814c2204498ca044374dc31b169b91196c8c433a9b11038cd080074415e9f31288abeaf22175b0b486cc90e73912947a04dd8eced9391294b42b3152a693e9b45a795ebb9db70c2395a0542fbd3a472ca193e55f489ced7437994e19accc99ce9064694175552a5c2528459bbd04dd0df6127026284596acae4a45a543aa14b1667e4a21cecc17950c76330aabcbd38215de90b706364455f6f9ed0d51857d7e8bc3662475b0f03461b4d921cf7338a568b30fe96eb02fc12d81d3dd64c7c989393d3d6d6e46db1158785878f2b4a6254a2f585a73454404e7ad0822832b4716a115d422cb5392b7b38f175d867d784351d87033c2489b6c41a9debaa4c1795aa7c8f392a70362cb95ab63b0980bba1d9db53711cf0a6f0b2f0b0f0bcf09c7e5926d22e6d86e7ae81d9586381c7a45d933e238ca518e0b59903a38bc847b681a82111de4f9828726251001d3c08918e4596513dad0e9661429de8c84e28c345529e2cad302297b434d94ea18ac96c3ea7aa24493584f8be85911bda156959e20b2d3de16ade3d9214f2f8b3c3d357864c8f3550c9674138f49c7ce7b43445ed15ccdfa69c2c23485d4e1614ab4f3d09407131d1e9adc80824d4eb0690cb88a3c7168c2421cdec0852ce4693a429e2622e479d311a98312c99ab9ca9a58922714e8178650244f8c43131479c3262399ce04e7439312f2bc371467e6c3383454df498fc81b0a83253df4865e508a36bb7c414fc91573b413a5ea8a39649e19a6f998ab4d0d46daa605c744de8ce2ccbc37e40de5f94c87683691e9e4c9655286d514cb10ca123387b444e748ac8160032eba84deabd64c8ab8f28e3d0b6a1597b1674a628e986756858c9d748c67ae3c9c054d103b0987dac4a1e995b167417355b38820764c8749c6b4c8184634416c6882585058873256b960b52a44e99c730d7215a334923a5ae7d4279075c8d8a3c46ac4b86f252bb178bd5e91b932a1150ce389333cad4282b2410db1063b760c3b663429a6721cef2bc7315de57d1eac64ade9382bf78ea372d37be5de8b50f1bc224c5759c13012a52828294f99a55312a96626cfc8cb843286613c3844b9f2a820ba201d4669a90a5b4f3b12ce5cd77433a10962f76e7751a4c75cc25910182c876dfac3be611cfd61276197189609611487a78c499c05f567d39a8665412d00ec2a382b73b500b087a73c896c9805e5a0cca51565ecb3cb826ea6a43fec750b96be3f251694b17bafced1a829061cd74dbbeac4eeb23b75cd15b58224946d16e893fe6877b78cc92b6fe09038857577cb467060aebc9b28519ca11c256a15129d8d38434f23d65cd1ab1ba90ea770b49b8e43baf7d002218a39b66ca3a4e398ae911e5ad3b51761ba46d26e7a11da4d26922948e9dcb939d850488e925cba0c22cfcd901265ca7152e6d895ec50b2833522cb872e466c2720fdd163981ed157a43115ab4ee750aa09f5647a231a073136924c1b09995e8621ca3b507945ccd12719d82632d528a56dc8f40c990ec93224a4948214b1861ee9955ce2dab21173258110f4864c8b9029c5301b1cafaf57d850129d885ed36803c519497de6ca3bfde976b8e20c3da5c274ef38dded714cf7e8a3108523d9003946418a3564d9c973de4dc7b1ef8ee39dda772fc2bbe936ddddbe88ee160f41f2c3de7b11a67b78c8090e53b88210cbe2ed096430c28a2c24f254fa4c90debb9125313dfd606f8432594a975ee120e26446254f103e64ecd8953d5734484f5b28259aa7130e526c8d522a89c0604b58ea28f1051b9e32b52b51b046242c89a486b5aacd1c8164ecf2ce5326d2346b4f922873c9527b4624e4d32e4a9e66f41851f682b5c138faa3380640b590298e38434f44d4436a94250ce5ac36b15893aebde992feb209642765240d487f1915c2d4d55ff62cb3d90a99bdb32ccbb22ccb9e6537c51cf3744876b3a1d5c4d61c1f8f4a10c15a924e88391a073871959a4a0c8939a40efa503ee184048b444bc920d5442a05b20a0101e6c0e72b51fdbc40ae114a0c9958893843858dacd31ca2708316b0427b24ab4bccd197a75fee4e62524789fe52d50a5b1f9a723d8d931455481d99628e7eabe2818b2eaea642084d50d25c29e6d15f5fe2da05dbdddd465db12a7b4c58f264c7a28ba7b3638f9ae91249a422e6984dc495e5211273d03885e8848884930f240eac0c72adb7e1e163ae54be72d3b95a5239779c956fc75139473ad6dd901e79240b222879b8ab1c67fbca71b8ab1c45c4cab717a1728e88ed2b2f62fb0a1e82e4c7ca551e27c85d65059b6e0a439093515e92d79ad8263688bc3d27514c2693c98463673299bec3bb29c56432752928a66ba5cb1bb3e996eedd23641e90a035031db1884fe2163cae8f09d66fb72240bb365eb019c6918a2e6be7ea0211ac57839685d522d71bc1138b783457a52417773344cafa5a6b25b2a46b51588b250f8f66794e4031c796eb6912db48628ef9da4dc4159036c4d5694a238945cc314f3e681cc8e0d429b07738c92157bb7d2c24fdee6e36ad16c07258a936b14071a6be36b17d0e2b5197c541f2c31ee538a6a71cc71ee51228e600425c4935906cee80d87263691467ea29151607c90f94dbe3a4dc741c94db87a70ed52fc2f49417d1a11a139172d38b30e121487e986e5f040a963e13acb778c8290b1eac218865c2da046bd5416b0bacc842d29a66edbf4bc95385e54ea4bf5ab9c72e88205ecd12db418f1dc311c3b0bbc4990cc3a81d3163b8f4f0cb8d43f911c81ceef2dd3d42e601099aa5d15c494db3f674727177b5e450ba640f4fabb6d74b22bd925834585f5b5a56563a2cd12c97b4cb49cc31b529ba495f91eb25cf5c5156f5913c5bbd172c094b9dfeea35ac447ff5b50b363ce55a0fe47f7dc48143c3214f7325a588607d15342de46a45ae2ed2cfd6760d5e51aeb589cdb222c415f6fa0ca8555caecf8ed46c09b93e1ecd15863320dcf5a828d74a86fa5242cd5ab956a109d6ea9a6005aa2e490414d6a35c5fb960e76bbdfc825cc50812491dad0307b9865c1f6528cb90ab9459862b06aac2d2772767272fbb0ca8bf7a79b3235bb0f37d2b22584f064d0db93e0b491467ea8f50ab57846d3a39e3a8b0940a2b678c314b92b3cf26da10571f15b1857a8a98634e19c48983387df0cd147c77f8e4703a830d43ceb2572d58ec75c866a72ecb6382d9bb3bc20079e02a1536adc5a814ec93b6c1a2854cd18c0804000000b313003030140c89c50222995452e4b07d14000f92b05078589c46494e296490318688000008000040200040025b2161d1380e1038fb09c9640ba5aad777837e73739c09ce6c3894e01018db409501a8eec5d8c1b0e6da3c9d67ddfabae7ee31525e0bccd2b51dc7a680f58a468cc047982b2f57c849c2909ab0eaf78cc92913730cad8d59eee1e1882101bbe6d2daff5370e655ddc9bee6ed85458d4ff00d3a03838edc20dd01dc5eb2cb2778c5837c2a8e3a281406382131a2b1d54cb31224a78a6251a85039714158047ce0ecef86aa8e233fc704dd36a99ee6c8281dcd4c1cec30f495b2781d5148691fd108139b8e8ec8bd7b9b7f75d1801d30c33ad1f4b83bff4de4a910724b61970e0e3c6d37122a33ffe8f174b6bb7e260a36c76c24db816ad6ea87579132b8a1a270c3d5d9a3b47bd6e71416b8bd19a2724f81165b0575a9a13377a3ec17417e069f12187eaa929ee7418011a71fc3025209b8b8194307db97a094761313128b6994ce3877e9d8fd25c7bd7cc60259e5ac5908c59f727c8828409279404f9b5ba5457be96111371c76b54a8dfd4b88fca5403164f76c5bde6f53143c8d7341898d68297ae89e2bc46046d7d46ab6c397d3d29469c1bd02793d9a4f17619945b6ad6782694597d2f0ba94e23d0212ef36de3b32fd6f06f31874c2ece0535fd70366d305b9685e12adb01031d0a84abccb440c9a1804da02cc13ffdebbf2212d1d4c450bc6baf2a3031da924a4d3795a1403eb29218eb7c20808f21714b89fcd567cc8050e52f94d3e952ce8650d509665bbacad33b6a31515c79c2f1f30a04bed69096249b4fa272891ff844820ea1b59f609aca796935884771f5f409dbd4dc792219e5ed9e8055f0a9d72c4925c232dedf8bc654c85029bfd8f09faf76119003a947b7312379521f929d1826be9fb8c5982fc21cbb46f2ca31eadf0c61c9d18028adc5363e5f4e81a19372aefeedb214a3fa5def1936b190552120075c475672cefe03567ad0adaf41eb4bf2a6de9ff82854009dc9dcbcafd9d823bb520301f00e576961a99e41c00a584a2ab5404e64475522b93824dbc5cc08a271f00f7a53994472ffe420541db2dc0a97f0064344e4a83ce834dcc70901cc97086a815eead80f689d96860f2aeaf11a45c1c0d2c27000bf14b60c8a221102fcb214030ef6d421e191a7c3f5eb2eacf551c861bb4a08969162a633c4ba2e924a1775afec97195bb606daf33b1565699cb73cb6a5dd24d0955fcaea01e18bc2192665ec0ed4be513fe463b1e1172530e417e0777d6a0431d178e58c9d66dde23e90d8c150852585cf74b9e4bbb8548c0caa8e76b332553710eba31d32be5313a7bafdcebf89af0a2a2cd90791ab41ae74eb503dc650a5e05ef657862b5671451335924dd1e75c466d44571dc5e6a674cc0f2a5fdb241f2b2fd78fd4b1a3ee99c723283154072d919432156d5cd978898f600d1aee83e23469a758ca4fe634b444dc19558d20253c43aa3a4408c33926d65b81702b675366bdd090d104d3f1f6cc7c2070c964ee63ce8947473030233ef08d6d3d862f88bbc136b44393b88a0d1fd0ae0b79c98d36d2163785d127800763152112a9ba768ef8bcd26052d758bd3017c82a74309097c4577480aa1adf48b51f8e67397a8990c8731d0c255ce9394561349c0dd195feb8701d76f67ebe1414ddba1f822823ca0c5cb33cb740bdd281296afbfbd7eeb2e75e5c308eb8e22fdf06f3c8c55cca5692ea6709cbd138247adcd31c347be2e22bef6106a42f9dad49650b973155be2d67a6c36bfbbc89a00fa8ee6a801f3861d9ce654ff186ee7ab344e202477818501542ec7f94cacb757d57b03b4c3a0bef4d67c9d35416f45b812841938faddded2eac8807df7919b17693b9397a109c057f012c0f255a8f1f5c44a633601dd9530128c78bf89f4f5b3e6238f375a8e9670b962051b3889521937fd231129895bb8670490aa3cee65087847c040ccbb9a78345929c62df87379f49799eeccc1e18315a69fb147f745931ea22d4dff7769a7691c6f309fdf94fd8e07bb0615cb97c5eb2b5139d2789ded61e9c70fcf76b332d7d90e00736a7c541f5c84a52017fe79d085323694f8feadba489ca8d93480560eddb33d2f4edafb675d6daa87462f3c4914a481789dbe676499c79a540913e6425cbc52e934d6b074eaadd1fa23ef98accc280e7c5806485c0a1f2ee8d72fd93ef4871a55279fa0f268cb8373dec71d5ffa4b40956314c97d45e93cd83645a6fbd7173293b188a0bedbce89b14d3509c9d7d44ccd53e4c8923b892342bbda03c48e8a8841aaa94e2dc22c9281449860d3f6a1a218a8a25a1db79206dc486192aa2a0757654565bbf4a8e2a59686f26769c829645a641a2332065b64ab859d95e88cddedc4a9c2a41c95b946644f14543d29b0a730e6cd0d7d1dcfea66f72149b3f211b8708ae30f2c3e23c8d31628920c95bf02a4abe5b52634b7a55db0ae44f67898efc47f37220689fcbe315a7e00051cf683d0bcb9fc47d5244d8e7a4257248e224fb05f2b1b7d6c3e86871f599d22e4129deba44fc7b50145dd589e994281a79cdc6576341df38301fde60858b273f18171b2f9e34f9dda9a521495053909c43079fa77bb2b249fbf216fe178cfcdf3fd74eb9554bab3ead67dd868558959f117786261751b47e0a2dc73bb55099b572ae71412ef5a6b08b2f006965a355485f88f8b4e272189e38ad21aeb6314871e361a8bda21810927b6d5fa4a948e41dab4acbca3ffeda4e239dfd4a224ccd96182b6f574a53f3d0570189a8d131412780d123eeb3664407e1495fcd42a5e0ecea5d2a9f6a2c2d30abc880ac154b8743022a1598a5a4cab538440616b52dd4f11a027186d11eccc605c150337d1b7363bea09f36943795381e1aebe08f1f1306282a43c83fb9804cbe5a0f3a7d8096a1f68e403a66e932a02b069fd25b31f58248537f00faec58080fe4b004a5f2acc557e11b460b83e1416887f009cf00232b0d3d0aa8cd8684ebac4ee5a46894adfdaa69fe9c1fd1a9e5ab643061a22b7726720443baf0f47c27c1febd084c29f0bf98fa9d1086e0b1516a0ae12b38e987b401124ac8f1135ea830bc8df839252abd291f1acf9e31f091e3f46bbb5712b6497cea19491009951876910955c08c860c53c7fbf1631f7f08282010a99ad267c48cc451b4cbb2309f1f763d87fd68cfbab49628334885eeee6e3aedd8a68283ad85a64d5b39ce1686afd486174d1698f3072734a6b574745888751b9401869b7ce2f3777ad913d8ba8295b3a800799c9af1601a3980790e091322a13800ceb907931f45cd804b38e59d488e84e6d255ef2cb63f3d7dc38f6db4e378025aa58138e8824c2b278ff53b07fdc1dc7299b87a7793a56137130c4640cee4fd596ab0102487134fd2e7a991001ca0f18bb6b23820cde1e176e81823c05c22177351c8b7c8ee385277868920cacd5608cef8f097ff7f2e81621e7ffa8df834893321b9de208db78d154f4c28d48c80e4fa8e468dbba5a54992346f209156547240cc32cf07c823a09c09641976b1340203d48c459909156b446c2fd8199bd50ba9cdd32f31f4a386e51257f151329863c2a7e0902dd12e768577422b0b7f719acf46f4d33d0d73f322ed00afd9fb21ad3952189e9da7ce4a663ccc3a24297d26480b87dc14ad606f9f862f4e32e93df01cb7eff4a2b1d52eb358425f1a1040a591fecb9ad32ba7e8f5f03323293099b088a3c7333704bfb3a8b2f7e0e6fea9689146cd8047c55573073e65036e599e8fd7c5c1d4086caf4866c0458e9e7cf85bf9ea3e8576df3e6fecafb71ce7bc878ce79c097d29798b708ad7d2223279880980994627c7eb02a5c72c7cd44c9730164d4eadcb8f3bc8fd20dc833a5c15e22b6e47078e1bc7d76f4dba9093061e28df5b10c205664215237c302b0e46b6aaaf3dc86bcbec718cd0d71852bd92c9d8778824ea2184106d6e78a3f5244a602297b2a689a83e5dbe57705c5ec340acd27f6ec090ca3909be65c5588410c0f131231f22c0a406ef98a6966ce01d94a9d76ef70d2aad50bbb17e18246851ca9bec7a96a005d6824c6c675d4f633a9d0f885806c84711f97ced4605b4901e55145e0cdd886e4873540d11c04b0e105b742e6b9a7c50d20dbd847f2173013c2c68a47a46db7db483741072e33d3d603b779b4eeeb37ce4bd2473c215f12e6c2f3701970f0d0f8136350749e00d665000873f322be603ac833dec80ec45237d843fd0237c224d89e0dac6f35d026f4938d3bfd4fa482a232fd2d0cc44b9cdf0ca5aca463bf79550c2334f341be02f2b772f0bb0d7c82cfcd0d878fd39ed93c784d7aca9be1e299b9f2ecb172d579929f97da867b75d6be59ac14d0a22c5985dcea620708110365be4ba5188381892c940a89be78d98f2697744ba1050a498871038d29189afcf748584c7afccbb985d5ec57ba206d598490215dcc74b9091514b200ea11635a7c3ec3af09907e47419699745678c7724a84bd84d56d2f06415f05f21da1c1998b74ab7e1a6122885551560d70bf55ac1318b8a9585dc46b01fe13c24b26e13b777e26c1acdbce714f7b23e610b037f0feca2f380074c4b0cb6cd3615be424a7d7cf1b518e0f5e01fd4674fd255e69c8db612604fc29d1d08c84fb30112d00670098f2c30815692abdc76eeb4d661de4f1c0388e45c88ee2fb7f8683e7baea7810152019f8746345a85558393cd5f1fbdc3da4b3fa2c3e331a78b7fadc3061784b698cca8b34189d17d92f857f3f7d88991d0fd0c4491ab7e710ffb84e54ae642efec964afdc7dfbbf90f464e4d901bfac59fb35f530376cbc8ca6fce0ce41a3e0e77f76dd0af8ba853833c4ef583c8592504789fde84a934161b57405a40b6c254a621c42ad077c84c5f876e19e4f4c74da4a167390888f4edf8b7151b029d10cc95903d06c56e614f626ec6a7e29bfdf6282d2a55d419709633acbc5d23e3b13ff251d9468b80e37ae524bda85472941cb081fafdc930b8c4601f91b2cd23e82f39f878af7bb702c81e10d3069879cd79b15f14344d291fbd00d75edf34c3ca24a3a3e040301d4099e8e2f1733ea39b1580a5470b355616126a6c5d7020c7c044d170650537eb13cecde0364ee8dc608e9bc7c1f70d03d96fd49b9a67d165745a4030b78121ec3bf205573abc0f7d5e490baf1358143ec33bc48ecfc6ab7cee83ab7bb49bd8b132336b868d025e2d8f8f623513097d9d88154d078656122d5263dbe1c41fb8c86a0508e2c5cf02c822ead042bd582952db6b35910e242673d367411252e11e5a22ee02f5ef988880f8b422410f904e885584634cb07fb00e9b3238b06c21285fb030c078f9716015bc083f8934df7e1c90c48cdc0fdbf011668d018064f64e393a9c66af87f095a313c5705814e58e2372ae4d7c434cf3f49ab6398aa802d466d70a51df4455ae39e94916f35740b37c33099404cca0c8bd9f5337e77c1c11f4965c935fc8a9d8dd1c9b09941efdda7229987f1828276287440613890ddd4ee013be092b322c34a0ad779a35b1c939c2256742ac3fb738bff301fb1037581fea6123966d26cae24c8716fa1dfbddf2ec4046bdc53fb2831c36faf34814f98a2a85e696e781da28920ed78909a671e412da8248604f6a1cf1fc6a0cf70160affba98c7975076f7dafcc7825904f26c0328598894708d8ebc9e4cc56fde30e5aaa48bb713a8e173cf510f89c98527444a15ddb5d4e2993353919930403163b25685678903b19e5fdfb723caa702fd49c2c6899e7808a0aafbd8bd79d59d432b92523a00dfeab1f4391d16579df6bf7b72d880be313d2d012156fa336c6d84358384016c430f58c54fd0c5685bfaead348eb2737604814d228a6a397f02130524f9b022804fb425ee23a585b3c0bc22bd0f8fb7a73b042d8ccc28c8641c54d3cb0e00fbc20706b403d6b85efe73074827a92c5d11c6dccbf7d861e0c8176804ae04c39f5054531915ce8c388781362671c32df00f12e10b7d6b62719fb20acb7651651f9b4ae308455699d505310160a59c2bedf48ea3f30bf310f5e6106014ec0471b8b3547af6f737227886023d4c2a42a5260836de121899c02f3456a61ad9632302e554e84482922b5821f25d0f23012a2c6083d767b69e6f24c007cf10ec1727cf34d6ec59ed9e01c690017e31d9fddb4207a593f288f8955e76ee6b4644240b2b75801fd287a119c97aead3a716f1cf3736a805fa09b40f25f15092e01f7f53df31c830a61ddd6bc6876d27c15b1ea6a4f0db21e889428d825a3a856a1fb80f0a233e2c8d86d7fa440fe5ba4f34fbc77b3c9e15a40868bfd50aced44321b8e113f489fbd167d14b4a849b481910240888185a802a30d41c9a8244f01b77797e71fa93dafc5a3156311e6c0810388dfaa4e5bc224373ba0a2a53999f8cd46ba816e155ea27c23b0eaca0dca071556be722c0433057c14a844a1469aec86adfb1d806243cfbd18f33f31d5e0f2fcab4a436acd895825d20eac09e0fd8bf76c374e29f58d2f1847d9c26073638469d014c80ddf868cd7bb3e7a64fd0da1a803fe47096d18a281e0076ac837e6948c0a6e8bb052769dc55842771d37cc8a7af573b263ec37b2b0c787a9ae0a8955d1f21b48c71bace435ad03e71131c0198e47bfd7297400a298b6a350686c6ecfae95919457242022a87b4200ff53a3480e9b2dca7faa57a0a8156a4b740d66a0b37a08f11db0dcd7056002bdf5ea9ebdae99c612d715f87d5de6b23359489f35ec3053f575d15360777c61013d9deadef530e053d4bd2c29a09e8b8e9e378ed106d04736a32328be2e3d7cd3cf63d1676ab73bbdb06792c6b57e8401380daae873c740e15b603d5d84ab50d34711a064a1e59146126805d310083db202a0def5e83cf7fb595f6e549a502a02d99543368d3e5153a4a9fca5901c387673d91cd84a5303c1e1a4abe31acdb470e2c1793a066d8df67a1e8b80c5744daec8fdbabd4b47475b6631e3b6f98a439718c8d8326ee15c7d317a789c3d09700376f6797e28c5388376cfa0efa71f67c1fe90449eebdd80782f8daf79c1f0056a78b268c43052f54b837f186d08a3c189057f92e9020aced4ec09b4df4e89eb770bb8fd098e46accdf52ec87082df6e0fdf8e66412c8854377e3c63be409a83eb2b3538493bd9a5ba4771922e16a365eee8f68e1ef44509510935e9516dea9444eee4e0ec8e6d065e3698503af37ccf813a0b0e91bc366e829c8acbe734a138dd7ad32e41640ecbae113b10dd237b498676b0fc0febf226d29e4379e27bdb87980ab589ffd79d7f82e0614adc89225909f7484d18075ae1d9be7e754c431fc4d5e13f3e554af47bd5c4c6a706c5ec01201fa909d5665b59caf654c89448bd2f9a80006bc22a0d55bc4c8e6429213a26cb08abf051f08cc5bac7b5b87b60acbd691580e03a82df14253bb4ba02f6f603bc037000ea2701a4ca2300ce503cf29e8dac9117242f8cf530b133fd26e923d0b9a0ebd142e7a2b806e05ce87d9b24ad9fc6b1b86ca810058ffccc9283b847860f0872888dc72c27a7213c0a907063527a0f29e4beade8d00e4e8d2296d76d0ca4821321c24040d063549a850e1bc6596e50a04d34f4f0dfadeba10635896120a8df4e27b4b1f01db4691e8ed1afdd716319294f272fdd8dd5f0c914baab09f06c98db326954a18f52200b6ff86bd293bd36c3555e83a399c0ca197afbdfb5a0473c0a3f987971b07646d0f84462e3b748fb6afa782d26be74b89808e064d010c5fe45ff09440834ee3b9c9bb991c8c5c72e7a190942f4c51d1f7fde3ef1460ab0cfa5562884a112bdfe60cc31926ac078b7f47b25517eb16b12fa0fc274606b0c8f0651931c8e05b12dfd0a11554c402d2d6823b2221e659f0a41aa0f78a3c79ffcf86cf8ed615a939ff69e68385932ef0d2b28b894930829dbe0824d1e96f85d70d1e8125cc67488ee0a0c2f2345c54710fce6b7d0e437c1afce210f6f217064d86170caca8c5c2fca6549b2cad037d2a733b4599cfa7b7d29d8015f283ac3eed3f5ea1e17a94424abe64ebeb18312b470c8e0bda010f0ac93aba3f8a2223ada6e96e55833720986d696d54bd44a0e0791dd69e5f76dbf7633afa7a4f97ed4f6fe92c1fb2e09b0485541b0d24effbd32d3b01221ccc95d30047c850652bd2be5abde3ca249a733a1c6f2cbd6337a3c99f0d94590ae0a2c2cc08462cae9690aee17d871fd1dbaf3158e3a7512e4b4d4dd747c097ca22303e27ba7bea5d520d08c1618502f3d2251caf6430d0914b2dad5b962320a753c07148e7cd3cac8fa3040e81bb9729e84138d30a4fd4e148c1844326ca812d5a832a52663335632d60d7309467efcfecaa6131daffc14040364c259a28b55f62fdc0759564fa3395692d7f63b4ef9d3c02bf2786111e6dc9bd395beb257a86ef93066d332479e7e098e82a3165ed676e2cc94fb8bed2d10ee6f9d2a6b2f895530c3798a6a8271b80a857e36be79d36194d4ed9fbaaffb4792576854574b8c395e2bef66cd698c914e51aeaa4631b2962a86958b42c1c0a35b72f2717460c8fe19bf7280c6a203a160b060bc91e896f3347a2cc0cc19e8e6cf8a2f40987c48c9f5792cc6cdddb0f3cc723555c0b4c8625c6f16bec32f1c90729519e1950e63b00aa5d1dd5bad0c91403ebc67b720971d5207cc35e0c7fa16f2025a43acba1d83b0242c63a867d6cdc4d8c3e5cfb5035f521766f44986d3b802524d3a25680ade51343c6c72e1920c9a450ac8bba81d0ba8b81aacdec3a56e3c9fb53dc958e7e834d9edf0a27640060ec43e8043ca46a8ab52750b42e6e504ce03218321c6ca32963d4cc9ea9b0c44737972e34402ea14f8d8921136bf08a6a0e952616583ea841cc805d19ccec60d60f4e3cb6ce69263063318a9af55da902b387df92a7e5219029c3478a66f5b5bbf8723287c165072571c6a876072725db94a09ff35cba24d8060be7bc0989fb19da47b20700e6414c88bd2153034089c224fb86e0920e35ef57b19e4377eefe6d61bf60f555cf72a6550002b70dd2fccf51a6244dda4da936be8447ed58efc35a833ce9e593ba462b450dbb71b797c8ac0bf98e0e176bae9bc37d06aa6cc2389ce5edebd3cd86113cc5a8f74665bdd72690b05c4308eb82182663a6e6f68603590bab88e1de3245a5b47eacdd388338c6fc9d5601bba0590639f0f8adee0c323708f5c5c5e96863381f94c82240df13356badcf1f05434c1434c04fb301341530556ba958c052dda5211c37fe39e08360fc1090c8b358e8be96a49ed5d62839f88b4a69cf54bd47ec0529d306418a59d2964bae0170b133252b5a517b822a346e493c7cd6066d7ab610bb1cd93a82dda196296950afec4260c70a12c0702d6339f3e43fda10932616d307386082732d3b99d35b2641321a5a5c036726f0631bd17a718ed24834fcb551c78a852b49ed3961c8480fe8719a1b568106bbd1196e3c1aedc5c77ead391f70b27b55d6722ed5041d92fc1bc3c477b7134295ec0114fa32f0a9deda1307a6447dd88073265fb30fde348f92828c8a0e4c971437d025263f0b7e7e639d0a1865df8bf0d5ce9d64f8cb3f0002a853b1504312b21fe3493f7f41f17415534b0409e43b6c43e888d3601981d56a22a7efa410b2bdb41858f5b37eb23ad82226cdf9b3a88fbb89f170b5bbea4975b51721fc3ba572052a4d17626676fb16618238947064030f8b2361e357b5c63ccbe9d58c6c35dbb8f2da3f63e7882e6809d6219357148da08079258f68e58e0f9628918509c1d2ead31196c75531280071d3efc79701ec1d803ebb4c19b99ee67f81c27e6e56bebe4ce17044e44fbb42af35402dcc2e600174705a505b00345963099fa3db26611b59c0ab1711844e0a5e150893e19324e7fd0c7f82936946f03b0276746789f19f7874e9c26f370bc2e70f019e43c20d80e3c78c8e0b8ce78d91ad174fc1475174b74f313d597d5e2f840baaf44445c2e6e385b057a6d334ff169bb5bad8e20d99002550ebbb883fee667b1873aab0542465c78449f8104a2686a6e0b9d5129cb0b6f68f7f4546711dd0d077b6a5f71d05af107573bb97f357d5447a10f678c62368f604bee0c5adf03d44f01a140c6d23bc0358b2d741f00c2bd89bdad7ac9f9e988744cede115953f949750cfab2a62bcbf2683b90860a0bcc002de0bc9edc172b0a12c25b5631f5fea3ccbd677c1bd48cef3cfd97db8b06964612208eb1108e789c80ff73e3bba2fcb90df299adb90ec37ce4c1fe1eff80725ea9b8f2a4d4cb8c8251cb72623ee8e448b224c2dd364c4b44d35788a922490f82f7a4d610162a698a9005d507b9b0127a402d76f1949235ce7754686b5edb916c25cb2473253923e45f20fb1a9f8da064296d61b0a520c22982a783fb7d2bd270ce850752f8fad84057059bf1c10476797d82c6c69a61608e3e5b437b63119a9c9355e05efddda38052d7a2cdc5c63223e557c5fae504371f85241ca51d107159f14cc985b85078c200583ba74f677e2fbfcadf6328371632881c9f3aeefd4cc2f89624139251021da75c3c59446a18b6a220bb2560b0b6ab82afdf11acbf5a816d49bf8dd2191698cdd6041d7043f86cae8e19a0bf99354a633e43e8c5ccd339235a183cd361efd55058cdd4c8853e4050497b9fa4ae899e4fa4021e8d9fabc186f2e9d4b525c0fdb3012c0cb365a8378a4c81b3c702b8552ce3474092fcc13090f6fa7596ea005ab628fefcfec49e40e72867b4b67c78546c40ecca88595bcb726f0e24ecf96efffd888879d9f801152fd402996049d1fcd06b9a1c1e5302676e1562557d82d5af723a71e579993fa74f5fa57b4f6300bdf2e3a7e1132971336a50efa37ad186227e9a5dc94ba912e903a4b65f21733b3bc136307249a43d85a11e0163497f13a08a3c77479086b0415be5f50166339838e499654efc8cacd2d93cdffeff27b52ee368a7a9a92e7fd8117b92e258ec4799c295b5767b0908954fa7eacf79f043054f0ad4d39437640b985b0f8bd5d99e2bc007dbffc4001693933ff6b86d44745d5c84fc1239dd874bc2aa3d995b472d53c6ab525b3741aa2da52db9188b7827b873312505a4b1a5906251b8c2cf151a07a321e8c881b22c672e3de630a7c9c965f2f9c6522c85777357a3bf2b9f9456dc60f5afb465acabc9ac4c126103ed801a71f9f0fec4fe4f1eb1c66abef5098174f585c157e137150ddc2bec2f2374449360da2bdc67122e9f09347ed4e580809d38bb78b9af0c93bda3ec006a5378d936926e19c87c0bc3422b0877e1d224481954cd714b9a130849eca6e5e85f08bb0fc893e081c44b4c7579146acf27751f6e721fd6a76e64f75fff817e0ee2f4fc8743d887afd84d2064d4faaba5f1116ecd0f4179a75d5304fa450dc12239644f38763d284b583e1bfa3872c47d5055d9dc78185266c4eb1219c96dc7ed2dc9967b058cf54aaff9531a54759df661e22ce694aa827e2529f50ab9d31ac2d56873de457665de242255b1ec5ccdf038671c2554a0d8cc7c377d062f35c747d06dd7e95bae4e817165424be8651f3fc9bcab59855b995e223344e80853a068104631f77a04afccb1c896c7802548ee2b332a91a0ed81b324398385f635c7d0fb8a378886373d16e7d1f343b0131581849347aac30ea4ac82ef1c2165dc6b9183495d245b219f1a631e3a121669d70d10e54213a450191b0ae258d4c4da68f4766018777f3f50c0db76969747f0c5be5d7238a834fb00abbcde4d0cbcd4d7b61b837100ea1896a706055e4350afa6dafd528426776de887aa93c08d3a19ef43a6eab2837a879de4e3080344c427768353164e7025b92350e6f0640e30644ee47375ee1fec80118dceeb70724e9244b8639de51439b1ef22b06253e445d498070a31606892514a79720f41be4c9fc1fdb477620e5b8248ba9f9ab88f151c653e09496c0b70c079b41743f3891e5e5f963d8fb128a10a64f1e7577b73cbae421c3dcec4c4e88336bb69e6c8589c02e02eab13f4e70c1e21aeb924525ed3fa9a687998fbcdbceaf9abb07ae1c7aacfc8175c3eb7e2e3ec9612496d5ea00eb54b454de3705455339135be670384c4411739dba8ab3831504e9b205a8208ddd5f1101a609840228e18411183e86227ac3c083515bcc72340702da9e8107893151c184162fac0d08aed84ce8b109a28a854033e2fd1f3cc0cfc71814708678e447862cfa47638dcba2f37e286a326c113cadf1d35082de3f25749d5b90981d258e42ef158caad7f6b49dde3941b074e391cb4e1816253fb4972c5d27b612322660498a68d92ebfb8fe173555038f2da0d55094f47683898d484cb8f58d8912f19c12c5123ec56015d52394b5896e070df3426a9a6f907450d05596dac5911919533080c4ecf05e2b0a0cb8c581b3c418454ac46e28e6c217407fa6d234b4a7124904cade88522034acddb708045b650c2683ef56f548ea18067da90385f72b1df1192ec93c8bbfe94bc64df424aa2770f76ceaf17e7df2f6012ebd5fa66b3f7da78251a41fe6992d38b7600f309b88f9f95f4c3be256b792b3602ee3f9f6413f87eaab8db132ba13e676ceeebd44682c24995162f60d081780671fe0d05cea068d8ad2a5ccc6aa5c73d3e4f45ff566b838b7c40be78f5e7289032a10b1466d4099986c07bc884a41735217e9e6d752b29f78a81d64edbc0dd1ee7ba0aebcb9d8020465c318647cb098d8bf361299cdcb529f9ff8cdd65bbcecd6a197624e1d94bea71246154d634f1b2af3ac3aec2bf7303a87cdf8515fd1e9fa0b8ea24223c157993565ed3ea5f5a4b803bc7b741f6ac9a4c71d8eb94cc128048006001600ff7074384916c07c60b0f1cc8d48fff8ceaf77fae25e449d189c5a98488d936f07e31d32409f461befb389c47ec720c3047f4656308408e618099d4bd113f10dbed69d69201556da4d6d7234f4567b532b14b8f147185b8ed4e76e6b75935f27f58551819bfa477481cd0ad87cb7456909cb5d73fc7dcb71d1b87a58dc3a3bfed4110db6714fafc9b04f1a50903dfd2dea859d51dedd420f567241367ed3782432c3eef8d198c5e686abf18460a0bb33af3bc00a7711a18673bfecfbd10cfb52a81486f7cf68f127b3dbda3ca966c0720f989dae1255a3bc185d309c258425f8b090cd2a4e0c3f9d8d1dce178f7127423a791a3aa2e41fe11e3a08c08283269e8ea1facb0cc7052040deaa15e7510a58161a8cfc8b66358412a467f47c1f4a52219246d1796882c57d6e7dcf67905fc966e78a7135e7603c4d158f9c3534d2db518c685c71cacae364052fef007de4b7b83375d7228ee197fab80b14d026725395610dc087686331303fc10f08359db47b73dae91cd7af5e0374a568eda544f05fbdec08c062b6f895f698e339be7350b4f79529964044e3e530d148a9482540bd2a36221290d9f367819277265d8c780e971b6ecfcf29a6b6fad2f863558b790eb7746859d69ad502d757b8ef62b133e1e82cb2c182968a57161f2b3fdc3d560e3c6aa038e05b2c772368cbb79582ca56aad2dd654b2b0112a11cde04b15504cfd7475232a814c1da5067a6adbee8595f9a02dc7783971e7a82dd8da5d95028273ecf99ce646705fd258f3a90658e25b330e7f95622fe1d23d9acdc97b66285da352388d022eedc6f22c1eac1263b0107b83b9896cf6a2999b826ca7a0886c550d3ec063dd9d9f0e0b7bd6c29fb8d7e7e46c9742fd028b98684224444debbc0a831a5e0a31731a4626567fce8972c9987b8711b3bfd615714a94c68c730422cbdf93b019718b3a0bd611ae4becd113196a80e77d39992fcdafc6044df4aae3c05d76117e608525ff48667b715cff272cbfb26997d1d71a660c0f8a06f2a27550cb9f043eccf5a2e913ea6620056125490465cd40872eae4019ba02001611606b816df2cc3f07c539910881e994ef8c7331a7ebef0e32191a21f4e41e5d4e50cef249935fe43236d0331bd9362f00a0997e8b6903dc2a08eb1e65ebfd4cee5ccdba7f0c9174de764f4b24f8044c9c14d96aab5e3763aec976a5c09ac1fe77fc146422f0d9c2702eb41347a1a180f755eac0211e828213369ce32394f822546f8fe835e53bf638e0b0bac69edbb71e750d11bdfad7ce35799d34c664dc0a086c77eb7b9a2eae3d70f9894427ac2fea87e8c1f9a1dc1156ae801820cd66c933b1a5165622da3875214bd394efb4766ce6535e8d27fd0e1f4288caed116c7d0a660de398a4221a5d63d475d76a1e47d6837e8f0db5c8eb0983505ddb69c2f8ca811610647b5178c3f8c010745d56a54d28a3ffce8f525adbe0097c21882278a458c499caccb1d7727108e0095a3ea7aba9cf3be242f6a979fe3896f47c394b4e24645e13cbbb9f19a7e3472ab98ac6bd7a332341df6139647a9eaf2b076b0e9cb6a2f71689fcbe00ec4b0a706eec776b016b9e2fc6050b51a00dc77306707c90d89d98711199ccf07d5dde27ae3e15f4483bb3dc3088379ec38f1d9b62e15247f714214e8ca41185f46c3727c6c108749c8f1bf34f72c8f93eb0cea4283cf9d5a7d3f11be6fd8cb8996b15e1786ee2360ee538a787e15c08faf2ea225fc42048da898e814977cb5a68df2bc2d81fb70c3937f392425c38be63e58954a4506385e70df4c48712ffd65598b1af6f1b32c69bf349432c9c9b6e1e417be3c7f0631628280846aa6aad35ba4e0cd67460ae1a12136b02f55f8fa3f7ed3e9b49381beadc2db5870ee6c40f5c8894514657d6ff249437536e841996a4cd79a45db2f70c388e409458294ec439ad84d573a7a96598f24e33a983e4beddc4c8ebd650352df3af45f4ec0ff0591f92201f806e0f84929f8f8ee650098b3fce90dffea6b592215449d46838d3f4efed8199eb1dff17e6ea2fbe8ac596a87191bfdc3c6fbde5b6f07b13134194834ca89caebdb2a94a71c51180c201e3aad922357f2515f741030f3042185a71f032925265f0fd10b1a56ff71354b786ef12b8dc2305e453321ad17313cdf1db5f8a794402d0650f14d208dd328c7a5af7ce80549a9285ebf05e4f4a3dd6268e17ebab09ecdd76e5f8a34e778192e2a15eb2075d083d63220f4b95aed8139c0c9dc8569d3c7e777c0fa9c9854d8f31c80b713ee35bc01c1662113560303f3c8095779cdd730a2096fab7885eddc07db58abb8d8ea0b43004754c27921f27d418bb4cd30f18577fa41bff080d9a40126c016c0a018e95801a53912d14e8977b49258cb16da2168f016bea33047475e2e37899dcf09cf413adbc703df8ba2f3d38d721960f813ebdbd5977b40967ae292ae05f3bff0096e688e752b3fa0372e911611e279b001ec3618a4ce45227304291a4fe5da2ec8c4132d9f16410487ff873cbb2b1b242a4808bb547bfdf451080969bce36eb7049e0bd465127a2612ac7f64327a016bc1da2da58cc228f109e41bfc477c0122474ec5e40ee2798478562c38a82ea05520517a2f504774484f1b109e280ccf981967ee1238783c260eae4b38b7028cec710c658b86402b2e49a0535e0f5f6a0b1c5d91fbda06ed9ec05c23053729173c6838739a79b01e1bb9fdd16f93b7db46c28d0d377f94d1118a20f210c7af8af209199765795949efcfc782b6541193179b0ea2303a127b0eefdf638017aaaa94d73b133400eb1b4eb03db9762e57e5b3541871f5f871a7d5454424f7482921cd1878e47e7e9bf583c9cde3fba00704e2a3a11fcfb08038e49044129cdbacbec1d4efb779f707178243fe581f0e68391ac51f0f155d5ba1d9144095d39e6a2ceb71f5345c950d67c2eef508bc7dd1836a42bf2f21d17a7245f956e56ffe88a3d538249a4cc5facb596fb47d82b67d53a2b8c2d00a1640b882ca2246abd0489dc19226bddeb1b0b78e11a2887f9c6b8d1cfb6666e6e44d74346475f18c79495aa1ea02db4e6f17ae7a7da8db471866b691eba51fcf4eb6a1f5b163d0d64289e38c44e5f445088022dddc2334937dd06a26e76625f82050bd510d160b744ea91284a2ef4281ffd406842950049da9c56a43169390341ad26972cdaf69def88411550009a362f42177769f209d33892d5d649e4d840a6df21ecd86c2fffa00c62473b72e8929564ff78ec999bc7f33c3a34369d8443e6665fd86134880d30cc8f5ae073e24766d11420421655c7998d180f682bd5ff27dfae54cd2be586d07308770570b2eab2129abc261d04b298269c9e042d2dfcd3bf971459bb0f9b434cdecc1850023125b674dca1bcac6b348fac6cbc0844d264962335df39c0ad892b4e192d5dbe2c81049902b1a764c19c09e40902b21d3ebd80352558457dc137a166eb6c411faeb82de156db491fa38422249ec1c1ea82f1f61d01a7671bcbc350b744b5eb3b343747ca91c2ca1856567b7d9851a3c35159e65099dd10996bbf339f4cd97528648ec8cde2f4a2a23031bbad275a9b2e28d3d90494497460e23ce7ec3179c9369b74afd77967f8cca9a1f232a6184a35be64d44f35ea5475c3c264820ada42dbb223b0904d8e3b3b9366008d4f3efa2a0b3e68033ffca729e8550b1442c30fed9036335232b794d0f15a025f1e6edf65a4d692ad154b044a0193497cc96fec70bd7d6ff14daf542aec6b1280a5010eee2b30b29af7949b2eccec1d1550e91052aa1fb8c077ec1322bc7ce1e746165a5f0843d393bfa7ed32731abeb98af35cb53d91166f778d466742e7bd5aa088ab9c7e5d981e5697f7d8c90cbb5a43dc392d11f6c04f085cc05b0a74091b31428e6d0041c200b014538daff0fe5eaa59f01f6870d50f25fd4a59850a23cd053c6ca3254ffbeec02dbedea084d6cc73aa16baef4f5702f144b0c456225e6404b205c959bd404d60b4c05b899427e3dd656ffa5a42618cd508d6bb05078e119850b8ad460f080a4fea5d5f04475dfa241fc65dd0fef86e835b19f67510c9c359e726fb6c70704fcc50aa7f3006c44e45e17c843708493983940da5c5a5a4a3f5d88c06c9b05e392d677563d6f44101a19db028334205b83a6c2ec481aa28192d65f644682af7512f705c3ca264f91bd61e419025661c1a812ebea836b0a0602d81dd0a44e2962daafa9b377b0198f0a5bd7659e463f57bc32436511daa0368ec4bcc91f43b10eb47545924c647f20530a529d6e2aa652bb2fc514beb23bac1e332a939a8c78a3b9577bd04e76c2c2313673414daa7a6dba5b3e4780c421e654c71ca1e00c592e23b7388ef054f925cc0fca08d66a79cc97fe95f5ddbb20827116b5a9a8146e87eead01e7905da2bb00e60c9c16f8413096402b1c213cca7f81be1e6870a8dbb2667c5e58c6e116b9e9e2a3a1f18d4858f9f75b93071ec0e5e5774af736d5ce22dd6d4f062e414746226d7ebee03bbf42d5687f22422f1238b876b8c00bc618b8025b7b1767a1b697192e6ae48242671c70c7754180514dee474c7016d4cfb888a622dabb324554546c66d8109859832f487f3d75b5512a34da7c655034545b8efea95d1184d97d57f1fcda1336b6d5a09f88e9d521991ee16d4f5f0c7b5cc3f53170626dd5e432fd92233042d096181164e4bf998ea81afcfd769f0acbdab9c0b4352aff62e3b0234a06a127f4e40006617b8b2801e5b344b5dabff8037e9c8ed4410259fcda9700573ac3c33374fc11f0769b1f6229ac8b78b7bfa270d9c1421f4fce4d999e46b9339094629d8fc817b66d4303f3250b8f8ce90ad88a8b5a1b1709c80d23839eae95dcc273d1c78bddeec07ce81cfa85a576a109740b1bcf4f41c6b1d9665b4780e7dcdcbbc503f0c24708caaa1b2a968cf409e3826c5b26820270c45fb3596dcb5cd8bd5697e3ae9e89239e580703931b50635a31e0ff5ca0003b0526b522906622a7ab13c02d3998700263919726ad5c0aa62c3ebbc46ed2ddde822612dda9d135a7fcccceb068fd910932b0ef74bc3246dc00e12ff2c8ca372d8d2b13deee62a68398201aa6aa5374f191e3c1137a8d78f59293020e10e0aff06b51dd32b77ba3abcffa666632bfe6c0dc1d30941ce193fcfd1a00b25d3601c6ed3f5affea6989f61f9fe068127455bdca7fb842f389eb5ec3f0025db1efa37b66d7d100ace725e718e8228f39439f477baa90d5ff4056d1154dad1ca2195385c2d4257a4e82d02381759d9d46d1c522535a42d6bc76f443471afeb26773f224d13c8ae4bd889cbcb09070105416b8d84a8e5ab195bd277955128f58f525b1dce7c3c922567d9fc9d7a7a15e01c37999f1b2d564c70b92156817f57ecc1b26c1fe853ba742a33ec39d18676f38b85829855e1e0063f8d83bed8900579db2cafcf9da2f0a9ffe0424e8decf4b2f113669b4975f9c819f8f267c5428e9c04dec7fc7126ca2c66a5959cbacfbbccd1429576ad38e2cf321ca0e8971528fab1eb62de9a2538dd56dbdf5fb32500a5a04608ec89a298594b2a8818a56a0276eea9e2706bcd0699f73088bd460bce564b66ab134479d45c2ba90926d1855acbad2e6837976d8498289f3e798c49b36178b411a76ca0bbb78217531c630ff7ddd0f7ad0acb35577806b7fc906d7b313267334365c18d3de57f3f9feffda66268ec591a85a5e84cbab29e969e668e5779642b594cea6e6ac5e8be847b2a7c4d4c0608a86f28bde1f50a7d9f048466671f715c39f7d29cf2daa577f525df30039a78ad9908ed670ce218a1702399d4b94c1229d9354c8c4cbe68c3f3f3112631877604d01a795f24cf80951b2235662fcaf9730decf9231e8a0b212f30e0973b90f17ee0b84ebf60471c140175453a37a58d84cb0b5b60a7af210da7ca5eeb6f2f233c4d03d42006f0c5068183d4126c64d4a57891eb63a7a1104db054711e7ac323ba76b953a9695fe653c3dc46163d439b42c6c10def4cc361f5d01bf628dd8f5d70b8441362683636349cbc98c9acfab4236c4af24dc73c4ca5d5fd0bab04f684ba87d0f91a54ed0b34584b2c50e0acf5fe0c4e2f7ed2826245b04834e75c816aca4359b4096df181b3c98e1a8e151ac5b81f1571842c11427914ad9083ab33a256237eea5d10a69cdad96140295964fd7acfe0fe85e29e8f632d4856d7695591dac74d9c42f0b86d6ed062050b8d77f3571f9cd2aedb58fbe9a44beb28e5e3099454d1f262a6f4b69c5a3674281b83985b9eb296c2b51070959d1dcad035779b60f23617b753985bebb7caa1b28ec7721791aea729c54bb17d5fea2b091fed1f00fc8c3e4b8f9df097f03b97c28053901bf6554a1fbea5108799e07e161e7a1871d47db0ede80a66f212689d2164e01bf8672a115e1886c028393577930708521cab90c23d7292a6f3e2d2707586098d39abca2dc52aeee2e4c86b6cbaa37c74680ae00a8c1179c5eac21b4f90fe32f5cfd8f0b0059870709328f6780e846631137d6909d12de520e26204170b99692da01c7a5af353cd3dd953fa27c03df8a85bcd448bc57743840a01da6a67cfe8dffd4bff03032e4abfb19ec939c9eada458d66da0c306b7999c3d4512a2064dc0d714ee1dbcd1019c38c35a6c74c4be6c3f548d55345e654cb3b152a30379556fda9e9d0e908354bb364bb4c108539032bfb48c570362c2a7de67541987986ebf0cf8c353774b101ce45cde3d24c573763e1f2ae0b526170f39cc35284d076124f15de28a7803ffaadb8a094788219423ea5c72d1d29107611ac219f6cc42549c67855942742e160abfb825c9d7fa5511f16370eee0fd5b9d317f10ea1e77e817f1165423ecc607d480814cfe58c3df99e228e7b18cf8bb1f3e411d5f29947f106ad1ecd13ba5eaf95a4a11e12a4808db9983e27e3e98c318270464bcfbf092210b487b180bd2906117ea0525a9606383d0921302535aa4e5098939a6260c80955aa8038cb0bbec9e97422e457135f1c208e4f93cbec7abc0c0c6f3276ba175a6dbc0e3c9adfa991d7433776b939a0a2a850279064f793315a2ef6a508c68c4ac1e4284f47c9989bba02042840f5f8d5b4409472f59be86ff6589915108ac47beafcae6b03448133e42d6759bb3a72c84433c141983678fc4d02ab5a1f56aedfe20b614423e74c070e821897ab4542f98e3eef1a9b6fb1b93c227ac92e492f2093adea45efe695e5faf6e95a003d1b284007deaf06098c53b28bf5df59055f56aacac3b2234e81c6c487f55fdfd818854d0384192ffd248ae6a19735c82c72d33d690a35a28235dc41ebf266d5b9eac1d4dd04f7db49b888c104e4f6b95b794059316f737096abaa32513a28d623422b80c2bcefc6a42960a3b251e2674a879c9304c818b90ae6fcc1751afef3d0eaf381f02d670deeb1774a811473bf8cfaf1f631a3eda7d45996a8c9ea5ec02dc258f5eefbfc6a1753834181c090620c1002818060586848221d03002f39650b18a724038157530f08c098d14c9e34b96fa688db1c767de860c64ded0dadb33db335001b95729ee4210484a909c86f04109dd1adc81172b392df5042671e6e9c324c583cdfc5e43568a89171c72760fbd4dc3da8525298bb4c1c1516567701ba9793c77314c9257358103690404014320351e2295fc329e7b6b401b80953a2834c1808fdcfc9839ab0761a12c266a8e41ddaadcaff2e2499c2161f97cb20ef936aaac8f5735890f24458a4b050b51cec44f6baf12b6af8a27db0b411e5348ff8a8a32f4a5eaf1798ca601a7324f72f8ff31c38cf6df98d5df908c23f995c2c269cc2d24f4a35dc1a55bd03563c0c2890219e704f82d1f4b11ec5e217f04f79328faff38081d21819a44e0ab864bdd496e414d2caa577f09587d80015f1ff0a869939743c1e25a3b84c6105ee8970018ca9122c22fbc64c06b25b07d9200a12301f2514a902f01bce77bdcbff1f7d88e5d6237b17f1e5d1cf63ce626701ea1be8cf577f0c5ea0fed7fa8fe10ba5af09de434a1121dc828ab646bd740dcaa4e3cfd838475e94e3175d5e9a400e005ffe349d9cff1494e706816896f993f61948ba939a9cc4e95a6b4635d6ed3d0f4f1cff6dfcb8cec0cad524de3b1a255ef5ec82afa27e71cb47f972289534f60470bcc5a155aaa3cb87934cdb77d15dae5db8b295dc66bb6d0cd1d901fbd3bcfdad6a3d4040bd4e69f13fa50a819d870550f9531b44355c99502fb425e1f6afc7c8206b3f14ac9b44a3ba2974f90b5a6dd850b5b96e5d0a4745f928abac394947788f1907061143d2ce894e9f1e728b15f6bc90f55360990a4cfd0b5c107465978be0df80b33d24519ed44c0678d2534f7f0b9c28d41454f5566e632b48805c956deb462c4e69eef1596f2e7c9fd07fe496c5e1d123c88d3c827f3151c1331527b8bfd61c2024196e09eca01e9045806504d6ff8762429a20eed141d50a781ba2b54100e524a7fdf91d0a2a3cd774ebe70d9bfdc35a6e7abe1decff8e44c911646e35e3f9fedd949dc082a9c524700a0b222c63044525957fdd998b9d62947225edb8ba741b680caf9a55fe1632f0dd296f183ed5b22f7127f9186f02c121e986b67d70fd3305d3f9024095102eb5a297d7204f8c28e84a349246016282c2b325127cef1fc6fa5c541c248bb1de42b6fcc3ce7cc5964f1bd0de23d6279603449fc34da6adf59365049bde69bf3b4194f531ce1613b3931c3e7cd0c3284c7dff24d3864f0fda215a08ac743ba121ed94b2079b86572829c473bd45db7582f97de80678130f0f2093d072f2406022d0ba6749eb41db2500f4dc3635d6350c06540199406ed7c81380bea6cb34794a60a98a2202647a28f76f6dd23d1c8a0a30ffeb2f5b625d7a29b745542b02c224278917f5aa57f680b2e73fa9f9bd72ed7c8439ca8852296d06a6ae03b77ac686704e9d1ad4dc0e0407a8f29ea65de3cd06096ecd0cbf8d47744f04002703f08d6e9aabf5b63a28f892ba2a05627dc055f34430469053b754e8c1c0dbf003bcc39004fa44346d3a9c049d3e87489fff7ac3afe2356a9b01f66b4b50697b0ecc284134f8039a00391803ad9484bf8eeb0a1b87dd71baae07038a4ec85c7cf30cf497165e9c6ffaa5459138c804d416077c4c14142da450380b86033498c817fc2201c8dee0dd7a8731bb80981f7b8341867420e46ea80f11e0f4d27ea309afd863df165e90a4a1552deb0cbe2bfb3274f1376cdab004bb2aa25ae96576a0862ce5bf2c9ce6dce21d3772f514bd4e483466b870a1fae75861ced195258057a68ccfc008276b7243c211e55b05ad666e9e2b405ac3301834f122dd091825ef63dccd38a778448344adb89b5be6ba776388eaa17d24a344c57498df1cefefe47080ce3e6e99c23bfc15a937144a4dd26161c088846e47bc7dc759a33b1d842254720013296f8398fdf735f2eb3c324a60726802e07448b85490a109ce34a736f97ef61313fb86683b62d5d1f8719141ec2a2383b9f547136b62793db4b89272cb0e4a76dc710bb5cb2ce79d89e7035288ccb8431230eae174a50b88e768f1a96160257871cd6ec4ae782c59894f31cab49721bf467cfab1e336c201e43ff855cd19adc63fd1c7409c9775a3d4d66a2bb026ffbdc1400ca2984dec317c2a9a1086f7553852b796289bb66b7cc9206022885c6ffe2289b5704b6bbbfb0511594823b3e6f13f545c0b024d3739f7028371b9a9274f956a54b73fd341239893813e9de8c28afc13209e21ab779b6909e244c407d95c0eb0a2ae5c0cdebebdaf249d6f3cb08a1050c3807cf869a58c8886983a4a9922cef63de2a265a894c0e5b5749da661d3129d01162c15092dfbb69347558a8db232916b4e9fc5bf347ef0d6d6dbc75ead139f0813c5142d0d9ae3e09a4d787920d04028fa69aa9513ff0aa655bde6f2bc567f17a9839819c63d3bed74ba6e414044b7b9c35e386ce531ac43055b59b78a69c39e9aee01972c420628d39f65e1a352f2a22f2b0fac14b9c76187d79859a83a823a96abeec23a596b8ebd78cec1ca1ef841c1ab87cbf96d8afcd49b239ffae5202556316b2187b097c67561286cb535651f3337f1c0a4083d2f2ff5d6730b3479b800c6581c59a4f9f9fd546d65a7581ad2ed5b16a6bcd0e2ae8191533cd2808c4c4994175e101dc0a0d758bdad22e8afb8c8ca1e1b21b04fb0fb0416fd9195540f7dafbd867528e30ab3acd17020283a2a668ce35e8ec4f269640281b68de98c5bfaac795c40dc79819831d6786410fa82d9a83009a0a2a141a5633c3796b6ec05d9f002a009f22d42aadadb22fca2420774ced22207965f408b9b305345af0505f05bcdf18f3a217d22069680271e1045e15c03a3473160260959b49257380f8005d110afe41beedd46d8c8e6003eec1092a80b6f88058e0c0ecba930444de1ca579e2395c19de35b2108cdaca8833c5240b70d72265b0c81bdcab7325a0291bd66d8b53a8aa44247549d3d85d35ac29c5d1932cb44ed585de9a279b38469c766b480d1de0c7b3a034921ff4df887002708fef6171da79412063eda48d2408ffc9c2d52bbea0d83cbd4e15d865f454f989392514c35a141a7d95f3373193703bf8e8f0c16eb40ccd4a8d43baf941ed6327a9bbf17095b3834a43cd919e39ef07ea1552612470f81803e12ed15619c65d5211b7d4370722971bb7304f5962a27dce7a110c2d356da3d98bcbd6754e69b59bda262bd71a776b2328390cae2499f6f338d4d9fee3b43fd14aca8b5401363d7878138cbe4f556cbc78cc255d5610ced57fe4062428458ce46a375916fbd70abd70c1b1b535a6a0f3f0c4061659cd602466c5dc1a36b10510665b81d19916ff673e2c8195f2da059fd2d18339c44aaca84b1db4a19e2b006e836eafe12b53bfc57810668805a78ca8a0c9f0dec60546ee201c46c359e2a43eacb7d815b2447260cb565a68d11ddfd44c041c0a8c92326f99d72e02c51ddd00916d5b710f49a1210a3056bc059e331169133b031e4f5b15ef482bf34ceefa177aa5e9553018e3f80187785fc1d075f036df902516948d810cb2b5528371c03227e8d97368c5f70a056181ed0775777d383d2b1508032a28eb62173e0a28f57ae5f299a1a6516787d0d35c5a11ff29636ceaf76135f3820678c9c223306e21ada3ad8e15bd0ca4e4435430a48ccf85da6578c8a8e5fd3e4323abe36ad3e689bf129b1ddea8095a4603ca397d790f93e57d9f823ad2812b56d155dcdc595fa2c244e7671ceee34bfc0e1c2c1f39b3e0b50a84e1c378be82c5a07abb18a2f4864e9071132829c9a214ca0269487a0a0b88c84274fb51e5c496656961c748bdd84cb84f797a7be679d52e813ab1cdbd1f61751500fe62944821427459fb619e5af91d7bbd07705640746a1903b14bd80bf12ceccb980a00059c613d3207c6bd89dbe3ab9ed37e59deb1c4626db634a50f765d3574889eea47801a7f79e903383521b26f7f19bb766f906abd1500dd636ee8f04c76a22d73f2da394fae3133e8d2cf6e6d9780218d219cad0fb0abe9c5840062c231055dbfa733bf995301ee5a8d75bd1a5cc30d8e6227a1460cf81e013cab381d21e82c22d1be07054a54d66df2005f68b12ef2273afb3eab44fd3c46c47458005f36748a9602e8dd91b439493ee29cac7c2c1d83813c74fc2887084f53d371023e0c55ce38c0de8fc5af6a22a67b0a5bad7208d79e281477d171863eedf72c9a57b1779e57f8371b8ffbbfb6056a3f3d3c4af8010b56ef6efeeca73e83a5c319dceddf9b82bd5bd302749a57b0998a4797dab905f32bcff560fb30577f935708f3f39b55bc8baa221a7b019f93237a364f733cae42b452951253c6839e1940ce544b58869d44749cf2c94c3011197f9583c979b5fedc0aa51d8efbac012e8d69f07baaba17937efdce1b90ab77b7c45bab6201b1a55ba70f08523892317129911d0a3721f2bd921baae0a15f37338606e55f29bceea17dd20f279b546af17e36bd4e34b1380663bdf38533fe9101fb898cced76b96e9750604d670fceac10fa83b1369d680deb121422c0a186c51a8a3df5206577e5f1763a8e325fb13909383b65558955de8180334da871f1624ae7ce2625e46efef1c7b13922fdcbc0c46671e95a1025572c799f83316f715c9a9cba0b42e0cf79acf208560ea0fa9094f6bc5aa9984f27e492c06d8880b251ebafaa616a8847bf9f5b7e0ad88a842df0e92ba25c513b290c0823b431f09e862d52e72f15a135889d2b7542719fd4f68109cfb93f50fbb6b83889ae6a310527e953fcbcd810caef30a85ec6530a237ed0003a6f6400b0abc9eaf0d9e16518c14636851234500886a3000ab5fcb338788224e7c2fce5bef1991efd6b730e172d03080c06bfc34783a96cf20d7701981c1c54d9c8e5c399c360e0931caa6049dcac46fd7c4cfbe4acfcc75301768a087a7c4f0149226828ac98633d654bd91960572aada26b64607a8dbda7854fe6e5e7acd3dc37c29e8f104428e4726d2910e1299fadfb2f3f31b160b180314962b462e53c2d5b3e923a1cfdbef03996446307a1de847473bd974f8fcacbe9dd0e879a6fa8a66bf971fd570810b6348970495811e2c0a38d5de4c0fa43ef1015ef3a3e01608bb5caaf5ee34ce4fc519518844421092a19eee21cfefed5ff8603c74f1c765f634038153bdf6ff43b92e340cc83c6ab43193cc1b4c7c018098e82de81347c3630917131b451d319c627b01d2917111ee12c95fc95427c54c15209857bdb60384298ddc8a83554753720572c32a113996e5fc6f0ba79e21c15ee00a09206a4ae93a68016ac12e0667321717178ca7e7bea59602fa127858aaf0ba432e0d91469652b36fce690374516f506eba0275d3fbac2254c27427ba99941c72f51bec57490e99e50cfa5ee04a4d9d4d73220f361eef2643c60fba319852b52141cd0b781398438c2697f4c8c1f09af322ad89a82d34c29cec2b2cf11feaa021e2649169a972224096a8b262420675277ad55fe8c7c95628901f269b6c87aee31adeb1b7cbb3ed1364c17f5e1366e95ab8ab3a1db921770f1a501311271452c95b7602825ebb6140d1d728fa8eef4a3ff81357116696d016a0301514f990a71db3f32f345b3fa83e521e4e8448a298b26035d7ca27f174b0032dcd69d4df5bfec74ed8c2f06c37a210ae445039897df1560e6aa99507f7e0ed3478897e8cd67a65d66b750d090610ba9a1ccd0a4c7a4cd6d9a37862a2743509abac49e77c95b1bccc873c9cf626844dc01fc56a508e0281640df2ade7619b538261d1ac733a22d83f0f647a6723d906ba303d6abf13c0d8bd61a5e4fc24c040dba90ce6ee908d4b9f44656f51ab82d12aa5975c9d543057db8577f05f0835aafa0b5293a2d85c98edb31ceef01df745642e13466dcd87c95ce33a2c18503577ee10f3844045ae2c690f51a99ce71121a081c6ec2978fb58ec20f07613119317a9a97bb855647c0bb183ac5eed2e8ddbad80dda219f05eb6ebf2ec443fd5b16e6303a0881944a560d72c85d4d9abe1503f3880676a6fbf565b2957e586d16e03bc57c0c9ae48c05cba1d5c7406cc365ed9656f7fcf25c4033c98145522957d9d5d7ecdc8ba7ea15b45e50050bf94cf31b1d12560232e1c5cc0e05120a1c568bd2d049f1a46874d82ca861564e4348782cf2a8d5df0e1c121b66d92ae96ae42a9463edf196b18713d6cd9d1fe83e526b8aef4edf4e09bb1f60347e2d11de60c555b116a2cd720c15af7cc4390747e432caaaf6729163687cc981f839ba0b574fd386aff9bd32c30e8d9f355c7a94491f3e58dc2c0ec042377edd89eaf4b31c5a19de6ab1fdfb4874308aa53d2757edab1f9dcba7e44e7b3765d54c83903cc9658f16e7aab996bf3beca354b6140100fe8692b3db01e22a5bb321aa3470b6fab63b0af4de889c0ab6317792e8a93875e73b5746c489e1fbf58d20627239c828f582d5d4555b3b562b1b245ae9e60ff44ec693ae064bd45d07387072642ecd1438fa349c676244c5a5e01c115f78ad43109e5ee80440237ac9594c4353f11b727cf50440419bc852682fa8e45868517c3001b9e0dc62c91cafc6d858527c8604d9744d6e86a0ac397fdf0c960031902b43043b72547ab4a2531dbb17663dc30d0d74ac4df44fd4108404565e28f92afd774757e34be09242687db682bdba425e2ca707dec4d970ca5ccd2d806246d94e59f0ebdb68e7f57d4e71dd6b8118299cec5b69838ec20351f16b04a186a79e5d442be6c2eaba2c24169f48affd6f61cc1bdcce9c6c64afbfa00924e16c23c66dd6b489da874a9ebcc14ce00d1d55dd2c903c59ab65cbdb65c7f457039d789c5965985a8eae4c84b0174ae7c29c767069cac33ecd28379463ec832654f615b690cde1fdcb6e46a5c54afb0aa502791c4f91c4d405a399ee16ba5f5a2021ccc37d2df48e48c644884f007ed47c225e0d21c4480eb6aea3d9a91ef36e8139a5fb50f2c14c5465c0b2e7a2a0c13d3e5bbdb57db0376e808a8e7a3cffccf6964c231fef0be2143cdb176f72b8651f06dbf2f93dcaff2e5c25be9e93e8e36cb206e34fb1dd859426d8034da2e609c568a37c1235fa0d04fc616fa7ede94af68cccac905625adb584b5aac560034c1a400bb957f69ecce78033f3e95651596ee5f2690c4ef5f4225283bc5420a88e50af01a30a0fb120ea4b65a2c35e765ecf7af801dfce3db65067ea288219d2ae0cc8dd5b47a8220aa0b3318b2bb492622cadbd337993a17b97690293b90c962f6059b41d78ffdabad42aca1416ed67f30282c2cdac6472484d249637d59e10881cfa08e21d015b3f8038113a7faf7de1f2567463d38fa6ae66df0d76317351f0085c7e743b25808fa2b1f6a5ab04751b61ad9d91e847975b67f7167352dd69001e38f1018025a92dde99ceff2af2c9b020778d4414a80e74783cd40eac3055c7ebc8fcd40f8ba77e10e821b64e539f42bcb4293fb5b971c17abceb9a8368bad5b76671afadc393636032138b2eaccc7dd173aedb144f3bf31412dc5559c12d9300d23b3418a273345dce5985219288f607620c1eba26989650e4c7b8355e0e5ab517dce11979954911ebe8c7d71f4caca50c5cf1978222df695d47abd4b434403de3e49ec9681bee75c6aa21e9df7fa8dc50476cbda050b74bf1c1d642112f0f1d907b8c0ad8a776781116101a9602b00dc83be6b5109c02f04111ad39ebc201d344025c6c895205c110b823829f474aa1c8108debff8fce36af885f23da6a23ee394bc5bf4be79941b4326d85c099867822310ddaaf691a52ed9c9bb5d7a6bbc413a284b056028a5e386e6f7b896190c31a947e06cbe06194c97596003a3699c2bdf38ca4ad5dd185e5433825c55fe3a852ca9ef1dc2b7ad86efdf99ad6886787c78b6fb131fc24edce2fa08a358aa98794d36c2d24a4fd58d1995ade51319efbed0ce489379419ea3dbe2959e59dbe435d87acf4c1c150d40165a842e608d2403184cd1dc7c1145fd0e2460968ce7fc477d7d6ee1a5a0bd6416e19729f7114a22bc0c8a8db81afba96cd9b38649e6e57ec679acb867a5c22cae20c9170663d4842570358232b0a329a1524aa1a5ca6abce1c5d63cd5a9c6eaa5c0e4af180cafdf61c3b84c4ec63e7f114db8d760b9459d502bdb9a9cd328642fb6312a3e14d01e884fbff2ddd45935d94b0e8901787d2fbd5bd0fd5ba3f0f4524136ab5a9102c2026e572fd97e32c1406ebf688cd3a701cc39f5e64654d73d9200b1b91ca5740206ad592f251b843ea8f635daec4d84572f967b58d5ae3f972efefcfc8e3ce5d6143da9893ca16ba7ba608b81b3f1212f8aeba52a94b3314dd8ac7abc18fe6a47c8f2225ec864b014a568d5870bc3b09b28add1196cd21d8ca6886b6ddc5744fdbc20eda86cbb87b6d9e0950265267ded2cca5aa93a3753bf3d5c6dbfb945c9ecddb5b334bbe75fc987a815ceebba1bafd8de9311653cbb454aa067b5c5f1676082b2ab421e9d3408bbb218420b8812da2b50957d6aa86af24b03420caa52881063505fdaf5be39f06f678998ac3a4736f5c26909fc30867f92b56a806717be2b8402496c131286b39688da00b040496ad583ebb4e2507ee90c244629d8932631f9e8263779a1027f263cf10a03bfb13f5f8bc880f5376c7fe87300543f19580722a8e815638c90f23539ce7adb2f9c5dfed0c7189c19449e990b4b244d952f05d710501696af2e4ada13a36e5e86681ff9d2978f647c96c61cdcfdc3703a68502250f18d737b16172c51d88d6365a9e0e083861fc18b9314164b08493a0d36e98e3ab8623c7b0fa179e8c81d2398a382e8792cbfe36de50856a0ab8f25f7f3936996618581929ec2a9c0b897efd399d691af0008f199bc9229a9016d980d8453280aa91c752842f1f183b74e99e620d883d73a5861cbd20d1b1b64656e8b2426d62904890384c035988c7a0d80d112f7ef5dc06432c28b87c7d62586ba3a2f44686cf6254d85e6a72a53acc42ce3f04288ee568a7c9e7f35a18c4117989e2fae9168b13327022aee65fe89308e78a420d12fc478e8840782363be94adfa82917b9021df0d043355157e175ec74153ae3d4d69db5eaee73efc9d45f1e12256aa1fd9b689702e5870f4d3089a7d8c702ebdf875828e761fd9b6a2330b660a0fe55ea5fc2430626f9c914ef91151e833bac7ff90705b4e4fe45c3c033f357882212f9fd189f7ab51b8797ad8e8ab95e977d285678e74e3a1424273fd789246ee110b6d0c16757b750ae03b11006e5f6858b8011b74fcb8dc62f8140c0600178ab73009c8e6f72e63a53cafd00e3d480dab896ac14824370a018d61d5c49b812bcfc61da051a9403baa229686b753e6cddba875d744ee5bc27e356994e34b6e7c3c3c75afbbcdd60da40afc6bc3cf43399189b6049c062b4be03c644e259e20752117554917f12dbb37077a472a7f675ae67673fd237ca19ba3646e6ad90e1d715a14249e8a6402803502225d72f65a2a39afbff2181f026328688e0c92cc2bbcbbe95740dc84a117699b3498c15aedc1b9bc7553e9af2f01c1170b86ddbe621aa520f6cc764ba36483c015e8c25856b8062230a878201f05c2d7a4bf50782a5d0327d28559ad0b9aaec8f89632e00ce1bd0963d98d1043e9d4878601e4193f5d16229b86bd71f0ce610ec951875bf0f58936a18ea656864c06df17c8ef3407180e12f57513a772bc6d7eddd405d09d10b1634dd99b3e4552ddd4586b0f24c043a4e13a526cee573b830f0f9ee642cdf822e69b631bff700c7e72c24b678e77398fed4a4463e1f6a403cbd126449f97c1ef5651b9978c6eb0d4a84037ba7cc8a98fa12e0522cba10211d3503946bb78f7b2b99a0a276ab97ff25d0ee9051824c53a03401150c14ccfe5c026c1362b3454ec7da3c3010be9884f5cdf800ba8fec84287f3d23aaae385eefa9e46352776692079a532c2606c0145169c94d4cda4c3c4541b1a3b893daf5333871644b588bec16c2e29763253dd7e5e83fe9f1e233e99b4861d91ca0584df049aa82efa8f8f31647dbeb1ddd0cdc29ea23b5fd435d4234cd068e046ce706e5898c998df1dcf1ca0343e7f2943b63780a76b373804ede7f54703da8655999a679ef6ba80c7360592c282cd890bef80f90fcd3c2324f129609ddbe83f278dfad00bce0c7e024aa9058101ac2a8fcbf47fe41cbdac51e607577a629b4523c01e2c06bfb20df3bc461986310939babc6c4d2064cf8b1ef3738c0e5a1fc2b20b5c3b4f12c11d94b05a11503f2edac8b4c54a54df567a65dda77bec4adf5491c094ca45684bfea89569f48c6c305be24a33cb2b3248a8a4bfb7ee9150783dfb4ed615628c15be9be87eef83b88811b6965c55139fa173639135d1c72dc0dcb84fa39892af38461b12630f341eff19ce98a9bdba4cc47f44717f079c66453af6e2ebd48eb3f2ded6d38cccb05f2bda05446f25cc4c9a89255992e09521a79fb4fa3a49a096006742b57fee3d4e3ee28a06184c96db2526cbfad217b227a99c3396745f124c2dfdc1342a7424482a7c96d9d09c7447de99297721fe0dec98afddf31b8c86d88101366130609f07f07f64c33704b109bd5231061f31f49135066571144b1fc32c8f6bc0f90ae363aa600070c95730a7c312b0c4ff421026cfe324ecda396d3ccefcb34fdac12497b044174d8055055afd46590a75b7a8d800bc3abd5a614841e46aa2347000de899db09697a8412e25ae748173d1e1cdc9fc5762d7aa12cedf61e0dc47a4ba28238252b557478c63127d8b1425ec971210fa46d18fc3288fabda2683b1580a2a288acaf98a040ab49b50dd86ade33f462c7827d9dd500be4995c79575561c82cb35e14fcc126f07229c8577f724309b2487854806cbca114baf61f15550078edf35d6ebc814b30fd0c98b449402194e124801d569fbfc071fb29ef6351845fc0e1af7d50b7f93c3f658fc9b267e0041de621503721a5ef6fc82d63298c5f9ce5ea5158767d47e97809a36d003035f744a62f60e29cc4226c61e349569fff2ce3c8b295e6cbedbd6ddb041303443e944aada4a2da59cab71e56e60e78c73a81a8a2bfba0c7479cff98b19e39226c223068b8485a3b32ad4890ee963eda1d57e6693c547b6693183151f569211a53999084095412cb90788643961348072022d0799c8cbf246cac79ea5b005d032e0b273e5e8d6fbff1eea43ebd3fd125b0cc9d9e974533d7cbe7163f3c0030d5bfb732aea3a900d040d0405b79626db572ad45b0795aed5e4dbb713cd8b1ad1ec11f46b1a144cbcf81634eccc5d595ca212158983af620425ec7be8684910225032be6331ed6561a813aa756c78f17c35844ffd809394049005a18e21a023f321615a83d8fe9549bb3329ef167f9156366d42f8dfe55bdace05e7e19e13d8890991b2bc9daf6b5bc52ecafdf03ca37fc85fdb868e81557bc48ef5b3e1e2c7b192bc64ca3f3a6f61e4b14411e15c761e1dc3271cc7ad16828c70685323a00067b7441704ae2d63f55eb93834afa09b05122d3f43746a8a71c69dca2cd39c2b61cc5e48b29104c1060971352650e10b1c3c2e4e0f181c786025ac40bdcd5b592403e476df05d378a3c74a0c5e0b7f56c7607e39a562b98e42ec53ce6fd9ee88bc5f880c84655199383bc5c2b19c31608cd9b3c7465b28af72c9b529895789a94a61494320de2d056279e503645fa9b12cb69d9383c0308f792880551b8d3823fcbd817512bea07e4051b0ad4dece376033b4f465bb4ff078e74352e6710aba8ea4ea5fc63688966ab401a6e39aa494fbe637c890fd9811b950a45a7d095d4c1a9fcbd0cc084e5af300fd8f08f6e306c629125dc86f8460bca0d967d5f3daa0e040ca8351696094d17cded48bde8fd06cee8fe4b794252e16fc6e459865c9df64d6e7975aa1b10f51a6c5544f5693f2aeb5bf07d1e3343c3a6fb35fda00f5f84c474c58306573bf948a00e2cce361ee8ccaaa987cff6b059c7a19b381286c78e2d982309d1d09fa7c46a57a1f551efc73a2c0c23db5d19db2b24030cbb4bd761cf6a49a8aeef9eb82d90aa9654fc9402c2fb86397a76855686566b475b4421933c0e30ac4b8e823e0c7eb411c2815b3b1d884dc4624ea01c3bc3777070b00e6c883a1d29cc2a1931e5a4421919eca18cbddb3ed7dc9c330ff1b01f114bffa5940c5c18805a4cc40967f4d4ce02fe9bf3c0ec113be4a1fc18925e865b8ed56d11d0a6f5bfe1060dd8904e86604fe0edb36ae1ff02b13d793c210bd9cc1ced8c65c67cd8d730cf8e7338b748a8d6bf30ef9dc2a98bb6bcb82317c4104004cf685cb679aa8822c9a3ed45d74bf282821e56165fd8944c56703a963a03e4146d6366790d85f64d6cfa6ed31cfb50780cfc17540a612481332e1035952e58625525232cec5184024162960be9ea6a9cdd37f024ac26ef331d2fcc9ec9a8d8717ba453768e24485908fbd0a915683c97b45531f25d13f6c74887e426d94562c7fb2e43fa3a13aca7d29e46def204aada4836ce009c4117f4f52673b301e87acb42e20e7e0684860694160e1c81322bcf77b8f1860350e92d2205a8ccd125d39839356234f23b6a67f251b8e3d2f61909e74288924585f690adf34f93f872602984098040173be1f0b621b388f94e45562119a1e10ec4062e7b83714e3a3bdde3a2a97337c625ac84ad135009a359d1a16b0d6703e27b1563723a4a4d67bd9636120942a719e63eace6343684e3e0319489e220ef3faa9797448e48b5401313da4e5b2eb7b01a8f404ef6df277311694380dd01048798db24c3815aad8e7af5b16741c44b7216a26c94dc3ee629a7eeb36b9e2a473e2bc01650c90738503eca8b5b5717d0a1c745f9cac77549338a96b7e034271c6b471c8e79bb773f8993bf103852ff64a4de7077f7639e1f501b7d69af184788400ce61303a77895aab03a0d38f9e0ba1edaddd7f55dbee22f170309b48de7504c0d5463c4e1ea5d0b0454b9040be01993f20488ea2e0be0af37830bde4087a28877b80204b39f7bdd4114d47f7eef6e4ffc221b4b42cf9a2c4bdc42d75b5483ecbb583ab6c3f74137104f277a717e3a60e32d6b7b3700776e99520881f6164b4d7b54d6721c444af60101844c2da0ca0ac0121695b6a0ca3899fd0205badc639c88c7c831a9de76525ccc4419a3b942428790e33e2ccca9a578febbab74ef86b47b16421c0144e2080fa0f3571a48ef07a3d4ce3a2b99dee07840a78929f0860bf49088177875e48859fb3e0e43f727a5e9119d8b285c99d24574e63db858e5aa002e83782180852583453fbe4f96c8c52773dfcf113acac2286c21c5100fabc7f10851ed4735fe6193e44e4103333f244bc8b18a882899ed117404b575f9db74d98f9d64d5a757167e0d5751284a6c0e7b2a4ed5b01d497fc17a2fee5d4340fd747421553494fa92b03ff29af0c37672aad1f65c43f9ba7165d8c80d60ca205d86f9298c40f1c86687a3df98032b4ba7adf4fd6541d508dee5090eac50e62a4e69c542bf98d81742ecc0c5222d6a63bae9721738963278b472f5008d36f4d434436e3a23156268ba8b4d961f0ae1908368f7542892f288317c045729e67df718ad812508b210eecb95a6daa48223bfcbe87c82e9c94c460c45fcb38556ceaf27801a978b2a116bb6b79830402e106fb08a89023e8d860589903d260984a361edaab935468e8f5a52bc2b5715596eca83bb2b32be783dc208f84e097f3574ece3ce39e3ec7d4a1220330c4c0a706f56ab48e926d64944200ea0dfc0150d26a29204e0755b271d1b7cdade6d28907467c23a0168375474e2970cce1b6659210fcfafded110e82a4e41496c6a9c6a48a02e28e9648519b2e460e27625c368f67ff6ee8b13d239606839fce69e242889c38b3c820cd3d734ed3a44bddd933a9bb5d786ef39c140188fa0a8425d347ce73248ce7dad94812151ca7edc12cf7261bba6aa95bd1df5124403647748252c1a27e2438d4e2ab8738ade55ee83f937bae67935c2d9a2e2dc8464e0fc2c0fc79d06d98778fe492337adb3995b7feb2a3eb09a239d0e9753f1532627474831b03a3b0b9a1f5001f3e8a2ca9b74438fe885950c8c62ecad94cfef3529f8454fb5a25dd8c9cd541e8ac7a01889cff7deca545cbe568204113e4920c4e1e48937c9303a2f88c58189c750938246b704c3e124871026f4dda7723d7a83e1bfdbbc98390eb574265a7def22745d77a7737e5629ef055580f5a074c1f845a01230a4df89c0494d994525ba9b42fa3aed8465947e56bcc4e6f6a432c6e6f4990b78ab7c3aadc4670a21ce25e39e54e6a1c25a0322da0feb046c01b88aad36d8fe7f0a510e4a967e228165a56f0edd20ffae349a35843cd0d42612b12ad128c4d876862c56b5c56fedea59b76233c6f7922e818ea3e7e8a7d19014a3ef981ae97e09661c9060d025e5585f6aaa4ad629d125d0acda60f57db36af6b0902c5c6aed209e255d3f9f2620bca942d636c04e9b80aa1dad843d3442a95ae24be129104d95237ef0837955fb800e196ae6b8aa9bc0df6ad0f9006ea1d8ec66f06df74c582ddda68ce99c2f6d6779f4157016458a442670fd76314176d5f201a5ac472634221d170a6e6d5de8311df3a81e3305e8a350864fc860855a4287912863bd6bd83c0fd7571c8e5a58e31841f369aeff0d08ae188fff846c57fd424fe7637869bc9dc8a7273ccf21af199cb9cf2a6e31564afdb4554e62f975680d138fae14e607e6bcd1e11eddd345e7213b2e0d06af3abc4415c697e4f6a3c157de7bf374590e330eef63a6fc68e2e3281abe0f07c5650e3b3dc98d595b3c54d369dc889ec54786544bd50bcbaa6488530c3ab621e78fe958fdc09ad8b0300bd7fb5473a6d5fe77ae940fa08fd41703a968dfba198befaef91f4babf64630a6f733295527beda7d4ec78d60016b1ad25cd642093251471b29ff8c5763dd7d639e7345cfdf5250aa6e23655a250f0c3f3270783842334ca0946831a07b6310e9d23b096de8d059060d7309b11b994a6ae9f2d16c9b9ebec361a57ff0e7e0f18cf785f3bbaa3f2249c012730beb831dd1673c6fda38d97365ead8a267d9ca1ea5ad93ae397e6800bb77d983076ea808090fd02574c7a0e071fba75a546180f8fc578c6edc3221db253a29bad2ac261c4414f83e2acff1108581c7c05834427baf76b0ec6d38a0dc60b1979dcabd8d4e5ab6c4d09732f2fa07074a80dbd278f57f9242198a7510a329870cc713c2760b5bec5ce6683f18ef1bf2fc889de3c996ce79118c07d57cab1ac496d31fdd49eba8bbf318f830faa1d70656bc951be241a2b10386b22e3ab6b6a1355a0ff052c87888876cae5281a54691868529afeb2aed14906d48070ecf5ee69d116b9eade0b396f0f57333a85692419fda189b2ecc9810efbef01a4c9710f754391db430ebb930ae685072e539cca3da4c764809229ad61eb8f922607ca400edeae4a8ae699eea122c12fe5913578d29f5eb8b5ec5f4106420f49356036ef53715427c80cffa38da688556f858ebd7c30983936305be7238cbe6c86ab00199415ae32862c3ea7d3b40ce699ee4f4af755a642761244eeb631a371ce992e37b9dfa599226898285da247f847729f6aca1690f79a21f04462b03bc5a75ab09bfd187e8db3fbdbb6b475d795fc76e8b7278b6e043446a650a909e00e31c50c2d68c08ea5c18733122f2edf433604eafa66d7c73eb4fb9b37e2e3f65530a490078ce9680663a5e06b27b3cab8d240ca4abec0ee51fb9169487f15ac5a0f4d18eea1bbeb196b62ec79db9bc80a02c9ca8c422a0ba2967bd272d1a068923b6c5d6b1da11b450e0ecab4f8c84c0581257f3e6f0591d46eed2bfa15d03f3e38d4018a4e04f58b20e27c6c07583ea65c23f73c0b8d294f0de67a060584cfd2efead04a5c2a39d47a4cbbe7482b3d981adcaa0a14d1719c8e81b63c664ab5f3110162a267ec875e4e1a9864ac7bd1dac1c1f0ceee9377031a17337a3175d7559421563177dd65191a31829f468ddf000f0537c742173cb17dc293608d9b8587e73b05deab934d5c34ee1a22c807df60ab0532c241eb4714a3ed7253d8fbd7c13546ec805a46dd9ef5a77ddbae9fe3feeb494d5c1d3a522741e73ed7d5dfaf4ada60aa8f4e0a7ae2bb0ca812135d7360f9e5bb3ea9c8720baf354fd458576db281bab1c9cfdb372f5007ce3b974261a0932fef42e691f2f1c315b86a065a00c2394b7d2d01b08200ada91202428c24deab4af4c50abcf4a5502c69966b603c73b84c10af85589458dff445e26d5f8a04615bb76cfc83c084e525c2d25240449fd758b5942dc6730f5c0a30752e9faa7737e04f65a61850cdb55791960183524b42e795415c43e00fa27388a59b6be414acd7b84cd55cf0dce2c6908b698257c88e21a24da3e32290f750603ee926403484d1bf1ad2906d0d2cc17aae6aa874d31c6df9c1dbf8a33a623820e340c267fcaea1c365d21574173e0fd1c4aa43df9c9526b9bbd1abe466d53b93a2aaa61bf66271145578b40ef5ece553c156013638aa3a2e3b39df56ee00d21568f5d8ef999afadba3f91384a9a89af3f09b83a0dfcde2487c4610573008be5010616a55f91aaaa1d91b550d8e01b4a3a0a70718e90f81b7388ac1a6e5fff33dbbc8631be27568682857b7a5624ddd0903b27993f0d0fb1e80baaff9e49e9460fc0462f1d44dc2985ddf40965644c22c0d47b81135754771d00db7b3a41b64ac6e5c74779d70bc8b279b33b054bea38021a2bfa5875fbf1497e5ed0d1e1594ede6c13f4897690a2ecf60ee82babb529d1961e3b9f38654f8bdb84bba6962b031c789eb23b3266cf46615cba0f68d9f3cc23d65b0e4a5cb2a4574f43a5448cdb560485730b7e10bf6c97973529544d0dbdebf150cf8c783b045e6b5f52a6991f8d0b46402b6e774042bb505a8caaa8b90302635a32734feeadab5fd11eff6a462d5771d3285607b3b40d5b9edb05fb3ba4d466d3c968d6e225a6466aba75dab2f2041d5446904b2f5a30a50304d66df2d99cba8c60febf06e20fd6cc3bf8334ba22a68cb0ddf6025e3c4eab87e91dbaf70c78e1caba76c4b26c24c37bb4f73a7a765ca722b486cf20ceadf3512174628fdd0e7576958b0b5d5709ca6e2f67582b57a661736f7acc1c0a7021004bccdfd9449a8c8d2cb610bc7adbf0da6eacc0f220ae29321a36c9f1f48dab9d627d05c6c7766b70f3d6cff22feda362001a81515a2cca7f1aaaa7ba6baf79cb630220eb6df669190d5086cdbb6357106f46499576b49375c877f1064b71a3142ac2ec33b24df799e200afabe38b74a6ff54600053076dd21e4e203376a3e5c6ea27d16bb6bb2b36e27efc565c6cbe7a7878bea98efdcc200b420dcf5f53f2cbc91bae480969498ee8c24a88a5d8f5b3375cba09ee476de8565796847f3b6290c27b7741aaf6a5b3af02a1a93fc1b5958c09c3ab9b88d90e71c235469f3a8b3d93224e789321306d8be21026da3414f25b47b1308edcf65cb1b2acabfb1b6a50dcb48cfa2f5fe1d4586d5a34d3b4e906409e4c3625f1d801bacdc6801c96bdee97da7fe99d2f8d3f5c266c4ea1e29d1b43e06d2ccfe5ba5f5b3cd2cddc9ef9ab375e5f56afa3fbb216be51aa45807ff74d0a0a1c32aa1cee522a890cc059030e1cf128549a2e2f38ca72d064251b8bc860262c7ddf1a534a90baa96ba8ed0d6c7a747ffbc1f265939f92f1e96496c772588bb4a3153994fe0d2d26124673342175fb8243e1ca473b41cf3c2ec45db783aad523a25ede668dd047ac842507cd8231eec11c28ff85fcf9690fdb58f7f5d4030b83df749c0c59b71960d8098be930f7ac8555d02b9d9e7e8051790cfec97987ebc5d967cb2bd01ff2b34af04c304c17e847785ea1ce1cfade00a994bf5130b2490af497a7de1bba6d09b29e038c9642da883b50a37c045e286a600bc60091954a5ddc462eb9852b527b0da09372c83f259b8b8d398492197f25c59735be51666ff7be0d3a6f4ecff06b3670e7f36fad194920fd24e7c0fadde53840b973447c49b8408fc0de74e311e070abe859e2fa864dc3ac2d348a9fa0794aee507440f3d9059bb782f1f53d5bdadef8356087cbb31d4a988a424761cfb684b6650bc31ffa763f601059c9e252c34e78064278aa83a81826c2c20cf06d6a1a7ee58f9c40491e5bbaa381c3946e4d1442ba06a8d101892a12f85faa80a513080921e17faf19d580a3fe2dee45bf73fe077992d29d38334140186d6bf6a6e7fe079891d20202b98f688e7b55134a02c02e9fb5f5a85afa050f683983b961b5144640e5a73c02230abba23ae417537125baa2d240b862c72a7d46d64565dd0a76d3bd253f991305f33a472651942c798f6b7a09b1cd838aa112233130501eff73701f4a96299cbe1dc22680ab08e6445b2487973c8957f174822704979e788197389ccb674e2e62de46b13ddfc0603ac9f288c09ec4517d08fdd8c207fdbc153a71bc3d51044b28d421262e9fa3c360f1a678870fecec321183c23110f2f1758ebcfe23c3c33504bfb11aece8747500242c08c08f02a40407101e131e25ae10d9fe9f029c754919d87bfbb4d1be246e7ed928de443e1ddf74591c631474c13e4e96328758668d2618eeebd741376a13d52ae8ad720a1eca82303aed904a0a45f161929fe6109ced48b50e19ee8edb172065e8e69c0758a5376fd7e3e45a95d54e923740c58ec691a5d2fb374859c93bc42ac9955978f907f3b6a697e4e786bf4834daaec3e8e9dab608530d9132e8699a52258a2d11717cffcaed2c6509ec638f9be97008bb4ac7c399b045c81e37765d46d649a66bbeb1707468fb52eae6c58d3fbfaa41931cfeb816ee4e631202facc8441b513a1c41517815f414a6ebf43df03efbc9f0557837407380da09ad74da3752c035d9bc0118837c3b79de515e54175fe2d206e4b139a90465e720d0b51db5198731d91a08af6fe8a1e2c2c818413db3b15f9b2b931f47484e3212a0534746f46f669b102c3b676f908a8940a545a4c1e1b472764bc0e5f87d215a24853a71f7f4b0f49811fae02ec34b843831c0f98ba30d7e63b709fbb4b0e9445f3228cecf1675e4e8d4980c8783dd93594607c40b5f44d9febbcde7c6ba56ee4d9afc9b2cbfd2163eadeee69d49b1682af9e19af0521485187956bb0e4f39310203abb5cdc56dcbfb5a1b99218fc12a6bd93ae873e37123c6c93b55e5b6d42805fae83aaaf2dfaeab78bc0c659bacfbda33d10d577918eed207493ae38d4c9088c5fd090b06948e1a90ed34f91d0dc59b94440590b613902669efd4e4b8c301f1c7e4f874e3079528123ca4e32b3e55eb5b398ad752a62a01de56ac375b55470dfcc233b033a23b676892b9db942ac4845678f5e951f7c7d3cc77b7d8d42a79b6c0da944befccdc8c6fb896810df9244337cd9c75804edef2e928800dc241ef7bfbaec45c96349f065e218080264293283fd1f0033e7be6b0fd0c78927446b45fc1f07ff3b5a109781cfedb06bf71ad64e13e11576ff40976559d43634a4df9c7008949faee2618b825da2a1ff03c53ba17b01d8f87567620fef8e3bd25470737ab31f363d70d9acf70c89cd56a54b226066bd811e26bd36e81da63757768fa033a8370015a87e1891896187c0a3bf32da1160f9cc8d9738bc572a0d44c7de1ac2dd1a702556515f6108704a3faeb00c1d837a499d203d4b62e9a9d106ebfde54eaf0c3976267a4b644d4f67619bc8a057d053a39741af003d67e27ae98d33f380cbdf8e4581c3a231f9180d72737515d760255ea180a2fefeebb1d52663b5a7ed8aeeeaecb65fda17a6c21f6ff18eacde583356604a8971a8ac1154219859bd95e72830ced500c134e88236d0e2a67f56ec403828158bd2205ea54c3b941ca71a0c9294aea35ea44c5f8ad7fb174f700f682191df8a4f4839d204008b2d5dba4bba788a1f8b4b631e44edd4282fc4bdce20a641ad423aa5a0812a74a6d72183610110ef62dcc5f3eaa7a4434952beed321cea95dd2f4fe96f446f53ef4396a51e07ae3bc8cdf91bd541af2a61a9fe5833d815d6f82c3eda02792c7f7922a248ca058bb988767cee660f1388bd5d3f7e01b18535c982fdc09f15187c0a9c8576ba1cbb207e91ae0a2d637ae10ad01bfd74a717935bea95fe9d5e3c7e012cd2048e7304720e571040ea6ad20148a4795bb7a32010b8c7b052f1bf93a3d17b5ee7ade000e931177f9bc4439ae83c9c0e5ce5ba84601942c83c23603c781df883eb3fffc30a778365e31b3d627bf998fc81543a4fd62c516b441a215bca1d940eb00daa0e3d6ad8445fab44ea7ac124518aa689e254ec1d15ab4dc5b3d3bd3344a448370fd56ca748ec81eb9a8c09bff556c8c5889157d21c33735dc62feac3b16ce315a3c4315d9b3df65c8ec4611c3ffb9d39a3118eba9628d5b459a6693349db5615bb903f2c098c536ae69ac6ba619cfd157b38c3304b22304e518891212e0b3b1f3639e198c09e3bcdc0a356eb358621cdec47536ae674a4ba26adceab8b97179288f5f9570ab88826ba61c51bbc847811f182e225023bff0af3f24255868a0c15151a00815de2f5245f46d8c981d70578007300c171c4895162d4878b3a9a37f903d20e694431d61aefb931da50f13834c77368f81d94e632ea3a0f0a3b8bd67cde6033669e4b4e1cc54039272756629a20388e39393f2de8c379f3e672c1fa16d2c0c145fc8581e6f9cb14c51cb14fe62d0cd4ba327de64b06767eacbab55ee38fda4cfbcc9381c664031c7374cc217b67eed5c5cb8b1714f225022919e8be52605f54c8571806d20008ec3c993276eea02f225e4248dacb08e9c381d705ec7c7961a079318e255eafa71c78b0f33854bc8114dd9034d0837ac13127e7f5a6e2a618153464af1835a45367d3646ada52d7661cc54e4e4afc859558e9ca165925abe0b0f3e06c6cbd62628e9d9086c705ab39d29aaf3935a5b408918849400ec187db895de129e414d3020b033bdf34985c48fe70573edcd5bc5d5d2961b213636a190fa6becd469e9d585227113d37a8c4d9d8862c43f442d462f6ae92446cfb0dcb67d868810b6c93d1568c869d9763c8908da16692449c4409ce339e074feddab8c68d3b5ff24a8a7dc94b495b9e3361ea2658870e7b9b89e97342fecc2f4c37c1451f18099405d4984f0aa70f87859de2ab18f5e16657aeae640becfc6c047762364e62b1310cc51608ba7648109ff0d52f5f9120f2d5cb69be96ecbc2fa6571076822e1107b2887fc538ecc459d9295ed929b62156915174858166687f45316633367664a4145cc44a4fd20ad98504bb2d6c8eaa34029a7a4126ec7c7561ec7c6744b781ee0b175de9729071c80e0739e168d5db360376bebccc6ae7430ea619e67efd726e4619045d3b33b1158b8d3c3feacf09560a9b70571a8703aab2b9b5e8bcbd7862632b1477401714d173630c4be02b28225f854daede11b5b8d2b4c9f32b4681b1da3b3c3b3b558c521aafacfa15a3c428397d78ce53774c338debdaed2bab704d4e73f6cbb9d99b274787a78a5e1c23063a6089088d90e10664d8c445f3d64578c0ce87514439ee3cca2b69e751a688f295a4994a123553edecc4787073e2ae746dd645cc766263952ae209555af24b0a620a220a61d36fd894821836852189b893a2ad578391a7765333e560e4df66ca22eacb750108c0954ff2d8410091af08c082d885195976ce7ec531fc798324622f3bcc5451cd704c4c37a519e5fe8c1ee08bea5aec3b773d8cd12feac3c57ebf2fcc517b3818efccf1c3a639246b9d5e22b5aa2c4a8ff7bc4a3dad35d0d7f7d41aaaac751fe78254437d8f2a6b55590a3deee3547adec15befa06e816a552a3deea36ef97b4824f053aa87e646fafa1a7e7a518cfaeb25520df4bf5885fef5522452ad557e4a255ac99f1b8c3b55366d36a36348b3b49dfd0bd3b59994ed84357476878a61e4cf3c0d4d437800f1c3cd2f6af6a30e119000b1995a101b1786b1cc4e8dc3b594d3c8336b41f4dc185b0122e72491183934c5cc5c2ec7b9308644295eb66b2f3bff97d2cb66a7d88628035b86f4c24e510b3befe160bc8d9bb99d7a7366ad9d16d325b853ef687956bb5b5689513377464e0d51aadfe82a492443366cef78cd1b72beaa0f273e217fe6797cb89903cb84695a4735ae69b8db150b00d142c866e2a2c9d4b7dec0bd174b8e73544c5454636cc6b3d30091675f140e8ef17eb82feac3bd2032657e75e164653cff25d29439997dfcec5212c921e450e7a68ca7caa2d0f778955adfa3d60045e5af75d6504fab9c3eb34ba4191598a95089963aa2d6d7c64d330d10c3a62f9268f6f9b00839f481913e518449e49698d50f377b77560c8106ac15b236d6402e9a4e0c34cb98b2b3ca4e8f5fb3ab2f924a8cc2dd84523718771ebb8e5792b69d991a8c5cf9e6346f5ddb994362941317cd1c5351b51835a57849118338a33dc6f052d2a10ce26c1c41183ecbc3577cc5579ce3dc391793a26d6c876704b5880ea09af6b203c42caf247cd56ac821318aab1944be92442e8b44d3e63856be3adfb3c178f98a9d6e6f8c93a96953b47ae9204acda10f377de61cfae7c5dc97a312a568da1463553c33dec9641bc7b33397186852c0cecf9e0267859d5054e8ebb9d6bae5a775beca62f7e1c48494129244bad3cc9cc2793161cb754ee15431ca8da858edccc89f1a8cb3ca4b5e1ba312b3d1b47986af9af68569da1cc7346dde58ec632c369b1dbc6ada99d9fb97af667ca6952346c9d6fb618bf2196683af988daef119bea106e62b3ec3b5ce59fda29a36e987eb99e3abd8735d1bef5989451305ec6725992a4060af1835e2e650332d71d1448281e65f381a4439f29c8657d2ceec4c050191a9787876669f62a4cffcccc91f279ae9659999de4cb189849d1fe5cf8ecd07e68b82cf7c625ae9cba2976c625417316afae0782a14316ae6c4a899db898d135022ad449231518aaecd442ec432638af88a452089a668a666c6b3d384246a55297fc07a99065604d209599bd578b868a7f255bd6112388993e3ec9cc32b89e7bcb4d3b8d98c67e71fee3fea0f37873e731fee75e6c4a8ab31b633e3d981d7e02b0ae0d818af183571b2269b4212f1d891f3d9afa8868846934886187545313a7e5df68a51585c918c5416b0571417279028f8e2573423565938aeb802cb39069a4c45022b96404e2be424236b392ee2dcac82a75eaec2ce59bd6112763e87023bff61f191f9a42491f8f92f0b49147efe2301d75c2690445b4822f0f39f185963aaa6e1fa0bf33df1814012e57cfe834212e17cfe8b8ae29b4212d97cfe1b8124aaf9fc478524caf1f92f278968fe5dd138cfeb58545d1b6f6607de6187575277dea171e18c8e4d3c36756df6f9f14bd774ae02cbf32b62c1f58a5225b8e2094414885d5c118cda8713abb0571463e7c30f27896e3eff8191351d9f3dc7a61ebf346d8a2a10a3e4cffc0e15a3903ff3322a868069f33ca83802f933bf838a54c89fc9f303ce5aaef0301aa3238d3d07ada1790e95f2c7a6e61fae6b926939442cc2d8f92982518c4212ed7c5e0c018b2390443c3e2f522189767c5e8c1a9bbac6cfb94dbd62ceced7d42b8ac951af58859da7a9572463e76135cace8ff58a5990e0af7ac52dc47ac529918bbbea154fd0aa57440158af4865274fbd2218b37ac52ec677bd6209ac68859ddca55f497867369bcd66079b369b7d76f9e2690a93e09c943fdcd7a1534625d36edb3e0f96edefb0fd1c1c2ae5cf0db57d9b98edd7e4a0b17d9a1cb66f8dedc7706c1f46a5fc7951db3fa1ccf65db4d5d4f63f96d7499c9aab8fcb6c3613375d188fb5c392a4f5585aa7d3ac0fe785695ad79a2818c1f7c7de0ede122e4cd267a669f34b67fbf3a2ba766567f12c780fd7342f6a8dd1f36830b2ed5e226c6a8e39312539f6f7c5b2bd37525d6b925f744d8ac9011b375f3837c2a63e25393d1abbd5e480e25135cd05b07a52d5eb220c45f1a30c8bc148d5b526a74e147ba86bd2c2a86e0c77bd322960752c16ebf3aec65619b2be772e48b2aeb228ddbd43f5b7c4de552add3d2e486328ac0a46060c0dd855d362d28a6c5f9e54ee8b030dcb55ae4b2fa49838c8b0f3b02e1a4646d73c33f267be456f78b861ba2933d545d7c0b3580c5a8945d36daa69336cd6fb5eae69608551c1ba1002892e9a463b9a2eea5175cd332389caf450f709f6fb5e17b6ab5e4e360d04d9936ada64fbd99a366f7f97eadc77a9ae7dadeffb3c292fe78dc9f5bd319e54833929b07e4b4d9b9f52f7b1e0a1d3cb49ebe11727ac4feca84224ec0d2ee795842cea1e24101292a8cf543015f6baaca4681e9a07f9e33935356dcc7111583baa0e73b4cd4dc783b573b324897ea3c3cd0f9d19374d2eab31c08eaaabb2b3ca0c3b1f7a33e8605573a87badbb6a9a5577053bd3ad216973e963f5f8600fbc0e04ebcd12d577c387c30d05ac37462af7e5ac54d7247fe0751ece6b0ac31f2ba0621e6ec038e161e05e0c80bcee570f0a12048eb9d1e166878e0676feabea9a7c297159090509a56451b1358dc3b0c59ae778d822ec06277f5a20cb15dee0585a18d587c6552bf66ab1b4dd6a7b83bb017383c3c1bc77af617cec35180963e606274267459763f00677f4d93e1eecbc37e653b29f92fc99476e3c2454ac12af03695c04d61f3fc2253d2e69f3ec7d41c2ceffe0226f0809344f44083c844ed6e0123ccf846e8dee0a4ae771835d141775eda4e02ae58f141e0309529987a64d90ba2c5883e4cf3ca11b532548901551ce2146bae1a1bbf162e75d373014c0a66e9662f6def48481e2cd52d77aa925a487bae64203b6038729eb636515383cd91004d148bc09d343b02e9a061bc1c992940e866e055d0c3264b9b97180bc71e20601a20ca227c6c8da99899e1823ccde9b2590f5a903cb9c88e7b3b4b0a91b9c27c6e8d97bb3f4c1c071bc92e4ab593434cd6ab9421dc4d0d562b50cb49a3edd959446eabc178cae2b2b9715683d31c6570ff166e946879b251f3e5e491fe8cde0536aa479d81949f45db2ad6be0e769b4964108c82c21dd1b9ce5f162d26fda6f4eeb778cd9624a2c68d52b5f206770590370c7d81d06d8e00deec2a69cf040f4e095e442c375e5b27af7a0a2914192c8e5b29fd2b73487683e3b0869629024727d71f29a5a67353935b17a90459739e1bbeeaa960fcaae0325e7c626c72b3c48cf45630f12685ea7ded1073b2fab3c18ca9c393875dee8a8739e26a766586fd054ab7a511eeef5ebe1c6f13d6e8b9de63b5e5eeef53539c9a28c8fbdcaf858ad018a4af7d86bf03e56263b5f25769a5a43f758fd96a6cf573da6a5a6794b1e93b7e431794c4b1e0fde92b7d4b5e681a901afa45ec0d2646a8930d86161e8143a3535b95c6118baacc41ca2cbe5e4726a6a72a1e1620016d755d35c56d765d50a4398cb95a32664001651745d14b1b45a0c7825b5b0b4d82ee053fa6cdf12941c948a159755d33e979555d75e9f6d014d4e5558e191f14ac0459ecdfb2014955aaedc0dce46451456ca98749f57d2d56ad334d92c1ce459759434c746d69cb1bbce689323b9b312bc8d7cc96742d9f341317e5e9791d6b47f67c97f97afa7560d9a3e0d529647a4c7796e90f57bb0bac03a78bd4a24481ea44fadf7f450ebfdb7a890f6e99f16d4b4d661943507546294bfe39c60c6f9295f4ae45914ac57b42ccb3aea8a45b4b3825f46ef0662b358acceeb7e573b9644dcac83200bec6e77ee2a16d136c1628120e829f1e0358bad686585175dc1ca932b5c24becfe222aff57e4b12856208d22b4de3b33a3023f82ba956002550df756710294b0235b7151f8661f55810e85aac56586f045cadca56bac63a7f852b204b6489d66b279b9293d8609771e6e8b07a70426a24f9710e4912e4c460524292cf9943728aede77d1feb6379a2f4e9b7a80dd591e0c562bb9b05d7c50726dbd75e0518d7b0be2813c516b0342191658a6d574bccc45fc48f05a56b37884a6843a5697c16abc36e014bd3f89e08a354da475af96e8d65d1c8a202b0de4922d759f562b18162658cf1fb955354aa950270d1012410bf8c1660692fa42d3c691a97173a49c4fad7f485162e303616276d59b5933fdfbfd777d62be9f5bd582d607921cc32c319a6f79238ebaadd12a62de9da92a631ebcc8242a56bdfbb62b1691bcbe2254f88182142c4f228e4dd65ca5edac8641b71af76b53c16f85006f19932e2d015b17ef5f2cb89cbb6aad04b89ebe265d7bc56cb6bd1f54a6ad5ae695e1d9b2643d939ae43f3f113c5d64571268a5f93bd7f6b66c2cef79678d84ee5a99799bfef9fd7e2b2c50619d44d271760b7c1b2f8e9bd55a7d78930212eea3e675c5b20287a572358b3b4755517c4c37e3f2f3d61b755b3b4156321c8e299ded7effb1c3acab1e339adb72a33f3fc4e2fb6835517f8b0bfbaefb8a961af753bcb536fe7dd8556e579e8b55a8fb55af566f1d8e3f32475a1f87dfcc1825e4abcbb3e29efd0d767b463d1c5b2b74ec5394de521ab47d3a7cf6347bd3939f5e6e0541df58e6fd50ab298a6bae01d4623c445f38a10cb57b0df2c1ed75677b15e16625bbf125e8e975dfb2e9e5f24c0aa1003b50e529a2a03df0d5d993efd31376bebd313626f164f88ed3effc1ea592f13442bfeca6c2356adcf16e222b173d1ceb320cb82f701d6bbd75521069ad2f3c658afebda85c8a10b7574b481737c3235c24fca6b83655d2e96c5ed791eab597a7c96ece63765be17368badd7b5942c9ba565e9d1e9a5a594ddecf893ca988bc79e077a7a6c6ce63442a4bbbbbb6b504fd7ed792c569639c1a6c9f38f264f10c81301e5d114c1a0dafce6f942ba06ded575f547d3827ac0f952e21169daf45815ec8818f92d0a79d79385d634f6bc771d8bd5751deb9e0bac7b5ffd31763fa6f7c677f64056f7651656e5183a0b46cad93f844c5d2347f387ed8f534e350d61e514a2ebba96dc89773d6cb13bf43c2046175cf71e521a0d029b2632f953ec477d5fb0e15d74d22df350a64f43e95e30caaa48a45696ce8a550c635422b568674316bbf173d1782cf492272f6ce9b38d8a95d0e511e9dacd6955234debbb5cf7bc30f42e685b77d12c9d91f6e94f570873d523223f8cde2f11234fdaa74f73fdaebba57b31e9aceb47d3e3628918e95a78f94a6ab1cc893743675db5c7eb6c7f413f9ad65dc7aa63d3da02a3095e15b9738d20943d97e541f182200b043f6666666666fe58dc499af4a1c176306cb15dd7fcd93d11821d18d9661425f8b045599d053f0f04ab6c9a91b1cb40285fae7bf41ab11e10eb53f3bbc332f3575fbbb3faf3e6e48c34d661f445453a529ba6b1c079efeec062c4ce2e9c9ff4ea5377eea6ccbdba1c423965ec701dce765dd77508a0b217bc9a324a32407cb117bc648ea8b2f3e054c0ec39e79c73ce39e79c73ce393b26e69c13ec66066c2198f1c410d66ab55aa7699910dad68bd52d98b434b09025ce29b2bde1c7d61217d11c06a3f9f77af7ba8bc689cbbe2a53e0a504665daf24d8d8b4799ba6cde7788fbd0e7be87a25c1be16052d335de6e1a83be6ae3bf320856551d92d8dcc43c78f31eb87500649f98376c3b27318e5bdb3a763e3494fda4c5993c30369c64f4e3006c25a2f57288231f063d17435b41b291ccff33acfeb68facc18eb60de8be5f1cc117f842e518261277f48d63ca3d1c5c6a6e93256be69c61c9ee7795ee7b5d76759c51483f57d9df7c19457eda161258bb19ed7f9d83b673767074271774d93a7792cf003dd922cfa81fe3e963ef21eb304ff8532478262270158eb254e188cfcee5fb764e53d8fbdef8717ba5e2d4f4a0b695a8d5460ec63492f87ec660e469eb36a6c1de264c3fb70d32a47be6f44f003235f8e3c604e4b3cc872796127caee2430f219ecc0c8973b5cedbc999e37bb708a39af30267a9ee779defcbe392708ce0fd6975eccd311b644f0f5314b26ac98d7d148cd1c5492bb86a5a3057e2c974b145fa0f782c13836bbe31cfc123b1e3a521f76ebc124cb516c1a1f1a0835f2afc8e01223ff87a5fc995ee7791d0cd625bc81450c725ea6bc5cd1c01fcbeb9ac59ffc40cf04ac6f727fbae055b0765dd7759e3732970965cf65263b5af91e3b5fb2d74b6466666666e697788444e6481d79692347294a5076923669b3756ce7d88c625321af59736e0ec84c5e1539297be49cdff755597789e49a55d6b115295b4b78d268074e1f3e48ad7cad255042a4aecaa27c075f65ce83b3cabce9815f1011575010f8814a4a73880f2ecd2199c756786c7dc9ecc6eea818af94b232977498318a1c02a58f7cff8c31c0b01cc4557237d304ad0865d7a4643d640549708c81f4d367b41d58a70fffa3de901cfaeed5eeba779d3edc3d9c5dd73d99554ad9c989a469ec79b5ab47d586e6e2b537841496752941094ab0ebbaee2df04d6fb5dcb5648b5bfc05c3dfd1bbad96d76a893b722c7b52ec3e285b1294dd27df759dd7c931960526944123eb565eb11d08b2baa5c7593c3bc1c44228de597d500eb9def57a6f51cf8b5917bc832eca6f5519f2d4d9f3aba094af25b21b3b8cdb183db786db4be33a8c14f5af324affbf56a87e85e2db50346585442bd4ec8eeccdfa1388c9d413887993b449a7ec64ca63588a85eece7363f47867f6be75edce252b4663b2d32f53f541b11be4b1addfd1b65ab0ef885138d7781e9e310ca2d1fe9e57f2a76f2ef467bf7d268d040f65cbb9aec919bdd242d3caf0981e9a53938acb34941c774ff1f0f0b43c284d6b79312bb118e287564bb113232196e925d80ccffa3c3c9cc34a2c88706a272f3ce339bf99ba76932845d366c7e8ed2f6294a846676fd874c533fad63549b58424627ba6aeb597ae3512af8d9bd5ee8eeacfcef33b7be39ad651fcd9678feada6c67369bcdeaddf9ece10eeda8a6e19a16a6713ceb5bd62b69d6b8eed0a9693c346c6a1c8f9f544a629f5d28d9b9b49c337375d585218b402d24901949d4461861efcc7db139b00c5846feb4704556c158a0924460c82166a931ecdcc2ce1cd303f346c5b45e4c910ca9314c50d8d6b4dc1c6235de90b2b395ec165f7fdfd73af80b478521ceec1cc54573a999bc5b1519cc4ccdb4f3581b212fe0858b9a6836c44a5da1302f31613bfc42695884040a4123e4cf0e0e653c26b7c36366ac1962a7a6f1d0dab301271fa107b40fe867b3ca5720f0acbd845f42246c38444804d3c083638cea9ae4d90f0e4a2130f355cfce5741e8675026530b998d6136e0b0ac06af312d405db68aaaa9aa5c3cb5a1b0089b6132988a88aa887e66858b6675056986ca080aa07869da12338c9d5f818ba612d3039205763e1441bae08a91eda83bb10b333ad9d8509911abbae0d8c864ebe745f03ce06c68449a2ff24a9a5d358d5bb3566b4679369bb5ce57676cd1502b84d1d0fc7e389a9af37abd2ee75a67517cbd5eaf0f07cb0163a9198fdbba4baa693969e56b26b6ee7a48f44a72d566ae59fda23e5cf8a211c51c9dcf5e9fcd82b4662dd86c769e8543b30799cdc270e8951406a16c61946dcd4599aa8aaf988de6331f8e867e61bea8a6f5f97e5df9f6b128308e8ffdf21553b1991ae758ca0bf91a9efb6ba0eff11a6a8fd357f96b073e7c9cefa383baa5dec7b7d0ba654b0e0cdab05921d179f9d6b4534a2512a53f3d1ab3012726f943152699496245ae9bb534de99bb6cd180b1d95477416586fe3518773e7b3f3cb2f311767a27749a43b2ee0ec3b49a3b0cd34482767e83c430ad56d8d4ba446ad5f00909509088c238b0128ff9703b6fe698e5d9acde8e0c0b9691445de3315d8b752d46ff5909b13789c5ccf09cefc1312251355735adc794ea793d959ed7f3ab8ff7a85be87d7ccb43008851f42215ede5fdc5ce73335961eed9ac995410e543f0c3ddd8e985d4e28baa92f31b451bb199665f8fe8f3c10f53311b700c61a4234a9698f04189c239005889a11380c814b4ac8624e201ec104f19a9470ed1cf7a5643318ac72caa69b9a6512a4ad13ef3a763ac1885049a17451062c0cecb9e1aef879389dd09c6d78bdf718032960e3b3c3b17290f1d7f7ae6e1a152370cc3c3b3d3626e16fa607aa79966faa1992ae5972cca5fdfe37f951e7fdd22e7dc9213c71355d800e9f568fa5c993b95483c76d0537f1fafd2f30e6a0df53df751df5367aec7ffe5e437e6c3fd84309b5289f4959144ed756c74edce9ba55f1932ba367b67d5a1218171e74ad3a62b4956ed4822dea1b3188db534fef8114390af246e8cdf4b0993fc9967ca6159398c376cfaeb6b0f5ae5ccd19def481876623d3b0f0e0e0ff85397683d7cd8aae112401f10d02ba95527d02b69bed21e749a91440d43ab4e29d255631f830819d263953f43af2436c324895c458abc9262efc2e8b062145599190f6b02e30d9bbadc48ff5f1ddbf771391e3c38d610577df4784ff5764ecab9877a5b2aca99877a7b0aca79877a9bca843305eaedaa12ce3ad4db56249c97eaedab27e71ceaed334ece13a8772a353977a9772e3139dbea9d4c4bce38d43b9b949c2550ef744a72bea1de794b3a2bd53b7148cea5de1975e436d43b7348afa1de2965efb422b2df52ef9cb2775ad9fe2490be2783f4590ee108d0a779083c80062ae58f162ae5cf0c54ca1f0750297fb2c810c394edc34065fb2f3480010bc0e282029a6cbf850420e0002c18a00053b64f002adbbf32002bdb174000f88cedafa0420a4cb68f4293ed5b01c0cdf6abe06cff8428dba73245caf6a54cd97e142adb875265fb2658d97e097d65fb24f419db7fa264fb4e9a30d93e9326db5fe264fb4a6eb69f0467fb4951b68f844af973a48f44a5fcb154ca9fa31168df084787083c33231ef82802faf1b17da2a1214546108108992bc4d8fed0165a6461fbb52fbce0c2f68788110618b62fc48c32c6b0fd2069c8e00cdb1772a30d356c1f888c43e240be61fb413974b9c1f6817ce84107db0f4188207eb0fd1f238a18c2f67f3c257184ed83c0049412b6ff01144f80b17d1f2aa688c2f66964ae1063fb1e6ca14516b6dfc1175ef810230c306cbfc78c32c6b0fd1e69c8e00cdbaf6eb4a186ed538e8371c06fd8fe73e87283edf3f8d0830eb6bf2344103fd8fecc882286b07d9da7248eb07d1913504ad83e0f289e0063fb3ba898220adbcf21738518dbc7d9428b2c6cffe60b2fb8b07d1d62840186eddb9851c618b65f93860cceb0fd1c6eb4d171340efa0ddb1f73e87283edc77ce84188207eb0fd9711450c61fbe2531247d87ec8049412b6ef82e20930b6dfa2628a286c1f24738518dbffb6d0220bdb677de10517b6091cc9368111498c20778631e44e309640a459e5ec37e1f2001b8c70e18e71c0c0153b2c5181a80a4cbde06279dd6cb6e1b3de0446d0de4ed2d06834d9d56e1a914f4b0e7d40cb2102ad104dfecc2b5d07a59b20b841b2f468bcff680e052d11e24bd73cef41446e9015d2b4a0a3202144ba99e3f55408ecbd7770765e37df81720a2abcecb9b56a6c1adbf41ce1c278d82fd8b18e61c162c7039d81f89514abb18f2ec40e7bcc86b7bb637404edd8b43147068d616cf72e85af86b045694c13617ecac349a7d0f730ce9964567e459177dd7a191879943f35072ff4906e098f468945076c565a69853e44e817b4411ea40a51d9b42142433697560844a269af24a10a3a1dcd1609a3d0833c9c21e8d4356985285bcf8851e8425efb14723e8844083a09551089303849c4b2b3368770ae43c8e52b49d2982247825ce845aee449e771855ea42e11e42604b90b42b50611aafdd264382119ae6b4245ce457ee461117a840a1d91b6e69574a4f228749ad71269851eb2c8429742f5824934966b1a5f098d794a8c388fe570aaecc825128f5fca8ff0a0e0f461295fa45ed0ae7029f9ca027685cb51e8b29bd059a876234e95722154acc118e4425ee4618e575291ca63908faf25d206b97c25a9241cb9d08fba0865ebbd9c083d489539117a9007a92e1ca9420faf986e5158dca2780723755362e010234f80ebc0180eafba7663b9908dae4915583ec77293a70a392be2759c5f55bceba83554d307c7d64cc9a8b4aee33aea969aa9e9c36f9d0b528dd4f4610f8c35b42ed6489d49322d0e4e8df1ca6e43ac743485d0a1b764555c35847f25093d94dcc92047a26b4275e8422e5f49b2259ac632a1b315ba0d9509551c1c124e98f6e17b3a8c325cd3f842aaecd634f036d6aa6c9ad0e7afecd6c91fa12a9b46a4deced608516987d42bda1a2c9460c3eeb0724c1a392bbfe56b5de9e635b42e7ff3a36ebd699477bfa2c8b7eea2f2f205830c34505cf7aac62bbbc96e4f23ce0d678927b11a17d49051a3829a15d4705173821aa99a2c2411917184c1808046e84212d54a202688944445888441940708e5f1d234a12a9735752de87cd91714e6d50842bf9d1de13828904541cef3e8cc7148c0454270b04a4de3dbe388914538515c54eb7640bae45ab7d4343ed209bf42f6c6406024500818c80a0954820950ce9f572494600214122e54431c1c4e99aedd1a261c1cce95adb17c9c291caa3964eb9470b07c9c2a1c329cb0d06103968f83460fe54ce1485165f938b91aa6ae5dd9ada6a96bb70353e3a5e64b8d9497582e960322bc0aaf8efab3c0d8167492f20b3a5119aacd2b2baa08411445c0dc80689e213272be7c456124d9ed87b16dd784e5a750d5343e9223bf9d45729c12482222e7e394914445ce316062d5343e93e35421896ae7e358218986cec789421209391f27049268c8f938384924743e0e184914e4bc46931b481aff4eebe44cd3f84efe81ae0950e98bc167f5ad216b2010dfd577e6bbc1915a55844a4b84b28de52ccfabae814a0de4b7e3cf335d03977ade40d6c01da452d740a60681904b5d039b9ab683ac8144481abfe6d64ee06a445013d535b91a2b248d891c482d52e4458000010204c8e5ab4811204141414140800039eb9504a4e656e3440dae4604355127526f36a812d530597e6dc88a2535b925582841868d72117690b51a20248d6b989ac6e006248dc335248dc32b2a44a8ac04f2875f84cacac81f23239915b22a64219045217ff84254869381913ffc1a2036b08691f36b9888ce079d8ace0faf8cfc631a6ba470f603f6c96f2c17bb5d115a4386fce113a1352e903ffc215ab302f9c3afd11a15c81ffe105a7302f9c317426bb8d861048208a0aed5a4a4c1ce079b80ce0f85688d94fce107a13559c81f3ebf92fcf0a58b46e8322141707042426a92b642842ebb75cdb3d28a3367ec8d946c6a0ed9665505acb443b61793156f2c61873c2589c55293e5cba2e65023f1850411c2c1494575edd63c593e1f274cd770a4e89a04c3728d54cd544d17384c42946dcd53d788f0910411a63cca8fba3585469142ab5015e8059dd018ba09bd21137a6d90d03b4b81de6a845e5711bd3544f4ea18d1eb830abd1f40a131b409f48625d06b4302bdb313e8ad48f4ba2cbd3547f4ea8c40af0f14e8fd60098d8181680c7d439b3b7b426fb5b746caf257a077b45776dbc248accf5715f92fece7a05d2fdb1cb117baf75f9f8fd1d7737c76ab39bf65b72eba769fbce874b163e6a54c99ae350fb32f20fc08124cced729d3b56b86f611ced721a36b77de9e3fe3a16b77cc97aef978d1f93324ba76e72fc2f9321ed9ce7b69c6a4d304c29138219daf23d5b5fb24fb54d7eed38e5375ed3ed17e74be4e95d1128fcf3acb3de5bceb4caaa96bf7c9c78d9c63f5e927ba155982086e284c2daa6b978a145dbb5364b9ae5d29b2315dbb2ac8a8ba767bfcc9f932335dbbf54eaaba769b7c464546d76e94cfccc8ac869c2f4343c8f9b2ab20e7cbd8103a5f76a66bd78a0c8eae5d002875ed56b175ed9e7003b244100e280cec7c9da8ae5d284f3a5f478aae5d13bec2f93ab9aedd129ec2f93a63ba7649380ae7eb5875edf6f93a6874edea5c75edc6ced761a36b773cd3b5bbe4497586d381a36b57c957a8b3304a5dbb499e429d45d9ba76938e429d49319b9a435b3aa49ef32da53628a210a80deac90fb54135f9416d50483ea03628241f6a833af280daa08c3aa045c7a136282a537e436d5029ec541bd445e14ef9931b2a4f52b8b9918242bd299c4ad5324ea997cacd942752a2542d9f0a54051e273b4d769aa8b0b3c2a5ecd476c69d26287c2aa470146ea87c4ad502dea030f4dacd0af5d6eaad5d859bdae5e636a814ea7dda390a3c53786a979fdba086ea7dbaf950ede6b54bc19112e54f709cbc09ce932238442e05a776c179e2f913273c6f12c26d5045ea7dc27911223827721dd406650500b7a136a82a5274aa0dea46b94e8ec4e609122936364da2d42be54faa96d149bd4f6c9c2069c2c4e6043a65764427ca141d2a3a425174461da428364253a43c8acd933ba95a409b28412e642344a55ea17a853ec5a676b1b90d4a4abd4f3a8f327ba27327b3dae583dba082d4fb64f3204236177a131d4d981c898e2347d28164880e216fa2a376d1f1343b9223b323fdb80d6a48bd4f3a3e44888e0bb9486d50504c78486d502534d9516d5097c93df2a310c95193304462526f9323a95ac623f522098f1c21d9aae523813a918db0c3688791931d4f8eb403b663dc61c4e473d2e44c42243f52b5802113a0c3c227f5c2ea85dd4958bb84b74135a9f769c799c88ec86a170f6e8302aaf7293c102c3cec482292fd9138c28daa16f00888187424b176119f643fa223c86e446b179fdba080d4fb241e4890f8a0bba80d6a0955f216b5412541caa936a86b2f42d502de118e8c20b58c44b80dcad68bf4a3aa651ca1dea3d6084644a85abe247a8447b5415d115e94738b4e944374240749ce6873c61c22fb8d47906e5b471fa16a016d507684d8c716927ac77ac71f69d52eaddba090ea7dcab9e57194f31178d42ef436a858bd4fadc7c67ac71b552d9f7d1ac14804d03eb98a4e54b58036282344b7418de032aa5a445bbbb86e8312a1de271e3752b58cf6a983221e27aa5ac60e6a970e6e83ea7a9f5cef59efd3d2915c45880cd586080922042408081602edf90ffd7f5010ea1646eaf907f4f7a1b4baa5917aee01fd3ba03eea9689d4536d503dea6caa695cebac8ba6f1297d9d51f1f80ecdf92ce732caa3ce72d387bf83e6d499d4f4e1e350d76f68eb3aa8eb36b47591baeaac5567512e3b5216183790800d1ba35f099654d0849d740e7183d40c6c53d60e62aecab0357576a3d15018601f9b5eee8e7aa44adac240dbb2afce7c8d14061a5e8f51183edbbda7b3b26dd7cd6e5d9be1e6907817cfa4a6ec8cca8db195acb45776c3c14d1f7e28655b3851961fe2e0e6904c09e9c307131545ceb24c8ce55f1c298b839b4312292a872325bbc91f3e4ecee90613e0e070708d839349c96e2c2ac35159d4f4e17b448c5776cbc1c078c74ecc18c5b29bec26bbd5aa904bdb00e3f24d2e5d2b0058f09412f440e94939bb4e326d3d3cab32734bc93d4d63d1ba26a594f2f756bae4595256f12c9a8d95204bbe465665b1583d4dbbde6ff9c77b188b8dfc28658e951294fd2111de1a3b4f238b440672f508f2ac97c3cbbe23ecb35e2c16164e2a4bf27aebadf97aeb4a5ed5cb71578ee7685559121a9acf2ba1f96c61b1e162d9d2d04b918b2818ab6d5b944602c97b350f5db4fba8f750960476ef9e08bb7725b0bbeecd87dfc1cf9ceefb6a12d6e7654c589f57c2aaa3fc91e712b3d96c07efececec50190f1e07e9ed966cd4c8e3d745656507a9ce439e57924ee591c58367769e994c475679ecc8c181bdc4d0253b7559b983864d9776c3baba414135f4baae6834f4c2e8bdbd2eaa0bdacbba7ab1ae5c645c171b76de4563e8ba0f94b69fbcb75741246983c7a53d1b980b8e0dcca55d1d0831257a4d744add9224e2346c0cdce9f0b25cbf33200fe30dbf33b6ad42abcbbeb2b7b3575462d913367f458e35f39518229c8098f262e311396cd76c75e0c7627d1ed8b5a6ab4316e58be58230149790545cc28d99b30d4ea6d9349de66de2a272b7dbed76bbdd5e08baa259bd2a878ac83899a69aaa6e57443eaa2aabab3353692edd6eb7dbed767b81081122448834d55453d5ed8a48b3daa96fb8a89cd454535353535353d3ed76bbdd6eb717aedae9363dabab334abdd44cddd4d4d4d4d4d4d4c455b7dbed76bbddac7a46e5a4a6a8b80a541a977298de44736a6a6a6a6a6a6ae22aaee22aae62dc996ee2aaa5a6a6a6a6a6a6a633e038e6e4fc345a90ccf514eb6abce0d26406018ef06b62bc6018e35752e772afa40e87633939c5be26c6ef954465f9d2b6533b5959318e7167cec89ce5af891166c39894d2ca57922925c5a599a545d8fdf663d3ba59347088054eafa73b4f4a759ad67595f631470681008b0e94f112d5e3654c0b3b5c28d9ee5d98b1a301d7baa8a67dbf5d0d6cf7ee043cd4c2f4e96e77c653ea60d0b5c076973c743b15d8ee9d54c745d78298d6bd7b0b73a893ea6e17959353eb08de455b956d8e674764fa8094913cdab6456f903aa9390482f3b78b9242eaa2e61094e9d3bdeba26c37e915a94eaa8c2d48aab3eaae3a3858dc5d27ab84c8175a607b650ecd778732c58cb2efeba4ce78b61e9224a8eabae89ac4420933b6935664d8eeb2ebeceda66e0787edfeb1bca0ae75ef82b0744dae8084d94935ad0c08cedaa3ad93ea21dd540fe9660cc6db497552dd54d7a455ea3ae4004fc93c7b7ece2e86cec6d0d9feacf30c4b8df17e57b6ff5d7d6cf430f59eef93a0f4581eed0f0a0a0a62aa8202e138d28e4bd27c0eeb93e68c6b8c36077fafb058df591d97a4f9d1a66bacb7c7aa32afcee0d9ae7653054eb67f67d5d108bf130d960cc34a31bcdf398695655869c61c82c01f7069565e22564a79e59595f2729395f2f2cdcacb382be5e59c9597a7acbc4c65e5e52a2b2f5b59292f9fb1f2b6929552cadb4e56debe5929a594f236959552cadb67ac94772e5979279395773631b9f366e59d5156de99b3f24e292bef9c9abfadf9fb9abf31a3df1d56ceace411c187951e18f9b112a8e817889543ac1c22fa2d62a508568e50e4578ab1b288946488482dac945b0c0dc92f6ab226c51822874833844821328d2032887443480ac93880fcf20d5602919c43d02feb606590641f8082b05288107e79082b439046fcfcf21156fec8a71fbfac84953f241320fc32182b9fb0128a0f7e390a2ba7b0920a9f2bac2443fbe52caca4c92d3cf8652eacf4407ed1c12f83616507520c1fbf3c86953ea4193dbf7c86953d328d1e3da41b55561907fded1baca4b273f865fbc0c32385d8f9ed21acdc9146cc7efb082b67f2494747322193492878fc761456f29054ec903b24991c9923b7c0f96d2eacc4915fdcfc361856de483174e89066d8fcf61956dac8346a7e5b0d2b6ba41b39640e19078da4913387f177ea60e528a70f3119849542c0244c1af1922ff9244a513211fe4e305686120ad7ef8cc24a97a4a2f53bc558d99264c0df998595a0dcc2e8fb9d5c58f9c94f1eb4f6f6e8e8e8e860d38e2e5f162a029f0088d4d9a31f9d5f490cc53f6a6ba5f70d07a98d73708ee32d6a6338ce38b88bdad806e71b3ca4363e737ee322b5710dce6efc456dccc6b98dc3a88d69705ee3316ae3abb31a1fa98d67704ee334d4c6689c65f01cd4c63038c7e035d4c656e7336e436dfc82b319d7416d4cc6b98cdf501bb7e0ec82e3501b579dc7780eb5310bce627c07b5b1997318e7416dac82f30a2ea336a63a83711d6ae3149cbff88cdab88bb317dfa1363ec11905e7a1369e3a73f1531b9be0bcc529b57199b316afd4c6243897e03da88da5ce59bc87da188b3399fba0361e73bee21d501b5771b6e21e501be7ce624ea3361ec1998afb501b4b719ee21f501b87e02c8283406d1c758ee23fa80d84fff80fb5f9fc8387406d1e9c76206af3f10e1e446d3dde7320d4465f2f446d3cff8350dbec3b17426db2eb7c08b5ed388fd7a80de7391fa2361dbf39116aabb9cd8b501bcd739c88da621f5f446dafc36e84dac28b1781da5a77dd88dabe834f1c0220f803c29c0627aea589cf00e60ec03d0b1397e1038f01ea302cf1173cf00674e00c50e20bb81dcbd35de0c06f125700126f61034f80068e80237e00a7b360c40d908117a08813e0cbaf10f10160e00218e20168fa0a425c850b3c85208e82975b01e200b0c0abfcf013984ec5874fa9c0a5f4f0283c1cca0e3781022f418793b0f42739dcc904dea4cb99d8be04872b91c093dcf024252e3f42a5fcb1e17dc391b7d29123e738909c738084719074862329e97c8324671b2449727e43c9f98c12256737969c6bb064c9b90d266736983039afd1e44c83264dce6a38395f3971724ee3c979064f9e9c6540c2190d123806259c61504209e7334c385b9960c2d90c28e7174081722e23ca998c2851ce2e90726e811429e731a69caba64c398b41e5cc022a54ce619c703673c209e7155439aba04a953318003853010000e72fac9c5360c5cad90b14ce5da080c21905299c4f90420a672e54384fa9a0c2798b15ce26586185b316013897094000ce2510c099040210c0398b019ca506308033992b672cae5c395f4180f3180210e06c4501ce5514a00067310638e70c608033152c9c47c0020be7290e7096e20007388b804a390401e710200001e728a8944312708e4a4002fea38583d0420bff4001f75180024ebbf7e0de77e0c27db8e0c27bb0bc07162caf0b385dc0027e069c87010cf84e033e6b4003aef3c2652fbc701e307c070c303c2786e3c410c36f64b80e1964b84d96d764c9f21c0e388d031cf07186c76698e1302d7f69d17291868734d070d703de7ac0030e52298740e01f6559087416020fb9d01a6e03ddc245123df22414c995d0a42fa149ce842a7913bae44e28933fa14d4e0275f212e8939b404938145ac2a350132e8542f9141ae554a8949f40a7bc0aa57200d0136e8556390a14004f815ab90a1485af40537800a80a17005de103a001f8152a8013800ee005a0576e004a80b3400bf00350031c01948527801ee02d50045c013401bfb485bb4015702cf47e01d4853380627903e802fe0265c061a00d780cf485cb406178161ac31d4065f80c34cbb550079c063ac31f40b51c029486b312b5e17c03e572960065a5330e946f38db284be0dc85320ee70950b69d73a0dce5bc447902671d28e770a600e5a5f30e947538f3409902e71e28ef70ae00651ece3e50eee1cc44b902e71f28fb70b60065a63310947f387ba16c8173109481385f80b297b3109483383751bec07908ca429c3140b9e94c04e521ce5f2863e05c046522ce19a0fce56c04e522ce4e9433703e82b211670d50763a6f80f2116724286be09c04e50d9c39401989f313e524ce37ca1c382b41f9e9dc01cab7b307282b715e827207ce50943d70fe00e525ce4c50863ae3287fe00c863213e72628e3ce4e5006730e43b9893308283b71a6f30a8aa7efd38d36867c759e993e0d0595964140f98923d10f277ffa967e51f2a799b28d00959605c51343fadef74d31a40f017aa71a97a687f1da58ee9a065a297f583c8cd2f213dfd4bc6a5adb1fb5249ae227a89595d5f5b1775a5d2059e82d2203bdf2ca2b5fa05736805ec9007ae502e89558e8952ed0cb975ebedc02bd9c007a1901f4f201e86516e86503d0cb972f5fa1972f0b805ebebc02bdac02bd7dfbb6157afbf6eddb54e8eddb62ec9d56b7b3b0775adde6c2de69751b0c7ba7d5ed31ec9db7cfb8adc6ed379cd03b6fb0775adda983bdd3eace1fec9d56770e61efb4baf3087ba7d59d4ad83badee0463efb4ba330a7ba7d59d6218cab49a3290222c3d8d33a451278922f0febc92441068c3e877baa186343212e1578708bf38f30d69248291df99915f9e1ba49191a25f1f45bf1ee8208d8a887e7f887e817e904644457e8714f91d1a421a1521f22b0291df118e904644ae18fa9564949046435ad47ee51646352f86fcca2fa2904643c210f22bc510238d849411e4579a9185340a2203a15f990617d248a80d20bfd20d30a411101c04fdca38c69046415d807e398733a411500f21fcb20f6a48a31082f8f96521ba37a4d14f113f7ed9881ba4d18f2440f8e5271da41108501ffc32133f48a30f9ef0f965288690463e53d07e998a23a411ed0a0f7e998c12d2c8032d3af8e52dc048a30ebcf0f1cb5f44218d7c84d1f3cb628891463d65f4f86533b290463d64507f390d2ea4516d83feb21b6048238a83ff721c6348a377e1f9ed1cce90463c3decfcb60f6a48a39d2066bf2d84f786349a15a1f3db46dc208d749290fdf6930ed24806c5e3b799f8411af17862c76f43318434da3145ce6f53718434cab902e7b7c928218d70b4b8f9ed2dc048a31b2f74fcf6175148231d61d8fcb61862a4914d1935bf6d4616d2a84606397e3b0d2ea4518e36687edb0d30a4110d0ec6df8e630c69347689fdce1cce9046b11e60bfd30735a4112c88d7ef1482f586347a1521fe4e236e90466212e1ef7cd2411a8550aedfc9c40fd2c8f544eb77423184346a4d01fe4e2a8e9046e015dfef24a38434fab460fdce2dc04823d64558ba1746968290bcdff9c5178534f2fe8073987a471ace4ed49ba3e5dc44bd9fe10ca65e9a03ceb87a83b29c99a897880ce70fd42b73319ca1ea9552309c97a8574ebd70f640bd92aa01e70ed42bab187056a25e69b580f3ad5e7985e5fc54af3ce3c29903f5b2d23d27512f2f29e08c44bdccd4c27903f5725302ce1aa8979d10703ea25ebe1de0ec542fe358381b512f4719e09c817a3957807311f5b21401ce5feae5a92b6722ea65aa019c31502f5709e03c44bd6c15807353bd7cb5c259887af98c0ae70bd4db4a299c83a8b79750387ba9b799ac9c81a8b79b0070b640bded54e5fc43bd7d3be1cc546fe3a89c7da8b7a3a69c2b10aa35a854eb564b9349e9181a01100000001400a315002028140c87c482c190228871930f148011799e547a4e1b08d334c8510829848c210004040000000064360004e2261ad1736104e8452344449b7b0e742d4be0e7ff2d8725505b45d1b60cc44c81856547376ddd71d8c29f78a62755f5c4c7b70a88cd583b097c2afe06da0a6f9e00ac1fd8d0c80aa38e54697199fa0b09fe52b66e7cbf7ae7f4d5bc1c25b03cf6aaff44841042fc21044e1488cd37a38cec35822cd29c56f0d59a9c26ca3a8bb333f52368e370ea1fa3185ea943051fd83eb5fd8336ee9a335d9ba9df93d427951f4e438bbf69283e3ee83570b270fcdae62fcb5f257ec79d75ed9b1002dee2c563dd40a9e3ff7f8096c9d1c14f4e202d1076b292d936a4bd4e480963f51529d4cd000de93406fb596b9526d983db8ba7c16a5b4f818aec09d1868cf0fb5a413ec9f3b97f6de72e5b2220d8f8bb4f17c91b12f6f385cf94ca532acda9243f7a5dbeb611c83043953c55b354cf529949752695a953b57cd87f256274e556b66c1291b5a8f78153fd0f7eb4cbfe009992eef4fc68dbc1fa53ecebb5d2f7adcb0caa2d8048fff9d12eb3404cfae83ff087f334512dca4fab977fa70ffaa00ffaa06e3efc99fc688b977290d44703699ae83b8c4bd08675ca48bd63b1af213733ca212590124809a4045230599c0e4010a113d1cd2887144c16a7031044e84474336a8e179c803c980f9ff9f259fd1740940da8866ae3305ad5536d7c4365c522b860402d6d2011f524e4ae98880935c8548c80616203055dafebe3c0b254b7f12d25100f8cf007501462a688076bd9eb9f43629700954f9e970540f7870f70e690aeefb9a0de180fa7d63efbecb30732a26314221211898844442222111119968e4300a4e094706bc8454486a5e31000293825dc1a92db032ea01ee68b6f3e7c6612bd0a390582d05398053d4530d05378007516de2f0b5b0f63d3e9acc6031e6c544a20eb65d79823c49b10a0a3ad54f8a863435eb8b3236133bed167d1ae94f419e287f9811301fb1f77d47091e5068e0c8eefbbef7dff3ea7e4fc329f99cc4c662633974c8d170887fbeaa3cfbef8cb091fcf066087bee1752d75801ab7924121a6d6fbf0b96f9ffaf6b988a3e2a998f2a8e8d86778c3235fed1a7994f20e702c296f046791f206c068ba7553e774f4eea465adb4a56ae589b8623f8e7af8fab21c9d20adb85fe4339219c98c261dc20b94837cf1c5071f4a44facaa9405578c595132b08244231db6d2db064e218b3ddb02a93ba5991cd88ca69c00a03b571008953c49b93ae1a2d8a8f4f62e2a737cec089139c3811ee9acd18e1a1e3fd6b30d2d0041a8506081e5d1e8c34442622efb1cf9efbec9743e481cae4837b374d6d522e8170a31c280817951c24e538e2370d118456455bc441f03caed38f125fc4b3299113f1b73c07b58e267f4cc8d31136f9453f4b40b3700e8b80fecfa1c67767e4ce05bde99ec84be6b771d3045c506c44855db328e37a59963b96246f87a41e1dfdd08e9c2f45d68025f0366ec51777ed053ca24e0d89c766f6e86670076c7f867c242a6280485d6b4b1676f4d4db99aa923fb8752270ef90aa7f4a0b78b8d2924756cf8723bc856ee9be93bc7dc027005333b07618eca23c989b8c455ef5ab904cf45c568bdc3fc4b64c2bd15cdcb888f5a32f3abfcdc9d6265584e03bcbee6152972a13640402e9dce0b1554de3226ff7cdc6609e0c65fdd6b9486f8d64ead0dfa2106907c8732abd227f34520fca35ee9444e4f6e6d38537be3c31f7b9b32f7a4f4d681e14e88a605f80abeac8db079046089a84bf9d0d52fb313846c06614bacdc3524236861eb1c8bc6f4046d9d536e14bc4544028fdc6c21e2af10553042a222d52a5ba528933b0b2df1724d3cb4197649f165043b864475cd8fac437eed01469989a566b44b8674fb747589bc6b211358cbf9aa1feafad005b4b21ed12531b85432506adcd6d90163a21b3f0ad7568c91f9a120bfb4b3bf30888513dc2befd08dffb002df9dc07ce3cf8f5a9460143b5d85b424d58227242deabb017610f48b04f58e9d5ae5212218edaae564ec7b333376647048bac137f1d779f4ce94a55a9c9996dc7e9aaacb4062053759f0c8a0f8f2a337db5045910dbc128153866a593de9fbfd3c3dc753980bb2cbd734916b45163260d94aebdc1805f5417494f5f4facddb25f22e7a164880e1460984973f1b01aae6a7cbb93bdc0d683dec4f04cfe153bee5a8d5b4cb416c243dd5542e04722087890a494381ba7bf268e733c5de03adad8d9984803cdd94d75ce27865c4e5085a9848e0e1d80f46795ce0f5542f86aaf904653354424bc1c5bc122d312ee5642549976a492570985c5d746b19586f898e4f5f635fd343958eaba145b744434a507c2000e840ef05f990a9652f97e2e4d63db4e47126e96f6819aba97f7200d427b4bad0b6c08e0ac0b0c425a2a8d8c15f82df4f0ba58087920657c25324dbb25d90917af3a1e62375db774a8d66cbbe35775419985cb38484b072a588c33f362fe02713668861ce142a05f990b62bf7ececc9ad711b3506f282b0d6b19644b9c50180e884b9e39f0cd1df30ad3d9686724670e5aedffb18ae4e5f50903a450dc26a42043f3a22439a6783020233b5e3922d03130408ac17156242be19beaad7a2ea18ba4cf45aa0f65f967062b7416108b921a5f3014b6410065dc577b018b0bfb99aa00a43001908d3e61463e871405715557f91fd3f4b0ca4941e1d77a4bdae889f00412bf12f6ae25953b58afb9b9e3ecd523050561ea359d7a0a12250fd985852915141e23277b79e6dfc1a75a9361134760a9443169c67f85d6ec1bb3b83526a400e3d2d74179b8234443f2602411a0adc4e1aa9f5482320004dfeaf69a6f9cb3cba96b772af5ab7899b67678c861280083a1bf348ad3865a615eff9d30ac52179a9434ffda0c9b2b65a47cb1db36affce730bae444d9901693b2f469d28ce82868bd69bca3527a2a9957478e21348c385ac820ace652ad3462faec766f3b133bb88d0e00f21687deec67db99d718f6b46b55b27d847b9c22a45e3316770481d5693423a808a9d27a80976fe3ab3296a3c7383d8ed17e4b4e65e425b797ffd851144a136af35c695668ba4b8a663a8e669254167c1e8d19268d158e1901b9faed088c2681adfdba8a044b0c9ab9a299aedf02f74823876946437a90a79907f5c52535f5e7e9caaac9a8d1e3c89ad34e59a2b946a6583096c0a6fcd8585b21abcea613ae36cda23535cf6d2ee0434b7bdc48d4cd5ca11a238837478a6fbcffe61973153b1a1c8786f392194d8a28ced437cee08a9c09a49c0930677eb862dc37e71a7d8e63d1f9d5de45311d326440c1d4c150c1fb65ada35f61478776941d3011dece9db596aadd39cb6c03f61d0ac0b21ae1415c7def4d8b472b79943ad344328f9468a759d0731395a674a7e7e07a5c85e2f1b0f6782fef7983e1f353afa61da003441f2ff679a619604abecfd8989fb9b79ff9ce9f252bf7fd261d708ad06f25f4eed12987721d2354f30a15f08cc14289fe0b9dbba16ca5d38e3b74db10a5ec4e7739a2bb4e940aa40a069f82b6154da634f326b52a56d41cb8e833052495548b9fa17a96d1db94de0030b75bd434dc68dc6a5cf2975c83d42c7934c66a3cf24b96556ab6411a9f9a45c1aa746aaadf467abb5251977612f8d4e296f4d15211395215632865efa9982f55615da589531a85b5ade7acd4342d7d04294236ab62fc52b695ea337015b8649a68564a7daf9a394d9ff20adea8e91f6e7adb577af39be23da7b155c3149dada3e8d4243c7d02294216ade2ec5396958ab3ac158a829a60565eedb6daf3a13ef34a2d025751302afb4c954de50a8d484daef4160af6175457e42c351635fa1925f17d575b9b7a57a6a47af46a2b507d8e02180556e5cf579b29d5fb4a33376057197fc55955638bea5534b0f5bcea639662841056085a6585eadecb91d36a58eee62a85aaaf518e44b7c432e8ab942dd5e15d2c2c873551a5dd6e86f2702c5bc84a15d5089bd1bf87accd9bf501af7c89c9ca83b4b267aada5a59505c6bf24ae7d8fda22ccca2c7ad7119f553a8d9e286eba34a51329d15a3b9b2adfa81d215ec3f9be5bac658cd10d2a59d89d63df07a27566645d29ae67a7da680f57b96557b75adaf37571a9d701fe2a92dc9bf3ea00004c21ddc58cb25c152ae7a94c1f5fcae4d73c2c6d5d47f416c8be3b08f3245cbce560c13cb3653fd06db02076313654aad8b5b3374ec97692ee8d26effb2ea2d8c110cfa7cc004bb75aabf1d6884f7847a571d614d3341d0edc6423fe77d9ea1e3af1699dc27745944239019d826b82da210491bdc25bb2da012480dec92dd16d1114b0d6d925c165188a40676895d97d08924063789dc5224b21d8fdafb6b81319bf6945147f9e9ee3e508e4b68243a8a68aea79cb683688b5724399b0209b506987ccb81c8d28c3230aeb191ed20ae49de92ac09a63f66b1e4ed0426dc0660726c0590d50e4062360292682f2099b603486b1720399b0209b506987ccb81c8b7039cb00d81e4b40548969d00c4da004cc2de0032db0624cd6e0042ae146ba9c6cae0ab86ed71d12e051076174041360391bf07a008db02c8b90ba8042b81885f00509cf541042f0328899d00846e002cc19e0022b70194c36e1012570016672100155f632cad06b9c39cbc7bafb36e11de836baab506707d57fba89617d817dd70f9519a49fc881f5370c8c9cb60635a2d058343bcec746c58f4d695c8c06f2f1c0e9ede1ad71dcc911421535fb19512d5f509eea406ff33d16b3f71329fd999b0f90e87e006873f1ac32abfc1346498d078c314ddc06ea8c023e16d20c2b5e1e785f134010875052b48c3a43b1028314583d12d036650191401df9101b9696c0c4c2cc43cc320490ac310693360d8497f8173ea0bf0e40ce38f17ae72176e4b173e652ea0162e04fd16fc58b3054885b5b006eb2fab59182c596095b14058b0d02b5fa1b25ce12b5be13256f8820fcf1422ace0900bd1789539196d81e05dde57004f8f70aff854e4c455681e30b3caa9791207e536631dc2788ed1ca6dc436c6485b6941e94b8b9a6a0ff6c6392d69ab953ae0eb0765378f16ead55d4aef5f95cae3568aabcf5addbe978baeeda954f5435c3e289f7bbea9a9ae5174fcba40f1d94aadda89f1e0737160c44241f539f3fb9b72cd450dd5aa2ed0eb47e5e37737f5d5b5aa765f4b45636b0ad5f72d5edf94eb2eef5454d5002d3e966f3dbda9ab2eabbb7f5daa1d5551ac3e646bf65d61e0d041b54297e9fbbbb279bb91f2ca59a8d5c7f2a1b73bb5ea7e15b72f4a75c32b05d5678c2edfcb5d97ee545595e1ae1f97cfbedaa85717a9dd7f29f58f5828a83e677e7f53aeb9a8a15ad505f5fb63017ae38072e500c4e583f2b9e79b9aea1a459bafa5aea12b45d5c776efefcbb55795a74dd1722aedfab8f2e5cf13ce7a95595a74aff409b32a7ae4f64f2e2e25f15bc56e697ebe382ba95f14eba5fc53c4b164fdaed82cfd4f26ae25f1eb6279a97ca2782db9df14fba5ec53c5b1a47fb95829c5cf2abe25f3fb6259e9d3af1c14dfbcc433b63422875ec4cb24f831ebe3225d7f61e3eaf5c09c6511d3674da02b49115aa42a69237982b51a088a9c587dd9f2d383617f454659e5887e782f5d85fc4b5f214023df0c3324453ea235914a1664ad689e8cd5e7185bc306ab134877ce1790c0997e8baa19e26b92ac1cf6228e5bcc1cf5f14868bc47e88eb95d4de510dbecc37b0b1af42eff45ec45a37be03596ea7bc6cfacaa04ea16c068a7aca83c5aaa2a3b9e680364d10077d8d7a9f5a64edfb1a8da64b53f196b1ee6aaebec3b015d4d5be318d415da07f598abef895a801394618ca62afc9f0527508957e00aa013d836bc4fb00f8d17b837b80a7975857a3df98050343c29cdcf432c631b4b8f673732119d454d1a718fcc0cc73a581054063f4bc2da81a6b58e148e92a5d8fe3ec75049aec26d7bd2ccbb6626f9d6e2a2a27219b69e6f622e9bd7ba8f3a8a31f5ac7d52a71bb3e5845691cad1926c369f9fd8ded8dbe93bf5ddde267db8324b910d80a4d8f2fe8979edb8d63fd4a94caeb76c939a5cce96325a098e44834dd48f91da2c97cbd5a5b2c58c01d5c913780cb991960a6b45d5eaeefc66edff9fcdff038c357838a97fcce570331b053744f3df739bc6b3b41201f0811ee8873ee8871ec2bfee5b7515d0c5e8a3c9055012e451b5e531ed144e7877de27eb0b8db386d6899d7fdc631a18ee1ba4e5815754bedcc98921a267f1ef603ac6d66e45e7b867bda04be1cfa2efb00ee0a32e40866073074bb3ffa8cfd9add5110d600eeb488d9b2da24002fcb56015b7db3d3c692c56cd11a595044e5463afd4000a077550b2a9d29b74b1ed2a6afb9caa45a11bcb702ef285d19b6b007fbad2fd528e57789daeef80c1559b83313219f3175abdc1c6b79643aa5710daecb81d655d3da59258f66a417914de852276907b61454ade3f45e141f1fb93470c3cb7dc343494a0f833a83bc81b7ebd40f4c0ac53b48597ec99004e54590789ac46e851831b39db113d7839b61e3a6cd30530bd7ff22924dd90b80f0dc30ea87cd8d3d17159c31ac290f96c5e190770a5bf9f2bdd6c803196d42419df854936a2d21d08e738e4c595733f1a4149fdb0f0ac5dc3fb4f47238f324d9a70ffadbcf90bb66ff8a13ce11a7d21ff610c75b118886dcabb5e663a1e9746810eeb210ce58cab18501d66084fc9677356824890a6c2c4fb3c2a95e0946d74db1fef59a26a0df2af9990c336771c7460cad2c95b8f588c26e69dc2dee45ae824419661916b1096b2871eb56962223e64c2b27968fee9411eda8268dfa3dd8a0028956c6a8087e8264977cb49959fde0567eea793e247ecdb2fad78e92f5095e64f88e4183cad21f6602ca1535c6790621e55f9936f933179e3afbe946e1ead87f10de822d2d6029845dcb317c007bc7d03f77bd19ccfe7246fc8b00685c2eb7ed492ad6d969165d7888f543d7ded2f5e13eb9ebe14886bca375c4f11b39d506e89c7f2532556a2b2a02a6253b2532a401f6878bd1d7eaa12e52e1ce6649c594d5a7b4681074955d2b4d434d085a64ef2642004d9278817e24fac31e9eb086df036ba79058ec122dc2c7e964ef0a4ac73f937a53e45b21197f5bff61759be84a46f24f98ffdcce77627c36a68f0f03990c091847154af1c59f2087115c8dae9959b0e4450704d2f46f074efd6b47dabcd0a07db2e3144b679c14f2ca3d6e4cf46a7f08ea81ab500b3a4d337c1574255907042b20a4615b1bf5e291afcf9c2944ca24a42fa974161b5d0a317ad630891836a21e407799ae86525419e5501529100a0347e3db5d4c6e671c2ce344aa756ca4851cbfc08517f327bd3812c5b4ba0fe1ba14f7e8cfd000b5340d5175e96e750145b6ab0795056f3a231cec3c75c7930c1ad8377b43a72397fbef46f24bec49a6ee823c6e9fcb6d720d4728269518cbd516b8ceb05d038f32bf6d4bfe99366717f6e9875d15e2827b273774173731832b5569acfa70348df8adcb28829ce67e298f5d29b465c6545d40964802246b6808e5ddf4cd4fb897edb531e5f0093c99fbd77f794feb53df57203dbf3a718ac60755bb01cd205e28def674e5711380f49c3e1c1db8b67efdec1505dcbb9e3a958e5bf24e3d580a03da4d1b4dd26a3cd9e8d85549f5226c38a6b2186972edaff0254195d068991f69f35ad952ab1f6de1344d07fd8fcc386b72845d61cfca0bb63584923d40bf1f613e3a4b8a86023058d4910a892262a98c345871083f413c5f7f4b1001d78fe41c71005c52e21b789e2731627bc93a4ae49e24be6a943523cc9645047d0ef53f483d7a64d841b315f7b8e103988cccf0eb4768ad98cd10554c06e405cce4c359f10e2d4ec487bfa4ac7ee121f07b39f4dbaa6b3854cbe539b49bc7cc6401ab796bb7606c5b0f135ef2ed84d8c00155663b7d20104df9c57c504caccc78ffb17431ded63ed803f7624f62a97df0f4e7a796b7dfc8591128517389ac5d454863c620a5bc166dc655848aeb4d015b712efcc19948bf8323139e5bce6a0c6e592f93a5cbe87fcbee130bb2dedde1b00aab2ad90b38c941efc04dbae0024dc2d5756223b554106c7504406e8af6729171c948def878ce3d22bbbf72a435d3b8a59382663981e1799191e77f08fec84fc465f612296cce565902bcc6f084728dc172631c0073329814ac60665a39e8d56ab65d7a0dd8fac0ebf6d7219f7152ef50cf199d87b21bc4acb1fdcf08ac7d136000b6c930b7592db9a0d6f01867e7f52d38e977cb68c0d5918781763b23ade9abf44909a83a23321003584678ea880b859157be5488fd71604dec58a050d6e1637241aee55f955b3260a2cd5e7441e9444a8e89470ff26638c3e19396eaf9e9e31161f4e34400c8c81b033b430eaf72ffa8903330cef49b931abcea4a3b7c5d84b11caa220108ce5a8b9f57920c7583742dc6b42cd256a572f04fdb06af21622b9f618492294b850103a08350dfb19aa545d77d0a8fba08e373da1d2f0791274967c25b3cd0092ba9a26a3e3f54151b4e930d41caf83e319928af5146dd56689e8d613e1d78aa5067bbdffea71b69e3f7b5b92f81f015ee02f8eee09be966e72ad6a304e51276c05f283739b2785d429538aea85e49c1bb8c8d12846cdcc26eda9c119cf41e658600c06401bdc63a18b21e14ecc8a4fbdaaa2a786ffd8bd4d6554c187a596d612fc325b02ffeeb946d3b95e1cb5c795509e17da6368263e803eede17804c415ff01dec9ca4d3e52077ed0bddd5cb93ca618f5ee8841fcdbdd5f4e81dd7043e29328b5cad28f538d93fdb2b63051d58471a5187bf494de4e7a22df08423cff4c43e3aea9da65f68b9e81d4fdac0f534caee6a5cceefab4534a35529b9bb3f059a70b2d681405f56f8ae152bcb45dbb1e66500c0832273cdf2ebe0a596db7ab9225d665e4860eb69a1f385ae00248658a497dcf54f995ff66666c5a2ab22a23a06e3b831cf6c4c13266194c7df38f85f14fd4eb82740f6ec43033d96eaa1b97b710b1c10a5397aeba35d2ad0bd8933c3557aaa41a8db15bd761ec853a952e48c57e980d641b5bebe46ba2d67e3bfb3a35de829e287fffa01896e2a5edfaeb6223c541d033e1a0ede25ec8d2761c9a2c62b5451f0e3ec5994154140ab9f252d088c29ba4e75c72def7e805c79f2c2f98351380bc6ec5021894ebeea4434863bd6d18d0fcb6690e2d99f85e02eb0c988aedc647bd97d9e9f2803306a6236969aef71bab1a6368ddc3b117da544a908afb613790ad6cad928f8b5afbedcaebd4780b7aa2fcfd8362588a97b6ebaf8b8d140741cf8483b68b7b214bdb7168b2887557dc30c156e54797165c10aa9862aade19557ef1df8c194b830a566509e8dbce80c39e7170c66c05536efecf30fe88f7ba00dda31b71cc0cd54d8dedf21622365831546caa9b239d2b484fd2d25caf92d0e858f2d194bd97064a0ac819f89808e439b40e1ef8b3c13467204bf8dd03b2b5280045efb74631443ba9071bc097318120eec1c7328af6cc17490463fde54cac9e4f0fe04a146c093f0bf46db85451be3799147d7215917f9cf33a3d41a0edaaf105323bbdbd230366ec1b60c2cd1f1b260c1ab45fe94ec60d0f260f90ec950ef288ccba36f747fce4968147f09704c19258428fa089d7f0ef3fdd7ac4cf7ee45991880f582080983cf6f65275c17cef6a359dfe4c1f80a415280c22ab8a328922fad6fd10bd63a43ef3846ff6afddc3268d9d7966eb0844110f864a12d159b0dcbe741ccee90d0505aeca1c37e68e12a6610e040f1d43f0b48f91ecc08ba4e86abd95bfbac33456039597e9faf2684e42f2c1a7f45c117e1c4ff127cf6c401774912bee4376d580d8c8b16b8065efb033ca47606f2f1798734efb9cd390f5cfdb914136d268840321268bc739ea22fd66c8c776dc4ba20a21d88b7a2ab40b47ba910a50215b3e91f3eaa3444244268a9bc99c4c1e830c34f8d51c3c1e1942032ccae5071f4a177fce20f85ee6066b7ddfbab0f2e070be17c7f441bd195e5f80474926df4bc2344d11c8311e038dad7adfb597e9def7fa27245b5287469b6f385d9bf469b41813341cd5d81d44a8d7a3ad0206a05071788496276d68822c0d4035228698046f5f5573e7aa24405b68c32cd67799068ea6e63ba1d3fb2140cf20201a88340c53ef5e3d9bb8d28dcbb72a4554c75668667229285ea9dcf41196be8c8ebf5862abc14b75190116c8502b0e66f0f8cd0d9650e1774224d5192057ade788d4f986851819f4f1b1c6139226be2e4d208aeae61c4bcc66ccef608c90ca48718aceb3b564599228d6159d6971442f87b6fc166b6ab65bee228bd53c475a85c662fbc8c58d36bc3a0cb041e0a2e9417430f36f6a603d5b0d633b68a2b3a4ab4fcbb2ac2eb825ed543ffb880d5908098de9c95c3dd00723bd133a4f672e57a46e5936e44894cd6618f8406805a4fe97ffebbf9a0d883328085c0043e8d0f4f2ead7c88d3920fa92fa8a86b01c12976c5f81473cc89fb078c9c86662dcbb92e1b4102462ae6bfff007b8dcaeba7c913b12ccb87ef4ce1b1b319634aa07d684c197afdfb0d74f4f7014c932bcf37ed2b2759c8e64f30fac917999cd9115028ccb554ab42597ed623912989835737af39c822a502911610b5845e41667e2c0bcdbde99b28a5f35080d3776169111396d0e5d04db79db46a361bf6a63e494dc16cdf4f09658d0302abf8e3a4f4c0ae41126b4cee7aa5e69fbada491935c93299bac9d16e6394ed64b5b8b5da6f124d75d2805e06a16b210b433a671928961feee99de92392d39c11d528068af5d4f61127e6691c989f42548135fb4183d4081d4e4396d344e5d7a34f883078ce2acb4d1fedad8fb5ea3e214334411b7d21e73788f0e6a34cdaf726a746c933cee0bcf62fa834805a6ea05584189a2afabe5571ed84ff0a358143028fa60fe3e0dae46046ec819360729d605f0dae42a6ae0aa4c12c73f6bf46c3ddd80cd2d8bf3abab0f819c3e2948f96c1b36a2d27a67e8aa7d95cf1b592a96f3843bd25a9d1e9367959e0b8a5baa64a0e72931b32c01c0c1ee7c5a1e414b0d5b39448268a332fc7d39cb0500b4b83a993efa34fabbb7f721bef588cbd1ba5dc17825bcf1f9088a955f40c6f1a2329996caf2b59754524574394ba273377b6148a42afca2da633b65bebed91b1a9e7302849c13f1a8dd4c684353ec9d19011b368956ef222e15985add2bd4f7bb97d6f6cf083791966896a379b36a0057c50055667a28b6f77d4ca9180f53ac917df68bdf3b613b9c7b2ef258c0993714dcbf615e241bdf8f37dc736173e84d9914851afec12ca75f910cf89e76c0b26d2f2f57acd8586f6f2a1543f6ce609195967920067286587c52201fe1bb706503b0b127eefd005e8dd23de7678cfd47e86d3cc0f4b6a9a8ff4b9f3d673b415b174b6fe8511eb320e42daa857435d66e37c91e0b5ff3a978a7f84ce892cf22f38c1c630d953bf5bcb617bf0c252ce920a177b2cf6a97162208b12474b40098b4498cf5434d3f5cb3e8b9be7b219e3a5b58c95aed44dd95eea6a2c51cae84de318746724bf45bc1b4200fac756b91ff578d07232f36febaa9f5003196b029040606cc36dcc277c3f4c38677c917d03815aee04a07981546b53dffc91652cd2ce6e20987fe6c6c07540bfd71c83d9501cf157720dc7305b398bfba24a3e928b8d50fb4075a5bf7e6e30bf666b1135cfbc610c80d769e33017dc6e72b44a221583dd370d0d6ae50f61189e1f61fbf7e708387a8e7dbd1d1b053f9dbfa98c6a9990f312f67a74583b2345e37c9db8188130d9f95a92f865ba4ec0372e2c17e0f6818bc7202b6a31fcdea54338be6e967003b481eb7e3f49013304d491df560e50446b6aaff952e489e0fc8385f1c9036d08318110a95de813b244aec1c2612bb4e92a159251671a2ca734077ba932dc4a93cf78df3b85e05258860d11bafb88697c2c1252d9d1f3500697ca8bf43da93e4ab3d93d4c28a8e485b79756869c486248aaefc30777a61b200a971d3c0d7549fa5f1bce15188dbcbd432b7ed9a04776f35ecdff6aaf6a8f6be654d6a25a11544dd8f17015267d011e5a2fd0ac2a8499b08d7af623ee486b208413acdb7ee0795780914a14940592198161b0f9d9e69c6604a404f80adad0c302af205944b4b0b266b7ad41d2d251a3663c3c3daeef6f2fb5b4ddd898f9c27cf90a673a55080f28bfe3947e3b3793de241b99ba679a082a381e6b207f8adb4441512246509d1f63184e74753d39369943ec7482cc78cd56c12fbfd94fcd0920182a9b0a180f0529e9299f4c42fe34db3560673566db6c5a1beff3f4c58edabfa34696f68258ee9eeba59b6ec371259d53f505c82497d7093e018132fc328d897b6d0b059863008a1a86e27b4e7b205074678e3c743c95d335caaa68bb88bb5c5eff454d1075c4d9cf61c08d3df13761a8658f625adf878d4d74911e9595db73f4c5dcea775434b1cc34eae7cdbca3c1133c385819985c67b360437718c0f1bbf060fa00b4babd2919353623e9205cd6c8081b70e6744e96327dc05aecd620f65f450ab64212765f0327fef13563e5dde02884efb1ea33d7b3af3f5a9cdfa67b17fa0d9d9392421d867d9775aa304a19b098ea7359ba081b4aca239415eec9c776210579c392d212f7ba970f412273307a628440f217c7654ce65bac904fc7615b184b0551eb7f94a7d9c5d101d365c7f9d2611523fb19bc1aaf413bbd10034d10f10c26da295a2795216ac34864faeb7aeac6d4eea89bf6b7160ec3c97418eb474f542fb67d05dfee5747dad27b6229a3da4b7511649778c56975f960c343d616dc43a471d41b477a360563a2813a06956900e256df6457da73d406bc0a490e4c1ab7f0c662d2d483e9bc459126ab42975c7c275c6aca3b209bb81501035d2dcd23434aa1471529d24e516f3d84d83ef3f9555fe342594fc2d552a4676713fbb026b4c7c1bdd0c512c4c95156f926c943093e77f1eb15f1b14c63c804e9589c148ec5adf64bcb6c896c68853494bbac2f0690cc8d58ac8490f63f330c49c3133f9650b2ac3f57e9521323fb8c4330bb370426ca57e4cc8ae3e73ae56d3116c40ed958e82ee86a48bac6c6db1d4846f42e949dddd4d2d249c9af2f62b13973723e0fc05aad211fb3918fa62a1920c2ecd217e7ac2e83d9158766d71203b533911839dca9f4c1fbd267e6232264a9a76fb5cea90c64d1877c5bc122d93ba24febb558ae53e4c8042d313a09c407124e7710222dbc8de464269d1ddc8590cefaa536e17a2cc89ba46fc4547154c5cdc5adb2a8fa909e4d21b6179f731bd996ed2355aa215731237031f89d5fde9fdb75107671c4e2bebdb697a2b5fc5b4e8eb7766ea931b3bb1b9534e2f4a3441eeb810fd4ad0e8713416824002a721e0e91870c3f66a0f609a88cddd5eca36eb6e0f49c9e782299b2ff105a792457d825e756a567572d95bee120df01bf3998fa4732565474497d37da7ff20faba0414c71c68619d2b55a267ac1c31ac3332c7c9543fac332e03c56f6056e6340967eccd2710cd5d8a2df718fa5cae6f22b31a3b28bbf95081773c6760eacaeda7819071144e6d144350437dd2fb8ccdaf7e87ac52a0928dd12ec1f4f9a6d31ce860e2bb40cd4367316131a89cd3066558de38a9767b2d5de26a3b00e5995fa477029d2ece03555afa310f155ecd96d37297ec45c0a04924329d899da0ef77b9a8bcd4f6279e2c8b8fc2fe0edf6b8984417d68c63753c9eb2cc688c53b5e31669be9b59800a5a85e10ceba371c32eb60148b365a2d0bf0457d9b3dbd48104e0d7b4e16aa184014a72089d0e97fd52373b113419cddd9550fe79f201ccf694887e421e01308c2194312af00057a2fa97104e10c70aa3a6971f9c64858409fc384eae67786827024b294350bc6fcfc7d01b947efe67c90fb027490933d2348a2f43753d087360da11c60113d5e8c1d022a5a9a97e205d0fc01b3297a4db099f0e2fd9bff3441d513ae09d5969c6b95155afc66cb29888c791abd61d619129e0b310b98e426fc03f620a01f23d12a1794ef971cdf3b846fd7cf331603e3c63d8bce70168150beb050f8d3be787dbb4d199f8678e5955fcdf3601eadf3a665ac8d0c074b44789ba6594814152224a40e61273a6b11ff637530d1eeac14cf0e7433c5e498c3c3d3303982a1904629295fc1507ecd98588ffe3906f70f91b7a5cad82d626c25bb5b1dd19abebd233054d60c61b7fc06b68e0f557a400a0b527825a6810730d1826803cf0db60f8a9aa6da81650ad450f81756cdf5d91a72b516581bfbbc405e560aba234042940086dad86ae4eb761eec92648160507483670fe4c2e0d83c19e808278a256c40ff36b213873ad624b90ea50cdbbd0e685d45f73b46bc5e0fea09460cd968fa9af54fb8a50d7485d997f066d0ca9b2cc279ae82ea43fdbfb663d87e2ef9c1558cc7f4cb2381a12daed2188f7420bda999189ff8152a35d2f3510f8d1014c4545b580f3b9cae1c972887924bc4422b52e6c51aeb07b7418ab0b661e283a06f2ff5b8a4b2b940de1923da828ecc208dd11c19852e891192190c450b11f6d91b26f04bb17d790c21450dd897422f023499557afda39405efc105872ebd4165603501feef9566974ede2745955f26c521260275d3c1f422391a920ba8da4130ed7da28299ca7ebade7276580f823bf22340888a6bfc04d8979af14a0c51f3dd96f4f8fc1cd23708ecbf71daade172bcd9daec2b0aa31aa68ca2e0d7a917785eafd8001d29b2986263d6d516a53cd8aee0ae66ae9085791ce5ecfb1980dbacd39f3779c0640c1d145d4034cbcf254a21ed0748fc6b6d8695edc133a896284b012cce322893824e7e1a2010c5a4af07520705b815e960051fca47e826a8914763203e742e955ac61ed5137b6095879ae70286a13296131ff1c81fbee8edb00b087ad8a743252bf68f89fe8bd5c870967910ce156e234360340ab154bff3ad7cdb6f080963376dce23ce15586e697adc05958b9ad30b1cc5cf99505a413b5455425946aeb008093d6984ff84561fa9d2d63291116f56f8bb83e22d8caee12b7251d0c52eb2196f8e91c57824d26c89a9e3ae21d9b9b4f1919432d7d4ba0be5cf462540951be0a1bc2af3a8b972ed248a9085b080011c414c119133a0a3b5a86c09a95d24be7c71cfc886b2b63400eb31377c09b050212885fa87af77d022546dca82682b0d5ec2d96182e0e4e2c9bf36a03f412d2fb1e5a4d68f6097239b259c603b51e58b4daaddf28684878b9fbaa5002d4eeb1e1a9fb1c9b4078abc6534481d96fef615c1a0329aeb2c303ffc7b45fbf445e9fff84b709ee2febdd2571965f81003d581332f9c6042a87b08d8bb31b597ddc05fa5eac591e468635af5c4ff372114dc015facce69a82f650b8a8efcd7c70520637f36b933245cf67e5c334ce6a95a3980ece9ea50431e59c360baf9a8ff72f7350cdea03f65b4b70cc0bd011908953c2dce753f2de99a0f898ee0327f4e653c89a0223c635093cb55131af5bc74bc6c8cbf59670b8eefa1d5751ab886d4133aa2e26b361a81eb1e4480b3048ec23c3206c38aa63d8f65eec65736ba67aa1d8919be7ec96784aee324efdc77ef02df180263000432873aaf4975a0f7dd6e40008f4da0e9625f51ac7d2d5892b99540b3113b0d4bddd2a8090c705acdd71db45e813525018b5cb1ba4ea084ea1c4ae9c2a6e6c5c6255ce73a45804f48ce0080597c6bf8eeb22ee8fd3dc5c91353067bcc208f9bc65d6de1229370cb4fa4017fdd3e55973190965d376ec76074774f9fc74833d63ecd299b582018279e6d8f7861248d21fd5ff80f1ca09b710926dc6099cfbfa5de48acacddee32cb7812a024d40e76415f139ac6aab9257974a0f2e2e6860ee2742f3535440768e448efc4f30a98e5c45c453b47b3c46b5629bfc8873e75f17536601394b26f50004d052bb5423719fa77a230c02c21208f5a9a0540160f7f4da3816b3762d6925ddb086eaafd92b6cba96630674854eed50ce16d860d8a64ce7c121b721ba05e2ba4a7e71fc54cfb4b690aa61502499b3262a817ffb4ad3390d7dfa21d09c86eb7192a2a8e8f0022b4aeb478b3a70140746439b2b0c88b26d83894e636d095b52a8d8339f1728c24dad8e09330472f58b3f7f24216edafe175a49ef1f06dd6025adc2e5abc51f5d1f3208172aa59d4fb19204e73ec1f0f8497967bbaaee5aef40179899ef9e975fb7d9458fa9e99eba4cb15e4b4f242af42d269e5ea45efbed8980396b3266724f5f4c0cb94aec739c3c712fdfc1967352713fdf521e1437f3b917e5451f0da9e151015a70b7b6b761c35d06aac28d082786f7887027141466da70dd0c752c68f9f4b0a774f53964001e9fc6600cf94aa27aca3c4a6be3899005154b1a58488d63ce4221ce0f2eb09446e62a6ff3413c0d527922cc6044d81f1dc9b3b81e9fbba3931f743cd7f21f75a63b8bea660a200041e664268848feb77251b1f207fd5051a59c29fc2efbf920d1a01658b9c3c760a2d6e7f21a3efb6be6661b859e40bc5a403facf803c15a764a510dc541af442fdd9a0fb6497ba6b4212f3df53e12e45397ed9c2c153c52c26819b329d3c056b916857100a5cf2fdb20be32e7d802fc128a7c32db6a78cf176ad7713c9cb94fa845ebd834b5ac9849e309a0dc33df6b9f67849d230c2db4e8566c39285350a93aeeb4367159c93fe0c17edca16de4d821e2444207f0b920e1ba2a20d91cae143cfada7dca85384acc9a9dab797a31947aed023af8f286f8a5cf791259b52bd6d428203eb77083d417f2449c546c84017128a56da0b7a98997df61a65d0b75f5af3f3169cf602108b80af9c9e647acde14e5155cce83df13b7ab7b3653920de060f47414afcf91d5e7522f9fc7d7e59e3e821f8d0978c88281503c3c974ab9d812b7b328d1469c86a5631a6ead6fd5ec0dc10df366ad8206cd2eec5f615f345e1c17a82dcf3c047d06ed4449e5f9f5bead32ca621050954b5560acca63a5226663191a228d3d2806e11dc37d86aaac713ea3fd3caee64b8530b0df94babcd8171a3ad4f3c4acb8773782bb691734ce3fec0d029d46d1993e3f6b27d3e66820741126201ef9e1a07f1972b56b7566a8d9080a747e9d676d21a3174cf6790575c571a0f939a0891be41c6a213d18df1756c4abcad20ad936ece13ba798a1a08c581156fa2624249d81c99ad438739797c951a62211e7ecd16e28dbe7ab87de6deaafe91bb821b11b0224b436ba09011623a7e6f8b5e027b5f0506d5a4d98512cb3189ad2432082beec90eddf2a56df3025edce48ebed20fa5d701977a30d84e1eeb1e594306179f505428ba7f7d07a3cdd9bef5b617941026c6f5091ca93852bfafbc1049b9dcd1335cf1d4770b5e28ade83a43206322659fd1c4594a5bc3d29e9e1efcca0c5b2551edabe85601df012568b1d77b27393b20320b60e556ab8e1b3a97621a6e0b96950ccbb40f45c9a1ea1e12e727980dad9c49eb7fd8ced16789ba208519afe94d5d1b4d9f7405a648af9bbdd1d2c2e786508d2332d63779abe74375a9371be917fb436074bad94143441fb6ca5b21480d71dae9b67bdbb44f0be28c433f445f526be184e340fc05b5a805542db307cdec112a04f889a468780509426da97bc233526c782f08eade28b6e5f236bd663f9298e03b7de2c1502a238f0dcdc8f449c4ce8f90b495a72942d5be3789b44e47f8374639793f173e64a5146c30a65a3d7a26d5994b03fd41d93cd6ef28a28acdc8230063d73d402531a00c8e79fe29ac829697a88c7899d8b28b8f06fa48e7c1b704496c989b80909d50016b26337f5221e6689caf57c71758e8a686173f76210bd2c3ad4801547ccb55069a5a79c0a47de11579cefceafd4b21f6e206689f1f66228fb4765cdf982e6123d5e7fceac74d61d7b718b9c7877cc63af6987850ce2ace74cfc4d294380b29f62f6a12481a67e375f8e6662066fc3f9640f43287eec5f048edc2f5f76f3e8f30cb324bd37d8899dc17d9a904658e569caafb93e9b10d7bca942412198f3d49631ddcaf6a0809c0e764e76749173c09729449958b141205eb7879cdcf21f6994777276b655f3939eb2aeb88586192dda8908e4ce85239c0612b036b111fc80cf041a781a60f288ee852758fff417813098afd5c30534f4be78f798ea3064c00082b6e9482bb81a139fa5998f0a56aa8d143fe8658c8fa048065f55f32866585407450c953c8a17d8dc904a81b3a04cc59e1bda0ad545d0de57238c42da360a88388d58f2a5b918cad77627d2759215d867f34db132234785154a78f598f276c48e847ad495cc3dd119bb288179beb4978a504c21f7d473f22bafc9c74d14d3f2df4144742cfea3292159e243be89f4657f1599cbe5c5acb0cb3a47dbce7b6bd727f564d4b1bfd0001c21f67b0986d9b1db97bf986ce5a9eaa4796998edf01da05d97acab5f8abd3a43bbb6d3719800972ec0e33d8140bbc506678de3ce9b7e635f361a8475a6cd6ffe485687433120ea303132ff1eca3df1b0717b11c1ec25db257a257e3292854b05995056806542e0b4204c770f16d2427748b1c09a10d6ba50d1db940d7db2ed74df782277993a65c5e5b3b25586592350f4d88303e5b5c031620b1cc4bf68c3376f60cd77c2c1c8242191fd009aacc886b5b46ecb66913f048ca52c24f9fbbce02509e0a7fb56f694d9f9e3edda31fede9136dbffe8e7afc52152906d480b88d2936775539eb7c10b9ee5ee6423b6e5de8d10d26fbe823dc3e43127b3248aa5331fd96404e5b95bc407147e1babd7e816c98a6a12abfd617d4b10b650897295d22d227839d574e3cc226c74263943e88e054c12c9b4eeb58ebfddf42c2b689df3c39902963b49d3983c6fa0325455714b09713a6bd6a54dd7f8804f3c95b45e297ae393ab9788209b73375fbbd25b8e680f240f628d75ceff0673c243d35f01360129c429a0215897699f41e6634247ec55a4a34df0e55627af157b46a7dfc8ff268e8a80940397b6cb4ded7a2399071d4391171df30d73cd4fbac7b4a697217c5ad8b5ed469b10083afdefc6e165ba18b4228502c94f42ddd0ce14354ef73ed51ab4a05059c1a887f69e4b93740574cd496be0c84b56d7c98df86010a02d1a9efcd5f6eb24393ee44398f872d39457c23c45719d80d9e57884eac358895e87cc13ab5ceb43aaec5a95291630cf7708bc24e911d35f38728e8ea9ed744cf22a891afb17bb4f9312fefabebe157cc4003017a0203930e3742dc8bf741a19849ab32ca568c995ca9b5d7234e4cf41c9db59d059c8d04196d261854d597547a7d9614259f3bc03a5eb837f4ad73bbddd76f07232a0d2a3c41f720af5e92ba739f134a1c473b2dc1f99bcb46eb6515247fdf88085c01a902329830968c5c0f74e46ba8968fb00c17430f4f2ed25dde5283c8934c77037451874e97b7870800c1a748ce7e0f5eb04c24df3466ed9f57013476480abf44ec2014efc92c044a28aa03e85cd246e36a9cc013710835c64803cf4a3859056b31856865b453a4805a2c5ce0441d151e72c71b6458be5918fcfee47219f6305e401f6ea4ab5ad0b7465d7a6a5c1c12190428cddf8313d5926f35e670250a31c31b8f552ec2167d0366912bff6ba2b3d990ecbba633b1b94b37bbd90b68eb942a606ceefd55a851dfb7bb9712a87d4d9490895a03efc9f44e6a60f51bab9968723e3889cc84a21cef4fe991eafd6507674ffb7d0693b91589b2f4317ccd7149b6f3ffa2f125d97c901fca44f9d292106811f7a5d7041294facacd4aa27ac69052d12a5fcbc63d87f4f136e931217ba95d6b1f4fe24d5545b4bd73d40bdb0494758453a636e72b5bfaab277356445e0e76d344a2e2ebd2362602ea2f4f9c05a761bdb8f5eef7681bb3962550df57154158fde5e3431aa684d90b84681f05e9a5f14e04dfe251d4669f0fcc7ecda48d6402d2210413a3439d8c50b021bd8750011b4704ad2779f52813ace7db244854d5277bb973391f9df0b3804dfb3555834b88adff4120d603e321a084a22b20d114b4330e0f78c488f1113e34c11a26bfcf6e672a27a4f1d6eae6c1b44fef4f911a1c3088787fc30ceffe2cd3a858325777e6a865e73bb04872463fd4acfa7d32138567a599e82fcf2236d0f347a71e1fd38fa0e63213fcb8057d60626fe53ea5560ce8bcd536755a85929f74c62908493f9083f73c6cddc0544f88338bf905268004f49598fd7c93448d7815e6c6317e84932179ca2f9d670502de1962182716584166f201610c3dad3022bd5e0fcd01652ce417f2282180e3b911514046ed88ff14a8ed9828eb2e44e74813200942b5021c32884558018a5093cf0e619d331497e99ceb8879193848c237efb476f17399770b29ea0a1feea277d24731565fe577847f2ee17d3d90a85cfb0aea08f891387d7fcbb7b87439d883fe6d5f1f8008c0331754920fed2f20162adfb62b5685441188d9fae3ee4bbd311db79e877ffdcb1f930bb2a83b52312526494600293d0ce5e9c5b0969be054ea26bde2bfc6a5e67cdec8692ebb1ac3c31571b2caa43a2820c9eae23686c67b967d55f217210e4157d7528823ecb844c2bd7948b542e26fc9d18d1264fa84560df94422222e73f90955129858fb7cb0e9becb532485f10c3704c8ee8e6ea70dad64a16a1e26daadce2b650cacc1354783be6c0d8c4026b7ff599827dda156fc598df285eff04541ffc8f8bef8992346473f51843162e3256c544fe1f4d090a5cc59ac8e97c9bbff557fd982a6c065356f2c47b59441b6cb614fcce48531be107f71b3caa1b8509efa954e7ee01572c968ab05fccd854d08e697713665277e3a8d9e19b7c78398692730059ca166d730432bdf0d4494896c2974756ee8c5d11071a28ccf0ee8cb56553e02359f9f54aa5d9cb8bf2989bc41753a4ab64856bbfd4b3ef4c5f4818a416fe718da6ef9f865fbcd1299fe51f60121d8947d4bac8f1bfe466d98751166a2fe83c82583ba6d34aa40a20a2a60bd85768d0a77216a70fdfb15b843ade9d08bb9a7a3ad7585191199a87e01e47683d2b40bad0d783d6448818dee07471f9396458291d419c95a674bedc78ca2e3e90bbb517ded6e12f97d8db424fb186771254f2e0fa4c2df31811741268422562e4890ae743d92c18add60d12790a54dd5abeb33f15e99a0fe400d14ca666a209f4e03437e4ae18d9c5933e1e13c169ed29be5efbf3f36f09021b37fc49c899f65069f9330db010e0c52b5073d553bb729b43e5b90b5b1a31b833a2f6cb266a0bcd8d580bcc7b7e21ef3c5d3d2894832b1a72f133478cf14373c4fd920b052f679056ac8006216f1ecde0d5965442c0a388d03a5a9c03ab8e3591456e209bba899bd76209b78619ab568d384e8c158b6ebb1d759111353aad86873529de484d54b491d4c3642bede4a08c35d25be1eff1bc66a9c045c6bed5ba3beeae753618f8d06ce16a4f1fdf3e7cf33c9bb255bb433ee2b87eb95788ad8ef0297cfc2f058825a2f9b6e559469d891d21d2834bf49e1de9950b04b5f681c40c619097a62ffb39077c42a71159072bfb282a106401dc78f5d74133922d832218b3b8f6458017fa0806037d524837ea402f25e8edccf7b86d89bbd4a4c320f6158b0bb62aa5956895116546dcf147f65d399cd6d6bc4d77f672329de42dc78934a10ad46b2963620a863fa07c689d9aa6ed3ef51da6f12ed9c9e5aee732b7b2910b30972bb99e89be4debfbdbdee0dd5dc86636758a7967c3eb469aaebd0dc27efdd1f7b092b6f319d48f50a823c47113b54f6af7ae583e34b71116174d094ff4765e3530c76806edd01d51afb194f9c87a76fdbc953f00b260f8a7270bacc4f839df29fe40621a77bcb66a2c2a862e70ecf81716f5b445f16c8f1b491b9c5f39b2430bb79145353abab882aedc44db4a407a76e847272c5f2b5c59bb8c3f321f037fb8f37cb948c66a0b3648fbf419b68393c5de9047308fe3b247101d0a1b24e4573f68ae0b8245a8eb7a039fab2d0b5aaa7d837a817a5dd5fdc52c2aa7e8f80adece182a91c6dcf39ff961e8208c1b4f8e3ace387bb5cd1c951f8c0c502f16f59c3305afe616b3f8eeb6d2f98b1ba793e6682213bec5362b743e9d5ee3ccedc94b29f808345a3c289098fae14b1d96de5c63c53c7fe89b9de6b4a644ce47c46acccf528569bcb6152cb7714113c4fc75c54b1e69a166fa6977d17f8a52ea2493c6ebfcec227badfd18539baaa08428ac8c325fca44ec1438cf21d5818b08645677c23f4c0464de953579e3e3d8ea33f6f81608c3c254568d16d00c7d8d011438d998b8985c80dc620aad292db831481c785dd4b7d848f87e300d7ddfa7fb48da53ab8d58e6ba963af21ae234fada3aaa0d8a5a38a4aa248675ec7ff2a8b7a34d04f1fa0e5d8ca0c98d21ba181770946e0cfd2362a01d54c86383cc1b8ebd859e5a98cf5246758a506ab0d3015d8126c214f11b1518318b012ec8bbb612f294febc9608ce3142e8effd1bd0c56701bab8e645e8a9c25493880c0c58ca446363793d22da6f182921f30b5e36a3afce46d993588888bfbc2dfad02e35569b8ef9bde5512aa56be4c675453eb7d7fcdd48296a644f3f61924a6a57d3f244ecbc897cfb69990d789ef33b5fd2bc37c3e845e4ab71cac50cc31fe4b3220b3839a97224229f32b895debf8960f9fc477a7c950efb3b1437749aaa97164298aaa799af122c6b752f28ec9b3a0ba6906004964440e1c0b0cfb7d66c14fb89f31efa6c7f55104258c350e9629b8482ae1deb504954981b40eb9eab434b0e0ae5a1a44f01156416dd4beb1a389698d71d0a731f300ec3082dccc54f0f8791883c6e04d8e9a477ebc0b8d1c51f53a4ad3ec938e5fae63e6c0584607230595558a33570136ef90adc34f228c496881606707277f12db311c91b92a1720b36245d1460409b2df05db1b4602a093c6ba053c2ea9ccb5a33845a401aba992f80c393ff32e2270883a0d2dd64cba1ee8d286c9cec5aa05682c442458b06fb913995e890db29b62a9d7f0b170b7acdda45e3faa230dd7e4fd24c4c479a17e485727b2ffff229a3357abcdea6afa7ccd5e5d66f5d53677614deebbee916a7e38516af2b159bd835aaeeb5c08992fbf7abafc880731483d990d943e170e07fbff961534f7745c16bd6b0f08d65d65740b161418a4dd3c79cc0606fd262fd3f4dcc33de0d3953654a122a0bee905f6cc4e23b1558feb9c99acfeda70f946b246d373f5e1d08bdf2dbad6c353512517d10c10dbb5d410282a1e928e6e822dd56a5d2e9e7f02cd43d278b70f3e675dff410127cb32be9017f7ffb7c6e21430c6426566cb199622a487f2e24c394e7fa58d0b0c7ef5f73a7ece2dd491fb854d2f1351a9f6f4677c85b2903dd4dc8993b271f15e1ca982e20b38d551009138908be8fa00522ee6e9202e9d3a7601cd4961267fea6f749f62787e34307cde1ee744fac2b890aaffcdac0953e80880d13be1279ca6e1d0c28793408963ac963545bed33f84f727b8bd4829d2ecbaeeb970fd7970068d4269e5291d94687ab83812ec41f760d4c4c19d9c81dfc812f41aa682d129cb040e18e8a8cda79efb88c0901b59149068a16e77eb01bcf2c069c7196be1fa515648518b01e3c4490b8b45363dd240a404beb8508dcc73c0c4838925029eaa89cba9b258a49ff5418f7bab02c0089ebf358f7f6abad7ec46ddd2269a4ef6b6247a99ce315032a7114801ba4cb8b3d6bf0487592d11e3892bedbf5942e9c24af945cf72a5483f64eeabe7b0c26ec105e8dd2aea8af0b641da21453382b259d6ac62650d8359b2040df593a603e20e149c1941f0214710e42a49ea81e1664f035444b7a735e8a30de7221bda473c369cfc96ef04542317d86e59ddb24563200e6d44e9f0d13e82a22b4d664c499304c4ffebb37b5eb0069f26f57fa21acb11302d22cd8d1da43d95415f3653e394f4eb0f0e1df7194b9a06aa358c6f50f1f6c50867d80d2db9f59f36249981eb9db2d0b0ec02947eb29132b2def698e04db60c6c925e4c29d25068d304a549cb799026a1c29a18aec4f6e5a0ad1463df28998e21e1073f157c7485577b3fdfb38687fe5dfb04d0487021787682fca00c9ff8a83096595fa0f52b589f3947b0655ba1c3eed3e09bca93a5cd64f9f0da9ce675469c315208e99136e711b41c13a8a27482da02e31a7695f3f823ed37dac0ac2ceff782ab0fdd4174482b1c28ee05049340eb57815176a7bad3a31d1e86d7ea6b541cbec904dfaac9aa5aea667681969a5b6aaecffaeeaa9cb77e5eb750fd9ea00ea84057dd6202ea739c70f443f1848f49d24fa2fa94ca2a491e2de924af0c5f2adf191b453a44be72a7c78f7039f9e92b569512d8a573ae2adea3d74bd118c890a2b5c8bb9b8868eb66e7abeb10ff105adfb95e35ddffbdab2d0c88b99fe4152602ad4259ed66debea818a0e3e3188c9554a067832144384ece17a0a14e038650f0a7885e319ab0e060d41ccee0e62f4223b2a2ff54455b29485a8dd9482213673be998e2ee82c58881033e861b9a9500e9441f175570bfb85d9d07ee866f9c450dd9ec46cf8668affa71e1f8e19e96d9131576549e38b44c1fd7b10ae0d04f0fd0bf5588839e4c34329ec7cbcc7ca07ccd8d894c072309028f664d0dfb68d150d21bfdfacbb8205a5abb541f1d3da3fb7f7d5e7fe9220ea62bbcd9b0a28b5fa09298c409607a8fc1081f850e0d174ddb0bd87340f5ebd3efc6202141b7c5809ae608eab76b5703b4739c7593d0a69f4134f261c9cce90c2e3232c30a28c785098544ddb28b0a8228f2afa51ceb345081300c78f17ccdbeb6980656502dac60c3630ab992438b7f17a33a93fa542e3e4570f1350ccc4e811ba5351e2264452010a08730095d65cc1be5017f8b4b93ca69fcb39394e538cb53eb522169aa9f6399365725c17085139d838e42dca564a9fd062991c870be1f11526d70d022c42aef12703844663025237d8ad777a7fdb7d00bd732e57bbf24bcbe9eb2694d76b9ec0a3f7d8215709bffad4f740b392049e9ffe8e7ea06f9be8ae2d4927c97013d326f18751520b9fee91366c4f3890f072c3e58834cec1936a9f2b3745d0ccfb9f28380ff3ebb84611c31ea389d69241c4302d985a93cd57f74bd8d668d39661f49cbb04377a6d4a464ecfb0450a4815c04e460905fdecdaf09aa9d1f5b0c56ec4f2f850d9735e4387bc8666665c89ee3fec5795cd549ca97abb7efd1f0a7fb9b490907fe23de8dc0b7764625bd552251c684a6572101abb1f6d29b1a986e148e12ef4b2f0931a7080b75280dbc5ad25809aa40a022d0e4c869cbeee819b05043c197caaa798d88db0b8f72469ac1c112807976ec4f20aaceaf496d34ced01ec0594bae1680c0f252855ee863e472331f43a9eb8d3b9a35ac66c105ebb638f73bcc54a5968aaa54d3c45b06eaa8bd9193bc09d544364cf1dc5e9c21a845f0dd51cd12bb7ac04f435a42e1426846178f7c9922c4b59014c9caea3f771f11bc60742f6741610e0ee5693ea598a31a2a5ade05e5ed871f21783f8c4968030df392a71c79376891bdd838e22894fb5ff27f166aafb160095570fc908354f6542c7e1ee19b7ce98c55290123ed37376bdcd71d1424c0df99f8486e39688a366a2dc668ea92deb2b51596cc8a4916dbf533e4baf9accdc5e246dfbbac71eab539dcad1f26ab4f813053163657ab30430deeae9c4708f274bd3495496c23f1be994a72f7a9ed2d1b53c067c4b56c83d660a14e000926a7484d374610717b90c4ae4ea9c89e831a60934fae78825b04b4e914942a65fdc9eea2b684675a381d17ad4e048be6c403cfc4faa89bc370e7aa2f8e502e4ae8b9d242463804f8285f2d4ab91f7d2986f6f1e2e9195c6e411541aca0d465d9c13b41d9333ffed3d0b7a777cd95472f2b485f302594fc652b3bee1d2919e60b73f0f5d72f3071686dd7be83e32a6c4b9644599becf849cb66af39380aad2051c241e1502a0ef6c0ffb5b6a9ce9f9fd17642e10020a09ac2b98b43ec1484a57af9382b17e6f79542c0de50f1098b7bde9b22787c9f2d2d50718ac2243c2288941339177943b7390b0b55ad4ed1ecdd2a3a08eede1ebcdf067eaf087df875c26f4998e4f31d074de23fea333b9335e4a3d85960060235136a9a0dbf4974e5dc3d38861268b681ac24240d26678bc6165218953de8959e01c81b2977e006a1adaffa48c30e5b18daf7b4dcafbd5251e0cd97074c8a0f5f48fbf52d87bd2462ecbcc8e40904369f390cdf9e974c3e8f5fe1b2dfab79e0564fde624e1fd4a63d2a08b644e34b430d02d42c236445f8de5b03fad21202b6f16c2ae173b992a62d5e0677d796ef47f0143cbe4607d58392d14bd626be016d2f3dd4c4448ff195666592e50e0b58e5a0cab4dee136c4bceb762d115fe49bdb2b64993f68c88b6178e981aee33c772a02e2bd3ac95504f5c5f271aad1dfe92db29347d1dbdae6e47a101e13603b5f1133c5f3037863f0220abce9d622eb3b08fc4c28865183525244e1e9a18dfa9bd383a31555b1b63cb7f46539e69318f80cfb1ea06355c168302a909d57d46c17574c139a6af6200ee417674454140209136c485309e3d934c03d364ff6428c03ac85371438c70a680fa36c2d5559204600f56623e5a81e30a4fcd3b942608d500b280e752fea8892914ef8005ce0fa0b21381430b4983e0fff51f75b0c652cd7b0131264aef24c6ce4851ced9cf3e0e965be4d20709d38805aa4ef030a4f2c0b8c96d19c21c89c103b0d147c0f94166fe76dfb1e4631fd89e724e774f8810c128caff43ed25e8c424d441544f293f084ae169531010a6fc1568485017538a5038ad12d5c3b4754cec5a23bbf4979b345dcd8362d2fdaa635dadf29b8d2b96e74413d12fc512402b2c1be40542932a31d4588e15e41249dd208613bc53228adff37874b38034f75dab2e0d6b5020d93ae81c21fea460712cb2c105318818790998a18ec6cc493b58d7ec0a7748eedda8d3a1520912cadd265debcca808062c08ecfaa83025e03ca45f55e05318bdcdb0cbd9f1eb706eb908429458b52613af64d04e2a5f1188e0995fffb429b852fb13510927de586159112b8292aab0ea90526561a6e6609a983b1f7c50b39edba2303173e47c81eea3da9465b44cef7b9bacd802ce0830e48713b446091d1464d39c903fb6dbe11d3fae878f4fe663188b1573af76924deb1f73e719778965c2edd2647e644996a1d022045fe9c50d2f3ead3a765abe33bda171e2cf3c1d35056e7cc80d9e55fad7ef06042dbefefbd884c9cff71f97676e84394b258bf69da3c5ceddb8949c2bbff6b7e86c45eefd08d032165ad99ac4a25e915dd5aa39b207504af486dffd4b48150f22e54b5c186d5514b961d3accbfc61e086debb86772debc9688950501cb23f2112e0e03381cf135ee0446ec8891d19783be859134945e68adf2cd5207b3997f3df84c9c9d4f8a8ef51da5cd38e824292e038249668fb29189e7808689de3945e42bd5c7c5dca22cb07ae809e252561805027717a3ac9123b317b4ba45ac26a94fd596827ebf75f4ce6258fbdee31821b6d25e26af0faa519acc3beb2a5edecda0a681b0b02a8766158e5068a01bd5faeba7f072dde092fce4e81601ee9308037c156bf277ac321be4e73be94e4fc4c74238080c9c42d3aeefae1f86ae54fe67149b22036f99055af3dae8859768d2dcde877649a2c047adbbb61c58bfb7b2f87431731761238bd4ead436eac5610e2c8324ff8965273a9f802216750b2306832e2960f61952a6b849f1e06dc2c3a658f3a7dcb95ab53de091edfc1e6feb4243e316ff155367814e1424faf98cd98be3761b0e021de9ce1f2f8251fc51f2b40072e99c62040ff676497d033eb1c7d71267ccec06b25726cb6e92c03d11323047fda607c026bd96f9adf63a1479c733387c2c22c1fbb8f88b3e426c40172f59a885410215df81a4b5b68075cd8b017b47eb13ec48df6c1cdbdd824f902bce2b3914dec510ec330dcc2c0bc0089ed38b4eb3c11c8a9eae48b4f8f52702445846316811f0b562f4c11e73b6996aeb15a8247b57a1b864a68657208a899a91ae032731d49090b51c0efb0cb3f99b55d29324f5ae8bbb5d84c1f498b0288e193dc6f668667d2cbf920ab3f95e20a238a5a842291254d2622d212be727e918e803c4f5f4a6cc49254bbf1553e62f92af3e60efdbc493dff3d0cda6caba02d240c8a89536981a0e989bdc9265d193d570d8bfbc87bb5b401c884de74c31f5b2a4b266cdae870ed594b53ca0dc0106e826cb6469d5e5ac0fe933384b5b595d676dd6eb54cb1f38f4662c0d33c50478d005e3d91f4f0131a412678549e380c68bf6a9592949b1562495f0223671e18193ec6cbff5a8979adc4262be7720cfe475febf126825f39367cbee7f65974728bae62e2f9acbae77afcb86b2c875e6b21f094bc0f2da7e47992298bf144273b56108e02d8f28977019863096c80882c7a980c8b076544dd09fd4043b62884eb11b0e19efcaa7c7483668b22d02b6a8b182506b291b1c2aafed15c3940e853e5b909b108917d6b8475d28fecbd151464bcbe785ecfec77d9e12ae1890e872f8491bf51932d72c5be17f982d9a2a8cbaa2c3c8841d9b4b41215566b600ac990508214552e36becc4a6895bb6c4421cbd302e111b90caed1c92297d91f2d095daa58ade43ca2a66fd3d52547db04ddc803d0e40d559f5d015194013195c77e92f66f22f85486880c6e4585c91e9cc91544ac13affc98818d6d20ca028f9bc4d5adcdb32f3381538a1af761f9bd63c2fbba2356463d94fa8f5f1ccc9d869171730e1687b73de431a7505d6322e2fed8ae0ef85784bcbea758af4fbe03cef7f1a8b5ea533621769c1a9212b26ca98d9aeb03d53ec2dd0c441f520c970a82aacaf9831e5e574dc69306a4e4d648d901431ee10094559e78532b525b2daa933bca722c3137a72253ee65fd6fd6319f496ebb9bcf5dc28b20dac0541499b6a696843774c97ad645b70cb9c8d79fc48b307037ee1a7a828abdc015866fcbf9a15085604274d19c37ef520e71690f37216a43938e5627ba411f045dd03fcb84acf32ca13da7d9b2193d97a708a740cbbb1bc4de057b9692e12ba1d15d8d0be939886c1ccf883438bace25405016c110e0623928c3c5b3dcaf5a26285ae4002c46f3690623beb907bd141628c727de0d5ad41fa4fe8aee14f6d8b5cd853fcef70c56aa63082b203c7e9fa9080f9f3edcd93f20b8c07a187e309c92c9c37c36312d2349d9a583e0eeaf5e0ed9874f0ccccd28358679864eb3678d8a4d61b5048a8acadcc2d35d93035811c65d5fdea074880b0488c0080a086c01100c8da5fcb4adbd95dcb418586b65200c05e961482e8c4c0f93f9f391961b5461d1b8ea01686703ce7416a2bf69bf02c23930fb2019de6230961990d0841605f407f26942d162f97121a50fccf011ce6fb93efafa36621194c2403d2352145e4216eb7cf5f3f98c89886eebafdcf8602618dca449de0a8c5ad497b9674bcd4c4e34f3462e6fe9f5247c6d44324cf017be0a8ea92be5552a7a2b01c344ee7776c499f0caa51f68e7221d17a9908bd97f3e4a2bb4d850ee9150c62aae16cf4707241a3aec68adb22a8d832214f97224f9ceca049c205563580a365a37091c2be1cb4fa4768092c93d0287ba3c90e5baf9720d9401090f8c2c1443020004e458d1791afaec7af363f95404eb6ae0010d05db9df1f9271003fe8445fa24bba620d1b1f4c3422543c11caf3cb10af0f1f023d5b34dc72683ad071082531cc9231679d02707f95cd774da93b7545c2c1ee87ed305566de83b68d385a03adceee9541e5281f7bf6b4f5d3fd50226d84fcc0f056aa4a1a2878d70b0dfa2a16c5347fd189c1001ffe6410b8e826399aad4e9bd25fbcf9c9d7d1e9b38f012b2a1190dd4509ad6db31b99ea331931a783a1ee197ad49bbc012433d345e60e0ecc76f4b443911a4e799e2cd0e2bd89a987e50f00592dff16c46502971a468182f1631e54807c276ec16ab5d58d22fc82d79be4826ff6a2ace4603155dcb8077a7110d43002942a119f0ff8d08f8a078a213c1f2701600c05fb801d29184ca1f23deb384e41008b80668c52922a589fc7c262326d7142917e9db3b09c6dcb0d029a50829c0a45bf804c06a96a618273105108bb9170b55250c1ce48274f45cd0628d4032198313053386349f944b694350a08cc432288e3760334923e2ceffb0369d669d192be72f12d102039a1f97dd3f686f9db47f91d966e271ea2ab7e2ba8586770c33c42df01d14d4eb54ba8d235b24f5b6fa90c475bb9e57a3562c7dd5f0efbb81db9d1089ffb371f20264148ee9a65a01b0891646f5148eed7b9f7decf3c681832f73fa97553b4f305bd8d61586117c81e419ffd6db948d54186de94da5841553d22c95af4edfe331ae74c17620c8cb4a5cc4a2103b37eeb59891e450b3ea7347bdfb9fb40b5f204a21bdc9ea05f14f07a4f92f075829c21ec358e9e0259014411ff1da174d08fe71d6c2a0c80b69380c1c609130cbb80dee7b006a272da8eb32be9283baf2c7f872e16ad6d4a6e13ad9f7028840036ef73f88c7b0e744f1d517b389327e8142a1a94049272ea9d4393a258cb1a80c81a9ca53b092f01ecf2abb76874e740be10e53b51a99467b8853d338281f2d84001e42b525891d6bc9e1576084a8625dec1427c5a03a39f5fe9979f8d2b848b3afc10512d6180ee3021f621a2c02d1d21fa97206b0f822f6b154b4f5870074f337b26d2018475c97b48ee3ff03bd74b55df842597ca46659cd30b66a28bdd97ea85f429f1208e11264bc042de943ae942e7d5d679d96cf820e18bc07f46b98f196ce95d47d4c3eaf95597e03977832bcf40496f91d6ca9380418c481b38446619317d2dea33cd5cc619d1d618d609b4af1d327b71f5700b39a56aca30289132926c9aa75d577643a328de00f4048e99b12baa105388c7f5314396739de4262d0caf83cba539ce478bae3aaa9031eda0253a45530be833c9a831e81769a525e6d8c1c4c9c5f0500b34beba06a3e9ead827a1b43a6ac4a191890be10939db9805323176999c718f981f483a99b0589e0c68ecfa47bd4b1c4286a97750d3499057c6ae12a178ecc3f210e3159879560f406c8b446071aaefa8a335f38a6566422641d1d517f9f447c0d9153b989955ad637c04f278d7df021517ba8ecb4f319091f8c071b6e008776cf7eb3a24153582aa87f9327fb5b732f94f703d038173489e63ecd58a6100eb38267d04e956e07eb0b442265c9c4bd06da1a921fb3bd965608a3bc8afad7cc4669c35ccd58088ba4cbbd67fdf42a0146a87cf33163e9f7a4face319c8f4419e00ce32217d6f48cf70241c1cd6f29b4a00adfc6fbfcc4c2ed397c069c7e672dce4b16af3d0eec5d568b40bce580798d3e42468d609fabbbca8e49206c767414a769b6ca4e9abc1691226657bb16e61ed459692690be33604d9c056bf719160de987516ea2f59918f9f7123612fa5553c142ebd8cd1e70d4a611f1c5d0b8733b48964dd7c165f0e5d0e53bdc923f0bffc2cd504c82944462b3cc773c538e15442224323f85867079f06a189d3384a95b8aab40a282e836ab9ab45f49836b5202c206b827df84bc693cc4361a595ff1aa915750c0803e2a194de95a05b49b07764d0100dde2a18de4984984a43adcb8008c125a938f0ff023288ad4ce78cb6959d30803440c3c4dee0b366c07d8c5c3934593619183432004e13c5356523a023dc435948fc7be01abbf8e7ee22ddbe93c98193a3328f0b5e3c64e098538eb7c4d5144ec6dc80e30209889be22d9c9f4b1c051a369031e9ec4e94ff15871e98a939d022685a5e845a82b3aa7d5f40584f2dadc3cd3a0a0bef5a6050523b4c9b3e3fccdce7f621b706395758d9b8c36e2e45b262d8be6019d926f468b31b69a7e49c1bd163c3c300430c700389451506d928e7a487c2e2e344490edace265732cc588040258eb6203ce8730af62ed4b62e59aba3db90b9e806dec039a9a0ddb01bf0a7c64eaad3c56e887b31b0ee251f65c65fd549f8134c926f473c88d6e2c6b6c7d5d7659f61d620b622792fb654bbeb2148a323cab841f83bfa5f9e09ace3f963e25dd8c41712f2af8bbe0051c5b99ef3538da4a8795dd986484cf9baecc6f24a32f323cd52b8ffb619232d54eab57381a64e70430fa3c75e591c03927e3cc90bc8b0bc85a868103542524d21f22956811f3648abc90ef0df8cca200b61b63bc992a3982c3eb311935f894ac44445839c61381abb330e716aa16bd1ef04503bbf4d811c7c10d48d6310c5d3c0be0013045ecf1eed2a8de4b87bcb8232964b2088e9eb66abc0e56534b56699ab3119b7a26693cbd665da51f347e15224e24e95fce2a8d7d5fe05489d80ba391ead7ccb2719f02e75c7656674ecd415175809d5a10f5005734185d4792bc94bd4036fb52d110e891852210e27c8f01f4e06f7e76361c69a3f319563a73fc61f4290c357265be61bdbd98b3906f34251cbf2e05a952c51e3ccfdd7cb8850b1de4db8e53abb064e26a7d797c31a584cc9537d74c6bc49e25e49a458cb2996b655eb3fa0bef3608f87033911e22ce42bfca943c4267d3480589a8ad0217e62de8b5b1bf64b19a33402ae2d12aa468c794ccc52d4194d8626f7047ce570b005c61c5c1f2c4e37680c42f333a54cb19d0b3481cd0163a9bfa4c430700f4b3058e84863ff9c8b75957aa5a1606bd5b1cadbe0f2f0c3668de29ef6f2aa70cc92b76e866e194ae406da39429cbac3ab40db0c4963928224a4cb8c6c9fcc93b9cb3ee0e59084bb584b7bc308465067004d1dd8149dfe014b2693a150818f6981773965f892077b0e0e7c58f503988f61cb6121937bad281bf66f8f58550540e859018cbab618fea582296c95804e16ad50f74bfaae1e4ad8fca8938c8d5859d27ca91f822cd53503b016cb90b02ce1fd70072581e962df1f1bad4f80cfa764474a9c5748605d31e86f202993b6746ea65104a5007f67c7e372da5855444d294e9601c4c517f42ea4cb291e8a61747d6e4a9e2aa967e2367e028a5e65577da16a1f02f3906d83dbfd54d5ea671ef533ef4a8cb41edc23b9bcf1655b9a41478676963d57d00a67611d1ac0ac5529182472cdf05a7b5ad4112c4b6119eb460706518bd435749de548d102a1fb8741fb53fb24502a89e3da68c59ddc500f713c096469fbae8f6b3ec6c788f4f739d91b650551b97d0bf54284c239f1005c47ec1e4ae4fe05e789cf2bddd19d14e0209246e511e7f6f014c2046510a24463111fe5573d43ac442e6d8ed982a64374b0b3b1e80aa30dc490a2dd1ba92ba060c3c53a2dfbf7c51d5ce703708ba5d123802efdc0ce23e6ebe8b19c64d3ce1c803ace6b0e2cb64a0fefdbe1340e17544be5722037b8b2ae5fc1014d936c503da9bbc09849b37c8c5e37eb78842fcd501c5288d2013fd0e8bf01e83702cf17e4262c1c17777b43db652a65690bc2a985f852fdc158d36223cfe9f794b6cceb0642e01c029e023ef5e8ebc6c5ba1ae151c16e1d0a04dd2bb6690ddde98bb01ad63019fba98e9a82f913d0c97187e3752fed03bf520c35ef446fd9f76cc7111385d0710997ab51c252e151251c67581abe90644a27d2a9384b2f417bc38a42d793803896b01044055cfecf1328863cb4fcae8dc7eb3e1126de147eebb88922b4d87797332c91c1772f801b8900e849c4c35a8bed174723b771e0529d346aabe4224233e15cff5389ef36e5232025e0405be73e416342e1df0c07552c39a460bf0da8c3c655f4b6bd0cdef091059b3b12cd4534d9e7c6bdc2b153eec49473126d50377f3c159e5e57a048b59fa8a16a53fa19100f600ae451e2542ef830500628d20abba5d04ad0a8ed54028c8c0954daf76a4eb5cf877991caf0267459ff1dae6f4487ec670a9e2f06fa740820b223dc30c4249a32e5d7258ab26f5b64dcaed8112476b6672c71b2e526e05cfb93acc445120d8ffdf82f673dd182549f323f55383d2b34ef22eabad1e5e44450ebb4b79ca7345656b2c638e66171eb6035e529370ca8331138a7df21c40e17451d2638914d31af87a33c3d173bbb319eb589ca5a161833d51b61501d28eabc7508ec1180389180ae70d0cc471d21a3e3003b765428676a9428181d602187cc45d06aa58134bcd1e6674bd216c178246217849d0b5b1c1fcb881f7caf656481c9c60769d1833d8807ebc00efe779f0ede98e0c7e22022dc60586e83122c9bd8e266f0449f85162b2bda5de322061723e3da857966a5025a7a2c17dc707dc5862a8f6b1d1f99e22e484c993b288c9c38552e3c740aa502677115fb4c59c1af56b4d531bd33687f88192f5610626b23342a285cc868e77a4e09497a741ff060c88b0332446cc81d0547fd682cec464144b732f4d173b3a0203b5402e7d850d00e15ded989de9b389fdc2868d796d80d9f186e88a922a6b56830112086c3027b4b8215f72101ea1a7b8b169a3382b882d5d0343f58908c10ce3ecb1c5925895ff04cfe2a68f2ebc9e3887c6e7ff918092ee7f882a63599bab73e8dff3b309f40c64f2f2ed5ce4e9cba9f9e06a6ebdc0d7acdc214b708d1b6e64b60da4c619735cc0b052e6604e50d521078669c0e2858b89a86fed4d868e3d4d63ee9f98dd1cb506651360adcfa836bd8703996cf1ce22688d7c3de341ee9e867f317ea846760b00287b6b1320f98d80af7569c52e07f0b697befbda59452ca2465ba0dab0e990d5acc0ae82292023aec9eecfa45e8d0ebd9f52720014d1dc40fd045a80374881b509f081d6206b476fd21748817a0c339d3d12156800eb3103a2c01edfa41e8d093edfa4174580adaf513a0c34984005d04880ea313b2d8f50fa0c30e68d70742870690f1d9f5737411fa832ef24317913e7411c7d1618a0bbb7e0174f89b003aa42c1da6acb0eb6f1dfe8d0ea314a15d7f003acc3d6ec4767d01e8b0c58795cfaedf830e6b78767d1b1dd200e8b0e3a1431d41bbfe4a17a12a1d4629b15d9f071dce5061d7dfa18bd01de270edfa3a7438673be890eaa08bd01a1de29dd261b701a0c34944d303b6ebe79889edfa333a8c5914edfa38743867281de20dea10e7a08bc87d43879a8c0ea315367418d780830e65159f0ee517b40ebd06af43e7a2860ee7143474a8c5e8305a01a3c3b8862abee03530e9d0b990a1c339450c1d62175d84b6a464bb3e8b0e3ba25d7f4587dd6cd7fc85780f75b3b98a49dceb992bccaadfc53ad75c4516153ea42fec645dd06b87b5756123ed05956a0c2ce88b224df785d7daf53d1d59f2754514443d60ad94ec8ad8153caf9c2a3d1f2f9b088d2dbf1c97834142400a238c30de80753885b6fc463065044e5ef66d51c6a158d89f4dc85256e93e2232b7e4008dcd048d2d5f6e2edef86675ed41be366ece8631b05ddf139aa82ab7f582d490f144017939584ff6e356821aa84427bc94a08627405e392e39137395cf8d238d7c4e469f33311224e9f922ce95f480a0d65acebaa7433f4f882f74e207cbbe446aec0b82a1d009d81e7263db0eed4b04b75a23d84cc8973b7a4098b6fc62a4b936c7e560fd35f8ecbac3daf284bc9827f382bc28114a11d1ae5f796acbcba265875e9047655720247df9d11ba27bfa1da1df7d71be8c1d5d663156d099155fb43c8f35e95a567c0185cec4a21497cbec095a50299aa8fab48341e185bdb4a8c7c7f5d2e2478b2da2a08489957a26e632b33ac71503eb017be1c458ad946c0c39422962b2e78e50d4e0c48b85de948bb3846ae17deedebfad7d5f7a3fe4beeefd90dba79cb11b8520d831d2dc2f949ba62951a4a96f751c42fe1471b2a31b11143d557a40e6e6a6a67fb5cef49956f64c54fd29856cabf5eae36a63600ed6a7308f0a276360d53f06e605b9aaeefa5e145745285fb8767d8fc803c3575a7d2f0b57c52b9e10da2d2f68d71d7a42b35dbf28c20ebda15d83be58c20ebd2f76fdd08bedfad7cada7af9fcfcb82a94aeca53bff654296a925d6176585bbbceaf2f5d7345a3147c90d09d0c20f19d5b1d0a4b98c28d39e0befd8ce489e5d59155756449d055f41d48acb2e977c4acb2e989d2bafd7324d9fe4408f11585ed70e7dc613d34d8618ccda090b2c34885ca19c2ec27008171957ca2698349690fae40597e88afa6784bcf7e8cfed4c7a77cc2c59adcc2451b218c8beb7a40bf7ef7de1ee490ba5c55d232647ce9c1b9a21e475f73d5f29a28c72d41a621386f21d70fb153cd5234512d2d9fb9e5b59df4b59cea9f7e8735439fead3df2191f42988194f5f67c6d3cf4893fa46e8cff8fae9bcfce93372fa976f694d94b3b84fa9a54bb22a2cc76e920ceb96174d9aa1e96bae3c9bf0b7f090c06891e2cb3c1e4e109e28a268e99928947b3f5a9e8820683d215a486b8828cfb5c3b646e993da514beb2322c3d04b5e7e7a9d122abc1f998912079d5414697a9063fcfce8917e64d2d7794248d6c90b72fae815cdd5e9fd7ed5dd93882ca968ae5ede575abeb9827f6a7d13aef5f1f7539f847f8242da73fae2ac5fe95974d8d2437b5a5adb7f763ff91592d6d0f24438897c7cc8f8a812d0bef7593755fab3fd5f66967e53f6ae0a69cfb6a6d2e7fcdccb0debafe0d47a44e975be5f6bfdee179674b833e466661df7dc9949c8f2bb24e4b02568fb3551e175cfe9ee39acab900888767d96d9ae3f5a597919f547f559b00744eefa58cbeda3af5ffac2187fdf7a4058be964ceff2a52f6cf9fb997e3e93cb412ffdfdd273ded7fcb5f44386b1f3e74386b157be527d2e1fc0f45ea90281ff7e27efebaf3cf7579fbccf7f9f74f23e1f2b4ffa7c7fe56692b415d3fdfb25c0f42bdf11a6f7be2364fc4a4bd010da734d1f95f1f6a907c4cc91f1c518dffd952f74f968cbc7c4dca3bfef1e90d1b37ca1dca3910e91ecbab252aa9b074498bfc4d5fc2b5f1a7de111aeeb705d297de6bef03e13b314eedcb8cb55f5f35abf90896972997ef087261315dd7cee39e97dd5dd93484f5fb8925ef1517f4597fe45ae442f67ae68d2cb8f952f1c427b4a1f90eeb94a8ade77f5b9af2bddcaaf7838c46a9f3def3ba23ef7ee01319fe37c944aa5d2d75a6bd5a32f7121f71e1757bed65fd11d1172fd507a3e4a9f4b3aee8ef4db671d22d95c189b0839ec00d10eed93be21b467733ffa7067739dd6f36fb881a1100445dbbee9679a5c2d41515a84bc7e4dc8edb2e7db4a6bad1fe98471b5d4c801176d841bd1a6df6cca2a2ccfa70e4ed95c7985651945f69ff3f2e4f0baec5f170e4263d5efba268ade10647ffa1b91742bb80880ecb1189ba822ff299b923587badfbcf79f559c34b7106d9ac83b0bb18791471b6dc6f09c79ba7b4ddb6dbbb74f2255521dda1776813c3dbd98bb1bda4490b436e99b557c93f4ac1269e48f6616624a7adce3adfb9670f6b5fde66c68ce266acab09ef3dad99cbda28d0f66b1786dbd5c745de68442ce8aedcf11613b57c5760ef6dafec23fd8b53dc9f68f219e62e315b07c8853205482ed18053db47c8847e0f22126418845b0fd6388a1187d78df2063c3f6bf43d1e60bd186beff05835c91deef107ee2c3ab86f0ae61fb4d83196e2bd2788c77195bc6f6185f8af1f9a3f1e14f2e228d7f8b9e5488297f163dbb88297fc5c0bcbbc068df941269fcaf9e58c494bfd5538b48e35ff584424cf993f42c8244f9533d891069bc85a5c6cf18cb8fbe1adf7daa19c11e396148d8fee1cc8e8f8a3ddc2732e51fc31b3bfe275557e845aa6e2ca4b1e3e790aab9e3e7106de8cf1a3ada8c3e8631760c4752009115da1d5f46b4c11f7f46b489f1f157a4eaca48d166fbf8a54daaee2cbe943d222b3ed7e9d875ddfd71504fa048331a7d9c50a78bf8b85ecc279dae3df07e44076750d7dd2f7cdde80e451affd10b711cd775dd90ec216e7f4e684ea068337aff498468f373a97015f70e743f9c52acbb4f2e66f89cbdfc6d29717056614f2ce40f27155abe7046614e61fb8482932f9c4c984fd83ee584b2fd2712a4ff2c82ec417abf3edb6fcfeb0bef13db791041fff0f2dca198abc45557c841bf3107dd7f0b2e4a5a98c81e6e1499f287f9c29985edcf9d643c29c68398c57cb99429ebd92f39b6fc19396cf926f95f1305b579cc6c79a36c7f193a4a1e728d2be437b6d4725f21575d2531575d260efa75729f38e8ef22d422e3baaeebbac70e761fbdfc37de7df7527ba491efc5903f7ad9f2af92131357c9f7272edf45490b131627db9face8920cf9a428758476cb77c983fc1b7b91adec59b86df934623164db475bbe37fabc399b55b44813f32a8c0e24e7fe310e8aac75c3b85714a2d8524a29ef1d420e39d95c71429cd016be0c5fba63d2bdee11fe75b0af631272b297953d84525b6ffb8e8ad1d728727ef9b55b820e94ec1d765cc28b68735b47b3856dff1ab402ebc9ffc2d277ddd7c1bad748774c4a4ffab07bdd0ee6aafcb3f4db87a42ffd11a41f71f90b495ffab820d2efb849de12ef3b26bef27e7ef772957c2a8e9a51e4b8e5d69efbeed5c138edeb5c0e869c1072b8b3e5e30fbb9f3d1f7b40a84cf9cbcfca94e7c45ce5df74fcfe0de9b6f637e69c10ad226b1f72425984dbdfb87d61c7fdcde48486745bfbb81827b469921c764194d6a7d4c3a95d50f7a4d65a6b17c547400e724f1c9c40bae7821c9cb1d3bfcdadbd7b38da4b3defbd5f3d1ff839fcdcbdbf5df781abe2c5e688bed841e080b8ebc27a527170723fd13b20e761be089ed505390f53caaff390936d99aba8b8aa3efd298b3433e6e074f799c24564ee0df89691663e373ba9eb4ee2af3d9f93525e26fb2a719093d37d745d5e8c34f3ab923cbf705d92755daef29fd7b5a7cf7d9de4f9e18ccd9ff3fe449a39631365a90b16e69c13fbd39f37e69a89796357408172a104054181c1a0b85c502e94a1a1a2a20b452e818b00c873c617eeec197f85e60a00ae1d69cf8e4f5bf3638e8f341f6f7cfc393457397cfc493457331f7f16cd158e178f30c7cc064f93138d8f5f335736eae3f0321f5fdebe8c36e05bfb85f7459f3627bb17fd52f58c69daf805e3178c5fb48ccdd5ee45c7b0dd8b7681f9362a8ebadd8b6ed91cee5e340b0c2848a889109175a3547addd0d467a2e4d368a017bdb24d1cb7c9b6d936b4e50c00e9793807399cb3175dda3e3d2fd8088888f493a4694f1c351f464f20078b82729037d791f60dbd056d425b6ca2645c9f89b2459e572a95700e7298f78b1e01406f401315e327007a5aaed7083602ca44b3ae9b41317a0265da12328dba17edb9b6cbcfa7d1f72787be3e23d88cb638b49dafd16b038a3676126d2b1fe780d4bde8ee869eb38992311a4fd48be67e764b8c0dcdb566441cb795ba17adad742f1a6f1896ee45df7dd2305d8bdd55f334417d4490b436eaebc9e4e1c0ccf07e881b071acea5ee1b7af4a3472e9e102c81c3df60199239b86d37b42d721ee6576d8980904d9668ff107ec12f2f2f2f5c8c8e863ebdf6ca7c1b5a466f430ecec7416f55dbd9fcf92357b4b15aa4918ff1d3a081699cf0e954f17ed17473323a19fdfd8b9efba497c4bc0d1a7a49d53cf51f07cdd344d7783b9b2b4b64ed6cb25e3b4beb25f56be8259668ae36d944cd8992bfc9ec4f986d3fdc66fb657fdf6b5de3ab96acd3a9c69ff43f57e3f4a7d3b7a4d61a5f234e3aca0e4a560c67721dae3a6d1f77125f1fe78b221c305cc5e32ad9e3430a1f495c75d2763e2492d0433404bea5bd284a684f280b072b102007eb2be03989659c2320b03b333303a507a603d2091ee4b8c378450f98177707793efd7b83acf3614a36b5902fdcd942ae0e5e0750128fc4ced7d7e1c4554afc91afaf03166d646bc8873a80b0ebeba822f630e4e76a06003b3a89972d6df79124debe124a7c3227f136092592f85abafe105d8489bcb9df8826ca7e0d67649b56424707a96e69baa79e435107fb3bdc9c3968bfb993d07316698e28f145078fe8b891d071cb96f6ad0495cdfd102b6c8e8bcdb5b4dc4774dc3b13094d04496b27f12da116893fa291f8a62cd2702f5bdc7d659de7be90090dc70ef91be7386e880e91c8e8711c677f7ba9ed6f3a078f4cc9ebe1d82f47cb412b7fd39a08644abef6713bb1b9973a47cf96a387e3368d13f2793c0e5e1d2141f4449a7a97d0d0a464f24b51c94196df81e1a0d772b0f2cc4cf15564551c64f91d9183d4c3915f9183d5f70fed0b3df01c1007be89a7dffd104d70e09bb389d2bed39ea698a460a957a4a933b18963666666a6b5c399588e9e6de3b8af7595ccc4b61c229029232f441ff9e8e11cf91b4fc1769e09bc9128f1f5534c5c55a4f54ce02d9ff8faa957b441e2c3140f76fd940e620f48c41c29a05d77b4125d1ab2122f5fb694782e7b38b2f5c9acc45bef87b8956829a16935c6228d6e25f4f4228248741378ef7c732882da4fcd3389a20eda8700498b35f78e9e43f209dd04deb2f5cd2a11d4b46fd9d21e094d7bb977f412fa48f4921ecca2af849e4313a5fdd4da9c459a7d6f90b51f22e4877c1249fcf47092784ec8d484fccd1c2264c890bf9949e80ffc100d82770f0704da1fd19e11dd81e1607d10e8ee8b0fe8ce0340983861f138cbc709edd233510be880f68426ca0639acadd1ac888fb308297a7c7a66a552a9444490188ad4754373351bf0d1570d782efe682f89478597c4c12e46bb15fb2b1e8efc150fc77ed6e6bc645a7335838563441129599c713656d9f63b4272dc07e4e5a0e4e2131cf09cce5d175472d9d6a545cada62e964261659a6e5aabb2716357891aefcca714d9fab6fb55a2160c508e29e4ccd52321a482f36512e9dcc55db7352fe35810e180e1c38b60ff1c6f1717b1c614ab66ddb364345fbed794c79e34cf9c1053c3832fb29b9041338b2fa7706b2999829461507abb5560f99457b2845450c1947e62038c130877ac0a20d8ecca3bbbc0ecfc90ec86bae666272e6ca20e7bc64741fe5b80e301469800871e22aedeb6f2fb5f69c16f29c0c0f4788906e7e373f24b487d592da6e2154d895cfea355727fbf4774e3a4670b8bece752376b2df2988eee7eb743fdffefc8c34b19fceec8cccefbe1d96fdc20e261f098d33e5c2c087df18f074df44c7813f32bf6be23b429f03cfb5ec1b0c48c9927824bec6f8e831fec220dbcc6a6abc5310f3bb77c074007d0e7c71a23821385a427e880e77f690770f67c8cb70d3f70561dedc6b425ea2de2053429ed32108b485fccd1ca293f87062483c27bb2490f870a638f8d2019babc8a23a826eee4f9e385c1325392b394e721a76851880382b71b8b4e8623e0786f8e8abee87780e68199fb9eabee8a8003c0b8e6543ded971a8164107fd2db467cb64c870829302929192e10549cd4c999111f1d19b899562135527157288c3d582bcb2eb7333bacb821ccaf8ecd310f3bbefbe232720b0070234512cfa75311c2e1cae9cd573328b12f8ecaaa3b3c56c66364547a7fecc94992a57c866260f47fe984956d003d603a6029b598c0f6d6601901fcefc10f68005e0c31e59ec9c0f6762ac968355b68b1152d1db385b44b07e38b78f8f7185f331aa747cbc6cda661680afafb3c58fafaf13fb6133e3be00bcfd02f0f20bbd2d7d7218af8032a54c2cac7dab7f4ae15ebaa27cf39c749feee170cf7994d25527eb333147d517f221ce0130a9c29958003efa4ac6e6a3dbbcd53c7c70b0f2d8756e2257715fb84ae36962bf7e4d6bc88778f7d0c30379cd15fd666213e5aa215f7450c8a7e955126e097daba95ea5640210c0cb6fe572b05ab9bf0265fbdb735a7bee5b2571b0be0cef87b8656c8f57543858b94f72f676138bac6a4256ddebfdf09ca02925afa893166fdb9f913f13933328366ee06033d431a1e56f40dbe75e45e4ebcbf4b8aac8d79791c2559189b77a03cf69bc392b5cd0ca71612166050b9ed4225a3e116d735647a11180b1a596b139d9ad604b5d637353469f7494e242a8e7075bea199bbb8123437553ca4d018ecc77c5a1c26ae5d0dd14e4b0078cc3d14d2979a6bb29c8407880f40069459a1c25392fd4472fc7b583ed01e42abbc30ecf3914acd65c4d89824c7b3ce9e1c4559e9785cd8ca3e9e6147218e3c1e6eaa4339fcecfdb61d58fdea41286242d560cd044558ed30e6839015be2442c8a71e2206b033b5b7e314f1cf418a5152201d18e58b4a147c78e4224d8c18ef156ebfc449a25f4bc76dd5b70f193f2c255ae75578a9c92c91efc89b992ac964ffde0e04e6a21425e7e26c8550b39ee3025a39fc2998223c389711fcb67a22a941f562bd294205bab573e3260323e2b1f199f950f37f5944d94fd58aded3ff5c5b68d662e10da389c188ecc553854b81edc018ae2fcad43878e8f7305e4d5cd0fc8ab7e8e2f33311b2f5c25e40be5cca68acd90abe48d2937641ec77d11cdc413d11b28a2e326a2e396db8e5e02ecfe15e4df3e28472b64a06407e199edfa3a248934394a1cac39af7a85bc0da5887609b2fd30259b0228c66c8a27f84ce1858b4fbc711df553b2e87573e6a4a5bef87cf8d652b2149524ae7229aa69cd15cf8ce960d7afe9a991c2573c5e8b054bd8f56b92f8aa73a5aab82a2e81053cdb59f5b52de795a3248789ab2216e8dede6af9405e9bece1386bed77437623e6e08dd48e4fe12875534a5e7dc9fb21778e6b033168ae3416b67624c3d81c4b37a5641f9ec5fb21f7ca47935868a5b352728f77f17ec87d6346855c89e68a16cd55d7723917baeba7b2106db4901a9aabf9367407394cc9666211ca1d410e53b2942c0851b4e1b82c7218a1b4ae08720f580f18f7a5645494e41eb09929ae9a6fc803c0f66bb491292abeda58f575d8f6bcc145b4b10318c0003e0ee0593c1c227273cf390fbc6dd549cecf8785220d90971272a0449a95cf5c619c330fecd51ee4b0b654aa0f53b29c1c253956441aea24eb00a2c2bef129596a166d7cf340c487dcf6cbf131f7129a232365fe7e191ff98519870b025f71366d08fc6cb141d9a0dee639979a6e4a49c96662abe884d76a3513cb71a56443680f8eec013166e8ae311db818a34b943ebf99dc39ae78452c0f61f5b82adc9e7bfb439e7b560fab1584bcbd7348dcd8b6429ed572168f77b16b4a166f2cda6c91f531b23ef5d2c9b408f035c4310810e309f0dca9dbb6e7382134568e8b278729598c4fc5b83704d3c341e267627346364325f5136de24c42be50e4702636bf3a13fb5c9ef6a4644f3cf7f5806ddf10dab39178f77090f87a003938447b316f8a83f585684fe660017ac01ef0b587a9ab1e1074fff0a3f3136d248e1dcf1980bb51da15678a83d6e5571f3d1fa46d3f20af1b410e56d50dd2b63eae22c9dc88dd90bd040de0391ddc0e9d4c6b4f2c728c4fd197cdc500e488851798ec88851698e0d8118b2e28d9292e62b459e263183d45354f10ad61a80cb32fec1aaf90edfada128f139bab207c26aa3ec6399b4c3e9e124108c9902143860c19321efb449b24be9a5aa696c9643299fecaa20d125fffbaa2cd90af6f87a28d90af4033806600cd009a01340368861040335e5e5e5e5e5e3ec69510441355ffe52d2cda685fbf16459bedebebf43abd4eafd3ebf43a29e075828181818181f918570a80f91a146db89f989f989f989f989f989f989f89aa1f9302c17f9329d3a0f131ae7468d496b6cfe90bfca631f09acec00bd146fc10ad814742879f843ee2a7a64a68b983109a2b1cae88aa8f71ce26d3ff0465645a322d99964c4ba6b5f20102020202ba618371ce26d37f0f560a04ff4da69c31ced964fad789cd154e6ca2eaa740f0df64ca19e39c4da67f299fbb80b6505acebae28a2baeb8e28a25b47d2574dc41f8e490834f0e3e39f8e4e093834f0e3ebb7e10423570363d58430ba15d3f09bdc350ebbff5ad6f7deb5bdfdaf591d03bc080b406d2401a480369200db4eb0f118208e39c4da6ff0982310a44bbbe106d53c04b01331b29f04d19872d5e29f04dd9c616b35d9f933a3f3a537ea64c993265ca143f02870bb364fe655ee6655ee665fec3d40ef50eb048537f863297b5f2d17ae5a3573e7ae5a3573e7ae5a33f4c6d0d681d8a224d7daa016d573e967523f63dc6399b4cff1304bf0f5346681d82aa1119d03af4dc885596cd0c87af8f83cd0c079b190e36331c6c6638d8cc70b099ed0c68fb18d035311ddacc28ab07cc462a0582ff363e34d9e801b3f121de1b08fe9b4c39631c53a90982ff2653ce18a76691a63e06b47da92fa06b7e224d7daa278bd592b9f129f04d59e6a1b4622a0582ff2653ce373ec41c1e71df92f9f18a9864811fa3b6a6aead89aab06c3f20af4813460ea31497135e1078d4e7b8e68ae21d2e99bf847ef38bc087333b76ecf070ec8e192cb7fc0e4fbe4ccb5524999637daf565787c95a232e3ac23f95452b2eac2c51883e880c9b410f021de0c40c03340c71307750439587500459afad20ba2033651a9998335c6479c98836fc8e14c8ce36126b6ad1b3290cfc2c1dac52153b653b31b4f51012387d1092f20af0314b5214f202f575926aee260ae9240aeb24f8004011172d5497e049285ab84c4a6b88a8aab84cc805401e285ab4ef64b79b153440ed6d4506a96aa92a2e2a5646cc8f2e50ea31457989245e0c328c595800f6762517674322d57bdfca85b7e299910723813c389e14cc1304e08da75d7ccd55c0179f90e10f8033c107f800ff106e2a31fe0c3bc8178aa3da1928b87aeb6e64a63d59769a9569d4c8b0b4027d39a2bcbaa2fd3833d213456cb539d92e9d46ca2eaeb70451b9b9261a148533fb626aa42e043191fcf8a4853bfd39ed00d1b39e000a270cc7c3974ece04155e99d2e65a2b671dd4a096614db2fdbabc0c7c0a2cd85c20e5d663e60b6fde2042ca0c309bce772d5cb56b29c47c5725c1a887637f386be90119486d8aeefc526776d0ccc554e5c15af00e4aa952741ae227dfd982831423159b82a065d749cde9ac0bb7e9ced269d22aee41a22eafed58a484c1cbc3f7afcbaf75d68aeb6bfb2c8816e4bd6b3ef57bd6dae76d4f3e13ebe7da2cd56cd90e3de1cd07d91e5809a89baef7da7cafd10dd733f04f7dd779f034dd4fdc8da6ed1fd7b6592c8c1fbf893430ede7b9fab9f2c8a34f76b1745fbced58975eb770a62fbee87e0defb8ecce7bee3be23f4b72fb2eebdb7de7aebc559449a7befcffbf44e91edc77da7464477e6e4a470d146a811ed68a36dd6a9936c45b4ef40aeea4c5cb816765b93dde14f441afba6b9722824cabe75156cbbedd05bf6b9303c116d4a6fdfa1903dacbc7de7f155cb8ae54397427a3f7ccf2f228df596f3687a6e1f2dfa445cf90bb4d6c6980a9783f6f1e73f0eda3a861cfa8febfd67db7fe32e3457dedbf7a0b9e2debe6721aa1ce6a07db7160811b4cf75fa8439cdf21999dfbd7c4f53568b8e13c5a2e34495f48a6e226ffc69fa9d9e5e168a6d20eb93bb92f68d714e41d0f77e08fade37c4fc2226ca0a4159dee70e3451f6b3f61b3a90076dfb246ddf815065dbb79e850876218f3eef71d07ead5cc8fed2fa4f1779deccd509bff73b2c8bbf5310dc77aff3dd67a409fe74baf7be9b89b26f843ef7edb0b0b5ef40f60b25900483478d83d6e20e6f4eeb3697716e7594824cdf37d67757fb1da11179b55d0eb8489271474a290325408182a11428d961e493567bb1b6719d371a916e30cb51ce290e4a998c85218732b6e5cb9732192485ae90a3fc662ac8b112ec884519d8e002d28854317e2d0abe31c6dc799cb779f7b5e7347c31ceb163cffaae7df8a35670c9888080ec914984cc39270f1f62949c354d23edf06cf80a868818e5663e1151769e9046179b4cb24d6fb66fc6282e3c86d80b78ae6b97662ae5d31dfef1f876cc2e7258b3fd79b84a7e8d8377878337aab4e7a4d63574cbedafc99473fcc2fbda57e3e0056fcdbecfc35579ab20dedfe1ab17d61d020c22ea659fe2aefa44a1dcbf7f9f42c14ff3bc34d3fb1d11832a12b69f8fe34afb99b91b827bde38bbc8f1278ca925c7586bac92457dee00042d0f6bfd79f86004130500e394a0288bb3e8857555887380391c8c3466fc5cad1e10a46dc3c1e92d4102e6e8eddf92d197036bd08683b366cac41e7888a9f91266cbfcbe2a712fbf94759ca8ad7b0fac71d005d97e08e67070be8ea07c1e5366cb9f0fd8fed3e331f1aed503c26eeefb4823f59613c0d9fe5df50ece6dfa053d470d06b104b77f36e63f952dce710d7e663106a50a2843509282994f0b47e4487316dddddd954c7ff9f425de717ea1fce66c4a8905e5245e82046435c1ef1e0e7e1b3bc696ab65624abefb047d6c5d1beedfb809e39cdd747795da5b3d04f4718b5050bb1d8c690a3963530c0283933773d5b9fc02384824ff2517833c3f1e5f8d83f22d0c72fcb046b6ae98ed494468a9b5f1fd5fea87f183384844fcf8337e18c7a883e838e8f375de9f881b8310f1f1f89a3c6b7e080a12636c8b1cc4553a44c4e2dfc41863f489c10fae28029536cc1c33ee989f5b4c30bef2b898b1c5f83231f1b57342c051f3f15c193151f32726e295c3183302f3d8f47fd8f271fc708c3a46607aef173a81378d3aaeb25f6864cbf77282e8605d00faddf0f0c155e00bb23402e7a14b6f0c463e5bf370aeff887bf45c9c1d4b932d73ef1e0e776ffceec7b93222a33842184337a888d564db80dc31de3d27958220efa425cede207f2865f3bb1f8e6b9cac4ec8bea517e37d06551dd42aea6b42616b31ee8ffaa24444f40bd2cf59fae8adfc8d73b78bb9f4d7c3e16650d9739571d6271d1c272aacadad3dce8f442bc3ed3a0e7f968b2cb8cfd686dc055ba342f6bc25584a5cd5d7e9c3abc57ef9f0cab6a6dd285bbb42249f370a8f160dd1cae6e9e50b499bbbd5a74e515d5ed8f5055b7bfc3708259a286ddb58d3a289d2ac4c7b6b831c52224a146de4d69e9661e5a36bd8da135bfb18579504338806654dab5a645b831c5a996ccecfad6c7a43e0b7b289d26650d6d17908abe783b4bdc795c338c45929b7eddfa863c12c8fc49a6188859b6c4f9d5c19c48b83addd265bbb41d8dadb2b44eb86b802274a73d5b6b5b754a24ddc9a45c3d6ac18b666b9606241d66e145b7b4b831c5a9925b24373d5f21a7e2dbf367368bfd8da5f5d8d907fb7683c51da5b309c7ea1294996626b537b3b831ce2adbdf7ccd50f9f1057ea24aeafb9c29f93608a9e3a84adf9e73d9146fb1bb7320867909095cda019c555a5d77e562b8b34da5327e4fcf8e57b2b469ae8e4c79f1153d119aaf861e52f4f94f65a35014f102bb24230c30883d584f6b88a948030c64724c73f22338c30de41ede9bf681b0e6a6fa9c8f2e937dbdacff8a4cc41edc3b73fe5477d197390166d4df37150fb25f92b14722c5a626573657a2dc6934a3fc457f9b537c255dc6b9fd55cbebc4bdc8a8e9b6359d95cc988baafcd4a43578b51e5752a2e87ac545a99a45ced40d0ed6c6bf4f34f762c1a0929c6ea7956fe15fd23974aa552e9f3ccd3e4e6ef92b48c34f7a937fa62a4e1defb10dcda4fcf7b1cd4ded32e85831ae749b6f6b509597b8b71ce715ad9d6bebeb4fadadafb16b5ef8891cfbc17cce20a23c07c5c3e3294e793567bb1b6719de78d6e08a88d346feadba9fffd6c78fd6c38482b359972beef207d6ac341faa08314744adf06e8aabcef8d4562f8d76c81a321edc1b926a53ce286f6273f7df9dcbd3b7a1a02e4d63ebba377809dbd3526eaa6392fa98efa6a28a5411432fc487ff92da6f8d914850caf6da3f64073f0624ace48e34f3de574d329a97449a59c1f962fa7115cdb7fc6e769a23d963ddc0f3dc6e80121f7f685f2d33fe28eaca9a5bd6f71de72497dac676cae62a6dab7dcb73e9691465f57a529c863e0e2fb749af7fce274026956c9ef2ff7c3d73bced90cbae987a31deb8776c7951d4b9b7eb8ed8877d4545182f543b7217dcc79341a8de41c8d46a3d1472fcb39f34aa619af3ddcf6ca0e495a303829a57477ef72ee2a2c09b5d69aadb578165d987f534bc618e38eb66c80e0c35418a5159665b7e50acb94d62b32fd7ed45558ee92d07549c825da2541beff8c716b45222e602730cdffd9843ca524f1907ab6937ca837da241e47f94717a975e35f29321676c8b9482dd983e472b05d935a9ad4c3f9703eaea2efcfd1c77365dfc3a1a129683b671f3ffe8c4896fd4edb0eeb2fce13e5a4968f7f3c3288e70bfb7e21e987d472fbd52fc49b92781c74520fa9a52487736868925a2b426e6a9956667e5750e3a0df14c0410feb8752caa70e46fa31a49452d7b40f67ed0be96bcf510d6b549338deef071e35fa46675684ab5cb68ce896a0411cf48f0807fdbbed4bb8ca095731e1aa592c22c6dcdfe0de591770d146b8436bbbbc314ecf3e27259e82ddb453eb0579628c37a73ad13db76d7193773573655f8e74b4a3d7d451730accae3c4da86519c28a0516fbaa6c16236cf9dc95924f3e5b7e8c95e6597f727fe373db7eea90c220cfbf995bd76ddf119c96b2e330fe6d633cd330e7fc9bf9b7ab8f751d52bdb698eccb68135465a4c1d76ef1e99d9a5abc61aca99e5df7427afb79ae466f7f239d36372a3969a5c37ac9e8b7d1f7557194fc66160d99b6585cf489b8c2016351b225932d710c61cbc701041c46d8f2b7193d4657adc831c401c3b48503465b91e68b1c7e33e97fea39f9781fa3cd6d9d216f1f9e5a279ebff1efc4a235fee9fdc03fbff0c676ccb6dd87df6c4b1cd60cf9692bda581f787638605b96743db54e3c9205b6e56b5a6eacc3fa9946d06681b10c21aea61aa61a46b0e54bda8a28b9a28e922135414bb5974467f446f38b9146eed06a5112638cf16f3cc6215cb4114629f848e9118bcc6157cdd8d155a61de9081602d94bb5510a3d3d3f2e2df86c11052d28a5d6caa65099e260cd62bb08c576751172d00bf282a0c8459b6e29ae1820a22c442868a812c3982731b09992b514c5972f7469edc8e22e14b0295eecfa315cc4d54c2c1221ce74311493855d63b4d835468a053e8cb142c8cf6c11e34caccaaeff45d186c3b248e3522506c67d0ccc55a7b843b92985922bf0b90cb9ccee0c52320b7c42be106b5f98b369c7c0629cc4003908cea11cc6c04a3e2db218a05b84c6c05c8a935d7fc9fc1bcf7161890625bbee3006e652c565c85561c967d79ebd9aac1ac5c50b9cfb1589b2ab0bd0ae2e43cca7df11179fdb834cdf93df7d143bac269eea28765834ff769939e132d481d7a1df8197df8126de89cf48f74d38f14638f0b403bfc3aa414d3c1703b3d409dd011d272a0938a809ee0b6384626095de1898e400acfb5edb06d9b5833e4f4002efcfd1af8bedb022ab9b75b3899ac2f57cbaa109684f02dafb71b0be478547858312d0f627a0afe773b5d72385833e0e564981087c8837053efaca7b80d41e90831e6c7a2e49e54566d815216072adf45cb30948e0a3872381bf71eedefb37534a246ecc02cf5d6d010bdcc73af4601e90abf0d7f75c7325d3f25c32ad29e4d00b8a323e3237821cbc1185087704a230361312081391906d13f2178a9c1c568b524a69b5b7b25a42b64d13a2695a0f98cfc4aee02c67bf25dd123a841bc22d991f374e151c2a5d104259c4827073969ad55a6bb5175b9c98b66d56c86b1c67df85d8c9f22eda666731c658b390c39998cd6c4646238564f1b07a582d07edd7a347500fa11e307923166346ec466ce5732366a5ec019bf1a2ce10cd14e568e5e0c92185af4a3e33548676fd99d95cb9cdac87c592c255110b3d601863ac6d9c8673c58c6c29f1d1c351e26f5cc8732f5b1fe2c8706242deb7b671dfac96bd3cc871c896c423a1fdced7bf4c86ccaab86ac8d7c719c2210ad2fb21fe8d83a74d77f47264abb5f17bce8dc7eccfc307cbc364caf98789b23f7f7a73ce399d90473bfe24c2fe604dd1461b35fd7e8834f6a91332fd8c34d1d17e7b234d74e86b6f44fb8ce0974d9aa83bac7183fc0083ec1f46a1a969817bea01a1b9b83d64a2ee26e4a622c030610b8f1de2afb1d6628bf3be0f5384097fa63b9bf0218f9afd71855bad562b88154da69c670cda314b39a5cc338a1d9ae25c01bdd76a9a86a78635a9e1ebb6cef94390493f166412117637140bd37dcee9eeeef4b4e57702827e8e7cfa855262318390e5939c4e3ae7a4cfd5493d1f933ef570e847ebac3fba3dbf39bf29651bb818638c7106217b446418bbfadca1915ddf07fdfae948433f22328c49917c271fdd9e2f7f7471ee50e9602882b3a75310dbcfd7e15efbcb3ad5b72cc98ade10ddcf4e7a31d2d8975d909cfe89b2f70891c656d664691afe23f4b56f08fc47e663f924d2d86b838264ccfd0deeeede848b36426f6dea2a4961ae69fbe6bca335dad86ecedf3e23a39f6f647baaf144dddb4596f276b2c3b6ceeb126b78b4244ed4953ada15e4faf43be1df9efec43f04fded8798cf3df7de09bf0efded75a63d79af7df75807417f0b62d3be537ded4ff84b1f59a4277dfe21b42f7d47b8d73e73af7d35da93be918e2cce2322778c349b170465dd4cd4ed824754335197479c28ce93628834f7b1aedb8b48731fdf22a21a6fed8803dd715a8140e9fd9a1d3b68921fecf3b8ce59f529a7be7cf9ed5060ca29a79c71cf39e7d470ed226b9b8848c3a2b1fc24d2f8cb1ebc67db4d49c0c5afcfe1a8e9961e4e7ce9d92fc8fcaa65a44f3c7b0a625ef79f9f9126d2a5a63b4f14fd1bef02176490a6ff14c47ded75ee6bf3efa773df88fffdaafde49348e3540a511b544e3a9f70a41a4dd332a2a8bb835fda34544287b88aa41ae93ea24f3d1c7b298d56ec24417a39bfedbfde13d8f36b117bbe9c1fa53de01240028209b9e503381c148b6072c88583f451e801195be91c851fb8c16d1aa6a3100439943269e4d551680434c988e1d2c26247e111d4d7a01103737ab9a310090e1498c30d191b387c78c4cdc8df91929680070f1ed1667e941d608eb76182c92d8eaaab1f72d88069d961cbc62dbbfe0f73e584d0ae55ec8a733615091581f50310575207f393453982d288d7f94ebc9cf01869fd30e949b2ebd359bf7315fdfaf6c75575c748e7ce944534bf57d334986dfbbb69dbf6699ff3000deed2b383d994a38ef80d39be4b0f985c3533bdd7521ba40d032406edfb51a7140a9fe19cf1e5c7c9516ed2fa1c9d94ab92d334cfd334cdc3de63ec7d0f63f23c2ffcfa187bf83dcfc31c7e6e72989b35ac6f9fab36da58df5a6a79d41fe6d4b27d93abeacb87f9aad1b076aef254d3d3dc7b1ef5a4b49cbed974017e905813a1531f3ffe88f862ac7e2c5b026b3bfaa0143ae91dc11503178c4fea2377d982a148e41324d10ba690d25f4a29a594d10757bd0c322ba5945219140333ecc06165f0e2e3346507f39e1804520691069bbe59a5fbfc5c66a722e28740942ca6f80043e7dd418d98141d624db4a10fbe6c49d813290528a9903dd2f572b227be565611513356438ac98a3d251130ced964fa07e9276116053994322aae2262c241eadf12460c71957f45ac21fbcf8ec0596b2dbe9406f131c6f8d65afb494a2dad8934d17e747a8d0f95fae0c30c6b2a1968adb53ec62ea7cbea55ced9d1aeeb362ab76da335019ab669bf6d9b369fce3a25d619a457bf8334ee98b5d62df24d017e0852fdf3fd982dccedb2b491caaf5efdda5a69aeb1ce3a264441c16b86022974489fb4da8bb58db337e8baae33c22345122a64106d38fc8517dd87b1ca942ca2c49c2342a0f301c6a50c228d942f88200ba29c42065e0803197cdec6f79c760a39bc20822204182c21dfe7a2865111853faa215b70e3227483aef236c6351fd8cabec13888f16f9fc941d3c6184f9d95b8e4f115fd649468631fbfbc22dac40f25930fa5930fe593ee93526cfcc588d2f017238a13e23c6e1e7fcd5cd5e7bed00446fe62fb42ec85890afee8db07461afcd409b93eb8e5d86ac037647c67d545e97d4b7dd0afd5877c2203c0828b4f9faba9895aeece41fa947efc24503619e12a4bad88abf812888b4db5d8544ad994e3348edba298a10088dbb4e836fec9da4b291d0111a594524ae9db1b5dfae8524af5935cbfb9c355e1ce9edf0e19851c7f09267a438cd97a88836a7880356fc2f5ffc663b5c664c29548113f6a369125a6048ae2ab4c94444a217d767dc927f2472a913226fdaac069953ee787e516610dccfc9f3353771370d1465863b56632c5e7a1e9c97216377f9bdad4dcbf1c69e64f3b4f73621e05f055266a89c98298c876cd20076312861dfa609ad43d1cca8a1e10a46a77a4d328b89977b491c6f8d5e218e58c8f371869e2cfc78fe3caff7eb65a4ba7ef5424eef4c5450064210e7afc293f23be221c7423a4fc22a4366266c4bf114568210ebafd22841841652dc288aeebb6adebba4d7b6dfb9ed3300e6a9f69db364ddbb4dfb64d8b44b536a95f76704a6bade651b3c3ee5279e3a0cfe83b952264960f63adb513e37b27b5d6461965a49b9ab8b0c3df7872728485d0446489ec9d0fb8f85a1e21d2f0f8e8d349299d5f8d83723e89340f664a73a5d7be7f61ad7252253b32c9928a2979a414328991af82bdd8f18b1d1f025f0d9f5170165376f421a2e2d76f4a8ac477a863216e7e31ba6b5468358e178c34fed83efe10fff645ec187fd88606833fbc1f2f0ff37e784e8bf5dfc771453fece0d431d7a9857dfaf787b03fff7e479ae8d89f7fe43e91b310e91a762dc3ae5fd0b487fad4fc7fd0b73de8f571f810e7107e581364ae64cfaca999f9c21a10c717828ffac237e51cbe30e3f0e9efabd9ff85798735359bbb6f9288c94785ebfbe68f7efcc3e2402da5159813a945df67d1daafe8ed4bddc368ee497af4567bdf89e4401ee4401ea4bf099b2f9a811cc88362f044e5ff1b2f8201bd60aed78fcb67d7f771dce4bffbdbf3689f1f7fa7ef0b12436387157ecc77c29fceb5dad3f88ce4d7dec8f6f7775821a87dc532c8f485b854eb87510883354e04f45ab22650b556c409e42aafb50ebd9e4ca6fee6cbc1fa38fc7f6de5705699af53a8c6dfd0302fa34f6f43c77c0dbdf231f4cbbbe819dfa24d6f6ffc868e2c19fbd3335791555d387cd3e7bfd9d3e34f1cacb57ecd41bebb08ad1bfded3b727fdeefc49a7fe424bf201bfdc88a3281fe4996413f7fe6eae4afbdfded87b8af7d4768fcfdedbbdfc98fb0bcb51f59ae4d57bf354da03a81be977a3e019a44984091a66a1af81fffe34f88c8aaf1c17cccf39c7ee5ff3be92f08cb77c26f69c0bc7d1d98b79f9126f88dc47c317fa4f4341ee6f1a77332b2f21d217d8cf7d8df5ec7fe1b297d27fc349ebefdff74b6cf9f11d2479fc60f313fe6637efea6573e46971e46e73f69d2bfe896182f43bb7cf482d4f87878623c4fcbf3ac7c7e1e97e761799ed293fec6615e74644d2a48b9b4c2d2e21223868e2c973c5df3477e387fbc203ca3f7bae72ccf25e9c88aa26790d0aebfe938eb5ba22db2b4f924e32ab7b94391c890b7461354b4f1ed6e9bef4dbb77aeea5f6d7b1b60b4197de75ee79f8c34a43791908c748c3424136934613aafe376d8dbb7a4e759f8976053b8c4f69fee2ae91f45451ba71789ac5bbc388ebbdc9d94c5c90edcf1f564396bd32bda4bde61129b6ac9e2aacb48e9a81469e4fb286dfadcbd5fa6797aa5319833a43452e91e67b494be66a9db49b5faf1006f0dfd99dd9db6e8cb48238d94ca2d72f8aa59530057d9af7e41660caa7195fc4c23b539c839e74adf86a4224a2661944e767cf9441e81c78e1a57756f4a92a508258fe98bec45ac12a391180481f8c5f721ae6224913e79844823891065102228bfd3b28a08ca2360d18410091436ad9f746d2f1ffc2365cf96b04d5dbbfaecfac9d626b2c46cfb88415fc43f89362e2b12bb33e71d4290ab648dab68733ffe1273453fd9832351fd39fbb169b267ae7644e1c7527c368eb9406fbb955ff3a296ab8ab69d5ffb1845c2b896966ff6b0fc9d53b2e8d97210dfef26d2608e002d8f7fc71e5a1eff4db4b98fbf00be8ae162759c52f8cc1e077fa2f0bb7b38a720b627bdcef6e127bd8e8c4d14fed2cdd6c130ed2a30eea44c2b261136c6184fd978ce36ee22d38b7fb87110ffcadb18f483abe2c67f3357927557defe8dcf9fb9ea1efff499abedf1cf2aa2cab9c7231b963f4374325f1b3fd772ba1fe377589b3eddef14c4f6dceb6ccffd7dee33d2e47e3adcc7f88cd4a75da7292b864b8b6e02effb4dce3bfa2c23ede197b0ee9b3f1385ffc67b260aff484fd744e167c1bff9199c3891ab661511c48fbf7621af7cb3653f2f9a3dddc62ff1e7b92a7da78b4f9752fc47ea6f5fbc9fd5be6fa2cdb6318d4c36fed9834dee45a4c1f9932f07f16b9f7439881f3fe9b1f7611e7d68fa3d5752087245fa6e260aff8700d8a1847d7863871236323dc1cb4be8b04402f737a25c6d00705511cdb636a75121282bc84461291cc45dc8d2c741fcf7933d0e62fc560539c41bbfc42fb7f74caa31de577b6b73b4bb1ab73657a78cb4d60f3ffdf6d5b4b5a3377b1cc41f3711b9ef3fa6ef8fb7a0e996250cd7e7bdf7de7be7bdb70813dbfdcda788a9fb58fb0a22cd7dae56098683b7258b1cbcb2a8258b38d9c5beb7dacbbdf4628a17ec7b5d01ab6da8948c9496559032a566460200003314003030140e89c4c2c1684c2429bada0314800b95a25678581d8851cc29648c31841011181000000160200904cbd408f066225093c1ec21fa58b91a4364328247c4c666c66e5623ef696ed03eb88bd3d64b6a5fb6c620e2d6b2d46b2b8d18295d33dd637509cdf887260406f73e238943e1294c718bfa7c93b0a4e0033edfa9823899898514a2a58c5c1d3e7ae40e1906abe2848369e87146bd0bd519cc4c0d73a1ca291be582cdec5e30129a286feed394924ee6ac32eb351dbfd1ca2bc46194a9fee16e8fbfde3a8fc5fdf088e84dcaa3327e629f84fe6da5dbde299c1de0a210ab242d9d936792d362f22f4f382347aa6c030c5dbf74ccc1a6018b74da41786293eef2c5c5d3999fd119c1052e81810cc96f870409b428aa7d4ace1bd0492937aed69ae2885c7a8401a9a142ff58dd265ab291a85c53174643562768c189a0da4a55d10cca270d26a4e0a1f9e2bdf97d071438512bad4f2ca1b0b41e03846f1facaef8eb574575595b2d265851d286e68ea6dcb5680bce046efa400b0907de7d3a482c399e1003a3faac2de017905bc4fe3531d5d237410a18b445f5ba1391e1ff9506bb0e78942eafb15be78ff29f29860851d474b844f2e978bff601c936e294b84dc70529c8a520397b3f8453ab5842712947baa49a7273dcd8faeb440079fe8d745e3f0dcfe12711e36c9da101ba03e8b95036af57ef62c5891c0e5b25768314c793cce04421f2f94253639b56e5cb5d16269c8640f74e0d87d2db8d36c5910c555f5ca5c2799150ff902c44920922d709030d337bbfd0531cd77b85a4f4f68f2e69a5ee174aa84b5da2201a723951a250f95f2845de6fe4dfa154da063f7091baf41ef051cd8c2837463b2c0d92431b5a517e57565531ea26d394484ee52ef1327a37ce9ee47980d36d00db64f4c55e67b5b30bd3cedb4728088197f5161ae59cd0b39b6eb3b09f8233998bdedfcad05f4dca0b2d5f2c25068cb47976869eea54b3c9fa05a4ec1ec87c388676d8890b6fabacdb6212abb28e38f7a641825341caafcdc51faa008c7ece08a157b61641fdfef0d68c219ff54fd546298d039b70c41d936693b72459789b9b7390bd13f077c9d4936ce25a3923a764669a25cb2bdedf297294923962d3250faec740578c1ce91402946070711e8904dbd0e6cee1ab79a09248422a1b1d79e222211bf23cd1e1d1f2291cbc59b4b67da8af5b8d2441c9514967e678bbcd577b3a575235a05079c8301162a3e4b47acaef9fdcecc0792d600d038c9338502f80e33d43eb899bcc955f2ae8d5fb66ee35f6f2a508172261b910f6783f7d26b38ffb7ea181e1f83ddb532a966c4f68d2ebb4c288dd7e8ffe863ac740094c915a8f74689660ca4bf18745b6926d0e0f41c717706b4dcb13e5786a87884e3644df49b0c779b7df81a24d33ba7d5897d72a5c9e40b47ac386d3708a9afc177e3b492cd148b54c383e7222531110c5ff4fa31a45f1ceeb5011f54a5be44e8dec3dee5c018f44716356b3c11bf5ce4c81f087dcce612ceea7804088781bcf96e4a63371861b8a1baf00147299c95022baa8fa4b51ee87bf854d29291194f594d0668eef79c43b0da631c811975cbb73873ae2452ce93be87e2c05ec33858a126e715e352d36bc9ac9d4be592167d27010f9d5b4ae835b78b6a983fa499f781aa6a684c442407a91ee78f921b19048741f80fa7a1ab85b9a617f85ce5b59d840541a1199f690aaf3578813578942533d5b3a05a900402c0405647d08b99d115250ee75c351dfd87119f87cea52c16e0a2205106144ff557500ddfee3d0e474f33882461510fa795cd3e1904978a2b66d84203fa8d7efebe7a09bf5d2bac9123ee27afccada5e01d56373e3e51e0f69c91602a8807452bc50e0448fab5edde7d256edc36256ad63dbbbd1f5475df96069e1147536752d090c8b18050d9d78ec9131e25361ed3f3eabd8900e60f97acd297ba41d3204afda225b80b50593348c2f4940e89b1f40d50c41d5d1df618116b44c50a1a090ae10791b21bb914858f4bac3c0c49d2ed1ec4b5e85616862d66fdf22f4bcddf60845305a93b1cd295d2edd2e1fb842c93cc547f9ac46b4f4b06638672788f17bad33de7a682d44f146b505b8a7b849600abaa07c48d937b02aa2518d6004e6e5d53bf532ae8b04be8c8dc67ad9e79903e0b64a024bdddd0290bd4cd30c44c459491a88644e53ef98f5358f7d108222a3e0fa7d5544c14bd92ddd652e10a7a7a4103b83164181469556547ad976a974ccbb3f4c93cdcfaf89496e7ee4f382b33a4407b196645521c9b0363b4caf73a3f053f4992c4b85a4e6de5db41ab531e20215f8732eca7bd691f68318ae54c5587b477f62a734ecf8addd6ac455da31a4eb536deb806b9914615ab84b1a3846e1c192a72bb6cf10d98a22f62977958ad3bd8657c108263406c1bd20a0b698d8137db5b73c612558240d57affbccf81915084007732ac8ac37d0aa00f6fb2d0b00883a081961968915c5676942fdf4a103b1673e9abe02731a94500dabdd6ed3a96641e185fdc4ca4af0ca3302b566fabac6a89ca1dca01e58c8fc6ec85230ce798308b5cfd5b678120bc24888a605dde4e0220ad63e37b7e16c8e35b840e6368bf644ea98f5837a748a0baecb05d651d2b1d5b1e0869c9070ae8c802fa5ca66cdf2036a9818f556e0072f296d83ccaf12e502160c2113447d8cbbc28d2e5a468fa66fd1ac2a303abca44c164dc60c9348527153eda2678d7554fa74561d8f4af6dcc3d4ba64d8372a3df6991a640382c95e9043bf77f3053cb55083900f54356b7cec264a64f107c820f024a08abafc1362c4c0e2112b28b6f93c45cd540dc14436f4bced1eda03a03d28c7ba5dfc64ee16b8d64c30f228f0f1ec9db0e9cdee857ef66ca2a693103c2ef7c308d3979a90346f3919bd9e669e8c2822fe580a00e1216a3b142798a919e0b1b94cf0ff632450f09e6503bac1c42352878e26ecb1b268b2d9bf819b35a75b0ec01e2a3a81c006564d274e3c577f9393d7b2ab097bb14f09b9b95a68fdfa268818de07a044bd4d6d9c53ca23b65b03ee0213254bbd81528869ebf03f970f7d7c7b3d572995261a4e3c851b39362be2d3b39d4ace91a548e76ca6e59064d5071fc653b54f1dccbd0389a1c9fdc58850c3694b784936c205a964dd3ded5c521e518ac648ab182616af6c9f43826508346e08f4c896dd082f7ec1a9d2a230deda2254f2b428865d27dbe52cfa8eb49d90a720e174f09f64218f8062e90bbc67e513235f6104ac6d16a2d42dce0001a82b2f0c4478291c6e3f0e2104ca3389242fcee606fdb5c325143113e8d9df69635c064b6822167445cdf9ac9451800e9a159aed4cc886f4738747a8bf0004ce4b2f919566b283a082093ef21966a1f6becd8d210272044cd5261ef3651fe04e6524b8d530c085067a1f024295e14095a839c27cc17c8647a32f311f7aeb5b368234e4b857d66341008c989e0a2c79c1e25e5a2cfb4cb2cac1ab8244969287e2957c159035fe55d659af2c88d98aef4bab91294bcb2a1be304003f90d630938f540f4130d68a0ec74ff244f0fcf51268c53894eccfe28a22c700f9e8b915850a9b06a69867b6ddb8566c914597244896e06de28e0e558b871327ab21b62206c2c91056e2dab1da47072b9b63f548a816bc137259254ec7c20c22aa21f7d8b955d9ad419be5dfa5622a159d7922d7a13930b7adecd4e8e1d71f14151d91f17ebd13b41528c445a9510f30ce99fd0d06b087dea466b46826f784c68cae03efd24f45ecb0804aa22b348ae879a76813ab82e87fe7d8d625e61c3e14b970c4c6c9a00b4968ba6a1a14c7426c4ea46ec0d98d030d590e249671fc06ff07d657d738b77f6c85ac5576b38a15f2d322243d1325eb4375860a7da6d38bba316bbaaba8507da44db7e5e1a291bf25e623e750b9843b722d0f1b7a64e8b6065f74da830ffd5de47e6f03be0b65c6d9d0a9357670e9e54d2e609c5389d690003dc5aac99ff4c70bd4b2054fc61de8c648f5c3b82bd322843bb03f23bd2a5af93261226829b4636caa802ffce30ae6b471ac5088ac25666429fee055f48c9a3832729adebfc1f78eb485f85a12f40e07f12773568aba6c8e82cd5e1385a16b7e4a4fb6443dcf89afdd8cacc5d80e1bed7def52f3c26ce5af00f0e13ad710f7a9d5b632f87cd48490c1de96df578797bca25982a8a5f2bfc4753fe43cb6a634774a3995a7087eef61f8f80ea7fbaf250a5da39226322f3719215ff41a30c414e35ee60ed290197bb16c1875f89fe18a1d895573003a86e0f365a87a452e62585b500b981fe8e90f83f78e48f80fdda982ea44382969d4fea6324ed901af7c29819006cd277c27be463f4cc0291dcc714c810586ba84313b0672d519d0715b2c33aa4f62431ac7a9dc2a9c84a1b47d64d709960742e26c27d826b3940f9578678e041040ba290da5d11b7e1a7fc2fc8eb6a7809dd43bf21da2dcec14f2d1ce9555909d10e03ac4c028aeb8f7bb6b0f435a4599d7086c2cd4ff417f3fd19f8477a83d2ab0a57eab6dc474e769dd1120a4166debb66ccb1ef4133351d9dda7faf353aecca320c61ae529f7cd3bd8ceb77ace7bf39f89e09d189945e912c9587757ddb5d0667aca818b62a2bde89d4a1f78069bb798908600eaea2821bb4eb6e0bff2d10f9ca86ddaa7cf2b9ce6abbe1b13e99be5669fcb07f99f8f77684bf3f9783c7e342eb3e98c77b98c402a348003ccc4f97a6dde85232300fd4e7ee4934a0bf46ae2a38b8607c9ff2895b57365147e8bb9d26c5cb115e8ef6f0d88ba4620a7331ddd023dc5c318cb79c25fa268c2d99a4aa05ffaa1e2fb2f4759abd5448b271e3ed58cace006f577565fd8fc27c96bd0fc7e6c7820a19eb86d277a3cd9846c72688aa254fe70886898afc2dc263289d3c77c16187d5a3f54e9530443924f8be8b5d62760dc067ac709c0b5dbe2100ec6bc329df651b81dfbe866020c52054dcaf451badbdc978e5a53db68df176901ceba27cd3c513814759cc8fa99b7641551c2ca811b9479cc0d060aae34bfff112bb112a3d88abd58c4548c8aa582d3075c0677537c08077b44de2a7f65c1eada6e647a8549fec64d9476992cf29530e2cc17694f3be609da77368c433074e9db4b68baa539f3229dfa98aa3548b0a97fba5b718f0b1e3e8aabf9005047c5385f78b5d9ec4b4cd058f28a8812a2e655d6efc685f4bd417d7db1d47be32379d5b50f6f3812f816512198a598618372b65967ad7c8536b4b2b5ee78426a16a716f6a9d83017725cf47e63c2916719121cd75e9657f1e80380fb9859f014bd4df57ffca49e1cc380400a15a9649e3eae4872a8217b743012aa4eb23aa26ada7b351d783f0ccc8b55e56171a1281ae16bd72f195b7cf524e0cef2810d6cf3b022e6b966ad09f7404dbce9e4593b2fb09bae2cb3e05ff5107e3c5f6ec12b73da7857c61bdc45bc7aa2ba80b2be7ce4e6925d53bb96e452777a30a98909c943a47a20d1948e3b8eff755097b5339106706ed4dc6c1282fb7277c6dc056352211a03e02592deffcdfe99a1300faa78df810ab293cff30202c2de48e63d9fba327e6ce27b4f5f0179cd48266c742928763da2ca384e89fe5a5042bae0bce41f4ce85d3269d374b4b2aee2bb5d3c88f63af4df043061b21ea01edc680693f7c5de1cadf38c2b63edbbaa98629dc4751ac4c057341bea2cb3976977f0e96cd43e0e03e3d251709f416221197985acbfd9a38b476e266ce9ef032e6df55fb909138176213f0903f5f5ac89d51afd4724a888137b038530e640039df34abdf0926429f6157bed671558fa9f8cfcd2701361842e5f138a2cd710f65b548431e627856772022f24b0b568221f165cc26b752dee1d1d6cef9588f660b5c940419f571c658f2fd45209e1071e1e8c528bb04518beecfbbe3dbc5903eb8103aef61f3a26b5c23b6703aa4afb15a5b3dd262dc097f21f1deb21646461fe604559d9cb95c3ca0ac17290eb17efe3f0d0abeb68341ed419f8762de63de003eff89d20aaaa00d9038c1baf7cf589fdf274d730059bdc0c573622156647fff85a8d02298c1d9e70c3286ce7de24ce0e537fed3f73e41dd977966d3ea61010a7662f2013300b30641fe0e777f7dad69d2c71dc55a32f74d3e83dddcb71248c75cac3b08637d3f88afecf189e8b2be4d1225be59092eb89879f4c69d6d9e3d822bebaec332ac6efeb7392d00aef43ec1cd0deb0ea759fcb0d3ec9b585c81a4f53f359ab72f1aa4dc20774d18e335edb988c6d90869f60de6f583cf675a4ccc9c38a4f14646e7811f97e9d238925b212eb8818c2d0d93dbd259220849a908a388e5c4dfe38857435cd51624159cb6d9d8edc99e8a50df78a021dd1e044b9ee935fd1ebc36e864592be9f83980ec30c9c9d7467655896160ea3b4c88dcb48c3ed5ed324af3729c5c98c6c3ab927d4c335cf5d8f9381bceb14f27332e4b4e8893c793f847d98099d148bda39dfddb7066e9506ed913c9942d1c6c8b038c3d9e01ffad1f8de074959b5f7a938963a8927afbb3e3308a8ee126b5da5bb7f3158e021f66fa2405033baf69088645a337ee5070de8502ea6266b9aa10e3cc8b42b717365d4f5b69cbf3cb1375016cec387e3f43ffa0ea0f0dcdf9bbb37a4ef34e41d102ba4e37098ce035275a545f890de2aa835387065b0037bddd354935ede92349372c430a53fc747e9d746a0742cb807a21dd642010676c6d90e4a91f96155b86b67200507aee19cfbd163f31d26984b916f5ca12fa3348a5e9c202248e54e7b098cbe4cd8b3f498acd5650494216c37a227b980966f848622a4cc6dac2ff09c6766a83c6b01bbee0f5adde471bd01f321d6354fe02b3bfcddf51ee48368f22121db51e15d4c6439550c7d1f0741dc8206898d845040dd26a3acac0ca25344fc5d7b88926ea0720262140704428433d50f41f4e78bacfdf623d92a8a297aa8b930a7cc5921091b953b761b29ea240e37e12aac3c7f37ae4b4a7b1676ee292a3de30d23723e029b7010456a2cb362ebb28c08518eed46ba6ed6884e18804a68f038327dc80473ea775a1402e99d786846f30f6faad1487f3ae03e354ec84ef3c9017834b7d4e87be2e80530dc25089b7843a941022ad83f35f98b0a60b90a284df89851af4a32d396f6219ebfcfa2d263f8fc3f9fc73f789c733154d73bf36180c98baaf7121f9cceb98299d9f5e460c90bdd8a6a43b7b21f81eafcd0b5c485ca1f6f24e445c2bd730154df98be9db0cd992aea5d1109ad5120c205dbc2025081c1af394306b327e0a1f0b10d67ad059bb423b40d2f386202cea6f8714f1e08cdd293f67e3604bc043f424341443333ad0e33a75cb4bbf4121069860fd80ec510630f873c0677920702cb721eba12a78530921e4ad9488c1ca8bd433b84bb6263ce2fdb28806d1402b510f1a007068880f2b4d2a81d4b582218070dc9f82cfabb469b809c099722880cf450e7f1a125ef8c6013ba1a8362155dd52c3dbbcb50b53ff7b48aa9684c9d3298d476cfc9bc5758ef70cde3c7c779f442126301c0a99bf7b2aea0f0bef00ac2c572ccd28b28774753b0afa5b923030ac88fde7d24dc912922f7415873bb13ca59965adf73970145a15fcbe7b3499aa3191377e5c031c2acff09f1dd1b20e35580c87764d73c600c7785438445eb666cf48058a663b24b20f32ad9039b70bf1d899777bd699240754beb185302902176c46c316573b4e58ca85e2dae7d541f448d69df207e31e9ebf6565120187b7e874a1424c52b2bcde7cd54ea3a91b2a4fab1fa602fc646c51b6aa7d70427f8adf652eb7aad51bb235903b10d3d69903613d077acb4efe6ab444a27adceeade4b219da2aacd45bff87a33a335eb1683c03a6a8a9ed874631f98b56405bcec3872d8bdfc7eeffb0808100d92a0408e19c971d0d23b80d2ead241e51a5e0c7f12e21d94411f00eb9edcb081b6abb889481166d91b00e1932258b84aa9d0b3116d29cf146c241708873894ec94612531a8d72244f5882f1720311e803dff6b52b51fd10e408201c285baa3c3fa9fc590764cf31126227f20f77e1fa7c7f593a57cc768900b760473b4dbaa9304bb7c1aa70122008187e54dfde5eb4a6dc3d2bc3e360f26bf127d3749e0aa917495d0d6d6654bd1144624f0d14f78e91c90ccfe3e105647be93c25ae7854009f57b8f500f51e558715f0837ab5590de6230de99552bf82c2053c62acce2ca4a254b56dd42d2401031602049532b9200f5201061c240c7af98d968113f47cbe838b33c135bf36106f916723881c83e6392df746ea6e4b86fe67ea3f9af60a11e211140304a0bb0410dbd9650cc3e9c81aa7f3c8c1fefe147a69fa7537a93cb8a8a26e649b8b4e576d54bb6dc01da0e25aac3fa0c1046e400cd03dfb90a42d4f58eb2ff9be972004adcc57b5d6220285e04bd9d71545a82edf5fb1b051ef3565d4bc42802ad4a1356d4c6705b0728903b715b602613c3095f299e564dd3c954cef3d5f069e49faf82e298d874a9b2a321502638902c1b553267e1a2900d0789d850eb6fbd685a2220997890d6b9084c9311359855f648138b8de0a34896c8d9a8d1e3b80b4f4bbab46ebecf1cb1ce9b1beecdedb831bb356aad4baf292f46e7fb6b333f842539f6329612b6308a5bb520bbe334e502213fcaf791388cff9521187b9c77bb8ef476a1e6dea0273d96192ebd511c13f139a0164c086421a29391b7a11d597ca125bc7a192c9c8b5ae4839236a72a781c86f04b2284b27b03328d5dbab8e59c643a0509f633a25e41878dd7665bc1a2a3febff3a53064faf09628d907e29202f2d3620d921f3f447ac3748c8737368e73349c1a576329028c9fac8a093b80b9af530941d5908760cd6597984656b3d9b94e05f2d0d0d6d012bafe8e666042bd4b6cc9f6a115c3af947ee7b4256ad015e6a20fb01573762901b9f489c0c411e2a3f5fadfb88ef59693febb9373e35a5a3c84e326e495c07422d810f25e4aa8cafa33dc1471bc5b6bdce6ada938108b2a2e4e5b506f964d5905aaecb3b82a91f81d9836e93207862f3eba354dcb5e3052e20c04d62a64b169592aff9d63137e5a49782effaca066f5176e24d55dcfa93b6a091a1139fd453b22d11450c91c242831af05107859f35602bcf56c61d41f229043472e2569a0c3001021c2daca5f7adacf07875daf1dd2c81718dcfb5e0436de7f7c216017a4dceaf1acbb45193851d13d4b23fdc183573c3f2e5856e2253ec381107793bb7f9277af3393f68ee846a3416e284b505cbfa43dda176b64fe8ae1cfe4d36131eab7a67c31b6c6b2e627b349a67b55654942d3612bb51519f685f23de2e69d9e0ad59c744b6e87aa431a4818d059713a39624a6b0c599806a9ec9c532111c1597b14acf60247cc5f0d886f724ba11a2d577199304f81c4b81c4816d6e6871286cc3300d285f422650bdc82f7885cb528282c538f520690caaf1307744f751a7e549419fc0d39c171491fc7502a4eab56b5f8570c9cdb96d0d9040901d8fa143cc142e5fe52d4523177e94742c626476b943f91d1add2304fcd25b9a831aa6d185d0d12e9622fef77792361607f7c2b8eb95b1ae07f7a61f6ec779b8300777779879120851d66a8ef7f0502d5f915d5827379abf58683780253f0919e215b773254a4f3fff767d0c24f9e2b18f1eb8acf35edbf63948f73a9a6495cf62aef346535ce66e94c1a5114bf426a416f74fc1fabea9291f19c40efc3f1a84f8634929683fe5124ddc6bc0a9b665bcbe0a3f55aabe06cc5ed641ab0bb9e2352939a4044efae45d9abf3a6047c08e57ab51022d665b5eb68867ee11eb1999bf417054d80ef28f43d8db11b3b49b8715c3c79a6a1644c913902f688dce6bb2c917c66510e5e276f086a8da01af4037b6df8f859b0a4bf62dbe20b011859c142dd22ea39ba5d2188a3c4802cc79ae172a5e05e1aa2db5dc7311f8257492792233e90aeb21e6d638dd51b95e7281a8a7d0dc67c2072c1a845570a50f83b698e194b1307d0b3388005a8eabf581c3b15e93fa5929be0447cb8fa486e2d3c4c806106e3682249696caa9a2d6c6be373f1376b8785851b4fd784498000281bf2b8063c9af348e379d8c8c00933d078b2d5ea526f03790c6571b199b067b3aa8cd04d76c6006dfc6ca7890793c90a4641c28f6f3d3a12b2b1586a90f4e44eb5881f6071cea505e6bff100237466f290dd299ddad1e93d745fe7b4cc94ddfef2eed90a45842a18b7bc31dbc69b89e3ac7a24f7f9a47d8cbe89be443585f05991163c13196b082af120cbb871c581af652e5359c93dfaa2c89b664194098ba557a2175d69557e33c91a0667d959f670bdd42deefa09bd4ac685490f93744ac9944e7da2bc085d9483250810960c6ae8891a7004dac4186950bb6424ec01174de1319ba579e65163febe4bd69c2ad6187e965ef6e454e025c02e5a81f2625c91930071a36d1483ab288c49d5714381ec6fe5d89329547fe63720a5a92d25ad2021191332c1784a9f3ed3b25691a9f8f2f01d512baedb6e6849d27908ce60725d0fc16dca9b7907ed483f1c1aa3784d29b54d79a7e82685626d20ac876355ea9c930f07de8e87c682545120a7830d7e3b8e6665b38e6535e8fc3bd8b83ca221680efe27e191e793dd7b405770c791eeea43b2528e2d01166e2618c05d78aa33a5472029eb440ec2941eb855507c3b66f1c6bc61768c9df7a9c009995c27375cf805cbd5769f42bef7ca02b52d3ad9f91c1d620a3593c2b7a7a59e410fe4cd2fa07b6282bdf33bf8e4b0dd5bdffe186f9c6c88ed058bf8ba39f4744ee1dc199cb392061850e5fe3436b08315267cd16a48f96b9308ccaa5672e217c7ae99c77ac586d125769b338c53fb6fbdff92bb3712bef97e78beb4189bf8fd9ee6e180aaf613b8cb2039719394886cae3416f355275a2fd46dfd390a04dd4d955fa908b764b08d5ec0a0e4c61fb52792de0f39839af716978ccd35655c3661e4ec9990267f69f43f9066a469b4345fd4a7f4d1b53b064d1023a6067eaaf4ba58c27f3ac139be5e4c66d57869c8073c2c61e6af24832e653aadccb386ec69f76fad4d12f03fe096c7ae903ed7ca982a6e2e58eb1d435efb694121813aecdc1936c3b0c235a518fdad72e743b0694a2f91a6bfe21d5fa9b12b7057e2c4122995ff61f7d238d09b070617519a6b029e719c8e3c09d81c4a271f7dd849f355177720bfeb5f7f360bcee9226cae2ac9939033013e5c25c9fa6be45a64fa0d8084932fdfd4166f03e4a7c58dcd4212db5e544265b77332c04a9cb35aa7e15c1f8223b6ada0e6747d58254d8d8441473f5726c24bdaad67867e664877a863e88c9f818a103aada8c9cca265b96ace1f770342fab87a65f3efc16b223240133a7531e743ee983bd0ce1defbe1b02ac66e3d7d70e3e77331aaaa143451d428d426bf97a9a87655300d63c1baf565dd0308791591e8297a1918b700e6336cec91492f21aa53e1dfeed7b98156e00e9dd25a824e884d2764bbe6e7a5c5a81c5dc50279e09823def443112469cacc5e262ce2a493b79e9d25da873b746125cd2728d45455d303f6b242cd079875e2819df5fab40114c786ab8657688e48574bb9ebf2c72ede30a3f3ea799bfad169dc0e521fb08bcdc35368d98e51d4ed62058c602c9bf5feaef7c258ad4c29439e2f91f50be07bfad603a7d647cefddbc2933548a9e0eca17f65dc9b000b583646d3c06ab8568264a45805aceffa7df0bfe3fed69a60289a35ddd0c0e3fafcb49b820fa19dab59a0c7776d97bb0f8a1794a2049e688d96d8f7e4a14a39e62a720efac2ae7b57b12e753ca1a7adbe6f78002cc6acd061a276642a8140892df3b476436a41a346309d06212ae1abd134bc09483b6d056c69539a92b0b85d0bab083f65d503252c56a6d0e4a6ae2d86f677e581b17db17a9bb055b72022c64259d66a671e1ab438447a38db3cb373142074ad922dcf406bc51d110740f5d23638a54a2265635bbc3b35b57ea375ea6d4c79ebf2702afa6acfee6183b23c1037d399853439014d1d0f9cebb505e130bf79893c78ea90e29a6ce0604ec63b33bfc684a2a6c13813794707918a10c6b75232bc8f7a9c381d117828c175173dcd8b4cf8e4088c9ffeb9267a1d98c9736d2bdeb80250094524415912ad262abb9b205d9a585c0f06213a462f393b68a5826a6cd3aa0dfb99744da8f90b0a13756227e3556347e74bbdf8f53c453f21711f7e601c750f6808962f64c2df901df5f7e61255341b68f47b244a31c10e987342d1f7376349b98ce3dee9238205151f1d4ba1834a4b50df0f41d25b77aca10da9038403c2c1981bb3eaf77562663cffb9e482f1fdfec68d1ce2b41a2df646ee113f4b1d621f1eb962c56eb48d30ba0a83464b8be4200b3d395e8a4fba7f1ad9039de30c1e603ef72ab7f13ab988b418c622426b1154bb18b891822d670cf0f2c847b55d8c0dd89b195f6b916307fe7226c994cd354db40dcd4cf1a12919b4de6af2c3e1f751e2988f3e9614352c7dc755d2e32bbe08b12b27aa0a2b9d5a479615a2cfce4dc8a9222010957be8b64e5048a45e283a3f73926803546cf38b049c91d30f0cfadbd4b7c32dd3e743202547e706bc563c593c6a422a1f79ae3d50bafe5d955dcceb591b13812b7f51a0642ba5b1a565943d4c99f5c10430d5ed8fa7718db4b313bb152fa52d666e99224f65299819d2b674fb09879f1d8fb2cb5fd06f45dcd30d08b8efa010e55f0e74235f0f73815a715c99a901a6081eea864892971718efc187d7b8811bfa66cd2fb31e1c7c78f2e12b98ac1f7f12d5dcb0a4558f78943dce6f8df7c1d2970b45a49ce95025a128cc992675f98970fc55dc53e3bd195c7154777d7772c0cb08c4773adb5019f798ba83a7ea51bd525bed76d1c56a957aa5dfa8fb2086d3594d2b5e233d973dde1f91e6c3178902b54e44d593b7f27018230d713a48b165647b9c9b9bf82b84575ddca86d4a58848503de36afeb86664dfb3d4b51e72fd7afe80886ca728770ef03e76d5d41cf956dcf09964a9378862804fbd64893bd93a8b8f52f4b59b87ed3d718f6e1508db2f0ca3074c94f36903110a69346c499935d7bcd90f4f0667ef232fc0fa63780934238c78d47712e6d7c36036fe6eb5b5cfafc96d4d6fba6b45bc54cc1061aac8b09adf61829706fb840afd1f3f0eee96d2fcb7d2eccbd775b660b76c86c53d87e58e3896b51ebb5f80ecd2b7ac5e6fe3b9c560745d6e19fcbb74f6fad156a919d38f3a1db4387ecdb57d3bea18e60315ab53afd2ccbbef52a55b8fb558b383816662adb019f76ac4ad203d202f647821d5e87fcc380d0b5e47409c668429efad14e52a1041cefcc3138cfb2683eaa3a3e4029a02882201b185cbb41ac6ac3e77dc6cb711fa9cbb456d4e632e847431db4f3378b0836caba0d6212a0e5d5556adc75d77f21b90d12252dae2c7281ba3061243218f50ce9b00dbe11d0735462c4c3dab7acddba2a6afd9f5d3f9c9bc842199ca688074dc8c23d731b6a1e85ecdd3d5ca1cdbcdb16a7cc7f502ac321a51cd39541788e21c3710aa66e847f674a85102bf0f9abce4428085b001033b72f907dc4d7b68cb4e5b3ee13bdacfc4a3e26ee061068373c5390fa2f8b99dc02410ce13de7133cd5524ac1d4a6b9e8e8b6714514af275b0568839e420a850bdabd1770701123e5b35067e855f74d58c0b25ae3461fc0f1f33648f5a6c338254539a56f221cb5f039fa718c74a895915960a52489f9e4b768b60827a2653ed69d353055030b9eba31295f383b27b5fd999a43344fdef28717f7fbfeaed70e70ea0451fd63ce180805a751832fdfa4b3413a6a5dabcc36c19ff3c41b4edd0d108a50f8e00d9508185ee66516f4969efdc72fbef1313040cfaf10d4e7b222298bf39621a102884a1d42adbc1049d3156068364fa692783a2f7cde7b847154498e1898aca50283187cee21edd30c7c21313a3b4d00f2ccf76deecc9050a7f3cea7553a919346499f943f49cd38a6e73ba8a784c15a2cfe3a0b8990f4091c2cd40449370b6327f609eb36688b8fbb697a45a50fa0e42451f6a88136a4842ade99b9630f45ac7d09eead2ecb6b1100046986c643552c679b647dc1ea6ba385b8a2478a7f502aea49f771a7350c15ca9ea3c5e76cbdd7bf4ef0f9418225bb39ca016218a35a78ef4a55ed862637e4d58bf99cd134ecc1fbc3cf432ff2a1af769e589cabaa415347058f365c7366779d4e942c98a4078f4c7a6de9762d6621bcbffc1303cfa2fe2d15c1278a9ee6bc6c5ee9c3a79f4501dfe92e85768ff8aa1f6230690b0d67b557705ae35def556b23b82bb39f5f3a6efb56548039d510d7ba64f7b410d183e18c7d0d7c77acecc9ad41620aab7c9a7b67717b0375489590708190d9ede304bb475c0598f5880d1de5b6bc59d4893130aebfa59982d130ca675c4a0cca30893253d15ba2d7153447d87d2baa29b61e5abb677656e641402755ee64ba6af864bcd6e88b0cc42c7a7cb0b747aa4462240cab66c470b23a243347ab8a04f96ad98f56a047bfd52af46226c3af2de1958c9c160376f0f816b7f83a6ef08e2025d4aa6bd5751acf19378a1c19a092c366ad0eb72043a3d20b4a301f240221dc43093a9d2e5dce8089bda2f3adda733916528bc177e7d617807af048b2315e23496b0aac087da0af6e8a929482fff68fdf660300e6ea8207be51771cab007794ddf3a86d32ba9cf40c782a1f31c665c7c02fb5dbbbfd108b5793728955b1d1904f014b534208fdcaee17b9a2dec2c357c24b647ecc7d85fc2ee20926bbd8c4bb1d4c0e45a640bee0ca37b8d4731b61aa6996fc26333318380561d7193c30b25401e19a4d511d7050a08c1f4ceb2ac57143f2142166c4b4270c826a004db2621009fcc4d935005ccb62ce825ae943f32a7b10b62a110fdaf30f244f1d2e345a4e7ceb235000b09aabba60df2d694abed5b0c0445a8cd52af36c8ce9f3244d3c518e87b90201796de0e494572fba43dcdac6ede88c0ed9cd640cba123211f3407eb356f3d983e53eaf7f12198aee5e55c348780a6385203a17254249c7ba8906f40232ec61f7bc57e14ca9b28a34069b178f0e69862416abbd6c3a380425b8cdde9f1256b573f19dd4cdb1cbee8ef0d29653f2229a4f3615c80bb18b743b1670521ce8570145cae8e57929f928944b8b201b1ad6677996bf2b8f36324857c75abcf2df2c6cca041ec1a080a3515b70d835cdd42f97e52dfb8585566031eb48e781f06d18b264289f7e4449c91a648d80a89fe185fbaf3439a7abba315d7064bf54c90c09d35a77c4892baf67479d90211d6218c0f438647bde6bd76d9830d744924b819aacc4d90b5f6cb7a41750426d7496507b0de36604686ea9c0a1e3706b5977abde6b3e2cb3fb2adb17faec1b891bf99b9009a6d92adef8d1dff65917514bfefd4481c61836c0d2ac2403ab7fc816e3916413aa9ba6533cd923513c5ec438f29f609c737d274b148bd43405feafa9d28b44d3e30b185bc7a040623c2b51928a454df56b87994600292fadc72855c66a8079abaaad1bd5c6e282e1f687cff070413038da1e106901793dd950f0c3686ea8599db07f5ddda720bf9a0e61183e5f874947260bc51f7859c0502ca653bdd94b94bd5e94678f6da1006e614849b7910e11147d7750e290d051592467eac8606840e282482f59280c151a4c7bcab751119b087b899095c755b3b720740207b632f2de6068238082b5cd1a465e248177e7cba67dcd059acb6f2e88ca139d19105fefea323e211410af8b6d5a1a013148309e8cb8f900f1baab629ca62c984f8931b863ae71f0e695c43c3bbe8a0b515b4b346be04c317c3df52d86d48b61ed14211c6de9fc41be3e30557d066e378c2dac01065f60855de0841d49e0eb16a4c8a009c20d9f6a725782e7ae17de05130d7586e082d1baefad69032952c11bf78bceb0de9edb05b68a887f176e8f4999164716ddecc4252f9c2d449a60d132d0fe1fdd688a8954e461d14af4da27421bdfce2bda699ae9ffc1bba91e15f1b7f876dd0adabae9fda2d761b04c4627a5d1f446b0aab34c5984d4ebecae99a7d0ff3a89206b747d5d516c1de7a3f47a1e001c65e1eb85d2886441ff84a2e9ca390885e5f3d0e53d1df75ca4ddc46f5c762f466c45bac7cc68924ad2b0e9aa9e32c205640aa9ef3cbab065501b272087a32d06677155eb63d0cee546ba77a56318fda409b2ca9d18480db3dc110e65b2f6cffd272f2ff46ca7773ec45c3a5e187f91c0afb3102698a6382eaa598a59250f05d411c694f1536a2595967e1e0efef1ac2b924ec898eebc7541098710fb4ff1964c1399e25f40862c722857682a4c077e9e624cdf1a51c26029a5f51ce7da25760ba2e3d0295b7f5d591964462b5a5027a70f982ccb45725e50d7335fd644048a6dff6ab15c63722c584c5d007df1f85aac37ca5be1a9a30f4913b0d01180a51fd8a6e0e4ffc029e3d3cf37afe82338c0d89f46edc1c85f29473b02c85933b0f82557bd4d23f81fb0072a4a9ecc6abdb7867178da03801077e1ddf7cb64fe68a61521fbcc456f4338d0d40de81c6e46343ebd959482ab02c3a2c7bdb75ccc43efd232f6a92ee456e68bd0a3da3cba0da69a71361fa3daa4d8b4ec9f04307952e0aea2a04c28758a4303c87f67e9203139e431b42cc2336213e768766b486b5b23ed4a51fdce70d127abe4b8db9d53fc4562cc52e2662284631160331c56ab1e869ec4f384f639f7d5fc1af951e3116023973cdc671d2ff2e89c4e51839e4199a95f29f90e83153b09fb5531d6899585ed35f8461097dab37169e89767cfbc01d5c67ee899bf12faa9f43dc374450c4e1cb599882fee0e68c18e39ba83743302393a046f0d6996319aafa364c71969b4353789717d5d06cc32632f18bf0d96d1dd2156784a5250d90d703722e47f184015f069c1070f980b1c1eb325a9d7619c7fbfa3bd5a194e0474888210a58184dfcdb115df651d6a478838025f0ae9de57f599a09f07ec49e6dc7bbf7aa5f953a77e0aeba8c83761fe9d3308eb95a7d4879c575db646ed4b4adf65f0b171a0937d36aa53435d26d54c309dc187bc3996c3399e4c9c3c274f2bd3b95920a4d20605bd313de1fbb1b4c7469c0553a9e2fba27b293f15aa6a2fd1f05201a19ef18b1c8f5d8a0d4cad590f0df9b560b1dd5003bf1ffe04cd5a3c40b47815ddfc1fe822829a1197b1a16a620c1b2b047ae7da19e32090bcd9c8e2025c11d6fa577d3cc72ec3eb55e00faae8eadf586827997378a5ea0c5502872a89e374049eaba717809a6cb093007d8586efe2eb91b00db4e9c2dae8f9c6499da63f41935dea3f01d1b5692e9a1a033aeec7f73cb4c4c8b06867f4d7722b0c6d693ef140d907ec460c8b57d93b4b4d140e46b449017d6ffb8a3329d42818d01312d0598981fb8a67fa24fbbe9d8924bbcc4cff94de64983ed99c07c25b72f71c062714481e598db80a78cb7f89d6a2605b8055b042dfb9e4361b2f63192347f5ecc2cde30c3c130acb61b97da330ff27e766f54ac2b8c8a825f63b1b70082f4941a51846e6cdf2098535a06fd2c3d19b10ddf0e9c17239badf3a3151ae2130087d8cf9652024a00129786c3bcf905269240be6f789a848d944b0f090e3293dd0b065d6b6ba51669636f8bd14e2019d210b66b0d05b502fd59562ad36093a44c813939708a018207592e8fc35412b735f7ca0739be379e68caaefecdc474ee42f1152ffe33f22bd740595d9edd6d99744dbdfb592ece7301b1b31bc0a28b5b4347a0132ca72f1dbeb90b7ea7f482fa0a0c9bec57060ebd1a9209d8ff2fe13b0bf9a413f3f24e613e197b7e27636bf251c24dfb985e3cdfef70da70dbe0aca60baba18d2c6881b9acb9e9ab60beeb4e12da35134eabcb21e8f523b60b2a58d9b8e9b2ce857c8565cb2a47cc84ec148d1ce055b09055b696334c46590e2624dc2a8cf82a0893f987ad5400396923fcde655ec175d5ab81fa5b47414598734eadd811747454b49d9c4ab981f9728e9aa21427425ad134a27c0023440605c4ee1f08f2041bc6628ef2e96a97867a56c9bc9419195bc36f802eac5a6da5408d0d6fa248cb655ff80d7a5f3792b46df573f01bfcfb3c8f82a7e284973af2f445a8d11437ada8d60bd953ab24bf60cd4b540de00f298a2f5518f267f2d34a0a0a51ccbc165c3d8eb5b04538da0dea99acdc3ae943c5b59aea2a0b2c38d413ce7595efa6147615fd63e66e5fcb1f60d54d5852ab82830d3b051c450507e5b0bd4d9fe0a07c00553be74dbfb5778e001b311b59328443e9e4b303e538d0ec13710dc281d687fe7081e8f9786de24697264bf9ae951012c6c3db285efd9c3bb83eccf3af377c9e5113e67d6933887ba2f25139dd5852c51a11903ea4e5bd09462029c7c9954bc37aed7bb74d1f032fecdd1a9ea26ea4ee17469b66a3f39d6f0b5faaa5ef037aeacf70c44eedcf80b0bf5dacfdc55cfc07bb12e353f728f17e06f2074528602ce38bb05cbff42af4276297e50632330c95f7c4ac2be24e762a85cad25c21c43f62fb878005a3c84a5202adf020e74c391d295f9c85b56c43e36d2a710cc7afdc6ef15ac6b1d1f06a84987b17312dc7c3df95c503d74ff9328242b8ffdaf0f1bcc7ed6d8536eea9bd6f79cd9a747d0674d8dae8a46632d6bee30822beae5679fe16d84bd576965f04404aae3ce81989075069397e17735af3f3d4857614ad6c43fabfe452305c69cc0a2accea28abd53138e584285900657457dac55d128a1d3999cb84874fcd0818e5e29a4e473d1809a1882e91d81579d9082e400d55e820bee615961f2b27be3c63b3fa4e0d47d0b07f2a2ee79702acac58bc5072dbced429600256a0d72394806fc2e3763356b07d84d55ca7c130540ded74c9210f2c7bb1620c21fc06c8097715a057b84c3d11c8a3f3ecadf8e021d3b5a1d10ae4517ff18bed3d94a960b6bb466ff750d523c4bebbaecab6219fd4037af24869d785eb1d6106b34ddb26c26de55a226f868a7f157db0ea5db33ec4b45ed2786ec9c39d2fa3d4b1776d11c5649ed1286bd1add5c087a26e439bd6032cd16cba7684b0974156155d8eac23246184305c65462f1300532210a568eca1b8a692ba7c3cbea0a8950d5518e4b9b623f2ee2308dff8f8faef257ff87c131c99f2ae3e3fbbc31ad243470a8355b9699aab44aed3b910f42b1c0082d72b2ed82b3639e470b5b9e6319b5f9f49945dabf7fdf3311a5bdafffe8ea9b069485f8a6fa201263125b487086a296170a6c6b2845939e4937e44398319a9785e54922ec40ab33a1ba7eb8bee9a1cfce9e2b691211a39e7dd0ac4699f9ac91358da2bf810d932b1b99c509bf346687bd6073091b20a28f6e0d1f17b0ee2a84921388a5f871e1418d6ae984284f8fd98ab220ffd24b8dc522e9c882b6e1e204d876a34407a537e93e467b9f2eaf77a9f34a672810722ab4248ac4021f66c5509000504447da116e83553de6bae361b126b46687506967ff0be66c88bd8d9adb840770efbce9cece49495ec7f2a47dec3e9789f30284fb35bb4dfa1b66b7f6d1ed1bdde1df39136c6a0ac9864d92c153a4d47027597eea0e6836ebaf10ee380f00d15037b44820a152393928c5cc659c79a81cdf07468672b5bbeec0435001748523bee6bf4267c7f128eac152f089724929e4df8b7d48f999802482b25ad3c844abd7b8054a9e8183106ad752fedd5ca464aa32115ac9afb1657f37f58ce9fea7686e6de8499a49cd6d6c1f1835da0b216782e11621df9a05701d12bb51a2e233d30e8c18df7793977bf7d03738f06f333703994f650acd3ed0eea465b3e1824c3d4beccdfee2df532283ce14642cee36171bbfd9b1fe98a39a58ed145d096334a549ab2d4aa767136ea797adb7c1abfeccd86c3c602b0a80b1982cccea04a418f6541cfd90e4df1dce2e2004c28c7f5b3191d001a99757b8c48aa26e837672e11074b60661fdbc80b139c0b5957e71a3d564f8574afe9d6c36154edf722e6c524fc758965245a8a43d8d9b7085c7cc8de83ad05dd60f192f5499eb53b36133874baf7be63869633be421b21a7a581511fa0783d478ff451c7a54625058203ba3f348971de14b07b9cd63f019fa28f4e27c87d5ce3f9c958d753b00ef8b06177cad0701caffc8ed50f083850e6d147797593f2c89fa50db4558363b577c5b50e914379df114c65ebe50f105bffc6d3c925e7af388c3d48472d00214d1d3d8a49a3e63ededdb1d8943f34823f49f0618fcfd9be2e6d797f3397623bbbf2da371d2e84ba65baf2accc7367ca66d513b394d0ead70a03949df645c1c7bbbc48508f11b34392fc055b9d9d882ab5d61aef86d7a51a058ad45409a0d1e6efc1b427860367c3635550ef81c2f3782ae3733612d9f075764866488e707c1a633f03b52c8c9338359840470bd340359184b3871a46e71e9857a9031dc6f3daeaeb5417b60e8e7463b8abb4b1fc8ac6bc063a83fce47469755d8e11b9a99c21b26307e53b63e8d3715d6b29049204237e4cf708e82525a7539d3723bdb01422522646ef9e4c4519c29978f6c4a694926688f83dc598692e82ee7f75b9c3df431da055d5b131b4456aa73ae1b11c42af92230482e7d76811ccdb25a217062c4d039017b52c5516623b0b56f0a0f81643590c8f5df57184b99661a7fa7208588b8655465249287df1b38b2c070c961b1b7f0f0c32dbdc32088df88391191af5a034a882485c1ae6acc1137d09db3dc0f1032151da53997d0e487a681ab7c52db5741b32c41d13ec35987d2bd07dbf2b250c4513a68da8e44c0456c8e7e7c5a0b6c84d53f84cb81373e499fe271a2696c8c5a74d745c9806b4bce326a731547ecde01d61c38723cae7c57de5faf8605ab63caf3e733cc99e28b77be96d4072f80b7f0e42139b991bfbc6581e32ffa1c788ebbdb63addb62fe674a3da30fbeee4b006685b7275b3550536cf613500ce75f852721df9d7c01a9ce48bb09038418d482b81ff2f6ee1c853d91c894381006cff461da1c73992e3c14e17142c0c9f197cc5f6db0cf50ed9ac10ecff33df667228b58c13574f4a37612f38cd002dd3d64247a14dded909a66b33904d7645e9ab2d8abb444e8b5489d88652f57cb702ca62676016a40fb766953c34a16e70291a42d14523c94a109a203b078dc4ca5a172a96351898cc67d9ca85a10e31c7b78409511ec64920da738137838d7d8f522e03f20ea3356f6aae0935d3e18cfeeae72a0129cb5b7e2eb0153090bcc0219f63d164f14e9a4b48248e125e78170869f1ce162cec0fddd2871e714c66c5878cfe3d88d7fae518aff98796b609a5e89219b2e151bb50f3a024daea572294102307dc97c9e4c60debaed2c7d748f7f07ce2b8e01eda0c4578631ec3552c3107606bfe5a8980aca44b5b5a23a2a57d7206fc36bbe47f28a9eb662fa7538956eac37a299638e3c56b0ec71eaaa17119e5a02fdff1ccf849bd4db976213d9bc4a77fda0d175443ee61d48a56a2cc2e1c202eb22070092cac9746e01d4e05fc5a9c7354c53722e0d3cf55a68273d67bd0baae7a2854c9e0c6661bf7be340b12fa00d00b8d1b753adb8bd2083ce3d59d24a585fe72799e80d2ed18d27444cf538cd441d3cb979295e6d083c08226bdd2048aa3a7e34d51362af7242fe32b2bbe04a8182877902d0d26febd863c061a9e2eb1e4f4db06c5a8f3e252c548e8cb65cbc93506e19a8a1194770469e9c04eeb02064d19de96879884542e74c73c4191e996696d72aec4b25c54dbac486bd45e2f5c6abdafc83c4edaeb2b6ee436ed7702268134ed34da1fbff749814506d96bc01ae5b0e161c49e1837dc6b1dddb377670d0cc517f6e928c5c3d7eab12511047b5e91a53838d4202239b120cfd748c67a9671b247d4dc7334b14054bf5d520653275e64a05f0d6388ac5b88a33337952d8f1c8e517b8f807a45a375db2efb3a3ee76a84106dc7df30e17342c37360a09ab6d10f4a5f47805a683cae46a890121415d13cda5d286a38528e6926ea81eb4927a6c71f8c5fb398f974dc6f5d09b1e425ad13f85a7089e7adc4a9a85d0b9d73b67d8939419d48fc5d734caa5ab3e507f1c49af4a40eaee7f24e0efa1ce96f68ddc9ce51db4e49e832ae5eaaa909930e321981f510a8c003c85a6ef02f8a070ef83ba0f1458a3ca4679c8983f321f31683cbe77ff08e407be344466a5adcff82566500597fd93ff679df54892d519260f2ba046ae78f6b7a57d2530b1cef9e4a45e664cb324e5528832b50a13a0fc8a8b47fd5a9764c71fa2a3823dbd89251bb5aa594e213a94fe5f9428503c7267e3c7af3865846cf8517222927f0566afaceaa5b518bc69639442744c14adaed3bdcf4a18a4a518a2361c7e4bb3d73a7fbc794288d19e1c27ca227f70b5739d6d74adc7d55d5cd165ddec435572704cfa2e739a69bcd95a366cb24f022f288f05df439624a9bbecca25c739d94c29fc739574f59739d34692f76bad76bd2447ea8d775d2aeaac7efeacf0f4042e2421a61bff0bceef99641c15b4b165dd117b2d0aba17bf8fcb4798c5f8b0403269e5b6b2b11c2a91c08238adfd4bc6e59df66b6e531c095eb25a51b54e83e7143009827693a079ccecff637f2b408a52f4575af7b30d66d1c432efa79a0078e44eb449b787d5dc0393d9ffe5c1bb570e018ae67b2349ce659b5ebe6fe2ad5881b1e401f400fa07deb32b3147a74bcba93fc8b40840ee9785da69e1ca85a30729b9b27b2417d2bf097cd16c7c650f3cc3a459cb17deafd58ac34058e6616384e7e590420ed5ea363d690c7d1106676f8899ccf0cc9ada24320cd5f0e57573fd2120bbd7aa1e1e21fe174605a71f52963243ca8318045a27b38294710ad328791dd6a99c4a1f1e8ba621d81441996deb6b881751525a8cea3cedfb157eece85ce0b7a7036ed4687d43dd292c4e639a8d4d815c419da6e58b2a6d23216e692495d28f73475b25b5e0b77c730703eaf92823271bc96bb7155a0e522b074c8778bbc16eb5905e633283556695ca1846e9a9acf332c0aca89d2ba9e841d2870a8d61019e60f1fc0281a40e905acc0b10430ead7774645309dc375bd91ec87af4069b987b9599318127f27f28657f898e639241e9d6c0089d66d5c448a4ac81a0d3b7487d2bd66dfcd5c8b3dfec5be7b02bb32b022c8e12f50c0b7dc27b974003c60133bfdd2b414a9b65df10453bface8e2024db4f4d4e35d63beb437e80bb89519af508ad24e49f26e022fd76f1b41864a4ee01c0ad085dbbfacd1d57541c79bc839ee986afd2286ec7bc658cd506e1f8e51ea500e01e8f9fc657f73402143f27899407a66799a5d8f29da5d68bc781f853346a7a68320dbafdec48023ab9c51a38c88b22f224cb111ed8cddcbf02b937194fec4b1a02162fac125ee2b6dfe995efde2877e5b3e8a3d25a0072411ba15820800de1b39e3ee0131c3a5047bfbe9bf8323a49548bdb3c660cc65c1aa7b2e2a21f0a804638241599b0b842901beaf6e91e7800563997abe68f7a89d626540e917a0f1bef103c86b10e552b525a60b07e9aacdb4ada7dbddd66c473fb6368d5cd95d9cb8e9744ee2b995deba890d3e6271766622a5a53bf1973c97f14a0394d7b29f342ebe397ae1bcce36222c8be4968981bd7b87b64ba3bdcda39aed67ad2435e10f4ce15897be6af0b4406dfde2bdb06c3be0b6b9f2e6826b5aa4f8cc5e3fe0709531582d6c67f8f8961a265434cab5b5b28614cbdc2ebdae3b182df5d579f1540da79d884d14e654d8c91d3dec7a9a8aadc15d1d986f0ef61c9e7cd2954c2639aa8387fea1442b74ae2cacdbbcaba347eb5a7f12d5513b893f63cc8258bc2adc8a331b251a08ab15745684f52cc9f510c340a07d98d1caa792573a4a4352a744d7653376311e9a3484360cb6245f67e16ee98e0917ff1788935b9bf1003ce137e38bced6fb2bba609a20207a200d498310b3991a1871320012bdc014566e8154755fe82c80fb02f6b15a129440f5eacacfdab9c99cb789a4f620db2e837705536d855ac748426fe942c629aaa659eb3e28d080afe923d326817aee912df35168b439897c4657337f1eaf4c19b0414f0110ad672409c2dc4e550b4aa1fd87ece807ed0fc3f50114f6d5f8398b05e1e3ac066dd25ef2476b20f4795173b7416de8641c63ff3eb25adfdf5866ffeeb7b5c0f621e00d3859a4eb9096c52e28b58f11d4aa077defe01ab2fafea913f23f66c00da8a0d5b5eed27b80459b2070e14916a49da841c65009379c886d44bb66607b4ab058c099e407d79f8ef504420697dac553bc465b5f3a3533c61f0d5fa366560472ebbbcb250c7a7c444d1e34cdba6b941678c8f2f78213178101efb12ef951d0bc3bd93706b92bf963133376c64c32ff29652bc05e9399d4074704e84e63bac30329b038020de14c874d69d1b488890101582a2c7b51384e84b4cb0f8d62f6782e4273c9c29afe80ee2e99beb76ae614a57d5e9251688d44e6a6c1fc14757660c2f7b66659dd86a6fe1d945d40629ca48b7119af9200d61b4f5f3d59256956b9f7807c1ce3599f476da9be3733296d92b55e0c4c8a9efa7cd15d8b4b6ccf22d9e2a070252162e918263729b27e208dafbb64aedd5a38ead1fccb4cef19479d7fee24d8e5f58ed098cda88b283e2e579ebb2c8ca41732c510e1a85f6e6832beca86786206795f61d6e9e94119e51b4bf5ce4a3d835526b5c51340fd1fc26f3a0db8f56332208debf28241c004c17aec6964a0ce26b237c190f941c8007a0257686483c69f7532a04e611eff34fdfbc27ec8852287d58991e4d19904dfe12261498ae300a72ce3dabce2dc649c1c9f099da67b6b09221b555b450d043a2d08e25f8ad4c44c25bc3c5544438107cd4dde27452300c9aae26a27beb941545ea4365dd267545e5067839499aa8091754b12d7fd09cb5803d238ef710e847177aa7cb3c11b8d952fd1a174021c6be1025b30f7e38c00b9a4109f6a8bf9d35d7879fe6516e9f55cab66091941c42954f361c559be59e96ecc656f565a2982fa03bc3556e05795e05780cc82df73d3f1bbc29c1af1890efb24568265bab42348de3ba37bdb60cf8e3cb72b4b526a3f8be4061eab7989be68e262f6510c65b03bce510466178aefd197f07b9ef9407f71e8ea05233308a7259e302ffe4a004d1c6d30eb9dd8e8cc37d015e4569723f6b6fac487edc10db150aa67487b0350a1a1c8eac7178c1393d1b4e19d12c1396d54d8bda62f05c13cb9b0f2bcb1cbf3b6b327ea390d76f76eaaa310170cb61aa9095f782b373a6c532e7f5ba658ce111be9d11d2ef7e816253ebe2e2daba92fd9fd119712070917e6746c845e2808951ed983380e1380eb8b52b7c0a4f80c6075c7fa7af03ec279fb6cc5dfc0823d1fca8205be71f2d8e3c8c864e5613948561962fa7cabb77f3de69780baa9e34c4021e1b2ea1ac00318f6dd0b6cfcb21233603a6cad162d6a350e5ed5688ae9126952b04a2418b5353a402f1f531966b2f2cf2c43c6225ea75e1b02fb73530ee29cbc01d33b2da2197c7ed6883c00c371cab43e404abcba12efee3274f1b890515bb8cb183bcd08308449a7195430a9c0dc7f9c9ae39415f64f5f9384a984a2469ce9f7548ac4cfb64b1df398cfe01afc8621880a7c486265f2f5c633669a194c91dcd5b767659cbfecbbb1be00236267842f589e3e37fee07abf43d3cda46acca40213a7958e51873b12406aec037ba22bc165c54da1fc3846aa643a90ffeb770a07b8cb53f96def443253c971879a49f1eb1232a1d57891ddacd1b30b1676c0f06818940c8a29621d51b3a386eb10d3f38c03bb0f0196f0203e20216897afa4e44d2f4aa030226c558d8e5c664013b4a076e5256f74e48c7626d140751007b6cc0cf8a0238a931696e5723ba7c3188e50edaf2f60049aca18a21b197bd58e71556eb763fac7a3772ae2549e205b5028f8fe0c13e9b26fc5e11f710a0bfc13b31a5a0da6ce2ed88c5f58d155b5ec0a55124211a63dd005a93cf2784549b64619a901358566141060ef5f2fb884c13e66604ec8af20b0a96d9b6b5994bd5e4e4b9ed357ee7b6d8386b47145828486f1f70f632a22b875c0bb7f00dae49fd65e3e9428007d61b6421c117d98c6fb4bd67953bf50ce4dc425ef7cdd59fa3dbc250b8b359092686d9963c967cfd4064dbee25461ad9c26a3becaa95365859692db7f939c2f5501997a7f7f775d51b79fe889ad80025dc50a6a7284278ea852a4c6ae8d5c5d5d6c48811b6e029b23b015036fb7d134166610a6ea63622b1c288cf27364ab036c1566454484c19d72462adcc37e024c20c3a0f2d0653707f4817cc4f2bfe5c77eb3d2329d0997e731c31238277fc769e796fd253847c8022fd0e96fb196178c91b7bd9169210a0639a598917b11d1c5d5f4da766d1941f8444bc2eff6832eb484b1c757489feb0c8650bbc260099e2edb1c49305079391f76381f9a432397e370c72031a9a27feff6552f96ccd717a4b69cdab7d4ee66cf99303cbb8e9073d9f5ee250b36066f140a9fd8c90be2e4e66b06d628f68cf91a27032797ad61adb3264f8d187768035c12fc2534e2ceef8fc10f29c8aa37dc3d5265c7b1fe0bd6b59b050ed3badd1bed3a0f7e865f16c000fc3361c6e35d2ffb5cc1579d9bec1bdc266b2c2c6479b06f9e0c7b8323fed7bb7138bc2db8f568d313f79c35583df7ea39bb4adfcc5285107c43bd9a22aa8d6c51fce4b344e33f27f2af1832def045ba3f6034292df442e4ae138a89feef3baea356372425c7c7aceab101f0011e8b99d3cb80e729ad4acf7b4e959a1b161a481549b48a142eac39da428de12d61fc45e950dc0b2d3952ed119044507e8c517429ecc0477487300527b5e4942d6cf17cce0d9ea40c53b3f236534ebc0777bfc086724168ed2cc36c30d8c5a2116664187274ec1c7804618050ac748add82ac282e9a4e189b35777dac509385e03f999da36af4fc51baa7ecd0bf09bed36036ef9262277405e18a155ac875098978535ec58919d84c897575a650b632aed3cedb16121f996fb6cb4619d21d9ae2710a654ea47ccdcee9265d0c7adea701e6911c3b3621c413d3ba5e871d136029d87d59a6e76098ff26d661913145710d149c670c46e008a54ec5e8ae95c056885ad5ffef161f2a4bd08d46f0ca5b9313d2d1c4b5a5d5e86ed61955e6e96aa26f7895ddd58552a64f519ecc18e8ed89a2c39362808daddd45498b9ff0007fb700c3e849f50fd76030cf667c9f83dd82ad05564881cc991f0739578ab382bdaeb6b7a911cf7730808146ea6fbc0508fe30a54ef5edf1fba645955e370fb1dd2b6d15a0183167caecce36cc2649147ab4dd1ac424eb2999ebc8b4802233db4e43afa703c34fa7f9451f32fe1175263c56502920f9f1160a49c194ad6e93ea30181cca0e3b3d088fb5ecacb006a34db15b8a4b59557df0bae14a15670055463319405d4c4df8f059fca49a5970158cda3284c77f677a9059b332686775ee58cdb2f2e556fa446fff3f0124aea959ed705dae9de936bf60e03ab6326e64cb4009972cafd6a4cbe9c64db97d8b0e500800f5b9ed49025cff219cf237a59cd6601ab5028fa1bde98954e063215ee15285352097961a0d126777f6bcde421edad8364598d509c2fe2ab6cd38f718af3a69ae52e168b210d4455605ca4c3e6b68ef496cb8ed6482a5db62eb7cf489d70ec5ac73f298412c3882a5c921a615975738d0f5520805c11b07b18f40e4aa021def82109413920c16a2d121f49c64168db13bea7d856a39d52ed172820804e956786c0c7d712903d3abd41f97ddea003509c4cf4197d21ad9f2709d8077883a521402c39d6e454133cf1063ab3aee97cb7c7ef6630e719ae7de0c664e6719564da06ca49f3e9a9b850128531835ab9c0c55aaf570fa72fb429734a0fcccbda68060e164cdde2bf4f62c28bc19e81fb8422f4e3aeabc1a9d0afaf9693d47d5648729460ea6ed4b5e189a6adf65222535993bf2a110eba00d34150b90a1b7da463c50542da5b5dc88152692ce5a81525c6b99b956735e6952d54607e2b99d31c912041176b417d37558bf62c49e4a9c37e44fc263822a1a3ddaa24bfd48095839140d607c12533183e46ca0702e377df5268aeca66a6dff035988ac01f7c5b5002137964f5b9ed409712a62b522a78acdc80d7fe47262ef0084df6d76eecbf78a3ce3b9d22a4af76dc3cd9b2fbf2989b0e42d581523a734ea783532008d0370cd3d39c00efce9e9db1dac9a4e41443da89bfd5b74158eb5b836d9a813df89426917ea8541dce1665b4ca06f4a0923d46279f28f984ba833dc075e7e4f2d5f9f64ab7a1919a998b995a048bc3cb9b22e1fbb5340c3079f699f005e1b8506fe7910630f658dc827d80ce0cef2f441c5896c1104a51d57345168c23c267bd7599fe14a9f10301ba2006738ea7fc207a4d89f32d0471af91a61cdf6e7c88651526c16d41071c12ac0c77066e22b72057468ac1a6ab96037aa5faec6d4bd3a90396b042a7fa640307cda7990b29e65b39905db066c1461502f839319507e8a40021f60cd458386f5db3a838378066b8e61cdac1a2b94eb25f6dbc8d9850a66cb8676b375457eb0391482e161339ceb8845bc74db5e9219ad8e4e4e942fcd2828b96a7d94d4555d94e84a541186d9e51f492a33369bb9b45da05d3106b5cabacaa196f33d57ce8d8598f19d400a9505edd7f602f1b36f447a9f25835357cc5e68983c6e2afd202324977922dcae2cd1f6ad07db674b6410c90131bdfc3db7eadde9af81a4a25a0ac6be59cf2134fdb871c555d151aaef252d4f45f76a40c97599ed3ca133a9a3e4bbd20254e9b214154f5b453ef89d47a6604a395081a9ca3200076469f7db022b26c0be41859a6a7432525d91a7f5ee596a896fbbf3266b54103b02db964c86598ccdc93259b4c23e9ad446e4df58cf362acab49be78c852117a7aea8127b85bcf5adeea61ec00d7f909c8d658577d6a69bec9dc0621ad77bd1234e9a353f71b5f6dec2a554a453657373f8ff4433873c3a6e6fe515a0629aaa3baf62acd28e167537809d9e383caa118b2a9f39b6c2876f0dd720203a9df1d300a8b5cecb0a035aaeeaed0d45e361d0cfe223073ac0833d30cffa8890983f8c3e150f4ff2f2454b08c2c81b97e928b9baf1fba1a4e40a910212f9e46e53288933e172d796946830c3e335f30921a110cb47759f90d5d4c94279a4da301289fe2fd6e1588c62391ef05f1b943bcd1fbd2104253be546ba547cbb54e98c3292c53af544a62e689a62b1162998b7fcaed414ac14a944a3f2eab3b3332618a33558a478b51ed815204e9f58897d20077ad0833efa0949bca9d7a133ce1296a6d6e3cef7459b2a14315d348f27154fc3293e7bcb064381f72db458319c640ad3ad5e9a5089a53cd09b2685d4e293b00b818e3915ad4fd4e5877fa7e451bd51394eeaf880b126d67a29851b73782a01fcd251ad659781f85f824b35fc9182381c43af11fcf6e85a4b447365ab7cc82e6ca20f111de18e388d6aed44dc69c498ad53919399a67cb70139cfc52057d5389703773a8c46b11c8d652ca6c324aebd8a586b1dda39ad300e633010e36832f250710174a0b7c0a8d99a972a4101df03ca4816eb569318bac03f3ec49401a954b574f42a0f35c23e82790cb3910fc8705bb09563dce7ee686cb1ea4d50768bbbafd075d69d84ef210035bd3f9646105651245de336f9c7a048a3c470dc4bd894273f1a2aef146976e9da94153745a366e241651a0615a8b41fdebfb5d33f54fa2052edf3ea8a32cf5ce30a435fb691bbe30087324dd778502071076954a49f4922a6bac2db55faca7b0a82792d948fda28760dce91b2134c94b78dea48cffa464904dbeb8cd39e45db899691c25b7b9514883d8b26284e4e4d0ce58b6e8ce999e4d32b75df8f9842bfcb52fd1157c631e4c93baef04b976061e32121b7b29e3a30b56d8c2e74f31fe532b2d604f5f4c5aa3ab54e03d942b68719767125539f6aad4ec69c7f0c9967c018b9b29469018c673385101b6817483f4a00f14e8cbc51e01855595a789c6cdcb2e495172957da96c13de4b189c67f0112d848eb8bab18f1d169d2700a18cf85010ec76d84e26f04a916ada8b82f502921da3638b925854c3cebe6e3a088edba6509512432c1104da7f2391772c8e03158bcab2c0a7b5edf1dda88f73fb686afd40f12de983a58e40f7c4615fbd3c0391f43d4a751cb90001920933971eefde8a6b0161f10909f3994eeb253d7d1c8da12b452c32f99e0b6b2c8bd1c5cc0d11b7a11f2513bd5a5c4fecb95984751066b8dfaf9f4eb33d2d79af7df8b5b3c28561753b900c3606b93227819737dba1325b5fc6964b323664d85e38071be72cabb85252e0b59062d5a0bcba3939a8a2aeadb13c666aaba30c2c727bae2483bfae49d22cb3c939f953ec610136dde613869115d1237152f5b4b910548be3d20a264c64e36c9fd5d4367e5522fc00f1250d04aff85bc70fc3fb9d48dc904b5e75b812227e358e83f1801bed0ab14212a2721935869848f75afea86fa5b38f1b271c2a8a9f73886f0aae985edc737ecb0d2b77d5dacd88943cff688232a09041f75b9b63eb7baac0840a486ecec65226a16a243ffe7c87553c703c050bfb03c3e3a7574dc87bb6a4638ce3df50d7313d800b50d2ab31efc12b9f9d0b94103cfd2ba2f641e9bb9e83a3604723291a86bf77d4741322bf5754e9965b7ffb819828f9b5447af31ac0c965fe6a139c0aa38cee5b2b615d281bbbdd8fbb0d009de4ae5189645732d446864db1ca62c42a9a87ff1cfb084449a537346ad691be56b189ce7dd43658d9326a8ab7c5f5bb273b894fa8b0fbdf1c2854e510fc05ca156612b3f3a08e28a6261fa5d91cdbce4555b98999cf152bbac97ece818ce4bf25c48594bfa93cb6800c2b643ba87845ceb44f6ebf61572e68f6fa2f4f66508b1015c315a174fa870ff2c93ba3640ec9b402bdb72809bbe22792842cd706ea5baeacd8fc2780a2bba82f267272f503e5842a72f8eb84b91331a46a2ab5fe3f6ccdaaf810070b829a8d00582620f75b9df028607c89176ad31128bf94969a2497bd458322691edef8f2fb6ce8c99e99f26bc2ccd0d4da7ece46bad224efa631d2ab7474fade530510c5523a57e4c8571b45bd9ae921a7ffe488d8e120c9a6d2c9439a54dbc13c0f1ace8046822b6ff9e4a8e6cfd11b8a28917a8eb4888697ca799e31992cf330b8ddc12b08e0f6e6f4b5048098314fb8be94b460ce3f03585bbd65b1bff179f9526f1b45dafea141d8ddc433e1edc1df93693cc034642666598cc79b2a9c53ea8d7fb09c91961df8ab83ea25343f2735cb239f332f6b6fe8fe7ccb41a1a34b8e63a8d0815eb90fb214735279da745443590ac137b7556fa28978b62a0eecfef4f8395567a241ed3427edeb29c46786859857f8bc28dbe2ee74361ee11242ab3804e3d059c339a8e86fafe1a61c35a80d3090c856821da8561c3402ce98ef5d267d071b6ee8f8c07cd688763406c68f17850b7a90057cbd64c246cc3ad0adf8b00d42eb9a606170ce83058aa23e6bda88a5cd2cf7c73ce927033dd4beccea2c9b0393a6346b7f548d8b0b47e0d9fc54f6eb9241082230f05318cf57ae29f152e71139bdc4f7dde74407ca7980c33c5fdfd8bd3a7afcfb6b6a701773881a73828d93c80bc0ff99632f7e533efdaff26de34b5399412a2227f2d242b76fcb92fb29106cd2dcf5fb1981c14603e502226b09fdb9ef87db808c4e3f187a615315ff1b1801d74f4510fc41b7001f5111bce97d9552797892e7d882fafdcede8e086625d2304ad1a3c86a55030d0f0c54fccc6d2b02de1a9e20f0fe68d4bed1599f939026e126e193a96d7424bda1110e8ad10dd62f8e7a1b716d860d5b135c9c3c110f61131baf41dc9d97ab58a45cb8cd22ff87459a3482701ddb72fd8a8421de2cf1186324c452ee4c3627a0c86363974af59698f9644396d5574ec4f2cb18140011cd35775c054ad59e945601589ec02b8d6a9c3d02d259dc546bf5ba4a495d7572140d82c6259a3f2e0640a2dd6d54230980665c7ce83271140293bdf7191c7cb82b598d4253a22d6703d694d79e4f66be575e62c613ac838b5f1141af291b44b09d714d5e96a06bb46117f31c041d2af6ed3a3f22fe070ee843340bc950b807782b471d97e996da0102e62afacb821a409f33191d616568f90c900d1af5562ec938ea4de013a841e7a0080b26b9fb1f42b2e5d789db3b333713cdff882d02998766c514d9191b056b716f59a1b314b17ddcf6f5bf064bee70bc0224d51d19c7f553d100b3f6c165396e31de28ad691d402290f0b023457d3f8b9afa294ff291839dbf083086513d7e7cf9691857d4574462e0e290736151c4515c105c1ccbe928178366eddaa7d99ec0c290e6a87d41a8e8fdf8b4f64cb10c38fb6e06cc8683b657ed7270232920f44d5a83fc1ab95c27899717479b62440d136c015ef9f0644a8af2f75663040c56b2a3757c5783d612f02335ddd16e62ea40658971e538dc0019d3edc39dbc8fc045606ab63dbd2265340644471ee8b6befaa66015c1f1104d53026110ea85ca51eae11f717b2bb229301a362ebc2f92dc2ba0b38fcf07e86269e6bc5f45277b34f44f255cc954be8a8fad3ceb9dbbc8a106366d52fdeec43140b177c82106e1be52a886184a734baa3538dbd607bc73ad98c87bd1366839f3a6b10002278b0a7c772c17fee8a66d58281ffe03d660677ac0a720630a554bf9309540bfd6c6e8db7750b68a2d6dda5473c94f50d4d5105b51507166c03544ff92986f2b9c4eb3ad89dd4efd0034d6ef5bbe761f536097f7d6f6207a90c1b62efee155e30ec05ed17df60b7f874031e2b5d316058ff8bf464d731d3e6e6f72e8d147bebe5f1729f54a5c55968c85f7e65748162f634228e05bb4a178fc6d0e293bd1759e06e02b3dabdbb832f319e66b8db123efb7189198dc3ddaefd58002d54e29ae67638cc14953927a8026cb82823db32a2d08e2d7cb803561bb8f03e58eabcd68423f68be6d976b67cba79ef0897291e3ab693a82a5418d10a29b830186076ac2f9cd7610a8551fcb40ff315c19463cebffdcb0b03c10cf26881d9c1304873365d4922f2d4d4cd88c4c81be33831d7a553e258125d4669fec27c4863de0e1280246f405db8ccb56201ec3b6afcadc1470da7f0423c0ad747b9368688f921e543c8b06f75e36ba49e88165c28696f00fb6621fdbd51a168d36ee42d13b44840e8eb6805c7a6e7138cc317ddfd82184860be3d384a18f5d0b00abf339c00e5b1822c240410c6c7a6592e06f41d40472d09fa7f63f5294683697a50cb35d8466ce9c6ae556b2dcb2f931bb8593469c3f76bc62a56779073d23e516369e161de8827eb40c3a61cf442e85ee4a19ff145cd35f0734cb6d1d64554ec98863fddd456b11d8c20aba2ed5dad62c75ab1801882ecc80c289a3adeb920851168d944b92cda85a7633dd3b218aeede517fc25c94c2c5ebfe389d71b7895d17c10ac87d65746196dec8de8e739409321110e365a22795c367d891b68b2599c9622a05c53a4e537ba7967fcf3af2b488b74f0185e886015c4847f88a0c85e89b93bcb62092ff8e0203ab8b9c89e1b4ef11e045bbe00d175e8b18886ba03cddc0f75f57781483e42921275ed82c9914f9912d8d3bde6e857178caea2308b29dbf293928d893e9837516d1d83939ec9a8ddf243737a752a647fe43d2bbc61fb7ebbfc796a925f1e703515903c3c6e165d5b08ec78b111f2f458b8664026215d0e0ae47fc0cde95d5341d7ba8be1dc5d227d29e19b05bc9cd6a3a3aff8b72c8814cad2d01d3a18010eabb5fe7e9d5235663de1f04780e230c1a88fdd7ab554514314f0821758079c27fc10080e635dd498066c2a0a4507afebbfb4c1a5918c09aa5eaf31a8badaa813a79d2e6f63c553c99810d922ff4fe05278697266359cba14b787011625d4e3942854f728fa56e76625df64277dbfd641cad9884eecf8a28058d7b25a354eb64e7b6f2d365b85d2890610139d825e332a255584ab0ea80868dbdaef2f6a8bd2943299b2044a00667c5675001dc447f9db9474919564701a16302c64e15dec065919ac9d637831d401206fc5eb46254970e5f473f7400484c92f384d722316df9712f8b580467f150e1742d6eaceffb204f00631e917791b6257f21db6e23abe2f80b2e03d6f0ee34f87836f12a879f31749169a9d262fcaf5e15cc049ef48675526a2f236ec50350cdc416b5c73412c6f5b7207d425b019fc1304df8bc05757a0253793cc4e6eb2fe175824c92f1e30f2a24354761b8ea068dd848c2d17390f169fb75b4a5fb102b22043c251c98e8414aab7cbcfe5b087f47627d21c02d050ecfd5e53b3d679837ce5633c631001182a6f6f5ff911ee7932c68bb94a9ad92aa7ee275651aa0127154fb1d82f4263a32eac06e7ed5b0517f489e24cf31dd9def73dba1edacb01fe5c08de68854a32b66a00fa5210753fb9a68450a9202c2b84d427f76756bdf73e47d4a5b96a7e67d09988f0997c9a8ff834860b4f000f148346735b659c157fc99709d19a4a5f5e914b5b2b31f35ced5149fa94def53a1bf46bf4e5f58f04a7eea5f5442f039c9a6ea24aa6f5d236abe99d24c846cc8d1ca1309e924ba79e44897302dbab73d3562067fd7f8bef1a074e63fdb93a468882a2030f9c6405aa542ee3912960c92bcb28b8e6a4d10604e0b0f830150a49dfcbd968bcb689b33c8762f810ed1751e4b4cea353be9bac2ad81b29ecd47fe3837b6b755010aa525acd8c9a84f3eadfefe6d9cc609ca241cf718fd9353a66347811cdf7478616b5c10fd39d0696b11967ef9befd961f7fadde33ea1749599d4d558b65cd25411cac0e0109ace330afd31dad1d0a141ccfbc41fd28ef663158625c7f7933a2666b64104bbd8ec14c9ca06207d43b804591dd12dcde306a701fb3cfe1ef7a22a6f8fcd18076fa483250e40911a21d61e19bd86c5700082f6fd60991f5b3ea05d894385e7ccfa44155a3551346447d812c06d37be646475d5c012c0428931848dfaaf49840db943cd835fd9d831f44485acbc4d9de6dc1afa71b49d6767a5d411f16cd12452fc3037ef0031b76fb3dd52572991e3f3530a579f96252f6df173cbce7f3b4c135b99fc561b0d9db1fd082706746795b4d1424473699cd1b55570eec176300f456f2f837ddff9e2f8db2fd7c993ca08d77db3ce054c356260d68666e0ea7be21bd211f5318bf55477d4c2127b6d3b25c4d0fa4efc4410f5198b4daa9e4a0b723e0304703089af25186911d8e9399e5d65d27c1d310f485296bf2e743ec2332f3699dc277ebbaf54f88014a3cc883bc5cefeb7b0c01eecd723aafe8801f02770f26c74556ee6fc6ee923cd8f447e79e70abbac8e15531f109cb2fcb558280edae0f80b621b8540be43a6331523b9b47baaeaaf8d1648a69e74c2b90bf08ae583314d385bd6af51c97c339c6da8d01fdf6b24d2d7483581635f116b7b10228584273edc0aec027ac54f99adc39e7c2d2e348503aa7bf4927da1029fa229009dfab300df7c411010c49fcc959ae8c1f84aa81a889537717ea9ca7eeb337c95389a999bad10cfc79c4738a7057dbc088488b0c3b7b8b36661664a1cbb084fc28b05630b8e55f5da4734a5b84772a7654349adb34088711a92c59a32cc3a057ab56368ca96b230a1e431ddbfadf356f61a18f9147c00a84d64947a5d2494a79f4ab3aba07330031afce86559c26381063ac975aa030c4f0f4402c147a21204ea349f5c0f295782cd000466d3e010ac55771a46afe8d371d1cee482831b05b7a2f82df15e2a13c9bdcab68a25dc4ef91a219f86e29a7bfa36ca768fd1939fb549259c3732730684e8bf93c4bc3a7490c5446caddd91f8fed1fc655565a9513b4e2f066631c2720e003a5415005785805a9b1baf281dbe3e57786f3103327c0a97f10128eabd40b554efec3d91251258f4f19e0fdc6cc9962ad40717fe6d4a095728f81f88936fbc441706745eb52d31a93c9ccad0e227b7e7c3ba2e8fb6e75c309c24ec5554c3e79588dc211a98f9f7552367160d375534b3c0314911eb50bf1df368339b01777b7325a1d2d9530e4484dd06e3620c02cd970af8cf80b558a558ef1bee92c5d4261b61bb8f64cb90bbbb20047f720f8f80f841a590c36611228d7d5960b648e706db191c45db733e11b6861050d2549e596132d91850c793d444d816208c6cb2cdf6896ddcb1c1ecdc8816ae19366000df101067330969fe57a4a6f7a8cf94ecd3c4366cefbb6da30f62a32dde81c8e57dffebd1167d83065bccbfa8bb9b7b88b1820e78522af922c1f007b734990f696e5cfe059687bd10d31b64009497b01ebdd11e179c6091db71eee8e6123d1059e5c3c14f516d19d049eaf4ad4ec39c5db8757d250033df5591f84ac6759425b86c8cce666eb6c6fdf2f18773e843e97ca2852aa0d88a0721a52708bdf6432004052362ad147d49ef634ce9309b3669d05631967e5e4824c6f70b340e0d92f47e73ac6a002079775edb6099f84b36703c44828cb3508918f3b66c378e3d9720c92c2d3f2ec15d59aac2308aac49fd0a96e46613d244d6d40bafe0a7ca42c950024be3bb91a0fb2fe1a8213be765cab2fdb2ff993636826c116915ebc93ad753a1fe1229167275a65a0c090111ae41d0e9833b89295eb18674fb352155dc18d6345c21b68a04c1d3d5fce9e5c1eecde7dbad9ac6f27f70c1e520c9a34e7ce6f0b25573ceb5a6a2bb262bd3ded9a67c680127221b2ea39121792043b0c916b851f7000f00657753a6be9086e2778ba3b805e512e623d3b8d29915ceca90e0150cb858d243a7ca6c6999f8e7ba6ef8c6eba37bcc73fe41b2162fd97e59cead84f68e0b4bf09c511ba10332f26646226b6adfd68cb4da507cb2c3e86fda8cb44e910d5d2e72edcbc8e7fbf83ddaf408f4608191175c15e7507bffeb5be4ab02f629daf4ad2c1fb7cb26451a086074d769c4b9ba1cde8c5cf45117a4d92145fbb1e78b56fb46abf24e87cc79de7c22915c9123fb0e4fba3ffad788e598fb3b4e18c856be5c8e80541a72ad333360e8361481d295363b33c1f78e61ff9bd1b209ee3716b88dcc94da21c043d86aa446929453b2b3a9a4b1c286cb4d5bd49502380ae465f5f30c3eb36eba552e4b541f3e8898c9c178be5bf394aa6d345891822fb4294ebfa8c8e44249eec7106ba78796ae6381d44d82233a4fa880cc95a4ad84088f5717e7b261cf8341f2b1a98c58f33a2bc74b8f3b2e2620ed9957a5287ada7015ba8dd535797b62061b4c10d1112f40ae4bc0a22bb52b611a63d4be5080873a4637c4c52b4af699b7a9574b9c1d05113642bdf90c8a02712a851eb549d0e90749833e90cfc3b7df7f61991740e470949c993ed9834b6414eaa565c89406f1a787954f414f1e2134a95cd2e0bb0ea2a553ed0eb8731d63bd6c90b84daec37a79b3bbfb25d81cd63234efbd6761ef22ec8cd838dc775ed65c90e3d16214021de74172490a12b1eea9db4491c458bfe27e0a87bae67a09d38522d03c37411df2e515b9533f92fb6d84204c24a0f9b43c361b3dc44e3b2aaf4c336a3fab57ceba615a46d7e13e148c7ca4cb6fa6b7e095fecb894ee160fa1258b3c23d493e67f38850e4a96ddd5ff44344f27d3038355864581b9f07d9e475d0e9c4dc86211ac810a14f97f85a0a4c532cf10747355a3c5656e650781a0b77b3eee9b975bb1334c93b8b2fc0b06a051f6cc65616eef6128808164da3c09b490fb65bf1223940ae326e9472aebfb218e0e4ef2344bc270031e554f201fa348f0f907e12479ef477f89034e8bd1f8b4a8bd18ab9e8f0af2a5f831510726f4861a05b079db4ade20e02610820be0cf29905d92739f1dc9bdd6fd379c6d90deefd88b953df2acb4b7377da88568706c4ea4eb981e3ba43b33dcc49337982c57071f12e79accd9760745c9407d5fa05e4a2456608ab38d1cbb5381c127ca355491063b85a0285ab01730e1a02ac54680845b047e9810c944b3341835c850b59c643da9e9f00c32e5ac43f88c0b0640184f803ea2cf39f573060d1a803499cce46085d1c8f5465d0f19e584a4864390e07fe3c51c5c76369934d3983ecf78cc178fa5ede4fc7f7f29cd1f1e6f5f52286acfd9267f0d131de3a8d3fa4641a4f44cd08b791bdf7de7bef2da594324919ee09f009f309638e6ed7c71f7ae9566bb5c8084d816e57799dba00040abdf0006d66acb5345fcee79dd3353939f7a494977a2cf4b95a6b9522518b2ccbb20f9d739274d24d97e5a427585014d180bc22460803423fca2dec1617881419e4fb5ebebdb2c67c2576649b850591cc28e2e3f5c39bd8f244497e92b931a17b1a09c17df9833540bd4fd20e74992743dbb1d4bb51bfcc01c1b0f358288b7542186e76dd344534b19866b3f158ea07bb54d48d853661c8104ca89bfba2a62dd69a27feaffb6a1509adaecb3c49b5f8efb9cdc663117fb3e974bce76408fa91e728481412bd7fa805d2845a23213d6622ad3d31b7c54d892287c3f93a9d4ec76311bfd3d16c643c31f364e49eec572414e389de6f31cefb7b62c670448fded11e4ff7e3f311bb2f7320cec8170a819d48a4b1241ecb1248ae3784d5010b16f6b25ab40075df07fb86b8d4ed434240156c166cff310486dde2e2bae8d82243de7ef658e8672ed4dd13356d31a9f1bac5347d75b6f91b9269659197c8f63dfd3861fde27e65d1a29b299f2e2f3a206ddc20f3c43fff28ebb0a52c2261fb7f9431ef7764fbf3a38ce9bc403f4a2b4e94c4e247e9e2643f9ab6fc20a48d1b334f3c745d80d8de167240245f3d31d4844f41a68dfb426b9d7590edf674a2a69b8a99366e11176aba2b179a853e91e8989076f9f2c8de8836d7992a6305688b5e7dbd42cd731e8be639edb3bf4eabb22aabb23adcc711c2f16a8c87f43b1ecbfd8e677bdfdf554a2ca2495d3a6c7ff9554d678a8e5761bc3384dd52d495d3ff782cf73f1e11de555475a92ee307e3ec8f06c5c7ab2ad5767187fe7b7c12326d8484cc137f2142b6bf3d5d562826d4a2247f562866fb87c593cc508c85de0b8551d83744e41f12e2232464fb6b465890743c22d04666e35d5628e6b2c65017b6bf18fa42ad506bfb83b8fa03e4d596da8267367bc4a332329eeecb9a3d3d212b421e7dbd3421e116793426a61bf136706b3d444dcb6fc807d33489c7c20521f1a8cb25128944df1ef9ef3f79896c7b1d0fc80bc116ab034f34f2b100c2c2a3add697bd1654f8c8bf8547592c6f8a6ebbf0284ca652646ebf4757abb0fbf23684dd505055d636b79deeea09edd154aa93a1e6b5c7c2792d769efc12be975fba07e54f7ee9709df7fea66e9169e3b2e6c98a9a3632b1d4f6223bdb5da621a524f139bfc5341f1bc01fdb3dbae371b4466f645e70d489171e459594949470ba2f6399d7eb5552a4c4f3580c060c18303add976f8bc562c11002c3f39898183162c4f0745fb6aa542a15c3a788e1398cc3c890214346d578e67e92e14ef8c85f86e71f8e7e45945064e4cd584c935fbae764cd7c65312f336607a18b1a8e3484e44d184c865c4893a51c699e93ab1c69489ae7b2129af89cbfab9546f3d3dfc7fed8f0b9419ab8e61bb2c51c74d9fedc0e9afe6033c80ede74f100baefa18bb70288b7fdd560c81a9ae7fc18432c7d2cb246e74b9ecd1b0290c271ec425262c2279ab7bd91f1cc8e27c65306ac6da7d97e4dd6d2c43e27bf9027f6c50c438eec7f992447d6449e6a6cfbe3e60d416cfb1a9b844dff002ef6c5bade49054bcc13c86cb59cc789c576535be509fdebddf07da976efe6658a31c69d971d246643e02470a7ccbbf15e9e1b9fb28c82348f45d4bc21b2ad4142387fe3329527f6b56ce5c86a9264dfbad5bc1b9bf65dc6fdb881c41f4ba60d6f8719289a1f538460b5ece5382f9fe370381c0e87c3e17092d054eed38d1cf1db7eb0294020babf0680f925e97b0e97a73cf9de662a47dfdf8ce5e8fb2d7372f4bd964139fabecba2247d2f66911c7def6517d2e47b8f77e34b62777e7ef578377e773c1a8a473455a365f8940b792c2f3e42cf08ccb9470867985bc2954cb388fa837523d708212ee4dd107532b42f62d1f485093791c76249a627d71384d3c6fdf1da49a70dfcf58379a908e1fc6a3d16ab2f4c382b1327f6ed37c4475f6c3b11f0d55ed2b6ec2426e96a8b3d6917675d29db1b8c8b5fad38ad85b6bbccbd0da9a780991a42385fd330fece63c1f2fee6a2e3b2fd19dea12e57ab814da91cd9d7de8dba35cfbd90d6efdd1acd6919dee76e656254694bd6c07f599fc7725d2c4d08fea29a201cef0be797cc3ebd916dab5ff7418fe55a1852d81841b032803072da012f7941c317210c185d6d09477c2241387e302dfbb6d46ae9f483e9fb83707a09638c61749a185ac5bfa131df1ecb075b0d81c186f0e8cc1019cf1b82db9e981e7c98bebc745df73731990cfdc1a218dd5771921218b772dccddace7696e1bd59ef46b6efddd7568c3b9737eaa69bcbbabcddcdbbc149edc318468c9b65a0f037ecc34994e4ff3f3fd807a37a0c3fd8f6dd8f21c3e26c37ddddb6ed86029bfee6bbae64f91be2247febb15cfdc154e1fcf18351eb534a2f6d55462acb1e214ef2cf9ed7884f58c2b6cd9e9727060a4f8c4788162b29f1585e7848d84a14f34b3c96a93d424610daa77a2be2231e78697b7f8f10cf6bf3246cbb12b6f574227b1395bdfb79d449999166234349aec48e6c6f1af7a310a650be420e6883f352da8d0c35796258d30647dfd73cf10f453d863426636d7f0141df5d56c9323cfa238fe5fec823c2bf7cf796abcc642747f53d2ca7b68d461e7d12c9d657f16d7ec5a41d3a92477f078fe5fe0e1e11fee53a5b4ef3344f3b903a196e4ff258b4277944f897e9d6913dcd5709c86c576c7290275b112e73a8eddfc55cb63f096fba6afb81edcf030f1efd19335e5228c93fa50194e40f662466cce84c3c16fa261ecb7d138f08dff639dc7d2fdde3fc923d975fbcec374fcc7d4d1bf6344ffc378f2766bcdd53d20ec2f9346f45381ff6346d6c729027fe4d6cff4d8f21f763fb15d2c41febd3f637f186b0dbea2d264dfcaf0e7ab80f83b44307f25e424af2bfaa70eec043874fbb4ebab718081486fa01de8df7bdd541c6613b357d30f9b9419a3c319ed777c5f6a7d20b9bcf0ddbdf13f312cebf5f79e85cdc8425cdda0c13138fa58e342df556c447fe26b8879b039aef66c649fe27376f6436b0d2c8d99e184ada9ed20d6c238383d0feb891d93ee389a1a62de6cff9e083c7b2bdf4b618f681513c96aaf109d38dcc666603eb782cd79303544546e0b76f3505405beaeec4b328d507ba2db1a94b927d1ade8d6ce3ecdbe697ec71d65b1127f9ffe0b15cbdc57c10ce1fb7d8f63c3710de1154881a9af0c0bee306367d79a36efc5c10f79dc79426f67798d181e1077a1d076ea09681f85ab08214f409c4777bdc1cd2f0983de6d566154ae0a400422aa5947adc61f7448573cfe904478f10ca39fddd7dfe981e6e0f3d44992d74b5e9b4df6533f3fb639d5689baa56b08705bed27d92ac2005eaa7a82ae33ea2df46f0cc2f974f5c2c912edd2c7cffd96c448adb52a73be103ea2dacf1d76db14cf3a606699cc293ea233934284fe53d39c92b2a91025d752aba4ec1494149a12fa08e42349bdc449406ca7f63aa1d6ccdf9d0917df90a4fbf267e86d212831c804f25c04121912d9001a0903f8e8ca997d3f8797b2bf5f84019098019a35669f95a82e589cd8f667c1fab4c29028b23e2aa055703eadd66cedf1d302b9b67fc86a81b0cf0b14137960fb6f9fd676d61e3f2d91e5a23c680f945b230c61103dce3c3914ee5280010c60d8b40108307bcc60342bdcb5992f7ce10b5470f25f4a6aa23388ff572194ffd59772a2442be963ce56585f85d67cbdc54f5eb2eea3c54bce023cc5ae8f8b204bee8259d4e4c3d71fbe3e8691354c1c95aa2dbb7e3d49935d35810ad9f5291764c9b24ebea27cdde12b0f5f7bf85af295f475f4d5b6f28f23185fffa5297b5192ebaf3f658d192f9ec6cbf8185fb5b70809af0f6fa1916f067316c852e60639f2ef5c28c94b5dca474d90a5ee0672f476b5c74ed5dafed98b9a40162579f6e2389d4332f27cc5c44cd8e6bd4c19ff91e9e2bc97d96a8929d047d3648c3c968f4a67cf0bbdd2b9f37d7cb07c5a3e27243c314a722d3ee12317553e729dc592fc7169a1247711862e369b15943c59decb84d159ae6879f2020882a126cc3a9d379f9327160a89c418d125c2882b5125a644174aeab468d1210161600c0b1633454928107489a8ee3d1f8e68e4b90abd97a99a1a8d66236e74d668369b8dc8114398ccc848d6625192c7602f9920356f4451e474385da733d843fe9c621e98e7e591f97c1ec4922287c3b2ea882b4fe7db35bfd0f81f7208e6430ec998d0f8cc0d194c64c19c28c9bf87ece1217b6032312f170ea70393f23cd005c67810a0cb03ba40976ec285a3b3e7c3f3903f274fcc23e381f910861a1f6064b1b512559b4d16dbfe2827259d4be7e2f18850b0882b1f39144053d24f54711fae07931779fea8f3a3ea82e7a3ea48e00e2a19234f49f678bc970cc474e63e17fdac6038ee53a2b3b62fa8822290c44be76cbf1869e98cf70d855e843c9daf0c192ff2585ee8ea831822efe5df08ba67e419794a93fc2212d06579c8a11d624639f49226dd0dba9497b81f3b3088936028c9ff45065d3e720fc21f64b1c4948f56e17c153595bc7f08266b68efbb97255a4c89297d2be8faa85c3ad7179994433294e4e2134ef2ef549fd6674549ae692332f447754777c463a92c2d3a5a45a84425626e31e5239da98c2cc6c8a28a92fc4116c8ca2425a9c414357db24c4cd5cd85920c6ae1bd84a1ceee42e7f9faa5e46f89fe40f1427f541f95e8e3e98838a2487feeb1ffa74966791779fca0465ac5189280ae517c8d1e398c7409203125a6409798a24bd8a3981a7f8f1f154823a6460f1b465ac5f71153d9f8518d21316c7feda31aedf1a3dafea398dafe272ff9f0163bbd222476ed5a648a56ce83ea0b8413eeb4da8b336df3b8aefb3a0950521219a0241d2a9817ca1b134e2f01da8a01aae78006c468bc0d0154589b19a31110282842845e4a8ae871e6699ee607a6a9c662f3148b7d9e27d6d83cbdb8e05f85485395a1592b6b6da1c6284bd6b04f75d6ca5a55a663eb10bbc282603b689ee63ccd93879a700a428dd6582ce6232d84ef792f20d007e49c30048dccaee585e608e60904d294b55a26d835968550b6a8a9c628c93fd6620912f2be8ef35cc410a4b63f77ad108e32e6b4da8b336d9335b69a2f16c2b1ba94985b89b9a7ce60a4490f3015c2ceebb40520e17240036222b07949bc3eb09345d48a8140411122857a9ecabca60c6692a4fc991961ced2e6aa4b90ea739b6704dd76f358ae1442099b809c2d536cff1cd29401afaeea9a576855171532404dd52563d55505d7762b8462b785eac28234cd96b17a613b4c08335ba82983d93c1691ce6c0a274d6f8e28c99fc3e1749c0404ea743a9ec909438fc7bec763b1f2d359184a7285dd143e7216d519ccad420623b92eb5e50bcd16385932d2151b865867754a932a2f15c2f94ea77ff65616eaf215c060d3ab972448267cbd5ca09649e5c3a94f3e9a421258be547665b1681276524a29a5d3a50b9c2c89027fd745217d765ad354c06ad6d29f5d962b58b396feaca20478df7d033cdd00d9c5420bc858f65266f758e9b1e2db5b60563d4e1fda873ebab739b6e58a943e8c3db61da2c7a672258fa0b9af8f3cae67c40f9b9e58ba6f67bdfa58cb512ce197524b29adde975d2c6da514575b450747e5ec6a9dd2da4d497269af26d3648680acafe2f656ead37e529ad85a43c0496a8ae2fe026a10b52e20d35392340c502ecb51545bebb4d57f36a0250a0ba46c1c3be8c63fda3d56b2e72c30eb40f5e8237b1144618194bd83fa50bd7a44f4d89e65b962471f795423c46d8fa09b46b184634a69663fac97f06de9b697d694d4ae766990d003fe9842f2a364c9d6689cb175e8ae450b1d1b5f49f238efa89bc50ac251c22a204dfcb92b8570879be48a3f27bba9daf06b40c222a8699ef07779248f3af6c8c77bee661cdafbe6383984a6b7ef383d2631f23ef21ebf8b57f1eb79dec7fb2ecf3d927f47dd2e5cb890c20eba6d1f7e3ef4f92bfe27cf1dfacfeb51c697743ec65f3dc2f8121cda6faf3dbe3152a777c4f6da11dd73af89a6bed1694e4b15aa8dddff17a0f3deab3802b4e7740787507bfc59cb2323bfbd96471d475c2df2fe6e59e47da7893c7d43878e7d5feb5e739ddf7e4477700837bda3e6e7348ece7b1a47f8db8eaae91d7577741dffab67848bdfb40cbd83eefba2dff41843571f613dc2d03be80ebde8dd3b40e83f2fbd0384b810be9fedaff609e9b1035af7c9be3f07c0ba6a7a14fd0eba3fa21e7bec8f165ff42a5ec2f94f16bf248b5e84f192a8c729bf7e5ef4dc274f98b9fafc3857a25c22c5ab38c705e76a7f3367ebd8dd57d18f5d1137f423cf8532eecc8d4319dfdc3deefcfb682494e72e829a363e3232f2223d66de11239c7fad691c1cce9671dce79ed338f76e19e75107e8a7f61ea4e5264b276d388ff3f5779aa6715c17f75eae765ae67ee4fe023d70d67ecb5dbea17943dc2d8ff35fbc97471e1bebf17ffa68fc9f9bf32a94935d7c49aefb451e91d8ff3a8f3af6ffccffc119ebea1171df02b20e7a8979a3b35d7c9e271fb948a54e331585f03e71c33d57d4345db427b4d962802ac271baece9849746b986ed2eb3092fa12a206bc85d3dc9420a27f9638f85e43912fc5893c0e4b9ba37f358348dd33025296127d951371619b1fdfdab97a8bbea8e24d77dbd2cab2af0fcbcad107ccf7332145f72b01ebb8defddb6c7ddbe1a07fece8f736b824c26ee5fad42b7e8559cdb2c4037d78139f417fcabbda669bf817a7ba9e5ab69990ad5f27d306f39f45cf6e8716ecf833f5b42a19f3fbc047ee8f19c029cde0d6e6fdba66709e6c9f6386bcf7df2c579ec76f79788ee37d646f2cbe6bbcdabd0cf739b0cfa4bfa741b13d1011f67d12337f8b304d386dce07730a867387fec0b85104f297cc47dc83dce776f3f6198d818eb717bf13931cfd51342fc52dc22543cdcdceceae67eeeb9f292f8fe530a37852e7e75d3e6c5a71e8ba86788b237d9004ee2c2ab8be080a18ffc57236a028db6e32f9748e99e11746b5f04f5add363a84b1cb0ef4f5999c8f0d52f551bc0495e04c863f6b03c660f8fc7ece158c60cc8bfba297bacc71c1d576ffd4158bfd66e575a031d0f2ab312c50c7ff888d64e266cf1d1ee74e7224d7a70b3dc2d5e024317ce6301372a93898ca85466d74ea79343691266de01f0eeb24e8f1910eb8d6d6f886ecb74196a5f2af696a17c04eace25eb3a170dfd8e52caa1debd1dbd1f08829b266f728772f1511540b0a35208c770f332942bac282f498a426dfaa097006d25cb509913592acc509c4613bec663096b05bf7e53ececc70ac5a6bfd1e8ce859268d7848f501e0b48bb4df67dffd96eec36dae1acc4a42a8e02440aad28afa85d39a7cf8a2fa0313430d1426351a031abab4c6da1311a23428408112244881021428408112244881021428408112244886c33dbcc36b3cd6c33dbcc36b3cd10d966b6996d669bd966b6996d86c836b3cd6c33dbcc36b3cd10d966b6996d669bd966886c33dbcc36b3cd10d966b6996d86c836b3cd6c332892726aad3907675beadcecb13310dd9b8dfb1d67f2beea3107675bec6208ad2dc93e461e847b6f3d96ee5ec798765b892bb10468dfcf3c168ed2fada735ad57c4a4dd3a856770f9ae14a01ceae9a733b072e4f0ba4b62815beb9b939ad3feec7ef396d3bbba347cefc90d31dcef598b239518f99e8f950d4638eae633b0fe60e0e21e7c71c1dcad6de8e9f8ef67e7a44e0e87cdda0c6c1111fecbc7dab47943d417a87ef8edee19bf39e1eabdd53d438380f1a016a1ecdd1383a1d2e7b2ed3b71daec36ddc732adec9d5479b9e8f637212634e7a1d3d32b13bbfe5f91366089f396186d0e9cc0eedcc9f524c1bf4c70df41c08a437ca715c9e2fb939b99f4f593e7aecb13bafe273725bf67c2767f4a7141e0f7dcf538fc523e3c9b4d31942b7a16c6e046273299b9b43989da9e710e6c9f696935fc20fa969f31ebe779cf69accc9f0e3b84e87cb3baaf71d27bf6c5ecc2f9af7b2cc9ad6fecbe06f7208e6efb53c5b7e25d4eeb17ccf7ddd98d92f83df65ef67f6c7e38ebae710a60db9270c0fdae3a36015957b6b7dce5a6966e7e4822721d3b14326e8c5260e7e0ef7d8d98336ad6e4a29f73e784db336c374ea1dd9d5b93b42f3fae29d4d552728ca9bd8f567cbb431f7387fd09ff7a7ceb697ee5addb87be925ed99ced1ed8cfb4e6f4febce340e2edbaadd35fb8c6abb8fb0dbeaca05ce7379dcb1b90ef8fde6394e7aa11ebb1d7a449de73bcf7fef095fe48499f380b9fa68945df89d478f3bf6e67bf9e51cdde6bc0a1d73749c597b08c3f045da7fb4ff2ee779c9fbbc1602813ff2249e0f7fd3f9af3bc2f3e1122ef6057aeceedf4545c8dd6911e77168be7b8ee6bbd774dfe6556898c3efe4b17bf905005f136604847af37693bf0f33c7bd67c7119f1671fef36411e7bbf77ca7a3451c2d3e8ece735eec3ce73b1c2d7d247d147ef83bb6e7c33ceed0e4b1fb1b821e8f7e0b7ea87180afd138441fe6e8468fced16d50571f857e237af92479ac1bf4d733627ef8d6bb21d23b6808fa115d7d04d263f6d53bc0e735edb98fb6c9d3bb413f8ff67df4d881ad7de6b16caf699bef438f1e33edf334ed7d26bdcfbce4e9717e5fbdd4fda7c71d94d372a669bfcdcdd3bd276fffc9e38efdf9baf9ea25d06f36cf6df2c7d19efff246fc8ee63b9a0f5fc3d9df83ddfebacf73b2f7d24d9a171f94ab8f34cf798ed674347aa33b8d63db34f72af4f3dc01b4dd6dd9f3d2f3783679ecf6e6bf3ceed85fe7ebe8cd86b4e9b6e7e57f79ec3a8dc3333ddd73bef3e4b1c7f6741ecfabb8277b9fb9df3c597a05e8b1459ee7bce735b9f35f0ebfdbbc277f1ffef71dcd73328e504b1f7d7bec5e7c15bac923f8dcfb96e1e3f87ef3a1eeae084537bedffca7a58f365afa4823813dca07758eee93dedcdb363a60c7962f335bb7acb25b896289d919e99a304f92d501f9dbbe505d9de494094e7ac97676cad1b49347284d3e341d05fd6c1e1187b0beb43fbfee7bc3ca2d5142f7ae9e61cd8cb0ba524a1d0a4e968c2853d33423bfc7ecb5a9b3c9f99477a3482124f111cd73d75548020e631bdcccb6d4757360b63939dd3f3933de3367bb479d18e0a494236b2b139bf6a8b3029c6888b9a5ef39e75715ceca5195d461e6733206c4fd566d50faa2dcddc0ce2e4755ba7fdeabf8b6bbecbb7ae9f3266ed979da0db7ecf9776b0921943f6e2dda819bfde229ddd6fc92fd966d2d4a9aadedf2a48692447f6b5113c8b5277d89bd1b3fa5d3af3e7d7b7d5e7bafcc5ffdcfa55e7b77c0c99725a3bfea5cedd09cf2c7b97a71c06159168e9c1c731566570c59877fe4d4ce47ce630bf6a9675d3857db5e3b57bb3a0e3859527f859b9dcd9948aef8ca5549f715771e5774608a84a93854e71312651ae7cd2b42ff1799c7f8cb6560317aa2289aa22ababa56a552a9542a554a4a4a4a4a4a8ac42cc090e301c9c062a7165be94c494949494949e984482e2c8642a15028144aa552a9542a950e57f9ca619ce52d7755140a8542a1502a954aa552e99030988449988485441d0b17a8974aa552a9542aea288a52a9542a954ad522cf130a8542a150a899852108f43f9a3093355bd33563e6cb5128140a8542cdd77ccdd77ccdd77ccd57d61d0a6c24f32f508cbb1c95726a7141a554b465ba5c2ed7a3680b0a65511545512fba794558d2b94b4a097397eb3103fd5bad47943dd296ecd5424d1a0c97300481fe4723149414da224d3c849169f6590968824b0b3096ca8a102850a042000300408d00fc9052fa6a8100f192e92b06d2c38f334a80f8fa2427367cd834bc14c48e5da19d505478a9534141963a1ea08cdd0ac8f66f8581b44c7ad063789243347e38a1418305fa6c9b6fad56a9c50a72923d52b44e72478ad613aad40745452b649d64f187fc59cdf078668c8cf8484b0079ae0ce04400272d56aa05c4156ab1582779b33fa90f2a460c19624c848931a24b6c892c7145492e78e0c1c5480305297401633eda61871d56401026c2c81a25f0f387add25669349a4d8bc56a9d64cdd66c361b97e8e2b44416abe697edd20203c66b322f4a72140fb44a877bc80f3f6c44209c168b7592c100a05c4e2d3f68fd8253a4e4d562618c81b45aac560b88cbd5dacf6a9dec5fc92217952c6a11627f7645162379c504207f5094e42e2d9ed8499af080858a450bce1017628cc8fa7f10464931182c8330d8890f2d56ab75923d95af913fa90fead3f27191262a1ecf7f3a3e402aa248238b2d4a1a1919d14edb7f00f9031340fec8fc903f2e94488402e20ab558ac00e84fab25840f2d56abd5ea3a9d0740c9c32afd7092b9cd0f9146feb8625a1ce7b47ed09f56ebc487939c6d1f4e7ca091c195937cdda47991c722b268d8e8c1460f28b6461601208b52722856caa2933401614ee201a7e23ad010efc76f055ae1a418f0e5a38fc56a51138df717b9c81a27e1832f4516ebe405beb63fc949ae3e64919592452d3f68910a3fadb6bf298ff8984d6cedc76ff591f9b87ce4dbe65b8b86feb45aa516abd562b14e7e781a590c228bad17b0153a102c6afab45aac16abc56afd7092fd24cfd6090d1afa03c407fd69b54e7a4031f9f9273d98ccc8e30766a4558c1d298fa311081b39a7f10383ed0fe3d31a47acdbbe8aabf8f6def776fb4f8f3bb4cd71334808656890ee4b504a22b7e3efdcf9686ed505c7201cb1cc0e42eebbe74018c8ca2d4e06cb8c9c4c8cccb620cc4bf6c393975cdb0f5dbc247230b6ad0d5be67bee0e507fa4da7375935cb1224cc3c37bdcaaab80c21328cd531c47ab70f758f511e842b3396d643ffa26dab6b92513e80043456dc27dcb7038c3bde7687763e1585b7cd7d33bfedf6a4bfde125fcf5899daa4e6c87a1a46ca7a809cf3809c67191ed9fc243b67f4a009ac32f0ebfb8cac178690a37cdaf27fc725437e68064416807dc39186ae28038c91f6bae95f9c51577d54796597bb11442ece2194177f71c5622fb1dd9c64f3bb0ad4b13eeed3bf75ea79d731f31fbd5b2cd2b045a5738177e4dcdb5fccbde79d4933d551f5ec2fad20df291ebcc5201621a0e4193286e4bd1c06e64b0991bd8ddbc36323f5e4d803f9ce45f57767555f46b716922f5c4bd38c3d4b31a6cc9b22cc4d242ac6d4afae1cdcbdb5b118ee3384e4a39b9bcfd4b9d7893eb7bdb4c2a954a8580d44a27c6f8822e608bc7b209430ac2914badbc346ec2b0fdfd091740ca4baa4d183caa2bba6cffcd6b13134f62cbe6f5f2f08f3815a6b8948f5a77f332f0e9639ccd6ce2d77c769f5e0fdf3521f834839f6150bfd4dfb8a8c97bff4d0b5cb5b4a4542da93b3fc3d6faedc47855509a802e172ebbfe5f8f853ed54268ab9526fe3483406c00b6dc10da1fc11611201017a00b978d5d1b66b7bc34670663b68a833508c198ed0fb2bc04ae36b863bc68103859327a52dbc72cc32368725e5b405dd973128551de8771965a966573bbaf792c57ca1c15b57d13e241bc3c887103b309c9b20a83fad9cb47ee9226592ac64b5946f506a6e557f06f60bc34859bf0944298eb17b3fd5d1e7529405bc134c806c65aed71c65bcc660a0f2208982d6603738210c8e7fa8278698ba126fad9d77265264d6f42b6181f512174d70e39a0d646a1107676db37bf682fc3bada38b3645bccd7dac050176a0383dab84813dfc07cbe81d1f4d7a22457e85f35af9b39dbd9975dcb851dcee0ca7ca16ff38a6e21fc5a316a024f1fdd2af5e9495dcf1bf4899a4229256acb9a2af26283c3813c99d3e9b7c3bc89a124ffba52a59a708253414169b538dcf3ad14db3998ed1c0ce656db35d3fbb1b68030195c5150f5c34d206afb832927b67fe8fb11ab38958fb6cc3da7f1381f6ea2324ef24709d15a34a1b5406d7fad850b122d5a282924858fa44784fca95d20f398e37679aecc2cee3134c50ead4230db5bacb687565ea2afc9db879b6d889b688c93fc83041122c40a2b6666ba215b03c2594aab577fd2ec5a7b31f6eae35b29d56a765fcb6ead3fe6b829160c54ad6068cc85fecce00673b542c5a93895ad9552ced39e4e8dc33ea6946a1c7366d987a7debce0108656d8fef75262ee31b4c2d9be967959fb1184d9fea00b35d118e7e0aa9e64640d920fff96554576a6bb6c69d627e7417b6415e482d7763a29865113d6190cc7613a1d3261300f0e349332188661d204bf015669a5d7d2d70bc09124db93ab36948ebf9b3b38585b27074e59a3d6984f351a10c997e0ac840404a2a4cd62359ab9959a911928af39ca9e738f74dd38c3bb479d58079cd7e0fc89a0bbce93f9446c7baa60db366d9330bcddcd6e5bddb68d6e9b6fdbec325963e3b4ec9b33a8a88a929189c5b8aea39573c5c4bc64b60bb7a81442bc8d40a08a7136a2a0a048133300413ba95150b40d6f5c771a51eaa945498e5b5c677d80928282e27d5d176a3a8fdbb4eeb33fb714501885e512695251994e4dd9c8be59ced884a98681ccded294235b31c65996499c5d8b5dd6eb0ca62dda9aeeb4250422bc9410cee7ec1461374548b3a7cf4dee71e8ee8a50d34d6cfaf8c7a63fc4acc3f65301beb2b92b80ae504a155057b65a6b55805dc1d95a6bad02eeca76efbdf7669e02f0ca86531425f3baab188c05635b5c2ddd19211cab02b297ad6ad10dedf113a1e918e9e123b42132fa588ff7ebd33b7220b673d496b959e82ba3db0b6a4b6db1d65620505252aabdb4e47fc66874319d242050f5d2a45698abb9923534fa4eb38c4a930e4ad231067b3737bbaca39cc57607d5f0570d6b320e3a24c9ff02d294c4eb8a245e1777d9defcb517140e7759a66d1444f2d9d4344e0e0e07b4d7669da64ddf1ced34faf236563ffb9405cfd245d1362e535d77f8886e4e53bdab75f840d6fa5dbf5ad6695be6a12008307041105ed0022068121fb9d398f977ea18dc9a2b3853186db9842dbc29cc0c197d9153fa37278551988fca10cec7afeaf4072ef31524087dbda80c95a12f6a2b862943c51ac360180cc3b95038545aab89934736687f3cbbb3410b6049aa7fbd1bd9ce385bdc1cee6ede6c2eeb6ed66c4eeb6e0e37b77537839bebbecd75ddcddee6bceee66e735f7733b739b0bb79db9ca6c3dae6349dc889ddcd77731caed3793e1da81385429f7d893570a549ad1bd8d4651035fbd0ce68ad53564b7dd64a6dbd33c093c236854d6fbba63069e2030ac359a88e5fead08384b30e9c2c195bac36b542f888d618582be5f49992129a9ba464841cd1227c4461c860f155ba54bb8ed585445f9444bffed7af296aca2d5c7ca545b62886d52f483e8523c92a4242921f5384d02a3ea28f638c9025bcc132921eb391a61ffac189b2cbc81e184a5aa940bfb9fc86d5fa6474f6c45ee4cf09e34ccb44b96a9ab6719b28db0d237b605621ca65d3aab586a87092c752f50608cbc6b56921b1615112fd667c443f51c6aecfe7e329e22491fe9c68885583e459e8310785edcf3d43582f85514f111f51265c6a1314b63d311f799b446f60d2c4072aee89798a7c4e5e921e8bdd284c04136920505062c48811eac8a24ca4bf26c0573c2d2f74325b94ef7e915f4a5eba29c4a224fa1f8cec7151127d16d9d3f282f8f4718cf89c954a6c6991c513fd108b9a3a1d4d173e196a2a79fa9b95ac217a5aa2f3a8a394928040d48a2cf5ac0eb138215688158622cd777f432c5b3f30d47cb04d3f51a6bb45deb42889fe27b319e224ba810501619e58163cb10d8c9a5cc81a242eb427e689918060c8719d48c8c6ff227f3a7f237e6dfa398ba9cf22ca45de6c30fa0df111fd629b7eb04fc647b485dec0845045559a5412d1cfb755a4ebe693d943f8dec0bab08189acc88646ba417af4e86053d81e3f1919d14584f1543152207be47eb04631e5f9c1a6ff6525eaf6c436e542ac518489aaf11bb2e9df0d2c4508156b5bac6c0f11762184d1a62c9915e1082271d30c941ae36ad51dec4506f7144db7142d73a93015663403a57a2cb6da5a5bb29a04ae83433865360bce69535b5140f8887240a6a2a4f4f73ec54b9da65f5ba849e47c7dc9fa3a5fbfce12f8f5b3590abf7e374b57f3b5a276f756a3705d4e5143d8fd880244f72aee3df765c718574dd3c018900a859651328d42989231f76385224351522acca1cb18d6c8013e7773e892c3963484f7c7b08588f007fea4d1a8444c1776592c15cd8800004010002315000018100c8805c3e1609666aa2a7b14800e7da84a74609a49932087410831838c21860000000019009091d10800883550d3cb0af54ad4c84c3f1e411bb68f625a62e43c9f4c932edadc20b65a4034281db47360d66fee60373f63e1f881488388d276ae6330b1c4051e6c03859031215aa461740f9ba2f5e4716169798db218a18f7fda6f4f3f2424188b30ed59649ed026d0b4d66ede1f925ae7790c5e50e29d717760a7dc3b6aadd027384fec2dc315789d4ba5bdb290fc5a4c633cfd041ce64f05c1405a91863560f765b8ec3cfa5ad0769bd444913c31418dfdc2320cd89878955004e972702d9915282b0edebdd5dd733ba319a123ab65fdc0d1a73703b639465aca880e7c1e4977aa55a08d4cf695231fd7fe51946088fb2029c474d6ca23ddb08704592acfa052cfbe9257c67f783bd3a17ab8b65586294064ec3f3ba851372f59e6044552572c551a8d1251f64e0bd2d020912e9672ff53aa972f5351e19e7e05e7b3062b57b077d5b0ef0a037a19ad6e0660f8e6821ede3efe6fee7f96f274324175429e17337cebca47566c96e44ad855bdb18c9506e6c86a65aadb2fb341797953959e7b6090fa8948fb4f4a63d7e34abd244d9475af2274c93d2a63888948110023865ead8e103d9743994a1a69869154c21df21e2caa1dc5d11e37cbe8ec8303b11d0d6747ce4eef1aac260f2a957f6b69593600962ba2ae4658d4f6833b410c38d3d089ee1212afa4318d1820fc87104c4113d934c55083bd2a47d6e0be27fed4f6a7c21327ccc53734276929360ec0ecf662ea74517d3458fd5e0c3d9692645e4fce4482c3097d35bdffdc212cbf5832596482477e3dce53ff06c3e08aec0bdcf4e47f13c583dabefea668b9e8d4e2945fc47b310b87e6f6c9af71c7d2d8e829874223fc918c2be894b6125abaec8850ccde261232c6aba3596cb9f5a5d76cdd07a1d6121aae0bb9e90f915ffd6f6bbe406e9705b4879f3b6d93b38b960fce4a22431bbd225b9504631692eb72e3df9a5c2ec9c7ddcdea0fb857a64540e100bbff4396cf50024b1d4e9bed014b21cc70e1e828ca231cf39c382a1f2e5f8fed4e2614e8a9b3f1734e189d3ef8d6a44c28d45e835f9ef6b173a3e00a82aecc8693ab4493ebbb59de6682fc5512b618ca01e4241b84ad56217c665cd1f27547e8e3a0a1a8176ad587c70df656cb9073bfac98904d4fe79f01b8d56bb73c85ecf711997e8df9199f8ddbbcf016df2d578c2e1a82dab0d2c9daff0f22429cb2f87b237c100712f26f39889819e121a6ad5ccc16a5cc64e19c48b64bc1dae8b8c1412bd420b7744be397142b6c8802eb25973d59c097017bcf4b1789eb16f8aa7195df8c52617b3cd3abb9a692987422f113b543d64918d3a2cb6ede3b285a4d2253a29423f490403d58449ad10d2fa30b8d66ffb68f1db9c2b90f75b506c36af0092ef1f264100f56d307ad2af20f9990537ca34b60849fbe5af1e443f52d983e8b50147fa0c2e889f3b3101bf73982275662c0788153a16aee592be71313b51afe0422d01a98149d041e50d0468ef3d9a8259a4c4427267adbdd603d4f876abf91d53e741613a9998eb6e121748937f00d922c381c6859441777d8c0125171bb86ffa99215ec16583b8971dc9d856765f78616c53858cb121df7a3b821970fe8bc249d66a3fc694346bb8dcf207f72abe6a28da2bfe680908a2216363131ca0129f2a58fa1eb9e314997687014ef01439f40eaa07b88a842cdb0675c8b8e8ee5be8ec67bc24f3d0473e50b508daca3a8737bc25632699c5e42e868e745191fef3b753455e23d8f6dedf8a1c9a3e525b43084a77f1d8edabca41feac262bc7088c19aa6086ba6222acdc790ee38f29c48885cce85669b87d221131a97be332b118aa022857b90930abdf0ad00f37449a88d97058fc103b510aa49b9618fa47f7719f81d1ac6216f4180af6934131d2dab0f196cc0eed354cd871bade5e7a28cce96ab05690a77857bd7de212456ae65fe7afed05b8968ee26022c61ab8e0e343c7f2652d9ade16e326f03d557d7b9584c6d210b5b5a2db9f370d6f1662b4640a5d639ec143bc66e6769bb78324fbc44fe7cb7b705aa070c0bffb273bca14862bda466abe248b7c2c67bc7a161b8fd232c0954d269ed0f8272631d8abd0f0e92bca16607def1bc471b3ba4506957d31c16f1b829f45265c42e6893c5e24ece6d9f2ee685cb4957dd8b97dc3b9c08c17052b795a0ed34b31d5b5de4f62fe49f21b24227f71583fc05bbe30238b18739715d611522b79672aa85b951f64ee6dabe8a4e25613e86306bd48923ec6303b004b04b1698ad64e4a295cff3a5a3bae478f823ae6da3415e3dd944b8b272357a2b5541f8515c49128f1d1a4a6b0b4317caef465cd2041c3fe4068f1324630ea6c4fa2f1a724ab1c0f07735d3f24022728967014be3fbd5a107421e190e0f203b3ced1b80596d127c3a38ca44509b7ebd88b149c664e9b318d1dec187ccb260b86eb208af5e7a8e15c55e0395144677dc385d55fddd1b54046fe0e87b20f08480736b241e75806451fe9990aa0c77ddacd2ceebfe207efa18ff62b3309d6972892eac9a42784ed123c59ce3a31f04ec9c2b376eafbd5783083724132a3e51c97dd88da73d31f66081cddbd462b7c4d3c4e44f7f0254e847232fc6c3a78d0c3c26c7412d11f5df3f0bd197c7834421e6f16ba906420a6a8a580e08133f4ba933acdb95a8a377e91e26efe095f6b24177e35768a0619054d975fd4656b00a4b2df5b5630e61186eeb1f065cd13018885779542e1765e0b40400bd2e217fe1613dd43e6bb1ea2d27b8680fdd961f34182e50fe4d13323f9ac1e8ffa1b21e1ad05a4a9133bb49bca3b637bb63fe23e039926af9304954622472a7c7532459a629d6392531908eb5033a95d77420eaee944662df785fc983a65a636df5600f45f13f9d495f78d5aa4d364878e2085f49e924b983797f11ec83c1568000a2e50e5f51efe3ab4b04aced858123d5276d8a6e26bd6d8527830549d7d81e2f4df8d50be45e6ecf05c227996491e59136a0ee28755a698207d548dea337f08d528b15af91171393f15a309874743a7c1e3dd93fea644b16a97015cc46acb2348ff34e1c31603eff24821e0808d563ce5fcd4c836e02263c50439f660fa74a1de7ca7ea0e3e54c6c0d8182f1cdb47392a190f7391db6ff9aa3237d92910405697df707fade640e0cbe5941207dac5ffb613846f142a682d9c232010c86a13b098bdc4a84b780640279c34835f2d40d3934058a59726fb0bc730d2a0c0b66d768daf2930f757699cebbe02daa1921959a3629ed4c91145cd78cfe0cc685660f50348dd679483f0c85f235afede521913c9ba965c32b42724faf126e9d90ede6b9dcd74bb7bb427703a094c141b3c8c816c66cbc66278daa5b64b5cb4e2f0e8987a401282f9b0453163ee1e25ecf49f60babab39867f7970539c18b539c98b81aeaf270d525293c6c85f27157591170a8e841965a840875fabbd813fc074905f9e4bbdd699a8ec8f39878b4aacd65f3787e2661b101ee34767b9fdca0dd86aa271adc28a8e92441738abd87895ad53aaf0353b25c891e0ae1bdc689fa60b216c539699faa1785e89990c32c63c1095841b1ed770f81634bc2d826e5de8e22ea4e556d71f71f4ab1444340ec0133b3847e0b6111b413754d45b21ae27319765519e1b11bd098d578993eadcc42c41b721cf34f0b7449ccb93885f6ee273bcbbd2f69077189a47903814e2e6c7d7e9f8a96993039321300ea9dd8766714caf36499d64fc1d0a643cdb69f394724fda59cb49a10b6d13d43811cdfc38c7c1456b246fa44260544b7381e715c63fc0b57602e96987ad2b85e80cfac5922ae691d09cb43dd10c527537598fa13e7839ce5fe9c0313ec70c5a3a9e04d2afa274e7b08ab910b13bae6000ec58286ccda32d17d284c94d995b23adeefc18988e9fed5302b545ddb34701903309c95061affea1353c5d2e181dd59cfc9b86031df88b6aec070409a2fb605115db0e120dc0f65292a5b61e3efe3276e05141b5ce8dcb5ca92779a99d99b1da0484aa5f0af3e6c58d54b3a2cc29273a641f2832e6252057456a09f51c117d03f804b48e7462fb6f0d212b14df64d6bc658617015252bf6f2e108c4150ceb318bcdc6660a153e6901142a30ea4d1020845897157b1f72e00b915d1e5560e4f4117a35e312225511c2697c71c154d760c1ee9205b55f8f7d6c1e7e56b5dac92c3c89fbb10f580282cbd7cd4b0b172c76f464ca64ad4f44f1fb1f64ddd1354511ab5f8ab2732b84667f8b48e25628fb73b0c97503ca94fe5912b6c7e6b59bdba81351e3a4f1c5bc1c7aac0a6754e3a0830ce72d3587e04dc77cd57bc09dea07ace083ae135ae87b1f8cd141cf12a6a795deb9a5f82b8699fdd3e9422042bb254fd175ef4d01abea1e98d2406004ae252ae9290def8e6de5d556153538603b6aa26fa579bf4609f8f1ad07058fe99af29ff85ebf6d3bac5d638f52eac16e5954e37a755d9cecd3e9884353202122c9e8a8e607a0f03937e7ef81009d53443d9fe967729bb1c6998cdec2faf00e8e32f8c8c1a8f1bed144b458dd9410063120158d567d560d6970bbb23c945150460da350a5076c800680c1a85026237441c868544f255e5ee2caaec95f486ce8569cf79a1a2f3aa6cca627f04ef3c76da0d5ea969ae52dd4495350ecb0d800ebc6a44ecac896e8380d691098377656b8fc06dcc7875e4f8478375ecc6e231d8a3a4e0e0998be528987425474620ee705aa4a81527808c630b43ec02f3366ab07e92df339562b7e4ac165547ad2a12a929cec65b2f21e19477021bd824dafc28ecaa491dcc92913ea42e4597a09aab1e61b1ee8f941f311c4081a42929fd594f5b40c7145654a88fc12e5dfb8293d0a7eff69c50c7523644d31e8cf702adc2716fa068326a6b8180e91987fdbfbb7126fefb3295e1266bf590f0aca96f39ca54756b6d0058911d1d0b11a2d27e2b144fc8c6e563ab59b90e340cfc683492ae96b295bcdd68a03886ec336ccc31b6318292f8f046e83bf5f7fe3058814b6e825a5a90907c60188351935c84f1b01e6f0b189f0c608d43cc755c18097f9fbdfbc175a2e44fa10c3025634d76d90d31a9e2421a5af0192b287338cb2f60981102b43c89c7f2857a616361923e4ff3eaef08c4e2a1ca88ab18599ea725908193106eca6f5bed818bcc2041a0df24ae0a1c0da0bf4df860f9e2385ffeea5a7330ae28c1c6a2cdb90e4a3e739561eee65bfe7a93b8d80caf8aacb6b6051075d7fc265cf412a891f4c9cf631384fdbea9957820ff8ee6de922c1571e7113deec0af25ca1605cdc50c442ee65c8f30be26bbfcf7528205c9d6386273c15dc1304bd1014a8f1e8dcdfebb59c59ce16f8b827ba5298dc22b7f4e997ad52d656fa2b73ac9f269a05e5c2fbdaf344c124ea92ec8942f83124e0ab48fadc8bc8e9401e9fed5584c4aecd580cb7a64c8ba623830c9c3df83dfaa0bf7bacb548fc9283e1c1f14fa9015aebc49a9156c2aa6fcc3c50c22f551d9ef8deae0761ee32a1ea95649086cc8fd1e09529cdc69edd3c96b98f2ad5f52c7340bae008d63fbc8e42ce59bac21ba19ee9a93efc8086399ca1725af18eabc1be44d6c835166ba8e8dbd822aeec029fc042b3ffdcc48380449145103021d26f602f8996fbac959299d7e09ffce16d77d26f02d05e321786e91af47811efb19422d5a1fd0d88ef49412ec78abf7d94ae869951fb41e1ab0b43d0dba2126aa64a0b33501f0effbc76d45c1b83166cc1c2879f41a05b64d94c4a59e06f4866016c4efb92ead824f4af19dcbde13e6fd520366fa89d4964c70bd5365b8b9b33226416f9d22999a6c886d90f37390acd86e94d458a4761df0745099068e1c91af894b295488289ccfc3907608e1008a497e1c5fd4cc2699058e579679d05fb4d8a3eeef6d2e4b35b2b8066af976aec81afbb8f12da2bc3403b2236834855bfba6af243a94eed7b358c00388634eadcf0718c4b3137a73c91a0d3a605801ae589e850aa900cc991c87519a50076aab866310e67f193044b45799dae7ce8827b6e7502de80edc1c912dd49d223c7f7020cb8492f2f85cf97c0f08f80f5a90888f3019ff884aa41812b882df6f3aa7a3c0d96c0e1dc9d813587fd46147c206fae0c1fbd15a09a802591a3148c363494c90ba85011e0f0ce56344708f712b0b14e6912cc0337c8dd6cee961442e41193c1d821e4c1f7ef808a9df10413abe113df648c1a3983df736d339421cf7ce703f809127020d82b2e8855fbe58114ab67f370dc09525d7b8cd3dd81ba9f5f77f32878986ffb2904dc9eabcee0dd8d1e90ce1200a9d732a72c8e372282e90c7165b6e56fa4650787e68172bddb1a4d88812ca171c33caa96cedb1c3a84c4c7bbcdd98813a9317495343eee90f26f9084a99667c920a21eccf82855f0c5e4bfb50939228c7601b4e5fc080814d2a78d6824da366cabfb9fb91205f77618e614a50f484057cd607d16cfe865b6f8c8ae52b62a345bf30b7c0a116e60b05e12fefe5809597982c137f267eece7da7910b9a5277d393ee1ee7e4e2bf181fc7c6a8c222cbaced25149d0771352e87764953964ac19e32c3823e349ea72b66a3daab49e44dc988e130323468d81d38442b378143ab7d8c012f9c45a63583f3b2476360cc80410e2c4901e519ae0eca389675774f3978c68530a6c623ce2c3074a7496e8bb3aa31ba9848d5dd11eba9e62b1c236f1d6b8cefb14362123130a6e49beb25593748a09a0d40716e6a1f36a6aa555b183ebdd02ec30b001660681cdbc0cae28ac8aad52a260f84299d087f0d225062c31641b0e3bc00d5851b816742991efa1fab3f7e1c5a6ff31ae44c02113a9a45b9367a4d571b4bbd75106e200974e032fad520d375be2f2d26d2afccae2a49240ea299c1e45057b3d36f010a9f05af8cc496ba7fecebe0a1c8f00ac92aaa56d887c52ec8bf15799c9ba7e136e4010362b6438518ce30a2dcd9a6ac18880c0f7a5927b4d809ef414684dc442036b39d11a7afa10d72310947f4b52f093c9cfaa665e8699405507839868e6d6c3bf89935397625873e9379d38b7b6f23ad79fb32e4b7c4dbca8bd577598ec3a05b7ecef599e3ace809bf67a97c7f354de7fa1e2ffb7fa5310dfe6ec19f069a6048cbb8b3667717cc1d2188e41c8076ccc596c075a5ab316b1127ede5568d31fc6dbceb2ad2c7dd678dc210745959e6063937cba7a8782878670a03d5df46c65baedb99ac03f74cdb9b168173d5a588c49807a544d4798e9aa631add12d2beb55eb5116b7ac1a998e94891c2246a3a8a49e9e7a21cc03dc746ada5af5c654aef3679854f2bd2cb3cc5a997fafb9cd8bf510d733780a37962353f81c65c6a2e542642de687d6c1f8dd26cc7b1e442b5f32ea69ca94c4710a0321c6fea48145610e4f62074109c9fe98b74f003c421e3b8d8dcec7ac55dd4cba2711a54e72b8d33b505b8eed6cd998ba8b1bd84f8ee664a44c4bbc38b81e12d09f34fd5823394b6b999d49e1c983f592d477821216e8a62cdbc2d7d5cb4c8dc8cc237814135876136424b5a52c38067278c6174adafd97127ea521c7ae84f44155552a147d0dde347370457f25970c93cd47387dc07f89e5cc8ee2c73dd90de3f0758c202b664d24711aa304bcc86320185593c7f1d7450be31e3b97d6e170ed9fd233bf06ff75f1fe1cd203128e4ccb38411f3e0475a8365d816d3d91a77970a3c7214f9fd15f6f52f1a6be25a84d909723d2ab4a83212939bd1fcf2370ac837914647f65647206f38d0cb0e5171b51033accb73b7d1311bbd99dd8ea2aa2b53b6c430b776465b42b0c64fb3669f2ce337e2c19c9857ad4fc5312dec4b7d80015947c97df85f6a9f7fa8439fe14b1b7f7e04f2c1ac554dd18ab6aad81dc32fe55cc6a5072b80488baf1f492f323572da12ad3f4a26eaed243f30242d05609eb980c6199040c6e011094a8b1f7c78a8680f1be36a16a1ca2680182cb0f40a308e559c7c13925a14e198793700299e2947edbb48a1acc2e3253fa9b3a35177600cd9004db0525addab398b4f132f6c3b9cb73bc9670eeea3cc78a8e126106c4edb243827b7023157e8201370a77886994969bc901242bbc1cb78e63501b56e6511cf688123b43b46178db92c3f299422b864ac9160d6d18ff5287f14eda5010d30bad2cce21ffb0bcb6ecdd2b35acd35afcb9a17860fce1837bcbe9e85d06ff305d9224890ee47766670f7243aefee843a946657549ebd728f0f9e3531195d477720528e15f324434eff590a16b1050e955849a9948f474dd9047e2483e3faecfd0517c00ceffb3d0a06870ed237977bdb78c13f656d67434ea761304f1a1f6c06c874617446750d3704bc3b61f02ec586776f6195f0a50d70a74ccb8a22ddc2bb755f17cd72948ca63a7049403271ca4f81f82056558ad356ce25cda5d02e11920bc9e867652903a83239e40042c9f0e325a3d46a4659e20ca0a24a7b6b2482b57d5655fd39836ac3d0e3818ef9f360c7c9270b5b9ee3b93d78033c6417ba834d51afcae6202b93e0d87715c513605100f9858a03253231fb93469070f1dea72706c95f23b954bbff0e76d2c5a4056845ed705fb96c111dcc02a01edf2673702be5fd273309502c254f2512deaaa78cdc12cb041e0da35bdb207b8c0be27a5e0b0618bd9ecb2b0c4edeb0512577724d955cb71e4cfc8b819183934012bbb6495c87699169822ab89908285fc008124a0cb679558a36d5eea39688b9d9a9dd4a9902d76cff939d019a88042df58a100c9cc281012fb863962c478726efb9ec359dee4c4450c82fe430bdaaf29067cb03bec7d56294cd8425bcd4ccce5e07464c79a1c91f84eb93116088234344add4b07c49885a88abd76a3b8972731aa83af8934f3c867a1f38e3a802f17c50f4b62a3e4abadae127609f8ebc72763f6a559d012caac6367faaa6687caf298231db0469b31252a15642e364f818027a76a5d4742a54c2471a266999ad08a1425534328c3a69e08f3f3b32ec6ace016ad2ba685b9fc6e65e1545f1022e566efe84bd981646771aabcb6c806d0e29281511052d0ab8a2794264137015d178145132317fa9532b97233d7f1cf710a54f352b8e555b8b54f7a4ac5b2a61d34d975521968721254c9b7e2e5cf523ee1252fea687ecf99a7e5665a0d7bc0ceaa1180b56a6e49c34d6fafa9be753f92725da01f5bff5b4a7e68d3c89f3deae0218bb2b25b04716b358b720a0507d49fee053fb8e5709c7e50935d443db302524bd2d60cbcb9e56d04912193382140b0ee8f22dfb2e9d49b8372a65913085138f278f41f88eef21f33c8b876811130cf10d93106d1d0e72407760e154454293c482bddfcac2753cc99da5cab65a584eb6308af33be38a5fc4f99661ec74e568d2a8c10065c1801c87497ad5ed2b6c70161113795c2c91cba0e1e893ed3bae30f47cd465d2f141f6fbf56110e9c88b0d89d2bc8353a3629811263f858836eadf4722f79d6610ffbecfc1738df029fb7de2a8ee8671497b48282d39ed676eadf9df1ac8262c06cd96c29092023c3191766867da05a2d23333863d5ac836a060fe54ea21531c293b11e3666d5b145d4c3b5575a2e3003c14e4d3838315ebdd7e3acc43aa87dd06a0d5927c1c9f944d4ee6faf48cbd97e5cf408e50791042722f17d887783dcc57a8dbb092fe92357b5411b628cb985d846dd012462f22157bf5185b04ee3bc1919a3b0e69ac67df8d8824f6d24747c794aa361a502f25d6f6e845dce22c63b608b6b13b84d14503ba5d9435372292d84b9f1d1d7eb1da6840099058dba317718b5d65cc1621d0bf4b6aeee8cac77af60da0aa55d9a38ad071756495f353179e6f7ca7844793c294b03fc79a9b6f75e4f2fc8ce9e928cfb551d6165c787bc2a74772fcc8b653e12dd32f6e507026a45cc605969cda4677371468311710a09000b1e61385a8c9d407331791444e69df587836972691444dbdde8efdceaaa9c3fa2c24488ea9e36eb8da37d2506b71629f6a5dd80d70b4db2491138daed7270c130c6c18ea48125040abe2e247070a11fecd4dd62b39977212e90ec3b291d735b86b772b80ff89ba502e069f42166cdeefe0ae0599eecc0c35cb1f202bc38aca5607ddd932ab901c7a0404a6255693ae5f8f473707c3460e3955fc53fdc1a3eb145a3b6ceee81dc1854527ec1911e65960f0e7614685e7c1bce330f5278f5782e0b491edc5a13f4b62f6df684846f1daa88147ace5c9697bc85c8bff90f47848776962966f4a20157baabd7dca558336edc42e1b9a7a0d8751726f6d7b72f965767381b8ad1a4232cde9157aece4743013863ba1eb3560879f70ef2ff265877691dd71b1fde06c5868b8f9512dd7a01d2d57cb6c218c5d96e1d9a4537b5babdfc2b14a2184ad1893a9821d058e656aa273b33c58ef6571154f9d0aa01ef67524b46a6d5ab1b06b8d3ef0f530a1898e1584ff1d9a8a25dfe9c62198ca8b5fc586b6ee7fc58f48e7f966331191672d0944c91c2559c37325f3fe2700003648f73fa06becead73facaa993a2ec74a095b81608d1db5cf7f34f279044ff9e4539766b68e24c1cebe4a68e005dc8253bc206d3be532f9dbc3e921317d03554ecc3465bc2311f15aab5bff9e33bf681be73f51932c1d64c1309b9bfd04279291b498b8f2ae7ffab9ff9eee37bf356ddaab6e0d7a1d9fb24f0ed5f7de88d6ddfceb2110cd13fe76cbd2d94b31bf46c9ecb296e703928beb9a82c779fdec8b94f93fc36227763adb15a5011ec0b1b540833c7661d344f6884d50a40aac199336af23a8788317f80c11e970b184958c54035104569dd40e28de772bc48f155d87e6a02cc4c981f13a7eae93015d63176d8971d8ba37818c2da43fb743ae160c4bb7eb5b806e7cb1c23036071a07ab9d5fdf7e37dc26f9d6f632cfbe7ed2f51822ec017ebb6d1675fd5920ecf442ff29043a457568038ddd78c608be1a9e001ea8dc8ca2ac568a41d6140b1e0988271e22f7d7cb3d49a528ec9a2a7436d028e58455df120c86defeaf62d9e29cdb61914537f4e72d66a4d6d5ff8b372610f7b2c3a8ebd7ae7ffefb53018f21b7e8a3633c010b67fb16012114642d717fbf62c8ed68fd84b140ef52c13c4494c9cdf73f6a2d325f5d10ae3a4104143dc53382c36f96c7bf26d244fe58b0aff1b6c4983040d1f1b0693ccdda85c37b043c683816ee64625390fec218800c2b7042a3626471de74448ac6f8bd406d58f56276a073d742fcf2492a880512bdc1e9e66533088c74ceab0de975f13db046ad92f2d3fe8a1a5d81d4e30de2cd8f0b5aff1e84b4e45e6f77472ed9646c5877a068a0aa3fb9a931fa5a707b62154e2f0502ce1b9907cb4ec776c99dfb4780259a85504521e6f3916fca3b222c71b9a4532b38f67e4d7ad5ba69133ac0bc2eb75d30633c4165b4bf858bcb539b39572e45075855074adf3d45c480ef37db97a223940cfa594233a4e6dbed0e5a85cc079b8fc90fa351b554ef2a99087c0c564ae355cb4dd11546d3e5507b68938d01eacb0556e5808776007cb8ae6a984845187b952f900a7e8060edf6b69846c711e7f25ae32a8557e2855080259dc31ac6963b5286b852656f99d8711f42104debd7df64708a51912fda6770182462861ffb9ed00f505145e3c998b0fdf1b0abd91f3f2b40701391e68138ca519d3ca92a8a4f13a74359914529e5fb90ea67ca8eef80519a88838067f5d9f4e6dbad3ea18cd7db0add1d8fc55801b4cf20ff19591d08dee8859b423ac33154d2b32b628f73cfc77bc42606bf23350f1c2bd305f41a448f147e7fee42483cc7d48d8206556011e4214f2db4a8645f5aa9fc6cfc29cebf9e32c1da4cb3f79f5033038985ee64e9d53c95d23d5599cd78c78bab0c83a4f10c5f99738631a1efbabffa40ab2895349eccc962359ff1589aeaa95c90ece9444c5cb4b8de56b697a7448df3b00ff1e8e44467bbd468c6a8dd71b49aff88f02d9fb23853bbd82b01dc6a48a87a251770cdd8e8416d898380d378320c61b16584aed94916f4aa1fe02a2dcb944794ceaf42184f8d596e7e16645b7501e4ba9324b4f4c351d34b94f8b21728dc2eceff0cc4ebd5816276a270d8e9b0a142e973479261c50c5d702c5dfe0e9e06de7ba0d191ccf7e0f13f3f43ada20c2763b3b785a631e6ae0c6c72a587ec9fb73d2bc5ab34678c05e1c868222a74a8ee3bf2890a942fc87e4a23a2fbca7cf211770bec621ab598ee22fbd13d788c92f7656c0b994d9e3554b51be3c50bf16aa3f86dbf59991140bef9df2d1c293a895eafd9536b8a0f7a0826aaaba90e3cbea161e7b54c541397276cd45704a5b7670a177b685957551e4f01f4800f116134a5ea86627653d4f87389615cd5e4b8ac5a6f96f608dab55b4094b4124194579e43697260a0ef002ca288cc76b21add364431bb63504582f802c9eefe17ac9b261c4accb590a2f2bab08c93007412c583fd162bc7d352bdfb1ba1d8055c943f5d28854f631cbc5029161a6cd39fe574b69d63bfe48b4d30b1cb0015f65aa9481225fc6259c9bcd4a8ef91120f085d2f834bee5b17f8c6c3c6c7ca84304965e79be631f35b03bb7c5f26fd2b83c8a1c48107016a88c20e1e09780726b011be96e27064017d647795c527b3330ea30a55f90d76e82bb69e785f55e03ac53b157700f4419baf43ef362f69814369fa399ac112c504e360740110302161e7cd105030ef0ed184105bec6644d327d2da2dd21ed06868e90ecac143d27d3511f0130fa33c57e4357845b80af717d5de35085907865438d02f2b883a0c1155250dc72df28df2eaee21817b5a6de78e210aa0dcf58732cbf3388d64108dea94e81f953817c2776d3d7bdd0da6bc2ed8006b112cb1829b834010c5a334153b7af4de341834b399bbdb95c1024bae97141d4a4967ba7388d3186a058457c2c5959117ae03c49fc62b64e0fe55ff5146038a2c0ccf9e73edc5e2d97bf8c902a1c8a0ae3a638d860766b058155ff9f7bd60fb5e09ffb3723116fdec1bd9a785c87192dc59447791935a2ee0ea633345db8581e29fc354c0bb05d25c18d6a5357f8246611e11be4d8dbc09cf498664b99bf72f9c1787fb902e827b83c0a1fedc6c00a48bdc9df60e1a77d37f0216e1363cb173febb622fd822775a09d781be6f8d770e14a058dc19096bfdb2d36c9eec68e0e35ea10d554b4fa0ba4cfa1385ed91034a5f639a850f894a338e3adaa489af391f6f316c09775e1a1531ec8ce51002b10545ceab692dff92a518111807f42e07336daea6a1e0dacdab2f237ad238a08bbe45bb626a2bdbcc16b1ae28c4dc68299ca6d26dcb3508eae30882cd2d2c8ba7cb71635538c02d4d523b0a077308c4f490dc0936a5ddc0270653850d8338e2e7fc15bd70eb15898033be5838c811230053144befc9fc754f694854be52ee49195a106f51b997961ccef1184a5073fa96763d41030544052c4197561b72437de34c4ff132a7ac5c88e0c2c573d8dcea940d1ee8b908b28d20492c5d9814518a09761da2451367f23b3ba4e3802db193a946004d3df9a6a137a0fb4fab20a5531dca3a4da210357e29ee56bb5e828c10f851315e57703f80e3034af2510b20f14dc140b764c1b3759967ef1e7829463824516e0e531924e723aadaa322176ff022cd232b2f466db74c99df2e56b37c8c85fb037a71c350c552c9ab2fd1be8ad97e75d556192c956f79225692c852dcc7a2f8053d578d14eb6b61903c548feece9e5025f050d796ac32482fdbde904252acf348b489e0b7c58216ffda4712648df9f5c3a26c2ee4191168741bb8138637f277d346fa036fd6bc7e255fffc0c272ff37d0c3fd4f26ffb4ddbfaaf90fdeff77d2ae137200d4f75fc450b063e546ff99cbf53a17c94440d75bc0ca1c161a8dc22c68dd2f0601f93800b3d09ad864ff39fd23054c9d9c39a2314b856916654a7a370b1d829d1b21654711f9e5654b7e4048af4e6e04145bffa52692553d8908c9cb6b4f2fd69c15d19819c49e3322f9cf710ba2af31965651474da08bd8416a7ce8e8682156fe4fd540448cc053ed81f1d5817155a0d148dca84da2741f95f5e3330483be7857ca6c7aa869882d219470a6501f84d26b15b2d5218dbda0ee792498fecd584ca5e90add2bed065de44b133fa47d8a7a59163fc3a452195950c63593a60ed0eefab143919e0d65c13e1b928b056da83218dad0348668437a41a30d85a48241ccb3609658d620fee45e7b1b530f571f88c11fde3378f82d87b1b642e68d8de10f97d9e205cd5f505707d982163d43c17c009143fc640f4cbb288940e60929aa03259057a5e3d54326bbb8325f3d2dffa8ec8321f39efbc67db5f88a36a8f70c7a45ac1054290567c5953ce2b5878ee264f48ccf1301828dc890c37a83b620df7e841afcee7b27505e4c19d46c238850f85a53f0e6f15c93418b29b63044b44a23e8440c488a432559860c6a8251a8810a51bed2062b3db68c4977f067fab3b0e9301a4ed504eab486ef99f1f4631038000707db9f0376a003f5036d7880f45aaf21764b2c3bb3309fab72952ab3bae56aa1cb0e7a70a74ca85fe8514d4a86c32555e6bae17089eed71bbbaa60a0bb02351ed3147c4f0e6f525e0045f51615ba013afb1eb28c00369b19e844231a7dbc8980552cd275fe8d5c37e8ab3269e662b4d84738907bf1fb2b9733c34fc9af2193fc66e0063e812bf002e9cac91c5d3ded7893f2f02138d4bfc01092385d4628e17c53251e5900b7b63f58ea9ecfff2612f5811afdc4d86ff4a31de0e82732b6a39fd50adacaaa48c332512b53f3d2ea0eda6396855b3bb68a71d1c4a2c486f8387f8dc19411cadeacba51432ad7903ac297a783003a06953644cb7e6a80658bc8752c5a1df81ad697a75935562e77447368f86adc0a4e58d7793ce2bd85d4fbd682c0746f589718b09aaac28a0c9b7f43e56c3ee300e5dd57d8527459e6bf9d4b293752c1314f0a989da7a768aca85926c00527ca4ad1142142ac9346526b49ba90e2ac2595ace6526dd2f0cd26cff4aae8a865b9046ca29a666fb7e09653d180616704aa4cb6250b66ea167e0ee305d6fbd246ef5c1848209f7ba0378edfc4b3da27c2c7b780cb8f71728aab0838899e2c741afb6322e5a6db75ef3ba28edf7ba8212b13bd1158b35345662e9c668800a5f1e569c32e76426df7adcf85e415374d804f7b2c65d99772b5cdeac93fed780b8eca1b26d421b8d0b8984d168d0f146d06db29267742334268be8a548d8269c553321d9d649db813dadc2a0d49db192a6a90354581181236436360b661a4c815ba0f02442f2b85226c8d412025b08ac78c5de8e9e78bc518ec2121d5ec1f0df697b5ce40fdbd842724d225d0c7b33ebaa6fe8703c31a2aa07a8502a13347ccc0810925abe6906c0a906a8ac958841943af4771a06dbca7cc83ce6cd6443a2f943a02b43607dae15eb7bf5d6c4fe7e8679b045d3e01a960d486f8a051f3d502bc4f7cfbcc6a8029cf8e0e1dc7e5bef7987530f01874f04c6606412371b763c35e6528608fa8a050c2a4c8b1a9f8c3dfa52c582809ece36690ff855474cd9ef84bd5a36272108d4637b69489c64ce2fd34780f33d44fe26631e1c6526915d58cf07abe4b0370841053923bc6d263929b52346784dbda735541dfeceb249b2095b2363a5acaf7c47c2b52535b454d7f691c32ac4b3517854df8266fedd5a76e1405d7ba6e9682278edff803a0da057c6c9a74dcb51f023ee2b26cd9e1ea26c67ab48dd9e4ab75eaa39cdb6c7ccb856b6843da339c8bdff3f061a2b259f59292f3580690d79689bdcd225d66bd60195a9f8d5d7a740e573a1bc48d38443441203805c9eb78a67c79e05b4f9bf53902bb2444ab068141eec8c00c284e4844d671c3c6534763b397199707e0db6b63af52dce4dade4b250838e23697c7d3788a8bcf64ab8a80772db852c2b74c5a7e51bf715587b958eb5c620f8d79aad913fbb288e768970e1d592d88498a3bf3b2df042e723ff03aa135c1719df284246b8c3b36d4adfc3fc4bd7649862e414e672fb01d213676fbf793cf45103780397e4c151843d59b562f4c638138c2ec043cb1ea070be8830e2c36daea12f499313f5b4be03b1b2bc3666c8a174a443b4d51d3ca0a10d7cb97a3037cafe894dd6503146af61da6c9df6a7913366af6ba8b31fb2884ba8d71b85beeecb4a8b3b2f4b6d9deb4e1f2908f1e708fff8f39ee1db3f36903607c6a6dd6973a7df67c249d2b96a3f338c34b2ceb8cf7f3b888b9c12f4404870c38a9181a22313f298fbb4a4b02568c794d663c22adddf4acb2700a1efe9a890378db1d12c0d1ac1ae192324107f7a35e92156383d9685d13d475ca6d0ad3872af1a74b3c0c7747613442df181760f7b7508624c3eb6f8ebef4ceaa2502b0ee23176902c0759620e4fffed60be967b29b4da707aefdf3bd7aca51d79f5cc2230145c50da680732c4a4f5cbe1fcbdb9026a043c893b24b37edc60ebe3543e946e582dd6628d7c04994dc7176a40adcfc78e08cc5dba8cdce43cd6ce4576218ae81922fc2755a4d57696315e09a3ff42a398f6ccc6fcd3035c1ae11c6cc1e5c03c25c1b92ec5affc21b8ca94904b65ce0c3536f78e2015fa166abfa0cac9fa8aead83fc9d3ddd92275ce3669e07a04f2fb75b6ebd1ed79bee378c21365af56db7852bfbad5ddd50b3e3b5f65bc2491760b6983c37fae737cfb2b7d0cdd6fabd0e70055c511848e1c0b3e27351d12c8b392d92626edbe4d42ef16f7cdc5f9287fa290fd3447064c3b4109ca7e8da776495f5fbe69ec2fa34a3362b39d3af2861a4a11d173d43539185038cfac2c9309eede024078c277dcef720c9f184dc39ed3cbf6a56569b0c6a7d561bfe169b7f891af3fc5d7bb576514a8fb933a3077685afacb831ed892144b5a4760a6f731135e3b78af8f5e32e66c24a87585028747df9383c4249c31940e6bfa5fa47365a8e1f7237b0db1f0b7d0356e4e6bdcaff7433c125bc2404047958509293e5b5a9e70210c417b72c23bf7c9be241a47225b7f031cb1c19c4f237cdd017d69c3be07643724340fbb447666bb19aebf9cf144c949394bbc458d423690c4bcd2158c3c8c8caa1f0883fdfcee215a6f72004bd6998c7cfdf433f9253991705fd5f9d4e544b0d382c7f834b6acf5fcb3adee9cac786189a3dea32bfe9941d1a2ece8795cf2325b164dde233130242f983cb824ac8ddaf06d8072b294890aab01e132cf08342b4e3e59276379bfd2da256b8cad8ff5431873e63ef6bc14dca6e7fd2b3a427df328606f95cac75b5a15abed2046c5138af02961f62ada6a9a5eb04967026565c0d2afafa71eca054e1b6ca57a7760d514e677f49894af7ef3b4b0e1ff1477925c82c50564d0ecce13c09c59308829df227630f4dd4632b74f78bc34fef852ec9410ffb60d31f033693fdb01e192a0599c1d068dc3958c004db085bb330dd266e03784286a80195cdc9d9bea6e146c940b0852283925c7a6c56c8e20796fbeda72529ec258c64210b75c05a1de8208cd7a7271691106041dd27feb587929caf90dd476c6129aceb79b5685f9d2a18ce1c3dc86a9e91d4fbbc078c95e366cb50555c5659ab92f34351945655fe114a6eecfa8d0ecae5da44d1f121533ec5870e95a8da7069674917afb2acdd818947455566772d4db8b68b8dac56c846e0d1cae0812b9975b413411e315cef75ce9a0c58c8b0983c9a08952a5de36e933829dec403b8383162c0c5946c8cd47332ba43995cd965898f1a3ec65ceb9ef55fe22a52fc65bcaec119ebf98c9a1d27bb1cb46557eaf02907933ec9bc172ba53fc932a48c5ff45c978ef4b8fc6264d527faffc8ea411a0c51d704da39c966f493fe18b2fd9a686b69c4b9157fe4d776f523a40da8c87a41894693c9953cc4b58ddb118aa0bfa747cac83ffdb719fa1ca1f3481274531f4c6a1cf8b2568350ebbe6b3a474e101663671e0414c4611be1944285674a20dfa02be059183502ac758becddc005c4145e7bd3c1edd990a35da64415ce9db2422c9b3ccbe2a92cb89ba9c4a489d6b0b4d4012b53d8294ab20cd5c301dfecffe6fd5b0532200576e87f7f38b435eedf48933ce02c4e45c27f2a35bb47f0891f3ad3eb20fdc199f290e0d09241bd90d9e852b188b1716f08090400af5a2e8acacf61c5490222582c500b210544be240fc5812731a591f8feaef9b817f7778b617bf6f7e3f32fc321f82bf4aaf70537bcc20e94fb40d1cfcfbb8ff152da40cb65bcd815060f6bb72b0d04482a6afd87d5d660598b56e72ffb4b4be50938296d737aa5cdc7d3b89154cf061c3c0db6fd72e9a70af177c1b4d603be5594b8b362e2d31bbf55da1854e58002c01fc34a019ff5e6392e4cd6f589d78e860dbfec506c8624d19fb57467278b91fea6a1f7a47663125d5c035909ba7ad6ed96cd88917274d311720e07d3cc6c78ea8ff6455922b6105702f1d04ff2ec55fcc94c2191789c5b20a6af62ce9e33d918d9af5d5bec752a3fb85a5cb227610449cd487eb2b53f57ff9e5b84bc8441f5c121c1006bf98ab61219586a09f56da79db408c57a68e2c47e2dce1481a8f2f4b1dce4dbc401465c31dfbf96841d40c362ec25a1b930699270cf11b81e321955061fa753fdec9a7b02d9214b8812e710c6663c52187c0d94e42a8f272c9d50e9a43cff260689b92a42bb7f474eb67e24093ac28cefb88cf18d1ab65b0f5d75a6a53809614bafadc149c80dcfef1040c8f36c381547c1cfb05446be2401a1a9e021486dbc0843936a302d95be273726a5009a388d5951fea1100eb8b70076809e343b483f7a39a255335b3ce5c3b335b54aa73410fb420edb961b19b43569d43a8027d1a392e871cc4804aa744ac038f37914d25f85a2537c1ea01cc675c6aa37477e04fb617c098db79283784a6d46b2401b300c58e22d5420e183d65afba9379f22b6e7948e704a1d1ea0006bd2e50cbdc34c21db6cc021e3f3fab2b24fe598932167c8a88704ac2c8431ef8f3438e92c16245c1493be13a297f26304184b42b8ee9b33399ba3d1b5af583e5a5a9c7e4feba1671fdecb2aef762b7356111c8c7189129ee121af5f4d52f683e42d50d587b73de50d695e4f170dbe464f064e41542413583651c9898c1182a304813e32da2909dd097f51fbfc65deffa25d218a5422aaf67b8fc6f4193ab50982c17a4bd00bd23451bc28b9c043aa9eace2dab2826cd571775d0b172278484410741b19b30440f06435393e22d2180e618235967169787b52b41c20edf64bb038781017d90ca497a233372801f95f2123e8ed3cae844d9c7350f5a77c3d4745299397909e58bcaa761c90a532a14a33c053b4c19d9cbba7243b90d8fc9353148c315ee7acaadc97cdca4a607d2fc3a380fe5fc39acd5109103b48826cc1d51f5baa3118262d36a4adfb1722a066a79f690b9f7d95b7d8be74abd81979405c72afd6ed35134bf9811878e63c1e36583b91425e0fc130fde10d9779171607d55c4c0bc6f9b14d14ccb8f961f3c006411a1ab38593349ce4817881291e0c0ea33140365845fa428da5ad01fbc6b9db066a02d5d645106ff96cdcf5ce469e4640cb786fd65db83c5e19560a981149b96e35f7ad95c99fc80e4c8b8a913fd5cb8ac1fe0bcca2e1f7474704dc29e6e172e09876ba9fd0b3ee0f379fd8ef75f1d498a0d03cb80196430c64ae3cddfeb83377c8836f531387c2e8d12952cb9db4ed5476873cbca3d20a8f8185b345021cf86fba6cfbdf49e45d8b42730a85f8f2434d74c4e866003d44003b81995057e520c65df186b27c48c234b0c5b0aa21e35e1f0c0e0fa9a04730064737e2cdce89e8f97d3d65d763999239a548f7f5845dc5c2a6d40d1e9200e9485a9d43edef96af0ea8365bcf26b4b14614a99d1db07cdb4ae3664dbb06d428dba230338fdfe74d1c208e06afa015816f234603919183d12165762689a2eb125e5cbe0bbd020677e707faa852558a12171d7c9ffed94d307a3b3681a2ece3fb8583bbb81a85510a936b549b02db2fe1c418c414c95315214e45a7416de442d48784d1f1bec0034fe51804113de7942eae55239870fa8bc30ca2b18a4f66612a591f8ebe1654c16702c101efe90843ea05424d9aecac207fdde456e623b3da5ed6c26a52ab4f96d19163c81c58f1fd832124ebf9b47d42b14f6f9d740a5a8ab9d7ef69ca2930b5c0ba762e1af9480d88bae2246e0f57ce95a94fc85cf995eaa5955393c13c3afcf2cc9a288a7aee2aaabdf4e00a28c25bc4ecf7b7d3b15e6413e0ac24b67c598416e62b81046f4183f8293d11dcb6b603e60a5ad19b694ba24f8f5f2c01713a4846714bb68cc2779356bd563a28a063b3370aa157afb48c028c0059ee0817f0946c09246e46a432080d00664df7a89096e21aab7cd3810b741aa7f0c121fc1e41fcc0ed7439f66c7395a98af003fd239503cd8217721e8a26a0d508e932e19c29940567888653ccfa0409770d9b56e608a0d210faa10f9320fb9d787a9388312d9c034dc2bbc417c9cb057bddf7016a4fb9c3f2d1c89e55e25b82b82c48cd57ea8a9c954b227f11ed6523793098ba3129cd4abfd977f638e25d0663ff3763802a7db8cfcdd1f62c185b99cde30e5c5c4bedd827b341e34e734063ec1feeb539a0e99d0a37e39306a2d93e78b961e2fe11bd687e8a32c0d5a769bae690f4b19de83105fab57abf9efe2576ed39bdad9785868f60b430a0a15a856d6f22644b87b692459a69a8cced52fb9bde9d4d34a6cd7071b3a7fe15ea2fb3a8ee661c53bc71fe0a3a05b602290a369ce7f901acfed7c86951331f6648d8725cabdebb1404da54a979c509d2bb2e7212504361057835f509f5381aab6dcfada22cae3a4ec91b771f207a689e85737d2967e6cdd202f36082599d3bbf16ca02743a1d42aac5a13c0b54d432299009fcd5350781746f48f2c8444e5651ce249d6a3c32ab69dd028122b244712420dd75e4118b70e8ddcd4244b683329a7350c2f2238c3238c5a122b78fdef99e8b463ec70928d97092ab83b7c2a51325e6dc28f58f57649484db91968fd19f3cbbc0e0fb352825ad9ed59a6d31b92fd6832a359d913c2ced83ad2927abcac2b751c98b3bfe38119774114d9b67690ca82d7462a061be0871bb8bb0cef728235fb6f4a70e1f27c9c4cce2481527cb0343b16fb62cac60323223a2ec798c84d162dc152361cbe22eba61302f7428334626d9f1dd099cdb09eb1135aff1057e62938e11acdf92e304252548908d7922dcf97b13e32a007d833f4a46933adbcb9b1e9719098dc9e5f92b09981eeeaca88f2b09a6ca4203a0782d0215e259925aab3b88684b59428923902eff2bdadcc8182190b51538d775a85f61bce417a885d19836e11a4283380a5ca0998020fd03d89edb413dd2a14780101d5c4c28d4f145404eeff8c995ed421168fc8c948c7e535834220e471f1192bb92b6142baf02a4a46bc10f16d38d19a4c5747a1b58537720a93df6e6c4d43bfd7634313eb2e64ea0dc75725b5470ec74e8065a87ccc1ea557df989290545d8d3f251bb62eaa1edae472a25407c1ced986ca7ce4eb64eff447033cfdbe28ef4a4c437f4b872db234e690f0be2e633427631b1e039d2ce85a33fcc981464475f5fc5913e5ebe548f6447b31765ad30f3508ba09b1e20c8da6be6f274014a2cc3c06a220631062aa3d700aba0a6f92e08bf5934f52bb9cd5ec5447a12ca58a398c2ea717b3040228d27c33db2e4793a9cb7c14180a18782f48a7ba40481a55d8aa0211f6d75cdbefea54e157fb6e818e78d146838be7810be911a5bee245029b28e2cb6c610c7f4c8be0029e5ac0898343a5f7e5452189d4708ba7f45a7a09ab5f094ba9610083339f0f8e427e5352c6671986ef5b841f8b714897cee9beda306c273cfa83b4d38161c633b54175d22b404d387f5ac59320e9476eccbb6f8b9a78b248cfb7fa3b8718af88dbb24a61459efe1cde9f0f752aa6a8efa38aad011d573aea822155e32444006dd3e263c478c28634a0f60ca3c47345d95b2c822c97f259e730435d09fd0124d984e07d63bc96c4f42d53a87e5066cf686c949623942f0ebb4cb239923f4429b906b8a137eb5cdd43ed29771675d49484e37a8d6c1e65d38554b338f626312edfa8dd725109aaa844696aa4a987bcb746bad8abb06627da5af8581528cf89682075e0773ee61665705b8f734492905728ada2fbfbbe4120afdb26dbf5fed3393b1e5bdab6f263ad60a11cd48cb1658a4e4f1226b91d085da9cb30b8884e22f76dba5eaf7e60fd435772e5bac9af6d036f2a6d945f445630c23b7acd4c12e493d867865975737252cef609dca5d4ca1b9d79295cbfa22891cc6178d7e5859adbbf3dad90d46165feafc149feece02216b419f7562e262b41bafc7edb7baf4a7ddbb4f2843542e79797b1c1040458f0883bb103d90d5807f98a5bbc48a35d2807e12a8b9164b6c7e211d028885f4aeed11a24024d24e3276af0cccc840423bd8eba8ed5159ab57aba9587e83af3a0961552ff5df42247c93e6f00eebcc8b022b1183746a79f536820a87f1c4164e3ae1a4e15af7a7e271ad5d53040b406c4c127f7cd5f4a0fa06d6ac65116108eb2764e340828ad46a60d02e5d827878638b759bfb1ef2b9144a0d1472058948979fabd5d9fa9d0ba0fb8c80bc82591f4fbf53660ec36ae492a362368647cc1416c077fccc3a7fdc9f72fa422db0aaba967eaa1b18b2a8a71789a51d33b170aae313acc9ac7a3e0ceb302368dd19b4870294aaf632d704861eef4e9a1efc05a8db6ce6d4ce2619648d2a96c5e00103a06650cf701a1a842ef823e5b6a1b6cff873f20f81e385f257711345a5f4508bba1f8e623342c9ab457e077ce480b821cf4297d92d4cb4db76763d33ece98eb136a26b01d28398d8884add3a60fcd4621b23ef52bf16cfddd301503de8d79ec11171b42f6c8f7ebdf98d7e9dccbdcc1c5c47ecac6786a3899f71fe9a16e75f5dfd25f27755a132483153f75a90a488d01e7792169011b9c760f95460cc420e6d253da88258b4344c54da9644e55c5476f345e8c28a4fd4f26a07e37d4514f6499e9504b6c88e5760d64489b7f6aeb1ba3e53ebca16ef0f0029527434c42e413d09bbc8b6c794c9146d8098fd9379aeaaf55bf028a2f7724bfb00234a09f1281746b2a9c7d1f4128f7de815a4b1ed43dbbe80425fd47b91048790a298f857126b40451197f80269d524ce688e35f6567ec468e0032385af7326c6f4496c60b76bc24f6a1ca5a3eb4d0c287a4595cf1b324bb85047a23c9c1955801f09f43272a0581c0b1473238a59e4508df200e438b57e79f4a592d762220dc074430819f75c7f5d2f65d2df73df2be9e4e32a632bf0e55e579e4ac34b8291e753fca50bcf705b0cb429e72b92be3bfcf75d4ac647b711db11f832a1b03f3ab7f19c88a05c099dee35929083ed9661d5e096bb36500ba36fb0cdb6b5c78b5857447f27c29401120d7b2197965ad36941c6fa71f292685a908b38bbf80e4242915f8a6b3c83ed690d3fad8f4d1d2b40183ce593a0855eaf0383aa9a02b0a9a116d0fdde3a7c5ad148b4c236f071903a219edecd0cf24404d1b2299d00ce62f1d48da69c1937fcdf3df44974685536fae13df2b1bbc10138b24e50098467323930524f87993dedd667711db4562d3a9057ccce152333c5daa750027d0d0c9b584250aaa345c741e99a1a0aa3f684e8a422fe48b9b4a0b6ba6a79958cc08702a0c13820e0ce40c5dfa3133e19f3dd0dad7c7eabfe6ac59a570c790a150cf06b2d1487cc5b51f8d268ab9cc1c646061272280f4a10405618b582b34634a344c5c7add21bfd611f6a9e533bbd4178dd50d7361328ceaa4b18413a0d038e9bd511b48c55966dc5b39f6b4fb98588841034e19d44c78ee469999c066228f200be6df087a4c987edeae28eada24b21b62ec10147b266b614652919cc19e34e9c0da4540ab720b3a8245877d80c1508886a1041c45c7ec80ff3476d8e26db7fe04048dde85b67beac7c32cd3b87f36a7add75016b5a425daa0e7b2aaea10c800e833115f9b1abb57649531068fa25d9f6fac2607068c18bd1625c106afd0d5f71bf885e59b493138d9c456dd554c88cbcab439fe714d982c929130215c3e629c0426a8a206870068176c3eb663f50a680eb7bf21eaf8d23e9655c665c24fdaf4c5ced2c8497474bfb6651bc0d0b83c8594e8f6b2b7e9197012d00de23e74496838f75bf40b3ea50617a53dfcd38c531614a2bfc8c78f2d146d4d6cc40a00a7d697e14714cf0afc55c549cbed0a6b7cf574bb81ed2da9535f2e69d89274f4b4900cea40d52a0fc94d61adcbe664ae00c6f27c59adba4d9ed3593d2d0fc9f27374731914118ca191e6fdb5a3032f38e5d0078b397c106ac1409b1ff6a65ec71b94d0943930cb9190638d18dcd0d9b483e2027412fe1063c1e8f4bbba4bf816d5dffa4c0d7ae5de70762cb0e77c78cc4e3c3d02783228d83a4262aea0d5792a4ff16b1cf403f5ee142903aedb2327fdd3a2540fe99ab9fc112fdeaca00d74cb24cd6826d69a08ddc6fd5c98ba2929248ec2296f5b6b7cb696174f47a6aa1b68f77d7cb1b30cd7e73e2b47ad54e1aaadc96336294b2457dec76b8e9b227802ee333c6d1b7d591ff5dfe9eca62092b4f25abeb5df9e46299e2868e48b240581bf8cf923cec2f71397ac0f5da5769c27367fa6941278cae25a4a5e61016059d9b767c1ba693838b5448d925d3722a3ba9feb7652a00516f17f56d4cd53ca1cfc4ee43da6d6e080d7efe54ca44e69078776dd018dd7a335d0d48d806b858ccb8eb75604b703d9dc85aa5e5626085c3e09ae208d028266419bcdbcff13da7ef3d978e46a6f152f0c4240719e88a0639181557bb2af4f83aca16700dc1b50289c7e0a00c78d06d2b98947b64760cf70fcdc0c2060e9e1c6326acc247ad4cfba68cef85be09c7bfa4e436e3ea77cf69b764b5375c756a984519c9193d42df02014ff2ff6762832d58cfd8269114929a456230cb50e9ca331dee55a42bfe940a543be294cb3339aa53eb935376e3ec869cbb6f1aa14f34bbee386e8e7bda9951a290e1c84b7157e577e7107f8ae1e8e648dc8971c719f077766f80d5b971f073ca2082ce6633d85a0b3d52601673695b964cf0adbae8263564a2c1467adb335b96f3141aad6eaaa8b889d332b608f5aec00f06c1bc7db79d4c811c98a35725186027624a8a3ae4a6d39cc2566cd8e6371a0d9022c9abf336549e4aaba68e506db6f531e1ed38a7c830dda9efe9e1025855bc2411a0bd1fb454fcf4ecc8c8a41ca435daa1317dd4dae205dd52100fde6fd5c20f6847cb28e6a32dfc9463fd62b2930016b790c032b2e639fceccba149af2596ace1e928d38b9ecba2f78585d807bf74af04f075dd448192d363f5a983a828c4ca9dc2cf52a0932fddfc0eb0bd11546edb07711e1c7575b4449e4375b460aac02cd3ff0253b896d3ae2d6d57ffd7ed88652722d0159de38724679e4ad439b83c5ab83c924c7083f6a5d25296a2f97b58ed34d30d76444b8aa34a6f4ab77d1ba52da14238812b59cbf31acba37d648534d3581860111f31844175990a57c6443d84a085bd686517e47b0227b152badc6e5509844dbeca277870affb9b5ce5b97a19541ad57525a21c3916b20c9964e5de544258a32ea821ca285a16f6039bcb40e47a2731543390deb39d2d44f4e022a6e738badd80f6bdaa060709398b0d8bc02127e0f17edcc321dcc65ec1b7102b432d2f3c3028e9c6293e1a2bf60976977613c0918d215ebb76cceb8b5b9fa6359faf77ab2a5a7f56a42b30683263a13c36ceefeb9b7127cb7b5f521ea0548f1099847b6568352552ac42c569746f4de95fb15652b6a13c136662cf686c15da0ebc75a2cf6f1d0510fb9bf60cffaa846ad192a3d7ca57778f7d19bbcbffbf679efde8b0e99aac90f827262a226618a6c11c431b17d0413a6abe8cbd6a28c71ada06dad57be39434b1a8a5961010364ad329a71ea0b13015f8f3b41d09679ebfa1cdbc46ebbfaf2fd8688f707a2034263fcddbd34750630fc4423f170665e10e38f0fd2184f6a270d6b8a91048ed48ba272a1c7e095452bb1b5b553c0a781ba4bc1b9d459f1434fd7d07f1b6a95cc292564348b6b22a41987564b30f981df53fb9114c44f08ade05747fb10f11a82e7e3e89bda8b123152abb00579c41b1d868538c833874581f9a558a9970d0c41c3cbb47ef26ea1526aefa9ed34ab74283d205e6214b502c9b2788035369e63790447ffdeaceea30804867f592aeed947355717a952209b4d699d2651d4f848a6eecaf8a670cd1a6bd2b25773e36016db64f494229baa0f46fa49ea47d599285e9969193d20da3c7be2a45e7c510124c6689aca4ee10d3564c2a6813f57b015c8f9bdbf8441c983da827c774d85659c9f0a30667cb3af2f712b8232f07e9c4fd5e47e467ee85fd256d612546d40cb790fe51b191cfc12cea57507387a52e01b1380488929d19af7c0288d0d3739bc4e3c5692ed9a6a510ba365e859559d548a369d6f97fe2c150a142d56dd70c039923181f6c3220840e2c7b99d2a2d72ecba2aaa339d469dce7bc3f05604d7ff0abe34c0593039d39b6efb3ae5a6031a8138a1927d2e11d3d18ea4854913e11a2c95d12c2dc144770cba99a68c78e1aa3de407e9c6e1f9e135f2bee839694d2a7c7ed2095bea76fcefe59e67c15f3e51677e010ec5bc3e51b1211d40f73e0297b48a13297852d0a5d9dcee35cace037fd33105015d77860000070cc3416cce1d2f230cef236d176cb13a3cacd8e44e82b8264483fc0a7e0bfc3b4021e6f469ed38488421f1f009213299475e39bd99c1274d275e36f31d1eaa26533222a224cc44ea803418b538848f083b5a45a8d0afe26046237cbac18e349eaeb7dde58f999ea0d2dcc1df30285e8711a65cc58efabf1cbbf1e2b0bbd1f83224751eed500361d601cfce958f58089183831396f3363dfe95854bb9dd772fc443921fd09fed9dbabda910299281333a9f456856a78e67e4729b6181809fa1ce24928f4f42540944ddbb0b2621e12862dc36a0074ea5fcb5ccca165bad5673b9985c7efc1919a33c726f475a388248c4da673dc4ace01e7506a69f48bdb7c4dfa0a341ced101e6e44104aaa7eee135333702849e38e4c82ec650c07a21e4448fe612bab881f85582b5a9d7211c12ce4f56e8e57328dfd09e8e4359437b3a29da7c629eed3b110113161638b1fa4c2432515dfea3ab3dafeb641cb969357308b929dc4c205568349c4a55b78217d197a1b856f67ca680d3ec84cda9fa72c3cc4d61e12c839d58bfb3eb3846d1e8843b6407553ea288dc828e0587b90d93f5764519fa9160a12d971550f50e2fead99d6e4eec12060404208eea016d63b90e494b63e947aa32b2b1f8e737788ed7801aa01635076229d5911f40bdc3e54f15170969a891b52da9a797f8a5d36fc3f52d6ce26ff5f8fe4e1ff8f2ede4e6ac8038884ebc511e43e58e850383952313f0678e06540bdf09060bf94fd8817e6cd74343c751bb9132d8be155cf336ffce2892485d22880726aa652cc9980cc2d062a12b92e9b4b56d8a744d6115d7d4293d6eaf6a1709b57e1d22a19f57e1c4c909b41698efbbd117eed3b3ce7ffae9d49213ef20216cb2f58926994f18b40a8fbceac69962c4fb784f760d4ee6960f3335adab16886a8aba846956d8eb8a4c58ed71e810b261f31062c71c7cd50a71ce5f36591b25b4f8c33fff9cc05cca0f990de6f53eda96488e66fc1264702e77a4b33ba78353b83e006d347958291faa162bd74d6ad825f1414731795a678519b34cd6e3eb9037a4b6e32ff285688922e3a2f3ffb27f96140ddac0648acb28c8cd42234db01a417b40ba21ed4043948c4b207f1f8ca473955fe2882b05c334d26f4ce0b7f846fae237a8eec405db3c9b86e299300016a536a39f8041918ce4f79260251149a4585bf9b2dd165a5f7c80543ab0cea43ed187d9ca62906f7da06789b250c711b9f0aa9cba88c0609e446625af69c2a43918c791c9c7e2eb8a41b4a2ec66603c58474e5e7ce18d29f835abda22affce72e1bb06eb2af69368b491400c5b9e4a7420920556710bc7e00fd22a68821f75c4be6de0b4d600d41e8c1d7f8c5bcfcfd590954b6edf722dfca23ea6c4e2dc5287a7c610c12e1cb9e2c354bf1b0f46bffdfe79ea27c156aee6d7073189afd7f4d6a589d03b7b7a4346d69e1bb13c344f06787c8660f8618a7fc93226294183a91bda105464ab658ada7bf5dd2f3a670ac264532847d76213704989908484782e59ca01ee198808b35eae13c8fe5c702561ca1cf2a248c37c719cec5da2442d9b0407761660182801516561be3a148485349661f2037f164b0a2c6e572573cab358675ac467e2cf121f54b27144618791775d944d55e07da5f4982cc2ff377f753f757019dde72875a153a4c0fb321036d09ffb3982d20c8d7562a4355b6a414596b107bb9429c2e2565f5d563e8a476e0100e2c9cc35f3efd2ef85d608cb3c1dca0ab4c7f9beb3db63d35aac955be55137e17674e76e0410ce9a3e71f9df67f1d819c212be2e7c873e5dc86a5d4138643bca475890be4b007ae457dd8113ce2addcdca788acf0000dd25a09cb2bab0d3756fc3197343548d6be58c60138d78e0b93a26f8fa268fe0c306ffc31225cd93c01f42c0b2d15603836878818ed1a540103e851844481171a7bc8ad2c035d1e2b3d325506f3bb58af4970f1884322db70cdf63c222ff4087d8cac4916b4bc22e0cb3a006372232414abca57d9272c1826cd9561a49aaa3818c2be523c8a8e5338686bb510b429c125d227baef6085d38b01f398da682c481681e41ec1e1d40ecbe2b117db678f87aa0a8340a5de4896fd57d305bfbd9734d3c19857e508723f4c483179c51d01403addc6941c9a6ac634a94f1e1228f046d1fc1da240d7a65b4eebde77188271b51a12f615e1b45ccabf9d25ce3dbf22d8d330e0cee2e696b6c986f7f45f9d21c4cdada479af0c348a29d5a690ea430dcded3637a0d6fe605cf76720810c4c8d6e475e8db3cd504b0c4e3d71239d97b551232c80f00d7eb574b34b600316d866560a2d69ff62f3809c2ec81ee20ffb134d602c6c702644851b0ec3cc37e6096c9e4ac3975964d615222ad99977a9edefceabc3bfe96474a70228b90ab4bc37df72b3deaa4f0c8a3ef9fa30e623ae8eb8e08417ab99db5946246f514de8cc658449327a75f1b7f76fa4605a6b4828cdd15031a6ab339910da0cca28ed81654102a3a5f137af434232a1c3a93e0bf4812e9356092f42268b3de6fc9af8d90b279e57de416859cc1d710ef7dac38807aa66bcb3c3023d86c6059f0d538d8779b89d3d64614aa6c395d1254d4a3b03529550f123c3469eb071f9e066a962feb5d09b229efdadb741424b16fa6c3cebc2d0a584e45ca37b425c5d9a5ea18569ef1fff93c431ac39dff812c2d4d1652be4d2c3ed0c52ebb7bbe153c214e042bd2792fff039340f7c1df8f8146eb38142214f8b420128895ec4b9d4ceacfe3ac430414bc02fa36683589f78653b2e00a9c6b4721e516d60184c78ed16631849bfdc48d53e0190e917089e05250f0cdccb6670b861138ad84ad8b95a8d0c938e086aaad881e3f765e4454b78a2e907616192b20c29be31793fdf2011e0e6b3e80aa57dd42de4b193bbb5a5788b8673104ec201f308ea0cac37c451e88240dd58a36ef8be742200dc70223cf0b738931bdc069ce06dd0b5858ec661649c8ed147b386dcd171baafebf55481848936c3b8c0d1b3ce6b6696752c5fe5ad3ce876e98d6efaca4d529573f0fd671bcaf42f1d540ae4a1d6094e450ab38610a8b2ae502a4bc30ead9b5a6d02221754720ac7bdd7b2db4ddc01b2a6d1f33f469ffab25bd4e3e93396146e14b57e4f83c886060025a85f1fdc9be5ae78a5657d30fceda394edd09aeffffb82c36d77b78babef17a49350ed181c1e3c083170adc06130e1c12cf439c1d3d7fc11d56d5aec95b30175e3a28e21ef1209ab01b044b1b416c3b3ee4b659446bb899a4b8fb12bb3e2e4c460f1ab81f1c83c07beb5a618a054118264b29e911e639a91e8c5d6746d30505ae9a5293d0cd98d79ceb78ab4489f576768ef4d428b73f6cf788fd60460501d8102507a667a3064bc614d48c7ca1934b938239e11e247c336e89b4ecad909fed70490c78c5a9a22f60465777ee1a3d10da920174531747b3fa36dd1682ac7e5bd9943e539d8aa71b5704ef2d204d4030de4580f63e478dd70385a32170bfabd879d00691f434e24fff545c9ee12df2bd853dce8a991fccdd6b03fc83f79222922c5add572070c8901aea15e1add7db7b0c01344289737129e8ac5d13f8f1ef7d83c3be80cb148788fa27a1332d01388467a4cc5aad45f4332b554f07175783b2821323591cbf7f2266c60d4b13647d023b1cb361df3ca4688bc07dd589eb6d573a6d7e00703f014e10d50e45f419554c77bd06293222ffc0f2624c97809d1f3e11b49016b87789eb6b8f47b64f9103791c81b7abf1df38c56cafdd0d64dec3bef72caf526ea7c30986990578b13cc4a1b5486445b589c19bed573738618e883688e91b46220615ae1e1beef152ecad8801bf5abbd7a718d203660257ebdb94419810deb3bd36f396858a65afe8b2edd6190b663621ad28f454e6f1661b3820bfb63cffc4920e8c8cf712ac7439b9738ebc4fe03b7e9e3b73bf7f38dd8383b76e6fc2bc1ae6732b48ad90429ddd0477b4210e70078f3e8d90c39cf388d6ba32381fa19be5af97862d4b25ea9d630d8150d12dd7a297e0120b27b6b3e76829156336ec569f2a2b15056244d91290b3e85fa5402470b2d2eae0c7536443786be7d0506c5ee8b7e0c18b7da9292c7cf6b40e56ea3a4aa61c924383e1be884c0564c244f24d2157d710f03aad1ea9888a8827dded987161e159c970e5694b9df5b6545cc89051e8c38954fb1dcea58c53cb2d2b15a2da287dc4c6ef258bcfbaf4e2fabf033bcf11a00c3aa05ba40f636ea4ba18e242fa3fd3772626d854c1338cfeafa4a889c97ac55c561514de432c3c8bbba29ec02659ad5078ac46448b881056db1c8c41b65fc681de4c256cf632c3f2d0123c11048084da1a6c322feee6779014884768e28469376985e9139c9ad3db765c446ef14a506b44e5cb80fe35bffeb7e3b35f44c4ef199f78711d2d1c940279b8e599948d603ca7fd8f0b8139b1d8501e919da8fd9209004fc54dff06b6b96a0d46ebeda76b6dcecab3a99fb7360234bb04aa9737b15a409c113507afb424542424e307c49d5282f09da7c00061c132a23edcd2ca1c91e9466aa36062a14e24007d95be350e1295d80731dcb4c85cdb44af49f2e198aedda5f1091cd0909269601f379bb5dd5a5213111122a594494a19060b0c0bc40a765b5b37a51bbb58459dfe459d4e4aa54b1852ce794b7a463aad76e4caa91685a2d61ec93e04ec7f03051c2768ddebc66dfdbaf5f7fa6b7d8559b1ce0ff6325b4d873098d6e22e2db5f69d33b9a5bbfb046a39f500a69b7ead71db85cb2db7308c33cd7dd9ebcaae3455eacf9b05366572b750cee42b5dc909b5095d8933753134db098bed44e975a99683e5639f183fe2d4aa2eddba94df95b4d35afd5d5f2660e9d4a9a47609377ba53458d788d6598a7199f67a3f524a29a594d21fe36c575242addf88f47d2caff71ad1f217c1cf773946a4f1197d84e0a601dc9d08b5737ff287fb743607c99ede9b7158d6c54c92d6c510c17182d77b5859de6a4a02b6b48cae8479a5d7ba34ee83d9a0e606e7646f278c4672d65afbdbc957b0b8b1c0bebd575e69cd99b9532cd6907f658f378212bb35980db82dad7c2b2d95455229a9858e0ef6d6c2ec656badd7d6b83926b5d5bacdb0ecf7de9b61797a97cde122e1b4c95472d7d45cfa1ee1a270ace14fb347d06f24f9c798e94e7b6e7f4adfa23228ad94564a69d5346e34fa3e2424251ea595c648b69d3e93947011c303c1f8988cbed0cca6719847d674a2172ef24cfeda4e968b1875e63a61f1c53c285bd365922dc26405524da6186f675a2d694fb516ee6997bb3dfaeeed8d0e4dd154eaa3a34eeba13cf433daf7041fad7d68161f8de6d09c2e8f10a1546ba18fa90dadd14aa28dad2b280e4e9739fc9de8719db1a9cf844b784c36698946b2205446a68b2111994c9707da48745885443aec807c6ceaebc09e9fe1ae84078409a13414486887346a2a426e69696f7196667154a3255ab27af01669cec313d2e8df6d6b22ad8be94a9da9051bc285ef60ed455a0bf7a2cfc6b21198f7dd9be423aafd797be32b9ce9131ae11a4722af1b69e13a3a5dd6ba229aa7525a16d9f634cfc9c94e6482f3bb8c6d12cd51a82e5f39d47d050e4ed795642c6a0635e4d3fc46fb4f6bd1fefb7290ec3f39c8c887b23719f9d188bdb1298c86a6da23d969b29999198ed3521f67f112269814363698fe0bada5fe8b2e5f37955eb813274c1f86d6521f4697ad4e2a9582d1337962c4d05a68972bcecdcd4d8c2c626833476ba1ff547b29a68d4d977d635d76226bf374d2729091e746b417e522e4e6dea250b3c4c363042e031d1291869e5a9b3293be0cada5be0c4ed33e6f51bec299509af6f2ed5da2cb40878446eb694686c585dcd939f15aa594602a951285b8008d3e8f67c33d1ad791945097f672216f5c274a202e66666678e48dcf246b7c40361e1a8c06f7cc60343315033282f6b12ccaf9b1568eb02cbbb75acfaa5bad6ad755848fad9f7b6d4e6ca7d386b1d672658ebb2b75a50912a18bb157d42526381f5799215419fcc15f928b907bfb5b92374a78640d27b645c91ad357b69393809c4e24587bacb5708fadd1a813798f39168570e8e797f0fcf3ece985b4a85ba206b5e776b235db692b21b13720900d4228f40102c77159c4da735a0bf71c4653019137b693ace101e9626e0d90cf54ebcc67fa7ef45177a598cc997cfe769237b4ef90883426677548743aac72876bb416896e57da23d547b476ee794754d5762949ae2dd15aae104a72a840f8bece44cbc106c1c42477a52ee64aff0f489782bd823d3ffc3eb04f2f3e996ebfd5d61716484c57c28181ebc7d05aecc7d05c4a32925c84dc1d679a31e2056fedb98fda0a1c2758ea32106bccd7728784c9721da38b99d91d109923aaedba2b4db05b62774ebc9643dd5d09085dc9daac6151b3be667fd738bc04a6be6539c947cdf2efbfafffe9ebca7e5d2f81785a8b7f2d253a8419692d5e33c95b99e3484c1d20790984e43bad85440a12cb72baaf7dd5ebab55eb55a9285fa37c513af2babf7ed48d686ad1ed75a32c7a8cd35a445fe5918b747dd444d848467308731d083905e5eb69f6af39ccc2faf8310c044c6928b38de2b84117c6f8455a0bd612a7ec2a73402649dbe80643dbc11d05bc351aa8693b3867e24cf4ab7e2c48f679c3a0483fb6d2d75a2a00ba92572a69b6403023692d57d64c2347ba378a19f5d6d46b3355dc7d5699c366645173c9b60c87c8485a8bbfcdb76682ba86fab7e646716d6a89d66249329a896668185b8d05406bb1ee743bd1fb9452f78cd56034fe42b693af7026274dceb49d02c0996e14fad690b41daa09d24c155bf395d03a016fd309c62c005af583aaa2501aee54005e39209a330dc19133a5540cc8141b6ac040ea95da5b518b5e18cdb40fdd28a65316e093d95146e643c254653002164f428baa0af0210ebd017cf8367c08a65402f8107b28e0b661ca052ee9821700b7864bc33db935557e70c37811e26d85defe6d85e0b652b615bab84b748d5ca3abbb66523086b19c975f6bb057160679249f9db4a34f5155b8003ac41e0174e8fd0074f836e8946a85966ae8b02ad18837fa2600fa6686beb171d2fc8aa4c30affd3a043f0448729bbaa30f6b20e3d591343d6d09d141d5fa9344e9a8fb1f7e9d0fb07414f87297bcef84aad3a1d56187b233af4fe4130a4c3149b9202621d82ffde29e7347372f62ee3322ee3322ee3323ab4b6749a2f8be39caa194ce349c7b12cb4546ba9966aa9966aa9b2501b6a436da80db5a13699b2d09daac2d8f3fe41304c71964a5355187bde3f08569566cf9f2c35654fbe92920282ff9e87716a4b167bb2277bb2277bb2277bb23efe5a156948196f228fac99336e513bca80b1c18784992e001c4c39274571325490e026d31b2a44a0458a8a11c84c2a4194d75e7ef2e34d164e3bde60610a9be64fd2186c9af1c66ad6032ba3f54f11be3f375a2861d3ec29b1b3e9e76692e66c6355e6814d7368635626f3673fde6cc104db3ecd9f7dd1d6e24d912b36cdd7c6aeebfad4a72ec854c804fd25cddad66ab63f4669eeac2d698eb1b12b23bdf46343a4e14f33c92ed99ad2a4c41b620a35ede95fb99632e59cf4bb194d2a714c34d8f1ad5db229cdf6ff4d692c5ae32b9fd471bf7a4bf3a8b2b79ec7c5be7a181cd7d794fbf36586f95575e8a5f89ddabb35b021d2e0405c19802956c1841229d70798c64cd0bf4ad99ec2136f9091c529fd4c4bf4b376fb17c05742334018c1901dda40b9208c45b67f182ba5a692cc5409690cf58ff26989c68028f4c6c250c734129bf3f2408919255217743aa947d6986f238987d4c58cd28cd29e51b3714ccf249e19a519a5095349bb022c9e84b494e32b91a57aba2bffebf49d7e48e78a1399247ff79267e9d504e764992c51734d2f0ff0898cd8dd2b697b70b8e632b7d56e7b68c90a583c09b99d5d1fab58bcaeebbaaeeb2fcf12a0a63df58eeb458f5d5924faeb67c6e486e343ccb6b3f91003e31f86ee01858eec617c0f4c7ffed8c7f8183f758f4c7faebf1f623cf641c4d01f048ccf3e7b180f636213bb1ec021a6b3dd745ff7755ff775b70af8c657b2afdb47df302a13b5f3c8949494689aa67d3e9f098e749c6010183a94af8ee774368759f5a22038ac76d5b4df28355197eda78ed1879cdd049e8fc367ae3c85c938a9d608234b162a83daf553bbd69c5d6178caafcef7038ccf5e070ced7578ca49da47275d73ea6dc88663b71b4c4766d62853ad65f4d86796ee13d8ff637dacc7e1a30c7a2b877e6a2da1df704afea5da24ded7df8698d4df6ee20df3fb91dfa88837be1739a9be68dbf172c9cf6cf78b929f6ff2d8d55a4cb4c4252525da7b9109d64c7bec35cdb58820493ea2da25da7534ec312fc9ae63a2bd48043513ed3fed5d0ab186f6582dc941b227f132ed314d7bedc36d673472ada5fb4fce66625a9e47d6e8af11f7a38c7f6a2d58fbea4772b8f960d717613a211c0e5161efd9c459ce266992e44f2cc7d511e96c3a578bcb539974ae26f00b70f618a6d3036acfeb87f09c7de96da75299b93da7093ce7942ec0fe55a5433fc413ac6f32c1905e9dde043675883bbe4bdc517ff377c88f3f755606fce5901f5f6a8a6d40c809c47407c229a540d05a6b05a25a6bad05c2de7befbd405c16fad896e900877edaa9d4a4d9d9b1b191255992130351b1d0c7acf93e7510aa7d6a17dfbe1c1b66472d07d7d1878499b36a62de77afea6319f6d607717da67b647fbda57b40a1a3c7f541d8dfec5ff67b5c7f3fede64fcb78643cacc7ee63afe33ef69aa6b1b75113451a9407143aaec7340f28c220a5c7b40f1f2e9de2a44f7b18162b7f9a364287f55be55d0f4464c97ed33c78440cc3b27df85ba631a6f134000e3274014796ebad0f23cadb302c568661d11ecbd8d77c84dcc1772d597f691e3c84884e320288c86244114044162c9425eb23cbdc7546cacc9cb09950cab4bc96ab3e421631b7f65996379a113ab2c7340f1ed8633a26d3f2cab2d7728d2c56962c51ab7a24d2a0b7caf525919ced7ac69ded51e050a26ea68a5481145eb0e7cb22f2c6cc719a793355620db5d611309c0e94b66782a5ac3802c39c0938c65ff941b2d44a975c9b1d2f394b966559d6bc35be722d9f285f9173bed42eb3dd6a0a64ead0758254ed29cfc9c9c9c9c2b4c45ce95245782ecab9489580e85cd42572b3d8f1ab84bc112f4aa7086186adb5357bcf045d27de3043324028dd3031b794723aaa72d2c466be91863fd5a134fa80e7449f982b23333fd0c2e4393466b443dfa1a690cac8f8600c4276489da0727ace5409efcec2b1d837de50439580c59315ccf81176fcd089802905b08183631902ecb884ac213fb4217b1f8a4ea0154470668251ca483f9f0742b2f8fb0aa28ac320ce4c15a7d136b217c9b2df441a2997dbd810d9439690375c0ab1c669aaf81122e8544470be53c147b0f18a0d415ee335a06f3d9328bca65d33552e07bc0651e50289e0bca648635201876e93815875e841709b0f7fcbf92ad703119c77ca087a20aab84dbcc610553c081194f1862baa9e02a6da717449ca6bf160ee52ca2794b63f36e59c74664446464f2aff64a6844026043559067e3270aa488b4a2a3719e7463f740c918653f95281162226e85fa780e38e37442c284f35e59cf4056a5209ba8d0d529e1d1c28cf05acbfbac77deb2fdd038a8f7e64c9be87f595fe288bbf494a1eafaa8ca7f06aa294f2b8fcab2d1eb0a28f55bc65b765f5b6a43b9b665bd21cdaf29bf345db5e5b66fb588cd787f6441afed40c91863fcdda9633df2258eee943bc818ee187b842c920494a6c7f5407a450358005cf0278301e1d26e8d4694fa5a951cc15aec668b1fda37be9b4dd85d84a89c0b9c05409e3152fb1479e4c956995e81cb5402681c51339043c278fef4c9067aad03dbd8b997918a46751abf5e77c07c39c47c0f2bd67aa542d7fe66c82f5299d609d9186fc2a230dc9c385cee7c82be0fabe3341c933dfb998736ae799a07cdf097d47b26ce93aa9f95b0c5c80677867b049665b4a75741206c372ff36816deecc5489992a31bc7a3656daf3efcc7dc28960d5dfaa2febdf1c823657c8fc9bef7d82deec33d6c78491b402893720807e3e541fb70ebcab5c39693e66bf4eed5681efdbb7402c10ecf69d07ab83d0a8cd4ade884562f68c32de107d6681654790989cee94d25a6bb5d65a7befbdf7e6a468766c782aade5d2204e1027d27099a37bee9e49cd9eaf838e93a912ad18c3cc9e73876f634f3a23846dc518b4982e633555a668cf292b93ef00cb28ec504a292930e5101c1f47745211f20cb1dad6ae228d193fac2e0d64d41608de1184bef40f42a50c82c5931d1b76b4e20a526cca81b852c938c99fbe5753d8d8cca0c6053429983929a16f4ea4e15fc9d41a3540f0dff3a2ff10592a6b9a010eb11c1947390a7314e628cc5198a3b0944ac657aaf7ca51590d0e2b2cb6ff749c78c397439e61571d1621cfb01d67f6200487d4f4ed40a98e7b6a39589b9a228d59eb9f6187df0e7507c5317754ed3891868cdb7ac11f870a933dd0b799101c7238db7169fb35031c7e724a42b08c8c8c8c8c8ccc27c757b6aac2d8f3fe4130c53f4cd99bcc86136fb8db3fabc1fe285cf295fa1e594a21769c2260299a5505583cb166c0317a599c73ce3971d683ab6963aab8c9a3a4b89c359bd615ebc3cad2d14954536a69b5b129e7ac543061ea50549c760230ab3c0151ae06702872db05f692af542193445f24b3e947cff607a4cc05b036c66281c27e186fbe6af357b15a8b706f5710c86cfb150435db628f39462b566bfeaeeb6dfeae17edecb15bb1cae6ecb12cd36acd3136c6c93839faa9996463139bd7a70879865d31f984d622672648bf5201cb2d4f575eb7d2406b80ad3555ae341dc0f5691ca284cd9652626614e2b069bcd9347a008795da884336fd6a83572a1c36fdb09a3b54ce5039437580654966409664695e1f600708116fa82e8834e8d387405ca92f9024fa94648795c6b33aac3ad8f443d0ae3abcb65569ae0f70032648dfaaacc0d54ebc41521d13a45f69aa10fa35a716992b2335358aa9128140022736fd483fac4336ad35389b56d4a6358b6ab369cd3a8c60c80c119a9c9aa912c62c367dfa52c8a6328a4de5eb688003a68a4b94a9e26fd5786705164fc2cf52f7a905f191d9f728308909b9ea0ba5a81d76251b6fb4a21771e215d7d6a010e1e210936d51f246094fac31dff330f69345b37a496959524a10602076c8354d154b8fbaff6caafb921c12b14b70e8312beff87e6eefadece59843981c3e3d7a91a743214a7ed403c9ff04431fb51c278f635aa1500893e81756f72f4459ee921727df9d9c7496c6848c46fff841f8ad188fb3dc3fb1a5c3196ff26f3d25bda543f0fbd17fdfe528798be4ad4ff4de7fdfe510ef2ef491e81c22ed7d6f7de77d490e45ffe2435163c0f79ecec280bfef9e866cfd974b4a7ef45f0e89e8c1d25fe8adf7befb51fe42717e219d234ed07b91f67448c4b6fe7b1cfee550f4357825d6d3f09edeb17d48eff81fbdd03d7a2b879f7ea17bd3ddff8ba7da0e273fd233f48b6feb61fc4887244d41fde21bf4307e6a3c801eeb506e1006caa18f8dbbcec2a3b73e0cc20f03e34e8f3e1dc2c0560cac633c0c8c263fce31de24c388a143b9f1cfb7dec20fe3319cb11a8c06bf8990c731f3c97b8fc9efad9c7f9445a20c834ed0973c06caddf65d0ee5ee40b97b921c7ef7dab244dfe5b97f82394059565689f5255f95943c0c9dffc57f7a477e2f6bef71b86894e397b3f551b3bcb7729843227647d275d51e753f1a753924f91a5ef47d7a87f5de4f6d8793f7deb32ccb0bbdffbe1fe590883d7a51cef17df7560ee5873e8e7248f200f890d7bd7812fd42b7f7c2933be7b8bd9c1f87e77cf226996e00bcf81a5e3c4683d5d0f016a6414b4c436759d6c9c98b6c53276f53be724ff42d59ef722d5c6f69aa7c3fffc67cdf675356470a38ac3355c854093f20f589a9d2fdfc4a335564bc21ee50595d36f13c4cc86ca11d4643272865cd54b9aeeaebb02b633555097c5ddda8fbfadfc8eaaeaaa356a74339a965596fed4b7baa04d6de9f7b7f0e834094d64a29ad55efa01fdaeccd55862348ff934511a45e24d1709bb928e680849c4762c349a914125a4de67cdbddcb1ac9b40c8a7dbef28fbe58d317bb7210ade71ec9426439f46bb5fb661ac1fb57ae2278ef77f908f0de2badab5a5be55b79d96b6facd5a8cb1c652a694666e4ccbdd75bcd658eb2ef3893a58c8c0e932613e7817cb395a301428e86b3f66a15ecf955a5d1b7ac203917d03b44ec5897d6f2d7cd464146dee620d55bdd6f279737ea8cac31df8e641c1c9025b6bcc17120d698ff04a7390f441af3e24c588c5365b371876e009b74a5bc3921ef76baee35749bd94efee176da9cf09aede40407648251c0d5e6c4363355ac3544dcd994c61d2985b491f6331919c9ee56c58035d2c55c7faf68f2e2e24c5da976a5ca1fb0e9bb7559bababf8051ef88656d5aedbb6b0e207dab01c1b92092e87f398824fa165baab9d4ca099920fd4f8ae9c24531c12113a46f391afdd9441ad5eb3ee466b5e17dfb5d163d66339733b9cacbe6ae34973355accee16a2e8b9caab29e8bdb136523e8d66d2814919c4d3f8b4dad47f961692d96e7926feeee8f43d0e3f76d7bb136c987ace9699bf669a311ab2920afbe5358b3f459fa4e512abd58f3c57ab15eacedd346239af5d96aa9964c414bd614f8eaf0c5b2daf2bcedbd5abfda8bdfd6adc2ec5a6b685fecf6acec79564b690a5aba53e0f002a5176b7b1fbe589697b75269ce176bdb227cdb362ed503bc7d97e2b68f5a0e9ddca04c4bbb4bf9ca97ea525faa4b7da9d497e2525c115cdad65aabc317ebf20047d495027fa9afc8b76352328931319900d1d9f44b7d3c9bdaea895e763a5d910db5a5b61dcccb718fe4f0007be4a9cc541969eaeeae35229187dd1ec7fcaaaa3cefadf75eebc5f8be7bdad337db27f1907a66d89bed7b79dbacfd4c6bb155e6b4e750e8bd27f584423fa3a4692d214f3af6b64b5d2782653bc0e1869a2a5567aad86b896c594c9522dcdbec3da6b57045ccbda1220dcec672529c6e13d84ac075b6eb1ddc90e9d2fa63f9b3714c3681af0e70b8a1c22fb5a14ab21d7aa94de56c077b916dbffbccdd4c951cb8219abb9920ad6f79a2f0bbd9f48da07b434d15dff4399ba9829f869c149b8e1e7fc80dd9f43def2dadc5ab2af76cef8f1ec7f45c7dcd96bb6b7c7576f8e277f4f82dc98b72dc556bc1ef917c3fb59612ffbc953f8f89b2b5bfd917d5fa21fb22fba22c77a733554678d8de86be720ffaaa43ed5d77298d07d15bdde9eca895f7568743b88e749167d8f6abfaf815c031a0eaea3ffb3577ddfb7b9e55bde7cffafc593a87fbf5bdbffe35bc6f52b9f7eff47f5ff50eee2dbd23f4f587708d9f6a3b8c3ea4e3887ef1bd3d48534dbff816f120e26113e55b6df5d5567f5f8bacff8bd7b96da73355444fad157da7d3a54680451f76a9aec804e98b3e23ef6dfe7c97431ea7cf6325b7d225b2def855e6bec4e5eacfe3afdad33b3e6f7dba68adb7ae83ba390b03bef86b0ebb37f9caf3acd15b56adf543e7bee6b0d32fbe8738c0b6fe85972deb290073866dffeac8fab1ffe22beb02353bc46ff5103e84eb6cee7108e365b93f396e1c6ee5d17ba6fb450e5f70367e931cf2386dfc1dfd4e47d35a3e2d7149b52b1de4fa4a0b627a964b1f21738cec1149c6a61ce0d187d43473a0a3af20d16f95af5c5fdf065f8f71349c10ae868b62aa748f7f43fdb6e56096974398ed79f6de7b99c08eed578fc32bebabd759f8c36c43e58dc896633d8ed97d36f429b77d3ea20f4910b683f1c4484fa32c37956282f4b9219b7e2807b91ef4a5c22d8b4d7ffb788e93e85715c69ef727706b4f9f02d1b0d7348ab3b5bf5a8ba625de66f6c4b099d94f2581e7572fc0d7631f761ccd5409e969d3a79fed52fb078ba54b6da82eb5696943f94af6f45a2c99de5017093cdf894dbf14767dc85d364e506f7a233241ea39a84d8da0d597b23af6e967e9fc521893436935050eb3180e633d881b60f124bcf76db0ff9482521a7a11cf022be239f425bd3733584cc1d906d1c7b6696badf6d66aaf7ae9d7bfb0b5edf558f862d52cab9fbd4c13d5a1d476b836d59acba7fa28517e98e2f5973b0f0c0ff9f7863db6fc1ba22cb17760ef63cb1cfaa64f297d0b05c8b51eeb01a3fc9037eedbb977588fbd9453da97fa5ad65b6bf577a90ea5944f5f3e4a49bed5f5aaffb93417d04bbd433ef696d64316ca4deb5f5f3517fa3bac0ee5adf5025d9ad6926196655996855d5abe95516270de5ecbda7ff2bd6fff23354a6982779b917ea55facbdc33e66a3b603a6f587bdf6f7edc6c59efff7356bd30f5fac8c6aa14baa658f52fa682d1966ad7dbbb12c77cc6595507e7c45b7945fc97951d7b259565d843c43484bf7094c3f741e2bb36b32741e9f256e47a44496954a3636343418e39943bc28f0c00c576f6316a04aa93c30c326bfc58c0070b5eebdf4deebfebd7edbeeddee7531c8862e06dd7baf65f187f08370acc2eb432f73484b282510e8abf0c5daf841176b941fb2c67daab9e0b78fa194507e602ab34428d3537dfa76bb165305ef3817f8f1831ec3b4165005aa58d8f23f5dd8f2b5c766c45c0a5b7ee6dbb110b1808574d7a1326e99b3d0b1d8170a1014d346f9216bcc4791f2de47315dade5da1c690b308aa9a233585e53f0980d641141596a3d58a16bcbb182ac19ca2188e378aac8c77fe5d073b6264332f415e82b5ff93c0804fa1008a4495d80de3e262dad45ca0c947d67825c384ff5b43c3fcb98fe95c3193120ce8c12a98b2a9392ee19256a7395b100cf284d704a1a35f925cc6d0d74d4a7495c9d44a5527399d5d45c1cbbe642b1c0826a2e75fb635b8cf2abe662b73f66abfd788ee7441a97092c9fc2cce922f09b6aa5cc9ca2e68ca94a67c7c69740134d55836dbc9bc7015133a7c225cff432e069ce489b1b1c544e4aa7c2de0c48935293c2b3c1f7705579f83df053401b9ec900cbca4fa18d9b9a71c74e1af94e53776ca84c511b59aa2797a58863276ab2c89c79e8a66d5debf32943753d8043e7b941882a36c48b79a42cc015fb7e7873a48deae907513dd53da0e831bfd241d01efef4cef84a8fea69e524794fb8d25f10f4e3cb2a9fd2443157748ac6ec6c293fa44b6c19d2d2694b130a764a0341906fab7c1ce6cbbf39537f41cc1ef1a3d600d737475f54c96124ad4d603fc071ff9669744e2d3780452cda8ea30aad2fda3866103740e4cc09bc665e043a49720438c4b84a17028ef4e39cd23ffe22b5e7df2038cb3ece6c8f804c283f504a283128a65a2bca8f1e94124a8c7b7d1008a584f203b3d97b7ae9506eef7aee5162e48db83914d354e1fe7a47b14129a1fce871941f3d2825941ffef706efa04e35ca0f4a514ceeee54a3fca099bbfbf5abb1bb7b13d875f8625d1e60518f261132c1495233c149421369ccefe9e9e9e9e9e9e909512d263825ddd121f9d8f344f52a724c52714fcf0e4988d8cb032cf272dc5cbe7e2493e450ca4451654255268abac469e6099a1a1b2986e05c3155ae8f8f5242f911514cdbca598629a6334d92d2e4a4884d1e385c6a397c7b4fdf5ae916fd5a2b09890e87a096a615c69fc4537f460987d7ac431877cc5e2fcad747b9473e5e2f7a528fbc11b7684669aa88fefa5ab3318c465fe93e0471464fea42dea0750445313af2770778877fd5464e53e5d2334afbfa39f2237abe344d95919fa42e5c6b19018de48c8cf8fdee3681c311948350391809cdac96468484266b1f6aa8119aed43122271037d5e9aa44c1338a4a14698c023a809d65abde21114c8aafcab65b596533df42108b549424f693f829a2ab5823ed4687ce5fee4b607a1a64a4862bfb2f63d5b5acbd188cc6d7b30fe50436de99f203788c972a5c95726cb7c1c4ef33592e316e5eb39102aac4e50102a9423a8eac454a94f7b4ad43faca60a04fbb09e669ed8937e5885d49a3d6b147bd28f52ec999178485d4cade5d212cf286d2b479ab3cf2a8d65114cdf2fcd030aeb795c5de9b85f7da579441816fa6e5b322a787f42051c824210e1830e1fc25864dad06182536582f3456ac2683e264cad284fc0e289c43e92b28f7a466982d4b78834b08c836133be82ffbaaeeb31ed310cc38ab8dbca1e8bd921f6894eb27408a2b6351f6710676b8f5dda7a7febadac3d46e29920f69a26f5c81a8ed5646cc649fe1f7fcc5f873c76f658d6da63590eaba700ccceacc7485dc81ad8b63a38f42db6e3b87f8555bfc5b5ef179665d94fecaffb588efbba6fe590d4b3efe3f08a3e7683cdabe3a7d4a4d9b191251c347bfe090d9f4f4a0ddd86ca4bdc1a4f0201906b8040a11a2734d4c0719b0068c8b8ae0a2500da5269ba5fc800200363eb8486eb02533a358cb8992ce3666c43d9645927c3da36eb6880d637df6d73016ce89c80120dc7cdb6868c041135fc47c38c195f258100c832302c9371a26ba0e13a4146fef9794d86e666b8991754034086754283dfd4a03b9a9b6fbcd96ba04146559d5c2fc8b879de2caf0c195a7734375f1b3f068c17265f0989d78d46445c08843b9a14ef02a98c3e6cae06c82245847761013af89003d2428e034ce1911de0e1f9682d77c7dabb45aaf3a608638f4466d5e542bc5bd094e0eeae2b1bbf58f0a1013a6c3405071bb28a38c1ca6a2d47b56dbd5a5c2c5c2cdcbf29fc229168649a78dec8c8c8488ab0bbbb53d702767ab310aae2425539f20953665e131670fcf09a2ed4448257efae7df6ee2fa7bc711fd32ade1ec7cce2a653056f91e5a3d5ab59f70955bdb7de20d767d7ad8fd5bfea5bb5d6fa93feaca68f7aedcf39ab6a9120a594d6d6eaf2a6446f1cdb4a2bb5c2a411a4940758a505b0385526f55923e818d8d32b7d29e5102b9ad45aeb5e17bb2f755b8a45ef980e3d7de9d47eaf7deb3797a425ffbbfdef013677f7128eb304f2ab2d638d55f68876524aa9b52c4b0d40adad94b26894d25a29a5d6565b997087cc2d3570a5d6039dc105c296d208f707ee33d260a1233bb6bfb4753ab5f7de07fcb6d5d6a71c90a5fa3eafcf1cd466eaeed51e3137d578f04db7b4028b2918f32ab2d02cb7bffb5b7fab3331607fabb3ea07583ee1d6a4f0cafd584956aeb69655b5d4a1eb00992927cd1415486275a7805dc748a3092e537371918ef1a4d43dcf0588c8e212b7bc3a5232a12aed8b62aa282594988a62b2504c3a0b032ddddf79b1ae2b5afb5a283f507ed02db01ce419b222587ea495635a3dbbdff971fb943870afb665bdf8ce417e11ce8319f7bdd7aaaa9f4fccfa9e9d7ecd2831745a4a514c28a68d6283520ab20999e0acd96838d4a7aa300e3dece23e8f63665996653ca85ad3a1f6fc7c55615c1272a87c7992c017088b658bc121f7e186da134371a8fa21c6a190c01ceaf33826cef8b5bf3c53e5f313ebc8e5fcb67de41b4151a1e7589cf79c641eef50dbb438c0e68c92ac3ee610cfac923f493ca49e59cda94bb219a5184afd32c319a5a865d587d87bf59f0ca276953d28472755dbce109e83b1cec9d1f5676fe50bc77316068c69fb7ee96b7df8a2bfb21adb55fb9018b532d87c6c6697b86515b28a5b45a9646353050d4d15b70ab977766c6ca49432d0711d51fd58d85b334a1bdb2a336d876b5b8d692e551733a6d652b3f52213bcde3e96ab4f112772b30cfb2cbb119465f70514ca1ebbcf899e6a910e27c6611916520dc3c387b53380ece0dec7a679eeabfe6527f7f5a2f452fa180d29a677dce79efe45f5b5c37dee7a9b2bc53e211e385d69f6f62f1e72d4a73dd4a7187d8c86334a58731171bf693d64f2f3a17f85227bd9ff682ef577603a945ab59fd7f255e98bac5befbd7f33aefa2b57ed41f97a6c7b99f193783ed97eaefde81df5b3af1ad37a47cd24fdac047ba9f19061391ce27a1abed09dfde7d25918f0109eb3b10f87a0970e5ff4d55cb0df91e950daec35ccfe653d89a7ca9e33c168adb572d707717c45fe8c5f9fc443336ac2643efa81d139ab09b03ffd9998924481283670b8d7bae55635e7c42193807558808dac01bae29857519137e6bb0d1b3838c24c07f91ea53725d801fd02164faaf5d8b351bd04a5c949f2e583be720127c9c7accfb2a44902b1192297a89ed8524a292c5b338983d42e90855565c261dc3989e07c22fc23381d40c4fc7f11623b1153c5f34c44bc4c15d732021394afc3b46163a29e608518aef09d94d4366b4504585f83e100b34124c00ca2011cabd9c0e44adbdf1a79eead19d4868268833f9737134402f85b7963221a40db526fa71f78da4c15973908f75636552c9cc66a6880c3ed3467b627ead73abf4afbb5c68f139482891a2b5a10c50b6f3af5cf9763d7af343082d4253241e731636db56b1ec25358141374cc06ab99e096040e2f2adb4e3a88f5285fb1b4ef38c943dfc1245623b7212e4f1583e90e910a9b7e0ef5ba504ef22f87fcfa55c3e8486dba534a6badd55a6bedbdf7de4cfb30ee7c3eb4b1b7c71fea00fa104606fbd087d6522181431ffa98d9f2b1eae6681fa7797de8e3048464b1341facff20d607e17cc8b0d49bda8eb24cdb7f0b2f2ab478ae9ab03a5d1589d12baf58581493e4d5be3bbe52b1f83bcfd5588d0670b89d68e4445161875bcd76f2925328156fa8ef5f6580c96cb29d362770362273458a60677b62aa442a9ed8d98e6d516cdf66b66f36db9bb0c3ed66fb0c154968b1c3ed8aed5b952651b81313f4a755e06d66ab5560e932960f09632d490d164fc20ab57dfcf85806eedbbcacd3b53ce9106b79f2aac29805b39747c42220225d4b589e4a748448491a59236d6e3a89023df6e5fb25d93e49b6decbd57719fb91f61c8ec9e5c88209e19185459e9c44b196a590be400670f82dc0741b412513f21469d017e1975a11a137c286af403162fdfd18fd8934fdf71528f0d3077dc53e7d1f7ce5f3fa0b3d77a3bf90fe7eb8f7e78738cda37afb3cacbf0f9302fa2dfb7ff23c6dfa3205a7a93237cdc1a67206d2059bcad396288ed33ca0087d48ebb00fd23ce65b9c7dd81e93dae783cfd71157392369648db4b9c141e5c813f8f2f4a8e9434a1f17ccac3224307fccf34f104c493939913f785561ec32453b94d4c464ba780e32d2902f238df85473a13ec42491844b6dc9ca80a7cbd45cb60a05d8c444cbca80e76772c2ece952c5cafaccaf5a98b4da82892d4030e774df4208582677bc60adbd970b55f86c21647b78472bb6d0c167472b765410862642990c430b70b66ddb86714877186a463b5a0186223b31a35017ba2d90d8de68341a75dd165c6c910546c2859c1c7c99cc3b4c9894ec684518705e806a6090501163a7099fc9bca3155d48627b139439927c3418541dd04c1521532536e0754cc1072ab07f8efbf2cad2b52f9f102266823a7e8829b965e5838e0678feebae83549584d9f9cba1c305b8cb5fc0046735419409ce6c0ab5e4a44c0a38ac2a1de2b0e354a9169477ca29f5a5b5a68e018b27a1bc1f65fcab7b581f7b441b386cd8f8195ff958e64b1af9f175c88f4f3f6a1e5050ad23bed53cac8ffae3115f6a1816fb5706efbffd3e7f1d72e78f7e0f28aaef21df7e0f28aad6713f7e0ffb51fdb9fe41be7d1d4eaab48ef8f77b5cedc3df1a8431e5373894a558051be4c4e00725380214502cbf3ffad12913bf7ec4d5cb927c3ba79499519ef694a5295dc7c88f93563ec05ca2ccb418a564410e155c28426681cedc910a2e5cb1bd096a2e25bb08581400fe64d28b1861c57729c41bf78f702aecc8434bb1647377b93f9f1c37f5ca573ca5d95d6526ab5ad5fb75c7499447e7a2745bd975a20df4b59cf996d95345f8286539eeb9af1336fd186b848ec55b99d4412eedd8ad5fa3bbe64f3349afa5d9df521cee14c50a155c314f68ce2826b74e5112e03abb3e7abbd6a7d4a9dcd5ad57690a156958ee45dc7d431f774689d49367949e7eacb90e2a438cd4a65f75e0d95a93538161b6fd904be5a8a157bd7adf8b9920e58a5833e0d08bd9f4bd18777777f7ce7234969af697e2384e67aac86daa35c8f551bbb67dbaad86d998cd5f0efb264f98e4e0dbdfe48909d23789992035030e4d6236cd719bc454db5a6bf5c7d13889c6f0dbf9b8084d4aa66b7d68b2c4a6a1c9c9c4894dadd0e4894dadc0f4b3a9c2592f656ac78a2628b7229b5a6ce5b841cfe9d02f09418fa5677cefb52cafdcadb51687578c5242f971bbaeeb1ea5ebb2f4500e654f85f223432945af6e2c14d3bbf536622194431199a0add6eeb0da752545cb7733412ac324b81a27d1ff6e9c44df8573410403ac96a8440d1676450b199a1108000000e314000028140c888442a1583490346dd60114800f8fa24e6a509d875114a49442c82043888000000088008ca64900cace158f9140a4f6abd936dbb61ac399a6d3ddac34ea62cedd907a9e96648f15ee832be3af016957e7d273b5adfa71e8c8f48ba1a73ca5c290ba4d615486f2900b2a105fd07232b05e1b73383749620a5292d63ee59a54a87d86aa8373ec841f0e1052a721d2ebad0c688d1fb6503eecefa0bf61d9e4f96e903a08e4088254413f5f0bccc89fcba8dcb89d5c53d59d69406e9886ccb6eec987fa3ad58b85655f91fe479d402304a99ad7f9a36628c0e415976971b1e8cf9779eceb4dded96ab44c43346f8c462ea21563e85c8d72bfe55aa2ce0371f46c7bd48f39ff473dea1cf471454ea6d47f695712f455e0565a3e71a09cdb6daea7793b2ab0b3b02d156d238d4729ada3c69226d0c93ca18c0ccec1d19dee0395a3ee16000b6fa0878f3eda40826deed083e664a4843a9696b188a3a350cced94c351ff8eea4bde539c0786a32224faee18c33200b58dc05147f89d87c3233309f320b037aa65cfe398a0df0c017ba39a8eb443ab37ea9c43dfa1bebcb10b74dae8255bff1b95e2bd2d2a2d8954e78a046dfeae3b5950725e62eb46b57f2c2a83104947b3e6e8e66cac1b55a57d8d7adce929bd966a697052296cd408224e8284be41d09f511dc51955d89a51e57c67823d54bc8c9a1df1ce8ae4db37e93133aac291b48c7a42d5a2d4cab2d954f1c38d2c0bacf228b83d197582d137a03d3a905187e57e491aa37e60e038766c7160576b7d45da0a278305bf160ea32e326984514fadf60b07461d041afa67fda2a2cfa06d398b24d72cc26f8ec1723a4662aafd15fbdc47a8128b7a105da152a57bdc58656295aea8dbb2c4c2dc9aea5d495f2a16d9f43104b08715f57621dfe11355dd2edbe7d1bd41a02126e8def7d2edddbc81d11c8fde0bd89fa29e4f71da53cea1cf147518ab74532a9d6e4411fba4a80b51775c7c3b0d8e159ea85c7edca0e805060027d20075459f5c7a4a59ea63fe3712d5889501f1735ebf7f4147d4010e3a121a512fd8b9b3b0bb4f1c6d1244120bbe6593a93c216ce1e070844dd02a4c9c784922a2fead596415a643d434e6ed49fd8e88aa2d8ad4d1216ab67c45b535fbb681431711875e362127fb871aad90b3160ddc4897653c0992e12e5fda3bc5d6459d8f8bed651d4f2843f250f3212344382dba286ce8b042ff67298838d10ce22c74d08d0a7f8979dedd3077e77dcb12e0c8beaba1fcde5b2e0b1697f3a0fa5d0d18fc178fcfbad1ef23876abcfba3347fac91137c9c943484c1df33cbfe8349d870a89fa79ea95b3c7c727ff286da1132d2bd8d50563bb2393a67da69438f2a687accedd9a1c0f65640be68652a36a858bb53ad4955b68ad8ed3ac9dd1968373de605a553acd7a7244b841933c40a343cfb58d4b052b83268569f608e88870d4514565626a9fb03591d7e8731a8c636cbe21d76e39137acd12ba579fc0d8b458efa4f12657ae6a6aa8fcb928577d8e794aac24de04a7735aec19953d8510ab3aac6638d83c655d7fbfd0cf5e8b182104b9bffcf72e89db5f70bcaf283642c6a8933824de1775bf52d7a51a7a924bcc38eb3994703cd6eac0c1b93420f637987d927f6a991254246153d1e2c42750774b098679e76ce61f6c22046b6b5233b0f928d125b03f0187cc8699c27b1a1fc8177270986e0edf297f9d4775edc9a48bd6ce323833c8a42bb527c4b78f5a2c3ecf06a55b628688c7f585cc6c3516150cefd45497cf10ba36e4087224d71b8b9910e35d2ee8904ddc3ce86008bdac39a55cdb67fd5dbf530eeeee8a57b1148afb9a77027d75d416415d4828b74bc15d9aee8a5a36377c9b2c50492486210d10b48f56a06949712fcae5c29af803a152764bc53af394249082b51ea958337e5962e9bf9ba1377dd01e42fd6d9ad9e12af8e6aa91997d6c48dfaa227b55233476c0f01a929b919927ee0788b037ab7ea892491d11a41cd7aa687977d8ba055d72bc8594b93bf457064f5e529e344585fc909d774361b159c882ac3fdb95931178d17a81fb4090e979b42418598e76e2ab798b5d2814baab15cbb42624d8d4ec74a932c46a49c72d478426ae91046b0cda5049d138a454690f933d1f1a152e7b6d169a7112f1561c51144674e4aae439dbcc6e8a3c1438c2f631432eb441d7de7321fba481ae3ebe188414d3043ccb5e15c9e4de2651683e6c82c6b60cfb6f045b59e30d553c44523f5b7295d30c58c88880b7311977b845e8a6b0198c915212ea52d9b52579846f874ea60f93c8cd47d6e8e935741537addec94cc9b8923f28fb75d6b0ea9763553fa2803cce1728b4f94e13b1372c8cc71372999523b7c94fa5645449600d4e70188d9a4749adf811ea5adae47fcd2c86353ae2ac1943e964ec9c20e2c79f3dfc22edc6c29f966e8b7f0521a77c03710e0034b7a01f401f07af2609d40b2d0208f886f8a875c835e95f4c1228c8deba20e231d80131547408addaf89a183b59f082410bd871baecdcc9f583a1c6babcbce34f27c83b534069004aa0b43a41e7265dd84a15f7ef533d74cc28a62c27ae03e253a34736bb00e1e63119432166b99b184eb074deba236c66acc42dc43f898e34441e77926b6c7a253d40919389c31be76bd2318014649e183f50be32c93e68f45655886e56d21fe8808a3cb112848570ae1ec17525823ba836a491031b688311edab28753bd15b8aeabae8ba0a9cf3dd85a18adad817e9c7dc99c2be88db40fa5548b788fdd68b09783582e5609b87d28ffac89303789ba0530d85db2dda2077a1da3881067cbe81ed981a80429a034a235f1fa8f4e5f68f473afcbbad4e17ae6f60cf961611c4efc876999e34aaa34c95ab10960a9f2b67bd9fb1d55e92c7dd3fc0c084a7da32b2c51b30f65839e2afbe8cf02ecbef0a386d25a8b52e751b83a5f69fc72bd6e94d497da73274eb0c91bfc8e0a3dc4a5e51828c56ee01fa0901a0c95f68ffb11512bb06bc2f74ac71bda102104631559ffc05a66884839df1f6592e24778d9fe355d894b0674203ae483594b19d119075a4eb6faca561de003d9d51977c0816d720f43f3cd56ec7b1d9c64cc9b67e8af5f53a974f40fa9486308a02428aa072c7fa552401a2bff66add0565bbf2df2893f9e6f7e8d7af7cea05747b737433cbca1884a23dead30d0f8662fdf1961155d7981e9dce6a46f315a7ed2e7bba32a6fb235e50b8849e57777cfb58c697e05ed1b46c4abb87e0b3639a3175580252fc06e6350bf95f534bf2f1d755f1c2236b3317ba1abaea214bddaea9ff8cd81ec8e0f9acca2b0d2652d366e8eb8793699cccbc132c84ca8ea3ebfd0a61bc872d7a9f7e1e6fe9d160ae348165e83854d159bc465c95d3b60b458d7e03f18520501b2c28efc31a1f256ce4b2f3960037d1a17a96581ac391ab3ea82049abeb856d054e182d1f9481072782d834c12c00fc75c36635da645d7720fc4f1aeba0892335e675d1248f25297b5dbdab84be6e9b2de5b5b395572b9b1bb1cd2d613d03f2b885cc8fab27dc6677b3c1e57d70d300a867415c61f9785c6552c5489d6c845b68b0c6ae78137e8bf500d0bd7bc41187ae9577d6e472f58f28d202e08dfad678451e75b706280a1de8d3d5ec69675eaa37e15bc67465b1fb93d87c40d90a9573979164c57dcbabb5adb146c9efc49514f175ee48036411d883af5f2c13bd9917bd51edc55602482d74fb5499506d0b8812accd632b1402bc3f2f7561aab9d0ee8af4a1ef9e3e54d4ab184bb0acddf547b6424f0b9a9b4fd729843169017f406ddf5ae0c68f09e62b65feaa738da601a8bf2890a490b610b687ead94de8d2c4df620f7464b10b8fef9a38ebcab9efea3857863fb68c349b3c1344edecfed4342237289708b27da7d80db5e316137d19500b9287eed89cc033f3ed81b8030ca7faa8be49b94c0a8ba8d50893851b866d14a3a8474ed8c77203d3e4ace95d6b9153a2f7b29c31560ef8f4eb34f3817859fdd3e2bc3eaa4d13a1140436a1f3533227d8cf686eed95e090e6921ef6ca98fffad0638a3e44bb158c08234aa73d4140f074a24feb91bb628b690eee80e59bc1ffef4977c9fef3eb7772e5c5ac3feed190cd5ba9f14f5e086f9c7b2124f5b1cf43d228e748327009adefa156d3e63fd94ad5f2fed046dd93c01fea9bf4a666aca3fadc8756f1cb61940d89eae2457f0578bd275c0cafa951ecea7bf3afdf01e61e245d1001e11eb7d386e2eac33a2cab17520e2932d38ae653f66e1f3548e220fb49aaa6faf18d61e7753cffbfeb213884b61668ca87129abd5d89cea8d1d36bac030ee36eacb157ed1a85cb40df2aad72c1335f4c164aff56dbd5c8081c5da08d976ffcaf5bce07aae073b223129d9933f4c147b697f5dee5a1adc4ecf5372dd747a8269b6b1e7a7bfeddac18ea1bed4b3194db50c24ec5d7bad4c0f5d65f250894f8f1c8573610d6e89bb868d6841280d11fd17ccda3fc6d890ade6777c8fad7d08ae3dd87fdaaeb5b5379d72afe7fcd1ac3da05bfb2d053ca29b76aaf686abc2e6603edf74a77d8d887de85f7dd3b4dfd316a3bd727e5d5521ed9b22caf347c08e668fbbb1ede67f6f03cfbfd4049a57d0a84e37feb392f3f1eced80d77f5f6ff84729b5f686e90668a409e0dea57d0b0148822936100d511ed1d1140e3140f9a4afbb3a3480046136cf1444d72fcdb5eb7126074485a3ef3db3f9dc895c2c777e175605de917f1ebbab0bfd0e53c923cd7f68584dcc21f1732f0d4f2ec14e062cf33305636c7b8c6585419b89a6640491ce87e2621708e8e0aebf8fa50bf064cd8e02dbcd17222980dc5ffd167b19ece7379637067a1bc6a22a82498631b7db5484c16b3ae83217826154744eac29cebeadd6dfdb75dd5efcf1a2bbc14fa2a64e3649e0da6ff1976aeb8a32191cd514b3a6ca01cb684f57813ceeba9fa6959dc700c49ab54a3b973eb2726cfc0607f2f495b766d76c671bb74c5af925b6e79c60b1fa2a42f825a361de1020f9546ad18806bd95e6d6ce191d7331d7995adc1a66cf99af3a8605ac5f5e8a037dd5a83be4370a47b45bf78659ceadeb5c2bedc76a3f680385b24ce0fb0373e0c79a4b6c4f2c372764272ee642462282428f9da1d5aa84c629b78f2557a2b70b9fe10e7e6c7832d6e96adf9d93a7aabde2ff5289c832cd57f4bdbe3aa140db531d4a447b236604194c732f82190735e8bf29cc7309549b6c860e485aca3cf6a77bde7588e22aef95a4be28369de0c7b472a2829bb711b3edaad0384d4f66d3f62b3f487b779b0d88ab04f17c274d4d2430945ec9e6b7bd6e6302ff6f2dc22866f3fd89e9f2bf151baf21a7afe7b5acd9f325584d22040fbcfaf7769bd885ae5bf10f7c15ee7cf9639af66165ba0ce52e0438fbba889bc41dd2c85dd5b76809ce921fc63eb3a78d10426c0b8afe6e4d75e8655646f8428953b629efeb08e33460733ad2ac7bc561e22db0731d29f72f1a7a5fd99aec3a2441ff23d107cbc9c58aa0f1348607aa6a443463ca8ace7e799a8649e53ada016bcd4790c9f748a64bc9b29252d7c4cccd2e929755994c4723071a14c9ce35c0c464158dc4a1c58a74b62c545310ba1232376ecab345d0571644468e0777555da195f73ed644f0f9d377c790eeb0a2ee5cfe3fdaead58b391fde87dce2fef68e06b502f748de535776b6293f713dba79cf5d4e7cdeb17f15033766274198f50479291e73e7e7e115ed24476e2ab9e8c28f59e5787aaad8be119e5a2dee98d575fde4138e2941c9c2a8328172fb6b0173b7b0335129cba1552edb846f96694138261db1b3918e66b40581bc8fd6371e6fe2f9df8706be076468ad103b20f3195be7ce34e874d97fdb678bd68cbbc13b6d2e5089750388958298ce6d390bcf12526735f9b69414c09cf9643a930ae42834dc038bf4b2d67a7de5419ca0b14becb00e783f8c918b9e97d8c7cce22eb6337f1ce3b042aabf679d791739512a1fcab7be1ecfe37c23392221aef5775ca6111bea9449299a6b28dbac4355dab95b9490c8fabd1f5dd8ba48c40f001d26ac14bbc63af898cdec11c6fa97a27acb170ccac556fe7c986e005a878b0650be7e43ff0d40a8c2c91c8171e93174cc35e8f83a782e51690464b15b043aee8e251a9f5e9e174f2f4ba69be33ba174582504d8e94c46949333e40bd70456655954234978b45bbd33bb4ff790614ee88b0b96bf434f01ba89113ef82927d6c54efaa5ceddcafe6264d4b21df1c7d0234ea9b81ade9b8ac876294f7ec5b5ca2005ff4f7f9113ddb261b838729a16414823b85100be6cd4f4d47d55388747aa761b28f6fa7479322a910d9cb0d6d8bce72dc927928944162bb62ba3ed0713a72989933cafbdfc58f2b9d884f9f13085d08d88724c153770c2db82e6ac310c380bab001cf4f6b4c185aa702087f4596c554673a00eedba458b8000c1a94dc3e39d9fbd94b5826c80c013356fe5419c3417b2488a67b1fd63807311e395d8ba4a6457aec297593d0c46af5011c13a62b6f66e7067126a0009e846da027398e745e7f39431001aa70f14977d60f687fa4c1ecc465395c9209c6b1ed7a57c958a77223cf2436ca7dfdc69de59bdb7a8e886486675d357bd11e08169043e757109b52e71f5065bec368e9afc292ca3db1e727b5294a145448f5089f06a0ea6c8238bd717cb81f01024a7f5cd3a8a91e4feb36c8ef601f91e2eb456cfa016fb3d7ff96f0d6261bd488a9ab7741423725b23844418e6cc98e9ce9cbb18e255b831891af2775192e8847a55d26565e08002d562419c258f0427456bf7f63093315b505ef6a9e7463cb64d80679661e77d8b79004c346344f76bc574f68c3907d952d508b2c2d281a0c9412ab8d2fcff66e5904087ff1aa8c92bdce8647ecb88780805117b63b68a134b152d6ae5dd052b306c657bcfba1b42a94b46344cb9a465a5c722fe3d9d0aa78ef99dfc84c2d1c205e7a1b58d2f2407f51f0fcdaa9c12487e50fbc24491e709e1e3b3723a90ebbf328b25ae4164805126ec2012643590c6d441d8ce978f063981520cc78ae69823396ee065a89a64daa0e37019832ff384ef5e0ad05aacaf5d0fc9ab078efdb65a710588c35f38c8d62771d6452643e504691251a51df6145dd87bcf04a325c84c47958798ae5bdcc6624c719aaf109b826190b9068b9b5ee32e14b8cd2ed181a2ba2452c00682a026dcaa022715b825944110f630c67a36167fa087d36ff351924cec2b59106b321f48e602f9a556519b7a055cfaed23928f14e389be2c35947405cca4b78df8594189210e0ff60353254815392242188b73031cebfe4534b5fbabf5a69d1372e4fb66c5f749c286353520cba0251e3195e9f3ad88ef392928e2eecc441801d9b9a84c2ace60969958b1133685173107cfdcc9ea1fb1013abf128bea4b1fe0a37ff14f75e0b270b65cc19c2d71604dc08c675c336fff3bf4db70cde933a6fde791fa161e89c44015127e4c0a13b9cfdb1398948d1554fd4d4620d16947955a344d219dd14f57cfef12d927af64097826c032603d9d25e4758ff80bc6bfd7ba271d02587accd4644d85d1615b9557031d1345cc8db054a17e7341f4d8eea2e71acf93ceb3062289a100bde1dd90519273b5b39926f8c45d17848ae475bf9c371e391241a2250502a5bb98155b0fbe12f44cb62eb5240cfffd1d2bfab19888a931c9da223efc3601a461ff75e798494feb5c618880946034a766f73588a740e28773ec3ccf44581079e627e098fa006bc287d03d947118d0f56c885963e5910a0e7dc418885ece0aaac0efdcde820a70508265d40671fec15a74b374dfbe2f2ae2894e63e50eb3d7d4fd0143392a1cce41f34288bdf06ccf2bfe1dd616fff6668de31a8c28fa7e06c7ab6afc706c96b28162a0dca6ac089baa5ca9b966eb0ea168677f8a489c4ba0cf520474fca17d6c30b2e9b66486fb86bdb92ec9d456e6a5a1202bec09aab0bc41a4f528c551ca096db3153b6b194f1bff8c03b7d6e9bdffe213106a1803db948142349467e6cfd97919884588de61677e2a3a3ae7baaf2e25d86b40fdc7823c9d3cda4408ef5e8e491f4c84203e60ef46ebb569d3de91cb4797ba3a54b9e127cbd6f3e709c25717498f18fa9055cc3de500b1d4e59db77934375a2335b5d838760577ef2741e5a6276ae2352138c5bee0eeb677425cadc17e3115982e68eb345611525d63874c407dcfa92eca3dd7718685693da638b9273bd851a340a0aa381d288ab5b766071d4827b053e1bc61f3fc348564c179b0077f1f36da957d12a29767f74cab082929705dcac2167ad28ed4d8085ab6bb2288a9546809041db73cdf22dbbaaca86c43478490a117d51aa9c5a80254e4cfc2ab15dd0aa7fb287a7d5f85e0fdc67767ef4e2d903b9fef2c64f1b830a875f0fbeef6ed02f523578ea7ef43ac9ce882bd0e80bf59c6fa9482c5ee06cb5381366255effb1616f502bd57bf2c20b4c9500b84a2ae03a123fee7dd76073be43d87765b1c6dda2208150a1e8210b385ac857381485a9b2f8c6b02efdf6b6253e06bda913125836a474448ebd505b9a0d49d0ab4eb1e6cb072bf15e2638e6fd86b01fa7bb96f9268211718d46822aef3eb1cd415827fa7bff37464d7f7c39c3d484002d5ce53da9c37abee4ce89c82e7c4c43d05aecefd0ff891b50cec83af209cc5ea6b87461c36683fc68918004242becb8a2eb0195b3d4cbda79c79d54c8522897e2a1d4eb7f553ec40556e68c5dcf25fa93de54b0f19643d1bef7310d5bde5895f04498e35b83933edad3f6ab53ae6d8ac901809894bfadb46d2096ff5358cebdf50d7871a3bd470ca34dd28ccb40da26d5d2d6a0577df5d48571ebd6eafbda11445392c8a4861b71440afb4971aea1be1074eccbb99cd0fa38ce2ad4061564bc7d028efc23dc80e1628f4889f2e638feebd39cf2938bcb3463a638d218661b0ae97c6e84e642e4769016a4b08335cac2331f3c2728922c885ce7946f8b97e75bf2f52b81e4cfa3aff76d0c66ecae70b0f53a9063a11eab6b5888d1de08ed9a30283be6cafe652e1193ed40a513379f53d5f2928541c80ea7cb313d9efd46c7ce231bd6da3cd9b4a7c24f09c1cfbd7f7cc6e2abf8f0d3b36341eeabf4f435ea607c9fce5aad1113d3c542cddea8237610e74f2f83deadf17f96f202ebda237bcea2704a62a374bcf1d84d41a419ead04a42d0b022500e2ad63a8189b3bea28371946b7fe33671061ccc3c982b2c47dd12794499204ba26d07cbffbaecdcd8f0115942e21040da8407b02dd00d258b23870c727ca9794030c98d65f551d7a0108ee9f5075e8ffe6b8947550a1aec1768c90dd4e9b381625fa12b3b8f2e8ac4e18d8ae69d869904ec9ccde7895b9b171b4c4bb2c56abc00d52f9b725943e0ee0c788b2b265447485bbd94b4a934a2e3c3cdbf7d0484517081b009568a5ac2144597e140fa26972e680c2b6b9301b7177661de008a2f7f756f47441ad566bc33b6672208cda1add9fcf8f46a834fa964b67b9742fcbd965b5ddb02c1771673e0b7e1ba40aea2184a351b130759be1f57dd605e6bd53e1e95060743aaa3c11bba9ee5d05d12a7b7085497d008168ec4f835f825b03bc9e45aa7ca6885fa517b7efe3e26b2a644ffe2d72f7d283d1b4c524f8b0c4358f5e7a16a9f1fc2a8d22e5f334c6785a601e6b28b88f2750c104297a545b18ad0c1040fa5ce2d06d33e482583322fc37e4a81252d1ee45a474ae68492ac4e38ca0975b64e8215a9acb5d7a6ce45404bc781e3d9d4dc126c6eabca22fef4b6b710a271be84972efe1285d60e7ae5bcd734c41612665b87dd5958ff3a2a8fad78843ff3d0127bccfcba36c817b53e1a633cce3da6c2833a88353d921634908dbbf653ae2965c6da9bd76552e6a08cfa4a549f1ed4c44d5e5e8ff3cac436b11524e855973888f8958b0220b9bf6aca32ebf94590626e82725f952e29f6d32262cc998be88e65eb43076e2ce5ce2ae5c3bb7a5c348328896a111e43dc55ab837ef7a4b94d574aa70b56eb4e13b8bb0ae608dd9435b550f6f89e28fdec1a8e9f5825b0fc5be119ad69eb759976cebc6ea27387a45a044825b0879a54de729f7988c8bcc23a3f9767c06f7e5d76be852572b1cd79531071c55ea742ef21bbae3d4a9515172fb30758d090482d05b357aa90886f5fa85a92f65e375b38e0c202f415261ea68e85dd4e857a4929d1b3372c5dfc30a314cfd62c7f31ee0c8adeabbebff9e3373d2f02fb05cbb5d50e63413e05353931d1d258ada35e1cb32d3fbc48ee81dda714a5b48efa39924542f4f3380789159a61307d8c15c4de696f86517a7e2fbc2ea15cbde86ea6ca8bfab603b38d885306942f672bc57bf9a64fb7f460403a1911c3ed9f780a8168a80709b3c9644966f46979f579e3579835bbe955ac184119b1c171f1b402f75cfd518ad14e482641d00609fc975a8ae747cdcfff5c3195f3f1a2d80fcc6af66d41469228b84bbdb20211f3c8a47fd54a5bb31ea385d5d8f5f33f517628c9064ccc7247590e69720d6e10b00171779a91a6a7fe58717858445dedaba3a99da217b8383f381d447f9afc93367e75565c93a8232f8ec94598388e3f383467b5ed807cd91dde78c7f350e760d615600923a6ed72a5cb02720a341b0a55440a13712f3b408d7024de7cd8132ba9bf73eee95b4b017d9499c16680a865e8cc4b299500c20ba8d07c4a81918862b25e589fe74f27bfdb57505c7fe6d47c05a06924b80e979165c27ade4ba5e19186bf95bb63b741f466994bf64aba9c42b306ac2d02417a12e9d3969cd9170c9bdaef453d269df27bc3fe544b894e81cc1e27cdc596e7292d74da5ab32239ec1a64b0b112ee9c833ce5087d2ade635e0e236491f4c47885d23f5cb9e3dae114017c0e03fd2ca2b5d2261e114c89dec295558959d97bd9de8b5de08f5ee91fcc5fc7e185e4ceb99d872a0ad38d95903d49db23aa315455fb4ee4686211770e8161380c4ede979c2e9a24e4ab0fc8f5d4fa2d3d9fbd5439bc26287c1ba258bd7a11040e6e0f4dee03ef199daedcf0c96ab71330d2b6f28cca2507412927b44b93ed098416cbc585070a50c14c066a14ff768a2af0707b3be12a274ec1651c36a4ade863516c9c89c938898954eeed2570ee436748be2864834e069766b936066d4048801f96189831b85cdece6dea552cf5eec0373be15638c568add39876f5b1c77063bfb40a0bab66a076e2a7a898261124c82d7511717230736410fa450a1fc51a2749334c1b3e19f7cc8ea6654a09b1fec964f13f31db6016a2a16552ecfcea9e6393920c0c63c3d672438e23fdf4c73fb012a5881d97df5605c94ea3b713291076861d3730381efa6396cea7062a15941652010a62caf58cd78607f648da58e9d8780a7d8ae2bd9b830f274c8a7b225815f9f1f398ef8c4a05c3b815048a0177aacef12dc079935ea8517050ca25d2e7737bd14b0d3914905afaefdeb055a69902b9f897881cc80b1dc54ab72334058b1cf2040d0607da54169307a76c7b05d964ffb5683508a1e6da2450915415c084c35a8a11632e4229b1af0fa5cf034f83173682a173c4fc7d568c5c136240079e7c1aee4d0755ede1e7a40aa3d4a91e67b20db1a30f067d3bc9a2adf833061d2947aa3ffa87b202d8a20a4a9d11e10e2e6e869d83c0fdc1451dcb5df46dc889be6c3d8e1ce2489c3a34fc9749abf606a8bad47d994c01405e186d9d0762542bc51b8912a45c293a10f37253a5678fbe7934c02f333c7f320549c8c4e391282fe5f57afa5799aee68e43daa84b7dfa032eea2142b79eca1b4ec9c1d38dbb1266353ad2a9d63ed2c5f8d6952406d22118de395f7746457f8ec1709947a44935bfe4097585a90b833fe621600f37fcfc1aa8eca6546f9b0a57858d37b3a05d7f2c06c0ab46e56430577e5c402b4aa811978486ec2085a41f3a76477c5a5535d510a767b5ec8e28610974527b40f39ed56f641e43c59ea3ad074fd0eaec461d6f98810902a6490aa2f19f0c77acafd011fbb0138ed928228b4805b9fd99de53c2e184b5a157d9fba05c308d77b3bef41d216faff5fe264e24228f8b6d54811ed2897b10bec42bd19c283b0944511dd6592bac2fad1ffea30934f04b9d77ba48a00705308eafc7ee85f91f81edb508e721d073c21e67248ca13c36e2cb3d5eea9d17d977ae3dd06ebdba00518138ad7e23ba22de6965d7990dc810f7401bb102eb07278a2701352d92e1ca701dd76243b60a64c50e6901f49096de7dc3e36d9ea99986c20f415b43b9c02e5d3a1f115c486bdea09081e83637e8be22a6d74f9c4b5855ef872186bb4001a9a8bb7b3064781c51c174e05561bc5b8cddd4a7487e30abdf9996741faaecd877c75c759ddacb84bc80196d4830a10cee8023e4df5d9d3f82251656c16b31edf24563ee5972405a300247d718df3e5762e1b0525a1ea651661a160b84d620be7033e35cb7d3cf842998c9b37e4815192f9f657bd53dcee4a725a31c47b8bc13d06bdd2b227b641bdc989b4c9c2a6f99172d6620beffc086dc29f07c290921792449fdfbe02c3f05147f49682519077afab778b2b7bf43cd2609331c67d9ce92c2f6e076dd6a6ec9a2fee051dd6d82a449bbe68002879dd2eb6efc62fc91088871e6410e821e5011ef9a618da22281ac286242ba34ca8296e3f37799a240b209b56c957faead6d9fc4de8826929ad8bd42574b2982d9cacb88b2aa48f6b72f2802311d08f222394bfd968d478d733ccf86026de37343c6534a52c5a48d2f1d7feefc2a78ca0f2002be8844999634295a4db4deca8bf174e54c83098bc5e4d0645df11c2fbc2db767ee97b2ff5e35186de47232da250a1faec5480559fb126f7c04a5c614cfe13970394a72b00c586e0fcf8134fef411a2f43fd81e99b20eb2f9a1a42af9df35c3595979e7506ee69df01f981b77f78595504ca63cb13e2baf865c0a03e8e5855c817d60fdb3d856afb7f3f98dac2f1b7f0c99937610a0fb88fb4fadfb4d24f14cf481734182284bb30c7324248126b39f20f41b9d83ba71baacd4e46fac06825b6686b37981a9e191fe95ed62bbde4f432123f315f14c3683a91cc1c804ad44c4464029112e49d8ab02536da431323bd50044b75b3504041d48769a57156c4bd48e688a884407c8c4c45dc561400b8caaad613338ac9d091275044a2c6862aee8268740a646bfc46bb1ea88d0074e2c0c3e7105b2c38b7aee610ed07ca9c03c28a63d31c54201e53684294a149e090ae22e8e65036bac9a385ffa9622b4f450e630d2871eb2d0aadbbcf44bf770d69443b70c5d871664afabf018294cbdc99b5639aaabe1772f36d0a0969033b198d6bbb2bad9bf70a74d955840dc159bbd61c6a11c0b9ba0490c614ae875e08940ece8fdfce72f6e0a4db581220214f2bee8a796f204b3b331969a1a812e18dbd4296f53d32d22615d92c1c5b977838973c9f9c42efca5abf876342753112c517f1d6410ba622332454a0a12b9b7d77255f85f2d7d121c78447aa9095cb0c45d4033b886383044aba40a441a451d582a9370f84046710c2e006d1e30927da15ec715103921f46bb2783c05aa5876e5645bbcfeaba94e2e2b845637d107bf062e1821bbe95c686e39355788a12ac44d2e1e6688d9c78a61a439f992855900799b6b9214ba36409e9971da757de4b706f46ea15dfdd6df09588fd189ff2810d849915b10bb7ca6194eb9c052489e4e8aa8f03e6ed6758a2aba37319f4f7b8f181207a6d493776fb2b5ffc0c8fccaf77921af004e6812a422fecd38aaf16c29368b1fc6f8d3eadec5ebcf3187e6dca83870ecf9e964454273560e1f92980e117c40da002d738b6365cfca7e7442713a04cc46e4dc2bf485830601df7e673270032dd04154dbdf086d5339dbfe391ae498e19d2cc762d48fd18294f844a4665100f92b8771699190cdbfeea868cafe1b500f99ba2365885027f8bb4b321664d9598e0af9a269f4c026050867d7bc9dfc9c3f3ac53bbc8d40e00885c41502c5866587a765c3c205cb8da472aab632bbb2601b81415a265afe842398de64fd32d9e2c5f3a94b04122b460caf400bf124fedfd057d722766911a191a32a4149853d393accada3799313e2c46bee868a379317755c36a4ee049b7316819f6897b603b627a393fd78d5dfe738c8e00d0c40a179463d0008bc61f0788d3fead4b15d862ab531246e1e1f401afa989d8ab6d36e7df1befaf51e29296ede257c46706ae195f5dfe57fb6ee08119ffe82f7a711d783bde74d8cb35b81195566b1118cc85ed0eed3553962920f8d0f3cd03844d2bf593698dceb05db36970a0e6e78b5e2a71b91265f9152c695372ff993aac4e985002715033e636a5d6a51862e19efd338789ec780fef39330476d1b456a2cd91cd6b6f999bd159848ab7ce1ee85c489559bb121a9db998b260960edfa059fa403bb17695a03aff98f310df0c2c411260bb36a5571dd95de4ef392408e09bc9d1ad0cecc75bae7f2af016f05733d2b75496277db540ddcafca8516a3cacb44b4251a27365c7ad75ada53e053b94a8f6354d9b24c1a04d15f58cd02588005370f8b562e0d445174aa8307dd4444121af28bbe40de07cbdacb187434c81a4fc2edcf4d8d486efa175eef32359aad51b87dbc5acec27cdae13040de3895874eeef0e8e99af9352e0c4ca938c651df84267c052163ade7aba51628f5dd45d580768c55df24405ca9fcfba640d5d0d5fbb6c5c169a47b716d71e4730617ca2989aaf4c5f28f86fa27f08adb8548fa7a66e6fa82ebacf690d77b6b19d410b52f59e72d4e32ec2a8cd582a0134199d0b31709be4236669c40a44050c39b0e6f80bd74ce2a8e06089f19b71741a5715cb52d25fbc1c1410c88dbf8fda2ecc05e019d8e588e2ba690dfde56d2f9e17760d01e2d8d6203010daf734070398c2baa24537eda0868ab8adf298570ab9d0cd3ac7b973d3e81c81117a2d31b531039e329ac82a33271c098298ec6c1bb0997411709b09bd03a069eca640934c1ccd48bdb156c9bae202e211de85dbbfdb540822c7e76e270d12846eb1b005c8bece5fe1192f79eb6190f21c81c5ad13059ab28a5032638a233076990d94591f4a7066fbecaefac34c2a9fee0d03dc656465946ba8bf51359a740dd5170c1b1018a00d315b46f04701e301bbf6ab9b9fd1e20dcb7d90f2417014c2ff3435582aa03892d64f14fd3d23fae907396f0f53510c97baa0284de7ee542d57d06648cec94ab15d8918b1aba6b5f6c77fc06c6116d464d6cb57544ae694603a68f9439ce7c2baf89056ce595a45cc105ea7ce8b850f897d14b588be212aaeb140dd4d0331da04e33134e9437e3236be59175a7565459479025316e36e28bf28d1c3f1707542e2f29570cd4b0212343b717f5ed8f21c88489a897b411411fcfb6ba7b25cc121d6f27709adcbe364775bc45038d2598e14b8d49be92d21f376f4ca3c5d2cbfb99e87cc6978fb744c73465675b2349f1472791d843fc82dc64f98b9986cece4d5dcc628a4c4a087115d1ac3e0b4cf227aeb3da2363f8a2fd2aeeae19c8bbbc45581dbf982590ef29d0bac2994140e62e7ae49c1e4be990449531f1742f9fbfc43a21974adb984a9de46345b8a26b4bbbac3e3ae18d3afa3bbd0ceda474ef463ad1260c9d66b9d05fabcf8dd666286b6ece1e9184c31ebb689a8f28f6bcf2704df3894b776a0525c32d05f9ae71b7e004fae5b9dbfae7a3eecc3b885e73bb2c05ea2a9a0882d8535d534324d2dc5504e76ab402191ec719b52dea2dd4c5a63207f96b27e02ac4641c16cb815760326375f0d1380363419ade1aa3d34fd3547df10e8d5a51d9ef34192bc972a3654476c8e55fd93dd8c5af67ff3a0d8b9461a517a99f9208bd3f0c3878ed02e9cf4975d575554e91318c58bb9ba961151e8afb23493bfe695a89364f42d4c39bd87b0a46c25c4a5e33b1f78fbc4519eebabe730f8d493aaf976bcbff5a0ea9b35fa9b7e3d8a24295ccb79cd37bc479671e4a59bae144afd361cc431255f2403544af17db9d3a79cfbe212ca06a8bf1924511e6222e4e125c36c488414054966028c527b791da06413eaf59f25ac9a628708fa1d18f3ad164856631936b1e6241bbac2091b1603a13b48d13fc06a1c8c5aeefeea2fbacaef75c17702dfafe98ac9729a101f98b1bff5bbce772a6f6db336ff11b69b4cbd34142648fa26ff6665ac3ee1f58680d29451883260b4352e83646ea0e587d334ab601e5db37f694406d1ebbe72ad3769fd287dfa03ca14466d67b62df89a0ab393815700888a0b7c24cb6d328c296081aa675647123831601952d4e29ac9b03d9fdf8dc46fc332d35bdd253ad806087064111d6324755cc9bb7c947e3335110a911c3fa994e139286167d99f7bf96aaf0a3751086607b3ff45942182573ba518915ae2a0a610ab8d648ff9fb1e0be9d4824a6ea3da696feed4248eb333ce9984476597d385763b8a29edf005533204027d2b5aa786df65996c65720997e0cf57a1c2ff9e5048c17a530593312a5f0ef4e32d9a7e13867f386f7dfc61c7ca2827ce6844d63036683fa4c887c2bca915ebcb503b4f9a0a586fd3985cba4bae382418ae4d2fa5185ca70d104bed67d3f3847488e74ba3b11ed3a6de58ef31591b7d452c3d03fdee3e266c0c88bc1f53b5aad230f242c4fc7cc3fae6f02ca74cb011969d53e0ff215a350b70f3874a4b0eddd3509f0fb33a4c0d4ce344454cecf7fd3cf80b8c00d8187f89f9bbd54afcdfe3664126d23f142c2e9c40812a9e8ec4c648a05106759449fdcba547300e8015b82228642b99af58a6087e60df80ba6c298671202bc7f87a655e27b241c64406fb116272bfe16dee1cb93226ed236745832859af0896fa33f2884c5beae31e0ed736323f26a44372e92f316d6886c769a6602b7882871c362353975cedde39894f157c1b4db281b3701493127422e3809356af973085372218297863e7714f903b300a3ae97290bfa45a37440559d84c9901170983936bd38697598ee7fee56009319c14e5231219719adb298aa1d1c0ff58d22607cc5e82c37740ff18018765991202ef70b057b0c297692ac894550e0223a4bcbe6d39cd50da849d9890999b3834599e1388c3a2a50d5431885472ad583cc76ed1f56ea778b9d5e370e0e7431bb5be3548affffc387ae2418937664ce2dca5be99ad2d04ba7c38859de7be8018fbad7bc7700648b07f953288aec5936ab536224d6ba021bab06cd867df88d3f2f63fcd6fdcda7bea7cc10c16fd72d79b858f9caa05a13e710b379a4803ecf7af5eceb675fe204a55953e75175ca35b781a4aef646b7777f47c36103c9a927c20c1a302bf07100a3b00bac31e361c2c626f043258914d25b058aadf8589232ed79a148d209390779f5d2ff1e83b1c80935895a5d38c00d99c0220f10a7994b388a6b792164a97aeee047587db0c7680660d990a5d152c49e3ea1264a9fe3100b048a2da8fec5fcea5afe9b0a43e244c0f446a59a8cdfd06c2ad1be4bcab5d3ddbb1b61a280f916312f9bedb7f0bb840feac9c8bf9622eae894ac82757882382a63d4bd1ad8568de63ede863c886b5790954033a5488b2d029eaa9cf056d3f0978ca0863dd9d003816ecd6fe022ac2917c6c20bdd29632b87068cf0dec611182961ec3155538f464552ccb975c8d60eb59c3a32c8cafacb6d7fee4afd58cdeaaad0480c42b57d2da9c8e742b67c89e7a761ce120ea263f881d19d7e535eae118cd4993ddbadeaaf8f7c35c1f82c1487dd24211a68ff141cb676dc410d097e4706c0c8a4e46a74a29483a0a200a355e7010445cf6ab441b2b9834fe28ee81408ffc7620b3f845ea7ac330e73332b8aa1498d53d72f51eece6263e5bbfb796a12316a3eb472a39101c57e4ad8b5566b7502b6d846f4b276a4c826f12005bd167aa54424b1001a7eef6b77d5013d0fa1047e2539dd77738ab674eb47fea5073862aae2a40d67c09e0ce3ec62642cbc3d902a744353b7487475ba6e889e35a5cbd77fd1a569949ba449cce1de4e2d9dc8ce6b958c7d70c52ae17636d8594836b986fec1914a79e8addc432f429c53fe459a9c239347c64dd327dc17a01737aecf099bcac0be043efff02289e731e4065e3d9a848aa8409b6cd47fcffb77aae7ba0fc9c1f555078854592f9bf26befe1dd650e432bdaedb880d70d61869a53c97155dbe6321bd9f0b6619cd7f110588e0b2c7e79a925c82ce848dd0b49b4544a50773b18a1f070ae296271618a2ba828466a083905860c00582f5770bcb136d8a0647517d2e5a7dd286ef7f967ec281ea5695cb5d0f48412cf30a901d2729271632c7d7fa2ca2cc5606c538e5cb6c6cf006ec9c1f6e892f13d6fb98ae779c7e3411d96266e13cff369febaf587902c1fd5e1b671969d791bcae327fb3872d4738cfd51b4e5cf27f0cee58a030b56706ccb2d708ae153afee92d94362d7d53e459fccfc7d3c58a176c6ecdd3dae185f005c88a3aecde0e467237b79021fe141552dc4f4ee90ac493a644d6ca575c43961f5a6443bfa53d7d9c612725e8fbedc9fd27daf6edfd77f06413a59b59d8583afb3ab0c4919767e17e928c9692b6d1327df634b8c206bbeab4a4090fbb48d4d88ee7214e24edb688dde8b91be52d57de421909275ea40a7c859ac6eceb685582a7e23561c7457b4feb40be42dbf611fd38f5d0283f3e620d02a82d940e13d22e642139d90639b27d7fa3e5e8103d5c66f23377033c9f40bcd3e73e1fa526b7b69e5edb6a38f57aa1c1db02d968090ca094f247273e7d86b57b3087d42ab43a89e03638cb4e3dfc3a4a116294f2ef161602b70e8d88506b8c2f365393c5b5d2bc1f7fbe44ec930cb1c4cddfebb2c08ea17d1959394e16311f9353919daecf3fd2006af3514c50de7e201fa11f1bb65c962340649035a7536a422b9ae6a8942c7979552d62ef50d1736588bec497fa9750346831857151a47d4eef9c205e87909bfd50ae15a6b88188ecbdf64828a42c7ac96f10eaa12b90971df8d9d45147d88a5f5776412b7540e0646056611fc91c297169ec8d3b387460a3530d8ed475dd9559fe546d1622dfab535f5da5afce69f86ae19000a459370aa3983d2dd7b533018fa441b528ec638131c39997e263238a9b7c4860ea5cfe83a874b23ccf34a06ff8af4cf45724c2043559e83134b37e024f2fe87ad5268cca2703e9270f81cd6b8f7423f10c9a1ce367b803851ac46f3bf10e8904a47b3333fb8f6721737d7a3f644cdfbe4bd134800d6f4932227926b9497e92bd63ec0ecb0c2252b19fbc3feb2a07353220256d7aaf97d1a6701d7cf50faea1ae49ed5724ad7ff33031389ee046ccc106ce40e0a6b8a20f4b0544749c6d43f2f0b58322442d5508e0d2289e9fad5400ceac39d323fae5b9b4404b52fa43a3113633ea89d44db9443270f90a400a58077a1e6763393c87918f71748e1b1ad73f6a7c8ff4ca59b8f259d42c2b7bd228be3914423689127c9a3976505f1a5e25232edaa472835806a8ceb9eec1c3bc41b03ea1ffa0577c4b5d0aa451b80701f5a2e7c69bfdd08ae6a7c3adefa8b3cc24776d14d01d805dca0365d7011b4ebf531842b7261db0010e45a13d94fb1c4fe089a002dca1851158a78d4c7d982e1adce491ef31125b77926beac0652d4954c3fc04e852670397de8f8dfddec51f24c85084c84746fe6ffc8e180b8af3c36e12ee0294dc6e72e5dea4f98f566665208be79cc3b0a5edd72d14fce6b799b51d17a1c3f4a67e663e93d9a4ba882d5687832fd351cfef09103028aeb1b71c7a6a634ec26e9c0831584fd7228e4d2264cb61f409ce5d69dacc1ce444de71b48fae51e538fc674d0531e27409909414f8e13dd6dba86f80471beca5d95f18700c4f0aac5de5955a89a8b22ec487af00bda1d9146ea0b154b425521a568f7f9ed351520cf0f3f0415d1981d2d4b1e9e7154b5d3c3ccaa8f9c252878fb350692040d917c0b1ff24e9da4d4d60c2d647befee560124a04417e8cf7a2bf2e50b279f8420aeadc63bfca4480bbce41cf2949c00ff33d25d617d5451c76a7b1a7c9ed37ba500995982dce5c2c3fdc6d76a05ba7e244cf63703e90782a97c8af76dfac813d0431ca04118ed1ae99047e78e206ecaf868b473c83ebe1440dfce044ac03db8542d9d70cfb194841af361c57dfe7d7a6482382d4da67e77be970791b46c613ad117b42fdddf07b86537ef643a4a0d3a3a1b5b0a9a829ac1f811edd8e8c4fd9c1a10f800b675b4f63c981be4c424943c625797ac08bd215781a853940cb70275eb7c5efca929ac83d0ca7140684a9881f0bfa66f4c253289b1b6e5ae2fab87c3e6c582faad1c995e171ced570ce7ae1d6be4712a143c1482a7ad36348c10ec3b0f0480be9320943d93bee2feffd56d8d53c28124913b7c9ea9e265073ec02ec0e646d4faa6874e4784fd36775244d7a030804c678c2372814a4112a14be1a57ae05d020986f357d2377ee9294701bb2cc459ee7957a430be3d77c06836b1b169b4413515bd693d803c8f95e5cb9fe94a477e928a19ef7521dff867a81458d2c91001abf574752c1662272fe8463ff1861dd1500a49a2b158f9f3b5ea25387c5aeeee83151062423ddb300d463ed2569870a0dcb42afe7e21faf717ef02fa6cba4e2768b5dfd703f83e640aeff2b5e01ea3dea85fda5b7d8afe145ec5133610db71e7e69e6c8a211baac7f6a0f112372b43970469342b8a541749013c4c115739c93a103dc1a6d7dde65c0acc7b4e73a47eab8c109c68d1aba2d8500d5f91b45347a3c9840ef6d99f981a53fb6cef1ee52cab8554ab5fa8409c3abf56751ad49d26ca08b82e0d115ed38a656240f6da9711279af8bba132e9dcd28d03e5b3c0404bfc6db4db6d0eafc2ed4887b161d2098e6099389f77b94578102d3c2f1fe79dcace5566e559ba7ca84a6ecc3af8fff12d5c29fc8b46d8e3af98e653c781a091c32d4524a571984b1325619d70a84e720ee4b11eb1808667fdcd358f695834643a3f52c8869cefd5e9932f33ad56a5d71dfd4277f90de1a8a58279f6a7af3d74c7e1b06e06d53c30d5daa6b825c6b280d3bcf93ff4376353c40d3c55e300b4f59d4c85348767394f574a51bf5c9ddec1d49bb4ff08f3c30c1a6d28df01b7824921525cf56dcb0837647e224dcadf8881dab34c94bbfaf060952ad276d9fbb94809f4e77ef355b3cb86d78f9d4255d9badc7f29a4077f0b448b310cdbbb41d41f0656755119bd85d725a6bc6d5ce8193c44bd5043c6af11f34094e2da88a463c2e63a6e571b8a885d8fd1384019fdebdd81bc8ef09d95c0b9455963e5f7f7759b46946c1b479aeb89a66ab5ab760c6f3aeb080e20d7e82c3ff37165fd1606a469e690f1798173e896f2535126ba4c104f215b349adbd180c90eed24ef1a077a9361f46870a30ddd633bec0207a32d27e1d4c2494e8a59540f514ae695c1b8fe1c379b9c200cf90aa2f8d28a0ffb027b654bc9add6651b8ae3c15e64bf1297d10dfd1d5adad693919001607eafb8d5daabf6142f41c2bb0d869ced9daab6b47995ec40174da8772fbcff75ec90b3defd348809e6a9b1914ad11110810d96c331b34b36a29e9ec9d927140832e0b2cf66e826eafff582e690ee3092bc4e0d1472a9625e3d185e9da6032a21e72535d28b5d2f55885a345c72965ae73ab40c458d04585b1b5af686adbeb05146c3c223c14c9dcf1ec7077b289d7e90053d53a88a5d84519962ac5bf7655f767cd7eace3bf0353b14b0f068454661c006ec938289a769966221e2fd600a54003636c3fab8c05e68e828392240d70b17f5641def0d8b73f1214db603039a1750a188ccdc461981b55e6be98d372920607ebe438f64a19207f0286cfd9781c8a71e543e4a2d0166c8e42d543edb9dc83e9dba132237a8c7c6380925d64e4ffc874cd2851ea85794aa77d20007338b66b29a1d0d2633ac57fadd5974656f7fe55a462750594e2a4297fd8324887b214f9136f0be544f86cec272e3ceeb75d4a0a92e27b1a27aa72daff8b55e4692a1ce40db3976a46d07c918b809c53f16b060e7f44b969557c49ce2ca0bb5e1e5b9f91e96ac1fa1c97a32f33dfea3e6262ec2a1742d389a784945350317a74defb1b7826de84cc8e0597606f383c1201012c5f31e935898798ca7bd0ecfb0a49468daf1469d18724515ad3493a0c10884920a020719d15a94a26fbea9053f53261391e026c73b87eef015187b96c9b538e39f0368fd7de2c7e4bb63211493106c66d67c10962dc035cfb2c1d42cf3fd1aaf4414c2798d1d2e5038d9a2ab91a05f165e50b2c92cb435bc59e22bb972893219ceaa70ab1f522ab8a1162567e243c64cf79c33496daa7cf9d86790f23ceef16ee5b51d7ee39ee99a399e6ec2278652c411fc0df31f75c1ef0b866923a230c4ab2ea5751c3cd49e88e5098d8ad0c224a646458766ac8c754520888599d486395b9327c546420979ec91ddc5f358dc8c24973c30cf2ef57fb7755d00dbf2a8bf701be57323dd91738afdb20c020a7ca0d1594c10067be0ddb4fe01c806508dd4ebc13f5dc3b4fed45581bff67ce1ca40d8181a6db58b47b7fe19c0d0b0ad3165c080aa4e4fa8d8cc95151fc7b8ffa2284d5dbaef877e1042a05a7ef345c8a70d4316b202e2fffbba789801cfe9c3ef6abca7f154845d8af5a98c8d930be8d8da9907f0e7785c72f76b44efe035532d4401f6b6a4c81dc5823802a04162f39600e9982436a6daa2507ef5769e92a0c6ae2ab8c464f215b79ea609b1c72bd1325e8bbb4a33db88b091b3ac951b8d62290a48587b037fb83e1aabcfc4115b4117ad82a69366cfb834b4ab576f16acbb18fbb8e2a0bfb413fd07a5f0b474f3fc8bbfc603e2b2b683c20fb20bb2894c46be1f539c96a84133644a9b31427a9e60de65fef7605d477050676b53dee83b5e94af841649704b4bbca31d9d6836bf97af983cf20b35b7b4fc1a65893076a9a1c9b669553f1ac11a2c447051009d8c258e7a16974b95fb2f5cbafd42c7654b07f59ebd282d05c74ebe105e13c260bc98bda186c3e4af7eacd07f2a19683059fb90045ed079cc8d4cb9cb1bca193aa54588067a8d145f1a2c3cf93890b041897f414baade0898be2b121647dfdcfa10d3617e887c653be31328df6336a49d5fb4ed9a2d307df60d00114bb611b61711b352d5d4397166f71e0cb57cd44994eb225b4af64b80d4e44bbd7b9455825532f381b33f38848d44d5e99bf66bc560c1fd9fb235230f7fa1d1ece9928bf112c8b381e40fb1039c853f5ff3f43b8e8b4c3a8325263696fd529c2d70bd6491bc9632776e420e042412da03636224bf45b3cd6eb391ca2448f73b8aa8265aff09e7a8b5521875d850cc2cd16cde569c712ec0b2b73ff255421a7faff0c08af7413ed16de9aef9ba87cb83acac47fba163c0ce35eee6c38835d91773ec94d499056ab31a170e77bb15846742309b45203bbf6c71cfb25d73c22d3f89f15b4074b18c718be8a40f391d0f255b6584eaf0cb2d441b751f5816740232fa5aca0742dab364e49aee7e1127ef53ea88713d6ca607334a112a9ac08a1ae5e0a781720e5d702bdd3ea5309ef3f149e485b98f5eaee4117eb8f04215fbbc148b1794c79d3f53465e2d75e46087c2c8092ac48c8e21550ca90bfb1bc2d20a95a9906026da4069c7b4cf20350e1365d89e100dfc86e4e83fcaaf9b8da9339c140dc28cdf59f096dfabf26ffa46d29659cc09840c16521dbf4f97a124f48c8209be98a56171ae63bc9647087aa8a5863480b53e8e76d3b438d578eeccf604319de640f5474283d3602ed0aed5bb2224023bed13b0ae29d413f8e3732c09c3e5b56f621ea1fa95a758c93f7813356df7091420d8800326e9f2688775cb21b2c688c2a1f8164defa5c41066840ce64ac2cd80c532dfe1e5e3373d57cecfbbc6787d15cc8516b2d25c84f8928ba0b8badce08035ad87a2e1bd3b1655b22d482bc08c61b369ba618e984565a60cd56c3e83bf22e8161b19859b3a8a3c24840eb8206c64c358c3efaa8394ce8369682bbf99494e968855670d5518eac04a1a32262df3e6768827ae95630a7e0c457e1eaf350c29a0bb44d0b62ae081f3a20d45e5fafa6ac246f1921bf91e9496293261be16bf7a3b75a9caf4e2b391cf57d170fc241001bb8b00e48be0c95b2e71b3a8e48a48769db048da1f97ac09491f8da0826c6e0cde4b6cf6237d68a2ff15c9168ed5189ba14d0b9ef98b2e0a25359352f6b61a92c89af553b15d416251bc6e1148822a6bd78c1a6aac1816ea3377495bd260ea89295814ceace8515e601dc908e77c55041758a191826e4d76b583206df6416870d778c19c94eaa8a2812ab6799fa51f022469d0a87aee2166394ab6c95e32e46dcab4216c977ba9adde111b2a07c7d1bebdf3fcf2323592e02f5c9599d744e61418b803e75509b11abbab545109bc25e127105d78d722711c97f40cfd576a807af4aa27dc97aba35f83cf1d641ce0bdc95a061b2aac56682014461eeb2b3c421c173fef3f6b9fba191506a8f2487a1df4eef91749f50989f051e68a6dc41edf3f4d9dae25e89a5f6f091c9801d4e9a023f31c908248e190d984a9b56680927924d9c79bb7abfb9c89dcaff4f55ca603558b6e4f9870d7ac5b30fda425c89a06a23984688d8aa6c105feb2bdc9d67bc01a26f098b4bb124c1c116e8718020bcba906461f2b012718124a0fe506ac041c49a298b2042f68dfbb7d4b7a1d6254ff457aacd03785f287ecda6d5924a5621ffa3ccc5d52e57021d9703a52f0ff04a7ff8a6950364710e73c80186772f86e8ab35cb70f1fad0b83b903568555e5bf8f03a908c49960d85551753bb64d6e761e1d24677d196f1610a3d5990bea547a1bbd85afbc1a9df5522b71ed2ae51564aa5955c69962282f15daf60ed33d687261089ff7834dc73db8269d5d40c8faf4268e7e2eaa24d69d18d22e1fc8efa69cfa397bc56931d22b47d64f6ffd4518104f8b8aaf44c610e807dd2769c71cdcc21db5b259c5a46627b943adecfd2eb25190fc3c8a5186f22dfa9faf368a8e0fadd6f6960241e1c855d4ffc53f8d7bc4327a23971c00e29065d3d3a4b0fdd25885a29934e0f062997acdbe63c77d9fb1024a9f79537a9135bac680508366a749e9bba9eba4e1c710aba2818a420e013d479115ca42004bab18991efa8ee3e251f6d474a874fb1243645624926a3dca36427d63432829ad74d5bc245c8e17fa57865f9fd68923de50052a37d22c764ba4199ab5726e509c04c098352f52f2f71424c787c01178a04c39803ed11fe2b6dc6b160117c15a0bcbde85aed86df71895bd37e8b01af20f7cedc60235a0d411f028ce215fa21b1ff433fcabb35237abfee7ddc054ad7f3718cfb8c97cd7d047d6641b3b5e0ff28850ead62f819484e158456cf014808145264580cd3982bb52ca82537676f4cf5d04a9aa0223bde5cabe7d79f4bf58873c7109ceae182c638533dce50c000b468f5ecd9c6b849f55811fcb4838ef016da306207e01fe2c2f480645eb982924d11f864ae804854ee9bffdf8173f210ddf7fdb595518ba3f0e98214d4001164e4e679e7827782ee236615b6d206b3daf74caee16e4059176b0be2f37f410f9ad8d86192b6b9e19e5e3d1ad1ab55b3693bc208e7dd5550ece3c3744cce7e570c66a8db77703c26b281c55b2d1b5ddd6e7b7c84b944932c9539b61e2c075f3ebff253ceba55c26882fb6b2ee504b283347299d5789da4fed70916becebac006be0b4956feb459785c1c760629674f97f52ef7728694a188b5a7bf007582e7f032f2746254aafb8fa2dc9444f4694ff225439193e485cbe26de2f9980f6ee3e8b8d65054b7aa87551d57df3ba8d5ca63b41fafdac66f26de7c67255234de4a764a3f5de8e522ce23e879f1f383c18542def793c4871d4f014ec69227e8a2cc53d617f730c4727e699dd51d49ffc57ef2bcd1bded4bfb4ad781585c45e3a9530c1bc42dd7917f43c4bdfe7a5efba2a2561a7d2fbc29b902bbe998c8262a4a1b2d07d6a1a2e58714e83011d97fd036c8d8d5f1a770c112efe3ea086e72dc14dc219b1c74ea2ca447b4230bf7bcea40c5bc7b9780a8b39ee46e45437dfeda081ad7c8d35cf77a99b1bf63ee6bf8c2bc5f71f386180384a7ae200fe986d8963333b286e2c2bc73f099308ae7acb4dea5dc6243f18a0c9b6bb0933855deb4e847318867d06e377c6d01031851b2f780735a7c10fadf0c2f44baf6f1045c1e1b8743f438aea4f2b060e366e202b3f1f02a97192095b8747a1bdc560421f8a196cb8a09bc757683bf9a82f03b61198e56e63f427a5b51b15b4a3cc5fc4fbad75eab2f68944985008766990bce8782efc541c5589a266047de4b3951471b55bd1676846eddebcaecdce2b7fea7f20a69e1cf75b425f43d9abd780debc42e4c16943b5d019cd65947005adf02afd4e34e4c16952afcda6696729f90108fcff7dd804ef50ef1b8c9c9d4791649b8e53a188690471e4400d3b7d8dff40e5cb18a5a260057284bfce8572f712c3fc9d9a2df1700e0df0af98dc7a70cbae556fa446bb19a48e3be3cd2e3222a41ff3f55e8dd876d0969e7a0292d66f11287a2b742224613244559d3ec22836cc8114dad67090295799008e904857020565a48c9820087825a1f9b56ac7dc3b7628c752acb4e81b8d58a9fc778b3495c59b70e3b70c95c7c2b16ffa63e01096e10e468b1ce29b1f94181660d9e40fcb9fec04ef5f0273000c1b7427a6d387aae07045b3a167321c8b942651cd5dbb43b0b4ce44c429b86d97589a0fbe7944a384801be57ea2165134399e7b006974ec9a1fbf0c8f2521410a79a8e32901d5a62a734e840eff4c70ed041b7051d33e83a55353f982ed2fab5a82f76dc071941538e76ae6088a98bb4eb3fe487b190c991af7966a1c1b7628bca2e0719c609b44051dd311ee5f85690d2be51a71772848d25f5656096c892e4ba005587c190bebdc0540166d84fe6220461925a751bdfa180e26337b53d6d81f6dd8c3a0001df8a775265907ae2a4df3490e01081bbb7e2388af4daa000e5a103da0fbee6da5ae2bd1554cbdafcfe8e138a3ff73fb53168f97db8bb8d36c0e73361321ba07dfd3c017fc1b1835451d50595b709c502997c1df4328601eba667e1e0b795adc07dbf00d6c15a2d93f49ac81b7448333e4dadc06333525a1e010a2aaae78b992d37ab6f0572ee8310ab73bacc8797d05bf18c5c956d12539b85e9026b5c92a6a193870514456f5b8fe2d1485042cdc0edd4cccf462ebd1540e0be8b8a3e591eefd8841a06853167f4967341be1772ae9117bd159f4d0b032a44c2e122f37e23f45630d0689de229b2de640ba43d41437a2b3865ac11bc96d65e7279c0394e5dce848f8fabbef6ffc0f63f6ea77c9c4a8443886bc850bfb729b1c68fd12fd6006e6832bc154fb577df6625dfce7f4e1f31b66defe38ce3f382fbb2e48ba986ae15a62fb0a69fdff946c5c4d3c5d31d079da0a23d5a4e46438ba35595b306b2388a8dcfef1136071a21dfd32be60ccab4cc84ea388a8d1114c560ad32d54a3c27eb0d9a433a015b4d5a61e93458f386a6f62a94d3f84cdcde3729122bc6d6cd65881d8cc4a24b6f7cb59a9f3d985596fba7c1077c6121a91fe5377488f6921a0e037ec1c2f720be8ad9ed3ed90ab9edae6e3b24b357e812f58f436d8988be0c1da13a8deb751e21b112723311512ccb2065499dbb47414f1134b620e0b6267d0d3135e2baf69048d9594507a127eb4790b621eae7e1afcd4ce16c0dfec2528e81b1f93f2a2c8600cc2f581b2c660c2eef211767fc97ff54ba35c06115fb300b6e5dfe812c867852bfefbacc41a6e78eed9bcbb0d16925dd6f3436daf915c9e0cbd155204bdb4b3a6844299e15e8fd3d76976251d343b484e02438539ad6a8d5b865abb6aec07a583560bab50e28ca1bf725b995176d06c7176748ab8252585365c5d039b4297055ac7f204aeec9656a276ce2289191431a81125ad8960b2d505f7a67fd0ef74918f72de7b6b3d1fb2e7e50aad909bd008fba591e3189e803a26c10d0c2668160a9cd398d2d3f7e6e88cb248aa005937bcc2729ef1cef61734e5ae64632db3080a7f4e3da6d467080fa26818a513af8a5196f66bf741421b9201935680c72b8a8e7fd458b654a39dd6b728590972236c32e18c8eead20d906db4e2bd422f7d2940049d81284d8317de47effa096097cdd2194d160284f65c77933b297f5c3da3084b8b69a9efe15dc0e2e508a2d94f688b6a4cc88a98f13a029cfe0d6ffb7d4cff900626aab919c10552434de084f2c4c8a5a1759cfe412503895a98869fe3cef073d4c9813e864abc88b9e78ada742fe49502dec2daed8c4d5564060c2b2d5afb223965f31be783a7dd2ebb5f271604c6644219894462e76b2090e0df213bf90dcac2f48e46bbbefa48056dbe3b8a695268a7651b218887a5687ed353b3134205559f25e5f9760bad3b32def95c7f292f19d9eb35e79605a74e0aae5edf04e0ff458a5fec55a621ae4a1641682a31e3b194c79afb96ef503554d2ab3ff1dab7bab28a27cd72b9f472996a5c46c21890d7fc713678a25184eba64193352dd79aacace130d779f39ad8a5e4c9c19a2ac287030aa5d04e3d1d014cf2fea1d86ad04aab991c06d008e99cee0e5426d6591b40e953801f58e9e7dc8c8596b5ec64d7400ada3b429676f7af743ff6203f3a67b05822d4f6352943a6fc7ecd686f1ec8974913587cb36767fb93543a422aec1da4acac991b7f029a94384dde3ba5f443c4249bc063ed481ed0d3177b2c7830cce923a364b3460f00667557428524221d181deb0e38c57d9c9495961c58ed329ba1f0bea9bd3c54900f5a937fa73830a66257d7ad8710e8f9ecf2910b3cf9d8c9dc8821de72ae20545a608469eaa741bad49b808158cae77f69965b90b10202200769c56fae654ca066ed69bff57c92962ad5d177632a774fab5bafb8f21ebec033bd21b73162ad609ec03310b652ca7a1c25ee38e73a9ca7db7a9c2a602a5ec1328bbfa4e951d04bf30f9d881dfa33763cef97b2cca0b71ef84bb4bbf324b7d8aa1d54eae452831747b3af3c3b6fa0e0b6bbf54ca3b0bba3461c2d4244791ba12b4f2cda5e715afd29a01302fa24d052643584d5bc75c530dc910803298650f37f9876a617b4c31c68384666c9c800d034b5205b5c3e4beac49c899512d593d7504b8b345a47a884b088c90d267116004f08a107a8a690155635369b75a5529ae3e6624be6b9392b5a1052f4481c6366d7a301d44c0bfa340d35bb492a6237bf961f004de311e4da331da0ece036b2025d55e62836c5f5e791e5df50ba65cc9dc1ee5063fb8ec106e274f33d46519de7fe931044b08ffcc4621a3c6e7427ef8881950283d5dc5cc5b7053f5192a47deeb5218940f9ac1f0659c8d3e4881488ef04c801e95a01111567abe99516ab4601676f01ef9a0bab7f1b05deb1b3c0a22cc1797a0597f668f75c980bcb2abfe5b5baf93bcff9a17234ad01027bfdb1172bf30edb8e068edeac06e0ebba4c7f93bf33a3721c91f0482139519d1e98a7742635ef74f9b97ffad572b8383d1e5b7fbaea41c7dd56a67e30d0f37bf67affeaf48d923998a6d649b82d4f29b11e858872c3d6b7f1277469cc923ed3700b766cbb7d6618ec2ca0203219d1dd8eb4dd4e97a2c3103355b2464c95c241174cd96cc966e4e336058b308fffe11eb0fb9b57668769875c0ac90c113c3379df19c331e0326ccd1fbeeeea555bc4a609a7320283c3cd615946f70498cc96c7796e4b84aab900889554b98fb3cd470ba8c2a1020edac3256aef672b16f6ee3a6a6e8e10fc3df31abdcecc870b1408e106e07df806228f0196337f39df449717b59f12bae809c4f2631048cd6b3b9222b9b767428d3a8d117ffe3db5c7702abccd2c09d33b00a1c55a50d8d5d185b9657c5d1af98ee9bca838adc924377ffa075ddf1401f77385dcfb467930f90f1404fd1e715a26573551846dbf4ad090099aef2fd3f5f7573c2bacc7e65fd5c15a35076c6f5a7bd3e937dfaaf6abcb2c4030e99de518dca7c696589cbc86addc59a259b07987fb87d8dfdc7fb0c2e5d9f488b983ebd1d9791c58aaca9771f8ad36d8bd14b622a0556aaa0322f2743ebd4acb7fbe1036b9f83967224e9ca0cc6bfdba0774e24c429981f7e5449d7a4becbd4b79a495512c2499e28f054f057b76f5f4c52ef335fbef8ddc61fd216eccba7f17bec2aa327b778f8e1d64a5051dac91c9c90662d592744556bed884eabb1bc3980734c1620c0c425f6fd7d9f05cc2cd90ebb65e8213c5ed8d80bbe81fa9724cd022309e2882692026c0669a7006a502052309e76503dce1c2b4c26d03dfd030e28a484041e21c6b1f75941f3c9f5228371016708dd4c727d7c98a317294c58b5bb776b2a813f92bfe335a9e13d279128000e4c5b6b7c1193a2f267fa32c8da520f8adcf608faf39e9cd1fea326d7a8b7692e251e90054c8000b03929da501689438a893752c473578f997b5de956395651dd13bb2a94a9fddc30cf568e450660c114b47a36b002ca7b36b758a637cc57f690540ea51327e0599a91cf927943907dfa52f5fd475b365f1194564cd0afde5fa9a3587a9ea2ff9c93a36b8bee6a5afb8f670d8ec4b45513438de02febba6a978e8f6a0d273c02e816829b873bb8c8b3017bd07ba2eaf9cb5d849b82488f3cfcab8b375771e358220f1d052f30b4d289a03d4704af94a0c313c81a1fd84a09523dc1be52ba897e5cf32d0f650cffe497c1498c3e5e5a0c259763541d21842808d9437ca2c17df2e22671bec66bbe9c967b4a1e662e8257ab2a77967ec0ee6fc65de81e2dff4f38c80304159a4864ca1da948140d24711d82ccb2f12f28371e0aa03037f9cfaa9b304282e8150f1912ee0115ad67da2a8085a08d8398e2d70c0659b20bb1f83e88442fcd1bcd07dd030d94af88ca36a680e7de62ab4144fb3446ac0efff90674750149a7aaa4fba6ea069f2da7d725ad496f05327ee9a6f78b897c225f6ca0c4e478d81ef631d907505af1b0384b4613cd1d19b52f988aba6a7bf094bff1f458a702f0c58f9d222ccaf462680cc392b881fcc97a48bf35a2fb763eb9e2d7076f643b660a9cf2a467ef0f187e81610e0f06888831ea190f39e9d2e465f2e8b240cadfe9409084f0f28eac0d51fb6618845195ed1c9e82d1eb00685527267a7db6b454410489a7de4e65a1fd780cbb3a5122dee2093d03a2f93fa8a3b93196b2d02fa305aae16b0e1795ee3dc9273aed9ded7a0eb5eb8923018e5207e5f315c761b94ddeac57f40ed7547ee50bccdcc037500e7502fd80b34ab4facd7c57bd3646557a0b1ac6aae4394315efc00c98b123063cfe4ee06442f2abbc50c6dcb0636739d495b8633fb09532434d05e8f10be3f4cf1fc3153dd7892f7cb5298265cc03d40771562660c7bc48099a9e5dcf5b3f1f36e29f1efa141d13ba16622b70659e77e173f5810eeb91f08adeeaa08e0748a51c1b2108a0968bbb1736a2a4e97b1b278078ff1948d965b138f2d89800b83953ad6f3f2fd4f0ea990f5f68f55803059f6ec84c93dd507056d9400bcd5938d935241e305dd9cdc2563cf1b8cdc1ae1514820ca8236056770ed9d31766a53af320d5d8824a2197d5b6d9fce3da9de1f91fb34ba249e07e0346c0041391b60e8a8ecb9ddf921638f103627722c9e8d8abf60daf887fef82dad1c9b208b53275d1d09724439dda34f83e8b44d73c34cb0c5606494b281526eb1509bac1eaa51bdc89ce42847bb64b648ba691804845684481d38a9d549d25c3cbf054eb940c53266d8d52a01dc607cde99e82ff9c5b816b83cba852531c7522cd5cd26ffb0c80a0d7a0dbef1a1681162defd6dcdc5fb383c5b29fdc4056b8ac952f2c784375080e53ddb02152942ec0caab17f236a4f6d1a9d971f76e93b45f2117d1de710014999021dca489668ca44cfeeef0293d0c55a9e0d5d205734d948710f42870a8a3401690b1336906625d5090063a4a948a195bf89663079398d692e837dc3fb372118cbd44d3940a83c9d348199369a822d0b20ff755d8413436d6e8a845c2d98b32cd7358d9d1bc5371f842d62d219d1585af03741d310123bfc887e626c678f0e370214ba4848d86064e8d36f58ad2c71cc28101eaa0074b376b3f064de01287f3498ccfcd1a1207f3ff08493eaa5274ac64ae15b00c6b1bb280bbcd5ddb2ae23e0e4c3ef54776b64af34ea27128034b7275259afdec5e874543d6617e5d22eb08816a0ac5747e83f6c72fe0b2bc5e578747f38767beb910c3837f670b77ad2ac5a1e613acf8aa0342e4263fb19cf36a50d03a9d57b3adaa69cfa0c000e7a80e82db4bb89bfdc1d5aa44e0c21530511df646e5dc4bdd4fa27ab8ca467518fc0beea65fcb646b7ce81420220a1f65426df8f77adb5aa4b8295b1f7e689ca95790994fc3f463c8a8c3bbcf7b871fc947ab4adf194b88a355341d6ddd97e517366e779c9a7cd987720660218f82de8548e2cf1cc06183847df82ad8277c5db88d8dc38019c31af6321462144b4df57930dc3fcc3961dffd003e4eb89acbb19852c798ce62522c7ba6b89afeee093bcd110f39c1a8b33c50283c27ecc34485c62669c64fd8d1d364d2f8848e80e6a01e2fe9b0156609ecafaaeb102f7ec56b2013deb0b94f59281eb5af03f1a216e4ccdb6420ddf9fefbeab708807dd6e3895e4f74d013cd00d31d3fb3f2b8bf83e3f9aa1b4357fb5628155fbbfa158aba4eff450704373e6278d56d73554f3c99c2ebc9f5a97e91e2412cc9f6c85fe65aa72340865cc75d65792bf54835a3cc13f195450d97954321314c4a02e2aa40c861b14775548721cbd8a0ba51baf9a9e076512e91bb64bb97f6af72735a9c608fb8109a1fe96a71a5cb0f4ca6adad88bee5c8d109b1aad6a3ef2d20a9e7fbe9ec214b13cf5bcfbed06c5b8f95d2326149ad69ab1880e666fd496f3e79f49a6c5ff0006bcedc08b96006f39839b8be1179e7051c68540e2ed6dcc13a55b66da7f1d79983463a3e965127dceb21fcc3b5b36aa8b8e0b3f5af563172f2605c39e37f9cc5a9c98f0aea828608eb2db7321727d43811704d92158d8f77a9bd7e250ce1a0e6c982ce67d1c35c423025492fc94e7389f49a7f10dfdc1087ec6c0811fed701607400ef347776294a2d8a0aa5986acfde73e94b15036ca0e0d080f88cfac0667e0a9c4587f59aa527a1bb07bbc6e0c0a11ec61879916e7aa5c612600428742c204827cd9fbc00782ba0e408290e54e801930d09fa018e915e414fce70d76768623c6526219724091d5837bf0e6e17fb3e4685f89e5dc0aa7faea736601b32e5f62631c2fcc8746278cfc0cd7ddb1ec5df4bca714d1b8656c152dad14bfff5050076fb6ba3efe7c04fa5ef713b65f85a37172b2204cfcf8cbcfc039add332ff836a3cb0a873efd62f57f0e169d2d5e6508b3570fe2f5f239195b66e6017739b11a34c9d56113d7df5cabd5af55d9177ccafa216b66ac7e9557f5eda70f6d465d649757ed491997eebe909203a0629e7e25d6fcd52ae5574aadc2da44a3ac5117a9a25fcda7ae670d2bd03a9fbaec5277d020febdadb24d08d6d833408cc0c5d12032a37e675ce834d776d40d57cea308e7cd039350694721f50b6b79203ae0b467a72a23c3056303c78cf2a0e9f751a040391cd30a84a18bd2a6a97f4b7da8f75dd43241665f9cb7c8f61cd82d0f19ab2d75ea002f7dafbb0a95029e817bb00d22d67659e3c5069b017507f346229f4f2fa92b2e14a7195d99c03e734eb50f9d08f9e3451254f7c4a73f54a3e1ca7a7af89f9707cdcf07babbd2172b2e8aea11c1bbfa167fc51f82d0d8ee5dab03802b34718e757860b2df6100a187a4bdf2f8777ac4fff6d74dd4d9cc7c366351cc01ca416344934b10529e0e0a34485ee3f8bca7b8c15f404a7e2b9f11f88df0e010552fe76394da047dcdc504578f3e68475a494e7080b2e474a2512e374f32f1803346a5c2501f369e25c2773c7828a4aa2562a97d993806cd47356a0928774cf4f88532cc0497f131442e4372e659382ad5393c13509e870cdda9ceeccca25a1be7d0b34d7828bc2443e5657e2e4c0f39962660336ce737b7b860187bbe3b71129e91658802ca3bfdba06475bfb2f016552591f0c66172fe1bc70859fb6c9079e209e540730b8cfe22b7f7557eef53c9fd7d70b313c0cedf9dfa7c162d9cb20d7e4275608f01f3d0ae312706c65054b3d040cca6660f11d08942fc90e8ab67cdc18619060c57f2be085979804cad15133ba6533f93fdda4f982ad1ff0a9c7d0552142f8b16dd6207080fb8c82803f38ba5fecf13f39ac984a983176429b545f39f4452d980764b47004ffe470ce572432d1a094689883b384891a7e39bc18fe7aea439900a16b418fb23c7bd1d7480ddf3a1824a94ce12d062fc9b967868211fbc87ef5042888894ac6a9a3ceef1ac24270e7dab138906aebd0d38a3c47406ea690e99c778d48c0a890451e51d30218e2b1d804c15b62964d0ac9bfc28c0161ba3d491c00eec93c9921d675d7275845ac3bb058405c07ba2087f483a6d7bb30ea87021c89dd14f648f3c022735f178eb346ce8be9ce038bdabf1946ed97c03c1ffc1dbf1ff44a7579202333dc3ae044abecc518799da6d30ea3b6b2aa1e23ed4530a0ece81842cb3073a738f69e64674c571750309774244679e4415a8a5826bdd9858282abbda67976d6e4977c5f29b891d5d661ab4dd506298e1d4742a85e7eec10463d935f9f8d7298cb9615a3e78b031e1ef75db852f34d15a7b032aa38c931c17d3ad575ab9ec6e4c5dfcdbec2be71e54d15b46b3787fb0dc24190dc46fc2c4a5c2c483026755cae5aaaf5bfc3fa154b21384dda09a5b28383da1feffbd88429022c5c96388cb935149f8a437b71606e89392c353487ed9a7f73759a96616da95ca1a53aec5a25b9778d50af4f6f9a8a114ec547c6a2341415bc508c357841b00d0488e046e0dc1f963c2b87fcb6a93861ddd24935df8de5f1d25e2422c77f4f55438bc4c5d7dad6a603baedd3a7a2cc86ed55729a9a0adbc87d0ca5b03218f1a9f99a2476f90ae63a0a1d8b1ce58d8d583faf8f15b4f9b2c139e811ed5b4b31dbe08759e9e370e684dc02250218698e3ee340be73f13f3957ca9b4f5afcaaf0a4ab4a0170045735ce5ba5ad7b4cc49db4804c281bb2d263aecebac60bd090d94a6ea64f86c62c5d97c228ec653eb959d547f03beb97e587febae1b0a8c7b7e98839bcbed10488b8797643d6f714634fdf28379f2c4d6714ac413a01d4ad47e9479fec39d4edb827b2989acb1b530dfc01d1ee7fe3a0f813af3c146fe7f35c4c6b0c6743d2e2d9eea31cd72b0f00d397cf982e173ac03e8f113937be47b29965a174342a859aec5dff4e266a81ded0db4f6a8f6ecb65110a4e947dac08bad823551b77509407c402122c857b9e3e648ed651137753b7e6fe66ee07928218b9ea19333e1d5c370e44294834254d167bf617294132346dd160e55e05cfcee60425969d4df051b2970181d4e69aaba23211488c046daa5849ecd305539b377925f787c6b3a52fe6e6c539391b7e5bdb3abfe9c6132f7abbd1583e07d2b7a9c574f971e9d231b1136183d421a014d1a5426148377ce219741d546407a134df26860e216820a050e4188c239d7bcad6c2d947e7cdbbc5f9e054bc91d8b5ef983838ff4230a3b4e0ef7ed0046a4102f207eeb1f720c1cfe6803d2a7a017643136b46114c5426e7427d40ae11d5770063da43795c1b073df11e27d40d64d78370aed02f0380e3b66f22d92c09f4dfd88168dc77bc9b41321eb5b787f8a1876a0b6e05643af6256025b406141c9ed006ca2017a40d5a8ca5c39563200f020bc3b14359a78bcfd805c78230b1e5031428198b5eafd5e9a7ef6e8fe12504a97d931cc90ebf4bf6a0308e018971ba713a03fab50301eaa26c2b11c60303103560fc5cef841af57b49104379833868452f183672772de361fd7a9353b7715b6e7043a7411fd0003d880f28262bd3343fbaef4b77dcf707504468a2ef5b5067906714b721aaa6fafc22f118a23e04c995c13292ab8dffdca1e59ba604406e28bf91d74b7df0041076fafb611fb1b659c6da6d9267c3cd5adcf578dce213668c61d2032a331495c7e0523b4b27fb5dbd591557e7520fd87adc15a5eebd50c955b1eec8f768f1d5c15e9a4033e265ae6aee8a12e9962eb6f8078cb0282f992397f7d1735b576c1377f5c5375782ea032069f516a5535344814a4d25ee4e52b4ee76b87bc036891c7e86e0a37e815d00d6c9c44bc467933410de1a7a19cb595280fc4b1b2b48481d45849d690e998484bacc74f0466707112d2e63b690e9da0256547d111a2a895b3161ac0aed9dbd1aba110605f7774e869abc6019ea0708838aa36cdc3542b02f804705ede5ceaa725222a3cc24656c0230554596485b12d5661326f1a684b8c08202ca7d886fa6f4bc5b82e0f7e5cbf065457a862184a2d4571c726652a189e1e5801574f51f676686b450960be688ccb56ad1bce0e97d57b42a4df60b513968a066be55801605b1d9988d99bb2e4b1d49577634624a263fbf5698b26d416172d452c92f5afc61de2f4faaf10fcb9504054d728594aa0f12d3c02acf39e808bd667e82bf091864f71fdb317a9e731421c37a317d99411e8618e50a4ab794f73fddcf298c945916d28458ab6a98e565d524f99d5f20e74cfb1cf0d1aa9a2a8b413c76c00a0493c0d2fb3a8973d6c092ad1bb9e7b9839a9682a63a41cbc23eb3fd65aac2de640ee427cc291c000c36850b244e74f9747382516c95c8188b5bb6f712ab7674326467e2b0e92c19fb7fbac394ca7263fddebe8677b8fd902ba883920d589f238e92f9f01d67ce9b35049fcaccfe4aa8d6a0bf8fe6166acf39bb5ac9b6d2d60eb18f5ec7f0ff6736841bfae9a06ad50f5c39f40385eead17a30e533da6d26bd9c4b8be11a3e4013798cac1d6873384fada0711720a812caa1bde1b914a4fddd5258ada7d9f33a7899f7ffec64c6b0b742b1efe67d2bd7dfd41e7c2669861906172f1fe25feb8e857f0882dab7a282d7a6f55bdbabb103a36f9f3fb13300ddfccf15231a2f22227d5179ebf762ce3f71c1018e142b3d057b731320e54efa3eacad4a038a94e0b0c59e860736af3a14ff9e56451f3cbeff270111c819450062dc83f218c9962a437399059b143e67ec285b179830a1828b242b83311723757af77c4f4f1a37a6627d2bd560df8ac218315783632e6157f5b44365dde50dfed5d43b4dbe9fb3c1a233212116662b2b22fa812751dece78cf93373e3fd0b47e799e5d8b3e1dd0c1ae43be59771f19ee016f918afcf967be97bfb2e4af0985b5e4c59b3f40d3f6a3fc333175da7d889623fa707e19458f8701a7202a5d4231a7addeaf767cc219164279b34ec185b1d1c1376b0c228ca9eccfac4fa612764c462207d04f90aa08b89c2a66d6a4da4dd8501638ece99443dfb6a14d686aec3bcec7f2bd80763fd0d3c8f62220ff0387c70aae5fbd9d6da9d50e12a371b7c8bd47e2a8c484bb60772d9c62d2aa8be31bbce998be61f67bfa0bbed0253f212fc7050f16649269d9df1d00ca99d83e34b7652a5a401869f98207735da31eed48ad2acf04847e2a47fa000e5ac57e80c044d95daf93046bda49021b14472c51da853d9c9bd15c364cc0fb87defc871ed32bcb66fdb57b51089b5e092f5833c96014b2703a7408d61e21058e72ca728ae79e33c8e0515e1b6757f52c2c190a08b1b7b40d3828656a6ea14b4d1eb80e244c639d90f6fb9a0c331964689cfd882d328c1aa30bc1e5b566f365c0968e72f010a74614ac9fe89fc31f9ae7fd0c09e4da7e5480617213be774709fe9e43e448a0bc73acbd81fe382d82c07681156815544c247bae40c842a7fd73ab8e93c4f7570aa26089d8c672930485b9089eb7549106a87f6944a9141e822bb173df6d8bebbfdee8b9cd0222402ec21841ef22ded97a4e900bcefe90ccce72803c54f08fdb77f296296605482a40426842e820eae1eb34e5270e161cca9732d1d016f07f1eef3dafbde07d8a51e1d1d784c908bd2bd0b111081f47ae27ff87ae05ded4ca8b4074c087d6eb6bed3440b9382f51b9c34b6eb7afb806215a9195e5439431794470fcb74ae88bfcc1f8f71b54b518a8cd6c0a08ba87e58fdd77aca9f2b7116b24a652ec435cd3582b2afa4b601688476aca7bbf4ba8d6a93aa825bd88eb5480cf5317453fad2628d4632ad232b1cf14e9176d40c3c0d9453e5d27427a6ed31118b3f5aea57b4c08c9ddf8ce03a6918de8db862fc5fa4ebda0073932f9e255c4d98faf07486990c93f8a3c50ab80ff39f3ba432bb98d4ecb91652a8cb3a58988e667bdfbef7f6d65fbb79127d2fd4f7f34c0f5429497afabd60344fa410f65d232c3986bfbac1072d984b5dac82eb8661826ed1ab218a22128abf87d2679e60fcdf600ac9eefb8a9e66e3560084f80e8c684c4d91a99fcfb62f03548702faa5e5535e6098cd3807adc791e31577288e6763cbb98f521d34c6669d6d3175278d6632d5da3ed5883f23345502cc4acc055de922e8459d7cfc259a0782e5bf31cf28bc1a012e5043452b26e7bb813fb6245ebb318ffe771311111121524a29a5943239054805f7042b44fe2020151fcf478a8e0767a3c96042f0f33a6ed332121de3045044210a51b081135e5e5e5c906dbdf514c059475b53aaa5608bb8f75a4b2dd652c8196bbbb74d82cb65c17a638df5def4a79e409e233853d1624d2d80f5e79a4b60add54b68250880626df7b6b525c6ca1553bcb28516acbdf87a4472c8e3f92d8b7ca4d8342ecb326dd33e11100cbf6ddbb88efb32c75d0404c3afebbaaeeb743a5f7973be4bf8602df179fb1e2c37bb9f8fe82140cea28b5229140a659e71fedc6927bc1c92c1643e118d66c3e17030ba09219fb75e888889e5912559afc3f12f6b3f9d8eb51f087e30df7dfe60e54fc6601886980ce6cb5fe8692584bc90e761f2ce344dd36834733335d6f362db4603e1a3e2f3a1f1b919dd84fcc91fece1b37fa4e87870369a0c26043fafe3362ddb2dc448a998d7a05a6bad75ce39e7d1be66cd53091a0902c01607d65a2f86cffb78f5bcbb6dded7d1f979dcf7799ee729c1799c9779d306dc86d3703a705d14dce9ebbc0e47c792acfd5039731b0cc3d0fb8e107a1a099e6e02b351de6732dee7e92368bef73e4f6b9b353360a148d8b20927b89ec56b8a027c79797979797979797979797979797979797979797979d15eb417ed457bd15eb4cdf2a26d166db3e020037f7d1957c6a5d5cefbb1148095ebdf1e01fbb9d7bffdf6db1303ed9e1b7aedf3b3a71b03343cc97d8b001d202ea08ef06bc66a0d0195014b033310e7482d739f640fb14ec1fe227be001d983111db28755ef7013e4dfc03b431de507f97ce10b9ca88afea42b8d13a949dc5acca0296f2e2365e94fa935d451d664963acaaf1175a8a3fc9bbfd4444ff6e4e3f3cccff2f0fd1f3cfc143cf31d8e79d0fb8d7b34877bb407efb26d9b917f9cae19f664ba7ade88365cd101b08a3157b30f1f01d987a1cdf806b79f614f3cfab304d89330cc321d863f553a1bffb0434d1d9a290f732473f62340efeba7010ef73535657e7f0be6c3bf9ae8c944cf7d0df5213f35e59c81e879a700b47d8689723fff01e609e581fa00847c456a9a23f9b511c0fd2135759e19e0cb3055300f3e8dec3334c0c7fcecf026d2184223ce10bef63432a2478b3430a24787e057c07e267a3402c00fc50ad407458f1665982a5365cf404f96943f43f5fc5aaae7dff2735d7e2f9b2c292760461de5cfdc0ef5822ed866294c112a4d52c5e2a529d5d2c7220df4fb4845cfd37a7ba8fe1381871d34e1f6cb39da4b3b71b827f89594bfb345fb60b71b8b22f464aad8dbc7ef3098a88c24265994818422ccd1eca20c2434315bccbb92e964a534f6e6ab73ed72b6ed863336e2b54dcbc43bee00d6ef64797b08802570fbdeba24054c811716e37badb5d75aabd9d9adbd18df9c6dbd37c7e96636873aaa358c9a6effb600b438cf0c6cb55aae0e59da13fc931996544b2590e790ed3db50ed5e4defdd34e18fbad0e19b7e1e660bbc7694b0b35d517f577b7f26559d5340b72daf2edffad5bf144ca62b76e00dce52a9d1cc7d9ccdbdedadfb4fd36e4a04335999d76dcad645793dddbcd197bb7766bb7f0db52a974f553fb7782f4e4d56d0459679df50babdc4a3150ea5297baa4e224afb5d65e9d842380f3c7a79506b88534e96f51a2020b232423128b1522be424803402c89849458d89a7fbc08a72fd70abd6205c97592c0e97eb0f9819759c1823412f1161f868f69111209c96446385521e1237caaa8522cda09558ed556a5529a635428793c1f9291152c482311070484a3221402029588708f077989d3551886980c260c31184c46930163b08f8f8cbc9dcee5012693c968361acd3f16a49188afe87452844244f65e21ea24e8d297b450a1b46d1a9291152c482311df6c383f7201a8fa9df867e3ab81f518810e7a1d83cf345140310089738ee0b72af867c2c0402631f5d19261c1e1761b96890c77f5fa189049d3c7cfd4e9e367ca983e5a4615b1511f4126ccf8993e5a7afdfd99ec73e216397d050901a32ddd58e6acbf4d6c5fd417f531d65ae79ce9de3b6fadbb95fdba5bd94168bdd56eb716cc37539665d953fa74ef6dda58507364a374de39cfad256fade9d7ba157d7376e93a65492047450d04386a5409dbe1c53c27aac9b8354aa32c29ef1fb8be514955a3605bcba8dd1ce76b03cc7982196bd4c56137162a6e2c738487fcf6ebc6d2b2e2c662493fcc0eebbaabb377bfab33e5b66b8e037fc6e2d6524957dc5844008e1eacd7f760f6a4b371f7625b69d67b6a1bd779738ed0c7bca8c710b6baf7054bba25813ff28ee5acf5ec67b52d86a61e00710aabd349c93216cb0519fdfe77f0373d69f542b193a2011fee563a0ef038a8016de87773dde6d0efa5773ce9f5b3ceb6c688d1af385fda035b6ca26c7b03e0684b5bb24c14fa3a762fb035008edbebd52b0fe068cb587963991568e9eb79b9dae9dbe94fbf2106daef6f9ac39deee44e637c2f798f007100b94ebf25c1716b8fe374ce29d2401f7fb624a85ddf8f5bebe653dcb55c188d63ca3aaa71bab36f19b7e30e9df2baf90469e7b46aaa713b532373a3bea8eff14caabee038edddd4332819b46faa3ad2ba19d392c616ea1e75f8ec65f7ba9bf13b72f52de35bff380ecfcb34ced5d1a6e174ff38c8b339525fe35cee1fc7b1bdc7eb8b4dd45ad7386d2083ca6ca057d48d6aa2ab8910d564cc6c608429ffb3711bb7692e43eb77f66ddef8c04e8666c92b6eaaf14bb554b4df4ce686d61954b782297b00c74dd5eb88297bfd1c948872a2ccfa55739a9c7eb2a975b6d28fa7bf7f70b1ddf744d15f35e5a3b8332bccf1c076afa5f3d2f976dce3a5e2eec0eb15c30ab517679d3181d52bd62fcdc43eed1b7ac7a96e53afdb46af5ad37bb2514d66127dbbd87544e7dffd77765ad7605f039845e854dc1cc727baa8a4ba5d5eaa23cabd9eac6fb780b49e5aa74b63b4fda6398b0370bb5d8b2c561305cc5ebf34ece334bfa0e64ffb7173f144af1c7925f729b5e34635c56ebc2cb9e85bed56ae58837d6508d857d7228b7134aa26f653477da39da5f4312c9a35b1cdd0fcfc3b4c714e7106fb59a4913d0d4df4dcfd3ba8d0394b192f59d2bcb66adbf7195a0272d63e8b9e5b81ec2d4dc9db97b6a753bcda0553f2244b1d8c4fb0b51f75b2b673e370c9086ed35680b59d6919df9c2be0edbd7392f4cdfb67ce3bcbb6cef596795b92ce1a3c0108113ce1871038a107fa89960f622f04c0051518314c4e504a5e90b848e92be8165ac050620106959e228e60a9a454225964a9d44243c108326495a09c98bc207961c4c363a4e322c50b2b9458f8f8a81f240c4e556290c0202159293289968764b144a251a6ccc432ae4c2b43ae58c042c58214e6000078faca3a52410515025022111f2449605085618821592cf20517601011d162c04039317941b262c5dedd8992124c2693d1902c56490ac5324756acf8101421afd2de7b720dc307e0051760e03815316094a09c98bc200181405cfc0a2c70ce61286331f18bc5485ad840bff027262f485ef0f0e8b848f1c20a2c943e3e3e3431b8470c06f78095708f16eaf34125d1f2902c168ae841922eb42059244996946cdb66c2619194646a684adca3e5da6cea862c113d48b2458b1625fea9e852098361955a68019f98bc2029e1b8ce8557b2428beffb120b2592afff0166589a444f15b705cfb0b8c7644962c6884ae252b4682bd451ddb6ba9125d1832449481649b2582516f6ae2b902c9245b2c812b254123d9268217a902409c9080b1500401a8944424201a68b9a3fda172cfcd1c66e0733dd371cb3e21822eaa87ec8311812d3eaf531afd17b792fefc55b3415312e180d061be2fb6aedf7b65b013f033fe335d8d80672ce8b73b22cfb144b290d1b9f3de7cb713e95c7441da550f4438ef14ad3de980d86a3c170b87ae3bdbf0cf38d5be78559460233ccf76519f759b7b27dd6ad709aa66ddcf665dcba14d1eb6742aaeda8a4aac1ec7f5f9f7e205246edd9c67173cedf26c8a9d6dba9d78d08975e3fd4601996e238515f70621c0047efe5bd98a826dcb643834892e3ba155af6d2a3d37a59dfb03846740ed9eb639cb8d13f9407b31f8bf722355835a138dc8ec3f55e7564031c3598b6e37e119c18a7dccf81719cf3da20e0bc384cd491fd4ab9ec9b42a0fdfb8cdbe7bcaac9f6f5394c6ccf895d4e3b053f564fa91858b6b32cfbbe4cfcde7632bc9e813f62605b267a2f10494164cf440b7aaf5eff8228a5620dd963f55ac2e68f9c06abddd4b6973d8e8de3d09a387e3a1dc9b7d3111d8d9c58f11665c0d2f9b5d6f95faa8a378028adc136432388f5a1b3d2b1eae037cdcd4e06fefd97efc79d0c15fd6a1d7cfaa75ff14bcd9127809cd844c97ef74cfc54ba956235271603a6a98902d2a90addea73a280fac8897d6250d1af8a0eea3706907ec53947be1588f5a534c699eedf2ad766a5d9576b5fe33850adbf542dc207d287d3e905db0c8d20ab2cbb4180593fdd1995f3ae13658f17a5bf529c694687d0eb539ee99f57d37e736d7ba2ee7e51f4a2f46b948cacd3ed895ec78b92b13b15331f00470f0a757fc85986f4a07acd202b0d031080f85a9df16fd3da9b73de5aeb6c5300765194db2e6baf5edf6a186f8b2dc791bde6a657c96ed6b26b338731eed9e6dfba6db5c61993db92b6a533bed65a9b51388ebc6bd8bc73b6f85a8cafd56ca5f3de0c0a6c645863daade06cb3b44c8cf10368a8af35fe8d3fc318e32ec3b8c3df618c1fbf06638c7196699f52eb7dbd1a8300b74ca4a17ef69bc669af956735cbf5e956c5fa29f67ede5eab19beb69e3aaef4e4b2500cd093ee294aed54d2a8755cbb0ed659c515ffad2618ebac62dc3dc65e877158b38a71749f757877a0e25ab38a6bcd328e1333cb0b40dab35ac35a2bd7fa6bc5db8fe2ab53acfd659928f877c777d3be6e25cb798f355c7cadbd5da5b3f3aab8d58cc8e901bad569b04f7f824024e8419f521f24d2a0b71b297b031044557b44add5c60975fabe1cdfea5bd14f8895ffcd72f6089073ef05fd86f13fee56408f4f967cf1b3e1f109f1a93ed5973ae243e58c2935dd9858df818165cd698c131d530e20f71b6814b15e5f773330304bfa6ca0eae8f3b3fb4e2b9edff4b78138ed1b08a73d3f1647ddea58452f6ac55b223a08bde2671a23d03fd3c8718d1f2d44f4fa1b08cf7dd68ea7d43d29c49388b2a4fa013281705c39107e3b66a5d268660599349f2181f0da45de3204c86be055c4ffe07ee4b8402a50ca9240a6ee670599ba8ebb441eb2a3bea8ff3c2486f9a85b1c88f6e7b3d70e6403610e84cf9e01993a90c87938ed1a263a0ca67533382d4bf2fcc85d1f104efbb66ddb16865678428a080971e9212b4be23a267ff5ca5fdce5712288ef0ec2756fe9991f3f5a32cfb9ab8e322a7ee42e0fc677efad410f027990c70784db1efef8d1d25122ff4e9654419e033db7e3c5518755ff07f1f10601823ec5826ad02d3124564721b03a0a3142481902ebf5454cd5640c314248594da0a826205f5f84a59afcd71769e1ff5f3fc40813657e3f824cbd823f72d717b613ebf5e706b5b9514df6de1bd4dd586f5013256f80d8a0ee26c706b5d9a036406c82d8dcd8a036a8cd6ae3b2296293daa8a8a652515badbd375f6cb5dd17db0daa2bbb27ba970e8aaeb42739e7bc4392566dc97b73bdd8e69c73cef986e42624c3234224c22472ce3924c324aac90e497b92f70e495748be2b24efc69a9c28393c22246fa82324c3900c8f0891089308c9900c5f212cdc11b64217b5d5da7bf3c556db7db10d494da5a9405b8196435361d5ee4a5ab52defcdf5624bba70a82bc356af324c95d0a92bbb27ba970e8ad9955dd9955dd9955d7937d639774f74e5f56a74e544b1bd2bbb27ba970e8aaeec4aefe4a1bc1b1e8b67b2d4566befcd175b6df7c5b62bb32b2b9197c83af0d654b46aabba37d78b3595cda2bda9a6f258ba0c5345e4d2549a0ab4156839a6a6d2542a4da5a95229180c0683c1609aea6eac35d544c99a0a34d5d58a50edd7549a0ab41568393495a6d2581aa925a1ad34974c6db5f6de7cb1d5765f6c3555e814f221f481908dd009db9d73ce39e79c73ce39e79c73ce39e79c73ce39e79c73ce56ffde34bbb455af3f55de6432b9b22b2b9197c83a66766557766557769565599665e9ba1beb9c5d1305ef9b77e4ecca4ae425b28eeccaae1ccb658622bfcab22ccbb2b4d4566befcd175b6df7c536bb442e9112a225443a442e6c43275a75be17df9b2fb66f7a130b076076eddd8185ddde9d7073391ebbb24b53dd9c4aa5529a4a5375a585c16030180cd6955d199215af56ab554886e406d581759ae81ca1b3837660f6e49665d981951d58d981951d58d9d9a0361f97baadfeb84c94ec325170be9f243e2efbb98fcb27061f197c8af8b87c5c3ead8feba3e3c3fa907b874e211f421f08d998acd089153ab158b0d089864ef6e4ee0d82a113eb592c91ab63b37e37d6399f260ade372444e834516ce742a7900fa10f5018f7eb876c54931d3a895ca15348155a858808a142a9cca39f523f442e9112a2253617e9d8f4452e7b724d57e412b74845ae3bba2e96b46dab2fce7697443151297a8976e6ed274fa6e7e17ba02d6ad411cff834d913bbc1ce8fdef4a62e726d22d744c93add55779b95982817e33b8a767cb65de49a28b5d71729215a82c2c05f5fa46313b9b41fbfc2308aa010b9443a44ae8942f7fed0a9d7cfa99cca29bbca29979c62e514ccf582c160315809b32c306b82f5fa78555378e582572cbc22f1aa855734b64b90a553d65359512e2c168b64b5582ed6cbc4b24de0a983fa494d26b2355bad576bc25a97671a6df199ce3cbc02e92e80fd1b68147ddf9761aa3cc70270ec7c5c601365f68f8b3dd1f3e3c2ea758f4eb602118490c566abe7c8b6d93e9d23f5330fd511d702700453bd560e548d23eaa2fdb62798d7c4d186150d168d54a73484e89486aa53eeb73d099f13471aabe786f810e8624f4017975e7f75438e790dcf80bf659e7651a86070641e546d1d84d913b005c27afdac5f95b59befcc6dae75d5565952ade24efdd0658f23ec78866338d8b2571c41b1d5ebcf50bb3ac8c1551d6d17308788a3fb940aa6ec0998ea63697eafae2950da4e46d7f1fef1aa40daeb4e91001c3954aafbfbdc6639548a1dbfb3bb1d3954aa7eb57f35d61365f690c55a80eeb05d6e0894762b1404458b83dfee36918861f71bb83eeb88da17364096ad6bf60b5eae6508fb1a78de3204572b59764a4d6a72b3af178caa5c4e35cf986e3aeba5f67aa30e77076bb51229e6a420b9691b95342ba6f56138a85e5179ab514715574b27c65a7be30e7d33757daa54d43900c7cd7432f514168760850448a97e3ae7b42e157862099bc2a804afb6f52c543300002000d316000018140a8a8422511824519ccd1914800d638e486464408f8b63510ac3280cc220838031860062083004285343423601303e2e304b32a4585c59d7cc51a282d1bac5a735c2ee7f1c1106e629a4a8d531de8594183ac812cef90f117c9b57ab7bd19dc2a19c26aaf7c29b7bc7eb64d6dfeabb65eec711b8e75083390a5dd9ddbdb8a54fc24e933c4067bc524a9d56e7e303dbd2bc7a683518156d60329176de9171042958abebbb728355795394cb6a79a7b0d003a3d5f6e45c3242087f57319cb9846fe05dad016e995d39d206522d7a4f0f63605abd1080c4f8e630142a08c1b64f91af2bad6db0c9b475faaec674da52a9a8eb24641deace72833dad2603acf4b9eaac3cbb5ffdfa9aef231e9aa6bbff0a72d130867e239b491eefd5be89e5c183511638f326cec2caa308c245294cb0fc18fc8bb9bc668dc6487e0aeb5fdd677cdeece4f46ac711a06eb221682745108f240529c00b0acaecd774a42f7b0eff0235d05faf8e1577f0f207baa19439572c07cd14a64caf4bf1595c8ab32990fa931779cb1c561ee0c6f38207a41e3c9dec9dffa58287f77fefd2ae9d480a26e31326d6aee08a780eacf6d60a6ad9df070e20c213f55d17557ba792900eeb71c332f91a5d1d462cc0b22fde34e91dea5177013e295d58f7833addfe3560826f388102a632efd988394d38118699343c4c4218583e3ac1c7abcd8c081e95369d4a44a250f9a869c0604aefce4f0af91021f1a926f375eff95a21e9aa56373b608691c51d17a67b291d8ce34993e9a734474f4c67119a9185fdd50c45360e18377fb62d2857590133ce62c6dfd175efed7d0c2954c04cee22f66f0afb4c5954e6aa57142d4bc0e413930ba64aa240b9ca2ced86cc67c74a0654033d5b4be33658ca0a042aaa6b8fbafab55feee1561c872e073a2f1861a0e78cfee98425494d36b2896a43e5ea170266d763606ce615e517bfee6a451304b54df72a3e3e433bed9a8af79282d82fec54fc8e6a037963eee62060609e8805ec83012dc4ac763eee154791cccb05d5c9dc31f98f19f41c23bd751de72b0626540d11cde1f3c0540802959fb0a92b198178c43a48097d401cf6218d0d239485570255ab2af7e252505c742fd1440def016b0fe44d2c114ce710f3e7e7ef33702dfeb4fa204a4287f61cf86fc6f54340ce0055f2891c68baa43b7de75d6fc72e25a1ef5ad799b7936900ecd1a091259576b8417ca2e0400ecb330bf0c45f01a11035e4bde240940f3deb726abb472ac2f09b3dbaae9afa44a9e910d1f65f1312033b1d16333bdbcf1eb4a959468f2afb7a0eb276dbf42ac3bf84580625ddb6843704c3a9754a2f19e81eb196fa28565073543b46a5c8421467c5074d20c96b5dfa24dc0d6a5beb2e58b2a28da92f89d1a3094fe5ee112d123c335dceb5eea37aa77d26647d6c9abfa0a3c77bcfcb6cdab59dcaf2b46e2c597c7101ea3dd2646e4a56a637a5a3258ab8a0491ca1335e29a582d6f5a382ed6adc76b9c254e6c1ad37389b3f4590059a468f55032bcf672dc82c97360ae90630b4ce3e4d5c30a90843caaacaf2fc12ff232bc000d51609d91c832bcc45686da936b0000f60383bdb7f447c6e69b7890d53cdd1779d29f2b6cba61299215d53f38838d8d03a2f13327deb66cb9c3be7e116b7fffcf2cbacf3613924bd0cc1392593bcf4fb205ffbb162f07bdd185a82483b4cf589b7ec03d016240751cc72cde305ca085541d1d209f017737b9d1a9accf12de07798b78c209b1d9b1de6ec2840c9e9256a2745108f200529c009cbea4a4853d9c9b3ffa1bc3cbce79be13a46478960dba9b6a55a15574176e9de5c877d06c8ad23a8a21c137d99f2d12e74200dbf3024e51104d94afa3dea3b4e7fc43e6a3561a7c8457a306c9fe815bda42928e997c8b36dffe83eea15724713cba07a912634918a5a1590838ae5d30fe79885b3df70aa92c84154fb7ba5dfe8d7aa1e3ea5c9ffaa1e54fc3aaadcf0d79833504ae93ddb1c151f4110ec5018be4b4f52709ad1c1b2420396a7d0289028bcbeeb043b9505656f8306aad1ded45965cf2a0eeb4abed9266ff08673761758e55b3d623575acad0ec27cca67b7125540228a4322e935ef412bde8266d7e0a4fe06aff547eca2346c70caa9ecf31e950e0055b2cbdd58e281d359488e05ba69f06ad170d26a26b8bc45af5198f5909a5d6f64bbe2c5a497ccca76fbea32f1f516c3a707a331bf5f7ecca0a0adb37bb3629b8e7a454ab324867182f6c976d17b54cb41103ebbd1d0143969fc97c3e0bcbb5156e78133bbf66bf282494518a6dccacc6d6b14422fe601d0349c85e225e7715fe26d2783ce9cfd4792b8183ffe9e08df5bda69b681d463ec5d8715df86e9a9f66e4877d63c260e3666f76558bb039100320fb81080f032fd2346defb434ae44763373d12420f3148c68d1c4bda19641b7312f2d32cc6422a48816dd15e081f218ab6721526af444819a6aad17587bc09718b8dfeca072c8d3a4c6cec731d8c148e6b17dfe70274c68e36ce5b010fd518cc501bf3c27ce3f41971b45a8865666a2352741fe815b9240954429c08ca6ebff836ea057a23136b1a707c27eb3471a710251df0641fea15b1a790455157bd094d7c82cea9425ce42434f687ce588adad9af704fc9590945974c66685838d86b7238f17d84565fe2e07b045749e88ddbc5357f955c096d57bc7f374be88a5799dbf3c27e077a796566a49da9ad019a8a711492f43a2fef55c7ee4dfd5e3cc4a2c340357b36bba9467a927fd6302b8eac03f9be1f071c95aa2393022ca4dbb773c49ad4a75883d651db2995168b7fde131f34814d9e02cc4f0adda0b6298005417c6d63ea4b6a7c60c283b91f5f8b64cff59d730a304df992d6b3c2d96acc56bd47fc704d7d36f2eb1eb41b72ffc94a8d5f5bafbf19eba6be32ba7a0619147791e691def0fc3a1d2a45b99b42aedd986c11ca859402b46d0c220eabdcf21503424f2980155732658d07b96898376f0a169f314795e57e4dd6ff891381f923207f5dca0d3305000a64cd1f0a744ab90182f2f00a0073079faf88c79dd668db44fa724ed769e86193a9a8b977c8322eed223b1b14e0c89805b02844091fb889858032a034f4ced2fb865e5800391bcba85b064f628fe84cdde1cf0df162962f0b408a18b53f4865457feaa72cef382248552563769857c1f8ff88e5e39315560241fd24d0e3f318a134cd4e4e16c07204a8ff5c9ebe930b884792821460ae6871e79ccda9aad916a0fd557d81d52831b385ceb2ec9c5fbc333120b0141ac2aeb4caa355ba056816544f179c63829545e2ec97c6a9519636adf863a74bd020877bc3741480bd6e7dd45111dbaeb12e370578ec59517da777ce371560e4ae905ddbf58e2f0d60f42a897dd379273f013cf2ae88b6d13a4effc49f18f27b8244460134fe1add9d781c8b2c8e3b956cd18f5016694dab874d85797c6b578b595dde626127640de3acf3b225b07f8e8917aea8f635df05ca4af0993ebb19ee202983cf4587cf39169fed1d9fed4dfe5bbaeb99aae36c8ec7764135689817af0912bd583e42e086038cea792f6f32b242b1be439069588306be98e471db378b0e30277d74ca0e2b46b74c46608f1991dd46638cbdebb505ce3f020f5773adf5c4ae5d989f1acc5d55d755d223f0d72bcd7e2ea14be22128bd56b3505e6b05ebf09f13c065ad9cedab654b871292bf1e69e7232702f25140fee619e123f9d1439abc96403fcaf38452ad6d02599bb617bbd138906dbc7e381b4ad7903136b4d8894ecb138b522cde9987cca9c1864f155f33958c9a3af4218649854fdb4332394cf3195e21c55b7eec770d8ea8dc1c9fee903c64ba4c84f8cef6d28566922643a6696ff9f5a298698623c1a77ea58a4ca7e89a43f860a30d6d5e7844c12fe0e8107e5c4a10dd9bad223d20e20becc35a1f18b9e13c2e904d8c49f442c9217dba7cc38bd23b42a5ca08cb82acfd63463d2fcdb87890f248e84a7cd5a54be91e851b550b19c175831a53be1056ab12ddc7e79ef1bbcbfcb4bb2ab495be43a9ed73f0e0b76d6590b45455a89fb8dd95f3e57379878bc65339e76d7bebb5ddee7959e3554a7e08e6275b53674e5a88ece1bbb238e282b557a785c9944c324d7a2d1d9425a2e1d7eb077aad1912a2500b853f15675bec5d35b140c97040ecc8eb1d30af701f87ac678f259fd15fb922bd473508068cf937853f709f6d74bc037a0bd0e27d84c47a186b18ebfe91da07fc1940ff92414e75d02be779112db491bb50232ae13bf6e2cdf1b87e95a7564904fbe8fcd8f8c51df74ccc987a5465fcc7b47e559c936126b6b912b9c141eea05009ad0de4a1f7f10bd68b77a40cb29345a404ee6ea37ad13c203ad7863c1d8cece26c74e69d4aedaec604cfdfe0ecfd2c90500dad4d2f2d299918e6e3a849dc5d12b098fdd0f46ed1666e6263a069aed340823e945574f527dbb432449d6e27fbb4d75a2451829637a009fc1b10220e2091b93427af878b708782b5e155fe3f04cc66a705bed4df10fa88110c1b7e45dffe1109661e9b1a054d4c906048bbd81bb2b93dc0d81dbc43aac84f609bafdec2379adbebbd4e35884491e5610456d9acd6153ea274377735a76f3a937a278e6a1c4df6226a4a2dc4657f5707d139d9c39de5698438ea03d643ac2d0ce019290b7d0132fbc784f0b28171318e9399d42eb3d91ec9151fb7e7f6ea17cacb6fad7f238f0b54809cd830719411921001dcd366d5d94ec2f8941711b72ffb610a9b4f094b094196a31d9a34815577d9ab14d52691a00688077ba5be3116f5e92d425aeb1f082e2dc9fdd94a2c9ffa87e67d5d7f597f2d5e974148657b841317e7e7d46ff280723d48551d0bb994fc532f8166468568af288f47eb4d074f3e7d354b2578101a4dd70013b24ca9434f4fc5f19e0c79dd6c6eec6fc56e1050fbf9293f6b561c7af1315d43a0e6de666e18b061125042f49b071cd3de2376e241c25e92ad5401384e43d75ab2f3e19119a6e5a81587d8ad60f9d839e1ee5156e12d11b2632764c88adb797d15348f5ed35e228101dc0420620a6d9dfbcdb0d27a283d585a3b2380cd7cfbb6389a40426583dd67aa39c10f6c1f3202178439950866b62ec5caf39df8f689d67dc013e92cd73a0d075520469eeeeceaad100088a252a21ad17cf43568fb45b5ad0aea269f7beb803f3224074bdd0b7069de0af2690ac0c399db602e2d63c639799d8eb889ffebe4c147c11707ab04cb8e83691ea781362b53663b86e47e0efcc197ee867f5bc06786700610ec67195a80650b3d30576bad9f153388581bd10a050f88dc672237f6b95203e3d1e3f07cec0b0993dae4b1b76ba2f465915a317466236086bd237a8fae1249cd618526977379049092e5700992610ad7852f969ce730a3a1c354ef0fe90e204e4ba4cf10a1197cc136a239ca931bfaf3284b5b4c176201e0aad0712ae3fcd414581a7a095897d5bcefc36c0e1c892c0d557b37ef250651d34b0080f47407804ef8e755d08eacdc9a719b08bb85bde18310c38c2df263327353989392d29825d579fd3ad8290de393a13167cbde7a71647a8405138583575136ed2da6e9467cb27cfc759b9d710e2b1c197b3205854377bdc0d8530a7926ac9b40b484cee7dd0b72be2cb4277b161ff8f48a1d1f82d74ea05448ad2b284bd6b143ae43a4f78e43c80e86cd3856feb2d8ea1eef9362f15e9f9729c089c5ef881da6a63feca3c8600eb210b4898a27cbff7496c7ba15b315ff418ec9220309c13eab805d886a000c553b94b16033a472597ab199bf368c1d3bd6331c91a2aef28ec2a5e7b3f5613f9b7a598cab40beba0c339a85bb15b63a6b9cce6acbb70dc88564927eb3cbc3f4da1478de2fead18bcefb6320340f5db559b4b813e87a6afdadb378188e968c9050265959454985693043837cf0161cd0750ea2b9a053849ddf363f04053908b328d53726243a62bb96304a1e8cc8021202fd690aa0d7b687bb4b04802328873dadfa33246c1c2afb0fab510ffe71786dde5ac238ba499ff95dfe6701f6b20593bbb66711bb966980115f41d2f9e3c3d2788901807a367c8fca23e0051d08d6afd5d620f73b12e307603dce106c756db90aaf357f52de322e5655256db0fc5aa061c6367d35d1a49675cfa4a1c50a422c974a4147a6af465cf396d367f3f48c42619f77be271567076fc086a4d89334680e9ecb0f0991349886041d3e64223ff93bd1c2e88f4a9a9a65116f321c405c2f305e725c40ddd7f13c995c4275089edd852c869a7850fda2e2306cbb765c689ed8b6ae25849cfdbad1fe4a573aedd4d27e5ca66d4e19ac2c35296977e7c1f5fc97fad9bebb3f0298c1d066580ae2dff9a6876c2a9425548b61c17e8efe3610ff84ed199bb60a9d67b9480ffdb21acc042b1cbcc03f0a0ad4e9dcb343acfca41645e0c223a71cd7d25304c95e95ac6ffc75fa67a9a08e5c6934ccae7b1ca42bde3108852eab6d1de82141335c5d69bd85144a9e0e8a711b5d0101ed24b9beec95ca0e09d300cc3ee7448a7725f84ac83420a868292409dc0ca1f7ff84117e02a80062d707f71917a9caab0a5524316ce6c263bda1d9129c3f527ba5b73c39f36f8c19bc430ec886d371491961de1f411ac2d1a6f69815cf4effb31339b8a23899f932ccec2b063b5a6b3892d193653b4231190a8b784b44889078fe3d192055e66495bc1f10dbd4e96c198b9f18e354652a3c15ead08c7c98d5d3bf0456126fb4681d2c812e44d21529b1637795f2241e7c42893667397990ecb3e02e27b43ef14bdead86ff1a35a8bafb2b546d55bd25708cbf6841dfd4e1f568e0ca88c8d220e663fff2f7b93b5ffd2bff2c9a0b584bdc446bc1598c5a5ad9fea76c28e4fa069aa70869439080e734d814282c40a7ec040ab529927fb98f8bdd6aa6cf69e6d222bf9081cd26f66f0aa99960ba9997fd025465c637f4495994b9812d411f2f673529aa602e77ac336c11fc3049054befb85b261dd5d2c3c61c2a48b8a15be00d6f1afd13e9e6b6a11891fc2e139ebb2dcf5eba48a58e601798ed35178095002f4c608048a3cca21fde449f42e0732a8b14283f31ceda91c0cd285f1a9c1567d914782e6613a909c5e63f44050745eed29181935ff33efbf8e10093e68e96a340eec148888b628e54f6977200b950d128997ec2f1b7539057ff0ab64fb8f9fbb1fb5db1dc87ed16aed61c62f5be63b4478af70dcef7a846bb5b62e1a2994ab31efcb3cf81da9b847156c5fcc19b2a4e0566700ccf0a0d699bb69a4664092ed3563a83d28f0a82d0ce66a444a5aa199c2fa1c34ba07e601139ae478c4a76a49910726f54136f5aaf142910e83c2126664ff12cd45c70c69bd3038052b56c8ad07997404530111347a27a98f5228285d9915e66b0cf7db8dfa1d35bf2f1f536844edb6807e196f2095fe37915bf92905f2a66536c27fca79a759a412e8f2273260e53e6cf5daed3a31a4f210d1188934c1e3d672427230ba9643d08182cd41b73c6f69d300da101a492e88e87818db8ae2870378bb3d3137f15b554030c4ff67211af5b9c7c4f0bb0929063fb836601454fd6ead47cfeed80af58b0a9075c11535c3eb0e8dab33d455b0c94a3d0b442c8f60560ea362214822c283a3aef62981388b9f9f2e66b6b8768c8f9e928d52a8f5d1571ee07b305878de565c27af7ae1b42f32901aa258308523553c329fde9bd0257ad96f8820942aefcb22b9f504f9516cf8ff1c8b03621ad50181023da795eba6c0aa7eac2d77e0267c8107675dc44adeac22f6767f088b66a79d06742abe7217ba27383bbc91e22732383e63a89eb01296faf8849049df3d015c25460dec72e85c280cc742bf335d0eba2583dc22a16004b54ad6be1d531e5fbe96b589d860dfe6751a473810269b430c4833dfab7d377a596340582d504c50bd5c775387efdfc7bc7770101ad020e052825818010487126c5370447da6285b3e18c6d87ab37f93bc221b747410f8a54e5faf70428389850528e025fb8652a887d1be0ed85a08f02e244080940e10d32532c4f82dc57920af776bfb3e5b848332752d26ac1df5ad4b9dcf1121093e85d1ef9f12e5d528fb2a5b4c673e83ce159b1a994762d0fa61c0523a41c743a32461be89ba24e8fd9f77beb9a67c8aa37012e614c30dcf92de1fec494953f815a7b1bf9aee7dd02239662ad9f386f0ecb940a7526d58f2498eb100c0f7791ad3ffe3676cadc128775797a559ec7881be86c387153d729e3331058f41b76a0a6cf8e78c5dc82270b50c761ca88df5a81cd6bae3ee29cc37b14eb18a0b82823168eb9f5aeb6c8f9ff7832854e13b9972cf9f60065ff29ffb19107119825751006071142ae669aedf997999cf13be93d993953eaabf3940d45ff801f3ff3fb82b76272c9bcba605b271ffa1d75728395544ff05aaf0c73376f0fc725fc7d0025a157c16838a8b26d35c28965003ab7584b2f245c5b0a29b5684231e1c90d558adb524987dc4acc5733a6b4723b5aa04423ddac9041fca5b42de763c77d5086ea0801684eda6fb3651338513d7572e6bbc84002a8940375c8373f4d075edad35cee2d4f4cb4667ef9bbfca57b2c87215a0e4f2bc936ee9f68ba800e3402c5273ad6ab9ad80a04c1f54ee6d676049ddb88c5707e543e9f340c62695619b78ee6353bfb5df5d13718b7dbb8be4d115baeac3160eec6c48460e0ca3901e1de946b3f862e4562914971a8b380c4a2108095c96a116e4114ce81869085c039f2719f16d5a4637e50dfc5331842abd74806516b710a323e1effeb1d6771a76a8b82abbd45a22dd52f28f0e5a5b5c4708dadeff57c0dfb605b8e7b163cd8804dd5960243c2833576137441ca6b77a462d2d49f3c460a6dea197434e37d8dc8a5a48dc0f461d3dc0abd9a4b96ae26ddb9a287852e59f96f8bf7724469e2a959c4d2d8e3f95d5bfb5c3814d01745a61285605a88328766a2a38de93708fc4eada0fa773df3d911eef8e8af101dca804b673e95baee1f0d02ce90e45fe1996147e580ef81f414181a19b73d3544da463590fdc1daea6de0a28df841ccbe19ab02e8d0de26cd157276ed3ef4588263b1d0512ff84e6d6a05ca394e19526465fb72c72441c52a88895b7ce0d81c297d85b1bb43e571d803b35b6aff25c84ead0b5c5ed009838be407b403271bcf3ae404c36f0be23d4c90b1055c88724e7d0b358c524059a5196b7339695f4304c2ad5e3d111a51ff9f2c0a25e0b7d6e6fcb1b53e13d95a4d0a8cca8e6fd22dc6386082a256849adac851de6ba7d9ff8ca373926c7c2e12671c932bd5fc6b9d3c00b1e50f096ca5c9532ea162926d840e04d41f7401f1af8501bc7eeafd9000123430a6c8d6a8c4719bc26ba56a12af89bde3b5454bc47004fde6299e2b64262fa9fcfd6f8dc36f53eaba25e1b5bab6b58a17645866b13b6102436c5fbd701d7690c719feb2d51fa4150ed9254ac5e3cb6b9fe2a5af5d9d7d3c7dc886732d083790fcfe5ca5cb84cbf6ea4606b8d978a77f36a91ec25b16153a5f4637949d5d972851987ddca641fa64df253ff53cf0c81e9eba44696feadc1e0086d7a3f2ce5b78c5f6217289b280fc596af52c6e8ddce24d96a3acc15c50b9d9261231836aa0626664ea163dcab2401d33c4f10022a81583b20d403d190bc54bc40186f303e48e7407b374f559bad05b0ddfff89e8d542575ef14a4067e9412bbf4b94550139b124d685d7cb2ef158d9f4c15944972873f0e8d1cc7f6c6e9f568438488c927427b1e8f7dd0490f7aa23e9d2729c9b102781e547afd61fb8171efe1382e105d8438ad2f0f025d278873263ed4b2b131ae9f9dfa1cc8f142e3d8e931f4d743ae5a81df41d4ac052166e9e3b9ce918fb7728415c641ea8dedc70b5ac3676c7a87d34b1c547fb19b853ee9087329f89110b3b3af217502a5dabb6ebfc9f19e5361637e5384faa1ac90dc109c7639ff7fa045e4659486489553de578b712e8f0645b5f46d942bb23a89a8b49b572df9fc1c5b1fbd9a9c2955cd3f84a0f3178db7af5584c8a50b21cab34e9cb28b39da972e30dd814fcf173549124905d9751d6815cc5261cbdcf661fcf5509af6bd628999e312cf815b7368b4a1fddbecb6903e6dd5547bab9222f288fb4efa259f3aa556917a4e8f08186c19d1e9e8f71ef6b14f64692b7030526116c47ba530fa1d8206fdfe4a34013ac23f393f34b7c9ba6e169c4ff790c820621e020adfc1f45b8c7847a8eb415af110b15100e99f5440cb283b8fc0ac3bd56d521d6d014fe22edb955e84fbd783e11dd6b22742873535dc90830d3018f9227dd105c4f108f58481a2d16bb59f37825111c7af73b05977e7476ef53d691ae08c3d44c1314bdf407479f89fc3dee6502fc7512e73bffce45848a7e7c37823d50221bf8ed93256439a6f3a76fd23e98f103971c0c6490c9b90f571a2fba20ccce3766b101d8e4e6c376dd1b0448220828e1ebb665fb0c041af819f3e30cf21a2723822de5a24ca9d2b34c9390772c69a854d1cdffc9b677de81bab38d284954f74fa58617191943c94ad383a6a6853f24787e06304896e0d15f658cbc9557141b85a21ac016936eac09f96b1af5fced10fcaf80f9f455d4101ea232baba56d0b60690461d185fa814c10c82df92bc072f3200f46af1bf7d80f610bcd8d9e45f6b13f516a69c7036c4406715002a389287ea995cfa2e1fdf7d1b3f8af0220e3f039e57c6564e0359542f32b56ee6dd54ff09d92266bb7cce8bdb60d8896fad421e5da260037f559aa9890ad6ee133711610c50af2bdec1fa69ac052a060ca2979da4ce9f4dcde24b47cf108d03d98e0682c8ab402659bccab8e7196c0279eeb4390633f274223b22a8175cd72173493539c2e44f9ca44f9826bbc54dcef18d3ae55a9da5b3e5eacee417dac17e36ef388a957ba43fb597687398ad6db6b7c16ef2eea230b7979bf21d81519539428de140afcfccf3c97343cb2f7bd2da500ec35b47e6e5e425f3bcf034f120236f2c3c364fb4343e53206e47f45317b82174537a5ed7e90ca8987dbf9dd615e1bdbcdb5ce1f61bc9f0e8e4a9244d92840bc43bc1795fa189df0ae0fa85834a7777abcee0fc9f28d88af2c76963dd0f45f0aa0da92eb3b968da6f135c94120665bd2df45fe3423083ab202bf95a61e3479151a72642e58f40d5ac4fe5e1405beb2e2592554e930c65c0ac52e51d44a20ab69c85dab12f8c08c35c5ee5b96ca7132eae176b8140f634ba0e98745dc3a6261d0e011b675158a622d0472897ba3aa3fcfefa7d02e60595defa77a06ec3057010870db886a2237fe77cce69fd2ddc1c3b5765d891286da1f7013e3adaabc961bdb3a8592897f583e10663046501e47a3888d95e848bb933439d670ce0b5319ebd227e10fa550cc0d6036badc1accce3b356200968219e5259718be56d108df678d8477d7223ad495cf08b702ce67cf5e6f458546310ef631ec82b39fbbaf276785b2130fad5f84debb574339a392df56db33113f999ace8152747f1150273cd51f67e9958cb7ff94984fbb299c43e40fafa099daeea7fd863a3e472571f5c4fe8fa8888c74b4f2a3872f44dc3edd47035871aba65c5f1053ddf44a884455b4f2407393cc4d4626a37e2568ed6391eee06874e2331071f1f4df8af7d6c9c455f97925dfc0f7d9678cb0d652352dbd7027e922560ab48ec0864f2ebaa0d8b8a03ecc8466c9537e7a15d5c77b0715d2f0f97938f063a41af0863a0f312c8e7780182b23039f646aba44841674f6c75c9cd4a5b182af86e524d6a08e9dc93cfb2e62db6896fe7288d23587952a1f81202e1c74205470dd95800c639adf11300df716b3e2861d75ebfc3d419972a44044394a764ce2b470184393a5ddbd5842f011c4b212a8d15fcb8cda3f812f5475e806b91252d32b33700664624068f8e4ef0c24ef019b619238e72777b88446464a82823e75da2591a264a3bee7b6bb35edd0a35ee4998c088f128f1888a463e0ec5a4015629f606309a1bd113f1d191d7f7a1a344ff572eb4e7aeb48f7fc1fe8907f316fc782a1ba799e727d72f4a7e54b11adfee115d3273dbbfec7f41fdd1c8ab309004c1c5673893e03b7d824cc0ab528254438800de112f58a99bfd7c0429aefe77ef29bbdaaff124b4e91888043733710d892711d6132f08e48fdb32eccbfc9d1c1cbd26014fb9596f504b75f944286c460a98bc35040005206f3147a438d6d5bd12910148b9fc109e22569918028f3f11c493f401a87efee2075c3bc671739a015a0edcf393448c8a2f71b6e2cb9e6e47a251e5a9b8572307f58b77e9b9e0e2edcfa9c183e4b064cde08fba3d9ebcb1a93cd3ce671e4220d7808f1203e5e83e20f9742b8b3131d3560b077e4c06d2de3545febd153dedd7f44a4ee94a4cff4a445693a8c5534144c5a64e6dce892bafb3ff0888c27e386c93e7f1e33cd34e768c47dee0220b19b67b028cb0008ea86bebf1e295828a272633a2843235a4358251c975a4ae7e76f15b12adf64a495da05e9ee2394752e130c987df228bba3fd2aa7a90dafdafa807c157e8adeffe6785c28140bb081ebf002f5d13371a4d4ec9b9945408d365e9c29d04e6a216fb98348a2c5b8a00f1b6b4a454a66b29a0f2a5a668e76fefcc55b6ac7ceb366c9058596bff6572556ce72249db2563b06ead010e286bb47a427dcfbc56d0b4a7c5dfc29d8c88a5378172a2d98e7a052515d35935900aa8b43f513c7a804543799438795fcb5e9d1d6315dd1a95909601189ec5f2f1c7f220f733ecbea5849e007ba3d47022f959b16fb8d8794235cd3aabd63053e1a063a2a48f54b965efbfc6d87929e4e9064074d6a62bc86831f424a115ba4b5c9e10d1f28f205476a9c8d8df34bb5f6d79a0f4b4e49a5ce34af763bf8a8010dc61f0d22d716e8f91bcc5e8397ed28005ce3ac40d2ef77c02845db38e3a09bdcbce5276f012cfec4c395dee32315222aedd7bd05d10bb2244be510acd917f86db0b6240f217b37cffadbbd04569a18f77fb72fbe636a330c0a10d8d4811416756bc79689153a1377647121b142c9f8e53b71de995ceeafae203890e92cda0dcbd2861d2a4cd8a9bd0905bcea56665107513e0d69fb5a3828a085a0721ce59895bb64a8b82d3bd88a9ae579af8d1c5d9777e1ec46e464feee61d741a3d6782cfa785349ef61a5329baa0ddea55a8e63d83c0fb3facc20eebf5a485dbfb514254e041cacb5fcf6e4719bbc51c8bc52181c31244ccf35473aab6313a48cd3bc4fd90a3152237c010f330d8801444cd0962f0cb514de06148da4536edf69685e21357a98ceff0c6c5331a468f11fa7b703ccf099c6cce309a070820c8f352a05d039bd8d431840ebf13de528ef633c690a4ca54e49168253b35aa15f422266ae24a269e123c5d4d350c62c7500500bee3262004ef65d0be2ba148bcc44c1d8ae5037d8411384f31d2d45daff881d6ffa4ba4eee0e304604a563e04cd9d486c7ccbd1240164bcef6946182c12e927c4b0a1aff85913c4027ee7d86cc9efcbf4b1cefaad28d8ae369e6af4c8875892242ea241955fdf37e13ed5fbfaf9e41a92868fa90f49b5642027b130542042335c23a4a93b64890216fd58a6ca505070ce3204e2fc1f8dc224c559e43108724dc02297b290324a1b0ab289844bceae8a4a7e2a8308f7288814564e4a900d8e255c90c85be380ef94e62c3a931db3fb6b43012b1e355cd77851e9d3552c5a10f724aa5d78d13625c70c09dd199062cfa2ee7a347bfb8cf07ffe56e994ae4d70b4d1c49c09e1536772f92dc03b80bebf521498cd1f5ad2189b9885ba875f204c229011103bc381cb8e657f384b2a622d36fe009059140d21b83719cab0ea49e5110b4184e4fd04413884f947959171ff1225a124bb4bf6969aa228d6f68034a9194cee03ac0a3a0af7053c12f6998d42f36ef13dfb578cd5e21e72b395a596f219383c972a23d8e0f2d99643c17ba40770884feb57652cf7ea63612ce3e63221de72998033eec9a1d07e9de00d76162d759d7fc6b25ec3c92ffada54160a5bf23199938cfeac8b0f7c9f85c93d4ecbdc12cd5968e2d5aed6bdf86d9cbc7d94984b75317c9371bd2b4cd656e36c6cd2664f0469d012d45b4e241481b54e6fd4007237ce42268dd050249055cc90d5c7d05808c53b208021a60f39b31d8199a89be89084d11a39a40145a309b5c338ac528932c16f531f0168b1209e6c067fccac64b348ba622d633ccf9ca7b3323aeaaa2e5145ac503f9e61cfab142b013f4092bc2f33f660ebf3575223e70ef6a87d00904648a7643113ae60831cde7618f4097b70884c17978c1c868429024cc5689dc35550ee7a81d4042fcb4ca8770c5e16f5080a470574c58346d0f9468781ece85916d6324122fbd25298ded4b2ccf6e2720e02ac87693da19a0ebdeca489cc199ca7b47960904745ccc084c1b9a81543b38ee6a946ed23d083855b7410b23d799318887b12bd6273e48169373a45d5dfecb44f3803a964d1c9cb380104ac6da68fd709620df0499a1b56ef14ebae546fec07ae209d68ee4e5be1af0f81bf008ae74330d32b68e4c53097436031e51f0f23fcf7336e507ea2025075edb0129281a699259373e3e448683fbeaa60efb79d40f060d37366636dadc238172eaef2061128a9a327cc28e4fc6342181e6a55052e76ecf556d045a38265cb0fb0a3a9592fcc9d014c9c69de39e9325ab22ea71201481ba5ee4c41c0265a6ae8b44737de63e72ae0642a034b20b90951937e1358a6535b8ecb6691850bccc7a0a041a0e00307c0cbea3094cfd8022b55b90e5f51402776c4b8471b30774edba5f8e188507d4f6e1196282bd4274fa350e10cd7b764097d0046df304fdce06ad02a575c0c5b91546bd4021208448ab075a97344dfa20b2f98af6d3b067b846942ced8d61ea4294e5ff0fe93c41f529dd2cb744124c024143290f4ed0f10949b753c4b50932b05023a0004dd06d742b96cd293d0285e0af686b1902133440eb106e350e8fb704b5aad02748e5c593374ec10bf4fd204cc01561b987e8a86eb7db31c85b73cd0f46cb2628412faadb5d0b4ca9a7374449669cda3f7e9f2e1d9dfa889538ef9dcb3c62f4777f21b18d835cdbea533b1ab6cc1eaa62b862038d8647a122e84aca49373c45200436ad1b3ca37ae9a8203f19306628d21397854727041cc88c58b572789876cbf0e140c9d20d072f19df917bec78ca31384703efb43b8e3494deb9816eee184b1b5869f4e19f1a71f0d19ca250e0e13878a62f1fbfe273ed574ec6ff83c6826bfd43fab451dafc44cdfde55fe022b8a6d483af2076ba6b7968900dd79f4973aaaf82a85fb3f76495dc6fad93fa90d4f0719e86b286ac0d91efe51357ae03c4d487e106b87cff63f3b8e43f833fc74bfd7bbf387d2fffb90ce402d6d07a05e08b0be1928bab4404af273e56faef30b521a4eedf9b34b0eb760cd802d145bc7eb44fbcbf99a900703420731d0c9375d7680f7400e2ab1ab096422de5b07db8f4225f405e7eb889e967d102160ec0bc38ca2140ccf9de128ec7b48ecd06889e2ae470e07cc0716e040f5c7a43cb74becf9f0f90a20dc522a622f1fac5999152e4e264d7e529d63d0329426a400a5d2a8979b51fcba63236485fb562d90c81071936f60bfd2a1fa0de58b42beaa985f7d87ff36399a119f7e76052fa7398b7536db00185f35bd5c8ca8afcbaec6aad4e49ef8b4133679a3cd010767ae8bab444f2456b84b509f98056ed4523504ce572ad4b2e2130a5d593e0cb44f526d6294b97ffccf077055c98d088bf85ddff2743417d9206c185cf1f063ed63ab401e486e369659684fc82a04428628e6e708995cb2b834fc87ec08f927ffd78981e151c8411f7e01ce38472ad10a49826a33f1f5f72e8912ad1a0831052136274881b680dcec5af2884f746b03b32cdae00f95a1f092e64d30540c88367b47c7fa319a79abf841ac08a54a89e644e2a5a7e52a6e58a4fd5416848158f7074068de654f836a2683c38b98beb0fbbf3e48d4262a63f8a77372e771bcbcb73080de591971630bf7ff8f59a2b47669c5c10cbffbab780cddb904ef86f1e532831af503c40f5fe629c58b38be897b365dbc3399bef79cb585d1dc3b9526db085d7912ea9b1a7f07b633868af0ee0635c385ea33e0081a2ef005dd9e39f9d7ff07703bd88939dbbacc9ad7c7fba7882aef11de586e4345a32daf54b9591f1bd061907984c70b7569b7a426b85430ebb963e13fa18dc387fafa6e5e93877ce5e2be7e623d85e63d3e6e986ad3c451927418d7e56be92ca5fd77bdd47e59f5428865cced56b692418da35a769b094f70105f77c59fda6abe6a20b74743341a0df5ad194e492ffa1663dd4b8d48ed63a1474a5b304f8f9861fc8467a5b572cd1d287187c6e603f75baa2e6084670f0c12673466ef0eb0840c314d43a5900104aa740ae3fabe4e59d69b9a28ee59bdbef192883c1d78c7ded2fe01323d2f4c40cc13205a6c2b862ceab447329cfd08d3262a18b83a5801349426e23b3c6a4484264dbbd4063206b3dae4b2b1a5c518e5bed03ea7795fd6fdcb2a7fbf267d7eb4552165cf117bcde8dfda18bf38a424482eb26d3cf3e822bdefedd3ff9d022100613bf5559f44d4d59ccae3bb285bb1547c115b7516470c415907989cc745c1fe9a68820cd86efa7ae84078b9cce5c02ddbb85d1b39c158598ebe6f2b209794719d52b9ff97b865c568c99292aa0a86862825891190315916c5eea4174ba234c4914f4359b4acef407082f31328da9223f928c098d15d0b501c71e245c136caabbd262457f5a317ab7a5519ec3f10af84b196ec50df11a665a1b3f42c62ecde03658bfe9daa056710f9b985a78136e4871ca4da0f4649156573dfe7eaecb394a15e98d75410191ea021ec27cc496cf732ab63724e615c134a0aaf8bee75065ab8ad9ba9003a9f5690b69ae92856902fc194a152915c15e7ffa57f6dc4a0a339fef547c64e31cda757c57cf2defb5949620ebb7f956f773116cd16d89be44e0a2f029b22f15e6dca62b637ba73a74af034deedfa262b49523e866fcc20451904e32612208b58207f9ae6c552d2cee33b9f212eefe7fb6fc53a0016a6162d76950d1d1b4cc396950d6541533f48570fb5cec03336e7782b4773158b32c0fd423a15f5c33055e6c14a4270164e2d2f1a7387d86c8f8771ed0193e3f0332c33e451c32a5a86668b1c3bbf699eb80b7a294665c6b229a21ef3883a45364e8dbfc55ee29d2521c6632cc997ca35a5791addc6244c35695df73e53106bddc94234e7c1d4e34886e63d100e0daedaaeb5a0a4e88ebc1bfa2c41605e68438088966310faa01a7289aad2e4eea648a52a227d5ec65f3529401d0759cf0b4c014d70b6b587660e8167c8d6e72a8cf5ea4d9677397b9b184091af45b5f293e8053eec2de5ec1199c6782510b124a717114089496146d298280fe96bae1efa95fa2688a4320291ab201578ad26ab381e717b8a8021288888a590c150387dcabf0701467818ae93348f848ad55feb1f4e3245bd0f85470a7626618c6151796c18d551c299616054befb46a3444750a90b67244a44b4e51540e88b4a981f79a0072403e12ab58c43a9638ec3a784e4c4e91f0f734c36d4b7d8847bbb2e2879dc0b395c41453de47b17a5d0083ade243713a02a24b7199549188d31dc098b314059af6236eb43345ca9e68f34053e40491a357f6dc1e42a2354cb3640c282031c571c706dde967bf51912897e24f6c29f20cddd227b314e729c580349cb63c4571e104c19cd660d27626c71864525c01019715197a0742e953523c6b5223c11d508ae7bc0d41baddf0b232cfbd28453443682169370e964f8ad38b9898df66cc912565d7f4c11c4c81ff335e464c3a62988ce9807ed7e7e5f876a05ba3ee4c8ab603c07bd3dd71a1f899628625c9c876a79bc1d140302a03648c44e1f4ce2c29cae1f627da6b05afbeace3b27c24c5073a137b1a1f1e48a4283ce13849ffc47a14b72e6ef3f2a1172404d95dfbcf07bf06bc8dadafe0e6297ef9d0f359edba7b3f914995fdda44c18a917ed2b6f6f6ff08644913459e96dd62214331a0ce63a11892f4437069ecbb21c60fec4a53144729bbf6e97e9589b8c6ccf7b3d6b4bd93eb4272963568f8259785e42c2ba021975c6e4aa61bc5ff0fd6e2dc0ee9da4204b82f78ca2f06417f3dbae029bf1004f5fa4893a7ba24d6543da84037a50a4b4bec9a6ced7e59909cbf06197afd554ad2bd48f08ca62bac0ba5227b1db605dbf2ff20eeafefa2d0b53f191b18bcc20a42223200606bb2bdfbcb93e4bd489c3cfa55e9ee0a58bdee34e5e1fe01b2e2687c37e59e0e2dafecbd0e321d11cf6249040bd2e41d48e040aeba47f4c3b9237c70ca7473bc8678058d90a396e8afda86f3a796c5364082040e119d7b878a5564a6760b85aa23d1206144645a4001effde578ee5bcca5360be31c583cd3f779ca3699e899fca5f16999761e3fa85cbba86b479eee67a262b7115ede8f53f7fb04065d651002ad69bf3d2cd338de3df88c3f955c386b928270160e2f1852ff9573cecb6ae0d1a3dd002604440768022c7d6b5491d649dba35879e10433138648e0c8bfbe848af34855f3463aa228b17274c35cccd2b668514d37caa36df73a3f5abecad621a2eca50e699057bbb20f92c25eaf15a38b45ca221198738c112ffeda2ae329ccb2063c19f9664917370398e11fe3d0840c35538125d46e9c1e3278ea671eb3a97f3cc15858d984e7e164734fd5eb9be627615a8f2bf2f21a4f67f18117e1d3e598b585e646801d4071ae08d024065e8cddd52c6ce3b6057e09d660eb9844fd5bd5a3f3409dda84e565e21cff3983d245180c6a055f1b019303af47877a4cb1cb0194310f57cf826328b6fcae362ca6740832fa0bbb61edc0a35211bcdb6ed149bc5e6e195a5189f1f4a3aa55c13dbdf2ee060e52ebefba5a5ab174ff4b1e985ae4fc04f95f5f3fb7573e31d5236c782c65ce5de0dd4444cb3b13b211e1334fceb0aa7d40ced46f70a50bbd643bdebfb451589e24bc54529ef36de8b6a707702809730b463e7f1acd00d1f51b863ccaefecbb25071e54c59442d47835dd453771124c0d56249259f66d2b192340fe5eae01ea8c2e61befc460bc5f85321720fc635203b2f2e77bacb9d3c7157e9c6828a07e4f6a8c7d6ab793aec025b49d21657d21825e11be9e889c563bb7018c436bee82d394a7a6256a0f14d3d88c0a219d307b0b00db1d5b5a2b8831ed7872b4c1b5783404d412ba602f98e45907f54a953804171b253cd2fca04fbabcbeaf14dc76c24314deff42cbaeafdc1c2b9173ebe830a8c3b7a56f1d241ac4cfe24c0fbbc0212fc43d9cd7f47523033aee0971bf19b9bc6b7ea29f1cbd2c7d383624ed1a6382ceb080675ba31740650d78a1e0b974bf35d7471c46ecaf7ffb810e5031f4bbde0ff1952a54567b87d82198fbb21b5185b2ba974079de787c6c2d627533a0824754ff4812a56ab2f5fd93265c3c3c376c0d5aee8060de3f4ce97b3ae85b16edcf32b55c3154e9096fa75e346ef2d485abf8cd2aa35f0e10e29b56ecaaaba8b8b9ed0e4ab48576d41b82441286906204615223c470a1756a55f43c76efa1cebf89f8cfac0e92bf488939721d8b84d930148ecde5e842ee86d92dd9f266630aa2783013aa013f637f63531568c3623e41f5203b25d8d98de31ac78d1f8f7aa44761e857a08509f23175db866938a16a0de538b898e1aa9e5f9a763a8028a4030638a1e4db3858d6732251de2622e37e5f88b89aff3376e5697840f6194bc381ddbba64c577c4d8280f7aa747159c04cb066918f9f42c90de13ddbfcd3531d11935858ed751c06f1ba6a9064be08b3592cee0f49496d06125b0376ca993a75f9343fb7528b4899f79890b7fc9f979ec4e27934215700b663a9346560af142d914324fa58bead746b84216e9d7ae0e7555fe338e25dc3514121a113a0954bf31da499b1dccf53c43deb42ef9921b54b948a9e16089a2053fd7e727ab3ef423e8eabe5a2cff9d7d8bab5bbb6e9c1e2bb9c0475bdda16cf2325d46556a0bf4a193480818b2ba91ff55120c336b75af52bd3ebd5292ea4ec6e42b3f5759dd7365ca155dc8c55f17f1cb8d46c07a1919b50dec4a2cd0a4d922104827f2e8fe701e3a180ed83974a996fe1f90506bad3a9de16396f4d5b7da23b187b48d1598c3f9c193dd84ad0fc0159a947b04da678166049480211e15a238454cd8896a9b40b6a9e5b0cc80e9fd22e9a8448edd1f6be38b375bf211aa4919e2fc8a64047a78fe6499ef935d5ac8c3121e5790c0b39fc30dc9b30334098f73d41f83e7d3893831070363c0c58fccbe210a87017680569f9acc2989b7534997c592600eb1f30239d16f2589261815492f255b8aa39fb62612e034ef588e612a801d021ce0c6e1dae0dc46cd56d61acb95f1f91078d8408815b6c40c69163860ef655d3c93c5764ca25e0696288f3005cc404e5feb01bd9b4e0a96d558f8bf523971e0c50f938750628de65e0d3669fff0cb53780116a944d1751dbad08815db6fe75e65f4c371cb94684c7878e27af101026fb403e30e0e437b66bcdae1bc2dd13d0aa5d46134baa5a04ecfb30de8d8ea8e0475cee5b40a6443113220febd38430ba2f697f0d2e2be350a9396889595c6d725e3e1c6a2d9da454e83a7f9ed249aed03e68ab274911d9ccbec4dcf76cd2dd0c9ed07b9bf9a5ba09bdb037277357f838e77ffff9b5b34b5c32aa490fb82a7fc4210f4eb9105cff9c520a8af8f367922546f2a3a94a59b5671676d4d5bbbba2c24e55a050dbdea2a355130a867205c102d14d37cd9166ccfff83b87d7d1785be50c906d52fbb8298a483da9bb677757d9a08189ce978f1655c37bacb556f8af621facaaffab6e89ad5bc222beaf664f4d0456a8dfdaa624177d56cabf447841d725ce49d8fd099169e37ee783aff69ca60889127756214c7872f3deb5d348ad2ba53f4a6e9c1416c01cf921a750ad16888454f523f70d0b819d0551e42c87f11a9a862e6485949a513af5e414ceab688b779545dc065f2ffa0b1513a309ec271da974ca68dbc94ae2c7365c466c4b52475d4f9f6bb5f0f79135a6566515cb691a46a1cf81b7d2b5c24759095726546b083d7410b2e516d3c290ed71ea91f834eb806d9689e1275d895cda31ce77186ef91baa3bfbeb6f5e5e978bb2b4ff25530f6fd17c8c591ea93923c03f1d87bcafdf748a595a03ac7fe888d564451156467f10dc823c31cb08acb549df38ac8a159f80073d553f144eff9217311b32dc450292bdb0b616ba4ca51f96e7b1e9387163252d706dbd79837b9ff338524bb390866c57eed2472fdd7482c5d03cf1a878a23b0bf48581d68e4db1bf8c1d760c01d2403fad12fcf9d8d1e410d8354557936ab7707652c4cb79b82563d81d3e86cc5968d59918abc786a0d7e09d400e7be79200c862494852a7c94456588326d8fcf2234928b57017f232db2bcc5fe3feb9b1069b53a39e535cecaae089d611b8f994c609a56785c47e09c9f034a0a77a5572010b1a20e82ae36213e1fcad3d0c6086dabc9c885e71e41b2b1fe68e872a1685412564f2393b9b35dded1ecdfb8581c54c4329e870b5acd51e1a393823bdcd9897f714d1c9e84d4c2b3af11b9a56d7b6fb9e596524a19e509890a210a21f49521e163aa993663ba97c24aaa4b897a437856985785ea107760e24e95944718dc558e314a3898d624911e54a2391bca497ac5edc121668f9c039c34143ef4e8c650e92143c25945432e7a8231c65ae789f2390baef21a0a92e78501329c214977845052da54992333e123ff3416906be829cbc9963bc0455c5e1365fd6584c7592844dc79c2fb82c49407c70f39e71092c83beb5731e319f25226199224aac898285ee2bc6cfa3bb1ddad9a9bb5dc2e6bb973f6d8ce9706dcd98db933c3cc4ba46962c09304e68b1224706228d4d85171c5e744123c3fe29c79b2e2cd068c71aa4b8930c6c31caf3d530debbcd67eca661dbe182044c61fc03036d1f438e79c31c67464bca633d5421da52f75e2184098a6690a8c4d343163264d0a356f70b99d3b67189f88e131b670e6b8f03a8e97d74039433e784d2567ea6ace8e16a8e664cd42bcd6c9f4a43a385242e88272b5ca831736e1e53551d6facd3ef318cb6338bec72ebba8ebf12c86314e752991c51663a0182301a0126a1943f50688a97517cd62304dd3a2ec4103d6a5b9d7c3546b5c780d03159b2842aa364b6aa8dc20d5279dea2e5ac59ffd59edfb97a6290adcf6abdb7767e6a2259670bb1d5eb483df7e53abdf7e892c10df74af17fcdde4846f1db05a82474f0d3c3754e07675f37bbbb5bae8f8db6d0fdf748a81ac25b2ba14d64c3d55818117e5026e7b9bdf6e95b0fc76ebe3a2fbb7cf00df44a1703b062e9a7d7b0a21d8aec245cbdfbe023cbffd05177dfdde0e017cd3bf2d6e9fe19b18c440d6b77fb828f6ed361bb82163468f0d314e2e709bcd6f1f91f4db4bb8a8f922881479f1f163f262086eaff9ede799df2ebb68ebb79b4a720ab023c7961d6bb2f068ea60bbf7754ff794be7c49fbb26c52a51ef39454fc388e39ed23e69973844eb8710b856f5d07901745d106f52fc79b0260a58b5ea734fd9cf69c3316a6e9e71cb4c1b79ee30888ccdb4c4ec7c0fccbbf6c859580ba9681bffccbbf0c8cb2e7557af1876fbae7a149951767ac585901474dd66b9dc3450de7193e1123e79c7100792ce6b16f1c791e7beba23e679e69b0452b6e7cf982759d424a32e3036bca0c5fd2f8ecb05627e9f90cc62aa569ba02637cce2250240c1d372b6ce4a983cbf90c9fb3991863ccf33dce39678c2f5296d756668050e5ce15efc96babd7ee2d5efb07edb61a30bcf6102eca80d71e04e286e0bd7612a06ca879ed256887c0452b54d294d74e818b56a7facb25150a1b48392a26218953d59aa1de52191c162e01e39c731631a691c2f62d281a465e8779ed5048283af85ce2090e364e4888ec193245063c150b096639b4c537c3c877d04fc225e86b365078f4e0421a5a9dbe759d5eb4622b2307177cce4c32d770b29354dc3eed0f0770a628d3fbfcab5966a060c863d4aba1a7a2314d54f9e11be6d1b46bc737ae4de9a2ba6671395dc34a35ccc34a17ad318a6a18f372fb75ee7ce58a79454bbaa77dbaf74b7ac569bd3ef0f3013e67df4571cdeadc0623c433d46122860edc99cfcd3e4803e5d4640bd60b2b70d5cce76caf73205e7b09285421fbda43e05bfe69ed4117ad54305e785dcbad50812fd6b4afe73bab75313d7fbc0a0523c70bbdeee1dbc659d7beab832f0f72604b6c122b5531b3895c6b8569d739e79c6fce39eb4c6b71cda4bdd7566cb188b1088355218d5faf2a246697ab0a65b1d5aa42589b6615ba63f955c8926415aafa65ab0823d6591433eaaab6ead8710d63d173d8eb786dadb5ea259a9aad15c58d33fe1388b58d77b06aaf575dcb9d2fd6aabdb512a2bd6246e0ea648358be228100917105fab8dc31add70fb9a010676e66ddc66367ab9393d4df5bcbbc8af1e75936620854e078c2ad392d369da35f8bf17e9cf3ff305673ebac8357acecf5da76f6ec79e77bbfd842084102c6186bb762bdf75a7badc5185b8c7150881fa78d848b86a88920fe5eec178b430168f919447d3c87cd68a878f8d333530cb47bc984a392ed43f3a9a2fdd07c801868a8f478f81a126d1f0d359fdf9e71e67ecc9f942926dc0969f8c0360c63b4201b9c5e59d7d6e4eb2989a65b52a727fca4f8b6c1f130dd908e523a51d43299d6a3ccf783816432d8cbb78bc40b368e2459cb7af1cfeab16bf8c926d105c2667a6dd84c6358ce989bf584bd328f07734b1bb79bb5da6c8998cedd13951ebbe6e5b2fc1e9b38fd499b3818dd05608fd538e8ae0dbf86afac1446343accb707c39863cfb1c7729646bffbd13dce1b808fdde7eab16b08fe1829f989f96069eff1c8e39df8a7f61a62206ca6553fe9457fd2d7f0dab099a617351deb5c9ee320e3b173d071d85d74749f1a7e0d5faf9acf8e71fa98d7b662d587663f46b672cc49d239e81ebb0ff9a3f3294b1ed68c18d6e9e6e9b9168b59ff496134fbaf611501fbb807c32a641d9b3e0e5b60b1c7ccd3c469ce4c3f9829be6dc79edb41b6bf36c6ae5aaec3676f995b8be5d5044052234c18381c94ce9f19e7c49edbd7763b649e7f688db08760bf1ea76d06fb8d5d7ea4cd766b843d3442e621651eecb78760bf1e1c945898c002134c30c1d652f8c2401f39cb2f1a115309d3ce94f10f576d33d7b646e74d237f866f78d6f291e672d8e8f887813039f248df18b87fa4e160b625f0167fd4738f5584cd3b73b3d9ecafb56082a39f356f7ccb4eb40ff28b7ff5e71aae1a77d8f509f7352d07699cb971f7bb3288993e083e36fd8cc17479370e3110d616eeafe6d5b555138882f9c34078ccba36bcd3d638c4b7bdcf731ce6252cabc33799ce66590a42ba0c639d30e1cf387c0e9dbd3776793906564b96d26444d786fd75d6ac8c3376fa881b3b6b27b00edb3aebe3315a909f1f29d98e43d605c29b88846eac17bfd2c7e370685d678dc3f006966c876f3e8edd03270e430c8491b0d3ef0261f701833ca596e75aa958be5ea5cba5c5ad75f97a952ed7b897f2eff255babc54ea615d20eca96ed4e6d84af7de2e1231c73f66dd05e0e1b56d1aad1403e1316b1cb660c3b445746fe4769d23ee263196f33e4923622a9d43f62d003bacc431bc68d6455d8efd4cefb9390cbfa724bc40d853dd8e2c635eba48c44eb7b996d1524b776db895c6684148cf34a421d105c2adf4da6eb41c36c437d2f7f63dc6c10b847d1c6edd638c49eb329d0ca7bb6ab91530d6e7a12c1d9dc8521991d9729d00b3e76ed933763a3e6b75c74e97c98844122207d9eef1eb759e341460e1dbda09b2c3dc84c1dcd64ec7ae135a1f133dc761f838566ba55504ec663b6c5885b263d7e7d2c556fa7878835d76182d976b2b94196f6cee9725dd45b66a39d96711322d6b5aeb83e0ce81c5fa8310e1dfbd4b249dd86f4d66edece631e7ce0dacf123edcc05b067f0f3d3df6a4d1105e3ef84fd18f8846b1b6803f8d75b425b87a6ea553fc3b2fb8e33ac2aa467a842d94531cfb27e86355b7351ec33acd90cb334b3351d18cd84b33533ac9b3b38597c31ce5967118f786711cfb06255312bb12bb12cb12a7c730d35f0ec1d312f677db3a881a781a78187b13c29173ab82be4af0781a8f244f4d749b8a8feeb3a53c3102b778552179555fd80c126affd9a69d2fac7b55fde55ba3d1f8ad7fbb55f1dbee954d7ac198ba5b5d67e892c506b9f26a7aa5f8fd7afd73ffdd331d796679554bc96bd0eeaa0760ca4a0b5d6a216b5d65afb081fafb59376d2bacbafb681c6d16bd0a04183d36bd0d0ebb9f032994c269349cd38f23f21fccfcf8f4dffc76b9681238c948c3841523192bc8f8f4f9a394458c1602c169bed590275e7f773a18a7977a6693a59877124659aa689d3c73a98fb58013142e3a5a94acd92ed995475a6a2ac9282508290663d618089c1625ac37c60b0139ba6a94db0e0e4053764d66c2102e2034b528ad54cd3a78d006c58ba1031b1424377e3c7e76c355ef8582f1dcc124d5b7a4cc171e64c0c2a7c882b4c53ea058e05983eef748405935d9211518f56129c9aeed1b4efeea05a384bf039a1891e1755535a48316279a063ec05f3849da74fcc2fe60294da05f9e034cf9fd363bc3730374d9af6e99e69c662522e56fc799ea64f4c06516cc824d1d01363c80ef35ce3038b9da7540b376f9ae6707879f927c7b084b9fc1cb5a2c867f373cea667b74dd8a9ea27c367d8e79cb35b9ddd8950f179c3e79cb387408515e8903efb0bf2878be69c7d84eff3cfe79c735195cff987cefbf8f8f8f8f8f454e8f898e7582c168bc57443c044e9f6942f5b829122ea61567bced5145fd197d75da252f8683d9b27557451452a1cb075b6000c16638e603022844169dbd379bd9c61311ae6c1dc63301abe614f80d594340c56b328e26c00411229658094d91d1163752480ea0594233141a4f4c871c6344df356a18bbfbef8ec394711c9f059e873148a1d9f67668e0d6db02813858945901838445839a1434d143c46cadc184d7d9e311317c8809d63b000f41002c3110e292b2c4962aee68ad8093b11a541fcfdb02e0ffb602ce1f0a65d1efb25ba68078fdd02634d4eb6cafe8c1e73788c310cdf4ebbb33cab74f5d8ad0f8c1d0329608ca70c3d2e1f631bc618fb88243e8f31c650603cc63e35a71e7f9ee7e927f04f979d4f45fef4f0e7799ee7d9eba179d3b3699a5490bce905ca8968bb69a653587c2c163345219494a987c160a6bf6942e1f15a6b0da5cb6b2d517200a1a2d06980d6e1f35231cfc9d467cf39bb2c5bf96cc5dff048d3844f12003963260b89af8b1a1bae5c83c83c4d2d5e59282736f43985c89821de1d2b606a8c9617ac0133ceb969a80b549397aa1378813a513445c7400aa28740ece0c5a927a21745d121208a6ec3a20785708af2a2eb455114453f63bce8b28b9a2ffa94931511b99af99c7b54728099a212e7b1152cb22072c249f1bd9e5244837aa2e2b5d3942059a6a6f86c18e708ef14cd570c9a20d1b125cb9e245078220f85d63a9b396b5df5c860c27104a786940ca435482e827bec24a1496269903509c979a7a4b000a12cbf94129ef8f2e7cbd26d65594ab9190366c86b5ddeaaaa2fbd0e152840d0d8a893628658561d4ef00694d0a1136389171d38ac0c5e8dd71863aca317fb9c8362d250419aa1f4644f0c329fc852eeb12ccb5ab63a78e7075e0b678444ac9c8182e14a91040425235529950e143f3e5f557a52f39b8385499e17e78928da470e0398185e3971c30e30c84e83d61bc5e64135a6878eaba71e783cb8dccc89f38248d515302e644946394f5d3df1d80142d66e8be13eed20faec53a5868e314e515a48d1e273333f93f464144f4a55af6a8246ce7907f049879dc7dec25eb5765b9923e79c7346b32ee3419ea71c2c3cae5263c85204e491d95155e468ccbc3166b94543d9229aa1dc4f38966abccb2b5fe91a8c4baa243ab026b5d61b890f1690e8a1cd00850915569ad0dce86254e2ca7391b369c53d8f9f8e383d761992168fbdc34537786632c705189cc0d41893c402858b7cc509865deaa6e65d5c4ebb59c3bc6bb3376af64809b7472b7e2ebb56c23768d9cd5ace9fcb3afb9e7c39f5e261c1d8d4dafa607cc620c881074e99395ce2c8592183523352a6620f81021cdfaec796155bc4a8c078a9e835d5920b56544c478aa40853c405292350268d188ad031030565444ae7b61f8d31c6a688d2c475faec397bad5eacc86082c6d00e7827450cc52f53114902e1a639450a1f0f2924474b626c9199e61b2d40a0ba91e40a878b1770b021010bdf744f055f5cc831c31018516050985aa3987a5d891cca840f10f2909a3c38ded82012076889ccf44e1e9ae1f163ac4b1821e9aee65c05f7d4c0d9139f9bf9aebca85214b9e06a96406ac18a0f24225f0e33d6c456b256c8967b7a04f8ecb614a2eb91e4ea052551ec900f8ac725c679babcf6d73acf9bd75ca2f4387189dae3a2039b99344d57e4242de162d322ac9c73d6152e796a8478ecd69633136c72ced95a21fb654b54d60ea03397ad0c07638c9704a04441260a0f0d0134b9ca136072ee2d9576ca01a8b8acf19531a2a6d739975ba202b085cc639761b7d5496bb7d5e89965b985076d683543464f478309cb9e92c84a6f296b8953e614ecb88151070e5395147a5c453acaace5e741a98ebea37e74d945cf1ffd830d8fa31b215180d11906501de500011d49d73aff5a9f03f1434b2c95d109047c768bf5d6b99ad861bc84f5c8224d079fdda2c23c75da10c1d0650a2eb7f37ceed42958c8a26551e6f16f9ba6da5f2fcc7be19763e0a2307f790a2f0f810a54676cfcebf57208bcfce5367cbbbf344d67e05e25101a51c1a2a8ceb00cee95f52f1f91e55fafd7cb09121ebe31c3387196702fdf171dc0bffc7cf32f975d74f6affc13f35aeb582c0363c058bd444bf28fca8c8a87c1dcee73533961b0990c9fae697534b125ddba82e46086633a310fdff699adae8d06f39206ab894dd7669558cf66ac889b7e4ddf347d8779d35b1735dff453367381cc9bdec195bcd980375f78f3a68760c220f5a683303d04092364bce9255c14f6a643a0c79b4e818b9e6f3a0a49de740c5cd4c39b9e82074210e64d1fc14535bce92a5cb45205d5bce92b98be02236ffa0b2e9a80377d06a6dfe0a2f94db7e945dd12519109bee9d6c8a48a41c99b550c8fc59b6e6f985465cabcf97ad36dcfbe4628e1c1020db0089737785e59f7301e45d1b54f86198c9640ed891345863bb1134470760999c23c81b24b539c56c162bdcdde72ab9b41abe52d4f01b73c042aac20eb5be6b77aad5eabe5b6960795dff21147bee5255c747f6bd66af9bea8886fb1a0f32d975dd4e75b9e7fb5194e3e47e59c7b3d2932eedc7e8414df302f9d92a15bc00e67b13801634fbb7b51988521d83c8163c58605262ceca42fe81ae6f1623c0920682ba10ca1820f27a53c5153575d8639100f05638cc7183ca0d2dfec7061a297278d945a47c4a3f364c839e7b28e238c1d8ff1140c2e8fadf830c6186389d293c1cb1a29496e301d8c31ce398f18fb165d09f36e8863ed7c71f42de2b32c8dccbc862a5d21cc608b5e7b0812469400010aa040a74ebdf6143c100220af7d04172d5fbb0a2bacc0f7daf57aea48ca6bbfc14543485d4021ba2800746e5ee38bd6a916705ee7d737a65c005fbbf5617b17ad53bba5d7b5055f8ad76e95e8a9175d5ebb8da29db26801394bba0ca96961074a840b9b089ee769346500f957b3e09879cbb82160ad9ad921ec76bdcb4f3aef72f9071b76d55c3ebb2ed7f2daf3567a2d664a5847ccd49b2d361dee00421709d738239d44dd1ba7dc2889306a8c6d8ae058d3befd36d7f49e6a93f5c1e7f8a6530fc3d71e62d06b1bae553f35768d71d5577bbdb6059c00df35585731eb456badb5e25ac58ac5a06a735cab59b4d6e6bcf7edba894be01cd82b6a315bf89682307892b0f9e9287ac1c2908259ad5f313b214992d4a2ae2adf32ae6616748659ccabac6cadcc29d7e1c36bcdc20d0b195e6f1773b0c73d8a28c4cc20e5b3cb66d93d43b1c8f2d943c823ee88cb62891e5ba8c00ad4c1b73aff2c02ac57342cba5c6183ab2076ebcc75f00ff2cf8ac03c1735a6618d71893febdf1c672ee8732b80f812e39cf398b1f0b5987199db88f914b3f045a5bcc62240f43cead1354df452749cb3701c7325b03e6fd9316cef0d2b77d9b5cbd2aeb008c85e6eb3dc295c9bc69e75ce95b8f666d7b46c776f9d7ec4cdb414b09d81dd5960b4bb6bd3b9c4185f6ff988db7a0d252d17e24bd7c09c73ceb9962bfd45d3bf1de7cb5f59e839fdd356d7a644c7086c86f8fcdbfb3c67eefa77d1975bd7561ab863b5dc79c26ab9d9ccdd1614f42faf2f37b18bc4cbac0738ad2b7bcd38048ea9ac7d3081cfa597355d65922f5a7e2557c799d3bda68b66eb7ae9a2557ffaeb286f5de7b493e6d1b44e35d06e346da477a2d0f4145ef49b7496631306d22deddac91fdfaedc29d256b0fd076e8e2e123f3f567ff0c1072e0f366436558418ac08b06e4db04a7d6d5ed881a708675f98b9f5bca60ae518dcbccd66de7a2e63619d47afda8a02d7366a8c473747cfaeb588458c4390a057a8c09144886b1b6bb8d2505083d801e0a6d3343ca60140c3bbc768b92a9500cfb514e0b97304cfc93e969b7dcc3f66fb58d0c7407c8c848fd13c56008fc5bcc34545f0987fb8e8068f790817bd79cc435c547bcc4754a19ac71e7f30805b6d00a7e5ecbb0720141ebb16f30d5ee715bcde8e692b043d0edafee3668b06c237ede7c7b78bb4dc871745d15bf746bae872988b64cde6328f23eca461170d2ff9f08d749bdd966e4db78ea52e3a7aeb02690f80d78b0ac0d192f6e1dab493b41906d23e6a372d2d17f4bab63db848bb798b561f44b5f90f2db742d0dbdcc3ed86f5071c93cd4ddbbad97cc4e50042086e7dc4dd2002cdbe06cc2380db019018c001dcac67905717892039a8401c1302bcba482000f862d6a2a8754541053e08377d680b70910602448bc3cd731dfec3675bd06710798367f78bca3c7b0821aa10ccb39b66ee3e4db320075fba072cb05f6ea0d9bfd16e1287fc437d4437384aab17086ba0dd24b2846bd32ea3fdd08250a822683f69aed658ea7a6d15f8ba267a90679a02dc87567f01b4dc080e82368207294001b49c4712704c23282001b47a6d41b47a6d08a01da016e2dab408b4fa21d0eab5198056afad00b47a6d40b47a6d3602d00640dbd7a61d04da8981b47ff050a3a55045d03548ab055d5bf0ddaf7770a7d517002db73f00b55ceb4503002d073365fc073414d8de83da0966ae5d13c93a7c4ea72582a88093c5250d14173b9c75717851ebc25bef8096829d39a6ad60abb901b6a112d263461ba62b612ad360e60896a42a58522a5a4099cc5a6706150e266bbe24c9c2024a558ad0417564cf9292346bc634bd4ac0509124048d9396365380e68e567d014c939dac19be48b51113c30be39c4140250995912435e8e4c0d930affd9cb9f0cf7a6a5ccbad60fb0de3b460beace5f658cb9d62edc9cdef732de7afc98c0143064a92245926703e1b36a6a2a21076f5d76159aec3805548017f1de6846f3abdb0aabf0dc052a30b0ca7312d6cc1dd1dbed53d3a2d68764854766470d761bc8bda2f7f1da6846f2252f4f02db9d9f1630cee3aac7751ebc5a704d604c5e4afc3a25c74b45351fdd3bfaccfc261151a01dfee70f852c237154c795a4ad3c40e550fdcf557efa2b6cb5f7ff9f0cd04666010a3e5c511224870d75f4d17b54ef856620a9319372ecc7ca113c4592e3f7dfd75f5aa515131f8327aed5ebc2a5480bffe4af1ed62b99cf0ad862506353244bdd0c607eeda2d7fddf5c3b70d7851e1c2478b3538a0e0aed5f2d75d417c738195123a499e3ce9220677dd8575519b4528e7a2e291bfeeca7239a9a8f8fb45f9ebae2597aba90a01fd759712be5d20b0f7d75b417c2b81c4891b1846f6acb9a30477bd8575518be5afb784f856d10cc9c0624d0d1956b8ebade145ed95bfee4af1ad6ae1a2878e93ab1e308a70d75dba8b5a2b3b192ede45afbb6eb4c6545474129daefe7a2b4bebd7025621db5f6f45b937cccbb5a4fe7a2bc5371ca461f43481f3064b1cdcadfa1254aed88082c574e70416eea2b6ca5f6f29e15b079cf81072a487a60a0bce52fdf5966fc85f6f29b9b71177ddb45351acc3baac357286558876abaa94f00d04199c76c3ac222222b86ba7feca800b9619473000f100c15da9bf6e3ae1db0a866024b913acca7283bb36ea6705e4f1d7cdab8bd6a8e87d7a7a6b1a99324c5e15f2bff9973389fe7a59f5c3370a14a138922606a43b4eb80bf5d7cb20be39111b645cf042444f0cdcf512eba2f649c8fb5be2ae974e2a7a8508795b2e954acaa62a2480bf5e2ae1dbf5f9c820be15a04eb0881224413a3bdc7512eba2d6e9af93427cab70645c2933440d942333e0ae93c38b5a2a7fbd4cf1ad0e87102162648e8c30297077ca4e46c9bbe8f5f2c645cdbf4e8ea9e87d715f90577f9dcc425a91c02a1480bf4e3ae1dbbd97acfaeb648a6f26948921062b6fdeb428c25d277517b552fe3ab9c3b712484b5a00be218af3040b779de45d9454c237109ac0518187cd0aac15b8eb64efa2168a4f090915e5a2a49d8a5a3b76b2d6c81956a1d94d6f8ad56bba68adba68fd5901f3fcf57db56b54d49221f3f6fa36da322e5aab1087bfbe537cb3585855c02ab423e7a27968e7af8f59a3938a5a2b56defab8342a199baad086bff6f77b1dc4b7123a26aa183f90825bcad827f85601df0b1b36d2c0a85306775d0f2f6a9da04cde84c161834d1434b8a69d8c8b8e7f7de4c1f9ebe38d8b8ea83d72445ffd759d455b5db4be86bfb6a9a9aac4d15210324fca18a9f282bbb6c99760f223498c0b3064244183bbae7917b54c3e4492ab2b4d566d88dcc15dd7bd8bda253e25ba89cc5fd7512e1ab353515ba3c69a8b0a657f5d0c5aac12424e1425c5915a3307084ec95f179b9cf04d041d3c57f04c99c212c45d17ab2e6a93fcac8062feba7875d1f2af8b352a6a615818e28dbf2e1a89327855a8f557f72e903d3d2712fdf55c958158422b7f3dcbb9b7170ea5819d287f3d2f659ff9d7f345873b9f267f3ddfb8a8cf5fc7632a2a02326f1d67b968cbafe35ff957059ce25b8924bf16b2c2c0b9226487bb16c95fc73b7cab7656b4193ee1e104490a9c3df2d7b112be5516a414f9f2428985a41eb8ebb87751ebf35dc7512ebaed543402d5cacdfaeb77cd9533bc417c43e1d7abba68fd590179fcf57b7551d75fbf352a9a8004dcf8ebd7c8ef0e5fde4d6f092677f2ecaaac58e1d10477ad91bf6e8117ad5817ad423936eba24e2ada41b559efe0ed75aba4a90ad95bc164093112f2e5081d1db6484573e687191947b050e9c159a607c8f032a45b32e605197076692703f6d73950515b6dd66f9b02285c4f81cd509e154092d61c05c159220c30ba41c6479494e011eefaeca2768806aa9c1062c547687de382ecd12bc75d539dd7a59b6339967b2c8a513949518281f5a462b9898442e2bc9b548de4f874e3477999009be4938950a7424b1c154749574f8610b539a25ae21b99a42ef6f6a16ac2520a3267305cb910aa81d11b92a7c88425ba13464a7a445c28d92969b2c8efb19491a3140aa5609aa62d869a76ad522aa4aa50c9ec949da76c264b614d48ad7032ab5b53f192f48d634992bebd83453c34464e4825b008e25961548251b08415411fc19074e61895e4385eedf6156f5f295df566573ebf6ab20595e5d0976559966559da58482f50d5ed4c6081e7f876d2f029ef299b5d053150dd5904d6efb1b7a1dc7bef2de6ea025533a50962d6cc4eec3d3ed5991203f63ee0aa078beeb7cd76ce3c68b79482c6968964935a7fd05b6f1faf11579224f71ec791244972cb3849922465a59108aa1c514f6e92a40293ca9ef44d562f6b24b94992244972d46449525909cf7cd66aed054992243945a6c8937b3c835ac32c411a5b7b01ee1d75270ed218a4ca4227861e472b27adb5a830fae2d332636785a5e5c70a2f422129be683162c5d342e5c597dd8cf6f5290b4d8b6987f9bd5ba60947c216342a3c3d6f9c3ce9f174e2f790aa85092ff19e54a7cf6b9335edad9311bc6194f68c5a00951c99e062f8b43361a7c4a20b0c135a34cd3af8fa646388ef72a824f7e6011bb5589665c9d33ccd33cbb22cb71ec95d9aa62f641c69e5169d292344bf755f2f5aeebdb7d2ef516b92246d3c4992244992387e1b0770e3086e1c581b8770e3186e72efbdf7de9ad4fbc8e8a5b5d65a36430292484112098b44129248439257ea209224499224b5d624499224496a529fb933ea271952cc6dcf9df4bb4015b88327d64ce849435b1af49bc40d5d88df5e3a1991533edea847adf58877699ad63862da7b9f53407c555f2f2aae2841848d1e29749e0ca972c78454f00d997b88e086893d728451b65ce1f6d053559928e6075d948c9bfc5d77269fe8cca5bd4fd96c89eec738d6bc975469ada794c478ed79cbb4d65a37f9685a227d8aa88aec6162440d141665703a7dd2f4e4caeb71d45a6badf5388e5a6badb51ec751eb514529d659de4c76e4de7befbdb713270c54779d1f3d97793ff161a8384cf638baf9711c9baa3050dd6eef388ee388f4e3b8f7de3bc718f528c3b64d74249aec48921cc97124a7920447124ecad65eb1f77ef28b3ad32347921c35100c515c6824c1bdb1b0d0487a6190c423552cd8a8c843167460e0243d5d8c2b9b1dd125cd20e1f3b5209104689d7cf61082387c7d8ae3f36d2e99bbf5a4c20eaeb55dafcda65fa7ea58d9f4499a0cab400384c1e48554132929f6584d0dc5ccce7356f7299b7d7d9a61747a4661ea56490e195bba955b1ff40815bb674dd69a336a728f3bfd32b3232e391e3d5959a12755f3532babe878bff38c1268502961126c23a7066eebf95d45172ccb2441ae16a94d361d8c24499230529d59be3061fc7edc7bbb2e22dff4c0cc729de5fd42c68b1b673992bb4ac5f0e9a2670a491ac7711c4717c1b24a8bdd8fa3dbd3774e336090f991dc558e863c8751e5b6ff127cfdf88dfa48b8f7d50badc2a7868d916854a5c60e8e2c9b19e93050dd346ce01403d5ed2bbab2d9914f9f70d4743291614f5811c440755f89318ee3092c7c18a8eebf3224c057a81341df668fb1345b30fcdebe65fb77e9aeb29cf5f06120b324ef08cd71040204089071efbd79bf37e9a39be4488efa041919caf10e9e9666d2655d9522ba2246294c316f1e430c548f5ae87105cd962034e2ecb07998e830e1d9a569aa0206872c9b55a8de9a2a5d8e56c82e49dca273d6e057a825a2dfae6bf0c70c5544862e8fbcae6ce6a30a03d52d9ed84c5755d4e021a9689b3793920b54a36ca933cbec4b262bb7690fbffda4f2fb85139ea9726f1fe24eb177171856434b27acec81ca624ac3e4e689a4f9ebd31024b32b41aed668bed9db35b6c6566d54d244ba49e6142693154c5ae8256fccb872dd792bd9912c94f894cd96a4e56672a2ceef513b97dfe5f5d3e6ffc1f66b39c17cefbd7de7ad048881ea93ba2c7df411d73fd8cabdf7de504c66fcdea326f7de497cbf7ffb2e7defbd97f8305025691faecdb58df61e000d3833d8dce0957181db787efb09fc0db5e4ccef5127e9f987272fc2cf7990d9c64b52ca62a51fc751fc516bad93a47b2fb9c8b2d91003d50d2506de79fb943050dd2fb6e0b8b299912a233f23c0f3c4b7fa428d0d244d489c663f3a8a1f5de046977915aa3f8e23f002d5d747821757c40903d57dd16a4fd9936ef8b9d337e9c30e4bbc9891f5054c1217d8b470a76806276ec498701305378453244bcb9b2b44629ece0ccfaf522d9072520c5251bc231731948eacaae9fa2a7554a5c7b8f78b56929b295d6e0c6963c48e9e22d857a92337ba4ad96697527c88902d1d2ea92315af33c9e5a5e1ab94911c29232c17d4b8b5d65acf6b5d948f8643466f5e7f031e2e3cc132e6088b275c1ebe71b9be46a5664e3d5ed53367de6c3d8ee3388ea3d65b6fbd759535595e5169959c24a24087fc18b50edb1194264431505db580d37586980c4519c72123e30b1dfa21d66043eef628ee4d6aadf528eebdb5d6daa5b59e09ef9843795a6813ba918688436badb50ef25a1cc7711ca34cf0f8717686fc94cb4bf6352a4df1adaf51432de81346092a40a69c30f182c58d187444e040c99cdd8b3c548a80b17344881051c2878be1953a4a3ca2b8e0ac9cb77e9e1121b4af531c2ba95b68ed5b43392255e8335092c6a8d4854c034d6f6a06d31a3d615ac08d719ec4997a5267e6b6f1b307d53373c85af5c4ccefaf534fae84a58719453ac90d9c5d1c9f101d1c393ec014d1a832e3c79b2e654992a56d136496963423deed66edbcb6996cd76433f2b228f544ed172ec049f31b6327ca1ea190198634761dc7d12b981f7ff42dbbb78c1bddc773cc44b31f85bcf951c89d1fb5d65aeb749f58ebdc397bed4f42b6bcd6f9b53eebe7ce1f5910f9e0b696de699d8131586176325e487105a7dd14c1d839f00fb60fd736d250810791144be2bc3004056e6cf3e3101e55ea5cd9dc67a5f9c1fcfa24a4e9731e44b6cec0207fae657341d82f50032e534df4cc39b19403876b8e813cfc887bddc30759361d7ce0471baa1f3ad690a1c1a664c09319741419499b345953b514552d7bf213120a3269b2ec7cd4c159356ffdb43ebba887b7b66e80c94acf9ba9a91f36d2542e2c3889f2a22ae98d8a19ce94e0a53254f1a2c4c44a1c2c0e708009903c7a6850418a4106d858b586b75e31164beca5ecad9875496eb36abcc2cc73adaf359b6d0bf2af307b5cd31857a9e2b2a54e903773d03041a3c55dafb298f0d4c0f9c2b43b13e4e12b149e16befc0a85a78b78dde82210a4609c6accf191a2076e34f3a35192057654508200937c4370b90c99369f5d8647cf670f21c8f6152aebe85f5fa1f0ec112f9bd28d69676b5de6754e318e6af6f0f83ccba26f903714ac936f3f06a68d3879ea9029b2c2110307cc9ab5a6c9340dc6b080e4846715030d4e93897aecb21976c76e937aec217808a7ecc37561eb2261ad9cfb6b1b286fbd859d666e3d3b459979eb1deeede2ac75a0f3c26c4962af213e7788f3f9b38b96b44b4ed1ade77cce1cdf32ce673eab42c60dd16c866f39d724a08446c5100e112439381bd441220db37ec89d4223aa0824e8927493acba963a273a292ee01cb7883f08e1f707a246a8f42bd9ea72d62163680400000000d3160000180c0c08c682791e46614e6b771480106094505c5c3e1347a3419083288a81180832c618638821c818c34cd56d0313920587dba46cbe443d6e6e942f8ece4f97924babbb140da2325554422ad73b8d6b452934d9def0fca1d6609f47c5f69867f4afd4e013824e6b8429e4b4f0be994470ef3baa28e800b788ef7dc33fe5e231df325cd714b163c821050406641fdd0e19168e34ba021e22f54a2a3cd56b02d62a46f0012539b71ac13573861bdd34b72aa0ef7c29280590f624ceaf58c87dace1c596db8300747e1c3429a89a319ecb1c77ff1f55a32ef383395edcb05156e07b5d2a0747f0c51e2e2866d021c62f99d61fc564a24284af0a576652432f70c8e0c4ac82a4feaca9031a96594f6fc98d0b78da49942866f62f055822014a492f6a14a67d589a4e42fbb496caa28f4f53887bf659a804564289a454082c55160e824628c5b0f9b3525d5158014c3e982556c6d84a37782d97679584f4aed951994cd982318c953e4700226f67843e8a9c12098484e2fad0b172d424f309ce57759ef68d057f9a4043389412ad4094edc42c7e35dc823c830235ee926995a29c49fd26981165ba954e6e5d8646cb05ad53a0dcad34c4680786c5a253d299bcfc47822894880c7cf00dd9161bffcb22e5db81aa27e75a578af459707875debd40b0500a00b5acd62e2d0e8ad6d23b4c9182e44733f96149140adcc7115b3eea912b5175a542165ec2586ac922659c19a850f611becc9249e468a7119661497b2e329d4fe91d2288f0670cd70dad23014cd94562a99a2c1038a1293d6d67b7c8327f0857f8f72b3d7a398735f1d493125edc5373f2825a1b920f0144dbe800a78556df181df750a116ecf450939a2a951b0df125fbc2a54979eb7bf977c878f29853ab655727613b2ce8035a380e49d7278b839359116abfd76a41114d834146f53fdf68a9ef9995f4803c10dd6e2e8cc283b89072ae19960d76514cf6744f7583cd865b63473c9c1eacd6449009b8aaad3441978f28dd976005fdd845137ae0d20b815d6d676bb28c2a03228657a54c1b772813a40d6c23304fce240af6f1a6a4d17bcacfab22c7f33e2c4a48480d778782687d4162f13c55e49fdc7030b784abe27084984189f4591e2fc245d303a0062de1607815b8225cc2af74efb26c84e8aa5ea12ebf6eed8a121944f18684e70e349f3173c91313b9f43bba9bc888462e0f3280e241b48dae7e0620c11a761e70f713edf0e2431538a214173c3c7cf70a9c05c3549a780cebe6f32ede243ed8c437c4831b31762af4cbf4353111b1b2dbe639b903741c4c01a9abbfc39e44da0bbd87349f225ab8641082d3189a8682d406de0fd15d3bfd3cf726dd5e703aec4cda6e88dc5e44eccebdb16cdcca843308bdb717fb963710ccde97a50185c462392c16706771185fedb83db879559719d023f4a03368a1e3d74cab1fe54cb4505cc08b1fcbfa0cadcf784166885f6e265a08f98a706d2635f4f90aa898243c27e32dd69ad0d278aebcebd685de2345fb320480681a130f6a5d7c51eb7257e4b8a55c6f278b5f53221b827535e4b6707451018f450ba578706ce94a366978c2511377b28bd81c889b0cc10e2ef758787b39f8f2c7342de3d2c16df76211a1907b62c9140953424c4debb4b17fb7c75a8d5156255792ef44fccec26d3736e07f50553eb134b3b08a85cd4762163459f46346d57e8da4f7736f4003e83ccabc856686877c6f5305e941e59175e6fd57cbac284f08b4bb4dd1b35f5b2f9fca8d3db5018ff53109979ff51444a60984e71b16e315be302d437f55722aafd9aa868c595a46da01b789efced12472f26d4c7da6444eda0e5dd0b2327a2c57ce963164e456049c6b91e54194d280d57c6bee9811194920e4fc140d2f846b9425b84421f312e319ed577719fcadc1c2dbe27855ac6ae9248b77aa11f8d1a0968c7454f6cf6b6fc0dc556a085a269d642e22b1fae3b92ff9e414961ede0e276a4ed2b1159758fb1da5193513b653e648e77f577c5bdd4cbafa1f6d0357ff1645dd6e39dd3f25352be56947ab12717c42af474e3fbebf5082657bde3efc2fa207ae7958d03c3989fd734c64518c919c97394c2e3ef58f1cc4fc3b0738a3c3c6fbe40694fcf567c20891df3e2569f3159cb40812fc3f1b5bcf75e04a169938bd6d83252fc3f4ccedf8f5d45b556edf1e4818ee43c0d6e22d0116d6c9c69b73d28a19183415726d1a20e4fe6a02a33449a9f88b8425b3d05fb2e89031babe90dcda486a1fa81468076a034485248bc3177bbcddffe656f52d229f1424ed4764863c9c10c38851310e9e0067654cf85efe861a75b1ef55812ac7d8e0e2ab60bdcbb9dd82326133d2eebac0dc2a91818838175444976a5d3b8f05a53a3bcb9e7b019b271fe9f3e53a963a892f16ec218df514638b3e9fcdfafb33c320cd76fe6e47b0487768463d7fefe02c91185ea57a33e8f9a596fc299b25f75e253081b3b3cbb2613dbc50ccc01992289c82efc3361b8a63991ef218743471a4a66557b3dd15755daeb4de017cf5a3e9a6532cf586ce2a6a7b27bafb13a2dd6687f14e73db9756f3c4b8f9f8ae72ae7551fe0bbbbf0ee86e427cfa53466748225a3499bfda4139311e55a359c349278d7c33fd4b16c263c2fb0da9b1e216a8c6481a819cc84f0b4beaa64112230b79a26865189b5bca49753f3d409b18b0d2039a82bc7c6a9aaa6c7fedff0caaec98d341b72ace73a054db0a8fe7ff22032877260d26cfa08b6980e4b77739132d04bed222293f92fb9c73821122941736e90d16443d081b335c2042d5ee7528c17ac831f26506374f7456f92171dbe626796cdd61a3106beec4f60dc87d9af94dacdc0bcde96155ed660bf1bb4cabda6dd987af58381a796157c61f83dc58e2f4284e5e915ca3c01ac84aa235339e8e6ae1b82e4b1f7939c8b88446492df852f6278655c3e24d206203f6ab9671385b8d9ba844aae832d06491c235035c93a7c88c55ab52fcf2559a58bb2bdb9156842abfbd0934f6aa1168ea7e094d18c80219fa5bb993fa90864508502465c0acc858045106e9b2ef0f114972adfb0b4efe8f79648f2d11c352d4cc963c9092d113298dede558335f968d24f3ec9f514ac35055f6c52dcda29ecc625357e1d528ecf798bd912a0de986f6525845ac650344fe519084548a34a0492e5f2fd3c8130931331ae6604d3869fbc954dad4ec54ddb267b35008b24986084555f2c1678c97a668e167a3cd7273341270395eaef1feeb975ae4d44ca2d6ca230c84c80b2b5392bc1c19859928d9570bd7e092c784ed0cf6d2bc09711aec4d0e476d55bded35418f3ff43cf56ab07d2a68d3d29f516cf9c3215851244a62055a05b72e0332ff0a735a6fd3597760d6aa7a48400a5e0e54d47dceaee60fc4def27b33250344b67108336874215d8ccb6869a3e6d9cb41407a5408041b2153094921166d1c7198ae55f698cafb5bb1be8463c87bf0623e032f530ecf84e65019f8e08b7fa4ce3c2aed2ec260c007df7254e30fbde9be1f0798410db947fb6f124c8211c411c76212b814bfa555528a37247ad0c398f4df2afa9765f0dfb73146aaeb13bf03253964ca5026d02969b6225e0406f504714e7013f0d3cc9eadb3c3ee9f1ea04866efba18957538521f5ad25a73cf4916a2426d82f8f17131fed4a3bb25f79cf1bd6083111d05c895e4b54254088edc4132c9ca497de77b1e11361e259d9f8d1eec441e2c256eeb6cb74e6979b0820a5c90c0485724224f330c50d531705115b3de0795e30cb6c09b92c308bbfaf0f3478f0b00a38e40ecff94901d001617688a73df1ddbfacbbbb86481245151ef844747c9f2aeaea61205a5423a58f60459f50c6c1cfd490ffb0d0f23cf5219f05309db401a7e8f151a54e922c4e71dcd0cf5a8fd3b3812f16f5e2c30d0a11d4652698747cb55c07860da02165d77e225e07c65022b32eb8e0dc14d92c1854194eb6bc3a079af25888dc364493bd0813324838b83da1b409639687b5a7fb86b84e1c66eb20f52990a97ca98ebd7839ece4149e7bf554c493b03d82412b44c3969fcc1a665527434c009bff0e07d170cdf4ce8953c0f8be24d05e611603d42aae2975fa1b899764545c6214b102a2a7a33c19929a68e86413599f4e0dfcb662098b1040f42387c377037c494fff88972a110c2c2cb03bbe34003e2ef9fe7d004163ac6ec196f8dd2ec81fa2664b8ee29455fabbf2fcb916d57cc89b3a7bbad212a17cb29358bf6cdd2716a198ee89325be18d72a624876518163d8dec05bc98950e9c64df68a1cdc03792f53866aa04c9b14bb592344118b1b3eea30461b7e121c78d797553420fa080478a8cacbaff7c95937c741af822be11730445572056e13ae8f5b1d232f2c5ef2ae92844546263dc3268eca169437eea6e75c8e7d32105341e05d0ccabd0ccd37edf5aa498c3c34c842e5f5c42abd0a6f10e5bb03cc040af6d1daddf34817d71dce86b98d2ec6a29c58a5b5c8e5c585a4f6ccf0c9a16d02b1467693aba605291988e511e25026feca10ac227ccb31da5cc67f8947650320c7886477ceb53ced3accbe2d5f40de3ef32eb5690251821c3893ef210f34f125cb1cb8bf2a86a3e173869f93f612a638ea088a87d9d19575f4d60f45e171ff21b5299e03bf45946c912ba4003fb050d07b4d8c82cec7608642b802efb34e2b340718eb1cc5be8b6f419693d5e0d455805a6560549b45af3e0787c9d111268db25d1534a6e1bc2f39b2cce090fa43757f2efe227663d600db6e08d887bdf360e5ce5ec40cf6456c2d7388bc6dc39498ac3468c456b53fa7dd181ca03d1e03b4d441892622a4c5a290ed66cc96be459b7ed624e13f947b298df7eb6e2e1374b80cd0979bbe882c6c83cb3097a1658411e6dced13632e61016d0328955948a92c3081460c5c824e633f8e11d7d359240abe7db4ca13645de2da6174dde5e88431cca3b8158ab728df1a906cf8cdf5f1c1be378b01f12aebc29b0bcf1708c10d272fae9c6212464d71931585be1a54ef2988c12959174fae0b918e2ec99e984bf52f02da168663f9e99c9569af330ac431cff91084340165e79eb2010d45b455a9ef20710834136bc602e57621a29a1be1c3a7f24d0d3edc4bf01cc8aa2e4d707d97a55abc4c3381f163550d69e6e22d656d53873533756f06dc42d2175178a5e53f6e55eebca111e5de3e7b6e9a0b06d1acbd4449cc08d1436c62b2ca4fe8e54215bcf512e11bb38467b450c578a046d29770ee642895992b925fe92f4b296fd4cd24ae8cb18c610b0cbd163ed687c498d9a14b6ad56a98e4f441adf102535fc689a607d603568aa5c29e6b2b65a2982d63a812740358c40e24f2e9281a968f0f85eec1c4604e67907adb03dccea323fc04e26646102b19e99aa53c121a2fa5f706b8fee0cb597142964b3878511e16a63f7a77b97fa2b9e2441a3b0ac220c44a0cf49a32546db4fbcf1fe60e8d320ebb1fb577d18e33faf59da7a6921a279ffef8f40ea7138fe2d91b0fa5cbb53f68426a69a70370aab09e6f27c604316b47be3dec90de4d4342327d269d07f26dbd5548508a2dda3c7cb0d3689e96985b8ba8967d2080580d32d712500c72cd629be6d8f1dda741c3a1b733fdfa8b4a36e54af65955e2b9c756e69f6746435b7d86ff1db716d55425f7bf1317bee4068d7b8c5d20bf0d846c091283a162afc4b4e7dbe4c293c8f0589532a5834a26ad062365436e4b31e3df6da73e518a3628a66545a9d8ed592cab4c854413f29b44a96ec095d928a39aa4b6cc9c8067eb3c339aa0d03cb5e85f31b8bebf2e51b4b23308992eb9975cc193e60154a6675290f24c1bf771f0e77dcdd7a4b23edfdf041451d3c959d241d5c6c1da61c2eba5e3219e494c3b79d800c14e8d619273c5668000d74464d0c538147f4f96c35a329561900843926013a35bd0b1aabcd2fceae75d78df9665685dd00308d4f52a1ee7ccd04151e318be22a491a9e40e7cdadbb5734a51580c74aff4fcfb389209d72aebb8e5249874c34a1066592b9d1aa28276c046e948e8f4697d03b5efc8359a31ea2bb3c13e5a1ae218e7f123d8bb58f07ee049c5f542e023a02a2006cc5dfa583c67b248f166a61ce464ad529458dbf9627414f61ea623bbe944b3ce42058251891c34de1c1f935841f89c94f0d18e55514573b58585894c107e30ca8fcfc2db96b658a73865fd8a8100b316d6957d2527fa5eb31fa4de84440aa7d123d33655118b82e879208e21e65630e42d05b47907313878aa760faca617ad626ab6dbae3f924a5a84b6224daea37af488edaa50301702880dcba2b8516c90c7d3e20cb31de10fa0d9f01978c6c9f7a281cb1668cb9a3aece29c0083d114a5f83b1a408723b74d348d42eed54718d22a6a0a82753cf7dd54535d6e722e9cd9835ee91844d49835d60285d260e82e8e5f7d49cfd0cb9872bd2dd5280e3eadd1d9e4a501734c7d0b8d12f4a7a7caf767b36378358822a6394d42f082c4401875acbbb34d6cb49f6640b42c0c9b7b175f21c9205838baf584d8fc0e2ddb6c54fe1caee7da7c21c4d8828890ed36abaef32ffa9976810fd3b3e6faf398a1de4048a8cee480db4862cf1b4411bd2098a7559135c8ece659092a62fc2d4ca86615603c29f78c31ecbf672c00930716ce1a914f23806c00130a3532f7e7aa20882db19a93eeb501ef425e6e11aaec73262076bc50a693499f6422b8faeaf1451724051847d98684c3fd78fc11d761dc3ba8213d74a34b9a74c7b916c25e47b7f993a6cb784370f695abeb314a3f20018e72288ffff86abc862a1367bc37b754d467f4ae939538ddf9089d1814efe494a8aa4f3846d626c9fe2081195540efde2de1c260ab891ba07569d34bf557ea2fb0d91349889156cfa7bb014a9ea98c3be1e1933cbae7cc348c14814a40002b582d7a1ffc4fc727d86a8c75f7762ccaba2d621240a55128eb0e6ed816e02cc9906fefc9367db8b9df0c93d7b907e448862da33d4bc15b5083895d8d265b4fa8de7a64cdb6268aaa9614363e9b5bfbb79370cb295bb3e5e6930f95993a01a2e64f47336e4986650ba00d71a407a959c8766f5a13cc96b82ec9de19c66942c05ac03bb770c0f57329696571702dbd2d5c4572a4e04ad82ca7a06e2b52c7b127d0f251a32a029790ae6e339e97c40d32cc95b537fbed98afa94e10b552433b72c133d5498f98a08844e27187fb1a56355c14fb849e35f8bf2d67f69d2cae43d6009c8d4911797d00ed923c93fbb1c834cef894ed66e8d8faa9c475c78dd9394f308889718e393f3a1367a077e6997f41e561ac76921dcdcbc6b9afb786df07ee40bb9d2fe301330430697a7ce314d9030cdf3951bc18e70a117a35dff0ffedd5f51e76fb016671df0ed1629624cb4c5256e70c550a96c705ebbd4f59f1a6eded99c27f9da76e7b54a279a25a0824ecfcd00e0eb4ac5e792ae8186761c8f33ae265fd45e559f290100b7a5218684e912347d40b89f5395c4c85865466ac9bd336b6fb564bb94d40e11407d1e20fb98f545feef6f9211636689a7927632433efdb0673134dce10ec3d7594024d6e3aebf2be4c2e8e560ac187f54a3e92ba6dcb5c12132bf22d105927738e308be02600c3bca9016e12e87d05fe1d38a1c64ec4c43f822747a268b30a2da225be56d624135227c197e6d62e0edcbc48b60fdb5d719624d80a69ad1e8b7294c101edd4e8df8a80a27e1ab7e1b4a3a4b7579c3e8c12767139835e5ecb27b72621699e90af5241da10fed9a5ec333832449b1b45f51cd55e5cdc59b06abfd68245cce26a004c52952ed659493324fb44ab9a7128bb31ed8f04ae12738b030b676468c883badfdad1d380b3cf1abd5eccd03af61ea6b2b3237c83ad441c2c9a314dea8ce4ab8ae55e6304e799a0d9d733739fe1b25b2f7e302cd4309f8dc8c0aa7c309fef7552754d7e9818b07a5c6e963bb93dcf8508a333c1558332c2d6e9bd5e6aeb68b3c31ba57881da743ffcaa016c91dfe119b8ee442b751677789a5d5c10dcd5d3429756dae2a0fe402b20a3e797ef3e94100d0feaa297ff5d48528e87e51c044c4944773b07f44e90ef6dd28b98a16b6a3837a8a9b6d9a4d0f91b4fa347844eac53dd3bbf67e1451f0fc931e186bb77808e117b1fd746544267c0457ff74517fc626d51821f85f5c03d4c4c128e34cde91e78d5d1150566c8ddfa0710ce19b1d141bc7914ac4a610f5c5bd0b5419372e276c5c312a1793368e2a16bd64f95a0d5925249b480f71cceddd1aef05615a9e5254ed886222647af1652aa850a218143a0727e03c9e93d4bff22a10aca77690cb4eb77301a50444a58950a3ff19a2f70e7db140a120f426bf938c06d1107aa33522f4d32914cf6a5c72a4d51790bc2150f66c80a31fa63286ed13d404f5cb0b9e94bfc58987f3eb1ba535a2a3bc5a4e54d4fe30d6aa9fb429518c1619cab9fe9fe776d6b5403736522fd641708a4d77cebb14197fcdf27e35da487cc7d25b106401fbbf04199328614af726c2b447c367dd89bb0ab22f9b7a98e7875a6702a0678166291c59e4a6f02f5b60ff25f458371c14c673a0874e8fff49b30f8f2aa7b4f0b742acfe28eb8cdf0aafb12f4ff3da8df577bc410f59aff41d068b407430cad8a18e7ded31e463c7ed03e14d5dec20363518a3b1b80284137b95a3372cedf566aabab8089962442b4f426ea373fcc9f88adc45127deb497b379985a6823813c44e0dbea33120a2608fe8fd653286885541a38212c441e37cc88a0902e599318dbd55bee81d15354a00195578f6eab3c831d2d50cbb506c41da0324da0fb4d3fec7ace37da4e6665ae9002602619eced370148409dfeb9612fcaed134a7ad6e2e46d718b4d3c17a5c24b7ef9a16f5c5903d5797ae8efa40075692676f73981a7f1f8bfac47f0d35319b0030cc4d8a35dbb11040d0d81398afe0bd467d880532fe9cfbc24bf379d0c850ec5cced1db299bce6410459436cd22e9a4dcb944877d9602d0900e07347e031a3948ba0e444eadf7d6cf882f1456001b9e44546c885d5cc0ba5bd5003a96426b8a7f994113e9e24894172520313af52c6229124c9149a45f7a7335d266f73e6064c46226caef5a78bdc1cf03cc2b0fd8a8860a105437ef38ecade9195a20cbd38e7a1bbfd5e7e52b2dad28d69e9fe021e44bbaf92e1dd604761b7f2d62d8226938989378bde13171e248d9e71647498ea2760ba120d3c5f13a7cfbe9c052b35ede1b9ad44f08fc21e30ba56768c8e3aff977ed9116c8a125db80df2a9663c08b23d001a40c2465e7408998403c9e939a0754562d88b97cec988d253aff4e3aeaea89ff11db129b1b1f369f6ebf6ff2ad9a3b4477d4c221822af3627e1f4e1d004bb5656b31efc191a9daf6aa1384b9700acd4c43e5cc755b454102f62edbc4e6254593de182a5fbb00d2215b79b5c31437c4c2bbd75da0da7a9468007b7f7a06a2f63158d6d08a8301c378d56a582c307a83600a031e5527b525d981edeffce3112d4ff34a9d5e028ecdd2d56a6189368df16cb764837387df2de89c81b63119e4604a156013efe6bb16588508bb6688a624abdcea104fc5ddbe908b505132823b4d917b48806e292312f5dc2ec644beb8300bbe37285eb973d577bfea88aaa4079e5d146b9da4eedce7b17455f79f0314cde174a8bbffd81b46b060f7ca5dc91a0537cdeb73dd457cf0cdc87577e860aa04827796b3539a382589248d038bb979001c590e72d453bad80bc4dbcc5a1d51906c055a5b6eb6a05514fc91ff034dc0159732714d26cfc26262ea9b19ac1cdc1b660ca3cb264c2b01fb122f304d62858a71aa62748bf6abc27e5b99be2fc53001ea0c432bc5c05ebf4dd167e351e6b86080c40b3ca55b906b7d65a8683abc1da0449c5501b81006989deba3c7b0f8306cd70fc3439c61d6c867cb1918042692eef342e827593c8887db6301c449dfc155262c0334bd4d50f53d3796bf29d096d3b56e83708d7e0d3b5a42e613a7126c5e32194343d75d6cccf1347398ab82d2228d8d307dd14675f32310726ff0c5a87aac85b81a43b87de0a5376023cd4b62a1b350bd3f69136a72ee9819258f78e0144e2b7e4e51b80b8b3904ee9ddecb7d7df0f2bc0c0c47d17d30265dbc4752c42fc3862c64f8b40f1faaddcd146f9384f29e78190803ba4b2ef9dbd7468f2b2c126fecb66776206d2a9ebe5f211a076dadd16800ece87976fbf25e9629ce2e1ac67048da99a97e111fdae676beee3ea5545cc5c97c714f057b7467934cb9753a6ef18b87bc4cb80967725f00bf2cb9aff23f9988a8c3a2c2aad2a8933bb049bb7af774300dc246003775bd5f6fdf76d506a12cbc1e43c688935e54fd8fe33d7707688505ca06650c68a2e930271b1c3b06480c5da07f99f4c6296d0fee46e33c73425c6154b4518af5cbc1bfa3989e0458751b597bc2b8de6b54dcc2613003f2922ead1c6a8ea72aaf169985a37ea6707df1083f784b96a73d28fd75aae32f0845472cc941b2815d435c2c869d95b2090a92c08ba41fd30eab8b7750c01b8a9e1393412338985b0304cd7a8c0360984294109b49e4e4ac67143b8cbc6d68a014e746f34e2d6d1d4d7b5c6cf7ecdc5d71625790249cba58e409d1be013bb5cae5b7860133a6c33f73ce7ea95e8f5a6de207581a3095826c29eefd0928285f006b0e3060a0185028438c11a3f238bb6d7ed54e5b701c0581d811d79a223db5d5441b9a4402972ea821292c6b25136f5d6110fd53f58daf37b9346496aa4f74d22ba8724510aceb84105b6b8a4b43e6fe6423510489d809cd97652502c1a921232c9fe18ee4f92fe616071d1fbb1939304655715ace6c5076b4b1565c0ec94a53b7b4ea25c0de92272b459c2df6b57e692ed95f13074d71061772e1675dd8c5894d485931050e0aa5a17b955e27c9eff3b29cd8db3fa5f3866c5c3c22923e29c9f1f8bbc1cb8a5a5e22ef1258060f595995176adb82dde085c36c9a215d28e56ce88398cd6594c79fcecd16b8f53dadbe4e12e8e6e4a3d36783b49f8c5e09c399febdfdd4126340ffa3dceaf741e0e5d0d5d2b2d4800fe842e40340c05c5ce4327994609b2233e488747167f6338e38203e07cf4cdf96c077d1223f9b26fc7cce8ea535d6b6b71bcefcdff69aaf199919c751b14e26466c7cc1e82fc6fa71504a834e09b4058cafd706d9664d60f83d2371f59e20181d04e506db90ce2fe439af02d23f5f39f0ff04d7ada38f5948b1b2b3d9d2c1b692debdda4eab999ea4606aebf6b91f71f488638ea8771a2b1bb017fe4b19dad1e5935cc13292d434f1e93370e54a2ae976c2d15993d697439bcbcde8ee8bd2b4e5555bf005de4e1feb19127da1a0a9703dcf48d842ec68ef04f6c43d93ef895915021f3531aa30895824bf7c0481aefc72c14353a634faa6c8413086cd6fe09b0ce021a64c11b84822e76ef1fb422418ef1162202c2ca6af2b8bdb38920f88462f6145cba725d685c74d144a7fc2cd02bdb24d6d60f00a5e0e9d2b044a10603e74c3ba0ddbdfc6130465f9df2d34f77559f6327c83df66c0fcd42dfdb46a3e006adaa498200873f66cad5fa31b3007c5c76727172f4deaa18233926384533dccccc423a6aaa70189e2842ac8b64950998476b2694844e6b174570929ca1a5c365a1550cf1ed157738fafc21af92e3f3a03a929e08a5012fb370e2f404655787bed7ea30e2380e8f1d0b71cc19913ba5e7d0f0453a72afb0bde32b5cfea6469675dfb77bf9faeb40cbe3f2e28b47b89ddf21e8c716816ca46be7677c013961f8651aee3d72ce113bb5160e3e5acbe3799ff459058689d47fb05e12c682dd7f5366a808fc4f65fefea8e3f2ff3eb22091e04348b05c309f20aaeb7fcb59f19b0d87527f150fca393aa6c3d305de369393d0273fa706ef3189908958316a12e491e2b5041ad7d7c32db397e6c3df43b484bfb6bb051ff4bb6d7121d645f09ba184e92b4d26918c1016c10ed04e27eca526f4ec8135bec4a9820490007f8d9f369c6a3420f725a0029ed477e435f96625db192a6b91703d5d6138a3aa02f838d2b37a60ce072fe7a934fb547d6dcaf57ddf4f3999a860f6d848807857605ff299b678f88f97003a7131fc0d01ee15cffcfe53e9ce25bcc221406ebaf580320fe763113cfe9939e0fb1e086a9b597e3460ecff187c628d0af6ca1034c24e036224709a64a839db5f5396c0a31fa34823b06c05292df4f8f0998f9ed9199ee8c5b0117fb04c92afb5f15b2fdbc1845e55147d6dac1f361c0e93496231a573fb59f547652410a8a24197bd440f20812726a28af52c04118c8044dbd16a31424a07cd9a961076ae18fc104458c167a6e2c565204d31867e3a235e790eb6e8e21a9c59a1816f8e46cafa05a649da2350b65501f49db16f060823bf2d9d9964301e7b738199d26fe490015c498803074ce6999c522504a87fe044a7402849c05f7ab6d3009dba74319b5a8b7781992465788ea704b80ab17d1be5b3fcce1d0358397b7c29a9d04c2cdc07421867036cd7bea2be3d657bc6e255cb59b950b5c45102f11e666b40eeec10d5b8995ffa8186b9e0196cf2c60b45a3e309c822b26ea9a7302789427035b27345863486eaefe6ef9c4e924d3a1acb9bd4483d1287a683e322eec208543dfa1409fbdbc8774a0d8460b6ed7f878871b101a81ccb86014ed74207c38381148956ab280b4c8800345e508bbe5766850d8ccd8fac25043b6f160b32ba9864658087bb5ebe91633fbc1a24be926d55468279ce5b8f61909f4d41c94c662ebabeecc3397918d5c499e96abbb4274e060a850e565a60b7d4a5d8b3c9fd1c7d3297f6fd66b395ba5af14d08ff3b59123f6b32273f3d793266ff48dfa61d946e9eac279833ece966f7fe56b37649d1e831319413121722009b808c943f3670c8220cc3d3bc0ffaed0c0f695c2fef37e324e71a84eec7c85ad534cfc2d8351e18ef05e62c147c907e3dbae24b5472391d67ed74e072a5d49137d29ce2c119f72e699a7b9abd5d8467f2d7f728a79f14d383daf52ed3df04eee1ffcf147b1bbf000c664cc34ed6051a4f516c4610c3dbca4b16d1abee89cc3df119d462b3cabacc06bae403bd87a762e54760c354c566d5cbb9f7f96c9ef0df4a1a6c3b2222df7580a274987e19c7c3beac34cb78f0f74d38519527359185fdfbb404ffda9ae73e5dab54770bb98ddaead457dc915d42c63bbef8846e012b94073c677a0c77fe82a421fd6590930da6fd4894608a9ba1c069f9ca8d5116ad1a2d5c43245492009deb4b58288ae8a6b02399b603342df2f63a6d800338b0ff1ae08d3dfbc1d0ce27c132a917787d4e1e1ea3c0cc176a19822448f14428f0dba16b90ee119caa6fb49b4db1272158bc3b61b6f7ad0851e5cec834d873b4793506c978f14a9e23134781df27ee29dc4dd8e500e903065a6a464cf62c318446c11418c369d1bfed76a9e222958c2f0aec919cf3859bafbd9774ac5e4041445b78ed78b9bfbcc890f111fe16d64838ed8ed26a5f48f15848f14191db27a14fcf7c5ba1e0b7ce3b0eef97623517adc8c7060e3e5349ef5fd8f01c9b67f08f047f2f6c65df1945a3897963df7b913d4e2e7d7356b80bd91daa99916d108f8f650cd930600ebba836fea1948d94173e149cc0b785d60991d0e87bfb963f62db1be13a1dc4bf644c6cfc54ce0972e1171ba5704ca59146250c97785ddce0b558daa6d183ed8c9495c5d04494abe49a25b75ad46c103fc2353f1262c6d77dd60e8fcbee962c50adb6f89906c04b030ba35ada49daa2cd1cdd5cd21c61274bf2df4f36867cd11d60336009e6751dfb48ad50861df01cb320654bf8139f6c9e39c009381ef1adc4bc5b81682da2b8191d10739d4d5484f1defbb88f78ce7f7b46f62e54fbd9a3dbd3d0192c54a31eb8fd17696ca09800f18a614e0537d93eaa0c7a53933a073090751621e43a1ca122c94b2f5847be71a4f9941be93ad3835232d641c856f72e3dca72c1d51602910f4467f75adc57a31dc9004cca3fcda21a2af2bf5349b16ee3806ab037f0465a11d004f6c99e1cddc95db5f7ba6b7f3d6e4aa4740708e00e0d00382ed14e4f51f5cebb212c23ce201f2173c9f8b031d5db31b7a1cd708c43e01bd92511fd11d034ffcd513744e1ffbb377942775819fc030959198b57a5d7fee16f0274f7e5c9893ab569072a9c18622c7f2c2acf60633b8c4a84570f91e7286f3bf5fda1f9b1065b80344dbede8d5a24d11d1544a07f3650c7c18f131942af934c53350491e6f26ce8737ec016ef953fefcbebfebc3a556cf843b876140e146565084ae878befbe472e8f8067175f51b5efd597efa603432d4c6e8e29d38230ffbc40926c8a2458047671e2267ed0bc89ddd7a63da1229add817a64acd96ff64990f02d68d5354e446b51271bbabd2b254e855fdb6a9c0c8635692871c47f5178c7befbd154347c7690d678869401a6c3cfc483f28b3c81114d8934de87715dc539266c6807ec7f63dde32d424abfa2f9ee82f851287244def86a4766e872f27dedd418e9aa834cd53e586e85b7c9a7a3e16ae8878ccdc64849623c4fde6776a3824171267c4e67bd7005756ca1f2845989fafcdab757cf7414e38914a40fdc6aa0c244dd33c4724fc3aa28f865f2e0fc2a048bfc94790adccefa21e6a419d601b10089f0f494a72148a5790210c8f06d1fee7a95ce801c09708a26baeff11bfc45c26b51f0254d76fe20cc996b5da2cd4f4e32157a3d47db16d9ac714a0d209737ef52585fbdb0662b1a4b4a63282fbd8f3fdba4148f2fe5ebdb16e62f1e878425b420c3e03ade76e2ce9695824d78ee5630c164f7db4d304b778586aa33b689422f5b1c41f7a5cee47c385b3cf3e58911d8ad505fc524a433899073a0d4419a4604372a3dd7098d197c3c09ac197527b8301e2bc4fb8548b5cde97cc962176232d94f69e36b9217b995ea133fa0f67c8979e96a7440b3748b251f86357f24ccfe3db33e1c9e2b0276e01d3476202189c073af616b9a3a347bbcc0f1c6f953f04ec687e31fad7086eea64bf865a1c4ffdf1de51a197f8a74bddfaf8bd3f7a53d63976ee180390d6ba48dfaa31f36529b2653378a4922b7413fdd23f98c76c4315088fd04a363157cafc29502dec3de81103aabae9f260dd8c313699c7633f853a84d35452c20d8fd21a9ab6143c562408c070c027c1c38fcd685f96bc4cb30e56a905da90a3840790371dbd63827944f6cc78fee0ce5aebbc66a2a73c215dac06ad60733abcf8e6f088e977b47f23d0599a6eec263b5b407df5d5abd341061ee6f305bc85ee90af1dbe202d5fc11e77dfef01a4129bd0e17421d76737fad875266d7c89df0b2ebcb4f3d66cd834368a7cc7602b32726e321623288bcfd35ccd432c2dfb1d49b03bbc90084ab167a6c5e2b8c779b8230acd10125d658dba15366746a2118dbfddaceb028322037f34113d7844e683f57a8e985d2f2bc871b86fd6b614b4e114eff02b981243deb0ffaf38be98cf1ebe0501e0af04f503d0f52a8e94b52fb062eb5161d058e450c144cd860871fc5962a35d07cdb6962e63f9e0782166abc095da0d5b2c1918b026c1c7bfd9a285bd31b319b510a6acd83ae0993bf05434dbda2225484e1cea8345ad25d79ac9e2bc1f05317c3ecef40bba840a926f5f05588c0ed762b508e06815b2f87aa1783c8271253192a932120a8ba5f29ac4a99775a6fc520e918ee6662ec0b8c36f0ad35d3b58257a25efc215203c9ebdc6a8200838d784d4b3b77bd65968605399b791227546662137e00b421afea6558e5e4e6ff081436c3f81861c8612f02b097f96bb4301d4d9794519fa7be48d77dad560684ae74923c8f418f319590afc59f226b420ede6f8e9fa066786d333bb93768c7ad8f640ddf2469bbd469efaf896ff3e0cb7d83946ff68928c6afec60096b141bdd747e29d0c16739d56942fcfcf5e9ac35d39e24a40fa39273e38b4318c8a5fd000ad5d8268395029c23865d5089ff1500e6b7fec6110c7777c8c035cb81b0c683ecb6fde3152ec51645a933f6058d1b21f187297ab9556ac7458ef18b16419d1093c060ee5d012dc43b42329bffc8fd8d311452dd90c1608cd772277c9672d13e4c8ed2840130812132763e3a9cb22da41839de0a1c6bd191e4e5d10e3d7ea57b2951f32ba89562574807e17cc63cc043acf6ca5b9cadc40593dc348592219b9506fb0921cf2c275ad6d4ac28ca5ced3070fb921ec232710b0ab24dbc6ec599c44880762999fa6c0b231465edb898dd302029604c637a43b0450074ae61f1596446b463c913500f651d1ef9d42a7837a8483962c526b0094333642780c0932272a4f0dca5c4a3ca71d0f56b344d19ff52f48bc8b36a2c4b6c5db96595a68ebfa8b1b09adb1a5782ec28d3b348c2a1ba22cfb5bc9ab772485f5a9e6c5fc14d7f9e0b953689731124a6ad48799339e2cabb95708d758b8a036ab4a339fa351b940acbe6d7a111f826d9ee087ba0a953f38ca08593ad75562a043a4b8a2381c1e68dea8a2a6f312122ca53e916c8c9c3cd1ba054b824443f83224a0d554f977e32e61940f3607eb0f22b6bd3dbbcf2eb007110a055800deb57ca9440f2336a548d7b1557fb89e0fb10389e77c1802163c0071a024eefa22b95e1618f00eaf08d1d3fcacd28e9fc1f6843a65ee9901f4fd84fc3ebf9ea3a6da50a5bbdfaa65e7349d61879fee165fd521cb5aea671624b2cc2dc034f9c2671a8bcce5eb544368fe3f77a06ebd636d8d0a24e788a67ff9d6d93af066a5da956e07c97b607ccf2eec3617d0408a5765450c8f5828479d25eafc396a26f15599c7b109e47caa4afd9ab1e4f43a0d9c744dc2e60796b9b7ca3d1709b95e1d693678f374d448af88488fa4ee0fd8aaae5f44a4ed6a62f408580f9807fe22dbcd51373ba82e525a5f107b2f94aa6d923dde28ea54b814f8a48015402e354f9561cf2307b137dc8b88f42aedd720db7297814e726644e82c2d777a61efeef784d402475074c250c49648513f3e7108d27004432434786555e8050007dd539423508b59ed5f16a71789c673d0889a53b97f941f611a1e8f38372c566ff05c216efa73fe1169a37ed39157788618068c89031b49b2b1fa7d86f301e2fd53508d6eec3f31bee99b239768a5ebe8ca8b3970acbd50a2db97324351d237af1c44cfe585cc3132a423a0cf5e94d618ec458f4b231a369321686a0f22bfd8bd80a2da4acca863c1fb4a9cf06373cab37102a5a9707bde86df558e60741d742331fb73fbff036a11430b3591ee4ce6b59f2a5b2cb0c358d9687a93d9ce37292e474e7169900da65c6385deba2a2844cde208eff017e60078024356b6c31e4cd86badfcbd6f8acfd6ae2fd6a1e0440aae761919c64b832d71191ebbc31647fa0f780044cd3a51f1de83ceb0a60f633d342d142c3365aa05401a60c7ccbab65a7bfd6edaef60898aaae4b61c7734f946e1737c7ba77d2f6ae1b9a579f4f5b5929650044605a998625d0bfbcace05a1893b75f3aac879d65f50021233eb0eacc01b7f5cc2034e50f080fa80a3bf23513136e884b04969566c4626821a8d1378b7d1146e10e1f417e5fe75cebc35c561de1592a66497d9d81b6439cdd37f8a508ac1d1fcd6f199b5184d2dff6ad8e41f4c2d25b17750140e95696d5215d1c57cc8f686222298512eac15fa69ac1901692cff2692a40940ee52d5f8ffcc9b4d37ac68cd2e5ab8a84ca2cab453a655d05f4c66d764e5f90b5d6792545f154e664d35ecac89d82fd9ffb33fb4f50304523fb155bd8ebd9ca7150561aec59685885031319d18b551445baaed1cfad7d0967187922dffbededc37e9fe1cce66615ecc41b84ea93f4e1056460c77b4a04f1b3c4296dd76af425cf50ad8fec019f050f4f16529a77e4e2700930afe3a797fb9a786e778feef17cff8f49b9300936ba21b55f0b7cc39dfdc55467021f31ff4c00694d1d29f4942d1f3c261f0cc50ad7b109a690176a4eb2def7aae404466631e228af6f929fd6031fc331bdf15da70b1d91cd52bc5c56a71a9f7ccb26dae799da2d702651548478bfb5158c963b134d953d7d6a76627a70001b6392ba88a5a49ca0c29d224a32f05a52486f24c3cbc5df7f34126daf5c27ce0708f89f2baecbe7a0b58938de0515cf4deaebfb53fde41e5a1cebeece430a7c3c272728e1a91334c4d0e4d0cf4d617aa81305bfeb210a5d159185e8c6f79e8b30c76d7a54a743b7c5dccafd4f8f9516bde67f4f3bd0f818b21f447f929fffebd72cabb1dd30bf55a839891109d779fc80d20995cda5e528134e3aaee36d39d28cd28c8155f746f25f557b3c17f4defde4d3968f5d8ef4d1ef1eb7c5ed5fb34cd82156447528014f88148113061c9a310b7f14683bc3ac159ebce493219b7dcca1a6b001739cef1f5b78ecce8f201ffec7737a0dedeee1d5aadc4101ff75d033a696902d9b022c97d08840b82aa05c2038a6cb6110168ee540aaac9c5fb52463f3306ee373ce0e0930452d1bd86c4a7a783297ab28e8fef2c476a4ee3d4ddb8da6bb767eb2a0667401abbbf91d4c1cecc0c295c53431b40b75ae8d47fe6024c99c4a3c9ecefd51018875f313e019f74d7bb4b7d8d7218da2a33119c73a2ecd407e77dd3fc289e3a1423f649c0e682ca0fafe19670de0878bf87d189714b4e6572fb3805943541a67a0fdf383cc0df5aef434b13eff103cd3b3547cdf5e2b3738bdc43fcfa29564c31e5b9885c37c0c5d7c85682f33a84511f264dcb6b57ae47b256e32a72cf10a48d99d5f836a7b81973c29ac6e70a77968bac0015c0615fad59ccc4e8ceb739cc401285b84b7c5c63c7106f1d9c6468b59469085e43345b1183e17858c170bb21acc771e23f519c81df7175a69cb8ffdf1c69c1fd32c29d893ecf015d8d9a7f5941f675e6941b699a6f46e4fbdd6d53803a2d2f7ca6ca2167227127054975ebb4aa92086b5d4ca789cb1101065eb3747b3757edac6f94e6879535f7b0c45535b132cf5814c730ecb0acb3e5c18ac560d212bd6f32e7cd00009d395745c09dbcb5cbda656de9c366041ad82b894dc61a688d8c7ff3d2d310e16acaa439745369e4c1b23889f54f600701cf07d4aaa7e8a612a2dfb920c5a4e05ced114639323741480e4393f39493936b9f9981509aa524330cf475a9173e54a60e496f7705c589ff5f5be8bd7ee6ac658b42fb9173f0fe58f2735b7d82611b22b234fe7356ae5bd5e764b304be2c4de4d3e05596a2ea739d3de0b4dfa34628fcf8fa1a4ddf4355d9605641c2d0113787e8c34e260409e11334810ea97fe07a32fc31a9dc6633e47030fafcc036796c33dac25cad6e0fd7bece2aa374cd7b23064590d67ab4dd309641c2e9bc359bc35fda7b900865f825ac9d0e359e9151580528d67aeddbe3402f8815974fa9b7c98db3a94d09e1940732b28aaa107f2d660e3c21ae989e78745d04be367c0b3160a5cf3452bf931f8e7ba8a4d60f9c6ea517dad4f69016f6124cb24cc6879a1b3310798b7e9439ccbd320531bdc25fcf04b14d696632020e204321211c206fc39cb5390d4915a85e31c0293268040b50364c52f538c859820a993261df3093ba08859a146e4f8a12b920d0b2443c3ec40bfe890fbe8583d6ef6106153b4fcc76c1dc48b63304d298909756c27394b20c3ec13650404f1658d1b51c604604de0681431e7be27a5a670f7c400d475dc8ed9b16f7e0491bba11367b700e3c2592bd46785f3640d839d439572199662b49616afe6362df0861db7e921cda483db1dec271149f0a0b283a8e703c53cc8340d90301bbb9dfa599b9d99469cd310eb1a3f0e9aa4a9019fcd6e05dcdad812b8b1d46068f3f814dd587b145ccbf871c2195cc785316d515c5dc863f73082822d135e60bf03bf9851a3e3ba67f829d62723c8a7360d7082d0d279cced32b0b8a8ee31f685acf07f48cb775a0d4707cea3aaeed0a3b93cc15a4750d53a05e8bf58f39ef61c5418b0cd5c22539f10d5e2c8c8e53466e2c580145f805c206276c14b001bbe8dbd6e8a191f0077a86e24d975ebc28022b43a9ce40a415ddb032f6f2f0a4edfc0d324acc75709d6f1d5842c19a70cb3a3c3509f40678a557ceca5a41f0e04e0d691b770b35e1c66c2b152482a708fed0993c5d10f80878e01a3a2b98d592f2eb6112805299e0a12b3c7c56ae578d41cee41f786d2d01ca4dc2b8e5f53e6c8042af7b026fba152903596d3ea4c211b3833bcc002bd91846d95e4bf48d5ade352881bfa9957ed7d306e87cecb1163feaed83ce9c6abb41065f0e70b5122aab8d0aa7c125c9ab8896f7eb22c467a8bbf7d48f6395bc290a5e54c9f65498a7c40e57bf33111074edc045b6dbdc6a52d370834db2865ffcae31eda9bbc87a54d9290c0aa2c6694194a3ef5f9a1d3d353c6c4feed2df8187a089be855ed22a187c873830f45980b22b5b86c2ae87a34fe5fed1e69e99cc1a39c250d3d760f7e1ea6f91fd80e14f68e94822f04de53aa6f76b6ad64739cab207abe34f056a8cb7356151f6341a62bf0d5a4fed40ec41b6904b69fd4b4f66a51cd56f6881f2a404236650f319d6fda4849f60ba472b8f36682a7a14140d17f00de180136a0778092955ad9d733186b51bbf75ddb605559079eabc361228ff3fead1e78718782abd9575eea05057810f36751d3173da480185284bf70a9d1e078681f9e9b5d7ca27528574e72f68a5330f89c2a049eada54bf865247e1bf26435811b05930e4dcf154fea4f4b8d4adfd75576661e718acd546824e6c40149fe1add82a7a45759d422d37afa02b3b59ca17239a8b92eb5662a07e4fa65818dfb317a347998dd27e8925f438d54655e5aab18adf5a53c2352133df1500c0e8036c9312808f915a0ec74cb8c07c0508069cfe7ebe3191d51a112221911c8db6ede7b82078056daba17a2826ca7add6508b134234bab03cb60d70bbc5514c6147f7299192e31650b98c8d2c316f21ead07462c2a55b3d26e768aa2a12b80cea00d0b4123be7390057e28155c84f000195b56289669303e32ba0088025458421181d074bc5db84a8f4a02d25a43bb6064aaa2d64a7ce78203ee56f4d041fae16780c0f7313d255f82eddfb9d95ab321ce43828ced5199684d89c26af82805cddcc9b669268c10565ee9fcb303ea159797fd080cf04b62dcbd5adddd3a3cce1d6789b1e051a4e450911e2ae46e1aa87db200d4b41e219f385b242b207d405ac345f38a1344c4ce6bd35a5f2d3d5f027278ef79da270324906cff9f1af283680f7fcbc702e087a153a821eaa9a3424fe5062bc984f11c2e6cf52ac84d0d20b3e16a30d3c4b1b46615ef07c297ea06112da6dd2a3506705d397c90c3c0212ee5d1191caa3a7f16b9c98de953e5fea087f82ae28ac0ea3eadb1171724b84f9ee1c80f41670b65e7246efb713bb9bf4af884a7bb31d23f5aa5d8e8928d01697b0e7894ea417f2064bf721f2706ee33e8341bfe8634923e54a4f2602acfef25928d1d64bfe966744e72785aaf4bb696b7d101198e794a35823d5f4bf8feab50f25e4d7654a156b09e15dca41b5b772a54daf0e028463fdcf141a042f5e2893d46da06d80699a4ceef70ce177003c114766ac9e8ae3358aebf771ff5d053c1bb3bba0dc323d7b4543bb49ab6672bbefa8e30a568a04dd3aa274ec02fe0ec176d8102028453a42074a0e22c6c14c53e8b0b7208220f1c479ef30192de412d944829865e586bf084536e9626ac024ead4a9333a29fa36aa254d6c009da0a2004c223bedd4c8879e9399e3001e5706a354f1723b5f06206a25b00b43195a37bff53b9178757480f717a4b3964a7c823e8503952143dc5d0715e220434dd6259395f0d890fbd0d699ceeb54f80db8086c967b98e24c0f1f40ac4ab53fc712f9590d6ff9f9c4990b1e01e685efba17ea8b4b80df00d0d004c74036c32a7c04dbd8809504ba572387f4a9a58e0e5a9a409c2a071fc8cf990650c5c5045ee6ad466257e264bb33cfcd7406c899feafe8a4bebd50d60f6e50021289e6891453e523ab850a0d911b735aca034c56595bd7d3c42576cb165f277b96eb772488876daf32bc2f946f6003880e69da7a9e9325aac02d4f10228aa8cc658c8d799128d93aa259e5417be08070d4fd2260ba9fdc36267425f1c35b12ca7417b41550d2f0d79118f38facc33d121174709b20d7495ae724e383b0bd3fe66db01c80987afa9970f9a617ef577bde2e1db2a15b9835421c556c836ac1fd3b4e648ddbb2b86533bf7da5f80d33e5e61681701edd9fb546da39e9ebc1a925474bd26b6dd39f3a49e64d45d76f8f4f9bd783f7f8cc312d9bcc36d7b6bf54d44aaf7ebb76cbe3739cf292caaebbb00c89a66eef72827fad3c2ee0a1da92eed0b9c61278cde5fc2c0f89250c04fb70f9be41b18ef7ad9dd1b76fe07071b147f147b54671ae8a4df834c1e02d5397de40a368399d1df05122c30649bbd98d0c7c1a64e7d5aa858015cddb541117cc513e48cfe0e401082d2b6c6fa8e61e0598fedfb530d82d9367936b6abf4bd130bd7584d5f06963e2f33e3df889abf9ea1689078b622cb0cbdc0dfc6632e5a78e4abd40c6174f1357e5904084b25de960e151b992acf015dc62f445d65fae1224bc9700e888f168c4760165a3c5aa6d9d0264fe159a2d24e058f2e47bc02c0e88d9a7d2b1612d5d2266db266afe58bf7823a346cd4b17e842c23b9f34b8cdf598bba1ebb625183e772e4775420b6cfb355dd3f6078bea60fb7e71af873664bd92824062c49331cb5207ed840759f9f1fefec2d763a78e38a597a6a1a5e1aca9408c4dbd00383730f095a946d1a321c6b38fe6ca57de709e68ba816be4db78412a9f707345a0fd32ffbf28b56cea4710172f002c41d85f1c8e82f27167b6282c54688bd4926f58586b6884ae43b2703a5a940388e03abde2f2d9e62b46c6b67a1c513021e0a9d2d9ec42003b27ddc30c501882d3c6d52e79287f5171551b5a813e6cfeda321e951a8bcb358401f2f2db5d8a66daaeb12b24168ea5a8f8248f6b9da9cb13aa7e39ea78d14cf7ff6568de06169f12a74d10f6348d9cdf7be53bbd29dbcdd242a897cf1bdfe900e3bc5f2d35134170424ae84ba26023b9b1f20b8e47a9c08b093c24460b377ac0372cbfccf2d4be50a53a0bd7e33a717bb8c6a566134a52c199ff891067a36a1075012f21b09bc2b4fd1d720ea85a5f41126206cb499700e2fab914e880c170dd0c73c1e42113e1d706b6846d88f2238de896083660350f98849b7422270e5a9f45253c1440873b679e569c59629bf0b3b2e63dea9a0a853b28b69a44b2ad2db27007955a7817389f100c3c4e619a0a12b2c53b91cc20a2f2f8b36646dd2030627a4d0181c6455a40fa961e4203539e47425c58652527052008940163103781bb3f235498df47fc7661b341476ecfb91ae3ce799a7f685604271e0c25e5507e51b3003eb5c23fe0ad03b9aa38191ce990298d0364f8c4d1ab5d06fc1db7966c6d44cc7d5196005e2637eecb383f279e628c9f3ac6558cf83f870e769bdee337dde7b3d3b4ffed8872e6c1b701058a740ca6f54848d6135e8377a11dd4f1d1ad494d83e2710befa81277e202d790eb41042f0b0aee68f3961480354e7a7b2ca4969893220a41cffcfc1af492318efd0640d6c83967d8be0943e5926ba082e77cfb23b8377c0b9f493c45b3802bfbb94eefd6666d64dfbb3ec6ee1114c04a0af091faa4f0613a474326371402e73b3b7420650e832389418f6de15896ae2cbc888ff20bc9ddfe566bf609e31eb996d70dcc2fc751fcf9aba13e5a1a9a54f5f1ee3babd5bef403862824a7d94b41284086f0c03d40c46c1ce97f57f3230fe33ced7f62c818f0edfc28f416df200c5d6d6790e6d1da234059b25751505ffb08a9624a562a0f559668f29b4a103f6e0aa6c06a00df12082b5d53b381cd2d28266b5cfe6a6097db18f762ccc0fa9fb9e4dec959b4c837c764a28fa3327595516c15ea04098bd2ab3905a407378913c5aee8eda00774d857df624a270b50f3d31d891a2eecdd806d46dc810697a2979e3951049da2f8978c878dd58eef10342c6bfb35a745d1195724ac1af3b4df9f0c78870632912d55052c9f3a798513e66cd6d716af7b345af26a0c965c52e833bcd079172d26e50fe11a173f6d10bba28138292839014bb6c52dc02c2524cb91d8f7cc46ac5ab84f8d38a07458265ff2c2d360c402a4aaf3f6bb89c605d003add09447b15316deb33a68a538d2a1629fa4131c1b3017460bc5f4cda017dc6551a53ecc1e2be849ec1f0f673facd241d400232b6c3f0dca2e1a82488f9f94a62c97b7fa5ba70c7aacab5335ac1b62a2dce4b05f40480e57db6b4cea82e05786331c7fc61eced9ff27183cd0aa2f39311a2a659b84b74662ef09b3f8da802e543ce6b9150f642ebb51ab97153341a2421888c7ee059437c67d8b572f38fc9fb060bedeba995fb526642e24e6dc5fb137e182bc23b445a3e04c99afc67bcd30a9a7b54af3596d74d97e723b18262d7afeb0ab420f99cc483c39fea626f60992f9e3eb5d7030c73c1ef09e25060f808a5fe9b492e0127f0b67422f6367be1edc87f0ab02b12265ef0531dae1f9bcab2187403ca7cdd968bffa0dbe17556ea49ab7ceb33d26ac92175ef096e8166ce3f3d35541da82adeb981088f374037ac2ccd4a032caa9197b80d6b55ee4d154222160b75812fc4c23a34cd480ac4ab28e144b87065b9fbac496fd9574e56334b17b0e5e1b1885a9c860878ca859760066d659f5b8958bb5e353df1611515f57dba3f01231a08d067791c21f94979db058bb992c787edac9c3e4cf8a32bea02579024c93d51140bbcb9261c47ae0251f755d495c383723a945f661621ea6a8ed12d5f14d75be43141c7dc684948acbe598c93e7ae91a87e3aadb5f2f84593188424629afc1267bede6daf879807d35becee2ebe4e1e65f824de83acf365991dca07c8ea57a04a6578f6459cc87ff55c1f99e02ce9786640c6f12cb8161feffece1858c68122ed658d17300de39e4296df3924d3710017fbd49dcb44b1cc8f2dddca4ae1bcc7f5189824897fba7663183c92f277b4dc3bab177ca00ae607e4eb78fb7f121cbce5d6506cffed0aea70ba6a0ea69c4d1f234fa5c178784b2055966a35713fd13434800d98e4d072552b1a719a62a0bb772a91e132d93c688c16b7335cae5f8ae5d110e277e5611f91de3b5998b836d156dcb24f4197e823d75477e519586e4f03575c858c9417e94143416d24c52951957b1b2504648124af04c4f5effc40fb7c845c6f52d1a426f497ab16ab9fe90c255b63e2b2bbc1afeaff3f2b85a2bc05824b1e1bfb313d68f9e9c6b1e4f7ecd7b626f59099dc621dd29abbb0da3855d07c9aa26e1bf202e89eae0d71dbaabbf4731d08637cb516816fc6e76748d10dd646cc4bb4ea649143f5b79ad8dc241d36852abaa88e2a96a04a32354402850e29941854b263f8b00a2f8748759ec1be5673320ecf61a021dd4c2dbaf449c72b7c251537c4221b8478c61edcac17328ca2cef44a011bdaf2ac6b77947b21d97a9442e2fc4751f158d79304d3b4383eecd1327d008104323b3dba033fa0dfc2e3e983eb8f7f660d2bab4d40b9ac725e011a346127be3d5558b891b10db2552ab72fdca9528e032482853b0c90642e83fe75004b928bf4d1a1eb181c8487d14b9f6507b9340cfa1ea0927c300b63bec2d1aa2182a86adb67b35b2a74145c2d50c72a8c4b313654c0ff2535ac9a446f1be910eb98b60a8c674eeebc09966c013fd530b4286d850145d7eca486435294290ce98cf20ed959c050f1f624cf7259832ac30e19eedacb4aef3c7de8713bba1a77e6de8d9e9d70858bbc01b448b6c2c8151706cb8277cae006a38c32fa2ded7305f9ddfc9c9f03ba579bda11c6e4fa8d02605f0abf3bc846cfe2255c26bf90333149093325c7614305a0eeb2d39fc8db55c5926862bf558a55fb83b09c8ae15619a0076609bcf389740cea2cc481a6d56866e53d9385b2900a46d154102d3332db4db2412ef03e52ddb01ae04655cb453956138352a535e15b97417440b5b4a868c8055599f8d7f2335442242e673d8d2ea0da977c8a52847b5a9e23cfc4120f1835c5652117a2c6d92259df70f0289b6ee74c50620a522d21c43015fd9568caa2cadc9469bad978292c462200312a966976d428c24540abac757369733ab36ef2dee99e9b87cc70be8c3abc49602c2f3e2f908ce86f128809d4369fb579f45a289368012355234ed0fd7252fc74c53db6d8764c28234d21c6abb5be29f45fd8a7360b39801923627f2d2d619d0f6b03378088f6fb98d8d5f0412c5de5893b23e47d097d9bc97697db711dc55bc46540ac55bc53d10fc20c0cd100450b283efccddb0efe6260a94b979eb83b376d4013e8e759267792fbfe35cf9b64b24ff93ecedbc188bbca5a8bc0c0c3236167d3828a0cc332937c6bd35d888ad787b46a561e5f846bc7361a0fcad1ad836fe966e0b06b34944ae5477be107857c80838519d34ef079962d81be64a92a1f2dfc113b1c266de22df08924113794c0419f77db395404e64dfd2daa119a64b71355b4e3604333493347b2f286e1c15432b0f3371e50522e33bfe68933bd06bc75376530a6064b07c21fddb64a8e540d9fa497d2f557b9919373bcaeea6e18c391945ae939a2e87878d742b624626e581c5d194cac13842b20f5e73383afd1ec62262d42b0120d1837cfe18e95de520028b71732255d0bee48a9413956e96d2b93d344855d975da8c2135a69bc28e4dd5971c85a0faf33c510480893d39c7adb55db7173b060b74a887bafb8007cd59fffdc88983e418ebb891e1ca701ba45e5415d70ca604e3acaa21e02cb5977d0f340ca749fe1518ed5d4fb3b41daeede550f3aea7d087e39d27d88fc2fe79c649623391e1716b00996271eb6badcc9d69c5c350d26de27ab7e4be250023e0c0660fd307bcdaed40f4bb69432d16ed2482004ee03a7033deeeeaed0adf0219999f966074bcda64248858f7e87545a96822985d3eeeed2a5b5c8bc32292b7613d08c0893891d458f3966774f48c95a422e6b48348251c91367293352871ada7b7775baa76386f6394e586293759cc49670031d28de9c2d94337387a10d3a24750cff94c0f415196e8016fea69eea4a0d7f52c11ace0a6a48d48581268b15a1e4cfd0acfc299d110591b859e4eb73bbdd727e4a0880716a4804e48533a39980cd97d7d00738b72e97dfd4ff98086df70f86f293837c414c414e41504155415abd452a33333333b30d1f1b3b1b3c1b3dca43bac51205ccccec73f241f9aa7c5a3e2fba126b92749504465bcc58d9dddddf93d8124a0183f50756936ea18801a9e245f7fffe3987d966885293ed8df16eb71b4d0b183b39242ada552ebbc3a7e0b2687242485088cf06ab4629a84350582ad66c44beb05bc782b7dbeda6850a8d8536a2de13580d450c52fe3f47fd873f87b321ffff2beabfbdfde5b0056ece1de6b0c94790478f200f6e405c98664689c38698498261815c408659933d2858aad2ddfdf4f4f444323333ef0f1bb514233e46764678467a94527a5efeb182024ad5ae8a57d5ab1aa23f7224d8cfa450882de14f95029aa14a2fb69736fd326dfa6343a5e4154e6c09af70f84a47b3e9e8f4304991034b49e7830c180e4ae979f985ec79f33258e5725230b125bcd520b8a553149a99999b082ac7cccba35246d284e409891412a00d49b0acb0d3810d204370469010c201cb85e2889080514acfcb375828a594d2285d944fd42e8a17d5ebee37a59452fa9fd2ff4cb8d59055925593d5d3fbfd9f97cf4e3d34ba2355d552692d95d752856d91975d4ae9df74e9fea74bf7ff7f4ae94f9952eaa453295d4a6996d066f9b29868594e364a29fd7fa71894c9c01fb125040231508806f4d9280e0311355234bdf84dc1c4fc92dcf6ed6309cb3233f3111db125ec41f1538f0075c7ec54eeeea6cc4c97521f5d95967363210341b1407eb60201ea8db90a825402a906570f170a5329f5a994524a29fdcfcb3537253b4aa05a5465093d600b03f5016c662692135b421d5a89f4d874382cb1c1539231358461c30af2820f5108271c6667da31e76c481c4f3d2068cdc663c783474b31d33a7a1f300e1fa19a9dbc63a764539b7a413654a626285de5d1e3557748c1e06a361d40594b6853f7b1ddcd0195a38a26e203cd6e0fa9d71e405ac92b302ca02c39031a006d14252fa5b0a597a5dc92ceece4e9921f01581b5a36bc6c84dd78b9915bd245e1351b928ed81222f530120a1ad28fadc45118878243604437221c110e090926ad66a35145438b86178db0a0170a64ebc9423eb125647282da40a8aa697f31d5eeeeeefe41fdaa7e5a3faf5f5885f24b6aa7634bc10d96c036c071b335dd6eb79a25265842245f4f6560577577dff858206d4b96a2986279efeefa90cccccccccccb3f128a1d2cf43d29980e3fd734dda8a78a6798997b7b459e6156c0ef080a105c59405972c625c4b2729cd949caa29b56bbbbbb97e4441d1ac9559b4bb7a2d2d5c485a3a524e9fe082a285fc1ddeaeeee5e92d4dddddddbdddd7d987f764c7777f7a9482537119a06a574f464254f74cb883c7f0dc95a425ae393b982dbff6bb6244d2f66a3970f3333f3aa98415d7777b78fac0bf7eefebb7b8754b2ebeeeeeeedeeee8671fecd39d893b5844c6eddccccfdff7fb3d1166ecfcc5ebddd9bab6cf40506c3025543322947749c4149066597a147cd0c98210a47660d65b89aa160b296903374d1f4d62d43d80cd76c3e624bb8e3c1d84cc67ad299f119b1e1044c06467a31195c0573190081321920993193c111608c08c44ec913ae76a7d2bdbb5b04bcd52e495c7777773333777777777fff10b86663f25a9ad0748b947ab73311eec776352c12216cc7ccccdcfdbfff16db2a65f4a96191915ccc470308b5df36ddad80da32926af7ffeeeeeefedfddddddff7bb3b25a0cde6e370f3d99f66a58e4c4545f6eaf76333377779f9999f91d1656f9b2f24551baca33b30a4550c0a7580d4f171d81aa2f77811cc286b10849a732586fd3744020c24643efe6c7c98bb89395244385b213f0630165b6e4d38c26d9913a2895853656821b6d6808355944da055dba6f9ccaa7472d26012eada19452da54e9ff91524ae91009242a9dcccc2c4347e5f3f720fc7f97cfa58b69bbf6ff1fea29a5340781181aba273f5aece8a0e3a428cb47293d5dba43614a4eb928b84361e62438594bc8cccccc15800044b3bb1b34d7025bca8d41203293ab294ae612f43922ba6cf15c90f8348971e1bac958954ceaaccce776bb8188a15269d9eece9a6a780475ab2fc96daa9377bbdd4ec474d16a365d0d8f4610a6cb52f2e61d9b6eb79b0b1c066e2a026b78e4e4550ffcffffff3fc5553f6b7eaa10253a8051448415f44561a82176b8a1a3f7fffff7f6b6ce1b27533bf235f5ae4c89a8e0c802caacc9ac152a9bcdb26e249d1a42fbffdf76a4a9fbffafe406160edaffac21594bf8ffff77f7fffffe875f49fdd408f5475419ea77f75fdede3dc21aaabbbbbb7bc4a77129327a6435715652d653650a3c0cd5a09caa8939c7cdac6633f204d54103ac1e974dcd56641744028d95140e27551442125c10a743d5d3891d20af97a34111a9250d8ce88670d0e00aa775b31a58e1fc47424e7034a8c2e92495cca23ba9c3a1af0bac724936f54eacc8ee870129889508394f53bdfd42a2a958b39500dcef50d64742d8d479a08b094c929d0721202207ad0f22345050a4c5d32bf26eb75b07a21710465d0d7d604dba3aea2a7469e0e9509aaa5a82f375747362814411a26d737777596b5e0d30f0e6b220994892b2d16a345acd56b3854cabd14a3a8260799574815b991f05a861910caf52a470355c80c88b1424601809e1133fccb868a961d1cc4b4de98de2910c913a2b71005e4da142400d8b6684545a902bc82af0026a58440353596a48c4d54413634b28a7e491daee4c4658e5925cda7d0e4f6a2b01f509d1754e0e4bed48a7eede767777f7ffeeeee248f9641fcf57b9ec6666669eb1fc5efe6f6ff7ffffdfddffff9f834265a58653ddb27b777777f7ffeeee6e4e0c145acd16c4fbff7f7bbbdf6759aa72ea5b4aaa2ffbff775798d8dd7f55527e80b5282c1a8a53d5ffdde69dd56cbe13bdfab29b6714c1ccfc6f6f7f85b090be18ba7e3f67882eadd992c2fa394bb36ddf53d237c3e49a6de8677bb73fd93744ab72d9cdccccdcdfce01d2f735052b97dddd2e785c01acbb20d0e9f302dc16bb0010f184c565951b4183cbea76242cef4e2adb5ddf08a0eaeeeeeeeebe777777f7dbcbccecfbd01bc17c458c7ce0f3fdf0f0efee773fdbd864204cccccccdfeeeddede870876c02905656655a282a613a42ccaa258b058c019c939cc4da652f02af7f62e5b71a049d0fbffffddfdffffbbfb6f9fd58659ed8a27e24b1622ab2746ca4eeb90827a13b2274c2e6b39310cc0a90edb57a12ca40517b492989999b7babbbbbb6fddddddfdbfbbbbfb7ff78dd468595240682abdffffdfbd23709c2505d8b4bd32d9c89311a93e8e36cbeab99085c24477f7c9b09bff779fd66ccdccccbeadb0ca38ae9e7c554317b6a42663dd9899999999f9888e999979db6744027c77ffff4f4e2c5effefeeeebeec82955437bfe6ff514401bd4568b166bb7064684f15bba085f393efbf7f013892f04511f1c8815f6f861ec7dc45bc63aad9e009985fa8ea8dd8305e254d11662e50dd6a2e14e915c9e580497825a774cd6893bc2fdb28a54180624b18cc2008d80d87a3cbe0c987fc106566662babcaffffa5913152f8f1944413b432810a299cfedf7d1a26092458eaa9ffff5fe834532a35a31b38a609d22618c1d0f9bc459e1b4b68c4412ac6fb99991fdc2d8f881526726a2b2dc254b0d08c480075e31c66e6b673bd94ab18e1e02dd2acbbbb8d3c40f56166ae3bd7834f51babb444fed6e212cb39acd839fdece69d19393a36edd44b9afd929a54631bc2a97ddfdd84c86493b9ccc14dcd80cccd988c58e99993997f20dca7577f7aefb7ff7414c780f1dff3c1a41dd2aaa0684396b36a32a1ed877c66c6ad42425f5ffefedf76b6a6c3333b311915ce572976d7e761b9446f8e0a104c385792a1bb955361253b9fbcd0ca3d737e35827e96a97ab2399bf3fa30499bf3f93cbcbffff4b9acc39e9d87c9b2f5c9ddf2f3015319c3a1e448d8022894b841b542eb357e764a2ab73bb9a7c8e734e9a396daa56d06870314307e83243a8737abdd40a6585ad16657941925b0b9e1858131914403844f990f10b31644eee13234f9e73768980c636eceefe7356981fbb7abcbbe5055d43ec627eb93e74a060ee72e5c4d89ab99658260586e9694bd261021a6d2ca70421ad36a786b18ee338d7b665951b97eb6702170d1c96a0099b151039da978a19952f9e4cca922a1e94e0cbce6cab2b87e4d27043b9a0767aeba98667dcec07997f258118791c26d187d1825f50884edc7277c30d35f3d79543fb7d519501c891c968e31e66a79605de58af8e6c4159e182f282727451c7b1e4711c4b0e2ad449019176cc389e4fd4711cc7ff349903ca1063592bcb2d2f50a9615109609583d2c28f29a3a94971040c38655502840bbc5e7e4f9a605501016d7500242364333485b523881863099090214739493654220c1e5386a147013d00a8e1afc7a2a7a35dd6837f9a25bb864741286823e198323a9b479f8e19b71d890e2e6254bcf8fd7475471d2d6916d4260822b7221fa41076b24af0909e7c2caa210590c300a914187ebcba5a78f800490be9e82266bc18e1064fd808a65c5614415da41d4833b84b90cd24f69474c7c9e467c7711c6bab61ce12a66d4e2631ea9c73ce716e0d7f5f5d95ac1cd04a9e262815613ac0c10271a30adb4df55cc86296745c42381f247e6a7cfc7889da91834586af164d642f89e238d630330fef2b628006d110214274481f3ce0e91a660a1f8804d59031c4838f0bb3a8cc3c272aefc739abe18f676607d93fb4b00c97ec8ad106d311e91c6bb9dd981b75c78bcb7f8e8bb7e4a70207e84493cbee627ccc1d09ebd183068387264e2bc056ac540e4a0b2566e8a487162e86d694541251858e6c312693fdc4f71ce7389b39ecee6aa83b97f7cb44a92e870fc428da0a3269827ae1b229ea26a9fb7182ca416981c7121972566677771ba586483f8a4a0872a40334e5740385a881de910a191f2377d7869967a22aef8ee38e3bbe20cde050a1218341f32b35449aa151536a8834f3b332fea4faff67514fffff25d8a84729e1c54e50c3a212723e64043e52662e5d8fe36be388d30004885216538ba221279e7c6f5a16ce947d6f4e7691365a501b63c690b97304b0ea818387c6a7d44134f1642f520b649634065b4f6616ca0bb6b678cc9031abe53387397bacec4c4f04192b92818de9c083ad9b1a1ba8119666c4123437343cb7d9dda5117144f34243f637c3eeee96b6c9352322adf0d50935445af1c28b66930b16b1ca01da21fa78b071d361664948c40891c4f26154866e4a7c78b2b50564c44efd88e1391c1cbbbce386302b57424505ae9a7a828a30e1c14214812346c6721b62eceeee4e3018628f0730666885e4b70426078c278718c2086c06ed912261ca868b1c582e13449d6506462923b099ca5243232660321f7320811a863eb10ccb06c842143104b4951afe6a5cd5ade1af28890766109bdbdd1d31541769048b5aab2151f0761996016a48e4244495d4a8d4ab37d98806a0802000b31a04000140612008a2b085f00414000c22966c98fc645022934b033128181204411084500803300cc4600c436118cc6229e201209012e103858cb1fd08b6cd0efeb97e9b0d603f37f54d3122cb57897b69c404f3e4a507bfbd5dd93da5e41ebb0e56df465090047fcb1809deef47427c6bd7378432f87c3038bc321bc5e4ad2728a3e88b1e27a085a533466fe04416ae6497826ad727c261d6da27a3fa9cbaa7d779c5356cb22ab5e98947cecbbe97e9dffe0cc83f0d5017edd7788ec90494cd0df342b99952c18d9e777b2de2c5df649443e96cb940aade06ca3df10f3ebd714e2d4b690d69ffe0b0dfcdc2bba7e91cfa413135da9b9d2ee7ad48de6b7517b415aa7f1ccd07e7e90f1240feda68f2391f4c387a498a15ed1339d7ebd7f382fb12b0d22e1d2adf725a44fe1bb45ac8aad28711893ab7bab0e18be706be18f0bca0e4483b6a65040bdf6dc16b1df209ce2fbfac3447021dc2cae385371ffa032e32ff10f3ea37fdd182ab895a9eeef00f27bc5a3b36c2485044fd25b340fa6453b4099b79cf6324f822b9d98b2852df279f259f4df653edf941af49af378b2a4a4ac964815ee83202e8ac0cf41a63fe19d6792f5433c349078cb79418c0044d5cc5ac0ed92143f07dc1036e82753234206737ebcd1d446958c394d42ab47ed60d0eb808f6d98587c96cbbde7810a13163487015da1e5f0039c8fb095f3fe5542703cd48d2cc753a8206fa0f94d9646d87af86b24f95f5a5803ed6e88d8f010660d9cdfb5e90444b731dedbf261436d9cd966d1d9c14e3e5367ced671f77465c8534ebe662848996498497050106121e887a3518a47fb709418b1c4836e50e34bdf73cc9a0a36bcb10360236b1be086c8962d16f958e160c63b33a760e2d1e2b2193abc311fb070cd4caf86d1b357f0bb5811f7c9259c2022101a9c9308c2cf6b5a551cad75ada0f0326a21974f07e382e4cbcbf80313e612c7da421b2320297023e5a5ab940d36aa90dc070cf83ea20b1ae4250a3c386b460f4a8158d2510f7a882a58f197bf6404a04f7a1f0c1e838e08b96da5948c11e392850e8809f9948facf63ffcf5e25681dacff6f554c4e7aff26d8f46a4ef81cb5fc81fd198da40a5a65020134ee2296f251cbcc164b70880c9150825f441e6c995eef3b06ea1572bd06d156132ce83e1151c53d8feee791692e59e70f9d0f9cc8fd377f899d82bcee2e8bf84522e92561803a7877078262e9d96b950de2c68adb5f137e1c555fa6c9f94c8496ef4ec72dd59f5aeff0410ea467779ef64b314297eecc086cb42170079ba0497b9f92dbd604889006a8756c2fef108b71745b3e4548bf05b81d821ad0b05687203720f495771c27e8b47e667f84119b06fbef8d146db4f1d9f9d5ccf8c5c8d3a1d12c1f9cd41b2f4d4e5f06eab959fddf3daba026635741206f359b94b2a0c20d237e2582f3c8765fb3b03eb1b36492de6b35b873e6c60f390e44910068946a99b0dcd143981d55ed68ce9055f215d039817d26f358ee8f9c4e0866627a0b4e0acff70fd3ac5218df859268fcac65d20d0fc8f5d9ebac54103790368fc8ca5f1da49fa610d30d11bb43784ca45cc729ea44c9a10da2e373237f591fd41ea8d0b7574830e97aaf457a53b2d22bf7b2953da19d21ba9ded5eb8276e4cf382ecdf233a45066c9d5a2777a13c64369a38a05e8ef23fc5fc08a2e0bd6a056e5260f2d53413a4022833176ce185ed0e7a4bafdbe290f6d9a0ea092c747956aade8b60f52176f7a3106d3503adf36afe72c2667261b13741cdd172fe636249b6fc2ef11191d3b4f304b2c3883df3ec4012459a65c20a741267e0e574e05d7a74194b263a20e529e8530be4def29115306495826a61584b3a74ab74a01e229ca65b5f41141aca4928be15ddd670af4aa04e50b61581ff352ad3c50f034ab7619213439ca36c9102f920a2c7a07bba5f8a3d88dec39a070fa2f5d7a6c6db0f3aba7b177d97ff84c495b3f1f703baf1ab40c3bf4b4490a12bbb586f5c8a18d9c4d89053d60c9641bf84252466645c9e0277f9342e402e37251aec670f33ba85960b25294f6eae2cff24a2d9c36562a4c35be52f1fc8132a01b2bf88d31730479c85e2680dc353e46b7f538568d68918c72dcee244f21fd80d58ffa46648014f2ee2402735328e8dc031cff277e806a23cbcc56e3ad5640fe25e4401f01bbb09e722cb58fa6ba03708981545b71301f83c7550404853193f9a1c1561d7c4e65ba16bca415522032c97475d7313883f7ce91b103ca66a2585fea2b81aecbb4b804483550b25ae9fa7cdf29ff57261d98d06b975d36af61f04a5bb4f82e47eae613860e3f886a7a300dc68c61d8ccdfb95af2679b49549c9a3b48cf1730d4c60e4e8c43e22282da7f807e926e629bdc52ae378aa097fdc90871ac62fc79e2ded130f44d5fedd24cb10bf53acae5a837402f3e31d8b289c29d1088d633255ccac919d582c482cb8109d427c479482f79520d878f610f4207c334fb6de433887f8466f498ea243d4218371e9d83a2c9de60338188038953be34812c8510b70fe804eb97c6c6389510091cdef08073e7cbf2b566261445505cdb476304a013f15088e9bc206d3987a20c0227cfbbe9ec0e4a5d829e9e7b602c5807b76a587655845a871421aba2129108310b42f434cd19fe1f789338888ac89cabac81627d61d780023b68c95adc0eb10157d2f44f6663fc0ec97a4f072cb17f3eb13d906de83b2b94258949e94c353891c471df7085c0f1b29235736b6e9f9c8debdcf0e0070e0c521871d09e3e6156b4607cb09a8decb6da720a8fb88a8961d210bc8deeed8aa08e78f58e076a5e7f2ab715560a20b6c4375700fa54727dd4f9d2364c133a861cab66915e2a865cec8fa16fc5a9b72b1f29a70551bc17723081783c449e6e0b15ea3ee81f815d69b9e8a05af54ae094aae1512ab7984b49d9bfe6e5d6c34ef7a399845fd24b19eed17858f3b2693ca93e05969fb29e9e765cbbc7a3634b7115d04dd931c855fb4b5135af591991e81197ccbef8a52c2a740e2f122e03b2e729948cca181c32c9d92d570b2204db033f043e47e9eaf278260e0be3f66788aa7d14180d7789375156941e97f982c967030bcca78044f8ee8ad763d0c4b94e5fb030a2578e86a8fc4a49e17c3e961b1672f27a45fd21d85269085e99da22e85869a2a626b5caa948b8c1af88008056b2c3d5a10d1f58910704053ce832f4aa83d286a45773fe7a878f22f878bfd3bb74bf621fae55d1530376f4db46ea41850ed777875bb238a70d5ceb99328db8cca71911af95d66d68a8e76c6a339092cf149b7648741ee817e2c0200a922831d3afebc070ef6cd104144bc1f35ae6c6cec42d951a3568b7630a6026c19b42bcb51887044d11371f89c16062b055ec7d883f8ddd16286169b41ff94ac67ff20baeadddd7006b2536633e879bd4ddb61920bb34aa096ac64a1f110d35fe000b458dc8c6a215d2d008f4d09f13bebf90b803c8e36f6f993e7e714b5862891ad769e5569c978837d3c1dee839ecabc77c3ef272e204efa3ed3cb6b6edadf654976dd0efba1e12e5c4c3d589232cd54bd41c1fb4e61bc8d391307d03ab8d82e259c4d52393ebcf6f6c6af5cb2797cf81fa676580b80712bb7d68d2b8d386c3ae9ff8e7b4e0139ac97e4eb7b60dc46d1fe6c86b0cc85171f7277a50ba28747bea0aad187e0f6acdd7cb9da5bd435b3ad115c7761eef2bb5ac11aa9e8e960df4859e1b81e8a1f9b6b25b4f9ad7530db1e755f0220636d11d8ecd9d9883623362f5d05e1e4b90d5b8d05c371d00c5e765052229522b34ef5557776b1b46ef87a16138d09196fac33cbaa7706e551b56656f5540ddd629fe74057c142cc7ba2b0b4cb882eda8eeece3e548e33ca0da33d61041def4def41fb25d351c530dc82391bc1eca6aaf5e156d16629f49b00866cadaeef0389197ba23cb30a2b044f91476715c3544d197c6590f8a1804b629fe0da152182fe19d5f9ffa6f431e9b48e897412a156617c42c59c945fa1f57808a7bc77adcadc34123ec86b5c04ddae89c35ea8b849a95207b559dcc81f08c61fde0e8495905c40c51ce90cd21d99619b71241c60fa0286c3d2b3dd2109d590c48a5b8ab7a00cb43bb8f3bdda3886be994bbc076381132cd55b0ce0a8626bb934b6c7f974b8208f9595f58833569adfaf2c8debee7e44291c410e76f271545373b6695c90482fa75b5e01a5c4e13524b2dee2d95816d3f75ebf8e8784c0e6e0ac061e68839163c5a0d7622ecb0c4ed1cd2597c8be6b6c91d6139351052ef923068af81165789a665aa3af7ff9a9a6524b8d26413cc7f0b766f696cdd68a2ce2bb4dbf6b5726de72aba0e879a2b5526199647bd985ca0904ca534cbfc8c9dbcbfae4b30b778de345a9504585f9c19ae48f20003dfe58a68b3e49354be97b9515a783b17dd2eb6defca7cd515974b43a5cdee659eb439f77f2de044ce73966b3c7cb8b61699ef1bae965ae1a9ad5d436d1b47c4ea2990ee5d8ba283813ab2cad9b50e8936eb67615e45efaa8161185b79e489101d6c6f5b1d2c92d9754a63c9de52b9bf43273d7ad190b183599450aa2164f8f4205e38d1a09de630118b28efbcc2f4e2547e3cb6d94c2a1557078f516562bc670d4bb1b5cad2761e62303d2d9117751222b62a1ca82cd3d06c6e1c0ca7718d8adf6f53e5a2c6a6f148303475c6052c0a26a17a9d2910d601891ea56a93e967407042a69f5f03abcf4a2cb79431563b6057079d7b29b677b6957c5c79d79e1126b2f726ea68a4d3345680d91804178bb8e834584514b806fb865a8a994cf6b93f958a314f282de2b950eb17780a8ec7d07a58e6b3968e0d709c5091e45d8663c66879dd23b51b52aae9ce1b4dfd9a8825c021b1d7807c69fae88b281dd47877a4aab1f1d283d8ccc488a43978140fffc9ac4edec39e0fabae55edf9ba9fd81fae302d51f5af8a2897b599bd70332ca045d21d477a5d4e8ef7cfc591a9a153feb99b29bde662eb93d94ef5c08b5f7b8495daaec269bd147b465d00562c9e82b4403b628c509a7ca52b9eaaef67009f4b9a87c468ec32a80f4c8b97a18adedb91b942878ec7317f0c624c1e615d5b4b5e7595b72aa94b8748f86190633f75483ecf76a2a9663ffac21784ce93229d9585099837518c34f83063d5deff76db698383e8b9ab5a34cc7148e1eefb96e9784445084f116ec2626a5ee61a5aa796e042463b68b3c90c7eae423bbd53046365a670df9a0159976c1ab78f5af23903e357726292a1321ce073e1d2f5898a4d3cdee74415b8148afc4b4563327db8ae2d036b372bde9f22168df85324e527994d4ae9831a58394ffe4ce9eac20ff2234981f70e88c52fbf983e4b1ad0249ab91f74308515c8b0dd702ba597f575c941c672fd37df8af20701217ade2f7059bbb516f0f0cc2deb0802438f2c37cd0b8fb7b0c42b26548622937a114b9a7bf5c0520edcb226104399ff0390cc1f0976a60e29fbdfaea0acbd902c27f4e0e41c488cafd86c94c1bd53100aeb484bd9cdef586271f504fc374119556807779d4cb6184d4b49bc44dc311f66e9f5dab25dccdc77d439d24720e0ba79b4f79271f96a7aca26a128814fafdeb1d4b596495951590c0fdd991360f42d0c19575c845ec85fa5135e8725e681ba51f5c61354d064cbac28d89e832d10bcd5f774e61a8319ecdc25261ed361c1970a77b44da3c1a4703bee34bcf5b4285d20ce8f298f397b37fdbbf788dc55dd019c68ee5aca9eeb68030115cd33c924239a2e6a315a80a0a0832a04f4bc5285e6134716d64722f43dd17d41a0deada44bbeec831e48be944307eb2f3ebc6478f687549ed24b0dbb8e41ef5339ac449df86ac61decea30b9f09704eccec95a9b44dc28c47033f18dcf8bf422b165de1127801e0e5c3c917b49de49e5bf2380ba9c0eb1fad7fccb811f576137a9ef7c78b8076e419ce183f0cf526558e6e7157be05f1839fa88a7e0c468e3de98af0daf0512253d161b3369d688461f8370d1534ba5f8ef8b0c9c92a0e5a7380ecd99df8de75c4c70060ac93874f511791bbad43ca5e7086f2d44372e541469390399e32248c7832d3b83e14ae1edf986886859629be06fd6a487d81204b6842b37216751850f5c05ec65cee194a1a10748bfd0e69abc0990f8c30f6d47db3d14542f54f1449dfdde5fd99c0e95dd966a9b4fcf2742f8aeead5039ea1208537aadbbd72722b83b0f120e4d9b019646d4b4b41191ab3b1c1ed8ac6758c976624a0da36163425c19304e6b7b773217baeb05c66ac963669a9526c9eb67dc3031fc52258a83504160ceba48c0b0e68ff58eafe13a471631d65a52de5766f415419507ba9f9897a0516c33b00f78de58c35ea195fa0ef602ca8206338ebe3c34f63c3e2ae53165aead7f8b26bbff537a6516f25c76a665b7c49983c60a986a0e3b3c3e534ac6204f92d2a990910a332898ae58fa88c7bf3be346b24f4a701a6f424ab80153f13eace4e0c6a365492a2fc1353ce06ccd09eaf0ac46f857deae0b952e9f48242e6f24a0627aec1f09bb517162b9b5f7cd16c5223dea27a0c3a013a7a71b87bb525a1b18ae20715c22d5d68e87f62db760891d23498d20ca83d8506d787fc76bbaca0b2d01b6c0da74b7a1a6dfa9d5265bafe0853c08ac28b20ad29f34059e647834231ddb0861adf43831c5e4470c73e8b7f9d0e824043cd1bd2008e7c5d9c664d172d843c2199e8d89549ef7667e98b03ae964fd10d0ddfc55c9a02b3be8da4fda5cb96dec68bc55072c045212cf4846f33d703a82ae3864188865b931020fda356bfa7121f6a8795e3e213782c2733935b7a7bd352a053a13e43a8759496864ee2e6abe37411c404aa8dd204aa66577d61a40888c75a08986073ebc69d3f4c327e4fc65c67321560527d4d38a09de4f58f484e7e8d358cafc2e91d8766e7f1dc533c3dbd22643d13ab3741065af7621eff1f54c083c1cf3616d3a59b340001ec078881d4ea12819c337373a7244a81321b9ca2adae2e3458009d3005ae66b6ce9b6857a8d11e10b58e2ee3cc74de4da5cd7b1e5446130ea78f2407cafd14a17740df658e9d94c47b2a1d17cab2ec127b2034baee0b0aecf14babc8f00812360f419104de7ee69054d070c4f3a373a3080a9c30bb351b42d0158206540daac033785cdc68b7150baa9a85c8b37f6491b713617e03cd8449e7bfc9d841db2858a73aa897c8b08443c96769c9e00d2015e94f79c3d51d7ac46db7e1f1a8357b8c598c2c6619cb12242fd267e4740a4cdd4d87b51dfa768a1705948b4776d8d22b0c44c52b70b5569b3e4f11338a125279c2537452418acd20f68272fbd67368d727fd5ee711bf1263feea6fd7dbcd067a7f18c80be762f283bb359989014e6799fce8b6d66140c66da894bc3dabbead1d735430249a6060c0c6956c123b663ef6c65509e1e0bd83c4ca9608f68e2fa839ac7a54a39a0bf3e21d80cab2243ad58f3733c4efe910d2b23e9e7b5c2501738f67ea801ea76e56e318f286df38e7529494765a3bb1086b1d902baf8b8201f02e58423932944047bd52535d2427033a8cfb81a88a8a322a4171594e8751161e11037a57103c5384a242c3497ee1f7f30fa868bfda2de2009d8204ba2515f2a0cffad87507c0cca8f1dea3b5aa94630dbf9a3bd725b49dc01602100ef982d3df5580d03e829f34663ca10fdbdcc2624e7c7822fb4d32673681181404b10e69ceba2eeeb571f9db79c831e5f82ea0c77a85de58f09b33c7005707a83022debec9659a67d4991e7b723280a667a498002c97263955fcdb227bb7d48bccc944cdf36e7d244d730a8ce30d484f84af28ed6f32e11e1d07a52386ea6024f34bbd298031f983e87dd332e3042bc52787243bb80df11d83d083a80d3d4b82d5eb81fb6691f5c9106628e03074a6be0dcd0c714980972c07c60c0d0aa738c0f098a041b8d30f477d36c2cbf5f05faa538a981123423d32b2709b76094a00880e043f4909c92f8d2897898aea9466b445f23b1087980db7e404605413f74015fd436a64e4c366f792cb097b970d9b50c5d279350b0ce2f5dc58a41ac464b163a2e560f2bd919c8826676fbf3d901675e27032554ee275542f7410bffc9bb59759c68bf33136424f39fd0a471731d26f63ef71e37db9c95dc639f30433d0d0f3a1750304370b1fa9271b59fa9d67aa832142b09de7d2270136dd8b9fe070e26831722bcede6f4737fc46c3f33de4cb6b9e7d97c3a36e9e6de381f3114587b496f018a246589caafa16c08f9b70409e96f9331be1667b795619e8e2495563fb3631c6c63b24d6db481fe84bf7d23a75bec26062a07235cd9df83e987caa2c14eedb05a193512db6ce9c31828d2f483c129ddb8363caff21180f655490809ca5c9ce41933e5519fa1d9d88613e49af95d36ae18364688a8442783a6da4483b34bf843facdb006ea21bca55c1e0677812235c65de42362f24d093d72918a3cfe0a5f963286e5bd9c0187d58ddfd79d1ab5b652a260ee23377da1c8913ca63b01fabac602152869a875d032d2c18b6c29126b049851895273853c08cbc02e7e0332ad55bd3baafa08c0426399853c230c08369f7223a05ae5e9ea3b4e615f75d9a5a02f24829a9635ad5ceddf60b703b6df81286a53aa5d31fded927a846b6650ebd86438eb649abdd8ea81a68f0bfabbb8f1275a33a5260c7c5ea041348aef84f3cf19676748aa45531a71ccb506f957d6b7037bf41ca5b7ae3ba182d6f6056d5a5b3504032bac6d16a1677e03b4e5046548673b52988fb60107a756a004d04d00ddc930526cfb5e8688f2eb87fb15e4863628699cde2190120a401aba2e1c8b9811feeb78969b03a76406e984be5276fd7517c0e4069f23a660f327678c6b2f6d342e10b351c784212e0902831ec765f0b22f83b01fe0bb631db4f155144ee9d0d7e19be132d78d7ae23bbc60ab33d5abea7b5740230ec622cbbf334d9c27113fedf3aa87d2357fc88badd979905060bc815c026b90ec3281e90e5a61839c9af58d3b0c5c90dcd0c31c73ec13298e0f04c90c25b4d0c309300929dc4e6fd175c98d5031c7702843e0b22aa388b12fb853afccb89952abca314bafb8eac1650e60d1ace1d612988384440949fc872a15e6a3d76cffb05ae664c4ca95be2b84ae3efb405a6a9bd2fa7f009a7c3841c8d45bb9dfe1c66357842b2d3a74078d8443e252e842e1b1a00100f3648c7666a3303f6431dc642dbee34fc69d7ec2c02a5c9bcc7bd3be0718e3eb98452111aff869eda8b9bb961dafe76824cc432535a8e297fe750bb171b22f05bc57fe6087145b59582ad184452b03de70e43f7f4a18fca31726bbd4640021a2fcd49c5000ddf3ce7b11f95214d374cdc0a526be35b604639593f3fb6bbc390e141f136f74789cbcbe2591f33ba50a20ff2132bb242b8948ad5eb0e0064f816dca83758dc0944e36c9253e30dd4839ed606eff84752119446833cd19ffd8fc5b601bf63725f954a033febe58c8bf432d239927d2a2f8c042e47ffe243350615be9e42e75541b7796d9858c422826e87453c22caca598acad07b0beb92cc2209b326dc23f9c9f152f117e0c4fb63156f43a4b4fd8e2abe2f846e855ebc05157ef4e6feea3d55d3926d5b7147c6a9b360baa962dc7f937a0ffe9d195b57ed00e205ab101fb623333d3265ff33342300c6e8dfb7c1b49a7a541914ecf079cb17c18ec37078575a71b1c3cb2b4ccf8ca2328bff6596053083029d3c6ff822dc9939191e98349bafa19901860ceae999a140bdfbefb9abd303ae6f8103673a98efe7c66f75d4f6f34898afcc6e2b5fb764f115072c3399ef4075bda9c13209db96b3251e66c4acc3de6d95e049f16d22f02ef09e32ce1c59f8056fadddad87ee44427c231b8d90e3a82242eefcc4de6e89bb1e846e4ea189ac921cc637ab6afc8f294b6b202b5178d380078a38dd84822ea928ceccff3a9ba1b35f53cf7d5ea19c5b72d54037f1891619201205b2c1fd1bd5051f0317a2614a4280b3214e09e923dd0287d2b3d0930ebece31e9e6e2bb19073a0eb6bb50c8148ded740d1819b21aebdacad9acf06433a05b3c6cd8e2f91ee13f08140854a5619f225e29a133ed38637115a82ce115093c8792e19461b75235d42db677cfeab71d62310b63df379c72b70b119ddac2e89c8d9c85580ebfa98e45267b210b0eabd46176aabd3a0524f419d78f5f5236ab5befd1035e7eaa5f7e7f0108ecaf7fb88d6f08959cf49b535e5f03f60d81562272857cad301a8ef6e387a2a329b7c889c21abb6bd3e75b959cc1d7dce537796b6ad05380bb4a12c9909476d5e6a1cc815b616104b811f07abfb99f792355cde0f3bda2fe31b36f87008adda3f2ebae9bd1f5da52fba5c8938168f57d474e05d3734002558cebdd793954a95ba176491cd94765cc0f21cd7c138f8d33f1b0d4ad205e11a265d96de25e87fb0050f27767c4faaa3586226eec0ed4b64773eeadc92c840bba3a38c1c7a8b28fc8de440ac787f427cb17d1668c135d2cdf162f0a8b002552464dc10581ac010b271309c282c6533783289fc611b9713d25af8d141e2b609918441a0992502899a56eb7a3d737cee763c73d7aa886f24a67aca5eab55fcfc23fbad18ac79c40c39f3d6356b1b6ac5fa725dc6c2fe4016ff59ffe4c59dc1dde8c018072e0682a17710ef1d7367f6a8787177ff11c98b42a97e5f1bf69ece705c9a40482a1c1a0b96c28cf4168288e72a5008bdf63773f146a23913e5761f548c05dc51a3d6a1ce3ee117971927892548b1356f5f706ab250b693dd60806b4b791f45ea7027c88d337ac0991a192d2927e25130ec5d8271bea18543ce0538165838502bcaf306bf285006f64d81f93afe212a906ad194b0762bab0e462c4d07245d7e9c0ddfe406d2d61f072033caf5169e300ae075c973bfe6848824c84be2faa2f0ae4769e7d27dca51ef8ac5530748662909d398d7a5170224ca214bdd88177bec7430170364ae9d8b7e79d02f39013913a6992a781039af33fdac80a88bccada5bb12922bd2a3da7f8d9d22a5cd83daa6828966549ff8cfc9ecdae7bcd5830ded1995e32d3c863b992e6981eef1823d4abe48a232ad0efcd7cd65b23cc193fb49a102cbf2cc5adbf9f9304a6f71e9830e5e649ce7d0c6b7d8410f88787df2f650c90cdd1f80688975f768d20a289fc0ca610d071d2457a3cc226d3bf8ef7c680bf267b58ec3fa67cb20921675415ad737f408eb2807e367ef4a894a84b9c42b0370e9199e2eb402b4d37eebc7f6c43ddd25aac3d8759b3558b665c6870b8dce9f39f2e98f63793481982228905078c61b81e12946a900f3771486d9d3803ca62e08113c442d5f2e2ffab752469f1071f9d9617d3b69d322c4645cb3c5705e928aaedb54d4fe221e3babd8963d76cc1badfa17bd840db9c9007da7871ea04ba992a6e9b02f12e4ca54d944120834824ce10ee8b3c81ddd75ba17b3e0fc854ca735ffe78a044e22e6a663f8fcb11e5144fb9028b02ce4150b9ea3a7c40a80ae2ecbb7dd12dc79ed2562860f4d08fc79b17729406dccf6c933df57aea0419be034150230280f0abc941923a753c8738b337c60ed698d7709dfe83b256d1f25ff737b75f3d6c4a1d054df5246f55414ae0ab515205fd69dacaedee30157ec021a18e63c96158704e3657b1504f7e3de7bc34b056b0b18f832a9c6350c7d2589931d69358bed6ae19b9f4e3185cd6513f2730233f3bc98464b945676d5406673a74949ae58519441a0e96a2c529f13c292ad09db8b3d84edeee73b385b73a83d70975902f301d80ddfc183e116e55708b2b6c53d3df8e0eede47cc0e36597b6a7979c99e77b4e01e8aa40171b9fec3a918d5ace7affba4cc94ef72b052ef49a8be3ddd2556476f4ae5c9d5f3d03e46f50528c12fd92a203ef0ac95ba6510657fe278189216b16087f2e27de1e10453afab3da10f31662cc34dc21e04bc0d0e464a8c303d21ec947f0bf7384b31118ad456bfa69e53bb850f2d2ef833b8e008bd58b51ac8cd2b02ecccef94adabef5dba35cd297ea2dfb586ce7b926dfac85ab0700e88809bdbb6c5985635c5148ea60f0669048c0e5b59b5eec770c30d80832c0ed3ab52642df17d51705725b4e44782427859a23046301ac0e734f42c7cc3d5480c92e8065f507e45de8a6b229a0959f010c00aae0bc11478b39e021ea4cc244c49a85a310f9562991d3f90a594898449c439b2974b6f5019174e0714e1b8fd8740b9a1c114efaccf4ad38f5d2ecb7a44a400c578d9575f96b1f5aa7a089cf36c245176dd98dc5662988291fc85961ef01577b2a047992f9a6184e6a47685de17c5aed9db3cbb94e22a8ae7f3c51f1216ed45cb76069c96a9f583a98d7c80bfa8687db9d32f1a4fa123e9b3ec2d403238b53ac084073ece13bd5934a3477fce7a527a542714437570e7e4cdfbf33097098d203388380c929f38033042053c79894493aca4c826604be39c0e43638b80c0614e94e192eea10474650015b5676412bcf493306e80d0d090f20d3563b92ce7922626729a1374f3035f4480430a17d1cf072705d429693171424c95dca63a1bd4b81b910b78df636dd6406c61092467edee709f10c1b639c5f4d135e637ddc2a4d142c6edb7e2edb001a310df9bf5acd5adc2139dace5274f9c4504307aa6ae0e99f535514b9928d650f7881cc9e4a5d92909eca4b327a8075eda52bfec3485aeacfc634b5d731cbf1a9ef8cd5734dd345906f9a879072a3c2179c5b605f11d397c587bd88714c9b7b4a7d86cb8202ef7ccfa834ec4ae3e34df579c5fdd8e9e830531aebee109904372cc593d1eb6653c1a0dcc3855dac61d90d61eb39ca0dd9930c620644794351a059505be3408ddb6881537960ba78fa093872b7b525e16a5eee9056216e17f1dd8af43972277aa42ac00081cf3b65f8d56cfba0ad32701c4fc83d1d4a18fc00c33dd95d4d3f4347ea9a80782dcc4275de6c3ce61f8b05518c92155624d2239ec83559d328482d768f852979477f25e4ae653fa5d3098c025c05345c37bba4a1ef63a969c4a911a2b8ca80aafd9836c13594ef0bf956c503944102dadcdd5f5c400e4a4e07eacb54ade2ce21c99a1dd200556dae4a0088284a2da599304442741ddeba9161f6888ed825d9ba68bef67fe27dd49cd87140c14227e9a694b9b909800295adea2e5b0bff8972b90238b76d12136c42f6de52a624a59432e905f905ae05dddddd5ed39cbcd65a6badded5d65a6badb5d5ddddddb55d78adb5d65a6badb5adb5d6daeeeeeeaed57677775bdbddddddb6d6eeeeeeb6bdaa724bad5dadf55aabbbbbbbd75abdf6c9a37b77f78b0362adb5dddddd5d5dc9c99520fa3252192a3921011322f9fb9d4d06952953acb5d65a5bddbdbbbbbbbb6bedeeeeee6e6badb5b6bbbbbbbb6bedee361060010b63bcd010c4081992d8542001990f6050c006082426c0545a6bf51f2345caa0a939b1e608161289ad091e59fc60431624564a70645665a8acd617e9d452fa4536abe5eeeededdeeeeeedded947e91f48bbbbb7b77bbbbbb77b753faa5dbddbbbbbbddbdbf7cf94229a5d4d62a04c6054ba610d1421368bec850424325a3f2f73b76e78ab75b6ca79b65bde00e44537a59f7eb5432c214570c5139e28c10258e784208284896b01266861b4cb0048a114f94929a8e98e2e5b6dcd2850b1798650d129b2955646982052e4c45b51a416120f2c293305ca65059a1b6b4e403143adc9045992374c8626967830561bd6badd5b6b7f7b51d7e75bffdae6ddbeeb66e9be89aabd52ad52ddee170945305831a8c68b1c2110c257841902d5582aa5861a786988d8ba1898eb3b6a8d6aa2557a22ed5b6556dee6eadbbbb7b6d6bdddddd6badb5d6eaddb5d65a6badb6bbd65a6badedd5be706a4f406dadbbbb7badb5d66aadb35aee2ee35f3940bcd65a6badd5b2da8fb8bb1315a9d67aadd55f40592d233744819a42b5d65a6b4d014a5e56cbba5dc2651561add5dd366a088916549429b20609129158cd12031431d4dabddd5fa8d59bcad860486f3bba3bb74de1167675d63604b76eebd6ba059a5cb7cbc2b28598bc6588658b23f2775f4cc70305ec90365b9228b61b2698e87a30e176b5d0dddd8ba836a8abb66e5cf783957cca10cb0f32252ead0d27112e56442005113b9cc08919641154d4a800439b760b11c0972b4660c4941da86801162a90b237e532543ae304106ac0d02364947870410c18144c09baa2268b9a265be566a8b4066887b37573622dde64a8ac160dde144d0db259ada6686c90d4ddddbdbbdddddd6ba5686e9093524abbbbbb29a5b41b07092d9a28325e965007552419a3a4c4c90a4792a490620d4d698d2c6f192aadd9b283825a6bad4b80e45abda3925a4665a8a4c4892b91f8ea318d1210ea9e86cb9024869c08722f2b0d1599cbdffd0ed2c9e92f1c6009262740b2a187362ec45c12911d8d11d99bae32549ac24cee325452134497d4b6b68915d95aebcab63681e2eabc36b7d65a5bdbdb2b7d012f05e2ddb568c6796bc36eadb5454e64eb5bb2b5d67e770bd1e53cad9b146badb5761b628b96c8d6da221ab2b5d6fe9645b64f57d65a6badadb5bb6b376d624a9190259e68c10d25a8e18c135ed39cdcddddddddddbbdbddddbdbb9dccc561b5987071d1ddddddddddedeeb5bbbb0909727b5b2643a0acb5d6d625b44910d59d490e2b777777777777f7ee767777f7ee767777f7ee766f26339c50ac568703e744cb904f94278a00cd9c2c5519620d501725e94e2b27448a84a03a562bb1d61e205b273354778245b6b6372faaedb7eeeeeecd5a6bed13d9568f0188555b6b6ddd8c5e5448ed09e87677d77203e9ee188872777777370cdd35c88c492293a1411a8ab595dc444f72887ce85c8068d2244d0104509228468450620294068a8e2188d553487777576aa4bbdbeb0b50d4daba240a94cfeee61a4877b7d72ad4ddddedee6d851035e92472e46575931260b0640894b5d6491a0a5cb1018921e20a22110c9122083923b7e6053ac8637fa805e0e866db4c982468b9b613804a8104983523e80da238020c9120c6c0e8992e48cc90437d99599af1f0c47af48c962f5a8c741ab06a49479c2068cb80a219c2044f4c5173cc04e1a50d191c0caaa8e2a505311ccb053d745942c572909ee1814b1426dbbcb556eb8e26523142885cfb8a0b371156ebae26eeb0a4e4ed52441d94c6580dba5814262cbe0774ecc861820d11e44bee503136a498f836fe8ddf8afff15ff177e27f207922538e6f23be08f173c425727c1df177c447218ec931b6b1f4855aeb14304c8982872d699894d002041b15b0325462d3c5063a77fc039287e6f0a60993d75361a74d18764520c6eebb4ab8efde347b6ad7346f7bd38cf8fb549337e59e4a9330f927168c7e1cfcc9e060c39f0799267b7652f8f3e0c5c1cb8041f11859c7348cc98fce2db99f6caa5b6801148292db4f2fae7fdfcee0d27349eeb7d1fc3f679249b3a7be7cd92497668f9d4d7b97f02791706bcada8cdd3f79dd46db9ab2a44104702809c81c9b6cc2b6a40d294bee28251463a494522e8708d96089b420b2dc9a78c86636daecb1441326bbd423d95aedcedaecd95aad9910d1ecd9685b0ae3e0d667892470611298a6fc22c3a4992c77f234c5dcafa7e7c201941d2877f374bd4d68f6dcbf783b9a30a9faaf75127a2155ab75baf76e1bad36aba9d0e3664e0758a303186effcdb7fdf6f56deaa7a702cab648bee4649ad8ce7e6689ac917cf558a48f5323dfda7b5b2d24896443da30f2256bb387532361f225279b30f9add7efbc3ed869fa24522c2ecd9868b29625773461d232d999107696a5ab84fba73fe11faabf0f63ddf57eb070fafb3e2e7695a0fafb17ffe05ef530e6e3f4dc4b548ed343540e7f1b52e54d715d967cc9a758ae448a0f2fce7347383891467abd9f58a4f8fbf85d600df9dfcc46cc2839a66d8bfb359468245ff2af3763980bc1ed9f7f39a0cb1d71b2d9f31393cf21713388809825c51f17f1c72d65f9d773a609a34d4f85f83d6ce672e0a2c01a40f793484812893b823590dc6f3b72324e73268fd6bc2ef2881a4868c2b6a369edbd3bdf76941dd3269d1da119a5740bb79f3e17317734745d2d18f225bf96149256b2a44bb0867cee85fb714754ce5ebe8edcf8dfe34410cc1fca6dc0033dc917dd617a3c5859763cf2fcf63e56cbe55f4be6caffac91dbfd3417b99fe5c1caf0af09bc647181284fa638e4424cd251ef93b31fb22c2d8d49088a50518b0543be6294360af1a03b5cf936a6f578b08a047d11a8b31f03dfa0484341de91574899fc4d2621639a8884099294e3cf31b32947339c0b1768f6d8091b7255e871f3644209d841d43284286b19329424c7efba3eb1baddbd568902c14eda006badb5d65a6bed5413e3064da178d6e48b8d34407c59e6c69f4c92678ce48934c9f3b38ce48914e3138432c618e5cb7b217cbdbe9865a63ff3449dda5cfaf6690366a6df758abe0d09610d4b9f0b924965cae4ca92afa006c8f79f35c9e3f87242deb5213921777b2ec8fdf14523086bc8c7f66d48296759629f4fcefc87ec9333ae851b69f983ddc7d7018ac08c75587eb096bf0834ef67310f39d35193e1ff55c17f03316f5885edbbcd0b2166086b506ef3b295f379c8596e0ca1e4895138b5b93fc7c8d79d3d7105088b3fa485244620aa74270d4fa62d17042ee8420a9403d4f5f4472c5a00253921c6187378c927ebd656d942961c3f0ac524b227358485991c1f463639361016466a4142f2178bc89808114b5015393e0992c7796616810875c38dd4902d2061f13916ee072103644057c0a42b5618390dddc380917541b8f205ff67c6589b0980f395e1d7ca70e727f6dd321152ac42cca71c51f6862ba194914e216772d6c95a00bad99e21892d4e5832ccb468d11b149940cb0a2c8c062e5a8aa82f254a5a767862bda32c5a821071ff044b96329d06ac264464e1b26540a358a9618a9a73594a80c852840c0e06517e28c2092a96a361044564a132a50825453960b102005962c48854400fe24fac69734304e7eeee5264f720b5257ce86a915abb1aad7604e710cd165838a112459224552841afd49a64cff04a2d098d3374181305c9102149ec90a48a20a66a6badb548123422d0ac40288827311793dd565babadb6565b6d3581db3427b7d6d65aabb5f57ab35a6eed10a85997545a6db5d65a6badb5b6566badb5d6ba7777bbb5d65a6bbbbbdb7a3d4556ab1b0826433b1b16b2c3591a7d335364c5a25b5be19c56a766c0acea46a935a2812d8e9ab6988162ca10288082e64875332cb8d57a0775779b11ca4d2bad94ca6a664d4ebdac3e4364e5547677cf90d39745cff4b0721aab0cd9dddd4d5de9c8649d3941ee7b8606e4f6cb503a7346a7a99392821c96285103ed4b123266447002ee548fb823f142162ba8e24252192b310fe3e44b931b1a35843691a1d6eeeeea356bad0d10f7a0d9b1093847951be3ea63e7e2efdf789f8bbfc969e9b45ebcc8d1f1be9ffce25daceae905e631f34a55bb2afcde7fff571876ddbcf1bed4dffcf5bed4df8fe6a6aa87afd2f9f6befefbd0fb1af79019fe8de7e30f7387f3d0fb6e9f729f326caac27d5fbc0b2f85995b3e29f8c8ad87f9c6bbafe3a53033c43ef5617e91f278f4c8f57aae1bf7fbaf3de1e02f669c9b7781f310fbac60f7c7e3a482de571fe775cc1e79f3fed283127683f33157d40d99af8e098bdf7ff3abefd7317ba2d1f63aa22a55ff7af5713c1d29fcf9ac56d7fbe0df1e2dcc63e6faab97a81b5d76adbe95bf55ca67f550a26eacf0c77a1f0c1e3e7c49933c10fb6cafb23df2f6d0e9b765f859f8292c993c1ff82aa83ac1d8c1f7a383ef03193efc7e32f4be2da75458d256de87425e559c4f7d073d1fd5cb8c63435061ffcde24fc7eae52bf59d4aa56a2a27afbcefe62fe7592c181f5120b8a00ef93a41bea2fbbfa87f531f46148e9877dc3cfef06bf0e2bbef3dc4dfbf06aaf757dd583d84aaededabda85836f6c18ca97eaadeae1f7afbc6ffb9c77c0fdd4db900f50a9be1fc6bfca5bfdeafd55de8742567d4441006257eae15b57ea37ec4ae11b50be50c82864f8db03c0faaff0a98aebb80785f116fbdc4f619f17efdf83667fe87d2adc394f513858ef3f51375e608c7bcc0cdfc53bfe3c4cdfc54bd4083710d79bdadfb0fa4355bda9efa256c72afcb9f81e33d7166ebd8bb72175c817083a5fbdd66be0b968ed903c2df8107f2ebeabde0e1dd585a7c143540827e8b0540f3d9d776fdb74a0115c7d77e3f57d285f385eea6fbccfd0f1f6edc9fcf2b57a88ba31b3ea6dc81b2fe655345abd0bfcd90c819b8355d847e7ed0d1d6cdfc6dcdc832a1dcfa2903bae7c85713e1acd68dbfb701e00bf791d8859a5c23ef0ed4b140ed6db87a81bf02184b63d146ea830f4be1802fcd4db985907e733f894ed9cc7c13d68b63936661d9db731753cd66be0d19c81f7e5c8390f004fc70e773d84b803f1060699b565a836d4b47ad5cdd7b6215323508f09507dea6d17d15cb8e5284c96f94816653ddc90f16482e461b156ab15eb73be63792678391ac965b1be1f07f92acfa57a17afc2216408a83e85b9c516dd11aa22145537b451aeff0d15ee8c541fadc8a5d913346b50cce4f8f148f224c55918d913d4b2177cc9f1e318d903c318492993e347d9b4aa116244e9bc40e1e857bded3a140838c8af281c8d5ff59be7ea8fb9dfd53de4c6a368245ff5870b4780efe2bdf52acfa75f85a30095b75afd44e1a0f2b5fa2fe6d5eb78304795677fb3f8ebef40ccf671ac4ef3c0f17ac857fc179e077cc857dc215fd587bbc11aa9871e8d1da4de85e7b183948535521d3db1bcfbac0af30d065fb164922f0c3e070926e438bcefa806dc7b31780cb0a4c957845fbf3ec4ae7e98e1175d960773d778c7f340bee20e1d6a010a4ee7de87f3abae3d9c879e7d1c4ff51005310e107fa786d0c37995a77a9cefef38e8658b43f451fd2aa21ac7db10e320df4a0b7198aa873bb819aeea71fe8334198410deef220ac7eaa647b6df5eeaa1b7b9f79d70f4a7b00f942f140ef83773f5ee598fc729af1e7a2e1ceec2b1ddfcf630bb7df810fba4de3e76c187b113244ce5824f33c43a3819ba7b164486371aa5bc08254a897fe4c3dd2252b4928d82228e084bb09051063f4216c04c20202bc8d128ca87d1c83fcafca36b911b1b458921362aba2e12a8a438caa2d18445a3974c6439266388c271354e2166f8724c964c64f9f0a5377f42940922d8c01f4c587c1c8f6611976372bf0f6a19c600c1e9270310cc9f482500a683325a36de813bf303c903f3cfcf3bf1bf8348c917522c4ff20561926c8343cbf2bbf933cb323c6a4f28d7211026bf1255c9b22291d538a21b9f3b923c11bbe4d31eeec71d1d8d00f24824f892dfaa65b944cb52882cff3bd1a59defb6feb3ee5121204f354273219623b5dc5f35ca63248fcb623942cbf2a91729ad481e48264b3a26cb25f227b36429b9a3598d0214c88a226892154e3ca1b369946685494be364ab5888b82b5702c98c34d084322346ba9407a580a226a9d6ea510d37dbd2c50c0793b674d142b6c5cb931eae3b7daf29c731caa8edb9a99c948aed7f9ebf7f944dc751168f629459f8a27fe39d3c1684d1b71e85376efe7ae41068b638051f797b18a5c8d78c47b47ec5761ad1ad6bb5175c41656c986451936441d870352144aca035929084315a21698abac928162de8242a20837393349443376b5284180e459b6caca46a6980302295818c1a6101123ad1b210524555a342d6c98092a062654dd260f8526730b0e0092a95348194144962e1cb8dc964832aa012041493f9377f7829fdefd5c19e49046fad32254c1985b1cdf45a0c252a46ddb7dac95a80d2834f5ac3028446b72a85908e6202628e09a0af82fc452b793ef5b8a4fb4da21996365662cd05176ef2fc4a9f6816b58cae04a9c51c99744588cdf47294273d923c7304999724cf4b2f92c7f3fcdffebd7cfeb4fe477fc3f248bea68cca997ccdf7a158cae4eb35e59299ab0245e2ce79346593a84a9e6dfe69a3de066206e1d4e66e797ba854822819a21ab0d11a942d37892651d10c33a1c8a31ef29c4879cea43ca7973c67b71d499e2f364929b3d622a33c271195b9235f1ec8ee2785f2944292a788f4225f532ec9d7fcf9b1299a913c8f44bfd611a51547841892fc24a294ca886495a89fd69f47f5670572c5249a8d29e66620883f5576310a0b1d9cc0855a8440c99f7d0294e75b9ba7842f6362e028c7bf2d189287e5802e766a9a720f29ade41e327f7049c950ee21b3cc1c68e51e37cb9f5e076c96f847c608d4c1035c88050950864a34a8e120432c4361aa9050eb05230d2e4198047f07f63453beb4530ec880190af7aca54116a1887cc10c3353cfe46b26b3c42e1cfd65c028f7a35e4a4a2557bf839769422ce3c21c34e5a6c3a0be99a4fcd47ffd37b867cd24bfdfa77133c9d72b4af9ea99f41ae57d3c4e92c8ddbe6792274c33890069eede86ecb697de779212e57518098b8f8231886adcb3149e343c872efd6f32518ec3f176b39b5b87799c287d486dd3e4d74d3de36cb85f15a2cd9e4602c2e22b91e393c9f1a1c8f1695fa4f56c32f56c363149c974e5ebca9e458a675dd7ee2a24798a481e78a54d911cbf2265913d9106594df2821a18b68b7d1f1493be57feaad0d09022f9f320f6dddc54da208a455fac21c72f3ec9f18b36e4f83142c9312ae5f87116e5f8df2422c78f5f27e92a397efcae021100bd8481913f9804cb98f1207f30096211d4440af217937893d77ad68d94e37792266aa21c7f12419168d264ca4bb3681a4d258800ae86ebca41cb4b13166d68c16849299fc8a497f13540047046d7f5e2e0f54592c7b5e3c14eb7047222d3d9bb3ec81f34adbb897ecf249eb9ce5ed09025c7c8506986305d7a48ea3294e39f8082163452a0c42da57ab823b65af7f65bfc1a6c4ea50ac27e78551f8d54aa5a16f1885be1ba27ade0030b4318be8e003cfdf83be6cb2f21004f7fbefc21203a4423887f489074c6bfb00f1f3f3f24d0788a7d4c81ef43c6d378884980f988f1b0ff897d900663d2934fbf8419ffc23f5e3fe3855d70c6ff70c17ffd4f475f33de055d10bb224083468c87fd0f194fe34b80c5f820ad02afa7323c97c7f05c4ec373c11fc0ffc4609e0b3e8dff89cdf05cfd0178192f3d57fffc18df6d50c36bfc06cfc10b40f534bc017870c29a03af86e7ea17c0ffc436f05cfd1cfc4fcc7a24c4f8f92a2f0231503426a4a8a9c2080828e6825fe37f622ef81bfc4f6c831a70c6d3f8194f830301c05e3eec2706837970c2a4ab84187b18fb3185840d1ef630f66303ec824ffff530ec82b884d7d37f611f535c395e2f01187b61386125389b2552c820c31210500cfa1092b1d7830088de6985880f471c51e6855990ffdd19de4f8c060d6f86a7c35582fc77234633463dc92499ec84b99672fc227e6201f07e625d3c05c08313168da40e17c6160063312683a3e17e9f21bd7285240d31399db8957baada87f8bbfef95bac43be76405abf8f378eaff276c0d7215f3bfa4f487d7b3b523a76c8574442f254cc019a71fae39f2079e0471568c6c13ea9f72416a040a85241082107b08f5c7924c8577f0751f0d2d4a720ca039624a8d4eb5a0a6a102aa56600000000004317000018100a070423499044410cb3f10314800b5f984c64682a8b8822f2280c62488882180441100010600c228629c49474530300af83857cea04a3cb456cc0963ba01f9ffa5e69d823dcc75ccaeeb175839d4a7da76851f2e0ea5c4f2b3c88efdf606f1d61028e707441ba404757d3bca821479606f8a9f04dc1d3a6e4e1825680c6da973b772d44df864cf80303e9dc90c2035b10348f11e4613bcafaf7d29df2f6e143af8e5975c074da37606fd3b79f29502544ee5fd12c2fc18635d3c8c705fb662a84a4b39391d59b19b058af05d2e67769526540bf085e02a8be1bcd46eb9be41b79b23cca637f21040c510216d6a1090841fc8514325eb2e73dbfc936c3776b3ed5cf797ab76cad36aa88de3889546c0cb39ca5ba77dcd8c58359d34abc0a4d0e97448ba6540d82f3b73db21d0ced528d258a49040708eae32f9b2fb875477576897d676cb621d210e8d78463f67e851c76fdd257205e73a0a95f8ab3c563e83a23a997ae04de18c8ed9eabc7338ea809cc13456c6b00db35b188ddeb96b81c8ed735cb722e7571a3a9bafdeede1727ca07e639c8cb38cbf486140d5e9979fc59cd55f5b060d4a07b84758c59cd531fc25e2483d47cb7940f14853a56fc13f2bc44e8e77db510315c282a9442abbbf96d5f0304f4cceba82ea140494c30a6eae276cf32ea69eaaf65aee4143c56c486256eb81f93283872be5b888339be6ed55f263b543c963c58e0db21332862a3247832615d117ba35255bdf16cfaf8c0ad0f54ff852cda1a7df3a29b52b4fc02190a119aec7a95008e8848e4cfc7a2b0f39002c032a4ffe54708dc4a612ebabc5c5a51f7716023a2e881e0ce2fc6b9a96826e18eb3ec6b12ffb593d6c9d32c49059b2afd642e9a1fd2f3d1b60a499c8f8dea3c28a1a884fabfd204aafb338b96ecb4c49ffa991705e29a6c902c0ef3ded32951f012134fde04e35012f89b532e0d7305fa8a5735674880e3316c6007ee6b6480b821428c396bffd5f1b3640348ecb80aa8e53429dcd3bb6757abda078504939abf19ec167fc282462753e7cdeba959918a175c41d3bd8491cbac6e1953402b3c691709d33232923bdd22eb109a7839f120011ff6216bb3594a10e236446e14dd51db4e81534da79baa05bf9f3afc46ef0ee046719ba66c20d438f611cc7fc3911e1696a7ab061bf2ac4cf4d98cfdf31809cf11daee37a051ddb232c4a4c3591462f1603656575e2a5a46ac3881cfd20dd78f40afdde909bbbf752671e7e660880a68021244c706f81316ae3595f69cd8105be198bb6e07fc69c53e371058fda793926ce6ba1c4d870b916d5909706ea699f270a8d509466a4768e63571a0bc18105f152c4e3ca557a7682b30142aa9786169c1795c052f6c10be17e6cc476019aaf2996878b6df9fa3b9f762bdc605e622047a3cde523edd504c7ab21a4228c4fe45063df3998c064b1b7356eba6432c170d8521f48249055e28bd82a5b781f0d8f62c14be138588ef395c405f20ac4c4d99063c6c759d5f5965af104806315b2ebe82fef92a68058fa1753424d96230bb38c8a7bff3893818a8d31b3e5678ab824d67369849e069c2830bee8ae0ed1e74fb7d6b9b841dd1db820c689a43dabaa71ce3c69467de85dacae9a63f03540b325af147c94fe845b2391ca8240fb58096024070c25c7d7f1bfab1a2604a1d168fc96e852c535216828e691e5d7fd0bc1a91eb7534f6f43f295171ed262f0956b9f0e803300d5d61230d0f1a2b97d7f12711f02449b9cb75baa9105478851999065e9fb8e980b8c1804e5e6be31d2e57c2686d1ca3216461c2cc40807cf51accb8ffe8440b401ef30e05cac45550c6e58db41a4d9228ad848535ab6bd035963241b09051d12bb43a68ed403c398d7503f53c1140e00dc97674717eb19bf77a0a9d279bab86767c1072161c1ee04eac074c2a4fd5380d2b56648d6a12e87677c60a651215f15eb9ec3aaaa70cc48295ec4483228f7ee080ad1f57853300f5172c7a00222b22e808e4b1606eef27e7a489abc61d64ec70e73e81a2672e48ecca5d46097dd0512f8ed7a247624ec45f7da773a82d9818042dc046b94a18be6f9cceedc2662da43ea192317bb6220743fcd8d6abd77ba931a0cfd697122e44e8f7e3af6e650324ea95e457f9242f12c1b02f1e2588a142a4da368dabf2b27f0dc17087e2201d5304e9859c688209d9dae31bf40b80bf9f2657cf68382364955feb46ae93a5bad883b43ee90ae91a7b3541a451c92c6e8cf987c513574efca37269e98e7a7758ed515fe0e86be666c9b2a5da3665426838f2a5c013bdc18fac6541e7787d7f454d54c9f2f2223bdf46c47660c0070e00938335082cff93ddc3d5452cceb3c86da7830beb68636df9866fa73d6f254b7078928e0958e9a050bb01b25c407d58521a9c55ff1f0e589e7603f265efdcf565c95615570aeed457e43ac23bb4e01de382988a3aac33b24c22feffef4fdf3eb423d286244cd939a4844cd212aa0ffdc6aefa5698bfc1aae4de83e0ad870068cf1b492b348bef392a1a8a0873ecc115c373e6921cf05643fde241a0aacdf1f7175f2fdc9cae106e48e633b5f055459354f2967f2ac037e5bbb575dcf66216622d054ac135116e145c165959960be1e1c9715ad18221b75e04f405f6cd747f6bf01081217accf955c1255088b3df963a39069e38a2f6af90dd05f17e485f59858baee5566ebe7694b9ff346e7f983e0f33b1cd7299f8dcd9708e0af5de64691b8b09837551d07d0a2ead67a29bf83f3c21c62e03977c5bf025a8596d3c56f90cbc01c5252d96656660af2f26d7060c284fb3b9cf2261ff9125281a6bf8441abaeac8ea2907cb65d6e56e88e8e8c23692a7e8e45f6beab8dfb75047ff29309f980792a9e77e6ca91d4c780c68d7872315f84a194a6eac11b3253e00177307d51fc9f41898ae98a5dc830c3d3f8735b243c3dce9ea2f68cf98ee2b1ecb13527d5c9e1fee1bf08f0ecee15ce324adda3d70e7921bd63299553f15da1285d0ef210e9f7c23abe2c706bc2b41c2fe8ad05982a1dc99596a121c5c4392ab365aab116ad08f368fb28e6d375f01eb328edd723037d21bda501f919c00662c7ed40273d785c38fdf7a14eef1ed3790526934c065e8f772e30ac6b890c71591aaafd84b15deb4635de02a314ac92338a095dad9c35d129c71dbb9cd4f22f2cb6dd0fb8820ad1ffd4bfd50eb8203f05e3c60a6a880494997054f23afca19b7141b806e2613528b54554b218ad7988c1818ef3e391168bd52076c97182e183387f9da17a833f31738132d0739b99a5b345cd3bfe8ceff7d9045637656c62cb50651b3782ac6f28e95f5e2304c34620d14d0e942c5c4e5713e662d713244bc9c7ba1480d6b4e55df7c41339ef540331bb1c0162120aa6910b61341497823ac011d48993f31a9c9f0dab34e3dfd8663705d67376fc510de64364dfb3e2cda78d0c945f2886403a81d01086822a5c4089db5cf91b079961b10ff5948695a674c8ac067e6277272f8af11812cbfdcdbb1e110d452c44a821bebdc65124c0c6ec38966c53e72bcd4c767ffc408dca5ec9e6e8c32a04a16df81a83723350a3a9a15cdd3aaab90e9a455c88c1d76badfc156f54a13fdd95edade4a1cb5548ca9c32c924a42449db47578496655d00732c6a19b75fd9d456b1cc0d6fd27e8f951f21e71ec8fb07782385a79a6272dfe0d34794bc02714b461267b0f64994278f840837083c105d8ec23bbc6eaa7cf48166a09a711c2718164126196b646aab141be0a1fb15ca641331ace6a3f8b18996bd9e363fa3addfb4d95e571d835290cca79448b35d453a5f46ec54ce18c35728d9b1fa981050afc8ec603fc1308c37b5a4f08b25082e9b0782d1a82e114b59358b45e10f0b2a16294ff7d60a39c2b4027e101d03d1ad0e08a01028524a1b997fa96731cf61f08ad47d23bcb2500bf9814a83074bba2cfe18cc96a256e8c20bf8475b347cabba05ee901109a82b292099206a707875057ee6a5179d4e539905683c94e2306c3f9200cb2ce8b171f6e6631d4b19f0b59ea4da66c06c8f3826b5fe9a087d6f58948bf2124f185f3300ed2469a3aabcfe64c3cdf095a09f1b577e2d10acf1275b781ad3918a90d61f689fc79c7a479555bb4412f33077bad9b119ddcf0df688a9e009fd62c4ee1f61c40f59d8f6e2c51d8342a56f69cc17d5155a2f40c27d609deec3a34fd46c46149884e589de6bfd24e6d5af50e4c06a5823b29991a83b2e0fc849180011295cc5995525e0815866696be816f256ba60c89a768faf75a13a1d171493030b66b02e3b6528db46d16f856e837bb4b5700fd742fc0591f7e1a83073ab4022bed472388c64681e47af49b91d27d8805b865563e6831afd98cb6887493f9b7ee97ac541a3aeadc1ddb566493213132b08b465f0fb5dc569122883a4834187b7479206102bc7bc9d485d423c84bb2d28c94b81670757f67c49127b0185d2c17aa8dea768446319d129c51f063f5dd51d4202cbd8169a12560d0678a3f8ecdca39a5ca963d80ed98f9ff98ca5fa700508fc2154b2c77316af4d9e03b69768a235d1f6d36e04264aa55872c7cb39bef29eb9fa0ba5b716df3112f8f1296ef621a740a94c341a18b09e526a0527267d4990aaa4842f59a028a39c4b7e30a79db1e1339ccd017962187d5684c31ea0f6d50e8924781d0c43956f7296d90cb786fddd1240973ee3c90e7c744b853848065d159954d3a591b55fb83dad6615d03b40ea3c6956c7a941e7e6d589a0fa911771d8da971ae9422baa5ec77522db841ac608ac34a0c248262155de0174a98722dda80682aa5b84e7e11ab96ec03360d3f1bff1d7ac25d3d809362ce11a9f60fe5f92b399db518e9e8016d98e9d8c3d280d2992ab0f031915a2471717c13598f4ed74e8774535279061cc87a3e26a203de3cd09d7b535250946206748944fa1fd63da442d48eb7cd4de3b2857181049afa89b4cbf9394aa13b8723405a36c3870c855b6bcf38d147673fde2c85221326264a5d8c719ce866aadd31b9b018f333e04d2413615ade8befdd06ed49679569a6a833070278032413c17750e9443592ac715737d02d5f1b1e0f39d592f118406ede73e28f8044a94d3ed45bd78ab20f886021dcb38a6d86868a2407b84cf441b51c4977cfc8d23d6c3e098df69ad0ab6afcc7f0c2b0176b7831c30eca06aae26939bdc6e5340a17cc81a61367c515442cfb30676f2ac2e70feefc0377d470a9949e2f469e00bcb9a6ed19f456d9d5273902381e2123e71225b4ec1bff1b2c5929241000776bac6100171a7f6f92000eb5613168260394245d2c72b41d9e0cd8c06e9633afad8446038707d92d05c2e9b187d04d65883ae691cf661431114ae0d6161cc56fa49544a35007fe4e0fea341f82436cba0bdc2815e54b4090a92cd22e51c213348b2f54081987f0add56c7880bc5083098a8340f2a6c0dba93b784ea1a97a65d97d1986c13f012e90b2863e21f32cf65cee04112cfee317e5f0238c79698773aa70fe6094a3defd406f3cef073ee246320116a94db15252472a45276148f98ad8a4926a2cd4b01e2bbfd949abbc904819da6223890cbe9aabf2a532cf4237ffb36e391ff3be75de8abe21b1a5cb7580bbf948646cca978b7a3c99df2fd0c16d59309d68ca1228eb4c5aa03bb8a64103522cfe5787d6a866091cb84645569dbc1fc5b17d95b78960f9f630a1bd0c88b16406295d1a8ff00d765931ca098899260de7971dc3a98f28624cfdb7ece3431c2ad1be1b6c66a387c2666275ba35d4045ab823a354e6c424309a40f6d5b29e7520dba73cb3109af3f164ec9d0d93ae7b3fd8990bb1a85e2f4afcc32b1155f446a839ff7a2b91a7cb247c6590025571f7d1957d546bc82bf1cf572bbd6edfd53665262373728c26eac6f46b41d7d477161afc44e010a28cb214f447e1e58caa3a5b91aae61766ea3529ef8b9702ae1fedc840ca1dfa8b2e30089e7b502f032b6c68c61662c6adb7c1f76452c020f815b57ee48905aad9e643ed2f73328ca6c4a8d0c12d8476a6f715981e2764a1c8c633b2d0fde8232064b1a4c40045b59f5d572673693aaac99881345c6e7840f96c2e1d95694576249f17d5333927dc146b9d275af8ac4d2bb3eb8ca75ccf6f074c20e5a0ac49a992e5251683ac0856b913fdfa9f2dc0e6dc94eb06b6906ad6c038410ddbf8145fa0f78e4cb826d5d6b6d9b3db19bcfc8fd31db12c3095afa07952fee985849d50023582d9a77218d3edb1c4c57a27c3700f360e0d8f08b159924dfb33915ea23345d6c32fc0653c49c10193375161bd8515edb9baa808231e375cac1ea9bf8130d46889f9eb35c5f90095825cf16a1ff4001896f5ee0db319168fbcde615a539d0c1dde0c85a1098a204963b37b09270d824c13896228346a9517947d93c8f339255c8d04845afc3b9715e35ab9af830c9b0407af5cc47fa250a73c4898292e6849566981bb36b1b3ee54c3e2bd21f93f4ad1b46937663e097c8c32dcb27551a6cd0d8d465e4255a89010c9784abcbac062d29cba70c8e828776365a2f36e8fc9476cae019c35ac31714708a1d90eae0cc20c8f65eb8b2b44598fb0ff6346b829fcfe0332ef86cc5361ba18408c7c81abcea48900e685c112a915f57eccf6aa1c2d6f730c9879bc62dea705f604f4b33f233c5cb71b3827866ee362488629b1ca8a06a0bf5e043ab9212adf5e17f143b4610cb808aac1a451430519a1e9402a930e0a3e2d3149616e5ccd8f9844f71a678462289683cb2cca1c04100ce75a0efe1c841641bac6468c0da62012639853a29ab0b4ddafb52aea50b80b77ee9d6a8c744c1b8afa110bd199ea956af7364776add7dc65ce5538cb878389c731b3285abf8431457ee76aaf039774b9364ba9afc9e01117116296eaed9340ca4fe19b8f96b21a06b6ac896749f70385024604892da43563f09b512874f177466d2547cac9166b62a859bc11d6ee938b2263bbe87bc12e2ece00e546f4764de11918581eec1c37b5401b58c1b4ccfd9b5e2a017de8fddc942be1e12473e2bc51915829db0465134bf4b990cb865ca0e29968aa8ac5590045455c89d09f819b7d45c5521fd67286e11ec1b308c0ea973c1eec2638154e7721e0b38ef74b81514427065b1ceb30ea854dfc094637c911505e04996085ea258113cfa2e0e80ea3fa850edb83e683f2a978eee250ccfa71e77f9954f62f5741e5b6f79f1ad2de9f590a320de5b178eb36bd018d1e43c632884825ebedc4119c0a66e2009b5403f917475221767ecce48eae38f141aaf11a41e83df110c1b6142970211ffc2b18f48f121b82cc438060daf144f767f55bda0f445a16fba61b2c6b99ff84ce9c85e48aa904a3f745f9d455832714da8ef55daed0e08dce67bd6b2744031e7029ee50faa7980ed22d544500327a3a86a23805cb012a9045cc2e618c2b5d4c2ceb612eda537563f36e3cac51435551c9d61978e2f82614c5a8eee142c4d248b3dded8d9a9c264a6001a328bc988db6829e14af1d173463bda7685c965ea1d9c2b50ed2e2ede486101147a18063ac7e971152438f6e5dccbf2af9eee229611cceb42b775800b7704551c74043588129282b38796bf3d478aa05a0c92abc22864aac7a4ff6eb679540b2254966295b0c639909f1919892c4ba19438dd9c1b674162b62c19451380c3ad1a12662a7442dbd55c3c1f83f62b5aa316e6a68674a767c132cadc9dcc8e286311b987d319ea053f70276145d7f0517b51dd8c7e012816f3e4eddd47ff101cfdfe5146f92bc82aa58f785eaf315b05ff5a02b2b29514edd2d4e1a6f1c62b81fdc21815722f7c3a9fc33086e23dfeef313020d961bc381c2224ac19a307780e99ff44d984731c62d977e810169d25e0b242e4f5dcc988976c3ac2fb677825cfcc302f7586729e5c5490f3464d3cc54cd6c7e8807066f32c8eae11ea1c594427eda746f24f30175a2888457e41eed8598f9b22343bc888af4865c09eab96e4068430de46f489e82d80d5f29700a660226a334f7708be20c91758d3ee28e5fc26b9b723e57540dcb146a110d488ebd2d2ca7b0538c10b4a5dd1d479b721e4a09103d93160ded211a53846025915f923019357c9420c52bd4285730a3a200a130e6383bd565508b2649d8753c4b6c31fb1fbf83cac725d9b21d5167d440e25ccaf0f5287ca8cffbac962023df9aa038d1c64481e82ab6441bea19d627c1b25cd4489535001d5be546a5b28e0720ef9007323f6cbd92b8e2a80977994a148576b732fbc525cdb5670f1435aac356006a7b798cc8f4ad96977015b84439e61465b0a1d89315d5d7f3094574445c2e879aea138631b77ed25c89896dead1697a30133de693d6f7db0a6365db14bc0bd72bef97f8f1b0894098efcdd2e32049f90b6df9ad395cfa060058ba75a25901b2610784fbc3fdd238f51d930ec9584f7261c20b4445e44b0d8b5ea081a1043b6888b975cc895076acd80b04ba05559cbe51090b6747c95e5ed8467d4d0027920a0b77b921e4d5beaa844a056747de032bf57099a2dc032d974354af56f8da036542ce67ca14dd46c7f266b5cc02d801c0748247511403b9cdecb5a124700f074e6f174cc9739abff8e4bb2849841dc2474411a991dbc0d158aa9ffa8c10098fe5d5e6cbd907a00668c703da4ea332ea3676ef1d97804237d2f43af6405de7f66c31df396ae758b15b77617395a1ff19c713d764054da60135ea37e0a3b82525728f54d03a7bdd0d718aa856de3f6fe208814c744d662409bab5aaacfba6630ca9d555da4c79a0d3529bc491c91d0f59b8ee5f524c6c19a9116df0c44fa65e2db8b4560371d4a47e5d1f851cc3b93503db0e0c9ae03b5400a7a5a418581fb6772499dd1ce7903c0ef50c56276de18f402c2c1292cafe8b7a1d05f052e37f6a67225e4340e83b93520d83308b1661f0112ac57fc2c30b9e7b29bc4f654fe143a4bba070a95e37da4c8f69814ce9e0c6dab3d96170638d8014b0dfcbe0d2ed106317028e3cc53497fb915daccb00dd608329d463e8602d8fbcd966187a620ab86a81938fcedb68d021633bdcceb5953786395060e4c3281015837c9fc7afe38ffac0287ac1b902cf46f2fe8479a998f7054e9e0dd55e66bbb5bd176ee8a73b985db592fa8d9ab042fc12bf2c7420420ef747602fb57b8f3e5bdb80a7f19b3f5e4e80a5c036a9122b5102c3a0a44e190a11bb114b4555f130569dc362b788076abf4129baa7b1b4ca09d13714f2135a315bda0384d3a4b8579295aff209e3ed62a0d310672d1f8d2264587d24e063cf0fbfb64e5ed03661285b9a834bd631e604c52a02bde36466edd3107e030905d2704e41ba73712bd2c4c9999706c2fe636e80ebfd01f6b9b0a97722b9c6ac94d6310b5e40200f48429b05b47ed40a448e5f296ffa5e967bd53f29a9fa81d05219d9d481d509a5106cdf31dbb21d9609d5053551585d4547acd65b342dda20a018f331bd78235d75352c1d01268dc915adce6c345758333bbd26cac6db7c454c2bf92612a54b88a50c2ba2311c2852af34c253166095e820574fe8a60bbcfccd50e08296840d975ab3bbb7a6da4be958e0ac43ed06a44487cf26f3b6181dd5ebc50bca5aa16e46ea77ef995eab1130ca74d53d4d4907bf38d88a634be4909870843990b1d3080500c48672018c30f22f286e2baef4f4266ca2f552b454a9a9d96a0eb08c68d82e6039e9a818b4423183feb7a579a02c79458d928b2fa3996c47a5e831c6a9485f63613fd22e1a2606ec9aa1c80ca91a0666704e5ce032add51d0243c464726059512519bd311846e2d9c8469b2f36e9ce5fa93c72b2b0aa4c07ac23fbd0d430afa8909c0e8de24810baac5d5d35040b65a076f636e990f019c23dea239846d3cbd998354486ae70e6506caade39c8234a0e94ddd0541e15626624063ec6dcd26dbad157ef580e696bbf1d3e0327c170cdf0c54b4e7789662dfb301f8de56f9254ea8094e5600351ce9b80af920d611c78ecc9fb258a19cde71b5fc57b29aecfacd690bc26cd51d66f14f06ed8981ccff9284ace5a4bc1bdfe342bc9e820811beab6ae0e44d4640ba13b0928f3d0c8f11efc1e769998e31ea27663a1bd0e4d29e57e664adc02e7e2096962e8f04c9ebaa73950a1e4725d4f2064d3c79c19012ed22f63acccb60a7b3dd4e03ed5a13f940f35e83a04df46da5d5c460eb4e1c8d74e8b229a63d40b9ca87c470f591bf522fe6c90815f9d281c1b8888367de3c5560732cf53d28effff012c3de9ed8e938d9de2d0fd524e153e25d49195b8ca38bb1e7dd1cdf115daecd79bdf844fd878004f8a8796bd999df8fb9993632b8cb3bdd4a76b76e3f64084717e524e72cb2c73d53a077add03bf66a09ced77e97aff5307290e82bd93a91c0aa732c57c0980c82104a5d4543d80a96e73384acaf942d2a06f76d5d43106f168a636928552b0ba691bfc2ddff3ae924cd9586407c53956a5720a6da823f28af71574375a077015162b671a25315a4e5a85a9baf68358f00f803e1ab0e78aee205fae167b92e650a15800dfeefc2cf451f13339a0fb2743592baef681dfe2c22504a5dce9b8b56fc60474b916585ffbab816ee4001b613bca1b5d0b9d44ce570b0965c12be0d18e4f4ac2482f72facd0a50cbc18aba2e3b16a8813781d26ff610fe1ebee053b1a31353641348fccd3ee1afc3173e7c1d79972ede8f65312c5c2bad63897af049a450e6577d5575e8c5d251d42fab2e4f960b72c2a8d601fd0a75642e9097985ff6b04a4bcdbfbc4b0cfe0182693a32a6971ab2a814e91f17bff43cdafb6bc4681b942f731dbc98a2572f979999c456d6d18324e26429d4e3533fce1d32572e0ad17b3384c7bcf95da804a0bd550e2da82c7c8ee60c06f71978585f944e2580265f8710b28173ed2e14febc0a164b9747ca9b5760dd464a05ad8b7348dd938818ba4213ae661c70f1735b6e795888efb685749122caa22f6731729a18cefe2fc1c387c2b53528660493f5190059236aca2a5285d340fbf8630c211c352002e68adf5f5b818c2874dedec9ca5fd2e251934c9da61722dd7de70ae07707c0fb85e86222a61edbc952cc7205286e600a74a6c5885225097e10539bd80de808a904f2c014fec09eee5cb4005b1873ef5ae6eedfce81ea8e4c0ff8eb3085bdc86788fa3c2ebb92a1e0e57f558a39302fad7daa9095e49101a118c3b0051be242c1874e73a108cbb285dc42d290416b1d1001dc82172e34f50f8b0513898180fb5619303e91f345a7f99309c681b5765e222740d0bc7f0154cb02542503682fc122bbd2640c611bf7de35d7c36de029518d4f46501fd6a9288aa32a6eaacabfe23a01950ecb2a7a65a0ce60d090464a9a42716dd83e9fc7ca715f2005fb69213c1a6bf03eb7a6b5b4e774eb3ef6f7a26f65316b84da15ef40980c076f018c42e0d6599eacfc183e9e9e85bc29f6aa392d148cf7f3114d1c5f346688093c50cad0e27e99204d39b38a0d24bc136822241c2312694ebc0194bf7a2dd7e42b05c456971c8c012989f24721b17c71cf903a678061c632443d9baa9153acd409d221c326169055f59dd91c8de9410e75938823bb40d5d49d0f1e6bfa34fccf47255f962dd1cf5db5d2ad5c92a790346acc72d20700c99d15a42e33c45f964da05480d6acbb9f490aa278a406d89b5bac8f15ad31526bfdda4c51bf74761e86fc5a4062b057ace4c95bbecfe9fc790849e4c443bf607a71477ca3f9c51f44fc91b449a7742e10019d61b0180e6631b1c886d7fb0e15bbee0c32a11d2cc4ce7e2cbe56f3c30a9ed177f4b46eef0027241c603def68813bd203fed2492cc2853a254d9aed8a2e8c0b48796f65d69121e5fee7b74946af9f65bfddc595984fbbe95425476cbf46c746e5a45cc11c31f4442ca2bc596047d7a81734695b92552a635b46aa45730d09ac3bcf0bfca7fc6da30e07e4901628b14608277048bceb55eef505c97bb97723322d04bd20f9f0856be08146e60d048d71c88fa2a7f026ada6e70d81fc945e6bdff737a6df1cf81baf9ba5f4c7db25a3de66f1d6e336f0aca13308bb8eade10e7358d28546c0cbfeb6503bc5d750b64ea08b4f11f0532a59187726025abd3bab9b06223e625a7eb8a757f26edc7a916c2bc7431c0266d83e896e5da5500c6a17f988fdc5ac4d5e5fc97a52406326c26b5dfdf893ab7c54d1c2d8888d9f82402ffcae1e9644cee438617984c25bf38ef9add7a65c2f998cc81a04daa4472456b6a9ecb84dbf1259bd51e8f45e967634c09a22647aa5cc85a0c4b942db7d8f21d0370ff75fe0873418ca5cdbcbb842ca8728160c2f1fa07a9057af1902ed82b0d6e36b554402f3d907d03cded84e7df7fa381068f61c15b0ccb833648dc1fce5a72a010151f8a8084d22d077625d931e170ac7b2604c8395c606e07009e5004d758c47f286a4415dbeb95ae563fe4be599c14800a4e6c564b3e9d6682684b5527f9a4b8b259ccdfb087236b2f344da5508c586350cae18fafca46d74fb3e8098e4baf46417fd64d7a6e6f33c025c91593b0d551342bff2a1b1438601bf87489e7ed82d54a9e6407db736a3c751887ff7ee5a11892fcfaf5fa9ee1f92e0ec7bc8b5801fb16a7acaaf9128dcb24362c8c35a85b1afbab236a77ecf53f1c773cd61d749cef1389bf8c6e1e19efbaedb21fd43ce44ad78ba625885f1f08d9699912dcfd13edd5b0d25bb95cfe2e1064b32fcbe376587bef37d255aaba8482dd8dc9cb1f80d490715fa406f0e16e5376538c2de00b90972398031f1e8ee8926dca055fe266c10202301af28b1623fe73b0fbaa66700a069bf4c5cfc214cc3613fae04df1bcca899d726dd4270a2a464804b6d8a108ec5b49d4ccf6de2a1ee0953afd4dd87ff3dada90856a0b76be0e1ed942760ace30df6ebbf2611031cf52942265018a9b20c3c32ac55af78310450759dfad70a64061b5e092cbc4f55daa1ea2fa0787f453d60c0a06a50ee3e00ec575a55445c77a732ccc0d2144f585cbddda7fe62c11ef71a74bd807e95c32e231698d218780177050532f073d805902dca29ee37f55c68fe0d6ecd5a6e004565c2f5f2bc7616f71483dccbeedf5dfe5f9b7a6f0834dc8e95849b700b354855d1a834318d1713cce83e209221950d362af1a361c3b1cfa05408c01cc5ab368592661062be53b696da4dfb73f9b3bed3e49b0f0cd282c8a7dbaf2bc0f9cf6326b814f0a062366946caa290221af8dbfd647e8765aee6869cbf74bf8807fb4285339976f5c8b92f5043b81f85e8f4ca80b9d4f89b9d839adba0a27bb9d41e2e086bfe781c0a6603f16d4fa83026d2ae1e397705a085db8a6a62b9c20eb7856976aefb84e35798145a22039582c7707079cf28212dc0964f5206d55b68697ac68002274400bf0c4e009cff49ea5846b41636224fbed0b048a8553b3b60acd894d06a90e08e0297a427f2b15213eca19435f7617545cd5c9517e800dbe7677dedd27ce2e9cd387603a4fb011fb8af8a28af6b91b651071716d4813a2609c4aed8f4ed4ae0954cf765196b7b7f6abda07f069d0cadcfb77dd6cc6ce3b7d9cf3910890e4dba858e4051fae7f818d0067c4b2f757c559fc3f6dfd3de61ac4e5a24458a9c41c88d2c059a5a0620350190aa46d4a01b2135ce6d4d09cb73d720a42b6cf627f48ee4b88add389cc69d45d98e344c119d974059a5d32cb89a39e3b1ccd86660184fc905ae800ab73c3917bcfa156db8123dd13ac6af56f72fb828333e5f8f31c9b5552c1c101e9fd7dbfa37611a232336be2dc7a91a6434bb1e8bb296249e11af4bdf5c11924a1e753c9e36559d8fe32b940bbbd1ee831c9c5956a97d3b3098212079599415261ab8ff75f3165ae4a3fb5895bb52544a39996d2bcada8c9393f9af64983ea2a2dccee5295894e52dafe145c20a1f4d47780e23f20cca8805a2aa56eee959db516693789ef5a3ec6e90b8d246900cc92887a4003f6806445cd00661351b9a561dd517be0908e44f311b3707bd04cbf87b1ef2538a61e1a9000e7e1a519f19a1c02b97b937c840b984efddabe130d4568c8043d86f4e624d61a1be9b7f34565c54fbcedcc791c5305a3ca36c67327bbd2add9e496e4b493bea671d2dbe8c6cec4328aa4bde49b36bc25758217152439c874ac0f5fd39225ed9e71499458e0589f9857be8ae74f0d61fa521e4aeb00828c6aa2fd675fed9703740a409d096ff4e511081727f29415bd7d257eb44b8857925b72beb2d7c8f8cd7930d80bdde543512a576ed346b00fbe938cec8a20af55fda4ff96c1aff1c74ec5f4fbf021a54ed77f9bfce904806ff40aa01fcbc79af9653ca3e0b5afd30cb6782379f559097a1562fbdc9dc9dc612f799419390ec395abde58e624d1dc9478027995e900db7dbc384721646eef33c00dacee4c2d76652b14a958ab312592a8aae5dd5fd2d3c458420cc9532736e54f7ebeda20d003b0e4aeeda06c862c94fdd712ae80fc66fdc2104ed13a87d912bcc31fc6e6e74eb43c1aed6496eaa6b58bff6292c4f24e6c1aa236f38590a722fdcd317f256ed1ae15d993fbf106fcb60b35d156a2e53f543a068e861aa5759e7edb29a9a4119dad1316d83069b48a1cd456d03c463288706096f718e5f1c195a87be4f24c96e9bf5eb4a19c9c2f6d738e725383b350f9d5457260dd83f0b72da3928e074da85d7b024a5a651df32ca187c0192dec55c50b29b2ef870d7808dc375250aaa17c42d06676ca2a896499ac0eca8257b82b826ab184f43cc80e640742abf2477751effdecda09010b1f2bb522563604443af54f157b1d95f4a091882b813f54e96ff87d5e5721984e3d223601237419fdb1bc5daedb788cd4b8fd20555202eba515ac70ca565b8692e4ae75345de265ddff2b667960a3e108eae64e760481114d842c3a79f2054aeee00a4761cb1b09c462b0a475c4fefd726d5ef52dc665e201f74dc770b05bf22e7079d7b36134545f31a8507a373e1351e141a7bd4ca0c5cffd0ee30ca00410fa2dcc5b1bd2ee6cac577f4e9001318dccb95ab942cc549b60da2729d688732f65c030e50dbec5b574063f94d97329217dab7d675b8d2d29db8b405062aab959264bc89cf07c506c85be5020a37839c10d8e1e8956c91f6129f3ec5453e4552e35562dfc53cd9e31ed3fbfa34926f65d57467e54c4df39053feccbbdea5c6550c46bf952f1792f21c64c2a0bb8e41a83052466eb9fd478b310f0493752b5f46be9ca0fb90aa52459aaecc7cdbb3bb8a7d587c78e53c59a51b1dd114ccf25aa35b857a0e0516eafb2858854bc13ddafa65d5cbecec0974d4b1e1bee631fca0a21447d7d58a137b579e45c0aad9ffaa2ee47b9ccc45a36c14e5c49cd9da1538a5c01ccb4221ad63cce7d74ba71ea1c36469bdf36845ce99adcba97ba60a075e62c1c741f433fb9344324101c206d140b7a830a033c1fe10b6ccafe822d68f1c655a898f4133813ed0c097bc961498aae1631434a0eea0c0de07145c268bfb936df569006640c39326981a8b05c71ebc5e043c7d5c5fbf470ab8c4fcd82f44cea2e7107b4186170983cf4ac9adef4d8ed79d9c2ea973fe4353e4746d9f847f24813ae16c17154cd3255721ef59815f88b3c79881d7890d45b05e5985508a1ca1324143c3e0b970d3ab8ff37b4cf66a0f94d39e431cd69a31f87679bd982bbc82e5108a28744158e93dd62e628006293ce50813ce4aae28b3ace463a0fd146e8454a522ae7ace8f5477e89acf872e0541e227f9a27c3727a5c9c6951181f251612100a17943c7df8121b5e6a77279e5a7a3db14ab0a5a2a8030bdab6a5a057caa6f88fa2bf9b747c2710a3fe8a4e95444677af31c37909454780ec4467d4d2f89741e1cb0f5bd0c067c68fb415da903830606807a2b18581cc38096730ab1d2a209d6d7bce009c8062260897961807e1c95fb4e198104594ae40f10beaf2b8e7a6383da6e4918c6e46b6d9d4f916ac514c379fbfbd81b2c54a74569725ea79095c4a16e88a7cc4985716e65b741591eb8f39feb6403ef562688402ebb4296ad2a0026e5a19b8d7dd5d02425b3544a3b2467e0ba2dde1cb628372eda1c80e3a6fc3eb0303604d5559590745d89fa5f29f54d19fec1451a86b1eb63ec2f9a983a0f1d75a5412173346ab66b4d961d8ed622efd6027e7019e724fffa1bc8db812b2de509b6d61ed2293f729e66b4087781e242af7b6866907dbf991f06f181818a039596905622e0b342ccae64f8261939dd7722f71c7ab6fb3959f4fad59fc469101e761b1d10793e206c720eaf76753d8169b53367a632885b5b860755a68cf1d902f92d31c900f0e7e2f03af7502e0ee73f8d8770b3db25f56e238a02a22ed7c0b6b1f3184d31bc103c0fc19d068061814375c301b0b1e7833f54a59a0b0f01b4cf71229f84a018f69f59ef59c6786a4c47215026cd02812e53910538bdceef075bcc3286c96c612ad5128e821753030107d72cf74ecbaa19aab29502cf1c1c4591d16f23d8131a1fee486a3529c35705ee7a6aefc28919de31be3a7058e4dd567ba2841cc1ef50214a1b83c50d982536a71d88bc153de53928e9048be376979b1f8f5879ff203679812f16f8f50767f106e3db246bff1d6e9b026d60cc3db7963354be8ec384b5fd9d6ceef0cdaffae30f97605e2e65cf5323d66660efe3736120ad44a88605aed1951f0476fe02391f17bf7a5b0212762c575baaa2ee3c51dc7957f16f5ed44bfd79fba5f018a001d787ff727b1f3dc62e45e4514db609324252bb81e4e37bd81f29721465d99999e2951efe252ef4c68794091dc0ae82119134eb40da2c1ecedb5a9c0ec06472d11db7c3b7879dee633a4b137897c06f02920e3d52888fe0f6a69c0d00aa9205df000bea3bf42524a4a9d9dfdb4d698a12706517ae411a2476f84f4770383493c94577bd0f4f1b5edc0e683ab9d76de14371b397a7014d4dee7a977a38dde417b5a046d3ec5caa734a4bddbeb39a9d04a2b0b965a1927af1b0de0f12de40c9aa8fc87b6e2d3c428870e95479d7e06b42c53671c3ea1c43c0b50122a862eb6e5f0b443882fbce176a168698058f96b460cc06c11880a8882971aaf43c3fbf8d1bf8a8845f2b233b80547db05f4aa4751664ec8496e5fc02828ab1b8c79a387d58e360c8f4473fb59c4765d1fe65e8c0cc41a32cf2a896ec0fabf6f9db5b4842dc2fb2c36636bfc0976edf17f47029b02f605de88be96931b777adb2e4c3f241f8826a1ac3796047fc5ba913392e08e787ab2d6949236fbd33a3657db64bda826207e2f914aed0b8ee490883192eb4a53140f58ab92e06393dcda065b1444a21aaa582569aae08847c057e9f044c0e58305c15271dc932955eafc78de3ead83db6ac4112e1e6d8ba54a24823a22a822ba2b419be1700fd7059d108c518b0000cec30600084d8ca1e41219f4d81587948cfaaecc6e066c67995adf86dcdd65a4288b44d08d95b6e19180ef60d250e21cc8ebe1d7d45ef2fe2783c70f4a97d79a1a736b22c119c8ae9c7b48da1d6dec9a172e861645d0d7be8a344e2b9d8853e4ed52e05eabaaf63b8771a67fbd5a0769d5016a961ab6ecff413da5b46ce1a98d4f66d1ef6e44d835a4a74c914ed9b0cb4d32feac814edfd6934f584a3a9952c99a25d2a41274a98483bd63c270020e20d407589b1155b2d1d1695759098ac63bbc6cc991bbc32efc235b4cf193216580a776a5fe419d8a76d4ee1b368bb7ce9c229f3265305af10f24eafa53fcc33d80ac1ced602a086f4cec993bbe5e34c26038e99e5e4639631dbc3952cb750a314aa0f345eecf1e6e071ba01bad84117c31e8578207b8f7985a84e45c494f698d2ac4c97ca2c8661189beeef6c823be1e8ed05555e1e26d5dff6821a0ba044091bd810df9accae5995eca391599969f3593c9265998a061d3683a1a0b69235ac41e7b61ad4705b270d69c06850e35943031a92dc3ec3196e27318319ca50063290e1f51ac318c4208630840109123080e10b5f9899a9d67f88804b4883c602e4b7c36b9bb867e60fee01f58309c1ec7c8c56257fc2618156a5a655497b2a2225ed0b112238050246928a57319254112919c9c031113d3072b98a9a292e172e576173e4d21e342ac4812557c763b41c903fdde056dd693920ed29882b6d68832f128ce4c67380ed298878e3fb0b9c79348f87661eaa65d8f7d5db438342681829e7093856a936b28c696cda71da1a97643788819c129391d9f8f0930132662fe56c25709ce2c99d70c8c747fbd26f2fc4c7afbd70e3f936aaac1bdd368f87b2fc1033ecab0c44bd73da1d4a5029e43c820c10b48fb5bb9b9011461d5774c99513c713cb17815d5a1f4470b48fed588a999efba3f58b57c9e831ed719e66bf88ec8ddd877c664ff3d1471fb3f10a9e117f9912279206e3cbd5a0c935448cb46da94c891d75e2b401c7a355d77396117a58971e3bccb7ed987dc1bed913bfcc477b6298145399421fbf89844a77504ffc8db76d7be47c44eef34574d889e3b713df07f6faf99d787b3c8ecd0711b638eab1fb88ab4be2f77441b27165a9651b9a4c1ce88ba9b8922b1e954ca15781184983942a6990d21daad320c55455e7521ae394e9c378f3e2b1757a1871505e5fe8313ed3617ca3bff844a78ff4165fe9a09364e9161fa74033f4947e86e6524bd9521775719489cce389f7513d717bb4278fc7937943c4d46fe7e89cd8e7fc3c8d47a827ecf145608f766ec78e591ff19b3d35777c22d2b48d33ecb98999b6c6b3f286f0d4c8147a8f8a029c428f05192f5c4a069a3b04cfa0dc76847a9227694f14e0bebd08eedbbc8fee9c2a626e9ff62491f00c7a4f9006a967653d350d6ea1869e9a4b376b844c196208996284caf7410447fc761ff598adc78ea3e2d88e7d238253455822f1dd63b0739f363471112abfb31867c388b130feb68f864ca17106f3220e78067d7b71c533e8e71136205788b40d3d4674d3d99ea41dc2c53cfd10728553f4469cda13bf85cea5361432bd857d11ddf497d14387a121e3cc2235f680dbc4842a451cc2a594060bb846bc9402f3a1e3980fc5cfb7c501baa941dbe38ba8c7ac8fd0eba38ddfce292e7a43c4947e6272d2e8a279108e06e9a4177d2ce9471fe93bf958a694bed1c729510a44e967116ac838270ac46f37221a118afd575b1c33ba640aadd42322a640e7e6173f9c537f1e2695736aec38e2b14ffbb28a363285fe85257db4a9b99229b4cf038878770011dffd4481982a221e3b164615a5d5a3baf4f5639129f4db473d0a740a6469c8147ace13d9233f42361a7c96674df495656ab32a3285fbb20c6a737858a2794203c7a35ea6cc9b640aa718bcd3644271c1d12b2f5832e604cd385d5260f182198711dc4c726d94ebce4fafa56b94fcdc5ad0dfa988e823857946c894988ae7646629cfe0beae21702c239caabb711e95731e97c7ca1c7aed98196a28735c39dbbd2687f08c4d85932ccf8b34e891b155b1aaecf03d0d11d38f0fdd883d8c3acce219db76cc4a9d4b9d2b77b6b74aaec8c815c9fa7c7bdc912bfdd6dd24ceddb6ed02b15d8f95395da87d4399d399405bb440db93c70243c894ed1feffd22bcb7f5410447f6be0fee5e11ed237b5360a6a26d954cd92e59db375648b76362a8d5ca9b06b74b2b6d1adc8e85a1623677bbdc8e21a9d4820d6ed7ec1bdc1eaadcedd816eaf64ca7c1ed590a2a5fc6746c689736b865f6e4e186c84e04a78a486576f3a20ecfd8be15a1ce77074dcf468c89c9ee3d86fbe727cf418749755fd7ddf30e645f3eb65732653bf717cf6e1cf7651fcdc9f3ee30a997ed1905b273c7919dbbe79c7d21e2b138b877f64526eec894ed2fdb33abba1ba7381d99b211a16ab7c1f79e8751471597c07874321e46ec2361967b18ffc5934c8d8ad654b9c66853c5c53e5f1bd58f316236ee48c6c167196314929d3d23fa8463bb77cfbe7436ba640a0efac2d9f8922952a6c8222611314559a6b05c39e1d8aec1a4341cdb35fba27db39e2fa6a835c99479f084835f6052dcfcc2de099b155d7225469cd87251a1509d6ed81b775a66eec49d1977aebc9c1e23cc8148aaf82f068c172827172d4ca51313d24814aaa08fd7719b876a193665f38cbe10c9b16dcb18689aa66994dea6b4b16855c0067180ec48b9824d7599de5c49551d571798731c538bc58a314656d4096764f5a38e5ce99c97ab65ba61994c3ab7b15683dc35558cdb10aa76288268d5d52c86f3f1baece37558c63536e8a1c9d334edbc02aa378654eb3e0ca751481aec681be3e2178fe11c69b0a7eba686bd735b984baeb04ba51a414caae7ccb93d7bdebc6ecf32f810656e93e0f65dcc1b62adf6bc644aff83ade46bd5ad3055c58265d8c02b9b8c196e4d7dc16d6c05b74b90c5cd0b57d8dced26c3e2b7231bced66a10b342b6875b111eeb0304f29ebfd07bec89b33ee83d96c8f428c0a94973e2d68a9b8c8949ad32b7db094c601eb6235bcb08a4bb5971fbdbaa3723b47846efe834d89f5454be1a129fe7f57abd6c3a0b5ce38281573a4ec9893e44e6410b8ccadeef2e300a7b9b9a6486db97b30ce324dc50464371fb5a9d76033225feeb946a898689d8c9122c8631c619dff231364be6d4fe4ded87f3f221006ebca4fc62293a46665d491b6c193c235e5e11635a766a03dc8d737b5ec1f527276daf45ced813c3a49ccfb029bbc8a8f9eed6626590b1f8796166945de058c64653f9bec0ec094757492083550a260593aaf6257e01095860a55eea97f0e1093e60a588840e93ea0e93021d26f5a28aca619fac91292631b2c8228b94c9250231609ca5b98a22c731c9906e39b1d07cd82d99f9b9008902490dbbd592b78f342a0e91f38b71c523de30aeb020c22bbde2141c302a2b0113cae085abc5556c1df08aa441d1fe81ac9134b246d6f0a7943435f4884be329f35773f667a65bf2481da265b3d5282c30bf45bbe7dd92d91066c6cb8f3a2f266a185fa37315c5c9715f1fe1ceb2478d43abf6786ea3a26621cce5f66c58b78730aadb23bba42338c5e43bd7e49c0d4d26a736ac266f1517bb7967a4319e534c6ea262f2cc9e7c364a247af45a44261f8d1ebd96d12c525b7cf4356c169c3456f19ae6f9b2b3cdb655ec565cc5d823bb345e18913b73c8723d34a60a084ed05f7cd2b899cacd404ec9aefdc507fa3e9f87be4776699d40d0d9967ef1c6f8b8482fc09f3fa251946a9927e36ccbbcac94c1c8327aee1cf719b1042969c0b0210d15156fb3215bcd86269433a3fcf4d5297edafea87f1a8dde2b4a33ab79780bc1788ccb228d82f1911a3cdd02d1f730e48d64cd61e648afc4743a4b9648560c1872a65161efc8273ecde369795a9e9694f9644c839e670fa5eacaeff49246796cbf9c20575e78167b6141947e6c7cc56be33733e20294722836e4c0cbd1b81c77d9aaa674c52a34c29f4c3efa4e1d16dd32f9e8f1bac86c7884c9a5d7c263fbe8dd62dbf2d856ab0a6d3aa186bd6a4ac35e891ebf30bbc80673a2efe4e21382d99366e32a35e7d45983e8cbee42fbecd6e705f497255e96c87030839d14c812895fe2b4e40d3629cc12c9a13dfec3fcb00776e7339c065bdae773cc7b7a60573be799ef23bd82c5219d22bbd5389eb862429d73e2c880c60b9de76b1b4969363dbda2a9f16aef2143e28a456abff3e311e567407170a5ecc1952d787b2dccc5aa7ddc47e2e524cd3645e7cce358d1a85087ca8d9fff9cf8ce06e5b32ccbb2ac651aec1f47aaa701499688e1ebf6682f9b6ec979bd405ff32d6c96659e6b9fdf0f0dcaec934de622c7518ec69651748abca4c9a4681c66a28993b3f49c430db955e3d18688f79955e5ece0e8b45e2c978a25d39ab939acb7401c959006eb776633e3394d6eb2435ed28e182420da86d94d6ee2128146912e7ff2edd06ea3af264a22922c67fa3865f2c5cb45cf6444d2a6a665d1e4932a936ab22346165964714d7a48a7c8c798a451279767b9fcb6a1dcec618e4b2a77d2882b1bf6c86e7693b631f97ab529a1573d248660c986a00d55e2ea216d1b568fc6ac85475cf6c4248de2ffe4cbd123bbf1ab46991c359f99603d32932fc624b2cb362691a39e217dfda341f99651354ac634ea397386a6dbad887386ab31b307b3619c9a55cca212e2c0f2f014ec851b959ffdd028296fd22cafc143e22393e2b6282a7659b3922b983de1c05ea21a864086550ab3722553e461529266c6249206756a9dd7921a4a1aa9c9f82a2342e52b1353d86344e00099983a65f684bd88cf41d607111cd83ff694fd734e15811d74907d59a208153a4861f694d92140c7ce294e653f7880b49906e533db320dce22481a1c708a7c0fe810aa142b9e81841ae52aa47166517364e7873a788a30ae26ed8c9bc21362cea87d3a788ac6c9baa584baa2dd204d833175ee689a2667a2a06559964d1ae9840f54acd48cb623def9fa3516b27004566a4ecdda2454cbddf7f239a6d9acc18695054d10483a382e60c10c0b8b2864dd0ccb8930a8587208d203ccd379a2250303eaa951411754d0861c785422089d3579b64ee1f2c86e18555f8c5109a961ccb9a21fbf2cbbf6792de7d80322dece765d7ce2766729b090e2c2dc2fec2e17c66f74b3a1123037f69097da4882c843863dfb68b4a18eeeaabc6b185551d5a838537365e2941163e20f2fd410bcfd1d2e237afd394194d91972fb2fb453312831d3341da44e09d5196ac83b4ac815954c1d41ed36c5dfa6bd89a0b2172f57c071a3de316e97935d7ba8070476cd661d966197a39d46e5e5b6cec371ddd6711e10bc792827613a624e60afc1565ca8549842245243ac26f2c763de55cdaac18e37c46ab020d10a9eb16a14739cf6c4b6716ebc2cbd35513319b9221f5f8d83e560368db2c213580d16a4573a8515b97dc5156a5bd160e734d88d23e78d5c91d186acd338584d4b9bc9c8942c60359ace651d2656052e864816ff107b66ab0923993abbe725b73f2ba9573ad55d19b7513c5a7a41c82caaa97de0116ff482e02cb2e8b01a3dfac6201c7063334e0d2be5410d2b0a9a45ba3ba8613c1f3b8ac398e35222ba9048723b5a1191dc252c63f45aba063bb36174c5f9c59c06fb1cd64aa25db3648b63194ccfc90dc8151a3a738c4246c45f0100cae51525644a47286ef7f932b8c687f2cd15ea2988996336c87c593adeb8b8f99cb3c3bc162dd3a46703743db65fe1caed2291877ee522970bfb15e476f461b68079e8171972fb2fe019fd30062162e107ae17191c999c9b1cfb43fac7d7c48eaae8f3ec1442a3503d76fb64b477cf02a183ec12a722620af4980259992e15bacc4cc5802e029aaaa75f4c490fc74c85ac0842004a81de298fc700dca5d7d281deb1015a8afb79d82fee9eed064b71bd47c9b75f92060d151510fc4da65a3f2dc5e58e84e99dc33ab2fc78ba8f790637a368706a932602309a8d7977701657db805c9129061b6c70b26686793f666e4b8c74e9e70e2a7dfc7490eea467aba3c1ee5887deeed33137cff621d1dfbe01b9d27db39d4ee5978ec6e1e8874483ed9943a53ab887bcf3d23a6ddb427a0fd5d12df49e6f030dca5467e74aa66481456edf800e24361bc6eb797b2e7c3dd4a371a0353ba7c72e2a590db61aec235da8d90cb6848b2996b185e08d8a4ac296e9468551a5b2e2c6f44aa7fa89dbe73629d478255fab1aec182cf455a778962a24703173884e409f0aa16d7f88ea62e4f623c056b02be26008110d9b34662cafd9f861971a9835f6993c17bed3f6c0aeb467c2051cabd42aaa3073fbef2ac8dcee2aac78dd4ec1e1863240315115bf05572ac61b5420d8363139b3ceb296d6580846a05bd3ba3beb6cfb22d0292e3f34183fc4467b4caebf215c22f05dc06bf1582378006a67d1e2cbf56ecccca551d8e3233044f7e34c625ecdfe30afec3e6d5ae3690d071ccbe03ad565be8c2362d81746999071eebcb37ff44f37b0394d189513a333a87e987d32636da7b5e1e49602c771ed8844833e6caebcbc42ec8e31dad6d14890e8f4babb9b3d02aebbd875c7cb9d6725eec482c0bc6ddbb66ddbb66d7d83f40c4dcdcae68695a392a979d16a3a886352a101aa1c345d86255b33392c9a53c3a2352f167dd9b0a80defb028efb0288b7aa49724075d0eba1c7439d038fa6d3b79a2d83c9eed73a53aa99945a6911f33d243b71db9a41f399629a66bcfb19d3edc6e6c96b5f74f14a551a104fbb36ff7d05f40bf6e9a8e927e86c233e2b96fc67c536653ddce3edf45a69e7b416c96c689e304ba845ba12153ba77ae447143f5a2646949a34116794c6218b52cdd324a1a2cfd821f72c681eb0f7b285d573b762e02a1bf88bd349bdbda4aa660f462581833cc62b3ce195f5922803224e786342e7692e9623cc5c5b01d2ef619bb5b4e38441d399c70d0130ecf8b0726c53242173a97b17eec23ac110d8258a02940add1856497de941f8609c161b8d1e690e7fbc26f7041185429edd1b3e1e282584aa818bdd8cc217abca3c7ec13b2c99f4eff9448bfd8e7d2156d7c5f891eaf7b7a14e2439217fd924ae1e8339a30f7f485dacd0d47d7215d5774c9b78f5ecb67c405a4d722e539d24da44f93231a6572369df469b974944f1bc6388cd3e7e75388ec7decf1636f64d83bf64f2f611388b77496965f88bd6dbc9dc7bed3e935424c7b3a61ff5cbe317b43892bff79a9e92fccae43974e2efbb6394affd81cdce575481756b293fbe8d30b427479e9dde042b687bcf3279736e4d9a0b4610cdb43b62701d349a4874b5c92bc9c242f8810fbd440e7914ca49f9048d2ce68c313d2342159939f18d120e933398cefc4c484a73c8171f680b84083dc9d630954d1fb5c7c9675e7648ec9a735fde49ce99bfdb9fc4e9f5ff861ff9c6c28e5977d0a513acd3d8927f3269fbca2c139852859db7d149b4566d8c771f6a7c43ef985a7ebf0ec4bc2e6f08210bddf737efd0ebcd444f9cf5964179e2e43d2dc70f453bb606ec7db75a2c3f8e695f1854adcdcd175f8c2979a3bba117265a648d6c6fad98f5e16e2397b9e24bc1b26576485c83cb5d90b740a9fbd911dddb4e69c93e3da75f39b14b525e508e78e6ea46cd4ec384cba44ae46ae6c0d62cf02a492e9db4e229d904a2612e905b7c3e9703ad8c6c92ed660b466c41ab546471a15314e87d3e174402cec9bac06a7a897bba39bf8d38e784f2e184643aed433d7bbd1a87674435b582bb626540c0355c163629f5fdf1faa945d8775ece2dbce9e055abc857d892e581284124da9a614a451a7f34bab4691fec9b806369a2208f3c09fcb651fe8460d274504b3a08b2da1968ed9d4cfb9e66477227da38e5372639fd18d775928a68ed3190dd16a4636a3d51685d1ea72cb74b9d2e27cf0825858106a4985712f9ec12d8e3dd370ae942c9d50e5e3295651e38743fb665fb4b614f0a440ac0d0a35723adb13aafc9c2d7e8b6fdec81456ce6c192153f8480d695c0e47525cfee43147adcbe7e88bd1680483830103c6c7f7e38d50629ce340a0175f6946a6b4f7060fdd3c5fe05062bcf37e685477be8b5cf1ceff616b42ed1bd2e8340e3b0ecf357bc2a17dfb86d2208f6e26caf99344ba39056990bb7feac660fcd843538c71329aadd98a71792ec677138a09c5740e792db24ed3a7a52b9606617ca78fd6d8a0d6dc908669d5a87014840e3181ce7d471ffde42506b1463792f58205627972b6903cc52b6404bd4053805a8d3a718174404a404b7a85cbe0021de18370222671a6157c29716a08624594af34837349dfac16ea648e3d94dc4e17c36da1898dacf8480d6611836229b288b93c6235eae4f247397225a692d49c815f3afc510b9359773f7806bf3fd014a016682ee95431717a2df3a68feffc76c46b522969901f3fcfe934c876c4b2dc0ef68d8c34c8b38b6990cf2d6990b946d8b774661f4891077ee99d4ca3da0d97dffde01af1ee346aa2b02c3b29fa30ba611ef8fcd14aae6cd68868c3be21e9f268353bce8806fb18861d71c230d3cae8c686a7ef88cf8806f9f2bbc073e68db8c011a78fafe7b5bcf35cf81a218f90a056831ca9508d38e2e43c5bf5f21f3bab0b3b87fb19dd700b4b3a8b94915b72f9a52fec4c70f9275f48afc917ce4bfa42fad11bfac2792be81b0591dc1fd5961ab1640a5f2aa162d7669f3e9f78f9d817efc8c8e83552c21f4dc1cca39ccb23d7e55192cb9f4cd21ac666f4be91914e613bbae1410d47372cfb13399df8f5e594342a5ce2ca67717e22a79371a3a66c8d73680d0dc2e7b9b52ab78424534c2f4991519221973f32326a8d8e5c3e57a1841aa8525c7b2d369541ac0b34ea7403bbf3d89db6e32ce4020512ec86201688d5289eaa38182157b49f8478346e0e36375e4ee7f279b6e611be11fc0b702ab57dcc299382581f688a06d9030a41accbe7741a158e6e9434ea971f732a77e71ddda05c1b7458298e6b3432bfb9833aaf7d9cc9d98259aae3da11ab411edd34c8a31b173ab361a2e665800c0ec03007c89094b2fc3cf2a72d649dbb6df24a34aa6fbff4773b0ee9c722bda2809a18d328a6420a321b27bb0d12884674673950a8f421b332ee4a34d89c7d89aa069b776e04b1e53871e78f762e96a5c1e61d25e8999b526a32fd32d68fc7bc18a98baccc0731b22c465721bbe93fe9fc4e45e5199affeddf46957753f9936ef68dd4ddb22fad896acc62f9a15177919d7491ffa151990e52f7298d3a48b7b9ce39b1e06bd9e71bc5576ef1d2635d582e8b4ba35845cb6c48e34acb381b15b89f9333da9e1d6577f76c19e5118e7f39c618555a3857dc9861fc468554c6fc9879e88845129888b90ab89c04266a2e079224db4396b194313236aa46d07f2a5ec69c9addedb2c894784a6bcd9a45ae441a9a2c8f96b6a70b2144e6296a4fad5921f4f4c69cba5da6a2092f48b186a61d0888744bd3cb291ad7362469dd97a48b591a5b0de2e5789e115f05bb90e80e79e788d65a7b820b938f383911e73f62e50dc732421953262c14a38dbc9136582808cfc05ed8a367c383856cc4e11958b422a741ecd1469c06310c0d58cc89387225a6b07bb9528f3dea740ab063a0636f15a60306b17320d161525d77d0717420fb42248a5ee416b2314983d8eb37535c77dd270ffaba7e765e0d62f2f545c8575b445f45a6600f7dda658f8899aa36ee803e5fab640a76ef639e1182b7fba40e18c58c1deb1430881ddbb07bacb46910c322768c5a6c0b4b6e86829a92ac08133bd20c0baee7c03262c3a4ba234c2afb6447aed1d1884422b75023119dabd1902bd5f4cdf350a5a52aeb980635d0b1771f76cefb4ea2cf475f5f4428f46a7d10c1413aa77c7c1e7a11de49d607bdf710bd771fa17fbcef247a3d4ceaf3511a7ab52ffd903d895eeae945a7de43f685defb4be89f2e143aa5d42e7144c8b2c814adbf93e82af53b892c0f1cf52490084ef549f6e5a55e3b4c8af450856459a674b5eda9ad9d80ee43c89438845e8f7d5ce8834955d1e947451f57bf38531fb22f2f512553b4232153b457ab69df4104a7e889e054a83e8c3355a5d9c41a9b15b509630d7dfdfa62a307350cb9645cf68400c0fdd8906b47bcf4a21f8da226f4ddf99cc9e7bdfb422f1b72c5b8c917865cb525f6a171c90de7dd80c02eeddab38172d043aa904e6dd50d7d21158cafee6c6ea8a1877527f4baa4c136d430140a8566ac47a64109d4eadda821ef46adb59444bc252bfaa1a4d2875d4b755f5c63f4edc535d8503d310f45e7364f02a31ba5531b3d214a0f2569100026ff42a52f89784dace84783ed5135d81d13a4d7b5d6102ea1ba610f7a4387718fca13037a74c1813efae86db66b10043aca4bec5119aaa3864a737b74ab6b718df620b9a487584d77c4895abf3df45c71854706f4956ef2c5db2274479e3bfac735e847a3475ee1d4e82dbc9691e604cf68199ea153abcd415fbfd9907e7be90bbb0b3a47bfad5a50cb6659e4617cf3665fd837dc3c4a6e7fb4bdba181f0fec862157c4094751d0ff5cd6c1f8a68eeeca7871960eb94248443f76548de2ae359a01afd9d0643259db895ca328ba47417a34a4898c8ad4ae758b9073c32ec9d6a5a1869da7fda0ef5a946e569369b0673a01fdd074066d46472a99e9ecd71df9ba56c7ac997ea26b6932dc1de914ae9e8b5a140a555a2ba5f4b6d6cff3d0a7a36fbbd60d849c4e4f3686bc96b8da4ebf01b9223a3d1272e5f41845a34a9701c0a597c1354e42944bbb5ee91979e923fb506f220f7d93d3d346914ecf5c6374badd136bb687b1c623e3baa0d54df4a1ee441e506c5825c8cedc0ed9b035194d06f45310f4a1876c8e794493695468c80d75a3d148d491bc169393bc16d2499e8dbea373a4ae3d1ba01bb25d2b8826b3922b7227fac01279e8d71836ac30ecea36d7b5a48a25fac0ccc3e7b57a52f561d617b15228068c3b5b21988bf29e11b2b3657a8162e7911cd41d40f0f4162d1e532d4e2d5c5c746af14eb58b1a12b5b0cc06a830b7f43e0925a1be4d8f926fd7aa3664294a368441c2ada741434505047f93a9653a87955a8d3a31d910a6f431cf38b1b3d560b5f3c8170abd1a1cd9900b07359c2d08843a250af5431ff38c6a67ab87166ae7914fc8158692dc7ed7b578cc1b6a32b1a6519e37fdf6b81d5940837d1a5d4ed7ea701aecb06b75477450c3d96add7964d4225b22c2542d2e61051c2ba032ab083b97594458728bf0e3725c254665304b19bbce23e3623132772c0d6a9aa6fd870534a85966ea12638c2ef13fb8709ded6f87065db487524aa979ba047503ef5d1ad5f173613966492ef1d2b2b8b8fce082861a326bb2fce032df8f80118da24751424ad2dde5c6614bb5f0e5320bc9b04fc8b43f744a93a086f4a2a20ae3867061e8d85986908f88e7149dbf1ef3924ea6ecb2d0410f3121da392c742cf41c58e81de98ca7ee7c397ef41ec618637cc54f7435f87a45fb62666ca2a62bbea22b22119dbff812a9c22ebee67c74c5970becf89db8e489c9ab51fc3af94ef3f3ce9b7c42b624a46ff4b5151dfaa2cc17633e99a7342eaae4cacf50c3a892b913ff78df31272e593523a32a6583419d99dc56545254759ce9c9368c3451d55ab47745978caee7dcb8904425913932a3e8b85e9c04c96f9b649850a8261201a53934b7df1971014e2287b07cd123efc9b0b3b4b4d94e7945bb94431a5c79ac1c7269135756da58b95a491b3944dac8d59c2142cd647846674e642aca32675a998a73e46ace304e7f081c516aaa28f92c9d73e53720573ac76a988d4cc9321cac087683d96434f34e8bd5501bfac26aa8aa26c88683b58c02bbb958ab75a49264304b1bc673bf62bcfd6a97ab91f05fd1f6abdbd557a8f15c2379b978c6495ecb54990c4c8acb3eecd339c96bd8ce95d97160cf4e445a1cd9356bb19757ceed21b0964ce98d08956f832f2605cfe879962d9982dd60ac68c3a9c26e6ad8aead0c95761a0b3650e33ae20aafdbd74012669d86b8f3d25ed958d3608c354b6a8dfcaa511293524a1b57b1a6c1200d76ac89c7e4ac611b65e24c4d7ce22deb6479844947055ca0311e61bab3b339ccc971cc31d2bf5133e467a6b999fea198a63df62ccbdee781dd1ef3c6a952a95435a9ec5da6d96aa914b1a966b3d86116982a1c69cac64083d222b7df8198993b6bba89aec848551933e3d1124d6d026b0c918e4fbb063b9e3d9da595d6063b7a9e471bfc2aed988b5e4b77b7af459efb5ad89ee4e30db11beff14caf029cc2e2e631d188343a7be6b508c12c4aa7b4a9a565516a02100e4b6b3c43d97fe33d6793090999c2d91909b6b5415327a06bb3326d8a90743d671bc66bdf4c50b58e5e7ce44cfe0a4f480c639e93336c46d93899d4dec065671921c91533693a01bd71a1869366469f07cfe8ef98359baa92988666d6442bed8c823fad8a6d14185f4e9a06bb463e9c34cf216d9c349e1999e6c79a0669bc2066140dca1492ad61fea4e9cb511a4a328995d25a4d266dc67a4e6cf86373d26ce02d42c5153a5a0ab415d41d4f1635f486dc0ec48f26fad04c78ab1db9121ad2297d7e48c37ad2ceed8786f48aca0ea08cdb10c5146d484f489809eb202157ae003b1daf76e12707650365642a3b8c70704638239c11ce0807675453e3393906ca4f4ea8822e693faecf0ba42259cc62241b24b806dbace4cae934c476be44c0a4b20ed9c81598102bd4baa7b86dcf1e9f65e7eccba95f4ed1f2208253a6972a53284cea2ad1f2c0d1ddbb675f38ac280f55b014a740ef1b4ffc21644ab3e58123fb762238e5625f58644ac3a49ee19c7058221c10720ac29e62aa592a55ea146dd451a96eb354aabb5995f7ce02dbb3e3e0fe792112ed4b4c6de75814e094674f4574cf9ed9d33b3b6b644a4f282a1fe5fbe4749d8b16a6330a8a15d51393936866762f484d837dcf7a333285642357482a99d2a7b456928a644352916c48aadb27d99054db76726143f0261b9ae2a764c32ab2a11645b59d36c464d2b490d8c13e642ad63ac03592a8373ebe8fc47c410b78d250a1ced35391ea865672654469ad26d343ab70840393c2b41b2d08c6c5b84da18693664641d3a8b0c3612f88783e0d315dd74855a2c3f1641a1cd5d05a43a72236eedb39c59aab49e30304dbbbbf74f6d4bd6cefec66bb1d9942e474045f0dac78d2308f747474582c9668869e5413130913cda06166d6ccd56471889ed89056131b56932934e3bae045430d3f39ab908b7b5f7b62645b644330546d149f20de87746091db37a27d535524767007683a9c50e88349856e4238260eadaa1a3a1d99d2f5f5551d9ea1d9d05bbde8159386268a59137a5c3309f514756c60659a3471d2f43b9bce2676ae0d47ae64973b72e5332f6d48addcf9e4c47ac38c0cb7cf9f1cd7a409b599b96a54e871795c565872fb1e2493268a39c49304bb9951cc9a4993c5210df63155f6cac8c02bd12653c3ed0c0eb735263e391dcea4c93e397747a6cc743898b539531bed098d469bd176640a5b39d320ce0d3d2e6d66dbb2504339e3715d6963cb197b8a4348ae6e892c638014d2c6e6dab84c283b806288c422184aa3e8c31d2e4f1bf24313dbc7f94675186f6ab0a345f9c2c9c518b96d8b5126f2c091049107964a20891186dab6f96c1a2c62c26cdf34181f4ddc46e0196dedf943895f1bf98c93bb260669b065106a68aa8935d22648b70b79136d6c58fd29622b3ef171545d29985064186d82f4ca2cd2293d8d2cb961b491360db614ea8c35364bae2cd2603f08cff94132494d92115d4839694417efae51266f93ce6024b63395489d4e126f94b111498312498b7f9e8525dba36f44024434c1f877e69fac0a89f4175779615f3ca3cc29269b9dca953e9b4c1f9d44b77f564777492d3eb2e1bc9f7f3f7d9d1b2a8aed212fa9c5b78f8d1cdae725d91c2dbe873aba5bfa675d743af554fac986f1c795d2647394da0b82f47961b3976c0eedd8959e10d8d56cfcdce4d97762b27152924ce73876279e0d5faef7ec9397f67e30483ccf3bf94867cfbb4cf4e1e4e4d9354dd34eb8abd9134d7b946191da277ff2b1b424ddfb4c4e1e65488f243839e9d26b21d958fb897be279f345fc71c31e329e5e702d3ed33f1fdf169fe73a7cf6a5efc359fa795efa3e254a840eb73a7c9e8fca9496e74a1f6db0c56d8b16a6b367c3f41667e9cfeda7c377748b6fbb7411ea3839b1b1462497cb3eac85497edee51792b22c96ae699a6d61927c62431d9f0f16c25c0c7bf6c50bca6c0f0db68be61693d36814e97d8e639417ffe8bb74f118973684f191778df33e4dfbf782cb3af682285dbbf7e9b89f9377f916a66b270fe9fd9cd850c73d79d6856f0b6bd22eff094f1e3a9775f2cb4a972797d9bd2462dc0ec0dc937ba4fbf97c4eac7779efd2fb3e2f7de1c9b7635e045cbc74cc7389d7c5b52ff4feb19d1baaf7ecf59c16bd09c4fb29b928591da4fb614f0817ffd81c2e5eb239be6b3a48a1677590ae0b3bbf20b01b9fe5db1e52b3610c3b61d81ef2bef8e9d193c08b934e7a91659284794184daa5772e2369cf2e5fd8d04796d9e9d9f02451507e3a4b933e948fbe138a0de325995ccad339d2e9f48d7a68b04db09f9c8bdae567f230decfa78b16a7de4de73e975f462addfba2f7c54be50abdf4cea6bb30bd850dabc974930d7590aec9b74babd91c263fb1279f8f35934f9e3d797269b221e97e9e796ff171839ef72c73e1c286f47a362c7d7b8b941636fc7c3b8b2c7da18e5bfae733699acd2183c07e72a265972737c9a1fd24ebb0a854c61b6af71e962ebaf7e538791b71c3ed25ab83744f1eea205df9ed218c76f2999c459a7cd8491fdfd137afe80b7fb8db435fa8e36e57912b33c551d0bc202b849ebd254829224960df3e158ebbc7952ff1722a5fa8f2a14a0f16c6fb781ff6b4ef37fbfa3216af4a0ff49be78b5493510641274f694d4b344c36019083253397a9b82c05164cb81c08e4ea1822d9411e4fe3306b077d22788ac866431f36773bc7752afcf8cc82fc68a3cc7768b055dcc3a8e23eeddbe7798c013b012a9d00eefd1d5438edabac02825668ddfe0eaa981e22c7a0d795f54cde572ba9f68c0a67a3aa6752180395a58889b9e065294260e42a892aaec14410da6d10b8e0f3a1360477c0d107ee1b90b1c606dd39f6361b1ac1a3eb112fc71dbb7793bbf0bc8f1b3479022a76efec71666a9427c4a7224b2196d8f450ef1ce66198f72b596240c8bb435ecf32cf98e7c229fa42d3ed7480d7db4eef42f4905eb3747bb40d46295416627b0e36f93ca7719dc6d9309a7c3ac0af933aa8a4b325912c5fee479df3dc73f0ba322e579183296e0e8a709fcfba11f7a3b60ae8a3af2ff783bbcb2f806bd04b06b006fa26fa8478ce659de8eb6fdf3dec3de2edbe5dfb72749fe738eedbbb8fce73f31c476783d18a0afa703d78f1f401cd0d4db2aaf4c075e57b6099b9f228bd125352e5926e689a5c092a183912d46bf22995466d0bb892a7b8f2288d0ab1779737710dae91033bf790cef9eed817c63b314f08ee939bdc59dac3ba6f92b46fda8e366ace19affc2c11613259b5103972e478a6cc4ed49059f12e2e587e90974c2b96592c53e9c74b2870ac52752073f9f2cecd2edb26beae496ce7b6ce8c3a32ea50934ecb1885d88a4e608e54b81d5bad231849c8edcf39fff14ad7cc3b6705bb8b3dbe381928a43b674ba64c250db604c27b6ca4b6759ba7376bc02b5149a7b40e6ed491a961ecc9fd0961301de0958f494057daf89a37864b5c6eb06da88b6315e6152c74331d6e1679900fbf9b5df461dff6ac3e7c8b9b853c28d24319370be3499f47c657d0c7b3221bb2d1769745d62f8c01a2f57ef2ddf6f8f190e75ac6fc6ebcd4e1c66bf6ca9961678fa57b65a6989b4a3896119b49b17bb033b14c02f159d75e1093669c7941c4e63a4e1f441fe2e5739eed597f3bd745aeb123de24e8edf3d432ec7e1c68e397de386d486d67c1065b40377e932a0b70c171840e256266a25815611dc9f992a835646f76517b12901192c0daa0fc959eb67248ed1b665c07e1e36607bf4d2ba3c124e20da310f53e5e93546691c5e5ba2efad04c741eafc573a32f37a784c165cf468c3bed8e18d36b99d73ef046dfd0c7d5be699fbcf34369d308ea94f371b2a671c697729de78b1a273b0d08ec8b9e674b3071b373a19cc3cdde60a3bc207ada6810501bce478d7a42f467f6b5112ee6d970c09d76870364ecf9e940df24b23bdf12a50e28885c71027b1319965da650b046935c7182be09ed54b34ed0541319cb140c7b1689846a835386ba06a7ed2a43d3b20b8d91fea469171a23b3270ac49004e5321562c0b9a1504b2f64e756b72d140a85425ffdf6559391c918948c2149cdd5e172126292d08415f7bb9c84266c2e2b0b99fbcb2c392cb1a20e1181aa899d2488e0c80d45ae46852123b7a711a9821b86928c5ca1d5b6854e87dc7e901ad4707bd13cd128d4f9baf05a5077a149c0f9b6f05a1270179a1eced7e4b5f470171a049c6fc96b41c05d801ce07c4fbc9603dc058801ced7c46b31c05d80a89c2fc96b51b90b1017d7e0cbc3f98ebc161eee0224876bf02dc0f98abc9602dc05080ed7e0bbc377b80b9016d7e02be37cabd722e32e40585c832f78be20af05bc0b909fefc76bf95d80d8700dbe333ee32e400870be9dd74280bb00a9e11a7c0170be9cd70280bb00a1e11a7c0770be9bd73280bb0049395f8fd792721720325c83af00ce977a2d02b80b1015d7e01b8007e02e50ec700dbed7050a1daec1575ede050aecd8a7086a385b4a3eaf063f49688ae870f65a74d0e1f4fc69e9d7350a040aeb29f4d039257a88724fa3f32dfd443a8790887428257d3c655cfea82472e9d4ba895c7d0a21f9422e912b14da5ced44fd15e984429b0d453bdb452e3beb89da90d23a24043514b942ae4a236972402b1b3db0bb9dda2a81ed352442126285acc8257a750240ab57a38c346ab3424e6f910b0444e84fdf98a8218ed2ed9486a80e52dda1b45693e90741159516509146519b63f41212b754b2a10e1d77749a8411c4dc50e46a142741044b6e5f8444a4331a6da552a9542a954a4aecd8acc9a90ed2a5070dc9411f32791c86d8d86ca8dbea4dad37f5a6ded06a03343b1a2a72bbae6ebfd2c815110e8d0847e4e29d1b865c53d0ac685634456886d01469a26e34369fd7e58a8271a159354d0d4d0d8d8de845b3ea15918b26481456d42158fc88c3901f52b0a146d3348dc686a608cd9006f96a5e8b0b4d109a9a46c1d0d4d04421720111af0bcda4a979515aabc9f483a00a0d1a17abd9b66ddb3e391e299959e34fcec7f54162f2c8787e786454d81594d66a32bd06ab51a11153c3ae55830a13ce8d52ac0675481ca87821b94cc56b8a8bd5c815ed0719acb8a1264305198eacc4edb58582c4683a2f250e58dd68467a2586e288a104b743ae2766421bad378d0a432e238d9229b87d6da6bb1872c99553284948a73b7da15aadd566b41ff2a68a5c8dd26914a5ef8b908c548d3ad1f30d5da4043444b4531b3c854e210b44df9046c54bc9ed1bda68b65dfbd1a8ed03818a504aa9e845a91521d164341a4d0b420da5ea36ead5a8782ffdd194be144027b544017452a7d3635e0b35c21123afabc9684e700dfa3e2704bda1d3f704b59e262382facb2c1a5c7143acc6c5f610ab910141ad093519abfdd83e9768321ba6aad9b61a89846a85ab51b747dfd05da0c8097d2e50b84060c3058a2bba46857587292d43cdbca285da584928182b5ca038d2a8f072d1058a23564081130323b7007504495cb0c4054a503aae285e0b3d8ad7b2591728ae7809e7a5db665986b68da29cbc0eb940d1d2645c784268596491c54ea3ea9246851e99504cf461c88b6b308e5ce157b7f399a25113a7d3f1549fd6c7c887e525b95e8e87a4dfb5ba23328dea3c9fc17edc95d0922b8ee07c3e1f8a028b3129b94d73bb2792db54bc8adc1997a978c5dc52e9a673d2f33ce412b9a8c631a124c6ce925b1a59fa8515895bcf2694766ea8db4d3801782d27313c17be279b0ddd84458e3e2d005e4b6763adaf064b7fe1b9f0adf6856743fb0ed6a68e4706abc182f40aa7bad2971e6235d4ba5a4aa57fbed2bb96915b7a5b714b8f71e4960e234e714b47b9877e3b0700af657bb1955e3ac720b754d36029c667923afd271a25672e5fd4e742f304cd09cd8f4649145cbe09f85c687ecc98ccd0c4344a9ee0f2ede173a189a19121d1c82c699434c1e58b80cf05c8121ad5c873a151296994fc71f91ee07301a26447e4b900d949d2285982cbd7009f0b90243a21cf05880e924649125cbe2a9f0b1024affabaa251d289cb9787cf05c8152e90cb8a464999cbb7009f0b102b723e9e0b901c20471a254770f9eef0b9003982e3792e4070a6689414c1e52be373013245ab6b1969946ce2f2053f172046581cab48a364cce5fbcf0548919bed6648a364082edf199f0b9021361e9b208d9220b87c09f0b90009b2a2ab281a2599b87c01f0b90089a246f35c80d43cd128a9ba7c07f0b900798226a301f2a3519dc5e59bf2b900f93183792e406680c434aae770f90ae0730112034466029159d2a896c3e51b80cf058a254054d27301a252d2a85e7295ecf44e9246351697affc5ca048a2e302850ecfe0eb02059246751c2e5fec7381e2c535a20b142f9ec1f7c5b500f04ec5e9985c3507000f399cdb2a99b2a236f546c535c12ba591c9498d3a797f5bc2a938261805fabc8190db41220f36587130e015c7025e9980562b43963ec451fb179f2a3983441fb657e4a13f835cccb4aab91d8e60703b468cdbbda20f9f9cc843df6343938d26335a8d6470c3ae0c37b72f8203833b9f488948479444f412217135289203a7e44416984c80d5345189f0f978dd39f636fe80315eb2e16fe97a37a1d4844dc08b7638e88270c0a89316173da4a710ebf30ab15e2116ebf699b93e6cd52834da425b44a2b9e5872e61e42e6173e9b9413a79227169cf38e767899a1b46d785f1ca4c774e4e62f55a4e46a34bcf79ba9369a38d4e3e6db8d7e7f5798d4c2d4c2773c6e78e38e32380fc42af5092eff3f911600601241680cbcfb17972f2b07e9e9327d8e91780cfcfeb8749ece4e4dcc91780cf4f349b6933577335874c9bd107f4198d48a451c8bb3112793746a1d1c9e8c4a3f2c4bcdf792dd4823ece1b7d3444005a66da5eb9ec292010c86b81715007fa46d74e4e4e4e4e4e0ec36b39899b4eddb6d77a837eab1b57b7d1177640a0bc7eddb76f00ec496ad3a850587768770ed47d03f8a85c71f1ae2e2c734ae92d282d7da7f4d0047ee3149ac52497f4f1881c66d2b53e1f0facbbcd3363ea4db5744e554be764077ef16a19d75cf4eabb3278cef34df09b2acfc3a98a69b0bb968989c949d6e423fb4b2add7af6247052ebe9b9cf677af799dcfbb4cf8ff4e8c1588d46a3d16834aa377d9f9b90be798e93a85cc510d5d5fe7a93c967baf69d04e098d71280639e005adc1abad5736b7d8b6b3f3929e4ea1a3479e819c1b8896bb0c9e85d2bc60960351bd201d8b0de183fb1614db1a1e9c6989e8d5f8d14e326e75c782d2622af029c3add641443fbe8303e8e5ca35101783d7dbd89bd9618ff3a3754d361bc9e2b99ce9e00ec8dbe3b90b887f1e849a03b8c0fc687ad6e985e6df48480f1612b6c483d4bc3886177c4abd50fab31612bef0600aa0d276df02ccd305a50724daf5948f9a1f944f109f2597d867c7e7c66e487e613c5a7a6c16d0ef547a342ed30def7cc342a8776d3fb1e19ae11e37d8f135ca37e07e830ae7d31be78a72784e9d5f47aaebb5acfde8d7ad3593ac6c7577b77c4f475385d4e7745a7f44dbe0e4983af2e89663b2b3a6a3c3f21cc75a2728394742b08fe2613f7b69d7e9a8bbe7e1a95432d3dd46466c7959edbac8c06a98c52ce0ff38c5f4fbca12fa41b5683d99625ab22b7f405dc520f3bdc928c1085744be70ebb5bea975a4a3656665d4da69aea4de0c886570165d752b9b485450db7178aab58d5dcfe1601be5d83f4310e72a5720feb8d5c8929efd548afb468d4e86dc53d3dac476e9d42aeb4b0a0954cb1ab936599e27926e71846e8c57d3aae3de8a5ff782d30fef15aa8ad1cb561ab2ead1b85038c87be50e87543ae06bb445f3f062337ec5a8d622ac650642552318699d0652ac4b0240741b680e4dacb556c8175eb394e55ae820b4f5cfad2398ef35a366b776e6f70a8a136faba230d9a7c7c47485857dc7456705cec606ec8f343a745e852cfa52b5dab9e2af124502dd5a1962ed9766a0ead47bcda4c833b35477d8f784d1e86c2ee737602787796fe7cce09e00bc0ec62bcfb02208000f0fcbcfb7cde678c7fb419ed096af2b0be3bb7bda1c66b63be9ea54dbe1d51e7fb9cd6180faec2a8b4ecf3a64d903a85666404010000f313002028140c888482e17848a2e921123f14000d99b4527a541887410e29640c21060000080000000020080200a4a2ec761fbd76f04c60e78dc1a2593f6e64c2d5ce2aca8313368838663336109de4c3af91fc5d135954b7294119b881397df3b8361b3a50e0e18d146351acea78e7fe998465e6dc30b4955c50a18bee3f1e0f57b404002d75040782927fba2491757794eac3a6b393dd5363a1a2ab729ce9895edaf57818ac17f6cc687095cbad764fa16940ba7b6791ceca9004b8e9c85d6461773e3964629dca7942bc06ccc4460b8a25093fe4382fb518671136a8686b6d10b01604fb291b30b7ea1c203a7ed61ad48705fba83460619e3448213c5b873d863fe942b3a365256a4d10232733e62ad6e843df8cd89ef871da74584960b43b6a2e1f4105313ac41a262be7789d4bb1500a84b372a55dddd88f9c25a3ab4661a2edf07be1e907f8622e9984bb184dae99847597df5a6408ee5933bc9e63cd9145c2e67607474aa8d920d158ef00cbc273f211c3c0c89a0ef4e1b5ac01a3c809d5d4552496a9ae8e40d46b92320dc584f47dd75028c0cbd813536f4edf9708a5d31128c1b8e09637640602d1b903ca8e6a1aceadc7ac3ec917d3858e875bf16808b3d79c6cfc9503cdbfc0f1d83a62f3c5efaee99dceb8525868015fc9d9d1613047ef6b52d375655e55f602a38fe69837551b3659893708753f8680d8325960c873f3ec25cdad1dbd7949995d5b1ccc1f9088f5328a5785e818835edab9d451fafe54d7934dba2a36f38d06ac3a67f3f4150f7d931de666aabb59654614a8bb5920cee1ad812b1ec034eaba1b0671184ce48d48d810d576c019d7df56dd0bc8db0992a8e7f9facd2846ec43bb9ed77417ba25a271c9593c035c80777f1cdf8f2c89205219e97ed0f21a5d1eb8333365a535aecfc4a49c3afe381ee4a212f90d5cf030c2652d1ce925bf297844a77011a0f5f6bd37a9b46a1465b4d49d43d5c7a32e5895e31a3800b013917c07288465c930d153e4bc3649c9797f45788ad9b47b956810d8fe80cb8dabe1a28cd7b347de5bb273bf471da1099c1d5bfa0ab05027f557f464523e084541c62b22877f9a8f573591ae3bf526d538634a4d81ad81f95ecbb8a4c827fa247add3a1095e0041e8aca3c485312bd7de32fb865c77300b7340034dbddd341fa2ecc91def376b27ab0bd07ca6cbb4004a48bb8e195a2af342ca30a2a32e5339227f45f22fedbac3909b79161bedfbf6ec8f1989a73173b4c8a3f54e429693a6e62b2525c28fb0677583209f6d828bce79655ac66dbc5d59b9e59eb135606007f3002c95d107d81ca8aa0f1bb9145d22a9e34e27106fa842333cfb7c02fcaff116fd0c9e0d7ebbe3e707ec976c240eebe83573dcbc8125e064fed777e9d9b298a627aedc7e41f3ab8bb06649e977eab08c3a9a7dba0cc8f66bfa42b760d618a1cc1fc5a952ce76bd3cf5c6eac6ec0e4d69a23e545643cb23086c183be682e7a2c4f1b55167c2d2681db182c2380e1c9a9a4a1a8c8dd2c2ade69b72527c1cf923072433974707faf410e8dfa19f698b82111d08291e8379767615e9cf995c182559df8ce34ed8e89e041850b6ce25b13d39c20fb22d1463170ce33399066be16e6e1eb736fd7333621ed4b3ed6e7325b75bc56a196feeb717274256e5fa531e15289f3acb9a95d230414efb0fd17d8f5ceb217218e34356cd2b7f12d376098899cb143bf7fdf9da381f8c38247e3f5255616448735247e8fe386a04f451f766e209ee647c6e31241009ceda45599b56ae76641ea882c48f3d02384651f21f01a3fee33a9caf6765b37f1f886100496e942826d1f4477e646fbce9383851bdcf5c845f2d6b06e7ef014544dbeb9eb34b6c9bde71decf4bed5056970e0c48ec413db72ffd87700e9eb34f408d088b62cf26e2dc51c68314f086c55c4aedcb47a88ad263273340f67f2cd814de119b3609ee02ab1df38020fc53af7934a24422b79c26a4f004640cc12b52207d159d4ebe5340b89e6336d4788459b16d9e0788b4f72922c01e047f7f5b8b9d6da8f787e42b50a642ba80ce91b9f2185339e289db3c0e35d1c9fddb316986334fe20e4245912a651e13e5decee22f65fc3b3c043ee36bc8e4957ed4ae6f1e7ead07823b7701f3eafe7e25db0e27de551e08f538b489425decd121165a74a736793d5561d19935bba1ade8ef6b6f230eda93d47cd2d01e7f79fed24ffed8a689418e6141ce81d64d4b8784ac2985a49ba245bf3ddfe07813e767801f7458cb0a16dab6600f1da1a2733069a679a11bae90a366c2e1725b0f3ebc5c86bf8af6be5fc0df2e6d1110cd2cfbecb3fc7c56a48a09b3b73c7a62d330ba2a093281185045c6a9f474b21c4b69674953b837440c45e3ff53360903801ba233907b0db6e6e5e6987c8d60f15e0f40f0acff27a4fbd225760a50df266208adbd6518714d81704d9ff9f80b6aeb63a44b0054c64e8b632884a876e488813cf2eb31ccfd9c8f2e3af90ec9aebb09ca5beae9ce1de34d5b3da3e333a5ad1f933bde7df48b86293a6258289c5c7e74dd7ef2fc59a8d215a95841a636dd506e46d1689c329446b6044379f1f062e7aaed3c6b00e4def8d2dfd45ce70d473bab41c24b1f852aa3935f6bddeb884236629c1eb04dc67b4d6e6c9970d80d594bf64bb2712594d1d7ebf62d4a05a9263844a03d5f8d32b54ca6ecdb0e1e82cdef6009ddb94b190cb1ed62f9616ae60324378f9f7a4335068b4ebb0f737c20f3f9a396e532fd730477e516edf223dcd03161b297086688fa8624c1d2e1557f511a0590d794b5ace2b168ed54b87969d27201a0493d62f9ac2e45bceaa05c1c4d91b27ec6ade913d739ffaf70c2d17710c45e061a79692fbd33faee512c15d09d7d869017856be6d45c87687c070f7180f00ef1ed1825a75f54a86601840b3a95854b61168327612356a405d4c644408c86566ee6f331d7c0651016015e0a3d7f4d6d5a597c0934c239367b3cb1daee972549b5f76e9598b42ce369d597acaff9e1c39f2a7730aff47b1a1b54537f9ce4c35d1cac1197a0ff7d598fed80ef3586bdebaa614d64828170fb34d8337f465ff737b14869e407d903d7617c0f099e287e8a31700be8fda5cf543ed67da8bff61ebe50191b4033936f934e00f5650652f0f7213d30cdd434d28b15e28b64c3b2c6a6a89c5de50b5174064ec75442e4c7ff3d02702eaa51565eb8b421b93f299d1f9f38870a2f7f6ed46c6cc338a5e0515e48ecca29c514404823300bba87260bd108d0bf1820401b5fe199f6e8bebeb96944e4632e5d4d63e8d3c1ece2005b8965816d9cea026de67924df1db0202863bb4e923f2bcea7abb2f9087cda418f4b0f44138a608de0591934648e9ede1904a10826b84331a2c526d9da365d85f154fe7d098ce2e1092fe7004990c79b9158756f21d685ca3428a2419ab3c1c9efdfa32866e5d75c152172f2199e77b8e62a8e49ef91bd058d6a0a583f32c63b18282312565bcac182c1f458052d2170a5338c2a0e592d1b329ef378f03999d0387b01bf7b24b2e643d5397ce2e09a2e9922a37716ca5e09ea4848c4c681ea22cbff457a7b105953d6053c7adaaa832c5c6c0d550aa4363c3ba3af514a5650f5e87a93fdcb322fb2988ce9a2ad5fdd64a0e9caa98678ca3bf9692511583f56ae7d3251d21b8b41444454145093ffc9b5a81b5ce1dbae06c147b4fecda7ac21b674ad58f21744fa4e0134697eec25dda8826a3528c04ad0a21ee35bcf4609434b9fde65aee28a67062d118c3c424649b66b263442fbfae67a5a74fa4bc4922d2040e82ad3fb9393c5b73d04061d8c1a6c6f577b12b23151f1f7af00e6dd5895bc6e00ea9b275dc64d368f64aab74a5554aa5ca6cbd558ac2390744af32da66be687cb546d933ada7947246fdaa516ebd4a9bf2e577553729ed170db8391875385038d22645cb6f97dedbfe5c292e1fe9cd12d5fab9fb07ff7144e2825453d1ea80379fd17fbacf20aebf4982a7a04f0b6a00a41c956985a795ffe6ab019f17e0e8a69660f4091eb23fbc6eebd2c11d067ad82c8fa6696b284f4c9e67a95fc5cb84eb4408d6f8fe4a2116aa964ebee91d727510de285ee416ba40bea342e93e343ba04bc49a10faead080e3ed75496a1ec8737cbd57ebcdf9226e7dd4105f491a46ee15e9891a619f0cb309b9dfc80ad36ae37f3101f69b5491afdc36262fc9331f5973da2ff23c93ea008890095d49f4282c1b8916195d0575a95bad364d28952150e01fbc45f442b301e421e11a72e2352b50996db803875fc0de9694b6251c753e9ab34f3b9365572a5dcfa8e5f4615f007d02306be1a5b23e6cb7984c9d9a7e16c05ebf4ade78dcfc632803626f2cd4ab63403604295702f746bdd68dfb2ff0bc0aeae75bca86ee79061caf6046ca5b22985628e44a879bb01cfc27bab42933e90b3c700a900fe3cc079798df5dece8735654a9929bba1362e48040522af83cd88ab50f8e4eeea8dad7eb9c69618eb4ac60117e47d955ce9b8d3f6fc9954bb5f5a00984bc9f9b810dac82352e8bf96e64dd72445f3cc66cf3fccc98015c809386224961c146a766d122bb7f9883ccc2810f554a12bd4898d7044e443af40b3d884ec5c68830f4ea40dc5422ff35dab2a8f00a0c115ebc4bbaac22849d7c71cd25367932173d3e07853587a189c9a3bc7b662f90f976cd6436e129ce5185292d64ec80c4b6f82236881d2a71dc1ca746ab71e86adb1705fb5494b8753087ec07e7fc0dfab1e7cb8be6e280d54e041233b0cb89d06f9582eb56cda960d6f537de08c3e8bd5a3549c64838e2e2a5b30fde6044e579af9ef1cf88ccb90dc69d0e149e6ffabe612b63b8cb8222b0dbd5d5fffd878f4c2f7b6a2df3e1f6e1c6a21db42331f5edee4751024ed10cca826528d7eb83eadd1dbe990e111047d599ee6bc71051738508a18c8c64ce8f41555e0d4557ec64d2d39a0be5a80cbb627bcfc1c5d751d11c16186cea78cb5c465063dd2db892701b33fe27bdeae2460d3248600679fcdab86c9520545a7da8852224286a4859c667e68c8f7d199a8766a2edc065411fa3b116a8e7b0bee218faf938d9a88816cdfe8b76b78c2fa3f9980dbb096cc45892b03028e8b651ac69e1c81807fcc0bc4021ff2e409d53654f1c00d4915022e74089c8ddd922b79b7fe07cdba2667c8759cbf58d152a25fe2478c96c49ee044aa77bb53403204bc48c33d9a5032e8856c5053d689380d478f038983c7523873955758e862cef5db00e1c687856408b48a437c6c7d8eae0518bb622e80fef082cfa4383b121bfc0d00de478079c03d801b6bc34df3129489d0bfc1ff91214a260ce88aa4cb024fc5885ce8aad0a4c61af04c220f5118e117d73fb871c6c2181bb7533c1ee86ff04cc6cf28a49d08e0a9505a3d11b9cea7f75039c8d2732c2847b020396e2d72c071216c04fc488f9e365c2c0eacae40171ed7a9ff2c755098d6503e0581d0004dc1ae8d8c2a3771e9999327809686b38179647c0767d5aaedd54469c1958294ec0cb982e3d14f5443c0fcb3744635cacfe4377bc216629be29f3b182ab8908f734ef91f6939176d27a9040874005dd900dcb59b2caf21c1d3f4fa906fe65c88bb7820c5056f738b22620be7288c066d1553196f702f2798b0804af34d9230b5f8ab06a535016023a8a9d6c59361d7c43319862e04fb00b51974413e5ae5411150be7cc89ce44bcb833c37147d04be4408628699f86c439b592355a458fa6110ad90a86d1a930e0c644cbae2cb003f0670aed66bbfe47a3d6a7ecc748e80d6212fe0a40d13ac5fe8ea97277d41e958431779324a19bdf99fa5cdb5468e91356cc181fffed5d640240b2a964c3e0b290b8c8ae16d628c70c03d89913836231f1b2b6d88bf48616f3a77aa46911bfe9959dd50a3c51b5dbff0132cff2de9c32a40d2e9fab74d28780341921539912e1118ee18a3b440eed855986fa448c21900a04fa6a7f3ebe888e9006b7e6a6d7d4d1250e2ddcc595c83a2ec0e0ae291e03f123ec46aae68c2527a0ea686388fece56954fb32e70ba9ab8a9d04c6c0472789636860691359e9d8994ff02680b6a4a1015e2fd7af115bfa1f8528a7d43495e902805634c116a207492369234491b491ac94a1b088aa4086d20aaa2361455945255544a45d54c1a5d15dbb00bc5140af04fc33a825dfb7063ff4bd63b4828d85c1fe3029bf62f838bbef7f4df176a9f3870b8490171044a5509314e4f8a12166b33183e7556f759577cc2d2e154871b2050facac104eed32b6b5fb4854329d8c32ab63701cb066225754b5aa9bfc78c9084c2421831e53c741b6f6405a475ad353f35e10a161ae4ccf2a3a7313b080757a6ec36bbae7a7fc117939db3497c7aabd16a1b917bbc190f78f1cc2f66b335387fba19273c459c2727bd0f521cb424e8d481a6fccf65724546ebde2123042f6802840faebaa2a90f613b3802d5742aac398fae1ab2ac1d96c08cbf2c5d4506f7912721860f30480c359a34e1cf3a05e197456e7ba18cea7b42152db428343961c94a3559664e5e99d202ce8d6a94754e7dc2d4c38dc207b7a4293489f8922c4ab80b2920d387ff003b91140369443682eec9a4216d9bd68b556661ce79105201641e83550da2a484abd164060f7a64083c1b9b6711faf705663bd221b070f65fae1103e1a1f813354e4776b74cf6183d60190c6bf9cec58381664c84be79541492674aa2479f50a002e202833fc7309cfc28cc73200b89ec491fb41020d70eca185fb78913d7d3080a2ea6daed992a3539fa191e25e6d3c8bdcf78445210ba2e3cd29bec9601c5e625ede584e962575f96497c20e27ae015121de650178895bb83f1e522c82cf64449cb95106c80fc014e9e8ce88c9a1269c26ceb9fe8f39380a84346b98a42048199b4ca3f289b9a7fdf58512bad2c369437af33e526e28d345feab5a1c1793de18e6d3b8a3778200662f716b83d308979172e5d0101391dee7397ba66876dca3fb75f1bf99210a294815ed66b473cd21e11b7ab517024410e51ce8c3d8123b4d1f3e083a867f3ca1abb060285ab53bd8ba0ee7ee3153ef7b513479e640cd1b86c897051005ac06addc0509a295c7e4539e0b8ffe03c4055612659e968a188f35c62cdf279ec68bcfc88080d0bee6a8422ebe9be614409ad2049986d3cef03f2381342abfe2e5de33d471ed026e58de66170841bc0abeec15a59fc4796a4fc0bdfb8adde0b6a3676f9b40e40f16787ad873cfc25ae3e544043e4251ccb0d59348ffbf041df1884f2d5cc9cd4dbf19a25add477524af87f9286dea20e98cad8bb0b1d81b704b2cfbb5a320a8f2e8312412e002dee214b3a9d9849b1f36923dad107878baef41a6c2a9bf1d9c25da0d794833214c4f55d89c78e4fc1f552169126e7e4f57e52b29b3d78966da7e15634b1514d3f0400deb2d083211fe5468b2f0a46c6f5c231ed31d9df45f89ce2d1eca2cb71813c51366a65c491e0e71a90c5b2752275b3310344f86affec73dde5e532efe951a2e92b679dd3c42e45e9247f5ca930d1bc4d82b42ac0b33e7e263ce2aa27b706e8f089e437839e2ebaa8bc8315fd5225a305db72f94d4fa5cb32f0372ea12b6150b07c22a68956f515d07a9025e22c011143f341ff5e4b2b065632b7e2780a3daa733482049ae738937bd65c3159cf87158d8ab0f36933727136882a83b1dbcc72287ac4ad36c0d6f2d1bc7804bf285fd337417a404d935580c2f52f903d911222b5f57ebfb960bac60d8c3101a7f73755e18fff5e3059dac16b8af3b1b35fad4bc6af5a140a3a7c11361063fcf7ff4ed8f45af3bf36da2cbe1f7633be06041a547eff6743782ce1f8dc81799da6bc8e03414fbbeb04fcf35c342284f499544b8fe8a32d2e3cb91e566990e5c37108de44b9991f5039423bc65aeadce83be77a10cd5f6faa63a750cb5dde18b3bec0405779d68fb736fbfc20b587c11acd7dc9b4596cda354e124246149eaab829bb6da751734a7963b8f70be21a27f69e5a49e641453dd304d95cd4898697b1853a550adbd42aece747aa2bf739536663396f720fc0cc951331f015b25e1906979853c21ae579701f5066ab4851225086e85d123ba6a2a926231d0e1cd5358f743c8b02c8eba47cd08cd84198e75020cb3bc704f09314aae9887bb5d213b027bd776e12af9980bdccf43a1c5909d4052ebb0d898a15cfef743dfb6e5712ca71eed94ea773a6d4a80750c0f21dc92a4b1ec37be21505fecf85d2b4e21fb03942ffa742f726f9cafbbd945a6d43ee55df58bc36f781becedf4af4739437354dd85896913eca496865acea4df3cbb1f4e69b346c765fccda1f50993bacb6f0e67b36dde127ebff1b417f4d5d104e0fb020c715799140516077bafe19f646e98f70431ade9f79d97adc723d14cea153515d5eb20f8ce036154ad92a2772d536261c8c9f85d3d4967c348aa5cef4fc8ca9a4ba95e3aa06d688cadef8044b922aa72a06c376d7656afab0952d64098d93d4638ad6aa82a214213d7c1106c353ed8bfa5f6737579d38f4b8e1719e5beb47959edcbac82d2e50437c4563fd628dcf28d9c0517ded28ccfc1807a7e3974e4ae182497e79c4a763853c9572edaead50041b6bf945e16a0758c8321f30402d8892f5d07cc0cb6309a350f86123ec822071b57ef57e2f7f2b1dee4a9d36b638f17b6a63b0c75b31023c91b62ed330213d45206bba883e2e3863c227b56b36b10063df3650fc0c9cc97d80a61fe202b88d88970e2db163228ea8d0eac60db145076374e8ed881c383c440c00e342c70bcae2aadee77c82d15d6395a403ff666cf4daf9dc8bc65b4d88a60c8a3f81bd63ff376d7ade5ba74cde37635c25f8a849695d93ce7247710792cb5fd3d1ded664810ac2013272d35a78246adae883ad3c1083379f4b8b3dc7a4703f11e2c11088511dc1d3a75699750dcede81bb3370a8daeca66d97758c6f6df06a2d7bf62d3c1cdce24bf4abebd9a5711d4c78468b537fcd08161366731f2cbd0d09b20943309cee9ebc4b9a14332c0f349ac1f4bcadde38de82db1141c2d1868fb7f2c421bbb6651b9d6393b11fc321ba2fc5c19166c7720698016c8e3dc882380106a4f72d40c6501acbf333b04bc6bdd227ba3e1f0b60c609afef7c635d212c817765391a6024d89ceca24e81881bd1159841ba21930c6a3a8d2b39e7a30a8ae215cf529f734ee25c3138cb65ae392b5398affaae2aad58f69ffe7adfee9a07940327e9bb92540c80b346e9e7c8ee99ad562e328b98b85e029201d694f519b1366947bb58792711df41d79b7533468cbc1880cff5a0fbd89c4dd24a65489f284fec4cc0ea0a257a3e87bb9ef98a014a21345b49174bd95c814cab4e788faeab1348a40496db57a86c4f6b128b0d11c52d71d3c01a29ab8c22707fe3a5a9da93f3cb0ca74022e8a19982b03093b83eba707ea05a224088a4b720f8387ce72a6771bcc1bc5cb27098c6ce554524db99f9a8625e750b8d8b44606950d0a4d1bec1c001e94ee66a517efba3522d03862e0a278302659acdfdd7b9c0b78656194282aa84feb64ba8fed48a6c2424407a78f5d6fb6e9e6b49609e428063cc545512e29055398c01ea105672dee97fae015f22f70829788e15159685b4c1c66378257413b1c197fbef8e846a011ef9940ea18ed3556949164f6545c721ca6e41d98935547b88a33d366cb52b68bb3b269083462de1b8986aabccc8bb569819370f4fba0139d76804c40cd1220d7a884fbb80076cc6f542d80948ca30277bea3cea9460d75068dc39b6e50b4725a9860c47e65584b05a43dbd28bb1c0f747c9e1bc8d8459de9210be4fb9793ef78c55f67963f882810f047f44933150813853b54bcb2ba60aac1147060426a05b5c21423649d68d7aebb9c915c58225fca39fe57fb29e62999c951049dd4d8d41c26b32788310778554df0d23636ad76dd6308d2aafcd8e7f8448ea02b6dd07504bae1ae56692197e6cf56c6718f529fc9f46600e02c785ce41a86dcd80902c871926de315462f864f2ffc72e5574031215cbbb6080063800efbe029c342a704456ed999949c10356ab0c4062d23bcdd2dc01791aa24500332b496ca4e0aaa9f47f54c60efa50c6981bf090ba3b8c243bd9dca630f63f05cad1bbc4303370238750c8de5ed5a9c5c6de70a3987aedbf70b6fb237c4da0f49a9f8848ae1ffd0ee9155151346792b24a669bcd1870f0f38603f4281cb707f03097b7f3d096401cd2cde57aa8e5be9f6190e2cb17bac04440ca284f257fe06768b03eb2713eccbb2515e3a3b3c069935a97fb4d6b6cdbdffbfcf33573b5275842a0ccf589ad0da7f53492bf39062815a62df0b1a60ecd6774b3fb4b842639944a7ebea20ae6982e10856ca10da2988ff5124b487cc87b75f0f6adc1fdb46fc3d3b1ba78329588a00bcfc466c77d57943d4c0516cc11e64627f3e1b2b85464f57bd1b983f905f8cda8bcabb608479f81f9968bc9fae6e2e2ef00623620f39e9bc3097defd28c1473c799ca17c40c2b92f0a2621960f71623bedcf02aa0f9ca4856225111c96a4457c01637bbae1c30c0087cf0c749f61fca2fb7969d0cddd1a3a50663c501c9acedba3ed335a82935fea283cdd5f454fbc2f33dd4fdb422620ebe6ae632bbc64698d781992cdc5a2beab6604bcc3e0ece2fb5e4ff863f0296c8e44defb8d9202ea2d52813600b6bcb1a71f84dda73f7bee2fa3e5f309c7f0f6209d5a6dd19629531a1d1e72d1eaab1c1f3118770b50bcce588db35dc73a35c19296aa61d628abb4ce24a89825c843b3743588850e19ba0b8ff18166ad4e6a30448174f27a98755fa11010e8475455a4e3723e01b0c5ddea4566fd5e9e05b982b11d3911e0c5b8865dfed03685d241b65880c39dbf19006f08d487e7b4102c82e6ddc08fb1ac01bf318df836f17df0c40e1c0bef028195d80c10bd0ae603ff50effcf0564a0b4190ce4d2d1ac7e2bf7d6a11a7c5a4d45d0a91309bfe94de2df1a4113509108c403f4c04137228d04820967043a1a631c8aa56cec346946ea56543866d65bc78805cfe82f0cfcea15797b6578306446d954650e21bb9bbe6ee2bd7937f38085ed3db23b6f42ecf327e46dc3a699862f08a2e93d020d36e0f0acc44c3f5afa9df6c46629109098678336679afda79a1a9a83f1781dea3632a018144f0f1a61d806c238219ec593656d616359b3c22c94d90d5ee83eb1a3cac481d700c861db09edd6c1cd846e836f39a2066d38652bca88f816bc9a1885c2e9475d1eb71946a5c919ff22f18bb65fe791cb6f24601d1d62a586582cec339e48177d3e9add93048491093360a274539c59852b9df44e573e69e64b7977c2d37f8fa5c2e47aa6ea332f35b9644083ee71a99bd9cee9576b2b70009a4823361ea4c7888479599acb0ee249ae9992c26f169bbd15d786c8f08ed61e99192194edc55f511ed081a6bc32e312c4cecdb097f2d7e2975b84901f215be6fd703ce31f4cab36890a0c6d06109a7340724da9df56b898b9c7d7d90f191a60dab7b3932f6f86011674c7c220113129d25c3cd425c89392c21bae3bf6583dd99066f433ba1493f9e0dd7f7289df22846021314e53a5bf960b7d71d044aeac3f9ddbba47c4275cb3274a4692d3860b2b91e8300dffd893bfbfd818023c82cdfda33fdaa78674daf6a4d4cd907091e967f3875374cbed2c21da2b0a288d65d5e5455591affadf00d9819798326338fd49aae063d6366e695d1bb6e64a82770bce859d14b63a74d439af562f63e69eddfb36dede38aab038d54819b2adcdab7482e38c012ca866f5e0f97e7283dd347744c23f97077eca7d6a68c0e716cb25ca65f27ae030cb85aef18d4639f42bd92ee1a0d66c0706c61d3c49021f9194d3f0b477409244bdca9ab8fce39550da3cea183854fed490f32b093c1045e35f7fdc9228653db110ddf036698f3fa9d128628641a0d120e5335a7dae06d8fd3c3c75b80e02da0715097c37c9cb72e96ae6870019e3be990055b66473c6f842261f3004294525bedef31b8c7bd5fcf0b6998d7bcf584c2e232f992694eed96ce3f255956d3f1815ab1c3cddb5993132dbb2988f2f674611039e807466144028a51d16243104192529c9888196c94518a3aa6a3468240f83d74b928f2c14735b0ca8fea5825f18803c776bd124dcff12b37fdb9d7af8438b989f1d98f4a342e0ccfa08fb7b9beb61563e652a659ffc501872bbcaf8008f8a86276203177fb0fedfd2d91f800a139c6ea9ca6be99c05c2c689b49ddd1de6dd9050b35132268a4c2f832008bfeed49eccbeb1e025f14f52c1f70c51506254d3bdadbebed6a7ff044dbf106c638091f34621a0fc45d1011579ac9d49e38d50a3ddbf7b62e029a42c35e9f4cef267337e3edd89504b58f4046de235c00976b294c5f6fadc2d641f4a43b5130d7ff49c53569d5ec8cdb58d3cd3b0eb6d40a2d0fe9a4712e1d232ba3a1b95b28e590ef7128f71969fa6ea59e9e3f857fc8962e9a64cf58efc839675bcd49526a2f8bdbff69db810f7decc8760a509439722823d3c03a653f6325ab3d84191ae75cbdae10f9bd02b5e4221e7d5ca2c9d325ba584061a11b6f62e45f5a26a9ca431baa62330849c35b534a94f63c4317dd016ae71e67b92217e7e71c2f4ee32ac26985e28e47a184ae0fc162fe30cdfbb94d3dbdabb8ebb3c0546dac5c0c819196f1aacfda1e6a05aa36992d01967cc0caedd9840a935d86cb5ea6e200d935177b90596f6eec0d940b27c39e9080fcdd538fdd48019fc4be8258f6e2d624de102fd398f84cd3bf2c37c2c7e00b71b33132a28e22e1ec68af1db0869727780810f3284a5f655bf20d50f82b022e4510bf3da8c43ec8482f55c303f890336f5655cbc3c406bc6b34201f97f4cebfab13de9f0e37c64ad3656973eaa52d71bf8e44297527585b138be240d7b621f58ff8f5fea0acb3fa28e3f1a478373b6e57311311d823c71f9fc3efabc8493bdf4f2796a0fc6b487c8c010ef5a3f36a4cad246e8e1f9363a589d6fe96773afa99461c9289242b8bc4a10716f63a017be8f90566976d126ad9ca4e7f59503e1ce67cbe8cbbd5e81cbfa1f3ed60d81e174933b52fbfef4b7441825b661b568b43f717a46f02143bbfc0fcd6716e367783b2745ab6cc931b839cba18446151b43f745955c6c95c49e789d2ba6f0346b1b6ef1c4784ee188116f5c4799bb614151661b51d86a72eae087c6dd544bc7d1690bc9314f703ce6ce1127c8d8ab3bc3f04cfc77f188169b5c1ad7df564b1b1ef01e95176eed85104cdf45bd7b406eec1e55a0bbc541324cbd204f3e938ab640b114598f1f00548e978ac33771cec57800ef248917761433e66f8782ad5e7d35114fe1c3b7ca27c2286c976558108ebc048d7c2a6cabaac75a3e92d18a61bbd1611c724ef20eb62a04e5d9b6222b220d069189d0af6d3d6ac4f03ade2d4536ab2a569f0c41f79f124ab11408b10f052609175ae7a3e6f9a39ae199d361f65be399576465715b7edd56bdf4701059f6f944758ef0e994e1122d95921f17c24be5b07c88084fa94667f3839f5c5e0b2d8bb80444680e329f9234650b4f2ba775770d45c7a08e1967613bf3601629ab053f386f1a11506c32b4ae8849ca7ac1817cf2ec19c3347bcf0013fb742ae1415559473fad6079c92bc1a3159e4506678364674a1cda705eb116bb3b6de88b5e0bb92071ca702ccc70896ee67b105e440facb1b150d0c9775a9be47b2c3e66fe46d6e328d25949508235c4ce3e22a550a8764945fbf304d3051a7667402fac93962d45ac99174bc3bde0f460d962bb5dab097ab93dfb150acb3ca73486d380a1684a481b446bdadd7aa48711f15b086b5ba176779404240a0b3e0f862f4f178c7a6b6a2d90066e8c463a93c411671092ba05d9d9d4a2805014ca53347eca9c3e898769fd382d6864f6dad46e746c420ba8021bab84f43eae34c02bc562d0bc8a54a2722d4c82b98233d8138e61646892e722f50fc0edfde95cf6978c0a50907a6d6b966c2e3fb0325e5c85d2231f98a3fb86ce37af2646a4968daaae7ba4fa266d4240e0891feb9814e964920310aa515242b1e6cb6b7cd36f1f6b821092da60098a13183accadc4365b578107c32b605836483a4b5fa23349a99278fd2ae6fe3cf3ec3b75097a40c924243b4a348c3bb0c05c8d168088b20aa75aa3c2facc119bc9e00c0963a44aa938bc35eb019ac31df403f7a1caa55b0bb3dd185b59fd93f1e7c3fdb4cb346e86ea9b14c3b0288c71706249ca7e2065b00ddd20732ff972198d4105b83d42aae3e6edef063464a682c4419b73edf5cf5c38b1c9c1d3c08784e23b7aa805f80d9745b68245d097613f8ae9d9c8f7b872f2565e7edce2f93bf86affde06564f4fd41c5ce2037b0fd86324fbc74f05dc076ad34c54b888b17c6cd9448c25041431d29fa4fb3a4402e48f8df081d09ecd1b8da82d7e9aea8ce8b08b1af0e273ed7f096c441798cbee7f5f5a805b725ab61825747dcfc29a5d395726915a4b203e50c189c8454ee701d9d9a9dddbf3eb02748a3db3e2f0be2366c6298e8ea678a1312fa552cbf3098329a3b8218e85892d72ccba4949c38de28bcc6e6042c868c5442055112267f17bc8a4c8ed64458c5c7b77c5ae244ad5b794eab48873ed9c7ec109b0956035d851b6563d4b51bd943e1c4524434e42de11ba6105f69f7b8c1750071ecb8b5a3608e856d90e382cefc1513b5bf22383893299694d35d069b9681f9c06e8e8c70e3022c1dee6adda7acd01bf3deb70c24b0f6cc28de17ad0775380e2ccadb255362a40e33970600488eeee73719b0444015243cc7a1cd07d2b55c2f2259f50f320e3718fce0479dbcf74b3580bc33bbdce530e399eb3e62cdf079909cf260f0a22bdfc36098c12a8220f4c7f716d37fdaa4f7d1a0e39776cb0c8bbcdc4d81a34b702e178d7be8754365860609b21a4b00d16d8fb5273334229b6d85a3d6621fa999148df74b898dd082d42414ec8ea23b3ead9e9ffdcff4dc7d043ab49f9cc133938143c548a71bf76a88fcaf1d56e0fb11da50ab4956bd8bad64d733ecaeb359ca3a5ec350ba62417189ac548d8b989bf942b2f801eacb04716177fed353df619606c5b323218d1cbc2f815d4a1e31a6a9e3c58fbe158134bc52ac48cb7653ed07ab3f72f25c36771ef99b5a4fca069e4e44d8a9e473e241d1ae16b3255f51af1217528085f09a696a55ef715e8b3db7370910037838f7769ba029ad505303bebfb37ca1bebafc979e0cc8108c72662762b8677f8bdbb9945e07610bf83e27775ef40e8c6087210839902f9517431a191af7925c1aafac56f1a4445306b46ce9e2e556a1353321cc2907d28284843c26c191601a702354135542a7a619729cb1a017c11bfd2de3fb9ab99f7652be9918bded1677f93e6675a7f183f50e472580afbb08a54a43ed4b8e6ae58bc00e135085562b74c9643a5a487cc6db082e9b6d2436e4c36339046848987b67c00a6978ee56fa03ea67339184bad83d8fbe5ad62e919e66c24152154ba4e70e39cdd207606e0e628554fe86f2c545e32993382b4f6dca0d2a5f9fa197f4e5a2542f7eebaf64beeae66a20cd45762d8361174c8a26fc5ddaceb5c74cf3f06ba9118d1fad2ad101afa587dff33e25705ead00610c8ab9e24b2bace69409bcc4e3a120ba477114bba1eff5ed72e9c6eb5f8e20291724cdb92e572e6606a237eec113954110e9098845ab3056be437c1a7b45aadd926c8a0025491bd89fb52a5c24bb8604b3c7ba6d68b2b9281babf06dd20f295d61baf0053c4e4929e75745bb2623d6b774e38d75d56e6caaedc8ad631e9d0817574e4bc4c29081d9cd70d871c9e682d0fda99f33eb963a1aa50a238a61c6dab762bfd47c84057a553db51ad64a84b52e151561ae344599f52c3262f0a949a36a7dfb14e88bc7060b0dc2011c8743e6cea7c62df325ed98ba6c76a7354ac8811f868d62e12eb642cd768803b0d05458d0d6f4bc9ac029710f86ff14adfd55983792031e2829dce5ffd4761bc2c895f8a0549a738de054c7105c44ba8c8e835a04f65a40c3b5051ba4ee55c06764adca988436a1d2340791437a2e5bb76db5f27f9410fc762679ecd6d3733154434d75b93d77a55e824751ba62844345aa280ec50b44f912e7b1eaea55b80aefd1eb9b5173bf9e449081375a466ed72af0a69b477aaa2a18d8deb06f82e73d3dbb3a4036fcf7a906e722196e259d2b1ca480670b4bfd86950ca8c9f3668a056f5c43d35c62c20cbdc2158e52917d9124b3a2065e3ecf48b4ccb48e443ae9c3a3b0bdd69f8380deed92d489be6b98ac31667c5fe0c11f7c524b64d0c46c33c00a6543b2f470fbdf5f383c76e86a4b1729e725af276dcfd2cc38a9a15859d10f7d83e6cca8f2e96e4602ed24e81df1ff21dcd4e309848426dea8a2fece8e929468519b01e5cae7a12a2533e506b5a1c1e0ea4a4022d811a08caa277df48caed24d70ef649704a2f244ae5251eec6af8850b48e3d53bd086d5be6fd687baad157963bc1acc45588c57ace944201ac77a7a76bc9641da02014568a5f550b01dfe60b83c3ea67f3fa705eb4254bb2084e2dcdad1adf6033f75406a5faaca0e72fb2a8440301a76be56e6109bf4f135c566e81c1cc0276814d0881aed6528e4a9528f3e22fd50ee476d6362938eb7b17ec698c06c3cb1cb0be274c3a8424ea2c43ede6d55d46e444929ab34a60c93b18f3aa04a4ed2d4fb83848c27d91778b1c5008a9b5c14db2f8bd538b08ed0758b42af071f3f423ee2bdd87772e03efe1d71f8dbdf715182f39d2a25bd43643c427bfb0fe4d0bb2303471d81158c6c1f68004f032ac1a1f2257ea0647c95230a99f3662bf5dc3ff59cf6d950957dcfe48ce71e3dd9821e9ef59fc2e02e4513787627742f0f1c12109661db51a4afe73fac70bacae2fcfcc0723db067f68f44bece8045e90af53ea8ae3a5091dea7bcf129fb9bba2f641536cab4bc10ea6e4a07cc16a0f4c1f35a96e072f7c3980f667ca5f6a7e7e9666e75e050f6db2d7289f2f19228996e5609f678c33b83940f07e9b14c7a8495c7e2f4f8b47bdc031fb3943f11ddfc85e4947d433f23c4ba411ed97f31f18299e19c1f43f322b57f222fb2716d8dfc9a416d80d470f3cd19749557689c5e89af6e22936908b2dafeba8359cdbf1b802b3e9f9ac5b914b2586e6e881cee254e622fac933ef6fd63e661f21878fe41efaf12c6b929b0735ed2d3305396526a0d185b58fe737ff1fd3526cdbd80b587054d361cab66a3044633a40b8322349e6136399f7a44cb8d85f698bff620b5ce413c5a6ec2e42f08d7cd503a873f7fa8318b930d6014905861050a36f2af444f0c9862767784ba0f92ed45ff78c0d10c6d4293d83b4117efe7642d50332add6721be883c0382e48eda95eb5d22366114d9380f9d0389ce464cc49e07d42eefa4f4ba8d6d4d5780ebe7a20d9918d9ad10355fcc9f2905207da9efbb8cdb2a4e9b7e0033538636b64f2453433e39ae75c790f3ae4fbe3f561554257f4126e2ef01af89f4a57cc712142837a4130d644288d1e483476b256ffa1f8bbe2b3023f7a63d4906e81c0839fdba3fee087e76d2cfd1a7c1dcef7d75c49634c16e7805bfcd57786e34f13750a2271362fbe693593d49eb38933d59b23d8cc40e1b15120e65a305830c47f6c92ac5b7a240a07a57efc9396f340e95978aba032d1801405be595480029b986cf7e9fa6b4254c85d338214d6a1d294e75fc0ec3ce91b4ea26905db2d8dcf47921f63fc294bae062d29b7d50ec2c3a90581defba839f8b3b0a471bf41bfb9b761308ba81d2b21f2173d9188ed808cbcaaa0c9a3cf7d067f7beff7bfd19843649a77fdd46477e2a8efd0a0e1175affc7492db25ebcdb263dd973306d69f70f69b82719ff764e41ee6bb23f113a6621415e49c4ecfa100e7cec337bbde794726a30d2b1110b33f2e93f0094c7247b3068d0f5c78b12941a6f6879e566cdbe65ad57292f876585819463c3c4166364f0853b51eddb2467c917c193134b8419e3b3e42fbda7cd275d5f438281b73e14ed79eee02cd224d7dde9d4d2f80d79040888a2502da8efd5896a393fb656fffbd65649ff45343e1bdd67cb494a97ad2874a1ec9419d4461e442ffc9eba63163846e071ae11b4ad8de0f1922d77e6b395e68d13272d4d02c9e101be79301733b402fe9dfc7cfb25fbc84ba6dadbc6ef4cf58a67fd382f3cf175b762236249f5852ff04fb045ae77526adfe23a190a711e20795f9eacf0020b946423e42fac0d184996da89e7eb142eebe84ddffc9e471cc3bf791150c5ed6e9afac423720db4876a33c6f08a8599f84132f567ec6a8b501611271db0b0588fe0266631851431e632ec2bf324c06e3a34f67ba2e4c4aba2a2248f805abe6449bcd8540b678c155026aaadbbcfccca8a4b5ee4f67702a0e6fb0b4e3f386d9813045e5e52f202b4d9733267c0479a58c72596f122146b1916ca8ebab5716f3162f226f486f3d0e8e95c1792b6d40437906dd3d5d7ad7bd2c9c21408d20d5bc63ff63ccc170d795b5f65bd0a59dde470df9200f69c0520ac15d2f6a505217e92d9d73faaad0182fbf2e24ddda3f96669ff51baf027ad7e81ba583abf0826afbdf1002039a9c825bed9f987c7f765962bfc25583c78bdead22ccdcd5b04228dd5580029f1b0e1c9ac0b3f459818202f0f1922900c9deb5f13b5d7481f93758a4d2770c3ae9505dbb9bf4a4ab1beb035481d046b1cb98ca3bab24f414b6017cf8482409b1c248497f028a420a67ea2d5541979aa5b25e5f1aaa1ad2a5acb7ec250dd50fb161b5c191f9f420a8adedb18907c5232ec27ae32745be1fc0b255a8efb412a4a15c2e7bd75044e694fbe37c592e6316d74e51226c30ee094352da5154ae570de3fd73326ed324a8ceccd886223dc6d31d6c9cd97947c596a02ce177bfbfe88d0eaf5c26a3815f6e424dd34d8325336245e8f151f8ee8ee31c533f05909b4e413af8ee80a0500cffa4b61480991614423271dc80c01f0d13c04d6e0c131be75f38f12859e573bb82d80072de98b0e7d225835632bdc011526c70d16a00c0e3f6f0149a3179de86c58ad74a2bc8c450eabf12934d19df8eac2334c0a4b977cb518463eed79c7156c2324f42aa7892a5a59d67234e5f93e24f1d01a05b51ca4e8a1c37dc0dc040196f4045474d6d965044e85271df9eda6fdc2e155943b0b9ab086b2ad29fea55a48fc2a67c90a948e14500c45a81f35c50c89770a375701586896ef031400960b756c0ad3b3c5e135079eab7601f52cf897cfbf941d423831dbde2872be80feb3d5a6e8e29c7f495da2ef79efb8b49bccc6f11fa116c1c4ddc88d8c91c196d6ce8b6e97191b2ab5a13a9e000d0ebba8acd44ea15aa249878ae7a6bc1265af2a7316c65df8b687766c85a021d0295a12ddc9254a7dcaec8df65b3f237f368d86caecdd445898b01d219f10d06df637098289101548945f0ef60385da5a18c50bbf4087274b3a6f8e83fafd0d6491fc6799745673780399644ddfc249d4de9d61eca7896028d2e28ae6f9280ea43fa6314212b6aeb20010cb0e96e774c3272031d7a1a69e37f7bfb300b033d6c38c63496a81591c86381c7b2ea29a024cfc505232c19420f432aba3f21592896078acb9b09697e2c38d7d23cfb4407cd657ed73ff04cf97e9900d7b6442360e3904a800e2d50ab394ff8b8667aa8d2a8d7b45b7bd80e517ca7a9a66ac2054f93869817df01d18e4e770924bbf4e0543d5182d1ee909a3e20b07b2109830e48ec3ce1b9818081ac76f8e29a800dd5dbf9dae3c87dbfe08303cee0c4f21216dc3a29184e8b3d4352957ef4c9125e85bf17d70a7baa7ded48afff25836ae2571c8a12e0ad32b3ecc02cab9a392920d4613777a2494f708d8b4c20b5c8a5213b369529e516172b39ea327406356a9006cb91782a861fcb3e0bbd8fd0cab716d92d5a8e17478753acc0064b13318177c418591c1de29f828bd86165286901301a3e89300d204dbaa79012ff7051f2497c23a8a287b8435ab612d64359efd96a0fed36ae45880cedcd41fe7d7bc3fd3d48d8b4e6a60877e1974af40783ec68d7d843a0ca46dda036eb264e0e9e6b9c7525ce639a9a174999afc226378d2e3a1ed5824861260df8914aa39f1d876644ee10d85d9dfc090283732d8a11c2bc386bf13add93784608c89fbf514187c345dc3f371b4600879a300f7136071487a417d7d500c5fdc3c86e7f4ecc8d527d3d48e688d4827adca421f53a305fac865329cacd69bc05ab83cb724cc37732266ae39474d14559328c7b48e4ac4aa2613d9a442ab2eae9ac8c54b8d6dfa7accae677f0f0ff49cd9f6b48628fc93dcb95677469a0d1effa55c7e03f97749a959bd46ff42d0f1f1846e9d54a74084792c7877a1f30dd5c23fb0c5bfeffda53e70c7cf73949fd654ec52c9198e102ce2cc809a552bac977ac4d93008480c4aa8d9b49a2cccad9ad493609d4fcdd0681192adbcaf42f3e8cedd03d29f35502836a1031f137e87be7032757fdb9d68c4e9a4c7137a26be2b92312c76b3b824825f1aa7a93e2db71bfe9e5522a63a9a836bf570342f31aaa536e7ed86f72a299ff6d033c153356563fa7f03097bf81632a116420ab3233a3e634e298117175ea88726ebc017f335f583fe4f0aa8687d008a61041fa3f446d32715cddcc2ca071d924d614a2778b2c1c079d8d113dd8d3b462f7a861ca48d3b0ffff3d913cbb0e67cdd4293e569066cf2755417bfa907096943f2b8bfd332c2507dd02d9261d90e6a784c6c48dfe88d2b3181467edbaa9fc8cdc96f21ace9a7ab5878e55d626a39bf67aa2c0ffb867b3c3c7771b121039e56629dcfa3d6fb3ca6a469e89dfa0f8d66316121bb1077b55fe855e748bf37a5b4f664d9f59877db1559888f263ac78f982f894f2aed713c66801ca12770b5b83673c647c12223dcb2753c6e0568b57f39860e0daaa23a3598d670fc35c6cdf9b52f862e24bceaba0dda74c78a5864220dfc556ba8ed3f27e03b4db8f868e63209339cb7ab2542b67a9bbc9832299435344baf635714b27e9d9052448bf01f474dbfb0c718b3744469f0f9a5f6003aea9fd3bfe76983a1cfcf911b5bc0965f515497a1893a98fa150083e49dbf0005004b56f4fb83d62fff14f0bb37f066297134eac458bf3bc64b50f7da435587b3349b6d1a8195a8c8d4e1f4a236dfb2089bc153cc419553166fe745eb7208a8307089d38d8637a786597da803f07604ee4d459a56c17511eeaaf817843ffe2b6d096fb0de4bd5cccd3adfcab60beb6082f4e1e3f1ad9e47c9df665208a42ca5eb001b5a89b129feea2ff2ea40b469626c1b07c60c61bef6107ec3e52d6f5cb32c3c977d5c6878c79258c22f523f957ca7419717bb1d1b694df63603371e356928079d65c6f37c4ff4cb667a749025d4d38544c3bd3b9b7d86844b8cf1eda4113271cde032e3ca6ea34d04c40776275540411726059d545ec1560c5f95ba1824db0cbc5917d48f13d6fb0e2a950c26de6564b87760edb0c9caa926c5d9c9de49e9a7f3fde7a250820aff32aad80e28cf525ab5a67f85732ae4840678fdf700bf410ab436c6d52c90d5afd146bfdb34a94ebed2c16fd7179fd75a09e2d7e896d3b7d0d35e2a67d778671f9a7af0669a8477cfa384cfc0c7a5f63b98661646fdb3e8b077f500c86a0918a350677abb1bda4ef2477728053a5617d360252db21e4767e92f34148daba527caa322dccd45de06347c56c12bc6c1bda8474942e92b9ddc332a1a7be7db79ab578ad23cde9ce48ee4182a7be2c1fa7f9f72e3b9169c2bc4f2175eb20dff7dcc95b5d63d22125b0b7ef5edb04b20b89a84c885f97bc26e88d109706b9b38238f253178942212c84a777d1f439b949d511ed9835a0f85747908ccae3ae638e805ded1535fdf6951006983cd164da91a9eee2b5d4a8c854b2dcc702d756c043fd04afea41c957ec441b26e22912af659622a040ef07e9305945d4365a279552d3003a85ba2f756d93df77202cd70619091d8fcccaaabfc473b04009cfc9be5f73653dc21ed8fa8c5819fed1974f4f59da49840af6a5c1b5251cd7966aa4aa22be811079d8c8cdcc113700102923be93fe540680e3054153e690a9e14fa59a3538fb937a6602138438aa4c5de1b1f517559dd83ceab49b4b59a6ab5aac9cfb46856f624d19fc9110bba0ac92242d946c55f6848e53ff13ab0f04aa3df18d9f86a4528b98d4c1e300a410a852eedd3ccff9f6e61a26c88d482a49b797d152e24f12cca3c702a1ee32420f39576a34b028c9c36d32f211180033ace557e79626dcaeb4b5397955f26935b57a12d9d3d37b0d72ca0c11c32d74edc3477ed9f4805e725ec47c74c4d6051304a6e98b829efc4d4b6375588bebfeac1d1cee0056d7ba9ee3a853c5405a9f1c318a68c1dc99fd9d920106773ef711d0de8442ae8a4a66e29c14cb6afb71fd69a3578effa48bf14dcf36cf72e86233a6943fa85c9c98a4e9c4a40f28d07c14e99f84051c8535c64103fc439b65fb8759c23e2b846284a745857201bcc1547b52396804a86b1a4cb814a74a5d582af73a41de3304ac2f3e4c7cfb40ab90c9fcb9681655741da3ec9c214ae3ed0edfd0e712b706a7414292a1f847073d7b5a1ad414057e2a83f4ea83b813e42ec3d7554165e9c14c5dde86b6152b2d33f68a7d7897944820d319b3bcb0709e90feda3cf107dce0c944f3d349d22eb3c7de0955ec8a19dc93d50bc4a0fb6eecf9f630196cf86eeb90ccd366183461a7a872c1a83a96fde4f52d83b342e628286bc8074954846300b7e5ee1d26f38bcdd58f09229c98f9794a5d8db8c1767bf500e4f51de36303ae9253f118139a2227846f908def1992a5f5b282432840d070708bafd527be7a345aa0804e9586d635472ccd99c2ef8ccf715b541fd539a5a9eddbc37e0f5d3848c4c8f05ba5ccb0115b8fde909c1ba7fc5c91af1949f1fc121dadaa221bb0ef282373497d7823245a80ac0465570144a474bf3389517066f20cc11a9182b6cf1f80556f0c066ce603b368538a9e65ba339e15efb9203fefd56afc09b6607def35297346f75363839014a52581b8df91c4d84b4019fd818773af26a51dcae6b9708a7565b2883487e5f768ed1337d264dc50832812e14d8e751cd70d1c996288bf8699b085abcb098ce72574d18e031862c9a66148c99edd429e6eae10b363c5965fdf8babf7b7053f39118761edfec4e00b3c001664417d8f6682169aa2598d0dfedd91ddc7750aea49fe74ff4e2bb300eaa8b9e404dc32f5a05b878c90be995d54f26389c5e1079caf0551fdaed714b6602b65ba1aecd9ab855982099c0a833f0efde88c9d4f0b8d6eeb3cb85d36e175c5ef72fc4be0d111b3bc84c5ea04d15916c644232739dbbaf95d40138ad3d352f41291e51acfd874e3f0ba69252f8367b444c1d42268c8a7793a056f6025ef05796766f9534acb545e55831ad42c50a301bc02bc29e8f5f4494b2bacd49ca0abf4049d581b5c41b6c87a34f3caf0cef0d1603bf56feee1a58917699b3a8d5c4d1b77c2c0ddf358603ae509e696bc6f799302bdfcc54837378200d1ce92943fe776043b759fcf74970f646b65366a83b949250249821ae18a736f1305431d2e5eedaf5ebc192c99d274ab2ec608713756b297acbe1ec46d98002f5af765865e75676f17ad595c7a93cbc902c538ca59ee3f400ccf2fe6b5c10ba285d4f1c712ac1d6d2c3ed7e88a0bde28a1491dde634402ac80bad1b96eda454f26c534d8eb881c91b7dcaebd5fa07fff5f3a00fdefb96baebb8f977b8a4d51db823e88622d841352aa5295a8a47215bd26d2d8562cbeee849d133e956ac931c6d24d8bdd988fa32939a9c75467ed9cfb95523eac39b9722c74fc60e72cd5d78ec7dfb7d86fb9aee552f9e1688162f13115fe58c5a3f6d1e81ffd47053ba7aa2bc6fd13f62618edea0198789f01947454328f52b85fcc38e0f61b25ba6ccb80a186707efd2e93683ae768ce22199c735205f059efaf1d630a587265093e22e8c66fc8ac4646bffa28e936b938229f174be3c4e27c86ca98591cb72cd3c368c994d79d72d9f283d6fb99bb3479652e3b875914d970dd698d6a6eb6c6d939dde75cb11e7cbc22431e82b4ca99b59ec964998d6f11859346e21279ffb1a1afa89cb7e8999b90d9f691c8ed644aeac379d04d57d0cd55f2cb4ac453ab230f3f5c36240c45ed9c45df4c1281e489a81c4a0d55b567d7eb2b37911edb375417f59d4bb2c8ea08a6465c4f13b11cfb289b6fba8adc158d4c05d455683255bec58636a5ea2f97e8e55d8a6bf9290eaeaab164bc4c03a582379ad1c38ab4d1de922f821ab43d66a8e50bab44231b12069d949467113cc08e3019f9021ed30ee7c3002a8de20648ccd85e2b67d0a8d1f04082c5e05bc2e98981b30a6296d312eeaa9ffdb448cdb329ecc71f4bfa5923528dec4c8f6292d065dddd90a7d46cbf71df1a796f98d950d830219609e1b2a87baa9a30d605a6981dbe143edf3e45492f41dd266c0a86054a995d5c2b8813ee70177f4c217cb2a10ab58f3dba4540dfc368d0de54910b7d0060140cfe410e9d4b326fe761df61075540566d5c4c4f74442359f5bb70e854222d3ba9fc8c4647b81ad9eb69b0a2cbdbd909d353d5ab37df09d98f67c6b7a061b9e8b211de9dcdba40e8135eec3e1b257f0a0c6ddc9b687bc5feb39482bbd873cc2aae90c5cf32692a201973ab8726780238bd7b2edca41d9b280a448c489d7e5296fdf16bd2e070f1a9142060956a678e5e07a0ad1ebac04687581d9f1ac6af858eaae73a55df3ed74889d0822c8b3b86ce517be816abde658003c0e9b7317ec624368489b11513cf0e0a584fae12830aae65ffc52f8bea91221423502a3814408dfc71316c376768c18a9fffa0bae63ab3d7ffd1e915b644a3860f8321c501cbab069b3392fa106a71f0e119505528c3bf62fbde0ced3460ad92d7ed87b3c6e42c088bf0f39e639eb00ec2e4a4a38b84fbdc1ab725c2706d73d7a41f1a3f352150cd37182a47b52813ceb20ce4a93af41b7e525f24f4a54d0b1e0d229bb238c320a3907314f566abbeba3c724e763e041a9bd652c3a55cf9359ea565f01139121bcfdc0dc1921c53edb851168de62d3bbefac81284b96a885d574985fc307e55b2345d61dad43b4307e41944260e9c4121b1571eb01b688c50e5fe5e49d859f25e4374e0f348912248dc056b56cb74a33e534cd583f8af3b659a5f4749c30eaad1883823ba810fe976afb74c2c4b53a108ade0bf1f99174b831558666310f81c8344f0000155d837bf1e60b228418c14c39a710b3b0f31975ba5ace7b2e123424a746eb7e597518be449d22b6de15c7be82d7fd01803a3a8053febea4499bb770bbd054c2e7c270bd4514480ddaca809d1310ff0121410be39a97b41a3871f9794439cf08909411c6ced3290c3cb1d1052608c1f522d9c75288622132bf8bfe14bef0fa20c32e7da24c01628bff4751f7f0a82665b4f43e5b82c96228bd02a24a602513c8178727c307c74d3ccbee4a4af796a2d467038b89b8438ee4d1ab53e68759b169b9e20bd067155434f5c2fb9ac53e3d397bc6d12e73310d309b24615360287551133ab02c465efa2b3b22a70751bd290404899b78dd3b98e7ce9bbb45be4060d12deca540f9e652374e3b8611bdc1c60adf5c6c76cdc4b2148da16243fce69b50a50b2ba83d097ec2888126fadc2fe046a400e9127e2f8007be02ca969d562dc04be4d3fb1c632e591c24f3acf77d9c4f5e99875638a2cf5be2961e72154a22522ecd665ffc19884feb968f6f216ec410d77796cd48e33ebf3d77b7788a3f514540eae82c0a6cd8e0185d18d0907105c86ce1d44b599eb7115d27febfb5310dfd52cc2e02a0cb7e58e318c79e994ad786004eb3b1f523ca33d4465341968af631f1e02c3ac3460be7749fa6c7ce840e1f64e8c5cf596310c117515541f2f570ecc515411c27e28b52db717996fe6544e60ab1ccc9119052a067411dc8e9481d6dce1e5926cdeca9a780518b5fac5412063ac3ccc0be46feabdda6015301f18c91e6db445d20a0330225715301a58483b317551e812679863ab31a55600c734d0aa4e339d129cf97ecfe9fe7f602c271d6112d9f83efa596686e34723a35adfc68f045238d67bd4298ad5cc0137468f2579ccba1b00558d9efb7f257d8563341d1a1da2581510aafcb2dc25260260647444536606bbf07e437a6c476f0103c4ffc056aa2b7857e6619eafd0224ec3feeabe37ce3d8321292c6408b05d2145062bdebf13894afa72c60c76264ec9930e99a26f3d64e787b76bee103dae9763ff55eda634967625f240b788bc632fd9d7575e2f6aba24cda818b5cdaf1bd5744930e0b62c7af400b8d16af5224092020125c82a22889dd982e02fdd0b82422f135e3ef4420b0ec3065fcf045d59f91e86069abadaa689515b806bdc9987fdc7475b2f92c017241c9a3ea0170fa5c6b05098fdf0c8045c9e3113ff226239e43f34f231f2fd11f0373be5b96d43e59c7da20578a8da4869c95a44c90ebda7ac37d581404f25c54de01400d796f2e18c322e3cc9419b4ef5a2bb5ac9bfb0cf2ff67c3d329a551bbe7cc4e578ed0c95e684eab9e17c9ca75172503c91dd432960d6f638dc4ebd6d2360e48d3cc23da15e3e92a9edb9be80b0169780acbdab3a9ffa81ced3318ebb98083f17bc45f0c6594f4ae7eee75dfdc8f8b96b24cd207b29bcb9f954c5521ec6e0962e192c5364cd03ce60de1fa66d0b84b7d9bc069b66f5f79cc0af4aead4b85dc118741bba15fb21ba91bf0ca39e6eb634ac645e0fa02862bae8b4922ca91693495c085e0807d1b811bc053bc6c0e61633a1c89eee79893c79c2128504cc564fe88c4fc8809d7f7a28e494062ca026785dcfb64681901db2a745b389ce0f8503b043bf2e10cbc1fff723d4a22fe19d574b4543b72ae73580795686c74a171636053888d84713c60983bac7a3320dff764f06c948c941fb7456d2be01f29c58346b3361263733f003cb5dbf316074a40aa1ed7c62c5ab20058da06fc0f1ac826214564cf3343ee167b1d53930934421d6fdd703ac4f4e84457fb52946871ae077ed515c65870c1d6b5e6ee4e880ff384bdd9a651408df5104ba332c924c85158baffa6e2ed27bcd5bf5b47ac4baa5c9ecdf7290316f89a923c754e86043defd63355396208fb9239ddc65308a19d8f597ac13903cf3b6df33a8d3f853bc007f45376666ee6b65ad66af002389761bf02240a4b1f515d8cb27a6f03c625ee4cf9dc9909d6e0999f737cac88a8ba48f4becde299dd03bb9a7b761ceb554c76511964788412f0608e151359f6852b6915ce0d49abb018b9e10a4e6d83d3f72a2fff86c5f7cdfd83af78f91af0f46bd8d9dae9d48fd9a90f359bf2e93f57f1505ebbdd54a029e58f6e2ec23e07a603fd68356c11e0eb5f785a7ba23c87e8bc26f963d7caf718bad5f0e3d8d05e0c709f5f9281b0b3ae0107d59f6ecf9898c287e2b8961f6c06f7c3a760e90a50eb7b5ab6e0aec2fc1a4d8e2db89e9261934dadd3f19b85e61c4eae24d7191d2adb27898dc945136071057599976091492dde44dd2b86983e2537445494872e220fc9741a45360191a7f5b320a7b8bde8ba68b6139a4747611eb065c7fb6dadac758c97fd0d2ab1a8ef8604afff0fbc3a87d35462ec8fabd1cef0408096eb1c9631e00f0b1d9e2bf494a8fd85bd92237c445bb228278a7199faa86fe1973d2251693cfa28e7252dc56921a20d41f98c3750914257de52ce6ac24089c8406fea93152b9c79647918897e73130d4a1e172a6227c525a64e46595cfb6188abef9866dd12a2a57fd28081099c7d28f5594092c07fa83343f4307ad2eef66cc89cf1f7ae99b30b644d0da3780991aa9446e7243364d74dae8c320e3f848fe67730ec1ab7173f2e4f911c0eef7f6b48d3ca537885bb73e62f284fef7a480c406a69782f9c1318dabe8e154f51c6ac35a54279e941af408c12a24448d9062d6a3f0d077e482ca4c75cb14b1a8eff3af92636b274a8ec74e34999a4537d159b16610bdd345d4052bd9d3aa7178a0c15a55de2519e390eb729a60dfe9c5d5ed5ea56606c42c752cf0b603693828b9cb3a7bf412d59a046ed6393748d32c2e8d66e09a486cb9c9a81864aa8990495fb7e88b0717b65444c33b104d5d1919e1aa1ec2c14050d9180b9351677f10cdadc104aa90a96dea4ae64b94e5712ced02abd756a1f504c49c8a699a24314420610411df780dc9530171470eed253cfec5ab00b57b43edae673570ba708f20182cd29530dfb4a42c0c8631abf31a379e6043dd6d05859a39f0318b1e18aa047613f8139312abdc810228ca66e2c1ab776a6e4a02dd13cc8c7b3115221224993d406c32287de42160f3dd7cdf7e44cb7b25425b848337b14fa6081011b8c483db0acad2d01fe60533394b5de281b2d8c49682b5eb1420e6e45c7fc2c9150f6c154e97d7c89370ef7dada95fb3e5495d984c1d78899494971cc893003bcfa5834fbea2d2a378c6f17c80641b7302e48618e2a66215a3ecf8c46b26ae4489297cbe890878af1c4c44b8c0a3f689936d9fbe50e28862ed22788fe28086225931aaf6d9efa2b35a4bcd1654d0c866ae44cf32c0ec1f27678fe6e2837f52c6d89bde840f1defa46662c97955e3d79108c2b91c8478c491ac5b480c149da6e28d11a788cdd46cdaf29092480e1faa2107c58acd5e631170707271214a7833eeb814ce3e0d6b878af78106e446af5199291af829a9300c6e398c6b8a8a39238eca0f9533ac7e2fa84fd8843d906d839098a113404c665ae8c8571bcac4490b36a9d06f8aa31b61ef30b986682d3b0b915ec416434e3b8f9f90e63499dc4593b02c1c705e1d9563800f995145008280792e1e608b3dfeed25a587ea4a540314ffb6e0db7bd0560d65b7c9fcf942fe456a6b0b3a94fbc7ca761fe93d07ef53ae1ccf80c642a349df187d30eb749e0dc0bbaab4c98d6e0cf77f35e90ab447d2899ecd1223674f645477197d674c82733fb092fa2977034ec10e0bf7e0eded6c69e80033983d809ea720972f498dde67270abefa2830eea757f3124c5c8e907433664c35c2407c3d115a5164b28468ada6269690776fcbd1bcf905939ec48405569f21690635d97a0e2e1390240515525843a726bc50e77fbf7d3981097b8104e0a870f1fba2b897cfad373010f5699e22b6dbe7b4cc12eefccc85fedf2b7af33dc5abebb4bce4960b946f13f82d0907d703575d470eb035c66c3c54b5e77f486772301442aeeb881420d5fab9fca74e363933f6f0fc439d65fd81e4746e9e97ddbc5ef82f6e25905b703e014b2554e7fb0ce8d1b84a0c38753f89c046b2cb03575d2086a59b11203ecbd704b4abfa064f4c44bec269353a3a252447fc81ab032857da0c0cc040042df053f328104fd4df271f8c3fe226cd2e90296c9c22d6c9effd5e95fa34e5e2bad107dd200ce0852043ceb631ebdca2df1889f63ca59f4c439019517b3ce41a447d530e661748433093309296c723529c21480d8417bf0e07bea5cb48a7848c907a99ef922730042f6512dcf3cff6c889c079ae7fe8ab16b0cf2bfd0d85185cf1e32d1370fc593402b534ded39cee19d17f7ed2838dd9faf8c0d0224f83fbfec9f70598b78ec53955f9b1c9c261b1236897f386041b554a71536b963665e0e7a518c09e077b68d52bb15b8abe90296231519617a983a7cbe66c5a7381bf298342e81a560753a60db0327ea4ddbe7a4e29fa617489749bddd43f613799a1782e12535e8809640d0202fb589278d3606f8a135e2c19106a72a85420171b45b6314d0241bb1e51779c7f929c80cca7001f83b0e659428b59bd355faea16433a27bb22cd0c76d524f3aa9b825c9386b2bd474b29b0afb59ab05426913ef47a9b915d0cd328f130af141e98674dd7e2422e19710d36a371f5aba743f60c51fa92432b90b0848ab2d8f6a27bd20382e75cd0fab6abc7766a691a1138643c4d3bf1497c037d17174f445fe764a02e812f7f22f9c55a1109f40528a0cbf248ba749ba1ecf7f4100b3b74ab9cffc6934eaee6137cb71f142acdc673f33212694df6d142b24c7f94d058aafb560b66811ca3d8814a05c75e926e5cd587d7284c9ca42706704f18f48a579ee7e85d13f7b94aa25fccf876cbd080026f1359063f2e1d889f763d94d75417c0338e98d51e8ab6d1867a60c1c5fceb6c4505f3a926b6c9ac1d686f757347d928c996eca7f8148871da59f440a2fa1610cfa41ff3d128358556df00aedc124a891f4890cc59765a91c6c6477de6f9117d4038788cc9f6950b29673db5c1e530700b9f414356a5523d3aa807e110610579f88bf95a7b64b3f927780ccf078b968a81209eb2a90c7350de29fa30d200c0392cc7e8674e68051b326ffeb6949a0023155f40f33eb478801896304b974b8c3f81138f05e3efe5a1eb1d6538770b021816f8dabd2d0db397d913f68927b412c2caeb067e255c0c8bc3ca74dae9c6db9329702aa6bbb2a5c8ca40e1a83fbaea22c0dcd0816a8a2bcc9ad76fd8a7850df4ee1113f5ac0005562fc3283962ede07e341a725140bd2926b6434b9429f58e9c8d81f0c13578c8f171792502e8da59c1c5b624677633141da622400010053286f19829698a55ff459064d2b2c625d38a87fc39196901a5ca98155fd49cb8fe228ddfdef92143f57dfecb98f70b2073ac83056114115edb943f6687f1924aa0d419ee1f1889ca3100589fc13b4f73a79fdaf1be8b2fe37697c441e0093eec712c3d2b85df82d272d7990c9f95c55135df7e175900e142bd66a2a9da65bcf959bc9f663204e0a53f036bfc9f810bb6299422f461ba20a7a6568653204f85f588941246c785d5a7567a24dcbc98f4a42f196e7cefe23d6a4e21dd01b2a5ef5511077cdb87188737e5c634bb29428923504a2c66a5b20a4d2569e5a5e8d251e981fa208ab92c5f67d1823c131f6c0f95abe781eb62db4889947b55b6262f5fadd86e92efb19d808c4fe55a6d52e3e1917ee5190ac0036ff71b7033e58f0866076e0af5a4f7d1f24b3dec1621dbce87491db32595b91d223671473d26907785f5b3e6fb0c476702015f4d57e71fac60d622c21eb60c38a56b7a838224d197adb6fb9c5ca4314314c996af8a30db266ba4726f657449f559f43e7dfc44412f76d02a70e7c3d1b7de8bea0552c705520d38b511f224aaba4358fbba7b41df956ca370c34a335309ac5d9b58c2ec2d7a4655ac630a01efe44e3d803044465af6adc062433a9908f695b93904cc69b76ba1ecaf9bab1eb35deb656b711dfae940750bb466c598241ef13a3471033b8b136a61d07303e10565d540e4ca440c9d48886bdd5c571524ba0570c78163c066867a68673fa4d63a566bc1adf5375c5de99138c1ff87ac3279b8e1e98000545a61be0c36d44b1661a16a9ed7c7e210f303038d77fc89879d03de5622220c2fc51040ab0b34d844cb0bad9b0702ac66ab45105cd326c34f45a4ac92456cf349322844c078fc3a16f180ed42b53abd388e21edd784f370adf3110f6cb1cbc50fde71e6ae0fe43686cc6cce5373340d68371b1c95b9c7fe9859a8cac1efdc60f2535b019b3d77102a0bb6c6ac6a76919f7da7801678c27d6e3371c214640f6c98122cc21489a06532fe817db33f586381e8ce74e15faf1314b5ea99a45d8945aa6ce69c65444526bdce522b7ae38cd986e609b908ffaa3b25f61ca15a1f0f25f84cc18434cea660f1d0091dd24d18cb9539aee42629d72823e2a55cacdbb347370d6d4baaade16181c35946e3ced44d3891e4f2bcf7c27da3c0809857443d205d1588f8179878c61c153088126a6c76cc6685de2146df049ac66873a7a009b0341869a31cde3467247ccc760887b321ac4e6e92155745162f4e32525476b60a45590ae8bd83c28d3f4a91466f64b090b779f70ce125742fa51045bb311cfc92b6b12c603ee2ea06785a015e18777a4721174bae2de948ef530883abab1cd680c75059836264f8850e7051d0f654824230ca79616597d20ed89d252e4c0bbdd0630df6f00d1f24a90c4093c9ed0fb8f28f3113491c09a165892adb761f4ad8a4c54e6b166a43c95f470bc4f1690656934cf978385f44872fd23117a49ae4a8391f742f68b53d5be4730756fcfc73b6c323a13163a4777522178c3f97fcf0539b8f5eabacbe1a35fd1d18ccd21687eca49afdd9ba0cb246e92a28d955333c3e245d83a48d3fad394cc3b8f09944fc715c395e4b84548c1f3bc72f09033ef8c79248cc0368dba199d7311db1a2fc240909d63898e40c2b1528d46e6a604fc60bba7868576f9719adf92bb9618e848cadcdf862a4fe080683071fb03669adc2a4e93cb6434a52ad954e38c52a0758610669f653ea1827c539598341825aa344da76f8f28fef013227b820e8aafff3b155cdb4da9b866117eab93e08d368cc79211a2b1e57aaf10352765da92529bdbe880de53ad6efe638586227e2e9bcb0c82d720878c5d64f977f4c5947f8646ba2fa4b825c10700a411f8c0943c0a294537c119c5696dc75283a9f15792c40507addf4a32ef763a730e5026139baef8414f186b146f150d94b40e0f9467157e385264ebadc84034f5556e6c1fb5cf4b1dcdb3e5efa51f237e040a75772de7acc6eb5c6074c575e344fa0fac34eb37e5791a90c8000f2b5736296651a05f4c5fd63bcfac7810d8594a2f8b06b359f8827d35590bfb1b5250e0b828968b2a338fdfd33ba7cff478627064cb38f34725fe939e1afda5a7f197de8d5f7a357ed2dbf8498fc62fbd1a3fe9ddf8a477e32b3dddb865e6263ae32fcac35cd3edf149cb5976bb5547c1b9aae9b122c9764c9c4ba3096751b757919f46b5c273bbdbe952d6ca7735f7d32ef8148c944394ba4f9c5c0619b7d440e8ef2a938874305e0818de24bfa7988b77bcbd4cf7cf40f418dca344bccddd73469aaadc600240b6ed9eba6dfded90d011871db0473764efbd6b65ac1ca1aeb5bfa05dfdffd728f46e03e0f1dfc1d52c4cccd11804630b397e886c2fbc8292926325274470aa2789c41040b0127ec7049442e9e52fb00b2978e0f464bca5ee1f0cfa191256515ed62a9f6c834365f6e67e4bd3f7fa1cdd4a62feff89d7b07c0223e0db0662055450c67c2188f8a659457c35603667fb219b3ef1d4a0207a52756a1481d50918bb73fa43959d208f1d3c364a98d6661a2560233f9e637c9c9ca29dd8413ea4281f34e6a89b76de5e929d63b685f10133cf71dac09038e0a925e5693e9c973ed516cee4c714fed62262e56e918ee2b262db877c53ee40b99af6cc84043b9357f0f5736d8b9bec414fce21adde68e0af1a525be1322e01f73d08f4407767c9072ef457af6085856ce4188c5027f3244dca6730a707629f23ea7f0a18f2515bf5d993bdd9387dfec591c85321fe6d8c1c5df0774facecb62f03f0e0475428a17d3ea67db03a725965fa30f01a7c18f1dee468e6cbd79e71edf42ce65abe05f5b781216de429de5d5b197eba808e61aacffed3a469eaaa1c9480ded2630f561fbebf89131fc766bf545dcea9035593782a40760e46399e14a1c0a5fb1efd49d8cd7b32bb226d052a949808bca821e3eec8f71c04d359677a1c81a4813c661a7069891b8d7c0a49d12ec1440b52a742268bd1e9f300c4063053c9807666a13060822c81c7c1201819e13f67c42e7c712612062ab010c503a82c14023e2fd3d795b6e178f9fbf629edeeae0550adb38e178805835d87f4f2bb649ba1255f041b6086bc011626c05cf3f61a2248a667a2ef330153521326a6958a89b55ddc9f1acc0d8d4da8bc746517dbb05ef85ae238f0b163727df9328236427517ddd95d371d7560d183db7c11641175d31970d533a2fdabc8b17c05caf73280c9ad2e9e34bea4b81b7045f8e2d9963c5aaba5d7a99bb87e2a68ca8bf523bcff995466a254f8deaf47bda8c37e89adf9204eeb8223c93ea6a5956c984619aef4065cd2cb06d453a4651596e31812a15c5b8119d880d20217f559e3a77fefd298051ef1929bac062dc240a025400fa2f73e6e6fa9bb879966503cc09a23a1a916738872cea33068d71c3b0d05ad2077e0d59f8c94e7ef9bd6b47046000a2f09420177ac309f75bfe420bac9fc7cdb10d68a89928f06a38e1a4b7f35a84b7d31cab1748ff6cfb99fc07cb63987a29b7b4a6fd4943e7f24f32524462a2cfe6c895114ba705c06db285077cd1e83196c891e932ca059107924156e4e33b96835f8198f165631e335088f5253fdc33bad0f8cbbfcef459203a25744dc4a749cf79e88ee65b90e7de9436441c38646a4087a7a7d409fa8b20c211cce0e4e099610594e2abf19c2af69541da41a555836d066c11729b213f8001bc896a03393a2330e5ea2cda06ce10eecb709b254a3de461ae25f028808d66a6247e261fd2676c27f429eaa3ab91f4e2e67cd1b65961983bca549172bd8cf852e670a889fc2992e6eb160b72e9ba011fd71ca72275d9044a2323d2dbead4eb84e25d16c902d2792e41e5f62c1eec190abfff02b663f366d5af4200c03a519008b1a3ed2bb27551a0728ca56b5f6fe24b99a1f3c44dfe5025f182661a642c1ac1defaa5c521bbbb4694b37bac8aeb4c15642a594e838df0b3f3cad482a24e328b63955d3bfa47446334875e21431e94a724dea1c09396369adca53e656bf99e43af67418e24bb7249d3ae8f3ec59baae491ec67cf5b6f222cab227a626b8f75e89bef67dcff99c93d0c03d245e5be0f4e4a84540df6e52eec8ba59e98ab76779c700611d75a0e77ddc6704d47aa92290a3cf66dba7cf14c82ea66a95d193fc44709e0186826e61ad5fc17c4240becfbf81446b771386e073a59683ec60986aac82f702b4d0329ba0e489894f2bdab40815adb2d4b822742456f5291a4d06cd1367359c7c4c00fa7af15ec3a433962a87b1375ea2a18df9087ac0698c2baf9299e0956205d3d1fa0f808ece93b8223805cfde0a8bd635e74b63a84d12580c8411942dbe11f031ef374003eb7c30323541a81018a7a9ca4910772b6f8825afd5c3ac0d6474a9a09d4581627a27534397b65449013095ffdfeab251cca624df67d8272e957a3f6f5631ef09e8dbc8b75efee9032c57b999425cc81b2eb14d25409fd42dfa0d368a4a27500a9d0053973bf39aec3c6c7e892578136b1f9ca5f789a5037347714910e18a0f091d55616a7095e11e515efb6cb9161bd5e7f586153a996208b69e84753ba88696394522dadb1969f438bbc7218d5759759a0bdfe8525f1adbf5af318ec25474a9574b5ccb76be20111cd846686a4ab6393da5706c1d5d0b3b4b2c41cb66767478c9ed143b68e06667295fd35721913f2305f1f25d73d476e81acab751e1b729b1a4941cb30d0a82246e636a06cb78f3d9a565b754a6ed3e9a29ad73e5320f2a2050259757bd7f94027d6d18ce208a319114ae8b89e2356825c369a3e484a499c4a285feab50fea39d9a1dfbf9cd98df9ae01828b53d908f50a639228474d32808813cd02633cc9d9cf2b4eacff366b07d5782aa3866a28d53a4a5c99c0480c5bc366609d670aab351403e84415ab892367c77dacad0c4e34aea6c644b9e66871a0d181979946212a50de910cfa4a55cc7f3db1cc83154296bb666a42c20b6c3506b42ff48e7e53cfa74188b35ec2df0f33c9f997d9a5a8cc414314b9966590b51c8354ac4aee97436e1eefb36fc1b5c1c0c5412f64ffa861297cc8aa8b243cb2b29d64f84950c98ab5a9531e84792d026b121768a642e53493387262ccd1f464e60558aed7486b241e78670dde278e97391547dbe311128d5c1d457697a185f6eb467f6b4095e3da19dc64276c29ae36169237e2074e4ee53f15ad8171c264278f8fda0197b3ba8a28e4770e6197a18cc89162cafba8a71a1d78db96a9766534db97d4a1c6ddbfcd05949f0de005835404be3006906444392995f06c229c9c86f7f7f40f4888260bcc0c7bfc8de59154b8c1626534245727ada2c3a0bca73107ff3e0990d77affda0f0ee1d39ab8c957d39dbbdfd019c099be7fda2e5497408931e5fdd30ffdcef4999283b518252b0a0c40158fcb0025acb5b4623d33903809ec672911c27eabf14b0daef031fd72e724c8f689b00662f8e281f91be76901d00998a945abc69cb6ea1875399e927f17bea84c9d42054215a7bbee56f72d206f1e08ec44f4edeb55fe1d2ee0001ec9e166a35c6afd57872a35dcb7774c885ddd9142f1fcdf4e6880de54c6795dac32a145a172c29d5e4f0f39f03a3d346c4a40626467589596096c36cd43ae5bab0f1c5a9d1cdecf045de4435019efb62bd96cfbbd05825bb7bab7f3cc12c4321c7fa43c9d3673a29c9de202b5ee553c4274c37b2ffaf564fc37ada49a4c61c4e5121c30df69cfcd98ef1f9bfa82302cf6d919d1b1e1ff3c449440f247c9ddbe6183f172c76a7d024f1e91c09a238be09826a3a9d45d7d2f39937004c70806c31b94f27817a515ffe94e77b01d628827ce09d20a5e0929b1f7a37fcceaa3b44a2018a6b60d7001848116b7005a241be0cf84ac520067385d51527d736060a129489fed463b88dd3721bb7e9582eebb45dd3691c86d33a2d8d39699deed3e91445a10b00be4d10750832a1dd77309dfbd92db174cd63551b6108c33a82a550b788d1c60726540362ad5cadd63975fbddcecb271b89d3e9f53b93d9b11df6df80887cf923d74292af85f56ce20a9d6616e62465169ce3c9bcebfee5e68c06c120d315700e111bba7f4444bd52a87adc0856b87e77f85d8888a19849bb02910b89a3e4580e515533d67cd2a1c5fff4eb4f38da001c1707d8eaaec1944a3d3e2d4d2d38b42b37a13a870a16b3401d8abc4313f428e1c86abc8d02393c85101ec3696161067de3a546553255af5b4ded7a11e68a5c4d0ca8d49e94e184a591c4c22fd4ea855c41ff5e845538bf4f4c4c20458dc0d9f546d7f7fe40c4106906575a3bb87cabf264ce40a82e88119f54b5be148d3037d89eb1cb3f11e0d35434994069328bba49fff454967e221c92c368fef0a35e59346ad312b6fdb2de77fba572b6ebe682e6087235da10fe57e863ea742df03c42235c778b2ed2c7237f49364030af6a8a827468509ca8a7d48d21142008f60e10acee23108b19803582d6d707d4f3312c974322b8ace1b2c329f21140facfad5b26825ddd69da600179ae180dddf22e6afe5331d5ec7d5b21dd862bb947a91dd32ce50ca2949f23dd4f96ff49c16150e6a8023669751a3b6508fb5c85ba160f1ea4862009ca4a42b9daf635e5f6b6385ecdf9a771f7cddb2d541c327a137df088a0676f850c6d69959a4dd1e0a162d30921e3681ba4c08829108b29f8ca1c8760baa9b5acb4e7b41dd8015709da95e098201e9d8bcc27c65e1014c9b23233690f4662d0450eefd08776bcb10a0649f15f594c8b1ba5500c3fb1625750621c64bab86dc7129ef84571e3e804dd7a11f10f4cfa19a1354b8c07995bc390749dfcb16b6c20fa8af41fcd980f529c2e03d43b9c129df4cae835d6e2ad7e8bc843b9a079c06195a2245812d3a51eeb4cf8a3ef3e21c2e98fa3f360d05ba9ae48057a570d5be494ead02a2a56d13d2abc7d9f40ae719d6904b224c3eb6c2495e241d7f89efa479707a7150a746a11cd3c74e8a15020ae356107f9ff0b5dbb3ff394b7ec1412d69283c8a72955258d0baa6a26ebed3e9367fb9de43ca043b24329a9298afa393278f43a4bca22870cd5eba0d9245e6a2a7bad66d83aaec808948b1ded4b30c66a08b0a4506a09d23e0c47ebb0eaf481176ec3a9a67a264798eb7255c7c28428e08d9a39ab1f1d62661252c1d8fdc64b849818fc6b97db7b7b9e810670184bc3721c61ba46bb60fd2a878a1524431628e0362bda3e406e9f8a98d5e18eb83b59012ea7c4c2c22478672738373b4434947e6d3a31b14d58fc8ca045b1d3369aa885be489853eab819d086fbdb7328477267dfb846c08cc2c5a6004f96fbc9c809903830d821cb55f7721b23b5fb576b30ed0ed15cb69ab7a582fe87a828d8e4b5355ec1ec991b29adb8b9cdb0fbdef72d683128e220d59f359897db3ccad708c2f6c59d95b9fee095fe80f66a72e679f77d8861d6a4eb4eed1fc22c7929b851e7c56c35492d4956985b7bb2a396004233a84e9e669605797559345ea64116a1b2617195d1df2aad79950dc328435ba213e7e54ef66c8fb3a13afb02d437608e7348fcf885eb896fdd2589f9ad744f096f529351e078cdaaf902c73cb22c7cf1e61c8634777df8e84cef4960d3b650f45c64efa46a85285a77712a2ba0bc07980c75c0f62cc82019226821c835385500e2617d28574da8c4c4f76a1cd197016d9c270f832045335d497c76916ef53348d9e11733c27c0e0c20fc41539d35a636d1a79ef5a2811d083bd345a09073341bb52f851c07beec9d13c2d1adcae6c45c27e035c7044989ec9cf5314ea9ce5e11fb95e5825288840951ad94b22ba66647abcc9f14c83e681f06bd39c356c9880c6dc32dc06bdd1ca4388216d16548daa10e057b62de814f5cfd1789366c9f3f6bb7ab78f6342f5b592ac0c345fa455b3d42a163667f84899dbcfa6f4fe41fe11b6c8f152b9f23a5b3b2c3105e523e02377716090e0ec642dd8448d7113915a0176f668290475e99bafeb6aeecf22470f70f9880bc2fc8e7198e33f66127b92cdf01816483b541460a7ea48466782b29edb10f814e9017fd9195fe2336c297db76d3f34a7e27f6fd3676af0b6fbdcfaf3da4c9c6442acbfe9baebe79db8f4738bcb0ef904ca1204b8100b5a83cc654b901d8bc21e292ad3c4730561c8e9c6dad5a6e1c05c5426a9a29440f7f52c577f75dab3216b058dd308c6af04b28d58aecc9d5f91f738623f118264972ec41ca1a435607a4dfb6d65b14c01339f2a57727ee754b19f7356755f8c4e96ab842ea55c2d125ef7dc3b7287c56da147dd68a7fd40d30423bf8c54e76b32e0b75d7b8d6dbec1b8c524f4aaa0c67a18d6b0f3725638c6c7cba0af62156b6627fd722951f81ac37c5b667d9ab7a1d10376381087bb2a5ac9fe144137cf54c002d43db153a1ab7e0f28046f8356b50fb34fdbe1212be6a06df3c3405e34a09aa6116076836d6ef7b98d608f0bec3437e3ebc57676348a2f3a90e2e2332ff74616f314a6c23764f549a6a4216f314b191a096fdcd3006f18f73a0e4143d017cbc2b84a1adc2cf4f606c109b3849afdfdc5aa085406904b2ca041dee3b8240dc4fe99a1b549c830d884043caa7ef923d5f08ef42be68fe7e4abe63309a517cc21053b1bba967842434278785b3491b917acaa513c2e7210f6a1eadfd9d5cf3de5375069047b92e857cd32ca7aca5d416535cfffb23413f44a316a58c1db78067e5e84a1df30c61cce7f42c27124c80a1bd60670a5768cce3666252b420aba71a81480e23efe74b1444e53580e913f4eb8072544472e9075bbee8ad34e8d01faf05f7110bde67443d5dce9673db85d8373e8bb48008c87a9148d90fd975652f52bddb5045d9e657c4492c35d60bd347de1eb2d51de012c30d5ebb80397bb14ff0bb8c39ce4197d0813886dea4b3b49e36b0ee58eae9923e2256485ce2954b3109169f5f3d9057dc3f84c58dc78548b969772eea441627046b875c97f9e4c024a0bac05f9a3eeade11ec0961833683b6bba7918ba9a9f9ebfc7bf675f632f33a7f599b88cf8a0cc8b0de1e6562e7a9615b2638abd4ff7e841189b0c114e174210a6ed0c7f15668c2048ff4e285ce4e2c97626b22572725870dff9380b2cd46c66c3b5a050ea393b5fc980f1ea4062c229cb1c80accaf69d5180268d0566e55aab794c8e9beac30e120eba7ec2701c884c3bf75a71c7a1bde77bd6d333dd890f29bface5ee7f772bd45638863d4519367a9d303e0ee6c3ed84197ba06b93aa76d10d9534a791f05a789873fc49cf4436c58e3906998e9a64f20a30daeec5795f0733963f6ee3fc3c0eebe6796483be33b1c0bd797a73feeb58d3ede8f5c1af4175bc147ae8dd1ec4a0352937c4891bb291fad52cd12bfca344cd0b2f571801d2e3af048efe73f28c5a066b19fc71fdafdffd938739c14825f613b6dee232d347082e854227bbf324e240a3085070a2b2cb3861fe873ae7ca72f71d74f65f06f39a4042e0d84c530b93415a5043ebfe2e52b28c16e9ade4df4ae082ba2e05414d363d1eccd44ce5487ab0167f9d292d1ad0d10b0318f5dc494adb4a913d4d0c11405b7505c2916e321f2bade891a51f22cb522cab1156d8483ebdaca96e0cb0b622f6f2eea0a57c3e64a9224ae9286d1f0eebe5525e0085d1c93a49761026ac6d8f004883e9e8714ba3301c074cb7b9317d073125570a1ae946858a98bb14f4f701486e295df7765b4870284a7bec251ad65ca8777abf03f7eff035e11df53116f8f8e2ca1717e68a2a2e317e89a43a0973aabd16ca701f4416cf9e24f71c95b76b1ec07a546ce83e967e1c5883d0b480e3e3ba09323ed9340a8e28deb8b10432e9360440c412b545782bd2b88f62a63c67e0874db38110c8406a3cb3c9c43b4b19c7a77ec98a27387d073b91eecaaa45569108c34368521fee05651e07f13445e7028c9308d1fd4ee80e593c591b6208328286c533ea989709f3ea0270118261292f02be8481c784187ae0b30a7dbcc88d70baea262b96325cfc767cde58c81cd8724726625ec7ba748ff731a198b27093f8a6d9113bfa3c54355a9160e9171d328a16c0b041553bc5cabfe26184ff012257603d563df3647c0150e68aff8cecec54c38ee2206f48a0916e93f5e1aaa07b871c398e024ae856ec00ea45b9b56dae194c779ae229bf54faab09f4123446950a34e71cbcae5c8b456b32e9cd170a58e5450e60edc0e80708d18382d820f889971c7516e6c5122173c871a5ecd05caac1161204870cf9b8d8996ff8f4a1fe992b4ceb436fd40d7a8eea705d23b06de4ac35f87f91824c0ec2cd70c8d939c08032b9e3097dcf8cb8c61476cb5cd2527621969503da51297c8b8041c1fa762676852dc24c0d9568f5f893f2313279ed04cf29992b3f3e9878076effab9beb77def2fe1f11e9d059755186897f80799942c1dee754d6e68b4176f2f2bfa0df721855425aa482a2455c95528c040552dfdb2506e7e1351299b6c27c30347f683f8a37244113f43e6f8995a43a6d4041ec167c91f12560cb219a9ca17e24f9c8ecff827b58199b9fd0b5d182ff2126b944610bc5dae1fd0f1d57d4ed33465684363302217784f266af3b2deecf64cb5e8a73b1e84b614a82f22cc788d8086df3adebaf72d92a74c8d09a61d8d7407af31e258525159f7c1120f7388c83d89012cc2b7aa0324d1d029e07162f5a84aa4f30a2bad35dd9ed60e7fae2750604b31372bc5280f25778e9e850d9d4a724339aea47a72ffe3c1be949d8ebccbd836a4b663f6b4c8d7820c8a6a4a39b613ed6af48f26a4aece81f2a2cadf0f72bc70dd421809272db0689d19625fabdaa143686e9952080778572483e08efe5df8a0d0988333b5bd399d9850355caf0dc75b4c9ef6ed152befff73cf9b0511a41624363b9c2de28caa9265ab40a76b011877ee465e6883f308a58a9125f064b403dbf14384211aa62ee306bbfa243c1e142f67911ad1f8d565d48bf9f87c15ff97e9d306e4c6dfe1e3804c5d6bd40b24668b69cf2cb81fdc44a2301c07039655f7acceac0a4104caf6735f126f06e25725953faf92acc296926adc41a038ed5a4a0395e2973368d03680f2e56d2943180ad5cc21cfcc221643e0e0ea8cd0b852ea4c1aeff398ca5a320fb38db0595a5d8265eaab3344efaddd4c36674ba38b5ca2d3ad3089476ac2cdbf8dd4fb6b8c47730237e497123425fd2ce32343085d55a9ee4ce903b8ee63b050412a37109b8c790e4d7f18628cfaab0c51f5c01f8402db3a793f693ccaf76166e5cd1bbb1c943d521301b5c2a9c84c9c4bbc5acad6270932928cb41735c7d2b6d6c4629ae60b0ff2790c49fc31648a100b45c3ed87c7952031c38e7fe69f2cf68183045d882cc5f3793490017d8b0d36a6ee19034a2e06554eb7834c4e9069ff0da055dea246cce93cd9a19c74634bf41e9599c5d8870929a80193874e7a25fea66804b7095da4d351f7bfc04cfb828f34c3e8e650333ab8bf44b16d09761c5c8f4d2ef0341d86846b3cf64bf0b8bc3ef8384530a04fd3ce7e878539c66f1bd4b8cdda78a9505e068bce52245546292cd7d42f5d25b5725d2deed7e0d25a618acd84ebe9727eb614a2dc5fe775e576304d0f7d83e3e9b147121d6248833af463f8ae5fff2980eabad83a5ead2db194db2b3bc2cf7e8ca43fd0eff714cbba51cc15ee5f2c227d141db036efd425a9b82590de0598a00dd7aa22f2e55a9bb6455f11b3f7e6eca4ba7dcee062b35870f09bdfcba64a353bb8c66c519fa9d8ebf29d1d84480a9744d711a3dd292821b5ab997fb391170941cb6c03295cf90b39f59ad00b43cfe43e1d7b2142f1a02de4882e74ed60c7a51159f42afd7b2513d83814768bf4b2d74a7aead3d0c01d9b60b032a28a5e97e8efaddb1e7814761f4d7f1ceaeb34ee040aeb03bb55309ed5241dbf2d916c810205803a49e2f43b46315206d7c4b72d41226b1b410b2a7045406e060c22daeffee673954a8b3d2b70e8c7c5231889da16563e7501e7477bc163debe8a7e6bad6d4236d9841042f6de52ee780b9f0bb50befed5a5a83a7aacb5bcb017d92dd9c851608aa580221a433a0ef10bea7c00b7e52d0be33417777431b38c8ef02d2b594806e94638c314210c02702085b96703b6c905d1d2869b86ece64973a73a10674a3f73d20084d628c3142182928d2c1d07775375797d6628fa4eea9bb5d5a8bad69ad45789dbb39edd483992ed923d04037ea3a26374a354a9f2e5726e64b97f66266623c05064db246b897a884f69944966050454e8c31c618638c8f31c618638c31c618638c31c6c811c618e319c638030a1f63b48937d21c93044147cb5c8ba4824029eac5dc7037e003e09470c35101b89000aee18bf1628917a3695e40e785d69aeb016cae8b4d6bc04ca2ed045a5b224ee1601ce5186374324a10c6ca06ea9a208692cb871d3972e4c8134a34d078a6715e74b813aeb0b94e8b9c2a2ecc755a0021c93d8cb9fac6a4a4a0d45b896c217c08e87bbb16c861f463ec378db8e37e947392aff7013ac5957eea8a0ff58806c3c6719a1bf188830a9ce6eef6a6eba66b898f05b292cecaeabab94670d95c23b86eae9b7b6171dd5c37f1c5f71e637c2fc618a91a2315e3a9c679efc5cad74d2c7960e24c13cc1b374d307126ce9d3a77e2b4061bc82425acb37bba5da41fe44b3488f052461fef6d5140f907dbdcad66922ce8e600d5a3e626982758c166eea6a8464194588a528c51ea47bb5df0758f009200de3ab3cc489f5e2456efd9836f655966ac57f7615917925dcb569608bcd58564b7b2772f72e104026f59220c845f59227cfb3cde54c3cc051898087bf4c0a0c2a01ce53aed6683714360a7206e2a150bf5217c374aaa8f0dee25be27ee25be572ea67128b743baa83a8713e31be7894494de270f4ab579eedb54de934b32bc9bf3590a7a2418f87888f7f8d706b7230e2e463efeb9c18daec7ec6eef89f56dc6f49edcf8ab3ea74d97757237a6bfea5c8ee9d68c3bbdcaee74f92e49fa4a6c95fb3c2d9a4b8fa4c3dca93ea9c7af75ae255a9ad884a9364807036311695efeebcaf2a3ddad310a75341290be5e73e05dd709a83bc543f0858792dde06599794f0c19ec7901e98627c2bc02e95a5a8231d2f08b5128909703fa7a09d2b574b72c036de2c5b8279ebcf7b408b92b7c130ae0ebec131726e1c840dd83f1e10eed23c329ae11dfd3ee6fd31a29d7cdebbe45e876b8dff79e32f0f140470e51dc7808dd9c81468cdcea5ca9312e14e3c2334f3df8cf4d24e229eb587ef0e3d952175a21d975b7c8c47c041d102c0156086300c6ddae5b13390b244a902841b2e4b5118ec2c47def2b88e8be8ee2ba284fae806271dd5740fb1b5f71dd5dd23777ab996e6cd185efc9234aa6b8ba2f5540ed16a40f9fd5f156d0af3292a702ba399deb9c4e24c22445f81ac2259ce0e68a5a631de980188ddcdd65863782054e6abaafebe12ee48de1587ef4ddfbce081674e1de8eb1a064652b380704c256bc4b0acbce560091d7638560f242b8c1db6c45642b2c869d5e56ab6ed7b5e0b9ba6fbe7faeb3153c049cd80a0f5b711b650aa8f58d32b9f23c1e0673272c3698db57dcc90aced1e7d16cc5153de24f920394afa02c49214514060642d810761018e804291d33b36376ccd6c975adc1d61cbf307c71b9b87dcee2f2a72a2e7fd202177787ebb4d0421577abe1db971225419ece351eb65cc9ba45e3d6886e7c0dbcd2a59ba4ca75cb2a062b755dc79e710ffefc347bf0abbbb36e452ecb0fbed71022f0b2851389e9cc6c1df5379198b6698afb607f72140dbf4fd98d4f5d521365c581f65d1197d6583275ea4d4d561c28fc5403e3a589925c74504876d9bd30ac4530ae4a209d6c07b82cb828dc025cf701b8189884abcdc585ae835170393a0a509404b38d6371709abc26341a792f1a79d1887b79ff9c476bbf4884c1378e7c15be6a2452b4d6f05585544b7131bbbd23535481822c2ec7e03a259c208c2b6575f17cafaa877ae805ba3b33333bee41f40aa76ff4abaaaaaac3ea22114529e8f472ca503769765afb56ef3d8f64eaa19ef7085f3f0cd677b1ba51764be26e585555afaadeabaad9035e082dd723cf555578e9dc8eadba25a757ef564bd13843a26d9cd65aae15072adf47aab4149e5e56b5ef0fecca99eccacbc7ceaa92afc7d257f6555596997737286ee8f2958f47bf4beb465dcf2d0fe8c332f3eefbbbcf6e505cfaea738a9dd27b90a04a30c1cea5d713fa7cb0ecd58df97a2690eaaffa7bf455cdb03943ab948b5678899832f4d99479ef55c72eabec557d5885d5e9b452d9ab2c11d4936534a39688d63865cac05ab4d63c9618746b9c3ed2a3cd73d0fb8da447349e7fdc8ed0fb8d02d03dd704f2f9783ebfd4be35cfb37f2a8de7f4d6fc819dbe9a331e4bdfe58ceb03f7fa46dd238d2302be6fcebcc946233da2efc728a28ddb3167deab4b5a5544f87a0e956434f4d58cf9832f2545174f24b057d59ca1afeea6a39acc5b3d85aa71abf770aba6ae0f113df258cfe9e7f4d394f97cfad094cb941a0281424f0949223e92ca00812e65d4947f6a7c887e522e2385881e51cb07d5d05d8f40a740353e4469a84e0755aab5f78117ce1fd9f55c7eea759570822fae43c3754a3001942b572e0b0addf8b25c927a9fea7935bdaad45ff5fce3b18ee559ac3ebb9ba64c7c565f75d3b14a9d65ca5496881abe34a2d6de69d488d8bb92fb35b66de086aaeb99a418aad1ec6a408c52afc6dd1a87bfb88d93c4dd82c0dc9752e195c238b090ae6593bcb8f09a76e263285ae9a07f6a8ce25ea43f6631ca9831d989a37dfdc20edf212af9e23a2a5ca785121c971e5e2e07448ecbb9dbc3874b373417eea1a50795f7705d140e1b73e672699933574b6b94d61af5e8725d8f972e631592ddeb95af8df132882b461bf136461b31c61cb14a986863b4b1b5c4ebd7751e789832d7755dd715af6b8a3156e75e6a4c206f3a0fb3c7f419973057db882e1249a24b25352694a426528e94b4e084c6599af4888b1e39a1317fbc4f5751b11bdfad87ab5ccaa2471bf51a972e31912ee9c820e60fbe2b52888b27123b7c629933d4276daaaf2ee7c5f04e767af73ccf2611445c9ffee92a53e657f924e3776e070fdfa6d74b1f2b9f56525eaba835ae55c65fab4f9587af54446cbf8d4b87487a44f3db4b87386e47bd748802b763ba90ccc65f6be53bd94f933d8faed55d47846f8b6511c2379e08bcd38564342e8d4f13c8fb6489300a6876ab5b62d00de2481c2a6d2c3efc36ae229a406c0bcb0f1fdec37bb80faee5f636cea3b9874f9f719712f2d0f89e33f1f64d217c5b1e2bec115f1a8fd3470f8f97b1fef01f78b8ae7a1bbfaeebfdcf04625f2d11be2df74c20ef9725c2f7768b9f7eb02c3f7ab80ff7a1074bd352c3d75a9affb251b7bfc6b1eb73cefc1aede8612f49d7894022f00a1192dd68cfc361269077b644f85e76933e3dc704f247bb49af34f5357c7f6b692679023a55fbd6a89f07bbc5d7f89c3f76b8f46bce442b6a8dbad48f9d15b1506b54d7a8546b34ec769dc5f29c5979fc7cbb620f37d6b831e5c69d1704e6ae1cd6cb0474e5f36efa5891be5da3eb2a5554b758871a4ea9d2250b64379155f2a9512ebc94f362621ddc0df8155c788fdd4425b8f0d46ef403173e93722edc5ac9062f4e6bf0486bf0b204145e826f1b282d183bd60e84cc51a27159b2b435ae9280b991a29c24c5d8c23e90413a1823b40fddd5a1a6d12dedd2426c445cf7eb03ef54c730d137fa8fa2313c36b7f3de5b7676fac993cbe3c53417b70ffb8bdb9fc0d8dc4a3fe9304a40b7188d7ceb272fc647922dfa86bb9dc44814bf3c5ab2d676111b15ba2ee6484ae4f6ca325d5a119e80b9b88eb3b8ceb563e76820a3b8fc7e17c210c24feed6ef374f992277e9d1bb0bb7fdc61da5f3f9d2f4af5ba125c2fdb62eadb9c8fd44caccf548fab710c5fd755a68e18b33bc64a40c461ff01d9f6bb90eb27d3ff79e752db748e42e03a4a89e96dc1dd769d1c5912be1159d832ec617238462c0f749921effea7469ba244d522572b9b8b81d43dc9d7b912ed9adc8dda64b6f92d83dde961617f7c2cef514b1c905d021f11c740c39cb28e6010d31a486baee5be8d3dffc411d861eba74950875853c318cdc343bdd9a58b9ca7ba356aaeb78236e356fab12e12ba5a5a1cfdef307e859263f2f25f541abf49a5d541d8d7c463f4f7f55ec5d63dd9ab0deb7dec7acfbac3456cb7bb6ea33eea934593ff6a3bdaccf2b5b036ff64fc657241255d0a719754be27e2e03da1ce2f4c885ae9c46b81bb235d3473708642392d6e03fd00627cb0e3d877715ccb9b0edb3b9d0a635d839ef063c843b17b675f86ed5ae9f36d6b93a9d03e1b35ac377de5359e2ddbd2ebb0e61ec5d310b6ddc0ba476c33edd3aebf0931ed1c34dbb8886716194ee8ea2fba6fbc8851ebb1d2ac9eca65d99786bca50f8ecd3e3a7cb4c74452f06dabc1bf0146503854037d185b4a1cd7bd0d9fc526b551aadc180529eaa4fafeabf780f7d7cbcf422b7ebc652feba3ee731ec59765a37ab5fb55cacba287756ed5ed5258a6b5578ab5a61e151ed5e92d0be14e31228ba48ca33c01664946490d6a29ca4f4579970a3ebce39283c6c33ae9b5ccc6322ff983c239c23b60d8ea04347cb0cda399c233ad935781d28421d32dd67f3a2784674e0c0a1e33874e8689941270c6be75ed421c43565463ef810f318211e848d0f0047cb0f2d42c408711c1f40103a8488a141dc46109452d09419511f7c38f5c1071f46948e748c46a3d171e0188d70e8188d70fca0638e260e1c7c47d55d973afaa8eab806efc4f11f70c8b458a6335a2abc3c83759c9a332957877d36adc5e3a8cf8815e806775cc79b1ebdefb0482b2d410e5bd4800ad7393c447cdbc08dae4e82eb21b40f6e7c47d1232f2eb3d3362786cb7f4cdee6ca70790997833fc6651786cb4e70921e49d7ce4ab80ac682b3e02d54e2cd34fd717659dd6da2474e4c17dc917f9689dac40da88c4db4163b07eebc1827ae2ad00deebc9d2494876f0e8a179f6ae7c09d6b6297b59f91ad889c262927293b109f78c08d240f119f84a80b3d28382dfe08f2080f0b2334c39df8f88487784c38477c4c3936efae275c59045a03af8b5cf924df55de5386e53543ec90a5c2305a8b7f35e2b4162f1181c21d08c615f45d4a13cc57ea0613c38059b94bdd9ab82e97d3e529b9bdc35049b2b2af79c4a5bfc3acbce5f2bda7729ae9d255a64b9f241b365caabb302db7617f384f991e2e1df5e16eca4030e2753957454b8cf617edf252064710d72adfc7976bdfa83bfa4808203e80eb7897fe602e552ecf1388107a89b0dc0b14b92a6751b12c2ba761b9ca5758ae72161539bdc3d44de5369e0020cea200be403cfbc3ab39725c929665e552aa2c2b57b904f38dba2c776d5956accb6960be721798af1c6645e5ae3595abfc9de52a4fe5371e10397eb89b4080f8b334409cc5d2c4fc5da5d640202c6c6df429e636aea36ef00a7169fe68798c75ad8de47df813e203b0b03521ec7d389c48bc5c7b4f245eae5dbed40d8aab4d93d42ee3252f692f76db0075655306c7354db29b0f9a0c42b341dc87205e83387cd2a320ecc657c371a972a9dd874badc22715eeb0806a60b416afe170b964954b15c781a85b131788c3298323c7a79800c8152b5dd60906e62c563e07bd520588afd497bb0e40a5fa86fcca69de59be6259fe72581cb7a1626970dc058775398f0784c3a182c3e5126de20ae02b01b864b900aaeb1b2cd30360e3b26e40fcc69f8a8aa591eee2e2a2f295aba848d2cb25bc54aacb7154776954ee227de5d2592acc657d57e553dd9a907f978761f94aa5919bca731c8803e0392a8dcb3b8dfc746959ec1277b371206c0dbc2e77adc997dbc051dd5579b15b91eb62711c476d3900ea96c4b5f11b756be2da38dc814faabb129b323f58a63f54787da8f05e3dc85fd3879476cea4dc161b6dd4f86408748b4f6e3cdc01033e815060941ead3c3e46152317ee5841b5c80192bbbd2b209317f38c30a9dfe8153d2c9e4e8f243c0f3b77da3a27e71979d66e54b5ef3752c397e52a95e5dd4970c7bd5419974a280f76632f2ecce9263de2a27376b09ba846e79c86a5284a677cc6e30d4b95799f520874a54e6f923ea9482955a4a4d37437a547923e555c708ee952bea9c202e7982e5dd22dde456be5e4f5ab9c48292f3aacaeb5ee6208a7d421d3dd4275c8140faadb14ffa9db7537b8435f068b886f6267a32e9a76a376a336222e025a46679b5a76735d5cbbbd85824ec2e9223e40c14562aca1820c026566c3e525dc0ebe6cdf45d26e226a6510687fd3a28e1e31ffdd881e59971a6b53f5376d6d7389444e3c26290681ba17687bc991897a992e7b40a54fa1ea38741f7d43a7a11075ea3252422921dadae7a12a6aed13b2576b9feb32ea050719f7a43c242352140c3523c36ed7a56ce8a0ba15b9201932a80c19744e0a4b994f79e8548752dc0dd549519f53c6a59c53c874a9f368caddf9948a3df4d055b7d0fd50ad7da0fc4c6c33a739518fcef7a4a6359df608fbf490a847f3d369683dca3ed1693a0692a0504a4aca7db89b92f299f2f9143b2fe3d88bdc50fd7c4ed5ed4aa93d4207519f8c522bb38ed56bda8b9aa869b2a696252a8a9aca2029e95415c297722fd2650fac6359bcebdd50f9ea42b0fbe88b7d306cfa744f8665d8a701ad59c7aa12ad59983da2356bde533ff71c941df378e8b3efae358fddae3b65c7eef14c93c73379268a1e9b68463d3bf609c39e9da2280f869da2302b64bad356847a56298fd6accf7a5996d3a622b79242ad49b435c9b2a6e9d534594a4eb5255fef3c71215d0ba468a0d1808628d536e802d323be0f77b3ee5ec2dde853dde4caa1ae0962e8b8f4c8513a26d0230a9ea2aee3c540c0dda04eb1a195702fd4a512fa4e511975ea99dbc16c64c2827440d02cde0dad3e5dc8e73efa7e30e99f4f7d24a0d2a587bed55c32202cbb04d5506bf49f2a6a4dba1f7bb516aa992ee81f0c4a982449760b72c18442582814daa0b892bdfef9e7979407fd7349929fcf41f22e523da0d0f1a7ca83eaf50594efcd9949ca4b55c8149240dcee614fb26a0d5f19f959b7d0a5f754167977a9d6de09a874291989d4f026a048428fa7a1b55c18f6aca74c76e9a920d07db80bb22ca1d3802e1f025d1e7459e452ea36ea7eee398f875daa1bbc2d173b8f974de75a93b72e494f3aa74945ee24446b3021a0bec1ccb6712f2d930da824d92744a86b82185274b579545abe1818188ac22705d5fe24b4ef80a07c294d199e2a75394dd694996e4dd3344d5385f4d1075f18181976f7333f9fcf47baf749495d59120d5022024b4ca047d8e3a5946152a50e9a4638aba2aa4a9d528c7329ca6e35b7ced6944dd3adba1511325d6b83e25613e8924f7daa7c6a9a1ed7693ae87350c50e9ae0949940557eaa1da70c8fe75a0756b3da83ef1445e820781121cb83c99a6a75991f4424c3a798628a2917facae7cc974c553187a80859bee91b9ff394c1a60a52e74a514e4762d5faacd59b60b72a77c15ef0175c39a15ebd7f058d5df015f1d26e947d52499c9f4b29b159558e82416cf1a7626fd08388ae753865408753c6ba04558a416cf1c7b258a7a12e6f5197a7301013150d79feaa2b6495599955896888d835569d6d2a577c8f682d72147c330fad43b8a70c16e3379e77ee881eb9a9b5165da66f1a4f936b2d1e545b5a8b0e0cbec2d50d2682ac0a646178bccd81e19a0c81473011050c3b1171c0fa105839f9f494f17c62f7c575a783aa65f1e16e655940a7a94e1d549d7a65dd8bfcf34fadb0c03968cba5485a632984682d4a98e93039a0123bb94288c9c98b0980bb11efc4493ce564b230ee255eb210a68d64cd431db0d0a2064ab20e72ddc852ed4b1bcef166aec83ee0dfbb800f77a1f5e1eeb3fd94649211ca2ead494f82104218a4359e3efab665c206545252c7d81dbb3b486b4cb817e956147a98f7f876402598b8c168ad49efead29a748e428b5ca7c1682ed7db6e2dc46597cb2dd7d2de0d8bf93d7e4fa3e865374a740d469bb42bb99d4dc7dd34265a931ea435497425118d1ebd3b0f6ded9d0969734f2a75f5c849bca4e280742d6f56283c30abbfaaa262be6bd628e641f022a6e541f595294a9574ef4144b7fbbdf76065296a560f22aa2acbe3dd80bfbaa7da46a493557d55e03827970cf5578f48a236a0b51cb838af4b6caabaeab8ae5a3171b77e1011c5d659163ecd9b2e5f5d5ac70301ad41c8b7a7aba21ebca3d11a8422a903ba9d03343135fea6a851e192ebef3a5c72ad6cd93fdfaacb29aea787c7d264f79cb234afce53e73953fd320ea340a70d55dcf90c5eb37e5ea35253e6f327b39e3eb267f75cc677df610edc48fec10b93f09b144e8f86f424717888217ca91f6e8c312ac681497a342f2a9b326f8ad6266537cf69b2579770f6c858f6953cbbba64dd6012be3089dbf1ded307dfec55e53be374aebccc2acb0c3462245e7879ceb01123334e67f295fc39bb1c9f37d1c1719d1639615c98a44754d4f83b54d284284d82f06406e85ad001ca75553c9f972ad78c09e45d79592f4fdde63d5fc9bed521507a5ecebce740268de733498fb2ec32ab2f49ceb46f8ad656e65984bc21f37316966b56227de7658d8bc6b4ecb48f7c8df9e3dd79c9b0f961d933fbd98adcf678b2eaae6b2410e298320e7e644c198fc7e324ac904b40dd413dac7fec753df032a68cbb840ebac7c02240aecef94b0680e5b254d478757978014c1918041535be32e114cd7310174f190b85a8081eb8f7ece10edd67cc1f4e8264bc3073067407720ec66e3cef2aec11a90ba168cab88ba60ce8ae52f082f5cd1ef0cef69c91aae710f4cfe5003cff611ae1aec7e37ab238fb23822c4fd061752cee7cdd3d359e552a6a581667a11208933890cb6e4d195026c473aab5f94fbd5a9b87cfea46dd393d95a23cd281ceb2f2fc7309b2350da1c4c1a97e7d3cb5560c93789678388543d3878ca7dca5d0333dbc81993210269951313373559d2bae2a11572a22d02d0e4e56fdaa2ecb10f47244c798597e6319329e327dcc08cdf88844a00f4c22c2ec0cc6e2ca0adeecb2f095e4f1de25b1eb7aac0c58a3867d39ec9cdcb01f99e511700e064998e4b22cb1cff4013acd6565dc33815c177498e4ba360a24c306c192afebaa30bb411e01e790574db1aed2cb773948559c63cadcc09abb791ee482d4e6b8901fd03f20e891e149f1bc1c38caec16e402d98dadab9a3ee888f2b8eb3902ae115c372f5306822a8f29e37939ef5d15eb07a5ccb22cbb74a12c9312e76ea02ce4c90e121d6e7d2f509681322923a8c8131fcfe7e301559aeb505ce8c930cf41d63d58b1bfbbf1cd2c8dfc0402ba47fef2bca69190a0eb109b71d1a1fd6c35d3062d46237f1d7efb5c32f643fefae7bdc3cb6361cdb087a36237ea793c9e43d02f1b1e021e643fe7f11cf6edbab99fd36bfa50b92e55eccb69242b67b1f098878687c59a3e3ca701a9bcf2d0c0de481ecb8af5c0ab6002c0e24a59dd85504a7978590baff378a29af21955c643f5735add0591a4bc1c240f844d108665735ab9723d81f77ceeb1d373bb315f33d921851ecf792291813ead07b31bbc20cb92fdf30bcaa59ee757cd74e7439faf5c70f816e492a68f19a70c58335dcf4376639b7b9d71de1dfd46bd5f23e021a6e798fd7c0e33653e12c69b5527417821bcd98cbc1995d725f47c2e3f9fcfe7ee73f78f75075dbec8f5d48dafc7c89d871594dd4d1f9e67f764f51a01e7b82eacf2688d823cd8a6635c11f0d4e1af11bc5c37d7cd8b7a5787a753064ab6a94ea74cd556911be192ab24496b0f26817c1b421857da882cbce0853080a1657b4f280d1550b82645f0a0ba93937395ddaa739932eefd78972f42153c814cb744500105df14c10309236fe06db9cf8813ad71122531d7e6cc20c35d09a785f7c4133622114f1b9ed317add1d034d99af86739c90f697f6ce00ea92e3f6b0ddf29cf495ae3255236907afb8fc95bd223e7629ac9bbd1dd8c9d474bcc0a7957fe81f1983071cdc463379a629974ce6382b97e9265ef063f7ba79ceff670fa9e8fd85379c763b90bf8ca0ae131aa27a57e3ae5fde4224a3d61e7deef7aead672dfbbeffddd19aa1b83617a4c36a8b3e46defec832577baf481ce959777973a7ae41e8cac3aa417541e0aa1e30ae262dac6268c2811704edc3b0f20dc109ebfc308e146a0bfeb70a3d028e5cfd5e1f2ab8b71e265e1de77ccc53c264fb88f09e7a0dc68f60eec5fa01bcbbb36eec66f22a247428a5cd7dad3808bd9816ff039c7b6c3dd280fb894fb68dce776f4df2ff7a68bb99e6d406beec6f4ea34bb9b83c2449eed96dd8949651f1369370ee26e3c5194fb1ec67d337d9a67fba2dea9d9a3af3c279978c9272fe11dd0c84a2c2fb9a1b0e56f2833715b70f19adc7705799af91ace5e3da5d2647f975356b1f7b2771e8d557767fd95b4f64d6bdc744a99e8b34f925ea124a5ef153daab0d0e9d164279596f2292e4bd15714ecc4867798b44ddf486ef2b4fcf38dfffae1f488b78773f9fcc7648be7a447477a24f1df14fc729e18985c76127a3befc9fb498f641850643db2350afac6a64dc0314abc1bdc25703bb0c6c1a52d83cb82eec192aee2554ec25db49267fbc6be5e72b96ddc0b7f04747b4cde163d4a999f1e0ddc0e799e7f07f2de9c27f22b536adb74965287f4ddda46043d028e7929e81770d740c813c3c8cb7931cf09ee069f0a2f4966b7b7e481c18242fb6ef2b4b49672f9ecdbcb19c25da0b20bfaeeeed64c94b4d6555c96d20a7937c4a4b798ffc20983e13277d11a6f6da3b524a1cca173caf9ec058e51829d9ccf5d703bb08be040d5e0840c9e6f2cc66517392f56c2495ee5db386d133d2e2f079be7bf295e121ea2abe01c9cd53ed21acf5a3da526d19a3b568f68cdfdb0fd70ab7f2a76f2e6f78ddb819d99a480ec4685ec4645ffd84d349d7cbe693c854f8dc29d57a94db8f3a202dcf919037899d7d963e753665419f5aa4596dcf9ac5e76c4b23bf184dbe1b417e39c0e251ceb704ea689399debbab89a4ca94438ed3d547538ed1d548570dafba7c238eddd53817039de6975eee57d56ca69ef5d2ff7f28ed5e95e3077e3dd07d10ef77da332eeb35b10beb9ef307722f12e6d4d4fdff8caa94a2ed08c46088d6b2db31b11d75d4ed23395702f517a8bcb7571a0635ca8c49d5b12f2d5e9e6025e9d7602991a70a7dd82b8269786c8bb546480aa1eb8fe449122ae0f4c1a30c280cbf278d3dfa9ea8a78072ebfb2f1c0078a14e1de0d6a9362bdaee5baf7a4828227e9005ee06e89ade428f7224520469224e92e02ad491f03dda88be3244e11cf31e220a1c142900ab8211ac084db415d621b2ad2a1a3f29d744892c3c295a82aa46bd958e762126a42a3454790d6d80b1909899871f67897ad0ef7021fa4358a456c1bd0da9f634374e2dd8057c209c9369437d96737eac27f41371d179ee19fd0400b06dc102d4eb81dd22185e45d18a932e5c585722e5cfee6c38557c2bdf03907053c9c78e2563ab640a9533a8868ad8a314a31c618695c23fa1445699f881e8df836459d9aa8e9af3a2bc48d31c33012c3574a0b74a3b7bb9b5e2e480743b9c94960706e0bc74517d7394d740aff6e4077978583f0c143a6bf6f0d1e6a35608b926ed398a620a1aa9ada89d6d8480f80ef0eeb134ee874275e8c91d7b428b6c6d39b6c53572502ef645f57ea68d5045ff16ef02bbbf5a720adf19960c1f4c932129699e9d564798af7aad2c122c815ad6d7c450d5d271e532d12fdcc301a13419ab03dbd217548bd678d609979a779b6013689225742b6798f8d3c9105379d680d0b74029a0e238e8840c7389dc8456c8e0b51d31039eaa2af86f9d6ad2faf4079bcb641729b4c6f4241ba962bda80eef4cebbf14440b76713ff6cde4d8ffae15c70a0dc4f7aa7354851321d04bac1b67931222a96810057a60f3778820b2fa2a865379a236b00fb10dabc88939304d868701a9447c0b22c3e2c8cd06cf3627a0dee060e0fd13b2f043963741c2efc19dc0bfc165370e1b12cc3b22cd24b7959b49754d11aa4b781375750eb4d2df659372c1ec1e6b3ba3571b33ea424bdb4893b8f00656d59963c4d3c7da4762b3231d03f13044a09c19b785dce5141a036d4b3793637ad3d1bcbfa0e528bdef41a3b9ca53a8df3609dde7acb37bd256f3dc62b5ed2b2ccd35c979fd7e52fd951fef30454bfcea31560d90b0e291ecfe98ca795655e9e5ed366a7c13e9f35717b93976155a7f7d80b0e94da1a9872378154b72c4df5cbd2ec70eb35b0b2b0b51a8f3bfc731eea062fcba5f90334b38375add5b05bcdb35858ac848454634f4d27ebf12d4da744a776a3a67e937da7deb35024df76ab7910e746945db248e4b915a3d2f45d2386fdb29ed8b2faac2a959aa7b17e7ddaeb96c78afeb9b434a26722bb15e1f12a274595decd3737f06f3a02611c42b646845e66a626123a5ac38938388fa21ea52937269150684c81db41240e747a754b7a54818ba1dc0de930b081ab712598842524121209c995be728525f3b697138fcc8883021aff601249ba249de744a92b51546555525a9514b391b426e55c4942722569caa9a81c09478a48ae24c524579a138e7483742ddb64e4c6e9fde98a37d44555a9c3c1f0e33f1d6cc37c3716776d5cb61373d72135b037495daaba2d4289505e849272b708254742a1710e5078883850ea15921b1fe9e0629ce4811b2512dc78e7e28acd7b4b20f5b81f0671726ee08c362ca0efd3a3cd8d8f50a42f7af41e87c0ebe26594fa88341be7c2a1db4302e5469c9c48833bd938814cef87448a1e359c3f260b1fa1bcca886423bd5a6976397a9aa86f2c274ab2ac4967922623330ae49be61b99b95007e3e84c0fcd4440d88510efd92ea8b351076d86d021815d7e816e2e2c3dc9f67270a939d37feff71e4fcea5b57a446d02635e8ebb019fa4f26c2a2d71a034d6bfbdca485ab3b068ad0a5a9dbfe8c6ce487e58ef4bf3c7062e76ecb20e79a71e6b0ddff86f7c8aa2aa09a45239db2f051251d49f13f2ee8c97456bf0336ce7c08f15cdb8f302150de1d75037e5321e027de0e54533aaec824a676dcee0257246652c5a831755d6690d8a2c5731a3522de535130782d4e55fbea7ab3f598730e748b70eef2e13d03e5f104207af59398945499fdfac5b16c99455f8593768b1859691b4c6392cc50e28c6526076ea6f2f272a713ba8c3c7830b3fd1bcd7300ddfbab4ecc68d436dfcc63937923ef2c95e3018380c1cf3725e9233b481e7c060702ff072e0c085ef27820bffecf6963c145cd150dc0b0e0ee44f6cd90bf7028fd3233e8284b1204215ec85172f660977b1648b2c3aa747fc640a5ec255c0ab0494a5c7a3e2facb793197a5284a45a26f2fa7a1fcc08bb704bea1c00b09dd9a09930ba7785bd04745ef9180bebbf79b896bd2ae9da5e2fa171d73d9be69f602761856fd42f29ba2ed6372e1cb712f90975ce9301e3af88ed2a3ed1d8adb2107b7830fa14ccc4c84efbb8cf5e5bc295a8394920b3fa4e5a381db51038e6928ac830beff801e1c257840b1bca8be11f3c9b0b9d70e119de824229fe10869760433942b24e7641e11de497c585cc554e4fd1a34e02c6856f335cd896bf98a2635ce5f2969743c1f317f01dbabc4544a3b18b737a248524badaa3e2ce2e86dd8d7ec4a677dd2e08e13529f702bbdbf661a68944ff713f96bef193224584641f7c37ce00ff32c7e739f32e330729e6f3e8b77579cc3b19ff41283d6992a214a9ae34f1961814dec1b3db511d5aafaccaba4dba9b913e397e6f900e086a831d1b14e16e7db8bd3765dc7b5b9ad8130968a18f1abefd7709a9be3dde4cbf4f9b8ad7fddebb337d3e23a1bbbefaba2173c36ef81ef39d422241f9110b2637c3e28a4b2f16bfd1699299cec730abad87859ccebd2cad98a4dfaabbeaa7a9e6a77373da6dce4b3967143aa735e97c65a74da23568c4114ee8e698cc6f4142972681bde7cc3c6637fa795d806fcae3755197ddb06318365d5722856276ce21351902301e93884b8714c282a95c286d6a911e6940d10bd5f4f5e1ee101feed6f0f5e16e768e428b5cca32837dc667d84d32333376961e7d67dc877377c67bf6e83bc362d9bcae6b66f741ed463fe37c0dbc57a5a1bfeee4baeb2ebddef792f1ac6242f853dd8d7de3e7f3398fbecfb2cbacf6953e9e4bd55d2a49b012a1ae641de78897518950b7b28e736467a247d36ef3d53f879780db811d9e026e073dbc1028ae07bacc6eee8bebdc4b25846f4aa50e0a6d3cfaa65436c0bd3ea488110318e07a5e240957f615fafd54167a7769e6af8358a8fd814dcb3283ddcb7a3cc7aee73c5c8aa25cd3db4abc1bb095c02cb5d4547d5897978d529dc92e36a9dd825c7aa70f213cc6c5eedccb965d5eb4d25cf1f7cd1ffc280509b144dbc3baa41042a843d35bffb02eaff7dd8eec3c794efdfa35ada4ee7abe3b1f4db273f932f5dc9a32944844e99dbbacbbfe261cc1d7b7a62f35c6183d44d30c80be9a3e40758e4237bed8af6fecc36175f3e1e27db82b84eb506d4418abe8b1fa6e5687b07ba1af8177569aebf3b22c337de7fb4e6af118d7aa1b141c98c9aaf4aa6655573cb3ea58085f7edcd806c5c58e6d941028eef57929d53ebddce1ce6fdfe1ceef70af1fe0baca22ed0f03dc8959961903dc7903dceb6e8cfb59afcbd2f4af5fbf14453d77ee3a75d1ebf3b1d475d7dabbbc7c5c97a7dff3475f1e63f9218f1dbbbcc4e4bc68ddae57bf8e9dc7bb8e55961ff3d62f1b2d0ba9d0652321b630681c2c9c5cbe7c29eaefd1e27747f37e549608eab5f4a8e59af56265293b49372f0b94dfdd850dde4b9224e94931fec53e7cdf700e13700e3e3cc3ea58c8f4dc3377dd646864890b68d3e8de5ae0833647bbcdda83cf6e35939b8205947396c0ba51498ad544ddba0e0f1e52131627516b5a43c0651527cb4251353dda9ca849a2a2a669aaa6c9ba2468dc245e0c45512a1235710830c2b22c0b72915b2bcb0cdf02a24b035fe47265da14cb7477b7ebf2c4d0f229a6b2274992a418a518a1d402a5e2fd596a31c13a3fe1303ac6fa3b47e951f677d679ee4dd9e5a7795d4a37656a9a5080bbd23e712fcbbcc4f526ab736f6475bacc5c4bb401bd9ab8d364ad3b0f587fa2489d6e51d603d4b94ed68a987d6bd3a9ea01ea4f1429825ae2bdeb4d4160a8bfcb0f1c08b56dc0c86d8ba9c3bac18daa345dbd1bd3f9895e84d61aa8bde0408db01429218844adf55d74503a4d816eda6dcd458711f1ee3611b775e49b2d7d37fa92a22a2b45b6e98b845e2e2ba0fc4d7b614807437530f16ef4a1ddde6160605a6bb8043711c4e93021ba3c5e0cc5940e8c103aec4649ccac19c116012ca05cd08da2288abad20a5aba8509393446aa2cf56eb43b455193952cebbc1b2ea011b2ce8b716deb75e6268e091fa937173e0bdf43175acb4ef808e51644d9e241518c45205b40ba8e814550309a3046179e2140317273b3eb9a200617976a8d3f841d4e7293c9eade11eaae2fa4e024f19a668fe7e09cc7b0f3780fab959329e7b41910ec1705a70c465172564ea4b48ea4569585b2eef28c6729964435c083f1240c282ecadb7151dc1c712c85eb254dce84eab081a1284a35a723626eeb554585f919ed63cbb22c2bde9a735ac6b961b661d1ed9d17f376627765c58aabea55e56458d62d86d7aaee3233b3757e647e2ba0dbdb694239638a52d914a817d347d8a74396cf3d77d84e1d8eecf4c835a10e3717bec1806f282dd73a65deac77bd5a83941428cb0cb4b1e68cb69fc8586fe77a3bafe5be9d17c3bcc33bbc436dbf27d832de138a962278f018bec87df05a8f91d9b2601ca11bdbf44e6b51a01b3feb45b67afe45418d5cf88651d0f9ada34cdb61f4936a1b8cd66018fc3a6bfaacf3fb546bf87eac8cfc7b0175d77acf781cc62a0fab36181de38ae83078e878a8b6590226d3b0cbabb2e26cb659e2c5b017ef067c8add1eb220fbb14e5ac7b2179f2c8539afe5d0e47d734c0e3387237788eb9a20872cdcded17937a0dd609c684dce44e474b69753d9c0d8ecbc1bfb2ccbb22ccbb22ccbb2a265cdc0861d3970ef549675c86251f03bd79c879ca4472cf3a13bd9460a24394bb897d7362fc609cc122617c1ebe8409d4fdbc082154faed322e78bbbb509aed3a20a2f9e5ca7d306255ca70307254eaed322878bbb7513aed3620838433092448f44ad5d0d703bb801ee250e46aed3690317776b27edc5e530180bb78379092f619d1e3d6ef2f8f5a5ee1fd1da11b7839d7ba16e0b47d14243445bd8c804e549d27b316e41a24430de73cf3de75e7cb2c24da090e75301edc755159021843008ce4589a23b8a1bd0fec6516e33f311645f8a30a25c38dc5ca7d3862ceea6e30d595ce9a6cc3b42ddbd5a40dddd780aaa47f11c82e9d18b489c6531e453015d82b908b300a81e51c1a1bed265f98ae9537cbc7457514149d39d976c7c85cc55040fa6f7ec31ddcd1fd37bea6992a64b557a8dc57d9697dc9702e6e9dc67c7524c4fbaa47ca17bfcbbabf1d2735bc40b33bde90a0f5a075af2f9fb1c2e6998842fbd93f97a6811cf73966e867a9e51af7e05abe1a8640d35c5512d999a1900008020008313000030140e888462d1803424da164b3e14800d9eb2507a5658b32086904184000000000200000000000041000056a0af94cfb75891281301c23968a8a649c4c9b7a5d087f346e23be843cd3fb16b24be160c10b9613abae2130e4a2c12cf6e616f9e1ec674553aab398c19bf71a3fa7de78ade632a0caded87558d5b9d2e0a8e02e837481498cc5eec962d4a216cccf0d2e534484aad9b10483171bc1eb398973adba695afcca54518c65ad6a2c83ee6549ba7320e56f47b6f70283cd4260e8d158020ea0957e545a3253b164d3dfc298656e7c088c42d1e569623d9db0c2e9f51393e8ad61d19a6d1ee67ad28244eaaebee562cf8d967b2b7525fa870a70666744cc22c1b5f25bdcddff003e9fe299e1b5b5ec82f4f273b6bbedd5497876ff325cecd52a06626199701277f05e2023b29d459e0b3fe0dfd4ab27fd13fdfd50be092339b4e52d02645d0d026c8bf4bb97d45a208dc2f2f706d299f0d558b39914ae184b4885452fc7b9abf93e9a043283890483464dd1d316e11e2de2a43a23a279dc33df1672811996849e0db11bf0dfb76a8b4a901ebfc43c46cff11851348f6f492c63dbbd9b0e6efb9254c83b81cdfe48f152e0603e917b51257e9eac1f7dcfe4f604e695615056b6834b001c0816495b026f46e4992b4846f8a58de5eca1c5c53c35947551dcb677cb2d32e48907e251a8c67a8c5996e7da7e3c6b50b5fee4cd0c833b63b0e82944b2dd5b9d463862aff772906236d93a7e4380bd16cf4fd049f42d020f799cf4b36e088576937bce8f3fcaa601c95f7647c4dbb245576ca8ef123a6db6f4026d75dd4e0bcd6c3cf4e9d819350c1028022641f8128237dbd091012416b8d30a6b35026cf5788caa098ed177da567682863c68b81619b15343504e0d73ecdcc3c0b3baf05ddc3bbffb05757152a6f2697921a0beb0390487550b13931fcb0f9034f187e2841625a714ce067e0bc76d42956aa6f1fd698214a44e4ae34bda9d9bb0c5b91aca093def579ba85dd6b0e791b611de21409cd3d599b534fd442ae6fbbd445afb32cba2026355f8fec35eeb0d3caab2a16726580f573611d1d3180caa0e3d4a69e9f1c8736200c7c645ffb9ce86e6d7ccc99cc0723d8572a086964d08d2a6cbfd2d048b0e3fcdf4aa6ec683772f775a1a5bda31396dde2bbd434404f84292e8351d94d3fae823e1e077f6d733dea9f1936becdcb19d28a394633ac8bbdb54ab8a22cb018555f8e1eb0f2d3faafc22abd1671051f166c29737a43871cacbccc4b1dafcf03abe47b46ed3e34ead3bed21ac8232bf2469de9532de2e702298d21cdf445491bba0f7508f671d621af68eaacd5471a88d0ac0ea74f54ce7a790e6a15b1ce42a6d15f9a6e2ef99aa23010523ecb33314a4f893eb3a52b52a98fd4bd3a5227c0b95ece4c8a3227343caf3f92b1b017483c823993416fc2b6ed2b2578728d6e1cc1c70e7c895bfb546d5512e1358d68aa7ba5fd823cbda5647009b7548f83c5e7f4893b4e479c947c9daae77773b8b7315a8039d35122c8a632d3b001ea2a1e59abc1f2a8d183b874c2007e6f733a0c7603f4d6522de4d5967dabcfd7a89083af0859efbe8435c3178c7cc18323902f2573f93f1602851aabaefad27f461bfef6870c939c02b79f03b224dfccb7e2b67a0bc45ee90d32068c013cdf0f0d76945e7e26c3a681e29f51026ba3abfe36293dea9984b18ac62c49fcd559511b04afceac047b4424a968616ce5f765d60185c64110b2a6c0732e187c54dacca602aed198a2bce9b65e999d41b7f112ee681acf33b4eb0de37bee4fe4d3d711c8d9a294315290d742892a7cf17ea6c3b464bb787d813cfb5075ee4ea6855645509d01f4fba52b062bcbf6ac69ef0be08f3dc6c86f21b577d7a78eb61681660b85068177a33365b40678b73398db25313d4f678838c4579ecea6956b36578f09b9d8a274ea9c5aac02e9b1ccf05f84fde76dd7fd81f097ace2188128705cf1c4552504d6ab030c7ea938aef75679fd25ae55fd58c465318c8d68a017d0118d864e8ac80619aced830f0d641d2397a0930d9967583495d4e3bfb238062d61b0911f1b2c9a79d0cf4685e873144de05ee9f50c11a65ab3d2a2635156f756a9ffe152aef27b046c39ca6ce8866602d7dc29a629d562ca253546e43f95626354ca9b5f86192f8f121988e1cee79959adc80ae2e791d55fe4c7710404e83eaeefc768b45d7b09ba64cdec304ab87309b2c74cda7e1227ff37dd6826575b7c5e4a5d8ca5768512db502ebb1989696a3de8688873f93cc95a6ce43f48b474eec745e5f8ce1908f43eb19db83cd1ce2fd7eb8d60c46c856880afee9b2cf4f6797241909a0ee4ca76942b9241faef16701636db59db52d6afc75543c4ee7fed08e9b60338a3448c1c33b3d1d2089891ccaa108c6f0724f2d1d672e2edbc9e06534635dc856beca84dbd7bdbc099024a37870a7ba410a3ac45a931ec536ab4bae33e4d365392419338ab92059fa80eee7ca7b7605c55622a3d9484fbc9dfbeb43e8cf270e5f40013d702fa8c091f4cb389fcfa135e2ed74ab30069f1c2aeef3fb6763df93904c05cfa4f063722653670de056383e9909dc7436c9fb012b11f2bec9ebbb723da0cb938a4114e4358b27823b1a11e4b66e0354a1bb2b5c90ef619b8591cfb721080739a942b8d58c0546ab8c73caeba851fc2e155c5e4389a53ae2b112156a764825f374d2fb8610c07b3bcd0c086820a5b71b15325e24cf2795281133d163c6e3128591bac2d03febc8da5a538e1154e2b25138d35831737817da8b3cb0b475cb40a49ea16f7328348d609932e6491491d64f5d0138a4e045fa118ddc5b8b666994ca2dbfb4e5155d8531819beb20a764666c32b513c219641c02217607df05b7c85ab743405a031f98cb8831ec0cf1d9c287912f12c2f4fcb0d584decbda9a251fd6bd4c38828547c2727b124405c3b2ec1fea8155dd8aa98451c3441b849972425f6003757b3eeb867627f32a64cd13e5c6a056c54640c32d082fe87c6b5745c153295a27c950310871e9a7d4881ea1abba1b1aee397a3cc4924be5e11ccb7268b9099f04270610c7b41ec8a11da2eb3826f0cb4ad3e0bd02e73400efd1bfc481714192a1b40c13735a35c0338ad8e5cea060c4907a672a2032dcf4edae6e1c874687a09514fcaaa13369fd19eba74b28beab1fd048fecd3ce1c82b891337fc381dca593810fd32c8047a54897c1375c4fafd6a6b8d0f8d0a44fd38b4a1261ec675a1531f83c9f9f23cc0681c2a9333fccec730c88d2ad2d4a77b6ae372160948bc1571c089583952f2ac4ed8f08912085e12dcc6dbc708bae8f02ae30c206581e1be1fb1c62a50d9256e647d238c2ed0ed6d622eb6b07a13850f6e17044aac2a55dd2eda95ea841d324479224153dd87c409d41d20137ba7733c7e82211a8f5dfddc0bef0580308a22afdb579086f3771de0e163471a137d6a0c7793bc28574191c3d2f68b10e0866fc182a3fa63483c5ff886688226663ff162d080c8ee72b1e5d0db1a023d06f96a90ca3954f255b6f71b7dd5021803473970b5afc39383f0c7aab0c581bf05bdfc19efb99a2868d49580b268b82789c5910e4e141cd8376cf92b3d86eb873edcd71bee2904ade70b35b4a1c0e29f21b9569019aa71ce347ef61c060e8375ba1ab0dcb0ceedeb3f36a385a66912f9341e1290c5941e23895471db53526ad3f42ab0179ed9c653fd7e75e06fb06cdb0be60a82d3dab3336055f040eb4f4974cb4a352cc1cdc24943d0acb41e68ec099e138ab22aa840df4d16179519a10a5e801933be4b1f4a3b6dc7cccdea37076402c1bb35f6ffdd52ef6c4346faab723c8953a5215ccc42e9a54e512882a950b0d7d5386ffd480a615909f4a3ef2eeab4ca3744e50240c0e90ee25eeb431d37b72bf4337ba8f3dc76f14a6b68be0689dd45cc76a4b98a4b43fd2b00ebf8b9ae25a37ea7182efb1101d4e56eb38250c27ad997066609e767e2af7272c53ef69d611c40e987de00d0dc25db8c82303a9facbf32d00fc433e9c80cda501852f63c0596cdbad83b9c4443fe3a59c73a9b179d5dade73bd154b087e8eb6701dfd590f134f8dcd0f63032b8b6a6261af9e283d1350419f89a3566b802c69df28e86a3a5d59d94c8b279b2eaa1ade8e4dda0e12ab3de1ea199ae90d4357aade6f17c9fb901e06ddd7ae7406440151c5309ceab18aed0d94b9a4bce25638e8f54b43c8b17dbc626fcde7fff21d7ae056edf1b04b5d148ae5f151568db80c326b161045c4ccf21bf508482829726715dde036b38c6db144d99efb129106db1d5c3d76efe30699b01206426a983935b684746d9e80b81b061dbfc3b661d8a1a25639828994fe73d80e639a52ca1f5f8a1c5e4e4a979a1504bd15190d8952c2d8d73ad95cda1f139085c301d8cb2f277de812c4876eed12d906970012f6e252c10d403f4f531b750e15f8a72f33255435f13c2a20afe71a195dd44be76df0ccc6f4200540033e104a3e9cbe3eff0dde39651c7388ffef3c14915fb6ae3178cdc57c1858d1c28a9bc7366bc686cc2201193b025bcf162ce538adbaed1ac9122ca5388dbad515c9922d9bcaee1cbef846f6e29d3164d56a402fcb1086c1780ea1362422aa6f2c4ada80872bae2d88f1cb0f6af4e940cd1925b0e9dff11e2189ffcbf38b65322b10c9d766919c0383381e17e6cd42ef0f78d9a3a0f4cafe61de2dd9ed54ff1f7ba3f1bf328b48053c31bdf53d3f0620a42cacbdcc484b7aa9f055fadaf7446f3472a06e75151d981cc6e542cab9a63abb6f27f02d16e1120555125748a1db279cf90edb6783ad8da4787b65a4d7fd4d60679a2ddb267404fbe2e1c4a406eff4843e481e04b542d7e35fc7c8d28c2b25b79b4d787198da4532fea8b7ac78dce8f1be8f7e93b8c478313248dacb1906f1d245cda29d8fa41d2e124487f0eb52949dc76c6edf9bbac13639ae156d514846635840ed6e11bce08776e62d92b15b9c6efa70d265e14fb1d57ecccdc59a0c27c7753a222764d59a8f6ea9795fdb07022e69352b47f1200e1e7ee20a7b4268ad3d97b4ed7b5c00511e6a3026f57f0eba421b4e92141f9c9566d5cdd4d6f19cace9908a30403c8377477153aa552c8b268405dd35ccb549d9410b103d45de5090df11793351ab43a47a106c45f0cc5ea0d2ae49d961340c686c20d398c409d1387ae2747088d5a04077a18e5df45c57c8a793b1b241f50b8b3db64294453bc5c85ca1fe4305704c09894319954739647c5fbc862a523f7c3b79941e1a5db7f08f6bea9a9a0d71b8b76038a21aee75c06c7604948a90265da42fc2f8351e0b6041734f4226577c39b114cdedade711c3290bead861b841adcfc37c2ced87f9c657b8c10880e7cf1481fcd51ca7272755fc4ef06b48f2c1c18ce2243c0812a9facd61c11294205a93f1773275b432f8b939e5b9ad51927656dcba8e526555d738967eb2d438082f1e5dea312f5f1c28e71674c7865868f9d3566ebe77bf1643d79a011598e98852ef4d15dd007eaaecc076c83c727f2c3d15d40a51ccb941396a0475b17879f176efe593719c4ec4e4285d23dc7c63039b53f0b737882e330e83d0a756345163581dbcde13506084d95659e2dd9af5ecc2d7503ce576bdef8ee8417082ec4fc49c7f6c8fd910875c1cffc76e705eb3d98b0b4de7b4dcc390680660a018cbf20beec1aec893aac3f9a6d2b50b7785a28e6550606526b746d47688d97bc9c9fbce77f4b4bed08c8f4ea3a8aff51859da70d8fcef9ebda8f4ab5a6a30e4d1088d20f6be67f5345b7661e56f501e29f12aac01c8a566c88d45974831e286c740a50b2fc49f4baa8db5567da3185aa608b92756d37ade747e4e4654caeceb3e3c63070e8e56c5d607888cfada671ccaaff8a3e960f19a14f8eec7997f56cb052f3981cc9c7fe42b57f629f2517255d577731fb277283808a0577a853e1c6310595f7655fb0f8bd2120cfdc75873fe2092f4c97d5c912eac6190c9573c101dc759b74184fe0873f886ee484cdd8452287322f20ea793215b78b52d94571286f897fe5acba68828f6a3fe4b9a370d5270a1985b500638346e169b81219b3a63450899dc3f53ac6700e50867d0d1c08c9e0be6789504c644acdc740896a7bd869c86141206c5e7b485fb793c28e5967c3012ef38a5c09c2b9fdac9c050d2d92a89d61a5a5553f8acc3d9fcd47e11e4fcf328b3d681925fac7e91099bd7d80eb708a91128530c354057b0d844991f0150f547739f0b4c6048808484492976a7d0a2c15a836a8f5a2002e8ec7a50fa50b20de26c6e1d41b98036aa88b5e476a100572daaee1c1439bc3af482b1b0d7d7d5c5a3e0b9abc7f39d96b95d1936e189a675765eb50ca829f88b10b8438c52cfe52a531bc23342a3801e6108de6c02c13f4d527786e515d01b43fe94a2891a41f7f43ef8b982266f97f880d5228ccd6b3388b71a32ff4f088fcafcd0ec077de53e54458b88406f75ea3c82df25ed4ee934752881b23832daa0d5b3bda2605c1c5598cc2d14c299fdb88afd6e2b728fa6189f5fee1547edeb924062c1846a7c31018f68657043a9c6fd04904aa6957283d464edf43588186c768a2967f4ef9dc4f24857fa0d949f4b306d3d658a0adba303c427e08d96b5e9f1866bbaafcb6137b41991f61d5c46e2931a662e55b135cb4cb2a8dc57f3b1a73b390dd1b34bc40d5767283871491f3d3ac51b1ea39d3fa2ed74a2fa7245735154f6d1454dccd728914810cd5e54a4a629a0d010b90af256b78fa6482c45b08ab04500d061b43f4fba66627def7a9494d2e61c470589b0974da362e5df87ca88dc3947a57bc6576381197fc0cd14d8f608858dbcd4d02dace8cd6cc4aa5ecd297a212413f32c505e2382c7c63c8b0c92cc84aee834b628cd6b36e77faea1c41bb4c5d964d1888bfaa183638d512bd760b395439e077283e9fea4f3434e7f5912e32a87e0593a44a1ba63df8f34b606576f1fba21ba4ed6044e0639a08e22c8dbed1b868bd480e2e1fa726cea358efafd12c09aa2769b44463d2c10e0660d278609b52228b29aa10cc1a01c1749186c5b08e772a812c13b55fe6c615e73d405c9e7641e8746619c55a520268e6cdd7c72ea1be716f1b2135b58fa80f1cbba5c7da652c0429ae2961914da860eb95ce8dabeb430128e416c1051e8480043ea9be31aa2ef404e430801042d986507327bbd485ab61360e20eee7dd160558a02c7078ac62cd640ffd05855de161bd4c3f650e43d97b5299ecf45478ad2e2d9e6c060ca2f7c8c41caf804a205209e27dd42fe2de0dd4f4019d47e4acd344723fbe477b62eb5084cbb4d150ef42a0cc2a281b59a4d23a7084ae609caf7142bca782526df078a8075547ce1e547d43b01f6f934dd58fdbd0110f266e2dad79927be8edaacf7183c444ceb908c7c753c9f55adb591a389723f63e27f01848e7d402dcd0ea4f6ffe0d0d611a3800ef7bb712e340680a988dbae1e887faa63d5309b106041db18bedc27800c4b6eec7b653810a3d95f77ba28b6ff170ef472d8260c7cf865a8f524ce1e96d0a6371989b2ec3c1c70bbc3ef385421340d4fe163b62d19658e93709b5176d7e3fa2bbc89e771131b9afd6c124ac7b8364788230e98a5498d666e425cc72b046b881bcc94f1c9265254a60da15554c992095c42233d40d985981c00ec306fe8305ca5cf46949659eb6ad591a0a93392d341cf261783fe434df2d5abb485e2a55c798e94779f45ceab448331dd4eff99e52e80d6462ab8ec579e029350fa0d31c6ad39027c1b32d93e28cb33946669522a83f3ac93c4c837ef00716636c05cbc34f9859ee4f765f284d9c25524f328e2e93a03c8ae882a31566f2f7004e460185f50fba1284281d4f1d2849075a1b2a9564779d83bc70ba84f6b58cde8575ff3fc533649e4c05bac946248c81697625992d06a0f75d2aa07bc94c946a28fb8504c2155efae6b58ffbfd957bd8a92f6ca065763810320af759db16b7a1e41e52ac25fbaddf3e25364103b351087f36822ae0089af80fd9230c680c63a92b78849351afbda33ad7c34cd04b1a89db6c532e1cb9daa6849f482fc715f59cc9233f2282743fb832cd1a9aa3973ecc5d82835a176a136bc02afc9b856edbd8d140bc0e756a0babb24fea0409103a1e13a0f443f9cf1a4c40d5967a900e8879aea84832446a350e1c92546b02dcaf044044514f5505b673c65ccc09c1b1a7fe418f84fd0b4f93f40429fe030e4b4e0bed8458d2ff0e5393e915107c7d4a02066ddbe1c08d92a2f923d360242d471517cb22938f51e22f1004928dd965ab6c2d2aeb84c7dda59002db38d13045763ff6135481516b5257e9a131c9eb36e1955a1d89393b44f3799954996c2d86d2f79aa4fe4cff7217a5b3515328e7f44c7ad590e2b2411c92c60b7da191a88de441feef6145811820ce3c9ecde8afb94fc57f2a48b5bc76f4ad127c5411a25e885370e40e9c5c11a6d99335b12c75ce530e69fd834f58e8a46a9b118478c79de8846c07858191254bd1c71f0037d29ffc90484b5b26e71a3617a84ad27c01e3c09f8a243ce96d5757164dc52f2d9b780ef24971e9e0d08cc36f8833e42f11e7906bd0680eba730429b9bb8f935f4d62d273727013056a99f37485fdc81ab1609155f1d536d92ba158129e06f3502508b40d8d8decc98487b5c90c7f8cc7d5b5cd76963aebe5b1c566ffca0e351e5b974c686b135d27b6f1fd55d8188b3a6f57e40aadf58b61946e1882861a28b76c5e01f9147c9593b2c093ac21ec4f5663607f72d9191dd644bdd4979323e14a810c083f9f41966f33113c5c2a0c8d2ec10eb46ccd9793314ffd0f49fb8c99afed859621a80e43ece33dba4fc34dce84110807eeb781bdd047f221f3b94168a910bf81a0387a8fa05f6cfdfb1ba57816dae4cf47c163cbf75354eaca8d49fc72f0132c08e60063043ca8834af2dc3819b095233f758e7ad753f2c9495e00eefe02f756edc35010b3b30481d6158cb1c3838108ae4d0c5cded8dde042b29094fb091680683209d6e7f841ba5073c4088abc07f37e1ac9c34e4eb6ac459a5a39e839366814358a8ee92543955e4fec529161dfb6f7ea209b74241fda4276ea77b857d1199b6ff11fb1519ccee76c0070246a0350b39dbdf63bf068389e876ae12f114dc517cd22cecff683490199e032da0277eb5e1215d1a4d4970146d1265fc0ce11f2835cd6857cc6a890fd3fce38b1526520982e54b0973de99cc09ceb99f1555b8b99b9d4c7252015820cfabee31baccd58a56b32472a29c56fb4ae0384048bef62f9b4b36aeb9dbb2b52281ccd67ca91155884e955825ccd41a106d24b44935249a192b5eca8a10d3818874fff05f715b608f8d90ac97da496b7a57030c65612b17a5fde936917847600609209ad167c3ba62124e3b8f48f7f82cd8518e6206900bcf8a69a70462622aea99b83791a2605b0d3e93ecafdcbd0f28b76f6cf386e893ca27757aec6599c90ec61147a6049d78e519affb5b83beaf0facf7bfa7b0d820434d3c176f97497f093f8a3c71d6e403778fbea3cb6f4b5ef2f160cc3c904956cf4eb71ef56f6d0ad10148553164e051cd36a3dc22e7ecebeea6441ed61054f9f136dfacb3c6f4fa727b7bc03462b8a4422fb8f4e372a8ad1836d9d5415f004bb48378b075ce3c3e43abd9ffa13b058a81061eff5a699270805810c034aa80af3e1cc783c26d25718f3476954cb071311005b3cad930ee047d06abc80eee8585917a588cb1ec9a526ae8b6b90c9334ee929a62201db225ff4205cebc22e4041f86f21d79f193dc6124d844b6ce69bd0638abc234228277bb1cbb9962551c5fbf62309616fdafb2c339da5542c74758ddca22cc92bd8aa26fc45e6be4dbae1838eb63e55b42d18cc30ca20fe505f284eeadf47724fbdd4529f8a28395a482ce7dc7ec8927d524be4aa798e14399f8bb55caa19d71a6f465e9ef149d0e295f96f22f948b7eb3145c964e1f5f7235ba1de964707e30fc3667e33e4dcf0d46892279eae0023f93be278d3355d17277281a0ef0e4ffc451a4981ef3e8733ac73a9f1e1f849ec76eec8d3db12db6269cf944eeb9d44986e99fc037cbae134960c5a24bd3e33f9ebd2356fb40b43886200e93b928c6c4961e2217f5eb15d69d94230ba56878222e026699e52be2aec156e23b580ad48232763f459ef02e1f65585efc8a15db36c9f6878f1ad93135cee8b65eed370ee46affb943895ff78e9f0c7df3aef1092e11e909e9f3b0d551f27866ffdb191ed5fda9123d904c961fca0609cca6dba23f29aa8b88a665a52a50838db8f5637e6d79011a0e2a268d8f62f009c9e4c1b1ef59992fb5967b0251bef2a57b5486e41019e9229d80083ab546a950801f0827417c9ef7de5a21dc4dfe3f761baeee393656e324e20faef6ab9a062c0d29d4bf6ede1e285e2ee975c2b99ae41c68b42a4fa832c3a40cd0df222c782324b6608e36a047c7dfef12f08c003eda8c0c423a0541a9d3b2024690761a09b7f6a082042958738e9b1502901364ae6032692548fe64538621bb0be88eb8a9c6eb6ded998003a1c3455511668b0a36f9029f70903b4b04c1a54621acdae5e496d3482099c5b2f7d11da42a676ea230cc7f33d3290d082a858cbd227ac83469ea7cb6c601c06b010b476ab510efec03e89b50644cc69379832fd0a1fc0a05372e8c79ddc86a685b759e497d09eef6a3163f7ef5b3f6f12360bf1e305f4189774c868f8212a370d57c30859fee54b0419de9770fb133f278566ee4ab580c48e3fbd803abcf01910141ee1cc471a42db2854fc1751195e2228c5c0b202dac370323b0423b89c84109bbceb89a6becf2200d875e586dab2a142ef3ae04c54a048fb6627db94e1960f93c77acdd425cdecbf7474435f9e77f482c1083ac333d8066bf791e287d7aea00fe8a3bc25f404a5c6d63429e9f2837d9c4ed630af057b921559804fda5249dc0aec217c211d4a51f68eaa7ec3e26332c1f5584d6979396efa0c0779534d6e775718d787851e7c7206f9a1fe63dbeff9e3fbcac4952b2a20f745778ba3e8ec00ca6ebfb08d07e1b059226fdb8e3ab83d577be998fa73b587d4ecb416d48024c015e5214d0348deea6c47cf9a6ea5a48a573d8d1a5115e0b2e4bdb91d10a4aafb82858121d3209e9962ea2d6dbdafe365e62a1dc7b60d6621cd8fa59526079e3c818c9b7d0e1461c1362b2895f0c6b98cf07223d8cef40e369a5a0b721928852d95027a8331d337061117f8408916b3f7d63c8a9ef0a04e1ead5c8976776d1fb0d672e81805cf2fc13df8805aa11f8a6882cdd3b8c2ee39d382809061598549ccc6ae493e7bc0b4cb347918a2d806045f4808f729bd0f05539f1af54ab66d6c887581667fc596ce00ff110bcb4fe6b53a3f8b4b3038f7163d34f5d745278d3213b5484be26a9692438cab11f6ff556c1a0bd4cf7607f7148ff5f88cc1e488b2d4ee2cc844601603c1f3b6754b41e570235ac39c67a53b722f6e94ce57ca75a6473b25852bfa5f7c17207b2933dea06d0bafe19c57fe6ce64a0002005cac1c8a53c5a447b2a68e152bd6b21558535a0d619ab843fe77b8b891cace872cc16ea4576352b744d1555a78fb19a0e1f2e1daa5df396b084df0b1464875a309ad417f5a9ad14f36cbd4e634a9c4ffe38d9f0b104a29c1091a1fc572f08e3487074e7a26f5f0ac21e56ac73343b46cd5bff54cb9646f112637045db40e27d7d83a2bb0b3162a7a66f8c88536e9c5a7b7a33afc3fd6c6673e793a6c9bf3606dbcfc2a97831d102aa0f5349ed35983e6010aee96504026b39acdc9cb183f1075ffb7c6caa1d30552d84124e23aa15fbd5e4a1164c94d346cf9baf4838aac8a2948a6204eb1e4326f8ff5b17913c1a9ec4ba8034f990541541ceb74fc752efbdc8c6de343b04f6dd7e2cf6c3ee43843aff51494cfa21a6ecfe9b8f24a4705d91e25c14bf16ead5c6b087f155e2faceb0bd464d9a00459f80d260a315795f00ede4dddeaa48c5b13af85d57df9a6dd0f4bf3f8e6bf657fbdb197f18a1bf4c1a9a9bc20c594a147adbf6afbdb07827febd7af34f71a4468fb80b1ad1066c5088061b510fbb722d7015c4e34f324d46e2041cfd19566c00f0f513f98d42f8a7a777410433b49cc745b0c5ea6e6b56818afcb63029e8ea635a68c841ab6e77e740f48fa65b014df04089d6632f89f8999b4185729ff7a47c4f74a62523701607abf8f4d3bc16ccd1d5f71177ba21b10fd116be74445c852251ff4a2639b9030d0ecd7d93b13a50421c346d52ac4f3853d50fcf204053ba3f81c300d30452612705133fdc85504182d91a7c1308ca1b7f0f17308676615a9eab29b0d09e8ddb84275c7baf7df1260a6b750a68d59a99731a5951f5855e8b2c36b3b0f425e5f18ac813976bcc75969a5d1789723bf5bb42825868ce06070685ba18a304da142ba3819b166de8d2099f64dfd254f5fed5c939d892355a3cb3d6ac94380c9e3c3426044bd780aa27111900bb4903c8c81eb6e6e597059cad5417a8592f9e4604bcf499156d49e39edc17cc86ea22ff5e23714c8605a37115ba9d2300056a5074ca052eb8e428c8c7f6c0fce70b59e56f8e0e4c3f041065917efc23310070a4ebf5ceb9338a250e33109105d808de289f892df552673ef3c150ebf838dcbef8c7ed53783a4686e569ee9b5e6c4be1894e788c0f3fd82a53f707f738ea38057f5c2d89584681c36c18dc93320eef347beab80af5f4e53591a70bc02bfaaa4af6c6db26874a274429dbdcabb829bd76a12a404dc19346b90d3d6ed9c6d8b1300bee8afa3554d194f164bdcaa3c8e118981a411fe4cab65624f476a0525ca40ac9e29a4b26a01de69f0839d28ea154f1d1e6e2f12ff84ba0e02f8dd8467fa4bf6356b09719f04f31c80b8cb53ed5273a14f2b9b3b68c0bf01fd03374c14486d2cb74a388fdfbb97ffbe88257c70c314404b7213e363910a9910d6f6153db494bce0dc4de9a7f5bcfdeac77fdc64bb1588f5a2933823397c3d046cab9107f83b35fe3883eea71a89fcfdf7252cd4dd95a399a108bd967d280aeaf1b701a7fa4e007fe1d41e4861f170caf3d5db03df8de618d281e0d84b77798cd0c9312bb77c5befd00b813cf482e5401d5a96317a0126349b747dc092a22fd8b9f06790a5c17a4c2442a81e2c817982b142cc0fe5800ea7abd5e5beada8fa542d12622fc3e4985060e520451f5107393a9a87189035ad6183e054d7298540236222e7ae313df714dc5aee752bf81179f828c4b4e51138da7d79194beee97fcca890882ac59c3b9b40118db6fd0d0cde8d108ee1094d88c821a33452bee1af6c3c161fab626024ff82055472f92bba49b528fe22f4b432c50012012759a1994e4658b8b17f5018794aa7d0ad8cb96fa3d45bc21b9d9a40874bc84e9e4c67e3f58b734d09e50a8d8b9f93e7f0b1cd47a3b81d20e20fcd523a88188e7840a0d8d2c1136ed50c333e327ed59ba02342bd9f0d5028d33db54c2cb60b1061350d42c692553414a0f55e505461a07d727c6981c6190eef21ea313a61756005123dccb0aae9b18b504007b808b795c34d3f3a54045ba32a7e66f22a6b8c007044cae3c9982331cf2181cd5cc4ce1ae417e17755390813700fa66182d9207c03e2676ff2673003a92d0c0f3ef52dc49baa1b7d177bf576ebdb0e02892c52e11422d8ee7a8c11e3376fc428513c58f7b645f7623b118c34f107ff677ec16d353b3a051682f95f50eef10e3ffd8b2c309fc8eb478d54eb0c00c569e6203579c1227939d1b291984d50b46726c0829a3eb8528a644dbd16d25fc5635338909770660dfac51a3ed0b196102aa3ea5ba2fb1eec0cea6a671c37fa6ea837e0517e4aa23817576d8b7c66a37981e89cdb0612a463533bb4244fad0f62e770e2b33414d8f5744241d12b953c18b8341db757d27faedaa67a5efd0d2de650de692f655bc0072bf577664324d03e0c039c736019be241c04706a464801231497c943b4ac1e1f840ae8b2b65b6e212f941b6681c41a78304e55a1c35e5d5dbbb69577f491d4ca12bc9a870ff5e3152f47a5bc52e0807ecdeb4e36f6c060a715c0e421f0558ff97cb99ed85b0c37d2d7b9a0a8c0ab8cf8ccbebe2a6cc6f76b89febd84d4c3297f7b8572c337841e07ca56f4cd6f4190b9cf68229610997b63f775abb7ca10402a5b01bd6fbfd86014795b172b2f3c92fbc86c46c76ceece3de0e5089f1c09710ffe0628e0b968cdab1c27d0113b848b2a316c7490288e4ed665c4cf41b003b205eb9d1f968fe99e39d480ed58af36a4d7268b2410300d0816f72271954c4d0e729442229abc68c50b883edd56b3eedf9fd186a83b13fc2906f247f67fbb77d4b98b15dea4f9d08401ee67120e833df0d65de07a0c24eb1eeeba3187fa62372aa556263e9bd979e9c2f4cda01828c37ef02dd6932cca89be9e68d5851b775613d892326703c7632afcb36cd05ce26b9b62ff3c40ee38b22afc54967b4af69b247d43188f04f00c09ed89d93a8b0dbfb95a30368c04ac56120ae648c88383bd8019ee3c500a6cd9947e3b88f70f1a3ec752154566481e64b2ab7acbb3a9b956ee9fe5e59c5627aa05d7e24a9dc7a5034396c4196fe3610d33937276ecbdcba5ee66a1590f35adfa68e76432ccd62b3f80d57ebc2c33786441c1b083bb87c68ad3cc2331c7bafed8d5fd5d473ff9ddf68b2426d46eeadb5b2dcb5f759b7832da82339450d806f2fc0451089bdc47a77cf61d8ac1a586ecebca121201f5761146a6b75e4dfc2f6f8550671b8bb53a6f59872b65bc595cf4c287fc75a8126923a33b4b03cf36202a5663f10d972a11aed3a263ebdccfbade523aae57f37e749138b2142b2458398fc80b20ae567cb450172e6f5c75e25fb3c5de241a4e8b2e0d61487819bcfcc20983621752bbbe454e0d3b38ce8764d3e1003656b0555d956d5fbd5896269010e98e7fa8e1f918e550f487964edf63c4b5ca14395000ab5340d58ad6af503559f81972501d7f1afcf09c6fe470c51bd41e9e157a4aa0cf620b3e8956e3119e6e4433823cea2addd8f9bf9c8b9e0a79f4491690fc9e5197f29f4ff5533a744b04bbe765d75d7555c4ce4de9b2bf0339f0a6d86c0298c0dde3d9507ba22958f8a8347aae8c544726fde61751668dabcdeba9d8e2392f65e3f0162cf51fea1d5c262be4e47e68f483254f0fc00abc3bd04eb41a7cc49aa28391f114f156a8e9c96e607ba1c5bdb88c7edc4a5573c7b035728bb81e65066f39721057d05109f3d02d43ed89993a0d072e889945a51befb65fd26ad54c1ec0bdc5981ca607005aae981ea9dc9b18b3c80ba0466f2558aedf7de4b0fad0260985907e2fa9e5125ed9c71693f9126aed1ca79aea02856123f10be12b9ae9ebf01c8d0c5b199bd97898b8764d8cacb7cc48030a85f36e242dadde52bc3cc8d84f1b0ad5e1b061faf910b9cfb18928ce48b1cb95290288bccaa04d1274a767aee4f8c1ba8ab43fb02ec3320811f8719869fbaa6c9ea5bda5d9eef4dcdf05a46a28067f814acc2a41bc432fd9dcf01064700033335d337c2e23aa6436de5dfcaa7709bc9b4a490928ebb13524269654a790a6b32d4ba3c5f4bc98bfc4c9e38e40e556a80e4aee7abf23d1210d69510b21a39e2ea1922bd9b8f23002c2ea1f111d676a64df7885c9dc8d549d2d8cfa78b19a5ef820b38c304676245e09979a4f743204f742e39c783351644005855e21e7160c730de9ba562b2e8715f5b40184747e000b1490827dd990d3e8da066d6b9f71036a2e59b9f29f41610c79550f95d73335dcbe906d0195f9d9305b05c85d926a1f9d6cbb2cc5ca9d9f0ace2dee0db2f36901cc8461ba1b4369657c081a71421e8379813298feec6db65b6c19ce4174c544cf9b9ff8df6038172d76e3e0ddb3c516008bd65d861fe00b8d4166b7c0f590195c95095d631452e768636adaef73e2435ab1a4698737acd8309fb463801c3947f6950db0957b0c6ecd3e36ec11e12a998cf5b1a255c50e58c5d5ce6fa17e71d260693b5da18f004f68b9a769a0f0f2d1a747dd50f1715172cdd4e01cdcf8871a3f2f69601ce9d32b842bb1a0c2ce46c1e2e8a991309b72cc07283bfe12d659ef8e50f41e157fc4610754651edeb35817da270d22c29eea9548066d4adeadd6a26c761ba0ce07876f6d5d498b7bd955b565f436b44f54c405aef2e5dbd9c1037f30f3040201ab53df9aea1126b78c8b33569a8d478067b2935160fba50b1c1ce4eee39a6ab053d43de5eedebfa163dd4dc9518f4061f42966037d9a8a08dfdbfed9585525669f1c0214475ffb2a39328b78c4be2bc9433307c74ea87bf93917a6d38ceae4f4918a0ac6408842f1dce4b96a07ce21000e1107df9ec1c82cd4c37d77e34e32ae60cc609c79643499769a66c7007d486c53e23c09ca8c757cb525e8117c7a0a16e5456d0bee379837ae7ed02b4b53bb49dcdcad4ae4b2c506f09ffb9b554cbed158833d85e36311e747dae022398203237b53390898897556b9d5bf51bbf65200284de89beedce316a4fda77babe3434bf97e4d07d479302edb9daf09c7fca69b5a583ee3ec9bb75b42ce07e0b5ecf24d9d00430692004f67294d10eb57558f2aa1f6572f5179fa996b2575ad7fe3150eed8ea4621fe869437bc6b6a619c830035a849289ad115218884b9e04615f34fe6aac90e499cea980ef5644364dc1ec4f50d49b6bc0d89c1128c1a928688294802796af667e1ba9df1cfd3bfae0160c925f85f1371919eb3cfef9842b4231fcb788a08074b999f79de0a8ef68412dbd7bfa5afa068df7aaa22354f2820fd5d5c10e58bcf89b9a20604faeb95ad91a8ce9e36a000980f603a5b98f74f5ecbfcfa3f15842c873be8985f1f44d160581662778df4a760171f3dacc287ce91f7d701f429887ad104a8b12a3b8fc3015161e5771d76ba662a98bb27c0b6d5609ba6697bd8cf6400e4906b996d4f18b8a2a35a8100f7df790225157a1cebdd7fc40ac463d621f0c067a079a4339b4bc5e3273c6bb3885148006e2470827a17032b6f13f8c2ae728cbcc862397ff76557416be4ee1c4ea90c5b63e9cd8d00f12ae89b52d7c74bbb49d27937cb96df69e17debbc22bae2fb85ffb913bc4f88e623c98ff7cd6c599da70867e46297ee55d006d8e1e37d019aebf85a801d69693dbfb180ad5f8ca550e17914d38111e3446cd728392f4fd7d5ced9de2eacd6a52d467d747d8ecb8db96aa255133f013aea792659144fc0495ce8971a1735ae1d2837a7c5c138690d36672a38267ff50fe34cd337a5c9b04762ab3decadb652a89da178ac9ceb9151c325c25ad189c6baa43f160f610f7648e16d04baf649a36177893c4f452ee706f72d53ba426ebecfb950db3da24b925ce7e4e234f711afa8d55db7b9968074c407073aee39c38141ef029fac84f0016c5014935011d7facacbbb5d921839794f2365681601d54a1864b7549533eec3f95b5c66350484a7f89c8cc935b895ba0e08468d579c40c00fdeafd786d6e7639713cbfa89c951b02c93cc9c55f3a58a0c770032b419abd13e7d978c695d22357038f63371dc9af39d740bf4cb679754ae6099809e7a54b0b179f35b7890295ba245cdc9934338c857947691ec51793dabef2e9376b6b27d7e502fdd3029f40c2648a24b88090ea2bcfd359b70496036545834ea27bdb81c52c053957f3c1e94c2ad47615acb1cd424e60ee9fb11ade0692e22efa0664dc4df2363c02382edda1955aeead094d7b5eaed54d6625dc846b963b070bf322a703574f75f716f49b15aae1f880ede0d8bf0f1ac17d682ce45e9758500d6947227180a747192042d7f783bfc754ceb44bb073682e8d2dec3db6aa42d7a893de49e6fd2ed0c0200e3ed1f159486529ba32c48c492cd4031e8592732e2506ae679b23ecb0234fca0972b14ddc1d7e434b3af28e93129840abbba14e15319301a70b721db712900c225e57cd91c6eb5d5bc4253501a5956e441fb73237481360459baf5cd823326792d6272539c11e9104f8a3f038a83fe733c1ee832b076739bf5b7e01a2ae26bcce5f4b23fe1a344b6beda3de00f0678a08f925fc0469e9688f89f5cd34986e68c8fc85b4ec25c0721c8ff3d760c7717f700ce2b5f1041bd2200e3a1a5e38fcd8e804ae263cb7ea8bbb620b2234605f01ea89d9da820165b7c4cddb81f2f73b4918dd9363c3e70d6d62a4eed685c04beaf79798811754a4e771eb82fad3c3548097a647f491e8538645b96f675c0798e58e873ab3b78c36f3030e2f9bcefbd35d471b6e7b7d588d6d1735cf779ac57e1cae4013ec3f9d4e4dcf157a3dc16a57daeb8cfc0a6787e40c87b7596a43604c137cef586ebfcdb7cb9069570f620992cfee716b5ce8ef62cbc77faa669882257288a32d6b036cd20d62a43ba00f2dae7542e34f6c552a16e9d36882e1a49460e48f6596d1d090cbd24cf13893feafd4e42cfcd8b7d133f462b1711b28eef5d65f34b4eaa8834249d173482a35ec46d448875046a665becdcc2d207d5864cfbb811643d8d0c09e23d09ca681f48a35f566a678f0435f387bce473e122ffcfed738e5488fcd204a5f08f9c14f348d5e2e9ba784cc035068126e5a10faf704de30d6ccc22210d0240c5e3e8c3cef3932c6471165e731b8f848b0ee4cb1c9d8c5ae770e08d82ea94f1421b89bc1615cf51c39a7a8483e44a1394211c90293e234af6ee0184a73ba0a62a25554fde0e667a0beb33c0902eb9d3a75a7fbc89c053f89839dad08769388ee0188dc854bc74d493356154d823765d2375473f4a5a764b795780ffe87c06e2f59c0ba54e911e4f9bc0776d70b98336cd9e18f1d1d7871cc8f34c55e6e7fe6f2629254f50f0044fd046647ded32d27c82803df3d9961e1e8400c9c511710acbf1518b235b58c74d7eef7a8506afde067284b6aeda4d1dbb5dc4d5231425bce3f51ccb78fa439d0e5d566e8834116930bcac8ac801b8f2344f9f71a38a70917792f26ca984b6ccf3442a4da838488187250d557d4920f1149bd1b3e502fc55f607f173e16515e60908bb560afafdb71a15476159f0e86bfc55702f24e0b35f45a85313cb9df1d7b0cad2a7af531d087927bacfd220e00938a60e20eb9c66942f5a16da2566031115e0fc54d0012221cf4e23f1915411993fd6bb5830d1dd16fe9d6847da1213ec1f11411628cbaf7c35aeceebc1c09264abe427861f666b10d4d14c741a39813fef5da43c38e68b7df6b2e94cf411710c89028503f6b7b2c596d61042a00eb8f16dc9a05814847061488af822eb583d57671d58fd3f26cc9032391def119afe26aee4b7b1c5e62af9b305cee07cb96721c5239a493ca3502682fc1e300eb5c9a3fccfaf421f9b578a7022cfc0be01563663f24a3b70cb82bc786bbf26372044454a75edd6a7ea4d821660ecafcc051f4f5c726ffca5e3c795881ebcf268b17ba709c03b516284690adde47518046c86c49472f04ae599be144e4c696ffb96be633c49942d4a5cc23330ca5ccf220b74aa3982911d7dcbd920df95a80736489d77836bde5a86a4862ef1922d4c4edb5e134378866111e238b66282db3e8141e9f0871aed63f9e60ef5ae2d1204622def9c10a562492c9059a9dd5de9f77fbe9fb8fefbc7f68459b07f578f9a13c96f9d107cd33e5d1e03d89c359191a3cfe05603a399421a83529284129eaeec3411c33c3045153ef1ed6c4d6c2cbbe59d6da882adb635e531a179633987fe6a978a09dd2ae34427b3e69fc7e05df0a40a70e10ca207d3d04fd28012854858c82f4481fbdbef4813205010acc4568e4c0977ad09806deea899888a7a5cacf90ffdc2309b1e07e93c24e5aa515086adbe31ca18aa3411494b61a8c3d198713db1e7cd23d6b3c055b94aeeeb6600308e7a2c63f2a5192934d0c0d41d4785c0029b1f22095a39f77b9c5b960f0db847e05bd0ed8736dde05fe0800ed4d251e23bd74a5d02eb117d5b31547371e88f482852d1a84556c356f2bf51d73b6e888428c0c97a4c84189909e684722f39976e255f82c7bd4d02197555836741460429acbc17ca4a955f40ea13b28569bd1c9558f0eca3f390e5706f2a66af8338af9008cf1221cd260acea9c094a8653df2a9e617cdd13f81b72e9b8caa542e020ce54e41fbaad21aa583169dc0f9b33621e89567c06b44135f01107432c7b34ab78f23401530cf71ed8a63a997ca4562a5e6d49fd23ba14b6712495361b7c7438b180031eefc0e93f9164490fda703f5aaa7cbf877bc9a20b1568de266c2cb0be7cab659cc845289a7ea87c7b4c164578103305d4e93ba016b03fe3b421b6017d1f045440a274d8ed667e1ec24b437eb59cc1782a4774536292f6cf040a3b332567ff422ffcb9b8078e5da81de8fcaa4b666ab9c3c63bd7f022c75568ddf80d3dfed8bfbcf2ef275352319a8b3c94958eaf4cbd08962368ff97b3aec6d6ded9c2e03ba2b6d508fb9777a8e4f23d281ddd648fc8959a2d6cb1677ab88e572ccb55db463cf9326311f61c089baeac7d6803a74d2a57bef055f335af728f954f3445d6c8d00608a8e6a2212f5a9a003175005067b462fbe46082ba01f36b5752928888c0eef237d7058157a7d3b848938029b5af0954443a23e5e5ceb274bde4b0000ae5f654ef62b61e580c4c180ec9df9a110d083d16aefd58ebefcd8defc861e8d9850ed5fff0d78b71ee94059477c87999edee07396698b982e9d60853fa92050e50ea238b48c2534be405edd47793c6560895b8dbedc7d7266f9e2f7b818f72b7dde937b09f0250d04d49190a5976e1777fc18da0bb70ba61830d756250a98125ab919b909d7626b696a025f489c2687fe246775499153525b74827bb51de2cd89e3a01c3fcf6ad552794cc3e5ad402fbfa47b828bf1e6b1390830f7dcd01b6b3aa37a1930d38097a34314f458432e6f192663ccf5f2d4a715461ff78e058b6afd8bf2bb8c9f383adc2a3614a49fed666cc718ffb60c321c22dfcdd33795515c639fc417b6544b4b4a66b97ba93ea2e1e2563fb81c5aeb2c835adbee1bc7ce8539506d78f9c490cbadbd2dfb4e46faf47a113eb4b6f4ccd85d92de965f58f48f08bff9afaeac7094a130228a206a123b0f011fb2dcbe595fcf704b31b6dfad69fb7a0216b5ad97552df1815e7f1740f47282e5db3215a7e05919cdf3557bfa709b9176e7740f4a3ad7a58ab357ff13c9551d35d2183deb960872fcebe50fbe9c99df94208c09d68bf27a99e021f0b7bc2519e94b4d3d33cd928035af5e1690f659fac93d94b7da8d42e5ea7f207541934268ffaa977964108fb65cec7c4d9a49f7c9a2c0ab8bd0a46a157fedd101491c1da5848c41e7088ee350ae9719c7b17f5624242c09cf78258353f4b23c07d7d68b29837f10d2156d4f319dfde1069a770526aa9e1ce84eeeec4902efd38c780e8b1464ba94d207a96e57dedf67452f17330c7170e9ce00bdbda1a908bc7666b89b75db65a8419296aa4e2faffc243977bd4677fa1ae9590410ff1181a37a39416b3b1aca0babe9e5ced897849a1276e824655ba17ec33c93a197b983afc5c57beac33bcfbc6562fbb24609565ddd4cb8852241b92ebdcace5ea1cb5494181acc19a1d722cebbd1795fadf832aff0e4e7cbae0742dff825cf75b61b75a349904bfcbc31b4db1976aad811cfaf92bcfab2571f1abf1b0971199354a3bdf03a11d09cfc77c6564d0dc1a9d8c31d83d436db9491216b9d89515f3ed5128107250ab7933a62fa533480a821fbc9628c6f6165c0b2e589195e0a2e4e9759cf7bbc294ae810af40509677b8ecefb38cca1424050231ee8cf65d7b5a35aa586fe99bb634d7b5632b8f06b5f8a4711bb2c33955d1e4863390fe1e0c59578e59f25e7132d5ca5f0ebadbe1b70284fa601a6fe124e0bf85a2c8d1e445b0d589eb8cac257f8f96fb7525a49073308ce98f59d7c8459cada895b4206a767a7a69f9b3f24ac19f2c8317e6f7b1cd18a1d6301325cc13e016c3bc8755b9405bc6886c317238451bb360c762f93b5bf6d9614c02bd9f1ac66d3d2b3c5b8e713e3d294ec90b4c6361690a92b3009291e9460efabb5dbd9a28ff6dd69e1178b44268493cb2cc9da083dfdf208ac37ad52119183afa5312351df1feb16f510be98eec4c5ccb3b31becaebcded75ff6d3fe38c99a1f7c3c6060bf02eb47047dcf0189a4dcb42855ffe4af2c7bacd43f689e17339086becc8cec510108b8716bcf02604bc37bc510545177ce34354178e0175ac7ac333408759e29732f394ebbd7f2fd866566571a9a4e7ad41f0639d54f0d1703ce86772bca180a7ac033b8cca15e61cbb69d12b1533e9bfd0aea416faf328c7d0d7e8506053cdc8e5347525da1b197c55021df4150a3788cc1a23b0023a3b9d7da7f5c420a95645bc4f0150afde3cfe9183324fce563134473f4f1359c2f874c7b6fe1183430c40ea00152adefd8c81040551a939f02f9cf81c2d1186e587f463b6491401e326403d4f7fd08bc31e9c345bc5e6a6b8e899a84118f754fa7ceb5e0f9aef31c852aacfa5d72351bb911ca615f8d2f25f678fdf985e6c8f26e94dbec49ab04ac2d6532454f896bb94ec99a41484c79233258f9a75ebb326fed21028d26e39f5573e444e7acaa93d6b4863da48331c2ffd8f75bb5df682b6bed79a7819b88bb6d133e11f176c6f15f8aa6d63106b67245fc207890b24d85f2d32d87e7a46ca1fcf40fd44325cb562382714a7852813357a013af3ad9573e65a7b38277f3080441e133c14b3456e06e943591178cd5ade112db1b40edacad8fd0068c8dbbe8bea894e195cfe1770b372a6fd711b44bad0681e458c7cbe947300cbacb7b1a6b72c471178aa2aea1a2c714c42a595832576eca52af7ae8cf92fa3b129c1423601234d3ac9f6b10e49fa62c1dc2059267d5f5efb9cc9554a8fce5d1b937ec23edb51d7bfb851a49f09ecc8fda49f832d9d82d7d865fb379ca9b0ec0a36e0c35c1ed808e87ffaf282c2c91f7f0d7ab88ea92dd6f4c5d56422610356fc6c4e1c9f48fca5ab94b2843b87ebe8aa6451f781855d03d6b1fd734e72573becb870048b6937ee4708da8288ef58bc4ff6180ccb2e6d28e778caa1acd2241b7142520a6bafd698008d4df17e8bbcd3605e99ef0e020d59975b66f60c4842d63708ff29696050f95db5690d513a48c0039101b1da5c8792f75ef15b30d89e20888284a08943f853319320df5d936197c429f124011baed1e9a5f3bf7a5501d08634f8074e4fb6a7eefd5bc5a24bb38b073a4109251f344f51cbefc638fea9796c0def062c787eca06ddbce292e1b69c952222e3b4390ef42d396fbbba6c68ab0be90ea03939b5d9022315aa493e850db85603bfb66a7baec3f7c7c2177f9e32e7f69038868d4b58d0ef14ed7622619d03a7aa1357419823a2951a36de2a3395d726e172bca386dff70760acc37148be8a41f13e6c35a8a29f428c3055a5400c25b64736a613a8e419e4ed5f6e0f4bc39fde90209a07107f83b0686830b57542a879da0b81f637dcdb8a6ce0f45f6b1661140b82cea4bc8a65a5f16c6a5e552132662437fe820744ac00dc2e8a577d70c3f00504832e94508ab3dc45cc1d802fe0b8bfd2e73db987401b62a4496728d05a03f6d8809f4bd5c367c026fa5153231fa19f5e62ad7577c8b7837dcaee23b6c2c5e8ffe5d381a50a5d763d27e84cd199f16c63356e02a27047121c0426e6b8d2120de7ebc30f2e8f9563c97d4ada176e62b60275df25665ea8c7e4d7f81df730e100755b1ef050d272f9c4f2bdf1faff9560c56f23caa0028a3aa86ab1c667daed3a6907fcfa34de267a8bb28f5a145dfbaf13361da1a747efd1b75fbca982481eabbf61d00d61fb4fcf84bb463a508a04d5093c43190e038b381c020c24bdab749d2dea83434ae8804ac92de3ebd5cc2aa1e31b543c87fa882de70470e4e918758234c2a1a183b0c04933a3421a4040c41df4fb51c4039ef202b8e28643d8a10eae4b2758333a9c0481dbe277b00d29db92a707d78fd2b28ca7793385b0a702737c3b59c9801c2e42488ab9772285d947ac849d345295cf7f79dee1928eac4109d48d880dc71ee898439de2ec5b528b85b1c5b5e9216c57000b11d1b7158588a642b823d7ada0d6e2da614cf619e5061fac49f6915d7f0244a7ed0d6ad688c6eff280bde82b8efc1db10a7fa416cf3dd70410737edc39843cb2fffd6be52df28ed8d69fe83903b3eb41f3deb4350500857a3882449555f7760e30dbde964cbd2336e09b6784dc6ab84ade40e0c905978c609218368f91f2990c8164324c496cd605b3a469ea419c5de8a549909235b928b95ad47f0c3ce7c89fa3d0bca8836d22c7161139a86927e1d8c99d1bfa4dc07fc4a9816b48916403750a42af8111217d26df27f2b800d416a8258e9a98b359c86391a57f9c3637aba4fdf851a2dae9bedc8c78a5c91dd64a40a27345bcdc1c5910bcc2be74cb07f08f0ed65a48038594f623a60f48bb1a7e98f0409b2af98e9c327bb03e5d0e3172d31e17b39d51b265d70aa3a54cdc9cd74f999cd187f3e847e8347c2dead73480ad43e4652862e56673753367a294f28930bcff790aae6f75ae94eb2a768bfef70ea6620cf4fbd252676873259ae091a6a85ebab05635329b0cf9f22f8a779a4475d45c0a0013ff015541cd663c848060c163ac432c1e609e8613a17f530bdd666b1f999ac1bec27d0075b034b6c083c42952247c45ef5b1ccdff2cca4740f4ecf17fda60524152f4ba5b7707004360647edd4811afe44c958ef66f02632e05a8c29968cb2bb15fd92adcce8765019f5b07bc07444e0dde208be5824d6c3917af7f9b6d5c04d12c829ed3806321985895ee3531128dc381b1db117c671533bcada25fe064e66e06c600bd8526768e72f5cd659fcf28e16017971e035e3775bf6e10fab8b4a559e4c4841e5810a250189183d0cf183d9a3000ce4c12aaa570e08129c77ef51b6b845c83d20c7cddc18b045268152ed2267250f81fa128fbe51c7c7b070a99a17c27e688a42e43a0715ae952dd0931363cc52835168e1b506d626960d16e283902459598fd25b4520749486938d21818e280420d641e42d24a4382566bab255319f779ba465a46d6e5c8cf6cbe7e1bd883929712f0fac23e4201bb2e9235f663c2c45eab0cd517c3d06349a8c3e991e441e59f5ad2987bc6c5798974a3171c887e84d5ce755cccbac6463f5b5ed11181876726d2eacf0fd3657bdf2342f270a91a17da2327dfc89d04e6be254f1082685316cbeac1674161eb362d7423892a99b7ba075d986c618b1e40febfa2cfc1f1c06c99b3a7d26fa508e823d379fddecab31c19df74e4cf35eb93f8273ca41118ef0b92d5a32d6ad513261bdb9ef2a8fb97c14439123ea3c201a0cb69a07f105c77bcc7db4557f0cca926ea74c475905ef056bbbd68c485d8df780b07f9d6e098c37d9bbb6d1a7b123b6fc20445a7855602c494f2b648741936e89e3fb48d1494449a5a563e3d767e88299b0930c4bfca0d8aa21c280a26d326758039ac820f983c0add8d2cb7c7445dcfeb4b8ab1a69aa4e02e136d4347622ea1d82f7f5d3ff0c58c599fe8196ef2944af5b71e20cc7cf3c1836aca2b55baddc39f934f9c31d1734822c4237e63e48757af5b751345fc8c4c0a4a725c17ab65a4bca602570f1fb05e56a2744cf472cf59c4689310a17c68c0bd073d7e1b06a1a6397fd1ad5c2d7282ed57b4211cdab0cd7343109a1cef3ba61555cca9bcf365daaa8f6892e6db3776a8e187cb120bf2d79fdf9efe74d7ec592371a4da0bf37097fd9d51cec33da38d545edf892846aae68ae8e1b8f5b56b453d4cfe2ca8f1da872f70c5e2ee077c9f37ccb3daebc70c610797b211cbdfeee4e68edfa4fed791963bcaf74d074f178446daa7d59bb64188cfe09b89b9a1af3426e8fc233d0f0d6d2b6a468c7986745a2d33ffe53c6e1d98481b7ad482fa16632fca470db12dfd29a6afeceacb7892adf5c386f7c41797103e576cf82a6a5226d3016e07e7dd449947642a34f4f1f6970087689f2fab3441556f2ff2974dbe0cafd978c7e1263121f872eb829be740cf1fe75d44d663923cd2bece850bd343cf4a70bd81566243a07407c9707f304046baf607c752f577c3ab9a55f16bff8d586b705b9329956d56c3495f5fc2e75574ee5f44bbdb5e2143a77640c972d02db38d872adad16aca8745ba713895585fa3fe40228d5d6fdd040db2e7a900fa91faefbea85236117c4f6ed55f9abe030445a7da58fc727c0c81c0ee5f8eab19a0cae434a7d53178b6d904298989ecb8103d944df5776f97e1b4165795366e46a9234b956ab86069c6420e1ecc78e74e49e8dcfa46de72e38d16940a9f6c1f8e1f6446413563bd7d479b14a55fb057540e875308c4015bb797e7fcb8513a5db4581a7e7bab7a8935617324e155c7b67139daa0f30c29814ff1a23c6ba601c0c1e08dc9d594a4ca1f1782befa51577d51babfb4f8ff45c146209366034f2f5092a8bccc854d5136d35b81232bcea3408c63248b239bb90be310c7596271378285c4840a437a459e2505cc870e86e196b393f7a27f65016850bdc2f882f7d0c44c30458063780faa332b7cf735d6a764c256ea3d6bf82a29833dfc5dc4c309412f69acba53ca5f4cd38d5aaad7eeb16ea96e968d1e8eb461a7db530c945f5e61a8d284efe75924a19b88380c6843222a0601cc4fbd608e6e2595312b7c9bfc1e89f833ac74e2e5d820800ae0dbf2276aac8587bf130e3573889bce254139f465134a2ee94937cb2198135882b6a333e7d46b53296da5f27c5c2a1c4e3e0b7d18f82b70a6da659af512b9ad75083573699664319e3c0fb0d56f86ddc6ff6fad6970dd0401286da083532dfe16928c3dffe832c94ed2987d5d2a5374e6bf39b934f2f8c56f34463aecf74bb9af5dbbc086d961704e3ab2f37568bf818dfc0d80e0c9d5414c851660c6041e443b9480bbd88c5f4beafb09846dc1018bc14027e4be8e328837b51310a6749104f1f7bb5a8705ce5aa7849271f33d44fdfb5cb0701c685742f01ae2d0b3c8de50c040b9f4c6c8130d6f7728ebfc018571f46e8dace268cc4b22286d13d28e655b361b0766116b6af3d62a0ce3fd813e2dc1aa41fb18ae5a73ca7de1c2062ecb3c473c93089d9f74b158e56f5617f625989837fa05dcc11635167375cb0c0ea1ec2269a55ef87fdedcea611c4e10ba1438831033148e3efd41b19914e2c601db6207223633f335b21533102c886481fdec0724b4da0d35c2429bf503f7e975b9bd50f4a2f7a0519f828b8e7dc72edc15643432cd205a4416d8557c435260f3832a2fd6dbedce355674360d403e104f7b811e05f5a518cf1b8fa53a8d5185b7db6660058e17a5aa8c74bbfc454253b4d46fe5af833071d60f34a4ed993edd50c060e1669db6fa6e65a392aacfe2e4baedb702b5506facd7e238a9ad55e0775d0efd8bd17a3d99b1c8bfa6aa04ecc8982a355cdd823244005c2ccd358c82230c50a073fe3b67ba24e6f41706d27608eb47da8cbb3c4a6fca74d87e6e18ad7018aa96fdda5cbbffab77a296a829ca2593843e31cdc51ccd8b0730156aa50f2e168044f6009c62b43d685492c7e583c07787672351c3475e10b08aa32dd7085fb2d1234cb041625eef14d492c615abfa6dacc82437a9a0584ce4e8805622957bdcf39124be2ddf27b73020f48e45e91d924fd56f2eb33e67d6cf57c2eb12b2a185c59432552e6054467ba930154a9f3f88ac90c64c839310c28ef9a1cc70c533b6384225109348498841cd99c0274b74c4c0f02f3a14071ea24f68171485bf3969647e873853ad843374e37f99087fb9c2af26cfbdfb1a3c7613573f88b710a01d98a62d87fa9caf35bf7a01636c82e36af5fdbe981ae43f55c0e48249d588469917b9bd5520468798d44d400de21ae6388fa398428378fc85ef83c03234f5fe1c48afbb753f6c7588407719e556dbfbd6e37e3584f3ca056e3ac7a1de7a0fdd8f48f93d0a50182468ccd239f2c4f416b99bb3eca9111f5795a4e71bd70af9be0ff0330b262c3411f3017ff5fe858b44e05f42b289014f4b0a9bb8251b81321d75a86cd65c0c05b7e2cca1debad4c8a62edc1eab6003922803ee427f55034b78b31a558feccc4b11d1222163c69c703a77f1ce3d3d6655d5132f60dc7494cd34396a987821ed500da06f10cc654df571925dcda7e08a29aa50b594af2316de7c93c5d3a91153c1be3a126322deae592d734004713d7e94cab88626d995bee3634b1b99a3d75184c96b844e9ce65f0fc9dd6c6367408b60544bdf1caffa4ddd0a763b26c82f463a52d5d7e72e81f84d167fd9fa8050aea168acf9d58aef26eea9a92b1285c4ca632574044e5f8d2ca60ab680bf8bf3b66065cc4ca9a421828c6c1e464881a1fc30017e5feeddac4e3aec14238b572c55ee10e08830410a53efde90f3d228e466721ab9a346aceb63a74c8f1b78ce27cce27d706c34867a9c096659d0e9c8821abe2c80ec09ea3e6f3029a02f65392ed9a81b5701c377dc0de32504a082512d707e7b9d58186dbf952d5ad49c2e3fd83f6fe46d6df9db4a5f632b640fa467242a4044d4b0af9f96ba52df2dc8e272ef938a9be14dcd52998b4acdedcecc678c3c96a1a98f10513381ac0dce7ff9b88bc095b6c771371ad70e5f371a4d1c314cd67a3a0ca531a80603067d9ac14f8d0ef80c80631a9f9a06d0b20856fe7ca68bac442baeb3cb51e79ede3cba8dc0326bca50ceac84fe636386d510c35d9f291a82b4480bd449c408d410b4c8298859fb0cff6aa0407dd6e64aaaa6d06231ebdb175432bdabf2b47c662e90fe1da88ad1a0be172debfc8501e6cc91d6815c40c25f4b9465cf04da84494746a39d8b404baed726d51389c6a88868c85714a9e5d93b0ba0ebec380394ca38844dae47ccf65b835062ee0d76993946b90f23597bdbbfd36354c796200169c538c3ddcaaf2403c2b29d1bbe4beaee090c675af8c9985d6762914ae7ad11d0cc2ef94f51c0d7b7b3fd0828681fd65ff51e31acb12ea4ade6014969fdef286d494b79511469d59deff72285009723491e1d9d1b8fbd9c8e81f1dc13dc008ca1e31a913983456dba3020eab5a40f0f31981b44e6e5e7443f5b604c1fdb31d7893e49b3612ad02d78705c577e5b3490aeb379ee0d2a05285b12004243e7fa7512de186c1c7780f616fb14ead71b68aeacc6e23f0cd6349757264e7bdb0ed27efd59ed77bf1a782b5d5fc3ec052edaef88d92e8ae59f8948ff1addd400bbb1c43d71635b053814439fbb41a97244b5a63d31a4f02cd7a0befd52b4d15ab45405cf65ceae2d7a9b4ad93c5b1f432e6e1981de37f70c37a84bb7c85bf2e3a34b7fe2e6764b6b7921254d3b04dc6b6a4e5e9ec074c4633be261db9b72a1c5ad81e89a7b915fe48085d35ce284280f9562fb9fe95b5118645a988ef27d66f43616a7b7aaa992ed49c4fec27b020374d154732f00fc5a5e9a142df2de4c2c8895bec1e81e37d1da04a4ee6b6a7484b336b24971e1eca7e6c9b8ae711a48fe6c87e9034263203d8cc5854bf7d0a4e3db5a87ebcb0f3e1025a520c9fd075d9922105192f54750f9d0dd2ef6d8679bfcd3569249f07dcba3c6f9399896b59e779b35782091887e3f5ec0be9b96e6bc0a363732dc1bd361c944f6ec7e39eca37410b156d6bbbd6e6ed0817bc3e0c1a753d93ff14017e9e473f43ab8e831cb8ea6eb13844fc48d9d37e1a45f28a9c49031dc752e1ed9fc46856ac17c51a1b4972af2b295ffd92dd401428a7fdb232b54a9fd90f405d406c7d13ad3d37705e1f402c9af54d4391144e5b4b2db6de593d39d1db3f7564f29a47a32bb7c910c30ee0cfe90b0a7ba13cf046cef8a29318fb8e7dfc443f5400807ede71af3c132e857f3328ae8889da40e865fe0304a370517978b9e74e6726d00ab54af0fde8271c13e736e27a6cb1ae84445e693ab528828bc270941d6d4f6c3a4040ab394850a4eeae34d9eca379c37550f4920aec52ed0cfdf6aeba16b3c6a8b7efa42a3300d13594d7e3d485f95fc73f0cb325c757a22d4edeec270abde7958ce3d65ab9993677a347b8b3d916dc4ac00aadc4375e2620a965900360007db432c68b4fe1390524ffcc4b802efe31f06152252f512e92751142a2e4e551f0266f52c4bd614cae21e4f82dd831568e97fc441a0f0184cd8a45e81d18157b4523efa522091388c11fe5fc5c32bd1eb3efc611b8751b44f012487d37748a9baef918d4b3df5454b38397e4f2bae863467e9aec6f84e3972dbd06f0551a701b1f1976789747db976359baf872d8b9ae50bc79dcd2c585222574c08d9833a48cc7cdbcebb1a7fd119aca6c720b4dc7adeae523031590abe6bc02c733781b1c44a7860305cf9c012e9286fae9c2b63380b9ea95c3cc316a0086048c153afca80e2e8027eb1604d0b6a8116834348101abfcd22c4c296c4d2bace83a43cc46d51e29b4556c851634e405c299f38ca526ed43efd5a3715c07f38d577032933dc37ff0e4e13ba5006e957d884bc7ff839b05ae0547540d234884b10c761170b7d9e45ac591c11662e28a119294132f04e275712a3a3814c7c2513de855d920d903daa0512869b592641bbd1a61b479734647b61b778811c119a0597dd018d9268bade5512e66568b2a9752d102ee7f91a5d350c3fe4afb54f2ccc6193cc4ef434ab892aa1b571850d854e9430bb40da21c82e6469ccc450cec4bc81965320b8d0eb66e8a98ef1149b50ff61ab670abfbfd3b0dd2a6abbf50108466e97b5343733bb64d2ce740d1d15b163f064455dbdde0c2a13a43916a2aa75afef38b29d25f62bd01573f676d8fc158df0a8ee7a910a307a421284d1d0729d90e7977f40d78433fa900c7c158ed4cefbd682898b3a8daa0929a164d902eca6baef63c2fff01a31fb4f7b5d13d2cd1ba95f087f105da79590c1fdf849f4eaefb96e837d83da27f393ea9513a665e4d20377d6fd787904dbea435bf854486fa041ce3aa5c63b8f7c208a465a114ebe2eb69f74a34a3004f6cfd197b009a76cd89d2f4e2b5104f28c09a47295586c63cb6d7c70f546cfed3cea19368e88b7bf937a9353c8389618e4b0c393e5f46afb1b52e1de6d08a3885410c65b26a56cbd471ffc936a7a6b6546a160200f2382acf6f687eac205e1394059269e760924da7782402e8d0daa8d0b114a9d4070c11bf06e5f66838e620b963d5c11e73d1bd45c2a41116e982b7cee30e05db45d5f257ad8a50757209afe5d99b7934864fb4e15af9bfeefb2dd50769589f98c8e857031ab77b9aa50c9d9822cb06edd4e6b5354b8a0610660039bccb2f6e4593bea7862623b8ea6032bd18d6e8c7f2cc8cc0abb181a22138a92562f817c91952e89bff8de6634d98023265c181e4f2e6b25698d70b3531656e39edb43d77d56253bf41ff6019747c9346b72abe56527e88784c350c06c4745ef73241477087ff62f1987c8239953e0a0291df469eb60c5d830ac53eb33a458d2effdce6f918e069a17acc3ecac9c5a26e27ae3635b430884ef4d6cee7f0201d05dac3c73632ff4e5f23ae6327b9fec3b4b1aa404c7b4f72bb26aeb6970d57fe977ecbde2881fffc6acfcd48a43af89c4e89ecabc6a3403b17c88401054d003eb1e88a16783b614dd31ca9945128873af26ab207ce7bca8c0b8833dd3d300ee68eb0ee5ac489e65821ea566989ecc81b8f98f9febeaf673a7367f361f2bec85c44827dfff9fdb2c443161533f4ac4028314b716e6adab5a3961858d9bd67e004f2fa68627e5666d8c6095f6f754ad594bf629e9d238182c2b8b6d64af97f4819810b333f619ece79634e27f42a2f5c303cf88a5f31750482c1ad240e2ae3f4fff683739b53d19d79193538bf6cbffae8e052952e0844a8d46a1b073a9018a4ae0fd79471ab04d91cd3655608d890a9c657455bc0daf9609517c9c309c8cd039a81f42110940927b6b4401a596a0ce93ecde7043fcc976b3c381b35ea95a0b6b1a410f2198049caff3b844300088071ab41e849299878e94a18213b4aef24c1d436ecba65114be8bc0729bdb6e67190459adfa3f2d19865f30e58e16535d3fe97a48caa82e66238d370834eaa86fc704da1cae04c78f65fc6f7127d76183f149a39a8f9e4cb3335f3c57109d27ad38c752566d3b696db6ceb529eec17856e685d2bcf069a0a9437a637713287f23133f2f4dd833c1100c7795bfd5e683dcc49f9b753d71c37332f1c9d40e924c1a6fa5219959c8adac5c971993c35d4ddcb9dbd4cb8b08b4d9812061da6a43ac44560deef852e1609d3b4bf2bce97b787d7839021ef83515c8ac59979b5598d8cffb3beb666b677c40f80d7b49aeff1df3fe6a29ace8e2aede03079d7eac73670d1233d5f3f8db40072932945561155621bb41f647d3546a695bb9a2488e55b5145b83cb1d026682a1b966145b3430a33e41a359cd677154cfdcb96f58b6d69354177b7304ca70d8a81bf0e309f193dc5c37f235232f4ef5a08be1a9cd2ea85f8713d041ebda4b0fc7ca6ed8f0085b9f574139888de6ca11f131a80aad445bdd5aac0e22bf41389cb26d9714a326743bb399c9020ba2acfc27ff2ef68c1cb6e92e1c13afb9457e68ecb48eb371541749761d884476afda68abd1303660cfa27b2b355a0da68c6a04c2540cf9609b6de8c693b523aa15278d729cdc4d03a5a04a2d92fe3191770f7a38d44664156de0f81bec4dadf7df78ac5e75fc8bed327bcac2d59c7c771da838c09994e69e1ec4c8030bad5e8a10300290f5e5886116014b5fe388d2ac7a58275add4fa6bf7a744a9ef769a3b9e304a0706161221aaabde8b3293440f1fccf85e1a8f99a058304482bccc5c6db9d4cfccb304b11b5f0a4e76668563ade7125f7177405bab18d6d423ee2a6f9c733303728ffe94eca5673a24d42b2f07b83c10f7c01533afa160eb4cf163f62b54e5ea7e3d7faeacb467444fda3ca7faa4e002e0e15cf03760e78ed7d20ca8460cb91d2044b856edb1d12a2ead6fd83c11fe00a5f242675df0d2e1e5980fd66dfef528a12bd537780575e2778af0ae018a37dd610eee958025bf1cd0183712cded5ce9cf6abfd99ab484c021b51ca7f4645922221148cc1bd018d0798106c66cd0cc24d886e0686e2bb64d2d38c48d97099e8d71ca5f1b9025cfb3e83c7addb2645760f7a8e8b28b06b869dcc50ffd01b86b8687efe0dbfa8d6928a635c8f4f63a9db50ab0aaeba36de4263c149c9e860ec22c5a9f94448c5f553c31a08bc8b1e7613450a91f75ddeb0d94829743efc5cfc06d0b1ddc3b3a868f14abe96904dfdb6b470dcacec669bb518ebf4e51dca5d0b067b667f5112b34782207636911ba89bac8d8109af3e38b8146c26dc96f7b3c83bf6decb9f72835fc929ce70e5eb52a7943d671d207a419539b576ece63b8da85678f8a39c2a655628ac41caf1be3a83c1bee33851014feb85286495595300c93ea195f630907b1dfc546fd8beee11a887f83f51a039078d87083d66511f87903a7fefd52d0adf57941787adbd5de0791159146a12789daf04119cf1424c91e5842d32bad0c4c00631eb3e9f99d3a11d148aa5399c8da6b37b83193028037aed56672c245893395ab521d2e3d78c893d22424d7280490e34cb2742c3b653e833ab7f94e1de82d8922bf858ac2581e2da27da61b922145fbe4179d586c5d12a986039e2273693502d2344730160f1f9cc60ba7cb7ccbacebbc7ec710ffe0f86342cfa50ea126a6d3d3e50e03965424be44127a6c4caee84e905156e9516165b98a6bd9f1828c27cc95c8195022270cf490c511eb29b9b51b6ae4e9d92010a3678bda8301375fb1363531ade050757594c4a61bae43083b049702c428afa64e91dc880ef741f1f8d26e61f42de72bceb774ca7daf6aca7375f5ea95c39d4a38d5e4d539e4fce39aae3a66f09cbd9525555910ad400eea25d73fd632676d1a080dd0b1cdb9e3077e4e4738aedf0163b089f35c77de76a0c8bdf0ffa1f1742dae0bc7253b416c43dee2f43a2d2fd0d0c63026cb918d17eb87becfae4c9f1ec80dc5c84eaaa1e11013bc9e8c471a1977a81c83839b4239b9db0223641fb8beb800e6b3114ce2a62f57d9d4b147876a4288af9cf6181c66b62334c6ccd26696571221c01cd24d40064da7cc56d5b8027b3fb8e3ca9b3606462f7fedd2ffb6f7f634f1726213fbf34482c0d08a5cb70082c7989f2d984246a7c46677d43395689291df089d6b3ec737bce8d84bb8bcd0ce4019e4e918c46aaa3f2e1089a20ab5d56c0b12ae60ddd9fa72abc24258e72bad070d939d9003033e3009eae1e2fe4b17993180bef50b2274c12b48281cf33d896988103a486468675d7d473981ccf3ac539fca7356454dabdc30ac14a2fb87865e5a91976d6d50d15d6157c5ac0900ce639b9b2948d32688b78b58156f5738e07aec36143e90550469c284ed1ac0796f1b1abb3890fd359774004424ed4a47a9303d2970f8855a6e3898bf76c7a99baa5d8eae31a27b1ed010eabcee1ab45c9492cbf5f42a3b569a34029acc7561ab091c681a19b150fcfd229811ce809eb541db2ee22a67762f79d7b5857ce051d7c47742b91ce7e65697a64a1e7c2d69f541896b7f37f064967b1b0ec343a6b1fa1b526353dac4eb7b25601075062165b39c6f7b7dc6e24be85743a295ba03d8435ac39ff63d7a793932e135ee8fad9bed919356c5398b6e559818811cefea6368cb06ba728c054fa13adb42da7e745bd8358ff3cb6405db2d76d0ff1e13eaff998db06ed0102a6dfa62272fe2810fa99326f35cdb46655131adb04bb8ee84d61cc688d5d2a646ac83e49b50031e17cfaef4f73ee051a048d02465de0c05e2cc7d5a764016287b0a55515dfbed699e32eedcbebf5a221f9c04ed7661f1a0702d0d23c80c3a399e130d77f1f0d25050d2aef83fff01760606c6da8fbf51a9001df3f97fc71e909da9ce4490de79a75c1b2ec1cfc78e0a02b9dfaa056cef492b4644906cdeda84404d2053df45431d21d5ae12c648f4bfef28f1a76cbb27eafdc13f5137dcb0a17ec48c955c1678dd15284cbef6b18df6966c524ed2011b9cdc92133dcc151a2056ab3a4381915f79be5bde68bf57a005d65a5644d0a6cc2f054ddba783323a69e9d388ba02bc472c80901f98eddd52bf6f34c0c49253c427067dee2dbbed1f60be61aa8b2ca31cbb6260c4985a10c3ca33b917d2ee321118a1570b8246cc10a12ef030120fe14b1470f7733aab80df6cdede15825f5dc362430a9c7f695e57f38f007144f96b3be36dabf48979e198fdd88c8fe851bcdd0147d910df27f645593e78fa1ee9202bbb63ff93214456bfddf036f84cfc3bff30c7893662367ac27f2ba03bafa2205693d8c6ee40286e4cb76a1463e1cd28b98e05a8e32f2c40e5aac316b0238c9ad70ff3dffe7f504d78ec07478b13403d68b134c6eda2a6e75055d1156c157c61c0a1d9d30c57e9ff0a2db6d5bc162d0cd80e73c8ecc5bebb838fa43df921614b1c0e9e1019e4850c78d8d541c376d434856404013939eb0a0c67b0d1ac673f13f9380635a1a897b528c75e0113262a314b9b7496bb54310ce33bd123b20f46806b3acb1c9fcda8bc4a9586c5ee47e7e7e86729a45db59e98e772af49bd9240a94a94a372c1f590c09c00ecaace39d1af3f3e4616fd03ef9ea94693a40307a8cf5462f630311ae9537bae816b8a33ca4e01049a53c05294f3c965d2017dce2a96c8474beddef1946dba389eccd00e2359cb061633ec499d0a78c1094a8e590bdacbf8a98702c36e8144ba314778d30f8dfceda0aa1de1444e8bba6b982cd323f5e1c43acaa4ddd158c8f5d279354e58db540ce58fbb1ff2266c0fd2f25470018fd08189f846af23c3c40d18738c4def160d0a34da706ec11246332032896d6d396ffae1052b2ef9adcfeabf7f7f00b46992a31603ae82d681eb712e55d7e3ed5c7186060e24374f869e5d7563c7380c548dfca8dc174bb254ad62814d843f8f2ec4cf0cb075c06a19600c93ddbc87a78c8cb17131fa1dcb2ff615e001398a0776795922531a2a79ce7fe84a1dc1db0aa8ea6866aa40c9eeb8558060d01d3cfa22c77ef6a4bad18d2c6f4a8b3f6e7aa4f890534492850421eb50d2afa7925d06e23947f2b85730b30d1731a42ca9083b7c5905597c58ab3785fd2ef35a7f3692d9bc2c3a0a5690680e3fc1bb4b6f985b078cefe3be7c237f7ca607e210cc52cd0e751bad5068a881a79894cd0dcb620544c0903fb22c4ab14e64e070bbf9e4d5e3d3a510e49a30f047563c074c6a2e64d4c65f6ef749e477313e2228e143f914aebaff12da2b2c8f60338d0e588542865fec3d0e22b1d73208870a0340c6911f7e1c92ca30d888c0bfcd4217179c98f749446c91712c8dacd289d59c37972db995a322b22f5187944e139d443d0d30ac47c2d4a1f036427e4c3c0c440647cf866462daeb4eeeb55a1c3f8b282e85b0c543f2a0ec50f44c50c8339cfd014ea5b232dcc31556946f66dff94a197dcfe50510cd5f9010a2087ca24d4a5ae8347424ebf3fc5066151817e594902d3d5685658f45d2017104fccd85e32775692220b627fb7472694a4161165894521eb43bdd0cca8a00fbadee72825d1aeaa01c7f5e47e5df61296669e667e3d0e8b45726883ca3b96483111a905391e1ee3d0010092dcc867eb55fcfbbfa9b2baf6889ee62b43bce98f00846bdc8eff428312e24eba033488fb8c9d1fc2712e96af5ad880c24433bad80d40acc9e90b420ced9ce500c4b9acfe91a3475e2d879ed71f5fe7b49cf0ffebbbd49c8658e128de16424c07edf684b2b12cc3c35ea02737a6df753494efb6760dffd55635d6fdc926afa1f6c54138d6029b9d7c168f3c10e233332505b0ed33a314e25924ff1fa528b720b5f738438e263fcccca0218e082ebff147f4fe7d5398782ca0829c7420c8bba85f71447dacd3771a09bf9a683d2767989a0946f9e879490bf84ee8d64d2c0901eb3d0b8211d31e299861b963abf7ceabeb7fd9732512e0fa7f5c46956e7036045ce45d7bd8bb23666b623738c451bba4ccdbb73b932c2a9d5965e83e8c26acbf13c8d7797269906d3c4f0805aa095fdc284db2599f3c3b5f17ac9c0054f06f06600b31c20d670d6430fff525fc5b00e9ef98cfe42581f5ef6d5afc5501d155624ed00a957eee5c7407c1fbf599d0dd3c5ca39da97aa237220d8bce23a0b2bd2ec93763f0e5bc8f8847f20850152cf10afc8abe4f0e01daebb0d92dbf07b91e9ae7bf496d229c69cf247a7baa8cf572e07ca256821ef97a5e628749478b392786a0de0eb884b03e1842e1ce1728a0d2046e409b3805e99bc607553fafc7bd66ee7c1b5680efe754d126eef5c2bbe0a8dcead1c1c9db5dc2b6a1e70429e261828fbd54b28fdcdb42e3709b5bb5fdf54121506347d3a06dfd11a0e674c6cd16227aa29d7b15200c6048d96e843a15817c217d4911e45ccc8da5605a1871584596fdaf1f613c2610caf695805bd54e3eea0156698152db16629321990f6fc9d62830624f1c08f4f9e9a10fdc8d5eb3e284a3e2c4dd547eb7d2149e06a7cf2745a96f3f0aefadc0a11cf7756c8f80a902a11e27b8c48786f3964c76e910c08194bc7c2a38b6b1693eb7f183e66c96d4b6d4eaf68b68f5a6dafd8554b14d241b1bb19b08d815eae9ff1e3cd61b534576be0ddc599ad846ac762741008a42501a20dcb8f3c60cf5ee6adf5da72f63af6c3fe049f8d89c7a41d7d55b15dc1f3f20e338c9f1ea5e37dfd2d7000939ee5b08e875ba2a82154800d015e7a574489a6f583b59dd2ddd96b0a6e387862802e112c30c93c67fac8e8b07f75286348ed63304969822457796851f1a8309e52fd2e3866c7c0e567ef1135223266261bd59c070191d7abb9cc229388d17374873f06702fc5cdd71627624afc294378d00c91707c4770a489313f74e2d534fcc4ee0d4016d037c101bb82ee19441c2805b651bdb801ae17b2aa26a9c8d54d962fee4d00d5df993884ee40f6c4139ab3416053b308e10bb1aa802e88c1f8ba04e1e3d6deaa7704186b79ba20c7e80ab7788011a75b01c7b9bba80d366bf2486f8ab9be28005f00a7e2d6c576b5fe35e68d3acb4fa7dd4e14999ea5d8b009e40780e7854a2ca6217da56407445045d23f152af4adf317df15d08499aa241df72ea2c0cbdb742ae4120bcfb1a30c018e5428f22388f9dc66db3fc9102b60688712c4a5d48c2d9fcfdcd3cfacc90398d600f017b2d2640613438e036323b2309731aa2acf4c3a15b5c5dfaeb02b0d12cd7aa6894e20efa2eab177074cfeee8a872b8c5ad488067cbb055fc31400378968b457688304a058fa6796d24f97aa29d52379f1354297867f07fd71019172715c3d0168abe684dc9f9c9328918030a6ccafe5eb1765264e3e4389a8a1c9dbdaa5a66ce3097ab42e28bdc71c936c2bb17961e1932e274ae039161d37842b4fafadeeb89fbd72f906834badbe0725bb44f8bc01155f21df6c49bfe608a461251f79b37e5e390a0a5899b90d11dd5501fba17e88b857642d7f1d7ba8964559614027227d0de53828d44dbf7fc228be95bfb578dba19e9358b2ae8120d0655fd34e139a2be45b8a0e903d2301f57dc20d97db9f99c313d1c9c593f8f7ee879e75730a36f4a61cba81ba635049c7c4acb4733fd45102068c67a3e028333ed6be287d1b9bf897c115b666320e7e8e8914bfe0f3d35f8493f15b03f45280c4612dbc623950619957efe522496fd831ead0ddc792edb6d00a9fcc50f6a1c7f9cfa4b16bb0d315998d1d464d1ae969385a5ad270b2fa150169656ef24ec34b0caa0db88114c8ce0caaae142fc2964a858226c1452ecc1e5f4bda38058c6d4c9f801ec9bc4362212381b5aad8e228f8ad7073ecdaa9d331c55f433307fadc1fdb92bc42c1e34323b8147294a6b2927578a3effae53ac8da3968810d87016854377780130e1541c15c1d1eee335abac90423c38de2610982641e6d7e688d316fab6bad83088defc2a416e143cf3f6a088349a1546683c86e6854b6897d118c8238336384ea197311d45d6784b071c9387667758e26e78cedc6653a34bb2af97c3efd86e43ecb389dde64352638c1f740ffbcb1e3493fe736b944be0c97c9289b523fb0a09178bdce39265b1ccf12f31a875d5d079ea9ca31cb13158efc4ee38ece752b220a98559c7403838b1f89a067aafe34e6f4f54c4e8a5499f440c4aca56142f5ddb2db9ec00dae8d1ddc7e5674ae1e9b85fb33d8a228051079a6e2eaea80a88028e017472c0d8600958c0f4d044f2a929bf80069a5e58358ef06ce04749e1b3440ce0b37800bc277010992fd869ae1c0174da01ee9bc96039616d8baae70fcd1148b9cd932022604ed0859323ecf5693e696411ba34b007426768e4bc979bba3ba9c3eb87cb215fa4a2a1a10115258f3d095f79e8804713b9047a76369dbc7b6d7f17e92fc795515185f1c8b92434f5b44742180326f8f4311166f4bf30442507344394cbe5edabf65217f1f6bfeaf8da4c6c9e103b8af30ca73e9c6ab8d66e794a9c404f62e89c2dc40452c7878b97e5c1ad5c60bcb0d38e45374ef5259cb7ebd5bfbcd696846d2251d310bbd08146b686dacfa953f4ec7c5c6a8008b88f4e879d574f09e48cf8ad8c9afe0f5d223b672c311bf84706abe2165c2ea01ac114def0f3050b664733e38fdda26ad71bb3d6ec886451fb6ea694c9e895eb648a9d1281a2a61149312d7f82bac4be4aa7bb9185b6aa496ddf79492564c73fa239047cf3807ee008c9177e4f3673a8f07426b1ccb9ba0c6aa533cfd6da2acf56b5311086ca30d973de86852cb1d9e02532c2c721a097bc253c84b794ae29391b5291233aeecbd86b11f3667306402df3f7811b2603621f315f925eba864a5a0d14fa31de9ebca46a5013a51510232816df194b2ae08db569756b21f05b0c93087178056879bca9d973e53f1c29036a6772765c601619271db53d7b578ccc69441dd23e1fa1c87688f323ba7f099c44eb6ffe00f44e0f78fd415a4d3f41a8a92fff668e30f13665f8076ad027afa60301cc0aa0ad90162bf5a59c9b261bfc2c10f8618d6c23d208d984ec4df6de72ef51073b074007dddddddd2f6de1ec5d1683f3f668882e86f9924118a92912c486668814129f61adf5b64ec12a61eb7892c1a86d755b249cc0ee0462b66a8b9178d348a85a0892cea5dc46580fe951d7c408e8d872e46adef8240d49754904f6ea3288264554af549f2c225797953c42c4484c15e96cb621b96a29245787db1b0018dc2e2343748e36dd0059e174e4aaa55b5aac6a596badb5d65a6badb5966559d65a6badb5d65a6badb5562883615990b51600308b656e9116ca8995bdb0dddddd171bb9014990f4e28dedb677a3b7408bc177662b10eed72d2aa250d5d65aabe5ec61b4cc711e8dd822de48efe6e6c64a1a19046491419040903450b6589aae815b75968c861259023daa22845e056134c2827118661c387618018e1c3870e0c041c466adad52d2481a49432369baa66bbaa66b502e2236d8239b02bb58be62996b74e52eadb576947a4d1764a351d1a3968fbab7a4e9955aab0d65306cb5aa0cd63f4963720359aa5b1845bc8215608aea2d379bacde355db37d5dd37d5df3d1b6dddc2e6c9d77b85fde6783c8731a33830ea365d0e5af8ac871dc3fdc755dd765e851cb479d6d5244a96897fbebbab89b6430b80bbbae962c822b160057e0e851138fc8006922374e42e4105307c9446510ce0e929e4bc4f651af0583dfb778b37934d5e8efba1bd43fbf91a6026531ecfb1f54bb4820edd234a0ec857d7f1d59757777d7403cb1fc0164a9fec1b2073045f50b774d8faa21bd52d58c8edc4857a4fae5eacf4dc085ccd5933490a57ac40159aab3680ec33c22f25457b3bda657aa7f98fd6ca14ef4a12062d3ce79f6af6beaab7f33df78739d2069ba26d2d0080149b106aea8bf8949a75345d9ea26c962d857ef6b1ab077e7585fe36032342f023075c1284800c7e6a12ccd16a4ab89402a55fd7024bf9021103f04c93373a1651aa7df255ee72418fe0a7023c6f1628e1e551d654233a253f55bb1ab3a87674cedd56dd6bf47b62fded4440ba65a6bb7adebfe6f54bdf1e5c276b7b0d91ecdea56e6a2f3ed56e6a2b1c7f3b92ed0332ecb62700ef268c4fcf1bebe762c8b617fa1bcd8ea7188d97a1187d898833dc398177344140cb92f8305b205d109391c82ea5797f76da14e7414f39421890cd01c3c8d8192753ba90a6bed2ffbd9514cc75284a41b44d0a5eab69f190cdb56f70d17defcc6265f8fde8071f0a1fe6a61bbbcaf25471f623e434dddc0deeccafc9d31c6185becec847a44e70db201b127112e6cc166777f5ae0d2156cf0b05ec2f919334b09718ca7c085a2cfc2912b935f2aa44755909b7843836ce1c6c81029275d3da9fcab3f5e4ff85f0592abc72162f7d022680fc4222217fe98bda43c662db64b7a494b1eb31793939357272727b74e6e4f3e5d876541fe4a2c665d7798bd74cfdd53fec19fe89f93e08fe421a9a2422f7ae8267e3b9dec85c43bd98be8d7838570cca24d444264e20332412a711109cfc4af044990e498889fdbe2f37b0e4a6844ca49c7dcc0f1c23dd9cbca3dd9cb0bbf1c76b190087f319ff885db0b2b2f883e7b246fe407b64fa67275298518430064aa5da64dbb5c4444af4e85b40b897bffec0bffe890957f1bb5c9d5ab8f7aaa3d8cb00501885c7d3507d8bf6a835c1d7eb506b9caa25f4922492447f4ce291e0a4ccca1d398591e46cbd2c33c1a3187bceff3138f598b13efe4c989ad271eca8b13efde9d903bdac5c4ab12d79e72d22eddabc7eaaff0abbf8065901e555fc152c808cb1aeeca5a882e1fc2a25f29253e8d995554ae72182dab789fafb8ca62d0ab88ae721591c7a2e507dbee21316142f479c2c461b46cc2c4514eb318f422ef93ff7c66314237e1d188f984f7c98f380bd9c95e364fe662f3647c7e2f63c4718839f40bc2e02f09263f97879e0fae318893ca9bc0d287fcd12bd545d5496049d3a3ea1e9641f4a8ba8ebc55c7f8b85570e3a87e523d05778d1e551f81bbd4a3ea211c8ff4a83a0a8e43f4281ad161eb7ed2e1eef9276fea09b254bf6eb6ee272ce4092eb909ae3d7a54bdc3d5478faa83f0b53e1359dd05cca0c3acc4aba71e55376a2106bd9437ed328d0c01574012921300b6c4184603802b5e802cd5b7ec2c243ce5ea1e1a64c6dcaa6bf8ebaa1cb97ad622210e11a61661abbf00578ce42b59b2556be15091273dbadf937fa36c15914d7e238659f8b3a1254f20874cafc1549f800cecdd65601c9c3d8712485b0149ba81ce9ac305b29d55463b650f1db6eff99f10c38ace0681fd859b755d619b8796c698820b616c5a7dc52e6086de67c6ac53d86a3df568a86f1b6df544d203b37bb6c45c62945145c6009831efdac226a50c59760eece1fcfc14363885cd9bf69657d94b193febcdd78087dc85a25bbb6d5d07e161a628f2fca85d64c48f0e53ff55c07a344caaaaaaaaca83b1afde7b746fb6f9183d8ae2831e4cfd172f5fc321b6597a1cf060ace783a4deb15e811f7dec8454870b2529a210853e5b27800c5732b438c3cf64fb54873564ac368cfc7779f5f2fece393d1bf6b7deba321067e0002c6286189319aa570ce343e5e9306f83521b36a677812b052a90410978c8c10f6466a0b76103c24daec4dbe8bc1c62acd405370b170b1de8c0c5421370d663215934c5d5315cab4b6fddc8234ffa0b5b32d48b32d58b71470d73521c9b7a416270337cc951244201596067ed257321b12b210b7cc73884fba1580145a3d8724a39e573e818774063833ae8004dfefc19956b6ba17f2a504640225d6aabe95ab6511566e44a3d7907c6208bc414339c54167d745d27e188fb085ce188fb075f38e21ec23362ee149c0657b8d7c7209a1467e48c905cb9731f813f0f61983fe78e82423f9d6cc810426ebe6c03b9fedec6959411e513080e5de2ea91562194932bb1108e3f467cf02dc514f528ef8ae4992cfaf838a9e8a3c3bd72529c54f4117f4096fa2a02b9a51843bc014c516f7923bcaf4bf1be2844522f0790a5a27c76354f42a738a2525ee1799912c25f0482e27d94662f24a715ac24c7a45d3c1b668d48e13ea1d8587639acb1cc2798630359ea25ae384e8029ea3950802c5929abd1a4eef593354dd33e354dd3b44b4dd3346dbba6695a27354dd3b44b4dd3346dc4354dd3b4946b9aa669dc354dd3b4cf354dd3b4d0354dd3344dd3344dd3344dd3344deb5c9bd7344dd3344d7472946bda61bb94642fda9569579913dab8ca65338e86796c70ae47bb9b0dcef5681766c3b3619a65d9f06c986647d8c0ac115a4db1815923b48ab3312245e3e8c7c688148d9b211b1af709491b1af709b50dee13eae0e63ea149a3c7334334e5155a6825a724aa742639f3524f6552378b5927577523d619474339d980f44aadd783dd93941bb95ece601fcb496d5a8d198e0d9638d370563ab192a65444875c3f936b26936b2d6520a842aec76a6cdf95699792d7df1df6837160d34e3f49d3ce843e75b48bca4397479a346d8d2d943d7459d3a469531b911cba14d22e9c872e7b3469da1f1b901cba0f5de26812b5a6d0e58d76f13c44ad9190c9436f9a26511b64abc9a1ed216a79e4548f1f39843df42e75bd8d093d1e699793871e8734a9b2365b911c7aac6997eaa1471f4daa2c2af450158a3b78e4d063e83734a95a38c456caa137a049d50ad942b7a15d501efa02da6586f54e05aaa50b6d9f1c0a7dd4a48a12b5cb8c0ff7d067936ae87ae829d94b68ca485256922b95c4c45306254957460625839241e5fa9992a45b9aa999baa5992a49d2954a9552a5544946922e144a062583924149d22523839241c9a0723d4d49d2552ad1144dd1544992ac54aa942aa54a329264a150322819940c4a922c1919144a0695ebab94ad5256a94a9524c9a652a554a95a144a0625932b4a92acb5db26535392644bb3d475db96caffecb7bdbea3a265254424bcccc35e567ac8db32cebdcacd6ee86a9cec5ec52b712e96ca38a99b4ae5facc735119077551a85c8f995c97ccf55c322697cc665da5ebb94a2657e92ae5fa0bb329932d85a542271565b2a130540895eb6d55c9c8c8d4d748ad92dcaca79572adaf1a736c36b0cdfcc91b9bb25b0a57437a488f6a678b3a4155a846591dda1d44464646e6c3cd9a75fe6098adce2827d565a324c58ec96bdf644f87dbb04b53ae4fc1f523eaef078b998b92245d19b9521ff23e6b4b797a40a4c7b1e951fd95b15aa9e3a47a548f6960b33daab7d42e356e29d7672569edb6c90e05cb7a79a45d3e7b823b4b238db15c6b901fed02a45d3ac738db6f87857e3bacaae451aaaa3b4191a110ca090aca2f4a25e589a4bf2858e3f9d8a3886104922b0a3ec13368f6d1a35af9f87153b0d92e6dd299b2630ae5f44d707d876be4fa921bb99e04d78386449b5cdff51fdc75f0c7c7c436ced4471f3e6c7dd461936f4e2ad7eccae47a1258cc1a739600596a0ab2d47352138aaa2763cb40cca1237198c195da97c3295b87d9fe307d98791f8a2c23fb88bbfe59e7388ee3380fa67a7bc74a1984c92c9b595eb51e4c3fbbbd8533fc59af67212dead54849aaec6573009c81e4db3924bfdb065934098761fa9fc7e33effbcd4403d0ed05f208719e86f858945e4ec9d6b27f976ed97243b8824037987e97fdce9610dd4a3d4b371ffe15e3ad937fc95c832c38090e5efe5c598cc404fd9560c53793e504f077a1b10902b927aed15b17d100292642320495b0789d80c74cd5c70a1e86b61c9f028e08aeaf6defa9dbf167ff13af68bed1bcf53eb4189e119f4c3bcef97b5f7ca5f4cdf12cbf39a41a5a5bf3037507ada8283132402c44221db10152db0a505ee20c318a094945e0ec3c8711cc771d77a638bbbaecf256e9bcafa657dbd84af8980bc0fc330b8653494c8d9411c77db15748bbb6e8f9d93d5be3907752a355d03fad0c8cb98248e4fd2a868acc6e3ee6dde7589d84c6e6bba663bcd54f193d790d7437aa546aede1e4adbd813cffb7cb4c36859fb154120d039208ee3b8abe0388ee3388ee3380ef4930c0688cb388ef3d1b29770d7755dd7755dd7755dd7755d308bb11d0505e5a6807e53b08aaddb2b056b6c03f2be26922bee15f712726561e760ae7eafaac41561160632c3aa5e491db93a6a078f1eb20430457502538e5cddb6481cb98af9a8eb9a2c6c34dedcc85cb5e7032957aa3fc2ea557b5f35f52c64681792d71872bd0160adb556157045e7b5567bd9cad57a7d3193489ad86d9d3f49d3dddddd01f1e6a50b5b8c4147bb602d03c3e5e295bdf0603183c19df3600cb2d00cae50144094c8f43ea4e7f697bb6706e7f576d64f6b45b9c230374c6ccfbdfa7551cfddde7ad16f9eed6355cfaf4c8639870c8352166508c40b6ee43babadb073f8de7eb857b556f67adf3df6ce62787e6fafe5601c66e63c520192e44c11206ea0da860f22323d6121d35bd90bcf84d172865fa6071369c43cbdcfd4237a1ca27df976e4ec65522feaa0d93c87edec91d4228d0c365448b7451ad213e866a110600f0c00493d6af9a87bd72b14766f95f478d3fb4e5c75b334250fd0434c8a008100790083a845f4e3f92743a61e222c96b99039c3e48c9c913396853916ce2c8c59f85af8b2b065616be16ae1cab22c1b2c7b0340ab83ad079d102e44865c86b5731d6e5ad6e27a300fae3c5ee5792539873f98c4037303f7c954e26ab9cf31b802621d8e25b4075cd199ce7ffe79287b31fff91d81c50cc6fce73023c120fcc132b4e31033ca0b51b66e1dbb2dd14f1cf3b46b3abdcf06114ae642e6aefbe18913d154994ee4eadf89f9cd5b9becf13e51b64194b7dcc15a8e530764b1d772077386e0e40ece8464b983b113963bf8ca1b3777f045e4ca1d6c01b17207db96b1b983eb919a3bb8aae960daa383a7ed60690364b167d10b909b27822cb683638ed3829025c310b25cf8cb0c90fb91084d8c218329fab41b6d926a34995a2a58579f9ec01350994292a3641b27db669cfc368c23a8f70f1629f10f1251f9076d3e140818a9906185e81f44fd1f0482ff411aea62e2dfe7843549d9810c31057de88af076159c1d6b278163be30843bc79938d32e5d3cc115b04b35f043f5623a6cb06227385e159cbd04c6e48bbc55d9aae456c9af46025f14f2ac8be62fc92dc1527e4bb0100d9b45f70415673ace7c30e4afe1f6394a4643899c729961640f5142123a43868836255e7269026f0a267908bf9498747033f9851be7017d380fc9597487b010c9630a4adf88363527f2c37d8420a995f374ea27052381650ee1988265be136b1cb10645ba41ca928e33a25049e7dd705d48787146863ce943def3be880222d39212cf2b31b9278b619590c0138544280ee1b058136bbe58136b6a6a9aa669e89b66947a4d1764a381288b7d2a3a998b92ac6b6c84a027f1aff359d64537c95f34e1c376c11e5c29392df9bd9293f0be582a79c813795f1441a625259d5772182d9778efded14a4497042bb9756995dcd451214240a69759ace95108c37cc3cd9026b1902b74246bfc48d746302c66fb565e72ab46d25b13efb39bc8fbb6ee7a5ff758d342e6ed222cf335c14e70cc5e09151f99febee4762653da3cc014f424701cd23d64fad117bf58438f216439f131314a398d4e8029e8298d50c834d678606686f612e0cc264768136ab4c0806d47b6145cd1fdeb25e44dcb5e589735edd29da6b6ec855552f28804216a861829128f74a96b449b7b2c0593dc0406fd04feaccc1cc2314b114602cfce62ac5cfe76d662f495c3ccc5ca4b94b84844e25d482452f946e25a16035f142ae1a1bc187de52bf8238c6bc0b0070a70015c4163cb2c8031ccc015dba9765ad1ff108d50705cbcb050000aa25010d5a2e4d735c18eb563ccf90af67c84b99fc09f9bc0a08bf066abd3d3cb10b7cd6e1b9521d393685142e557e5d1f34222cff38e6f43358bf17bde276ff2a2e2a1bcf05ee2253c0f471f187f310691479c8930883f441e31489c9989d704bf84c49c9d37e7bccaab2c8645c2fb648c7f7a3462f63c92ec0597642eb027a3e4d765988470cc57057ffee394abd014af87744dbb989cbe95900448df43e00a92537a234b99a2909462f437d432c210e58cf0ba338a4909c907733064790da762c8f2068029e4fcac4f89b88016f03032fffc00a088135738a297f8c2117d48832828d64d298adc734e095be48ca4d7ebeb75ddc2b647f3c26f7a2dbda0f51a7f61eb73be5614093fd4c89bc462470ceb515b59c3842b3adb203b36132e147dfd42fd741fcdd23e368e3962094715ae58fbaab2d68eacb5a9cd4341a7cc2460449b69f4587434e1c05a90a52e555deafa6e8ab12cf4efacb56bb5554584cbf99ddb27fbe773da3d23c9483e399c32077f304856d2e1129c1d66502943c842e27d9947af51ed5f0ea716277dce077f945e9607f3f17cd0e1ba0d2b57e4e5dd2236f93ecc9ae7f29b24752e2f0f218aafcfb1723b5d7adff53c1faecbcbcb000c6283b97d26c7c69d8fbf1a94a40b607afdf9f6201440add77708572a842b5f0536eb36e4e76df4ed6f010af05d207f9000f516432880ea1e8402a89fc162384365f105ecadf743f5394251e23d92b7b1f50a3c6c782957e6b43db850d45563f6b4851e764b0f066c66838979bea55d602cfa0f0a01d27c4231e8124fbf5515d699c5681a2a1684d1d769812bf49f652786b905bb446cf204802ef3f424e8d2a79f55f612adea4557301f4cd12ca0b828345dc45a5d6cab0a570b5bec7a35dff5b2dd17d75a5531aabdb6ca1649858e1d3b768c74f41247f42c3a0eb1cdc3206e18e5d992a78a3c218d8d296ab8419262d705f9bbcea317b3bf7126f2c88eab2893f1a8de57613df4b0841e7a58420f4be8a1871d76c048b0030f3cf0c0030f3cf0c0030f3cf0c0c30e3bec9023478e1c3972e4c89123478e1c3becb0c30e3b943afbeeec72fe41203457d5a094526a14c30ccb98bfc230acbf617943e290397a5445100298a23ae7ee98c1ee8e194c870ae2fb2c1aeb1cbb7de775e5263dc74cde2693c9c4f91ca55e233f1993c5a868d983c70e1d316dba27ce74f2984e98e9c4319de009be2926e6c68f989898989818d3e9b4e3c4e3d4e3542f87e3228661f760a3d46bba209006a2f2bd8abe3137e6c6dc981b73efbdf7621eec76eef57038dc7997c5f0fc72b8f8792814e260f9f9ab82597cddbb2ccb9e636dbf2a58e3eb17ee736ccfe4aa55a0e3da8ebd75c8e0ad8a3326f7ea643af5f091655996657dd57abb6c01b0448d9b520b0153341272c51992abdfac85e4ea8dfd4d73d34dbf091bc129c6743ac5dc8831993e608a0171a02ccbb2cd6432994c1bc8946559b66d2693c964328150ae298bd9325366ca4c5bcc47765e92c5f0bc3d1a22ac71cb982b6fc01cbfa67befebadb06630aead7d8209c46caf8da7d309aa2e0109283365a6cc94993e3a4c3137374384c820b21889bac176a349b1b4fd933988913f667ac8f028ed28e928e5287db01a213d7c08a9393596d9ffffd5b2d65a6b2fcb5a6badb5f7d6a264302c3badbd3cf7ca5e6ecac55d92644ccc631ef398c7bc648ad1a146e9c4a45423e6c4643a9d648e5c5d56f6727971939783d5e01c2b959810632ac5c494e032994ca6ebe278ea759d4ea7d369a2c0e0561dc503b2991d356276cc947aa0c0340c2f2e95b0ca01c8523d6a00a6a8feee5bc932995aa64d9cd71a4d3218b6de5aaddb1c0e873359b00cd34b7c5dc392c6744f6fadb53131313112878c91a15d14d02ed7897669bd44de0b3a48ca8be5bd87d1f23dbd1e3feabe7576bbaeebd8258390a1472d1f75dfbaecf27a4906e3929b9418a594524a29a594524a29c59d7f2411dba7c593c4d725299e467f579d7e79639243d87f520b466e3e5cf6a2dafe642feafb1f485abb6d5d37b2f1743ac5d306b598522cc918ad5dacc5581638bf58f6c2f138b6479d7d3e9fcfe76332994c2653e75f9b7a5ccf4e2726c4984e31312530994c26d3e565a00df46dbbdb41076d9ed227ab214890204182c8cc05f7925f9971b20bc210b2dc02dc883de0625e455d80fe79cd5c7c348d83bd73b12c8687e37d57f3505e7c0e3ae8e3c9e0bc1a6e076f426cde034a9905b205d10979f51a8204091224009826db44c366ec97a4d6d1407ea07aa8e0b1e3d8bd8f727684250a600123c104e41190fb52a6a4a424204fcec6e1a85004e46e04e42ea2001ba455b476fc80caf0db0f3e327c08c24f08a3fb9be1caf19e1c4f72ec15314216495a910690f2f375040199c1b06a780004a66559f39ad6e5a1e891e5c11e35a0a228e66c989aa9be94d6abea4dd86ea5dcaafa6feb645b355675f7dbf25034a047b2cab0c7215a0b575c9fb730191b76893fccb35e59b7d6ab340737c608e7fb744e5ae78cc1116e32ccb094b51b4f7f2f8b626ceb11ac6f6c1fa78cbe842b66cc1ed17f62d9d3b63725fea0978315650d186184304219b33fe79cf331460e1c0092a2e501843e929061cc810a1960637026f2e811b5f910156da2a9692367382b7f7246f298a92fda64da39fd4cd9066222d23de8db3ae68315c41069620a6a92332f38c186304e4e9b7cc8d3a86968aafbd736b99d704172469e648f1e51ee933372067fb2c775394e662dae6ba6c7c57246ce707206669349a248d98ce28d58e3889122cf6890f9cb8075b8597aa23d3e24a922239bce8e467fb7590c041bb56931d5aea44d9002d827802ea04f1cd434031c30f0217b3c37b20704e264c54992cf7feef9ed30ccd407fd31ffd1538bcef399ca009250e6e945234efe81be0c63d6244928de0928fb6c9f6ccfc033a3f32a5fc94a96549fb8bab2aaeec1f7b53b872b5975f7922fb8c1b020c05022c311209bc11618e0c8293204e205a87c218c4dc334ed5e256cf3d4e344b1219d105a0242b750d3a3a862b00f6c16b3279a4a9d52a7d429754a9d46a9d77441522aeca9c53eb07df4447bb40b47ff4d1acc1e3da2d464ed101b5c918d24bd8534923453f42457e8bb2e95b276db3a8f37e9b4f778a4e5e3c7c9f2f1e33a9d7a447fd0ac8594f2f4439e4e99d2d3e9d483a66a658fd4b816465394082d72698a16c9f4d683adb5b216d6a7853feed62b9ca2453e9a12659ab23c9aea11e5fed1944d8ad25bb4446f638b6c921e992749923c7a85be87fdb101e9664e49b7dbd675ff6882207373ce7320e0386e72af321873da39b96892326edd479f25913d1387bc30b69ce911c521493465edb6753425496d822bb44d6db2c147478fe84d2c0259e83cb5e9519f20f3786e3dd656ebba6cb516b589194dcdf09094fed2a08b766a1353d09ff854320d4241903d56d3eed13c1e5b2dcb633d757218655e0fa579a278fec5dca23d8f45e68954173067bf70b33da26d6a1d8d821f40c800f503a5a696e91db54d3bbcaf56cfa9750ed75bd3d33b2a539b7a440f57702a0c4b43fdf4b0f96b4d2bf36062f6d48fbb35c11525802b3ca7dce7af87c3f39e798fe7d1643156010cf4777aeee1eeb9cc5e380ff7fa8af3541606c802139ef1a8846c99c97a16aa990100000000531500003814080604a3d1781447c2a8dd0114800c7a924a785ca149a42807421074c610628001000010000000080c6d020033f0be6cec7e8d5e593e3e6de333a017d089ff4eaf7c8abfbdf11328de37f5d5e801a197e93abe34816e7ac547f8aafc5d017ab71b1edd8d8e1b6b7593a75bd1f1b12e6e38f4686eb8552fcdc667c9de15d4b3bae1d2dde8b8b1b69b1cba051d17ebe686a747eb86617b01b297357b7920f1096348001ae61ad016230e08760965687a4aa6bb3ac42bfc7ba9a10670d993891b0e715f216fbcb74d1d3227eca63e5dc14779addc8e79a310d40d0e7c420844e97068272340b2830657c8d6ed3b5082e08b600022d093e0fb430e6164e590dfa5c4dfebd74693afcdea981009cbe083e2e6d7401e42398b65696328767478acfa7adcb63e6ea41722a5937bad2f9084e3003a66256c08efd591f1e0eccc80729d3f4bf1b7f9bd8c47851d404cc96b80ba26e56295bc4e2a3f28f5ad091bed06223607294b8a5098d9ab0c9fc051b7051318cc9a0c2cd9660ea2b98568839b08a0429e2b224a91654db3e8fdca3f961e204f668360514da3fad6e0f3d2fd88acffc679a87b5d6d369638cb06c4368338f4ca3f0ad39c671c565fc7fc527adfb310386368d0179710f62f1377ed07749767dd41f73f80084249816749dc5b43ac915796749f08f9558e46365854c639930b9a2c3ddc37e76420239447531685ca00e2767c25797d5e855bad4dfc471d2a8ba68a3d0097194b225f3738f52abac7ed47d800cfcd89e562d57c66d53b2958d6692a43d88005d71d4c1e6da775c7163807fd174e7b0b92f5fc2f5ecd3d266cc8aa5124b040e7f108563f668e91df3575e1ff2461d8050a4780c2a088a8bd8d89982e7488fe077c130cf50f12e3521df8ca674214b94ea1cc4d5cb245cb33ac2d1209e73270d241b161d444cfe3586c8c1ba07f5059015ecbe95da2d54f73a6d85027f00d6fe2952c186c2b0144884483d3e0794527827f809287d0855e25b15b0cd4bc5ba930706d7ccd11d20a67d54e6bf61550fa92f954203c123bd2ab51570cd1125713f8c0ea3926d272eb42e06ea53db262436ac0b751c62c1f050065c180310e606758f967a75be41a655f3ae128808aefbdd1d102bf95d9419d42b89efcadd3f392b554eaa1f4146cf81f3e32a82078e3537190e451c7f4a72127b8808496000285fcb260fbc97eb20d06b5f55e845cbb8da7b8fbf235b59f16b7c93d4ae8421bf9e9e71f8b6ac0f72e0bd2dcd8aa2afaa1180043340309be26d0d4850f3b21cff8b92e209f00567dc4d94a3f349b966ed60539c23e3997ee18a8273264b25c0a241732d5dcb5a20a04e66a2c5331723497aedcac7a70e1d8de1f51c9fa7ce2c931830cd52c33343109e642b0b20031087eb5f2a2e57061da2b4dbb08c24d9fe84fad651af23e68dac588c4d7159d9752b4622dbeab96d762a9104d270d060ccf58a82506a8dfd976eeae25647eb44179e1aa414067b0824203df9290a8cae0f7617b10c5ecc985dc50583631084557fab6a599a1bb4f7383841526ae3735befe2606c7341a6f8b704eb13407243b52a38fc4e1e62cc47246d0307863fe5f86ae4bb5df2f76f89a339bc6c929695ab3f0d524b299e7ff2a16ff8f4f7efc162e157caa6cc4156ab41422661aea118f4cb7590f98d0ca7605acd26632e63531c846f68ecac60ca526a208a5efab4f6ba060f9516521ca2afe1bbfd65d94cf740e65286046d3f5919a6a97cbed9499b7fe055a08799918e05053acb1872a55e36ef785f690b63e30291e24022ee1ec025a87501085968901183b30dbeb039bd1654c7264212219cd9e32a06f0e7dcc741895971e6a47344c2881064b931742d5ba2c2c317ce2404846830c2f341540d16c833960be7836d4008287834c79c54c84f4290dc860797c9243bb0d80ed143c2009aa57d08453e186e466b0a3ec13718b757a7922f762cdb580794c3599f1c5101878069b474689f953ec9efdd3cb6ebe1eb470a53a913a5cfc2b29ae9919756e28858bae29f1c89c04339042fb54717ccab52d43015f19b62092b450289b824cc28f718fad0c79de08da0f713c50563ecd76684c65c0204e39e41b35fb3b0f1ddb17207d920481adb9bd10c1ed7c83e897755bcec04aace44bea07921cbb2040f8075fd45417477474a4624a5c552cbd46045be0a5a1fe469ed6c45fa897ec82363b4621129d760367afdd6312b5888dd5db7cc2eb36c49485e2cdbb5c7f8365545a66f0d7eebef34b73a6bf8986904dae8c893dba59eee019657640032c2af6e470b5cd29f47db08fe1f9a368db2b0d86bd292609df0af6e7aaf2b799444e6b0d0c0823f9ba46d7795a18110a507c0e081a9aa4e0b5ceb3a272f9dd2f52cee2153f7836133a7ccc5d65618991a143217ea16b2df1dd4112746a66f6a5e6809d8a48f3152edce755c0fea4fb6ad5c3387c3d9abb1f4bd253f0e36b70e511c64ddeacc4a1504393861c3ccf031189afff7a6d88505100f03c54dee6be8d7496f8525567dbacf076e31fe275b446d45f8ae097aca2247c8625ce3fb41ed5b33c0250279d7a3e9ca6eb8ed3b74330082b10ba3b5c3810bb61fe638a52d980bb49a4740d503bd082f62f982691511c69b703faa3b3db8b3bf517f0b569cb6de9153904b15720305c32bbf20b5f46c18b08cdb4d2cf87104e75a964834aea32087414a306cf7099bae65466b173ab9932049dc04866a3fd78b296dbe6773a07a7ec948e57d021c38e016901a6155d091fafd0a3fc0d541025188eff750931d82dbc4721a1dc98355ad14354bcfec2357d44899658b1939c99684f9f76a1a0d9917e00b8dd22a1b74bf995015d4497c08c7e97c0ee6ba4683b8a6a4cf047e48a65056237aa2bb173f41fc521a48252a4d583a6e0f388ca7b1487fca2a54ff04b58e65840ae2bccf0502ad5795b9d4910d5a54144bb2cba500096bfa3b9fce905e5ed4214675e9f1c89ae2e289d16373f5a344873a564dbdf04f6c7b650b0bfb62c165a77449a6b4ce36bcc19c4a923bc92d5da8fc9cf004874ace3b8b4e7c700c2b575d70db2aa3fe7f309207522e116bf08b55b816cde23e0a23041d64ef4f7d68f3a2bf0945acd868a1c1b637e2b12a7785d731d01a2ae884a1393011120b2701029ebdb20780284d51328393d71364c43836a6c732be7b42d3a2dcbd616befd06a92840a8daafddff0508612d38faf1c09ed30f2e38b54230f360236e2ba9c019f599525cd53b82c50d1e1bb045d0181c02287104c431cef315d9bb3656f3e855863d1ce2db9ed1f1ef306b1881314afe83621ef532da884e5e1330e210e530a926df6e4928c27f377ce2ac71140be6b10ac1545cc932884aa581c665780df3a150df314ca07cf5d2ddaf9d6649d56a0330449222b2827ea85610beb2878da6dd7fe747d8a5164bebb8b8261db75522c61ee52f5d07fc08e36f73c2867976eee54a0ce306c4e6f04819a4f0f873fc1fee9d35df94decfebedf164f5827ddafe66af5e6cf2bbdda946a6ab32e01654e98bf55b99f2422ba067c998572d257e6522fc98c2e16b8cd17bd1584aa619fef82dc62d0ef8cdd9e4c84f090cd4e9bca6c891d2ae606e0d18d739b0863480ec22edbc7b3399fc544a4723326db855b261f2638ad5b7edf62290367768155f1b684b4c5a472b0019ef8e7ab783d9792c4341fc7604d1117d82124f77b2447ab4cb16688685c045a3118c523f995e0a1eb934600b9f6683a7bf1677e473d9e56e97b2c3682262cd3f8c915a47505c4f080c6c33ac8d12ce5393f6750a4576beab25ade2b1335481f58c06d2806eda4cac078dd054fd6595178ca4b3e9ecffd185fd6b9cc573b9dd2f5fbae34ce5a9af44fcbebd55fcdbfdad680c78caeac8a4604a213d14dc57e97a30c1b233397bc465099152bab8f26b12a62efdc4e911e4e3256c6a1f4e4bc6a98eb3993c85e2778febc5aec3d3da04452bafc81633850c99d8e0b819ec140cf90f51b8160869007a5a0791885e8694c455c4c98ee57614cb12a1aa04a2dbdc23182ab29eb139a33fabd60bdcac068785a9c9078d42ce495d06b4332e98982af9179300691cdc4413d311f240a4849a6fd52b16e486ac402a48305711c0d3d3ba8a8ec6095ab3b8c1084ae3eae948b2512988035d1a26d9e04b9c2c96267257e891abf5b9e54035acaca7b91250df5a0447ada4c57826f808b7ed8fa0cb1886da952cd1e4420ce279355db0560f712b29bc9378c82f4de1e4370d1b82f5aa5b6c3f3879ab36fe33554bc38ab22bc32a129e8720ead7f107a08a072a4d676635d862a014a5fcd1f2008828b34de8814b910050df757803f6247f010281e798328d8d30c00f5ed634abe3f24e82fe153eb6fa16bd9e2cf842d58704780bfed16018a883f10af589dcb290eb8e84f90af608c9e04a278ca43440efa0c7c73c33c6de6e2f30826e6d3adab4e49ac14fe988202fd410c6c0bceba0bf0da97a68468ac773da1af195c56aebde6ee4782cb6667dd297bb4fef19f138fc9c21dc8f826bd02133d70f908e3f98c7c3d48e2ea5a7fb7d50be27bee36549b3c33bca52a1ffa272949f95ae3cf6f5e9d5048c070a086c60690f086df5ab35211d81372676d306ad0ed4b1790bf04ae06f797207bb372bf8365775e244e67d142846f72db85bc1736584cd37747887ae7ac4864af60101dd81e3f211d56b101db365aecb9b16eaeba6eec906068dc732f2d6b979e9efe9a94a6bab9fe4b2d0b5d882c8cb882b276d226cc5a8cbd0c97d7d3d3abe70acf2b26e038db66f17643b0bd78e287b8df40521bdffbf1cf5e41067a858a39b6c3c5168da91168714c2bc94f62bd469699703711d968340ac4089807223299127115e74b8adb9e201a649469edb60fb9ee59201d2f509f84b2c04c0118083b6c577788e22229f748dec885bbf87584f78bc040561e00299f48a8c6b5e45976a9bb46bb3f6a2cdb94d329c2b5691c80455509e5814e8c13ff98ec36207f7d174271a2afec2e17675a1fc9dda0a56411cc8bc0929576e33e948b123bf9ea48afbf1eb33b595ed2fe959414a8bc1b26bb6a7b9810ddf60d97a034a95d13bdfbe0f864af5d0f04778cbbd1654ee34e4042684c562d925e56071608e33a77b7e203eb6900ea59c48b4ed88abd8e7c8b9a5afaf0dfc3ef6b1bf2a0ad7f76fe7a9418bb0b8e7d1286bc034328a245f47d0938d0f4aa025e9c9cc8406eb4e343b216d7ed7575a4271b123800ed2e67a1c08f74bac87736c0f2fe849a5c995a7fc6cc9d5220ec1a45504d80d81795a3870f083ea0daf51622b0293547265430665fd9e42c7a2ba115a7a858ffda26851f6f0050da7c8708f881575f1adaf7d08c835ef6a5b3562cb36d2680ae6a1721bd276548fe662d065858661786571801d1845b7882758cee4c6836d05eab3531891d00c9ecaf29aad0e543ee7ad34f80b0fc5e47029cd79e9788622fd9e1423735be1f011b49ff25fda355b314b455249259d3a12607db5b884ad79c15f91f5abfca66710f7556ecffa2cbcb7f70a9f792d5f9900cd66c7faf8776de8a017a275951a6bd05ae997b9605869c01afcd56d6e4e096e735ab5004b1225a1a739e610b2b3b2ca438e83fc1863e33fcca2c5e59398d17acf7d6a6f7ad8da0a0dc66f9b619c038616c28bf80b8603dfe05feff90e30293f96f3f6f6b40fef5df1dd93e25483ceb44fddddd553cd74d5f2604f0063fffdf992ad1a408c7d6febaad60f82ca650d6ff880506d0b0f178cb615fe25d6b168a39007b6953a68b52cdf45acdfb6ba0ef93e95897c643fbb3306fbdf56aa9f0a53e23123b8af56324ba2cd4407d6059ebd579ebf17c151183d57b7de57898ab81fd448776168b9e485528fa7319659a2e3e2f57ec507ae8605a1c85ac0d994f54d6e820856f5ded0c56fcf04b922ee4fdcb88aaaf364e574a278460b225327805f94ba17903698938846a5315be3b49359a004c0b151592d1cae564cc597e2e82e21a12a05da0def32cfaa624fe104759eae514f9e75a00ff5aad4ed1128eff6401013b119d72bfa700690575e5a327ad149b3b442ace4d30680e7b1fc2b29d3228a0146866bfe46d77677d2bbfca65748ae07b0e87fc382ef7f5b82130d1177e3a1cde1448a92d4103c3508347779fb2db36b9a4a16567327b6d8ac3fbafb166803b5926b0f040b71d2054965782254453c078480c0ad050f8e84e131b361c88ae5684b0c3a508cf097b05285641e57240b2ed0527be5eaf501935602e14aa60724d840e45b974549b7945ad8c1f017a8a2e160aa4651c41dc98ae13f1255cc52397ed4f606ac5fb5f4fdd8cec8b4900cbc092973a8e789154cdbbd9a01239ac8791ef6fcf8ed4ec44a94c686e6347911389db3417610bc1a00390ca30595b5adcce1a7d429a4a7a4164b1094d29c5a194266e3ef577887ea4a4193b100238128abd3e5d85276c24af466b52d954346d7e130013f4786bfe652d00bc0f75b53017892dd7f64a160d03ef28d8d58fe10f76f83b70fc4018e1fc5e84f3bbfd57fa803c04b334582f9ffcdd424a63885acb839086f64267d793e5746b0ea4fc538d11eff0daf8eb67db716c9c243d31b805555ee3ae3701b7e562726dc2b8f53bd8ae71d727e4e3a12f4b1ae0e85d66c172ec7d288ddc6444a02a1912c7f8f48f55958977f77fd2705edbf8a11c68f19d7f2a44bb94041a837092c30c9271b3f84f38dea81b5af45a32f0899bf1e0bd8b57121aad3cb656cd6f4ff8b65c82a35333e03fe77b1ca722d84db082eb845c327094700b2c4b4ddc6d7bc3d8eabc0918ba4c2762b9e108ae24363b76b55d02526472e683e5993a895ee637479df601ebb4c5f0bcf6ce2bbeedb81803123f9005958ab67f3b3ecb5d38202dbc4851eb92a5cdff4b4f1ed314962d4fd74d953b14ab0d3b22d7a153a005d1e9bc7729c90e251012020bdfc33536230c18e7a3eaeb727b61c562a466180551b2bad6be3eb5e29e06f3d66b9eacc2e28ab8d535319456d0ffe4ce5e82e8718d7496900d88826ad4f4c7b879ac5a0445f4917cb97fc396ca6aef355bf834945945af9d9b83cee0182672b467678213537d820fae768f0f24976f2235b100f1b52dc6ab73d60f665aac7c924395f4b177066ad4dc907a92a327ca1ee3a77bef86e68b88eb662b4617e0cc024a5435cbe689dec5204d1bfd030566f7ff903aa50cd4c649004c0b4820d964d594994d79f693f297362be7ab712c1e72576d2103d0440e808eb3e1fec8e62a427d5fb91216992447df6b6e29d230b57f897b5e86c24fb7a86f059a1a1a964d043446246f55585788e12b9ce90e94eff00a9333e52f4e83a2e7fc0aafe8dba203125bd456e48b796a4f9ab40f5679ae3884a512d1f94945a2e6a40151230abb2342d62cdc90b019c89b425a5d7c31218498e7cc97c46259e01635e5d04f7bdd248492b59bca7256bc9c0e2118e5f9ab521d636d569042097eef06b001d21117b3615313338f6ece3ec4b98f5f25d77fc9eff9dd12e078dee53d201708d092f1e5fb32e24f45856cc7a93475e3e54ad5c053a01fd326a3c18972dd7133537349105bb24652355b378e851a13a25d98b9a0251e377d6be5622569a3cb0fae855175d28951c72d5928cd1aa56dd80e9e83dc7500b6c424d2674522696881267f7253a3341408acb6515a1146bb30f4c86f16552464af0416b7f029515af4318877a0c081a5db43f5d5b408bae263d36857ca5ef1b6ef8a81847bd52ede651a232c19f630f39074d88897e4146698126e054144507a05286ce569b476dbca8d9fa9b62cb55301acdf46a31422f6fee3f77f0360063e84a8ce1549ae17024f419308977234444404380934d6edd7df6dc7ab25f7988a91d88de4c9d787f0f73a149dcf9422dde6823e2548d9ece5ac591eab29f5876299eb382cb3b0c4fbb3093246ab3bcb78c381a55c09d64fccbd37b7ef157c8a5ed44fc4e1de1c7511e84869ffc92b322838844757c7058bedb401b957bfeac8cc8c3d61e4daaaf8ad5b2f6257bec42bcb17340808600732c2972949642b407a926ece431d3c0ac3a916f534a54e03805d3420eb90e4dd242bec3408a84460215cd27249c76e4214203d1accec66762ba5e01d34f9d18c5fa0c6848b4fcb4112ba1fee436d53777376046fed9696fd8c6a513faecb49f1611dd1810d390e293df6dc7f3c6780818f9b9716e9ed1d9f50dcb5143cf41d327942a549fc4125680ce341062124b643d65fefeaf6b634fa9cc88d650cfac4c51d90e436799a1dbe48e78e3f1a0ce23d5450d2918e86919991649ca198e047347fa7e8aa3e2cfb611731450633fcd50b3acce0c242560c8c3cf16aec704f3f51486e54522a0ea05bc6583c1939f701c4bf7a4682a941210dc45d4efd3ca7c16dcd1fcb813d2f7e6b822a01a32d717b49ddf1f7d48c8bae865b51f7c5182cf907f8a8609edac45160d6f470664aa6729eeba0705ba60c3c41afdae4f43f3724f4370cfa96404830a22510208ce86981b529eb8ea34c4c6cbe37a8037aa3ea41ebebc0d90fcd71a10e08799ac01e2f827a28fddc140b4f19bb89d9c1862f32bd5481966e6c7a1df482b323164a49ad852f4a8a6b75436aba928d9f7542b0e8caa949f4ed5494b551589a6ae4ae4515975d2525b45a2a9ae3ad97ffc2afdd28fc87c765868cc8d858151f76a533b6b262d28b8d344d45b5d548d97f5f4329ac0b26e68def560b471f4b52187e433174a3802866f686cc8bb7ccbdca7ce329905968815c0850f007fc15a1b9fa78a5ee696023f128b637b6a278738cdab79de66fde0c3c0a6259fa5a2ae173c9dc9a4a89b3b656e22e600337d698ee372ed1296495883b3ab0f38d41585aea59301fd5433010346cfdcd69f6cf28d380b6b34db1d3df3e22be303742f100353d56f7cebd4771766e8b30c04f75655f739890310fc116e938b47f5871d326587600762c5f169f7c0c2c82184afd3bf43ed3ba22caca3af654cd31be1f11741a77232ca51e89ecd9fa0708ba084c01d091856977eb8c70104c56ae522fd082420b2ac0d16aa402034a68458b968abf8f60dfe2adfd5da791c1de7bd9f6665b53fbd1f8ce25c8a915b9c1c66bd8fd90ff52ad4402638a73dbd51b72006c295e3ded84d365bf7599be55b382fcb7c6f30fa4547de3bead78dc07020782866e6464e20e9a85b7c2f907cbc642a4ab431f69923bcea1d060eacc8a9c8089df8009186d5de07351c3eebe85813d0e04500ba1cf8b75f50beb858f4be567dce60072247996162fc4febe3083edc226b28c49bbbe53ecaa80260e83d5b3daecaf9679770d12992c0d3965db1aa9b2a5fa100c1d122fbd1be570d51824ae80c9be8ec0e1c967d1b84fdbefe2e2e213bfbc239fdda31c69ca597839c6a749660e584abee80762b91427dfe6d352a17deba37d16c882161b3fff27c6d3ede2cbb8fd7bea77b7d3bd7091988b7d2aa306ea51de0e59707230dfc9014d8df9d801361c0f875d1e82653a3ccb758679a7e4b8459775b100398262a329dadbb2333d89cfdfafd1ce51c7cf82ce2a3e402434fc41cf2430dc74ce4a3aa21c2d570a04283e897325c6aad6d5ce43aa7ea3700139ec22eaaf396eee37d3a0badf1ed18a020a018f9932dc6b787c3c9d247e6f81ee768ff4c98ecc9053e8224b1179f166871c404dc89702756f9836bf35251dbc7480264241517f41b744cef0fc7be9bf7c11ce782579ff344c4b148080118bfab156055d83e427b460d70bd2987c4b8d29e8efd8559494a6e02e0a0f30808fb0d8d9008ee406d656e6e9edcea5e67fb5fca831e0e0ff52cad946e842aa4a8fe7d1df8ab567eb5f73fe04ed7d7064ffa024b356123352ee96f481cf7b1069ff66e3b1c338f1c5c05b713852daeb2188d30e392375bd830321f186fc3b8b3cb28564751cdc3f0f7749cad65fc800faa8bf6198006e931a47c7aa7d007fd79f8ce21271fabb2651c2beea307373194ee25d4a4b21eec5eb993cb38308b667d7c12c4a7f9655ef4f4374bf4dba35f9e983a605e31cb42dc8e954d4e910d37c89337284302655cc2774e3d713f8d1b11cc6ba38498fa7c7865f1a965c35e16a45572876c3fe4936532f805828e3e248703ae10b6fc7986d14e4ad668f642a3d8602ae6e2a800788e3252b71ba38ea4a7f6856e10e956dfa385885c06eb77bfc7e58783bfaf9ea3abb3529189698d905b0e19bff64579943e4a942eff54ffbfb7163910bd90d10fdde124ab5d034a280599d3c9c38f523ede4c59e5da40efdc7c4c8f6e860396fc089435ca8d8d2b9d56e4e30c8173b90fd23f4a6c7a8f1ec3b7564192345c2adacdb4d9cc2f4705dc52cdf76aa073b41c25e876a66a2c2fb7db44cdb7f32ba81ae9056695aad551b07ec6fca3cec074d37f6dd6c67a8a74afb3b31dc8fe373a2f6b4fff97c5e840d73fd1a3c13ad44d28b5242077683c32e532c392851a86cb216f5710ecc3cb6df11731e6cfe1e26e40c33a1f1ed953353ddfc299f760fc8e9dd91e6ca781f382271989c4bf818d610a23b0e6aad42197ec6fea9e0a9dde6044c228cff885d3e25a0d6388ee7a67a3fd361334c240a2817f63ca7a57d039c194b8639ff10b726dee24466100f883b9231434cb63d0e0e5f16bd65fdbe92d7d5a4ba06dae49e84f779096059a8b1dd804dbe66961109a41886d9d0456bcc2cb8ec466b066288e26576ea95751389480d2ff58709dd940e401684d44e00d702c03f07869f47d684727803fb07e007bcd0f1468a3017940f1ca0c15d58fc194a1280c1f635933f67bc12b3156e5a917bcd902804d95f094a4bf2271483f3a3d61861b30f57c8ff8b9016ab9b8955244102e0cfe25d965fb938c15c113fc268a5e03d8f2d5428b2a77b96b3b8507813a25ec06803826f5f57b4b2185bb2a47fbfb418f5565b273ef6bfeb86a91cd98cc908e5d30966fab18a3146c0589477d957f42a80a5aab531ced7807362f53b8ffab79e6e7344b88c3bee6d1355233804fb55fe84ce7a1354b133b079bc44741a23fbe5a0bcc6cf7d2680cf84f7cf298cf1c86b705ffb1c5745374e61cad0c291a0c39956f20d8a06587385c9fcd754e9f6082d290a2f3f917dcb0df53bd79811980f06d729d807217ca7b8c3fc4f4e92ced99568630b8402d1c30fe8b59e0a856d476fd14eb5bcc531f9e5dfa8c1f25840c8ef387e953e096c033705e2bac6dafd17284537bcc67966e1437811d78e3ef4343a11ae576d87d5f104445dee6edeade8ab56b282cf0a1b83bb213ba06c379ebf50b8e6aa7eec556e2744ce680cb9ce705f3b16bb70e23bdca274371bc19fa65097d99dbaccf7467844b26b4291f1c589f330fee388446cd0f90c113873a08b185b4b230da97ab39788a4fa50e1839bfeaaeafd58d1d9732364b170196128dc114111247438450715a7627f27e72fbd3105348a76772ed7e906ce4bd101655eb3f272c83b8395782a88fc582e0a3141b03a78e7bf208beb79e4700f1fe2dfd2b7ac4b0d33b95d25a006ce7981e50a850625b762886cdf68842eceb1338dcfdd617d9706abe7555f3d88cccb46a72bc32a7bd4f3c310a81fa5c2c0a2d47a9ecd78073a46ef4fbca1068e27f08085bb59b427a8ca48c56c1f2f4eaecd2bc9f3a07100404e14e3824cd8292f9c93353d515ed728e3d4eff24bf454bd7a10669d93db1963a4f089c1fb59f3ff890480c6dc9a7b910526d01e410268a7ca8a61822c63a18d5d6bcffdf793b0e2206f26771565a993a3d4242883675e17390de857868e74162db0b7f1543e76f4c60fe061668368ee0d67fb8f0bd091f9bf0e91718cb7d40e3046060f778263cf061d5ba43cfd467d7ba18c0c67805614316b9b1db186712f3c2632fdc480e4d2aabf7a252ca34425c8c0902e2ff6d57abe4193a06493b69a735841b9fe05643c8c0263e3ba4112d11309396434872d289c860a069f9459a5765e193dc130eaf78108ff922cb9d2967720680caa4e5b1d5cf8ceb87d0d34f49460c33a06b80df159049ba903a13ecfe10a785c85cc935fedb5d0beea858a5c458bf7d7007c75a681e746e127dad0b976fcb46c3b2e7864a2a0e2b8d01230231633c3b59a447934cfbf0243b95d216e877ac97bc27bb6db8e3b8f61d1bf962d9c278d20d7e1bebe79a1c142e55f770c1178f3623a7a38bac9a679c62b5d305a04f688e9d87723a555349d98a053b37f7043a553c3eade9f7575d03a3e385f8755de143693f60db6c877d220c8d2205c9720b76ec88ce0459d5afa88be62e6bffaf4a0d1c2f00c197bd3dd2b97b8ab89ac145ec83455f0acf2d39809796e653da72814c51d10bf573a56b926142d5b7adbda9ca8c1345ea298398b9347f98910060450915df74b4349e2c22ecb144b18cf063f3ccff585ecfeebbbc6f60f973d5133458436a68afe2b69fd3e1c1abd71d4d997e9a124dba122be1bbbd38bf8324393d7070cee198f81bdd7653cd739b081ea436c30e92ccdf2b15776290357f1d245ca7c2be1e79b424296fa2661b5f83fc03c41fcad867ec49e10e0804941abc68586db9de05ee2fb4eef34be960548cf156e99a37ac920bbe553bda137d25ca1a9c2826c903851f115fd25c424123f1aff03fa494f949513072516e053a6005d8968aa382252c4667940b040257f3975fe714d3aa48042766f61ec13136a3340cccd68e805ca1beb8e40afd96c392f7e4b6722f6f88f048aaed2ccfca82f6b4fe0635a92c8676a5a15cb84490cbfb3305eab5db4c20d8c18515b08ce3ac34cc44de70a7e7f1a8c16153e6b225b8aeaf162a3bc57875a7e03a030e88bc8f8a24cf0028adb7e23131af694e91767d207ed6fb475e8944c69035955ede094f7eb0e3a387b10026c645b72fbb2da3bcadb9ac95f7a68ffc6b28544186d20dec6764407421fa11d75ed43e1ab1e26adfe47af946c1a1041cb8e67513e56fb01957da65b6cd300bd21a5658f9a4cb68412e48daeca9ba5c0bfcd5015c585526341e3df1701cf2b064267924c9ce624c4d95a89862b650a73c31c5ad6f7c7639bdf94fd459a21e90206f500cfc938d1fec6a25d644973223e2178bf4c9fbc5e91b7910ad659e3648c5fc964f5eaeb3c484a9d91c85b11e285529de0faf222af02ba8975f9f1cac0a6ef76c122b0c2c8cc1149a6e3ba734831eb318d47823c08673bf3b8a0474bcaf2bafcb01f1446d103d0df818665e2bd4f207da68467f011146a4d52f1f2c7df9cf3396b7fc9e1262d4babc07202de5acd297ebfaaef74da97914a3c932e2664494afb4eaac33e577d50adac2866adb0584793203b32c35be1419dfa6080d23e2c8869543b702a23c044ce4c12df156d8d688a1dba2c66b709ca18b54af11418045469d83f42da8b7d4d62a630000755ae695008746d7ffacd5069bd0cf83dc7e641a3f24f786abdcbd99dc70a4fcbf7ab38803290f2e55a241b1613775d92c5923f86e6586a2bf776c5be2321483995c1244191b11cce885b6c0dfca60d26ec1d306b3f07164ebdb11a94b110e3794307a53f9b33db115a5a502ac9dc0092b298487a4338167474f39a16338b92683cd5eafc559260273750a6b21a79f56d57ae109e956c2cf2e3729632ba71bc2cf894c6aabd729f084cd78d566ada79298b31ad23fe440577b59ba6880660574a9d990281de97a11ede0ae09024757529b22eaf873e05c444d68cb45447acbb9467507e6cf70322d7991dbbc84ea9e4b1e43bdb9d3cc4773d409e20c7f15bcbfd9f28087727bce4260f08a022f9684d73a728a5d3e771aa93a402e0fe0f4689d529eb889d1c1b687cdb745576639e5d22f6527c69d2f0549cf137b56306d7c0aa3947ec8a5aa0f332d25761a3d44a56916beeb49c7ad89b0b47e71721aed6ac89ca26bb8dd4b2f43b940e3aa7bb8ef158614216afe855b12bcfadee25146f03ca6785d7071bd191ffef7a7b8ffb41252968f900be3cd78601cf48d4c24a22352f287e733aa82074ed8852cd2e9a83883c4b31577dcbe354fa6321160e12a443aab05730f7d9e7e6820f20985fbea98c05150d61d12a46164ab9a18299db69b84771fbde0aff68bcca7c0234dbb6a4ca4c5134741362eee0115d2883161ed8ff2d9a0a7c1c16c74b3eaf6f027976d742331922f373bc6f81671ca7be58ccc8d311664de0d9b47e511a02af9b1101a0ef7582c0bc8b823f6de626afe63ac94aa49797df92cb921c50b0b9261aa4cc9111e86f1131fe71f53aec84145422298153e8da3bcfab02cb9a2f5980705e2856de0ddf78afa7ed2dc7bef7dbbdcb5bae8b04f15a6d19094d341f20f651041301790f913c30d8a063ab9d30902dc7b9e516c6e40f9123c7e3da4359214f82033b5a337b991ace889a2b1e4ca67899d0f855f878240db93bbf48845b97899185c8ba67ac6dd3edc3d312285e6fa9c349b8733b204ff14558408abe3f23ed0c7791e4521f3ffc0944c048b1216058c183a1d35692769366928540f0cc505ec022e8a7d4cb1dac7aeb95e9fa049d32c6531426b2ae36f42b461f91b55901942177a02b8c3627db32024d4819214feb7b39687354b0e0b6043082ef46655f99fe92e9e4429c2db862748da2b3acdf97f95e024eb921b125054a0290d2a004ed074cb1c70b8f8a87a4fd822586f860edb01021287782a2a8f5b80d43079eac041d55a0cd20a674be0c894558a0ecaee08bc6faa69ee30f1b6a3abbb80760538e5911b77ac808d7e5685de897c07ce9723a44e9be789242d68b7e8d5dff75b57fabf72299a8c3e679dd63ada6afd0e2ef5c7f7d266db488dc7622f0404db50e80360ea13b39f85a266c331b70041773f9d14dd2c58339822e5d00b831f3c8453f5652f92dcd09bede777e643459608ea5accf681b07e21064a92db9c44e37fb1780884b4b772dd01e43900bcb810501c6dd8e07e6cb6f0cf0474795b645a256fdac1e0fad066de1a11f9f0b052a151c0834dbe526692595b2f4c5670ba4e9b5d055a94e0958da7349d063a26c2cc6090571fdeabe754c90fa9eb6376f97bfdcfe3953a2d4cad04d203f09ab5df465c48e7185d5d3734da0a79788b157488904d0382ed8c17b95ec837ee8a335dfe3d5d137185023d9d9c04e6821e726b2abc09307b2ecdd9e03beeece7a1d9fd82aa52d5475b2daa29dd72831ee9a77ab2cdfb19f207fc82b0d52f6fb4058cc7d1c57d95c4f44406123f502ab8f359511d4abdc6ba510e571ddc7caf3dffbd9fc7219223232dcc1eec238db4b0113c76e7c2a2d78186afacec6b50dbcbca60fa3dc894bdd89ba29ec7ab99b681d39502523c11cdd77a73f29a917a10260ec5cf1e02aa12036c9e05e4bb75f16c78bd30bc7fddc370ca684dd9e7d6ccd9cfd39d524311a89cbe500309eff2669b69342087fa142c18f809e232c979ce5f09ca469d6a4c9c5e45882c4e348d65bfba1a3185c42ebdaca9dab7efeeb4001d0aca7d3de20eefe0f2ba660a83ff6d5bfe798505b7d1fa0a0be82207249fa81dfa53e7d46b8b08168b029fd6fa84640059aebb4b561d9e450ec972bad59f0323e6359af5e8283e4be69e4648e7ed2db5c6538a9b451b0498a5b14879b1c4c0ed7f76a05926f34781f2274ed503cdd6e4bb4a27445c6b0ef441122e9a69587ccc3d7584fb513ba3c170d1fad1cc33f5803e225cd6afec23c049cda33e229c6b3eec23c4b9c6831e229c6b3df622c4b9e69e47c01eee4a597c96b2fa63b2cbc60d0a340391a9e7563ee866bb8ca76ab5c0ab1ecd2ca939c5003aa05842a8b5e4c38bf0b80934339bf4787de0001233256d212948d5a9924ed2cc1ce72472d9c2c12c17883f535069075ad1ca2018dd65281fc8f853a8448758c1c22c8ed2679823cc3c53a2040758cd72288ff2c89c13c83952a03407adc87a181cfd649807c0e1774a3a90d5166714789e2dc56b668f525ba9cbc7f216cd768f92565bf71d5637ec94cd93cda65cfa0a8c5d41699e4a505436b201493ef0715f7dffca6d06b9e4dfa93373f2cc503fa36ad0f61bb6fcbaf79194e1d4ee6056b33297145eaade9bd3a1bfa1b3108011baca66e2ffc3963df427278bfb2b8bc7b3d7c1658542ee90ecddbb142b1b12c30ec2b2df3b4d87d074a645269553292c16b22dea391891993908f3b18c05b1d277036e859a6f1ab9799ef02850b92189ec8ee44a4e0976969d22b28af476448a08d369ad211508df59c6a9fd85f4e6c881c16a8b42e8612d586826f0c6e18a084d9d42f452563a751edddeee95004416917db1cf07734f58ef65f89f21e5a4b22db39b0aa173055d6a7f2a06f2ffb840da0fc3e8b0b3c5ea532432e6fec469d0a406cb63ceda7103a05ee13fd11e3af9629998b33b4e9c4666e8e24ffdc9189c8d98d8c144595dca9cde71920f840c4107e54fa6787688d10ee2ccc05716199ee8b334d6b71718819e6abffc1fe00a18e578c65997484ec20dcf94ade2e68c2f6d2fc16f467109e4195341232d22ba572f40945c9658054f2fd66c1916719ea0b5400b70517e517f5a5c8fd1a567552e33ea1d71c1173037e2cb83783ab6257652cf3d93df2e418e796317e58714bf030f9156e0c54ac440026776f62c0d40e7afbe498859d7c06485a51f2ef8f8549c8bffa839804a1ebfea3fe1e62090c352fd033e8eeee901d7ca5f007ea6be821f1320140dee7082655693ce901c9d5550c7c2f83498738d17688acff3d8b81fd13719fa996f729a0fcba9508e20669264305cba0bd2d1c22507497ad525568d3a63bca0b4f474a4a846286321c0450911498663903ab1f8de1a7630ee3ba9416de88267ebdcd64861a902ebf37aa3adcd0b5a274ad36fa8bfc42aff1b75e10a8d981a9624aa647ef3c7a048dfc8d528934edb524cc0da3294b62b4c8a0bcc7349f21d62a52eafb752b08a9fbd6e4b799bab5f92b32f4bc952ccdc6eb6550d97296cb56fd4f992b53e8f733422647c064238fa28d83574d1c818bd659f188a8ca022b086f40ccecb645b5800ac1dbd5c8996f4afd56bfc9312d4ad6334414f84097094a06839156317003df33e4da28f33a938389c12a948969a23aed8572f1efec02805973234c2eaa8c9cea4349eaacf1316caa76a748924a7ad67653aa844564c8a27838f3258b199f7ec66ab0a372d0969af59d35d3895cc3b0e7edcfbffe00dd4b9c6341f871acbd504d705a89bd2a002ca012a3457bd7a7b857745f7078e5b8c8dbc954f0c2304c41c489b1bf657e8bb376d107193c3d493596433b5862230279d06918b1bc0b037f47c0e9ad351702aa08256afaebac18cfbd350e837c466f493437238907cad05aace5d6c4f0b2c2b677c82e9f80e58a11606980ebbdd101d28dce11227b788c709dbb941f09fb8da9484b32d28f55ad738b1b54c07341cc8b8a1000e007d30c93b9c6db0df5ca4bdf4b44897c275d3c96abaebf8ae45c97f01af2914ef441afd2b5a0f80891553ec3ddcd02e72ce6cc78952eb1268713ca6b098749273c44981dae083352e4181170cf08174552b7c433159d5b6a7cebb51cc8523fddd194d5b1e334f8c6c115271a6709f7f6eb523999e6bb853348c22649ebc754c0376399186ccf0dce03e94fb55c929ca73d0f7ba4f1760f18551df08ab28b965f2eb9c0ad7bd292273d328f39c48c50d1f8f8c957817c58d2deb36077fde524b3481b31435f42c55316b89b4e74adcc99cf853eed20d972af35073b7175e5927de06f20595424367e7d1d53c9937dd7bc4e48583cf6fb9be003efe376b7b4465e6b2ef232a1c687eb8b1bc7b92c744ee6198d9477139db5e2dda0db80569bc7b31eb0d0da654f6bee7af34ba88581387fc57f5a541660705ecffa5ba1ec5d444f47ca8ea1cffe769409301491f9a3a025dc688233f28aea45e03e3c6958acef4e5190cc0a335ac4770f359c08d89aa2193bf3c04bae68eb2869a7e20b1b56ca4bb0616cd2c46479a5e2d4738298a325e5181e63f7612148229f4f97ab391ace5f90a5af6eb9bb61c0416b4676740ca119df39896599dd0d1d585f7883e5485f6817b2375773943694dc66a1c4349de93062bc82cabf5f99b9af566caaa8599af0c35fcb5257a94880f37161f8c8c26fda36d62940f01cb12402df59c2501cd26b0c1c8a8b42d96b476d408485475734dc880618a25ad7434c0344bdaf601d7d753a67e9425a50018e590b99e847151a53884040e9420e04c4380b0701cb03783709140e27bd06eb0f4726362e16a15a503ec23d0f007957523c8b8276d208ce684cf8e0c21f9e6de88b2feb346ebadbd637e9c48636fb5c092780cd58da3225ea22b2198061516d39bb5986a8ddf01a5277314f2ea291770d8a0cb9c90c8e24ccdb04794360853e1ba27649a625c73e6eff8b5b7516013390a5ca109237023e748c09b90997edd2d32329ae6d06cd3da161aa999dac4fd2ccf064566cce81b8168a9c17a44b557a8e5dc493f7a0d2721ace46c87060cf02b3169103e16b5d92a61d37e5ddf80982863ade32f475bdac1ebfc0148a814b4b4cba6281bac5a29847d80574469e833b5709761c4e495b4794bb9f7e8437b2549a49c85842e20624e59000b9432f3a75251282ea73596c2df2c08a9198a45153465de1951f4d1683e9bbec5d4995fe752b17422a1faab4919c45ea03c1cca03df09293568fa4d8bde842621d0eaac4c7548e1956afd6371903cc92e91a91569b21eb2ef17c258a32496234f069be447c0c83af662d5dcdbc6fe42e8cd8bfeb9a9460be4a73a50eb772d12b05ffad6c3a2b4218b671e76dc8b3db40bc0bd4b64821fb4a149da9e401253bdd37ea747f4a4d1bc58d8d0caeade44e9a7386b58aaeba58bae28bf57119f7febd5ddb74eee7fc76540c39bcee7aea6d854b0258daf8fb54058c2a04c8f06cb013f42f5b3fcee6ab62c553c72c8118d4bcd3eaf6d2e24091ea4bf16b4c534ff94eff2563250ca4cfa80ab54044b84307e1a8018d3523e4a47a69d1229bae30b572164e473943c10f12097d74f59fd55af6f3af180e9c4761ebde5f0a9e0523a91e3b1af69e207695c5f2ec42793d37cc97a533cc2df64af60593dbf46d24add9c2802c549289f5a97a44f2a5013749ad43f38b32606dc26ef1877e42d92ba972d7e0a11c6e7c4e3f034f4f1313df1c9f70776a30a49f758c9dbcf56ea4afb1fd17de417dab4313d6588c52ea75ab610f16ceb86418d67c81bc97bada18d3f646bd5281cb9b0e465ab84643e69ab095c946ca59b7c674a207faafe47f1e95369be9a61139b292e50931131c5587c3e72b5d32f32f1a13977885a9bbaa6f934c9a3ee35a786ae5e276b8d7bbf64c3263f807b05c6afb77bca8d96a483409d549fe92fbb4326921920fe32ec05ab376985b16019c771703d349862848ca7d2e57eefdde8c26fb21094adbf52ea115ea1abbc77cad08dd7236fdfddb9a57dee314e6acc459ffe56c387ecce4bb18171276a6ff5f1a891b2de7fb00dcb8013bab2dbc7e02bb7ca0c260570629d68e06aad9505a2926da9d882922d3846587d2da52b4392b8acf6f2ef2c64ed8d7d270eb82e8e7c13a3c300d5a2aba8f3b9b99c47861787377d5e3fe5cad3107e92796e1229a71af3f9b3876de9c9c705b13c3abbedfd514d620e4cb0b81c0218043700c2a745296d408510ea5ac0cd9bdf2d5da1f445111d938d6134cb13d11c43f326338cf91ca105eae67ab35d4716656e4f2afbe65608a148c2e650fbd40f9ddccc6926913d27fc1d8fd28a28c90f34608843b87a08468744e781ca3f34076051a3cd9abbb124f676229407e00ff3b373f2af8412757345ea8fe49e0f3d87e7701aee521d14b10048274ca74448b7f8038f2eeee90acfe2d52ba2b651d98ffcec9595a0f87453239b3bd36690885538f1d30e335663cfd79572ee9b9514371dc7cbd0dc1db0d98aec59efe7d3732e22395c143ef60ca74574f3d3bbaceb8914067a396e3323f3996b0ee3d89e5a2b5c05155f01f9ba0450ec83f308eff7647ef06c7382e149a595240d2555508f2da00ef19ea56ca2d332455b66da2c1a11b8b6e0ec15d785b78ebee75faf12f04a537a5e88e3214dc22bbc70ae9abc3854ec3027ad6a9c39c4e030458c5a48cc6ffb9d07ea6219c98ddc85ca57232450cff7c10231416b26a5e8c738195f6df2662256329855632b0a4802b50daf248809ef410332cc8de304ad30a113c6b110e30e34b3c6beaa6533bd5d8823f4ee023dd04d76e5480d9a5a8b421d66c95447dc8018a6bca55fb30e1165166dd12223be2feb263fc707bc3d1ad713a02f2f668bc600574e72b4344bacb323e58390e9a4fe0bac95525f14026be1ee566f9dca9fb28e13b397fac030f716512be2808cc320ab6abb3c849f4cfaca91276faf8c402328ce9d310d50d835ad1a14acbe05f709afa71eae54c289d98b8ef1e39c66181a81b41311464847d795138f959079ff9ef4e8d711b5f34bb16f6a97974f3b7ec62436103db81e721ea9ec775ca6803abecabb27e9d886965d9c7e6cea529038875986fb94bfd8d25395a49d9ec52412eceff955267f2e9ca96976ed05dc2e4b0db29231ea62446c7133c4c22c6ff7b48e54facc11c22530a1d7e933d22532317a3d843b14a8793a031ab8522a5ab61da36bd55aeca3f13fd33c142f641c744e50bacdc230d1a02b423703a62324173f279f76b6bb9183a9ec10407c649204be013986ae3ee69984649c52f11bce683664f7ad10f759db9985100b9d6c7bf9c2dc19c19cb7407b090dff8bc585f0072a3d7ce9342d404e3e7844830619daf3a9d153f50759c8f689552b084dbb0e0dcf81f027c80acd63ed5e1c0b7946a4ba6e529b8a497b4ec24446c1fdcc32141a39c464bec071800094e4063aa1ebec9c718a798628d0eb11abe88f0621fad6ae73a9b5ad8c62aa9273c9c53a750ada403485de5df12443c17037ff4b5dbc59eb3f90339a59a27243603d021d1cbd983bc6437afbaf3b6206d8f15967ed8e533a7bf9ed1fc2a12710327371fdc395e6d0fac7779249a232b9aafc70f4ee74c5eda3e1f5a8977d6f67b221bd3c043d622f4c78d23f4a9009f82b9828499cdadfc0dcef59a4d9390f350f257b3934f2d3a4e8062bfc638acba19ba60304f754c3c714ceee3bd011d1639dc5ab5a08d4527b1744d33b759689cd5d62e93fcb6959ef427234afbc83e3c683348d17d942fd753c117527964d735ffc609b4130b433c45019c5eb8c5e7b4a12056599d200d0863ccd889f0d29848938f584bf6e0c7fd9d04fb49a54e188227023633e8c7af0f0d76837f4d0cc5e42a043428d14dcaaa6df14fbc52736a5bd645f5f197d263df8071d37045e78c79a6c33df17e39848dc17d429812b6b6e8f468a5a4ac8eea1574c587b4eed1e437587cce43b356f670ed917e8172a56c040ded24e89c22402a544bd0e766646e2e4ac52133676b7260d2a08599b76d3016c810eae406235246f9e913363819d15f47193939a3e56efc57747334901c0b7cb24a2f47480e093c8c77520fdbd81613bc04027db8711c0d5c44f23c77919fccd6483a0179804ea36e41b9380440d52181a6e3cff4836d7c763a2226a2562eab41ccf0a7e5faa9047a63ab408269e154c600adda7d16148d03c2d02813ecf59e9b58e50cd9c1f11eae578e3931bf42892ddaa09bacd440571af18d671f6ab3e132f525992fa807651fb65e6bc6f1ff317e8207d31e1895bf5fbd92248b684963c16d3b3c8b471f936a1892ba2c7333b3e4703e572cfa610787f9c470d739aa7ce1d30fbe354f982da0f6477094a1788f9282a2eeb240b0776c9112bea7917cd313a9d64f9403e08ba575420a297aa6677cb22ebf4a0141878b70082a045266d800213d867d0b31d86c10824087607cccbf94ae42d0ba146a9f1f056c710b5f1b67839fe0aecf3f7da2aa1b37904c3300a87133366915bec0f65eff902b62b9d3d5c20542f07e78acc41248b1447dd6bca849b1992d585e7710439167b61883071a9926b6d45cbefc784541afb7383f378b4690a13035ee4286307e9b8d4bf819adf0513439148092ef0141a366107c7bb8c612a0eab184ff84c0f8108d0ca631e74439e314f437067c0d7d13d64772c369cfe028acf00ae1f1ee30993d0be710de9d05ff2b87a439844a357dcf113222fee68f0dc9ecdec4299f91567341d6ed6daab96994c7e64acd5107b018809303bcb120202ad6b400b08f33d712e7b580035041ec5e8979a21109dbb434fd7915842001b7058fa58a4255b6e4b65522cd64f4acc665945c7293c8320629e58a5f06af22a7d244f7cc453fd10c5fe2b35d2c03d0d2a8e5761f76b13b237b9b4c10255010bc577e112ef81a2ed634f234d9d1f5f0a4f8821c5b70016971b11a6c43d7636e8278a62e97b7f66170b2a08fee1ff93bc6a82edcbaca16cc92e5e4b44c67c27db725f71784e467aba283b627ce46798f2cdd4dec7ca458880aae990390454963c5db2cd6b791c8b94c33ebf26019c2e95b390e2c9067c72a1bdcf2463624c54bf3a44b041827aa583a9620248726cbcbe08068f3213bb54a0367088bfaa4ec4e01cac0ed090781fd1878b1281f35b2f3e0dc1409324acad577a6e6b70e08a393a4b07a8d2c3826a8ef17f75f681f799d7bdc8b3c8d19048a2b9f831808f0c6a158495548130221bb064e0355beccaa2f046e6e12a73ba6ad021a9ad0649949e2cdb5691c63d4ede4c44bb46221efa2a2d5aef0828a442ef88cbf8e681f68e6d8bcf1902720129157d78ec25978fc24273fa5cb365b2034cd889adc889b53a1c4e087ea9bbdf2cd864f96cc503aed38122f1b699be1e9b48b5c4c804e3f3428587a004130e820e0042c65dca5447fd2d3a812b9f5acc3a223e58edf0e1b4125abfe26e4ead6756a359622b4fff4a40f47f54b04b5caecf8fedd74fe4b9a1704b1c1c24b20577fa08bd3f9e0981a59b84c8386e4677fdd00675c00c32e007e4b61f747a32773047f59a1d06ca099c234f0c8aa768a5daedaaddcbe64ca0d347549e8d19555ba9b22b7a42d80187f1d75f22670b142c1fbf6f5dc68aa84f8129af58534f6185e7291be9280c8688c1b4ec3a1638211c93c40692059fa797fe1871e48e574033a539190dc400778bd4d85840f39053c2abbdca5edc86f390ad587e9a2e65ed9022832d04821432ac22308359b7ecaae2d4a2fb243b457be5e9eaaa8c5e94fabb9c875ef2580b858d28d00bfb92345e659f257339e5a2ab022a15e9d4ab30dc4045c63ea347814c1d6d81cd3da22ff294b3949f8c01e525bdf702ab67a1206bec293a19cfdf09e6ce2e05cf4060e9f44b5a7fc84b47688f775d61d92e5658f94c00049f50a395198bc8da5753f872fc925ea66b6a9a5cbd4c4ebf8596892121ab09b76f3fbd772a0c78b57d183bb569cb264fc7a1754a68191220d2e219272d37f91c4af2d8a7400023ac6526bb2af5115583ec862c187333083fc208a3ee655ed80379b77adb65dbcf1097569781ac461b383a76b147d289f8eb94060e6afc9698c8212833fa87037d865e1eb7568c3e707d5becfb6876c232bbc8f5571d2179e9950bb1a4ac80b15ac724186cc6ee4fec496dacf3c8a4ec6dd5349fe695463ac0dffc6b19df3c09c46b400981a1b06bc4efb7d1a288887dd001712b746b315169155b788a5970ac919dd6ac439c1110c24e9d3af9a704ad260228a522f9bd7b753f09f4ad506afcf615c5dc6a8f2ccd5ddf47aa92192538702350d93de51b081ad89b951328718b841d65989899d242254bd962ed417fa0e3dbef07e712b3000f8e182e35024c798f0064a8f93a0195182b057f093a3e64594643f53b4036201406f8d3bd8dbcd207b682c809c01b4192c2a268c025fd2f38ce07c0c8ea8f0f742d2f762e59de2a6e5b3e6f2420ebf448960f5028a185b8d823b62acbb03628158d8444f460e64363f226b2480449e1276779fbc657103f38e9e0b7270c986961912f80ad6c6b9ba3d8bf2ed741d850023a4569afde6a8119ded86f0e40745867290992456d200cef1030fe5795df1c9463e4f97b64eea6e83b23abe2eb2bc5974994e2b064864986ffa81712eb5f85223ce3c3cc1385652d36cabd5e4d437773de3a8694dab6cede4af29178291dce9d65832a2a4d3852b797ef273d5c74ddf382c32c884bb021c42cd52978275e6d7b8bf2989f30fa2bce0bd988d368563faacbef18cda9664e9a3276f439f8691a3b22590ba100d77cf7d1bc811231538db97dd0b8b9d72e8af1e75866a1cd64b05f60993d561d24d37b9283832920e921ada60486d5e5dfd85cc0a1e3c0fc4c675f893b8201b22b420263a2bfd106a8237193c44eb6fe1f3670021dc9f805d8c8a2fba8193038db6f0b692c99a986e0cde3b41dc4d4d0b5ad0f29fe0c62a3d9dafabfa751bc25bc4471743f2a5e33f84071690b9d4bb58de1e30af57dfa46189405dd4e67c4c38ee450220972536639146b11222e2ea8370c545b6619b59b0cda6e016375699676685bcb1a11a7181e55f595b2ef6c77e5ede7dc40d0d9a6fb7f3268bb3a465d939d90b9bc41dbcd1c7e80978bcbf0fc533d79ffeb9dc7a467d0f67bb7c5898b6227d72268fba21f49bce87a1b64c8a50aead7a9d537d6a0bead98e9ad7f73f8511dcd8c016d5f9fb598f7d36700a63aad6b41123cd1f2e0f5cd784804f14c5c720894ee1a6f25c70fca2a51cd8e0891795433a3affbcebac8cce06ef47c0d7d0db2c290ff84b70c2f97c8dfd5669172e0ce3d046e7c2239d0982e0d6d12eab0af946f38c682ced598b86930b6286eb2805acf7fc21b209d630eba13946b1729b254b546c9adad49d16bbc17480c80c7d1e18294be331a17811a4da18ca8917b10484fa37ff7935ce95b96392122e48b670262220058080b7f8ad28a70724b79a4a95b407101aa3a0ce22ce855d574d157deb7e0b37e927222a49a9a6155b9016a2b23bc0319903b455aa9e30efb9a12a4af853e02034410369d8f2d1e3c4b7b6099631c8cdc7949a90b56f2188c753757d2a043d1d91fb9af07b92220ba9ffd0d08c21db876fb7d76d17c28bacabc0f801b7b00a2f076205b5f3c3f1cab950028d8d1329502373110f689edf763838ca6f38bd06a8d0edf04599571d6b92138e2be192d94f6ad4adff2dfa1b611d57a10d5ad766b95c773c7cef565952c6b08e6ae936faf07d49323cae8afc7b4209935366e6115d3b606c48e302b7bc7d7ad47b793c39bb463cdb15bf0e487fabe8392ec8f350a3331dc9fd523eb7e385572e8d247df2cb663d0e209dba69f23f698cc30f15bc62631929d15f71f54efa655ba9a3fc828878a02751acc010865cdc66bdc3439b97774c6e9c7f87e85d7cb3655a80705bdd0cdcfd014c5f0798f6fa53fb54c0cbfc987efa36131371cd83a8f8476beb2d9c1e284fa2ed34281122e6e7ce1650cf046e47f984d39dd89753ce6081d5d0760bdc77ed7fbe89589d6384c6510c196148967f87701ca0181afa7f9be5197ef69278851c71687fbb0efc8340f84b77477d3cf062ff9245861be2660b1ea797a0c3f552b599d177bd3b442828adbec39e38e4a23a1098f51993af8f7c22eee7b3cc8a9d4dbcfa522bf37ddbe62825ab64d1b9daaba8172a3a395f6ec4e0364c3dcae51ed5624561fc3f6a5af3213a762e3bcc7c79a532e4f65161a15e63d5ae305a48b7e8f2fcf01a4f56c4247f9c5a00e1f56a8eb22365dbc39c83d347ada579abad3ae50daf3013d084f3871c30e5f6f75caab73dd714b2c23a3e4e205bfd13e7b9524f8f3d890e27a7d160ff62a4df846019f5d45c41f049e27c40e0e581048c98a73a311830064ef84608cc864400e0c94080181181820130a5941656ea8e6c0a4abd5a24b05fd45cb4d32c3b6ed655ba5fe7baf3564c777983abc35c4a3289a06792214e769ebfded6acde336b36e224242b64c01840eb50e4a0d6efd772cf9eddc6bbcd4a8b10309eb5ee3a5468d1d505c14772ced581245b126bef8a02adc777cf03e6a15f31e4b0b898a8959d550e30af5be90918941a554a8d515c1aff952f385663c5db10918ff113c0a8234a96adf17f37d4cb772e291354b8662087a27d32a15131363fa189b521da1de49934cd7a552a6188741824a7d2d057eefc1c4ac6aa8d4c3a852abda3689d7c51a50a4b8aa7d2bd002a38f9f5dcd7ccafeb57f53e15ffbb709d5510d7cf183206d0a7c9ba599b7813213feee48f17eef30462c09534bad64523f93fa9999d4cfd8571dc5bc93a96b63a676c9d4db2cdd97b1332b279e8d3b23634d24f85f387e38b3aac5ac6456b56dba6f13c5268a4d149b287749c6826688ef797ebb54cd92a2f716b4d73af148bbaa3d21c3276bbeaa914f7e084289ec2cd9fd0c5ea7aad934e1aa9ae7398cbddddf95f75f97b176c9dae9fd3d750255a190a36e55b326f14fab6d224dabda13f15130d944b13cc2d5d1db44a15902d1d0427a7f97ac0ded2ad402a54aa1ca186b978a15d1caa5225ab954c610adbc15f10af10a169d0f2866216ad1f9a0b264e1c206cac966c9268acd928800918a5845a4d2f9dcffaa743ee15bd42756d1e25671c5b572e5742263bc54aeb072658cd192b54be522e056b9c2ca159b282295cea776a988583a9f9a48e552b1222240b4225e71a988566ca29c5636504c364b546ca26c93b5abda365d2a3651b4a0b42c91de7b5c3a9feb95415a8bba318ee106621ea60b8c2a6625a64095e883b1e675094571ec92e241f805cc7fb1a5f309a3f301c3323a9f2e9d0f8c172f6a8830b6c64bcd971a2f1deb5b855c74ac2ca196304bc845e7f359982fd4d2f9a4defb7003305fcd178b03b302533d18c3300b0f46ebe3058a27854c91354bd66abe581cbb8242825b7cc1c2eb1266f1ba78687477290cbf0867e0855fd47cb138a06955a386c5f96e8d978f44c1eb52f3c5f2b0ab4f4c9db290dfaaa69f58ebadaee705d13d09bdd401b204a04a960024d10394bff790495521bbb00c32ec42762117bfe950afc668b3e436b5fbf94de7537bb25e5275a728a5de460a0a89d4dd2632f5f76b6295540af52655cd66898a38a563ddee8715110f65130595425d31c69a4c15b2abd2f954d1f9842f13da48219f78b52764ea51aada5d22519f5285558ca8b796349d3efc6b13c506ca13941521c0ca42d6f625bf1aea7db163a9468d1a2f355f762c5181721db5b1a683747ff18a524817eadee3d27d62e895d1b1baefc2254908c5e885617435dd97c1058d2ea11a50d4a0d244ed4ed131a6d4e84871cad75d0e5c6b7f84a2c405c3073434341f8617672421e589226220e451b1336319244d8e94bf2cd9fde82f572d7103355020c505a0c22b686081860478b085026f02433424f07d16042f288249f80b7280c5032dc882012ea27082bcf78e37c61be08d7befbdf7821f0d0fb6101143d6c61f01cafd06c887e067c3f1fadcf1860ce95ba05185ac8d4f05d501007801e34ab9523ab100f60c2b51b820d5595bc6156778c05adb75de1926f06270061a677421eda7ced8728607503a6e18862ee801014c805ac1146714403c230a11683c03cb570595a2807717144f296bad756fca01acb55df7c5bdf7fbaa28200c4351e422c5e97442a1ec152a6060606262bc2c6026358ee33833e35a9056dc488d0033a40549d3b146f8114680117203c6bedf702068113bd2b7e841034a48b90a085b6e98814aa1408803a10a109c20ed0d803085ec3ee579420c218237fc401004c1300cc3300cc3300cc310fcc2300cffde0b865f78c3300cc11b86611886f703bff086611886e0f785611886e177c12fbc61188621f87d611886e1772f188661188a61f805fc2e18f3856118862018866118a6f15d30fcc2300c43100cc3300cc3100441300cc3300cc1cf047ea319524ce0c048d6683ca313f899cc782204c1d5fd3e1104c328c2af8af04a89c2831a70c105111d0880030c70c600ccc802f4ee1951cc6801381a71041158e080cb116430a0013198b14618fe008a235e470f0850016b836e0b2740f1e47e9fb0d6765e18c5bdf703af30a38a300c459308b2389d4e2754ca8c1998d102120606062626260b71fc01148f0ac1180730dd1b8aa11886578a0f1d2c69e00515e880144a1400cb184c745154c8810f96f080174af080034d90600c2e8e10c93b9ac6f0e2148ea6ef036d00de21a484201931df37ea18a28c28e037c6105257bca277efbd5f3e32aec478f7de343e323a80ea9ca6bbf7de1b1e2166a1e28c2b43f8600935849820a3082e4220630626327210850c3268487012c3d1067943931862cc783768b8f888208e5f18dff77d9f270618630c11d2dc206b37c87b04176310a08831981063a8c801efbdf7def04615017ce303fe5e31b020ef1142ffacd7f1e20defbdf7c57b6f4b0c2e42f0b36318de7befbd21f8f7de0b45e8defb7fff5f871824206b9f039ea008bf0b86e0dfefae6e98b8d0e0b32810043f235820c11fc1900604412284c0bfd1f9dcf15bddd8428c252e420009f043951fa890d6e342a2570ad9fd9572a578e7a3f3baafdda0791f9ee7a3fbdad8e5d474f008bfd6d1f4b85f7b8f94714ff5c40be2763701a8fbaec3f3ac47a63a56978211f25d196b6304c69ae82d20d7fb04ca763238887c0fe3ad7010b96f5fc87debb6f3fc8778ef6fabf82e2787c5b24a68bc711445215d2a8df10659b3a80b63d7201de648f742fcc62fd9bdf8e11781ff892bf76a8a007108b17f947a92da40d7fd6985e3fed12a95c6388a42ee777f822172572bbb0689f2dc7631b527a4e7adba5510f789d78569a0ec1a244aa64b97fbe40ae9c4f1d62c197e3886f891bffd6f954a63b4a1e9c10f04c9efc16f05e2b0a17bef8bc4ce13bbff5656dcf7bef0ac1027bff75638c23f5aa5d218412be4759ee729f184eebd57e8537ddff729f984401004410fc3300c4325a19097d2c0962d9d952e5db06059f22c4e521a186ba309468928e43dea6485b772cfc27c2b21a01618f03f70e528194b3acc501221944dad41aebc2fbc1aef0baf46e889f56e0a0db00b2e5e745de7791f1734481a3763051552c881038513684c288184100323d8981965626052a8932904bfeb7576f5ee1a37e8ec08442a1faa8a180f08c5c0e2defb7d6270404c8561188a22171a583140107e0940d9b7d1859d11a313230c510c30c8eeaf1844f066f01d31c610244dca7e0408c5b8a038461624e95b8c8185b437c6b0d2fd1de300637041d2745de7795cc218c38beffb40308b9a98b28129258aa2082344e54eec1ade8d4146158ff42dc84000cd184388b9011796c65e32ae0871d28973417ad6230309328a20bbb7351da4e7a148df828c0ec8a46262626264646e3003326640d2742c9799c077e5e3c2daf25f64c1b224659c4243c54a8e175697e742b365fc42d422d2b87b5e48770f0814ba5d599232858a15d515b25bb4589232854a152b54c4d45575429d964e8b96ae13c5986f65c5b51e500bb4f4f89ac8e36be3eb6b34415f7ba0afb1c89fafe1901fcae76b62cfd7469e27419defaaf82b25e27c6d6c7d8da6f6365f63592efe8269e16b382e7c8df5c2d79ef5359a9a15be86439a582b1674d82b4afe92f913be86c3ca714ae1a4c209879c61cd783337666ccc7cf133f86b7cfbf6457f8d3085841e3c5e41403fab1a8e4f0fcf8e4b6755c3c9c169ddd8c0b0aae1eca861bde0420bab1a8e0e1656aac75121851c3850386155c3c1f9a719bbf7a6d8b031c5c6141b536c4cb131c5860d55cd53e2cb92e5fb1ace0dfba8b7a1faee52d7817709bc4be05d02bf86d3fd0d55ea6da8c00f432c2196104b8825c4126221bbf76ca8c2db453489b78b78bb88b78b78bb88b78b78bb90312693c9643299be86e3273ff9c94f7ebaa192791b2ad3b7858a37838373ea4eddf83654a79f79511c471a9a7f8fc5c22167be8643d6402aa6188f049589bca11a6125fa8d7d1baa99d5180393aa42da0f0c610262480103201c31c206889e17cff362619cc6f3ae07e32bd6d0d50133f45df082a0d75950b433f04221f7a854f1ae60f1b4d8c2a58b97252953ac5cc1a245162dd6cb92942954aa689145cb175bb8e45c6159b154b2885ac62f68b63c172d5e8072589ee77ddee77ddee7e5784418bb9f42854a952a56ac5c21ddba757777776f4a152b56ae5cc182450b2dba2c9dbbbb7755b068a145962c5ab47cf1c5962d5cb0b897a525299e7577ffab128580b6885cc62e340f447a523ca050e8e6fd5cef020a59fb5dc4718946ca4fb1e2d9ffac7c4276cb1612b45bae5047c5f3c2d4a75279429d96f7a4d8ef92c385b5e5bfa0d1328e22cdf834acb7561463c29515e0aae64921853c2d3e9d244c642d07eabb9ffdae48fa871766c8fb3cf0bbd71361863cd3bd9e773def345ef15ecffa093639f6dd43e5dc95e914736d680114681272f2447fd4c97e88a386f0a8fb6d9f80d662400bb2fb5a1269a76c59daa285b45d6cb085ec3ebcb2a50ad21deac44ee5a66e5f5289acd9ff503046beefbeffc4148c914f89b4ffa96a4924087e47a2bc2b83727fed6bafaa6632127ef8ddcaef77ee37208c1150652241125c81300ffea74ac118813162bf5b8d1dcbb3aa6e753dab3291fe9da7aa5ddb89362400ca5af7dcf35e0a0a4506caf350653bbbc668ad68bb21a6909ee7799ee7994ea4f57c3c2bfef5ac2551e2bd591824de6dfd48d48ad6b13abbb2b78ed5d13a5607d6ee08761d970e8dcecb0c3a2e5d193775fa32d6bc250f4af79e14d477ef2df90be6bbf78408454f14451101160bf1745a63ac89d713bb1b537b425a2a478ce20d2a64f734d63f0dcd38aa6230df83aad4b71267f0545cbc9435fd0075ad15c91bf78a37ecb3867835df1360fcfebb514b42a239a477a3f31972b378904b86ab9b73a3fbfe921f9aba19e237f7bdef525fdcd892838b8e2e363c3d86a88aa4314e09d1f81ed57d03e8c0f0debfa8a55188edaef5c42e28fb9ee78c3043a8a5b1e65c48ef08d01bc0e8bd68b1dcb71f86442ef45d317c305cb95bf1ad625e8dd7840915a3f733788e763f341e4d4b15599a0042a2b350480fe59dd218694691667c1ad6e7b09c8b4743eb589ef7a929c6dbb1eccabb21a6c6cec74bdd7baf779ea7c5e404687d65ed526705ca75e8b841a0ecdfb7d755de2ba12c0e0443e0a2064e740128c69927d269a6274c09db322ee39cc06e3613b6338ae21b4ce3509c0d57e28d81cc4e59aafe70b70c80a5b313c5b0ecc3a9374ecde122de6529e6a12df41b83f5d0bf191bba8cfd4ab0315674dd1ff79ab82a849d287ed7b3d64de85adeb9b5e1ca603de4f179e7d65aaf1b626d683b6b3dd087ce7636ec4a50622d6843ef2c4ccbeb4090757a7bbbee4eb1d7daee6481d059937ff6765eb6b6d659db893774383adb81b7b36474d6829db5c19a60add78921f8bc30c696602d09a267ab58b0b3b6f360b6bb27134f97b23e44fbe9f062b061d75d1defd475b646c6c702e0eaa09ee8fc7ab7007b3dd6fd3aebf957007b03eb9d8fe3e8d6edb59ded8115bb1dd6765fd779d6ee581c2bda54d7751df8c3bed075b7b3395e0b7582e88285b18142e784fdba13ecb59ef52e49f7277bbd3b41ff981d80e7aa10589f81049d67417b430b633d2a5d27be3c0be4d9aebbdfa54c2cfb591be65c9d15726c7702c5ce5a6b436b5fb6eb64e081d6d45d0fc9ae3a9cb5de8d35a13a2b86b69ba153a153a14bc173cfad8c05bbcec2dcd1bbdd095dd759d05e9935e9b0a8afb39f8df9b1d65a8ba3a30144993a6b24a6c2ceda60456bbdce5e3bc4a6d00575393a5417769ff56c673b54175eeb7d9eb53fd6b32c6bb2296b2d0fab4277f2422b5edb59fbb2162ca1bb616f673f94f53a15ace775ddedae0dea3a8b4277b2262bdece5afbb22974a7d0b357bcd6da9fb7343bc41e1e0c9ff5acc95e1a6b32bd503be050c1b2706dd7815d98ed48420e6a88b59dedacb5371efacd97ac61bb2c49fd7100838b161ca4b841046ec060e41081b1c595a862e03648a1826c03eec2934891451449542a122460d4ba1451a97086103072e4044941831384631ef003068c8e1fd5c9fa80618be0135b23013effc55bb13454b88959e96cb63040b5f99c1d3054b1f1c10ab14fadf026d8f02a23f0e0b14f09ff4b84bbe7eeeec3dd95b82f71afc1dd593ea64a803736612094530b27583285a2089e4ee087f2523085dee791902a12e2c84a64812711e8a664ec4d8539a4b607e38ddf174440b104c674a1e9dac0a4001481a5130e29f3dac408d1f1e0f86eb816ec0182a5188a009921a2bba75ba446084b5ba0d8ef35b3c20c42741705efc68b2518c0585a2109141264848af0840861c4d209a625a91b502c0521e126ea5310967a6c9390d8126368f260bea37b0412428877c6bbd9116207539876b8008ae8c589980ef5cd301306dd1af20e578618e1639d829c5c009bdc1d61d010199042c8102a4802070a4c592400225842e164072002c6256331b074828f10a730083c8931de0f11215e0aa720a110446088c4213886829c4c435244668f0c2c99706d7c4ee06b0418f0841a5af5c080a59338440523012c7ddef859d006f0f4f100779032a070a617c421e0293c01068849c73d6232e1460e1750286187c83aa2c405214e622bdc81d9f92192244cdd1085efe5f99852f7859f213485a78bf3d5708166b01f0e4ff5959063124b2f6888078d782ac1f423c48f23281e9175755c1da0039676c45c201f0c9f0a261d37878c8e97c2104b2d1cebc9bc9beb7d0058f5c0849a4a20025ab4b8220107541180274028e923592e633d34d181090e3710252942c39017d00ecb851658f84b8211ace183327620838f1656289c10564101175630c08621195e299090428122c8420310b0624515544851258a1b582fe0b40e00c51a6aa061a4830f7ae00198ba4412a7cc078f53684589293f26187cd1002baf201f136ea04e62980307062ed0249b488ed04024c850020870841136b6f47040021170c0932538fcf8d0dcb82ad072060e3e62f03185e004a2688002531880090100400109484012488ef8e0f142caa6d111a1f372bb7c0f3a2e77071d18df161b83ee059d0b4c5ea45ad0a9a0eba2cbc2934077746b568798c29703e684ce848e047b636684cf463763c71bd3a1be536712c52e0cbfee5acf5ad061643c1c5e0796ee00966e1170c7db1008428c0c58fabe54e8420c84b852e85c1352553c000cc0d22d622ae19483868825530e57074f05d40653621011083c793c684edf0996442c4b379a0861faf1a230236583a56f8da52f85820b96527bd58125134d4c17f2f870be26a490803ac189212e124b322a199577338323d2ccac31c407830814f6f064bc1e62154b9e111d1cf0045eb1e4a14014ae0d4ac7b337756d4e413e18c21c4014c013584bdd48dd30d1984a0873f08a300488827765882fcb520bb56b7b580b29dc574a069cb9d6bbf17edc243025805db824c4111ef94888b120cafb6ecaf3bcce0b3dd1339d725c2fbc21b42193e4341382a1f5c2cb7371ae154ff07008615ae17bc052cc1542cc8017870864886b832156b0f735beec00065fa8404b09b2e066444a4c19129221861f35f5410f705e1865c470071d901c5923052d58c10a49e450716206286cf0822eb6f000062460054ecb0503e076127a05c20fbaccc08b168cc0024f82e8a1890e4c901c11126405154c28218b0d3c91400482000296420e355d21c6063570625b5ae38b1082d06407134a9879c11624f880073070810924418023603de4b004c911225da4800428e00095213288411729d862041ee80003aa10401144fca0cb0bbcf04007b2a00094a56c12199a81e99283306c5082116c400358344089016413d643931d961019e2f1aa9981e922052588e2004a40c9660f34100932c4e31503733d0761749102139060031ac062020d5882005078a081480c3c5e3f3c3a353666aeaf9183306a6082129060041bd0c0041ab08412041800941bc0786822034e4b8d348ad4201343831c53901000932539530c400039250898d6f0be7445f8d2e888203ee03aa06b40678575753a5e8e6da16e3c18bc2f61852e87c511a2e09d6069ae09b604d308366c78e3958189196150489d80ca719a318522187620f87d9e757714dcbd051f4396bbebb5955123bcd373bde164532dcf14f704f4111cc3dd451fc11bb8bb0b3e8259d4bcce3b67c4facfe6a9d3f3f5f9fb7c1eb915af98563e3edfdd6fdc1d0815ac8da0ccdd637c0499b8c77e969e9996f4351f438f67c5d0e3d373968ddcdde4ee475f19a009ee8ef2114cb97bec65eaebf3f3ce19f1d06ab57620e2e090ef8a74cd7be31bceba61f0f13bdd9d041fbfa2f4dc3a9b4f2b37b6fd56d3d75935bf8695cb15a736193f17bed1cd346ffcfa898c3ede2d669a9dc7dd57f0f15e71bdb6707ce5e30de2a24fdbb334a32f533f9727aa7f55657bc55b7f9ea57875b70b70b755b85b2a6c0edc1d878fde0ff7209df7f1eb8a2b7704050105fd04f904f504f104ed04b98274827282828080807e807c807a80788076805c403a403940413f403f3f3f3e3f3d3f3c3f3b3fae1f9d9f9c9f201f209f1f1f1f9f1e1f1e9f1d1f978f8e4f8e4f500f50cf4f8f4f4f4f0f4fcf4e8fab47a727a727880788e787c787a78787876787c7c5a3c393c313b403b4f3b3e3b3d3b3c3b3b3b3e3dad1d9c9d9097201b97e5c3eae1e178f6bc7e572e9b8725c413a403a3f3a3e3a3d3a3c3a3b3a2e1d1d9d1c9da01ca09c9f1c9f9c9e1c9e9c9d1c578e4e4e4e8e5e5b365c8ab36db2bcaa250f271bd68905c403f100f8b739d99c00f0760a772b85bbade2eed7ed134f6e42553ee06e012adcfd041fbb00fc2b16fbd7c92616fbd79665f4ff14abd9b4d9b9fe6f594659b17f99193db14ce3186270b70ae88adc79dc5f9f1b67f4afcf4cdbffd2668a538d5ea6fec6a9eeeef9d8a9ba7f9b175ef88ddfcc47e599e29bbb4d801563a6084ddc5f1b676455d77528495d5755c8dd3b1fad08dc5bad127cb4a3bbdbf0d152714731926acbabbbc3b87fa47561d4c0e7ee26f8687170f71b3e5a21778f41299be9b9669d9e7a6d99aa0da7cc48af4fd6a719fd1e9f8dde44712a4d7f8d7737b83b8d8fbe03d76b6bdb64abbaaef953fc664e57dcceeba7eab9f14eb32da337dbf9fbc4ebfe597aee8d6dab2a7becee9f7b07ba7b0e1f5d8a5e5b65468225e115a75c354ea9a228c6c9ad78353a51771b85bb5bb74fb85b04b8db03b85b28fcbadb276480e285052c20c464821657d460a0043f24a141078a645df088914287582a1d00691921a945042a651c418fa8c204b4aa51808e96114e0840cbbb69203a64a84929820a9105a201b440b9164b4ba47b22952da81f82e8defb20ecdfff010245e183ff0314292ff41599fefb20c407573f4479a16ff54310e09f56525ec87bd32a087125e5856c10e0ea5b79ef1f04685394eb10c794aa134a011144f7e06aa97bfba0ca8550a8174df74d1d94fba8b72a20c4b79d98523d5952459141c87b930a8a142be47d141984ee3b0c0e1beea7bec843a5526f3abd142b647afba00a0aea4faba50e8a0a08d35b710504048a4c6f1f88d377ef42a6932a85237c19c823efadc875ef5a8c2930a572a1930acae9411514d3dbd46ac983024410de9b564bde9bdeb48222e58552efc1e8e07d4a054410de9f564b1e8c0d3045de776f5249b142a6175552ac90f8271594283208995e8a153a3daa53a5deaa50efc10ce1b0e17eea75f01ef5a00a8ab8e489506a0504048a4e6f1f08d377409cde822a1732a9dcab09df0aa586303af135c870756445ae7b2b72f7efe3b0e17ef7455e92ee41d5fd279d8520be0b5a00950282e82ed4a9a2d828178a14fb5144efa77b17b22a299d940b45ca5d41c0890c5120e04406f2c87b275d0bd2b34b50293452661c7d7f3d4b03cabf77e27da808650821ba95931fc8bbfadc5fd602287ff2e4c87ef8f7defb9d156f68ba5e189ac255cd7b6b125747debdf77a5e0d32dd0f35fba6b7e00f48dd7fdbfb1f48f067f03eeffb41fc56dba3e109198aab5a785547dfea28fceec16f06afd6bd3d0a574e4850e5e407f25e7fd17e57505e13dff4e1a35044bc6fdf0791ba07ff5339a1218fc077f2d4a99cd090e06a7ba4e92dcc104b8aa655edbeb872f20319ae8eee83aada5d39f13e80721df6ddf36abe4fa931deff7aa05267749ee77932e1f7c17c0f9302616060be460d9818181893aac68bcc0e285e4c0a464646e663626460625ee6674619d3c780df7b30a954cd979a2f355fbc2ea60babb8a38c8cccd7a821b303895146261c65762cd57ca9f922338e325fe365fc1a354619556d07123233a34c8d0d99b7b103ca2833dab061ddfb19e1675ef47e6efc8c98850c479955cddaf81b2af76a6cac6afbd658a8f745f8e12853f3a5e64bcd176f8b4c1782115e2163bc25abaa8da2f7be020379c5199debde78df72596218cc4661c20155dccdec8487998d3e871ae18db3d9ce7d7e2ed3539fb2d3546d258fdcbed9f2e735273d8acf75bfecbcbd4cfd9bbaf7a9944d95b6b30d08d779a346a7d6ea2dd3b6b6adf833926aa4ea3733916caa478480e4732d5acbf47cbd8c6cb8f587bbe3b85b27eecec44721a35e5babbaf19af7b9e36ae5dc189937f95c770088d0192d531c6c679d53d7adb3b9d3d396ae38a38c74a21876cbf9089684693bfb90f32a4bc2b47d3b697acd69920ab3e1bc613beb9df58a33aa612886e5725565266ccd325a8953b799e26479ed21061f8798b89ea5a789336ae28cbeba5fef5326c3e937f3969d34ed7689bb631f6530c3dd7d7c04a2867bce4e0fae5c8a5f67db8a354e3d91f29a64673d3bb50e2c23a9ebed86cf8de26c308d61682e535ce215877f30717735fd221070033f677870c36da5d20d8ead547abd6ca5d2cd283484bb933e0a91ee1efa28f472f758ecffcbd7481f8bdda448be559337aecc4af977ec785a79d29258af6d8fe2f4755e315a66f33f092c3ea802c50d32d2b931d2b96613a6318a62238d6161e0800866361a0289c4770efd9b0d6f9d6d6751ce0d6f6d3b772e1fe5f2112ccf56dcadcc3827678af32464c861d338e9a6aee6a7eaa7f908ef9c69e29c12927a2aa9eb4de3545b2e5553bcd36cdb65aee5d5cc658a53d314c3724aea7ad36bcbe844350e8a9e329d67f806bbe14c83edac356ce354da3e9376d63b6ba55396d71b0c45cfa39d66a40ca3ed330976b4625b5ecb8c833e6fa43e6f78969eab4adb388cde6ca70da7b03223c16e3a49fd2153d5f506d33a9b6a0acbe7baddfd867be9332ce0c0ce44b0574a2467e2bca264be21518fa0382ccb408458fac155e0e1843bde3a3d6925b6dd444165969e6bde69164014abf36aa227adb439774ff2991f626676f23c6e79eba35245b3ceb314d3ca97c9d43753fc37b5c8dd81dc6d91d6ce3aaf38978fcc9c4353b54c71327dd28abe65e6ac77aa96aff7f9366646526d2693c9744af1e7559565a1cfe5a3cfedf534b3b9aa655e5f9f9f7128c6c1cc398cae1909c9a7f8d5fd2cb87b1133405471b727104d50027700b8bb0e77570288037a6d9930574ba7b5737393dbe78a6f37a86bd62127a41eb1e16c677a1a4952d12cf46367adc9f406779b650b5a89b3927ddace226bcee122ea111e867420420403320404c98f2343302548942819820d15b9010812233026a491d70b6bb31c221a223a378a33e2d3e352938af21146858a2849a21ed1b9141b514990e623b5c8dd8e8074b72230e263a6a23f328a3355dbcfd2333db12dafff43af369c4ed53225575c59aa2979229d40326a84d11323e17c9a1a67cb46db4ccdbc715ecbcf4624eef5a933cec9a7e717a5d90775957d5e71909db5c639a337b399d3247cd39fe66ca47329b6bdaa16ad3987d1473199d5fd665e4f9c93f4fc1bee4855d14cdbabbab199d3d9a9535cfa234d52d3a3f4869a241535fa127f6bd6caacd739cb3edb54fd397c7b757f6e9fe86984532279c56d9c2c3d51f44cca2b6e636cf4b4bd9e468f3fc5af312dc9a66e8d2b5b9fe24fcf3733ce46186de99c91302d876daf79d85e9f5fa4755e4d13ff2c3dd3d9a9518c7392691a0f51dfc4422170b720f0d1a503afb9a7a7a7a7a7a78787878787878787878767676767676767676767c7e572b95c2e97cbe5d2d1d1d1d1d1d1d1d1d1c971e5b8725c39ae1c578e2bc795e3ca71e5b882828282828282828282808080808080808080807e7e7e7e7e7e7e7e7e7e7c7c7c7c7c7c7c7c7c7c7a7a7a7a7a7a7a7a7a7a78787878787878787878767676767676767676765c2e97cbe572b95c2e1d1d1d1d1d1d1d9d9c9c9c9c9c9c9c9c9c1c9da0a0a0a0a0a0a0a0a020202020202020202020a09f9f9f9f9f9f9f9f9f1f1f1f1f1f1f1f1f1f1f9f9e9e9e9e9e9e9e9e9e1e1e1e1e1e1e1e1e1e1e9e9d9d9d9d9d9d9d9d9d1d97cbe572b95c2e974b474747474747474727472708e8c7a78767c7a56304c57b556d3622ee6ee3ee398cac35d68c4324a7e72c1d32f3c6e6ed8635d336121467a21f6b12f3f52acf35a77966cb9bc8d679760271b71fd0e28a07dc6d07dc2d07ee5e5523f27198a6943fb7aab66c7b77375a62dd7368ce381423592b2fb45cafad9c114c6b7c2bb16ccd3b3d6f768ad3d376aea53ecdb7e1d2acb37922a9ebed6d1a27697588defa541ac21b03c962034166e969aa65069295a078e320eef60a8fc9438fcff300c2ed80b559669348bee58a72b90675df726bf97ae575aba8de2a4a549ea8112e09ec76c3af57904e4f8f6bd5af175e7118a6713acd3a554bd84deb597ad2366ccd372097ce0d66563a83803270f79a8f2d80eeaf17eca65bb8b9aade6066563a65ea4e4f0ce4d2c17d7afe3e65bfd514c5e9bca6ee6ef351870e333b791ee5a798b65feb8cbecee12414bf3ebffc9cd123add94c4f5b5ef5dadaa711904b07a6d77c43334ddbb5664f0b80278c407218998f2cd8ecf4c4cd4ea3f2dcd946dbe78a71b4151a50d7ecc3e78c3ebfba7fdf6c796feccec3dd7bf07165e6ad730a5bf33e61367595f98ccf94c1041292dc3e4b7cc33fdc6d06d0751d2a55142535d12c3db53e8d106161f59c4a04ee3377cfc1471513dac6379cdcd669e9b45c37aa2c3d6f328a4b8db3e3022a7390911914e4f229cbac736353cb96118eb6cf596eddfa9ce535cde6f95be394bcde69b6cdb27edac6b74751f2f572b75844957f54dc55ee1f12ee8ec4c76fc2dd62c0bdf7bad7f996dbb067b92be5ac4952f554e283a6f19099ce61349b69926aa2aa5ac2702b2d6f6c9e668a61365c6aae38e98653c236532d614ad886db5af51f772ff251059b99e6ad946165be699c3223e1f4943b393e3a5966ca82766419fbe4f4f0648c7b7e4a1f574e4f8e69649a3c463d3c3f19a7dc1ab7e21019a9a890994db54c876c251333e3346f5ca6ea8fd7cbdd79dc75f0318504e8b575de30cca67112cecf8f0be7e4c87080b20b679edc63feb864403b393c375b35f111aadef0c6e66fdc2d3d7d49994df5477acece15890f1f40b81e65c6c144919829a9779eadb868a7795d713f727acda7ecdcea916c66a29c677813cd4e23a97aea35e3e0ee4d2e90c38ac6498fa2b814e2630e2698f6f8d3d396f7f9199da5a77ed2dd5d3ee6a07177575313071aee7e838f3814e0de42d19ca4f1dba419e99cfd2c3d5fa6feb772288a937d699ee6ebfc32f53569665bde44ccbc337ab3a93fccbc6fb875cd3b25422b3716da693ecb94d4c161a7d996c33798ce1a67342b71f7177c44810c773fe2230a51b8b7b6ceb3194effa6cd4edbe75b6ee34f3fd3b64da6ed34db70b3157fa6ed6ce634df6e98f61ad35e7f523e92aaa7d69928291fc981e5c05c38e4c072603a3894fa34927310776b01778b85bbad808f2830f1597aae9be8f582ddf42ef1cda6fe78bdca6caaa52a4b896c8d8b9cfb4c89f870a2383d830ce5d0db8df4a1315ac2d67c53c2b6a352458d50bcd50d53c2361f3d94b0ad3c757aae5b29c3b2c6466b4ea27db876703dd69ce4f5b20ea051da655e57b5fcada6fad7979d6fe65de69b527e7d7ea6153d8f186c5561267ae28c6266a6e9333d65bf66133d71427a6de97dda4ed4dd52c0e67dae4926ceeb122320d976ee14a72467194ce7f02db7aa1b9b293682e235df90a0d8b6aa47b4c6e80f9dc349dced04725e8394fab4bd5e3acd47ea7ebdb4c66dbc89729962140be99c837a44af2d1c14bff458020cdcbdd56abdb0336ab3715e67bfd523dfd28f628ce24a14974fdb67d2cfd2334945656b3653dce7157f5ef242335246612fbdb6681ad3707072cfce0fcf8f0e8e8e0be7fcec943ce6ce0e0f504efeb9c91baf5b1be1348ede38f5a8ccb412679f331c75b6e21207c5a58ae2ac1a8743d398f67aed55bddd701a966d789595c072dfab4ad3afaa9ba631ed5f59af1929af9f1271b757681a0f494f4cfbe1c3478f1b3692f35a2484e29daa3e9cab4af3013367785537d1eb95cf75c36e3a6fbccd13c5483bcd6ba6a5a7ce48e73e6de73ad33673c54969920a6463d84eb35e87a0282e887a0476b3954a18856dbd9eb2ad4fa50cd3284e67a78f9a20f9662b99bccd9a8d6cb82347a58a0ae18d4dbcb30d966d1a3df1ce40360e89995322395c6613b6cb73dd3aaf3058b6e1745e6fea6a9aa84ad379a56d9899e69bc6e924b3f4448d4e2299aaae49b2a99619c84eb33622f56964abaa89b392dcbad32114a7eab96f484c9c959838d348554836f13abbdd60e23ca47462c4890d48f6e124cab88cb301480ea359494ae4665b870cdd6ceb10772b8108641f353f6eb675889967e6b91a916f6312c12b4ec2ea51661c349ad314d34a98d6799da5678d6b07f736ae1d1c2bfb706a18addcf8a64fd3c499062b9dd8604e6ca686e58db786e5309ad7d7cb96b7ce69587a625a89577cdb2a4ddf704a9437de44b3f49c61adb39122b8b7ccbcf769b3a9e5c9ddbd1c95d8e8cd8ca2eafad9e8535cfec6b45d629de2757f9a6feaab47dcfdc67dc8672a806aedaccf7da2385df356ca8fa6ea7a22a5433c58c00833f0428629c4c84109acc0a0c70e24804f440b9c662cd08512bf011fbaf48c0be4280207585a9029a2c813aa2930ae02448105163766d0188026055e340048102b280a400c3500dd2d04dced15ee55dced03dcad03dc6d03ac152b768a534bd8a6cdce9cb46624d54cf39a778a537fe4194e62668d83e18d812865332592673849fbcd9a588ca5d773e31a9355c500aa98558164ace244c5172aac508184bbb792fc4deb45fecd2b5d713b87e6326dab465af8a758c11409982288bbfff0710a4f0a2f528c408a03489184143ddcbd55938495752b1bddb4cc14ef122b65a27fc5627fd392a92f43312d1b7daa6214e735f6372fbde69d6d78c5495a3022983e354b492b16d33886a2b88cb98d40b6a944af61b3b396d7e791f33e9e8799691a77fbad713400f9c4681a0f89bd4dac55e3a3c37a33c71ea32aedd3bfc9b6732751c246f0c6ac34a3ad1a566e3d0cefda89c556759738888dc6d18abe7593d7dbe358ec65ead6e989436fefda314d13ff9a6f59632120ad580d4ba6661f4e1df3e1d48f4d137faacf5773f988f5d94433cd26aff835a6e5dfea91ad1ec9a8114e6f0072dad69c443d62a637c8d04ca41ea1c14715ee30180c96bba1a66acb1bcf329acd56bee58a52559681e494d435098ae212a591eaba669ac634f3f52a526529112caf181452a088b93b09c50c4e4241e3ee9e22796208de32f30de7f5354e22cdac0445cf1a92f211f3866caa3f889e90d27a62881b51e192694554444065a9cc376dc32915d66cc5ad3775cd3edca432f8e8c4166f9537a99abec634f32c4f1c91bb0bf9e80411a31343dcbd158b7d6c557fc4505c9e43ad1cc489159c68289b6ae923978f7ce4720d3dca8c038a9e466b4e92cb3518c0010698e21eabd13180e905f05200131420a900b5029ce0ee457c6c02054d60d1caad19e9f55993914e9dc65e2ff584dd74ec358ae292f5b11a221692d8bfd40d4b7119dba7528c2846f4307cab89254d745e98e0c2c4164c54c104144c14b9bb8f1ecfc2b7f499d79d9798696ee9fc4daba6647ddee79aa4f3373235f62396f4b19a1f2c24b1bff1d1e35968c5b2a99631ad9a9f9497b8c1124d2c91c4dd5b79e315579646388d7b75bfaa2a593f2ff91d3b76ec68e97c84a2670de312a27beb8633edf50b46b6ac3569949710298165cb482596f669cbf9081b51a287962def33132501ea21223a7f1f615b3657f5d35335c21a6725df2af34d7f6eaff9a6aeb75f01f568bd2a317acbebf7001111bd995b2fa4e7ce42be958f54a4f4fc1497786353a5693cc4cc296ebdfdd6d94455d6df723eb2bd912fd2d266aab1d1bfb40bff2d5a2cafb4fd7aabe9cbceaf617dd6280ef22d7d7eecf32db763b8b5686b1c8bc5f2aa6ea26f6dada299b667b373ddaa524eb55ac6925e76c66a6c5eaf22568cb6755e65ead6274a2b7796695c7e7adaf499625a996d255e773ed7195e33d28996379b363bd1d7e5b9f589a2648f8c691a0f79bd8a6e7965fde34f734edad9e867e979bb6123dfdafa443fe6a3a847cc3c33ee73e83ecb13b5e5fdad6f6914bfcdb7be158b7dcee87726fa56a9aeb71afd82be611bebf5b774a6694cbb61233375ffc6dd505cf3e9a9d5a26f012182a238d90d67da2bdbf09132df88b2c6792d53226a9136733eb24bbc6ea521b5c8a6fe48d523660e82a2f847f77d3e6836ac1f57aa477c60040c8c308111594623b030c20a23aa8c463861c4008c40c2dd6f2aebfff5385fd3c2dbb4f0af9bfa362d7ccafa7ff1b083fb070220488c456881c468840e46cc50c3da388a1aee9e85fb18e5071367330a0f77c79979fdf4bce15fe74c2df2ca1ad392648d69371f45e57953f74e339212bcb129cb4a34de18882a5bf39a7d80a56aaab4f13a649bbd5e45b94cd594062589bb79e25b7a43928aa2421071f7117c84b202941bee4474518514e0ee311f7d10f2e1c68727a209b7a96b109da4a2283904114d74466f6fa63835883b41c40e22c67ffd018608c3dda7b8abdc0530fe7082ab1ec5599b19768473122c87e6e30f3be4720db395aca115cb272c55632aaa3756822335fe6caabbcb0f01b8e31587613bc35413a7cdecc309db254e33cc1352e3e3132ceefe1b7f2e1fc1b6524edd3d1c82e0c1f8048afbf80489fbbf7ee3afc9b85c3e62c160a592774bdc1d061f01d085d7d213aff8f6b3b3a373ea9c7ebd80d8fe2f130be9b57573b399b97c84a3b4614af906af38bc95320caf387ca3336a84d79ca238a4f4cc1bb6b33653d508962b3586edf48465249cd1543d6138582e4fa4356bbdb6d60cb3954a7acde7ba62a331d783dc96dc16feafb7f9d73ecdbce6235c94940be2bed3d269e9dca0382bed9b9b543d71344d631aecb671379ac643b6aaae304dd378086dcd26ce43922815e5d98acb7c233a2ab352d19acd3413a96bd62197a97a24b7cf25fad439cd428eca4cfb91e372ed2461252611a56ca6f8f522d775e808c990121c6a40f27af9f4b88698446c25131f23d214484620b966e0ce43139b54bde18cd46db362dc12b81ead1c9a35a66d21ec2976116f6d9cfa66b69d7b55dfc67cbccfb75933524e73789ba085a0abb89ac2f211deb1239c33f1a8d3968f7a061e9abcb6d9a1492bc5446bac5b9c8726366b14eb106fa1282ef17acaf1d1490c9c20e1ee3c34b13dfe552dcf8d6deac6e134888f4e5208f2f116c6ad895b0fe7a1c92b61dbdb6cdaecc4ed12bfcd46713acf4cdc9af57933a95aa4a4aad523a997b40ab7b189d5bc8d492486846938f3b3d1f388a128fe117b9ce2728a6d4883488b9c87269f6d6ab9713849a60ed9ceb095613380ed077a065a052d6263a4aeb73423a56b4652678f625c8a8d7c2b97695be3d435cf526cd6a8fb4d9c57d6e38a5afa4c4f6ccb6689d1db0fa1231ce9e0688af3d0e48110b1d9a1492b29a7b37455d735ab2b7e13d3c8a3f4a8873b0f4dde3c7f872638af9f3333d299cbace4a8ab91c14393ff1d9ab4364e22d11307f951a4f3112eca5a493e73265692deb0d34c449e38777793c974cabfc3675a91c9643aed34230d9d4bc6d3dd5da67e0e27bd3eb78dc6493d7ca461f13316a3f19136c5dd93f8489ba155a3755e6fe7678dc3653632e2e38c8bbbb7d47d93d7d9154f4fdb9a7736f50b3a3ece6eeefeab2a9bcde02dd9101f6565b8e7f516fb5c24bb2263e22e93e18c4a7cd32f53ffa8c4e8637dc3b43527f9567a7ecd2c3d374e5d55f3d5ddcaad93f519a7f5a9e635d38a64392d9db7b8bbb7340ee3315bf15636ca659ad72ccb4bee2d9d536e32994ead9d5154a69a4ca6538dbe31537ca371769070d4b3d5d2a56ae2e0bcf46d6f1a8b07bdc30f93c974eaa1a40af9f081a2f8c7ebe543e7885ee32feae1c3470dab87ad64e2c35632d93a9b3e7ce0d04349152a99287918cb23466a784b1bf9c124f637ad9c8d5e9f3275a5ed1467b3a928aa6ea521230fbb002fb9bb9ea567ec6f5a35a791911f4c326db3643813b9fb8e8f3133624ec48688d9b8fb0e3ec25430c2b680ed113683bbb764eaefc83655efe091aaa7ba73686ec756d31dfa447132ad7359e2f493ff1a2a4272a4954d6c5353bc6d38d3f6a9a6674c09db62ea91560e45f1aa7e0e3567da16fb35d376a625fd2c35f5f99f922d1b33dba0f8f3500f26e8e187d6f9eafe1c3e336dab1bff9126dd7d878f3c40e1ee487ce4a1061e5c3cacdc5d898f4db4b4f27aea6cea5595e5d09d93d4fdaaaac4c80f269f4bcd15cff2fa1af7b935cf52157d35c528ae3cf78a6f8f95340172f7231f7740c1b843951d8600f17187db3232f2b972678ca2d8c6cc1a47dbad2277b7c1471d5e87137220410e58725892838f91c90c98441999d0e0e312182c5181bbe3e0e312002c6101872e707080bb13f988c312776f658d69e58abb7dceb237f28389cddfe4addaf27ad3a2ddb472ce260e2dd3f37cddb462ae1d9348ec53fc6b4ef34ca63ef9af586ec56779ca729a8d627fd362e93089fdaabe8dba3f5653d36ab1de66a779c549582e26b1cf46e579cbed47d173c9b7b6527ec5b6ce66ec6f66e969a6f865ea0d9746fe158bfd4deb489feb6f9c8d3e876d1a3db14c4db19973fafa5c559b4cfd186cc77e5565b4194ebde1de2666cbfbccb2d8cbd45fd55d66a48fe95836b1cd3cf5abff39076919f9c1e4df5c71528af1cbd47476e63523a9fa8b6066366da59246f336d3acc71b7cbc95c3256a84d77cfb9de29caaaf7fa028feb1716ab69d7bcda68f1a20dcdb00e158395836ca615b7ace4e552d314c9f59a7ea4de73567e2ac64969e669a93e4d68cb3c1fde208c5a0080977b7954a3033cdba282da2bdcdbfb6ce262c6f355532e4eeff5a55592b97e2979d6f936778ebd72fec7355cff5f658e35e9f6f636633cdfaf16fbce68fb97670b1cfb46d63e6241545f1c6e589de7040be95a4a64747279a93be2553df9669fbcd9c935ea7b9cceb6fadda5ee3b75971eaabfbf5e7156f9bbaca5233e71545c96f6974c5489fa4a6479f8be0deccab5a6a9596f43ad3f6dbc472aa1e89bd8cc8b764aa911f4c5eddffad1a14c5e7cbced7f9ad71b5cfa128c6691cebcd7cbbe175eb93b6ff656aa6ed6fad27be7d4d2cf666b661bd4cf5e971bd2b1f61d428976bf896bee175ffce5aeb7cced2539da56a2bb7669c93ffadf3c628adb4954a38b95b89f39ade90571c7ae220669a89ccbce68d9e1935c2e90d19353af79a9152225b3d0224b76fb6a155a59529ce4a34162ad5222616528f98d9e85c4b6d8423ca3e9cda86b39d4ad8a6eecf463e9cdadd65dc3d0ca13254dad6a53e6d3058115a91581121f77fa9fb6dfe655357d9dbc06af88127e1d5a4ed3309564306dc3d051f6b40c0bf545ad2dbb83b10630de3484319230d5cdcd84aa55585d94aa5f484a5b87cbd66d46882862afc5f1bd392fe65a6385596d1ac6f56756314554b186c678da218b6669dd714a7b52a4b4fd8c69d5abd65339fd4a8e4cdb265494d32c6d0ccc88c20000001a3140030401c148a86e31189a4c628c7f614000879a2607a54180ab4288c41ca2063885184000088012000233233b30100870c9771c4d9b9be941a434f685cf0ca7ac45bc35241f2b7651f01d4257b69c5fe74eb15945d89a1a71d105d63e74f3e8f333436695e9ea6b25b8b3f3cc6c6cbc7a955dde34899139fde3f9854012ad40a07bcacb176192a227440bea0f646564f2802d44525ae7f24c0b449ca238db50d56b3aff93d59c9c926dca13afd790bd040cf3f4be05fb3bdef6bfe474038cd707b8f318ce78e035360ad859a9fae9f318a78297412ebb976efb7100eba64ff94d940571941147c6f108288a8c124925de521644b05b30efd83e90cd757521497dd0052531f7ad94e3497ef22979b59620e2bff8470686f4ba4546c0fed69992bf5e73b0a8c5a80216d69fc56e423a7bd35e851ccf76c7ec4597517bcf39047aec257cf947ef1befbca74b3b1261f5c4a3ed0c37c900865b3843dbc28b62387a4f2fb69b0188bbddcde2f02cd6bde2a1b992ee1a639146036a445ada95236628603d307b7c6155aae4d34874b45b47d904d61528396647e43a8d431df40f058382e3d2efa1a6aa14051122e1e93babab0fb937a9222ff6c7ecd4a0a5e7277f1f3708ccbaf16b5972bd693799884814cd7edec2492749410dc35f1904d41137616efd29495874b0657ef35626548ceda0e118403e4c62d54123dcbd43ed193e101e13a6e57124610d9705f746f2f33a952728fd5c07ee0f388474058211fa7a122fa036d053b5527e18194a825c6d08e5e5b347eda3e0118816001aaf2592651318e86d2d15305238143e1a563e4f65768fb2b23cede819486a9a7f5f1bf49ef399c45ba1b9d8dd6e3b69448901691c606d16705ae32c08a27a7a5126f6f49e296f5a933efc11182fa69614b0a3710821f829d94140ff03f9538c5a88db1bbb107abbfcd08885302ef1bd2f9fc6842f25b5001bbca8eb02ad4c2293aba0b6e52cc8906cef233bd05dfbc27bc9ee4ac3b6993b38b712307e22bc3721e8df32e37da4d485a7236c751ee6a8a7e755ee8625e009596b537710ef140207339a03a80e01cf70fb46a3504a9a862da42610b119a1ab13b85ca3bf91ebfa4ef4b7de539b1fb8c37438e6b205e40f2732caec2d229c82d64e65f6e4c52d244a289633db145be359d12fbb6d7c176b50de461b01b1612d5638cbc45be4ac8c101668de7286fb143724148d9acbede41839e6e613d0a40542adb4c0401ae23daf6b1b94e8f3cd27d3e7cb0dbe352471a50169be57907b34077e865d3796cec183a390db3b1f42182cf865a67ca8fae496833c4564b078ce29a1e87a02209df5cf25ae2879a14b185f32aee7efbc598945be01ded3e1d47fd1777fa19d85ec75c6dd43877370c0ad81764d1401dfa1d3893da7dfbea8fa3c29f0d691230bb9b02128bf300c8ec1e7f2e334cb9e49f2fbd1fb26e06a76eaef710dd94d407623210ca34a286a25b177cbc262678d2e79c7f5131b277401e2d8438cb763f91803fcf446f6759c9292281a188786556e8f00236c6e3db67a1fd081ad957e1d930b16d65db6d93fe034ee5cebc0fb2509dbcd99036565847a6db0aa2e8553c42ada772da1099006e13b11e81a997bedd3f0f56578578b5eb42beab221668cd6b8f2961d258ac0a637aaec5f39ffbfda8cfb2bdc206d41b88a20f92eab14bdaba30d363a9092534b33c1b294deb5079d0ffc4de4ef523a4d46a385e5f4e793fde7cfc09ad4c05f5e0b0b382377bbf37dcfcb19a7c3da1b64e89330fa312b20b0137d7848cd932aa2bd900c1b634f42772d62ad91f61346da84e5e9594492b816ed1c4c1c10be092095f7222912738b0c6233d5bc55b2337acc408ec7d0322ce93a174631d3f213a5d162c6d087ca13ad14c4fcbfbc2ca5bb4711a15fa189b656d122bba2f8589b6082fdc2183538a04f14b46b95b3b5e3d92531c949ec19a84ae6a214d33037aa7bf5ccebf2fcbe542e8e0392817549df2ee242ce6863a58f108a3c90ad386ca7114fa21efc3b2bd683ec9c84933314ee63de971273961efd201797814dc618a741d83a38059a7670d9a99c08b03c6b04d004b42383330424e2bfcbd55150cd950c7beeb822e26f14f88d0d082e0555d8137175edde78d7f073684c4904bc4c8914dbac1fd582bbd6687688c3060fd27a6747229108fdd8017aa7e1fe8c439f8a3c0ea9c5d773ca90fe6cd563a94a6c7b6f216de3e6dad87515f9da7470bdcc46a5b7474e50250781ab802c4c6f2d1236657ac5bad1927e773d83555b345d0821c8beaef31b63ae7dc64b9a3808d2015810a2228f82ce8bca1e0b3e8693422316af800d7a15ed544048000a30405b2d558c4c265a2265949e243ed63a844ed214c7ba192fa4fb45ac40c93a41b1af163f272517a35ecc092a2b54a2defd3604e8e7c32a8c8454b39b0f4803dea7081bdc802482d5bdf17a053abf7b0f654e98f56853045994c6efc284b64affbcdef8bc08a3924ad83d0bf9e409bdd693a69a51d2fd3cd0250cb5e05bdd520c1094d1013d83e6a165306bbc70b0e5f68f636ed76fae616fd7ad23a869457a148cdedbb25934adda015b567ad34501a4c3a66e06e2bf413303be00af48f5fd7525a2b14c09c3b438ae4031c3ea050e29c8aab6f1b28b98e3228805a060d4c1f59f02157396723877da112d28eff03f78aa6115d98a770461ced27288410e107277692af29d9920f70513b5f25cf3670d35b3e04808f5c1dc575a4bf69653ac68b1dc28779a7b8e2d2c6d7a18e1467dd3a55822a5b0043146134c55d2c36fe5d6765c7cb60c3ba4a37dee4f0956d9f8239f68d3b1227c0d05c8bec02a97c9329711de047c4160f3a7e57ca8774850c4c88a17ba89cbfe58ffcf10c046d1898a350e5bc2e6e823ed0c40d34d129ce262dc5e6e51e9d92aeef53d362f1566bd9126c9e2357e5cd2afc33b93c3704aea793a05ba46cbf2692760a3367f0aead1055e3989b6a5e5ecc8e52478dd6e9ed25d652c5a81f4be67f4600f81ea17b372579c2a673f9588ea9f16334d58acd710118e5a91b2e3f1824057a1702e30fcd1b6236cfc635c82fdcb24d02ee9490308968f913a3fad57cfecfc7ff399450396a42a3b286d52211beb912d7239dc55861f200f43d12f23d26a6514bff07988c822a6d9f291ce998ffd42a09e0e55436838826afb147bbc4fbabd6e252f16b5568140d2aac8aec316681dfd6c767c38f1e4879833f3e05f3f8553cafc15008f7b8db5df5f1f7a3bf4f9b5fdab9f2bd06713cb448577bf144fa27c2ec14f0719b3a3c8231641dbecdb1be1c08dc7ed8a597076701c152f20f764f5cf8b3eec023faf428a6713cc00232e6243960377f487c4f808fe3f790c61b24761f36d0ee53d0c0447bd3ac7d2d71febb721f0a6c229db8ba1fcefb4b659b58b8aa03f0f96577991d27ca812474416470e5e384116278231ab28b6cb0133fdfacd1517949cc6d10df53383e701190d6ce99e24521238ed5267973f1bb20fc7eff3ecba9d51c24ddc67376d421cc44759369d3c6a54d98c5bb635b9c0545913245f0f2a63621a0f0d8275704e2bd459a5ec8c45249db54cfd109c5abbc62a0c66a267f82228d2a434cc5511bea614bcf3ad1e9be381970098dfe0586c84977dffc3829e4f6cb98b9a75a38e9996e8e3f0b2f7a4271003155624b40d08da36e29bf5aa9ab1eb954407aba47971a69906309fc6f00b5716299c4326a987d20c5bbaa81596067837b01b94fcd591784b54d83a4502670406c4c5597f37778477a72530263938c24c12f6b5d3d4decffa0820b1b277433450f382cf544a7798fbe1e7a6497749aaa8a257f73bc05f3346cca4466361ff72a12904a9a2fd18eae34e7e0daa20bf7e0aa9930dae7e1886e70d02aaae50b15306e25a451b6f2cdbe097b31fa6ef3311f34dcf7501e97138e7583bca8d3753b1e3654560dde0200a9dc79328605d39947fdc9698e064ea648b7ff9e3c539b2420a667f8d23b7424d0b79c9a02fd02adeb5acf9ae713317224781bc1bcf22be29a52f5f2b28765dc3d5337d94543eaa79e4875a5ac36efdd388824443eb2dec150939d847f80300860b43885123039928988564ea47e4327973899ce013b5d7ac4e06513242a6f093abb2aa2ffb92e2fcad681934674dc80adf80952721709e9f3bf08a4666239126569bd63bda334eff87baa2880b584cbc9851ac57c4c7fb43a1dd584a7ee3a547d8bd4da09e78eafeff1d223e1e54647340edb363998f06c3fb068a21e56ed92f19d5a98025bb01dce85a7c0dd8562e77e6d36e59ce3944121c2c1065dc7284cfd9e8d0b7e3f6293b67bae47165bc78e207e810d19638541c035204896b04e1327bc703f4a97582e14c327c78a7beea57cb78ad9d39ecce6bfe2e8ce0cbc5acb44a93452d290fef6138b89c128e0bf7f8fc6a6caf8bf3cdff6dcdcba1c349f33e1beccffef926fdf79850d4623fe60a3f0812bafb30bdcc3cd0bf8e952987c6c3fa4cc659db9f605901013f754c7fe6c63581a7f9faf8d8ebeb287dccfdbf667b51caceb6ff48b6e91350959a858fe5644492c3d4b06e43b27e6c982f9348694785d20c1adc60fad81300023c3a18e0810640fcff3af0d3e39c10e9b8d7ddd0b3543c9bb678f6794266a092d3e5160648f53129a884e762d0261ce7bef877b6206fbb5662dcb2615ee507f50dee51af4f543b4b7effc0a6cf5031787ca6b88e62865a7647a735b65ef30db6fff12716bf2c2e2005f3f24eb5e8fb852760e73295a5bd4e27fb5ad044746d2c3de0a378730782499e246646e2a49942ea484fea1d32fe8be076982cd1201c25969b71b370b9574f4d01f10962ed54af61358b13e6d13dc53ad832055f42712284521440d740cc26b120933d01d83e00e8ad58eef75489ff6527fde4ef6915f0446df6944414d0b706b8b2290d9f3e0f619ea01073ba0bcda73e86eaf442833a8e510cf95da0e58f6decfc07ed4b88bce4c3df3ae733215d84ba97f67bf97a2c2809e3ea18e5627766406cf3e678ebbb230c1f1b1f66daebc2f18f092e02ff44fa46feee4d3c021d318f1fcf4b470e488ac9887afc0573152e9348e1a77cbe682c6b57ad48f8a86b7cbc3bd85d3f5f841b11f8a50e1af4849ed257f14103ada16fc28755a1d7d18fab5545710b087747b12a796b08a6f7efdcc55a1fd4f9839b8f2b508acc5ad5a94c5a4a4d82b568deb49a11694caff76fa859a146990a83ed0a88c13678d26525dbee8f1da8e75de51fd5c6aeb62dfe329627b62f68205ab1c7db38e90b48aa7f8707172c7139cb0297495b963ac621a291455b0e760f8c2cdaf3c9f51f18aed538c7deb2ab3d2d3c6953e9acc1ccdb535a0d16a982130c8d6d79cce58c0968e55bef1f00bfac3c9754d1025bcc0baa6cd968e19f83e9398d1d8cb6f20f978ba1add50e514d312e6671cc8572dac36fe8ffc9eb764b6cb505671d64cb6cecc016d978c6a0dfef4661847f3c9c87486b84dab9246cd217b31defe82073503b5ef64256fc1a9a5b2b665941705a3b941cb34d6bf4f1ec7974d1a24bae25aa8686813eaffae82ff66659d8b8f934eb7eb35c57afc3d58cb9fa19d8e03d7b7a2037a19b5c2813211b4d300e46264ca4440f95b704bb371dda474cec62c1718d93cb8a7594e695ae1b0604d64113481e00e1e0cc0ec00ec58fc58e2f8514d921edd5983a8874f0c6237966b61cde949ad8d9c2f74792c6021d5f151676f9b087315726412f24d6f3fa678c2cbe7aefaf13e623b44edad16c6b7be0a83cf98a114a99fcd8064764cce17a395699134532362b7bf99cf0cd704f6a483e60f67853c4cdc6ec393d0e3047c6cec9f53852902b8d73ca2c946ecb0e3ac17ee14b63f6f1e3293ef96e13329ddeb2ccb7ab7a61ba99d0cfc124c96494f54bba2e9dce7289d6138ce8561be297fe158c2d134734b91cb0ab1c044fc02876d02afc65d131621fafc413dcea769ef6b2703bec65a875a503116ffa4b83388b85328c353805476f3602fc71ea3c61d533e2ee4ad9ad74f5d3048d47c0862352a7e2aef513d3eda2c7900262aa07022e8590e7b1aa14971fff89b525c981a14c3cd75b38b477c00ff80bec8a516e0fbaa924912d47938d7df98b0d1867d0928896bc6ae6ac66c1a80b5286e1283861beac540f5a55eb720e91c990da269d29fc505d0ead722a6c33edf912ee12566c05420887831d0e5be0c64646fbe15c123c45962fe8cff4fa22fa05e57062c02682745b33e6341736608ee0a109a3ff972cde11604cb477247d9c53123fd7eaf3f6991a02a3c7ee77d6dc4ce579f746bd80c0ab0a94475b9f1d0512ddd9424516e537341220a48de5f1de1cb05cc70f4ca214c8f2058d04fb6d59c81709da7dedfde3183a8fe9426bdd381bfb99aa14a274cfe3d847810b50169651faf425f33cee5c4f5fa2080b8dce31d1472f5a00762f3e601a71ec97b69f0c0934350507de832a9011307b88622014a3140859fe641b517ac20f9d47fa1d29505eca14b5a4e32880584ebfcf215be7cd2ba335895247bb8512ef32a695ad18dc003c11582c80b758d16eb325854ab4bdea551d79078548136a337766297fb5ae5a3ca6985a0c4771cedf68d10ea61311dba06b91ea085e5e3cd004d02d05000f9983c613126080f20a72c97dd479b4b1c101b2c4a235f08d41c5e3a45bd539c43af9233a2ecef28a09439a4267c6ae8216011bdf68ae8b733d97db44655f33d129ebff2bb2c11b858dff1caa0b338732f167a3e665bde25a3b8e09b2f9370578e15b01309d153aae086326c528298cfce88cf5867e8616df6e94ed9980cd5293d5f5b5d879128a1358498a768bb971e3cb48531e7578c1842d8139e8e5deb0f1aea28c2fca5b48a4ad99b51bb3d8d2990fe56d4800af236068235e66b81f3354d136f515d4398b9a53080cea0582ae8a1f93e00e63f73255f8288f586456324fc0e0a8f0b46a75be92b80a65a95d4e38d2e67389e9239d199c290de8571497e4dca9ef1901a1f4a7f89c18fdeb2e85a5012fdb63c57e047b4e429e111a6703072d678c51f4fde4a30c649fc6e4ce532a1c8d827796e513b24c4cd4ffcf6a50723e6b006ade3c1f2c715628b6114df5ec91a203e0480849aeed7c8770bd484050851d80f93e0736ae4532c00a621aff8becb599c3f10dad04c3d993cab5b4f98a561fec7252804c4886e77f3e10ebfdd38fd833011b79125c5ff7c7390df511d13e41381e1662f90b3c718e740a27ae22ef071942604b290abefbd85410142c9388f7d78d597f83f32f6782f50f6ca41e5ae61782086e15314ee7d7b5caaf79d0a15e019dbf4b7d6fc4df856204c60dc90b184fd79f9b3813e6f930bba6dc0d686f175f47932e26437207722d8e10350b93558cf2adcb39b432df4d937c8da12bfb4e1e5e79c32312d1de99775a7f6867c56cbe8ce9db5a68c3a4c670105cf8a29b7448b7ee55c93007647f3e4f4e900b710aba5c287d94e5a699c2c17961a156e6f7baa82174cd1c289e97b5ac92a0df713568efa4a7781c7ffb25aed2329030453485ecc2fecdb5522666a7f110f43d9b8d814cf171693ee4627fd3b74d6f72cb30d5eeacb2dc1917a862eef7f245d159a9fce1b6b42dfd039360e866318e1b9c68d17c9769f549d25ca6fda3abf0ff4f0fb397ce4aa51639723d6c5356adbe3e23446433a8b1500fdcdf4081d8bead9317f2734fa908615df5cf34940baabd7dcbe56413e43d0efdb2ed17b51edea1be6e2e03bc454936df84ad2d2ad0dbb44b03d2df10c4092c2b364ed259920e84c81d69e0f2a4d243ba882f68a5758c62d6938e8a68c24de463ce1cb575c9d322d30fe8501340f5e6d4f223e4069c4fe9f2836fbfbd3b37967eabdfd1e8ffdf57331bc4efd77795c87586fff04e38a48439e492249d33acf3e9b02a910d441545a2d291134c5fda08ce3e2294789702eb5506422c0da60a5f4bedc628f52f099eac63db1f6ceb064766af4eac354871d9585fa21cd5ad818a76d52552c17eb0f395fb3d7e005502b45b5d3c392f42734201c36fe8a4b4514f37f0f4be16b0203a1075340b2f3a2b16db15b25a1479d6cb75f4973fa40ac8799fcd6819217df06ef2e8c49956af6fae01a45aee0c82c5d12a9a5efbd7b2fa694e8d4f942839589e278ece1f922d053de16679c9e20c8e4c7136ec3975129209459459f7d0437bc0bd51ad0bf185a507050b8f873cbaf10724e642f6edcf8a7ca89eb34f4f13f11f0845de4662ad8fe3b5f4ac526e8ea1b07eeedaa4471b7ce1050d4d975c6de083a015cc6a1e4977e05010402683ce5b07ea4cd7332eb74f00f3d26e7532b9340a8ae4af379a8ae10c0e81e3e96fe20d7c5f00365ba1c981a1227a6770d41f91d83ef06cc38d133b0f1be6045f425d0ea6669ad99a1241da3621343c3c4085c6eb7858b51a27fcaa991c6a12332f5d82c2807fcee3f95349e1d2c624910f37742619e7eeadce051e5cda07c99a016b65fc73c7ec9b4fb0b2622e279dd4cd15e3dae50ac25a2a3b30ac2e47ec96d768c135a315a2e6bfd464e57f3b106dd1436c641c9b599d53589f432ea8ed17567ce1eba340a161c092bc94e87a9390522f71c5305aed7fcbe6dce8b5b09836f8b4440fdcc3572b7e4a1f24192e2307c67703e2b3bca87664d5df7bdfa88abeb7cdb622d0929f177238d245521bc1a80eec5c2a68f86a59366eb8e73dbd5061d3adb72fea64c5b6bf048da731811712c38d0e4957507645e113023c84c85b16f556926a7e1a84efc355440b744c31bb91cbc5a6cb66308416fba4f2af3b36a382d974461c59de5a12abd2e871f8ae3c86c8f231c7b0951cbf1661dce415bffe2aab18e528c4bc9259493e234e0a39ae9951f8ab041237f740126c47f26ea96812142c5ca66f0d8d89d9576c3d61ed3df8c9d8b9a575a1e121c07abcb9b299b2f765033482d16f59e03a958cd6ab1cd8d5d6089ad289c5d5b455298359af79c864ae0b01be191c484db308a41bc59e953a3d028b9a8ae9bb0b835a82130ca3bb809847b6731772d07d7634814da96ec0c2f16fa3dda7c67a87faf07e744533161bfcf7b3bd1f676530bdacdc4e027b15fe8ec19f62cc2b7564a61f287db6b1de978ff359c8244cda70c1aae3e0774c49076a09581f3bafa1c4f4296dc56302c0e06a460d1c89806603dfd0fcc829113c2fe9b4b32d3844b1c2bc9b09d8e2de2ae569e0caf6ed820ecf3cf8a8d2be86e3aabb5a410efaa677219997d842b086e0862bdbc88f197c2201efbdd2baef219eb28ac12bcf7fb476fed052ffc769b22f7c4e8cdc29536159b9ec54fd15516947753a567226500f22b30fe10ace41ecae056d40ac614f7f1e63a63f2f26312144e4f775546fb3dfb71b21d2f3a5139e24b062031a046f48d3330d498ae99f0e535b44ce0349a0189b83e795500e533c2c5792be580e57f3320ac444d4ee1e3ed70008b42d8aa323db347780dddf49f301eaefb7a1fb6b5249e0ccb48762ce57ddab5d684d0662315424592c1270e0433140d54866606a1677168ed42e335e3dfc81f59725e5cccb93c7c42226cece8b8c5f91e9b823924e8621ec389b73522eebe6ed20f7e079b5eaf9749414667f84e461ced369ddd9e1affac13977f3ef6d89dd88aea0be00240f8145c5eb95f4128f4bc3689ed1d4d06c339b4ea67d521359d9351f09e2536c73c190c87606b22962db576f0e8217042e93e0fb1f8e97f6cfaac7639c360e8696d32bb332b0c667370d7499766669a8ea3b0b5892daeec3018cca17a27599fa9d13894c2966eb2b8e563793204ae9d6c7b4667c3700ad8ba41dd752e815bf6cc4da06dd8b415cb26041b966b6559135a0d536ae5713273d658752fb1d3b0557a3e8383c87e793904cfe156edf5048ea27beae9143f023bc5b7153808ee95b76b680c6d959f43e43cd4151eeef128b65b3a4e9173b4557a3f8199260d24da23a720703c381c0d1a3a198716d01bb4c5d0e3d9eb1f953c908c7bb3ef3f1e9f8aa5a723369e50ff60b9ecc64e696732d76d0570f08e896a13cb3cfb9418aad423d94c53f9bb6162cd5df61aad3c74dc1d0f6ab1c5ae7bc8d837dcfaca12b5075b7ca6a79d58dbd2d01ce9371d1a88fcfdb4dde80a80e9389df447f1a51a904f86fd3098d380b87a249fc490e3b0a1ddccc4981706fd1c10e04a6f83127866921db22e7c2dfa417a482fe9d45f09e0708f2de24f801d71bc256e739aba36e7f4e019934049b86ecaf296024620a85b77512e62f8e0eaf938fbc3c712e0fe7d90b793f99944b3c784fe7b33e6ad566c91e5e841ecfc6a38326d306ace6e8d93dff62cb5e4568f4fc55a7041523aad274a3e72c2eaa3180023dc047414fdead07cda5e6637addd5545a3e3c98a166b3c0e13d8071513ff0c474ef0c5fe9bbd1f092eec5338b43fee3cad09526ecfd8fcf7965c8341164bfbeaf847b93cd194e4f1cf5a0ef16d2ccf0b663a5a1585e36bb187cbd5fd79c45dce63b43bd35ebb1fd686e63e737d6decf10302c1f4356ea572d87e465812cf52039d27382af4ced5defeecd43efea18a6ea42195ffbcfa74aa059e8695ad11e9faaece6e266dc62b002357509acd446a48c455c68ff19316b276186c897efa36311d8661b83504e09d5dbf37dc894ba0c86149a6816c6e5832c66d77d6847673b1a42301a2c4efc69f1293cfa6cd49d4f9331c1617274d8621d75441d1e56ea17e805ea1726707adc52ff8de8e1a7e3978d112abfaa5a132fdd41dd8ade3e1286a9a886bd6fcc0d7aaa5c6a275169e283c7704213b16844079f56a52f28ec7d88dc55070a9aca96b12d755f53b8aab8413fa4c371c5f1c57a96840538fc94c8cd76a30e296b93cf9d9b9f6e50b9105bec55afe30ec639d335d7c29f1de7bc797ab943de5062df31da463faca27cb6746a867ccc16689c0584bd535657bee7c35636a5962ea044149a5628df1f9f1990ac5708325595c3364d9ff6d30a15a51537b72e3b6ce1cca9689edab3ed0b199cfc72c189f3fc53945545a5ea4bf5a492c1c46f67d8892e64c26a029d9acee2d95bce81b07e563720bd7153c1f541c353536988d9b6910f1bfa456680f6477f812c9dda6bf5f576171fed62fe85103bf3647a7370a12f4d96232bc43cb1955686b290d508ad6344dea9ec2228b7d5770f8369edccdd312a2858afe9e1241e8003b5375dc024af6accc816abfb3dc70fb8706d88cca0206d70d96588b43cc4d24e8db6319290695f9307a5bdc5883f50764382a368f24339ee75b4607ac992c883416eebb46d1a803e23d476ce449ede8d3bddd21eee16074f28f2d560762c34889680a9028f0e085ef4df21d8627ead2ccc19218f5ec56fbe3c3877185fe5eb1d696bbbe58753fa3d73de8f55eb5cd5ce182fed10536ff457bc53037fe11b85299f7fa46d3f506708a297f4e88e05f25b4fca5eafd013abd2fc8bd6c591ffc0ec64bf852203dc84cfd6b0fbc5bd377820f6cc54f7bcf9ac7a0e8411acb7d418db4f73b81c51fb9376fc84faf02dbffb51fb29c6cacf92cd3f514b793cacf4abe34f89950f71658cf6d5af1e3fc809ca3286c079c9297cae782202323fbfbf069a601a4613c0cff12afebe9a8b317324b12972fce892b3bb4db6b6907a31ca8856acbad574a126c9be597e9ded6489d36da07eb366bb4121c4f6905366833749b0049b1cd3d08f8fd2069b471f6927e66b817e87110bd7ac98ddaac01ded1a78df96c07f6c3f2cd12678850e5f239b9214ef09794dfa05fc73ca4fe4621f68f4c8db3d6af65d7b10c7eb4cc767b5fe99d1545b0f2bd45efcfc8eda2fa6c1676c03d85f213779d82d39c866213dcbd9c00aef71411cee71fb1fd8f85bf87cdfd54a5fce97f97acb98f09dce1442d70835805023a6dfcd98dce5f3d12050c8ca0846be3ae8c735cef8c0b98cdbbc07ae03fd26123abeff74bc71a3a5e402a7acda2b7260d8f5c736dc8f8f263daa77ce99e58befac55df570dc56f0dc6cba92c14d2d70052e926e72482a1ffd7f015cc3a5f014ecba2b37b51479834b935d2037d27d0f89f9fa3dec409a19829a1697e175585f1aa3a0883649814133a6febe1809bdb28eb4f53b13543e2197438a8900f18757618a6a072b87282a323c1824db2cf6e1a3434e80dabbf370ab318e583abd6fc6516cc753eaec6d599ef0170824fd88fdfa24a591714fa1c242f1595be193b1dec2fd4ff576d55369c4a8bdb37f847c0d0ef82387cfd7a4f7b8326203a29680ab106e5db8bbb881430b68fbde1d96a7705aeef59541d77166f105e3f70df5d2932e2a1efdcf885002b38abcbdc838cf2028eb5bee381df6424cf3cd4735e85050e2ed6c4bb236a721b870ed70b55ad87b3c9925301e97a16288668d46cb4f7bca0c0318a4d02d877ffb973435b2833c050c4bd1a5b7fd1e030d61ed5a6f9141cc97f6a0e64f816fe4bee54367544e71b0c88750b48cae80f79559a5f4d4dbd8233a1b19e160ab886079e353a5f2bd14a033ea362111ce184499570c15bd230af7e9c98797430f2940cdca23c077e9428aca16aa816e0a7c9bd31d9a8cf5f66366224587ac1ef0906c93cebd96b1aa366d44ecde706e89ead486813f7e77acd0eea56fbb64f1e828f21ad0d1c50f3788ad17a95c6f06006e170706f7835ec1874656ae1fe8653d61997d7cb0d6aca926a318ea96d55811fe1dbae0611774f1319ca2c19db71e19839a4a9899b601b5c18a72c810ca3086758bde69308bb6ffa40a8b9e9efe9d354d0422686528703be0d94982ac29a24af7ad940d68cd6bbb14928cc4032a27f4213e97f984c0e5f6f063158b8804f95aa2578ed2ed85b50711d81eac61d5dd0c81e0ef94ecc3f06146ff1bd11176a604fa6aff46ac2d71ccdf0b0c31184b13002ff4553cba7e9be215366093c089e2e0071fef2c7d20d1a9293f92e85a5226daf40726d1a5f7b0f8646eeef5d2055c212718f38a2eea2dc664054e059135894e7c792fd1a57f2e4f0b0a6264dbc562588babcb7bf87a563687c8e6ca06288660f923baf8a4af44e307fd687499c48c3b9e988c7e4f32edcd0a7f4113fc9a756cbf98c150d7ac7ae6154fa9280d1320713c1c2fc1a6af6a9eaaaf75284a3fcc32f7652b864f0475ca3c92cc6e4cbdc31079b0f2f4926ad72bb6ac140312c06ad0af98a6ca11dca780ef2bfaa12f4b6b3d1266e65417f5ac840a27c4808568662aff68bb1851e6b393831025e9e4966667b66eee1ac3f4b67eedc831a0f9aa08b59313f4d2bfa112d82b71cf252da3bdfe6690780ad9d8238ad111988baabb34c629ac8cea698d87e500d5329dda17167b848cc6bf5aab2fd424c6360ac7c758bd13bdf9b3586011ba232c9aace4508925d4ea9b400a4de1e84a2cf421c67550bb8e58c13b66559707616257c33107402c5a4b7a5f0c4162c9623d6ecbeacf478232c77a2a67ae7a2b29d565051cd0810b3a43a00f87bceeaa2acd4f11ab0b4f8adb100a07abde2e909f0dd21762cdb61831e54aac86079fd33ddec930ec5582a81ed5f050d4dc41b09e72fe707cd16c1a302be98cb4d7c3469f168ee720a8588058de21bb8012a436815fbf47d4ae781755e5f2f11d35aa7a09c79748924c40190ae1f8181afaefacb2b420c0e1e91d146e0b33ee4445fe555cd799e7f88a4c988ff16ee8db97461c4a31cd63f09835eee54bd1e6c0896799b9f2cce3f79ea7d19b10643fbe5d84280baa9a6875304cbdc4ef0298762092f7cd7884d1ee901af21781c59a141542b0149c9243320c66dfd56f4ef55abaaba7838b4e38b73eaf56ca1da7fb6f9cc213163dd24cd86f4e793582a44c6c272fe0128f1584f9bc85789120800e0b0161bf1dac1b23946334621016cc086b789c58c0efc237b14b8037e112d515bd4204ebc1147e379634ef070c719487a47897e50b65afcc8dfde2061e2185312300bab271985452266ee4392544108d869b253e55e86e4489f40a3b3099512c8f1d0547c95a18732f742c9534ae0e2c1cf59d76ae227a245e70d29403a4ff281215c12ea312b0757063f9d28dcf45b5a842dfa4b1d741d24e2a8050392e03e04a305efdff0b3244e840f78dc29274188e0d802c7f933858883a16f2d0486baddd7f17f27193a1a750136ae3db4c95052b1c6ceb0f1a5dc3f1805c8775251ba15442e6b2182da96e04daa9d0b73dff79dc1c6017b91267f05dfcc78922bd7724c78c4d993fa0ffdd85a070b14bdee371d8f0dd840f8617c7f5c1d8b77ef69516ba0b8550eef4835522c750b08b69d6764b2408112f8a31cca335c5b0d333545f64740bbb1d47e150b966c9ac1d4a63452a2c283d34c11ee73067146f1b50e607e03c0a3dc57dd5ec0e87bd6c40e89be3f759e28bc28fe099ad2359a6d1723022d77db5b75d727e193d0b7ad51faaa35343fb6e516237d03642dfb0b9a61ea55c1889ec228ca4ef2d235cbe43f51f91aac8b3f1c3bee5a9534f3a9660beeda5150a78782ff9ebff8e660ca82dc744d7624a0f45b8242f43a55e786671372e9775d6d939de160f2b5128d721578fec0a3c872707ef152fea513f1016608febeb59a39170bbaf406519483342f83044c80be9c7aa88f09dc802d9f05ee4e2d7ee4ea5d166020dab03f76c2237714bc247db9998313d383a3ca257acaeaa9a149af101e5867a7e32765562f2849d81e4da7176d20de8290ff43201ef3cc96e881dbd34b6c7d1af96ec2d8ad7368e62284258582fc37b4278aa5001910eed19b6e035f2a3bf8f0ad65f1326dea6403f91a5e6e83de61e42edef9897bcd65ef9445fbbaf9fc350183d3ffa8fd33e6684f947c226f7d16b51cdb5862420d8d03b00b9e2e2d118eaa333663686d0c386dd5ab5e4f25bad426db909da944e152d7918a099825ef8bb61755c696c7024bbd045ad01c379636dbed3fb17245f9e2050d123fe447fc61131ce6dc19ce52f38364a502981dc38645ffa9e114dbe144ef749746e7442a29fa7fddcaba1466b289dbc5888633a9569d4dca74fc43bbe71026eeb1871ebc99fcb8a252d57632598e58585608454c807707cd873eb79e63c7405a677b49f99f9db3de66ec1dfc825cb3e9ea9302c5483d664842da9a5a226a9777b71c59e75371a146ac1b62cf6ad0504b1a0e4138806df5ed7b325b8b7318ef447b1ce23ab393ac580ecd782ff44df88bdbd849f9eab5d11a8ece8b5e748ce7745405e14082f9eec62bcc6259041f115c68b7b0f34b01bd5fb1c43bdec870cd1b09654fa2eb47444ab8dcba6fe549ffba09b57fa70286e46ec558ca4df855f5e2b20953e05e81a222de5df747ce799c96878788a8cca997c7ce1d596dec9fbff7e4e00064558e4bbfcbeaedd0b40752c4a8a3dd1b7ad36544b97266f11233da94e6a428a98696b28ef6a8f5463c3aa8be553d430a0625ebe40a6f13183fe6d2e9189d6e58e34a91e8d9ace9fa861e80defdc2a785ff94ccc0ca383dd25bbda6abed14dc81dce0b1b8e527351b6511601d62c68a8e78c916936e7c211a3327e51b2c6bb17575913834e69d9751d29816c67ad8d92762a1d817b85e56b2379a708e04d05af318b5090c473bbd81a62b5a9ab87f5bdcbb865b13276c86fa8389fd8a2c0e8bbfb5ad99caf009d02dc5debcd70f45de898c3be1190935024a6aa337e893817607ae6b2d32c628816f28ec06132d78cdbb1c6b67ee08e48a9f1f290732e188e092da01cf176b7165292f131b687208513507ed21418bbc67e066c88f40462fc3ac3e3ffff496e7aa71d4e38bf4bba333839e0628d4281b1341d397ba9b7fb51c2afd08a7a460646a47c2360f5d149c6a92cdcf1b7df4732634aeedede2719ad6cf541638709e033329eee344dc8b668bb085c0e8aed0e17112f40baadb9e7e9ac35e0ba2625862b21d0f2fb13da7303e9582897bbd4546efecbb510d07b6d6ce863a3b1e29e6691e6f51487fb3b1845c6ec80e00452c66180dfd17305682f2c73ac47a81ae4cbf2dba610b5640d1132d305b7c2a0cb2a9f534f23c099a92ccd5a80731c38b0f82b0c1627d96ffaeb31382e6818f29f4ae63faff5cd10eb98f4b7bae0acd7c864ae40a78abdb0c322e83c3695807da1d33bf0776eba931332e56a31839a16388b92587bd4527c8cba63ebd8f665f616976066fef2c70424a623374e639b3dfd662c09ade0615645af1faec35c7fb6d943ac8d4fb222b4d29bc8707f71a50ed12f6d0098ea10f4802b1f736deb1968e5737f61334250d4c09c8885c30a51fa105b08aa1af1198735f8262f8c08dafe63408f2f26b4b37325629d1c83033b0f8e371a03ee900e18d8f37983e30bc82b623a627a05faa13419e3958d7af22f0ef06c44fce716545eb22422f8a5be6b3e149c210a783a9ba7be4a7dd1ccf0c4e12f03cbbed1d9c719299ee03a9e21beb6317e4eb09088e8bc2502ba29af76ec775d45e684013c4468b3b77b95db197944b71791a3ed62ef2822741e36d4ee1045c4d5b0457378149a4dc7597b4705c8b1959d0110e73183c87a101da8d209afd9432ded98342790df39eb45af8a932e9a8c6128371e6ed9d7ef12287c42ee66494ad5e7ca011dff4fdf2a069b9d582c93959f818d83cc3611e248fdf2bb2a9ca653ab7795fcd7647bba0e927886dd7cb3aa4e0436dff438d4c8cbc556cb98baef5e54205ae9b76d4030a1dc917a943f2b0395dd32f2b436fccfba488c63967fc7e807ef95401e912be4a61de00acce0a12e4c97a49947a0295d15c4a31fdbf12105663277cc8c0598b5a66183bd1c0fea918ad239501e0cd03bad634bdce5535ff343e0bc643d97981e7817a253d2e79268f793939208f8a718e3bc3333c2148e9a145732f21f4fc64b441c52795c0657f655313e67496e38d2d9e2b61b9b000bb037538b12a3d09b5b4b33621eb87def115708362c22c910b6e265ac7009ce76bae69361f7df1ac9d4cd798bc22ff7026ede05c1354945bb3abae5577eb03520ab6e36cc139343268ecf04fec64c456466638affa2b75912320068a1d256580893682baa80f6fd53116782d4496cf361aa3796117802c1e1977481e49a981dab689b94c6be5dde3e275e490f7a1e873ab6f84ed0a804acacb6ba15092f7f7a08ccfeee162aac0384bf2db0856ab0e600b6d8ffc075494613e8daab9e53b7f24df1dda4ffc0732ec0b36d71df171e59b8877ab79bb5ec9ff14c02a0d9d4f02dd19efa47e619e6c0f0d3575fef48c99f9efa72345cd243700fd8520d6092e737e249657dfe68d0b1c7ce67ce4d42dec82ca62099246e90295ad98a416c3b96e12b655a31097ecfba812eb0424312b1e0510459a5d90b19d67800615373b4ebb452ddd63397dd5d2ad913bc34d5e988501f8b223a4073e8077d680b7d0d7d971304a3e553d218a99aba9e5cff80ff324ff3d7e4310b1405ba9d0320de1aed41dc29ca87d4566ebaf6d66e8fa88f0b89d28d3a42ce845ceadfaa12281ab34a5ee30eec84eabc4aeb9b985de26e4714463304778afe29a5a5df8e6d248ba745c7496fde1f38700b04ec0c950324e08b7254be0935ed9ddb3d10ddbd5246cccb84a932319d06fb83de80dd9afb278aa999396f21fc041f038cf1b4d5739e3d03b975761cc2947103e0d67aa02fa7240cbcf534d8abc6f5e8ec8b4121911f55fb7f638ea9a7800077767a5791bb3fa8623462f755e70a655f3a39d358206ef413b02721cb5d0397a9777e675db3c721b6f4274d5954fb2a5795307b99de59d4db871e3c86f56d0f5b16e5b9a5d9d395d3e6c1f5f4cc7962b3b6f71a024eb38a35001e305b25c13946e98a48d77a560ffcec587f764e9aab37d6b4137e07ba2769e03827dad453f79172bba1b8d60d34c1f5a08fd5799cd9a97ffc6553e7ec5e9da7cc6c42454b3ea83fd8cb7f8a1bcf7bb7db21c39f51335eba4076f61e6fd596333f98f05665b3a140dfba9f46ea23656d318a1ed555b3fc4eafc3656d2a20514dbfa9ff51b175198cc97f8aa55acd98da96f514f67a4a91af2fc66c84c577a750a2da8f7d95b3896d4c45eb77e9d1cdb2967c4ad4d756dc3753a44d147c6ff4b79398c0a16fb11cee83d5c57e0acf02ca043523f614ba6d66f106234cd9ecc5a36b19e9fef9c8a7f516a5debc36adbb862baf429bf331094fb88223a17504fbd5c41706a7739a668ed1e6d6bd4d1902b6bb827656c38496f5d32f0e393ac9eec00c59dadcd49ac7db427a5d1318fafa62ee7f301ec325b29dd218b758c12a41a7550259c979b846138074f15ca10753ee6762055077995b6179b33961e670eca9f9e8565ff558cb0c9321adaaa558c80e80edfaa5b49d5b6894a29f6772511482af7b021186d7210dc8737b8af502937ee8080e8a0fe8f4b92d9e907f7cbef9936311b44277a057009089138008b5d40385671639023d73d59f90a07c88e37d82b0460486ceb357b26cf5a262b3571c7f7a91b9c61a3a62cd73513d7ac10ceca41a39cd88e3efee71c21237ffc50a1e9f0f9d085823977fee0d6207ad7b9e936ae4b411ebffcc2fe3b65d619141935587cd74a29a21dd93ea1637d3643b18603b19695c2c96cadd5bcbfbf7a1bb0ea7b302bd8928b47d1e43cf5fe23b4e4173286bf660073cea733a3d6eaf595077e484a2878ab611f151241ef980a6ee157a23f782cd33f58274e0c91c8cbb325e42ced53cb36caa7ec567a48327a81da7f3214505d1f39f32fd8863205281527b1eecf51c2623e6ca1bf476434226ceec2d14aa6c77a60806107f2bf71e601458ac719dd0a6ea358f4bed81803cc5accae63fd642bfe64c280c050b658ac240a00b42725145924a7ea7fb2b29cb2395d9eee1a8a697e536791baa914cbe87511919ccc4ae5f536e51e484448125103d21cf29bd5ebb9894621cb7ada6f75e48331a037519badc6d61266d4a909ac07c726c4a24086c6c7c3205a53be3883c8018042d3232e5936997bd37d6d8ba10ee04dc788ba48786d4b6c42f28af377b4c2709a9b17bdcd92add267b02066af2bb077c2649b8ffe6ceee10e32d4fdb521af3b4bfa39e3ab572ad76fa1672f64e53e752b343a7933af6d8b17429265ed811cfe49444819f303ef93016e044344a6f88981af1ea9a71cc6b0b20520e2decfc489a8f5605509359c130081d545ef2341d16fc3132e63bf144fe19cc9f7c64d8920b16040f972c9c5aae9b110a172dc4b60ca90815c70338927b6e381321ba5f2ca90430693819684fd58cc6f0bd84500a5aebf28daac1b5bdfa485d248baf63c62819a7353d0bc4be51f3ce9dd76b52713892b2e3fc0f38fba7072bf80ff0b7c1600bf5d2feb99863b04f672c7ed23b1697fd16358e0d64224a85631ac5cab8e02243d0c092fed89f34709c0fee5e598c0f7cd4430a9db87620c36ebea1d9a901c422a06a89b0acb14de64fea38d130f17d90a5e3e94242fbc0bf2b3e8852a9f427696d5197b18462e13e388b9f8dae7dc0a76e1c1dfa6222cd68524473362089ea60e3c8c936a57e9a829f7a3a5d7cd3d46cbd479f423d64077d190e2cbb6db9d4bdb60fefce801b6687dd747c26df663db879065a71045c1581ad863508d5fbf2b26aff6b26e78d0b3e8fc285930a759653d65b0950f59ce24aa0cb273f8e77a4c6cf0accd5d7dacf98f427099e54f5f31e0c4207422262a7bf039aa9f19f18688ccfb647370b6b7dae23d0a171503f06efe62366c9759cee59c0cf8fb159d2afa65b3747f565383d83a4784b21c0f9b7893f82cceb90d52adef2ccce1b56fc00f15645f4e3e3ecc05196754fa3a043b977549e81a261be2dc2b255ff59737f1ef8cc9d5dae3b2fb959324000dc69e10a8a2fe565ad4049de8c93a5d6c50f25dfac8ea37a2f91e54a9dbab14f39d0cc74f70ca148ba5fa21b387c7053d69b4da642a4450268e79c2182916776c174b5d488fd7f88f60a1db06668b6d4d76feefe4932379b6126a7f9aa02eb348a6f0955be7ab692d8aebb399291fe5788f533037eb95e9ce92d9adbf2a3498f15d50783e53223a082e7e61dbd524bb9f867dd9f98c99ed8be0f450f534e8dc7b3e070f8ca4240b31bb57753e025774a4e9a171bcf6031af877f2714fac8eeeaf6ff0f8971f097cb66213341d9341af67b7dc180b1fc48bc880f4f0520dd723b9502571e8a83827ab88d64b21f5f350e9f4bef21347f2f070da39f7f23081bd85e271e1aea3429b33695cf48a333c3ff9f96895228a901d681bcca3bccd238b8b86a19661d79b999d8cfd44f6870e9bd5eed1e7b1d137d343bac8539470b5021996d679c8cb1c580b92ba627b059aadd3850de173b15e29c6e13f30412082d4e7a17a4a2171b04b758bd11e8a20ac2b60d4b284f9f9a8bf1ba0ce40ee68e0ae70d3582b34713cd28dd37cb20716bef28fbbebd6b5f0630342c0c4fc094e5a108fa80797c06ddce727c67d17b713b8835d8b75f13609e84caa333942e268016e7e1f1f599b86c6e413adff37e83c0817b1df5881d6f2f625f77f7469190b52efeb25c3a2dca776ffe1189898dd5e124d2468e7a3b9124f8579d1f5f202e28ef3f97756fc71568bbd75a2e9d9fe137cc3eab5586dff0e9778f518cfaf71cb4954e3ff20efe74f02df0ab6a86bdbd3e883280ba3e0af5cb4cb71bb00164da441ddf06de29ab7403c8691ac4c9e7508c77af9ba6cdb9e828f7354ef3c8b98de0b572e277f79541c6900bb2caf94829e8eab66ddd18190bb5b99fd4298fe3ad71df74986df161aa7ee88235cef89b684c1eb5e00199a529b0701c4dd8c468983aa4f410085d0cd5b41368bc266d729394d19b87070a4455c915b4263b049c6772c8d7c67fac13f4d2a7c520232dc5a4c4838dece517db9de3bfa28e09b9d1ed8e7339af8ae9a3a9b0955d92e80a1d671a7442e10d5eba6c845641374141df5b52ed72ae50fc8a378f096c0ac7dc6fa2dd186033b282fe163701af17a3f2f5aeafd986c819341bd4c0f928078cb0c42244035330e62eba117333815ca6827070d7eb5961e392ba08316906aa87cdf3b6cc376030668708de70bbe3f5d6b3ce75d6b1de7ad7afded49183dcbaf257484208dc83e01a71cfc13ad6bdde7aeb59f7bad55f671de53bebac6f9deb56374ac7afba6c652f8de1a1a4205d1696b1d52b6098ab946f4757004e8524a2f76f50b98b09a51d3d967cddaee58d057da671149bfa4896baeb883fbc9a074524dc4da88da5754032b7a91ea944723ca17fad62eda009292aae4a9932ca855ceec842165541f4eb44fde0c2fd3083854dc7adbf25a6ab4665e80d11bf6ef5150d455542d77db547a098465e9443f5fadedc57bdf8d0383b1de75a81a10248caa54146aee27fa66d5010b0bd66bdfe8dfb01137be890de3892cf10458c28c481cdceef9312cb7731680ea67afa8f643af95bd239b5a28f14bb7ccdef40c8f972a58d8433611e64aee3a064fefce538b8f1b49124f6a41835387228171d6f4761344d3167fa70bfb0a7bde6e4e86bc4de142beb80c743096baf2f8c64b8aa4dd582f536a07682593f660d44f702821b58f66ef98c4c6a5cc0bb25cff7f1390270021538e3c466c42bb500f8e4487e2e748de388df27036ac6c637cb27ea068e8c301ee38c1f029e259dec7f681ed1cce412d4d465eff1110893196ef28cbb5ee94fd2c9cbc8ffbc2b8283830d3c37938ced91a4d6ed638a26c2848b3d304618ae3daf6ae1e64d579f3d8ca36cd2d02d5b3c949ad621fd1ef88a438de3a99d24f515e6b4dfafeb15c9c49351a46bd30fea491a4a2091a119accf60c2c7ebd99d68d6455dc209b9c99e744edf23d1afcc7eaedb3267752735376dc5bc426708412d8554876e9e2f73c89ce6c43141a348d63a60aa1c4eb3452ee25afd5c8f6867a1ad079810cd91fba455e529cea99be1a8081bb4649a64303e4a386df86716a3f3c87919c87f4c6ed46de2e7f45b03f04e6f607a9af8faf4e400d4c367504f9db87397d80149a53bb9b932501b6229748c52b3b112b2685a05ea34e3bd30cde7be4a53492ea4f9b2d69e996528f4c2e93ef8cd9391c60096300e72ff91828afffe783d94bf6668bf3c46fd96d33bc11bbff3c84b934cfcb57d76182b82858fbc53d6544df675772ee04585eb5590f822d55a3cd2b06846d79214be2e0aaf3b25e226a3de19f4f2aab08f82e70e617048d894672831bdb925964a4ad9497ca82852c3423b5a2622a3b567028880548452d3a29ec82eee28359aa8328c927da1ba715185b0dcb2d89d0eae0af204fa69d1b838e1c495412dd05686382fadccf1dbcfd3aa5cc11c5bcd97a724e890d3f7a056694ba98356b50169fd4d5ff190306dbe18ce51792c10c9ac04d85b09ca01e166fbc0f6d03bae1bf126807a4977781dea7f5218e768f98fb31fdfec90c7f3c424244934b7f28900bc04dde06fac9bf72db68b6f9da963f38c7f98ba692148f32dc44d7dc1f5103e6ea74a770a9ed8809f161567c8807c3ab9da81b1c862e4c832027ed35a98d520d94bd0f530b65eb7261e8961ca1ff75815d2fc6a7839ed0c1c417522a1d86b824e80ac0b1183955aadebee4ffa1c21c62e845424f025a120667a092a7647fd8e36838f09a14e0526a054d3cfb0dc7fdffd4eef3dcfa78abc2e949555963217b9549240cff113775c718a0ea48b4ef78b635c71c50c560e9d7bc42dce71c72a58adb2af34a6d4d8179738c611d426f948783e608263131232ab0b6862ceabcd4c76226a0e76f349232158b7caad745a37535ac5c332a284439a87992e39f7a1d8b3ba8b746df22d1ab79d03cb984d9ed7323041c358e98876226fafc8b22f5d327784f94a6b04b3e504f7bc5023f4184ae9a730277b24ff149912e0a5eb9d5173ded9c29b74ad4e74aa93e2b4f7a2d9c76fc8516f34cbc286ac916f65fc7a6052e99e0c92decb15100a7b31c00b9e84beacdff92550420c1d9a20335aa343b09b2656011e051edc1366739ad3211a4570df2a039970d4cbd9f6a7e8a45bfec981d14b7793df28004b805aaed9cb47405137338d6c3dde60457578471645bd0c96a83108436305cfd23ca4fb20ed679a6fe682aae109e34b70e65d4b00f419113d60622227ccf54f25cc7824288723a48c76ff2125454dbcf38f629285c5c95fc87883a7983a1cc1c356f0c215cecad34b7099cb08f7736a0fa93ea5fcaf77e307976a89a18b139ca10fb9124122e4b6a021f407a47742f2590188ab8a4702b5818159c785bd8dcd25d0ff49601fc5352e412b07b0144eb976062331b426708fdd6797a2c1c4d19cc57c6710fc2bbcd895b6a3c6d7f0f0a1c5f500f34db2251b429456490bffcb68312fba1e4fbeb58692ef2a282d84dbe9a1284f9695b0dfd5431f996260c0c2c04398386c6ed67d07074487e74e08284f7ea1ffe06e74ba55ab1db42d3537d664c72d29625f4a600045b04cab0ad1290451db001872b0fce2b3c19040b4f8cc6b3c4775ee61222fba87abdfef06e87c3aceb1121cecdc0a1bf689a1cd63fd5658c8aa7b83f2cb2dcc53e004e9b2447c2911417ec8972cd29168b9965ad5c94622301456825aaaa0e17ad1ab4e540d5e6ac1b49cde24368db15e3a49613ca9b0c2a206b56ecb57bb2d7327cca9c16d858a70157b308ace2dd81a958c067e02c3b60c538bf571b70c063b02ebf938a450092b514932d71cb313aff604ea3915c1492dfa326a7de2e450107a0a3370dd8a3b179a00ee9562cecb259cd8cbcb45e4cb69adf8e5f183c77675f993d5b89fc84b0205f5eab25ebfad73d6cfa43800c1f2f4e5689e3cf43eb6b243e4e40fd93e49b7b7642d168b707227f9f492c4315a5e8000f8ecba13aedd1a09aa0eb8c8144f3261eb447019b56e2377e1130aeedd05be20e41aabe0fb17bc36a3b010436a57d961e4edf73bda76ff2f56101a0902bb948743939a77dcb00cdd1a6829f12a4c3ccd4cb6b1255467a65d5d4587a0a191e32b8fd14ce6f195c434d34e8f87a5a63e3641c831a43abe31595bb94ca1b75e67efe5b40e7a3747ca9f08a173063c5c51f9aab83bf47592d4cc522b066341c3be6c9397cfd93742775e0d521dac9b9745c23edccd4119da54bcbf0b2cbd4b6fc5aac4e8bdb50b836a6ccc1cb1312ba31b59c96e530fbc41b37b704e6faef9901de29baf666919bf399d421bfdf78b8cd4de3842a53ad61d1a3a78bd2e37be52e6a316bb0e712da2be6db952d748685173502582852af6ee1ae2cdcb14b4f7fe1fbde1c063e202cc8db920a9ba925aa09a43483b9a7ae27934964cf9322b3678e8921bca246e0e8045d5ada02703624c4414e48e2fce239ee2d5423c58ea61c96142652ce051c000bcefd2ee4b450447f1a8338f5132cfe4a2770c2d2e1f4d0b73b8500733c2768e36e3a28c6505c9317c88f87a95ec7a19b7af0d1384410d7055bd1a3693c58344590e22890040b8548db9f68a4febbca7ca4f4c991e7e4f2a9179463c92056212055e590594ab94e85b4593aad7b5328c97fd5562a6929fd70c407b17474e52f6a73f61263328c2da9772516e6878ff752bb1feca67b2c944cd296c07ca20f61a7d9406ec8cca1485b421f8a0ff3202b116af87246d530605d625bd0f58494a2f9721e0d710820f62803999257c16ac60ddcff386f88a0deb3da40c771b74f9eb2ce31fea800fa85ef05179709f170968baab63767bd0e35c77c1a098bafc317d4e41b600c789b4c3ec55afe859e963469d3b81ece8fd59d7fa113f1736fafde58e69c8c3edc8021f68a47441c19e37ad97a4c2e10e4107fdfbb08b81964c6b7ef33eccb70c15bdc8866f183695144dc2b02329d91b0755e3b6b12fad38d1b1926dc738242498e825126e042b8e31c3d462bc34312f5d0ede9cb41e65ab2f49500e9e763cd50221fdd2236b61d0a97448d4726b028f937b0c40ceec5fbff91c81c57ce95c7f1122bea9087001e5a59afee0f22e23ef460392a608a02a6590f7549023a4902453bbab424ac73916f676173bd4be6df0920eb813c147d21eb05558576cb2d93598b605c4453a8f9ee87f499e02a4ec76d00235169e2e97869ae75bc8c54084ee65a9319d0bea218e6ef31baf4303164c19701650ea9ddf3a5e0910d02dd0ae5ac1920b5960236ff0fb25b095391d990a9b3b8b7339868511e8a1c921a9f227226ac05a6ec5729e37c996ae31647f8079fe80506640b4a7ab3bee823794bf98a69b3174f0cd59f1f0b8e2f619bbb409989430aadbb5185ccda568c250d3a90b52317afcd741c3b56fe85c3b9f0bc928ca680b857aa18b459bf399a031a0f41204d8e1b542004481708cbe905d22ebfad7afad1fa7ce8ab3e15f824611dffaff4e8944b588b1f54424ee134f119488edbece0425d5cf092a41926b11375896d95225b473bebd2fcd49d4aaaf4e4038e621ea02ce54f4bce4f165ecbf7a08c361481ad93276ea01b02504f3fc257b01fff0d0f9a0f5a5c8cbfc0ac96cc0f9001aec43d0d281ff3dc08a5f5f4648bcb88b999c97f428d042b42506f43923eed214410ae53f087a31787bbcbb6dcd8ca0869c11ba4b9873cd190f32367ab5593950dd4d60e3c4b65fc2ead2792029fe244755c442bac27a7ad75aa60ef6dc0e7b9e7d574f14ab74cb027eba908958039c8584af18d404ce7259af82c503bd32feb43a73488ae1ca2490d86158d52fc48231b8650c6eaad162a77ba1c1793df8becd8bcf9f36d9f059937c133976e67e9347fc346863d548fa9360192324e07cd91344b90a90f00e1d1fa2c50a2c4841526bd9efc722b717016dc2515dd83183214464a8e971adbe4a83286db70f4112df93a96b7989054980a014d3c3db8c02b38210243def567940e4c189dab50138585a2d13bd37d6d1e2a176e2577d8e010bbc4ec1cd49018f0f821e8896922e00f49cccefa9fa4f8af615239fdcae30c6ac301d021978e8a0a84d377cd5f56747075fbb0c28e35603a21fa9ebf0c2037c881915cdd2f0163b89b05bfc68aa70f013b73247a25ae8673525403d593a8f22db2614252d741245591ece5b444c9e9d848d39af369d9de47ee01a22234d80cd3044bfc51cb42745f4983f3e6835bfb9eaf09a9094e81204ef587967c89151774330c4c0bb0e13b3b4685d9297e63e8ff2ab0410a721f45f4f9a91c238eb9bdf109c6738a3784821138c7bba672ee68bde9419324a9a7bafa4c79658a14c64bae5f68d58b8d72d2b57520472590a48e704ebf0112faa98534365f47e3df040ec76b81f36af1872b463b56f423c9ee632e9e9b66f2549f5602cb95ece6b05723bd16c1a639b8ade8e757d6cb5bb804c6051c8482606ff2b3330a9ce4a48ba4efafba0a7958cf4eb25e5bf47ce7eba5cb40721af6be55eaa3297b880176622492be85ed029f060eb19ae0af5db79574428b93ce442dade1f8d2b4bc5e77a21624f57b0f99218bf135ed764b6a1faac25ef677568c1af3ee730af90ff491e5655eb4790919cefac82f1771cfd20315c5ee5f154e122181d3f958b964097c315939b762f9bfcbe8d2c1cd8003b1c35354daf29925ef4dd84c0d928d2f4b0b7326c72c18e8959193e5b9a4e2067eea66f20b4a530c8544ea31c7087244df3e610aaf27d0bf150f1e60a6fe280191473e8c9b102db9b09157e65e8e5243d9a72467d806a1807f3fdc4584e1482b90f17775e2531308d5f5b1b506e4acc67abce3f6bdd3c773252b8f00fd918396e8e2eb616eb909c6b61dfe84234f4dceb1b32eb3a3cd858d6f9ca71dd6ef8fc2004422ad6fb4371a2740b403cd54e3ac3a5590b7a3e8e56a15b6eddea81d4e5506a1910e6303f0af217b6da2e6d37df1307344eb0de69403ec1fa9f7121e9ff5fa7d8a70c343a479639c1c92be3f3fc6babbb8a095e41485c2fb8bdc989b61a20318c542ae64d62ca9bb811c145fd4ca527546be41e34470a758255fa8f562e9bc9284e07a3273069c8c245f66fa279a52cda802dc3f9ab5bc91c55b53f58863c702955efcdec799fbb44f7f3f1a9991bc895d38bdad836297097b72dee01afbc730b420bf6a9dbfced12c7ac5709783e28f305866633925d597132bb7b20a3660ffabe1b044c08d14794f1ebf01490a60af4c3b8107f57b82aa02f219e2f889e78a0d36fa6322060451d9e78d0b67a20d91a2ad82792c7291ebc416464f1d41a262b5b5385b652c6ce02798e4e335d73928fe405accf2997391a1a343798fa02a9e4dea761510cc8b89e7896cd650620f4b4ce2b4f0803ce8d19c80f838317160e2a10a419fa3e2ba29092c5e72a0edeb0cb3ea3860a3771f04497964a2ccb1676602942a703a8132bc50ff499fb06b1ea803501a8611f27743ae260a45ed9c78612c41f057ecf448e0f5010686aa86d24f481d299e056ac808b38011301b2ea401e39103c116b7600140ce8ad236ba48dbedadf5cd99ded088c4e831ef0c755c35b04fc627088849696d665bf0ab97216f8cc015dc271eb9bdd01a3106e10db0e1d4de8d5f07847bc9e8c24c660660131c6cf7b7109bbcd2b3d69cbe97ec4f3ffe1889ca478de0703c51bd4cae76d3b79f41adc48506441ad70286e62a4a0b091e2ffc41d4f74513a85e087e0b7859ed079e287182305821e274393c722799c88c30b5524c70939c1851341628cb91b8199c36112e6d227e1e187a07724044d33fc793cde0d69e28c6dd4c428869a984dc418d3248e249a701141b923619a8c628c4d8ee0f2ffd7453cdf719eef424c7698a82c21c312319620515206254850728290922d94bce47021678b1c2c84c3471c424a2a04bf0dc8f7a094d4ca9bbe50454a2f94a7ef777ee5412e7715b93d6101f348725c7ecef35aa8d2b6ffa3a81dbe640175f2a9cb275dfaaf64f24e2cf9d32c2b9a8a0459f87739cca310143da73398c48e247024f94092200fc8c20366f0009d07f4f000d0cd1e3764dc5ce006099b2dd8e4c066276463d9c4182952cc8cf4ba6eb3912de0138d77262e87a06946c4f39da8f3b2acb391e0275ba4a4f6e8c469a22e6f91265ba4cc925026d9d3f1cf2dd4e3c8ef4b1e0b97f7166e1f38235ba8cf63e15d8d18a19a2f54b36b52a821385238a2289999bc53111846fde8890cbd2e3b7942fe08890a42483892061c59c2910d1c19454a0b3defd324b8692a52fec7f292e7bbed2bad68349a8a0904b7cc711bc5ff3f22da117be447a4726c6c92c893d65d96a17e6b998ddc801b71c2080e31521ec904825986383a64d1249873cf909e8ca43bd2939150a42d045f7ec97bf2793ce17792e7bb494daaee48af4652bc63793dc201394ed364d6be1ce60dd4c067017bf79ee7ef49de8ed14c5e1352d3341901295f5e5c729867248b647971e9dce3b890b6114e2923799d2c444a29a990f2b9ad44f2b6d7699a36440e2129af44ca3d1f6e9d4982a770e39b498a8d660bbbff9d8d8329fd1b79cec47fb4717496f0fc33e01396c0894fb67704049fec0d6ea4fffefff51ce6192ba298a123c69897cc90417dc29952fc7e47da3163a9ed0b65e76d75c8ecf1b9820c1a331f2884648aecc8e81023c549604d8c1187622610f3444c91f8313f320982b90483468c320ba2f3b68f815981cc42305a08c609cc8c947c912f413059a20e9905f12931b4841a325b0204fb97bc803d5e0c98953881123c529ae3bc8f44f2c2fcd28317315e8e08d943880a8484421ae05207a5691328e29f35964a8f9037f943506703b515b0cb5ca994a517cab0cb3c1e9726efb433ffd726efe48db26e317927d93bea3f8a74ea3c6e7ab024f9bbb804e9429010042992e991d520ab40760446077605a683158994a6498efbe799e471dad665c9922349a6fd6d5b725c7e62a3c9c81519159b07734c9665992673e9a4411549e974db973bef93e0d669a8956e53919a26b3b0cbe1a9cb6096bcc332c05d600a84f00917c10688915a5101b38826cb7224121a13d942adc4ccc8ef6c640b05f2fc5f0bb542556c640b250a3d2f09df765e24a240fe20c7e5e8058d29c698b509e4f90e145d4bdc3c2e1b31c69b45bcb93f5021ab8e182d33628cd12a92e5496b96ccc3aa41fdee6c16d1368931da1fa1aa0a31566a54239eafa994a87550272dc1cc53d7081f877f92f0716acae785281b31d31ed30c0d9d21fa2346aacb993ee0e91b7f7971d9bfe4e5e5e525cb72384d96e5709a2488a0ba40e580da289748b5a0116ae909b1a081258d100b172c36c4a203124538420da12374708402568c105ab9620526a4c2478c544805472503b2851090378080408030e208469c4246185144198a88236a2be016865be7b610a4a17e776f92e2b930dc38d93d16d28f4230cbff24e86d4c488affe7753a5bfe3c49859fd7fbb784e06bfe81262eeffc270915212444c41d440021cacfeb1b119d88192274f0463c32878608121aa20721a810820a020a417811849350103884e418a41821594508e630f3eeb95003cad08037420de869c04c6ef9240c5883011060000e2dc08bd002741630240404198020230444144008800031a4803e1450044db650ffe49f1c016e9f2715d04448013109104302bc0825008b50026c080179501a87b1e1b2f43ac937b097fef35464f83821041841c08f1f9010fac10c8affef6d92fcf4a103f0113a0019a1039c4207181d201432401d1104f27dc76300cc072d847c28810f38211f52423dc411ea618d500f2c08f5a0c518a9ee75cf65d06b0912e24109211ebc08f1a0f1c0c28310a11d8810daa1053b6060079a1d7e8891d25a60a89510cc5b450669c942a12b424d422ba19430a4a8e08aa1142ec62b840a60835001465080985001061022c0144204e0224480d28aca933c50046e94fc5168929a46f27034d9694403f02234802e34801923d5d2795d488730423a50a175a009e90013ca218f500e3508e5d0450e301a48d2648bd6912412b27b0dd2c84c3bbd11eaf44fa8cf13420816982e73f96db9dbfe7b92a97b700b72d254691b814ff236da9b4ee77d4c66bc1afe6149c9c788125d44fe342f92059b5c405108004528190280fc27fc6fa8e3bf0c24866e5023523334b22674c328468ab4491048b8490f942cbfb371464237846c40810d271b5e4236fc1042912384224608a589108a6491dd0349de7e1d3e4869e0e99f848f1302551163548921504e088480d0278fd0a78bd0070c7d1a108a6fc41895c45004435126a4653c033fdc3e267a46b6682c1a787a2361cfd7689245eb3619c8f327d133b2855a5101f9263afd932c034f6f24cb7242d0db124652e0974edd2665640b35027308ced04879e2c2fddfb6c2e52e3f4905043243235f6f616792e1fedeff7b8ecb7b055439fd93d33f41426a5ad6449da781e1ebc8904652a3fde507e5e9cbdda679783e0f9461e99ffc0eb837f0f44f4020ffa064e26da3cfdb1bc9ebbcfd52a7db4edcf75c5260f7bcef8666098c57737a231c3cbd1124966023c634f810a3fcd0fbc08feabc2deac3491f32bcdb9ee080303711c7c4bf531263c4020d258860c7e37546bc90e47dfdf34e5ca9848622110d3f9c218e18f919c0883c5f7386f00c2a14ff5308c29ce1478c5530c3193146be89cc9045fcccd0a4c50c33463ee6588151e1838bb861f818c5c8070c1f92e26f0279cac0478c3192f287a4321c21461e1c22fcffe364a8235264502393410a3230600c6f802d9d7bb0a5f3bafc75f27b256328c5530ec14df69d6de7338132f4ba31c81823f5797b54816f32678f3390ec518a3186403af03dbe874a947af001c61123a5071931ced0483d281066aec7125e8d1e3ee064d9cbdec21c66598e0ba7c9b29c2ccb09031e61088391307cf278421e5ee4d1f3400018de8894e68d785a7ed324cf0919825e491a21ffbb9141346fc413a33f4627771989fc51f8a36d224950f3463c49c080040c40c448855f287d41c9178af8c20f3ce8c0430378607884f0c8c10b6a78410c2f18f1824a8c51cb9a6cd1844850932dda0a48b5484a450a915b932d599648c8924442ee3c92e176ca3ca5adcb24d0c4bbcc23bbbc4dde29dca44eb7997a89fb11cd4cf764963377b4710704eeb8b943665af799b448932dd48a8a9449ec90811d243b4476fc98a30b64c4d136793939c83fc93014f879bd0e3662a47e6763a9e30717b0c0051a70c1e3c2dcc215b6c0468c9102bb8d1476db16445b08b2851f3c79d49974b2e4f1384e0b56fcd7b500cac2199f271f0b76602108588800168060215ec1095770c115b8a869523b65d2f7251328c13cf2bc4eb268afc97fb2719d124af3b6159260850858a1a60a65a8c209aa60a40a4450218f18294db6506153418838a6e0c61476a64004c7650e2aa1b4eec948c10252a0a460041d48a083c78a2974c444010c2588824c141800053ea08006143628b8c4182919440b41ef4606f91b9981cf3d24e126ff49feef490ea9d0a4b71307caff4edcc6bb7cd21c0c37fd5cbefe4c9e1776deef78489ea00635871e73ac31c736871173f8e004203841064e70e2841f4db041134ed0841cfe60b8b304b7cf236d5ec7e375ff4ff2c2cf9325930c9fe479a5cf5422799f167e1e8fd434196613d80da1f8494b2b30010d2680c1842af84b2f945f7e8e093ec8c1871c2490c32487ca12f28891d2bc118f265b7867fa4c5d82dbcc12ae250880064ab880129048821a924046125090049b2fc038fa8891f2a4967d9a0cc1fc9c0c33cfdff75d7e5bd83d0df57da7b3819becf27fa7f0cba5161e070694c441448c14297f8ee65d66f9902042c210241c71843e2275e27e677b52c6a9a9f9cee3b20cfba983a148de115c8ee0430f8c0003233031820a158a308222401123a591f2872090278d767ed93d994f5ed86d21683ae9ffaf4b5e9299d39b0e11dc20c21444003204398630c6102e308424e03083919802470ce0e022c64869e1e3845b673269f2a42575e278f7dbd749b9d3640be585f2d4652fec366da57b8e424276cf514fca9d8a3c02092dcb9c89f4799d7fdedef9cb44288d6fda8fc23794f046176f68f186cb1bd60a42d88010b0206821082308824c107e08831b6fb881023722e086e646a6add050d324186ea4211468fa42b0db92e0ff79bde765f7536c528e421eefd369f91e3449cefbc2cedb20f79f276786c82eab689acc323479a62fd43cd96964983d4ecb0f7328474c64a669b2e5c152e6388fc7e35e4bfedbc44120bf9347a78ef411e93612873181204dc7632379bed3640bdf7e7f1e118d82a1a1b8fca8f014f3fd4d085226ef24bd5052fcb74ceadedec0ac25f56da310942c3334f249086aa79d65391aefbcfd3872232229504a1eef8857d3fd14de47e441251d0d087e176e4c788ef1be77a2db90f01cd329f96d06f46abacf14c33993c7e4f303214888317edd46e2f93b71a59209ec369208dc402ebfb87c22707b52ee384f934e20c865d2b69f238149c2b92f829365bfbb0f3d2f094f4ef2ffe93cdff9ebdfebf4feded6f9ee3d997f225e0e132e833146207850450f527a10798005e9c9801fc53b130f9ae08115c1ffe497bc2df393fc4c70b26cff12fe9948546343839364c812d110266092d8e4e08844598cf18718a3ca1031881db0c428e2f2f662e462ec40063e4a88f19384183f71c4f841428c9f23c4141da891a203338c10e3a708427450e486fb9d3f52f27282ace1853590b0860e22f8512da088b47bb2acf348246f8bc0efb72feb16d2ee59a38a18bd1909ca246b5c6bdc358058a38728fa9ee35d1e89929019ff24401357fa4c9225c6c8851cb0e17ddf4b2107447290e540c6f879dd2622ed9e2c23ed1e1c88010746887145c4659979239e177d1e0e4a110733839907072931c6a8861c306a9820c698c51435788c5478d29cc3700ec37f0e1048b7dde08c1b64117b64e71e949c677903fc79927f9893061f11270d325ee7b96d67fb4a1f662e6ff065d2e8d2788931ec3c2f64e1b81e2f86e3f2bed4f4f292e3d26d46602ec2715926cb726cb000349e80461694570333e214343002153458990114628c4bc4941978310326ced8e38c219c119ea173860f32a823c6186a9b14853dafc9164db6dc482a97bcf0d3648bd76da70e464a19c4c4008f18b071c41130471c2129fe9dc765df78bc9164d13479d25ec6440d4d4d1218261c178303c0e008305841a49ed3b9f340edfb4e89193330e389192b2fd0c20bc078c19017d81023e575608ed132d5796106b5d23602b9ffb6ed816096524bb00574019032be50c61b658437c49432bc3280284307326c40462643a60579b4008c1654a0053163ec1123953add86446636333639ddf6955858c00ddc348ddb3211cafb7e0aee6ddf974e599b9a7cd01482260898bc93044df23f2026efd42991d48aa63d29832cd9a4b369529699a6c9164a6f3dcf752ffc9dd26b2eff8ed7e3b5689acc12a4b4d2737acbdd261fdc783eecf2974d3a23f0bf2eb3ec787209678c98316e60810e58c05980638cd47799479e7e142700401a21c8a51021727f2091295f6ce8c11a7e88cfbd4e0d598851666f0505a86c112247d4ebf007812135a870af6b22874606e6064646bac81efe803474017ed4e90bbb4fa2944949fc7fa106e1c4187f24e9a30231caeca5d22c9b3b7509cdb2b933648f18e712baa453c2ff65c505f480fa7925efeb9490b652fe72b26ce6bf2f1223e84682361f6eddd67f2646500db73141d26d380e86731b93184147c01841463a538f11e4004e132388c6c9a5d8898d1154c43211718c202297d6ea94bf0f467b5c0cd86d4648bbc9e77ddf10feddd69f774a783cae7f61a784e34c44788ef929369c9e8c041c12e3a70df09f884eb7d57835cfe91c7a359cf38a0c7971d9bf84b47b38ce54439bd4265513dbc46a729b5c4d70131084810937cc10229d57f3e17fbbf36470a5266c7232abbd2627b5720068a656dc5e90cce99fc4088a99f5f4a737c2b96d24038209bf5c8a11b4c4760a372e7f26ee26fcf2cd897b31bf376f0988e4231282f98f843024af7b4ef2ba9b2e8f72fef390d4cac4694edc8b09b74ec9ef70796fdd687fceef6c3a7f84cbdbdeb8c9019ca6e6d4c1c40852229332683282536343932353a3c401a2263048443be8514341d3144261d840e42fc5141b18e61168fa0d8480ac912d4f7a1e993bf7a0269a2f202137708931fe00058931ea0ce73baf266707795400fca87c13636c8012316261444c944016038813a0014358130618212fc0018c8ec084be501363ee3619a4ca2264f7dc94428290dd73572841080f2e9ed37aeb70e001071e4c24cda978e1f9ee06323e1353b465ff0ec76512e80519a3c80b36c41845fffd8e3c62f47a77c71c31461ddc01468c113cfd139115f1fb279fc723ba637413c13b6c04ef0022c63b6c8876ec61071d40b0030d3bc4883d76f4c418b928f438d08e23517a618e01258bcbe711e1741600dfbc25599665a2ee39df46a2ad94452510e49bb7c4241265d9e77d5feef24106884a94cc90761319d26ed233247f2698fc9960704adb08ecbccdeb1d4d8c20ecc26204e11841d78d1164816c1523a882a88c4c07002ad818a31531c60f1556f426c40b03164060478cf143460acab8e1618d3794f8c013365c64200c1dc4183f5adcd18095ef069717c41841478628a1052d8068518618238a0f5bc4f1051274a10325c41801e08508f8f8c891a9618918e3270b63f040157d90000b578cd1862f341c4a30220204a81063fcc8a1ab1b5070400a29c4f8b24b25182f27fb307f9b080966993f138c0b787a23282d53f082f4051344a4508518e345a9d9127adeb786186394c228c638a94aa9d9d2f1789f1e81792485192947602e32041d44e889213a66c02446fb43197eb224837ca6fe5ce60d6ea4d2bf918f498c3b7801688c1330f122823ee0715bf6846fd291b2e4794c0220004aca3013098000a8dc75c9e5535e899ff8b9891f2c7eccf0e121463b6274c2139af4bc170e61821461443ae62842a4b6f46a2c27c411c30ddcc20c8261f7deb7331249f5641211d245aef46412114948a1c26dbf6512528af881f1c212116443196e90827683ce0d5b503a9df7f1c8b07b1e4981da048e7697bf981b84b0953a7fd06443cb8a8a08dc8228411342d06d5ce77530f163448c18d8f21706f1a42699be2db304bdb0db44fc896542179f9af8794288af24e5497fba00d91092e38d1841334650123182a818412d31825862480e2b4272f4808e40126391253411638c598ca09518412a31c61f2020e047ede75e47caff85e0f685f9e351021f5166a5fcf1482f7c90114580888835430811846c00880151441bd0026e40408014f0c38d5012e411b294b788739e142244aea894f23649f15cb47f270990f3760862911899d80134f3b9417c8208df3744935d5e5129e58fa73365598c1f3886f0039400100202a004f4438ca003b4808c1c5880049ebd719d7b500a71917c23c50832c019201f6250630cffc9de42d29639999e124cf838451e078777bfc19fc9cfc9bc803d9954f2bc1afa795b4f26754af8ef6c3aff3dd4df79a290cba39329a6c8873443b26cee7ce9148a443d99f479e18b4b8f179365fc7b3c9d6521e891446116f14df4f2b2a2b249de47843fe8713249ba2fd9c8f07c4d89f415f9bed7b9e342da4db28cee9076132eca32d2ee9909c17c441322447ea68d12c48aca134f046ed40a28ab5811491650c5882a248be8a445220a050073c051871c709811634c028a030e2a463bcc249e1f8e9437e8786305313a8142869c09343d0105f546166f14894ea0904f404109a18e9e238433628c516729040cc408c3bfbcc16d06864810d8c809020a8270133bd3076e3a5fe6a4f6381d84941829bed5b8a146c88d518c91db463c12c68d1f110cc1923c71405023c6cef4fd9603042d22e5d53cf76e7e40861fc4e00753fca0c90f7ef8a08e483dc9db2c1c86d29c745b93cf90368010613c2640afe613233d9d4f1095366e8c7186ca32ed094de34cf9358ca4bef366a47c8f87e209ffc4715ba8848792e09620ff9d0c4ade659e3d4e7bf279a404330fe88df22775bacd0b75961ec8e59085e51bedfcf949dc870ffef63de947a5a736d2163ad1b42740fe791d8da438d0931d8c544276def66d5fe844d39e90df72eabc4dca4cbeb779c0df4e86ccd8c8649988e39ee709274fb0703fca2d9e0ef83b9b0e8ca43c9073bf75169e69246873738ad946de77a3b3c5785e0e4ce8d5845e8d57f302500fa01d6204856204a5c4082a408c2002c4081a408c201d6204e5102348003182021023e8478c201c6204010064438c20941841a018419fcf1a62fca821c64f1a62fcf411e3070d317ece10e3c70c317ef888f15386cf1862fcec11e3478f183f6288f11386186d889f12d8000734b210b50fa05103992ccb322cba37014d8bb1480d8a10a92e530331e208cc2ed8974412fb035b68c082188350421385af43fd13a176b68fcb1bc9eb4e9c57a240b0b46d5c8994354d9648262d753c1c4995b6d00337ae54ca4156909041e41172a5b47d176d2a52882c6da1287c2ec84a690b553697b748883c85cf259184640941d3a7699aa458564a5ba8225b4edc97b98dd499be96b0cb5bd364969da753dac21c6aefbf8b34f95c6947d33c214a5bf86d3b42c80f4d32db68e1c699483032c60824469005248045ecc924de793a064bf0ced372c3400d1898602023a581dd86442b791f18769e9c3143086650c08c1923a569d20b358dd32b5ae577f26825ab502fd823c6cf5391a1177c3146510cbd8007172021c648e9ef75f8cb30c350ff9974b62ec14d671b75a60fdc54bcded1700e53c3f33520cfd7b8a0880b64945d76414e197594a1468c657411412565f494a17d193646fea1d77d88901147ecc92432cc88f20344029d0c97083ef93269b4bbd7b2337d3208d8939164598e7c91e0264f9a04bb2c29275a4f46a23df19c02f31149812b2ca75085650343af26f46a501c20cab2100bb4a03bd20b4d5c923eaf7f5fe2f98e0540c448016159810b5650b3021b62a4347eca244f87ea543003156815d81865429397c4a6389209fc24296842280556c49217822878020ab2400115e30b62e0408c2e22a5c9168eb49b943249669a265b90c83401c5a84ec0478c91c7d00942a06d2492b7ff339dc00813ecc0041c4861bcaf94fbf73c1e2761a8d1ce25d0043f4261882114c60662d4bc5072ce0b79182b61e81002430c31c68f213038a05139cc339ae9db78bed3644b92ff3eec59eae4d20b182a31c62fe24022d324f4c519f18b1e4a82322729223b982fb42f96004d540c7df123464acace8b2cc418a9279e0cbbc709bbc7c931dc968978c1458c91e7182f7a628c5ecc1b2f7ec831250003157a1d129926dd064a70939f47811ec8c1484ad3404d9379db91fc4fa50cf2df1b297727ee815a865be6919ce769aa25ff280c2225055a95655daf933cdea723c137914c4c24a5695de6b2490a8f27941eefba770a4ba41f25c1693a6f833761d6f94f47274b49491c2f87b49bf01c93631420821e624409825204ca0e2100021299262d37a025c800810f92778c36ec20019810e0182308cc10299d6ee3365052537859b67f27cb78088a4ae07fdea6018115203812637402050884f8001df10332f800e8040ac959ba21433c50478c37881e28c2030ce0e2095cc4808b1670a17161c41664d842093632d338059a349969d42993341c0a7c9d5cda91a20a2cc4185f384d690ba96e5be2dd7821e7bce719ed70e301e5f384e1f6f17cb9db641eedbc7fe77b1cf9fdd66d4029382024c620f89723daf14aa29e4ce2f96b8ad49d2c0bc10dfcfee6c90ec17ca4db84dd93403073320fc8014bf9cb799d7c93c33ca3c51c320b4d9e1668c418b5a822ca4c8b9ca805057e544803270df0c8a2012234f0c9401c313a814266208c18238544a6091110fca8efc352e6590486b2a040dc220b95204edff65944eab1a88302b1602384c58685b661016e20b861911263943cdf6160093794c6e3759a4625125acb287c2e396edbf979e4939d2528c3079918e96c453c2f8773ce068e18a39398824426c6f852a4f336d0c4ed8e86f421cd736e84ac50811517b0a21493b06226c6a892d287197d74a08f9e0be8118fe46d094ef747408e83e1f16a606cc0d31be1e00d4dad94807974e37138bbc9f76197779efb24327ce6b927f3dc93e1f99a12693701c3ee778670bcf3624e5be6fb8d2b3d91b0e76b9e2b6d5f8e97c39f6fdff73b364c4aa419ae93c33c53227d45be679c1ce6199ebfc892d3f73bde06b7199a11988b3cf932e9fb3033796e774ac2c7e1db0c58520286603e02cec084603e42012062d4e3538034443e3e02084d60831fe575317ee688f1e3041d9a10e3870972701192c00a62043f107c11effec9ce5af4db17c6334840a3c02d7f335da4208c1835b0e50008a0f33c508299779d0703e24103794011ffee491e922ccbe1f13a2ac0a0620354d829eaa8c1142a9802670a069ce038a11163a4b4f04191fc7f92c32ce3db8c26bba72269e76d2bafb5f0713a1b4d764f456a9aa69db43ce51f957a891be1742446f0c5e5a489704239713714283b0fdc4c1e4bfe4c30f2f38848ea495bc8e90dec1e9419dc9e7cde83de68cbcfe43521a92f974ad9c4bdaf248f3822f37c8ca44025c2d709f13c8f4b8c43c8304b9d6ecb32d8e123eebc1177ccd8c922ca8c45662793ce3230ecbed3e93650c94e4ead62d4a0d8f921468fc331dd5103c2e8749b4eb799b2e8bc2779a0a9894925c2847d44aa33e9f07c4dd8e37530218e14f7bb03eb88310601b98836a0162970e53f8fa4224f5d0665e8ab23f27cffba384916afe6d3be9418b50c817432478a3a22f579b24a7146e4a468927960a450a172985f725c4c52e492cdcb8b8b67c45b40170745ba01e923dd902c89871049009c13381c709aa34fe88831b6b468b285b7741e0456362b3061db6273d982d87c183961948211384242070a3a5ae834d199d1194057a3eb5007e299f062fc114e061e05ae05bf21beb2a1b0b7d87b17a1e3887145d364df5424c8e20446e609c9228fd8c2ef1bf7792ca40fb7ac85d25a281349d2cc26099a151c8984c4d1f138151b4d45e23cd7d2e384132a365af78c905cf64a9a264f7a5372147a5ab2b080602eb5749e12d942692b1c972512124763f9bc0ddc6c24a5514d9eb88f4553c2bbac22b72edcd9ee3ca9811acba6c98ca2a86cd164f772dfb20ea28fd03964373209b2295bda16b40fc4182568e26e64cb775e8d8c99912d948ce45d764222219d50b1a1feb9bcb399a4a04a9b37e2912b2a12147d3f0a5b327f1289a62723a140196ea51516158984b49aa4be0f339765f7252fa706f46a789e88e7e57ccf3f9b6e139a6cc0df3e2f11f84c016bacaa30fed9ba17563795c0470a56bf305eb16abfddfb273de51bd3870e8db165fd55a9b6f69d1875f28902c5d6735b5d9c35e7b6da50b02cbe70d5d755e9acf6d2a029cce1a78bcf132ccbb16adf5a3bc63e735c3a39eed95af5c2f4bdd309f6ff2b9da9bd305eddcb1a6519976d3e4db0f4c5185b18bfb0b678dea3974f545dfa8709badecab1d617d5dc5ad67ee4a86ed5ef578aaf6e696df528cbb22ce6b3044e67b5dee257b5ebd3c79ab810f928a1d65ca7b53496af0b671d8aba21fd9348f149c2be16c6b9ae184fcb697f172fec68b21b97ee1347ce7d57754ecbda17d77ec5f82001db17b374edb8dafbbaea3c82c56bfd8b62da5ebaf6498dd035ce78de8ed57ae5b9ab107c8aa02d8bdb6a7bc5dfca773f11a66531bcb59e94df5d596b08bcf6c7aecab230bc2d6be6519681db169af0078e59f5abcf7a2fac5bba6eac8bcf1b955e5eddea6e8bf3dc79cdc047086fb5d67af73aeb4535c796b01871c932097c8260dd0aff65e1aaf563d3c2dcc016affb6d652dfc98531c810f101e4f8bede4dca2f3ba98d6b01471d9e2f3030c57d8b4b0eaaae6534daf157c7cd0e7ad16d57cff6fcc72ab8dba71a6d5d5f1dcd7d5f31a6559f7ec878d4d3756ed85359637cf5863e0d383bbbf627cceab5ad56fda2fe501d77a3eaff2c4f8a97e8bf33cade4b3838d613c6ba5ad6571be3be5c04707d45aba7fe597f5d85ab68799f479443ef05983575c556c625b6b8ecd8be500a396ee96656d6b614ab7c541dd9363acf6af9aef6eed0d7cd4c814ab6ac62e6acd7d5dbab2e273038cb3757db73c5bd8d63b5fe093c655cd3a6fd6745f7e73bd36d0d6ce1ce3986f5a654ef9078d5e5dfd74e7cba9c62e667d6ad0ad8c696c6acc66dc279e2e10f8d0e0ba2e5d37bdb85f98a6f839cd053e33989c5af5edcdd6566cd1ba93651f0c7cceb02afd135ff7e669eddbb70caa0aabd8b52e7de94531c62f39fb1383bcad5d656ab14a6f8beaba12c302a3b2e403039d27ed7beacf4fb1655dab1601753e66fcadbeffa5d79ebc5bfb386e7c5e80edca5e73da0bdbd59a177681852fafd6a517bbb0bcef8fb2ecc9a70c4cf3c9f3be15c572dd93e743c6bc2e8b5edd5af435c5166f41e7afa7de96f5ff7862d518da62b74f6bf1c5f0d5abcc82a9b17a39b555ad575f93e3b627547c56d02f4c71b53a866dafb069c38f0ab6be97575ca7ed95eed38229b8a845359ed49a3a77ace228c856adf5b23e4f6cce8b5e6258b75f393f369f5bce3f27e0955713eb7ad1ff7d656c9465a68f09aefd0adb9a72abb27d7f9f30a89d7f2de53d775ae7f60163d35e5df4f77531a6d662a32cfb6262135f9bee9a1f7bec923e5e5c6a4d5d39bdf879a7b88eb22cf4bc12f079b3be2ecd98d698e6d728cbfaa78bb9339d97a5ff9b5b98d6a32cd3f9902063acbab06e5db4d79f5ceb8cc0f64cb3adf3e7b5f5760ce41f11504ef17d9eb9e6f4fe858db28ce7ff406f9465ff0941b56d9f5d579d71a5f5e3519669f10101c5d5ea0a9bb4f37bf5ccfb27c1c0e703fa3bc6dfad8a697bf5aa1a65d9cb0b0be88a8f077435ab8bb1bf2cafdbaaf3c345efd6f5f4eff7ead279dd2db2d6d3cecf57d5b199abee40a7b75afbba9e6baa2db63e1ca015cfb9ba1c57545bdab19ccf06b6cd7c5717b69c3eb6d91a6599149f652fbf370ea726cba41872936525d2ce32293e5aec4e2ba63663b3dad7ccf3012c475cae8f06f435ada517b3b3eec7d81a655997b99be75e4d963df7ba2cd39c7e324031e6995e19b3feca58afa32ccbb2972d7279f2c9824e4df5e7ac314c53cce6222e313323301719817934e473810f16d5ca385fb3db5967c7398fb2ece5a548961561c17189f9edcbc9b22c137d985d783e18e8fbbaac7aedacb6cfab7a9697d31b1981b9088b4bcc0c922cd35c74fa3cd2933e657cae98f9568c5bd65bacf26adf519685af83c3b284c5884b2923296512fe5861e7ddf4d2f75e15debadfd17fa2e774cee1c949b26c89cf05a8c618c35cffd531abf22acbf6c70297ad73d6ead699efb5d87e2a60617ff5bc2d8c678bd6aa7e2cf0a1c0c496f75cabcf18bf2896ed357125d29633019b2bf657c5f7d4fa5ad694005639b52e2c633ae7f5d5df64d928ac11d06fd9ab69cdd8fcb96d35f27a976522d104aaa8ae6be9bfe8febbf5d5546cddaf6a621bb3f9efb4d6cb14f9ea58ae745fdb3946ed75b2ae5e314af59cd7ac1d7f9765dfe35c3dfcb238b5fee68b5d4aaf8a84e7da586575aa31dd316c5a1549d43d772a793bcb5e9ce43c51b3f33ae76cebebdabfe2550e41176aba976b7e7fdeea2febd63dca327b4da207bf5ca2a1bdb3772b4f8b6137efd971a50e00bbb66cff5c71adb762bd8fb22ccbc2c7b9be5bcd7a5dfb56fbdad575ed7325530e26c56bec5acebbded3a2d9ea92555913c3a6c69c5eb8cad8b37d636ceaaf32fd79693eeae8ae3056f599f9fc2a639422f5a9f3b61553fcd762fd238e626d6d3edfdabc7aaaad519665194ef684daaae3afcf2d4a757e6b9465150256a5b08ce1b739db6d5dd79cfca7d8409349ff910d5fd556565f6fab6b5f161ee998f473d197f2063fcb5ebe3c02878cb00babb2cef36279775db94bd5b930adbaa5ad8c2b4673555f7a388dcbeb74394996bd4e973f07748bbee67c62d5ea69ede5f471aefa779e7cce8b716a39d68f2fa516bf7a85f35537d6d7c2f2ffdb7b557a62bd6dff895d17b62e6e59eb6178bec93210275fd9b26aa7fb71e6b49a5aabacaf365b75de5eab3be928cb4e99a3a2892ddd16c7b02b3f9db5b64451b1c9af9f1856d9dcad5ded2ff53ce5e4d67adfdea9bbced7da58112830bebe764c2dae70b75895651cf77bc813d8faeba293ff57d6c4acbd8413bcaa9fbfda17bd98f6aa6ae25e98e2cb2d9b1f738ef5261776f5fbdd527da9d6940a617255fcb2f6451fa317d519bbcc2ca970752f9fd54577c71aab5589aeee674caf5e29e6b9d23a26fd3346b8cc9ccf14f36a57beafde579ea32c135d3817cb7d5a55c5b1a6bd627694652b49789efd3baf58578eab4d4759c6f2803eedb6da569eb16bd78c636eaafedc2faaaffdb6775e6daadebd7a3ae7b6b4452f5a4377b6fbea15ade6bfb59d77af04920ad376773a79656f75ed279a3982595a553d31cb9a9bdffd46aaacf1a4fcb2d5ce9677ed802a3fc7bab236c659e7ee3951cff30e8686d77dd989617b61d5356b1e65994c91cb73def94e7b359ff4ce519671f9d3f95cb298c8756a6a75c518ff6dcd6a94657c13bd9c3a982c3b759912b9fe6217c518a3d55b6bd65196bdbcbc6093cbf7218d8b4c96f1df4a59f67db819e122eab62cfbc2923784771b4f67128566eca5af69f1e695d3fe161f6599bd265148ea49c85cb85677bfd5ebb679df3aca32f0c65c159bd4ba7b5a1afbbb1f83d11bb3ee7531deab8dddbe84cdd8a5fcd257678c56b38f5e6a6592992b81db0c57226d2e59463275354a54ba71c6bd5e169673c75796bdbc4cccda93f7abb16ee56df19190a9e9bcba5fbabaa6e5b51a65d9083495449fd7454bb8eccb318b4f8a2dae56e36b94655f1eed2041f4c4e67e7eed8befbcf48eb2ec0b41d10b13c944862692112e5956afb5fffbda6b5b34cf1f6599e8a330abf67a2fe7f5a2336f0c8fb2ecc3ede319025b7aa985655e5d7cafaacaa32c2be29a96dfebb5dd96add3ca9f0e751fab35df6d3b9ed5c43a1d6599887759e4f12ccbb21718169e9ca4c62279de0f7b757afdc5e6457565d5fca32c0b3f2195a516b6a97d5dd5ebd25d8fbc2cfbddd97444b22ccbc09287d56e2bb639ce56adfc52db4759c6e59d176559b75d6a7db6eae67f6dc5cfad6a9465d5b418d5bae216565d77f77e8db22c2475d1d67dde6e4902d33b7f7d4e6b655915a3a32c13655996596ad3ffc739eb59619545eb28cbbeef5a2ceca2b8facb7b95abaf7e946520ff0745a2f075b2ec2549963dc9e35dfe46d9056421799e48e713897e20214ac011db1385a0e9138908b052840ae53f04903a841195e46dd17f22117d72ad5ada7f15c19f082afa111043f4d0245a80102a418880c8065091c7218001720142005189a60280244005012a3fb01c0088018ef061f6b0c243f8e51004b203888050f5bc2f0129471420ff970002306000e1eb20400710881ca88a00aa100150c00f0e040e3d99a4a3e3710d0080bd0bb8a1c7e309196003ae14e55a5524d2e9b6119847124462c0878a3e2fcca2b0e781883aa8210078a4f17952ee6c08001e3d20a20017dc4a5987cf153ae410dfe8420d982580e10b7878e10e3bba500717b6a0852c60e10a56a80215a620053a3e51f840e1099f25c49404f0184a03141f3e72886f8c800d98941b180b1353ac16532c0a9234c0887800acf6c494ba454ca9568829151031a50a1253aa8f29951631a572414ca9da8829551d31c506a1430f368823866c40470cd9008f18b2811962280d0384d2b831948603760889008a1812c19318124104628ca11c0670c30e392041434ca9d121a6d42420a6d41411536a928829352e31a58626a6d43089293550c4949a30a6d46020a6d47420a6d49420a5873a624a0f6188292a71c4501a33c6380002840a1072c2460c3931420c39a123869c8021869ca42186a2f8118a222586a2182286a2c03114850362288a2762280a2e86a2a022871c7ea47c81464cf9a2075f3421a67c418598f2851d31e50b31c4942fce10801f3910e0061c02d0c61231a50d9a943644296d481153daa822a6b4818198d246085490f2c510dac0418c318700f03084083134a4093134048f181a42861822f22386882820c628801b04a0030e38a6b4a1134338c4c4100e47624a1b2a88296d9820a6b4118218c2a18998d2469218c261c7942f86008036ce882969d0624a1afa017488028831650c2da6a4018ca1317662688c0cc4d0182288a131581053da282386c690410c8dd1831ea20e2957502086aec82286ae002386ae202386ae402386ae682386ae48428c51071e1290851831250b33624a166bc4942c8e1053b2b823a664e0861f3655a8c1646611001bf24d0a1f7088f12304567411800a34418102c42c8152478a45464cb1da8829161f170131c56222a6585d4cb1b28831222088e843022214318284883e37f0a2e05f2a6d5f08662430f3b8946c301263d4e9c20c8a38f0a3c01c18194e13f9d80185023664c0862c6c98800d12d801b4871840628c6a8010f05943042911669d6d277f4436e8c1f3dd0d58043a2858585e84c8951ebea984fd8f64493e9bb0ff1129a5eca0a042f6f04df43afc454f76fe9cd082316e20c148c84b7fee061d212e5224e29c871225709b099f091908a01461ce6ce55a75ce98638eeb08078508f6d238db3c2bded76bd1448232047be13bebb4545bcb31dc9da0c0612bb6d9525de96a6f8c62a32c7b4357ac631ae76bad7f016b5084c0f3c538de7bdfce6755e15196bd749420f4ef15679c3f77ec6a5e474350dca8d9ba6aaf179bd3d26b95508090f955f5ebfb55bd5c4ffe82f2838ebf669bf7d5fff2cbe987e2833d7fdf7b59135f9ce7a76d58aeb7bef69d3573aa731114362c7ebbf3ac985ed8aa3c06a50715b3bbaab6befab47b6f7e42e1416555de2bac5e6a228938ce84e442d901ce5655b1adf535f9bdbd92b61148ed50414511141de0399f735be5893dff8a8fc070cb5f0e87b2c66571c6269f97b555b7d6cc41aff7ab8b694a2b8c62f7c201adaecf16ab32cf8f59538d8d2f562fddf5b25d5b1a63941bdcdf97d2ead297ed96c67d94652f61cf101d9434f4ce1d6397d65fafcd671dbdb87c2e8062037d61abe36a635badaa2d4aa1a0d16fae6faf8ad19a3186554c506aa07f5a97c6f0d4b457b86e141a58979efa7a7bebbcf2d533b826b6faddf76e9b799dcfe3c97c1de50cacaf3db18a678ef385e12983cca9dd9ce34c37c52e6e516290ad3d31ac1fef5e050a0cb6b6d9c2d69a169d957559e1166306e717d3cfd6724c57ae31ca0b32debdfe85f55a2f4c2bebf2282ec02e8c29c6e6d5d3ba302e67d9452923e3cf17b69756ac2f2cd751969dfe89e8b3ec05858cfc1c57b69a99f78dd9aa1f41694195af8b2fbeae79edb7b87628634cdbe7ed15b5d79cf8376541b530d5b35efb5ed5b57caec076dc297ffed657d676aa025e6bb71dd78ecdae2b5ca540ff63cbe9732c5b3977cb434181bdb8f2ebafbdabe65fcd5196692862d09a316ad57aafd795ad7c9439817282fdd4e2587fb626d5ddf25196e97c4fe22826a8f0b42cae6cbf93726daf519671f94350f48433e92c93d1e93694302cbd6db6987ef576d77bc1b8f6dcd5625a57d6dabff617dbea58f7cb3e9df4c215c6a17831abdd5835b19c7bbdf87e9b2c23014a09b05ad55e3db673653b86e55196ed3c11f5fc9cc848cf7f243421c9b2ef9f7c990472014a179cd3eab2f0ad34d5b85a15096675e1e715866bc6befa1f65d9cb8ad73b1a1615365046902d8d77e693f39eeb5f2d022c5bdeb15bbd9db6639e4759a6831282cbab0ab3df2d9d1c5b7da340010186ed89ab5b5dd7ead6f71a9a907c1fd24881f201ab63fc5aebdbadbd2d4e4759a6d36d27ee851dcd11140f600cef6a65cafbeb9f181db9ec5fc27199844351b8b02e6bad5bef55f3c573e66197775e9204650b8b799e35db9bbfdacef928cb3a9e5cca281db8fc66be3536ab75dfc2f809140ecca797de16e5735beb9fbb6c205fec67d6755f9ebf62598b69599765d1de6fcdd7be540355e7f4afbfb3bec6f3ef28cb94a064a0df2a5bb7e2dc56cb77af461913942ce84fbb37fd3b31fcff00142c28ae13ebfb1dabb456d41ae51041c1c0c4d5c61a6315d5f35ab77a59c262a409942bf645315af78561f7caf5c5c9cb0a8bca131640b1e2ed755937673ef35f9dd652c974015a55b55617cfd67579fd3eca3211efb62f9d725896b01861f9d229c7a57f92cf07502cd037df6feb9dd7f63b2b3dca32d1cb0bcb0b36652459f60903a5029c7ebdaafcf65618d5da42a180f5765618bdb0dab1c66c5f83ae5665d58d5997ce56bf9909901aaecfbbf36d596f33bd2ce7721ab0d9ad9bf9acdb3e56efe6a03eeecc98ad2a7afb95f9ae580784066a5999ea5e69be2cafaa7a86f97df2a9edd33ab3de55083243afb0af2e86f5cf77e75e47203ebe578e5dd6fe6b5b7ccd5e067be7d37bfbecf9aaf8a664e0bcf28cdfbab7b25ae33a067bafba2bc7b65f5d7335f7d8d8a69ce66927a697adf4a819db5a2f8b5fbbaa13e32031e0d93bdff8abebdab452fea900280c18d5bcfa0a7fe5f6f68a4759f685a01124ef23b24179586b4d9cedc558b658453718aaebb2a845b1abce51967db76992b7b32ce70b1ddf3db3c5ae4aebbc6f4702c2c3d65d5d15dbb8cf7aeba59f80bcd03be61cd3daeaf7baf6859d00dd61ad4b6dd7f9baae6b29c64776ccfab6eabf70eef8ead382bab0affe957e6be9dd2d8bdd11a80e8e51cd2fc6f5ee745f6cd980b890ef85fbd49aebaa624e2f0e680bd885b3d567b52d5dabead6215996bf5702d2c2b4ac6af3cc1bd369d1fe49385016faa5af852b4c6fadbfee0d84857a619b62aaff5af8e2bd6799087485be2f0c5b0ce3d8b4c26b3cabad7abfd5da97f751962501aa42ad6aa5fb9e6f5db8534ca980af959f5e16adea85ab074de1f65a2bc757b72e6e7fd2151597099202b7aa4ce9bc6675e18e7ba6c3aab3fa8af57bfb6b3d3b0d280a57a774e3ab676b61b5d2161432b630ec2b7cf1b716d3f50917c656bfd33ecfbb3fa6c139f4acb07961d3668b5713db4eb8d6ee1cf76aababc2aa4e9bf0385b186b4b7bb62ecc2b252026bcdd9dea5b556bdd6b6d95a3dfcace8e5fe73ca7c5eb126abfaeeadad6b5ed754d4b37015282d65665b18e51caf1bc7a4e024ac27ddce9cd9635b16b6a5cdd80e2b83466557e27c7f0bdd7c22012ac8bd97955acc22e8b6db68e70f7a518d6ad8575955f631c9011ba75af4eb1e5f96e6e3b56844e2dffabde8be29d5fcb8088c0315bddb9f735abaf7533011a02c766c5f6ba55b6aec774c3816985d58c59f5766d4dfb46de3cd3fb6fadded55afd009010b0ed964e4cafe595f77a839027fe8d2dad565f3ab3e585dde6851d8d1b7df7aaaae6a5f3a26f61d6080808fa5eceed85655eefc5f57f60ab8ad29d2b56edaeaeadf79c2534448890bc8f489665221e900fbe3eb759f75d515d4dcb12898680dac02c6a6dc758c7d6b5f1c66c7caf979531aeb3eabce31ee82bd7fdd8b2f9d6ac39074ba00b0c8807d3561cf3ae298673cd131b659928cb8ec0c4d81c6122cbb2ac04c6807640f59c175bf8da76dbdf73f3963001e9605657f36abdfd7dcdd9f71ab656d6ea16e7553fedd3e600b35a63ace297c6c195a9cd56df16fe795d3dabb1ab8b62d6d5f9da17df4d2100ba41be7def2b3fbdfab18cad346eae70cf33bfe6f75e1ae34036d817b716d7aa2d6c5fd3de81d0b8f0bdf7769c37363be57794653da01ae82be7593f63565579ce9cc3218168505d6a59b357f5efb6747e029a81ee15a6af6b695d61f94eeb5302d019dbf2ef14ab6f73ad8f611200c9e09a18fe3eeddc76667be98f054031c0d6c5b0fc18af16cf6a6918e4797fdeab2fdd2dc61d9b71ebaed8b5349eb7eb8bef5196894e5a74e24a44402fe896feccbffebc2cddd81d65590422f09f09f4b84d051559b6b3f119900becd417463bc6f7376659265219f362d8dcbda2d5ad70e73c5f2032acfdcaba9ae789b3dd778fb28ccbb2b0db94e86c315996815ac0efbdd66b7ee55bb5ee7694659c28dcba2dcb28d01878638d5915d5fcbab2beb24c96b93800c482eafab7f8cedb9a9faf6b5770d5af18be1c5f9f2db6ec8a8a0a2aaedee2d5578edd6ad50b94827b59d5e6ebd2566f7df18a02ece2fcc238ad77cfaa766cf4f29dc7c964d9771eb761588880c4d0945e3e7545afe7d45696080b8d4b29237119814e402fed966379d77b7ff64bfa3c229f779365a4cfeba730834c60e9bcaea52dd667b7b3ff28cbb2ece5858625c7a5e6fb9086e47d44f69770b2ac040a83e7cbe9bedb5e96cefada60e4d718b6f2ec56eb7e693bcab2ef4f5f962d01fac2d2bfddbad5ae6a95e7c5bc9895752d7be189f54a637b5d90804ac07165e16b2fab57eb35868db22cec3965261e4f4e10501795ae7b765c6fbd7aa5f9740244020b6b0b5bb86f5e599cee091a01bd9a4f8eaf6b2b9f15a72011e4ad75b6b2beaeadfeadaacbb2971b9770e34a385f1805280455bf5a67fd8f613cff678d0c92f3041310087aa5d7aa7a956fe757cef503b9e2d3766a71cbf2da2feff922dff378472a90073addd3aaf8a6f8e67be7be02c485a5efe7bfd8635ad56ad62deae557d757c595e2ab2fdd00a8036f652cdb5a379e7a6b5d8db2acee3800c481f9b6a2175fecc2b8ee3d411bc0bd669befb413db7bd52a03d2e2b236b57475a9beb8b5b1cfd1c0755d1cbb2a5661fa93ea5a03ca40afe8ecb9e67cefc66ea56f405964abe2eadad7b5315aaf6d4759169a4aa1c926078485a516ef1bf7a92dabb17d490084015d59ca31cbb3a657a65c7ba02b7635b18b62bb2ba7b6ea8e03b2a253abaaeea5d6c6aebf7d8f4017c8bd5bcc62ebbeadaecbc2120059e0b298625e55179b1cd74c4115783b2d7ead5bafc5796e0c44810a5b5c3de5bdfaaebbe6a32ca39f35d0f9d59c18ad2edc2debeb8cc0470df6e7a51657abea98ddd555c5270df4c2747555fdfb63d6aa681f3b5fb672ac6b45abcaba2c45c3be72c5b0752b0bc36cd57394652f5956e47306aaebfe6d2fcaa9d5ad8a7db4f898215ff756955ef479b6b2cbf7e1a3ef3dad89f1e5d763dc564358725c20f02903c6d7eeb7169e17fbc96bff90215fabe2f5627a5f578bad31ccac73b71846a79dff9447e0b387e6f56f9fd85fddea4aad4f053e7ad8ea2fbf9552ab9afcc2d5ce470cb5c2f4d26977affdb9bd9e7cc2f0d3a236bf75f1b6f655e12c83c0270f5b31adb4b2b4defc62ab53f10183ae57eef75695555d189ed5e84b22d1cae70bd6aeac6bd6795feb0bd395ebf78347edf7eafd566c2d7a59bc8fecc70bfaba6ae71a536d73fe7a8db28c7f96bde878472498bd2325af26cb743cce057feed818dff42bc6b55559bb2f983f765456b76c35f99c15c5b7d79e4f172acb35b6f25ffbf2ff7d3f7568acf3bf796216c574be34984737fac3858a6faef7cc955f98d6cbb7d067d5f639dfb9563baf7bfa68c1aaf63fadfbe2176397f3d1270bb65f975bd4726be58a4e5cc5070b15efdcdabd6bffef16b63f567cae607bbeaabb27362f4d279e3d1f2bdc5959ccfff2f9766a8b83dee692f3a9c2f598a567b698fe7b510ca3c0870ab366fe76578a59d845fbe5f58e26a691a8e4b2e6c68196c40c3206000066d50400a310002030241a8d078442d178525b1f14800159a8589e563c1689f33088511032c828630020041042666668689c005c149ede1230b7b67190eae794153e2967e036c437e4678548c68698720183c58ce5c710431d6140446665d70633986a49d4b09a06ad7e125265a14301dfb9cf353bb2b541006552f6f1cc393764785024d212b8a05380846179da13e5fec0164ff7d8b9bd86a82d943ba5965088ed7df9340ccad92dbe0d904427871ca08a2178545c7b09d3526aa24d9a7fe8ca8ef687e5cf76ea33a423dd1aed8fe6fa960718d388b510842d46e1154d7be434c8b96e0d338cbc47635431df99af2c71ad770f65c220e0fa9996da553a02e9548b51c17e0e1b46d522244abc62ffa6a08c21d2aa6aa7efdf8d187896a189b88d957956a97d9d43ce559d3255d655120df26f66e512c85a7b6261e02cf78c105d1998cbca201ea7a6157379adefa27248536a8b6ec223dfde6da27d9075029d248e5445a18bcd387eb22292946cb0df98e8778091856f3b9770ad14c9e1d8404237b5908b35a88da0aed53de312093c9040df08481ccce41ec12925c5fbbe0921f6903cbf375c0f73c6b778a0f862f77f11ce5037dcd7f9d76b55a6b0e859cb873775548c677bcad2344de88bf71a4a0f3a6d753c60a007194ec2188718bf686b2236d56f0a532699689b2fa2f2290dd2a22e6d33afd116f351a99a8b928389b25f5366e60f377156fae3fc4d59f547ff680b1c10527ed7d2d2481a96126936e0c5e1f588e5a705d7ff9ea41fe4a28f547dda145f067471039f928f490a57da31defc0d61ca6a9f9fbc5d8f26f671daad2e68d5e21f5d43d1ee130fb7a02740a09cb63c1534ced3ab795b3cb3ce3635c7d215b60a6560ada38a5ddb3eacfac51c17569409355e7066d9cb488342140419907426b0f7f07f237680583b1f8a04b780d1b91ef212c8ffb135406afd463ccee9feb2850806cda5b5b4aebf7276d9e3198bcc7a0bf827a6158c149c5547dee7e1b543c9085f7a9b727f2d2c49e56b4810a0feccb9cc5ba5e0d4cd9ae10162f8ae24e4a86c40f20fd9d09d8e0a988408b630810745c5f4fbaa3434d0579ab2887ddd77604b8e15780bdc77de293213042e3b05caa31f5b1f257445ae0146a08cf4d531bbfe926f348df27ab264cd831fbac0c9bc0b766050fa98674cf7a54ccd236b2cb0aa343f82364f9eabeb0a01c34db4da2ebc40f8dfe2846ddcac029ecb507debac0f57bece0b687c07d80759bf2cdeef86e587540b4f9c1f9115037e7574326ec398491dd558f255167ab4eca4b17bc049b640795e20568a2e83d34e5b9789fe4b75e82a69782d1a036b336b9232c07e6b96fd5163e40b4a5fc5d1f6356843559eb4bc7c0c28c54d6eab1e5607e7b328cfd59d1f61f881ebb00439d122f8a98a3669bbbc493b8c0a501304d8a1cceaf84d1d258b3a3f51f0be221691b82100be1274211e94681107f34162cc5d5dd7cc2ee5894c9bf49bd4589d612aa44b68b22a2ab3d4e603d216e396c56899354397a3da00399a0bcec1766a0029f4b5b9c0df5a8d517ab102636e937e832e27d693d6ede00bac1c285ad9fe016350a88638715bdbc03e7c67d11da65811b471d5bd52592eeecc1f7a29f45375adab5de6b21a6fa04338978117b50b489b2064109417a4e9a9841eca10efe96f7c9ddcfd9bcd7d95992b611544129c2a8f287a76e88fc44079229172be03e54126abdb717309d1b93f5a0c2e617e87b8ad04cc526c2aa9b0e0caa1ea032bcfb88ad094116841fd5aa135dd3601a9b0b5bb1a8acd163dff5371ac76f5868e5d17eded87850d2b961afcd45d02d67dfc79739991559576b56b6c22f8e0f4e8a18ef1bd62e6f4e25c6ed1bd66a50426ed9b6709166cc6c680767cef1edc017cde9e0c71b310c8c10e269618f78b79601eab067399df731f420c0f6a1e149944f650a26f03ec8b7222399833a4053d230acc845edd49603a15264894ea0a9bc5aeb2686c92af884de50ac4f9e99bc82a3034756ff85cb8f59e1485687cb8b20c0ea64c74ad54266ad51ed5828238d59365f7446a109df912236635e072a577542c319cd41d7dcbe614a650b66a037b752f767c7b82c66f2aadb4e2cc84fb3554aab8710d83ac03290dd69eba59467a6c30d12574eeaa6295545d2feb771204d41ccdd8bb1d31f16699a3619b807e06dac79478b11b472770697d785e536671ac363d8f7ba1a0809b07d0ab1406587bc4590c76f6d84fd4368f97bfd6a1fc143c9ad7720d38a03c8ff7d4aafd307d8f2bc58709f91125d29c1ce67b90903409fd11358b97dc7909dc31049b2a3674d249367a40b157c7edddf0117d4a75526012268e77a46b3a7c8e7442f02ab2261f58183844fe52bedc2b13d0d1aaed46f44081fca7678bfd1ad1565b7439d01bf1ba83d2f35c8ddee60f7d2b8371a4f72f2b1da5ae57f3a1516ab2def13207604c01ac1bade555318e74572fc444ba7653713184c51536a0077a5b8731a1fd239a06c48035cd7e4dba8de21a6c294da3de6392152c6f2039570c52e306270a19fe291a2e2232547d19b2bf09e309ea3432e662337833ac209595201ce4aa82bc46dcb741eff1382edf824ec13311e5755942d70aa183d5a7a4bd18e7a7a6ad0eeac3c9e2175242e32f54b91270af9167fe1ae6e46edcbb0325bed11e627843a7bf02cb6481a24771cc2360661bcf3c4b384c6e0871f29b9283e974f2706acbcbd0b61f8e02174b1e5c14e68a78eec8c75626ba4c1037004833f56bc3f7070ded104d2615ff6ebe17875eb01f5dfee50533d3caf02e60dd5a1455b39fae27935f6f214a783e15dbe185b005cb330d00594eb4dfe01115b6848fdb80b3e2d9ff372bbcab4fefb97e35ba42a4e25ae7900ee20036e6f64dfe4e780bbcd39330002dfaf197b5b3fdf35c9a6e070df3e26ed89b1a55410483fe5a91fde41f9ae1d95bd181b9805cff94a68417ea3bb5f2d93109bb20ba14154483e5b680f9d8302a81e98748110f6f56030a68999fd7154420b0f393fa08a6f3d768ae37c224d8d208452834cc9eb0a0085fe74444abb4633a6ded10c455605457e7723e28928a9b3ef252e58703d00e28ba7dc14941eade1401fc3ab02f440ab4d557815380ccb0ae32d3bad96fbc2fc797a7fc9502fd93a10dc9bd58f4dd11eec51910aa285f2ee6d4119fccf7c1d0230b81f39ade312d0472ba6c2a266997e5035f2a979b8673d1356e97d6e1e96916d01ec41d82edec5fa01ad9d1602fbf9a74504f1a037ccdfa28cb26feee0ebaa863b5ec4dfe38cc8567a98cc88f55a015fc1adc917a2b2c8b60c7d6d1b6226fc8885992fd011d6dd99d551914624734b48a1df8b4fb9f0624257c60dfdce85f4540a5233c1cc8f1a95c729c0d9f49bf26ea4a4aefc4177a1d12ec6062e9bb467b348f898a687eba88d29b38b32adbd2860ed9d0631e2464b47828f84b498c6357b33b10e0a6f1d3ab9f6c470dbabc83de3e8b2a16799e59c73b8803643261b1842e1c3a18385761d5216b85bce9961dc6d89b26b9cc90f5245089cc6faa286a0693bc219eed6bb371a6b8fa9577689441e99f13fd6dbad1f38292433883c0d19cef833264cfbfea0d7490aef5114ef7d8cf17928e2e7cb8fd1d63c221b37fe24920bb7e596ed5e6f08d40213775df1c177d24ad1899bfee963a4c3d8d69daf3ff8e329f175d6dc11a8ac7aeea0390e8f024bda3997819c588347af87db522bb33ee056477df6411501fc71490a655296c1451c7dd4c4e186c74790aca81420b9cacb6bff81f877702099834f43cb3b77ae33b2b04bad922d0371389baa38479b1306ad88493034073a3ac2c40fba31430a7346024e16109e6162de3e3d2135d513c3c2831e721ec0f0c79e2e7789cdc04d9abd146341a6bdf75f8bda5124bb7636535e9999c0f5213837d2f9156f31db9cf8d6f5e7a204e7646253f8bf463228fec84e47d4653a7b7a994313ac207a1dfb9d4df9e64262c86b07f4704ce6d66f70662531db15f50542d04ef4c32ea3251c22f1d9d557c74f51f6e74598a2e8b088a45a0ff7a6be8f2c39d2621d0c2e6e4bafb17e7e026dc1ec990c3cf50df39f92f36397f1f533c0d7a886d0b10f3be8d9f74cce05e0540ab2174b48358a6df2fa8ca51b76b5a1de052da10d2ddf5ad28b597b345397dba64295561a88542481dced53fac2e9e69562bec7d3351bf0017fa438b17e8fd72cdba261b94b22bfaef6ea85bc4b0445dd2bc29566f8697621555652c7183946f03f63c4d4c32714f1ec9950838050a03b782297ec9bba68ac9cdf8a6cb2abe9389f8b6ee6b0bcc81ee321541535001536456a687aa849f6934f061660321e5a05bbe2939c7f74e2818c0a6aceb6a0925765aa2fbe0847999655c443720f3a4f659e9b76060bfe296bc0bd790579ac9a2099623ffdb001c2298db8199126ed07884c9e815f2895114f7e3104d55d58f553fc4db3570a12da12a709cbbcde89be66cd61db6d69237bf2ba9b304a458564619fd010a6ba465551c8ff03a332d4d7362cd7fdda140b347bc206ecb3d73a1be0a48170595d990b4522f8c907b4a4f425027c5bc5b6002289d135d1cf2222fa2102bddee8bb46edfb4483241db86b3848e3ded0a14176e544545bf45778f3330510d4e055aea3911e2b1bf95fc9460ab4e5edda9b1ee6aeaa50358929d674fac51c4c6ee099e650a9a41f55d63bd78097dff4a20317aab90f7ef4241d78664701593f467e3d9a769662c68dadc71bf759919381d712328db498926ef72d954b07caf917bfcac77da59652b60f6c22aedec39e54e11eeddc6407f8cb3edffc3aafd88fbab1bfd2df5c5ded527c0251bda107a2204c06fc9df57081dc0b829842671ab7c218e2b564081ff1a33556a28810bd1a02ead7eb8befe5a53ac65d1558a546676c70022f6a35bf54cd0aa8a80b7478db82bab14805510a14c48763e5d36ade3898a462d6f5afcf9d26bfb5f0c907a89f7163f585386e54ec59d5d31ea36fadbf30ace1b7de64455c1d7491f5f41c793294d31ea8cfe62fa8e002838044c9f55d3dd25318a14aed858b4313e93c3cf982fab3644801cda4a157e846b496c5626dd34f0709d80304e45c294d0357d26c20bbef77fc1f00e5b4df4e8d16fa8d16f283c8d635d7508c3cc4ff23745bc10285f4884d7e7b8b59b571d17711f54bfdc4cdc101ee791de2e231a9b2e88df4e227403b024dc07e8d5a756726b8061dc201a3d12a7855f4f709870ca41adb2a4d7e4fd68e6925dde52f22452ada22a338666c1651833de02bd5e68d6b1658ae886e170aaa8b8380caf118e01fe911e09cae04e5735cbf9270763671575817d106928aa1a74791ea0bb540d7abe916a8d469d6ced70a9339f1d0e287d07412b8d9d649c0106f6a63997208fcc8130d549431b3ffcc15ea10f22c926167af84d692628503a351ecd28c593aab9ebb1fb07f7f8f89bdc8491c6262a1ce6c467482432a3f49e63061abd5d1eb39c3d988154010aa88d7a82179206111568038e2f87861e9486e3ba25106766410e2d4e0f580d60afc941054cd0cb46627cccbc93d95f2eec94438e92c10e22f68afa04a262cd11f7d5a1ef57aa14956699b32d774effe0c609758eb6ece4d13d7817732c0bba3dc67b7add14d9014d26a746bf71d0fe9295272715bd8edeb967d5d81a0fe00cb351d05f6135a788006839f24d32b313952b07181eacb9960e8e4b0dde2fe48435d78bcbcab91ba893d2167c4807b317d92dbecd1565d80b72e3fec3769166b53b44564ada646e38e8b2d7be413e660528a80d1bb210d221a56f99c359417b95a83441db30ac87bb1cf853421d1973e9bc30d2a13435bbb38bd33b2b39584007fc316eba477c19182fe7ada1a0845efd0dbbce6f4a8c2d6f7a12d8aeb087b70bfb4011cc9447bb00e554de2447ff147a746c811bcc4e80db886ccf1eb1be210d5a3aba45b2f8f05ddce1f0eefc5558f44a90398f97751fd5ec8ed0f39290580b63c504109f461ab65c58e7b46f3d54437a26f7f3dc02c6d2b528ac8744c339a10dcd0077befed425a2d6c0bd8778b21af1ffabed98708f20d72215772a6e5f13d4a2e66bbae0f92bf1e2c89d463b5dbd6699bf0e4de362cca410fc0656ba0268ed834cf399941254df5646d4108fda9d1f66e50fffdc698b90d2e4517afb94f4b6cd789a988ce691e7689e584147efc05a01da3b20bfa903c064290ca63d6bbe1f19b9f5f9f69fbf4a70e586600e9534a832ea79b0fc1b1b76b39e167f032ce6e887495a2af320ac097c95f6c1d682657c990a24a2888a981feead850d3a00c0cc391553206978919f32290a09fa4ac413c4c8c15b3156a58812b0580671e26f39e8ab31339d4ecea5d5ff21657425a65474c46bc681810f09d264ebb927516c1c58bf1a9190c7233302f753870141dd7b4902204d33c3e0d5f8117c234fefeeaea88c0f604520df64c0013d37196f00304c1de48527f7adf60100240c1971007c873449e22c50265f816daaf99aac13181333ce7968a9e7f8dba8f181bad0569ab14e7b60e9d149951b907254af205262691a6b16ee50beaf4fc18a091ec68a7f54782507bbcd124d5330da157a04704b1ebb983d1a5372b4ebd06daebeeff5ea46fd7c6a92ceebfae40ed5ff93217c77fdbbedeacc346eacacd07478934317fe8b0af2712f1739a1579a174657144b68f3d8fb185a9d59b5adf922faa4ee7c64fe17dda9f59205e5fcc0979c3c6ea7a33700bf2edde88fbfa907f5bd2d4b7cccc71f989f68c8c8725e9d1d6fbc95f75e692ed7f5f9df8e09ef0e9730d0d0574e47e751c56f4e3074070bfe2d269fc5d73c6a7821b4f713fc10b69c94ae9f2840b8b97f7cf179007c29e54abbd0164696bb2d6db7d6437617a6f62b8d4c469b586c4a515a54805ec9dbdbd1f663c4c675897377d996fac9f0010b58eca12befb57300a01280318061846d7c3d078fee011cee3fafcd45997438cdc2f5bbb56d09ef2870263ebfb639ba3ec00788d4c32f78abd939252e87063bc68cb3a4dbead100c41ce24715527f81e92d2daff994f465db72b1afe703b788a4543665f5ff4813dbc6b0526b167a44a5b791328a6bd33092820778bcf99d5db2f3fb507aecba31a16dd643f989ac00dfc5f135f84adb068d3f3abe264ef2cba2048e95b99e0a6fda661cb43012270a7b91c02833ffe56ec58131c245ca077a32ea596eddee3af477e1fd21543556a274ce3a1714fcdf43016e220f0ff6d1a8d2aafcc389c32cf125d17d100cc97c2fff198ec57d523c4c55e35f155bda67a3f51ffa541ce1c0c94901b1453b2033a86f0e315a633cb461c0f8b31eb235535c924ccd471cec23a1ee92818f98f3f57c81d9a21930fa01d1709f65ffcd8914d59f785d1b3276be4717ac79172828a0ef2fa88c7135ec8a3c7a5cdc2bdebe362b16b0217a758755c581a517dd0cece667c3c4734b09254c2eca98e0e62a5cfdf0b487832fc9ed1f667700e163fab3794ad267da3a63954d663d940d017cde822257dee163cbe7fff9e05c92e114e2beede7b161692bb24412cd1ed8e87fbdd14055885d56dd724cdf4397e3015098d32bcd17bc6f445ebfce7dea4f291a2069355c78edc8fdf835321d94eff2eba4a4fa6e2b585521fda2b3aa624d4458ac3dd795286af32ab2763ceb50378ab2a1bd56ff3d5daec33aae3be7314aeed18b547ef7efe2c56bf039c350e8cdc1e006ed88aaa532d8b2082f75eb95f21f5dcd1fce3fd3f101bee7d99b7b6f5f69b42748ba02ea3adfd9105358724bf54e8aef8d0713b9cd422991702067f4b5207cc1b364413c7c9a449578cfc160e96aa7bd36da58a482b5246cf5cb23c8b44351ab5241bc4babe9711a3641be8ac7c07e4cb7d7a041fe3dff0e1a53573e703e2c48469bfc5e2ab75a28970b13254fe615379d026d4f861abd51e5b014f794161ebaaf47d815b34b31cc1550a26ed75f61da2352e32ef80c45a752d63600dced862a9634bcd66d609591fe07becd6b0a0de3e4b6d554e3c6df4e4437f250dc6e295caf94a73fb3af6570b82f4bde8e49449a18931149fb5cb326e4d15eb38b4267b00f1625096c6ea1e21f3f60c6a97e34c81f01b4becfdcafd5f99d10fdea9dfd5ed2e24ada98c4ffe2a79b667ac789f2767fb92dedbd9b542f71b5f7b955a84ffa1d75b294e8bb5f7a38697e039a95b7fe1c7f1c97c99ef026539403f0e239c28f97b129d2872cdc1ebbefde518a82378747cc1fb06a4fc5f8bef6b14a3ea11222d60dd31a7d05177f24eba81b6f202cd15cd1b519cc2808f99bebb34e18628e8b5aa0e6e211cb819e23a9ecb9d8a01eb97a0a2526c94032f37c65a7ed82641240b1763411f4b7af87264bb22ed508613e6480b21ab6e7ecc91e280ac4671de80395f671789302cc4725d36bd5e098cba46ad0bcaf9687904fac7b13ee16858fc9a7d790f25ff557bf575e597676add47d911bfc9992d4bb4b133328d731eb5ca82fa2fe81befd994bc8cfd83ae0ec3f20fe9d70379e4cfd607490c2795db13a2b18bce7008ce579f887c0b48136187a1d1905ce20444267fa42600c402add28e90070259355abf16b4d81ced516596f2e290021fc9e17423da6e3ecfcab460a0ed222f0bb63947d409ce070cada24ea1f2d676b83b98d2ff41a4d9c53af611fb49e6852b51adc8dc882a18f85c1df6c3cb468b86d05c88c39d7353dbc1ba27f5c5d8729d1caa4037ce66260d0a2dd9465147def6eacff9b7eb62e707696fd0965e9570b7f04c039f2737de48f2ddd5fc5c92649695b2f750bddcf4b7357e56e8d90eee89141c32c663f66eedf1b54aaa8508f8250a1ea650f53cea3b15097c71176ce7eb63f369c381385f0755e483e844969e7db17749110ba5eeb424c5e712036c4ed63aa09381655a73de0e5f0f91d794dbeb5f75e89f78ec009b4c697c43b4445eeae1565919dd77de00d90396672829d43137bd66bc9118541b984148560769b100ad7b8e488a652b8930044f56ee1c997821b00e0305bfdfc32ab7c670869ea2f5c55213b3fd1467090f9091855da9007f17a33bb0514b03560e241ccd4993a3314f13ac865a178d5ced302883c7a825d854286d691d52be02a36c483285707645a88eef500cb22ba9a249dfd705aab88d917d39f1975afc5a5475c34e968f45c36f6cadedab04d2af522c7acf67407e47e4b25e85d6dea49006713d7851094ab2e857ce19177a808d8d92b09879f21270d85174eac20237cb49ed314cc4b9871594e525a9f313c4dc3b8f104b47f78f31e0a017e27d37a61b2f85d46ca094812c31bd8ac870c01924611a5416283c03b65b294c93d68a4cd80e53b00934b3080d472e77247580134c60ce8c7977c0240c629e3f4f462da59be8c4136436a3bb14145723ca65e6334476cfa9d480d6b0a06ce06144b6fe5d6c290a8c5f4e679eeee4089833012e89f3a326bdadf347e72f39f04f3bb823b774e56da60584fa6b45c61ff11b4a0ed541f433bfc3ff1da74bfca9ca3edf7e5db83effc321fbc1792f6857788dcaac8a0b9adfea2deec8434e7e23846ffbb0e7773afd42827615c1f2dca07b88dc48aac25575447bdc87fe4758559250f6ee89a51fedc6a314fcb1fe207358ee723dc8115683c952958b16b36b2d5df632a713d99b5e7371aed60ca02d21d019f7ec2b01ba571facb2970d26985e29d5de7bdd03e2d731558800246c9cdaf5908e1689eca7225c625ada37f23bbd132cc6d2c83ab41493d840b8c584cf07ea353519509dd21d4d26da490ce1840e54aa585f512c8b8ae96e5dec598e4e355cf4c4c72b6c0bb8e4e31a5588e13df27771d45a45637c9dcf3e90b16f715d5be79e4c7ccb3e87c643500024fa7805462fa0d9ea12158f38edd2e430d5e6529c0cee96b6cf2e071e811dd8ff027743eee51fca80b0fa86b8d53a0772ad3e77c48b39fa16e1dda8149e4d8b6531a913f4e95e80ab2d73b07e5b01fd730f237fd5843efaabfd88989cfab1de3b76b94fa49c6726c5d9703dc40bc0df83bf4c53e33ee0938bd18ffc5c533ba15b2fbdccc812e1e1e727f59490390309ea1c76d39337b8ae10676e79d8003efcf38d7fc529212b22c0a2ad05e985d7f29e7b75349009c16c66445e7098a7158a1be32d2766d5df1cb30ac86dc39a147acbb1f3a9df133d149d594ac1bfa5f67a3a8fa6395831cc0ce9ef1f904323999ca5b6f3eb742190f06ac7b6cf4b96b7b4224db2e475ebbec0bac41a32b8e585cc262eb28764ec0fdcdf6e1ad65c42f2a38cc48ac47f0ed3fb9202d6e6427cce153b073d5f5b169d93a323e87bea7d92f930d7ee192cfd94e4db00760b12962e318d2d280635f428eda363556b197e99701bc3dc898ff3412673af3eab3ba20cc0ff3496d3a3d75095c9f1c06b783729874bbcb17ae901be22f0755d210ba10408863a83d4296f3e5365e4195360f771bddc2e7451a744eac026e8fe6127faef3cc459fdc1d99306eb77b6eba3e7ff828fcc2b66935295f867fbb3bfc42cbfe3b3d0796b6c9ea95c29602222e7f7a061410d887cc3586b3b4e2183006fdcadaa43818692ad694ec0c28007770ef74fec8599f5e0d109425b2cc8613a3a647c6af62787a79d057998fa59d9d987df2ead9a72a4131b24b035c9a5f1395c3c4fbae745874142f374db8b84ef4677c0fbcf0960ae001301df6fdc082a11985cd7bca40757f36cf9febe7cc3ba6fcc35025d39e2e8ab81eddbd7632022f5eb4d4ea73a3d6ebb02cbfb7e1df9b98819f7e0c792da0f25cc89bd1a465409ff10e7f00c383f2317795ae5ab44e040d27eff88843ca86c44d2e6b98988302447f2dc3dc39af417d5a9e3f9131f5a406bbce95e821dc338a90d3c670c4d03afe9868a6d93ffa69da6033ea9da88b94b00b332198880141c3aecfcb4e6bf98fd2741935e0ead83797c9f36f73c95101efbd09aa076c322c55adfc34b2315e1deb9a95b74eced0ed768d4be776b05a65a19d8dafd7fb74bd437470ab2761e38cc3f29cf631e93e50bc749f908aae1f7928f5d9cec83ccace9a915b62c0c928dc39bf35ab85dc7918b15196d264aede92d8aabf9773d1a9ad58e6c4fd6553f969521021c3e61e40e8c12fafe8fdfc7653935eb2b42f81b8dde3098b480352ecab98117283a68fbd7d558954ec75b3f808881d3b8bb63a1135b22f8d3a922b3f994fc70517c6827f4ce27b9f5f52c4db63040957d290d96d035974ab6586a21735c6e148d63217129c1509e9fdff233f721c4625af83867056189ba00ca79195feee7304b5cab0a1aeabb73e5061ace047b93a419035b44726fc2d00b21f0821260d905fc3f75a2def94e925f75976ffa138b66dcb647169dd59131ec02efa7254c0bc097667f6e4b3d82f447230e2564c240b443f598aba763b1d00ea5a9dd13fdbdc543429270f8cb38cd3f0aaf831ff564cc1948811aa751cbea38a79010e41cc0b91e271934de25106b6174e91137f9da568b25db4ac7fdde0a596d3af5cc1380a2a20c1e541fcc3a92469c14e4ee455f26d24b87917f96b458b740570c7f99853161343f8677559b832890160a0976b3187e906bd891d407d98bd1ba5d0a781141777b8ac191d3241c87df30311094316566600b822927cf721467ae88ccf1ea5982eb2a0f8d41a8d394766300ef82c0d376497b6d2d0ff229431ac09e93c4c91018eb42bf0ab0c58e35d6f1da01c21f32c41f39bfdedc4eb876756373363ee2c1345e2fc733a293903e3f3a2aa53712a4e25f927c4efda12f2e8b627b1271bbec7b1d585359635c763887f3de6331e18401acad026166bb3a4045cd8c3a10fac5696070a1cb506629bcfe68e49b385a0fe479cf879555f90a0fa263bb272efb42e68334ad1484ac8bb3d32d6bea13177205709140ee16ece90afd9309a89919294111733d1fe21ce4248e765615b4f92d4a9bbd0df17bb65dc2a091fe800501172a123d57483d1718885b0187b6260c97bce09928dd43377a226dcfea73e86f5c39beb32e362a67dcc34c3bccc6161f41717107c2a5beb694d2fccfedd4f8742b7b0fc31842c1b4e395cbef8dbdb01bc1705e326bf834cc157b2747f068265ea9e8f6a57480073d71005c0136851b7c65614ba48360b0d0eb113c7cea2da30052399631fb31fbfbc95d3c1fb1ac799a3940d411b026a4f03e39803f326887893bd891199b5e75a97fdc46d3e84a01e22d4324edb7b7352985020916f8299b5d82080d3b49f759c803872796d1ff1e6160b108ed284253c1e521027b740d50cb5dbbd16b0a1db91683016d979117d069f6fa4ed54b55b299184babeadccdc814f7150c380779e8c17f96409255e2035239a2c1d5458845d3759fc95761b6507370c691a6a03f542b9444e3b256fca807a7decb90018ca6d94d92f893646aa0aca2638c507075b40bc89dd57cf8e871e8a9800da1c30473d899a1db28c91421ffe3e439313e12717242cf7388c79f4d2e9b12b53cd39584dbd9080d39e8bb104dc2934c22e46f1ba9a4d04d1f1730eb1b70953216f671cffcfb9ee80bb750df36006f06eeda6560c8d33d38fbbb961adce26a1d9e3438828c027ae425e3061d34690181ee3839b44a97444155e72e8eefe84078e9c9665e1fd4e355370e598aa6ab29285d21d7fb85029436871e282ed0045282662e327cb94923277268ff1c91e1cf1501fdbd85f19d9ad1149f8c40858f300bd2487d1d0b66609bab010a15057e977a01738ff5ef0a2f0a086eb5c1684f74dccf3b4f9f41841ca3d38fdaaf01cfbb123ecf7b61b6cfcdc55f0bfbb1cf7b00a6881a4135b990813517bfbb3ea8fd7a82e92675b9adf29349cadf49ed60a7b696f4f7b48ea36601bf15d8c86fcb09323ea5ace023973916f6fffcdb11d0215ddb87f2e7f52d6d94a8f23be40fafc154b4fa30f4bf12aa46e93513c6596c14922cdd6d43c515003a9000e4b5d3cd993a43de9edae22b77adcd50ab5ed7dd045ce9d0a22c0208f5b2a39c2435260e5c7749c3f12ba629c01302637d060db440e0e1b6889b5bd1aab9734e51cad898a48d0d0b307fc7f8b7b836a7c2f705b0c061d470ff0bad22634bb3588a6af6271bcb144c5226b0cc22f871a844a07c9128392ab9a11a85cb704c8ccb8ac7cd2d26fa150473c47b57fcc046ba93b7f193c811d3d13aae0ffa96d8ad2d79d484546b5364ec944fe263020977d1c60ca1d5226e6eb33c84f6cba163bd5065df9c43cfceb2caebf302add7a9be08a1b59be95166625819e1bef76ea589683b0f6511fd288b70e6374fc395be93431c87e6de9af99166fd06cedc5d23ba57c559322bcce805392bc722c6689c342f8451d7c5fdd5ec588bcbdd637b7bde644aa32b71c0ebfaf25f833f39791d6a829e09e28ed8fd4d390297ba1348e28249cd147dd04ec467a93a182eb480fac02bd77529e84b9e302f569a64411e034bfb93d3d3264e7de43cc1eecea134f8eb07bdbea4111265a9683b9ac1740213d369688b98dfd22915ce80c3e51d77f940754f1b28088c492a7c93d810d65b1a67abc3c53a9bd86905e1791df14987732076677bc04097fd125da162f46fbc010362cbd2477ee8d5ab1fe899b6ff14046f5a42ed458563967a9173ce33adba3ca378178761200e66fe2f526a476ea42f4dd9a23118e25937c59a69aa3427f48f54ed041db8e6dc8f5cd1aa4b5f5b2b3333b4decfdb078d1617108774dc57744eab8732a4608df311a226144771686c9233300d3f249568cf8b06ba420bca4aa8dfa8519655d66e6b5ef26f35b873977817d39a9383dca421767b2c206065cde3a8a80d431fb8062ffdb332773ba38e6e6e00a9a5ac9fe987ea11f9ceeae1bc84001ab3e5c667aeb9dac380db8691eac52b56b1f330e196fd6c4663d44840a243349b468b8040dfc383ac1a027fb2308b0a119f4f7e8ed455af944b57195a60bbfa394c4897fb1452002551e93e86960061a564073d52585c03fa16fd88e2d2082b7e354a47ba24d1cc75ed02e3d5bc5b16674053c0e3f07419cb103b1c9ed44f1d85dc7909e84bf882cf01fdf83c67fbcce2ab778a39bce29f918d85359b604ddcf51a526e74460df7d9cf2ae435234b97b48af806a980162810f0b0ae17e28e8f0fb6b1148dc3364995556cf15e802f06ccbc8bdc63bfcc5352aa26521060ba00f0ccc08d92965207629e0a3f86dccae80125060bca79412bd16efec7008cbbcd9a9358d5b87aee773f64e41788325b658f688b61b63133b293bd47f592b46022f9fca7042a9de10e3a8ec4415b45c96eea71edc9343b279b950ff3e27617272e950c40d36f78b8b3987d39ccb0b50bb075213a7a684d10d4546c80da4d091b6f1ed7b078966f0f15c744d066a0f181a72017d99cc88609fbd716edad4b05a4f5c335e28dd7606638e7aa7a39046122f8d72efda3115a3b753767326a6d4605beeba285ba5b6b98801a06e32e999c2de562d3d6649e9a017cd516c0af1f845f24a49922503d31047f242191c7dd4560e518591b2e7f35425487bff407bfb9f1ff59aa3e3e0aa8398d43bf52c2cb2a3a324029cb43298377923a0611dbb0a8da2e2fdb0ccc75592cb00bc48a14b11fc0e059f2ccf510f19d29d1bfa2e4e93a29a3b22f07e9cca355eeff0150d017fd0b59f8084ba8d08cfb09136201b7f0e8582e3de83b8bed7c343c1a9254a7e9249b1852647ed77fc9444244781c827d2ca2cd814f482ec4fe762144b36e9d0876a3f89bde7191534fd3140b6a5a869084ee2781e32dabef8c14d4df9afee78bf7f1f241b8c9dc495306f659ef5d00987ebafd27ea22ff450b1a97ae4dc55c682ecdc41b56dd18d44983e65d92d46f202337d0364b8f69d95d25c451d1de08808275dab5505391a52b4d459a3733899649bd3a99358517b0a8adbe187a76884510d4f5fa28274bed8a4b8d8b7664c5a0ca8b6e548d01c323fcdf0dddbfa2aaae16c3a9f96478be3b32107cb90244e6256b3d1f8b4535b453b2d6c435107d9460baeea77021153fa31fd1bfcd7c66d685ef00b9ab986d17b5de08f98bc6b583c5de73b50f403080a62ad831a645ebdfe9fe41a1a60d010cb703f500f71674e13a28ba34fb4ff7e11af8191a3f4135f541bb49ed352da68300fde085f840a4db248c021094b4a0ff4f8cc0514dc4737f8af9e015d199a61ec717be9e6c0d07cef8b5325915088f69a84d87ae63f6a13b2cb6cdb7542505e9a4fb5f5d80fe1b616eb9e4cc4e188aa6227ab105ce1e85b9a02f9d70a5d71b9e8d69baf6081b29b6392e591d4af213133e9c32e2835f67c028bed43ac45f7b7f9eac0442fd625a58e684dbc36823361e31223552894d113310625f25119bebb6227203ce8fe586f9d146573568fee4620d722915562b10dc76eeb272c4cc3eadb9ebd751d6c3f782310f5b39bb5aa03d0ec1a78fc32222ec9d51d903cf1dd25b1108ac2ba1e4ac86829a81d43a361a0ea910fbcf4d72fccd65fd8d9f4c07f4b004275d39da2baf3d6999ef168e441922295f41310157d10edcea5f3ef0e31a395ae001db5c6a2e904c4fe7449ab5c74219ad8873c9fb62b0cb067542c2afb93f38bb9d5293d45fa3d0efb2131f126b21a758b87975b52ff2933ce5b8e1b18559d5c6e187ee717238404a6a061c66a1c794fa52a6f0766e9943ebcb3caf2a10051f1668a73fa005cffdcbf2981cfbe1fc31f97c6e3df5df61ec0cda34300102c1047eb7e789e5a16727c44b4017db664ce0089e20595226ff766d37e8f2bd76a6bbf8ef3d9a98c1702c71aa4ecb7ac290d8e3a9247e7cd53bcaf70918175dfb6f42738a57d15dcfc5af81454e9de42d731121b3e888bf388b00c970427d0a979ef23868cb2518c000519d1f2975c22ba76622285261f0be90fcf459d84997e978061ffc8168504a5768a5cd6404c5bff21e2029de2a217acad7e1211b03df3216a0c5be3f0ce8e847a18e7bb4f98247d4a4b0cb6108531f865e94ae8a2e829e6eff54343de48f268450b922c06f1b83d91da0fd39bd9f15328470d9847a2b35734cee16202a52d28960f8ff5e3fb545f3be13bdceafa952a1194f93454fa8e2ba18ba86493f3bc455f4e7ec1add3a6fe096b1b7f50b5ff3c3f73cf6e99deedc4cc3dd606a7b9c42cc779286c314358dbb24008e5a944a485020a9269afdab74818435c63cffced0abbb40928fa22cbaa842ed1ec587fd31083f747aa5b8c697714038ebcda58c7fed2add589d9925f1f884f7a44b467fc0735bbf46c99c0f2abeaec0bee2a6aebb4d3e5b99fcb0e64e311712571f607d4138eb924fa0e936596a78017300c6e153c118699f20c0a05d3edaece791abb2ca6db0252cbb8b80548012e933fb99d4e78b00d8be07a8031826dc3db2e3c8ab54e51e051c69c8fc9012c57a1047ca79f57d25de60fe1d7dfdf1e78596dcf1adb56b28fbc092456e55d3d961d1bcc31fc98209fefe79fe17fe4f872409a9c2461223e264d4647ac7036059da1621ddd5d787fd2da1b270d6ae153c2757ad3239682b3af341a840362e105596ecab65e89cefff30179da29afc6d254f1d5452d2e7c273d98ed5d2bfa31e749e3f54e69bce47b24c2dd66bb312d2eb1941856793520e8ad055c7f0d7a2a671e133b9076b1690e01b4e289bef4f81666ebb5b9e129fb748282d81bd49ef69ec218f485653d763cb7c3d454d35cfee9070a8c6dfab212da2e4cc539aa2441ae3b2a212fecb5d516a9509c884e77640551a6cff3555b7e63e21cb251e556d41fad3a4522f42403f8bb495995ae083062d0a7dfe47f7c49902310a483a83315e426022e2ae04a2c4fa2b0c85eeb068adcd7b399af2c774f03af2b2fff435ccbe46b396fd645623edfbaecad4ff5b3f0121bc8e71421c789ea586238bebe08d16e0cf513cfc6471b372ff3ddba2f87e2829e6318da3404f947f96e2180c5b4cd7ab3d82af337b593a80d2010a0973b545a290dd509218885c20fbf152c278ee1c3096ccb0bd39cc9727e1d0ac7713c08c739c8fec9741be102b3e485eb3bfccaf81e2caca75b628b30ab8b53e74381fb26e13413a434d04bb97ce09e97759135dec9945024d7032b1a1098e9ab4b37e4698b7a4b469bf6e2efb157527c44ef6234e0916f883d88890be667556e8d436ca40b084dd45cc81ccf8722ee3aefa5b40d68beda65037b2249666b29279b40fc046a2306de9961d03f0b835c24205a5194415b394e05c28c5ccef7026bb53ebc23d7f4caec893c0de4f3cb4f787cb0e0a342f4dfe0f5cdda85ceee0cb1bdf901d4fee7887fcca69fd250d32ddded0ee660eff25d91f98703a097f23337b2a3bc0e7f8c9798a7d39091b915c30c30792cc3b9223f3b3c3bc1a512fa738ca9bd0d1a7b46cc02e5491cc6f2863c88e351848847e6c61944b77d208bad642349530e5104870c07a0c12a693a985742939c90968a52efe1986488e1dfed6d056778bce63d7e29063d128a11dd631fc5724cc169f3c5dee2003a4a350b91339e51dca7e4736b1804f041682c0c70576f5c34d95c406d1f39f6a12fd621b39900657602d5ddfcbe1021271cea0d3a0e412819a2086863bb58e73b32f7ca174d1f63d896b161d2e170db0fa030d34b26b886c106e083f2f169b6d0fb9138b1eb65c277605f59352f01525c6eb03481972069ab17236592821a0b65d44415111701c0729d39c43888406bd03f0c61a839707ab456c6d87bceee6a5fdcdafe70ca9d8882821d2f778444ef21d59a1fe9e167cfcc253447ba880df17d890ac167f8c00f05d4556a167f07995fd715800688578fc57326896bb0355687387c62a08e28496d504e93be3df7865a9b629eae71456e1209bf7d15354180584636fb6050454f0ab1604aa5aa7fb046866a8f8138e88a50292152aa6845e0932d37e0119c04032c45bf51a23790c615f9073696dbefdab783abe044450dde6ae9805b8b12b247896ca5274c71c0a204425b93e948645a41b5f63ac2b4720866b11a7b59008bc72dda8bdb8462bc593b99688c661e2e07fb033b88f95d334a8ff0835cac04598b2bd5a4cf036e2b65c800f091d24202b36d8829dd29d7d17eb5db89f79f8bffd6265f930d3ac16ce05a64d7e268405b7e24e45eb284d5429d8c4f141314e956870bd412acc36a9318b8ba8893a25b2cd304820db3c84120572ece7a18f60daa38a7762c6c3691bd2a17a36cae92cae333da8196d1d682dadc854d782bd9e6371b07513773b324c0c0fa0611a8b8d2576600bca090cc14aea60d6f33fc8e6b1e539b7c75555ba2f9fa1c05d2e9d4774662d3aea9d57e43f8af0c0a4dd0e69633b8abb10ce5042ec7063d96d81cc2d534c6ff0ee41fe461ef79dd844b8b0b9f73b22fe8ca4eef841973e056062b61cfbedb0aaf6aaecae248d2feb503bad197073607c883ca6c0319dce6b3f22c29c7f83fc1f87ea4dcd8f7b743c4cc0e3a1caaef8712d71ffad0fa052a83afd3dbefee85377946ec9654e94e1b449a614fd14186cb521d6f6f891e7168c84bbaf13428827dbb157a3ea08090c320a76694d9824d3ee618cc145b5fec671198e0d1c39762065aef07abee58e0ee670eefdfcde45df42689728a1e13f40dd645a748f095a0c15ff4cc7957a0dbee9ee80913da27d00be9e8ac06344614856bbdc15a07bf4942c07558c300b41f7a15471b9e6d61a25353f03e8b873be7db28aa1c5086401d922d875395e703064f107961fe943bf1586905d6ae2f4af1553308f4660a8543a18c184d06a56ce16e53881961502c531a2aa0c7d79fceb27f483a4ee2aca9e3fc170e301341144d1146800c06ccd91edcf2d6bad16439d3e87aeb41c37eb459dbc2f2d4380dbb02db681073f340d0fd3502395aa35afe3dee3711320ef430ddb9fae65c98304cd0161c48ef4ba39f26fb1e8be0601cf406f78d1c64be9ddd5f2d6bff04f0f7a53928ac48e6d5d2c977b7747c526c3b271f458aaabd1443a02677ed8206d14552eef26847f060c4d5d849983af31053418ebde252a79d20b76b701793c50a8c53b4c9233ce9d100c6662362ce844cbe296fa7726ef63213ca573eac840c0d6bc62697efc1282051232bca60bed0b73b35f1ba64ea5c176ac2943ad5ef44c67f6a8c1fa5b7512eb298f4f0729c06621d9dbdf787726f3671d66ec8cb6dcd500fea7accd1a85d1e018f77fef7a98cceaed97afbc7c4395719042d20a3798c3b8d3a3e1f3dd9d2d4bf3a827ff95517ad0206808260c77dd6339e2f12a1d47fe6f8338c6f8ab5f714cef21012327a7cf577412a2becaef06ddda4f9d44e59f5a7916cdb9a5f9e61769bed58f45679a8c8363449dc05893859ff93c0a1612f801744cad8ed610ffe8d5301b7a3f0503ecfd09e283d508c0d41e5de165dd03defd8d7b3cc8e61a08283fa41287e72411629841a1f18a8cdf90ee12a10962629e1eeeb3378335606c53fc8ac39c0fd3215adf22c3cef45ae4f4d419d73ded20914b63cc5dc3004aed3004edbc7f376dabc9ec48fad6964457fbf6eeac0667ed02173f6f69a12944f6c0fd21a2a36b72120c5c82e921abb5ee01db7060f332d3fac17b42e186b7991e85f3fb61e830e0b7822a1d3e6ac837810d8a97175a27a12b3a703f18288b63503ec8d96f32c672eaaa623e66adb8c535fc2764060f77fb9a6881b393d3742b709a8b5286cc3cf323b7c3698629743ab6d48c1eeae1c0228c64875003c6e62ea019000d543dd5a1f4bfa0ff1bd503886c4307eb70c46bd1d9ee6918d6694a79eb0f7213d0bf9f8cbdc4bbae4ef2a938e9441d80e1e11471f0b986834404e1f03bbb5c37ff5bce6f79d767695ebe0fb8b06fa5881cb441c6741de1084b32b787dda6efbb5470395bfaf71241243220747230841a6ee40d8ac545c94e10aa475f9a694ecb72dc246fe4046875d41e47f686496fdff2eb13836d8f45ea18fd407fecf7bc9fbfa82ae8c4b6d07997b6cdac016322841a35713cfece7401209f85658fcb1937066a504554f3c7896d86e03b587fc1b0ba298ae623dda3fe0ec5d06bb048be374a18117a9c6d8c6df1abe3b54ee62ba3c4fd73e7f8abed9611a8c830e686cd57ae021a8ff0719c7b7cd27a2ef8be49f5fb32521b1b5f70b1fbd78bbe706df1b1252fa39103d72ffacad8a04a6d03e1db4d01bb2d5666cd6f45cf418ed02e4d18b85cd670f015cd87518776accb8868086bca9fd16f68048f435ea5ed53f2124143fbcfa0446a007ccc54b4c50088262682041f8a1810347d6bc77652ca1738841ad3ae5e90d4f43c4da88282f9ddee9db344e9ce64528bbc3b0b4d437fdc10c35ac43f591456837357d4791265ea641f1bda365943766d92965570be1531baf0542efeb7e18e7369308ef006c5830d052e3d9d64e36b5cd6c0d978d2d3241aa38f66e966f1c613fbe743b709507aac4ee882546e984f2d65c4fe195dee94008290c9ca651c03cef3668bd603cfba080213c61e20ffe52d2cce5ddbceaae7620af0d2f28aa28f61075e9a8a615452e166e675a75c08876c120fb3c8bfe0fdbda999a07751e70151472849eead80cdddf01663190f2ab7a5256f033203378789baa144bbe4cafe0830533ed2a2689970ca22616bee14b3fa047bf581ce79b27050006585eaa978ab1f5abc15ef32fe4d587a70f8b1b1f8d948722449543c9671818867951dbdeabe019430ef7d9cc2fed9ef82625c7b8127c327456100cf0d60b0fbddd275171a8535b36a4e08b1e4a42d39ef32291ad5285aecd8b86d87302509cc68fbfe86c62dc3f0b3984044a2b5cffbeca7fe9ed013b38c1a0a4f445b355a49d9ae84f600ad28b402acb7a6d2b8ffa40b05cd15acd91e725018365d52786832b23681e486639cf6d271ff9fc977278d7b8de72f5ccc7c5eacce7bc3735d7e975576a072318137ffc18f67a68723b577bffcea64ca14b338aa5c1ccb73a3bcf312272d55e1c2c9c90cdacc776185eda59b3acbaa64fce5854cfb47d1a512f67fad25458ae82aa65501f6218468146fc21f26315d3b849efc6fa2378460b17608ecf25c9e1760297c4f343c18ddf9374efc28de671f45c3cbf11bca47205c7b2d281e9518325fb6290bb023194c3e064d6215220dc512254b40b8d5b988cd7719ab079c96872cdf042cf6cbf47095a08ab8d40584f160961f3c0cbff0f72db16a82bc06273e308df2eccca83dfb438e225436f68e1d79d89dad9f47535e0ba0767c18100d30ab6e3940a45016ea37066fc039cd355d8dcf0ca69dde005d95c2e4c5ef8d0c61f467df5ca5653d93821b34a99e5de6f5c720e6071476322ff3bf274568c16f2439b4871803103c1eb8fb3646e3f4bc1f39e57f7c74410d7d3bbe2e03fe8a21f6545b316f52d40f4f816ce11e948e408ea7a333506fa0547fdb4e4dfc19f23bcd5fcc30d28cea5492a8addd8ba59305fc510daf68da3f1515a766064ed3f58818ee4ee678d86d8e06c6dac1f3e2905dc7600e625285a1fb4abbd2e92f9b92a60ce9a035df561290568d71fa275b286c4bdb3d8cf9b8d2521442d652f6ebbd818568257010e7f9c8186ecc7e1bff3e9172b121cc05a6ac184fcaac66bb5804a87f2530fe43853824de78b4fc1709c533e5d170bf4552674b788cbca387a849a9c7809e44056bd9141a2fee0b37be5a4cbc389af5d48089f4990850278e924702d55859208350b882c3c7a7654318aa1100aa8afd6456d0c0e47aba8a8f8b43a6d37f5a7f79a58c80e18c7d12a535b4cdde0959f6eefc5367b4fcce453372cc3aa3bfb2a562ac1368cec4d7fa2b2cfe747456362e70401dc3694ba1259512bd520eb224fbc70fc852b2bdeca3d569644021df0ff0b5a245134923d35f7a5bd1966a1bcaf7ff5c4fdf06818831fa670583d20818f505a878be496b8653cdff0a8e56b77bac685eefef57cf2452ce83a4227cc6f53b1daa28a0a2418d453aa62841f7c97e9c8112244240331251b3a5e922d92f51adfc3a19a2b845f85b158e99ce6bb7e9d77fbfd3879a1ee8be451884a112c3677dad330d6956360e587f733d042c6bd967688297d1056236ccdbd0a2c59a87b2c2d4f84d3caa5372f540dd52b080ff9b9a35f91730884f1986a2279d2ea06911db6dce741f0c260b47a9cc5284d56fa7a407ce71a3d76c27a7649846c586f5ea5af3a0a1710925e5b83da7ce272e28061ea4ce9b9920e0caef7d5cf55d061a3e5ac3452daca240e174daddab736a4e6d5b06d80cc96a44d6459e91491467f647f8d0ef8e34aa66080f73ad27073f8078cf500f37417084aa23d9c90ca12d442b2cdafcd48ed74dbf89b16d0d6183ae5b3b573bb96689c6bdd43e22fd77a473b5e851a7aa2c5e23039611e32b08ea160d02584a4f2a3809b296e5aecbd8bcd5ef82a1a92be5ba1c22c002f5260a82aae9085c4ba6a0dfa7556db0bb3856b8c4ca13b360510eefba52e68344c91a68946d7d11bf7e7e1e6f0870851f7aec2f8de84c8acde4ca008c74c11201968484986654bf092fc76e3d98c2f244cdbd198c626c21bcfb499db8b147fff4abbc2cd88c58fb7c504e6584596e030258873791acd224b9afffc7a261b4ab2c6fc056a92a9dc3454f29a100a261d6247d1ab457770a689878e6ed4b98378dd46458acd7fdacf4938cbf730949d65364b9acb14949836fbf964bb93eec5456e48a90d8f57037479e04d7a00832ac5befb614d556fa4d5ae491aa5b3079fcda72042269c9ca466c4097fe28088978dee7b7bf7accad9a1196d819695f63cfe2a8bde28fc9c2fe2e1eeb6f5a6f56155b6e93ddca3635be8d8571b7c9f81925a421b240be54b12c3150e73f2ef25072e080cb41af66a6ac81dd24ef825886e03f574caf9df9474f1193a09d7650364fbaec3e0ad70d9ad02a7a38d51a0ec48305ba5b8617e56777cf80a66ba3a3899c5f54b96ea11719d85f447a3d0c1bd46e7bb1eaf67a1713af7e450b22de89953209d61c42c5ee86a851efac38b5b436b9c8aacb84293315111083d64e3aa931f859ef48bd4f26e369546fd3d98852c5dc1cca2e427ccda7288daaab84ab2c6501fec642de72f6be8568963d8576a1e7d2724c50435317aa73d4e5dae5fb2c4de2e5de850ade5c0457b919002170a8d923aa94b0863ac676963f2f26801bf0b7335ede78e689b9dde0312f81e2d2b8fbf7fa8ab97ab67b55774bbbd23b3029c3c9d5e8a93087e8a370a99fd5cd8ead0f87b2c001739844f740f0b3ddcf591ebb10292a4981207c345a7dacc8228accd36057861750df28cb877381aef0d3ff625ba745dd2cdc04199ff9890b89d71afbb7fdf632363e4c51402140910d1f02f8ae85851ef333cfc3f4807fbe6a6633e9a4062f4c57986835120aa8d7f4f7fa9654aea9f8662031ee05410478d644607a61c2a7f42633746aede0788cf7c3dd2c1b5b1d8d7cc1ef982cdd21ede222463be9e31ac3c81d46aaecfa745ed2962b246b4edf92efd01257328d3c2c15d77c6c180754d1f963675d45be85ad43ee134808975ab4277c2db56fb2bfe8fca8669504938efae0c57647e67858778d6f7fa747997c9436b9d3e621fa04c0e981f003112d92dacef4f4225f02ffd60995c9023fa7111f41f26a04ff3b58778d0463e0c2dc299937ff9df9f96f9ff2510aa89f303023dbaf3f2f365922cab0a4695eff46f04bd9f1fc8e04d62d5f1fa0813fae4ea1538a35f5b500c28c10196b90de6fc44535841fb5df8f2433fcf171993b5e8601626e426d83a0f28ee785d090d60cf3dfb3452844e232d97236d22314c08873837cd1f142ed01cd341192c21d7af05e9aea56e2c2fbdf556b8ef15d75bdc79c3327116cda468c8a1a7208cfdef1a0d551e107ea5ad832816c817efd81010c278c09ccdf22e3d100ce5dd1ed712d6438ec4d80190919215c3a4b70d1b419e5d7e511dff88d5b1c990418d663eb31c51701b657ae5592b57608f05facaf6b15201d0f282695fc1edb93b4c4bf6feeb0818ea1abf5af5392b7737401204e5ecaef6ff7eba78f64fad68f066a416814755723d6d3df73baf46e4755817c2745e593a913c0a73c1f559e6a3ddf4bb4518f84117c8ad708159366687d871f22e67afaa14cd73199b38d0d8f09b8398e5e1d0e1c30bd929398b527305bd45d8ba57c8573f6d36520e9e780f67ba5d539a4976841ea6b0d8673e0b62ba5bf14bb14b982151d6e8b43e6fd5bb679029cfe80fae589b832918682436feacb9fade32641d705a3796580d0a77bee6cc5f0c25ffd03c9f903ef1dd39feceef660a2f8e403ff218ae63ff1f5c88e62e54b8825396aa05b762254194d1367a122a22e70995759c8c3f5da8f76fd41775155d8591ff278ef560fcf05936bb404819a9f8baec42dee62852949576af6c719dc8b9292b105ea36aea9744bf40942de630ffae4ae55ab1b3e8cea045e742df2a8ed63a20cf1cadf5e80f73d96e83ba8f494ce78a9e4e9221b58c3b1b6a675c13dac1824cffc1c7e1ea33b04f8d894242c38b111587fb4dde8f3616368208779257c1ed64298bcc3a5a423f4f410d2671c310b479d1515973c31f83d9c545bb99913767f627ce46f0bc3967cb05d33bc79018172447cdb27146a0a0c830a4236dc877de8f5593366b256307c0bde1f676c7b17e9444d4c68f7477e8a40418106723e1ff0a10902a93b3a72ba30f5a9f07816e9e609aa9b7ea573b62449797c41ea71973e591cd90c9309b9b1d70eb243b19d9ee6b2931a83657e6911b67132c4f9099664720e3332da0d03048e3c1e96cfab911fa0b6db711dc292b062146406d97ae3e36e585714e890191d7aad654b7d01324c4b60b6b2ea693621bff411e97c46fc76e9bef73c940441ae391263c7acd80ba25612020e2134c034ab23fefd98e8c76795ab1ee4e3dc95fcf2ccbc2ce95b8191b8991f292f1448b825c2fc35b587228f1a624db0a8f93f692a46c1088cbc53a9a040cd3785d035b020d2db5e52eb5abb47fbd4b98e49035f94913a95268f9cb59eed65f845bfb86e0b1e2609d41254012d74545fbe3146c8cdca226e4663f081076739e83b9b0a38bfd467738488bc4758ad4f5c5aca0cc092cdedcc25f6729a841e843807a55380db9f88c18dffb2431237a7e02e3d35b42a0903a0eecd6e1db4dd2b11514d05a99d6851ec9bb2f608c25c6433f2fc1fc9e6961aaf7c02a3ec7fc7848beefbd3bd41a5938764fc5d07306b2eded698ccd2fe73e4d00fe0ad85b7b6da2dc3903efce6da493abe560b6a541041f3253d8ddaafc031ad16a0107013524af422986e069b591ba4319af2efcc4bd5d25401727ea361479674db76fcd128ea398ee7cfea85cc99ea776a852367e432a215d6aae41c9392ad649caa3fb5572b63fcee93c639335f8fd567eaea6e0836de040ef96ee7c2aa8adbc5b68679ed81d91b4fb35f244b75d65747e1de3117a928670d605330a57511b8757e1de8d60b946b2437124b2e84669185ffeb6cff6825b2b53b51424cbd3d0846171e2159d23922f8f83452803481d5db775947204021df81f86feb6bb111f7f9b7ad0408e53dbe9f125f7e5b7c0a08f59a7b9715726f5f79a910bd95f8b6c58ff1cae7655f2229bf9f5707c9ef485102a33a59845511542349ac1b92e8bd2a5071d6bf0a13288d7790401bab7d4bbfaa82804fabcfd287feba30b666c0f378aab34f76f28f6bad1ec29a0e71c4ffad982d03df17f5b0ffcac23ed13becafbcb929518a2a317d05c64b8ba5e7d871050ef71b7e2c1af9483c04efe8e0606a8e93cdcd25fae39cdb8fdc97756d6d2eaf51f9fb0f5e314f875f2c6859923a9f8ba8970641938146bbe12ac1f99bb418c6382d5a03847357d67c8f6d5e77cac96bff7f995fdd905f9e0c1a9e4b718a5973f6fc203bd28038dfe5b1efb5d4884fa38ecf97c39583cd0a46e8e713e026a7658333eeb9ca6c76557c86cf6b1e53e8842d7e75d2ef27f3b7526efac7d43c6e39bc02c34f2575eee74fd8b3d185b283f8968df61cd53333dd5fdcd2d8dbe6d6845ae06e4792ddb89b0ce2dd3e16d502ac5a448eaddaee7ea59a85aa7525dafe9c79cf7fbcf22f5ce616f139cb4e86cf3812572a8fbea08a0d836c079076a6c07219d1327fc10e318a44917401617646165f061c3debe9f8f1b4c365fb08f938a6e3aa671c61b7cef8fea282486fa02d5d290638566755b2d4cf04901a48d3b8a567b324f03585b918dec646817dcc02e176cb38c878a061223bbf8e27d4b10c3e0fa9f5fa1e4223815f47663f150c7c1c1048b942bc60558a0e132889a8256a4d97ad9ff7408b309e2b72f58f06bc883eb101314703e1b00557eab1f1e402c7aa6a78b20416c5c7b9dc53b52b67295bdc494486e49225932d0d5108776bc5078f0797e8258e3fc931c4e1fcdc4cba19a1e15c89d2563b23a5a2de747ca3fa88271d9d2817606593498157b64894730ffe04bb92fe9012e1f4a761a88b07c20f892a3ea5d6819b1662fd4dc3b3055397ffb1cefbafbcc72145e9f594cc82a3dbad0b834ddb8c37a160a40d345e424603d74f98a7b3967c6b351bbf2ec8367ed839f7dfe4fbc47e2d0a1e0bb63f38c669743ea1cf4630e5a0e8b5d2c1bc2677d26226f2d8917ce1dc688c15e298771c205a8cc10997a78a2c6e5b405b89b10a88b321e40c466809da64c4b34e0cc433f924cc37f860d002ef2dd7afa162e5a7bc2bf290d3c8d416169c162cbf41b1fdc1aedf0cc4c2db0d4bdbe47b1ff1ca950770e1758f3b086fa43d27c2f56bc88134c4ad1938870c3b7374294c44637b2c87e67abc65bbb3895041045d1a9dfd7dd0ac3bc93bdd6c75c07911f4024a6e8e63b0a6ef9a37ce44f73fa5b14f38d2b3ba2b3393222cd4f584287de60157d7eebaab2dc382db84a49fd56a1d32537fe414df215c011a30283242cf4062a1d8a94ca499c227d28ff995507d62a237d1e4f2a8e5d0da60b1abf9d773ca14c1168165ae60ea3849c9490fa06f1930e8217d16012567da6cbb7983bc8cead8b3a3f92aeb2848853265b9a05be638a7f87d76a8ccf528c3160c8ca4c7e1742418ed1dfc462098d719ec033cb85ac9c59e785058bee5297df209f94aa566a479a386ab144dc91c24db44f1936bede4fc464ceb3f706d24aba698295492714870c3c09b2d3857ff77a14b879bc23ac65a2f86e26f57b72d6f81cc38f0dbec41097828043b64db7d137440362e50c8a2baee6187282058a03deb642519b405b960da73ff18f986eb22844099f82bffbf4be9a7ab970a9212c634b30d54de6cfeb1702cec640f5deab77843b78a03c6582a65912b29052b911dc22daa09562a43404b79535634798595ef8e30f9d8cafe147e6e0810420145f258c2c3574348f7829cc640d0e6dbf6fb8d827aeb780fd7dfb978dc2d7a1ff5f0234f6a17dd0ff123affcc29be8cc0bf42447497d5ad6bf15ea26f74dc740dbe1020043a7d720fb35e49583a6ecca029737d2d77dcbc3add11925546187b723c410c0fd636fbf7b336032c5bbb6bb78af77e91bd1f6080268cd994b2ff880807a9496daae284238e5c14c0e1e1850b4b4fd9fd90f09d214e5991c730cb6e0748f09bfca2bc6df58efefd2b795f03e851ff207bdf9e6163f5ee7e8733ac288a525fc795bf722c1d64ffc3b974fbca8a2b953efa66918e4281ca589618a760f88c199eeff957a9d1fdaa543c74c2d6d1d842e53b5f3efd69a785768bc938f3379c5c9a8458b2ede1206c57694e1d9ac7efb598347b8f4b43c966476ca53b3e82463a25fef659cbefca93852cb845e2beb54287056e29071aa7daa2cb398cc00545b22597387c2d663964a1e3e9b28d72b762bdb32f1640cfd6a02560325779dc05e206490b2e3a99fdbf3125e1fba422cec746fce94d9d1de734405df1bb686cf37520074db7ab9a5435e28135432a107983b15f9a18dfde45ec2ae41e45aac9de69361bdc781273c93fcec071e30eb80e4189465fc16b2e87b854a83a030881fc7369b2247878f7a9ede5c5e16fbcb60172fc7a428bc7aff7db4ed3fa04bcd314c0d12501791775b2da29167b756cd2bf1400ea36f023e22d3122d4d2b1e27918d8be87b0b8dc9ad3d67ee336e649d6c3e2b4fe0389c1f315ae01cdc82fbef3816418772c1ea939388a84447ddbd7807c21915fdc9a3c2ffdf9e8333d047b83c81bcfd38c6ad12cdf6bb6ee7709d14ee1c946495189c7c0ca8e2f0f66a58fed7b285b74f15a867d7caef94e8029b62fc87a251cdab29be7ed24b8b41f5807e4a917a5640bc6ce91ced9dfa96bd5b18006f3f320d73effc97c05396e269acfca17c8caf6c5d1a9d4e93a96402c4b78cc172a7c59142eee9a37f01fe7ed2c48ea1f4d67ebc0e02fb1242ee9a83f3e0b8378e1629794fdb55565cc595a66c7fea8f842080138e3193e389acfe176a76bd95535bb583229301a8506264140bd33d7a0445fbcadbc9598f904f3a27a2189132f570ce702006f1dd02e1e8f7c3b25105e4e96d4a2269daa3a3f6709782df44c21bd454c990c77704e81289202f81f48b6d3d0d2b834c8d4d383c8bf8621d8e3c933ef546ac4e670908ad6c49e496b8f0d6a1ae333c6a2ef8936eb839761ae64ae3c6a685809293d3b961398638a61afde34f65918b4e91cba2902db8cee8e540c84e3a2e545250a1d1f699c5e4f2baa538ce39ec527e72f9445beac101131f0eaf492a30319fb56fb0b5dce971d68750680b61149dc10a31b3ee4012e1cfe33b710e40fcabdc45b748a72c10e86fd7b62e411f29753938a7bc26d91471d9ef02544d1d4a9c37b083c7b4d5ca330683ffa4836c33438479ce0a4cf89a558ae46ae962b231b68f4b86c78e378a40e0f9be00a3d5eef8eb4abe10e1bb43f2f1ccd3cfa4f13d4339374ef40ca7e05d7eef26df8ca057de997a46d1aa3cca67a32d952825bfcc0ddab0733b2e2905d3fe98d0b25adb2c7cf87ca64eb6a4b806f9b89d5a74530b3a7f7f027b6f38c0908944d039a0b7d437e6c8f11bf049e77b9e83d88e8369ad693133a6d918b464210cf183a7d9487a7b6f055bf54a514d5df77baebd3ce45c1fc461c41f288f700a7110fc922da83bfb5a1f8fa5dc69fe2897c3c4a3ae98e34e33779bec8d9365667c0b77ff4f99b9ee72946796a9b269f6d56ccd033b98b05207133356aae51a4cfc4b589a923c23adbeb6f7d4673defe73e92a505b1555bbd240208259df931a04770099e220f8179c70f26adeee7fdfd8adaaafb434701cd816d7256796631658618ca854e74d8a6ec9d1a4b5edd283c2eef85a2a6e6791e60a4dcf41b02c3cdef21eb8226deda47e9b38d92100a8e84b7039bd62ae0c951c60f8888e7c0bd204aab16d9b00a13b1d61306f870abb17c3a43c8adb06874cb2020d47422c332fcfa4dc832471698e99a64f1cbd862e9fa2c0fa469b77be190fe9e1f18154c838950e9cb4b7360161a7096b74c6df7e982c87d700e4f8b1ba8580cb3b1f1f9585da8128b09139fe371fccd3cf1075126c3dc534a704333fd83791c8543f5411dfd2cd9a02fe1a62002392606d01646134dd32a0eef75baba56626f41370c1127e4ca5f47d3f41739f664dca4eb8deb75b371184be7f4b0dc22a69dd98aec1ce80694e72b1eaada24587489408d707d66136775fc63b0b746e3b5423677485603975a78c29f956b2f944517bb2d66fde31a877842cde163c094e2eb0bd9298b6280bef17a46d80b59b25155df3deb9ec2f395ea177c4cab596e7b055f69ee0cbfd06b83b28cd7f32f62e2ff2cad698f36d1f46f5c4e2b74c22975e032a29969b8146b480211371bf95aef87642395847614e4eb190f2261938b82c089537394dd02fa6ebfc2749ea027925e3ce45f24b8cb80a1764c435105da672ef1d1a27dc776c1ae256069ea71beeec0774855f1cba35a978ad67adac1549e811c833f4e5618218a4b141916f17221165786913b724865a74f38e48b8a950b8d68d445a1b46304455384d19efcab4700e2877182bb2df0b34ca98f6935e8bdf12649d2562051baf1f6484eea18b4cc303f71fbfd852bd91fb9f08052768c22eaec7f28c75a77917176a010572c1cbf3e098e0b33236a8d73803e061be5da3918c5eda3c4c93424dc0763ab07e417158b77255efdba0fbc1eaac4ae8806a2eeeffc78d2ab1189881f1b6d1e969750916f67c3212a4c87000bed3206b84e6c50bf4a49da93683bccf1f5d441879da72373e7be91ce9d323e393983498a649509c932d976e9f6d062a093b72367c1a0f73e31d62592507a6510a0f9cae5c3106daee23e195f248228c4dbe77c15a252586a556e4bd38a16cbbd7632b64792c0cbae0b5e260728566b844b0d798b824429b6100aa61af3707c7c8607a414fe90bf21be37aa4de51b02dd4f68781d92c3b568f21f60d0207bd58259f3c6b286779d6038af61641c4dce9ee079b68bfb10e63bb1c6f25c580d57f9b4e6765bd1b9aee1d8c4feb59af48fc59b4e3c1d51dfcfc0f52355cf3f0bc10e260c162782ac1d1f3bcb0d61c4c9c58f08dc93a638755f97d4c8cbb233593d5228690a62803df1e7a71cb805f5f112c47d3e40a82d0eb1841855470e77f84974b87ca876bc5ebe975f6c0e8f84f9374121204f3c814bb28af37fad69593f05e7a53d682601b485619a4002efaa20d2f3c13e4a0160eb96228a5e76785538a64e642c65de509d3445a1bf31244910802537d45b2719574be08f2df6ed140deff11e2e9bcf61e12663475fdd586d66952d2e95521c78d9e760d9d3d8f401d14aacd064fdc8f98fa939f1368274157699a6a11c642ca0666750109e27073b670dc4d460cbc16b0ad16c3e6b6a282cd6a03a3dcf171855b6096a9b5c26aad1c557cf9dd6bfe41a0da9ea3a306a330b4d71023bf70f00aaaa89e21749de20e2fabef0788521fd21aee5f716a090f4e33c223384eb74506372692b778ef2e18f57f6bfe728d07b76ea5a5db672d94b731312053c75af884bc5a241897a0c211095d25928da8256a5a4c70db4dd234fcba339cfe71d00fd1e9b8a17bdf61dc384cd9ff09a1f0cf212c588e6d270525cfface497566a26963c70f1af08e685ec557ceb0e3f5f7ac06dcf70ecead6ca81740de11af46c419a13a2bd323c9646d7150699b6cc672690bda7f154a80774352fcd11487cc8399ba29f96b2395fd67f7c8ad4c2828aa028f3ec00046964f4c83db7bb7869611f1fb7b7be1501fb1de4c25606a93c32aacf80185c9f448fe0da912f718473f2835a381fdf8fbbb05857555a9896e95cc27a4fe9c5d76646a4d9d063ba6e208f48f5ce8346d4ee5d64d123a7a20580ee480ebe605c90e0d18262df2d53ae4aeefd3bf1c9e3d87130fa2faf160d2b94be5e4f89b628d35131082076e1fed36871f8203bdbd6d949db4f73969342164cfd1cbb86aac8c627c73d9a10a2990984bcf4c32618e8c9ac65c339cc283eb50706adde5a7d901d92c57dedea6ebb6eed8c5d37fb95d80d76a867b7bb9b81bd8feb47b0fded31155695b22012b192c2ab293f08a0ade9a6ebb92ae752f0690383e59f1af91436ba5b1d236e18d01f37bdf3336f815db8ec8eec46368fcb4567d839541fec30d14b960faa539f0f8e7dea1ee3635db48a3fd02562f8c6d059be7ae61386137c6348c40f925f46072f241bec28efba39965638ac31d2329d9f3c5fd3c22857e4224507123af02a4c02e84f4182b2197c5c16fe9b485b48d7ea6cee6e3cb84fe64b30667acfa421a9fd546dfb43044c5f102781bc4372867e01e3dcbeb251596d5e8e31f70deb1157fb0ca69a1b4a338cca966d5efa47c324132ad1f7e186ebd6723055874ec9959cc503fde976347c3994594abd212081c94f628f9e224a941e2e1f6252bfa397be9ad4853ff53c4f7dbf0c5e15d2aee3aacf44772783eb6f7c981b55d6ff4f9768834ed432b68c90f31e88e7dfc8b00a05fae91de021fedf36ccac7c1b0d0b7d504793132d91519776b49aaeaa5a0c268aa83830e85efb43cd166d2ee870224eb0413f1e41527b7fcaa757b1c6d28a6b2dc1f5d3fec1150f4be3432acd38070ed5190f50859e696c3507f2cec74ae964aed4139344d3c6d61d9cf91d5a0d2734c030105b9c942156320baad8c15ac74d0341d3a506dba491b6b03b74fa60c26ca8ef06737e941fe60c9d77eda52010ccc51abaff963967407aa3f2d5c221822d5326ad52e90c0ea99bb4dc2a7be40599a1b7f2618bab2fd030de49b3fc84721dfd0f994e9cd1902e481810139cd972d477d76ebd92b04eb6874c8fb62292f3c0cbf739699337fa4bcf733ddf6fd1bb89de543ce8dbf81bc219b37902680b36ef002cda1643879920b05e0fe697a68b9bd37289807951acb3226b55e848ccd3daa50b1eea492b29fe9d757d6ef6f719f24d2b1256bb12e0cb4f5ed3bdebd7a509b50c61eeabce60c497652202bec5c32dc9da86449f2a53d315b7da16ef574cb15bbc9432f961a484924ebe8868ec28d236f3973d89a3c3d1d20b11f639209b0ae4f3b684609055fbb85081fe9f88acf0dd80819ad156787767d4789751113a227338bde2be5062991d707bd91c63bcde0d4a2c39177d348fa33ae596f55414b7eb11c0e31a2c39bf021772b81d16570041dd823fb8a57cb339141b51d0c3fa0717d124fd43d9d5a8cffb0b149c8700890fdc310907a886b600bd83510976041a43fd0709218e2f414d386d6d35fb24ac13d56dfb13fa5470ed7c193fbd422b7f0975d73519434f7f935419276f2b4534daecbeff91c747d91263c79cfdc3c09eea909af0a138fa043e75c7454ce3f80073ec6edf6927e1508a4134287465a17930f38774ac50fc6602f66a7ad7bd9801c587bd17801d96ac689f7c62a9261d9f74dee6b0ca8452758a87880c0cd693f7a85a27edce50881dc337e5f9a99267437991b19d83f8490266a0f46a95d98d516995e968a2981eae28526e81dd8dd7f299d799301fa5bf5747ebb9b9a419ee4d627e140e4e11bda80283e6e2e1c015aa57a868c1de7074d9c844632aa4e703b4a69ffebedff34d4186671b912eed1a5a9ef6fb200c0e69496adbf7378fd42e3b411c37a3047d0f7a30d96bacb2332928df558796fbf7025482111032ac964675e108536ef017d5d99bba973eb21e5705ef78f821ce60ce72f9e79a806b50d7b5c8f39f83161a38ae8c093492d9ea6f3b7a931ef860099bd9d5652c2b70ffb6642b91228cb7720eece733193a7b469045b273d5c9a8621210ebaaaae28056ef222c17d070cff0595c9676d70f7de9b2f347aab8fe32efbbdca06135b2c508d046fd7afc46d9f3de6dc7d66bbef3f70fcad1804432633a02111e691f15fe11461b893de8cd1a068a5f2185cd9dc68b36dcc36d9e54a2b816e2eb69c44ef2700a933f1c4c266389994550a0d1841d97e50db67ec37fac7d8c8cb00de62ce5d58aecda6bc8940e459ed25702c8682f4cc91742bf47ece1626f9f9c6cf3fbf6ab863e4226b8722c72c1181f5d0d65a19812e6262bfc30fcd1f712df45bc3e1ef093e48fdd1aa4ce71bd58ef826a5f003ffe8b2a80cb0fb67e953dfc2c6f2af25abbe2c3dd5f2e273d50fb815198951b59505397c80374a1c0ebc9baa9f5b9e3d34fb4c18c3e01c41e237090d21679d33350afdd4a4dac8f84d79f71ef945825b309a231bf94c5cf00633de9359c06bfacf8b7dae4197f37e62f1ef6873ecfa6c72924b757affe544ff870fa8b3901478c3b675c3d4265483e162df05eaf3bdb3557d31fce0afe49c288d9440b3d23f5e87f8af664ad2aa4f769ee431e3e0036f5761fa6be19dea838df59f7a5dc56b82a37f68dc4d2936a6956f0f7905ea90d41b8a09dde4dea84f7bf3edbcfb6689f7047150923b2af98771f7ff1b923a19b508a9f9e185076e9e9eadaa4a97489b8fd28e7c457adbdeef36b0193dbb179807435e816557cb4b387d308ecab665deb4cbd4529e596f8c14d3a04c2e2b84c436c38dc95295a9852657acfb839ec145e80890127469b55928cd9ab5cca7dc5299bbc81fed686505156cccc684a1a89e91c2341f2933260e0e6ac9a0a97268b1936d0ac17f086e4e5f8a44a3c95cc4dab0922f4152f23a329e6861ee5eae378a7c4df8767659fbf4b3aac06dbf067010b30e193ce489c60cb7dbebf05067f9f7a5ad1ec51914c860ab5999345106a97c3d921c8efcf8ef7a0c9e91a8c6555213b7429e35cd06ddc967a81e5ce33926138c366ca0475b1004b0debce77098182a9229aa32da4943db892c0b54d1a01130180e1428150f97a80fb69df7aa5fcfea6debcce2ce9585a9628133808d6759f0a904013a20602efc5058fb932f1222e80fa316d7c5313d1d35a3b23d82d1d59931edbc552f33444acc4920adee4000d4412528e7b0f398ce9e139f805e68da1693b8b7ba8b470a2e1c8617758f4d088154b4e6809820747f1fc5cb5e4d1c615dfa7c535c81901ab699a6f336f475ca4916e1c5390630f298d0fa2df68df0569ad2977d3cc270d44eb1d8fc0dac71de2d7617d8940599e36d5d07c08ad337b448b5a5173529951fabde116562c34d9219e0f23285bccf41263f34ac04f159be7d994a03e8a1e70fe1fbbfde13fe27316631434226f4b5a97af75fde227a75ea292e16963686062afdee4897443d610f275ffeeda8ee67028caf576874f5bb1196318594fcfacc71ffa850b7782a86efb8391a20240801d6ee257ce107723dbbe407aa29176fc844ab2d3aee0c235afe235376ee96d87fdd1c428e31594b39536540049f3e1c7aba4847511ce0663a87517eff45b3f81a48d66b4bb606661d0d586136a335fddf700bd56d180370e5fee56f56d35e760b47137f56a773c70304640622f1a881acbf197eb4d5fef14c35e3c73a4c41b839868bb893049dc105300ebd1422881d65742accc01e5a4a69dcef901878c5d95e1344cafdd527c26c4a46833daebbda3267dbed7f5bddebaec1cb59df98b4c338e4ef02e5044cfaf8b59c772f06c8572a21dcaeda871908d83ac4f7d8c4055cd7a01d533eadb2cdb4552926ff82262c6e0e5dbda2675228745a68f56892441d84fea41f5a3d2efc261dba2bedda38ee7f2be94c2c1d3aa155d0236199eff6e15fa7bdcf6d74fdb33d49ca8ef8a42d723f48e4a767200acd40806e1f6e031e21bdbe9b015a6239a937abbd1823e3005d06b6f44e4a103c24687687d4470589f6c757aefeeac95995f2a86869526cd7894da96ec4d6604a427a8f030aaf4fc8c65bc15a2696bd253215134c2506ed34fc4da690b734154a8197a003a11df3e2068d6c58115062e12ae9ab1f2588cab0e31e41d69ec6f99476c6ab28ed415a0098b1f61e26aada11cd6a6e390541aa97eed5710e259aa6454a26ec1b00f34435c7be86a50ffed53fef342e8663c9ab1023904714cb0fe2a3fabfb95c9d14065457454724ac2851c4daf0a3621d9d7be029744547dfd9696e40ca79b93a2a74c7108c600ec7f16fe371e7f90a2af96db67e7d77c297521f2f3098fa87c3adbc9126e673144b33c5206bea2e3ebba5f4cd856e69394eb914f8d453c7c63bfcde87883901f7771aded2a3e249e760317d129437004fda7aa67102d7d8719735de3e273e7a7217772b38068acdf235a6f729899693a761250c0b65202c979a880f53b1289c427b015b660a4951c1875cfba0ab58c3a13cf1bf2a5746a7f89c88ca5379dd53099bd72b25744812faa8fd035dd831ed6e1b4d1e7a0304c81a88344442e6036a5eb9f688d25c6caf2302f203e9e87930d201cb77673de8c50031c99533ead74978fa9b4313fc1badd4782625dd1bebc4603d16f3d4a2eebd2c6e0f36195ada944d44721e8143e417550bb3121fb2c0b31358c7cc822c28db4c2bf1ee0be48bfdea21d6f3a7016c86190bd42c5876906345283499f460003a7cc2e728859454a7ee1db413b53e6d89585848ca8b105be8d91ab6d9b44ec4ddd828c3f9301fc3739cff33ef5879715458f7672db81a10fcfcccbb3082a5b0eee706497edaf17ac58031d2f1c8c928724e51e6cf1bc142b3966b355efd8b34942683cc2ee13ea75dfa06fb261486ece04c639eafe2f2f94ccc45efb3a7bbc39bff9a19afc8968163629278977da7dae99c89eb82122bfdc6f8f4c9aeed19f0264547c7d5db13378117e01cac7ad68cc7ef607425c7b5ac9a7474c1e0e9946722369d52b53c434408227afe91b7da5b74bbd30dadc08a75d0811af98ce7294e3007e1791adb2b6db350ab7ce8d74de9875759ba7a0733b16decfda99c4e2f61c59e61776ecb06d7319629b3efa7b564828c5e3b75695fb0e809c5bab7e59cf0b5b6e16fbdeac339b839ebb62cdf799c0c641757203d8a7780381ac4ddb35496a1a9e216d0439cd4c68ffa85dca73ecfe355e502150b67852c555b498f12b099e01094347390a7b95d024e696bc3fabf5d370de41940a94093ac272a08e901cb5bec786dd1180633b10d95dd0e1221a92a5b8c6048cd636a9f981efe0514772a3ad6688f2953c4534ee848a2652805fb46684e5f706b333e9a90f9f4ae3652ffa60388e90c2442145d0d1633531951529429c8e8bd6d1e36b2ae2357ec5d995c8c64a06c5f0e77dfc80c34fe2717ce5c0a56ae202b14343fb44a8683f9ccc73a388de9d3140ab9e2b5d0cd4e0eb7978b60a436adc204beeec300475cea3ecb81e6e7511eb8bf71cbc73960fa119adb2f2eaf599956dedf15cee1a397ec28bec054910c3f01d34d5bde3c524aa0e522972f6cafc2b41d6e37d01316a5a53f037e6a055d0e3430ae26e93cc3333cc3333cc333460f9abfb75f5de2524a298933f452ff0f22774a49ca44b10e06fe6f38085fe181d66dadfd56c36d0e080e020e38d820f20a43ba9ea68b869a2cb9c2973d6fcbebceb62485482b9e6f31e4957e1733e3ac3807799945bee72c08fd2a92212394de5fcf2a8f2a1ab1f65e1a3a8fb89754ac5e32a8d3d93325362adc607e59655aeeacebe88ac82990ef8278b15d8ebec91f66ac2996adc4d397cec718df4a19273dba14685952665e3aa6b66e376e440002387e7825880e0f502859102185da9d59f4df536414e9317fe1532b644bda193e821b421011c5a65327a5bec3760c5528dc11b73e5d3a08b53950a8e1e2a5d1ebf0f4fa27dccc31f6ed2e3e87d2136c50da1ffbdf7374e90a851203914e1c5a2ea5267e1d4dc739818a298d67efb209ae6aebb66531cb4b214dd831df9db89e87d07299d8b2d23b5e6e8508cd12443091a79bbb1da532d5f3dd2a72896549d8c83235ad40c4126649c8d9dafd789ac4150ae587fa0e868148258eb983c9f867fa99cb0a259ad3f13fba284bffe0164426d15e7ff4587f512ab640441276688e70378f26d38b8248248e598ed6c955b329798b4082d568675ad0922fa5cc81e306228f40af86c8709ba2746950c411d8aaa61aadcd27e61c81482352265ad4984e743c7de1c8800823d21d05de3f753977c8ef8d9aca08441681b8fc0f9d29633ebd83f4e8a1821e8828c2d68cf1f8f9584ae44a0e1f3d7e748042f1d1e347874024117df956e6fc219be52422ba0c17edffbf72c9f323042287d04ce828175e4d78529df8103184b6698428d982ce389e1e2285a863492df74f97cd26810821f6d20f59f15c6a4fae502838cae017388e1f3dcae017804164108530e5a2a9caf4f5311141a0aca48b99ac644e5f2b39727000c70f44029132d9bdb6bc73298480e8425e34c375ff5d50854231227f48ba34f3161244fce0cc7e974acfd69ce20f0a2587481f18af519da46688953305227c38ba649a6ead3e299d17d9035a963f64d4cf3b1d9d4a19fc82e6e12ba81bc603bec38719644000c70b44f4b0f42684c9d9380fa68b51b44769571b79a840040fe913194f5887173b4b574e7a780b82fcf01de480b59201913b6442bb4dbf725b3ec9021c3d82f018e302227638b72ce2c5c5a5bb501f41a40ece6a4adb574da3ad8bd0a196427510fd79fbe322328735e6a4d4c8dbd6949b1688c8815751a6deae5516571ccca1d46485e9382f6b2270c8a53d7922d5dca5d6de70e79616734e671d565576ecd0131fde2ce206a44bf7ddf3f29796a60df77aa7d12f2d226cf88517dc6c4b46e6b50431e304385470830438fe04ce2300541059c3729d1e9d3658e528c7b8310511359c74949e91a93f53399c20928605b59745d31141c32fbededba989ad8f2267c84b966b30352d85ce2b22665812a37cf396cbbaa02e034acd566e6739cb221132eca3c4837677c54b3f901e68096e98d5193e821be5434be0059131d47d2e69d2527cb6f80e6d1e3c44c490b664d24af63b2853876111e962c8884cd7eb80c1f9785ae637f505617fa1ce52cb76f3af88179032b71b32c38f7291481796ca36ea9cff8e92db41840b79cbba2de82ccb6cd22d9ce1059939a77259934e440ba78cf7a52caf5e38d9c9c98d1b226a10c9c2f295d01f77170b82e88e0f50283c3c4810ddf13f44b0801af96f49f75693b55ca1bc763f93a94454da225630af6cce66f163cca811a9825ded92a7ba58523faca040840ae9cc19f1c9b494712432855b6a39c4e9cebab59b881416aff47d8d089935b5225140b4b71ccee482423a9fb83b552d2e652cf28435bd29111ea369f5a888131a3b3d97776ec272124a5d8990d172dd8a19404e44988076532f0b3a63d04166cf1059c252e79ed116e6d26e501c449470b5f0f132cecc0bae8924412fef9c3ee6643e1241029a62b37d38b1217367032247c075a3cb26611f34781633322062045c9eadede8fff14fc4437d0707820031a3032245480b1fe6762d3427d18a102119e62a73fb330c731aff6c6f2d66f81046dba73c95daa942a1840463dda0d26c4fd88b8bc038938d09e59aa977c42684fce2b1d5bcb194daa77f728c7123004c08f1451f364be32aa362f7e21359ed635accfde1059ef142eea47ccef25da1507651f5e5bd24d3d3b821ba28e6bdc636e6c9acf90a85920b749039c76ec6aeaab642a1e0c28e9d4995a696975e5cc706426eb1d678aae9dd1ba16e8542c940882db40fa66aee65391708a90572c24c6d5b834ea75768f1ef6ae61332fd8f882b14ca074266910ce3b25a8e0c6e8320441667ecd1b3594e2d66aa2a144a2c0c5af334e7caa453b0e833e9746f532e0d444f3410f20afef64c74fcd798a5909e6020c41589b6db2c888f659d7a854269c52a1ec7ecbcd47452aa5028160861c5e2b7582ffbf267b6708542f97192c303377cc7ead8b1439fc718405c052767fc088223005a0859c5d7eda1d533baacf20ae5e48c1f415a158c9c1af51df3b40733157577c778e9341da4a8d8cd65b9aa5445f48887192a083905f6b3615a96335010628a839c8ea6d582fee408424a715cf1bd76cf973e0e8490a2cc3b9b2d78262dcca642a1780a1945262d35aaf57d74fb2a140a10128488a2dc53255f96ca3d5758a1507a74074242b1776c676893a5f3862a144af3c0105020ef547d18d3b2982b53a15036e41368e1b37f963e8be1d120c413b76c9ffccef83176b272d289e5acfff2c9f88f2d27329fcf1e2de87e6f1387cd2033f34b2f4a6e2a14ca090c4234f1a9d99596e5fc0cad5528141684640269b1214c9e3c358f1e3a4e5a1082894f5378d0f112e69eac50282b08b9c4732e2f8b0ea5bde2c5db1266613baa7d88b2d7e013422aa1650efadef3827439cb308379e8a044aa64d46ed0593ae73a892c932719fb33325baa42a1b0204412c87b6530994eeef78b8990489872f49b8be7667c411090b1831048785f371e9312a72bc48ff045f1524d7e6de55e19421c7116f561469614d1fa3682f37441cd09cf9269ac4239410823726f29bc948713c26517610eff2c9b8bb525b45404fb3a4af8c775ceefab109208af25399dc535e5cb398840cde871973c97b56a789ce046f3d031821b3770e020e41089ce589eedecb33c9621da6b49cfc99a3e0d7e2112cf79fdb34943354b8542d9c10fd744082198199d46f7878a593708538dc7e0d26f9016626f41a01e4eb36f6bd0252027cc43470b420281fcb3f7dc2054e6d84200714713e71b5bacfb13fad0324e7ef408a23308f9c32764ee39ad4906d9f97390810307853288103f702f2f8a0a7bc9943e5578f4414fa3367c14b742a1f0212d878a7859ee7bf57e41c81ef4bfb67531442635ab42a19c84e861cd5992593f5a2a148a06d18e41481e967a8476f9534a78c6d420040f957ecf1cf4ddb6e0598542a140c81d147b51b3309649144a8e103b18c4e9db6f6b49e5572175e8ae93f430bf6e9fca41081dde90193f64fc74b555c81c1671a7c326917b5e2223440e7d8e793da585cc5b323742e280a80665d52fea7dc873e42003c78f1e3f7e2c21040e97bb9d18f115bf8d3969e7c1020aa58710f2065e64cca7f7ecf217aaec588d41881bf2cef27d7bb7a7ca741bb00eb52e679a4684101bfefbb76a7de95f6a7105216ba825295e1bffa5abcaa881f71e21ba4f9e86acafc673aaf5dc820e1ad22c5599d6b57c32e533b819ce3357c6ef1fb119ecabded3d59957ec5406fd252de6e1af3dfb4b064d940ee9bfc9e5e01903c2f3d4c8f65d0c7a99e6ce146a4365160646747f734bfc788b826113328cb72427d6844ec817103b1bf37ba64c695c5e38ce89ccd351c34b2e5e5dd8c5d15afae5ea03215cd8b427f99f4b8bf392bb055f479aca871bcf3395163e99e37e4bfbf2b6fc1915846461b1429c7ac93f6589bab0f08a8f52fbf94ff2722a14ca0542aeb0a03ec698c73563fc4f8fb187102b98692efaadaa82632e8bd75f7e6f32b4d33108a1422646bf26b1f4327d0a6c5dfc67fc5442ceec8210295c32f7c7a510d2838a4f42a2d0affad69ae65132760f8102429379901f932e5b1507214f58984f1a43944c2f67614188138ca34555a78ee98369406010d204469d751213e529c592410813be538f9fbe9e39e9173b66c88007214b30e588d3418cf6ea8fa9e80851c21fb37d16b46cbbad9f9024743a5989107af2b91e104290b0a60e6e1ffe2683161f841ce11837599d50da345e6e4688111a61e237731ab9d22e4908298259b3a485cd9c5edd414308214297f9e9731a21b4bf2013c418c6316851a525ed50e223f340450c617ca52e49d913a24fdfc1705e1637798899cef0aa80d17bf6192d798c6739f88b5eb0de109ad39b8b396788e18b4ffc9dec673da57df5a273793d4b76c9e9e7ab788176ec32f521afc5cf316617e6946d1fdde541865e47104317da4817638b1ea35fff200e040812c4c8c582d906a54d84150a8587ef38e9c1e3c43520062e6cb16cb3b43eeba77dd52d1ca5b3c6e4f227399fd121862d0ebac74a8a07b1fde255b5d85b7a0fa75fbf4f472088410b566d647b98fe182ecea2f620464b8acb7a7c1143169ab628a3aff12b4c7c03c717c488053fdaa3ac7c85ce73118a010bf4b5a4bb3e5ac55acb2bda582b51a231d34703b2430c57e0bb1b636a51a328737120462b4e6abbf5548d878fdf12c460c5b2b84b2a74d69cc3b20044418c5558ea2597641615115da962b93f6dfb75122e42940a43369d88e7d15bf6a204315061cea4a54ca9f9e4e5ce0ec43845a6e4bb42bdf23dd3a630d79672ff30d6492f314a714e2f7856cd3106c4208541495119b3a42088318ae3d8956eb7a4b307e1988118a2488fb8bfc90b77d51f8e7715fc102314a5c76ca1646a49e756397ae0cde3060e3588010ad66c94bd1cef197ae421c627966f7cdd25dd22f4596278c2d09d37e5976b1ebd83418c4e2c3e1a4c5b0aaf8aaf076270e212254e94581d9977408c4de0b6ad7183145923b54a0cc4d0c472d499cd2c9f4c5a6a8542f911a404373870830c1c301023135e888deb1ffef26407138976f1d2e45c7661cd0a85c2831e0f04312e7126cb5d4f2ed899f5150ae5063c7400314304625882794b4d4d31a1413f2c46257e6f31886d265342f84a10831288f5d499be475cbe5402312651c892356ae454a1507e98337e90110028882189c326ad0f1eadfbce1d81189158cc92fc9c1fcde355554e82f80d02f68ba9710583cb62f6bbde8be9d9ac61853c8b2b5fa365ab21548900046ee4c8110108e488000442b050a30a898a8e3e76265ab6ae0615b6507ac254977c713d534896b44f919dbfa4c7526874566ffb912b14cac9193f82a01a51406490ef22a4dce878310585e5dab64d1963b32c7c42f2d14cb52c5cf356359cc07fcd968e597e41fc2b53a309bddc2d0b2e4bd660c292e75a353f556142b684368b6954afba1c3c7b3594a0da994cdaa5f2f0c9ae910494dccefb7c4266c6540d247042275955219a1a47e8840a69ea5932d929ab618446aa8e6e39c45efca703480f14dcc831860928142010c8458d22f0fb1947f59fd272546b10e1ef60e5269f848b291f19c6eb19d745d3f1b1f11b11c6c1f47f505a16939c938130128c5d8c752a1f6fc3ee69041807a5e4c7ac9117e7ffc82f8cedb77749a4c8d2e7882f9013b627aa4764b0da985ef8c2a68fff2594fab9ce18e1c5a7bb444367f6977637db05da47f46cb8f8315e5ca58bc5d7911b5dd0d059bb31b9587e5d7339f63f820bd3c72b73fa95c878476ec15ba816fb0e7f29a423b6703ff58747b37413f3482d4e7a4bc6f4ccb897f6115a74dea7c50fa3444bef23b3d8edb466398986cc261e9145271e2f4b6a535f4a6f2416b54b42e43ff49c7a0b2c9697c3b8585264ed3423afc045b1fe90416b64d923aeb065a95c4e1bf7cfd31e6985599019afe9235fb3b861459bdef3870f17d377c4c82af0cf82d06423736b6554b1bde792f1d28f8e58a9e8b36be96817dbe7f40a8532828af48cd07d9df162dda63a5a00641223a7d0bd6396b4c8dc280032c61f464c8138f5b3412869735a2c057a64e60ce6212c5f122976f58fa9f194282d6623a330cf934e72b4934e1f34220a5ed6e4296329251f4e23a1a8d64ce858393a48cf8d80821d2deb4bfa6e45eb69e41328e1c2df7a5d9eea6ec41387b510e9fa629c91d9914e582ea86b17c4adbc293981fa31996ce388d2edd944da427fd249a61734843461ec58e73d7ab6c5d14826909d4c6892e3726c494c285e2ea59e698a98e912c9b02f8636174cde258d5842ff0e6db5efd2c80e8e5422f131caa5deb01abd28b18b619f53af558dd08d4cc25cbb2ece6ef87ac78c4862e1ad84a93c7d2e9d3912093dbbf47315d293957c0412aaf6f5bce8a157ff8d3c42973f27cfb4d1d07133e208c373b8ecc14db778a5914624da622c6b8f51fbdc248c3002f9693769b599ebd88f2c62c12b3b8615d1fc4e8e2842eb6b0db22ac4349f238948a74db29aa984e90c1a41c4a7c73d5bb3a43cb65ea150de7f9c0c61e4108aa97097a5158d4d194334ea633dcef345c8af1009afbbcf7b2d66933521509f3fe6f82c6899d1574606b1e82d6dd68c5271312808e49d898bfe2d8cece84820f4b89e5328a9215dcc3163041058063521662eabb71af9c369a63aae36e5076c43fcc855b52cdbf561f394f9ad5cfed28267840fdadfbfbb6e902fa1c7c1c81eced00b55916f595e3db4f2beb99debd5e5063c748ce4019d7a7b3379deb4bd2a140a19237838ecf76588b8acea5065112377f03aa7067dfd2c667848306207834781b41ce46ef4df12fad7481d728da2fa3e5b16f3cb1d18a1832f88972c733f46e95800a0303287eac3ac347f4b85053c4e40a194a1e3062372304893a13a524cea9e1eb841060846e290cbe7a2872ea1f326e1081cae12cbd1b76ab9e496819137bc6fdf3da276a45918821137d4f9773b7c4bbce4c991369ca51ccfca121b69a31136e461b354a621b5c5d9d7708c23469f8b65965d55c3969d4dbd4f655a8b8da4e1be0c3af3313bdf722a4146d070c9d2e1fe9378a8924d307286eaccabb4898b5b403a30628635b664a6119b9f91572894e6e12be89132203b9f3d4bf2a3fff365840cfabd68799569bf9ee363640c09df2d93a6c546096b440cb9741f73b720e2e91e41788c81829130f89ea4caebc9b858a7ca090646c0b09cad2511dac33bd836f285c6348b071dd2b3f758f14275dab42c586e7c535b2547ff380185e2a30c0ec14817ccd94b899abafa9e55a15018051f18e1c21e5c64fae039c7515904235b487810d7ac9ad6bfaaca881652cda09a99a46631fc0a855219c9c2416bc63971e2b4dec4d186112c30a3cb53c89930dd625d18b9c29723da622247df5f1c7418b1421b6bc2b4436612dd52a15070e4b881430d235530c76d70d70eaba1ca613f18a1c2d154898c575b42c85dc6c814d099d244c3efe9f18c112930737ebe797ff73bd4c04814f8fa2cdce89831960c14be103bd36a42c5f365980164cd0042a12c234f58b435fa4b62ed1c38809480423901e2150ea265b48762c409974cb55956dc329ecc4813f497a5509742e4087da930804209c018469880f6dc39669da64f0f8d2cc14c11af9625296a771b51c2a38329b939d4dd637c878f3274004942dd41658338a5464817ffe1e30323482863ca12fb2fda210a65032347a8f487df9d4ed9718c11231c76344306253de6735b305204b4b78f6bd2db0811b857fb2ccb39bc985a960a8572022403348661e6955ab628da317fa5073484d1c6115bab6dde884043e00b3482b1984b27253cd8ed7849021ac02873ec781ad75edc74033734808342e1a1432bfc0beb85df1c3266fb19990a8502e402347c817c9733a14c9632158d5e945b5a1a3d59dd624a150ed0e0c559ba455c94139f2d3fa0b10b8476de94af994ae3d685d5a9748b7ee9b8bdd0c805aa6469507f49decb9a131ab8b0f72c84ff9a7661ad5b2ceb27773527f1bb8d862dd092095f1775ae057bb9018d5aa03ac89ad1dea2dfc54a408316dd0b2edf235e7ccbf42c8cfd2993556ff8cf96862c12e229bf418516fdce310c1ab140c7ccbcb3d3a0b3486181944dee418b1e7fe4f40abd4d633ebd6ee45fae584c3c69416aae5ddb5b81d0533a9febb22699648a4083159f96e473563cdacfabc893740d197b448b46a0a18a656d4fd1c15bcc92bb0081462a922e5bd56596ad7af44e010d547423f775ad72fe3d758a64d2a66d62ff832e8d31a6a8e3a5cfc8a8b5765d29d0d4f21593691f5dce193448717251db2e6877f09a4771fa0ce6bf213baacea230ea4b7ee95953d1008d5028426b524266d7bdce4061d0f9a2cae519255f92c6279ef92aab3b75399f47c313ecc907d3f28acc3a71da933a5a1942df7e4ef0653293c7ecd28b3dda446f5df69dcbe5b691390d4de49a2d4f8b593613b8a89e3e587a66d1843ab0343071e7ad781ecd12193697b0eb67f53cbbe89965093d6fca935d518542c951031a95d0e52a939d74da268b7da0a30c1d417cf4e06106fb0e4e58408312ea8f6f499379bd564ec2b3718d51ed354ea02109dcf47cd2a5f44fa0118934e7b7e9708d9b2fd67142031a90785e4f7cdb7594cd1904c840e311b694df9afda47e727147984187929e333e068e203ccca8ac8075eca0d108c53f3f4b324c748edd0e1f27dfe3644f7a30c68f13b4f3e0c1097aa0e363418311cdc7ce26c33f34f5408ac6221e99db6577bdff19a3085b54df5f7439bab59508f7a377d41c73429616442c7bf61f5c4c17dcd615dc20030785c621dedd9c4fed85a813cb1066e1b5a5d4d1d5527a85d8e25fde7c5a3a3a7b08d18b69b6ef2ca696dc93406310a5cba55c107fd321a60f6808c28b919a694ba671d50291860811f19b7f26361a8038e750da624c67bbcbe0f8008d3f18e7cffe5bceb5253d30a0e107be3aef69bdfe7926f5211d3f7e8e2fbfb7f462f8609efb3d359b64aa8df7c0a596c9ca133ac9ef2a148a5985861e9279bff4af7fccd89ea2910733b420a74e88b9f8bf191ed0e23126eb129e4bc45577306ad02ceee19d3d78c6d8c1fc3442c7b511d6b97180461d10725a2beea5abfa91191d14514ac5facd42a94ed51c1859774a7f731cddd39083e1c50d1bfdb6c7bbcb018d386827649306192ad4f370e875d5376b925e1bb45ca0f10644fe05b5eb7bb7eaefa0e106e374d0a6b3ff33d068c37deafd5e368d364299031a6c5892cb1dabfee031a672a0b1063c567d6869bfd36ca3a10635c3cb29d6acca534b8322f633e7e6cda08186a58c62ba5f92d1826f950ad038c3415a8bafa7bfd2bf6898e1d68d359b64e9a0b72dc35eca476ed0159f64eb021a64408b12f2b29c39a32991c618cad60ca5573fe9d86f854279010d312c9f902feac9e8bcff398d30acf5a759965c16b58201edb2195e8c395cb37c61d30e531dcfca4fdd5e38b6346e3e4b85ddde05a3bafc21e47c964c2e34b8b02ca8e6be7b4e26b644630bc93519d44cd5bb280f6868c18c2eb65c3ab9ac27721a59e04c6d38eb927f9777a547ef82061614ef9cec83cc30a76aef2b2cd67b85725153f5bd154c5255548bb40fa3131ffec3c7d2a8421d2f1b2ebf4bceb8542814a641056392f7d95ec487eca942a128d398829ab9cde3bf549d9a8586148c317d5016a3c39eb6547ef4c08196710244078562011a513099e66fb8cfe9d32a85b2d08082effef2b81c4f89c613d0ffaf22f6a6c5182e1a4e30f799b90b2f9fe1c126ec1ed6944c3dfe1a634c48e6eb50e2a348ff522e8117b6c4ee6ecd86ea42a0a18453d966fda42ead8c9d04c342b628a663df61a781845f5f94fffc1f814df51ea5fe41da65348c70e60b8d9ed521e45d68142193b1edb53a982e397dd0200232c6f7ab6f49262d7c86d16b7a51da5ad4db2b61fc9b4ae77c3ef7cd4b3056edca8f3983a826cb0c22c0d805a1ce5eb24e17dffd22a52e79e8d2d95a2ebf036910f1457aebcc5c1e8f72f2d38bbf5e74bcdf85c98ec789082ff49739f973e9e5726617bea42ff5eda9adcc175da494d8243b8fae486f73b17caa733c8a0bf27cad5028273a4470b18dc7983f735f5a8fb730b620539416d47ffbdaeadd22b638d353580bab5de2712d922e8d8a0e95a62595836004374280e30c1f01114468b18c3e4bf56e592e6ba950284964160b7e1dd38c5499f1fa061a446481f8ccb9fe451b6d33071ac4043c7820120b6b4d5ff47bc7cc921658dc1ea684eac7ec51a61b01d5d8bc5cc6bad4ce14a17bc8f70795ff31074d409208d3261dbfe5d53c768904114bdd82cec7d86f9b2692431c3acb1b836e3a21375ba1505640628844675efef417dc84ae107cc8d492b6702faec92a94931f3d4e82f80d38404288b36c3a2fa64e4ebbaf50283948068186795a8fc6e872273b34488f931d3ecad0610a1241f459963f994e89673169478f6e0a05c80b480261d2322ee72cb91cf7c501a16779f4cd6d4a6a8e567ae4c831060e2037720461f7f1011c384c70020edc20e3c60770f410c02b48fef0281dffb2e3f74ae92b140a0ff4870731c347194148fcb0a037eb6ac5b969cdc381a40fcf28fb173f6b478f27024605374c0a6e1814dc3027b8614c70c394e08621c10d3302089c04a00a247cf0ca337e3f0b7b624f7b40fb35c7ded1b93bb87a6843cb6250766b1e10f3f40a5d756a9a3390e0a191253c883615b1dedc813bd5f0e2978d4b266407bb5fea702d8775f8f577375e8ecf92d2a281840e9d59b86cf5f91c0e97317df46c519492c961d99169c428f91e84290e6e9c6e4d3feea5410e87e5d272d87069d46416f3066cc6f45b54c5cb597683d9473c8d701591696f033f2f46178432fba41d1b70598e2f670acfb3c95dc3b2dcf2a7cfa206d4a750f39c5d5b2c330d5dc6a073f66c61d40b4203da4aaf3fcf08559e3f03a36573eae81a89194e37ca6cdc5b8cef7c1910ba15a754ad78960f939041ff9735884d578f231a8341fc7590a6e34b61321231282ba2b7497398719b240c76ae8edca90b18facfe8c267b9c4769099e40b7dec399dbd4f67e33b5a478e1cbea3c7e071020a05480e7af4a844c00789173ad1d91d3bc4e47523e9429db46abc9fd1a2acc3010917daea8cb3cecaa8e7926ca1976ce55d3e5521bcad50283976f820d102a629e496a68e571efb0149161297c5f377d9c7d2bf20407af828020916fa182ea6da502d2621572814f73f4901c91596e5cd2e59e57676fec3470c48ac80d0f6ce8f2103071448aa9052393b1fb72f5ea62454484dc5e5a0c465fae852a15072e0f01dab6320998231e95376ba5eae01038914b030791a54f56578903160401205364b563a7e98b2fb0a2450e04c4dc38b964b8f9f60fd688dd59e1ced9138414f3a35943cfbfaf1489a807ec5bf389b322605244cd0fd5d1ccff5bd5b0e7af4a8ec681d582059c2d1948ce5ae6175835fa150729028c1f0ac5b2da66145752a144a144892907e8892f16bdf22299020a19b6dd5d2386f93b5c2e3041ca804d1e102203b7668e0460b6edcf01de87802c911cca5f45f85d233551f8911b8935f77e9b26c9e42c9415204d3292f99d3b75e50222142b722f5ec336b0cb1c05b100023d81806627378fe12d986307a4993b23b611e4693c148df0ba6225a4c3a64dd6103182915328beac8bf58147d49e7f72cfe27f545a74267b91151fd1b29d8e8c562aab555e2563c79bc389febba878be9abfd5d545a397aadfdf477d445da056f3f19c3dc5e938be5aa7671d43685b8122e9699fdd292e9da5765cc2decd80e9397353cb0618b25fdd1dbac7b4a645c0be4987849c429dd59ec68d1a7c87771b37bdf58b338ed35c4b7ea6cf62c8bc7ffce3f6d7a878d5820fa774a9fe794d67260b15c6f2d6e791efdfc15e9794edfa0c7da36e80a736bd7867f8e0c226ec5b27c5a3fbf389e36bb2a56e0a55236bd9fa68fcc2a4ea7ee77ecaff74c5385a1948a67d02672839d0ab3270daab35c22c425820d54a4e77268c9eec3858b8c39851e646368d1944e6d5a4c71fcbcb81a722f4e7c4ab1249e7e5f6e621ea466a448b77b68b69c446b5855a370bcfc93ceb29ca9836c8c28b2150b799ef4af6859150a5d8eadd3d276d0a7696340a18bbb5eef797674e66c7cc2f7ddd91a39df61f4045abc4ed92cae8f9664a3138595cb62b8fcdaa6554ea47347eb545a92f5b9dfc4b9c45c882d8faa9f99614313e7cefff9b266e8ce582610a7ebd64d9a86b0920f6c60e252327cf8282d98e6ce0f6c5c027d79fb53a8b899b978e81881a1810d4ba8b35e5ac3a87b8cbf031b95487d6fcb39e797bf346a1b94b0ad55e49508a134b54ca2d51cf3364c7f48af5c6043128ee9d7df50323d739648147b1b1f646dd5b7aa1cc8810d481c33b818fedb739b2f21b801821b1fb8e1811b1db8c1811b1bb8a10108ac8d479cd3a6b19fef24a37b62c3117b78e944a85d074dea4620c3f38b714f574c6765608311e5c586d6a912f7595b041f7d3ec8d71db1f071604311c6cdee60a6dfddd46723118d7041cb9ec7175e5b1081db9b7cb4df92bee721aa9031897c399698b7865896b3df9cc6d754db62a31049975d5272b3df7687108bd9a5bb538e7e8fd2201e11a625ddcdf2498d0d41eca2c7a0c1c5b9cfbe0502cf82de1611d263d85d870d409c3774892f6537dee71ff2ce295fe255f66cf68359ea33f792b90fac8c92239f5f3c3f8b0f6f163c7ba82e95a1e61ad8d8037a4ad7eecbbf614e480f6839c3dd4c937e31bb79584ee5d5878b3419e12125e4a4cd8dacd0d9bac3624ba11bd3b36c96393bb461ea62badc2519536ea30ede5aa62b17e3c97e990ee7e0b126fa322fd39e8359def74e4296f8e8cf0c6cc86197adf934f511fdb662230e98ce7d69597639a56cd4061cda345da1f5d3cd73ae0536dee069b67dee74a7bb25d760c30d7516a576c30b4a948bb5c1b3f6a81b6b2193ccdfa800d110d860c3b993347d2563dca7890a36d6f078e6915f2542e62d3558ea2dd9cd8b9ef262ba60230d95187f1dd5b30fba4403d7f28976b08ea7561a0347136c9c21977ef352c54ffc8bcca0e87c96c4b635452773c03d6c9441cfb0d95bdeb20736c8603c93695d8c1d323c09878d3134762d9ffcb81c83ed64d81043d91a7b5f96c7555ddc46180ee1971e464e4debbde1011c65d8008363263ebecb69af367e63c70ee5c00d1c144a00ac60e30b7a0b9fed54a80f3b9f870d2ff8bdfd928e51838f6b6c74e1e4e9b14f4e435ecc63b0c185f7bf575393eecc030c36b6b07690eda632c4644336d8d0424a88fc984eb434731a33d8c802ff395e90a1378e9b32881b6c60a1f76419a3e90f1d6c5c6179f6ddcdb50575f1b26185c65cd239d7cc68398a40f860a30a779d7a7d0af92f1ba58249796a99c2696246a9c7bef29897c2e2fb9fd498ff418b1f05931674fe8de9ae393528bc2d77be1863f804345cfd975f8a9f2905b1e1044b7ea8f5fd531390b9edb7b741dcedc60c1b4c58f8b45f13fa65c1a3ed031b4b30a89349dec688d49645099b0975a3b3951c3d4a1b49e005ffd40612509dfdc473929943ee368e601099fb93cb2553be201b465077f48a7bf28a800b5237c9a0762acc638308b85ff5b77ab6cd2f358c2599958d29efa349a908358471eff5c9974a264ff17dd40806da74631419a15c8e31c0384beeb6b749891bad7550e317fd9d8b95a245b7923152a8e10bab74ea8b994bc7ce632ffc1d3d0f99d76ba43a851abcd873866e8e396e12ab7a506317c87bbc0aa52d67d4d0053a97b8929926acfb450a3572c19db664d91bc2e37eb8d0df651195f733fd596adca28d1fe6b5ab85fda411420d5b988410727764fe52e60da1462d0e769fc51279b1af846871bceaa03b7eb2d4b0676197ced2498eb671b10c420d59a044c5cfb36c5a9c5d81502316c6edca1f9bb97377f1420d5828328b4198b9a4af427d85b2793cae851fdb2ce80b355cf16b85cc73cacae4c782d46845f6fb59dadfa89a6a07e1e13b60454a669a5cc89c2b64acb18a3b89ff2c97a58a339d879b1beda06b948a3ef4c73e9ddb9ba48c0ac537c660274ca7785396d6e8f3f70f962938d7f8cdf1176f4d2974419a703995f6b82226c5729f32a6ec8dd76dc9428d51a4a39b9dbaf95fe7cd0a6e94800b3544e189be205553febda40e455f6ae1ef2954774c51a8018a3ba6cb10d6d5ba2d9fd82d43a4ca6e8b7eef166a7862b96643c67575e5ab5fa8d18937bc6f4ea3ee3f0b3e27ccf14f6fe8d9b4ceed269e97c42775317f7c999ac05a3bef996699f0ed5a63bfba9c9fc776420d4ce4ef9fba496a56cffb12dda746bf52adf13ec612b92c4277a8ccb92f8495d864e7142536a579a7fd774dc6971a93488b275496f28ec9b45f43127f7adbd14126b12f1d0edc78418d48283a4f799e0e241899314ba671d3ce8d8f703cbba4be45db7c458e38e9d2eaa9aa94ab961a812a9541eacbd9d3271323d096c6c7b23f6996c48bf032dfa596f918a3cd16d450849e31c59e9664929f6a2250b5ed2183672c31118158ba2cc5cb9d4de43ec4796bd5762f0b362f1a822fd77331b305d99c1762537a64d66a8a10b9c7eb71b12c33b6981a836865637ca991417da88620d021163247efd8502310880e9db22563d261571ed400849d7a4bf5acaad35e7fb0d484de3d19cecb647ea8e3538a67d1a742ea35fa90bbf4233a9f566af0c1387ba525bbf3a464660f87d679e1624dc8bba90935f450fa8a882f5d99e5d6f370b0ce6278616cbf465f030fbaa42a77b73d2fcebb8319354b2b5bf4a839af6187fdd32eeea33d068e1ecfa3461d907bf97cd7b5715b920e2633b12a42fda75fbfa282ac31870593ede7a1abcd052d0f6ac8a1165476d25d1d488d3870b126febd1f5e2c1727d48083b9dd7434312fa897336f388fd493b57946b7996ab8219d79c35fa7d1221bd66803b7255db48b2f6c58ce7ecab3082da617946aac0121c665414e065d50430d67b23b39fbb7fba053230dc89041d4734799744d0d34a4ccfc5565ccf38b9d3378aa4cff252f25f357c1a86186db5c6367416e9ed296322cde684187d1efd17532f88286b54e973ac6ab31a4c5eeb896c5ab5f8c961143993a8e55facc9a108561f13e6b9e4cede9db89430d309c65339d74ccc152bbfb0262b48f1a752d67da1d3dbc70657a419476decda31a5d386c67f9fc056d8e1a5cb05f2ed90e532a53630bc896cc4bb6fed58a26071036d4d0422e06b5222c8492f9c52b148a0f6a64c116e672b46c9f4a54851a5878776637c860a211483301642660668c0110e031014301430a9403380810337e8804e08c9d80090082003143052101f01ba81937e0a13b6a0800c80f1b2c00c03939a961128cafac5daedd531e634c65b132834229c37f9cec4047ef501dec3e8090c004183ecae05f1c1d4176a0a37d717404d95101a22727364c7a717404f95101b2e3e4c486092f8238905dd030d105abdfa3c16549fa28592e104a7769f5e72ab83894de7b17c34659d34c6e9185ae972a37a6e80c1f5c86eb08f2a34c6c717404e91e6598717262c3a416be831e6594e1658c98d0e29321fabab59d45a3346338917959985fe3a3843a5527a658ac2b9f37dbc91ad1ab0d4c60a16779392bd14ee99abce2ae1b17e4bd28031357207faf4588eae48238b5c2931e3ca835b1516613569caafe25993e63c77857b1689eef5a647c2abd573c074a068502c444154993e95caacd2de6fb26a948dd6e6bc631abab978a092ab6dd51da3a96dd6a6b720a94a74c72c47b67c71488188430314599227e27fc72cc2e9352e8d2bb2ce8a83906395a0b4c48e1c7b7be2c5746cbcc9a8c022f59ad49eaa7461b8942974e47a130e78f7b0b9eb41c3e061495ded3ed24f4bd9c743e61c634f178a1f1444a676ddb319983afa877e8708149273acd39cc9bbd9ff896138e0efbb131c7549a69934d1c53ac846c97e5376f269ae0fa3e87ec127b618399c8844e32e69fd3976bc3c452b9b659dd7709e36f10afd6ee62fa688945cd6877d5ecd28d5562d9d484a8be1c25f6edc08412aba8516fcd3e2663e987c924d6382d8de5c7a70b49222573d67745d4cfed139844620ffa922af9d5db2d0812478d33e155429ccbda23ec3125539d3eab2b9d2a4798c3a5d34c19c7e44f9346e4d2bba869212e5fbb3d306144ca63ec630b5eaa6ab388f4e80d1142668e0e2f8a68e47967aa54d9f73411cbe9ddcfd6a3b59c44c4f9740baa2e9c964a8b39c4297490a1736e8bb0d20f45410f13437096da234779ea8c9f324c0ab1fc2f3266bc326fedc384106aa7e6d4d06e3ae88b062683b0f4d7a5de34994f4c82b0f4be6acb49be7f8e4920ea3cff98711e3d7870c004104b75a3ebffb946a9e60f8ccaf8599c72133a0781891f72d1e1638b5d324a464760d287349e7e39cba77498aff860a8153fffbc1b8df11eacf7fbbccb5ab90ff5c067972d3dc5377a6ac903665ba3a32354a97ff160eb4bede13f6edab14dee60d2f417ea2e968bcc182676e0cafd4bbd860e657b101e3d7e3c084cea7016e4febc649feec080091dd2490a98cc81d1b39fae43662207aca47dc96aecc8389ac461c92c84eb6db24ce0d08c58c717d36bf877fd03266f30e73b1d9a94d471394ddc909b272d6831c86cd2062ce48327f9e229f57554809c241336d4a94787ef5297c4b32e305903f39e8426b9d18289d1440d9c8be9ea4c4b7daa799334745d21cfe49eef2a3041c3f9b4c68b8cb1bec50e0e4cced0a78fcb765912a1eb53a1504ecef0119898c154f7ebcc49e9fc7965b06af3c5b1edcff01c04312143163245de9a6bfcdc8ea1747b4fe2fdacd7544230110362ff221a645c8f3a082661b0ff3ea9b91b532647433001c31e5e8c252fffbe457d60f20537f4acc98c1f2e4b5d828917b4fd513245f494e991074cba50ba6ccc5a9fc385b38fee705bfb313e5b4847dd3fc579fee8f25ad86ce3b966c5f5bb5950942a2d89cd4f63a38485b4e849fbd2be4232dbb26eac8cf9bc2a384caca0e87d6c757984fbac265538abd8881325fa46df265430d4cf7cedbd204f3799c272e88e6b30751aee3591c2f2729c8fa5dd5b963b5148da887497e54e2e8916139840617341f7777bbefb78750f133cc11bd9710fa6d1d54b3371021bbf3e631219e271323e306942f6f287109f656360c2845774b0cc2ddefc96bc073a7e09a9b479b9c547b8d5233051822dc9d8f082fecaf44d128eed8e9ee7d7f2db5aa1507c9051011324e8b2658e08e4a0019e1b10c0d1234800b86072844c8f79502d8b0c5a0a9918e1d0fe39b8e6a7b3d0f2a3c7490e932298e7f43577632ae9711322a4f3d2058f4964a455950a100d41c9302cff512a446c88bdb172e225c2a8f32817f34b2ded6cd723c84949301acbdca139433bcb75efe871f281126070ef69bec46465384f094a7ee1b998d752b3eb66ecd016a0125ff0d2cc8d78f3284aab4a492f0a11d594e12c327004f1155480680852092f2ca534e76cbe6f616a1e3ce8b10bd45c28f92a63faeaa542a1fce8a1e3c40325baf86be54ab5d4e5cb2bac4c29c945e26b74f9a67753092e2e9dac738c85c9d261c92dd2f7ded2824e295a4725b6c84a333ff3464ebe4d86034a6ae1874f9d3c476d644e1928a1c571a53ee8e052cf6631b3583e47e878723654cbaea04416c5dc8db211a5f582a68292581c5f4e66b926c92881c5d5fd22a21b3a41c92bf0dbadd22e6f8ad14f50e28ae363ceff57eb2e6fbe72328392565419ac6cbcd3950b6be5048802d1c0063ad0ceea630567f8085e50c28a545466416fcef10e130325ab686f4375b55c4afc73941255a4fe397ae9134a05ae22b54d2b46c531e7c5529e94ba8c9e2269ba39b598e4ca6a5330674209bf19254b3527394a4a719dff570791175d3ea44069faac677de68c9251fc2f0b2f9ab4c51846480325a2d0c2e2f3280d02120a77c784d2d09e5d83a672d23c74879ef0f851020a46ac4ddb537ecb2e6a860ebc031e28f9844964c7923b3e9e63ec09a49516ab1f353de9e9444ab8f05ff676d2d6aa40a08413c9d120e43e8d8ef89ba8e73bc5ddc8ceadaa26cc2c87d951520572868f201397bdaa6f5e13a64609138b6cd269f4c44b2c23f69329f32a144a0f203c7a70e08c124b70a2712142e75d9bab12977ebbb5ec9272972d4ab02f78744b11eaefd39360f7c5ec176d2f9104baeb4dcb62c529bd5349243aa534746e8d293d95150fc2436f008993ec79f6e072c8acfd7bf4f8e1e311e7857baa0fb1ee33027144420b1f4cbf1c47c94f10203a7678101d151e9c04f11b34e29c644398f8182f3488116b7bb99d9c3f7d939f78101d3f7870d2ea3f16b194a15b164bffb39c931245ec572d8bb11f4da19c9424e2f01b64d347c6b3f3a183073428414442863b131ac3686f9107cec37b5072086416ddcce752ddda6a88aee2d3ffeda82cb3819414e2f05e99371ada7b44669410e2df164d9fda381e37e647c920504a8c1a31ba3b5bd682f8654166c6af3e2d7fc604422f217d732cf3f61f1068b78ce789aabdd2ff80c6559139ea47f78f8550e2073fc9b8cddaf6e12cfa2f9996470b27d7f1830c324af860a611d3ce2ca8640f59a9fcfd1832e62c881925d840891eeeb917b7ef5fecf34c95e4417f9df7d09f8fc9a378409e16ad0daa1a734befd861c66f2004257748aeee998d75763033cab98e76320da31d257548775969cd2fb8597874b0257159ce27efbe2e3e0773d0d18ca39a5b3455e5a404257240ddf5c70c32cb26e360906b27e2eec3bb076b500207f4345588fdcae85f97bca19774d4e5a71647f9a9c40d293bd7d2f8c29fbe9747491b6ee1655912f3f2e754550f9c878e12362c9ea6c50bdb593465d6d0464fcb90395f3c976f50a2063faabe954c19c37612084ad26008557f6e2784a91469a0040d694b5977ff7b2d2ee8819233b0b5769a25ad4cf26486e3cb891a71b24e6f30505286b3a548f92c6f922fbb42a17c0919aed32dabd6b8974c104ac6707053f1265fee848d72502206a386cc3c95db5cfa5339290943bbfd92a9bccb198352086eaca0040c6f12a6d40665e231ab151b947ca11342fb6676963c08b752468917140f2dc98df36d1793ba0b4ba5f46977dfd0fc599250c20535bc68d23eaae3644f7ef408b28210e008d2030ff8a0640b8b0ae5a3af614b4b262d9cde2f73fda3667cb9240be775988b4f622a4d4b0916ee1893c79a53a5f4c886922bec726648efd64aacc0e6982c112236c6ec2b144a0588193e78b4a0a40a87ec9693b6fc2ec81c522839566002203c64504285636f9e8ffb5225c70a4cf0e3044078fca0640ac5dcf9090df12c9a540a8fce0bd141eba8d560e5e4478f131ee88f93207e836dd7f123484914f86a932f6d6cc1cb254f7ef408a21d288182e79f4deec83248e5063a7e98a0e4099f165f2e1962ba83582b5ce2844473dca4e46c8ed261dde1a30c5f414913ee7d13e671e53a562b61c26de575f2b446f5ee031da864095ec7b62c49996fedbe44099ece776ad6e72f6a9504d3a591b1296ff43404b22548307c72396f5c1415a333f4c70f0541c91116de94b0d262cc7aaa122364da65bbdd2a13524b2545d8b39c35d9a9998da36a4110337a9ca12450420911fab8f9e8b2bfa27bcd91e386ebf8414604ba87095805140aff606f81092020803a900c030f23444c89064f4f6c40220c437e165c6c7b97e38b709441128c46c58876ad5af918cd813b90109000e3ec17a358a96641ec9e8304383240f28b74743ab9c9738ee7487cc1fe9752ea5d0c3229bf42a1e420e985e6f2c6b7945ea39a0444779880c70c4878d19c5a8b5f551ea33d925d78e2db591661ea42ad8fe934b7b38b1feb11e4a402c40c1f2420c9453ae8bbb7a61a6d211e6390e0a2d19ccbcc1a46678de528c10d326e7c60043742a002925b98aebb6452cdeb61671eba83560a25070770e48035c80a7ea480c41606a5e37d66693f5a65f80e27a9c559b657b5ba5bf7dc567c9ce060ef1e1cf0ee6102125ae43562c4ded2cc4eace4f0201ae40524b3a85eb0cf5da1c329fd55964416032089458fe73106072440028b0790bc22ddb2d8bfbc2c7a103a24ae38d1e143030c2069850e1f1a70e6d1430124ac5800c92a1a40a28a131d3e34e0820690a4e2063750322440828a53a4e50d3e7fbd16a341a648c74c9b2fc7ab3431030142520a069090020124a3d0a51be1e259ece829cf08a283470f1d6e2011c549024842410012509c1c80e413f8e9de9c5cd49e3037bcf6877197e35e72dcf00249270a40c20913924d18804413273a7c68407f98a181039064c2fa60326a3db49e3081c9b0a5327fda77482e715215f1928fd612dc6d88cfe8a712811b102841042070c3ce482e482a91ce26b447d5faf5dd29a1cb9eb7d363a6f47a2199c4396ee6643c659e650d8924586f4f996352d55754790149248ebf1a4cfc857f97aa3c4e70830c1c2490e8c2d3bbd822f437ac8f5876a93e6a65a742a178101d2db86123b85123c0e13b360b248e603fb4949983c76b85481a615a912e85ea7b06256384ea49bb707bed77d752a1508040b288905ba8145264d150180c05426130180c0004581c0b00631100001820220f8924f2a0602a4f7314800143322e66522c20281c1a0e07239138141287c3e130200c04838141811445722c8f22d135a965f4f41bd49e87bd5d7d2e6f32014811b9f526bed06b1ba0917b8e1e992d1d800728288ca9e9f3790cfc04fc4cf75b3b413e7a16e1b19f8531679bdc385f03035d3ffc2715aad12c7f236a84e4bb73c7aff3ffc87fc50ebb64891e7c58570c7a51d72345ba4f25ba5827b918c8a86ee45cd4c7c0bd185dd188f1ffd2285f977f7898468806a0112f363427d683a581971eda95d3d76377dcae9f863367af8c084ce31ef918ce0d5d0296aa683fbfceaea845e76ed97963b64cf3e1d8b0ab120fc494d222004b530fdc74e04169850983ca25d4f90c68c3f77011aaed56123ae39b61a4e14407534a3533bd89ae85387d78acbcfd2c1aa3e285157f9c027c2515f96819a8a60f499b581e3547f170fa8c7fb508439413ef5aaf734b95e1fedf8c8491fcf186ff9f993417e0b2419f5d470f698eb808998a1c81701e1b53bb7cabef910be31f463e46e50a3b1e565c76ab5ee9d2cb2caa67b3f6705c7bb634e7dcca81fe511cd52002dcda81e9c490023e405e86ed0ca0da41bb3af073ce122f946f61400af9612025a98424a4123cf81260c666b9b0ff1b7070ee89e331e66a60f66afd72cddfb6796656cd96cd4236de1284ba96231395d05dd8d5a0fa39459e6ea2e1daacb2e73a1027d501e977c7f9c4f88a09aeaa22519d000386fb26379975c59c04db17d8a435407ea6c90b5eaf1fe266b81a0a5d7f2ebdd1ecf5093994b18c167ed840165fff2cb82257a2a0ddb956aaeb71a9403f6375dcb81ea65bfa0fe949181516dc7b686f490edd9bc374ab63372a67a5225900a9435c811b112ac0edb0f04a8ce6228c5c634ba44998ad7ec5c8945cfca968c4388eca23e980459019e8cdb02bb541312c15d1c696825b99aa78aeb036a67489fbc486b1359a25f505b11fb8e208519bd21b440612cae07a535c4e64ad6215a42575fc65c3ad16d49af81511db13b29ee00003fe28130c4c774c7f98ca79f248d47f3df07c27d730f82b76472fcdfd88bb4e276f0a44f0eba2da997ae8c61b48d989aec95a3cb49ecd2cb87818cbee60e9e860ff07826943703908287e05fd7b2075104008e6b44072330059c04a80118a48bfd99cb2255c6243372c94e600036c3354811f495185669eb614a029d77dbe00ddfb37caaffe667caa840a44706c0d8ba10ba054a57def2391f221e611950416384c8e11d496abd9845fd0c256e5c177e8b8846eb0617c100b798a2f63456b29b02507209c3c811178440bb10ac77a508ea3255749f9cb13250ed7f6f74ae40e23849e8ab14150aeb755ff137314bd19fb0119055282bf8a9bf397715fc30313d4801c63fd968b4e807862205944e710fea6d686fa6659a84ce013c21a1d4c492544876b8edd9d2b3c45daa5031c081cab04c3271453d95f7c310e211d9e1247610564a4b35641869572698f10cf43ad589ee8ab74201d8b12227de3190c4b6548bbd3f20c93e5f5b18b4517fcd5220f387d5a3bf4b339166296a8b0e39e5775648d62dbf928d64633ab91a75c91193301a5a51657a4c8d49bc245361e5ffe4d61b0eefb746fcfbde64f6b33e55a182b7736d813e9ad019e9aa4d1876b95e0409aaf362614c57b97040a6d6f2be2abc41a95fbf222aa6d510b6821b7011886fda389a1c2aa64f44d14ae9fce33d14871e58a47d7dd0f419005ebd477415c382d5c3baa0bfc53f2677e1ba03e606d8d98273afc911045ea53ab2919c75772dcc980313818ccb8e9dd01bf84f8f867916b112fc9ee95936b931ea0c819839e3fe85a9d8c231fba6e945a1f76a61442340f975e8010794f354a482a16d219a1a41af48476d4da504e82a5228c9a20023bc8d1b86c0201f417f7482d6f838f16698d01aabda65a09cc40cf73e58446ee9faf40834ba26349e896a54239cd882f92fac242f888cb717f3eb9362d31371f32de9fba9f6dd61b4f38fd6d3eb5845f1c07d57d09f6549758e47c8ce33ff6739188ad01d1854b560db58143c70c09aaa2582494bfa990fabe92fba1ba5dedd4cb878301baed0314ea43e2a70f03a8a262a7e58daf8d86fef030b3337c12332fbb1bbf8fd4ba28ff8a0b598fc0f72bcec9391853a58e93d3a1ed297cc77d24c9db424c7c5543570bad0baccefd814e9b27eb352a56945304bd7ace7feda1dce90a5a634393f24a6fc5ca88335190f44658059ba262b8976f65288b69b216cb2dd00847f28bbc124cddc43172ef9e79e70ddea923ae812cc6a7cec9d736ebee0a0446de3d3f7eb4f170712bb02a17cf6dc9b39e3580b0d1f513a3fc0361cc64444869bfddf02a575b9fcf5a684cd51bd524eb319b59fcdcb23a4ae2569aae184334e10a3b2eb578ac66e328438d9611a0712c30a4d527d45c61696934c3d1500c24e7021abc4f152b20b0c97e04c783c3b5d5b2381005fa008c18de79b638da64a0373ab66d68ec9e2a34fe2e4201e08356ea8ae7c639c22f5948c430c19a209dd69ed8436b31afd2f54a859582cbfc02a7a9fa05a236a131b31fc5177f2605129a620edd0bbcf6b3eeaeb1c2f9ba8e47a4a535b0762616d681c1ac0b055bd1639e7442eb587191d660ac531853d6f0e0b9ff56cf5c4675e17340ad628336645fc6eeca4289f827e4bea3982e672d8d2c6fb2dc86775041fb4768ca4828d4f106ff00f9652b685fff8bdf23bd4382de54b9902d36df19933d67a3f0e2cc433cce308b54844a546db0fca441c838b0fa7daca13135cf6d58485754e8220a96865d454c103d90235a0cc8c31481facf8bbacae5a76d0fcde9a91e6b0f326b81fc6e5c84f42477af18d811a5054468ec54c300f490879d88b5cd226f0085ae910af8a8d92f59d64b8ed5c25f042c5d4a1afbeb93762b4f143b04cfc47eb3819dd46a17d39c190f1b75e22d6a892d0fa6e24dab60d154334554a8119500d2b4b690659b4944be108dd345f45025a14e09f6ecfbdbccdbcf8a9067558012460b20e361edb692857bd7c0a0aecb9e8900ed4c49ae450fcd2ed710d60633c407aff72a48ac5d023edd0632e946ccba396f33d2820519d66d655be7006e335bf4e114bb5aa05b810e8880fb59766b37ff56b0d51ccacf08352bce428d0cb21a375e4c9d7ceeeeb5942c96b0b851b0c3d04d000471dc1b8e8a12ebeb2f0a0604346154136581f2eb26440535f409601f7be00407c5a580be235835c4dd31073b37845354d04b6faf1056491ee4cd69799699bdaf895151a07162482b7fc364d4ebbb1c26136af850531b0f3a21a1ed7626eb03360e778c73d71b5d56133c813fa5053fa6de81c007bb123687004e86acd8f71c0abae475edbf2573fa0ac140ea14412241d91e69de41945b1415c0ffc0419a4f24b79c056c08ab3100ea6e8657b977ab12ca388e05008c81efc35928610414f80c961aaaa6e02415b8f956719700824a0d34e161fc929e44c3c12eb3b82c1d5cfc8a8c49d0add3129eccb1d3efd2c8c787850b7a1c3f13bc3b7e9e4d356950af900ff9c3d4cc89a05238111277fb9ffac95b8d8bb2a03032f0766b2fc26844de3c2af9fa9b40d184b00da4accdd13f8df1e01fdeb20fed65172b3c4c5010a3b63410bb890718224198444d12ac36d0a8ac0f46ddbc47cbb04e7603b5b147e173c171b8985a244eca38ac14685d24d338620019d54130a82866bc70c8c3155593daca248faa654380c3b3c20a4638783b8e8f108ec89943f885cd02e3f0e0506263904b4ac1512b47909821055015be3df002a955eb5dd5ae03c01063339b7523f6292d89853038339dcd38efda926daf5d828f42ac37fd70402a4064358028d437b741c4660525df4804d769aaa9509a7d07424baabb4d4550e156c798ea6d4e09e845a0a71e2adf9da2e5dbc7820367f8be5cb395d532f2e69362965a530da2ceee80fd272575684db530228d68e98388b0b626018fbaa736754213515600d0c6244e04a235c45d250f32743f2f0dac8654ff8d9f219c9f863cd3d99e70ebfbebe7c7ab73cade94a8975883297cb23be22268c1540dd34d362e584423eebf75330d78dc2624eabcefd49b64a082a050944a30336ac7681d52976a5a3c08195121e38eaac1eae5eec776abdec2eba1b50f1099e17846fab8c96d32dc6640eae6ac9fcf1069cb2a027357b656e63eea29d3615c2171edf1840b29ea624d98ccf7774eb2cdbc0d3f1e292181c0a4af113f4b9e5e08a58e185821905d335c6b8244ca2e40638b12ce6ab42aa148a4366cfb175a77646ecea79a5307467072a38202a54a605dee1147e07c1150a9d10701e6629ed66ae85e2ae3b7cccacbaffee4edcb579a9644bb43fc952d86e92b96017a3c68694a6977c0c0b25e6a048d1791cc8646f14bcbb586fe1c75b5c51adfa0227a95fcd15b1331af6303251d2a10d367dcadbe7d04efa3af48ec65eb3bf82faa6f2904b43258a076c4890f76ac176c083fbe708693a6a8655ebba68e597423e405dc7e140455509fa1829d91949db8bfbe84b0745330f483b260401fa325983232c1351f53496a16a5346e0e17b500114a35330b843e18180aeaa3495b152a02449ba6fc7c00c45251e5a4d082bb3170e018f47718dc4a4f4c19db202c88148f623eafc27bec7dec62232f2c40fd5c25229277514567d3eb717b6dca95b81290c82923badc0d4bc9761950b2c33836a8a426d9578fe7011bee7fc69a2fc4d9ca545bf3605ee20fbdfea9c71f00c6f56f4ee4ff700350d278a62101baf91f27bdad201a7029f86d69b9230d5390ca6df20c083e3ae684be2624147f382a7f2e26e13fde7dc6fb09ff49f163e20ba7ef4d1facf3e9fd8fef0286c0847f5ba43ee1df51f9b1721ee232441622527fcab19e990d3f10812b370021302bef3c33e742c083beddea31f8ef816b0a40277033e6ed73fbbfaa1ea40b6a9b95c94125e026b294fa832e55b28ed13d9dc64320f115e63e69472d8e4f638f7538d72f1999464e2c5f531a89cdc98415e0821f007dd7f6d2b582ac9d2c920b651af5d970b42ad13e5dc4e77ae9ffd5702a1ff80bcd2bf6c9cf2a3535f0d353d46d88542c581d3d0c6a21e75d52e4c6bf9f75f1ac76a9cabb563d83eef06a44356f44a63a31dd71acbf684198bf8eb31cd37bd7a9156e59e15fecd18f6dcf1e6c294024df80d1bb71f75ae4d6c7466011346f22a132e00832c20e9173ad8df92322999ab6ba1707a520c391f664e8b90fc5b981ae6588565c11489fc0d1aeb8abfeefd17bdd34a15b5c4482e0205acb036e4978244a3e30ae1e9eb97050cb8919674429780c0decb855578f620f0caca922f0493f81ef20098024f1e5983c62d7eeb057f9666635ae707c9e6522195f3d0b06f391d598667190a72f85024fbb1954ad9028b127492ce672c2c43d7c7003c3557d9369af8dc0ca3d28ac73ad83d4d3c875957b8bb5d13e22e24d33dc7ef7074e810c9f3078ca75134476853411e5975c7ed9dae8eeb833bc1d27abfcb465e85f12bb09066dc77ea4e0f386020db76a94ce2f0e51941b230087491744a0407d8b6c8cd0bd41927347737c6499b1483257cae7e79290c4aacaa39aba3270208eca1a00d1ac67b56ee08df879223d8573744fb4ffc951bc2ac143e10327576614111269c758769d48980d398d5ae67353e165c3d0afad0e3ca44a7f2a47e150a15d631454329c288d8d352767e97ab898a3904e4f27cb4f2b650ced68a24c95bc0bc7dd4aeaa7629ca07774f3d6e2a4f8ab204ca5b2032ccf7354c3b2387158f459de9334bd11824201534a1af705a59fbe7d7f41b8f8d73c9e943919fa4cb8ec89baf564999e89725164798a9511282448e0eaa60f20b5c88d6b686a09ab1c69becd933e19f5a171dd6ec70e5655be49a59c8a09087d6e2a1a16b6f80364d9387f7f77bd82fc451275422059f108cf32626d71841dcac622cb68cfe62179980056af46bcc70052077220442f543bccc633d8d6f138eb5ae6cc0ab77aa835bc6cb4b768818c8a765ab319e58a8ed4905734ceee07174f4ca88c8c3a75c314866dab3d666a1974b63554e8f044afc011e7e185fa9c48f8d0de00b4624d6cb306f14357e925d05664f0fac20406457be012ae66b8311627061ff8d9f04c51aa0ff63b6035d2cade07e0d39f70575109ba42a18a8a615273b4af9645691231fd7f58136d076fdc292f86a89a565184ba078a933e5aafddc98da0f1148b0eaf58bb22212e78bab2cdb3f66e564c31596c5bf7b1eb5cd2d64881a967eaa0d05bf7c4fb4a4f229629209a3ecc02bd2f44797a437c94fd8de46539b60441691de5f4e91e2e16a3d3042e8bfefca548ab29e1257158257de0f8d817be4bb4441b8f1630042c951de6e8c8e725fcf348f87e7de3769857aea6e62e5b82ee90e85b60bc231e45cd602e6d9faa8a99d97d4f562cc735a1485c6a497f5b8c0a374d3cc23e1c4a5cb65378387b57e159a9873839227b3dc23dee140d8aadea48aad947c4915201cc9086342cfb296a2c83b377a7a0190266258a7d7f092b728dbd86f28978aa8acfc7c252245a78ea891d030589a2ec0531b6cab01b4596192b145de7170df6fefcc6b8044e4751ff1ef57076e2fd12ad3533b163b6f9b92eced378247449b336daebe97c01cdabadf39c9932736e0d99f82cf65040ebc3dc812612ffcf1cba2028072022f04e8c921a82747c6405c24a33ab15d9da3575e1031e91e2c37a1178b3d3ac991b0635edb33275b5c1f924ac3872f235a304f42a464635fac2a694f9f157df7b4c3bf872e8e50ceda89e213563a5d382e81e9c9b94624751f73af8c285ba1f035f7330b15679417534d21435d1f8d606047c6bae97874340a054d527b1c28c1350d1c0e624e7961282de50869baa9b1e33d7a9312c3ac9caf06b4af8035a31d50924a2f61689d54ce6bf954f137af5eded5e4485ace00fe93d682f6239eb59bb12180ecf4f3bd2bc230e2b12628f75672f0247ab31460a85d98a834adbfcc1ffe57c281d416b2b9b23c4709656c94ced5152bbbeefee34ad17d91f5c5ff59d263bacda7195673fe096f60cf005ca1128d710ec4a016ef2d5debbc48f9faedb1bce9674daa0c5c7d54323666c34dd692917c4634e667794e9d673af2ad9bafe62804a761c197f1e27ea6573c9edf2502a9e81d8e17353d60285ae3a127cd403d29d8b90cf1bd740b23d7cbbe10df3c294773bb84fb4ebfd519c84818ac977d2debdb180f8634e964597656f6479e270f953bc78a1208cf28ffa9ceab55ab14008d89c60882f3f5ec8e1a54f7e7fe00533eb6eb8d8588a46263b982c237ee138843d0f8887148e4e940fe8858c6a15840bbcb27ae2b709e80e41fcf751d97869f100d40c355a4142e579d8e834e8c69b50ebdddef09118903cd8a43e838242f1317ea629f1fd16077113b7b0fd2dd74b91d17141e75554b148c4e1580f0d3af1bb7f3b64c4250dd0c8e3ad303fe79e27d8b8ef67aa993830f96f11440516da8c685b7fdf9af730b65b348538f18e2f5933cc84486e299bf01d127d3484af1ba261c2ae87fc514111092811a841f83036e58f7019390dd5fa85736147a4866dfb1f984997dd47828fbbc5c7920293a37e5e23640c3e573c78594838d7c9bdf0d1a931ce361f4db3b64aa8918bda753c41846ff58836cb5d3c10af5719e343c40f21904e00f25802badde411af8ffa16ef7f737195dabab5ab270a4c7c20a1c01265d77f29a8db1f912a7f217de4be92b2a561122fba1529ce62f47c5e5cbbb0d0a30651205fedecd753de60c4fd7862109de58e0be82aa15a59c6a29f0faf03bc2933c566253b10d838f7b917301b760997aba090f7456d5f21f8c5e06432068a3a56326c9d849afec524714e052e502934ab929ab804b9011559da8c7fb4a2a250f2d08bb7679b0a6c57850677d613bdc67e8ec88cf0c437e3045f081c239f7cbf64d1f79b36b1d9e247d346348950701991454a5d03cf11dd41b850418bfd974ec6e3943f5542c8f7322a2bd66b42f6d48d8754cf1afbf88d6f7a60065a2389482a09d481b02344d4a51aa9a40f0072499521962c44a9efd426ea198024666972576df205329bc834971690b92dca894a3412b1c601bb8698e7284dc6a6375e17727ba37d90ef93b68150fca599d86c02b89bad89edc8cf96da25b88e3dc61092d975d4c466092c160231328b2a075ea7ff70ff5090521afb35746d19e233595388f48faf56eb9303fe28ec4faab5cd316c9e8abc1bc1a4b5d0d3ae602a0d64cf37cf2a5a1833a1e5bdb831d12ee9392f66d7cb0e3873c58ccfb208700f994e0c4005fd1b48da894d147f209338eee5b23339d536f89744049ca3ee3e0544bf820a1168f9013460854af3d647eb342c784b006e9abf2be89ae6824059164c01a90fc65299625f8af8f2541d31db5c424e7a6e305434cc2e783003c56b917e363007243693f1ba24abb7b29351b578452b0bed4a4ef37888de3dfba71d8e496b8dfe1cc2e71c6bf48ee1ea34f4f88030cc1968653f78997b4919041305f23083ae1176455845b6588ca9af250fd8f948a95045c04bcde86684913fb469b181b241804b74b74993d0dd64d296c32ae211afc09f159cc39b065538f007540d96603fc86e8a4ade97f1ef1c70823d3e7e03d643096be273317add1cce3c9ab96b50ed4768fa1adc6bf9cccfd13cf19e2be0eb56525f9540829479fe60d8d97dfc275d93458e6c106491c2403dd51280390a0e10130eb2de7342cc1bfe8f0ae29663e41e07d313a7cb55b31a094bd0ae0024277105d5930d2175c4a53502c8683ec3bf32caa193df0e5d6a0264df05f15ff630394b2268100341f0a906fe3001e5f0bf70e73ef4a03deb417dc65c41634a1d26542a6a3346d01572f0ecca8903b6e12858f5ba7f40cd750d5b8baf7381499926c11118c21b9348c66937569f05728844e9860c1296af6431bbd3856dfc64a013477267ed24ff940238bed12308ef617a89216ca0f4679d116f66eaf2bb117b82267c1ad3472d605242ca8000c1909a811830e2c077644e69aa9bc0840ccea754a4a3ceb26cd70abe84b9e8259e60b5157516b96c6fde1a2bed6c419b8c384fdd6b56db737ec6c8c0a2f20a86387d52060a57b4edfc45a2b669091ccb2485a616556563e20fd003a8136614d646c4a26e673580a29bc6e9b2c6d3f56980bdb9632aecfaa32ad44df38550f53ee6043afc18d6c150c31c0a84427c81520ed51ef2139cac92c55c57ee617a105167f7aed39cf2e7f59a8394734b65cc2778ccc102f41130276444228e1e0257c78524c68e9c39b51ca29be66f5208475168b459b5b331d3fab124439d37879ddedca1fe7437a9efcc21cf6891a210cd56186e08e5bd957388ccf5a8efe6c339aaf13f6c2d4fbbe422570d5da5cfd2df0f29519f385e8742c9aa53aa4af1af990c6827078f337e7fd9956a3e55bcc40986873a31c3351ac022cfccc490418c0c2e134083337079ce33d342cd92453b6aa757586d56d8b480a48b0c80145a7ba95661303400977f8f95a54b37ac502f0fd38ad6b032f1d53f10cceb9956950d73e25115e8620c6a9c7c1594ea50b6713b2152efa3eabd18f48b4553f4df8d2c1659bfab6b65643207060af756bb8154cb050414cf4807570e3ae05beb395fd9842417de57e51ff7101b1f367a5ffdcf2e00f3949497129a5f34183dd1154ec436f9157144aae4121522cc3017508e2d1599b4611eb3f9394471a91a997ed37bb2b62c7b7c4a11c102df96fde2c2520c476fcea241cdae311c02f53bb1e04205743a02c5cb0f10a8adb763c071bffb7bf5ea58b4610dbc539810d227c91a7a450b27868b15f4f8e22be1ed91e17af2fa42b2d24e29836f47db6c41a4d69c043734ee8aa0e093e6312d39257d06154c8aa4a3d1545cd463e229d0d7c803fdbb39543baa43d06454021db966dc1ece30527bd9f0111ee5882e7aee74cc6d0a9f1556976f37352c22a3725400fb16e7559e42cb4f9696b4552cbadb8142378df128868deb6966580a103da1fa99f885c7fb31662a77065ec86b79b9a3f4d61f64b59d32eb0b272d67c6d16382f94598f3f09e577650e7e467f8756cd7da6a1ce95a5618c6d228397d77712434ff09c563800e7dd051278d6759293eab2cf1e41a877b440d4bb9817fae323fd47d2f1f223eea267c4a9e9c25e213610e90694946d9d25e3b71ccd2d8d8c8abdb4cdc43d64bf9b6502d8b37556a8c48a8621b3d597283a650a34d56e03d9b0e4236f8544c04ab226158c04f15865cf42f2f848f15b146f9c549d6c0b3b7d03ba193c0209f04151c200cf50ff6d59cca72aa54c84c05483105d5a224119e09655c48976f224f2545dcaf6f6a90ccd63387741e0f1d69e89c97c1a9e78e5ddc67448cf47622ee67ef85301c1f3e5dc875628dd363c1ebef814ac27f87bb34a3693caaddaec93a86ac944952918039ff0637360305d181a9d94365dc30acb4c7f3545d7e1f534a44409516f8808b186f537b7b1ab15a46b58476986701884b54e2fde0f2f9d2830e7792f3811d430519ecb0872eebb8df7a8606baec0f20a9170375633a7a7227004f21a7a0053e0117b800294c7efafa9ca7e882d7979702b310341f41d06a480e26e98f0f00d9d6a21156d43d7287649f1f11cacdd1487c76f70ff2e54bf52ae79afbe5d7c45bd6efbc89683fc312dd2cdcf5aa4b0defa0080915291e086aec7ad99ee7fe0d83442cc99b57d111e8bc80fac7f9a41dd113a230cbdd09a56bd87f62dde76e08aa3b78e1545eb69ceda3d301c9c232a78e714464668b581f8704a16844403c385e9db751235091c13f12b8249b82cfc213ed959351fe82862f959063cb737032c1a25ecb8d0da630fb8e3fa473220c0b083e6bf9c0b646d833ae0e0966c7d12612b0f7cc626778bd19320dfb8b79fb5b015b64895c01cf3e61e3901ef1c0073242a28478b5f053623e230447454c691ddc27abc2c31176dd3104ed670265833b4f42e1532c7904756893b8a037bfce97be453468265eb92c603e6003a8a536296dbe5bac8f999c624714261b52f15c41e62320c6a2d637427a6ef0343941e17d6a3d6302d598fe597c0271555311b4a00b6e6d1dcfb692e1ec9e63c3999d1ca92c0817c7aea3d6396b55ca526553adc2a7f4ee8b1d7fd2df467590fa184ed9d690d6d28bfa8c2f8e93edd656d1337fa1a31d7caa80fa35227701d606dc2024a66abcf4579dcd0023274816c0aaffdf10297eb8fa268741f181d357069c40da48f14bcaf24ae915b07e22670451dcc7b87a4a175278fab22e2ffcd1e88ed9f13f58095e794c7569f1cadfd6a182cfed1f342ada56cf816e2bb1cce9efb7180b2971ddd6f6081d21904f0f337456895cd450071b16e7716e2ec269c1f1e573705b57240437b0e70e2c2b38b368cb5806466ad21ec208a7e9e1ea217b093b5809a72b67f224c33845d22f89cd3084d3d753bc094589a02bb8eb99df3e91b7d796af83a66145b0ae4a8b6142369996c48c6077c35bd16ee4ee2f5bf22ba6ba3e882724c959fbbbdc364ad3aaa5f71be59c35697a2368b04eedcb8225396845ef18f06f931c60c0b171f02d42c71326b2e58767746b091085150c72127fc384514245f5987e1460cadcc777730496b13ffe38e70f487cdef0f48aaf67392463e6c315a1c26c1b72e6ce4d7292b3189a638eb6dffc667f74ac311053438d88589200b10082dbd353a20af3a0de89e838eb01e6c8817d5cc00fc2d97dfb21cbd931b14f56abb32dbbd0040ed3b34acb0c7215904a28569088e8a09c6dcda1097154dc5177a0eb4ec002ab61d9d8cbc2dcc9cce21f339b20292d19c370741cd082646ca517fdf523e133c6830d85644e615eb4094645789a7a6b9a11dbdef7ec79be8aec90c235f1855299f11251a1081f2bbab29174edc708f926a9035de8dd6d723f40bffeb1aaf3d9620339285e03dc4ddf4700f0cdd8af473dc464806b604c2b3cf281fa563895f9e0263a783fe327a204ed58cc16df0e93123be5f62881891e06622a3642bad30ff37b7c9802e4f6cfd868d9ccc20920ae3cbda914ad7c5dc8240b13a60a6fac277d93418121a5784077c541761949542a9a0cdf11f14497cf7b8f78df07f218bd1c86c526bad76da1f2b743253c7ee816884a540da0f90928602b9149f9a86146b94a4213e3782483e5e6311ba857bf938d7bd35de90b38e3f76c7b5df42721735e1fe017aeab87d82ec2e1d51d46b6bf25136688e0b55468ec320c5b5b94f7dfb34617be35afd1b985bdf19ea911d08467c874e19f8e7402ba33987e04a9e8484bf835556b71321b894164d02f63bc9991bccc18f90ab0f7b0368f78753baeda1aa70628b0b52088bdb4d192702c85532431eb01d03b2248d489a86e7e117783738715c1d4f22b84fa6364dc108262dbbddabc76d44969778a7247c8df8e8dd74f6bc8772783a54cdd31c72114b07852265471fb95aec4468ad29deeef7277a72250f9c02744bf24370df2d6aa0989361f2d6222088b434dd413bd72b9379adc891372cfb23bfa2db82e5653e47cee701a81806ab5cf0f8b74fce277c5a8831915f019bcdcfef639a86497be55acd20a9c05c5f9ed213d7eeac525d5b93316a10bb31760cc37db63fbb3f1e923422b9885b628a38802f8a251d34e4928f19f9515aedb8647629b207102672e07802e2829e1fe6c81916c7ac1cfc36ba994f2ba8b0a03c643cdd724d95f99672350759b7cccd84b2138001524620f3930ebc4b928eec573dd34b209f40072fd6cdb95aa5dc6b7461b6ac10c92a840e1d985f848ae07980f1d016522d99de3df1b6d3e2cb601561c7ee974e868039f8d0ce62f7e6e4ac3a1e9122500d3d0843b2c5379e04397d7904881c5ac7acc8def09478787929cf9340f754b86a1981c44fd441d6c0f4a375000c91aa5002bfb7ba44407cb4bc8c2e952e3147d92f31d4f08578da17db65ec95e8548ae4a57851522bcaee9eeed80d40b53512985d6ea95cf6cb0df3afd5364c09ca02121255fc07c0115bda509b13c217929ef423e7241cbba6429cdb45903124c09321f5b0479f9fa5a54aba1c2a4b3162b2cdaea56e6dd961f182aad90ac6694624a4470be8bb2869934e1fae858111666f639008b1d41f17ada99d0aa3bdb4695af65e358252db957ebcf0bfebec7f0062900adc86e3b95dd2330ac1bdc9690af796032efd025d3a969c3f20d84aa436735623c4dd0042d09c81a1c5f852f9b2c08013fddae3807101c5298cc5ee9392eb75940dd453ecdd421a5781b66bad5f9fd3a9a5a447aac2a0a0af44496a5fb4889744f4a88fdfb2b54764738311524369f7eca94c21d905d9f99f8a8f2ccf93f80eb4eb497c82ee199eaf5dbbb39d748219a5382231e5ab1e26d636a3139021812e3ea4cc24c56823dd02ae41d898789a0733a8bf0b536447c3f19a2ce88b32937bcd6cb5310dd7a7f68d9748309a5ff14811cae038fd19c345d7dc86da9a23244b03048acd528e8ce2d8a7b4d39bbeb36bb83059cb80539179280ae8b31a4cde90c4db6c843d77e1b0d644f983f33218ce7dbab0084e0b6fdf19cf1fea1c2d1133425ce50f226f61095f806f58e01689251795747e89d4821be50242d2af6c488d948274476f050d50b0ddeb33ec020670aac250de712217a54083efd3472717d9ba86ce177fd922e229fa5920c0c01a81cca481250e7a61a54e69dff3de125de5bac90b3d1c1ed4ad4520a8b2b8c1059a013e916d1e1d93fcfd596a9ad57a85a08984f966800049273bbb061e0e7df621b4639199730469084bf0e68085d86d07a3d877d6f8d976fd75a571409a6e60817c50698c67e9032c2e1a2219496c481a263dd55f2c080a92930d8defd85c6e33e161c35bd2cad453882720d8ed39c653624624e3bddcfd1a6e0584471b95fcfc4a9c1f0e0cf719d5d17280a1173673e3efe530e49b9721f82b549915279e54152905b77ef5c3ceb9ead5b7b0438ea2e30441d6b860485c9ca83d2bce2f4c72ec221d1b259b2a49f6c10dccc0813eb7482aca1a67572de2d887395928d7bfc690280fea7a3e28ba58f80a6683b5b113748d2496a4322a3c5e4c8aa9077813a4b8a7fdef3e7fb213918b061c45466ce2c11289ad10bc0236677cbd519b502516c6a5cf3e3b1b82ea8090e9fdd06739e46c3cea4a3a341fe010a688647910e027939259a4bcbc589e519389fb52974cd34559367ea3c020be5057ccbe18b5a81928c49d73ab1f70f0d83cbf4601f04e8e60ac4c225fdba05c2e59521d34e8ae8ed43789b349e0641e5713f862d9f0b48d477729d2515c1b4a7dee126311a7b9cf8065ca3880b119ce79a2738180035ba8596c3b508bc7d91a506a4b1ff81719db9db2b66a6528a1f9cb991d482b9a72309d8128ff019cfc1de1fdb1c922dff5c4b371e2ac1becdf9bad1d05e1b3c4be9abf0f19551db4f35f82d31257141967e0bb7add1c4a78e33b28c5764e7be027c4bd692d8f7362c1cbfdcfd09f6a8ca86223bc06c708860398a74e174aece3c6185c632a404e5d373c406118d1bfe651fd9566b97fa31a75a3cbed87314553db6213efd00eecfca3a2bc8f5f8fddea0ab1af1c9b754e33cbb7ef2e2012b931632f6a167c449d6203b3d73daf0d71e0b7f8a811538bae7f677662f8825e89b4259f28c338c0199e1cd283ebe98c0e6a8c5172ed62eab06a280b02a2143c60a54ec7efc13b40836fbe2b966b23dbfeb972a95d295742129ee0a08c8756b05f7bc7aabd375bf9e97d8eb1a493beae209edfa90a3be18aa2b2f7402fee529d086078a13e8c9c409bf179020fe3e977561ab8c52cf20f12fe6f6b9bb83928c2bc8ae087d8675a07b8e85ff9a5bf6af98fd0d970afb183ef5df261688bf91c05a0a59e96ca8e7c3fd00c6d604d2b15fc2f2214c44948e56c050250798f8971824a3ca5d94094981c4a0e20611ab4364383d11368d5c755b109d477c0df787f3c458d097f90b8c51a9d6f624db101fabd2e26e72700edf9ba48496f3c1d1dcf4bcda3ffc6b44b220ae61fec885b0c5945e96475f85504294f51df65a5044db4de586f814158cc9f5b1141b0cd747050e1c0210995c6ce3d217cc6ad4c034b8904ee4d6135fbc22ba8d0f084c04849c5050090e0068bf5612880a9c27182804eed2b44ea2af03167cc5fe3ce8669252b19c9b30ae1098d1c571377c197ecc00c2471c34c7a0f10dfb1ec49ba3466f84a0546917f71605c5182504931bcb8a0c47d26d53c9240f2152e92f0d58af85da8432a9b51e8d7716307842f5623089f553660ddddac9a8717c526f403951bdc3b545fd4d1227b628ebf4b5f1af9e093f3bdc0306e0bf34a79230f7ba68b10b0520f6ee76fb33c3868b21fc9cb709f1295eea301d0f627aac219125c4eda5417d68ee639fb85bf85ed7204d1e49f990c5338000a7c9025a3d934543d138559895227c244613c2b3dba2f28ccc43ac87b9c4f0181aed1dce5f6bf9844a9a3bda94df38ac9226a03f076f1e39daa5ea18368b002fc39cb13306a445a152738d273c41103a444ec7679bea0d8834ecb8b5d0df7f8961b88b7beaccd77b3ce306826ca83f35f79b27580bb48e20192f928dfdae3100f4f94ecf5016d227d6b97be94d01cbf5aa80a323dd89a146169628bc23d89364b0049c7785dc2afdb3536ffeef791f520cc9aea30147e3464b3b1baf161be92d74ab91eaa682624cd93eb010c61c5d2fd79a9e6efa752461f206f9376f050321835e13ab3b19913db5fc61cc77ab05d5d987ff68786633846318b245eede4df4d325a7840419b057270956f448dc8a3ca5cf5e0ff4d63cf0f5889199a52c800f3c3e585ba562c854f64d501bff55481e6378c0e2b3de4307f97ab80d8543736cfbc824a8377f982200051eed0b50fdf473ce92f8baf471de9e4588355a3f1c142ed1efd4a61c93b65dc2919f98986dccf94360860b1e12ab91eaafad8055299dc2b028a20c9744571ea3d0dcf4bda99b30965372fe0fbcb68c211e2a457f08fca10ab78ed0a43467f368a71e44724238f16e4ffc7efebef4b23d17d0d028185a2d78b47b851cfce56bbe1057334ad845a1e82c50073d2dbc900f87dd5ccb14f5496423f325bbeb949ed25f5fce1a98d53cc6095acae6f76dcaa77196751ef6f3deab3a96b9be6ca3e050ab725c2d426b0c6e1beb3e6c0fb6c9e765734e0c056989e45d46c7d6d50951f8ec9927b57da21ba2b39c453927aa529745bacedc8873a5685e4cc57b6758fcab63d9ceca84dee5deb62e0823c6059ce39457ac68c402652d6426e430d55697e7e244799b8d4f2725ea2e7470e55c399ec987b0392c297f951fc79747334261416e54f9fa2978ede7a9512546e015bcdb4c831fa511549232d683d49be7443608b3d3d91ef32825f8af6c4f8cd7938a1a01c02ab3188490835a580de91c885e1b855db98a8dcd9905233a0cb50c798cdb0e23cbfa069038d9a4e4641c37c5aecd23b9dd151e808d918b742f550a9cf6a944f9480ec2ae36c158417449c9363f395c3da731a2f9385cd4aee3c0ffcae53e3a480c75c1b690fbab3b474f73ba2b03a858036e9703921e1d35f17314c4eea7059fee53eb4083b671ccd553d78bdccb7618bb9fdfe33e62fc4a4cc5e3e1d74a7d50d445407aa209629e8b5fd16b363218bf113e3b4357e756f7f56273d5a24444996dd95c7319c7442550a7387f45bc1060", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x1058c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1facf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x1058c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1facf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123", - "0x5e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb373285fbd4c6fce71acf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69": "0xacf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39fec29fe06b54a1c58c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1f": "0x58c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1f", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3a8f65c4e14b8c350e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066": "0xe803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3fb08f1ab6e14e0d4fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123": "0xfcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195037606837a8a4a9086175726180e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066": "0xe803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19506f21f0983582bc906175726180fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123": "0xfcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195096f8eb862d21fed0617572618058c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1f": "0x58c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f7b1f8ade68c95ad6175726180acf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69": "0xacf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1058c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1facf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1058c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1f58c18106775d912da3fbb93ffb0b68a9734f009a231fe47fcb6164939b828a1facf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69acf59a303f7444c1c494331500b5448d714b361db59bc08218e343eb0810ae69e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066e803b1d97726c36cf938a374bb5b0f0a6da528cb63ac2d4b76c669a861430066fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123fcde6b948191260c67521879d9ab2b4576abf3321655c3d754a75e7781207123", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x02000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/asset-hub-westend-genesis-values.json b/cumulus/parachains/chain-specs/asset-hub-westend-genesis-values.json deleted file mode 100644 index ae359a23cfec..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-westend-genesis-values.json +++ /dev/null @@ -1 +0,0 @@ -{"0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d":"0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322","0x3c311d57d4daf52904616cf69648081e878d434d6125b40443fe11fd292d13a4":"0x00000100","0x5c0d1176a568c1f92944340dbfed9e9c878d434d6125b40443fe11fd292d13a4":"0x03000000","0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505":"0x00a0acb9030000000000000000000000","0x7474449cca95dc5d0c00e71735a6d17d878d434d6125b40443fe11fd292d13a4":"0x03000000","0xbd2a529379475088d3e29a918cd47872878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35ab31e77a3618bcb1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f":"0x1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f","0xd57bce545fb382c34570e5dfbf338f5e878d434d6125b40443fe11fd292d13a4":"0x03000000","0x1809d78346727a0ef58c0fa03bafa323878d434d6125b40443fe11fd292d13a4":"0x03000000","0x57f8dc2f5ab09467896f47300f042438878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e54c60173d025c2561757261801256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f":"0x1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f","0xe38f185207498abb5c213d0fb059b3d8878d434d6125b40443fe11fd292d13a4":"0x00000100","0x682a59d51ab9e48a8c8cc418ff9708d2878d434d6125b40443fe11fd292d13a4":"0x03000000","0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a":"0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322","0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1":"0x01","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3a85cd90de8cc27b69cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325":"0x9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325","0x7b3237373ffdfeb1cab4222e3b520d6b878d434d6125b40443fe11fd292d13a4":"0x00000100","0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80":"0x00000000000000000000000000000000","0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ea408f1f1c5d332c617572618098102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322":"0x98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322","0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903":"0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322","0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609":"0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de043259cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c78387612a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e32298102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322","0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1":"0x00000000","0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ae4f31799916e8f998102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322":"0x98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322","0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b":"0x6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342","0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcd5c1f6df63bc97f4a8ce37f14a50ca7878d434d6125b40443fe11fd292d13a4":"0x00000100","0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb38e68ce95d2dcc62d12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876":"0x12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876","0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c1006f4963f2df10617572618012a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876":"0x12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876","0xd5e1a2fa16732ce6906189438c0a82c6878d434d6125b40443fe11fd292d13a4":"0x03000000","0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950acc29cb77138d7ef61757261809cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325":"0x9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325","0xcec5070d609dd3497f72bde07fc96ba0878d434d6125b40443fe11fd292d13a4":"0x03000000","0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d":"0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322","0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4":"0x03000000","0x15464cac3378d46f113cd5b7a4d71c84878d434d6125b40443fe11fd292d13a4":"0x03000000"} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/asset-hub-westend-genesis.json b/cumulus/parachains/chain-specs/asset-hub-westend-genesis.json deleted file mode 100644 index 09d07277c41e..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-westend-genesis.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "Westend Asset Hub", - "id": "asset-hub-westend", - "chainType": "Live", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWQWfQ6EBNgik1sW5by9vYagzrdsohc6NafeGPU4upnLRp" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "tokenDecimals": 12, - "tokenSymbol": "WND" - }, - "relay_chain": "westend", - "para_id": 1000, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322", - "0x3c311d57d4daf52904616cf69648081e878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x5c0d1176a568c1f92944340dbfed9e9c878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", - "0x7474449cca95dc5d0c00e71735a6d17d878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xbd2a529379475088d3e29a918cd47872878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35ab31e77a3618bcb1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f": "0x1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f", - "0xd57bce545fb382c34570e5dfbf338f5e878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x1809d78346727a0ef58c0fa03bafa323878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x57f8dc2f5ab09467896f47300f042438878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c4f223b45afeb4475a4b02f5f2467e2998102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x79e2fe5d327165001f8232643023ed8b878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e54c60173d025c2561757261801256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f": "0x1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f", - "0xe38f185207498abb5c213d0fb059b3d8878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x682a59d51ab9e48a8c8cc418ff9708d2878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x0d715f2646c8f85767b5d2764bb27826878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x0420776573746d696e74", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3a85cd90de8cc27b69cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325": "0x9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x7b3237373ffdfeb1cab4222e3b520d6b878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ea408f1f1c5d332c617572618098102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322": "0x98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de043259cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c78387612a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e32298102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0xf0c365c3cf59d671eb72da0e7a4113c4878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ae4f31799916e8f998102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322": "0x98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058c48f059e85066a134b10885693748898aa40c4208ae0102580cd3185c2f02a96c1158a10e830e0c9dcc818d377b8037c3701a08828aad6cd4758e6c7b98fe016a9bd70ec232bf4ff6fa4354236219becbdb7943b6014a612a5135ba29be81491d67825232768e947a7b8a2ddf7f16dba33eb081383948e940a944eba6e7dd3140c78d2d36f0a260629fd5e55d0717ab4892eb060441ab410ade8766677b39d591dd8e246e2c1e10627bcc00e3cee4b85a7470d8e90c594250298d2042b3c3b55b0349a0a8f1169d0024f13063ce9b14205fd4ec5052c8d1b89f2b0346e18bd82ddc9144220821a5ad0060fcf0da43c4f7878f68dd62aba6d2004073720e1102fd8b2e5861d869df0a835b885e69c14df7b7b7c97de83124ec6a2f7dd36def792ad777e773abba5dd6d183ee798d1d0ee9812efecf2b57d90f836bdc137f8f6093ec2f606dfa4b7d6fee6b694266311b3e16ec37cf8859771dfe6967182807f1274db2e32208df50005212407f65308683027e49ef9a81707d82dae98127bfefe81f5f4bb634ac0b33fa6c42280454f08583a088bde99d52a07e25b0df57751ab917fe7c1348e45f1ef493025ce80c4bfcb79f14c3c3523cfc45f4c5373c45613c333f1ef314c33fdf508a1a72b02fa3d075362fbc969b62bec96c7b7372b830e579a078b62bc8cf4d6dc3212d5d92d2d9df508218c663d42b042c7b0281ece9d28635194e66340d899e518906d273c7adc9c80a5f9f08cc8c57a8260a5e159f35708501ac474e73bfc3a4b028caefbb386c0c3f3195382f1d91178be3473e079c8425ae1accc2d9bace3ac157efa5e9a39d3a5b32544b28a489f8c509f688d3d7d2d1d2b9eb8a0053cbd849dc948a7a2a01086d8d24cd8952eb2c0a2e5998c5ad23ad9b09c266b6a4a092be9ee5938925584a2d58a963e9d4e7f9610aa1fa7295384d19c789d2bbab6d85285dfdb343e9c2c5435eb09c218edce2c1cc680bc37236bd3ba424826ae1b578b7e308debf6ab666f7c747bac3cf019846cd6b3c51e3a8687646c2e636ca3906c43158b1cccb7c822babb43f786ee0cb8de9388570998067e014ce31a7e036b34fc07b8c6ddc086a52123a361120dcf2c1b8e611ad603042d0dcf8369b82184f015d3f880348769e13ce8a00d285596a7993571b11e28537a79ba5d72cdc4b972d859d7e5e1663d5f6071645bd08dd6e56976c9ac469bb83a6a76c694902142b57b656968f72541da511d50b757b6a52b3bdfa6b1c99acdb574ae73f5f248619b60832e7a886414b858cf0c7a1abeeda5d4011a36ea000d52a0d0da25abc836a1e1e10d9ed8208c1ec27a6c4085c932c19ad19c362b2fd989adc3b6f43bb484b01e1b50699e909e20a67762baed5c1af8a1d9649792492799354467b734abbbb38e709667653d33b8d2edcf2ac2456878671169871fc27a6690857e6778b68a3821ee4c1903c275e93220fcf6372b37bb26b1d9590f143db4041149e2055aba9e000760a05d4ff0842208a1b408a175d8962d87f874dd89831b6286d075a78b21c83874dda1411c9a9d2d2205604314ba325143149a7d89441e1ec7c3d3ec23b8f00c20f0f4734237319a88deefc08b26a2f912a4b3cd973cdf25b38630addbfc77472b63402aebd98119cd777796107ebb4d7393f59b75d4ee6dca14794ec879afdb4c9bdc68f24d1db665cb96234434ad23379bdc004308009a9f13bacd1d6e00b4e48a596de6f0dd25b7374bc8fe3dba239bb1a8b29e2caaf40e77a395df64bbd9b09b44749b44344fd63b7764b38fde721e24e35cdbcc553cd986dc8b80f3c90baa807f01e88ad10d3c5b38ec3244a8665407d44d7478f40ef7522af0ef2c0d1da4a543a3e17cc27a1e2082c042349c4f2eb1c90cd170bec0891b6cd9b265cb0dbc7c8dd7b1073f3abba5a940f90d64ecd67da4f7dddb34d95a3e6157be602275136e122cd92ea2a5936fb23db484951f5a4ad59bec3bb79f8533818bdd59462e76d92c210c0d86464bf676db44c4a7a2a0d94eee37d91acde8c5a222ba511be6b93d5a273b72cd45e1c8b597a06d9c045ced0e4a16fc18e6663b72edd9592099b81c8b2ec98cb8dc0bd0ac8c4014a1ef43e44409bc783712cc43bf1f4c53a70c11c7e3ba5ddcf03cb77d300da4d27760b34b38dd8661d5d299ce6e61fc78192763ec363ccd7df4c1343abba5b98273c90e6ce9fb86d6d92d3a4434bce4299dcdca2dbd6e4bb7613697d63d3b4fd69032f643a2b59d31b32660d3ce2c21adc9b57062b501276410c5dd384ea3df99609a2a6a62038fa6322b12601aeef7206bf43b02b8a6ddb0331cb3d2305d83b40c7cfccbe6aab5867011be85c35fab483b9f594516d2227b1e314cf37ec174cc1e18fcbb84937504465980159cfbb586c0ef994564e1649e16f49e69b869691680d1dbe8040922020fdb619bac99747e931eff5a7b5293ed369b6cc778b88ca54b94b50d479a13ffe45a52b6eac8a3d525b324e9adb5c7bedc29d3be6fe729d3ce972ee3e55a4cd834633faaf47d9c92e46a2d217ce971f21b11bef428dd86df97c0374dd702e70e6cf8094ef31d429dddd2f1b2cd9daadbe1acfcdeea768b94b11f4dc87b83b48e1a5e9ab53d275eba6c4baa2fd9812dbf448769e1e1e91d979ebe5335755955afaaaad2d2d36d58caa9e380660cc876abe6bb24b2597abaa4a68e037a1990f8362b77fc3b35e4bd5d67b7f474664560d41365ec47bc0db759b7e3d912f21e69bb4d93e09bb25db6aa4dfe6eb73b7a511b9dd0de62e0053f06e42e1d5faec53674eddc66a3dd0b48ea12f4e4d9599ce283f434cd98c8ce94d866d3314d90667fd3b1881179a72ea9c91535df993584fa6b364c4dd66b4d52046d4b66e1b00d5d2c9a1e2f7d2d1c8ad65153b769362ccd98394df96693edba4db6a7cbada839fd4dd64e36ded63e3aad6584b48e8ff40c08fbf69b13cd911e4f4dd6ced289fdce2c231288b1a8f2687627625f4b083c3b35b79925643bb288c12903cfc8e0e1e902b49466951e2f25b3265a473d9d9a759b7a9c75c8f2b4cef6346340a8c7db346aeea7c967160e5fc755774875b61f1d49ebd6908c0b5668e3105cc0011e0e41871b6649c6312cda5f2cda23e0aadfaaf79b44eff70b609ad7fb330d2b830d61f4de07d7eccd22e07be663690eeb69fc3671ae9cf622baf65e32a6440dd26ff498a0fafdb9d746ab936eaf9304981cfa512aee67d3fdcd0c18918631b6dcb0b759afe856e1958cb668e9d549bf33b604634654d6f3240ebdb32dd129581aadd3b66c6948a95cc1ee64e4042d378ef2d42bfad1da5ea7e6dbb4368b68b9959becccea001383941b564437273be2c665909255a3b683592f50e305575ee0c50bb26037179ff1dd94e6c7ea4280ec6bcf3801ec4c4ac6808bf5b800cb9986cf17310d33bba0a7b9dd30335321f793cf7c30149235f351afe6cb7ddbd7aa59b67d4edbe9dad2d24d5c40dc3ddd045ab2558c29b1af75bb05b9b6dbd99935a4d1285bb5b3b5d5045659ba49f5614a2c599ed67140eff96c1d713c3cbd5f8bc8c5d3fb8a6958330f6357b3008cdab21d246bc63495cfeef8fbcace58c458e41ee4e2b3b733eb083f8751c622471bb5e1112f052463c0e55e63fa3d08d3d49804d3d44bc4343548bfbf2380695cbf32d24046bff3e01abe79674cd3ba2ea0dffbc534fc7718a6697f7faf9866ffce7c3c9ac37a9c9c69aa13314dbd0fa6e16e3d4fa4747bc5357cf3a3b92b8f6e6741944876e6a306e976c9986311637746d8df6d58b2495d324bd23a6a7936eb9b7d275b6c438e453bada5c7300d7c3b0f09a789d6e9d2a72be2bc98668a6faf66ada2d9e534b7256351f5b5866c3b1655b456973e4dd6d5dc691d2f97d9b6cf3459c338198b62ab99c16f18cfd49d66670c48ad9abd5db6b871dde5a4ce26b370a8f858c9add88497cc5a5a47bd67b3596c43af51245d3a8bb150c5221f2c6a9fce58147f164d34d2caee6ec3366d273cbb58c45f0b07529922effba5fce726b3964616f1af1836593fb61ac7c3c3c3c373d32e624ab47df511a4590046d4be2992fdb824abb9584f0bb468d6d302284834ebe139a325a3b9580f8f17cd9a357fad045c3d3c627475cd8ffb1859ab613c53afded7ab6b6c76be631ae9ec8c69dcd923d3b0668e1e71bd4bf39d2b37b7d77a7fd2642dd72202ff68858797ec8a801ade86dddc96266bb670dce5566fc2338bb1a8c248c9ac47ab15fd2ecd1a5b3a9c159eb148ba4d8393b534ab839335b31edd69eda863118bf6cc07c3e52c124a173b8392314d7b8dcdce766ecbad76b2764cc367976db2e6b9dd8e69f6ec92ab36f7729b85b3975c2171b5ef90fe70b95b384c8fb8f6f2556ced99e5a863164ea38c457c1b661613acdb643de25d2a9219e09220e6a3bec6f14c3bbb643faeb570188b6a1cb2cd58d46ec307b8f8edf2621ad6ed72ab8b69188bd8db619866b76bec7a753bb370f6366cc33c658ac4e6c7662a5384efce7774677b29635175cdce2c227ba695bfb761def54232065cfc1ad3eded314cc3dece8369f6ed8e6bf6a6fd621a56861ad0e876c634ac2b4cb7331f8de6bc590046bb432433e20a35eb7103966621c9d8a2e1a2cd7aa63086969af54cc14a6fb31c921100c8c59e6405b8d893c230a40969a0a420485b48407860bc283c28bc3fbc433c43c01bc017402d200fe00e200ea00e60163007b0069007c6e00d0262f1b040193c404028d006b00590066fcb43e3ade1b1e1a5e11502c2e0b1018100a3483e907820892185c17b806db421b429b0102f099010ce0e4e0870100e0b4f096e0b64c319c21d02ea01668182806e806f6863c040b42b342c4040b4361e1d9c129e1fe01a6f0cef0a0c02fc031c036a016ef1d2787378777875603db41a403f341ab428d214d807690612160f0dd20e241d48593c286d0ccf0ba8a56d713c2e0d0e0cc807f7040705a905128fe402b8051e021a02c201c601ca418a829405dee2e1e1e5e1d9419282d4845786778647e51de111e14d79417840783e783d783b785d48397859483890a44836906e20d5e069f178f0785e0b9e0bde0bde13a90ad212a429484990ba705170527061382ab82a382b3c32485690b890bc90a0202141a2823404f7024909d2152430de19cf0cd213a42fa4226c152423484c908e20556936786a485424274858e02c58ca3261f7b07c582d6b87cd8373816bc1e261efb073d834760c6bc68261bfb05e582bdb852d63b9b064ac1c360e0b87cdb26f58376c1b168d65c3ae61d5b058360d4b85b5c2aab152d82f968b35c2166189f0f460450630b061902009921080e0031ee0000446a084029278c01ee1f1e1ed6183e0bab03858297b83b5c1d660a32c0d168b9dc14259196c0c1606fb645fb02ed8162ccfc8090bae58810a560fce8b5d823b020a5c198b845605f6c306960cebc505245064af44c0020bb06127c86db6ce0b13b7244c9e1001922a9e4852022448e4b628a648820409c5368912113cb133c509468064078a244ba488620a299020d1216581020915239882881225543c60078a244a9450f18002486f604c9448f1c44e92289024493282222437302a463085144852b024c9097490485145ef4c91c4042978a2894b6d6049a098828a29903c81448a2a3a0914535031819d294e40051450740f098d28a88022491444486c604c52902407091326294852640a2aa460c2248905a6b406860229aae82549729650a181235352034392e404494e40810b449184042478e2020590b0302639502429011469604c76a648b2244909a690e2121aa690620432d2191814523099428a253b5624419202255554f104922549a25022c5096e72a0a042c90d0fe90c6602244fec3c11c5133b498c842433a8400a254f48b123c51452dc90ca700228925891c44522035b42c5032ae90a6392448a1d29965051829d133cf1228d814d4185143b4f2c3941144876a850c204891455f4134b4ed0376017580e145428110192243b4f44218592279a7c70bc2852198340a3d948b21e1e9ede51d301f909fc84ad6225c7186348202100012081440b8073ef35f71e7c9f4f93a4263d6980c7fca8c78d99597bccdcde6b4e7a8e797907f0b635e78e700770aeb9f771efb917c4ed7bed3927bde7b6ed63231e73a31e3796206447b1d4a4d8586a4ea29e6c8ebd2749edb5d71cf5d8006ff9c9d65c6bad39768e9b73db1c9c0e845ffb5180023ce93dc7d8b6e79c6b4d62ac35de4651ad3143f89812c0b9e61ed59e7bfc5e8e6decdc7b4cf15bc6fc1e3f187e8d791dbfe7d86ace3966c76f1d3f66c8ec9e34e344ceb98f838ff9bdc78e99e37b8e9907b0a308ea1a80bb001cef73cf470098ee7b93797aef39e6e798df73cf3de7f8b1e3f79cdb7dcfb9e8de7baeb9b70f32dcf6b6f1ee3e2749ec39b7fb1ebbf71c6bedbdf6b63daa31259d5bea3de724f79e93a4038024c5d6a8e89c15ffdd656a9f83ce3111bbbb1ff7de2ebfddf7dabae75e7baf49ae45a9490048144539e71ebf754dbadd2749fb9c7baeb1f6dadb5dc77a30b6cb7679b075bbbbd2b985707725e6228f895966df7bfb7699e4d863e89ca3288aa2a430486368163b409226499420b1e2091310712b924431851448a690e289124031821150417790800a254848308514242001154a741471e9d0b123078a2744a04409150488d9010300181d38a81d289e6032c5134b7690ec486102135021ca4173c8c030494282299e280114f49a224915553cc1c30452ec4c71822534c708764ed02347921220d999428a2555208182891426e081238a244b9244b1840a243409382289144b760880009a1e565081821d00d024e0081cec00491c7100244724c9794289089090600a294ac0e489121c09254aa4c80972834911303b5450217a7922c9129724394876ac4832c50f979d24242822c4648789145624218015528c20c9922a825c4b9e48a2040a244948f0c4122a76982089428914258002c98e92133c31822451cc40130080932c1901922554ec3c0105154a943cc183da59f2c40e93228e080028c9ce134b924c9184044b9808e0134512264c922ca9c204544081644992265440916409922798440145122407c8a149c01155409184498d550228769e100192123091620a2946206a32459256b1032099820a29982c49d204490a4620c592244d9028e0000948c01151244142c54e1529580205921d2b9204a0c914499a0be3142ca1c204494c009b4c91a415c0c203b3378d9a1327a3d1738239198d9a93263981a3d11b39279cec68c44e302723c909361a4527d868e4a43931da5173c2c9b2e60473b24e8c9813274e9a134ed6c93ae164474e9c38714e385927ec0473e2849d18ad93113be1843931da9113e804634e38d9d17362b4a375828d46ec0463a3d168e49c60a36527463b1a8d9a1308603d2c636c4dc0e40916ad97d678292a615992d81e484f22088b5a0f2e7efc226067901f221f2c0a5d2c625f9af7ddb743b8ae54c5151f5c1a197c5a58cf670792f9701b688282975ea7097e3a3f6782153e42482fd0048ba004580459968667c266db25f642158b20b0802410b0492020889470320624dea6ad85335d7416411f92f188ec91d6d83b9d7a95a4e9d2f41c8945b14e8f5f0b67a23bada74fb105f911e487e8c380c0fbb88ff38881d92c2ebec580c06f9bbe31302c82878d97b94ff5dd8d8f1f6040e05e4ed3344d2f42f8aa1296a5e148826cafedad9ddb1d656df2ac62a9a3718d59b325f8ed9bc35a6b3c77b899dba685949289eee33c66fdd1ef52b298e91265f01b4fbd42180fe37320356b8c345298ab925b4987aff1715671498fd2732265cb838b2f513829bb8b55c98fdeb3515ce88594f0b9c60b62ecacf9618d35b667afec19b5722dce6615694420a543ccf0a4df25a66975c9a86ba59993ce873347fa9362b5103ec2f697877e87eff08c76298d9686b4bf329cd1eff00a5dd755bd3c5aab7eae21ad71e6c4c34f535e5691851064118987927438252a431d9e35b3282a84b96ddaab627c0459001317704289154fa46cd1c582c134dcee12a6a2609a3da619bbabac224b0634ba196997179c51b28844e946c5982607fe4d359e5faf0a533fcd22edd2a14524d26bdf9d4504b25bd6de677baa324807862cdd3e6a30682122bac259455eb7264cc4f1f0ec193362e911161479bba575da12e93bd11dbe5942462dbdd1ca52aab809b77419ab1623d5692db543238fba91b44d0692b164bc80d65a6bad3551932c1c118b3620ea26399173cff1e320a2ddf75a6bcd39d7e6e09c73ee3d267ad873ce39f7ee9c638cb1184240c5a295e07b8e71de5b47c6d3d96632eabd243120efd94810c6b70fd207d378ce39e79c73ef41e71c6bf7ef900b9d5b08d739f7dc7bcf496112841042c8bbac859a60513cbbe8471049fa4a6deee1ee9fb4d1c259b76cddae0421a3f50ab62b3508e1ae042f4d099a11638c316e44e29a16e6ecf9f075a90c1189a7bf4ff4078be234c5384dd314234fd334c5c718e3f418e3a7699a22cd613d521b92e8f7e3623d9145368c807e3f78e6f1174229c48345d7df12c70c21333fc88f83f413b599b72b490c9da8d5c488fac5f4e3c83490cf2ce5608d268015254608a37f34eb314214c9b261182a017c8ebd3fb4668c31c6964351302fe3f052c65adb6d7b5ec6182f6343e3e1beefb550124b5c3be7dc73426bad35242e781b76ce853ec0a2e935264af0bdbd92d3bac8909f6564db45e75a8bb45ed1f13ca7699ae264d75a9b6e3669a11f607c92c4c30908e17bb0b5e69a161078c3eeeeeed99f8513c3a2e5d6229fbdd00558b4ccfbd69899b93133ef3a77e6f79ae3b6dfdde57dc2ccccad35f81a13c32db637616466d7d80aaf9d353333b7b373a1202cba5854b1c839d71cb4709c73cf39d728f37bb4ba3ea475d45e6bcccc8df293436badb5e6a08523d1753c58d436c2662d8d71cd3938df73ce3de79c6bed8a8677532271491274edadb5b60d4bb31f9763ce39e7ceacf7e7421260517c8d911ec38369dadddf94fe70cd6dc96282f5b277e72ea5bd66c5227809fe41786719d97e103e5a3810420972c33f5ab7a17357b4742891b8ded9a3ac49eff039e76010288831d41803cb196434eb210294ab59196a50a325abb998167ab868d633858daea2868f69a6852c10a22508b2bb283fcded1dd21f2e9922eed327ea5e272a43e45dfabb24697ca33c5804bf485cd2d78ad5c518a5b316ba5874552c92be64d4d29d1559245d081b4f98062ed6538436da47b39e229ca18e68e2594bc6d62ab21d699568dde196a81036a40861e3498b54081b4f58c45a3a6bd9b8a50b11441b4204d1c613ae896933f08c665b081b5158c4fa8a9e2ecdea9a3a452d8aa255dae18e97a61036a0b088b51036a4e00811441b4c336ad66cc5c0c3b30663424204c1068b58d7d850081b3ccc92001322883658c4da86833c866d48e6a34a56bdf712e375c5c4bc6fdc7815350cf5a6fa2e29e647fd7db2696fb2d672c4e0b8f1180a831cd40add6897e3083da6cd84605ee6fb67be5c5e4a1512570e1527416ebe901e2f5938b002e9bcbc8efa853269969077d004fd4dc622d05d6675d2d32e072de3cfbb0d4bc9aa697ee62e910a6188436ce9e93a4c46dd44ea89324d8e7bfcc2c3fc49c6947830af5ef555d42fafa286d9d2d7a5dc2af487fe1e33cf33b143221c7f39e31aeb9f33ae89f98d33aec97117974fcf116f7c7accf5a135a65f3edd9a8c67265a636a18cfbcfc1dc7643cf3de594b5bfa73ead57595d781af572841d1263a9a8af5e99fc9189089d677a903cf24673acc7326aa033a7c93d62560913c633feaa33af0f5f326ad4b409d59381463a2faa91faa033ffd8128158bce00c761102448371c364db499761db76e9ddd58af41707cc7d90d0c723ce68ccddcf80e0a031d7c8b6f3c861fd366f8955de9769b66c3392663332eb4c67e398ec9d8cccb43b3be5f7e63d6ab5f28cc594b3ccd18908b5618fa2e6b132da5ef90d6b8a4cb57d7f2722bf92a5db64544faf43727eb884464faa3b5f5f469d364fde1eabd5026a37699f1a1798166755d4deafd7d8704888bfa6e6949ebf4cf9d85f3a1475c9f3f8bc8f40fad14adaedf274ac5fab3a840f98d459d04b9f9e25dbe2943c4f57b6cd76300414bf368360610ce68c9d59b75bb0909eaa8a7907aa7f5fb4867df63b39693f550d9a2a9f7891a69b21da90c91d8f04aa46ed25aa29088fba3158bf6cdc91b45273ba21c6810720c45f002a80864b0f6610c0863911472086b9dddd2fbdd6db1cd2280e18a9084e5e522e8801bb71c6d34d71c0e3ab8e71e85c6ce424046888e610c0803c2cf3ab3da8c0c087f871317eb2182195dab667653644a40327856cd7a8810464b069f6bbc4cfac82a12a403bef668e670d4501220e9d5a52bd54bc435825fa37b954b546b045f890f03c2af8dd144b705683e452b7712bb045b23aa8b8fe64fb472d7249a1f670e26e2b7b9045b51054033511540f3e32e818301e1f3ab5d02668de0f397f89104d330265a5a75d41ecd7fb4f25bfa9bd2e1bc98467a55a20beffeee3e6ac74b5cd7ab79da1607c97cd4bdd2efb28824620e50679ad5d92cea88afd5f47a3583e1cb1dc237d88c7b8f28807607d2ee1101ed5e89e81a611810f7e644eed3a4e6156390d86a36d066de2b1131f2f5aa5e63d7d8ee56101ac6449588a595880db49a85d266de63456bbc24add742e9f72e174aabd924b099772748a18216fd768c7eaf3ba5df9901794daeba3cfd6463cb1f180684f5f2304dbdd14f98a6e6b4fb3b352f26da4fb362a27d9c9189f6d2748c89f66b0981b92a2151886ba63a1611d78e52d666ea56e9b75eb0e8bd0b16bdd7eda2f74ab3008c24273bda268d41321f12896b198b9629c16c97e016545723efce168eb44b6cb33d3bda2c1c0946c733ef3232cd9378dfa559aff67626e2cb86c4c570741c8bde1166e14cd21ff5273569ba5e8b6a74879ba23245a6b737da847b3fe9b42d6db01322ccd33a727956d7f0cb9691b664fa4eec253bade19719c1b3be86df5957d0edcd3232d1652278a475b3a6d9847bba94aa661d71bd97b1629691d653e36d1fea3ceb0a694d519dd6136d56a354a0fc26521c489d90f79cab9d7fb1931d35f7d890329fb3aeef8f1488ebfda1b589ae4a82748e4e6dd2ba049fb3c7b396be9fa6cee775d49f0ffd9cc9a83f94c934ad6aea54d775baab3e3bdbd4a9db309bd56dda34adcbad3e73b2a6eb6aeac4694e6732ea89329154497ce2821674131d3d9da28c892aa33a13a5328376183096286b1406d70c72dcc0e00a6a084488820f769005304cb9b902066f337c270c4b178680c119699ce1105fdcbcbbbbb31b77f81b18b4333623f9e1623730b8d8cc1e52183ccada0cbba3579b61673730681406b1cdb0c7b419f6e8c48db63536801c8bf83d5d3a3b1257dbdda57592d38c27e2070216e0c3f57496139ba62371b547a699687dc7b37b8d7935f6d43ed11a29656fd60c698d30bd7fb45edd78744cbb37639a56e36ef8cc75dc9606c6ccd11a1bad57b31ba635c6e57af2c53e06bff9823fe25dd2da3613241297741bd6b96abbfb9eb5bf57f7a5d274edee487b8ebb445f1d4d7b757733ba76ad73dc1dad06b85c3346b3847b87d92ad2b66c7193b56c95dbaebc04bc94669c555cdcac79c9b655846dd9d2ed12564c891deee600c634ebce8fed6d75ddae6605c97cd427852911cfceb840862b1d2fcfbe3ab8deedd56b90b65e11f0794da2dbeb025aba7c1551af3fda754f57e6e976f544e3ac9515a6796f43dea15fafae638d8fd610bd68b312bb890ea8a7834053a76d99b55db982861a6d0d9e285a7051450c2b6764c98363e33d91d5dc6e5698e6f3f66615f9d00a634957c5eb6ae205cc73036fc3d5643d31664495479cb48c2dd2ca2d7b9aef8e70810c559a2fdd59461a192c6ab768e5c1a2f68a362bd08a99db9b83abb69e6eb7c234f2cd085fd22a5947ae660cc811bea4b33d496c9ffb3c8177df9ea67cc23c37dc5c254df92a3759aadcdc1b3863f09b2fe2a53449dcf65571e6c44f97b09226bba0e36c5bb6f40b5aa27156272de8b8a5a7515b47f875d4529cddd2e476d6100774a43a0ee878690d613d3df1f4b43d3d519dede9781729634076e542be0dbbd96e5a4f238369f84f4ab3008ca493dd47ad21990f7e67e79a8b8787a705378c777779f7d1232e7ebccbbb94c9e5be7f7cc78e1d3bd70639c48744e2dacbe56ab9dab36dc95fd7ebce2663f155cc9ac076c52256319ca5475cce720fc2046b97c45a8c32b9dadbb65d40b34b81b8de4c06c97e5ced4abb4b242ee912894b6291dc0a898bb1a8fa68e9a2962e192fb3fb3006447ac5b8e60911ff193cbb2462bea00a222e91b8a4330b870a11b7e11dd21f2eeb92b3a065512aa7507e43c4a5fb6437444c76c32c69c7e58eb92d275302b6963e2d19181077d960607e43c2c0584cb086b974afda5155313aae86756ac666e025c98c21685cc943375621715d67168ecb2563d3dfaf9ece981235a6a7ef9556d3aac4fce9b8769c7aabd26a7e778a2901ef1e77891c0f7d07ad315d5b1522ae83d60bd4308f6955da3dc764cc08987f4a6c06e638666322981331199ba9391ae621221ae6703206a472c3bc99b14b30255857eedacce8eb70ce07a381972efac1685e5cc329fd015edeb070203de27a812f1f8b09d62f679690f78bacd61af27298e3dcb80d5bb3f6b875d0aca0c34bab92266b18b323a67d47197068a3438fb99c2a38b77bcc6d7898e962aa9898eb888989f964e1e8b8a4aab586406bb21ea91c211c775f34b2a42163aa1d933511f309118fc16f88a05ff4e871005cba7c8fcbada41e3a2c2658f778c8c201c0a5ac5e66e830d3b12874d863d66d98bf5842b86f50c6a210ad4aaa96d1d90ebd896b781d50431a6993ed10ad30b7ce2c2130bf711b0e594360a204f31bbf01d39e308d8ebb37284c1373f7168569e0e56fc030cdcbdde16c5358e40e80d9b860917b8fd9ba90159c3d0e630de9717809a7cc650ebe641d09e1b0a84c911e8f794c0f7aa3c261099139bc943115b386402af3b586c8e86cf37813b7e37c199d6d1d6fe25a67b574cc75401d43190352639ee3d03ad2be8336d9e6412bbcf5671d093d8636d9d6412b3c8edb342873c31a224373acc7e7e0f8ce76e832dc96c9bc0ffc8ec95ac76c5ab0c83d66b62d58d4455770ee192c72cf31170b8bdc4373d160913b8eb95958e47e636e1a2c728799ab068bdc5fe6e6a17d66ddfe7cb2846cef1506c47d8a2b088bdcafbbcc1f2c72972e157cd561bd866a589b09bd4e2d9d312586b0fe5cfab29abdd266dca5c358387ba5d5c436e31e43b4c6ab2d5aafae7ba5cdd498ae31c6baa8c804578d55a406a684ce6a81df7667eb483b7cb38ab4ef15a6e1bbef194c03efbe589812acdd9f55a4e96c8340b769a0c9fa33595bf5d4ac313dcd25529c3bdb4eb099bd1a51cbe5d84c656cf4bec6b4bcaab5247ac415a499a5e482b4b22cbddf5f69353654a4f00c6b77c6343654b46011eb476becba57da9df97034a75d91e11b6834e1dde176ee3bdc2b64afd3b66cd9b2c5f5def5529922eb960db2353e12d75b0bc76acec2d9aff5a803ade5e8764132035c532ca0773a16314b71d58b198669942ca0f71cd34ce51d870a94df3cea6401375fc81471ddeeba519922edeeadd1ba4e76d478d7708419e035eb59c21a472e39843cb42abda07609a27cb62d79c6b325815116786ebc0d0fa1a7e5e3f76ca7495dce5a3d67ba848f77979721da55715679b62ceb36cc559ca073755d8fb3c6c894ca75d0ab580f044410a98a9315a2afcbc7cb1abc6ec3ec2dbbcf274e8646b7b9fd997c9bf69e132fefaa3cb386eca594b761c9f12cc6781b5e8b48bcbc94a0495b6e05e20ad42ad0ab40d33acfd69775295913b8ac33cbc865dd86ad4bf6a41d9f8a82b6ce0d9a6c8d96d4acac21165dc2ed929a1565a6b8aa2675abfdf3f91c7409a2a483da3f674c75764be3cb0fc54d49ff48d6d4d92da366cad80fea8f7bb66c43905e2ca2ed680c8bf8db4e766471bcc310b6681ecd7a8470889620c694a8414612e45edbb7d1ea8408d53a6d8b7b69b4a33a6d4bd36e3c74eda4346f947658ac117c1b766ca138f78dc2347b317ab1d82558ef2d9c5deab805d74661d148aad68ad2ccda432e989999999d73ae8a029d85e3ee5a3bd340b21fd7a3565e9a75a7a5c7aa5f8589710c259c6e5dca3944befa5a44a4255fbda291a2521bb53495540de9848635a24d68d82558f74e585a6eb572db11246b0952c2d2e83a6af87636e16b6fc209b08e97a439842f7dad227c222cbd76366d1adcedc21a79688746bbf3601a77e760daddb5ea82d9584d5858f43e61e9ea5e65ed84863582d99092553c471ce7c4b56216f53699601118b51c42ddb92f65455374087549a5405c3245a8c3c353943a631145ab926e972c21538c696670c6515cb622050441afa0804020c9127c9f1afb43eb823e1fae2a2c2a2c2a2c2a2ca47cd6d1614a05a58a3285a6fa243927416935a1835c3c082445c9b22c5a174a459554ede4a58552551516537604e29705292e2e15944a0aad5b45a9b0a8b0707905c5a592e25245592897cb42b9aa50287e5d4267215755585458545854584819c2940a4a15a5825249a9a25451aa8a6f4d59283536bb5b522c9e52755d29ccaf3c458a2585e6e5d63f93b1c8b25e2aabe20a8b0a8b0a8b0a0bd7200e7aa248c9a297c66a1055c008438c1e32ac304788ab4a95abca55e51244952a608421460f194c03ab0a4a85051753ba98c245174bbd2e060113c3c3c7451516551436ae2982b8162686878f8b2a2c2a29af52058c0bc647854505e5aa12a52b57a9155769353ba5cdb41adb2b2c24ad4b5113ad0ba54a75ed94565355532a2c7ae41c9892f052be77bd5f1b2709b23524e73d5ea2e465f56956d7d375d9b4497eaa2eebd36449e9ef56b5da65fdf3a1966409be83f86381da35bd0281f8c3f2d6db2b196995e06b0cda47032d5ab4f03412cdcae083192e42c6fa4599f31aa39630ba886665689112e3e7947bb43eb17377f19273ce9d197476a1bb974bcee5d25fa4486b74f130518abffe12ef12ab872e09c46e47e25353fac3f5a13b523b7949fac365512531ede4abe9ce1ae2688e94286a9aae183702318cc207319a00cdcae083942c7a71d0ac8c3ef0f49476aca73329bdd03aea97ea53fdb3d3379e7aa1af594372a65346d6b2c12e5147fd0fe8d5acaeab97fd0bb569d5e7d5997504c4fdf2577487bb7abd3e52c34fbfa2f442af8742b4faf5797dbb9886afaedf749733ded05e1ba597eaa03fbab8ea9f5fd451970efa506b5633ceca2a229ba215b6cbf0a334a5590046d73e32fe30458b95de831ed4683f60e9239a95e1072eba4a4b97eccbea5a52461d2fad28bb04dfb5efb011f7b7c6555dd7e9ec6ca23bb45a521a9e71a64b66c4c5caf8839416352bc30f6a58302c62ac4e9fe2fefa253ff1abeb55494cf35deeac21394ceb7e877be3b3cf6bbcdc5d785cfe61ad66d618e9555577a4b65ebd72955603ba0473a6f57a391f66329e615a61fac65d28cc5d7e63329e71a1b56afe1c66bafc65bad01aa24a629afa4541d335d3aa24a62d5a51694aba23354527788e34672f1dbe37895226fbd1ba778d5ead4ab300386996835924f3515b966e5f2db6e85d6a84e1bc60ae5d83aa286a56b48ee202e28a69356ba5cdb45f3131eb872b67faebba56aa5d33f60ad3506f0d8dcdc23415f57689da09479aa865833562c1d82a61547961304d5cea85c134d5db770dea5152240aff70c5b3ba55fc70ed24dd5d148448d575bb5a365823ac2cbac232f8c0235a2b4cc3cad8031bddbe66c4ac9146b7f3f861d9608d8012b5a2ac11758bb8182b5ad418b6d26ab64a9b696c85ad74bb65835d6269dd917a5f77a4ae2875c9d392d61da963947e4d494c6f3cfcb70a45ab5e5a95c474a451aad2ed705a3658235a96ea06cb9816b4b83b68810e4c08728c297d588318b4a08531a67c2135ebd18215e067cb905af8420b47d0c216cb560b51b4c0b3bc3c869631d4906d68a1663d6398d1312c7aad8d2186d48c0c1deca0db186074e33606176494a1468f118437653106948e91a284d3a8eb61a3c70ff113cb6086cf357f8629215db71619db9180ab8ab0f0a4ab8fe698ad9107d350cd8f15d7b01b663ded07729bb9180992cc0ea005c930acd5c85ce0ddbaf5d10d7b6c353219b0fef9e7d6998f668dc715e710d6221c1103b2d6acee43f2a87cf8b89c3c604ca43e3d2aa9aa92aaa7d3e1a23e1da1286351ce55af6e337b372fc9098fd635334c51b556f5be35aef8ae31ef1aa4a808015ccc491f570cf3320dc0c536925ecc4108e7f598381142b6017085648f8b39c943668744e2d2713df9827102f8079003b85e6b6ed9a47b9f3a1aed6640ae1857ccf52273e0b83e92fdc05152ed54edaea4ea26f144b933a4dca789de50b45ecd37ae275f48713a0969ad1ade9d3a7f7aa52e51ea947b0e45238b1c9d9454ddded629a9bad1e86640598d5270d16e18c67505232bc00e31082518610f7410c220d6b86153a86291a893e8094216357cc30bd8a6685c1a04196cb71a48262e6e56061e9cf082c4b51c435703de4f42e2daf35c2622e29a8bb4e64b6cf9ba9e7cd1e2e1ace6eb8b69b6df97d1b8265da232900ad9d736fcd80712f44e6564c7a902188d7e960919ef988645f1ec7b85cbbaa43ff9e2c1fb8815a8568c4b5e4fbe68ae8714b24dc9c8295e4fbee0761623dfc59cfb7131b39aeb629774b51a76f3688d12ad57dfc0ab5d4fbe70314cb3b4c1c7bc2d0c8b1a6d52eb7a59fb187828e1c025aeaf56b3374cbcae5c131a12d7bebcb24b8dd7eb047a95cd96b05eaf4abee258827acd31bdeae8f10a80f77aa604ac1890f697693123da5d268889dadf64cc88f7d04baf11201cddfed9d1ed964cb7573dba5dce35a2522071768df3c77cb7b3029c082208400400003003801e3d443d78f02882878ccc006476ec10c00e1d3a7ce8888909404c8e1c34070e1c13c78d1bbf01034304cccb0b005e5c5c7ab884423c42d7257381403b409f8f8e8f65c5585595a3921287a4a81bd434c14c31be44497291200cc1e66e0cc8be5e425ef3414c09c780acebf64f6b0c486bbec5cc804869726f4b735bbe65ae7d16e2bc8a29f118907db370dea374cbf8c318901db5a37cf18380a82d4821db7b31490ad96657fb0de996895e1da9600a6134eb9942176d80663d52184423713d379d5d4ef3c9d22f203c6441b77e67d7e4dd2d81cc8c786f0ece0aab0a8c3013bd3ff71767e57ecb80bc5727dd24b3e50f63401ea5b2dfb3c48d0bd9da3484049f6b6cc63e71b11e30cc1882178dc788c2145e8e821446a3c0c38d1b185a5c9af5808146c7dc05c1318d9038e4a146460418623411cd7ac0d8a259484271edd92591b82e16310c8bb8d5b8bfef6cb3bedb9b577c71817747af707f57bc332d970ecbd2edec867102ea1e4ab35e0199a687139ed0ecc64d76b3d6f2f4ceebad725ddc1809f01204df27154b8835a1fcc69267dc008b5ef1c5e7577c016f5d56eecc2a324d67160502bd7d0ea239fccf61fb87d6515b93dd70fc0e17719f2894223cc389f4880b4678284912fc369429e2deee9a931d51adad018c28fcd7461ea6b3f77834cc60ade60aeaed2c0192c52c238fe670abb96274f32cc622ba24034f589b69959da2b1cdf0917746eb44af9c2a9db108a6d93af21e69ddce91e8a33b712ba3b5d65a6b8df7fc756c900bffacc95854c553b35ed1d49d25c45dd2ba2d2f2bfcabedf2f0924d2a173cfbb87f2c9c10bd2694df5cf58a7a45032e7a05e304bc5f71dd09e30480ce38016c841d9e2d239f5bf16f52e7393d34dbafc96ee4ab1888ca5b777f35276b4afa14dd3bbbf4bec34320a43245f6d1eaa8931d59cd4169e2623d4eb8d2a0e7da94fe70d59d37eff090f7684e7b93cce237d7622c7a3bfc760f21998fca5a5aeac20b1649d7c17a987046b79aed8dc2c559424c20a3590f13c068239af530e1492f1bad86a370ab380b94286030f30df5c835d4570d356428e0cedf80a350f6663ad36b034f62e0809be950f6269eb5198612058b081d79601a00300d8ec7dc9a2e47e2b28ec40580b98d636e1331b7755816752691b842bf6ec33193b5841593a43d5c53126d467a8d2de550674fc803a88eda05a4c3ba8bcb29eb05f4cf2b24aeb502b270786041c365cac83c5a46289a2359465c680e75eb1635291aba624993eb3b3d0ea2968eeb786519f9d04bd0a82d99f7983a44740e8fb3bea60e11cde3a199439db5cc5d261153c7dc2b3c6ec37f15305824157166e1f8b80df790c1223e4346eb88cb295aa94bd611d02d5a2b45998cfa3a75fdc398a6c7ad4f9691175aa96819f97c0e3ae83a6832962bb35e91e3f2d075eaa2168c8bd54823cb0b734fabe12c3d7a5abaecd1c3e13885e3d4d108f598b5478f2c3d26ab91a5478f34b2a841c4e7d3703c5a38d719d350698f395b47709ca215c7a555c4d93ae2b2a153b4ba5026a3ee71eb722d97cf2d343a7497bb506b8e8ab8e5ac23d42d5a3f4640b452afd6430f5977d6911e445cde8356cb650002b80dcbcbfa35b7e517d65d2688fa8d06c858744906f6fc0cb8ef99b280bf94057b77162cfde27316f01dfdc23ae8ce32e2f2d0e5e7bae8f4cc2ad2e317cda1dee39ff9f900ce2c239fcf2239fea139d473dcdac1daa689265799ec869aac41b35ed1d5c78bf88e59643e07ada39e7f9945e87bd03a6a7a9759471dfa8d59471d80330b27003eceba88530ba7087ac4e5a3081f0310c0642e7c841eb286844201f87600a84c11fa794a398c2c575a7ae52a9d06d79c8787c7053558fca69dfa8ccd5898c63a75d05dce6730cd15492d1c17971015da2c2c9a972ee77459eb087597cfa9d04138d7a12046b31e2878d195b3b404852d5a47b31e28f0b47509ab39ebfc75c92c222eb48edae51fca3ab48e84988cdae5ce32f2b9cbad5977b8e7ad4b6bf29439b90bd059579ed2d2e554cd2cae9a9375b388804e9d813e773973c134146dc23d8569ba9006b0a81e548fcbb5885c7d9d5944aebbd0faa19b06b55ada8c7429d7ca008879da8cc4ba6e2f1b3b160a5765286a4461430a962cc8d0c20a6fc13475d36889795a8d0b78b5b49a18fcc6a9c134d4dd649c804a5198993384f5ffb3450176c3947102ea62b18cb85074b318b1688e75ead49f6006b3885007d1ca64d416adbf0b5d32f64a1a4c730a73e9360d4b4b276236e1de7100cc26dc392ed74aab61282e562c33d870a12ea742b7ee72ea2ecfa1fe592b2c92ce3ca129a959ad53df2101e2625d4116f3b0f199dbc6132e8b8d23d6b70da6f9d026dc1f106bc9c5c201d123ae0fe8f3b1bed610cba2392ea7ce2c232e74afb0483a45eb92c122e9376ec35898e7e5d6b70d3698c6ba7419b2702c7ac4459da23b3cc4c5e5485cd419cab26185a348ae970da6095dfab6c134d7a5330fd3802e5d523d6ecd26dbd6a9a9843af51eb3486beb9fa9e4f36d6adb9a3c4e4d6ec996f9c3839280b1e8e5d4e4fecc6d992901e2da71d6d4af1d3b74e8d0e1f26d971c671df3908513438fb872c4e46039709c594370e0b8f1ed1bb46ec3d01c9783be647c2c232e0f5d5a38a07f5ee876c122e91f0bc7c54d17f0ddad595d5b7799d5b5cb612c1cc60de0e13bfa8471025c1e83dfb85bff58443eb452071d749be632435fc814d9fe7cfb736bd69c1d6ed05dfe62e180ce695897ce5998c6e5d2590dcbc5c271a1475c2ed335b32ceb6b0da1be0dfa36e82e74abb0487a686e182c927ecd158345d241737b58247dab5c6cb0a88d75c255378c96ce505acd4281c26cb49ad5e2ab454bcb464befa20b2fa629d27c2895a885165b303bb755aeba505afa42611aead2370ad7b01e1e1e9e2737d25975ea8e1b509d7ae40640f98d3cf58a1b204fbd5938143de2ba9a59384b2eb06ff48a2b446d467a4c9b91be94b599206d46fa920ab09bb719e93a156037fc0ab09b4abe2621cf6e24777653bdc6b4742927136d467a35ad5497afcc4a4b1b6833d2e3dc9b69b21b9eaccd5496a5a54b7bc0129bddb438dfd7a200bb29419b912ef581d568e96c35f1c48a3623dd4d19ea538692fa70412a639dddc03f2a63519926e02bc06ee033b037ef7bf35e5119ea5486a23214e0bb6760db2b63a36fe2dc1b6635f1c4fd097f2fd11ce6e18447eb8447fb0cf0852fd6f8220face78b34ae663d5f586e8d0644c7b0889d01618e0161548d37f4ba0e5cac670a195dabe6296b687ef2c55e66ca1937170f0f0fcf4d2188e8807a7b20f74b454cc38fe1f33818cdf7f1e3e2a96b4ccc17519acf43c4625a1018483e12179b6114e67af205db3bd9ed21998fcab2747155d6038146b39d8419dd7e01a67177ed49b49a55c2b56e3f45f3c7ee1ffd118469765f1f7554d4a21624b29a911833a00318679803cf0fee70d37eb11ad68613c42803cf126c70258c9bf61856e3802914e14a1308e18431a470d37e56c3009e3f98c18b2f7e10461a6edab374415e82aacb69d61c86f00c9d7b73eed3dd9b7b9b237dbaf417a75397d4b4f2599ab3ace56d6f250bc759389715ad913aa3e652936959ae96d6e93b4dea3b8f4ca768cd910e4edbecaac9e5b8b74f7f96fb2427b8139e32094e1816eddf74d7a85af805c97e5c5cf3243e06bf89f40b7e39fc1d12202e3e6bf7c68d97016127cddfcbe525d07d99114ca4756bc2dd982e13b9b3d76e05cd44ac228ddbb68f24519d06c4b5754e7604b925e1adb1043b3473cc672b846b7bcfccedcc6df771efbe8d1a41b21f9796266491a09ad30ecfe7f677f79d757bb7e67c5678e9529a70ee946b3a5b9e604e6bcb3a525e097e6985390d7ead763873de1ddd1bf6b5288b7314b79d2197b777d9c2615e9edb6b05d48c0b4900835ef0ce39c7be1242f70a2184ec665512c38507df7b8f473f1e5110f023c80f51123e789c470ccc05abb749484610fd3d7e5f7c8fef39f1c1f7dedb4292d6a941ce7d7c652c4e250c08d3028412380104c79c6011fb077eb081267e50c52658c424b003266c760073d95c0b58800f9208e2031e31a120313f7ec4c9ce23062606e652c2b25004b028c64fbf728619bd8c8c05f8107dafde2eb4ce74e11abe16a1a5df7497d063ab817988d61d578416d7ee75c785eed2da8c0bad3baeab87682d420bfcdbd1ae286957dab52bbddf5f577a6955d2aeb8cf20610609334898410288df0bcec8e28c270d827f30b22977c6bf595177d34753edd495d3eede96c06b6af451571bbd5a19fc7ddfd212b42d413244dca50f71973eeac61a73ed53b76588ecd9872c9571bdd701f552466574b6e19bb866d70135a3d4476dc3cf3ac25fea9a6cc3db3499222e07d29cc60cc5bdb9b79c76f71a2d1d50834c999176c76d0a6480589d709a856386359ab519d230a399183d9d0c5ef4f43aea3da3978c6e97c0e8762ecc90455b15634a34d1d92dbda72c1c76b916ce4eacc8f6921df95113e9f194656419fc6419d938c147cbc8fb34af223e9a9d9a70d2913aea485db1a8f736dc187bd5c5ec5eaf6e7ff41d7eaa9d553a03522523ad4ecf3222bd5dc206dd7bebbaa7bee3f6d3eb1ad9b7764d46284719d9ea9a9af9e8e6a4f7968523d13aba1a5be7a3ddace2651dd9b736292ea62add5d3aab35bec480c04f33de519fe0998a8fabc36597e67b3e5aba8ab9604af868646043dc253186b8c72b5e74bcb2855431ae09c241580dd24c54454110d0c5a5b3cd4198466711c0347b11964986cb0b634c6ca6bd2ac0b58b410b073e76c43d568c29c167bd435215631a1da67255ae8e08d326cc8ce3244b02a316402fcd818fe75921114b679b6c4bcf812ea0e1620c596cfbb37024faa4c3f6faa064e138e7de999f94f3beb32d9d8d70b9331d10744b8dc04b15b25d82b523022ffdfdd1bd734490d5f6b2d6485cb0bdd77bc794602d8076975225ad55c4c711577b6c7787d0dd477befbd4fe77cf4e86deb91ecc795c619649861462bd1acc70c29bdb3dd1e57be291d421f1d679dee3ef1e89d98b6bee3faf32a3d8ee149b757d6f20362fd33e59bd4e38cec70fa686855366d472d5364bb9d9ad39226ee55cbc8b38c3c18df2f1919b6680034ebb9d2464b5e98b3b51d52b94404d06fb2dad9cebe277ffc58a2030232eab67077c7f57b9524593de6e292a8f41825ca7cf40f06c45a8a1092d180d1cc8518b2687ea369ac4edd2c2393eff6ccfb7cf09b6c33fde1969120c5f0a4f71c863574aa6023fcddd7fc5eb3223f98a6fd07d3b0e6aa7df025fcfae865ae8ef09f8f9e8eea6c379ab3e733fdc122b66f509092558c2921bdf22e6b09922ccdddd2ceb97fea6cb76d781921eced0ee8763773189521d2806e6f800c91d6b66c5937f47c414bbf73b54bc435a21deea87c48a53fac4584ffe017f21d756d5707db04c97e5cb5bd1dc2e768781e4344039b615d4135365fe8029b817742b872346b2976735c3c905fb0424c4ccc147685556156789a2449527b4fa236adcd48f3de7b0f4a7f523a7c9bce784f921a95f9612312c518e6b996b12b6f099c83cb9d21acaa2a4a575555b5187841ca626909e29ede1b5cdb75b968e6e2dfcc9206356dd113b50545d12c7a8a1b654fa7a8cf344d529ca609bab58e4c6878835375694e674c6e9a558cb762a5598f95303a89663d5678dafa5a3855182ca2c4b062c729e1292ca2b8601125a5f437378b44bdc72eb8aebfa9a4ea69cf6011e5838b2d21dc8b8545ae71c122ea6d0a8b28eab2553bb807570be3315ea1d718ea4c0b16516f586ad3a2a937ea0d0da6a94ebd65611a798aa21807d756c134d3a93bd16a9a6833d4a91a29ba6fa2d5701547b7c274a869d1fb6b5698d582fb4ad7dda29dfbecabe9a409cba39c83d3848635826aae4d589a82d2d319d4736e9ab469c1d2d06859dab8b468587adddf64bbc514a68c836bdbb9ec4506506bbf1cacea8446b57795f45ee30a4acd39e78cc44baeda8b7fce59fbd9090d904e68b0864c8f6f6dc2c234f071b2e96e567b469bd0e8090dbbc41e4ad24d581a3a4992644de855b50ebeedbefa6bad7d3a63977087f455af13967e8ee680dcab17170ad2ba93fb4b65b954a0ea51507659aa1ead21f013d3329db146b857b3dda6c9693d343fa7e63b842e4248dbdf2b9c6891e722f72c96c6d2885fea7b66c985b2af5a5555f054355b1712ad114e2a23ddfdb52e7a9a214b83a551953c5a43da732aaaa501a174d1fccf743c53dda29256d7aec1537f0fe74db392604badb5c3f6090d6b847352b67a2f41f0628b2aedce3460569868d14936198b1cf740d4ee3bd8770ad3b03b77092d1c468fb8e236cf805dd46a2a9e7177ee358976ee7b88ab322bedd8999040134c13a7f8f89e44b30709c2da8ca8199bb11bdbc1c5ee5ec5b932c888c23d5b68a359cf1678bac6e61e2ea8c19888b1c8cd51b35673053ca32f018fd6c858b4bf98865d2cdabd691673cf8d188beb6ab6052270d195f534280cc8de718382ec8216e6a6a92549dac7b7b98fd3f489cabcb3eaf1bdc7bbc3300d6bc7a3dd5f5994bbb9a52630647a3bb4884cd3f4a1d33f67fd61eb1a7715dfbbdcbf66e1401a5bcbada6bd346bd5d2ce21549c006b39b5f6768ab2caa649c66d99fb48b769d2dc866f2311e49e31c68cdd1bbb63ac5d51952cf34898a5f9359827c1cc3a6a98cb97771b7ecc8a2fd262214529baf75a6c97e6cbcb5f609c7c95b3ae3f4b6708ebf821aca5971b30a0bfc0c0806eb42b89e9c7ad3d108cb3e21e8e93ce3d90b3f260e80bad58f4685edecb3bf7cbe5cbcb8415e7e0aa6ffe7d48ef0617f025bed02aca0e818b9ec2c58dc95d34ae32a58a524991a49765a1bc2cade6460ba38571835658545024a9c2e2617968b088efacb4309a18ada785117a85c50bc104e2aa3c84e63b2b2e31340498595dc3bcbcb8b8483870cc978340231c2e6fb35650dac5853a77e95ea41b31dea822add284e97675abb11bb4acc42bb1e2cc609aeb7c778569def9324ad2cb416ed69d767f997579fae555b7502874e932238c740946fa8b2f4aaa7601bdcdea42d399e1aeb088419f1686b302d395a71ca6adbce0e257e762cc46592c609697864307920b6c74214bef199af594318396ae345f3e299905fa6b1289ab9d31d6da23738c6d648f8ff42caa58c4126882453610f0420f567a362b430f545a103d63e042aaa075e3d2db1de8b5cd7dc225bdfdd1137047bac34d25a7d12b7aa71badef4a62babdd75e8bd15938f1ee75d1628ba0f648245216a385a324a6a546ab78d71e9da02a660d915ea32ecdaa2466b27024497e034c23dd51b92e91b8405884f08339631a186a4961d13bfbc379b40ea38a0f9aac06e781d7608345fc6b721bb33db1a4341cd06dd8fafcbd0aaf345fe72be4de2f27c1c4bfbbd62c22149241a115d0843d2ce2bf2e9c149785164c23f3ceba8e9c14a6a9a3d687ab721d2aabd1fcd7851755b80e4c09c66730166634225fe1c776096a5bb66cd9e2e805a2158bdcd9884159b016fdde0e7acd51af8bae307f5db41a510874832ec181398ebb849930313073a2ccda5330aab088fb755188abb29ed66a5edef37ab5a8d5bcd0d7459be1bb48b4c610bd286b3391d60b24fa3829cdb7668de96ad606a5f97262a9ba322c30dd053fb95e17cdbfce34f12d5698ae5192dededd6c7f333eeada5fbb65a489b3565d40baf2793996c056d80ad350b1dece66b4b1850ef83d60e904342b630f535a42e79c8b2caaaaeab1928f52b12e1f7126182a968b55c1aa9a2e61aab5702c77b684b8bf6b7a84b19a2ae89c8b456487c0bb4f55f5693a21af275ab1a86a77d041e72c1c78cbc271d5ddac5854c5ae5c965639b916c3e0925752f5f4a24459d2b194538599ae8e5cbd69a28e528e9a6ec1897ad334dde49e73ce5d7746e2af96e54db45e5c4df1935ba3a58be9ab65e119e9429dfbc72a42b95bd610106c786749611af857593850de810e2725312b8a7bd6e3d0f510addcaea325c5854267d6ab2d4b7f5e615a725cd3b2b41979e98c46a9883becc755da8cbc0ce5f8e76e5ad22978472b117877043ef74727572d6ab2ac213aee688efbf54ac704e3d8683372c73fb45eac85a874a76474dc1a029ff36808cad0ca519a9277998c8d5673c6343b68bd9e0ec7464be81ea2604f4b375f4bb0a51863742d5d1474439eabc8cbb3185aa37c0e5a2ff938ad286b043c35dd6d1a8ee9f29739dd9815a6e56166859197ad82d3244130c618239d1e41b4c8bb844ece2cda2d5955d455b76137d9a36aac3f1a1ffafbfc1509d14f9454e673f8298bae2d4bcbd26a58969605ca97578ed2939c7242b492dff1fe425d260bbd854254d2ca643449a0c9667cfa334dd3df7b4d4b9ba91ca5e525121775e58c6e6756b610576d59fad374cb069325c5ad31bde58169a6dab4749ba638aba606d3cc77f896a5a5c134cec281f0b9774260f182fdb8629886caf4771e8f0b59d8a2591bcdb88085292d9f00d342dc619e85c3fe186390c17a5590f25c4aba44a94ca71e7198a2323d1e5a4a6276a24e626ebe80674b08bc24e342182d227b08cf135e9a35be868fd60a367c8710eef76ce1c0cb65112e630c9f931db916b380c3bafe78fa9da35ceeed3a43b8e3e31f7a9ccc31b8aae3e96addf1b8274c13fabb83721767d5785a94120c4d30d23a0a1df93c863e51107e872d38a7d015ad2b46ea90462357083e1423e39a08e3adca1a023a3c8b15165514a6b1702294168e45cdc9e5f29fcbaaa4c0c7cf2153388edca095db3a0e5ab9af8f45310bc76d98828c696efc73c73530ff7caccf71d022fba1329f4f0fb9b8c4f81843f1908658a8b286e078a439385c5c6a4ccd415943ace7401c9fac98c9e52faf660e0bc704c56819e7bbaef7879a687471f9352b2837667598f97269860eaaa8187a8c54738ff47af50a0a59f448f5eb361c9a75fb62bd56a42ef3bd579f4b095d0ea52363a3eb3a9eebee17b5feb9cbaf229f78976bcab89c7aa8369e7ef17329747d0e7a751dfa640db99ef391d77750af8ea7df5fa6e399cfabc958f4a155c92543a1d0250b27e402dbe5baaec7cb65b28ed56d98ba9c168eccf99c0add9a75a78e78faf36bc6e8f250680e091109b9844274bae62fea9f69455bb3c2628da02aaa8a42c518a5f97878f4693864b02355589421d98feb0651ba890b3025da1923a3ab0bcc2658b437ec925d702961d193d266188645d0da76d321f537eb7c1d6994d26a6415ad4652c633ed5a9a2fb905d7bb132ce2b747c1a21228611a6ad64a8913ada609e9f2034c339def863c54ec82abb22bcdd23fd02c21d1bdbd2f9425ae6b7cfb9b303e5298661c28cbc3223e94abfd02fc81285ba35360d5b28d0104329af570014b17a059196b30a123d350896f7fc316fd663d6e68a3a514d954492959252fa90a894bfab39e4404365f5655ec37a9bcaf65e44d97934a3c3539a96ebe7097961067e4b52be20e2fdfe44bcc943dbea33244b8f94d48306ad6cc2202e16d3807527737dfe1ebd7afbd1b4816c5c5b870258c766732d0e83df3970c61228e29d1fabd7e8c6996f02eb1642737b38ab0754c89d6f60da0485dd2bad145778aa292ee705392e6507f8f34c6e8622c42ed4abefcba655a5945a88ed21a229dd96efc32e5fea6bb941545570a2f16bb4475dee14641b432d77cfe685524524aa6babb8c317e79cf546edd282d2f4d690d01bd5320174143e27338c6e89e8523298aa228aa7a744f3df8cfb43e4db94b4d94f4e263a43227be7a45a558fd5d7eb1a813b4a6e31948ebf4680da19e631da99aa2686522a53cb470648c14f59aa2a46ff55ec759773af65697959c43241159f1f992ce8956a7a46a892e166bc47beff0c1c7dc689df04836100ef6cc87ac1334eb36c89d2d1c2aed7a20aeec418daedecbd00396961dbaac2a79556bd3acad7eadf4ca312b746e77ab7ad6655916959c7b55126319015973a715d7a7ba7e59ef3d5a41d4a2ac22543feb933544b2b5ce2ceb2ce5b270ac37599cd5635a0d1338400f59208bb378d66df84f5a974095a5f47ba4a83ba6281ada53a7a86945ab0972237e27cb50af7e9d8956e3449be1e7780c8db9a3d6975622d6d7fabef3a33bf621297d5dcec91af2dca375a46acb8ac951d51cd394ac21ef39215a173eebd623b5725089bea972b1702e7ac4c53d2d773e6a6e835e83a8c9da55741fa4d5c4e0a035de08d230f485d6ab4171fa675e971174f99507c99856e372265a8d0b75c24aa3564207c1eae29af63d9539d643ff3e047a25533dfeba13adc68a36c3bf24cb92a5791f43af4a62aaebebd01a127a0e88d67dd691aa43b7a2d5389e019d791ac49fe627442b755dd75f2c9cab9a0bbbaa2968d0eb0a1a64cd07fa1e790dfa6b6611912d1fe3a75947dda14b60d4a153bfce5611ea1711ead7a95ff4fa45eb35875cd7dfafd0f5f7f78b4616ad3cb38658af40b19a4a625a52b6c11a112fe3cf36d82558c765292db79a26632e560b9dece873a30a12e639f7d81a7c5549cc1cb11416b9c70fb20dde7432ef2ca5b9a739ca1ae12ebdd6dc7b9b8e6db046b8c3e7621a14f8fcc8346e36d7a2749d8e8cf736f96ec2e6e46b87ee3cdbe3314829d979324fe69185c397cc62ac8e76a574e5bacd923129b7623e9b50867da3f48ad136ece6425923f67062c170461b8545cb4cc3e0b2209801ae9e33b8c88318fd6665e4618b3c44e920cdcac0831a5abaa98a7757dd8e4764472bc658fd5d159158416f5f28bbc4f5aa921e6f9dba68ddb6eeeeac22545b74b15823dc9b35c43abcacaac9c2a92c0ac3a2c62db8deeb55ddba0cabf0a804eb5425ba20079d5368466646180414331400303020128cc52322a92e0c3f14800dabbe54601eaa5110a39442c618620c22000000000080200d003ab6baa0a5e535834c6b6b9aad716cfcde07063a5fe89a8a4a4df13635e8f08d6e066d9c671d60444969fefbf9f1517ae41679bad1fbb3f5a1b60495b40cea5dde7665ee637807fca0d0caf967d080b5db243b9106b0e6f0004eb52a8065ecee1656df7eac020a5e84c18ba90bbed19219490984743702859f5f6c137f211db18f4616b208b6ac613b977abfb02b238a9f2d6b2842c9fc5f71032cff1407fd8e39533f9923700d9b9ae913253c4a1190a2e29b968b32cd63ef3b8081e7455b768f4043f2abab6e39a62d9eebb71784668d486d1866eadedd47c645cc58c0623a14e8b3c8272b2668e072db4e5490b651f6ed0ad4b630c5074c829e437556d91903983db3555087ea8a574d6196b10e98a2359bc0b2a7ff3894827e8fc97604959a0142fc70599dd03158d5c0bb70785f84b10c2b04906b0d8f4722d9b9e4c8e3481f8cc04c0b51939538768f6c99ac1269cf4eb2edfdf03fad8c15031c361616bdf708eb669955a14cf3d2dc44b82bc542d53155704022a74d66572803248e04359f5720ba8e66e6d312405afb78289d282c571b8a2d2a248565150372523c52f213c44641ac6b754526f7a6ca6116d448bac3142ee99d972c681c17c81c8093495f539e275bb78a3e4f69b7d88194568b5b1d00c6d0a338700d34884d51ba11faf0963bc8105bf1ca52ff7507b5b0c03b746e34324fbfe536256de5915c121621da2358d2d0578eeec7f6ee72a2f424230f19567843f58d14aa6c9c1932518e0ac2e687a0516d94dc4c07db818c7c11c681919231a13dd4c3303662397e4c8f95937f2350c4efba9322d5a8a36f6d8edb0eea0b286ac1283204bf991b0ec486f39c97d6d6775ee5a7e718e893f777e10e2945ca01a2ef7de49b8b1469df65375dfb5b33b23e5e42847fa2d90d6e3d8bb203d7e511953c30ec31d70ffa82b10fd1b7e7c3c973f918efad4c9f7f245b2b995109e5aeb735f0c5ee4f79e81cf7a9caa68f3cf14b29231581d74a7d6afcb5bc4947e50ded9850cca6a334a33d7b5b034820baeda4b3e3e30243cbed45a3c2c30de1bc0e9b1f6dc6efbfa54562f1c0cb11d1a62132158dd92091f5defa7622aac5b9f376ee152970c131ce34a2ab3a0e292ccc0ff67046d0bc895f3db8ff9ca01e24620db942b9a8aef8d600cc964b44598069ee81ab74a444d63b39f53029dbfc4a6119182b611dd13258a844c55dbff1d7dfc52fcd317c0fe5405fb6d701a45f15f0eddd680d0021e94b11417358307b2ab6f1305bd42afd1765d2709bd04e1eca818a1c663123795ea73c66bf258c92483bcd15129b7b6e0b037214f6d446395fc4ed55d494da8377f943d145d4c4eec2369edcae0a0838344335004478e795ba63d6712907b8b5aa4f53db403a69468bfb04165e94fb1c209c96031e1a7af21f80d1f8439c54e3e707441c5d36ef60276b2c63e1d7e8a2718caec579719afdda1e9298f9a38680da4640b27e0efb6bc424a73e571203630061a6740fb746404ea50bf4a555acc7de0c13f6cd48089297553222e6ac75481a002bcdbc150bbaa068845045645e990e8404533d6a6b3974d1d07553ec37910592b7b688ba86c02daef1f7c92e9ac97e75a2e50d373ae5527810bfa7a48e3f16c39062f68d28e7a9b6913428abbaa588721ddbc8d9adb5a1b30354501b2b0279b96ece8555bc977941fa3afaa60c6b42f99b576309e76652f1975db5631411b34bf59cb16694649cca560b47acc5d3ed5d1badfcdf3405fc7b08bab561cf319198bad08cb940e3a4c6aa6b82d735c44971b29108cdbef08f3d87d05e7f1a868a200b74ff9230a8baa8a9b3568c8d2fad0206cf7b56be0aa58351878a969c510b3e238534f1fe3164dd4a03be113f5aae7dde034520b00125a5aff739916ca51d99027cbcca5d34c114318acd375909fc7c6d2acf2e3a25e05a8eb53f83de611d537931ac4d3a8a054249f8b6674a70502001dfa42a2b4cc713b03ec05bc3df82ba4fb0c70a74dfca5659e46585bb51948c44518b5cf455675dfa58993878ddad06212a51964a992a198ee94ecdc3f161744705b4df029ec4abee9030d52867efe9247779f301a8099b297b01c46138dae1fd9fa04855fff70660aca1d607de04f82bf3ef089b49acfb6151e6f4ba01982222b965e76916304681a1aeb33e0a528010a39411934ee323c57db7a6a1963e68c02538bb04602fa33b604024dfbbac1580309f367ed538f9801440c703602178971209417c13302a824edd6957fe5fa385d3aa0b5058e62560a1abf356c71664e0c00d6bf050787d60c8ed07e8a05eada1e25cf0f05a271715a02c8512a243813bbaa425aad21e07b46680da45a2521663dfc15ee4e0709dbd248530e3194d4199f22a3fb00f97181781837eb9b153393e22f55db4a24986beb0de3060170ef469fa573b7a213c754d37a97d15700ac555daebecbb918ecffaf870f72cc75914d82e5cec70b0c3aa2cb2ec3060006737613a9a56f928a4d837922aed195145b9690c1b7054142ce60495f33151154d6321adcf190f783c7d2d14cb72933f07392912b2b95aaa280fff7f0a3dd3eafa140fd24576383ae564dd88804ff4924969e772037a1db30414f0e169971486cd10e899fb2d8592c8519232d121a879b237aaa07b081b311b07eedef3a935d9f6cc705083e0ace66631c971c896c809b128283d7f1aac5feefee9b3d7716bc551b97603b0f64af03e0e90b18d560001caf6f28271c8af353388d862b2d85a1606e372c6fc33a5c6e8471fbc0d151e453f655e902a665ff09d1e9310beaff17ca6e54a421311c480cb2e149ddc4fc0cf0065cb56cf53b07711bd388b9b8eee799005502505e7e7d8cfca24354175c5099523e822fa8348aece8b33a248117d7b43f77066cfb5a022a96ed1c37c98e0a60a1f5c22c4399a4e5bf9a0cf0429e6d625569c9860113a428e7666a8158cc9b2aa4c9d490348440340d77345bac3700e85046ba2b3ee283dbae09b49dea5f3961785e40d640bf80726f93ffa5b23d3b3359697f19e38206e3b3480b9128dddb57c1f19989af3f57993a26b7fd978590bc1d9fb1558ffbf1fd8d5b71061a571a9a2dc0799f69849839f7b2bdf23a80de55d3dece31f17c05b1c8b85d36c8b063034c8bcae2a40a7780524655f39af3ee10b85d46238742a475f518178642be84f5b5fc14eae035996a9066e57bf7024bcacfa3a7526ab93487b506d4a51f842132f25198e41212c513003b877d41612f0f823cfbe0b8ae5ef7d5897c0d0aec041d157ca23d747721c64e7f76207327101c4a7ec75c31ae201b7d0599abede4fea68e76521f061ed4e2e2297906502f8f20d439267c29440d1162ff991c0fadd7e13e6305cd94373cf8e7a38e69f511acbf8870ccd26257eb4c1c4d176a10c428dce9a4e086f34f9d0541dbbd4e41add05e9b8bb99364feaca698a3b35c39f03210b97295962540b30914603a04b7161aa722a78cf30b164a402ade73e452eef6e8b62739cad104768579567a954422e9c391639906069a95f8cc6635f6bf0e20ad71902b0a0c45c9f28be282353e896c9c90b5cfc826f30bbbfab017b679f41810c20e50f0d0591033268e65d30e5e94a3ac461e2dc16af6806a8be4e7b5a8bcc6cc722b4fe27289cb15f847f862443682b2e14071644622a87e15632c21c934a118c599659959a792c731fd0573eb756f9bfbbe794f8c35f92a7f8807df6ed96a270d7d734f597b73e853b0a06a84f0a9557cfa7661c55d52906f748b00d9063b835702bc10935b914cb356c1d255bc03ecf2157ab19dec575f23eeb5e8936ed796c00a20ae601f57126e245949f79f7368710f68fc8f3c28f0859a12b6cbd218670b87ff6d3ee83b627508768e0cbfef3a3f792e8ab4ad38f2cd47b8eb434368496d73c29ccc4457c7df4143aeac711660e867aee1bee590bf49eb5fc6a0b31984d6088461765664efa3e1e4a326303736428e6ae3a4a5ee10926f92f54c90aaeb11f32b35e20e8f596259b2c67804c925e2c086abd2d2e077f457a61fe55d671a35ff108760d99b6fe73641fd8340b67b935f283e82f990d9a49a332fe42dcc1c477dfa060305c0f4e6366a6fc3489bb439582f56740eab475b9400075c80c288d46b17f5b97798da0acb89d1bc719f81bf0bc5741d84d59b57654f1ec992dcf8f33202f6dc66e23b39cf1acddab34da207cd59d53451a1b31f8cd2f5c7e5392f8e1ba895fbbf560cc000f945d14cacf090216bd4911f7dd7acca8da20f9102bfd79ebcdfa3b2d884ec443c2a6857e522eee9e867808380658a393db75c3f46af27754df96507ba3f5b1859532bd45c1d5a87153065a84110f109560c30cc473022f0824d86ff50498c692a5210830cf87312ce22b0df585aff2417e0a75cd5eb83e3df98665195b8b7875ad0001629a6edc4b03f18d43edcdb703a57403c4674f0659ae6fdaa0edae2e8664bb7ea3f02a3248252b608353c3e018067950418d0584f131a85307206c800e7f0bc21c3bfebe4423a82ce9d48759511b7f83781aa0a2a81c377c8201b86dc8184700cfd6c8dd180c57dc3778f7f1f40ee5dedae5282cc551788beb1a888512f206e4a6b4ccc265f2d0aa3d019f317786b881a34d528e735ff392cad513f279e4689a9971fab11affc40546546cb569feacfe135a99cca5374dd235b1bb86277f9f9c727e25948fa264db8600d4e7d2dffbef36ee4aed4b750e2f1d75c40febd2f4ffff4b3af1ef580649dc871d5c6d54ef5f668c923a86b4f9c2050e411ec20c0137776297f5d03296b855ecc298cb114b2c9f97df35c90db349721274944fdd5fcd9d2471f69f358b6b0268cb3738e73fe658093a3231635c8e92cc946088f182a2a0af90be95c33eea2b044845201b2784cd279b0b9c8a4b7be3609d7b69e70b9f70cba54cc671a50000f252f0e183c6e616e9ce17e292a5f700fc072e459eafa20894742f5681771a5be1b4bd930114e19b35538f77360d2b33365360b4ca2830acd233b4fee7450723a2a51cf5199da2525e9906a36324e9fc4afe73f24dc55736fcbfe590eb47d8f3cba060ace91a8a66b3b08cc6fe85ccaf6052ea7c415f7ae09feaa181cde0671fc037aab3ff86ae9450d88d0a4e69704402ffabd57509316e4d50a86ffc75dd16c9115f791b6a3f093da00d06d49bccb46688cf5f5a14bca966a02611c538bc031e60f9f7ac447077f0f4414841ea4f68248e942faf32514757a88966095d0cc48abbf6d689d6325b0f0b99c9211e90e22609b758fbf328a963afa589c1b220468f8f412719eff2b2510b72608c01cc8166d74933493d40da3db8609fc4bf5aa043a64eccbd4478214e3278037902ba78df804fad61ea80911692a1a103d2ffee96efd91c585e2cee37e4ec480531fecc0633b7780588038f286ce32f46211314b316bc4f63d4a8c4a1d46b5454b5e8f808e735a3554a3f037b9a77a8bb9a9fa311bd8aa2d0ed174a3168f1e527a8a0b15527a8ecc78a037670365ae44a9a93f127eebff9b562b2e335bc2d933ed743cc7881aecba088dbb1a97d48b3cae09b64b07b88112a65e8841fea3d5c1dd1da8af8c6de39a751fc21d1bfc3fb181aeccf348823f91376e81ca54d3985c261bbc17c5e58f8a5824d24c8b9b45712364332731066d3df20bfa9280ce1467c114fef9d118e04705b5bb339e2115e4a2bb3efee6ace984f0417cc71d456c444facf637fe8ab6adafa6190530d310e94d9806f1c355e62548882d508f7fa3f6c40ed5428e9cfa40fda8f4f64a27e6041fe97e0398fb0190616878962047c38a2ec949c4fde44d7ab56550072f4cc2c1775ccf4d7124ffed1b2c290280e3637af6487df3e47ebe27175703d615bdbd65c1bfe5a7c679826e7ce832f1c6ddb87663d9d090bfcda144c95e8ae31a6261d93dc1ea55cfab5647826553226aa2a1c293788c5be3ad691fe4a21212ed52a1f8a7106fac5b07d4f31f99992f76e4beb55ed93601597c38c8bfb8c22df9cc8bee18aa4fd509a0d9aadd57377208ef6d1d96a1a560912eb50c000c658fc6ed03a66e2e4440dcd683c700b72a7cc670f25e4b5ee7625e7b0967ca538dcf0e221e1d16dde39e4115fee24e9a8fe422ce7aba7935f09e82d7366143bdf28b7b422d202741e04ddc8a435502362f8e136c67f10b9bc56855eadf94df0ab3588ea09703c40d2c35244b779bbc883948097b1695e614360c298a3260ace84be2b981567fd79f1605711859f3fab8d604b079ec2db7674c9a9b8a19951f6537042f5853a8d3329c5c028d853f4f133635a33c3c2a961a4572afe196935c7d8809a932a50230d36366d557da853b5f09eaea86cac3306f9fa0ab819c061787eae9e10b57f0a7f5255842316230db0afc1171d87fb465c120c9224f7c28814945d73618a3d7baa981b6ed08debd925046ee769c9ea4193bef06733371b23e0cdc9e78912e57883f55684048b51b9525e65bd611bb43c0c72b8fe995553aa084cc3f90b8ddea31ed8111a55ad27cacdae12adb75c8104e48a6b34c0a63ee286da19200a74e25224c9a0763e493b97b9c5cdbf685154afe1144fac5f78e040f28cfe355bf78086620b1df043c1821f4d3ae2dc483ed53bf3db014fbb4c6b1734b81dd7774c3642cd4121056ffec40314936832c15ac74de3f114f6e46de132241765f7f851e2319e57a254b6fb279b2558d738d8918bf4dc736c5c156d1eac70c981d2e4ef6849aeca996a116dd1cacf2cb1ba5ce2721047df919ccb5c4665409147399c7c996bf8a6e09605d9d44834b6ab69fca4634e8295ebbb28ded9ca0ce41f3abb8419df3f049fcd787c05afffd021ed3fc5c8140a09e1605c601860541ca61c0304a1ddc65a8c1a55a6198985a5b4e923abe38db367425acdcc2799ed320c07bd0f9cf34fd56af5b94d7431a30ae62e97d9fcaa654961216a94ccb2ceaa0a886003ca3f047853fa20da6ae08fadc295d28d287997c40cad8b91cf06e03d7af190a289ff7e3253edc725194589cc90ef909e75c435079efbf4b9c82817ac0a5ac8d0267c0073bf0924f9e634f2a5f0fdeb404fceaef51ce50e7820e3594fc0a8674a3c1b3808a594cc83b8da54e0bb1bf5018ad6e9b93ae431b07c8819664ac44c5b222bb8187d235df16697a2121f13763107594113057285e56a45273bb3458ce072d9e534de4c60458427d125dcaac1871ad4dac88d03d40332ffbeb441f2b492bda5e140dbcdf8ebac1da9fabac6ace089fea1068f78c6e350a9560b973e157a8d2b024a98db320cfc1225c44712b93555a59cac1a5c95a51191ee34a5427422324eefb84add7e3a2399e534971b61964674375225a9cacd5db500d4ace075124e2115f1b7a2e9e414248967d1169ae56079c7cf3500a6429d8cc79b0d52e387611f70183a5b87af9c1c5856ac0ec196fc1668b877e03e6260d5dcd146b85307ae569c30476de5c5060b29d86290518c6e11e9de0f8dcc28444300c3a55648fff8e4ec8f2758a8dd103c2b67d3fda083e8702e25bd5849be521a7bd1ead3cd3f9b94ec388f70e04c7f3b400a499ac7de0cf59fab1cf5728c12c4b13c9321783105168a3afb683393699142260e1a7ff5f28e093a61c87c8dd26bfe9c28511eb63b8192c2ddc87e7681a835da8fde8b4d88478b026b4d44965d80184a11ad54397625092895ac11d1189901626fa7bc93c68b0a48b04a6b575e48e6be6880f02b52b1c173e21048d388e7ae248156f2b31061e3112e9f8c1cd74dc24308f49c5278ca0c7f312761804c6c94f1c442fae046c56f4d484c052c203983d409772eb83916d951925b55b9aaae5cae41818bc917538c3e1aed108f95158f01c3d99f3191e2477befaa8c85b0a0fcc2b0764dfa998ad629fdd664414198adca6e66c1191581650e372c305cd01d20576c2e32305b350c7e220937871300424a886bbd218ea28690846c0f011ed1f4fe18d55de72796fcb48d53474b7705909e1a40dc40bfde8259d518e1e84285b7681947d68239b0527a77c47d4bb290b15ebe96aac559a3d8aec548cc4be2c808b4e2a52ebe90f1d12cb93d86f54604067f594a79cf2061faf9c648ca8dcea9c2ad04e7607ba29c57790d0c49ce6177608a243d241bc8827e94f7828595a5a88f95ed23820b9c777e036d499d497983bda47780a725f0504d232647e082873c2fbbdab399c0bd823e0ee8a9ce27ac4000f90ae8b5c2f7530667023f21d386aba8e372c14e9203a222ec5aa16fe0bf70728d9f411e074f45abca40651d18b8896baf4ff755a13b0d6f205b38fd169970d46756053e3f4946b5638d4476db13ec938f4b978a068391c568071990a2521c7e272b13c23447d6236c26d6fc87607ed6557be4235a2264f9ca3304014a7cba26b6cc668f6f3e3ca83032ca600474f030b8b0af24ba1fb048c1dc5586fc39bacd7993502c0fff770ceabe7ce649f1d390b94a63cdfbeaa3a86149aeb98a58a8393e610aab049f1063793a4aa6123aec53b6631d3ab6871165abb6af8c08b79e7000fc805f90b701093ea749c54efef40e19f817436af7ef5e7e87d25db8201058f4a648122cb532dde39f4e7c3e249fa8c4495446ac126633edad53464d30c38bbb0c4cde84c02bd8db30f69a6af2d9863b6a521e0240ec1b4e98a84f9ac0ec43322a7a73937694f0833234979477645cf783ac15855428ca793150bcbe4acf8ecc7cc4973ea2145150462fea572455b98d794a08047a48dab80984265de717523ed4cb43baa4d80144e9918ebd7d1658431e2a0a0c9daaff0af19e05513ed566a2049cb2ba548517ae574255d6573d7565f1e9aabb466110d95ce7688476132e2a9e9ff0102c5a1def36c10967ec860685bf3d70749a99dd38862ebffddc1382b0870c09205ca4ed7c51901207d5be2e36de00cf7b395f3f9a4308c91e0c6116723a44a03bd71cd75a1503e4448f483b3915f70dd7109db662c5fa86cce013516098bf071a620ea807e0601a2a1d290e2a224bf9f17ab3fa70510c4d7e610968918fe1ffc7f0bbfd66704182edfcfeec73615bb17d4e146c7422b661dbf74f4e84514833d6edc849144bf0fdd1d84d3f791d1a39b051c2d490474f81a4ded0a580e499c6e20f303a6479e3284c1378659d7fbdc6cf8bb8d789993a8ee6cab13a7c901b871110c40bcc1a7a8081311f16b657f77a393c2e9c8b498599c41d1521ceb85474a7958f4975415cbb24518d1ac41c2f11838641c642cd4fd28feebd03e05d7fbadef8483e0102a6d05ad5691bfc2586a657355334a3616c1882afd5b17a6d59271da59771af6bffb7022765c86f8e0e46af0ed36a167c6a2ff33b5b968dc24932bddf9bb318afacc9a27ffcd14b0b5c1f8b771e42cb69eb46574b630e15f86d296948e8245926a1320b34e0997484a34d311ddc2bf8493a7e68e549825c6282e642d0818e330a7973fdac5d5688454bfdaf954ca11de93b403584e54397b312af202d8704165d5df0e35e076deafc9ca90b701f80608d538528f9d6a735398e0d3d9df202870381448b8d179ee48010ec686d60f571a41c044d3205080480304f4dc79a33090e415a8e5b8dcd0bdce8a95fb20fae8b3a34d765aaaba1dec83dd8abd02785c993c4bfa6f26f854c647effca4f38e85becee83420485279dfe267ee95e9817d3670a76fac02610296bf07b6e45c5c8c853fcefa8e0274861b411cd41040d8ef9235466225456abbde083f96ff49116e36b134827892123c66146b14cdd29c010d9c63e0b956b7a14ba35f49a16f3698a1a383eaf55608cd77ae04c1359ddca3538414fb261ab2b134abefe8dfc47d962c1c92e89dfd428021b648aa33b0e90cbef23a0a8346a82a65bf8ae11d88a622e90009ce5d79aa4026109e93c7209b596434b965362a62755533f4deb237b5338e817e6abb77c287fc34de66a265fbc4805ab3c47c46f88893c44ac2672183d9e0a440228e3df3e2516abf7a0a218bd81f68f36b957ae168de28434ac290c4424794721eb1f6a4c52bb25b7ee67f03af4c4904d3981400d4b76af71d0a949212f67e21e782ee5c5eac2fdc64d9661e91abe1c417f15b4ae84ed216dc54cc88fa6bf860683996e6bc9ab1d6c578e4296a439105023a7c3831848f899d686a9bd4dc3911e0ed49bfe4b4068fb1a3e49d3c2cd80c3655d264c1964b60877135f4bce3a0e7993d0ee72b58be4b543d4c67839e88822180c5447f3d1762ebe85cea320cbc17c7e1f5e6742ac9444563fdf6fa8619f08cf89f21fe75e9e7a47f8c10319c60d06ca62a5a2e02c9c44f8ede1c37a238baf4f752c66e6d1d4f7bd8ffe0178d58ec003f04e1c9cf67c7957756eddc44522259715883ceee8d42b5f497abeab3d4adfc79588380226bf7a1a4382c041fb914904dd5cdf7355499f103b641dc717ad9535dcdc2f9af12a2d745a6da4dec5137d8b72a888c19a26d18a1b3faa7c4266002a22d23ac979bad4e17496092914cf210b44fd72bd98302f1bc9e0827ed5331b2860a46f9372bfb2443cd673b9e6491eb902ef601e689666eb42b66ad6f0b824ae446da3acd805c209e7cc9f0c1f47cf9aa0c765e402b94cb042e67a671184d101837c8e95b0077ac969fe7c722c28377cc16c9f12739f2ad1cf692e3ef36ce3551179c7284d34e23c85d466411b790b65f0c29097f5c1d4f6ff253e76e0484dc8ad88fbb3dd6233f2c5ec358f73f2025c3471150c9b32de367a5a1a45d6cb1a9dc23316ff6fa54ac504a8e20f9511bdc05253b7b0dc79011dad7a45fefcaa4223d35caa42890e7725c1b16995645068969cfff18ddb059c6a01e8e662dc55e4860e5631b496c7fb3da582f21d6708331b67bdd057378c5b7f592500d242b7a691e7478bd3829ea55f9e91030aad52c1e99153947ed46484141e67d40b0a5259d2aed26d69e5e53dbfca32da52cc29682647075c9f26c2db9de19ca8c52eb38e5e312ecd75553063eba3253704cbdcd2a83b48db692b8503caba3d6c8ef34c337bd39b2f7890a91c6ccad97e23189a9295f1e19be21fda3e537e09e512fe15280b460797b2a5abd878661c959ea60ffab7adc0c12ab4f3e70ab72f8100c50b8ae6623a66334e5cb0395e3447e94307078b53247dccfebc52a82a8506912b0ed42aafeb478362e65a4c7b69e93645a4d407d4d5011fc82d3955d1c7b59aaa218371ae3b0e039d2e5811b0fdbad47ac564a5ba7ae2012f26bc9f2180bec2b51dfbee94a5c631d98887df15b9e23c4098a5e68c80d5838a458a602508368e9818118de9bd1482d4042852e5210afff8fb2469f7b062672fbfd109cc9efad6d0acb8a12f394e15752398091363ce116ee4fb3c08f36861ca51a7908f158402af1b3437068cae750a76426bfc02f0b2df377f1386672af267b7d265083d1565ee964e05493e066c65adf82234857e8b2e120c5d6c685b2859ab8eb1d84d4b37da5c54fb339509dcfbb404013c7f2b8204777af641d38167d2c116fcb850fd8d4338a85b08412c638e5b8e7db4c4ca979c083836a88c1b001690fe0672c202c26937540d0cd977e293ff932ee0890da563227092519c885cac98d49fa5d397ec81bb85f659586953f766b5716bcdadd94c334e4423a6eac50da7fb1ff6e0f5b4c0fb0770d01c79744c35406d8472cef86803ee487cda278b2890fbf5e4756791fe1b4b5c2af3d84571c81ecd1bdada509758db3540a18a648918898396fa813138427c1bb84bdb2e368437acefaa7808b26788f789f08ee147bd00f24fe2d379384d75fb64391bdd06fd4d81853ca3ec8baf8dc48b7ee05ecd91744d5096bf9bd219751b16526c63649089368c61ae90ebff4e27f5a21a61c24d8efef845fe213962f2ab7da81b628344d08be4d656948a777a0ceb3fd8f19123f1345eba39d0843a9eef57e01a9dc2085556f0f5f40952f8cee8a93488aedba50625a29e5b43f0989e8b56d57dfeff2178c7e23b366ae9f568bae6b51b140dbbd199e82cbad0f7f8e41ef3b72423bb4c9461cc0634935e201fb54b6426b6b10e00a71cd099e32579e074bd2335a7a41f593c3536ce85da54b8fa83de1b2ccb118354db9d59b7e42fdd721f3048a340503e2baa19661bd120eebfdb135525e801d1b23560de9b56c6e83d1cbc65f8220b79fe7ffda1d4165c950cbeb011244aed65297f7b4037406928627717e9dac2ea902cbe6a2fdbe0340489baed9016b35c7cb3d59a739a4f268731e287cf2a7d412d87afd84ed3fdc32bbee742830b4229e7cfd19ecc48d0fb898f44d672c03208a5b46e0acd7802b40cc7a0896e18d062cf4ecb241aec507cf47c58f4a1386d6d5b1cfda2595b324ecbcb13da791edcc163a37821dc583bc72aad75f276f8a85c0d322eddd44fbca4f430cb87a6b46885a1d32894ac759e815f9ce52f7a49922e6796ebde125d75907c50162afc78aba64287720b9d51e88d526455d26e293a797aa10ff5c394cf390703109944feae050ecb6e6528da6e12f45e0b7012ad60a538920d4ea639332b03ca87dbfd0b3e493a03ed95d62c34dc88becee393e1eb07da3ab55050a2134877020aa88328c4c177040f10c9ad681a82568f7ea46902ee9fc9ae84bf60934b4d91e8a45fd1c94f14bca4a61958850028f133753110c79a119430db9eff3f7cb4351c1e7e63cff26fbd0481f098ae4f38568ffb6cb2302cd9b0e4addf5230a40fcbf44e9fb14fd3a73ef11e7ba55f411fff9936045c3e9155e722108886114cd226e3393718972324f593f8e879ccbc4594ddd49e96849b73d400d9efa830e56c4d4a9b2f365648129bc35f53e51641e339b1e40322f458ed29c486cd38bad9c6f6a0fb9f2882728faf684652cfdb668c9ee7b643a9c619edf00a9babfbf2ab0cc69201dbd5d697330f6dff260c80169c4d7bb5c55b19dfe6cb2459a48835754d01db92fa71b23a18346da13292d256a6a6fbd16a821f7eeabfd588e6ab0c66f5a26119c5a6d79d869e037f983712d2ea5e1eca5672d592f59fd060be8e1792afbb7c18a02a94ff95ed0d55403080c4705566e3888ac78f0e091db6aaa426a40454cc9a25cbf63d95dd2066b8cb94985d96856349c1ad8fba41334e385e8dc1e28a51d786974677a56c8bd218506c5ccd21ae6c2caec7760a364d41278960a14d933e19fb587fd0c66986cb9d23f4bf20ab75962b9f5a480af3dd9b758d6b2deb847650869db5a9abafc1f80202870c66c3e303f525e35651d572f4873091d44a9d594ecd753ea16184ab5b983bdc59d225ad929ce1e27ebfdf9e93d9bc628faa065b00d673cb9f568fda63ae48c4bc4b0e5a5212e943501291e01d7198205d4ecfe814dcf9bc39b645d89f906c23fa344d6e65db1790c3432a87cf15400e02582e628e3f85c2c12953f64d193e6f1a0f207789ad7058b5ee92f7f976007a2fc4f17c1baddfa8d35f12f1fbc375dd6d04d1ef9756a0ac1be11b039e157d3db770cb92bd068260a56b651e57b77b3c940a193d69c180f732605bbd3fc19c2b8ae84c2824d36b49903c3648c4890e01f9813b1ecb8c606cefb191c6dc5df642b26a22c2ec8ce3449ec83a5d5298217d0b8c80195257fd03ac1c435233b00f01f3d0b9da7bf37852e1cd4052c6aaf1a6e259fa4ffa4edda121a918665e04be1caa101e7e9d0afded2b27c9a68d4bb9a4220af302a22e805d2d76f6ee185ebd4f02ed0e4b8ef997b4e944c38b027f822db1c456c353d3e80ed988d6c9e393aade422744ef70f1ac7d130e3a1f14dac35341531dab95e1eaf5582e771479db6307a8633f19e7ef3c67d4eac081e458766686c52352587f460ee6f3101da38a30aed2f70f241449a321b664d657b8bffb1e28d458c6ea1c1263f6f28967ebf78cc59372be4e161a60e773cd3da65f0b51f0622faa9e34084b3257b124aaf295a926e97d8b3d96ffcbe3257c1cb16d09c491aa8d6f7ae683f8f9f9188bce0645c9c619184823d567573ef0ede9c569a354048cd56990e222284e75c7432030697c3c17a3cfc1034bed7e61830876a6b5085d6e23b05d752a4cb5af4f89b12e017d0e5434923d31b5ae5b181db9d0f909118050b2964a4ac8302c4b8343f1b2fff70cac6a7edae11e427e30c65657cc5f281d9cad1593a9d58a1cca1774e2b8df5e47f46a7bfda1fc9a200c658da881549aa4b6e56c108a1c6c3533ba514d83068f4b1a1242a30921f853592442b32c3ae96a7e146e3f6f54075bc11baf6f228b7d4102a7e9dc0d4e762f98abf911a10c0f662268a0df04828e93c6b503a93db1422019908349df4d779b8b370da930290d11481adae9b9a5b512437265b8dfabccd7a0342f259a10b0e6075f83f5493949359e25255408ac9772424a9be11c4772a836242a4c8866ca6a31fadfe07921ed0d3f08f0dd0683a176261ca0debc82d400f21cd11ca0369005f9cddbcf361623f25a23b3a821604e4a7f86e34bf0f3d1b34504761dc3ba6ec4ce4cb10aac8f8852d6513a49b2ac0808710fedb2aa09eb26ffb9034b4a4088348147bdc7271093f2019ebcf79f2a1cd0845a23b2cf0d41d8435d3383857cf4e0c9b23d02f47ab061bf174dbda3f9dc3de4b69f748420b48ed2289c1f124188a431a72d3a3e83c4c22506013a4a006a92934574b3cad9b92b00bd75f21ee6365c8a89512e3ea59b350dac37bcc0e5d73e6f748e25c0838113345c34aa538c7dca16248996f7835a401f5009ba50cee912b5654efb9b98fc32f8521a9786d214a38161996ec1333735e3839a2c9e1c1ee50940a8ae9ca43f64a565c7a269ca28b4f9bd9932a7136ad13dbd41de9c646b3458f6f2ec3d371cc02565373e4dc61321d6ef2c392ee49a587088064f60252606565776f89bf4321058b8d9077283c2f30e8064026984d1988c10744f3604a07cddfd202fde0e617096c11502a4f2f98ffe873c354f793173f4c28a3723bf865eb9940d91336d8eb04ae7cf258476a46077efd862150f79541d457908603245b8397cecfb5d01c6a2ec523c95e4126490baf7099eb7aa91a043e60abcbee8fc3e86ed51297ae2a002816538a97e9daebd05aa50d420164b235041b7d3e1d03c1c6abe4d0ca656b3e841fbcbfd8d67b50761d0c70eb42e66976c042ab27cd899ab92f96a3c2edb616231c428d80d838e79c5e094645c4c8ef82548df49d52e1602432fb1b4434cf6aaca899253f6276e33e2c70b474e1099cb5c2ea7a676fe34d82e8256e5599bdcf17a43737a53f18cb5d235ca89a304d012dd1ef519e87cafa23d1ed059bd9c99638e454e94c388fdd9e784f6d13858c466fef806888ab4a615aa85e2d38c4238a4f400d3a438b75b615580f13abacb21af98a3b8759ef4bafdfe7f84be411b5126596a2df98434e15e1488e115cbb49e1b01fbad261ff3f1af45e5020bcbcbf75880bdfdf78b2d8f0ada40c5871549bfd8a5359183ba4a86c6470a18acb2d5e8640fec2df26bbb5bd3d545813d7eab71f2648a86ce0e98a5355a7ce673bf5481d8d690e99c690d90169f819223c776ec11e65f1cbb56f39cb6d69849187c31b7f81b9335c0dbba19cfe3051b0de533f63aa74ebb0836c89890272173f72e264197d92ad14f736b2ce10036703378f3d1c7b19ea0f13f8e3dbc929253979bb7cc096cdc4778001d3b681759a5a8aa00957ab40ce5850c28e15826a0730d6e2d4309aa808d9b6c09210dcac2763993232bd04aee4fd8d9b693ede806c73d20b66300d5d5111c77da6356a49583000aad5ce7cc53313a44791d9d52cf76fbda7adfc5b79d64b6601beb141a3ebe892ca7c061b1d13b201707b22e5c2c73049f114143e0ca066ce459425c8e55fe8070f7e9423e39aa4221fed7e3ab842377582e35c800feda2616953bebde699bfff14f6d723c411764a33921d410e154f0262025f8fa9fb500ce665aef258a779a7acee64b062dee7ac8a41cc4e6afa32abd970f445e6f2d662c055b3bebfca896c9257a8b5e185a10f746a4c3ce42fd88c22972cc813ec643936073a85a593a9299917f798132ca1655fec14bc7b291c10faa5c16bfcecd4618f2ca99b079767b8dc2b68fd2bc8133e4495cd866e92b1d12b34977a8ffdb15f044a9af8b39886f5f61b0cce326ce1e12d488c990b347421d727704d028fd0f85431f657f3e7195b2adfd6d3d19fa00809fb9273a28457582598ac63739758de254ac396179b4a79409ed05ff7f708206cb949184fe5693f8e13488f677ddb4f116816bdf7a8d1d1933d1d43b72a1835b1956f1cc3c955590c6a2ec8fa9d41ae62941445a2acf355e4916dce1ca4d2c8ecd550c3cb08f0456ca42cfe475d22540cbbb73a0677af060aa46319c10ab195108489c379eaf05507c1567745e8d88176c38444a2ad3559a006200c16b7627ab2fc91f00b36fa1f5670f5ed034a8f2698c83415e1f8472ef91e46b9c883964cc23283478b74b343c33b58fa3764a484a6cd9d5f25b1c6cc92067e3cd98f5052ebfead4420023cc537a0838bcee963b15e662fcbf58ce77050d8038cd70bdaf15b4017839b598e8ddf3e694dcabaebc7aefb5ad1c339871bf24f303c469df624b08161ae7847abdfc680724d3241fa8d8d5bb66b1a2060e646ab395b5151920a86fe711416fa26dd7a2b0ef3d30d44cd64ac224ffd8168a6404c8a62010d72db085b14f697adc1dd983e7e50bcc3997b5e5911db7dc9ef02b0dca730ded07bc13fd1a6caccd9037c727a94265a6ad520550b2c7dcdbb9b42140fbf90cb09880160b5ff49062b605aeaaad6f9e35e043770f8c0085149931bd5cb81db15408a51f4b0e0fa403fe6f8150a5e82fc59433495f5bcc7a1bd00d3872613634dc94255cf514b506d5ce16a002c16b2529edd38ad571f402e23873a72456ab1e8536f08943600b20a3a7fd06fab9bb935d2e7ecb97cc87657921ce05e46e4a492649c41065a2fde09799cf415de87395c9f29a4160d6300734af5c8d2b3bb895c5dbf38177625205d974b7ac89142e334f8699085d8e5866d1b5f833854a088c6b8a88c602c4bf83a1b8aeb197eb61360d9d61a6598980aab604f961820bec3fde292b583ac9b882c2b7063a5929188c97e43aa089df61f68a2cd28a0d3716eedf4192697b82a5ca2e20f32e2502f812aef71708605a7dd0c6dbabca8ce38e879115129f350abe1cb798003c4e14ad719bd1cfe1e5fe32341cf66019c36fa913d6291de2e5cf57ee9f51b4ad8cca82f6ba03a9492b7aa1303fb8fda7aa57bcc33c4226f3659f7bb5c022ef799c33a9a85695032b3e50bf1afa60d8254a0138b7c899cb84ab521062ad2aa12ad0fdda4404e6a7a0a7a1c8dcfff9fb6822038c706523a13a20be5989cd538cc28774e96024e7aa1f3303970e7431f89df2d12c65d81c9d0ac6076a40f1fed18ef2c87ba0fa50f29bbece18dcdf9809afe2d470777461cc2310b90d9af0d97f6efdd3fe1ffb605a89cc8177125d2cf4ccdb272af0fd6f82dc33cebfb4699936f1c79fdd4f7df5ad48847b86093e5099aaa0bbeeaa25df07a3cbd35b7aab05672e6fe147b54483d42a4e3f13f391b8a13d13875cd3e212fda3fa34b1eef550c88eb14b293be0814c8bd509e85c988d11214edc1a871cd72a953e8030b36cc2e9ee912485bb239388a2f08cd4b90e5d415c77ce56b1a24a3e5718ecb841fe3df61ee6414c2438116dbabc9b969edf7c282280223e77a89adf088423813a55f29d6030d35273e313d0a6b4874a34a5c05b00143a5537f85b483eaee807fa20c665fe07829b99fce4163d8f7de7752288aebfeff16fde30260689fbeb3310a083e238fab8800015e8689e1bd6cfc9d7508f9727ee8c86e1c134c78837e57d5e5d79f1749a19419777364c8c5c1f533ba8fda936bc31debb2ef6a2925a6644129061e844d4de2f54f1d9c156d3bed0cae791ed83cb9290eac8c3e4a4d2124412938b3408dc7c4629356ad4cf9181bea14007642f812af1dfc4affb76cfa0d3af9bed226185996d7488336e32bc8dd434e5e8198334bf6334a3c66c9f1a2f3f1a48578afad478ae31f2f7371375c8ebb724c6a9b5287499236673b671ddba8d8f6f5e78cdcf65e622bfd55f87c2cd4c70605fcb08527af03ca867df13aacde164fd8d75928ee94bdf6c2e6252eca70ed0cd3486421784a5a954ce4bbe73d5c3d1b00efb92a7daf113415674b8c57d72b5ad1b2b2e83ced6c9612b6704bfc1cf937ea535c98c5671e349837820f701e1700fbfaeb46b379a4b4efaadfc81e48e6bb191893cdb9a0c503747333608eb16089ec84009356d0b169137889c42cf644af601490d0aa5b192e89a6f8dc13200afbca951243defba4ad9591a321a31fd141be0d1770a2e53a811e641635d9faa1a91a64ac30e1daed402284c508c383c6d8ef96e5b0488431ece6895c552944b042d22c38a3072607dee927172adede646bca38f93459dbc80c8632dabbfadff95f08680550360645711bfc5cf1a80f963ccc8f7baa8532236af17eebbcb1d0403be20f84f7a26a0dc5fab3e9366f70bcce2f3e59e320ea5ef6aade21b32133c58d49b3f9f6d5aa92981ad0f4a615a91dde391b74be62ab8709bddcb8eea978781ca7e5e60cd233c7cae1478c9597f118ca788c1cf12eea47ca5d026558ffb4c46b23f6da1729d978bb023ff0dc21b09d3cdc864ad0b09b23b855f43bd4a94fa4a16b4c86f38a552d0ea3a8fcedaec3c655b2d4b6f14142dee543736cf217880eeb7cccdb807e0c2c110f6f2c5f729d135144da78cbd19fe604a88fd094208e450d9ab4f63432530c8d7b8d478c9dad91d3ca7df0800b42c82d567ec6c0e54292e80872e5fa2e4724da9d57725dc63ae1e391e018cbcf35e0fba57490824bfa258c4e4736dd9f3e3335299b60faaadc6964885bf51ffcb94ebec584859fca5d8f56f5040655b7dd04ee753f9c0368b4268ed4a1577869f213920b027c5524538e6f8db7c33547a480b4032f84d1c35c881e3d15e6233d544df824af0e84c3dccd31b2abe924e175369fd5034b304974415d5f55bbfbc8a82a9c22d5e47380c7e7e5daee3c4b0c810278157c6db33b00191b1c72b1a21cc3e9af5a2f53ea8a04dbe24507923da01494aa910ace6b28aa13ef2de0f09501765bad4116ee9e2effb9f1b70c5ab03904eebf839db7e4e257d0357063ad0c4d6f0afcf4314d528b034a71b45b0cfe34bd767784add878d96f8e5e2dadabc080eb0a35276e72b45085048b1ab85e2126fa9e7ec74cbad2236d8f62e76b7b05676d2f6177e535a780f2a9b8fdef9b4d81f96be1bae7851cd95f7de1ae79ab8750d7d7e86e6aa2aeda62d7fc2bf88adfc62b6fdf1974ca2bd595a51bc66518452f46a7b3ff62e43036e6ac793fb5fa379db35556fc7279642a26b3ecc50a6d9e0b3d737e6bc2e5f27dc3d18cc5855267f7cf981af2aa81e4c80e82647e8e9d295884a257debbac883f7cfda8425d060f068c73a4767f279d1c7b43a694e5a07248d6204dc560164284c7d566be057f24eed1a6620411dc5347ddaf4f8202e8eb6c54b9f38d81dec40af6173c89d80e071c68ee82ea2abc87675460f50e7f83f67d00ab96b7fb8f96b878c3c438190ca2ddfcb4d4df283d58babdde62d660345dd94e2cded85fd8550734abfaad7dcca3ed1c257ffaa1689a7804c1ef975c7bee389217236ee9d996c708099159516bd251ebc79b0262789d015a18b65e879c0f71f11f38787cf09568415eb86a113fa8dafe8fba082a1b883ef7ad5e8e3c15fa52bbbdf047a9f3cf33eac02a5f59fd76bacbc58f553820237530b4e3c751597f85aa3a3a5841205fb5c89652dc777c759a35b255f7ff0f89f5f5a5fa65c0d9dfba7a2279f2eb6798b325bcbaf4c4eb099b31f85bd91e255acb2bbd954ee977d810f39da75b00c7858509bce4d5123f43a37194d48414782b068069f274ff949cff0df88424b2f47b41d83a4d2851d69b1245b356ee04cce58e47e461e5422fcc723cbf826e61f466677eaa2afa2718e69e6b911771ae8e2a8ce6b2852b4845cda6a410dfd92918e9a207d536e3da1cfe424e337a588b1a26649ad137c187f64581163a65ee4762f602c2abdf34b0cccf2efc46f9430246028915f1830f99d25a506d47b3d57bb99d6266e755cec8483c8bb5643d74d298ddd78cea00c331c070f91dcba7d2f672ab827e921119f7914b97a46d040e05a8132f519849366aa427cb825d6b0d8d0a45b5f2b044db388169bc11327c3715929a524f63b141b0a6a1c524797e537c266cf3899b5bf0962311282d660f5cb7731c6bb6c1c11a53ddcd58b3523ccc6cf0d95e9079293138cf3b8090ffae60d95aa31230b2a33ce96174f84db5eb86a358fbd288b4077940a9a6e807781ffe653d7f2f31d809d396e24396403d94a438f44212a5bd1f554d6fe3823f7e0815e7d6ba2b9fe5f2a6c232bfc8fc9192ac5da9a68ee381ffe5e7444cd9e605bdf9333261620453ec058f318f4ffe8281ce1274c29640318149718fc70410b3e27b3724c46ea50d29bc71d345d5c07e73a4282e0be6a52dc2e6ab5181250598551bf2181e8f98428c96fe53e5684d74ff079d2a7640b39a35011bdd4c91122751e030ee8aab27df7fb0453d2a9e159b25ded3b3c125a7dd66e6de80b64be258fd981f6b06e716ae0c29f3b8f9e00211e7f27390d2a463685f791b07a1d6352f879fe107629d3ea391e1f4208a647b403c34f63b5fea21cbc340f60579b55be7e3cf5e167f0abef6093f092952334919aa66616d541a20efb573b9668351a0e806920fb522c1da17a7daa1469127e7b4c64e7912f6449ab65c49270bf7b87dbfea75cc5b09207c0cb19ef2a4b6052783f5ca8334432164a5febc6b95f724c9c363379008d57f4fb9523cf33e99d1dc06886c1d05e1c16611f5be10ffb213438b653887b89e9efb6f429dd6fb011001d289759ff731ca2510aa0dfafb5b82a314ece95e594e0638822ed12d4f5db0829c22f1daa86e22bdbaec94ce91602e7d95d1fd14a3c92ab92b408c022866f408701d04de84ad6b8aca5e4749198fa4c618a7ee9a3c0c88d3ef172d5d710efb0782bd28a657a6755579eaf97ba246311a98291ef814015dfb79d5a67858f1e77f881d4997f286598dc25f76bf3abd8bc52fa08dfeecfc9c5a4eb140d40adc61f638b1639578287499c5c1385050db4afb41fa27850ce0e2519efc7c3411d15196b091bb9eb414717f522417671e98cb44f5cacabe7a29c47c1c0fd08433c45f557419477edb71e24ebe178ee9ae6b295ad66090fa5baa42bdcd9cb780e843b64d80b33ec53c18e80a247b72965169c2159e21eeb0822c5eba661388083a6adb302878624263d65f2870875cd4a0d4aff94c8023db7dd290a19110c0512138eb9b8370edc7d2908ab8daf87ab98c3b6543f14ec38f515b191de260428c80a8c641fe6f7ca43885d92b41b9562dc7496c8bf65d130368fadf707d2fc6365f0ac68c8b89b88df001ff9bfa66f9e7d332fc807bf729dd12f66f5c171f05d243f74ecc809e71de28dc2d4a45654261663721aa16232f2e715e4c16d227a3cc7bd58ece3fa000629cd5dd255c3a4d19cc03f04f9e41a910fe8c9058ad71c72c8cec09dd0b27d59095da8d40243086206c284c0def27e81c759ed4b2e6959c8726a8ad2a8414f1a3f65b17a614e1941ccddfa34bda8792db1d649b0472aa9fe404fa3e50bf52c053f194398e00a5b4f605d27382ce82eb00bcf94b1b04d4d63c8eb7194a9f4f38f38bdc2616f01531f98ff5e8111a4cfe5f51b4fa9e23cbc2f3a027ec24dfbd032fe10861386c030aed908524a563ec8af0524c0f0fdd9f3e9e6fef2bd90600cdc86ef12463e8e3ec88e8ba339ceefd8d74fdaf1b4ec0f4db0cf1a25530ea589b00cb49e50fc6013bbbb3fa671c8690f7ba087cbf5c831cd9c73b79dc059cc1b8baf2931cfe9ac994b2cc14d7be0748464a14aeb5bc0d594f089547fff82bee8b3b04ae07e30a78689a6ae572d4eb69b69af5913ee2545629d3f28e0b6633edc05d1d99c6fd0d3d0ff9ab0f08b780beca2f70e4708245c01d02da729ff1eab8695fd38c5fa400d01f5c1691fb1430afbccb42c13d13305a8260dee9e2cb7d610ce673b23d87f8a24a9e96a79515e76dfd67bca4e13459d0d2465f05b1c6f6026383ddabe177a7e1927b3efcddbdb5c6606eeff494c7218d361be0f8fdbbce5d8f94f6ff55bdbe90f04f40571830af0753ac246ea9f5d04629bd99b74d96e6e2706f12512a7039b487a477c6e6c3e587854562af034a9105cdc4b3e89737850904df6b4e56aa5209d74941aecc448e5e70940dc1f2430875f5551be3782918a475dd053fb73400640943d44fa943d6366085a2f4a99e18f7060a22efce62b9d2a8eff724e17885b6274882d1a387272e5ea190a8d49854186e5ba87b82c2f773a54743b68b1347d69731e9d7013a4ba1e8fdec4a689812481485ae40e4ede04f228bb6181d9411eefbaa87ff924cb76dcf8c6b1dd2af9fcc1f91d5e0e43232683ca934dac66d0196d6b08d351bbd333709d1e98e049d50cd952dfd342b5e830d166674dd77767f66b5040286f96c9dee25a5ab13540070e3fbfe366b540ce41938c12c61832a4d3ad3f697b59754ff344804d6834e24f8cb3ea91a06321ff25301c4ba09adb75fbf850c7c4a01cc610cea76336da1b363d4bcc8738063ecfc27338e291f035d00bbbc0c79b5ef29ae29356d931e2c8f88d6a5ea2b918cf1bfe9284f8d25282e91d7ae3aa80d2bbb3d0ae3869f14b5428b0a3ff3bc98c85918e1fe7d60699c045f34438f818d13ad2677025a5df9a5f9d97012c29a9dd483dbcb1b5ce801239aee8faad24f607a698c733c919848fcb76dcd7b8b6432897de882efa51d3eccd9c571e158bcbce84fde73892e0f81b61822f4ed52240f727ef6e5b0c8f04a25ee515e487125cc8b6d45625000852811e4edbcea16fc4bf39542161745450f236e02e0708cbc092abaf6a9a7b800a930af81709f12712eebe54c903d326491c9985851f062ead3ee57b06d60e3ca9ec75c7ae8702962ebf3bc7e3c25702d04d1f4fcf21f5e904b894a176f8bf8d1bcc779cc714214253a499b252540e806df40ce4dcdc5ad0e15fc33a0d4211e77c6bcd2bbc51c80c5ace25529ddb808ca8f47f7a5abfcc31415332d20a6e302780fadbdf6037282e323225afb00dd1ab087cb46480b9d6867b5cdcba6cfdafb0bd873d6cd4dc8faea724a76185992c36d19ff656d8396977da6b0cc10c36750a7268107356f1c5cf1d0cd8a622b09eeec3aabc96b1d30b386c685b1941e00842917b7ba6056fbd4d85afc75425d164b7c0e90c276e4eaac752e71b80ee150d845109cc4fce5d28315f457c2d8b625a411f50a02ad1d10079594378b55db978c5690770c3cc5254eca1adfd441b42440fb5f16ee98be96a89f1001b96ec1941a789a2e6715e87e0d40948d30d89a6b325d5ba768d530df5fbadd26e1fb9571c1eb7cf6bdd122a18f8810aaf34435cfe580244df2e9a4b296e76bec6f04ad7f4dc2e8eaef4755e6866af18b96769bbfbec413c6c2acc766bb6bb426ca76309a34d95f8946385dbf924ea9ed9acb57086b095ef357b752608e598cea1249eb8c45d6cd961a3e3a58d95f2293b5ea7e77218660d479b220f672d8b7faa63c44a5ab87d759120985414dbe83dbcc904897f2d455b2cfa356f61c10f386815a154fd66f51c358a719612e329526d343f08371197ae18a2aae503236f0bab58229d236856628f2eae4f0a5cd99c4bf10794e0d7314e338cc2f90606ba1476cfff830201dc16c9292398ee581a1debb768d3a57666a1ee5b4c7142dd6e38e144019271b24b904e376a0f6f91e3ef64d0504eae1c8fe899e5f5e614e428090f8db705bba816a505711a2f218b954bf496ece1af220b5e2e83d9c833ee5ae325b6f6e1ba74a7b29c39ddfe6dc85a9c21421a975dd5c7b982e4a4016a79507a53a87d206ae9140fe76cf274c757ed25a78bf6bcce7d607a3dc24d8e998275a96d2565a8186a7be2d0c4769d0c3cdb8592bc4d697fbe1d24b114cbf27f67437c05fe57c806e8aa0c6185d7526bb69ba43ae85fd508549c12d72822f91ff872ab0ee8640d60287e0cc2d635bac94409a55eaf4922aab94a1da1f0a8b5a69165b7d891f53902d9d0f012947a2983c8fae0b64c12b98c670c84fc01583253111d5cf2aad444a3319ea14a76e8ff8182c4b40530f1d08e72942dfe585c7b85ff3f500c33b12f93e03dc2629169c1640a2d61368abcf306028a0c27756fa540d0c75af8ad221a4e12997227d7e34da1f0d5e68dc6c5e0e964ac0683690663f3a93afe70cc17482e38198834853d7f93e88d3648ec0c348981ee225d1035e767c737cf19598e848c6845a5ddde345fe04c75b26e035d804b5b70acea3edc253effd919e5be8d6d306e03403d1c8447ac7d99e774e015a85311a81168191e0f7393e9ec084f623d4ace89d98268918de1c03010901093bc32b5d204a73399b8f31e1421b577b3914fc27437c18d0c302540ea987784afd88a2c02c764472d31999d6ded5dd8d0e5aab4a0badbe78b15d02b6659df1cbcc4510a15287f0ef814ef9f7881787f64aeb1f3364f15cd221eedbcca8dbe8af9fd1a2e3d76c45cffd0e091141524a7ea9c579d791d0acf3e734f2575ff1bc0b48c7e61ce44e998c3cdfb932a520267989f6aa6a8a182a0e653c0f3c62411d209ccad1f3de38a590dcec3445fad71c0be7744b528d552331fcdf8368ea1730cae371c798e7529c1d850c7feabfdc5e13ef404eab1daff819a2ca76e09f0c3d933879172cbc841b62f570c34b3439718bb1c0214850b4dba2ed6f54f91a9ac1ce00fdc6bb40227da88aa7f6a4aa5ae6781f2b2198f81353cc5f97444e6a93e010a93fe4eab1176daa57dada2dc8f4b452830b3f4db7971d60dba7b7c9aff6e568e086ec3a3d8439eb2bb97c2310148f8df131a9494d70d5e01d1130d8c769d65599e14665495983a715cc073766c0eaa707137b437fa1b991b5c6e348a93721e46caf24d48761d543b27565a2c152f60f83d22d66c63f8e6a467dc2f5bd1f62479950859d12e978bd02119b900994d44159c6c2af84f2998d6d0097dba9edae98583f03d875155f1224bde041293a9bac16c4590743832394f109242c8837a828e1068891850c90ae22daed268f7ed7726391146e87a455a0da12760cbf56e8555fc8312b65a4660278893da25988d2410b70196e1e716d5ee20d137df51828620904bf07c1b0e6b93ff1cbd4d1f69d21ef6005041572f3eecba624f05373eadcf27003c9c138787b8098b6b43cc8f5dea1d193f0e416ba032fdec9f34770d3d118766b15c329349fe11183b4171673c93108cd74cf95852f925ee1c64d42770db2980ec997d608c5c7aae9b671139d27278eba8bb8bc48bc87eeda5653bc58410cc578104b27009c38719bb0b18a817b7019934423423bdbee227d13714c92f43a1d9360825d18ff6ab9ef79445912dd9c72c030ce96b2dfa9d6c7f8f8a638695cc8469fb00cea203dd788182ae5cbc5b2c6ea198adf8f54621224a1f8c95cb74fe676018fc981dc17d58bc427e24e4f278e894746b0d33892078c1bdf489cfac956e561edf3eb611dd81a175ebfe59bbdccc10147be47cbe0b2afa363dacf7d63325239055edbccf78e776e1b1fcb54cb12cba55b90d3d17f2ab074fde1f6585cfadca0c6adc95187d4aa39fac73fb10990ef6a10e3109daa281985e0e94ad8a917c943cd219a4e86297b114cf4c26878cc7d8482ba81809b08f7e51c8be62ff87570a672662e4d1420097e82de2edb980ce19f94a3f4b58cb6154bf4739b719f77d28bdbf4a879e972c6a944a7ca8970762b0fff74177833b46a3fbaf54e87b49490f8689e4fae35626c4fb96fefc2850fde0aeadc85f94d9b85ad591f277d0d33fdae093d2ebbe56202136689eac4e6fd3445ad19ed0a9ff48b6898da6d6ff0ed0d8a03dba2f6d1e9dac9dc001f1e60ec8041898a348482caae70610f0905307e1115a3dcf33e67f854eeaabf7ad891eb81defceeee0a0eda9de56053285fc29d6fe504a74967ee3173f95f518cbd4622f7c7fc977d5fb52e5192b052d4c6c9190ba32851cb8fcb0b610584285eb78a0105d3a914c9623bb824e91cea451a51c0e78661f4497fee665fef393b7014aaaddd110bd78cda95e5a53c0d45b46dcfaf5af4869471d6e46d622806e5dcc1bb34347e3cf3385ee7c40c0d16ebd59e0e5b07da084544e4f62bbcd6123a2b41626ba91e5f54f72dd6b54b1e0324a2d914b33d2899dbbf92574c77fc6c47c3cd8d0170d162dcf9f34a8cc18687c8ee7aca0c2e4b426b11858ff1708fc693616b2f941a5652838a7f81e0d09c441bc18e005764e248e3cff3f7978d9c7175993db876a34b22fe884f89af9cc3745bb1d7516eb856bf2e04138f9108ada41597c2d3f5454abbd37046a3cb2c0756af72ec4dd52d1bf94d1139ff838555a76a0ee5709a193facb3a12920a736a38fdcb00e3c7c4f46024effb55cccc8f9586c2493a364ad18495ee431a07e5370eb7c40b99a5958441bc2e1bc7c4002dbcdfb5316fb22c323a3952791443cecc6debfaa4748c5e40a438bfe02f4bc5eb96b83972be13094a52b91f8cf6e913c387654b9bc321fe8d13b886a60ccc18d15bf79d1b6233f70b3c8132fba5ca5e4b9e5ccedcda176cf5cdf2a1db4236c246189a683285220e2e1f65e199c2343dd04ccfcef86304fdab2f5d8257e3b9932415e49aa596521fc70a5f0bb25ca55a98e9d3e95f4c3da462c2fd670cbc0fb9b2b5fcfdbec6d0abdceead6c906841d15fd001bf171b5fae7a10764a85cadf32c11f0e1dc4b7cc89e98d13c09a019b40ecfce5fcbcc4e53bc3556e3f6c0e012f9a283a4f0629d3a49e152ca1686dafeb4aded619251eebc98cb11ebfdfe53ae4279102593e6972322cd1e4a8f458a77a3af6366a14db510e0ae347bcfe043d838f2cc2ceb852af1e9809b1f6384073bd22b20200fdcdb57e5f8417c1da4de39269f7a7a16b269d7f0bbed6d6d4a59864511bcd960b76ebf6250f32a9726030313fcad27370cb74af6d7170cd7a9de658f8126606155c79dcb8c28dbe24693234d4817f9614fd94e79331a302fca620875a34a6a6a9e5867ceab5d023652807f7e1e7604937b6582c402bc80496681b0d43b4f9a3990e4e18586eaeecc23de4265e2f6c3c9c43a009c0194738ff20f14b05ebff4010c9f3ce4b42c266bb8cac35a5e90153ef48d743ef201705a3107f50a7a35cd367e920b1f3e4cf81103ac25f19eea4a1349bbf9cc502c8dcf30138beaea7fb8ace79a8fe08b153c5987f6be241e5c0b2eeddae416a60abc4c1c3e1a168deaaadc6c9deb0b32bedb1a28dd5627f65337890b8edeefcfa661f3e8dec8a94067b09ba7497d926ea29febcf20d9fec7f5f8920825f32205846ff12886e93bda748770cf026e1b8fa08c54e3ca06ac93e7ec844504b0e3ce8d4b721413d02cb24ee4866bb1af26f1c8829179db67cb80efbbff1df97609f9ac610556c1ae2af9289a2d0abd7effcb15a0a3119e3f2312e6459a4b67de97e25350f5448271b5371de47dc2d11fd2f65f028a4886c00d2a844f12c0f3a93fb2f1ccc9c67e546fdc290be8d803e4200317684c99609153db5bb1ae98ad1e83c61a12dbd3dd8fd4e3f9b22edc6ee46b4bf4c2d0f4c2177f88c923e1ed7a5a1dbe5963934059acc4012d6c2731ebc6f88fc8424a7f92e1a6144a4ecca93b0d1839317fc54da735d9746180dfaeb99add3b9d2159245f3178738aa2466bde18cdf23f583814bf51ba2af0b0cc285e1278faea685606e8e66357aa51a9add3dc8da3f0813fafc2e9101c3acf9f7558a74c962f257554bcd358f80b736d30f984b7f5e49ebc3c3a9370e33f45b2f390061e44e0cd9f17886ab37a0b0792fb8f18c8917a66f60251db5fd1db7ec5b502ff4865f5f000183b65badfcb99088f7bd183c381db44b41901cb6ae9ef247677e0f11b7db72919f5519f76dbe6001258177c92a2689539e1aac506a1c9ba0c90eebe85d1ad179da578ef34ff27ae50d29a9e8db8b75bf0294d6fb15509611670abfa64309e8cd0f347bd9ce87ba10bb098c7dd2f58b66729d2e0d85eba3b86cc31daa03310ccd43199fbb86ccb6b5a6416da0f048b61f26a8c37f788b5bece4651582c5c9a4f1c4a8c0d958c6a152ca7ce0d8092cbd71a09b406dfe2e24e46466e5bc14716214a6398a03b5ea03b2e7d97c8c4ae547306a6133cb6ec24ed4ad5964a0d376d3aed90b4a3c4a736368c43fc92f2972166aead05a4276c4c2ec3b2ea3722809ca3b9617e392a5bb7e0d6ddefecb6f509507cbefadc81718b74c2487c9e152f3f0179095d1166d7dd70ea7d4988ad918fce1965ef002834c832758c5cfde16ca5f702f5f92a07a00390fb65171eaf87c82c537c02ef942c9b949b7d075643fc3f1321475077dbf3c7769cf46f08744526bfadf4ac21e6c1109fa08aaeceea551385a0978a737003bcecac42447f0317795b61ed15f6c374b248e6486ee225f7a1e2a19890ce3c91a94d8ee23e937cd7f0d262473dafd2d6af39a2a833f4362e89bcfe0507d133fac1efbb72f80c6d3b5f3df4ed2f660e95ba89026f8d2f507f440e57a5002bfea70acd1a1ac2389b146b2a27ce1a2b0ed7d3a340c3b711e6461501d8ac176afb7628346a774c9e12bccf85d1680afe669f67994287f83fbe8a080e698220f80ae4ed24e1ce6f6c5fe37fd276114db60ac350460b803f4e0620434f96c2a656151349303b7cb319eeaf053f88e42bb9fac5cacc2706e5f5733e5719bcee695e09f21f57f50876316f732dfe4b292692ebbd16bc82f4ad08bf42fce1e6616dafa3fb86de4675586161fd4c01744c4cce3650092c905df4626553be14dad973f58c8a2282ff93c81a5fdc0396f0536bf72c6aabfd1d59a4709df928329baaa104bc7cfc3a9885a43db33c38cc8829bdf01ab44dde3245483459af89a9c37bdf4b26501420944ef1247fadeebf177a60e723cd840d9b9e6ad8204d1a5d3e1b23ca57b954d8aef4fac70b41334628fed963f98ef1c6033dc8f30746b824eb816fda9107a000f28570ca49a28e58f91c9b34a0efe5ed0a3ec64e65e378ff3b83a0d2373816d941997833d80e6c76f3b1bd6cc8fc1f4b6e20b87c8e0dca013b0e159c860c47ec44741bc5d9b700f522b94d95ce555ccfbb00e94aed459aa790fd487f290789baaef0774285df27aafebb64f9dbfd86971bffc655584c04bf52fcb5e6ae8d792a103ebf2d29bafc5c9be36e9e7542b49c050cb08496d736ba0144808bf09563d69f62d462491a678bd49b3af85182c4c4fe2d0eedf484708dc35c1faa4e749acd93001ec85696405b794fc83652cc839449b6bb6a7b69aa8df0ba865ce01d8f7b9c413adf57860a5d101684ecb79dc29506778b02e78021c7b31488fe0f1f075168a0dd00eaf8b05bb44d061b845769a9cfcb9d864bedb1b1aec3e05fb3313feba6857e85a9630e0755f06308505ab5a893e44526b4d6a38c1cb0e38f8b628a4ae8bd09d693f29f05639219fe877470035182310925bb510280b1bc344bbedc473f6eeb61f5e35df603d6ca2ad4df99326c1410a385bd81f89c8f6a934635f59d48f680fad90f5154b45b1ea1bd4baf602c8b6398c3b046b85bc559978791c38f6fcdd0b862118a5043b7486f187d96033208d2e5dab373a86ef61ecc9fefffb30d9fa1196426329a0169798c79250e30bcf9dff1c05426bc32aca9c0434fd74a73026c128a3967c1bb5382fc1b3921bb4b70905a07a9f005eece467960f40da98d03e00a15e18193401ba4c1552093bb0ded2d800835fcb7a2322896c0fa7aa3620b06fe29229f34fc3f32f899a98610b1bc24643aad61fe1467e448e7ad28d1d0bb7ef65332379cbc632d0609ac93224bc517055569e0e7244c345fd2cdb46bf3efd92206a3b6d122d32ae3fdf003868126f323748b66b0da24f0704fb1bb7d688436acec6c750c1a894078eea9959d2e791d2aad791d41b57de064a4c8ac127dd870174b49eaa7370b1aa2182483db36c8d2a4b37faec7de1542bd361d23425ec9669b8c5c26759fb5daa53088722d3704ef31731deef473c2c283701aadf0477e9566d09ab47b157336663b017cd2b0217f4651adea6e27f4f0c20a757dbff9e29e9cc99bc38a83622a575d29b487f08d2610af3308c2ddbb9f4494caefa83f75ce00dd3b4e6cd8b9f749712e11a6b1ce0a8d673ef280c1ab5342a2a3221583d11ca0d9bc2d486ac6101aaf146bc5cf3a0c411de7b432f340c1f428a1585351f1336f767562ba2385e4bc5cf090ae3e6b9147baba0443939f789899e743339c0e8f91d799e6f94a5559d8d3dd36801fbcd9c8b44ac04c598c6e221c50c7f4afe4fe0c1dc63e68199163235f224c022c38f8c42e28d2c9017ce14c158ae6490b9a4f3041cdf5c81139e98b933c4fb190036ccb0bc3cef3f49312ca5cc536ae334b26b63a54b6a9bda5f054e33bf6ff37b32ce0b156553362f996daa986727f33bfa1813f7e98618b916e4faa028886c53049c094c3220c3ed70924158128139808b93a17fd52fdb7453017b205e85d26cd3e130cc8c8e147a0bc5ba383d275fb0518bb170155a454abca862a04fc2f8d09be3587b77568592f5edbb9861b3bbd44e5d08c33adce93986fa95733c05316fd8010108926209ab87f4703e32a12ff905a3c2e7ef40f7d05b4f80dd61102af9a6ab446b2b2fd82e69cdefdef839c419c233984d930721cff4b8253889c86e22ca7b4a709126abf6798021ffd68278060df588bb69b8146452adbeb703f27eede0a6f99255b290511bf1b0297bc7e00c026c4375d6788142c7d8647fd48a8c1e32f1241053587da85493b65f00fa4cc9aaf50a74d9dfd9ae75b0dd5f393b65f6ebbfb965b3ced063d0ec400366cf9bbe72957381e680abc49acc362e1e312c9f2224955c51d05670a5aaa63595f15f6ff141f183a88525c9dd038355b14dae8f1ace99a64da5ce2d7d162252e165a69888ac08e12981fbcaaec272ca493fc6c17e6d93ccc7ae5159229660d63d62f64fc0e5d3aa49e71de54b0c0fa870a258a73cceea4fb48b37987cf62648f003a84bdf7bf50a29253544aa2dfb854c0dc7ad036a0f27ad32369b0c6a0f6c0669e844896d0a80cd0af4f2f0839d6d9878fe29e482a0cc7c8288fe4d2ccd43b9751fa99f5b8dc3d92c191070d67a205453feabc29e5f1cd854c27905609c2124052e52c77799f638bba65c31dc1a9528f31abe6ac30013828f0cc5ec8c951f03a59c65fadd456ddfb6ac65a7de6ee15ebcd14909a77cc3ad5d5a7580506e270198dff4744d384d39eb51e0abb42a80b4574db7ee4cdd3276f283414377a2f98fcf4d7ce6552b4dd9576a5f007b6f1d7b1206db33e567bc2a64c767c0b57313b532ac0c48d34d2f5049aa1b9730081ecf462e7eecd638e7da227c0f7e642e061f81d71a63781f0ed2d0cf155237dd6b36e38f6d1be9b29f5ed144f5635fd1bc3bb1cbd07401f8e00acecf62decb71efe258b2fcf4fe4519ec6591467dd778e266fc6fd9be6e7ea24be4fbb31ed1614a23461e2e34743ae6a6ad46845bf1e28d29eb809ed0b19f0cc4527f4614f9cd17269c844468fe8065cb8fc2c1e8aaf640b6e74338bf2964ecd2bf9b206c779eb85faa4794eae6a817f15d41b3a01123d01db20d12db2b21e3eaad0c9ba443ba2684c8e8e6d3549f97910c1be9fd79dcb08dad9f8a335c65aee74edad2c86e1ea5c886a077188a2bf0eb535c23e5c6d253fc4ba521bdec96f30de274cbbe190bf309309acaa4f35f070bca6159651af3d4e1ea832c2c3f3affbad66dcef37979dea8d0999227fa4c584008a97e9e8b6d85f400bb1136d766c9522c10a12331f7df53e9e05f140a849a1ce5a805bde94fbffbd580bdc081b0303a2837c0ba933e0ec2a8cf20c0fa77e5e16cffe2ddab9d0dc5528994a20f4d52dec22c453172d02f33ada3b5da9db061c525f57d7d989c8a1a8e9ead0a682e07c0113220ffcfd6a245a480da0cec11209fa003d792a6ed89c3b16c83bfd1fb51cd71809ddb4fc0f8a18c3701e737fd4874ed63cfe16f64bb0304de03ba2ebfcc8d823003ba0bc3c798bcd8f362571e84a0ce611283686599120d3140043cb649e2515d7b4fe65e406d843234f6bab6332ac48370553dd855658f3c3d62fff1bca9f38463e88749459dd3df1576e28bf70a83c74a8992fd5eddeddb412f301d5dd0a04f219cac51d89e968c95edddf52a7c4a1ef9d207dbde6e3b6c338d02a8edc90f210adb652e04f91dccb8c29ec9362065ac99d18ef478c5d883b89344dd2da53d00cf094b4024956186445dea309a01a642955cf3b1958c5b7285665b8c5ec24f56f02ac72b249b3f94cfd0a1a48a5be16000f26b8ff994e6e5980adb9f9330e799c20d0e023612a7e4318ec405a91a7e80d375fe2eaba824eae4852204744ed29ba1c647519bd07d9c919fe2644fb41a5dd12611b341e6d0a68260612a646bc958c4310c33848e8e064b58a4fd74a96c8c8472d738235a5e66908a4c4e9653788e75b7c9928b223e5992d023daeb2116765753f8370428ebe3b85dad182eef8dbef8a5a1c077da4dcfb526758d90cb011bf8cbc46ece09b8c6197674cd14de95f4b50908743f53282a6db2aec8f8bf6c8a13285cbe0e11000ed6a91d8f1216fc38d5ee660d7a0ffef840ddd29c25f6430621960e9b082a70318d5100f5c064e3c0ade4086e7213bb6e072cc5c0185dcb59ddf4d2abf3fe067184909ad0a406924594c48e1017d9203d838580890d3a78b78ff90076c2484a41f842ffb1126296bea74b426f898a317c810821203d5dd74bc5a9293b42d7d6fd0002bf020a8c9fa250e868e7c868b28e255997fed8208e6517fc1de640c8730032ea62c2e4bd4035ab44249f6a62de4b2fd3235c80bda1377fcb40444a2847d766a4bcbb01d8fd661206b327167f3939d9ad025d30985ecbb1ec25aff8e975ade53116337e49f55b83ab1d1f610def75ef684bf5c8dde71273642e58008217a9f10baec9abc36c04a55de5608e6cc224e34144c6c3478a66b88b9d6bc4691bea155b8fc38ad553fb874fb8dd2e710c581f3278efb5ce01895133e1fd4359276a18ccb1c2920c1044f9f0aeff9f30e7d83b888fe76ec8ee7b8f488128ee61e6677640678cbfa551123e6fa906e412700a4b6d7b868df0053dc4f2285349161e005b05eb44c1149f2a9048cc6330eb213aedad4773bc7c61d4b40f1483d9148446fdd6e080eaf8ea54543b3a25bb2d7ac075a740375490c3704c963f0e1dca07cab3c6950ae95e6a471c1eefe7044f08f341e66647edd0c30c3f00dc38c9f5beb1873451dcd9eb3b208f215d6b8a9c7b14bb882cd3dcc88701429631bfd46fd8012506c2f2fba41b229853c2d12ff3377cad3dde6a21765ba9cfacf6ddedcc21bd09a2d5defb39f8b0951cfc7064a1d9be3384800ca8243621d6a9e40b395e78237b5fb514750a6d0c4167e7c98baa78c06f508b33285e308862c45ebd729da54f1955cbe72136d875202c4719854e03372acb1a1aa08ecfbcee79a8955181aca113cbe1f5b9fa80242d0f8e6181ecf4fb48fc072f290d433ac5d3215ddbff581f69ba403f30a04a4b2b7c8aefdf6aec2fda23cf5833e99a42d7550dea795360560cdae3069c79037413893355893176e66d54816e168e17225fa92a9969d1c5c1168d2e48b296bd80e357f1e7dca6f04ca8f272c61825bf4a1660fc8fab4c8a9a2e53266da07e5ca2fdf797084e66b57008a978d887f9e9be6ac8a54f40e76a720ca4ee17ec691fcfc861c095a3b550a4a7451ce0ce8a925ad65dfc47c0105c00ea37d63c3b7e21f21c1b7c081cc3acd3c3551050b8054fe50673548164bbcc4ba84bf9c587f65220c19471df9ec645d44b847936d3dc7de8ff00e2311703024a25fd29293b2adba674c63c1ea1d6c8930271d3a8c12765d5a6ac142ca71f8f54bf54104b1b5672a3b31427abd9413161866aabe531418b188c2705f885fcbddad7556928c0280c24a75002a01891c10016f3bfd796ea2ef3e0251af09838f3381de93c98cd38d735f482ab95b9bc8d3d81637b1f7e59b6cdc8bc88b9e4b407fe3eb584965f1e07d624df7fff54c81efe3211ca839c82673f97f5cc6b6fe3a003981027c657c3eb5b4e85b3d59e2d05832d1969b025b3c4b5e21819f0b1641959a6d215b7431cacb629de99ef3f0ae4b53310776a2326c9ae1ae7a057bc49a25fbc439874a3bcdac517d7435de09bc3891fe0f8cd657071a3a380b09617dcba9e16709c634733c878cae81b50dd0aa38c240fb69352562a3a18e0e36d1705318350dd09f9af3d36199f258e76f90967e639b2f531c9f38e722842bbc3ad959e98f7d0b210466263509173cf874676988bef38508409560cc7701b9ed142648e1b8e4464e2bfc1cc39c19c3c87fcce9a22ca1e59b087fcbe9a04bb7de6868d9fd6941ac46aa709804908c9ba8a1b7fcaa78c9080292bdb5a6f0ab5c38ff28f7206f5e1d3f1230d1fe72433082a0687bad647552f32c41e0170188c5835bc9920a2fe8182df8206d0d2548f0030f781c75dfbc287910aa4fa58ed67c1d437b2510ddaa20c34c090f98c432789b1748b0f7284a897f421cd63a23fc4f7bc87d5b2139439f13e2831e9cebf0d55c20c0764e1cdbbd60a8db5d0669411569414b9910c98e4805d6228dce8fb7672788dab3c124a89b21cc5bf32cfadff42990962f729a714b63cf8cbb8fa2ead404e59b5be211cd9b199042e025c181b9e06244bf120ae088a64f3ffa7af3861d2eb61b9c23e1c4e95f2db39e82046a1a3e0ee5575005617d01975ccfebf64fc28ee76d463efcf6840589e7a8d4479ebda3000b2829b9b3e72c70a80351cf24d2062f62043695c55d8e321bab7e06f9cd66ebc6a251c50ce812f7a51161db4ce47177f10be7be4438ae7ffadd074251ddffed7a258261338919d3f34a230e1eb399f2bce6bc555a0d6383cf1732478a1ff26d3a6a783d5e98130761a0f94a7b579087e501a371d5ba88b3ef5f789d54c79589e2c7de844e7e05fe9259f0c3ec18ee7548f98543a1f3961a8990d538c8b19cc0081710636cd202e8af0e63e4bb3ecbbf5a37c6b6dbbe2d51f65616602fc285f800aa1ccf592c0c4212cd32927a26f80f8d3fac04f358b2afd957c9a043a4ae85bdec4bd048b1577918ed7a4f61e440a00e7fbbd5a2257e36a04ed19199973bb796e0646568c1bdba02ffa0dd6efbbe80eb95135d00f7c2bc1ad7f02e47bcff08103b6ed674b80bdde24ad877f03c3a098ce26df5b3a42dedb0868955e67fb7a1d9a98c1c0d41c2d81bc111731e96234e68cb3283c9b0c922709cc643ecd91d16c5e08e66f4ff1cb267c93eb7b177078da4b939cfc7d62e6599619f960dd627703cc14fc618efcddd3d2373e5638949684ec6992c81f12e6a897f86c95fa5f09204366900f21cdb0fe4a5f8b95caef40c27f7fd4a164534ff1c98ea6d6f17919ec9e0b86653f3d21482bbda9c28fa88cb2840e84cdcf4b1f7c13e6a9c4730ff40c902ff3cb482a6c00b2022b3a330e29c9284e1b36cea9d3fe547f56e99000071187a9d35326d76ea2b599bfcddf7be08be7cf1a1aeac4d89420b9a2394b457360960c3a9b85eea59eeaf461b399899bd341c6ba932a54bdc14f2add4aea512948d1680cb35c3c94c5cdb9ce0dff800220b51ed4ad921db3b77e757a12b1945d5f2da88914b621aa06eda72d53f0acad96f78bab1d0128512f01a0c8e9dc646bf8b5c336f0fbd9c886acbd1a1809465a5dec6b6e7349344390a187e664d384e79b5169d4c6c1b9be01493779b945484edc9b52c6e4bc70b571efc9ccc706acae219938a479d4f84edb0e6d5cd79d7513abab4ece33285cbf91136cda46f26b45a08fe0ec3148f17f5e2cc6ae9faacdf308d5f08d587685609edcbeed238360a2d0eea95e5d8e92e31fdc73bf8ccb0636078f963645281ec64a71727ff94cb1a2f4dd9b33f4f133ca4beb873ebfab0d513f2ce307b9c388ff8cdee90512841ec262ee4e84ea2b7f16ebc0484ca517748d039a225f9e5a301c594d0795c0a4d1f7054e22ec925052bf263631578f6bcdf006003e123ec7e450e02260f8c1d9d2a8e0ed6f0c0c0c0160b29c1ff00ff06c165a64d2b3b1e9a99c7f2bf58aec5ebec261dd444484c8bde5eeb6a59452ca2465f609a009ec09f7628c354d2391481bddb6e972db664541a12d8a4a3d791c8a4ac51f8b8b17178b8a0fe6450b16151f35c190695d1831a6d78a161831a62791b66de3382ee70c3bf99c75745d8675df651dd1a39e375d7adeac2828b44551a9278f4351a9f86371f1e26251f1c1bc68c1a2e2a3261832ad0b23c6f45ad10223c6f4336a72e8d83533cca8e10647cd0c33b44db52a6d9dc63a416d9d362b0a0a6d5154eac9e350542afe585cbcb858547c302f5ab0a8f8a809864cebc28831bd56b4c08831fd8c9a1c3a76cd0c336ab8c15133c38ccce26386d90080971976e3e5ca6fee1986c33b0d3f27a51986c3d34a6ba5f91417a79419662380f70c23c0bb0fbfcd392917431be069861de0e90fbfd59a61335f65f82d5a6aed7469ad538b49dc0914364b8a663ef4257af8d08d7cf8d08f04f0a13321c0873efbe1436f62800f67ec001f4e1c04381374f8d09db0715801c08d1a34d820a2f9d07bacc062a1505a73dc0e1f4e1e1e3e9c3d01f870fe0ce0c30954800fa70c880f67d0d4d9f1af0c0800e2000628c00f041880007c08400f3cccd8ecd0a2036867de060d356e0060e56fc0c1867f9a191b1968b071a3c60a8b142a2a2c160aa535c7ad384dcb301b70781269db368ee3321743dbf039c3563eb3f82d76b4eba6cbae4bc175da746d3c880d1ffa8f0bb9e1430792e1f0a11b093a22942487f8ce0277c19e5133c3cea103470d37293ef41e2ba8a83c8b854269ed454647b3199b394eb4e35b16397c34bc0c7fe36d3c0e5fe36fa8f12b36b0a82966c0686e666ab0c121830e1a72d8d83768d49861a586c5bf8a0a8b854269ed7919c6e237cdc5d032bcce301baf6bfc562a954c5c0c6df3a60ca3e14d377e3b9d326ce54f297e8b288a424d972894e64c2895b561e268e543c984c6877256e3438fc9f0a1e3d8f8d0736e7ce847d87ce83a347ce840601f3a8f15663e9457d83157a6d5f25a61f4ff2a2c160a45f3a1ffccf8d0816a3e74d90c1f7ad0fed085707ce843f16b0a180e1a6cf60d1b33c850a386c68c1516342d33205df915af9696ccfd181f03e3ff5758a478ad68b55c53565161b15028142ac360fc96e262e8984fa5542ad56ab582f12c96e9b778424f4ea6cb93939ce25627d586088c0fa5cc488c0f659050cc8732c99012a225323e94453bbe9481a4c1fe5854b85cbcb48079f12a2a98c53a9a79cc735cc779e253938ceff529bef52b3ee65b3e060cd3cc9fcbbf588161d122c5cbcbc50a570b6c5171594cff2a2a2c168b75c2c5d029fe24c356fc49cb6f282819761f25eb903bb3f8940c7b7d4aeb3715950cbbaf9275c813f4c489e9f2c489132e85da3491311cf04399d392e243096445eb439902161fca9ed7873288cb87f267e5c318861dbf02ff2a1685e64ede4ce53f94b2ef4319c4f2a11452f1a11c727d28895a7c288be2cfecd2e2c5c2d55aa122450b0bf85dd3af807edf3b711a85fd523e1594ef1f5f533e799ab395aaa8a4a46418ca6f2a5c0cadf22a2a274e6498fd135987dc278df2f47fbafca72adcb4695162c7dff108ca8751282649f9300e4522950fe3925814978846918913dad695542b14eb24067d4ce7b0749ea7d5237f66bb9ef84e5fd49ff7a97cdca77cf643f95a28a845a2ed7ff28551c9f6677dd15b261015936cffd5a7fa3418c6200e0c69b67f17b3fdb7faa1eff04f9c408122c3bc47c1fdb6b29261f657b20ec9c5d0a6ff0c3bfd671d928ba1eb7f1966ffcb3a24484170ba0441ad8380b7e7bb0dada4b0b55bec18b3a3166b5a708c612cda11153fca1628308439b530b5f4e7fd0e5bbe81a42f4e970686ad1659e38a2ffe8a2efe170c556c9f208a6d858b7346da68d6b7662bc2ec9066b7a6cb3fee16258196bf5dac699dfd3967341ba73d64ed217d907a481f5865870cb0a4967ae8837e4829b8514c048ec9c63f730e6e5f90e6ec40cb08508f2e23c49c6dedd47dcee69ce5886373ce2d6cb1253c15d1786b529e4d5d091dd2d04cd78d514a195d689b612e33591fcea313949f467126e5e9d39c38837afa5427cea49e7eca57c374cd47f94e3ed617a76b359fbe8c34544f9f4619fdf47194313d7d2eca949ebe8e33f5e9b3a2cce92918eea03cfb064d0ff4fd9066d7f0d6fcfb37bc86394365d3351fafc0106bd67cba8489fc518c71fe2a89731ee8703bdab6a3fcf94e4297687753d9f6186bbdc9f6fc249b9b6d47d3e5413ac65bf33dabbc57c152395c5c04ea8bd1d581f106ef59ce39b8bd83cbe5cf1ed9a4edc85bde651e349bfab5a66b7e977d5e075a7ef85685c5b25ea7a1b4ee74a954dab8fccd5d3fcf68ba8cbc252b9538cf810ef14fde8e8c68ee8f8a68f9423bdc8e7ef6fc52e641b3d98ea66bfe76b431d966a6ede8c4c5d03be66c9b3e279cb324e4b763ce76e9866fd9c8c61fd2257bfee9f38e78d06c2ae8194d170eb4fcd033f298f0d6fcd2e71d796b7a46322d7f4375b8f3bef3e17d31ba7460a47173db51e809edf9a4ed684fec19edf937df80bf86cbd0dc983b66ea533f66ca638384109467536fc55391f770b7270fccd7f35522ad945229ab3e6d205ffc8bb04df9ee3030ad564b4b0f1a38a7d618eb98db1db5c30952db22df59f1fd7544d041195d68d6515378d01ebf0fda630d8cd3c5810bfad835ebb0d25dbadbace36eff89b53cc1fa3ab62db23e8aca1a294f7ffad4b10efafea47c434110cb26f636a3744fcb39e8de37e7f0edbf919c346995376a5a175d24754d0b1b485bb107e9b9079fb3874929cd3dd05a6beda15a6badb5b9077befbdf7f6706de86fdee4993c4545fee33f474732998cc95814da323eae81c6b9076c437fd3a2f449abbdb80b7dece9434139df2708badf2f6c9ec2c37dfb3ed4a7df43b4c1e1c0956f8b767c0ed4385de124da51fae67d7c1f3b668f2fc125722ad95187f59f5a07a558c7dcf3372fa586b863cdb008de2e68bac369842d3f9c46d8f16bd6e17bfe666db7792972fbd831e770700e817328bac46f623be844b4ec417db8cf17f8ccf6f593ff252473b97b4ddb6cfde9b38c5f435e435e43686c1ab97d0999367c01d139e774edef8e399b730641c1504ecdd2018d6daaf5ebe725e44544bf805e40af21af21af1ffd2f21fa4544975e40336da667b3d790d790d790d7101a63c13ddadbf7fa7909b1af9f9710fb2262edeb0564edcb8ce22e136d774ced5136d0672470c79c5dffd790d790d710d66b887c99471403edf973e632f467932d25a831b76540e2489acf40873487e6cc19ac335df331d6c9f118e820f0d71d621d0eebb8ccf61a8fcb9052d0e33241f08fcb709af612823f0cbe7e30f81af2faf15605310e8ee11c1cc33838c765ae24559ce33220f5bc86bc8034cd81f4fdb8439a138b819639f408ede753204e53407968cf6bc88b8816621dac8381e4d014bc8668e04b087efd8434e73564b64309f8d87786329bed0b626fd19cd7100c14822ce574ab0571cebdd7346fbbf643af7b3c674adf81a13769e7bdfee2747960b7ddb7f5e7f4ecef82810b062e18b860205f66e734089a52578f2bc8a5ae1fd78f0b062e18b87a5c26087509a1a60fddb378e60c6a68babc3e8b07353467bc0aa286b4440d35115dfe39089204dbff79b67f9887b0fd73d09cf1407b83e8f2f7b7b1d99ce9de3f4a6f8241dbbd1daed80d6cffce0281fe47e007b2dd026dfffbadcc5c866ef35230b439ec6b18d83602744f141e8843a5b986289464878fc3b3fd6b86d92528edec6b30b8e83232da283f924a86599b63e08881648b89f9b44defcb5b9f06517fbea4d67631f9a68235664ca6c13232cc822b331fe818195726c3563ee6321f9b5b257d1f5b99390a34e9c395998e9526def227e59719fcca3d4d86c9ac43dd9e25c3b60d05aab0366e03e346c3dd7b675a66f2c7bdd264beffcaec632b54833ef87566d92021046b6ba08cddf85b69e22eff999cc3b70557662fd0f2c395d9f6fa99685034f2a3e0690637c3e53777f5e8aa4f23dfe029515a32ccda544dadc9f193bb46d6612eb902900c6cfb36b480c756fd1a32903afbde23bad47fb162ad5429d446d2562b7cedaad2d57419539d7db975cb7b4c1f5d0f6aaffc71e4cd6964dea04da92fd1dc3582ba415c114137c8093708eb6dc13be4ad26dca13b7483b0bed606056daa63823983c2b576d225502b3fbc4ab8208ed25aa552b14e243727adf30645ea0fd753835be44ed072476f0dedab24d494d6ea4a680793703b808ac558ab9c2f250843dfa2cdf54c90eb518204091224489020b9f72ad9f1b5bf433b62490a89d8f3a38b7ecc9a56df7bec996196eb99b4723d414002045ae7e9542bd7c305a15208a9d4a415a552714826a531d6caf54c5ab91eae87ebf90112fa71412af73341ae4788eba96f41540c6584cba1e87d7a3fadb1c630addaaf57abbfd1fa1b683f1c0b22519ff4b1926abea9d9f30df8ebc51cb72b4d62db3cca49e9feee524b49614e798e40a574cf99251165f4772368df318db67c8f32461f6c5b0c2d25e568ad1a26c10b18519e237894eefeed98333782a618931e6b601ac596908b51faa4d5461aa42ac8f91bc9f30461e869b423203705f14f11e6c43f32771ea701f10391021250b4a30114fbb0c3902ed11a34def2a7c1c1e51b4138e41ab694b11f4aa9e56bf3eda78171ca8fdbca076326ccbc3778d7e97b738eba8c9376f6370d729918bd30811a673488060505cd4e9a0d0dc2013d4285280d3a9d4e74c7c73fd385830ca391c6fc106b2cc45df2a78bcb3e2c1da452a9158b06394a6b954ac53a91dc6a9561ab0cab73ce897fb6138ed6487b4083a2e39f1f233a0a01da8e7fbce5b29f6d8b34364e6747963a5334b845d3c8089e696484695485693434ab30674598b3399b46d3681add227bef9cdbb6e03d8a2e4a22b6d7da1154ab0410ecc5f8e2fb032060ac55252a8ec1190686e3326c7ec6f8ea1f68a9c9dbe2e61692dc5dcf464fd75c398cefed90944c2754e7e5fadc1764503a41195d94ce5929d56a7d319f523aeb1737a55aad94d2396bb595da4961e0ee1f8db788dc93d0d27b0702bef8e26bf1b5f85a8befcecece8eb53b76c7627c772cdeb1f8eeecec58bb63772cc677c7e21d8befce8eb53b76c7627c772cdeb1d6e2bb63ed8eddb118df1d8b77acb5f8eed81d8bf1ddb1780763bc732dc63bd7e21d8cb1bd3bf8da9d9dfa2e148c42dcdebb514ae74c627edcb620cd49e2f45a8b248918a594958686ae5827282794938fb552d99457d2267a295575d97ed4a469b092a7b53559933595b437048924f5c9ee53a56d1fb0b3ce303dc4ce38baeccb9cc3dd9dedc0b0889d6374d9249d35811d103a21040109103626dbccdb8eba4e974ab092a7b5350995b4271404244028694fc8fb53869d32ace4696d4d4028694f08d5bdcd1d18670d97b1d75e6bb36905945259292863abd6496dad75cea7d44eaf72079b46a9943bb87dafd62cad729b0a5aeefba146e1d4fff1361544423e2581da6f28970b9ad20cd32405399062245aa2e8538edb5fa3b015d5d8959b383ffd52af5da626155f6a6acf0f6b503e7c91f2a10c968b131fc29c7cc8426585ca872ed6872c352f5f6a08eed5872abba276f5e68727bb761fa6ecfa21abc6c6af1ba0f19c2c59d35291352d5ed6c0b4c89a18f932ff044b05a4a04c7499dfb58472e7d417326007a17afa2dd2cf9df2fde0adf9289f0fde9a7ff2e5105bf3595f0ed99abffa6cc4d67c19ede7b7d87e3e0cf7f363b4df5a6c577dfd54a9a771191578b2551fd6d750b60a0ceb77a9a72fdfe61cf5570bd8ab8fa646e91d2bba742729306400ea43c516ab01a74fa376983e4e0f51fa30c763535ac4a62f5bddd37cd3197163e6a8440cc29e4ffac2138d86d3ee633f66eb42d4d814a42b8dc829c792d2dda766eda0a80b18519e23c49f28302267ce9298334ae9c71877dc222e091dea7d6f27417fe9834a0c06a73c9467cbf7b96145dbe6790e3c079e036fe81615d1b3fd162561c72d02c3d2b551099afef4d684c2c61f96726cfb82f728baccf72568f97287f768cf28c42ddaf4279e7e8b6e913734936cb125dc80e68c86b58fe51bad546ef672db11d19d15c58c728eaed1d035a29e03ad7d3887f0936e4c973f16f2a1a1a99a966153c31c667d0b6687e9ba7b077b44cb0fe350ada43a3fce980c5304c6cbb0f95d86f9e8e9f29f3fb47c5ab50e95761966ed6c5169cb5bae4bb71469cf35daeed768bafc1a9974e5f0a9cb3ad0f971d72fd95c43dc13a42897f1ed3272eb92a761aeb3ef32dcde807664c955d8e29c41c23ef681ca981f7d90b1582c6683350a6c97d13527fd21070908d0ec2078cc7dbfb57dd8601cfc3f908000cde631377d2dbe087deca9c3c7f6971bef1edb6f3835d1840ed3ce5cdf5a2488703be7bcb5bb20116eadfbb04e69b02d293a6a2294e488749f3388509223b5fa9c945a7be9bdd3e5bd444b94502a894c19a5b57ad6de4b6bb5d6bb17638d6ada74a969d5da7b3dac004d23511269ba249138ef5e8c3dad05893481788b670bc11368c7c7f3676b1a1019c9c88e4f22e2adc9b3cd14ecf8db04c2518e9b2e396e491193d9d18c4d9c26454b2c21f220fe6324482694e488ffb8100fe23d4c1c398ee778ec880913aee3471c3161c248129125191272275aa244664412914046782bc624101e3742f6c82032053226718c98e1f056140222164522c7d180c884026ac011a30be7add8e2ad18c3779f313bc2a8b7228e61c2d6f0d6058c28cf116486dd1ccc4929addbb6f1805a490439a5949ef5b4aeb59632cea6d3e9443a698d4aa5525c2ac334285365dc798f2b16b24597b13607d944f579eb05ee27e30dddd7d2f932beccf75cdf729608cbcd9cc3dcf4525ba3cb04dd87959e6443c1a47614682f86a6de22bab1433bfe44810ef1b59562bc7557d8624b9452bafb9c9352aa6daa5569eb34d6096aebb4595150688ba2524f1e87a252f19c94d25aabb5f6de8b29c6d325c6b3a2a0d01645a59e3c0e45a5e28fc5c58b8b45c507f3a2058b8a8f5a7b03b54e0e7f7213d19711d127687b69c071ef277ba68b274a98cd51c2b1b80f55b60f4faccce80f59481fbe6aec683a8531c990ec5433f7e3cfc49a48c36ef2ab34a8641c40a48e8e77aa895233f746d8fe1a12b6bf5ec2f687cd8d22a584e51b9923df48501e9123cb9c1cdf3667ce5859cef6b7b23903be4b50b6dd1ecd1910ec621dd8c58eb6772a7fe2b7181ac55aad5ea552a9545f8837ea571f0f0a5381ac2214c822f2d614348a0fbb18d1f69f79237ee2b3c9b095d5f7b2158b75a2fa57a5bceae4577e3b59393951fdf72bd5a37ef529dfdd8256fd07a6a87ea3818ba153548f42ad541f774a0a0843ab5254aab7c9372ad007907a6b05dae41d867ea53a61d97078b5a25aad8030f46a45b5027950d6ab5ec50281f096bf4dfe8148b57a550b65b3529d50f91bdee1ec7c834a65e3c8b093eae56fa7ef656f4485427933281fe2ed9dbce7fde937ef9405eda53ee555a95fbdea4fbebb059dfa14307a4bf5278ff2e1a0fc8fb741019148fd06e362e893d5dff06df5a53eee93ff32ec0484a15327a9d44a852337c068f529d5a79ef5c5d85a81d15ba9c7916fe85681d45b29307a281c9c55fd0d7f99cb9c8cb84cca53ad64d80984a13d0fe44177ca7b0f2482a2401e74e3c84394be371204a346c072117156a225ee7b1c7c9fc4f74682b63f49288992ed6f89b6ebc81ddd9eac0ad43e6d59dabded9e766f73e49baeeb66d7bd8e7cd3811287eac83256c3cdce312fdd6ae062e889c2bbc1e1a6880d9ccc54db964a8c82e74a86cda96dc06103be21c326f83224e81b320dcdc521c35ef6412ea305d1cb7d1ff432edc397bd11cd92defefd70eecd21870ca33685aa85647ffbba81bfe5409d25c34824140ef986822d2c0e45603870f47b590ef88db88c10ac977d90d7cf74df7431c621c31481b1fb7e6fc45dfe39e41cbe27f8b20903d9f65a59500050014066156151db92d201a5431112a53bd8a7f986ce57916173ae78c83712e47828c2f5302bed21dfd0bd0500a6f5903e700fe9a362a9821c9d202e28c80941185f6b67cea1f705efd01386eca596d27884a01b1485a4e4dc35877223e87012e924c8b0c77670b65810b0014369add6dedb64c7df628c11abec27d1d488d9368ecbb9eb3c4feb52c9643a9d50281a582a06c52a69af536515b791542a4de552155dacd5d85b3b2e5744d00d72c20d92d2e54b7c7fcb41c006a6525229dfddddddddddbf8582fe373c1e514d2391b64da374f826913827e81026469718fad825d0618c4986d0db8dd878f3a0db7da846ac111f7bb173d9512ec372867112d5f97719e652bebbbbc3a4a74ba6d3f4933c695de863e72de72ca377d26235604f2d77b036a9bab4314ab9514a638ca1551f53bfc5d02a29bf799cec913f33a1d4711e19c340aca947e48b7f133b7e189b4423147ff2611c2a124aa93e8c44acd587b108a591220df9759254b493e9439a52acb91f9e76fc169005ac47644d65528be68cd559018fa000437de2a4c8f6b434ad144f8ea255d0f33714af234557bd299ac5137d26bcb22a7481eecf8eddac4273a6cea64b68bbceae3f49155c99dd7b2f460d9148a40c93a00faef56ff814da610e420d75785752864da14d06ed1cc4e219dab3a1edcf4214e6a06dafcca090330f9acdcaac737c0285cb44a1adfec0f64352c752d9b165d7dc0f5b35da872c7684a1a91124a491becb91b8d73e22f4bebf799cce746f9f8fae25fd53bf57fa0163a3c1e8327eb46c4a2001b6b437878f7d29b0ed9c1b8dadf9516abd7d3ee0d7ef27f8167cefe31ee747cbc6fb1f3036ffdd87934363033ece0f6c8344fd1f2d9b4f96c02f070525d8feffc518c37b209e61f8379975c07b8241d8bff667e5eadf70fef6d7c7e6bef8c9ad5160d71a65d00becdab22fe9cf68135dc6de6a2b2e651829df944a1976c3dda6df364ee33830bcafdd2769f4febd1fefa3f2cd05ab11122a575995e160d2ada40bec4bfa54be516995b46924548a1a91ca37beef0e1bb0d144134dd874bf6915045afe0def54193657b6a656ab130ef5ad76eda93c95a7f2acbe4ae4cb15a8028120a8cadfcacc75ead1c9d774ca600502e6aa53755038d49762a947b0e49a53735a5a5a54387a448da811350a5766a8dd52715a728d55150ef59d760eaa4c64cd8a26f26585d10aa2e9f267b25d9f3cea3779424697137f22c35656509c5801517c31ba9ce83e3a7422fb50211594154d5634d9fe28728eba5340150a18e215ce4ace51b729ff0aa31546dbff4f4c7905d10aa2ed9f6289149916159d3862da2a320d0a2a6d29526498f6a6975fdc9724a38bc9742f49755984b064faa3ba2b88acc814880251232b329551d90a573f1a44ef56a63d3d5b45b62047faec739ff6a8cfe39ef492a469597bba692719b68130b4b669a45c43bcd1407a04cd215dd2ccb0393557beb12005e2ca5487ead014b832e5a13cad56abdbaccfc7fbd4e7d3fd0a8cd3a55a994d97eb3a6bb1a0382c328dd118c8a1befc7ae5399bb130e1768b3c670b57bf89fab6ed92a791510a0ef5915c2ce122cf22151cead3b6ed7959f2922711d1f6df5e5e32ccf42ff9b716c7fa7cba4f7d3edeaf54de5b1ddba3b3f1f6bed9cdd4a3e63c99b28bf2a450da1f01a30426cfa1a1172f5eb838d4777b26cfe47941e4459e40403060c060c1a13e3b63b3d90cc60402234f9da91323468c1787fa6a111111510c2631b21f1dc5c4c4500f7259f67199c72889c93e3484fae6be1f11d853c0c3e3417abcc785fcfc1091911dc885437dee31cf31fd49ce66db378fd2bbfcd9f4c93810d7719d99990cb33ff3c2a13eb94f9f4ff726107fb667ceb0783cb43ddb6938c47e9c2322c043ef95307c21bee84d3338c36426cba38d4695429d4c25ed7599db48abcefee762b132a37b65265fc6c0e2c5459ff17469e5e39fa20ce9e3afe20cfef82c71a6fbf8aff812696c1f8ef73fdec60391b01fe94bcb718fca304e8292096984441a7d21baf8d76f050cf22596b3324b42675f2deebd5fdd2e931033df6852b4a9d4087656fa9b04d2165c746c693ee22e7f15330bc980f3cb42396848cf3fe22d37daa40f593c9bcb95613be2d196efca3009e6233b5af6bce1406c5172b4ee68d9f3e57d3bffe6206ff94a931ff988cb08118f725016729988a2b6da1a8f6a3cdaa05cc25bfe2ab22cf25791edab70e150de8e9f63cdf63448da87343168a65467b266035143ba25c1a13ad35c8ed7827be5fa2db88fca21212129d4e2f5ca30fa2fee9b5b56020202227d2b4d64742b339dedffbaa09dc1f67771c9f55d641d0ef391b11f68d92379248f0b17dc4b86d57fc93a9cf3c17f3f9fee3552c7e299a821596381e48b3fe9878688460d60f1582059b3f285f8c2e2a16018fc25e7a87b82302c5c5c1c3deb4340bee866bc891a029a2eff0e63a039934f324c6e4957664deaca2ccf393f1048d096e5a87b653604dff6f3c15f3f19a30ba7d43a55827604e80e576636e7d05b7a13aefd179804f8fc00e32f340c160a7336d6c8fa5595ec3eec3044f7fc7cba979f4f0eb6e9de7e3e392c9b39316f71385b909c097239de92cfc5b61e6fc91897e33271db9c689fbe0cfd1b2d57bf70fbd97e36213d3a64edf8144cc198b4a3124349ee6f3d2e939263fecc196923b720e106b4e596439adb126fc9adc85b2dc9da726bb2e576b4e5cb6749297f6b427464c4c46588e46f4b5cc696b6b9a4da6f208713b30672316f492eb6e56f462e136eb2cd84cb7cc4dd8e4a20e108ea7e2dca5bd25b7204fa77b8cd77258af0b31145d7249244d076472427c0c20e37a22d7f93d14d36c17013daf223186e435b7e6c919cdc50006dfa5bacc5929b6a13c7193967eac777f9a1d6b11f6a1ed99e1fea9e0de7786b8b1ee3ec7c64ce74d19f5f887578701b09e2d874512ee86823dfe6f38a220da38972146944299d89f68a5c266ffa9e15e20c9559d8f40b9bd20f75067038810d016fcff0dbd4c108c81d7a455e5174a1ef4a748862b4e9875e9191cb848fc284cb50088412059074abb3511a697451020c44f1e362fd0a6a20504aa3135abc25dfc6f7964797bf0e71951f84fc6a5d82618d36ee68c12d27d8f296af407b0b1c2ee371089aeeb0c5d71d951041cf9644d078472427a8c2f68f4345dbdd6c9e20b4b5ef2a0faf9463e68132f6f2b7cd039d0afa658e96297da85fc6f42773b4064b39ba9f41743f3f94b192cc29c96f882242ba83283d0fbae791f69dcc3ae8e3d844134d3481b12c81a1be9f11f759990769a3b7a05b61e9f1a70c20beea5520066c421d7729d48f411e746b5b8afefafab72f457fb459fd166b29c72c8847bae15ac6bc85239568991393a195f0808ec7a2edef47c00064fb0e9709652c012e13c62105b84c4ce2780cdd45addff3bc10f3a0dd4a7fda5b399754a654e9f56fa58fa54bfe375cf5e1a8fec7dba84024bc47756010de9fde3ff5a1baeeb1d779de7bbef1407a0281c8a62fc696f73f78e00f4074efddd6de47ad3ded812937e40e0402e47018897e7019d2fb03e1324578ebe3e12dafbf91c021222de5981df156dcdae31d7c70190dacc15b7ee348cf0f6350b4b11f2c09221fa987ac96cbc092253c094776dc3848c4ff816d90f097fed1ed63c11b2edf8b34e877130339d2a02f7b441a14c739136db4eb60933e69e5e2cc75791288ec941d839250821db30e78fbcc990be28d14b5882fe097dab7130395d648a37a0fea5f33b0c5968b2bb5525e4b71c5adfb3488fbad4823823a62a4116dcbfcc0263f34c913db4b3b7ab879b1c5b9dc41ab3da17080369d10c22ba93ca0d32943640f05025c7712812db32440e2563cb44d35014c4a11713514052c3e1551afa902d4962cb0abbcc09eef5123ba29e97b0f7f4c7d542a3729c8d8319c01c3c6f60f635cb878d1b8ac58d1f242c5ff0916db3f5c61619da88418a7423c37aedb3e2f1220bafcb52f00feb8e5b5fd2d8c19db9f00f1c80e130c65ec10e320229e340a5b8c34e2c9891496fc5085daee1f7aa61df3f60f491b9576def88a2dffdb6d6f85a9fd5269f9fb7589bd587d6ce9de85ad3e4aad5bf58fdba9d3fa4ee75c12658c31464a65a28c514a19a3f4a6fc28658c52e2df36b9c548c3a5a431d28d4630be8d34c690c70df729e8086a6fe12f44ed282595524a2a258d2ef12f951405836d873d492f1fc719ede517c2eca83dd2a77dadc73b60b6740f6c46f6fcf885f1c8635cbf10dcd165fdc08df4a1deda05c3fab8ca5ae58e0f86b8b4a33dd9f13530646d5b2596d65afbd67ed4ee8847b6fc6ae45e984bb3e37dfcf1f77d7aaf8cf12518fe964fa57c2b290feb2dd83849df82f42fa63a76fc2829ddd1fe0529def1564e214e474e28480dffa0b820602140f807ff142188be11169d1d2dd96aadb5eea95a5fca79fafaf1a05b4a67ced82377f9fbd12c810e5f3667ba187e23160c87d87a5723ec1733ece471aebac331d96a2b8a4639525941ad2cced7a53ccb943aa94ade09b595a4e12d73574a15d0e2c81a4bc40e7d20ce83a14e61814545a5ed6466ccfdc91737673d8ee33297fa685a75bf69ad5be2b68228a54344e96f2e5eae9e548b2e0a6469e90bd10b7d34e99575b1a34df7a4f46544a47be9bd93a88ba574aaaef38dc8366e763116d174e96cff169e9775b12210bd0c071dceb0173062bc6cab1c88a131ca962bbd240d64e13efe963ffaf2738da4d58f08bd95aef6d1d8c21f358d542a95bc97cff2c5e82a598cb2e5d3f5f604e5d4b607bf6833a79dd79461d4566b3271a54c495ce6b4af9954b5ba7d29dfd027fd46aa94cbb06d036b13522ad7d96ccb8df2e15c4aa30cfc2a2364a86894de919ec6e88253195655dee3e5c6f76aa5eb07f48aa562b1582057fa56bb1655a24a548958aecac495eb513d62c18285ea72468a86b8a1cc29a94375a8f4a58a86888a9254a12ad4a24586a5e02a50fda93ff5e765a8dda2b6c835a8480d2a7da7ddc52c1159d332225f64ad9f9625a2595ffaede4444ab9f229ef9dbce79202eaafeaa0d49c13ef44f6a939a855cb48cb48079a566088ffc84aeba7f5b3fd9f556af1b478b6bf4b0de2926b4feda15fc5316d17b9c68ac458f2d6525d1713ae4c8d8c5aa8ee0b93974c8f8e9ad0d9acb584de30991615b5c8f83716da87bff479da6f56466ee340d2b7c83778c32c4cc2f85df20d066912bbb9642a442281f35de49bfa537b916f2a4895802f321da2434b2811110c0c4cb74f9f0fca9b3e1ffd2a304e57ea65d3e53298233428a8f4652354266b4184db319916a1f4a3a56fdb3232fdf9297da420b4a7a7f469bb280594a708e599c930ee67b6df5e70a7cf47bfe9f34179550ae5ed504a67bafcf146f9684ccf4aefcdf2f746b8adee9297d2a1a1406832d5993163060caef4dd222222a2194c66e479744483068d185ce9b34132998c86121a790ed5d4d4c470a5aff6d410a9c91308a8468d0cab5f836e57723f5ede488d1a454adfdcf223022f21f2258a8a9830a2321491e14a9f17055da1ed2f5d567a6f2be5248f831994cc907da8c8900d2e86b66f23c3eadba0e14a9fdcf9f3d1cfe9fc37bf2d9a332c22ae68fbeda9cb6c47b0fc228f83bcd9ca8136a88dec4040375c32cc10f4b297c91731cc8042eb86af26a17c382828f939fb5c06b7df6e482e9561db665d08e73f4ef1ad9aa4cde89ddd6cdca0f36afad5bde7eb6fce219cca4a8b106fdcfb75382f1986f1d7c5ba9c2e87c8d62ec75bdec53a1c22189c9cf24586cdc75f17abe01be9808b7c4387d3c55c06bf7f9753511986f1bd94821ec47bdcfecbaef45aac5140162b4be9e858591703c1d79f14420992c1c564fa325cc7733cc77364e08fb1443396a3a3a397bd118c89b6461902b5b0fd656432fd99a01fb2888888688626c3e8d3f8dcb7b78bcd1916514a47d6d8231da0fbb37fe60ffd46e8cb888e1cc99ac781122290e88b38cd8c183695c2ecd528b4a674e60c0a688fa6cb3fa593b24773a68b4d6dff24c32cdd927403965dac8bcdf9816fe4e888921b4b329b1cc03ef7e9ad95a604a374a8d42adbca925aa21a110100000000e316000018100c88058361126692e60314801674964466589cca931c466114c520858c31c400400000c60098a1a12105b90c4b15c608cd910d66164591e53f6604a1b7986af3d25a5c52b834b7e17acf757839825046610bf935833ce108821af39737088ef5ac6ce386b6bb2e687b5a45abb2b1c4bbd77bd0f15a0c2e4fd78e5ed676f979fddc85e68f60546be90a1891a370d363b63ac95532bf10f64150f5dd159d314e446df7ccfe8afc3ae4ec1a4cc28b9433d4527c3069706231f42e941a9e935cda607cd426404049c73f17b56a14618af06beb4c357b8915bff9dad9ebbb95bca8cbded574545e6c555d0aa02b44d15fcaf92b137922fa9a30a379d6f74acf8f94e8b3988383ebcce821bdb8c902fefae64875c5c637756c58615a9dc5d68071bcbf14690853b654b4b94e5ac87fb9ac79663fb1e5ad6d315fecbf31854272f5fff3e3018f293b29667026e18a1244fa345ba5b57f5807dfeb22beda1ce6162e122e7a7b4312076da0604880c37b99ff973764daeeb35113f580078a840e31ac640dc054a9975e2f9e93da943d4b2d3de6f55b7b6de6d3fe77f8ee3ce4d26f9c6ff9d5dca24accf7b19ba78237f2a89b9dc0e4d662da27863ed54f226cabf57acc95af55486907bb92341909ce9bc38434fc12c3cfba49336b3bcc995b4027a1f35d87f8db5601ec8065cc7467750639d2776f2903a05dfd80ff1647893027e86c1369de17c5261a3e2fdddca60deccca31df39bfe6421c46c6de310e3f3de65d8de03cdcf4cac9b3f94a02ba58e8df143b9c41178734d0094420c3eca3252e0b76344d6cf7b31c7d6d3975924fc827be3e63fd3350ef49e32fb34b3e6a8101872a8dd7c68939645570b18ed88465957606085c372fca7e03b028ebe4fe5321f77e18466ba6f91c9349341c8f1a9265f33bf530d25bdc0bcc3f894327eff091c9d7d4896b52c27bc418cc0c11f9e635a20d0df4886a379960f261fbee7a25abb010e710dab43d2d11691f227a024b02454a8fd952453bed466eecbf14f6f22a3a302766c5e3befc3f427095ee4b2e70557d954bb8e72b52ca274a371bcfb2ee544e7c683b0f9abde09436d9de61172692e9b15ca3a5cca1a707de00d20be80d3b02861bc5cf5a8447730db0dc570abec3e082af5fb42ebb4c4f164fec27b692ce3c2a257187121e37775463e309a4c0adc9add5dcaf4e729c7a43096c1ebeabe87e4114fe88583226b917fc0e439da0b3410a7e4fd60372513c4e5e4ad6c442eb0b26a244424d6de518e341525c2d377739daa6cd2843e2c48edba6b5be23592d2d274b7fa42b7b5ee7ebd96817227e0bb1450e9b7889ed89ab68576e9f0ec6800664e03f51041a88c46678d1ac4a2a383ca01c1f3f704d78054417899fc443faf4aca5d256c4ad5a3fabecc9326f1499f60f5dda52218be450ffb8f0d0c1d2db82a8db7f22b0d1886aa76e66087173ed0c29126c294b2199ccbf0963b1cd2f5538da94fe0d7ea8471133925939a545e4e6c812c55844d3602a64a6fe8cdfa74a643b0ef65092b7adec1b86d1a1b28b15c50a78b882f8735728b047748960f788452b464ff3c727d21da5cc2e71cce474a7e35d69c5ba272d41e336a0fb6423c012aeb71a6f6d031145c0ff15ae62aec1609343b0ca4db0f176b02ef347ff82c3183b8aea232118712fea51a546dbd782d931f9211bc0361fdec0a846fa81785747f8b1171bf93ad8cddcb6bc840c8811e1990462b3815ec0ac4e294f552bbcc6d0d66a0e6b5edbf1779dedfb76ceb120b588959cca9d7d0047d579d17ac36a62c32e5b86febc1adf2e947b17fa3c1b0a6aafcf3c280055a4ecfc4476d3742cc8a3643ef9da2061d0e3c7472fabc910c99a91a7fd1f1a2fcd487b0f21334cc43ee2e2e77e16a735f0262dc6ac70d4846cc6b774627f2087c5119566e4c25eabbf291adcdb371e2cbf9dc1d479eec3b6bc56f178ca787de7010901d0721afeb4b1790609f236e13b5ec2518bf9e5aef6071fc9cefda3b2a8e73d8bcc46be16e6690ea9d4b4e63d3551f9ed6f72ddd844fccb1032be4474a6edf7a300bf61d9daa26233fa1b89dc82b6211513fd46e2fa5a03124d5f67d98d58be2f704d79f465cf822f6ba6fcbd35823e5e8ec0e468f8477199a25491cf0670d7a9dbbd79d60f7b6c4faa7a9b5ef9a5bfc6a1756efdfbf37d2afc3046440a65af752f44d8f687f22e2b93724d6ec6e4bf7528bd03f1df81d335cbf714fda09130c11d1385b31472f6dc8d1db16e4e4b52d72f0d68ebd786bc16fbdb520b7775b90cbdbb6d8e15d2bf2f0ae0d3f7a6b819d5eb6422eaf4a8b0d575a7c6302ee6622ab9f99a2754dafd301c13ccda7bd1d3b293903b938b75041cd50340c49b370c78b891f3a7d417324a0a3962a24102031a4f0bc5c4c1dafe0f8048ac3173a72bdfff2dd5baccec461a26eee982d07b2336aebe13ab73058bea38a0ea70744851dc428b8dfa805dbed559af0d0fc0a86c67c1014a83af0e3bc46d3a39e649b395dd88cd964c26a1aacd719737bd79a2e295289da75c586b85dc60a77712a84ced35c970abfe9891a10970b9a5787e912382fa1f8426c76aafc0f023a1251e4548c8a3b82064cfff35ec9f28a88d4fa160e87d88f6e7c129e7bf7b45f23f4f095d245f5cc1e783e8947d07554982df71c1b0fb40c697486f99c7335c1b2b1b435cc391b4cdc2289d175db7b54c9d9c66fbe419ec2816a3249ffd39a7d7411e9e6f7e96ed51a7643cc27de45060a711496b8596a6d44e2621f436874454abf523be429fdfc6240cafca8d8ea58f2727a28d7c5ce53c6098420b58edef43c01c22e6e334c58030d1e8dacca85e1b64222ae68bb4ab932f81a0a1e79ca73abe34ed104a174f59aa0514decbbaa79ba7df2dae8dda7c0880c5c9fccf7cc3782a52b8adbbfc76a616f8c7cbc0fbcb5bcc132d80fd8e99c63ee1c68cad17b0de94e308907eb501c7174d0e99a9d5a2d34f63d5a2c01ff015c567cf52059c4936d45c7e2b65aa84126cb030d2960f1f74e71a56293d8a94c319b88e877de275859f2e1da534d4df960df54fe71c7fab29a16440b96ab617abffbf98c41ca95bfe97e06775373b8718044441e07bcfc94d79f1d05e5d80b5d0f86a1f4b5e54fd25f959c55e4ef568459578a7d567449bd19e8875d253661751f608c7323656b8d6d3346ea9d363c21466246697ff86871ddf93df964c2bfbeb85d32f8bfd9247acee735f9380577230f7b6c5c5ea39893e8dbba11b187c697ea6efe4699df97b0a55c783d09a3eee82bf78840f8e2efbbc744626ac4f2d43b640051abc1f81e04d483b9c9be204aee033057f80c8f1ed1da93620aad7080f12a35464ee95e7653ff5aaeccb288b68e2db42e2567852f215d4140570adec52c88caae661f60402fb00a0ae1be1cf741e0a95aada9456f3c8069f65ced71013b6a65dae8b59d305c4197df2eb11a82e0e8253ef37d2586ff34118950e25ff12923e54cac9a5dd089a13ef1dc70f572e6ae253e2dc4e013e2fc1b9744481ea3351aad04d08ab0f006a04eca36f8d41f3a10df26ea4e238659505037aec9a99f0ce2c7f272bcc6385cd5a42baf93c7487c2b3a6eff9330150bb839733b0ed311af20adb9de22129c0483c70dd98c80d2390b17a09f363840272e5b1bba57e8564dabe68422ced879c08b313273f96a06f2a42f11376f65711a867a572c0a2dce53b7538787a7b73d5a5357d7b5230b11b01b3b15e37885947f52d7c7992c03e850a1ba7419407ea98dcf9b28d8c1d1b6a7e5b23c608ed3c7c591ab8a23ceac7f74dd243ef47ed3b41eca369545e8eee6a5de7467a77fee74c1b6c706fb83005a8d8f4d9b2eeb3f5d9935e4822a8eb205e05217c506568d8f7a80929723fda96e4ab9246ea0b66f7ec3f2bb1fccbcc9f6da441de1c637fe1d477bd43dfbf5f38ea6f5a86ca2b65604ae4d5919fa88c82ca0b7fee2e350cabec8ec3f68dfc77a65330766f431143f9a81845052d4f0f8c6a76145050439c6e5bb5751dbbdf1394d7359d1f0e181d80b7c85af817e6bc99f5fa0a705d49ed23d83d88a7dcc6a8a295ef1ec159085f2a24772e4a3f368677b60f878baa63586c03021a569f9292ed066181fe3a58c3d41e3296bf1103c1d3c8ab2316266eeb570467f2614001a9fd483302d49d4d0e7aca9fe5e14ac0069bdea2046800ed53c4225571f3bc5d3f569ccd1e05d1b674197b778dbbe7da3e43462615988417210e22be1cd903977bcb072b50d71e30e37d0a8d9ea994ac672706bcb3ba8b1ccce69be850a589418328c40e35d4bb4ed211bdc400ae09eca6948a940fde3c8b1a0cea69c7553b6679ee850f322509bece57a660714f5c70919102387aee9690ae91f150e30a618b7608d61aa6087f944f1ddbce6c86579e1f0c7ad8494d7b436c91f70e5894f10b3929afaa4e9a735760575ba9566e4a141356ca2f51c79bc144091cd0a017bce2e945466cd790abd73693fd0c260806f16d65ab0b8252957d93226544bc66e57e3d399af4748dfbb16d2a83cb3d310636a0f345d313b941b3772ed273220a1343332c4b6fb89478c5d2e048145dca6ff8e010f9e82d7e51a293642aee86690204560d1265b4d6304571d2c25d0188976efd09b061f426e69c24016637460b048e19100e4b6d6273004763410ec557e6e81782781a88097c1c3e2c95a5347505390db0e280f12befc2ded72dbd83a3f314461200132bdc96d83ef114a87d1c8b46dfda242074f7fe6c404a385451e662c868eb0e0b66d4ca5c5a9f63d1b176cd7141c3ff352e2e036f9c18f59932d6adbc65d67d7c43aacb81d6ddb96918557e6f6e5a4bc6fb3869298fd3ab6b934d061dea6b2f735466d444c19a19c96a226361ae23fe51538a114636fd4461a2704fd321e2e5a857b2168711c62da92b7e374ceac54dcef26d9618f4196b55e2593a41a8f9271375621bb7bb176cd39f118f6ecee98dcfd4f75143cb7b845a260c05d25c2dc181c2a43ac3d55cc83f4dcafa90867517c4c20028b1a0fcb85f726e0c224c4095a6d179e8498daee98efa936a3ac170d687736678f34c4496c03650e2791491f5b7a5672dcf911caddc9a5714bea2e74ba1d89320ab5d42cb2def4ae8e5e3de81d565fa9fb1a4b2efdb8fd4c409a549bf968595af6ca8af2e29491b0bff3882353bc6a42f4bbdeb95e5a92d889bf33fbb1b022980fe7a9e2ca7b87dcf13eb87e7ad84437804e39e53b2bb8975640dd03e16cb9b5743bfd1be002acf0e8a87f23ffad6f645f99bf95c6c2cefdbb716de4bcdb4cb583ac84180ba4815c8b3913b93bf7b9604e6aea9eb9aed72d944961aeb65d7ed40b493d0d077ebbe45b4ca4cc88ab34909d87a3c51082b8a7c659639cc6a3a31c31a3d69a70f39c087b8ca7354fc884182290dd04f5a63d3e3f30a49262e4b59099b131e2e2003728dc8c29f1b293acfb9b4395e58d5577fee5681ff84deac96954bf817c4843ce1b7820d30fd5ac842d7ed0f8d201c50937f49f9b9ce7c2d9a4945ddea446781114cff9a4625f6ceac9f0895dfd768a06eaa27d415d68893063643d2f9344a331110ef18ec7cfa5ee5c5820e9090df948377e1a4c3297c7b7aa89fa9808037e52b2e2ad703d76ec70d9a35bd88b41dbe6bd615182cbf04a08191d10a30cc420bb71e47b28f8ea31bebda3f1c035e3eb0338bac946e34f83cef6d6081ab9a5ff1b4a238acd3a9114396c398f26ae8a8c74017568b41f3835b838fa5f2317fc19e433ebb1505d4923875db2b920656a278ebbeec267561b64b914771ada31d2768eb27865a5edcdf36dd517713c8ba78edda793c71c8c0292732915b666a236ce8bed98c18c1ae4a4b9eadf791d1d962bbc7ac3da3b04eed9a8313a7d60aff30bfc6b71b5970dee9af517efc348a5c220687aadfb3420072995e70cd6700d2e850497645bfb2402ae097e80e8e6f9f422e04c486203e3a706ff0813a7fee91505b64c03fb5f52a315631831b8e7cdc4bfc82cfd20148fd9a8d89fec1bbe1845c263903499eff555abe8176145d63e116ac5cc950cbe753bad9c2103eb255c3b2810f6e8868bb6c3647b76a3ad75a444868208c874a353640730769e281adfa025b9f5ff88f78fa8afeca1c90e80f4b22847c0f198c220db536d460538b35b444a39e48880135c06852c9e0da1bb2bd67b971102f4dba38e33e3279def79933a8f80d675ea35c48aab7b2d685e072a7cca54de84e22958f3ee769dfcc4ca94ca82623112d721965ecf1b68c58365d8ad662a1347ea2349c6a26b2f094fce0ac02b1f7208480f41032af8e0800d06f130ed91ab3a02b3aac53192b33cff3d0a5b5dd9473a40419836adb37f84d04648a48b93d7c27a72569b3c5703213ffed9d1366720e10f701b1f75c9f9772181f1b36940aa8f99f1152496322f1db3297b55eff3704415ff33c01dc04cc3689ab45c34d6daa0f8a90788425ba733bfec1af9f4fe031cce07f9bc58b0368b128b729d9c0c673529bd70bb7b2d7186f96f343f8515e65e0db05e12be484f4a97c183b6b0eabf7d690b3cb1a7214b5a128e65145a509419cd232d6ee810ca8f974937ec638af2b7f1b4fb1ba3e34cff75e2a787f992fa56bd6aed64a7cc08ec20046b65e9b71397eea1c5f3224a5e89ebefd718fcbed482de40706dbd4118f3fe9f43123f6d410a06ee1d93f29c02fc494d9e39d7fdec25c7eb2578bc7cf01067a5c4a14e95238e5642618d258fb1950858ac1fbc9918ba8dbf60d77c3f85bb861d7754a5f26e7773c63051b7230c5f0c428aae604cede5bf86a110e3721ddd8c4340c2afdfe3cb33653d5dbb4d81e5369cbe54f3880bda774eba6caf88be55ad6856b85954dc6e8c9509cb352adcaa62164741b74c2beb01f6dcf281403cb7f55bcac433f2463e9a65c8c457069a47d40bba9d9534bdb44175e005ab560f96d6e4fada5327b979c12b6a74f73c3c491e21eaa6c8b0350cc9c38dfeeb87357d1923b9001d8b4c20a1be4c8579eab526323bc4febe18782b582636ede5616f197f126ca0ba8d095bec40e32bb362e4d22893a9dbd8b9582df430bcd993e46d2928ce453b90113a722e44dde619a91a00899770619339607a5f1863b4ca6b7409f61ba8a24201dfb22ad7baad7f0d209207010638fbec489097e1161825374b728097c497db59d5802a60e3ea3646a3629bc6755b260602a2e802e6bb0188bda4cc21c634c33b69663012a8a9cb9bdab63db7d56d91246558fec99e2bd9f1d56d78c0d9cf397b31b93939b30cf6be3f49532fb7ba529d13865ac1bfa94a8407bec39984dc8378cf6ddd6c14b06daa3fb0973170864a7eabf9456227a519a7f1d7bb8888771d8d64df3a0330b28d00c9720ef43918667cf3524c2f62b9072c5654e0e3a7c1df68c8865c18a0db81c443bd7f9c702271d476264900f210fcf1f4c311b2af862e7111f4d53b9419542dbfb95285534fa2c60b1d0bc51c776982553939c76e93bd122cb940ca5e68be79dea6a1b4c8b7011db787f6628713cacd85ab27e6ab30cdd58a913e1b32d0d92011e0b1ad7f86c8131549fb6ce3eea9bcfb0819dce10b4491b8533b6bccd70363b01db3501cb2c2bcb38f248a81f5eb720307d272b48cc045a78fb7d61498ac6929e0cf2a8476d385bf6f275d962f9b11e3dbc7f513bf81b7bf839c962952acb8a242414761ae039d2910da2e8d4d02e4d5d1290c44eae06223d5f25b198f5d19733334f970ed586291138bc6720c7445eb400780b62f87a4ebc5d4188df83c2b5d91690cd51c5a5c75a046ed81047d4ee43c84f975ff7ef7db9d5ec131bde5fe8d83200f1948c6a60543c7fef8bdc8b9edbc62c4bc17dba5fee1c36c9017d2c0789d6497671c362f9014b1aa6a6d9913189a29e73f4eea2d81854c21abad4b80a5a5f12da9e5dfcbb3e648ee1af8b7ea0318d0ff10f1fb117685f7f8d1205c0aa347897aa5e1374d13c9d09cd4a85501ea5cb522ed8a127a0a9b644438b09c9ed7b9d15e39e476cc7013ac5c807c91d16ab49133e9fabf46a1cba71c133a5322c9a9874a6a5574d810d7bee667e88409374c2099bd6cd64a81d72311107acbb15286838179c33f891775140f0753418926a1d8f2df9d18b37e2289b43add57007f55f559091c7a36b8fbde6d17e40c36247ef13e08f659bf47cf5e4090da93192ff44c619179ee5f318e01e4f13c9920e8416644973d76be3f0f872702ce53e878a5c89b759219cc142d990a99604d01f950be5ed18b18be8f7a7651a1f3e4ff994bd3bfeed3b6d64b8448c7ea4ce87a4ee809475a781af17a8c69520cefcbf4c1435adc96eacc52283fbdd9857020bf860f16855f63cd9238cc1865529ecc30dd728cbad00e471e8476584da7135e9ce006159680b9461651dc77ec45a044713e0fe6d76d396c7a164ff8a84ab8586e6da888ebe312d92cce768f252714cd3be593d17f7c686850e73d2adcf5f7e113a2644c432b4e888655da3402ffa037d6c4c872dd69589dcc405459bb119641220448a00cb493e20eb60fc4e9f6a041483a2b34954220821daed53904252e4ba250df3ab0acae0fe2805873a3010f248bd1194d6611e41a0a510e5df9c31fc2c0e6cd26832788c3a89eee5319e3dd6ad7afc998ee5b8328ce678ad120f2f4fb884fd83ebb7a3a8128636883ba2258502af4647af9f2eba08b14e5e068323c5041acc6eb71cdd01eb70e657ddde894c52b7a1f09a3c63ae324e1393abe0f6f45caea93e232125de86160c99b1646fe508c54b3de7b4ec13271a40cd1f850c359e6557d44d8f6096e4e14ffdf4fff9d8fd21e5f88ea16fe7969445d2296758046ca94869a917a0f814a61297dbd4cdd204a767c973642779c931b0eca119884c45e12bee3aec62742d225522280acf6ec00aec7dd67a8239a3ed65d3adf12a0a9359a046eb804109656c0d8cdfa8ba41202354d06c3e0953303cee23dea3b371c9fa9971fea7df6ccb669ae65aa7d3f7dcc8e7dd8d8613ab47cf02d13a69be341857e2626aa860298ed5917b4d5e1d477d9b89934ba4d3dc722ebda398f29419c4924b3c22e5db39a1a0a7cd4ca655ace6c89355a07cb9e955ab8ccb17ab474fd9da57857e303ca897e5e01d29df82ffc59ed97e439fee9afbcc48b07eab54949f85f5d28ddb1aebaa92b197d3153693e689bb7305705e8857e2d1f5872191516e29bbc46a3b8afac71804176fc6a1798ee0ca42a66ecf8cc8294bc0222863956597a6d8d00b811f4a08c72fecfd860445393581ed96c0fd9fd7aaf50ab510260c514004e3b9180254d5db88adf97f63fecc2c4fdb0a684c46560c83cfca51f0a1d5b9c48ea00d33333fc813c8cda399a59c0f54adcd7ae769594aeab48425589b17ab57b1214abde60f2191d925c912df68c5f7bbc680de61e4883bccf488ccce78a0f8c6e7f8762befff7839e52325e7bada8eb7d31ba413d3430a4d809c5b71522b9114d782289fe562e4431852d8d1138368ca8d5d8bfeef5d4b10dd5e51abb88b8d2d654dbf7701723f521de1ea4719ed8c312d3dd6759524577413ef4a96df25ba7060c9c9645c81b64e1f65354b0a55e19e10623179976dd1b3edd9628042e21cab375e9bd2985bcdde7f5b676ce5b229ce12f2ccf819512ca69765d455e2228302a1a6a2a590bcbc0acf967a54ddc928b96eb9b6fc19860ca5245f28627ddc941b34934876f87ba941f9dc37498962d1f7bc8d5edcea1e2c3a36b84659e0ace794052f9523bb474aa6f741bacd7b45bee2ae5ac884a3134dfdc993986799ed0d4373ff5b5425bff2423ddb92044b4d0c0a27beab824b63e71911f720deaaa54c9091d4295c57b5284dad6d954016e446a1a73ef6e15d4af5f40a5de82a82fe5267c7947128f261d82b6f1a26161f4ab06c605666a76f0c1926a39a0e782fbe4aefedb30acef675688d415c2face3c7464e6c23074642f88ac7b174317b204b12910850eb1f8f498172373b20cc9e27bf3efe9982603454c0548415b043743454efe715f6560c5c251446ffa3aee97e2539f323224b3e3e290b60f689e56a5225f759b7ed93c4a53089f12174952d0f38ef7054a6e75ecf8367ce342afa2e642ebd9bf48284fa68c9cb99945ff9a85199d19b82c7d7f8caca964ea109ed9d2266fcd57c186d6b119b6a73c9547f44c957606c3d084e95a40bb9d7301fad149e78325bea0ebc018edbc5d02321fe7e877cd03945be66aad50ac9f17f657cbee562bdd6eaff9b8e028dc9756d6ea449e65ba2f7a1e28ab20adc6581987607c2441bba917c4cf29e4dd9720aedba3590e214f1ca05a5765edbb71829c8211eecff64f9a1e3adbf4eeafca06c71c5e0a505145a972352279df3420f1c30d01a6d4f3ac91278e1ece25f534d683b0a2141797564a37eeccb3379c2238a2bbe9509de1a1e7d951597e864e4cd36447d856d2d9c5d49bd32dc96891a6069b3c9f940b7232ff1982711472b1744a5d0c5e6937a6e2641a6d2400b5c3b611643c35dd100d6b4e7364fa5f8defcdaaa9f646c4bae6dbdd6d40091110febf41434355d11ffa3d185d76c797627db399f04498836983faf45059902c681dc059040dfa8d15db51945545a01add73d8f135cf80fb8c7c34de33c450c34130efa05dd82cfedbbe8f53630e21e89f4e179e91d7f6e15e5dcb0997efbab7a70243d11c8fafe4c7ce12dd5fb392ce65944897810e97f3e73592adc93a044aaf19c3a3d5d5412f460500d689280960e6dc01ad92a32f08ade03006a09ddb1684746873c244a99db41ca912483d101c52ca52ffc33b5c7353b0c14ea6b75479c77c5ad2bf0c2a19ff79e0225d82398b4c7b9be5587343e12b7a1a3b61bfe16913fe0b9dd6d9bf9d9e20d4a24e100ed3fe1c37ecccc02b759caf0b11cf1eed71b225176613add7560aa10222283485d7af75460900c13faf5db927ba90b26af6136080422dab60066fec05139fc25964803510674451670afe40d571cf9d3f9bedd1cd9bc85165eea2c7b13af142e06306024d715e12957991cdf39e9b43ffb6b7c50e5a7b822bad09464261e7da2a17ebc12189173ece71eabef809729badb7bd21c2aaa38db9bf35d23a7d69ab19b7aaf590fa76fd89db352403474a5c1ec62e7cb9603d766ab2d1dbefdd39d712e83a6a5523dacaada6c36edf877f694b2eac034a2fa3184c5efb419fae17d845a919877f9330111dfdbc35247950be054ed165b377e28259b34433588d9918f08c80938db54a413938eab9eb375abe891e066a6f9ef1ec50ab3b15cad5854ab9c51c0dc2896085d4729cbe7733b08f42a04846368a39e6d5463b619c8f0cacd1e4a4aaff260aee8c9664fb59bb248e24cfd451b7398d91da1315bc2d45ef8ed1d13f64bb68e0631980ad3a78a04737a18152863c425901267a59321b840eb4d853fed058a46b43a5e1addbdb64ce07aed54a88bd0c6285f4206b7164228acf7d15ba494dba3357e57a84322f58bb568e138af67285448b5c1bddff152871b0100d4b19951349dcca28918b00752b40f2f058d99bb5c4c08a276ccea77463a6ab17e0f6fd58cb4b4cfdddec8b75c9b3fb54ea109165130aff7c005862e9a3411ac7424abe56f5b9e9ac04d5971f96fc4b0783f13681b4c7f2e2245741cc816d4ba1d9ada427a89917bd3c6baca7faab44a67a7d54c1f00c1d0dd56a9135d3b57b3051af66a5c11478bcd11dc25e92f412bdffe32675ef3d8cc42b414d731c89c06014415870d817889a17258fce5385aed158826c0bc60cc99a15289d940a8bd49fc1be8f99aa06e244ea42ce50a44bc2f23871c35bebd16cc6149bf2749fed415d071e1d8d8bba28d756b79cdf6dbcf548ba2867b51c9c2c2d98bc4584dbf3de2f9e6369afd1520251a84c6c67bf8e4d7cec38a8eda100701920f4a3baf5dda1a5aa39c77972944caa7667f46105078c56db8a5b1d05664e2d8b7d3f9952e58204beae8758b656abbe0f05221c47122e8a5b3b13e2e16e04da675ce7439cd464a9548b86cf89a9d1fd14fa1a06716ebe890068471e893695a49b422c6e7438c793f1c82811c81e062a91b6e03d3cf2243324803aeb914887e012f900f9a2559f491dd7a4650ac280e6fb3af1d3e0e16c904c416bac4144a6be0f4b4624884069823b209a6ff73404f8a195bd4332fc5bc175eeb78828706636d877937467a64b14709be3d6b0a8a77322f935b790304ea6ccbdebe6127201dc954edf782b04a6dac20ccca6f06b9afde8c9b4b520ebf744819afb3afdb6b94d64588130e8de5411685bfb24363348a3ec4c1a31a8632ff147e0c1f349b4cffccff0391aa7da7f23a61a81d547280e50f8b2c15cc1d0d93274ea429c1cf65843736f70837979ecdfcfa027cf5f8642e5333ac014723baaa3203ee9482e3a13776a897d09ca962c7c4c631f5ef9c0481fb85c79da01ad3cb50cb9b166ac9571dca5c489969348f60352e08b8bbec83d087e3d0dafee50d485869f9cdf772c1452aceb6eb106a760f297dfe61a4df77806df275624144fb44e5bebfefca97a3caee2bff37b7dd682cb5263c902b495f2237235f83c4b40c000b1496ef989b76ca6092799c7337c980a0dcd069e09287782d389c439fbaae90151a27dbf0fff8f2811759611eab9e88ee5881ae13b0fc64f86a150c06b68424eb2b70d1095722152e1c41878170fcdec5dc372221e1e29389dc584787966c2675fdc8a7700fa2155f1ab491bf54e0b10a3430531f6a6b19dc42c2f427c0d541b37f6666cf0e81a117c02ea799ccc8c83604db1fc23a97555d4f06e07c64c6a6e6a137fc53b68fadcb2ef74d4a689580c396f9636b662395b4d33bf50d12d428371c039d579641f01568ca3761735e4d549cd1766d23dd1d4821f370ceb10c3697f04f090f2dd7584946cec9aae879e134f6271e99cce5f0333a6011ce8996979bf710a041989b9433cabd2beff30d5db08d94c32ebe866d063b4fa0c62d35ee6a71e2d8215a7e3efded958f886f343bea58bf65223f21e2c300c08a4d34acea89b207855164656182c2be01911f7c080df16ca43354a52ee5c753e2497b684d00c72918c70ce7f25ed0648b0ef99305f79aa48ddea6aa88d30363398f47b571db42e723c046665b5ab92bc289b3f14c7f6af1d522b766c37501923ea93566d4a907853a710d75255b7b855319bfa7175c61725a054ed3f4b2eac5b5116cfeed9c8d92c6b9b8f470947ebc8bc394856fe8d639f7bfbdd7011caf934bb810ae86d413eabd95eb573360ca4a5d8b72a07f9b010b8b22f0524bec559694f9ce4cbce2f2223e0fb63a0d8eec9ac27041e9257710ed28e146f0ba23bebf25938bbbf51ad614474e906c3d84aeca6808cf938409478b31e607c76078defa1ea01a21702c5568b0a37d5fc7322061e972235bc3e0d5058bc7821cc55f3c118a018cc75bb8790b558b27725ae1802e4d6f8e24b04e6453644e10910eb77c2ee88502f9fb64ce170887a2655f096231361968c43fb24b14391c461d1b8cce6fd247271159b83356ccf57a02ecce7096824c98be4b1b4cdac965229c8e37730fb551076daf4695e3be9147d6b4839f6b66710761091702de41c846cc9ec4c57b80be0687c52c5d0950726098c052056541f43f670b41016963de8b364ac28077a83b6f63122111a81c11d02a70090fc02f7445545dc0dacb3884034b2b8356b20393caf011309d5df95e5c47b495ee0da52adbc80dc31a2f99911a4c60c9442fa3c24e8438eb09a8ced272a0eb968692785e39fa2bf528aaf0e090899adacede8297f8e12ae108eb1ee03ec6423565b503a1044836dc32330ce0aed1825a482106a8521a8c99c2e1ac34c1e75ed62df4c47edd855093201ab3fb58633884cf0f85d6b37fa144ae1754b4a0483468071d005288f1c83741558d26181f42763e5c9049add6fef7d480a9b6fc33c4460655c644fb00727d6b10a76b1f273557ac52b71fd199ae0a4af2b88812c665635ab2662c0e054b5ef8a2fb88ef1cb4879279466cf3538c0263866cc13f0719b35b5ca8a2b80d3a5f96dc5db1eef7f6b1db7769be230c76fc8f5047b3305390943f5a0ddd932f47ec5ac485c5a25c458a2d6ec6b5d611b59e85e9e9eb7ac786fb410f8dae419639101eb2e76c907b466e5eb11ed5f22333f047c2f714aae2a0e42c670089ef804521d4ebf881951b46316f078744dd763ccd6109c93e0864927cfc6c018630653362f926857e3143cba5501be60e4759e5939c065e03418d8e39b6b5a6501abce3bc0b66292689c32b456ff8d0f22c457b50f053d28eb5f485104c4c290bf1c10ae2049a8c3af50523764215c23b613d90d7362a7180982d1b6563dc5b85700bb42d13b444d7060e4b9303bf0881ae849177c6050e4e845bbc066f3804d68752a5264890cec60d0d21cd80d4371df16a2d5a7e15c8222867833cb7fb50b0178d93ad1eacd18800ebe56f1a059f2a076bebf51db5675621d4dea7d49d2e610a89ae0ed2d3ad89552d264910a73943ea5e77159f3d1d9e33100fcc9d8f71f63563a7a6859461692f72cc7611682cd1ca28587e41988058ee26ce29cf96928c614d79ab269f1455ae4755465784c2a05c7f9d875ec9bee38fc96a1395e9f410f2ca55d2327e79ff76d05be9cc21564952dddb8331f48ca99a9d8bd2df0757bb2b989859564265579eb3d51927bca0b13e8691f6d2bf0323471c04b02962bc13097ea986f068283c236c97124ee20b28c52a5bda1dd93a0a55936f784d085adb85254e6f3891de5ccc6c3a4e1c5664e2c923ce001e6a8724acdab85561583aaf66566a44e7c2a16898acfd9b5cdc607ddb2a80a6f3e1c09cdee0115f0a9eade170b5d0ec73411e089451e6deb0696854747f3ac305fee67511369d9fe61250b8933dc880f1351e04c465ae1a6e05f83b7e506ec88cf6195b177050d8928fec9b06a2b1bcdff431dcfeddcef77f90c32ef51b1f4995b884f593b458041f7f2e6f70dd3b80b78912f16c391ac61644a55648486a17e2b634d93bf43b2b805767b7ec85efff4fa7d65148070e3e6cb3b8c9b1ee12be7422cab0224e00be02ff7cde3182f9de4f7be91adbd84b02f49fa4ffe55721540becfd440fe922460cdcbbc0e254f0c74a9c19f79500c1f6c885cfca52809980bcc92485cce4b789a7c5e267f2572bd32954dcba85f69463212ee2f751426262bf36500a1c8f41945e0635611ad9d2f773d4ee5c3a2f04b169d9c2fe3941c0e3335adc3c99085340ce3032dbe50d2f2efa9702528254de144db737ec7cb85bd27386ca297e7673fcc8cc95ec809b48391ecbfd4da938c5eb20b80194de96837c43682fa26ad58c4c772c920f865703698cde4475250fbbdc8e68881f5b1df44d03204e30b204b9d1a62db6fcccee01465a2905aab829db46f42e5ebed1199137ddf07157a7a607b1038ca69bb054757776ff54d9c6be403a862e788762fb600c1a1c69a8888880280587997553a374b15358fef078e757493a9c77e14cc0d85d40b10bfd526e181448ea653fa9248151ba52781b974330a020a1dce5ce761adf002ada60b7ad5175cee1fd1f87a35a46273283596d76171f0649db1a0a08b8fcb3ff73a59d758cc21ecfc60bc4ce9c05ee37f3113029f8035028f65d5941569878ce1c959f5aa0dea1783c9f4545e01878f4b99ae30e0d479591cd7ba67a95c231cd02438e5d3ed714a85117f0e535120c3c03eab71ba26b2d089f6d3980b5e21260f32ed2dd059c53e882413daf10e19a6ee75e4876c5f3d3803a5d2fb44c9b04605980cf55d46d38864ad14ec80fcd20f1b0e88291d46cccc3bd0da677d1f2a412098037d9298f5c8438c3e7503ac2bc077807a9b558b40d3b326c1eb4a883cf1306cb6e042ad7de6305001c037dd3cc434f9b6788de94b2745bca2e60c8b48abc722c5648466b88c46acfe63c4234bb68b20208dcb5984ad0262fb87ba8df67e3646ddd81299237e50e13b9ea12d107ba8accf9e675188dc9692f4f6ee62fc1989a291778df9738d9ff47bdaa050991651d2c561c125b5c0ae62bd8d7028b6d790fffd51f5854fe7b4259a3305672baa36ed4db0755033171b79082519eebb8f7252b396423290d06c3096fe5b568bdca6c4f446aa6ed6b984b8cb2a6f101322b576dd88909e4ab04e4977fd9997e638ff54425d3884385eee79c7e5106df9196b735f09d044225157db1b4fa99f6945964b861c09b6efd5fb12fc8fd9048337c9c7454b2268c003fa190a57b632d265b9ae0c4e62c0519a73301432e29a64930a28887e409c93483d22e0c159f1ea8ceb9ceb2ddf20c652cb745bc523656e48a11d341b7b62a653d1918eaaab244cf02070d4e516ce45156df19674c31f03bba7c5e9487c30582cb6abe2eb1f5729ea32690053df6fa96d161908ee09e5d79d58573f21aba2207094a89d97dffdfa7b82d24128a9ad9fac03928c30b48d66127f8d2c643fbec52d47023ef370cd520ec3e497e6e35cca1f2bcc0e5b408804061286e4a930af9fed8f57bf9e8ce13a93ceb8b89417dcf04936f13cc645d838de89950bdfa6b0109a423ae2a898e9995884b9a42b1fe93d2749126f911dd83baf4e82b3bc6ddb58242b2721d66418c573470d8abd6183c0ae9ba9e2279042576a2bc889428784d1f2c9d981d33919b8d2e7c249285344c190a0c8e4e0625d769935d340e424f23d439c69ddcf14413200b1597b398b9889dcc5b8babdc608dae62cd80f4275c3b56680a6b2be1e1703589fe80d47ccce8ed084ffc9d5b74a2c761b751d51549e7d71b0948588c53e780da0042b364624a7904dc68a1ff5b0239a5999d808e4c3604e3783a5ea124d0c5828aa931163b7f16c001c9b3cf2d49212559814cbeb163eb5602623033fed1d4bd2b3b60cee11c951c475b7ab2a8d7d1963431e03f9949b1569ebff2125a309b092c66561b19f58b5b0749ef64de38e21754c6301978c85cdb6b1db258d48e90a74582e3a69ef16ab2810ad5ec79f0f2bdf789dd583cf4a5150bce9ca579ce8163099cce169eef172e3aec429afc7ecdc49867174791f8a25d467ca9f5764748a120023999fe8e7c9aa57b839e7e7ff9cb577bc1a931211fede988ffa9675782240ca3980013a5a203c64ac28071f6584be67a1abb53587d8aa0125287a97f5e89c50a9cafef65b80da5b384cb65df8e1dc552124bccc522572a98ac0503e3537ea540729bb7f4974d8a79c7c8a88233b6393d4dd9b02a0fda917ec3792efdfb9e1f302bc2b1216f257a38c60761b1ac9935309846174f192782969687635c42c4d2920d69abe2dcf68f34c9d55cc1ef642c62c5e04d8c78fb94010617217f46b7de714b14b2573e7b6a892b154aeb1184df7426bd48a76531a41e52ce53c549d12115251a2fbab7162967b40515ec4612f06c14b80188cb639ed2e5d2e06686c2f6e8d18fbff27c5f8c23202ae46c6c3821f42e20d6b717551e47680a2f9a0b4041f819e223cc7dd2396394fb5b0fb6882a83ffa5dfed1ce7ca8287abe754cc0d6a36dfc4b78e3fd4401879e2111a900ea5db6d23208fba0227d63cc7b3dda1cce5894d5f4033afae22cbb7f96cb8a081d541a830c78507a40e1d0f6d80518b55c9526ce61574daffc795ea712a3471328c88d88af83517b2cc5bb911d03db37cec105d1839c6eab02263802dff5dee82f33fc9108c7b7eb7fe371db709c9e3419bd7e30e5429612ac38e67ae831777a87e3d1a7e075cfed8f17b97489a7bc60368d1547b81618667f502d4f73b9e1b984937184a815d4ad7fd9df07d80f9abd7ce0e39f0f201df7350db83399cac31d997abbfd3a25f46a13e0eb52b8417008680b2167c64bee3ca4d49afcf44758d021d0cb81bd57eccb9bc36d82de534cc50d31ba23a6f2462a7b1db115374ee0beafbd85eaa9b8f1a1cb6297bdb5b3bc99c8b891dc9d5531efc2b3da3be808f475c0ff6baf50bd6c6eb31532b73e377f26306e82fbd95bcc5b7456fb277a805e9f5e7fe911d653f1c687bec12e6e0333b6f8c0ecca791b3ac3fe41e73fd083f84e2babe925acd7e60de122c621bec23632bbdabc07cfb2efa0671f7d80be931541374274957a73dd9a55b3aae7d9e80c7b075dfd410fe2d3ade450ef2b565000e2c059fc4d69b2a203fa1c4b4fa5f837b8f3ab644a23878fd06f1390f5cb7da53532fe948e5bc9049b0b8ea457ecdca52437fbc3e67d040ac072a5c348afb9bb5030c5067a080c980a027054f462028b11483cfffe0520b9a67700cc76f9c6100ac0cf5b40c05d80b68b9ed865c0523d77d1c6fd954969c954de02a435a0ffd3b6c36c401b28e6a6510324698ae29f02347891730979aa3c90567c187987953b0330c80f751e90641f209129cb8a1e20f76c843a5485f601c5e31f2956cbaffd038a80de7d4019c0e8b2a3b74bb4651883c459ba340a8400534dac6ad008026cf48c3b39fa8300c6892ed4ded3e5b7228331aaa4fc1f583cbfe1381290c7787c1b1abfa2430254dd24f05f510b20fea5fd77969d4600c903d4b61710fab6aa278f5087fadf3ea82152e7c2f85c2b5ff9c04997e343ea529d6263061267e5ced227d4ee5db97dbfccec834e488ab91623707a448147d82f5cfae40206446dbf078130b1f4198c6a041402e45199849ac765e346a95ed381e5b14b104702ffbc01a0534b600998695d2ee7e22d3c3dfb5b5b9cc03e05a8ce366e773ebbaa772314ab963894ead0076575e7c4a83a6f3708daa467b235a8f35697be5f62d59e61d567cf329409bcc407ac1a42577fba627d0122c6a53e42ccd8b165386920f1c4c6a5570f8e292c5237d096947e9aed5a9d059a562c571d02d920300abe588003b6fa70e6247715a934e1e754938d2bab1277df4e543218311a030c8d31c423b6cf37829677bb0757db964128f36a912ebecd070a49f73e24407f2c3d23100430f9b92050dcfe616b0c16d00c00cea17d3807918c9e750cc18fd8041f6071f3c0d09ec63c87dbc13b849e339ad67be128b4b74e48ba02f6029884e1920426a8d2f6208d38e8a404d75aa557d9bf216c68472b2f9b9ef67e67e94b1a72325a7bbd30780cd7e0aeedeb8323d7db547c0af96ac3155d77cb3fc1a1e8fb27f6fee44a3398ae2474c3e10b78d05732bb2ee9e954c864af46e26e1bd6d13477d58d0b9e81eef196bee496c39b1c6bc4c02e2e336e49eacb6229957232450a65544396afaae9bf203c849e729b6c372fab1f9461e1f58845d7621a132cb9acb0db8518fc680d02b368ec8b1f272ebdf07f72097493b0775314a8e3259c55216c91f86d9fdd6c756e7f9047b0444794c1ed73776816350e6aaba307ce7511ba335ba3664e6320df238f93ec567e5cdda1a4a74c81b44b8176ef8358194419f216216c41207ff77fa76c93dae7b9d6aa031d09e835f691a03770d5f80d9c38c33751830af74710584b3c124131f7cd9d575cd3a2c5321da227baf9a967f420806dea1d725765d2aea9bd615d2a4a4d08bcc760c5bc0bd09c1d7bab22ad34e4869e6ab7606091e1cacec0978a0840cac8fa7cea7ae229a507c74855c9be9c14c330b299e14a7ceef34971d116977728592d51977df96723a5dd871a246c1301b71a45b1f355e8468a5b7844c4713818ca729062119435095e5d3d28f61e6a655dc8636e361101721f6a15af7de018259b8b170c26e614c9f556dccc9d49b451243a90cf1db057140956bbc1d60767cd96825194637967e441a84a5967c1e81c71ec24f4dd4d6a0f332e34785ad6498af094e479d04e92990d4f942b2323a3f836f078346218068b823c78a84ca91d800abaa301ca943aa523481365664ee6c08ad0b9510ad2c2174fba21221837e27673f34bcc7d1e2e4c52124fd4143fa09336b292b847b41b0755b4655d4303ab0a0a974c95ae30bba3035b80f543381c6b068d3b1b4fcdb9d2455d324f8ab0b339a2c864e67173a8fe296893e936d728c36a2c20e70c3da92ff41a4ce203506385facd631d3d6a32cb90846f0f9ce3b8b177c69460b8e1e5db0cfac203b899d25b3c2a352cc04835f69a425da5bda9f8bd8b0076efd3d2912c5c69d3f55c15d21442240b910c6e09416c1a465b8d69d2938d0babdf554180603c88199c68864f9053477e1f5c4e5c543389eaa6256354ece7f5ae7e6737d9cf31b324d5bb8b90ef9d82a69db0ba15e3a96be850bd0c6d47dd5591e0d11f33ad1fd6ab632384e538e07d6c1731301b3706617670cff50861cc424f9416371c350c492b8639dfccd2dbd7c2c2ae9b1df3a6aae03df7ea115fd42a67537b93d5635490d22f3deeb0ccd92fd1679ec80acf994328674e61d382d59aa60a5e53159fc917dd822066a367cd59ea5d88a93ebd501a0f51e22c141eff75c0c11f97fcb529869c123a238255e96d8a429bde1aabadb073ef34b2d5bb36754d10250c986b0da8f66ae75e768234e3d1b9a31748c3e1b6dcd13e5326ab6381ba7096268b363360d4d8c48c87225764d784b0ec834d77a8d7dadc8bfdfcad67f0acca2f1348fc3b5229c1976dbec479ac83a39cdc0cc3cffaa785113b75180f5fcd167e4925d4f54cb541e231db025b0968015dfb8cc0167661c5a035b326b084d9147cf339b6bebb15c70057f0f3e3c528397fad3c755c617f78ad0881bc15476cb324a9627f67167dd8810019e51508be9785fe0c1ae55bcc364a3576089d164729e8ef51224322aca842ab2aec4be5f646cb6c873a7305601b4f6c22be82df1a05c40cf9793a0d4132b11978fc8d052ec802991fa00557347e4ab53f6d106d6b4b20bdd550c306edf13c5b261d54f7b05ce881d071bc1f0969420729e6432155c728b4c33c43ab8b7a30a90b415c31a8c9751db46c1ae9621629ba9649bc10cd0f5751a4e9c1236a6aec87410372a34d27d1f33298e8a7ddce29c670144f21db73f50efc679cf0b69decdfd7382242e57affdf3f81312486ff020069432580be57ab843934c4874b79cfaa2abd627a321d2eb0b2d574c7516420d0f470dbd4f3bd3a15c40a10fb4790e8b87841437bff9603fd6d87efe5c414a87b0cfa6ab914d184af6c51e32cafc68129cbced303865e73b17235129045a62e0ae5ee636c8a47a14413c8fdabf2c289a76cc77683bd58b5790e97ed968563fa9225f4aa47e5acb8d3c93a27fc70bab7479d4a63b0beece5bf33cd4ee3605fbec8160092f721b262e51cae729715c530fa62d89ccf1d61041c8878eec99449ccc48ff65f34b8b9ce18ded64ef6fc5d8d4eeff94076d7ece2e905e12d16d882e748d9d1d3a5b9073c3ea973fffab8454c8c9fbfe2d0b0718b7fd3220cd95b3e2f8bac895f901a5f812ff67e0009d41adb404cb9b174221efbb85d6b289519c21c92ad2465c5918fe4e521c826ab317dc3679ff976aeeba420b4ba20b80dc4615e83684d712c0a71be28c24ef90aa6030b6fefc190d2e80dd483715a43d4a73d56000eabef3b3e4c23d210f5db563c3511dea7b2bee8103b623d489da293d8f47be77d01fd808f1269fc913e42d0898da1952248297cd64427a431ef43d20681209ce347a89e03e8e5733cb3b22efc08b5d9fcb02bcff103e7d5e2e0f332a8d13b7ce09fc5f7a8996d7080a694416c885edb8bc20796fe4f2ee2a6a9e1c945bd98e7da3edc544384889ba051476acbcddd28122a563553db5ce2adf5b6ea29a4a1cd829bf99cf3e639d11f5c25928510cb796cd59fb5140e3c25fd02b6b970b5d48b0d686340a4b038130376f85730ffb1dcca2520898811bfd0fc050113e1a8bfd3175c9313401ad931568e1f4b1ba4c671e880ffd562cea29f437518384287daf08a65846fbbb15c57704981bb6966421e75ac0a6046b2e659e54586602539b2eccd2203e1c155a989c15069f8fe4791fb3da87412f1ee6490342dab4e230f0161563400d73f6f1121780eb2c142618aab01eaa5560d9aafb7c855390636cb3c027d1390dfabc415c257cde3c98d91146c2790201d8ea8c72b4341debd40607638518fae8c6071391985e174443d4e14190a2e2a0f7e9c9fc3c16c1916f40c7725fbba40b151e6cc682265822112b406a7c50bb3f49423462cd00a8c1617c6d629479891a46b306c5e98ada3e2c63abe5d6b4bf8b2c4b96904c2b569e7c5b26fd0c1f11285d2e165ba0c50a545e7251486b31364375095c88e1708184e27d06da02a2a7a5f22209d9da09b815a78784eaad01a4640ae260584e2174030daf4b39e2695a23892c3f01273a9160d5b3075ed48181f89671cd7214aa6b977796091562c572809f8889743fe679457af5185b738446a4c00334ce0ea6febcb99c1ab96525b909d19576ec4af74bdb439875e0ad1405e868a9052d9dbcfddd2a10c06112a90f1e6204a4d36063b54d057591b98caa9f5bdcd5f23947ac2189c37ab31c52b3424cf0ba310d705b4d528251d91cd18fef8a1d44838d272a4f0d6fd6eae9405595833b65d59d0233af9c43facc4c749c75f83bb9c1c373547338c099721b79f1f83247ac2a80f2118c90c546adf4457ed5a30aad71f4fe8de8efffaf76c8b87de22a93fcde68d8c06508578df62344b987a0b19125811a64d64d124505104c0ff91a73b81ec075e6b46aa587c51c10109a02610bcc3d5d46047051d95d9592eefe55a6e45b224c460aa7adb2aee380db4c7584512dd984b7a0a47ba33dbeae827c8f18d8f0081640bc1a82314312f34b4786ff7498dade0d05dce1c37728eeee6e0b821397c2326bd89f8587fb7e03ce9495fef79ca8295bcfb7a83f8fa0e07b75090af075eff124ccdf43dd87a8731a86d0437758958ca9c16e7a2932130e0ad2bbb75300325f84d1b69e3e58e3d165c055d155c9ca99c5ecf5b6e361a81bfb4fac05abc575032a5279b9569e2d1d3f5672b37afd69126e3e8e6df9aa3034851a98e5bc25fee5f6626d6c0ea4e16788c3cbef88615f271a4c35f320a6918ebc59ecc63817178369ee00aae4859eb3dbb86af9f86d199861a4df4234634a406022e056b4da4b9c09b9ab830213bff338a49f809d1023ffd83af71c64cc7046388309eabb9d93b49c70447e86b3d91fbe33ca6b592ecc8824c097818258e56b037dae014c380180c3725b48659cb1361d21d5579ad8886e4497cdba16110dbe130ea0504c4852d2dd69b3e51bb2a38749393e356e45cc799d311958409be7b5577c227cdf4b7e465549f434bdffbce2e944e18a9e09ba5aaf2eb16b3bda2c923908853bf424fe08c214fb80c1addfc2f2c7e56bb84c0c66be788c9807528b2100d9d102a2fd5b30d110ec04985857eeb30a610bcf0908b6eeb1b180245c5c92a09eca2d43d1883f54d34a6fe4a263297d96a9cf7c610c0ca0f5cfa153d3ef9812e7519c247e61fc78bd45b6c773b97f2cba644e8d53d529a38d7f55734498186fdfd5d9b05ba9959ea7c224dbdbed59b95811441879658266aa2118420f5fa2f2af868ea8173d152308124431752f5ddafdc938b3b6e526df25615948def7be0aa83ac8917a2febfa62bd785e811d71c40c41d2e7698f50f16098db5e21d18dbe0e166011cfea155144009a3e88e3f88034ce9e6ce8c1360d64cb74c9a3454f2cb1d1f7746046ea3dc35bb1e15b684da7843212e2c004aec0aecb94ba9c5eb4d35a9979baeb2c5c2b658544c4008f771ddcab083ea607abb8496adca72b0af8c8062c2c02af8a44ae8ee7fd31cdba0fbf55f5f33fa3715f6e116017b503b37345d53049ff451e580b5a5eb85785da96ea23dc60eb41b2755f37b1165913a081dde948d33b090931dbb1327ff82c9a5f55df30e898a7697bfa29bcc6a2a5fe62a7530eed6fdc81aa83c995e44e072ae02184ab897d64695578267864e4beeea9266ed480f5b323722acc7932f38baf9e38a069378780b32bbea243828781061a3c20c6c6ffdca9c8a57d5f622a592b86dfad6a92a12d40d3195342752e413b5eb8806691f7198194e565774ab11167a272090b6a28b0f00e940e1ab364d5e0fb0303600fbb89d8bd71196ef5d586063612c6303a81e938eb2c09b3f3ea7111ef9e9768991cd09e86a7cf6b3c061f3f8aa8bcf55b61f0cd614e4a09815b7bd5feaba65750698a43616ffaff995d4ee0813e0336189bc1af7bd7220ff03a9215b47c55c38b0f9c532a9954dd2817aae92d371ba4aa1de0274368a608b84effce7a610dbc86064456cfecf1f3de93c8103f2e0644e5277dc822119734a0e079bb01e13f0c63333ad2363885e9b49ebf928edb2385ad0c6872e125d281af2d506f2a332711c508750b575c9acf9c06568bec4ce010ac84a046db6c29a76e7cb27ab3ae63b7bca063b0c3b60cda1fa172b55d3bae0cbf07ef1ae5f18c13e9d2dfe6e622c39f1bcd57c1cf3a7bbdfd2f429ef67eebeb7b200049003c85f501592c50378b10c9dfb6d4341807b8fa98f3a1a9faed7a41076c370c074892fb4d0c36b20ff8d47cd46e2c781927a83504c8c0dc8ce49af5755bc0cbc796805369e01e50ef7d21c75d4a9b49777cea535513857baad69a6e50bb4895e9c0cf443a5cd5721f1e4e1f30a3bb6a329c834388dc0afdfa389dedbcc9dc05b7676c37a80afcf0ba6594a12fd1029244dec65e7f84b6ce1030ec7224613bc62d7ea319a3d5bde4cd4f2acef703e1daf62b40c88d97f8e9a67808bb69a8ae69c90d4d15de5d43cb0ac9331b2608797adf0ce5dcce28c3272d6965878e49c38ce7deb365d9f19956a20153a144933642566f698980dd6851c43acd490c17e0985bd32ed47ad8528fe7fec17eb14407f4013ac5e8045ff04053191c075541612bba7a68a178cc774704bba6667aedd49603918e899b2fa7b2c49d6ecac22dfeb1ba9b7e9c9b133a34a5e3807048cf455023107d564ee495bd9e4c5566b16ce6feab989af4b766ebef2c1e2207e08532f66eccc4dbdae257a9689cfa232b31b2c342f8e4aa902c6fba9e9629520e5e39768766f827e0962901ba707a12305aeafc18d6b4e2746f383ef1392e8852dc751347407f690c8935ec33f6a3eea20dbdd80c1465f2a5305af64479f65f5aa336be012b4315b318894434b42394549efecd7efe8f2f59b7f1c431858cd7ba473f17d44d62bf56436db1b4ee3773d58908b8b6fa498239e630702c030aa48ac06dbe94a5c8ad3db7010f17b4a1146bdba843ba895c7b4966401e6a3f92155678ed0471d10f0a205e689b2608b2cb38d087cdf03e416dea67c1bea1d377cb29bed13e450e915493f3dfbc57780a9ca70248fefb917ddcc9f276e0296b05a967144c54082bf3ac57285f219b42c76176a652e38039e0897b96be1935807d913c53abd971caf7ffe5f905ae1e145da44fbc5bf082bc52fa7eced1f94de414bba89906c7db322e0bbea1f160e5d81535abdc64c356482eb1e3fd217a97372634c5633bf96f09f8221a665fe24c2ed189de6821a5058c7c3eaae6042029ebe4a5f2f7947600182946f4d80012bed458b155f94f847e8a3ad5871c58abe820e3f39a1b35f76c43d52468d00b3b9d4a5f51f7af67de414292c1058da7d9f678305dc8e9572967b8bdeb64a1cbf47c080972fcec921e8a3ec8110e117ea5b4284ff74fb97e8596cff386c74bd7c0a297d5da1402d98e9515260986b5b80287a33046164d9a4f16991d2f36b709b2afe35cb0f6cb1963886a3a45e2fb913d42acf9859eb2578531f83ce3c603d9c37d26749a1eef7ec3a40e17baf202883109ffbf63d35811d817200252b39d7568674e72ceeedd2c9e48bcb19bda0098ecba82eae3d3c46597dd7df67051a1ff879ba3f1a7ed4d079dc0008ea9987f559f1090c88abc402b65fab2ce900fe0fb4d116dc02f70f34a3e4501a7f4abad81b6b33874b9abe02a71e34b962f145e39645b21dd8571654c008e9c0413abacc6c21e0d73bf446546f0ca723b365e7908147fab0abf19e57245fe68c48274f16b0f756c179e1129f5f589984d97dae206c7a7cabc00044562ac74e03dce6bc5fd43b1a507f51b5f0e8ed72813601e1cc3296140d8bde84f378a126bd2ecc9467af829ea05439b7a42bbc9048d2bc2b82f947bc0bd1b1af605d10596247bc0b8352347665c4fddedc161fb5b01a8b37e29be904fde4301462f3aab99510ce0af9df4ab8d18400a4064c311dafd0be285749878d1178f814d32c06a6fa3c382b93964fdfd36361324a89a54c4c47a8e7e49398f42dd39edcb049cac4eb5286536153432d9720418876d9cd5d696c6f2271b81324659703841a0309b2fab8a462cd4322217dfe0bb5430b6c3b78bc5106639aeacf10451e1b1793fd6deea4e4acad61111b958db274f939f27b4c6a88834218510dbc27264a43b4ed315bea37a135ec556e287b2036bc92b577b2e01d90b4271d101f5ccf9699e89cec5e0eed2ef4c95a8b397a33a82876d73d7ff0082bf91db9c9ca6434350f2f5ea88cd2980cb144613b2b76f161b20bd781af5e9d8024eabe6520a2b02d315a20163505627b08542e7a98d2a83f8111adaf26ecd4cf73216b04d382226c84c68a791a2312cc79b95d66bfbfc9968981c23029f7cc1a4069945d364d9fb350089348eeba4c3f62c4316b2d69ce946bfa698a5779421097399a8ee47cba4c4a3581aa32871013023f0e7ce7e0cacb267056b9730ad28860909d033ea47355421e1e66c61e711dbfcbe36c2016a23d7ced8155c738398fad4c268130f3efd8ca6458123902690a141677b1c83bb65205785b5446421165f5d4d5040e6d44de0d4f107846b4e940066f21372ed208f9c708a876f8df62739314ba66e715237e9335e7b83f207223ee634d30609efc75827cddb4633ab8fa9faee0128436f008b1805f7805aafdf75313111111b2a5dc32430d830dfa0d5aeca0f20360ba41e59f6c9045ad010296b289c52801d0971bab89f5a2527263b149001db65337166fdcb8bd6059f8ddb8c16059f836c6cd089bf802b0a97c23b0a8fc130d2adf5483ca0f000e2a1f0037955f440e2a7f4507954f440f2a9ff441e58f3895ff1f54fe1043a87c218850f9411ca95cdaa2f269e854be0a122a9f9484ca4f6142e5a37051f9274da87c93cd09953f8a42e58ba450f9a12e2a9bca6d0a950ff2a2f2432b6c5f54feb725d936960fed28288c120472815c4258456b147b46d5b04cc70a50831220014dc5be74854d0cfa31828a4943b3931d8fc7d9647271e11fbd6da2b803acb1b2b24c501e7359301f355764d957339009ad46c1831e3b8fc9639e7b295683043251f9a238411e3495411edc6e5c386bb6864edb8ea7eba97c57e56bac4ef5f9a5c64565ad8bca5a92d04b8d0995bfa5a684ca49a88c84cadf523382a6b14aeda6d4702af3468e5e8abd335b5a8d646c2c6c0bff1b1b0d2d069ff874ec3056a2f3fb2645f490b69ae4b7a3b5a0b5a0a4908d899a759f63a6f667b55ab940b53f6d8cb60ac0c67cdf9313d537e157e5e11043a150f683d238cbc23b4273cec9a6d9f5b089359b28e6e88546299a8959a7113609814d1cfa4223a5ad165dad302c3462ad569665a151d3342d346a3939dbb66d5b686c2bc4b26fcac66125ac847338e7e7a7d59aabb95ad7bab82f345a2196da4de59f5c07d76553a9d9d49c2f344ac152303fc484566459f893ec1f2ccb2435164ed7c3a8799ef3736aac19b35b1b0b953b8ccacd53b9c5a81a1a2abf713ad527b2a9e8f9d98b51a4f3b39f6c8c2b54fe4e1489d456655ba1320a8953b95bf5e399bd6ae653f9a3b1b770335bf822b2ec2c54bec72a3556e5f7cd3cd5f9692ac93a5fb60e2a00eabcaa6f18a5adfae608180a8542a16fe0c8da5460167ae8da8a51a5b612fbd4a73e19314dab043fb405e8f3c585e1ca4fd92136159e8fa8fc2c009b02cf4ad6b495870edcb0a6ad65d75831cf50d113d9544d59a2aabf20cfd862b0698623387ee37c67a3ce732e757ecb5167122ed6a69a9d92ba44d07054348d4645d34c8c140666eeef6954dc64e987f67919ede48c4e9332f34bceece7f699c9d1a818db469197bef92cf24bbbc0db9512c4698fcd107d78b4e49bfa1d04ff9d9ec7e8928b108a40bef9b055d1b972d9b68edc3e8524b97d9ae4cdb68962fbc8c6f8013ddf502e42a5ac844a190a95b24b23c1f8449fe8c131057da2e7c6207de271fb34c360133539e8d8f9a619a7535dc93e3d7da2235114b2eb866472db7a4496a2e8896449227de429b97d0ac9d2e4752377bed9365124917e154e0e92d68e0e9e3d4a2a3df5a9f4b3a7e707889c3c2efa7943e9bc69afab10fbdbf689cd104d4ebd5eee0e41d7c113548658f20ddf306a7e0d4a212a858f424496c20f3ce82c123cd129edf4413ac59d5f8aa5c9842c5fc54e618c73b3ad978d3aa3d14746d6d478e7d774e7e6f4e913fdb6dddc9442d2c747964290e47f97e17fe48c8ee833de992c850f1dbc88942167ba733aa06f6349d56329244b3fc0872e033e44cee8849fe9830f4999ef1c39c3ffde5f9537aeaac34650c9479f2ffeac56352b68dc3a7db690862f49f42e9df24e6fea5477fa974e6da7efd1a9ec9c89de136b69f251a33d2b4de54ba5deb983afa9e9be9d026ca223e3f4893ee3a9f45a4fa53b959ea3ef5a951ee49c4acf3741d8448f914fb089d23319e2a40de250b1d130669245e66ddc33ba611fd36bda3c3701c5ec2228b1a1611a867d34b18949a43df1378d6654db5396699b46d6a518a52ee5eebcc8f0a061ab2f9dea6e504b52b929f1f176a504a976617a5c1893ba2717667413d1aa765114066ba22a8ba22c36d14fd5c2c024b4267a1a5e07f3186249a69b51a26647d59d46455925b5a1d408b521298b52503472d564dc9d340881ea60e68378043c3f1c8f745a3519170c28c0a18ec6ed0e834df4f7283d1222ada9b45f95524a4f6bcaeea94b18f5557a1225725547ea8c460f4f470fc9fe61133d38fa56f074048e4623f2639389d2fee91f46d1f718a38f489f3af61bd8444111d94ad844456ffa1e11d93cefb15d8170557a4f346a3d5310fbab83b51ed6d0c0a8d069498d50e9296b614c4e4f65d09d9ebe6016a0db5e646146a73615f4926251e94b7a53d21c602fa90e52dd4b0a8402cc979406957ea712acab26bd41ada92648a825c9aa749a989874b789c945229e2a7ad7ddb3629ea1d239c272517527f2a2d239c27a5175c7462b0c70c619d8e75843c445f59dc88bca136d7ffb18b557d0c2a7f65bac3cba87431489ee8942cba68f4da26f6c127dc1a6a9a22f6842eeb2f447a2b179d8d46280b80edd50a9f3c46d59ed8944d9d5c651863544aeda89632712a5a8f67785ce0eabf0985d5e6eca4412f76d53da39b2cc4eefd1ec9d1dcb168061c7b01e6ce2ee5e824d9d919b0e3689b4b11e78bb52cba74afceeab9aefd1a91293a51fd9b903d1de9143ba6be7c8213a32dd35ed43b86764695bd5a42df6693e1b5fa70efa97ca431bc7dbef4af92d21f569dca617dbaa330b95e7172acf32547eab923620243bef39bbb76d9bc65262d3b3691ef62d1612d954cabe3b475a15e397329207d7ecf3b335bb60d426d98116953f7de6189c9a4656abd5aa0a157f2661d47e3103312abf9c3be5eca973e70749aac7b35aad562a9dfd02074b6a39ed50b99cae5a4e317894d133f220e3878c313070078f32c418b77acd93438cbedc9f0d30089ad4a97d895bb97d3b5816066f574a4f49cf273a3555fc2d66e531440cec133b87caab87cadf322a8f2504ece72749b32b6e4143eb83b8aebab514b73ed1276632c4f5944ce6f19a496288a781448f977e121b462d495fed9352ab6a95e9a54b5d6c79bea7e9b2a7f9d25475ec69ee3e14963e2abdb8a7796e5cd3ee4641021e5fdd2a86edf82d0fb541cfd93dbbbbbbeceef29592261c62bf5ffbb5b74d145707cf2e885add2b5c6195e581e6c0db9552e4a99914a1cfef4b2ac5494d9fea6149591131ab022b23bba9d9339c8aa2a3f3bc779da7699a26becc5642fad48d3afa943df4cdeba64f77cfebc8723be974f03676e376aa3b0a59ae4896fb53b38bd94d2ea589f45a79765d1d33b70f1a2a8f9979bd8ebb0ea631f26afa34b3c6099a4c261249eb2e423fb9160a857c7e5e2764ef74cba39f67f2ec86be18953d74613c188661b3c45ed90af4492bdf746a557cc33bd94528dbdce1c975309f3037f353b06da2b82f6c5fd929284529742756051e48a3a10e353843f55dfc04a338d92185f813b214fa7d683cfbfce19b4e812e9a2a5932cb842c79a7663c7d7aa9e5f4d972442425b76af66b9b266a244d45bbd829128da38c3e689035352aef5e43bab72accd5a9b6b9a9d9514e3aa766a510e903043f105421b74f3f2152c67bf78e9c2191ed91fcd3a7ec342a9dd09967134592796a760f344e15e6ea268176f8e05e8259c57b3cc6177a2b83c8869a7db7c4e650332c5bd9814d4bc493630f4d55f693f1047391f4455ff4455f98ab5334a74fd9b74d1449a4df647271c15c3c3d4a7cea4f7d6db5d5a955613b2f1123e98f4f769a2312d11c11cd11d11c11cd11d11c11cde9579fb27323b5e95376d048577dca1e8ef4a64f9455294ecdcc104fb08746eacde5d961a86b88fc43196289b93017a3fa63508ad0479f6014601421b204b3a2dce4456d3ac53d3b5d9d9025bda999a996fdeafaa58a5caac854457f77914874b153df45f7749c5815776cf4c1913535e0bbd77c0771e3aab05028746f82a16fa16d23677442a1f0e1fc42e34bc7e4d3467cd5928f8d2c61f742b28491a51f5d877d067c778c9401ddbb47ce7c079d46a5833d6fc4c62c0b36a1f0509cce3b10d0c3a76cc1a6ac84f2559550c81fabe2974891a49034273bce87061f259487a7516d956934d4218b95aa8442967e780f2fe33d44b9f71452667bf8909c11fb84f2ed342aef2847798fab0a8d5a3d197955e7b8e1bdcb84f7c8199d94cfd0a79032de3772a6ef91cd059b324632c76db5aa3deaec0e19767e78ef0ec47b470ed191e9771f42ef1d48771039a4dfbdebc9f8adaa6732ce57a756b5aa180bb3a926b3d2d7b6ed74ca7bf66eb5ab7bda07f4b29574d9ad9a3d3496dd03ba173e44977421c8c3562192beb237178cfae9d4b6892289f49b4c2e2e2fb5e49f9afd746a55fc5ab16c6e706af616af83679d483a057af699d3a9f0d967ab53dfb34f57a7ba679f3d9dda9e815ef6a944f451c37d7b39736a565303de3be83535dfa71dd8148e184f9fb26fab9a9dcb58357bf753b37baf9afd5352b3833e353b08eb7162aa30579fb2abc27155e0b8aa6f5c95a75a15bfc4f9434e1f3665d9990c91339167a362a3619ac30b6f57ca124ec5e6331cd1db4e652f37b104841cb2edf4097bf655d11f53b5b5fa847daa3c36432c412f46d17793a5f9fe1534aaee942ccd6fbf8246458f89afa057a74af3df6954d8c555a74a932cfda0072f430f7e1e2467742629d3fd2367fa5df799ed942c79342a6c1cb73e61b4066239daa9fc09d6fd22066100bdf6d4a972d376e0843ada19ed8c7626598e7a2ab63372814eacaa662397f481586e38aaf2a504bdb6d67c097a55ec1bce8603a49ff1098312a0cfc899f7093b42ea13761a07924b9fb02f688283789a44c494547e39daa9d85f3a458f9570e6a67161dea338e2de9b9386fa9dfa563c5e5900412cbf15fd81c82c46cd0738443f885a9d4752db6bb13605a976c7c6294815bb364e419a62ebb6983bb917698a9452ca8d5d1236edd43e5f07d35079ca09d7fd4783e366b7ea138db1ec5695df5719cb0e081504137abf6bc18c11dfef8c30aa3b0c688345613958984c070bd38389d24ea6901d0d660c377f42763bd898f9ae66448ac8b2b3a90d1a8f6c9ba8da1e8e4758a3142610e7bcd801a1f6cb8ca7f6c5b1dbc1b6f4c3b1a3c16ce98c8c1d16cbd2c7c6ce065d0e96a5ff8d9d0e96a5af8d5d0fa6a93f79c07df46942d67993b1b42df3a351345be64163481c79b68ca193555996f96fd44621d6342f0ac2fb8850cb3642ed9746d44e7b49e25e1651b719d34d134685be57096251dfbd83a8194363b82f08043a080462e687b68be311d68b6a7b833b46ee55c6a6b68599e7cae0cce0cee8567dfa3a239d4d874567830e065d912e8b8e06b5b9e681582434c206d005f28062806500d3e07de1a589194017e8025da00b74812e300b0b6e61412f8ca1f8812e1208b2a1f633100eb54fcfd052826500dfd052826da81d4a214baea125a7106bf626a7106bf8d2c4842c877819912529258264b981ae8501dff7b410b54b316b09ba40641451fc60d5f61db366d9c187a3142610e758aa94eb459d5bc1afce71b1717b0762c9bd2ab7adaa4896eb72416163eab6ccf7bb2e18a5bdbfa81d169b52e15edd6a61b8f7bb9aaec8c278ef7731d8ae8a8d01dfef5e5e6edc389dc63a5f8ea24796dc4bb42ddcb69c6c377ebb8dbb8457e7b1904d5d22a810000d12544c1a8c1ae00b39f0da86a7d037bb2f18d9a25d6014a34ec068ab4e9fc905cd289d2dd7b419ebb827fa13cf8d9e4a0950291d5d5f163a77441ac5b4c2a48258febd6d93fbe0edca163e6e294a0800557a50a5644901942c69ea9115603701ad4756252053957daa3292f5a93072fee01760a2466e7dda9326d8a4421067736f9a96d3a7ad43d33b6093a484d281de61bba745ddbca1ddee51ebe9dc3651d428a51bb76d9b36729aa6711cc5362cd3b29e73cea69492f41ab883621886ad96b95c1cc3939c2d7d6d177b69b25117db3886674bd30dc3687798c6db47b5229645ebeed6364cdb3e5316e2fc5cec5a1d97a5374dd3b46d6a5dc94ea4dfee921896c4d45ed8b4efc6b43ead96c44b0e1be46ce99a97512e7dc256de246dec183997c4b3a59b41aa763a6e188661e4f61d4d80d5dec8e6099ae586a16427393413711b71186f5c0786a2101cc732c7f694bba42e4e17bad62dcb9ec444109b560b4310f4895ed75d586e475f6fa289b669658e930c054ba12fa47e219526755b13f7dcb2f47ca95b12412fdab71a29cbb20fb58c39467bcf6cb64cee5b7017dcb12408b49d2a2ecf6d509b5a638d3515eb6e473be5659f6449dfd3cb46f6c02f48c54ec9dedd71340156f79fb618d77d36953ba544c4f91e253e2e2f3beb6a170e3114318c2cb59ee42e254b1205c1feecd87fb4b7eeae3d8c7bbeeec2dc9ddec2b7c7d225f3bafbfbba0b0c6e5a6721ce7f4bb1efeb2c88f38bd12988cbbb21a51aa9bb7b35b2142b25d5b9e292cd947c6113efee5213d04ddbc60ddb71b5e984d9b2d74e472e660ba54ba71366cb768ddcb0d20a9b3804eea07fa7be73671ff95eba4e10fbcba64543dd52c4fa1c2de9569a80f25092e12036a969e2f69244a7d691bb9125a9526d8ab69d3d96941337d117d246942c4971102908482270c79ee1206e36fafa88388f951f3d69946fabf45a8542ec13a77c1c07719e4d3b49df32aae74e528536a5bd62b83b149b558401eb1a3648943f906d94d0af988e06170af496a3ffbac2a9558db3eea2340f4b65e4b2f4cb4609436ded54ae185ca87dde2bd43eb93005589624664bbff60ba80c81517b88330c3184106610428820ca104410357a6ad42891a154a231061a3454c4a0a2421283444a09434a0a0a1850504ebe707262c2636232f2c26824ea824814e242282486218aa02d8040a116c210cc02087eaeeff3b0e079dd15ba8e0383e3b624dba67da16999156a96bd2c35c0c27417606198955898396b3f8985d9d144dc6667061b2612697331bde4c8416b99230757f78b2ef4d49254798b83c753e81cf44ddb9cba55ddb611cb2ba9add6aa7abdaafb1392ca62cf79482e1e9e974d5cedc5d3276eedd5271677785cdaab539bcf8f12520f0f0f0f89246aafde94bcaaca0d9bbcd72844ecf37d03b1dc94f0aa62a40acea812ba41928383439c9c65db54b951c1c132151c152dd8c4369559a1d554c161d418388c9a7b951b959baa82a385f86303b154b9d9a925978558aadca8dca868c1a94dc55b157f3a258a3b9da267d1a7b2a824d4534517cf7c29be2a8b7fb8a91cd241e5d3b812959bca213156951f6a75cac48542ad964d0b062d2b5aa21915897884caa12054534f68071976fa811626254a4c3e19f7931136f10cf17875c1a6ad279b138b4d1c79c47b79628d81506de49016f4b7cf68dfc81290eddf3f7288f68dd4296df553792388823f56d5f4c4ca8e995e1d796289f584a332b53a65eae9935a9a5a3dadcaa6256c3a9d8a6c0bdfd4d3a993113e71796289a72c7a3ab5aaada7b2aa34dda1f2894503f1b462d3eb8485b8b534bd2a9b7058dbb4c1a9fc2ba9fcad0db50e9bfaf6a464c6cc6d71c3a2e4b028ec2aafca7c20419fe6b571db468c993b77f25aa1962b3dd076a613aca2a4903ecdb3ea84a42e1134736a277ef028a778b55aad6c54fb6d412607208a35e5c50b7c666a53ad175674514bb134b9c20e9c90630eae3a5252e93dc6be550af1d879ace17f18b7a8c5a872f674caeba9872a62b3e7a48f7a2e979d3da4d9b36da2d83e3436cc9e3987a9079bece5a38e36f589bebb16e1c5639f3d5349a7b6e7e098581414a21a397bb896c7a5e0450295843a2fcbc1c9c9c9c9993d2239716e28a51e9b818962cfec111f86bc8722590a75de417f31d11159ee4e0fd6a369178d3eb4efab9a3d9d9aad4d6c913ab2147ae791a51059faf1bdbbccf78e9cd1097d0f91321ba7033a0faf2a7ff70e649b2989be2a6f2c89c81f53b5aad5884c818a45f032de41724647e45d44ca74dd878d745519fc7720e0bfef43fae0817cdfc821fc4f1cb3ea81669dad6d13c5278480ea9c3b141bcbed59994a6c6e56acf9337d668fe9b3e79f9231f4b30df47a9ef93ddfdda10e1bd494a79835b62039d7a565a1c6c2e640bd6d3e303d746f6f6ff34d901e29e8539f4721dfe49a36e8f4d367fe7477f7d633c42e66bd85ba67d8cd627bdddddddddde264acbbbb91746f7fb2582c568bde6730d421e8a07d830e8a20882c89931f3e48a7b0f77d744a7b3f05628bbabb69d3a68d3d34fac0c89a9aecdc6bbc6bf726d6a00635e82591f431c992f8791ad59c19394447663bf621dfb37364493c9f46e59143b663d7b8f365b8f34796c48748196d234b2259fac1cf0e641ed34ea3a251e984f740a34ba7beeeedb96a83dddd2653edecdfb9d7d460dfbabed7dffa18d7aa6f5c554d76ec35da550bd0b23ed6efdecea8d868b84daef076a5fc7e182585f6288608c4aaceefbb86634d88f252147bb85c8c2aa70fe861c863f42c8386c2e9b32a3074d93a057e212c6b9af9641ae963d3c3f4996570155ce48671828c3d5220c4479fb2a380d6e5d2e616e25bad3e7d7cc33921f023a74f4f72fb142229e9e3face62b15859365f35a3a0905b9dcadeca5ad36722c9992c168b95025ab59344e5beb66763d93ccaaa666f500a8c86185902850ff5e8143f7b9014306af4ec3373d5a97e761f9df2964496ebb3f94c1f6fdb2e1a7d6cdeaaa64fa7e6b6cde943491f20b244e945e74ea3d2097d341e6123ab1a760f0fc43b682cd18f254a967e84473910d0531e1e05e5a031a5c3128f594b5154ae5b75f0c94393a7808e3296b0af2a9c464e4c40e18f69c3a6ec2372b258465635c4667464be879f011dfc4c58f2b1dd89556de48c8e8894f1ce71e4cc770f6464554310881f7e481f7420e13d72083f0c8d5b5dd395ddc5f4e2ca94d4ec1374625526d302e64f96c3367cb3aa196bbea68f8f1e6ccaeeaad9f7436928ca16de1e212ea6a3ddf33eaf3f6ed43c92d216298782d356bd7155da28433916cc45a26a63e9c777ef4f7c24772d0f5098a0ebf6f5a9342a1a1567dc58c3dd1b6bbc6f9fbad3b19cf5a5fa3e1e34753b2a305001382aa603328076cdae7d1c96615c63dd4dc170c34ec31ac5c4e0cd9a864273688c628d61601318ed4ce3b8ba7353dc9e96450e18e6427f7e2aff8b18fcd4fd22064a6a09ca4365501e164600db2e10b5d31facca8e7d36b4a8bb520400168683e95036beb7b13002f89e65618cf8fe888539a14cdfe35898007c9f636100f03d120b53c4f7a845ad7c0fb330447c1fb330e4f7492cccf8bd128bfaf7756186f85eb530427c7f808509e2fb251655e3fb1e0b53fa1e010b43e3fb042c8ccaf70a5814e9fb261626e57b1f0b83f2fd8f8539f9de8945997c0f04020b23fafe8985097d1f814589df57606140df5b6061c2ef2fb030e0f74176031c581896ef8590a053396ebcdcd7eae394e6d327ed1b91ad060712bba941f369397fab7179cb4bb1852c419a4f75716d35958f634462f4e604b5237bc4584302397e83a4a20464aa6e7caa6e90ac4f95e32caaaab971229b0ac7b371aa2628435539482256805437ce2a971f81639c7bc3e513dc3180ecc65d7ec4005a7ec46f8cbb375c8e683982ab8d719bc19a6410836531b22c7c962d54fe8785ca07af50f92118950f4a52f9e24ee587aa50f9222a54fec8040a957fd27a42e5a7909650f92a4aa87c1aa51a47a8fc208c50f94214a1f2871042e58f41a87c1208954fc40a0f2abf88a196cfc32176d3c68743f46ec30b6d0800dce1a3463ce8dfe8d9f8beb1e456271f9df49a1a93834ff9c4559fba55fbe028e7e4a6f649a017e9645c95c9b8aa9138bdb501faa8c1c8191d19f0f433182567e83c8fe5f6b178938568844dd8a7915bc51f38419c93d50471036c62f1c852e3a9fdf0938e9f6ac11d49d439d7a776388674d4540bee985d3517a3caf5098351e5bea1f697844773696ea8ad9d410bc37ca991e1a50686dad7b456f8526b9996204bb0921ec9dd14b23eab0df0ec3ed3129b24dcc184b85a1e355680ac983f2f571ed67915abbc1e3b301eb74a39dc0967188693b6d8b453e7141666d60ea35d5731da31d74682487768cbf38e85cdbcc1f1793db445a5b8407d1e02b62d6c2eaf8877937d2c23ec750f35f63cefda58aa1ec771253ef655cd8d2c394f64815e6291462276e4b4999300df377a95c7f502878cea4d90ef79a0179bbe176841ebb81d2ee0d4e65c30df377e95c7b12b833bba77382b488cdaa0311666becb99315d4e56415c0d2759160663b150fb5dd016c7e25693f51d7b65361ab7a3713bda87006db3b1a9dc17dc0e139bcd46836c562c8c8096308a6382cc965e6dda8ab63cd6dcb48fc35ed8ab1c8d5be58943e43a6deeec0ec36b393e1b759ebeac58eabc6b7768cb8ac35ed80b7b2d4f0218301540440cdfdb5c3386496ef5cd066cde1876b12ce14eed73ab19134e615bfa6115b855d8da6a73217e6bdf7b010cbc192caa069ba22d8f45c1f058ad1dd4fe9c5f4829e58ad105ec4add9188badfaa8743fc3c03803cb61ac53c639c62aba02535a076ef150cefe1103f2e49b8d5302469ebe37fdc0e9b5cdcf97c8da4ad2e98236917629165614f1be90e9b5a2ded1b49bba03b8cd2b46d53e0e90e47d2166d85fff8d82b5bb116860fbe2f165998efa3916b334164622bab149efb9a1cbc044cc89226811159d24a61295c5529e41a4977f0ab0a3fb2f46374f0404607c9213a43b08f808043e8417255bc938407449654e6362d56d5e3209f16ab3a1af7071c75160c28c0816bcef591dc4ef792dba9acda4b1067ddae7a3a3e6cdcb169e10b27594e1c8f67c8b343ef41c2cfeb18c059c1ad3e4ecc11757c3a4026b87ef7541f1d3d0679602f6c09dda12d36d116dd6154ab5353c50f71b12cd88b4d5bdd6aa6f2d0042d99d91cc515e825ba8814578c9ae4b6a9d1456439c9ad04bd26a396b6e84e697bf6adde685c55cab8aa2580e0111488aea636a88c6501bd942086ff6152da2e16a9d9c947973921c38f489993a5edaa49ca9033e04dc8d246d2a846ae8d44a43b2d3ada494e52867ef41139039e9234aa30090f88d46efcea822179847555a97bcdb65211b94a675ba94ad00bf4072b36d50364c682ce58d0cb66451868dda8551e5cbf2461e5916bb67a61afb92cde79e465f11e8ebd2c9ef76edcd6e4dddb8850221abba0f63d90099aeaddc3b20a7acd988c08483f4757edf3ab9c2cb0f403bbc981803f399692d28dc612bfc4240fae226b595ad548ba248825e855fa413fba0cfd889cd1a1675266f419f023e62d38c405e8d5a7fec928def4a91b09a267e3b1d8c41d3bf81e9de276fab469aed9d27f010c76ce605135d8c99a319beb23e70e3cef009f8743d496d8256687df4ee9b134d78cf136b2043d16b7e3b93aeddb5c1b881d4063538f2cea2cb23fa87d2d6a1f06cbd2f712f0f1c8958eab5a56169ed3ba039052ce04134b847359c4e0b48e9482a212fa3c0528c00795026dc504d9c49a2ab24239a8514bd0cb88574bd02b0c5b63b81362af8511356161b42e7c4862afc922c7404677064dfcb401162af60727d46655a18a4fa82d4ac1063495686280de800f1b17ab74d4592f70ecc093439385bd268b011f0e513b03c01dddbd26b689d961781dac9ad563c037411e5cc3635c9947ae2988ec5d078f5ca33018a5724f07a0404c25faa03fcc0298fce47d5019abda2fc52a4456158b4cf1059306b5c197620b6a83e0472f4522b553481edfaba127a5781e33b389bd39e7293d89d29414d21300ee98ccfc04803bf86366063d725b8cb1bf71f2497c03859f6ddc69e189097fc4071989c9c25e530435f17523a80cd01f96a51f8e20333c1fdf1cb9e210b73701eee0de04c80457ed9e139819b5b1d7b7d66abf5808b5736a8b3fd8982055ac18a0c0458f2d6a1b82b05b91c5624939e8c233e2d9901eab75c4d26379368cdadae291ee84b2087111dae248c807b5433708e1a0765f1ce365c8c8cb900bf68cda7e00c9dd934796211876c048510e6429aec10c32aa488633d4be2886c8058b394840af95c8ea9478d329ec561803879144eca224559cad4e12f4027155e564bdba3114a37ea356790ceb823b7cd438f17d2356bd71bdc0b143e511abdd18561ce25cc2267192a0d71662f612d4a9b0d541660cb7335bfa20b8aeba4e7c1e0ed101eb80d9a1e615d9537bac2d07b5effdc0632d4bcfda47104b8f551bb4b576b83abf22ceb055b99ddacf5c4a2baf3f960311af08fd152b42fac441cae5429dbfc265aa82f4897704410cd229fe2e8b7c9ad8fbe5f268e41519b967219da224a964b20b89c3b8c4de71a311369620190577ec4c22a7e82a04fcd6d04b1ba2113b388a44a2e5093b8f63918843633964a786186426972cb52d0c43cca341524b102c4fd785df85f1e60782be8cdd64fb982c49503925a5724dfc72aa7412f8e5d4c9435c6913c952a421924e24328506090a493c113912bcc9b88c61ff7c54ee40aee3bef341eea060328a500772ef38f0dd792c41e631441ef9c82e82383aa68347634983a462178da58f8a1d349624589e0a45f8ad9d47962189bdebbaae63ae20280a8d61187a1c37cfa81d59f23110011c599247be631f49c5f2d48ec3ce365c680612c9ee65da5c3a678f234d3699091ea8b135f55c16981a6b9e2e6c4d6ba2dff9046f574a1a486adf5352b76d56d8d4a7d7c12f46653e35d453dea796a19e8a61352c3635b75a96e67cfad44dd0baf5d4565152b45323965b4f2d49b527ff34903093e1ed8aa7c3f59a5d1c7b225795fbe9f2820412e58c4bfdcc15bbaa2b4e8a9404185924457505bd42ecd34c412df77db1f675f0153efac4efd9bdb1a757c0ac5dfb94a46286fe8a207d9aabba82923afdfe618aadbc120fb1d66923ee2435d79cfbb92b33873faffc6815eb243557096281588cd2760e32c228579de716eb3cc8868b1be0e8400e5e60d1337bfbea6eb3852fbe14800d4aae9441d4dd3e53eaf24b94badf2216057e4f0ab1a8f0fbd2c6885064df6e543e8eca17b721d6c40f0150f9204b8e1723443ecac208b12c33a6c66ce193beca199971b363416d29682d496be2be73bb0e9e50508d52a6945292d29d1fec0bb177204e174acf5c685d6cd4fece67c721fa41d4b0c5b03db50aaf6ccb32db0c9ba89a2b04d813df8b2d0b5f98e40b1d44174635254daf2b9db9a10818f8505b0b1ef685d7363d8ce33391bcb02fc21f6f57ca90cdfc6052df730b03f318d49378296e48e4c031801b2e2d47b0d81080112753000050c40a11e4f8218408a2c664d10b60001d5575802576f060a2070212a0800530a0014df8f8e18403641e0004024f44400213a040052c70812018c8800636c0810e805e440d9da58a47a28657a28207b367dfbf096c8c77af7b871dd3aeb16063e8e9e87bc6b2f468e400d1ad664b9f476ec9b2f4e7c2a45e8a1e7839590578396d0cf072dee8783971eacb99a37a39911ce0e56c2df172eeec78395d3c5e4e1e265ece9e1e2fa71204bc9c3e0978397f14f072be16f092570c78c9ac06bc649b265ef28d8f978cf3e325e72071c04b6ec9bce49d07bc64179097cc038197dcf3c44b56128197ec238197fc338197fca2c0cb5e55e065b32cf0b26d2ef0b26f82bc6c1c0cbcec9c0cbc6c241a78d9ad0dbcec1d0ebc6c57075e36cfe8650dd1cb22402f5990105f2ab160802f970bd9cb15c3f772d3e0bd5c38742ff70e75b70f750131afa8fb5985a4a020c19d7c6fc4c20ce0fb2326eac6f703581897896a39e2fb024c140b8f894a400326ea040364a224608189cac0c27460a24a114c94140b33c544ad808a890ae2fbd98285a9f1fd2432634c4631a218504c28468c0963c0ef1db031d9f713d0c0c678df43b131ddf72558164c2b36867e49241289943242194542c61a182bfa8c33543a31af214252e9a04ee4258993110c834d5900b7b02c7dd00b0b83e37d500bae19b38545e578df64e45eb3a5ef8191fbc33c75e54407811e12c59b3c0c7f72709402e5d9288509c46f948274cfbbcabbeea563d8695cd3fe724a4f8073af4e79e0e5c6d3290f90a0ab952077b628f172eb4073a037d01ae80c34063a485fa02dd015680af00458021c017e8221c040f8012cc30e6027f807fbe026b801230316f052c04f027c10a0a4470f133c3c5c3b7696681d00892aa7e2e8b831c0588091d5a9ce0f73c604a2f69520931863c6ae05b3a50f3376552c4b9f0063c7876de9bf8c5d1db6a54f63ecdcb02dfdd2d89d615bfa2a6317866de993c66e0bdbd24f19bb2fb6a58f327652d896fec9d831615bfa266377846de98fc62e08dbd207895263b75a963e6aec6ab8c89efa48e4c031801b2e63078465e9b78c1d11a6a97fc4d8196159fa2c63878469eadb18bb252c4b5f0063e78469ea1b3176515896fe69eca8304d7dd3d8596159fa0118bb2b4c531f0063a78565e91731765d98a6fecad8816159fa448cdd18a6a94f8e9d1996a53f8e9d1aa6a9ffb16bc3b2f48718bb384c535f88b1a3c3b2f483183b3c4c53bfc6d8ed6159fa14105a1fb03b7470f0d2b062a825f7e2c2182a21221162e18aa8c143a4ee456e523153a0ab4ffd6fa240df8736b56121cd9b28919bb7619310d8d41d0e337748c01d9d0db8a3cb824dfd5d077f64c75a16f08714df7c666202d10462fd4422d168ecb860531f34763058934da7059b86b0a6bec998836dd941ed67630784d9d2ff8450bb2dba22db328365e97b63f7839bdad7461cee01a5f0de5705e43b778e2c61173d74ef4042f7c8213a32de451fc23db42a2022ef2212bc2a8a090851346e081cc565d1de48c424887cf0a051d4c28abaad17387af8b4b0a26e61a81dd4b47be3fba4bd1bb9b191209273a7b7d0be2b1a09c5e4a154501aa69bcb5352d28561c28551397250ee899933b74000f7f949d2f431d0b367cf66020aee3bb768ca6de4b6dbd3dfce981a56d492d6cd70b450cbadfcaa9091b38b65e19f929e6883540306fbb2cc90c823469bd90e39d8d4bc51ea32e7b115f7d49f734e0c2b29f96272e1c29c2e3262ef4cb18fa9c1fbec626168f86053cbb0a99f6053df079b3a058c2a578910102c09b2011f8c92716194caf73918357effc228f2cb35febdd829214efa87985c2c0ae5fbd95a54ca173075761a6163a6912dea7e1261512641d8982043a8fbe9834591b498313ef6338b9d378b12255183ba9f586c4c122fd8181d3b4696e8fdcc8ce9315b3a068b12976651a3ef4d90827d141b63c325c665b6b40676f71498312f21d80e2caa4385280db5bd0b50f73f36a6060336013c16857dc5008be2be4f62c698664b4f6159e6c97142614df3e3389bb0a67995712a614d53050b5ba8fca5c20b3426121ae3d68f1367889c6913c4cd5ced69be34eeaad0a041464182aaa2429634abca5f002905e5c42488133ea61125346750118821809859c2023356f00715949182170ac898c20f27e88309c628011fa4d843147a20c1cf08f220023c84e00e20b003147528e9f0813908f1f1801c3a10070ec061036fd0801b32d0060cb02188922492a8fd91282482742c91801e4b76925c00066b18c2022f508310152892862028c042438d09b8e00c25091031038d085c510695276a7a4810b0820c29405a3086078841460c13079c11869113810083e80720be10f2b184476cc20c2f801af0872e840c28830be0025e617c0a20630b5e02fca0850e017dc802d7630cd7c6041fb0a0f1d8c315b21d7a0063892407a05fa8da0a75bdd0b13b3642f0f33a971c302f2e390c60800214400925924822260606860004787949a550282490c89103078e010ce0c60d17979696238e6061b16143000230c288d3c9640a4000000080228a5859a9fc112c0c119488ca17c1c2904d567e081666e4b1f241b0305f96f9f9ca1752635651a715354670218c7a4ded6780a87dcc0fb5fffd43e583110b238265993120982dfd25efc3848190f90221b3881021d30542261121f30a21b346c8b442c86c8190598590b91272869040080184902542cc10f20721650879092143881f84f441c81842f820640f42f420e447c80884884048088480a08b85e16993d190da883a78bbe39cc2b2bcb089d21c19f35dd8b4cccf3ebb58962cbb29cb582429254b3ec69c2d63538b6c2ec9300cc3482fcbb26fb6d94eac4ca2eea9601a8c3733cc20c9ae74f74c419c1409469c2aab6c25d789789ef8fb65614a29a57453cb556695ca236d2548bc5d294babdaf7bcee638ff2c4b60842a8635d308ad0824a3fca13f4125793936c36289bb89a5bd0d0f8c07f2d8354cffbabb829da62cf237188fc23347cd775612bdc5979f3dee47b1eb96cdac11fbd876128aebe0a5ad207bdba20724f284d0c2b3d1c19f0d4a351a18cd986c2653c26f60a4317e7da49b29384519c2b5b713bdc0eb7f3c50cb250cb30099bdab552608218c5ac1ded6e148bb02cfdd085e4b54b6d29886129196a9ff2300aac7d2ac6c224e1143dcafb4fc3a8616b5bfa9404bd48d2e3169b9ac932bcf73e8dee1cde7b13e1a1f03ec316e8e57d7a5ee79def792fd012d012464df6784332dc6995d88bb32919f55d5b85eeeda8dceb02e55eab0d758e59f5b02f1c3749ed83fea0851f181bc360ec976461e6acc2ac422d3d56574eb2d9789fc7e1ec8e8a22ee4ca6179eac8c2d367517dab42175441b46add6d28e600fc729a698827415e6555104ab61b0a9798a64129cda50d80a77fad40f5d214fd893230a852d3a861c8b524abb8f2c374f44c231cc1cbd570945f03a52c42207273c2310db50fb991cb99157214b975a86ad4e6dae3eb54b882c5d4c2a6469fa492eb2dc48ed87fcd17e687ba491e779620e928933592693c5da5c9b4b0989d55dfbd785adb0d591e5b6892289f49b4c2e2e216db56e7279b9a9383948ba91b802ad34325b612facc5d196c985b6581387344e9b99335b26d3f57a6daef6d97c7a53d23c3cb5d90c1fd315b62a76d0ab5394a77b8a28c1425c51928ef3a7524a9693cd08a9cc65eda057a9fbb589334393c572b954d24be952ff71a4d829937fffbe7b24d255461f24fa1a93635150b1aa1e1976c12615ce67f523b2b857a9237d8cc852f75147769f3921b74f32d8c183e48c49caa8c39d06b7e385aded247c81569b12d1a7f64fed32eca91d8626d7c15d570e127320e6205921c56d03912189dcc5485b53c62c6734662718d87561a83c7bd7b3634a7929e6bcb450b6cea7532412f44a412137d23319c5e7e4e4ac6ab45a95d7f5ecd47e4fd753fb19d9f174aece959393c32829a2986704625551de0f497f377aa4ad052ea828e3d682159b41e3ad83375a5150c6ada4113319339b6c45c70ccc706ab61d66d7c158c665885b96d3a70c8914d943db1ffa8251646409a347f92bcb72b22d38cb569d1a1da44136d6db268adbdd333131216b6a4e0ebe46fcc8645c15e8d5a98e54da481f1859da8e9d46454170fbcc0939444726e5271f02bac9c16fa4cc482487a4fce448ca49a30ecab394733c9d12af825d861e236774b2cf80c8d276936357214bae478674919c49214b1b497ff293d393488ea74f7d94593b9faeeb7cbacea7b3e914a9bb09bb98319f15b51f526161b2daefd9a2965b2dc3243c3d4a7c2a373b9fee7e6a77afdadeaa7637965d379a9c74f2948f3a710502bd5240af12f4720234218dab4ac956d80b7b31aa379174934b0966d53856a748ef739c4da74cdee770b89397dc4ded92cba9cdd5f8ca95aa85d5bb15ab0e22882082106d0da1642a5b08d22889b64e93af4c146d4d6f0934544065fc610499b1844d9bce90117d89bd8a884374e687801f7d08f6023fba0c781a7d92326229f2646c8e46e40cf7010e75d0c24a0592cd4ab8c18e6a553a35766e8735bad620c320c8d0cb59aadfb86040010e5ffdf873b9b87e495c2ed7cee47678869fa3ca4b278527608f90e7f6254329842d21784a8082587a2cb1c5d5a7815e5974a0974da7b01b1602a350def7902c4c10ef7b4a58981a94ee3485e7d263ad6ce14643cc5342e92da1ced271883c6a351cb7b1eb04c3b084a37ee76747790d70070a3900f143f94844ec8fcecae62202a563cf082cc2242e01b037411e5b9ddf11282dda1634d7d2e0346dec1bdf3c4c789019a0d79afa5e0bb2a8a7ba60545187ead1cf1bbfd371f406796c5bf5de6da3ef3c86e314a4fa91b48bd1cbb035dac2eefbc872deb3f1589e118f255628e643d233e2d984df3665427aac4ea5dcc484b6b810173cf672b2a8c71ad1939b1cc8c94dc8213a32d84d3e04fc0909c4e429e410ec26a4b8ea13ced8d53986f51bbb09b55ba2f78ee456366c6a8f2cbd87efd3f8ee41117ed256189ec5a890dccfb5a7f07c2f1c39d68a6bb81a46318a7fc4b4e11d87388f8c8e985c077b9aa6691ac7715d6742d6e848d2a67565d775ddb72cb46ddbb4ef1b91dfc98f4dda76c3a8efdacbefdebd6fdc6ed8646333aed6dd3b02dcd1751ecb8667e303cee6211744caa7f9f0366216620d9b9af542a2638f8ea0258c447f3412b9087a2b01f8bcb13f0c042d21d5b86873f38926dfc330146b8cb029646f00e08ecf05ecb19549f1c64a1557358ce22f398eaa1447a91e7db261d4a2543eaf2d0ae5b3966216b57f63b7de780d7f03dc115ee10a4fd0a2a6969b4bcbaee0b47bdd76b3c32f8c821416155661c32f36c5ed84ad19d3f9ec84adb0e51919b76fdbb6ed73b9381f30e555012abd1493ec2a618bb08b1df4c6ae611886a56b3f34386ea5fd70ab150e91c63d700777efdb6f76d8adcff66d2e219bcbf57d1f8f531bbba28cd9a8552ffc3c946cfc6a635cd49eb4f3e13ab1d7dcb2008db12ca03e2c880c9fb0b5dd6c3661abf472b3e17a3cd1d4b85a825e25e88504129a260aa9a0641c8d8e5b693fdc8a5b7d5bb8b9846caecd554a827e73ecba813fa68a4e10f3c86e893cbb300c3fafbdf0f33a100814fa46e3aae6b879ffba6f9ba20f5f3c4f4ea3ea4c2e33bac9f926e48c0e9332263fe119a65175e136644607c868c8e88d863a649132ce2f651c9dde895551b2c45fd5882c31f963aaba257ae413c412f4e2ce5941ebc2301c99ac49a77d1c88a97c2ae00e2e09e7e276bc1dd74ea7a6cac5261e36692e27cc989010bf0f425bd4fede6014a510c44b910c672045338808ed408c6d89399b84da4cce2138176c8ac3c29efa1a88f20ee523efa584dc0ce229e08eed1e8da5312b17c68ce958dd0bba4022813b544e22815bb971561a1f379e06b843e55e694bdca1761dcc713b9de2567dc2c2a63817ec69dcd952869cc0b92009b52fe674ca636dae215e6ea50f8738be04ee507909648283d8c88c88ee3ab8061712d128bdbc3057832bd110855096d47922c657dd31fa50e79b353332dc825019b50f21848863002b96ce984c0695077bdefce69ccca137430e99b915b9845b612fecc55ee6851ba7759e177a9cd67d427c3c7a35dc462e084e813ba610df4479ff664823dc442115524a18c2c06ce146636c4ecbba2fa4821244a9c6583d7a000ebf87e056bb8877a3456d4f082c2fa77a36732a6161d8538213c4cfbb37c7aeed8563d47e89f50134c6c2700922a3865de8b1c2e599845d2e6e87dbc956196be55bf9bad1abdfb85ee054a1f2c81101220047f5bca39cc661c01d34563e1ae3ac04007bbcb0178ab88507d099d45b62abc166c33ab87b83529460aab459c330c2b78ec862d4869b6be3a19b0a8aeb0da2182fc532d4bee84597e2175d0e14ca246a8bb3c05e2b5a31b9289149a8e1913ac91ed4f9a9c5c6743eb3c50533a8939c41a8d3071f19883ac9121cc323370f6aa873cf407939ada8f3b572a873d750e7baa1cecf6c4c9743818de9583c77e63612c48d67736daecea7b32e4705c5ab1d4e364e9e4543e7b35fa8f37678834feda3a8705d4eced6b13a56aafca8a4eb96ec9aa2640acd0c0002000000f314002030100e88c4a2f170a66a8af914800c7ebe54725a9e466912041142c610030000000000440046132401c68de90d6ebcc1c09c1483dc427b612b5c852bde862e7496f65b098bed65104ae51ba51782e8c40dd8c28b0c5a82d62dc630ab5ad9384f4cede76c465d78cebad5a41f062cd7035f22fdfe8c2ff837ff92782eab10accb237d8d2fbd7f3f0ec620530082792ebf06b45900aeb9f3eab895ed0ba8e216afd0e909544e61d52c985c89440f3547107caacbdfb0ba84b9f05c9fdc4053ed687a8b903ceba06cdab3afe0283c141b5add705a7b7698a27921946889e3b87f858915a5137692506052af507b2f1868a34feccdbf33ba12df951ec265729fe38955a6bda1d82995cc03b7826607f5ea385f15a5a70370ae70fedc07ad9ace4d3ea3d3baf028e481f078aa5164c29d961ab8e298165ad57b616df1b30a70dc6ae2f0685cb09f4339bdab9e5d40dd5db3289bc135c20c4548cdf8033e904f8a7b7bce83e8ec0895a8e046403a69235371b433c238bd579c1631aa9640a2d53956760ecdcb548e36a67b05f1e402fd35e1e722a5b1ea16aa06e8e2dc3597dd343a2187e0fbaaeef398743e532004289b866dc79684c81d0afaaec568daf1521804fa8202c020f20102d6572607d56502d392e617db16f2859ff165a7e554fcc595fd9f2ad825f9abfc94e9976749bca3d94771e6f8bb413b90347f016c289c5331d0a5378d2451e78b74390844b3f2c306238c2df87a3692c36e0c010010de8ad9d2b108ac0dee4301a10476ab2e0c6f4adb1028ec4a415b012d1a487d924231446c0ea07e964077ac60661bc2f23ea34fb51b03fec1c410e6f8b6e89b10b899aae53c704212f336dab15c710678f4bf60ae8ec13107387d191ac3b4fa286e78bdc492a5223f449698f5bcf439ca9edf24368befd12d7be382179918e10a6522b34f2d62092242178796ad9378849da2183301377bfb2c38fe620bd663d5c73ae4f63fe330d7591b317d733395bbae642a0f55fc2821100da50bed788e4d5d68b0f4775d8f91699afbc0e1249dfc06d283e7d63ec5ed6656f56e41d7386df3ff0e456dc951c3054763879a5a85b3a1bc2ecd5baf77ec5c9fcc56be552c7a5aaf4a2a7ed52e2d759d56b2a57ce911294cd0e76783b2341568320deb8d6ce968c5e0dc8e55dcf1bc356a64925b79c12f9dcf17557e620e727e5bcd2fc56e89ce9acf2d40048d1e70b20634694199150bb4b17206bf44f35053c20b6dd0f07bc990aa938661d40691ffe4794dd22b3cfb4d8a2ffc9ccadaa52979fc431a77987c15b72452f6f48f744ea8bc2b5a4956f2f63f19bff0f92a359650e6f90f39ce6139556e92a6dce30ab45815a654c3d44cacc11a08aee8441fed56ae9be730a60f1b220705d8b3d0321655fea0bafdfd8ff54304b712dd40feb0ec6eabc12b37519cb83441e0d96760e0749d06663039d6e47baf8d4eb98562c2a601d523891d4c3e70fbe2c397e70e3fcea03669e8a6e20de41e936fbc3ef8e54624202dea850be6960b1a0fb1550ba783b07cbab0a042e9154ad56eaeb854d421ca05ad7119d3adf6efc27e4214726d1376b644f53758b127a9da8fc596706517769644b577583127a9da8cc52879dd16f68ca4ea7730b14faadb8cc12a79cd16d6aca4502a44b9410512db955aa285f7715fb708f7f4b6447ddfe24998957a7e85e9201e0d91a218b5eee9220fdc2235ea38325150cf00399d49dd7cde9a936b9aa2a4b996547d4776537c15b17734b6c46fdf88eb606f1fc50ed4a9cae5b9a34153e87024d574775a99272968c54e6f8e3746d44dbc1cdb8d5235f3766c334ad5c4db91dd6855732fc776a354cdbd7d0f43a7979baa72a11c097e9209ae7272749d53ff9036b716e3fb16bc60d83c346b6e4772840a0b31fbaecf3c5cc2625b987e8429643c336a1c40251de1d100bce70d1009e49234df51429951814e10e98c3c313e680ddc0f1fa0563dda198a148a22131dda6a4061ab2d2c8172d2fe1affa8b8d3b515576b742dd77b1250626baa3a5730ac8a2f621119b8d2b7d866587502d1175eccdef12181f4861e8c143ef80210ed0630a41914a30884a5bba315fe1ef54d2d7ac5ebf401f4fd05bfafa65058997706ea6a864a47a39b0166558d9b45e006150338fa57020cf805d86deeb0de7fb269dc86f8a4bc630d96c17650444f925fa6d90958d279ee7066403fae87554273d877fcea723b2fe97ef55906a2963b0764d94aa1892db571a12702a7c1b77f1b618830f4c0cf8894b2f1f03153f27c689f3a2533dfb8c803e1a6ebf728e5aa1b734a49f16fba241f7215134c6bfc539948b8193bf38a1ec8f8186ad9d423aef173074e01aaf565b984fbd25955e326e55b1f5cc46ba74ddfbc327a7e23b3ea9f8f95d0db88fb1c8df4cf67e2ebd2ff1e8c73e14b50a6931eeefc0d39fb6fb22b936877f4034f754e276bd59ef9c139f77a9dd157d3d6e5b116e7c0c0155832d47eea8f95a207974abb18a7ee6938842fa629557d03f608a1dbd520a5c8874361ba803025b31c60bd6d57fe2d89fbc61011244e685c2f0ed404a487efe2330124c3533405e1a945dfed9a7cb2b6a5fb959d364a2c7bb25abba425e9a55a64293b572eb626d38a7b04e9e6c4ee8ae3b27de9f01be84efe0093dbb4dd1281df57561a8453a1d19437b2d71dfc6bf15b21f2154d9ef3f8e868145acd473373633ae6b2e77ebef10ae29194b60d17916b17d8d6d3d12fd275b15c22d03d75f7b136d5743a80b652ec0158b0d2846e33c85b923b17112b7e2948591fb4c1be973ab4100814ac803f4575e2d3951851415ef09b69d3e75aae933745bf584ce9353563674c2cce0c476012a934c7e6744b33cb63805beaaa64cf8de3adde57118bb957cecff76fff8bbe6a6a66885ed9f3766c559fc04e7bfd7eb84732f796437f80c6e75ba5a073df4040f2c8bbd20bba7de8dd1ca11bd7b20dc73f33d388248aa401d6480058d0d44c3c6bec057d4db77e862e968b2bc5aad52eb22327e610d8fb6a79c3a6507f220646505c99793a95b5164c52b8f8d631e91be71d7f9da6849218f6600972198c4af6cc0430f600dacea612268ab2cbf938a14b06711709530c1269b50088d1741b5c9cdd7988dc1c2e1c6702ebe29ae691d5d053a4ee02f8f7e2d9a09e071aefdb337b4ea42cdc73fe3390d460a59fc7e23b6020d633aaf5dff0a606cba0afc665d9ef8c2159fbeba9307c080e00c7af07269b53e2cd3218267665b6fab0ed7f3ddd9a9d8a85e8c750c8fcf5e0db90a77a827cd8858cd91fd31f837767ea5d99ec01d208ce3607cb4217ac071081695d9d06b4b2722f416113dca3bf59c44ad86bce457e8a570fc389ad02a5865d9d9109e890c49ad0822c15fad9bb203f9ab585269d31289c9d7cd389e9382b5d119d81c87b1a220dd0ca710d1f5ce0880c421172cb7fcdc7b90d53a0d498026cae1930498bee93fc1e2d6a217cd0533968f984bf1d1275622f8455a40324a32d345b212302c6c62c58986700e2a49185e6db4f401ac0bb8d35162933cf7f24ddb1463a0a4178f98a8ad0d79a569a97d0002a96fd2cdd5ca3ae5382ec7d4b5f9490ff5c720900104e36e20c45c21447084c471534343b32389ab837be955e7086d7dd14f6e137b11aa3838200b54a0be543df022ea230b5e0b5f0c21a1851da097690e13bc237ef72f82a884c818a352021ac7ef238e893d9e4fdb4afe5c625541d15825990a1651f42001319a8a216cfae88561ba28565e3f69b461a21e9292207e71fad0a149cc8d1cc1ea27124305d643968e153c5220083b532f42be92f25d844bf21ed70bde778e3a35cfb02ccb6bc4f9513b5d0c837a464052e5d148e8188eaee7f67bcfa6b57acd8d2e088d6e6e08907884c0d84d746aed8d6bb617372fb8980c76a9d394e8e640c4ae6578ff993dd1c28f04bb4900a4d9696ff4d9a06cb6015c1c8a39950da5611fc9346783e1ad4f262bd8a47202cce9030da026dfd8dcb32f1c196266840059882e91674e0467ae90e28bf15276e4f439606045ed87cf0662776804cdf8202c06aa443275c34baf201356307ee4d7232476292741db64803be5b883b7ad17225a5abe32401fe926ff442a640100c463bb2e3d2e6462699f5e2b6e93422ec55208ee818427cab81a658bae8521bf14300b22010276a14902b6bdcc42711a488062742ab2bd137dc5a6634804924e95b824e1b7cb43c2e92f2655ecae629f4524dcd4449ce9d90e8e9f0bd8df7892df689257bb8dc95310f77306e0270df518148df087a41aee3b2cfbede667feabaacc323a6240729d684167e7d6e4f6465aecf52842d484b25f8034ec22c64a79b337bc9feeeaa5be7dc17a7058b014cff27adfec2d6c69e779dfcc1075f98c0257bf57b772e2ac546708db0e7277dc2311498b0a2ac8cb766dc4264d86a00c26363f41d7823e4441d869e0c260959e50b9681b4c362bf326b32c0735c8cc519e4de873881d670a46b7b0d6dad6f63d3fac85d6b7275781aa76b4e70bd722530a719d929c611f697ca6026da063bd486f35aee138d2f2209f279bbe34299d0d27f48e8b540e353dbe978f168dad2adde1021f7da15ceaa8c6a91e8b0d1cb31121b706291a83cfa27263652af14502c3734886e93645e6a7dd3cc29193f280c5ff185221e8a713305ec0676284e9f24988a57e879543fa8a0f21945bd1dc51763a422e606099eaa7bc389f8324a5b0396ecf74ff232e70c3d6b4d67d0f6dd7b825de483adbea7ac69d2ba43a0950a9ae0efe0a24f00aa53d1ed210b252131b827e3c92d768e3f3e70a275e75df6a0f4461e42523fae96078ad88a52bc6891486106b3898c8f9a1328c0ca8c40c8295b7cf13370d2dc49e2cd586dc6adb1b91fb5fe845c1b4db0ddaef448e30732d592d7b7d365b856d902c154c0f856ba1632b389e7d78ea377f67bed076b494801661f559b2ed7c2057bd0bbf14e27266f5d5eba912a661a260b90bf86a99ee15d9a3ac65a9e53e992a822b2174e293572d22d729eb392893665838463a9b99fcc81c1bd145ba6000f60df4d925031d5bfe0dbcaca43b67528a1b3ed22e589e97ce725eb9804e758895db33373674727911a2d57bb685456e3906694792cc7d770e72fbb34ddb4361dc0130653f07f079559723ac9beca4f95cd0a3cedc87b4e99b6bf0a98ffb8aab455345a21e42d1fcfa602d32bd0d12b8deaf4e24c95663cf9778fa6f4d7f73f5038ef9833472d42549b781fea884af9a2ca768a76536547f4c914d77a1b51b60c119f2b0790fe124a1dc704c3eb2f74c1b0becb85eb770e15647421f39241eb013288148cc61892572251ec10a40ba62b73bf9a0d6f55907120ebe56cd6d9a074e8ba7538166e77fa1ba7cd7f290727de0ba3e5739364ae391c9dd46b00ea7868f8afc400ec13a5a24c1ce1d7e62715d2caa5f36cd41da036aafcb89f98aff8bd8624c5bb3e5deddc3b25cbb58312789cc87355f667e4b662ce1d1394c3ac85ba5553b59e627781911a4bd505613ea12ccfdfa21b232ac65329c0fe61b4e39713f0804e3d453e16fc4470f3b39d6231d26d5ad38e018b6c2cc4ac3899a7e6c1039c96a115291c2ff2ece9a5ed181b3636bded70de978eeb06cdeadb278d2b7ccb8e803d66f06974b44aecf7b47e559dbe86bfd693ccd160a2335e173ddc74a817ee6da188bb0e2de2676c0f38ddf99408ee2207d0163290bbb012cbda86b5efd97abeab195afc27f678f561129c367a649960270d2abf96b0557dacdd2e375497a216b3486c7e9e4162f088dfcb880010ecf7070fa3672adf1bb69de18831386d040423d717dceeef2d32b50b2f12d572b0243f52fe6280daa6d9f731e3329024639834a2794b0c283b3470ed84c00208da85b22a97014c4c184131d4e234cd466cc1cc4e271d0135f88bfe17018a6c0c792b54099f7cea914b81a36b9a8f74024a3762e1495325bf7faca89c4c910e288e98c0e5afa901ddd51519561a766c3604f0ea138fc07af682e9f518d45310263549209d02a63ab7924c1035a191fff61deab621cdd7cde233216fbd16d9ebacfc223d4083f7a71f99d6fe729713fd2375dcd70878294bd08d3f9dc048dc9cec04c7901a0ca03d8d96803fe5a25497ee1a321fc0491604d89f4ba598fd015b02f3164df4a75336889881e362c110da73c7c996193012f01ee8da67b1200b1d8a0f705ec6e619973aeef99f0d7baabd05c2ef5c0271a9c2c4217382cd09e633041daf18fe32643796570293bb36cce344f0b062eb836f03b2e10877663b542ae1d6d89ff0f97e7e8ff6e9e5a344105dd01b0815033755b83c43703786c2c6a88f93c26e4967729d3f6c256f41a963b5079d30345a8fca053ec1eb8bcbdd460431f9ab06e43a6f160a525eb75d1356c50d8f1f85220689c4ba1c1e288b334db9580ee83ce1228862cc6fe9722d45d8ffe93087036852b9e83e83d740844548c0208101fd1dceec3898fd3134a731ef0f64997f8bdc4780a0f2cfb2e576f1b4e76c897a6854b998e713f979afffd57f7c4a5faee110d3eb0757c97d68620a50cbe465ad78fbf4fe931573044f9aeadec9194876235af59600718532a5715ead5fc473514f3cc4bff99bb7d217e6987616264f31f47f609cbaff44ae356367d99d65a1d6207d988442c7b955278f6219fcceb17a59259b60375673365ff1b7a4392fe90e5abaa600da41dc12f2457a36e7f82144b3e027f5e28710b1374a680c2ae6f3304e82bac7f8ca51e6927bda8b6a41c03209cd0e53ccf83db0270707e96cff11798ec6a59c41fad1c43d9a8a691dd6b7e47362070c8a7e59905c3806cb9a21f779b647cfb1988f833dfa62d02a0418e305ba07d5f1434c6ab86b7afb124891333286cd8e96f5c0d4cae3537b0f0aa1265b67da1f1a58f030552d4d1f33ea994906086a81b6d7f14fde3c3b29112cc0123019263d70b8b34d4241d95c962207266b952a2c54fec4aa0aaed7b76d9240e631b80120c43861ab035224ea8995c834465b4abec15f10e4d9b99684499061ebcd48fc9b68d848f8ab9e5c2e8ab4a77ad8640eda7b1c3a7873ca876103ee9dfb357c28344ae54bf30fc2ac58a6c48e2111f52416fb7dba1519eabd4ed62885534ce21b07a19ecdfd8044dc8098d84ddb80033e27d984da9a48df46ffd4cbe82eb3d1cac2ab9b03d921aa93b19df99d89a633e5e53e2ffc275c356ff6c851624d248dfd3f5dd6209126d073545847019a8a46c7eded8da3f5e86d48779dc9d0c14e9b27e3f478a1a5198445cfd071c33dba339d0f2796d549f072e91b7396ad9d2e890b97344aeb300d985131587704e67c9930333a56da2730665988632cfa36b94d428843528ed9bdc1a8759202003a2029a2f76adaded70cceaedcdc01680be1f50c294813ed0a4c823662bc3fd0817c836a6a269b77a383641ac0b4f3dc7ab8104ab8ea0d94a8ed3276dd1aedab37b68928a9733a6c7edf1e1fffd37be1b3386e9f336203ac5c7f3ede851bdc32182d8fb0f23e76b3e74098243275ea0d2a269f5dab0a079a4bdb07b826675402b905cefc898f2748e6381c7493ae15193af7db60ee7bfc64e14e79f59329093b5fdfc05658d14333e77b5f66047f5bf9afb1bfb1c338e90dd6a9dbc6f30dd7ad2ed890479dfb5377036a6750e672c8e5af5f7894b8223e328ea44fe51b6cf4abf89a2bdd93e14084074d90bc0ffbbc75b2aa71c4df5e09f40aa2541e12481221264aaaae90ca9c1251997fe848b4ec50eec43914f9831ecc5aa23b8930cc5f0679aa464785a07f60929fb2ef7c40c1298f61f386e30fd07dee26037ce3044f04cc527d5391703e1b84c5d6977510c24118e29fc16bc40ca171ce430e22db7059fa1fe29528e5ec97ac3b262295926b3ee871ac7260091e724cffe8de0221fd52dc91bcde2f47f233637c2c22ce302796ee5205c2216b291a3900b888f305f6c26f531d317e080b5d8d2abecdb91e0bccbae94e846bc4984e3a3a7135714a9183f3752defe830873a920ea8cb3435960e4f57f0c3477ade184cc7fc706bdfedcd030f9b6cf2e75185b60bac89a21ceedebd747cb1594a0adaa9a7c226ba291e7c1db5d0975f9f5e0cf37f026147894911e830c88eff1f38a1a60d54252ccf8ca8cd42d390a8c5392885d7fd30a1976bc8eda8ae136d32f75b906951d660a4f4587609b9100bcd87970af7b880eccfe49e0bb3db6c5d2a01caa00b57bea3aa808f0234a619afd6f3cb72062a7619adc77098920b2a7515cf3e6497f2887cbd3083624ae33794401e6e4c954a3831b5bc0725209ffc1096169eb5b989ac440eff26cbd1dea196459038a30804317c87ec8fac80f8ee04c61d67cadc9e3eb255347374d2fa42c90bded5fe34175665988139b64f4ab16261bb7e416c30e8b2f737563e84d97af9278be43dff6c572eb4b47489b84b0310f4ed35b75f1d2cbd774a840ef4360758c3fc311f07879898988e396d90240ca6e58318b3bbdf93046f18185e6709eedc925774de5a4348d07d08af74bcee28c42b42e64574f09e56c6e44e368301de8f21808f055075c9644cb762b625a8576d0004a4ebc679ba8ac1e5b6ab80682166bb9be0bac1fe1183e0119b1576bc15c5c24f532cb46e78e1b95021c82d6d72a32a9e4620cb1e1b02792c03e532230cbd3c0b1492482f761f93f42d02a01d9323c1aa50e9bdeba59f1ef4c42384b3d959d5627dad6722643db475d380edf587623198e1173d785bca7e1007ba8983bb76f849270e236103f01eb71d4dcff57e31694e4daeda57d3c443e43bf3f14680ea5759aa4754556fdd3158ee018815485f1cea95f0f9b96b0c5305390cab00c531e9aa51bf105889f5f4f333144bdb6f72ef0544f7c86dfded28791d1da64e56664e708729e8da090c6c6963047c22a71ba2ec51aa054e246938a981612a0f3718c0805a2ecbc54f2049eb0a09f89bd9c9f7a7a55441fb0643d8f457c4885a51cff38fa7f6af37f961575c6ede1e045551c7045cf4b7a8e685373b78a6d5f0e6288cda6c8b8489e1c264acce0ca410d7446fdf81f12371d67b9e3e41e4ec0243788e26eae3eab9352dff6b7ed28df9af6b00afb6a97fecdc77b555c0dacd7b9da55f1927bdc8c9b1508565b2d3fbabe47bae712479bb5438fceb7969d56385508e090e1a3492732ac7b34bd9dfc98f7272acfba98e49e585d77f7cb2d4dd874e24f97e2fd15b06afae159588c77a4a6a68cc0a99bb5dbafa30a37cc7de3b91a8252d4adc9a0eddb2078e9cd4ef76bd190a8aa26122020fde925df14840de9b9f0cada8ff312b5519e92bf7bab41ab5c9230ef2c2ad8a4349abdf4b4ab958e25fe7d3965f7a95b488d3be3b2e5548e2cf31da9933293f9b0b7c210de3a598555240db2830220a0dfb8b10b2529006ecdf8a6242884222c9e5dfe0d717e7746d34aa414548458c35800b2141902d941f18b3c1221516dae6f40bfc641e006554d2431bf9c7ed5a27bab27d5354cea869e811eb91162a019270098a7ba8e70d7c1aca2851ad005ad291117cb25c4685709bd03765746bf0d5c23da392f557e2f93915fb75feff5b1b6c6e0c48b57ee9849f3bea2ecadf5e0634192a654478aa44de2694e909d8e811f56e02beb7767665c1152d017d9d7fdaa9cbc5d75460180a154613f1412f62f747fb6c297f0e7583e68bbfd7a343bce56821bc1aca3288f0affa283c788c17f51f0daece42891ccb331ed7532b50892a3dc4ebcfe5ac7daad2a9569ff9e1a21feb7f251f45b83a1163f2435e7900d0601b0046bf232d3a29603d22363cb22849e8e71d56a08894588c72cf6c08219047e1c59b57e5710a9109af8ea70083e24806deb07b61183bc408f78731956360d140478f2d2a7a002e95b58d2ae7a927a095d09587039e682a0c58a1da9dfedd994e4f76d3dac9527c061a15061fff659348466f97bf28128f5053ce000ef8c4743684662f6521a4dbc5651871fd0231bc9bffb304cd35799d47a948c4381bc7b632d4d369c00195e2e3488d7bcdf0603d86cb0ffb45ee38abd99ec01ddfd88e70da1cce7d8df18ebd207e6b78ae7c357b1eb250ab8bd51a46cac1415d262d1f863e0806be8d104a884add7a59739098896976dbd7b7b50610c7c9179b1241c49edbca9f54f903b89d1620193704fbd252585fb179d009c4a80a7b75fd73c090faa30e181e895ffd11913b458118688cd7abbcf3160f0faac83bc86fd5fd18113ee62877d8daff48e467a07814a1989fee39fd17e071b43184606c9bea74dfa71aca1a0193839b3ecbf9da77d07e6073df02e9254efe0682f79031d074d4b184c90a8bcbf0c602eb7ce0dd2a78900b4d2006e2682d0444fdabc50dd29f786535ea9c1510a802a888cdc8ec1036d923be977871279e41ca0580a16f02031037c05952e6cf21882c09f080e725ce285d750630812ebaa4607c9c6b5e5864c46bcffa493ba31ed6950d2bef031bea0a00db8e9d057ca50d86e26cfe5ceab58238ba0bd63549de6f08fe403bd15e4ab725a050e81433f890963963a42d85a604f4bd40e2ef8eb6884334a92e40d4c04595fcf73eadf6d26555a5096806a96c7d051c0e0e4a9112a53712ebdbb7e716517c10f22bfc58af5bf9a7de9252a3d82ea2408fef54281b8c35f4ddd3df2187e6b50188dc88aee9c1b7e963c812f0b14b0c9fe43e4dba7f340b5f37fc2e50d72f338bc2ce8662f5ed83646abddcbe3da5c4dbc5d1417f694e99c9c749faba3e242056dcd10d4325ae280248118db88f32e338f01d95a1e07608983950223a8899130205e7f031d74e1a36e431b2b3b30f85db2b29273993affd7cc0568aa74396adb2b7caea3434775977c189433bc282b15710c7aa0439b327de4fb3e17fcce1c3fd08c68be47288a699d8570f3253b9924f219d140d932e03634bf238a20b6e6931bb106bbefea3035e34b86fa37446da6d5f40068bef4bcd17166b87caee54a046d31b62c3eb492adc7bd2a58b7b6db653fc0be5e50e80c3eb45249562ec689e1e49148f2685405c195954eb63f04f2009e94740e377da5d195613411d43fd486306245736f15473eb0c8f14ab05295f2a5c635ae40ceda3c2092aa2244ac726796c0a5bd7218efe5d5618489dd4e031bc397481227e4f9960fba37bd81edc678d135a2b0785d209d7e448f56d59c171e23ef42a7e2c4425723b54921a726158e76932d22adb9a9d3cd2b8a827acef6c2d303a3932ea51e877186bcbb7a45c040e53f7e876c60fd65e62bf2385f5f57384735577fd48448af2064d45df5f7f346ebc427b1534a48a45bb9dc662bf0fd18dbe593cf5831c5876bd67850ef2c1db1c16b535892c1b2c03fc44a78685b9b2766d351194eb205b71272b2b6370da6be4070e478e1d876571ee94c6a1379b37e52eda1b1bdb885896fd3147532c7b2bcf5142cf9cc79108eb1e4033346584319d88817ceb8ed48011d7cc9d964e92f368d17438fa39eebdde1f6d679d52c38cea576a6bff326254c9719aead84df3e414b5c6a983a4ae0bbf39e865b257dd7a49ddeb20f9b1d389b8958b145eb6e514bc569eeaeeeafdecfea116598061cb32d4b99115b5120a9fbd92ef6dceeb1218ebab580516605decff322dedddfa3e86f3e75228ce3aa4c5ce0eaccd7b13a74ea0383dfee061a085624ba807cdcc2e2cd62cacd19c29e54637dbc2c6a20a577b7c077e349f81be4262095041efc89dcbfe9f0014bc504d0097ed85cb40dd6130fb2227dc01f4427dff58c5c8f41631466443490c3125a877f33727faa449ecb7829e302a3356202d8047cacd50ac9520440ce6d9d1f57c9648548757aefdbaf434245bf6f55a48f38483f336a347b2786f80338de8003493f4813efb534dc22fe9ab48a4e6ecd45363f02569335ff218bc6040ff1ddd403cc0b030e2e2ab3a391b6aeaec0fe900963ce8d691834eca8017a60b42b65da8c2082ac89cffa6b61f6c7d292b4db1155b35bdd80f545a1e538f6e1cd06bc1ba5304188c91131e48a72cf7f963f3fae370032d87a5b20239c51cba42a9c65d5feefd681c8ff5d0c51d3a8851b230a885e675845098de6a7c77ea607bdcf2174613d0081c9e707f687bda4f65000bcc8f736ead29305ed9a75f21e69ee2a3c69af2a81574ffb97bc0743113be1dea54ee7b06408987b326e096224c3acc52ff831df27d02229cbff2c95da2165b3b094fb0627aaad63f7916bd067ae1cbd2983d46031fb24ad64cad837966046f4a8a20bc7c651d509040fd1089884a9f769f68865b3bf7b989b903d0323bcc20712ec263e20e77fdb56d227eb8c01e8e9f375018bff11d0aa89e503560abb04c044a747ac8805f3c41b64cdd655cc57faf0f865664becddbcc6509834c9abce5637a9a436a717207c300e1d404c4b1de56ffb045f7fb077956dde0cee70701048fcfeab5f0487b55bf93c0f2a310954687ca09e03fc01d8f908aa0021fbdcc28864b5d77b14a42bfe07b249eef3326492782f9f38b5967c619164cf75d091e1b5a5a3328193a359cfa1b9e2163f2dc04888587dd3b11fb7e27c1c3fbf1c9c351b394dde71392ffa2e38056f6c690f66baddd7c0e05b05754e33955b83231d78e55c305a484d027b67968c23ecf6a3c64042a352e045bb062b510f7c3e4cb6f526252f125d2ad09d7020d522eda45e324891fdbc41c776668fc63c75082e2fa9fbfda131511c74a94fa2e8c7c15de0bb431224a7222c0c4e49fa7a343c41c5cf7cee6d8c0d6e7651a1b4889e80943e68e60a0bd0a37cf425717e2a18b9480fce53afa122a305f972191c3ae7cd3478346697918680a6082cebbb36b7f9e65669f835fbd5c2aa7997c2543cfe55980b279b05d7cd24e182812844034df1325f28f6442f3ec41548b8224c602f595a4cb551ce3b0a4f4b665ec8bf3f9640430ac780ce82fb682bdf10591c9347f7e89ebfe620e58bb59592b51ea21643e9a05a0dc6f088cf9c0654559a83b869f46fe63516c2edf54295537f429cf22d20523158e6f99dbd71983e24071ea286da0a537325ef0e7446c6a9a3c6bf362ba81c79917c53aff330e28a12b3a1294008ca2616cc03b5e03e1dc01288c1f700bf1048876ba681b6f16353d0589d07efc712f353cf56c89f3d51cc2a79eea8ca0a4054431a857151ecc80f94b461ebab41fe8a60ce135776e9893f0e64a5b8343d99a51267c2b3964f6b8e4d814bf7012016e70a16a6bbb3c66aeb255a72539af7605f2ad2ab62bcf3af5dc5e02135b64e77639bcbf3b51d844a3479b21377bf0a8513f013b6a6961bda8d5adb94191408f26bcf40e8d1a533173b5334d2182c61928b141ae309d6a01b12ec024621aa8e3605677ae2cfd13d69d208268b3e0ebc5d11b302fec5b0a9e721a09690354cb77b07d434536111890da147d2cda3938440de94797717c2032650248a92451d4a91a9f7027341415c3d01cc96228e86ff179736812dc7a7bd8007d9fe21f394e35e2f0375a435bbba6bba627e0d2dff4cf3c4c988d49bed5bf30ca3d32ae31a0cfc4cbdfe7207eabeebde4443840aabf64fb64c9da4b9e3a66b290aa1f08da1c396008182205f26744284da3d26bc0741f0e6b239b3338645695bb7ef8f26b373285691abec9fbaf1102ddc8bdf92ade66ab8b8afa93751a04af29a0d4e52be8ee3ff07a5ef5f0ec5a9148343071d7f1bdf2b38461ec0c026e8820d7bb704e93a05d08532c031421112ab45f0c8b3228fdfec68c2bb97bf8c1c10f8e4d0ae088db0afe014d16f58bcf055e3086fd3648a7490271ad9549533ecea9797381f7993dfe4820ef604f0b31b5678b0d81dc6c99dbcd14dc0e50871b5f2356885fd9b4c8b43c823f4956a2179cd7b028205e89ca9c002880d2f01c3c2916797cdcd842059cb1cb3c440f02c7e57a856d983ce00a6fc0a3d1bc6b44f5c26507d1e697691f255d45dbc49e0ef97c8aaeb741f2de753b6de675d6dfec41f43ad9f4aca86819801dfe9bc88f077d49bc8f431d0c29df6ce87e9056085172f1f52a1874d15f03a210643be53fac938ba48830f597ad9c0d6081cc1ce14bf8e98554615c167180488f08466c2e110c070eaf10d27a3098038689826a243854cdc5c7b0e259f315cc7dbe95c583e242935a83f1bb806f8d4380933e73414f0e324537e7a378a717e23a8d20d7c506d4d1818cd2fb9d84f8d056e0a142b6f86f2b855cd20461204596340d1bd1c0cef5ad00c161c2ab289a0aba1ed78c20cd20874a126a5cd01c331c5793b938caceb2345d7173c64fb8c1247462aa653081e3e21aabf6697099aee11edf475a4067e2c62a45f053160895fa974c6925d41ea2b90ec08af7c08c7134c3fd4dcb4257406e2a3e2ffaeadbe8aae63928308051470cd7be032d5a192ca46ca22ec408ccbb05cc32f2ce0923003ced6fc7b88f0523d0b0c00151f6778ec413c3cb269397a974af8cc6068c4937c14c1c4359c84b4f5c61f624a871a160042428a365f47c5f91c69167413fab03f2fcf23390337f3ca87fb06a3c3801662e01d671dc50921885d008b8edb5a7ce20d01be5d4446f8748fec7836e4d92d54f9434cd42608b66127be074d9e26d16a6577cf43a8083a3205ebe97a828a475c165b34537fd9dd61a1e815ff37d93f78242b013093dceb54e81e3fae5b89c83e5daf54f7034c17f38295b89a53128a483c521c9514c3a2f372510b587ebb8b6e06ecdc7df0a3048f3a5ccf870f4110d071124c3a9100634597ce1f2dba7f0c207792fc12dc0d945bb1954e9f1be0243b4c0d5cb5a57be9730a4fd1f9c2d334e723c362ba9c083683a85525e6c798bd45461af44546ab348a55e932c44700a49e149ff4e14cd76e5fa65143931f791e6138214c6bbc65858198a91f42b117eb13645fee5176eed11688887a170f736cbe46c7ea4c84dcffa37b81775224ff28a1cc3f0167ca928158c2af4d64196d1f0314438d9ad75a51bf9153a00f7d50df2ee88c7ea5810aca2124dc76944217f2c986c84ddbf84757b71919b4ecb6de93c1467fdcff73d524368e449aaa9acbe99edae0f7733f7bb58cb8ace340ac1acc082708d69608ac0e966a09b2356d3af84dd5c91bd678acb0821314c3f5fab57f6b9d0ab23f540c77293e0c162d0d0148d5b43fa2574120f319a625086c6eac15ade57911637b05ac34cee8bcff978f68af1a6ca3aecf428c793cbe3cc34273ad272e610abe95df9229396b854cd88c57b0574faed189add940415ef3ff2c5851fd01776bb24bf9e997c90d245b41235dd2fca5320ba017cf0aaa9d18b78ad9ec7f367a008214641f7c8adb99625aa7dd80176ee6059ec573cac191c9eba73bfb741018e1331d285a5cbbd1b46e1d19a4dd914c0ad3aa10eb669fd60be9648c037e7f3a104cecd79678fc803879c57fa481676109338dcca350c8d99bb0988be6a1fc4dcc152594e9752cba4bdaa425dec62a71a759c868dfd1d1b57f5f86c8e883e6c4763f45557fab7c4b085ae1e6ed5c145669eda558a37f3dda39b924fbcd30e9a52c9e549bb8a17388ae3902aa43402f64379259b7695c8a510763d9656845c099d15e9c7cdfb55624d81574e70a6ec361873e0c5480d911ad6c92e21dfc178810c95bd6e35b2994445d7c54591b92ae52e872cc1217ccdc3d3b50c804f82d000a9d3c2abd2d49a3a6e4d42ffb3aadcebe74ee2aee8c504c3f0c4f15c729fdfa31ca25f273a3141c568291fbba665c9c57a9f2e6161ae6199012b3e20846eb91c44d513b789bc56f17db1f066e551bbef79282885e6c14a58efe44d485512bbd5126761a5ef8940e8f0f3ea70766bf98d9e9f82635494b04281c55f64804c82b3b0d2169d237302f4c6d95b529b96e92742a51ccb2036ced50316e8b32abc21b75fd3901b2bac508ac881e37a8724ac9c0e7e87c94c3689933a55592bd29908bb9c29bbb6c96c9d59289a19f10234f50c695a2e86c394ecbdd0f941fef9a4e3276da09b48a92e96fed9907dd3d1c8b06af1b259785fbd88885a767eb77d64b7d712f220d079434bef1dac704d49fb7763377f0f9c06edc8112f9616807b41cebf836df6d8fbcf2f0af79a030178a9949eea4cdf24a45755b52e1a675186b57e99bafbe53348b752505d6d9db36ac52942b99c9fd35278cc252810b50cd904e616e24d7a74fd6a85940adadb3959d8b26598df0b2bd67e46512840a3885feeb4d8a3727f19fccedb47fb838718c9280f6a7338aa942cbf4b9e610647ac113e88853a8ca5017285c5c1fcb9ad443dcbaf5ecf578256edb4fc87ee110b64499fc0e1648689ec0b622aab46dd03f10e5dfb5f903667c5baf7b990bb1e9f2710ab49dd7c92e330aa1443a304c5e0f919703065472e62fafae87df04f34ec8ea3131ac8bd1d2703f5116a02e3b073cecec96dfff4196600a4176f6e4cbb924b22ff22d5dcca8142166e6be031139f337494798386a60dd509223c92b480b1bb2787850880a5d19b0330c596b7c5ad4d434710e27784d58c442ea1afbca0963b7141420e9500b82502641eb195c140b545275a3efc35351dd2b1e20125e287f3da8a0cde3876b2e8731b1bf9ca78d26f9f357ea4141eb59a7917c588150d5782e7a99e6591b79fb04587899d514e51e1311b4f57cf3129448eaccdff9f8e70eb8cb508bef25e61344a9e0ae0a8093a290b168a13a4c3e53b586c475a3592694038875fbfb85a77852b14de38d5b8c92538a15c675664cc9003e84afbd1da9936d7e49af6e539139768d73dd64bffc96209939644fce2ae6922e9d7568ca78f41dff9e1034c90b7aee21b48c9f34c41bbee6f5d1ea0291ae73bc5deec0c799cab7399c9bbd6ddc6454f758603d980ab7e1476c928a7e21ce598a47688da490c5ad9ef7acf264351856c8c8f84866bcb6a2c078ab620094a84d52ef8975b4a30babba7e45cdbf026aa34d354568cd5592a1d374925049eb3c8478d23774e85b635baf01880e471329ff61d136e6d6ec57f454e0a28ab3d92590178a98e0b07cbf899236fefe7b238c5c7547c863df92c221bd0d5cae0423edf76b974dbd07b77e5958f5a3b0a36be6e7907b74c1e1de1f765df36a0a83ed2ba6cdc19862f232fab0fdcb2027f98e24d1ece64d9a03fe2352ea8b6250f732bb8c49c3859bfc381af5936bcfd83512b3842363bf4c532b0cc71ee6c354d4eae56b630a25598f7059b84857d32a05408e62d8c025428b6b5251614cffb79d384bac874ad5f9756b4326bf3866be90d1375816625527a8193a80596a0493432bc55aa1b974ec9dde5a76c9e56361865d411c1355cfb23bc46c9883125d4a8d7e3a2532f9a4cd463431bdba34b8231aad7dc8be900a82495298f54bd4f30f8c9b71221755ecb655d12dd1c23b659c7dfc8aa9860bc5cb7f28dd2f83851975e0b36456f093f0c8fe2fbec0a261f81bef5c1607d076d62d0b086c2634177b05021690d0dd557ceb69e2547b6baef3d1b03478c923dc62201b9290fb2186f94114f4b605c51864bf660132db09c4c34d651a119d081f0b9a616423631fdc87bd52b0f128421bdf1d9a63ad666e38bf252c541b0108929b63ec1d8a1aeaae8e69707c65758590ea8d1f1b3d7774276362df450886acaddad834d3256101daafc727b4077a872b0c944e3d3b20d2b0c483514934210fa6cacee2ea5504cd397775f1442b1962ecfed5608891a7a39b7bb222cd2eae5b959047663c0eecf246046f84a9e661967925c36653e74e47b260366911346962a81fff84185bb0f1e1c35f1a1970f6ed72c2a500d73cf8d40427d03834380a4c35680476b460ee40bde5e0959c32c7ea4146ce35bcd082fadb266d9ca351757acb7bcf2da852bd72c5bbdf6e28aeb0bb656391366acd86366950d036bec98b1669781057b4c23661d5368c0df33ca4439934e40430e3fb140f8d5c69628fc059405a201e293dce907789ea6a031012941b46ab34cfffc3e87136c4d050b583c0d16b30a3f8fbb9210b11e9577f229a50c291bfa1765211dee0a9a37d01593aae1315aa5105b29e4b7d2793457abffe275ac3e51389b3ec5bebcbe1b32651916a86a1b956d6fafbb1a95da9dd9f0406033d7d47d13eb961c0c706ffc7dfa8b01f4cd8901d2d541e6dd43689b9ace1c3368898db6dab416694e57d960565c975d78fe75a41d3a185c75c76d3d153f338063634dd4e065ad80f122af54ad52bdb58f4fab9ad2746b79bea22a55d7b6e5fd9ad255dd18dbfba9aa989f7113d3adc2305c2085c8957e3afbb1e226723719bedd78ea330fd68e0bf1c2fc597d2f09f919b64c58b8c3602544e669dfa997295f0a6d315bbdffebdf7feba6603be5aa9ff9e4aef5d1d532b1290d4e7b673a01cb7cdee0822b6b041ffa919043cc5b4e84ac222455913f33f1e056d220634d3ad0965f683331fda0453e5a44bccf29294f36a610756e28159b47df500923f083fa95df37c23f648d37fdebe7014d4984dfc8455f84dc34f6108ffcc95694a2f70cd0b5beb2cabd0726e4b3f44c234679f596cdfa94dbb66cc27eb508a61f1e1e1b547e4e328568204ce478e97549c6d053338214541f194ff6292c4d6ac1f39e0a41a7f8a43bd75021f78f4d7c1f5253eeb57a84cd28bc564a7b6018cf08630f431cd206be25446cdae9c05023402c77e80c768e103cb302f687850c4fff34a79382b9cddaedb3a57a42a5c36ff63509fd3994dfe282d861e910a15fa280ea661f59c9c3df525d9350416d39baa0a978884e9c024fe9299d39b525027836c287f1d1bbcce50b543b5e7028400dc2e8af8dc7de38ebe6b40b8a10d785f82835112b4a3ced2eff6715a575b99697037840edb2c5c03b2a929814d0e1dab9e03d41836320670d09a86a1ffa8ba72fa76c84d752823e61ac05f43c87362176436f6af108d71cff67e86ca6fb2f76d40222fb57479cdd1588deaf2b32415b58e18b7ae97b4b460e0cd0da90f90357b933f7f198e8649cf2c555c8f1831c87721b899c3f0dac50eb12288c0ca7242bb0485994bafc0aa085b69b4463afb6caf6817d51ccabc70ae5f1e3bbce02347fa0b2acca474fb0c4d126cd25af47518ecbe1329168fecca8f5fafa4d7f805cb52dbf045c2ad3a24f88f555075f2fbdb714ec9d1afab37eae7172724de7a395d513388d55a3db00f51a72078fa33b46ed9d1dec593c3974c6e934b33054e1032f1399f0d3b55ac74ad103c740c101fe54d703e4d8d18ba753f9195eb665ef522d6d97462b77ad4e735f389b21e931602a11dd55cf63bda89997b4898ad6cf00573a6677beb7722663c4b54680c341920712bfd708eb78a43fe510715791075260ea6a6b5a94cdc6c8f53dd264cd8a228f4b01a1f74da7f04a8280b9d9a130a1accabbbea537ef1d7d0bed1c26e6990fa94933fa7f0ed3818abb335fd03082c3f7cfa4b03031cf04e61b76b0249b3f19d73c2bbd5fd6fe891f01111e3dab2c2b74949fe92592a6ebe55cf289b806a56a1670388227d274dbfc0d99f9709d147ba261cd094471a582c169b76c6f7aea25da0bd06d5a5803552b597d7952aa525704303c0e22ff14416f806de870311fdf1ff24d757c8a83b7ad04d21ae72facd98db0676bd9a32bd0d6d8e4d204edfec57103a03f5e51569ac65e6a165a7da5df409ce12d5ff08c8e7d082bbd2384ad474ca54974d0de189a06a88d2df3808d74f0512900927936cca65187b87c8bf4de6c63ae658e8595292c54de0afb1d80744b193d91083d007422fb8a4e1ead346a2842bd0c02ff61748c8f49916bbd9503eeafa23b3ca4d752c22b15c7aa5cbe742bd11d01575809bdecf4090a02024665207e3af5e60b6bc1277adb144bd8e8a2c7c9ab5f59b647e7bc610b213c52760bdc40975df6e4fad8c234e0d0cea1b8ab2ed25bf5c86c95a1a7d8fcfaed87454281cd7bc0941b499a2729f072d90350992a144a5b26b4d57988514166d5170e47823b470b660fb9be25d9394c4b39f7f2ff9548a4942814c8303857baa6bdb89e75cab4258a20f54132dc4c49a04c2e49690354e61de9ac831c9174739462545c8c17fe7a61f02053693a4831dad92b581cf23eee7f10e6f786cc765248f7315f6df1a70dff53f4631084d197e6c58201ebe2ec9e1791698abbb43419a8b1920353fb977eebf551f489aca38f5687a98d6cc77832de31b4fedc50db922fdf9a53225a5a79eb3cfe98e5f79dc2a145742f61004624e161a3abbca5e62334e24d95ee35da4d9709e02efbc6815c1773b94ed80271c81bc341ce5887d88260386b0a47eb37fe9d652784048bc2e315ecd010bd3ea75e55a9f48af61336a51b097b7265fb5b9a9580c5fd96b78d9b83b8d30bfee0f751c3802d2e36d1ec0b0336554ca5921ba29c1ce84e19dd55390b1ae3c8e490fec9bf68454822c5535b88228b6e8427a2b4b5902d556716eab863b814be08f1cf003be44a61866bb0fe4b8db39785bdbf149cbd5ab85ef7256e4bebfee5e0d6163daf91b1c775a99839c0549fb44e4de4e01de600a408d2c12522b5ba0890b1cd5e2229d08fa64688ea903dc15d6bba3779befac719b1150ebb2d52986204c6e4a70d0946252eb0b8112d644a62eab754c655628f910f8c45fa3f0a84af446b3e58d75a45a5dbe252edf3d1b6dca69021ccb92f65fb9a081e5d05a95eb3b3dbae2f93f8702fb2e9927e5b8ec0cf6a928cf8b50cff9fd302b5389b711ac9b3611102cea808f8eb0416058b281972ca088d70da787fc6977f5c9f7f85e173680c6803637a0d9345d828c4472376bcf3447c015292cb3978ce3bed59a861f831d6cab6999e3d7fa74a09deacffdcad888629bd022b39e93cc47f8faf267aef6b5cc388ca7492f343529ef4e996938c88f5d5e5cbc4ddc4ac78b791c7c5991b0ab1fc9067bd25e331271c659bdaa242682196f31b86a4d88bf6c4ca7b5abe3f5216a40cbd9fe840be4f066897fd032aef85192ec1604abefa498909b3d1df53a53cf137f67fb7fe2aae78f7422bca4f612fb00de9c0f177288cda59bdfeed99570e801ddb0705fd9dbe30baf77b35807a687bf8812df6e4e02b72551d462477d6c660b93f5c3b5afc0f4a634c7053df0305abdc11e20bb4ea83daf8449b42f05ebb5292b84f11ddb3b7b1a5ea0a4712503792e20152283f607154f9ed5112dac11e53a77d602c3d9b78b5183169833006ab2b5a8928a053115364308b49e1d18a0c8f3c92bb9d076629f803bd82771e829338383b1b83de50020c55b8358c5fcbb5db9f63653dc126c713c75345718bf32a6fedf9709d76f3108feb0c62ffa0280b920410c3673e88da67e1ae955be9578d27c4569c68a3e04c2b57a176f3c9e320c4153e663aa41708576088c91865ec20bcfafe04e48dfae588febf824389ff6698a1cdcd1bc9272ba577b24b8d5474c5a38e2baab7015d4881563eff1c66666bc66dbf9ad8669c09152c22651a9ab376c50766e2fa6ba30aab95f51130e102ad8e77f366b1dd4354f8067e1c11f18cfcbfa6707a71a03db77144f809d549ad3a2dda06df91fb3fc5655590870b6994ff5b5ed45386e94f583c7f74658b9e5ed9d05bb03266a32b1e9ee8ebf60223b8828a5682410c5137a614d3bc47038f4755a5945d9a231bfac544c6accc68b5e404c29f21c193a6cfc1d5da982cc5a037a7a80a798a3704c93df0a4d8f44af8bc4d912cf4050ca81278464bd0a2efb477448eeeb860e7c1766053cfab66b2bbf7d75a6a25072655eb5ba32feb44133a0e34fb2d70d79b10fa6ec4de4486b487bb905e433143ca3e63b1b4e19f6f85d2d3629910026a9007206c7102651006c25e8e27dbb1285912844ca364c0586e9d57fe06c33ffec7e09780912921052ba264bb1fb349f255b0a3978122aded942bcba0714ff5d66cc8d757cf3c0b62af0c0c2bf1fb084f1002692ed6e940b30edd33b0a294d1d6cd34ec58d0d8d12e7c237f61c67c496987e6a222262901e5f906b69f988f2e2b16ca73fce209ed80bb5c844441018cd40d3461e0395a4c4c8255e9f7cdfc4344789034e2934fb514330a8d904a1ad6f2207206af1a0ba24902e419a425b5ffeba76617508296db63d1dc55b3a04c6647d95cdaa59d0fd2e58be839e2b8976f9ec4bcba011aa6a96540989857a323410bc7907062cb912bbecde9e2b3ef35cb08002cd50ccf587b183802ced4fc36ed4df501e8eb29bc2f39793aa81e12f8ce60dce603a08844914125e80885a09bc1c3471c47ec5b54250eb80ada65812a8730e5bf1815bec3e33180c7945931f3a635429dd513b5a69cff0b0ac30b5c87a9c1aa7728089d67dd49f0aa52b49b058b4019231a7366dcf608b55dda6b2a89217ba4dc26d0f91cddf13aacd52119d404a81fc55e5207c82c22445092d2a035562cf004f36d735622a1e8308da635baf8412852fce573c143fb3ab2fcec236b8144727563af61bcae8bec0c2a0d68d2fc6832f8080f7c3e22a012294798e71889917c143cd243e86cbdaba977b03dfe3ceac2b9b9637bef6b12f593c70648b34c62fe56d0e8c840c0da44d3ef50b4810aa350004db803110767a18389579940d0d0c64e720bc5e6dab797de8ebf7ada0a8dc402bd1a6bea4a1d1255048d1d1fa2f826b865d3e67ccff6e7e76e113b818be6272ec0114c22ad5c36e9912f27217bcd090a8c49e013387843a1ef7ebf35ad14b87a9769e24bda8d3164eb32253e82b7e691d060a2d6a421659001a067b15438c61f5d8e927607fb6c51ec62e5d21fbfd2ad7cc4d3be3ecb2f43768463e3bb2137066388f411ca61d7132c2cb4890f9593b2d8352faedd9743fb3ca137a79a2a168c4b9c88ebe72f75eefefd05a9a891c38e2aa95adc1c60c790aecaed7871c406c9c60aafcd37d9c6f9398fb0c2183a18ed93450af9872679949c04dd785eea630bc96621d9e7f2aa5003abf4d269c27afd1323f050ed064bebebf3f5b647f1ec7ada20a9d353e185fad3756a58c8d6f1270f1ffc1c439cb02c69816f90ffaa69df67db6f84e4abc00a78d05b7015bd62d3117fa23fda9f28be599fc4d00f313569dcc6bf52f9db3e157f65e03edc234e258746d5bd0e033125a8cc23bcea82b78bc1cc0641739df39ae0b3bf3450bfe87066d18f1bd74b2040ea20e12c6341c9e3220bdd3fd29dc9785b4a7ef2d24d9e70b81e789d6783d9bfa186a9fd3c43939fa489189812d80d197f733af98d001f974bb937f5e234770484ec8681a6790c3aebe245db21fea4a43f088b2903053bff393e8cd5ee5e579f5e991701dd706fc30b78b3bd3f0bdacb199ee1f58229290de97ab9fbf8de704e3c925f94555e1fffe54e670f1a2ef7499731521fa43eac0cabdc36f200dc8597411c89ac3cfc81af94820caaccd60d7e846a3960656b17958a3b80987e951c82fdf1a0df173a36f3af7074ff1fbebb3a1f14be0912bdd64697b7307d0c29756b6f04589d804a2459af1f8e9fcc77c9abc0f6230b92654cd6a3814f201a3e65d17e727d643e84217db840adf5de32cef7568ea5c72ecd4f2b0d9a0f4db5ffe8b2142ec4b259b5d347becaaf7c41d2073046ac15df55203b1b23ba59bbf2dda1839205a24443be03887e0b7622de00028bb13d8c28e203c541931e81325cc4b7f47db583cd107fed56c00ba9411e16b5aa000cb0cdafd8702bcf9f1f372949dd0d8d406f99cc30f56c60316417508ef21dec12aa3f83721f10ac7e864ddce3ed79e5c169d81f7311e4c09a9f0394bc0197c59c463cd25b5fc3523d16f80430e04f9087e34f34681e964c34bc3cb39134da76a3d842cdcbf399c7b765169a26dbec245ab1f95836b1f0f4fcc6f36c9a8d461b363e93a61c3e965b581a6dbff37887c663d38c83d7642b2ee99d270fc271d18b5b9e4ab4452f8d7fc69289de3c286077418002b415b436f840fec2e1d0abe43658fe1da19685fa58a44b82cc642d77abaf7308539d7815beb36fdd7a067f31a1d243e7f793c7142b8e36659a77c2a5387e26292143f5cebac624fa2db16a63d12179f65cfd96ea4a471968bc2552d508b1073f78dd18ff2c618473a7b504f55c24e417b8e9977a4360621df0a514457934f0cfc4964af9092e82384ece869edd0920f9d60bcb219e61e68437b037085595276f91eb69f1e3a580f22df53af8ac156644c001f91f99c1433b78ddff7be553b2801be291d665766fd2d1b496eea7006e4f723aacc255e9f531e6f778f7048c304bb1114d281132779e2c034e81207990ef52f70d7271a774da806811744a23ca60b0e334dec6da558dd19ebfef12b066c7c90e0e7043e29030bd495325606225eda7dd027bda63e4e5d28bfaf90af6dc4cf970d428f4ece40a5226cc621db4227c1decaa4cea51d02eabe6282b489b5586a1a72c0feefbc8f8c2b20883e00a06e16baa81a1c1b6ecaedabd154c65c74f8d2c2d18e358a431728460d32625e301c9807cd76e3d31afc8cb4fef526b02b08c8bc3943df751979831af30a83f9e1252946702bb512aca5bf1f82429bbd8daf957583f294575b66037085a0db61aebe14ea50f8770d4ca01698e3d86d33b0ad193c820551242f2c21b719bcae2bbed14b83ecec9d3be28806e42928cfdf03ea82d6bb4d294d13050c169f07170e72928e1433c7fc54f761bb489ad5dd23028d0814609f494f6a7c5eb5214b0358b056ff81383a56d59ebea5e2ebdb4a38e1f4b8cd02a390f3c1387140428e9b04ddc16815263f9a219860bdcac833a9d00d51fde0327b19b4e60f1a51cba1f1c8b3a903b28e497a04ef6b1ccaaf526d571866a31ac3671659d830274a7af1e155b7284eec533afdb1d21c053c686f687081daad3e0784a8a397a89c7b2259c48c41aa72ed2106879dec92d7fc4ad6ed22d7ed9200cf85e6f1e251a6f605b203f4be1fd6ee7808aa5d6189f4142179561b001873c21073b7eac57dc49f1e114b63cdb2a19906fdda9cd3208785b895dca964011dc6ada1e300731c1e1f881f91a271db92a4d3b06a70032d6a3d1932b0c4bf6b8563e89030b1386544fb5d86bf4d9617e022449c497b3f3bc7f93fef5655b2688fa8ff5603422839494d5f2cf324ef4c9d8be6fa59d48dcf879a3cb4c1d5913d54bda54a2fa37f99d1bcfc1d58cb6b499e76db1e6d8d23f9c9703ded29f437ca529d26c4bc9d20a31fc5b1e3738b11060cf445966f15059980055e61ac7f5530f7d040b1803261d0ccd42247a5942ad27acaebd9fbef1d190d845e94d00746e0ca6f963ef8c00a66cd06439326a42c440da2e72379095226256cdd84bb589248d230531044e426bbcb5276d5b05d72ba9307abe28e5961038e12c1eb5ffddbe32630216cd1ff30d5d876a94cfb50c22831b66af1c70b9cf1553ec13820968fde02e3df577d4ab3f8809308d0080e468a5fcee07e43bd283a4cb3070b5a776db4f6691010823309784090e3d51d0c38e293e4654bdaa61b020066cb2a37334c0ba4323016051c8c843a77bb537b7537c2a260f8e7eb6838fa5bc73b7070ad47b2b4a7e0e0ae307e252ca47928bd70da8ad56a884c4bd085d0a5eff3716a3b24b415bc3cf09f916dc91fb219f2b4696a26cbe1e7286577081a678d3804b9ed3c3fcaa9f240281794f57a7d66a702851b085832ca2636d1e619fbec86c7a44a7070457d0a3446288545eb9352362b01174ed04d54759d5e4832ec457df33d435efe2a7831e0d2f66a3fdd215f46808bed3744fb7edd94659f76357d6e88558a34b1bee17c7e6f29de48f74c353fdac767fa2078e786a91f7740dcec2df74a22ce348d0a3121fe899cf711e85d0dde71badc5fce715fcf03abe3f79522c8e31cd02c30a7a187606dc5e7fe91429cefbc03c37ff0a987cf1ffadaf371fac14d91e004e64a656a604a872ade3e543e4ab27b641447f62d9fc8d354ae31e9ff658e60a385bb914bc0d5c4d73f8fc29161012f7fee6963f6a5f4d05a7045a1fb16b642a014802645c1e5bacd43243a1d168f0d00dbc9880e7c8fbb678ce04fcafaca0d71eb3b25402f4cd015f54378452445bb85e6489e8dbe1f541c93865864ee2f6a3c8c26dbac3163fd17f283970aae1fc947190d94e8774e5f17396a13be0144c5a03c2301555a17f0c3c32197a3b6addb10b713b8665011a7175cbc3dcf5c7417b9319809e3672edc1c10ff9c510b5b2f2ec75394e0ce1247d7b71eb35e551098e25f14c4ebf3054d71535b884fd4ac9bc0e6c050ef8df0d185d0e82f7d9b93c96735473843edf6e38d01dc43c5b7547e9f2a4bc2a95a99b9de6a744d972a861f56ba20d997409507d39ce5f5e2a7e274d549741987f77a8b914193c158a3f31b6164269a082b1fc4eca63c947bb0f4b44806a561e5cea2f3ea8941478e310c3d784172982c371237b9c91704cf82eda02dc1959e8b6fcc78c8d191e3b16f9e622f6e48356f3bc5025383fe9b24787fa4efb1701a1d4e04b084808d93c738e32b2084e1c11d6ad37747426a3155e503ce28ec1fd03ee889833801e5ae08fbcdde0c8a900f27aca3fd384acd739886a6f2f74d91f6a40b73689a0bab8b95a09bc44829b71b2b6547f594850087ba5709c3c6f48421ba6bda08ec8873cca66034387cbfe8c133a2cd042e0b5dcec15892ea64082fbac26777ed1612388ecbf1b9b0a58354001f752f911286446274b78a725d79e09b2ad6845bb84eea7e760cf6190025ddcf00985c6c12f93a57cb76f2a6e0d9b727671ea9e19bba383d6e3c4a25bb98dc3ec85ef1782d619d1d736b4253427b4dac99c168c2b2481d9b2dcbfe7709dcb9f7c6c5a0397858f99ad78858fe1cf2a9c45d413538ce3b41c961d6db2ec694bc0ddce8a26e6238a81befd864f178d6918adf802913fef7c71b4dc4d14d6fb50180fb12a4614470efcf333ab10c2493d16a06266cb46df8e6a9a5764bce39f006d8d128cb1e84e02038de11460866bc18406dff1730d1327a69c26b0aa42449a05b1b7ab0bf9411ce1646a6f862a053746b3b8f8736ab7c6a10fe7e5051df3aacc0283a81bf61a128c865ed040d3a9b68735031cfa0cfac2d84116991a9a9441b63ed678426a3199662c247d170a3c9ea72ccc5d5283838c55d6e2b520df45eaba982365b09fed3786bf9ca443e388018725f4d3f72d691012aa33c61704583dd67273cc3ecb3b329fc5e28151112e98ff37a3213b94a26cb5b284b78a3bb34b1055d632bf39a995c16c837cb699d0e816710eab68c1265af1fec2210f17e728e20b4fe8e9d09ef7546b776021564d9e9b60a711711b53477a073ff89e998abd343cffb21ca08a0b7ce35d3e37f3a2450e839611f4a8944bd0f42bfa8e59cd8a1f2997f0ce3035eb65049ae70db615f9f98b55f620826ca7b2c62ccc5d935d0bfb584ed83ed36fbbdb68e78fa7095da8fc0e93ee95c43b8b0b98fc56f25154063e44594e352747ae8d16ad317d1178696498206812d081ad33189419cadc21662b03851eacafd4b4441bda26680996de3059cc0e472a51aa6ef704991db5dff4688115f65a9915133d0ca84dc5e6024a32f3992c344427b3541f32692fe60a39228bdb6260f084e6a4afe84aa4025bbbf05fa404b9bb50fe85e34f9160660e6cf4943de667fab299981b48c2ae97e41f58736d56e1c81eb5ae34788d474381d9e7e1bc2e56658a44a9ebd3da1dd657e5f0d40982eaec53511d98a43a887743db1b69f45b47e45124aacd2df8d1d82da9eedb539dee12822815da7a2cb04e90a4386ba2ada5c9e26f1349866337f5ceed875e2070e5f37256bb1c8d8c141de9da660541216900b40208a808658b21d9d6e67cd965ec3e0e918466a0e1de2b74e796f56b023a00e3c534750d24e480a47e3546b7e9f83062e5a9f38e584672bde69feda4b0e8c6fdeeb2f793aaa6aabc6286edbdf6e2b271926e7fc7ae59ea19da357f77d0bee615ba21d6d24d5ede6f32c9f046717767d308ee80717c3f76d81742ff5dabb23bc7b2bbb869e50c9cae1ebb8e18cdd6d5fe5ee8eeb32b3e74ee1aef2f00421bfafbc0c599a68a3ea574d32d33665a994d23c837f5991c6b197b81081a8b27326144186b52cf338c0619b05667c2d5e922a24ab2e9ccc5bfa93c51d1da778f9eb19eb28d35c7d46f3570bc6c62e9c8c2a5b58c7522f030d0ca0ce718205174d897e9244d2e8b567b8726518ef8b6d380ab4a5fd550bff14d0d573534bbb5c269ab682b78f47d1910d19c6b54f217207c60b08dd74c5dcedfcc5a6f9853debda8c44deaafdd49806553ee62a84f6dd1ee3dfa572771fa14eb2d1b423517d4c0a4c6807ec7fe6d09634f4efa258d50fc7cbea15e390db118ae0f2da6355275370c22dac488fb2da6102db4fc391b1364ebefaf8c6bc66add93c8c076032dd73c3d6e4d3b148c9dd869c67d27341f688d7f4b6d0d280dd1b29da024fd9d3156eb1b87551dc7f6456641f8505f32fc510b7143be2182f8c0a28cbe4e6fd6b3cd9cb3ec003ec3fc3e32cedfd7390256299c5a8cd7ad1fb2e59872e9ae66eece56e231d174b1c54ad7f9686a59de15c72ca1c716e8255c749e2b92dfeddafaa0fe760f7e567c6981f28a4b2e7b6a8d84130378a4d4d09087ee22d3d89540f7328a85415334a9a0a8a0a9d30dc896af2fb0cc8aabcda132f1a8c951e5d219210662c698669e0cb2464cfe2327fb6e1c7efffb0a84cc5d0c170da94d09445a2951cf7db2f15a3672b24f11311d3043c410beba4db310b5fab90d292a6c3f90b0bd32ddff021e1808300e6601060870001b1ac80499000a21900820163064bae9956e913e4aad42b3a7e6221bc95c4517e108b415f818649d579fa179803d31c6601a924904cdb6336873a7aee427439f0a346c7e6d603c3d869759d8d8fc6d4e0c677a3d23f22bf73c361ef44930c706422a12ae9a1722711edad5da39dc72f4233ca7f31395543ba0e8698293d3cabb9942817ac38014cd47624013c440890d40660ec0ab73bce184732492e41e4d1397ab767bee8c374b5b21f6b9f6476721065698f90bb149536d21193f340d874234ec041dd138d1c6c28c9db9dec831a32db44ce8665668bbae1fa4f9dd40edcb4ca315ce2290a676226e1be8b7bb45dd46391dd3c94c68728ae8f83671f85c236b79544a1dc28d701c72729f35467506f9ec63114e9f2d7610e4862fb8b60067dcb10feb3f27cb2e259e9f989896934b9914746bcc65ed167a5ce76124f966e2d405f3fb20965e92540b4be45a0c6960b2241696bc51c88a540e868ae00395ff1709a9c2199c46dc1e390138a6014d83825a2d08395664dff0e37b2310a47c4a236726a915c72ac04635fb8101bfb19578c32df51b3955910f88e64f9a92295a7a8112c8193620973a2b99577d8032b7735a5c86a78235e4afeb37d0de53d3566b76b725c8cceca26a892c33ecfbed0d0021fe1e030f7cf692eae203e65f0b345d36d9fe6ce05d844ca304d634a2f6f3e488c724a78fb027c040b6121301ebb82cdb9f93fedc648ae3240149855371b47a28044ba1bf479220d0f97a838ff36c5879c4a6ec47a8853c9500e94e990bc07582eab08384d55c0c09c9dc3421a9505b4bca214a3a1f6dac1ca306b05527a494960dae42e0906705e45528d83d780cc73b2c862eb6c812fb68ed02797902769bcd5fc7f1d40f8953844a2904d8c2681d1c777493caafe4a99682c6703d00ae7e78bcfd6940606ecfe9b5faae08864e9621a216934744aec9c4d5e4dd503d6772d6bd7e0dccdec53ac0db388d75cc30c7bd8c92edd3f623a348286253a627008a44fefa75e7a4b17db37fd853ed4a0c1b2deacfaf37006eaf79fbb62ffb8bfd7d2d4b314c6d2d20e19454de57dfa1445e9d846cb1c00b7989644a888ebbd595efbd87ea14638339b14b10d370862818071d1b3d5a15f0672313a2e9ffd9d8698c0ca2e92e900ad2cad9021a6025358f25f4e9ad164fa0ca19e02457be980b9fc0909833f4c51ca2e80d5247b470564cf5738cf416709fbda2364871f46718d9d6f3e180574db9ad938c24943a101ab1f0c628e00207595d25674a435cc728ed81ddef40156ff1876fa1ae50f99a968fd053433e3d67e4f65d1ea210a7ffbe71cec3dac2dcc0066c7842512edb347c2c18c99f3568429ce10b509a7262df16fae6fe7daa3f080a72ff32e0407e754b4a725b3b22ca849dc65162c23838544ec2eed442af6faef41f182f3f964fa813b2b67e9f101a78204d0846c1c965c6444f15d36e1e62c2fa9d82e6c55002f1ae5cc3b3f76f2dfa9f2f5a2f30286bff27a5847f58cb30ec863c3dfa2a2b9eee394f49f106f9ec7793ce9f650a6d4250d4c8817881cb6cec80bdae4bd74dfc987d717db49ef0284204ebdf6540a54d3d00cf0390813d6fa6ad07da98d0236bb7657f0326cf9833ea3119798df1c2e41f4b8d8ee27d906b860737dd763c9a6749bf2f75144d88c7803bc005ce9bc479da5ca5810bfd75df3692e861e45ae4611fe2f8111f53b9d9c2c1831ec19ea04b03807b842327655672de173fcd12993a1667f772836bda9e317efb8b1289e3989ba4ea7ab6aa6c4f676db7015531695de506e2d6f076697ddd014dcfc71b9061315628419bf1a40049bcc6c18b58323bbe0a68488ef50ece30927e2a372458e8b195b9957174e163c4ffb32884feeb20ca31c0c3b5da021b83156f7ebb8d9bd938a38900c6b1991fd779e81d414c16fd3503f31b17bd7336f4def1650abeab38e8907dc63ed20b1d8185503e4c3d0e5dc6cf527d86f2a92c1953460035bbc47e04786ac3fb88ea40ac3739b9e300353032b4ce4214246f4184b5d2e194610a2328e441613a13360197b58596086afda1ad7a8478721c059b84f3a3cd345940e177d4d702d96208db3f6e959fbe44b296fee9fcba3145d639c50138ccb7b2b58f38cb87ddc47a50302e0246419793e7b1ec081b7d5212592e09855e423eeffe136605b55107546ea6b85f5681ddfd78ead393ed7553c928636f41e1fe8ac0eda1c0ba34a0a89ec080cce3020c094209a692f90fd4d870831c9b648d7de03e69c0def6a16754a95a8d9bf1fda827d30cec3fc13b438d52f4c0e319a77f773c834fb0fac22b8e9b5c74f93f8d913a18bab650497a8f7f44093d68857ef52faf03807a9d0110606deca9e6b8a74e0849fdc0f96b3100b2843444c62ecf2486804338b48119d615486b048c87fd21f53d5265a3aa8e21007edcaa4708ad2778c2439ce7e4331287205135765e00f2d9d8cbe4c31a44241e47a16e56020e12c07598b28e5e97e2f089b822cac959613f0d8233affa0a18f60d39cbf6f63306ef83b85c5cf4d8f4968f722322c9338385e85611e67c01dc4ab96d0e5e58a2dc591cbcccead7a481ba32f2697dd47743dc8cf6e8c763f291ca2190c4b61b6b997f5bd1b6b142c803022d590a9b3c4035ae6712a8717942785f14f25f5d9628571b2136b36c98fee5807cd8501a5f384606bf5e8e308c910362c1df2a494e10990b72403e83df98223e20484198aa29dc5b7f54d18a92024d208f2f239ad40927cc940ac4adf56d106981f0b9daf72a63239eca894a5572485ac916a30e32c05b57fbfbe413d59b883a3caf60dc7d4e36561d4f4de64c78a7daff5540e1fdc4bb1921a8088afe6ddfa8eebed8a051e4a509e21890056e1f39c86b82d90b19ed93b75492052323e5cb849da5f58096f6abeca82f2c4de85f6e43aa4f88f6a03793d4c7780cb197d1cf24eb30a17d6eb35fe28f14eb220a34a256c25cb63c8473b5f603d4d5900938821d17b302379c159322fdb9b5baa7a3a9d803989deefaa00d9f0427e746e01a64c5a8f9c370108feb9eb9e394c35d7d63f0f526d152311f6e80d07c7d1a2dfbacca330000373e2483ceed0af283685881d1e989333ac8a5483ddfa6229aedd36b0c6da7914166e6ff5446f499895cb7ccacc642123f329f74dcfa144006a98f81caf9ec591b0bf70c83e01dd66b304016741fcd0a0a3d91494cb0513e691dc0ea11d648babee6cedc991d078cf9d30f01f9c2b14d289ed5ab67c127818ec06541000de632678fd0c644c0924a8730ff4dab036319ae0881e44c5b823cabf2d2471494ea90b11c9222c07ced09ae711e6f254718a03476076bb015a468bdc055608511e009f3d2a3299145008d496e60612e7f7979093a614c13c4340a7245a7611d5676a86403071903e7c8ddde09df46421453655f612969a2d7c5c8f15a5045566efe15c9c020424a6a3c42edfc176abc9912026af5fea6c489a199510d0f2909bad1485dd5ad93045e3f3fbbc619393aff06cb47f7b5e08856f8e10ade3393977f7648f2f6fa9817806f88c06e334914ae67058e008b6a9559a1845a22e59dddb4bd9e96610d2b6e2d649929d4e082653daea1ce056924a2f20c328294689ff8fe9f11021648914cb90f720c5eb936b05bd8c9cbaf31b21d9f3405a33ee8d83c0d4a96e742f38bb6ed12514117b6ed0c508b4aaeb3dbb2c5d5e96f9a4c66164cb2134bf69a3a53a164634b9805288048f71e04e3467147820adb626f185dbd2088c438fc075ac19377c369b800bcc5adb672cd162b6497401c1187722d2f17c4826b5f73c189d274c141b0d55c0448f37a39318f93d0cfdb14b89b02a511f471f230452ca9a5a6d6ab22f652b8e40faad0bf5a73969c4b25131ffdaf3f5ce00287372cf984855a4adef844d2e18d05a613e9a358ff4fb2ba65697395063421f6ce9852283e80fc1ecf2a50960f14bf9a304093671246cb59f38c9d887e6b55d8cb9c0af4cd4d6f5dfb347bf577e1e3e29271849dfed28175b61e1db841a78a750021c1739b526385db785ec05cb9b007c5d37a79d863850023fe9e2bf3f34976c2f586456bab4b6058478dcfabfcea4bbaaa6fdf021655e18ec88b61aa92b43d5708af75ec35e8fe081906f4beb54af9e65761172f8825ed93fafd2f14cd72bf31e8d84b48b85216ab66b1f48ce9122438afd2183a29f0e77d206c19528b513b4c8ac6a7d27e0e8713b428ab515bb042dcdbeb8efdee64f0420d154168289035837953940e7bf472edb90271039b2b1c838b373b28fc997c4af7190f3e78c838f59b7d53f939c01d0339e7c2f08c0898d0c30a3a4ee236187600e169c39f3b18beb1339755981ddf295fae36d37a903e8c2a63b248548f664ae14ea2d03b87fdf942acde1115defec449c430db20f93f46c84728c2df7859c43e670947fa7511d6e2bf10342df3519bcd67ef21f0f240eb57fb2a46faf0853e63016779cbc0f6e9b85c7428671e960cbe7010db9e45a9da4b4f978afb18304e4d66051d5e58f49c8ccf2dd75a19cc84cb78f91089caddf9e506b5256c78e52cd4ee41fcfd8c475aea8d7fb18c0d2e397895345190e02ab3e1c9fbcee4aa5cff315a9dcfcac8bfab61acbcead2f28cbb0310458e3aa55358daeac0691cdd46c66737bde3c9d48cad06f2d5c6be8c0569f2024f14619f5f91752b57c0619aa9bc964bd381b98eae18c01203cde8077983bd81aea42456b9f278572af8d453ee9eca1f4e0a33185db9e32cb9ef448bd0006ed2d7203595dcd0155e4ca9a68c6369e6c9b98772ccd35da36049ba3fe64a08af744d02bf672b5f3b5796a4ae3e7a48a43f3f28d00c8fee90e4dffade0563b7e4af8a73eb065850520e579472c137f2161e2d0cafed77b7725b5db5812276ed60250db759e9d427f02ee7a40cfd5565b4a3c008013cc858bc3804b18b9c9fca43eec6076aa63d2006e0538f0a40dbc4ef4c9190410f4a1684ac97008720fc2be701e9ced2f22309e1d935a840eeec20c04b49c1c017d8783d161f0234bf9d069e18e925317c708408155a296822938aaeb53fd8540c316ea579c942a4199df1bcb07cc2b2748b1078a49a6b4e302092d0f2496c973d82c9bf19f5e8670c572e1c0cf5a154cba9bf4a580e61f954582e134666b00e8d2abace589704473f1a3c2d41f991d6b416cd5dea87dc228340b2803164577dfc05606138b614bea6f1b721cc49a8165143f203fedc618479046b069fb446975aed42021ca4c1c847fe72cbe4e8676c3ddc1676096f8577058e8661fed45c94cc24537ffa7c3c49650c4a57da5cfc348bfc1b25d3c46e7c8277c348910207d5b4f2066592a6da403b24dc81274b21f21dfbddb5cb903eebe142f4bd3bf5867aba1717c3874000a170bd4104b99b27df8ab6cd919ef1592485799d6bfd6c8cc3dc3bf02993c74faf81290d3106c0f02f0f9db352bac9b340be8eb6872b8e7039ecbe94b8f2b6066753fb6d50e85ddb50a6a0b8c55ebff1ecfaff6ed246170d2a4e1245cabf4d39524f1dfd419ff58a12603ae26a116f7a084fdbfca6317950894a58a2a0c276ef64ecad91411379e39aa8eefec01e1440e154eb60c84d6c04b55176a1861dfee5f6ab26a0485671b33bd568a2494ed4f648a1f02ba0a89e88b03a2a01d1a84242aac44e9e6e45e9961527371d4d4237c0863d04a5d8e6f044f02998a321e142b7bc46daef57f35ab159429c9eeedc268f5258facc87cb112e94c9ff379c7d0433e78604cc3c16f3eeb8c76d76520cdf9bb5cbd689834da748a2498de10aac381b8c331fe21f733eb4b5a276d5f9aca45caf4b0f6ac7a52e874978840eacf63db993caa5a86221dd525f32acb6b0ba536979c2f6838b56e90f77b272b22b916517b4db203e1c0e1b8ed27c5d1d83a04685834c11f45661aa9630405a30d40ae1bbf007672c30703052704e206e821637e7976acd9de5088cf178022241fe82a9810ecfb7d2a7520a7a0a5a3f39502a4a79fe4092b691f4ecba76aad801e7373e96cdd0a00c828929151874a4aa5459d3b86d9ab668b581430b4463cfab54c3dbfac301e5348c9701e54405460b8f17833def39c20f78852fc6b2492c49e5d3cc72b914ebb2b6e4909c0611d1755adc2fe0d7ce361075913004c904fb826e7435ff6c76a220d099a24185436d465185e4adf49bc121096a00317f432445730e955a3077958cc1f4ae373974c9b8719a84e764a901ba5f4a0b5e9e2e9994bd061c88ffee2e592b34638be67acfd2cd6c40f0955708c5d8b35eaab830950f3e0a78daa9d25ef61bb277b008fd1f73bbddfb8ac2ec74cab478d58586a2f8b41bbb53461b44d29513cafa2bef18df05dc9ccc0c434c13588f8f580cde29a7879c5177a5ed478e7725802586757951818aa67803eee6425ca3441ea095aa3945b867a3d179ad4e4d15bcd7a50be3f61e81956bf235a1d04b3587446fd3c652ec51483c83cd2f0f7ba39276d22fd8cd8429b1b498b8ae1072e5448d024b0fad6599908b0d46c288f4ab5482315b3d75db6dc79cb5905e82cb734ac25a0848465e53845b879252b883b6f558207dc5edd3d9881cba2b3cdcfec70056c1953b9c3c40b1f2b96f7ef35b932709ab2327c6be9444ba26de5c7c5d06d7183b1f613d078f71561069c1bfd4deaf99400bbc2b85510822b561fb61b7d383984b6933380ae103e9200a0e4db99accbf5ad9da4f677cad4f2d8f4078cb68082d86fa2330260925ba1b9a9cbd1b961b1ecc80e094ce605ad9faabed07cd7be4306fd2bf5ae302004ac3878a53a72d27769c7e08c97f9f59a1c2eea4545c490c200644b224b4401bce017906ca5f6cb47353fb4ba3f0c91411c15d5393fe22f0c4c129d5d9b81b3b567644b98874cadb4df4660ca0f046796e5113e952d9425f28d640f45569dc1bf7acef67c6cde408d4bd3d2317a0ab8c22eb56ff1126e4a423e09df2fc320b8998fbe4da3972b806b3174a55c3b7f0b6b0295238a4f8df04034af517b743b72391e2526e32420ef83cb0324a01cc0e2ec89d8142f4218368487545e11fe758b12b32cd322cbf045e1204dc0c5820da554d07ba7394f15c5931bc9bc5a3d88b993b6d46e7ddda850c3c354f3533598fe72b0abb25e5b6817db63a134ac7390008284e8adfbaafbfd4bb394a33fd912565f88fa4e2546ba9459be8d9bf775b935b4a995292018a0c3b0deb0c48cce34b9ce3cf3c3ec565c63c3188731c0888e3bfcda2e04007d79f4659d18089f6f729bc82c1f5f7184c619e9511ce0102eeac5800717cd502c8f29f71a5e4fa9b5649aeffca08f36c3398c302766d5c8037fe3c1c0960ce0f5a5c1190c5030e0878638393ddbe58c9e03a108f4defb2e4327b97284bdd62eb2b98dfb875597299fd75994529c1cbad8037f0fa502105bc69b92b1867573017bb5201dff8732fa0ce37df2a07db2c1a45a3a65c756da7caaff7d51290e52b58b37c055b02b61cb2fcfdb557411cbfa2593e6c7f52f9393de74c70f9d3bb5821805edc9f5cac9002918b0cc9f5ffd16632387afd9c7e48a3008ca55792ee956c33776d36ae38eca32bf78bb06fe57edb6c05ebd65c516182c7dbe6da8f0f5afc20f4da9e8b1d03f8e572e4372e467ee3ab1c389718675d8c5c90fc66091acc110c12ec6ce0eb32182860906062ddfa66f9c320f9138fe55b90608c0077e8bb4ae5792e339799df38f5dea9e7b9cc8c267d59e3d3df6a07969a80343f6a8241e2a1efa71272b4f271f72baf52916cdaaa6866b6cd585abcf9d014a391f626af65f50377ad948037fe2df65bf920c63c8b747d3583eb47d7572e30e25fa9484ebf55a17f9dae8a7559b35646ba95836ff7bdfec4fbe85da9805d2eb3951270875f2807a8201ab82cbde03a5f9799bb64f8c6dfba2ccd08b271fd3f94d0f518aa8238fe27961c4b51fa46726c2992dff8aac769fbd303bdb6adba1cf9cd2a870d66b32e477e0313732abccfe5834172991d5d9fc2fbb6d9d1f5379a758bbebf53edd53c684fdfb4cd66576d4608dee7dd6f05fb56b09928d7b9125cff6fc584082a1f783330ad60d79ffa4a0988e3bf82c11d7879a5045cb9603583150eaeaf7c707d9badf036bbfe2e85f7a9663342e71c7e0010cd210ea44597129414d10de5792897e80d3f4687b0a37cc22663a42d17a26852f753a57c5c7f46419cf85fce6d971aa81f2e2d382e196861a1d1a201164f06960d782b33bc1d56546e5680a8742c151e3a2e868e03dc06002ec8768261ebc0c96473eac1446b4c1ea09aa542b479b50f4cf9778240d2c01d19af0c41f4db3f137f5c86fbd0f45531a84b395dba886c3fc4bf369b4432ad1a179e0fa52f9d37a781ac1bc9aa4b43050394266ab2b3cb217f0eb932de4f255f1e999a45054a60f7a3551061a244470751a0f0543158bc79ee92dfbf799d6faa3b84e84b7eac4486b8f1922f445f504312bfc7b5faed7027f5dcd56e4d270b9b6532f998e16ad5c7b43df885ef5dd8f18056b8d02259cdff8147af0fc4ff808cade86dc308034287d079e0fbf3237f1022811607f9d33600bea4cdc100af0875641236d8000f32c9c1d1fde8134cc802363122c43f98e4a0e8b62e648283d9dda01fc1fb28931c2cb9fd9c2a060efe9b0fa57587107dcdcdc4933524fe3d3eeb27e44628df6429f5e17267f5116d0f0e3b1e315c69917c20b6a2b7bb949207be308c305e0ea50cd217893fec7230c0cbe715babdfba38d113664eee681ddd0615be847a494f146ca68190a40ca18e794723e94f2659c534a19659cf2a35d39ba19d094ae8ff8343ae1c9eff1e7cf8104914d9aa4fd34254a354de99afed39436f93dded3b4c6e77874610d1065f662e38736f425cc6f6474e6c587f9f81fabfe8b31cf2d99ffb899ffbc1bed2753b98fa9ddabaaca47399abaf233757b19f5f4316aea57f5e561aa7665ea0a52b34c1f53579c34cbf4aaba72d42cd34798bba890df98de445dfef322cc9ff0be08bba6ff568eaee9e3916e7d3f34a5cbbd0a2c1ae956f7a68f44dd5279d36fcdc1d4e9c439982a230753a3e46060381896ff6210a88af73015deffb628d7f42f15fa4d2a3e159addf828fbd1252f0651a16b62b15f8c1b4deffd4a8daf1299c57951e3c28bb02fc26eb41f7d7ff8df1625083efca3e55662dca6210c6432694a6cd086ca195d3eb532b6cb87325297f5eb4be953f787aff1809bc649ef78a33bc1ad51942ac6dbf8c6ccccccccfc3d6ae816bf02f86fe068177cb10ab2fcb91a033e6401e9246e907ebe6d3f1d6ea32064b9bf56298c90e5b0238d6631f3778b9fdfa65b7fd90827dc66e659c7f148d06db835375f8824a2c30f77e2e9e02ed8704948b7e8cb53eb007778b3a80b9b185104d9d94f4748b37e38e865fef3efac107f21cdea9f6605b5fb56758038ac03dcf1dbbefdb77d1724e4839c94bed309e956f7fd3fddf2a0aea785b88b592e6c4284ecdd6ff7d1ec384546f4241928e4f2350f8edc2fa2ee473b880b7f931d8fd3af78f8a00faf9bc07bce6e1736318288aa8b71619322a2e8dc599bfd744cfddef1f86956bfb49d0ebeaee9d0acfed1acd6a159cd4249427ebabf02b21f3ffd429c051201cd6a697b9ce0e8d60b892a50a0ec84a42e6c62c41742380a6fe5c22754d005154b27a8c5089322251c642957d2e6e82bff0111e067a122ede21410552089a2cbcccc30cae5979dc38b2751e688df7885afb6b41d6983cf53bcf9801d12e87e7ce4f23331ed07958e3013ece4c2cbd052db523c36e22e2613a220234488b0832298661aa30e7777777777777777377777777777a5c26671f0a0133086aee935c9e226cd4d26e72a664626cd79d37e7532fd8fd54988528f25975ffa052f114ec9091851dcb6023a0183e8f64fc05dfdea3f99b41abaf5fd08e8d6ca55b9db9c9dcf46a9e7a9e8655d7a036a2caa66b10fed4dff69268b42350be230d7acfe93f76424f437d6de79f4e89bfe3c1ca06816bc1f8c4dd792207f833b7d7502f0f05530066c6d0f61ee67829f823c904545b64c3cd4614bb27374958e791e203f324f049867029cc3314f05e4cb7f40bf94af255df911b057be94f22720d9fa802c29ef09862bdf24ff0270e705e2c8975f01f9f27dd0d0a15b10b2da7e3757be7c9a196868666cccccc808800c19317462c458e5ac5632356464627062625434542a18196060ae7c7979b932954a5d8942a1ae747171b9b2a5a5e54a1616962b3dcfbb726565e54a1515952bbbaebb92e3b82bb76dbbf2743a5d69929ef4a42765aef4a427230cdc71bff25fe04e431c2fd528b803373abd6e29a05d2c31f93186ae6ca3efc69547476057de4ff5e95cb91d1da981fc2b6968b3e69012a559b0ebe9fe76b8fd33da9d139a69ce1b88d34fbd59ee4f5910c7e6f6c7a882e7cfd2340bbb81d83b897c4187f00602d9e1c6e66e49434ed566326d26d3669271068fb5ef6924a7efe9ee7b9a52ba6d31b6cdaa382e3e8d6671db731cb7994c27ebf50d9c994c3aafd32cf9304693c974a3a7055e0ddd6a518b43b7e6f7cf96dafc0954a0c7035a15e327a003e7a17a44a05932b2aca159fd11871a14d0e3a38c7202df524a29e7b43e3f504243759be5ecb030bb813bdd3770f4dc48d2e10111e8a1801b38b618a3dfa65970677ba8ead6658873d2e9d6d7f7f48ed3de567637cc704dcf6d56c7d426d39bba1d26cb9d4c1da537cc70b5d731f9d0a88ea6bd66513478cd721d5975bae56d6fe04edf8fd140ed120a6a04fa5bcba9c11d9695f6ee76f7956fa31bfb9d7ad49fabaadb96939a957ad82c9ea667f12b7ad2a9c4491ded3afbb5c65269b3285df5c33cbcb05b31407efc1ed2a63eda1eef37a93fd9184f2fdf87eda35d750ef2518fb23e9c5eda553feae1abc2bceae1a5b7fb9897d1beb35768abffb45ffda6d51ae36358bea2594a34c653e8e23e86fd34cb2b4b9f95646a4cf538cdf2151087bea9f213200efd59190a10873e4be528d4246a05c4813834f5fe92833fd0672950edd256e2d24ee2d226826a71e943c85b5cca5e5cca945206b4bc4a652d200efd97077a7155becbf7902e2dff627f56bec5fe782f2dd06b6b4ec57b97baf25d677bda8d3caf59f4e9172f7dde5a939f83cbcb96d473df62e12bc501be5deceb5cea299d348c5465a1412f953bab5fef271087be4aabac45ac30d58dbc5705c1a3cf9bc67df437ea0f6f604e6f748838c4a555bb9c447fdb66a703e89a6a9d979398670ed169a658b54abf974c2dc573cdfb96cf61e55d7e760d80ddcb4b0a55572ccf228338f469ea069e3fea7bc447791f9fc5f640fdcfcaa33e8b66d13ec28b401cfaa8ca49bce437b4c5061e276b167d16cb29358bbe33a174e97b2b76a56281f0edc1bbdaaa939fc3f6d2fa90c407c9591fe29fbcd3d37f776d967252b328bc40e8c3f8fd14da5077a036c1ac6083361f07bfbfa1d5e98f0fe343e8a974f8d12def28dec74480bcc4a1b3159b49339928124a5798a8e6d0a3bb273173777777ff19a1d71fcd729954c9aaf21b4f45573cfae3474b031f79f061c71dc52985a642571e9e86d81ea8c789e3fee7f4f18134d36b2e0082796204d1435cedf954e1eba969c580963f7d0f96e9bebd0ff14f0f5f396c6fb23e70bfd9d5f6f0d5d3ce2adb89555cbb1af7a6f721da95ca9f3efef63998de0795cfc19f7baea7b5156a62d95a562603e29f1e02f14f76a502017fceae54ac5dc967f90f5f9bb3b3f3cccb78ff2672d7eadd867579e0005f4ec1c07f61ad8981991d7a07807ed29dd454b4141d837999ffe6520ff46edf83ea6e2fa916122d051007cdfb6b2280ae98d790f0ce27f59b84925de5052a70183812af01f330ec0bd79fba0e3618b97efa924adadcee2af16527bf75c02b2d0fd30b88539168df33d86cf692aa48569e46068652cab9bbbf16e3574f39ae5f0fc1fccccb3c1122342fe3ff7bfab5f2506e5fb595d1f58fb1e4facb20bafe3345d79f464613baf0f53415be662a7cc9a8f015a3c2d7aac257d71e30cf15879f243d621ec6fe681ff33f2baf92cc052d30172c85bd005d42fcc6190a0b310b0ae2fa6f27aebbeeb70d6edb663acd39e79c42a0c0aeeb7cbaef3a1dcd75f5a29475a22e3cbe2baffdec0b2e7801b6b86f75efaf05c13cfc04cd889595cea7fb8d05b2b0ab44be3d7397074dd34909fa9e4779d67783716a5ca7aadda7faeccaf4f46eb25bcaee6ed972db669a1c7563e17df3fb9b0a1ef7b26bbced040b8e9a4f313e55bfeee46763b93d33333333ffb0899b95dfd3a7f7be2b11e76450f73333333333f3f65d7fd8681c34d3812e9e71cc6596cb5fe10ed4864c97eda7122484e3bea77bc85d4e44d45636b9a68af26186b7a113e6eb5c55beeb0fe8e4721308d754e985dd0d0c67704db5a5a57b96fad4cce9ac3d092faee0c2ce06b62b7e78db93b8b09bcfddb88547838ececb8bcbb4d14afa2eb50b8a72bbdaf754fd6e1a473b9ff9a6eafdf0c3ed2adfed549b9999994df654fd4937ff54bf1f70c641dde28e746eb0745ef52df605d79fb66b2ef58d431e2782d0c9ed57b1429ae54124f05ac74f50b346e07d70e9dec0f1dd70eea410b8c35de77c8a755b7740d8ef666510b80b9d68c192538cb9e8def95c3db6596e4696dfe4087a61b3897c65de837197ccc3a0c52004139204bd869896487a25a93d5027f223cd9ac54884f7752c369bd9183b9bb5ef0f9d29cdaa3d783746eb058893d34dfa080741414aaf215c11b35792ed3fef36f1fbc1252194082f0958a419fdd0b973ca119e94dd4ed475cd5c8424e67b3ac636f78abe8ad0fd5484aea961d1082792fda68a8066f9d32337999cc88936ebdf5ff6dc3597f8a9bb74b65879e954798604cff43a4c73c95d3d9bcd6967119ef62bdfc59da60b756e7b97eb87c3ed1f3a37fe4acc6b75c50f5f2bbf992a12ed390abc3cebd6a94f762ec522bc8f61ddb71341095f5d2c168bd58043348187d41d3573ec7caacbed0a9df8410936287f9375d51f44de55dbb9f4924d78bf49eec985dd8ed5046e059ae5b19aeee4645796db5d74fd7fe8f004942d4d611ba459fe3b6c2c39969ec8fb39d1ecc8f5a7ec04128e90dd7406b198eca8699e669c73a9e57e7349e67e73e974bfb9a412837b5e6422d7ff3a01459126b231224d8bcbdd2c01e325b880758b672d2d379cf603c300ba78d69ad5e0fac72666d08923643197e08d3fdb279668c2fde6d03697b4a26e2969d76b44ba059d0002ec7a1cfa3422e8440f8ed4fb69411aecbac9a8074edc4f63e2fa6b45aebf6cbedd0e48858b44e85f33ba8a0e81902aa484a067f0c69f672796dd6b2ab8138c2fb8002bef3fbd803bdb6b41d7a31311f39f56844bf59f56820268ff694010e0d386b8fe1bd38fa944621e464af931310f13f343dc7825897997ce47ba743ebc4929a59440380c8ed22e182eca589c312d7445db6a56b43fc9cd868170974029e34d781fcf9c08e24c4a3daf677ed3f970d7b9a40535cb0811f8899ac54cc4b067cb035f1d30d8401711f8c511455cf82c3ff2b88bc07aa8592db823dfd543433e8326c2c16d24aae628d38bf9052329a2893420aedfcdce2569034f5a5e9acd6610c7cafbf716d0d552c01b968e9956acdb959aa4bd8842cc397717c354fca45930ff81082d094ee2d80dbcaf8f9c74ebebd951b7a61146b882148eae37d1e602e89a5ec01b7f9389652e7d4e3497e09536f098886149bcaf633d735753ea79dd335aa1932f82b85ae5a1193c3fd2ac3a97bcc889e6aca5802ede02de38dce957758c6743ee12027b6868e8ba0b9c8867ee8399732b3a84501b3de644eef2221838a7011701809b4ba03170910b2c2e4ec15bfa82f62b539bc15cf0ac990b135c7fef21c8f29f4b333859fd48b3c300e2f8bb0b608e653297a6f406bb93e9b7cac9bcc00b177637f455b19d4ffccd72bc7265854d607082cb1d0360941ea82049153048c211a4bc20bc31451b6e06cf7b9bcee70777b9b7e97c38247ea46ffc6bb854d1f6b45b2fbfa5defb2d55bda83a51142f75a459fea9ef69292d646dbf52e794bea128cd65b64896188683d15fc8c1774e813b2fbed98ef9c817022faa7e5a109f0684f6831fe99606b8bbbdbf1375cb7b7f2fea56cbb66d16c9ca9bba150f4e03dc95b69f70351da5db17e4caf757b1dfe9399a235e203f577e4d777aee743a9ddea6db71b2289bcefbe29f7c74ecb796ce67db4c30743ba28d61fb090c9daa63d73fd64fbae51fa5596c7bd62c7f5e8267faf95fcfda27461968cce0f1d3cb7fbab0c91235b810bab4e777a177c3e1625603cfff84d42d28ba757a3b55de86c33992a6c289e08d7f8da62246c7baa9682e3ad6ad9ec9df36ea51fb9d62a727d7e37fda0b5c70554a24718958ba3ebd8038fe7309eec06ddbb66dfbe905d47e20220925e00ccd575b03b713ad48b4cf9a4e2c2d3270c55ecb496b144401232a72a32547454545454545453be8cc58b2575225dda09ea752fdb37ce88696a4249b2d0515151515151515edf0aca4a21b3d8b8c961c21c56030180c068315151515151515ed309bcde0ac898a5cca6030180c068315151515151515c9604530180c0683c1584949898d60949596a8100c0683c160b0a56dbe74662cd92ba9926214a963b158ac63f0887a9e4af52c968e27791f1582263f92610a51101ec718638cb1775f82970499856b16673d46f443ff460022472fb740b206de472f7f0bbccd590b2448108a4fb650c4459a8c60c634c0421696624790821054c26205472625383145d0698a148ca06843620a32ae8a2928619d22cfe08727c05e43e617b1579c02050c885e43569620bdfc63448211882c790d9141b19763114414d96b8806c49297d370f981dcae72f03fbddb1fb6620a4141af9f213108bde20f5949e2e8e57fb227fb038f700409a13905d82a07ee37a2259825aff8436210b197ff667f20162f80c2d0ebe7648768b257a471f9873814d8cb2d50127270f472ebf64743420947fed16f7cbc32520b809fd9aaa27c4214b4207a4d2ca4c882d14ba342082b90e81457888192c9c809a5d7290a298022687b22040e8a5e436acca0e08412432fd845a1090a865e43e013452fd80250c941148256a8b08268e63d41c4842396278c6071c4041ff420c80532210a2a58420d11334af5101643487a4941124fc860b80448b440c54800f10324e8ae21a777bbea11dfdffda35df5d886c028dc8048d02bfe66573d7e3646628827825e9bf5ff190283052904bde2ff0ce11e8ce0e875b2b005f033e4a4832846af6893ac78987cc837c13ba483d204a297db24d202c93cd14411622b189bc2084233191c99348db29366b58fe9b74ddbe19a3e48bca61f9f0ff4dae16a0ef4eaf18d3937514d7b593fede8f33ebe269ec2932c7946e1cdfff868be936eb1ed21f2112399e6cbdf36fe20f1ce6bea74cc0702c308833f129d400946af868217b690514e02139e1c35124abca0045d4e60e2c83584152cbdb81b4e88b0e435249a80084a539faa008212843636820515445084e1042228852264a1e8c51345504ca7f34da587ffc028865efe400cbd4aa7f068e49000f3415263e16d2a042072f4e25743fea8842cc85e4334d90b7ad28827cc6888c2e8e536c96a07bf7c692fb3c02c9ac05e3f43fc87c42042e9e57648ce1762b0f4822d009719098824a1529cbb4b67095998bd780a23642fe8ae9f20567e92e4c05ad8c111825efeab1cdc0e018227093968228c2141fe31081e073d1539a3c5bac50fa3445e51fb11d20dbfb971e3c607dd70a11b3eb483df1451236fc90c6916eba40b679497bc2095d00fb1604a7eb3841e29c59294607e134485bc2115ec8958454834e625a9945ec682508875438825647aea429079e2c97e7c63cde2bea61c7c295fe82e4a3d4fa5fa67b18e9c52cf53a9fec60d5fba118d8ce0cc08ce8ce0cc08ce8ce0cc888bdc15655156c44551c64551c64551c64551c64aee92440d73974cf29b7e22562262252256226225225662254a3d4fa5fa67b162ee9a433a3a2cd6bf6a0edd9e1dbb4d3dd50b5d1d9deb496caadaf524ee9f5d74b95fce6e7f5c724dd5af27799f4cbafd7d3dc9d33cc99bd4a482443ead41ece042ee9a4d5d2842ce41f26f2221dd6688c34117d6b88c91b2419b0f001b171b17b0b5c4f5f7150cc26dfb242b23ddd29e16607b77c17854058304336b8d891e04bd4e2b589c52762fc1e5c8a471b0052c57dcbe05d0e55284a38dbae8c0c5c8c5c845073f83a7fda9ae7ae33a74fd5d8a00f323aea39280282220cbdfbaccfc865f5d0d408323d90b06c96f56399c60905c965cbe68b469dac3a6384214d73f2ad9016cc91c304f1c32629e0e5af92f1ae17a64f24520102942931bfd88e8831b89304f2cc239cc03837404f3b8cc38c799679b718eff0a114fc8a53be2c62124274a2965ee193cedbd0a4feb6e1a149744a3adebcccc648a4598c7a3700efd22d71f2641e28daf753ae2db150f1b1f306ff3f0e600808fb1bef4c37af718ca22e18721f2e0cd0d78ab97f94d725189f59f06ebb6aa938a518c4b8c9ac5546319946879dba815e42c0a53d4cba35873d6ad2f5ee6ff8234153cf9df9471ffd6f930aa7acc93788837c8ccd3964425361a6955466996b7ac7c4fc7efcad1caf052e62e1373dfb47d29abab1c62f081f5313c7cf5384ccbaf629f76040fd1d6afe5015057fc3010dd0029e865fa2d2ae9560ff1b6d6f9c418afcd77a7c3c6261af190b328acda5bf062789bda81787db4bc0c730a4523e6592514d14a2489148da2926e7d772b68a6566019ead7dff231d4157d97e2c9144e8264ee9a339994c9ac10245e15236840ade03a55f03e39a4c55cd8a48822b89ba5f24bdda253ba25bb0079626c0bd89a5a609e6874056e452b401e3905d86225e6f118e76001773c26e5bad1ec462dee4b76fde32c2edd9e12c9c91745f8f327dde2ee9318d37eb85a10b1b90539bb985fb844e617d7271753c09da90588c33c130ae7f847a3d985eb483446d0d0cc14313323830819326208c588b112c16a2533848c4c8c1031312a222a1898170d88979794f6430a857209c3c5a5058c9616962fb0b078533c6fc50b2b2b2a5fa8a8745e741db7c4719b946d3b75713a99ba6032d128946a5c68dae4c26c196737c62dc01df7a9857e5916e00e439ce69845b3949ae5124ab7be08367217a4469e91ca08b604d0facf360d3340b136fe8b1d638cf15ffc9eb318a3e7d2b17bceda461627c46ed4c3cee7fd49ace65fdea9e0c17c8a7a52b7da639ed43edf63cd72b7fea4bba7ec05e3cb854d8e308a734ad5be455fbe67e1a1e84c13a243d735d884d22c8feda8fa5127f2714269a466f9cfe075b43e673d650c455aaa6a286e9cb36eb1753b65cdf2d99c41a982379130613d06be82213fc1f5f721b833d34b329ec6e7fce749fce726f8cf8b1ca1046b961be93855958faaaadf56b86d062f126996c3bba15ec6ea519ae5537c8624a1a881137f874b835c6ae9c7a75587fe0d48ff17edb45feca31b34693fbed65375c69ae53856525576aac6991aa50071fc888f61b3a850b3a291944518cfab812363328692318924912414524e2951aa1a33667c4f4b2858c69879c6d37c4fb70ecc7f2afb1f77e18ecdf74bb8b3fafec93cf1bb5f86ae32541dbc7e129552f619c67eaa1afb7dcd6bf6636936ab2eb86ded294a5c633fd6fda2d2bfd84fe5d9d8010f259347e04e4b5995b31978aa7faef4497c19de3f26756b53e97c64b0363c196abc2624a637754370bc9270d7c099c1fdb19b4439c28a2eb010ab628b57328204474031822276f09250be469a1895a25290ffa64c695aae72d62c59b3a42cc6909a0621c5588cc12d50c0040f9028ca420b2b80484c481134a5064a0812e21553b5efe671333e5346a5512364310ff39154786954783796288b4a4a3f87e0821425664b4c214217804c500224fc6085a01891510f24ba0085052f88020cbe280012557051a48413b820c2cbe3936619b94b7e5e348a4a4871a6c21b800aaf4e855722b90bbeee27a370fd732abceef28379493d1818ee2d9a0b9ce3af533b4a7701e274172340e243103518d7ff93b0687b3653f9f6e07d5348681ed105f0e1c5a4c845ded7b31877eb934344ba35e54a232a9349d5030d6901091bccc0890eb4308597bf84b98bcb0210a46c41092f8e70f1f29744ee025a01165720c21148840046125e6e0116c060094518aa81144dbcfc5b35067cc8eaa7a1aa20ab7f868a82ac7e1bd583acfe18958314b2fa5d6a84acfebaad70a9ca77a63273052e33333333f78dc2cd54787be6c3fb0b8f5c00bbdf9469323a734f5bba34e86a4834e625a93425a55b035fae591cf0be29a3d4f35cba6e9bcc77e57e19fb5cadfdee72c8bc5d996c6a7eca9439c439fe38fff56dfb7d3ca8e78728fb65e0f6cf0d727b8700fc7701982214d0f94f022fb008b472fe7bc0d7771ae11c07dcc6e17efcf3bf1ef687ce9df38168fffddcfeaf7ffaa0df33ca9fb28168cf1e05c88c0f78313e3e10beec4b5c2d8434beb6407af0ab43d59e7f7e37c72b8750f5352160ce04634a812cff9c3a67cdf2af512794211945666034ef3f8dfce30ccd3c4c119a7f81fda7ac91eb35bf45ae3f2137151f76abe653df0e37f5dd2d802fa77e831d0e3765531548ea3fa09bf249d9d47300e8a62c07d8fe7c988ff5c57e1148ec18f53d1eebcb6fcca52a7d1a1549cca32a10fa2f35ded86d39002383ed21e6ce78692d901916091130bc1037fcc6df67d6a3340b065b83dff80386b0fef4a7efc6c73c00fe834837560896f598c3f0f025440c56084f3afd0793626ccf0060a1df4c18dec6c62487ac05f2c9a11a1fad0bafe663cd47a15bf3abefdf6c78355d53636d6d97aff5d344c083bcdfa499b26f7ae1d380f87c765d5c5c5e467b97f7248f859c08a17fc5c060327711f1737a218888b13f2820a0b0852d0081054028e125840e7ef323043b0cea56bbe4d01192cf634bd7bf4864a8085134228b8ef0854f4c91c5fde4d0e9657009366122058a11c0d00114275ea7ff1866fa1a232010490186124038f23ad924f00929b1fb7151014c9688fa4af24d59ac05002fbc7c8ddcd550f48d7f0c6ad45918f914bc8df985a2dadbb0a4c4c2834c9818ddc8a4e89b3229386132e44a1e64420428ede297cf25991222243d71a284c951918e8a0bd9b94ddb89839dfc8b62b9b4ce2577e338085b4e0564b969871d08d7bf9740967f7777f769492ce238546529401cadf2149c2d2b3de95652b750efafdd5921931e3c89b94b7a1c43bdf69f1c823b30efcf5280ae9eb11629574901713c3685162e022cae7fca7a13bc045e339db319552b77652b5350da027a318f82d75ecc1825cb9e4b91d98ba13219cb38e6699c4ad7ef31598ea52250f03e56f2187f1ff1048d913b8b6659b724e7d9009bf5cd29d75fca9a78df94519a42a5507472fd5ee783c424632751ae23e99717321982d09db26ec5df362293e8ca86d2372e7bc294cddfb89bcaa2eb5eb7235a0e829325929748a46de3862f9a434a52b44b62e868272aad0b2f7e9f3a1d7d644d5294a428b9704bc9228714a56ef1e790a2a449514ad2926c0e2949737695da35657ee352ae90928514598c73462959e4900245ca1549b39b3277798c364b0e294f3c9643ca152eb58bd426aacd841b51316a25d73f2ea1d4f354aa7f16ab97b43011201537069b89db47aec7a2fec1dd6e23d7bf48b3949ae59cc569cae00e3333b31096ee0c1732118213b73b9f4d0e35333373d2d5ec6773fae1f291df534d0299f4e0c8955d0e130cc19e1289fde590249243973f9a9a67cbec773a3a39d19220c2f3825ad9f5d7a616b2a985cf2dae4f2fae476639bbb00608004324d0d64053eb20b46083369f171fbebf0fefef831f2d840f21841042686b78ed7236cb092174f7fe48696b496cee048e2fe3e448638c31c618a327d936afc20a09678c11d52cfeb94d79e3dd9c935c4f93896a2a7105fee675053e8b2ac6dbc4d3c94625dd55ee9b1739a6bde5f0a6ab735c6c8631aa4ca65b54e156545145155554510513a213ce8416d941a070b72a639bc1f3239c94dd898ade3638bb4df2c6c512c4f9a6ef872d2d682ecd295a105b2d682edd57776193257670b98e552a954a7551aa4e857f7097763f33f7d675aaac7c8c2b9ee602e852bdbff683e60388033803ee88dca5b2405c60876238db59bfe28afb45969a1b8339fef095c42e8ce2c2279404e96076752e7c420742b81b0a3a9c547bcb45dde5a0fd4f8dd96be56187c38a65f9cd37ab0ade2761c99b37dea23022db64a4b988fb27d36ddbb66dd35a502c2173bf70ac05c1d3446e8ce464c728e7cc5fc094065e0efc07ccd3032d810960a700f612d0c5b32f68443cfe5877ec3e9d622c168bf18c529d4965f0cce5efe5f2ab40fe08777aa0927fc2160f3da8eefc20f4045ba7ef8136dce941e570673e7f8cd24c85804323506927181aea18a71720cb2d0f7ebf8e717163c82ea7304fc73887fe1410c7ff9b605c7fd85b8cbdcd66b3d98a6a5a8cc1cc232f7c620746ee6773214bbe46c493bf6d5c572fe23013c01c7f5a87aeffa96340bf7ac96f7a09de9c4927621e38979cc873a2b9f47763bff08926484c630e680cc6496562708c04a6c29df16c2e194d279acd66ddfaa6ccc3b89604ebc0d7cc7bfff9d1b49f23e9ccd8b9e4322ca56f3d1a6b374a3d4fa56a8bc37f4f6fce333823224848c66b34dfd3db4c5d7919f5abd3542772ad7acc6f64542ff21b5f712225f4e5f34b3b3af29b9f4b5ad15cd2966c6f652885b196a6c67c2c168bf10c121a3a72d7d1f5ef23ef2546b1d846c34df01224203551051296b88b634c85f6c2cbffc20ba6bff503a176d532302f89dc45b3c45def1e7397f6d17e7ee4ee4a2ebbbee43e97fe7f561cde1221a2fa952712332be3206357fd3276d576c5809597f91e2b2fa3fa956fdb437b9887b13f31afd1d424f27d8079d5fb40f331314ff33ea81e26e669605ef53d683e06e6559f03cdc7fce0f990c407995f791ffeb58ef990a487f6ff3eacbcccfba0fdbf3ff790f995eff1af3dec566d1920f32b9fc3bff6abfe98872f555df5ab02382e0dc0e5ff6e2eeabf7a53bcf21fbddc65cdbea32cf49b8e8f83eff77bf6a37ffa4f35bfa75bbc1595da55af59f3b98a6ad68c9dcff6dce5a02fbfc7b76ada81430338aea4da84d163846d2b7e98c58d0f6d2084104208610ddd7a05dc803860840e1b42f8173aa18229f789256200614fb1c10678fe243eb931c6186de20560f7a34c88c224e87ef47ba28a22d73feaad52f5b45720660c6cfeb96fefd0e3f5760925cf7c09ef6c0a393e61d1604124af4101fe08e8d6c7ba81834523b62bfec3d8acbf3615c5797b101b24800799348134f32e93268e78483d0f41e8cc07f12efc9729a59c2fe79c7352ede5e569fda07d79cd6a47c09baa9ec506210b530159cd722aae88758bad802cff5ed241a83fac8781880bf552b31cc794eb3f50b73eec7c2ae5fea36721e7b9081870af74a163c718b539a7f6dd1fabe645ae3bb93dbde9d08ea807f2223d39c80b5e9c34dc9ed78b342bce9ed346ebcc196dd055b7bbe05c6ac2e8de5cc8a4092277dba0f601dd897aadf6b8fc5819a2fef358ec6f9b8b8ad197b8912bd1a17a18fbe1b8302f63e00d0ccca7601ee63fd5e5200eccf7744aa250a894aca9b13638473e5747559997d5c2d89797172d7830ffb991db2a655ebe1f38aecec3c050fd0b0f86772f52385c60c1c1a9a1a2a2f2a8286b7197c67fdaed979067ca608e7fd7d4a814654b5ef7267ab74dd3a478a87f7996e7df58e0ce8cf8b05950bcf8aa8f96de20e363171ebc7c218eea61b783e6552995a67d4df75aeda2aca646a519953b9fd8f9a07e06af27942e78a879fb07d71689c9bb30a1b4cbf49ba9feec10e4fae8ffc15dd57fdc4d7d6ade14e7a49aabe194fdaeca9a343b93ba151474bb6b3ef55b4df5248f45d1d11689e96b3e2e077faa87be35dfd3fea45da614175ecb854db818a24652e032bf5186adf2d2e3ed332abc2f957e40d0ab1feaa22acd917d193fbf3b1bba6f96791acff69bf1d35a4fb23efa5fbe5f6a57150fd5c7971a53fd29fbfdb8a9df368e351f6b1e6af535aa01ed58bdcdcbf78ac7ea6ddec6ae7eeedc415f8b15f59c43dbe1bed4d8efc77df9ae065675b65f069c6fb9e3e5fb67e5d76aea19f5f235eda3b71fc8512854330ad57c43573a35d6be27c7979d0264be5f7635f047ab7151e3378debaa7ad92d80afccbfd4af5f65352ebcb63f50351e7637c87cb43e64bead0f1952fd2c3feb2763a30c3c70be5f06193688dfee69d838c306f16b7fdaefefecc736f2e4c9d67e3eccc8933da9fb63fff4180d95dd0eb6289c47a19e86f253e782c78fa2d1aa464369ccbfc49a57d5d4bcd854f588fa003cd7ee78e03ceab9db4193fa2dfacbcbcbcb8b8cd2a69ee5a395291f348ffa6de3ce87b9ee7879a943d61729a59437d4bcea657d91f585e6595e802ecdb3bcfc9ed62aea69686c6ae36e877c8de6e0302e100ee33e7da0cb5d8e97d58e9717eee9d8eda879d5c34ea395d6158f9a57bdcac266d5dc405fb3d146881375484ed96fc8453d0b0daae27c7f3f2ecb3c753e35a6cac4f9d8ed485d1c1b596a5b9bbe34752ecd295b7833ef8b4ad76b96ab5656e60a92ca586b3f5924c3d7bcac353ca05028d46fc0fb684e5dc9bcfdd46f5f1079fd8a66b1b6e0cd97975755ee7c54bf39678a791ab7e1cd29c67d89dac707ba5cbff86cd341e4b5b13638e7e5e57b5c5567fc4ba5f15a659143ab5ffdea3d56533fd4952f536d5df1c8f9d4e77cea5d0b9efc66fd77e53be3b399f9fe5d494b964ae3a5ac5b35124ab76a66bc84c9229e05afe6696caea4f975c87899df6854e6f99100ff4128704088049e76820499b46efc57804b0039c473db75fbe1d7fa68b86de3b51fd75453c7e3749b763a6a7c0d8dd7b1c13c45ba45e3b9556b7c026a7c1ed5c62ba0de781b2acf2fa012e06fa8381e7638ea0d4f80ba80e7a936fc8daa80b751797cac09f81ab5f503a8dab7651465eee3d8977b463133735cb78a13dbdcf37fd606ed39d4911328706858504f2b4a290b242866142d2a2ebf6d3acca359ebb0fbe9f8698379bae5635d6fadcb8bdc49a97d08adb554da7efbb0e368b8f36551b75eef2f99e8d601de5fba00b6eefb4b1570abe7fda50960cb254b90e3bd6586a31902404312e7f8d3e0f25f5f0120718ebf001e760b01ffe9b041fa636ba3eda33efe54ca4248668002ecd8b0a3757ac7a3e2d7a81fdf1abff998cffda9bbc1dae09c580466c4716858e6a3e8d7b0c306e94b5f879ba88da7f36bb01f0d17f52b1df68b1735df060ac6c9dd6695b6f2d5b4782d676d700ecab613ce9950708e07200a88e39fe30a1d9f1a1f0175007f808ae35f95007f2bcff7d41befaa36be4685778b5caa7e7c53aba75a6499cc3414f55a6499fcabff5868ec0d2b5b3f9416e5508db6f08879e6b7d87974fda713e6994f549c5cff89c43c332900ef821405dc995080385030cfbc22c63c53c900cfb124e699429cf3847966163b1f80a4eb3fa10077e21410e70ae68931cef12fc0f713ee8f015bdcf7a720cf1c6a1678822d95ef77d80ac0f7ab409e594483a6554b296990439ce353e65d21485f1fa8d750dffdb0ab617968d606e7f05bfbb55db9228ebd828cc62a31cf1cca8279661121e69930ce9962c53cd38801940a90c5f51dfbf5b5c13cda5329affd9dff68b8f1d93ecb1300074f6581acfe1bf50459fdb4d3c1efc3da1baf75370c314f0ae6f4c3dc1eba2a30a77fc54675c8ea9f30e6d1604ebfd741e4d57ec77e345cfaab01d4bedab3bc0de6617bc386aaf3891bbcf3ba2a5f14b3bc5a95972fbfab6e7755e4da0a3b1fdb6af98fc6ed4fe7daf84f0623ce8101b654fe9b81b96da3c42e59dd963183c039fe72db7ecc57cbc163bef63ae66b40b7eb175fab5f3f5da180503548df95b5c139f4596cad795a69fc46e36d300fbc34bea6c2ebd2f9d0b0363c2f726147e37b7a1a31cf24aaf1369430cf3cb284796611e704817926131ec3fa8ab501c49941b8fe93c8e66dbe069126a411a9f30bb00b666dc106476428eade7f32c1323cce91ee698aaebf1bf1a9cbd10d59d4ba51b334cb57e64fd6957cdbfda6cca64a01541e341aea275970fd67a89f8cc1757869c8b036df2c7723d58bc7a4ccbbb04911439831e69ecb66beebf783ed0fd49df91996a779ee76a02ecd77dd017519505300af5fe6e8f60c038cee7cfb1b6c79b04991a1db2f433b9f2ee9dbe106f1eba3e63bda4f86e7a79d0d321f556ff3d17eab67eb311b6abead27f9d80175fbdbfae09f8ffab62bedfb3f146aa53d8d76a5d91df2e9eb9016eea0afbd0e6a35fefea8fd7f02542f17a0598d0b967eae2ffff2b3ed4a7ebfb6924f7fa218f59f87b22b69e5af76a41ef53a52280b74a55ded40bd7c1da8979afd7e388d871dec6ae0ab7afe17ab71e169df37a85eb33e542fad0ffb3f5097ed0fd455bdfdffd9f198f9f9b2db612d94c106f12bf3d0c6950de2b7c6861a1b64ecc7b7e6fbb79afa0de976ccd8edf058814b6df882f8adb19f0fb79f5f763bfc4e1b2d7f10ff806e277937dda1784fba2241b4dbd1b666e66b9a9860766b2207bb1da73bfffbd11fb1e071dd8efe9aef711adfb1e361ba13e8fb71a37d79d82dd59b3e159f6facfde88d2f76ca52d6be3c8de70a3b1fcdfae8bee6bbe331f335cfdd8eee6b7edbb45f51cdae509fd2bafa01dd2e85d2a17d7c5a77685d85df8b0dd2f787bc352fe3bf9ae700d0b6a2bf928f7aa04bed2af52f0f7463a5cf35feb8f35faa8ef8fca9ba63eaa03b68fc9a577d4f779f7c19afaadf905bb39abfda119fbe8e6821d09d76b5837fbe0eb6df03eef72fed0fd4adf9ef07ea76ff0f74bbce7e40b7c676ef332fa37e08b8ff34eaf7e37e0e2ca034cd374df7c077e661b7237567bea76b253a5264441bd28a68427c679eeb87ba3397ff7ffb1a95aee0ada6fd569a9123452b4d481b2ad22ca50fe8ce3ceace48984c0ec52cbad55603a8dbddfaf78fb26e31dfff7fd9f93c770a00bacda85792d58efe552432b4f25907e2f5017437ae350ac523e2502432a3dc1f3dc4bb4a403f7faf6ae0ab3d5fcdae120074fb817cc4a529d77fba161e0fd16373d62c99f7798cc88cff3ca9afb8ee59b8cca15c9f31e3bbfa75cf523fa0cbf2dcf9b07c57e601e774dfe3336a37a3c2db0d61e80e21ca854f2e643204a2bb6d1bec78f8e8ffb89f99b963733f773ab49fcf35fec071637c989faff3b1ea4c1f9def69da1d9b9f232be19cfe18dbc66669afad2614fa53c631769e4c3606a55b90fbe681d73dcbe754189daaf2442881dd888b4b969cfea311f5714934dac243fd178d94d8b8849bc143727ad86d1b733ffc32993e5e98faf185914562cdab3895fa97df5275ce78f88d0f2f7767aa2a87aa84d5002fea1b0ccff49f1cea667007e62e18de5f2372570c95321a752b1597d4a0501f638cb1e65131d6bcd41ee28dbf719d4f4a0baa15a8e46c95a54d4e3285666400000000b314002030100c080483d178441194cd0f14000e87ac4a72549ee8510ea50c42ca18030608800000000004c0200000cc9ac63e8167405cd0291824fe8762d35cd32cb6ea6665688f4c70435f6686c5a5fc6650f9d4d3dcd77d83d1c0f9aedd44b4d11b1f914bf31baa022441f517f377c799341fb91f8493c4b199552c78f82466f563174741193670139cc9d84fd2bf1cf202a7405c0e13d25f86abdeae739285a1358d8621a3bf920f96579d1db76a740620db7a3bb978fe4a78c5834b3fb72b76c438fc28d22a03057fe0fdb7585851e2cee6b780fb2f08d69d10bc9e2e087e84f6d317337219c773feb08eea02c6f3199a0ed43074b1d02931ec577a2b231cafc894c21a5b620c87ac2db0c41876ddd6f9fe92b3803a4bff3000543df0f8233fea9b86d022822468d7eba7c19c7ec0036e81dc87b180ba8ab05010b71f5d7eebc36db9347ae52ff5601812eb461c6d8c1dbe9fe47786e117f9cbd80d073a4fb34db2ab4f44c05754e3a0d54cbdfbac6e95379edd04e5cdc3efb37d0acf10eb72f8ec9c0802f5c90dd400d4d879578b220525340f3ab940a59118053023e473b205dc4195f2b0c3e0d581c1ebd715770b9a12e5fded1189dbdab0a2a1664a1841b05daf3048387726c5b0eea490dfafb1d706e262e14600728488e59698b05a673d3b9cbd66a6acaf57583b5cba8adc22a9af77e405b75e322f4df5b0d876bda746049f7bbc39e1275f61adfe94dfea5bd539c208b5c3866d766a8a090f9aa26127c90ce02fe87a5da769a44aa950f07dabf56addfb139d7abd2403b195168bafc12ad62fcc5ee3067ddac657205b1d073033d377caee4ff6de51816c66d85881b5e496c4fb3e7ee3ee38aea83458c3e2fb0f2144e0f7cac03d71c5c5bef5129c4399fad6dfec1e7fa445d5e72a0d1bbe4beb661ada04676caa4509150cc348fd51cfea714dc905a758b0769a17162e70056094bca33193a8960c1e4019496ac6e19492a6520df1de63abb969941174fb2b4bc616e34fd3e9a87c64eee60f5a98afce027039444d3443b67ca0f894b1b14c0f4e9c693cbac2a9a4361fa1ff26bc40776e910015cad8535751c1c2778198d10e4db9d981dccc6c51c5816074619379ad0a02fd06163df8d7d9479dfebc946ef1f28030b41ec6fe932310a740aff054e3894dcbf463909b543f57d85be96e0586b4ec9bfb349d98615d6afc660c7155ab4a46b9a7813f3bd6a68b072da98657801d152aa0754c6a07250a4264a89ad66562d0a8d867372fe85550c06738aa5d9a3975474c2f8be9ac9cbf675163732d16dc085bdc6da7a554696dee6b1dad52af1411e7279eb0e5f1ce3a32552ab9295e7399cd8ed9c86caa3962f4763219af0c292c2e313a193f3a4cefb73640df4f05dfbaffd1dead55f52e31c832c87f8951111f86e3a8c27ca04658fbe8a3807f1c5c5c3cca149d29a44094fe6f61117606431ed924c905ccc716bbb5c7a6f9df09cad2158432e244ba4475a2ccb9882fc5d4fa4e119ffec19af2a2744dbd27e201d9dea4dce281c3b6bdf675bb492ab3880938d2d2cc020ca54aef177a0c93000a2fe9ae7bc1a047e29f11cea11a29ec408304ac7d7100cf30a7e5f96bd281fd51dcf17fb11080be70a7f0018f55169dc233db2f7ee4423e22d81acb3bd863f57bba95bdc6b47a385c78e77349280a1817068e1c02b7aaa101896c9d3d23cd4845f2ecaea26ebc31fac696ac4cb1152e6394ccc30a409cacb4d4d083a956d6ef1d0a0498c2ca480d38a731aa6751b43b5245556857183e92210e93602dd6a648b45dfe4c29504b76bdcb839ed674080d4ed9590997b7952f30d6ef3c7385b947fc96b634c3f86c211a7d1e5266a5f1a56eecd3a13a75ea76d89ae373bf2798bf9f1af280bd870ac5f427ffa9a28d4eb79127283925bfea620e37dcd7f24a63a4c8c36af3d9a9f843e528374ad5e59963483bd0fcc7bab8071db5c3587cc50c61142e14ef3af71e37fcb9a8da0133cc86f136e4a782d47ff3fbc2eb6ab3dbad584194532459a50ad7c649f0b59c002ce0144be780ccd372080c3d20c240036cf3fab39383287e37aafe58c0ad175877c43eef9016c6ae71b13c4ac851b7fc9a0433932a63c4a1b21e57b06d1d1f0266a14f8e03d7d8ac925fe599fd2b584f8b76251aa5063a22e6413fdb2423875af5c0805628e8e15eb192af543b5716634cadae5487dd2a7d2067540d028c32a0f28aaeb1df49f19a8cb67eedcec945a938ed416141162618b359f51cd3d800e27a031f48205f0430b649aa1db95dafc490b924667313011797830873800a54e6c8c3a6060bcf6804324a1e2e383131ef6a53cf1ec6255568449dc029e5f3bd89648e341f985b9404774286122b41eba3523a47ca3fe2078665a5fba298fe3c913ad30f48902a2f934b5be359a62cadf5922a8578dc520949affe40154d625886ecc624462bfae256a050334d7963a0b8e7e1c074ccb5321605c9efcaf2e90d69bdbefe90b52349d3b53cf12a8fef2b7045a35a12376bdcf9f359f6819d5135616b6e34c1cbd828d05773ac111510dc57b29eb4cd051cd237665bc885ba0219114adb53a8b68fd29c155390c1ada4f27d924e9732b3b571b0f874e8eac490338c18e54588c11671e42bc2ec7fca2a8b162249d79726bf162dbc47208024774bf967522909960feeac0496dc4efc129172c2011f8fa06478d87caddcb0f267ca1420991baa81ec6e3034607529b4b1410b8570609d6c1b5931970a0806cb50dbd15dbe7b0d360564c563ccde3c9abc83edc315811c7e400c106dcdf94fd00d0d4a5cb9f92fe17e326490c95d1601a1512a9f8d1d4e85d4b8d7d22d99fdce9b9129d96afe1a5b59309ae5970834c5f10ae2301291860b7e0d47f991975b82eed7d0789419d0820432646087aab130aec622d065065e2d0295d6ca18e3f81fc961b44868468db903594323712367954d89640dfd79acc1dbf1b8539d066648f4d0ccd001428e56b7e5cade66e3e0765286c0acf173f1869bd8f3dd509396a4ae1d61c7f7d53081f53a170ec82e0dd0d6a048138d66a2a8e80642dbdcfdc2db0919b8cad722da5e9b61e67189ef160a74d1c716ec05b6589afea0c2fadd654115a41496cb5a86ff80f6bd77c4405aeeb0f1972f53bcfc0a680bb5cd66c72da182872c50752683ffae997984b882fd8a18da8ef9f9d884c99d168cc74abf5c10dcb3602d7c6ba169a5579a0005acfb8fc893e3a7ab0aadc9ae37153cc9c92517ea834283b9871073c954cbad2baee563aa8ffb741d0edcc4a0b415387fa78f7175394007f31e79be861b0e770621121c47fb1a6c1f6abd8a185c9801715cd7d9ffae6ff45909967a8cef8bcfc547d0bb41ecb441ecbe1c04df320bdf40dc901406ea8604f04ae5c62a1f2cfd2c31a6f3376a16dd56f3bdd54cf6e659d4dedd9a0084c902665d6c16086bbeb9c5f9655d1ce85b5c96233b5ded5643af9e4437cb9f085640b887d9c22269aec0c9383a65188757b23001985a3eb7893807abb60e0b5d2f02b762595175d7b4542e243dff262378c41455a2c0cf074faacb69e8e9ba0ddfb900bed9b59b33d5e7b90872b7756fa9cddd34b46795cc1fc93357e445cf9a8dc2ce60f560c01955946caeb40b3f704eae977f6adfdf76b1e449e16297af23dea9f0268b7ffdc2b5ca4a63ed050dd743976b1dd21c390d5c6c6eee74a4d8985eed12851749233d267d39b217cb79b2fd6ddf5f2b252ed2769eaad0b41f9625a8c03ddb9a2305cb86794e22a6a36968f7b8dfb0dce8fca5a73d93626e82e4c7bd8ae32187887f5e4a0f7cc5f9cebdfa7b83fcc6abfdef7ce86fd218b40e68b48728f688b5357bff054272fd01884d8e02220d304327e1f6ebf502d5d5bad7f04a2012a187aa15f2fc57669956798ebf93470f9cb9d4e1dac0b20651c61645d1a2c04813b2368e1081bb90803e9e7debd53083a7f3a322cbadfdea17eb7aee697b6b797e6be2644cb05ac1fa0347416d5077431bcc329a503c67c700a69fe3cfe2a9bbb4901d8abdf352a9139a1968a0d4d2ffcd3df62958785bcb95f0f8e6920f6047f095ca544bcd962fd7696741d04b6203753028bd05cd01fe8bdc2d582da08dfc78ce0407f1d448d2c675f0f2a7cfa0828ebf700b1146cf9b10eb37ab3f0bdd2e5fd6a077e82c7bd25ad1788b895d2a92de0db3b4c4027f612a92c8b0a0c972c2244b6843b5aa5e7b15fa9ec934fdefd12fe6f03fd3af3ccfdf1a0e3e96e7d4b71e37e7dcb3d65f57b1435a78951520524f48c8a3faceeaeba44e5170a328d74ead6a349100ce39ee92cb06da3c942129f4b795d8b6c697fcc1a6df7fc3e81812b97f4f26262aa441edfdc31fa18fcf3899246414ec083cb8e9342086cc4858e052b24cc2eef51b2bbd75c614953f495886e8ff2f05a2c9b172ba3e0af8b99de570892cf5850fa233a0b7c9b6ef03cd40e2a1c50934715367a50ea4673594ec97fcf87746e309c5c1cc2f6ede5f64e1186c582dcdf4397d11291d95ee6cebe36614a005c54369ce09e3ec56a58892f89b00f16678c6a39070a8480303262ceec78e794efe3e7a0474cb9edfd8bc7892515646a2795978e729a518cef2bfbc42541594806ac1acbcba6db87fb40310787cdda4f9eee23413d4622fddae08656545cc8493343ac0088525cbb2ffbdfe9a9e05f161596cb4d557f4413c7f849d0ff3ebccb88ae86534bbe4c864678e9514980da891816a9c337c050a23106a76f64bbffa9477c699756ef290be2db23f84abbb529dae3325153eb3bb8db0d7c051dd01ee4fb059bbd4cefb3e7a895f4b0124b01c0e81eebad10880f4da914b1719d2c7096804d48a776b0fe2c188425c0a70384a12ea97f55f735a61cd29028a2573bb539094668269065d46b1bce59d8ae5508c7172aa3ef9bbfff26e3a0c28ee0d6243016871c666a94c5716a8bb5a995830a87ee37d6a074f0554fc2cbc7950b4076a30734d2640d0be5f2675e06b3a1a67d2210d0b8d50c03f1c4201bd90079480e84454c6c6db4bf9f8b287c67d118ecb3b6370f60eda34d612540844769d3b2b5b70c88974ac94028160a1596418fafb3484bc2d914b06882f6617b88b89ee00ed52fe4ebfdf10744dc46e2b15d59901990c074b7aac31905dafd44655ece61085742059ddada40b38f686ab70686a53c638cf9a81ebae5e06af844b5ea1c9e8f844d29537313630cbb45cf53fcd437408f2a503d74006fea00603345f13b921f85e697cbafa0107dfbd17caa1bc15da6c3a7f60ec45ce88e9901c7da534ee388aeb9e7d45f0f00acc960d425e4754aa77b59d5a86f58e5dd2eba3888dbf077a64bfa4c72ea20ec2c0a1ceaf80816547c600719efa167bc626c583786217346abd1afe90f75332fe02dd995bbe0a38ba16b08101b86fd12d6edf2d5cbbba39ee1d57af2d97b17e041d26f69f0bb14e2e883a4ce383a23b069eb444639dec651171241e71c44ef10dc2896ef72e9b8b679447dc3b6523be88cad7c3ab2765d34f8a5d28fa71036a70211bdd7a7d1964a6db82bd85946605cf32d9e7df4b41274b081dd577a37bb4491cee40fdd495588925d096b8a1d823995ca9cafcdb179544d074aa00f60d77d3b5b5258aac095d1df3cfee4fc605a921e0e041452ee2c197559d27ecc15ec465b5c85195317339144c8d4cdda57e3ff946cd8cf3344dea407d6412af2f3782845f74a9576ee7255144b2c5e1b32ff2f08afc41308ffd9d377fb2ddf13db86dfdfdcba7640632a088fe6735f300e2204a4573aac287636e3e0d5ba303c7d66fd58546ab91dcb36c052b19f4e7eab0d4c126e99191d928568ad5e582e68295055836890bc6805704d93d2454d86f34dabac3d539116d96c03923191132113be410897e56fd45263bad43e94b85140ecdd60cfafd87ea3de81b0b9abc2a24ed86a3607b086467bdd6d4158fc382704ff23f41e996e340f7b1749ee5e77dac5516d7f4bc06cf87227d60d9671770656ccc6d71cd54bc3cc0e85672fb4fa502dc8581da015a9fffb0c88d7ea211b7aa666110b10c26adc0da97f30955bd8a589c4ebcbab1d68256c1b4aaa7faf9f7dee9443a6e1b84f87f644162c4297290fb962aec314d372ff37ebca9062a3fb18d4ce40b73e6b981eb1bdcf6d171b84cda2c8c96d8548be38984d38632e908d0aacb0ccd2335918f9e5add87aba58b9c35291a4262ced1606c89426571da52f3670a2dba0ce0f8adab97d346614d2d397f816d426e5b65ae80466c44f7f91ba99a745309096901820c858acaa251a9cce650a1414549e4f4480159486f1f1ac820998eb8d45e038116ca7e6beb881f7619ad22880170a5368d27df12683ead1dec0604d163d57e5869ac754fabe7fcd9ae8920e7baa2cd879a24e1497ffa305b727762607446e6b055b8ee8c704db8c25d091afda8480b9e470f2c27787537220b4ec30d9767d5ab68f41e951fc2680619edcee1fbab41101172263e0249997455b662d6350652fafcd14dee6f74d2735c14a70eea8f2775ad91add2462bd5b7c04bef1db097525ff2128321809f0a4fb1c994abfb9f5a3efcff947caf17b9e76f81ddfea9e8e841f4bd28615024fe49e1465e37a1276e40f0e4c1eff446453f0eff0f37a642cd79b3f142a67a37c00cfbd86056c4ab004f9c56d1dd286a277c6f2c5ed5f5ca9d28d1a95932c82ab467bf2c6b9bef7da8bc51182ef13b81bb2a9d06990eaab5790e117b8bc6620441a42ea5ee96c73ba869e5585b31a4c393572139eec0d1dddda51c19827ef0db4026b440e8a5ff91dcabaa0fbbcff8331c56044a76219ec3fe425b351d07610130a15cf27491f6f1426a9c5bdb0eaf2c79b279b7aa69e1dee142c5ac63b19e88aa89dd5c79a793f086c19a7d006c0b2efe79ef707edf511b46c2ead5572ed190db10d8e1286cc9c15a2f0aa7190cec0c8459a28c391beae6c1347386f950337d986daa541799021e37298dd93cd870822450f607e08d871738fd34ba5184435ed351e9ae48b083ddc85df887624451fe33541b14c9116ffb657bc433470989ac099bd1dc94332853ad4c4151b7e8875dd96bda1df93ed10fe5116624c364c1e93bc5576e2bf76d8929259d9ba5e49490b208a68856fafa3cf94c8db1341eaf88a74b045f8d1fde158fe6ac67da2c5703f76c7f06cebe3fca0e907fa7489497dccb0faef9a42c91e54c428e0b1ef62fdfd18ceb07452fafb107db67325d2ba09519a71b7f777172ab844d8e137c01d3f27d5663e6f27f2f687343acb9ecb0edbf07af18b04ab5c5eddaba0a55b0a569903f95e3dc044b115b646cd9d48a08dc5b9905e340e6c9e33650758febfecc9c8aba0c18d37b93e55347c7cc1859d7db9e3b812d062ca8990d6997673ed198e4aea4b6bb013f0dba7ff74a79dffe4e4206c8a0c906c36b5fe663182c456d17a022eac82fba4a4bc92923c6a324fda29d3a7b364354aa8839de947e090da16987503147c56462ccf98030a9d59602587519b6a119366a062986abdb2663687c0894519cf1a58e5304c46db9ed4807d9ca92cf06294b096b51cd88ecbeadc7f513b7c3dbde40ed9e684dd90766ad9e16f2db6e3a974a43564c76dbd40f66bab3100786667c6a39f98cd4781d547b4b8d770b0d8a9b37cab21c19b451e8de9094c70cb9380e4c3f755e86a1e329901a7a8b39cdd2b910c40e1eebfcad69912bea5570aa008fa88eabebd844b7ba7676d135aed5489677579d9ab3a560919ca49dae3789a5983154491e96ccfc7f53214e46a38fa8088351c0a8e5250f4c024d34429c6a139974dd9f1a56ddb6b1618aa49253549182d63358eeb39830cde9460629410226bcf4bf72a79458cdedd48730f6d1a9524e87df23edbf10a0970103c705940c87090d71337a35561794a654560365a72c23f151e4162fc967e0e8c1eb43bf1d652a323b948f7707efee63027bd942702eecaeee2f4fbfc1f77b82f22ae871c85d906011daa468ef9da58f2e5c102ab3f74e7c7e484000003ebe30f38bffd9fe07ba24cdf35aed87af3aa0317db665460f8602a0d9fa0f655ac203d2534886b3077aeb5248c023ad07d4cf5700e48d273c4d3ca2c1166ccd3a69cb580b60b6e78d124718c76bf68a404d3f6708a1ad083ac62846557237497702f793353386a1ef1753119ce47c70f02c5247cb56698f9b162e2525d77f5c89d6b7c2c48ef3bf62538b756e56212ea4330ff9332145371955f95b48ed2664dea140091f0d1350a9eab10ee20591a9511cd2569184740b838067d24815e7a5bc98d43caa40d2245d9aa5295c2f8c77ec44faeb69707ed0f9308fef0f9aed4b781fc8c834651441c6738f48100a50ba6e92b3f460a539c13660f076badc9ed93c796b160699354f7ea2fea4e6d0617944ba46493a962549793a3f37e352bdc86e234fb61363f1e765cc2fcacef96baea661a4c3339897964c915ad88b71cfc6b0cd6e6933c5aa456a1d7b3ba66c592da14d7e29631f5c06d78c43453962b1c155ecd4d3a466ab00a954ab2bbb5f36342b6d160cfdcc45c5e1763f48925e9ce7cfac3d37f3b4cf21479c9a76c73a6c5037346acaa8c3d5318b1673a3babd04aa63b95b1acf89aa10446057768812d96308f4c5e171031c09055b9b92712569112694253ad75aa03a632050b60fbba8192c641e4ca1441749c10d528cd2fec103e8fb393c94f7ee0340022ebd6db23a80f72a087ad563e33c9049982282e0442b23f3281e66644acea512944169a98364a00e29a61e83816d4c9bf8040ef1180d09b08f19403e383d776a339d9e4a09aa678befa8638ab66e6200b50dee0961a9d013940dcc5f426c6eb0d754f77a908c41329ff699554d2274e5f8eb6666e70d50aa986a3222ebb747adc854d90e68462632e02ffd31db4248db6f81188b65ec0ca38a62de0fa5402ff4e9210e9000d272de8703129edfebfd2db7818b20da43e188e926570543166801bde3207ada3e8b4d52aefce3d7e3940f1c85eb66b8318634e9564a3e00dc704da66170c8636451b394cdd74f8e5263076ffbb35111541865dd6f535ff37cad15eba32712415101c79e229bb6bfff9d637030209f7eba9fe638e271f059ffd929470296bad648d07872ba853f74eea11833aec66f645d6aba23e568701c00dfbeafaed0d50aae0657b833403c71e50277e7ab2b455e2a5c56d7df952bbcdaa87627681039c062f4f057d1a83f4aebf1209d030556c5760d071977d0f521b832ab630a09becd5a1bda40e7f3e1922231cf2a148b9509d6b49ab3d9e86a5a0c8d0c5359e1b2ab7e214abaa0d5d9dd51c44766cbbb4fc6fc0eb06ccdbc39642695ad2870111edc9801d29aa47078b25712e4c2c4aa2f78a2639c97425b36be8f7a6f23aa570bd393b7ab20d453c2d9cdbe9d6cff17f4fd8ff186f77d79119629aead6006d81068d155a8b6f1bee89d50618da1caab9724a246226f952f0e2cf329878afe6690d2c0a7b31e358c50f19ba877b6369e4e1da8c3c8153261de2fc43cd0371d35dbff6ea4e718fb367797ce34ac2abc0d6f6a0ad9b5e68397cc0eaa90c3fd25da0fbdf274da7fadc42a0c66ebfdce5fd87e6a6d497065bf1ad4e161db492861116b990a5595ecc694768d282231f047339a66169c539afbc09ec1b8eaba23fe15d7ec0037d7008e5d26b5a7165297db6f5dd2112f18507ea9d8672ff83760d2c36814bc42939d33456147537838777119d71970bd6f6309b171f500b15dd072d01c4b79e88266a58027a1a50cd7de39917bc56abec5ac76363ac8351d046dd512d38b35a3b92a6521163ad34442eb0352a43ad49aff62369c41a4436afa66b005fb2acf7a04ba08d44ae5c37e9513a9d8b27e23f06382b370aaed9752fbff90e2679458b3030a81d2b169cb41cba5989fb972f858a2d20c5281c269f4dc381b612806f2e2067c7502b7d99885a5c60fac29289be21f71359d124879baaa9005a36808e644ddb604af139e4cf342962cdf1bf69e176238fc96b044f9ea2323258d3d90849461deb7c50231c51538d9cbd1f800c314ffcb7ba0e2be609f45b416f7281285e82cbc7ca6e6df7ae6466761d2a9631c66547d9cbd4d2e3df4a4ff391822009dd32d3428c23d5b110a474c730937a60249d2823b16a70938d55f655a224463f2a0d0e9f6dc20dc29fc389eac812fdc8c442754ff0541492502d6352e329a02bee4aac489f9a1e8e2d546c0519b887a1416b16b6b023889dd6b9575c32958eaf0819d01888ad148607d218f699391df8c5e552f2a94a930235e5ffb1353f848669398809277ac8713b003cfee118d5610605a98b46dae4b019d5b58ab182bc3a04a66ecdfcda1827276cf2a9fad85e9763807c23cf362e176ff9143f7f8d358a3595599fa7f911a819a6c3299542f6814d44cb1f61386741b5faa05907062b915b9f6236fd60b263f79ee4a8973256a221923fca44e76ed4b9b0de05819634e978d946dd3786a04626d1a1c1d55de0f873712a7eee388dac174f7a06d2d04c652e6a31149988f4e6858eceaa6d88486e1905636c23d5e25c7b4ec73a67f066db83006d8aff1ea17897aa3cb9c40d96ef458f9208dd8e48df8a0ae3fac87b8e99124f255c2e7dd9634054be9c97a6e939162275b625096673e82799b580e5ca7745c6d2df02e013946d9032a827787c22568cd127c28c72485c99f650554f74e95ba8014759570c4b73612afb86cc5b7bc30a37bed5e4f366253af669707a7856256e88d14bdd7f630611a60e2b8896a2a9f2ac5d684ac03e771f14761bf81baee33d063a1524567cf0b082205954220751e44a4b02971dc304dcee7e271bb8f8d77d0960aec11a4a6f9c3526fc301ccc625981ec29c0c6843e4c8c1f129498833743f11bf4e1811b323209f555375d6f644d5d70b3a3d379068b656b0e25dfb8675caffbde7b261d7c4f7c9f6336e5e13f6a1a36bd5699977d79582f835916f7abadf8025fd67160c44e18ef0650b7eec62fabc5864f054a3593701a457681cb76576b763cd12014a7a35ed40618420fae474af1da822804d922017239d0bfd1b881d0ccdc822fd6dfae73f70188aa4186d73800e8ed176a7f2335307271a6a5ee55b69bf1cad4bde50360889817ace4021f10c4edfa9f7c1392a800b750edfbe28c1a51d9b16a824eaa5f201dd6246c2f1db9b2ed0fd319e9e300a00fb3ef51ba1e43b320e18234991245397cb8c80e1ba370e9153882839547cae7591a8e1b14d50d98fdaa60a1f0b4baffebe89322b456ae00854c0949a0461258d85f82c4521fdd517908aac8ca2148c4ca987c7c41ac49bf83b57934294a75cbc9de9037a6ce11c813a1d26f849c6545c16c7d250b2f2f49edfa6ca398d7e154e3ff9366262202e98dde626c09df1cdb6cedc067e1ae260ff573a4d374bfba604b47b7381a54f54d4e15890c25298e173b0ef0886450c4ec35f78ad6d4c1ea587b1adc7cceca4bfe788f5dac540f67d929e101af1395f6c4994a3665819572e6f6e006e8b7f2622e80eaded64b532efa622f8d5a192d42bf743d353d1b1756ed7c9402dd30541bdb80d94e9e4b1035e2c0a15d102eef693842ee08a8f1e7f8a9b554df6e20cc3d6cf14f14814a2225d47150bdc248a8930f4063ff5e2422cd482c9d9563b768e52cddc8865cf3c951de007b33b4365709ef6217c7194d6940140ed0e097ab8ac19df34c1dbb0543934c6be75ea8bb87d0359d7e5abf427ae6fd60a41dccf514ceefb728081b4a271abcf9fa02e5e2eeb5c4f0bde02339fb0b72fbb0cb5ceb665e5db420fd53d46ef71bcfbd647f2ecb032f8b96662b21f021470420bb338a5947369ee84024fa4ae9d11d0922d46f24e2e36bc0c0f0525024dc295e67c4413f1d99ca93a48f272005bc281d368eb1240ae32806893ccf3d4107a9f77b3bf717194017bcde3c38533d741801687c0afa56bd9d403f8929f3f3066ae2c928c5f1db7bd9d805b9ee73b928a460d44638e8ec04a3f72596182409f992dbe0182a2d450a37fd488f9084208967023ab6322b64470884d1ba1d9c8ad874eea1d487938c20f8dac4855dfb54efc24017bb0e78175e1e0a931c77b4259e2436975ef4c292fc98b12f4b78d1f6c85bc68930cf75b55606f232f4a51b112d4947bf513954bb3087450ae45a2bfeba333aa2616a923c53ccaf2d9d1662666e3bc030abd1ce80b0bf90d683f4885631d944b9fd844678a2aa631e064f6853c7cdb67fb0178b8baa9870811447ed83332546e91f0be565327f513cf92f13ab1fbc9c0ad5e9be485a7b5dcfd53a9471f96693110b842f3a54b424b85966bbf3643aeba96ee2bbf7b7bc74ad7a23c01c10db2c649eab8e6b2e797a7ef07fdb49a3edebf40ccfbe491494deb634e3679f38658e7e2e4d988ab309ce499b7fecfc6dd6b59cd414aaef5a03909ca69564aa026b6d36af3994e3860f44d30b81e3763c203abcde9a34fc3ec5027b82fa968ef2d8f61555e98cd93cf1049cc0af753b8cfb48f820f329c7a60fa22885a47d42b5e792bf11f02f42685fa89ea55ee0371cc7cbf85a8a032280eec85a813e8ffb012eaf7730f7a588943c94a15eea9f7d0101c3e65894a1abcccb9eb40dd131ba2226bceeb35b38c11c19a2b3482f40ff43984706095c14038659f992b1b482d3f5a40f1a0fc01764a05bba6afdd6001a80657a453fe3d72e897edd611bce794630a8206ecaa4c9d6989101ec0bc829c583e327f7380f69a010ffaaf068a46108221910e2341d16ae260dba12f6427a48c2c3c44f8c3b914781809d2a25ff32c32a88c5a423e873f7f4757e1fcf8cce1b04216350471fef250f7d30db9977fe5b2a456683d429e5d35d788c38a659e5187118f66db73079f2d71c997e58f9c0c41c0065efb86a5ec5e47f67499cab2cc18d83606851f34252f2f29a64ee856bca85eb168b2b70bb57ad36ce244a15b11b335b1c57c0a90b8a72a9c036379e9c13e98be26b0278317722ab30cfdf81d20b654611fef2f582bfb919c1eee37451dbee23e284fff5a649ec6b4fba6af3e3d8c8963631cbee94a83bcd7dc8257ebbc67996208a3c9ddde4dd1ca087651e724590251437a5544b0b23f789db3eb34f212aa02f87b77c6d7ec2c101d5a3f1a2b9b86577cce23a47ffd6589e7142c7f459399fc8702ed8880f9cdf89f7b5439180a8b86eb2a102f098db45e01a7372963ee9005150ac2aef8493dafd1cfdc505a5c475980063a1f8d2e573c94fe98b988bce7059e4f7180c97e20bb61262db47543b6ad1331c12df35e6a60c25a625f844030cce6722aaa0c92ac6c222b14d4856bb4547d5e97c8b1d11c68184f6d5d006de00ce4cc2efde20d7f90d0c679951aff6ae258c24372dd10f27d98e7f15000eb841be1a8d244e94f8dc407877fe258f4c9e3bb820efb32e7968a6094c2d871f92b7855168bb58ed612a4f7725bcec379ae0d345da35a5bd186affd7a6441903c426d88c2803f73cb1eb9d2c6fb77521198e884f86c609f9c747e850f1826488d78d364fc74217e19ec534a0c0388cd4895d352e5ce2ebab31c343c8d249771ef472382e620585082515b9c6fd5d4f150f4b192f369c6c14aac1c7e44a3953b32c087f01b451ff741d387241b692d45632f2884a8853570503d02ac84ac56e64468427b98535c6920f57a8b8b1ffa2f090680ff09826e16b3cac6246fd0f52d952aad40ea2458b8361477e759b0b3a9599cb6c89d7a3aad14556567767d2833c17a1ef8f4961b0515bd7560212b64c958b8a1e0bce83e73b49f7519b64db2e8a820a1c4cdf39864ae5cd9481219e65b881bcb9344aa8ba92c0d521679ddf1110613586dafcf2a48d61e72ec30711b093639ab3a4ec40e424081b586cb1018290d78d85bcfe849ee3180e0820ea7523112646da917d41a21f40ae2c1ad3f15d00f4d2166dce21db3714095b10a83351f59d921343d62a5c4147099c500f35d0be44ef7b971cd7771e6adbffb945c00c2383f4ceff3c3367313457840c8ef94644440a127c515c33ef55a28e1b1167255b5d056ec05f2bf6e057afd405dadb4d5278315b09bb2308986ccc75c224331037b3accac9acfcd717a22629e9acb08832908085de5ba30044434087d69475b0ff74ce8adcdeae86ddde611f728e241ab54832fe84c36205d7f4052a31e207abe2835b0abdcf47a4031036abe7abe474ac026b3fd7c65b799fd0294813b2aa1f7ba81d283bffda985fae72179e698b3cd20b74449b2de81ccf6f2f8eaefa034b22b08e5a034d47237142184f285c702760b76b824e12328c8e8ab4c67c81c4c8a52e5f1ed44d23e4debd287d3453d1a39835866df278b1d7d2d44b187c43601c082f36661b310b514d09ccee0311d8cfec58055d46aa98199538458c7148a3d7cc73428142513180aa0977bf0342f5dbf063c71dc83a21e582b35a59129dc03d7a603da533c0fa913fdf6e596a6e2b12ae79fea1e13648f659499ad3a051ae79bc0e7fb9f05b0607b42a929d1f60f4773f9587edcc644b7274a1cc9484b99d56354b61c7cd0d6421b6c8ca91f0282d9959f305b34363c1fe14e54eb4b9ad6483fa8c34906f18a6bd7b68702fc61dfb5204c9772d4d5adfde8932446bc6c65a831a740ca867f54bd1e29a0c92a1c334e07b73df08b548339b76c099c8f0c38d00fc19b2af78704a66095d84255fbf9251f0e007b3ecdce5f3d3609415570ce5315253a8d85987dccd2c6966029ee45f6e9cbd29c9a2264fb4f4a4d599e1ee3fb22253072b64245ca43c0296e23f84a15a1eeb3c027391c66c2b86c238d7a3a38edf18e8b22dd19ce3a3073a18498e6322033f592df4e3ddb0c6babdb076c20d971f0f67c639125fc6b28b9cf7b349f6daf7f604f4bda933967b6d39bb6b67c7366a97dd487f0e97ad8ad005ceff70d898c7510abd4f23c1eed9fed77e8eeb4434e13886091cf7b1e50ac35fb7b54cdee4bb445bfb7431ff533e421ca2b5e8a200a131db2163d61765a845b772260bcf6876e87cdb7f6faae69f8848ed683341838f98384b16a7e32c4e8e47fd93407b1c0ea456e53f94ca6b935a887e26e92235f0140caa078e121fdf57c560fb84c66cf1f9bbce676511fa7d99d7f694668ef9e2cf0a228a7bd8d8f7f7e353e2a442f5ba58be1894fc46b198bde3c6021ecd32e3742255e4dc3b261c689a01517eea0abbfb0715b9ac036dcd45c161a40523184ca9c984ed9f1a84c607884546a1c3f22c267899781281af7e5c2d7ae4788f6cbe85dace496edd1c9db78fe592c97af0096821a2147c5a65f92f95485dd6f0866e6d452b9bbe55e027cd6e3956c8b3e79ded7180d9b220deb03882070c5b0af1cdf9f31a72c957d384083dbfaa13c966f6aab8dc1c2a58512ec9957163c72c0b717ac3d0af937e441df4c467aa2a7ea71f70ff9e8e17c0fb71dc82786530fd50526332be1aa11860de25e707ea3dd17ceb3aa896816bf582d7da216ab7e937596dec7cdab0efbb1c4457a9a5b94d19ab5e1d7561b782be1b1ce451e380554397db7823a1505f1466c6b5314a04f66571290ef1b89091a5bde5e173c04a918a5f3acc7aa2d12570101be18de1f6a0496a4166b4b84b618d53611e2acb7e4da5aa4fa28501f951bb449475f61377de27347b167d575050d8a38717ab1f2e15796601389e8065f0040fa1d9a8e56bea8055f9a46a4c9412d07550e8c8a26999776fa49ee8db8ccc0e631bd049bed8a6ac1aaaf088acccfc3bbc52c99fe3cbe1f1c213dca377bf85490bed05b15d541a87119b9edf2e8608d34050e35ecec5a88cad8732c7d807c8ca3b073246b30ad02eb96363ef21a37a220bd54be8402112a3ed5bcb1c690ffef569786c66a90956a5b875d8fbede65fadcdd1d967d337b08c1ca882485ed7d5d6cf8f43827af2f96502308633e2af014d6e82394f838e638d8a44ed38cc40a9fb7a3844fae787f64cc0d5282d90c64652fc6b62e78e2383475d6a2a63029b41d2b0dd2bc860e935d3436df21e45c723c4241f9be1254bb870c588e71b7f6c5b568abf7ea14e640446cc76f44877bbb5151a159a159dbad9de6a2ad48591b41caaee0e00c45bb3b2d16ae6968411ad2e836a861b3431089a133a4176bce4c8d22e696182ad81ac1176cf69f170ee6dd5641a2c1176d88732067c26589195b8287b791761ef439fb161a15ed85634bfbc8278f3b07e9be36fea00008d654344ed4709358114bec9ee6819c3e51a70742b4963a0f75f02175bcb3c86b27065d2fe24cee8b7b9034d4f238826dadb1ce109714069da2b0dab11fa85237299760a7d0ffa1ca46c498c43eeefb7dd668776ac0e9b106688c282a73ddd830990657f2350426ff5926fdb1d853a6271af3068ea6825d34b2b9a8db7f39d01eede74473b33de5c30660b0666f04533858335271947f15d359bc4512feecf8c9fd3eb3b10f518c1d2582c5dba6820c6cd06345737baeb2a9192fae76a2bb0e0792ef78134512e533dcc85bba8b3b8b7e018ce03443387eb48b375cc75f58bf8e60ffcc9091b4524d45903ddb221f0d1a7a89259a4688c48a58288e341913cdb19b4b96256e41889ca071f8f727dd8d824c950037eece85b3485c199eb42fac576721a3fcaa7b0f0b46e4c6096665a9a9ad8d686e94acae02f96c22b020e804978a1b0e9957e49a5deb4de91a3c800d1a035950c14175ca4b766c070bb9692e6c980e73557a9dd0361b69e4e215b367c3a2ed0dff3babd556711c1d8b86931010cf8436d6b92969f3c09f0791f4462ce434570c359e84e2a323c04d96074961588c4f4c0fcbf7c457560e03c9b36c739fc4153a658b2840169a2224df3bf25c279bf2b7ef6c725b0aa75653986f412436ce00aad9204f0737c3a09f1a2a1f029acd29d75dab7673f5212250f9b03675cf8228528b47c148c7a02fac082c7b2ecdf3d0748c827b1f358ce93c8b10783bd4929f8cb80e208e6a114d2b34b347a60da353fe55dbf37a4e17fb31f66bd36745086a34832a52c628d484069b3bb6a10a821ca50c3787e4b37d2bfc617584d371b84562141e5fa3c8f96f351aaf246224c3834e2d29aa4a3a1310944b91b17538c6d3b63941bc217ca1935af963a62182ec7f8482cd3aaf56eea03640b1d5b94fa1338fc6923d51b6a1a5b6c98f44ced8664c6786c28b43141961bf782bfb3807294661327a26f8b183f83446d7cbdb6f274754b3b87c76828fff839bc40408963eaeb019fc1173f8d52d5b0aac3d00edee763eee0440bc48f768360d460bf5c3f0021919a6de21e9347fb423b941f1158b798898166824bc579880f01e5c16b7425d2ceb3a96b2ab5a046d8782fef0848c023aa1227699d11f809720cff782551bd4e6630da5fdee840db715377867a6304735bb8b02df239324b803a12a55a65ba393bff7d44a39d6fb21b1c8ba898491108238d8165c6a7cd3395e8246054a9e278a1f017dcc664e11909c0d7471e4e2bbae3a2b018bf525c6f411489181827bc5d2d57dd16344221db86212b491f61696adc545750e586c147d766d29d4ada9448345f909122b5dd0b50e363082a0ee9b64b7cb48255229b203d39e3a74ab1c8ae5ed43ac25b941d29eedffa5051ed0119f54d50eb2a854132bae967883308be615753b19114a7ac760bea4fc2f21dcd77b234d405b72215acd1a13e75a9810bc166093ac484981f08954c814be1dccce08ee9b1cb83f98b1f06c3ffc52eb8fe2981097a1b46cc371ee13d9024c56f983e86320e74d00f84c7881768b09a56bcef2a507b5e9a1a98dc45936e236d377b3ae9d9a205a905c873172e43fe3de2c6f38be8c00331c302011a036de16d6a8e16908803f068ac1f81fe24ebc2cf6be1220eb0c3d2fa067237f4b836665d9725581d25ed37dfaf7093888341a4f72c211a6555c8de830cd2163eb0297f31180071d5f08efc58025b520109892805a8b4fe93949a808add935b95fb717a665f34309b70b49a7902d7e5f3839532fc10e437194717a119ba32c49170fe693b54d6d6f46f2918fd2024d09b17d2baf6d81fcca697f0e5d40d2bf0c2545798dd1c924df7dc3d88adcdca1931b7c552a51fa39c5917b578cca0f9111661568cd3c1844e7f532a217bf8cb47674f12b918642d08c9c03c338845ec64768bafbe11bc73332c05c772093aba1b8a965f980e146a1793a2b74c0350365dd7e438a27080279feb681d55c228da7cf0fd3ca458e3b4177fb983fde366f11ec9d4f03c56f4439b471d75f49565c0b11dbea8ff63eb93b59fd77c8f825400dc051333ad1387a12838429dba3885b9d44751ff869118aa495e702e738c9bdaca263c80d76ca5b4da1979850d58b5516b2f939d1813d4e33422097b5eb478bc5961515281e15b4c510101143b143b06166dc85a457fae165781c32f214dcb697123ea8fed3315d9fb3dcb5402642683079da0475b72412b619b4daa38f013286abeb96494145f44b5bd3b6f899316fd3e0ee26b8d9ce8790f2084e370847e0b4c2ec710369afde2d021b9308bce5fd564df22ee30601ebf39747178370ca9e2e4e854150d994401d894b3403dfc0effaa2c4db55741b728b6cfd2fcb60daa959fb778cb5dc3c65ea483455d5ddfb276a20025e4a4cee329c026df60f040715a63cba399156ed0f697481e3f8227e74076b32f6a11515bc806ccfaa51cca5d3b05eac6c8ca9ead25fc9cb247fba0acab486b48df1a89ff2d1d1ec110c45e9dbea9a9e2302bd3ee0bf426cc13cf53511d8d476f4ec3d97ca693da7f3c2b1ddd39ca1705c5246008aeaa72a27721aa85fb8c73c763a5ee49801dc27de02e9fead93e420a39dd3c8fdd2c8a16abd1f86647fd29e5fae33d284095cd23c400f2f5448055dad3797c97a571293a725a0dc7336154c794b1ff41416302187f8a3f405a923dbd3f4dc3d11a85ed29795634d13893321055cc002152d680450de3c7844aae68736df2bbdee9b1f8cd650ef94119c52dcef0ff843f2dfb52df0e17aad8d58fef7dc22b29e5c8a068d06439d6fd8a49640602231e7f00fffa2ed04a290cb5b77dce936e7ca516186e093052de1b695ac55c52969b8402a062700888e31c3818ca08866d8b19f88ecc71641e929ef5443b8ca9ad1b81f9d36640e6fd6efe3462ad38cac22cac2c84ecf18c738fc6be2484c7893811631d0de4f1656761af25cc21b4960d8afeb9b2080122db5facc9ad4820c146b6bbf9a3e53a5376fcca31d700ccc48cf6152784b2a6c81396c3014824fc1a7105884a8c2945e5c8e358a64f18112b4d74b11e9f385c3b91834641f1713e0cbc2e201ea66ac78771ec52f88f34f0b0f204ac8e51a1cc8dfb900693152b211a9631e8a942974dd53148c5fe0e4886bf8368929f2feed16285ef5716cac087385a79a1251c2d13c7afc0b890cf645c42b826be4d43492dd22d6452e0c0c73de9d80007178e48405352ccfc701e16e74c324db686e76250e9fe8351fa766288b9eec6f9e49aaaf0c3529f5ce8d4ea5bfa58cc3ae9219884425fd4b23df2727898115b38fcb46e05c60356397cb8ef480795078dc483b15303abbc5dd0f577fe83dc3a1702e30a8fe9c08edcf87e92a67580def99507a7b1efb653d068a5a6e5481bd68c406fa0576643f8bb0dc4241fb1aa62d59b4742dfcdd4865e66085f44d6cc38e5ae21c289ebdb006010c18cf60742c44251838606463bafb2a1ab726dc8d962596d4cd3b26b56429f9aa2d6b72d86d7e53bf89e829060f958ddfa6f510508a0fb8cf1d16a803dbbb028d672eacfde27743a412234aad625a00b18837c2a58f6715e3c81684af0025e46e887ad6dba9b28f9dde76524be875196a06abeb1446edcf29e90e0ebb1908448e99627c1d4900ad40572ae52636cc5a8156051c358f3739886b485df953cd0b416bafba5b8a4a7ffd1787e1851ca49e3695086910964618222dc795ef111178f0f619440568ce5d21d05fe4328b674fe30c17776f636270de70c507f761344a72268d05cb60932e88cd2fffe865c692754b84dcd79b7889b133b1e43bdba2731d4c02f4580f6afca65455fa1467c48e1684bc623b0501160ebf99df45125049662b0028264ab796359aa5c13a8ba51a15c1d83bbaa243d65d2c4da7cae62c19e45dbcaca208f8fd607bb7af8e62b6c44b3bbd10804ddb06b002c27319607c2e089582e14bcdad60a4fb662538c187c0a6613b8167df467c8b17e33c3b1e770c6b6911fb366f6b7df1edfcf340e1364acc2f6028c217521e2fbe8d02aee7efdf664bc1764a50125a70565c3a66caaa4502314ca216f374dbde0b557d353dceeef135a2d9bb5ddfa9d7fab986d432960e713d2e962220ee9335f43d102af7cb0c5f19f0c512ce6361ddf2786f2b90ecde7b5da9570cd678ab0e613af9452f2a275d18cd0aac3f8d0d6029767fa395306e720efc9babad7186b7f11bbff2b6dfd3ddeb038fee3a68e9fc457de39e54a314b307f882f5afbf77a8e4e560eac8824cf7868cc4aa6e6db001e716499a00fb706839cca2b17aa3c20675c8af21490755f18d7524752b25a6db110343c906503a95d9d549e9ac65141070a3dd9228646c0e92ec120bd8e30658b4190c73a1b8cae4eb74353785183bd02f2371c8b8a2f6743d7681cd6e5d6cb1222cd4f31c0109be625ff99ed15f9c17e5f0bf62c1dfae20bf3e6593dc6815cca1fc817810f74b93978246f30f4d156888e304180db83c9221dc9aa9d917d2b55704832c7b5a9d9806b0febb4075d8e541cb1afc3ad4b94d22a2008f26e5bc1b146709b9ccec470b56d5600214b0a03a0f6f607a8850ba0f67ff4a13a311910c1bccd26c677df0850ee68ed851973b9a9679641a7ccb66d221daf7d294a36554015560dee86447b766130fc3aa88389bad53eef95af5da68df82b353a5f7e46432af0fd3efee71df2a27d30b122d2871e6815408716c46c28a3a5d324fc5028783a686374c865c7a61fe9f8040cfddebf4fd1c626411e9fbc1b5a758d990708102159109468ecf81a908b169518414b1bfeffa84cd4ec27e75a28a6ccf6d6f0ff4dd577a52a74a9d5d24d3d56e60d64aa2eabd9150550ade82d39bfe541b77968a5ebcb331c7f2dc93ef736bf1bed235499e5d65368d0e5440d2580241beae3ab5329ab87c8a46f017b4b3b7cebee91681458f779c368485c0674f7c2efafc3b129849dccfd238286113a06688f4c270a691562f9bf7ed3f82a93f00105e350544a84592e80d0019526809e808e4b00a02e50947de269f87ca703f5120bfb70e62210385cb418ab627587a5c83dcbc27ed1d1658c4f36d1c64e344246eedf4704e91b08394880c54377cf5a9a2f033e879804f6277d19827b43251d9b980b271ce8bbeb46edfcc92f8a71b91fcae37585d6e2d01521c298caf18e55739f0210290e911ef7b64dd4c531c9d4306b24f35226d1a9a37d8f8edd96cf3e6885520e1ce09bf82faa7a60b929f1b6e66ca889d11b5bd71d485fad3358564d346bedc1d45c7c537c5384855fa00d95843d5ae4230727b48fa0360c0d3ccc963879166c8554a1cc9a33e8cfb3e20756da32680fdb150d9f4685767fef6228ff4a9b5c843173c42cf91829fb38184aa1026978691dc8d00049bfe67853e922c157d721ef7071a09b222c4ac598d9034ff1fa97c6e53f82089b53f72ab45dcf40046dc7898230c98034cc439e57da173400411a061c8b16e91fb7022c3c010d6a3dcfee3d92b3de6ec1e61b4fc0748ca0aa216e215b2930ddb9123d14a01436cc256b6e50f18b83e15d46f80e67a251f83b819b7de9be6eaf2ec970321fabdd48d711feab64b958c0050c8e16a102dc5a49be4063652b3de0d44b8bbdeb0789c7a1220b177410c4937fcf0412c570a0f9236d729e839db7f104ef5a10d1bd14de4d0c801e80df51a68b4465d46c3d87bac221950a81b85df9ca0f5662d491b92f403446e90fe8bae0903766aff919db9994a8e5666087415d57d6720977de5b8d0b81bd2fb762071b4220d8ca4a5d2b4d402dbfd9108f2829c8e5029023563dd50cd68ccb659c91ee82a8c3084a4e71c12765b87d8dd18e1d3e404ef705664250d6ae073b8aac47ec0ea7d7055f6797f48a7375210510fa8f4a6da1a78654d744205499c6eaf14653847a8c05a6e4090aeae4c6aa5ca039a388cb5408e390c05ae113d8a6615b4fbf5abb0fd96150394ab880d58265faf6f2164ee4fb71075d1b61ae0fee8a72731db36d20c92c1108d6e0c23523914479b73731f7350b7f1acefc040ec51aacef2dda126a8b8c4b46acc8766b64638ccbb3c8b70f49d548575ac22cf42afbefb1d534f8e1a5379345b3d05651b77c39cb11c0b8758c4ba28d513c42d4de9e6b4b837e7d0a477d80aa870222a376ccd0b50c3cbd8ddb3afc68c9713eb007094665ada54c0b8c2837733a96afbc08225f7ca2edd66adb91bd0475181a9dde9d53c129b7d57c60df6fb113017ef6efe0f271e445cc1192da224bb733920e99bd7bc1a07483254a4885756e3c4459ab540038d632b8667f2790aeabd811afe6c1dbb502b2a5560807936f33da551216fe4d4af267b76f39f32f47af7a482c072ae8ec2b4dfb11a4f14e962d5022e82bb613786eacaa4f5f51d247cc297d4b54af0ff41fce07b0bc3282e3bd619ca074135848cb02ab7a22c4998f9161c971df338a39bd6ab4c0265b88755f42b5fcc496bb740b2287ef8bf926d49a9e8c6cb5b9df7a64ccc69f9fb75b049b401909d278b3ebf79d80f6bb417afb3cdeba52465dbc44c94e3b49b3a2a528d2588c5d41df24265ce20a6e1a9560d98189ef3d49c535ae1cf04e887f515cc446a7210e50a175408d042549158a6a5ae555df52f66d9364d128ec078d05e2cdd066e406a48ad1b00d85b8c78c808be48e0852119fbcad046799f7ab008d50fe356a232573ef290f21c6d556fa60c34c50cde7dd10b0e3f9a3e518a8c6003ed4885a2c425647829474fe4d2dd0646ea127719bbb0ed4f1babff5545c9b7c4130783a5e2496079dc7ca2ef18e9e43ff79ceaced8b5ff28e37ac2740e0673deb8c46598dde527b97792b2a5781d3d37b3dc0a7a907f4cb5221f1a2bb8155c8da713b9b9c02730771a87d515e9a2957660b8580836812054a49ce6c8e2d9290b970a18e835783e235bb83f17febfabcd6d14e7cd26ad6362768cba62b09b798bc722da32795da67bc2b69518e5ed22d3bd364e33c48d86ca9aadfd76d19361004b7bd66e1659e7d1fafc97b84cb2cc2f63f6536eb3ec1e09309bded04b84b062db490b154da6b69b460f8660705f2634644e63f9f73c9bcbd39548b14e1640a5cddca6a39dbb535c358a2850641d3d94d5e93a15b4069284c78dca33a4c89580ff85314be89ae7af48006d2c546cb666963c10aecf222723b42aee848971a5046a83b96998bebc6772994e716186bc67b0881278cb1ffb811e1a8138a141a84e102be0e8f8fcf024de1526781158456698a1448da431defda52119b85ea86dda2b1b743d800c36e9afce28c030710d8b20c81d9113e687145799af891c78e9417db04024ca9408a5ec9bc3e9f5983c99a22111f9557355dea2a1d27bce20062774c06788813ac3a47f6207091814804d05e65c1c88f8114e261d6ca18d9206667e8483490fa8334c1843a92fe160a3836aa418f232821066160a74a003cd902f40db626e32258dc34449a9e7f08d072e4504c2b0ecd200a858aa41ee6a13f9b386dd8871fb161b78ecfc11ecea9d474ee1a6c290e1e8d194f739ca617e1e5b02041f5a21c1617388a6c36c3b2789e7b92bab8c5214e6c247cf7d6810328cf8920e160d484d1b9034a6799cc34903a8a106457c1a130168d5436a2403910f168e1e2eb2596b363681529490aa5f45b9a3208fd1b308a80e8673c3038863d87bfcc26e756ce462d7bf64cfa928df947db7942774d9bf6f66ef5db3ef9df2049d7d5e450351580d769bd08795edfda1e612f450d07e2eda18ad6fff309cb072e50b9f698b1ea0ae1a12fa5071a476e14dacd3c06494534e8838a1695818572c0cbeee9a621d8dadf2a4628e0854a0400d0aa842038c23b1fcd98d935b280f0ee55279f8e624dd419dd21d3178352bd28a03dc1d874130abba341bdafca8e26d34905a6940d60f7a59cd10904927a8d30c48be89381cb26c73566be82425282358d7774167aa97692b87a81548f7209b088460f1eb59938d45541f110377085182602041a0f5930240de4d8e76fd7f1d642c28d1296f81493534f8501c8cead614c4a26f7828dc6598d282000fd72f156c9088f4437d23bc1b9b8c4626a28c72ca42c332c05f61d270a91a2051721bc14d6e12fdc90d75506ec4554e667977b4aebc0a97fabcb7903d0dc18d06e8c524202e27f07b4980cc3f9d1a6fdbdaf4fbcb68f922d674724008669eb34ee5f3b5d0419d8a57ae995940f0b11ea204ce212205094a1a6a40ea5aa7f7084f3753dd24bcc0603299310db2a09849d415ae8fd2587bb656da00db4b0a6851391d8bf20c37406e9cce4246b1e268d40e93d35b74b2b4e3c18cd31e52439782750a931c21a01965f101982493f5fe50fa5eb9b171755b9ed7f23c38c28220656e0a7cc88504f94a02b64fc1f1f70a51ac84e34d79349249d3f0b5f45024998fa63fd3d17792a5803dfb232455e008e8d731a20c0b41001fa2ab7092482a0736a83c7cd520ac74e26955aace29b0e32f5aa30031988d0c8e92d3cbd95a6fa7a559f726e767c8bb7ff97b616c5861f3a0056b12953baa43c8d5ab460edd57c76cf904920f225f3f38df11c20b47a0dcc8d66fd453f1a5a48ffd4b02e0f8912236093ac0d8449bc51ee8ecf4d246316e4f9c31fbddb9f2d9f3dee73dcfc4690013f63e244a88600a3e43d27aa025b103d76c9806cec0d3a35ef7a06341fab447e3965acd9a6abe0659a996409087483f4b3002ac955d72b74111ebc56bab44bae0725be9ae633c9da7a52e8c145bce93cced6878dce60e3f4773ab2c534cfdbbded4733c74a3f09342e8ea2510a3e2161bd144b2cb918fa7b5c3e55955986a5fa1beec879455fbb512bb80897dc90cc8e451cf1a5a49477fc638dd79a9c020410b472b6c676ac244ea53ef07708c112b5c066db7fb5b9b0bd028472f33741fe0a74078ae10cd114f707db0dc7f9572a32d61d4469f9473a0a186d4a8d4c09267136c73301e6ec41087b79cd36ede7eda7e2b35a5ac0c6cd63b67095a9fd2f7449cad24ae688ff0124b10def491a790f16001d8f94bb8b0676290e50118daa34f2a6fd3d0fe799f76f4226ab786f43f1fa00b3a0d02df90043ba8a6df6e6f36acfba0b9b505ddf3887e984470bfe91f05e0e886508140515df457824ec10e71d9a83749a7768dd46f6422d2b2843b16d46a9817aff25cf76982f1eb933d89399f332ace0efa9dd291ffd6d90bb962f785103008dc3675b10b05c4e7c0f92f01200d49c4d1e05b07ea628acb7cdfe09c34633eabd013b11a5289665a5886e281401158842c89a324c56c3e8b63c098bf03a807a7ba8d5327a2b5b04a5a4044fee436a7749c279e42c81788e8286344ccb4916f583b651e31a7c5ddbf97274e5f87787e71e98e494d5394ee36db3e1785bcbdef2e84bcb7f19f450439816f083a2e0b7cecc71fba52853e11128ac0ce848bc2bce649bb95a785cda6179fad038699efabb1568e1f29d73f707e6208475b1acc96f2b7e884e364025e4c116374da443826cdd9df946e42aef2fb5fece6d6489928681a97541d78bbbe15cbfba0f7219144767f31c74ce4fcb30b4e28a819a814e855b132a8431384139cbaf1f06f1ec53f282249115e041d877297f68e3387a250d3684053aca846ec3a9598432571c69e6219720cb03b1df2c39fc2691431aa8ef06676596dd7e1c38d149ead63af09c0ce1164747612ab821d7348107e5ec17e16800dade1cca0d2f2e16431e2b1cf2c0652e9ddee2e7bbebfe781b4d94924ac3da0c7bd03cafb122369f110cc2eb74739103dc279ba95b0d6afa374c6343c205094221d24cb035148e8c7ad2a2a35381e811465c5c233f922c6fb9c087417db3c09370caf22a03b476a98e52d38bdc2456765671ff93e494d6950fe94afdc8a117897f82bf4b1975515c16a8bbb086c7d5c8eba814fc23b19bd5beb6118afa44719269f5f5e2ebf8b152132f84097e6609bcac90fc8740737bcb095436461e066f5a9040822f945bfff805b617710fb10b40bebe6749cee2d56fe75180b42e7d420d21357466ade0d32464990e42f58d24fb4180a0b3ce2abc65e81a4ab02a9c58290e8e752da88c8dd56d196d911be9a337891386f833463327532b9304c8e1a362f9055574532146aca9f6f8fe8852038ebdf7124e002daecbb7e3b2e8d3a3dcdef19ef6afa34a3f15a689b195f9e807f10268c59861aae3519281bd06d156ded50052936b0e6662c7d4569d040d4dd2f407dc9500c934b6ca44797758d6336d0334193f742f285659b630d6f09e8194bb42be8ffbcabd3d22beaf6fc337ef1d4cc81897751f2fe98468885e3972d24bdb06ecaea05e1d820f820d0e4c0468be074289ff1518376ab0606ce1181c759a4f53c79aad87f1bdf792e9ad0ab806ba235869d365bb46535c8141983f1dbf38e5ef02d417af056ce9500024a94801b26d80257a9a612ad95be959fa11878860aac10302e529070f74c3ce09cc14c219faf06297fb0a3540a32ab420eb1c8d16980d6a43a69f57da64f35f14ff0709d491adf5de6134e875e1ba1ae5d4013017c33f07a3ccbd4d440230f4080d480d189ee077823a787ad436c9281ff5d632b7bda38cdad07235fde4ae3adadb0516382852031b972d3726eb192e8f71542ce62fb11b94ea24d5c0557bce6254c2a5f1bceb0781a10513327456bfa835e50d3725639735979ca86640b434b6d752c63f50d9890d5d32b9816343e6909dc983f8d7332116620aab006889ec991ea0820fd9bbfe6af748f2f734409a4f2fdafbd39dc03c7d6ace85e3e6710fe4a514b4a3f70bd274013cff325c7194dd9a803b0161838f63dcbb03fd143adbcad210cd01d15479837e9e34fa0ae39c0db0095bb25c86a1220415ba77386735d73a8d95652d4c3b62986354bcc354a886df5390ad2f722ded41da1821cf930c4366ebcde78419e38442aa9416ea4b1c08a1c8a12ca17ee7f652b12a52e82788374274706e1eaf19be17507408e00b60aa98ab7e58dd9c9fc741dba06b63d66192d27db52c60b0d1ca95c10b76b5e34f85afef4cd347e8629c19b6355af860d8a3285a815fe39223b87b67f9fcd23134e9012a640e09a671c155a3653322f100e2d9ca1016eefb8ce8cf4ad35b2db9ff37fb0f16475259ef0df28c44a39670ac810c9100bac1dac64523274a60a213e8dda3fa2abab14e061542d4f7002ea67b578b22cd60b4f488c739a7383b1c99cd858274b17d60b284bc4eef087b24417b8d1ec24380ebbc1fe9d1d469b815550f099b8619eb746c01a4c0bc1dd25547aa6a952149d5d7c65dbc7e238f1a006f07bac8264dfef1c3decd551645919e922562cf9824961ca482285b21165f455e42b9b2888dcaefc66203c8c1db37e43c5d1a7709839bade27db042cc25f3e63e006891de60ea5707bd526cd9d4774ba40c1b5a744639633137d00236cd14e3c8406ca2cdf1f9044e0973cd3b90352b73730c4f83551e31d63bca00e9444d29e056d373244c08ffff6279d5af4f9c7b040a216956132bfcf8b31c5417533b134733a3ddf57581817a9d59b3133d02efca774aab3c03b23ddf9f3efbfb56e2c38d151fe4fa4a8b3e221ed01e84b156fc67ac2bf8357c90c434266da46a7e55112b77cc326076cd1a0d4952f2bf7ae61d72d13e4c6e950f31a2fdc03588599f4331a8496139a18d8ba44e125afeea1f164cf053c4f91dd94bd2f5a917e8bac5aed74a3544b0c084f055d0432b98da91f397928b52871cb0d1ca148b4a74398d47524683e3198eda0814461d263941a4b6b23cf60cfab5409e294c22290d3658f8a215f0d2c34e8f496a2c002b50e27451d416543ad37dcfd532a03736354b0aeb37df1f240d9311141a81cce80c15cbf454d657e45e5c301f7ae1339cc22e4de5c7925e5e1a7166721fc776e78286b7798262362d192ce12b6c44b68b1c782be051c41880b56ab7fb2695ef95ee35b3fee46a5b8fc3f72d21967123fd08d0f035131b8f37c2b08bf9dfcdeb768b6f9fc6daf18e9f27f9215df07f51cce44b1c81fe0a95d59b6ca62984970319e8b73aaba98c18d9948ed1baa0fbf82e31326e277c000edb0d2f0108e48fe0358eefe855376a7a37032e5b1b77dfc65201196fc1a3420242fe9d33ad39c6347245f814b5192c1ce749177733e90c7ff8d17b3926e8b166be7c255110a60599452dbf1a287e3018482b0389b5306bc1c9bf0058a804d4e5d96739718f82a53c6f7b56b9d708465ca7208b704f75a64cf9766d0c2d628fb3d868447f8bdcf256ac14075c716d93d333b38ccdd674493365671dfe356c6dd7b688379ad3a006bd83ab3f59762310e4fca5b0aab16bbaab7cb4f6e64477f88c5d738493021eacdc3feb6024840dc6b88aee0fe1e1cc60c16e6a31ed0a965e6abfcd69a3a38acec566faf1b6d5e748eab9591252534a94645ad8f308a568617e80865fec31a3a8e422dfac0d8e464c5795226c1164909634222ade3d5acac40fb1b44820f2198eb0444b09b0a37ac795fd9e7f2c7213416720d2fd23cb10ec8c34144c42d23610c5cd18e953b37f185c32dc610a4f807444357fbb891402d28e3f7840ed2b95dfab4852f8280ec830c05b9a8c8a4eafd8c32468d2663a119f5b3030e7ef795088de18bba28356376df75e0b6389bd9ae01034ef714d9c3ea51ca307efe923698b313d9ef1ce16bb6b07e47d35cef838c168f9df2bafdb8872916cba22d3869a2102160a89e072a1c1d30961f672eb9c2bba09c4d9895d937978e4961cbcda59fd833e36014b8e2bf9035d70846c0fc0c4acf067ccf2b96ba9a24841373442a606a53a68b703c4cc12e55e498cd66a02881e310bc1d32b9ce83c795cb97ab9a101ee1595f2d24bc421382a796267a2ddfcdf8ba6673debfc65d0496d0cbae4293475cd09e1c47a946ae56d59f1900ef0c855c7d217365d755e7d9ff21f56a9cbe1d8f04bc3958a491000261f395fe9f9fbfc4554de8575ea6a4c4142e43476c6672832c892955c4af03e060457599408ce4b26668233e1fa05b03cdc00c3397913aa10abcf9020e0c3426738461966c8656eae50173b0515a9249d6b043d9ea3c1582102b2d17a3294325ff70bcc93231ace4e99858872fe7c4a3f8cb6cdce50e107306e87cfccb5c72dbeb9f1bf446d8bfbc78cb768f00e8e4cef8cf76a65812c41ba9d294fbef9958003bae800d770e4030af2ce771cf036b0046d1216711c60a026bc95d3ff1330f270b8a210dcff6b06edd2b884747e3f8aa8bb3c7c6dca0eca9accf8a3472b01be42c009f1ce4ea6c7577c359cec5c1922cd2b18e246e1d15a25b8147c90c1c59be46f533e63464944bd9d1768b63524074b0dde1d1bd00efe1fc82c30e8f9edc6ea9b51641849e9b5833b46f01fc5bdda70616260d8600631f13e305571aecdb3ceaf3537ecab78b19f198015f3f89e4bf87c4f384abe9540c91b9c20210fabc5fa3e60dba01ea94d2f65cf46329ecac3975309dc42ab5ea4917df1cdedbcbf150c52158e0fd47ee9761e15acd790fad3110ac083a4bc75eede350faf60d42d1131f356e35b0cf52dd21c7705fbf5f3849ce6412f81800e2d8a3f57f82ffb27dabad3e6b3c6bf28b5cfa34550b02e3dea5f2954d1a562bd09397cc11c951ccb36269f36d903d20e8588d3cf7c4791e4bd0dafaf07581d8023514352e6503d17a29e8795c38241139285ad2486b043b1abc00cacef66184cc229d21f15c3b0533f45431ef5f95d14b25765754a25018cc229a39a6b7113a9a6b1b82320fe268b72f85b6e91a6043eeba5b2079b92bf75ddcb957984ed624dd8223ac167442b665464e42bfa38e76f2efca6b0c177ec38c12a373a8f0472355d5791eb9cbd603aefc90bda9ef8dabe2975f12a8455ea847ab017b61ebe96896100c18350748497e0806199aaede88aa78ad24e45dfde4fc845cfc80c974716391b4ecea55ad3fade1d8d09a198e4ec943be640cc7f135843db6bf68ac0596539f79aef9ce2e22c9a18665b2b47265a42bf14e3a5189761eac8dbb0af4acdb9822db516133b9fd8ebf3560549eedea42bc1cf3b20f30cee755f52efbe26539b6c0788ee67e7191a240a0c138c33627182f542c45407f71846c6fe86671510bbe7089a97e9a2108258630ae71d4ec4aaf98d8709c9e2810c37870f0d233a750a8aa51a78de35e7a6a26c80badc589f112257b804d84a1eee293a5bd29e8de79f604b5e87a54dbcdda3ecac135170fde5b508f81ae8abd70a7ef3e3931e476f446d995aa403a90405ee8a0045028e43354e0a7bced4a138828f5020d852888315173601f958c213e65aa9063b8abadbfd51070d5ddeefe370a90a3319b01376db6c28a8fcf6a4d66b5c282142c91e769862416f046bbbaa4dd3f053284140e5a23c3b8bed2daf6dd6590f1b7f6f4a685e4ac55da968eadc818cff1878c67ddb7502b50aea1a41f8448de65db6e31a7eeaa5e6f8b368dd833a98fd62a11a4ce66ac8834e2b6c42d8eee1ac80e1a2148bfc76b9a7065398e6b5705a834beb6038262b1c5208420ee956ec1a6b5a3088ba9dd378ad38350ea00e3370ebdaa231c80cbd0e6306053e05b6d84a8d57bd2814f12721036938dcff876c140ccbd43254255ce5da8d2354044a55ecdea423a2299478fbd0590e470de4594fe578cfa611cc8d7e53d7f70609ad735adba7d3cbf47297d72af96d57cbbdbb1437060e1177a3a58c75e76cf80f652c9810520a5ae0a00351e9cce0b1c98f07502e8c5ae4e0296c12f80857dc55fb39a4b1d1dcabe9cb2edd2a6cccf47e5610a7f8a2e0899d043a90a398501c2c2092d8877701f37c6358dc68d29446747aeab044e03a15f8bad8466d1e3a06509ea378a3a9510c9e721eeebd89567387330b5dbc2e2ba1b11d436ea9d098ea2acebc4c67c4e619dad7211a5aaf81945ee588bda557d1500ff4fc9be1269654e973914970a8a0bacc9233fa1116761f5a4239e1dba876d3473c129520fd6dd49555effcb93a07b2f1ae2ebc40a91276e4616be5277001e431cd84959689aba4e37f900efe6935acf251f449be9949b282619be853e111281615a91ed0985dee6d64d48126fafe39d20ea10984469f656c1d1c17c80ae3dc202fb923ed778ed26c118ac186d7e616cca71c9195c418b6a050a33c2d82cbe71d4c8e33310c33db55f84b5c08b24548a335a1182259bd64e6530f137c76307fe876811227229253dc216e1b1c782b0a1e3b1e608f6cb7326c617047da9fc91931942ae104b97a1f4abacf8fcb78d37c9e0f285a763d233c76b5bf3f245ea8792f2ae400248fe031ed98b27b84a1851fb5897f5137516bd218ef14c2589dc50a495e66e12a1dfa3d6f38b9b5fded8f1db729be625f2412b28ed4b282f10765db5c2ba6f88bafbd1771ff6698b018906f52f4bff401c764b39f16263077cc89a26659258fc878e69bd4a18f069334dcba3eda22ac218861c1f6101863c2ca0666272cb47cff93ba18429f44c4251ebef03f4892fd4fff04718fbf12a9c4ae1561ee9f01972ae3390fa1e2622d0a2388c854285f1cd67f523e98a5801bbd541d6824e32d14595761d1f684ef7853c7844f9eb6953d0164dd9203c1bbf86c1b12a57c9d104bf415e60334c427ac8de849ba6d1c17c56fc148f9d3249b90f5d413c780adf825781e811aae464ac737d533ff3a2f0b6cf7f4c38a6348d781a58e9acac95f00aa2a990e260331730c3fb4b1a64006078b10d646824a07f8306be2dfca2218030f47757dc79d8f0a85217903c18282fc5b5865c8a0f358df27e2e7d301d76e9a6b827fa1ba84f65b25e557536789cce4307283560c7f9ee777ffaa2c997c1a4c37445301f5c7506d408ef97e364f236e525ea7944b35887001c95f7fbb67516d6d43f343f3aeac1fb7d07ef2181b54681f077a0260c96f6adc143317708f3b373ce597be3f42c18d47f8fe71975f80c4f243bf09cb75203247cb5a09cc12e61e01c01412a6c4a0140f04a0aa495ce317b0200436633f7e2ef675e04edfa7d4216d5b6ab5fb6944b22fd6e7609185d7ea055130bfe15b08c1c2d7ec745997fdf099ed114d07dfe6fd4fcdf332ce4b56345464f12501fbf84fc2991b22a909a92228e8a181de020e41d15bd310009db1f59cede92c047630e490ff28b46fce9d6ae55343bd025dc13b8ebd8a0a8c8939bd1aea88212d2c8785054417ff4caeb310a8f818b37ae6ead7141912484fd91aa754f4b253bc33af5d5166ecba4c847258e100ae2e41616c4334ce41120895f29d21d75a1e89b64537cf8313544ee2b993e4403b0977a31332b99a593ca9822b1dec905ea376260b062892cb61a88c87807da64503a3e34f443de32d1700c5d2d4e0c23bc1f3e5e484fd1bfde748e84f9d62d38015780d5c820f9bade6eb0d3b42214eb1b4d7903b0b286b2ec7adc7c1f49fa6acff5632a020eafae1e6184bdaf12a283fdb9019cca1e70cc353530faaca4ab02c617de3852d953b28199c0e946030bc672d3a78038f62cb48c5bcce5de1062e765172865ad42d913e334370f7bdd2a179162470a1fc738706a72c3405765a1252ffd587f089dce96cc52f00a50f546c8aea584ed70a4dac3dbfd5065fc7096c3ce55c21707e3e8d42884e85f456c04bce6dc3d9f3261c80c98dd8a4186526086ca24e25834a3b03f1fde9a61d0b3f2c925ee694b7b5cf08ec101cae5c60702c25a61006288c0cbe80bf0c0ba8bdd3d3d66d824309ecf5848b51bf82d21fc67e10b50b96c893c2adf6593690681bea3db9ea89cd6d3b45e03226507973a4674810c43698c820b35a8912b2fd02d23196228536b4fc968b6a23b73f87faf2b5a50a6d443a3779a5d587b277d6a68167aa6955f2c26380766de2934a93d9b10c76a54bf313819dcd894bedb19965b9778f05fc27cfadda91665546c174e3b53b755323cd1c72637065b6704ba17d8d733d34c7253f49307cd1de68928ed2eaf293cc735ee320c16758441205c29835168ab7a4c0563018b16ef5595a1f64fcd1aa6efddc450facb698c822fa5666c7928cf06ad475662783d685746d70b5a62bc3ca657e3d55f3d366c3d720de3eb416f65dc1e84af0b7f88e341dc84d93ac40c047b37615c15f14dec81b93d295dfe26f49e21ee9905811346550660d5444c70eee506a2e0fb72603c9725d0c83912dbad5f289c301ad5564538790ec4e4963ba04a50b25886419b7d2a60c049b2f4458e315c5bb08a9b4831616900d1b58f61c42d26dce5720bb31d95fa77cac3d97c2c7c0b290e0ed0be50d03e585a964599e53c8de245c9d4ace4087cfef4978bbbbb80a1d307922598ea9b70c8579bb2926aefe79f696b3982e3a0893e1734e900f60d41c56f14328f8ba27f8949618a49ca49dd4971dcd0aab5a0d33cae40544c328a8eaef2cbab876f0006d4d5c66fa111a669e08d470f87cc26859b777ebc0460c3d50f9ebf5fbd792e99c4638e56ffb7dbabc9e0868fdd9fd2848f1ac9430502c504feff5260ba808f8e3613a8f40845aed499729bb7d58b72e223c44560d6477ce06789cf25d10dde53c7f00c2077f849f6ae79cf2cf1abec74d7b27516e1123f26698fd10452d53c8ae8a41ac156090c3bac6be2cc3a6ca0461383f5b8406eb2f262452d135d156a09782f71c7b1cd3d45d7467de4600a5322aedfbff13efba725cd262bb5e34ca23ee8ba6c56fdb981eaee6fc39fa6b6c4537ebb0493627ea366fc1e8ec1dd9414a1910a284f6d9fa16ea5e51f9a065b83a63da396822e6a628603d6c3d51125a1d5f36d97aca36fe66c60a080c63a4ac6bbc04d54831035fa8e80dc6f8bb86f738362fefcbd1b4b2f73455eb7d788e48b503504651170dbcb8f2f8de9559a6baa02038cef8054b489cd296d0cdde7d9f1523d052ea5c858add392f3151a7713da13fa1c087eb233ee7de7bd03f12f213b184204dda9a59e976f1d4a02c43e0ef5009a71ce376677243ee2ed3edd7b53311ab64112255786d3f3649c8c5e0dd26de35e7de2475004917ca906755416bd445d0b040e5573b8fa57fc7edb2f81ffddd939ddd3783d2028ae435557856227597e2f48f1c5cdc7331a7fa6ddaba49a28abbd5aa557994e862fbcaf87d1f5ac6d0880fef758bea40abec8bd070810694a8096ef08aa53178995a22882fee91ed695f2c493ac009861b1cd3245a862023743f9198880446bb1b407cb68cf560cf0c275672b9676b00bf4e9a238726fc6cd7de04f344e1606e017a19603ce4e641618c87169f7021139ae9c1a9a9775d6018e7d092cf5db8fd7b36f03a09b2b36c3a4b7883cc4202a6302aa5bc2bf0f2ac771c63784be64dc5a7b7800937d575f7efc408ef34d912501f2652cbfdfc0ab11c1ed2492221552c36aeaaf45d5c6e642eb2db182d62c6c380b44e235430fe0afb52fc29ff8953c35a04ae33856b0c00af0bfe1cb4e5cc0f1032ecbb8f83bf7c2cad8afb9088d39e7ac8916d34567ce093634192cefb2e9f4c10804b1c3732ce51093348c07fb46aaf7cc85e2e1cf85c6b3c55b43a5ae03d0f8d5f923923f57f491c8a71639db540eb9f711b89c4d4d5a362c82c7372d93b9e5f205072dd4bb4699b7b62710379e9e82c40cf067ad903e5d4d4d198adc76452c74ff7135e65b0a9670b515f4cb919b815c09356e7c0e1caa728adc34ad63071caca1a72a5fb85d83d807fb63b5e6e18c589790d007ae369a5024edc522cffa967ca9e95be175438aa636ad3aa811304caa8aee942f055a4cdbeca109b40849e74f0b0d719e576c536adbc626763c924bcfc9b1946170c235d34f806e4ad20ba35d411d92c908201a1c06b181b21aa446f9f4328115fb9e1c5cf5ff9417b9a47ddf5265201a95614d95569677f15ae9837242c328982cc961b7a357708bcf3658100ea795e6a4a54f3bc2d179c39fc907c90a08544ce96a3ccb1a0b407fde00a362019897ea84481a0ea4dd41e35d1249d3a371ffd5e0eefdf767c966228039ff7553d36e26eaeb0333b84f03bc3c25f43a6488ae24baf5f65c4f39d5f111d9d5675962818465d7e8f28acf8316731788328c5b3fbdd9697cd8ed7c404aeea8731addf046914b54f31cd04a553fb75f767115f16322fc004cc7a2d51ac37891d1dab623c4b9505d63ab480fb7a299a91a65d6cc9dd3e0b57035fef5d1c60636954becd5557cb56a0de228f362b86c36e4b6a6a86b0f20a9abbe9e38dc06f8696c5dd28884b27cb498038a4930dfcc7838441cb5dca049aacbcef94bb1ddc45f2268811b0ae12999902b9f78225ce2ad8101139092526bda3265b97038183211dbc21bd1602a28ae859fb6c49c8811400aa2306d994c4c60d1a1d20939439a64376d4b749ff325c2d308d25367edc6ff98a767a3a9c0cae3f1911ca6f6ee07ffb464007d45523c7e0f68cc862f3dad0ba6e3b9a4e87632fd3ea14400b4eba14ba13ca640da3fe74bd2c7e74dd26409ac5bff7dc7f43b60a1226cbb97417e9c4454f721aa63f1815356ba555f962f1d696c899c9364c2f00aac7e40081d3c6ba7a4f544c4da3c9fba18781f6c82cbb8a973ded176476ac66d2121fdb3fc09321e22cd877c1cb52290d3ba1bc08a1cd2340829f3cc02bda2256f7a1dc3226978712a1859f4e261e21426863b4f9ee65387871b150b984628a911e240ffa6b7ab7be173ffa00d85d6ecedcef8f4de8e7a23199ba2f0c71a63eb4564b1e73bcd9c7c0856edbba0705bbd94f2cf571c8c318cff5416027a13591109c1d5e131833614984e98b33666fab3bed9b28559bc401e67fa66e3a1243344825cd42b7f2898147d5c440b8b6e73a4b49bc96ef734147e2f288669a8cfe4b6c05971bdbfbf0384b86cef897d1b0770aa973fbb21515b73f5405c45220a628313f06aaf8b3debcaba4ceddc076745b7fd51ea3992318cd97778e467f619f3ef695f26db4feb5fe3c4f446c4a40a8d90e76567a82aa864bb9380efcbf60e1b53e998cab3d0937b6e9f7501c4eac2587c75b46601755de51a0de3d0379001d1645ee1f8bf7d726c3eccfa05133e02745b04ba8667af54206055a503d30c6c4ab210694fa61d9c4d53c35aacf359c885e211ad64607342b8afbedf7ece414d7000a940595143ea388ae84c21e0c75b0ea726bb628bbbfe8f5482d83634322d229b90bd37d972ef2d534a32f00a070b9d0afc354d3abc339ebfc64987d7879a2c3abc386a883abc37355a747879d41475787b7cccf3d73ce9f00ef132cf5f63d4e1dd791acf5fb3458797003ff3fc35471d5e25deff78fe1a2e3abc41bc019ebf06a9c3aba47b20cf5fd3458717e709101a04a531003dfda02c0250193b54c61054069306f97b50193ce89ca241fe1b7e1c74fa40a70f0b0028cb8ab28094a5b545ffd0f346fd03578dc8d6d189a8877a5346bc522fcc09a97ff0d87b957a69be57ffe03da34e445f25b2fc33b4f5a45514435b44ad2c68cb49ab09ab43d4f7fc361d067113aea8a49e002fa3ded4cec3d4abc2f131ea7d19e261d40b63536bbd31f6b22c3febc7ebc0b2f91756872fcf2f8349873a3cbf8ca10efff96534e9b03ebf0c271dc2787e19451dc23cbf8ca30ec1675a6f8afe0ef5aa78a8f785876fd50b23e3c37ac11ebea6de189a7a696ed46b63a35e9cd673f85cf34cf37ce3f967508733cf3f873a2cbd8daf516f8a55af6a47bd2f3aea8591799d7ac11cf5c608a05e1a7b674ebd36f64e1f96e9635987161dee28ea90c7930e759e9fc5a8c31ccfcf82d461cef3ab5e1db2bc00de556fcaf5b65e957d20ea7df9a15e981f3e00f582aa7a635ed44bd352af8d4bbd38f6b210b58e68cbc8572ef51eb12e8f438182f81a9c6f1de06bd01bf465e80cfd494bd4880f67f837376a74e0ec98096b2a0eaac68c0cced31c207cf90ea043100778e1516fcd8707d03900cdcb01be03c8d4d4fba2e9508b4c542d323f1d5ebe06a7a6ded6d3e0d4d03c0fd0d7fbffe1d47aebeb807383f33c402ff5f2f89a56bd3a4ff3e18d39f332443c0f508b88f9612dd211d10a5fbe06113abc0c11a8ef79804af5eaf8d6ac77c7876f6300380660e357067023c700043000991b03b051ef0e03c09143002f330019229e4585b0c122c0caef3c0d1fa518ef838f1b3e546acc7cc947c9078d29e3557cf4f0357cf810c4f300cdd49bf3347ccc08f1319446cc103d7ea3db54799b2266d46b338bb8f13c402c45a8eadd7e163101f0a9226cea8df1378aa81ce001b261791ea0522da215b1d55bfa5980775a44b34a8cd8546f8055bd2affe325e5013280fc014e07bfd4f300cd7a5f68050040bde0b7d422d32ae15ade86e366bd35de6b910e6882f502e063702df5ce781bce867b1ea017f5bef8d9f2fe5b11355453e553b5c86449ddf81ab54857aab7c66fb54857e20152d50b3e8bac77f5a95ae4b31ce0014a7d07de259f07e846bd2c5faa57f5db7b940788002915682786abde1a6fc3b262d422df8a57a3de181a1193a78657a3de1bcff26ab09e0788d64bbd1deadde1717838529e072846bdaeaf71a35efbacb731801cde4abd313c20569e074800f5aafc0d4fe66dd422dd0d1bcf0304a35e180f8417a3de18bf528b7c96033c402bdf817779cf03a4526f8ebf51af00dec677940768885a64a254a01e40c83c8d182080781e20997a7fd08498b316e9646a914e26e6798064d42be3eba1de1ede875ae4f301e579807ea8f787970940bd01f898a7518b6856890f2082a845e6eca102442dd25925dd4c2dd2cdd0781e20987a61be47c743bd3cbc4a2df2590e74cf0394536fcecf00512f104fe3739cc70e1d3a3904e0b23940fc10001ccafd0db5f914ca3d0e6af328947b1fa84d55d23af2157f8b963ea4dbd7d0f934d4ff062dbd0dba7d0d3a9f456b6ba8417e1a74abad2674d69693f6dacaa241fe19b43e00e8ff8aeaf0207df91e687d19f49f07aac3c3d097df81d6da7ad2203fa55f5b31a80eb50583bed4960b2dd9169a5521034ae8c2bea0da127aacb003aba2be820c38298365a15908ac40f2825da14ab857a14a523e4595a070d508bbb8ef68cfbb52aa9176712f69cfbb50aa117771950708555b460df2575b5b341887ec903dd1685f5e22addac1d7ffd2e1ac4db4eae71fb1b31269db4bb4843a6c0d79cbfbd691e5bf2d2796ffb6882cb78a4cf5b68c2cffcb467b6b843a2a86ef9e884e441d5e1aaf93161dd27879ab060871c56fc54c82e5af79028d49e365b94628ca709cee042735423284f853d92b43a88688d608f98a1fa33543bee2f7337cb746c8b27745faee1c1a62108a9650f81147119124c4ca14a7186c905fd6b7fcbdc577ffc187c1a44cd928259dcdad84542a256574ac53fe44f807e19f9573a94aa92433f3275f255945bf965f4a2579061f7f2c83f4a149d9e0fbf95509c6b26990cbf1d6979343a5f21d54e59339fe7cedef9caf04fb9c567518635569f56bf073d5cce1a95ee5749843b6e08bda7cbd5ed67f66d3bfbd2ac13e63a7b78b2f3fcbba857d8e5e75e77c5eefbb6b3f68b0dfc66fa3afdb0b9f7fffc4308c9967d0755dbbeceeeeeefe1c1dcecef2e88468f0bae5294463b709cbbf73fa3bf9c6f4a5cf220eef4baf451cdc97b66fc266cf6d74874717dff63b8468b07f9b71a65432d12cce10d117b0d9dfb6cc589479c26a252e821cbdb3e37618b1fc5faa7d9db099101d2ad159fef9fd3bb3daf864d43e6a98129dcd2a0cd6df2ffbfb1ef38c069a9d3f3b34fdfcaec3d3cf9f8f4994a75da703f5da73ee1121bfa403c3300ccb3c22be4f99debf4f7daa7e44a47ce94b554619afd74bf5faa3d02bc4def84252cc37a5eff8258ac599f8d1af96fe44bb0663c9469bf11c4ad429475d7474cf7d9471e9d13df73bbacab9f6b3145d7c683f7fb64784ec913d566594898fd554a77006948920896b73cd8fffb5d53e7eaa43977ecc662e5d8b88ae6f216c707846b08ba9283f7b89582ccb30ac61ba0892de042ec2701348834768f1016990d909a224f88570d14e8797f5831fc811dd8a2ef6231ae42bc46edfdd09492101a44116827599e77f44aff84b8f44875b3fd7009ee1efbcefedbd02d9281249dff637161db155241ac0373b71869fb9b885905e31e6e924d1a066aaf748ff900e8734c81bf79bffe939a74392e0e273210df2fb26b9ed79db7164bb986dd75e0806ace99b5e0c582d890e4fcf2f64c8a9daf8b6d35689b8edeae2c3d4849bbc19b94d32ca348fbe18e868f474b8e7d1218f068d58ed598b47f4f30341a2c3d83d3f4e1fd9f76b5588dacd06997908c138fc59160d1a786cf3675fb304838cb947bdf47a31ecf472623346663e751d33465fbd71d9c43a69b9770ec3b1f3d220e9593dc6302cfbf9bd4adaa9853a46657c15cb0af7183627f6f2e231eeb3cee5bb8f1e112fea6dcb5dd7d5eebbaea49d5e2a733e18e35e2281f2d153747895c8aa39edf2d23b6f47d63d87c4eb50af0a46bddf4bc55ec27097fa52f276b8fcc6af2e65d8c3a897c67b91d8bb48ccd3718ec32c37df5bd1f4a57e5216cfe4780bb52fa8f79c7736f8069b28776ec388f49d3eb26755bdf37b96957a55beea6f55aa5e554abddf574dddd4eafdbe13ea55bfcf69e6d7e963c934bfeaa3ab36344e7bacc52a55bd13e34e6f72eeafdcc17d9093c6afd3cff9d993a95e1aafb36123dba8cc2a0c6609031763beee93cebe954ad5a547e9b1df51aab1c1d2dce89def47ec24d236ab3678c63fc7311b4726b793c89dc4628c99949947ec6516b1a8d3dd4670779ed96344969f53d63b21d6317a855877e9bcdfa1bd5763d7fd0e79c496e885c2ba65db9f6515db71c4baf8bbf4d03efb1d5acd6acaab4b0ff9fe3b64e5d7dcab48a5521c8f588f31c6d831c66f89c5c79e336e8c72151d23471c7011e6b252ddead95a4d35d8da3f4d87d14e1b1b6de3f0c3f40fdbf38397887c56879cb3b723ab38b3d234c82c8b45db09dd23da6b1fbda9fd7c2ce32a1ac4ea7c79613588fd30bbfe61abb1571ac55ed3b4cf7e56d9205619c32ae831df203f4b0302f7b1bba7b7665cf13b6165d73a20c258be7477dbe0f4d3bcb00be3667ed92bc0b191b34ceb181ad5565a0d4dfb9cbe2a1bb1d4273bcea2178e4cce5c70042655d8edb78f01df3bc13747f0cc029230fd0edff0aba6d41f40f886972c20e2b8c011cc3d28ae27ae473d5f89f71c7bdde4287ac5dcd3e44b35c85fcd95d6097be710ceaf1858124490bf44850b2cbfe414740d329f8759b0844f602f1071f008a28c1353a0c0f292894487d3d9d3c184f42e79690996f5d740dc97fa525faa9b1215ff89a2079ed8c862c57a3f7b59b3ded9d3c6d905d7d2a57f830d360cd8a0acff9883deddde64e8188d3a0ef878dcc591134688d808d18c34c8ee44a49d9abf478dccad7b3971866f328f5781fa7738ad06e92f7175e7b98fad75d7aefe20da76e474c248871d6725223369b5fa23f511edfcc89173e3904d875785c303ab52812c9faeb338c426b1091690b49d1f401a6476c2451d7216fcc4de4804eefc68fed1207bfe1afdd1ab1c1d46abd11f9371c4f0bfff8718d2f7c1f6b7f86dd87ed60cdbbf8a3749348cedaff146c88d18c6f8fe9818eaf0fd3cc410c6f7c388e18befa71147a54004fba26c97566238e45162a8ba7182673864f9fe196f8cf00cc71b7ea1be53deeb4e0a0532822fe547058204df300fcf34806fb82709bee1287886dfc54808dfb00fcf502086ac8238a44396a29de01b9ec208df70129e79f10d53c133fc2d5ca46a4c7aa92f2b8328c3ffd5db1345d9b2141df24fab20867c83084ec1371cd49693f00d5721032af8868582106598876f98490fdff050147cc34d78c6879f094fcfed20f844fb6ba56c9909137bc45bc4d0014610434d7804f1473d73139bf24d537252be17ccd3b9fda76f1be474a1b027ae14b94d2f2ff57a0e286c10ffd3f36b9e0effeff90631f4c141fcfcd361bf4b6d09e223ca5888203f0be529303ba10a7e0e42bdcd42dbf3f3e8b02b6f2182fc5c535c85e93dd3dfb6dee7a0807f4ecaf3b3139b526f3fea6ffff69aa7a3fffb1c6f144710f539a8e7cadf731b4754cd693047875fe5cf3c9dd3e7784e9fbc70a5e52858b6c27db1b113fba343256213dbfe6cbd3b36894d6c8e38948345c39a20bfe59eaa477241d180b90bcc84b4425827880155aac9026ddefa1f61094fa68401c7a2b1611525d11d5e1618c3a261c16034d2b485a9bf20e3f060b98750a5c5728e0e9653ec8b1c2c96fb2f8ae5fff88607cff4106bc3a2794139ae4eafd1d3ffe9fb71f86627876f7ef04c0ebe311244c401001eaa47a9fd55980ef99b6b906f877b1511031ec0128844da89fed17dbf917eb0f48d828283fd9ee9f77ffaeaf397b237e578ec028abdb1e8852dc522db2c96cd64b15e2828f80826e71a22a6248aafffbe94deceb2636abeaa7e2178c7ea55edd820fe4258767b7effc0177de5af641e21081db09dbd9d8d1a4812144b3af5fa6b9fe32569ef104b44b60bf63a48c053bf0641f07ddf57bfcc312170282fbe071a353ed8b091a69b61a30ccfc848c1b031868d372a9e41d9784bcf33fd77c2c898ac05db8f3269a07a7882edff52af04dbaa172f8c63fbb9c6f6775f24aefa4b940271a60ab65f8b50b0fd585c82f500d8fe4c46c44123a6c81643c00cec30eb97cf4c482b9d23c8d1b3267031e6bb52c9175f3e6b98ec2f7cf139821c6376baf149cfd89b3396118b9976832360ac6bf3e36331ce8fcf41e24b0f7cfe42606cfc3af9073030301f0c4d838d6130d6f4691a4dc6a7cf691bb6a8bf2fad1c95bf6e31ec39dea83cf63286f2b19f31fc1efb2eb632186bb26916073ed30e1a1e204cd294cf417129345a142aed471b904483b22241830febe9e9a09ee3eda36c51285b6d8379b96ddbd65e9aa51755a9542a75184d3d0a6dab425f661f5552a957f9521fedf76d5e8f544d7d5e0f69956415095ff52301818803fbfee4035c1a7107b43fd1a96f40c481b1fd52f27bced3413d12de8a2e14252b9f5af98f2ae951b9b24fd9f116f7b801628b451057fdbca459049797701122d8bf4219094bba9f9974a8f2fd3cd4adacfbadfbeb76fb286d899770d6fbeb96fb8c26e1ab7e15da001760d6fb7e46a2f2185541a2431594a9f2fc523ef6df7b9e0eec515058acfb28f62814b329b489695128281429dff374a4f4787c9e0993de2636c569c23e94fc6a8c71b8ece4320c78074c484bd3a11230acb7a950c0608f552560acac1204894e50f011295188e4bb9452763e18723242177a5258a0862a246155c0026366b782df27accfc8ac0a58602f598af66e7277788fdc641fff63ccc75ecbaa196946d6b9ff42734b33e295c6056e501383ce63a19da39bb297983c25c9c2085750e137be986599ac8c044efed017af684117365ed1822ddec62b5a6004eb93c4055570af6af0552f0d32f71de5dee9cc73de75347e89ce7cf496d8d1496a447ef7dc1a3eb6321fbd1dfeb1c1592f8d9f0d461b5dd0c4fa6f1db29cb044dccebfd3c67c4c9d0dc63c7b3aac7a3f1b532f8df7fa7d35dc5fa673cad6d9f0f9c7bc8d9779907d7ecc8ca9a0d798277c2cef2df854cf7173dc4cb7027622f9616422f1157ff7477c7cc53542a588c38a1a23700d165ca304ae6902d740816ba6c03556e09a2c70c87a467d0c1c24de4af1968fe7e778527c501e20fa38ff6363f8581a3c347a1a642e85b6b85eb8542ecebb14cae2e2649742575c1cd6a550151797752934e5e2b42e85a6b8b8d9a550141757ea5228aad2e8f115ffe73ab9b8ae4ba12617e77529d47371a62e85762eeeeb5228e7a25449cae3a4fc8b14ca42e42b7ea9e483f12d2f6bf0c528b9361787d2a5d0e9e252ba14aab9b85497423317a7d2a550ccc5ad742954ba38964ed5a5d076712fba14ca2e0ec60b150b0c17138de8c2a1d1f53d8e2582b5f9954a59b8ee52a88ce89a95b2043d65a98245e885b230695196a190b2d4501627940587b26bd2b629d45d3284d4f045d713dd0bf1b78685c8b6b09ee66b845888bcd52e7e9622958f4a8a0e659e3f9e88a20c3f869a2ee1d7c8005dc2aaa36d38bfc6c85b3cce440bcbf245518ba7f349c11a6c2b86a8c6054b9c84359385a843946596206fc910baf30bb2fc4b7c928a596b6a841ae49a21164dfd8928e29831b406cd5f96e517625690bd097678d9d678ae71850bae70c1cb4ec185f5e78fe9306a5df4626240d6f3c7780c655530667e4ccc7f9e4e4ccc97c5649e8e7f47a38b934bb89d5e6b7ccc474fa786490deae27fe3fd3deae2f544d4a01658f86a86626a8d9cc167a3cafcad11e266d7b91811df48f642f927ba8f3b28cfd1f8ddbf0ca55185a4ec36c4564bafaaaa97367c3542fc41643ee685a46c90ed63fe0a49d92032bf3d0d99989fa132f4b295f17a697c4e7bdd9e738ee523e627bd293b4bede9dc99df9ec63bd5917997a1d1ced06859f47e96469d0dcac4d4cf4b40f62e46c4e79eab4fb84a1f5d9dfd680c7aa785416f8d6b9374a70d5da1b78608f753a157452f7764f96fa428510d172c3f4d8d901176617f8a79191a1b8ca9de10f3b76f6f88d36f3fe990fef92da16f09751826a1e0d07ab5786a9ebfd5d3e14db5a2e8f0862d9f0e6fab254587b7b6907478555a537478695a493abc375a5474786db47e3abc2cad251dde7f9be76f05757875f8eff95b55bce0b05024e8f752a1328e5274a2a8ead520bf0e3a7caff2366cfc8d1b4f43f395e55ba100bec6a5e5c587422113d6508d2629271d5e982c3abc2aa20e6f0c2d3abcb4a8c3cbc3930e6fcba8c31b6ed1e1ad39eaf0f6f032b8e8f0c2f815a40eafcda3baa8313dd01d19f484c403955134831ae4df81b22035c86f436383368f423d0c18bfb2f235351f86df6ae5d0d1f1295a2300cffae16b927c8043f80a79c29e0e2f8e308a0e6f8dd0a7c3cb0aa5e8f0ce089174786fc2293abc344cd2e1dd21a4a2c3cb43f8d3e1b50fc4f3874b3abc32be87e70f833abc309f7afeb08a0eef3d11599a03043d19c9709284c5a84186f9149521e37be0e177a094fe8c1dcf627d8d1a0f8095757d8d5087177cfe1a261dded5f3d70c757801f001f5c6d884634f02109b81b6338ca5902faa542785802140c2cafe1efbe80d418960fdf199bdd90d99e4229dad52cdd9b2c19efe3112c1acd709d3bd838d0c4db22954d031d620dc33a4e465e3100d82a2918d43354862fd95bdac77c0f24723e66bbfa36d6f44e9b7dfd93e7a3a4c2c6104f7d9ef64dc679df79957a3af76b2cabdcbce8bbfab5c65225f6da5dfb6eeb9ce8743520a12da7e4a95df33c2c5086dbe565d3cba5c764abf7d74456f8922a2ab5477b64af463becb0ebf91232e24cb0f852b7a3f5cbcee14597ead8db28f1e1023b38778a8b213226f65172ba2ecc2a88b11d9134e5c8cc09e38bad20986044be263312446dec29ee511bb342a8b7c6504f6da6bf5099964f9a32bba747690a4916523d9bf52aeac6ae095bd24f256f6fc479851963d568330ecb32a9d10f98a593a119a46262ca0a0049f170ff1d08d4956a88b38b0218b97cbd9c7f24766f9c3ef2f6fa110a9608b978bdf7bdc7dbc259df84bfaebe5424c64748434e42be61ef676b8ed1aa30cc7212a4460dd5e3964d98965b643def297cba1299d78eb86093b18721965afed886cd30684827e380912f6e11e7e250d3942c289bcf2c0a20debb10cf455b3631816551fa3a41f562b93efce219416b86cc6ec6316c31e7abdec95ed95915e2f2bf9089c443192325c8cad192a18e1e5baf29d464e0d4843ae3be49b7dc49935c07598c718fffa771c638c5186d2db46ec6f8c3162eeeed25189b1140317613a7ef7d714e7075f941816a5bc825fe18b9fc457d1f6ffcc205f7d42aaa1770212b1ac8e1514f92ada08044e02c0f647b633b2f024cbaca0e26381197e9a94d863220f5ff5f3903cdf7ddb0fe33c34850c96c4d878450cc8608dac8d7fb1a5baf108f1068e6845cce2890f4536c6c88a370dd8892dee21eaa7f18689e24c0c3f942a85438d8be6f7931f9e893056be4d0e073ea90327470b15233c93851fbe619e0e4419940cf569d3c8ab033caf1d3c1d524a29a594524a29a594524a29a594524a29a5908834c5dff8f937edaca75639887fa29d98caf987831c08dff473b316454f7886886fbac638c3cd598832fc5750ce41fcf1f83b662d8250c4039b8527cdfc5d8b622cc1f26b1d7b3b62b01274e024c060272f8c0417c6a2858ff0829ba8f80a1636c20a5ba1c243292e420a130185878062261f0be1c4413031103c16eaf8071cfba0c43dd8b88ac93cd0d8f9358e328eb14b998388c3dd71107174f333107b4da241d6e93a04a523c983dcab8b8f920492d8d2479bd30c85eff2cf8fb778f88a9f7fe67ceeb96931ed37feacb28f9ce2ebcff1a69ecea43b3cbef0cd8f2c44c763c745fb28edb6cdeae21f6db39d4ea36dda31610b9b0e9b9f6df847eae08b2e9b7b90a8f8753099552a15f768f44b9de0fbaf09432cbdf907933dcc3d9d8c28b0acdf632fa7afaaffc5ea8ccd6c88bc99ae13b276132ec2c81c7cac88f9fcfae3557d9fc4c17759710763b1cb48ba13b8f811a69d65d7bc9670474d88e231ac245d0bdfacb1049f16becf4a4e340cebc92a1d61b79ff4c2d8f930362d5d398cdab088d02ad8a0fc20d8d33428df03dffcfb56dad83428bf44590d4a213056fb9cee974fd321f6f26d380cc3b4fa446a99958f7d5c494d66f2a32cc127bf6d84915b92bce20555740bd0e0d99c65e0620c978eecf522a9e48b0df291752dbe3b79f38e35db7d1897793a598645d7e2bb7fbdc8ba169a1b75d2676f5ce4ab965209dffdac5cc277a58d91d386d8b539c81ff9237f582c85ed56a53a4479eee1b8d8455ada628c31c638bb22ebeece397773867121a5945262588c3146a9c531649ee42edde537b5dea64b7759c2c0912cc3b7793ab10a9148acea6b50ca771722a5bb7497fe110a3e22fb0406274d62131efe916807c88d434f9c478acfa6021bdcf8e2b66d73dbead79de3f2c8e47ec50ea7261bf34c6a36be8a2f3d734dfbee6e6f8d5e968d9cc52c953d67524a9f9a9452ca196552c4f0f17b642fb25a126986387d15512486c92cba165b227dfcd265b7bbbbd4244b29a594524a2d732d66d1c618638c1b2af3cea215587767ece219f92cc5c76fa34c8cb1bbdb65773747ffbadbb3eeee88061bff0c36fe902159f631b26cf34cebeecedc5b7e8ca6910be949645996757777b7945a8c316aee5a7777b76c9463d99024afb7bb3b6b77f72c5a91655a966d997b26c4bfec94993c7ed975ee598c7359a9b76eef7aba96498f69d0b1acbb3f869452462bdc3d1322a5fb29ebee2cd3846830ca76e9310d46e9f13bc61823cdb24c882caa50df09c5c4998c3aa6942d6573737c972e33ffbabddbdb4d5df4dcb3eeee4cd3bc2c9a36b651a63d46d7d833cf3ccb344dcbe896659e6d9a67dddd9996651a263dc7c9d75defa97a7fa79dd8ad524929332dcbb2acd24b6d6b99d69967acc5d6c43e295931eb6ef7ccbd3dcbba9db312c78edd1c1d93da96b937355f45ef28657777d462164f9e4eec66eff68e8ec2f89b638cd4f6c7ccdd3df30c7339a74ac591ba674d1ff3c1c72699ebd9f85d94e17e116562334b291b6b8c764d915236e51b98804b026d642d8917f1732747eaf7231bdf55b24df165c3d9f676b0bbb7a3935e8c323e3b382b7b6c7c6f41fcccdbc1d9c85a9b76f4ccb2ce32ceb22cf34c4957b48027bc820570b05874b1858d2f636a882b565045b7e6dc9eabf748897b69b17a8558cc7b8e3bf958db2dc3e885b151fbd6bc208e74acade173f121e58779abe10a27bcbed005924d05373ef67fbd5eaf21d795df1787ec8dcf3f5507a6b0f7b35380c0f67f43a18914903499c20f16539840b2b73be9fba292d163f49831d6d265636cb56d36a8c918a3c7e8eeeece5126bebb74975827bf2f95a292996bd3dd3b4fc2c7ef9894929939e7061b8c95611a8c52ba136619dd4bdbd4b2128b12ad1476de0c58e2639e619473c03f3f9ed514969414224800050565084aa050282613f8be4f08434ea753109630994c4060c2f33c210a745df703221cc7f9a002a552a9074d6cdb56459139270f9cd0346d0716c8b24c0717c0b0ec2f076140e6404a238e03f7272cd651e619c86d97b0677f0ecb328f091d25a6f75eeba6d04f0d7e3269f21867fa3bca3caf5714587494c8106ac489a4b69dc422092c8eb023806051946519e63c4533122c9078d87b9867f27424d6695e0facb21458689a6b73e3315520d7e4a6fdd8c182a8c4994e279a63b2b141820dd7615dd775d32b3d2f8938b2ef9253b76de567f2243b1a96cc1ccb6e7cf23d8f091d7fcf9449779389beaf54be5ac2c77f559e274f92b2edb08e7b3375373eee4d1e133a2518b01403db7f7788419c69e9a6bf2f980aae01e720823c04dbcf3eb0fd5c838883711065a8e0e69f952b544c4edc03dbfc73c44a0cf3bcf674f867473a6e5be9b120a597cfdf82b1fd4aef5e8f9274c9b665a964c29ebb861105d6b6cd3b293d2674946c3f1feb7ebabfbff321c4997e234e24310fbf5e6e332a24892322f20820450d40c29dfef07688b8b7994ca6691a2645b38f0fcfb66941b29719267530ccf37a6495a3f03cee89254d56eff475a89347043b268590285bb4f195af5829dc170a9b4aa948d5cbc3a05061f01810cc5454e4ece26f54e5ab26c28b171dccff8ac7848efcf92c1d0c18c3da36d48b15c4553f1276db76b295aff9b7685e628f08d9e2e960ec652e3d62d284b1cc2d5532655f62cd51ccc045989a785b363e8d78c33cd106c7c6af11c32c94df43ec96f73132df94758c39899e2548927aa29862c9b53192849006741ce5e176523f7809df00f9f288934760883f1d28cb30ec9d1a3142aff6858faa7ce5e9482f08d18c6ca6619f71c7e84d8591131190121289bd1838f2af5d0646b423d7f494442f7cb14119a594ec9c296a472ea7d1c5562059fe0c0c462e3ed63925f3efec4a4354f058495df8379bd968adb7e0bb9ad0c9ffb4036e998e38607ff82808a62423d8d34b09d6bf9f70ea3945d19da668d07dbedb1274427242e273f4b2ec237bae480d7a4b176c834f7bec5b90bce5f2f2d5f657d220fc1b57979e97cbcba5a7c33887c83e890b4f4b154d5c7aaacb4b5625f383bc356b0b926d49ead0256d496a41d25ebe7c25f3d4d360e9e4d382d421b754d12ba4962e5a821a74971e97170e3e4cd6c9337d42d2e010a7241d662724193d2541623d7ba6cf348ba729fa84a443cd85a7578ea4c3d314dd8a2e975783fe2d412eafe6cfa4ec1627b6f4271fb638af6d41f85b3ef6591312a7854983ded2c4b63869c9c27a8b50832ec5d773faf1f1e9e9e9f18143834b4c47de6a098a2bff396f4bd0125f4bd0e9e714740a3afd9c7e4e41dccb6a49da5094f1593521ae4c48ab0931f79a36ba4894fc7bfa39fd784b13d2841c49136a41c2b4972d48b505c9fab704b50c596f41eab08b0eb93451b8b0feccc4facb9f2b901a3471613a6a508ae133217935211d35e826d39109a9c3f8451977f1c15c650c5c84b93441d69f5b055123eca58f9104c3c72d2f570b5323c96ec1b761b1b024b7450aee8e5b5f18adbb4c605d9246d7103e94233bb5eece3a49931e15d81ec227c1f0dd96979700f95835327da5247e81aa7cd5f26a79b5b4f4dc96285a7c5aa4b0feab9fee9771ae96586ffdebf5d280ab2dbf64fe3aecf1f1169288836592582acd205b6d7c9e64a5a783c4ae08cd8cb5248d62e5637f616c8c2bf8ae8cd1fe74c8ad82a40fcb4974f2d29284ac735003f5f71074607b98585fc1776392ec5d05595ffdac7e5a5e0d0e6df1ddd50fca8d497aa118c9f4a01cad96ac6eb0e2036b8378b35205cff8fbaf7e228efe1521ebcf352dd921e6b843210ab2fe2844d6791832ba14e5c8fa33a55bd0952af8866e817661c507dc90affca592ef4a6a744f3dd6b5a421ebafb5bcacbbac2d2f5f69e0bbab9f96d7eac7fab7d004d9b883af84a18907b668e281273bf84fbf0124f6f4db732769b17a377af2be7b8ebbb74b7cde776fbdcaa341f93939b6f099befb70befc1c2d3d1ffca777af47f7a77ab7c75e4eda5ff8fcbf477558c74cec8836b2ece99dfcb054a6d25ee66f3025908be9581e8dc9ee8896c8c9ee8816a7089602475e45df8d4448cc97f27f7418a44340c4e1a2a3fb1c05441cdecba2f8c44a28ac26a3cca92ec1d963ef4130aecb69b7250d1cd94d0349969fdb408f357d69033f4359bc3219f64d969dbad3292b999eeb177c2e3d501f1ff5476ce9fdb98ec6e75094bafda84e743b3b7a4fdf3d46839c1e3b55971e2d3d9dcea5477cd4a3ea75c13edabb045bec9b3862b9888a3ad8a21e154fa8f83ad8a262d55151a78e76ff519dce4dcf9d28db7bc46eecd1684f4bc89c6e3bb76ddb4ecd716c4df42e01c5f5fef41b0d52faee9bbae82875ff439c438761a725d86235483f361bfc38ca9877aa9987fa8ebaf4f8c1629af63f58ed39ac72f472decb53bd42ece93b8cbdf7883055ef68b4271aa4fbc6eaedaa9094e53efae0e7dea34d5db6aa63fbd247db4929a5bc36563ea7d129bd1ea5dffa4b93fb1275f1517aefbd2f3d7731afab3a307aa21df5746026cea32e3ebeabb241ac72db73d8cb06e3c52af7824fce8e6de297265679031709c09d6407e9d79af050d184470a8f08edb597235bb3378456b3f6e9287a04320b954ac5d8c7ee28ba1e2eb80873dbc8b64007b3e09873dd6901f155b3aa44412d7c2e3db82356fe0563a4a7836540b2ef3e7bf63a4d7b4cb3c1c9c1340cc3d939625987dfc66dac122a90d575cba694d3db47971e476c16beecdb04dfce065c36ede91c357361adc723cb46bc454cc2380a8badb0ca5f33671d08de293b3bb3d7ef3bfc546d94f90909337e62669d28cac44f9a11340307dc71c6129e899229ff0b3ad2559298d3ab9f1515ab2467080ac2d79b4d42e26cec96d6a457445968f144dbc25e6e8b160da90bd956d62418306646d08c208b6559d7d263060e78c63f7b8c6a2f6704d919463396ccf8f11938889115277a3b3aeb49490e876ec59674ca1e6fd5d72d0da9577d85cfbb92d59c587feec8ba3f7bf25bfc2fb78575214eb42159f9b387242beb2522e5ec563fab9f550d563f7655645754ac92ac6ac033f233ac0b2a65c1459827df8d7070828b5d4685f09d0e79647f318ca568f01eb1ec498dc40adf8d45407cceef53a9fe4130ab4a301266fe233676130b3ef96e0c78858f09696767198915be3b79ceef53a9fe4190d53616d35870e2867c2e3d4cef99bcc7a2d7e978de474f47c604111984df7f045158b66cb9187e110b11c0c1461bad89fdfda5a7239b68a0c7a587f7a637d56b7aef8f58ce44ef8e6887f4fb2bd13a9c67f24ccf26cf44af0eb65a4eeb601d6dbd6acaa48eccb86af61ee1b6f75289b62d653c078bd10b4506eccbbe467b6a4bb0d59edb74a1b0d997e8d63531ed122e8797d56ae499cfe38cc91570804313990d1223c8d151a68ca7c9db0d4b04593a6cec5a7889a95694d5c655bfaae30aab31ae72a414be1b8f92f023dd9dc52cf26794905964e573912bcc222b65cbeab328a393a5d4dc8f92f016f6b20a994551f8b4a31701dc85d5cd798ee6d12cd264265bf62c720129318b50432d9d78ff75a88a21eab17f5189372a168b3d2a86288f7d2986298fbdc730f5d89be2cd8b166f7eb3583f56b9a94d95ca4c0c19ec47a10188399ac7cbc36ca7ccf418359930f937beae4189b1f56e5c1cb6bfd4e0ec3e0db3586d02b329c6869ac022e0ee9895efec980efe258090cd4c0519e5c77d8c1c118c48e59b6a561b1bcc663211cc9bc04aec5cb8277953226e75e4b7f78969746c18c7c6771b294dcc048e93444c6c7f5d0b237f42146c9c99dda2f42866a51b61b29b4599db59b461d17ab42de6fe8438c3cf4dc9cdaaa4b46d2527f2a252b7a9bcd7409f289b626366357eef378fb1cedb3895732acdab6d3d898a3358e9bb8dab4a4a5f94e18fb33d7aebfba68d9b63ae6d58173d4f474ae99d673a7591eb4c1333c9a1a3d793a2af88669145622f6873c1ff2caae36c0a2ac857bd92f2aaef57a51ec55394e5576866552ccf9f92526d7c2c292c1253a568a105399216645b5a16fac48d5052455eb40414af9518654c51f027ac50b62c28292f42895645a32dd9cf5bf255be5f85726fd68bbcc503b4f229d437cba37cbf47e109f1c6f47ee4ab8e3852be5728ea53686651f8593e857a6e7a3a2cd5c6876241a12ae647fcd2a2628dfba91555944149b565a131ca985266d8a2a8a44b40f1b22b55894ad54c369a3413e6d33ad1e745a669ca3413cd2ce847cec590f73b91b70f7d9f7b0d8e306ed33a143dbd894acbff7d5fc944dd725b67a26db95267ea4cdd67261defb1f9ddd1dbeb47479ee4499ef4a5a8983fa7cff7a7d3c7a389743d89539cc2d2f4dc7237f05fb6ac3db7235ad44fefdb3df7b24802fb2a85465fc92cbefb65b6454b434f832a14c5bc931d8aba954b688bf27af5cf97456d7f63a48fece1d6ecbacfce7a4f9f45fb7ddfe9a3f34f5776d40db69f2bc548296c4b244a48249aa66512c9f4c14a19d05e73243682c46247762a913e7bf891127e9461d8fb9123f118b88ed1eb7e3f001296df9d3c66fd8926e753904748f1b17d9d4836f93427f63a91e582b8a028ba8582e4abcb71521059eeff93de1bc74f4a4022b1415444d807be683ff049402261c209f9113eec2f17544587421d62dfcf31e9d0ff7a518a4f494996c5aede8cabad183bc61803a76ba8e4acb6b4492d95a21100000000009314000028100e888442b160342228bbf60114000f8ca44a745a1b88490ea39031c818630c01060000c00080c8ccb4011650533a011e47fa66f8df261c4f0647a19fe8d09b83eafcbcbc0ae4a04404e56f764b3e8dc9435f44763e5c42bd995612b8c658841a6cf6cecc4ed9f69c1c51e3f32acec6b7c74091d881ac094f5857287f027cc4cb655772198c64ef9c7c85547e5b1a63eb9f19f09285ac24d74221fae701a5346491c6bcc8bb15f88de0defbb0c25356d1df3edfa35c3068644e5bde0b66d009e21d317b8b8a6a5eadb6a9cea8e63d62905a6b6385430eb2f4e994a0bec2d6bd5aaf9fa42feec84490f99e087afe55c76a555a7d9091268e88fd96d1906afb7695a4e7979d3ac3d1d4cb89532f31b98d81cff3a586f1bd102b136c76860f55302da311919e80e41fd87f1da3bf3090e0938e6fecaa9a509183455ab8b3a03282fba0b9af6423d12077d28f23d613fa0ca8eca72be075dbf2677719af62b9977b11d6115f81a250f7baddb98c7c5a357bbc9dde6a9455b40c0ee6abe6a81d841787532a140dae6be4f57b07e6092c0212ea684057f0446422b2a1f53753ea2ebaa3f9a1482ef75b220efd8ad607ca4e07119a175982899fa044a5490a81e07fe100dd97ac024296f5a460988cbe90f82d827dd49272425001328538cc5ffd914110f906fb4820590c37984b95f000a94c1bbb324369ffdf64d129fd7a21c340452e9744c88c41a5ff1ba6050eb4903c7a7ff367628e2f9dbf4ca741581b43d2d6fdcbed23e1f8f486b229bf4ba48d7eb2e4ba63962fa45cfb8ce7611b539f007e657e7cda177558026f65313c9a8f97a7b07667ba6539385ae364ebb09319364a548a45f962d0bccb1bbf356f8ada84b69ff1497513b079886c12a81c46c7c0aa6ecd30dc1ad75551a1c5b1ef5a06c76845a8cb884a15805be320075c00e43b31c64670c1d0f9219c191f6498629f6fd1b9a82261f43703d5083aca4074112c261fcde500aafcb3b61b2c09ebd08c69ded9ff6967346f66f83df9fd692028c79fac5057b9f86d4acac0c9c77f9ae356c0323c2d93be2a9a99aed896949384da9f370036447297f460b69790e4585eaf94144e5cea6a80ce1279310940ed9798fe5e65625b8f0d25a9a2f0aa2ec13fb2232c17e65946675111113753fa903f017f987bfa8afb578db16847a0c0703224c5088aaaeaef46f02a800e3c50095d05e916740c125258ce8618f7faf907d627ded6eeb38f27894fb61af5e7099eb070f0f9eae0818c4fa40bb016821ebf59ada73f7d151dcd361a88a10f7053b5f37ae6e79bb67d2c37750128fa1e2090caea3356f437c09e986c38f6bde8fea8c02561dece50628e5b88e4be6f416e57305dc63d01a1939e2fcd744cc4cf5fa72d256312ca8878527fe21636f2453c85958bb25283a45847c7ce81883f2b432406850ef6c9215f2a7d708ce1266cbd15ee2541d333d490278b2385741dfb030a307a30a790d78c76c200078d8819562ee82e576f84c6f5eba0334b4db188bee15c54c7243acd700ce6025bc9fdf19000f0eb6779c598c80e0e1f317852c0406c24c12744ad6d8ea48e04110e022b7855383203054f4070f96a007a25562f487f012f1838422ca701c62f59e44cb77ceef6b14615bf7c4e70baddca614ef9b43d2c51a48aef48641612b70c9116a8d41f56045505551d5bd74596b085538c3149042a40cf78686c40b85345be380c756829c2c9ffc2d25018707a903d136ff8ebbe1ab61df1475d9717b719367eb3f6aa9ecc45152f826baa614f472a88de3d44dce266161e212ce719eea19b30da13f7641be9cf2f7a96abb708fe097cab274ee7badaa162f14d0202fd25d11c4c2290bf46baa067191cdf2e8f06926ff3efd183d7dc6ef3eb2f878683cbd2fb4643eddd7817579d1634f01f71aa37b247e8291c9607b4d8205414d07cd4ab393b973280d6deaf7c66392236d939f409343ada79405d5dd81ff4274267b839d551042f3ecf56d8e9deb0b3fad153d3927fa4a2a7b57ab84758232ea979ce61830b8dcb256f8726ba0e52de79eacbfcb217cf7ecec139bfab7d238f79f73d906a49f0bb0e198d407c450159899ec4392985d40634e6d139a0e0091874ef8ead0997c4185ebb802b72ded208099c5e4a5c0af5a6ff39b69a0586e9ef9aa789f01a69bdbf1e93900603763b0ede06596e167410a12651583cafab05a52a165c141b275e32b8bc1be9356d7713dd3c8bdcb0bcc9cd2ef383cebef9f6ee12ac4c5809319e7cbd8dadba9fa9a5270fc47844549e2787400483d4f3dd9769c0553c10e6a1c784effa9dde05bcaac044a91fd36a3d12006ce465975c276dfc8cf05ab4e8081a30e1faa4d22b57be4e323140d48588fa4da54a3f23e16f4a27537dd9864aa14cde44f625587c876ba3527e65192c9ee2d981168be1282ef1a3dacafb831434700d856a805576a1817fdf80063ece649537074a619a6b9cf5c309af53b58c9a3ad36d2d10b6386a762e2221f0c3cdabec13f15610acb9c9c2f7964770d19b9dce02f7b105a97c6c79d8e4d00b5f81df4da62ee4174b489fb8b7ba0219cfcad555b85dc5752b932bcea09f1280635ac77b5f828a9013b2ae00ffb527c72d644529d1007864142c551f965c6e552b78203f5ef34c1ea19bb076084de221292561588da721809e9303a8401550c060f69a021ec0aaea150a413e37773cd163262edae43589c8e616c852ac48c5e3b10f8a63ceaf7af046facb883761c1a9daf2b9220909607563f80f171a4ac57f4e5b2d807ca3acfda361f6742227cf579be175e0d99fe94955fd3bcb921efa448ca2f821e55a6dfd6c20fa5bbe941d72b31d4689015ae4bc946c82e13c65514baade67abbd414c0d27e4d6fcc86abea50148b49e090016c7a0d83998ea453dafe5c0c531da12a7dd6e008cfe58399fd7d64eb47ab96e9fab13eb51e371730e640a6305dacf4928ec4873e47f12f6e8b521a3c5c59be4354aec75fe2ffdbfac75f43301ddac95ac0155cc3744b6bb57b0e5b4da9959dbbad215d53780db9fc76be55f462f20f52073baeb150433cb91990ec4c6f122184fded72f2f3976c5d2411b9618e68ca8f7b891c8af5898efc17882086dcc6fc95e8033ff043bcc71a6360651e2cb39ddc235cd4c6618a160d2337a1460b51653975b458918efa3aa931fbb9b50aeb99a16a069b3cc05d9dc741c47f18111a8a48aea31d5e22e529ccd313b2989a45f688bc7a029df19b98a75af8bfdfe3e2fd1ae985268f8c19e45e2ca8ed150a467f4d371104720f5c1c9caa56476d2903350a057df41b5fd401767172976eefd2c1df14e2fd3c05d15d3403cf09005b45b6cb19baf92e63ae3efba14c9986138a3349d21b28751d865b9679334b42deaf702bb56e63f1f79ce2fa7fb250d66f7aaa7904a6ba57b946e6c7d44d91089c437368053044c277defca3cb30bd85dc4395dda218e543519f9a7f019d942f48e77625b5e77c1e35c74a6eea88d15883a17cfd08b224d45264b0335e0fc7f7d1f9d3beb2c2cc72a108319f0967d191c87f30d896448ebcca9aeef850ffb4a4347525f86979de46a53fe7aec4899cbab92994941d6762fdb1cd61337ea57280cb3de384800bb3105b8cf22b5b001c7bea04bd775df7f2f85fc1bc3cd30ba9e3c4103120240f132264724fb40deba82c4e03e88306fa91ace135fde88683596c2abce982964a02596187a5597f444ac873fbec234ec04c271a9d381a78cd181edb7c06715cd0e795ed57cac9ba146521a8a5ec1c0753843e3060b62f82e6bbeebe417d8023fc7bef6d85f5834c8b043db52b1f8f79f2050e675d2f0ffbe331cffe3df970f83dfe6234275ff085ca0e1f77f8afb0c16f82d41bcabe76b1834ded784840c6ab47d881f2f7a4e7b50a22b919808096e64104f3a3400f30309c2f88fe63dfd4268c5a89dda02f5507bdefa528630eaa2cfbe8fea508db5c9bedf7d050d106b684c4e31d37b9ea0dfd6c5dabf8329abd913ad17c8dff52afd3f628b9592ac64b24dd001f4817b4426d75f2283811b7f97c7582582e81637775b0a2817f2894c1a8316b6a29f011ace3dbf09a7cced55d02dfca9500be6bd7b852a4e44296b8a60689a0afd32886e59207e5da9cf7aecb6df309973bb1768a51f4d143a9ba02894bf50924c895099aac444b50b948581da4e4de6775e8fd7f49c3a34c60c5e187285463970b0777b42c64914295f43f250378f395e30a50ef393827126e53a9b72742961ca2abeeb4135c3584161bbaef3566bce2ea442e14194fb6999e4d7f26728c24c95ae9d3396e6086a0c6e4620214ece5000a1d2a134a268ae66d4f9d1bff988b88d2420d0b037821a2e315d84770989ac35009865dd7805e851df97d640a92fdf868909ffa46b5b39a3a53cd8f34b87ee04648d0880d1de0a5afaff13f5b3fca30a8153bec8521cab442ac1db1e86204a8172d84e063a236b4ac586e2475def226d3a1a80e8b6603a76e9f51e3f778cee3629319bcd3eef9bb0983ab8775aeffba8d99f0118fbc07339fd41052ff075beeda017c3f4ae4114e9730c4c8013f33a376827b895cf6b0a87a207e526b84c07552e819474be228b212a15110a710c676c5174bc019793c7476a04c100820ffdd14415f5321c94e15aa75644da6532dc17bf9715da3dfcabc318a018777e3c42ce204d2f48c38bdebdb0aac858d22c13fbbd371c4e5b0965757923d35f0e04d3fd38f8c83e9d13a42faa1b7802151cad8788eb42acb5404cb3e5c4f81e8dd2fc4d1c5b39034ed1528250e19d10a451e6ed3217a05ab1a263994ff97f50e1fb7734a5df3bf9d8cd4a35dc66031ba3e70ae97a2aaf05e701d6ce29153749eb03f590b0c9d4596b4cc85b8981a0465d6e6f3f5865a58839d549c11370e045deae3f981192638de5906bef1dfd916156c877c6472a073e3dcc33f8e52dd790be31b36c9b1fd92c8f8ac5431181316672a115a445ee860f602eb48d3f827783a6746f3ce19e225d7981244e0a24939122a559a8bac642d59dadee845838c9a8ebe00254cd51264ae4af31fa054c42f2db47d1b3f3cd1e4d541a8b869b1bb8033b9ad8f79e138ed1147e8ce5873ad0af60e8085cb4353d279c3b5e9a2087ed188b15f20cdbfb687ab9f18b49243bada1651112635921a52f21c080fbb6192e1a65b230d6148feeb118e835c41e06488a038dde75d3f0588a698ea39782303c43dac4e382d3ec40984715ca948ba383c0d3385b42510f8494562080a2a11b5a0582437ab932d77456633d7334572742cf459542c4ab32d4d42147654b89387274c47f65e277179e8b257a6a5fb02aaa4aefa65a554c02952c91d90be5f0a60ceb08886b360059311237688f3c880b5c5c91779c67492832173d6412a4fde05a2bfe17b11f8d5f8bea26101c3e0cbc0965c1c72b2139cd07bdaa6b3addaf486c1a154c23ca872526fcd81ab5a14ff772b29b2b9053b769b18e672b6a7e5a04135adb0f8f877460f957b98af6a2a7c0b53b47128692432142d27cb7e7d7e6359550c8de9ec6e369129a1bc807823cec787a3d6db82380e7b86e12a8e42504823bbeda0c0d02825ea9e3713dd10a0221668af476cfdecb00b6a1c055bf08463dedd807aa2162a858016cce7ee6614e29679c04bfb1cbfc61991b459c457712bc92edfb5fc02eb66ea0595a30b8d112c2710373b689e07f24069ad42d21aca94c1c228fabe2d2b01315105cabb323630e739bf910c54f4451cd16cef3d886364fd6cb0563ee02e1597593661e8abd4cd038cd8fff479f99a3369c2077f811cc4df89594bb714bd04c52bf23e0b41976404ebc9637d7df6a304c22b4df41fac37efb582689e37d1165dd554d730053027f2ae6f183236299bb49e6a5ba5556ee688048bee17364865f1d191e20fcb03ee0019d937340dc57c732829172819f22e5122d23e5db2fa072e5331d217845f7f0375288bd9d16e112b20ff2a19d97225156547a38f9d1597ecdc407f9b2c4988ee83913474ab58f3ac40f19183954f8bb2367372167a632e30115ca6cf11ef604934c0482f2270631dfe4bd40f3ad31214ba5137cc124ee2413dc6aedc9c885fe2010c1d11d84dc97075120bacb18a2b319da4fabcf5955d0fa570920550d4f0d7428cca56873b1cc90a8490a665c8c8f42250c4381960d2e572f355dbbf6883ea84a1b30018942783e61ee41ec65749c7829725dc54e591f8a50853487f9727fcff2aa8461fa05fe9ee6ed44b3553f4c0bde9b844c956b15e390bc4f5dc81daf4f2bc3db0e8e2e855858806a4d80c1575a86daa92f718270f7d6c26786a8130dd175abeb0caaaaabcc934c0b44ceb5037ed9f7801d24474951cd0570c34c051bf5b98348cc1fccb0520940da3f73f13a5b2f9bd46b485c63b7e88553e130bbd5969c9468f74403eab11fc7a0a818de9665d6a1663a593a1a34afe70fa93af2f93398b67c128456e7c1bb057c88a9775a31cbc449750fd1303108ce1f35891f8e84a9d3b9c71d0fa858122e093b098403d08a0067cb0826638f80674155f2eb6f366900c6ebb41c1778343ba2adfc8cc52c37cec5e22aa94e99ca1334095934e5f3670efe67e267750aec441330ac53e86534d10dde32a39d28b9f3e25b4f4ec139353cf3a717262a7b08c4d94f526bd272c1b8a3f0c041e07e79dddc3a1e1ab12e2d667c92ad0c68a1f665298a969b75cdb65133a91e7968918d05fb4ccbc3416c7312e4ec24a9d85e802ea2111760ac4a4e92129f0213532d7b3c79e8c236337df392aa3a2686ee801e08c192d5b9b3e2d24f30dcb8d362850b528eb74a48748168cfeb588650dd1228f0568d792bb7b882a6f46db52cae01cb55500e2a29439e7e79043ae043090a593cf56e547311e5544781459234a37bf7f6c23f7b2637a3bc24008629396584d82ca48353c5a2f4efb535ece20f3417783158a745717243609be6be53fcbc180a0361fffd068008db36f8a2804bc256604ee8c9d0d68a28e73770bc7d76d22951afb226488804f49d00884368ab5268b9c165c8014ec6d5fe467eb7ca188b37a0bbc925fe1c70f05289808718627bc16493100125919d15b48b64b5ad8e8686950252070bc14ec12df0cd0eaf45133951ee5007e280803186fb5309d8762c5a852aa4e5f1a00df0340341129ccc58b5191660c90d82df962bb81878912019bf6f2f4872275a4b8f0342c40d29f605255c714d1d15069a665b283e704d56629cc1281ad9f1b7678ef0f102da811bcb119b7d8e37ff39d203c39435090995e481012510864798f915e23ca90179eeef3b4f8666355c743df9b76441c039bdac2d8544c1d0b10312dd864b7d5e31ece6995eae2a84be3174f4cd4912c09dbd115f966db2c1a258f4c61a2284f4e1d890b6c6af589680eaefe83b2e904f8ee582e954ff3b62bfe09e832c6ecdbd78b4c8fac87f50cfc50c87c05ac2ebda7b8a871da559962359158d94866bac14fc6f627848d05010b0e91688586d4d0276e35ae34bae5999d510bb25f737f268d93dd1354c9a65e2b767945abcdb2770b5e6d6e6b25885629b6fc702ceb58fee1ce830b3e12061d99000811db515b8e30848f4550ea528e4689163a680fa19a4f820918d524442760f92ed888bfbe28b29c45c5bbbcb4c3f3654dcca3ef063031688cb9884ee48b2742aa1ba5039109d26414be9d15a938c762fd9cd53fed0459cee6c0cf8d6e4cef0ee62ca40d81da9ca5ad7eaad4b2191288d747beca9ec8e23d11bab732dc29e3b4b5caa22dc15b4de9208e7280fc7d87b7e017870abf6e2baf6c48647a6bc27717157460f3f02bf2badf7e819e0347b448c62363f60dc480032b25eb08ca7c149a227cdc2bb2e4e6bd82ff56902174fc3b9cfd093a21f22a36e392cd756d9d704508817428d8ad42684994f85afb2166e09c21e5e71ad0ae5455d87cb37c4603a3949aa3532383ca79f487a3b142879b2a39568809fa0d415a2ad8d26cdd921b4a3aa384435b7a2f8c8744d26a071654d0343cebc0a5409deb8e9e34aa11ed45f513534c788be229397e040ca6ba18bbdb81c8f3c485c79eea80b238480314f5ffc42d6e35abc8d53717c7b32e657331530d8cb4d6a0e370fb28979cc1587870135cd18f0a18d2216a6f92a16a289e43aa9166d2d588bf7ee6d3c791f11f92ace825652df13e4c135033d3414178b2090c8076493b6c95e2dfe609bbc2c77227b6cf1a1b5302021806e34f1930a1df92ebe2d8e62a19045e3f761ec8faa417c0f530484c9e76e749939f5824def8cd58d9e4a2838536ab6485b56162781ee850a1a8dc5604ebe60f143ad2a50e003d96309bc5a4306ea93ae4fb5105335dee5be788af6d2783339f442b558c7339d1122dce17d8bac492af347fd3fb30bea050401626cfb4f09a3cadd1193ccc1119f523e1baa4e11d2711a5a59534a087f33ed91d5ea410a8b1514916f4a631fe18a406d9445a81778e0d3172ff60caa71054240de8e290aac5359436608ca70f89b6ede3b57930b5146fc34d56c54e49cab296faff5713c162554bcd65d7f54e3f88e55e3778a10d3aff53b4748c5426b6261706fd059c68152545fa038a77e7d223fbd242a3c6de269c1c14304bb8487477d0b126c6904b04ad9f0eb5053cba75be7a54101dc6178a161e21c4ad10318a1e776d55cd4984209b31ba5c63e444c8eb6fce9b6b9f84789e53f81410f9686d43e2d4a0d8576384c6332556b856b85ca6c5beed471aaa839faf61c863652412815ebf48bf7f8c111409ef6e07d5a3511c9050088d78479a7cfc5a23a3b286ab62e61b99540644a616f972660dcd672b1906cdc9d69258097a07012ce88841a9e646530212fecd75f9b553a2c09e98950c22b5d207ede1cbbbf050f3890ccc07898f3d646bb252ae986107e07eda214902333737993a49c3d0f6108c56024147f31006eb7deccb97dfaa210601576bbcfa57e5e64755a538de98d808b2f41453f0627c9a91acbbc18e11f11e8112c961f11552ed4d2bb05b979e91d4cb7940020c8574093a7baaaebf13f6261c8bccf7c92652a7585bd08c5e76f4111d2f3444117026208bfb6047d144384fdda0c26d90fec29d821011d22c43941d46a955f053951c341197c85bc0b7751bb19bf5b24ab12a91992a9877def01c29014c6a72970a0384e40c29004b990ace15915fea1c63c4bf5c0cea62fd2003ecdf1acfb7b920c198b14082ed71bef65e4e8a304dfaec0ecacacaeac4dd1bf5f6d056656998d75dc21bc73acd9eb9da1cb78cfa1a14fdc391abe2ece7f1a53f67b68a5b9037a20e94bed4f8b5cde97e835ba9de811a12b512b34a833218db22f9a44cd195a5022d6b9921e01a551268ee0f5775a2991cdf6e4c62f199e26a952bd380d1e03510e49871d32232371957392fd1f622ff1a8917a63998f3358255aa7261b3b78d47e04d0510fda8c3a3caf79f9887f7d21c6b7ad2a98bf17a474dffdb89caf07db20e3b08b3de518117d85e721ad7ee14e6fb8e1d8d9b548c848f3bbbb7bba4f7e905db85ba0f786c44fcac3100f0ca64378d3616adf41239fa5d1042a20a1c81cf6154c016c96b307703e5460c6f26315b53415d05ad0317831138cf237d300dfdf2f2ad8536d948cdda635ec5453205e997b4da66f5b5dcf2c9e40f462b01911591ae14ac0e93128617ff0123bb622c2492b78b1b3d92f78fffff2e2ccfdc91b7255450e1d161cb90a99d28f04a8be6e63e8dc6623b33911550849e350b49d73549fd77e10a2aafa199a99b0ed2c21d809fba0ddcddd82a956ef82e07b320cca7e44c808ba1e9be81dbdf9698da8fd249172a6af88b7ffdb60355b5bcdce8043b244101e5e211012f47277a1356896689f0898372ec08ade35ed08e0bb748bf0d22487ee913bf0dff2d0137858f6408888651583f05878bd1493209d04ca0748fb3529b5b920065cc44e694d8986843b956b0e3fda0cae03741edf6893445a6c58c01c10f8251d6d58ce2c73be277907633b97d875cc675a2c2678c1bb17f57062d833b9bfd63773362202bc032332621474c9c0a0375bb0152f5e3d39bded93301003ce6a4b8215e7a9c65c8f4eaf9c5a4091a395121a7cba5cab0026a9a1475198a700dd1b355f29a1732a36dd1209e1c0665783a150b374998e1db0fb10055bbd49a670fbcdba8ce302920e349c21d2a1d31a4eab81ceff4973889330d7450b9ec9d8c7e590f7e3129b86f1bd24ce280887101f14169c5ce3a21c1f0ac74360c6118e617c7c6cd7ca8e178671d627ed4d42d59c7b93c03b4e979d1b8cb1b770b1a49c2b6b47770169f9a512abaf827a729db3670ae2f5d4168cfe95f0f9e48978e2ffb276b4563e5436b4ea5c3802907aff489c805d8c07fb7d79e85bb8a305c4bfed6abbddf36510cb8e54a1510def04f16df47da8d052a7a4cdb55d1677320945d7cc3de227204d64de2e6224b3b85d681fad852689bb6cf5b8742687c5457a2e6f6c33674e40f737cebd54cc9cf11315425c92be29216413c2b64aad6a2ccb9ed515d6ff078b6f18a992cfd60bdc4c0c0575123ced7b6da8cf5e098778810b3a9c67fe4eea0188296f3085108e374c948f4b9e1e1765557b6df5b87db8739346492148dc1a9010436ab3dca7c46d6148277749c027e45bc0e7210bd8396d0ecaed039a330d348e814cad2499eab52065abbdf1570a49cfdc0b8b7450fc3109132bbbe1383ade15397259327b17133c06201d6a3f654a643a63f6ca2a73f87e3c77993486bc46c12d7d51508b799ad203c4bfa0361b24a9ab54a5a4f0b2b77055b2beeb08c47483df1cac5b7734df7e68ab70994c9890a86ef764aee64a9c1de22e0b2854e42cbf0b38ae2027b913ae64c8d7a54fa9fe337011f816b97c82faf66b9e06f13ced1dffa95a5fda0d7edd603fdc4a19d88e55f98c5e85a88fef83c5c3d228dcbb224fd83e0f94612903e8aa970f8bcef06ef4813d18bc54a0234d370b25be8f8a743c3c0d7dbac1ad554c36fe9c6301b03466ca757a3574a2e159988dac2cb43a2afa1ee25d9998b46926e6461a325cc0270b8f4c2392fb94ec134f88f8fa5cee066328c0da8929f9132fcd852362a98d35e8a3de8753e3b116f8c242dac12bf411f30f1b0b3372ac48bf96115882e7a273ef72915780c4c0b9ecc06487154e26243c9c9d3bfe02752daf01b92bbe00502e407b28b484915777addd8e622c06d8697d4d2bd0eca1bee903c3b899f18d7f3db7e45a22d9d11bf17988a2f6a2900284ac461f79f0ac48ada626afa3ed9d167104e640325db922d30b70cd61c6d7a403a1d0efa77400e5ab39931a8a63157c941449b5861714a5d70fcd6e3a485fdefd90e57656a98b66f2a16df5ca1f4106f8219aab17a2d1b8ec6965a4111fb6dae7f34452cc8e2afc91a9d7bd7d3cb02487f409b20881595a713f3073f0a64ca2b531858e651c1860427f7035b7a67598c19be95ad07e292ad7d79507efeb665e236904c6e570e5af740a924b6d0e5680b9d92b0e4c453c1755525b8a7829a6c6600cb0a4f835cd68f5f20b7130471dbe11360d5d9d2e53cf6f5d31214c31babd7bdb2f25c677597e46edd9b87d79914236fe82870f4c14bfe7e41dd3ee404dc09c26d9a0a6348db453f6292269985b90b2803719f0eef883dbdb8d493565497c2ff4c95e0da90bcb6c7482ff0327a6d549f503d935b82121d0a0f80d6ae336d1245a4a58b8c7624f772b1e61c23dc77a84428d6f7cd0b7006dee2bd2dd6a0e5d6a64f71f6510991c1590c825ff0ec4b146ed58f8d2feefc9ada65373aca62261ead8a3ed766c5ca0d0a4c39183aa22979cc5d39c8917baab5f3ff84fb257ec0bc6d3a53fb1851b2add40b259f3ffd0f29a2df93a44522c9c0b9411adacfcc06fbefde556b77829ce7c96d621f0fb51bffa79157f8b46a6a498ee595528bafc6f372882e2a3d6102b0904022cd0a28021255dac6c1a0298967a887c6b1417b1a3e25cde15c3b78094b252e2f7e6b4b72169a2260a5cefa32f26f4f60434b8a733514cd16a9fcb1e87847110a342a76f2e8323686e249fbedb2df8ce00ab6fa068639c50f5dd14f3746e54dfca4f7d7b65c2cd93fa9adf96fac72524b3d11bbc9c1e4a91b22358f249728ea70aa852c19f3bbd530dae3456d23680d2bf840fa8c5b80d8fa573c30c3274ba80538e07a606ce10ff84d2aae8f6c50eb336e67e750eeacf6fb35e664edfe271c99c7d6dbb7332015f369a518354c8350727154f2b4a087de882067aa0078dd0831674a00f9ad0050d74400f3aa1052de8401f34a10f3a68801eb412ef603a181d673297c04dde2cea1fa6b3066d6d9d9b519caeaf04c3db6aeb42c30ded90887ed88ed4185cb8aa7c70b9a0b9c8251458e828c2758f580ae55ddb0137b57c0e6fc0eae380a04fce4e786235a01640af3ebfeaf62597642b34e166bafc09a8b2be3a6db0c4b29578abe01b28f5465ebdd16409258ba9b23c54cd0772659f8d133ad074cb812858a464bbefed962afbd9c2645ef3f3ee2d77d70b9dc23ba95ab8754b7f8b0b024b1fb987cd1db0d6d28334591cf0ae27dd43b4c6aa933bef9ea275f1eb7e0bd4e4f80103949cdc8cf2473309fae004dc39d8cea8935fd1f2a643441a7c8ef8473309cd7445e4b8ecc6a9d35b69725123420e5c427b439b047d7223ecbe6ccb54c3af29795123224c5e463cab1d247d3a23e61e6667d4c12b747148579b9be9d566060cd9c5f92d0d6c8e7f5cc7c0c207eaf30c176777124cdced3a880801d5b473d39ce90d78c99c27689a202cd04111269e579eafc0967ec3cf5ef7c8ff4d660b8db8d26c119be09a80be2cb2a802b51e299eb758c1abe4c5b732421cc3dd6a6af0d3d8675f904b213a411606714e6ccae5a0f9ec11d697df790b380e2d1f3a5f1fe0b9790c5c5cdda5ee6ee0cf519eb1a0183b57920f2a5f68ac226506d4d319b7f3e4fee235ee5f7e1bb02e77806426ce97d6619550fafc8310009982111a0db19a3a3b7b7e0e694f7c4e8d090eee6b649c5dcbaa673946d8148ea00493154cbfce4bedcd35c6afd08e9c6339a40828393241d408bcd18cc5a850389d674e4b8ec51375b08abbf1338296d097411b0de543c490dde24d2b68d51ac413db40092666b6426000bae59828ec475baa02bba97eb9c3c484f8ed4a973baac2c547e72d772832ba1b2c5b6640d486c0884b6696a326b91e9f28ee5066aec87cd72056bc35233ae90660fb7af1afec59fd3f1c89cd323b692006c8dcd27a5889c133c6fb98aeabe2cb1d5badbc290326700cd2e068299306a5f78b41db4d905a9d19bd0f92ecc1f44d866d0c43f4817e58f39a514b20a2ca5c95831d56a2272ab3ff0fcada02afc8a65d9724c1d91068da6e642edf426080aa6752ce6f8da90d79b119d452b5cf281298eebe43b2da16fd184ce42b0054d029ef49a97c59c81d4a70d8d447094d9103b29a36f49fa9acacddfa99245c0b9fb5bce29930bfa937da209cc4ae3dd37da0c189b34e5514f9ff4074c6d756fd5a62ff0715b367cf391a9293e3b6fcb00261ef789802b13de5d3172c3143a6f66436ec7508bb6570d8b5996a0ae1a4a5bd8ba258df3051609fac3a86a1cc38b24af557d8e90595d2e3319dc5df7327ab39767f83d4abf6284257abd059160d6fcb1aceb95af2d540c6fe8103ca77add936a2557c6fb5aef581f5657999be41940ca280aba391fa8637cb9581cb072edca67ddfac1c9b7719a0990f3723f4f9a22339e30abd0c5c1cc2e98bd95589cf6e75da548a7bd4cd914b30ca8c1bd1009e8a728ac1e02dce4dc7dfd4be08712e32a6ca78b0b6c8a55d39a9202951395c44884e90768191b962ff2f29d9ab5c931ae9ad79c22c648f2f81ff3f53bbfe04119be7c45f45b588474cb9575004800d7c384f3891dc53aacf3007ac073397499c52b98551260569d12e5934260a937bcf7768c27257d6fee92a1aef83f2f719c4098d9e84edb97c4c3d0fa1a8786fc9a66b3955dde957195a887029fda880d6941fe87b7f713babf9a79accb7aeec0d8173d9b6293e614f8c209b697193c69981dff14c18351a98381ab9763c74995b79f75fab81f7b2b1096beab32006f4ff20d5c13f2af4df078bcf4ceb1adc6c49809b1f9551c1d1b4381929dc8c0d9b152deaf13b14da80133b2ee4fa11467bd4803ce0a7b30f5d1bedd730a9182723b0b37c3d8cfd4c8ce57d66d447fba5e49d94875a2e1ec11a079f91e9a229a815359f4cb4b96aca28b81a7da6d0a60278983712b549eebbbddbdff8e9edfd1febafa4fba987d10ee73011fa240732c8f31a000b5c459a1bceae65263479e4829d5a627419eaac176f163ea3e1e362afbf10c110e479ba7cc871bf01eab54bcb090d72fccb6125acdf4f9ca7d0067e554557395433c81ae1d4c06ba1c8214ae3d635002f81b0d316965c5e2398d02ee2271b9ff192c3e2b49b9105f841c5e33439e1c9e8c845b84ed7fccf5394d96125f39fb8429dc564ba59991b9bb60377735ec482d47e1e69e052507e1d2ae81ea43ff68ce80b0b6a3aa44f38ac672501332b6cdeca848cbe9ccc287a71264cfc10ce4a5e4285478b1a604cb449262488a4f7a50e3ab4828750e1d9aa0610f3c86d8631db516d3ab5a82752eaba5421b0e36c345c601406a5e4255478c525501508952fa831bda82782b2fc53fbb8dd50ab95cd4b3218d2a1a38d508bc6b2502facbc84db7b4e59f27c44fdff055d9e388fbaf04ac82e0d20c8a073a437c65c9ef7844df7eae020486e36bc86cd837099640e80dee6b1652bb849837ed2838d017dc6fcf693050dc624d098e86c0f685043f6275c154a182d5f8f6b966cb7340603de17af4e495a541c36117b818ba023a2fc97821f0c5b70f5570cdc4d64648477f44f088a65b8e10011a953639129686b830892a599c97dc578d26dbc6e8c6e39c12c401b35646177cd70bc0998972936de9cfbda5d0cab0585f6e126a5721bd28380752e2edaaeff444d106c5c8c6ec5b99c4ab6b28d2be3793bade68f30adda914409a49142651947e239ba0da248ac2064b89225ba8cef5c3dde0f2844d0d5e3324031542e5a7fd34053e90b1f5b236628bffc624cddc406d28003d8479711cb388110f8c6d854ef15b6bb07194d86e3b9511504317a05b6eb50dcbb1b44fb9d5c3cee0c0305e2845b9eeb1512e622fb929d4f89bafd53afc70ba6bf13868bfc67631f9306c80ff3b24888b3eea6641d026b64a2e400cf97fdbd3c01c87990ad241094e33ee6d449fa16405cc9f2401778cd4a7e51ba9492b9786b009a5345df9d57a6a7357b604e6e695e5ba106d6e5f7a457782150cfca13e099a33082d0a8372a399621a776174ca144ba1ed49726855b27d1520c27eaec3c3d8e7cc5b19fc3f49d1487cf3539841a2dd7c28b9108fb85d69d2a295493a0afc37f28f1de2a691dccc81d78bf4e886c3a3e9e019c2609af8550a2106cd89b150844f6d9389556709409c620cf1c1ae42a88e4d67690daebf7d6464ef4eb83bccf207e52e3119cdd7baf716684804b4514c81cb68b473203779bcfe236ba951cf4866b10c8354fc41a437a8dd58f45f8fd3452b8467c0d883ffcd89199e0b569bb1b4322e6e850e9c025c0d33113d3acef11c9af1e059b50292e404d2ff0462b430882868d349b76d70bb9c21e1fcff0f5e50400dc19cb88caa186653bf8c56dde1fb55a68494920086de59c74148f430e3533259fbdc1c420d9b7f8a5f0def189eb799fb81e1ff592d1e3532fb9e9b970d4bbba0559f65e9c2c14fc69404e4a74a0855f9e32f72bf298d7db9404ca2448531e2e106fee007bbb4e02595c1d24745aab97f3b5e7395a122fd424c1f6be2d794f19aa1c374182c759d1c66ea3ef2b7efcd550a21cda2eddfb1f965f71c0aa6c2cf44eb4c8085a9f27dbb1b49fc6391ac55f6f2eef50599642c3509b6b605a5fd6ed86659bf9c48562ab5a2eb4e9f7dfbda358655797fd07d75ae360d9ba98480e4a03350260bc18dcac294d7dc17df819e1e0fcf8bb733ace0362021a123bafc7c0fadb7e5100d5dd3508e9fccbea5a2525ca0f501545b8295605fdb8137bb192c88582fa4807cb9a6c27192316bd8e74e9634e13e4815d239b792b2aba042bd1215fe7afae4031b5e0798412aacf22aff838b03658dc070e1b5d4977af550087101ab92dc0454ff5ae9f0d0a5a8c30fd556ec605e47ea63b4fd05de6e65ccd15816b5b999334f7751ea2dbad0263aba81bd50746d3b74361808b776490a4ad07ec32b882539cb92240133adea85d0a6edec87de1c3f79fa6ec241a562d0d06569e3f097d25750541e6024997cd48abe42f0dc3156af7f60a133cb3b3d68ee3ffd5917b55fccb96809bc1e6fc5a184cd5a02bf217177551f386dbcc73c57238ae84bfeffb9a17fb8369f8328ef67f35f215f0ee02a41a343b89147496737c520a386998dfe9ab3fd7e1aa8337e19629759d414241bfe5a2559cec2349b01965d15644a52f26aaf09223584fc674739dd48ed78bc4597c1398b3416b15c9960582d9bb8b8f69f69ad8d81e18653161a14f3292e36b47f7808939cf9679278394b85c6638ad0965268336d344528d058aa188e08993eb30a719a5054b0bb30e3e707fffe475b5951d7f11a6d4be9218384b0d8e312a106b1ed2c46ac4817a2a305b23ae07cb310f4ce9679d6e37c057f5690c710182314ac6e15402d9f279206db1aeafa11187107483a5e436ec9645e74a578547c2aa18322e9f0f2a88c898729405ca0204e352261f54179f6a253cb10a21fa3ef9327b84494e0bad831deb13aaf4d437bd9d00ad9f35387160e2f25cefbac6b83214e4b06e495183d30190b98185e3b01f62c58d7c94049ed11632b7399536f98a30a5cf66906b36de36b0b3ecbe2000160d9fcdf70a33b09d94d5615854662574d70c6d1038b8908700e4814fdedf67a74aad014636633381dde755940b9217b031f67865973feccafd2d0207136603e44a895b37fc3db9a471c259eaf77e9e9980b38eda3326647a717f3cd490b7634b952816601e0960c446ff85b2037ecd3836614e73a5f7745ab0330b70bd99021450c1447664a767cbd3ad90b3cb025abc899efa298701a57ef6c1ae805db626a2cc3a1ed75465e6f5d5098e671c6d259d587bf89fab8a4adeb861058d6895494f22bcf073f8c02399ec42ddc785ffc5210bf5c97d46176a3100a6e5ae90be2d001e513d9d01db311fc1c5b64bd353a74e1be7b4d6f9b54125cafff52d8b5946a20ce7024ac0ec68542bd8fa6e40a8f65744481cbdecdfde2c158fe8a8a9b1a47579aaf4940666e2f365121f17367d5d14ebe67a0af6e43d500324e1ca3badba86ae9ab889d5070e8df6c5077db4654944850fdc1a89f57b8e463a147bb379120251becaa1e4321f210a18593d385b05fd7814bf5e863051b139deb35a618c59fe3f053286ee570388e60af31e2fe65842f2fde1d2d99532b393b0aeb99369facf999062d14f04728eea686e33a7c81081f8a3a9671966050d7ae98bac9b69edefa4f7c9b2642bac9989900e7510f4d84b8e92955bc7e9554f7e89210f6445bf9fa200420ed82dab25c43650c9709b6f93c5985c26e9502fc1be296e05a9b999b55c16e770d66d47bc8f29792bb052a498e27954ced394dca6bb94bec7831fca3230b3dc25abc6229ce518bb55933d9c2e30d2e7667f2df47492ba7425dc5931042cbb1f0d25eaccf7f8f50dc0ccd69c4c089395f95de7eabf9f4cc5922c95633b26e21f4801c52933f984533bb428ca0af31654562fbbe723df3b1126b86fba3d0b18f08fa35c111e5ca6f84530f4e023b12afb210210999bc81d905411c878060a164df5905af251c38f3253e099b06a3432ab7512d0881cf0fac150147aefc6aea009991361b2e8bb8ae0be8dd843c26f0b00d1c36cc6b6f9a18023b13b066389a1a1f395403c20f10facd267ed7ed60ccec978a2105c79a21559e561746a82f3e982f31203b739097419fb9b93f895ad130b4b990b679232c357f11869c59b2bd5ae98982d5586631e2b78cd2fb30ade18dc11c9587d0994723c83c4400e9a3cc8302b1aa897b9c01ded445bd5b889a15a3d0bcb7b7ab5f72993acfb25574dc53c7b437cba9307c1ad68f6784b2c5407e43e14e8c8fd8919fd59d71bff9ac6c71cf4b535970b74311f17fca6ac0349fc56d7305685bae51458d94c84e9cccdf4f041d5ccf67987b9e1303f93ea41e364ee824ef4de81f1e8c599284e1c5b7cf12e160d510901236db7f1cabb30b99ce55bc38f2ed515dde54d8be06d19fdef8ed79f0606e219064e1f5ff4d9103b6a4deb78aaa173e9b5eb78f7a708528c4c9f53c58ba1d252fd5a720a450d33e57f99d4a0e9dea3783437dbc57c5b9701eed02887ef9ac65ee31d30dfa0c957449f6ff5a80e8463ee377e85f0316c1b7d64bb18d589a7748d9dddbea39401ecc21c63d2e734d79152aa1c8df8f4d6153e90f947c0b8e1bb90b7217a0b6571c2da08dbfff5203ed558378cd2dffe0d37ef0a21825b6a071b3e7fa05de6972178467f71073675780154c6445db1530a57afd8257a54c516c292f6186401b76458212a51d3daeaadc3e049dde528478319a832a755ca5d1c6d1da669c1fa138df3b74e70ab3861bba9ee748c57c44ad0e50378b4014b590f9d77e755cef90918bc66ece4d372bd6f7cd14bb439e608e9dcd18897dde66cb7e8693898a1fb5c6b7a35e26d4f779b975512948fcdcfdb182726f7a0d1403200bd999ff8901f949d74c3e207440c6f9efee8e5c0b4502904bfe4469eb03494e7a0d92c3a95184420116e65daf33dce537badd8a6157dc72794059722fcd91a914025f5388ca22bae8ee4aaeb73b6aee3da0b8ef4645f5fa433b5ae39384067a879506740e4fbeb983abaa03017cda0c9ae4d677d9a747b48608f17d8f368ca96184456150ac544af71b5733ffda86efd54a54ec8ca249828de4a33bdb9b07fbaa1d7f6bd5f14c633fe63d17f682c667c8750708ab22b28a7dc0d658f5db1f1ae35b9a05e5ef68d3a61f5aff1a884485d8cd5fb590e5dc1382ed3cc722032b30e0a703f03e49d2213f74a63c0ad4bc90dee47d70867ae210f842751cc5b46983b0036665e77093e97f5c546a003657a4947e07c0b9c03d30806184a0bb8e75e34c8d4623df4f575936aba70c7e4ddd39a6c145d48ff3899300a6e423200497ba65cfc360dae9238843425d4007b09b6cf6ab4d80375b6dc2501515afaf8a2a2db1a02e6256d62ae9bcb9c1f1bf7c6be8f4f44bd32fff4f52ee9a4ad53da4843a7ccca48a78d112a035895fe44ffc72727cf0146fb3d9cbaccacdf24f959e5fc0213a8a27eef0a927a1270fb6a122e7640f7a88d299218bacbc48ef5fa1b3f952bbe01ff33685238436070ae66d8bc969fbf7e52cd4c11743caecb85ed5b609755c0c5e374621dd2cf9c1a13de0b89de50ac0732772bbf02a0722189ec5263b91ce23d8d8a0580b714081fcf838c979faa66e493f7a00d00be4d5192f602332ba834cd78c3805a23baaf93444f2eb51327095a5e5ac68028d9abaa967f952c2a01fd533b0dc051082fab7c2ff662d52446c54600df115946f213c5e0ed0c8546ddcd07570aee2654c682982ece71072d6656f60105c758f8a37fbb23f83431d7aa131d3a5502c8304fc5be6c31247dbbcdedf510d4ca7ca5319931cfeb03d5c6f2ec8a7553d6774843a8e49b4f9a71b060ca21280e440820918f908dc7f3016ac178ec047528961ba80148c2c349c2705860e5206c011b0a0738716a0929017331423a450beb3f33d3097bb12a8d59df54a9a6446392341b7af9b0767bba7ac693a19d1d13374d6002694d778a809c181f44e8b34ff9afc14564618edb12482927c0faa3eb50557143c9d00adfa008475a948c87ebeeab54c91ee02419359ad5a2b2ddee6a20be1450f9bb8ed550b6e8623fa9419e1424b3b3c75083e4aff5fcd5aecace90998589759d6c7d93aff4e195b6800ea5faa0c8fdb843d0f962ad3a4262b607dda9b906c43fee03124bba95cc19748c7452a0cb96ddf226308345433338320b3b3b8c8edf5634277e490cc43403bf448e74188a72aaa969bf0c53dfbf0ba5c048a29b2c43090a8a0f02a298b45a074f36250f8323269db582728ecdd928429cb2292da3029e20268963f103ecf2a0e81e2cc95bc709693658c5741176bb473621e257e21005475d96d2f39e092a76b1f5a31f30217721796519cd9922b8ef0d1d54e1bdd9edc98ce7628faa92860ccb5043b9f01719d2bd8206442a3a157136776d7177ec6c48cb500fe2e124149440c0680ec9532569512c392414da9d55bf5e50436dd5563c42b83a6e86220124ddaf9667f2631bdc1fc9d64148777e6427d2a406d6e5df3429e20ec74783eab7d32f9160f47cb219633baaad5243ae697bbc5877641eb00395bf41da1e11c54045bd451055546271d4be65aefb66af7d11cfbb459d2a1bb3b5c3616612de25f4e3002a28d244989516fd0e608afca730de05dca5247be7874a39f109e133c61bc56a5c9f120076d99a1e4afc80c61c1a9a90484d2ee7a5d86c8ea57ca9decd429aa8ea7d1bc51b1e31e39211c63dce7d6be62aea639b79f6192f8528139ca6c38cb5d47d64a3ee7984e46997e168dc5d465d0072224f4681e3aec6ba2b75593745d27dc46c5bee8203bae0688c47f3e56ff0c7d6dcd4c37190e57cc2a80b88895ae4cd92826a76545133d7686dd4eddbf91ad74f2c38e4ab24684e1c1c74113a5e8306db4c48dac0d1674c71c0c93df12419fca6370e1061ddab11f8cbe06027ca085780c36bfc84045733d8253fa34abfae9605d9bb3949a0f9a8c4bb39a543c4c20d6ea4c87605750a9a91b82e52a8a32644c631c2059e0316e4aa4b02627fd91f69689ad45a039466860fa87b4877c2d4f40dbff349973a0afc6df0c9d574b8172b559a1f56566701a1c87880b12f256f3b333a72b39730583df8cec7eea233a523c71881342c126b03052d4b6d08911b63f169447e313586322dfce62e728c651b857af5d9f9ff780374d78f29ff53bea1f6496a35409fc946508686d626e0bbb5791c3b2cf0c048a210ca9a6558705c608e758c074cfb55ff0fe6e3987a49d3590adc3d9cb8a4a084dc9a08627198e3476acfa1913658190a30881cd13a0ed6eaf76bd1c8d594dc3028cab4df930f73608b809540ea8193c65320bd86519fb77b5c0c587bdbf0e06774f4eae39d2d6e8b7fb846cca63527fb331cc7d227867ff7b0af49625b0b1a3a04413d1b1c67c10de50bc04158cc548ad2f68cd45789a58f57c86d7540701180626ea1e1cd96c1e3a8665ddc4621323bfa1b1bf11d6c6f56c71cbcc916812a62f94aad2236576b47a03e6ec76f74e8e1b0aa484cd8efe329832dde119372d359de6c90c58484ef7125afd6a8d9cf5d20a06934f5607250fb4969f70ce5e03389ea014a08d9bf179c87003c1ac32613fde2df0c11f09866c35ac4b6138b83d253f654c52cbcf1e1b00908409d36c220087485421156871369870e085b386a05fad0526bcb0bc0f18f875171707ee508e2ca2b6e2fd9f21fde86c34e14cf5500366d8cd480cc6db602866e62143d02997e4f3678fdbe808372d184c07c6119d06f5f8568a7461cba12908adb7d881be9610cedc7361b6002cb2a6e0d8681e56725e8b2a516aafab59252db8254f1bf71f533693d13bcb5b2174acd8d5bb9554e01dcfb3578bfd5ca51e53b7875d8883f37e938e5e50e175e457df9f1b4b15a0b88451481c7a508574d281db8f54cd04aa868fe71b10ba08e26a2aafb954b5f4845f901fcd5821de631b330483f13485a4bafcf8a4b435cfb72db088a0d56ff5080e618b3073b8318e04493e9fe59cfab327e5c2313aefbd27dd92fce290728021052daf03cac05bc7efd31a285d9da4bd4803e968a0ddd3876611614aa25d19724720191b2f6d6a94d08707f53142ae3660505d032a1f16e1e547b25efbcd70acfd61d44ab62792ad5cf206a3d17c24f88cdc171198f98b46e9d40f52003224b8b696d790c2b61a2a5c3b3e8fea9a7ed39df6371259bca4982df1819d888e75ad06910052833a96ae111ccf092528c3a944cda8b961165c84a14d7c27377c82f1ed167ebab9984a08e10c6d88585e72224b8a2e4ab163ecfba6cec9b80c9237c966e3e994ed8be2fae904818794e64ad620689d25a730b719418fb091cdb29244cb8b64965e9eefd91f7ce91a76030ebe42418eab65ffd1d66f1860db3ebe9672ad8a6f2f2fb697e86106f44663cd9a87343e590e62f9292dfef53d228ce8e8ebefb31cbfb116f9d0d59a778dd4865474eff16f445215116c5ebc72c00c60ac7efdfa8128c3aeb48024a2495036391281b465b402aab87f0a3a0ff505932b1437901a9de1b3faa7eeb8bfe13f0d15c9599184e5a5270aaa61acb729be4e7dbe24cbe8a94550a5101a058c93670fafa29134c1a4f568738fced9b41a9e62c9540b7e9fd5aa795ed422b39c63798e44a28da93ea70e5c194c9f45d1be4941711cd2fdb13a582a14f1f8e4e173526533210746d1fe14f39e0f1a915bca46b5ff78e2238cc814f14eeb00301e69517112a2c1092019a998402b7298606ac1f20c6cf85e6fc8cb397b7a1a595b3a7755d012330906edea74b34ad6c59fc1aa4c311aa78b028b2b218c6c8a867b177b1648407b9a69fde1f0e88590a995923f1307e8e0b45420d8af193c4f4b3f9abc344d72c14653308c1a37372df898d5136d9efc9822a25d3a7c8c74aabecbc10775484fd896093b19581b3d95b54f8b0d2315b1d153d3daa679cd3d127f5eb982b59f277108e96a373059c29b8551672975af4665c28d124c60a1157266fb7b4d24f4967caebea2fcca3d872a682d63fe8c45aea9a2a200852fd58105c89babd8e6a05cdf80ee11cf114a6e5feafd5273e3c2a09a7521336f45d96a6723d0085783b773a6977f43077fa75a2bee90bb883e1f46eb3b4eee58235d1b3d534106e0ea4ab711db0e8e487de9ac5d817380db4cff19b1d2fa61c8684bdc41b218e85c84c8c075009237450db07c7dffda930bfaf482377f6fc44864c91c956a8773fcb0e0102d367719aef3e2f2461287cebff2b8d12036bad83899c29556024f5fb03eb981c5c69c5adefd3f77a25d230df895388c78b310c43d80a63abf899fc72b85111e65a659fbc51f34c34821e8126285aae9ab4edcbdc31ce6454d59b938fa34ee782e145d06fac50529b24b98935bf95842247fe73bbb161e13ed2944fbf2a64e049211ce14ba2abdd80cfc71059d5f3ba2b2903a2fd024024049438feedba6616cc3c95b63ef5348b6f48afec011c5532800b7b582b0280de250341f1e70db3acc5643ee7440fbf437270408ca66fd58d7de0e635c483505bf0699bd15e370ce932cc936584132ecb5f596b185e5abdb9151ab2d6dd4d86c650659f0322a7208e203b54017586802f5ae3cda1f01c604fb554bea39bff499ed71b130d04391e36eeb043d1d530fc07d8ec781d4e6087633f5a0672edd0d1bfb940055fd7ee0ee7536515ab8da2823c6eb598ba318989cfa40c7406a2e6fc86dd21a4b8ee8937e101704215ef57c424b302adb4930a999c70c924aa325fb449511473bac8a0259da9cd6137f67a67496005ef5e98f863826cbaa0b3ec50cb68316c07ceb905f9a3607259ed4575f0a8d0c06fa7b33e7a9294981d53197b53f6ce158e011f9a96248c81e5e38347516b91c0a06c2e4df1e7b3b51a1fbdae7d58efbd01de136cba63de9cd78b560e16161dbde7fff5c0469b3720c35b4eaa28d029f1cb13de32322765e5ff23e67f5667b984db68a996b4b27ed140441b2681d168b7c092e6d3d1bfe823ae87d7126a621a3d1a3e10f2cdd1fe4f274464f21c741914e55d50c8521c4f4ca4f2a706f1ac811810a6597b30e74fb80c8f921a7b8e20772fdb273dc479ea3399b80ef872144ba781eb1b8562cbf5b1903568031c9856784af7fe97d271d6c0e690bdf10c04f6c40397466c0cf7f39781347921c32ad276144b6387553f5a9dc6bf9d1e5e9d76bda4245b4952fdb4159b77c06d043d42c6978a84faa88294e0ac12a1ef810af96a68675f9976448781be412250a72f0b5a1b08d558d6d3ac3e07c8c186426ece1a8b5f0db84f510c974e1b4b34d3e6b115b9c2480fa01537acc5731151f01882b2809a5484007a748a7eab025f8dec579bb8cec5a0204a1a9638b639c1b3be5c1fb2f14f29d74ed6bcae01670342a61ec7619a7ca8efeb6a9506c137fc3f1f9ec2e3a79682d905287be061fe7edd04a76fcb31544c09243a19694200877c660de2bdbae97148ed32254feeb05d714524e130a1b10ce1bbf25eab660ad20cbca0090599afa101b8605889c518e9d7916a6724bd9103b51f2cc2ea65a26fb2223263a813d658fde1f7615f1b1d9440268607de10d034ff28acab4b40b78724499b268ff0ba67abfa9840c0a95817f4829081114ca88598986e77a68d45bb1f1d13519c07ecfe99f3b1a2efeb811eb8686f4d0fb05e116ce958f6c4f43687f14baf53f826aabf5e673d3c0293ce3f51ddfe517972bb3d3d35158c78178a5faba7e15362dd88db40ebc6ac6ee604c774274142155f6c333a68b7a63e488bb40a1592f749ec51b5adc6a96e222b6ba338d131bd7c91c4c422b1f36470fe88c481118db7b5c0f09a8a8c557e26dad32a1e605b0449c26900f7a256dca524df79ed4cae599906db07b17c168a5255072ed53a3fb9274852cfc68fdaa71481d0cdfd2b934fac27301dec53841b9753ac5e7d7bb26e345afc0cdea50db92d13e537433d1851ef6b22ca5704e81861b885552d33e51ff2f9d1542baf9edbc86f4a4509d06f2fa2dc51c5d69570d384512cd22a20605259450a55b8c3ee7cc5a3be0f7bb4ac46f4a0401977c083c271c0c7b184141457e87de5433e2f68afd35d9a851dfeec4c98713cea471f8a1604079811651de96bbdc69bb8ff3a3d675d035bc68108f14b286250d7e698101843a1f5b677d561513f0cabadc9be3d2404124909c9fae20d7ecb0f28273c3e73e2f2b833ab430707370676c4b6ed7f8600f0bf7d95183379d556a15f9d415d0f4c02f9702078d2774c0619aedd88d0a339dee7d581dc2c3e1f98e1193e09e6ee2708fb6ebd476d27ebc5b5dfd6cf3176129e0aab62ef187babd10adedb8fa06f39d4dceba31ec22d7433a25a5e3d502077a48c22a3d973a78929483e352e1e4baf2967b29831ab47b2a6acecbb4040b729573ce838899fc356d90a16df374b30907bab81d35d960fe530cc106a96bc2c524f63fa43cc2db84d5cb8e6383a2004e284235071b934de2d3e006e935b1abf949b05c3ddf67b244d729da1c15f4fd427ab3a2870642d90b6b14e94e53581c33c3f1246336e29efa4c76ffa4270da18d30a002f0ee252e096aad3cedca0317f73d47171c06d5c7d15e05d57fec1648392131cdd27a48569e83a42dea4d9dc069245f0608de72f27a4a937145d71b19aa0b18ef7aa23de2002f97f4cc4f48be2211d629e36b76552c57b9821cf7332f46075be58c3c3fe5d98c5f0bc2edd0ac74ab2512d6b031c582a84dad10a82aea7a1f568ec4d6a3f8b4f027ac4cb3ab5c2dfbe1414acca6ed02fe3fef6b99e101962b91e720e0dc80c5a0cf49219b21858bd36dcf1d44c4587c6b7368ca8f9b52d3735e3722694b069eab30ba608283dc035572c5a1d388e881ec9b7652392b575eedfccc681110f295cd645191f2878002763248cad65c74850786a6c5a035cfd429c7f3dcb66b5df135caa3f120eb256481c321fc781fff291502e74ca9ef77dbe8b769f7bec9e44ff1e98417e56da797db50c4ab4cf310133f3bce7ee090548244b0837e509278907f9df062c5408628b4ca8b0f728764541033938be04365ea4fbb52c79bba57c39bff9fa358cff26c06910bf9ac2d43523c122fda005e4985889c8472c5ee912e9b592d88a4659b05cacf0f4d55b949ce1465485f9bb01786931654fd394759dfc580e0240360410db68f1cd6f366effe919e81b764bea12770137356d7d45e4e2975971c41a9bb219ba8d9647b564d5738c2a0dc4c7bf009a23314843364c41d1b6c263bf6530005bdc29bfac950c2c0523cd991f937520ea91feeda2b5c688434168f9385c595ce7accb7c4e3d1c7c40e17ae08147dafd8ce03a5a98969c6084ab20102d77898136cea70c18d8fb36c1fe0316dc463bb9d43686060f8cf3c689fb99014982bfba2ae806497bd358332f1f718f77ba5993408d95e0da606e182e110898a834652dbc9634bc7def2a3574ef8a41a9475d71530594f2e4d8354c1c227394db050454134ff92ed6ce21d4921bf75d34ab5204029f29a797fab08ca478c4e7b107bac6e83bf134a344974651c2bbf8986ab85ce09038e297b786d58ffc15f1a9c552081d0ae04755fb1d45580fe469091b9973366891e22eac9299968f078568c2b553fd76e34b870b2939e173fffc182cb8490aec15ef2d1512d2117f5e7e5d092889bd530c05ad55922574c4605544260d295dacad680bd3e20567d9d210e4305b50b1ffb9998eb467c1912940955ef43c61a75d3d8c7182e770112be141d02e41375952d11004641720f2a6e9e9d9544ade320e6cf3612a23f892820750ab00f1d8b94c70d9d9a6825f010c5c057495e9e8e37c9a4e5132b04775363add1bdb9fcfcf8a47a1ca310209a3b528597837e69dfb09325b30b95e2e7e29d4996f893f7204d2b8b420cf3e2bc33ce93b8951d4af08679da2a4fe2dc86cbde80a664bfbf33bd972fc4659a1393bd36af6f04d7df68d3bb4cdd47889d72e01205799a6ae7d2b10f1803351e8608a6705fe12ce63e1051b6d1f7f1a706aa58adcbc38139e88e41c43465417eafa585dd87380f14e5a0df1d3b5c9d41e75c15a96e9027257edd278c575a0f4083af23a589c38f8c0cc19aa9f2d3885e2aab0e05d98466e02f33beb821fa6eee99a705d638ea052f672924164385725d1540719f332b549f405cdb8951b2a9de53407ca61314560d3a2e070df935db2ee44b99522c2b44abbeeb458774b57ee035a0e7d74a1290c8976a35ac5f9d2b3e6c33225dddaeaacc3f01e10f346d03cf1d354a0ae634f07440e9f3d59d8a4cf809869d5472a9a2253d10a66f98d0e2c11e586a3232b71f3f2e978ccb720b11475d3cb6652c9fc8aaa91f324e5850f0ab9b1eba520dfc15c770889244288dc42658109075155b4fec82244a5d510a787f42e187a864a17b1332dbe05ff6dca7e5581805010bdcb3a81ac6db38ea8f9f5533117fb60b9b3395e424394f8fdd50c0ccf6407a75f325e3aeb30bdb2958ef3208f81118d7e90a579244f647650cf2e361724ddfea3f8105a1476a2b5ea3bfcbd60a13a35167e84a36309eba448d20ac60c3725ac37a5e3dcf16813c1f4305852e84513a55e8527553f0504e33c90132acd4e321fed137beacf5ed54f819db1ecd7e233a53916237373343c08ce9b1c0351106f7f670f7b3be84ce259e55269e86471feb110f27aeb83ddb94b3bba40fdeba8bd864ecd14aa25406344f43f4d55d421acfe37c9b2cd95f9bba3bd12bf1bd7a2e1f3b1820ac7ab717abd4b4d9a6b1ae055d231dd981ee0e371204f8e219f7be11b46dd198daaad53e9525049c54a2b52808ad450295de3f662a4ee121a53477d5058fa39aec01fce82e9d3819ec5d3b6b8f8a48f7f3971327bdac81c38ec795788430261f4ee571807bb3ab99adc87ffe4359938a5b69d639c40623dce76476459529cb474732e305df18e9020a220a8025883ad3b244e77880610877aec11c71d75e0e0d13a60a9b67902cd275c42294dab33d83038c2f6269cd09ebd5f659469709244fe90f17ed6af27d3a3195c0466b4d58d096d6e5ee0c58ac5d4bd146f7abad8eeebb60fff92f1c8d2170e54c8462001c4b0ca3485126abdacbaaa855bfc77cdee1e36a5c52baad83a545d4b4402942f606c474004df30feba5cb241d65907df842e20ba7159230019b560e0b1ec310873a76ac448463d0d7f93d41a2fa12f260ee478436927f9efdd3fe22c02067e492a21e6b41629aaaaf43042f0bbafe88937c729388fbebdb5166d04a481e0944f63d22866f2f7176a33a51304336e90984f18920560a4be7992008e6a907fbe96ad9343bf3fa5e9fc477a6c66196890b5716e45c49533cc740144a311d63b9be0b539c0f391fae304c20cca733c65f098b14d7da17ad5b23a6ed8bc0f84a8ea53ea6e99d3c2cf2e05eec759760adb22b2b5d003092d588d0f56345259c2774c3105617d7b2d096cc2235388ad54d3d3f3694422df77fcb27705272627211c492096c7cc3a968ac8be87f1a357d481da46c18f0ba66f9e2257d91c7f3065ee38ec3903e85bac9cbb54585eaba60243fe01923b0e2c6508f1d4c02a8e67ed2607089f1db59e76b0b324c5a188876da2a0bcd46a62b0751b74e788995473b07a63a429e296869e6445b642a76d9a1ff7f921249289ca6a516756ddec8532d2e8cf3591ec4d002944bf82387f62372c51e1cfa6da4d53cba29ac4a52086b7d1d43d6b47e8caad00e8a8560cda6f4465ef8c3a516719b0c7d5eb815dd9f8cdd9b8d997fa701f3b994901195ff8f3f18d6bc8704a1b572d2830a6551d4b2c1eb16f3dcb7a8585036ce4056f3815e8257c3f5b6e93449e7466e3f090317086a30007212c3ed264b9a122080f07c0c26cb36360131bf9f45df12ec242b58b2b407b0087bd713840074d6648c1217187c3aa5938c78e8266fd8ee4cd5ae625dc6efb60f80b99aa084fc4d3813ef1e911cb44cdf95f7d6782035036ed6a207fb024a3caeea98dc28a8c0c90d3f884cdbbbaf4387878fdec28fdcc981b190778b7aa6467fb8df4511d068a37024cdfc7ca3a3a430e85295b0bec074422a66e155065efb17c0f7abb015e992f1aff96c80a6800561e66e723a90beed3de63c2a297d78709fdec8fceb07a8bf78a34d10fd77e00e46ac374aae35d34e97247c9268af257d62d6d843b3f2e50b1095f8e3597852d31c6a1cf3c2892a106506e247879cf9e7c2053c623108f4b10cbb2e2210e7a24af87a2ba8b713e0701cdfaa6b0e709a64373a7b9e901b59d71defc07e32fa67f3036fcef737aea2fd8847cef453ce8b717fbf37e0e1fe3a29f400badae341fe51c733aa5500f4ea8596f7816d76d9230265f453e789967cf62b5d5122e6a215a8a221c5a6ccbba7635ba467a08878aa3c5a606bb75c5ca9940a084fac01f036e8cce77d15e5ad43dda6ef5eb35d2021ebd1c6be4233bfa7dedec0bd00b079a0b9ff854e864e32851bfe90cf13d09395bb5b72c936917ad8ef5c1521c6e95151d516aa0dd55d786883bfbaa23f4917302078c33524c2a85bbda6a8a9f72b5bcbc62d0daa66b12e914ed350abb02602b4b7ad405366addea7ccd0106a3bd164dc966714f784c04dc16ef92772123694793211b2ae252c16e20cd87a60329b0869770a88c652023187b4115f9ea622e2442f45fea1b67c86275c458b01a8c220324ffb48b842a3edf3a36ce7fdc177969d195f9019af61b1193725b5caaf6d592a1a61a3b6a975000d59a8f79080ddb1bff0fc24d463e705b31e76ad54ed8c4f700a0d81d758e7658843872c2dac729368f3db71cf0854ed501055b2200005ddcf9a0de0ad066074227d3a9413e3ebaddd4099da295218bc7403b8ef4f5f359c1b8ef71850b1a6e0437709b73a2dd1fdbbd1796d6a3844d763ed4c5b066b2f37487124001ff145e18b07c9dc7c93409dc6804a27f2b90892292b1dc71eb249e7ea278ac37fe957d019b99d8994ae0af2cf1dcebe3555c7d4e52b4695059c6715d8ab5991bd498c4d83b3ac0ebc4e0a5f80d300c51508c42663a771a290073d408c42fe04d04fe83b69f47521ce1f2371d5f642c71ec36654ddb9e55940d1db71d4adac884d3ee35faea674b1ae2ac9409582699bb624d754a6ae99a251475be3aad44e84853ad4371ea7e2fefcfbd9a35f45b5c83d267c2fb27bf012e9b157075ce840d012227ea1667dba7127567c92dc7067d2921d6f63bcba14011677cc13414c833d376c95abd2f09127d62d76ab9dccdf5470ce478b6ff5a3fac005c9cab394b8986124e2b088fc3d9018ba25421a06aeeb191f9f13fcc59d4f868a8288a624c8ba7282146bfe847982cbf92ee54fd5ce30398ba12a0db0553a10d262d2591e5badc9c144c30a3f6c0b395281052e9c38652f431b2a9ec002adc1b900c4bfb8ae296563d750438a0808ad81bb18534ab9b7040add5ff5d2ae586b6025cc63dd5ef769ea77e7e11f37a584275949c183cad8f86d8a2bdc74b525c4f91604e2101795f93f79eb534850fad103d7e0500fc20311e50a86909a5b7117c7cfa3e9d0fbcb41216124854975f8576d2cb8fa98f3be03d2b934f83905d4a5f6f7b4aa5c7fa97556b1242baba2bee5b19a6962ef91d02cdcf788200e96bd1b1b3e37bdfae530a4aa8621556969260e2c43691cf39f984540248645da9930acd63d4d772aaa342b21001377b325ec33eeaea98970e96fbf81ecb4c4624c848ea176234e9e8f6f8600d8d6a76098216049c176c6084b322d0d659653c7ca63830daa00eb449d423e3bc3278e5288110284c8e7afc5f4408e7c283f0c811b8c52757d0b7ef11459e97f52a7e72b1bebc015d0f006295d7988fcedbcb268f2d19f4826e49a50b7a0c8930ded3ca2028e6ad3ee864c96f5177c81f80c89fe6256b09683802207ec3e26bc64e849d1cd0a2461ff30c35fac0c4aeadb5441c886f18d6208eeae7f7c3896e73ce9860d6011b2eb949139e6d64650358d7fad5bc8bf00924b8212182866f58fa92fcd4ac758da8a87ee3ba10a2b23920027a60e147f9ab8105565187ded16333e69d2ce2179533657126c1d7a8d068ec47c905f5534e2a686c7003db701480791c424d6c4aa6860f6156aeb048ede59918dae733f89931da8eb6da54f79d6fcb267e1c871703d104d0792232bf63dde48cffbe687418819e22c3c1dc0344183eeee10d1c4434e4ebf5bdb1a0cff340776ff3ec9f37a4abe86561fcea02540eb0dd5d617874e6f1dad0b520f8b0270d9d948d0268359c8f779604a4d0681b3a654b048cec3f4003b22600ae2ccda7640de161a33a62a3a74d26a5987dd736637b9fff4aca35bd62b78a31c5c42b0a6eb53281d2af7dcaf2a02062bca388f5d21d7417957854bb1f49743fc9bfba937ff50a33612a46b0eefe0cc80453c8024baa89c93df52d9e26a141c7df4b3c67daf6437046729d00301935ab5f95192fe34638db2b84d5090b9fd21b04762900fd799d41567167b7184a6d24232f558a29215dcae88fa62c421b284f551e86411b2604806240ee2de732faf57e043757678ac7bbfe9b1f2ef06932cd3dfe6da71fb55ef9a649a31c9155c9bea28c28c385a73cddc241fe585c0e46d3496883d7d193e818b3a2ab79fde91483042ab9e44eafee0fd3a54031083af2a878ddac357a44ea5d7a73c075baf93739d6b9853bed02e7d58e1cdd60b81d1b15442a471da2b9cbb37ba2628d534207e91f02cfc96d386c38a616e8ab117225950d5fd9de7fa09f028a61f8262744140539fb5a357d3abab485c266fc09022ca75509a707e9b902c65fde459a23b617979d1fb8393d69a377f57869413548a0ec29408da32121e13d7d36495e7227dc7c83f3ddaa670909d1e473789ff782f81fc24e6c0581968b643bd808a38e0df9678ec78f5f7eb36c777b149da77da99c1b546e0f0a93a9646274101f646074afec0c42692f2bc7d5c30a557b74bf87b7a4d44b1881f11ec3ec630695a9a8042cfa95eff0e05b5af20afc7d9447e3f1a82321591e6cf2f01070ddbd53aa547ba72af5f56e68862d8d55f527da7040c6c27e968664fd410955ed53822c76b326eb2b058b041f74aa79944f96ca11cd41ce21897b72113a67b02c17e427d0030e74642f56ea24007c4aca1190b8048fadc30e02fe23247bb2c5b8b273068ff5d48ba4feebeb27087403c48626650ffead446fed166b3621d10d12810f67a822c2a0b34507c9274b36f049ca38ad84ecb29f0d3b28cbcead8eed04ebab19fd0df5281ebc10394911c258cdf11abc28679efa7c4cb2291e4d1ae95a8605079e703b1f9fc6bc3cfff8ad7884665f67aad0c97d792d831e355a27437e1e2cf5e0b327e682465bf9220f94a510ca8f97c91c95e7ff2424174e0ae5a35798d3c4c50bd22c92f5b9945c32386aec3308bfbbe7f636e6c42bb1dd0ab23102544c55ff026732312fcd8cd12240dd2fc39091159fe01483c820e1674288857ff50fb2d05f66faf5b6416d6f22e4c31b1e11c3f075b723a56c2fe5117c7af80205a4a1c11b2c703e30cfb74cee48331b029f47396f5ab53b265722d78172c42c654f21960abc93a5e6af9b4a64094b9e93c63e68ea58a9ce64508bf0c6cc0296094914352980bace007dd5ed8169a643667d967221567d782c3f6e6c78f5aa8675b3d416b5abb458e6493f41e4ea85f6833bf003863fe40c4fe8d0224e8a8ae146fa14c3ae8397261eb523b95a68263d04a075ce413dd75a3c0dec5bf026de82a7745bfbf8bf5358103c1823ddba4987da1c6efdab6869be385e1096f31a14479a894d12797fc180b2c47b629b8ad1fdadf0bc5aaa8e4e4cbd0aa3623967be150ad1421f55a44ba41c76cba71a3e8da4c30a9fc072a8c871e06dcfc4641561c890751832fc3cb18077028cf931db0bd77e484f4010850799292cc3326d823826b2031c1f72ec404bc82b57bec457b576037e153a65d7ce8ab0c622e674d11b198c3ad6351aa8851650081205927c8bcf6a0881fa0705f26a2710f5bfbe67ad98ceb22f973cae5b22af196962b4fca786ba84f089e8f755db6e9ed8faa155e3c47761099d44043ccce89d9724c5350b54b4d5b40901ecfe232c07e55f781b82ba107db82754cd0b5d9d3ed4bd5f3d8b6c8fcbc5940e828bba3f8bbfd06a66eb14edf33bc18f25e4174e2d718b365a75d9d0a0c573b4aa94c0669c8891cedaa29cc00f6fa9f17927ed5ee3070152757f6a6eabdce14b56d07d61544f9fbd3089faa338b7207a3a8221e25bfbab0f0d52fd28b65df5a2ab192e523ef8788cadbfeb9226e2d1131ee47ccd615a5297765b4c522b0809c1ca5b35c431466acca7bdbf1bf6af2aee2313f340e91a73d4000532009bc4ce9dc45b79137766fd508a6d23678eb7aa1eef39e06044af3051bd7f5da29241b415e4c86d8e6821c4a03abad3212a576114589317d15af79894ab12be475f035c8046b827bdcb091b87bf00d833e9b0dd8ccf8e2098327f5971cf3543ef77af8204a362e5f611b4c4c04eb1bf3d36c716101a4f1778d384df73b1e93270f6d557e5a12359033636e21d3690548782434c51296184d091a8d81c41c758b5da915c4ba265b18c5f32150251a00acf5ac2313fcbf1a2a3a72c65cf50748dc9087a8186ec665e251f68683925bfd255e2925e03123780999c8127f4d486340d1c7d19eceb505382727764e24ed65c4aafdae9250ebb2cf3aaa4ebec817662291e8325a8402c65449e6d7fcd97dad01cdd434d695ab99154bb5b193cef9797d05ae157e24d0a1b17436452ac7826c1ad977825f4b12a44a615e02815f3316899f0f95522fe3b8e3fe47ba18736aaa512723e8ca127f0d18bbd566a2fcda541bad4008edc714a453c840125feac6ea6aa64f4521597f0c2777dd0a04bfed432437c11ac90f2790feadb48f6b3d1b94b4431a7dac9d02e3bfc07d0cd94c3ae419ef594e13738d46a9ea0be9081e18f7a243977b8869b9a499298e746aabf6b67d0515a5f3fea701c522f8446a570d99bb27a73d516a3edca7be419e005809880f4c7f233ea7439ca7b5706ccfcc293ee17fb5301fe9018865cb9cc0a14699d183592e303356e2e52c6e2704c4ccc051c2c67d8efbe877521feea46d7162273b0081314fc31caf3cc0847ec2205b128fdd60181cc9d2e3e8027834cbfb9ef2cc467142140c74a41528cdbdc1f52fcc6d4b59b5bbbfcdc279a701b9f134778947805bce72ced98348c6c958226f2397ccec57cc0cb4313b14095720721491a7ddea6f05ac4ee610533c8e865e20f2231358b0a953ed314beb52acb0212b4fbc07c1a1cf315366dbdfa4e5b3d44095fafeb9e275f710abcba7a4ab5022ec073473c15ee1d3e01fa0be655b0db053243dc0b4c4979e24fb1666d34c65749bade9288a8c3d76ef4ff8f1ced9176791be50c7e6dd6c48d73f4ad5b431fa63710d027f0b9be0b585f2325d7e702d455cad31dfdd03ad005ce31f5447fe591b37b9479f8843b6ab51c57a398f9eb090638ac34e1cd3fc8b95b38ccf029f20a34e6449a179b0abc9385d13c3e4e3030666fd902fab709641bdc419974cad9841756d1d9b8e71f3197214dedbde5ce70103b4277718908c4c1049acf03bd51205e59a503f92c19b11dc3b909d88ecea7fa51564c66064cbd7ce7a2fe56f0d2babb71d9618f5854db82a23fc965b42919d372cc80d1a0f07691ddf0198252e1b030f178dfbe2464934db6dc5bca94920cc10b6d0bcb0b50450ad0e7d1b86da1f61bc7711cc7bd701a0a05c3072d6252043420fc13c7036a9aa6692df11fe7430c19ee723ac9f87e49cd98c162b56c301258c8bd4eb77095ebba19ac96cd0c16f7d4850f7d5fbacdf60cc8621afd3436fc92ba6b4dd334b6db0a10ec3d07f61bf7b86966a109fbfb63a513b6bf250b6cc76475c8f4209bb0fd84ed2b4fc0d9d33c9c8c0e5264913cd8fe195952b73089695c8ea851266c24023dfec6f94d131bb7c38865522b6ddce909299f3d5da6cabcace92e09831a48296cbfd72b7d6052d154566476557c65df8c7d367cc897ca7361af7cb1b460b05a7fa66682860b8410420805a9c525764603fa64104208a10a064b2e309e8249f59186844576c1f24e3ea020a55c9828bc2eec23ba71b17cd56fe278a07c49b8bdc06cb4d06ed184999cb6dd56b213f66f3b3def53c63c2c774918bc557f0da4b8af48bee4abb419c1f0c2cfb8e128985c315d4e8eb6884eb670d44862e0440a29d8cfce9db65939cc90a2aa1fecf3e3843dec610f7be0ffd9b10fc81be37ef05f3662e14d59d85cbbeac73a14f36194448e858d48f6d179bbfc11ca1116fcfc9933578652f9e8f9f684f3e523ec659d44194b9fe2c7fbe7ecfe54cccb478f7584ea87cf5699abaa1f5aa9b291ffecfcec1861da5efbd969eec7f65af5d1feb29177becabe5453db113f5f65aa1fcf8791fc67677bcd8f8bb457b5c97ff24619caf355568f8230afbf8e5edc9ee8cc2715186d222020bbf17b8c51150fecfbb1aa92268f908f2a1f59eb2f7fbdac4fe142f6fdc004f683b5e90a50e897104e0aa330fd1b4e6eb2c1c8b2b9614d6123eefe8ca4bb66462e08b6c5b8bd9b1b3138c786651b9aff2b33001b00cb1fc33944300dff1a969f00968180f156c5074ccb8f9597cb1d91d909407faea76f17ccd3a9de74c739427a60d02f7add9fdedf07e720c134fc31c034382709a6318108704e1015948ae3012dcb0b9111c3879614f0cfebde5f00fe3d8ca483516ffb7365a17f6a8ee7f2c378181489eddd05e5a0ee8e34b7e07529e09fd7f97b0003490461a96e4221f98be054fa4d33c574eb653abe4d794e6ebcf9f173f29c2471c1b561c8bccd2f6195b0e5c8ec7f4f664253d36ef60c4208e1b43d6dbf173bfdc2f692aeeb1c467777f74fc2a75b97c5ead6dbb84d4cb7987fbe97713c997343a03849ad4daf9c8755820df537dd2a01e0e514e0d1f002588761f9e7b34ac7858be59693e56cc7c6e510818300cc72466f09e84de92fcb6685f6eb56be7fe5fd7538c787109ce383007f225c3c4b7dc14c58956cce3969f39359f96737698a91ecc35d50e075fe305403dcf9bfd00ebccedf85f6f80f1ff6efb67716dfa2e777abeb77e7ac42e7eb38cdb695eb6273acb3fcfeac9b92a6755867b31a83c1e8908156b6156cefad40b1d95186c5c37965782e0884e32a789dffcd90dc951df90aaae0b532326464c8b223d7c2fa3f193f5200ef58dfc2cc8cbaf5deaf60fd89b4bd10a8818eac43f8e4907defc658f85a60c319f6752b46668610fe9bf6bdd48a73d402fcc79cf328e82b598b03804c03fe7bc8ae12afe0677f4d982cfd8d61d7110ee17fa9defac25eb9b26261d7db75c5b511e012c0c21f9ce3c334e0c33fc2e14b39fb1dd9f7e19cf768c06720202c0301016dee1896a394d1610a38456665d51ea3413a8b955cc5312b0284eeb8f21456c8c28773981c217c580398b5e6052e097667bb43c16b310b5ea7bd8ed07707c82f0ed24eda09ae6ccd2ea5562fe1754be016471596259a0a7d16de61de7eb164ae2229f89d541277b97867795b693b3564131492e326d1888d9284247517391ba14cef370c6b95fed54dfa75fbd5afce38692a751b1a09224decb78d6eb6242966393a6d46ddc2fce3785cbabfb967b9e5615ef061dea51bb2d07bf82a90957659f97e97959595957ff162053e842e3d585e3584cabffc4b05f25e7cbf8bcb0a91ec89f448cb3d919e69e5f7a4ace955a80afeb3bdc22e2db58d606a1715b5cc8e113a44f215ac57f690971f99b75ffdeaa06ebd947cd176c3937943c3e1c9c0bf2c64ca8c8c6c682a2e9e60d949ce343d3f66b29cb41cf69a09d286c19389011447a2af60a2dec5a3deb78de72f719a7fbbe8f4da1b81faa9fde98dd0500f0575aa489cfceda08af0a30075fa0d3335758e545aae40b28f7ffaed39b15b23518a991ce673621ddeed3b08f66e8cc53a4aaf686b34cb901a69ca949587b8ca424130292929c9c8485a232316d85c90cebea00008052c00ea161b694e12aa8209426e842466ee2e92ff3618db102549ea78b1a3d86189f63a3d442491e66bbf042a0a2f686283b02f0a2e9883650efea6fd4c8036df88d3a35ea7e76b6fc47cadfa30f9a1fde94fd5a7e7708423468076b4bac3571c05932b8076de0e13f8f07750b48f7cb53329bc61b9bf3632a6d9643186c1465de42e16e2546a4e595fa99bc228cc6866b92264d8662ee2293368e888081c758c10f62b48273fa3328a1ed8388fb89d6524e7cc32f79012813448a7620923a41da5bbda481dd4afd74a6846c886d04b932a935fa597932852f0f2845ee7cf494f343e3242327a1c0fb761998c1cf718f65bb5b7916e237132c36273d22b66cfaf870393eae602b10c86a1781d43f15a45b0fe2ca431793841e09c16b821c583194591cb40ce61761e5eaa09ebcf319b927bf9fa63e5a429dd49e9ce2b4f910285893477fc23c7d3948dba3be2c66414581be9edf41cb428831288766e17d9969887d3cf0f9fab3bdb948d3c990c52b79dd448ddbdaccafbb70db8b5f2fe2dc56b4de1cd8397f3607000df9b06b2a3300d6f383cba72b2b7911e0e2c90f18615c470833be1439487d106192a36c478b10617484f0606abe1c9a860d2f0e2050d4fc60567d172061633bc94ea755181b2d5db32c9c082b2be7212c393f147c2e2fb0ddc622d70d75138878dbef068f873f572dc91c9b459ef42c9dee630a06c1de66da428ddba5dc446fa0626506dff2cf72d95e99fdd8273b0f737d19b1b373a1c1502a987b6ee21eb6f47da99c3c8cb06e3c4d4fef4f4ed9ce889d60eea17520da4681f143931e72f81fad32fe1e2e7afacbcfc0ac7f3f2db46390b4f460b4f660b4fe64969ae54369aefe297383dea9798efe26f176dd3d49c2a01a83f19e1e2e76fcca912707ad41b717a54f561f203f52ede88f92e527f3b174c60e0c33cc3cfdc0403f392c2d4252a1da55d9ce42b2fcd2dda65a488f59ffe2f748956fb48af7ca5626aca76e555d10524dbaf39cc96ca4395855e452916d34a5292b4d0046362dab68b389e209d95ffc2f1c8da5674b7c32c6023ddb4d9f064daf064a2bc3412eab55f62fee99740bdb6c198dc89b904931fdaa37e89d3cf5f427bd45fe67854fc469c7ebe11daa3fe712aae09987f7a23662df261f2e3f4da3f5f1981aa7de42b9fc30e56f00468e7545357e8421ab822f9cabf3b0b84bb880ed3f45698be91dcd5af46f217d2ffb45bd317048bd1cc3657840c6b7a18450c2c4635cbcda314ab2a87fcf82a1ef2e3eb9035d6982783fd8f7ddcdf209de9394a04da5737e9234348885a49511b15b515edea280da3a5c5646f23998aba95d51c6688d256f491bbde4e43b1700e9319d6605e36e21746371b936cd34ca3bcf3b88c0ef32d27b99191919150669f975c7047793ba4097f534129f336d26d2459f4ead6916e0284db48927ce5548af5ef489598a98c6e16a3cf09123cd8483116fa170bb9118b84d45d4791c38c7f3909a961d0af7ef5ab5f8dd4cc6c442d3f8c296d19164b5c12ff605908c0b0bd193c64a6c04a089f9450907c48f851b62462d5cc9652d69b55d95dff771346d9b6172e52302f2e2d2ceff57bddddddb0bbbb27eac4bdf79e1bb69226332c426f7efd5eab5ea8bc514bd83698041b4298c430f3d58310bab340044932284a32285b26b5d27bfd5edf4734858518a993f491bf32a9659aa4f7114d612146ea247d14b14cfe7befca47348585903a4916fbbd7e44535808096bd87de5239ac242b1bd3b4e8134e8eea6c1ebf7dafb756b2fd88290d88064df3be527f3f29594d97bd886eef66e8fb0d9a9d0dddd33e5dd103af46e7f3ea5bddbb18e1227f4e976f7ee86eddd0edffbee7eeff9f46eef7eddcfb4046eb1e44658150edda15b41ba4377083388610edd61e6d01d4ad7bac4cfdf7359842c15254a14333871420a846a68094eb69062390afb9ce0e189dd36cdc49c6f2a2affa633b3649692a5c699c9d42d130dee2f0052ff6a9997038b1e8d7e77224cff0be77cd92d159e59692627d9d7a57fbdfd6b9c92bb9ffc74c2a0f709351fca3973400b4ddd7a4f9e153792f8eab5cc7ec124ee8253bc7ffb53bda993d72b5bcf5dda347145b0f5e72ed35bf1b75879aa31a97a83b062bdd15dbfbadbc97aff5329ad5f15d57b98777efcf83af270deac5af61bcfe6863859d46f6e628e07caa27e83fc4a2a1e6def126edb6ededd1b7cd969e3f1aae2e1d6dfadd7cb849d3fdf557e6ae1899d2f7f7b3a4e3fa32460bef6787062a795576461ab7d445710d98d8585254626b3d7ec0a5784ff9cfe27fff9b6fea413c5f1d02685f6c636399ea96914c3b2d73e93c1cdcfb44963acd71b2ed944a1bae61dccdbaf3eb2f20d44becaf7f7ab61f0705abe7f6ba1435076653e4b11f355547ece6fe1315fe5ad7c25d8cafadd3dea55e8c60d71faf9258e87aca9eabfbd34614d7f651fe9d710e6855392c8d6c1c4fec229a8ef8753740b88f673dbb821f8f4f3992be2f4b3c4f1d07efee3724058e42eeeadb477913e58ed0160b52f72d7db91b34d4fe6ddb84144fe9daf5225c7037faa50cc04ad5c59a12b2b2a43d8ce95bf2cdff22c1446773f702acf322785df127f52ec5554de7c9dbeb1329fa5aebcc6f1ccdf56287c96f92b53a5dec8d1d63429b4911b026525cb85a9a59897ed0b4eb2d9dfd3cbdffc4461fc602abdb03ed51763b5216cfd6f6832cb5230bafb8c6218c7a3d51b2a534b3181f4b00592eace1f068c7872bbd5e63edd256c8bfc21c3a29f2e13b60546f383014f3008ab2deae483bdfdba9c85bd3208cbba58e6980408254099e1188675a994bb74afacee9a8b7e1871ed1bf0b18f3a1b64a6370c5bd03ba78140ecb9dee8603720ac126bece36fd88d4ffc9b1b3af0083208361f7363ddc65b39e4c2bc29d3cbc2c91d9a90b5e145d9fd0d8be5231ee578411122db6f14d5b045aafa817d7c9f58b1ffd979296efeec4034cc0b93344cf2708060bb9b5801c31fbed69bed3b10babb6878010a4026206fa8859324236f108a3d682d4c8179cc65b9bbbb7becc1ec6e1613deab378849a7fb55871617843f3e42626c173c469fed17702acee88e31297d4c415a6c371b2952866781b8484725433dddf18ba05b3f840d350b61c354f1c83ee3a00c5656523909f6dde23095fabfe96911220209e42b7ef92d5bbeac3e543c24105923508ff8b1cf462519034199415ad9bf1dd7dbe1e79dfbb0e81ac3e8ebb8ec8e83583d2ce6ec7152dfefc9c87facbb19d0a660bcecd99ea9a594b2a5ec4ec67e75d7dd47ec958f6d9bfc2ca3fd04d3e8eadd55c54518885f4aae377107b259ecc0e2c40d52664cd7ec7a7dd81b848573e50fc1fefa28e1c266df750b48e9b5efba8b7104f39a6c1369cf9d7df29f264b1ad321d8dff75ae5b7927a5d021fabcfead5fbbe79b7f38a41316c2f669b1103a3c5c5dc99f3b7d74a74c8fc6d9bff811f3beb074a14a5bd9bdef41b3da14aa821da974aa5fa01aef4a6fa5e77b73aa45497c4ea04fc26b42a19bafb7b8cfffeed3421efcc6a13587d73a78926522c26e00f7b7cc273302f033da0223fa914fcf944463e8ca09111ec2ea87330ef4b12c2167327ea6aa69b30978eaf1e7521167e730860fbaa8f651c4c1dc7624db1fac6d7b05988645e168b65e1cfec3d0a617c445f7022adb8f156fc2f2299f7fd8e17b1f5ee7af2b74879323a4c7fd637fb47f6d71663b4418c8dc50fe87836be6d8318f61866911fbf575ffc6d8b1884188498c46c84188435f660fa3b3b3b3bacf0e1c7a0aeeff94f18e333d8de8c99f593307b2cda0cc39e1bc3b0cfb0fa24b63d96fc1c0fd6a617991cd8725977f13b72b1c61ecc5821a4c2e30ce69df65da638c7c434e0cbc1fce910c6c0235b3fd32c7b4993e0df863067591d12eb854c10f580cfafe3ccfeeccd1d8519a46c2808f402abc27c2f626e9057047caf2d3fb622911c0f10f8aa21e06b0f5f7bc9c19719d51e6ad99391174220f0b567ae87f66460c3ef16f6b267ef0f7b37906d9e1ec216ea349056e5e887d079e0b0f071d856c2631aa0549185a4a7b2bd98db4616ceb0b004edeb60fa13d11d7ff6ddbf9275f68dbda6a93cf8fc60b391204e6261891b4286edaaa4669a502794f63d2bcf46346e8825ecca37bd9886692cdff5c610d13e935b4625c7f5a036ab4d45127c51996fb1edb7ca45454545455cf464e0b71413267b97bf322c06139f61520f8360282b49554602435b8a1e4e6749fef27cba605ae6ff42af54a1774e7a65d878358cc56444cb281bc1fed5adae30832f7e62e5f989eee0afbc4e375da9fcea0e620d1b899287331f360f966c40b0ef61150aa43f9b94ad9c52ca0cbe60c2672bdab53d84827404053e691edc266a1f40f84dd44eba55d42decbd46d21d346ddb9bfeb21124ddeaa087c345f46748ba75bb83fab3bf9dc4f66798126c790a2516b214162ee190b48babaf5741ddc29e68e89a5efd3cad71772627f033f96420dc8255443fc6b2b1a8dd786d146192f8bf17eb1b82b2b293ccf78fc8d68b7d0f6bb576e427c332ec16d61f8cbb08db8bd9e0cb3b4cb1fe25edbd0a2dbcaad002907dab954a5f86279c6adbb625e1bf0d71d73493a6c2f578a67f9c7ca7945e28679c381eafdfdd738e47e9ef80647fb0af0a2c34b1ccf5d0b45aaa41de16a57a7f8ad8d21657cc1b63af98175a0ff2b66075f7b62322d0ad08c53cfd7b2e7a382c57b88b3cf15478391878b6c29372b9e865c17cb9a888a3f05fdec2b20ceb0ff35c3abeca5e4b433d172a47e55d85be4703d6cb31f669f1d600f3f795c1be3fe2c9e9e323e52be2a21f994a4b77a5e724dd75cc257f62c58acacbe991b6f4177b0ee291841b62098bbdd3cb2feff5c61091afbd89f6f0a6fd89eb41ad569d8aa4d2a954faed39f712d47b90bb5055caa01c6ebb488ad9d2452c7f6594febd694bfca56fd99e5b5c9eb9c885f2914b652b5a687392d59c83bfb9a92435672b57fe4493ae0cbb5dcd5e2e22c2f665e5f21654fa245ae5a0ee923423c118ab9ca43b958f31981d6330d9961c899287239358e681a92e9940b4ef614881f8975e6a2fc2606e2fbe664b115f30ef43fa95e7f9ccce4d9b0793ffd9ebcf07d3899cb8fb13cbef5674c7bf64be4e4717cc5ff9eb41413578384350f63d1924a6f7a087c345f8979074ebfa9b9e8178121e3e84adf647a8cb5988b125b6a25ba5e7e754524a07c549bac51cc448ecc6625ae17836232eea0e4677a7e7a4f414ce61294cc344f949776cf24189e80e880bc4bf245189442b1e0ef7fc1ee4aebe299b844abdf2a5deb982e4e25d1e528ecb5f7e3d2cc4c0f2bbbc2b5205b03200287217ea619ea5ded945eef5fef88827d32711e4e1b49e8dc0ebdcb5e3adfc9f949464a9573e48df8537aff357a1379ecebbf1566f3e937c5deaadfcd1706727b2d58bf021974dffbaa5d1f8c494af3b59ef0dfb4a5faaaf483e99f75db71e9b81fdbbd162cf7bb0113bc29a7c585335b96fcf647aa7de43be6bffb8de9efb61bdfa3f5bdae810af1f78e172d42126a7a5d237d743f2eb93bf6ff1357ae9cda2fbc7183be3b911c644ff9c20106fe889526407609f932851d8edcd98cef1982a10ece33710f83da08e1eb6ad445b1307e69d3647fc213d0ded95942d9021409eb9cfb0bdf71e184ae0ff622e0aa8757f8820d118e6fbf76d210a886fb06ddb7b129a52ccdd3d99273bbbbb333b33b37b33c19dd99999dd9dd999991dfa13bcbed7f1a637080c924929276b28e21b14e1fae08b94a12024b5d266e24ea8a9b2d2e2f2f284e7c446016e625a333404d0d91f58342e2f2ab3a5652595628101a3e5ab3b841042a8f2d76907527acc85cbc184bda5bfda6f2f8ffb94d92cd65b7ad3b794fef4e2c26db2f49196202cc5f8dcbf6e956a0bc773e36f1c107fed6a2d2d2c2b2a3305a37e2a4b92da0b97e3c7caa7b9b4b8902d2cd92657b6199045e32d86366ca8a3a8e4967d3334ec1300849e412f3d0bc7733d03e28f3dfc2ce9c499369925e141bb4c5867bba960701a546195ba195208cf5d380fc403e09fbb5a5ff3cf5d42fccc3f77ed3c8d97f9e72e1c9ff3cf5d43bc8d7fee3ac0bbfeb96bc7d7f8e7ae1c6f807fee5ac0db7fee4ac007f1cf5d3dbe00ffdc0581e7f1cf5d0e781dffdcd580e7f9e72e06bc02feb9ab02efe39fbb28f008f8e72e093c1111f807fc735706fe887feec2c01bf1cf5d17f81fffdc658147e2fd063383995ae7e2fea61ec8bfdf80d0fb5ba45984debcb37a336fd53730da6909a4257be9920dfc77eedac0f7b3dc95c4f7df70a0de4f824e5ff16f806a8031c0fc16e0af007dbe42a252803e5f4da05e3762f925c01f01fa7c0501fa7cf5807a4435a2fea8b7a7585600fba83de8f315026a11f4f98a883a4412cb7f00fa7cc563077dbed25173d0e72b9e2a047dbe3240dda1cf57b6ead0e7ab20eaed97e502f82aa7e2d0e72b1bbe72d5167dbeaa512f4f79beaaa934f4f96aa65e2e7abea25109409faf64ea0cfa7c35802a00fa7cb5aa1d7dbe02a206803e5f01a0c6d0e7ab1f2a7dbea232aa0ff5729065557551eb7d49cf572eb58585bea267c4d5fb1d6b081216c823aad2b9b91b025c1c3649f4a6083152923efa8153c0163302006011fa690bc056d2243cdd1200a13251272e9eae4f978279716961c14edbea65c4f00186ea4576ba4c0860d501110000c4fc50e5691b007fc31554510489a5615f1528887283d3f310fea70a04d67b3dc78d9846bf0bd34bcb0586f515efaccff08f51982eedfd8909903b8fc611b8bd242881f65b3449ae47b4d747fe869934ae0766ef1225ae47662f131b34e21c7fc2345ed4db585087d25d3f0cf52cda913ca93b97d23ea57d8bee20102cd25d3f8a427ff2c48fa8b4510af34484ade9fd466f1f69f432120bbd58c57c28edc699c9295b9fccb6cf306f0b7c713173c20661f070aa5bf2404e07176d2fe666498a3c8ac97ffda8df914c21bae327c24f869fb92c49b716fd49dcdcd0b9e96e6ef48ce71ba6ac4e87565bde408e674810fd8fbd23dbdd0c56b798b19e68b1aa44b4f1481662ee9664e16f26cd3e563127d12d56d22e0218f56001c8c207a5888541e04b82f0592281816eb558e8c35d42f40aea60ab23650e7949740bca678769027bd9090b9d98f719c9570dc140fcb90aa1922628e68eaad31d7c8f487b989aee9ea552588d756e1ce31d300c9341db3233f3cd0d9bae5b335230deeb7e3cdcdf4fa87ef4c7f818d587b390c20f8e767cfa7d623c1339571081688789f63f3b2fe672445652fba2f0c40b5a8af0028fbe6131687f010c4d20da917eda3806ed1f9c600ba29d48c5bc4f4ec11f03a56a66e554c9b46d5b6da2ee3a8ea5947ba49c6326c73a62110914eb1f71a0c4dab02f0a4884f09064b5c7a24a8e294a3c721e6b5252522769243a52ef8f99628cd13f56212f0bf6febc2c585f12e31b4927a5b4520735924ed241af28c9c4711f8336922c552fdb94a73e453b498a8db82b06cbb7131e0b6d29705fd14f7ab56d7fdba254a085998ffaa702d343afd7563339ce56e8ed2874156028910cb571ef9c164df188a99ae4ebc88fee58ab3ebae3a4d69f9c20c942cade1ee2a406ea582a8aee90c9ec2254f841d14e8fabb47f1613811016cc6d6a1a1684f9a91ae19d185f240541ecc4a8aad3d37f3b46784775aaaa186fc43fad4b30f911e3ff8d88f1f469f5f1d9c19128403b31feed24c5a0aad3bf9d26529d6a0278a7877ce5abad0e21e1a1c1084741a8e206591883d18e0fa3205f12c3dddddd230d12b3f970d7db3982b2b5cf7fc2bcfc92ac946e7da9a4958cb45a6b94d26b115e97fc2f51b9ca9d90b5c1e9ebf4d313d4ff879c8f5a8dfc0ead90e3894453cad5eb4eda4dcbe1f1446f042c1624c66ed555fe7008d3c75012de8a3f0b96a9d04fc841d0932759327a496638f9b661d165d4b692d1c640466c93ec79287b1b23cde1bfd11b69a96eda5fad06794e2cf627ed79e8378c967e7bdcb63d273ddebbffa944833c270c5b30a9983e50b0238393b012d4e9797b3a5dfae67ca020081883797b8809cfc5426ff57092f05a4870624f4578444bd034afdd3dc476e7e53bddbe89b0acf6d076fa9e48d4dd5077dadf1e8251cbb2e8300ebef99f62bd3f365eb64b8cfc4e8caa8af12311bf32299ec0228c43cc28866d27150fec4f7fc24c6f7a6dd2b71e7bc854958836b63d9d4e95881f1b2ba7c33ffe8f855d98dcdfd6e2b99e386185095e3bb1cc7fb24f26f7cf3dec16cc73cfd2b69468599e8bec8e87937acebacb30d130b77f543466b71e8230ba6fa7538c3165a3b4f1f4d97fdfa458ff567efa124a09cc96327e351f29d5e6746cbfa9d4d7e90d097b7aa726ffaefbda4152ce69aa37652345a15e0805f3299847fd1e6c4ac85d2c250bb1a6bdf6a67a4410ed52a5f5a5ec1aa3aa3c8acec7347ef5449b7de9753a45753c8b3d0cbda79f41fe8f8f60f6c541777b953f69b1bf391dfe4364541044bbd59e68b3baa95095abbcf6d04e74420fb9b60971d7db01fa4a8b7093aec1b7f4ce424ca6ea478cefeffe1831fa7d9888f13e4cd820a10953ecc478265e91128c00b4d3950910edb9ffd9d96ae6f6ef75fac5f6370eb55049a85441102d5681f8927e6ed2ae16ea58b11e8a4ee01756852ca23b92ee9805f39d444e9b4ad994f6db463ba8839098dea5b6a05ec735cad6c4423e6ce45e3e4a07cbc60f6a24f4b7bff2ff4e4a85f88affe9f395e99b3e5fa5bedf0a71170fe1adf8934c950a35530bc2b29926d484797b48ca395329c9b25c5d12a31af99d18afd2b4cfe8921855a5f9e8d6c98865550a4677a5bf298c2316833615bde2d7680fad6096fef6101623c6516576a7c2fca35b7ed65523c4af0a26bc6c43b11dc5f263d159a85baa8fe9ae8929fa14fcaa5812db1c7678b283a5aa642ac63f8e27f5cf71bfd5ccd2c6d1676350264ab445712fa43bfed46f6c7a597e19a55214dae67a7015e65568368789fa67538f713ca94a335143c05454e574705c9dc1427aba358539a93b7e1f3faa3892b44127ccd64b0bcb10ddb716daead5b1db477a1f918dd1639ceff4f6444b7b307b9ac2689efed9cb492cbb926e7955225a7f8ed8f674888eb65e7ba23d7d733a4e7f925155dbbf9d182fd48487847aa8a8a8879a8ab6c2f265a11d2cc44d86c8d8c31ef6607f6c1f83fee815ffa7fe886ec1d4cb16c6e74dddef5efc65bd7b23747b300bf3db6f30f408ea8309932d0c0bb9ab25fbc030eafdae63b16e5cd47b637bc85d427ac59f4a4d97724ed4bf87fae672b0e5a427c30fb9302f27f9c06b91804df05a1837f13a3d30d7e175fc445ec809487cecb655b96d575efeb665f9f77254feb9fccacbb3c47ae2244a763c9c673945afa7e8b33097f170fb04b79d7875b84f0f4d1061540f41f6d1ad23b64a33e3e618a70466b1ca4abae3e7aa0d8b9374abd4ad97894b6f022f70a462de0e3a02c42ce9cd909becab020aa31e8a3d64f93b48724f615b48c8c988e588e28faa0438d85ecc6d2255f6a5ffd961eacfffe3b9fa30c9ea0ff9a5eaa3ca7ee57f76e4fba8b24ae407ff449d7ec8ac3e3ef355bcfa30f9c1f2b2fa30b952fe1220599990efff6359eacf4e6592fdea0d2bd4a90f5f5196affa278a763b5df9c857fd35d362be1dc7a20d478076b4977f9fd1cf8ea43f3ba62fd1d2676fa243b8cd80e46bd5c74788affa91a822f0553f1105bc9d57c0dbd180e44b6a9b71127e7141a524afd24bca36a3a537d1ac2ac1d6f41c1dc2441c911ffca5eae353fa5265a1225c79288bc3dc91fd3a2ed996d8c4f36c1ea8780159ac5e46b2fdaf899cb1ec8a2dbb91a64f7d6b26fae49b5ebec9c866d8239abecabe44b7a63f3b4d7f76de94ee32695908f3edbcafb28f43f33ecb575954c254fde897df2f6b432aa619987071c78588c02531e9821296f00202dac1dcabe001d18a7d52b84113e820613006375cb16d9e7984de9c35d61d193233fbbb3b8c1e2364676777767676e7c7ef718905db56335de52b6b2c162b12d9d84d58ce837d3c07fb9eddf0de73142d93c3642c2c11d827b091310cc881802a14a0e8402ee595ae95e1c944284f460af33a143957f1df53a9f9dca138b6b9698a8b248b5d2d3ec6833d19e8d5554cddf903c177289ce31fdfcdf070cef05adbc777353c97e9230a4686cd1c4af6fc75d93b2d65afd1ec853b6682ddf2778e79dd6bbd16c6b219cdb01d2fc75bcc3d12d9f7032ce9617b313726b18d8726f6b5c13e27779082559287237928f25ea66f61f96da585a5de9e16967f1c029e5d61795fe1603e122d150a4bfd153955aa0fcbcff558fe8c6e1a650cc3fed9c76812da6f3f56ab1fd028d434c8f5d034ce2484ff59a9711d92d50b9ffc077963cadab3bae38f2fb53bc3da587e2332def6e65916a5f7d27be9fd316e19a1982622b0e5a0c5cb7938fed833502775924be933c9c585332acc8ec3c3516226714e3b1516c3be974cffedafbf2cf6db1021f63d19c9f528bd7f29cbe480fd6c3ca45060311fdc085bc81db4c1d6c196af5f88c4d877d18ccf581206b18b0565447aa6b498a6d54bf9d1e8acf45b4635932923fa79dd69350a1636fbcebe7b89fc96359bc2bc9e64b19ff270dc0e36ab8d35c7a33f630c7b2319d0f6856bb247448ee74677f06fb8a73bc95c7f7457aa6fb5e3ade073e52aa43b68c5bc3745440cc1e3e5c4ec78381169a626fc6e068bcaf705cb3fe593c260b1382206c21fefa8051633738c3162285882bd4ef7738c5965a6c1f4efbf733a7103140b1f17a798fc1dabdb9b0021843d6d73f00f797b08030b31ab3073916787a7c5838fdbb83783dfd1c34288bb4c0f3569c5cd0dfbb8df366ee34cd5c7f692dc853d777f2ab3bb7e4116829d3dd95ecc954434ff389e27dd450f92b234afb5995cff1e86039d3218343ea1910aaf836fa2110a1c9700857bbdf10a8f52b0f00d408089d96822d459604d30a1cea2a140a9791a1a9a4a33234d8cef4948ac9b562a833233633363f337ad1a42a4e674215a42aca7a9a1a9392f440d7ab1210bdfc606bd390f391e9c3700cdf91e68713815f844d6477dd4add8466478521b8bc27a58f33735f377d2b02a16258bee600cd6d3d42be7ccd7d49bc2b26817efb41e17cf302f7694f42f22abd2d4998a14c587c78e9e7b534687f92ffee22f0ff1e0f1e167503827d638c434e0fced9f9bfe3957a3129e0c7c19efeeeede8279e3118e7f1ccf8ed7e98d391d35de634665915ec18f540209614dba258fc422ddc52a81a07c4533cc2b812c94432f583ff35228723c33286ec7143289548261d1d8d1c3a9e1f1377580bff3afb41ca78469c057791b8a35a16c3328ae84e5579ec7ca1f60e5876079254fe8c940a0880506a50c93e6675855cee0f81a94391e9cf838eff40a8911098b73e399e321e2b79a19b32cba8336ef8f61d11dcc389e9c0c2943c271c375034786949341c9b2c89072b29c9ccd959393831df90a3e4d8d9a1a35d595f3387272727272728ac8c9292207078e1ccec929825e1f16c7bbe81562717c06a55ba8879f6571a3d24c227e858895b8e180bf83ca26ddc12439c4a2c1f11b0e2a856aa4906ca2d31b8b4a7e2d697028db88619174e4ae0cca10f54aee00f54e138f7a53dbcb26ddda519580363ec4f1f0e5100e658b83e671e07853b7588fe327c783c3298dab401d3156158f9a9affb11b8bbe99d7e99999993833f3cfde29355ff319942c8b6ecd3cfc0cc95d6f474ab7689e6b29f6c629865cca1c350edd1804846e09750bc9b21ebe4724ddbad0483cd2ad9b871f9d78add6c38f27e0568d870ff1f05a360f1f4ee11c09c434eef070e4099e0c7c1b2e50bc0efe75dbf28327f3d212c434e0bb4cc134e0bf7c26c4c39750bc565cc2eba08b87ff5cbc8d18645fbc78f837b4453137bc0e7e0d8aa5813bf8361423c3ebe0cb13a8540f3f0e754b888a69f13a987a180bf33268c89011830031a08c0f10069cf1cfe6b1233880172f5ca45cb810402a05b3828179e95e5e5c80707169d95a5a5802c0c2b202809515151715951933e10f28d4c9c5e9c4558e33994c163e197fba6da553a9a4bd06fd6348f822cbb01286452d460b3908c9f070dcb1313c9c7e32fedd6278383c05bef436d93c768461f1706cb21a1d8bee603c823261125277318a5900d65f8864e1c39710180404049340773971f2f19aa25b40800f857ca85b54b46bbe0743c2800105e825f10bd3c1bc8e64fd6b584f5405927f10fe364a43bca08df7997a778a08e2dd003f738578fb33f5ea1461e3bd0e116281c4a7f9f833345fe3bdaa58ef3f43ef54b1bee6afb433ffdaa562d51c3f9635f31bcb8645553c585ff33a585f63c3aab0bbe8acaf416fcde7fc0184781b04b0eacc73384f43f306f0b7e11fc46fd174f337cf5c0faf2a9bf7aff999a7a12a9b673d4d0d954dcdf1636d9ef5351f7fb369d950150f9baff13a6cbe46cbe66b7c0d9b0abbabf9d75d4dbd42acff1562696afe064b88d7691a7ae3dfd44c0e93f5fedc43ae8710cfaa4084789b0ac4004ff335b4075a9a777a63ed8156880a0df039efdc10384ff3cdf130407d3bb5c76d10d7569ddae3d64611368a08a25eb636de6dd0cb040f9aa799f1991a673dcdcfd8f08f4e33f3ac9a7aa3cff0e8178ea7a1a9b7c7a1473162218eede9c0799b6a83f336368f63e69dd27ca490ebe14f53611473a6c63f713cfc6d5ec76fbccfd099871c0f0e56bd3f961569bb4e4f53f3af5dd9d758d5a857d27cfc137dbd8aab9a7a9d86de9eb635fec6478e875595603b5381e0789b6f6e089cb779e678e0789b1acafa48697e865e2176e671d0fb63717c0d0d0dcdccb3eaeb6ee66bde84e3676ad09eb636bfb109070532f33635b4c647caa2a15788a5f9ad8655c362559aaf51a56986da3c8e99b799a16d69e8ed81d6e60bf08fcb3143553b9ea579b63f56c523fecceb883f43137fe6672aacc1512f13d6e6733e872d0e9b8ae371509c02d0ebc3e6fc0d7a85d81cf84449e537954d09b6382f391e2e16e773a82325750ba75eb6380f4d9635f3fe12e76b7eaba18e448689f3fe355f532f26c581d434c753e39c0e8fd21d7c9c67d1e7331f67aa6ac667aaa93bc7a6740b3eb6c594eee06fd85174c9f1f8cbe831468f2c3a43593635bc46cbe6c62b06c5c663523029473894ad8d1becc85dd088afe0b7ea95734641ea56cdc3f7a41a5ff3b05b365ff3b25b335ff3a66ed17ccd6b1c4f4d8923e2c77aed797bf8b19b53158f1ad6d7fc8fade11b8d0752f626616bd8501a2aa9caff71f123eba1919919fa2c7333f57537f34e6de835d999df66667e63d30cbdfcb23333f5f66496e6fdad4d8d7f2dd313a6170d0d3519611ab15555fed0c6af5155fed2d2bc4edb54955b22102ae9564d9d023ed11c246559f165213462214dbdf0888540f64af87e3486e9c40d43f0e3936ec178f8f18a270527bc871f8738078947232ae1e1472abc96ebe14728705cc26b6dadbfa9f9fec62758f85249b7203f7c189b890d96df45b5b0fc128a56bd6fcaab46bd6f0e4136f5be37c41fd4d4fbd610a7a0a9f7a9e10433f53e33587ef812885f920d2c7c3732df57d05f12be07c9f7397d13d357f01dc85d4ec8a7e34984ba45c514de443a712bfcc9e9b39fa7bfac3f3d228fb48dba83cfa27d34253567cf50d313ddcd3ccdd350d30a66a87fa42cfaec0cabde202f0b4bf3ac8ff159bfcdc43833f33a1d69fc6768fe7133f16968a8f66466c6e3633d4d95ddb1549dc594da53babb181e2c7c02d08bddc1c297a117b383853f835e1903a0378600e885b1a257d5d1fb02087a5d04805e1800d0fbf203bd2c955e154a2feae9e564c4a0d7041f06bdd08985afa244e00b7a37173445af0f17bec029277be11417880dc14228f6c623ec8848666f1cb2f01b8a947342547dd23c6512113590bb9c30f23b27232323a7f791df040b3971e2243e4d30145fc1ef57270142bbb0a356c2d52b9b98ea9d5458f856103b6a427ef642a52a61f65a9530ab4ed01d1fac32b9d8918592c8be1f7e82883f1d3d908596b3bbbbbbbbbbbbbbbbbb3bf60ce66559c8720923851146182b8c304618238cb0c208238c30c218e31762859e04e9ee0120b05eb3604256cb60c288bd4b1f26ef2184f0d1ef0e08064ad9616a61e11a2c74f8483c9cc73aea8a58723e24f89dbb58bef287497c0165215115c6601fc703f58a4cd85e4c3c9acddf00ae0a1b20e11bf00012cdfe7e334cc05d86f9fe5934cc576383ed9a03c8aa7041117b5bde3f9b2a9a4032df3ec7e05fac4af8708a0128e79986ff0f312b37f6c50bcbcbe9988613e034c3f48f85b2b48ff11d047838383338e78669f86f312ad5b7b8d941c4cd0de9d847aec7d4c2cac1fa4fd4e9be239793ad40da870d3bce308127b3857f56c4caeac640b067ec31c62a64b16c641167f18b6147b7de8efb969da910a7e03788457e8348855814a7e02f377e5584067e022fddd5f22c2acf0153e965ccafcc93ea9fbb66bc8b7fee12c0c3b8fc735700fe877feeb279facf5d342fe39fbb58efc33f7711e007f001a9e3a8c44c56a54d0d19a29901000000011314000030100c074482d178301e0ae3f00314000e90a650765a1b88490e5308214388210408000000880088c8481b00927527304b1865858fbcce75876da5bac4ffbc8065643a088d235e237d6d90527c942e602e31a5c63a839d6f7777ac423fd15c3219c89e0a5e8e49890323eba386ea4be7511466ade2ee507932d21899f73c112e00a519a00d3052e3c9be55ab3a7c5781f1991bfcc9445383c6371798537c662e372c6559cb9b82f3f516a92f2fa9a12181f28f487907e90d84b61683f8f58ccfcff4e50ce0c1a8884ae526ab21f7d2605623f3d4a005c8a42938f8ca97f4ce6ae0ecb568834d6fc58a459ce9ff3686b2cb08aa474958a645d22b251911036fada4493c85349a50035d9c613f3f28a13e8bd5a24752896222636894db934a14e5d6af326e46b90caacb85e1e0a8af170f9ea11943b6961cd92d1fb5972bbc5ff78ac303e57983856bf3dd8ac8fc30e9996d46d196b9f6f0af484b8b565b81af03e664e4a360a83746b97d51306883b927280f7fc62ab32e1f967892a972f8c2c06c6ef80dc7cfdc7a98b6f265d7314799d560c66a89e698c6bb65e35e2e4d2e61a80dbf6d039cf507ca887ece334d6ae281b0a98c5950f45116f3791cc0a4c457c51576af800a0b742dad1d868507ed2fa0a0fdf03ab591bfa9af84dcfd9052db74d7eb17a8dc6f9f524df2dec7baf5d1bc2143d9050ea637464ebcfcd1b93dee15d39e96526298d7cce010d08b13d1001de93254c422034add5b549252062d5e71fffab4937fe49bfb1d29df20f7e9cbd3ee701e473cff17a38a539530e756b282131f5295fc2617eb1f4a3e3c166ecdfc61e03f0b042dc1e50b3899aa24678843fd1bd35c1dea6dd865aa71778eb3ae2698e298d2797c6fd33ad985ebaf561215786d76568ff507e2872f87e69eef66a41ceb9a8f8ae4e7dcaaee206ee4a7357d1d4d0cd98df4e3c8950ac40e780c3d8e3214741fea45e0bc41ea9fee4a89503cfa9db6e9e963f5b06ab6e88288ea2a9d0e5c33028ed352456c63b037406f3b4888620d818a81a89cfbe466fef4846f4cc51e8c14e25c6b7a20d9254a69bb87a4207a3253f1abbb4b8bbe26c9601dc42244991d7049393d8c299348ba4597ac8f681173d86e6f1b500fb8808ebdad33499ccc1cec49c5da2becafb789147999668335c351f8c35a02a56af140a750afa89d62e43c1f40729d254eb63a10a694adc03d94c44f283fda38960d1b58140446d33f6341bd1f44f849241fc26b586f8f056e3b5bcd39d01345e8318e0103fd0ea03a9dd818147410f587c53b1d64e322f5cca8f2e1a18aa2d4438b12b74f37c16af8db03b030a22c5a67bb30994045c3f00053f45b6910be45c36aecbee8a053ec33dfd15f1d03533278a3848da48d34f6b5e6808a1e2a16b501fbc6cfb22284caa339a5c4ec9477ebb31afd2d0e6230a1d57e8ae8f042815601e3cce34b6ab44127887b8b3ffca7013fd1718234d537d3e0bda9e2a677d498a4e9e91fd61f9b8fabda297be75067139feeb2a056ace3367c42d2a9af19a3d69ab3fc407ea4936427b7c582d0d728949ea4b06e53d43fd3865bec6ab52923967fb5ecef6f4d5d416f8cf588420f3991f56e731f23b64f066e322cacd583c2b0552dac9378a32fe38c2e72146b2744ac510f0588eecab5c76767634860c5407d3157807aac35ee4a82076109c4b1237a84212b6385229d5b58b97f4c30cfb200a480aed21baeda8858e59469f010714f26cc248f43b0fe6545338c7feb6ac0740d94e582dcf383139da2e55b09e2dc47901980dd5eaab6df16129e20e9b3f9b609d21346facbc60221c30bc1cc208e9779bbf8a0fc92196406b20065086f9412253040b66f3caa2600ecb8b951b6a411bfd9f0ce83938ad2a8b8db2c76759edb99d4bd5e6b530380da3335e0832a440b6e7a8206d12245c0934c1866c1c92b29097c4be0d75cc80785d967dd015bfb8a7b8bd38057230627d1bb656815e7578b6ad69cfc50c5b026c9ca2a336596fbed9de3cdfd121ab984c491b12126cf11d57ddf92a9fabc557bf0d758ca322b99dafe72e3dcde6cdce156e478e8f48947c8aba7946bdf6cdbe913bb6534092b76738993c98c8b1b02b4771e5e7ecfbd28905018e042d6431eca9bcec150fbedcc8c2125170e1f27818d6ee1f5785a4c3d844279c5e62775acc65882012385bdc631b63eb7d563287fb7aa0adfaa1f6175aecda41b51a231048065e322cf15130c0008ccf50dc83457675ad41ad0366914df1e65c257417c67a03b88a9653a46565dea98a036cdb9dcb1bd609a7375e2327c6ec33f4229d987daad92b82322cefc308f9af0e97f11f423b4eab3c909a4f2afb6c33e0c76a6d67c123ca27008077540c43fa52a1357c9e43fd3d5abca4c70f57bb80b3e2a860389fcd1a623b021084b04b76cf281355d98f68c35948073c1bed7167cfa4a2984ef3a8580506ec2a4df7f416638baa0589d9aa1c1a41a284f0796aef923b45a8eebf2388278d05169508df458fef378908cb9274a648149c10c8f4651a9c22fffe9870a411f3141858e47ac740177886e1d03dbbaa9ed9a8bba3b0a2ac4e17373a328c7924a5d99cf5245896ff7ba66b450f9fe5da013713af5b0fb65ba37cf652b1209395ce12c49c6d5371b274a68e7ff9dd11c664003a7834adad7bf781cd3cb081899e8c38ac2ce65615818a249d430815eb16f1840154ac2938d6a4718a08e3133468d239ec4e1dd14fd2427b63322e81b0b55c37f87c34da010ec4f2a04189e1e62fa560994ce939a9218fc71c701316a80a6924c6ba1af341818ccf25a77627b171e307aa4dd01f6fc8ee675f509975db1c84bd894639e0749d1af24c5cd1c191f09b0a08aa8ac542972d413322002f5896cbbeac1e18a1f4e1c0b46805f90dc897a26bef2c92ed2d85288f99e34608ee07a22983a47328c424069d5a74e6bd14fe62dd12620c0f264cfd0a1f5d70d6610ac05b47587dbd3512000f10fef626ee83f69292c8f0e9ef41a8a0058e47821608c07669a0dfa5ce0266e577dc024f4d7355a53b3805b2bb6cff91ebf3759a532a56aeadd0b70e6080b61f9ad210ad6fbbf3c9e83216022571062c1638ad336c8d0a45e3e85fa136ea6b2b0a7b5d4b7226cb9bb724b2f24669cde9759899d80eae277b236f2d1d576410111f8cf5a6233568032f9e7d5a11a023b4d693d2963db2719b14a17b12c8d7666d049006814d03e05a8e97f3b4678cfc5d37050e1824627b6fc6f64bca030696aec2304db15605202fcd7e3828231fe77d21fc93cee0e2d5433dcccfd1973e31048b4defea5520b9c64fca423610740bde9f9123752d00ea37b7bb02480eba25e651be12eaa2fa327cda86378dba43a638824564d1cc09312c027b037b8c4980fea9d5b47a7e2d27dd53bb3439d7be76be046ccac660418c16fbfdbcce2ece93f8eacbef445cc9e1a9a810e53ffa7a6db26322848b708980c58b5eb7494227d4ae9aef16f8daa9412a0f06fbd76d2ead4db861358e84e6414f56b82690943923d02f65c8d1203bbc7714bb192ad246021701d26cf478aa20365ca628b1eb7787fb92a22f64ac51a9b2a8f692d36a8a9e3ad4472bc06a8d6ff494166df2a5a7dce686ba8250454af2653fc6bf7d56dc33771db80ff06346f858119369a5c4dbffeb0f6291167a713d1ed9388f318c700c0f1c128f613dd7e60a92879c8aa010e2ee62cfff1f412950aabad63f2b4b1a6f1c8287540fdaa8180f8cd242d5e3d93bdf3fcddeb71c88924f9beb94440e0607016376a1d70b746329ab54eccf80faee23bbba6d63922bfb6b50ed2f813947349bab6dc7ba51bcef1192424241e9c09e0c48354403c0ecf402621f1602c0431d77d4499bfddcf04b7d275cefc0c90950c02c358801c9adc071d0be064696c6afde9909b389e8a482e2a1897d02aa96bef22f8b18ef53a47b88862617c18ba27f1ceb25e2d93b3ea2078947a71c6d486912e402bf2c6d64d7b99dc2c171ec8703490dcdbc9e9b94fc0540f04713a75f1b73473a37345b9ea510890841c8332a3545a089e0c37c85a86d6599bf9fb1e2d5422e48251d1fbddd4881c120f52381563df15d7c466af851933943111b48dade62b68341286b52f6714318dad9e04f3d7196a3ed4d683cf011a3c3296cf78e003ac9a4d312d8c8a9a95acc0b56b0543818a97cc13ac980dd54782c41b58fc90e022ba80e5860e9c8927ac7957b251f6073eccd5cf23b249b4fc44ff0b2900216a2e7d813d6312ee61ecb8eb10cb9b399b3f840ec702ec84844394ecb050f33473d7f93e2231ba08031cb3105676c641d4121532baaed314fcd805f9bc20b9c57e4a518499e4939e9ad7e41474e6ab957a6429338349776b132b40c53aa1e7578f5b435f2a80ced4c3a0daeb63844b24e9a32ca7bbe6c5d22d44fb9f039bb97b44e9fe535e7ffb50815cba25b7c9f20572fd27952145f233ba169fc73ff5488071974c898e01f46d679a93979a0f750fd5c441042f68b8b5f4fa309ff4d18339f724677a1e16f902f8814030e02864b9d496931dc5bd12845e008b5e6f586d6dc8a34cd37a211b19e093315f85d3a499ac7b160bf7cef400f0a793e14367922f80b98ad1173b0053832a0b45ec2c38bd92eb43bec073400b2e3df1690114e4ee2a835678c953773d39904512882a27f197169c178fe8861ffdce2bb4d27aab8170f3941d01bf17af2a3b323041fa8bd1f8ab5b221387dacf4367ee975a99dc986fc05847eadd2b0326f5aa85ae59663cee4ff9447e64ae47413da1a4b7c22404eedf050a57b231449de310896b0cdf620471626ed0d8414fd6b6aec1750e190115444a47d825e6a81744c76a07735ed39e58c51f4cd32b58e62450741b12610c2af42623076fca93591f70e0d6e206f1a74a98958b314787b62fe2828ed3eb9f587a036d006c5b5e078a8b8dee685d86c4a914610cb62c115373f23de59e62849d73f28845c1653cfcc4e69820661f4544010ecd5cca3569277ab3c9f7828e298b145408cd211e60c6352dca5ab83f2ca510431fa8118cb1a36cad3e6043338b298905a85b8b8260c1e90f142a240848f1c32ef35e9b02716d2e3fe1f2c58fcd9e877c8cc56622324c8301f5af506f0fbec641093b505da9e8d0f764e91b74b586003569ddd91c2463fac48f39db68f1d64d108a39ca44dcc3eeaa2497993b8937911f272e3bd7cd6a43a36178d08bcd138c11e0c08d71698c80a857d0dd1f04cd290fe1affc12b935f4e00dd8bab63fbc5388c91ccdcbe362878f9a5e5e93996722e4ba7bdffca57d01d029e73f6269886c7f415104d01dca354a02d4c2edb1b70ac6ec9df7f5ff2e3bfadd5b1e9d8dedf584bdd0bcb9273ca4bd0cb945847ed5650e64047be374415508ce74ab4e7f9d96867dc49a2480932292b0971ce0a09d3f9e8d2bb258c1f334e4aa2c09471603301affc97b7f868da271ea0d3d7bb6991d3e4518dcbaf755d0481a4456a5ef198aa9f662c65abe705af0d3adbc59271d715c16cedc94ff7a8a29e332bead033daee4700e519ff87b754a0a9592149d04b29ddfd5be0d4eed94485312d796ed9042a014030a25052b2bb882dd4785caacfb03b57251b4250786d774e5d4e535af92f2eec2bcea857d39b5f7a389a9d7cbc28d6f44d2607d15a5b16122890406f720200d46b83decfd4022e34454ac5668b1c89c1f082587ce8ea1a53242d103f8a965b8d0ed32628c3b7633a51b7c2f26e6ff5c0a867e145c7ff622e42db4daf89b9d3c3a8bbafa5a5ac97efea83efb78e211b1e75fd7427596f408802c448f5e890d49386ca76375bd81bda8ffb7a34fa0769d334bf27dab3e0e9ce5e91fee3bef5f5a1d91601f09af9589d93db4c26feb78d5e42899afa449a0e01ea6024e90900d3f0e659f9ebc597eef50649fe5f8e91daaae02e9049135081d9e61c7e54f8164daaad3cc5e7682cee68283a561e1017ffd09fba765a731e1f286fb2eb169f6ce03fc8e3e4b5a15220ddfcb241c38972c20783a51b391a3688eb2d37e6c6e98bbe2f779a2ca03f8f812446b9b0f04daa8be7a4e2562e7731c1f889c1ec39455351f62627df2f1838776861c7f9c249b86bf07a25e245b187773f14ace07acd96a210b21353ca74cb9631a75c86b5cd5a00351bf7a4680543b7ba003012e8a0999c01c081c540a6197391044440b2bde261055522ba55de9c981b858af34ae511c08c960edb14e7004943680284617a0e3c2d0fcef59d946b59eeb77948828e7df52be49347069cf5628d064a8a93f5c326d4fc5f5be965fa11d4aebbf2fee14e368625810ff78612bc13e1cb4f85d8c1b6383e1fa4c3ac545b6c46142cd61e39c29f7b037db1c7da182482153702549cad4351448239d502937572ca5919e02f93a3db7a3308dd5e8070affaa32ae079e6484c2a8e2078b09805025e30958b69527fad7198a67bcc7d55e42b155980e6e6f5a71952c99bbfdc014c19e0907e73809afd8b7b394158e58e71587dab0f3358fab767b28c364fa2f06c4b8b8bb86ae175a5c18b92907193b0219ec4f545e72bbabed2e2446a8c069424f60c5671c6919e112d76fe9738d74eaf7bf9054ecd0f3ecb3e018f2933c16bd8344e0188da46c7f2582e0a18618bb171e42240746fcbc06f8990f45c0dfe7e18fe2907f48fa1b54113fbf65a1d76dc3cb9278f6227b655f665fb448628de4bbe94777050746ae92813d213371d092ce250413b191f2b4f191124dc7a6ccb2c1c36aca685d97cfb9f7ee5d4ec555203eaf295a29a74d754150f65cd08d09ed9c53a67714ae9c3d880aa47963198129dbd310e88391c0252932394a27006904dff0e3ba207d75a0afca53ebfe689e66b2ccd665e122a9184518bbae55d854190c3993fc28fec2d2349723f96cdba7f1da94481686325b14d10c9f9e0512224e50abaefd9e0a7ebf617d37d3a538e5d313b857436710a2253c83ea596f0c40f1ac5d44ef556eed739249705ebe502611b91d52f5683a22af2cf358f364aa49f88eb38a8ead732e7b9bb98c90107fd4258c6c5cdf037c16389b811573d74ef37f87419aa3a00ac6e974981b617f4f8f7f0380fd8a4e71af11b6d415dcacd0a71b5ace99c9b30581d010fe50e543d1f579720ab10ba7796475a8702a0520cf2994db33b09ac22b3e542875bcea3077f6bf5062b63a7310e042ada1ac51c287fe4c1965e7c683e5b0e70d3f73dbc1b2d0cd871c041f14cb447533dc05f53c84be48d5b5747f68704917997992c576b78a033171c86967533dcf4ee70f6d3491a825193f80c4f5994a85d7999742134d8ce703ca533c3509d4e565b9c90551e36de09372067abf18887ef48cbb6de4ad4f3ba37cd8632f7872b647c3d40f0243a84bd5d4546f45da29ce20d20dbd9bd9f5a0760d7939968a839f943ef08ca4df336625a58e28357a0a88494241a8c76c4c76e34e5037a6917723fc6f61e163d42243d3b1f568dca8c032749f7b4634379ae64cc9cf3bd1e9e7f8d854f1747b1fcb0fef50c25c8b2ecf2ad7b382b50a5141a3c3e3e5843c4d7c8e4c7d9d970152483aba43e743884c1994ccb946070ad3ba40a66c2be31ab0400dcb342bb7cfa108f57290f407a3332675f205ad8add82de0213ab3f78c3a548ab63d0bdc8a64ea8d9b5e47ef012fbfc68d17cadbfc51ff034dc92834256d0e9ef6886ac4e1d7456a91c78a4e89f73b3fbe8537f0ba2d04af2981c2481384f80228501eb22443ea8b33f747d91e43a93be7f5bfe9ae083b8d68a56ea5fb314fe57ff318827f5a7a973e75fbd923ffdfd32e9efa4b559f2ba20f1385bf7983bcef57e187385013e2b211c868e59e24e9e76c9e1f03e72bac8f12015e8c2e686c23553b3341d6db39dc49a9e929b519fd1cb073d9bf16efc2e9d098f19b7d7fb57ed7365ff50421d7f27734bedfd547730d10fba80a0c1b5319c6668c9cbd06b8ae13aa0a1a2ba99a1bb0a93a174650e039c5fce50c6a4cbe7861063916a283e40eca6aea17d7503acbf6c280bb7a1740b77b7d26e68e559fdd493c206ac6983b1f41788750c307126ba36da689faf85b26340fbfc52c543a10872e70e559a63018480494861e1e9937eea821aabee7ceb941ff80eda2693a92b548dbe0574eb96055456c46962b18fe67281f6d8b4bbc81ef0f7ad86e15d08342d2911974670df577faecbd7e40f92655bd0bf3a4d09cfcfa789d438ddc3fda635b15a89f0805129096cc8c4fedf01b816bfae43a28cf9a8a67046ba6aae84622cc507b8a543658cd17847d05784e4ddc95f0f03c007b8989335c24c6657640302e3e74ffee98a424af93fa4fb881f0c65cc871aa332ef863fda4274ec95303b50e2dc8dccbb2b69e59461ff6f8c6eb724a6d9bf74dbb990a82a5d72f0603f5bba348c3f447af83275aea985e74c9320212d176a828b4e632c0877abf5657cd58292179e411d19be403f249be00fc6f04d9eb1206320e643b5e69fece37f1f42d1f230f048ce711a63096508e5c0f0277985da38df35209d76abe39ae9ddca70e2f0526bd878f5f45fbf5584560a44804bbdaabe691db3ab7242658ba46ab5b9f17927f2124305922f2aa604dc58f02825fd0f16f1aa0a743f21393d79dc898097142a82d504685337aca05c47a7ed09796c803066c5cb64d0acb8c80c373cb7ae69da49ce7cf41e5f7ed22d97fec71e7e387237c2d21e0889447e56b72d362b971d401db2711ab58f490e273cdb93cd27e0f28a01c27675ce563454a6cae9eb73a8e678092f5f0a956a8771e2e978b7719455970c48227db0237a3e03406befba709c7d4189c8a1e051186114c325b90bb2c6c1a24091d5408ac05b3f0e3d7a549056509b5def4e94924f90520cb28802e8354393d3457d822ac78eaec13bb97890516d6da2f9ddc848be0d4af4c329296347682ba49d1959b91718b9cde00f2965ecc209aa69a54322e2b886b895654a111b88e86638fd8c74f273b371e2e629444ea87fa6d137b7c25a355e0e21eccce11f47efc30cc833fdb2341e7df5ca8783b59d2b0369c9318561dcdc42d585b9dbbf50bc3c4df483f5a2c904f8ad703d4fdbd9b6aec6388d357b8d21a60546037468acb1ff6802addb163b5b3bfbac620b852e44888080343c885adde64655d291332484e5ef6e5417b0f6de21cbad786b7ba1230b5494746b4b1f861ed417b728c82a5129072ec3464451564141e3073828b886cdb42137d39b837614fa6426a4e5d87de6eee3e101593cdc7997dd04725146bea2681054f2176a5e7fb82e426421e56d4384a179c1bdc135a86da247e9c5a08e6efe194dd5837ac4525e18fa1a0d354cd2d7e489aadb00407a0944c558bb1cc08d47e287c168a4c99f4092bd8cc9a8fa9f658af1aceface5ab9834bc8f23abaf3f3238c4e1dfcd2422a7f44536af892dbb055045a6562aece46e711ce460f29d2816a4dce22c5d626fd4c3baaf1bd764731296ca34580081eb99f675e49ceaceb0d6b8dbef276222935f71f2a70b90bc04199fdb7839c7b19b56f2e5f4eb92982e3f5c776dc607f6611cac83432d895ca376e8e6d86354b5c43027cb6e9996920a8752125af613e1c1307363f6c1432c954e898b3cffadd55f24cbc4dd308fa46b25895b084f72b84c5649bfb0251d6c562197a35b82f57d2109a6fcc95f5ee21b51e38f260ad4ec60a789dd8ce52339f846bc059173722e336073f2003dfa41c10712ead854b64399da3435e1a3670c8a8bf5e1f1ec5a978e12eb54f8efdd39da29f6de5ce9185e12906027fc16fae63de4e59555c7e617e2a44d0ef0f25e60fc8cc6511b2104125d33f6bd69fc40e3cf9a12daddc6a99eec654d42d30f64cc1791d4e918b174fee908464dba70e95229cd3db3da4c0936244660a3e9dae4eb26b39fa06c8785873b9b4714a06b1622613e5ce58cdfb0b2fc9ad046518d685c7e19747c042b27dd62f6516546a4363498a7104854cae0f6034285e4a1b1de9b71326960d1532a6aca525bc3342e512ca3c0aa8ef436cb0586791819f00c52d585dda6e41f941b2b334689650ddf061cca36439abe42415d94614d2b962776d34fec4af29f4f19e549fbcb3c78dce22a73601d945a7872b3c9cc74f28fcf000f658e6774ea62a7bfa9778fb5b9a3bba95c4f160e99e1346d06aecd82c0a990563bf8a0525ffa5cff3febb8c3560a99f26820b59629d531372f05be92bcaa3bb20b323abaa5869b283219004dcfff2ae180797ae2da313c6b9e8e716e4007ae1c4377a2b01ae0c91d7e7b330a1aa105057fb2a28abc0dbd3067a66d1b365813d158560554718a12768b3b9478648837aed46d972ea95e362c6222424c20038fc0c35573bbec4596d74afe467d61059f7ded5eb8c140d778e281e650a1596c31d3f37f3d6f909757c702a87801d27f92ce77a4d1bb4169a6c3930817f4428818c22579668117bb89a2be7afc54c39992c001af328b7aa1725d4b0a04e0fa89b3f3f6df977e77e1fc8c4a67eac4d63b3c08cb9bea0e15e71d7c4b5b4127f09d819e2f05cb04d1b519e7ac833c634c3803f3a617de828033791b5413e760b83647df112106a762c34df4a4362a0832385ba5cad2e85a93acc0082e2147828765c94623786abe6c5c50304df558091ea19db9e56f060ca24546cbfc0cc95d548b34cc0cd02705826de658670c3463b77d3bc1d7760b2904a97fb10e92531a4a5d70a7f0e9aa034ae0a14b264af3be70333317e75fc31ba52ed715e403aeef3325926c88184c89243857fee51e59f5a90978fdf7d6a7450a8fa39dda5347abc2308f4354a383ed158dbe01d4acab3538f193cd20c466e37caa5de3f2a4f88a867c750563bf62d63a4aab0f26182c19bbe0efa2bae9f325aae1978c9d7c0e882021c52172a2e5140d157c6b1cb0107292b9a2379ccad1e25676f3f3e20fc3298c0dcb4d3fc1ed89b445932f6ef72b4541bf2c8e3d64cd05620ab4e4baab567d6deb633549f5b7b1cf7a3e988467706bec787add2ff2fafe255a58a9f0df6047c21699c22102644e89168522cac4d787a2b2c8cfc962b093a82b8c80a7005c87c28f5e509db67182087b21ca120db3bd1282315bb5530938889a84b5f237296863fe37359e9d9f72e23b48d83ce6dbdd7ea6f41d2ed2afd2a8923648d1c61611dbab32ca62c45f01929e8d2ba87af58dbbf981e27574ec874734a498f19f83223972763b8f70980714bbd4e5ba2e6134974e2d955af33e9910e3d1c5feeb9d3efad8d0303e16cdce895b88278c50053663fd0570009f18a5105f75928788e9bc71b52bb1b577ebc909d62299bb1c90512c3bf6bbc0fd296c52ca07fb6bb1c6e85f0d2ee6631aab9c58953fb0020e9fdab3dd0874a89fea660aa1cbe958edf62c5fcc3c629b1b43d7b75c65fbcadf2a8552e766cd307d9318a52be98406eefed7d7b16008df582a9d990fba3dac46d58f0befcd916050f61d68116cbc550950394e18546fc8ef5f81407788a46a5c9ac80fbea9eab9922459aee5073af2e512f6b515510499c548ab719cfe31066a2dbd517bd0242e05b089d3ed6c84023e17781d3dfa2944126e982e430620d8173b8d56574f1b94bc1d5c1e7089d88b4b7ee93dc9675e4ae792beb826f920181efe096cc53b029678c227ac8a1f4224a61b2bd979ceb42137984d844b3b9657cdd4e120a632ae95200694f0e26ce8ea622bb0cea5d57353ef678e4e2fa863d0da7abcde8711b4d134bd88db64a53b0acecb03abb129a52e8a27098a7297255bba8d693ef1652b20c2aa87bc69e68562cfa5b3886b6ba11f461c7a8357ff104764a6dbeba51fee1d93c98de4a93cb27044cb06420c624a5a87da2b3e1c821b153bf2486fe3fe462ccbdf428068a46d0bacc79f83697918fc3c0cbf8bfba484814f9fed2fea5befa5b0bfc6829d8233d5490fd29420941df448bdb0a45e33135b2dbda5253cab330aa0352cb0ac8c86d9fe09fa8c57e33f1f66705edb05e7d6451a889ed0acec870c20b1d1fbc06f575db0af9aedec42fcb004c8af430b3a0a80723edb0a8c5fbd51299b23e0c8248be29c886f3d5008c3eb1d9311476e1f5ac4259b12630ede8ab0e22cb85dfcc0ebf25d98ab5c6f815375fd3caeadd6b198b5aad9a1c57c05536788ab4bf98f27726d4db93f8dc4c4da56c032d66072c8b6d558142f18ea34c296d0f38e4ae5a8d1e4a3cc50e09cf99e6980121482699ee61eeb82b4f3c8d3ca49dfabb585d536187bef55d69c5e90b0baf7a2af92a095eda20f9e893e67b8c9a30e692585e2449af1975e43a9ff0006bcf029f59ed95ec41fcdb8613320284f5e77fbee0c9f2333282befe1f28fe2bd65da0b3ec1752f4c5c744e498d06205e3f58690e7c763a0b25dd7b319691bfc7e3409f8f8dd48c40684fb60552827c2065a385780446f6d5ea918efd8261228a9e1c96750def8dcc03f41af8ce8bbf41b3c7e9805fddd07f0be52b2797436f760ee99d25722ec83d995080e11b733a041452021031002632975a00a55cdcc9a19f17e09dd339f778c4681ea12f13139ccf6c07136769adca1c692bc1e32cdd6f72e802cdf31e6c2dcd84342ae8cd91c0b17a9809dc152b83d35df25d35cb0ca65bb3b9fd6efab641d86ba358166252561cd1a5ea3ad8c75b3198c0675bbe76216d013efd2672ae4e431a60db9651f72f43800028192476cc35f3dea996ed7f22033dd06a65bb4bf0ae7b7b694c93d01be23d3f3e63504ca2e8d85dfbc797207312240e28d9ffe35970e541248a38522d4dbb2925e60e91981f6326119164ef31c9a6f03b21dd37cc24352237b3d54207501641da58fd35d0f1039b45eb404172b2e8ba61c22cdf85906f53cf92e13c34504f66ba6c87854db67ceb09812aef9e9eaac2d61b599693b0d50590032a97ce15a8f0ea0a827471f5ea0a188f58b8769417e9119723300c08a8b1b831d96234f57bf332026733713e2cdc8b9ed5022549397692284b1ab8b3894a1e70fa405369f19fa6efd838e65226402bc21d1c82ee4345a062b31725b42dc9e68c86cb73954a55f1511a7243aee11a9729661d7333bc494879651abba937626bafafb12624477954a7b0655c04cf4f218aeb3069d621c129560f10a85da02d9dbaede31e493fb47afd4edc2e34aae3e66d9a39b2af1c2e43b904a08277474aafdbbca2c734c0bd2611f664477871f5bdf929306fd546952fe8d79b07911cb8d48a263d77dd6b65840b39f4bae75730d95c198cba499bde5a6bef69c24a4330f2b6563330717aa113d14a3f7ba23beb6c89ab341f9ea5a8d1dd421d501c297f8c3aba0c0a57c863caf9eb2e104cba7084bd19e669dac46a2858375371b7b8d3db9d6285619b914db49f34c5bb8056998b4a1a6874026e190e95ca2338981a08cbf00e37f665f27d77a39a6a893f91e8a8288dd8dd964f461480a1bc2b163bff2233a7406a359b0e5b54564171ace301372c6881bbc1eeddbd9ab32a43a7d94c310a10c6559e63852cf52988faf27fafcf374a11894031fb782b16d78686355eda574db56bb7cc67efad11cfee193cb15cb40d74fe5ee5c293efc3553adab53af977cfac5192c7932cd36098b850d589edf51acc37c8be107278c08b1f5cdf8b154fe969271ef7515d85c6fa63930454fe1565b596289ddcf3be1de80c09e5f3034986e6220b904a68b4ed146e78c1dbb9a95dffa3114aaca37156c39b660c68268ce892ac849578fed66504b4a46d12043d9ed003025c275989aa7a4505cf4ac644bb8f3f9cb9d13347e09bc3f077eaec39cefc27056154d978c20f6ac60179cea2175a08c4b21ec0001c3a32b3ea61ca47a4059c7f41c506a468cc456c406457fde3650354e8810541ba920684221f4bfb0f5c8b42b78b775627c7f861ac0b7a29ab9d1cf7e183b3398bf525c0480aa88dac6ad6a3b9f8882031153f0fcab9ae35e54ae967e9e41d94171df5165eaa7ed3effd6e09c509ad96df9e85963b9863945b7f0528edefb8264378ef6d4d5cd1eb293da6ff425b8a2958464ff0ce126a3bf304e5b0197a7785161f47afdcd14a950456c45d40bd41b9ba8d037b41f665bfc4c752f9158e512a1c3870f64175040dc25f81db2e43de5cdf4bdde5bad0832ac944ca48382def8fbc0a2ce0e02417bfcf2bcd0405da7b885b42bb3504718d468cfd7f99acc3e450133ae9ad28ea8e957b83f9039306fe7f640bd8ffb9ac1f49659862030b15c8c711d6472ab8ec41cfaffe264f886a9558922b5569ccfbf8db963dbbe655dbb638b691130e95d416655289dce015808c472c3350e1fedaa9f656501cca54c2a0a4ea59bf510ef0e14d7f24093b3732dd12096c21745078cb4002c85a07c8f5db701aec4f1b2f919b3577a4856b24f2ca3988ec4e70653c48b8939201709dd663e1740d8b213f9f0a9792c41b20bf4de883a3b221bb2d5521e5e8e9c4d697f18fa3707940459577dbbc08829dc4c58a6a424e311ee067af60b7dc748aad0da90441cb360e381b447a8a6b93a510b04932024274f232b8074bbe6be6b7d08cafcd9d9ce4dd652ce4d2ae221cc847c08f6177d00d6612bcf0a88e610b5967f13154fe54ff5832c9c6059abf1254aee50dd225ad424dc01a3b45114c2f8c7890ecfb15caa439f54245e87f029aef8c0609b993c9c2723327d38d9bfd26c1137b98db1634c4a73e5955a4116ba6141427eb3f3dad3762f2911470a6c40efd0c33a96b011aeb85d7806789b2d3e7d3f5c120a451c227c3668a8a66bd509b99f73ba9401037a94f908c86edba04f737de90ceef198be1689384661d4d16ffa3a3afba4d4f5a0cf2e39785fa3492d5b3e48911611134f1eb6899b630697ad493de34bc0505c5e4a05850dcbfcbfb03047bd7ebede32b01d422956cb8a5164f56f18c9756a58ebc380f1acead7147b78652ca111c2853bff74abc576af03888f7e4e5a61919df4426998502c84de3a26bc545663c9ab5770e29e5cc888b2f0a3d6152842e2c950435232e393c4639392ac2570d00880e1b89e235476325d567cb487096b1896302a393215951b3f45a15af2809f307ee5331a04635bf36bddcc2f7828e31d853c378c51aadf4b3769cca9a2b24cfaa7e0d660255889c95b0a566e2696f66c7c71a517afe03ca035d862c8e2900385bf014998f76fe6ea12378a4b27600832a94c062b5ed4ab3fdb9d4050945fb9d047b84db1c6138f7053ba6a0748b2479373891bb195a0210586a2705bd83a11695932ef5c75b1c87401b81f7241bc5f1643932ad45717b5882c70959bec9594687514f5d41af7534d6b4e7d2f74781cae97dfa607299085f54951a4ccbfeeb54d5ffa0728629e312c0333aaa4e72c826ddbb10aa302f6d04bc2af0edcd928180369946f5a2820303d43842333dd9f8abe7116710327a32fcf10a5f48c5b493c357ca14e79ce7a3d15e39325f2e98dd1e7d909ba3e841d675a7f2745c7db98239d8e60a4d5cb873c387f3697543be172fcbe1da5c9d847014cd8c07e6a0bf9e656d018d0d3715c9e86d4201f1dbfe25e52581b835722fed8c48a6093236aa226725d79b9f43d0f636e6f557831cf0e2e5d0663ae64e2a86b58e2ee2d5ad3022e93a227237563b10ba91374c931616723044ceeecdf2e479ee31f83cd14be5bb8b68fee8556345435c308620e055c4ad751c487bae4d9ab99d401a5c042661a46bc7708e309605d45d9991d277692275e2602776800fb17a0f8f1bc3017b60be2757c95dd3d25321f98766a6895ab7f93ea6771f7c662db03dd3517d32d0ebcad761201e11341a16058d419d6ffde20522f7dfc6cc9a844ad74ba2eaa21d5a5812a624ec47a257e829744ad1176c15065780138e5d2ad4505d9fddf1cd5315ff93fd75231421e907019c8e7310017ba8e1730020feec6db7120ab3bf20864e3735e09d948e4f99339c8c11eec0568bb96048192ec4b9835f1b3855b0b04c7fd38c62a8df64df02a0c1e92c6851a18091c41cf6e00082c95b6e0037dc4bc597bb14b26e9a4f8b05cd44410f0edd4d97b97d59882dd5e63b29dceef54ecdf95da19f633ff68d64e42b0acbfab4b8f087a0a663a957426955ec39a2c08a54a3b0417296665e636bbdbc4ba1dbf1222c0444b5889e0b46a5d942f8554258f00fe339236818c7072f5a84817a150b6368ff11f34337f92412f582518a176cff9e3362132c1cc7871f6b1b8d4c99865804456c7b31f335036b28cfbd837963ccef374cd546d33f353f439d538411705d0b4236999cd097c72018df23cb2385d271b35020e1c416483b226f8293bf6fddad2f87815eafdd0cbe3a262e229ec6072abe9845efa7673521609a4fde33ebc2f70344c52ee04af53c465207decbb5bcc9ffe3448a273a81a2615cf21381895c6889cf262cdacb07cc42c1245a7471e7e2bd6f35b8b549ccdd70a7c01624dc7f3149224966aa3b1125185a2d2d42bc4ed5cc1ca751753f87dbf5ce3681abf28112a99c3d2c9c9dcee1e93baf56bb9052797849079fee46af402d0d0b307ac55a622263439faac58fc85f6d8f0e0ff1ab13cd3756292822e535e85724081a50be72361e6f745e347308485e8a23de8481d7818ee8413800c9db3809a697708f1bd76472024e50a0a72a422e978cf927f2d697d3d35b8ad46ee538d639956cded771dce93af89493109a124dd9248aa221d541bf25a783fc5ede553d7b430f29f5268d0400223bdd445648eb5ffb1f364f741636822e10398e7764bf1fdecbf1b5792e223c00bde768e19fe20412d8d8aa52d618e2d6eb088e4d94cd76def4f29dafc28fd6dc410ba6f645c21e36cfc8f1048e9c8a6c2b309b2144856aa44218dd392c54a344dda385210208eb7c14609cacb0036f47cb5ef198352e5a48ce5c45d35d4601afb02213bd05263352f7b2048186300f13019b03bffd482f0702cedd6ca93e0801bedf5db303f33ea9aff180f322609415d8146c58dd4346dca6766ef573d3c975793139bab1f5ee9961aa74f0fa116dbb566eb63aed1312ddd5a5a9c6e8b34d9aae180057e0d3409ccd9318819b61daa22ef440213273c3f64a291424538f03f853d1bee01c029ae6cfa31575f529bd0522f6fe2cdb68d7c55b357851c9cb74360c613ff41c81495499bd00d4a7f65b310683027f2dc54b59607d811c34bc904bdcee6ca60242d76c7935102a0abcd59824c8af464335769a5ec4a9c032073b2c9844e886fd690e6fc287143d8f51c597abbfd7e1a2d5d8fe234d77582ad1ab9ea1b525eacaf440d9059b8e2e3473476b5501deff62eccdb69762d3c5fcf46e13cabcb1d913ef57224ff8278cc69312eb65ef08fc2fa249ace199b082a5550df439038fe1a766a9245a71126f5e7a19e34e7543566451326ec97aab428680bde44779a747bd7403aedc5de5589fdd48c203034fa58a82d32279501cdabd7b2494ba7e28fd11d5d7701f8880893ddadcae3e6f0047d1d539e3001ecb6b837aabe48a0a8a30f4109a72e41aedeb92a6079547d19be5b5db6feddd617ba303f2f9a0ccab21ab2542c6bcc142990f2e3e0ab5663ecf205b205d95232e93aeb61a710dd3693e8517f9a4bb451d2721a411005910f622266fcdbfa6fd6c42963ffbb9439335ce1702e2400e8e288957798ad45eb4e635b31e2c99df8ed1340c2865fa9a4be1620bcabc01e0554765decebb58d77e16a22a139374acf0bfb5226bf81e48b650195e24f42be8dbf85c44dcaa885b2b32a75b7033daa2146a34e25b2c05a3bc2134090d1178f32d81eb0e7389c6fc1d1d3f4ee02de24c30663aa634dc99cadfe2f330cecae5b77210b61f49c3286eb3d57f40d52157d4da6285521b6b48b020d5a462062a15f5f762f299af40452e45be38f4d491e12add1a07b35e86c1f7745a97b92ea76627f5d723b08d6c32c9ae8e6e46623033b6ab44e3530698aee48d37a2fc6175fe858a2f34c55c4f37230d1ffb84fe481f07af11e4709a83b1cc3b30c811d01b4eefccd7ff360b80544623b38a310d26f1a6c469fdf664a7ca4ae7735280a3b8eb4453b758f479e6f8c88b49453d28da31273e314a539e926cea50a625bafbe486712e44a0a44b992033b0ab98809934b0c39024f409f6322d29e68e7b1cf82719d9f9145183282e9bd8438affae93bb40931bb872cc2b7e02f4375353a08d0c4ba113a93bf4618bd698d0049b241ed3435cb766eff4936040232115887a1ff6656b2073f94bb70cc77477ce0ec81ccfe416abe4f1e03b9cd5c75018a9ffdc8dc7b0be2f341f41388b49bdbfe22221546f5a64425cf71dfc92f93777cf245a0949c07961c8869bdb3c46c0613d2c4b12092d1dd5033fb2bdab5dfaff409a36d5f78145d16f2cbfae68cdfc6f241b137d89b20664087a9cd9908dd9f456ec71572c05f21c1e8e4edc0a4ece126dd58d6de81c745dcee8251e0b949bdf58776526c799e6c2d782179232f3180947e2de2f03d0c19fdb1d0f05eec9c59d59f33fc9f63d77e781d638305405f4e9cbeadf367634abb03c19916083c2d0ca8add26fce14154033432a2afa8466f26650504c30a26620de45feb5427268bfe1f4b395b996f8df9d728e21a97c4a00170f4c38a80da5e5f0cb1b4127a0fae182afc86f6123b7e3e8b90f6c62803c08d0b1a7d1d6edb49112652537cde615ac762e810ebec35bb501b168e97efd87d9e08c9b96158eab972b7e5fa7b2ca928c2fab01ce09da063a3c26552f0c1483469d32966a8752c18e18248cb5b52b31dcf46d492dcf10d9d6b84175f79fc7bd28a85e06792da088de5bfce0d9e8f70e46197b5b1fc09e32f213e1a13a2f002b798ad470fb07078bab221c70d2c3b94d194f779af40c086b442f5245b0879f509fcf909a645df28c9506ce7f08800fce13a92f065df85ba53593d33faabc91cde7ae3c75be7a8256cc81c887dd456fa09f3e72965c19e5ed015ab3026d36dfe162520b41ff3cb5192509d9ecdeda7f77cc191f3a0c9fcc71c48169ab7864f468d3d005750e5a2fb650178f0153014e17c865dd9fca8dd805fe14d3d58f55e270f565cbd36a29540c83fd6f2e9b1d37c3c89c8af249b088c848a6271f32dae374de08d8a040f882d4a9c76a0555d3322b43dc1bb8a6d3d8271175e07897d12cb336a2e80a0960ff7621c6cac93b64a84b064c3ba99252d5f1d936e9a21b1429eafc03a0b57bd7387a99fd88c8b72eeccbcdbe85aa51b006676be42f530e418f6f761e0537e4723e3ab149aa12bcd8a9940fb7fe86da657af0c672699f445f13456df6de369882aa7eea7f1f0543a71283dc7b0596eab150d5041f6658e46d09295c87cebf6bbabb541f0768fd532862857926b6de3909c501684f296ad136ab927bef56804025eaaa0edaa818dbf35a14ece81d2b9be782b9aa90cde534ef13940dd087cf29dc4caed4e21e435745f6402b07c099f3de73ebfc554d8c5d1cbf299f9ce776d13c517418d6bd44c02361eb170b22b2e57c9dc4e35b68057e7ae4df0ab4d1e3aa9a4124299f2b3117dee88cef3a583d3d71d68c091fae025419b5cdf1cc0b1c641fb9af123ccca034e0bf25239ad988a641ab23c0c07272c22f83d81fcfc0925f28d823987347168e9df8223c671e19041959d805085feca1fe013135043c1459262deb03acbef7332eaf3bae614d2e58a4887ca8030f773f679943974282aca1b86a0455b0b888adbd86981e0d6fcb92427c136fed281a4a01a16f463d2f083ea888c93cb91746452be53b244f89b2224ed59e19e8585408ddc44337f53aa0bea31af7dabb207a8a73634e88b16db87b6b37612928af594500110bda06856a468385ba75caf6aa2d8f00594af291f781ca5594de457e558de2eaa0d7451b2118efc88b1784198d3bcd74affc2175e612da580999dbcedf5647cfa78392379aca94a33a9caac14eb343f2c36b75f2ffb0df439e06b5d7bba020bd40b213cd8c51355a274fac2aaf037c633c28dfd5f440182c4f56b83b42ea0542391a3b0a9d505d14fcc40bb0293cdee9596969522c4163bba1f1497ea6168d63721923ee641ebfb73aadd452b11e8217d9b832e9fa220655b688a03d9920bf3d3966969371292fe41e5aac7fd3ea6049156fe91d9df849db2ea74b1628ee086d7d5c85234f9bd6c073a1a582517ea01ad93095c97f2c17ddb81a3eb7454d709892b3a30d77933d963e2c02177fc3812a913aa2eb723263319911e6027004de907e58865e559a25700c2a6f44b4cde5cac70fa5cd85f05af2a611de07696e7d8c72fce1501b7e054d2281b2a3c982b82565008952cff0f4e53e64833e2e579e65f71c7a3aa16cb14d3466dfa0945d4540005cb0792d8176154aa49eba46e0e26524537145ccbf452a29442f145fb8356e27eded94e1d4a4ce1985db76b1263e3532c60e0f870534813375d58035c11d5caae04c09afb1d41cc52501e763067c6195576bf9e2714e4e394ce90579f002b94ad7bffbb58a4740d0e93854905ed2deb6a6cbf8491a2fa5cc46468ee287b985c6cdbaabadf35db8d1fced7192163ea5c0b72e7cbaaf202bb8bb1dc7f543ae8c88dea725e5ef170d853469d8d495d38a84360ec93ed6ef9968ff68f2ded275e0b6494f4a807dfa3aab45c3e0c6170098af4a73253ee493bf091063545a0c36e6434455923f6950dfc377f9b3c1913300631f2f048a5162c372aa56c875d9ec687ab71bc8f7160d5af43068fd9529975305f39f126cc8d3a4ce2ba4f2ac5713641101ce31002abdca8a0c7f034e04ab9d6ca707e578f48c29e5cf222762d1bc5632e910e2574ae410a8125c31203e993acbeef36578e787030dd9328893e5faaab5aa9301f8f31a5788f1c855e979ffa157a300f5b9d82a17942029e8cb7d124f3c10435d831146d0b7f6f8fbc25616a815a0e22ee8b9a463d315b5f9432c17d849785500c5ad7a1843ea4038e901749b1f85cc7e2bb2677b4b110c4f107e754e46e10413f1e418c842c24eb42a0b09025e46da7ba29c5544f588eb930ebfd2479f052b33f454143092d50378de0d4b92c40aea2f04a4238d383ab262eb755b999804269141af33ed4d42bbb9df0feb61839c860e03e39d80bbbefefca0a22aa4501268d92ab5719e4998a2cef73db1fe822e8d3fe9c2bfe475b8fe457d880ba47345e937591c027d1ebe3d5e8604d16b11040d5c16b15680a51553097796ae6411258488c2643a4e7c85ec6579431071b6f004728dea31152d2c28e29707c36674e188146705a7f326e8a364f12d1008ad4a290b95a543186f7f02fa44d011ab592c8598b8290a064eda183eb3e5aaffe34b8baa2af39f41373adf6843dd2fb97a9dd448ee8a8a8f38a65d1d324a33c642b70cf0dad8fd2db98cc2263ba80baf007553c44868b0011e401563d4fe287d68daed3937bb3cc73f025c9da97b38081fd01970f2031b7c60724be6d4c2744b9990d8924e1e6e7c1aa6368996e5c31a6d8537a93d2d934c9a4bd493ed3c896f47f28d86bc852a2b63ced58df71d891911e99d7bd3addf3097a009af86949c1dfc58a114b87232242afec61b500594faa2b251d84b71b41578bbbcb64b34109a017410d7358e96d64c188d5b297229e015208861456db805474255b94a65f75803c84e76f4ee4e8db34f91bf62a6eb1c1d7dfdc5e1f6c6b40a79c4c7772cede19f808ebedf9f17d36076b3e56f6a5aec5bf9e437ddfaebbd635995c7b1c8ca80a425022319095e00f4f8cce64f0f0c62d87587d8d2ac96094d5c919692443f7e30212cb70ce2bcd6c659db4ad8f794da2285b4096f1a49ee192947f3c0232c0ae94ed0bec95982da0ccc11c5caa24d0089056e645cad03a0a01b145952e7e95f07a378a51b120bb4b7ccc84ce921e7581de20b88aa91026c4e59a41a3558d5ec90c9b03c72aa3afa0a9f1594ac2df5b5fc27804dfa8af3895d7bdc097659a3241340e2616f6b2469728ed9785e53273bf87212a10528bd6e458a70558f62a1594df546a523efa8c0e25c2818e2a76d91097125ef37bde8935fa2e484111126338aa706868646a45078bb30e0092950c2dd30281fc0836ca0f1a03bb5cbada3e801141d5e492eab7c1dfc59444457c53e5eaa6269d01774ac44d009f10955c78838ea062dbf0049485b6751baf52206381a5e7b8f4924f541c5060522a4ee2a72beac3af8772c02c125a1bc45adaaf1da6174b6025fd182fc5ba83d8ada77f0796cd69ca8cb11485595afb7997315f8b31529ae2774f61e7a379a56ae760fd297fdee0e1735054096c0c33f9ba2d47515472ba7037c76bd20f29c9fe8f65733c26f67960e95b393ae5a1cb4d578ac359b66d7edc4720b99b678e28bf794a9040a44a393b16d6f8a436b6790b6088c68ec6e065bbe3438960f9449625131fdfd1ae92fd94fcbbf66d89169ccd49c186f40f35ab5006152e231cf4719d1c83509d4009d36e4852359aba835e52275f740d4cfad0e4cd8224e7152955efe10370141692f4c851ebc486dd7a538911a46542ba484828c5fcd514c9db880211f128c66f78666909a780857a4f4b8395071d447d03ded40b5e415f7993cd1a5f5854ecfdb9bcdbd2115c516419dff5fde35e981232ec04582102e88127c573e9920ec760b5ee8801f2da5d4b7198d10640eaa8e4967ccf58e470cdc491f3203daca1ec78457171e41c0707a4bd82c312ce22e2a0fc27b16a05a0e8c11fb59b0f7b1d23979dc1b82e1c2e4b4c1fcdd0a57980606ede9d27fbe2c24c0f0c95768499e4319d0f4d63b41c2d5f5c2cf3e17a28a25087b2f25799a37d2b3a0509cd809a4509a434e3fa60bff448b3a321c6cfef14740f802764224547f609b1156181a220472071ed3f988695caa42e55e6495a65e4d77543cb600ab6202d961c85a8852e4d4aa1044ab4a7c876a78025f280f2ea959f96e5ae3df2684253602dbb01b7fdb17b845e2549ba00eff9489607acd351c01cbaeffbab7f47f9c232337bcf7ca9725bc9ed27ee4f136c990844a797b2a55026daacc67fe98a74044c41e173fc25b0bfb991607367b52f30d0cef495d63401402df288a0da09d2765e294810a66f524038cc14b55ea27b684738f405392bebdffcd1a17d4d05009599acc66a45f6d6f4ef48b903dc7c59a431786f41d2031def4f9968c6b46b767ef90b802007d9688bb32fd092d2ae0d102f8200c201372b4d4ea443207726a022c9f7fd7a630e606e1ebcfcb69e13133068058f06ced23d2705cc32d7b35afe61084126e4575529409765083a96c7121224daf518720aae08496c5b2ac2201e372e221b62a8a4eba935bba98a9bc84065254c2d8b623f12142e91521cc42b41ba6c6d4a2ded16c251cf3998b501109a35652d8cce8c058227907cab4aa946348b4fb0407859d6fce8b8abe8bee286ec5ba35de598104261527202595f8e26bcea7d3d8179432939358885a70829c0203f97f0dec825cbd9e1d62641feedf33c40aca7916987cb8a45469eeb85f5c9158a9bb340afe2ac77452690fc9d9bd08b8ef84a70a0597e06d72a4094bd8bd742b5084e2500590a754040d239a53a4013e806cd1e60e39cd28860e4f876afa3762938a35d15d236b7230072250a9b1cf0409e9c559e6295835186bbd9fdd30d1ba95bcf11161188dae592f3c8d6af4cbe5739f52c25fd37d34becebe6296440f0652ea0e188916143662834af7ad2218b151398bf41f9172e0ec784dc26f451d04e260e95c11b4af13dfe3f9c6697b1a7c09842a2487586fb5018fe7d14601c7611d9d1e8167b73daa089652d1554bd06629320f2278625cbb1e50e6b20c246d50020a070254ce35b766c8ab93f15e9c16d2fb0e8e0074753a2a1ec0e54c02ecfce87005a1321c68e0123b202787c2859baf05c3e0e0f42e893fb57d3edc7d61acd3682c94033fb23f13ce702002da4482ef234961160c9586fbe72a06ad093d466ea63acca566ecf1203782a46a5493cf1fddb01a62478995db701a1f043adc19ef954c46a0996a788bbc89839777fcadabf1442bcc705c1c677878c9fb6400a091983819b8f1e540f39fac7c21ac2924c651fa3e7db8bbb3dd99650c07458dfbf7fd89bea043e972955238b8016fd47f90949874d1676505dc76bd5131cc93a0bb6ec36a7f4200538a1c4cbc58ffed84509a56190805a99c2813fac8c75f013bb48759b6e34b4b19bc4265cca7b52cc6137053aa265f25cf4a1d6b961652f67818115ee6d30c58ef06968ddf4b081186de7c8cc788e5135f25a538a05c8fe1f7c4d85593f2924418c077084ea344cca8ddf212f4bc7989f11b4f11c56deb7625d318d6243e1b2c1ea6a172cf7121aa3ee09268721a83da7a5410146e60cd947fb27bfbf2d97ab11d3e6805255e9b82544851974010e2518f81f2539450add22100123952997f761dc8208c413b15f3ebfc02a2df7c2dbf809d74e89dfe040e9452555dd07f9f48685260b1dade965aa5611d499400121aa0015d3418846cf673e7c89b37e78332248b2d6548639d50370121231c3785385358d38f68b663eb7f5f9f3a4e64980199e6acf0a8005d1988185af0f651147ce02822183d72f7f8fbe841f43945a0a0fe52ed74c5f00945570bfb1b03cd6da105fd24f66d20b195314dfb2160e05e82f0a0d1a80b759f0160bc9582d94a7247b078e56f0011b5fac36301f04bd60b256ba8b8c92f0c67ce48466810b083f3eeb8acaefa8fb9b76b664e66b2da517010dbc12777d05833f1ac634459181ee381f9e33927d48a402029cbca1d4af6e9b65c1e4d936025a99b87a4837f1c5a11cc268d1901c48dd4ef08807b3dce7d4728d2de477649600deed02350d08f63cce3a480e7fa9ea8c5b0d25c9787b0fa59858256c7cdd026894e733159163906f60e24ef6d878374deb1d878463a353dc3a2c52f9b1b9d13f009a54101c29a7a8c9a91cae3caba92e94aa8fd55518853cea61ff869693cb87f5d9f444ee8944d1c9a9d794f31f46816e9e09ecbd8e550ed18046bd664d44cba833761ccddf5ca546efaf53149e2c3114d2f01ed09bf49980f212158114e350d10619eb13d8cf111191b8d88a6d4c885756769c1937ca0fd6340c5ba20118c2f8e26b024606a0fa2a23124e376d08cabed1288d930b4a771a19b7d20988ece514ac48dc72134ee53eb6563b79065c9052400b5711b0afa506b25b30f9d5b70d5ae81ea60af8472a6691eb5939d26fdc7ee9f2a7d196cc5d8868380b4c487d06d708d8e4250100284791dd46e4edc35a5936792d25cd4fe2faf742506073bea8349a773ad28d9dee7dd3aadd688d39470b8e9a5786ef1a992baa99606d89c4708f9c7323c14b4cced6afd65f8743a2a22fcfa746c7eea6f12070d0ff6e877a8b0e8ba7a945c8ac3d9a2a0d01cd7850d40b4296fb49e0ffe84e83cc950cebad2a02ba442363b4a3418ece4f3694772f2656990713405896a15b0b4672e00f83ef99ce5ed7a593b62d62fb4026ce196b8da6514fee379e3186e1acd013e9989e4d4a05723e53382fa319863c4f7e0e17dabaeb4e84eb928af99939f1c07aff9ce6dd49bc439010d920099f001acbf0f2a8ad8edb87fc27a9a427671f8b007fd34cce11966f59ce32f211077d4b7c2137f62db0ac8a894d232e7445ed00e5901e1679d51926107f4b6e1bc669b5b2966542077860c46738babeee3c50008197549eaa29061584e3a8b860f8862b76730924e6bb08056538e92c9b866f14e087f4391c113e115cb470cf9e42ec158249a4485d51376d0d54df45188d6d34079e57ff0223a96cb32b90d523fe86276ad272d44f497513bdf67daaf88883abaca9b03f93044cd188269d5fcaea8ae09685dca3316b36cc0752740d3d9f51edd9ecc5819ccd28fd0086d5c779f685e6259c42339fb67ec147532ce7353ee0f8f08acadee83f7de4a489cc230e1ef5f7c30fb62a846a96813fdb0c96844b30125f1598c2cf6046b7ec634c940d8d0398841488ef10b866d4f1c0868863df39b999c1ce046424c6b3dc0cbb172484fd1159e40740f161e5f52b73c973fc196ed439b135b9935efa5f6e929bcd2c9e72d67336900bf73786a1fea8fa5098e61d416555ab33a2e17a84e41252eba205b768c20f0515857012ee26000129d43c54608e06311d2e1f073797458704995b1ff6638c251d3776e0f5ec61689cf7c1972880323c4259be1982cb6c6fa66d4fc90ada50aab2e139fa6c864ccf99a27f6ce8e0f38ecc9c42c4127093c3f42c06cb99c3926a2c7d3cc95febb08fd00ed85a39f240c66c93aa9e601cdf3dd4dffd017083703bb8eac2dcdd0a38bb5afa168810296c8692970dc000721858e6083dda28c46adf93244c1de4f02103555acffdcd5bd459399e22c86430a79006149addc0c78e3a3f0dc3cf27382f85ec83d6deb19b95f041464d7b594d226e78e8c6690341e94ff823faed60ff0e55d8a794f7d2081cea86453a724b7de02a5c9b7703c6c3c4a0b9395861b734944d9bab528cd5971fdfd4c79a0fdda9d5a5623799f1e66379fa2d966025d6c102c13968f6472356c6f30e08b572952c116d91bb0b633cf795b09503bab9438b38a59012544248d3c39d224d0a6d3021f9fbdb2d849cf0f221e54e23c2cc3c24ea5973f34b81c7d28806ca324f75482fa63ee2774a0779cf705a7b343136e1d453e0b4c4a4dbc378b453a50025d0c8703c205e2764d1151c47d88007eab45fda9d0bb7885333469b27ed6d159c28034c1837ecaf3746c317b18faec1c8a40add86a4a8f2de25f7802f273d0d14189430f1446e8159e9ccbc9b146c990c8ed2654098a30a67597896d02cd9795b1423e59dc966498089beae65f05fd214f45f3217c88f2a9a30d52a76d3e553fb4d979b72753246da598b6df78c507cc69d17998bf5c8bf207dda616b34100b02a7fa8111aa4e2aa3833cf13dcedf3ba3c94162f439c20470e09f5ac3711a43fbbc17830d84db2f86e1b7c49981722d29cf290a8ad4979275d6766c410f1118b7fe95eaa32b248d57ff4aad5fa31d792cce8f182c51325bc5d70a4331ed858c6463ac3222bbd09aeb25771e51fc64b215e39291ea85984e10f3aba13bb51686151354fe29f7f5959b809f58273a2b8409ef5f063cfc5cb430cdf1f8a172e9f7935f068e5176eeab8e725ec613cdd39c0c646e26a3be56a45b86cbb054c089dcea9dd1bb9c2adac85ca9330ab85b8edff64e6e348c0b4100335a750f6092a4cd427be0310c7a12b77b7a1b7c17c3fecabfd718e3d3cef9d0f9e950618bc2be04ba550cc1e6232c77e71dbfde459215ace3152c5449338cd38542f621c9200083e48100df137ca2493d37a4d17199d0015c00c404a0a19401d44785e63149b85a31548b358dc2a951181e43fded2efcdfad3cd7454d35dd5c043db8267573c4824dc3f5ec7290afe76c00582efd4f8e7893ce062ed9334354ffa1dfa0fa9484a5e2a560d67a3219dd78844c7381f4d946823416d57ec9b9a4cd8aebde167f585564c99eb8a54690ff208c0013c076beba37afbe3c2d3fef799d4b7f49894d6878c77fead0c04df5c814b71d8b696bfd115812518d05f5f382de5d16ec297575e36e6337b1c6e72eaacdd8f4b35af7f3644dcfbdfdd39498c8fbfc9769532a06f4c2b50effb33b120dff387c8e265370b5149de5f0628ab6f7a29e96fad8bcb3fb68ef765d00e67409ad268074ce04314181940ddcfdeddf187778f8cf110cc78c5e0680aee889ba230fd656a8bda163bbe53614de75b4c423e4250861e87623a338f7af61f783aed1b815d878ca8a37b082096890fc70954fc3e28c4082e00489253b4cb68b8feff07dd89ffb849a5fd7c10ba1d6bed43f5a8b34a644a35a0518504da00190e95ce14a6206a23b2a39ab36db8b7c68331a25ee0ff1b58a2690c1ea764d068579472c9c3a4b221fca84aac13a5a0f2b112807e4466b2a4581dff17bce3c21f969f3d22ce7b45fc74bc2d2360306aa7fad95c783951cfd45b2910a8ffd1d2a8f492a61b57889e3796e7cb501bd10288eab28d7b45f11fbf8d094c681f03b6028b0161e56308a3ff17f1d4d865c4c11d761713698f0c0ad53c21f6823271b3ad3993ab8970a7eaa869df363ebbd3398b7eeccdb8bede98f007a492d3403904320d55b8086b8805f4dda39cb89b382370ef554c395716f04f375f49fcb8650ecab008ccec35286411d24a0bc53934d95a5394b0035bd2163fda50c5d32503be932a9ecb96908f322cb00071aa3702c3c0f7ae3cbc9442c1fe4a6645e39b019da825d58c4551e6953907ee189f2dd5051182c014332f73cbf2bc0212e8acafb44b805f106f1b1955843fb37d14413c39bd1acfd9ff871e7384b4bbdbc6228d276e568f461a6d8aa4fa942da89b808d3c07956bd6af7c22c5fb2ffccdc08d17e008cba7136f9e9d6a114b100acdd44c4e9e53e0309fe04847460015566c215e80d45038386eea118af3b5bc725c151d500a2286e059daa56795295c9d69c581a5c06ccae08a58d1fad7e7357a91f9d356fca678fd5536f94c75e5aea8bb60c5d110b4824627405c8967d41e6c2f488670268dcf685b5643d03325843e547f90d1e8e2f80b80a2064eff1a94ba139cd175b86d8551f75878b9fe54ead05e0fd6e638657ab73dea62fbf340f5db34bd7a5668f75689e1f406b86b6618ee6f874cba6a09a2b4f976e413a60b5304f8a2de0ab7286fdc5fcbeb47159cb0940923df845b70013fd5981be4b34e2feeed94d983dcb85be5ba5362804b2893669fccd4b735dc474dfd97bfca7c977b90878e23daa6e3085ec2fce51d71de7782bac085a393466893b7f0dea1c829261278b01cbc0e670c72139e427b6d7ad3bc800cc00d756c377d100904b1eeef12e7ce732ec73458559ad9118dc604cba5c69022fa23b0d42bb13b8889ab91d859dbb0cb781804387ca875f814138c525ba78c05a901f422d41e4d0adc017b5d614dae783332d01cd6c248c6bd2f87a5c01fc983f606da1e9ceedef15f840b57e144d73cb0c20c502a8c22a96adc1a1131d95acd9fc49c11b6bd2ac7f11295174344f5bf50f40a19d0065162c051de0d1ca3e1a5abfce2c1a59e010e0beec9391493bf1409648062af58ab409663f0992b1c2eae3cf3c28ee06926115dd290aafd11b4cfa7c63e1512f6b74fec90b167697779d16a3f3fe41c38426ecd8b5323dc23747192b1ee97f29c749d3750e83342431316f36a1526642cec5234d4f968b3d522a0e640ef34ed5bc6344a0d82855dacf036416890803e6a68a740b290a7d3456b46a81f12b5a2a44e893f1ac0e3e56904a4142fab5b64d30723ea50a49c3dcf65c778e547e6d3d7f7ec2c8865014cfcb763c636b8986232e2243a671bf5bd185089edbd19d3431757c3b5653078572c3ec2ee65f80b1bab4cb33ed25847f1f41ad42fb41ee8404aac6dc71d784c006de716e000b542f68b911740eac2e48c3a41d9f131ebd9320924fc851c3048139b800387009e5cc365b4164acc81e8f06f90c550ede7c5c1a3a011b87086ae09d42e33c8b6360deddc64f4342ac9c041c91b3d384ccbd42ae6eb593c1c27a08d25a36d75622c2b23ba3a0ff61a88bedb1b60e49552fa463976c9ad43487533071cbef40d682041c67c1267f3314fb24092efb704d7156666be2dac18e8154dabc878794c863680251807a29a7d47404865469d93f3c868413f74125a1a64463ab15aa9a30b71655a04dad4ebc1a2bbefe3708cc4dcd5bb782f1cf9631312c6269e2e19a33e8de3501f965197590c167878555d5022d87545eb5818c6dd49ed4a109d59e88e9853de78284c8d60b727996cf16a63ce29dd0af407a5e8f9c301c349ea86009c8d68391e617d299215d7457ff8212284dab4478a9baa7a9c32435f8302b9722a99a2f6c73ddf834c553971dd98d7d5ad2d1ee34b9d4890bc736393e6f816160893878d4e7893c6528a87ebec3564c04a90f0ea22022254bfc3b1d190a33dd12660edb4c045b48349c8309bf661f1bb126e3c0ad7209e243fe969b00772495a1e482f74fbeff809670a29d63cedb5cceac20d3c39d4677c13b6e593459c7eac3a9ebb5d96aaf0477487f904491dfd32beafa0548bca67991934d04ee2c0d0ab89e12fd2ef23f1e00750a7503964e397fd43828225cf0d43e0ae7c963729d977d91cec293701bfabd84bf961891bca398b4d5822cde0ad64404fd23cc6b90b8e1fb9b2581b74dba49821b5fe82ba49484e42aad8b4a65407a785cf22fd047d479c049c284797312603010207f5c878f560369e79e568c45e86de75ff673fd83010a0d56424eb65e4c200b764ea64e04bdad6a07f93fd63c20530e0240d85d7a00a6cad4a828dcc20f09082b2352ccca4989bd46e49144c28628e0f37b1d818c83800ea637b328201a2ad3cca0469054664b9fa3398dc7f547a98c66d926f0d23b10df163bc5084135f518a50857ac89538990d7f64f40ce8d2756832b6b5d532c41b6ebdddae1b7d3692512325bcf20b6994e879b99c518de68ede70133c53e172db2aa584ca18e4a5f5cc91aae7b026de139b673738965a3a1c2c676f869386e8d2fa4b37965cb9e010fbc04e886d89f3d73160199a8865dd4260a932c5d9f53257f3a303a8ef46898221888ef291914ef487d1f4414d3ff0dc8ad6c84d00b0a7843064310f824ff4dccb4364cd8fe6e19e39f14156835319389f5a1885edeccd9033438059fe622a86bdc636998848656615a387cf5d9f854d3b9ca6eec89bef01448f3103bc8411021cca74f1791fe07bae7ad6810c4bc422b4a1f7f509f53068010cabb3d45e92b726d7f666b6fbdde0264a1ff0fdbe452204230b2c7c64c7611d36cafb066c3cb9aa9eab368b439ede3ae130ebb5eb462e9c81c0029777abca80b92dba3783d216ac01f4a377f70376631ede3a1a607d8317dd8e77ed568b481a14780d1de4d65edca374697caa57679cc918e911d5c1e20644be1da1c5193bddfbb00ec3c27892305fa7d1f9ccf8b886d609471b223f117c2590d837ad19e0f8435b295f0159f29f2344293e30ee82fa5e0c7047901152730307c35e4fc5930159e11b8167de7915b5300f2e0db5cb40a0e3bf600fd3e0804e4cc41422054c227055d648d989a704e4f7eb5c30e87eefa3a1f4bc51aa87a599f5861cc68a8d4ef7b4c891931550afef04968af79be08c294747d313a47b205c6ef98801b39e1f8f0d5b5606c6545cd68db4b3a812355f0f42f3e1fedd74da683638c6af486a0b434764ab72dd5f89c2400c72b03b25de010bba1352625d9a89429f9ae6a0079022b1d3fcceb06e890819b9213ba3f85228567a7231782e56f41b5e25965077ffce63807e0149f0df95da0b43f8e75ae2d81729957c0d614a20e664a788585e2e80fe1f9d3fc254e37f140597873809f6ccd65f65a5ffbf86d811a7102871646eb2dc75b5702cc5a073bc2ed7c57eae99f4ed7c427a30a08bc701ea84adb1abe5329e646280194944de12a070272a6420a2e1587342443298699740f447cb828cc746cdf798730004286bf83d5eb5781c156f28a2436d84f73dc20a6e6293eee3061a871230065e77370bdc7627104f1a0f30f5a00ee419c81fe7bfd6457c7ed909084e1289b08a0b2d86956367cb5a1cf331e340b5c86bfe4d8d72ed53a2daff56cffc8d21a62759d80b1954dbd17aefcb4563fe3570e3dd0436e5510f7dbaf2b4f869b10c320421c09f4d5abf30f3be6bf571df165644403cf3905ad839d6611775a1752e679b809a8e738b661f0d488ec73199d366e881927b9ec1e412b242b12e5b724c01da80a792e2d724b52223f9b1a36609139509a927271bffe27281659c83d12cd3a8bacee977e01996427e688a70bf74418d8c478c02216c9481edc35e6d991170ff85ad5121f07a4d1ce78886e74c3116fdb30c16f178c455e837277944d93c7b859ec7487a58751cdf62ca6f466343f81c61090d767252bd5f677541dd9a30c20291fd06a49183c1df1cb3485ac3f7ea6541c94d3a6a2cb27ed6fd5b66811619d920d17a6bd462ed1a0f902d295998d711b176b00657d8031dbe5acd527d631a7f5fc1c1fd0bd90f4ea2cdc53cf33b515b3b67e0326e20875f62757691475429487e21f7f40ccdb0593e930cc6d092b02522a54967855e0f05067c43c2c7e11b5fb5614854a6e919c8d3864ed6cf5bf4f1a180595e746d72a77b235ed88365353a168bdb4207c999796d17d922b4c7ecc955e9934ff52baf156ac1aebdf6b6ca214ef410c51ea037a30e38ac4cea63740ae3daaa01a09c38a76fa8e7f51fa26cdd136be8793ef84efe945cc352863ba137c5dbf7f4cfa60ecf223da61b3af26d30ba5e74f28e738073246416699c0372ac860a7315aa13f161f9d73308626308bde32d7c3c9b1c6d321117a9c37ffe8f1a6ec2970e9441e69c67593e09017b6ccc9955ea664faa1b49d92e9a9c95b92c429d3d37c317ba7b4c1c437160a1c422898522a198de2c12eab938995d2374d909b64b174cfcd4f6f6db616ad73eacf7d21743a75708f7982cdfeb5cb0eedb03eb326029da429e9d90f98df26be4afe3b92a5c72fbc42ec0b8050b36724bcfd21b97478f32490bf509e4042ebdf8abdb196b645cd50704e2fbbec4f4b0aaacf1828567ea2b8a536729386a49a001abd68b6becff4bb0a3bb0a009262be71ae5c2fc8557da7513192945b413d3c6a69ae979f12e510204e9cc15e19e7768f47cca918c2ebe4c4535c5490bfcabc66b20a0a2e482e65fceb79a55307e84adf7743424d568d307398842c311b0ae6607c9ccd0af99116fa3f8d1ff7801798a2c02ae503e7c5f1258958aaba2db1f15dcf8479ba606f9df7243ecc04837543e4410945a4698a2752762a8f9474e3828567dea96496a77f6982517cdba9d5b373ea7886077724f95a1b93c3d95cb399dabebdca5c8ab39475fa26b04dbc343d7206e97aab1de15fc3e6f0dad18ca38da2b2c7b9842ca5bc471fcf7855d7a57f6b42b94a0d801f620b73f2cb0d2efd8ad9f683f0e61a3a219dc010302c58ffbe8831031b89f7035a1cb5811356f2afa006d32888fde358460e182d80ef81f04bde0862e6662cb799a64a6b5a0af17dc94a45a5d0f53ce9e94d1717454b00e4721fa9835e7807242b9f6e5de08417cfe155c05bed32194dbfa654c2ff1cb159511246081b668064dd8fd77abd3b5654e3ed3f66d7830013300b08f5240877bef2b6d1c55080dfd66ec4f7f5b2f37ad9acb4ff7f7e7f36a530a1b1733aabd89cdda232a5c0aa311b71ab6a2971f33cf9c17f909d95e0df10e1048d28cfa3bcee6dfe668f0ca940c46abafb2f52cc8edbc92e4c52da62fb2121a5c8bd1f31970293084887e154354e4542eb8dc0e6238cfb344deb506010cb0428800099d10ed6771396cafa73b284ed13236ddbc1ce634d9cf6264425ccc1f6ac8f476141b5ca6ee168cc7b49e9129811467f43fc25957f7c367346e5763fd80abdcae6abb7fb0519eab2fae5b8f27daaa94dda53e6b98f5319c793225bb2621d6807588a7262409a90aaee4b57f6dd67a82b82a9bbfd59a48d02c8196c706ee6e8dccd7b0431a10a282b54b722953a514173fc56e518dbee35b0d71494dc54bfc41a2c0c30ded5bd908929da1abe916c40ea13d80c1e44bb7c612543e91ee893c61b151e9a55fb9bef142176a9612e9a46dd9db43764f41fe24538369032b742e0ef61ee9663e632a7f28284fe5f81e4e3826250d24a3707a3915282867f59d42bc7671e48cd050ad150aaf059e096af2766b37fd7469b1b520d29b1a9bb31dedb623cd3983c8f10bfcbf5c2384efe94c675a50cc63fd3794fbbf840dcb8f50d808ea8b70f4c3cd80cad0ce9a68a640eae74148936c0c32ccd6ff56b523b3556e6542caf46aee0e69faf774ca041c47f5bdf7e2635ecab2adaec01753c981e59e3a318765941952b16da42faeab36c4c0ca5f81d905065b82cdc852958ecd1ee5c8b3164aa6c61612e33081c72ea6bce5babb0c9ed9a28b95e7913354e1bd694928ce6dd5b53feb91732ddd4382809e6f060214c2d40fa0a5894170c9f2e5843f26e2db2a42e402317e5b061ca5b1721642e8a443f139524c7a5c2a8ac1828b8baf420b6bd35b8cf939a7d33de196b0e5144f95f4f319ad28ad948c8b4d40def204ad05b34405b0fcb041df197ab192bed4137ceb528e8c6e02ab00047705e38de13f4e93d00c24dbf43aca032a3e8279be8f75d4ed28501ea8f513ba2bcfae7155b4bb6ae9166ec880e566825609eaa85b689cad3da00b4bd177206d865a41e64f182fa1dc8d0fa1848971114f1ed84733c619994e35f27f2bd66d0de09a24e6935c787433ed3bf9a6bd017eb15a7cd2c44471db8f24893861b5ac2fd2c6eae7918c981583030bd97bdc409a96a41c46d271fcb06bac4096cfa336829c118147f3cc44d624cfdb106558f92aa4813e59b0bfb81a2d59100abc1d33d98e221b905e4a6199c997f5c0fe2abb486c34f234c2cffe3955f7df77f5651d225f1d3712c029ab562ebb895ab68c676bd01e453c541dd659cf0317eadd942d6248633950b438c31d72dd44ce70c50f5e92c22b5dc1acdc444a32211a2a6b3ae2de04e51063d12930bf442a7e5d4df5221b6c451e7fe0c21a166dbc447f795e242d9f2a9a5636d8abeef2842d0d2a58fbccd77927318cc98b404c3a3c58189f7be8812dca5cb96195ee8455d28fa27b7ae3583a0dea480351b8764e01aeda8cb95ba941fd63f0ea9a5342772f152201ec9874de864a1bc5a837acc307bf72712550c1988c91a4064db68fe57df15d412a16f7042a034658fbdb6d2159f81e5591ec87fc0b145f34ce707415fbac4f2b4b613e271d18867434542e19ad0cde7e9eef736d68d5a5ba0314758537c509027ec9bbd45583e383a3758706f431426202b5ce800f6c953333b27083cbf9963aaae9386d6df245a091b375d9278f0895c7c4e02252da617542d1cb02ce329b91f47033df7058690c03bd09256b5cc57b6da2c41a278d21addeee1fd5d786ba6bb47d07c6101cd5aeeb9954d2b57c408e1380fe47fd1b8b099842fe20ebea64707a3347260e2300518a22711c98151c53a39272c74d5dc7870464dd32576dc29d4a3f60328168b689e42a5461ece6f4638804297f5fcef90f8d31a6164936a403b3c5438dede74efd19b7d3925acc47ba57a39612a1590c12af333b533bd1a1e497e182092f49594c76d3692a250f0f6134e93fbe4d21b6242679fe8b90168b18c58cf5f51fdb67ac1b4a87ae6d32eb920dd35062d6e82efedab7b10d7d51043be027eaadcf5fb343475514ff6fa16f26466cdcd42c5a82651982c406e8d6e0d407504d11677333b9549706d1285a852300a1c44ae273c8dbc939daa01a3aa4ea0013b147c6c54b89e99880f313415b4fa9752f215c422416818b0c8825aeb2ce813b22d7441d4070b84b04cd8f2779b3783195897c0dcb94ac2be1ccda1de8c43e1285915d42199027b3ad7a69188bbcb8344270fb97e66ab576f89c9aec870a5eed4e8a57c60c5bf4e4ed9c862a1bea7e606a78ef3c1721c292107e94c3faaeac1353ba39618217db7d0ca1969caf834bccd07cfb802080a9fa90f2ed1d05b5dae307c953da3ea2b52f70917bd23ac31dea2f41e572dc5c472931884897284c404c2c64e3ae7f662478d4e7ef034995c72f2790d5174f975573401c805bda89841e2aa751f713aa627a6d2c7558283f231d5a769cf1dd940f52aa404d1d298b3cbec2f83da6db49fada325147729f58eed663267c5cc5426c0449f7e29e551e07599207c84aa99d2e9f54b9739a97afca53de8c1e4090c28bcb55cd33f0eb7895c6c71d4474471791f72b810d2d3840fbf361a9e2573855ae18e818fd0aaf51d87268026a787cc567a3405c254b763a15002cd74848f5a154a4729fd4a1e3562f78190baba32df993c5f072b6c8588fcb9e3ef4718521251c6e1046a894ebf229b1707aea42d602524321831ae5ec6ad35a01fb5a6399733d1d54d184cd02b65c4941ea3431258ac8f0a452b3ca2843f08b52a65c202d8220a5ea47be806258179393c7a5c3b0b13f79688a72052d0d86352960029389be232ce8c384be05a0f092d550061c9fbddffd6db94cc802a564da4087c98c526231001a1d9eb088baea87c3c375424226bdc6d786873be90423619336c593f30be47ee4e7bc639f66070448428abf01e31a66bcde3b130f3716d5a200cd676c84a01876426dc4977c1af8e96d9a0c7ea963ecc2649c22d06b79a61c744f10a9e52864585d9d9fcc92ca317c773d7148adb21dddad8f20884c26a3a9c4eeb9bebbf9471bb7aed0473d0724f37b806cba8640ab2308671a872f703727901e5e25ed3474f7c34d0a04af222bdce42d24ba4a26d0fa100fdb5da22d457526ca46f6246aa031ee732bbca814fbb237bff471e0f99b16d875855c86060bca7e511603d8d385e47d6f7daab3e701889ad81b36c92bde6aad9aa9a11611c17f98bba61bc4179403787aecc94ed0f842f0ace95aa8ca8d0ffb01d6e998642978d3b83c049c992ed23bdd8859101e4f875782061cb3e62907cc741445ccb3affa36c33144b9cbe0fe8d36df5b9e996be744d05a3e2021d316f6abd8d0c0918941792de78749a5847c1d048b66d54ad296f169acaa18e58bfaeafd4a0ebd33fa68fac30e322b0c3ac6e8617d74a282079721062628aecf4d661ea20d50a58fe0e8b49ae351e2ee90adb2ba49c5ec41668541cf18fd14a197979159e6e8f6a39886245ac4a54c333666759cf4e8ac2c63571af40d3a8f8e43e7d031e80c3ac6e85304ff11a30496f83b0b7dca964a6ebdef9fcd51bd3a9693bed9efee73239c1388eb6c4311d2ae7167fd4ebcec2477af8f81495d16c218cde1f92191c1409f9e14ae4ffa2d6fc3158d09a6dc19dc2c3d888066b42bbbd2da69d50a42bcd62e3473f82914ce473202ec159a8f872cfd92987122730f042d1304ffc760aa9a38048d690d6b11c2c803a5453a3d903066198bad018067a2051702e3a862e107fa400e64bba638da020093024684670885405935bdbb9060b347fd21e5f4a6eecb9c9eee131db8202ffb11f49eee11032207918d2644891ac34d685048e4d14a2674bc17bcab10de49b265a527d20ccc09c870b389251256cd1249531c92df65150907ac8eedd530ae8a3d6e10e3f8906228d82060e681631833ccdf1e0c03f4c3f1fa779db881ab9a0988c0c90bac5362dc56b3705809a1d6b5f364d556f1145b402c9b72a14c63675c5ae59d3150cb66b0163a52476174bc8fc4abeba47a090439a95002afc208b701193f7da5b4ce6212cf22af98831376849f23b9e491ceefb59fd1c635e359d6e2711b30256e79724995fe2f73b9799ed975df044796f161fe444077f9131274a88a752316bc03cc9423a4500c8e3985394315fa53dea93e6ca2fc690540e45fc10c90b0b98c0fcf6f3006ecf3fad485b9cfd48c18d2f50c9d12b337c22333d282848e55afb7b3480350469511200e5afb8d35c60baec083e470849f58da6e6f906c37b155632e1b34da2397652f6122d86e876c748d7e532bc068b8d9d85e98a63a80c4dca21050535af3a76196e69b9bb9f421b059520c334d9f88b30482b6a8df90145044ab99924146381a6c3f2848d563a62cf553b5c63c0f905334eee15be85ac8c4492f8d5bd94c96a1aeb15980d20af1ac3864d2be5f3d1cfeee02edfb34b0963ab61aaef69217addbc772700f1d667d2cccc2a8e687edbcbc0299342b542e67a89ce684b10f1f4e9b5a66af268120bfc2c9b80a952b14e54425c3acb06e92a685ae97e127314baefe899fdd8fe1e65d651721373f4b1f2fbdbcd20b8d4bd6377f471faad7b03c7766b1f49912f6ace0532fe80c51ddadf4efc60694ff047e2484f80c54209c15271d4d992058118c931f46d8045ffe8216ee1a26a9750dc72a1338a31156f1e579cc009adb1c7161ca81e0cafa42931a30f1c36509b6f20c949073c93deabd28f18f28ffcdacadb584a8b54dc8de5bee1d720c600cab0d13cb27edf5fcb4276d603ff8231f87ec8ca4820435b0ed548c4e826fb67e67f6b412513f6928b3a7befe9bc97254f109eeed6ee696d353ab54f50a6cdfc1ce5328a04cdbc0eea0aa684a19c0042128a19452da538b1db59e4dbb3bb655514a6996514a29a54d29a5a794524a69cd6867f476eef63ae222aa39ab15846045668585d9966527b0ed437b990fed65190c2367ef6e774329a534e22173b01d359dec127b7726cbb2b36870d03e138545923d1faa94b0595f8f207277f7c779ddb84873b7487bd9bd8c866666c6f32ebd9c416f487bd93f55cee2bbbb65f67efc900c0a5dc805169e64eed9617c898a40c19833c62c0443f2a7bd88aa352dc374eb7ea6c9c1b664efcbf50b20a76111d84c3184995e404a51a86bdf5097eab49713f347734e5447b3798342bac8a7a7be411f27284f36caa15a29979fdd0d2a27e5524a29a5947ea8d39ccec7091349fd740d1341fd48fd84a7ce0fed274c757ea0aea1fe75e7509d665125bdd593e87488b5131189ba9ba984a250a89ffe6947a1b0096cea1fcda139cdf2913aea1b8ae38e42dd961f130787e69961f723e2e0743efd389dc3a9d3a391086550bfa289163570923f9923739ac524e5f252c9164cc8c9700b26e0e46fe674dc37129772a7925ec9ef74edf2f4d43fed28ac9dae1d13d19eba3acdd2529f39a93b75da934ada134971423dc21ca8cc7d1b71a73b05c76d271ca1873ad7fd98993bd70191f9f42df68c92944a6123329f308432283c7390646de6c89694b7b85e4b5d98654e3d758acb5bad283c9548e123e699d39e1cfdf3a19db411ea473ad51e9735dadd6873c6bc1d35cf9d9e7229eac2f64e9b5653a9d4b98da50588659272fbd3b5b7d8bb3049f916451d2a754aa5b46f2e29a8d901415ded27ed278d5696ee47fdd4b42da6aeddf9d3a479a334a7c2ee66be4ed91931afe1ee7e6439b5cd2b50afdfdeddd49af215c11f92db01a1b99ee6c8d4619704cd3576a8cfa9a4592d73b64c4c956c39f374e3660eca08eaa76fdaadeda552a99a8619b6683f7d43893ed1ed6117e4f47ad445161fe95377d2347ca4b3d5b076d2449a86b577282de65a1f5d91874d92499a664751044b11aac4f8eea69e6eed6e54b82b8ab1aeb4b0b49cba0e7f45b82e76a2a3628ca2ce474b6d11b590482d5aa6c58863b437ba582e6985748ef4fa8fcb159f8290a2d534adfb09c7ce9e3bea915be9ba6c057f91c62ed2e86e50d65ad239ee9de85c77337f82d95a11893b094714c41cdc6be45652e11e6156e96e380c848da5ab70765177935d949daedd6f660d857a3da951879d86229dba0e8542dd586bfdb88cc25f9124ecbbad33d4e928d4a9ce6cbf9a2d0632cadaec7c985899a6bd884c752aa2bdac7697c49dae69f6a7fa9ae65010797057e9ce2b41542bf8ebeec475ef0ebb95d774776aeeb35b31ce617b8dab2b188856f117b9fbcd7cc22ddc494769aff8fba1bdbea2ea4f1855eb3f2e4946dd746be763e51513a9ef2e5ab95fcc1a496b41692ca3ce877622a7956f5a0be97462c1dfcc246d85c4d2dda0388eeb48b8c61cdb951ee3a65ce54aaeab47bda66b37b97a7ae99fe95f110e76281ca4f4d36b5aeb644e3d4b2a85bf23da112df5d3a99ee69c3e7fc2daed4fa99f80d8fa14fee229f5eea84e0575b237a1de753e4e276249279d54f0175d392bfb92e984bf0c20c9f524140a95ba316ba7d3e9f5749a61f763eb5297887d375159bbbd1f129c6c6bbd31fb407d5e763fba14eaf3f3a8d32d9d4cf89bb9bbbd1cc8da2dc2e552f71a595344b3baee1c0a220f98bbdf74a45bd35ed665dfe668eb6eea9d429839393387e6fcd09e2c2d0d9da9d5da1c9a2373b21325220b2fa4944059a6ddb4edcd181b0550fa6c46601479da798fcc1c2f121925b0c114eecf34d2eeeeeebe457493de9148a4d7348bd6dd7447261d76dda6a10d49e2226a3419d8793903a50d5764fa05acd07e6c2676264341672cf5f1ccdd525bb93bbbd59d1e52edb5591ce538fc6db86a1ad5e48aea20d51eb5ed51fa26b090b70d6c6b4888c2f58a1a11869d8f31a3a21e6656eb62a6ca3466d96bcca2a645ad1b0536dec1d6cee8cc820b30bef861224eb4622ac953d3a006b5430177c4ac61b9238a3861b0fd2fe268198d9c53cea9c211fd887e44a7d76ead9a5682db60a1e1a803f30aec07613bf30b9366516ab13f55ac83954d610621fee4244396574396191db23c9d50f06cd007bb4510a064b845109ccc64b8451655c84f08a32423865256bb0d41857688ad90981142e687c8f35aac604b085ccd1f86d082729d2990956fdbacac4bd25488c6996a7637dd59a3c0ca3714aa4b90385570b2248f3eb3ecf49372754eaaa23e5e56878d424a29b34c7270c7e8f433b2e2e92b174733f14e23518c4674444f83cc28c09082e62119361233edf7d0e8fd06b883fb178d94f236ea92c83eca3e126da31681a13da0f67a07fdaddf0046c716ea8f688321d47464246b9e26b91f715c62ca646731eabcc0daf6647f88e75128daeb73f52571e2e80cedcd08f127244a0963cdd172aad45d3c98993c697a5424da4ba56ab5f69ff728116cbc14f30839ffd57ba94f482e3293652a27e688f0bdcfcbde986b2f9b8919864566386e048d63435fd34c28a66fb0f248b43767744189383d868210f22108baa48e10b2518e6ab0655996d5f496dd98a4352dc361addd490226479df6a690acd13969c6c1ce07137b3bd27ea6e75d3b4c7c7653a3fb4158a6d8cec1b68e90abd2658492a58c4e9a745c9265bc22472531497b301a9a9919d7b38f7451971c6c3fd2f46816e4020bb12c5f53c4269ad9cc66966d7156adbe66b562da034ba34bd66aad9c14c725492cf7ee467cf447b3e9b0b54b608fe48fdea654cd1a5d4e7a97686ffbbc4db4b79190686ffb8e68591b65a3d1696a86677b191ed12ccbb2f9233d3f395736e78c491e77be20b2fc82c8f28351f2f6e89232d31ef3603f08cbdb632cd7f66060631af0a712d5235cd23523a3cb76ec6cee03759d4203164e7229c32db05842c1b030dbe2074be88d5be1c34720f1806353826ad3c3e5b71b3ddc68b345ae07eec685363d5c68e3c38536db16b9183445f626fbd2cdae803234bbeaf4319a76d5fbb33ffbf3e5733e9bcffe9951fcafc4682f9f3f5092e11532dcc2074fc85b0e203821300d1a3133fe4317e4335d10d5ca6b64ccdd86607110fef0c3103f744162668288386464621c46d3b2d36f373a20b187ee87f699dd6bcf074d53adac68f78b317b44d0f4b05ad9a8518366fe8399d7b4ab0e03d3dd689a363501689a3655b80ba25dc5a333626a3800dc8d6b45b4f10197e03637dec32d81cae6069e4e5a08fa6d08ae755257a93e3ba246644299fecb8032bd6acbe8304443a85960346b08773162e02fe60fe6319e79d1ac2fcb829a45243b50b3b4d36fef80c497245e3e67743fb24fd5cd605c4782c916d79572723e446744670d1799c9d9b5c379157ee96ee637d53d7da2aebaf5b00372647e6565461133306ceff415d4e7ad575d98ac9a4e681051fd5f39fd1c02dc31e3f4db8cfbc5985d7ed59d9f31572eccb8658a99b5bb64976b777eebc1d153d4e95bba1b8a5bba1bd4b72a943feda86f10de74b03ddade9239efe9a8ab6aaff6803270beb6390427340e77c424e6ef84c6e9e72bf2802c22f3a76781321f0b236aa8541aa5d95720a5f434ce92692b14d6c895dbaef6680b901a8739cc6bc000703ddc68133b1ff3ab770ecca14a4a1704c7c4e0153e12333e99eefcca8ff95f6524e6fb79a788f9babc7370cce969e703e636bed998f129e6ca69a83ec5cc464a59c3de515d907f054f11f30cfccddf9fba203157e16f1ebf467ab75d366abc062682637027c144eef3dc69160dfc694b9a754c44bb258d066e0182577e2466d5312672f17127e91fd8af5d997ebe9a35037ff0324e3f9d344b8589c0cfd315fcf632202f3f2056b5977de22d001cd7f9e89cf6e88fc4dc49a09c1d617619b7b697fde5daf65c58de82677b2c9fe758309723cf98ef25cf943c5f5d9e329047068339e6fce42811ec7c4ae532fa8fd3e64bb662905cd1dbafe04f85e9f6a64fb9a9fb653638dd76352b49e7643011b53128539cc1642bb3015cc91b018b8c07b96ef8abd9c9d49123f9f845b36a0c6a169452f6982ef5f60af966f2ac69995d08351c89c446e778c2a4d465f371a90c61d2eb555f7e9ef5be982cfb45ef43b7b8f7c77d290805f7a624f7e7e88adccf9a78e1ca5fcdeda45f7408b63f633d63b93fa14c2a7195381348eb7987c8b9cc3260c1d261b3c31428931d8a2e9299301355ed233ca5ccce60a38b0dc5df74c93db3c4435270870f98dd362b7bcd9e0277bc64aa5cd37008c59f6ae2cfa58a4642e5bc410f94c418799c96e03413769a44398caed891b11aec44d173b877f77ebca259da1ba20e65eb24b1a7c372dd0d93eea707af57e47a4e49ae3ab97ed8a5c518333ae23a0937d2cc8132f5f2833eb9caf088326c6b181beed8149b4e4ad92d917de6c8d5e873a4929409d1290641f6c9847a72554f2f16376faf7e9e094cc544686219d240e2a38a8844ab620824b58a88246af105aef8dee6ac977bb69dc827fa574f1f39fc6dafdb7622f3da547b1de37cf649fc510be347f7ab228beabf49ae5efa7d551089a7bf54fb471f711476f4f8d189c4af8afc75e72cc366655f769ac19863dd66cc1f921c738691871431c31df8ab22c769d3f14a25167e9330b0b059dfbc16593bd4224708cb44a21667d3183fad566b55aadff3268ec206e08bd1e084305046be0a56e4ec6e34c6cef0b0f310b992f9ab9d21e401b3f4429e5ec8355df2628b9e1c6d8b223c9973ce392b50dd2acda22a6659c74f2645685284243c4514e10a9e8c06369b810c6c6d2ff2d020b6022ec6f024f3c8900b31e4216bd9a715358955a28a5764f885508670c2d87d6034f22a151ccaf09e9450beb09f8c995c3d5b06f908c99584b537539064ed9f8441696f763752e8248a3ca3cfd168242485a255c99fee7cdde984daf79366d1885bf57d949213468a45f999d9fc8945696f362b45c62894665d40056b56f5d11ad718559af685ad9a8cb5376718ec1779c0205bddc4896c28a5cf129e2e51a42f2779621717f6eb9da9ea27b20b1c2fe727aceec825dd7fc7d857f46df6453f79e4caa228a2ee88254fcfd9d32c0defc8567455d70c83ed9d5e026d469f60b0c17e1326a9fc696fe22f4aeeddb7ee4aa128d8961ff6f21249e62618f1743abca88b44a7292a77523077ba5f8a8aa84864923ba4f938a14c9fb885163cdd8f2d8bb00b320f6b6f4269efa759dd8dac160cf97929d4acee33c6ac724965dd4da731295deb7015303658b4fce82e2f31929cb1c17e92dbe8bca2f14779ba499e736847362b7ec2e83b094c4e18e7c9d3496f97f321899797a2d3fbd8dd7439b983e59adee476bf98a3a4378b6eba961dfe9064ee53c6a2344bb6a00d2781f214cd6ddb62241dc95bb6061b5f23b71bbb0e77932e078988d247ae97803194a38cafde91abf95a6d0cc3ca8b1e75da6bd1951bbd45b8d922b045b82c7292a7480b2fb20f196ea1454fe692f42f870239bacdd3de849a4884bb497b5109940f7601ab3e30a8a61ec2666678bcf3f0d49ffe913bb24587d81b7cd4d0bd437728fe3c2a4577c8fc6664e20c506c64de967266531e7f26cb20b2843b2e1450660766026d92158228c41a078ca12198149664088b024c8b0c615100caaf2e32dce2f5247f718b0cb7100218124208e549427921cd8257b52731b704dc119790dce1e9746116fd7c48247782e72e2f3c773a412839dc52f187a4ab7cd5d8ffa292dc8f56c871ce18638cf4440823c32d88f045fee20a32dce205062fe43d9d2eba43e43723529e4ea7cbcbddaf8a20955ed26bb0b3a6aa712e27f80ab3892e3968e585f0745265c8a5380e6f17ddade3203c9dba436f8bcfa20f990cecc4b591b48ebdec68e9406d2a366cd810be29cd62ebb78e15e518673a76ecd8b163c78eddf1dd1ddb0e5bd3c08e36e8837d3c4cdcb6e824f6c427cdca3226f55b9c8fafee895b06e1e7d69766b4219cdd8f3e8497be6f86e32bc30dbbbbe18f74061b629af69a76351f84d19b6a0f36cd598d84147ec22bfa690fc27e9689a2c41cf05906e1219e359bcff08f32cacf22dce6b96cecd39f2c21cdb12d8c0dc258d1acaf21fe6218edb51535b0f45f0ca3adc853c2204a8e85d9968d322140d1e0b0c9967205567ebeeb6bbabb1badd6aad5a965a34d5e93d7ae7ddad40b6cad7fdea264227a26023b2f6bb5b6c2ae0013475429d5ecac1a8696ce74d66483a20da6278cb1bbd13408b7c9b50a2c7daa59f2f266ed047a9055230524c0ac7d714986309406427032e79c33ce38639c6158f999454ab548238c306619b6520c9b0ebbc53967e764faedfa80b95e87ddb66ddbb6ad56aa699aa671cd3d3b81e5be6d2dd9474722226ddbb577ddf623fba88b35455c236d1cb7711dc7711cc771dd1635a969b556aa554dab9aa655b8fd79d3ea156ddccee83491a77e7bf6b8b324cba4ec6eb8d720d94598cb4e60bbecf394d6f49015d339d8ae47ee82c89d0fb983c99d4bee3aae3b8c3bb4aabccf78333434b487906d9c76b5159d847ed3e84637ba7d7b76b3d5340d15ea5e2d9423d1f69ae6baba452fba553a7dac1ba6dbb6e16f8463507bf41428d36a39fc59086f2a500ca2d1e8ced6a306d3b44777b2edf5722e2ddbb24c487bf49dc48a3eba91edddb651ed36a54ab5c77dbbaaf6386dd3b6374eb360eeea5399eb66b3b677994b223f24d98f74aed9b59bbd6ed7b46cdbf06caf7bc5b5bdaea3f4b5da9d9807cb6d1c47cfb27d51c996697449afe869934ca9934ce9934ce94e7b543b4df7a8b9351bdd7a6b6b4dc834cb329aedc015cd329ad18c6634a319cd6846339ad12ccb32dc39a3be6ad8204c69497bb3478f46cf324d1b6534fbe9113d46f79bc92312fe4824528dd4463e3253c7c07e9df3b2afee9d5e62c22d3b670e3d7a7e8360e469a717da84507ab43787686866663cef311a3958791f169c3394c77e31461f63cdca304d4dfc893c8a8839706063f355db2b7d4292f6d16336ab353d2ee996e9f371c774a15cf1342b9b1ac93ec35f874b73c78eec688e7664e4d181fd684a3846d16a304d7bb1f88f6689f666bd889e8e4af694ceec36653f333aca6eaabdedf4aadadb38ae649f7d444718086b639e9d334bcf60f763842d1ebd948db26c4447da6844334a5b7a7c3ecaeef62bcfcf73f74be5ed34b215639126d2c43cd8ad5fcdfa222c6f3fdb6d19b0667625393b818dd2ab7930442fbe88319a3c4fd3acd1e77bd4681f8d2a07039b45181437a8e860df406394d250204a4369280d9d74d24927a5b10d53f56083305fb6937558ee24914824a2935ebb1f874924a12be88470ca14586e3e8142ae241671a659336fd665bcdf3a6c7797b4c351068e42ed494e8846d15168288a8ed24beced2bba95744e0fc6b7d3204b3166c81a40afb54b1cc0552cf2d030d5f924c69206140b597e6b6e76b7c932a9f55228bd82b50777401d365218156a4fd22c87d2471a5d194eb3ac6896d6c11d1c292657920725bdbb99d22fa254592b4f5f64c9cd1c58b3e07c02a364903db2afe9a7fbcd16642945ccb1bb394561fa91994fa7945424bdfbce27edc915aba2d6e5f1b34b62e5e5f3b3e5137f2c389ed292b5b645dae3a6915a7e6817dd8776114974119eb84bf713dd24e32419af699a723aa57fb12bdf68d79d46417a5f44ba765a6a2161239064d2b58dc4915eba0fd24b1c298aac89aea2c978878fcc94cf2e888c6b98888c93309197d38beefd64e0f972d36507e4f4e30543177c4452fce1c9828fc86c6fbf82db524b45d4521155514a29fda15af7a331e97412e92afa78279e36b013f749af912aef7955da9d3d5c097fb5aa3cde9b4e4475d2bb03723ae9b1fba13ae99f57a5125195eab374b7c8a92e9179d2b7d2e34745dae3b5d2bc24d23bd3188793b6fc889ff7113f699c78aaf0574526dd74938a8455aa7b7a7f42b2e92af78b229b4e63cda251bad4dda460206c2a858fccdc7d3a5d4ae79c73cef9e65cb363535cf18ce934ebc4d5cd74b39cf6e4e94ada931a3ddd389fc4ba47b6686cf6644a9a85c253cc1c9b653add64bac974527763c240d8f8c65f477c64e688b59829a53993d2c9b9628e784a659c944611f5694cb6e2eb4563164b202981a4ab599fc449e26aa2bd8e4238cd9a3711a891766b317ec75f89d6aacd1ed97537ad031b63cd2295a80079345014204bc445e421759c1059da7944a12540168d3c644fcca104b8432a01cac8734258022589e54a1ded68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea68ea3675bc0e3baf7a03649901f61a224b8b03ccc21c72136014da6de834c02e43033dab61aa4c95a93255a6ca54992a5365aa4c95a93255a6ca54992a5365aa4c95a93255a6ca54992a5365aa4c95a9325554b68ee3baf8069a579859984d28cd1ed28c32a990e5b5c94596973adf944296f309590970c7640294e9893c661759cab94596e7a2d08c2fcc9821c30b3264bc74e1e5c5e5c7c5a5850b2d2d2c5b606159d1c2ca8a2a8a4a15230b3162a860414525e50a2929a9582a85b2020a75aac2e964a282c964bbb0b634855289240512a98b42d7713e1cb74161db465c8c46a22d44a20aa556ed099a963921cba81654ced904b8434ac904b8a3bbb3803ba23ca9bba12f45cad1780a3b97ee0878eab88ccbba45dddddd4db30602024ae994eea6afd2dd3c99b03c678fe6f56974bc91caa876d489ba6bc74cc343a0684fb27072f6342bc21d1296e55bba9b325c5a582e6c6f65f6e48ea1d24fe9a784faa6124fee93fa1d2cf7b9fe16cbfd11506eaf5fb57ed655e604090d69389a4bcbf979f5c07c6230180c0683c15c2e97cbe572e968311d1d1d1d1d1d99f3330473e944ed277bf5c07c623f4338ae1c180c0683c1605acce572b95c2e9716d3625a4c8b69312df6037369b1ce7a6728c3c95c594ea693ed04c17c623f40afd7ebf57abd5c30180c0683c15c2e97cbe50a7a0dc15c9206c17c623f4041ae1c9d9dd7ebf57abd5eb03a0483c1603058d06b0836e72763d56573543adfa12ffba3020af284ead0ebf57abd5eafa13a345487ea501d8aafa1d71095369fac31fba3027a9027f492abfe0cccebf94bc5637782825eafd7ebf5aa2fd9a21998d7f3978a674776b556250a1205898244412e91c6c91fd9aab1d84ccb9fcac99884d5c80a2c1f998f197640b6d10e124b506183305f0c9c3cbf411e58afa505c9d50c9221b010c7569c0c7794b48032f3f33504b05572425ccdcf521774b0d0823c4b5238419e33b03479cb33b04c23c5f478603f2e674bec4a8eb7048332f3d40956fe2bc1a89d2528bd9a2f45c9f3415a504907b61f67c7c09963d8fa5bb794dd9c93524a338e7659966599c6659da6699aa6719acce99f060a128aaf9ea1ec234760bf0a7347ca850dc2c82ceb2c628c1b6c19638c31c688e9b3235818e707274e1424dd3d6f34b9c1f34222bb7bd564b564b503a164c111ecc709e5d65459abe784288e5cf56bb516859ffbaa57ee787a63bc3778da8370db9a8bf1748a31c6d4e36fbc6ebc8e323d756f348939a209dfe0698f6e91e22243da6b8a2320c4d4f938a2b5b05f1daa4338b26583e4aa5fabb55d88b2a9ffdeb66dcb3648d36c906683341b34a2f59013e2b21664b30fa943cde232cc2a55a924d4ab7ee9f4ae764e475d48e9e96e26fa18a3e9f4747bbc34eb6e685c71291795baa62fd15e63211cc591b55aab52751427376df21a86a82f72c956cbfb9c8f6cb1bc5596f4cde5aade32ca2e77e52d9705f5ca292096f89588bf235375635c956b8bc8584e41d4fb1b0a853abd2b1e14fe9050d8a5bca651a9550f628ef8d4e98d47dd14d46a49cc419f82fa16573b2917f578297d0a2fd15ed30834eb844f1168af6fba898b49f1bde3ae14931ba580727fa69cdce7642c7f9c1012ddf2e411cd8ad98a30320cdbcb1ff4c98860eb906c7161741dcafd6c089613a27872429c90ea95218d2a3424a98e0183ad085dfe6c962d2bac4d096e8345ecf7b54d58438c3a64550b320b137e70264059f122b79870877c9de42d9bb223cc3292112dd7942668217359e45314f236b90883f9a0457b2a6777f485bc655cccbe410d56d27c0265e467165d8e17c26067c8dadd3a3b82fd664f86309b2e6c6c3bd80fc26a8e902e1b737f3fdc319370616b2ae10a34df0f59fe5b652ed800cb2b79f6401927f4cc2b65131baba476d8b29d2c07590eb21d9a58ae5b952d22f23cb05f0c18b9c60495b8f9ac7f89bf79a9b8475c215858ed32c8a4cbf0c01da3d73cc210cac8fb7d20284bc9443271dd267be93141b2352357b5c6ae7408678c71c6967272df24276716b393723616ac9c534a29a59c34cba4d4ba9bf9d137511489447094dd0d8c5ed597ee26d49e10dcb64929e59ca46f94e2b943332ecbb81dad723aecdce96e8a6061eaec2869af4a2d0756d41961f3dc69af6e4079f322d7cf1d3b957437dbb6c5969366dae8c2dc4db9d1a82b57ba4ce84b3d325064786460b2456578647c6282628262be8811da9a58f9afcaf77db4e4110682956762bf524f7fbbdf7c8cc3b136b2c426b7b9d16dc4490d7ceb1468404a4ab34c89d7b47ce2b1bbf9be49d9dd6ce09203f3094ab3ec0997e9e2223bbab88848411c30c4892446dbec6e3cf0f9816e88135d96b5e066c8352792e0368e763720382552bb073c4380a6d5eee601af08903165c8901d65c8109190a840130d380010aecbba1b24cf24d0806ba55a2bc071a2eea601171d60c69c3143769c31434402b2755c47d2b48eeb14f04a00517763818b2240e246a3cf5f76fc452413dc481ca954bb9b09bc2e40c4913a262e12621a753714f8080acb6ddb9df7ca8ef78a48b6c4e9b0b1042f753746a21517753718b8a8f311731423ce7691041f954087bdc0b7ee268ae0db084e1cd7dd44129c2bc125030e630a3470820c1cf9d6dd5298c0a501147ca6408927be156c8003dfbabb9bc88227a648a282efb3bb892c782288130e7081073ee080214e7420a7050e18e244120848000c404024010f4000152fb85492800720008903342103241268a20107a822061568a2010700420003e8148180011440001c0b44c0000a208049c8b73883c7ee66028f0bf8d6dd310497dd0d050ec5129fdd0d1342ec65541213d147376e3aec88449235b03a6c8c1bec1ad4c0529acd6b5af723ab81fd6aad7523c90ffa88ee1172556faf1028532fe42ed15e3d13770133b845daab87e21e69af9e02978af6ea0970a3026e54a27363046e6c62811b0f7063036eec42063756e0462f627023026e7cc06d18dc56a2e4f6152fb8edc46d27edd50fb9ed82db5db4e076949cdb4fdcfe8205b7c158c19556a8e0ca2449ae5492822b97a0e0ca2627b8f289eb4a2826b8b28b125c0906125ce9851557823182fa2882fa25ee02ea2770eb6308aa01ea21505fa43ee2dc7a20b05cdfc4ad97403d12a05c5fc5ad47e2d627e0d613a907413d153bb93e890ba18c036efd077c72bd076e7d07fa27d707e97a0ee0e4fa0db872fd14b75e899d5caf019e5c7fa427d7670096eba5f0c9f50ca83772eba310caf518b8f517c0c9f523928cdd98b7eec21c3b2dac24c10bf3d675917242b84842b848a4c6aeb971db3bbcc3715acc9b24bdf2e83a2ce9d98e257deb2cac283b7d9581c900e5fae1c0c1b18303860328074e8e9d1cb01c403338333b33b01920999f5c3f99211c3a387a70fce018caa193a327c74f8ea1199d999e999f9920191f99d8271394658472fd70b870e4e0c0f1c2e1832386230887500e578e9c1c395e397c72c47204e5109a71cde4ccccbc667c6662b9c63c49ef4e896813131493e1c06af3a47f323c2c319a235b47bcdec795f122245b3e3ea488052e80fb52c46f6ec45f62b225804ba0020fc07da979be50ae2a709b97976c05e00f980005cee3bef438004ec45f72648bc79f804004deba2f341fe23bee22245bad2f000a075cc77509e2429c7597986ce9780218d080e7b82e33ffe140dce5255b39ce84029cf88debe2c3658ee32e39b275e306404013b7715dbcafdec35b8464cbc609b0c4014ee3b6c03ce635de12932d1a0f224489cfb82dff55e22d2fd99af1fa96dbf292abfa961cd96a69c91192ad184fe23290b80b90bf98aeb25fe9586e4c10eab208c955fd8d09f256542f2e320e63b4cca8110343a387956703878c0f3780f86126074b882074ec1882a64504007af0b0c9350130e2a608011460003f7c1c11131413446384b29821915c896c60570091cd0fec27c323c3235ba7d7cbbc647a642bfb24ec5ecabf199a0fc23ee8f3c1d8077f3e08f4c1a00f0a7d70e88b385f747d31a700ffa2ce1777bec8f3fa62cf17615ff4f962ec8b3f5f04fa62d01785be38f435ced7aeaf735ae7eb9daf79be7e7dddf335ec6b9faf635fff7c0df475d0d7425f0f7d12e793ae4fe67c52e7933b92e793af199f0c4f8c13b90a466448915be0332c803fd923a308fee4eb85c78508fee4ce100954e050b666fc3b0dcc129339577e08fe248e04ee1f308143d9a2710adc0605f0d743352680bf168a819100fe1ae801317f020287b265e311f88d08e0af7f7a8000fe3ab6f2f11e80bf863db1fa02a0b871073c8703f0d738fa25e3c313f8eb1d1fbe009927800187b295e30db88ed6018201f8eb9c1fda35b300fc354e027e381340e8b8136f3981bf38c48a424204059100fc45a020ce84103700020e65abf526cea309fcc59f1d08c05f8c0de14313610618e20458e250b678fc000fc001f0177b88882f00f0f43000fee20e0100f0204404e04a449d01c49c1f41f0175d3511a7e6493c0fe527719b24f0078190b8006090000ee44508157120bfb9107673d38d30e10ffa18717b1f3edefd08f873c4bb1f2f711fc0cc8f7bc4f5f16344ecc6a7089800846c8232500d1c0a800e11390070f5c0e1d1b3e335040fcd4eeb871513c22708988e2120847e089a8940397470e4c8b87cc0b9d1d3c36bc5e3edd8f8a9118bf18181d118c24237e80d34434746ce8bcb05a7a587e5b5c2a3da89f161174dca4c097f5eeef0f7cc12932d96d88f6ce11cd165f991ab7a1620d9c23a72555980e4aa4ac9128bd9886e61e5493a2a43a4bc09e5c04208619d93c527064eaea3a34842b8704eb75d9803fbc9f00411d45e0de28b5c5fd3228a5b704e7bd8056d444762332fb3603f96d8a732c4047d866382b0d0acd159622a432c51f28795e09cf62a76c955bda4811dfd13c2b509c504e5c0ce9d16e47a7aa15c6d56ebbeecba0f044d1d2c982e6f91a9936d4d9f387927f98b098237990fec874ba59e98a0f91a132479eca732346a791f2d5962191e2fec57ea91e1813b62aea5272558ae5c2ef994bac8b51423bda6bf12945c4fa1d84f65c8b4b324d7db4be2eab9de1acaf08c4a25258c2e59622c51581aec322673f42d154b9789a86d3a0b9bd5b022d7cfc8564c500d1cd9126196985cd55b5bbf1aae5c9ff5a0d4537a5282358bf4daa4b3c4587e723d6954126a0f6f60b4f7049bf1c076cf96586e83f0ad85bdb1b3b0938b09da5ab8d8f9187de2d6c2663bb09f8c102e79199e4a558648cfac6d95a15c65787460b5fc2129bd543f9658aedf58b8991bbf54eac9f5a42bc5a4c2252ff7d1fd1a1791434224e916b4a942b872fd26347778720d1a508e9fb132c14a3921cdb66ccb93eb8c4439d00e889627aeb2353afca88b31de227228cae843b74f9f991d61544fe3d02656dca2807b9833814f0383000b1c9980393ec6208020b887f9c42d4bdcc3fce29817861f7ab93831c6b37c8b729333b02aef2c6c4b8a507b4a7ccb6fb99fcddf0a0c66968bf0e852317acaefcd3fb7b035dd323f3ab4f9625e29417fe1813b544e55308432a29bfdf7e3c04e2ea2016519578a985934a09857b683c8238a3c2c2d2ccf712436325e65ab8505b72800e6f74bd0780e4c05162ca781a15cc9c02c55aee61230a7711a13e3964172b5e0d6e92b600e832f033f874a450343b9c25fed9527993e5b627b625e314e9af5d31c58a62c2cff8d5d449ff6444ff144a19d4cc1e8153d0b8e3e31af668d325de1ac5c99e2531a59945e518cb116b62ba201e51aa306a485a8a5642c0bfba504fd4b098a50465e4c458eab6a3247ba4daeb6e4aad5a855abdab8c98d7cb4e489638ef12f95e39cf147ba5aa73dfa99195106b3b033316a7adb661e4f190fecead99298d711354352460ccce51bed1e1dd9c2d147c5c7f4b2019381a1e5599466b59c3efb6956d6ddb4b44c51cc4163b2fef54ff6e3dd0c28476904597e2843066e999f19c5825be6eb71cbc4bd53e32f3c26d4ad51baf7bb8d179eebfa1a96e945598c4b4848c825c665f10a7f5cfe22cf175d3337c69521b012278bc5e00ed209a00c65f917239fe59fcd6761f9bfa1b8386dd8953c492e28434f9d602f57f4235597674d7f08eeb0a733b24824aa59442faa315b5c7c6ab535fa449f4c635e130c3665925cb7c6dcd2e715e59857cc2be615f39ab9cbd5de72b3cfbbe528d42d51a85d62bc25c665fac4df0c304c795e5e01aee6bb40863c7fc2520d793e069642df8cfc65b13bdbe32c9499af57c6a0cc1c7a0283f2b2370aa14e0fe18c192a155c3de6b65c974b5272493a5086d69b6d544279026b8fca283d98e4d2c2aadc9849f9a549b3544e552ecc362eccddf9e0f23c54599b65c8e815bd8c6ff30b56c66bfa85a7591c97f38764ebaa6afce5e5e4a507ee30cd99c5ee48a5b667a14cc457340b66ba249b55cbe28c353e8bb3e25ed21eed9df6a89376d21e3dc9d52c4ee52a37661b3766d5fd2e8e1473753f53fe482e79851af733c92b48d1f9578a987bfa8ad68962bbc894c614fcf5131e27add33a948a21580eb4477fa43dfa2822149a92e3fa87fef89343f98f34300ccc1d1ddf7b1a75a38161a0090ced51a0f6a8e907cad06f3a6c4e7b340beb72d8c5c45c924b14733f2439e6d9136b1a8a45b0b186a806be1184984304db3b5992cbf40377d4d39bc0600292add1e98c9bba007944d6bf9a631cc6c89aa03a2949b3b49c664d25cdaa0177d8387dff4816ee9f179e7b733c5e1d07e28799207ea466219ec5641380b83342cc3c3e889920301076e65be48298f9b919085382644b06fd2f335782017a3fdc296a0602cb1fe8fd39ae151228071057fe0871a7a839082ca30471651428f3ebb859c8bfbc02103fccc81fb9fa735ca0fc6f590ccafc3117e626e4951af7a5898dfbf2823235eefcbddee3f5e131566071e3476aee6175d195c248cc4396f9919a713c8b6d37eeeaf5665983835d3d5e66f56dd4ddc86020ec4a66b5c23f852f3cb2e5c1d54f67f2afb2ba2ed0ebe14e51f30dac82deef5d2b0e7ff84750058e8df74ddeb82a1c778a9a65700a7aff36656e0acafc3efc372e93d17bb84c5cd566f4d555c9d5efddff9a16b99e0de4f9942fda4b116a8f6a4f096a8fc6d4c7bcc6fd90e41a87dd4d8dd191d8cc25ee47980a2ce2a918fd621b434bc0dcc3602436117f3684328e255b821dfda2fec293fa4772bdf4bcbcda73a204fb915cf7b6ccc31c7f745b266e51e27e7426f0613efa7d0c5f0da8f211551645273652f1ca53abd7c6635e2f923c6f1119cb3662aeddcf06508e798dac7163f04c794a50ca1729422960344b747a9818e30fcb2aff48ae179e9726ed7d9e651b75f8e7620b9f0d368c92f47120cf245897c76c73ce9392b447494a3027ca2457a704915c2f3c4670f985a7c77e45e4d0bca6cdf84891604f6741924949ae171e922bfe4cb8f66efa91ad7b7a286b26e3a41cd982212521e9c8168dd31897a4b6beeee834ee7d71123fa7a9d6548d5c0b0c3d8dfbd223575405df0be76743287f4766d6be2912e55aebfc91f95ab5cfd592a9e1da5e16e5431293adfe912bfa9ac566ff6446b0db68f2c07e359350df4849e20b8f6c45211521a95242998efaf6d204673cb0a628945f78e4aabdc8f4db4b1327765eb360e816b4a145b0736ea36d24e22a47fa7fbbcfb89fcc828cfb998032fdcb75b95f6db9df59ee77a0fc915c9f48753fd20c327d8cfb998432bdca0b4fea7ea97cea22185dc29fcda48e53c915891b5d68238af885a73d9a12941294f245b75ae7d52557cdd289797516b30b249e66c524dd4a0992241785629f643127598cd424531569494a502a882382a527b964abbd7065fa6c08b681c0f0a504bd28149b09c17e2f3c999efe85a759dae95f9abcbc62cc9ad879b5227228c67557a63157bbdc16a18893adad62554424d94492524523a1a218022c6c10a6a34d76a15c8dc0ce6ba34d2c431a330a616375b3b6e4ac0910138ec8065ed6c0a6f008fe5511fcb321f8a7ca1307491520a0e2031ee80007363085068e64400a235160e002162842e4abc0100a4ce0d99bc9f589063060014e2820856b96caa36ae52c2d2e2f2c19ac19df914ac03b21b9ead711e0af5a11e0cfaa42803f15fe8ea40a520501feaab52ad5ef71800424575daad54e813fabd200fe543f82bf7b19c09f2705ae46f0576d14f8b32a0ce04ff50be0ef16c09f57a41493abb63344f037e37df8f35e01fc5d35047f2a4b01fcd9095409e0afda08e0cfaa20803fd51f80bf3b000a0b93abb661c41cfd9927f037e335007fde1980bfab16803f95130a48b937da70b10658865cac6126432ed480870ca9f8573ff0cf7ae09faa03ffce817f5ede8036c5bfaa817ff6c83f5506fe5d8ac36ae45f8de29fc5c03fd505fefdf3be992c3a24f2d94f35c4e3b26fe6f3f2f74ff5d9077cf5b34f7ccff5f3724d0179bc4ab6f0e38380793c8d6cc53cce7cde77990099f2d53ce206f078db440079bc0f341e3fd344c03c1ef2182d8939fadddf44204184eb36481041e3b1c7001e2f6b6063b83cb27ceb6e1997ddcd8cbfc450d1747a721f96fb54e0affae4fe07f06763b9ef01fca97e72bf03f83b50ee73006b5d50ee6f00c7a6c01ac047b016cb0096029770755558c9088e0263005f005b0017c1df0c118c2b8087608b2b8cc314c013c012c011c010c09f7d007600fe2a14f8b34fe04fd500fc9d0118854541a32591c7680830477f01d809ac009c009c823f6bc2a322e4fe365a92efad369d1089d409913a21522744ea84489d10a913cafd7b351b12cfe9c473e239f19c784e3c279edcbf37b32101954a24a01209a844022a91804a24a0120928f7efa536251d6b75ac8ed5b13a56c7fe9be9df3b6d4a31d97a2cdf2b6dacab566b55aaa3ac0b655db97f6fdb58980d23f2d094c41cfd9919cffb552a6b37586e1b46ee6f959400cce406c9d68ff7473cb275df1fbd646b00ef8f7a640bc8fb231fd942e29dc4fb9b4bb608f0fec6235b41dedf7c644bc8fb5b906c29f13ee792ad02bccff1c8960196789f0b92ad03bcdfb9648b89f73b1ed942c0fb9d8f6c35f156793334d007c6e00f0c82425c74e5449dc863634ff489fd94dad539add33cfdea9ef6e958cd491dd4423d245d3247eaf83862c4d3c49508b89289db07b8bdc46d03dc2ec08d404adc28e4c61db98a0f72238e5cc513e0422157f1495c24eee52a1ec8007e5c79840f236e2e94ab29804c89883d2e8fbb237e884b735b42dc20ae8e9e1c17ca158ee8c3bdb1b251230686c6bdf77734e38e64dc973beaa2473e77046504bba31eb91a3951b9a3264a62a76025b95f23531776fa46239efac1a12fbe4adf6814773e518e31c69f4ffae4eed8dd52ca3927a534522e6c6c02a5bdf689b0ee1ec56e46516417edf5e8d55e3b69af474ddaeb89473c1a196cff1bf1e48632f3b083329d10eedb47177d9b1bcdbe69dddddddd97f99b277224e66cce39e79cf32df594524a29a540324c442b83ed67599665599669582b838da61b550ca1420b20836db413bb5b4a39e7a494962e8022608cf0115b4a39e7a494665996ba9c73524ab32cd3346d9e9b94d22ccb344dabb5cad32ccb344dabb58a4422389aa391ec381a8948f05ca6695aad5524128d46a36d6e9becb86d4a5ceb6e800479ed6e7ebc0ee09b48243ae2a3ee26090200f9d6dd08510289af4436b42af256594c0d91b71ae120f9c07524191c5b0f374832384a3a503f984e282074d81c33282074a468542c9518aa164d4a1042a85a3413002e3c585a5c7a006065881d2e3d00206d5e2363c6b3cd0b110178b6f171f3d8dde0471adfbafb0aa00818237c4425aebc42c8954b825ce98400573e49e24a24a44eee03b9b0bdfe005eb9ffa37f44937c18716f6e113788f6fa02b8361789bbc40d001100b8d18af6fa3d6e4cd271c71de2c626373eb9114a5f887e10377aa1e346206e0ce37692db396ee3b8dda4bdbecc6d27b7a1b4d7bf71bb8b1e6e4759ddf66e7f713b8c2badb83209be50e61dae6ba8242cd7a5512d19a21100000010002315000030140c07c4a2d1501c88aa9e7b14801086bc5c6c5018c6499453c820058c01020000000002000000120050d98d940efae9bd108724c3c629803e73177022235d14ea0d4a4f2d09b421457bba9faa0c44d3ccbd3124ff81709b6f6d8f80664151f47023ead4bdb44fae761f3027642b723bfeb3acc2a7aa256da4e5b92a5b1e2d86cb5028f74a362973f1cbb43c5aa481a2fc77ac65d7eb656600b6a8199cd258ed6b1b439580b2bb0e6fa0321c853f3ccd2743e365a673bc744a08ccdfd494b02d1f839601eee71f8e7a93c5726ed170315db01add8fe4c24eae0aadec76fa93ee3813144ed1a878ffd338d2e8a97eca0062b6f5eff380ae8088f8afde2e4e8a57e5a38b2732f2386cace4ea6e84f3d794845234f59e6c814542eb50888464937b9b04cfc1945c3ceb745f53dbb81737d223f1e2831aa9143fedbda8f8a1442196552706b54eed33160af82c6d42d362898177270cb223ee3c9b3dc5db32e72a36edd6dcf0fda617c4c9aa973e470c3f913fab530e163add830ae50aa12d9ca6b372ac10798116ba0566937748a2d8157318655edcc65419d5222f67001436c65e96d9608741d29b1cadf66546c9a04298340327545d8fa52a53818442b243902b9b9aaf024c0cb4ce6762af3082b8dab7ead2e66522ed492e1616fbaaa46ff464b8e66e42aad0b900ccfbde69936263f7e8323cb066627053220e66b3eca5d251b1668f6368c2df0eee02f1ddaa67b081ef99bc3e5aa0290ab559e073a43fc67a6fee18e4eca50320f2ce2a27421c7c644b882b32fbd61d93bb5911a751135b1bafbf513bb39aaa7d16a056f78c607602826e18dff4e640bcab2110da411eb55987ab57236803aa8c3c6334c3a898bab0f35f1fb24bb8ed289cc8631868a6c9f0e7a2a048aea631ad828bac3b27ef23d76667c92f8f0e8867aff87d978110b136744e376fe12ec16914803e6f7b052953ee7e4aa341174c325c14cc230fd79157ba373c42be9e137e8745db9708045adb3b22464ba54da2d5dc86d4a0f7aeee3c749c94174937c20dc0bb5f0cd522f8d9afd3785ea62158de9a8f4a894c3743f4d4843bdfb047b26be889345ef70a2c6fb448fa7bd8eb1c3664771be295562e6ce28dbb7428d90995d8a4eaedec708f4320351916687c336c48bfe7565bca06710010c131dd864187d10a43128baf908681efc9645f649fd02fa2ccb8905a547ef9a019650350a03af38322bd48b1e1e6028f906206e283b8b291ea245b2826f032a02177bec252e8f326c8f7d28d5ca209aaba4688469ddd70c388ad8b693261b56818b9840bb27077702c94ac594e5cae49db6eb988a17dee6d14edffbfb3ec3682f1420473f73f23a97c53651418fb0b75bcbfa1cb90009fad93543f592aed2d8c1312503f9415250acbce1f11f10a62d4a210eb43969512031f1ba8d7ca88905400a45a4a5dfcfcca0b0f5087cc91df574058a6d1086fe3d6862fe2aa3148a84c4aa57412690dad6b5bc8c8916820a1d8fa9e6e1680a1b0b1c421cb2da487520ecef811045715c0317d0a95f964027171a61708f5ca98fe70c59b0ca279ab21289cc382a03076245a7954d2b73bc7e4a93ccb7e5894d3f20db205494ac429001f29b842b1b7ab2ef40f25e22259bba47b6ee10cbc4af44580b6647d8ca82ba5dfcb6f51b18c9b6262ce984ac99064b5d1ad1ad549e4194adbd65efacacd41eeffd22f06bfb0218d8704eecb2c72467d011a849612f764cc3b678bf2f5621c9236819ce10c7b726d1b3ab83058ed184a729a7a1b0c0a56f1169d919fa3ec33462282ad9754078bc21e49c2c043af28e2bc6291e30c729096958b5ae116f8cab75fb10a70cb8b3244853b3390665a89cd09985a3c02f7a2356c4d12b89fd9d13cf7feed8719aced8fc1f71d606553e721c8f29df3a3407b136ad6d839ba35b430c83cfc5ddac12b725c98706e808d947b23689a87f80be1bee8f7948f6d1e3abf782a5b27f4c7f3eb85610eb65f00500537739c2b04420cd75002deaa64a4e93b61be731d4bae214d6a10bdece79aa4adc4f49ea53ad11fe4277b670a07207b59f92e58b66801e19c1504c456e88faf03bc3b86f5cb8d52ec8efd43a140418d48bfd45588e75b1de1020473bb4d9585791ea355104d03445a3cfe0f5126d871e39eb7c42963755a82886721946b219e9b1878f87d334dba99d7bd88b597880ff32008877d0679560fbe241b8af6f8a64cf31716a5760f3283250236098996a49b10603fe404dc9896fa07661bc688d4576191d5ab70126477fedd8f4fbaf2f1ff1250add29a23287019d48e619b5e4c7fd8697c9c62797b5b2296f26245967d288d571ce859f3168862ba454162140218e00032ebf1d8346c2819bbed76415c0a5935c31a0ba6aabe2d9c729e0499500200b8b6f12e9fdd779cda1f23d9fde623d375dfe697783755ab1b46789fe3ab05d4445f85a9161cc0336c45fa90f037832483e0f6d0f8010b7b5b5f5768dd08161bcfd2ea1e5630fe0631853f2ace9d0d7144d1f018303651e5847903711dbcd874e06e2c58664186c6175e9fcb6ca0e35ae5f78f2f046226f23b37c1a85f62ead85338d5cdbe8dddb2ca6e63bbed97b508dd9f1b0ee4538700485351718586c4e68b47a505243cc1f136050d65e16f89d842ea6e50f2a49af7f8a98aba47bf416ba6054a5027d654b9934ec3371600fdfb3d54df061971dad68a401ed1f3ec07b51e2e339e837f80929d0310aa9c9a4176b1e6ca5127182b130bbc806711d504a5f2d19eaa3f6514abc0fe619596ab40712fca44714c1aea12ec28d282ce51e53b3fc7d4bad7110e2832586501b382f4c469d34505977f2bbef795598876b750681593c4d9d866cfc45f7edda2af51310b16e7bd659cea55bf82b95015750f2903bb78aea243ec21d90ffa9c214ad3aa4c7abbca78285e05a7e1b286bab6177f55f18775c530ab5acc9bfd275c7c2082d069c92bfec7a9e72fec98462b48e17c53db185fb4c62b291f6a81469e799775f7d510b196a9d0583bfa67cfa22062df49e2ab0e9fab649aa70361931e57efb51248a993b070190fef41693662442980838ac40b638336026acf3df2b0fdfcde59917d24b5a0fddb4fc2607f07cfc24f1cf0a4b813a78689b2cbe100a561e59e28e4957e176dc3225d34bd8ae34d75a7cc13083fbf160c8e02da096866a4f3d7dfb8f6904a27c61825579289beb8ae677943ee232626d15cecad79e79edb588a57a9255b09a7930e0b1f461de702584aae916fead1d0df7c4b344276adb6fefd13035eec3d8ad3ee16c9dd1d0451bfef96bed3fd10560c5b7e83ee2275274667c5009dee177044d45a85ec5dfb0205cae8bc67d1e15fe41a87d1c0a036ccb5ce79d2ecf6048ae428599edc1d6343ec9ebeb9ed51a1c768157abb205643dbe00520be7e66251b7014544aa202aac4b290c4ac054ad89910de07950ab84795e99aee0e8b3d4e42b15866f80a150e3e0071bb454dba51ec87eb70d6e9a9b94eace5d60c8e64dc95a889a41e37d075166927ad5133cb1a04802e8f29d0be9fa27eb757a47f21e87d5dcb2a3c7d89812e2f45df75e57cf79014ce0b80c2d7a023249dbb5f01e428e57828e512409769056149f14eb753f4a4727f5f41c3b61e552c51c6a0c6b5e584a8fab5ee2199b0c8a3a32376543776f267295fe610f2ac07231c7ea9bdbdb4cf71887d96fb044312b3be3b85b23af5e516344547c2ca4725da35bc7948cbba86a941f76a9c11e4fecc6ce95adad1e78ead0d094ab07beac4b3eee6a33019afc174d9d13c5f6de6a3ec0a14a80be7a7d0779a207bba248e598d7ef37b101c19e419c09da4b1384274eaf9ccc35ebb8f263620737c4d3bdda5edcf78d255af73bd6ce1de733f7a86ccd76973682cf6a5801f79b59f486f6e706868f6966d7a1d083c33bf7c24c1fdc416f900d0a94190426e762a962f8c0a3916299e48539116b52ed61432e1a2c07ffbcc85a92d3f0150d7b1d44bd4c9f69feeda3f1416873c9515e08da8c028a4700e6cee1bff78fffb154d8d5148a4530d8595f4b6a3700b29a82dc571c23bddd2afb49c91edf154df8633a9418f24fa6252033ce0bd7fb26bdb114a1e7fa2513ae9273b180d83dcc92a365b5edfd66c03e38d25aa5b7eaedbd851ff146140997f6d028fdd0ee9e7000969852b5dc813b04563ef7ad2120c5840ee4c1b967e6fce5dfd5dd55d2bfd1bd99cacea5df1e3e94ddbb55cf5527eca8611b7b757f36a29ee9afdabb03959541c2f594c7cc06d916f6092ac36ed45cf4228a73a29ad01407c8065c1dd8c029f70e0f1004d3a340c16ab68e86b1a99c78b6a6aaaac8ce88be5301d374f3b9ec051972c42a41110753b5553304c8856b75f3022bc6475ccf85708208fc616588a22126a7a0490c566ca4ff11ee0609f6e5f3f998f50984fab3e945b641fc65e4c2da32be57829d29054f4361144119c63a4ee361e6685c6eb65f26ea6784f47062131a274e719d70ac751a00649228d6c5424b07e4051286231449866a51b1d0ec6bd87cc1667d6123edda97dc9f5052f792ec3080a671781bdb1daf248584879fb2f83b49ab195016061a60791531290d724f840b50896d320cd576fcd7eea907f147b754d52da0683b9671731d1ef9eee5a09bf789ca5f26d135269305b562b673344fb0586788061198bc219936a8a8bbf82a7975d9fa601a11f483466bcd047af6b789f43a232f35066dc6e1a47c79d64349735434b6e1adeaf0c197c8a2544a569cf67bbdf9f487b63c2708f963c7662efb9b825bddfdef759df7886a3091e744ed9d3b70a96079f3ea6e1a3c2202ba40371e01bfdafefbcaf79f2131f1fdcff6cd4ac34e31e8d679b7c4a266bbc052c9515d3c89990dee29927c7deb8bd0c463a0b8c3f905976359825d364f087cd21af4ad8bd9fb09ef51287e4cb74cc6bd225c0312cf892c86513e41423b4140520904b010d150a6618231b411416a5ea0058e862ba4b306c9d1484453dce898c88248d21168bdaa90cf53a2718454a649028d120412ae3b1c6a6e6fcfffb57fb06d1747988c2292389496c1482888dec21883d6d2e5820d0d0836bc9d531a584f3301ec984fb0972f607001bfcd8a79171002193c9a6c960fe00168e3670b3a25ee7b01058d039f3582fa0950865ff28c7205d604a42cec6c4d282af0f7ba657e6a0e39c0ef7be453a31e14fe8455e73065f9fe76afb17aeebf79dc810041c0181133a270f013cbdbe6853702dacb2ec9e76fffc3fac1e698edccb127a3992923cb9a6e7540e52efde7115fecc57de073cc001848148aaadc7e35508cb6dd18aceaf7bc29cd25f7fa6316c05b494538d9cd8a5394cb579e1175b05c219d9fbddef76ee33cbc17b0c7dcd90e9f06afd6de56c415e4925ae949c5611dfc3c2ed5983bff4ce14feb8997cdce8e45c556e70757fd66dce0dbd4fb010da8c16f93e042709a0d5f7643b312f70f68701fb4b851aa9dc6aca67ab7a3e0e297edd0112be37dc197b1d3c0903ff0dd2be2a53b8dc41a3c2231caa65932ce34c8cc7ee2c0ed821eeb87f769d6cf67a0787bdee70a2a06449c3f2730376c463106e8bb9177a4726a5ee70026c4f8b7bf7deefbcee7ade011f9d8cba67760bf4ff6fb5f2fc6c3fd2ef4e24ccbddcb15b8c123b3576f45d682d5470cd5380b473d3f7ff098b115d540ea2d3f6426c9295fde81e6628fd525d6c50d19507f77400f4251e7642e623f6e198e0ec58188d490625cba594ed5d5cb0d7703857701a5cab2e6ba2ab4b8de85ebad4d663c16b29ef781551a08a1cd6a99f1f3c6cabb176aed085138a73f03418cd301cb89d667acf7f5b244c1fa86fb3c0b07bc51a667253232832d24aaaec446e1f517b3691350454b012099279aa4822070f9caeebc69e8d953713d13dad922511d154aaac46c4115c2afc10b12d86ca2d7dda29460eb162f3f2e5dbe37300889e3d20be7ae6a260795a1d46137887074e7cffc544572340bfe54bcbbce5bf9a35305c8d7ea7d30380ae65c003806c09b603c08aa5fec6af30cde5fcdc6dfaadcf8e14f6e80931f0bace1d634127cd81705d619adfdea5f7fae30c4ca18754d85d4dc0495aafb055c67d834b15da2f1afaf8a581e6561e6cc9336f70f2db9a59c971435e06a032353f44d0a3c07a42c1d93b8870d534673e3260ebf587ee05c223bd3aa3166f4d93a3eccab83693523f0266d85e13e0a197ab50d1eb26b6a9a223592823750b81af9f112b013ed26ada8eb20685ad29eaea7d9a2eb529a5dd4ac6f8aab0d71acb3155357fb69be4b7a653b4e036893a97c39acf7f5ba291d6e0c59e5667dc9ae6d0b81d3b759ab9ac1a158448d26568900578cb4e710180a4c406558677ea50f243f5400f486294a8905407a658f815d2b37ef8a0dfa43f0bc3b72e421df05a387aac85d1824533c17d0c430898cc580066472c206de824a02929ff0fb8a58dc94744b582e70688db6ae4ac070b0b4b900a00e7cdf630b725426040eb409af06694c5c4dc8e23628e800e6a8e61c8518505a1301f143f58b49a1a8c2bac3627d82f8a139291020f6c362203d838c00444bd8ae7e500e64bbe80cf4b94800cca93a0f3361b60260461a093d220331c1750a58e4f91dc72a960716b813358df05cd91c6de3c1a84c1248fde9f4163075050cb0d13e27c1c86ac41a114018579d10f0579690ad70b0acdb91204c914ba8210813459021598822e7e48a68a822e6d4d384612b4f0a3504c3021f0970a41929210ef320f0256a210bcd90f825c52289e91c2d8c577b41a10a6bf3c40122988712421bbf75005a4e032cb7e1f354cbddb40882614aca078a151234e3857ab360ae50a547030438b8cc20f31a9e9899cd003d5ab02f643818002af6673262f1305260ade46ff1478178fc7f66508bd979d9f62547fc3cbaf2e20e985828e77481168cbc019286e028b8b736c5c1568f6bb184588336e5d509a2c4c550a529dae27fcb686c9d62183d4a2f68d6ee96183ef5ab69f21126c93f9f22f95a220f34589e275c6a8ad752170abd0d32719e1f9cbd09bccb74ad7db3d4fec632dcbbfacbe89a7aa255708d67d2e918f5139c9910b4d1387ad19d3841b7c93f87577db597f7c5996ed3370bd95f0c4e877a862a3e2c5f1d2737744d5a9643edece61f4b0507e74986e91aefe78b7d3dbe5437fa15a175d48043887ae22fc19444e0326cf4356fe02030dec99884da33734bc828deb024932c073a63c7912f3db90b8ddc130435eefbcad12c9dc1a183a2888f458a66c173e944a53f83894c553e03a93bd4a5543bd35232c4eb862e88bb92b429c460b8fbd219cd0471465da632ce5b429f1916f10b0a4215c5d6ee2dc8660676fdd0b671ebd7da1b9bd067bf34afd40b58f953bb30537b41d40d1a58b0828ddb165b1a234808a54d0e138c19483240f8f370a78091c6ef036ffe03f9b2f933f30b6ae77f52fbda18e8dbd621b9e3a29e85882f000db8b95f69260092399b1a57117e3d2eb6ba5afb1624624fd645cc11a6d06b9a93d585bf6c6588d454a9d37432fae9cf63243e954451dd21cbd521ae84f8ce1e1d49bf91cff157667e96148910bda4392d7566570c84a0cbb455d079ed009eee717bf7920e19f2e0430275e4eba3b137d22e13cc4b11040c70b0682e011c6a66c1c73a8c79a158571d6e7a421ec8262db460a4999888a8c3437c240e0a4da6b45909343a152a6e29883591b8b34b6672223f032256b458652ad4c4a8c332d23a23560a77d0f64a205861c7786cc15bb5269a92d347cd39b21676786bfa75673b9f485f31aac6d825796c35122781eddacb3f2c8a18ff191bab77b3df07eec46ce4cf7cc98f40467f4c6d399728074ba366f726b29ff465983f11ba859c0b53586ece4ca8d93081e8c5ea415c12e7553ac57465f8fd7d59b8240b4cd7e54ca8db7dc31566b4ddc55f1bf686948b7f567d6014e4ab5d19250d95de69e466b6ad0a00a7966194b6bb35b9cf9364a4e2707c9a6b5c89d5130469563bb13a881e1a10472d74f022de6b8940558fd8283368d66bbc3686f6a02dea13c4f2bbba397b476b28e082586731025234316c8f9ef51a597d41010d19f38491d6218eb1d4c4a990d8be82b2724df9e1b8fb4400e2dae05593bd233dac711afea13800b647dceb3b96e302a31e498d838da189f99f0d8583151410ff407158115915af8918f9ff84676605e29fcc155984e2d4ba30f3e9322d394591e4437dc8b4f3594192da66bc91294544a293e4aafa4254b295959df9f853190c06a80a8950e70f567c074341d9449990e154e0f37bad92d6e7255b1f4da46493ea62e36342e22697b80666284e39395b37222d64edc7089fffb7cbe86441542205ff052e3ee979db3ea77aa49535e886e7229a71bddc0be511bdc584c674a8547b6d19859a5b7c4524a55aaf4f82452c2922528ad1c1fe6dfa207ba899ee8063a62ed9c233ff918f7013b828d936628bd5bd2981a4b636a2c9bbaac7fb1705782cbcd9121f0f4965e42c94a546f57c8c87a078718dcf665f8c68e3fbcc4e6ae3880fec04f3ff9d0a7af5a941e3774db6ddca4cc2eab05c6c0b3755b9e86e82da5c65a1d8ad0ed84583501ab66cea452c5c42091c7707c3ad8af26ccd0b7d399d6b2e91647b7b492962a6d698b1fa5174fe02541c4d25f5c3c5a9a8ab7ee12b1695c61f4759b1bdde456b762c0d16f4e496e34afc24100fa7635a211b49766427458cd00434b18e786b68bbc6befe5b0e0a2f5054060efd40294982f4749f835c5c9903f1e6356ca715952494b94c8cdcdcb3530aa3ad7d0581fbda023b4fc19c08fb1edcf41bc46a876e971acce1c2835b4369f5880c4f27213c74ff0c296943ab61224940c1d81d93057e50879ff42d385d9050232e9710337b9c1dd70a1abc23c4aebebf46ccb039b2a6ec9a5d41b05e7515e9e61a9d0b58081b169b0440fac706b8338afc8b0d836adfa1944e742e9ce25b1fff3ffd2f144a6bc6f1673f38c5b2f83dc2eac063548cba1cd07e8caeb025f781f22e60975a59baea7260ea963f305443640b316f785a17b23c008da169975749ffc9bf8a3fd45e1f3a09f6ab2b28709e30298ba2e4e290744af93853e42e92f777f714d145dd1c17321b5f1dab99f836a3313487ba434ffe5185858c44195d682e71d1800b238528a7729fa3fbd34bc0179b759ea4d63033dd3efdcea8e9535ae5d531d4d94a6da1ecb735064b68772763dc4a1252819fbadbbbeb402e534ad8cc472fb04490e39db8001549318c8417066f46904a0c07510eb610924350e6ce9c3b825555af2914c8a47543b3bdf3786775ed964f1d950b35f9a3dba1b9fd2f5862dd72b987208debd00ae65e44cc896a736226ecc8baa9ff9c3b35e4fd26237fde6b76b1f068494a040dedc9b3e14fd59658a030cb35cb000ceb2f0cac515d2702eed0e2761b2c1f0c297e9c428890fe3d51f4b4a3a289151ae8001ea4e94120e20369534e99d522475169f14ece477dee9085e9d9b53145d41180ec59ffc774b5955aeacb6741a2000fa5f3d8bc510abbd300ee2d89ef6fd2962e4e5bca5ea026aa057afb21a2f915c8ff3c34a2fabd032d184b027e6b76b0eb7649e8b4bb8e8506840734e601d2f2f78ec7574cc0e2ee63e6b2804e07c32384240cde199ca2cfb8e7925931c5bf795928736a6e417599a90a25731a63477d4a8c0990092c98495987efe08b5df93e41f94ac8923530e7f08bc090ed236928024c82210bb9f2e28249886ee997f635a03705e7ffb71ff30befc85e64a34289a289d3a51b447191e8d9fa1061e5b6756b3f8a7af61133caef189ab68594bb48c3e2654e3c9958e0b0fba769a3e78ce0e7d4fe9b6c0d08784606e550b825968849222d1dcab12d7209991893206c025053293712ef71d88a8c9b6bbf8e70b7db81a503f23593f883f6dc788b42488bf1bf429f4e94af8b5d020ea4eabcacca14fcf28fd88fd7c1f53535224ac8b8027194e6faf52873522b579ad1f32a5af37d15f23205076e3d76c55508ea7ce49f396f26c0dbffebf1560b77a973eaa4b865c276d3cdc96671e3159375c66e468389b7c7b7cd3a017b954e07e60e5cf92541bae8a86e71b9f7979e20c190a81e419680b9da5873c00b3ce51da91a72605ea94cea23a812757bad3ab7c38ba1da563a0423c034d1d21cde7bf84071bf37142f9b1efb6a471b782f9b5aea36dbb357ac5f49dda717ad65f8757b34500e99900776ee04e0119b0bb60072b39f449f40ecc1b89a69d649e39678bfd4ebd4751f39779e896262614eee512a4031cc33ae78dba3fb66aae44d8fec67652607188c2e57db53f7840e11eee851757d5c731b38fbc69465266e7a15eacacd1ce62b1aa1382aad6ce0694b21774f39e5dadc5552e9c2055e4b971d23d1a64c220b25437cda1b9262c1c1a7bb8a27fc8be549d9a20a91c9e50712f79cd64a97af2ce9a687da59dfb11bb9c2b7ff807ca8872a17d2128fe8030155593091abb040401482de10bb29c2009c107d85f6d49457a967cd6636e0a07deff7666cef8f2b601ac78c28cf55158d5c8a74159ca2950d6527a952b00fac828040c1f00ecf52c99b1c5b40fdec89a9c33dfa0ac8b3f598bf61c42cfc89dfed4affb01a6dac76c714e2a553dedc2c75b8fae86772ec1221485d569d54f89daa81c496fa24d5a80f64c1aed39ec1cd755af13e9699bc1b4d3d83ef897cccd8013560291944107ca9300df1622978cbf3a1b496843d96694f16dbd1b0fdf5418015c62277a979d236ee9bc16711bd4b482e5d29b4f14e6f7c7bca9b6a56b003d4e4ae8924ef95c7ec79b791983f7c35bef9fda7d2107e709ef3047a9ac5bbbaf0655a9a74f6015c250a60dd7be8270534b622bbf2c4f285708234b7c65ff1af80412eab60788fbd62e9690362ce3098abc54e75969c73b67ad01aceb67b229136a65fc665a53b850003eb6a652f63b360acdd60cfa9c4b2dd7f4979b18ce086d32b3e2c51e153370812af0593c794d46c6ea2fbf6cd2cb28738fa476142fab504d1138e5699c6c2c78fe640d52d9f74efeacb0c7510aed79db8a701892937a57d388c40ce2707be11e92eda0330cc43e67c5615e387e5590945a86b35e7aa40b7885bac0f0a0bce1786bb53d95c4a3f09f2ecb468c201549383cf80d52b0d096a8e8b0fbcfbd079505ce0487d2515326d3c997c56795448b1b43a6a25c5e1e4c7e83fabf424c55a8457181e4728693b8ae293240e8e5645cf19c832aef95e8041cfea2ab49b7a903af2bb06ab25b83e9d245d77f60148ae6ebbf75e9a237bea8d69a3cbe8fc3fcfd3ed796bb680d81206e5bb3a4c9094579c3739f742f177945cafcaa2118a5f74ec8f75bca0fdd2961d478eb4f8d35eedf4bf926b885f7ba8694731d2055695d3caeea4fe8446c7aaabe86bafaec17a8692f0d14a64bc2533240f68948e411bfc808076233c8e367321be77e43585037327cc7d9050aec037ce4bb98e8179f1e9e95b7a6ab18209681c48a2ebe47ca5fc39149f77fab023724ffe8d4e934ffb6b795b5a29fb611ebf4218c2ed0c04f309683b982fc6f827e246e7bc612fb54717389d4954ad7fc0724822b840ac1c79665036fd3ce9d322104d301bbfe18147ac35239911dfffc0936987298d27ecaa36573064d6946bbedca3f6b2afd3e612038468e374bd072a6bbddad83890dbe952c6e515bfd5caf29bcc92003fd374e5ec5426ab9c75d23e74386ceea4df1c9be0929d470fe06cb0604f4678b5c24d5e5f51079df670c816c159020cb473161af94477e4b8b0b5ff74f4077e46b26f69cbaf856b3795cc6ecf3faf895a5e34b8c78b64b819f2321588229d18693c7092ff0b1b19a9261ad7beb789c4d77d9520efc441ffa869e7821444134ddd9f8404ffc16161ac083689a9ffae8d6be228bf044402cbece20bceca2749e9c65f58bfa9c7013607305d38037ceac397f37499dea78d00058ebfcd5fdbbf807d3cdf3a7610633bda9ce25264506dc2c03aed4a320b482a6597f1d72a81b74b6e56d5d550d7f3cdbe0baf322f77d48dd84a53280129d9340a5d004ba49b8e393ed31dd7af953e77e38ec16841193e1d684a70344ab6b79808da07fe4d8d708c3155d878593cc35613afd6c5cdda19b8bc0f120ea2780da2c4302382edf8a9b4fd5c627ba1436ac2bd0072a685be2032a1f52c900c52ba7152b88c502a1b64b9a03c606b17aa0f0a79a082a9ed70013f7ae49d87785652de88e3a2ec718ee8139bbd3f775fcf33c4e0402275d5a5f38a9341a6d28edb0308b2ae5072fefbc7f7c1b0c05319ed4ddc3dba437d137892a636fe3f2d5b2fce52af82d37613e318b5bd734efd7ae942fc83fe57a0d4c790c667d1da7487e691deb1f8012dc1735f3c56d9393464de3cfdcf6dcd5a2b39b2ae8982fe3bdc1241f07d702edecfc70081d8d79d7e213dbe99d074f6a416f8181f7fc15f5b57af8999e0bb46ccf612a8e56855e9954a045041f8eababb54bd422fd2a2d668fc67f7c926ae99bd21c987a013be5eb65e84976f76fecdfaeb77d396dc8eb8a843f7b3b9dc84650b294b68286c6f4f8a433cf6e8c58e33030b7b89d8c1e4eaad7c6577ee70027f916475d47ad1ea40e098a873132e49a99dcf119d5ea81290c48dd8f9edba68439b9417287c85410bee441c95b56e8346da831827dc850438fe2cdf7aa946984064caf0d30a0e706cde9843f873470020a14d9271ec71300fddf6ca4179770cdfb37d7656950f110f3948b92b137bd6bee57814b9891feb574f215a6ede7c3fb39f95acbf35d0cbab6254fcb5b354d9fcc9d166becd082cda02e3238bed4a6612e89a49df6d82cd40448980aab5f5404fbe2f693f6f4e97aa6c690d9b0b9124ac6f6aff8e69a391e75c00d8591d7ea322c7569d260dadad82f3efe3ad71b823e14360abde18ee16033a16cc4fe94a4c58226691601a5285565757fe04e01da757b9b8ead7ecebb46067c1a7ca2d2839899a8843da3effe4984c79e829aa42131b4fd8c57730d97280a6094ef37e9c589ea6541ee546f8ff3ac95de44a61c5a692c09ab45dc19293d8f565b315d568aec36d6620df12a40bd67a4bf36ab4c1382bf1fa668bf79d6be00e358b1f07d46c73d425466f4221506a9f3b2344aaa93acec2074b0930baddec79a517716dff92adb1f5685ab1b8a3a470f48d5dc0b7434dfa743063f0556467ff02a775478024795da93ea667c63054e361d6d5565a4841ce5a59c8dc99a309316f0a155ad24fd9cf31e7b025b9383b86984945b29803422807393d545398c8a880fd0fd7808600f157238e51ac737cd93b063ddcd344d6f8cd631b3bc420176e0b5d57ee56458d3dee34904df7b7a024ebed6cb14baa0038567cc9ff141d21b70fb93d50463c8afde391cec5d21933f6a441af0f92b990eefa13692839e13cca3cd509001855ee8ca8a5f0fd941f22bf697fb8a8e9288dabe7c70aa35a0fbbf14dc5795e3a6894c7be7206f21e5c0e060edbb1db4a50d2618043788325e3e61aead01384530b12db91914f49031d1c8e555c188b8d99d83d1219e2a8b2bd9de45b5abd5966d6a2779b75cfb2ccc4439e48988f1ba71a8cdf472cc32db36ccebec42b74c3a52251c615356506c5c6d095fc17b7474392c408d9712960f61f9a43ded40a3e73419026c058b968497ef09adf3ceee70eb03da03c81769b2c20b6be21f8932a13b7eb3cc3ac4e4c17a410268e0dd1bf8410e990d9b2f8cc14ef1f66604236232ec5f564c512bdbc1e45182dab8831e0b4664ce1b0cbcc3026ac90c637c0c23bbd1c973330645d0816574e06a893c2502cfa83f7ddc87f78473828c3453fcac97d02dad52f96d3eb0cfab00caf984c42575720f9fa455c2a34aeef6192b5c5c28ae5b73ce1db177311d7c6cdda599aaea8e782ece718627af0a8eb3ae585be50df9e9799fe0a5a8ad6a987acd3aa1ac124e913f8fd02e79afe8bbd10247af19812d224fc21c6fc4446f407e0b9ce0e1eb6efeaaafd7d1b37489a9bd01fe967a8347d65dceaaae4d49e7411dc5773ec06084f072ab1da5791fac659eaa27fa8a131880155e71812fe1b6f2b91ef9b348e21788e0856638bece0acb516918e6582f7efe861a5cce1d1ec31eb3a5716796659e055e5c48ab478fc7c6e0ae919631cb7da5b675806fd08dcdd6e37e3b5f382fa0473263d6f5e13670887174796fce7b5ade228d2a0199d28051dc00b3c28f70dc117e1a7280a06154b84a8ce88ff919f5bc47767e6399df51cf6b64f33bd6fc1e75de4636bfb1ceefa8e635b2f31b7b7e8f32af239fbfb1e667d4f31ef9f98f657e4739ef91cfefd8f36394798fecfcc73a3f462aa04a05e85906264b60cd12f65940950ad033194c2a819a25ec93005516204f32985c823597d027b2433667d0dd6d90ee81c6c9f3fda17d25ee6bbc7d2ea22101bdcd660b0f8bc1a8c3d33bff41fc6eea7855777661cdf36293711e5823e54f31bd75c70718a3f8a64886fac8a9a1c972616035e7cedfe7fc587f1a1d3a549bb31c6bf944b5cccce98c79c4eba6431fb7853e58ba6c26e76326583204ac18f8eb47af7d56a2cfb390739d4f5ee33c28f6c54afb2b3e593ff12977c4948487fffbba3b5674b64ccfaed80ad5fac91bc78f28705fcc6b7e684bf545877d0ebaebb547a36dceedf6bfb7747d3e0add37aee5ebf7bf4ea92dba942979e815f51dc88abce9ef555f50558353923284672d63adad63ec103ca72051114eba4341cb56de7aee7e981d332dab619e40db45f0f89441984b49f0e8157b6c3c5a8bb3488c42e49eb46e03f7e01d82c70716c47c71073a1dcf82fa61b49b41817b1a628381f9643299069a0b0e66fa615af70e24817753a07a643881480f23c2e0d69708bf70d1f10e4efe6f385a0f028740e0e313085562cd778f56cf0567a0930ab880e44479027f0dbe02ccddc18609f43d94ee5a60642457c65780bdfec3e0c61a4d59727f6a705f40e3ff47123898fee75d832ed5890ccaa9a2294b4a523101e7fb518fd4f50160939e7db52c64865b70bf0895fe117a3e167c2b68370c8ace7562ea913f7d8c82c51adffd6a9ca892d41409d304353bbb3b2890735f9c4b92d4513c7286fa25fe1b35b1a66f32366cbc3a78c341dd32169a6222b0eac34c4c4b451c0639044203540e26e1ed0ae5ee300e3385ab7e5850745ae2b482719c915df54101dad7286f0653b0a95867e1da24e25a429b58d29119ab0548c06ce11293976486f85d1c1d0390d13cc878b501ee301ccf48f726d6851ed205c3b3ab8e2204333862efdfbff366b7e5c1f5b1ebd8092f4733b50a500cf00f917d1b95b3dc65d1ba904af82cbb9d5e035e68a47c1d0216debffa38be0cc430223521bb594d1983f900565a5cdd4060d17f8fbd0084b9ac4cd6e11080659e11dc067f4039374e0c96db13352e6797867f8301d4a9bc373c402d035ca330d0e9709809c72465c00c4749c5bed503714d749a14a85dbf2f0f154d130f531959fdf7159562b180c3eb544c5cb87b02b4c00f32a59eb69a52abb1f039c1c2ffe9c9c35df2e44b3367a4f07a6ddaed8e17f6ffc0c052a0692132681de2c1c0aa67d5bfd70311d692c6a44ad5c57ed92f295fce7073dc0815c4abf308dfb7370f4d519088050d2b7e318981668c5b1aec2242753c5a519573399930e99156592534afc9c465c6fb404be29e1132f8fdeb5d3f28bc43ee4ee904486a70dc3cff7b669c3aa0a174886cdefa7316134d20430ca2b3fc31f1b19f00b526abf625b9ab6a9aa0e0ea9aa037bf3b015459c950e9862d8aa1827d4d830ba0044081e898274d43b6ee5a02758badf8032039b5e4c4890fa3e084d4f7865dfe4200551939d9ed56efe2aa48092068f6df435d80f102520a8c53f86f2f7ca502ec6442c714db02f16aaa9006d33f40ca1cd08fd3ac2447544b529c74e66d89e861dfca91d3fdbfc898c0057c362590222e7cb7cea00048e0bf47e35bb821629a6e35fba2bf5436a47b7e714c55338fc345c7baed9650ffca4b5e843c282f388004ba6d978b54342fa7dcb15a44163d60e2a8b1c87e6ae5dbd230894bf89219d9d8bf7a1b700e38d21b722377fdb88828fbaa781515135158d7c2dd91a0a13d0a606c9e3f2e9b2972e267cc724db4a7ceaa223a11494a47822c9f5264646b166d2d2a86096b992d7740d12bfb429e67185335ac4b75237bf657063a470e40911bb9eca2655cdd1edf2c16426ec9c1a7db5be92b56133dbed00652a8155eab27151b2390c3a7d76c530c2b93920e56a6e3fd45f419be3a1d78a88c0091ea2da6b385c347d5ebce42f9dda2d8353e2f4ea89c322f1413d46d8ee88d4eea7026db12d8d5f882612c44a434a5d8500b7d4a5ac49f62cf621e12878350f0754e71a34125b7a390195624759327404c9afd05a35df190631ce413fd6d4caeb9799bd1776cb677969ac8ec9ef79b69081ee81f35b8e68503c49abe004c77e4f0bfb9e0fe4d68e082bf47c2116aace72b5e777c700396f8dceaf966963088e4f96205a5e740b3972f265311044cd0819892f456b3fa91d285276d05381e18b74f8988c8d910950ad3459e7c1ff7263ba5e6955b08d6b2331b80b08e8e0703a60372b3a32eca43f58864d68f8594a929e2a68c292ea8acb7777acfad72010db9622c8cb1964f2a71dfcb45b5b0e493bbcf7da6415178ec94949efe2f27025f4061293c3a406be2180eddd5d25cea3cba512e82d44c76f3a992e987edc58fe56df0b311ef64bd1091143f0931dff06433349cdfacd10cc185b8e032651a9f34ae7b81ad6a5aa6b20046ce0a97571f158c5a507ec1084324420a658b749b4f14a02a76f7d2a4206b710ddfa6294835f902e5b618e1566a017b6cbac3e34f286bda02ec731f25cb65ae88a4ffc645b494bd8e7f3674195a980c83aab1119dda871053fd0c66ce2477398f550b5fbf2c0cb41b57e911996447ae20252c4ae4919a08de932a855b17e7330f95313a745bd2bcff96ea9f7c66742d772c7338a77b500155b484417d72480d39f3baaf3ae8f89964a3c006055be86177fe2f50a8f07ac9adf8db9f72282b20dd124779d1484385c531b0c56da21d43d1b8cb5c345174f2033b5d037196711e1b8bb22edb20469e9c3e5adebc0acb8550b6b7c61396c1208ab20a2983c3d4d27fd1c53edba3208910b0a4acbbe07133d0e6025c546262122f156908ccfe91bb8d947a0fb47ba63cdbeb46aef82072cd1f68b5fb8f0a7e2c0e87828474015656147f455604bef472c43ba1401b8cb0a7b8c3705a019b8db557020a687bfec8623d5d50be018c98a8ecf9f971e039b862a88de0f9eb0e3c930a16f6fd02318bb44e82144b071c3804d7fce2b907e6c6eeec9a7ce900bfbd08972cd2986f84bdcc10ec458096c374203c2be610a2f28956634450404230b1b7545b72ca529572c554c6bf7f30fe18059045c7733ef4011d54bb623615f8201ca1dfcbf02fdbeb457de12996d6446232cc59850a12bcfec52704fa43cfe875d33a31add255bc296db42ba90ef23aae6e022f4aeb791a43b60ca12b253dbc511b8a9a364b0d594807e132d6b50be5f497722e8c04dfd55fe922951bbd9576a82d3f976b0cde84c2402e7af3411ad13e8ea06242f9a51ae2cc774d9945e8d909d0fedd61785a7b6e1b0e92ec005fbf10eebc14b7034a55c087015ae1fa0d3badd3372658060e10ba988d6845cd2c1afca6797cd6caa3f393b250ecc61bd8201fbb8ae1338d67334ba308673348a2f30fa0c80acd8854f4b75c040183ef906f08379f73a18f7da9506567102ad0b7108891956693fcac3c2694995e903619f794faabe78353d57fcb47b1f2b3abaa501206e7c7c1e22dcef30be0617007557fa0319fac34f46e817d7a41c8f2cfcf6cafdc39d0e7c690bafeb9caac747b6393405082d9dab680883753af3f3779a8068e90c18d5cc92b5c896d7ff84e3ca9d6ce374387d38e9b13ea04919a0c355a64f2160a906c204df9e183f07fea9c2e4c22cff229e1c870092222b878cc540833c2945c546e309985a9d4af94be4324c9301436b8bff53f0998ebc129d2a72edf05540d9a1751f64683ff153a94974ef793b19f9e409b0f732398315efbde44282a980600eb1d3c9c831b806d720e143e99a868efdfacf0afc70b99b6e16b4e713e8cdc8f071cae6dc176c07436a24e07f22a790d40568630d4dea44cab4257f07d2bd43455f05e05371d71827e10b37a2ab150675f504cdc310bc3853a3ed48c879b2278da5899f0b9119c35843164b9f0f89d929ed843dc077378e231080f6cec452aa459ffe91a5159368cc891062821fc41096a0eb4babe3d8b531629b638833eb4b3df048afd75a8e9791da44d0377c0043df240c5d7ac15616a39e76483367426e871b2c3b75f175551bd2b48f6f2a5205c3bec3ea07716440db1a662d57225e060c56f863d9e5fc8eb26de6f7f0a087463bdadc2e4bacb871b9de121e66696f8ac61fa71ba65326a1232529b1f480fae072b1933634ce524499f5d318aa8aa35116d6e001086585d974cd1b622fa92acdd5f708e227867102e68abe6a40a7015d58bc448bcec6cf10412f8ac84886a2304c7592bc8d4f5063ee495371406a6ac3462951a1de872c5654f374e84d4b63421fe3faa175bdd38bff6e36eb26aa23ad75ec27c5c565c01a49908138e8c13b682ea6fa7d2f426fdad94d73e6a0553671a213c256952abaac97b561a850ea3c3de1b6528cd58acfc17d4b9f925c56f2f76f65b8e10b9319c636eafd8d85a01ae284d77ba64d9c33dc124d9f7fd7ccbfbb756c1c9e3cc417aefbc7a0b3e48f83339657d7e59b2cf57673344ef0d162e09783e92b84ee7616d6f8df68b90f8ab6cd44cbd001ae15e9103804d5d2b161f20bdf7b248757676badec447656717fead673f2df17ddd041431fec97de11b3790f0fa8363ac0ceb24372a19966abf5c4cf037d86e53eba3d854925f80bb396524331c3bb680800865dd35f59926441401c01de3fc270bcf8b101183108c77815b9e31b2a7d04cbb333fa13b0fbbf5cd6544d512a80b08c9c16c0799d0cf02598cef81ef072e4543392c6e675e14f0f83d1309cf79d2ebe71c428e08347dd32e86f0468d3720a0cda74ad24922a9d0f7f85469375d2c744b023187622df634b9398fb20ab607bd0c7145e017dff330471e43db1ac8d632ef5f202c015a15ac14293eb315304fba24d17e05b2527bbf17aadba472757bb7f264607117cfbd6705e4a236462c63acf47a6e2e130773f989b2cfcc8c7852ae8775471b52a17764eee8c1e8ac87f7423595e05a8429fb07defb0e632923a0e0f7be229f4a95d3664ace354221afe1a2d0ed5cc8570562cd002b4520d2b170ad2e2ed4eec9c568c2fa4c95d6d70cb5a8714ea7cddc85994c5cdd9d80718d3454c84a6d518353379f31258093fb11bf92ec1f00043dc7f102efa4034397713d0d422352d0495b9f76161de9a486b877f7c7bd06125eae8d5d536669dd4ee0904078b9e560c748024cded3c9d67cc895472c1667060a3463195d6502faaa3fec0f4a8f2f22dc062c0d6d192ac70e44e15c5800e05060c029cc9d18c73942420506e0bce592e3f5cc6e49fdfe5269832458530c14dde2becb109d92a3f98b265c20a60c1019929f12448e07ec024de823de6d00b163c2d612f64bd26609afab6e7c3cee1261d44c2b1d3b29de7d6d100f32adba784bb70594e6b9353e34fafe06560dff1cb63a0316b6d1779815422a6a4b3e740a47033914f71163c2caa83164ce410839578287ebcb522feb6f15b4875123988ed7de9a64cf7d959f9f88c4d17a557b819833aa8fb26900fe76df13ebdf97d05b5a40f66d20cb1e13e3d73eeac562dcf991323faf6d20899a988509a13e2327db2cecb49811689734e478050ebd62e10e2e19ba73b78de3af055a247180117b966c6351eae99913a936717c9065cdcd94e72a669a6d7cdd76bd3eb61dec5bd1318ce5ba224af04e74c2adb49347d9292214b9c863531324746d5575a30a2a69f906def330cc26e9257e0f1d0cc992b065ebdfc5000be5949fdaab83133cd46c0f0b9a84c1973803aa324cbf7d7334221abc147f6c8be5552d7011d2089700a37f93ac0e2c1e2ad5cd3f7692dc56559d040e2ab0a4943d9c520ae84d908cc0beb65388821be3ae924633afe6155f275392150bd2c1d7ad1dc8af861c51694a8b849ba2d1ff72a780dc7cb4e06392b9596ed4a27550e5addad288650137bbc0e40112466854e3695ba83cae8e2cec700148a76ac6062f295841817cabeea7d13c3b465723f06ec7d1d21ab3cce60f312c735371ae440f8f5ccb09696a8019d69db1c0d84393e4c480e6726570eb688e0b13078f26204e8e40a2b6c63c1c624bbc09ff4a09e49ae8a6a7c6f243d4da832e66e1421fb847a5cd32ac71c87f31a9ab292a470967c8fcd05142c0af14625a72642e348bc8f00260c46290d50f0f41fd64f78f3e1b661a202bf42953c915cc945894aad2e244b354ba6eac646c1ae1056e58494e376f4a18713cc4bf28e02ac47b150aea80013b4f57b221d19155b0d859e8ff9b5654d2e2cd1c6e23c5dd046b01282f479eec096701f6147300b99d2ed142808bebc07c814025293000b2ff551c62a828f2323c3342af8deb660021d9ada783a724781a05a7311a2b61d1148da63ff70c4e968e47b1442bcc82bcb2c6521c9f0eea18660ebf11a5f86b9d829835bd4637ae70ab183007ef9a53cfbe6320a6e564fff27a80934a8dc48c3bad8ef05af4eae276d605fa38b6dcdac6224d5611f81c4c85d329748d69a286b88c5b46405325d1863e569c63071e922d02a588563a92a50ceed7480d7f616ba9af7ace17690e231b3d814080149e834e523cce9bc28400ae13a7827766fb353e0117b75740340513e6f2a3464c7224c41db3054866309053e9f548179f343b4f285de15ed43d0f8738efba36631e9e295cf9836f4f5bc8c0efc5d706cac883d750d9ba38a35eb841f177054c0860303f6d106ff05d26f03ce2337cc41fe0a2c7fb4331dd8897754024bbe6a924b8851a60990155d986e3ed029bea90b2b4116f859291546d2f3cd319e366696685ed475c5fce1bbb2ab43b54b99c8cc3248d865419d82917ad3b689e50f5a25f6c78af50f667542e6cfd778ad6b9a5368f1a22d46bad04f351275d508308cda15aa075f928415696a0174279ebc0586a374de99fa39d9b5d0886fcc9215d11da1d7f41552a11b340499b344b245f4d843c84fbc9c3f24c65516c802e88f23adbf7bf0c966335ea30ea2ab99985ece912ad4fb3816d078d7335b5b033153c560226f6262dce85bd7034dbada7981369d18a0789f2e92c5e6b2b651e32828cc75af34d5073e6ba662a7136f4c822fcda69f7a852d4c01431ea3455d8612e0eca92794c107d3b624b022766ec93d32f65d3b175f9656ce6d0a8b47cc3ec689362f2c8e0147d93cf3aa938ec062f009183343f1d90de8073078266b2eb4723e7cf0814e2fe33860614dd7165949cf7ed15eac691e89cd132d925bfe37157caab9b31baccfd4288a61bb34de3e917c2003431c350639edab2af9c3f0df47d739da2b2ec8f4f56e65f417ed84521c9d16b81dd004f2fb7b1029f34c3d751f16720a1817633ff2342d9042c6f1facbe679657b6ba9631186734fb2ba1e847bb542b1052b5c1b98efb8c62e87ad050278fb0da51316cde4009a22067d156badd60656073895ae6d22e3bff682dfc9600497a2a93e97a1106a1bee0b1e688ceba2329e81bf3fe2363286e646c5dd186a9226510858e5955dde9e66bb3b7bca26aa1f2c840b6048a2c22e1bd8756c96096c98acb762cd79d412843a260451feed8c5faf31478c90a25c4b3a09ae591f591f6177f2a155a8613a815afac204f17913c74784f8ba539b0e6f1d864e6232a71c336ea5985a89476bdcc5f7778b07ec33b48673a528a8814f91f5b96f4e9b98648e4b39695151b9ee4a1d05f64bf917dc30bb83e30b7a136639ac1a257fc07f32620fbd4cdb42fa6c5095924717b472d94f53af3cc0a03cdff09f80010dc80f7a12a30debd7840c08aeb3920151039b648559b4f9def64e20e20037da3ba6cd8ed667f10f140aa87543e695684813ecfe02114607342113d43be42ffc7aa2f544d9700dfdc157c24987ac3c97827526c235e503f2178475e1bdcbd9f725d13308be985f89c2192b5b985a71bdcfc57432b285fc836a794264aa26a0fc00dc87dda3f2e758ce7bcd8b0e4140b359945bf8484c04a58d00e5c1db769a8e3ed65bef988cd0c4b7129b527375c4c6028468676d59b836eeab373e0cfaedf77541cf59de8fd9fe891ae13ba2178b7ec5e2476a1fd1bb19d1b0a4ed9df16eb0222cce86af06aaf0c3fcd95a12b3ae83106b83ccbf7eea6b318d08daec09c26131b9bfefbf53a4cfad4cac3a36ad446dc2f53c34d369dfd6716144604a03b1262293360c66e0f5a8050fdf119b62191ef9b92af68ae20025fe850750b3bcd566225a4f0f91566180c480bc6505b1b4805347888055c57c8414a2c1b883be128306bc9a5a8a89546d5f3e6a8c1f304af88e4347032283ba2c6b1e0a2535faf4adf2a8a18b0e6ddb62d4a2bfe2a11333483bf09807148758d1bf2496499ec902517dd57c31abc3c7b06c676cf6698bb4a0917be158d644f3c1a7b55b244d2e7db031d93fde5bd813dca11d890f1f530b5ec473b419f7670df150ed15f09c56d806724274942a02d9b889b17067be9bf5ec61077a64fe6bad4246da31d63a458ead650ede3c3505b3ca74a491a0e706ffe5909dd9319fa89619d651c8b32c1776592b47f63dd8147fddd15ee725c9f1646d2b0a742fa53249bec24e080859003c5f9061ae49839ab79c9d2d92c39d79736119e563af01d3bb7418824fc668ea1089c2635131bf3451d757932a082c1e7f0851f36e5cd4886fac90772c509f14069f5583896396b579b06c037c3e3f8156e0f5e71422e4d45c61c4fd2720aee25871359429d59aa937fc1af20b2f004d6db594ed905a815a98e840b1bac08c2faae04f79bd83095d53d9ff6de3455d4ed957615d794b66c961e7e006f21d7aee57a2568d7eabe651b50a63c81830446cfa13e5178fd896ac51f31503ce2ce64cd06a61eb5d4c9b2a83eb73b030933493532e29d036bbd03b1a8bf59ff3f3a28a75435f9b666a3ceacabe8f3cd6463819f4471c3db7ffaa2e8e4a4aea88da34e7622321819b1a872803dc5dac92940295643b1cda828878a4a3ba658ed058f6b1417362629eadc1db67e18558c68d36e9fc3acd3c938f81d371c4364b8fbd324532c583a0cd3a6fc1d625e0d71c3c94098d301499bb58e68f7744915ff10d76680cbd65ac0fa1d622b3e9dbe2f16f5fb6b60605153b7f6c7c14b723bfcf4b398e74ce65ac30ea9b18d1259d08e1c66517e84528cc9b940ee880a4b3a4fef1a2cc2ad908f065f55150695727958666516f2f1980428ee12cd10d4169faf077b47518848c4b00a1df6ecb6889f545d9c43165d16acc041af381e0c3b8b698268c399f2e2229ee86e7690500d907b4aadbc19540f379e042a1302fd6778b84a0f9f908a1da6b13fafefcc7f246dc227df28daa7220940fc683a54fdd8c857a8b252f8cb591013b7581a17f69b6dedf35f54065b22c9cc3b5f49022c1f98c6f391b40100c6757c105c983211a1523758c3dd9b0bd02532d437bac10579632b6d8433afb4354914125319eabdba434458f606f3f3cda36d608842f2939b630955e2575a86b8d86131b40b050807ad0236ea6cf3f9f18252c2a7ea4f2333e82fe95046a1dd5c3d538fe24b2795f2d8b64e5796ad10699c624d2b10d5905522952256102ba83f11e5150a9b0517b629e57c6c8779f1fc2863854cc3331fce734a6a7d27006b1fe8c7b1d61863eaa35500adb41c5f69a1b73e5ab9fcad1540f6b44c2f88fc1e06c6b364a5f062f91c228dce34580c934c05d0216575542792d56d5b15d4582616ae4a8218e3c5ef0526e15240cffb93cc3c4aeef4e902ad4044e742d2f3520cbbfbbdde59ee50f4aaf57976e5fbc5b94383bdd233ed897d971203702ce9ba22e0b114f1201190c6180aece4986bcc118062f500ac8b07218bc98e82ecc2fcb24f066a612fe2ced05b6d05ac990158ded7b3e50002e89e6d956bf9a2337db21a4acbc3e237ddb8470035ddf14b215961008cb82f95a159978aa3f1938f598c7f56fc114404b9e850a98147b5f01a557c4a04817034cd5481720b1d78b65b44358db473a953d7952736f2a3327386025671120d92875162c6d404643c31ef96fbea9ed2e4f0f2595948e6687e41a03daea9b1d0a8ee4339f1fd4585cd9c0901f57482ca5ea81ecc7dba2ec5764046da1107d523bc3ce4c6835940d51297155474a64592e03d9924e1a9d090139b6432c92795107310ba1564d3e844ac57db7c3b5f7dffbcdf46b3e4c8d309ba45916b780e40d8b2ea2f48ad241727b6b19924eab4eec2542b917538e4330ff7b77181634e083f8a236a2801d4575a1a29e8464ec92fbe29f943ed66bd65829b686ebefb43ac370fd95808dc07ba50b5a39edeb910337352978b8d6f4d05ffd37145f02a3afd9e04febb4ea5a5f9f87379c320e0a286813f81dbdc3e98d80307027f886ca027111cf42dadf6a138ad01fca127cde1791a90bfe371c53ef231b7ea655e9e9553b0982f9d6bc0910ec19e738c493d85e18971206498d55d4be4d9f0b1aebb40c5a91a6092589723f090068824c1da752af2144ce2d4858a95a92472959df68b6cf0d7f57c03d1660d2e67acb0b27f4b77c1c04ca1d357b024528946d9df8aeae6775347ac07ae278a1b88efbe77f18afbb2d62dc1746710d72be3ac1cc1495f86a82c5962ba53e73e2740943c9ad64fc92552eac08095f91f0c244f87967ec79108922efb213925d6fd27aa8f40f708db96b51a1823634375b8f2c264515ca95c8801046f3ad6535bf6f87aeeb472213d108be6854c8596c606f8804083d74689ca3448cad6654c50ed508a32ba33dd3c83333933c98b98119c459bd40961b2e163444a3790f30fc718cd24a15029a48585248b44298c7c0debcc3ec155ef49ebfc5034f65094d9474428400ba2a85a008dee995f7b86b4c66d8388dc162e7e9fc7b823addbab9cdbfaee2c7f3133b4445b8460e7b65b050c6464c22be90531383a8b3e6f591f38afb0695ea3853c148174f36ced3a6014ec00ab16d57baa9207e2d38bb4be153a367e342264f7ebe91e4ecfb5e9e04f957e42c099e8320c4897c7d2f8b07233e34bd0816e1ebf5cdd0a0552d74b3664a456f3cd76ddd2f2fce7ef76a589fc713c33ba1567b2717b7220889e491f2bf6db04064b1247ec0017fe6dbaabaccf9834e991fcc759f193d7aa70fa1a8df38785b41f2b4e13d5dc2600344abe4a258f9831f31af10113f453a9fbf4e5fdb9bd13e564e710cbefafce19e7efac513660043b76281acc113cb3dff526fedde4e9302ed1b3efcf37a6c2a1d879fc2c188a8237b2bb139f3b898c4478cdf214463a42e20150cbc4c914bddddedd916ebaed479c3d732d72455360f41752cd0654d5288268318ddcfa37d1ef277207a891af8edaaef472809c6867b67e231ed5bf883ffd434c2aa1822fd5d87f34e43ed5fb87819a72c5f01def5ce866c5eb339b5b5f3abf86833e33ba935b9ec83d1ca618a4423517443c02dad37b2054556b8ca3991d8239109cc8e2504ee7ef5cabd9c6e25011ebc5272637a072ec4671743ecff3e05a6fb24777368f26e6e690db632110eaa4a20b8ba4a5797ac7d7845c6f3e2eb179712812b93058a5c53ab7b9ee42cf30ac6c2740ccaa3996ea4a3392f5b19e85c865745e842af256719da6c51ebb362b8278a17209e8b8aa4cb4b1d4c38098388e4793a4dbdfc8f1da14b3fbf46427e8360ed93e445eadc1720ef8ea3a83ab1cd04991ff365c0f4151d96c21ac5021753ab513049b4999cfa27f8caab11df0d75de2d5254e0908f310a69c466a1517c14d614339cd5c0f2bde0dca9098f279bf20adf463aeece92e7b063fce7c751afca2c21c50e8885d61914c9aa3dffc8b3cbe0fdcf903761a7832c5a76089faa7019e86feac548713a061a749b1e98c338017fdcb6865f8768626ec683458afd3ccf9bbf691b3441a7fec9768de9b0637a3b3293e60a4161693930847ab116603feb26ae38602842ab44ce13cf5803315ceac42841e18e1cacbce324ef4891a5c9343c523212ccc7a4a8ea0d784aa1469a60e0425d8ee7e2a3bf41a5d2e9822f3d72c1cc5c16008b2a6a192847890fd347c3d3ba6994ef01d534e0e48ad68d645c152de9d8808b12613ed7eb969ecfb2974709147fa87edcede7ba63ff238e8b75cb4e7f395b7aadcca0a20b620b53f3c4b28f36107460a13794c50af28bfb44f938efc4914182258288ea262b2df4c83c7729ac0b5e69077a58363b921f5d517022433d0682324f9162de65aec881944c3e5bec492b5f628ece01744e802560445e619e7d43b7645209716541e92551b8ba6ba942dfff2f1dcaa18263ec3183debcfdbde4f41e1efbe29b090e61912bde3b27aa8b2b7fc3549b04c6ccd441a7ac7aa4ee0601bdefc3e740dedcf3921d9298fb45d07b597c28a3e2374089a10af9090b0fb208d33c2fab78f2c167f012604572357c02bd5a5bcae63e5b2a58bfe28b88df5e31e84156a54ef78d39a92fd0704972d481411aba2fdcb052e63df6c0ef4f55be01a92e006bc28e221018cd788accb0b39bd812500741fe8e6c9783a9f32211e6caeab9880a70d75b9726593695db4f71069e8e553fc14e30c6e60e8256c94cf52657d7099db636b02998c2734d80b43e0b7e4f28d6becb1bf0762d3317dc74ff13bc5a78429ea4c3caaba9023012d03a97050feb6fb54f9ffe754fce9b5cfc04bec16863e50fb8ddc4ab12f4d7fe99219edf03809ac3b66fce19182dcd7a5a7a63d320886ec7bb1244ac5f9d7350eeddf55e3ad4a5f5b997a66393462f360d98eac13e6a87b8434b1e7a2941366028d2d4e45496b7302ed2082fb33ce4e7c7891d14a786180e73dacfb4b8a23a56acc58474de736aee3a1931777910a94aa69ac55c998db4d34945aa2124bc00dc91d140cd6f508ccdde51d5d3a67cd0a7b8931f2a78525d830898b5b439f41eb1cdda6349195edff6c41031933f3211034f01c273206f35d6a3da53fd05908170c65bf15f4a94bd18879571f74db1fd2cb4c9d8eb789db2b8a549d40b4b42d930f9d7ea3bb33186b21a1b67712e43a41f9e6a9943ce006805264525baaa5a1155f822ab0c0a3974dc34bacbd6a8b8e049bdb0f816821a993ae36e139d8fc7018fdf3fa60841336788809e0a1259f4a292bcce22f7f80f2a5ec19be015028451753cb7ffd8a2c4a223b3c44661622347a15d57d8dd3dcb4610f9bdd1c4c97f5dcc46371831e98c0b17f40e37ae7a80da15132a8d23049131db3f83500fd86cdc09f25dd947ff16a37cab2342123fc1b9b5a363bdfeced531ffeaaac56057f2d2f928a3b2be7e308a2a698e9c8cf6b4961c1989922310d95f6c0d65c56db0417f4c028826554a90d6fe1a5dae532a08e16d128932a4be87623ad2d8b0b626a8e4032545586b6b513ed523c7007d348864da52a728b356f91c681f5d6749dc9aa8ab1ed1db11108260c3327bd51a3b551e7cc6bd14498ca1e370c4103f80e68e85e4ec46f2aea7ac41e8177634851394aeb9c070972c33f1a768eddda420ed5227573afb9a7bcea4b09db8ebcda17846c1f722aaf92b277cadfbc2460eb28affb5282ad4fbee62b51b68fdccaaba46c9c72172f12d8f5ca57be2e616b54d3cf364d1feeccee37b8c02f648a908ede40a6c3986c11df830a2147dc98e62f6dd28fa6d111ca54dcf59e2cadabc2460ba752dfb2547004b56e8d3d41f489a9eeb581641599646a11d8a04892553fba1609219c9fea8c5a67da894a31d0b8638001d15c6c7dfcc8251e117b540361c9b9278acaa0738981164192acfad1b54808e1fc5467d43ad34e548a816638c0212036c88823cb476c6729f649d5d5e2dfd86ade0a3d9df75e530f4d0ef3dd986ac85fb8df9aa1e5079f8e856890896ffb1ef392ad14d0fb6420f91c2c5217a5396244087c1bbed5aff09c047addd72ec29e5ab0f50310965f6ce8abf37d15f9c77ef93976f990e9a71de2013c7fcf97a240b8afd7b695045af9da44e41130ab6506d20f9a56a6635a6170193694227a6b58dbb9820ccec446562257f0de7b6461ed6b80ab13c33725ba8e0fbfb8eb99680208b5b87f6bb0773f6c2ddfdbad0a1f7f22553e57e55d965e9a8e72f8dde45b73aa9d825f1f5fc6886ff440fba96a64f304c852c4a8efb9f6f9b219dbdd6409ca814bed4aad25802ef4b6a2088a0f1dd398ce06993b2f93d0784a7916f49495bb97c3c9e6a4ce676ae5501b0a2cebcc8300570e1096915e8ba56808e632fe59622e58283b412ad33ea95fb9763454143081baa4740320154e59ae80dfde5f84c8ebe0849581debabb932d94e9c33a3222f859a0ac527337ae337de44a3f1001cc3f12ffcc051a508935b337ccccb51bf88af25f200a8cb4429e774c42cdaf408ca374986d01406902051643443127206751346754d8cf17147e1472fe742b6794e0bf3df7040a2cc7f884860498d055f68a94935b32f8a1f7417f9993e97a8bbbc07799c831a96c26ade9f3bebbdb502cb9a5e826ff6abd42601726a3c92345213509d3137aa3075b38c52a811cd595a82139e40c4b41ac224c90cf549ac30ba32dc226bc7f0dbee650d77973f12771e7b384d152980c3f28bd2a16bfdc6b269fdd9cfd8d791d57d291757a6afd7564b4d49b9ee40ccc8f2c4e433d6b97fecff354b926d7f848d9ec23a80c38e12aa32dcee1cd2389dbdcf4462944408d43657499ac5685b3b78a9d42013b295b111e432ac769b2f5f18d4a921ef83855e8c89632689c3788ab4addad6b9e85a2707b8196fea0b662d4d65dd136e28b6dd0043d6108955c18f5092069a0ab7a910fa4c8d7da521c805090b17935b96f0de20fccfca8bc185115e10b3252dbae80e8674a359366fd4f0c5827f3ff0cc33e8f068126646b7e18816eefe7fa83106cbdad868e71e59bdabdb7b8fa81717238005384dc4d07416225b64a4359601119740d51880838738f0098009dcdd51e250c05cb5a58ff6fb47431025538716bf73d514058774107693347182a8081bfa29c81effc73e818d6216bb375750c9111ba4bddfbc3361fa5f5ba38c99add9806fc9e49d47f4add06a7c1bb6d96228a1bf095feaa79d94a6f081cb7f740a5dd3958c4198d0ebc0512f6ed8b53063bf5fd474e3b6336b0212ca31b3e647dfe973b7457f77619e34013a11c93930649df7829827ab76e9641c1d58a473d810fb83773c71b8231047395927fda33cb2671f5d4b50710f75bb6b895b9d9eea36e3b1560a0e21598900db1e5924e1ad731c0c0c7dc3728a636b64bb663d6a10c529d155a11f244f65d0566f5ca0b59a223850a4776fea6561c78e7509ff297360afcca7456db7277b0d39d79c3a66405eac4a3c386133e8ac0605819a78b7e9027c0f16188e7773732b563c6a644c39de50a1d6e790cd10203c0429c4e351eeb978744b0fe8b2b08996e04e17877ccbc5dd22704664a1beacdf43e4d6e9cbacba9b126a71d520e57bdfe4e1e25b94aed4b84018ae03b858ac2b8a2b5f949f4007f2f59d856f3efaa421d034f80c575412b7a813a5f89b3c122369f988451cfdbb455b4154b9d40e9cada3d455fe2243ee9e6019b49a4043a085648993505232e28a47d591d472d0b3e61cd0dfb402df510a4d8fabb545b18584836d047ba05b37caf4ffda7170bb8e7a7b7d7381de85daed047a097f93bb1d543e6d295b12086bb80ace607e2b5075b6bbf1fa740cb80582c4d9c3010de6816c3641b0137178ac45f270ee5776ccf4554d120f5177574ed91b9d3c9130bb5231fc6b1a06ad87bb37ce0ff1e2d4fe15ec210a89d441d47ac2c55db76c608b4f31a19ee4ccddf90e1837c80963bdbaa7f9dab72cf408b8eee07fd539b799ad64eb72f5dd0884f0fef3fdae8b063eb1d180967d597fab125a7b8030671502e644401525f0ea9ab51e50e4917e033b196abc2568980e44bfdb06231685430e8baa143827d6407501896ed373f09541327ea8050792d5c79fd456eae747281d6c75d45a174076ebfa947fdeaa017fb31c0d6001290a2c22e1065dce65e2181f58a80b952c78f2fb838870dbfa36e13b24bc2aeda4ebec731752aeae913ecf4188b5a575ae8899c42cdd67c21fa45a789250a510b1dd32c037920dc2538e734fde30b14cbf529eaeed4d7f776e6b44b205af7a9c84e0c415ff83a1e604746cb10d9e03118be45ab92836cead11b8286312a8ce55c23a6062c8f2bc89b57552107d4e7e1e393d4527e0bef77884a625c658beaa60c40b8c5e22b0881a1958669278c21ba9c06be9961c118aefae8771e46b668b576039c3a87c7d59623d93dc8ec42c08cab1d427780c19c24b668e5ec2727b4dcabaf740ddd3efa67995a05b6e2c784be337445247658410b13ea21552b7663ca98d24a5f550b062fa142518c6f4b2063942456ee117bebb606c8f3e7886db9f2d60dc71798782fd70177885a048273ee956874437cdecfc73ff1c7f1c4f351ba9876585aaefd51fe1c5786544bd64147dc219e66ad82517a029c55d4ad81b5105c0205e5d2ae79861b36fe99bd3068cd98d34ebdc09e75700995c7e03041e81fc1c9464f28d11c5225aa2279f2f969346392bc3a9eb060c48fe3c512cf3505e0596b61cea549eb321ea29b627bc14f7a76d2247a951b638200b7b2e7efec55450fff61aefe7bb7ce172f10ee0bcc2e2716f6eb30b707a8fdbc6107ccbf0b996081a641268b35d2b963f9ad6cba07bbc7f67d0d73dcad7ffb6eb522a05a1df9901b1a227074a88d7a0acd903d8bfc2346e9bae442f2a92c8ef3f30738e8990eabe01823f5fdf519feebff8201b982bc0151d8f1bbefc590c8f283a65f7c028bc96eb60bd46346c12c801c23898e700c29e0cc71816e6fdab7c51130890532f1fff0f1d179e6908ecaf622781f3f94b55a57c2b5ad1a02428d07ae6880533d5e96596628ea4a290744d2cdbada44d21d264bea0b3cfce81ade5b6d94564a65c1c0820aed02abe236b919bb0f52ca6a451bb14036ef9749076ea82856dcfbb92e3d44b0013db4438091c829de8e3958159fe34d12a18207b24c52ac02230c24bcb95ec65875e1e030e75f04d35d12488c152184d0645e00815a0e7de96066317cbf442de66878b3ef68441e918d444bb165c3bfe20d09d9fda66a648c8db9541d25febcab5e01fb078ea56c447e79b2265df11ffff1566a6853a78e1ba977ce043a4ff2a2e0694ca113cd7607fabfe112a21f37e1693408c6bc5e558c95fdcacb243a17866872018f047a5e3ebb1b1992579d1cbe5942d2064115b5f9da30e317d6309b244e5e6d5a5ead1abe2cacc2c88397054240394f9dd4547c6ead56730e111a1bbc583187385d7ed8dfdc9c4ad3d72621e2300a6f0af27af6a84da0c982554d16483170b8c17fa0c3a9717958db805217ab21f297a6caab0b2aa3b0c17b1d6099115e9d3889f82b13a6c112891097eaa6838c71dfa896b4086d915194f8f46cdf05ce5de51502d3fa7ed2a5a35612e52e474958d05775a7365d4998e9bf69aec8634879e592a9ffd7b823a143bda22f868657eb7fa5c8ae787bdf83a08bb57d5e240082669f57526d4e90aebbec70b5a06383b8dd0aa7704a7cc11050061ad151d3fab7a89fc5e40e8580924255271a7a69f17842a5a1b1708f516d9f8757541984b329a53da5811c2408faec5cb46b254d9d21dfbd6271bac2f06bdf656e3bfe5351421d3761f0098206f68bdf61ad670ff7b470a1a826e595138a7cbaaf34aee59b6cb1efd7133a1bddc1b3c7e33c34cae81d4b1b5af1eee1dde4c85e5d430fe9b6be879e9c37412db3c2d2752c50087e78becd0cab82c61ae43a981db55ccb9d05613264369378a6c7056e22da4f72a7377889d60b043252559842270ebda4ceda24ef69e83505e16ac1c1248f5f58add304dffb0205ddf894ebe4e39a2544e187926a27bc702904cfe3a917f76945885e56c17e6127aff6b948dc15ab512f2945f460abf89e9b2873a49af4d55c15ffcba6f1048784f47ef34a1a8412b0d090b2bf5a29f37d988995b69357bbeb14b16384c4ad6d3eede55c39704658a61c45b6914816f328aa675e55467097fff28392abe1f4949d6b9a18a4522f329a2fcb01237849ca93aa422df21a9ce3fd016380db2e94647fb3320f80d808c45056c4ae1d5457b4fe5a1cd6090c364ac7703f79c4d04be45559215fda2057ef24af10514f96ee7b277dd4642d5874a9647ba9b2153adbb8cba17bcebcaecafc6ffadf7a6f06595b4aea5dae5afdfda6a784a13248ed6f5651511559810cd08ba87f6a97533e09701bf2ca27cc78259c0197f9db1b49c5db4e8afd15c96d181d5a4a0569e759ba65b9392f4d7635aea562c447c81e5f614da9280ddf15f7e15df983054a0c70cab52abccb530318017b2970e4a488a38a79e5b83bc66f5c3038e87e23c05a95907ebabc9f109aab7f5486eba18c1a91ced8cdae816e87723c6426263344be8a47de15612874b210d3bd27f751f0d424bcd6cc91b576596735173cf9fe2beb29f0aae38e8f8078400320a345a9159023b5569981f255019e2cc64d79f33ae3392cd22a61e1dd8909866e832f034888102cde8d1c47109a4f7a0db728c925940a69a2adba2446214f5d48e54095deda45541e3abf428e062fe4800f89b92765142e0692ded83e0955267ebff33e6b81e616e75ac2b7de6f5f28365925fad66524443006f6c1d5c63f2c4ef36abe93a30b903a3e2ad05c8dfc6ff27ad72f787a4d5fa402dc6a565d046a60e99805c5510df128d3fadec63c63d0d9cc103d751a557123f22fe9eee69184d14bce04eef21378b61f4603706784801545c08d4ecdf875e1afdc46c26f7112fee6c88d68e8a4d824dd57c22516f870e354b31ec5df8abdb32daff2201a156fee49f80df183fe854da47219ce3c47eaaa983b5d938242635f3c81c05277ef4772631660b2f796dd668d131e9c9266f14cf7574171c77188735a0f156afb117fd166f66eb02af30718e5cedc1c1ff8da49b5584423c79b2fa52c1c54a7980befa8c4150ecea687f82260636c32aac6e016449b5bef41203e491e7fa2128755cdaa86ad1503abb674504d43e8503270ffa6be2d9274256755ecfe3f682b25ed4733af74b6e3cac53b0e330e58dfffcd84d4de889566ea37fddc524db0f02e558e35ae0b71521039bc6b7d6307aa84e26d54e0f8d9ca8a4825afb0bf5e03b119ba0294bc1a77b8293728bf9cefe16e922599b458c192135bbedd60bd6a135b37453cf0a214f4e0e7581e292f45c0f01cb54d0b861d7356dea682ac624d94613ab62202a80392b3f59c4435829321e5c86f3511c3366b39d799268eb2a53e96a504cf39ca874749f544b1873cb405554faf679d83598125c2d0d2f877520562597d4d4c28c0988e95eb077bfdcca92c50ec820389f4a21dc92e00ab80662c93f740def358da11af01ed44e681881f04da11194937489f3b2ffdc0c416b887024b993f3b81454092e10e3d2207520aee3bb6a8f06f9cf1e5cb8e0fc0a604a814a8349808004bb827fd25c8e3748ab46d6c236c3ad9241cbeb8c5ab8a49fb46b6f2afd2ca54f2ad6d8474b6ed0708b541c595f8b9ee4563a37f799c5559d1065b92e2fa0722321c939906bf6e5f61e4d0969d8bb05f1a086a2f954d2d969c9af42aea143c5bd7aed8ce27410aa2ac1c5be8b6cda69eb2ab67deb58fd7c85aedbe220418020ace303746e438ae7fe7bbb2f732c636a02fe501d589e88a90efb00e4603381a3d4eac19f0741ca4610e3275a2971b15c77d54df8803b5f387ddbd60dd6600913b4601e13f5a27b88a63d4b96f90288fb43ab8895f5aff8caf7038b0ac2508efba80b51ff319f9fd260700411c08a2707294150619db73750cb6e783b6b82a653ab2e3e253fda844e9c04b3714ff635e5f5ed8fa9e662590aa528850d3e348cf9039f4e2cf49d6016639153138741e75e6f0e16e340f9ce64b770e2ea5bee1b93196140f4ca7df00f5188a17d543785522dc1869791ee8525268fd230df754cc38ae1a086d5144c64d8d1805b1707e03897e04f2985a9b164f0b50495a80fce52344a10b99aa7146685cb1531ca53520fb146246f8d1ae6439d48dcec24a7fe5150f35a21405bcb5c78c400b884ed9bf9d0ce67fdaa778786605b4345d044a938d32628a89b291b3c857d8141632978636b10ee61021390c6e530fcbd434520396eddf0a77e2f15f087446bf58a8f50073db3a7947481847eb5cc3ed6afcae7db722d21a40f17a34ce1b11b5260395814b40766f3d2fb34f8938e6abb7c182b186143b81b49320c45caccb7acbefd2012377757bb0d252b14801448e7db6ee486a15676e8c3b4391a8b8a9bf5a6b4b105dc0e9f8019c87511d8cbb4e6d040c89f3c18c769ca4d3736e0e51a0719407d0edc5ec8ec6e10e5d1a0c8c62569fe1cd504c7118566cb71d97426936b5009b7b624b43b3c49a3fb6c808d43ffb0ec2a3115bb60e962dc3a211c5771f94a311a33566fb76893e34c8473875e25bc05e08d2c8cf40c5e94c9d0671f16b4c456f0dc9c976149face8d85aa7e6a681b6c18ee8f9619b02db63a833115351df4248b510bfab6270e6ba6e2c068b404b0f2840b045eeaf974243614c8429079ddf1e114929015fa19942e9941f0e0dabf1a87e05255c3224ec8663fdd6e20677b879e3dcd5b40ff039e3f286a6e8490c7d29507a699eea6415b7f3c33e23a858a09b953cc850629d643e93b7083cb7550767f34dcb415511ad58d96516dcfc5e6c871858278f97304017cf413a4ca70d40bc1e8b34ef8eab7da6623428731a030fe615de0fa53c5515a1be9e8f62439324285f7e741a06e67773b6f63fb3cebf634f16688060da95231ee6f6bc55c8458fadf254e36db680363ec86d91cb8bf09f850f339ce6521fe8869a6fc2cf14ec86759918f200eb740e31969d4877062539157377676f4cde4fa08b38742cc31c24ad427a4720604d1219ad12b6b890c18b16029739254e5e2a6610cb730d550f84fc2e0b1419d322ac9f9d4f3722c7f5f9327d39d385489d523a5b7907f9a04e1f92f636fdc5d68d62a43c7b58d84b6492701d0d762fa310035b1b2173ab1866f4ce0994c26c1decd4f5e98afe4553228a4d5eff72e7b1ca285a98980714423617702f5894ac6f1ae4dc7feef7bde6cffc6e4da9f40bf80ce5f54e38a58793a4c88a86ba8e4f41c29f809bf2d37eddbb41b17b402df49d49f761a1366b74936f1696fa270126de9e57abc4b2ec23a7407f17cc1b12e2a782b54cd88a62eca4a54f3e8203b9189bf1614568293720f76c8729961211365e33e097a21fab0bb7fa4d3a6a9e171ac23368b996759b494f9210eb8bd60f2008f42f33b8e0d98d8ca75bc15842aee5a5dcea16590874d9f8800dfa775e140bd41a039f07089d8d38edc8d76c83ed9ae7bbd9d7966449dd4834b20fb340f888f8b40173082ce4a58ecfc95d46b4478ba3a28d1ee7f62f4ec298b01723b70d38d8d86096b0426378b4905d5b8e4b5b2f1b681fa20c70cc0bfdcf5cae73d149a9ef6620c92051cc608c55d920e818c88b51ebbd86ae47d5b917c21a75ae3df0ed87f26efbc42abb429c872bedcd4e1dbdddbc014d544330076edc5c8aa09932382dddffbe0a1be36c45fff4a455f5ca92029bfabd32b4384226afb0e475cc0e0ca4560d746539d8897ebd6197102d24ef06c90067c8ee7e765aa6677b204613c9d487448615f7d99c711c9c446adce8bf7f845685d4951e5a3f58b596c045c258f8e1784d2fca8476c4b0dca49eb3877d8898247e4ec6701d34af92670ecb380fc605166c3713fde2bb7c9ff60d59bb52cbb9862548e6b5c815461bb04466d9eebda9f3084c6a2538366677a55e739873ae6116d7c3af7a5805a4c548deabd8d4dcb30cd1c67317abcd8bea3ac504af09dd817faacd03dc96e8e000c62589b2f384745774e56d00d231e248ad195c09167d96b84853532f7edd27b2b47e016ef3d741005584d8876dea5abf60ce8af0e8275f7a74f3602627932d53465e38c19b31fd02693de9e0ac1b86d91f9e2e4401016bd2691b3195f5a3bc071c5277f38ec5b7708974d6592c60a968e6724f0410bb046915012ee62f6c44ca6075bbb1332e21134e78b76a3eab02ff0614a6ea4ee156fc79451c92c2cda0b4ca3914d6ce37542886e5094f0397c7599624bce047b94a65e613fe3634b4453c610ea503d4086227520b225b5f8759024c78ae565f56bd294179ad942dadaa7dfa5c1a4ad7bbb4d78ae6aee917e9eab2eb270032e175ef3e3061a34f980de4fdf3102ee48c307f4ec25dea7d82e83b4c2092fb54c18aa3385bf6d0dc4494463ea1b09bbb4de75656697e6127f9e66f3ef1cdd3abcbed75334462958245209242c83898f4bb087f2fc4ac68b21d64c0cadaf366d9d3d9f5f679001241a67d30db442c31ce3738a10c2081b3217da88823f99fd3b359268530082bd66ebe29a06de843e8880d77a755ffd120043b26590acf474a6d26dac4fe3c56cacfe4f9f465dab0dd0d784e9b0b37ff94d88cfecb17fdf5b47ac9d6d2f170b6bf86d5ac546ae3d4b1df87cce71db8cfe80c02e77f162754bc0418001410e30a1d08f267b3d75f5a8c9d1964c5c8e37904b28b157faa1a6bdb7eaef01f6baacc5fb2d758e6befe90b27438f8184aba956a69efb4b2cf86e1e2e3eb8783e5b7e8c6dcfbaa973ba4ed3cccde5f7411ead8a9aa10949ecbe4810e4ddb59b370641acfa123ce88f2a02dab8aafaa59b42c89fc1315df2780959fb88c0a97880fc4506dc5dc96c28187d96489baa09a98c3eaa9a6126b89d1d9d3db70c33c19612010a9f1d9d13602ab8ad71b8a3139859145255ec13a917cb2e0ec2ef5e2dd38ed40969ae3b56410231eca857de1983afd67d581cff739e68d9f7d05b12f9c817daf1bfa601bade4678fd76cf236a8bf36ccf1927a5688e51bc487f777c5b5787673d057172f7c21a8b695ae933181363146ac5a5b1912f073ba4f55c585466274a0a9c3b17ced17435cd9aed95939e6b3d306950a0c32fa28708409b91255db5ed8351c638ac12ef239428ceca768b074df1bf9bf1e58a19cd9ed2f59fdcff5acb3223fb901993c477f243bfb8623eb3477921521d2307d7a0e21d2f2023f3a52872929c820491c772254dc6b606bfa9d48fdbbf71267cf80419d7308bf3096ffcdae9a01a8cbe23cb935ba954afe750bfdbfcef50c324f4aa8f4e1f8afdaac985e2eeb56306bd69fc85c0687908ed4af9cebfd15167700ec32b77d0984c8a0aa8cda5ff767b1982dc35f8ca0dafcc1145266bbe33f5197d9e44f9ca0717f0a8ca41f09e2af4494c01348a01751fa113c818864c83b29a520d5c36e2af269ec7728a0e726fa0b2b0d581e791f9b143af707ad12ab4510e1ea0b081003989abf73676b1def954d77efbc7b977fbb499bc28729ecacb80834c571de5e10f3eb5b03093887f5b3c0a317be7bb7f51440860816a40dfd4641e735fb60c20144fe238405e82fc0590adbfd0b7580ae527d8e51c1c5a097fae25aae244cde88693b791dbc4ff4ee93b0b8cd563e41c4ef1dab668c69912c749ab2a2b30cf67633ce8af6c9d78cc33728bf7d8d2b72ee428e08e5ecb66ddfa17850227772da312e7fa692b13c9ef89bd1f35a678dddcf7dda17185c6413945fc8cf5f3631f065dde0fa7c4a080ca269a8861977bf7f4eff680855d4b2ddd54e4e5bc9fd91519e10c4a8cfc8464da13231e62ed79ca4a8c9af6459091fa2669ef9f5aecf877ad987cad9a5ec9a660baec35454114b1a9f2576293401c9d605d2dd3ccb6c5e213a1a38250e8b822648621bc1aa31a28241ab24c71c994abc059e93751848f5a631848a3b481f7aba06e8c71a4d340040aea69da97b8846d339460581ba904a6fb3c4d89ccc4395d90202e88f3b33d416631844b8249a5cd8a825440ac5ce68905e64c573d710880d2648960657cfd50c4cf0b5ed75a53f92a7e716b873a3390b82d1411a15e37295fc40954fd3ec0d1e3f6205534473ac3f8913af92bfc530d0988ca850b7150990594bd9100e153211201fad849b1498c6678282b507035c8cd2b14d080448140da6ffdfc09998c692e3e4a37de31616cb471202eba9cad986aac537d89ac0fd452b1fa13a6d493ebc32425ba14c378d9b029b9809dae6b3888d25830941785bc4abfb34ad42968df723f61e25e06a6454935a86d4dee1b0ae129684824f8960a044a19fc387b7c3be01f1b61979af0ee0cddbe6e13b5334083a9cd062bd51c07de566c66e8e4d6f2359b8507a5ae89d26b4ee68e1e517d2e126422803bf9d91f79252ca58b01312987a3fcd3410d1543270c3ac4d1824c7d3a75c91cc3d5afeeb7800e84733ed59ee29e2383a8bb910aed33b280b46bb33aec94ce6efa2eab3beb3d8ce1b1d54a84f3ee6c775c0617fc64aff64197e56fa659aeb7fa6892dc089ba568182ceadd8efeb1acd4e89c932818bbe9960afb6a1f37717a5083b323ad6bcd5e929dacea426eecc425a9eb817cc155d0520ba7a9e9bcc814b354c5cdaa55b3ab3bbf6dfd38c02577e8415ebae380cc9f177b84d82de169a115958cfb64901e350fa70c1319f81a10728349b0e3784ae63c306974904dba99bafd072de543274f8ced7d9a4016246438b6d6b9df5ed4c222e175dc0cd1130bed39ecb908a974a6bc581c2270116039f9ce69d1dd86f58bf3c84a237a296b8938cbb048ad2a7c156209c554d078550c07b923513175625ce0c470320b8e44c02656834c7126d58e5c12b3c0eca1835abf04873dc830017461c9ad8b888d8e61e5c9ecb1d379f46885bf95a2ae6d2531a9611adb4b6f7de52ee2da54c5206b20b4c0cd10b463cf7a1fc22b21152ef9033c061d49f4fd3881f1c4620cead34c1f6503ae1d2a31a369638dc9f879c29491cceb21fc6356c2fc3f62f6287b768bdef66c8deca192944e290434a320771e5af13767288149443491d2ff618741a10b510bfb0fd397f21b10bdb65ec62bbbfcc419461405cb9bf932c78967fe25efbe6c2e88aaf45d0ea938f1d77d428b9c3532e050e4f2794b3e4ef7825c1808b2fa1945126d21dd22ec41dcae725e82c8de456889790a43b0d5ad963bee10d313980d871040f2680e81079f1f82c09924e9ce5596ed059de4b580271115ad58268626f0f3a4bfbed37f720a69c913b7ee65ddd4303437ac20ea2342a6180a5104bc81dcaad7944e04d847fa67d94336e82e853d65ab32ccbaaf65c767d6a9a9693d0de665aa643cd667b679a66add5bc46126d4938f9dda4735219e3e9f42ed53126d169ad36a394b24e39a78d31729ae682ccda59b36d4aaa6d59a5727e1dc09a0e65b007480220f518f53052c26b791fe858dd0d17000e041b0fdb1277871b02ab83654203c0d64490c528938da0e2a824a039501f731565e4d79ff4e3aafe8d2823bffecca836e70bfd9a691a08230c587ada73f6a662cac1b81a0396bfd91a6bb53fc192c3d65a9b7d36392270f1258c9ad45ca3d1879cafd1e27776e342128e98c30dd6ccf69f32d8032401907a8c7a1829e1b5bc0f74acee860b0007828d876d89bbc30d819d73ce19a3ccdcf165a43b6cd7c132a10140134116a34c36828a23cad4afb5ba4704dd52681a0471509ac3dcd4c78eabfb2bdfb3047eb54dd3326e4e8e7bcdb3e138d469d3b89bb263952b3b6671caf1813b00dc0ec1cc81cee2ba8deb382ddbb2127473f77297f3baeaddbf015e90646db6588a385393091cee34cd7fd4f9dde06302907d032cf09024a8d63ae7cf4ee2c8b2afb5d65ab3ea31aeec9bba7111175f3afa837fb0ff3440dc9d83516039a7cfe91f237fdc0ab742564113ba828309f90cfdec09b4a795317efc09e6605ccf63f03406b702fb8fdbfa0e4e2b70e65246ab2d999a1870a8fd684bb41f67c98db2270727b541449fc99eaf013948bf861ad08f83f3b939c4c1b41ecd47f3024b94b3e4c4dd49deaef316fdb0e4feb123e9484e0c29afb1a8ac8a27ceaf9cd4aaa6697a729cd507c83e8bdbab8cc8efa4d546324aa9bdb49b67a3a9eccf5c33ba4315cf6b4fe3aa237286fe7c22e47f3a746e7ef8391dca2db397ba45ea3008fb53fed4f669e60e5530ced391c2fde61161efd4a1b4d6da9a5265ae5996659b725a4bef71ee9e94e98fbaa9699a7df99a9caee243028a56c75efbdab5842a3edba59606bcbda53a941ad18cc5acc9e7b657bd544732cf66cb76cd725ba949a99fec9002d9fe6137635973ff89ab2f1c748a3363d66a2702b61f6a52cb3fb6541d51bd5447220beca6b050fa291f5fc2d1ce9ea1a67d57b54edff88ea141a1545b4ddf52dafdca67add69595af1f76ddaf3c8d7b4737fbdbdb6a23b6b3da795f5351a4766afdd4cbe6e8d9649a3a48f56ce260fc54f6567b12dd3ad6d0a6a290339caf988828e9d0f78a5d59d1dcca872b1f3d96a7f1955c7a4e7349745f2d65d142d4a79af4d5ea16eeb5cf483a0c227b5bdfea2cf5da19cbca732c1989545f63c9b42cd3e10db5f559fe66a42cd3eab3685bcd35ebbadf1ddddc4a673d1df62fcd34e5d197b2f72a997b8b5fe6efd6d7481fded08c66249d84fdeeb3541472e6533e85d2cd7d68ad86c2e924e8676feb01b2ef7498c50374f6a96ed1be3eb705e93c89d35a1a308feeeb6fff659ce34cdde8d006910efa49749adadd7db80579993ad855aac30ffcd8d9733a15c5a776525154cf66bb7902514a69a6f568c77f7833c50917a38d32ba2539c96ae7c1f7b59b432de391da49451135e968e0e67333937c7c6014068b9fedec90b4b8778686242c16b3d1bacc7ab453cc04b33be7ce4cf953ce7eac336806659ab5dbb6335d2b413b1d5a49eba6ed64dcd36bb76c538ed33a60cbd94ab9b9b3b3fde9deeedc747339c6d5947bd3fe564d6b9afc493518e706aa3ae254ca39a75f81251d854ce4181424243434b443ed252790f6925acf4be35182ee7002d17d81a2fd1f35dac7f93eec5f1b7ac7f677d3714efb6232a386e4e5608604edb5594c2690cd550b8243edb5c53423dea2aebde48e1902eabcbff6da1e251d854c6c4d476e27f31b948a6227a63aa23d49bb9a46ca34bc6529784bc91bb6d8591b496fdba7fc55d15719913338f63d561d51bd54473e1b4a75e8101e5c271467d16ccf9f4fe6fc3e5ab910e57b435186721fa3fcce0b2fe6147c4fa2d99aa73d87a217587e7822f98fb297c31cdacde9704e616f1987aa1caa60aa23b653bd5446542fd51115cc595225b439d54b75c4763c580553c12896dc111f264566179d15b9ed65fe3e4df342491a69df97fd37b9297d8e76d639b96dd83dde9e66cf4b09eff776b646ff71df6b29da534f886d7fdf676fbf3c85e61011707470fbf9a451cebcc09e7f97ad8336885246b67feab59da6765245e4cccea7a248bd6a2a6873a99d541472266e69233322e0d44b079c7aede8c99f44dccc60eeeeeeee944ed59cd357907a7936f2a3e7319deed23b69fd3be77c3dff553007299df3a36733ede95419c93839339d45dc1c0e7a104b81e8b43f3f41740e31c2c1211cf6d0c36c9d9c75ea86cc16f72cfab9f3547cda837fa539b5b351ba513aeffce811517f3372ef7dee5a4be7cdfe66d70611ed8aec70df096def430a342443028e415a18b0fc9f3dc45974c8f69ded1ee347ebec7336a75e569b7366fa75ce3adfd669e77c4d773bbaeb86e48e88839910c26e08d5d991c69dd8066fadd6ba4c61309e9e1f54e95128d4e8c3d20b8542c1787ae4ec6027184fcf4f4a4a4a4acae904e3e9e981f1fc30e9302ed52c667314fae8645604cba75de010e7c0a48aa47632181818981f353030cf4918950ae604846125cc8391c0d081b9d581b1a1fa1a2a1dde5018aa4aeda8609a446a69d7122346121f1b85d24a2f1bad15628770429cd09e9ff900734f9be010e7640f2361603855e6aaa7f12c7a4464d5bcf130596524531df9a905093921d3638c7147848883333b026ef9193a18c3b2a87a7f9ce3ac2058c759303f9f83b9f1345efd4628b74af559bec151555619b9516fa834d6c909e220dec139b3c5599c93c31131c11574824b38aefc0c192f838704bbf4ba9dce16b71210074b390e9670e20af3e01e1818a68a48f0f6a80945f582f92e83d12a188739a25289f421aaf452c16c1ec63f7b98ec9fc1a85e303030fa8bfccbc1f9a8d309753a9d54475447fcc87c140ac5111101c37c885d652407ad3a82719cffaa87f9ecff7482cdd47cabd2a1c5303ac427abb351af138cc68796c68798068d0f7fb7bc3ec1e6975e31feff74ca2b4984743aa85717bb6e8883d33b9d1b37a267937a1aaf356c7c8ddf61e36bd4781ba08d07b31a6fe334844b40c50e1b8fe34b50e3c12f810dc995789ce50ff3d9978c94e486c99d908e8883b3a5ab6fe37fd4d4781bbfa3c6db00bf867fd53b6abc8db7a17de0f81afa474d75071fc70956f2ece70956ea29bd4a301e0727b6aafaaa4fe5f0c74ebdf46c5264f8d979472564906247f1291929c11c9c2b4d4a2fda2415fed8ab973af5b23ab2c966f9b0f43ac15038b315f373066dcfa997d7b751551f6383a856e7b22ca78ac07875d7a720faa403934f36324b6ca666e905c33cb8a7662ef59e8a42eed4d3b867af5a010eadceab64a40473564dbd0e0c8c761e0c0393437fd5e7f0373e5564d7fce386eaa367a36a49408d079f01351ed430cf001b0ff334aeaa395465e7c1f5c3ce1f268778c37c96c38dcff28fed39dc78981b4f335379a56fe818dfe938cb61a877791bd92586aa914fb039931441cd4ec7515ae945f287f9aa7aeef30c4695b9933a55cede6134ee8139a8318f833fce4a61d86c753a30f287d83bdcc4b35de9321fe0cdee49adedfc0a7cef6b2d1b1f6b50305b4fc9b791b1d7c85c4acd2cddbae9231953ba51fd97a7435eba3d835e68e88434e710bf4b0e432b4367cf961cda189dce9e0f2387f684614ad0951c5ad309b6e7974a2aa5573897ecb0f4a15e13a8f40a4b1eeab5e7775947b3aa3b7f98d3a036404a7c8751894bce947af012a6b0949273779fd3864af954522a27e5219130e5ad94479ca43f722633e284204470febdef65dc33e1092e4a9c30438bac093292e8f06916140b7a05f5892bd4892ea18565cf8f618c152be20a0645524a028b0a1256e647d3477b4ad8082aa42ae22a655484b89a2f9ecf8e4816058204277d0921e2981eacebe891172542f6c261f6a22f67452db698c29e9f19c978e48cdc7987831128b34205ca5ef3c10a5499d420675522a2935dc1d94a404ccd3927f8ed22b257f8637fb01d6934517f782e80231c7559fd870fe9d9b894920d2a5d8e1cd2b4af248e66242dcbb4cc3e7a34a4345ad507b8cfd1ecb35aafb6fdad54bb9aee6cccdbd74cfaee658e9cb94329dac75d2ef4d0358ed3d2ca2a3f944254edaf6e914ffaec7fb66270a6491f4a273bfb6d53e1e4a6f549a6d2a6a9689bf4b67e89f4120a15920bb9f75e8eb43d9ead98a22529673fb38442ce544a29bda4bad1501322fb4b2bd5f3a78e9992da16cd9da4fb9a7d8d44758bfdfad9c7cc168d848247b7499fcd4d3fbc999bf45df69686348aa9f0666eedbbfa120aed3928b6bc35adda8c3d1581ae0a0d9c0c39d92e443ae968682bfb4c9f66cae757abd196f79add5487f6b72df00f3cc48d0b6fbccbe10f3a3d1bbb43308f9ef463db9bb9475a4211bb1cb774b239d9752870b6b2772d6b69c0f4b79b510187e03e85a0f6975e4aa9839a4d422bd644a735cb82888848ce6953a3e0d47dce9bb95d5bea1621e4c717a7c29c5346198ae2248a932843ae58901c67d12d2576d68dfc1bdf31fe8eba45888ffa26162488f8aee515bef019bf78797901b269eca8c5165cd85a30e9d979472d9808d92e44db5f46a32144badfb66da35dd7753a0bb2fd33213bcb5129a2f242e2745229a262c441272942991852845282a2c300871e648737dae8543d21d50be2b5407a3a4b1c74ef5380801cf41fdb8e72ecfe73b2bfefe4361ac91f7ddc6864bf2f9439fbd3218fe8841b7d1c7d6fb2a391675f76a6cc79f9b9f7b2fd5136bdb603f646db7ff9329138bc3dd2d1ed28c7fd6593f7a637e54ea7fcdca099e293c459312589839fed52703c1dde6cefad9f005b1eddf7c5f691fea038e8393cb703d6906c97bf65f1c5932cbe5812d4240889122ce4eca8e40a312d9834d9df8e5a30f9d95cccb2804354cf92edef844992224e4e3b62b10436087db103b0a3122126ec2d9aec9f1e951d956c51646f216447255b0041eda8840a5fa882cf06c08e4aaa1064db3cea3a1df288197d9791b0cf7d0f6b4723dde3d321f572d884cff65e874784e9bf8f9ef5f2f676d3a1fcb81f787e78d91829faf9b8693c9b1bef2a02fab809e0d9a8de55b4f371fbe0d9c0bcab08f6710fc0b349bdab28e7e3cee1d980ef2ad2f9b8673c1b1bef2af2f9b8653c9b1aef2ac2f9b805e0d9e0f0aea29e8fbb07cfe6e55d45af8fbbe5d9d07857d1667936fa5db19e2813f7c71d00cf26bf2b261465e2feb879f06cfe5db1589489fbe3dec1b37179570c28cac4fd71ebe0d9cc7857ece306806723e35db19d2813f7c71de3d9a0de15834599b83f6e1c9e4dcbbb621f770e9e4d8c77c55e5126ee8f7be5d9c07857cc27cac47dc3b3597957ec27cac4fd71ab3c1b968fbbf471c37836a577c5543eee9467a3f2ae285f7c017a27280ec6b69f861c3c3df13c6b6d78ae28420ec6dd394b3e6e49f9b8b916efe3b62d3c2d465a2d3d33e5dbaf7efb96ed638d0f94ba00872d3db68b017e1ff29665103901bbfd6e960125cb20ca02fe4d64d29f76c941f538e8044062031cce20924144849a31d4d253c3b39158e0f0a66efba81e1cbc03d847f938d8d2236389b3ac0f27c8f1f76bbc2272e89caff141cb60e229ff1acfc66a19405b0651d77996a2c15e170744273d1df6c308ec6f1444f722e36aa443fbde9793f04cf6bd777936f665e4cc16ea67a6fcadc5f874fa07c198181939db5f87a743b624916f7a7fd9497c6ffa90c7cb4e42fef7def726a9439b513f336ea89fb8a17ee286fa891bea276ea89fb8a17e36d48f6b4a213e6dfa510e5ff66834fadfa31e72cf208a2b7f9a83ed8733884621f7df7b2ffb7bef4b6941e2600e398c3e40742d499c154d3a6ce9d9a81e67d99701c553fea81e2432887c30514cb90ceb853288bcd3a10bce76d46bb6660859d4aba567fbcf109a2d1721ab6510993e9441f4e10ca29c1dc278c58045118a2214e5499427519c4479b224cad069086f5714a117cfbe586b63f46c8f3214c549145794201a1e6cce1ce460dc318a788be35e318c9874b815796dffd3d06c596b313e9dfe4130e63494c415030244c715d3d9ae588e97b327e8f0b42ba6d3392bb43a362ad9e2c9b62f4bdb1503f29e7d6bed25da403c86335d316d33f7fdf7dec87bebb97843feb9a2c41c8c32bc21e27645b941b335afd0f6700e35d96e2dc6a7d33f08c6f4b05d45499c7563c77d23bb8a92fca07e96384bb5e3566557d112a016a02222ce82d971c364571191a29d18453b45469c95da71a7b2abc848110c4611ac0888b3c01d37985d45408a724e453945419c6563c76d23bb8a8214e9b014e9142171568d1d778dec2a4252e4b352e4f385b370d871e3905db12f8a704c4538453cce7ad971bf6457114f514fa9a8a7a888b368ecb86964575191a2974ad1ab4888b3f48e5b67579190a221294543789c9577dc39bb623c3d5f4f93fdd9156b228485a038cb65c7ed925d312831526c89b366ecb86764576c09d0084888b364ecb86564574cc8106f081167a176dca8ec8a11d9e9768c38ab65c7dd925d3123300ee6c4593176dc31b22be664681b2ae22c183b6e18d9152bf2ba2f24ce3aedb857b22b86c4c7fa247116cb8e9b256b3f4f9cb5b2e32e6557ec89835146f690db15238aabb85d3126ce32edb855b22be68a05edeaf590db86df4b88b3c23a34c459a196b3b32b161457715b2272c688361465a2ca0bf682cdafe7e70b5229e2ac95fe5e1f500f3bfc5e41330508caf7647bf8bd5290ec94242a44b6ab0ccd19d6a1194416c8b3a0a1213c5da3c0e1f7fa5ed35a8ca74dfd992d97315b7f7eb6f3e8f6568b783f7a9b3d6bade943ee4dff5eb63aecf67fef232972be266462d3f066f3e876e77df4469ac6bd6cfae8719a47b7bb01483180a7441ecbe13839de870f4e87664b0539fc7da0a088f7af3975482de2ad194435c8f6aab3bd12994164048767fb4777c941b2dd87bf7edd07bfee835fad82fcbda677061cca180d72d6d6643b15f2a1ef091c7eaf1db01dd9effbb851fe60df6b345201ea99295782fefe5254bee7f4f7fafe8bd1f19099f2f983c3ef6543ceeed148872afafb5e236b47dfeb83392b0ef1217fe2acf9fe43db1d0ad1be4377c859f13e7156dc3c5e3cefadb5d65a6badb579be9779bc0471d0bf2f6b390ea6c0ee0c207f463cf5d4f346d65a6bf56894b7f7bc37e9ef754497b5209a7b4dc7599ece1d2262ad9d39326f57deb2bcedde9edec2781be36dcb5bd45b196f67bc7579fb6ff35bfb39a20c8db73f80c87a79fb3bcae0f0f66ba24c8db75f802863e3edff1059e0db0722caa4de7e105106e6ed1b20caa8debe109175e3ed131165566fbf882893c3db4f4094c1f1f6151059316f9f015106006fbf01514687b76f4494d9e1ed3b20b27878fb1288320178fb138832acb74f8128d37afb4744560f6f1f035146006f3f035166e6ed23e181d9f2a105e3a5f27628caf0d0721cd4746c104d07c66bb662c0e6909c91412471f8630ce3b57df4b57a362a5f53be7a0970bc3dfdbd1cc402170326834862ec3160db65106dff1cd90333e53f809c65a5d73c1b95d73c1dbe53a4984cc0e10c1a1c1c1f9e00395ed6e4f021c700fefaa09f70825493e3bdc636b1bd8f00b0b7881c6fbf1c3946005899ec7b267f4fe2caff0a97c972cae4b80590bf31c4d51786f88121aebe2fc4d5e724ae3ea16f0b71f56921aebe2cc4d57785f87111579f15e2eaa382fca610571f505c7d5288abef09f173425cf9d7c85f13e2ca1f87fcfdc495ff4bfe68e42f8bb8f2d7f9c322aefc73feaec89f1511fc90c4d59784b8fa9010575f15f22b425cf9c7c81f4f5cf9c3c81f11e2caff94bf2044d0bfcbdf91b8f267c91f1571e5bf923f2371e5dfbdcdddf772563783a8db9d0eed7f1fda1f3df55cf64d4f33b7dcc4fe5e6fd2b194eb935c895c75a7e83a14ce2032c08fec35d4fe0ca22ffcf1e919449ebe5464de036a6c8e2e731cf49739b80e55284ad06db369419cd5690ed8202d47d3d9b2b536a8868a1621340ed8a03d038ad4f97af2f7fa600e7e3cdf13389c41f4dafe33889cd5fd0c282e3adc2cc1c708911d7d8c04d9293bfa4c51b43912102ab4906eeefd7a00efe863cb7a1363d42f4538c8711c3784839c8e40446d84e4384e6a2d1be1ac7b438dc8e1a04b1d72da871cc7713cbabdfd8c892f6fbcc85884836ec4bf049ee7c9a76f4f407eb87621de020f126f60297795b1c7fae09f13d0078131e2d81cac731af23be06b8884c5c440a21f3a0905c59903f6f0e09c393fe71ca20965352f222a7bb6acc95ef38373b41984433c7d465358d94ca97b35cddcb2af75f3b64dbf4ea2be17ba10f53db96f6826a5e7bdfcec3dedbea65d99b27d9bfea1a4d1735ade0d47b9a55ecedaeea6ed647f6daac8a637fb9c8ae779d2e33c4f5be9fd8ad5f525f7e18a1642fea6b9bb6ddba78ac819f99cbea9d77d8c57bcdf3c226eb672b9cfeed5e10dbd9c0ea5bdf766a9286aadd56af995f4a53c7a959ccdfcbde7141c6e439b8623d8a6bfe197dbb6619dc47d2bb76d0befd555fed5b7de1b84fced2bd0f6d659dc6f07b0218f09d401e916efeb675f6cd34f45b1e1adbef6291828531e132815452a8aead9689eb76ddbe67599cbfe52723be0c924729c761ecc3de67228bf4a1b425b4ea0d44e2a0a2020938fdbbae204176fe04a3b4c7fd82b3db42eed66ee1925141fd333e408136e50042a40a9f1265c248574873cba1ddfc31f06f8415fd628a1701b6cddf65e28916c37f3fec6bb6cf33caf56cff37cbb9ebe07f0eb6defc91e1ddedb759e0ed26ff2525985dc3a1cc33dc7fded3c94487668fa4d5651faba1561fd4b31af8526eddf95b410ddf6b7c57ef69ee9ea3088ee89e8fe4a1e3973bd7bc3d27b4faa61156fd259b71296f4cde6e9e83e89adf4b7dbb615ad655d29cb8636777375f7dfb666fae2f72c7954b2f729793e49562167eabdf7debabdf62117bd4e13a13d0de96a3c5ba3e7f4cfd648c77c5a7f1133453b1e1d8fae88d9a2d1bab7dd6f1f6ef67ea643b9e996eceb7b5ccc6c517dbf7adc5f4fc7663d22babd7d1193da985c859cd9ee7bb20acdb3f1b66d6f7fb7ab7dddbe7e8be6efd3e8f065dfa737f6d5e1fdfa9e2e62b6461a6853cff35e87bff73f769743daedeb69b6cb9cdef28f7d79745bd3b20a29aba852f6d428644d64e088b6574d8bdba643f99547b7338e63c29db312365bd2c77d260d629d945bbea1dbeb6e17290f3de4d83e40588bf1e9f420500fdfa778de6fdbb66d39b437746f7268f405acf2a104f26ff9a8258fc4e27de939afe4792b9d4e627bd3cb6759a9d50322884d779a5a4bca3c9bd197b6e9d9944adba47bdb7ed34bd0dde9912e61bc752f5f25c7086e343325c7dd49269e519c66c2419ac31f38ceba12076fdba6b3c4f1eb8e3310fc4f7c0dd6546cdb935e6e3fda9ea4e373313435e0ede3ee7e7a365d37b7d7bc20b691d66d2f359ac949ebd958267c489caed3377473ba4588fbdc737a09bab7ab6f58d041255af6e15ed54cf0e0a07f4c8c0f07fd810041fff11c60a2d1c442a293edd16f28490190699500d18182072db210140780a3165568b21dd4a20a4bbc66c7179f404ceb9e3b62c75a6bd5a17c8d0707e7fd9bbaebac3fdfc562520f3c44cd838353ea29750f31b226823133c64bdb5f3ce59fe3c483cfec883fa59452f954524a29a594524a29a554f700c660eaee4e7d28a59994524ae7d780b3ad2fa6b28fb6b33e7b0382c61d888f31cb74a8bdd4340e66cf69190807b30c0807b3b7fa0707030ea34ff7343f00214bdb663138b668626a7a3bf4213ba4364e3c5bd6665ca69e0ebb358de32afb0905a6da07153bee6fef838a1df4effbd8ee1275872edbea9383d96b1a3b983db501f60834a756f432b3e30b607ef4094064dd90871d5f87388373882caf844b2794b752dec6e925468d1d3f664638188139e7bc71561883781811016e081f7266072ec91924624499079ce41c95f664620a58be40c660cfff24eea410c9823ddf934fecf937503831c4fdf90f88324dc495112414ecf9a3f930b6e79e0efdbb1bb9bce5219c75235899d874e77070d20f7bd8f3b1809998d6621c637b47a3f607dc9c5a16227a616fafb36f8c346ea9134035763e1952633315db47d317483266da311531e2439cd5d2dd37e9cc96c9be29496842b2ef4737f1ec9694d044c4c6946cbd73f07619e79283f76aa69c9a1a928c6532565572dc40f6ad78f4717bb3939e142bde7f40eef95cd43c1bedb58f56d6f8904270cef062f926b41a10d550b17d13da500d0b159b29e70372bbd466171236af047296b5f1a4e950fecc20e84f2d811cb4020e654cc6ad6d2e0538a4147c309cd9fa842049fa83c59a5893e371b18424fd49596eceeb3ccfb3f19ee35191d30a38bc3e3e207533cb8d6b6a4cb965877dd39bb40f6ba262fb721c0ab651c6f73511ed6b82a27d682a8aad0fb682038578fa02cec2be55d8f74d2c88262aa29501c681c907272db015a622eccf08916572016772c1fc6f07dab7b3ef973353f7b50f67a63e9809c759f3afa6695af47ccef925cf669a709ca5fdd534ed4b9e8df6c1ee7f43902d70a6ee5b2460d1f271c296b099baf7a70ab07d181f9a723e1e4fdd47a29364df6fc9be1f1018a69e7ddf9a7cf6fd0f6682ed0bfb609ce6facb99fac3f970f6fd78be1e07ef6bfa8339783fc3c207dbf74df7ad0d4f1e03ec9b72666a52c1946f8f07e06afe1cc7698f9477c02aa4bfcfdd1e25e8266967717fff267156f7f7b98c232571f09a721c0ce2e0ad4bf0fdd1d7c7c1fbf1c7732b3061b4ed187316de3744bdeb1e2a1f0449a3e8734fca4950ddd23d7dddd2692022f72a596a6bc037759374487f09b9495fcaa8a7a82f65f92397ec1bea2aac742a9f113ed867847bc5caf589abfbd915b0e9adf7f7e517de5af918b995ae66b9df10c1fb21d89231f986c8d2d9f7af4905516ad384029ba45879e99db20f2a7698de6a1fbe0619641104a7c6a44f33757f890f80706aa20a4ac3b24fb2ef4b9fa17def7d300eb57cf71ce98198ad166dca99a9fb31b4b53034c6261d678a749f3be5b8bd5863cad1feea7c43f6d53e34edecfb9cff88153f0e49a140f866f8026aef48df034bc1a273be6645474f79a42ce34a4bd1aac852f9fb3a4856e9ef0b20b2bebf4f335ba6bf3f00ee2f0babfb8b71c4bb4139630a2261a28ca9057175ffbe4a36b92082f74d397a4ae5bfef4ba69ca7c1142e3300c20c19987e2043c8a362e0d2028319315e2003868e8a0e512717c4d5fd141db6b0b420c60a0b7408c31424aeee73a515b0a840b192a282b8baffe9d0f4e5c4d5c52950213da1c394110abe1d9a7280c4d5fdee4d2d902cc98608debf6f0a2267642ce2b87f3fc6193741c4719fa443cfc3e93a4eba21e2b81f6e3b34e56cfb3a1157f7439229e7be2988b3f0df37099133fed7fbe9b9eee3fba46e94332be0fba69ce9e9d0c6932967dfbf3ef3ef7ddf5e7a369b7eb93a89d7995ddde10a710667562052c9b870629bb69c99e1c4d7ad01e120b4b796d3aed6d6e019e0c7967f2f95a26a4ca7143e986f37fb7a636b1e69733e6549e5c1924aca3f086e2e9b227b4570fe97634d767a5a39fb31656735d36f6735cf8d7796a3165c74b1eb4c19b26fa65ce75a7001847df3dc9e7a2eab7572e322146ca3ccd4846828d8b30d1914a888a72fe02c0c55c116015bf1a3c55401fe1e7f98bd76786a7e933da7933d7df6ac4c32230e66995006f47f3a7114575d832a9083d40638b4438838383f467dc1fc89989f847f6604cc6264ef5905aa40f5c3ec55df9d55f5a4af98aa19ec951989fb9551aa75b6036228d81df0102319ac08ff39e47428053493f6b6336da7c89e5b687bb6d5c89e5fb5b00213768c0a94ed30020d3938837008d221d0da131d03458364917e3e2d8a1567b6be9f4fdb407fb2ac21a36688f40c4362f8729749238fd28ecb3c8f7666b76d4b297da3d666d4d26cf798f4e7fe44a01f3b4f36ab1a89cbf9817cb95f1146a63cc4546a6b4ecdd135a7eb2251a536cbcf3e9912345b29da88999a3f539e97005953c44ccdcfb8c0df87d9eb674e94f94194b9d9890ed127ce227216375ba59f16bf66aba4ab0a626abeca0b6c4a0d5ebbee60343262b662cd0c3f27aee6d79c4e6e170787ed127609bcc469fbd331d02107e747fb74c859958e21b2eab703a63fad80e9732a5dcddc7b0a9035295f7385926b1ae26afe96eb19e20a0d71355f76b9ae20b2b2292258739c95bddcca9a3a145795a8c6f6fc6c8aea45fc9ec6eb177bbeacc1b965c7f7f8b1f681ffd33e29bea7719b005993a22bd0972bcef3e716d84a296d96d96452ca2212b080c81afd7c05c819fab323ca50273451e13e8cc1ea3e9c01630896306508e6aef072701ac9604230fdec95c186c8deea6c887ded650f50f916fab1063f8d47a123708e3f38f83b41b414a52c7b4a29a594524a55e8be7adbb28bfea55467610476a62b0f8f5ed54808a109e5e129f9433f05963bc45d6ed9d1695e5021069c9aee7fd4bcd5a14459a8e0d5116511e449466da006d209c8f579a28a91ce135c00395d229ecf542204302881f910b99e0f9c284a12483a49a24cc107de103c229892216431045b05cb0ed113229f264edca00afb302bbc9d246ae022a394a64c5937a0cd6edbc53857e824590316b66b8136ef010fe24abeef384cceeab0eb23ff07677d63208090f4228a90ff74158d41d309032c0b19b0010db402cd24312768c1e4c91ab436dc1d212c605f0861210418dca00d5a06446507e80a1c14014866a1e884ba20d2820a68c82814b3c26013f249c18f8f164ee8c060cb3d2f0d2a51156870b91d9510d999440ee38492bcc10d4476b80b58e0082544a6a038138b9d242868925122536c17b0c0119b0d438aa7a47c56c887521c1f2c3ce9707cba08927dcae7be23e43bce92ef458e905fa380211057f21f1057f28d903890389daa1646d0f1c04e1129ba6ed2ecaf2e632438131151b5d6562a94c50b62b11a239c2c609003169c2c5e306429e75d85020ee350f61e98ad97b33ce5e56c953ec6c398add3b33c69f49ea45fffde2b81e8cc161087f118e20167a96cf992884f9129e43331afadae2226f4d6cded80df41096e2fff254646c5547d18f9464cd53fe51c3155532b3c24e962aabe4ac946b0fee73fecc0c0be37fb6e8ed33d7cec7bb5f7380fcd0f52749e8d1438e3e1bf49799443a92377b6bca47ead5e444e8da3a641e2ca8ff1b46316547062b56ca93a7b249c355951891086a8f8dc382b664183a02de50e2391cc711a0ced50ea109919fd1c76782388b95d454c8e7056b6e51be1ac497bb4c31c9c58c0a1c360b3256b648c318687b75c35d89948384b46289e4df65d8e35dc0e7866f903324f7b378cc77b606ec48d382bf4228476388fb7628defcc298b78d1777c274a9a2358bfa5c3624afa14a0ecd061341fd34304f6cba6cf9d246a6b5f726d6b1f5f466abfc3ce7ad9278a025c3fc43a4a48ccd6fb9096069cfd7dee6d56e2868bab9b718473d39f9a46ec2cd72517da914613f68773d906aa78bc83bd9105bde264e31b80f39a30d33c63c14e8dd57c4aed5e3dcb9e6699ef30a34c38ef82175c00c45931babbcfe934ab73fea414c9d4428cd19dda99510f020e3b41f8c189894e6c70f33dc749a9cf0986a9ed744ca5e482a5d4da7823461d46eaeac29329c880fd27dd348e0bc0b9901357179ef8177074169b6599dd99b693c89e15e3a648dcb35933a3e7b20847770e1fe3fc49dfbfbe8df80ace6594f4daa8b5acd249aab5d65a6badb5d65a2bb7e51f2eed18b888cdd09e926c7f94b7bcc6a7e5d9fe1d1748b6efb014e3b209255d041529e2fe3235e0d2c60ea3964f1c944f9c159588d95264ff2392e1e95bfa99ae1ac813ab9afa392a354f9c55da1ef2d8f2c90e4bdb02d847f6a799fa5113d540c4083a30024c0807a7a63ec5a153b4a00727e0811535409e58d5d0cf51a9c9329027bc46fb1c1f6ae8d79ce3438d0f23a60f2a76685fb50f202638fd27ae21054d90820c58000217a800fe90c1122b7290832b828690869a58937dd8c38ec7c1a979e22c1bdb3f9b1248d5409ec851433f87d6d45a69dc5ddb99d3a53b926f4949750eada1f3c3c8c59eaf44cc9eba07694b41dfe3d3b8c4d9316f2c3fce547ce9f5f81e784f2d719c49173a1bb5a3122c40d95cd47280c37b85709e784bd6843776bfd8704a2594747777777777e7f1b28348214d7e9a3451d2242887ca2df0164cf068471f2510d9d1b389d9aeb36064cfd8514916826c9f2b447bae90960556e206ef3b86b8927fbd883864139d6d6347255d0c4939dde99c934e57cd3c9bf9b5cae893d6b872fae11d9a720b7c89ee500ab07f78875ac08518a5c458478ce0766d0df87ea74347f574542927ad311bcd1857f4a70eebdbaf250783cc2be42cd799a630bc04ac6181e90bb07cb9ff0ec53dbfdea13b14b33b94b97c1b6405ecae29a5d4bb4357e050e60cedea5e02668da6e34c39d1fe9879d82099050e43f00a6dd0f62e5e5be28412670371966ff932a78b9d2d5f06914476cd28cd3abc1ed9bb7cd3a815e03571a6c2216a28896c0f38187ffac7d896f7898378b6a40a624afe0b4e3590b3156ba4ccb944fa0e3928258e1b8ec987ca1aaaeb1940a2bdf21ca531608e32f5a5f782b89a2fe7cb95979e0d8c5745d6e929d08c0fedc67863fcb099a2eff23334100ba5f112365bdad3878932f2e983726606cbd3d0b0d721dea877d1b01871a05ecb5a4ca1fe946704519f65d4b364d4cb1ce32af48d7a4d47cec4bd650c70cba36268a1a6f38271c1c86a79f93722ab45fead594b036e79d4d6d2d2f2d6b67cf464bc7c7d530e4d2e345ce6d3607997e754bae8ad8c43a15ec6e7e7543c9bac75c0a88c42b5bc7caeeb647e79ce7bc972b7a0323db9b8b8fc9f5c5c3e9787216bf7cd60d188ec14e1465d4b8e0ea2327590e5e54b0ee56e71d6cb4b7c791c60bcbcbc0744dc2f317ccbd0d14196961ea42df548b7fc671d2d2854c7a1748b102d9f3fb7d824cefaa76f7f9ce5f2f4ed1267c94f79192867b53c7d89437ec9f307c64bcecfe59733fc398f0896cd2362d6ecf22e2f3aeb5abe6a17171aefeff23d48dbc5e567fcf588984f432f21b7d6a12482e55df41272bf0ee59f9e7a362d59474b122796cf5d949f678f83f45df244e2207d6d09853e4b96a7ec380ed297911d8883f451d9731ca4df923d888c0196bff26185c588a1b53460d9647b4fa25fd27494e09587912713076184df9677eb8832b6341da943dfe2ed434d87d36a207f88fca9e32c211a7d695a426ed3d3ccb86bf8295947070c7d539d4d67a6b375b53d455bad4535417ff85ce90147bd2571707070725a3910d5d89512290cb94a96f43811254a7c2429c677cfc6432b9740a96c81122d822a111cfefea734d217dac48d0f67fdf0d1a18f9d005943e3d183c0e19439adeaa53222676cf7d2be366737356d39ee0f406996f9f46696cd3933ceb399aa97cc5a6767f776d2492d7d69eda4dd9cd3662a58c7a56476f374cc9449a4695588524a69a73a327a9cbd27e56e7672cecf3ee4f1f64e59e9ccb2d732ede5779b3689a4bc592589833ee79ce18cd53c633926a58a8f06062c7fca19bd26e48f39bf3670f125d484aa94dc4ba0db4927dda8933fd25460cd67a6e65b8b351fcd0b3889fb75879acfe8ed1267653fb23fdf6a1a97a99d4c08baafd6781c8439d80373168fd6e32ce9d51ed79c781587a73b3782b58f1acc0b58ee700add676543ceb24f62d99b0167875368879a8fe6a3259942d3c984928ac2ea54919bdad1e18f0dc56e5ad3a92834216d725d502c86e40d86a0c4084e380d480e1111075fa494524a29e5dfa7d933cdde79ed0f09c5824e3f31a88768236662a65a46cc9424e229bf4fe54e0c634bbe48299efdfa32ce8cbefa0e0a704744cb9d94ee6fecc62f5faf5c9f94ebfe28fd4f0afb5e964072249f1057feb20911873fce4bd8dd69b9c48a1e8e6e2fcb2512a8d3f2a7f3bc9f72d46dde8be7bd4727c9e346a891771ae5ec49d9f7c8099737bce10d6ec0a9b1df39e14214bba7d4cbbe6623cfc6f33a921744a64ba4eeab47448da1a9a17b9267d3751ef682a89efdea17edc87bbaea9e7239ac4db65b0ebceceaacbb73efb43fade6a0be613d90899811720a565e614b2e380f314d8829ff29f85c417261cb1ff9239bdf1738e993e5ac913c7d06e24c4c0c631876fc0ac409c4191e1e101b10677a8857307d18b798c92171442ac49fc8841ddf26cebc0f71e645e268c51950e2f017800e376258f8e3cb4416e9e30ee08d1dda701ce20cce91b5cd946244169553de012446ced0f05075e8bb07390384ef1c08c8b1622a4d4be9077eecfa2ff465fb83376e6896aaa47c98a451fb56d3ce412c6768e80f273903c4101287cb2020aefc439a1fb69749d080087abc402060081244d6935a84b3b4b8d2ea8fb9e2232f384e73c2add050a0e568403414684ec81d29e7efb9aa534a279db49b534fe94ce0b23260f9241b3aa76b56cfe5c3734d8d435cc97770d6b009a96518628c3146298fb8620544591230109949727e3c8b21a1ac6772f1845eb18320293e3f20e25200492dae80527db660c42a29c26b62b105919a450f8a643da88f133e2e048beb6e1a57b287e60305f584c05b6aeaf5c801db37b2db52c7b8ca3c9b1e269c7d235feecc1382db526b99ccac36b5490a626e6ecbee76e9280cc176cb711c77b35148821d1de4ba4e1bbdf4224a5c4064542bc7451e9dbb9f00c7a7995eb3ac7637e832d1241de205aa47a8742c36b6512b199a19010000101000a314000030140c890443b1502c8f445df50114000d97a25670561d68418e53c818630021840800000080000844a409009e3303e01bbf2bf38df2b3a12f255c4ff596e758259c91b5864442aedd061d8f5c42b19a6e752d6dcc2e8c67f0135c20aa00fd3d3c755af486f9b4cf5d5db17279b477581e8441a14ff0d6ada2742c5162c8c860962442052ff0986a55f31369ec561b26dcc4d8d0fbe9b366af89631d6776499057bbf7892899bde9008c27852970d0b1c137d92e009bc137090db122233093246a979a1ae00da9e852f99c8fea560ffa6db0201e41854f9ab06cfea6867f9193419d80d92470e4d68038f2e23921f6afc8fcf5f5d99b93d9b31caf648c9fe6da6039cc27f6919362177d41da7d778cf78847dbae7213cc8bab410cd0c7e76dcf4d54864383f50ebfd5dc957e7939be17d9b0a121d9d0adb0274384ddcfcad8aa164e4b244b64ec531edcd7c423e3484d18df95a88f60f9b628fc4f6e7f9156dd36c7eb26eb183e70fcf8eaa066d551ef63f567ec988f426f1607c785115fe070258f573dbf62bb51358485986177088965d50ccbe995b89a1f0441c5e98dc88ff00b7fa4b4acc1f8f245eedd00aebdfeea502828c60dcf70dde70c94a507da7c39de9e942ec01071212c782bd2778d19851adca5bb532837700de10f6e3bbf73243de710c3ff615a540552ca5c6090752f85c88d73a86c1af4ba166fe205ddb529a41057312822daa8db206a24db3307a1370c11fef344076db8af30b8220e75617e40c7b11c317c1cbc3fcc3ff0913abbcbee9e72d623fd758f786d60b73e5d59d9faf126d4e8c9df5486532801e530bd7640453dbfe8f71c2aabf907f8426b1b99acc3df7051c7cdab850295fdb2fc4734b2d80d36c849f5c24eec3bdce4cf76aa3793635ac0e48fecfdfac10a8ba99b9e9c25ba2b3925170e6d4be517e9533b8cbb12d5aa404b7c895039ead8ed9c9f7253d8532f9e5c68089019de6105df29138d6cf50939805caa71c7b62b5172f84b1663a17ffefc5832b70a55bd39de7783b2b87e3dabd2f174c515dfa5e14552a27a70b8e1476fab91a388050abfc8b617914c9745efe6ed39c70c267e78c377c98aa056e43ef9700d018b5d4e2dc377d9e0fe76546c3c7b644b739dfa9a9bb42e016377be72b8f71b8dd1f530affa9e474342dd030aff29c9da5a8d2da294220ec746f31f29735bc12008ba9f034756e36fad96ee1fdb6e72421da9f90b7c5f63815d9a6a4312c3aa35f2462e2e53a7d92fac51a584d67923d762e8328faa17093bdad31b213a988fca5689ddeb685d4116db83d361c2c0c9870ec0290228f18a66ef1da1f9644187d839a59a9604950ae3f382c7a840bd464d8a1665614e2f006f38711e7595dc3fc5d14cf5e0f2a9b3fd18eea68b223c4632111465383d407dd5555389115d82adc79c98a1a43c26195f7661bc3cb440fa6db292e9fd8499b7aa8a3e00251bce3c0bcfded2c191fb9d83bac8c816467189344af82757fd63b8d022cd08207a3297dd9ada08d53c935a47291ce49a3634aeb41cb0cfaa45ace4571faa181b521605c6159ed4d5f89c8a08e612a8b8f60564a7780964c791394807128e31f31b119bbda91c2f0fe74ca899ddeba92bb7e465b36bf0850555393784045b59cb4bb50460383e33addc6921e8400111bec2a1034d495f85ea8bbbec6aeab66d3e11f999269be7dbc33bdf866811e3c264ec7ebef97ce2455d00019218ba78340cb9badb0c5de1b5962e77a373f085eb2bbf8d227cd69e685ab03c58644398df6e235e84b294c5dcc48f63d891bc2020096fa5510df4335b411840a452b34a142db0081627029df685890ff763bf2e6c5246732f7008ac59138296a326959356968b8e2ae29c2149c84286c3b97276a2cd705d368f6569867e6b644d038550d83cd5650813377d1fd9e4a79e5c82dc5f30b8cba3f332dbb3bc989c08d8ef8b0373eb4c39ac4562aff9c730097533e6f77e03fdfb266284258fe343e1a1b0ef10661286c4ddf138e74914f7fb7d6d78740ab1ee4549105a86c1e0dc3de6666537256dbc133866f0bdbc81ee23a1e1b72fab6691aa23865d40563055187c65a1634fd13320caa487f843db1f726525a8b583938cecc0bf5f8c6524f71ab8b9f5683d89179b6e59e098d044b18e226828e9a8f7700bb038d07f508ade39b070c3d3cd12fa2011801b43f06c81200f81471ecc8c179c6519fd3f10ac2fd8095e5f1a69fffcd4656f9b2bfb0f099f210f3f952585e78294194622aa3973e3999bf9b0ffb35eefdf4de5d42309bd43644875612617d05d109a72aa69f0535dc0d611158eea567b961e4970d20e4e752b17530366350b2ff8da5b9e30f75c3d7640966380231a99abdf35cd7ea944b547f53b6b137f27c1cf1c833b0e6e45d850875c09691a8b96ae70c08e8ce06a738c5a02af1ad8045c5a8a200b0a33379e168f73cbca4b2d546e1639da597696b6e23a80f6bf05af961c400b9c827f3a238340a12b42217c3f30ce21fbbdb2acc0938d943f2f909df546086e808393dab5223adac770a57e5189f8773443a41dd304d7586fe6f0879a2bcd32e47ed437916c48967a061ebbf7b52c91d7c3013d6f74ba06eee2545300fd5d172712dc07587853912486e79a83adc628bf2089ef933393d38b740a82aa018e3e49cb25ad728475a090712bfa5524cdd555086abdc1d94b4087463ce45eab7aff050d17e8f6d3a48784237eaa959537edf554f1dcdb798bcba22317b93ec4921dc3259116625a80ace481e25a8695ea4ef067894ae61ca38e293a9bff69e11ecbd402b6022b0aa5f02731acde6a83f8aa60ad0576c82d50f2c6cbe05b31cd219e3fd68514b4848ee882b4b5de7c9f2188d92e78b0fe53d51453837cbc62a33fa63b619acc3d0046a3fa27f6b13a70489b3e14472febb9ec9e95ca8e76259136d83e1c9cbae03be8b74db9882fe5c8019eba84a52441234f0b788308bc9880326d3ae00285e1129a36920331226571fb60844cc5837fb34e4c088db59ee8ff3a1b9b36a9b65a9057ab2e1d8f5184f134a8cbeb4da47443d911e91f9fdc02690a246993c338e8db597d8142d2b4b2b6a4fefa8f46b1244b0fafa4712dad306271b3a0c1849ce7025945a872fbcb80f3d8c184fa0ed4eb30ca5c0b69ad941a0da293ef30e827a834d74143f1bfc79c666fc9f3a08d830c45ce2c849e0e2f22c11470289bda4e49a274eeee482b3cd30f96e8d9f0e4381c4063a6d68a20ddd3e53065627c029c830807e789b0937fe152276388e3e03ff7165b574cb40ac78404ce8c7c6cbfdd5b170659fb925f4a463c657757414d9a1df2bc49612c9c3d570275a90c8ba3334f87e97c26286e11da084cb04461c01f26e1ecab2ba82860c442b9e282708612244884bc462921265355116393e7180a359fcc1ff605c7fd696978e82d1b7822325746ea48db4a5728bbc7326feedf50ca3772c2459b3e240fec366153eba0d703a366a40e4c3e3ea4651eff2d7c22592cd2e3595dd178105c2669ecbca09f13de5038f43919b8cbf4d440f49542cc7fc41a3e2e168276976aa79a4e891092c247d5108ef92388c415477e5507a30950d6c18c27f767cf8d7d7da01575d0c30315fec5fde36340d3cba9d5ed2309fd8ddcd8b389e310433f72df87714faf105fdece14ef85d0e6eaeb87f60fdc61f6807e555610e8297ab5d0ab97c05d171389abfe4884d2287ac689558bb125b2df53992c57592289aa0ff7db8114be74b15fb8f3a005186e6f1a8087b7096a24471831d9bc9c9b9b705e3f358f11672a4ffa63f17d740134cefc7c22da70bb793c86f4a31bfd4018ae9842225aff8e2064e9411e790c94320ef187e954a21ede73ad030f1abf2c86dd6f86b1af78ee2a60122cf6db463c8e00287826f4174cf3abaa100b18d4c2e695c353865b05f14fb34a3df3f4a9b771740549169e3a54cc59e8b5952d09f839bafc10a80aea6da6f0c2e6ba0ef56b94f501e1bfa7bd3ef81d45ebea902e4d97ee0fb2743975861fce4af1d59d58f9f3f4640ab91806c6693a40305118854408bfeed5bf4e1664c9855193d3dae97a3c647f862324d6fd21e391c9ca0c0c1b4d45b8521c2c951a9c05f35a2a0a82540b1a82e0124cde23b998532a5a21495be4457d11924ab5aaf4e792beb43ce8d0b2f4df05638bd3a045925b899dfe116fec924ce097572cb44f73ae708497cfea2bba6b05ae2004e616bde8b938039e28a2c6ecd7c32c7c5be8c07b5810889d06fc71da4bc9a5adbc1bdd60160eb2c8a8a464bf3ef743a8f4eb1f6bdc4129a2926dd6025ab23979d42ce93fdb03d681217125f78d1f426d1ab3419187cfaeae4e192b6500c0ef71e9598dd5b3a9205d9b7452ba3021aec5a3ee49cf843860655864d8795aa5de47d2715a302fd8e9beb742184b88802e80cb67139ce59bb69fea90edb70b6d667e26d4237556e1b0054b5020d923242a02bc93d92145ea324a6bf5fd5ac28dc0e0782dd06e2b6d06178fac6454ac57b0f617dd6f37e8753ca80af89333592afdd04487da003acc765e13fd4fc0d24aaec7f4f846424ca64463560c337adfbaaad8ca0a53f71b86aaa2ddb051a39bf171acc426c9f06039b1d8f989957b184c080fcaa61d5f796d2dec289e8cba32c713846cbf93b84bddc0d6b716a9460eae5c3dd582ff13c58e562b161f0f40bff7c35520dc17f13519203395ec6dad7a3213e66731bd32329a87d47ec586f090108bee93b8879d8aeb6fc45183d5e10137daea54632db4317ea8b86b81e10cc11816ff53552b149c96abc96c82e58c0dcf8f844b2e10fbbb9fc1b41edf69a6e119941e94e2b40de16e826d470f80a7755f214e5ce3c3af615151070e31472a690c81291fdf96f9744bbf99de846256f2a8d0c160ffcc1f7fd1c6845201089dd9427db0cad29799a41f7ea06ff54e2638bdf15dd7d356c6cd80f7f3479a898ff4672a13ebc206848a63e38b906a2c6a7361572bc719c2ff61d8dda4e6a5842838201435ba323c23861f7e790280c7af13b2fc244248b1d1b6b36559a18131cfd108e2ac7d2afb29c43476392b4c1479d16befa4bba4dd6d2972b9057ebedb20c2619ddd63d41ea7a302cdc8e2d048ae9400da695af1d2ee61db0f8e2caf08758092db7e14499a2b985852ca10b19526d3c291368ed8dd98c8dd3b6230743cd70af1ceec62cf153e82b0ed4ed10e9cf682a43cc9b561e42969297a883013914df7a10383d3a93e3180d8b7a9478eeac2007539a88ef7890973fee9e8f201a40a2910a1eeb5afc9d0effa1c8bc9d881d68ea7f218c862f6f698710a0e8761788f59b838e4adf045cc53287d74c3e35d823c9f26248220343d8de9fd07d0550912e2b3ddcd524114186ccd5312781d63467e6832e789dabe3afb388553707f786bba0f7b1c3ebc2bea656070ef2c2c672344ef2ba3342d94f001fd847ccb9787351633d2769f3cea93bbdd5632e0e277f3217d0166460182aa648396ecbc59d2546385849f918df0c201680cdb5ba3dea94976714e600b7b0f5546f9c6775f8331870210c02aa2aee63de9d2b596bb41771874e8b0a17d66a06bfce7dd1ddbda19f4d7f632ec8685fb55d417cfaa039f4b1cee4a8dcdbfef42abe0f9623db3c68f51c1985f8ccff0f77301a065c21470843a9d1b8d1482eb81d8a203f854753580553ca232e0931e1efcfd9a257898b74f54d31d6e4c5ec75f6e17b11b30ca417d19423f194736785cdc4e808b4fd5bc956ef9ca2cceef2c24871ca1a750264a46c672b020238c5137f4c4a921c67fbccc525e3b4a245955362576c7a90022c708e9945e3b45f033d6380ef288b9cbf85a9eaa53dcd167325e51b9e2dd27f81452e9842ace0d2755b48a2b29f03c3564ad346b975d274ae88bf66b78b045f9af04814d00576431cd485634104a6b7227d226e84610a6ee898dfcf0428e0471d76dbeb01cd9d18cde8bfa0618f3539798bf24a594b5248684b589dcf4e118f1fd48d971bd0bc64a0a9631480d5e99e18c855242bd3267ff678864e7cef69920bbaae3bc7bb109e82823e6b8d3ab2774b95d38beeebeb7af970a02d81fd5f9f3141180104281bf0e128d66b7ffcc5a5d0a67184bc8bb26383f1ef988642a916c766efb233ef2d835ea03efd0a165df4228b8dbb1b39eaf354eebc393cf8ef72660af5bc699467a3e4fca1e4fd6b857ed09065a8c451d3fca4c2710061b96096215973644664b21a8175a064f112d51bece1ceba2f81947f51e2ee14ac931c68a56653f7570367474b880953961b90bf0e237934e801f7e4e2faf473d5b20fb052fbae900c4796656898df910147b497b329d43488c9110a4d433b0b8ca5e765f67e4077e6b4d6ecdb1f5a3b82c351e429ea3c304e321c0e8f5fbf7f5d0f53af8ef87f0c3e9bb3dc942a6464efe2973cfc8c9db1d581a3ad4928e6cdb850647db077a59bf163cc384ab26f873eee2019ae38633552314545bb7d3469b36ad99d397c3173f4cb31565702fe6a152ea0b0dc9478ab4137b2a8b3dbb559ef3c1473b06ff5cb9d4c4db07354d6b49d834b53dc0c70e5a19558830a8456b265485b44655a90975fa992bdc9b73c081c85595b7f53ab20a8854269e53ebfad69629551047d023abbc81fd4aea25061630df679501885b69143afd1671c3f91b0352a7e3b6cc8d5d4054d7120e68d95ccb38d3d6b493b9615c69daf74e4511400ed483b98676422302326f569be57bb7a022e5d4526a41756289cd4104e1e4ad759869b79d0ba386b5b6ea20584d4fc23237a353ea4f4b53ee39608ecc8d2c0087196e1ecb58066a69526ba33ff373bbcc8d44042499e1a6a9a1196817cfe9d44258a4c7e298847479160e7181d1a34ea3ba25178f6cd9f098dd3eb3c2dae5062aa805bdb557ffd38c6c988e5e2a1eff73d9ae935b5d5dedd92e80cbcdeb20825242bdc07f8c70b9d1f3e2fb69a229ade63f26853d49524d661698d4bc6e0b572f6f7e857f9a284831f90cf4ea72b336c04c922997347ce11c75e56a8e9b448943037956605dc1113174a2a0c5511e1765d0bfe39fe6ba3c7965b5bd49f9ba8dfde24f93f982744bf5e6dd55ce411e675fd20640966875c593d532bdf0144db780590c1e15cdcca6854fbfe2e3067dea6a3bf87c5125ae824bbc1cda315f3c1c147717b38d8881628e07f8e3467fe722bac01f0e0a23ad079ecff0189bb2ce69dccd4feb594e77179dd810b952768de2f46d18937443d7a8258b500a5448c31a3745dd01558c43e392f36032b71a56982d87d88b38702bdf4981257198e7680b18fc2f3a8493dd2c4cc680cd0d51840e349056f908e219003e4447915e87053d48296cff32336574fdcb9a3e02fb6039ed184d62a995b59ca8a5bdaf6c0633eca456941790e981974926a7c02558299a268272f8162969d74f0092b4ce8a283a7bc604babb6a6f5e2650477587056cac3f613540700a127b0c4bdde8e393a666ec22b2aed16c6976e1ad1cd8c3f134b5adc0b2d5dd87f2c0f937912e8edc632b39a86623fd5a164830b0fc155c85153b75ea90b9d6e4b15d923294a38f38fa7a4f5f9f58575ba561afc597380e234b06f98c679330efe23755cf861b9df9bb1b52e7a7c7cb3e8f3c66079b16746710d043aeb9624591ef3de71219e929f25c7e191a1fef98166377c5dcaffe1607f6ad69f3844e3dc595cbc4f804eceaadbf6229ac7f710e1da10af4a8da0453a42bc408d141ccbfcaf318b478db5432c44925b45fe617ac68364fd84ab6bd0b86391c847356b510ae9655ff5fa6fbc6b18fef551324b6e4c1324b528ef29128c82fef9146ab8edc1b2c39b251d0aa168b19136c55f8d81627af1100a96da2bfb4b4ee035f1c9082d7852e78b14b111b749166030e5f9222d06680b04b7ff408277846e825eb4eb3a8f4c1dc6e88139292d9641c7e1cc2fc530c8da6d2c1767dbfd0d20fcd816e545a48e43e7935151c1059adf860fb8d82d914944caaeed460f424f50a09156f847f610ca8f1f064c692b1ec62445d8cf22e86087e8a212d97fa7e9da72ca16b7f764236169c608e08baee4060398088a06aa8395869b5d44713424e41ec10ccd6478fe821127d8e8fdef4098365726b12f3b8db995a84165d81180a83d23335790171ac162b1b7a542cdacc7494f02a0c8282e9407af3ed04e8ced15533d91d1c20c596424af08fa0368f5417228270db9c93565e3f91f0499e2a908d9022a55ab912f5170d268f69c9da02a231563a720cd00f5621ed0e7f901275f4c0962e57dd6b1a06218f1ee1475b63fed902d8c0fe74c4f60ddb0aed088eb1cbba190c81f67234e35da89c98d84710de033995f9ed268f6e28fa62e83cddeceac96258b047ca6045440446ea391df4e352625759a4f6cf4a327a2817e8eedfa5a0d579f5f7a5b73b84d593a64850420ec8f821129b8c4221a06ffab5ef99ee3cab55910c50c0c4f57ab179cc1efd6dfe332e1606e6fccfb65a9a66695e2f95209d00f4535ea018aa69fa4b71dda4b903aaa635c453351af265c389f8262a6205d1851ad5a0b3343721296737e8c00d1d038ec9d275b32f88f7f68c8fe8749d4662bf92448e6031c41da7dac0262cb4df12e4aa275ed88684fe300f8b58d6e8abba1b0908d880760c3b52f0519b750cb6955c6ced33a3d94595551d0144f07b6609f56be222dd5961f97cc5ae9d7398f9ff5487554337641374d2278acb31bbe0dc63820765e147644ae5820bd61696e814f683cd3d4731f317d3f7138c01f3fa8ad3ac29b52bef034906b313282830111202efd585ae23636e8b3091860a39308c30d6a129ec6e22e31f991ca250dd81c45a2cd7aa49b03570c14ac99302e8d93f7498461c43e57a5a9ca5ccb81fdd605a8d56314960f2f68f3d0c5e04efc9d2bfa896acd900aef5db0230b16423d121df12b49b7cbd535dec5f0f0f1c56bc9dfdc1b81efbac5a279d23afb5ea14da8f5efb2385d8210a060b066742e453a2a19123eab9efa3d1b9ce76a04f6f3172443cf91363e428b637ec854166a8a681a3816ae4e6136e1bf117f3467b48ff0c55a937f0ab3dffa23089b597ad1460bd89c170004b50548095c716d82631b380a6a286208adf57be5d78ae81a337608edfe0b27fc308643d6c5efb6377d9532854f08fef7d90bd77757aafe2efbd9ae27b138bef8595f7be42a1d443c7a97aee06b4e01b4b9c73dfb54e789963c7d5891926704ab0a5723e2cf03888451aaab616a1945cdca5988b4bd46203fcf516c260975f58dd700f52c8e7e00d9692f45d30dd93aa3aa2d5c441fbf44adf09b4f8e4cd10f9a8e36394cea147543ed347fa409e891ba07c8d71e8d6f68a9e40cfdf0b6ef1d5bb21f15947c52b95438f88fcf387c3013bf39067c905780e6ec6b1413de5faa6d8570c2fd939e3a3f4ea795b0fb83b0cfdc3a9283cb61569ae995c0f3505da0df08ba0c27e8b0fd71c9bdddc17e893026e4f04ceecd2991d511b0a608dfd08df24f91e1530e115e30ca2dfcb57d982d0dacced72895b53faec5f6c681b65e040ce0d35f55de829bb6cc2eede57c6851d31a2ed396dd60b5662baacddbac04c0d7028d6e97e43c7f8bd7b34f19a1b90d37a8a73bf37b66fa85c0e45a44c263049239659e912d9b5766bf51c071ff91fb973d4c3993c77b39a982d856cf04975cb1d703ab0c7ab8bf0cbe72f703f9b0371d280ac343e35fff038b9682f85dc0eaa92061de6265a294c2914a4635861212117c2b9c35ad41f7ca1fceca6775966a01e4ddee1ef7b3a486c8af51e88980f64562bc1f4a73e30f60af4104d0061cb6ab5357c73aced2708239e08c4d5f9a9213a08d339e30d4ea2df8895ce5f2298c55515bfaba655670956e379b289132098ea89f281c5b0f30fe35297969c32c36641b013baf52c05fc67c5d6d79e4648b44e2c995f467d0832a479f7ab6ab9fec32722a0cc0205de69a2561be9c46fa71634d89d5f16658e07840042879e6471635e3a76b465e2fe814e332632c9ca482f82514a85607c9ac8e4cc4763a245ae1ae9ab458f68d225bedc4f70255931cee82dcce1395bf5a8e3cf9941fd09586059e002eb33b1e2deaadfb88c380fd156109b53fec9b0c6d14d349af78047e8bc308e3bf8c88e54ae48fc579d7e867ef19bd1c2cddbb60b7d83673f18ad5a4c9bb998a8f270a907aac15c749baf1a1ad55a8f69c63036f3b198d4f6a5b52dee3be20a01fdd368e987e055252618714657734b652c6b108ad299109b524a133d63d3666604542cd9166d84e263219fcf77b4a0d12eff5250b54ea8c761c5baf80cee7e08015d724c399d2134e9167409ea740da9e0e2b1f07b6ed52e35d7be5c8c2986c6e615f0d5fb99d619468cb2290bd1568b712f74707207871903cc7a84900e92fa077a90164a91e18c95620b54664656d4b5a14079e5cae1ca1f6134aa1eb40987b29eb71baea102886d71f8acf5fde1d70989dddf3b25568f0c3a027fa4c83fafeb86dba344990001343ff94298ccb8a51f3b36f89a8c61ea4fb83283507242a343f7a2a5b7ef2809a6225492ca99c7cc40d5dc4739520b7032aeedf8c5611ca7fc35048ef5f383f3f78da690736c29704efbaff4c703bbed6a5faaa5bfb07d73072fcdb88ccb75c166613c5a7e5256db0f556a9d0c3a9f720f18febb64447652f681fe1ad72f231c3fe2167ed111a350318aaa63aebebcc0523fca085f07f671c3e4f51c5792e3ba9554ce4820ec7697c33731b15fe0e322d98b5d4fd8ad36adce2f1f852fec9e9218284d62fb240a1a20a523967bbec4f40131f880032fa9d51cead6a3d8a06ff753cd1f7eaec18f97e911039887a9c939f9baf9a2a9bd129012266ef2fb93ee83d34e773d16a31237b99993f93aa6bf5e515a333759f2a1518412a751ee67a059f8866cc1f380a72feb63de1a0af070d576ecb6600c97f5e5296764d7701b52002d0c8c77e4302825a409c0e6cc3288eeb5a1929b06b19b92661b602c84e96439a62eb9c1f2406c93c70b7df1d5cade3ad867912a021d8d9c3eee0d16c2edc981d567c33c61edd878612a29df19c026f6b29b80efd55d5bfaed7555b9ebc2e44970da030b1859d957a01a841e2588066bdeba7da04e59128039b1df99c34881ae68f142c939ee8da2ac21199798b3e71c68d5fd1890b9f4261a69385a3d61b339131238cc3e654142e4432297425dba50f553f7ec5a331afe3d642d5f57b80e1872073c1bff15b27525f70a305da642d08cf1ea5a47b5efafaf0c749fccd3bff0489678e5ff66387febbcb2c6c853f408d047f09ffe7361c23ccde1a7f96fe7a6e31f96da93eedaff1dd539e62940a428b2739ae24d64a032a7714d1320a463439c3d096b43c5cac95163a341295b4dc86c2e281dfad8aa5c087e3305223c1cb76385c08574be34cc2464d1a69f636bd04e039a892dc84000ed7eafa75e3a247c80217500ee45b347ac241690e863b076eedd5083a2a0062158ae0533967c3881623b586d443747f4459bad34af86075a8bc0812d525bf02b2e808ed74a9909a2afddbaeed06f6eebef2aca73a9f47e568d17e2a19cb6b25edd15922492bb13888c38b03bf1bd3af252a7fd8b8aa0bbba46466c3197d65dc575e842a5691e1f30e0e3e2afc100f4d4c4c3b37b71c141b6921a813711af456a3ba3986b72685ec21489c011da4e4f7667c20861406de9e2603eb95279a4214961bd30d5cfc4067f9bbc2323b68d2d18ffdeb09b571d8c89011df82ab16dc6a5fbd357637e60d2441c0f82baf323c4486c5c64c5e7259369817e57ebe3334c284033938dff694c2f74a78351fc1d38110d0444fa86a2cb77a634381705f2141b1c65107260ab930eca92e82a0d3b368db4f3488edbbfe1c9dafe8412c876a4a4e5d53718cd8863a13c7f3ea26f0465c0af92d35ea340c13465b9539d7d9b4cbcdc0260ecc777ff85b6cea0331317b474f8d0e3d716eaab94629a0a62b9d9f66fe1b0962eebd8017f355c51798a4f380e7eb98e616bc3765c30d08bd064226d6a393cf770ae67f9302a3b374a998321ee68f9ea8a308336f3bcdc12ed9b51572a109c5392048d9eeb028ecfc29fb540c79502ad4cb1f3864da35213eed3e61a36edf54970989b495d428712b1df526c0472ac473b1b3557c443d8568973ef2ea43f9214a78413c90e4af1b236c38be49e4a2e709ad3f17aa13ba04c090ec4d6089d2f5178372c6181949dcb6740a365100ed859835e73a1264eb2a08daed16b68ebf34fd7f3fc6c501e859a9d3298696350b235a94aceca21d5df75699385c54e71ff68a85e7898322d99c11824f86a83908ea266b5cc1e527d4a1bb6a594aed5e9f621b01391b265d39deb62591ebfcee59e8bd5ebce3faa4f1f34c46efa7aa3c59fe6e2719e9270a2b6825358ddb3b0171c8af292b540ca881e3dea2e0afd3025851e2519a9d8f49bd78c50052ab5a1a4be961ed9def80bcc420edf3cdd6c128dabe32673da446686551e76ebe3af086f9a05725ab2a8261c052142f2d4dfc08cdec01287b7f72a2ede4825ab4d64e4431a87f4ae7b6ad59af773546c0bf77ae6705f37bb9feec275daf351a07a6b852f59823e6c5c90156e1e7d52215f020bf12465df558913b413afbe16037c1b3df4e531801fa470bd82c4fc750e1e90e0036cb306a2a3e72de0a79e3f3b05b3e53ca325ba6eec7c74bfbbed492e76c9830423baf67f4747b3ff3c4777cf6cd9aa45f49e1497add5e4f71a72a45eeb1118ba40565b1da69fe45735d794de90f5c94c924b462e0922379a001c6cb5ae35d3969537343f9a20e0eef78f6e80a0446d9d21462b6e1272153519b99d2fca60be7d099bb797f13455d87606e0b117dd6f98beb8324436662ec62fa5b3674172a7c29041ea99fea952f3d9d3f5459eecc8cdc296d3e57f0b53b64bfafc2e8417a925a1bc6cf7062fd2788da0e1f0737ce35338c4abbba8b6c8023416199d8f470448c538d2ac5208246bd1473139540ba699d8834827496b601efd7b64effbe99f350385ce7ee13168127066b9b081b0aa8e5f2f8997df27eea43565b9edf329502a711d82471c7ef2a2423ae88f3578f71a932ccb4ae29dced177d80f3c892edf290884fa666c8b7af1c52f91ed72be5d72bd002212b655dfbeb1b51f5c7dc7ca4891833151d295a7e40be46c5dd85a922537f43f0dda51d805927e013e325430dcab402df973f3149c6ab99a17a127b35edc33047976b6112eae0758e649968b63837e562612fbc5932f06f07c2d554bd9a5be72be4e3dc347bd0fe6129a5c58630a5099a61032130785d08523dd200be075da4a728a5d058dc210fef09168e254e471bc125abd0c5239599ce34aacc8137f0b21869050f3d93b625c1607e75550bd03b2846a085b380e9a78c2b4894ec1bbc89f9471178aee564fd5b505bfe39cdf4e590685fceb4173cb0c31b8d3cf845285887c42d6cb2c1d0640dfaba1b0311dab0f480d95b6b8025abfede93c6158133703b694b2d928a954106186bcee0333b9e3ecc7b47880f0c516b93d9ccc08395eed1423532199f663d3c8224065f50521bd49b12837550e09c095674007ae6d8721435b92827e79f469f97de7e98977b4399e9e6f73ef1416cb44bc331dce4df0609dc007dfcebd1751ab1bd96ecc5d99d6fb8f40647967eb324215c65f8c1f82f437cef9e93d06b9a3497059a0f66448ed4e9bad05dc4fefab80c3aa89dd9ef1eea03b60eec346a4d1816aa2bc1c28fcecfd81f689779ecbeeb254f6eb7310d1ac859407e6f373bb3d3b49be9d29969ed22494952a3a778ec550e1b91134c20b1746ac1879a04cd287da494425ff86d2961b49555829de3783206f3d1fc30894fe24ea9837b10278cf40c319f049584279d85b8de5a0774535b64afda6caa5619addf45fc3c6f46c33bb137a5f2709b3d68204f92d2348502d8fd08bfe7aefb33eb53243c88657ff55046364c90b7341d3e6807e02c528775ff5976da086c5e19ef0a2875e1d77e85d5d0421a1ddfe4672f578133cb503e54da04c241da077e4eeb26be8eb6efeefd4d8b7a939c11e5cdf8e694ea503683b924f2333306db3ad345a783b2a3c6a36b8d855aafa21e0b3f18270742af5066c9cdea4ac71bae767e184cfca255427679241b765d994ef098540b52ba1d74c68c3d3bfa4a167e6fcdf3fb137599a2431f82bd260df0f364078f12cf92ee10ace76e220dbe7116d9c09fa047fa05d46f5a694cece2ad7ecbff90fb8ffe6f0ec5ffd37d72b5650fb6fd10f89c8bd68d869180ad39bc0d07d268007b205a8c095572a2e86009a370940a66951675d7dc796682f67bc48c341aaeab1044276363b19fc6c35c70b66e02541cda624b50700ca67fd2877ca4c65a011453042553ab85d44d98842c4d9a53afa9a4b12728c31bc7c5d6b477a50acdf9cf3ee23a99c1be29efe2cfd073437457dd4ade59e4b71a64be45357a42ee82ad7a220a8056b4722d46c898015c727a8f4a715dd32bcfadcfc3e81f097605521b5b7549e49a9f39720495c58dd8699e715cfe9f5275da3c6ec5bcebccc68e42a19c2c16ff588f18bfa4cf6bc0c16ea6c3374e28702d435c83db4e7c57733b62fb30f2ac1d96ae14438443f2d5b3b19638011bd5bfeb36f72c07f2a517e833402e17984edf7f61d71a10e59c9bf001dce153facc78df04d752e1c12bb181e1169dbaae34df6f2f6ebc98a03b25d3e9f87dfe7a041cc027196e9e7021b85bc948bac599cc65f968526269dd7d18ef8fc5ac864807dbc394a2663feac6c6d6352baf17ebbaa40849092f1991f3ac9e37400162131cbb7d10933f463ccf2aa81b52b9d6fc097bed548b27d6379d33fc5a3810aac908c96301d5066346aa9f2022d1f7caebfd053643451f7c9978ce871955a6bb7e63c6401062b696719f64b064d6f3585b5848c6792743a125711aabd2a13d50e35993586fc038504cf9073eb8642827b0142cfcae8b3c17859c617a36613e4b7e0759bf41180f1c70eb69c48083d04631e377c478f74418f9bf55200a8e410af3314b7b4d7f59a252592340168230755a791caaefcb8dab7a0556a3e264d34b21c9a5f03a0543f3b76df264e80014d62d309674d97b0a5546991f9c0be072240deddcb4b6f8a57af6834f49a1e8ceb7a60bbda463419892ef4b97a9f2e65413a0e4df8257cd9adeebc719ee358a567f62dcfa77d1af51de1fb045fdee2aa80dcfd2e3d51b582bde0f894d27c9b2d412ccd496c5c261d4582e59191684470b55579d91ed957a5865fbcec5a49d4e841a419b466977b36168eaf9201cd79cd644b40c5dff4d517667af94637f86605b8fed199214350f675fb294086a00b768b411277b37a5036774295a0d389d21fb2145840cfc187b637b23be66d5bf4e201183d3d3d34f92ffd353b71fe97f83b33ba4123e8ed8e60188774ae4f63bc11c5b137680cf127f30a6741e0d00805c4e83ac01bba474c94ea081bc3d0fc8169829935048f9b8372989d3a57a6c1db2776c34acd8b748659828efdea966358964973347857b50a11234568f23edc936d50395d6adb89de5ce1206e72afbde6a70d9ca72fd1657eea07857d33db2b3a7de311e7f7b21e1a60965a6ff088f22e32143ea0a675835d532298a62f6637dfa95dcc339d6b66922c888cb3af1610b906c1a1410bc44d383cfb88cade8dc9966ddfa11905114b1f2b602588a29712c4bde6c06789e5a9b9c8f7c13999937f195a195b13e5e7cf8a4695c6ed64910d21e9df209bc3539044a73a025afa5ec1d2b6754ef759e6c49b8b50710cf49c211dd5dd6c5ac0640727572bccf412d279faf3553c5fb1aaa46aafe208223a1ccd785cd5d78e49da63e0805cdc3ff49be3c9c8808ee11ab0aebaab63df4c43e362dd4919e6130a35320d766291bd72fabfec2612d71d325aa167e4e2e5f678c4d859ecbb44207ad22adbab4d7f586723cd093ace5608329dfd277afb319b8eab3b8dba6505a19c91f27b3f94fd33ae10bdac7888742f5a9aa23872d0584ec89819ef5825ad38b32d4175f501a1b223ccf46192ed9df80836fb89e78d49580b5d23e3d8485d8a0eb83d9ae60106b10cd1a70410f62ceeaa98b25d5b0b7cdc8b5f0f0de5910ee76df7f4a00a9a79edce54bc3ea7ea25354d35834261155e784c8669ccbdf18928081b4a7d7a784c36c8d852f09804db60cd8c83508dae131221305f9f617c7c331b28335e2899852272b0ac67c0156819f3b5b591f9cd941332ef7ca841cf43e8ed1758452bb08a5976f8c4e4a09668680558d221c909e9ac680cc18eb044d3319e17b7ce54cab737df593d0f7aff6489830efdb6bb09b92bf1c21ad5d34d0a8ed441ec97d1a8e7d487710fa51bdd48e5d0b2f8b43ca5850141f9f06d027bee491933f5e00a6cf17e034b67bec62ae588c03901df980568cb7d951eb7ce7ae354b3fc504e291bdc326c5920c829b87f3213022eaf7e23cf295c7456d436b5aebe977a01554ee7171ebe770522eba488c86d291541610064ee6a66418ac7fde335c2ef6027bbe0743a4af12ca1bdef09ba433eaad49be0938a6b62041b206ba6cf12d1310ded38e01fe50be781bbed8ce5dbdb1c1ed255900d8724f80de77e689cdec5042e690bbcde9beabd9ac0f6cab736af4185b543d804aa3c7326767f7d0399abc2d21e83ecde71cbbcdb9b41506a631d36f021c70b907f8a97409238cdfc5917d7f66e628c96d62701ffe64514c4e73f0a56c601c6f82e170f06767c8b744a34f625f701d5d0cda6f86e4082edf9da208c1d6f81b169d806b6b62b70183469e36f6cf8ffc6ab494eb752cf83c09a91c2a8d831a84fb29c6f30d9dc3b56c3006786aa3e0f866a8daccd450d8b21c5cc98f2fbb984cf4fbf6caaae399c0499ebcc37ab7d6f2e49955836f69c9425308c55bc42eba6d611f8e1e0b0bdd1a17a3d0ea018c77d959293b8a6e1b7af894d69383d5a20d68efd3de680cf7b930f267e1f2af3478b5591c36cc4c60b07b9cc3953f4142e51fb877cca0f4dc80bb094eec0f2366c0798fe55e6b4427dd940fc3c2640581dab5f0e08950360057401782e70b523f10d4101294d2431cadd3c23b4e40275875da3c307f2736158c27799e6d98aced7ab51d02125d0efade91ca859725a8af0fd7b9bd7105a43ef94dcb242073b208d987b016252dce8f74034722bfd87c0934bee43a5d9cacc57767c92d41d13ab26538d9b3de5b5219e857d79ae4d2ba8ac549aff34c696f4ff576a3d543051a3270df22f5012ad9e44e7e9f4b43fd2ef1feddf8a617d8e537248a1327d4f9f2e54e36f14658a6d44225c9a5b3325562446e612d94d9034c3a5d9fdf3d81caeb81f1fa50b7beec7f0f90b6a24194eae0d982bdc360b3bdd019201ade5a5fc8ab537ba6244b87ca19458eec9ff80cab79a420bfdee093afc95792de1760f5736e3af8c48844f7baa5cf3107ff3e84e350ceaefc6758250af8f26f500762e2ec5ab17795a9c1b61063742b5cc6e828cdc89dd518471ebffe2fc42252074037e74c2662cee72e2ef75af8c520ebd24188fd65383370dcf90e36d4d0e1ea6a80198edefdaa6fdc56b83d7cc8b7dc4041ef05e1e574b33be885026527e65038dfd6d9a6448d2ff214991b770fdd1069cb809ab950e3fce137e731aa7aea4e3fa2b8dddfbda83f8ab5c3ab93dd2ae5a5e8a9ad0dc5d72e10f17bbc02f70902257e46137d5086db65354b1bb3dea7d06120f1a80a6683fe38fd529f03889ca1f2089f5dc132709527b8d44aba12a4f28a0abefa91b4d4e458b2347d7dc3e3bf81533c419f1ea42165e18aa0c52f7a064ab9c129e37095085a03839fff4230dd685f406b87d205dac502c92948e76126b48e665d0938b3b5abaaaa3853183ffa1d63d1941a3ded72b3474c30b334e7d2661e8db518f2eb38e6f3dcb0b4c690e61f1818bb5d6ef21e5ac4682e5e8aa9248ad182ad011e70855b39fb3251fe508a87a1d1bcdfa21a3f9a878d4d807313db8bf9d8de237be4a87c5882e2adbb7c004ffbbe6be3dc5e0621c1468476498ed624478af7ac706994d0ed79be1b02f2cf1a49eb9a0adf252edebf66f1dc4a3ce561c3246b4a7b548811ba02523c2cee3964fcf96a53320f29c0315c4c0dde58b8cc48f92833f886b75722f23f003c41131afc64540a82ef1165cbe3650d35a2c28d28927ece1ba727cc8c9f7e5d72ee363f41cb93c1edfeb6fafef66945bf218c5cd11686a0eca5af7cbf1952425b63c1031bc67b8169bb7312b4b4f5ed454535802208dd18ebe8510475b36778df670442e10274c2647e8934b962c4851213e4605282660fcd159491ae2e6df95189cf208a668e936ecb4c7fb282c5a8907c4595927878000c9e95072a8bbc6958699262ab4d00b70f55da4239f2cc53839b7dc3cb14c19fd73b60d01f8c2de32ff6c8950821b7e5c11010404fef690953208598149ce2a0ee9dd051c633013c47fced3ca3ee38c61b672c1bdd8f0dca29266da6b02e51270973131d232edbab1cbfb32845fa62639b3b782e0cead5088244d1eee5acc898639aa43de27af36b7eb6b252c1f533c591e078b40ff2647ce6913239a6a42b50efe36c33ecbab004441d2729d361ed735700ba1a613461f3cff094dcb8bc08d698e24c71fb51aa7db9fcec9dc4a4986c5453d4dd3479c2d1f630a6a80cc771c30a210add354012135bde51bcfad2e655c333672235daa957adfb979f0a351231ad258f2e9d810152a038ba24812593325f5cf52a8b1d832c46026c048ab4fa360fff47284c276093d36c2219f5ea280610ab8301833a2631a1dbb1e415daa975a1a85caec9b1b0cefc4cfe0629526782c9d3142fd9fd80168f6a81824bf12ccec9595d8ac22f29c31fcc2c412244094c044d8ab6c27780baacc5208709c365d85179275d08175d6428e1509ed3b3cdbf8915ea4a7f7054426ac6c82e800e7dccf4a905407b2a7897d9b062fe4d6f00b8dbd6c52d5e2ed9d45e1fed0c3b6254f389241e0c41e81ec13b72833d0f6d8a01585a201bd3648deb6de443b14253add04ab5cfa3ce0291928141bd0e74462d9e6bbf5d63297d284f25741dbca9350bef30e4a0c50501223cf2fef94b517db110b14873008d48a95c8293087298f73131d2f4581d81955d031553d19898b8a0cbcb81b23f8a8c5b1c3fb1f35d876054ac2ec966934ac121d71de6c4f1ed61e35f8329353c129833160b0f0758740c2839f8b9d689a131ab1c422f252705bc6e9a06a2353bf30c98b9d0b4459280c89b84f47b9b2539bc06bb3c6f584d82be311c6d6f7619b55be1f6cac2322cd4b340c248309913e4a11c5a9c1909195596dd6a56c0f7ea34f3f1c8f0b0b1a744002578c6d8299098dc9c0f2c3a8de20607229a8d1071ae49654319a1adb5123be4b1b64e2c7bb0f508759c2e551fd75bc37aadfc4d77267326e3c56c3c9f138d6f1ab3a40b14210023cf3935fc33dcd48aa91bcfe64063d8bfd42c62744ab910410454d54f006ee10e657ea2640822843cb06848d41dbaee595320c2904061a5cc3b0f736f36a0a9535278ea815f31077d9d8096b4b80555264b64abcef7c8465d2703eab920ed144419213bda78f4c120db1679a4e5f7fce6b5b3e0a14399e9c02d3cdd231c03dc7cc682b020cb323100b1c419345fc8761e311ea3eea4ec05fbb04c2f188f5547f731e5214f18e4dbb80dad18771db2ebb61c51509ccd16204e613890f7f9bd2e3608759e622ccc1e27265748c5f7624283db1b4a723f4dd5bdc1a9588a375f69c9fa792f6c91af870198ee99177ff9b7e7ec29b4f202889581f70c2df606984226b3e4fca606665f0ff2d142a9ac20d0445cedb1cc4aa9b9672ac12edd7da57c6a94f89500e0e69af9cbc795fb22e522a2a4699ef432b3dae90ab8877e76654c8d79bbf1a7e6c2cb163841b2d9db051441c61f49bab2e5629572d3b5cafba7f20285d84aab9109274fe6e39ae57e336849886851649b998386a3547e24d73adb189a1bb38e89a972e2049555ffe864e5e7a4b0809c541651de2e82cf5802b840b3921137d19169e1941aa383a3bc0a22b1c5daf4a92ad754ebc9cc14d742bbcc4feaf02bf0806a814eded878d3188bd052021fa924a983174a759f7c00197f63a1e357bf2efc3dbee3ed13edeb3917f5c3ccd30dbb9778e1326969b89d746b34c551beaa02e432866cc801e0ddd85992304a64a1469469ca375edbb50d31070fb96db4176fcbe983ae80d3b72aac0b8c145022ef02bf9c5964a5f0bdc2a60ad267053a91501081f092e4a5f8fd0251acf6a4f60031930ef4aa4039963bd6ce1368beb62974c9acfc06bdf2872f54c75ef57253a3cc255279856f4cf146207a8b8b783cdb7c339f0473c89ee00d13f041552aa127908a2bac968133389192013997060ec2e5f399051d24b47ad4c96945738843c839c3b48c6555f2ddb8df1e8daf5827fafe91f9561998b25251491b8ed540265103173f9d48af0b1c62b36f13d2298126623ff3b2e2038c5792d4af01bb41b9cfd3c8a3f2ca7ddf735822e810a554245d05c90d200361241f9d184fcbfd1c01b2b8bde3667b5c39e385a25c8a6a627fa72bae1f15e7ff755f7637c06aaa2c4d286fc6fea71615450272715bc521b52aaea46f70fdb0dfc202daa2a8f50b7961bd5827d305fc5abd1ec2fec7b6f5265bf1e3e1b7a5f54afabb7736c09ccaa4aa0b2954238bb5a869631ed86de8cdf1270278b82e7a8078af1ce71fb313a2d21fde1047aa5c1fabb96b7b29d197f4dee4a08c0ff0250b31a493ea525eb47d2cb3caa98a07b4866ed9f2f4266e3ea7a4184734385afea290c8d09f8369c39db12baada0f02e59911700270e2e317017d70534ac12f55779219d0200e9beda4fdbaef8f33ab70bea3c5f6da3afc1b0697239977559917225008d14cef501383f9b1723f9228596cf3e908332ef3a24275ac8547c7347b290e4bc9cfe7122f3bb75a4d3098ab614cc1d4cce767aa05ed467f6da40c7f12648fb3a542ee2dbf980fec427fa5a23052c38eec431957e965c7ae38bb14ba304017fe057ce45d07c46e7e51cb8d16655c38a1eb5a9bdee789e8f8acf69b52a4138b8a8cbaa056e4c17b11be6227b3950a9208ced21f417339ec1110e4c33a794fd6924a092bbab32d80a4d6270eaf6285f5c486a3667b7bf87cbb708227deec455a291f98de7cc70186031cc3652dc56184e88e297c45d84bfe1954fc60a888754e25bed22943c7ef8fbd78fc31721b103567497bd55355f8358df63395093487ab656332b71a2ac8d7e1d58830439d82b7a90e13aa143a6e388c466eaf5080fe9313c9c8e6e00e609b9cf7fecc01aa91ff0e4b6996347ddb5092bc60e564cf2e0cd3ddd133e26e53d6c04414f559afdc2fd7336b966462f17b030c2e5cf2161ea22b9b3362047b469ef69785008e66b6e723b4fc63fc0bc1441332f2e05cd520009499cc2c087441d06e496662e1180203f6c534bd43ae56f02d9eb8766a6146345037dc2f611b5279b1269ed2204925ddb09c922264dfeba351174f3cc5522400b36dcf07cc94ce9c82f43d7c63602dcda1d2d8077c809c2b8a20b25cdfff698a080a0d64688a7f7dbae15d9ba7465582b6343e8e3a0076f35ad0cbd19bfefd5bce8a6d75eddcb380a40740be4ea9cc7b5a09f350ec3f0ddf3f3816b0121cbfdcd3ac18273e91417395f2b2fe3d8c9821d15aa012bd3f4906273468c9e4ea8d38a4d23fa274ea846af83c952dd22756a270e07600958d9cf3e7fe264f4f5b4f8a2a18f9224c1e2eca742589c68c002d9169231e93dfe1fdb3c710ce095209eaf53b91923c1b0c0cdf5cb9f00fb5932e21319e89513cc0183ad95771026d4e84d163dded0dbd002ea24b22d32984216c0b9ee398c81d7e5480ea52f96ae8d49bd9bdc0e80ca3961e1b2707f186b1d9c21a0a5c73c6bb1b05f4a753100f361e7acd6ce66c8710a06506bfeb9201317b48cf18f6ae5308b14a1951fc1702807bb42378b0c3d4d3cd36bea37163e26ce0fe9f6609dde564f4d62928ef9d10ad222255c48fc5cb0eeef273fe88b6d097f54e0038c06b85404dae497ee385bdf2c5ddff8b13bd97120343632625a8b39d96a83b154489e506a3352f585c120a650d1640299ab55542f0aa7d8f9e2542302303be30126d18ad78870638ec60de886ba1405f8599e38997c8730c1ad882b9d5e6c9b11bc2a830802fec98602a4f5d9b0667be2c473c92edfaf967bdae9887ec789a12009c661be29e4f303b84ec7807118baaea48150e65e6a7f3bfffeae573951450d38ac5f31449622a1ade32d3b1470be118aab80a69a2f5fd2b01dd34b07b25739fbbbac9f69ccf4561b2c66743cbb11ed2d18713685d61b2fa848c14f491e62998d6ef1ef696f1cea3a42e29968f1e353c3db37d39bd23cb8a50d53a22848dba953918f99c9d66592ab8e008bb9d2a6196566264eb797d2b063ffbccd9b3287e0b567a42af46847446e461ae89a8969f3777ac35ddf04076ba690c0bc7398df33b90bc836740eb6ecc4b8070259906c588b7d78908d7bf0ed69719cab613f42728dfdf43a4301bfd3ce4c3604b585db7830689e417108491cc4b38cc67b2f88b6b3c6603b5b1c789519332733338be86f3ebeef68620287a4433157d63931ddf851e3c20c95f3c35d07a8f411fa86f785342d504b7261664abb427dfabbc6810306ecf04e3cb70118ccf13838cecc484b890945d3d7fd4f462697b1c41c1f8cc1578bb316d981840ae817d9b45dea02b468c2fc7fa5412a70ef89f9ec8fc4e46c8d2d276e566c41e926634b0a2200b6a8e8b9d8b2d29e802d2c54306c6911e4638b4b352db6bc60d956048688b3098ce8ff12f3d85f6470facb4cf87ea10973cd42413052b3d15f6c08fbe5861c2b1180111cc2fe9243d9bf1d487b30a3f2971d49bb67bb50788878623e00223db3c838896559628835f12d5135f9f080b7d2e1b3a05c3a5c4ca18ff32e953528e05cb3da54d78c9d48fd924169dccf9685d4cfb86440ef68b18eeb405671347adab289233bd3d8a649ff2cb8cd2ebd4907a2f8ba3832dcb9854bacf722da7c22757c30cb86713d16a6bbf348d2836c68234d1b0e0aaf7584dc4c0428fee17af97a02d5bbfd24bee30b79d8f22731ea7b82f5a043a06d44a7d0234e6dc12088c8b806f1b3edf001cc689cb094b219b367126ae05c0727338576f5070d9008397e5312a8b5fb5fd5f36a19c8a63f32f6c7b56407a157e2f48d449b9262ca963b42bbd6dae8a4b910c5218b5644bab842f9731b8dab88c3da69b7ded010432d0905cec613814459786cfbcedf36bd451976ccc452a0fb5956032fc528c2f34364e27e592bf950b088277ba5f66349d48acc511aa8ba127a364dcbf6bcdb4085611d6c689f65b4f8e2052ddcac425026bb3eb444f713e368dc358df6b8d4d15f2ed52dc12c66fd03bcda81f1bb12bbc7cbd7dab772c86c8ca2d238043016ed9bda6daee9413829980b47168d85a0ba700c42e6fabc0b38346515701176eea436964df62b543c23daffbec443d2d566523fa751e65f046fe946d315ae0832613b1b146ae8f694874dab00ff44a4a7f69b1f357711f18f5a8ff54ac9dd6d2bb8872e320608c111e1047ece8200c399bfa6656782f86f1348ce24bfd6702e080028a85932cddff5e1757aef4f304c604d371d9ac04cc7e3ce8a54fdcc5ef19fcfbd5f90b620648af4843035aa3629151d59a43f41b9bbf6789532665fe54117b0ed23e0007baf481678c3b339cb8d2cb2aee72f809c56c3409263c06db82789e0143d6eae985d0025847cd68f3cfea5a669cefad461ed0617ad5edd1646fa65d292e86d4cd519f82c74358a343bbd3e53c4b6e3c2738d01c7dd237d4675b95b64402dbc30461a303b84564691f697fadd46cc42a1e12d042a6f246bddd4e187666464bf6eee3aba65ca3bbe3cb198df1018e0209be0d7ed50dcac9e5a931b98499e6b789e573fab7e26b159587a9a96ab3ddb221c7528162fce2c5af9df5392bb9c0a36041d2edbc6305db589b4076e12fc2c16eeff3f0ecede34be8b978be6567bbfdb5453f9a80f5412b8281546000632ba4fe55937d128cc30552e69b0976c4707d8369b54cd02828634e38bae167f0891b436b26fb3bcee3f203408eb591ce1aaec32f16188c2022e1d80b5e7b94071d4bc8ae53cc91e6e908754fffc489adc62dbdf479bf9764217bc174b5fcc1f4da44171b631bf07ed5fb907fad67379fc9565e5f91bcdc993379293277e2c4d9e6df159e17dd7f43cfe29e979fc4b65f2d8be33b758b4cd4f2dac403bd8be731fe8deb53c5897761f6c91fb1e94c9691ecccb280fde52740fcce954f3a000c61aba9aca8a0e0ade4162fa1234cd2029afd5c6b8c83d8b431bf8b83371c32cfefcb41976f1784436c8ca869810f4d5f9bc43ed5bcaec243c39e7adcefeaae0f00ce7fbece3459082944ccb116512d170e3e51c1a6ca91d81921ee49c909e2e73a495c2ef13b974aa54f45d80e6620ef4fa6cef9fb80185e00794c5b0b6fd435268c5dde4759574eeeacc2c6bcd9396dd9917077fed84390f972fbc7adf9faf6fe09c1cd902da609b5dce20bce45e23e3baafa5dcfdd18cfd10409645091846ba108045945682767a146fad3bbb40379d14c6c093b0a07065d03b9e72e1f4d4b2cf3e62c7d31dc4488d9c0e3e119a54f0aeaa5cb6e9310bed6132d12a73364e4ae16af1ee5753f6cfb6c2b31e0e4714359b6001288d9cba2256b736ee6e11ed4696614ab1bd166ca6a6016a53f15228d3cf7d9d581eee98755f81cf0fa4a9bd162557d04184466ae3da2a69a9f2292f9750d10b7718f2dd3ffe5d95e71ff21c666b41d6e30405a34d5078dc80b0e2c8b3eb311fcd9b695aca6177a5e433df8684a6662a97b336fa1637b2d56c801ebfdf2eec72b0c4267077e50de6b7a3fa0b4b02edd7244ca84c4d57c16c466eeb6c5405ed48c065b8823a6140d2e9947416a25f8beb5a3dcc92a840b1c9d595c74d6ac7eabb7fdeac16b194cb377f3029348db7c32696b807d96e623ac053955671ad1adbd1f624eae6d1eeb55b47fe925f725b2639ad1f9726b028dce342917a4fb0290283315f7489b6026064580b43439d09dbcea204b9ff34fad3e318c974ccd82e0f81f701177d901ef84a3a5a7d50959b1e4fc58d93ef46f9ce8b369fd65975b4ec17e274f6957cd1865b1b47681e246bcad1cd5d0813aee913a6c3535384a947a8a5bf4a1d5b71b019c7fcabb640573b746c3e2b407e5635067f730d70ecdf38cfd791450ce2cd4658d4fe8430fcbae142abb9a9cf262626700b1d0931daab1506a131e4136c9306d83f8c7f7feb50c1ac63af47a098ed270ccfd147031f8fe18cbd262d641a22c364f11c7eb874c6ab36faf6daca591042d3336802a25358eeecc0e54b740ff421902776adc5469d7fa92743abfd235d8ba709112f75d8b1448c1c85bd3a6b3fbbbf2cdf49705d1919a421a3ab3b6e2f421e62840579ba1db743f12ff74df15f1b55fe9f9daaebf3bd2194aba71da1d2362ef20642260274738306527116413002d19bfaa249d45b87be90592059be9cee43c4920a57a8e467b6a4f1afc6c96bc34b8b7f719b36908b1223191a64fe3a2b78c545d2f389eb4753dc98686a7255af3b7c4a60cc0e373bec759c42399439572ea49b29f9c5a4b7df9a18f5c73929dd67cc9e703a39a9c221a14f736dbc48e8fbbd68e169d7ee7a63628c19801876704b8a123a2565b2c63b815e474970ca9c595b0c5b94eec5fd6b5ea94066f12811927a884567ab3cdfe8262af047027269fe4b9648bcb5496c8d7851b1170c6eb9297e03392cef190a644c285dbd448646f7081e7e9b72bbae8bae205b53acfb874c6c4aeeacd36639946fc6b39ce084eb720f6075c7eed2233cbf95ec83437f5ef1685eac8a1ab60253aaff3f37a85cadf814d518306fe777a2f9c33fec2af760d7766c6b4a3ba8ee68f95bc2c98cf895e22b8929f615caf310c808e38e8675f3833b19279c13b8a22d08f19ad98ced14e1bce665bebbce13ea3a8ddd56a89dc79164ebe32335f519f99de404121741120f8e27f91919774409c74be9cdada55c4dbd93cfe6749c2d89b49db67ee09d48bd8f24ada6f4db8a2cae044e840b3ecd54de24ec4ddd5377dd2c99407924f370900b548d942dbcb590f3b23ac4abd8e4bede397100d6b30efc6940e6414ef6f29f1e2af27694fb886c95cab9e9653d968da57001f04c2af4e37ce395865877013aa87180b83ac6474a1336bf2dbca76a870a92a8908c9609133f9290010daf53b12f5069e1fa4ab99c18058c6bb5973fc3fd22e8977e3c9c281fe7e60ff97c4332646fcfa3deecb68945ed8e2fe231058667e03a66f08b641144b39f98ad2fb83cc5b96f846dec7e2c39596d27a82df680cd6404881e02c593758d3f613d54806ac0129d4d1cc3ae03e2a8629e1f87339cf928f9b49030bb338762054d6fa41bfd15a52d7c0bdad8501940affdab6782ad297adbe600d2b988bcd9ab53930f53f007ef4b4a18b645f25a2e3657cf58f3456a0186db3081f8fd911d1f420e0cf8227fb541264d4efe53c3fe8828dc285afb1e3964969248f0b73986cc9137b19296889ad84564851378132fff93eda1ff649d3a9d347ae36a516ad8117a49a7c0cf230932268ee99f88de084a0db234a8bf280a0e10fa7011134c88aba189c69741d6b0b95f4a389348142b5357fbb674e084412c8d222d1504c4024cbd176ee48668021603f06f2420dff32f1539f8e342c7c65a2701be773e2e11bbc205fcc9062e79d5d4fb0d5f7f61167b0c78c67bc78502cb15b777f9670bc6be8f25f65f7a7dd6fa5ff7de2c4bcab36244821ebb4b52a8e8277c62e94d660354fd795cb8f70721b889161094eb058ab520da8c6fb515a4acf8feb17d42046522a0e4197fdb6cade30c51a07e5f5e7dddc74ffe5f474dba784be63d7febbb57309861bb4bb68e91cb45d9c8d14cf505fcf5ea3b1936cf1bbdf8a65053abe2120d8ba72ce4e6d35be2afacca50c296f0e3ee8ba24d3d605d2b1a811e6cf4712b4c4f4e9c81b925d0a2c67106a98a8ef0227966c541030d07c0872acd5e5c13ed959c1815f8a69f757f879a77391547b74df26c8f0cf7ebc4744d4554661a74063087a51ebf1b10edd2e1c880f7eb01ee76627c3c60870b8ae33f2c889c1067ad6f66749969e677e8ae8dc520ccd3f1c38f35667eb510b41bfa7d4c40156d3d19ccdbe1088b2f74a15a1c71abff0d9fa460571627a49518c373f16e84f97fc14adb6d480103f9604059d262dd896b901f25e4d62eb6651ccff86454fa1ff7eca7085f9c99afa44e2cea497eda4d8db452fb5fa0d46ce38b533a9d4e9ca70bf4471ed303a7d88e840aa7efd57dd2dcaf595331fb214e60f80a42e9213850c5761063feb8b9b24104f0ad65041c2faa3708c158acfccb2fd29587e7bc2ed2a967e5f4059f6757cab36554cdf648f5b7bef2c513277b47ab572f837c4c56668b7fc5e3da5121dfc4a2ac64d65bf039dfc49d926af89a0f8805a05366999b6fe2759d96cea408e5cc831ed9d56570c439a3b90e29ec720d8575fde95e719f7a10a302666a4a53166f8c9591414e565ae1c9157e100cafbd61d0660f42b2024dd4fca2a7600486e05c317f3a2688f6acab7ee67e156511dd95b9a8a584eaec478c351601fc039f9989e5eeae230bda59d5aedfcfe001357d4449baf278c8b508d43c3573bc1d798b10cc2fd608cd038868e751781d270abe73798390cda6a608a19afaf3094d7ea5283dbe7082a99e68cebd5de0fa07f4f953e9b821ef79191b2a3cc91170a8cbc038e7672e7c682516cdb57da2f8b3a5ddb46da5a1b8776f2cc4b1ef7c247f3deaf658b62937c5363c53cb636074d320619d452dcdf978d24c7e4a2da4a16b7c1f41e0310e605883072fa4bda9bf9b3ca9738ec3d874d58d369319e548ee0378880a69f7848d4648d23c50c9deb11503d14f146886ded7cad9850ffe18f2b8a40a323ea035bc76ba5dbb3f65b745d56a1e0026fbf5aae62dded66b6ee284e79adfbc2b278f0efd73a656b1d5d8db61d025654a91f50952f9ff12e596690229101d15d1ba1fdcca050117a0f578b1f3096a07a448e30ddb847c20f6ddf69568b0db2343c3070a90b8b00ae888063dab32d1f42ae03306e2f7f1ba23ba108c3c857b49020f075eb449208a29e6b49c4783e7c876888020eab46c8441ac4cc2590c50e7a9740476f8cd33f1d245eb6f6af42d082b5c3f2b07c384eac620beec783576aa4fb9b61eb3e692a9ae208d9a9e03b11bc649a9d62a69ef47324d935256218dc3ef36a1d820368a5dfbd5f6bfb11d974d892be7bdb0f5da0247a9b6dfba14f1ee21d53c89135fc77060bbf319f6ccade63e73e936374c9608fd2b85fd5f63812542f52d15051996b831fb2b5ca9e8998a60cb35751da7cbf7e55f867edda4274fa6faf9c6eeac490295a7c2352138b880f6f6c27539e5e3649870ab929fbb8fc3691b1c8193493fe83d9c0776ddcff6e50ffb7d5da5d0c1f29b3f80ba361e54ef1c567a3e016fea8678b6f11fdde20b13341746722b9299ac383da6b3b06733bc485ff974a2b19bda7643e9039b4f27035d6047a95166db53ab2dff77ef1847e7c0f37ea089f035b3bccee31f0c15bea2bebec0403716a772ec90bf8bbf907a34accf7539d37e2e7bbc96797d5d2a77fcba5b3507697a52cda9771c4f2894c491535f63df59a096912954e7f1eeaa1c8d15899417e7626b63069a0f616ac65a541cd98f982fc9efdaf2b7989f06595f35fe4d19a42a769d807445b3eb7433dd759036e790217d538f06420516088ff895704e24e10ff4a45c87a26eaed3c7dd31e0f9c7ae6a79cd5aa5d28311a9772c23c45f84563a2ec000a284c5d841093da16d15a6b5cfd6ab96ff04b9325245164ff73c76d015c267fb8da0aee6bc6c8c687051154d3b6dca23b13ea195a5d47379bbc138e617d0ab56a4cce0296011113a4355fafb979ad8ba5cfad93df415c1147279fb3cd91fc5ba9eb6ce5794ac732804a858df74b1d3ccb77992eb491c9f1d698d427691355d2f35f38ced8e72a24c31b16d3123a201d058100d0beea2bb707c8e22969799b4ea1e5e359fd261930ad569e9d831e2f7bcb28ed1fde931c64faddf300757ec8cc771f0301724a45b3a64a5bcfe65ce8e94c9637767a83b4c44ce0981658cb57bb4e0e29362a13e50554ad8c8241fb622fd35e9632771269ab36644fd535829f68ccae7224927001f8a78ad8ada2d9d4d2c9becae4bd19491fb868b56825268e18e41053ad0544258454fb095d6b0c34861b52d91b6528ea36fda26f00f42f61ba5c8ad2da68da1e227c5f9f6a3a1480440d3428b115b756eb0e7c4ac61c5744d103e6477214f021c779b7875a34d6c018785a7299906f1e5c80836448f281471344edc70b8e114a89ef1c2a008425ff2177d8e1e8577dd0c058a1d98b60ffb4abd03d4881bb0a1fea2b4301dff722033bf107c8213cbfc0b6798808218110732645a01c3ee9fba8b1fc0378930ee971ec89ca8b852429d0ec8dfc61a611f8059585e46deae9e72de9f05422bcf65d1df83ab4cc67b2d2ee79204420dbe6b0fad03d57b609305a8cc82e0762742f9da2955e6855f138e679853a0a3641970a6affd806c1aa35f84dfae9ef69723d4e080fd1255e2dfd32f666020a120e2745534b90b0c221d718506c7f947d6115199dc4db9b212bf89b0158c0f642ef5d1c42e7cd319b28ff846cf6c36577726cfe8245c1e2bbb33a14734e61591ea61dfa4129d4821aba8dc71f96e3729404dc73dfd37549f956a1b3f0c75b03806334d4ad9c7f507bcd60bda3a3e3daa782acd745c54dd2968c2b927633cb745b7f34f15beffa5c4a85241ef8bd3105419c6fb051c019bcc8214679cc3fb151cc438e05b7fc0dcb499866cbe451b6a615bf013b313c1396829723ad2aafce4e63a45a646205079a642ad12743a10f4952536602948d3518acdc0fe25bf74f83e83946155d2d1af52ea382d43a30c23df17526d48bbb7d58a354383c217890c755cd8338b0ca926fdd67b143f86ab92e41581790fa6417110b506a13a6aeb43a23b5039380dea55bb4373af8b5ad7c2d05eda9391e93ceed223daf00bc5a39301dc8034383f363f03c365466d1143e9d654f78db9c01a922efa525750a14d5742385321541c4e1eb0deb7faa9fbfcba87683e8b22503e7cc143e69a7e6ced2061994fbc58b981ff5460ce1470fee96d39cdfcd2f199da4530e2846b89746a2fd3a9581adc0553c4478f012893a09778afde562d3a7eee9765d4cfaa0c211bf2a40ebc0ab02bc3d1233220a192c204740a0ca5fc57907ac8236b6d7d23535b826166f85da32d4ff85141f2ae64379df8364b8279d43b6ba54e1311d0f98c17fbd940afc3fb42914fdce049ec71dec3090ad8440d9e0c829262833a16888161fa24c5d8dfa4d57efff504ff5f850935ad42cd5291dde8fe1674e4fa2b7f4403f0df3b97066828b041c3e048046ed3649e602c62e07782e963581e85ecc71e3157dbcfd0070b8bf5bfbea32b4dab8ca61334238797390c0d582005e312844321b6ead08d5227641271230e847436b0a921eb9a1d25e7b070585bd6d9bb150f06b1b8a74a2545f89c5b4a6776d8e335ee7c29aa51c0e9d4df4f87965354f791c70abd2afb155ba89621744b9fc0508cd462d553349b6240c839afa72051a8a5637ac174aaf4dab437524825ee7addd6a9e493279c2dd276216b49f03159372b31bd596113e5284c2df74a57c6e34c6534a66d931f0e8f73910c13e9ab1bda82b6fd5b0a27434600fefc9ad01f7dafbc5acc88ad3d6a986586f919ccda4cf49718b37b43afb4514ebd39de55f17c505f52d4a93226785361de42ef1c51cb3864e8f34cbcfa28816c2a7735a4ec82be3e67829c59f3bc4494caaa7566faa829d8337f4048a4cf6506425e50383e0dc2f8ca671d6e1de6ceb0ea68700012865193cd945375040615b3f82a2ce3727b887bbec13785a74fea08203b617d1beca68e55115f11b2436d8eb0c67bf6c8d84ac2af3d15da8a7431d288f5ed648628e731392543157197bd617f601e2ee16bec52e9697ddb3b41117e027bf3ccf1426ddd4356143dcc50397ed8ea440b67a2da9e5aa048f1d8f798342e5bac18263becc7252d9fd294c28211089b32cbe75dd611d295ac00ff31828ab1cd841218886b72059515497009263a74ad66c85015ceaa9c3afd3b113b5d4fe2e8d0ebacf4e5e6417212b9fe03d098f397bea0ae0ca955523a1e43c0116a73f094760895cdc13f2e8b8746b1645dcda93cfc664968a1620f9f74c3f675fdd47699b8523fa8927b021301a5e7342e4dd17ab4df0962d21c002678c7ae0b8f238f662ce3ef886aac4c899cc37ac40567823cbd6f75d7c51b2ebc6bb26e321717370d9a346f982765c09ea2ae8b036e8bfbaeac1baba61f5caefee8549d5a40871437330cf7cfa0eaf6aac7f36c20d1926afedc77bf35dd3ea9b14edb645e77b5c8196c21d4c898e8206dbb709ed47316f2c048f1f31902ebf09d639cbd783502fa8340f59c68b7f1fc869fb7a1b84e9c78213ab70cb2b286d4933fca56196b71a5e69191c6f4f691f9eae596c56814f4006fd68d10adb6b824fedbe0275adb2484bbb61c7c7f3d810924c26d726e8e69c12e8b55cb37ce0d9af664ae30bf319528804b0d73016570009c2efc192bffab8861c09ceaebfd0ba3975b3a7d1d985dfe0a1c697f192efdc49d019c9a7e00d2e13b0831615fc5904c9d4b50b1a1debbfeeba51ef67cda3cf815e60f1aa822e9d80c48316c6bda7894738e0ce5342d6ae344a4277aff1ce931d173fa9ad471789a6d5b263c4b20d69b7df60a1c950f20c6cb5b97596bba926172fa8684b9fe11487bd4853498310830edf190046eff5f13d21ce9cbb1010a8b423da66247af5a611c9e6cfff981dce78f3d863d5d703ffdab2f8e2e0c4cd6ce29a218f424e6b01e2964e96d9ee8509adf034730139fbc298ce7add6682f3c01b526fbde5dec1cac8699c74268ded458b6f1a7e0b0058543a64ea5c3b839e45e8cc606a680f485014b54e91af61b7892a233d8e99ada3d7daab2fd8f69de71927a416fc7fc121b8f0926da0095256e9e88e261a7662e4c32837a98139655fda11b85be4d0c2d97077bdea233ff0a32ea703bef58ff4d19213dd16f2ed94cb0d2973131e0bcbb9345c0684a8b76efbab7820b88df82f0a74d983b6ed6907326aa983ff8572a235e186a190c8667eec8547dca88d8efbaba5ddeb53c5c646f9ac79a38e531c3b32f0cf12e68c927f51a14530ab35b1fc92148ca993c80117c2f5c00d2550d3b3186a753c5fc289c0d736d7f0b9c26dfa691553a7f28ac96d0f47d066f50797e8840af54a2dbc82db770c3eb838f6bfc26e0d802a5f9cd86d994fbc6bc13ada4e5d6e5389702c2f7bf8196dd4135acbfdeb66da3ea2ed8317c84ef0b8a413721f520bdd85871dc3f53a9945ae5844281635a1d9cde703df2daadf64b4fec4f55f9f1f121df9c4a4a8373b9b56c06915dc513374a4f5f8f7a60a4b07a4a6143312df8a9f6db01b401378d4116eed7a6c3df4840d98944ba865dd9840e5fd313796410d43ea3ab5934960fb1621aecf47533d01f129a828f0547b26410fa644ed0ee96cf3bff6894c6ac54fd9db466e6b73edf36f9cfbae9c09d53caa7988dde0df953dcbfea3d3dd8a5d4e2c8164188cb793de7f0a610fd76703dbf611c927081ff7477b388032b309e000e4864d87a7ea421f1807c5dc50e355526aa11b6c9ca510447dee07c6f091457dfc84c55265010784e51de826de772e419720eafac283883b7f397e440d505bdce7557c9f9be8c22c010c6ad1fb71220a800e97a10b8c5ddd50006cfc71f1fedbd0e4d48e67016878aa36a698238eed221f42ffc0979ab373940e01064f7da1529d39ee16b90aa7610a37cb7f0ae72ea3624745ec58c79a3cdd5aa3e07ceb083243aaf230222f8700d98560f299971dd3ad751071a152cbac671fafc19053af64fd140267db71858ac420bcebc8687edbf4cda4483e8fca2133a68a61fd5472117423a9583e25ac7ccaa78f6cd092127dec5fa1f78df684f62e1f11ee22f9068b9475f9a3c70e6fb86df3b8a9d3698f3b3a19cd947880df8906b7a95e9d4ffc4dcb3d4dacf40817a2597ae5e5886f2e4427c3b58b080988174f6c6cec484088b293bc3c049d15662beaf59e64108422c291ff1ee9a0e4b0dd53a22451b3b6b8606c21510a3991c270388466d9151a7fe4256567bd0edbeb68fd78acaf5909e1cbcba81c18aed49ed066c463fe728364726998f6e4b11d5455415958634acd30e3665d57cafe316672534742484d66e904a0755fbe4dd0952b597f74ce9b7f0fa19204acb91d27faf0ce5f18e1cf06bf22e3bbb77729497ec242b32afc092e452158957a2eacc89b89bc3207529ed10fb58fd8b61dde73904f33e864022725ec77d3d53742668f656c527da80edfc7ca68a86079258ad437c3d5afe483933e22d0a450159fa46f2024b65c2d1bac27f62e994fae110da6b797d42dac7d366228eca7b527e8de4b00f0b3167fe269f8b199616f77af9ba049bbec546a9289306c20c1f7637be2506b767e6a5672828a2d8883c104534e095bf19e25057e094230b5d2e3aeb68df06048a1b86c56c490b4344f8c0c431a0e212d9d8ce7324091d3e69ef590787cc342584a4b721958e9a851cc10b08ea82591b7ed89d8916ca8825ddb102b4b76ad0d256a8c49ceb366ebf3f61d7c7a3b996f6fb00180c006ceaf316fd281b60dd5253374666bd5f90cfdb375583815e7e43720b9b9bc800c32e1f244d013128194b05589d5ca755982d66b05c9f8f9aaada47884119c3375957ad92e1335cf0d26091a2c00c3e98bb823055db201baf282e060e34b3999f3fad9a46595b879a9066f00b862cd2d5408ade1f6c05679ad7b1e1cac5c088959694e6f332c6891886b474ded4d164d2ef81193176fd5317d50d6c7059726cb7177331d3ef8e146fbb6572ff20d0b1080624555fae5bf09d23c4e53781ea6a415384b85b23bf18256926951c57f48ceb8800424c5cc0469bd940cee8c9a3d2a7c1243740068839a4628f634367062df2978b74269aa61412e76f6c7488947f77a539ad7d704b3d038d2a7e02bfa19e0252028bfe99fdd8a02d2ebf2c543c7229d91b8c54e9f99a418a64f100af34ecd05b04036e71b0ff3e547a474b7bc72bc84eb066efe5d0c65923edd23e7750615dd82486588f155e40384e954dc2d9cd502ed2c42b33c7a91654e2d23223208ce205973eee08351e2aaa32c92efbf6596799ccc34c1f2114db6ac2ac91acb16b16942288146a91b21af878907592d2639ad290f52788da6e5606f09fff9a250504c09807188c175806a01259ffb49739a2570cf0bba331f0e1f4591e3d4f2f68aab8a31ca10a303d0b7b22a6ae81721e6578a16f6c5285a90cd968d2a3e73c500055579e4bcc9eb7fcc15691e4a2c4e772a4d15ef844cc5e2db054bd4501cc2842a91f4a1d44a236ae7144075c53ada910dd72d881fb98dc5a786a5b4a3b832bf4be1f692b55db2f35c9cc241fe8c3b447ec53ed2872b3d791d005c405b41b3c6a11b507929a42ecca7b74523ad3c4032424623500acdda01db51a43e7bae4f7bcc2688a5a1fb88ece3025f7ff60fa1542942ccffd5abfd815e77e94236819cff4a166fb690e21e8415ab6e897c45b1a1dd6df49a575b6ab3a4de7ac1ff3f556f7bad05caefcf6f4a11d87ca33f3b16525fb8f0f4c2471f1efe4e18e8e43eb875218abbacdb1e6b3a844b1a148adca4c8b63a5ea3443a4aceaa42e032b28d413b4764ebf851b57b2b47a1fd17d7e17cd0ded3c336f919abe051b949ea3053510d57aced423af7fe2e179419c2d3327f6b2268718a71ac9462bee206d0554731a693138214a41eff338ac12a4649890c2fb78404fd4f253442f5b030a3bca0f173c9849833b59916a26789fd013568bf67ef563ae559eba06a80e08cdad7fe578a206c216c27139971be2ca73677012c88a0a0e8c35ac0434d283eb9c2151462c528a78e86461bf54661fcbe4aa65c6d89b9265b60f975514149c9ba662d47de94782b5461fd124f33394410d7b1eb927eded32fbdc4e165ab9d554dba172bfb944a309c47b74a1404dbeb9dce3c14b0cbafdce5382467fafb56ad17237d7121c186ee9d5c1b32cfff5d3e1ce2a7fbb818affdea79b4bb62a91deaf95e790fa2264640a9c2f53b8ce4952e7546a4b08636ae6ba589f59b30c7d0772633c591c95c7bd121b904a4e5eff448838c72181dcd47b4d9e3d18661d007908972528605aa509e6139cd55e13c4589cf0d715ff3376cfa68d21d0f0f522c0bfb7010c41127b1c24d7427d020fe234d3fd0fe029328f40cf9989f47f44c66772c9f18cef17e96361ae45e8c999eb022975c6d5fd7ce96e13a7cf8473ec71e0b6806f870986a2b4edd4102c98015d5a6dbbe58eeb69356cf305b6d117291eb839862ba01a548b7e25abf040838ac2acb32843f2622b38852984e98ab7ca0d9b1218dfd4222d8774a8dad950e68d45d567da493b8d80982d30d1e16858dfa941052e055afde8d8b2f0750537973d0f596e768af87c3b9ffafeb2382049fbcc1c1968364cae1c7d1b5a93d85f09a9cf795511db3d828847704e4ce303c307fdc4855eb49abf1ce7ffedca1f9aab17731937d65644f1689907aea1257df3cfd2cb222cc452f7f8711245dc4c1ca9b9d8e37b80e6ba33bcde858c05e53021bd10b6ef7c03206cae7df28de47ae058f43166f52a2aa0f5aebc29a12972ae0e5cb3f78de44e0c167b427d0239b398cb483516bb1131815a9ac5848c569c9c1dd68a88781f0f4b24f316737e72bad412eca08beaa727537c7953898a794e97b885580dcc974b0fa8e6ced653cc8bc9e13aac20bbe51cb98017300d53d6e3d96fb443c07bad4461b12412c4c9bdbcc0398e786989ef1e37f121f5231f0f94ba962c8b600a58408fd7b6b2d1f22cbf1b0dcc0d2168ae68b84bba2a78915dbc225ab53049020dcf0e63598fedb0800cadfe1cb700264a7f7b1f941173966839174ca8d33a50ec1fea826ef77ea71647059f280442aa0098f5edbf08bdc83543399dfddaee8999fc5563a07a177d05996796f3465d1784559a53c203b78974b585e4ca411dbc570b50bc11105dc2e5dc27f853efeeba8b54750470f00fc711be4a9d86a3e5c3dbd5af91ccc132fa66422e3648506662a677085bcb18303974a603d49227b99d54f365dadc64a98ba5954d1f8e51e8192cd8863a633d9fccc0f568e517feb30dcab0e5a451bed4a37d16764ee656eff41d9b17c29fe50ff4f59bd8d95a9b8a487c9437cb1d6799d730285d3d7a68e330abbae04085ee2c4b510cf948872a6770b6b7ffbe1d4c379a7e0ac0c2bce32a53c418749d1090691c15096625d215ee2e7e6cb8977d5df0de68c16a6f14bbdb65ee093e7839a45425db2498d6878d63ce778fbf2cae52a3ba8a1c5b515b0e1cab87a67f7b1c9261a158858e86fed584077831a122e21d37d6a4b5d9618f7efa3e31c904f3566c68f01093d3dbace2d323d15aa73d781a90592089d80e642a1bc1be034cb1a318ad5968b03d6ad5778184da0a52016598c584823cfc409b7402dc310da032a739e15b5088e135e90b63a2ea3782611a4407dcd7af72cb7484e4024ac0b10db2600212eae90074dc0f9ccbf4d70ce3cc963f1a5402e6864d3c7e58b1018688fd5bb2a874f1afb21154c243d6b60b81b59ad78e37d81229079ea70201d97f32c9b87d24f1acbaa5928680a18560d57e3cd769d7a75ded83c68d82004fcc927e2eae53ece34d8143b23985cc92751996ed3e8c7cc1ebae97f434b306d40b876d573b95c0c4747eac8c509fdc6ebdd7df992fe1e0acc122f4748417ce72cce99bd43064b13baa013bcba94855ed7b3e444e2191e9c17a4abdd306a03bd623bc487963354ac114e6c00c243312e4bf200085fce537f79910a879fe653374fcdd40e278f1bb8cb55808d9146e10af0f3958f49a1fed8f8334dc10f0b2100c6f4bdd750775814b8d2312f7863102d417055ebbc4780f54106075b639c0eb547aa50c86045eaf94c19b02711029cbcd99d54409c065e8ea22f926199739be9ffc0f9b9476e77784a64e0b7212f511481062d4b87800e4c0b9ddb84d3e510ffa5284add9eeee95dd5ba62465e10ec30ef50ea82bead3d8ce0d0e234c4848d9276c15884a05ea274e4c78d535a20275fe1ee6e2f20b063baa67f85946d785cc11b218634e73978fa5bc57345926ee98df5cfc766b11314b598376d39679496c6e79efd663c369ba61ca9ef7a84baeb8b16cb11eed5f794fd3f2ac77123f131dfbf14675ccfbce0965f7a8dfacf7eedd202acddeb402e1f7fe65645aadee06cfeefa2f36c887f94ade80f97ed68a7cd22e01d572daaa9135a327acb29459e4aac41392909dbcd1f2ad179d64ad60fee561ce222ddf3a59effd8be9625aef44f22c35c76746ee4a85d62fb04e242495caa67609ed2074dcdcb4672deffd4796b316ae35be2e94e5d78edd1b25266fc0fcf898bc61c67cccdbf097dc15883f092be3f35d4f923b58dff223b9c3e531da31e70be62cf2726297f12cd272daaa8eb1be760cbfb8629141e8b8c9e4699fe89887f6fcd82a1f97604cd9bbf1bc176523366bf62bbb1fa64fb2f76d26b119fcd8cde5bdd751ca227dd3ec9d4b6c064faf4b492736a9bb03084254c2f51d9b36c856d32a45f1deec2c50d6b741a415c85a0864b74564b71bb09589fc79ca83b29ee84eaedf0fc4dd951b5be6aaad5c717d5bc91ab54fdcb1fba84d6d9ad610e54eac5f1f83153456c2fe26d71f3d137c7ce213456a214acf731f9f74ec3eb1ed993fa41d63fad3a5524189e2472507547240850a152a54a8dc1d64376da64c651a98e00659b41ac86e562164b1633085eca68c2cba0ca0dc24b29b2cb2d8c9c00ad94d1559f42c90ddb4c9e2c782ec664c16f10eb29b2bb2088ed6acb819506537636431c41537c504d9cdcf16e724df9531a4d97e52db2622074090aa3332ae17f934fade5ac47ecdf65f385e0248caf693b258def0cf1dfa5472b3b56d7199c5222dfa78ed77ff8c7bd2602a51d0c0afb0b7640d9a17c51bde4bd3f6ff9e68e8610ed8d3bcb536d64334e6615f61a2872f9e62070b691e165e1bf395c3e6efdbfc7d51c463256fd8fc9fa8cd1f53f3df79ccf9a6cd1ff91d4ab3a36ddeb66ff347887378926f69dec6a4f9b6915fc913f635db879d45681ef6a2bfcd876711fffff044fdedbf0def377c523c5dd9e6c5b2ca700ddfbe35d198b789318d20659a7732c7e73f8d8c99e6616f75d03cec614ff395cce1ca28cdc3dec21ec5590476f13b990376a245ce3f5f7cd3ff7c1445fefd5188e29ba8cdff36269a946dfa32497292af3fec7c3f43513c51f2435bad0e7af397ef7bf9f68728509bf7eff79a6d509c5190a618736dbe2661815c4ef116f635a8bda65fd71dc332930ffbf0dadcb7b1f9dab31815f7557c93393ac3ce22f653bcad394f154f63eab039458a8fd59a7fb3e6be791f96e2c3f063eec3ee9b2f8adf68491d36df87a138efef9136987fbff62ce6439abff9f04457d800fb7b866e77907fcf97f8f7d1b2143f7c89678ef0effbd3f010155fc50b80e6fb86f0fcb65086a6cddbbcfdd04491e4f07c917f5f7c91df6fffcf1779e64082447c1621cdd3686bf3b2afe40e9a0fcf2234df6791980f4da49bc313e9669af3c6bc8abfa48e141fbe933962ce8a73227936bf9e77c589e419f6fe4dda00b3c13caf893a217384a6e7b03f24735c1b50f1eda3489e61f7bc1d0b5f3cfb44fd913c5fbf357fff8668dbced0c67f4dfd0f53fc933bc29a879928920cfb36515ba3e645f3d131ff7059fd30c6e651bb82e64353fc3007f9650e6134269a94dbe687d3baaf1df39d795b1613f366cdabf8dab1f0b4398bd45c3247cdf94fc357c0da6c1bc06c5363865fc9502461b013c5d9b6cccac89386b3786b1609ffdf923a52fc7f9339c2ff1773d4ffa3a41cbe4d25c9b748b2f8a4b9a34f8b471bf3dfe669740dcdb7781b1375921f4846553ccd8974f37fed988a1aff34dac6b4b9e6cd14dfc244796415cfc244916415dfb69ef969c3094e5428b21346198b754b6c8e979c4285f9532d0c4a173c41229771e0e444aeb85c71e06482fca4895c6728ffedc73cecc9c7f74abf676363233225e101266494e064b31169a4f8fa9e95516756c67df249511453fc8f49230b658a477ff28c8e55314af7d67cd9aff99aaff9b2a78dfb7587fd247ee54a189e3f3a46c3ebed40e939ec298a2f5144ea5cdfa63be0727d20ff832fd927b52e6113d2b38a03213ce5fa446c88474baed0111609c73124a374ff913ac29b0fc3b36d410da565f55d09659f3f3ae6a560246d48e235ef9149ec956cbe35679836a169f34eeab81db3f915375c7c9b133532238b271afe129bc5ff17578433fa88371b898ed55761f653df2e509ae65773c8bfe6b53ae4d798d8ea905ecd21d16f4c61d27c256fd07c0ad8d3709889e2539835dfc49c8fe23db2c6f9bfe47f68a0305fe1db700278330892376868ce578ef3ef9fe72b8cf998f7f72d6c81e9e78a62750b947d9a14a850368d94c3bfff0f821fde3b46e96e84a1f86e76df16caf045d3e6db241a95c430bce10dff2c62ff5f0ad118a57b51246b88278cf28a57bce218f43bd87c68a2366f770072b185d2f161a3237916a91d731df7fba4e134dafcff7713c5d9c65f3a44f2c5afd9efdfb7315ff77940f3353f34270cf6e3650ae95895315d27907b81dab198ce93a850f5de9f1f18011af1f3f3e37dfdbefdf821969ff47d8fb307f8e5c9a4f5e033f9befba420b1f52595305ffe3d7b30496a999ef7ddfbf0beebbe7c1fe07f6793efc12fcf26527a7c0f7e9352fcca0ffcd72dff7b1fe57f6713982fdf078b0eadffeee3677d67beee7bbf7a79976f79987f856f59ca07dba9c7eabd0f4d1c56effd357bb06ce4927084952ed8d23408e65b5a6060cca4a096f2c12f1f74a9ff9214e4c2f2ddb37cf768dbda9614d4bd7cd8a0ee9b48e9d1f22c5f839ab49caffbdfb79ee57cddd347ebbf6f9d4c984879f1687d0e35a875faf0aa3250050f78002a4d83963aa8f54ed2eff11409b8e0073fa8d23a8520a9a41441063360425d3529086cdb0b071b0476ef1161f3a0b6b9ec671c7f42fce2515d56df659e9914847fc8a0840baa4135c806a1552ae6b2da3d95682cd7f1a9da9f3afe84378cba36a8fb8cfe0001f239fcea72611cbe78fe084d20e187bf43680201f2e3de47abd40e0d84345ff6c3db05755f177ceccc1d5a56eb77b812fda95263f8f353abe831713094de7749d5cfc75f68f6ad6d0da56361f8f6d6b3b0f6ad6d6dbb598ba5308586268d1f9386c64289fee41fa7d5472bee470a2f1f60579390c009b0142af9a33bbdefce5778e26083baaf411f780271597d295b7ba6ad6d2928ab6d5b9555b70de3044cba4ebaa4ae4b409534f78b4b6634576aacab3af38a8ccc0aaaac5fa689cce11651765fcf577f9581a3aa4effe35c4fa593101a903b9aaa2af43becca32563ae69dfbedac0ca292080112e55479bb72aa67a88c95dcb3574bee8c9656723ff63c77192b3dfb1e9ba10c93cbfa6596ccd7f7df19be0c93d364a8342e5b6c9161cafd32549a2653d5b2fed10576237ecb89e264540697fb65aa9a363315c3f91b17cc45c64a6e313465d2285badaf7c745078c29e68686868c21aa720cad58fff03fff73fc2071d6083a4bcecfb081ffc6f22a509fe0f56d533b426cdfddfe3ff1eff8faffc019ee1a725fe100634504aabff5e09fc31c478fcf099acfefba4f16c02c29ece264d56ff3d7882df9d284cca07f88fc2724dc627ff339b48e9313ef94d58bff220ca26523af2c7b7e48fe1cb9e3d56cffaeeecd161105f142d54cfc2ffbe0fbf1fad81c0f542d8cc9752270acbe5d7948c9fafa97bbea65e50f6e4d1b21244a5bda05cd6f5050501a92272bf721bc85d73436b9c728b2d1316559ab027199a233ad62ddfbd1d69a0723fd5e0b228f37e6b6e19ad79ca33274d55cb299e7f4f1aa816ac0af605a54b4c4db9c6163ee1686870344e34b7eaeeeeb0aaaafb2059a3b35fab5073cc720a5547eca7f941d3305146b9ac7fc684e160522eeb1f4d9910960ba2ac2e436154b91f36d57dfdacaf3c1b9ebd3389bd921b0c2f28f4059561514e8bc139ad3515cec09e605455258d1513f36ef28839959458ffbdd2f8ad176d8c598368aababb373c5f77e67b7c3fc3faefefd9a3357eeb938268a096b032fa01b93ffcef9948b9cfa43c5f5df8f7ec517eeb642273bebaef7dacfe3b9b48e9d17af29b7cbf7a1fe4cbbcccd9a4f5e4571813acc96932df0fbbcd3c0ab3e58639f150727dcc5bcbfa990f5f49697c992fdfd6c43885a1598364ec0b8af5c2e1fbd5fff8ced5ff689ddf67cf1ee5871f9e4c6a9c5cd6e4d36832071b34be589a9ff9b2b7ef59dfe363b1be3c99b0bef333b261bbb7615f38d8a0efc37ff9089ff5ac0fdfa11ce3b27c41e57ed0c45126b8745550d6165b64799aaa9ad46934502f5f617c80f8c1b3bacce56b100aab1a3b0c254a53e5f118df9a659ac5d104efeb5e9a2a9a276a6e354834cdc6a9bf46a967954a072e901bf67481dc3569130af2aa0341c868cd11b96b2ceca967339d1a34503d435f4db9dbbaaf92386cc905ab72dacbe56bd0cbe5ac49614fd57b961f3c6911c513c52ce7cb47d88475c91fac0fff5af3d5745f4d4e5bca0d80ea32f4c594fbd1972db70e4a1df6bbbf69f65e4d1508e7d041df5732070ba68e734e9b8172f0fbb194d3b057f90c145526df3b517069f528c8343365ce5099b5e64ce1a8d1e6795d47d6e8c6f6c81a164755a01a840a24044b833db9ac1f23a174426e17a642b619f6e4b499dbd3b79ef20c94d36018972554ee9fb9390d8631ac6ae606bbd5206cd6201853132ca8add969167b8455398df5fdb025a7b14e1a2897b5abaa85715996ac9306b6948348b326759aaaa5b2e6170f25fce0b7b2cd2ffbe327058ddf63f563f9ab1f7f3c99b09efca4a01a3c9494ca538975d6906fae4c5bee2793826e2f7bbe70583df93d56e4c9448a3d7b90cf3a6b9834e5fed5b994bb9239743128efdfa859060235a7c3f7777bde3084a78c93324b2c69ee7c50c270b0a78ed54c69dacc1495dc5ff34453e5341c1555155585a3aa7054158eaac2515538eabb874d99725a0d9596f5d7a4354be4fe9aa79f9f9d9d58ecdfe52aa77094d3eacc546e1c959ba2c25529b8949ba6ca650dc3c19e68aa501ad81389430d0aff7b1aed1628bfded794f79acafdb0a72e614f2d261b6e39e57e1a28c79886062a7f676b69a6e22c539a9be6899af4a4b946942fef6b39553a41d5338fcd7c5b283153464b2a2670e554cde9a74039955b2adbdf71ef03254a53959ba64a96764ebccea361887befbdf7de7b8b286baef94a29c7b33c5f3d98b87cf949414949412e663783d2fffbfede7befbdf7defb5d20b3e49ac40784a83a48620469100e34a26025f7d350af4b5d424a94fbccdf9cd1b1fe0b039c4c0387cde87d7bd230719834dc13070d4928d18aa3d137caf3c1e79d9e45e16f7a60ddf7c7dae796f773efe4eeaf38e78258714a28545922b7125060e2454671946c7abf95900bc2b992f699e8997f97b367f1baa02a579c0ba6724fae3817b0208bb5bb2b59f985a6a242aed98617acf4ace268e0848d2f48f5ec65e30b521d6b20f8a0a9ccb83f190cc33004abb095d0da7e62979672a008f612d84bfdc44a959ef5e81c8e5db24b3f5c585a7fc792051690e14ea08fd87168591dd74b7dcbd771559aa8f6aed0a4fc846f07a5e7fc7e49e5f7dea5ebf2de92c555d97d5c12e0633187679eb2f3d4956acec5d8491bf0831804c377b1826214f26934b64bf68965aa40e3b7dc771d544fa2ce442be3e7dd08f9fa159bb4410c1f14fde5050c3d7cf0fdc11fcd239bc777315fe0e3f75e04414f41f02b10f8f77d88eaa9a7ee01c7801391ef8b601224d9e5d19696981623c0110a53b24eae4a5471228b2dbbb1effe9951f3a5922f148e18c7da33f1513c82206be42945bb6497eee5c2056488e886b862c055918ac24b64276db417a5b4dedf9b229ee7dde4cf062b7b4939c4e30e5914c51fef5df83db3b34069dd66f456a0efef8b4fc8f7dd1dbfc7535e2a1dfba9b82c5dae7f4f5d6909dc0ea8e0eebdf7de344dd3344d53251cd8619c2bfda0acef4e9dbb0be4db3de94ee93e91efb5323613ddc4df3891ef370a4af4e270d79fe4fba843c0953ae669c72ef64cb4a7eca0bcb892eaa6f9c6ee93dc1191eff795126dfdf7df3bcea954a07a1fe3b2f41b9efafd0b60234a28f9de5efaa524f2fd9b947b29e7e779bf9770b5e2ea120a469e92246db8c9234ff9a363f7779080e8798f3b0f632c7a242edfb7dfb72a50f8d77790ef5f1ce8a0d27efc265171358a095046c8f702e18621e3aeeb441616108be2e3071f7f681ed91c7ecb7ce1ff6e15a30eef5081f0df4740a539ce654c40ab941417a2ac902f14906e1eb179a9d49c7b735065b70a1394204584a8eb837c1f75a87c8dc64f8224b33cda7afc22f6dee6cb5afdea3d7bc7f29bac5196ac56eb591d7ed15b79deb7582dfc2cbc6ab55aadd6895a0f8b1f6eadbe11e36f6190e57bf046135596a872cb5f95a6ec1a455114c547777e2a0e67a36f60bc7ff997f742b246cc8b2e63cc8b648d1818a5f7307f713d6bf90bf32f648e14d6d3e17d0b4c8bb944bee0c398465dae648e96f7ce578ece2dbfc487a4dc42def0fee5c517137cf0c598d133d18b33ea6cdce4969b2cc68c20f82d678a0cde2ba5f7fe9e08338248377fdee3c78fc91cf83d6f071ecf222c8f64dd6bb51efcc1272a247b1801d9fb09f1876793e3a3e07fffca51e6efcb2c56f0446f508f45dab8b8ec25b1b4ca31973f5cee64659055a7ffba6265dfdcef3473c22373e0ff3049eef8fe4c62b3b7043d4aca489d287a6167c3f718b7f2fd74dc64effc715a0f9fdc4be4a61521dfc7b745d878bbb4be429de40e077a8e21c47ad353e2a037b52e312357d105832959302c7736c2c044115fb4368ba6f82f0f23f31d4f49c2785ed9326b80eff23e97cb5ba625635e1ec605c3bcd822ba8c3ca5eb5f481b6e32eb5bacee2764f7d3e8249e7bec3af2bb67d2b3f13b2cf32f3051564db498743b79e78b75b24a8e592b96e796256f989ecb6f7dcbb4f9f60ce6ebcf30f9a19b519eb5e6b89c566a09202acdd61f2ad0f71d11189893f57d21f930e6cdab06c5991f0b633269a77672eabe74c265a55731a3d821f1b332712e28d70f3f90fae9a46c133d2bdf096ca59fe84e0a1dbbdbf78e666d9976bcb9c91d2c3666585a5e6c79eb12835b5fc6b8b0c81d2f2f1d33cff22c2f3fd32d53e65f58df92c12f33b64c9b61ccced5bb77b95c3230e60ccc39f3e2f2610ccb8be48eef5dce25300f7e48ee6881f972e67ce9c02d8fcf22208ce9fa161347c73ad60d5c337e6aae4afdfccc8c2fef226f380c0cccb73cd83b5c1ee65c62b39f687ff9343c86acf1e2226fbc9c45ca476a3159dec5b44b1deb5841e48e65f54c7ac6faee7fe859f99df7ddb5dbfaea5cb658bff39ab85c51248d4e6c523bb1495e977384d8b9e36ffc8dbfdb89ce02a599c4663cd5ef9da7baceadb2ac533de57ea75ebe1d944d850ab4a4ec292ba3bf7bd491c85df71da5f407bbbfe0979985abd0f516c2505f7277cf29bf4cd7adafbe77b33fb39de8291f94f7dd764f22f9e13892614786e36a458623194514a7a6b2535520d4b390f1f754cf4077c2a92a50cddde3a9aeebaadca5197ff86b107b610862ef7a4c2b27b1dea06d4359e4fbe8e702bb8f76b7b68552714caf31efb1d3bed8b5f918b46d50ac0d27dfef3e71a0dcff7850faa7e9b5377556675dee9decd5e8eeeb57af6b5b57011653ee5e7c7406fe32e6022d731e75f9d9e9d4652dda6fe77d180cc5915cb1ca164b8bcb0b4c8c4b66e605a3a9b1e1296db8c9e28f2dccce6d4609dd1499e858f73b66ed984e75999daa62a5149dc8dddba9dc895162147e900ae3eae6482231e6982c58bcec5dbc7843d67071c22859b860c1e2c514e38ea993433acd7c5b28753ee7fb45994eebe8348dbeeeee283ec5bbbb3bd0bbbbbbcdc7787777ff797777a7bdbbfbf754cf8cc4d9bb4b35959e19f9fcbbbbbb51bfbbbbeb899e19f1bcbbbbbbbbbbbb1bbd6879376abdbbbbbbbb11c932fadedddddd5decbc3bce27b1575690355c06190e80192b525818d98cc5b7c8e514666700c83043c60a3f4d207f312b0ab7b1f918362e2962989d81ccce200ad0046d34fe3fde42536d521999a7c9b0d0ccce3f66671b17672db1668cc3e1703eaff2653696c122765bf7b0709af2c4ac62ccce3db95c0e0619e38ae1c1e170b8172d63e7effb6c2db155f397a6242b6c11fcb287c3e1702e76f08ed9a2b70dc7fb70cc9a5de43491bb6fd1bda862cc3159bc0bd9b7303d5f5bd31adf708c664f7ba2698dc35d25dc7d82bb40c631321fc5e3bc4b35adb14fe1bc33d133a39ef7799c77249ae6a9cbbac7534a1c239ab7799c77a6a6396e2a6d19e7fd49cf8c64fee544d31c87b3827b02e74a533aff02d534cf45e5a472392a31cf03a569374d8f489148a7649c6f1bce77dab46bb3f592ad996cddf4c48b87d144d32e0e5705e704ce8a54eb5b1ee7ed53d32ec695381d36a2849271de2281f396c9b584f3489ad6b9aae07c0d4deb7046701e47f993db71c1328e97e2a063c6f958d3badc4dcf761ee76fd3bcd465dde3b8f8168ff331b2064ee3ba077a1437ae3be734106cb0c1f6d46920e8a083ee36a781b84c6db97bc7390de7728ecb392ee7b8dcbde79c867138cfe13c87eb30bef8e27b6d4ec3b84cbbefbbdffdeecd39edfbee77bf9bcbdd67b3a5b6d496da9cf6a5b84c6d38a779b91c2e87cb75398cbb5c4e9de6d9dae52a4bcf96e6ffa7d99f596f456cc5d3682c03e88cf173a6c03951982a7229be7bb04ad354a0e84c336b9ee166381387f341f13d2852a0b879144fa3c119688238361b9ca7c1b9314f9bce3e66cd3d6667307d3005d3d7eb655e286cde26d793a3c9e1e45e744e9a1a9aac63767e9935cbe05e7038381d1c4f8cf982bd9e4663db0bb6e1609b0eb679bfcc8c0c4f679ce214a73885f1c226c61593cbe5722dad9a1798ce30cc9a5fe070389c87695a5cbee569f4a7f3f9d71f8b84b5585a35936663b3f3977ee9977ee937be58e5b3723a39cf750e1467c8d57f9d3d1ceed112b79323337a36a78138278ab1ce8996650b33899334bb38412a900aa42a5da40d9b49a78e75fff5a0bc4f8bf25ac5281addc2acd985d979c7ac39c7ec2cae1875cc7e1726c9c2cc21a79452b9fbee71c2175974b7885246095f3676b77fcbbc412bebbe45f7b2ee6350ddab306bcb52747fd33d8aee4f28b97bb3b3316bec93a5ee674c2b54d56360ccdab217178c62564ff7e48fddb74b0c4dd0b41628fddbe87ea7d1cd28e994c5a8dc3d0a52e5ee71464b365881fc24575073baef48a79ad3bd7f3f4a3ae58ec5646dec045420d61b1b6eb2cc8b7664799613c5c995e56b5ead3e49f82893cc127bf9fae28b1963315f48f285f572b2566612f1c3f36f256aa7e47ef0e593d8cc6239977826b2fa5a7150963349f828eb572fac5f3dcb8f2ccf3a6fb6537a56bfdde55f9e46db80fd0bdb3ccdd7bccd8b343f72cbff0e3426da659a3f6bc7685eb43163bec6747d256bccc87c8d09f33426ca23b7c05a92b4acfe65561f64b44ee9b8c932a75d8ae98731514b04bac4339196242d2d2d2d2de7118be557dffa17d3e5e5c99767f9f09bf52c2679f3f82ee6cd2c2ce751ab3c97c864f15967ad3174fc5592f09388671408dc1f02b45043b85cd643c45c565fa0d605b97f081b64712e6b244650a21667713fa470401171590f21f583cbda4659a821b0cb2c2e2ad72559173720d61bb44bb3d744cca3898f561c2b06f3f0336f16abad4f20b9775d083eab7b0cfe1782f85998f5cdfacfe5312eca8819d8c5482cd4c578e6a6337ae512f3d283d3515efbcd6f2c973196d18e8a3a51d757e2eeeeeeeeeeeeeeaed132afd2693f7e38cd3a41b59cf784eaa05650a3e9225bd09b5a27f4a62f4e519dcde6e1dcc032ea37242e3f19f59bf731f7a6487038ed2ab5ccfb908aea3ef93ef0a6e389de2930277a71acd3a57f85ad8bdcc1faf00341100441100441100441b006d858a4f9ae9428f9fdfd606d93eca5d27b99b750326747b9ecf52896697179953250380fbd072dd4121d6544f6de6b227b4c2091bd7b44f6a2ea0755fef03ccf1a9fa79f20e3c74dbbe90d2fb9fd224b69d67c95eed3942be537ea42dd19a03706b82c5daeff58dfd48f00cf25a9f77eb3a5c374777777777777778d962177b0becf25e639de9e75df8c63e724f64a3eb219a3ae66a27dbc576d80f73708962fffda7c4cc7c7b86ffc08bf75cc7b30bc4969f79b9b36bfd99bba75f246cf8ae755bc772554effd88a659a89679ef3913b297bdaf40e5a3de448c895f227b9e4f692847227b6fa1d07e3c43e6b001a362e4299bb56261ac2234570f7a066fea85dd4cacf6ac85b5fabe7a41b3e5710beb5b6834c62cc68a73e992860f860e8220085a148360f8227780f834afb862e4296db8c9f6099e726c35132b4696c9229aad1697fdfe5d640e7c2e39af6c1ccdaf6bc1a0871fb2c24fc2cae17f365fdcbdb5ccc365e97a8c5ea716f0f1a3e0777eab354786cc019e68e83a97d8cc3ad17ef0a61df37e1573ff961294de1701f179b1054a17ecfdf59eb277a764efe22e95d58962dc9d6859b69c01660b2734a9d6bcb55f4958cd8cfd996bc26ecdcfc06ecdd9e2d6b1fa30f367cc9afa3535386e0dd1637299d7c0662ec63d29d1f16bad51a3edf1ff5219fdde3b765dd7799ee77ddff77ddf8831c618633c82cf127e8bf82ee3bf900fb3fa18fcad0759ef7a11c4788526e5fffe3f3154f9e5635cc7989c56cf9af3849d68e9729d77648a8a82b2170a2d634cd4a6f689cac544fbd6391614a3d8443deac952f5adc9f2e898efec380de332fbd3f8343e8d2db34e2fb208b1dea0a22dfb8be3777f4fd9ad06abe6f8e73e27a795efa129bb752c0c1fa9b388268dcf1ac7eecbf14491c6f1143ffcd10c5f346550acce98c92ab3756c1ca964ff0fd79f93cfe45eaf71fc703c511b86a1f81d2b2a7bcd52953c1b8992443d2a8762f81dfe9a944553062587de59cdeb627b2f10c531f7b78fd7decef3f7aedfceb6b8f518c47a838651dfd2574f507ebf889d29b485b7d0e90907f5f4f4f4f4f4f4e450699aa6699a3a94433994433994433da50e653fa929aaaa300d9742a6dbed76bbdd6ee9d3d3d3d3d3d3539aa6699a4a3da5ed814e4f38a828a9dbed76bbdd6e4f97eae9e9e9e9e9a96db727efa6aac0145c0299c0a6a6a6a6a6a6a6a64b75bbdd6eb7dbed525daa4b75a92ed5a59aba5daa7b71505152b9a6a6a6a6a6a6a65b97bbdd6eb7dbade9b6e4340ffaf052c9e46a7a5becd6e59a9a9a9a9a9a9aba5c97eb72554d5dee5bdaa98a51fd942b574ae1a6a6a6a6a6a666729a6783beeffba2be252f0ae7457d4b61940e0644b18eb8b1f7ea31fe102b6f88d17bf1f4a4dce40d6bfdf6c5de951d79e35ef06d4eca5e103cf24697c1d01bc1ef6f80ff85a037e1bdf7ce44c7fc8697c117715da149197ce5f81efc4e8faa39de83a7f78ecfafbff320647f2737e9eb2b65edb9d4220513a0a2a24a334fae4a6061091994f0baafa03ad1ef6f8b7fdddd8847ad56a03beadfe9a277034d2a129edff5d2656fce96575eadeec98ef03cd92d7b2e1dabd57e66bf587e2df2fb4491fcdb8247a1465c7cb265aea05abde851192d4f231ec562ad4e2cfa6822ddfc81b212c84ae0ea3e5b783b1488b67aee6cade7ee7677f77297efbdf77ed9cb5dd7755df7aa3507e74fca6b5b3775ad9357658fb4d923593570cda92f628b57160362bdf1d98f4e4e0b190fce3c4038039519e8abd36678009c375f9db6e255c4ded670e405f0d5fb717cc56100dfa90dcdebdb06d1f001a8f1d6ba605c6ebcc5f986af379499003813e02b01847cf521588737c0d7966fb1c87fa78d6f43ecb403bc45c0ef9000215b673f746cc6801aebaf7dc5b82c5d4827eaca6dd33f932039dd8689fa8f9c283672a2656ea622278adbd643a713ee8682fa683160ecb8c0f9b6d259888aaa995166c8f594111b88ad48f1289672341c4a8d85a0c6fa1d8ac9fdc949caab6a66941c1ee53bf025cc982ba3cfe45ec5946b66941c1e87d37adc98f99718cf825bb1d5cc283a3c11a779aef2701a8b1177034e2dbf622a9d6a6694033c10a75decb25b63b5a196fe32b9ac5d2eab95a96646e9e17138cd3241a0c6ec931a73daf83130cafd9a19e6ce39ade7dbe79bf61de3657cbf2f396dc6f73b93d364f87e6f72da0cdf34bedf6f4e0bfa7e77721a0ddfef4f4eb3f17de3fb1dca69395c6a87d3787c0edfef5537bd4b4e2bc06d729a0e0778047c7fe9341e5ec869f7bb87efb74c4e0bf2fdb6e983f460629755a91ab5c3017430abcb0c70fe2880f93eccea32029c68cd65fb3d9eb2e571b3361d02b0384ed44ee59c6ed9ce60ca304386595d0674a28dcbf6e744bdc999963c759cdbfcc6c2ac2e939d2b54a438d1a63a4fb3c684bdaccc190363ffc56cb1cf529aabf3da5a9c787b370ee7128e9d29e4fea6a7b3e4b862dd7bef5d9525f63c7723636e9951c017ad19ebd8c77a76b317bb797f893f7eac6736d6b3fb1d8bbd7765cc7eecbce958afcad25fb8059e2ffc35e84d97cb8a466bead2785c5bbf651edfffd2b02c2e74dbf6710850954aeebf386aa84d8c2014f7d8ceb777b341016d7e8250c09b3d417b82a00dbc8150c01b680b975c16839265890502214b5aa1401b680b97405b066d2c5f155a513d43b1546e41b5a09c727f6b891613656661caafea8f2bed55eb77dd7b2713f0bb6782fd94c2b9b616e7b0146ea26317e77a76cf13e7b054c71ac5528e733a286d131dc35235a7595297b12ce5d735a9723f6e55e5feaffb1e5fd73d3e99b472ada8d694540bcacf16aee6d60d6a4e7b67eb096d41e5201742694f14a4cafddf164aa98c622910e73228a57da98ca55898bc7109c48a53f29882c23185a6dc5f031123f509262ace52e5170e36c8fb9a459ed29deefb89a36339b47ef7f5af8d8af2e7d133b7381c35f4ec7eb5f6b45320a856aaab2d0e87eba90cf5fb174a28222d85291c8e4acf2cd56d2c869f1f1c4fe47e17af39377fee78c5eae70f8d9f19287e1ade65a49b31363d7346c7da7fec999f34bef3a7bacafe9911e306387b3f3b3b3db7ecce22f7cdb374fb8396a5cb8cdc677115a69ae8debe67c6be7dd032772ef66f50fe7d77bf77f4c8abd49d52ec5bd2edfb79673e2e94f66bbe36873d4717f4ab6d979eddbfb1c11424d04a85844aee478a62a24a7d820929266c131deb7befbdf7de7b3bd6f76bbd2e246de2224a1b85a35050d68c362e4abc6917f2ba0cf1519baf832fb2ba4caefefef8a2b71a57abf3de2cb663cfc795994b3097dfcaf46f3d6bc53a61942c9bc7d60a97a559f3caac31b2d698a8a4ca20b95df54eb446c5d6bcc9547a169e4437197f83e0f7f6f3a4b2dfe41a67a33a26d596898e35ce4e1199d9a8cecb1e2cf50c4591a248a76eb91f85d2d31410c513293e63b24bdc9d9ad326f804e242c063c127f0e9e6ac7dea188803a73cd913b4b7a350de27281483b88e3dd98c824f685206a774aceed49c294db3416dff7ae0d8e2c929f7d729b9df712da8e40ea2455305aa4e3e20ded9d9d92177ca5cf69315d9620355a7bf4507ac7b8ba6161ba832c018b4e840050267e09de09318151515151515258620a64291e210450aa248d37a51a428965030a13002c56d75a248dddabe3b15a8be5e3c5e3687a4a0ee934ea31edd8f2713f2bbcfa1068d9fd499dfe288164f5f837c8ce4dba0530ad14b87cdde53a569ae41ac47f19412059fc250a2e093cf94d358dfef43e593735af93d4b713e55e053cbb37c2bdbccfab2f5dd2bb9fcc862b1fe3eab3c99b89ce0f84c5a67555290389aafdb99af7befd9637cd6c9643c5ff5599f14c4a4baecd6f17b743f7efdf16422a59e3d46f0c713c475f56fd4cc13839ad3df725697b19c2fef51f029fb38f938f938f938f938f938f9e49c7277b1164dadb37c529eae0be43edf88f17c82921b9c3ae23659a36db91f8a111debbf008a26144c1df3d2dccf43a5fc9ea7f434f7cf9472fb18f1b18294ef68ed5fd3c8e83e54156849f9a2cab8dfbf53816c9e41cde90763507532f8f444e97d7df2e4717259e579ba264b9a7d724ef3495dd68f7159bade27e793e67e9f9c4f8aebb738227769ebd368bff78a8e317e8c1d246b60ff8a2f0631c60f625c965433542e5b8537483cf1cd98ac512ba9a3e785830d029fc2aaf2e7dce9d80c55eed72d755a0fc665e972fd4745e57ef9e8c6da4488eec967429e2f1fe3934f9e4dc81fbf0631e99e3c6d38d4a0ee7c4979c5324ec71a7c4a518428401429f8043eb97a6c3db61e5b8f8d0adf52748554543c980757f2b468e2b152c0e57ef009c481504cf42c5781ac4b46c1a7cfdec2e6b4a4a0fece4c0a6a716b8144cfecd90287b6687a7d27fae27142a144d5a2a9e6f4834f2d9a5096a78ef51410d7a269666a29f7b7a43351750ab4017efaa89468284505c4d99ff1475b34a148c1a70a74bf52391632daa229f71b59cbd2e4c4d2d40204b9bfb6a4288a34f7a32c4da2db3a4375cea0487b86ce50a1507a9a31e58aa2dd8b0185a59eb94f29fdcca84bf893f059dea7df874714ca7abb7dfb9ef5effbe9a2ade26892b553b59a4b56e7bed7f3d268375ff72b8f6a5550f563f37d6b8a6f4debb59ebed4b1faa8d9b7b689df4ec4ad9e7deb5877dbfc89ad6fe28b6e713ea83358bedf1b42893a55f780d253f29b7cef1b788029d71b7820cd67ae3730a289fc5381eef7c710ef0d9b7f3c2994a8c5899e104ad4e27eb03e6c1fb07c7fdf9cd62275687df82ce5e9837532b154700a627d68835ae60b972eeb9fea9e5659ff942b9993367c36ee8befe48dfe814a76b2a4c7a0f2f51f7039fcc094ef579386df9589d628a36b7e261acb54da2e6165d81c7e78b6f58450d6191d6b6badb5d65a6bdb16eb58ffcf0c8b44ff647b04cea99ce64a3dbaf582d0369c2b75ac3d4f993c6da5180ce7c789f5666e622d40597130252a572572c5c19407e4b0c5941b7471afd65a6b4fb0565214dffdc12a1deb9edd5b1fbd1f9ed6666f273875df42f98094b575ec86dfffd60e9a65134228d18ac31fd854555555654f23584afc4cf3fbbcf3e5822a88890baa20ecb2289417cc7577054e4e4b2bb0e5aa840aa6724eae4aa8e0298339b00955c79771c794508193ab67df09e66e544c53b973489c86a350dba4e4800ff2de013b411d544f5759335a3ad528300756b13c51b03c60aeca9d7951282b0e667025a315e7b4ce060594ba3badcddea86c362b50c01c5805b4227a42283b86ab6c4e03ab804ed8c09c178412c555553c9e00732da66ed501b1e2944bdf44e97283bfdeb8dc5dec52fbd8b4ad15ddb44b9f695307e2a7f72d9d7649c9a676c9f3cece9ea82b759a0d722a7150ba05ca6e7b6f11e57dfb192d73f736fdde6d6acb32bbba2e2d93d7621362c529c3278ca9e4fef18592f7e153fbf47766886b9f7ef10bc151cde937aa39fd496a8ebd2f2897d49c7e2535a71fa9e6f4e37a96916a0e2e7cead99410e7e7cb9e366c46926dfe6e507ee257a9829ca944bb2a4fe5ba2f7c82725a97c3c183ba53b4b9accbf029f76329db44f8e435212a49b9fe76e6db82b556b422b6a8fdfb6275515ab76867fc28feb26b6b4373940212a5fff77d66e95fe43bcb111b19ed5fdb5495f0409a6d06ca975cf60c97b7f42410041e5821a3f72c2b06cdee7dacf1e1ef4c7be50261c7fd6fc4e5fd3e73bcdfbd3ce5cd41da848b0a07ba20124115b62004abb1052a58f194a50f4a9b7d24229771cf6c38c189d1fece6d41b139233aeac64ed9bff6622f772d114b95da9c9db24ed82a75aaea0726466caea33afb75a07199aa675d95908252eeb74a3667ab582bf6490d1920d13e357f1c28d176ea991c8ecaa30d85fbc07beff716d78ee14f9b8a911b7b6f1a7785d08d331baa97682adf034a14e350d7cba6fd8d731cae0ab5253b80401a0a2284442800b556afb5be3f4c047ed839327231844488872347420a201a12221244c8480889ce8b173318b31731747e6a30846a3d351f213418437e78767a72908a84081531528484a6d69a805ac2e0d45a57424842421e490912a2a1203521450140c00e3807d8e15d18315253c01f093d0e516dc9900fef03d110d291d1d0901f52f4ef42c89010174544401831a264c807f9a39a901f52f45fbecca855480da96604c991a200dcd4f22507b5561fb57c291a82185a3d0c40480d09891223a31a12510e22419084825e7a5e6e5c6aadf5e5d65aab8b955a8f6a3ef8a0e4e89188f83074e46b4880403a127aa35a0f4794107d912045467af81a11241c04ecc0c30176f81a1124a2da11253e18097d8d08520da9e8867721a4465443824488c81f0911f9a35740ed867701a2d66a805aba7c2b4713b512150d1d1dd506a080da0d2ea50baeb5d6b2e5895a6bc5516bbd516bb571e5ca952bb5d66a4f506b05524b161c52909a915151909a91d01f2111f161a8a680af1d1942225262f443865e480d29480dc90fb53f1afaaf11e9f13280f06054c40390278234a4801752237234443434e4838e8c5c1c210d1d193272a486740444adb546add5c240322a2272f4454548448e84883c50edc8a8b6a466f442868c082d21ca7164e482c89110111d1da1213cb31aed47e7050ca11d1a4f901e213c3c3d3f3b355a4e0d49c808e9a80725473a47484a8a8a04a91109a28334e4834e910f4642415ce814111a4252844448a776a488880e91232122404048464548902839e2a17644c868084b04da562817426a484843478e140549c2459120423dbc909a112345465febe18984823c921011a4204247444246484f544352f44537d45a736a0da2b64e10556b7581543b1a421a322244645443faa1f646888a8c869610d54022aa1df5906b428a82d46818525464c4a3d64a430d24478c70fc50134294c3488d88488848008e8e6a463e10e54072c408476d014303a829a929c1814810242124474334002164a4968310a11a8e20496c487284865a6b007c181a42541480a3211b908a8a7218e2094f295843d4b00193898481010f2081448e165c1970fd800826a0c189107a4440862578b5d6a03c030f443e0c1911e2a1b680a1232425454008d5506b0500d110d2514dc81309822474a45624e465b15a2d889192a2a316b52c65ca5b6b6ac529300e2baad67a001b85182f1e006f64a424080b0484329c30166bf24d6aad32d45a67d45a658438b5c6a8b5fed45a6fad304206fce33c03fec8c885119120476a4774aa0e2cd791918b23a39a1023434a7ad0413a32a4561eb3d60a6335556bfdff7f9c152b80a6b48e68a2062b1ad447127a21b52241868884902029b1c1a8c8c8a886028a8c8c8a821e080890070a7180007920a4213523ff21101912111f868cfe9186d48cc4803c90909a9121a1214742b556afe5aac858cb150f2b1b6aad32b55cf5d42a830c47430fe47d201a22aa1151c0cb5e86191f9361c6130df950ebe1c8c885109290101e6a2d40a54a81d4efc8576ffd6ad7b25f65d90ec6ae2c867169d52f706bbec6b8bb6e6ded6a71b833d8fac9e86a576bad370e6b3fdbd6bab780b66dbf86c9c15acf7eb52de9c2dbf362e1dbdb7d99ecb5b643cb85b660edec6daf598bb6b58d09d0afb6edddb655686bbdb638d8186bbd71129d7f2b0b63ed0b766bb35e5bdbce83ed1b823d3d5a0060dbdd788deefbc27f5833eb246ea0ebad4d027b3d76bbb65e3b0c5827d8dab52ccb6aabbdb6ed152c6e16d676d7edd6f2581d8bedd8dded05c0aee8be6d77dc85288355589265a63560bb96b1d7baadcda33fb4b7f690571f8825c2ab9984ad9d0552a2dd7af67e96b4ded48d81dcfeb8edbedf2318b39db5dfce9da1b5633bf4705b6bed672d90ed4e827b16eceb4becd90af01c0b8a6df1679b46d7348dd378f56a59d6ebb6e42dfdb64c775bcfde2116bcb162d7b6b32b9ab5d6da570bc013c1b63de0f16b8b83c5d6e2b0341da3612df6d79d75dbb6c5feaef5ce6358b7310bdad15a2bc3d674e89fc5d7b6b540d67a30ed626fdb4eb4de35d6bdfbf6b531baed4c8716b4f8b6b516c8d274f8b9bdf85a6b696f590af0169d750bdaebb22008241ee05563515cdbedf557b3e5cb8e88c3dab66dadcda95f45526bad00a8b5e6506b8dd51aab25c944001b582a02b8a8dfa30953513d42e004270620d4841d1c9a90ab3c4c24d41d4d08426d8739c5033784a068c70d422895004250b3051b42b09d18a64be7a7092b14d084c89b5908423b13b262f0c95df9808f6d0c352717861a9cdcad718094a0a8856d87458bc7c1424deec71a5b0c4bb5b520a002e98aa87f1b50abd72a84a88624f447657886633d32725133d2831012d19011129d9a90a22043444a3ca530450f52d9473af87d32e0d7b9bf8c3d82b8e1c4312fc43f7774193f038c484e3a89a51ac081d45bf5075e1c92e6270569e863147271564174cfab23c0b5de0c1ca432d44043ab017dc35b83cc08691dc276404882e83be33944485bf018e285153484df08e201a90c5880d18503a98d18227c147621056281f2039dec8a5c083c0902df96bfb009c20b220059144109576960d56247a3f5c5b83a6a077012a2a58b8536421540fab2f86208118310dc10220814d0519a12012aa9a86448071a40c2605918a432b320c22f8617e295d372dc709ad0c617440c9a01601caf1a364210c7380021337069797166e117a385f442b1c6998012a421c651d38304d2cecbce7a38786127c36391671095802b300e2ffc64560160d5dc1bc01817980f163876430e2a8208b18b8f87e4a1e5e0f18df79be9807c068e77c5d3f8c02fbc3a9d8efb43c3762f373b981d1007f1184d290e61405a104ca9157b70ecdedc1bef04298bd5a5a16bd1d5803717c67ae13442a42e74ac0ff19ceb1d03ce0458a088680920549082289c930a4e002502494d7e382a32a41604480276d0e1870f020c80470d02c001f4c313539102c55f2572300300529c33329fcd074b4429010e356600a27919458fca141948b94581328210d83c4080d88a0e70a0071db070051e8a2a4081a1210090117eb7229868e011a44c70038a318b711143fcc15e3078c10e35213b6e10400e1b353e3001083c8025e7430315a4e0044905f0419bb95c6e10a2b6e0030032ccc0cf03c1073e40811d370040c68ad186a1c1d05fe8aa4bf557e8a96e4297b3486823741140228c4c74107a4a1771d4de609a0e46ca744cbf5897564bc7d22d5bde558b5dd820c67dad5bebd51992e52faf417a89486f0d1e8bd80fe591205a2448bb6efc542021881b821737668482022f02e9ad01840961ae06a4a001ae0e5e23227923b6817fbcd07f58f420c54fa9cb0e4180342742c9c92b8c4c48bb2b6937ce14211d91725a9082ae557f323a9dee024b2fa28c0684b84f529659bee7b474b0ab754588ae05fef96638cb676024cfb935cc607aa17744eaa2377371c4176eef7871421b5d8bcf00de8c177ae8e832ba8031e2cb6700178310de8c3b09d141a529d07be479484173814696d7bad6733c009707f9f2f55780afecbcafe540ddcbca7aa2777774f7f6cfb18321ecfa47808f85c5236c7dde67fdbb3d57e75a2ce3b9548cf9a0205d1d1144cbbb2f4c83109709429c3c7cbd3206291c412a08513b8052e2c300ae8ca108a61a4133c8402b22c2c2157456942cfc1d40871d375cf9c10d703614d869d2000d0e30c10840d0810d60a082283a2e54f0a093012548143832e24216a89a200213397041929304eca0c38f1d37dcb0615313030386293350410a9c34e18106564464c35a316109498e90e9953178a10b3b1c2006a665041d2871031bc0e0052ba0c00420c043020c50801d37e400c20f94f0010d9a7024010940f8810e7260831a94008a0486684016a88c40041bd4600a0b94d29a901c355a241514aa3061073998810c9030411144d4841420470d598b04c20f76e0810e14a15413920001e4b0514306d08abc150a5580f0031e2831031920b102135460024a0810400e196400d17a5ec8585ab75e81429525f060074ae46006325881092a50c404885072820b7840c00e33e8b878220c35e860ad944003637a22811f05d81101111200e2072935acb5a6a82558840a5ef1315c31746168306014dc13b4093a8a85d12f7cc7ba10731ac75bf8c3d8589a867d332ed3ae2ec6c2802d2c2c5e5e16b92a4997514684852d1063ef73cfeb3ab7f5c8c8c5112544464248479746adb55aebab9637875a5db8a8b5762d2f0c08901f52f4b23faa2101d143ecbf2664e88868e88f861e69e86500612464244424c80b3d5211d11f0d3d12103d78b5bc64ad15d7f276b55615b57426903c2849256aadab5a924fb7854442ad55aca5335111e0c2858b033c11241f886a467e48d1d7820c19397aa3a22142886a5ff38148c8a8d67ad6d26ba8b596b5f419b5c688f11383166316c327464f0c9e183062bc88b11323c6cfcf0fed67f6e3f3d3f3c3f303e3e7c5cfce4f0cda0f8d469bd17c683d341e1a0cda0bda0e2dc6ec67469bcd663eb39e19cf0cc6ecc56c6716c3e7c787e633f3f1f1e9f1e1f181e1f3c267c72746cf4f0fad67d6e3d3d3d3c3d303a3e745cf4e4f0c9e1f1e1acf8cc787a78787870706cf0b9e1d9e18307e60d060cc60f8c0e881c10303068c17307660c478f1f382f662f6c2e745cf0b9e17305ebc78b1f322c6cecf0e6d67b6e3b3d3b3c3b30363e7c5cecece1f0d2129e9e1ff68a84604e9818e84102929eae187143d9292a2ffa12684d63c6aad5fcbdea9484346901c3d10242120df005e6a69ab6a3522b4a4e848cd6808a6967645ad95a596768a0c3fd484100d19d58e88866aad64ad5d0c2b962c06d45a636a6999d45a5d6a6989d45aff6828f64435233fe36b3dbc10234a8a881cbd2c486dc991910b21454774908e0ca9191505d1e9e1c72748909e21307a7a84d466418208c1780143c8109f183b427e82f004a1f9fcf808f10cf9a9bd08a21304e9488991ce91910ba423436adfa8b5ba6a596fb5da5a6b352a3232aa3d91d00ba911192941aa193d51d11092101251ed48cd089223438f34246484f43e100d2121091d312a1af242b5569f5a6b4fad95e7d65a61d45a5b6ab546b5561db5acb8232317416a4b78508090914e10a3239d2045468c08e900612464d4c390915a6b576befd45a61b5aca5e78528b1e2d23457f7be50258a45babf4fd6e8ce7b92350420d617c55a8170ecd3f05aebcf44ecb4f099282d7d50c7c449bfbf13fbf79d808fbf3261e2043c973ec83af11e9f4b1fe4ff9d4ebcb33bfdeb3bf12c91ab0c6ad301d601a6d29203b0d3faabd84bbd749596ee2925c90c0e909264865cc4bf26a9b8ec4eac2d8035ab15cafb7ed3cd08bffe683a78c71ead92f8a1298ae2637134bb5f7c6b36c16f1b8f6612361d3083d2920df277c00c41f7fef83dfc43d3068d4d9cf47b67da6fdf86e6383e187e47e25083f08ba692f8e35bb309f8169f4da4f400df7e93f0dbac41a0598eafef67c845fca300d15f71f98ede99fa8fa352f8a6d2f8763cd353a989137ff04c5d69e983c6775287d27f349b38f10fcfd49bc4c17bf837682ed920f0b1b96483f087a692036608027fc906852f9a2f1cee8faf83bff89ea934801a34da6f027e3709dfd6a0d07480141bf4519549ea95fc9d45a200d11f0588fbd72379f47be40b87fbfd3dfced933cfc9d74d75b814b9abbb2a49a72b6a9cca2cafd4be505fafb47c2750494dcd8882c66bc84315a2edd252a8b89dc2ca9dcaca89ad3a352c77a695ccafd63dae236b6707a804b36ba191dd327c6b48593637cfa7f668b23dc773c913bcdb7c7f48927954ba2fbbb7f502851fc80a5a5f249c9d4337ffc800a54b395afea7be2a38a82d753fea74b1a4ec129775fbd17dd9f72d77d4c4eddfb934fe999f8ddd3aaeb449761fc4dbe70603df93e584f9e4da4f4f027bfc97d1fe4afce26fee4888e6623518a4c9cd032e30f43f02b69bd0fcda46c4d231e65a22b72d97b1afe799f13ee5b84586f6ebde5dfb29ca964a990a8b4ec74b6414d328548464000000040009314002030140e8805a3e168288d635dd70114000b8ab64a72541b874116a428831c3108110000000020000000a16900c77a49fb970da91d38caaba5af8d8f7a6d2d8cd9db297fbe6b22bd2bf3c93debee6c0512e6007b3553d523d85449c3ef11dccf23a1d1e1e561f2d1bfd54eaa4ecd68865fb6e6282f9633c5bb2d3bff9f305d181de39a97f602cb184b51300fc5a77843c6f92dfb83a8c82cd9e6ff795d7fa712f06f56e1d68242eca3dafaa4fc3e7eee66197cf2bf0f48fae72f4558db49b99b7bcc542e1e0cfd773ab41f50f3bf03c4e18f23bce802f5e0f23741e42eee15550cc58913e9bb41925f611876a267dcbffeb2142e657fd5f5fbc2bff44fd21cf29bfe3170ecff68ec3f15a09779c8bed68f5263fb249047d473b5f7f368ca43fc5b7e73942f5004d60eed062ac3afd34024deca84d2435829f1c3f3e34e02bf5ed9f830c30e26577b174cdebf2dac1b4d72dc23a7d6f95c67e51f10902e27abdeba7012810367bb05d4535303cdc1c12e77f2b0bab422f285f33ff1bca43b0e3eda18fd1369f8cf7c1d86ca9e21f10e9eb30c1ed0d579a828354fb453129ba05ee5b0ef0d0f8382c1fbaa1d74ecf83f2a32f50b35e607e4fd2f80ec874525e8131437d263f4f06b8dd3e2df17fe7e9abc9ea305e1505b0ac155bdb63a579313c77aea052a511e3404fb451cc63b7f9e04dba81c0f12580331df09d3fae30adb55d65ba5fac1c4170ec0ded08285eb32fbb472fe608fd65c93d86a0f953aff04ae6a006be138880da661e6a419be843afe0f11bae0f2658c6d76a41fd62a5678bf7e0c13e437aae66460bc389b6536cc4e093c13ff35dd7ac7e091f27d7ffbaf163cd089d136d9522addacff46f13b9bf4f8f887cfed47ff3560eae710746ca8948de94ed7267947d2232f4cd9361fc08de56b477c13262d0199fb091c6eabc7ef12b3289720b641d00b7dbd6dee18aecaeb9ea5c6e3ef406a6afb0e96ac6260397cbe0e080a1582d319e663ad76b6e966a097ce94fe3e8753e32263bac4e1b587fc76eefe5dbc817fa627ba65a83b9bd361c6b6972e0347bbaddc0216450f8cd6c76fb2c80de65d86b29667a2fb9a9ba1a55c4bcc90838ca856520f3e562ac9802cd41d3e20e69769628d4563d0dc3ec2c86ca7851a3c83c3bbd345bc78421a1aa4a9ca48618ccdf5a485b430719d739e9fc8b5163428e5337d40ca6d57f396f314d4713a74a33e55103daafdadd78705370174750d633cc9a105fe2198a19fcd1aa1c488f82d8ecf1e6a8a57abf2cb03530048f1f3ac9ba860c7bffdcb108560bdd4dac00d62fd3ff2c7b174af78c5ce5f6fbfa1d2ed7eb2c09b3a7ad642449eb769e4c94accc8c49a5965a6a428dd2a08e48a54f0c20c35ca2dbf43c5fe40560a77b53b94e38b8951fa2c85a71c1d731388adfda324fd5205d4c0a6136014661877b2a903c77a7d71d7cba2bf3336f54c54a83876e6c7f88be807586b6bd6bb8691a8a0fd1fc662dbf59cc03ff989d58aa8bf609bd49650e163c4d28966c6e86d64abaa08c6b212913761a082b8cd2b060d30ecd718fe707530f3ccca97fc9521cfcf3e336d4fc82a08829569a580c1d3230eeb691c99e25ff930f3137a3009435dd9d49d0bf38161764acf947fefa499edbb9c75dac0011b9e856ad65d25cf0216e466a467a1c0b0d3ddc0374d615e540b86e63c424aeffb45d8eaa97cc97bad1c4f0ffa4d79cec34c3ea3ff08231b32243ef2d2bd1912d7e2e684685603e0a8708b219d732ef49d786f06e53e5a2b413fb9eccf4fdb53554319a362138b06940b94f5798fbe7e9449851b31d9195c1f50dd515ef9938fb350b77083eb9e513961c42565f0f0c78abc93c712160abf9ea7509267b1c8b6dd68ec48d2eadb98f5383f1da8ccf8252993b55f961bbb39d88d88489ad4a309bcc43de98054d841b194ff00fc0c617095502240d0fed93e3ff944d2db548e177addd425151e48cb2c5e6fcf841bffe2414ab264c41d3963a76748e8506be4f80e7f3685f9ae0bc54112587da3b2ab2987cac9ae491031710681e0860b4fc498817c179f332657d8550b906ac28268ef3e86948b3abcf876120090dd787d1a75e9f7ec49324a9e4dc46c10d10a1d35927b02ea86695465b43b8da04494c9bf496bc85484b6477f06471d9dc8b2b71cc8fc30ef9f5cbba8ce9f06ff8945bbf60f23d9bf73e9512ccf3c3b5473ebbd7cee6577ef2278f4dfdb26a5c51d3ebf95a040aad7160e580b36260149359450f8329baabfc956c29f696ccd9835033a03c838f61330ea85754d61533ecec9b68a1580c3c5bc82476800aa65925ea95305036fa23dd3ef090aab9a6635ff560e41de0cf495ec1c07c9df2aecdd1ec063a1170f150ce4b7eea3885c7f3b11c62376d119c67b2a914b4e4ddece24e5288123e2118860d48aecfe6e744c42f6881950c48ccfe480aaead4f76239b492e4f59c2b5076f128f48beaaf2d5082df013e329394e844557c2b711ddd82504641f9d6c734aeec87a20122bc2309b41e6dce85a256bb7ed312f1c412d3a30a8253555418e45612548d09fc663a513ff347c46cf74cc1a6b9de959bd99f0b0102f12b90148686fffa35b034b9570c2ddfe138d444e5b042f2cf463aa25deb003cfb2d449edfc07e086257cd54824836078bf196e473325483b13e06a4cd9b21e96d5f5e64316f037f1f0ae605a05a61d76b4d54a2c3340e1617ea65671aace932ce811e0e7233404f97665123f3404b644a8c6f12195da6f9d68814a2ca0ffbaa219b7996797a056650dba59e836773a6d82dc9f4f993a56e943ed7427c1659dda462f4b9f33a763b8bdb55edc858e590395f98f62f8f76dbd52ef714d9ef391572224758263a02b680e05a0479cde6bc96a48f69ce117c0849fd9beb79c0d316159b1d0c0a10480bc09bd1c10c46a795f7a4d726cb698d079e2e27915378db0404e3de219c2f74a31dba9dceee70411a83954f9b2ef56fc3ed7ddbbce0ebbe6d68d5064cf3a94b596521e4fd4febac99ad957df143b1ef552834fb9c55989517faaf7d9a0a3f389b477da1b15566c64b1b5740339f20bbfff39efd6e30b288976bbff4729ae7c35e2a4cea0324b520f5983f41b51813e663754474727c3cbc8ca7cb3f59938cbb771fcf3de437517e43c6d9c07af1fb44870a750088de2bf56d1c8ffc33e248135ef450fd293602f1b1d2dfb6976c7ece819258d664734690f08b4e67ba71e26f7d03d72f88ce89a742bf083131e39f989f8f45dfad63097373871b8a1967b1feaf5cdaeb1711336e7c232490c88c866c9711bc4dd0229d4778052f3f26e091b3ddd2d1e8ef6c2214271915eb0e043a15f431457dc0a85b150bad93af0a5b1f05048095ce4d8cb94ae92e7c8aa9dd7e6d745b605096d4d2295f60967bd4beb5651a22ccf2e114017f424e63cd0664be138105bb30cd9b767204ad86139a3a1852254ebcff287fa73697123d9a2fc799cc4902fedbd7c4b18c405383d48086636d45c46e892fbfd9cf52189e40180a75861a70a1b33b62e0e373a0b0a208f1aa501a9011ccc177064143cd5d256a33ec7dc11c9d409f5c77a04bd36217485d2a0826021814de05a7b545c18ca0d359020004e30a12b402619ac0c9990a00006b0c2a5a80604ec1e14c121000630531b50000abc85909f9d9fe38d593c1b706a428a01ab2f3b91b90593107ebe01e540773b8779510331f41cd5a439d100ece4b850ba6d70a071cd52bab4b1ba3ae43d4536905853741692d61a83037da536a03c1fa822468d7212ce3fd6c3f8eeac922edfe8917857ff706c10761067200dc0b8aa62e802aa135e26f47dcd5c9f0581f9db006d0d21084da567cc34b3940e441df7622044fa0b9866212fffb7051a70cc0900108865b41a8ad017823f077460202c27c41056de160aa3f3f217fdd85835ab2f585d3d70496ea20a8176d3ed0ba714e8332ab00852d5eeee2e713d6081a1a078de8326653a249a9be43a379e8357b9b35584d9a32c559d69c5c8d2956f179176eea9459f47e8b17a5ff1ab3c18736833419ee5d22a88b59b981a90aa456d97dec0714ace0417f2007e9c0398d270e202595bb0a23f196b4b1a313dce3a84e36f0a904d3e801e88afab6036eebcbe085455fc3dc6ac029899e358c9aa1de40b228896631a7effa83136a00fa1a84113882e812e8e53a36607feb4ddd442cb03fd73491980053a1b3a5d91a5663a31f3e355062b7ae35cdf9d913c735b23d52ba39fe2ef8c8f5d2e0487f600ff489251919c3585543189075d2f3bc097dd5243ac7b3cf653216b40049279249b35c0f1075888c761e827408ad46435f2381c40b6e39b40cdd53a3382463a2b89974d00c22d1d75a7df1bdcc0aaabd8c6cbd7bd9e0e07b59c86c0dda84d574386b10ba755531e7e874d4ac475141254cdcd6769b9ad1a56686e7f4dd6919d0dc10192d46f323c36aafab40ee2fbd4e79e4406b77680a4ee0ca7c802dd7d296ad74a5d6743290921925d8c08004adb8c69ec5ce1904bbb50eeb6aa9b921f3122d906593bfaa59a468b91dbc1362a8c64a4bb1d8472e9c66d2cc2cc849991598163c925a69c99d4af04871527ab422555455383d44f63bb44dcb7d1acf7accb844cd846bdc3653f16bc97d8df9f9abc7f03794f058ffb4a948c223a136a988c02e41082b7213f093b51140740343b7a6a8d6af33fdb01e86e2b25a776dfac0854620a0951698a73ba4e69029b720623b60e0d05a005bcbc45971c4191a767cd54da309d3cc384c7e2ce358acf25796431f6d5171f9bcd934b18107e3ebef44e2d75ab2a811e8e83493fd3982d21da1c17058cc62ab68039eac0fc138a7b89695b4fc5f2af22a1263ab72ba65ba8b3767db55c7bbda887e8dcc4cd08d0a9bdc934f4443d540048751ac8d03164ac536cf831a2ec956245d0b13d5833c4efa81078b85bb1e3fd3e84d62e5dd6f8ae016ee1c3370581e1a50bc695ba9e17b158013f0514375eea602bfe4d608465fe39881cf0a20f271cf945a2512ab8c3c37da480c62465370982630a4dd64f833941bc8371ab7913466a0dc294fa1ec0275592a6bfd11ae350b77a15b10973ce1d35805f083e63997256df6def50121ccf3ae93267947d0f3263c629d70febb399d9aa91666e77c8470d0fb94fd697d80a0591a42e38a5ef9c3e6cc7ebe2892ed21d811fa6720ecadc9e12d563463266bfb83bb58c36723bae356961eb9495cb8c68b671cdec3920ea47456294ea9d6a0a8f5f1614212f66ab52c6626121a61b989c5347f28c1327d52f9c2d68ccde5faf7a0d55a2b05e6ea7a3a1daedbd4c0a0aa721c090883c4cab3977e5ff8c804c39f77497ff918fe8832fc4242e9613437e4171f3ef2869f0e9b2f397b6ff2681a3ebaf6d60c1012543e798717fe0c973c03f448c12cec971f7db285b494da02531e2111493e7609121be24a3302e1dac6f069c4d186ff2d868bd365cd0a8abed70485d41495e8c1315e42a5e0fbe6582484c3ce5192c86cfcfed143d3488619fa75829eb2d129e03c7910c3e1670a13cea5e103f37f1af276f854be4b020c3b12ba49a93d004994cc7e6b212bd3ed15e68b7aa9304f20e96bb2383b89c9495662bca104a988520fd1bdaf526f9d0715c5411ecb75a9e73b468013dcb82dc7e3bb565a0cc9f030c00a67a1788e7b2628fbbecd80cb1495e2de624a7d07cbfc6fa9d7c70d0715830396812617e9d6ce94c6fbe7b0d4045f553c2edd6159c77f4eeae23177c8224898462aa419d8a8ef08a67a437055fd9e23ff7c819563cf626738eea84723ee721d590404402276bdf1dee6020cef9417f5dfc0ed4cf138f17383a6b8c289ce4a8e03d2a194de3800f2c787737dc359f838285442485ad84b84c340f37f0b2df91beb6a3adae5f66941d686b8c9095ec8c0ba30d57993294ebb222fc194f5eb85756b3e8198b0a5b9ebacbbbc33573834519bbfc4e28bcf3d21658e0c3c6f969b6f38c678be991d534349bd881fa43ffad58da9a3f01534db8e320fd37d95425dfeb920f3aa233c11dc50ff947c58b30d4ac348082cf54224772db1320d11235daf66cd3d8a45b5da6698893756284fa86c7296157f2db3d12d27f4d30744b3a705dc2f04c6e9117927014a481df4cb1a5ceabf2a1e225a4cd8f2db45b92181acebc8887869a756ef97f67121dbba3b706a8852eef0da5752b7515bf5cc01a27abb4e84fd49d8833a5f8afb18ac105a0e2e517769e1445011b375ce7b18ab560b6b91d7b5a42de70f2dfe1a1cd5d28a8c84b55063e9cf1d62dc1f8abb5734b6bc9e770e2bd31d90149ddb1dd0ba222507b9766656d34f5db18d7ece6e066354b54d2e092d52a2472a8c07463efda3a52dfde1c9245800c2a9e997cae9ef24f30d0936f884639a3f14f5db5b52ff3066fb299fa47eba3b25c0a3532bb95256a6364bcb5c0c86e5de57cdb1c0d79cbfda08306e44782852e082d5a3f5e642142b46fad60668161292b76823c1671cd10591ba5600252d890849348181a09367a43a2d1c297cf8bfa9aeba847f4b441849ee11d58afef7694e4f53a857a93544fc01f71f10cac6bff32bde571dff9f1f7f3911c02fc85a0244283faced67cefaffe5ff034baeb20fca3fad712ffbca7ff5b5ffba0921f1dc43a81feffeb540dc99747f3d0d66912ce9e10d28084b4451d290f777b133f722daaf063de6fea3480b1291d288ca44ad42cd452ba7561c36903a4c8e608fe2128741e60ee116f6966b22860fbecd1b5fedc8663e8108d5b92b7e59abea87b31e2516a5007204b74e97662008479ee81aa420e38003d84b439e354d0e1f1e0ec500a0eb952ce0c7cd1b3420cec91284d53acdb0d68d9c14e4549d4cd8c6f154fba3a4ba31e900044afa432537f0d6e85e371456718144a89b749560688ff450a0f2a9bbaca946bc16b8863ac21ad45af932fa12c5acb4385615e8805e14e72436115139d634fe78c4f2d0d49cd9e3331d13ff1392d0b0b962c8c2f969c35fca3ff9d80d570ec4440a7aa2eabadf97266190d032441c22ffe00449a846f7eaa00f36b7bf83b19e085a2406a31337027e608c32e61d3b378724b53727f4af2e06f854ae0d172f80e1fb9e64094493eec0644bad0992399a02ce316b064849bd32fa0fb6b9804b9586b3c9c049e6e5c591714eb14211b47f1396757ca3e04f554dcda280a43b928158193bba23bd099fa39116812ef50a23039af1a0411d796ee2c11db2295f580ada727b00b1a636fd2e1419b43107d8ce57350463bc83a9fd8bf68080e7b86059dd325f7d50167c7901334052c3afda84f360646220a08d7c261d1635b1eb7ae0a8b5cb5402eb9ed6bc07a16758146378efbe3059686a403c32b1d56cb8e3e2a90bd9842efa4bd08ed714cdbb6599c49d9bd2aba52541f0032640c331c0eb357f0ba2a571a9e42f4ced41159664bd08fdf568f09bf9f089b0e81004c680486cb8d6b2bb2b7860b8f4c0f51f26990dcca369c723691bc6720c8f29a85f3c06f70be17662ddb985e27afdef83144d0fa82ed2c6d19c2aecde2673e520eaf9d40d61a81c33c5e013ad46f5269dfa85d2f15ca38875a182eb9974c984af09cb8125ed9d3c2f929ec2b390d07fd9b87784cd60073485e7298b9e12b15d0a9c14dd8f587a921d6e01154ba938c55aed1ea28bc7bf1050d3b222ed4046579736ac9e5c93f0faef19640207e90caf9b84bb0142291ac4e70f6f39aed9eafda7c6017664eb0184a80ff0396d22e4e9771d3f8a0ff7463a1c50bad03ba54d731c03bb0ecbc33094d708651d8542224c69028274c8e5562afce0662e785388c6dde60dac10e70cb163e41011498d949332a93b2219b70cae47da3f1c6e7a89248914626a280e694d31dd794c8507fe836770be3043c8eae0b405301a664d5fdaa74afea268a4c599e95964abebf61d8a792e4c38c3a98e53662be53878929aa3d531995a925ec731d80e5f84a3923d90c1fd88281a3794ed1c4eaa3662e574e5169cf50da850639ad0c57481e9850e555508041abfc200ab5ee7c6a2bb434c92445e1cd27e744cf479cf8a109b4c29eeb111ad44de2680f0b1561fa9280580b9d9485246e469351f43b898228f074d4dbec8d77f4735ba5a8c1b6ff6b05db08ee2ded29f938d6e3036120e93f673ca3a05cf7f5d47c40bc2eaeeb255ed1fcdd47b8b134b1b9ac7212d2f1f37ffd5274d917734dbc88e044ecf0be1578d22406585839bcf79cce0e0b34a675aef8d45c005285e50826379233440d15cd5b46d59afd1f27107418d7c0c8959c8968308ba70db5d77c7038d07efcbfb28fa8c9940605d64c6e6c917e3add22873b531aeccbd192d7bacbf236bf5523c93d1b7fbb0f001953c9222f0e0de22be8898d4c7703b053270804311ac3dc617120ab0bf6a0dc777033aed01d4269bec25619111713451a72ec92eb451635abeea2c8ee64af7f81c7623407e88a662b28d175a3cb367b964265b782cad60a560ea3525c2c101612682d0571e3d507d3439c6e61a6e6debb82108927b11fa3a8eefc2b8c8ee625f428fd3abeb68a5cb9b42d99151bc8f921caf195a32ee8fab265cf6681337619c3d89525d8bb54255658685d2aa6014c9a7028f86904865ec4b4cc902d18259755350070210aa7f075a4d0d2de7d8823f3db93d4c69fb7bbe176c0a35cff0060634761be8b383c32895db4a9da107ba539bb6859a64863ee895dd07ad5ace237680ef06860cf2250fb7158bc8a91d5022ed1f932c7198277c1582788d803f605d1a80efa5aa72329d952a00454acc43b5a0a637b0693e12c503551ae20a1b63791184d5859ca9794782a62e5ea2faf48069610ecea24163dc6d7cdff01b933b60326e3aa1ef50f9701da000d7bdc6df7cf86ac022794d391b344969218a0150fe3800394b0b715acb55caeeecf562a1d1155c56f8fd65dbe02c932d4f00e228a34760634d8e06998d3cb1de5158cc0d971c3adcdbb817a7051b6d810073788deffc049058c608947868fe0f6e2407917f0b3fa4c15ae43999fd56e85eda759c6352db978caef157e0d986dbc7e443f26611d084c5e5c925bc219a8dea155992bea170c2584a87b7175a402bc9761b2201f3476d6bd1b5f1fdc9c9ac16a2549f3819bd58b3fd5ab8ae1f6f389f1508e0f0e43f2f92da0ba94e19fee2c1974f855dd594a3dfe88da23f5be6e6a337a2ca4aa7eba8942e89beae49218fd141c11122f14e9fbd2fd0e5532310dc951b1853f0a30ce7030395265a52f9cd0d9c72e4d4ee05e93980a7c4ac2fd97cb766355ed8fcf8f875e818872b9aba1eccc3a867b8cba95a474396500c2fcda4b6fdc90429ee75f25b3b976cbc230917bf4d85f43e7ad12434160903add6c6b30ae2b033394bb2f85d0f9a60ee0ed8165480e114274cd32884bc1d7076e21b19e1c2e9a7c4d5d931a7884da7696f9af982d6eae88e96c9616a0dbfd2b5db98e063bdb7ec9a6cd92c868ba1b11e106eaf44bfd0b30ef76a4f068416d22fef37d14cf9079381762822ab0172e01239ab2a52eda0e5eca9db29e8bc817d17bdd939fa6c4211966921afe8c3983802aff10484a442deed01ad411a90ec2bc87e79e3349e8b5fbb58d21dc8f19d18a0ffd97b50bc683e94bed5c82403b035b8531583e6686e296a0e2be2be74cb6a614b31079affd68ef182d6b5e7141bf0a40006651605730c3a182588cf213ecdd3096589f88e2c7760aaebe308eee32e58a1b09c756f0ef5545e473310d566df1f3b0ed76fdf9d36a09e4843ce9090e0e02a0884380ef9476be9c0ac02dc6395047659dcddc8848fb94fb6e6319302cf2f31db48a97305dbb1683aa8742a2da649ae39c1a462e2cd44f6d5f2b769d036756dc968371fa49251d4647c5926eee51037c1805eb501707b13d39e9485f9dbf5e874885f26de2782a6aec7d22ff61bcc96eec2ab46d2006b30ee7ff8c749dce41ea722893494a0672d44ba485a67bdb6b3e02d60d13e8845e282a6f3ad80309aaea1b81d64694be0afe2ea2e5b617a950bfd61b83eb2f3736d80d5d7364104127741981e449847423974f52b0d8d401bcae3ce4b7388557668ca2194beb6f7ca6151c421ce12e9dd91dca900ff68c957c4688ace28dd2ecfd5887f1cd13c09f6747b7e153cf59cfa35be530f31ee711d50cde37a5fc0be8a2b985b7261970fce82a001682100c67db11df80b1128fa1e9a91c410754b49892597b664790e44a578627ae32df1c9ed3b20d67829f50f397c07ae0cfe0134a72b51cc8c7fe5585134873f52aed42418aad64e96589e8f4065e522540f9871568275329824e1b65c292fd37f09571ccad13749c1f79c7c52df0adb091c4b59082c692e7f73222830fdb89701d194a902fea514c69e06fc74549f48074bc04a8fca84ddf2854a056338818e8292ebea7c67e1e1037951452175fc06252c615b5311455ef32be1a2c48d4c3dd7f21c948bb2eb29599079b9c492e3ca4ba07db2dd1b69b82f2d1826076fb673aa3e05bedc436f434e6bf4a510ecffe39e6ed8fb34007d5e2d57bd3626c29878d4b0a04d81cff375adf7159c84376602097eb16a5457efd87f61f8e57acc58b415d7abcaf8236e4aa27494b6294763a5edcc50366015b2eee3c9dd1bfeedeb84b3dde065fe920365bab50f69299b2b22dee6d31d1ff36a3f1493f9d9e35facdc7831a2b10f2491e478c62eec0f655ef022bdf4d804274db31a05674086eb7a66abb029045d5c863bb05ba5620f74f735fc1be307da564e6e8848b052af173606581625f3a71647ad078df07adad6b6917b4c0278c783528554a698f9069195352f9fb3316d564dd5614f88aa697c3e9ec1bb7140694eab89acae8ee3ac56eafebcee6f1c3ba2038202ecc448d5afdff5dd4f5bf0d90d45363a8d39339d4033e78402402c88c25cde52db185fa26666f7b671c62af792ad82b1eacf2c053746249347a25de600041b98fb1e34c9ea0d9f94f8ff5b5eb3dca749eea60f6e369994b500edc11c7c02d4f18d3dc607eab869a0491ce6855397ea45706fa295a1ae90f3170ff24b2bd7736a000365b06c7598d9afed0086ccbae26a5c1ae8221a38df56aa8a19b1d8e48f5681906173c5a4b87f9b9c46053b0e7a18c93da19e9ce3145b8182b12d86ead61140e1aaf798e95a92e3617e9b4e75db0cc09f930f2174b0f107ed26adf458068e00aa0a98c02e99cb82081d01a474ad16720c854561f83ef10b955cac88920b61ca31b2e622529990bd367727e6d3f2b1e50f91939abd435e71ba1c66353bb20f29255062f2216f3e990564413c547b81448b443d9bb1883b7fe4670923c34b1a1a84562779e425f1a167119888399457b4e2be346d5198a6bb60c43565121bd0545239d58c8b1290a529ad459575de7804e49e0b3b65c399f6b8ecbafe00ddedf98e718d1fb7de5a91a4d1a3590ff1cb4d82dac5f318b7e5037fe85f09d300712c1b57950f3efb9f6d924447e2766bfb2312e437d1beb0de7c5a4758229874416499f21afd7064e9abf209ec37e2c9f2938ea6c2fe8aaf5cbf0d63228c1f4959e60d69736df851d095d6bbe9ee2090eda70a3ec5a28c85bde6eb016d30f5d2aa93f54199866f583ff42d96703eb07222a668661dbc511af6a1f94357ff0efa13fb27bc2784427186e15ed16f5ea57235190ba94ea694ae4ab8afd0b761d0775c4fe7c8a515535d6245ad5c0b335ec848377598026ea74600972d99f4d8da643be96a0c658972deea148a5ac3a80128ea7836d0d269da8a2abd8b40a114c35f22c4090383f4d49613f1bb4cd7bb944c62ca0795d6a24c8b458189efc711159b428722edd3fa3911edcbfcebe66bc44588d90dd8c5e590c9a2fb92f939a1cc77a94f359593c3aa99d0c2d4cf7e923ef78afd2471731daf871cb125791c6e7ff3625799d0988c2a822c1a0874f256b2eccbdffb8dfcbc58938b4b445b4be724147a2fbb711afa520b20ad116bd08c98e06f686c3895531c53a60e3aca429c204f2aa5d6b17b68896ab2319213dde9ad51aac22e5914cbf969703ae0fa41dfafc8aabd88e3c4391ee7865dd402016dd34129d8125886a4d1c70465bcc86d78efedf25b1c8ebd39dc911d5edf7ffc4ed9607881b93597685d34d334aacf65ec773fbec97f47e69a143d2a151addfcdc7679cae582487b2aafdb68d3e00459b49edd5cdd79dcc1891901a76252c2580d3880fe3d5155e41dc821baaf1e0141298fe7c9a48a3fc990f66fe33aa3167a35300256ee66a3fbb81442fc7ef7c7b702994494e6c10f7d564f56a79c99fd89cf88ce9cd7f97823dbdb3090e158d9a3374a9362185c2517c40edcdca0f588345de13cf3e949f46f2a4b2dafed2120cb7352e6c50902179070f7b107ffd600726a205d932cf3c40c112aa45349856eb00cd6fab43a125d8e8de073388e08f9756cf5f91be3ff72e60e52e2660a83400fb24e477715a190fbc0c30469ce2367ea3171a2395e5cf810703a72ab1291ed3d3fd307e0e51b4ea21d63e07d20d5836ceca9e0f6a21cf9f3f5a5f655dc0b0319f60841a8744656d19a2b30209b90806d2be187dbf9e38830130500706c791a13c191d0f52f892b2c18cb5158f0cb0382c436be882e5c588f625fc8bb861f26947b31c40d13c808360103fcb1b8cc151dabe2f3ec701618e8e2c1f65fc4348b17872ba02f514542a5c2bd3ea0317875201edc41200ad6517c1616429f4c012027554e30ee4e67215a5da6a0be1d4342029404abc2455036514591912f71b3d0f8214a466bea599148e84486ad15b0587cbe03d27cae8ff605addf0c2a74652131b22c121cfb0c44e538f8bb19892d062a9d8c31382be764c03725ff567aace5ab8144d0e13eb6e4a20a4375157693f76aa0fc870b0c4ad4cabcd51a61f9ece899ad2e08feb2837700e66ab722c56ca23a4dd0dac81b711e01ae733b5a0e18e4e9c5da16a8dae206cc2a52ba1104fdcb084eaf8939ccbe166dc0833f5b27e29d41a4b1144d32d4a410a01888bcc75817e1c1cdb12f23b5daf5e01bfafb7fdee969075834027015b3070c10f7adcd39bdd9d855e7376e2225fece00b786cb7a1f4d27324bee16e68131e292b085718848565b7a19a2fd3128963165e0d3f215349fb85dd1fac8b7d09fd642787094f7ca6e268ad4e5b0b708fa38b5e7125f7d04020999ba76e2a2fb84dbf3cdeca0f178504e7707ff369db1240dd81cb2be4f0cadf1598ea9602d09c2b19393eaa92b47227a033186cdf17eb8aa46ad73c9ad2203525cbab6b748071f8ca8dce5e7fc9d2f8c455f766986186b3d16a01d7efbec44e295ed8cb5526a1e326120fdfd3394d289d3b54bddfb24a27d91a62190a54b2bb40e603c230992136dd713aa90756835102ff7e9fa4e06ac3a05dc881e80ba79ecf5ea0a7bdb3effe4e1a30881804bc3c99d8b267b26cdd906809bbdbd62f6c40f5dd255094277f72f165d69cced3fb8e0dd7bda6e2c1a0ee8a2b6093f21bab0fce37d96bbe5b5227e2311c91edf44536994a6985f5f30aee590a0031494a67e2fa6e3c982bb592028faf271ae50d0afd0a22c7140353d4f17585d0996ba06eb73098bd184703d92bcc0e13ccdd70949b5340018f678c7c31ca3a3a2c8151a6b37d4155951e764ac0d72f6986a760b8cac0446e82789f0d338f56f2141543a93a7166e8623ef1afdcef9c9ff636a282329125b69e6d698d2b5c2d0a5cc49306b1c5d10e9819fd5a9d207f5af1222cc7cd08346309968aca8f85504f2a2ec86838a489c6542ce0322f366be60e0dbc8d18bd100bda9c43e0f43bf8ed3afaca6465fd1a99e71c3f1064126533d7e76ced4105e8620ed35144a4e84c99820ce70c95956eaa6fc226012bc250ea82e6c32b52eb70261b2ff11262f495f771e06107ced2d3aab61b0a22966a9b959b8b2bf6aca7da833e86741052d3ade785e1e0dbfc702ed23bcebff79bb22dd790e9a16f67616d2bd7ab455ee9d3662b1ad9404b1f82fc9b60463392ae30e8aca369e979afa8c0dc4d6ad3efbbd2322e283365b7caf702b036aa3a4a6f3c31630f4e73ab01402de822c9104f423469552e8d7db8944a9253d1f93d9c7a366376a9dbd0efb4f0ef3dfe018001c18f1a10607c034976e6d5eac2cdfd2f0e110e54209dcf016f3ed5ca16ffe19b4242605e3882cb0421c7a087cb7b4ea62fb4c82197426a66782aace788cdf792c900eff8af88e480ae89b8fba9493454110e09a40a305bc91799913b14603d62475620221b75b520c5544e4a36bcc79f6a1bf67dd3e76729746163719fc4f8114fe30ad503f377255362232d78b4df52e5da19a7092f84284c2506e7054e4f1ae7d0d31a3b1aa8a3835ccd83b0a609363314c2045b1c19cfb81fe4150e377134dd95882d553271b169c55ccc0f382e49b18c28208eb9c01ea82052db68ac900e38cd133630837b9c68762f127152ad80518776abc6917a4e4c9c479f0372acab74dc51aef9428c4ad2eed76c1a290a25fba0b379a0da1ebca645dce650924887aa0d0467f2861f0e003af38bb1936c4adeba1f559887832e89aa15bada09551cead4864d096a45669c0af4a97c684d7390bb82d65ed6783eb391c78955d360bab2de0714ecad76fe79f9fded87b4652e078e1fde822bcdd725017173bab243ba7044ca8add548a121782326d283137f0ffb701a6d8d01690e6d2524922b7db5c939b9279f5414344db3a523d8bc7357d103e8ff1c583586408026e60fada13b8af58e4bf775bd23e1db529426a8dd3356dd26ca7d28f029f83f27c906ef8df72f1f5b82b4ac2fae34c26b01e7ecf4d8b90536031ba6f35ad05d254031d82b7019d77fa8fc1e3acb42e2056708f00f7e328dbe0ac505c026b36b44337b330dbb180dc6a8e3befede93471d9317deedcbd30e2e91b25ea57249dfc3a442693082c6085a02ad5fb5d2c0831d8a066726f94d8d8b63c3186a4b4d9da8d4b18fb2566b12d642ac1b51874793f74966153409d8c6c6049f44f54d99418f4ed99d8feccc63168fa8869bcd59aaa8521b3d80c1d9dd3bd8b0da1df8b5bb2415f375cb24528c167a2497ea61333a2947f81b7d0fa7a38571a0b6f96359f0ca2799181ec90788dc36404f067dd0d9228be5425e5c2dfb4ab443fbbf5c4d3b2d0547dcbdc1eb6e68ede09d4d393cacc634cae74b3996ce6f14d9b223fd27d3b9b227ad9f78d1de1d704f12e0ad424c71ad3c1505650d490a8c265684ada42facdaa706b4d037fdc267228970405645e66bfc22284f182588a5bbeaa4f8f61828b4c58149dd98a3168fd409502c3fb42ec4a8148f923619d17b1e8859fc22e1ad50f9daf8dc741a31f04456603c2b7a922ca025c9a2b68be175db820c6ac6c36271f4330434c66432a748715c805ec776c7e929a85c973e8ed20b7ca6779157849c750e8d30e722e1ce1d6e2a1a3bb060e5b01337522e5e01a951d0e2c9957a6a01a05cdc91e6437b04f7ea445e5289c56aa37f0fb22dd6b6a8e9f714af6e84df03186a726e3ec3d1b3d2a216842f63c6befdb31834a0c32c01597f1e560c4f3093f4a8e00745d3d921e641a618d1f8681f904bfb6001c51c8ae46f862565396b08266c359693347ae0062e0b6c0a0d520e838c3d59b898ff25d4efdcea733827f5f10af0415fdacefeff0f049b4800e96efe80d080f72ee3c73f65a0deeff858471324adb5d1852c36ec711c76f9876dd995b48b8cf9be180408355a3e3c22257aba6238f67d2f85973ea8c1230f9d8d93f8e490dfb770f91581a830b8a70f0ae9e7de7c57c1cf7c0f12706906aed0dd228bc94a76bfb027f6bb6c578205b0768abc4c45811d410bc0d3f86bc92f94e7df8be7405209723e52143f0ad6cd3e84b13eca6eb9cf75d5979c1082b312d38f5b8a58b11ef1c40ca3f65459f23cdd143751b1c72964cbf1a2a30ae13406dc3685f9a9688b2227ad5e58c412ccfc486c119320431c83e9fb5aba02f0d861163e071d5e2d33dddf7c6fc176781844dedf8326031ea5ab0c813a064013c8d67cc114c528e8e5b329f6fe9cf947293c87dc1dc5534cd849e79520994b7693d3e0d48424f4d90df59e740b201ff7f7fa207555dd7576cb629ac6dc0fbe382f7fbf401d5c9b6d2b11521d03dbef8267e4acebf04f4d4efcb126dac42d61b0ca784d7575824a77c447e105b333143a5778ac9f46d69036143716f0c990f022791250dae03879aa549870ff546a7fa6a2e6647cf7b1539ed6fd7ed0ef0e2a8bafa26756c757f6964b9369937ee7c9411673743088978314550f1288e42640356e0bf9d0b723ea84ed705384671ec420758ca0d82903179a24989f765de7fb4970f5b4ae045906b3050c04e5a5882e246239977451a045f4291949168020e53cc9ac93e5c65030aa5a3c413abe24e42c619c9eb92fe75ad282d3f9e162d7f0ef0666602b988289a3925d09e4e4ce6870f12a06667c23b4d16399a19912cbc808336e2682e5151166efefee21307563ed5258f83c57b4f1a0e17631ce42ed3bd671f2568b98c8c565ceba2a3129b4966fad5644d69a4c3e6a47a11e8ba680b30729c0cf8925d4d86f81236894c13ca5201e539a962034fd9918fae5c6234b51a11b4b3470a6b7643f4e8de210d25d30713071a9086dee02e4f00ed3030160572170e7b6709d72a5734dd19cefff5717103be5fe77fc8d5a8343eb1039825bd05313a51860b1c84151b909ee6d278b42315483cd9c1bd61588394a17b3584ab7c74d546d40aed29c391933dcc5a5c1ddf0435f2b09d3a8c46a22ac91b8a280643f7f6ac105ba02501c3b4eb9c5a6875379eccc741b23e15d951f8a491c86c95aa309a39b51f306c516cd0be0c188b83694e7a4e6a02e6d8fa16d6d8cd1092ba9d546d76d3be8507c4337a858c0fd7b200f0816c8a6aa0f07a92e93f9705b8bb2a4419c29ecbd8c1fa299b6f2b42516155343f51996e29b5335102ebb35ae98ea1471561f3422384013541a4e9928a5a2af73a648d0b74c3064ea292560b18a22cf013876473cbd30d16819c8a884285081dedf6be5dbaca1de81a15ba18362d1695902ba960487e00de20dee9a75b60012397eaf3b7e95644a9b5c9f7ec1bfd14193da22bdcf357c59d68db40f0823f4a5f99c5db078e129338fa2fe21b790445f2a46a3aad3dda6c31e923697cc5523788f3170293b51f5901cd4f8f6231e4f426ec14ae549dbd024a7fe2a951294a0d4f879bd2601d426739ceb4952c04d92e138f31c823ea143384d780c4040c1d3e53e69bda38c25c030ca9e33ca7c9dfc1db0a43c12d266d6d692f13ef6b4eb91fd6d612018b668d5b1456ba39b43371a345df30860ebb38d97170d8dd246029f176ce1f9e0530983a48ce51b1d295e57cd0a050b2905938c584b889b31339b8e86ebf26e39a0b14d1d139cabc72c3d4e842da5d019b8f11d8a1503022e2ce92ee9b663162c260ea0a992c2770245ed1b9f099f3d733bac9f1b19d4865136b0ddd0fe78802708f16873a68c21683bf0aec7ab9d83184b1825c7cb00586bb31e8969976c81df13b88e54616377b16d78a20cd351d1d2c862660901514b464fd1b16cafcf7822010e21d3d19cc9fcdf130a9f699570c78bf2fc2ffa01e7d3051d72322c282d230202d2847dee3eae9160dd3c9ad3e2269e20822a7cb1a985d9fe5aa0aa562c4b333ab3eea793091b27a2b568d8163e9aa9f9e009f228292cf58a5c794463918b5147c30f5aac2c45d33d415461cd68a6a5f552e4284672d1e63ea027a6514c6fefe81dbde39bae33eb4eec01a5bef01e7340db7169c1b1f602cc2bf0fec35fa518a1b805e1681a71bc1c1246a247cd4255cb4c0fc52ef9ce8880042242685744500541725a237bb1d0ef038d1904e01e2a9453e994b6c217b9bda94e1156d6f30076c3521840681d570040a2c081c0005a120262856248e00302170a1ea10d84b8921959dbaca5fbbb7312258eb62e682f0c7e741006ff56049f7dbf07c4151e585f449fc887f8c6f177e29417206d51b49c89b791c84bb5421163cb66f858a745101ff269936c6fe7a1d23fdcd58721a35397111c9022082d3f44e28b627be6ca3105f08f75771e8a38479e6c5ee818437473ecd2afd91d2c302021636bce0f1764297c053c934ff40d95a3084cac0f89c6451f30d012e6664e33ae2bee7860ac0a41bc8720ee5312968c29847a32031b95232348fa839bb65f7500ce07c703a6253a03698af6002545679224e36da5c6064fa920158bbf115b39b12ab772df75affc47053d8a3c5340083014ab736d1c339f98e0e107b2139a23b69beca6a64c6fec81d5f469be58d41bbe65ca8555cc67052bcad4cc0ec5a9117bd4772852d6b109365641378fc257eccb62154869b5f1bb55e04d02ec0de2a79164cbd38a5848c8b0ca6a6a359cdf2a51d5aaab484318dc08f41f148efdbebe7846c58e8988c6fc4fe090550e1651151be23003b3dc2ad882146b00807aec3a91fd49ca403be12e8a9e15dc0c1724bbd218c074330206c231e0dd77d587e2d07a216717768a55f4820aaad25eaf6618f8beff3d6320645f5bc2f875c85adafce59d763dce69d56d2445b044712101064abb059f88abd30e434dfb00b46822910f475eb4d682350bae49750f84c61eb7d4019b0245b9279ca6804c031b078f214fe0702f6b422650c8676ebe2e72cf7a2d804d3f5790410e9140bcd462803b9450f1a4bd3eb9b1e1a6b5837743c93945a2dd3379e46fd26788481a4b0ea1298f3c11f542d00cc05ff193903bb7e99bd84cc110c9c579bf597f722048ce08df911b4a86e03d3be767b265511d83afac7bf2eacaa1c6dad9c223b13849e1daf1b84b3983114c6f50344b78044a98ac43ce06ad12a76da14486746111114ca36852c762660e5a4d1c635c8c7428f874b07d137d482a6d4604f60639c2583ed8131d3639f9929fc512306a5f61f0f5b9da835f1b4fa4c10a125ee337b2d3272c737a4531a488934485fb9d428a5e810296d1f29eb75bc8d8f8bc0248bb591300b2d380a1f259aae2264d9465d6247dfc4c664770f1a0f667214ed43ef121cae9a2de3bcdeada50389a211e38304634193c05236891d813510df19e75b89756c1dd5dd0301f06c8e26c44e085ecd56cca885fa907e69188684e70fcb9b0781b1d6c86baf49c073c2623771739ba2f2a738e659157b1a9a9c3e8499fd37bc1397f373c5cb001c569835d7c9f339100056e6106ee6dd840c8f9069b25ef455aab9d13e59e1998b85600557f6dc28328caa08dd76bb380ffabd3104b5f22f6907ba56e353237c2828253cd2b2aa1c20dce27825b463bf8b6f50c6552d8da1b39b8138b3f463177fc08bae2e1db2666f33b207098c6f5948f64c9b3523c8ef189dd9b89e1688c116b383013e8ad6a15a2c56a22b4c5a8472451ccaab82de432925c5eddbfe371ba2ea2bcef965318dcd7aba5147398a6617a9a04cc22f26622451299a50b55e572eb9f935b92dba1aae6e974fa0681f3f2a1e43eb93e43b0e698f0bed3e8fd29c08d022bed37b301693c8e811e90bba73bdb6b0a128772f60d24aa66886a9a574ee03482ebd8a8943adea5a250d091a4004db7473fe81322a639f0dda2e9865b004c7a7ad710a019d220280a6efa62727f2dea813bf0c38c32120f4427bdacb5cc646569c1cc7c9b859ca149b2dade71647047e10df3c173a6dec813a8a59bcd6eeb6a2753fe05735e894f4a6c44f14eb8a1e6fd148473b088cbf112194d37cc674316327d9c3ec7669b739c8f24371b73d23e2c0a10e571451743f3eab76a00016882d430ad8802c1c204503affd4df5152e228909c040ac0cf0f2d7890abfa480ebac23201c27b7961b951007bd7f31a77b096acbae97e8b117a5758a1b6c22f6ca2e5c2f03340cca90f23e519778eaf1cf6902df2bf1cca7508a1a34c1d370fe72ce5b03c8783fc46eb5c87fc63e746c9a65aa825a2100af667e41e9f7fd96e261f36409ad345aa4129b15d25074a2b2356878aa053f0184bb9d30705b8e1453cd378ca7b0ae9165261c03c7af8a21213c6aa0e336132dccacb140f8315723d94da7dcda2379a92889acc00aa8eca92315fdb0fb9782e3149e2a4cba4363886e68722dc2a4d73d4000c727eca4bf2a80ba1075a1454bcd26326b05b69570eb013609d845ed5b9552b313fa5d487df4e3f2df0360f4cd89f8bf6dfea98b09911e25151a2b9e682b8da5c832927d111b33edef7470f74628b777fdc8bd6d8177b2d8ed8a9634541b2514cdc9025a7a3490b04b3098a916faf447012923e3b86d75b70fe0b3910de265a5a5acaa31b002efb4800c48ad8107da62119144d0e1b6cee27e934784ec211d2df4da84a6dc764fb60192f206f4531709821dd8e7b680d39ba460cdcf21bb12a31db53d235642433433ba1a83366ad78b2de522906ff7adb1d7e37094da683591e8d815ab5fb044e4819794f4ed62035eb39554332b3fbf0dad4545a902cd8f942f9e7f186bc60931dffb28902bbcd7ecca4f1faf707017ec05e2f1b768ec8e28531603b367b2ca9da8f57fcb36fb37a7e3e956638ed63690eb53a76ce20f0fff8393127e44ce5872a9342aaaea9ea65bb1c6223d572885deb7c5bc132e2fd980bfad6912193220bee1040ad731a42d63671641ac57f00f2939ded24d45ad18e4cd5188e8c79ab1ff5c5f2d5b80e7a1f32d0d864b88ba128be75193091e3f2fea85018a310ab8e80a4fc0c77360eb3c2b8e29462a151005d907a8118412d45c9390215b3259065911a73525aecaedc2f4cba89ed6ddefd837091f595cc0490e6e8e30fe455d947b2737005d4474cca44f454123117443cd561e734b1e038d8cb69f5ab3cd5314cd5f363d03c336892a0c33e07b80ce990f1cb4d0b4e2c13a540fd274eef5adb5ea6076c358b95141e3df7f4c8cb9b49170f50f052a2201136d75347651f36e249aab5e2e00d9eba377f0640a8dbce0e484890f99e22ffce5acd3e54c8303bc62849e4ea8022846242d582bdc40832e13a27622f29acdf70ee4168d11e1deb949bc40d2306f6d915f242af158c0ab7f4c0086e684ab1ecc2b1a84183f435f7654d648fa70c4519dea031445c872f4cea732745270ca41132d6508a952d1d4e11878de52d9d882e84ca801d141d27875022c7e29fa5203dfb94076ed2ae78ba748e2bac0697f4dd47d3205130f8d88b85bbae6e2c0a7e6a6805411ebbafe2ce62a9205be82dc3affb7a54e2a189cdfaec9eca846c5ef8af3d1db453ada35f339b252aec0eea290a24515ad3f1d0338eedec4779384ca283d4dc9d2b8f30178f0cf7a02335a2bb3c673a0a6e35b0b135048ac6cf665fc7856fda097f0a9518ad24431d1007e2d6a715141a61907cd3648dfe3fa391771ff1bea4606b9c92c0a4d853a6febb75503c862bc807f59d0803f9805a390ba654a4f5cb7a11da282ee53e4bd9b2b9c907fb2d6191cb43bf556a3205a524c5959a3bd312e10357a891f11d079cb8d74e12730c6327bacc65924146918a51280637eab9d0d07fc89176fb596693520692effb99a94c58da885a85b4475e6222e340dbcc1306611bd1a22681fdcade7aa91c119a885799b5864b99b4161799b11e5733651517996445ee326705b732d73aae32c12a6e66ce0aae646aacb37301b329a9f2e11ff73d5d3e058fc821ab60a8e5fcb81efd0169278b4367efb73982094cfd72ea805d07df59b4389f3f58e3178e79c753e57f32fd4b7b8bdcf6cc6d6809860609aee340ebf6023264dfbd21b9c6f156970f79c1f475aa401f9c397313623d1054b3e88dbfbfef89fd427dd61d10ee5f5f2a23a7885349950d5fd78465d8b7fb7d60e540d198a9302e2122e8b375ba2d7fbbe5d0b0cb2ece42b8497807ae6a14f5dfdf2e54001edbc72e34002a1ca02e31a0f81e4eabb3753e9d88e72bf6e575cebd7c534cce1a46d8e52140e97557887d6db7ce070ca3cc0bee771a8fe1a8f3bbcb924b1db0e4eddfae9085b524b3ced512a4cc08bb619ecfef3c48f8ef84c3defdc3a9f35341f7d1222125501093ccfb19683d4276d59305b6ce3981ddac8ee234064b87cafce13269020bd3dc040be43a2f010eb7ceb9c470e5be475858b8e1252d1b0b6e441cd306d5f91fd74a2fc814fcd5677a760b02652506baad8041641b9c54b6281c734817ed8e98c80fe76eecfc45cbc3428c8895e19e6bd75c83567a2834c3d0bcf47453ad88b04a3eac831c52f96df46e8e9ebbcf8bfc58d6bcb3a41c829732d0367aebfdd26f685cc838631eadcad1b459a4f726697158f38e7ca90183c3810faa902b4d2f880dfba6f98290087a1c8a1d90a4e37415c25c8f0d93347ec60da3bc64fb51aef96c96f82a79895ed837edcdd0e7cf07fb9463a30785786ebb2f27c3e0c4c776bebcba76abb1f19b16b79d1e61f991df746ea23c097fe34dd2e88cbf4462f79a0bce4e25d369ba1e9b7ed3683f4d44381e632efa8cdeb849fa065c7b888a97050b1c70034148d941ea3a3db06f1aeda789c038ec03ceb7cd342ae529b258a3af0892b6352143306883dc4dce97d5951b7eaa2dfb89145c0c26b31be254c10797426aef0a65e8690783a1cb199b3694a584af0a6a5ca07d74ec3e4e53f5bdaeb20d055d5c0904cb18ece1072fe8b9a45db8d1cd297c335d6999e5b01bc03e190da3bd862882bee399a724f4d2d9d6b94dfd515108d8556cb07aa00f20539fe8cedb183549bc65ae91d84f9b888916a17ca1a84f16bdacfbf121f6962339a647a4943e0a503ba311800614da7798cf80103791019e097c09c5719aa0a4674bb74e741ef418bdb7bd129576f911318b39aa954aa5c839c6fa61575c34886273e3f7e8c9a6f85d4117acddc9b2620010e9c70ca77e8f712ab42c11d71185307aff05982ba4257a70f45be9fbcc18c898166c13779bffb553f6b0bb1acc9f459e36892b62d21a7a6fb3ff7d37df7e45db4ec57e485f602007c37ea551406dd6302449cd8a9373792770d8d62c192499ca20151dd4ec5a143894e45eae92204d95ea8f24a141e92042fcca0286b2f90a920db55b15574eb6799a9ad3f05226da650a5aadaf40d44de6ab48afcb9b1304503948fe6ab4ad5ff4f81463a070d65fdc400bb89207346eb5383ca58c66bd453e135986c2eab456dee35dbc860be33ed994106d1397f87e7c7507b1d9047ddcb80ba88548ac46d856b16879ebcc32ed6f09a97a36a72b26478658c54ebe42858545995e0aa98535510b3dbcf194868a9bc40d39b70216e03a30d40ad5df39525294f4dbf5ee20d13e77c44245ed09c0220340616d0224f2feb43bb00822eb613f89116269f1126d6668477bec90f09dc5f45a512bfa690d25696f50597d315bec6820be3ff6306a8036df74de1799ec2a763b0efa9a4154bedf2ccbe9567cbfd14bb218b6ec0c67e96d5a3bbeeac217bd24480cdbc9556c02802d64dcc4984390364becd48b09b6a2e82c861c0156054c6fa707d1c4d9ce594b8bd2095ff4c825adbb94fc73aa5bc6157ba8c4d84567941f1fee49a5b7e8816c626c27f7426a9c297ee70c70e251c4bda42c7a00aa1dc4fd5e510beac98d74671eb6c71e6d62d99e98a31c50521b5c85d749381998c3fc39ea7588861bbd7851a8d87dedec4eb16d54bbfeb3c2177a34d5a01053a2f18de5d052b2be92d6d1459a350bf730a651a242def9011e25b6d1fb09b043fe6b9e7b8a735838e07fa84205bf004e8884fa6419f01ded3429f346d942650bb5d18c81ff1b5eebc062bb28eea42e61a234dd1a07206d5bdb56ca693bb5ee483eb1ec3c172678dd6cada3088fee882243eb572cd8bc851e08b8c5225b77ed963133dc8d36a32bbd930ddfa4c1b73172ddcb6e395001b978a177da2c9240c725805a890223f575c4baf0ebfae19f096164597d4cc714c3572cb1355f5bb91977f714080980a922c8ed8c23ea31071d73a78ee41d8a3d1e34ffabf0d8113341d3fd65aba0af8f6c7091fcd4c8a79f82db8992ace0726db78760464aef4616e3197cfc955c9fe8346b730c3aae5496e8fce23a0dbf760bb2e5814cbc9d83e9a45db21c62f8491b03b9bb5223fd41f146f11c92470ee8e0d5222893e6e5b401eca445322d3bca3acd62d846552ba9780228066a5cbf14dc4bdd9d1e489cf89e5980b5fe653b6505223890eaac0f452110e7532974f9c5c8bb084bd27acce4f8fc96fa2bd957f933a148e3e632d4879420d7542a7a375d2889449eb5a07316a9b80ea3e676ce5a821a837baf4ab1328520f015c15ac38b4c0ea1c8a9870f57c2bea6a2631660d52b713f373e944708198571ddd04f8b0f788d1ec8171c114e5414a16121d138e2bf9bbc36027c6a3d8e46d16813445cb20cc96e7bf219cd1c85ceb6cfa713641cbd2a09e0341b5c6a0840e90ed5a3ae16860ae367d958d425585c8a950b19e70bb78fe4c4423d022a04faf2cfd4dcfaa2eedc888409cbad99408de0dc2396cdcf15e4bd8c080abbd3659d4e3336836c388603c2dac2d83187f0a9f0733623d497798874a90a547393759833a5e0eec8781d4deb5b6ce2f6b156b7c135639fc94e1dc2ce00da87056c09eb20bf4adb9e8a6894b33176fe4632e2519b95bdb5bbda8cc68541bcfe952b2cc2f21a2266f46e4f9a4d6632ce9a829346df63a2546f8e803d15b42956e0cc4ad47c004a0cd2b6c3cdc8da7ec9394d6f9684a36d7aecb4b86c6fb48dee64518334442cdae6ca0152d87a2c93301c2cbe3c22bcd21c55a3d543c6b01d6d40274f98a0b17b9261d730715cf3f5f57563a015f3bde08288c1da6e46aef92c0ca0caa4cef7b7b8491cf4a0d9b48354941a2c8c3fe8181059c3537c000aadd92c8c54c8b18ff093faaa8437b3f6b2dc270712f97009fc69de887e42e0eef74821b27620c662c66c1839427d892b7a34bdb8f569b1574e343d920c816ce32f884100ac475f815635a046047f1b41feb6233f81eb807b4ca990400271f0aa015552f56b0b14c40427f08a835ac11970e50901c408f8f88bfb5aa99efea1c58174bfa1f117686d810a2a125760f91909565361d087b747c82cfe204c02c2131917d52c28e90e505bc8425940d60f128f7aec53719d6ccc4dc8ec9b6459763490e388dad213a3bd15396be69dc0568e13652cbd7193efe666600c69958e12d202e75cf2b00c79e833d20e4b127a8f70e2076204a237a0b442f64d59bca446d2c434df9125415f447a6366c1ffcca1995f569bc4f0ad0aabee8cd3aba272dc7de0039c56e1462e0530c60ec2e8a555c9432de359a9a33d4edcbc7e3fd768b573022f44eaba6d458dff9f0529e9ac946a0ed7fa4bdcb4b02ae2f071e274eed216341e6d55090cacb975b1ea975c971dc46e58368475908a860f152fa6ada12cfd311a7202cff004351fbf41bf2d7788a0479a0d4771699ab143239d8a208bdb07a3e0c37e65be30534f1ee6f9a6fed97b30ce4b5f17b5ffd296c8f3cd3cec86285453a41432eeb046909f5fea8c40329f5e0d99af0fb60f24523d2555f4085ee7d7ca6a4dfbca0f0db3eaa27b195712f401004a53f90cb52a91ac0c9c0b3edd33e6eaad4e1f90cfaa8d4b3f3f04e10f562688bb0348d174da0ac909a52dd09a7f40ca746e8d39a83d705c6e80fe0964a716a2d77d4b002056ae6b9e8d8e4316c5e8e756a09b39ac2546f20c575c9fdec181dba885bab0332fc6d954455d6d3e373eafe36d08e545242c92fa0b2fd14880f85a211bba6195f8ede708b7eb67173babe0d3a83413d1c81c7acaa9bf058f6e48506b937628076b251876237995a4c972cba17138e3034a15f622ddcc42d1f832b3a4a67fb05849ceb2ea904b2d4e1291d10c0835e0e62384fc40ec1964595c80f5936115ae91f694e201f99dfd2f6cbe01093febc9b338b853bfaca98b40ca4240bfe9c09db57c9b68a724bd6cc345add1e194c22e7db2584c5a54beb9164ee3cc8bcfdbb706860c4481f7786b5321907c5a836525969d3f13be798a797b59fc6d7d610cd010a8fea484d5dad86be592cdc14ec84e7db86131eecd18d70a04971f213338abeb3b3bbdc28564d6dd34d45f725bb96edfc299e36569080cdc59ede8361c72492d152013c9a353c02c986b2f01f2e5756fb95bf3bc1db23cab471b45ce06867450208aa9909a402230b4001af7479057ea93a8f42df0cb0de67eea47a0b9af63497e78a8b9a7aa101921cf0350add29a0b232c009764e2c27ce57491da389f6fb3de1bd40a5cc645f2a44216f20a514d434fd82e197d5994f3a159e1ce1ce1ed29749fef9faa33ab268bfc7a9252c2933e56fade3072dee3e5471420c63e0134fde0c5a95e0735f94168ca73f4cf634a663e717de35881e7a462dcdfa6af8dff7abe8d0a6955782a9d54c8402f8dc4dc96cfc60daff6e42d070630791453cf4a238a3c9bbaa46ba21220ec2334496ba86bc2b674214e867e1d04c77062006def9f7e8afaeefd0430ec5241422b934108caf997376292d415248a9c054a3cfdbbd1e29c77bd384bfa99ef1318c7ed635c3e36ab4a361098d8f94ca921c080b4463e8ab35c7965e044249c2fea3878e10383ac1cfee84b955a01507205adb591f9790efe859b83b13ccf38ca74cba6a0c53c85ca26cb6a9a1080ece0920133cacfada3b6bba19a923733c832c31bfbd59be248c7e8c46c701aef08459e4a9fce174ff761f740c76705b0376a89c08a25d25ac4abb870503b1856d2386aeba7618d5917193a1cf38ed7cb53cef2e416a26d7f411d30caa86bb1a86c2a3b054e10bb970913b296a0b19395e087a4b71b9dad5c5ec8ff947c5703c0bc837142bdee7fcd3724a9eb6e840637e02f2072c49adb56d5133a0b550ddefa67053c541e53f3837566483e295dbf892618a059b4828becae369411c054083e851f2966ea035dd31bcc445e832c982c847193fee995d8dbc535d7107a5aae753060a2319c7f2ac3f9a0961ae67b32de096a353d20d0c20f44abf7be2373728e7c786acb322526403a487036042276a9b5ef67f2cd8c72bfa6d847e03659f175a74003dd08744b4237234babc20271d560aa98bc234c0c371f2aed3f9ecda1738052b36c7a7ac04a507ec3cbabe7831ec1bcf67cff294411a9f86fc236de8dead2f50c77d81404cee82ed25974d125794c6384abd85f8a3e6eb3d0015554b046bdd19839d3104b2031618b440d629aa8b7638436e6d2e748bdf1e91fb962e1efaeecf3d65d27770e047b713b83db59940ac6a92094b30adaaba6b299f7762867945857bb5d69a5429b2b371d05d182c0d8d8ec1db15b811627c204954365d8e51ba4d91734be0054554357d3cc9b450aac2ddbc1840ff4390bacb06904674fbb008fcea968bd3f91c731c62b8c8e7104307248cecf61c81db3a0278854188855d99041aeec3068308afaa1000d0654f4d66710a20fe5db3098d486fcc42d18f22a60569125f3515c2d62d87128f49dfbea243f4376c7e31edf7b04275be35962790e9e45c650b52dd297bcdb510bdadbde3d2316ac5df764eb03858afa34a19ab3430287727ca379bb75ac88753a07e370eb385573815b631f510fea4503ea65d0cda32f545edb0c6833037bed0251726dd94ea5e22eba6903909e68caa0ef1e15b6915d68de3613f0f5a484f73b6f194ac7de097e39e415a9bbdce2270a21da0b880f2cf85336155da9423cf8227a08462e9944eaad71930e30cea309bacc20eb656bc4ad55f52ff0db9c54fb2fbc69e5538cde6978ddb298d3e4fd41cb251d51a0cae6e3e7139131147b0f1077ecac60d180974cd0ab34bcf741f86956744c0a131d4e4c9ea50d19cfd5f7516bd16e828865ca08b1a4bfe7623690fcb39b72f78e2eae2c93ce1ba3876e7f5833e759587507267e7c22a1e0679591b960692d253b9627e16e2564a1d6f689c1f2a2e0d368e32c81f100431495cff188377f12a950f696b89b45f2e454a7a0cc01b0ec6e9fc191ab09f3770b6b01821aae6601a5437ee4db13c75f66697af790d0dd2326174521c5b2cb0a718f07a566d953c9a6cea9d20bcc7766869b4aeea695dfc69077ee6bd673490306ce7e9a78acfd2c31d3d5c61aa8233245495c7de0265b2d50620689c36c63ce3fe5f4067e21ff7a5251a81f27aa2785a966e5407534df5f20288d9789a1e7d6c558dcf1ef3636d5ddbfa1ffdc8bb005cde008f168b024d3aec7fca63a0f26a8491e907c833b26ce0b8d15265ed41e38a222644529f3b2f5fcee4ad177b3fa358993fbb31d879fe482e7157f349b539e9343e874e513b33eb0550549374bdbc276cdd60351930d9eaee39dcb6d6ba23822155f7eabd54fb5cde5efd8c0c15de4d47c481c06b1aed1ea064ea3d206ce70a319180f2359c281098d4e0de43a498abd653f9d216a3fc4260815b6580bf9caba7f299985bba2defad59f035da76bdefc5a3a0a5cf72822127eb53714e85cbd65a9da05107954d4bc7e17ac6d86773a79a33af5c7d1114d53c2991a83e692255a3436c35d842798841648f666ac88fea5f89f39a9d1021d122c272eebc813fd4aab37e28280725b42857027c2c31a67e49c28b7ea2947b068b64d93730b2f0b9073e42d9a71afb92e2d6c898f2cc418286823c8bb1e921d275ee10d9f462f60fc6deca21f30759a43f22be356a8b527ecb01086939387c16e18c1c6a9664146543f509c0c9dc4a8f8767ee3bec4487e155a7d780f6377064117cf51afe507c09d77806192261aefeb985be923fcf526f96f6ef843f7b5fcfd886dc4dcd9d7ff97f169cb105e230d1257cd63136eef38af562d2fc6df428b09ac5a425c7b6ee372e9d94f352a97cbf6234f339ee9ccf26bdb3ee8602ada73237a1541f26ff9e5ad2e650f0d329422c5f51a97439950d52a1fdf24fb1a11b05768b593647a8aec04dd480531e123f3b6dee2120b74ec6d438c386d13cab7c8c559d0394d2d3b78342b6def8cd1d26f50ef7ca81d7927410251c7f8d15f3ead8fbce5d3d43e5cff424e0f1db566dc3038ae9b881e9d84a13c202673ce32694f7e2dfd551593d653b5ab8bd66a2ab737f611e0868c6f55bb52539b0efc3ef90c15dda1cf1759d035e19102d4980f5383334f814e07523d552a87b5add3f167e7898bb9bf32002a5368fd8afd88c92a1e08cb146a5562888401062491f392e5da756190fadf6400ebd5d2b03f4d374af990af69daef0145751e075bbecaaef447c55e1900bda778dd9a6a8945bc9e45d39f38833d37eccdda6c018b5f643c108a7822361155da947d871e8b4850dabb30277f6d4e418862f253e405c4660f2a4de11c702c05032dcf3c1981e7df5fb1df0fa244c810fbf81333efdbc8a4bb07434605bb725fa2e2ecd404053c7c381fc73d736dc0ba2a05c48bd5fe32cb13ae9071d22d234574c7758996dc95b728919e4c1a410a9b07df6ee2fb0507fa7a02cf8d90f0718ea1d03610a11fa268f13c29b1b36cf31c083f4ba2582a57e14a5be0036619698ec3b8b059fb1cfeedbf8a7994099afb9f66513e93fda7342afa66b2719e4f911f401d30636f9cdbdaa25b21a255ef5d2d474a100e33a36f7f8419ba41e8b33f4dafb1bcb46b5d73aea8178b981537b09e18baa1f7cff88ca367c61bb0d0686f5d7aa9358120cb6364712013dac3827d216465990951e421313085b0585ad896055fd93d78f00048f0be6cf2985ed8de12ef54fc44ffed0c0e8172ae0946e3b5e11ce0b8cd29e67bc4d78669f083e93d98c98df73edfd202c0e6b3c02e4e4c271552a472a5a9381cefcb684dbc15cda2bdbcf576379bb1b8e2b727da3027498c99ac59175f2ddc6aa5348a1c78edfd72a336e10e48020f7666684973205fdd9a085f450ed8bf8cdc0c421f09070222d0ef661c6a6a70f5a8fe86570ef59d6fc6fb66272ecf2735c506eb731083478bae87b30240ed75b5a6ffb93cc6c0d91ae1f10105928715fdca67b3584077748c4ab3252770765abf4d22bd00e6731103590e437f8995cec71117388b2842e8cc8d850414ee88c129c0ae726836af04a2d8454123d1446a660e50c8826cb7f70d85b856af3ae50634f022e36c2c62037a82e7e87cddd1c38b3790e69866e5d00622ac8a20f46e8f28580dba44d6cba3f70f7e3ee497b5783865b76064d60428b1f5e1eb79605285c37423c49497c213ba79321b45468ee10b9842de4ae4703dc4f28275e43754c08263b3fecafc554f7f9eb03566f1f55043b6540280dfa9cfa0badc5eaec4fc536e9fcfbae76a1d4d38b0964bb9a0b53b0b01213190837626266441bdd56d83abc5a5bd8b582fd590083442eb02b1092d866782f6074905b43303a16d8106b4e12d3c02990205415f5b264f933e76777c8a071f487bdf682e27b5c1e5f8ca5bfc4950237189f535a459a2a5a03e37e8b249c7a3d2dd9f9cfd537230f1bf10e211bcc4c3f0fa7add76cb3341cbcff768761146324034e7fb70d4ea8e8f09c4048d267315880edb757a553c32e02f774bd4989e04140b18f2a6db5814c23f670db0451267901283e495979120207e6b9ea6c32bc6d15067830db17f2f67c30563eac546ca8e476c0d653360557e9bc234b48d84e1d4b85121dbf6395aeda7a2cc946e4d42ab09067bc4ce40791da5331cc15a8aa7a10c0f341f2212974cfc3ea0b1e833d29fd30f33c52def24130ef81eb1d5ce5da71fcccf27615fe9999bb426b8c5cb1e0542c59c900a30680cf604962113a00c3040bf10038fcb47d89975485a051618fcc557be3096b859f3aee2aa80a4d9bf4dc32ac3a0dbe0d9c08dcfaecf22407e6f307a32735bfbde26fa4ecee56ef19df6f71703051cb00b244e87dd4f6d2be527f2eb9d35b7c4c27ff6530bddcd93dd3fa81397900d57d68c02e5fa235615b432b16b5bbf81aff5143e90887c48b6d09b8523229070cc8dde5492339090fd0af706ae6bf8db1c70861518be77fcd83e8b99b0ebfda4091d36c7d26e01961b37b216833b063cabebe40c42fe2885fa2126bea0f7ed24fdafa89fd355952a0656b8cf618ea7f5920b391974352c398f8731266ea38d5659501849dcaac306095157c9f2b1dd8a69a4f152f9b93304df8cbb139f5339a43e9718d057072c35ff3b036e36331f9fc7aef3858c013851bde9e01f67b7e8abfd83a97a1357ab8d50881b4d8f23c8cf11ec91be1801b7adac6b3f7770f6772b691d4cd78ff6980394568533da9bd234feb0099fcdccb3ba7f1b9a0aea07926342bcfdb3b547df9a1c384e62563e7cd6011b81ce33e2e1e0b7f5a4f3f546cf220f54f2649a1e0bac7e4253e0f16237e02276ab8015b04235d409105992cf01faa2b6c341d21164971e641f44606d9a5b2145cd6e5185871ec2d937a25bf407b5c2fae9a6279d00faa4316f22469f6411970f33145fae7b70899a694a7e87d55c5e3b603521ebe0730f9465f21f0f74a6d7c0aad58a626fa7c68367d877ce5f1b51cc15a4d5e1761d383ba7013c8d3d88817ea3a668ad28c70e8a0b4de2116942e0a747f830fa364ccff257562e91b452ba15bc71340021ee25357b775b2704680243ec17ccd8fe11945d4addb97e31886560b2c3cb2756afe90be7509b19a224f2d046c879e873c1d1746e0f968e451ec9bcad728b0977334b47c8d190e35b14e99ae6d611f5a678ca15070aa05097f6b25f4f32e7abf8e4497e3c1d86a62ee2c574fa1cb8cd8eea1fd602c9c61fdd8c8ff6ba62b5a88f9c355f925ea5b3a5c5a3e9e32f45b269a3772f1de829e86e6ce45b645611be50a02f7f74f3289cae53ccfc0547a2f2864117c67ce75781a9c6c3480a141d4198c04e1b68622b57e5cc7a60497212d4d327f20d794fa37a51db64f50894c27054b76f38a1a9afd5f336e210c6d0c235456a18e19c12650ad9ad253287243bb564533a295ea16a83e74098ad817beca9d123ccc4c1c57f4148fd431caf866202439846e106fb083bc3da4903e08e4218199fda20035907e01093c1a846d3adfdf4ad023233a317342dd7b0b1237546aa2c18b071a37df45c8098d96d54fb7234fd33cfd3d4f7070adf59d6c585ff6c0faca2b59bc4908037e70b1ddf819dd649096fa96bd29c6202332bfa65a824eaf641493896ccee984d147a60727c0c56c0b0b63f381230ea8499d31f3ade9141e8a5f284b105e47f87be1713b70ff030e15f409e45539c15fb80e55ff508558f38b6138e826e25e3079c522b1911e60dca011a19f1ed58c618524d1775d52dd628e7865e99fb26a6f1abfb4d926ca7cee4aa91a80e758f520a62b619b8529ff004966a640a1daf479242824aad6f719c96bc00b2a51b04d0302ecb48ce33e87fe8c9225622b0008b70feb1b83b8cd643603baeb10a8071e5d3756b94bf14483f83da6cae3f63bf7f104ce863060176982315a7c5780a2b5bb4816467225fd1990a69ecd2e4ada0a7cc018be2eaeba87f370d4afa7e003d00516285701dbfa8fb3a0166072901fe5d3f2949fe30c1b9894621d4e7c81ca0c3ac7bca8d393c4976cf304b2d05eea05d59d4b8d77f3bccf1baf63600c36fbf08979aebf6aad88dad1b20efba5472e86ce282a281062b8c68d40fcb782c210b741ab627cf6898909348283b5e96d869e119a1ddda950dc6dbc16826161ca2559a0de36e57651003b115745d919c4fb770c96519607214f3e3f3aa7747b5419a9bc02d4215d35318fa3550e8008af49741efe03b546d80e6e91960bad526f4527427903154e720744306e55a7beccf1078617d8c88d2dc06d85625092cc813d7b80c7ccec0a227c0489122de43227382339cd4bc2790e7b472d2702d917c05ec75a2d365b53bf8462d09a86d9b72223028eb55272ad2de61e5069e64c4bb4e9efd5d9959614cea61d8d283a8d77b1172648612179cd012f3ea6eacc9f0c14c58e41cee236d7285abbb673c1b799d5bf24ca1b6a0f1995a234610b14768dbf22335fdd2b8ba4eb0581c73e7ccfad48bc5d501f8d653d5512973f88c1fcb3abfb3c0bda724cd2f24b24394f91960f8c51571a86b7150901335762216fb7df1d19f155531e5d12825ef24b74c693500f14d848f8a0230325ebf4a07d8f6a024abb2d8d35acfe50ef7e98dfa55f0375d8fac27fbc2532889b872ecccfba9769d4ab425d2b702dd1fe6d3c10fcd61d651a3e813cf3ea97918db6f96fd2012472a7fba24a1805616eb6384e39ba165653ddb5b03066b847e8531082ade9698f37500ef7191466f41ec630ea7d677955a20050235b89d1e87db2d0e94ea2576bbe7a182606f41460098a06e20b3db5c9eec044b0ef0d6450ab197da2ac6ebfea3aa2867f4d8b78941440f0b58c1a9115cb65982e37515124aa2c4b0a6b1db2166ff2c54678721af121a92582ec5efec4ef064c3722b04682520ef1a9d097b9c2d0be3ebcd7919825c4d376a953e120395deddcc2889b43d2031ff5b522e22a633eabefce12cd521c9f897ab871ff2bb30300e43461b7e91228430b0275167143d076653a3686443b48dbf632e56dd4738f48e8f64274cdb6f59b6e5bafd668104a4ae78442950d14f150d00ca71ed2186fff879c371be31c4837a78506bb31a6b86765f1abbfec329591f06a0b8398e2685ee13f1fa5f7ae8f7659abf1fd2656e4f0cffa9a80fc18dd43c78ab80a1da1551559573521a62f2e5320c13322881d444bb6bda8b9c9d9b6aa4b91995cd63994ca4c96d8ab2cde0c3b8f28828a46eb8fed0a2addb952e2b8cd0491ddd0d43743c6b1d4606e6608013c60d243a2ce541d8dbdc22409d706148a47b331b0c400149505803d0854e82702b17fa9a7de9c8b875aef61f6a20166d39875f947e5550e7c36d31c7030f4a6f25740b61a287cb54adbc5f158f759517bca24bfec04934cf0bb3dabb5cbf1560f5b91c48d402e438d266ee3d4996ac8104c4ea01141beaeb632aa2f134abbe5724af787862d9e5711f205eb1ed1352a962dd16f5f0a4f4ff5145cac7abf968832c20ec2c986819be86b4416cd5adfcff9a1576f040488212daa09c76b1bf273f25e75bc7fc47bfb664129e57e3126597403c4b76cd4f8484d290a8ff4e49ad9c091f8fe53a0128028ac06bac7292c2c00ca3ef1b49402aadb3fa819d209202499ac9f12ce18a7e2ffff70632048f6931238931403f282e33782d58e1ba128d9cba152f93ed9155ce45d1ac0fae3be94c46061a8e7408edf58e26f3940067f7965c9ddce2cca01a73f522119db83b1ef030ae880be7240d4b403e3fb98d74395fc145c0fd0df6e19cc0119e8828385bbdaa57320fdd27b8a1c8cb48b6187c2c29e9ac4b1cb2e74021bd6d89ddce41bf068ad84d90a5f29c67fa4990bf2702d0f8160d6a25a4194e1647895f6e51dffbb90ecf8eae7cc93c3dce87d3b70e7e7c03a67f3354ea0c0fb53b1b0f799d466acbd345e24c8405bffd114c62ec7783dd10621612626de5bea154d08f02585691b6f03e8a9f2e83cc7a48eb4dab2a1bcef688ecbe812416aac9db2fc662cb1d195f34898b3c4fda0adc95b1a2159ecb1d53bbbb08ca7aad038b84bedb5185c9978e35a87204beec6987059168a2bd2cc1653c39498e48d6c822544316509c9c78af4733b2bbf1f42200985113f7e4fa2b24055a9326e2dcca1e6391c54c93c362c32247c9b836ecfca1b3d6198b36d35f5e6c5ba10a84cc2ca974b948e3aaa705f7aaa8414352785f2bb25789b602a0b746e4d86e151c5e4767f93c8432af57c44776ae0e0438b04510324d23fc5a3f1559394055d2a8e3affb44c8a99b5bd3cfe3fec4a60d43b085437e93fa8e523e2315fff12a11fbe4b09b19499d97815be4635c4c7b28db9e9f66af2da766a1d3dd91c67fe5679d47fa46e074a86191d6fc51a145ee1618893391d72f4ab6e4e4b28e5251785b2e1054be31d519a91b5757b503b6df6542e84b0ba715abe18fb17ee6265dbc8ffb9f81e3d587245a624dfb0bc8743ed5dfa39439bdd6d5b70a7b812a097664bf92b405c75ada7856c1e3df551aa7427dbb5c019557c60a87a0fbc4da2906dd68015d17ac5a5143f8f6988fdfcbe8c4f81df8e1d10c3d2fa1a9c6c956049ab550a75c9f3616c2167428f69a50aa58995cadbfc0a3c3b819e3961c48261c06d4c5b94ae6b3cbb67142c2145a96e3c408a79cdb68b4d9ccb3876b03c2481588ad627e4133c7ad788814bcf2455e24b5f4c5a51bd889d5be7baf7b2a349ff73e02afc98fbefc6e6f694053b5a5659cba7f4818b6f9f8bba261b711cae1000de6c393bd511053f0570a797ac53b9eb452998b4a170bde9c2884c32d90f7510d9790e2f5586d6cf3e01483d5de36afa9d176cf023e1b011621f5cfce5031f805a4ee79805deb972fec7f893a29a1dc28c8f7e0bb4b99dc61f3209d144a2694f5566e7f2745385e07732e11895bae4c2f3b0ec1d24e251671730cfe4a45059c01958740fb945c53ee3c0f87aca586af6f8ae865d7fae09c3ef6342a4009af78ca3165a2ceeca0024b6092560e2d0ab379f6c5e9548f07f394eca45d368318600bdcf17d5e1cd3a2040405a0c55ac9786543dc47120ce723801a2eb9d2ae349ac8435ca44999835ce86ce62735644f7ee6a8127c7c216b91460c040dc0719a0e616d8a95a2bd5e9f96abd2aa5d691b9c498664009d0e2c37f03a784140137e9ee18c04647880e30ec8e78ea634268aa8cd36a712212508a217c0e7772ccc5c4fa019991e22e9f8e19842760bbdbd970192fe29580fddd5a0e475403f18ec83645eb078f97f1f6ddeba1ae216206acbac5b38ed6e8cd601de9115e7cf5c07dedcd6cad950d17da072182213206f623710b957664e605deb07b871ac6d01537b27074f4f9102a4f4f397178c1c0944ae2a9c76e4f1a37e99fa5e378c7de728dcc11815580009860242fd82d4a973f18f81671c2ad2bb0922ee9ec115d6b7d52e226877b2fa0c4eb89f2a245f554302c488da8f93460025f7fc11a1713fbf1f85d7a76d3cd58564236495224aba2f84146083109a88349aced5e9698f43496b9f28b50a01eea07858dc32bff712b721774072fa99b8df74e2a3d5a8001ff6e07a8f21ae7b5d63fa8af6c2f7b25d4df914a547e05a3f1bfdbe4768439aa6d7cb2074f2c59c84481efe6ee6b83615dae0da320f28c3258fbcb86eb3d57e4a8a471d03a36682cbed62bcc41a83c54e35b8e7925391f1e5351b901184aa10ef8aba5db15b64e562ca153ba3eb57aa75d44d23eab2da20809a5f7a2c8a9f457af35a4467e23a767228a7b41ead4416d026b7b8d9bbdceb35564264f5c1730c40609ead2b58b8f34a135e7a70070ca4d4ee345841fbc27cd9bfb70d27c0613e00ea0b0ef66b9c2cd3ead223eb171ebeddd44b0e3882fcaf3b15d658414c39212b4ebad0e0448e808238dd3fe38ae328783ad748d6017686e6cd1dd5fe09c1a72884e2e0e30d21bd79c228e9d0f74f78d0f6ddeebbb1ad42ebf051a381a298fddbb0cd7f37864331bb9d6d4b1fb4bf20ebd0806990445c1663de8c8db4f5a0a5960e9f03644e05be2a051711531050aba83a8017e006b802ae504e82c6e33770950c1e7b11d54dae7e8137c6197394bda32cec1311a92669c1bb76279194d95d262a31ef01423fac825e40bfc876976c37edad05d44f093e7e153b819a72645393100f12af11bacc7a65ee9dcf7c5652f861fd9fd23c9dd4d2ca346db9cbb3cc67d596b435d496480d65749d29a9622a917a6d0d52533548bdab51dcb986f9be2996a733b5b596cc74ac2116f759a27c506ba6b7dca84dedb364524b612655407c2655411625e2b286a1364b6be4644fcb2495d6b795bc294a6c524b7f42ed062a4d4b2acd7c29a2b295ba754e551d2a9a4b94a70e09b7ce3c754838669e0aeac799c92eebff585d8abb3e5016edeb52853eb957e6264fa599ee6bcf72eb958875293e463d506672a63348d074b4bac4a9a5f02cede9f4660954a2a933adaa6c9a36b51486223e2da9964ebb6b2873be590a52cf374b8fb2674c05527faf8ca0cf1304b4668a42f388d17caf45527a747c723fca9ef753fa517c9e7a74543594e9a941aa4eb8bfe74ffd68ead1b406fde92cd1dd13d695b832f1f9253a56f4758ab2e7b63895fe994d9b77ada5d50e5354087e348fa50cb955193dcda0afd36a66749ff9be36bfa20ff4db92aa8a669c23e9a33f3e5ac31b565b779a758aee70ccd9e5cd5adbba6d36c55a56fb24940a86265d66f4adbc4e59d3cc5797f86f8af50e0f64c9d569557f9e250a4955fd19d6195d56d59f6168b3321f48ef6bf3d6e58f459539555f95ff7c54cdbba2b9a6d28a3f95ca3bd439d8cca4ce29344d9d4abdbae7a3687a13ee23b5544bf8b4e7bf6a7f89423f55b1aea510976145619b172b9a6bf9b6aec48ac75c4dd3d65a03823e34fbda142adfe03294b96276c292d67f6f1aea5da28ed4921ef3b951796bfb66dd96bc25a942bf1ccb7d3ec6655857e2eab4f52ccf53691f2d6dd4a666305a92bb3e2aaf4c9de6b28a0252774c20754abd90cdc8384fc92b643f85aa64f4fb015a07ea05eaa34d1a862a11002a403a942e911e49b3bd83dd0277ef71981db46dd02fd03f3368b13a6295ae72f8b146101aa400d50a802c1058c202636504560660058a151deeee56522b3d604101cc0a8f2b4cb8c20129570260c58d21aa18e2668816b008014bc682e51b5081f488019017439cb15ac18a04eeee300de8012222d78145d580ad01650392d08039884801111020c2882c380c31042234228270048f117a18b142111f08a2880064d941161134c08a2c3d1ca105892890f88cb8c3882a8ce0018915b474404b142d0038e28d2ca90e01122440c208304ac438e006eeeec4611ca0c5019f036092e892040560925082841e4b94b1440496b0304bd0a0041c3b0ea304144afc54b132724149135234913681d3840e304c3481092430610126966022630286263cd0441850d80003050a4f70e0092ddcdde4304f1471a20e27a03831d3c4139a4063f5461521aa2079001baa952a870774f100264ed400c609221210c5729807d030032896804267d56595461528559c9c3f5067ec0c00e5836a61e706b30b73ef783f3f4eecf420c490103fa09469c0ec94a50f393404a9e501ee4efa387581c5096794632703e31423dee9c0f8630705eeeedfc69fb1e30273e706ff03dbb10307f6b9795c2cb6213a21c6c0460bd6b438f0c08464845a7862300d99b0f0cce0ee1e841c415cb1039a5726a992d0475fa5d1b7423a4b14b695847eaa7589b2bfebc9923e4ffa645255491b97a6b084f18cb6e6ada3499795a44d8b2aefe34a32b3885ae94a7a943d2b69bfa632c5562a5348b834edd7fa5f94b189a954a6acc47a4d8b73a84ca9a44a0a7fdbd39b8fc31ad6bc6b18aef6a3e53ebfea5da26188c310bffe9d8a25bab7c53b304f60fcc9194fb878f2043f0a25872774b8fb3ded8d69a130018508faa30d940e387ed4be7903e5075ee480c7069030617f0f4c949abf68461205c8ddf1e34c110505518ae08e5f65499f1f6ef8c107fd53b503f383951b947d9f1fcc7037f2431e97e700613ed981e37fe24eec70d28690932a9470b29d60273e4e9638a171a23969c1892bc10e397cdce892c619647cb1c5a78a2878aa28e113e463621c1fcfc7f289f1a9303ede93871d6df4b0d193468f508f2a2f792b1945f2dac999a3f59fbb8482ad918c3e1067c98409b6464e275fe26033cd505619ddfaf13e4bd489a6a2ca92fbadfca3a3ca923b55921afd53954d28fbdbb45fefd7765b6cf7a34ca87df39a4c6bfebd681ef103653495b2a6179f9107f270772c2b9876dbb1fe99d1277daed257b2664e554645525b32668ac3e8d44a6a9bc4452da44a692a55996077bfe2ee2387613284bb5b91a9f1529afb4f2a49e7e766d3480ccdfd27e8ef33cd377fb23c4ca070f7d59f2c0f932cdc3dc86e8b3365898f848698586b50216212c344061f090d2d49c2123bd6d822471b3e121a5a92861a602c396389d0922d6a6051d2fadca960b8cf073a524ba7fa3a0deb4cad6018d6990aead2ffd87de6d214d6995a2ac1303c1256ad6daa6e9d32a96018d619f37496bada5a7d20c21c3e6c01e343ea03ca871c7280905346ce144a08e0ee3eba817477cfd1727c08d14898bcf6518d4f4be21c2654a690f0b5660a9f569754a6902a46adea54659c8a074c0f5c704f921f920c200900f07964274919ee4ec461926049c1475b8447b45312fd45155af6941e92783dd41e60465a0b3df828b3636894ad917141a28451b6c53df5ff833ac2c5dd55ee2ec28e880173648b8f8486f42ecf54a3796badd331ffa3e3e92c498f5feb177b2a78c46747a796ce5c57a74d2ded3fabea4fab649530a09a7559d107aa3d15a783c191c1dd81709e70f792c3e098dc3dad09b24c40d0a7927e6e5e4273ff89911ffb50f4cfcd4b70f0c0a981bbef1a10f4a1b1dbe21cb171778de377f8486868d46409a32676dcc4d1e586023753dc60317d243474e3b3450b44232efc6689fb0d8d8f84861e600477779814ccc0ddbd847af453b91ac1a9f9ac5957d259eed41919524ccd256acfbfbabeb6b76e8d66552571a5acabb59e56551f65f50f9a55357ca0d2b4a6d4ff8f290cf1999a76eb1407fdd3a944b73d9d2550467d93d0a4fad374661054bdceb903823ea158f32ead7619f4660ab55331349df69a1e4df5f9619da9b5824d6a290dcae7ca34ed5977c5bfadf968fdefa9257d2bfaa98ca648a6bde52ed15b773ef58953676a09cd614f98b28f92ea0ee13f927025e6d412fa40e5df472b3e6d097d72e7476593eacf7f7434a9fe0c33a90a49d755da32d32c95705ba9c32a783acb3a33534b5a8f19bfadfaa6ced4927e7c7e6aa696c29d331afa641d10348531f5ef994ffd28e9c9ad4b3457d59f39b52413e69876679f30a6a65a97d5b43b6bfbe87d5cb3de652dd5b30cc37f144958d1dfa6d525e963eb98ebf7d492884ab5b6b5ea12ada63d73b94b8c6d3996f753babe585716559fdc3ba7fe067d25556debcadcd7061da93542686ea8322b6bbe8ea95b3f86522f6cbf49bd8ce0d499aa3f7082aa95aead8250ea6b6ba4ced412fe175fa7f6be887eca3e7953674a3893fb513798a84d96784afba6e8d6152c61fb5b9fe53eadaaa67995c3f7d5d2937be7b35a2a21fa6328e551b6a72201f3d5c07c3ab83be8309e1d9e19421cc673c2c3e2c5803c7c44f8e4f8a238a201349a0608189a223034170ccd0c30438030840543b080194265c801401a804f80240ccd16341418691186bbbb165ad8a86c8ac01421421117c01479004c11223cf800860731dc5d89c3f0f03c8c6a9c0053d3454d15989a1c465ac8c010d1010c110fc0104111c90186a60730341aa892c5dd1d06bceeee232d363072a187aecb0e1edd962eca4e0fb835b82c4264b62f60b6201e2a53fed1f15129536a49eb6cd69d6633adaa6cbe98d1b73273e6536752554f1bfcf8ffde54d74a650ae91f1d77ce685d8975bfb6a954a6a079c4afadead191ca1452265552a6d492cc3f3ad6bc6b4c4d7ba84cd1e9b65b9b48a4bc2b0995d151ca945afad4eab7bd253e4d7b96486a099ff9bece7bcc1595d1b1566d558fca3dd5dd81380c1601186c0aa60236025ba2dba6be090c860277f474e2027e20f4f53781c99c6458ecefc9ba884b46568001a32581c994b0755eb2758a03a36171fcaa8ccf23775c5dae33c8f8624b1551289185bca6f85c34da85c3f5e38a61249260ae16dcdd0180d5d494bd26d59f4cf02b831927dcd107caa6bf2510faba54fa93d5fa51f5c99dde0f7af294e6f34db1d43aa7aa2eeb985116a6c4c5dd77892a97a00fb42304859218a52edcdd4b5778007c34c507ae4d33291416a28560ad7b4bdb845cdc65c7abd3326dc4b0eddb6640f0d34fab9852286cda6f9a3665d2a999a2d24b9e4ab29a5665517c3ed0a3a98a56b37e7abeae79572315d74f71ded534cb9f954d09417fd425b9b5adba02559b9947532bd496b71cff7c23158654c4ede390aebf99e2276fcfe92c4954b8fb0395a64dea5f090c4904eebbd439f538a62df7f930a42394e398ea3307668600eeae4b74eb6fb2da252ed32ae51277dfc161668eb81b393df148241c60482d907cc00451c21d4186da8009820697205b825411440977f79714b8fb7518209a0e75c28aeb43d168e9051d816089bb63291819897185bbbb2083bb43e18203744822090b805101f71f8d961e672535511c26660f77bf18f0c4a8032da0601a75408b3b111dc0e164a7888cbb53e15e85bb8f0eb30319eeae53c4dda788c0488a9a1f18dcbd74c13d744ff2a628966756c2b0923523e2992fd14d04468729ee5fb7b66645ff3ccb3a04ab39d4b3d4d5aa446aa8e79bee7eb93b0f2307fce071f705b87b0f233289464b626996e81e22872cee0e62d0049aa91d1fe74f16cd5ba7713a4bf4f7f92a403fc045948171cca20b8c38c086bb57c15fa50e49fdd63f379b5fcf47b15992b7e2d3d654f6397356d83e6ada88a294f6eb47edea7ff0afcc33df331d7549fad412feaaf7996fd5bbac24fc4019b5c20a2bacc0c269eba3797c2375f53f75b5d112d7273746f37db4eab27e6ada27f857d6441f68a79eb6e65d7f97a8aada7c6a27eb24613ac3dd5326ab7495b099fb38df9937edd533ab5da2362524c3bcfb9f88bf0fe3eefd6b06956f494cc95daed0adcbd3a35736296c30dd8bc87283bb63f12b3544e176ebb324af45cdfcb65b1b311f957bfecc3afbb5b6b941a5a8f22c99a8b2f946b24e461f8895911d27ee9e6ddcfd3cff27fbf0649d26ee8e7277254c76b035b264e7f334d127f7cecd599e4a34576c8d9ccef22c2dead18a3e2ad567bed168d67933c51955f199d6d3064defcda74d0954e2bc295ab3b440f64ceba3f64bac53d48b1b9ff8b77df4d6176dd2aa4bfd69957a9675bfd6b63ee973be958c8ef551bb7519f4484c9b567952db24eefe5392ee7efabc2b7eb44cab9c654da53f399b4f6e346f8bff3c95fa4ccf9b5395cf9fd3898c2a9b7f4f6b5ab1ee33cdf7da5a3a953ea6eaffb13e2aebbab2a99a775dedd22c457be63c9aee74ac2f56d32c55f8b7c58fa6db9ea752576cc54a6eb414eb3ebfbca7ada7adda922a54de3abda57ada7a96153fc9be68cdaaadaa9aa6bdd5a6a4ff812cb9b2a8aa87acd0bc2d3e2daaeab2fa68b464d117724bf4cf3f91dc9d8abbff38cc0fd2e92c379a459b9a5a32e8eb0acda8473571d10a2fac4cfc38dff33f352d90464b2bd1a4b54d5d3ba2bfcf72c68c19547077bc4f7b96a812bdbac415959e5f6dd58f4ba08ca62a4a5b95ce49f06f34a7be8969b745e2ee4c909cced2dd97e8adcba023765b9c7d3efae499e3ee4a5258e2eea78fb0303c6b116a44085129ba62e34a32fa56ea4aac8f4ba012d7bceb4ea17e6febee3e01247c0577df67999e4ad19d0b1819e2f0bccfd26ab484cfdf418f7feb3f4de8efd284cae868ba9fd29b0ceeee2ef8388c0c41b86bb4b44bd1c32e93463f653e79cbfd287297a815a21fa8dc25aa44531e76a575ac3b9f66aa1f15c2ddab38cc0150eeee830af8abd421b79e96dc55eb37ab5e599569eb4aac40e8e3b3443deaee39268a1eb9d9346d54d91cd12259ca2b9998aad1f2cc40192583636a40d0c7b48f96b42579ea0ccaa6ce5470ccdf53c170cc75342df9623db3699af6d1df8f2ac9e8989cd28fa2f9ea2f8561689ab622808dd10f38463fb4f8e164863d4633c080062868e8463424603403d00c3bee8e001fcdc08d68b06201538c16c064012c28408d9102ae28e086110d3ba0c185956964c30bae8c6c8819d5e0460d13a8e1a612a1a65151a36a1ad51616908308dcc0c40dfa06d40d4a463ac431d20103231d88d001480e2518e570ca6100231c8c80831638f830c2a13484d10d5a8c767862b44337da6185981f6260d8410e1d70c8a18b8c4dcc1ea3183076f071c3941b9a8c6e10c00ca2047c314a001e256026013245cc60c60c61cce00502706490e3459301cba0dd1c808c9727eeee0768c100432fe5c800340548a34a015a88210d2262d82f4ac4f0e385006410c07cb1c000f21880d04b1854a6489942b2a99f5af9509962227d6ab54df8b4363d9522caea12af44522599f65129536a09063446303d32c068c0660403022e306c81610a18b4c08061f019c1b044838166755a2639fbecacf3a6686f69a6521c9eac834f27aba08cf28ce6f7641d27a62dd1df9649930a626b44a3252120a8cf5c6a1004c1178cb8bbc964320959a54c9c514fded4d0dc7fb2f5e3924f2d8543542a758852e9ca10a5d295556aa44aa9a0265da9f53c52c1fa1f62190eeb696bad2f569b0ac65c51c28ae64aaaa18c4ca9145349315894b0be985a41a9a5a0df67c6a960688a22939b2816cde3a97cf481b2d6353e34a81b8526281b29017954d640869cb95c01d9f904a24b9bc71655ee14ea4d411615d6d3a26ad641735d99b786278d0a49553d9da50d093fe9b4f5eb0a760514462a1041852a54a051e11a05008e5100be180d9165b4c215eeeec4472d5c1608305a41032d34c1dd93f8a885195a686124003046028862248019166a3062011db1b0c3a8052e3f2e4c71e189f91b9faf03c013801a001952e0324a614b0a748c5040e10b14ba70bf3bdd01410ba84626860675a32cf101878f2efbfc1e1f72b83b7e1f5c7c90e14368e4638b9ba23d9d3c9a9aa54582cfefc1ffa6684f27252c9ea8bc4f4bf2984cee2e72afe223004001401e3333a5399a1ec8a4f59fa88c4f8bdea01b64c2d8aecaa08ca6749a51ab339ff6f7f9a87d5f8847ad498b16ee2a59333b6774e64b74336108c94541fcfac147222ee8ef12853b12c9801ab38f2a9b6618567ca4967e973acf9cb8bc657a42d3f3819ec0f3842c469e8027e460e45446be8191a32009cd138ac440c913626210840c31b8f20415622001224642981a57d3beaeb6496a53df4c557ca619490a7838c1b5e97496a8904fab3c36dd0712a2cf5c5ef7da042552108d4e74b8bb129cd21652d14fbd98839e4eb65a336771863c95641e622b9ac75adab26de3f25975584f6bdab44a56edfaa417eb98f56aa750af4babaadab4e7c926df1265cf155e0276772a96900177d39ea7b2670931d8c38a3da0ec216242184c80c20477770970575a4966cee21e7034e106779f820519528d4c25a550374ace94252c59c29025584b8859820c4b80197171831e71e8d1450f0be811851273e811c4c40128bcbc7001a3474a0f3d0ae0eeae878f9f5c99dc4441dd284c6ea2e834154b7ddad42328e14641828cbbeff37b9010c5ddb1358204943bb64690700412b698a54582842f903085df718438dc38421a671c418c2f8e70c514eeee47d072842c4147481d8174cf28364b5d4b9f5ac915ec412747a7890d943c62083083c8002994343e2ba875a8b5f473b746cbf4b199635095492d89765bbc430fb534e6ffb1a89ad12cdaaacae78fb6dfa49656db0624dea6b50dd79aa94737afa7a7e2df8f8b205484b00803c0830e778f8097f2785b4f4f11d670770814a10e779742c4314210778fc20859dcfd014b8c0086bb43a1351e68e021061e5d5ce1848f8486aee0b1cd293e12c263091e3834241f090de1f1c3dd1d0f3cee20c21d72dc3174071b3e121aba83cb1d423839a49da6aa364d2b53cf92d4964c5926b52463b7c57957bd43caa2626a2d85615d89b5843e6a53a45236eb8bf5cbb3ee33df30d4a91061986efd63deba34c9bb7f1cf359a274795af23ecaa2fb81deac7997e69da9fa66f3965b977aebd2ac614d8d0f8d0ef77da06a6562ea2d537957cb24c4b234acbaace19689a9af4d8ba496c2f0532b72675d718afad452ae838bbb1bf1da923c478070d58183375325ea03841b77cf82654eb20f060215ee7e258f678eb64bec8083093bba203821081a08c20f41d0801004777f42a6927c626e99ca3e42a041084adcdd4a0da96d1210f4a1c168bedf84e6fe1321687777c28766dc110207dc496d9308a105ee5ec4105c7077228630c5dd9bf021b54d320423ce5fa24dd36608327077261cffdc6c1a19421eee7e850836b8fb12765b1c10f4a1c9e359471d7554a00e27eac05207ae634a1d4bead0ea20d5f1a38e14e8c8a30b3aa6a043d341d2118af1848e2538746874bc40870a74f81d3c186a638e35d010638e2f445be688628e2c41a48f84865e08a239a2f0cc5144e4b9cf11e323a1a1390e30470b3e878f1fe4f103397e30f403367ed085699622fa3ca6d268534d258d4b7b8ef460c363e2b13992e4aa339ba595ae52ca3e59f50e75658aa8d7da467c2855972bd37ca0529f353481e0d5250a0473694ae9b0c6d450a6276627aca0e9b437ec7974dfdcdc84ab33e32f511f9a33973bb5537b2ae94bd4a76aefc24a9dcc15b393c36353437cbe7eeda482e1299ba6abc6d44773bdae12dd55f5670db7c9c4d49c31d7ac5e09cdfd27650552bd2e2bcdfc9995847af53f611d7398132ac9315d3508a867782a90aa655ec97af371c813d631873c21cf6f8ba6e8abaa98eab4ee9d73132815081020406a29a81c5faffe47a37e97a692abced49258c598d22e515ff1697f2c937a83f306383850020edec0c10970d0040e86dcc08e1b78f18602b658e30d19deb8e28d23dec079438737648024086f7019fa8612f0c611dec0c19094a12770c410940e3161488d210a0c917030008e1a389c00071738aae880081dd41b5c918313c031948334075274c0451c03d0811e3af8810ebc8843481c40dcdd87a288038b8389bb7b1c3e715c1107153788610f16846e74e1c6aee286e6c60f1660194a83054ad860db604a046cf0830560d4800d1698a0067b0a0b565003ad063f5860831ac0d0600f164899928e388f670e9a51f40895292434a3e84b99524f9b5a7a9c2f18da5099f2834a993273e67aeed419f8e06f328325dc5dc90cba709f010a1c3b799c6f66e0461b066883859e2533a09981469ac18f184656f0cc408519c8200f3b6430240336d290c119321042599dfba99e9ceca3f1bfcefd54cf937d1f956fceac337e938c3e1067d64181442174772a0ed3823d486dc914679d0acac41c0142972eb7d46789eea00777c9d45d70171c7757229b3dbbcb12eeee802ea42e3fba1ca04b0b5d6030e29980bb3b8f13eeee2e701d162c6167b3a7824c6ea2ccf030b989c2f3620018f7971f302f10c28b480f5d0295b85af4b1995ed35e1d1113172579e133fa56300653f64910bf4e1fcde729c7648ad20220174ce15e627213a5c4e4264ac5d6487541117717e8a06e146c8db820087c7e4ff6f15c60c5fc70410c2e50216f4d92010224e654a22a6acdfbb8d6077021c2960af0808d908d1ffc06dd208ba6d6a2a96996a3fe934d9952da64daaf4d5fa2dba483caf1d194c934cb1fd30f6a518f0280091fa8fb307d943e48f761721f0cf0b18d82c0715ffdcfa766067f5b3365514284a42c0a04d1bc2dfae79fc01540b18232dcc57077fd27cbb346e8eef6b13e9de5599e4e2a589ef21215c8b1060dee2ea2c2260ad3a914e2d13ac4aa355526e67cb334043fa9531f50bf73b6fe5389a3d192994295a6ae64cddc075a5914b5ee3bb8bb751815b8bb27a1d19238e3c56f8b4b7cda1bf479f4dbd86d71f6f7e01227854293e8aded921b456f6d976c6d974049a1d0243b29148eea759028fd29a754c2c7f9a6dc654de987524bdb566d4dfb68b5a9252aa1cefb55a54a250ca5f0b01acb87524b2a6dd1aaeb97facf3fd99ab569ab2e4d5b4924f4b48fc2e697237a96768bb944517bcff2f7682b7e20ab2bc6369b40a7b344e57b9615fdd4abc87cd6b1acaad7412d0afd6d55aa3f5fdcf934cd72eb5a0adf74e6f09e693e2d9992fbad94a63387f52cc55c5f559b24b98952a2e803651e2638f574962ad20efa1387339a9cf1c51935184112239819c10948f082bb5b21c176772b29149a64a73b34f79f90008b0ba8044a48500412a8e1ee5748f095e049099470772d9584732c6a79685296c93fea63048dac0438404389bb1ff16828e1ee46f80997a86863822c26988141430627f0618230dcfdcacea44ed9b3e7040670f72230103c8175f72c27a080bb5fd9bad4e8f3a0400a0a46277081bb13910692347ca0600806051570f72b67fc38a3053df65083053bcc18524308335200831969a4008990195798a1c403cc3023c918665866c47083e7210239d2a043046ca4010321115c01238220356a44228822822422d02c11f8c8c347424365b8a1c61b656c89c24742436504a5c04a85652451438ba888e523a121355450461965a86107173adcf091d0901a4be0c285cb173e121a52a3743a33aaaa7f665ca679557f6e898ada7e5da1ffa496b4996fde194d55d3a2d09ffba47e923ead946746c97bae7a6aa9d496dc36df33d7f353a9d3da6d7178ecb6b8f4295dde1fc7af8fb54d0d773e5f5b3265a534ed598ee8a7bee2ffc94067e984d4968499c30a6de0032b48800334e080131c80c2016d033dd8c00938c081247480ec0001c4188118a418301d50d5808c700353046d004b164bb8bb6f40db40165b68c00e0db49105196769c99bb7d5566d55557c54ee0141d3ca9a8f5299526f1594699ba97e9d9a762a8c27c2f009438c8cf2c008bd846102dc44bfd00b30310895dcdd46a80da12c423cc08fe6dd8304470b4386305418d93deea0038c38c060230d30be00a30a30c0087277af8187df76f79cce729f16e8cd6f12ee3f85d5de0c98dc6b4cd3de80604dd5b6fad0d0dc7f5232cd8ca2ffd8a2aa2685a5259d250afdfdb8e67bdaad51e945cb5b4dd3feec843514536dc2af6d685524ec0292f7a9d4e5365326e165c26626f5a3e43695db4c51266dc3fa3a95d1626aee2777c635cdabadab69a6f2aee12a28a3a9b0a67955fa5219736612bfb6e24c9a5775cc396de984ffd15a42adce8cd3d7a98affb428b94bf86faacc4dcc4e0557bb0c0a9198a6bd796d8d80a0b6a99558f5e3d4bc6719534be86fb31c4f67895a5d8e39619d599d4c6a692cab59daf1e75af1cca5994915ea96a8bcad586dc5e7f7d42e5ae0a2cb288b2378010488011f60c0090c801860e102645c00cb480b1a681183950c1940e18b0e7c21e58b17bce0728121301750a10b3160bad85d38f1a28a0c2820030820ab78c1dd9d0bb740972a0e6081221688a90207779ebdc3a93fe37d3e6a5355025b1491628bd3135b2801c512abff3199f666f32a5d33ef6e8e3420438cdf60e400a2c36cd9ee6e23d69529da9da2c031673455dffc411f5557d62c5d54440b376ca84488546c9f34a1e97d199289f9c9265d966474c52263aa241da303964a8a59fd8f69259ac88bdad7a6156acf522ce96b2a4df0385f5044c3cf3d4bd37e6dc2a855a552133e5f9b324eb5c9b4af3dff4507bb2dcefb14e22c5116b5a92ecbae52aff4e92cf1f9a9374b5265a3772ad7136acd2a6653acb6e6525bd26e8b535467b23453a954eb72a7f571be56d0614f2757c860a54433b9539bd359923beb5c4104efac73c5f69bad73922b48e06eb3b38edd16e7091650b040c1fd541ac9d9078b916765a42433ca834519ae1f5bf49472723acb542a8e36d8b0828b18567471851558b61551ac48624511cf0a1cacf861850a4c1c91d1b762dfc4f6cd9ab7dea5887f8f25a9355a0a82021f104181a100cf102b0b0243a19667a72e9c1c2605a6bbd7b0421fe8eb59d617cb6adaaf1fa8dc16a8441f9bb4354d6b22efb66209cda5f37fecc6c99919cdd7b9966a29eb6c5d8e4025109a6a9504e4a0027377191c860a4c05162a6840851e05988036812613a83201a109ac3134d3c6c6060f69f870068f0f19a2108fd9c5142f24e1048f4a025a788c589dd67cb28496249c9cbafa1f348f20e813d6318f486a4943c00e776f000b355e5a493411804004a244e0e5e5e5250272b8fb103516dd4147a6a0c1ddafd4d4e454920fcdb8534938479ba5dd108000049c50c10a36f691d010043a0d023fb8e844108081800f1f090d4911c7cbcb8b146eb84bb1868f8486a460428a2c2a48c31d657feb1d1e55c96bff518c6db52b51eff296a6983ed06a6551a6208bd2696ad69545a19f4a7535cd7454053c74a2b59fe66d1d668d18f6bc9a6cc3a2f789dd7fe2d5b26f8688278a1ef6bcaddbb06c14ad276bb02cb5664a9738660a55d280600a5582202a3d7568dedb36118f6f8daf5d8f2f1004c1fb403543bcd1d2ac683db61d095a4ddc2edb8997f68d16c7611204514bde219f782fd1d2bacf13317cb931234110ddda5403a542a93b45e940037aa215adf6968633ccf3fe4712044d68a9d332711b3f0c671987ff5e4b82a036719ca6614feb446cdbb2eceab08d04c1df25aaba61fbc798d5b60d6f98287ea3488220086ed4088239685c96ddbfd9355acd1abdfb2408fea3e391cc7aabc39cc775db86310deb5020a84d5b67d274a23d60e3f5447c7dde777d9c15af4782a02aa3a7d2656df6b3f0863dcdf23aeb622408e2d39a4c19832008d6d89054b6898e85bbeff2306cfcecf6d9b861240896279aaf8c90eebbdbf52c8ccb2c2dbbb28f044113086a2554ce2acc7c9765759e66b187898f6916098220989150399b4ea8c9a44210f44d6846d137e9143599120064013235c6861d4ed9349dcef274ca260274d8210704e090801b80d890801a145011b00005c4d0f06386196c4800fe81001b6418774ac3014c579728037c896e2005d0381a6208caaa4d8001d45166c1e81d60d839bf10e302a985fda71d04a081b060ada0c265422920003f52d80105cc07aa730040f7628a117dd7b661f84d79a756e835eda0bfc103900414d6a843f4287bfa40618d22788521735da66c0b2224dc05e029d0a30d1b77bf2ebaf5d04d1e84bb14777787e24edcc77bbc893380674787005b7c2434542409a722765eb408c05dc4048d9656e83e5fc811334272a71e5750a32590bd22c0228237cc40c1dd51f448584f2b1393b2a8ea4c4130acd851a0c1e37ce2008c0ca04033c4398544aa215265827019b3c75f02364177f6f84b6aadf59c72a506e1d2f427fca69f6b51142a80ff87480d0a42d420266c661f48204253cf374d7b7cd3a4fad3c709ca1023090068e129a4606b5c8910a917f59183c4aa35ffe8168ff8c127e7c686c7e6a6d2d4205c1271d51922b5f427fc3732311a2d992c202117d52f3ea30ff0b83bd67e3410aceaf42c51a64b061dee8e4dff23196c38195cdcdd44c61632b43819d8d1ff41b3cab4840c8b0c195c8fb187fb1872b8690c36c638638c2edcdd091f038b8f413a3681d64805c6d8c668a28131ded8e7abaa16535df3594f8b1a41a1003a2853237e9da22003802c3231265dd6c095ae99fb40a669515a746292a244fc25ba77951af00af5790962fa93ad2a5bd1acb10e5029c449097da0dad3e505195da384d1e0c00fec221e38a0e36de08c12a9adca886bab8242c83cb3d00fa1182a7045186d845187e8125922212321b6077751c95d34e32e228980b88b64dc4531eea21ddc453ab88b727017e1e02ebac15d6483bba806775175172dc05da400d10f77d10ceea204b88b10e02e92c15d74005101dc4531b88b08e02e1a8008c65d0483bbe80577910b2201b88b5870771f180fa4b6ee6d2f60d10a2de87ae634e3faa245539b8a6624a6684b34579deaf3b5ce3fd492466d2a652bce68aa020162556fa496f42803347c9186105fc0b88b54b8230e1f090d79d18587fda712a77a81e3ee597216bda8e22e0a00a6ca3a345e88bcf002034af09a7d3e2a3301411f553e4bda74e6b0a21ffe8fdd20884b9cb08e392645bd18eeef3977c298305c3d29081738e202dc05bc0b227491c5a80bb28b0170b1070670c0400d5c68e1c2a440165a1ff184464bf90571888aa000f717142ce0e3eea52dee7017a5b0126d41c7166e8c8ff3ce38edd9393751fd599209557f863115e7d8e8a06cc434eded01c19a5b6ebb7baab69554599645b2ae1a24841263044763fbe815b353676a0d4dbda1961e9f36e354eff3b390238b28b435659c6ef1410b21f816396c51c216a12d7e30e13f532d504eb4a0d142db1284cec2cb42852cb0e082c5162caac02209163260e157887145155734f9c979675c1ab2c2bf752a44c6a99632e5cf8ca36d324e7bac1062f54aac18039738eda1d1c22856e05841630529e3b4c702b704baa6555ed7f0d0acc41104f9ac7669da8d6626af314e91b8820733142040154ea0411b7b8e1f8caa28e2ee5856b052766b54b9dd3d06110a6c887c8800207a398944500471777f8213a0a8a326ecc10613a038802fc1f57025240109500c008623e4618422e001050b2fdc41842108010a1f2e04a1094040021b751481053a9c0d9fe3073e782208ee2bb81cce86f780073b78020771bce8c073f0441736e070777f197a8204ee29f81b8e03bf811b36780204357077a7411b3e83273ce03278e2026c780cbc8bc3e0892bd878c1e8092d227781b3e12d60c10a9e487d0d5781a7c0d548e389ec2830c109dcdd046894c0dd7d90c0dd5137ca0dea46b951b4931d74c4a2a98d45539b9e1b9b8cd39e3c9e392994ddfa51a54faa3491dc3449a170f0f95b3f1477178925918c470f22000477177d61810cf010c08c353a7717f10001293b512c81c5194d04610132280a3461b8fbcb92233cf8a0891d9a4882bbbf14e0015d8630812ace9081bba35001092841d406e88422ee2e92e3085260d963023de8dc1d00568401a000d9022174e0eea236444c8d294f5481639f256aeb77820e911371a0b9625ae6d18c8aa9abd39aa6bd51fdf8ab17ebdee12cedb2e29dacb3c7d2caaad0c7f92469abb2a92555366bc64b4cb1c408962882c5041626d268022649134e34d1a5893d9cd861e4c48e13579cf891414b0e58b4fdd3c312e68f9325f04fb8c4149f9fd4929f2396c0f9a982060cedc70cd20f1b4be0f0e38332dad06809651fdd9a4991bf67d629c9e01c524ccc9883542dacba44d13cfe2ecf548b1cee3e022436120b70f733924023893d4a0201488cc0ddcdd032a4e50c2d5d4ca1458b169f91161c1f090d69215d8939628abb1bb1c447424347d49082e8881feeee47c4e0ee3e3ac2878f84864646747941e1250067d6b9012266a796b64d9577c6d6123f0a9553d32a36b5a35393a7cec898c23a96313a7c7326680301442813a4025183d49e989d300c49682eb799feececd4527885e59b16a84cab7cd565935a42494f9ed25c5303a4a2cafd636956bdcb5aedef4ba6e794cd1a96a63d1f957bc25d9667d609eb8b1b0c4d2fae2c2aac3339d4a432ac602d5d75a68e79b454b0aca606e77057aa49f84cc76f5249546ea4545205b1fd2633a8df1a9ca9257047484e9df97367cc3a54d386419649984ad95baa35ec09c99dc54a22fdb953676a69e6cc4eea4c2d053d3e636a0af59954559998aab529ac33ba346d586756e669e6cc9514b4469011415b100180b80052324a9fac901019a262c123a80910124657a4003ac18acc72d181250d2c5bb0f8102194029602e840550322ae4a8b4a5311a13322c2000d40a30165036c180207a32b52aea4608503404246690e5225ac6c6185015650188289d12a05ab541559a0180d611a8207862c578a7002116b1411822294180d1182227ac892842c169861b42ddda5aca818a8570a49a5bc9287cc252b519ee949aca14991b69429b5546d2a0abbfb0dea0c2b6a70ded33a07704a71c69c4aad7a9d29a824a8222819502a984a30dd30d730d1707737bf30aff0d1d15947f54872f6411fa33be3ce4e77f49768de67cece3beb9cce8c427954e9a3ca4b72906552c15ac54f0a42d8e1413f63d1d45e2185bbd7a0440d564c7569963b15722af50dda1843045ea58cc2f4389f02b0430044682a2e5157d4d14909772f91ea9fb99421ad7679a62854be31da2ea9a57da984a194c7255a66b1e20f2a91d49174773d6a60343ec0dd4f2cb87b11f8b7b64b4e41dc5d042720dcbd8c311c79c62263cc1883686ce1f7f8a1363e8dd153f14ebc96df3e121a7a1c6451f8cce2c572b748a1a192e4622a54968ca86477f7ab5141224b31b6c1673672a37a1d1cd5ebac48aad7a1117f8831883e2c1d71d82ea2144a5aa338ee4d04bd10fc5b4ca05c818533676dc3042e791fb9a16e5bf5e92c6d102b08620b0cf499a243744d0db2282a5f50f981bb2e7fe3474bfdd8b45fe3338ba6d5bd266d4da5e981ec9ba245ff3453a09d759ce81ca80c208529489862c794997d96a8df19f5e86b139ab735997476727a9a1c7962f239b264890d8fc9049674cebbac407001e20752509092839421529648418951c48c2f8aa0600b16405451440a20a228b29528520410598a64c0dd5d8e9733d27801a34ae975366f0dda9f9eea996f4de56c6a282bb05042ebb6485660a1a4422d8abce78b15cde3584dfb1202b4546511ca8b078620e56b816854878b90886cd0c35d8e9088bb73f9b95644f9e8491a5ec2c9d1c115bf5efd4fcd1b5556bdc32e6bd666dd4edc183d59c0939c27f749134eba1001c01a445a408346075c68ec70220615208dee21b98aa814bdd556fd389fa6bccfd284cfbffa710dfe54aa44b70651daaa6818e035fc994b393533c4a24a9b7aa012356d89cae7cacca99e3ddc3d049f6f68ee3ff947927d7c78707710fc23f9bd3292871c3d66f488d1f3454f153d5a80b47df3ddfd03e89766ea1fc90e7a9d518f8f264d62d0048dad7f5bf349e6a9b69ece57e552a5ebabcedfbb4455e803e5faa83dcbfae4b5f7198002063c035618f1c8e1ee0ec0392b9e33463c42be33e4ee597804c08383bb9381737ee7acd07d1e71d2c64e1a3b5c5c8c2d55ec44b193c54742433b48dcdd778a780dfad8be49f567c9d6cac40e1d1874509083091b3434701f03e78c9830c1a22b9a4bf26f89ca67be8f3e3ef50e1a0a2e77683a73f839416a18fe8f121570ce2b8951e283bb5f5122c5484915777f02cb525de28c96cc28c981bb7b4046af5ec9923196bcbb675932e4ee452c5982bb774089fb30c4b90f6da4e123a1211fc82052e3c3154ef860840fa9d0071e1f2c1b8c7ca8231f607c7025d0e123a1a19c2e396be470f191d0504e911db85efd0ffa24bbb52af7d4107d1c56108b3875a686a430aca470dcc139a0c6f69b8832311a97a6d5ff80a05ebd1210f409b7ceb7dad47a96159be53ed32a73648923e1111c70b618e1a83042b202245f202102c90dce0b909470cc11ce90233f38228404094888f0fae68b9b2b6e4846f63092c799af09fd19d40dca626484e4564a3d4488bb11231b1c56afe484da28d17af54a303677c8539924679f1ef6f738e1f9136ac99b19d40daadbca6c5b6d5dfd8f6907fdc9031963f0f00087bfac80071d8d964a1328089e2a43506589336ac8a3259a77dd36e83d243564b8bb46c59df338eb18c1f912f5391f0582222a456ff4ea95eca0d759bd92ba6dbea960939d264d8e10f9e1ae57af24eb641d9cf3c426ebac5e09d66fded3b483de64d1d4e6f12c67741ecfd2942a493d23c4644273c55ff597a745d59cf799e6711584f50e6f8ae5b62954be67a9f52eedd5bf57626965ee33e74d324d8c6dad5fcc67e4537d23f86e00da30029f80bba664b802a3c20b10f8fc052b94f00206bc3b7e488f8e1736e0bec3a813c3dd637cd4e5e00b1f07e8b6f890b97c88e1ee1cd080bb0bb97b18ee0e86bb67c0ddbfc080bbab700177efc2ddb9d8c2ddb7b8bb16ee9e850a335c14ac02c166ae448854999894bda5d17c7dff49185e5ecdc1148e632aa2a84555fcaf6bd5b6ea7d2faf6e6d4bf47b2ad70219db1477b722da7036cd4742435b8cbbfb0b0c60721385ca943ae64ac5ab43bc540a952935634d67a4fdd0ce3f9d68598c342fc23d46991826fc41e558b252c68cf9ad943a1c732813530a52b12c0ccf0fcfd24c552cababa0d4cca3cacd5d16f5bbd4331e17534352db246125857875c72c240442ac1092bb6361e93012820377bfc2ca32b262e0ee565c43b8a8b86846970bee5e81112626a1610a70770abc16d2c21ea5384a6b70296da942092ca55d8a52b24ab5d4c28c1da399211f090d69e966d870773f33e9514bde92d4af57ff13a3837071f72a6448242d480fdc7d0232a41a526501e7d09c797c9c189e20626c09b28d82c4049161144485d24740b4005285bb2ee526b5f4a668cfac43b4a4ca6425a1b07db45ef574964c2ab883b3e3534b6349d225ce25faa99a0a1fdd21cdabaaf5cb8421aadca46ab3daa5598a65d09b239ac70fc3fa40e2d61965da473ffc7d5ad4a6274b92fad1b1da7aaa6caaa7d660595a5392e189a9e84562da416fcfd292647dd2870ceb8c8f158a19e5a9255c4ba9b0665b75935a7a532ccf1208101b20406ae954d9941eb3a9c7a4d1d7d64888e67d2d92f351f6ccdb864196892e6baa24f599cbc7a5166774698a29cf5e3dca8766dc21b54d629af6e6032f1b18f1fd32fb61d8783bcfba5ef8a2810b77def58dd695599798651f7e11c2df6f9ef5d87675a2e6611df61246b671f8deb75ef7695ab78da409046b7a74d01d1e104ca1ee951730ecddc6cbc37fd9cbddb1c319c0b08d13edc68d175fe3d659a6972fb87fac8958c3ac1f473c72dc8b1796b3d86ed7fab031fbae8c234df8f306c19a1e9d7fc1c0676917d689dbfd3e6bfcb08c0441133ead69d1970b8cd9d77d1866bd4cf3becd7e5d7018e63e8eebf038e20eb3230982a60d5fb8e06ea665a278b3d1baaecb5a24089e525e2cb07df79f987598256a9bc73d09827a6b6b9aee3fd101c1292f5b709a86456cbbd967fdb65d233e491e5eb670e276bfff0fb3b0b1db3ad1746d4aaffe0704535a7bd1c2de4fb45de7e1ecb9bb5d2b0bcfe2ac4bbbdf6dde65b7d5ff983e079b257953f382c5e75dcdc318872fed8e7ffd92972b3c2f1bc5acfbedfaba6b7df7c58acc1b3d8b79f872f7c2f0a74d79a980a55d5c7647cd13c5efea448d02a3152d5114b3cffb5ecbae18c44b15f8f2ac1fbf71bce37bdca5edd35efba4c9cb045ee446f1bb1dd6b0b5b6d192a096f24245872fc671d66e177322f65d12046f2480b79b71d7b579f676d788bff3650ad11bf1d5326b37bc6d1c4964c54b04f015adcf1b3b0ecb46ef8a62ce0b04aeb1b3d8665916b6611bd75d5278f8ad1f3167fdcdf0e56c7e89c28e5b86c74b13bf2bc3acef2341f0f4f200bc618bebae7861ed7a91e34810a4f2028565edff75c7ee5aefc2bc7f62c4fee251e32eebeb1ebb188d13d9685d9fc5590f5fcdb2dbd54d58165f4ee4b6d1ba30edc3db0f2f4c7897865923bed863ab597b912008823520b8dfbe2c817517f636fbd166dbd65d8bb4a1b9ffc4342daa677b51c2da2bb3308c470d6f2376310982d8947a7180b55be77d1bf7755b862d8f4b62dbac76b74fbcdab759a28591fb7b90bc2061f1d56119ee7efbdb71dfa6e537b1c37076ddec7a1a2662e40982a99723387114ffe23c7bbbedb23c8b4c651407045319c5f6c508cf1a354ccbacefc2b8eed230996ad3adf9339b3720f86736eff952c46875f8350bb39c277ed737be64d1aeafdb3e0eb3b6bf3ecb52940fa2277c229665dbf598e7f52072c2b55ebb9ecb36cdbbb0d78947444d183b4ddcacfbe36398f7bd4882604dde670e089656447b701fc6fd77d6e561a2e6751d6932ed89ee7c6ae52312818809b7132d4fcbb06571e2e63db684cfc3bace5aac617c7d9775e9e159d8b3baacb3dee6611f7695c0891ae66c6731e75ded3e9704f1b751cc3ceb1a2d4cc43a24d8add3eca53deefeda52a1e80858f6759c7d6c7b11e34eb4240884280fcf8e22b7719cf769d97398468220364bf29a4c7f421f854546c0df7759df8b967537afb31e0982a6fdad4d3f662a8260cd1392129a1df4fbcc37a7b394222ac28765de75ef78719ab879403fa6d1be69aaa979a2a466b4bfe409490969a74c4010fd1fd4a2c66ff238eb2401c1c7f97c014384877789dbe875d665474b7b6cefc8b2fb6d9f66ef67daf8699808f739cfb3b06fdc38ce7a511b82fdb2cff2446e1c37ab799aed41248451ec440fb33ecf8aa386bb8c14d921de0f5f6b2f0fc344117fdd8e28081c3676ef5922377e6659ee41d0a4e91101611c7fccbe51f4c4cfc6cffaeae8b06fb45d267699b5d6da303aacbbfdb5619c2666f7db3a4b82e0598aa87c41708eef306c143d6bd43aecc78cfbc1c65dff59c77563d75d4ebc3ef8469b5d96c5a386bde679570efb69178ff6f2baeb769e884910ec81b57562a671f7b2dfddbe2fd33cc016e6ae75dd0c8f97b376e06ddf268e5966b5e7eeb65d716816f634d1bb3cec5a4dfbef46a403f17e1dd6719f8579d6887d38075a9759fb986779d71bb59183e3e23891bb98685d6edbb2ab0d596c1c452cbb771b3feffbdeb0cf59d765456d7bec1a1f075f9759ccd92ecbb66e1bb17b03cb5ed8c2dc65478ffbce6e2408ba8175daf779f613b36c13396c036df3ac78b31fb5cbdb348fd34154033b729e8769d9e65de365af4b82a012110d348eb39bf596a5595b277a180982deb8d336aeed3dcbbde7759bd55dd10c2eee7aecaff7acd775d6fa48102cd12d03cbc3b46bb456fbbe7b755c17032cfe78dd6fb478cbb2cbf2445d2e2eb3c60fdfefc323d62c2c1343638960b0d9d1f2bccf12b57b3b2c7a01c6be6cbcac6d1b3f7b458c2341d0c32e910bb4b1fbecb70d6bf7e3ac69963f6c8cf6ba99a8655a767d178f9b6ec1cdb8eb89af61db277ef73516580b779778891c86799d78ade0bbbaf112c7cfcaae68392d73225ae35e6cb3edf270e6d9eb6d9a0af0c68d63f7d7fa2e4e1b3fab479402b1c35f87addd346fd4b6ebfa41a4c63776d965c78b133f91c3d63711a5e161a2c5accde26ef43e4fcb4810e411a160ccbcf1d3eea661a3a671a277024fb3d7fd30ebc3367c71779120a82332412662ecca5ebcbe9b5d6eb324088ad0c0b8efc3becbb3d8ea309c71240832405482cb69de8b59c771dc75614b442418aff658ebb0ef5e9a65df1bc1d75d9cf5e378bdeb6696759120682ac7d1a7a279cc41820495512420089a54a2333c0c5f9eb6e1b1e33eefeade8c0ddb2cabbbb417b12676dad53622116416bef096719a886d6f2d5686b5591ce6bcedfa30ef6226105c62636467490f20f8a97c3508a6b4111117ebb3ac8ed3b42fd3346bf3c61aa01207043dec720282342f0a017747eb5e3be26decb2eedb40f0e2e865b8b3b8cf8aff7d76856e10aca9714293f799b3427d407013117da0dbbc6db39af5f06561a3872d19dd76adfd306dcb2cee32ec912038c4108fa63a9bf7ca1510042a318e688cf11a456bc3326b319b61d9e6810efbed1bad6f1bb9f1f3bc2741d04c519da80357bc1efe32ab8da2d775dd93206882e03e4b27a7d208088222312e8633d11a2febc3989599d6b4124d2b33058220c8817b31f1dbb0ee7ed6d665e3776610a4f141b481ce6e1966616b3dbed765af25d2c0c8899977450cebae6661dd15b2a2666958fc6fccee986156d027415f959764a2306e6789d96865d786334cdc3c12049188c0c0e2d68dd97b1fceb4ef5a9604419d42a124089a4cf355dae483280399d875d9f7719985599c38625fe0d1eaacfb7562d65d6f5d998fc80bcfd2aee87559e75958c4ac51478481c7d7f7599e65bbdb7d18a6f1882e908dd8d77957b6651e1ebb4b4ccd9113756165de8fe3d78959a66958d3484dc405d6b651bbe2779d28fe682d0982f84dd19ef212103ce525a9ac0382a76cd278220b60e2dd5efcb8cf7bcdc330cc47b4c586bf4ebc5a67e14cb3cf59d1160dfb3a6ed43a8d1b2f4ebc3a120441b0a62687e44383a248eea77a4090e68ab4b8aeed8ad6f72286bde8bd25cae2e3acd889dc73a376bf0c8b204833458405f6ddf7c42e133fed66d9255ef1e2386e1c666d77bb3cef3b2bae766dd7e16bec3c0cd3be0a7ca3387a19377edfb58d18c614e0ecffd78d19f623feec8555e1dd8bdbb0872ff1fad1b3ae096cdd855de3b665998f29a2c2e2ecb561ddb75938c3b0cf2241f07cd3944f938d4802da77af6bd3eebddee5b0bc4d2058833ea96d92f3880904af88a6b0b6ecc3d9b5444cf4ae0df348103cadc9738922305e58b49fbdf7eb366c143910a4f91141c01bbdf16a1c675d1ba769a2260586adeb6997a761edf2b41f511419968958f68d9e776116965995e80157c430cbba1bf67ddee85950601e16456ec46ea66def5d1c09824ffcb85df1b1edf1652f71db9cd044ebe3468bddeb62ce1a2d098257444d649d76adce7299f65ddf75615bc4c487699e97fda57d9b78bdaed34bfccd30edbad65afffd275a4abcf83d8733cee2baed12df7380f7791677c7adb33c8c2fcf9220a84549649985ddd1769cc77da7711b0982a90889ffb1bb306ddbc4bf1af62e0982a8480b86fdd5bcc7ee8b9fa5891b0982a5e8889b75d88789632766761cb38b044191119d367658377aa3867df6b34412048b18ed977dde5f4bf4ecbd448c1265b1ee26624cdcc4f1da32efca9908118f7fc7efba0d13b9ebfa48101c1b7047abfbac0de33251ecbe0e2341f03444b6695ca76da3883d36dab7272cd9d65de25f6b5923e630ec35bed2fdf8dd9561dff8e1ceebeca320f8563eed7ed9c544db6d8f3d4c3e6af2a17953b43e2adb04045516ad598d568775de8fd6a761efb10dd22e7b8922a789a366b177451a2154dfb58d5da761f83dcef2baae86dbb0243826d3054d29d0e679da5f5e268ad676cf69e965658ff1d5b8eb470f5f0e0441d0e4b3bf4bfbb891b3300f7bd7f26c0fe90949094dca324959140872fa5aed7656d33e8c336bc711f530adc3ddb5c44ebcde67692408e654c1b69b599b8847fb9986ad95ba9b68719ddd388ee3bcc79e04c1319bf42e2dba4d29ade511cbb6dfb46fcbacd559fb240882e07d9c6f1e671d100441117fe7286a22f617f33eefe338ec234170ff290914b6dff8dffdf0d5c6ef7a1909829a948466fc264670446c22b5258fbcd66f1235616a5a9669dd77b7efda6fec3eb2a6264912520f8d912f511f1004419329a569543fa2277edc88590cdbb20f7ba210dfc7699b65e10e5b58b4f62aefcdba0f6b1673dbfdce22dfd2c44fb4fe1aef5b23869dc40f5b9a677ddcf658267a5acd78d99b5d9dc67963f69ad65df18a187b6cc71f51a6f3cd550d151f293ad88ef67addbdb0ec8ada258e5bd35c371bf1d536f1123151d43a0e234150e352d36bd4a62e91f338ecc54ff3baf1b3b8bf240882e0fe9ece66e2ddbaf73accd3dec26ef7662af5f9c2cd12350e7397f32ecd7e1636695866ef873fef2dfcdb7341dceff23c6cb316a7619f8d234985bb468be3ecc52cadb39ef3c8d214ef6af8b3ac4e1c71d675d74ab198f5b4acdb9eb37f659747822036bf1c41b0070402e36bad768977b32f5ae367832d0f08f6fcd06d9f377adad6596f3b4bfca26c9c357a1bbea2d659db966d2528f8bdabcb3a8b799615b1bf499e645b36e22ef3b2ce12afd17a1034cdbf479c645866352be3f077659ded321b1a1c1fceca9edb6c767d97eb3c8bad9e2c13c70b1b1f639986fd97912068ea9a741e9669968769f7ca6ce669441820da6be32e7779db66695e67c3c371a5d1eaae256aef7d676d96f6564a9d9e52f197ec7018b61766b97b79d85f16234dba04c14fc7761ab6b64dcbeebf287219098220f8a82753163d81600f4c38fc6557c4d85eaf6df6b368b025e25f0e77d9f5440c7b99d79d52f16b82700ecd9f4edb0404697c50325ab1b33a118fe2fdc48db374a0c17cb83891e3ae2bfbb2eb7acd7e395ff7596ee4aeeff2b83b66190982a4241776b1ebdbee88398cc3b68e04c1f34d53d06353d0e393871ebecc766367b52fe33e51cc2c12046f9060cdc3966661da1dbf31b33212044d8b9edea6b6231cd66d185bdde86df6da5123411097a64fad3608d6ac4e1b105c9df6c2f19ec3be91b3e2375e9a75612408d6d4d478290dfa3b87e60604f197a97cc194c51604d1dfa50e34a6b334a5328a4110dda97c83cf5275a6a691118c1b5fd43e8cdb322e1b352e356dd428c446bcbcacb3d7fb2ef7659678c90c827fcf9d13090882a04ee5af08f7568659f7b16dc3380cd3c6319b7669a6b44da83ca82470886af3300c2a85c8084c154d00007311403038282090c74362d990b6cb100014800459ae568a4858980833350a29848c3106106200c0008cc08ccc28000260a7aa21aa063b3b6bd8eac64e93ee605727a4d192538dd4d7d204ff18d26408b34f901a6692a9c082d4938016e2f1d92eeff9377ba23f20d62e6fe02b3613fede5dd02b7a5e4657701cac0defc7ea9c84cfa1da87a023e9abc883a03bdb5ea98bd37f406152a7e19c26b254f3f93e8a6fdc8f47e9adf020053d241e169212360dd921988b4585f37d0ad0ef6796160c941207235d569d46559deb7eecec227dcd5803b8716ecc168675868e545feffa2ed213ce202c01644e3f5ae05632653e15f82c0eb3e7184b6a07e242fa18cd491ef6c09e567770263e5faf302525d6a88cb46d228b5e1ca0f15e56d2eaae69c3cd6dcdcad36f8d4cb0546f2376830f7d81317aef45c95a731a3f6d54609c3b9b03deb533115a5358e72fc5cc71f19b4a60ece552e52e3cde1a3b1314136634ca45ec777067748775cf37391830673432807475833df96755db8694c70638b76adff67c9b5eaba1351e7aff2eaafdc99cf06929e44b1b6b5a18f0a3af277e3d6fb0ce9552dc75c9f1ad8fee54874dba40be2846f95e3f31cb06384f7d2227b39cdd37b991bdf211dc8066426c820e2135817bc8a82b18b2dfbfd5e309f2eea056e588335917175d3eff989494c1de010bc9408e219a910863e1c0686f67d0539a3c9f5fef11f74f84e7bee0033253a25ff79049673e6c9bea324b88e829fd4b1148daf4f14a5834969556560161684b417776d7fe685688107b6e1e5c8665617df0f57e77908d0a1b0ed2c9570bba1bd5eaf61ff5985fbd8ef1b978d21cc91dd95522446b3fefc3208c5a88e9d6767724ed8fcc929d0f8a4a73ac1d5ed60307babfdc3ef3f43e477a1f7a7a3f6cd8a233a4b3be3fb31d4bb778c13dbaf1b790ed71a62a712f0e9ddc77a2558b34d46efc5c18ebe2018c7be059f384ddc469ac288768c5d2d5cc3e4b75803223ebe7298057d9c9595e78324be7ab3fecf579786381d79c7a75a46ce21abd35fdd698a9fff3fa8f9d14260c1b43c2d0a0dadf60b6b5882c47eaccd13328f3d6f769ef09b23a627a40b780deb67e2be746d1c3613a0130a54872e62e76333476b1d9fbd3e2e85b8ab88e7521ff8603e622134c595bcda2e16a6fe7877117f6b201e46e91ccd281c5e60e9ee9401b926132f259297f4e562767d1fdf5666c9a34ee6718830c4020639d54c49ed4987c6cad978126b44b1dd858b0622b56d28e41c310a6a7dd59699b605a4b94024724c6da4049555ed0829626ccb5ae65e1600a3d9e9617da02e74e4b2a0cd1ef6aca4033c45ce6174fdc2d06299e4f203daf84a89f5a9cfe2028ed15e5d20161295c30de753c203f63437fb836850e9d9820c323fd51f83a9909c8bf37d3f448a62744ef6cb5c211615eb1cd96d2d0c71bab66a5c8f0862ef845d9a170d5627ec59c8bdddebc050c279f0e0ab79d5d1d362295d2ffb0adce5e8112a3e31c865820fdf92f99a1b4872089e579e4eea930a4a2d6a43d1a8c63019c4137b18723e86f6280fd85e8a5ccf894ef489ac5e6798b143548df5291061931035262fa230ea175aa80252422bc3933d50e31812d85bdd254042ccdb0a44e7454aa9b6ead0e966fadd3ec8a2e3c291dab0b499ca1eb0b82a02d42f6781b49ca1c14a4c338e9408f1208d7949d338022ce4d75176326b155a8cc0576534e6d80598c03f7e130fe519526f63b761f7df3c1d87a004d6fcd029f74748461a66247d0622b1e1069f8a5b704dfb8c6384d41646e3da769aa73c50d2b16f41e1d4fb5cbd0e55886bf734ae32b375eb41573eb25227dffc7704ea37ad7f3fe2c2edf430b8d5c3c9d84b8dcaa8e48e091e8855b7860339895175cef20d55ac1ae7a7c1127874d52cd53484105b3238796dad4b7777b69b75bae7a84e2de8f532a48483922a79e00218af575b650609f95301f3d19a4b85bc3d9d6b9c482d86fd6f354287414522d3a4d2711c8ff1d9d036068ffcdbaab473d5490e3ba32e5263db0628545ff0cd03fb1e89f381efdc37618e48c119b121ba92ec34ae5f5ec7a94befb7873500d1789e7916646b5e39d9e565b90097dd924c1249a1c730ccfea2eca15a1e5782a7a26fbae3003a665e5d7d517a98337149cdbb9b2c75414c278b0d2abea3c09e752e0177538764283417ea71ab86e83e916cee66ec61399fae6b3e35a7dc7310ba38c4283f609f3aeef69ad20893433b97ce4754f5b1012e2c28a2eb74a326696f686a7b39ecacc7abeaa51ef76c7ed69fa78c6e2adf719b738635fb1406672c67653fdb22db3cc011a3c6ef8dd67903d701c5230fdea422b8fd007bab70b97f7c581e31a93529607b81c73aa670974c15f557367c45ae96251615a937731d8875db1ddf05d96e05d6b91adab2b1e27f86f50bcf6f3ccf4af7932682d3337875da330ca43ed44d15e58dcab3e1153754fe0bc2d45eae161da8b2e1972634e28262a80423dbf7817959292772a98804e86add427910db033391c869112d477f399dabeef5640ed8dbb1720f4a48284237c98372c7cc0dbae97e92f5bdc7a25041076efe5226161243d4809c094c6ccee756e06ca9ca2424d5ef51bb0f49e3b74823ef7b604cd3785d6e303e0afed3506c67c8e599860cd5b0ed2cdc7f93ffb518bfd59db1e48dfef095385e88520cc8cc3c78004615b0f081b05b83b207522ae8b69afdc33388da5e63e8bc52fb4f7b9df5172d4f2c69d1f79dc9b1efca2549daa6da96a4a68d85ec5625c6183349e8d43e20b28abded2142a38da0bf8144dc1644d2f52b62c55a8c8aeea7171daffb3b339df5892897e11bbbe831aab545f19bd1285c5df2a9f4b1851cc66dbc6efd976284ce9a0ebc96f5f5f11a588b466007da31d4f10fe582c4c2f2489504c5eba3b3e2ebf8074b24eb3a39a76f0778d00a678d2c0542c0444493da128d3065b3d233e6e07788fbffb995b4aac431a8cb87586c07ed5eb5c5cd93b1a33974c5498bdbd9c0a49bd3014b43a3f8e29eb4988b24d41150d9581c376584e2e7ca92f1d4613a93aa1c652aca9523d13180e768a3ea18f9ddbbb534b6f79d37572a7e3b3fa81453aeba1bbb4e0856fba82a6f0f5f3eea2ff0588be771eaaa5433d8f57f44dbac66b52923a2c1a02c2271fb55462e3cc5074341056b98a74f048fcca23a4b631b111513802f316785c94344b385aa66e24ec0afaa12c0f493e228275a8f6029e41c54b7a95f85d87a9824dd92cfbc9a9a9087ead7af5b3e9a8d8ea6fa2a10ab66bcabb5ef9c9bfdec24d7b80ef821379a88899acb865a958d273711063407a66506b4961bb3f99f4087c7613b963add640cc9d036b873badc6eb4ee8d1a1a162b86ee16a3049884611c4423f63dc32be49a4c17161110962c766cfeadcae9735e98954214ba8e29fb4b772ea39a339483a9d49b2d5db88e6030ce111d9d48fd08c6ffa58085c191ba482b3b7f8911733d0a1aa0ca323ae24f1169018f3f4e8fa14ee645d1c4672ce6a6468fd46c2b4861edc3f20e7aa614c23fe924e0f04458a816c8d524e43e1105292ed5d5ced1f619b8464481c5810188ef01745fb154259016160eb366df34283e9234e3a1d74d42d7a7f3e9a3a279dee306897c20b8ac7a7a1b805e360cedec6b2279dceded2db759f74fab0872775e0eb2303032179b82a84e58825b56a923e747a0ddfa226028018077d6c4b5f8d97116c8de90d940112d3cd55376294d2695affcab3510ceab6f5fd9550d4a918e7b3a4cb92c7429cc99544fd5735c6328389f2390deaf3621166f3b44a46a5d3821fdea43961308d55b5307a4cde5a48e9b4f00c6ef8dbc4495395dbd75af158bb624085c8efd6def34141e4396ca3606d4dd74b93731d2f4011b0370b140eba70401252c65322fa02c821e15504534b03dc46b01551d810d6ec58311798076a9b7c34a11e7093664f06cce0658ec6e8711acbb986851af1760230053af71f77b7354be7b2392224c06e794b1204f7d4b731032e4728ed930fa04fb2e42f83b89a7591763988fa6e39e0371aa3f0f4c552eb6f50567d8fb07c6277f98e4c7f6a17d78eda0ce959a9dd390207975bcfc0bf65ee50485a9baa595860b7105049f360593f24bdc5b067a580c1b753b7118f2d14c624f6ddec9903d3b5cd139afca1a0500b93a5063fe890873ce3b6c85f3c7c700f4ab8c990a68e79235a5fb002f90762880634abf67fbc088cc79593a391e86ec47f054eb4b78ce3e853157fa377506a37ac414cc51e5ee0e0e5e96084e1a34fdd781bcf8fd6849de7e836abc657d7639cfe78b01b8cc76d10dbcead2f2e54f4c338aa30941c6100944e0e773e73ec6781a6948d654ffabd733ecb1780f75fc03a8c0830e56e9492f0e9bcdb927577df02277f42b187373a38f916d72661d779df570cd55d90254fcd44a84d8f8fd39941e4f84c9ed10d667e3e2ad4bdd59b5eecd6b0796174a29a98601477de1f177b3104770081503d15414bf5e374ae86891f45562495f47b5d808067e02fac622b9991ccf89bfd0cc24a752c7c1b001e72e23e02fe5f4a8c2ccadea5b9c38b0d193d30e458671f7bd7824c82b1b972507530b9f4773a17e88a8b4c6750cb7996b90ab6ee5bfb2bb295893f7b0ec08db13166e3b8e9e50fcde442359c04384e5b389e3ecbe11a2cd6c5d9f0ff875634223da141dfc366a5126c24d1bead757c820580a4b3d5ba7e423b101be6853cde9dae12e1de4520602a8aa41a691686635f8699f7939458f706ab88939c37abb8b93e43e20feb822b87136b05950c438a88b2c3cf6d5ae7950778cf50a117733ec2a864bf2267ce591c8b00dc3c3e21132fa1af40e63b010561212b746c04c4092f7debb2e3bba2326cb4799fc30c9fcacc097ae71329b7e2b4a110a251d926cc2ae1bc3b4bdd888f5be9bd3cf6d6824109fd078d33a33aaa9fc480d588b3d829600ae029027fe5ada289d781ef02228d1bb49739e43bee6f349c90aac4a37a944c27406d9ebe471e2f92f2dda1a0d6e32a283b5a740a7459a3a23534bdaef6ae09c6b29758d47128918dde9e57f058e57c2af02b53c67172728127d6287e5f080e52edf394a1cbb079aa7a5544407f76fb8b3acb0c8e7a84c1a3fb94a433cc38427b8a8d0133f882435d27ce22f74c95dec63237d18624f8a2b3bb11c97698a9569eb9a22f254ea82a9ab3a5aeeaacf6a192fef83d2fc830d299efcef830145593895149a9c08bca8e82e1944dfceb6cf5676ee0a9549f5cc31bcc620eeb8162d51f5c07a618318d507b839fe04d2fd931ec337221d911760638b71f28622f7611eefc31523eead9f4c6c273fa836b556b8f42a9fca30efb8e16707a676cf4ff9e54fa9f44917c4058bcd65c7fec349e1592fc3bbd4e1094096ffd6091f80666ef6596aba381f04fbbcee7d9e239991e915352e6e216060f584a964aef1d39e117c870e876d636a5ea999a0bbc76d5ee3b644e4ecbe982aef9ec1eabe4a7c9d8546aaaf736aaf8dc49d4206806952c4f8397c502e0ced1514f20e1a4b704fe308617b6145c7d1e7006b5744e80660403bb615aba623bfef8e056c39e3390612fc3d0da096cf4285f86bf86df3a47bf163b9385a18dd609acdac5d47ed0992408249d9d815ad5e3c56e771e34ce6b214d2bf57f54cb1d5a824b9ba4e708346f6bbff116c7817d9e695f87016ead90b62c52b0f9c0dd58cc7de65038637a4a815da817fcc85d042af78051a7b32e95464deba5f7498157a938ba969e3ff3276f3ef2c8150b203917e01aad418bde8591daf431f76a290ed9ee96557d7d8aaca9a3c0365dfddfabac4b5a2bf5c2650ee27356bf86280958d37b7f1182e5c6fa706b8301e40446cd944744e1ce6669e9e10ece114b7f085a8cf4c710c900bd313e90d14ddd2a654c23f466a10088408fcbe3f87f985ca3dbdc37931de06371dc5d9487b2fb78dfb67221dbfdbfe9bd1e743d4536f9462e3d78c64e3b3cf556b3c6cc536cab931c406aef0faa174011ff666f23ac3f07007747a5ae5e10b72aeb59404ca721e31570995cc8a0f611c3f3cf50e1e9665153577f5d2a6611f89bc15cf4b1386f06eaa59fae7340ea8ba4d55373eb4bac231312e9683b812803ef2e86804882870e969599e6f2f8c2751f332503f65164cfb582c60fa3befdcb7c509faf0cf84524252f5d33f061e09f2a160e746721dd04c01d8e968f4f9f9800e2f0ed38138f9a591a7ac99e3ac5d6347fd0d0134cba0ed6eb5ad70ea3893a22ee26dac99f4b4147f630bb9673fa1653348c2a8f1d34add8d7a0e721a0e9a55f2dd63fc31ef5d88e4c4565b491591d91fd2454e5a0c1abf429460dc3f797a6aa5a3d72e1a0e5232f4e478a77be6fd0f54bc463c47193852d8ce8a8bfc9deb705c729dedb43955bb07b0739c626b7bafe5be0823c1d4f06363c78b1ddbe6079d32ac03fd5706d903e9ee80aed3d66f63e1f9bc7fd0a3f960306c081c12058e9b6b7a287869e9f1d40b1bb28a5f379a56964e8f8cf100a650fd5d84b59b379b51bccbaf4329bd061367c7dd1f4d7ecd6e6f357a2f2096ea7595c9f4d413ad0e2d6ae97de0cfbe754d1bcafe486744555bd78fb872c8188ce5509eddf04ade927f141184094120b9e89af51203a38886e1f7ee5bb2d775cb110451f6786dcff3776846c6963e575389387be46c4133dbfe079a56f1fa485b33db4f6e10d0295c8784d87efb151a386c2c78318737b4df4123244f7eee492d09c125dcc090c9632ff5dbe90f70d08bd3b7b7df80222a06a1897c8d8b04d84c5dd8511ffabae7823824d6cd5755065ae610e64d6d005bf92d9f2decec7d7459eb178ba2265094be8cd22b93fb45d02e53c8c949e19adb473785e3cda21cf18603e0c6f8193f93a87c2275cee288c81387d0207c332ca685d2fecbd08096a2cf7b346b47d4831bf016c2350c4ed1fd16edeb94e5004e0da3212f41ceaa6017f08af511ba9635eb0e98ceeeb8047c82f6c788bca8a6d53ba77c6882fcf9bd028bf4cf22b2b6ed82340dcc915c667527511eabea86d5d3c6e73f3a56a90783e2bcf3e68c21bb12b0f98a71926bce278f94de35c55800d0b9c7917fa52238766ee3466c844c8585c3eb275575dbe329437f416afb0518b5d093e24f222816f10ee9010d5790f58efd6466650a78d0a5d6b6e95deab1a9fcadb8711060570149425cfadc607e0776b2fc552b19a45c29bd0efd98542468d6e445a6076c14c0098fa61b47104b949c4a5b12f0c5c15960637ebc18a412ac7c4611b329c32fe20dcb174a44d0a5641a4f000f28324ca738278c7699be7a89a23d492e2151699ee8c7ee85f8b289d41b16b88cb438b37929dc0353962ec6efe090d7f00800d38ce2c083ac35635680d7f291ab10fa4fd41963f62f3a7e82f76b249ccce2d7849f99ee817748e930aebbd68c7cfc66ba16beb89e57f06c070cab779bf1911b2727a604c3a61307a5eb8755ad977d2a16783282029da57a74910d8d2a32f6ac69f45e96d3ce77b344d7b9c4233abf9ef788238258598a2c6ffef205816c56d4365fc2fbf9ba3926e146cf033a1e7fcb13ebe020d4157d7941d6f7f6271907a094df084a41f5a2e850fd84ad46d89c6760bae9b73ecfb7140877f17299cc56841ebd10f6a18bee77c4511b97a311581a7ab3992291e2fb1852c2c075cce0122d983ae7a262d8787b4dd699ac6402b228ad0dfeb8771ebd66629474fcfb40761f5886ae059f6423bf2fa482d0c19fc3211259c08cc7fe7d9b066113a5d5704d9ab80b14b5aac059e4793ba1438d87423fa07164e792aa6c068a99e1e74514530a20d2ccaea6935efd4286719b8c194d9b8ea31e35aec94355cf048f70b08a886c87aa4efd8e192f7a21ce8217aa9780f6e026729f9574e3bc6e5f7dad6a37d40cde6417b7d9abf72c736d9f7eab1eb752a03060e93af828d4b9fa780c2fa1b58f3a3c7a0f54b0d43038304fa54b8affe4048d40b595dcfe60f7f2a7e0efb2a5ada05e9ece31b42c1fe654c9d16a1f618c11bae9ae720f2eb486e317a324fa436cfdab56f133757cdf68b47cf7a2f7e21fcff60284d545b0d8bb67c1e9399043d338a5d4d45c70c559b016a48785d59d53a69d8a205aa831f55f9f41dc3e2bee32224e7b0812d2af095902ca9c3ae2ebb85c34e19da4a213ac9ed0605b64355d5c25a0c14e412b065cce5992a2aee64d4e9a0362ba807569cc7447e91c07257aa6a414569b2c67f30484665df8bd67ba79b8e9c4911f5bc93a2e7b09db32ecd7120590e3d16f77d6b7fb9b3253aecc2cc6f5280fc9d4e2e7f75564667597eda67771de49fb46b79fd733f8dd7ac9d0c879efcc814862e5b8753aa9e5faf52acafe8e72f092a086f4bce39d4eb22ce8f36bd345b20dd5a9203d36b8ccafeb0e7b7d97cd77b841f31d9f65f4f7e5cc0e84f97a39ffedcd3d233152742af57b5639152b8310a140e6fdab3d7d557ae9b930da9e322bf4cdc0a91af659f2a67613525444d8e60a8e5d8bf90237da913f8dc76d9cb31c62f5fe8ff4693143b37a8a639cf9834688cad726e9685df3499a0ed1e93b6e5fc7535877dcd6cde8d62e426332e82bc87d68cdc472ea36f7a266f5e9497606486c2ed61b69fedec10bea1722bb2d811f20d8cd35e7ceec48841632edc8eec97b3ea2cb1fbafaf90b02eaf2df6e5d4c75ac1d81d261a0ac5d9050762949fccb4fd28d4d6b996927d3e6ce60e605adde4ae640967fac8af622e1d7f3b709736f056f16ed62e91e93fdb62b043a841d32eb5ec6394c52e940bba4a2b664e0a9b33b9786e8a72c52fbac1a30f4ccaafe10a62117b0f8280530bd27091299ea761e0a0f6b1b6a8d2cbe107687f9af5587d7c7e7f8b9a3978582db1983b80e53ddf1896698ef72e3d5c9af691e406e6f2fd4430451eb8a8da35dcd6eb469c5840cd51762aec8fd82a05c3bc4f59b93312c702446a3152f80c580ff8984d3b866c4aabad508f32913039e17c472a0e96da8a5b42f7fa6b1403d3648f3d14702956bfd8c2129f488e479241d07f6a4baa87ff3aee073e8481245c1a44ef76972d85578cb03072315f29d3431ed9d7ea6f90207f9faad362911cefc9b3253d6746b80924e37cc0c08abb67eb2277ac7c34cb680fbb79fe64e3a8ff372ae5839a801eb169c712773f1a6721192a5f283656ca4eb3e1bf5931120f72602283419e5d0caf052856dbe47e72eaf40b9ba94beb0103c7016b7f5c59a5715fe1896c383791c620dec4a47f3f8b5c111ae327c4b608985f031295fde6e19e209ea84ce3084574101065c697465503343cf1580606c6cd77c73f5218c22c8e6c4449823233df776873c7538798f6f175ce9859ea9494ce342d57d3de38b64c40dd5b1d81a5f7df66c33b1d9817d9f8882a99700607d7967deafdea61def8706d5208fd6669dc88121056c6c8372a504c9239f04462224e9c470db82bac9e79bdfe6181016f0ffc89dc1240e1339e199b9395484804fda7390978cb9982b58ab991ce1a7969d33e277e989372d45f9cf146a98e8d07770fe29d6761dd67d9e63c3b3c09058e8579868b97664e456670031d33622fde6eef36cd60fcd1a9ffc4d0b8f3b9252a6f8d4fa789176f52ef44f9dd335c9c781a3669ec19c6b23cc6c8e6d789e1e1d7fd2dd1f7a8e35ab5d215dd2ece1e25171167bee120ea6dead5fafcc553dc6864530e78779a45bb659d690ce74d19215a45f200eeee63371ade0b125de47aeff661ccf9c0bbda9db8f97dd8a993c3e2a2b3fb387e50ca8766fbe2c8bf16f9959e68d1c05d16bc821d186475b6339712feaa293ad25d111cf28771e8ef21d05d7ca87ba9badbf0531ebd555664dcb4a7dcd807e5b2043ada983ccac294ce30051787ea53fa7b35f3d4f2959dbf1cfc2ffc39ccafb2ba8eb2c97f2ea0638a7fb44f3de6aebb6268eeb79eb15e0879cfe99b2bb5479759bd807c57c52fe35808b299a38dd2417dc8f12c80777bcea3fbf2e1e298b28a12a6e983d7607f05370ad93ebaa04ab2f3c7829be4b320ab6147e46bbcce6cbe9e6c574fb415ca02787bde6a37d181c93077e528ce23386467b13ab162534d2f37d6bfd9c02f1ab2381c085fa7eb356e4de4243f0c3b17729a4a6636b859714ba956d662338b336fc929b958e8e2f627128d4e9e7bebd5f8bc8536b446b4bdddbd25ce0a6e1886f1cf9d34613176106ee16747312b3e2795d6225467d3d8cf375b215728315b824594fcdcead8dcdc5d6e2c965031559136bcc5a10e469007db347828298be8cb76284c602ba50a06a0643478a0321a99b2d4bf4d4fbb4750e243f1a58def04d9f5d6d3b57662dc610029926313f4f81d973dc27ad8f39a3535e849e8a9adf4707289ca9beb7abe25e7ed9d25df1407327105feb64165d5cd4da1036ce50fc567992d116e05435508812f05c267eb193132adf73dcbae6c627d91de213f6ce84e46775ae89ae6d0ae1d16bad41b3e772d0bbd490e83bad1775187512218214f9be8ada7193e694e15cc359a9c8e4b9a51ec7f6de578685903fe934b58cf3c6ccec88f31222510c117ef0c06066314ee68450f6a3d327b22f8050b46abeb6d7a31085198c8718ac09d5d9968e606a3883c9503210f889fd46904ba41451290f44d15d32057224d14c7529ee6b849f9e774795c767f77e701b7131e0fcee55f465828e9c365b7d87b69091fed6845c5a00336773c4e7d356dc59cecfbfc894ca064cd9580830931e47d5246e20c579bf234db0cfe6ae427640ccdecd9832fb14f60ee8970bf2adb85441e57786cff7f70ab8f3bb6f598baf8036b781b33dcdf96f967a4dd752c78e5bec189c96c9d513b051def68a9406335bc8e6f29fb5931679aa039fe29537d6ef37b1c436b11f1f93d4cc93de3f8ad0af9b7b597c41d6b79cb133a4d68688729f60b46abf62e9618b691ca79a0820902077b44fe9c8aa61de308a71e6b886b6bfc63182c369e3381e6b6f5c7bc811bf7dbfe7c0dccae6df99dc4fe9dbdfaa964f4d4e128b5bebbc27a69df675afe3dc826b426d49fc17abf8ff0f82a2b5239206ff7d1fd95b229a2fa71b538ab0d65f8dcf2749bfd008b2bdd875280b28bc1f2b9adeb12ebefd6d7f9b910af901c42683b283ccda48127061e7862786b28ae6b2e430860d016a0103c7dbef9bce8d6e46793f073d3d87550a01e41a36c1ffdc33b6f56e89d4d32fefd8c73fd6cbe9f28260e70e6848bf3e0f7245e9afd0a480befb830d90a9ce132b863a9c73f41ebb295e3b3fa2c006f694a21fb94203f980b6557204a200c6ad7e2d6972cc61f0735f137f06597730c2394e9542ef6c4df5af6c7187a737f0d65b1748ed9d7b2fae0a3bea6ee0898bde6d323205fcfc58013925888a975a220c22d725dfca99e313e59facf99c5af5faeecddc10cdb5758c70209a5153ee16c19a18a141fbbd26c2fc65c5626e49650d0fe64a6106658a4baf47ae1d43b9c05844b00248a75c019f0dc88e928b846ee15e619346b5b172e0c63e37076000c27a60f8fe03eb8bd45d3cc5f603a94989dfd1e5274defdb1837a472e9f6df2b89e8eaf36169bd8c2aa3e0adf6e3ec122cc42af3a2e5bfd9bb13161cc4c525fb10960cee6c1baadaaf9d88da63171b216533db473074a9db228b015a6589cb03396b7a99ff311262d8d53a285e6cd6c62fe9378b12c6b463ee03678d6a84cb22c58e1be48260b28b7ad26f39abc8aecd75a3cef19de023072c8a1007d6605d2f127e378e095d283ae4c0e42002f26066ffa8f31f1c8bdcc8db9cda40c5532bb90010c992384b9e9ab8eb029b92bacd83c649dd1eda7806d9e9a664ff33f823ed4eaa686a25a3f04d4bc43a54cb2c43f974ea2e76419d729cad5365eb741bff277acc63f5ba7596b6de5d86b181f86680b9250f90784ccaf27e04078a400055d788a972b30fe2c9b4e926dc3f253ef80a492a614879ec00279fb2b1a367c8e015f1df8d185e57bb5f5a1fcdb379b28fefaf3a314e3fcee736067e6d5fca169470dde7fc088402b991946f9fe845a1bd816bb6f62f06a64e8228bba93e3e2f9291f3f6445cc60ee381b1c19398214cae1be5148a683686cb612cca8c0f42d1048d95a8baa073b2c1884ed860805b263e613058067c5dce0f5c7e5332c6fe42806827a0a3d6ba9f29e42833ce3ce96cb68c9a4492a36dbb533e926068e04cd1c233c3d589e4daa63d7333c4a1a82211165ed8080191fb3c55eb5c247e345bfa9387c70dd39d21aabc5ca62528fd0ebd95f70fc03a2ccffa2472f6108ac7a09dd9088402be52634267ca358a37426d1b37d2d51e5a75f26876bd31cf2add4830ce1862d94e1fba77c8de6e46bdf0f078ba50c124197bad5001ba24138b036fcd4c1beb54e3dead4969ce4bccf0819476ca1342c3a7a091bd0bfff59339c0abb0f604ca52a37ada8ea77d4fb4af597f099284d530d3ccebe6f57ad4b7c1adcee7beff7993e31e07987beb11155d4e8a3c9ecf622eea28588ced1e40f75b805f9ad8a4eea187ee114f5f117a6d8305c80d05d788918c5513cc369c8faf64ca6a60d0bc3e702330f983af6d086a244ee2e8620ed777c02b8f650f0559427ca3fc2f7a75a5bed0cc6a2836005854af88af8fa4baf4f8a6d4adc30c15ce1f407601fcc144d4f240c914e1dc38502d184682ec852cee21115fdd336e860d2667e069581dc404f0bf75d75729d266e6c57b38818f40fd72e11b7f14a65684b6cc08de447c0eb918c4ff3b1936c794804e1ba0505789b6330322b991fdc2493cf3f0f72ffe04158a201bf04bd9b6e0b598d50ef539d9e6054961ea2968e8d9dad07544639780880a9f07fdec1080ef685ccf994ecb446754397bc8f2c09d0bb8db3dfcf403fd6bafbc463f4ddeccc9f3fbcb40a7847cd2ff0ebd4d8fe3b5c246248003e403f57bff9559529dc3a08dd8e0a92051cca7f35ee1b0956170b42824eb184e60e7b31d97d21e035ea7fe1e6388fd1437a620b3aa2c7df1f850eeea8b866d0253ce9de6987f6778c239b39181e86eeb4a5aa6a3f03ff087c78ede98267fd9d9083d486f63b0b4a03d1998f520e149f964e2747ec1d5d0d16361eaabc683f2d6b70fc559138e63a177a1f84d5abc09e35c51c21fcb31ba6218b764efae1e3040c7c3e6370a2faf11b6ec94ab6cd0fd17998a1ebb08145440ce568882f302382a235556a0f12c580a01ab9803bafe0446f9ef50915f953c5a0657b542800fc901afca7b6038748410a976d0292f9ac856fd09963566cb4e3c496a40995f334e297fb02a40043563096f359e060682120d50ce63c5b04a1067360b62c6c72c769285dc980e8a1365a735010c5c2b4cf5d4fcae0659d1232012545dc26f8a4d97dbc02e66b7c133d7551d7572067c0957584cdf073cca40cf32f927927def7ca35355acbf4bf5be6e45bf293c06f2d08846d7d0df51df03863e9136d06aac3148d97a27354dd6c88165ec49f030f1748b4d960c34ac81d83edc0f28eab5ff2ac50c5a684d1cd313fad4199ef38860f11992f09147ef5240236ce64910e2a7aa14bc658ab3e60fac311c10b21e1aba64bea6d0442a4b9a00845b0d111bda865501ae3fb0a9feffd5ed002eec231ca0e6ea53c3587c47d05f1ca203891428f909060c584c9d8cb604cd079aafd36074a8b7478c37c08820cd5351e99d230de575993c375c1509a37391e0eea69a642a4a929fd69210487aa535cdfcc089cec78136f53e00c610f506d00165396f64675c0548625207b36639f52c058ae8efbdace4c0ed9c6c7c36ea09e5e1b02a39c986d61dd8efa710b6314ff732d06e4897ec5d8e7588691b3c42bcf705e1e62892e0e0ec6750e8e59cee28661164560a592c8eeb2da241427c84ac727d78df76143da395a3ee79bd2e805c983d222d427b0ee894798eb1fdc9b1fd66adf9fbdf89aab64ff12cb769fff6041d234bcc62972f17fb4093ae38abe4a40b81010b9630af7e9beed25c31514acfe69d56ca5c8e379bc0334675eaba642e269b8ecb1026682cc0f036541299e36501673272449c5f49bcbe1a2c927b9e477f1b1d6afd091e0506a6b4e0d6d661afe1478f5a020097c778ba489f4baf68d79c125cd380cd84530759bfe1e5906da9ea27ab24a45efe90d2bcf3b9985f2681d565dd7296824e6be0731c8744c2763bb094fd928e94cdd581b2611642d135d7c382bb6b69f9e036113b61266b9c10fb10eb9f598421f418779a559fa66dd5227e77234e20fefe2d84846b2bd378198de49f4b44ce5386ee773ef4e849f795f2c56a596071dbd0c57e7c3cb757a036d5edba2e79ac956fca678ca25547ee51512077bba5ec06c7d1d5f3c79dfafac3efef035028523d11574a01e29e48f14bd6b794fb9f2965937431913c1b1ba183c290888d3884b5078dc03e753342d1c8f00f0cd6b50f21a99ee29402c17a2eea12a97ca71ff1ae7f6c4a01e6198c7ae7ebfd480e8419a1767931a9fc66fdca1fab9c03ea24b060a6959034ae0b4d8c11cb9a60aa9c59bceb6d3929d36493c8c33e975a607282f1f115479d7128abf82769848a98335fd88e28d1a13656bd7c4c8c75a324ae0fd87515769ff96faaafda071c8784e71f2e8bcf5fce1d4b1b31453636b4fd0cf29a6f778c774d68ba2c706dcfbaaa8c499a9e263dfbb750861ae37b8dee3e3e6f5fe3b7b81641941e96b8c5c94f867873c3e1fef7425b94f9fc73cdd7807b00a613fb7e8dd2ceb59653fdf77310771053bbf6b932939dec315645fda20e91268507a8fcc83363a7769a847a69bfc9b331e01c6b9cf5024e9a122e7bf481a98a192960b8424493139526348c2644727a87a2a673129b68556a268bd65e15c37f3d43202b565b210d549a4434a105e3883c71516aa663d63f363a2f24e9c1ad5907a1f9e5170db18c312b7c831a72c5f53dbccd9192de17d6e012605ec1436fcb3e49a397159e0816715c47933032c9603ddc9894b308348dd8bdf68538d92c193b43dea485c22442392d8e62cba32b0c8e9cc91f920def6c882af8335e00ce9bf0fa4fd8eb0203a2f8c048204650c28b9f6c279aa5072ea23d3fb7f6500e780903675dc7da0934b52905718973aaa00d96a5b2f4b4b9445b521cb3bd6af3db87bfd9e7e0fe74c59f2c6f3bc1b88e53a78999ec7abdfd10523cac3bfdb50a745f1722b6efd4dbd641ffed16f70b73734799ecfb9a1d03be6ebbb3abc6b8d7536c68137dda0069076854fdf0789f93d3ad0a1153647d75956e59c2b10a249c0eef10267fe99d2e95a323ad9bab566d11d70d30c8efbab8379a664c8ed7653f49f9d8a9019fb82222eaca47d170d895886a596e7778b4bdbbb47a12b672277d3b48791e13612a9cbac8c19263a137fb3c066c04bc5512dec4297994d60eeb82851ca325aa8c40ecae0c83da9497281679bff6aacc277765193b41b6096735b32017a6c948f0ca9c0320222c7639fa34332fe928601b129e7d6ea38c2d4db22a060cca56e0f5fb7f9c35299d6ab016c90e4eab8c40539eb61e3c991e03e6984b37a0e98a3f36ccde0b4a609702ad352cbcd1bc18240e11e24efd31572e4ef31d25a6744edb4567f9da1036721b4c851d2ba023d4632abbe92660852b9074be81b7111490cd93ed26d391c2a42a091fbb6e4ad9c3137212f5ce0d25980ae8b247acd84cf6b992a50bf42c31e21dd081149627acb429d4a613ff9312f3877e9b7cb6986b0a4a8e84647cbc3e7867c5c1a7468e63c41329743be9d0f287df834966cbd31281bfbf533401ae3574837fc34cc2d2098030f44ca5bb6adc049a614ca39efdafdc3b3f76b68b72b51af22d9de68a3f352e72578828107985c032b5d9928b5880947f5381e96abbebe293e9cdcd80afeb6efac606eb6e8e27a32fa615f7c80060b2b6f6c0715a90277549cc3cf02d1df689c3a2581413a4ac70732123e3ca44f121ab3d672844061dfc38dd01c35a4d87e7aa4f04d4341a52550dd3feb3251f380f22bcca2785acfb9b33eb0959137acbb60ab58214edfe7efcbb452ab44c08f308714ed3a8e5a45a5a9c5a2c000bfff87d01082693642d090b9b699b86c1fc208a307b4b6b18fe91de626a8cdcedde9eaef169dbd7af7d25702ec5de687858159c4dc2ab0afec468a06f585d02d661bd2f01246abbd6774657d49013154be314c8bc2b3b3dcaed2c4a39f4189a6695384654353e62a460f2665e7b9f6d032af15c990dda28825c9d3858744aed9752d3ed80e63804676d415ec6b77f3f15f8875ae2b8b133d667480bd6a5d506233da832e616556353f651030b615396a1aa0c95837259b0d8bc4ff833190602c8f9bf9cc91f7fe5a44836739f16149c0f284b7c707335b7df2451383f49efce22c89c914f93ef76ee30d8ed31fc1f47958077d65ed2ef30736462ff561459bb51010181afa085afd6dac01c17fe1d5cf5003094c57298a121743de9504d7608279e71ff29717cece36e6483ed971a90ecdc79b5399efee9c5c25c0fa91f61d4a4c89d1b013392d6d5e117f73a93978836482f3a13cb48e5752b08df24daf0844f0426da4fb5b42b173adaaf0bdd11bf84502d500a8ce8acf858a69b780a00b8c03b05e1718d51549b3db5414ac7ea1815c47be814d16664d2ff0b68f2bcde073c2369f1e69c2c0c8d011362b4eed9acb1c7f58a2e72988b759e7b78dc2d64f2af8962cea24844bcb6a4be49fa7d2f11358334662d699e0c54ca4dea1b8f451796037b1a43fcec80091a2661e6dd45e74c404621904a9bca9dec90dc42580ec1ad8488019a57aba31954ab9cd0a34e5f10134cdb19665fd3162a01e3ac116e232d2a946419ef944861b4d8fd597330131e72b191acbdd799cdc3c37f568eb40dae188bea735634098dbd9e7bd102113cf349f5ef120ac58e5d3a1a263c665ed80b4559a952491367030ffae8151fec9fece9b7228d9d73fddc4cccc1f69250d1e7692661cded977a7b509560f0628cf8959c3fa8c0c1f645c70e8eb367214be98d26ecef4c08cd67e8adfcccded4a7c04cf6a3f5276a7f870298ed4ad04bd4ce35e520de8da5ae7d3c019931a31abb55bfd1278deda476a830885cf70a587c0aa3d4566009507c4d83bdc8a199c18cb6a714535cd02384f17c10c787084761987d5758e46fb29bf73656dfe8fac1fc21bdb9bb27039139c574db3d69eb04cd851141de4c31666dd9fe94e66c47d4ba107e0764b5795f73483011fbb1061c4b6d12936f768fa45f1f9d89d0dbbf9479dd27862dd3dbcca58de78f79293b381c52c33bf2c320d59a9d5f6b81383f5309695262dd286dd16f9a602bf36447342accc720fbdd274ef9645c36541ee0af11a8d2da70786e19659ea9fbf70e875c63458d1f6cc29e78c7ef17ed5ae83b5f35a2cd0aa07d3efbb5a8e5da09713ffdbd84f3edebf0e3bbb36083e906234ba8ed2dc78f6195d736dd82988fb84dad892bf803c17dc11f72f7a7f485ec3a43c3adfcaefc3f53c37ac6472477823efd05397beb4ece0a3ea8f861f67b636fd7aabcf8799daac1f224582271cbaff5d19e7c0ef895be36049f067fa020457c8a64ea2ced8e65141b77d1c6eac65f4756e90ff15a277b3f1f66e44ef304a56b002490803178f5cddd6568e49598c2391cd99503af234d42f74d0a4b920af049f90a3c6cff3d842adc4a69bf05b90be71d8cfc4ed8a986c799855c806ef5d40980db3c2c38c3f74e114e0d82e3e2ac558058b9a6d99f894d86515c70ab11682f94f64fd91cd24eff50a4af4ee69c7b631c099a82d0a512abefc055d7dfae6f33f2dbb586dac8b977f1c5806781ddeb02dc14cf0e5d073cb0dc3f8445d853aef0316dce333d87bf8d5bca9512eb3fb13f5a79c9310c7dc068a4992670b7f53737ee05b14a2190e25412115c563bcddc865e5af234bef8d0a2331f11cfd459ccaf431e5460d3925fcfed7f648e888213508fca179627fe859400e39a16e0aba81abec48067093071dd0ab80a5b899539e2bd467c33dab795b1414a718801eb7cfa27906c614b618ce89861835539a3f5fdf52eae4e0e4ff029f2432015402f4767b3f32acb2c553a0e0e9b3a185306de0c855d8bab563eddbe5c57a5a93751dc5220c1cd72dbb0ad6ec80eebcc1dbd2f21d845b1b4fcc74f466bae2006f80f1eaa738e0ebe034edf159e20a4b735b0765367c016299556eb0d28ae06e20f8c082a864049beb3c0f5c6a97dc4188c32d051cd65198a81281896b3c30f94c81fa806b1c2abdb095664d7040913d2f20cf38cd38ae217903d3115369346610eb60b1e0c7f1c2384727a41c2a3b7d9e15442a60da17f4712dce030d10d8f56ef5650824d94dd79085dfe5b8e440629c044b82cf71ff6aa7b2b468b92d06c82226599dea0edbc5aa02affe0a505067663111e03c77efbc2a49b307e29c21f22123bd7f41b0de783dfe82ab6267955f7010b77b6c70c1f02bc215e7ce7b8d4dbc1d69a37627bbedd8362b4ebeabd3195cb79a90127756f99751822fd33fdb78e977eb7db6eaf90598ed3ebce6696b1e399cbf2709eb40ff71b5b83e1f93781a36ef397111af2408db8366d6450b938e2eff59efa9d21928f0ad091c8add285cf06ec98f5ea9bb97c4b9608313293bb7446fcc97a2bff0fde91b8941489738ee58185e45653cb2637dc6bf0e390f2dc2633ec9e9a65c8f73fe0e72d341dfe78eca8a11f9aab7d5634c659982dc19df791b7620f37a01d1bad801b2e8990c563993dbcd7c33d70a867260fb44ff2aa0181692f6cd94472b7306c6a9a9ba8103fe864c559b05674479d2a2791b3f17946c37bd9682a120f22084f09dac3e40c91aff169720aa6dba8094d213da851b96db6f16cc754eef7f593df8345cc058af6651bb9a99832de7aeb07dca2fb317e7e3d97cf4ab0398d1b7d31988ed556046bec6bab1d0917c643efa069d6257cc53f9a23b1e7537223648202c8bb72e44b64da3439a609e275bd48410ae37f93536b97094021a8bfc8562cebd3b3be1df72f2bb9ef858b9a58db1151e8ae3b83588476f92144313386f18badb83d2196e165902e52fcb111e315b695aee0a4ddb3d25dad5d7f05804cb0658a308cd4d9d8f7da39937b49c547cded2dc9521e89653dd650ef2ec720dcd76a3a6194a2a20afd199c6669fbf73e65c78fc80f4f920e9c4ff3271747e3e7259eedfa5978a1d8f0c440f1dd472e151fa47f677b267276383811bdd3985759528a3614ba396b2a0ed32dff39bfa79aa0e1c4d1f62d7d9f66bdc8fef62895dc4be38ca81daee1cd9b203ebffc795e18d0843f043cbb27f26e2982a7e33a507ab637fb901f5a065de94548ae84c026b8c7c6d5f7045cb5b79c9f832f3ed432a21fc8ab77c508056f2c7a95523bce2fc49c09dd221404038c8ddd802bd003934d84dff204b627f80925f5ab9920168f0fa8390c22417b67cf0c5ffad6445f23f3c93f0c67414b092d001fb8d7bef38c51c75943285ea36b6cd8d44e1caa730c88c94ede1eeb6a29edc3637043312af2fcec47389e436f28c1abba5415d989044fd032fcfebf533fb05826e0b94c92cc2ed86938cb672db35ed9ce37fd49e076388d1d376507fe2d946b0ff15bbefad2ff1116750619715f21a751110c2e64250dcb3ddeab0e83f96083886b81d7bdca39facfdb67b58b8b45e20737ac510568b21a35ff558e4c6fff1e98ef606f4ff896cbc450de26bc111d3e0c8b187599ce53f9d547031bdef407a48f87912cd641b9ff2cec7e4141eed76ff1d10f14a30faab819f7faacdf829c4fbaee1ddef60e2d23a1630dc350f8a5b879d79f7d12e94baf257a848cff9d228fd5515a491efb0b0640f61f63d3cd4eb6e43fa97340fd62ed386e3542242ed49208c8dbeb1ecfc7ee7c47f2a5e18e71445adf5515fe3434636bd57c337705cc6f89d83a1ebc2c780d5c330f3b95c34442624db8ad60cb6e9974e08c3d2438f82cdf0893e3d42780cb76547a450be1a1b7476bb9bc7dce30286e1047841df376516a73c39efa95a60a901a6318387bc765d7b0e78100c79379fa2ccc3c3c5e8a878955aa525610937728b83f6134548722a898030ebd203bf7d58258d510260c948378e05644b6b9e033850c0cd4869adafb0edca570d0d91f20b1f62a75db258420b368b248a794a7a0bc87c563d51bf77add4c5bb57506147b3d86d1634e4f84236482e3677fdab0c3c9771a8d89c8ac4db5007d3ef1bae58085ff18c74179dbd6742f8debe185eaa4d3badbbf44feb36dd38d657cad8f441ea2e2cc0fd167c243c87bed73cc6970f7719730805230045fc37e035a7f9ddabac88ffb284592750cf77f4f438b21dc005a7c1d02eafe34f56ee01cded85fed9d1d4347aa37faae9dc68e8b4a447e1c94fb18878c804959934dcbdfa3f5a5bc4a51dbbd987dcf0de2d274dbb9b3a6d94b398bd269c4f7c228f109b334e860138bc16b1614eeb797ab66cb89110796f078e987d5095f7ab561b16084a1897ccae3bdfecea4616af65f91be963f2833cb1d7b929a150d68d80f941aa817bdeb5e7ecb1e2310945acbba9077d51612341f39bfff1854cb54f57930eb1c9525212d7f645aa99f4609c884be7cbf7dcde7767c4d84513506c35fa94676af331a5af7d505570b2f81916c7180c587880b33130ef078231181f9daee6e8de4460a2577f645fd87bce246162d32f4630ea2756a07dec96ef49cecae2700c1be623a6cc0f9aad303b4d6f1936ae8683db3ae235bf942f51721f7e58c0cfe2548036bf865767aa82bc70b4e58e2fbe262e825a5ff7671c3fa5fe265c46c9b4d2921a52c2294e3876b38061d81bc1449c634f443f50aa50fd6015efd1b29df6d159436057037fb259913bcc381c9e18216c8d1ddb7976cf9c5e82ab9fc1f28d3714b4e66546ffdafd0e03578303c83b2872128e3f315aeb65fd24b65100a8bccae704e005cdbeb276664169d49505939602018100f8d6a245b1991c5e0524613d492cbe049cd80c8c00cadd126e8b1bb61abb951b35239a2bcc5b4a3f54cd268bfa74a5d63bf8943645bd7b1e72711c00aee603e78bb2c966545be067be067c3fc1d101e8179b6364d7826f017265e90d3b1d6ffbd8a1921cfac70bc4ec406950779e786ea7f827bc7e2bbb69e45971cb6a600a0da945bf3cabaef519d08d4e035c7e3cc6c11f4aacbed84807f72f6ca8ff048e549c4a84edbd33646865e105b928a8d0e3befb7a7f35ad81311cea71dd7955dd478f202ecd82c46d3c81e2dc54051127e32a3cc3c5b6dbb96554adb60d1add18f519ff1735d7a8c0ac7bc61a5045ae9079d40321ee1fe2bf98344da6d97878103040c673fdfbc119cf61d8d9b7bcfceb705f18176adef837fe7c75685ffd9904c1eddb6d460cca46706fec52f992863f65e34c2341f868caa1fadfc3ff485d0de201cbb629886968a64a33a23a27c82fdaba60a6757d51e1442ef10ed793349d2c7586f366361f5a8e23b77acc3f3143325e4fd6b73e71a249cbf77ae8bb962163238f408d2372f493007018959ce7d94ef7a80fc60dd68431bc9ae57fd076be356a1832bfe09cecec34062d7ab2c3a79ce9085a45c23b28adb8819546ad8d69869024ff5468c197a9df9b868b5714f7f18617f3d81f7a480a18ed0cffa2b5c13d8de4fb0206de20c460f9fcb40b6261b09466ecbfe2d8b6923acab20b12675c2ff11a5e42839486cb35e9731638115d0d93eb0238484f797f125467f9e953df64f2c4a4c5c4adc052b6dd71a196aee4962817f0f94f974ce99e6050bda4e4942c8b92ff69a656a8630dbeedf64a40c1c113f6181d51edb964bc6045dbf7683c2f4695d78e61808ac6ee24dc7b2040942c3388fae4b33fe00e55f1bcf8d3da65c9b7e70ade231e71357b41b8b1e24587b559ac42da32c0453be8c3c546bb0772576423806c2e20c749b4fde468107740e8013789df87507d31c9a029b4900a1b2857fd3040a5cb6c1d2a3b73d64b6be4c4946d8c6cb4d4878a9786fb1f91eeee9a68ff7be129471e818b122f9213ed5e1ef35b345a5bb2bda0f26bc17aca3b20a43885afdb7dce93a5857aa8801b1235302b7883a7796cd7ea6cefede17bf37db01d8982240b57f4c1d9b785d706d7561373a09f697403565df3afc8e52cd18d98673bea649a64cc010f082a5a4a8c716fcc7529c1911b75a0624fb6d68a91a492b73d3ac3d3b43d5c9b8b71980daa3b64a1e57b9c3f041d8d84fc00483f6701c80c969779586b2e7e3207a32e11fd11cebf0eb61b73b5a038e9190bead6f2cc25bbe5e2e10cad1a0b38edf37e29a4dfe3cab7684b6330b3b05d399cff52ebf8d2d8b3d2fb76d5506aad53b88ec9851c25ab0af6a97a0debb5bf5576b21b916021e9bd21478dab0d00f111331f3ad38e826bd57ac4cc65d0f002e784bababffbf4b13c6d6fde693af861eea1013774bb491ba66e6c9b585a1bf386ebccfaeab7c4e600d8a6ede8a2fc3f9dfc7c21817e672acb686a1abcd271af3cf5b71b21d62cd8a13fe1d8ee2c82b262ede6e4fa396c8a7d2079ca6360f7860dbc1ca6b268cbcb40942a9065798fec53a8ccc4239a464ea2e34294edb806efe795888fdd997c8ec5600e4fd25cf8b00fe60fee4fb91b8168ecb0b44d9ffc18646958b96248ea40b5afcd9706e9c432976525eba73c39df876640e541aee4ffae2021f7687ea7b99ab07c15dd794db9ce4fa811fa199e8179523e439606fbebd718862b2df7550d402394cbe77f9ad8fe1574bc7f519b757b6d4ff7667a2a8c93c306742041ecd4f61bdd37118f2f55a486aad0e7d1dc5f309a7ed14763fd4569b7ace59a02ef656735c30f0f82d088d977860c3f9a7baac18feff1105ae713e6160daa9ebb16a9ed47984534df5c8705ab9b651134af60c123cbfe58b07f9675ed2b96696425544681ff85a2eb2b2c1ab4ebe11bc36ed3ad64a97ae2a5036b71db917843581b19eded9cb42eb8a8130aa8bdc02cbab6c7d54dec7bb33a48df1d8b501eb69be22613fcfdaaa947f9c2330b768fbcdbe1708ab9d2b7ed699214ff84b574bf457c9fc5780cffd3f681ba9961f808df72bf4c7a6cc1f0dd689ed3957561f807b6b90983b2a9ee66b60fcb340dff9496ca0938faad11a28748b8a049cfd62310fb3191cbaf383466fadbd1cff3f3e8fb40f79927be196d917f45b8276e91829e9d12f54b8133b2b3b3fa5105505c73c4220e16ba63bc9f79d71677fc89b8906d50c1d651076586bc9bb48d6eb0ef5f70d303f2042c202f131184f78243245a91ffd6592412755608e8aa6cd8f6c4b2f80b4a5f1b9b9b98f96f4e59f74eaf37db3bdfc1cae7d1a401e677e85d6450e2852996e4a76b3f5980953465f65a48df16f0576e701d9d4e6817b0ec221d6c1930cab41015d242eee5e44664228dc03e30c144fc4ecec12fa0b9dc379e816aad20b90ef5236829bc600e8cae8eb064206574adff24ca8fdfca225868bb831b27e27159a6bd0d6cf2d86c56ab511e426cf08e761bb77d39aa423e9add06ba95ab262cd37e1f4132febb3398ed7614a1e3e77e319683c17a48c92050701ac1725a730d9eeb2705a84d71c03f26f42677f2d277ef54cf9fb1e0b391aa25963aa538fed8d85ac32ca3b996edfd9c9c50e58c04de481a13b3ed335f169edd116c862619795ecc5feeecc5316c94e398add82fc89dd3f45f4d3541a4c71d5ebcb25f8f75db22927dab131361e1bf5a64b950d6d27553db745ce27967bb81e415625291d86332bcc65e8db688f810c6164d981c6ac13a908a9e905c8a433aba4bd1d14d45f47076aae60a88990ad776f4b144dba32389166cb8551481995e1a4321d5f1daa8f906e5e31dc35237e69bcc1cf8ae8e06becf654a522cbc683db2b12858624ba843d930603fe0b98a4411faf20b16a1342fb2c36a599ef096120178e7ab3fab0390f2bcbcb55ebaee2b7c68e6880f3c7cc6472213d97452aaf81564ba91f90754fee63ef8004eef62ee71e9a75fc48a04de3a0f9f7434dfe3b1b0230ed4f5b089cdb22aaca74e6406d629a4c5c0eab44afb1619795b9478eded2c310323a7f884091ab55a8d48e313f9165eef8290d0bcfa0cdaad086607d4ee2d10ee85fec30ced0806c1468829821cf9ec60f4717615361e6f38d1445f321bc61c11542687d891e31b3d8183c85ba6e4e3c58a680a01e864371865bec720e2b70f243c765ae405c430e82e006b9b3e01d42adc9dbfcc10de1505e179eb14c03f1d9a158586cc05c7bf6457397d4021d00d73ac905aa4c9aa087aa135a4cc34eae1a53988d8b16221df6a08e1dbc8a34082ea9cdb6324c053565702996750c7a14fe8ab4749f37a25c8e315fa4fff023ce61b1605e195419581c5136f16110fae951d83ec8a843fc5d03486d00c867ef8116ec072753cac4745570668f01096e7df93cda6d3feed169a900cf0d40149933e50e59fa30a0872c2e94c14384c5c60922ce17f991f3f9d6e740d3b55a9e8654ab61e821ce43096e3c1a3c33af0fa25360d13e30154ea4ee26d9b661109f2fff59d4037f178ecbaaa4bb533f4ad67cf94be60476740f946cdf9ef550e70c9bf6c2d799fa3e660bf9a07471b09efabbda1d2a5d6fce3ec1b0d5783be395a46a8b449b181fffe69523613d67052d300bcffbcde272387a64d7e2663002ccb1e713f806fb15d2aa45a9c387f118a9b98e0c31645ab18fc2b5c5de6f221b55d17cf55209752ec1f59ffa49881cd23cf53cfbc15319f1cbe53841f3160b97c3878d86471cee02dc787de1fd1c7f5e0d654db5467a36ed407df90adb9d0eb7772e23972d1f6da65af147c6411ae1a3aafcc3059a7331a422f8a7efe61dc53c360280d366c4991bbe176076260bb9631a306ee7dcc38bd3345ccb9618be4a1eb2cfd3664694867e07d8085e1b22ce63c0e72324a1ba86fdb25a4183252a3dd1c2c32904b63f7f14787ecbc2a33387e515de7fbc3d983358d8592899e32909d711576526bdcffb0d34443780c8e680bfae2efb8e74f0b5f1c8cba6303a06556daf195a47660b97f64d5524e48eff9d3566e022c3282c590a96a823c5f7cac9a736b8a8a372e07089fdbed813d83b27123ecb473895052393f168d6a65d74ca163eb50f8c2c1cc30d5301308e82cd4fb51186667263694ca9c7e91d077a3e24a00ce3cbb8521e9db5b4c76d28dc50650b9695a1ad501a697c994c62a191b1375e32aa717cc52a3c8ca8033b34a77b5e4cc2527d1d6dd689ae80606d14239b3082566faa69b8766b6ca6aa74a63a33d87972676311c69f94b68f7318e663c06cde70f70b0db11488bc24a43c0cb8d99416501a96e7e3dfca894513ce93cb13c919797f9e759ef4469d572060cfb32ab52b989eec53bfc46b424805844840a296f00bd2abde9828f31e624d401ccb8ad3ebdb9af0bf4c1848ac244b057bcbb68d50e09ce2580355f9437e498bfc2cd27d1eef340ebcde25ff52e2e6c5c48f2cfeff2992d862e1c1a33143ecf9a1cc5d31e3896eaa6ffb7ea57ffb5a362ffc6b7c724671ce680fb01592472fbd4d1f8f5ac7fc173ea5bd11c380f424eba5bf7cfe9b70c67a96236dc1d9826400b2af70430145524f13a427c5bd822e534be38a3f79d5c8b17a30e4a9c7273fa9fe68427ea1194defda4ec868fc999ff329ac0deadf7f4fcf5012a032e1ecca56b516507e6def26bfa9ee9d04d8bece173dc593022ce248c23c80fc8588926c22f9811d803dace5bc23723b8a87f154bf7cfe4e22fbc17adcf25cbf65e4cd8d38a7d7b73da450be7f8df7642350efcebddffa0d82f07346a24ebe5e463f2b8e10312d63560fdfdc18d0ebd708c2a6b13b90c1f4d0f8a0e85567f358a0f684f59b773c9f3fa7a177e07803c24f0196d0ed504ac9e74500ed521b6dbb1af224905e10310665c5304520400f14ee3a64fe8339b35ea685089c5cf3609c92c55829ab09274f47c918388ff61d5e45a4e0988d5ade793341e7ab845b7e48565f312a8a639a14b16ea34dfa545decb85801f40f2ea8037a175af0422a631740f982315a2ae739299f0cdad8611300247487d721c122498013873ce715c7fc8d5548be227a90988527c38c88e21b9e9ae67435b0839d38d35526f397a7acd86a8ca56474eec77b43ce7868c62cc1509f85055ee76d113fa562ec54c8e3cca28c38469217a653b1d6685fa48572382e541c0bd8eda431218861e9632136f66fabfee4bb509fcea7dadfea4e72c6c790e7ba32e52e832062493c1f4b30e5c69205ca6145e8bb7ff7436f8344492b5f4b0c5887388d426886cb2bda1c36ae005bc883c2061daab9973b098bc0ed536304b75af46202ec00242fa0add098b3c8ca54d1fa9818a76b8f04f5290b3a81ac0bcd9cb2d806b4919c27342317e065a1d72fd9a43c87a26f3b078f1935970e47d770ecd4cc71a683fc0ce6f2d373e57ffbf41bc9578c1d1fca7ea3383d5ed2ee773b660104e4fa93146f19b51b80178e33dadd67d71268b2a60847fbbf6d78712f03537fea4e30794eb90c5f546471f40d133c3e6a43b97835e2773077922e0fe662812c6cec9d578267c89afb7f07af2651d40537d2786a0e5f931174dc611954df0fac9e24efeca3de2b73cd6ef506f30d047397223d5d6047c7be7bff85e82e811067bdcc2b96367ebdc4950e6ecaaf3ef0f570324c6265b622b427d23fc1d160aee67e4e3bd4ed266b87f24aa91e4bdeabd386f0ef1054cf0a8943c4dd9c4fcd3f28dc21ff41e6748360ede1ac7239dbec4bfd37973383cfa47e5eedae6467d0c5ddf230aff86828b5f01b8e47ddc5348b94405258a578408fb930bc582eef23c2ea252edee61c1b662d270b83ab3b1b99b7dd61532fc52013d1a6842f4102ab4145efb8208f019a5c046dc8d034d36a0318bc7c49ebe645b6b1df89045021fae6a53a458fdae3ad4dd28d5fa495f7761b090823714cf9b0b12621160d3d5e852fa0ef4235e31eea0fb5377ffd0b85f7bff2f0aa95f064eec763a2f7819488eb1dd67f275034cc4b03eb2026d3813f55b5b906ac45a333debc60d1f673b8fefcf4d4e3485688337763240cdf1c53d479785afec0a7f8cf7a04d367202e1fe0356dbccaabd37e923b764f8de63bce5fd4db75dc9ff194ca734bfb5b19f65e425ceeb317eb3d2bea61f7ed1373b0eeef51a3e32be352b3ff4e6e3a157d05b4647dec2bff609bb75ae842ec80af5f19edef14aa6e7257c36a78fe36d1d543459aa4bcd07781fbe5ccdb8de3a6cc4ccc708293c81e205d190543d53ea947c27a9f2de5dd4b1f5c9d698f28a1ef2de5751d1245aa82c39686d06b726be1d89b1ae9ff1c36febd2ab9fafd890976ba41eeaaa62fd15a4a6801d917921d174fbba510c789ad9c4db43661334fb5bde395f3185e1c5146aabef474ece20b087380a981267f7ee7faa6b49d6a2ed19f65f934fc21cecf579c62fa5ebce60c866849d097a89c11ba06d689675a2516d721a444481869668ca72dc42ca83231c44c5a6cbdc0e4cdefc767011edb8efbfc5b1fb44b6ce86c5467401e5ecec2addcda666440dec2ec2479c6d46c5797e424a9ba956b2716ccbae31dbd877173965be7ae97ca8cf6346bfd989a134274fcc7ae755987ff3de9a33d301402e0373d001bdd0191549aaf364a6d4240f1cfe56d579b10a1e623849752f61014f25d6a7842c8c5b45c6e9df7af3555edabbee6ad993ccfb92bd3d42287c66b8e88f7fb1737063a46af1d854dcd77f2ce6ba74eab10e63d9f940fd5496c96d1b324d4fe75d6d210d633c4e4a74ff54cd2fd39a11f44e5b9d3941d928528067641616badc9b159de6addfbb5c740a5b0569be429b6713784b66f059e2cf3e0c7c46f382bf95372668def0ebe44102be6c31f16821e45ffc7ae43e1fb20ed9e384efba201a3e3f96c491aae25eb25a438f41b9bb938b0b9b38248fd46bfd440604dd6842a71c144730e38f1c2da0ea5f654eab6432ba9aefe90cfee1b4cf4788af5ef05832c40eaab7b97e60ad65116a51808db0a15bd001f36bbb940864ac3ea3476840d8c3257fa8186d24b6f4dfd6aea1902324e17fc5c8de8ed12c4708f288fb197dc96b0a76baf62637a756558d26b8079b022309b156f205e519921024b24410150f7ebf4fe397514fa94dd7942e3ec8c420114184cb408873a7ce9574fe3be2bd94f4ee5f61355cfb6b704c160a11bd43374bb7eb232e90023d6a9a4e17714741924d876187ec9637c9e7dc4f785f46815e6ffe40dfcfa6529fb0fa5e8c0ffb1da2d47339c90c3c5bac6361ae590e73c403befdceeafaa290d752d20a72b612f93508a4b5b52d4e79d4f2b7e86a37c05271dcc4ce294bbf20058def00dbe64cd9a85abd287d5d27d24076d0f1a119bf24e0f0602c415b992df75e7953147a2228c2c68b250e44f632e427f1a293d4ff6922a5f08b8137ccd5423190ffc0ace3ea1ca8c74ed50aa4c554aed8a9775ac2fb89207984cc8bb4143bf3209e39b481efa913c761ad375782a33cca3ba4de384691c60ac76c3e10c7f52c235cac35c418e78e0ba62d845b79a4fa5f3ca1d083c0c098f7c980d86d57bc2bd2d87198d27c41d1832cc28e8c224a9934d9caca4db99721df27dd92471d4a7f367722c5342cd69f702099ecb1f3860ce43c1bcc94d1b3d237376d0866d257bd9c89e16457097a2bd505d59a947d9ca0756acce0e6aef9307b467f76f5080f1318ab3138e357435d9a630b60a2d9ff2a7ab9b814b3d880f8d983fce9e5c84c63832c4fdf718874e18217f9e6376543eebff4abcbd0076361c1bfb9beeda71f967b37b6c696baf1ef3fd7f8044e6fd696c3eb97f70339ea11c3981468292c4534e7e1b23559231663c1ceab4f51a662e6be2ec82c53dad3aa16269bd9200103de84b6646b2565a57a3119a842072a80c95742d6e68ad094c8a7ca2c1aaa374dc29ba7758e0b24497cdd8acfd369caae410c17f235776b71bae2dd10f7ab0c9acd56e7bbe3b6e152057db1728bd84182c66d6a8608499ee25530b73da077e28b08584cf3045cb89ba7578ca190473557f21d70a12a1a30c7495c0c938d00adf2977eeef9793cae6f9dc298bc411c21d8178c26eeadd83ea5f647d1b0ce81caeccd7db45c58e15d7dff1daea17be7df75bf91f3ef0050917b3266b3b2cbd7ec1740b178bf3affcd6325b26d353c371c0d4e0a27d7024a3c64cc95e87d6a5fb73f01d09111d53a4fd7dcf1272f81e41346b615fd1abb4de53fe6537914c27a7b3427d54f18c6ea75568fbb8387b782ec928fe2b7e7170a8cae10198ddca2496fc6854c531902723a6bd17421686bf1502ed38a5774c4bfc8476edc09e9b7a8f21274fd5e4514d4809b6de3c7f18a0b09c8e49422628fdbb091c82e107f3a71fd2f9ae526206e78c6534af46d4508394b80170ac3f4f95f0676d534927cb99991cdea4189dfad56463880ed4e9057675e8e2ffe26e4788d6368e3629c2373be13b91a30c12e681abc4103f20d4ef67d6bd60a9a244d3214a8a0d0318cc1f6fe82247b61282544566809abef90c56bd4404f3044a5452cb9b310a9ded8558887c2142de7a7a6e2b538a4ebcbb321a06de04024528880ee13b1c40e370011e12a5585cf28af832d6a91dc7db5511af1ec151d50714fa09bc81868e59ef0583f68f66367807cd3ce48aab6ad95feedc12f3f711352a955c3f4b4129e704ec723e1a04fdb301a4b4bd48b7119c687426a5384e6becce930d8bfbc506bcf0e75d98263321c34505a5659d3ec868a731f3daf6234759e684af8a022047b37cb5f5b2f0d2318343fd40d64352743e2ead0becc74964608a8bcac6ced0c15555f556ecfb6c5cf6dc7a864f181d141a7533ac1c5af53c0ba5d6b1e399fb72a69698bbd5b1ae05b87cf0b66a7eeadb107494b0bdaaa888e8a4effc3c3f0aa047be767efa6082089eecc7483ee928f199c452f0b1ab17ee8d037169dda0aa0a2f6bd73f4a60a971280415663a9f704d8ca3b3861fe462977d186144ab4acd20300e25b797a80e27277d2f516ef07434ea6c31d4b0635ffac3dfde5034e025a2ee11be76f0bfb4fc8bd40a3e02de7de7af65d74699d669028eb1ae013b0084eb174046aaca68190ce00e4f184f052b7a1605c550041ebbd99932e0021f85d395131efd2143416665a10cabf148044f77c2fe12e8283efc5b94baae63e97808c997d14b0b59dc7136b61643bbef3b4289521a0d04dba256c6b0c949d95be02435820924498949b0fd219fe920d5b946816d24a7b871174ffeede92ea3314706591e93cd4977907cb6d7a97f66683572bae4e2696587f65636b512454936880a92bb3cdc8bd9992e79ed4edd92b1b6c4336428d0ef735154c8d967d2938c4727ea33328949309c6d02d86706553ba929789025562a40b3d1328e86d717bb26c0315bb7e1e8fe0c4988c68d1132afd45c942ff85b754d84e3a5289dd0a415c6366839c5023ae7ec774f792dc2982a3d8d4ea51501bb92824397f57938cc2883c2a9c95be96acfbd8cd552757bd47444622869d6c2c306f056e4d742939d34a812c68f06676dd90d325a7cd0524f30eda6cef9b333d87c8d6d0ee8675b106c6c81d4eb9addf27e5dd15b42e805608ae4b30061eb964186784df5fd7a1826641be89c7cdc3fe15e7004bfbb49207367145f1d6a0e0dd0b6c752d780e8fa7bb6b402fcb77331738dcac4a638760a8e865550baa393f14c7bf3beee7c0a786623af88cbff7b8be8b12de59869f64bd014fbb7ab840055f28b7591f4c1277d93d27a7f5ea47eb6e89e66f51ecbda5eb45ea32301e9cd6edc7d4d1d9d0dddc15434a3392deb973be26c56087b0b65f28c7174d01e65b2c9bccc01ce61d5a7610bf7f5f8e51d0ab48d160694fe636731ec7f9b8f8ae2b345bc1e254e1e09295c6986f95c3f31f10e5b6901a51516f7cb7c390aa6685c0a1f4cfc3b7fb82a3006fe26beef49cdb0cf49965576acc8527958063f87d0b7b3a8c70ace0dd3bc48f261966c57684682b33dbadc94acbba8e7baba8e5f4fcc620aa68663b0adaeecd4af004ed61bafb9ec218e3189037e827b843f47843c5ffdab1dbdb1ebdfc85babb57efb0424656d7bdde84eae1a232ff9d8f5f86bc56fa4a4eb701379a33e8abf0e6babe06340f6997ddb22bbd2607f649c2f578a3f3dce39da553c5a8bf0a7d6dc8f10281f156f8ef501ff59cf779c8ecb3aba0086ab17ff855537d3bd76ca43d24c198af1d3a27ccd4adf61d8b61f3bc66c16f6af7c0e75574187fb67edfca66a0624909f293024ff0f38a8e2d08fea99a30d0f24db59d94d0530e86e863b0b8c8733413ff7e5c6ffc79849a414bb906b38371d161ef9e97f0016991b372494f4efc1917ef6fe062e4422083b67f66e1053c39d3cc1cefbd2579f6dfb81b3d0fac0cff0ef022f16daf3b29999eaafc79377ed896adf57e06539737f677f0bf59dec7d94ee1266dc33d5ff60f5071920d35ff642d8f8c799603bbd3ff755c1f1a76d6d8bb694f7cb2c1d8ae5313ca3790dbca579f3815b91e0bd02940ecbc73c49a6587b046bb061f7ad630e290f05bc3bd3a7a0fe2bb0ac3cf7ae8a80bfc4a7833b2f481dcd851097bc698c1c9aa113383ff1e7fcc48171df0be91ae433d79ce5fdb11c0ad63ae1b754fec33dde320e0b3265c88777ac5679615b6fc3dff35b38565c199617bb815bcdf7bf16b7a8eec2ba0084d8f61eede927bd0f3c957f77f89b18ff6febb534d2e9e806f1e3f9bde52babdf9f874112f92fe77c060da91de5b813606b8d3b82424e646a1e3f5db9161002b077dcd782cf2d51e8a039e373675af1c355a4a369a7aadeeb3d15eba9387f9a7298ecceaca731c389bb58d7962a60a8005370a65258d64c15bde58256f6aa7571d97ac22cabd96d12067d1daabc1c916a97d71793802d46b9f3108cd78807da6e7d2639af25716f909c3e3fef8571e9692875725dc84b5ae0e1c84b322d271ca332cea0cac0358ee8eb87856d92468d2d29f120130ec24a07c156aba672f8ff5da97655b0fa6b4cb3a6be19403943035c76d0ad966c36370219db98a7636089847a7bc48e4e21de4b4b4b233af4fd538c3cc40b9ad224229ddc1d6035e03d5afb05ea560bdd08b395ac9840fdecf76dc1084f8d0fe7f7ebefb9be15e197a96d941b433b7baf52c86bcb57c14a774faff1f6c705eb31f46fc39eaafd3b66ecdcaf2d27ce2c5fc3cfbafe7de6b777bffe38456e60f1e9b4530ed9d2de43e94479e96c5635af7d453369f73cdb26ea81f1a4ad3d5387b9f16f5278e790d68fc9ceb8e47daf8265a17e80c8ba49e9d7059e7ee2d36ae8e8db465eb381061f8d55a9f83f7b49021be4362f968825dd287bccea01a959cff92339b35e0b9ec81e112e592fc2f4973454c2868cbc351a8c39f7b529b277237ba66bb3d9e58b7f060350c7dac08fa837a32f0f8c00dd8b34c78c290ef93bea10793b56d6057cf3f41c4998dfcbea13c9b723e9537656f9dbf672c3ec027329632f6c1416f08651c20fc205838137018ef2dcb7db807f9beb6eb872d02f6bb4267f76e62b17ff98aeecf14f28e26df313e6eec5fe2bfd73d7ad1a52370576b692caf3fe5571040d19355c5e9a36ce6008aa48d9d05f83a50945aa022f6520623a923de371d22f2e674f53f0e478b1d7f9691ce53ec33ce59e727b3c8c785c62bfa2f481f24bdc720b69c1ab4e09cc74d012a2cef0403de897e3c0a9629f383c26f1c03269e3f6c953b4ef58a130eaf29ec09c15b32f8fb1f6aa983b0a952fbd2fbfeab8a3fbc7fef8d5842601adbe949bd77ad0cad380ec1b383b851983e25ae9ff675aa5fb4213ecbe299db465f58c96d9ea5d24083495e2a42fbeb2c6b0720789b78694e2657188f2bd26f99b57d87ce04fca268dd685811706d6f276d5bc378512e9a27fc5124ad7faaa13611d8758a07149d4c21b8218aaff07095be905fb4e3c2168d77ae20471825e24b3716da230eada10beccb9ebd9a0ab3bdd57ac4b0c628207f0eaf1f86b89cc84b0dfdb2305d95f8270bbefae82928f8267bc333f802f89bac7763ff91b099f583984b3e7a729543cfbab45cdfb45cd975790f3137c9e7be2539e61d8ddf2796dffc3583679e64d63a26560978655e17a593d70a66d04798a30904b1f9711a9fef1a3f9ab8d25a7b0219bffa30f70b88716eab2ef4f5eb1f41c7d7cb7c236f907c667bd9ee032e606f7b6cbf52c7c79dd55a5ee675e6b9c277d87a734696ace4a47a795926238bf9b085dd40722f2f7dcb8da1f3d7185b7cf5047fb0da7faa179d7d23a31b40121b1705a7f404124eb24d42f3088387a8c4decf9ccee267d9737550a694c375bd3baca4c19ee93b4cfa5d850e86422e025df0ce2b4aec6e2c4e80ebed3084920cedcfad90934086a1be3f6678729c1b0f8f0a3cdc221e6fdc96cadc3e0f06a7dbb00491fe43c8c25fe87afa65e956890070f4136b9e1e9482958d9116d9811c32e32ad97ee5eae0591bbecd6daf782db19f1244550b315db812c9ae9db0773de6e90ee7d2f9780f37692bca63c6bc03befc73fbbf3ac3313a49e562ba62ed85e30a3dd79f3e60dab968404bef14cce7a7fa7f54aa9aca75eb36ae36a18afde138da6a7a32ca086bf8ac93de1bd19f7dc81ca69ebca287e1a2c0285230f605906a14d01305e31720e1dac7823df62460a746a89b67673095a154298b382410e1dd00b5543346bd5a57370ca467e4b1c5f4a79166cb3ea7d5e816378659c6cb8801fca144b0069b2bae1a43795029afd30055e48ac967db69b1a22b2f0855fcbcf75bf53aa1284ea71ab47057403cde70d1308e1c064526aeb92cd0c6433d88237bd7a237e5810c4be9cab9526fa4c581d9c2d974b771c42230f8baf3279fb9ed911d02ad0757a5dffd5b54af7b21ceaa77b17119f379127c24c9175ee20e14a1822635f67f56df528e55e856308bbadd0d8f26a29407da3948b39426193ed1c26ce5187699c29ac4c2c8c3a03c9643d4d15242127d2e9ccca3a034a3171d1cc3a3386eb2e6c8c3097d9bc7eb7778fed8cd5ee30f4f87652d82cc7ee13302f5b78886274a3f357bc853f3c003a34e85c65813fbf7cbf1f74705de301b3295d8b5cf552c2a8e4e213a0351e0ea133343cd009df8fee5d082f66bdf440f45a5a190a93f19c93053d94c7c67e08d0f20a12c8f67768eb084fec9534a9aac204260bcab4dac842b0dfad42949ba7947ab4b70676775648956407e14d77c412e7f778319cc3afe4f26a1764ed6f72e0379682dbd4ab2a9e23d07626d63927a125abd90faae7a5b99382cca962855077e338756132bd7b937680586eb36aa480723dc05da001b570432364dab9339ed8de9bb88352118d3e4853255db817210141206eac518d0feab926a6ce550cd44f1bbfa6f24e470e2b0498cad1a885e7bee0c61b367fff324712f7d18f1fdc1744f45b79fe2151ff8dfa6ed14a32fa98c1dd6f2dbf18f8e470f5b3c81ba46b078e66a557ddae81726af6065e370265f90e26c8cfce396c598ae6d814a7b18e49cf0ba5a3107969f2d1f123475cccc8bcbf6998df8f32970075573ba675dc9fd9b9483083fb8bbff49bf63c78868b9127fb68689b17706c63d50b00d0e77a36e4c33ff002d980a6f1f19ef9fb78c0eaa4e493875ab0e3e53bea414a767b0c23c3e2e4633b852aa44ac0d11b3985393ccd9239d90ec4d3372bd3ea30af140db9a887d41498431f8dcb1aed80c90bab9205bf8a4d72c18f5039a6fec551ab76a2e95b2a094bac6834dbd92640306ac520d9eec83a5eec3f645b4aafb9e9250e6b285141440970d2f5edab7d8c0dec1b353e4e1ca96600cc8b7046580131499b00a191cc99912f459e5d354875334c2d4e11186502d99ccc48900d32fd5cad1f85f87813dfd6c4ce8f2c431026e886ba0f8e488e7195e638cca59f0a832e48ab4d0be52785572c7761a959bc6e973145f7d07168062d9c2ba10670613dbd0530eddac7fb52fcb05d66feaafa12be4104099803d88330cf806df90316ebb4db86c3dcc1d9ee5ded2bf57e7ab230c17b73a7160d3d2259406acf09c6f844b670048e4080936ada9b327798883afe067b7830ed2de83ecb93b3ea406fe505f607101918f23504563b7c0909cc88308db395b5fe876f6d9a01336016df84f77729fcadebb639fe77ef1edf5ce32ad268a3e61f7b97dc207301e6c416c43d5587ac097dfaa259615ac73a2705e7fac7120d67e1430a37f9f8e15aa397a4e709754e18a8492e8f03dcc2babb2a3ee7a06853fd16f967f167294dc0f8b36d248b327ab220eb7ce1686f24d0a5f72fbfbf1fd2c251e5bf610e7ad9c1ed4e6f6ba6ed5df232f77f100b34100700cc902eab3680c02d5e6f5246c7d71a0f4f199efbf4e6cdadc0490f778f37b291be95298a1c4b30a733e8fd5f7d56bfbf7c29cff8b5c1ce9dd746e50c3f8a832bebd21b4bcfbb3a3996fa9e100d69fc6ed28b3661de765a55d29eb59af83d63ccc91bbf08c5dbe6c976be87ef3fa846d851ecd8a09263b59d152c5faed40190ff334e0ca1b43a4a7ac735296ce9c293676f970ccb6b2b82ce99bbac8efcea3da65ad919bb50ee3d474f06ef803e5f7ed09db9a9bf3449fa07465224ed6d457831a0de0147c3baeb320b88e69cb017ed5fef89bb3d9e9e106c432632f4d2a03e1cbd2f362f337330db5fbf2757c2dad4277b00b10f582e6b2742dc2045af8d2e9008a1fc2f8dd4ed4ab6461a828d69c5217615dd7f8ce87f6a73af8e57ad123833c6cfdbdd51f98c466b45723a78d731f342c5e7771efb5c17d0ca5eb405890c149c5177e83fca069be4e8dd253f0f96941c3eb0a0e610739909e4f0bee46c971ffd85d999634ba14c1f696a0e7d72b4681fd327ad421eb073d653553ead21382003d3ad246eed0731f8b91bef29e092f4e07bdcb9d9f96e4fca27bb8b84730609fadcc30ee91a9b9d23cc499bb6f14b80c3002c0f9ff089ac763516fab536d05c1e32c752ff71ef0f3304d0ee1e739b67d582b3222eccae02da0f667d32c8a3eea9da9c8e682291abcce29e2caf5e397f81b6a3ba1bd17df468d3d016bdef9a5f929135637fd861b3fc61e2297673062a1395b64429ec9db96cb9e6a5d37c575352ffba4500b413ea4d392cf82fac40af1fe5ec9d9ead41725a05fb6ee82f08ec259dabeb93cddb253dfd3ca1f8825e16cf38e4bbf29f761693e9290d050f6dccfb459842ee573bf97268eced13bca4eb08abdab4097329a88a0119bd0fa266690e4e50793aa97f98714230639d5eb7504292d30a5c2f078afa701855bbd6725b57d17d55c363ef9d07cf3d1ab9ea07a714dcbe032ec4622c3e8246929ab049bb9de605abfc4e16873f0785abd0ea245c8e49579bc521c94c84267530987c591edf98e0c194121fa8050b272dec769d8fea6de578cfbe7a8dc06fa1bf5b06df0431afd07998a484b58c6de9a08bb3a1995c619742b78c6e47a6a0502582f3f6633e7a82f4d5b69f8d7513736f2a1797853c47a80fa20dcfca9e6d770f1f9927c47f767bc37fba2ed98dba5905e84d0650e904813d1aa9b50d7b0117a8950ee8e74e818ff5ab7eb1d2e9be7db1b75b08a92132922639b95e2cc0db6e90deb1d597357ea57791dd23cca8a8ea19b2e31fb1fd5e7013a3df78b3d30ee24e93cc3333cc3333cc3334640dfb63658db38a70992292569f64c90aeb7ffffdfb12d1299644a49ee4cb43f0cfc000d07e12b0479af1142280a01d1086108c0084a95a97465af3ba01022a51d2b6a45456b6db6803288a588cf7b2394e9b74d0b14413478dbac4dea17357d2710aa79fde5613bcfe61910d7ac5eb4d258bd22953c287f38767469359e0bf7f9643098a3f8c151e3cb0dd941fd99ab0fec6acb1a7d4fef335ddf011650f870d0a19d5a8a175abeb9874e68ab1cf1e8f6f9911e50f490dac9f9303a46d7a4a5638dacc1e3248c90314476301922382879d83fece84ea307312bc443a3c234e6752ef7b48b71461a943ba4e3c396a8bcf751630606143b64e3deda44be12e563865207458ec7fa2453b9aef49d0e8ad17e75ba858b8b98c1604c46da06082873d8c486b5716e8e2f4f39e8aae67ef7b7b95b94c0a0c4411b457689cddba3bb04074e47bb76f798e66a4b286f38efaaf96f5972c36e1437f4df4a6af1dd6eadc46d60c4fbb46c53eeddc306666c53fda8b193e22929a32405943534c9fe344aca73f352aa2125f6ed6c3b2a7df5d2a0c9dbe8dec2cf843a1c0dca1bcdd74fae1052af32188cf3bb53ced0bca16d5493b763f39fc16046763c8f1d8a6286c5955c0d975d37d6943268f3877a30d97db3d864f0d4658f6ca9b3a6ee1d943164a3be9f349d3cfcd588a1d92d4f5935dccb3ed908e102250cea5452dfa4c95f957a30603aa356d9bbbbb705e50beb90f9364d523d6f631e50bca07bee4f1e43a7510d7218942ea462a3d99d0be9a7570a170c536bb31aef43b9ee4c40d9c23abc743daf0f29d3a5856d7c29555fea39f5aa1150b2c04ab17b73a7e4692d6670e0e09113921c241a680a16d652351ffc45747c6de60bca1554f536fd7ccaf17ed30d8a153cd1ab83fe5163ad49df477e057ce25f8441a9427eaf2dcfd7f6de64142a9ca2745062c7065d1b2e83328583ec57aeb93abc52636584dc10d1a20914299c94f6dccaccd5ace5658898bc0993e0e0a239180c1e2851406bb339a8d93cd8e93383c1dca04001dda52d4440794232f5ed6f47e9d2d19e982172c2e3d38840e2692ec4c08080881664a038a10294267080c284b38d1f6bbc19a5e4aaa12ca12fad7c46c9cfdd26c4606c80e0031425e09db346eb994d27cb085807428c0321b681103323c4ca083132424c031018e1f12525245a08819204f44badb5f76ff235d3a020417f7962d294dcf5d38eb07819d2d4affc57a6a3180153f39e1a430bf536424a11bca010a1d341ea2a5376e3ab530683b121f238144f8132845676c5269d5db3df5943d9387931fe648d2eb4f8024508a78dab64d4203ac67b4c4e74f4c8e3e8e13a7274801284d6c3f3a5b4af49792a3306050868a95bb9d6f96f10796730181331283f38e5739042c89ad77a4404c507baccf949913a8bfb510683e9002b82d283d5347e52d2a59e283c48d3a5cbeeb02ff728ca0ece36cdd9f8b1277bdde67a5074909aa5ae29f99ac3da5c0bde4b4244588b2b507280ee5169a3f6d3bc4e434270e0602f42b810f9000683c134891650a0e0a06f3f0f37ca72dde6c960302c780cc6060bc010d100e5060acf5ae71cf7b5f991c7604a48d020e1618619141ba0ab9558d31d7783568fa163033948d0a0d4802de16283d23975eecb60307ba0d0c0ce6fe3eaeefec12ff9931c36d6601e3cb8e04244040c353e6691d0d5f3a7a6316fb42a8b579eabd9a64f6a2c47467028f62ff900068303077ba145113e62b18fac9c56a370b9a3d563072cce31578b72b9d76a9acef1f18a9392dad4e84afd70a323236bf038d1a2071faef064d9dca8f9a0a654190ce631181b262d603242d638d991038c123342bc8424036bf0f81e1c080959e3331012b20111197cb4628d539e94da9d0a1df4921efbc18a859a63bea6496bfd5ead22752bc544841a11e15a36d6e85f818e132de6f0a10a6547b55feb7ec2a641190c66a484642447b70083b12192a345f05e88f0d091a345a005143e5261e9f66af55437ae75232724263a76a0e003152b13fdee35de96ad3683c19c78e0e314c79a6f329df3e928f67e98e2f359bf318549a19e2bc5a3943c959f85f4ae6f07e718d9c16498e08314b74969ba4444d9d8dacc063e46711632e589962e5ef5c5820f5168f286f555daa639a53263c3841920a2828f50a89509ed371d1d9b5ca04868addb9af36473e54fec3929299efaa669cbf584a9b926a5f056c327b513a9afe9522b4e98de9313bbc7797a4e3f1d4d2b830114d84473dbca7e5c8a92a63ec1192510b9f1a1898410297e45e768d5422f3e32a192d5359e3e6137d68f895da769cef59d35bcd22f91d0b57acb94a6af5c59a2b156634ecdc9e5c7b0122b996a50b3cef2e54a4abcca6659fd8ebac3e6936853b4c3dba4f55e3b92f03eebb02ed25eb61a096f56354b57d26408374162d5728b4f67bb900ffad94ecfdcf878c4364a51aac654e377cb4c3e1c61df8bc80ee2536b358d38c6ba97e97e1bf93b231ab6646aab972de24e6a657a14376e9f5411492db748cdf752c81ad93aaa262392a34500828f44b8ea4eee7574755e8888069b4c4c497d63b6ed21d0119d645bccf59789c73b0f333098303e0cd13408b7b8b449e56e6ad0bad295c1606c74f15188d43ccdbafb5adf7627c452a5527feffef5372a92a345b03e06d1df4dfe1d9e736e9d8238d8e4ba29bf649a1708b416520d5a76caf8a80204aeb3d87331f62774fb873ed47a9fd2ca8695b61f565264e756e9f24cd5f461b379f3f4dff54fbd7c50f7bcd8b07f7afb837b38aed607d137af073eab90e2f5d7c858357930b5d4a04bbdd65aa68787a65988d497631e3df42167dcf8b8434ade64ef265d8895ed8076f7d69e42a9bc17aa033776b7ae5642cfd94b073fcb2d1b657d789eab061f73f095bed9d318a35d788f2a87a5f0b6f19489bfb253c6031f71b08594ad3b3c761c57e190ad0da3f5e74ed5a9f3f10654496d7233634d773c83c1d820e3c30dc6aa5a35213eee480b1f7cb4a16d35feaa41cd61b7d37cb0013507bf599509bd72d59fc6c8c71a0cb9bedadaad52f68d03478f9523c71893f850c3c293ce8f3b5a429b8a011588f191865ebeafd435ba88072d9393911cdd0291313ed0701a9773abe650c64604ba08e10202275f7c9ce134d7c72a2de5a6c1263fcc802b953ae8f4f75284e7a30c092dad7aa51abdb4d57c9081d163bbdbafc6d63efa18c39fd5ca8e4ef5af598309edeb8d77df5b78a0a62af9f0dadfa3750683b1ecc04f63bd5a752b46be960e949b3a67973a4daa3597812507dd68982eed225c6a8f152c38e8853e1721f3b293140b961b784add68326ba6d45f50b0d86069370b33d52e74ae26dc45172c35d8957a6add940d15be85069fcd9d46e59d5aba9665c8a8cce2a8352f3d48316d7e5391452e3cab88d1ea2e2ab1407decef4c7d32b3020b6b457efc4ff96a2e2d83c13c092aafc05e75123a6ec9cc9e5c91cafbdf91a37e67d5ad409c166dd5324adcec62c5b1a61999a3edade6b5b20a85d0393f9bf2393ba942a9d44657271172bf4cc5a536e6e6cf7e63cc498773a0828aa5afd610fbc9e56e982159188c0d0f544ee168d32e53e775e7ece5a0628ab4e757ee4153aab551955234a8d0693e21757a5448a19a8332ad5f6bd0b166cd50a3328ac3ef5e7f4e83f0bb4951b052c48d773253736f41a884a2597b8a1b3dba67a53c5020e6aac3edd3a8a3db38a87c620fa5b44935dea04b073db18ace08a93a44bf905fa0d2094597154e24badc84dab4da785cb9c1832883c1ecf877352a9a389da8b43984520683c978e145c81922262ea864c2752dc4a99a757cbc9ac9d122f092f780082a98c8751029e4f99aa9fa37a85ca2417fabe156eca7ba3b3212838a252c1b56d5bd67e1b3620602954a28e26c3cb1ed51a25329378779d0557a3309fd3d085352280fada72498cf497a2965aba36845229d62c3aac6af76d321b1d61ca2b3d499fa37cd95475c9372a15bebfa2fdd7511c28548c511eb182f4ecb1139a9a49546fcaaec55a5ac69e36b32fd3b3ca02a8cb0c69b7550a785f0f6f62b8b48ddc60d51730dfed995c9e4a82822339b3d7f76ce49dfa84970a81e1b18d9b18331984a22de1ace669d959e387da682883e3c8d2a2a3655adfc107e8d2feda330519ebe21f6ec7a6b65bdaa1953211a472aadd438da51de4b88d3dd87ca9742f7c4ad0c82f38f5d27d588962b12c4f9390a3329e4eb94a5667343e45d471926a804e29ab355a731774c6f1a40fce9b9c57b523b9fd71f5e959fd4aa14e9a5b71f1695d51fe5d64ae9397d58db7587ac78177f9b302a7ce895e79b4debca9011da43c2560b61a3bdbbfdd745450fc90e55f2a00ead34d3857ef348a08287d538a3bca659b4ebcedf61516d2764c74ef377cc0eae32f5d43737f15ad601d13ab60ebaaed081b5bd41a992956b5f8381ca1cd696ebc9b33e97c814072a7238bb5493236e6246b64a1c926f2b4d8e2a53234f9193176355e0a0ab525f9b6fb6f14d6b2285ca1b543a97afa9bbad69e52854dca050e79eced63b699552a1d206ebc654cafd6b6ce1514ea8b001d13152fd087fa9ff5a03a23eba563adbe4bc06044da8a881b3f1655c0b53b6a2d3020a9534e86a52213bccb5b475336454d080fe50c3280fd79e939a2f2a67506991a1c54de5dfacd545c50cab0c292623f7fd3228427786fe7a733d072a64d0f7c69531ae3306ed73dcd4173627edab1894aedd563ff7bf68245309c351845bb0ebfac993e76c69050cabc9bf26295d5f9e2733188c072a5f4056299be6af15defd7b51f1025a76d0d1e633a9d5d62e6483708b0e54b8f0491dfb425bf58e74bfa86c4104152de8e3f936fc8e0bd155b2d0a44e84bd504207db9da4828573479dbec6b410f9b2ca1596715275471badb55055acd02867cfb449932e3d55a352054ea8f9aa395cf26980f145850aac5c8fe9d2fc5ebd1c83ca14d642f92b172327959a7854a4a032ad836a9bb394d4b61205650d6e2255a55aa13714ee3913ae3cd7e02e7a02737f930ca521272846ca1bfe3b6aa1576f02e2751ad596b84bf53126a83ef8cafcba86b20f0695257ce2c4de88868d6b2b21330f331d2147ebd9d7a82401a5f7baf5cb9a83f9695490f04b79c3491bb5d88a780495a8d352bb7fab573347c508cd7a3faaf2f5a5cdaf223c626b5af12c3bcbbe4450d6a45b2a6f1d3d8d5a43685e85cbd4e28436110ae13cb5193ac8a7bd7f2b4148d597cd97dfbacd62201cfec2a396ae35e69826a8fc0029377fefb9492f17557c80cb9b2cb969d4edb0a0d283d5a42ee242b548d7fd4d461883b161c3646487c9102a3c58538d7793ea20373f4d0683d151d9811fb3e3fb78aa7dfb20a1a28343a87ebc1026f545afe4207997365b3ab79ba78b50c1413628b9d5b1f5a0e59bb9815b42859a4c55abc973151bac4c0813b7fd325609556a90a73c3fd94f1ec2e5105468b00a130fa546bde93f3f409945264328153afb9f9f9785f3324cdd648a4ef34d0683b101251686fe60935a29448fee7c4181c5391e4bbdd9270cca2b4e2b5c53afec7f52ab4c0f8a2bd029a4d8f72054c7cd5bf1ea605eda273d4b45ac50c3d5979035caddf8c934cdadf119083927505691164ac97551e23142c84bde0483b1514251c52afc7665b578f3f6a4425be16956ded27395142ace3f9dc4c4c5a758ad76d51ac7d3f73745a3a9ded65adebe9d578a26adb1ede3358dca47051452a0cd4e76ee5d6ca7e9006514a89ab58fe96baf114d0c8a2852b1378667d9df157f287497e542d9344ae9de4091e7cc5df39c5d8b11663018ca27d2331f45aed79ef8e57d45c496faeba84e2837e70fffb7cf425f1f38611c616030257f72c238160f0a27d67cd7c265cdaecae59bd866afc1c68e35b9904a4d349ad691d53bbae1192513a98d6fa1a74645762c0c0a26f2f113729408bd4ad89748879b57d3d6cfe3782c61dc27f5f27154db46955885d0a367b41cf1aa5322d3f157a789879a267d126a53ba255fe3864420e2054512d874b3a9396cf5b79a8e0432d36efe3fd5a754ce040a247059c3f8280d15a2770b501e81a8affac758f16a1a694071c4e9414a23548349a9b4eb1b3fe87c860c0a234c0f2e42ed104511d6dc796a468e7936d365404984a1cb2ddaf414cfff9e1b1b3d0105118e4bf9ae518f4e7b049443e06afb6407b9d9b3233a56c918272f068684628895dfaaab767b25afcc60805208649b1bbad6214787ce41e6e24206bc675f47ad7556366a057c7281cb180e7a930d62733acda38b18f2ec6a907ba56c3c1bce60c0b88421975163aa9b6544c230f993e7d1253abc301903831931f9225cc0e07e92f7bf5d63d61ccf60302325dc7ab87c61213c5e6ceee8fba7e2b1c30b972e11e2a3c67db83e83c1f0d091e9924b176c9bb30ee9596ebb180c082e5c488796d634d77135cdca9481c14ce1b205ee3d750d1e7be3e42883c1d8c8a183471835b868e1dcd661fc94a8714f4d161acb953ccf2af33ae8828536656d2a336f5973f430513d4c46d0283961130cc6448ccb15105fd39c5666e9cc5066424e787ca64f988c10112e46f870b1c2a5e98d4b15164d2f543895ee9f93df498ba8190ce68bcb1496be69d2b5340d13a1fe346c5ca460d81c9ba9c4db4f341e9728f42d3bbd9fd83d53af0b14cebda51d4cf8be6da92e4f48daf7ab9a576871bba9c0c509c7fdb3d16155db77cd603036c0083943042f4d68521b1d76361e26b30c06c31726e03a6e1a8f5eda3b1e3e72598267b38cabbe9bb3473b48d418b928e12042df0b213aba87d325092a7159a2e55b6b1bd9050979084fbd1f4d7d9add1e9723f4f137ebe7a821f6b211f8577350a25b8da5c6cc6030279722ac9db59c79ba21e34284d3e88ecd295a4bdb7f64088a397b13fb782e0b2e42604b85f293f1d8b5a220205d8b0f2b4c6a886ddf0408efcb783199ba6bd534190ce6f283d5fcb51df5afaf8dfd37e328b9f8609dfbaa3e74e7c46d195c7ae09ccee2848bc76c1d850307c90a78a0f457dd3a4fb8037dfd959a3e0951e22b1d2075a71b13fb799e66e5b8e460d54fa754aed9a4661d312e3868905d367f7ba3d2b8a4878e1be0d1b747ea59dd398725171ba4a6797b7e47ce934ec90a2e35c86dfe6dd96af6ae71bdd0e0347ae63d99bbeeff4c482cb3e03cdfb7da2a4d64d16cc90dd2a3089d4f262438fe8424a3c6c8c9a3118b557eccd25ad6a3ceb7051629a1ead92143af50e91b65cbf9a0af7306028b2b50a7b2cf95b0793dfeadd83e4b995a55ce6acfb362a19e069d97ff2c360a0dcb2a1e55fb747f2e273df6c2a28a77b5d29fe3a615a594d0b0a4a2b3697acfca7757492d2adc9bcd6dfc1c26ef770189c9c8d2a18387e514678d37694dd3ec3a08f188c5146cab93adb5fad4bc7305ff26372ca5e857ecc896914a862833188c1a5f82c190e217ab4d691b47aa773e0a74cbeea053647d4315c5bbabe7353bafca792ca1703575d0d7d2426b665eb08042e9a24e778d7e7d7605cb273eb1a7d49cd4f03a9a3063f1c4d245ac5ad1d5d6abd5c0d2894b7345eb24646df65106164eb84ac859d52d062c9bc04e669ad233b635da9861d1c452ffdc20643f969e2893095d9ef4f85c37ca19df82094baf9297358a5df9759894e8f0620dcb25d6713df709193a765a23362c9658d60695423bdbcae96430180d889cf420e349789c7186a512978f8f7798cf7ab550e2912adb639f28a1e14ec28fba4b99583588db854512eed8767d9c3c13893f4da65dc8a91672be0c460c0b243a79c3bd08cf5adb25189647e4394d741ae4890b8b234ee66e918ccf2157fb99bc9bce603036b41083a51166e911664a95d6f65a190c0683b1c1089410a25d7bc9537ad5190b5816818e6a7819a2277395168645114af535bdf2d84f26ce4420b673ca869bdb6141c4ad958e27548abcb3796781e5100b13afafd5d8315acd1ae224f42b6df27b5d4be8c5181949c3528844b65065836717a5e6d8b010a2d569c4be4c75aa64b50c0259979e5477dc8f6e5b04b1cbd3ed6bf3b945db40e069142eaea7a4e8d602a2f95e95aeff3d3755f307e499385363fafccef48399a6a50f29655af8b0292d7b40cd416b7bcf563ed7190c060c8b1e54526b1aad19425f6e3218cc09633015b0e4a141b4f4468c5afff0caacc1e3c4e4bb840b111e3f86122c78d8bbb4c5c9557bb6e368f7a4e50e8e68c716233cba1e75068359cfa38b102e9a1958ec901c7de3fcdb8a1bfdb5d401f9369ad0d86c191fa5032ad7a57816724f8df23958420765aebf57dfb530b81039e941464918198b1c52a3fca649f7cc55cbe260777ca14deb20387452d520bba476a126b731468919188cc90a74e8c8c0c0f28646aaefc98749d37acc6030bd81ff30c2b0b8c16e11526977671ddc95794b1b743d3a0ba9e3636dceb2b061e5ba4dbe322937cbf186650dcd51c97159b3b77cd92616351cfa5f7d5cdf7ada3327246aa44199fdae1af679df81050d9eb495e2937d9e9ea6464a7490989894117243e4a405606030272d781858cea0d45927f922273f3a6c31c3eda7ef2a954939a11ce1a163440de63172f2685cc052065d2935b74da7e2cb530d88e4b09061912d714a29d7328653ea11e3e22a74a7318b181636ac67a937a9afdd58c2a0144a7a3457e30e0b1832779b5feec8f7349c4a2c5f48a59ac9d0d1c667beb778c1ad4109133a952ecd545bbad0f8980e1dd383ecf42c5c409d3a1deb6bfd4b98b6803255f2f4e6d0a285bf47c8a68d3fdef2cfc29b378e70579d6f18d18285d4ceb6a9e8f18e2bb65c01935ab8df24cfc44f9719398b158e6b67ff69f2d5d9421358aa70a85944ed8f90b1412a3362c2265c88c04205457c478ff1b4a7baaa80650a8d4ab6fe8f7ab5162920579aec12f9bd65a34c144c19f317fdae77d5e7010b149233e6a9be95190c26c77bc0f2044be4e50d2b5f9e163619216784849181901b221db038219f5f393df19b1db90396269c758e1135dcdc4a0f9a8185092b7d6a142155cd199625e0f71f742c792dd284389807182eb028019de4ea8ff29bd5ed3923e48648175ff837eff0c01a9f01332c49685389abb974ee738b190c26c4868dedb1c6672063c23742baf8828c8f1c5890d0203e08ed7a546b901d1b3744de7594216239829e5ba9869a56b2525f588c907cb93aeef157d5cd526f2902f25b29d9d2428d72d3190b110e9d6aecf05257439e3634c0856508499d5f6b3cb172b7771d25188c0d91b60841d99b6c8c17ae9f6d3083c1d8d0a1c619bf02c6d185c8490f32606009c22d6beeb351d72863a37ab0e0bff0c202843795ad16ad319487d50ff830f6e23d2e85dd34161fb42f1ffc837cd0791b272881a5072a11b03381b4095c630d0320503201db02738b7380458b35d40406008013931e1da868f168700f344a1847003e4c78bc003e00801d395a15276f928a4f43478e1c9f030404156bece81c9fe302728a33120010531c9213d791a31487e40447c68447460400428a4372c22363826364440020a33824276990788f9111018088c29753fa74faee244b97d9e67a6030399ec7481a243ee2ef02121c4c62524272c2e37190ecc8a1a33500128ae4adf90779bb99678701020a43dab8e7369b6cd3e327f4d27ad3348e58354d6a32253a4a464c3cd128a4d0f3d7a7b5a749904e24b5162fe959a5d6b7768070a2bb73e5417ad2d1edf531ba00d984eab4a77aad9037aa134413d6b49f84f65162e57d99408d9ece55a63da81222010826b0cd9337ecfb9c5411c825b649b98daf34b5a5508258c238313a4dd4f859472de3f802a412947800c824464876300044120a0089c402402061b2c667a001208f30a301208e688409231800b28804802822110500410402400e610010430c00a41007002104c820da1aa49be89a6d5fe40c06d30292b520825869dc0bf5f175fce58160e54bed2dcb66e406847acca6cd99fd3c338f7c09098e1212903f1cca44763f49376da71922207e68967b27b5a77ff824cc98f00d04d20745b4fc5f35abcfa75c190c66874909c90818207c68ec9ab33e746855623018903d24fbec942e79a1af7340f480969b8763b97868946ad0a6a31242778a41eee0fe0d6abc0fed6dad40878eccc8e370121f80d8e17e539da756bc3217ca60303700a983abc34dab3fa7baceab8c163800a1035a2faa5b8df61df99a436ab3efc48c6ea1262d39a8d53c7a23dc7556db8a039bb3a2662d1eba7387c3cad4d8f14287a859a7dfe06b7da77dd16a5483ca0d6b4fd3aa496a2147eb541b3eada6f15545b44cce6c4044c77694799fa7780dc797af336d6535acaa4dd8a75176234f69689adf941a5f0ae9b2253428cf84385def60faef1996697fe2a97564a99019745d993a27e939ca58cba0c7f56837f2b54749c9806f0a3335e89aaa8e8e415da9ade3a3523ae9530ceb2846c8d5f330766618d47879938fdaaca6100c6bba08a973f8cd32c62f743acdea51e93468bb412facb6d745e8fe24e26fbaf09fb20f5a8b9c2ea1860be7ec1a6e94a5a5e6d96c4171a5d31c4d765a407aa76b257be5d97c161ab4f3d81cd4ff3cc702a74d7778b5f326ab2be4af6a6ef87135079b1880586135fae85542b8d63821f1024815fea8bfb3105b35bffa1d840a8ed6b5598d1db4963f7b81c198886c00640a7a4771bf71458dbd7a10293442fa0b35e8290aeb13e15eeae5d9e082427e2aa46bc60daf6f12e4090713ab932ef5af941acb98e14588090e1c5c847c202424c403229f06490d409c902ca12d3e7c00d204cde57b09bd42466d9ac16056f0230061427312cf26cff7e60eea331c00b2045c6f3c5b9cb88fd20551c262a40aad6df3638e2e039284cfe4a5ea1b74dc6cc3374090e0f629b55a468beb8ac2003982db9e4d468d52cdb11f1023fca6193b5f52271deb1d801461b15167fd895a21cabd010811f0f3b939da4b06204348b7d816de5ac97baf85b02e5d75aaeb130390209c3d470929da774d6f618000a1cf1ebbfb843435ab0fc80f505f3db6a335ddb5f502c407af4993a9eae3bd30990b901e6883786008156a53e7adcff9ede00c35cde93dceccb7564819223c40748052d1162000c9413608079a8a406eb04e8314f6599d54d5901a20365887686b7be85cf37e6e80d4a059dd57dc98e1490f3210080ddc1cb1e9a746591ebe1c2419932dd278c10b66b1d73c6ea3763383c1a4719185774aff47fd9e738e52c6860d77661e67a4e2128be5e7b41fcc3b9a899901c105166c093119b32ea64b99c160367079c539fc7f9a267735ad0a656e5c5c81741d6dadff66d116675a81d65a53b8e6a9bb7d6558a1fd8798116d42473b99555c3efa7b3ff7b5bf542603175520ec4d4b35c8e676ed9954f4adfc6f1acc655329331ab8a0e27efd9e4a7650369a9b09c1e5146a69ba4ffb87eea89d0c191753182a2e47e8a0ba85b632635c4a712addda9dc50d5abfcb9ce0428af30665aa5e8c47eda2cc88c9c84807307019c5a6648a6a6c4ad75067b4a8c1451408ade656a4e797f8d12514cdc9c58d1f85968d52e9028a267b93f26ff26da5d47ce275cf659310a1655ef4044ab4528376d721e63e332e9db83d6e562767e6ff3227f2d05dad25afa49ae4974d30fa06113eaf4be9b02f9a50be9c470f5a076dcf3318cc8d4b269cf551e3690f35f6a7b410c305134a3ba1bf57560831232a5c2e816e7e79ee8a5ea1fbc512dd74b66bb7297ac577a9846adce4bf3ea1e697e20d5c28b12e53d358a34eaa5aa42e93c0b54db4f6e8dcf65e246127d773539396cee512e11289ff3b2865934ea2a6a520c1ad3417520aa5cb2334256f52fac3fba9943ae230ed59f509ed1b5ceb2f8d4076fc0d22758edfae43630917462c748d4d839a33c5b320b82c42d5523e7ff0fdd866fb9ff0d061038d8b2254da657bb64defed9b4b22926f8314f57c3f4aa910f1ad32253c996e9ded3a04af3ef5c9dafb24c33384325e3bc95cb9af5da9e35208a47856a77a4588ad8b104be15ba3ee349c2ef92078131e6cd21bc488e882784474b2398756e2260702172dd4272d572bb52140f0f3a346a173d24e42fd032b36fba52a3757473fe8b2528588de164a7a2e7d70c7d5e7299d97ab451975e103012e7b38b3dc5cdafc350d2f66768c5cf4807f3cdd7962bff2e6ece092873f6778f6901a1e94070f66d778baa246b569fa1ee3728774da51bedadd333bcd70e06207be7e5d8cfe8d232336e35207363e5536cd3e9c7a2e7458e6566c9abb758ddeddd0e2099739e8e2576b95984df3a90c066383041739a4e33d67a1ecbe5bab6bf0384997381ca4ee8bd9581eabd70c060307e5c4bfcdc7bdef372f6f6854cf1b6fb52937ffe2063e5f764e26bfe61cdb105cdaf089934a2bf1961b35f45d62860a2e6c50bcd4ae9faafb436ebeb8ac8151d77e2ef71d1e770683f1e2a2865e08f5c9cf86192984994b1afa9b5b88991e311d946830d4450d2764dc8ccd5dcee066b8d7cbc8aefcdc828b190e9321c683a753e3a74b19545f890ba80432c368340e86028130180c008081cbfc76141311083040541e8d4664a2d990dd760114000147483466442a281c22140d0482a1501c0a8842817020140603c2289682380c846aa8c5039e212fb1e482ea35a4cfac044700745aac7916a4fcd3b519eeaa5690c10ef2f20339b2c10a0fb0779cfdcbd51166a330c364834c0e81e2654997b9ebb53732c4e47ccab39633cf1779352ea3bfd54559465dbf6fa56b44831682d02ae5b981bdae0676f0cfb043d87756a5cec61c65418871c4b96fc6745f62c9f6551128c6889b291c8412da9efca83a5b50cb947e4667eb551c7d80bbd01ad3f6e46c87bdd7e372461a70fe6138336ea7156ce5b291cbc0da9efcb9fadbbb587dafedc927666f1fe4f388eabf9963a8ad798221bbb5835fbec8c0910f7fe1d993d38d4d040e778cc4e1432226fcd1dd84ebabc07368a3a1719cacf4267bf377fae845b83db9a91787f921a24923596745e89d0b6701c2053be1cdbadeaabeaaba5057e83ed29021f86f54c5f96e11360b29faec5e3014d1035dc061d07659dab550dead3a5180ecf443cdc68e8d62f6e47e5e386b6cdf72d241f327b74971be06849a74d024c4275d3e0e88c52ba83813cb96fdc283c6b2db45c3c6de407a5c6f76f1322b9619aaccb8cbec2733da33fbc98cf6b00164bf6504b4c98453269f32a193c9af4c6864f239131a997cce8446269f33a191c9e74c6864f23993346003ba5af2153460c5b9565f5ad1a50df071a16cde4d3ba1926232b421aa425b2199b22402d8cf01336d446cef7601a2be2d5d632a484c2a263078e94e1acc7fb71e29f4c2bf55efed9437f74fa32b7b18250d3f832f67a100320de758cfd88b2e5041031d5591c81eed6c9a5402fe0282f0c6e4654ffda802e7aec4bc410dd7c2f9b74e6a0ec039072d6ea55c5f3a2430d15922a23a481e4935472a8017fc529039d9204018bd2892ad17c734625a50c28065825e95aff93ec7e9487721a3e09604498d0363d653dfb621be6ff27e69ad2bc859c3cfd69d24f04e84d75875ee1d7d5a03472bd94c469947df242c89039ed3d23dd96065aa190ba3ee28093bc54446ce5f6ba0e58373a885870c37293afb0e94305dd11806e75a5c7fcd1818087b32a5cec563cb6332779fa9284d5ee6bf522e466404f8fb4708531fbcda68ecf922024716a9f5e94fc812debe18fdde038e8f66e5c727117635aa45ab60a514a4233c1148c4f5a667287433ce887cc1ad8c1c769b4db3f8f7e556b360d489e99b3c48908a25404418d6a116a384d801e73d33691281483c9d2bc303a88c9402b675160482212440a2ea14c717342c945207cb5d0a27949de81b6e8cd86d5dcc8c48a69940b9b1a9fd861688c8a07fd51d22bc1d982f39845e88ccc94ec308443258305f508ca3a15a66fcf3b3486e5bb7da8df24a840332e9699da353d3f3865d1c2946f32b151e4a85e2bcb12663c93ca926f368e9f6ef61bc2221b8d0f0b23b4009c89ce329b980efa3e347da9875afdf2dd918494181045f004307c906e008884d20701342866c67c6f024d05c61f61e00daee1a8d83428f386a1924bd7c7b0419144a1200ccf070a311eab0fd2b844b64111fd096d1e5d9198e42abd2f07209136a3538db04e31a30cb0f06732dc807a27615a5c73855fef019887b58c1203e1ab503f3aaaccd0217fdbd40ba0140ab7c499c96f028b6c5a654dd8ba91df5f1415796aa56c894b217fb26ec9833a260532a1a23472075abf7462f212f8fcc3be6a47e32b90e0f2792b679092f173b7dd83eb4d7ba181d1eb5f0f9f7426b768ea07634ca73a17a90dc9520015408337a49097d43f7f1f36097c495f5022ffc6cd2e70e9c13af91f5090bfac0ced6b8a4fdb461d7844152a126010164357d4126d561563337619f68561efeb161660d4078ee4540c0e50cda1fb9f6d430fe0727822824840892ca9f688b70730f3d34b5c66d21d61aaf85586bbc1662a9356652eea181101f855aa9212e072485119db34631834271016d72a3f78b017662ad34898fbcd2797e5760e770702bbaf8b2c9b5c2904954a16ad4b15a87a3a644f2efbfe26887cbaa89de5c9156c1ada8d8e0080588010ed3eb2681d3a378a4bb0b4bdffd47ae00a61c3c5efb3921c36f0f5f44ff7a2f2a6cc4694cd20f600bb3c5873572fe68c0c10616ebe36c9ae4dc8fa9f374d768c399d3a54eabf5209ee8a7f9b8a5758f13047134778604e61291bf82569e59a9a19f751a357a9b6dd3e48ff7a8543ead0ad98638e844d9487a4e9a3ee77b6403c452dd9f47d44085931839a3082dd5a996261875be77e98549dbc6653a337ac146d756cca52c843253e16489529046983597e1a82b9e8354629996464d9a7d06f6539a1a9763a43c58d853c7c47bdd5a1e2b46624a04a3ea2cb9b85933cebad67c861ae4124707cc0002d005bea4d6ed9c492903042da515fcad3bd13cf4df9722082c3d4da14733de876b527c1deaa160c61fa907f8c04ca04d04fe96f55138735068a0cdf4fa05a3952b0194e01cc16d1a10628074d62f0a74773826342013c5029b306ca19b66505b6afa276f2b512138465ec49870664418ff6720f061a1b2d9ca53b6ad8564eb067699b0a945e83c27b09e1b656f0f0ce07d2b2e5661aeb70e7d90070bb544784652014f456ab11b27aa3052fbdddc20d1213ffaaaa97abd7021641bf1561d21f2b43af5021559175d0543451a7039dc59de0b7ad21e70130048a1e903f61a2bccd72c133074e107d75184010e22dd866e8cc67823eb0bb77a4d29db9213e905be7b9c5e70a44ed6733e8dd71fcb2f30ed6dbaefb53ef640bcf7ac6febe8d24a1f8bd72571b6300340c4e895aa3af6eaa9c49e897c3de58f404ac7794eb873e7edde0d0377bbf555ff4eb75eb569e469e35a8c35829cf1b286ee0c12284c5c5d0dafa2247d14bdab98f91491f52db794a8c991bb1080325b6f6f9116cd17d313e21011d491166f6e5f5370475e90ec80398b339d4ddeb4e625a5b432bbfed64ec646d1faf3b126ce3e96b1007bc723c34bad2766f695788ee2a402048330376ec7fd8596bb0ec4c5daf640b0a1fcd894bdebb1d5f6197a372a778402e793dbd4397784050e70d693eedb390b21ed44a5ea386d004dd64716c6b7ca209c95b1b70f353d46370db34614850cda6fb54efbbb7182f775e47a933659fbb9535855f1f53a12227fb50d8036a4d91a6161737a3676df0a66fff5dae818720b363010067bc1730e377c438d685167fe92035075047bcda6e1b52042b8b197cf968a607650ba6169092b0aa5b5c40c945323d5135a2e047a26670a4ccb3b1cf74d3a0baf18024e44ac7a6a50656d651a84a19d69845ec0dfe5d27e1465730818083628eff5487b7ea99e23bc701a00425b11bfa5801d4e3081f28954ab6ab014c975725d1e4295be932f362e8fec0a963236b7fd5697ffff2da6a018e3e638e9980fa8129e53016f155716470731598927bf9e1358b7af6e60734395d6e7b327a6a87c0c60aa59983f30426712ce2a3c47ab751499eeab0604b1c5391d2f27c56e35fb7cf9a5341e75760f0d7078beda2b73713d57df198ea592fa1e70fd45a1d71420e4b1224c06a6e793d5bc0b4245aca42563f4b6bdb8904da077f6c24c9027c80da46b9aeaa98435481c3243ef3822f2d9b44c7b674dde6cae6afe2723d1d15e713fed9ed72a03b46b1400575338842d03eec788c7aeba628df45c7e736f579b468d6d869e9b32170e9fc597c129fb3a7bedf145da1e9c9cda695dd927f076f5540b5a9c035a0ffbdbba5aa8ba22d0dc082adcc757fb47fe07d45b4d286f88f62f48ed069b0c02e3d43d344436428731ce82b4c0c3cccb420dbab11780c1f9f4b27c6b9ac8bea146b906e4d211e5335e1f77d55ad611ae3e66d6ce48af62c7f5a4ababb9d327d2d276feb8357519a979341d1c21cbfddef6ac078a4539c73151961df31039c753a95fcc5c5b102d2dabacb4030a30af1c66629bed109bb03e639b841066f3a6d807a327ef9dcd64285d66436583a3892ae66d58c59da0e8efd23902c99753c9cd7517184d1b8d6422291407476d343b9a785920129e5ffc147e241543638bd5c08cfabd0726cb9e8d265c8745ae4706011942b697e39ce54dab8e09ae66f2f8c1738fb1962f026b2a2f8159b99ac8cb87f0bd0acd93fee606323c6a9e1b41a681682894276188ae2e032629e0680ab41c219d20c07235b681307b64b460f1cadfd2d766b4efc13a65c5be15038ffbc4b03bb57eb79bd2a28bead4622d1f1dd47badf5d00dd44ca9e9f7a9183f62c94a77bab0a205a411d5b70323354a6b22fdfd4fc6d30c5b8af5a12493d64399adbf78258ee7e8302d21fc73014ef74f99132f8610d3f9cb03b2eefcb017e20b978bc9ef499ece48c99e7f629afa33c03319e0275a11f607b7ae30ad023d13e5ad4e1f35bc228b53b664b48b4e5f7d408e0b2bbd6d981bcbfb0b806ab5bc228198d07bbcb35a2969b9e71d16c02de16a2e6e40519d9842d6d2000d9108f897fba4ffa50a97a7725cf42c063c446667589aa25c0233c2f56de8eb3e44b848c3cab4f3bbd3cff3e85ab1fde60d7a8a0ce407f7e40ab8b894c258991468e90938c73c14434c1f997d272dfbb6086371b9aecf6b78daa68f43a8b055c27af2a2daff921b2ebba60abf4a2d7868621d9032f43cb7911cce72085f3b4e113ea74123518f715724815b79341032289d2a8d50cd10bbb417c2a2f71a52c870efeabf26d1f1e80e80b08636a0cff2a91e4567603837c455c29bf24bfdb3c08ae81f8ac90b0e7364b81da4b609de94002f843ce417651a653c6377f779f27e8887f109fb7227d388701b41b4e799ad8858e6447c1260e1efc0b0782ab8bf66b532c4b232bcc80235ac0a5a4b1a6c01c0d9fa93b6795c0de7bcc9747ee1b9d7c78720a31bd2104b0eb82cad9a2ec77f41b3d548efb8f73195b2b9ee8b2ed281059f2e858b5ad7c15c0f5748458800f6c6b33310ae2c86edbd85e94ef882bacbba937b42ff18e700ee890bcd7361a08ea145f2b93d0be1150b7be4fdd5c88ae4c3908b0933d15cb54fe4479be8245f8c8965b8c3db4801ac2f225a4ff50532482ad8d46b7ef767ccd034c5a8486f3795588da47d551fe56d8f7f37d302f2a86dbab53910d683c94b0cf4579d11840ab9ca6d448f75a5924fa00634a4f0038bff4b5a7a0f4dbd1901d0a7dc4d51dd3ef5df6d9cccc029d7c007137cefa24fdeae9916534e509d9fb07be1a677f5042bf9d41b5058704aa2f60bb338339ae862ffdf3fa8ca046a05acffd812fa3cc32d8933884d5c87776249ea2cccc9e3533ca502c32a0a46cca469cd1df650a12b154edc3f2d821e0ae59061022adae6b178a282c4028068d7d931d33d27fd790a95cf26682185e6b128a00d389c4e0c383903b1ecb2f6cd1d40baa909412ab9909ab9e86a3bd0f56b4b60d481722bbe013aa2ac93684252fdaefe9c75e5917768a5559c5cd39fa45a197645e2f2ada3e6744797ea5e619656b778b671ed8012b7c3e526182367a4afe4427ee09c7dfbb757a0aa3ae23cce95214780589f2fd9d572c9016a268b717ff2f358de576dbf37e6d0a4d51c1f9e26f2e8930449d1a2809f8e587d1f68217d195f9788bf350406f9a3fcfd1c3c04a63ba3d410a62da0376af2070998335ea8c47dc4319739ac4d85255dc95603e3a622d93163eeda2d0d1df15d65b40c79d0dd2351a18fc9533585dcf26375a059a0b512b88c508cdaccaff51d2ebf1d29554d9f6570242490fa8a1511acc9295f318a0ee6424b883acd95e8dd97de734bb0a307a58e4fc9ce367b378a1aae276fe9143372e78745ae4b42ea92151eb2a622b7f0a4dc632ca074a115d8dc35a4a28584e7d7eba4874327458729b8c5176b5a09c0522ed2c310ce2347dca9d7f07ca9d98b46673b69297959e5ad0b44dcd4325ebd1d87c60c93c850ba0a5e3fa752aa5a6114ae0975a8b9c9bc51dd8b9400099a551dbc40b4d681f01008126ab34c4f24f6628333c66259f933be793c447d6d13f5930782c3d2c0c5f86c45804444fa2e1bc0342f2f17e5f4aae6b0e6b80d1fc8c2138b3d6ec25f4ea993941c03baca536ef1b89ce99a785f719ae0731a0fa259f635e99dbef60fe7b27f015d78b80599e7e048dc5f177fe17f454fba3dc910ef785ef65f39c1dd9b7e887feb7da88c5d504bbbc84b4b21374e53d0f7624dfbe3465a1a489fb5a865f7e570708e8f91cdd4eec079348339d19e8616a82ed24d0fe4771ae5e5159efd60685f8d76b9f189c623db7c0ce9f1cb85479cd70af695f68267a99c7ab9d3cb5af80dc9cbaa7a3cd7810f98c14e9d1a7a9e9e981334cbe0b3f0a388392963ed4f7c572656809d4f8fb11ef0faf4ffc5eae71c518368b8c6be9c849f2db6109efa09aedf46ea2135d72eb7606bb7b42fb00472017f5cdc2a8a29775cb899d98cee59f5596ffe276ff8201372482060c04aaca87611ece55cfea3ae7078d601dd1eea951d4409e77e87e575d0aa619525737c19a46abfaf18346f3bc61404f5ec4c71e4c6260a38218119669cc44a051417cd334199cf971f8a80ee4d36dc25feeb83cdd7759312552e89d45452b365d9a3eb07f52944feb1c2a39b547846bf2b7daaed60b0ca84af638551ca8dd501efead6dde88a2682d97fdafcc7da90178505772f33e0da6385730ba38388aa19d8402d6bd545eae7249a2bc0e28d32dd0a0c8cc4e641bad61f26838a2909cae4e7270b6acf111acff5b9b62c24f37ee6c881fdf6f3efa95b5a88f1f6fe77516c8a08feed7cd3240c8d77d79bf2b7c8cfdd10d35d4c32389780b29ad47e4116e7be09a7008b94ab97c1f716a8cd85c1b9b0454e707de9251764c5727e6997b6b3b0703dd5ac94aa7929fee0e8d1f8e32c1b01872e09235ad44908a3aaa9aee067dd4ca8c2a429eed56d711cd22808970ca647077cb7f0153ab390ce50031285536053c6a19e9814d186e8a4d800eaa60144831538d6a250eaad21b48ad775be3e9b97b7d17b9da464c438328ce3865ef3c3e6347b838703a44fa70ad57b52ccdc57b064ad83b721085dfd05181ace7cc5a2e0da1856eebbd954e1de6c8b2cafc9d4c9aa2789b56ae25992724cccf39eea8e9314ceed24b8d5e0f1ff665d6680c47fcfbdb0e58170d61fae44338aeb6037804cb4f70b98409feef8737f8c640b896828bb1c741db202a9477908a00a678f91ce5576672e0df3c5948226e812a6a0cbe60208fc6596abd0c972bf6354480e4923155859bed9ee38cbbdf75fa7f4bc658282f0fc18c172094f070e567e43f4a7c1c3fb8257b9f0b5dadb043fc9f2ada26593507e00eb2e19e57d3a7348bb976f570c9bcfe946e0382cb35e1a718ddeb07dac906691ffa1621ad5e80be61468b4090a2a63850b2ead4593677560f34f133c8a2416528f4aabe7c03e569490cee55223c7b1ab4596d91467633327e45cf0ec3168bac30ef77b247a53c53ef92494f1ef7c08ff4a422e78a39a2dc3081963b3c924d53f9d235a200f93dfbbe1686bc40a5bec8302423c345803426b54959d741e7d0e3b64873183b6528758b4360dc57e99a20ee33ede950ec0bacabddbedc82f895f39f395bb78344abb1ccb881e3f1725805417714a1a10bcb3aec95c4221f5e12177a86600e536fd94b33acb3c98ef10de9963129394fb76b267f8598a02d1a9d9ddb5a78d1a400fefe5206696536c157cd0da152521b7ea50dc0044dc82f476b21191fda32473fcea49bcabe2a11d3c10c5a67daa532809b1ca6d585995cbf517ee4dd8f873d39f8ce2c54797a1fca06698a1e89e3517391d6103bbcced71842419462cbe7bbe9a75fd15364c82760c33c6a2e0d1f0474426a1e6041b03ae80189001902320ac885eaf23383a36461c7d6944b7e62c50e6b6dc521e251bb1a4c3832281e945040be6863d4745f4fae03f1cb946805726dae23676be94a7ba78a1586ccfe1849f566c6ff7ee29b184638343971f93dd1210f626874cfe6b6af9301da8d7570c77b110da1cbded23d7c5fd862b6967f87ba546e350c2b84d19c1f7e45e553b77399fbe035dd1880e3ee0b1f3da62db38f104ed439f401aeccc53e32a6e2c5eb2f74876cb9652c53b736fad0f00d7adde203229f424c1f98fef541892503a298fd2111c36b0b3b4938dc8908e7981e6276400452c4f9eee0a5ad0f743fe8d4c9301d314cee82b146486ad0cde3c85e8009313dff864fa2ff2a18a953555f182c49b978cb41f420a3432c346c8c1e644e6b40acabc640a433470c370069fb2be1e0723c90de6ff4e301aa18a81c4fd87e43ea302bee92c8290d6dde380ea04607489afcff78d1f880e59ef12c2ff2ce1d645cdb0615323d5a24874a8a3cfb20f7a067fedbaf860f23b54556708eeeaa3a4aaa75cc20daba6177b9e2dd932cc1d6f83508e339473b2e1200b36e0bced045086c2830a1e715e53088d876ef0c709c6cd2d929876095150f5e6c5e73f1fdc7881eb14873d08c0a5587663d78e383d4aad2721bf09d5c2c551be002b23c1ee493b149f947d9c4d018b1e07275d7ab4927a0185fd8098b1404ed51cc2fd4144c6d640b65b0c85c04537ae163dca74c3f73b90926111942216742972a115a512845b5950e4109544b8680b5ae5f5e9c2f84bdacb3120aa39c71398621f1180828f15a889e4e91e604ae56c681f56ad76f03abdf579cc0c36a70a2287a5b4b1360c46f33d7d988d50c645853684a93a90cde574df857e30aefd3fd5e16fea44f56fb7cfb8a56bb78c7ccd42ff420d09d66d60374ee6332dba4759ee05924fb4a433308aad868745957f4b7844ffd0fbc07f947de758fde0fb2992a5e3eaa2d1d1dd9ebee60dd301fc390e3a00c4f7284e428642e8428cc7a589da0759c592e3cd6ed1f0058c6c08173e5920c66ba076d19a24059ba0e7e51a48bc279c6f1ede48cda17218c31ae7aef52c5158c9179d785df23832eed9c9849d2f5b0b8ce3711a1989d922a4f2413a4f7b70660f2bdbd71ceb7a5949b98cf68a18080e0d5fe0173cd32546e69348af9cf77b0a16d6541bcae9cc63216a11229170bcfad391abc6896386c7cc6891a4d8088fc91d3f5d5abafc5c4a2a7e01a90a3988686fc25169169b32bfe21075706061f063bf7f93767e41b3097561925ccda98455bc25be6c857b615b692756f9f4cf426097d8c584c5d7608d57a59bb07cdac5435624ae00cffd937cb0172dd43b6cd9385bd908446eafffec6260918c65d3dbd57cbdeb4d24c398ee0d3b8dbe84371411a2d0e2cdf844c996724b473a9e528921b4618f8d8b63d6411e707683acf3e5a699172a45c2fb81ffe5c106a19040a80461f702c80b", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x6648d7f3382690650c681aba1b993cd11e54deb4df21a3a18c3e2177de9f7342", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9464a35f1b088a6298155fe65b56924c412a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3f1467a096bcd71a5b6a0c8155e20810878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca7878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb38e68ce95d2dcc62d12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876": "0x12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c1006f4963f2df10617572618012a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876": "0x12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0xd5e1a2fa16732ce6906189438c0a82c6878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d47a76d19d0d197d3404adb78d6ee06b1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950acc29cb77138d7ef61757261809cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325": "0x9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325", - "0xcec5070d609dd3497f72bde07fc96ba0878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95c606ab40614cdf7fb3b15beda6d37cc9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x109cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de0432512a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c7838761256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322", - "0x45323df7cc47150b3930e2666b0aa313878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x15464cac3378d46f113cd5b7a4d71c84878d434d6125b40443fe11fd292d13a4": "0x03000000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/asset-hub-westend.json b/cumulus/parachains/chain-specs/asset-hub-westend.json deleted file mode 100644 index d168803e1c3f..000000000000 --- a/cumulus/parachains/chain-specs/asset-hub-westend.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "Westend Asset Hub", - "id": "asset-hub-westend", - "chainType": "Live", - "bootNodes": [ - "/dns/westend-asset-hub-bootnode-0.polkadot.io/tcp/30333/p2p/12D3KooWJaAfPyiye7ZQBuHengTJJoMrcaz7Jj1UzHiKdNxA1Nkd", - "/dns/westend-asset-hub-bootnode-1.polkadot.io/tcp/30333/p2p/12D3KooWGL3hpWycWyeqyL9gHNnmmsL474WkPZdqraBHu4L6fQrW", - "/dns/westend-asset-hub-bootnode-2.polkadot.io/tcp/30333/p2p/12D3KooWBkKDWhHzu6Hhe492adEpVV7wzuaWGxUfEnr6g5JCr7Gr", - "/dns/westend-asset-hub-bootnode-3.polkadot.io/tcp/30333/p2p/12D3KooWMGpzCmhD6np6eKqxL7AAunKn1dN86Dr7a9E2xgZ2rt6G", - "/dns/boot.stake.plus/tcp/33333/p2p/12D3KooWNiB27rpXX7EYongoWWUeRKzLQxWGms6MQU2B9LX7Ztzo", - "/dns/boot.stake.plus/tcp/33334/wss/p2p/12D3KooWNiB27rpXX7EYongoWWUeRKzLQxWGms6MQU2B9LX7Ztzo", - "/dns/boot.metaspan.io/tcp/36052/p2p/12D3KooWBCqfNb6Y39DXTr4UBWXyjuS3hcZM1qTbHhDXxF6HkAJJ", - "/dns/boot.metaspan.io/tcp/36056/wss/p2p/12D3KooWBCqfNb6Y39DXTr4UBWXyjuS3hcZM1qTbHhDXxF6HkAJJ", - "/dns/boot-cr.gatotech.network/tcp/33310/p2p/12D3KooWMSW6hr8KcNBhGFN1bg8kYC76o67PnuDEbxRhxacW6dui", - "/dns/boot-cr.gatotech.network/tcp/35310/wss/p2p/12D3KooWMSW6hr8KcNBhGFN1bg8kYC76o67PnuDEbxRhxacW6dui", - "/dns/westmint-bootnode.turboflakes.io/tcp/30325/p2p/12D3KooWHU4qqSyqKdbXdrCTMXUJxxueaZjqpqSaQqYiFPw6XqEx", - "/dns/westmint-bootnode.turboflakes.io/tcp/30425/wss/p2p/12D3KooWHU4qqSyqKdbXdrCTMXUJxxueaZjqpqSaQqYiFPw6XqEx", - "/dns/boot-node.helikon.io/tcp/10200/p2p/12D3KooWMRY8wb7rMT81LLuivvsy6ahUxKHQgYJw4zm1hC1uYLxb", - "/dns/boot-node.helikon.io/tcp/10202/wss/p2p/12D3KooWMRY8wb7rMT81LLuivvsy6ahUxKHQgYJw4zm1hC1uYLxb", - "/dns/westmint.bootnode.amforc.com/tcp/30339/p2p/12D3KooWNjKeaANaeZxBAPctmx8jugSYzuw4vnSCJmEDPB5mtRd6", - "/dns/westmint.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWNjKeaANaeZxBAPctmx8jugSYzuw4vnSCJmEDPB5mtRd6", - "/dns/westmint-boot-ng.dwellir.com/tcp/30345/p2p/12D3KooWFZ9xqApB1wnFYkbe1qJ5Jqwxe2f3i8W25F3tKNXy59ux", - "/dns/westmint-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWFZ9xqApB1wnFYkbe1qJ5Jqwxe2f3i8W25F3tKNXy59ux" - ], - "telemetryEndpoints": null, - "protocolId": null, - "relay_chain": "westend", - "properties": { - "tokenDecimals": 12, - "tokenSymbol": "WND" - }, - "para_id": 1000, - "consensusEngine": null, - "genesis": { - "raw": { - "top": { - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00580cbc04ced205a21152209ed9241d6d2ed4558ed732d902153b004c27c5eeefcf10b54cb6723c4e11d07eb8511e99ceb0c787ad4834f7cf246fd4a76908f117bb3635eb2058b619230b676c843e61ff9ffc4608698d10b2f7965206b311ce101f12670ddee2943bb80d2fedf1180d4cc80153c00bb25025360564bac3cb064c853a1eea4ec42a79fdfd86bbcbc6fa6b6e1b8b53211780998310eee2b955e805563a87bbf8d5fe5ac30841975e4d01d79fcee8f1ddd3c11e7f733d7e88ee5c71e4c6a6eb2379b1e9fac6a769e37a3a25365d8f2ff149f428f482a09e423ade86ee6c474c2495bbebac5d7fad422ea04397b8bb5e3dd9306da19ec01671cadd65c9a841c5d906e254e497032bcd77c1968e618e49f5ea44bcfa1e6eaf867af09816d954c80554baba366b064815a1557f2837ab22aa7375d51d7d3c5649beaa96a43adf924c2a35b2959cdbcacdea7a4cf455a97dc939ab8bbeb7241391a521b12e2a62741137af167db527524ce10015410d451f25d5fa645e600e7408d35174280b162068ec51528d7153f40b1349ed919c52346b4846dc94a2ad8b8e890e6d9058d7eb2d8ec9f52753f47c7d1d72a3fea5a1acab86c46a4bceeafb9ed7c3af5a855c4045c3ab8652c589515e29d1c23ad0c076e1ae3e31b7ee7ef009f6fba6b33e3dfafdca1e40fa01d62a94850dba7483a9ca55d56d02d395c9b8833527e38287af2ef8ae8e29cf163fe4da9ce05375227c825d3d891d747508b00ef4a91e97ae548cae867475d57ab8055abafa0d9fb8abaaaa9ef1a947c531d12f6c060f7c51223615f24097dea07ec762f4da636e907c3aef77953e1b13bdf6dc206e35421b729064a9e8c7cd0d6a3da6dae3a4c07e57d51d9b23a3869f6a85868792d3907b12d3ef53c3f4d4f393baf5e336c8072710021f8398508cae0c7c0ffd1e5fa652e9d09784d925a75411c5f52a62a64865979cb2a936f5364746addc939896f2e4a67fb897ebc20a9dd3589cc3ab4ca5baa12f3925a70a254810264c98303ed7b158e9f28b15e9c986e92ea8dce73a6b5c8624ebab52cb684bee7b1e86f1cad7d8de40045eba005a341f53036c2af481a0e6636186ded17c6c9445595d5a113eb2b0839e51aec0032443aa48434f0b94a0095c4f0be4408b22a32f2fe8271a264c1d483d7fbcb085120c7afe64814157bfb42398177afe84c00b1aeac96e63d80952b0d909524002368c408c981188d1d6332dc96a693e260230bd1a122b4c98ae8cec5546d9d6b3368436734cacf3b1957b4b4259c5d9ff5cfd44c3b4e823ad880a89400c1d2d50ea9f525bdcf6f64a150a410e9ae5130c53232a44254c640d89e87a0cdb32d58c3cd9305dddbacab92a670ab553853e50a5ad8fb424bc45f345da11cb88e8caa9e2e85c6e15476f3dcac9adef7952aeae54aa10952f5a3524421d71d0d659a0a577f41ec3b24b4ed1a12fa2582d859b025016f5647b8fad8cc75433b2dcdc5e247ce5a62ace54212ccee8bdfe3d95da51ce54eb2d698324e2a0f72c99c422737b392934ac47f944c38409c3875a921d9d522985461bdaba6a4574a88c38684bfeb08ede6318677a4b3259ebac15e1c7cf6d2b723f582b7753854ef0a57fb82d6eeea56c5b7f3bda923b7a7f30ad8896d1d5a3d4321a7b590f8dbd2c4a454363315b43638fa142b8d60ed2bc4057dc516a1b5ab98dbb1efa713dcc723bb5409baa9e16056c1b8b41b2bd430ff04b0ae5937bd5906c7b7d0f1f03186a83dc6d98e26cf03e5ac3e8420efd1e9d124e9821fa5895193afee0d3b42e7a7c279236476010ecb7715f17c9ed1e7cba382817ffa7ea3d765d59f3f7cb56fbb7a2eb25a1fc54cdafae5a92273bf82b2717117d6eb3889b590f3ec5ab36843237ad6b8b2cc95796841263401fc86674fc107c9a9d1149f069967af834750b117ce28ecfd941c70b619de7a36440ddd2353d73dac6fa3bc34c35d47596d62f59842f3ad48a6cf32d8941ed002c92737bcf5a913d9f3514ff18cbc745f0f7fbd5903c246b7148f6377cb21e8f5952bbc4a7f8ad2676894f2a64850df47a3c86896ec9eb2239ad57d62f3939bba475d58848154139a82bc964afadda11a6a2f7e213bf2fad3c5271af2dd891eaefd893d57ba556bcf5ebf1bd68bdaade65ddd2eee18b63723d62ab61d8cb92442e3ba69a65fdbd8b7fa18eadb479dfbfb3b479e75bc7561ba2a7557f4cebfbd592f0adbf227cebaaa1acc7eb3f95e8d866517428efd52ff9a5aa2eaa4432beaa9e6c98be8e3df953f57b2527c7bfb9fd2e4ef5c77b0fab5624fe55dc4c75754bce7726d7ad630f4a76283f556387f244bf0405f5cf4c8bfe93f5e858963dcbb2ec4b8b5471de3339b75f26e331d58e6c97161d1bc92742f42acef52727f7f5f89191f827924f364c8bae9a01522de2547fc8b97d9db522f117f7def3ac4a8fbdf3b7c8f63bdc467bb9e0fd75c00cf01894a5186dd558d395d9f6506e6b6a17096c742c2662d7eb25fa68248fc4733692f1aa1919fdf5f048641559d1af5bdf1eb6a0081b49d1a35429db73a56c8b8eb12e3fd293d736455e5fbfb8ed2845dc486a6331db986a285d998dbbeb392d3a6ba81137533d7acf13c9926462fd3a5f77b63179c5d1433ee540d4930b89f58bcb6294bb79d37ad8e957234075fda8c8f6c59d56d2a6ba8a1114d43e1ab3e4b47e1dc354137133d5a28fe4dc1efd92d3c806f593156a559cd1aff7bc91dc8b24bf87af6c9f404b4ef88a7bb21db994b5d00d98019080852aa8e0022d8620e4a319a65ce26ebf71b7ff619bdfacf73ba4f77b227c8abd3f9fd4087428a3f73d58677d56c8f7da6339262af4f84ffa6c4cde7be8d97b2c66aa3b33a763ca00a28e58849f8f9b40fd3e4544e8173a725dc05f257c940b0062052384f1d13f39a7e837ab374965d1d62750c7abf2a802992a34458bfed9b638276a463f7961c274c57531851e2885832f3e900b9a5374e4e6fb1435bfe73dd943639b41a957cd01fa842a3eda433fa04df16329609866a98743b52ab254514585d8f8ca875d9a7f659b106c00db5e59007ac530e5d954880366389ff8fc8e4fcccc01329a9f0f333314d87ee5b5073381696b8fb9351fdbbffdcc9ab1b767f256720bb5944ae34c75673fe7f603c0b6fdae57cdc8e32ed8da9796321383bd6ce56b4d4a95756929194977a06c503f11a2f77cd592c0a0d58e6c41bdcff8a4cd41bdaa5b2b8fd45b1e03a6ad7c9a7c3de4efa71e53a9dcc10360e3ebdf554bc267a29c720739ae8753bc08c0946783cfe1d3bc86f0696e1d9f664ec7c70be113ec184608863afe8675d8275ef9f47a12e9c88fafe1d37b7c7cc6a77dbcf6881c131502c294673b9f26ecf834df834fdc4fa88aa17ecf58877d7e34f7bce977cd6982c56b8f99d3ef5894dbd866516a63ab41ee6284af7ead0878eb3d8c61acd728e7d5f12a67cca0bcae1a7333d5ac2ba3dc8c87ef792caf47a9bd506e577cacc1b097a986eac1ddfbfe7225cb28e73b1e7b1994a2ab767133d5d77bf869ba32f3ea989b3faf95bbf8d14b7c827fbf81bbdcdc8fbed9d6f11b9f76a572a7dc615fcdc836e40ee326f6d1576a63f2e7351f5bd67da428b5b9d4f1d7d3f9c07d944d1376bc2acebce9f8f79e7749d1477293f3eaeaaca9ca64dced2177d5f5aba1449c0d12ebd7afacf95625554345eee28ebf95a0d4fef574605050505090cf7ba73baf474e2b8f9468e318980a6053212aacb40a51412500ad42416434a63e6c2a6453a1202f5a5b9bffb4006c424142e8099b7fedaf4b9f8eb2696ebd9f5bcfabf57cc8a7f8eb2f3e69ebb1a7a12097b3598fd23ab699f51e668d88545bc7563b52dde266f5ea186b2824315dbd87a1dc8e529b35143cb69925ababa6dccd9a5e4cb5c84d293ade92f36aeb959cd5953beb3daf92da969cb092daaa45eee735777bedc1d572176c8666d36b85299fdee7d57a5da90df9c4d7634f6ab3dcc6f8c96dc8a7bd1ee3ecc93d16647bc711b7d8e0dff9aba1385b8db99c6d8f410db55f0d72903b3e16b3d5f6aa3d4eb9e3f730b6d9ca6dd50ea0fda4768a776780e98f0d8bd11ef37d3e41eedef598fab0ad86daab66645bb97befe195caddbcfa1dc8c67fc7363e2977faf71a3eedf6bc7a6efd8e6db6f149fb5db57d0ff7304b1b2457f3af66ce06091f9e0fb99fede594bb095bafda913d7393bfef61defd01a63c1b7f96fafdbdc427fdfb0d9ff6ef9075d6e77de393860182a17e573e69cf9a7ed71e8f63f2561ea95d2398e26c32ad61a420a8550653856cd8b856238081425bad4600b3a5b7d506a6dda611531f9b464c4d9bc618e4c3036a18452be2945845e440a402aa017e8169806880678066806580648063805e62100c03eb00e900cf8073807280718060201ce01ba01b601ba019900b700b500bb00c088507c6e3c176e1f5003e8139c055402bf00ae8040802180218053804a5009b0099009700b74025c02440244031d806ec057fc1388032805cc018402de015b8058401b70166015bc06580634011c0114012c02ab004d0049c056bc15b30168601b7007e21a220aa205a792d782c782b782a7829782878277825782478227857bc10bc0f3c0fbc29af8a17c472e037b01bb80abc064e037b81bbb016b80cce026381afc056602a30191c051ee227f018b00bccc21f881d602a1c03bec22f602e5806ec026601af204a13083002826109250f704003926080025a89213aa79e042001ad805ae00d5e182b82bd6243b020d80f2c95f5c05ab11dd8295bc57260a9d8a014d006a6d040063020c505a4402ff00da02c1a921c1902aec1c8017682d82dd8b62eab41c46f49942524a0248a259638a14409b6af09274b942819e92e692281257e9c5860024a7e985802e589269c3ca144c90d18447a65fc2c016589932514902f0b1a05034b982889a26449135030b1a409255130b0048913289e8812654902763c2e7a8127a268284b984081820149e4b3822ef959a289279a2c2145c9120b2cb10002906862090528b004123e5e15340a13269638c1841434ca8f9325509638e1e4893f283879620236af09cac413519c3c01e5478a254a30d0248a289650026549134d9eb0800f1326a068e273f3b66805942cf1b344134bfc2c2942e62521034f3459e2899f279c3c41e389a14c9880a28904942cf9b100134ba45832f38ca050a02040b6bd215861d46007ad294c8582827a53ef46b54bd8256c146bc11e5455bb1e78e0f86015e3c2b71bf745edb16603e16a314268ed5a363087655defedb003efee5b8ebb1142082133bf18e1b3f431bcaef82ceb4168456823375e6f37c691f6aa8531467dd07a1b1febe3c8c51e1c63a4b1f1458e598cef3133e4e0e3b1918b11c2f81842b89163ccb2f8b22c8b1c33d6b2f7620663c659cce266f03d4d83303264e6953046c81b638c3bbe438b316aac458d1f5bb0aaaa2a427e1042b679f0c117637cfa9ef520c7a86c6ddc08a315ad67f32e7df03d082d4badf71eb498999599f75911c6081fc3dd1823f315a3f65699e3c61817b28e18635c86317b10423882912164860c213347116418638c1c3946c811728c10ee6e8c0fc667c17759cf2687a5691a8430725cf86c5edc8d56b4364218e1d3b72fee2ebcd15dddc5a1bb3670e1ee5a0a2f1c22e61b1be3c65db5a046ae20849aa6695a0c8a1cb8144b9a70f28412274f2ce10413139800145c89025034b9d103e9860d1c4c985842024d9a40e1430d1c333a666ed4683f4c2c11c5c912507e94fc3c51810a40d1d1e068d8cc44594201274b38c1044772b2248a2896b8a9c0133f4e2c0085a331811f0be4a0b1c409253f4e9e8012851226a23c51819b9a26964059d2041428963c01e5c787aa023a78c91228135002058a9f259880a24993256e849c720cf921881229a0b8c08f8e9a93007e50f2c312264b349180120a3879c289284b38f100347982490e4d941e667ea080a293596209946d0913253f522c71f263fb5942811e62a2fc4479428a253e48f1c4049640892287046589254d9850b284024b4081e2278a92269a3ce104134a7e9a586089092c69c2a4fd4059e2274a0f3f4089c2236b624994284ba0445101289850026589142898580245c912519a60628992204c4e02f8210a269644d11939c1c4cf121250e24494279c3c31810ec3c0049e80b2448a1220820840003f34b14409143f5160000a134a7ea458c2438a93256fa441943881e2892850964851d2648994254d9448b144059450c0c91314a000144d94fc48b1648714274b9e8c3206a04051812515a8a43859f24c9a1556202020a0544c4125520b040404f452112a01b440a95454428180803495ba94d0540ae829a1a94a89d4a69e1240ab4f09055a25520bb44a281010d0530268815609a04d01010141258016088895482d10102ba1aa041050ea29915a550268535189d4a656094da55809d5542a95824a686a5989d4a652a9a784893db0aaba1588b28406fb8d53eeb2f7bc4c929e5db52431e762fbe1de649e713fdcd9a70c377d686952f528ba75dddab8ec31d949a35b8f216999bc64c65dd6236e56177173df6df85705835a79a4480b6380698f7969e9f707864ff0fbcee88541bddc56046f096036da4cf41feed15f958dc9f578c935c1f674ae2acff47e5d579509a9ccabca8454f8aac227ec222b7ccab2b8c2a7d1df2f2eae2c2399892eba6aa3bdbce4574389f6e296bbe415c4ddbb252f2a57d035854f17153e592588fb34eeeea067f58b0a9fdeb7cab63d21956c49b059df799daa2a7c126101b38056e015ace7f6f461830532f2a1a5e70f77c5b3691857b834b4c2a77955b9aaf049c3b832d4ef17167ca2c2270d038b10fa1d5e01b3e8f7d57cd8608154574dc4f9f06281441f59b88b48e084547cd86079969bc711b9d89a3c303da3a4da7af5f9c0f47ec1f472b3c903d396f4618305222f2dad3c52a3c542802963ca44de7befbdd775cff43aee92e06eebfa59b08330428e9cd3edc6f8de7b10c20786188710d2082184301e42a8aa1aa55e3242765edd56626c15638cf1c9769454ef2d4b7162ecb1aaea8a1b2b2ec65871accc881042082184315610426df8e36008b7aa1642c81b638c1156d15755555515efea933182bbebdd0f3ec557390d638c3f0eebc98cbbdd5bbbafb422b6ad45edae2ef7beaa949b5360aa4fadaf5555d55a718bcdb2b61ae3baaeebbaf60ab289b6fa7e39267b7ef5b99ccd118b458f17713fb8bb44a2eb128944a2eb62914824ba7e5dd725fa755d178944a28b63a24296168674cc8474fcc1a6c85fadaa2a4be606fe4181cc55c5ccb1e2c8391d9763aeaa955cc1eee994e655eac8179f2a7e25d932411bda872d4db400a37fb40a697185a5f57025e34415a1aaf26a64c36b555555de65992698799999f931f372aaefedbe3dafaaf26a16de0d9bdef51b9fcc1028b0218430e2e0bdf71ebc36066590ad7a0f43086520c09de8b3745955fcfbf6441a0ac24b661a11a98aa356c43664e60bc2f7a6e8eb2c4522d1452286efbd289fb5d51aaa2b5ad68d125555c558bdf79e9502541cb9b0bbbbaba14adc2d3fbdf81a6590e02ff3fe3d66667eccccbb9039c607f9ed777779a7c4c7ccccfcdeab1e5fe277ed7bf8c9ed4a46787110623333f33b432893c3ddc65dc61d84f0c14a4341082384f071cc31721356d58beff199991fc72fbcf7de7b975a1aca5a6ea69a9b70e10d776f45512322d525f8e023ac648c10c2082184ef4dd1d5a1c4826c9655c1f7f7de83dcdcc7a5cd800a218451b5f8788532447077dd7ae9864fef30cab8457cefe128b7ab180f7737eeaa5b32e3aefa568f552c623b56a8aaaaac2a7273bb82700a2cc816af91eb79567c152184554e050733c8106307ad4257aed85a8d50072f7a0b58b40ac1e08c9e5d572fb50a69a10c8dc5547a786148e04517714c44b70e3f459ccd9178ebf116d70595fb60dcbbb81beeaac5380bb2595fed9af0ba2eebfa6436ee3628a9b60eb58b3beb3e3328438fd854280667748f56a1187099a92ea331d5d5906c5fdc9ca2e70fb7cf0cca7817e7338332b8d3b6ae8d3d6eeb3e3320c3670664bccb609dd23355d7f6990197c6826c3e3330833bed29b020dbe8234e1b297797f5c37ddd923e33e8c29db6cf0cbca07c6640069f52adcd5ae9e95ccf54bdba7a96647c6630c49db6cf0cb870a7ad3e3320833bed9cc8d5195964d1f1d65c31aacfdd629d5f4926d6a3756511be472f3a66caa71d5a325ae1cc1e5f923524472a8eabaa5fd57bb4d2f1557cf56eade08ab60af01ead9cd1f1d531994c664646e686267233eb08bbbabaaab0ea22392f0d8956558c76e47a05b9b35e49ce66f4eadaaa8db822dcf11877cf8b59a9470e91219050a2891453aa64916577c0276e78ac261b955af530d390a8152afd8a788fda91eaf15b252f4b3b72593432e51393ea5134aff3e7366bf87a4b43f26ebdd28e5c9c86e43d1e6a472a6e8fc1c7ab3092562893027c1823b8a2df534d82a08e395dd7632c8f745368ec27858fc0a02005b25c920dc43f8ef70cc5facf055f1d6a45520d7ff1e9fd7193fbb1d4beac8b7bf2dae2bef1ef45440e72b7d63e2bb04a0ad109313150c22aefe3ee09cc88ee57b7060e96976db0801fbf1aad423198f2e0832339c0082397aa0d2c332f5895ad0c82d52af402207449ae2a8e728ac357cd48a5c7ac6cdfa5387c1c5cf69d4ff37a12029b0a5dd9d2336b9eb045baa3cd97ee5c118256113e5e8ba48a8369c154776e549f396609d698324362accf999ea3e6b916087f5ef013e3c916089fa438fcf9f474c1e55105b23e9a3fe226f790e5d10532677a345fc44dee39a4f997b4a11dff491eedf850ea765347733777e86bb11a8ac3e767cb53b340f87c9e1f43f8a4da2d376f708ee6476ef2bb921b9fac38e3dfd5e2b63a2c120f2b99821242813db7668e890a3d2f60da63ee958ec7764829c8669a72deb83e33d1e7d65ac39f25d8c18be4486e45b899ab511c1a6a8217b203a7b443c3cfad73745c9e85d8cbf4e974cf149f7d5ed8e7d6aa27d56eee983b3a5e43754f2789678abf326e5e1bc6cd6d2a978e875dc763493c1d0ca8299e8a2e1ff0d2714bd0f153bf74fc2a4e3ccbed27dbd4a18ea41ac5d136824f9306127c9a4c1a3e7e2437edf6229969b7bfe4a5ddde92503bd5ae66cb8a5cb0997b32c511d890e3f499e606757c0f4fc15dbc14607aaf006d6a5fb50229bc3fdc10fe706f913dec3dece56c902c5c3230edc1acdc31a6cb0333d51ddde1d6e5612ad4d2c1b0fdc2af865a8e3594555def612cbe3061c284e96b7bf469f1c65b128aed1d72174752b5634c4236c5abc627eb71f4387a87adda482322d58ffbe11e713648447f7f9c14eebde818cb193520e256bbeaab1d81bd5f0dc96bd1b1adbe4f2b02cacff6bafa2a90eaac1d79bdc7f8c90b73468bce7272575f3981fa1d6a4738a8451c14d17fae56c5e1632f134929dca263caab8f347a0ff7eb11f7e4555cc541ee7a78c9f6cedf1868530f463360366fc530e5a6113d9be434932753caeb988b7e5ddbfa3e934fb2cf5467d7a43e463a91e94972c2265d934f26ec49bafeca1e25d51917456f1dfbd91e7d946924095b934fae67320ac635b9a670808a9672a3f5234eb59b22ee89725d7ce0bd03fad65b9c3eae03db076cf874608a110c62c08315a0a0084db8e2334507fe4c7c20e592850e1d20c30c2ad4e10b9f781ff8ea3e1d788f5a6cead3814d4dfb8aeb40e4f499f490db9e49af3e1d785c07ae67d2979e499f230282a97d6f0a98fa00b9e3b7e8d6f541b6b7bbcb4d112692d777fc1042a4076cd15974eb984845a207d9de2f3e89b8f9becef0b3143fb7165de7d5a2c771fad6e68a9b57e4e6d6909ba5866fe5d3d3813e8fcbd9605ffbaca00f5e1572f37adcdc5a7d989ba5986dca177b2beef3053fc50b85896d3b08314cb6f9f43d729684eff09d09bcc5413999a7fab42c6e85b2fdc3fd5477263cbd4f081bbe66020fb9db86e709e52575dbd6e6563d41e1fee185473628a8df593ba242bdf0fcab829fb0dff68260842ab2f4f5ec95ee8874e7ba5e727b8b11aa00036622a96d816b9f394dfa1412f3398489b4f5ecb3c33e7ff4fbe42048fa3b9c37dad34a5964d8423d9f50bfad475cd6d7b148854ff0cfc87be6329fb0af2b9f2ec8cd194e868b54b44bca93981e7ddbe42567ac52258b2c3b101a838b195fe21954b0b8e2051895189826b723153ec5fcbdd290c429dcbdc770b386bb771217a970f77ec9eda86ddcbdff6c3306f5fbdc8ca882837caaf7b026b5470a6466df5b5a12a0ce2e24fc8b9bdcd9a1763d52e153f677a85d1c127ec64d29dbd6b14a4312637da196848f714fb647ef618cab5586a429d5e3b745727b24bba0729fea5894bceb53c9291ce463c57dbeb88e31c42aebcaaceaba46a3cc92cc81bee40b13a631d58c70156d7113888abe8e65d925995c0fd3a2544f8b0a9fac24fc996aabdb92dc513322445fdc1321fa3aa61951a11605b568855ac43d59a1be1e2f9f48854fdbef56c57f3e31284e8954aaa1561ea90c8853fc302d385e8f3dde5dae021b3c1f3264c89fa5f8a7a12297b3f17694bb32879775b6a0a0202a7c146201d31f5b8c11edbdf6c0826c28a88d611a11a9036c6bca55607bd7de3f7dba9fa543fdf6c2f7b0ca1ceef4512322d57048eb89286ab99c6d5bb588657b3f7e02a63e6cef4bc3634136eb588fb6ae5d90cdfa6a288b19925471ac2beb4c91e7f179b54a594514f25890ad0bf91ec611b7d8b65b71db342252bd715df0e0a8dc47f290ea23a5faa8663dc7b11ec672c86dac7443ea4ef5da7adc25280e3cc6590ea98dd9b0f1d265c3864644aa6de4b039f632ec694576bc3a86c58c711c6a49ded392d4dc780f573baecc92da55cd7354e9779b632ae44b172dc0a661a060a8dfab633459e9c6d6d514b59aaa5b9a05d968ae1a8ac65977e09f9eacc3ebf2bc2d0b041ec767696e9d5d9d5d55e7657926f8ec349a91778dbf2c4f67b7bc2dcbf3c65820f0f0aa1d07374b37b8b9c5d764e1de96a7f3866e3c5e717c6e36d7fe869e0e8fc3bf3196a77acd6db859eaf986e47170738b691bbff1861a9e87b4d464e3967cdad9b894aaa669a36dbc46aae2cc1d6de3ca6de3937bbe315481d8f86e591eddd19edc73b75ca2510f3d55b7defdd0530dd8d67154326e511db3d1501597b3d5a86e6844a4bac6552bf2aef1cd6a6adcc651a5f7f026a78e6f9f9173665b87dcae21953b1b12d6e8d071ee46870e1c1a11a9d671ae46cd6d48c85dcd2b1d726ed7380dad484d0da9869b35beddc67b18a391a956a40649ab711bb75183cfe0d3cde15f109f6c0effa690be5bc618aae4b3c21d3c275f16dcc1eb90ef0a77524e91b7e23e92fbc2c6e637b78ee5b0b1b1d18848b5cd6334d4cdb12d63cd08776936c9dae6c9f67629b0ab3f89e98ae3a46c6f57adc876ec3dac1d470d9f6e1c7ec9e053e9f0cb854f360ebf65f0a9c6e1b1975552c76734233a5e1dabe48e8adbf1d58cd83cd9fea5c01cc7719b27db379702fbc97e699b3f89691b4e1567da9caf69496a9e8393b27d6e56bff14c4bf26ec349d9bee166f5ed3dafdac1d920d1719bdb704cb663d7c131b9f19fed9af7b03686835767704492760ea97d235f15eee06de4c382bb2c1d53c91d833b781c7287b883af914b0677f037e472e10ebe24b70ceee06dc8edc21d7c0db9663c1939b7653ea315d9de2d8a03efc4d671074f731ab20777f0588dacfabcb17dcae8e833d57c8adabaea8e116d995b5fd5d92dcf046ffd8686da2df035dcbc366e6e3d77cb33cd5249a3e14e810d7e3f1f05dd79b25faa6fc3472dc97bb5854f7cf81d834fd5e1774877b4e1a186e43dd99e9979cf9b91da32527b93da31729e2467a6c959ea4c42b11a1e933f4f470935edbdf47ec4cdeb4bef45dcdc1aaa692a98de5fdc2c353c56ca56b3b89c2da7559bc0567153bbf47ebf5b9e4e7ff9c2266d78e5537f01c39d76e4e6d573b734bcf6801c93f72507acb184985623ace109efcad7b098ab550fb3205b7c1aeac5ecc9fd6a91833183dc10da4ae0931322cdccc4f6b0ad864f4d88f49e4bcddc45fc933fdca82ea8dc277240447cbeb04102fb1df6e36c90bcc3bf07b4a9c73b05240a80d86a04350401c986bde0bda08cbe69157a01111a8b018a819fefcb89e07b1883d18c86dc931726cc05459c938b9bd79ba470f0a523e7648a86df5f7f125eb524fa842a7d715d54403df7338a9c043145a8a3137d42958e9f19e84b143923b210018815c2b8a4e857493d94efaa39a087b3f0b1826a6c0107558c21087ebb08ca210219607105ca0e576eb025e8270a35a3bb080262853082a4043145488a0c747c171c50337c2c2e48cdf0516e0a3d909317c4e00a549c1114e4537141fbc7cd28fa2121d3852d60a9c394a0201fd588a061204ebd571de11dea4ebc1e8b6f9f73fd89feaabfeaefa2ea57f5feaa3febef3d4bea326b36f0dbdc36f02af4021fbc0c56607489bb2af3127d6ed76749cfdcdcbee3b18895e79b7b9eb5bbbbbbabf3276aa8dd5d5ddddddd65bdaa8a36b2e0c1cff7feae4cde467d57cc9fefdbbb5eadef1bd7e7c1c767b61ee452715f15aaaa7a965ced5e84157cefc50afee7eaf85e55415845c5799c8e81698fb9413e29eb4c11dd8afb88b82fe0e1650533f8b424f0f041c8410eea60dbf3c55dd5496f039aee54e70359d5b3b887f32a7e5fc078365e5d23d3baddacd1fc89754df33747338d66ec14a3dd36e9f7e5e68ee6cbd0e8a8c03693c3498ccc0d14a4cd260a2d06c7938c74030aa695a28c321b3f22ac8605ae110d2996a8e602d5452345b46630002b99ce00aa6abe0660757ecc141aaae29336a00165ba13cf4c8e69019bf285de8acbe70bfe1ed31be10d59daa6d5086f0841ab9604761791bb9ea9f731cca4b701ede213b766bab3dfdeebf574d467af3d1632cf00fb3e9e23064fccf30ee3999c638c57180fe363f7b8099b8fc0a020157a5ac0b018bda6b0f2bc68a1abbbbacafc1e8c5157f54cd0e6da6083da57be873579250c98aa152f30f08265dbdd2cdb2c31bff720845b69432dd77db36c107e779bc8f7c7e95e536f2d37402bd88b9595615fb85860ba0479f1326479895676659b6513e9473dba65c8101689f824ba4ad7211d32e2998a586d84e23c1758d01262f14843bd2bbb3eb7eb9296ec627b596c7bc5ea47a5751d965943da7a65ea10b3e54523c54c946124d8da48219fb86746a22b23c5f3296b4c4b16074c9fce17d5adeb31f98514ee9804952f9e0c69263fafaf779df2b18ea97644f4271ba62367c929d6adf8e2c990fe7941dea19cbb874652cd95dcb6a4facc09d48c84a6e331985512890d0a0a0a32892ef0b423572591f011008470995923e9e2a470c72fb40821d492bcce2cf9458c106aabef91aa57dc93d79153c581303e98c5abd27aa6629bcca5f55e5aaf672a988aedb2ae2f98f20942b916b7da450d40ae6015bf0a044ed1fc7dd57fae5ec5898f40cd5f0d5a9565714f5e575c94bba96ab908181613647b5caa1ecab2d5a08e54ad8af32ac8dd7561a42d03a63da676698c241261356cc89044a51b350fc74d8c38746cd74da489c92c1e3c48c90300404c3cc89c203fe00f4266667e38759590191f3df438cf00800082a788911e0010431c29806600227cf0c10007e8d941840f041082c890cab2ae4b24128d4618866519af6699c58307297900008889079913e407fc41c8cccc0fa7ae1232e3a3871e1f615896699a4622c5c4c46c6fdb7875db2c1e3c48c90300404c3cc89c203fa04622c5c46cdb262333333343f368687895866697f9bd07618cb17a55c5ab55b56d32323333333434353535341e0d1abc4a83c61b65a46da6a68616234363132343b3438686a3e9b1030f1976acd350a477a62cc826ba494361356cc81cf3913d8d741f9a911f5990adf41f1aeac67fd41c83380f0787577170de0d0c8786ba390e1b1b0d8543c76f6e72644fbb798e784c870e1d3bde8e1dbcba63871564e3712c8786e2e13974644136791d1a8ac7b11d59900d00dfa1a1807c876664db74ecd9d378f83523db32e7524305b9fc710c728fe37895e3e031a9a1845c721c8f2cc8763a0f1e3db2a709798f99633becb0030f8f071e7895071ebe431664e339c683861ac079e8210bb201f11e3414cfb12e0bb21579a7a18cbcd38c6cf73153f6b401dc04c4311fb220db10f741431db90f0538067d3c1f3e78d5870f1fd80f0da5f31f38381acae71800b2209b020e000dc580034033b28dc43120d9d3740e248863395990cd01cfd1500f784e12c76090172408af0609b2c37bf8f229a38bce279b71c4277b41e293bf28e093dbc080243ef90c077cbea0077cbe2911e02b24f9e42cb40f441c60874fe6328652a9a666dbb2cc88cf6705019fef4a023e5f96057c3e2d0df87c6040e0f309bd2a414400020f7040039260c002148044028e40808e8f1149b86b4546bd03e7c30188d8a123c78d4d86e387ec3d0de5c31f841aca00c762166423e25143f53c6a46b67718c00702dcb2e0f5ae8b57af6b88904c9f8ee5c35c18e093b3b017483e590b8341c4270b41488c2d6314c131e02d1a089e017411230518e2c8904fbe32869b9b52a9a666dbb80b7bf902e6053d2acc6587222ec4097022ef3911df71243e1880870081d239e233441005208011218af434919d1d03f08167071b1c374a9b8daaaa2c4b43f970ecca826c41fcd25042fcd28c6c13f161c70e3e1f6928027cd4730c620fc37815c3340164fa742a1f337cd9f1b96dd8f95c30443e3928884f9e22c42753e9f9e42b7c3eb90a013e190bd4275b1983cee796a167849cb4cff5f2df944a35433e390b109fac85e793c118c0270bf5276f29c0270ff1951d500520804ff70831802088f0ec00b1c387213a5c91516bdccc49888d1a346a6a9a5f231269a8998b46230df5c3312c0bb20939a6a1ba639a91edea87191fd734487a2412af92483fc5dd41fff0b9600821009f2b24e473c71822834b1902f85c1cac0e5af2e0c10400203f7282fc3737a5d217301cc454b80a5b592f9a00dec37dbcc7bb0b79f500ccfcd0e3bac4d911c4879c1d7ef800d203003a530faee26186875643539ac9320d553dd38c689a869ad9e1240dd5c3499a91ed1e3395e6c3370de5e35b770cca3c19195e9591813a993e1de8a3676cd014ee73a9f4d8e173b1e8a1fbdc2c7cf8dc2b3e3e970b9ccfcdb2e353e7d07a0cfcf146c7a782b9f9e782213f5788c7e76ee1e173874c9fcbe5c7e776592d1ace0f1f3e98ba1e78d8a1070f4e5633dfc16130eab899b9b98989d150f131dba6a1701c93c9826c3797d150db653423dbd7b1992cc886e3331a2a7e86868606d6bc9a1a5eada9b18664fa749e4f8f23b4be550c1c9fba650c9b4f1d522e379f5a86765133d48b9a21870823c9d4b05153baf1a9420fdaa894aadc4a7765b380c921634e23b36fbff9751b19250ed98364892a6e2a97e6df90cadd0c37958ce697a472a7713552b9a3e1a68ed17c1b52b98be16a48e56ee364a4729771239214d27c0cfe43860c01220bb2c103a1a1e2b19d2cc8a67d4743c57c4733b29d1de3c9826cf13c1aea3a8f66844816649b39110d4573229a91eded180ce2051104af061184880444a64f877d34db6a466fedd1da6d9f3f663e73683e85b47e0ea944cad36381f0bbf5a95b44aa5c489fda45a6e61d0da9cf54c3d148e56efe9891ca9d0cb7c918a9dc91b8f99e9d18cdcfa49644dc25a3ecb13c2605c23b3e14875f71938722a37e1c10ebb36da5d2df75397348ebafa7d33d13171975a738fc1ee60e603b993e1df5d1639748448adfa723f2d12ead3c20d046a04d8d803675dd30a94316d4fcc0d470c754c0607960def652e9604a9b18db720d773cdf9cb5018be657f2a242032ad745a5b9064c57e76ffc12bf5d300f4c432ee38ef5ca82de7b53b031a444bcd8b22f3764c810237ced3d7ceab161f3e745756e0e0fa9a8ce8dc3c32aaa533afc8d1ce299de6da43e53cc6dc828f5996acc9b86875fddc17178a8a799c35f7aa2397ca69bead0387c494f32d04a67af8e65b2a792436ab0659f438870f79ebd8787783a108c677abf6a70f3da62b82dfd0ecb3043bf6b726e6bc79e060fc1783a5796677abfae6dcb0246bf6370638dac711ab9715f59b0c5b2cd982e38e4f61b32be246d587d6579d7b56da3cfd23b4643c67479a6779a1acd6213b2c9ed986f32506c8a43ba6aa82d0a1bf2521329e64a8ae1a6140d4d100c0daa1919439295182d8aa1a9614b4380c8676510a5a575f1677a6766eba654e2f79ea866dbde6834ca262ca3dfb1d734a48ca4e9a2a168b87051d170b12c4b436d47d5c8b2619816d3658b6d1fd3e5bd179359e9982e315d62cca82163bc58315d305216648b3949439da4a13692bc9a440283a5c9034343c6d748781ab97d46c69c24b785d0d6e73546bfcb448e86cb33bd4dd29441d34543c570345cb87b18cd65559157df458a39496a9362a42a0e8953ee200735a99d65233969c0e877514c977ebfe4843d69b8ccac270d17227c7202ad34fcfb909eea82d00ab46263815e6a81361573d50c418b35c2c61d64fbd2aa6d68fd06618c1af002add8005ad9ac36c480b50dd7175f7c01062d62106453186cf0c2826cbbdf2cdb7b10c61864dbb8d3571aaa09b4825a2f362c0898dd33739307465e963522a9e2545be0eb35ea0a98f6985995e663ba308c9d50080a5d59c6b85138347f3e0b28107e84a5b9c15859a2119669a4986cdb366c862653dd1989616b587b5ccef6bcf4d38a60bd50b62714bab2b8606d946e64220824c1a50925ba3471823bbe971b3832782161c4100e3e3d9d9945640877fc2105a0d17a8488e08e3fa30dc1c76cb29b2cd3d59962dd8afb58dc17aff5ab7b8adb7bc5e41d7e7144196cefdaf1efd56844a48e3c4e080773b8e3e7348fa4f4bb9aaed7d8662291dcc668f0ea83a47891d4e6551c78190d551dc3b2cdb2ddd0a0d00f28d475cd50a8993fd21020f28142328062c02d50080ae5c8914347a6f1336bdda22140e473657926196c59746499eacedb4f68c9cb0b36b12565b42e7606db7e9676ecd891a366db62feefc82e199905d9dea586921a0a9e0a96ed5d659307a631a95d59b6d8ae2cdcc5b6e7437979a1a5f9341aea7157162eb6fdbcb26022c548f1ab3810ebac4a2b8ff86abe800d35795eac2c0c36f89e079b3c2fcdf2e24e373e6d7377aa436e36795e1acaed051bfcbc8c64dcbd89a3df592b82752586be3e21159617c5795f176cfb69796928dbd3f2d2cfc9f3d25b7575c57511afdaf3e2f38593e7a52136f46c80458c7edf76d0bbd5c00cca05833bf8b960306f0f1608bfe7f1b5c7830256c623a3f555bf5baf8e443cb4f65597d67720eee1e3d2ca3712df6604c2cbc8eb778d1a4ab98865833d5f14a2c0fdac0a3ede58bd21ee0d298edecab68729e627034c75175e7423f0a266edc87e08284552c29a1acd083cc20f2a435ed6655e6623960d02aac72371ddfa11ea33a5035b072eeb62cd48d5bca97e9a91086b62c47af4b8b911954a48548f3f02abaad1b65dd7a5197946deb65adae38cf0e12ded086f9816698fcf399da519793d7acf7abe11652ed59666649bffb42dad88a8f96945387bd9487471b550449aa9e6c74030f5dec80acce6c83b1f6369338436c7d81cd9eb8decf5a9568db98865b3d1e59e9567a5f5bbbbbb7bc4d5a54beb9999998fb0380b6769fd7befbd23aa2f5fc0006383360842ed880806183146ed0858559576c4d32dbd9fbaa5f5167347f0ae609b5befa51db13ef0588ccd914e3536baac8bc45c1790d367e21b799c026d8ad98a83f6b81271c119c75c248ae1a6294b7ccc7692cc4931fcf9031f7399986f529f2926fe69acc9a121be098b098b098b090b9318328164ba62e2c294c5c485c90b53968b8686449f3fdb90757d3a32e75f4f473b73f387846118e932248c746ce39abca19818128661dc1c894c584adb8b35b862ba62e2c29465049f4ecc670f5f660fd6217343d8b33f6ef600a6b55f8f91fa4c17f7b8373444227122eee26b529fe93d7bcfe27e605ba3bfeaa24319b7d830aec91b6a6b34127d2f7a7f6bc262c262c27285532308bbbca1de20345d317161f2029ab298b298b098b098aef0890b68f202ce7c869ba62c4d825d5df499ebd3a1b9ccafa75373196ece58f0f3077ee63572e634529f69869b3fb0872f434338b62138b4c9a1217813161316131613963714c3b10aab4b17339e975e4c67f4f9b80c89520049d992ae0c051b139125a4826dbe2e4fc712b2845e174be875b184fabd4b76d17bd812e293f66b0b9f48630c5964585cf8b424eefa75d532cec48526125d9ce98a883361315db1766069b1c0b0b4583bb0c0480116efcb0363c262f2e2b2c058146cdbf375c162b3bed3d262c6f3f2ccc0a736bc2f0f8c09cb02d14c59aeeb7de1d3b4842c214b8cd7e599f1da60c2b2402a131722d395f9ba98b0fcc0be3e7f6067dcdcb630a9cfb41f497ddcfc816d5dc4cd1ebef4505fdcd0d0d0eb62c26275e194f5302e3cc2aa6331be6bf1da5e22ae8af1d7ad11762cbb48845dd3b89e27c22eca34d24522d1495815ff34d1338cafbf67d8487471d3aae28341da3e2f5a6cd1a24a0cbcc4804bffd01a460cb8c08e61d59957bfea434baaafa7b6995fe9fb0f37d4ea555516b9d8ae6af4eacc84b9b922ec8d38aeba65953658822dc8d0e24a6f2146f7d01ac616596c714507a0350c2db8585f9aa58f2c4fb5a34ed83fdc4c3e1ff7c34d1f5a500ff5ae5a0d771977ca0fcc143d305dfd3d8e3b16719f4d1e9877d68ccc1413c8cd857f1bff2e8ec9defadeaa32687d21020cbc74d71a060c84628045fbd01ac6152f8d29cea6617001a6b704ad616c61060c6aa82dba6edc4cf5f64cee5a276527ade86bfd878bb83e3a8eb805377d68e9f8a7196122fae808b7f61ef66183e599a93ee958cc33396167f791854fa46ff7e1c5f204dcbd97b87b43fa0d31e49dc8bb103ecd92a8df4b37aca33e9b71f7b4a74355f44b7689462535b16ac79f3d861049c3d6c3dd7e081727928080197a8f041143883ce112f40ffcf66a48ae86dc74a2e147b2463bbe887ff12d7ec58f0c21fcd1753d644eb0d7ad4b7dc5623a85bb346c4b85bb6e8f23009b0a69c18bdd2a5cb0d2fb02ec370b3ecd0daac2a7d92d167c12f57e83f8e4538229dc4d611df5b9ae6d2b957e9d9e67da1e9ec126c51442b8db1c28e343832caefd0f3ebdf76b858dd42a14862d345ffd76be77afbc396041b6e56bd3015469feaaeec02e399e1070f062a15213cbd866ce10dde153f573d7230bdbe1f5ea3736d8b7ee6cd75c21b2b8a95b647c68200677dad673b40a7dd1d2aa1521ba0d92ead8318e898d36e48e471cd62a64861a2e2c6cef99a337ad4260b0819665d8889bba858cc758b8a88a10c26de75c619b3942943be6b2cd1c159281199aa6e7c555b4de87065870a7fd9e39cdf0ef46ab5018b8d8d4c415b756d8625a8d30862774ced3519f98a34257b6a323944aa5bdca0baaf277959ba50d3e95fc27679352eb59afe5e06e184c7b4cbeaeb8fb25631b61d1b296b32cf95ebd675996f5d67ad8e8925143ad0cc30a33b49ed11a0607ae682b538d8c0dbbc21d738163fb7ab15aaacc6bab3c1de658255af195b5d528ee26e7eea0f9d8f5918682574c79326ed516ab58c5918612f1ee6298bca8b05dd9e8baded350ef16e96fbde02ec6da8e9133ab46a32659c5497818638c56959efb1feeb71fc9097bad95d575a5aa48435dcf3606037bc63aace599f8d8954fac933d6a8fda912bb5646c95f5b4b0168bcb9a94944fd72b0d35f74a6f96b95e1ca9b2f45ee75fc1c0f4dc2a6d7dee1599c92bdacaaee00e6e7645cf1ff80ea9b4c5cd1fabdf25b5ad43b9190816c8eec2ec8ace84d0199505023703c1028187f062a1561ecf060e30ed31736a5887af7db4b61aeef8ea8474ce26be7521d790deb411917d14b23f50f41e3c00d173f854dd8a178d5e492c5a96654d38737ac4cd26591cdd92d1b2aaddc102b13e8ad62f2ee38ebbb8bbb9798f784c2d2b87bb38002af7198088533641ee2c6eb9eefd38776b3deb0758fc2523479971a76370b743dcadb5e50c18f41ebfd7ea92cc91cf4df85d51f48a238bae73640e72199f140a8441bdd99733b4f49ea53ed3953ff9c8e06eb970b7d555d32b4f87f4fd1be2934e952af599322c32eb4835111f63fdd3c7b3d43f29527e7cd153e54c57b8e377957c7eb4b2f4de1a9a8f4baf96b85396903bb532865530ed3163b460d998b116b51939657464345b63345b609aa1c636f4e87e3c300f0cf4a1c58260f8880f1b2c90175fe5434bfbe8e2c38b0552bdead8cb2c09ffa40f1b70554764af7f1f595baca166cccb3b034eb95a9fce88457ccc8ce6ea7babad9114f593a62cdcbd8a9ba9277bf8d23d80e9c8cd1f68c94a06597469b3bee8585fd8c47fd71dda1ef7c0587fb28a7fb23a9496563d78539636716913170be4ddaa38d315ed8809cb02798fdccd9e1fa3c5e29116e2108bc5143da3f9ba415270c7435b122fdb286c73adf0298bbdc2272ef8f498873628507d2a49c47b8746e01822d555941637e3531d6dac6b27617da67a9f7c607a25f75b286c53b924715ddb562afd5d770de9790d41049f2acec98de0d3c62dd60a2fd705fc6a30d5d84a9b237b3152ad2bb5e38ed70a14b6b5725ddb562afd5dcfab73728674ac72d9606e364748d7ae71a95eed5143f135abe4eb4ca2b46b57adc86b4c42f981ad8a0399ecdfab04f5f67e695e65d2bebf330a9e0455fa46abd0165f1a7b4f23c18c04355246923647b4934ee226e9da538d91e434a21d05ffdd09a348521b536b16d9d65e64fbc986d1b8271b469345b649244e93da9526e1338982af2b231ba663e4c6447f23988d24f7e8338564c3706330c3e4b5f2c976112b2e932650571f4911a70be49252ae7ef2ea10d416a70b645e72ab49695b0d0132ace46412ff0ecffb1eff6455714c38e6360722083391656ddb66890ee3216655d694782bee13b92fe0e82b1a71ca5da5a14422be5853d6ae20ec2256913dcea68059315a5fd9244389f45d97664f438974aa47918809dbb6083b841fc9511cc1d19f861aed2bed48e4a08ade610d9f9c641d2d56cdb2be1e2116760bc38871904d8820ae1a2a88ffac10bf6493ac0770d5500318ed2639806a2822ef616cc3d856e8e96402d854e80b4158ac68cea23b34e7933846f9041bb665caa798da34d44cb61dd01d21d7af15ba23000fe8ce49e773a97cee15ad5f11e84ecdf53b02dda1f11a9f4b82d6ef0974c7466951a03b37ae9b82d62f0b74c7e6fa6d81eedc3c878ecf7541eb3706bab3e3fad54277be85ee488ec7ce40777a5cbf34d09d1d78f8dc1ab47e6fa03b3dbcfb5c2d3ba61cb47e7ba03b3eae5f1fe8ce8fe300e0737fa03b40ae5f22e84ecef55b04dd092214804582ee0cb9bea08ad62f15cab3592c10fe1532b48c2e329f2a0765c348bd604b284ff6ec53bfa07dea17ed53d740fa5438903e350e319f5a8798cf0df2b9ee68d4d24d013e7920f9eca189f80440119f022032800324f9d4317488e7f33c9fdca78feb136779663e7f98f914c243f3098494ad693e795abf579ece6a59eeca94be8f8402c4f7abe5e930152d584bf5c18090d1064954433b12b99d726d0d6d83828090b0772437413b7e8fe42c6817544a3e0878cb2aa2080ae229a889cf23a1fc6c2b790b97b13c63b00e02ce673258a7fa62610bbd2140ea337169fe4c17b840802c5c17cf2f9aeff73c521587666667672f20e49bf9eeccceb11baa2589bf76db893172535c2b05182024f74a6d0248284fac3061c23410ff29b5cf99cad341009566cef27410c031181c67697e7356dca7cf23a55cedc34191526a20fe73b5cf698edc009f31f2217e49283f5ba35ee405f021c00b908023712cc846c36370c73333349f913cc41d9f86e32d6c824d01ccd75931180939b791788d865ac002e40acd1861040f038e58c0319e05f0f02471441247d8d050a3d1afebba2e39e2790d0dc5f3ec88236e43431d71c40c11436c61008f11355936b3808b46432d80cbd9661630737136488c308243a24633624801354824e03dcc42601df5e1d368481220219004973e009644ae18970e023e2f2392fce2e6010e508223921c91e4089053108000ee8baba4a1aeebbb7bc91fd8446e6394e4ab25b94ef324a7a1a19224d99aa09951a28b11a30388c1a724442e190d75002e674bf21ece7e6027e16c90f048810790b069e8200839802d2d44114420318044c91583bb92168fad9604f6c5cd48d59d203e4384e7340f42aae21059ad48aa79b8795d88540b413343f3eb7a4b5501d070fa458c31eedc8676247ee6f1da3b3b5cce1677628cdc4f14faa5a5fa54527d8090db0ba7d891aa1decb589249acfcc68a86b478e6ab08aa6003ac06ab220dbce6b34d425da297aa46a775dd7199e1d9e191ad1aa2152a30d19b2232f1a1a2a72bb846d77a4554343cd7c8fcd48a81a0f3753cdf3ddc227225b66b29eb9b24ef5b9f5cccc0c37e3312272b754d9887cae1091f7f0cc8338cdcc774e732164dc629b79109c109fb9a1a1628c27f2928622f2208e6d904d883f2dc9cc778eedd0cc5c5b88d7682821b89c6d468899989919aec70ecdb9e3ef7ce690e6331f808c5b6cd777b8204ef31ec66824e46ee6ba76109fd15041042157e36838c8dd0cd771c7ef88f0bc87b11ad925b95b31f8e4a4b4425b664857bc4497a8c4536ac81d4f0d2d27a77764b562b0896f432bc21db915621208edc87863c34a3725ad54da9110874c76a3e686b66d3bf23510518ade47d3c56947ae5e51b623b9819852dd8afb54dc177b9a5ffb995f349cc699f73036239726ae8d7664b98c83dc5d36da75edc86d20a4f68d96e49551062ca8e899ab9bb9d18ec0de1ca28be633341aeaa2c16030185050362a1bf04112cd4c3ccd8c0d0d7565b13cbc4579b3903c644a6f98232a6484a7429b03b28e5c2568c73fc94d82e2f0052017098ac31722570cc5e10780ab68fe0f4274903a343f870ecd077246f30100a6f9387068fe8f3734df871b9aef831a9a6ffad2fc2e0dcdef010dcde7810ccddf610ccdefe1a5f93cc4d07cee0bcd975e68fea52ace8e2ecdd75146f373644115c7e60acdc72155bb1b8a63430adbd170c2184d68fe0eed88109bbd4bce545f570d2544f3b9694954a81fb7338fa791aa38339c867a42f40a6171e67a33d7c2dea42e10f8b956683e6641ae0254704206145388420a4fa20065280a147e9e6001274819e3024d9082091858426740034a9822091b40029018ba639dcf5910be6a7411f7e870f4f807397dd48e8c1e8fc5d1b5b1d368288ccbd946985c924644aa47afb423236eafe08e1f978a0eb695da325a68feb65568fe68a1d0fc982f74a10c2c504181cc9d42f3adb84f68be2e90b963409152ea8c5b31b8e3ff5c3d574849c70b3b3cc4b84b2b926a8b9bf1a3548f385da1c70b3592aec70bbed7f0d80c84b7a2c5a9867a53acb8cf17f14f73401446523e118504fec9c582bb2adcf1e756e12e3b409b8296116ac0b4c7845faadda218cc80c068eb6b840d7ea51928ee2e0d3fa521b7d52dd964b7bc8a6b59d5b6659b6b8625465f9f6bc653c2b65020b386e47a0d9f2a082ba85077cb6e69c89dea007e81466022d9756987325e3540349c3c373e83943e05500240c39983e3d387bee9a1e134d97cf2e8bfc627d73759c32dc7674d7387877c92873d6eb4cca74dd3e06613227dc94d02dbc55cb33c5d69797edc2c4fce9747c8f6d8ed366a6c3ca61473d20de935de34de2d0f12fa637988e42c4f8f90e529c002e127b140f85bd7367ec4e49084406e2c4a4ec65ce63be4cc75489ae7903527b23c43f42c0f1105581e233689e5416281f0b71019837901188d49816662e3f0438c469fdc3752894e603b3e0e5901edf837e40f77fc9294823bfe0288c0ce37223b1f09d1b14fee4c876c3c4a1ba72167aa693c093ed9e0e68db6f1192fc2d136b8194fa271f8adf19e47434ea06bc824a22e934a8a43a221b56f50a046d668472a394123b79a263332dba2909157f6d3104ad191aea4083ff50b53c9d02c522e44aeed7a71abaf0644c40991861cd4bd01da147c591930fdb1bdf71ef3e163de2b6058cc1021908fecd0bc0a2169d709acda4faa5aa8ebd825d534854c96fb4ac2b3aaae107af27fb8ab9c9e4db2aeb424d557f255421bfd82d1eba57b18e3dd81ecc102d9c33f2877f9a4cf0c4c370b639b4ac610dc8519238ade4f71f5961fd8cc4344b28c88f29ba9868ab3d94f96d564a566274acaa52c5611be8bf7d24be31376f7e942608b2e2dbae8d82f3989f4053f83d07c9a6a3ea50e8dcf1bbd0b7bb3de9a9d99d3e06a2e1a4e9f0972fa4c934857c766e4f6df7571f3fae8b354da648cbc485a266be44c3576a8a1b0c7f73c4cde68224e8874fc846dc508bb92aa1a7c2f4582d08a1642cddaa5698719374557beaeeb0adaf109a9e8f88455fafa81e3d75577b8cfb5f98437baa71c9f595f73eb7f96fae26676782c8794f98d9cb98da43986435662e0905142f91a83190ec98d7d742c6638aecf1f9cacb994db2f63be4396ae43de380e69750e8981c11dff46623be08e6f23312ddc3d30cfc4b7f179d5b8682c10b679696999d39c674ea31789741c52fb37aab4f692a4d2da1f182fadfd4b6bb7c1cdeb8169ed35383030a8b5d3e066a92f6edeb4c6dbda69606b9fb95abb4cd6da37a93d466a5fadc8d5244e154783565ae366f678cb8ce68f7e3089b7302108c4290b68532491750521b00ab02bcdc7bcd4bc17830d7ac13a979567e2b37ae96981b18366fd62816149d65136ed1fb76d42beb63784850bdff5def70d3d131361d35e226c1580569a49754b0cce127a57b6f76981c12721bcf3ab795c463adf9086da0dc2362d301a8ce6165dd608235d115961a802cf4b3381bffeae2b842dbee7a956247edb0342dc695787cfcb7c5eaeb8c5767d83b0cde7c54b8b3e9f97221817dff38c583ab471506e12691e5d37eb717334d2d128de68be6c3635ff0af234145c0815969a6bb6ec821be1093eee7df0c12644628c5164030c622fc8d88aa9fa54dfd083c1b68fa2f7826df9f33df81edca0c5566c7bf86a5ef33df81eb432f8f91e7c0f5e4fc4a3c5dea7ea537d18dc4b07982a18db6bf2c0acee2e8c70df12b033376fb0ed3158555515abf859555515e56c92c1aaaaaa58557fd5b73a8cd55f055ff58ae3e2be3240f820db1b3da535a8546958aa73594b3ac510a2991949121000b3150030301c128bc5e3811e4a920f1400138fb25854a48aa3208661184521848c51c6800100000000033313060065bb991728e398499d2d3b727fc71d0d2211a6d40ea6bc3b67d956faee810edbdeaae54157907d416501dd9b4504764f0f8fd3fa4ea7a19a4d2c2296e2cfa398ca0ce44fa48fbe23920884183dd142b842cb3598cceac4afaa3d2871ed389969779cf3be2c7cd24fb981298adb4b7c872eefabdd062a9ed8d780d4e4a680ecc2c16bc24e180e6ac3c9016fa8b5ec2585690842aa9f917d923581798c41da67bbc2c96179aa36c131d404e957c8c7ddffc7f14787fea90f34fd7a1c40f2389f867a9c01428756004ed9b58a13d1a2807554698a3921c1c2e7481b77cf4e5c4b2e516546fbc4bb23afd178caaa24b844573673b4e2d52ea9008d95ac049bba4c1883d1f8755c73d0029dc912629b49852fd0b932e7befc11fed9e5e78c6ad8b16428a0f2bb91e3aa01a81bc20ddd9c6fdc87570ba604681e3b931c791658292c14350771649898041685522ef4ba2a5bb14a4711a93551257d04385198b486db9d916686c0276385b3e80eccc60c12a3d68f7af98b07f3ef47d79ad8635b0a3fdc1b31b21735e53577585c9d4e3e5b50133a0165ddfa99c29f1931611ae578eb5834d7120e15271a6c2281e23db645809b4228088fa7a36707f56868668cfb3349eb14458190648d342501770a2814e2157e162d202930ab0c5f75d749233318f3c910781ab4952f01b114b375518a065a0d095ce1dcfcfba460adad9266e657fc17dd602ef3c05841887d9f6b121ff6978046c6b867a1690716a91cb1e172a5979d29706e8b71a712eb2ba95246c172d9dc6267c6f24bcecb350ae39ee1e0e571cce922be5607a662ef4ad67ff13f08864c05f4cb7deaa9628eb8cf036f2d9f5323087bb6421f58fabd4992f9786a3430ffba2f1c48ae171551b015a3c865aeae71d07042b01d0f34a795a229054849914a4449b491266e563b82e38080035129c3d500db171a83420a62f04e8810cb557b7ce9cd93ddbee3d0b6d0921fe1e33183cb22c93d4a2cb661540975ccfb537426127a4aa89628724b0167551e5fed3c462a5d2cc0b9b81d7f8c4ab65477f61d87f489ab58a754efd471ee89ce59e77d582f5d73c43ed112dfff94abb6ef6dcbf104c74abca587e5d731eac813feccf18bdde613c0eedc5d6c027942ccae5fc6ae9cf89624d5ce60cbb04b63ea14a770437a60840db8757dce47e9f4a3498d024088c90df7ea6c5d060b14555e78d60a96572af343a3770494c78b685029388f0814e5e683d7320f22b4632a10eb2b1e8d68aa5358da3803a5e4696b7e06ec776e9b3d9a4f4b85acfd294c0a2abb3fd70ada29dc1d8c583114190119378a40b7512785b8d68e27a5885213b867f1b1c63e2b0d144f65189ab22813fc75a674641c3f25650cb72c7ec7e240d3489f4c026b0522b966a3c5808dfa25ab230f15a315559addecb18a66b28019e099800a19aa857554cfe3adfe672964cd5c20182054480f0c448f04af055be337920ce793490b2bc7ebf4b29bf8eee10f1a0b11d349c6f3289146276322ce5794dda53289e34735d1f3a41c70e768bf9b672cc3dc740a84cd0108b486ec691f4bc87863345ddd124ff901b94d59fba4823ea4c3d61944951b776199d75848a1215631e3f1190ddc78db27f17c8bfa89f4e8b3afd108834f34eb39b2381e66f620037852d5f2789d4f8298d079143727f7406646f23864dd612b902957040c18708cd7f2568dc496081ee58ce7ec77ffd97e2393f0843ca32fc538069b721a44540424f86d95ea531c8bc13b5c3d2c70aafc174b0e5da6982ea6891d3d84d7089686f13646eb659b5465556c4317192423f80b92479dbfc5ad866aa69275c5d86777a3bceca4e478219dfd8b64811312dc871e81099f6d88ec388b652d450a4e428a3c88910bd7721c4cddfd88ea77c6cb8651e869f11616afb8af9dbfc66c6b6a479593c19413890832b5562e0d1d648bb77af105c579369f3e14093adcbdc2194c982e58f15ad7a26f3e1dfa1ce35efb9077e31950bad52b241e1693c6580c31e374300ac794e96ac72174f1086a412813399858b5171a1b87b0157db5e0caff4638678156a399b97d54861ab1be707cb05e372dbcce17f31eb8ec36a6cceebb7abcc418ace6010c8f06c2c4405d6d7347eacc3a58a296e33a8c886d1dd9441b709905c93e18103b1cc218843fd3cf45a5cc31cea7542a317c4a1006e6618f2c7e530fe1a22a270ae8a5fa168dfbb3e06b44581d7c192f577cf85d0a908c6b74d16c1c108fd4d121eba4f7450e40ab84f33ee6a7abc2d220dec479c81d2c624d4932c261e2b75fe58642a290b448e751a61a76808970ea69509a3a80b5eabf518774e29e7b4f67cd569dda4fa6765e2028bc656c17eeaa6c40a95fcea83d877f3c32289cb66b34a7a142ee6b226f3508de8285746fc22a23c40e8ba5bdff08317811db9712a1b3bac7254588535ee30070b9abfbd70812ce8eec8022f9b948caa57319a39c11a3b4b044ad2850131ef704463e04b66d1b72abf86232e6672eaf8ad686040c1f61067f0898dd2395e2fe0a35391a5bc7924411fa90f76765d71980328b942e42af4bb7b167eb14d645c6522421fdd4e881cf7f484e9e54fe219876c369618a4d1108e461f0504366bab0510e5de62cc818afca933241b550dab5b9d37f50adea9f5a2eb87839bffb9c826a9c24a4a3ae4cf713af93bfbc6a03dc5d0a1c44605a14d2604f2f31c42a1f263aa94ac04fa0eb2021fe0f62750125002d8b6324bb989378fa30323c3de561a026218bc4582a5313d914dc8b9f42b3d75e63d851a7aa2f9312a3b611f2b7311e524807daa5260188f082ad47c31507764311ff4320167252a7941281fe48c31a716db85ee6267ba2731bd29865d6f557de809a6b96e643af7d1b8a815a4de2be2e0bf130e400f8162327e856a028aa8f695de0ec88d9b0666d5c3c8abe1a0309a652ff4740462d3fd3192434fe22f7b9acd87346b52c8f290935fc37a86a2d5f78253dc13588f815b60b2bdc735676c46db69067cc271cb7d85621a4992d71958b8ab8c7b2d1e74fc3237e81be8440146a6c66389da2fddecc6051c86a2a1fb9f18d64c8a1d9eda1951e14859283c8bf2b61cb41829f5d4ab0af9183017010494f24966ded425f0b462c84acaccaef23a505b014ac34821cee7066c916d14e8a1db67308cf2a889a993b11e3e1864edea217dadd02ad1102e72777994b8409bd6f0fb0b761a0fc11a2d44d8761dabfbf9a7f0b91cff8d27e0e3a3f485496ed27b4208815e136c54af6d920f1bc7e7917111d2037c102d88379dc3516642230ebb46d270dcc253ea09bfa5f6341793f0f65ff4de394d874696f2c91492cb8a484901c05fe47caa2c59ae40febb500a4da04ec68d85ea6a3860a678da1ff54392965e9ace8ed39c92cb9d9c619d9c8a49d41d3728f236d252e13b46f40a3524ff8aee26459198d1169bdf69abd008f8d48d7928d1b6ccd71e8780311bdbbdb5df2a7a4a47285c4b3bf94f0f4718e3050bad9908ab29099f733d1b80ad965cd6b7ba12a2869da31343ad78d022df6eae5c9180b7b6e95b8f3c0050a63eaf1f95051ac67fc894c31303ad988c855b01cdb184053451c8c7acd0e53983de25935d219d2a59956adc9a46b0ca7743f5a009c00de8134f8b497fc08ce96b1ef371b5f4bd8981e7dc3e425232b7a19353a9e07f9162bab37b617a85b2ff59af4613037cd3d8142b3172660f69c74f573a8f726a53b350a163b14911e02085cb30ddd5a154b63e643792c223267bcfff623cd251c0cc6da86168681f20cb8c36e277a0762205ba00e73d86169dfe3113861805518c6d6e3188e826b20d2e55d04ef0a8368c1b78ca1c35e925edeadca4b1369cd87737d8cb471590a3b16b2b3b68246c282dd580d7be1aa12fbbb7d8591bfe85657ae093b75f52c2109af0a30046365f283356d76f315473d58e26dab1fd02b0992dccb17f6a2fb91d6adce3dcf2832c7e8e4a387841d24fd360a62adfc7aca757d3c9481bc9e86c0819c6457b8283ad84ab2cfabda4944d32fff765d4da7b7b75254f97b944d15c2d96e414208f2f2327cc5e8b27d835d31496568c8a02145ed70429f93e96e9d4e9b5d1de789d6a086dd53a6910e0f0946c8c00c0ccae278f35713f329ce82b8921595cdd32205d7da69864923b58bdd04b51382a0d91aeb364e6f52700dcefde13a0d75832c5635ab63d8ddc0bb6ebd52acbb111d1f9e6036c0eb704ac62bb03b22cef830d2b0a399052a76b52153edb766ea75993a65647e46ce063735724eedd9e2545861f008206d12ea75058d9553e466f06e9504fca6348340032065b3c1c599085d7c7d8d3479d1ac47c6ad5797cf2f02279ccc62d9cfc83848b03d1fb0bb4e08f430201735d231281418e62960fba411f748ec0d9dec589c4519550595ca46b107ccf158d947e024578d4b3dcb5cd58e7bc85a8e4b12426607d052be40ebd9e5f2c75c70b040645a585a488912468044b0ce56b54e8f1d53882a99ec306f5dd9107fe312857c4fa73e10ab3d194b94e81d63698da3191057500f2b08c636929e78653cfede8b35b724b9a902ac402c8c64f65efa34d4e4ac33f2c0485932d21f2f215d232b0720d0ad4821a014eb72763818b57d4d5d596e304eacee82181790b79f739951b0945a0677e2b1959262cdf6382ea4fe3b0958dcda712a38d6f519bf8663a9a09985c0f2e46c92c63a8128c43edbe25f65fe1a0afc458939c3f90586b9c9d13289df1f163f4ad56295887ffc8f30612273da2126cea28f020f933976149de9488d19054b0e543a61a560b4a64a4919ac302fa8376c3fb19e5fa937be08f9cc10c6cd0cd0e1ccd7d97b9327b7664f00acfa04316c393a7ddcd1ecacea8df194302aa60ea0aa45c860a2f4c1800c8d85d7f19257704838183690cc5720f18391a4a861fed642808080c1faf82de164d713420a544010028aab3c624a0655ce2804f2549b67bbd193de410c6412e0d82aea13b04fd4fc80173bfc1e08b4d137ed21a47fabb6a15392a6afc4b6d83d01762e2d7ddf157202e423797a4c0896d4769c4c26a43813a49220e36a0608bc0ae886aaa5016a8f8e00c72a67f791fae4f252f15d3e834462de10f98ed4ddf8f6e11576d10712092c9b793aff7a17d8953b9af8ccd12c953922545870e40ae5d3c1c8acf618419068e597251d9bdb8e9a015eb3bf3b694e861db8dc8a3c7c805f63b2e90262d5f5a9fd3c88b68bfac361b0bd146e371630d89e4905386b1147f15b1c45a98827809ef468925cdb248dcead10e8b8a0242ac7903e94467403337e9976a9715719989780633ec2b9f60ebd504c1f59c061a61f2bd24cdc2be2fef371e4da71c30e88c77111a5a3a6c3b52204f14eb1abc53d1e021322b5d1b744febe3b301bb89ab33e2638703dd146f5b48c737a5f24bfe99f2569b1c0c97123dc93c96c9b4410aa160515a7ec79751c653af803e255c16d575ba66b58122f6277327c89236d5d1da93e3bfdb8fc34bcdf6057f8d4e3cb1b8094c34b444c435856ce546aa81f124f948b5b83250173d274568dea7c8ccda9c8f697d3617844f1f94e8a9f980248a969be64091541bd7e735338de3b89babd29e64970315c8e283110df42152565e0705f7debd0922ccab8ba5926b1e0d4b6116860439e081263c497c29c21ccf237d4f3d205b43811bec3809fbcd7c7fc717e82435579bda02e50d1e4701b04b8c17e4eaacd0a1574566eab2d01706f8160cf30add206e99e495d4812433e3ab51e147e6f7001eebdec73f497c60efaf38f88f9144c77b4290f7da6fd7955881f16a36a40fd5707642a79a591bc84b0f1dc94a98009beda412f9c0d436eb8c626cf9663ba7b489e8ab137b22d24a0d94a521df7e6f62c82ab57bdc8616890e64a14cf4198e4a40a09f8fb048cf04eb1c4f5f81e959f741e779607a70b3acc9d8129482544a1d751e52ae72811f016f9fbb16c1517454419b26a3880da22bc8ffda41a22f8bc3a8e30891752e89de0de031611513393d00da6f2f179697443922a8453deb12f0b64f3d21c19682723798f78ec2b7649331101557d862cdfb33964bba9fea70b0c30f70c3f0eef2f71420239ac193953031536fbd792feede60e1395dd7dcaa51036c9ddfb44bc740470d097df20fa417f9a8439486ab4a5c63f207a9e9dc5867c886808584f7b6ed5963009a1296ea8cc0cc85aee0f47a87a8cfd2db0ec433972ffab01c7c502abe488fa4fdcbb5cd685e693044adb7af5d3441bae9504ab20c0ad33757164ec6fb8b057c4c05d6eb7bd55d4ef898a837eddb80c8c774df3a4e319e2d1ac492f668ff2ee19e19fb924ea723ef461e4c606ac2e5c8c12de7ffbb63b8941c26e02a2542a055fae00128a95380b145273d90b8af1fc46e92af8f4a3eaa3e7eb6082129dff988999757e7ee4bd9bfa25d4fa226664bbef86cf8e3a41f5376554822fa7b012ca3a655502d9fbd6c1577712c037051296540da7b7a927ec7435fcb8a9ccae2288bc5c182bd419d01629a55c810454225e37e9707a8eca775e37ea5a86d28fed95989f494e9927c3f433944578458776f71a56e7144e808b0996ce34d7904a764a662c05a29f72f26e00330bd3a4577ad99043df92728d32ae51c61de5b8a21c57947089326e51c615a5b8a3147794718f12ee0de56b2e764998ad38e4921273586e7d19c78d35f5bd4c39a8e415bc85ebd8e14a6740cc7b18478443f59b7a9535be1b2f6fcdee5cde7b63375ea1aa988a4eb23a7b7c9cc729de923d408f267ef7d1fcae94817106423c9cab90277fd90e1e269a476a5abc4e2ef5f25f9944030968082bd4f5ef0df48f50e26c502c140e3d97b5ffd080a3067b2bd18d77b7493357a3d0797dca1d794505534a34b9652148ee3bed5773e77dac63dce9e4abbecae629d324c0f38caffc7e2d77d24874aa41277c152104872c8424cf9decebb66feb50a56c10b961c516fdb845c610a100cd913be2a179a5bac6d2a8666c53023e34a0255496c2580cc890b85e575c15005133ee445118212a42cfaf7396a8b74b6878466c866a68f2e5eb6605312192aab692f9501774a15c17134365751d54aaa32d8af1ef6d70375b337620705de5a360c3c6309eaaec79038d63d8799cba5352a51f483c675911b227291908558cfc61dc29f1fdf63068a20a2348b935d315e7406c2db1c8075b815f9041e971048bad706c50f6b397f183b0ad4d25286d7fe4627625b4b89a790fa729c2a73f6aa5424a94ca6cf1d4ca9b19fdb3f71c915406b2289d9be4c8964e8aaa48a53d7656042702c805d4b4837c85be0b539088afa7b522d114fdfd191a3e80f384d502f961a11f4f1334daa10a6e897b4a656b3e4ae186168849013b54c2baf7980b07777c8fb12c62d53b4b0e6fe49975b5e2db5010fc6cc9de7ed6ab95c5b8157b615aa7fd68933d2956db24d83a6aca62fe0054dd28f3e3c5602943711f6f8ece6b34650280ae07ed5e8b719a665f49c07eeed5b5ee00e0997e1df4410f6d4ceeb2c9267aae409551b583750a63c47df48d45318736cc2a8851eeb8b97ffe6cf8c12a7bcbb2c9ed822311323e8e94e870b43cb0d06283385ad4df15b22f8d7244236678e74cec9d62c081bbcb740ecda9bd0535259f78ca1d7392ebc60dc8e488402452c600a4599d8fe1b62f8337d55126881e69061019957ad9115e32731e9b33343d71fc092240f19ffd5a92ccd063964499bd4dd9b9dde4bf6a5b6bb2ee8966fb3165bc25ea1972df1ee19a9b7580a2cb81e0e9587f5ac703ead802f24fbec03a05e1e1b267a1d691263e628e7a02b40ee8b666f0946481918dfb58c81c9a83233e625c51b0e37f1f2867d63f023d8f9d13e6cc0db355e33a5c1c659c2164352efbe2e297c67118250460defce71e53d62b42204b1c4facd57d44a39736a629a5b53ef567d58fa6dd5940025b131605afc1160dd8605dc92f8f6f5c63ec48ba7e00583680d6a0f67ddc332e82d57c305fa47877d03b1e770b974b22e03ef3761dd7d3def1d6aa537dd6a74757bafe40a48a2a3ceb58b568858d31bdf4d629957b4f72ec548aec5c4c54dc0b726ad2c2ddd4288ee6569ba22983866f2a467b217d9c276ecac86464820237d055bde6e47798219ee7b9eb82e04d9305fbe1a04c6c1aabce463a0176ae0a1a61ecc27da8ec920369412e30f8d40ee5db127d25fbec9271209c121c6d2ec95aa0cc4d1588582a7f222c43705ad810a0b94cd4f850eb176ec67650b381703c4b448f5c6088d1a3eb3106e51e143089c490ccbe28c5df830becde4d9bfd05983d2ec9180cfc65760155c597e1892ad29fd5a8ca716d1a7b05b521f255692829520c5a9d7b9903a3d2581158524251ab85a6ba5af531691c412b873ca4dd21bba7b8a984a62af9b5a493633a41a003350791847c14db12c64a172c2004b61a8eabd6d12161fd4f03913e477b641ab971a45d7442bf796686f5fc398a0620d31cc9a659fad5b70caa7c1e3188bf2e78a6ba71037df2dfb1969f46f44f2ef5aff004759ccb3ee1d10bf15bd5d2b96b0cb513d4b66ba5b20521a071906786c5e5242d50c78912451bf4e1cbbaebb949ac46d67446137441dbae58ee91a02cf9d868a21f8e83589ed4a9571e756666dd32313a7c50e8e043c026f2cd3e7a903cf4ae14dc3d69ae6ba12af80a8a330aa55f5908e3b841be434fd2cb5ea3a8a684450c74d16123f3ba1c182237d806e8a06df764acf5232dfd177302934e04cd2f5ba323b098c4ddf2ea9fe80c0f51c092163c7738e72033935ce5f9fc02fcf5eee0c666241cc856d4bfe13bf33a027036850a7ea941b85495fee5f52efded91f5194df9c61da1090302a84a2a24caafabe61420119b6fff0aa857bb4d323224482d06eae92f9f53c1fce732e6d9b9c85668f0e6f857755eb4682105c4c7b654532a55231c3b7d426d48097518c4bb4f0dfa6aa15479a2ecffb61d84c166110c3edea5dab2c0cf77dcbe978e7268fb5fc1a1c1664cd4fa68d5451d53067bcbc35a0a9c58594a766827dbfe81456a9f0362307c817c4ddda9e466a2bb20eec43c9a5889de84585139f49c431d920d7541113481334e2bb57afecde089ba9e5dc12c9f78e4745ad4c525bc8ae615dcce8190699b1694dd4d3d9975374b79b0f7a02cb311dbbd3122d8e26e8ae1423a62cfc59a606f4a90e83158dc3bd622b2818759539f56b145b36dced4348217338b10e0541dba150fee5a8554d8da63bdd4f34eba2dbe33ff60737e8c71912a3ed8a695d1bb17a26857cf5027206d727030b4c660a42acfe2477a640bc25829367434dfc59db7ada05bb6d698d23b6c9f8e526319aa5e805c93c0bb1085fe225a1e0b0e00027124b87da0a8b289c4af3689f3c9c39f63e3278be2f536517b5c62c867867ebbd9a93d0b536ddc0919e48b4b4325864d16e78a21645c2e006db213066a10e7fac56bb8bf9906eb713e6664c604cda14e89e37a89f5523e24026953839797ebee0877d9b6c99d5b7d10b1a4dd0d15544036fbc561704aff1b0a117ef23f2a2e0afc334e61b7b5c55e5ed8b0e2ce22f3dbd55d627b691449869c10e044f1cf7a0c4b47e50870559b42a3074004f9e7cc4ffa77069437aa8fffc68e49a9a9fce9b2ad92a936076f8828c10ffaf806d29430a51c2a122be948bdebeb3409e2557f598a48bcae857f7a68a7d02bbc4996c6027a32bb755d66057d26eedc450e1c6fec604f69b92eaec4645adeb18c894c37cdadbbf1735bc576f908d313e32a9fd9163c42bfd31f9dd13b452356439590216ee6ca2a4fa114535906f73f9383d0774745bbc2385b5829583042ccb6907af3a89c6804dbf399577d4c0bd1e38f5aebb78c19a3425f3c716886bc9ac436ccb7661b8aba33bf497388d299080ba40a03d0241597006561f70b3c18831c657e810f1d8963f7ad4aac1264ee03621e0a01656a9674ca6b478db4a1268e8a94fe8625432380a3c650ed5eda23c5f64cd43832952a7ce410037859ac39140b05cbc86a3742f258891f8401a741503aa650da9880e1dbf25b341e0d26f8a0b62b839136b5b2862436ed87a9c2fe08cca9d8185a9322eac6eab9348beafdca4bc6dca1814f68fb6a0821f24701d3858cf2dba75d36a23e24522544b2af78c13b75bd14851e52f65de1af68accbc52515437ecb5407b4f377ab34f2a9605158337e11b8c95449199907753a7e15340186a90ecc833b3708d23b93c1c8bbd3809209267a70b82dbb1f500c95028418b3d2f35074cc63acdae9c5f0279fe32736617fc8eaab3bd88b3acc98f0d805e8ad4e874101741b3b4350190b0e1a71ec20dfcc48266f9345930bb4a336501d033933a26537a2cd0ce6107343a2e0b86813add455dc5aa2264b2a03b892f06d50ac82589a74a814aee970308d0f8992f2a0989784f1817f9774c26f1df434ba47ba6982b7632a1f6406232a52742e5cc225f719998b13c6a9aa99198e9d734d508fc194e41be1ef5457e2e3c4875b7c0246636b004bb00ef2d8a85eb5d036e571ccf5947f367dec387a8b1263dceadd3a32a513d1a136c91bc7e26b938bc72d1e5cd59f7ec922fa5fbd5c08916fd831b4c36886bbe35de23f27c59dbc18b54ac732a830828a5917c0381ca484784ca48f1b38bab1bee88cc2004f35722f0a208347ca0b0c776f0e12328ef1c022b6508871b805d87fab0ae80f25a2601204d3afcfcc906d90815e359ebab5779734e750d1f4741a94501a5f5972a35592f74b42e61b7b69526131b58c7692bc31b9f8ab46120cf563b740b4d0eb9c381897b0acd12c0aa32890c156118167d1f45004bd29845d3e5e48ef25ad5b42f43c9e40c31b94c5df87012e20cc82c17034f3dc967e2e91b36e009aee9611ab3b9543f4c3f0af0d6cac9d668eb1adc12a95851a3f857c6cca1008995416cce7ea3c6169cb74e5a11a2607d885843611b01e17d02f8890e6495450829f588909fd4317e8329e204a2c2182fb220e7c58c5d0c9f09235d8d0a2c66458938070d9d4e17ea9062404f524ff079b8416ff48e0bb51149cefebfb61943eb98a62d491762da98a9d0368019d33d0022527b8052a07b01d540e401bf41c400be89c81162839c12d503980eda07200daa0e7009a851dda16c0c76fd558dd399e0ddcc339f5003c03c26b48b3e4776a0a23bb7e173d20e3ba7716b759de20a82e91c4a2964579bf38d0c5c90faa44c16ac38706f1edfc106a11441c533069b6b21415f3f78fbc84b4a0ff88ba00ba9301f27e8490c15940e3314e88987ebc4764e80f5011196152423634a15afd65d1d918bb0118f3e0d8857a686ad0ecee00f88c1d3cc55496ec0a2d5b11c6c35d815a096404ce80f4508e7c5cc83b75169c3364b28a4c8dd269d5b6ba278e48f05fbaab8097e79b905e4422e450d53b9ab1efbaab8808628d96bc6a20c46627f4785aa0217fd0f66435ec3bd0d69347f5b659f93debfa9bf6e12f7d2986000d5b48bcd2d0a8a2bf3f182ef3cf78cd3f48b000a2e1e0641a70f2b365bf91ba856b0104c5bc0d12a450502e32d61dda2e196b7456deab91ee95d3cb96f5dc8f0f882a862e951a87487566db77f0c755118fc3a825d3ee9f502f13375607967ca5b28411edc85a42a8589393e5949464e71f7078ffcdf4d73b71a342bbfb7a983c4cb4f8036e22db2c600874365d9ac0a50441d472266cceb8b9053b50cefaa9a0ddafc8074445a68d7e125a47dd44480b267c2811a7b3eb4642e49dede0d48a085573bfa19a42f3fefad39329a4de577db2e45bc07e8743daa1f930a0d4cc1805d9eb0f52c770a085aaed8d212bd902319cd23d31030c5425510dc0ff0fd5e8b53682b30ae9684c940cc4409cfb60dcf655bd71c50eb7a1f5e078150eb8e0641e3ad6c1b2dc7663f99bc2e3283937fb18e7604c8b142c7fc650078a2b7a424597a3930553ccb839a17964729194beca248dd28091605ca81becca0f180fa0bfa300fecca27894a2abb0360f5489ac8981fd58236519efc0f8b4ccdb0f797c6bdaed62ca9641776d5bf55f7c435abb4fa7b4f58acd9ed974a116e375cacbcf24ab09f39a7dcc8f5724e4c838de80367330347b34e44ee3bc7a5971a7f706574f843d4ea9515ec8435c7d80309f73b1e03fb18a9752663c6730d675b0e41cd9978d03a66df0106a157ee3998bf351554681fa2b34500bf06fccd43b0afdf403081045b50e91cfba553974643fc1a6750b3e0164f9d30704454a6de873d0212966d3b15424cbb29f048698b22944c7cdd081ebb79114df17433e6592063167f9647d88a3dc7ce84daa3e509467426cc87210260cb4b953ab90364b1cbb0d5c29ae05f4f4ee25530f8113125acf62b3714b419e119535ea5cbe295847d04dc9c86d40e8a10de4634e2d01dc0fb00ae20a5a20a5066f94f9e6ce89117ca3269acda93e1ee99986e4c352303e60c56960abfaf9821faae776d7fa6fae5881cbde9e7b19ac709fb1290ce3bfb0bab98caa302d4732363920600f918bba1838117e5bada92e422adc2cd30494086e0f38c5a13b7fb19fb1672cd6a16b0ed227cb11f1e1683046509f0b47fcf783e436b77d0bdbe1e6550a5fa55aba481903b706ee45ddf452aa56970951e32a3661d412c0c6b536af17d6b071c7c04feb0f16136a97ee32ed1b79b4755fc371ef6d9dd7beb7778f74ce4db8c2cb6520771d4d71dc32d0133f886d64c4f502140965ce0fd634c6a75af68d1c8698618c8d83e20ceef8fe92e8bfc3987067370ef0a2056e25bd096375f465258b958b414ee95d694244770fb094366f1f9cac0e0450e0e499f4d86f5744da03693d427c75b2cd30b21d4e31f0033144603c9c6000c4586f9e53fb6d88ce80be96b560a3d64038f9e3d22c4d4522e226313f2927c2e6cd3407a154af5c0176362585266b09588bd9c8cb45570db6b1914b514558d2dd8aa143a9c8a3e5739ac130d6835c0c1c839203436832d0c20ce4e7c050336618c8a70cd64dab1a1caa9c8a9b3f930c86713d72766b1c3384b30de9f8c0c00de5a23a26fd00baa800cc2dcc8f2cb30d180a209e9136431d72f8a82d5729d5646e104c52b00c0e081051182c0708106898d7acce7aaced9f3e16dc7c3cc4406db084dc4a6405f5777261008043e9a613eb2435dec2e45588fb60c3303615b73266dcd58174c7c760fe6fb24a0a3872fd462253e8a0bd09a0590fd831edd1ec1c6a685a7a81da1f4237d47ad387d5b31218e76d3e5e1ff4041d64ef034894deff1913f7f46e70448d27c0b8498884f2ce5350469ad7ceb3de07b0334e9d87e96219be763ddd48e8675a8e5fbce4f76f44b8ec1a1c48524dbbe3f43e83fe6428fb993c0d2505f3e49f455b08e5eb5fa1e26cdebe8488ac47ea106bac1eb0c378d018e2505e09e4c999861108bfc86a5f9dcf2127adb84c2f806405b71b3961d5c57b010856f8de98935630f4485e34c7760651998ff795f4609f87899ff68f00ba4ba700f7a6e5a1cee815c96de60b29a0801c43bef5840000165e208415586838bb07d4e60a4d7b2b7266468321dc606a98e19300f6720ee99d02f4b416b4a0ec79ea0c9415cc908b8353cc118e2812c53bd7cd60663c80ec0c93306c2d813846c4c369d2f1caf678cec6e8871b4ab9265e45ba4026a745dc009b23a91047b33182edce4acf9be9cfaa0bf4de7d2b38dca49f15987a860bb46dfb2c374ed6ecefa382757ebb0cd35dbd35c4674be4fa11b1084f671da4cd0f3a94511e0d9fa7409ce668690fff609597449fc50f198850b5f7af17ce931cc7fdfa551316a3d1fc89640036b901396019b394fb3211af02b6014500fba21019f812f5c30933fc998aaec43dc3d43fd284b0fd5dc091ad5bbd68ef7d6a25b79bb6b282a947270d808bab6a3ff60046b76bdf39d844aadd0aafb94100564651dfd720fae8bd68967fc19ddfa971c10f7de78fd9b8b0c58e0d92153e02e5b59d3118200c26068356df2875595c7275d9b21c2ab313aed2eba0ce91a1bf1204408823aa2f20089439b47f6d010a37fc85914a3201c6261e4891d49dc8944c03afb685ec9c0010c3d1102e80e550480ec411a4c46c73e4857ae2ae37f6d22a8c5e45391a3b8a11a0d414eccdb1425b8e65f9929c894936e5c81a51cc10f9c0d047cc62329570902f09db4f188715e7fc6013efa7c7124b2357b5496182f869a6e30a7e4483176da9a7964da1b47ca5ff7340884431b71f4d6e7c2e240eddeb938812f5a55d418ded010ab0cda006b3f895024c5251f674300e7c6805736fa689785355eae3ad8885ad466736f3e88f581f638bf8444f0017d60e7c1f56b5f0ee255abaa80d05b854c10d8ea25bf02d5adfd9f66528f14ba4e8291c3e86bfa2f83e0b8d576543c59a39a69ea50f02278f156acdce68908aa0c6dcd9c9840b40d77f11af46d935b0e3978f90fc1e93c73333c9247ba61352aff1167206ab980b6a40c35c6808b9ea858eee98295d11237132d24196908d1e29ddeb4f3a5cc464ff7dd93f96e00b325cade3fff17244677258df7998b4017400332ba19af221287e8804d2e05705b564d0675f9e3f5cc7803f77fc626be087727f79b18cbb5a6dda169e39cc0b1cc34276a182369d86a0e1b87da41152879a28abd8464e67a722ec5c654d103ad9838b50058ca8e9016d3673a4db0fadf82c4e0223fdd908689f61d4c0d39ea32887a023fb64ed906cc304b1aa6d382df0154036c4869a8437b0dd724630f46d4e858c039c7bd5b83b12c805f62bb5fd1b2ad7335131ebebebc65e191ac5dc061b7438a90c2b621f7b6f3eb1ba42a347ac88a53096d07e0caaef4498f0d2fd144facf6c1e342972d51a1c173f1412656fc361b26973acf2d552061c57cdcf3eeca06535811526cc8a8aa56472b4920dc16aacdfb0ed59953660916881551e47e908c29273cfb41773f0107dad1f6ffa954f26f1fbb1f20673a1bf48ed413daa777ac108c941827e891ec4ea4d9d35790f05e1bf5c36611ff02e550b0d432cdd82b996a6e4f48136df082c1d144f66245309cdae4500d5e24b0013e27582fb4c6810032774bb086e9ddedfbe904825a834618a199808cf6af23a34976c821716c1c072e003460625eca08a2163a3ac924c11aea321e0d21062c1f0f36881a0d6328edf2cb4afc7ab34625190f0f465ddbc889a4ca7b57195da54f0679f9a1129e18adc3c955a7f94675a2e29acb5a0a201fd94faa7c188fa5c4f6261e21b0a4cae95bd51da498f385f8291df29a70cfc20eb2057e338061054d9c5c28013d76c6db4ab8248b1f20f11155ea97db3a4b40b097cad2e515e809ae57df203aba26b1cca3464c2f376a419cb834be15216bab89f121c08eea56ba5308919c9208b652dd16e5ee38a3baaf4d711c7b81426e4e6242aa88593ff8afdabfcfcc861538e0d1716d9fa2e6b1211e54e865d728d13808b4ceaaf3ae3ad204402b835bd35759a09a30b6e0c46b5f27c9ce90cc3d4e617f472ba39619e4bc013ca578903ea037e94c5b5e2b4a0fb0739864a1f9c0b42860b16bb21075533a8ddf0c2c7a2a69650e7635a5ebf66c39de9877cdb43940874ebcd0404c0d2c44661c92618c210488574182ddcaf32c1f203a3783fd2c5832517f3c683b4552404eb5792097cee8c1a397da9c3c444f84f43b34772da7d4fbe972f8531a13c97fe8e6520541a382c7d1a00beac6827382905b131b35919fa237a5def27ac8cad4d453cb14bce97f5306784f858994eb01882b0f84671068a706b682a77a43a027b99cefea7262406ec07e40d822423fd25519cd132d6a89bfdba17dc3e0eceee9c0deae028501c11076dd06e039f9e10c461f1e4613736ac269d6da2a1c629306016b7a6353d0075819424c02aec0cbd40b30ca5a583ddf2ac0aca4564af1eb34fec80ad6358b4186e31f6f40d356d971d6c3bb2052ebd6f30f3c48a6a7a11dd7355f30a22c642c5381445d8ac02baffc01c0311d95389041594a1ea8c1cb84096aaa18b7442fe806804743ad9139a7929a2dae2b8da89e4749ef43060b019e109ab672bfd6137547ffd235f828ea2bbcb5c7e747e03598e2fb4cc1764c12964edaf4e089757688da0c308cdf1f7e67d5a9789ccbe7951f8dce9538251ed421065de1340c5f6b0322bbf3585d305a52c27ed14111105e4663b1e4c6b688ae0600371a2b0956825b9a144c06c000b8359f3a34936d232cd38e5904411fefb73e65cc9f5451652df6ff1caeb8d1f1a6968f88f5be30811c3e63ccd064a041b4f72f0846245d940aa36b2cc467d8fe169d1ec5b98c7e98eb9fa63c33edcd257c917f6ee6c21293e798d1b1114414008e31b00b4ead9a63bf05ed745fdb42a17e08130e1605a68aa1c0b8818e9d827ef067a534a1853cfc284ecf0967ec7bd744806c08e9af0c09b5792461731cf1817373309a1a0ecdeb0905eb1d55f86d586a499701b28fd947f5376247a73c520d98260373643da40b0d1a0646963113c65a1fc6e6d9b0060453413ca51cd5acab7ef3828d82788d9c3373fe68c22bd80141094372a43453fa7d28aa22b4c1a3e34c304188edcb8d51ad5589ac5f2be262bca539c6451c52ba5e33f0b5fd970b7d4c807989efe5245271fd89c93775c930fe8f0c4741dd252857f7c955822314313086aac58ff09ec1ac3d3bb091b214cbb7d7c846c4b24f070803756106f2e4cf5a62d58feb297508367f48fc6c0249d99c553875082fc26680d8754175114492448985a2e1c6f38356b216e88a0219cda048918192f897c818110d7e311c3e9ab1b60a42ea41517d7194493936a627fd29545649bdafeac27f57bc1e1b0e6a0b6942f54033355ca0800d89db382745ad5e342cbff976281a47f1330fa1555d460ed57f1b2589e2c349bfbfb868578a08d449be0a8423f79a93cab85bb1627ab47a3b88f8b8016c27cc9da476eb5d650f07b99d3d16ccaa72fc0edf3d23a867038420808db576029f2ec7131e9dbc0333118f6b6eef5cce4da32dc6aecb20efd325d79d93bd0806b03c363c53c0098adc5648f8a6177c4458b8ce36bb08096c1a7457363837ce5b78f89e39a135ac93a797ef49720381ff5cb9a313cc73bde02214f86e5b766f9782c2bd53abf55480f379d4fe9691f64c7b63eebe2353dbf8c2ff83aae91109e7e6e4f3c292adfc745f66a022959b6ea7195bc329c2d4fafdffb878a5653d194bc62db510c819aa06f491a695deae8892b15b4d8a1a637bf3ffd0d3f88bc09ca9e39ee947f92e617515b1263396b5813b1d771868c641c1d2ae2ae965771819b9b58e003c08d32b05cbf5801066b0889c121e778d902e433848cc721174c3379ce68d0445e761905e707234a848c9425263fcbe51342f125bdfe04d6d0c1824e23c5e4b28835b52c622a65e68863e330eea71fbfbe39cc10f0210303ef5d117a0fb1c837df5bace4b7927d6efc1fa4d6736af440eaba38adef07eacdfc32211e857052327d3cad6e1826556df61cdd42ceaba8614578066bc6afedb18f2b35775ae5fd73c72261d0ea6bdee15f23f0cd98ef560d5ef5a383f39bf0bb42558e3a93a6eed9e189d6fab3f1bc63381a97b0326a97a267aa5159af7fa89c71cc02f3fe2c9fbad93088eadbfed64700383a5379c5494d946d422bd3f5b137c5aa11ca5a87bbf021a188985e0bab7beb182d6ba35d8595852be24a6ab8babccdd0f5498bd1595469d3ce0251691975e237ca4420626a2b6cefc827b8fdf5a7fa011701fbceafa9b61974b1d61c3c24a7faf85556d9aa105125af46dd29431866d1d9cb4fb99aef84fac20fd2ef760a604f8706ebd6b511d99d96040bdd72503d67b04e9e9ff6f54095e3999d8df6f8e8047b6169240ca63b38505fb451e80a64c0387e93fd8c020e0cd2e1c57d1878e0db69c4c0ae339782e6eb20b1d6384581cdd0008a33ca34fe324582459e45e293bdf5b38a981b8799e968f1db6372747a0a828904f0fdae53f05f7d825e863710b426400f7f35c45cc450016384714b9fb2c3197247b84a789de31dbf3d5955dd9b995e13fe0c83f2ca71016101e7780ebc3c5c53c49d56fb0f001a6303ad14ff2a0eafad77bb2ddf1ba1d687403f87926409199bdf539739a6c3cde2eb0070e9d49e8df1a9c8222da1706a87b2bad2b44fe16eda6bab948a68d55ab8ea8dac884779eca7101d01550a4c259f434f05f33322d3ba7768c3b74c6bedaabf6671f78f6677d91dbdab14ae7f2664aa0d11115577793411756bcc9c389c6e3683d673d0f106b74066a2fd5221b85611f80c9996a905aa7078dc80e1069d59e4de875557685416b1b5630c7c63ed2a2326fdb69df781f89ace555970143c1ddb3c8934f88a69eeb53a5e9ad5dd65613c25eb9c333c339074b6ba9d81425f18157b2a75d776f0dbc15c4375d6fcec58b35048edae89aa947e0e16c54b7dac7f90fdecc0e1202f2f02ed65c59459b6d22eb46f20e75c092bcc3eca6350653354af23dfcfdfb41e1b151c1ef70dbf5d14cf2f5a8a7e455531edecba07f4200d5f3dc41985d8248bfdaffc6755878356f127ef79f05b0efc99c0580e36403cb3ae9d0d11726335ee507446638360db58605f685c0a08e8f1c6c8624bfbcef7914b4fd0fd5b5e7c36ad7403d5e1b6116147c3912e9c9207bf500a7475930518d9b4bbb53626c75988e415ea960f45bde656b6ec4073a662ef5f10dc724b3915e378d0e46dbbdc170cc135f8496b32f4630d4b0dc47e2c1e917ea7a6a2adbfa39ce19921218060cee01274b3329b251491765ec65cb5bafa3c47d84078b4ad08b42f0f015bd016572788d12d81e29978e8cac08b697f2867550f39700aadb98ac6019b5e6e377df6084a1c64171a334b2fe37370256cb42689c43bfea864cda75deda6bb8ed2ead5b5bd486cafa8475218983a0ef15521ab863bed35ef838ffefd1b3f723d3e1eb47f22c2c026ac4d03d1e4ab642dd5e3b08e693b4660f15a2af993e82e520ed3e98ef7fe139673cf01d630a366f349f3edf1dbe9cd6814fb1cc201014e2dc323b4b4b89be2de8f5696783b74ae1d5af3c74a7f73c1535290efc8de43e5729d22756a89351ce1f15571eeb680a03a4087a5f03a42780970e4bb37ae44e19e75b21cce9abc9a94154d72b7ebe98215d9d13596d90d705c51dff8c17f5e608e3aa55691d5fac11d537b300633603991bc229a17ae308c120729d3e10734884dca6a1f2e2fa7fa7669892b64e281d84215a33341da235c5a93afef91c6bb6683a6af344ea11259b0ab7cb62ac7aac33b723d302011a46f343b4384a6a78971b42a1f02948d537d7402a9d9edc46157f91e3af6d4ba3e81760ecd4aa2a5daa0058e02835cf8679bd8d03451c2401db677dcfd9884e820af04104ba1406f17d311652e6f209552cd2e950c048bb22e40e851b9574b0306f99a43d52194b789055b2639ee95c459127e61365855b5e95a1fef410c39a3b65ca506ab1fd4356d89e2b2fba02c4040b522d69a38116fde040d4be4451ee2706a68b646a23b42a760a197daa20d55ff8685c18819989ee9f426de42439585f0b2d8e0d7610c7e7cc40bbd6043af65d2563e492f8cdc1e3b3b65e7db04fec43f93a52bb9b94207c397800074a8eab9843c6e837c9c175233ef447b30551307681535d600950503e5e0ae8f63d28fe0f3f908348154240d40d1d881bdebc51dedfdac8705b34fecb8bc0a274dd80f1b43f359bedb63a67abffd9c89485bdef4fd5729b9e2e4d3254f6d3cee21da4ed17d634cabb8309897f5de24f20020462d52cc8ca5d190bbbc5b23438f7f6b5df95c3f9a993b4509848b8cecc69962954e3fbc70510b05fd0405d6e44af80057e398c583d4a74f961f6f5cae1a258062bed40fa96755be012df8dca7642fa9628ed8f0ef27f6936b495852c2872387104e156ae5ca5b67e719b98477d87ae2e5161cae0f24115473b19ae420c871f0f1cc37f633391d4261ddfa329f18f6ff7f0b6edd559e085646dc7ec282f7c6b1f4ae9e3a26578fa90d0073e19cb1671f0a2bd6e5177dd775dd6fbf3f75ed17e7bf4c45f22fcbaf57e46555bf01dbac41837a1229e1879e093975dab685e57c288d57ce09d10a17b0165e6dbc962bd62ea2d05ad1c85505320526b513dc0169146458dd1fb62ca82dab67bca7c0e78f0b038289e63a22dc14a5127800a4132c7fe65114460885f963a1e1b899ae1e53e47ceccb4b092a59cbb992ac8fe57e40f367212b7e1307c9179050a5f78ba0cf689b1d5559add8f09848481208858602e1a334759f2050b7aa4122245f454b22734e90b6f11e7930c799cd236ad0192b93820124d0044798a590e71c453d4cb09164da4600cd1a44b516c2a5c579e3cccba56a5162e2717eae0b6701986a50f6b8e8f8f6c2920dd73b64f13b93c2fef15f3b6b396221e5feb2c2b88589708646f7590a420599d8924edbfb63e765c9d35ddc49d04d068f878d86117a4c5199452f2c4d1c02796652b8f5109b2e6401c9d082c2392e5c91e237190f3c3c6e7db7b90f646e1f1cf32d61f0e1dd17be6c4d0c749318341e545cdff6f3f0f71e7c1821d1c784778bcac97e0b6b8c24d54dfcd43caec72a1542928b5dd4d4875b135b1aac4193f8d72c81748d9f09e4fc41285583147038106f6d85c7da888201f495fff8e56e1c398b26b59a9724b9b0d3a8e213859c4a4de93b8a50c6d16ba96bc2a080f5c1e94d2d9da47c9c576b3ac826052cb381a52259826a369be28a52a56c1d45630acc686c88fbdd4b20b79796504b0eea5a7a309ae9e6e5cce415f885818f2f8f4df8003257a7e28aeae2b9e278e4d0924962be5531342a3244551b4fdf33a14ba0b8ac508da15295850936bfc8894be475c1bfd2507f2fae77d14337cf761201e91e2e983337290a876ae1f03b142c19d7b36200cbe08571d295c1b1970673928671d398d3b4e23fe390922ae5f0cef1e0deb90ad23473fceb972d1e25b9ad64783dd106446f91fd364f940ba199673f9fb88f26ad4e59f903db8fc7697e7e437386d6481c3b1b2b0709e9f8f1e01c376cee2d3610f074a07bb7a7c2bd5861472ff3ed9ebf7d23cd397e991ac40c875455197cd144f02f479e52bfd2bb989353d65423e8fba7d2ce4968433a145be0e3ca48349440738f6a214793e04c7c6286e4af01d1b50dd9260c85805b4263f8564c06319aa8442a57a47be63db0b40961e632cb5da5e3946c313fe5e9468c4dac0333574f10987b87bc9a656e8516ae1ddf1310871ede69b58378d4ca4d98ba6a6b59afe007f7f51e60781032130845fba45532fd0f74a9269aed4b9e5bff811b3c52dbaa30140f63646493372ccf5c1243898c24cf6645f644cdc0de1e6f43e63d71c54481e844c0f79fac1f52f010265782521bfc6551d49c597de491a7558e7671c93bf72d147a598cfccaba24246d20552a5adff8162fc93eaaafe42117bad908c21852284b97c1e379ae6f6f5824c02964d6977bf95e25d4bc3f56df0725242992997dbd31d73dee9822fea1aad2a6d4d09d22157822f60e2711c3828f3ea7e9060959f567beb1eeb5ed626beb137b9d6e0714cf2abfec5c655a29060404d28e606beb802a1a73e59c001ac72c803a7419dfe221e735309af1f00d4da367aa1964214b28bb6e3b13a1659cd2a1f1a3c780f1c2f04d174c38a2fa9a044e1ae24c5fef5a95d9c40642d06eda5d9c42476a2a721f6f93866c7535535f70a317403c4025b17e0f52efb7b041764aa2028272f1b36b91f211817c2075b006050b0904672393fe7fa21cfcd1a0f814c1666afa83583166921d37d4a75adafb1d764fab283e5cbe137d505842f3e780282ac2a45a1025289c089e98656e497e56004d0c9ec819f4fe01d4890a17b8e69a9e5eb678a63826060e28396812dceda4d1def5853bb704451584cd8e6fa0fd3eef6379311369cd3180498e686468a3e8e9ed52eaf6f4bf1d2c68b3ed2be67ea5e12a91071a771d42f7565ce5292bbdcd2358f79cd03ffd205bacabfe79379916a4c24e7207a6de80f119614070b7887b4f651b1ec9eb2218f0dc1d7b2a59461f91d3cd1941fb9d49e8bc2a7d011520c78f22c3945d6b0743eec21760504efbbb358a1afaf754ee3035fd64e90f16363b0bdae5b1f6b1f44bd7e3ab5769c5c1442a73599d49ba5a7d825a913237d593c7098a81d9f0559e2434aaaaed98a3a460c06e51144c0a7ae396c57af79a68ea64cb942456c1736253b61552b1a1a8ceafca3b4ed09b648b2d00a9dc9cd03584d6b73b0f41be2a5fbe1413be830cb6ff6c426dfa23bf68b187b9bfb1991b7aa1b34ef43b05e3d020efebca8a0e9a382d298f05d9ae2f59d9b4a2230dd5710c49ce5e2ac0a37b73b006c5b17f03429e81170087e1ed629699907fef3c58ed21c540a2eb97b4d6873498c29214be88de6bed41c699afbd71247280ed16ed9030e99e874e7f7cae9cbe38178796406143e4616aa37897b6d0d0d3907214a5a28c516fda2c82d38278ca35265a661a7c983dedc1d818d1269e27958c24e72066c1a0841e23eb2308a200ae82e846c2b776f88290d58563ebb487f966ab556958fffcc48dcb533ee39d759066f8720eba229e0dc711932937f592b919afa4829471da3ecdbd3c08360d08769d03beb06006e184ab9da3df6065376245fa423f487d55a8359565d25062512851999cecd6d49b9208f8fe5484a0f4fd1e2a163a0eca1d85e0816a52ea501adcc4b68eeef1be0b45b9b5bb8dac1d73f912d53503f5e1421823242bffb879366018b13ee2d4b860862c2c324fc06b71b21f5910b45abb7975354c8e84b82ec583f1490eb38225c911f08917b1c02aec90708c821c71520e40301e49c638257aec91f0c484e3f97a986046ad36cd0b631fd7cb98841a1383f9b13021b004572dc760dca52ce02daf508f146c6364291b62ac9e39321b3558854e765c22ed4b6d40053f4a3d9fb7ac610a1d0b817aee164198c09bf6449eb2e7aaff72aa34d463d7d8e298c6e31857dbc634fa36b9c8eaf4136d7ea6867642b0b72a5b3c3f904fd188f625642904745c2d47171ef7eff4dda2c3e0e94cd1399a9b187b1cf329556c80ee0cf8b49219b258188411d526795ca2770d9c69ae253c3e5fa4150d44b9321cd18d1ba98b37a61ce75405c851c686b5acfed190044188fe177fb68a0f4a1105f6a86d973cdc317efe98d0161c936282c536484f5ae60eddca3ac2b4add6bc1fb62c2f5520f04a2d05ca64f3bb4d328d5a6a85078356a64f44c7ecffd13190a9f06fa971b452a3b44dcadc995214a855b6afe6f4a3d74749d4046bf6304b2caebfa60061769b6b524c094e939faa2c8bfc6b211f7efcb1bc2619fbe418c0fd1edd5ab73ba71efc0e82e536334ccf5e3843757cb784079653b4929375ee23fa7d742b868f4dce35e9ad35f30dc179b00306f3cbe53877370ef5a552fa092ce783c651d4367d36a78246e6daa1aae99dca4de2813374ed76fc09c82b3651df628868dad7ebc21311657e04fb5b53081b921f1d47e3bb1cf9a0a786e7327dda03687702edc73a1cf910f91b5755b6cfffb18bfdba9b602182fe8ddadb0bb4b4c9b644532ea929d8ccf016ebd4f9575cfca56982c01da63e25ec99fb50e788f5d11f8e90a30d47251dbd49095f7e49613bb11af77a14931b2cc81c0f79a86151272f04a610706353015e803ab293004b5fa564940b02fa4588218f72247d3026484ff0e987174d6f0ff5bb6cfc43c0fad47220672b0398852a25068c70b4e968cdff1eadf8c90a2990bface78610cce2bfda7c60bf8cd7125925249caa54d4fc8a118e7c80561cbc5e0b7e1648510f32d500f82605ad6386b9d320791bd54d6d835b4194d464aca7f8c7f3c0a1071344bae198b77b635c561b0f72cc6a57df2949a2043870fe4914280d0cf965d120b103053a4afefb7d6035da0bd3768e50ab115861c49acc2c0da03b03fbff2f7033ccc444af8ebdcfaa5fce942befd8326624b3a9d49900c720f32b71475b914a5fa749060675e0c9b8e249144ce7caf558c2e4858f1ddf90e23fac8c9a1c6c5e20489d9fee712010cc5aa25d5cf9acb512daf5d444fe131d4fa73449f872d6801da95ba491110c749f86692d331f469acb35847252d36ff87d1a0312ea9b529e67c1dc1e1f746c981ccfd6e6871c521045424c681ee4f7dfdbdf5ba83733f4346cb3db9b9817f0d19826d803808feb543744e00af5ab87293c1c8790a874e0207450b00cad445fe6a825fc7591549bf030c4d9759fbefe5a31ae28341236210cbc6fc415fb75fcfc1a983ac3eb8e8f4867364cbb577555f500f3b0b4cdee6bf546071bf120d5b09ea4d8cc4f06696dd6b99fc09a347c1e524fc7d4bed48f1b9b881930faaa223644460d88805be96a693feda803573e48b73c52ded5d2aca1ee7df1d8438ea2616785296f65dc9c2e3f51110a699c169a837f982a2cf90ae2b66ae30c86fc406e60b3bae07bdad852182aae5bcd788b22bfd3ba8a4f3e378e708b22a9fea73bb0dc9905601836015efd45b37950c2e98e550d519800d091fd93df7ca1b1d0b5f235a3e2b582c50208f9ed710c69a0b60c6151602f51fb42ff01ea37a40c666390689ad9fe9f8b963069173da4e9ac634c7ad4e4c8500d01d80eaa16e2ca1b170d1e502f2173a54e57654e3bff882f0d4f478eaa911770fd350f8574d1d70418cac0bcfd89c1e6a1f5282f6cf1fcbc3948287302da164a55319d7fc8bdfb61581fb4b64b3632ca48033d0795d15abdc5e25ef3ce6d0119393840c9064274aea04ad735477f27586e7e101d0bdfe93402eb1b0fb3862af5886fd1154d82ac9c79b7c645ae02a9cb2b480745abb5c30f1c0695ceb394f343cda5f73415bebf33a405d524207931af2192105060099e1a9528b66cedded417b5b0b09ba77cc0598c00f9a5bc6f89599f92a7d021144aa4e14b620f31cf27b2b4e6df5e0b40f0526348b1105a0e4d4372764ae3aa0289233f9b5d3cada0a00b7b694e114aedd135ca97600e05acfbe2cd587c1be40c7a0a6b5f5c78ab08bb8794c3570ba05c6b51f11e6f76f3c2fde2abbbee2fd8b53ea92553a15b02eff57aa824c88711c691a4e13ddd9277b88805111f9a84442773412c48e7f73c195e248c55820eb8ead6e7a80163990254a3ca0516615cb5ffd5729a552a9edddf4d783b7fa854c61082eafaae1c29c7b4ecbac2cfd962cfbc993e0758994a711e1cda9e57d74d3af1215fb2c3a1294dd7228f1a3536cd89205a686e57a5e3ad4137dabc09823862c821cb2176ec5a248aed94af1b0ff5643799b9884786a324636a28a53cc24812c74ff004d9bfe933d8efce240db6480d3eacf9348e1ceb3a5418d1e2eb128cf1fcdf024da754ad2206e63efa6a12988498ec9bb3c61ef547d95597c5de1e51458dc7fb2bb4a31bc76f8883d530cd451046af4e1b6f4f72fa464dc17d61f8586cb70db1d52e233a073080a80ce91897ab4ef41092ab851d9b0b506edc6784462b615c1ed9944bd3e7e94207c35b4237e0a7c559870156eaea883a7a69f6dfe8250c16ade65c881988a82ddc3581efe499490a6a1852ca39d7ea627284acecf269107ea4b9a4d99353639ce340b37518ec7c8de466095bf27d28d495f96e8d43eea81f7c6b7ff1e59de383fa5033dfb0e13e9daafa0c239bf2b0a990297120c964227dd9a48d3bfd336393c7d67fd23e07591b401472f69fc135c2107661886f538c23d03c406cd0f8d7b74bad837eec258937d2d1df7e75275390e4f3c5534904425e9e7e42216a292a258580d76f344a9a14f2d260d66af3068dbd4a2ffe48f842f584b6af8481d5270146299e1104fd0a9046fab0a890c243c98fa475c5a9af986ff2ed2aad54994ea2bad91460b86a5fb0bcf57f03376b9148e30cc2812c3c0cf4cb6278e9526cebd6f8ce272fa556ef41ca31736b430cd0cd0a086851c950f0704462ea9252cee7ec461b3f7c903e15f9b11a0d21e73cab8d5950781db9cde759be626584ae6669fb9c1ae50801f75bef8e6d647d5d81f10a893932c17a1785f8148f28ca60a0537d3de9f136cde7e0731e86a0e9d5d2c22c4381172a061fd70700f047018daddf377f56d91ecf35c6636785744ccd690ed0423675c15204fd7a1ab2f95a018c06e6584cf140fb413142ec25c085558a09dd44d808bc98cbaef6d6c37175294ca7cf35b3970bd9322a2275231d85af2f162c8cebc50af03b4c4bb35bcdbf544173a5d99730b1211653cb3b34c1fa6c834ac1a91e93e98c69d8d3bad9a35a91d5937a7f4e2ca0800de8db95d87b9f99e20b32998f67f00fd275fb3b91f5b58487fc6ada34e1c248e92bbd4a3ea79c2334105391efe1e8e735f1d450c914ae4b0ecdb94945a2da9f3d9f703586c784670fd7a3d6f2ee8db0b3f5069a5f1c690652e8206e055189d72bd1db938ef642690a981fdd3d05808c4753df061ac1a3ed9908669502b9f2250452d3d95ef451ac95961ff3d0e1778ed00de0cc0a5989e2413e09e5b65ce851a9de52b04f043dc126203a38349dc742ed6b6069ee920765ce2eff0c192d2b7f222531ca151e8d8f46f20b565f21fa3b93c09cbf50c91c95ab37c700374552650e9daefa49b25ed6269fd58d574757c3829ab17fae9eeb03f6accb92a9694896ee3d30667d5977f717cbfc8e311f1fb9b266e31249a5ed04beedc3ebda84023f6414a5a0f61a8108e2b7bbdff0632aa1ae1f87b6e4281d8aea43d6dbf2dabae48ed23eb276390b4c357c0088a8a083a0f88770c4f1c24e67f517d331976ecbbbcc5e02bebed89b99af27762e84eaa063ba278d3ba04cce7a2305191059cf1dfb0b5bc6b5f72e4c7dd04faa2f768ea9fb5db91794512156f1c56c99441478562dcf6e89626e104e00e833e67ac1fbde0709953d2eb7a88e4e87adc26b69c6ace7995f9ee45def76ebb9a2c2a5d53ae2d86a7edb476d42c5535d3b2fc6df7ea81ee34ba65a41bbf75cbe30e67416c250f63b590198d587a73ef069b32d094fd538fb26252326f7872e93895f91b754f6f3cea987db5918ba8963505d2bcc2eec4ce703927480c28583b035c747a71985f7cb8f333396b62f2cd8d0f773fc9370ae874fe573f986a0ddd765c505e0ce46acda4541fd7bff91a37c60689fc1ef59cd0713d04014c88173318d2dd339a24f645daaea7135a40be55d9e66701b59bf7a60741e0de8bfb5e0026be6c03e64d75b3392b0ede5a095b89bf28a6d15e71ae459fbfc11417987e7837b5d4a8e25996d14159c5a79f1c175e2b15c7297ad4c82c8a264dda8ab8a280d8049ceb4311339f487b00859d694fdb1c62b42e44fb784878659fcbae5dc855cac3a26c53d1d1b73326178137f62743c772a6b77c24fc36f3722278d35c192fb8e4ea2c2bd6602f4ce94e0aac712c4429453d83d834ac379c4e6d9524d78b5a8be11a3705820649b401e85d663ef7ab569445e09fa6f5dcc118ba15061f861b9edb648338c890a656ea00d903cab16622cb8d9745b31045ba6a0c9dd9650df32c16a9a0037fdfbfda94af93272a8e7da56f02db3dc039d8a8e92714b565c7338b43f6c388cc8eb34a922026855c0eb18b0014eb349b0460c8e505f513da08961a9af7388a9dea704feffd40792b40156f0d396479f8767f92e7e0bbbdf4ffd187981b30d5a8fce1a39a32b32a4edbaeb70bea11464e5e589d3828924dad2d6865c336e3987e1b2d36ea152641b11c8137b96caf51d6cb75a6760d93d95f0d728e27f31109a51b84070dff0646ffa1a1aadd0649853133dfbe2aac531babc4cd1f6c628cd64b7b3165e16055e2aa136a9034dcf07798f968b490d1abddbc4d294b5e8104add3a434acb7d02d26fcf4aca660774ada9c15c51af488c1ef8530245a3f4459958b757ccb9b0b0ce6560dde14794cbbf7a24656adfd4dc3889975d5d5da3a0e0031ee14938832816c6488ff1107a20fb1007649ffb993c4bb831626cda32ebea48a0f17afbe5a26fbf3f0dfe0d93ef2da47746ef6b9eb38b6cddfc6608de4e121b2c44460b04b45964b5b0fff32935d93503137b7cb3a9363ce07386df618e697b8c441beb0bf169b9295cf15f897504799e208bd36a73742dcee3b0e0689813d788489f776929961070925bcbf0b3fe686ccb78d8422e02af96bc04f86b5c2bee6e934341129fe37011a2f117a926fb10aa94e9b9b288488ff2137006eac63771dfb013f899e710df16d39e282fc097af2248897503b794ff899d42da54e316a1f23c9bb2e532db0b78a1d91f49282ae0b20430e9d1ed5c3dd92ab0bfc901142d0f73470756c399311c5f513ecab89068ca1499c2451a404f9c59b07d12ed9876ee40cad3198f654118c98149da3cabfbd4d8246203e7946565bb42fad2bc6c73cd60c0869db914896315b2f3558a6a463aff1e8098bef8847be92d25e39d456946a28643e842074c9a98730489e42a616d51179c859be4432d2311d0880f2cc7783aba72d1385f8a28196e4ce6ad6456d788e23794ef147de1bee553ca447b5c6695f20910b77a336c9bd1b6aa0479608bde278edbf6f6608cb260f1c2db2ff0debca26ada8cff8320326ed0f6cb8e78fb964ba6725e99e23a08f4243fd994e4b55eb5a9fff66fefd58e1890f9710deaab1de98759f855fae90ab5e1b9787e3b91e1d8032206d6aa2e900518ac9752dfa6977b20c7ed5ffef52f71fc355ef7069ad036fcd3047df06d39abeff32fa7a76a228c7ae48728bcd382644e440668ffc7dc311c7ff16bd435668765b187873499bef676dc0e11f46b3f842c8c27ab990975431c124094bc98b5a7adc4f0e71bcf45355e468d9d3a6cd0d9cef11b66695d949490b7eced49290632b4b0b20f566955c44ea56d5c68c235b003f4b9bdf343c9940695fa0b2e0853c773628fc80bc07ee19951a65c4242a99388f1037ca9d8c03f5061ac98df132884798394afd81f4fd7cc46aea9b0dae27c42e3126b4ab4441e66fcb14616bf726fea9a512f8920e2ecacc9847dfe038e8538271ea3a4a0a3d156d609a6dd1fcdca6627991dfcf1fcee08b212d4de359a2b88287f9b9fd9556dcdf6a746da8b7de528e504bbc98f53b8eba64d60ceafea180641ec07000e06c70ed377b380211b88e0d5160b6dc05ad33cf9d6207d43205eef904800f5010805525e9b0aafafb8bf671575dd1a82239c89284957741803000d5a11dc66eab474f5003e3eaffb9ef9c7bdf3757581c6b01bd26d8b876ae655e54f7f268b7a68eb68d91b44608698490bdf7967b07e70f500fbb0fb2f34143c4ca5fce40057e398d0f13a68f76ce0e084fe723fee538f2079a533bbb1f1aa6c941f09caac376d19039ec17f699c36ed58561fdccdc9cb9bcf9c369be1d763af4eed0fce5ddfd58f9cb63e783e62f6f9b83d0d80afb9ba734347687fee5db163b20a9cf3c76dfa7ad6f4be3e620b89ffa6c8ffa79199b23ae7752fb721a7a65fe729c9e91b18ddbe6202afcf296d4617f3229faf24de6e6202adc2f97e63476e52d361381b7ff607310bc45114d2c531311af7cdb9acb41707cb483d79d95c0797b10155e79ec8e8878e5b0fba1c22bc769189655c4e28265c4da82a584b58485056be8875bb110c3b0415408d99c288ef447b528b07c9026266619117f77faf3ac2222ae8fb85e96113c389e67675e5a076fc84ca247daf6cae3cd59d6b4870e1ecbc73c8bb5051746ac21d6122cfa8be7c12b2abc621bc74e276aa1881e6957bc1d50e1b86223deb6c37e6d975ce4543957b07cc4b3b429a81062693e1f9878e7474382e579b016bc983345b793ec8976a46d5c7294cd3c18f5d8e9a01eb70d62a2202861d805864441980207210a798465b479a652ffb113df7606d981e77ccae9dbfaf0697d78f4618bb63fe79c94f69dfdd5ca6221116a57ea661e1ce3593ff3fd2c49be542ec6aee7991e6de06d47712c24ed821bd00c0c89e2a004b37ee491cd4be094686d11fb19670dc9d71114a02ecc9b25245f3197672d912f95cbabbec5d8ce9961614e14f2b2e7c4cb29a48e33ec3dccfd762d2b01f7333ee39660c6ef614e8c85395be454ec8cc7d89833845f3a03c49c19960534072fe631274fa09c420242c951b1f7b05342c6ef713ae6c08e0131bfb7c8275bf231492e87189be35a959c1887b8046fe6ac1fa8a34a0fc80b6a78993f8085a0669eb3a47a593f398594428af5f56cf0ea0d2297b26c03de77996fcd4d16114b07ac2a22bd39cbe6ed9b572bb9244f415e9c1e9ef9341ebbf82ca95d4d3a53922feca6580b73da7affec9089656c6629193267ec90f862338b08cbd3b039e5129998bbf769b387bdcbb02c9cfee48b508244dd42858e91bbb45c4a8a05f0660a41015d4fc49b394f105df30b78e301e501bae252bcc992620d1ea00e2129a6097eb0bc4c969435c99492583fac200f48cb9af4b6716d218e6ef072963485aac040c0f242780670b270c0ea8115ac1d7840916503cc06a883250348136f5848628d3c10eb06587a40304580817921c2cb4b8c21c488e132e4e2c212028b0523083060b45cd1d2b2b262b56201020bcbca0f565654aa50515109a954a924a9548a0f5252507a8082e251e179281ea050a71d9c4e9d0eba8e0be2b82d07db66c281c9a4dd40d3b229b20cb30186d51ad44a698069cf3903a8434a2903a8a3bb6300754424508794b129261cb7249fd470d138ad6dc55d5b1adb4ebcd9f0668b659902a491df326e767d53488fa7a0d847597644a10b00ae677a230e2090d07be379c63925eb870534e73ca1b07e58403180a0a6cd18a96001ed604d81e5916212bc9c4202c2313e85944a4a21a592984ccbfa91ab95e7d1a790fa4b25cdcfd32887644ba69252483295d42e3857f430b19cc955fe77f39772b34dbd3907c65e9fb327583e3ac14bb9cc9540b2d54f6549494939583ffdc52badb0f973b290b4527ff236bc386f2ae5d9c3f3e6b62c20db3d536e6e271a0ba85d1d4f2f8b0514e36501f5f7c96e22844e42ea0f9ec620e512a8a3c58a7eb1140549a076d15c5e4ed1ae1f5e9f6517584a2b600905c9849b9a6799049b67b9041bcf120b2ca5122ca31b3c79c4523481644bbea6908e3ade1a2e3d3d323d72493e49a5682a25a3aae1830fc769f9a47bbadb876f363c168ce3f40c6a570cea4fe61cd9267fcfab54f6565e5267797c8d37f3f1e6d65b7652c08b53b014c9fcbb39fbde346e5ed138cccd8779bdf9ab674943ac915fb1a9179b6229922ff8d1b8f93337afbe9b3d99bb8427f3faccfaa148a08e96324d3cd55397f5b6299648e39e53ccd6e567506c5d1b6fb6ecc429d853b08e355c7c881df03ee3139c44f1853ab4c1c80b7138d20a5a1005172c5081117224cbb27091598a588a208d7c07bc9c42caac1fda560649a0fe2452a6b4348126101650a4410917d0d0530336c02743c0420b3d406881d112180719587104298498bce106b0c88a2cf43c0102167a9cc861e1a23ff9b68db9161d4a637fb013d23b84c7c4428a607a1f13d39b841ea7fb070b318d8578e3588c588a588a52484fc8c10e3450b2c1932ce8c003831754c1046ae8310a1a4a420a3a34c1c10ec8c0033c08218517e620448330cc218b1ca933a79047f225e5d1114b915cda5a2cc4362cc4361662b9245f3007e7290596afb110fbcc1e2c97e44ba63c679085f6b0b0748b4d9501d2c8d7d89419628dbc8d4d318134f2366c0a0d90260d293dcca00e3f32f5062c9fa98fb735376f0a09d2c8b74ca12964450be1f31c4ca698f0b8803783666c83f714528a49bb524edad504d3202c9f42ca124809cb9c0292afc8066f62a93acfcf1ba40842155b14e10d67c891a73ef2c5b961097680030dee40c51c72e4e98f7cf1dcc00c6cc8228a244cd8831572e429907c5d00073ce082147e80900527e4c8e8b22ef08b07803dfce271d815fce281b02af8c5df589d50ec845f7c0c0b213d650b7443d96ab19d62d29f6cb110a7902ee01d43a2a029b0cb4f06e405b908b19432d692d7b372f1c11289031e906cc96799e7c5a3e89cb24605962b8f96c3317ec5b301f680e027bf552ee731f8bb32a08e94c3542a954ac5357890880c56e049062a32eb27a90919a2886a80446370825f3147665610932eb65042c5188ea474294c2d0a9e02575bf1c67110ba583060fdf4271f593060a90296672982dd1bc7c9d82cc5666dc8d80069e4db666b8034f2d326d19b25419a2e7899f593c442c2026ad777190b89922cc1d56218feb07e64d6f47bcab324a883e50248b306f862bd20b6e4595564493bb80396ac1ac4014b4833069953995a9bda98fe521fde521acbb368005f190acc925855ac5843c0f2310d5ea4723564be638c31c618638c908646d88ad794b044c1f1395bc259ebc1f25b2ae5d4d1c389121f957899a508cbc38e2a1812a5a1499db3598ada957279162e588cda95e2bc23607f994505964fb17ebee065d64fad2929ae6e281cec5edef6e5e5291d8f95bf7cb3e1b11ce61d024a640923209e19091c2fcd679e7228a43e65e369ac062a120dc950ac91a779ce38767d6edc3773001709018e44705cc2c633066828a980cd7304669638c055f3ac048ea9e7be9958c41a04e08804ce7d7a0875d4784e02c79bfb06b1c13b2d7a2129cf4574b4aefdb46b47667ea79dce77e19767fcbcad4581db0af121a2c15b3db37e64ae90885bfb697b9b9058037d219cc9f10a4979967913126ba04fb9cfa6bc4fe3651ebbbedf71244e473b31ed69578cb3ae8035f2362ccb07f193b7b1ac1cc04fbec6b280fa93af615948208dfc1c6a51026309ebf2130b97b79c6608c66928617de6e676796a623163e3a74d592179a6bc9e091e5c2f137d4f4fe3b0eb774d7d9fb132ffc1265179ca0a49799e58e6d34e5c63bc4cd068dd265ab00fff2e845f96b9427cb849a0b077028994abf95c2d8afea495c0125009cb1b8979f6ec30277b864657f97d86484eccb84ec4dc2ce9664bb2256f0f739c90719dc894644b5ecb9ea192ca4d215d28edcdde852b98c3ee574921c917cd3c6fb593690fcc75a80f3c986b4030d782280f3c98b33c7e53c11ce6dd007830cc9dddeabf5894c7b09925042cef62875096cd1c8661338b0758bec566d60fb0fcca66cd07cb0bfb4379b499c328f73a9dfa6851be62519e297941414bf20585cf735486867ae40b0a1f9b1c9517c9ee44fc49922f28546e11d509c60007382c010727c0428e13b147b6e4e58b381189644b5e5ef3d180342afa457bb2507a82730cce5992f683e5b529acf85182e5b3860596dff122865980210d38d39eec3d3ff0095ad8a1c914f650842650c8c99ee39084394ec8185a425016f6408325509193dd2ba0165508e11c8984c02e1436a7c81599f523d4008018e2140f48beda49b7e45db2180f484681a50784e5553632f19260ac1f16106b8a76759326baa2099ea7f4875a16926e49d64f3c03eb27c614485172aa7892ea1853281096c72ccc89d1c8086a1d332fa78a21ae9b37ab70ee9b5d7a749315f58137df48a6ae476b4b9664dd111177c4a23f9853c59276f573aad86249cda962c9501d6ad7100b08cb25fd62fdc89654820551ec26d23955609153c5164a8668c7fa91af2c29c98a2c094b25289eed22db5d74963bc2f226eb0596977108893ecb3c6fb5fa3fda48af4806d892b7f0158f644be6b7017ef22dd01593fa938f648077c047f215e5005b6de82331a95d6d02f8c9cbee02cbc94537916954d49f3c51f77cdb201c8ebd056e2cfaf3e92f8aee2bbcc0406048744515b8358df6c4d873c618bf08214dcf231ce537150eb27eb03ceba75d154a49bfadcc23d9b16716de984c8023514f4f4f4fceb41267f60a4894c407c78e47c4b407d214126cc9cb4e216179da437fb0a44372300b73a66dbcd9e862477550607f1c8dc93cf8d23042793623918733d23c138b7780c24645142907e07969730c96159e3efbeb33bd307bf0f4f0ee501578f219162406c30abbd60a6badb5565a2b9d721245f888e465ab7998a30c8922916115a31876b3f6a9bd35582489bc1c994dbfbfb596fba6a376ed595eb6a661daec2fc2d53f0fa7312ee43c8c70f0be432f6c1c6083e3382662085dd8ab3eb73cd6c84348239f65cbca16b07c5e0d013ff90abbc0f2145a01cb378c0296bf50871090465efef16647ac3996395050c012260c30302f60787989f18518315c8e5c5c585e60b1607401068c162eb4b4acba58ad58b6c0c2b2a2859515952ca8a8a88c54aa141652a9942ba4a4a0580105c5e3c2f3505540a14e54389dba29741d57c4719b14b6cd140593498382a6655b6419f6040cab5ad44ab3a09862483387803aa494585e08a8a33b08a823e6d80175b4aabf2e5e2fe390a2090c1ba4b18ac1f0cb1f862ed846f2e4640f33c9c959508e7c86c92c38f60bca16d40175d0c753a8a33ebe421dd8e331e8822eed31be8fdbe3b06605308410360848d3a77607a4e94f7b03697a4055bcc9e1052ce8d00169fa79e546fac07b0ef992009623e6c03b2ba823006f812f1db1d56f98851515622b432d703fdb1c90660cde718648cd04094709c49bbd8b84618c729eb2112c2fac4840c2f19bd2b15cc2d0064308334803619497afcc48b6e273aa6862041478d951bb22b62464882fbef802634f7a72e00dcf134448d463c37d5a419ae8f5173b3b6a57cc8cfa3bcabac09c1c5dde2c6746514279c2943223991db50be22414d5cf63b0bb06614b387eb2209e260cb3504214ef634b9852bb583c64634e70ccc9d8131c9130dc366a25de6c78995066453624e4655ce48cc853655c0811b52b674bb22d32a1cc8a7ec19c8ef0d3320fdebe759c509e70da28eba2bf2833a3fea2118ecf96b42b673e1916ed7a76738665165814cd6eac46f95e929409c156148a5ef02a8659aca1283ef3c9620694056548271bd01fc6e7e9e577e8b34b73df60cf5926219614628cda3c71cb99c92ce324ccb04ea7af8d476bd3d9520a46b8371bdeaa3ff93535da69468b004080b48e90f90800c4871f03a0719c8ec1bd23c06300b1e101f98c4ea7f5230ed3e9c81ce693c1bdd32100101f6e3b9d1fb703b09136361da18d8d76a251e300492451c30033340748e207240a807ae16e7780bf24e10367c34be23e743a356e80bfd399f9696670b6d339c06d123ffc763a48fc1600754389052ce086026c6c28b1801a0424c03b4ec370319d128759800d6f0197e9746e5c01b79d8ecdad0d19ee763a4afc2e800667c3abb98c4e07019791801bf2c68d8ef0c60dede4b91e000108b81c8003000f8000100c68c0e9e77ce81ef043e05fa7e3fad6e26c780ef8ed7470fc02a0c5c9e8741e70191000e2319d0e031ac001218100a223040208ed747a4d764a82f298a369a66f52462933996121af5629e5cdfded9d6d50ac8d6cd59f6c0e48530f01bba3bffa075822faab77804da2bffa065807f457cf006b81feea176089f457af842da2001b1360231204d8384512365a71001b9518c0c602d8c80512367601c4462604b0b1c911360ec0f6911fb6a330c2f6143e6c535184ed1eb6b1e0617b0b1ddb5d1061db0b01d8ceb18d6d3fe9af1ec7ca28faab1f42082ba9e8af3e082bade8af7e87954afaabbfb1728bfeea7558c9457ff501b0d28bfeea7358c9a4bffa97952e0b800a844552c2f5376cbd0d1f5c6f530384eb5142b8bec610aea721c2f533f53f18e17a1af5ad245cffd5cbf4e07a1f7c70fd0c0b84eb638270bd8c215c7f6dbdad7f3d4cfd4b27e1fa18ad84eb5d7a09d7b37c703d8c1f5cdf1284eb5742f52b44b85ea508d7ab8e707d0a09d7a7c8246984b30d66e116b89e9504cabb77b7c8bcac04742560a18efa93dd610ecae5c9919767f0f24bd0cb162f412ff985c8f4bc62f97909eacfeeee204c2931df5d9b245b43f0328c23dbf607d76736c909aeaf370abcba4770bdc93ec1f5dbcd19c666f032caa85d7d9b94597e5e8274e07928a3fe6a4ba86545bb8a707d7d4ba85d19517ff5b5ef4b1086d4ae46c2dd374f9f3bcce04c2c992ce223977c20df76db329c8259784d1d97b50bc2b6b20c309ac06002e308c6110c0d85d358c763bb29bb16f5e0650cc93ba132998421713d321cec7ad8edd1075ede8e4c67a1a27f186299a2597ee40b65d4adfaeefec1f51a8632b2494abc6c9338f8ee47c5990f1d0f0ecbcb3db34326c66c522ee283e567743a3f65792f77f34b108c1f389bb4922f94916cd5a38c50467d33aa09ae28a4a37679d1aeecf51b92e9ca6ceb2ce2acfb103e06c183da1bcb82e7a45d9893fe6a926d6295da0571fd0f43fd41ac09a624c9e0650c09429bc401b98483c825ccf281e1c62943a64d6a17f7faed196584ebb71a9c0977c4998d98b3114b0bf1ecec912b32ec2bf9c290644b624848b8ae3693e94a797390ed3d38ccdddeec768c492be17a398fe0fa4d3ec1f5a61e5caff9e0fa2c0a5c8ffde4ed08d76f355c74e2adc854964aa5ea9418edb89de412a4a9d906d7222cc7e0c5679b94419a08652b3ec9fcb457e8c43878fd9c25996f0d6128c3880e9e23220f56a30bf23025cc79ad945eda2245e4655212285bf19d13e3e0c9245ca5ccf4f5d239ed153d20be1c0e3b469bd95444a522100f50f4e41809e20851ce151d984038932029c804c29e6cc9561cbc2e12c411a21c39048f7ef3a40e3cea051e32718e3ef5461f22af49bba294124a29bb7b3bd9208e10e5480b739430941165a7419ec6d9ddddddefeeee7ee7b8e0884b4b0b7372a885b015b18c8746b369b0adc09365025ed9282f84f4d97bd5ad783aad90f805a6d9e621afbb1ef26cdad5fdfee4cb8befe3e8af32ae7f5dfac30263083b789c86874dbaf654830d8efe12b8de7a88e5a906e8372194d69ba71122203318be3f2c760c666c83974f842be224e6333cc2f239e29d6df3cd7c3336945e9befb3c9a00757f0350412766024043c0c218b23e4c81fbe82e899c316acb8a2064bbc908324850d22c94109a360a8850c7a30f74db379a75e7bbfbee79cd72e257663cc3b34d36efa66b29a9d61f0e2f64dced97593bb3933d96882186a8fdae3cdda5bb3a6470b44bbe9e69d9dfad63eb3f99d7939afd91decdab4b1abaafe62e671b17ab1f56d78b0052f8af79c2be28dc41863834778d2c974826796f5fc8431130364408273b6053cc283446378827306b3f08209969d7566c36bd9b21b762d7962dcc0b6b21bcbb367af7b5eb1b0b05a4c2ddd2df0972990e5def33dd86279ea3a91c271ef6e5e61962624d6c0ea109fee715fc916f79d24466c72aec0eef2dae9d40cc62387b2a66f56c8ea9907af2e133ce851d674f3c4a8d393cd468880a01cf5d54fd6e59c854cb81cc566ec2e47d93cb1cb65c1b02df42d30680fbc9667d357979dceeada78ab77e7c3f4d5cd2da69b44f5ee92f83c47758dd8e45c41bf359181cc833b80612212537a7a568627a610b764a1f484f5c3747a53166a30c22e1866a1062543b03ce8610f5f60d38530c1839bc0b0e942ee14fbdfad0c639ff7d361bf545f1d75d8af94a3989e627acac3ab6b6a99ae6761b7b8d3519e33d4b3777a5e61cfc7f4c3a7e70fd3f805eebec0abb7d01693e9667a8d6a17529f8b60ae89169c44f54e483d133ba673df315d212cafa71abd42eaf3aae55acbeaab2ba4de74969b4475a1f0ee848d0d961e0e1112462a575d7598a3faca618e13294f9deec0437de53aa17255d7cb7102c2d47502b650ae77cce6e3d351367bf87473101bbcc31de2ad074348d3ddcc5d7a2d238135ecdaf3d49eb16bd83b1fd84da7d674d3cd12d30e08768a4d109b9a8838bbac20186e4262ece688abac4668475158d858f1319b0d2f477f104208218430c78b68d707009f03ee80f0f0f9c3f0113ea65dc7700f3f1d8659ac410c181e42e8c5c0d642ec6fe6834532471103f002cb13d1aefce5d8f1cdcc7ecdbf3fb95119731c2351b0c119ef8a27d88489ae7032a43f8448d672221e9e991b3a628955367519abfa55c2f21b1293feac189241928a202a0ce3b0d3e94f9c8edb67bc8397bd390861d64fbfdaee2a73330f96794f26500b1c67d20d8e41e078df90d2fd94adb5d6eeb7a51209965be0944f6b136beaf57123d6d4374ed79aaa3a298f99120b094ba8bf275e674a4d604c794a4a77c7f8536b136bfa46ace99494b3e2644924323762ea6deb9662f374cd8e5c8acd8de79ba6d81cb1cc37c9a5d83c9f25c9a4fe6452943994e9766d1d7190182c7319cb62d42c454442b002b7302412420fde544fb979074e79b7c056ca6d9692f2bcc22b48939224572b19997fdf270303736fc41a99b7c5919f65b94ccacccc5f66f0e0a57840fd4d1f9e1295bc97ff70619ce1a5d5ba39a3b9a87b0326d806432d6e50048c0324f8186a7103273c680e73190b13e4ac9fefdff77d035eceb0cc7f78d3b02c96bf7ce65bb41907ce4428ce9cf4279f076f63fdc817ccc968581a57d9cc83558f9d8eea9be43c95985656611af347fd3c0f3e9e281e6c89501a348e2355b6e534ec5fadce61b75a6fbdf52c09c6661596398b7db1ac1f343e731a9f79c48327f3d99fccd6623da018fc6dddca719a858b7ec19c5fde0bbaa5a1fa0ccc61a7f3f22ddaf098d09e14925cca71c116efe0b17e5833efe1f2d6371ab69b7ebaf033e402e7191ac50cab3044cc700ba8458e67217010373b9e5f381e66170e1cefc4374795cd1d900dc7aceb6173158ddb745f2269178df74d9d4ec795b5f90d3b0f84dd711c36c7016087b8cbe203b138f2287671e4450dd6b7c979530411610ec71c0ce10dc70239b6ae0f6101f01c16c77758203eed8ddbd8d50360ebe39440df610724f5684426d2b3f1ebfd75775ffa7a75472f6274c1125fefdf23ea5f9fa9d38937653f248fc9e711caa7176f8034484ce2cd7c22146b64933734126682b94aebbd1208e7019c3e1ea76fc49bd48d602102c8eb127173e32a91609a659ec7725394259ee5b07b1da7592c056a578f177179ea02e8e27179aa82e8d2b93c45017411414ff0e3d23319996c9c94628dfca971d70de0d6f7534f1d76affba3ef8d58435f592cff3e3f979e08b17e0490a3c3473f467a9b78134f2f0cca038f00ff9e25123c6f6373c436c7ba1ef1f4eed0bf5ee3bd7154538345ffa57e04012e91c6a90f6087953475777cd21f71330efc1d453f809b27fee8777c2b5be08d5a5a318b8db8d64aa99d98c5c7865ff746acf96eec22d678116be46d8c01d2c8ff7062136b5246d8791f36002fc2e2bc87c5e76187b88ecd7122ec8edb5888378db3b110a7a751bc99499c11969f5dc49bd9244617587e1ec59ba964e3284763803a661d208d17f1663a498a37734900e792b0fc548a4de2cd7c126be475dcc654aa03d4316b00699cc49b09146be4731e9b60d942047183fa3eaf8508e2e60590461ef5bd7eeddd1ff5de8835fd8ff57aeaf3f228de4ca29a9b9bf5022e6ab0e652bc99434fe2cd5422146fe6921a0871012c05f19c27f8e63aee8d78539fa2b8753ce3c01867088b02bff81cd604fb3b2c37470fc51b155813853805b1c34af8450cd6c49b89458c3713a1b85ec74505c0c2fe58bf116ffa662678707d8ef9397fea74e656f1cb46fcd92c82d87dca24f82cc5d552bc45eeb38dfb13bf2cc41be5666c8e78e637e24d8e18f5d457d0c53dde05aaa040578cc79ba0cb86cbe6f12778339560f0662ec91a8df1524a8462961a3870ea7328dec8a35823bf5716dd76faa8b3586a5c2028169b8fb628e2e29347f38709a3521609cea9b3d8cc8359207471cf3338dae0f803ed69e138e38525857471cc31ac9f58239f5938c218dfbc02a489ffece4a227de4ca25883146fe616b126decca24a7b6a4e6fee1a7dca11571e3fe8eb7bd0f3e0f914ea1fcf67893446dd1bb1267596c5912c56f594a5f18dc66fc41b88695c652146753a34ae8d279160d8d1384e4f229acb439a7b973564595658560fe08783790599cbcf2d7eb8fc2ce24266a75fffc36bb6c035ee2cc2b23d2099e3655e8f23a9073445cbe6885b87de142d0b310d0b5b6cde7eb03436b3aa1882e193cdb4053406342c9c71b92efd49993d2098cb7b53b4eb05e6b214f59774f9a45df7302462f2244bd250671d763e5498f5689750615647235e1e3b1d9a6f30009e131c4f433e535a0213917887c6e3bcb975c4cbe384f93f6f6679df2ce9ee2ca1c2f1f1eed4a75edf3e52347640644e63c72daaf0cc2a20b0bf7a7aeb7b660b1cfff20de2e802c7d3f8068d985731c12b9fdf7ecc3cf568297dd759bfa7ec776a656e73109cba4c5c02a75effc3378c9bf9163b02445cc4cc0da2fa86d5ce0898cb7ccbb86ae7614780886132fdbc94071e7d1f75d8f980f9bc3b3097b93baacf202a7a83a830cc55fd58515dd8ba44247ef9ef64b94424a6f1a6f178c4cbcd11d3783c0d9b8de0484fedec7ee4fa69019c7aed8e9047e47a9a89484ce3e612e0d8389e084edddc272271e6c1b133a576c54bf3f97933111997bcf81e59938c46495ea4d8088768072f4c2aef47a57eadbcb96bdcb3c4dae1c4a6e805ee4de2ee59e2ed2b3602452456a0b87b3f16499553aba2429fa9a83e1fb1cacd3a1ef428463045b114a76c131946f152bea5a4f8a097cb3a8df6945ad46076a2f7503c1c69218e3ff10adcdf2c1670b4ab0331380784313133fdf5602863ce1316b65933495f3f67a413ea801b2c42afc0838f6fac5209bff8dc6fd93d23849076b79c42f0e0257401953d63a511034205726c3963cb295b4eea325dfa834d2badb4258413420a619d70aee64a5229a9841242095f236d39a76b4a4a2b87c52b3b565ca946a59499c4ea94525295a74ab9aca494b24aacb32c4a1e78f1136673ce2b637f174319d31f7c4fd7949bc6ddc0cb21119bb819a5fcc471ce39e5947272124a69d2321b526cdba415cb34539641a2a53894d44147f267d28a651a963348b41487923aa88f26ad5896216c083b67444b7128a98368c5206c083b674b712889d6d93983444b71a853d0b21b122d750a206c08bb53e0c5cb476973d6b0216c4d93c2080fd14972fa7c20391758d3a77662cec6233d3d5174d1c787c8124a45ba0bc152634e4a072871444fd8f1c4e0a4a68cc33a9d213aa6671a67e2aa9d78db384ec629ba080474b2f4f4dd0ebda43a93625ce783de884472f1e7849da8bc58a753a18e0cbe8e9c4e988926d19d380f67288b73ca9123078a8b288f835fb93c47a12aa010a4198217dfd98832e1b0b119a223df1d85cbb8d3f3ea9464255b5554883b18dd9c52de19fa7d1db33d7f33a6a803dc375107b026cad3734ba422fa00d2f4b38c42805fff14b76002eec723401d310890a6e34db4220aad3c2162811b158d809bd296e76697e5b16b1d0ff9ca83392b84fb5128cb4ca78f77c7f4f9f80d8533bdeb7c98aeaa4b7282a61453ca72598a33d19b8c5441737219562bcc6ef63078faa694f6a474523ae99d129b58c74a89f48452ca5aeb85fd6152ca0a4f8f619feda2afb34e7a228d213dfcb4f4d046253de78537eb0f63c5f4d74d7ff9dade979fcfe46bbb97a60b654b6a17cad6b481378f447f90ce2eb6e99a92ca2aa94b56292ba555ca4a293d8a42f0644673365d533696894c19b9a055d2fa5aebc4e0ab0a534cca0c530f531b0c699ef5ca485d11524cb2a4d860bf50394459fce01386f0100712962884d3a557f2d3995452da1152aa156d3046be5676bcf50e92af231e21f04cbe548f1b38942f94cb4d87f205e3d9639ef2ffc43a94af99b71cca178db31ccad7779543f9f2e1320ee50bc7eda17cdd38cca17cd93cc6a17cd5f80f3a2e73285f39ee3a1044dc46ce6b7084f8cd8f07c088bf8ae071011ccad7018e0fe5ab001fe250be803c8843f96ac07d2ce03d1480801b0009023ce00338942f079c014a242009093c0a79d8b34d674d7bfebad7f6fc9dc36f3b367fa3b6d229a9ed98432d9693c9570bda80adcec102b55392f91d6bc2d926c9c02f5f3303d7c0fb393670f34a03d693adf80cd84cb6e23110e32d105f81780ac44f4002f1118040fc03e21d60a16c358001f10be8241caf8004c4232089f8031820be0048c4038903b83fe28d28a2473c0f9d782204109f63a16ce19bdb07c7e30c112f8485b215c4cd0d84e377dcc41caf781700e27100117fc346bc4d4d7c0d9af8190b65eb874ba315ffc9c4fb30233e46468c3e38fe30f12f31e25d58f1302c94ad96cb7257acca42d942419de2bbf8cd5e2c474e142201bc0389fa663276ecd80de8e4b0c91f031c7550521c5a8244a8986bfbb4cdb08791a73c021f605e62b8cc5326818c0b0b46cb8a9e72916fc5b2a2a24ad5d3d64aa5a078a853879db2111a1db799b40cabd969fb8146a5d9299e27c6a902d49433a2a45723d48182b27279ccd4b098d54ab6a429f3a6a6b5c83a67849bec4db3991de13ca150b34ed5ca25f62657db167bd6ad7230523a9d5abd8d9e2a8e50336571201afac135181209610c3fb80fe3f1279b797eccc3b83bf2ce6f73ce39e79c373429d6f4e50a4217cb33f75a79f6549e57aa6797d4f3539e63b0fc50976f1378f29bec806438f3d0ae00598eb45c07a47116c1d60191388fa00332712681d601a13817d13a2015e712983a2018ce46b6edf4a478538360dcdcf22db67a5191faebb3d8cac456155b956c7562eb527dd25f1fc5623dfdf53d8b1de9af8fb2988f6cf56b50f73eec6a3dca70f77812479e2cc45d3dcaf22768a8daf885371f3f315c31c59be4a49d58e28d7292931ccc32bc41f9c28e909294967a7c86868686868686888888888888887c7c7c7c7c7c7c8e887c62151a5a42546434343434343434444444444444443444d43428282828282868686868686868682e250d05050505050505d1213a14341414141414141444938282828282828282b2ccf356abfffb6cb09ca323097424838ea4d0911c3a5a724454838e6a10520d4aaa414a3568a906c99e1a94d4412dd4434b888a928ce85092d2520f1d6a1f3ad43f7468290e2d2d59225a2a5a325a3aeae78824e152d6e3f9ac7e0ef40509d9287d49475a1d79464518fa64d25bfd93d2481ac99fa3a31ad441494974280e2d2d11c53d7839c331c3b493c7c4cb2aec671a893c15882bd8f0e68515c24b6fcea094c2b65d48a83e060d610060a8450e9670f68de35e3b20f5f446bc317dd238b598c51a633c51d923b59bb3acb6d078e911d84f1d67b3036334e368ec10be1abb5b0764c3d5d4f5d08ed51a29ad3a14b35e4fc799be6ddaa99d6fb1382b96affcf136f10693d4e5b5e5347b650169b92c8904d7eec49d4ca7d38da79f0e3b56c6d171a6ec722365dd1f91669f1270794a8ca75eaee2239e0289a78795b29060d9f5a8a76b1d1009bcc4b8cb8d1899755d9e753de2772aeb5807a44736576f8c6b3aca654696c4300cc37c6cf854bb1ef5da2f5f70750fe550be54c7ac4daca19f30ac7c45d17fc572b3877be5e615ee5fbe7064abaf72f34a75f32a75b38772b3774faf8730cbb88b611c4aed3cec27ecb043b93f4e97bb39d6cbe24e57abee66cfbb39a399e99ecc7e7a9e38fb8ee9e6181f7b644368f22eea947597706212cb03a174ebb9943ec6d883ddbcc232ffa8cf6e8e58bd31220b1b3648c3932aa95d46ce64baac1ea6cc6697f59866797046a4b17cfcd49159eca2cc133b763576846d532592e6a9b189a4949189114665fda20f9223ce3213a54130fdec7864dfbe750764fedccd721015de6ea6d6245f1a95b0e1954024c5a4b441948d651042083108b1c610c2082bec6c70df1c84ab10caa8a4a13c9446220fd652092a95ca8944434c6e0dc56f2db7a4bee9fd6d6b823726fd554906896232bd6f9e4045e651e4638622d3e0cd19e01c6da08eedf5ddf1c8f076db6ac76cb287330992707792ee269bfbdab7a3d5d60d63d4c1be359094524e6e4e4a29adb5ca8a619d0e09922650105a764b295b62199665d9c6f5d8ae76a3462b06e6dbc6c16895e8c4934f523a9ded5b8a9368f0521d8fc6d3a7bfa42629954a15adf080542a5c14f2543a9d95954e07de8d85858565b55aad3a1ded5b0b67c39b3efdd5b7743a415a3a1d7827501026503dec1618180c1830b6ad39096dc459bb3aa9838dc545279e4a8ecdcc3e75b86f99678587baf72864c3333d3af14cdfb2767128dde723f07c7b6e10aef9125d24193d32826410c9408ae989098a218a419ad13323e802e19aef927b74976400c95822e348c6520c50cc9298a398a519403384aecffdc95708df215cf32dba46f72ac9f091f1234348c6908c221946326428c5f8c4fcc408c50cc514c518c5c428cdf09981715a969930948c422f41dce964badb766d09cea82e709547d20b26324936914af01852133478198611563299a2e9b02b40cce98ed31ece36695aab34076f1ee6c8e7edc8f412543b036839f39b45b296c8870d021e7fac2572c1e30b1e61701b54001a98c728ac0d92add8824729acedb18183018f3ed6f640f1a882c715fc483a0448c0e311fbe8c4e3138f29f8891a008098c71e7b22d96ac0e3091e51f007b5560ef022f625b811cb63df235f45fe00258c7808ec7b64ab5e041fc149701824f90ac16f00a9712216e6036fe220380c917c11f9025c497c090b23e443cec46182e46b891f02ac07b1301c78075887e991af20afd78085e941922f0dbcde02f6058948be2cf019dfa1f10da09e2d942d94f70b9c8e01ee19d0504612b02f44b255df0194d1870178810dc01dc80194d1351004321185c42522086213f103914824411c4114410c41e43152822228003ac18f097c7a7a52b0e4892127848e04ade04805465014f91049b1d4022516440103a017fcb8c0e7a70768c90c866420840465843242194dd45187424279042c94add6726067002d8789976d52927c4540be505e6f97e4ab7b9644792581e74fe0f9a3c0b34d059e7364489461518646191e6588946152864a192ee5d893a34f8e3f40cf1128c7a01c85721cca71498e443916e56894e3518e483926e5a894e352ee9edc3eb97f7203e50eca2d947b28f792dc44b98b721be53eca8d943b29b752eea52c7bb2f4c9f2274ba02c83b214dac97209ce36c902c7f905882e701c0c64e03687f2a58123e0411070b35cb26373b31cca421bc0b959066de03ef2ce690ee52bc861be8404f200cdcdf2a703d287033e6e963d1c78013ae081e33894af25ce801361c0cdbdc4048e9b5b6988904612721b439838010ee58bc813f01024e0e63e0201016e6ea3268a3e60e3e626fac0759a00c10170285f2178cc8bc4dcdc4b4800809b7b68044222d0b9b98344f0068c80045f3994af223fc063cf016e6e209e959bfbc74897a00137774f09de3a942f237fc095e8b9118f478cb8392ea140899ba3d209924cd0ba392299e00f38c16fa0e0408ebcc6a34f8d9be3510a80dc1c8d9e2872e201374722277ee3892f200577f93c89c72892b8392e5981ebe638a40221286edc1c83a0f80254f0afe01088e2ac4720d6cd11080237c71f9c5f827e73f4c1f925680137c71e16b460a9059ff128c58c9b219214a7f1f843e36698f4e30225171cf5f80248f4827b8f30f06e864530f8e91109344272ee3106f02806e7641067f00cc6519c818d0c6c0c2c92231818bda0c805443f4a5224b500890570290aa015fca8c0078a1e9f2529187a42c889a0234728303a41910962ec59e2513292548288540488043f23f011414f08968060a809a10f04113962c268489110a225963ca0d481240e345210a09d9fecb3811e0d2cc9c01006842e1064014b5401ece61c14b099c027819b8f5f82e40bc65104ec4b90907cc14042b12f42b255ff32245f30923afb32245b35ab10d26cdb8d5f78fd9e15aea505c6cd579d8eca375600ceea745267a95a38974e47c75d6e62a43c46a7f37a8c1c337266a6239c99d14e2b3086c0c18121c4aa65081c961d41b08ed330b8966e88c3c061e1bcc5c58627c45d3a9dd55d5a5cb8189dce10382c7fe97476fc2508160c113a3a300288f142848e0bcef9719ac5b974449ca573199d0eccb798189d4e8cc77881e15e3a1d2274603a1d7c989c1ab2468d8eb0460dedf4181f46181153c495e1c308cba3c78ce3b40bf7d2f9b88b1131319d4eccb7192f9dcefd8b0ccbc1743a3e0e63c43b1d1e7f8f1a5953d311064c6cdc892362c29d3d77db0734d38aa9894cf3341060994a16828a3bbb0a1301a6b8214d5695ec504740eb404930214df6aad474984524ccab527502756c6f59828634d9654b2a39198d4d3980afec7ddfcf0eb3935d0bf3cfce47f6a73a9ddf46946e009d8fec06b91d131936626b2186b1b971becfbed96c04efdc9b6eb20174fd7dd30ea2a90ae88279df34d42f2c8a6ef5fb30167302d63dc4af7f5bed00bfbea9067d1310f73ea1a09e1ba7e4c6a9d3510e514ff19efafd9679308cc4cf3055a95df7f66fde9e3d6fe76e8f23616c09acddb01fa95d3037b7e9fddb0869b2c34ee7653b4ec3f4d8de21bd741d135376b56f99d5b4ec3027b31013590247662c057925ab722aa36454e6b249c3b92a650c6713503ea1d8ac82b309a82aa5e093cd181479c3d90484fb5c55c23a26aaa45ddbed402ca243ed32bd4f97b40b763aa68c26d14e3bad03b108774cfaeb63b74808728784f52455a5ba549fb413bcdc5525dcef90daf58e49bb7e52e26124f26093078b0dd2f0a434d90dd33eb18ceb4f6a33e67aac3e06530b5fed3c86553a63b77369031b1b9b22fc82a1163310c25e7081e3312c703d46c32312b13c162326bf55f868eb29c56ebdd05eed2e98c80a9f4e64e2ee09966f82e525d6b53cbdb399dd9e514e3ef360d60f2cbf99ac36a48989e3a5dd11d82376fa8c61b57647608fa7b462f5302815de4e7cd6f988c7aa86497938d31f3c910d8b33334250381eabc72e6bc56ac69e7da31dc46270b530cb20853390063e429a2e6e3db49dc030ea21d201c34737c0d8e4a53d67727a8173ffb4e06aa18e1e707b7d53a3cc335292af4cb6e8b34c496699e7499d24da715a8e010f696a646916200dbd5c8297d167d9bc2b138e6ed1f78f5cad3caf9e6e914b6a41c2f510d2234c9fb51735922dfa5ae76127af8dccd4482a49aa05a8e3740bd0254f4fbd005f36d428deccc41a9a291c30a56ac0949201d3471bf9924ab2454f3f136fb258434fbb9b579e54c2f4261b6c0653f861974af285c11676fa0c3b0cc6e8a1a418c5be6a41d162a00bbbfc37035df552de0663b6ca3aaba91ebbfc46abacf53086de1d6c687626d8200e2b704f01832870431df1f09b26bb23649fd2197dc8f7b7d81dbb2fcf8ced830db62bce00081f432d6460070cb149238ef574a2b08d475f33c5f1533e06531a83bb71bf890cf0e0b9334f63b06cc2131c5fd004d337d4216409fcfa7c44c34829cf0c84f05ba4f33611b1bc3b71069e8b17f69dc1820d4a18b6014322361cc1146e9583edeaa2b9c8700bf9bc23682673e182e46bfe74f30a75b327679029937349be38d88aaa4c9eeed29db1a17747917cf5cfcd5f77f3f79bbf5addeca16e33c1cbdee9e94f23813aa8c735f6308ecb3558cec032f78fccfdc3f54fb7fa34f06616c19abe94e7b0f03cef59bb50ee5d1b2f2a61d36632e515361d6fdf360ee5d8b56f9e11d15093201c6f8021511b7ab08f8f8cd33a20281cbf9938af639fa2cd382febb26fa72c474da54379282929159cd2f3784c3c519d0f8f43417d4b49a1542615d3b715d3e9a6b894ce074ad50141ad74ec93cd58388fe5a3712e81c48db755778bc448e01cc406cbcb49d8719e58127bc7a694319f95c7525052aa77c788d24bf072ff206957bf81fa07eac8de6f17401da7f7e99e77cd47734111d681a1162e88029fee79cffe022ff0c5508b172cc14d90b087b36fa7760273cf196e24fdd35fbf95e0659d04af3e4f2adad59f42edeacf2078ba77ba77a9ddf3ec2c92af0eb6b4ab60eddab5cfa29e451ca4c176ec18923da3dcbbd6e978d75050884c9ca5523152292f458887927af6aefae6c1a4dc8bc1aa7acfa6a0d879550a4eef4081ed4add9462e953b67e3e05e5ee38c92bef7938bb77e95db3d23b4e7bdcc90a41614ffb7d7fda51f7ec8ef6e3e44343e13c3bf18e2deb74bc679aa59eb7a3bf780ffbe6d9794c3e066396ded33c4dde1d48a6c028f7b440120546b9f72dc565d6bbca87771488b714a7b24250de539ed9d411de510eb3dfe76c27bb77bab7baf25b8ad30eb367f9d3372d6480e41d50ff2c9136069f2cbd66eba5c53e7fc284442cbfa35d52d267b6622efdcdc0f2c254a7a3dd1d2aae91e0a9708d042f47bc4324e21d97fe5660c795156925de68d0d9a75c02acda7e98b2e5291bc12b1de1ca3ccd203699d79f9663e0dc3f3f4c70ce7e82d8e0ec62777a2a2e38d2549401c32c03161b24221efb068d7082b16f446b60824fefbac0f1750d5be0ed1d9c98e9a673cfd0e8d8748be86fe2f437df5922fa9b6f25de4985b7c3e3b40bf57922ae753fe2b1679d0feed8cddb39fa89daa2103c7994c31b8e1bd20362186767929b1e55d515e6925d8b317ddb0c67d3e138e11e10e7e86f9e080af78078477ff39b1330133c3d56f032349200ea733e8976ed70a79f5f00d4c1e2c1659c07401d262ff03482fb39c3244b3b9d161271a7a3b17c0881e965f9905f7c81fb42e0cef59c2908c6cef58090e6c4d91d7a83a820ed7e447a1c5983a858dbe5b1bd3bc45ce6ad6e83670ebbd3ef8eb2b98f7a773eba6fdf62c7a1d88df5a3bbe9a677df4c36f360d8719707843418ea9ccdf427d389f583fbf6eddc9dfdd15bb76736d343486f10158e1bca6a6b5082e9db0986f830b42cfb0edda66bcac644ba6fba0f89b8b9ee14935d26e9b96f9cc569887198ecb22c835007eab93becaffbe95b1bc163f94041390fee2ebfa158e81da75124f6ac0e67e361c74362941d12210d772213479bb173a7d865f9c0947e764714c9a1f088282896e5231ee52837b3e821ce4222a66f22627a1863ac31a2a0448cbb6775b8d321dc6eb2b0838d511042ec1565bbab153b668518c1f49ccda6638776a73bf7b62c1edd65f91002731702d373875f7097e543cacd42488399ae903ecd3abe8d90fd1455e890b405fe0143a2241ae0dc77a79ebe3b9d4ca4e33c90d983489c8f3ce8854822317beffe8e909d79615f316cd008fa89cd6eab440d54a80109ae40e8ab8f79bbb3180708e7ec2e401bf012d26c116f8ed30bdc8f996957c4cde56ea504f75d3ee802854c6ce3c46603849757f15fc32c9c60813bcfacfa8b1c56b56b8bd1a709f0306693c119de20fd055902ea18628393d4f3c038e0cf67f3f5d27be4099a1c7a9f54ce7c901c04dbe0ac3a421fe065d8047791fa956cf1e4403a4c81841c206108a9a7276775e489cec1ee2344ce3cb53e42e414b92289f9224a1c15b92209ecf41629e216b92209fa798b7c37c7d72a827548c11492b8010c3f2883163e9e1870c1041ce0208b2322cc2107e6d4e71c3867da9e098416f0e0043b6042ce91276872e67d5239f5b04b00cc175fe4cc0ed22e19dcaff3157be0b723f3facc9c797a8f3cb12367de67e6502f60f92136585e21289c24c3eec1d45a2393a71bb3819d525229e9263bcea9f54dc70821cca66bca86a846713d6777379d74d2c6a49472255bf09b8c2d3bd67e824a2a257dc28ba7104209a1445548250fbc482795927a2da99474ca1d78f148a0924a49a7bc91c843fb526c1b8c96150bce103684bda2a24aa5e00c6143d8dddd3d5170ee96ddd2439d3a0e67082104c2139b49cbb04aa76c0821840d1bc266c168619d1ab5840dbbec74b0b9c916bcc97ee0e4cdf5da75e4181866473db360b83203babac3df17e83a1d9e056f3c9c8be0eceed46736701f880cc607dc5fa6c17d8ea3e1c9c0fdfe0ad4f102695c561c9e81fbf2e64aedaa5db5c27ab3bc966f22019643e6173f8b647767be3b1d1a7d4c898af40d1b8cc93cf9aacf608e9c399985b0d582adb823c208b5530e011612024c334c67fa8b5920a18b5ad4f2087236952da5fd1ef3b54bdeef8f98fe93b50877b7ec76c3565f0fb19c2cc3b22c62e19a813fdcc1eb4b397b6c14763d95b7c2be979bb413f68577b6131b84d8b10b61bd39932b2c65472a4c10bd1fb6d92f48d4d3d37324073299349b12afdf38cd13638d2c7b0e82a9f60d569387b777f76d72875dc79dbbf3dbcd451a6b3118d67a7366040fae9d8ff94b7de0b17ecce951d976883f56c7e20c8b94f07c11f265616b7ece4f8bf37186458734733ec19b3bde16b5985978f9f859e679f3a7e9b06dda9cd3eb0f66f108d8e7d63d24e213e9eeda32ab5dbbe3659e13ce09e794d98b6658265b3da79c53a2269cb3e1368370c7c39e8197f59800c60143b88647a57e66d45f17fdd1cf968177bc43dbe888528c8177d4b78f8cfaeb368a4a6dd447ed82b827ce6dc464462a6c01beda485601bab0005df31d9b740c83c4b08de44b2e91ad8e375129d674d7c92546b8959ae0964b9ae058061cef00052744b8cf2007dc509e24006962bc164fe08e391ec141181d3638e341bac198cdc4ddb471a6775dc40288e95a3c02edba1369ae317d574d5dd751da69268dbebbda11ad715c677af74e9b5a34754036cc695d0f54d420e63edba53d6adae3927671d7388fda7a4fbe6c36ae39959b7e847893dd44554fb9b93177d5cd8d3b2ec1268cd29b05e1709f5e754ce5665c6baafbc374ad4d9795bdbebb8d7ce1a81c85bb76b30feedab56ba64725f146bbe96a57bd765ad7c374edee68a7cf3a20dd71546ee59e57545705eb7a70df31a95e399369e5622a9caa76ddb5f16212deb4d6ba69bd9ef7b65149ca764fb1f22894275fa7cfede60c5fbe4ed746bbd738ee386dd230cef46c3aec50f747a6bd6a97554fdf1d47bee0b591533b0dc2615367ca1377efae87e93bd9c54c4742ceec66d4cd3698c623c41b53d775879d4e0771e54c268a4dd74c146f1b178f106f60bf9090ad79ed06e1827038e390902f1cd9eaaee9d8b70d0876d3c44ee989eb0efb75baa6dd1c83b5cf60ed660d09f93a5dd82df97967d775efd19acd1cd63a2c3b4e6f96076b16e2ecc623c41a7a1c198f1097e02d723a303312794c52250b734eb85aade4b4147e92ce4be9ac424c4c4ccb7651f8c16f5ec23e7554c2066372f760ec3854310ec031598cdd9c9c9026aa4e6d9018953cea39da75ba39e21c2af8c251799698a29c3ec21b9553fa0cbae6e93918834f279bc3a605dee9d9a6c7e9858491ddaa3d7205553dc50e1112bfc0292792e1d4b7948518c54e3c6d44d229b75940bde95d763a28dfa2d4b0e932bbd56c14dbd83455195551aaba8a4de293e5a000e68b2fbed8434f4e7d0a0a60945454aaaba836950ac546aca9543786fe42224e526f1cf2502cc4aab9f29423215f12305a425e00be3e0097f8007c4527605c229d80afc804b844bea2171d999063ad79a8e4eb75e5a99e754cd1c800020000f314003030140e0805a3d16820aae23e14001088c85a6c4a1947410e8410428a184300000000000000226d00007e2bc87f1b2eaeb1fe8f565f3e340ab828020d4ef1ea69507af35ebe07b5dc968de0ab5e26780de2480f0267ec392cd25c2a32d1c410c6e20af42ce9d9ba5fd461371fec59224d1417953a68b7c286799c6d7a89f40a1e831f802e0240dc4b6c0f51469385897adb21a3d78c0998c68134552314ff583ebc245948c468a0efba77a8408c1b6fab7f0e73023e0e286ca2bc31ed7f2405fc6d4438faf126e9f6e32e5c3a141b214803413391492acc91cbc72b71c43db561c2da57f472128d1e0daeea05e18b2a033a58c1498b1c49748850785a89499596e926acd7ec60c94df77a144763b8f79f4d952ac6bd584c55a679daaa6435ba3705417b4de4a0542c5d7ad936402fea099caa0a8c6dce342e9b9ce1d4d99caa8aad6a9aa55169641b79ad8668943aec7433766ef7f9bda453f97b49f39eef25337f0bcda5bf7c2fe9076469ae9be67bc9e5ee12adee5d0e90acf6cf4035bc3a230b5fa4054c675744596367d91e265e6d6d71f9f5cc7685736f5748afb39c250ec25cf46be537547ca9233b12bea25758ee3c18dc061a631b446dda709d4f3734bceb939b6f2efa0f88721b7e0fd0fe958e73f7fa801ea0e12cee405173050b91082b19f2c9c42183e28046338f14ef32095a98bcb8f99780cc3d7beea3b07a3fd4b929294715120874e1b13549fb80593ed97ffc0e0ce3c668110474522fc1602ee9f6a4748896b57afca76ddbec444540b9eb76789bf7b2639f064b27797d7abd535c9210a822cc69166289949ac9932295e71b9f39dc4e0e6673585fe401808bd60b1ebb93f84ecba4f654c4c0076d70e33c371ec7734914e8dddaf7a7f9da47ca7664fba52ae972ebc27521cbe1e88d697724c7c100c48697102311d489e4c8d2f1add7ec8eb92c2edbbc9c84a6b11f15a2af1e43fcc4a89b22732bedbad547882d6d432d538633e04194c1ae404be509fdb101d35c0293435f6486457073c4d53ad2371b28aec9d111f37e85e033a66beed88e8fa98bc5bce4de8d555c7762fd787a23664d87f790a0201553fedbe82728e063741e5fdc6a59f828b9a132428e877161e77c628e3882249a739c1e02ff1c4c73bba010aa1da9a3c8d243c674af6e5b725a3c257396bc5329d0c9415921c328f8a096169652c0dc861afc9185d25a43503e02d3d70ce3a6031f2acf2b380ad638baf129fe1c86b2ba24f1657cb9e414f56dfdd49c1149c5e7cd32f56f371acafb5fd766415a6c509a6980ed2ad01ed8de82bd4b2420dc190a7a5d65610a90bc9290532ef69d37d56ed212408bbd30e57542939e036cd8a77b9bd503101970769af6eed3660dbc0b9ca5306bb80eed8a5204593c264e2a0968068317b9508ce1b55f0c691a7c04ad6263701066208fa2af86e26e4379eb14f3c0582cf71b5e89de9edf5af42eb949e661afbacfa477070348a705897abf5982c5346b5b856326604d5d606683a7ed4c083eaa7138c8d62a4d8e4dcff15ab3f6675dfccc7ae7b9ef26ee0b823f5fa687b73affb86fbbb0d3fba6e74d5df7bd800b7a862abcb627c2cd840d3f9103e17035b016c0127ac105bedfed6178f2725f492e92a8507ead252983150c953d4dc266209c1b56efd040f266dc3c70adcf17678c82923986ba52f924f50292ca1c9d58c406e7a0d9781e7ebe38646b1ba04f7512d31f61c92798aa2f6c97999197dc926f7719da6ceaa066eca108fcbfe8f51ca686679c5f602f5a81a1bff20dfb8b50f62f24b523163c75c4c338384b1bf90ecea36010377ec79d89d756313edeb396ada5e4fed6dff67a89a780b128fb1411fead8bc545c50a83a5fc0869cb7f5bd9f9d5e81e6151b460524c4e26f04e4e48fa0c369bf3025f08432ee7cab4501a55636a99d4eba111c1437e6719d5e6599e93a3c9b4c9ed6f0ac2d8c310292c7211bd132531977b76f28bd454eea22a90ca4e27bc8e8dd08a5a37843f346077bf71083163207515e7332d5cdd518883a725a1667c74b099fb85d75917cc0a6b719d2da0b86a4764c6ec480121c3b344604e731e773cee14bb05c128421ba11a66727131e562dbde8e8209faf753de595569e4eef76f486d2ae3a64476ba26a79aa403f9382ad9a363a7854fdb8f55e3d93cd9832c415edea3d082649810da2e53fcab9d4edd2e576fa82dac13c31cb1512f4c05c5c1987e9030ba6a748b7ba627f44e2afcb38b9fa4c2eb915b2c0f14566fa21776be3959ec2159815bb989b00e720774891fd2912150917c154208b6e660450cb98deaf2dab715b0e1b30a5bb160f48632bae29230ba7b3846477adc3980492547f0c7bd1d4298bdcfef6242e971091d133287df686705f421d74fba8fd957d1d19e5fe0d640d2493ad42ed59b5b393e949b61c9cc7f66529e72aa2027f10adedc85dc967abbcb1f7b512e93d39df2ae603b41fa3cadcccb3a9fb99c03262b578e76096ef6a3ac124f59ced9dede7e89d1dd4a286b221d728ef22fce89280fbaddaecb3b79bfba3616aed15939770bdfa5a088c17e10ba2a0daacf7dc5295a5f52ddbba6642d4d9ecb37c03b4383b0e6ceac6c7e58e7b081c91bfcd8399233df11fbd22a2b61ccb63ac71759d5f066264118a5ef91ca40c5d9d1ee2d8db42cf482f09de95f2c985b53a16e36012237c375aa7790ea0a844b335df1c4f1b4c2c38671742545059fa498fb5772e9c57d1a4f69e0aae8d6e810a3881f1bea217f981b094cdbb727906617fcaf8af471561df7539365401e88655854c49d91920bc9c10e1a7ed897d27fd64bbb40ebc2ddf96dc429e4327e49ec0b4694aad0ed0225ef41313e3562dc439e7ecda17015b7ced23911886db253aa82cd808d1a3048f64d39c0176b3a3f730e422d65cc612ac40918d6e904eeee160857c9d002201e75f9664e396be9addd322bb3bf86544d3c52c563b2babf9864c7870f0156fb9e8d82f9e4b19e22610b14446339519d9c1cedda6dc7c21f52c79718d12cd936e26ce52bd69c9fd4bcff6a8498428e20b3dddb39e8417f9a80b3a0493356f561d9f8f63f4f889875c568853c5dceaba6e8b9a6b2b4fb66bb1075ff20671f91d90b0aec769449d38c11554dc4caa18fa2258c8fdf5b2b794a2e8af2c65b12341a6b5594d4fe4a618fe259c23c2c7ce7b0c1b5c28e96824c5261d684ccc4a78dd5562df1e1b358bf685ce70fc5dee1d8fbe02e67ac2c098965d1a1fffc867584de0c7c5bb80c1936de65daac1b0cc77e7977806af0a86074662d509365abb265bf4faeb5c333d73f9fd08490a3e011c212fb2c76187bf39f816317d7cbe8b93156a60cb92bd7d43d57474ee1abf735d780866d8bb05f07c8d73a63aff45c97c267067c3011c4a0d84a97146f2c4b4303e661864d2df843d74bc655179e6fb674178c95da5f8a80aea0397266a660f7d4b0d08c37e9f7946dd0a29e994d1eac6b474c7467d276d5623f6411883f5f756c23db419ad64ea0ea1e7ab82b32fd1a82fdd943ac64025e71f9f297dfed1e3c7a34fca909c171fad2df263aa5aaa249156dbd4de88b36778c8d65a005a5f20ad340035a818f68cd78b3f67771affd1375523355502ea588459a80fa84122d8b6dfe73f15e7d60227e0b146210a1e326fe19f7e25513921d95905b1c68890a9ecc29f67b2234aa766161a41b468d7e796079190a629a39fc4a45c5d6d8139651e99a26c3da5c69da9424e6edcc1ce7bfed952b8695c3c706aa8664541c0261cef8b33c2c19c0aea480e6de5528bea54262178b474f9544f45f3544b369835467432f29369f482cc9b35d2029888a3291a1d45f7cd3c2ae0d8fb9ac5bd5346e58f8aa4da9ef1c49509a1d81d10489ac7d36231a5b15fdba15ba9de1dd119608a4fb446cee2fdb7ab84f9502fe784c0582f6530ed33829f8f5d4a6ed95a8d3c8f6272d10d1db44ea1280c1e8b945b28e0758a8c66b609576bfa42530b497bf8a623efd0f382e7e38b442c1c6601045d51aba45d05e79f6a1b44935e8c20f96f5f2b2e182c58cd7cb21ee83f24cfc08cb5d3d48ff993ced0888bc09d0a82f2789d1c13cc159068bfd6c2ee1fa86011cd1a534c1ca027677228652a70b2b0a927be07d89ba6ff400719ddc87388f30706d79572eb363dfa54cbf0234c996b8e74c7c343c0fdeb10cad67c59a7a75e80006b15394249e6e25d31e69831589b9c0dea0ee392e691f6251364776a17a7ba5d3226fdbd52d63b1f5026adb7bbe70223ae5266e427c7bd03aee45fdbf519cfa61a63f471a03652ac12adace9b36a9db182281439daf63ace105dcf2d968016c3ab7314b40ee6649db207de3f82fcc1e26fe20dd1f74ae53be48f7d23edcaeee3d8c5b6f74db8b6425c1fc69a8b3a234d4f37e62da7f2d7c88799e62fd7a265ca63e0c798dd5e836489dbcf064489f04ae3a574a983a29f646096bf4557ac50692952d316fea7966449f8379850d0cc55c905c92bb52dbc875bb24773dd5275a5fc68ad9649b748b9228a3a691677013b5b4cd955cfaba5888479574c8094ae12ce740486d95906c9f2a9d39530678821f451a9bee64ce3d6cff0ee7ce139b9369737d43ecb67602a9c858bf3cd4bddc1e52e2fba02d4344633c7d712d3c581cad27780c81c345aaf4bb1219982de596a6d933f596499c8d2d4a2f1b6effc82b16426a407078fd78c0a145f64f9f385b9e531e72d75b87c9e25ca9cf6fe84131b51352027500d64510ae91c9ffb010e791210a5a87d915f6d24b7f9b75edc3f782ca04a7a34261e681bcc5e91e93f95170562107716b33b1731d19ac250debf0759174ab75ac2e83b7bafb8a63a890fc57c8f5dfa76971a1a375a774d374eb278fb03926bcca1ce4b5d0e304aa837c6bba7aa8a0ddfb51c3293c35db79209e21b83be18531f9e76575efbd625070bbe4d67afe32deb71d238feee996329a41062e1a20bf47a685eb175519f367b55e6d579e6f1b798e3045482ac52bfa5dfafe464fee0a2df8c8e3501d56d4647b44d03ef2cfe4befc7f7f1b5f7e59489f2877ec7014155bd414a2df8e746f8c5b2462c4866069e5c626d7807e76920f94213d11130e58eb8a2e2b540b586dc883c8612c3f01689ba560629b88e6a3d9a8747a67567991fde876e9588638ca6897886f15dcdd185a385b13085578b9e6c2374d613ac4b3c6f699c56929dce7fc3b3853f4f1e3abd0cbd5d701e218afd729400ab4000ee4a11cb70c31f6644f01e72f3280542deb2781507714fe5eb1853fa0c4f8a108028ab0e9af99ad3e2621b2937289ace716eed182b7245fd4ede130101095cbc86dfcd4b660684ddf7084ba411ab41b24786f3366fe0224d9dc359b1e7d0731a94e85b2e12dc684e68ca994b0feada00e8073e2cc2bb043ed0f5634d943a1bdf29208e07fedc6fbac966cfa5bcd7eb44fbc161be9125a1afca1f8bc78cdb074ed7ce011873d2bfe2d92a1cd6c51776f56a3f3338083c42f3112981b2e1ffe36bf96738f2424f5d1b6f5c3224930dd5228f08e7d454b97ac9b837e7b993c62f1771f994b76dae9fa74d68369b151bb3e6fbbb24e0199b21652c5031400fb3ec87d185f71909d1aeaf7ef421082b35331954419df97c62bdff17324c03b363394dd01f6719f1b1ec649eacc6c6d98f625a6f6efc1d07073409ddc464ed6ba7bfafe217a103db0d836e62187cdc4b1a7196f75a319542bbb0fbcaac0050a56f16a7a930431c04d39921f53b479530809c8c83d9e516f01720559493bfe5fd1dd2f91a14a5b182a9f1c4e8f6e80e7c02ef4c01499e085c339b3af17a630c8755d2a434e28081c80f00df297624f3a2990a66d377a694f652e2d9c8b26ed45463e337deda53fdc5b1cf84a5c89c9b8611f13876b63e5574c2707af145d643ad3d94a7c2cbaa95f6661072b76ec7f0d8591b7c2653231e20fa3179b24a33751c6fd3bfda18c01bb0247a08c177e65ae0b543236af4060ea9c13619527890b391b726109beeef3f17ac22e577c7bee18ef39548183ad6d5d4af42091c8c3e8a00a84d4eba83d9c19d05aea97e0fad4a138a2a89edfd7c15168ccd36dbaf7e7b847dee7e78a62561ebfc32767767b41f05f2b2196ad53ca30b1a4d43c983067fc18115e691866f83cf3a6a23387f0c070b42bb16cf17dac820d3c94e2a27e4d17873c589246c54a85d33e2a3d5e9468b066f608f9d083a26045969edc12f419faa7578a1ec914f37f348b4e415b6f8516f8adfc61a1135e9aa91a4a05736c0cabbef850fbc3c1cf11788417dbcb11aca1f5550456f29c03fb8ffc1040c75d49e5ca11a48acfdf8f5f532b95146c4668dcf393077d85d6847deeebe597eee60c4e51679c0503f2315a2347207c6a92ad8cf71b90251cdca6e8fe0b0657dfa2ca41b6aab3454d83d17aa789a6a9f21f49c06daece55f61d02e91a3b74f0ca6350a7274fba244647470b26bd82cc21e34ab5bc60a2fb93f3968ab83cea8c24d97a6d010aea2e2d35e05bb671a9be195c1d695ff8a04fa59669f9e0a0082343949d65c3e7f9c51d1c4ecfeb463571008ee2b11c2275a4e6de6f989bbc6ec8fa55101c01662310459cd529568f52e36031cc44067f63f3124e250157acc1477ba3dd70b819f618c19a9b069f7ca38012182416a359957b74696fda1bfc86bdd9def41bed0d3b3750314f5649ac45da52d68450682b7ca3df12160c91a21991d493fa4253df83ea34a41773d92039ff7e911306c83c9a418acfbdce34b0981934a58ab15f5a426c8245aa9fba645a5722b7e969777226ed4f884e4542c72f34f196a78cb0e3e1e08d2953ade872bcec90de6f585d0f00c558803e595ea0aa04e34a017cb592099f1a28e96be6cf79165ec13e27369a070830d59f14ced967a1241857d55a8019633170e5e2463c497cc300caa1c93356496c3c1190d020a5a0cf197bf71d95e1da45ebe39c43f30bae670c0a795c12f899bb2a5c68dd5cfbe10b13933e5f8e0aae802c56ed68de245d923fb9afea96e0361dc863ddebfc52417d94c2f06b0d704baf50ec6bb972f804050c18dbdee53fed740b76c4a7e490fa06b212896028d8e6785f020b61218eca50173d02ae45e410be0e82cf7106c9bb88b5e66faf1154846bdfc824a1b3c6c1b0799e2130e14f61a06ae83c7278b283928c017a024a855e2de23e63e9f4b560374035a6770a2817826be1c54f98cc171dd1692c573bb5faca7cb358fee9d161ab18c07091e9b23e370f2eb4c004d3f65e654fe221d363a26ea61e052fecf67e22148043259731aae5390f049758d541a11efa5ee682777326af0718be275c8263aaea6f6e980543a9e7c003328236c16ef8bf3fd970ba43348aa3bfc1dcaff02e992780baf90eef0d20da05e1de57d96fdd4c2e3940fed0bdb8419a027f55211a2c280155c06cb3896d17a38f9fa51836178693c29916dafbfa1e0c5b36ef40c0fc40a9d2bd94d7f60f43bcb86074a43a4cd07592bafb84f4ba2c54ab530d76e2d4827b5afcde3e5ca5be6ea7d6e5661d1ec5a02541e13ca1beccbc65246161fc16a3b8bc2bc131632aa9eb1172be08c604d056844730cbb2b6d5a3b5b8b810ca0bd5f5b3d97540b565503a3767bc1c1ef77d615331ca89b2cb18308ac4bef71d22e16ff2a713bfa57253c2e18e7d639554f9add86137d6da83c5c092a74f4069afde7d3e2de5a8d88b19224b98038c7610c9758bd39fea676436e6043605ec5b18dff6f80afb9bbbee84c331668963506d6304f58eda711a768c09d1930444e313fa7a77d19b6342b927644cee67cc0c7ec8a4b784ca8c519a7a27d9cf8a8718db5636c68ae89884e540b3def7ee4cb082effb830946b1fcfd674b8b29674a3e9782f146dd24149a51f54749c755d46b23320ca29a8a1f0f3c28dfd94b0cd6c47912c5a03c582c628c81c2334dee6a40ca5af9683eaf0e696594575dff25c93d20520a1292e75e6580a2af55bb94d14db31f5fccbf69919914ca2034eae7efb3a4ebc77beccca463a9158f14f9eb9c54261af958801404a2f28b66b28aa6cf8daf58bf05a42330d3c938afae0e95a735db92ae2244306b281feb497d68679efc33251cdbd40d2535cc51c1fdec58ea695878538a3a3cccd8d1b616ec23af893e3dd8db4ddb3b12c407c46be0ca21f2eb04891ad9e96cf186c2b886ab004ae5ec1f5ef8a16e5580c3147c0c95eb4bbe3597aa979648940c376ce2e437d747fdaf437b667f290d9cf4fa978838ca5c53e2bdd2e7d323d1daff090aca510dee82c17e2d320ad2c189e3c0538e9954b80656ddd5759665c1230c77e5957c13aa1779c789e2c88eea42ac94c60015fe447e936197b740dce5d7eba7bc950a9070fbbb1bb915402f4f47354f8f7429ae134c746b2a4f980906fd2963b850d8d3af2f03319d3c7a4936bdf91bb0411967a262f02c0991f5195274e6cb766a6ef6136aa7be1464cab33717ab9a663694339a86ac9ffc0f3e637779bd373e38c55ea2f4f263750004cc7168cde3a1ed81ab51f305251039e5106d1fc6e9d709e81b6405ea180fbeaa9282a304266f880c7ff7604e5c5508037a1759d7c745a08fe912fb9d8016169e346d93db6293c84a309aa1396a2a842798cb83a69d087e13057accd43884e16b147b1fdef45aa733b839d9ed177776e10f880d30f3d09d1b63c018fa546e202e501979c0e8caff3a0792172b893c9daa58c9a23e32475efd2a555f24e5de823ec45c721b55f5f985571d2b918feb776adf1d2945418e070a9566e78534e12f2fd310b6d09de68444222153596d9161e030380cf13fd877e18c1386c6430568f2e87b3c51ef76f3f8d3ce722e1cc5c883e52e5a2b2b5c64ef198f606cd791cbe8d96ff5709b8569f6e5d4539e874b59122d48c498d322e814ebaad3558fc705724989d7abc32590b96380299274745ab61d2a6a85e3d648060320f9c8ba14e43bd014bdfb808d1ff6708c74fd3f7f0d959ba6d2e6a04cf6dd00afb9c63eca8e3d6c634ea1123a5b4da0b62035fb68cb42f0819f25fd5e7da4094eba7d4d9c8fb5c9ebb283917ec271e5b44f4c071a56500b8306f81832459d1f28bb1e60fa1d933986068697e1f72f6c22542bb872cc422cea056731f02401e186fcc3d595ad1794f75cc1827c6b784d94d579bafbb31ca7ce5b1042d40bed5d055e3953e7503c4a70d6e9de58c7c0a5fee0c101c91221f4d1bc3a37c8067d0a29656a0ed58b21553e99dc03320fed295c7b9df07d1771ac219cc5d315ab47f25bf736d738c4238016ba21d45771a82e437040730c21c0d9bb3c98c98f61feb514dbf44fe80fdc50b3453d4e4df41583337415c9005549b70ee16605c53c7c6ba7dc10d3ad5b6c2508d7f394f1e6ac239298b025095a2ca65ac6b3c25af06f60ff249361b246abf220baee93d770c1d55a90cef003af2b145ca5fbcf5152573a876cfe600b9f454ce8017281c1c67aee8a90f3613a4fac90e550cba3d4d0f1af843d4d9ef3411dbe0b69c02c80512af33b0bed8e68cd630e1bef9342b8d3473bf4e70dbdeabe3a047eac371c9c7bbed2f5972d54217618e0a775a4e059aef9353974914b5a30c52d0374fc4c6b3ec4a718409ebc02d46bb035f27b8cf186ad4772ad8517538204e6415c6ef2b43c3d76564922a212e3b2342904ab92cce63594d4ee59f7542bd1de35e6b064a20ef3d5316731f6d9e05c4b9aea3ce7ce857ff0dde0f7c5ae1f910899dfb9988d001cdf5c40100b9d8758e0782b5d6b781032f9cdfc7f6512f93751b3066d6b48e4fa54a07f914ffaf6a788bf53e734683e7565afbc141a86cd514a93e2079b981d35d6c1784d48089e4a2c55258df8d7e09213b6e4a9a66d9d4b52cc23d3c9d940ad833d8aec15fe3ad2035e999a5eae3bd611d6a7b73a54af28b1bfd44995330ce09c8761ed50a99394e43675fa0db3a57b833505c8d7a3d34711d14d2cc090170b62857357652ad3ad2d181e9e4c4dafa8d865d569cf65824835c0b39ed4e985599b28e7557bdcb18e068d5e5c9a672da217867bf010b9ee6dbf1a44fcd26cc76bf0fee2ca4feb5397c04f74ab4f84212f4116992f9d9b05b5dae1e510d9ca505fc919932a0d1fe307d4d60e482512937a601f982c7f4d84a8ae394ad166a0161b1c57f49d110677c9f009f80e18326c1eda5dcbd7853ff5028814da5702eae46976d9d125849ab52196ad70c98379aae4a7a14a07d63cbe7c2a0a86c4d8be172c3b19eded8415c40e472beb00501cdf72ad882580c8848647581b5e06d7d9732ba89e50bbf2e125562e14b1468d61b5f3c0f63af5b69e08e21aaeeba48a668f669a6e579c6ed967ece848d4e1670cd39b7a00623dc502d7f999f05d3cd764673f6ea454b6fe9da92f71e2a818a74c76838d332f03e13cf32db86a99c8a003d563682939feebdc490da4adaaacb371d89e4220a8a4fb98f7099dc6220665c264c7c4ba9a2021bd1129656391dac891992262a1dee068cf500dad56a284bca67fa946397906ee5fba801aed866aa1ccd5a2909d84ee8147327a27d7e88c8077a5958d3b2475eb421f7ec6a5ac898eb66cdd155647734d021509cf1da5e25d496fceda3a78651255b2804441584ef65d5ceb11f7182bb344c5d0bf21b0ec12641274184b7cbc2eb7fa4aee9dd52103510babee037d977ac5a9615de36f4e373752891222c60d1c28812ec292af34b4f5fa55350e8e2632a98b6859a7ccfe3795b9ef213d5263e64c16a288ce6420a47dd5641de4e66fd8856a84f19cdf27d92f3d8f65aa1e083088f1a604256b397481137883decf9c2452ac3176dfe15bd0026f1115e0ea1cb272f5b1052044d88357532a5bc2524c913672071369f89e5497e48c72eb96f9ebfc8c126a5ce13a428d85071e37a3be2798fc2c451cb9e3a320a0721298a3a94d6d3efb4d345fdad7f97ff2a8822657e9f7017725799785d63f5357d885c3396b4d777a6685aa572c4541aafe87d396d545e06f88bd1008a6d3838245b5a889b1f460479b4ec4b42168aeafd8319cf7fcaadbdbb54ab6e001eebc082d70c0071c845e0d57e746a75e662197ea3879f76c8efa0ee114634081e025de6e51d63bac291286aa721bbf8ca6a64fae56735ff24386ec5df67637d4a8fd38f6a2b7d2f3d35b43fb50ac5a8fa2e781be14e5de96630bb7fc2c219df8f04313a1980c1ce3cb767326a4802114a6ea1f7200c48c63d8244da8ae433f67f20e5f13e2a45aaad6e8bc3e8ff3cac42b1cc984179c92f9273df0256d812b3f4c76d95508bdfcb436854b237b2d70ead51a2b4ba2b0f29638506cc66cc69a3b94f49cd356f3093ef0b4213facd3be5ceeb661323778054974f034baeb262d6e5dcad08dffccdc7506865893a5fdff7a2250baf7219977451aec52c0f6fca90062bf0f12708cfe592aa933661b8594633a6ec19444df0420273b3ae05df9596a185ab30870a21547f08469f1cb9b3e2dab3df6de3142488041fbb42f2150f6b5387da029f7690ae0b8c8b9892664c2e0ad2018a34095e8a7fecda269111448d94dd1b19f3f8d5afa7c2b2307df0d7c62f9f90ea630ee3f9283cd18f6e93164af8fe0918ba748dad15eec6028cc6fbbda2b42f00f8caf08d1333d0c0a44df76c2ad04102a464d77a4b80174500193a1af72259b2c53cedad6fb28f0bb1740bcea2cad782806177aa764bbf5b7c3158a147dd509a0e489023bd2dd37d4509c2bff86b493e56cc8652a49c64ff2caf258094a5c6c06bb0b9a154d4219b60ed7cfced158091ee8797c4d83d25e1eebd1d3b3656d39d9974233ba5a9af102a6290b6c06f316ec50cb2b8d7440ea7146a512c3ed33899df555f2512bcfd47c5ab98dbec66aa90e199e37b3fac9e5aa364a3905e91aa07809277c5885a3bab86db41557febc276c5628ec40688cbf96ab1ecd58cb3aa550f14ae8f05e20fdf26cc552c41fc61e1c4ec4b389a8cca4cddc8d9790213b61e3b059d86b546ab407c639744c5794de3759c3e9e4e58ae74e766aefc20d10a716c536236c4d43aeceb1febab55b9cf8b1ada419cbc6d44ec9a5d222f32f46f67c7cebb7823f3fbc92f202abbbe38d6017e98f575b599f30e017f89f0de0303c883581da1fb668cddae28f2e0625a70a64cb5c3b2b6100d51a1b4502b7052323ee005e559d2bf37ab47c5cf9a5f02e2e33bad37c556bd11497fe84c48629097ad8509d7542c7c03d79eb065160a11cb5c59e89e2246b4baf9e50d9012e1d6245f5e4e40523e666ffbbe288d59ac81ca1aa15d77a61efb54ed5f827460bc19b2b423f80bdc015ffdb014f4bdb8bc0f49f5fae6116176a33ea5dd300414c9b85839c6da5a99a23e58e763ebaf1ebefabe9fd7c5529abb773bc8173ea7416087374969bf8f2033d494cb7d5fc595e7b42d98c6331e8e14964aa2c025e647d3c35162b0eb858a7656a61bea9bb9393fb7b86549bee9db8e86fbf89d7bac2f197ecc61ec6f4e41685d32c293367fcdb85b75f6812482d1ec8ceb5beb50f2ae63780ca0f4ed207556eb4a5fc74037d0336f35acfa633abf46e1b4b413ab10e7c9ae74378e1c973b4f76b80902d936f362572284cc9a5a8f63641caed945cfd1784ea465f807951be69910db94ce571c4362fc3ade21f7f86d4e57fb2188f448eeefc500f72799b20da754e6766a1a51f76952fff5441fa306b01e4499569ffb715dd62fe283ded605f6ba552600f694de8c27e053e9108c6bb6d2c44a4cfddd1b31079abc10132198c7e9ecadab17585621bed0a79729d346198ff716190d8c5cb8fc4a2f045e75cf0aa3965ffd0cbac9b02b28ce8a5d01ba315e2b54c41d42c47627ca8e8975b563d1574e9a38cba4c4359f7af2c82a6a0d8308e68946aba72181b9f21f886e1b94bf5e58fb5e9d1f1d1dfd7df741779bea6485014c9b2021acb96cf952e77e7cf50075182a912df2dd05fb4c4b53b160c5b2350191a2f6292fe17d864c26b7a0a6962b8f89afba9a7e98cf491cb70ca64c489e3a4d98a7908ddcc72022278a100d62ad262786184b1d5a81b5ab1b0c6fade591d79dd0473e973e0f4444aa6380fc5443ccbabebb901613cd7527b2c781e7a1d7c04978a01c3e863a11297cf0f84a57ec75f77a6d84e05e2f29e8996d252a3313a11081ce8c4fc281f6510f9ec1b5a04b96267ef0798e0f23ac32e8f49a857bdb135b15047767e4e02371420f7ad3d4908624ad3eb7fae1018c305aa86cf15c51b2b877318ccc363b1785c6b0b8af348e8c30e5ce2140fa13256791fbfd8ca597a57c25e5cfbb98d8c2defcd007304e89ea3dd6df52d55c7b5ae084b9ee4588da5c356d2fc8192a86357ac40f120b358177d2c0c8dfe1c25fdc4bb0b332309231b396576b0de9939a02f7d409d07a3ebae7d99916151be2b7a5edb3bb8b13b8ddd9b5175735fe305b6da0c8a7aea5c33f33c6e1a77192c25ca1554df0eb41c6a7d849bd6b88e1614444b0271ef5a679d62d03f46a9dd3264552f9afda9d862966c0fff55666b6ff4e46211bc0eb1739463ebf5ac57426b0b23d0b7f61a6799b4c4f5c8c4716840504e6b20c3ea15d900154e7f37595cc36c8c7fd0c75db2b7335be2660359ab2643cb2b269e60cef8a08618001ba9b33a152ba48b44058943cd24b39d682a63844cb57ec4002ba2b53a23fe10dbae04a07f1aad63466a5c47e63c0ddfb508f35a338b0d0c2fc99854d7d193023ad43626d3eef10e4758864c44588c11afbf1035fcae1e29540249dc71e0355d34c904ca2999fbd104c16916155d5a1948778400c92d435ffd078902801da43aacd1fda2ece1227c002faadc35a2787f02dde38276e351dcf1e6ecdda15a00fe99691ba5a8c15a204d74b335cfb9a9b84a23359bf35f219d46058b5dc301e99946094cc403be3caad305981e919cf17892224b40a02213e02507522b566840111f6925250e6ea0d67a9193a87601d59565a37bca2dc0eeb02442c4891ef2ce7b9441269ce100a4003a082fd3579ba5c22d70c38d5ded7905547b72f523b1d6ef8a27f01ecf4bb971177619f3d044fa8a947a31aa2dab4c28633c0ed6adac5ad9f7ea6358ac9ce981c4f3ddb3ee4944f5ce14572991c5c3144dbf15723c82ed8ec953c8006b3506d48cb574aa653b94439eda68a7925d297b309430c244d092ad57086090ec1911340d53122ed189ad108852eaf223a9f7781cdc507df4f6b2308880033b8add1d9b01a23d8a80b5798573a95052e7b760b30fd203ddf723f471850096c1e6efb87973df3c4c51886fcfb27854cc13fb5520d7c954e2bbf9103d185353604ab8711e71dc8d31ea0e6a9430c573147f096f9b3a0ba4fe11844df2fbda444e377d1ea4315941165fac0cf4033b6d3ea8d41d4d43d5ad785e78b577cca2f400822ca6ebda005c42953e699e77c450591be1a34978ef05777a0660b6a9464e2a9c02f6905d94c380290071c4f186b15e917da973f31af4b31c7a0adbc02fa9cbe1fe044969b61461e583c1cce23dcf9e647f761053604d6ba8d6a1da7d0c023b0e7fae3416f43e58027a55041bd5fe2bb595423f666dd2e5be08223a69fba82a44293c515f1175ffbac50bb28bdbac17fa55f010c3cbb88a568fbd81a38d6b9fa2fefa37f4e21062427500b911466d40b8c275aa68d09469ada5a25baa1976468c595e01a3965cae88c3ac9d81e465f30ccf331bdd0998c1e032d0e038a167bc2867c7e015603f1243169a2c2db1ab022ca1aef8596be6da598e2b204c136b029468421b49eda7a081b3f2209340a561a0a8d17ca8196b30f99f6a316f889a5bd3a6690236338c46db5a776abcdacbff4ecd5172d904c7168680f3e0b589d8d11a1c26bb6c9815ef2a5e47454a28684d947b94cf243ac2367998f51a2ce44adb7756f50d4ddc763cefdeb998f212e74f2bf58febd6c0011008cdc6d07bc4773507618f865411e308accbeae38190436bd25171d45f9bfc38286dc25f7307fd00f9f5f44370436b34ff60546a30b3d53f1f57c69fc9faa16957c5153396bedecd8b5564bcfd9f01a28f49db0ccf0bc218c8b422cc9451c153e71564b70e0d8cc554d37e4120ab0d6bf3ca786167dcaa22003d6b20a1b3a345e51307bd550aa32fedd4c151f9be27578151bd86803c609622b0703e9bedd49f564026a2226fa4d4757cb20d286520e93476189fd8898bcea491d3c3e2f87a9fd36f43d7f12d18e6b4ebe983fe6ec550ccce17337953978e44be10e0d24c24d5ff6ebc5b61e7319024ea52d29feea0e9ff2dec5fa36a417ae5611d467f391b1a24841256964b050e764bec2a10d6cab4a8924065af529bfa3c78393547568852e9c19ac603a6b9ec3deffdde568e3b010ceb89ce4c2ac09d2b1d0dced97c7ec63b07506ea528af5263c251226387788cb2823761604565cd9f2d3c27446fe21257797c1b9d153b850aa27ecc71db0f1e0a259be4e9b978e968bad4a0017430c07ce39bdadbc4e6c286160a4592a9cabe5ef25cfb961ebb2cd53238cf3aa8608fae1ca137acb9d2564043af789c16089c796b8833f225f58adbd13fcd02517649b0da3312a65f7de73261c91a545acb5fa8c48847be4580cf3d229cd9304915291effacc2e8691c89a19eddd8fd7e066bb26aa766247be88a8938df4449361992741abfd4e5c45388a23a8dd538b31b0a40154489b88cbc137f26a3600403e4e7e8568d8ac31e238cc16e77d1895c5170f9e69684826351aa3841a0d8362c123fcfd0e3a88428c77e56ca2f67b0474da0ca44d617a11df23e66a80d1327c98ea9ef121b6facb1d68210e29d56c09e72ae84c30cb7d9a7b41808c373856106dfec53520d040bd68863e54c66d040153a34d12d62901722794d96c6c4a0580ba0e3070dc3f9631bd1d0860d6db4b1cadfad4b5ca51e4a4485c7330e5b291d5c73d3e8d76e102c6faf663363420efdc740030d3656ef6ae10cb7f9afb40c08c2fceafe0818e6555a0f04613e2aa9faee599229b4d085167a70f30c3a2b857f04e07880603c3f2a59b702b04c57e02a528a03323b3831a53a98a65ef0c31226f48e375cd872244bb7bc8b69d3024286e7cc5b6239a04301a7d559b50ca18516ba50911bc6901595fc5a8b8e22a054fad2028b086ba9311add60230d35b849d5d20e8309fcd4981ceacb44d6d84c7a58a34949a99a88f2f08ae94a2091c969bb88516a852b454a14fe4d13f271e62cb10206315d955e537a1516607846a1400f6ae884de7b3e1cb752b84e001f0509c6cc45253dea004e61051ccd1285b95022216913a5a84d4314995448d1785f4529bd48f8b592b2d594dca358238cba52b7e89e0709c170daf129c4e58079644067d91e3d554e581938d08ad5acb7c6daac2b2d6c5b6eea6da27b70078ae76ea1a67b8bf4ee62682149e01de982af7de814dc77d21e0620bff3a82c473f00d08a7a69af40c0163ee70e43a525492395c9a18929d1c1a04cdd87d18b95761ed0ea5384577c67e7b475be93acc38e1f70158d8497282a889d404294146c1d509b0e07818c7ff15eefc60acf255fe199ec9dd4b4ab4c1b58a26ac0a53d1189c7baba380810cbbccc4fdad439d4fca04f1445355dacebcba1a34ea351f27f3b9b2a2354be311cd99c11083d75de212f43d26c4ca9a77a6183344340bfc4b41ba23fe2d3dbbb773f71ab0aa399278424829bbd79c5596934710fee2853bcc4478901393aa322fe46fe2a6016a3bade7fba3e66fd885c6528828957d75eca3b6b237ce3bfd023997679dae1a26ec2e5098328f118fcc5f4b9599441ade26c8a0c22c190b60f3a54d13032c19b8b51d01d9e938e32f76afb6b68441debda9f491353a3dc2ad52d22a3592a21a962b78f3ac50a5201258d86512dd3dcdb549f0783bfc09b638623bba0c3f319f4a34e0f22c81df50757814e1df920567553896008cc304a37c0529ba0086d024398e889e058049f9c98fa0bd113eb41695bce44863abb1b6fe71f4ea477183a17064d1923b513262a0629bf28d97abf306f91bf3bc619dc0c3424376868101bb44839c222f3fe72e36592c1e3f0d60eb8a4221c8216b89ded13201b00c36a5aeae6c82cc4802a66cb5cc99007207df526af636e35f3d8292d8b37171a1c9cd9300bab8e3be857e4e6330a93fb726e0142f2dfcb680acfe17be856c4d95fd97db78a89298fe4bbbeeb854d4f913add8b90afa8485b2378b92d2d412265b02827647ebf6420b5063e578ec084a0caf890ebea85343aba83cf63d54865c48b43935f4c4db366659fbecc5d60d6ad4ca3e83cf29f80096ea8a697f2dc12c890ae0988de216cc879de1eccbdccd023ef243791cd5bbaee1768fa12dead726be8b00f093391ad27ffebcaa388ce242fd53ed49ad46d2d804b66da6a8e3d6350750fcbbf76b2a03eabda4ce6a6149f92a0e75b17a6c2b9525c172ce3f582d81531a5b05f60597c270ed69462bebfe9ea1c2e8dac8cd532714e5d0f3f682847dbc1b4df3f7d4a25005ad2a0c692205582f70ae7c48bd7b6664cd7d58416cb43b6fee49e4545d7c0764a76bdfcf2f6d35f9386ce174a438224d84604a9a9a473a72f5741302c21dd869363bddb85f6f63bf87af54bcc55787cfaac950c1f015cd794c554de160025a6287d5717d421190db3d40a23be0f9482a7743ec4931b3d90551b7df236f8ee5164381f4252b59ba85c46837d41d950164035c95499337f94ced4ee4ff6bac825c7c67a9d871c5721093a53c310955a55001c166983205a4bcb2c747374a16abee060e26be8ad41ad8e3a9d417fdc2d2aee6943a92b3053c8b9957bac9d5383309b0a46ea2dca6873ed3f5a2345b54f3e50498fda687d3847faf377d45cd6e402cd2495a21d19c8886b79eac07c8cc04486945903a0e5d8f49e91062c14db4918fc62a898a64da2e4e061339f9c2dc69c707f19535f200bbb9358c4500644185ce095f5f3641b35ed851ecbcca634256d94998c1aaf4e8bf0bb0f0cc6bc797b8ea5db311f0d50c6dcf4d7c380a5052b96b4dad528b35aa392693365ffa4f54d1d4485aaef6e843504171603a932f61d291abad12f9fc1ab91cc361845894dc97bac56aaaaa966245c1900237a0df81e8a62c3a0a077d4312f3b5c206d169dbd91816c6b013eaff964b66239503181cc5e1a85d30b60d6b3ac5c3e9945c629b5dd054b7882fd17f1cbda26e49c8eaece3044e5a840951826e4157a3875a2a668c5855f67f465c5a131a46bde3512f6d45e13c7113eb3645a2318e3447643469199e6168ca86686e68f6a98b6058061693b9e40eaa2f6aa5ad30318c70d91f93a5b02bc6b88a16e80e3e618217a6038ddeca2bb753b7c55c5abc872b397c7820e58000f120c3355a7d24b358c35cc418592a60310fdf13a7aacbdb3b493e6095a298e410ca7425e9b125fbd17ec969b7a3f9cbecbf8247202980efd5c3c92207a83ac553bd58e9fab75ff0bb218c2530f8425161fbe9d9fec7a12892a5264cefbd939c6a31c76e61616f233c5a292a8ce10a0c5313ebab19f7ee23110d0976bccb7158ba1ae1340cd9bddaaa843f46a2f2247aea9c9aa078ad63e3bd8abadae71b3087c215af13215f1b744753b18526c015e7b528a05e86c3024a4d87e50b1984e3838be7ae3a7506efd3d0d68db3c6b2369abf0897742edf6c2315a793f6d939e61cba81bcdf96f925292673805da1e1bf5bae2b1a24b4257edd33aae02ae844a94b930d511ce5d702da4dd49e368db0afa99fb289dc6f653ac3254cca2a6a641dc8e28d202ae98995957f70a1bdbfb294831bb1f76babf9b29bc1eb1cc1c107341cb8aa5024febb50370ab166997e2734fb4be6b461beb8d3c6958a0c04f41f71cf84f90b22bb768d6831dc44af2a48819a95332f58a13edd14a94a17340d4a2fe784190508debe583c11cccf555fe8ece3b04cb315c0b333af202e0ffdd2c656476aa797d478bd797085db5eed1fa22ac7e593e85539c8b12a41964ff3d0905bd512e770ec865be340fdccf86e630264ec77b120f81c4f7451addd4ce4b39df62794c39e808ae4b1500e505cd1f33e90e87d98e0ca0dd5e74777abed7451ad98ebc1e5289656873c4a2eb798bef5d9ed2bba64c047522c0f9f5f9d4c77048ed407a4be1800e65a8236d405ded7b8fde41c8d540faf1f6b99001dcf982f56bc6f9f4df993659273fa78ee871cb784a521a12b50a9f005d4cc07473c86300f6f89dcf32e283d7b7dc9172de8412b5c537007cfd12aece94891e83c7c56ed90a11087400ab5587854d1fb812e6c9b6334d54811fb06e729ff5e33ab30f19354e985e8fb2de819066ce3ff4cf9e05401f9a0d578feeb14559c29e868e7caf5e39be4432bcf66db1e1642c1b4521e75b54596ba3f3854226f3057330370ba7ddb70b850810b9c971357d9bdfd5a0185636973e786a93c6f5617c7595945d854977c47beca0d87bc5d3d15763ca57af1751dcc9d5e81790531b0a0ccc6ae36f9f03b313ade9ae9499da638756b9c48d9e4c19702346c113d59c6f6dcbc48526f827971606d64242cd53ce6a11b4043900acfc313a74693e4842af9e2e59c1d2b1e3ae6162e78dc8cac3c506fdc9fc10bd42dc3219490d6249c302aeb4310fbb851f8b2f90d4f435e20b6e8818a0709988b84cc3ae483885d272c2114b29e8d8cc2796dd27b1d4bb7819b35db82fcf9d1bc31e6b3add913b31742136c18093d479a73c5cef208d01496e24018f6eb76742d7f56229be88b39b5872c495784ebcb75362c319bb7589c4a6bd62e7d1e195472d9cd2b805813b49bc67c7ad9b00591ce268ab7c3a03651e5f76ee211e71d46467947030473c8c9cb78af2c33f76eb31cd4dc663a72eb4d56f2c1c5254b31c3542c6b6fc030200735e978efbd54d52171acfb558bcee2f173bfb1c5c578f2a9135d54657faaf75ac1f6bb3a98ed85ffd7282b890dafcc05f6516fb54d503f8aa0c643931503ace3840c0e905953c9e1bc5eb59e929cfca66de2ecc9a40aca49e0e736056ba2489ae69090f1db4b1508eda8d358f38f45080f652127608ec050d456a01bffd5986c13addf1e746e4dbd4301042b6e92057163f8b31262137f3793f8a1b5e81c71332cc9861f464d7286cce63cfa47c664e3eccafb7c31087993f63fd0af8f1c8df9ba0675350d6571dd268fc0d9d355ad969e7cc9d9fbb7bc911df91564aa5045dab2725ddf02ceb51ec14c8ed40b1447d518353985da92d7aa22a779459a5d2d959fdc031b690a3f05ba72ee8a951ee0a661d1e676782e784b02a7c93ea6f9ed4e40e5dd67c363bae87cd5c7bbc54d177b01a98724ccc86a039ab561c66efd5106f0dc0b2799a958167e754281e77014ad6501936cf650336eb92cf8ef5a1cdb7f8d4b0b1ce0281913902b502e535173a702d3c5e98fc8f1d2b40349778ceb97078cd8ebad996d9486756d51e4e29e00836b0766c60f2ebe23ae500add3c406acccff89adf681d80b9072046506da68125c4aae15fb70811ad6ae69e90defd85356e9ccb31438bff9fb52d57f31764eed3d1fc7af23f3558cfab9f89e528d5fc7f4ef38fe16d5ff2c0830721340c10b6c6ec11bcf7ba87efa60e9a39bcea6581f91ced4d61d8aff04278b07dc34f8d980f0d1923b16ff30f9839aabcd64a6ff96158203fdebb88323063cd2fb6ee604bf0c690b0a217222b9e9741a71c95c08bde24ac481c583913ef2016c5306634059370a9217738d7e4901d717acce2db2eb0a715b02a2f0aef1a8e098d26badc73dc13525537513facb281b8c8b8913a6caa10e45565c8501d16dd5ad6c26d0ab963945340429924838748504250a946b9e3e541850034d5831060c5c6a1149f1512910c22d5e2899796fae9db521893f6c6d7db89358133e46d45eac807c781bd4450969073554df93e139e71203df31f2ceed287c5bd4bd7644e71444d32511b9430ce93bd648f3768af8026581b78e8a1f002bf4e923abbd614755793687d3bbfcc08568d346c3aef1c63499d3d359eb17b17e7da71f4e150d23d2d11827d126f57807a22f20cab8314ad08d2af9285c4eeff2131d444f1fed748ddbabc99c47bbeeadc9aa296f3dbe48d061b29375b1616c4753e7577dd283aa257a715749ea6e7a0f1df113d613be3378253bc8e1bd7c9bcdc2bc6e44ec899d1b5fb18f71686ff5a68daf7a33d17a0a1e5dbfafc2636f4d1b1a1b7490843a5299c39f17ec55bd8921bbe67131004fde6d50499a0fe7bd78e5ff6319095ca407e733c0d262f348c72b82bde6d4baf92d7a43de7d444babfaa89054f80a9184b0cfeb2ad3237ec0ba1f497eac7c80a589e827b11db1fec3d30f291e18fbbd78d1e36f7a8bb2627382e256d1f0d0e111c326375bb8e0038b2b2bede6fe89654b5276dedea9573f51fcfc7e2c925b96c639f18789907110c45be30ddc8ba0e1aaff7dee99c3df1d0064cb42e1f81cec3ff0847e8440baee551786a557ef380696e6d679761364053c3a6badec9eac30174a9de3cb17afe27c1e8f04352e6c90b0011ce12ae1bfc7c1d2cc58b54aec023aa74183d872f6326b28bd356f37d5b8916b7b1f033025bd89018992933aae5dab09b4303616f40ddc900108929e1d8fc33551bf36cc8b7c57258ba620e8777fee636f0a69bf3d8872728d8acb32b4d351573983e56e6f4ab6e5993c1ef7f2ea53d6287a3bd76eaaa5890bad3d06e88ec9010085d2994aba6b0c0ae9af57f750fe36fe76603bec6d51dccbab4f59a3e8ed5cbba9a682b9307d0ca03f7079c41ae3daed25c0be61e7a20ff2add69bb8790971d28fb18676b3f2ec31f620f92bcf4f25ce304a2a2e2f06fb429c9b47e0929863d13113a22f32e4307556d6a71df862e7d509952928f42e917dec6d16c339b0ab9fab2078ab4fc1b6c0b2c219c78260bfe9b4caa5d48ec24f6f0db5cdde5f9cdce1a203cae586f08109eb9adaa7676e8a70d03828cd6b29eeb427798ffe332bf809a1505eec9f880f241d2e72ce9bd60664501b48e5d546ae9bfcedc2c2ebbcaf66448c7406dfb9f37385d73ebafb3edd5a84784a9aa156ab488445e67eb3bcb25bbefdd6bd1363c819b19365848778f427511439156ae69c74a71bdcc755cb736e2c1f46a7e901583734bd4b13e66d2ac2ef46c5f41894c137fa960f0fa0d75e28a0f5442fdd037c260589db254f29972e2a8b026ad0552a556de526605d59e67802c25834e9c9656de2f331f9b4ae3003226e751d3088949e496d8807e65866ab99f513ab009cae5b79b5e08cb05c15e6d5dc8e2febbe1f3a65246c18e06723fa9938572bf6b9b9a7ba235d841ec279d760cde99e525f3aa988ebe4d3f803d17606bbe9960095481769ebf5cb128214edb22a503e3e750d08ebe11bb897d87895656ed9afa457440b18b90fa9e1982ac4d7f8a56069b2fa2fda01421c5acc5116d78a1ae74c299050b1939584a0587bd3c31a763c43818e505bd7a8e3e3bb50b461f1e394501bbb9c601235ac2fae56128a5cc3a308d0338f1b26ceff2298fe846927056c9772f464582b325ca9220878f7e1eb4723790a16919cfa5be9e18cc7bf8c6a85f315e96ae4d0472b0fcb3c69515a8389c1754f621ce7082fcd78e755b02a76e1c301fbbe4923d4dc10109fd3cd14d697783590c84ec9440b9e72c8f74b6b8e8f5272432954cca7f8a880c7992c86195acfa5e30afba071914c7c9b1ceee2f0786143b4731e179f3b25efd8c94c308adefe52095ed29416c6ffa96e9b17093d41c4f1f36099bb7d1d9859ea5b64373ed9d7e5c3be2c8a67aa84dca528042c53ac12b53145cc3b0a2f818a80c3bb97123fc8e2d1bb64e84899cfb27b4980a714f88491c1cfe25f0a99c8ef9d9150b9fa82136a4b83496bae08289ff3239e3ed17334ce91124929530aa0554067266f1f47bbb4cf4e6a18591195d3fa48bd53bd89dddc44c64502185c2e65beb7a20e9a9ca2a0f55be4f3001cfec9b32e8b2299883c6866f14a40e779425716c24ad55789fec30f048e097d3c7275ecbf42d354fc473e918488ce9ed11434fdd05bb555635316c5de3b01c0caee75c901ba04253d6b83326b56a40f4b2fc4d4b64a960ed1e1531f9efb11e877d91d9ecb315f680743f73bda555c104dbe281dc347015ec162142de56b3882476ba541c295baa1f245a3f8965c33c0b8a7d058327f2ea38046bacb9b5cb558085299ae1164f91c62017057021cfbba7bfb53f6186891e386d2cf0947ace6c545fbc171abc467d719bfe51a327a07bfac48ce78fec4f532f550fcba500485b2b0e1143bcb54df2420dc93c208971ccb620a3d1963c672550fade247e71539a04fd11f2a20d42b28438835193d568026a14638baee7da902a324cab838d74f08e031ff540070e219364625348fa4801e2987f848c64c10819be02d6558ba13b1787b9d54284a5c28a627c8df9e038fb40326cde4f3b54633778495c55fa3a04afc999877aca5f5d1386e70fd6f074444b6b25582cb1bd51449dd1d75b67da9d7bb09c020b2568cbf9415d0ef8b80ec77dc3846cd5203be930ea4a161662b21b627862ac86ba478e2fd5714ab1e620301498806d222606e81a0c6a09507c1f6ae5d0cec0a8f8f731f50b46c40bc5035ef27ec926743a6d41ec89b9afa0f75612ecb39a4a66fa64f31079f7660f9030ef6282aeb7d1f00317c62ac78ec0a2e8dab541f9040a2deaf51548205ca46d4b9d7e8038a2f819af3b3cdf85ada1bfded74a0bfdba05b49622bd1af8e73a745b82a164c4a8d970e7c567928f746b8ad77a36fae96129bc3f15ea7341a8d392f94a23431ed1948c03f9039b35048c2376eccd5895432f4c5d280efe39d9fc810cc8c9ba26d834637a75a9862d42fba06e0f9c3714559a8f0cc2571d56ad78a56f25ea18c8778de4cef3b0bb779954cccf60a341414bf7cbdda2b4758b78d08571d785c0a93781cfbe4e0ca544e58c225706bfe09d836d3729b10871bc8af6708ba52ee729f7e0047cde1866f4e674d71a32622253482bbf73e9e856423f848554f27b5a231cbc11260e684bb34c729630cb3ec447e2acc44e79e0d22a71d1388c4516bff085261045923e29f52354269e7410252102bd872e80a63b03f269b05d0d9dd84b7faaa8a573930054a0b7d0bc48866fc915c334601e563f0aed4afc00013a032f552b0010aaf5d586c1741a334745176fdcfec21dfeca2a1f05324456734d2870b22263453b16a974c2206def2b45ae03f486764b5dfa260514a4b758950a4d4010e28a3beb2960f59ab2165dc3a69d7ec9839b1dae0dd320b58f096ab1f3c2a0dfe3b8691c82a6c93fb1662191ac687d6cb669a7d22aabd9fc31565dab1592d50ebcc8225c1ea641590a5f59b9388359a7d28a16ad4bd10ab27591a21a9946e19d77ef89bbeed77a26147750d7f8270ae06cfdb1114da1088cb52572c41f5a78d9fc6a1a7b09456c310b1fbc43eb7c4a452455f4e4b9f43a5630a0a47d6b31a8a5617131108b598b939b2cabf5d134dc6fd938b543f3a046e35a67721bd07caf20c9de41780a91447f1d0286c8be36da445e57f1df0049435b6f15fdc031b5361cb5885ffa827fbef1b4604a55e958d94ba679483345cefa46ef7254dc6173a239acd2c0afb2656093afc09d3fcfa5bd957e535c8162b924f20f68ad3a419dd75d997e38d16f63cc210dc527ad525cc8756e50613a4d7b12defebbcd97f915fab476a4fbba0f1a11fba33f3b49918ba1b916efd226201a7e501b1c1e019d6eb87e38d0359ceaea4a5d9d6ac2a1bd88c8032aacfc6231a19f33828b8a30e7da33eead9c42db1e0c9df4aa0cf70728dd39d0ae7cd28824f9da7263357c5ea1c229cc8bcd4b1a37a4abe9a685b47345db086e580056638ded58698583410550410925f46850f7b67bb9de5314cb1c96e8967c93f3ac40d9ec27324ceb5d459782a3f3fca8dd224a21101997d7e387ed0a110faab7886e4a801979e90e92b2724e1684c7e31cb7f5fb30974bf7570fe024f05bd47da63a098c0a1ae7f158181b23718ca74881e07d4d7cb768f75010b9f60cc523c37b70827aa177fe1c3e7c166495376a4ad52a85426ded80427adb48d7a759b8ed467f56a9c1f04e5327bb65ffee09b49994d3125beab21cf7153e138d581b9651d2bbea7420f918c7e1321ca4f8cb15b0e6e5503e0a9c00f639d9324a0054f188fe9988c701f3e11b39ccd12d78a8a3dd7cc6c8b4f4eca5708fb15da2709ac56e4d05c78b81b446342aa99231bde7da92a5711720cf4d534dac0eb0f1d961c9df7dcadfde3208539f5601cf8a356bb0608d9b9f1103373d70ffd75872d3f362c75fd53d895d47ddf1b205e69c7f783b0e01f79fd90c8c8fa8d5206384515daaf76c09f35bf9b070e2241bdba7508eb3cd207c61e49de36a7fd7c87f80021d396cab4b7896394b7b0acbc5d15b45c9d365d8065f9e4f98c229539249b6431b9716e59fcca2a6c698cd54b58a7912a6b6d2353b4ff97ce7315a3a4c23156e5067d87c9f00a37b8026ce89111ccd005faf652119b215347db486a2233c72b0ed39e9c15b24b316bdb0399f982840d69f4cc9f4151395d09ba1cd439ae09c5b0d64a7df2689081668b4ed5fd698445ae5f774c45fb2d09876fb7d551ec79c3190196d708d2728d363b9e73b0c3f8bcb40f82a7dc3819a39bc895629fed805a22854ac29676f1270f40931f8268f0c56842985ee1225812a2c6c81f539ad687f14b73b61db356e4ef97cd75f43e29350af20a6c5d630df6c10367de827d1ce8b869a8243e05e11733c57a3f535a34aa1054d01fcdba476678a51434d9a00c52af8481743abd94ef65efeb9573df8126047b6349b1e8a8dbeed335c24b9e97a256c14708bf2d07bcba0c201092e210d43212cb559b73e39dbdc1bdf5a443783572b331ada8a6773fd271bedbf061ba0cc3f711dd67b024557baa23c4a4d90347f91d94419879598bac9338962bdf5a2b92a748c028c5ec55afe882c56804259612c76ecc138637018a7cd6fb70a119f5df85f6d0137bb0f13fb12e126442074f382ed84e0aef23316c943671efb217ad0d0bb1a2f3cf0c6cdb726aa02a47e8b63c11df32dd4b1d638c15494fffc2e1e829fb6ab9a64943be845e5c4f6b1eca385368d680596cc8f980457224bb68ce42a4d9a5182caa4dc68f6db837dfb0c7504a7ac239549221ebcb6bfb1324bb039dd7bc841160b61d796177633f4db8b5afb9bf10b1bb41a58b740ca32d7737e2c30922c32e48e0ba6bd3415fd377f7ccbf05fc7208ce3b0033b78fdb67b771634c6503a9bb57ff3138e26349dde1690c0a053be3c334fe98c34414bed7de1c8b2bd3b2b0e26068b0ab9d5a558f65b693ad9b552e34d4cc622e56afb0ed9baabfc57244c3a59037a037e29d33fa0b1f8329ef6e6e801d4c03919818ed75def67c5c5fb755404425a1c32f51f5f110eeb01de8ed9a1c405728400781d9d56ce89c210f23f326bb27ab455fc65c86b0fd1595bfc1b2e6636356bfcff894b76b4cb9606676b6950c96f31472c53f7bdb259caa352ebc5383cb803cca374fdbb1a66f4469247e933394c105d4ccf9bb9cdb859591e25cb50b2790b03728c1bfeb1c73591944a0e8e280cb6b7fb003ae21da64aadc7e7ce2a5ecfd44155f14bd8987d9a7103ac011723ebc233316b346e384284ceb9e9c33e7b340aeac041712195361bfb69904d859edebc85f2916be559d232601f8e25876f67186241c5529b573fd5489d6494a16c9b2c1dde63b8df62b67f9e0011cc3f0fd7dc61520a5d778e45366be96679f45ca501c4e64953753ceafb0480fa963d6354d72fbe91cc863d97fad9dd8890c3b10763c23f90b2d921c8cd5c4cf907b86c1a5bf7718accef6c13aaa3caaf043e0e125b522350a4bc2ffbe65187ac122d2ea693ed40ca57e110329d827789ff6f32df2f13e43514dbcf72505b9d5a1e8ea8d036caf726eb5bdace7bb6ccb6383b6dabdfd10c63ec3d2218427a928210476aa9c3be51af1fd8aaa94764a94f1dc8cd955594ce549cdb1c4a6f090970ffeee0085bad1316cb83d7e8073436ddd9bbddd5a785d00da9c65a0bab034c99be20a6bb0cc3ff3826d55b88a6452d4e47b5e9e4d2db8407779256ffe01dcf73059ab5c3f6ecaaff7786dc598b93d0b3d71ab27c52d8cad102b50cd70ed576681178a415c073a4841854c7f04db4c15391fc6e0ad6e26761817d054750684fb826fa45695f003c2ad3bb37d318a98ce8ae5084334e9568e01da601a80609782854b003ad8565c15c570ff632e05a502e827e04b768284fa7190fe429443632c975257efa6984c44ef11a27d5c65cf803ec93cddfbcca32e0ae6b7403127c094ffa47b40a23ad69e248c30730051a6da0c9dcf7d2515d2ac0ab6595c3576c2e9798331b64a88edeaaea2ef8fbc628d44a0f9ea0aeab25305be66de3c3e1337a2cd529edda68db9a067442329646fd325c4ee888c7386ebaccf21903f6ff3f8a2d6194f8f2b3f4b8fd95389e70a69bb4148163f68635c0f60015bfd369da5e999875e2e2a4e8ef0288ae8ac1a49e7445a093cfd3ec268c79ac85f8e3083ff9f5b59384ca7e7f67a28d33451c39e0aea3e838eb48e38d0a5a61602259dbc04baa5b7135f9c7d11f74d66d95d187cf48a0f2c564ffce19cd0156b8767d6a4d6be9cd03be2b73629648d637582cedd5d6a1c2f35093c79aca23f55e242afe94dcd8b73faebf5c3221c8e32b7cd527787429028b8ac0c2c046db9689be7f54cfd4d94436f8e907ed419e4d643ebda5674101851565a9456d0b4874620dc5c1e62bd51ae31f5df29bd330942d307f81d629e9472d6e8a9a795516e832ea8ad837a5f18ae353077377b0236c785397441e42a195fef16ae2b8413358a56264a228ca7feea7757a5584b733af4400eb2ae39a01ef1ae360a2dbfd00164b2041ac54fcdd15e1e683973ff707fa1657975751c02981ae663475aaaabe1af572a429a72eb13ef253aea21fd7afca517edb8d36db41672094e230c30bcbc5699f53716cef07a872d0230e9b3264a5906200053fa79ea8605b5fda8c1def33049d27b976c8f8409e5b6360d429861087309cc6685627792192208c26f4794356af46802880344fb94864114a76cc70575f6574c91991cd621b2356aa1031f2691205c3325b51f5d1f2809c67ea2e156bbf8fc73a03e744182b223835cfa58f3d6224c03fe0668b8ec802b84b462d84269c7e58d6aad89365f35468c587dddf21b0e349a442cc63c5dd5e4ee55675f5e916d99992624004517660521f32722c2ad91368b78a490974f27e6ae54b4e5b43de16c51ddac65b65c500d7f385e688b6a400b2dd716473fd544b745c35f7b9fc2e5b8059328740077bae7f3245cfcf349c6935e920fba6266e42b3ae72351e0e6658a96b68e5371ca5aed24e2d7b0936c80c77551b38872abab32526e08455e4a6f5d628db4f2f03a1597de23abf6f1fe796e43401069a10f9bf08c5fe628d5ac2fe4b318a7c3293991cafe58c55f52b73b30b5d6311d4f680dca26028ff87e32ee4a8c87746a5fc7b8bc5d0d7b84c99753a23e4a64fe60481d2a442df6c048b503e62ea42379d168992fff7ff55a16fb63c9c8b59b16c607855e07d244b19aa9ca2ed4a500c4876db5df917c365451e11f95fc5320c8f422eacca9d47e0cee6bfbd41f83b07542a1687294e8e92d645029f6d31f2f8f3e9ea7a8dc9e3adb634bdbba841a53c19ec65a68de108d5efb4d77e0304043a9ecf66d489b854a5010a49eb86d98f488fa4d89e6a72d4b554290b47717f49fc348e573bce336b8907c8b4eb49ec1b040b4a30916779d06b31379e3b918337ea75e4c6625343d76c2ad6475768fcb2601ccecab78223cac5ae69a81011059a00c16e08102f8c8c75e0a691d1200fc95db2356f0cc98576b585df031c1b490d46b5a4ad5dbc52a04e86bf27a8f50a1f4b82267631d95af004a4096629ed9fdcee0605d97cc65afc2412e0a62002bcdd430f6e93edd711a28914d25127218e874c11a133aef7563ff10115cf8bc1fa02762704f4282f5324fa72c9cf647ce6b46a34c3ff308b7b7e715391024a728642f42091a0f50161e0e4adb83226866a3ab36800e3f054546b78c9be2d8a176dac69d29b782faa65582890c7fffc309aedf3fb149e8b6999a01ab70ef83e2d8d2236a0db7456c0ade297bcba421a6ec989d1b156d3fd129501c9b7cb54e041e766ca6b418ab45937729ef81d060703f65019836a2b195a82225ce0f5e48194862fe8ea095ed7d5643f270701025c807338da6878c22908f980898544a8d50cc0d61ffb1998e33b63e9f80c0827b0071e948130c772ea481143261904734fe1ca06b536e370ad2fbf621949ccd4205ec86c5f2368963f89dde81bf5e54ad83a3a6e804fc82b03f58749f5ef2e7c9effbab205f239764dc26215e617601cb3af4be055bc03e0f5c9c8481b786f5d06c0f5109d21b7c3505ff2ba1d325141430c933f624940b8ae1e3b97851a5ece3ff95fe6f3c2765d69fc56962d8efe1cf00fe99ffdfd4ffb1b4de8b0bb4aebe4c7f425769835aa60cc029a08d4618fc4c4d18affb0589a9b429ad90874c7bcaed35001fe84833e391702e563cd104e44b853b0de172d87083eb45d7d42a98f1940e018f660c83d7a39411f069cadae640cb6a854c43568d066e1230a8ac1e30e361131072a8f98876b96a1f99264ed55cf6a5d82f4068ba1d09b07438d655ee42275dfb9a2c6ad8b738c7da090cf611f7079d7be6135d4a85ea9f8114aac2f6b3f8ec7bc291edb767a12cc902118c5bf97a2b60773a7854f6937e85e949cc0de3b0f87ac2c5f0bd6606d9c53a6e7e1194c5d246b0b010b797c8978c0e7008c69e89e6a620755e41c605d2f4012a3939daec817943ef03cbeb5af1e313b880692b889b0286f9eb2442f1662ed72c8a6a7716c2a9a438ac1e3b15162597a8ba22c6f16707641789ba49863f2d8a0481bbee6c3719d1432236c36f4222cd295065b4e59f7305aa23e19629cacf23999d85fd3cfb3d8216d808399227e1fd0126d06a44e21a30ec8d3ae5af45a395ec0522b62fc455bd3a1edbda3b7df6565b0c80736eb6581d58d363c34c0c478f6aaa42d756a4d2660245a576e769afd4be16d7f7cbcff18f2ab7ada3fed1d45637ebc108771590e934835cebe905c79932bfc484f0153ed047a2062ec8ebcf17aae62920cad72e0814556f768265b14f8d6e12a25aa478e80bf9606cad318d8d01d93b7c07248d994938721e2129cde69d2dce938cdd66294de8e23b23b99bdb3404dc2a92b433aafd02cebbed095d3b86157a02dfd6a6dee879206f1268d8c3e991d1bb5bd0444bb5aba9e96bd5119454dd4ca1d380796b83ae57dd2b4fcd150b3fcfc367480e2aac9d4566e6f5d7fa7a29065cfc4aa2f4cdadcc214f28f73970a1f80f0b69c89162dee45fb22fea923382193b64c8630aa12bb0922ab00b1c5d082d528c30ee8efda9ded55e06dd20b188c297b8e1048469b788631765b7d10393b8bc2ca1d8c6112fc99348e734dd7f64727bd9237df2ba1a0f3ed2f81adf92b3f49c0f6fdda195fe049ecf63bffa90fa09c279121016e6cf32e0d188ff33f66ac2a7e7e349b48394ea10a6283a7366d10a7df5d24f5d749037acec1377b7675cabd3f7c883135334f987fd8653eb129bf84435eaf5c2ee647506c0e6522890d0850206421b98ca0cfe3806d315879b68ae109d6da1f08ad22ed3455d533c7d575a5d89677fe3e09857e32cf01127921aebe2ca02b999ac71655ae5b5098931b15e443d58f2a364193af032e36367ff57a4e947009ab45553e9ab6e0d3b756c26c00a7a6d8d07219e27c50c9734e4024e124e7c6f4ad8f70b486d52d9852442e4a5652adfb5748411ff9d99d504bdb987fa7aeba97713b88e14b703c3b3c96eb4811d85a800ccc0da9e34d090fafc93e8645fd868b6ec5122d47e04387e84d7c2f34592bebc61cdb9e466e844c30ccc1ab2cfbe847dade1bac1507d6b6bbc52dc18c1ddf35858ad1c2078b3cf6d00b03536036a94b02bef5de6949c78e6f43d6a62aa111937f73e3ce23fac0a2de08561fe87c62d6c74388d41d56cb2b7d65c4ef305ae699d57fabe61ea5e5a22f6bad5514aad2c569577accbd9ec43d599ab18db3f95e4f7e5b5f49df477553714b578ac9428a32517429e5e6fd8ea2fabb1656fd558d300ce712f8368c09884deb8f58738a47abb3bd0ac0711663e7d9fc2f775336cde9a8fbe6b34f97f35d076a3bbe8bc6934de07ca7f945740fa6f69869b58420018e1a71cec39520c6d7b22dd50a3c79b12e89a9341109ee22da88e168dc28e6dbff94eb354b81c593b8d8abca2d20072c0f2d6f857b12ec83df3b6aa4a9073720854f313bda594dd2bd43e3711d40d2a20b8e2a63fddeef7c2325c15ac5e65bfb4ca7031c37335e4becb4a49dcfd9fc63b793d1b31ad361439349b71033550072cff7f0f23c92a90fe12fa72044413b48d00ac93a6ed7e6874c135e5479f51f23afee7331b40c3114d3dfe04cca5e8fea49f5676aaf78d74528a69714d0104b7bbd2d9c03d980200a025e3436bff8b22419f7d469f4249c0f0c117d575420e34f05cf87518d0b948da88c0e9ef094ff5cf4cd7742d92df181dcfb51437b9c658d6048ca1460bb918abd66dc1da7165edeb30853050320203a605391723fed550826292c424ed26f2f727aafb1b6d9acfe702d17035d225c1fa3684ef326a22241384e6286df70f43310325aab9c2425e14ced58061b8551a03fa67039529b5067209c20acf26c7a7512d56f9b97b58986a9563bf3e090652ebe76c782d05ae03a2aed70c31ac76de8ad790bcc9c03de7c8f11c603f9a7fe68cec11c29b56c01439da1bd05c0db22c2d639d6b1b40bd44643eaf7a32323a1e532f817009634447c75ae16980692d11a4b89f1084973fd4bdea2542991de5bf040ae468b480a48e5281540e3d2a45b4af2e0261f449c846417a2ae2ccd17a143b2595140d936f0092232701472094aae82ff625f686df0128e1ea703ccef7cf77c7326d8a25106637b0ebd5ca4667c04d8d632dbcf2863fe09c02e78f56c10c1897c90b7fda212b0ebea04550bb3c3f96fbe028876b7466d53221652fb2780fe2d883fc938eee1ee7c15e4665988bdc30840f410c00c34d5430247e1d4423a7bed70cce5fc7ab07e243ea18f93796f0006e6790a71d2b1256e83ba165b6133a6b3e8b1f5b7dd1fb3142cb5628063295c5b28c57c554bb7b3572127edca7538acfa5c9f34ffead8281ad6c56915adccab5baf52c7ef13905bd17912ae6ac6796fd1cdf0156fd39dc54e803dc2bb84c9533199a3c266f5904e6e6bdef532371db7035513a7ca072e505b399c5608538092c6604f3bdeb84d9ed017378a1ba69f866d0292ee6120594326966f0825795072a4e1f5063348a73234190bfac0ba1e02154f609a746e87fa9fbbf9acad11cc4afc2a7513c2442a2cc2f8b4f43eea9a22593fa9b5edc1e279c79fd603ab2a02e7d2c5cd89cda200c2f6b7d437d5cce773ce7b585818286e3bd6683a591de1242f79a9fec72b1f82363b082bfd24397555713886dc79a7467fefedc54c16bd6dd8d3c57cb075f48914ab91c34a6cd983098212eb8a6d25c268c2dd7e490ea55eab7ce373c7d4e2b369769e9227777209516b980863f15f39e085978121b5eb95252090c102202bc92d8dd91eb8abe48b054b1ca2508f9836ae8c969ac3debae6028efcbbd8e0b0ac05285a74dec9108d09451b573b7c27e3e67fe63a40403879693b2b9336b2a861a1f93c055c9f96226a1a8468c47e267c7291ab8c36958c643212795700dd1c25f337e343136780c55c56efab3d5b33a4a6f956499ecadb171a51ce363b006dbe9493f7cdd04b502789914dfb81c284757f3c899654004132c483587d0e6e08a0a27d132f5a982639f57958882248eae02d561dc62c7dd41e05b320c246f81160c075b0987cbb8f1a9b97186ea3aca7ced3b67b9408fb365425b84090db189b13f7178fad1bb7570ef2712cc20ab99191d0b5efc8da284da81cf95cc5240f9718620ef4dcc8641d0556b0d53e724611cb98279012fc468bb976e4fe33747aa7d940aa79698be6cc39166dbac09fa2db9b2e2e06ee4fe119d9184a3a18426f06dcf3e6a61f02a3e7a9563cbc08cd38a8416038d48de43749e67cf5ee9ffc336971192e351bba46d97fe9f2b22c320b4ba497a9b0da75c2a16a00f9bd166f39b18dd18142767869ac7fdff98e62b5fe8527a2d2ca239d15919ad14efe2fcde530d95a452101ab3697e14ea1a753fdd762c795ab290619f4b3d67e675b65e91cb58961473c1213444bf9e7eb12bd8a0210091d9b801e891628b18c39f1c5c9a836f6fe443fe2289827eab38ab966c0f8e1428f146f46065a3e380d4ece8a307330e282ef366c9df35fad550a939cd609a85e70bdd2e510b46824f198719a5a3703fc9fcab4b8d6a401dccd6def4a79e8c30ab141bf165de0f7862980612f44bcd145a03ce665e1f5a4ff28b5a2409008558d2c8c645ecbec77ad125692025196d03ce204b15ccc9c046c1634a999511c9fcd9df1ea27c170526ee73f090821927fd9931182eea29499e245ea9d5a53b09543bbefb6d0700ba759b63dff17f5bf85fb056820712d66f2dc33264d42c00561e9aa521fe4f51ebe90ee38a1baed1c01d13dc22f908e968c632818c0716e6658134f8c16dd4f154698d6140787d6ae5b701c8a34f39091cd26eacd03307f19f8467e5899fb1e15e4b3b1b8709e877ee46de9371efdbeac6598552d91dd5f04bb0481e66265515a0e313f5633c97aea9152c6fe7a1174af16cff0412a4fc109f8b915092b32878eda9d47536333d4b8c06f16b9ef656cbcaa1fc6478664b8b37f6c412ef6428c76904f320edf63972a5994b5a49f46323ecc93f8a5c5fcbaf0455ca1e5457da92e08c5410074967dad3dac458cfe6203db573c70869f9b2a6e4c359adac5caa554a8426de594f067ec3f7b9a9cba2379203af41ba6c2d0fc83d5e4700f5298e0a0f3d20e98ece86f284e6276334d106b3ab15a5985d460f20f1881c7940a58e6b5801ebf494aa740dcc5bb5cc25dc3b66e6ddec1c61abc738905c21dbd8a81b76aae100b9bcf58539aa50ae0542a09e578506d2eea91790122c86bef7b108ac87c007244380db08583fb855d324bed87dd0b73a7c0b6c7f9d4776ce8446dd979211387d3eea8a2c6d8a9498b9dd879582f25fbd242c891ddafd418ebb74b18189151e3372f85244877c80df080d0e78b863c386e5ed63aeabb7046a340fed5c74fb0a07e72cf9818e43dde38d7b785c8098717b0d542347178f7bc06377bb5084fb26c3abc6d566a5ba344a426fb540265eecb3d62d35a3c45646425c03042183e9f3b346b16345217dd349cba4cfa8aa251db808187de6c17b82d6fbfc955433df1261f28656eaad7be9dd53bc8f0c05dd502b05e8358ec7f0c76d40d64c283fa1c2463a1bf918033f90f0193af12e689a15a747f7268944b3553fee39e08d2329169bd5f475ee6a6c288d414c0c9531f67770b942b2c1ae848804985b55dfea5f101060d0e5f21a792384c618bfd52d2289fbc93d6ff44b63ede7e7601f9f8b9c2510ef4d85bd426f8d702f11d746361a36a00fccb618710a6855a294638d9893cd2b904a91c9e4a742e5f2fad8b8e6cd91b4194e72541bff0c06294fb42b380eb7e811c9eef19613ff195a961e3ee9c0e505be767eecc5d80a7415b170f2a25f4edb0a89f1c638bfb14758df4db5923a10031164d4a51ffd7d3a24b1146f6096e3446110fa6c0c40f9b69683fce7ea2ed7eaed9b3b71e3518c8add2cea9911a467b8593b10d28e4add53dd8cf4f363509d174a3ae18369691ab006338677066c8522d6a78ee988d9cad944a2058b33c9672baad0d91bf8f81c1e5b6d10c149793214d752b1f4a0408ef9239f69a621ac39ba7c8a616a18a47087912843f990421e7c95c62c2473083cd474af5d4cbbb7c1dcbc85096075b29e7928e5cff7746ec47ca796ad91eab50ec18577d0626b443b2fe508608779e70384566722945c47783aa9bc8aad2cd301ca169d7bc6c573c290b658bad6018538ac740be5984d66932f6bc91739a6c4563412464c9a70e729e48cd58d3ec40a5bb1002bdd84ad112a35371905c560333c3d4f815e37ccaf2ec494661079a87333b45ac7bac42aadc8d7dd51b410ccf927a9e207a95e096e2cbc3cd6c84149bde25470c6a735eaf78649ad602480ce46bd3c0b4771b2ebc87c9f85572dac05775f4e93e1e81be50e66ae688477ff73437c8aac0f6412b2579ea80a3c344a481a789e940021be331f9cffca3a573015d0f86e1cd0a6ee21f7b716938ea2401487f3160c6a61fc865f57ab09144d6c31ab0ee0a8d95cd0a8d8101cda5b776f4fedd6044e9405c4430ab62682b573ac260fb70a37ce0987edfc26c5e979667ea86ed9fcd9a4d9a0602649ed2d9d74976ff7e3aa63b88a73f962241de6a46e34790b286bbd20ab96b24b658b37410077882e94e484dddfde1d4f8b42ce0a33dbb40b7f4f11986e9098f41c2c09d20c6c1c90259c990dd62cf7def7506e4197b30d884bdeefff356aaec6f4a5a0b24f39687b46947c39b5e39a3610a5f9f7f52a28d339a0e632af3600b2aee504293bf17701a8b9f21ceb51cb5e20578d02f73061b21da3d16a416e8edd48f6c80799c19e15869b8a6c97464f7d0af884bd5c9b15d022b4064bfd9e760266641d70cd2fb1f0d07fb642aae00596b2519c215989e2378ad30f19efb11942bf7c3c3905f3e164455a4ccf1a4b4ca9071d9b9e0014082d96c14be9dbc0555963bed81e3f8ec036f36a0784f4a01df75f6ddcda74f4d4344700173316a5146647ef3a703e0bb050c1d6941cbfd7429970fab75b9d5fdac5659b3a6b6ce92dc1fd743bfd8e212ad48bdfe9ded6ab505c8a9978517881050aef09cc09139864a9809cde73a11971ffd1bb5461d2c36282f0416dc41b35ef716c559e1504bc8c8572e16a8489eff7666d0904e3956571f1ffae95f9c6a6f55920e27189560097792efc32731d9534013ca572e0b405518c5f5770e7eb4cfcffdd723b54aaa6f92e16a41e1bd18562e89b8b29fa3e2dbf74c9038cd7c7ae50ed705bf3197674d910911cb39723a0ec0a43680a71df6b36d406e685ba54b8e0f7ab6aae11033f9d1ec64e4f3f06deba9d28fc2b0fc2c0fa2017c22d85e5a23444d698443309fec57c468801e686d2aedf887acc043a9e02a99dc50c6f1389c52b9f84bc3e91dac5a39c89c0a3489ba2af681f479a465a7a35784035eb0872d5b6d2fdafeacf58c272a75c555b2bbfab3abf2c619d3253faaed5efa9c659bbb48f2837652fd5f79a76ac352d27cb75b5b5f2b8a6f7db12d72572a56e5a7b8e6ebdb564a79f9b33c1537cab15c40feb5231b658e3ab7cba703aedeeb36bfebbbea95f07e8cbf9539c759e72e2f44dfdf8494fbb8546530f83eeb0c2e99213602a01c954472b3d42e325c53c10a9400095da3b6a89e260b720d16f64e91abfd448f577e882c3caf32c9166a2142b5113e5d08e77892ba598d021ea139ca8386207cad61a1498465688f6354b044b32f50a26259bf0e77eae2c34665a6ab506541c09abfc670d459efeb851f1331b68ea03f38edcc1b6cd98916865ec7cbb5f5251cf824ac197aa22d86be259e690dfc59bced159fe5336883dbd5c04053263c197f9811c88170bbaaa9661420e32386bbe43706fad58d0906d8ed3bf518c81f0898210cf974ab807eaf8ead4bcc600b3c564751f4e21182563dd498d9991a7ea05f6ed460e10165964ca9102ad4944b0a2c87ac6ee1c9300385d46dbbdc2ea25fa9e8541121cc9a46f75e200e79f8a36c2af3663c169b4dbff8c915074f8a0966047156c7ec4b895ea63f8e8c05e20a73a0f4c7f5b1e74b119a9123d85f258a3f530bbc1d1b32a5e6a62a808a18c86af118905eb8a8e06077978e12bdfece22be4d7aa2cf19551ec22dd5e091395abd3c733af443904389a242824be33d7413037d7ae49dfc7996335bcf710d32d0f4882d3dcb90f08f850fda59330e8f0edbd3bfc08e088cf88b726d17ba7f23f45d64b25fac01e57e0b2de239a547f1223660b344f5426dafdc38addf68c73bb07476f52d1c88060b88968dc72f85a9cf5d4f53d339e16bc54511449130dd706d6618eaf4bd91dc1fc6f43a5fe66b471bdb68c858d6480a8cd8913c55d52782de6ca30dc49aad0ad6e59f2cef46e49cf267c50c6a151ec321be6fdd4f08c9bf3dbfe407eb6c0cb357054781c3a80d4b52e54b1706a2768f97ed742ff15519f6ee9d6e8865869736c57ec781e23955ecd7aaea6c9d0689c7cd7d6ec2faba1b55a4f93e6abdd8fc0cba98fc3aff459ea51d78ed385e96ad3464c0e3d7992af4c3ff8ab65367507d6d49485864d246023bbf062b1a0a53a78831c7b19a754a822720810e92d9a529c7368b8ec42c87c64e1b8906acd0a7a4e000c0bb706e4ac97c16691c81f9056eee0393a431313a69352372607297966eb57c00c14a4d5b442b47c94dc3e9af7992bcb764a87c0e3b5eea392ad4d66416da80b57aa9519cf561eff868a5e93b54885543fa84381fbfe05590bdc85713d825ad815448f055ebc04640e57305a59493aa9c9ef11b7455b1226b0fc1ca7845e08bc15e9921aab55425e06fd6ca0b69640e7ecbbddbc248b0500368035e03d25e1d894ef2de8d0d6b7e1e6304c4267b264c147cb115b5b24ad6db209d99becbde5de01f30ea60d880eda751e6d5db8bb3b19d3e8855d9ef2940d1389628bbd94926eb2887a2d12cd4ddb6ee6472af6fd13ed5f446d5d6db1759a7db58e61799ac802976ec2970a3ee1ee646f6136c230ded64acaec9c73cead3ea57e92b28d88147b12e9d62f209168dea2d9a6dc74a1b24db9f64eded8e748d93a08af1159b639f3a6adeb1f4129dd929292e594796dbb50c0199bfd1a8d704f41c230d7eb9a795e9fd966d98502ce58cd83d27747a76969d19a5d6b98fbbaa172a70375471b11f3f6b2e676a1802a6b8b45b1c58eb2cca217931c3457a0759128c777a1b0f8e5bb932dcc2494faebf149afae5bd795595b74d22b6991ae8d65d5b9333a1decfb41b3b3bb1f84b49fcddb5eb49682d61de615e5e4e498a066fed4abf8790c6377073dee65f944141ef772d3fc6e9c51068d5d18d3add3814235105443d13bb981fa4743d13b188c44b02fc62d5cbb5a437d7a1d5e1b1e4fd0fa823bcd5974833acd593b9ae3817fec8830382aca824450bb72620bd4f2834442d669e760d796336f2bee710dd5eb1aa2efd724f7e9eb45eb3594319d7c3181aafaab5e544055a5d6ecf88ada426a83b6e47b3fe6ce13f3478649a4ce944fbcf743061d0f996873a73908a406813d30a7c2eea952d65fb16e1d0fda3db127477c0cbf77bf781e9d6f8d3ad7e3f5c6f10fd7f87ef5cb9e1092c9ecc74f7e3df4c0e02c817dd992fe7e743decc40a78b99e62986f9a888ad3a7efd3cd7a79e2ec09a88a7ff8f5b0206cc2931c233f255604e52e3aa158e04e8cefeeeeeeee8e91e31b48731049e6f25362c5ce9b071a0fb434cce18a1cb7eee5c58a9c1c80fc94100d65fbe4100d2a2102caf05d056c275d3fc9443f19467e4a887632514e0bc916ea81b6040f2df716b2f054f05d9dd19e122f14751a8f8f5eb5930c0f7fc020f35e18ca2cf929f18211b2b534eb6264794b679df59ad7bcb0894dcc4e3bb32c9b133e197b5aa349ef4dfc7ba9ee7a684a1e684db4f5d0131a4c031876b285d7e63d0835ede63d2edeb903ad3e665926ab4dbdbc37759b70caf8acd1fc8dfcfbdcde4bf5d6c9cb13863f9a83f2def4ad95051fa9a07550c7461ad1a290d643347898bf12ff72bf87a62482911edaba6a419d08f36a74a47ddbd382a6e52785097e4ccb8281d6dd5b949f315ab7875e0a3e4ea105cd472c7540269a7b9f784773ef169645342790e09b56c2fa8dce717b2fd5c59b8e4f070cdaf1ba8ae6b408034ff05ae057808a418637c8f01d17615e0d8410eabc146ca2ad879a83f092045ad723c33b417b5d742a024a920408be268a268f0842addff3db78c01cb7dea878d15223741f62ae628c8f552ea95364c824431aaf05fecdf8973fa1b80248a4bd5ba7744acbb2acedc554cbca958cddf1bd863211cbeeb6a2f5ded63db775ba59eb597fd6a3b0a640a85b5a53d03a2d9980e6fa70dee38830304a9408d33eb1a5efa351dc4e080283b86f29600d72bf810057104808b91b06af831a28c2dc372977bd43ca1dec890214b203b79debcad7b57520c813bf9e1863c4899b10cdf53b4f913b6824b78c5798174766ecd69a97106374521af4c6c4c8d0eaebb59157bee265d54b562981a843ea756d2856b7cea757974fcce4e57561e8d373bd833d42b2ecf2f6de6b73af0ddca090e63a891c513611eb40e5abe7dac44cbb36593662b150d8e5b18fae0d866531e4b390f8f91987d0575a1f1fb71fb0952986426ccfcc66c4e2b38b1365262d39e38d7974712ac5a44b22410cb3667920c77e9cbc767152acd8113e399aef16caaf872955ca606147d4575705de0cc78d61026fe607a8eaff0081e78037f3928567851920a0aadfbbcd9b41d57830333201f2cb6f95f27799b7d2fe0a9047ef65a6fc00801f8c176f85fdbd050a1fd13fe8b91f5e80e07e7801a2058ba8d282c525ab3555223d8ae531502c8f91a35e3e5ef13a994a299a7c97be6634a7989a6931704688ae69c01926a0aa4f036786802a1c70260150012f65998189f78526b95fa37ce071fd8b1df0b87e1686dcc7ba90fb436c212be0c934e0a512f081b77ac2446fdd2343ee73e105e1e8559daf57a5db8d1e4bc8cca24b46ec8bd18d8a72dfc22667d09ea03a890e956b86aa4f2a9428549f285423d5a7f6d863187b4ab820243f3f255cf0c1062701c80f880d40160664a24928519cecf02ca757d9fb998fa8dda208731565ac8164ec1986bd93b1edcac9b22b27bb723a0c57fb6a5fffb2b54072871dcb74a01eeefa47c66edf35e2420155d82386d869dafeeee40b9469da62387bc4f70754558bd90b0554d5db9777c05da693fbd23ab1995b0dd2dcdd0102e3dad4571e9e8682d65928bdaa3bcdd51ed750d5b1f9517f34d718ae381e5a1efd04ad3ecb9506e5eee892dc344907693b5c39f92ad253244866b936335e53c427e62faf5c9b98d7108902f3975f5c1b98d714d159fd6517d766f51a224406f8cba86b6380d7107102c45f6e716d80784d119e02fc6516d7a600af21324480bfac726d08f09a223b32fef2e9dac8784d919c97bf6cba362faf2152a4facba56ba37a0d911d97bf9c726d5c5e430449ea2f6bd726f51a22423ffc65d2b5f9e135447c06f09747d76600af89a288fee57b6de86ba288d2c35fceae4d0faf21a2e3c35fb6d7c687d7100182f197b16b03e3354472f05fbeae0d7e0d119eed2fd76bb3bd8648cfcbf4dafc3544829ecccb3cfc65ebdaf0f01a223f4fe6e53c6568f9341d819ec692df9df5aac6df51bd9af97b8c975e05f177207a65e340d1da98b788386594b5c6b8c3d72024283f203564410d4268e407542486254746a0a3a40b3ff929e9428f154b324c7e4056fc0042740510256028ca06c84f09188e90d3909365e407848629321bde12f2035a03936c6568d63eb19b75d2b6a857b6083bb6e5a8cf6e316c8bac13ec4f4ed317c633378ce7d67e5e1b6b23ccb20d0b026fc57860c7d35c774d5c1c49d398cc95c79cf44adaa2c6b08d87cc765b21221e3bb67540e6ba6141ae3623c7744c5d5d1bec2b0c5bc391bc4310f83d0e885b44ccaf390b4410f8e502d802d8976b63ff622d00f20352c39120f0a381ed13195b6433b35927184f0751c9e0975db0cda50e6000d5851466b03c0dfcb25d007e81bd468d1a18d589304d5ca73a91e60ce0d6c02f0be02aa9c392fc94d02109bc3634a7b926608d6580ba09e05a453a50b906e0da600fc0b5a918ce9aabb9463b41db41061339a93b00e0d644514573d748737d7fee155231acd66d090dbe506cdc2b723fc6ad890249732ff7706df27687b4ee3641b3ef6e1112244b962459c204a025b72713925bcb355120d96edd6aad374a6e0cdfa20873892ed125cacdc34dc0bb3d1106e3892dfd5a350d85fab97b7b2092dc613c3551545185939a289cd4444184e19a289c2cb9a98902cb7ad5613af555ebd5034ac34eae87a75c134515306e85516bb545b9ad93d8d216c32ab6837512616e516ce9d7957a05c624f7311e8c07e3c178ba989a22417a1523bf3c03d7140952a4e745911e21bdea21bf1c836b8a08f171e103a5575b7e1906d7108142240a8a4894223e7a85f3cb2b5c53c447119d164574aac806c03544aa2042c4820851935ef1905f0602d7106942c4890a11274580f40a467eb900b8a60890223ca7223c4c7ab5437e9900b886089321d350911fbd62c92fcbc035457e14d92915d9b9a2572bf9e5175c43e48a22392945729ef4ea457e59856b883c29d28a88fce8958bfcb20bae21f283c80e89c80e9123bd42e59753b886c81122484644904cd1ab16f9e51f700d912984ae90905eb1c82f0f00d71011e293f93ce9954a7e99e29a289e445164a3288a024aaf4ef9e51e704d1450a288824511c547af4cf9651f700d111f3a974e920c03d71049025481a2b8a25729f9658c6ba2b82287e600e995965fde700d11203c164f905e91f2cbc7354482f4cc9e2599075c43644990bc4ac05c4324e8a55eae2162a457b7868811223f395e25747ad559453f7ad54d216ca757dd9593710d919f977a1903026784103d9957943b4aee5b5168ce0eed79d22bb9519edc9d55d4132b4f127aa4fac8fd2377935c9dc09edc5945b428461a2507e3a93a5428d6218d285327396bae97a05945b1be62f327a6ce9f7e367fe4beb5af18abb576d9bb1d9e1d0d49b20f1a784cf901a1c1473e0394fc80ced084253fa0330461b86e1d8eb8e361635b0a6d88ce6b98e8248fac23cbd27659ce76d87464596e43745e8363088ecb212d26b6f4251103de0409860872c28037b18093808b2d2760002ab634418207c496964539bdfad130184f4f1f180f109f20b9b11f21b917f0eb1dea5ac0bb1774bd8bc9bd80abf615825ed03a482481966419d442ad44eb5a6865f5505791db82d24ad03aebc4c9935e592738b005a55bba2786bdd65a6badb5d6780ceb8891250683b26c871d76c0d8b36c8351b0781e690edb76a848de150f0acced892d5d61bc7b60b042cf0a1ede411f01780749906b358100ea3bf8e387773005b94291ab0a54ef600b72854072852ec8f505b9ca0088777006b91aa0d200e61dbc41ae10073233dec11cac64de412133efa00f8d77308a5c3b486455e31d2c62e31df401cd3bf82393dfc11fac6ade41201ce01d1c8210ef2011646cde4124ab1bef60116ede41240cf10e264106e71d54c20a01ef201011efe09204bc834c7832f8d8ebd6e9a87822a9b7c70ac119cb04aafa3ddc9efb707b7c380ca1eb166529c404ced8a1bae5f8c0a4fb5228c240a2213863ab109243557453a8837987678fd7261ec1ea6dadb5d6cd5a9c1dabdb7cd766fbc37ff0de74c6b25b45d6088caf00fc1781b743a208d34255c0194b04894e54456e1ede4211c62ab24470260261d51219f163057cc3459c876fefa1a81f81e00ca653048018e701774e00a6475eaaafa479c030561ef0cb44601a8497ea2300531c4c87c094072fd5bfc1d4c84bf56f60ea4387bc545f084c0f80a90e5eaa5f83e90d1ed7cf98f6606a8397eadbc0b4062fd5af81a90c20d70f02d318bc549f06a63c2fd59fc114063298b6e071fd1998b280ae00d39d97a23f9aa328a04fbc54bf00989ee0a5fa049081a98f97eabf603a8297eaab3015c14bf55d52d89ac34bf57fc0d6152fd51f00b6e4f0527d01b460cb0d2fd5e7b0d58697ea07005b505eaaefc32bf6e13070d723c3f061eb20910f306edfd987ae3e83819dc85691acc7ec9b079ade306683c7f5a350ec633a7006e3b9ef6eeea210003619bc543f06a683613ec666f0b87e0f32d719ec6dc254fdcaa2cbd87b5379a97a16951ca6d3ca4947c9a462c2404ae94529035aee7a17291a20e597aa27693b46241449893bd2464bd4b7b85df5a5ad831aee4ac79e52b5d1698a363ae99dcc29ef7ba33dc768eb34ba99b0ec96d188a46ddd067ae47a9b92f22ce5efdaa458b98461be9af699b5d79a3d01673a2873b4d75ab19c3ce5a63dbb7652ca497ff76e4664cf8e598b738c8edd4af9c51d8f7c3fc25d8f9c3cba566be92918e69b149c94524acaa5e16ba41166225fac23cbd86922863dc36e338b5d14c299d33d4691c5133800c8a8e6647312ca5ebd6b19ea74162ec6cb0f1d1034f2fb9cd9e954aba6a1503fd4892df29d44835f42eac4cfd9e1c83a5e723c0d21fbaa169c9f9bfc1d72b7b8032d6b9821624b9534b20422cb1fb28cc172ca524a69c97ea241215bc4be181d24caf19645a9d58489655996d593a3c491e967ad52ea78b91942c234fa382d8e8ba7d67c0c546c89533b83d641f8a3a10e5c0293e4088fe4088dd00883645b0781e4088788747691d6878fa711a2572f662817705a8bd64aeb12b479a8136b7d01b3f5d2dc3cdde669e4794b0819b4ec573e9e3ab1ae23cbf5f127941c1dd19cbdc40f68ce26a0392be58ba19b6c0ea3b5569afd98975847d65ab715f8235e3d11881c1f936c87882df1d77b0c5af780b27df782a0d0c5350383660f857ac5c48e610b92db105027429d4de7458b52833a5a432df789b23eb1c15a199ad69c7cc9f0e178c9104228b7970cdf449897395242190cae20842b39e5a4f495520bcea9c48efc5e2ade22306ccacf63132f3173f79cece8249ab38eddc26ecdcb79d93d040d7612cdb5556fad47e9550eebd8aff75b0d4f267bd38b631d7b07952065fbab08ebd865b176f2e4aaa239a2e68a1a4aaf8ae0cccb540d4f4609526e28d61b765df46460ee5f304873b0a78d740066d9503ec801ed946312dc8f42498c4473d9ec21c41cac895594a14e4d97e507d348baa58f444321e92be49eb393344cf6ceb077a766923bdb1a48b7f4db06c97d8909c9fd3692fbf44823e997a9238124905c621109658ba82d2221265928f76b4ea6698bf6cc817d6c285aa76def046732a862439c58c6882fb0ef0738e10fcdc1ccd291eb29421d98d31c863e8e6859e31eb9d6971fe30f6b838d4929e5e3d11cfc1bd76a6129edc576546bb5105f8cc55a9be2371e41095f3381a4913492d802df71471bb4de5670ec47cf617b14f180484eefa0d03d2c1d9a0e0f8960935e6987874ee061101864d47d6d52b0be10f813847d13bea5946bd49a3ab26e5ca7556b37141bd4c130c74773b56a1a6943a1fe98181ebdcac06947afb2c33311a150ce84620b7c760d21fd22f5eb6bf6078580a075f03d11aad86d1f61b7239acbac2a7b651d9bbf7d0a7396dd7e16e7cec47aebda56c558df8602aa70f42adac0c7d0e855e3e8d53cfc11148053d474af8a0c7ff50ec50d0554692fc35bb70cf2bcf4eaa55fb8e6e035a0c977dc0f540952a67faf645067e980cc747b2f557f0be6fa038aa557f0b565bdd56d5994e2fe11fb9bdc56a00f98136162620b7cad391dca055a574731c6197cf8bc103cebb67bcdbdedf42c0b661936e43a062f6a5d6243ae0ba27a35e4fa3ccb9c96052d786117fd6bcc8233d7d7b6fab0bbe1dbea9b41fce8b346f3f66d632bb37e589b403af6db2aa511b6c3361ebd75f047c66eb71cd8e7eb56ebbbcef355d65a3f6f4930dbbebd85167c0266d7089beb06edbda17ff0e57a0957f5b0b16b53279619d48133d80677e0b337e993b4750d7fe486197d6e597d37211133bb7c3ddc3a9c7a6804d4d97e4068ef0de970c3482452d75ae54c922dc4336318863d9b7283c730d481aa697d84ef2f6ce9137006c65a9fd54b44b64108b1bc2e69844f581bfcebd51370e6655b61c5b00ae713d8bb465088bd2c4393f65d1eb9765986d92d86f9c6e2dcacdfb7dbb53d0155f33df1c36a1b492b68d42a092a5a72ce5b327b57d2c44bd94f584ceea0b418e9639d5715d7087859e7c495ca28a594f6f3d2ba3d4dcb9bd57a3191720443bab5496a45f9329543d6b5a9874ce25505bda88033f0d4b2f71aca144afb8ede94439849fa48b715f8fa1963bca4bf98c01979bacd6b284fcdfed2e4aba954e9a69d9a2afda854b51a311d8861b62ccbb2a0dd6edd1bfaebd592af388e9e8249cff03c8543b9a3651d66f7340da3ad75b34e5fef46047d56a3dd56ece567d34bedf3cef81c95466deba24f4bfde86e171570266ed9e74545662d6b663aa980333eafc96b42a984b7a20f8d998e6cfa5c54405594d054038be347bc2547e0680e3e418b80123a0489593fa161e04e276f25ccf4334bebb15e62edd45cd79d0863774418bbf5c6028d1e89e6fa17059a7b3789e6bab3ac0389febc8d40afeabb07a5a7873a4b48f92ed27f66abb5dc27a9037322098e8800ecb9da3a025629ee7864fa2696d1ba7e6f2dbeb138367bb66db57b648a7564d9da2e2a264d53710d591875b0e4c8922350e21e194208e7d6554dc277e7a1accd4dd9a39dd03a2f053b060128cf3f0c29a594da3fd3cce29b972b94e6a60ccd5a6bad85afdb0cb3b7ac5aad1aaf4df66a84d568d046f2f0de589759c5ea68341a8d46a3d1e86f5e9b51b5155a6badbd65632b76659795d64a6badb55258adda68d0b2af58c7de235b191a1dd27e21127bfad1e18fc5b16e8db617cd8eacfdb4f614677d062d7b577d68f400c1f3c34e8c0c9ee6bb2c7bf6be36d98e08037fba773193e2ec27d6989817ee3fd6d64fb49f1e24bdea3ae74827a119cf9c56d73d79764faf84f46a34df3913bb32fbce41e591251d426918d2e7611109c328bdb2d8c866f6b230ca068be6958d2a2c8251e0117bfdc0eca73619b4ebd895b8e96c6fe7db89c62377f53b7a35fa3c0f264687b8b385d7de93c5286b5febf6a259f5d9770ec5d668842d6bad852d6b59d6dad168257bafdedc7c9926c6e855d73f7976a79cfdc09f1e8396dd66f3b3c5a07535cf1748f4ca7ebe26d6a2df1161e0916e994f32e11479fea7b959797eecca5a19c31796747b700a300705074d0dd3fa792dd37a19127a5017635996c545981ae3cd5b96d540586f6688b7acda225b6f1fd421bc96973b52cd8f21afc5b284a0b5c82f5f20c743d8a25f8075ec1889b4eb3a5099c2eba217bda885d9781a4f4feff3a48dd4f0a9b9d95eb82486af3f5b98c52e68f2f35a7cadf7e6f9da86d405c89c11ec98935259e9f6ac17cb07f672eb74643a195ef294461a6b7dc43a1d7fbd6eb5b9ebd756f38dece6ce9a692794f5ec6ef7b6e2eb7d878018867585f65dece6c2b9aeabe2d1af8f5e1ebd59e7e72dfcac3db2edba7d17527c8329e0657b08af1198c5b0edc6f54a13e769a2ed0cbed8508ee8ad5e3df9ca639f00345894ad4683d6b732ae8d8ee6ac775586663d9b734e08b73e83d6efa0cf8cd19c948106bfa3838f5b127807cc373a9adb314f6fd1ef4842eb915f123a76d06b0333118d2120847e08cad6bb1899a53be5b6def001652ec224115baca3ba5fefb8172e5bcd5949c4989897178eab5bf7a37c7cacf7130dc5f218ddddefa568cd451fabfae4ec3d25542481451815debc3610722189dcd1eb40650b9e5af4ba46f465c52389d68db772d6f6c2d3babbf072572f862029a5945042289f15b47839e184ef3d08ab306517a20cc518e7e7eb2958d3fa935a73521a404ed873ce7682d6875a50ff25767777777777777777f78c5b7821656fa0c94f966f35682f68882aab6c3148f9dea5906bf35e8741eb5e903c6519a37613f9864840afeae5fcfb0b7cf53d0380417b8730ca26d81ed2ba973aff12ab94534e393739e59c72ca29e7dce494534e39e59c73ca5884264c5e7224a941eb5e1a0c2f40bc8995f957c383f798f7d29cfcebade3b294f8cdc900c01c141cb4285f4b9447e2c9bc97214ee8412f5acc4bad9af6c845989718bd7a3909295f939e143f78f2bb38a40c776611ec8bd151a14507389973ce39abbd1ab6051b4e6841d897489880f6a44881919cfdd6e1b591cdcdeeeec64234376fbb47bfa3511c756f3aaf196d2fb6bc9a51dc84a09131d0e4e3cb038ee8d55332869e3c1f01eef5619b41eb1e111213b636b10b756f9eb36bb56e35c397b557d936332cdb3abbd589d18b561a5b668481355d06add3f23c3537b523a6a03da0b9796bc3d1dc3c6c2bb4ae4d91a0e335b9a87042942873ce395b52d890ca6ed873ce39e79c733e47fdb3ac39e79cb3e79c734eabbee7e79c73e6d0366bb63567e7b68226afd13bdb826d35a490522768f2f1b4ab5054e1a0c3711c17356beb5ed5e0166b6c7986f29a12dbf23a19dd8ca724c2e088b1c61aef8dced62d0ef95ab521948b30385e8b3ca771337b16eedc5c4b5954b1609f00b417082184b239d9a540689dbe219c747bb105be1aab6fc4408bef53af9e123134c9f2c286a275cf7fe98e4b80a2f0e4070405e8253f203a1c59724466dd22ff4ea7a045ae9bfec516ebbee6a656638b017aeb6abfadacdb09520e9955d6fcb83812e17a5998b3ec59b543eeedbcaa9543ee9f751f3c5284e08afca408c193a05e0db98fef29b0cc926d59f2c68a77730255c3837979dd222611335bb77edd5e33d70ce7ba755d795e1cebd7766fac5fd9b35f5866f237b37097e5ecd7963547743399cd16683cb27c4decb152786de865ed85ba2aceac0bcb3ecbdef54b5a8922ea16dbe9405d28a4fc756f469f7f52cadf89ebb5b1ec47b73066ad6ac979a18033f433457bcad6759629934a99f22e6592680aa594763a501d95b788224cffc4167b9bd2e2a44b7ca180aab9add063d6caadc3b12e2fe7e7b69369e2bbbb83bdbb3bf9fae8ba372e2eb71cf2daab8bebf448645f9c94b25979ccfa8a7517f4de58cf31536e592b987d0947997fb175da9477b191366bc9a7601a50b612cf4cad4c6bad3553fcb2b5a4ecdd9b5fbf3fe08cdc2e6c748db097587d93f4167f72aee0c0cbdfc0cb09e526515be744263d2505855f266d285c6a917216299f3e4654eea97fef4df7d601984b3b72bf7934d83077ca79c85c2a954ed3264c9bcc29e594524a39e59c524e690135e7a457a577e994e80aaddfa537692e5ab01b36ccd0b22ccb27c24c1fcba24d7a65da3a203351af521e4f9df40ac29c92f29494b380190f992176d8235b0bc209a77cf76a4e39e78f395b4e2971a633a79cd3c8f4993e11a67ba68f36a54f8edd4d9f28145be26bd5b458d448347745794073d723945e754d946351dbe8a457a4c71b86374385ac782bac0b708612690162215ae145a15885272389bc54bcd01862c72c48994d9e978a97a13584a44b92c4badb27b6c4f7b56bd365d0807a852de91509096f46ea14e1adac21c0992602025ccdcfc822cff28133d307aa2c224f6612192d39b292bdb8f24dd444d3034c4c1f9666699666699666699666699666699666699666699666699666699666699666699666699666699666699666e914212a94e3e7b53012d59192ea4829a594524a29a594524a29a594526a52939ad4a42635696f965d79a9a324c72f21c76b3a960f1e174fc2cff1d8921c6f5948c8f1d31a428e6fa2ce3242f6b18290893c19ab072f151f3f7de08c6504aae293e4182d21e4f82b7d7888020f3cc080020c183b3c61871d58825858569cb0b2f2a2092f5eb860820b17a82528548b25b468c1420a162c5494a8a89c804e2793124ca652124aa51424a4a46849348d740412696484d1e816e1de0c49965922588b0d01c32e215c573d522b0d02a516102ceb07795a3f594a1f3c9918630f9e4c77f3e0c9c01b2352362f5b2b65dabdb5d6ce6a5f1bf84b4a956b235b5c1bb84d23cdc5db1759148a305d6b0bcd1804f4b6e27a17816251163b4af6266c248a3027c8628cf13127eec4200d63f9441f39eae408e45d14128de47824477b1a69b491461b293c00ae0d6ca09cddbeab3d3d3227c2649be56331cba77334cde70dda05a7dc92803c4fa6afadaba0c9c37be3d32b08e3daf479b08c3467fd5847723cf591964f8efd1731fab6dc7af5b2dbd327c73680dc684328ad6d4773f11122f152931639d1724ae008f6c5e82ea224509a4b8c3a5059c5f35632fe8ebd55f6f714d45bbdfc9de5ad54fefee04c7ca76f26951abd19954ae5cdb8b8c41e152c9b3427ff822591ccc2e3e4332cab003979195846e171f2292a4c4145854b27bd90e525179e4a3e4a28bc94bc94b144cc619ec24ba45e80abf012aaa7dc052f116f8039e76c2d13e029cc43cb405c8523e6a1e5d58de823e65841441f3147eac81f3147fa4ca098ab549f576d2fda544d1f6944fed09871f96b1797192e334e6346e606a569f1662675554c4a65e33732b8b3a264f9192eb8ab39086ce3f1dad4f80dacdd937d46529731ef502eef34d5bb9a535b3522a439a97289b178aa90ae462ccc7aa857423d74050de62899f04498d873630fb4aef214558b27c25497ad43e5e96384c52bcfefb3db473c77a07d228131439d4ea72987c719e1c9c4a9c199b9cd285025b55bed992613b71987979247ddb68c52daae8386735d3d37328f5ba7e5382f21ddd253f464a0f4eafab98ed041ebae9e4b08e8e745ea2ebf8452ae8d8b4bca05d42b97cb5f4b7aa5bafc155483f46ac6e52bcf93897987ea347affdecc6c0255f2299f812d28311866ca53bafc6c62ba44e5d2095080d28130cd2659c65845574fed892d720e9aea2ea94de5b2bd88f36530bc3635b732349abf6b838039e3d1c68d1b35f28d1a353268686ae49a1a376ed8b051f3199f366a6c5c326cd8a8b151553231329547868d671b35366cd8b06183081b3688b091b30dfcb20b86366ce01a22f26564d269b6170d012f21a054736bad9a5993f185837faea15ed5d4a45435cfb7195f42f1b1e6dd257431694ebee6346d53f045550d8679d65a8128c03302dcfe62d22b9cad03f212ea55befc35548361ce97bd523de767bd4a3d5fbb36797bd1e62356c5141ef266ce6d0527e6f331ef916dca65a668909f5ec5509e08237580d8baaa7a01b64e23c0c673679428b99b4e2692d8225feb6a73d2ab6e0e3d99452f977ff9aca2579d0c9a43d608327046e6f2f3086f7573f929055c0571f9f984b7a271f929d4ab1a979f4c7a3533e3dda584373323e69dd6043813f30eb4985278b4dee06a83c7c90781eb0e20274f03571e3c4e3e26e6950854c9cfa839782a79995a839792af41a04abec6dcea0f5ecbab109e4ac6ff30ffe20730e3053023cb4acbca8b978ae7667c00e64bc5fb30e301f0776fb4c8f32f3ec68cef61c6db19bffddd1ba63ce3f18cff8c8fd9ba9396673c0f7ff70629cf78187ff7c628cff81d667c36e359e64bc5af7cc6bf98f12da8855979be547c77e579a50d9e4c8c3578324d8327035faa069194a691441859aba6491fca33056dfef87494e7e5dd14d2a41ccac99144489c60846367473a914fe4655194517a7585fc7b2a2a2a2a4fe811bd8339afe81ddc995d0679a9136186f8e8a9adab576d9de6b2c9c79c0833c45679465bcd41c95f9b7cfb6668508ae8e955dc82b84d11358f2eddcd85b8cbd61d60536247ce31affabc0b8eca0899c76d25f57817dc692ba9cf18979554eaf3f12eb7a91929bc82937acc6f528f9911f398d4265397c15dcc6dd088af890f42f51b35aea2f16d65c6e363ee72155e99f1d45532efeaca8ced468f3ce3a9c77cdece9899815770665ce637332e3333e33297d9e4269b8bf96b2e66eb624e93babc43c07c73158dd4e3efc4a99bcf983875739a56e16e3eb5b9fcfe5d9c9ba7b61c379fb1e5b871d5693a06f39059f588bbb9f190f96693db0d226a5cf51bdbb3d978c45cd309b1c9036c3c620ee23388c7226ab60ee6201e1f04ee9cc85175954b4cdd2526a6aeba4b105b07821c8be82254a998ad9bd1a5275fa5da3a1e91c2285a0c928fd08b13b719353e63c6b3ea13773bf2546d5d0f976dde5e9cf819a789348f2ed8e5f2dae494ea31322d325b57559f2d3366eb6a569d26aa70c7a3b3cc693ef16dfc5d9bd4d601985db61cf933de97881a9f717871f267c4e0d42756dd05773bb2cb33ee7ae41c7323542a95cb538fc97791c13c3acfb88559c6395c3e03cb7ce2940a773bb2ea3626f5f97763529f9f4f6d2ad56332173ce3d9e5334ed334d1057756cd387471c12b43bcac3acc3db285998bcb6fe65d545336e7f21993b7ce893ce336fe9a73b10173c62fbf3b63cb19d778ec70641ba7c1dd8e6c8306b94e570760ae716b6b56e311773b727cf36873eb608744ee6c9cd6a8719ab681a786817a5563eb60ae7199e594cbe36b8dc7dcc6e089e40aadc66dcc63b62ebe477e47625e93d8c46c15c9cdacf11476c135ce8a24de88af499a931549e5b936f175ce38e37ccdb9e0d40c1999991934e2567b9a93b5f2d4c030078169549e084367b6ae6a1a8af224e9958cb9fc049279cc65af663c26e659af548f39bd36313247255edc60c41940e51cf13197c16f06b613bb5c955ac18977b9cbd665009573a41ef37824cbf7c832f83537e356856b732e2e5bd65cea14092aa72e4fba36aa539e795d5c1e7127bb2ccbaacf5b2ed8e513bbb8a81e656666dc4e1c6754a95c5c628c2bf132cfb86a5b89af79ca6c2b3328cf12921e39925ea52e4f8334cc8c12294faf60ccd6e94065d553ef62ec1ce92c1d6a240a1592e57479c495a7069183d6492562488244b7c03f2733ca26bdea620f110c4602aae0576fc8f0066843862f75af080d191e083264f802e031647802e02f647815f897ad7b51d490e1b357860c2f03bfc7451fedff8930276882042fb1451e497d13a39320f6449813d4471381a250ac22f6c4a0c8c465eb6a93f82442199d5e1bbd7bf9e8015d9b9cc2adc23d1405a569fdb2d52375d0549f77792a95ba8d78aa6e61e612a38bcb693a5e55a8feae8dcbbc4a852f262e2e73ce8b8ad4555b6d2e95da56ba4947893fe0ae1e21cb0f0077d508595e00b8ab45c8f22db8e381c31d8c1d7cc01d0b0070b71203772f7ac09d8b0d772d30ee581c772a3ce0ce040377a51d7097c2823bd20aee462f707773575de0cea2680bdc652c624f9657c1ddf491e54f483a4b0d59be84bb47943b8b27cba7e025a01625cb3751d524696302a368409d331212d219fdc4165914614e30ea892df24d900012c5167922d9d3b285dcadab47b2add392bc16bb7528d9f3836df5f4daa4b5f1a0ab3c59d2f44534c309d8233a317b34cd01862861ac6ba839f989bb1e4dc46b33e74545095ec383b9419ee66090dc3c4f00da7c2f5a91e3c9503f3709e5b4668c28249e0cccd10a18e3e316630c202054c30d0e5af78890a8f501a12a50947ec34b5953f4127a0a3f80f27c3f8333d5da7a5a536eb005527e4e0cbb65cd39a76559ff9c73ce39048de6a46561b87bc9d86834b22c6b34c2ac633156f6eecdd446b4eb9ffbde41d23f7dc4ceee69215bf3c416d9409a9317bf1b9dadad77ce2014f3a03cb9b28ac7e42d89a1d15c4ccccb0bc79d6ed856f493837ad56959cac329644a9ef350be4099d61643d3dc101bb40e0a618742f2a757f31a69443a251db33edabaaa6987421a46bb3cecd1f08b2dd0a75796b4b6ceca9336d8d39cecc9b2deadabda68eb342cb6d8603d1106d6c8439f2e83d6c59036c8645a9226c60a0dda239a93f5d7fc945362d791e579ed8492a43931cc7eda6949f3d8adb4de8e9c96b4c9e628761289844d9cfd7814b3b039278944da5668e0e8d5e8194773f2882c26c240a118614c8431423d06cd1e02655b45964359da982ca704624d2dc24026dd225f45932759bee384627a855d9e069d35b30ed4ab25bd4a4396734e39856288626262e494534e3963b4064225b12f463773f2948ff5f55d74a2ddcb1c1fbd4af9bcd4a129af55de5b6bcc9995c5bd26f3bde2addb758d18bda6fc3a8fbe16be5230adde5a6bc56ebdcb8ad08ed99ba5584fa95566adabb95a5bbdaf3e91fde8d57db5aeac18be4ab71fbdd64c07ce6837dbb1b227e0cce816c64265eb3a5fed47b646d83b1e1453f9e8b2614e1f8deebbd1596c44c0d1e8d7534a259cfbfa7a788db8d6339d2debb21f3985c56b65813b986fa9f4ec09540b7a6fee73582c6e5dd455b2ac1697c51593645bf11c6198354de611766db554ba86331da8c2b29fb0e914a7549ace19bdde5ba55bb72ad4346dbb1fdd97ae11310ab9e341338495c56cb162e947d8741bed08bf1c27501d9ed843261a0b213e96a7b9172bcd235435faae278d4330d711ecd1840de10aee1ac98b11c4f42edea25f40d45960169442089b457743d810527bc9331a8231a7ca8e8f367a2777b204d29cb47065e5f1da40d86f96c316d2dc0ef03f30b6bad1c411867907dc27f91361e4267f505b8b4dfef461c3ee862fc6ee0632aaf01336a60d7f6d6c0662a85c5ef214b1a8fc350c91ca65aba83cbb362a36460d0f56707ae4c7c4d44fba08a5bb67eb5ac88cd23c3c41a405c2533729245437796ae36506ef0e9cd5c27ea433c2fac6f707857542fc72df0b0554c5c3d951d0e6e78cf8be47e6319986a044e813e10f3c09374f0729a5e0fe694e76471d59531e793ee27e82a623cb511ac9d24793fc437e52f84062829f3c939f9212b4e1e2ec07c69e61ec11374ff7641a7ef9be8b6d1da439191b0259f2a6186a1ef94ad44e9a27c2178edb502d6b6f737bf3643814c9a086aee7c5a1ee25c21ed8037bce139b4768ebbe35c7558da7eb245922f152513ef2c4162b2a19349e2bb40ef6c8c39e081387aa16877aaabc8c91a32c7202f6d0a24d1c4ed0040a8cf264a04e7e406f086a28f2036a0312299e40929f142760a2243f294e00254a7e406df0c94cc80f080ad11b9c1c07aab9f8b6ec8827038f88efcd37ff6959efbd69c12375abf5a7fefcf4813c19082437841042d8431c8c2d30cf18d0c7db2a0b4aebdea78e183987c238ff9ea50395df3637fa8a3b7a457ccfb2e65fd1c4506812fe461d2dc69c5194194f3aaef0f1fabd777ccf23c1be183e7ad5c1bcc12b9a933e76b4f90e5e91d3b58f2cb7a7b9e0c83bc112fb329a8aa915e9a4b71e319d94c6b8f2438f5863ac1c7c4f680ec1c627344cc70884922da981e60b34982fe5c4166648906e91f8e9f474c3b4cc6ef6aaf8fabd1e2f296fbdbc28137a5141d39d49294cd0243f294cc024c7e427850982e47b786d3224cdcd2492091e3abaa7b916d2dc4c39ad15ab12f71334799a08899a9bb08ae62664d2419de15073320ae9696ece16831691d4aa69a58884a7b9f93894e747f371a857f7f3b18a5e659f8f44fd93c404a2c19903cdf41d8dc469dbfa074784893c26dc9d7289a73be50e06c1a08db48db09d37b330085e31da28679455ce194fb748d41c8c45380ec1c73968f1f31d06c9eff14d201a9427388ac2f6a38e766578bd16f8921b366cd8b061c386ddddb0e5700d5d54c41a9fc56949191a3d1d626966adcc9ea6af5b3ca41ec33c3adb5cdbb416a499ca5369cdeeb62e679c26b04f00d62d44027f22bd756b1b524fa38dd9fc1c52ffdedfab21f5f031a095f5bd798fefeb4456c303ebf0a78348e87cef32471c9f94f23d1bfec4341744433fe9e7e984c216b68ea7f59e7c96b4ac7729df7b9b8c32429a3e8c30c61268b76efbbee6dec4b1fb0fbf2932a49d8dc0bebe640e900cdf4bc81c0f5faf966829e1cc12303f299f4c7c3231c71c2ff1ccf3addee32324eaeeb82343ab9ac9747a6bc293a7b91d98270fd56aa8964ba7393e72e9a7db2744e9b40e5032bd4902c132138ccae32f191a9039e79c73cecef4b9d35c69cb717ae974cb613a3dbd38a79736c983435fda26cfc5319d9ade75cfc9733d7e02e955e9da5ca5eee8739c6e923bcd994c2fbda33799b62702edf46eeecc9d5edd9cb2eca6135ef9c48139399d4b38a567db09c36c4b1b7c9c298bb708d3e1539972f6d265695ba2648a590977a073e9f69d4ed3a74d89984bdb7b29d3267754b004c2431f4b3fbda3376d3ca5d36f39e84ff8f1c07c3a5dee60c923813417e94e84893bda564f4ff8e5b823ad69e3c911c8123730cb1d493153e93586c04431d379b40d9518667b938a0a9e3bb125e24aede9747ab6428476d34ddb10956b9aa6629237694354542a101caec85ddc893bbd1aa2f2f808840e50f203a24393dcc99d95d3dca9759336f299acf5a37b536f2afdaa98e84fa5d3e9267b89a89737e199a9bc38f495be0316e881534f2dacf8748ae54b27da22ab277a3acd9d586f5d64722766f53c32488eb7a60048164a4da7c3784d1248af56e46b56e0a3b927777a0557e43681d48ce68e7c5509d34bb7f4444fafa7d34bd5745dab37fdd2365bc25d0bd1b6d29643fbad257a51bad1df7aed269336a254cba07d24f8584018e3dad412c622c317842f5e5dacbc5829bdf8bd5ba723bb1bbcd74d10c2eb1db4f766055bb95654b0d4915d9542e803841a863a2ff0c8454629d53678b567371d6625174fb957bad83a18e1853d5c1b93a6cd6cf43a7a6994fde2ae47be9709bfac69d728fb283b4db42cfec4766db22b59e04e66126a335db79d99f02bd5ee31b15e5d502c7bf7a6be746a32d1d1eb47e7d159cbb06954bad764328d502d4c26ba15a1dddacc32956e3295b41c2949055ef5dea4ac2cfa4c47088bbe9e4509d3d04d88e6ac78f1e819a5255489c5a5d7c52f8adec52d6594debb384ddf528b6799e66223a274adb4ad641fdd44692d954c23d35370bd372eee29a5a395775027772f72945c7c5e23b24cbf322a9dd4bdd83a9947d4c508756d4c5996ddd156230a93de02ab9c05363d2525521eb454bb74b9d16ba797b453e9f47bd365612a990eef4de939b4ad834664b9f46e6a276929a591c9647a766d4ca753a9542a9de03d9d4aa5934ad4749f6da594bf6bda8c20bd749aa625d269fa967e4739b4df774d9af652e97463c2319d4c97973765254c8a295b2799206d34d685e8d5bd752f4d7396757a6b25765d9b2a7d2077e48edc993b13c9dc993b598b992fb56a3b7167eec49dd2acf104fb6274f109d5f0a01ee80b3ab987fc80ac689267966dfde6fae264405630c96d71ac0c4dc7bbc2c7bb6209da12b44eea7857bc34f7204f7330a4778f0c2d1ef05e16f2ab5a13bdea606ea2b9771874044d393567dfc1202844f6be0f9ddc9f4a4610253f67b76ffb7e3189665f4482d644d03aa8a76818ed9088890482d67f39085adbac6d069964785b8a4ad05eb27d0a675ec62e4edfc6e0c974d9698e6ceb60177b604fc30c99dc294a97334b9c47cdf6dd3ce4692edb608f114e4095f7d6c558e27a768a79c04c7fb1cd30bdcdde75911138675b4c52640f6db4af3ed03ac8636f5f843dea7a0c21459e0843da6ad5b40e8a4144d04eff81d63d27ef5d073d99ecd0f48e876c6b17c51678fb139640d0ee618e40bd6271f8b8a457a7c3c7a05ec1a0e65860ec90091c3a6d708ae660073d99ee9cbd6814eb6dcc72769aee6757e923dc55cd843b1ef2edaec8d349a05cba853ed07e218f853dbdea0d6641e606836cb02726418339e531095a670b1f79843c997b187590e110ed39b2f3c05d8e8b5fbe70fa5609d2c530d72cbba5b88354c870c87e8aeca8222027998664e11cd1d374123a9e0c908a8560104b73a337948e02672014a832e10b0a4126f5349d80e6ba00e4eba80b2689d8027f1d064df16446878f3c11a683620b3ce441e52452361650c5c57beb0e6754de71790a2a580a4cc87d5410b9dfc20000088a30a4c3973aa8c54f5ba765142ab7c0ddd25bd7e327e37840047a258f68a3bfc3203845d5fac72113f884374301a88287875160f1ee4151e96050f79a347c43f9093d78f8a46112d02df01042c9f0555c91618b0743f3f8566f95911e0ce929ef7ac453d5ae1126025c841902a5b2755a93c7d1ad93318fc6e3fa12d33c1aafa51fb1108feb96fa6050a7009c794171f0bee417edcb4e6d762f1af9d12db3db0bbaef5cafe6eb9065f87a40be38f2bd19be7e7112d96d2b916532fbfde8882c54ffb2fdc57d256acdb2ec8d6f0602a06c6f6596e1d037962c5862e64a71f7fa32467e11ff107b584e748f910c8015d823f6883d2a699293e99bbee93b275bf0f28896351bd4f066fa56bc75986349245aafa16ff52d69452464eb92085abcb552891df936feba38f0ba38f1187db3e1692d07d40876d0b98119c2b68a3a8a7492ad7771275bf5b558af356a9a8a4a9ed2c904cad6652c1a82361fa16559d62dc6306d7b0c46c9d6df059faa7beb74bc14d1871dccf4d82dec2068198d0744b727a510b42e1665eb5d17e518e5c9d077110e996ed63582be8b7a653d428951e8463b0033b4daeaf7694e478b05fb6264317fc0937939a639f960ae7a8a1dee8830d8f65a5a3ee0c9c00ce5b7edbdd40e1e48d0ba98a004101103e7cdc418e2c94c27a8a018ee875ec5db2a1f03ce6421c347c9456f0b19bef3c1aae2012f0563cf294419637c8c31f68392897d02d0a08f693dfa76c416f9feaebdff21bfc7a4e3db1161b263a75b57afba7a34f2bbb7f6da9b6d386c84c1b6175b288e18638cbde384d54336b54212f13591f4994c78a00993264c7eb8d7e119342b7d62ab413b699a91f3003e26574bcec6f74208b5acc1a0d577f5bdcc5adf5cbd0cade116e58ff4692e46795198882dd247fef4ea8d01c620c7431e2622ccf44145c911a8b925364de4831c3f7d8484e4e32216482d789028785c5b1146aae0b56c5207aae26327753a09b74d3e3189e4f814134c319da6e991cdc5bb21a447bae527e7c93c0a44973417e90f2512a240f9f394a857f32de6d39ecce85126993e49a02a4e1f230cf3f4793c4d724b34498ea399f352f13fbdfae93968d2ea949770374390e32feea6ce12506217b8a47282a437aaffa2efa2dbc57b87c3f72de2c55b5eb25c6eddca06616f2bd67b456e2bd676a3492b37d6319225b1a740acf55ff45dccc3287d6a9fd788de5648f213cfbb42da6ef4c8a45bc74624bc8243fafd0de97744fafddd76e4899dc5e51d42db660e34b8f1902ab7d4ba08e0e1248b875bdbcc818ab5e5e0e1a42d078ccfc61d0f9b84f194d2278cededb0f188f9c5e1e7d6b16c72c5c5a18bf70b176f17dd58bbe8c3c6b60eb69c3f11357dfa46f0fc692e1e75645e9cde48a5934847ed30a287dc3a785d9c3ee93491c55b621bd435cb6774e168f3b9db3d8b43fc14b9e54011513ae9f0e2a04ec2281436e1a1c450a8d3f4c539e449b7776216b6cd1ddcda24261d855f26bd73b2d2a8942c56c54dcd324533230000085314000030100c87c482b17840a82dcb071400109fb6546ea54cb31c879031c618634040000000400000000004bc3049e84b7cd7cd320f2faa301eece5dd655f580e225d8b430b3ebc5a763fadb5597187701506c6ce16a4ae3a213f7f1fa8061b3dcaeff1f33093f3ed02004d1616ae5486ffc9e6bf78cc385c592b681b2099097b3686d7845d57953276cb913e242f134ebea359de6cb10c99f3cd3282190c40b740e2078e1e7c844293ece89098af655702ebb44014635b9e8fd65326d4f8d5ff974128536a9c7092e65160864d561062acb4301d86d7384670d7ee44137d062dd501170c00de60f744c3537985b07170d753c140de9c0cf9c7eb1668d8552fc2a101d0ccfd8a47805467302d63ae745d9f5da8dbd83a20f78bb503007f492c3348664a070b1b3dbd18c12b1a74fc7e7a221a049b8f0a5d9e41c1fe1e784691e2d4c6f3bc63b3fea9ae0a38db0a5c92db2d3c6dad1bb35692cb17ce1f5e0175fa8c7cf841d0ad9ce0a2d495aea8f5876e156c5f6cc872485063f3ae3cdd058521c19a1395ed106fc386f1fcd82a5d0bc95e0610c628364a91b813431cc31624d8ebac0c0f9b6f1e7292f4a8a263751c9140a727b5c1e8feee14591138524f3a37880bb4c9953096a8ce0e69ef544322ac44db9a4c5677b109b028f7b8cb3c8e8159bc63de3b64d390651e778f6bb316e0ac4184593896c7c9b243d56cd520a793799b89716784c453cda769a1eb1ca010f775604c19a4957ab9472fa26d8163a2d1b6c988c72030a0940b35a25f77cf0891abc912209f59c40da0359b6760e5547a9b9fcd3227d37671757056d5c5fb9ff260bd8e438cc7b53449d844a79418e24364ab899492333eeae52848ab683d93da888393304309c921df89d1bb725a6f3ec7e387d5091ec2ac931559825cf07b8f549d667255e7cdceeaa7635ea08c18aa2d3fac8bbdcddfd90124df3cac41abc4b06c22c4aa05dce33921a9dc24551bd0cf2984b161c2a44a1710ba383130ca0fa581169f8e5cfed6c108dd3614c06994e07aece92a3c453480d7e4df73ef91799abc0a1b73aaec7d53c3c62bfff3317e74374be908fad58eb03e58aa8f7ae50bf320881d365adf0a5ee01f27f117dd636d65ea0e94b24ac9e11406838c6d7ab6c40a9040c46dd3cf973a88e319c226462195dcbabc0becb603a08e3710b4442954b70a7bd0cb87c6e5f43a0929454992d1cc832310a604ce5fa155fb6265af962fa852575f337f1ea6dcca0b3d487421fa068e9bbcce5c7ee26e1cbd7651568c26d8885df65e45e140cb41a0202e0906a517f4aa33d9a9c32ee65ebfbf538cc18d8225e11c604602d9463c3d59bd047466f8ced4888cc5a1686fea9df6c7f6491ff6bb4116aee287a242c3dfcfc8b305437d24e19372fa46dd0d6ca8bee99f4a3b2d8fcfd6a8bc8e1b7e9357d2c0a66a65b8cdf6601a7ac965a5274ecf19e6122d59bd2563bb69434d4a80ba0089d783230172ef58087550f94abfccac69f6374bfb74da50f635d37173fc704b90730d394c17d6122f958204e54687a3a3c79c20d62e3f1aedfd704c93110c155c69a492991918b1a03f49616ec130dbd5daca5ea68f2b9e2412bf0da328d21d86cd688321f4da6ef2f34d7c329de20dba91fc90c57edccea7038ea49a502f56e7f5661178aaa77647c02e96daa116f8bd857b2890b2980ca71c7c6e7061416b6f9e7adf94847b9c963e50d0c357150662fe0a2a47ac280caf0d96a5f572582620053dd0d25b5776669a8a443a9672b6c282a971d9c7ab00c6af6376cab7c4866cd0193c6c1d0c7b7323a5858be23fd7d3df80670ed9387bad62d6e471c47c57e9fb498634c224fba9906364b26f7c254fedc2dbceb768d8de13a299d2aa97a8e66ddae5250e65ef71b8e62dcb066a3c6046e6b36063e7328f4b68d32f9d94a9d056ecee354c94be3f8e00c6ea765068af1ab6687a4ac1272d5701c02eac23e369fad84cfedad8495ee7fb1340d5075d7dca82920c358415c53df6c45b69b98d67aef2995747614ddaf5000f3b0a950d7852151d4fc3c36c028a43a875d41c3206f965c73e0f63804a0c968f387fe5ec85a254c53374625424332c2f1ee8ea9ece6380080391bbefb5c31533adbf49b0433305c89eeed906527c05a77f821483ce9d26924fe4baa206a0ac7502b95578e9598202c925d9c42d6ecbddb5e2faea2af9db7c5b483b77c28374eef3e8a250745e4e1f367c1d909b13cfb1f7393f9a5594c738796b1538ace3756dad36862a84dcf18adc2c32905801ad96fa835e852aad7018f8ff59bea3e8a86e1957071717685d21cba16aa8a05b3e9a1a90840ce575de045ebf4a99f4412f7c1f9985234b89f34f3ec17312686c932c0c2f5bcdbf5ce84f1612d417baacc3b0ccb6631836fb1e09dcbc0b45483c90f82dedc1137148695bd5d3fd87ae54aea14cf03fccb9cc6579576e1f6df210634576c49263063fbb8b0a5a47635050d419c72f470cc465117d0f957d19293625df0709c30f222687087db77a52c46da1657bb44e15763c5e63e3cfa8087d845050de34877781bc9fd60e2830da8fd673b271dad2f8378485902b6b338e88f7348fe6c7d18a5fc4c72a26d19b24d1f0bde9706fd343d1ae2744666e377eb3eabc8899dc87d64fd32aae7e5b7e758e8fb66325d418c2dedb874506c1f400ccf50e226083e3fd4d4e838c7d8ef79033848509e062fdc30553b2e0e0a11dc8a7cbdadc998058c9eee2820e8cbc3a2a9a86097263a2b2099f97575b2c663b4315c26617026fe88ac578dbedb96c502c11d3a01533f324676f167c69af0299a49afa2961e102168b7441940f1fe7877378ae372f31770f7513f6554e536a00f0595a8303395b152816045b1c9af41834f221093cb70a700676b980e901c1d64576378a227247df818593c270047605aefe4cc8ef4c0c29faf52630807126b30c5a4e89a1f92e2d357fbbd724b9e6a1b3f220e8747cec393eb70fccc17f5150de8f67da17b72edf7e41d180557b5a4f6620e08dafcbd27757dd2c4f80aca1079c54c3709b4086404dc31dd44c09106b2a3dfe8bb2f3e45ecca6d563e84b554ae297f335350950c319e5b0df9ccffa643c0496765a78d926b8c4491ec12b696a5ff242b8435a2ff9f00f9441211b2e1a210f99ce1685e4f59027e9ae0b208abfead8d164241715720bdad5b2660411c8b64dea6894fea661cccb51c4e9bd8e9626305572a1b9b7c4671140917fde4baf265deb88bbccac067b4084ca083bc84736d1519aae1fba25e1ab9b205efe632afeb12af092410e64cab7fd53090e0504bb060cbfa8f0356d62aec92ef9e19ed2c20d64402286997fc554deca7995fa3fc555d369cf3c60ec53e6991446cb777b8f8e1329761af84510b146544f87c3f59efc1a0c409bec2b6492da9078cf870ffd428bd0c5d271c12d0a763fc802e99f2486ef2b7aa81ec5e22211934f0a20cfaaef56612db129b02a288fe0ce896511a8e0d04607c565bb3dcce5f02611ddadab66dcc89b2a83099ebb7363b9bbd447c8922e962cb98810777f4c641c6a1c2632569265ede9ca29b7df2d73ec411d574e7a4208bf292b2aa372109e6667932a33a90cf052ee253cc6184534074978619b03c63b93679c56f718bc63acef1f475340ec72e27bb5e71d016212f796a6ef82fb4ed89169bad5fb5bdbd4172e3296355f2bdc1c1313bece27da48e9ec254854754d5f10081a61c012ec5a8ca6c97ef38cd5b305244d979569107f2d8e769a8099a71c9438524410908941cdf9261135f1c243263befddc89485211847fe2b401613685e376eb4142582b4fc2eee07c9c8b2593853f204dcef8dbb9ca14358edf0bf21b7932047756cff200430e9c6b3b319a249984a671927888d0c2a862d2c448bef99818382eaf4a8bde788326016f65a180834e4aeb5a5db6a9995e206d77754a31c06f07ff25b90b15722ce525c11faa602b6d2b4a38fe27dc7f50777d7f5a12cc60bdef833ec81080a891d9e73ce7a01252806eb12ac5dcaec65e63e85a18609c0ab43af55e0af7e4ec9221c23d5ef57897b27ea19e67d6e2f1d58477921dfb142a5e7655664d2c6e0b06e90a526c05a7ff4fb57e0747466aa5b78d24aff50c854405c8f4883f75e777d23725703febef1278cb66d0522f942d15414595bdc6ea7ff35ffbd8cdbaf8eac3e65ec715d3137b8592ccd41547fe72a063d081fa9748f38e844c9e6916d1671a150062346e75e84f2c64029f41069bb22a220e8bd824806f952513c047259f068990966a933f7a895e05f80cec138b6d7c6836319342c71ecc8a5fc4ebe9b93cb5268d808ff7e9019e4a9687600c9fbe0d4ca11515b550148c70dac50976f00c0d94fea906e510e91fa0964404270a5f219b6be8101e962bd7687106c7b8b0c480bdd3e4577f2467bf4bc057d4b2fbbf61d048de80765dd34cbd1a3cad8a853302e0a193339390c82d20b83c824d7f5993ad510abc3fdbf140d7dab6ea1c3fbc458f0f0e0ece0528c23edec2503d5881a229b1649c1245d2260542d38a55e83683a59943829d35e9e90ac03bb5807295455a552929e85b7b98d86cbcb193ad369ecf1dfed1922e5efa4d1896b17dab516c58f3491aa1046197c8e4081e5819e172d5125273af9a5167a105242008fe264c52a330ab611ea7beb6b072396e789bc55050241329e14b216c366efc71f3d6126385219cdf0068542ea2aed8946888d57957e119a382bce1d9d0a4438d32c3fa59544676f7b8241ac82837f25eb617b39e0fc1bae6b10e0de898330000c1039a0f623338446f0affeec841324a2578fcf70e752107e5af19b365f9784bda103630755794711dfca4322ccf5ce4e222da874a6b0405fbc2e279f827178a4218eefd3b2c13ccb45154a303aed0a15e820603537007e4d29a7f62f9f60ba27de437c015d2270697b6de733d0cc0632731dce1a6a494aaa16029d2e85f9163745d487887c3a80602c87ec6ed3ff977aaa992092ac0ab6ce88bb136c7558d12b15c10f36df03b645804b7db2924eff1088b4a0488c08f0c7cd70ff9f282e319fb320fef0669adc6cd43bf6c2d1c893d75e0ef8f5b991587a2021a1919c5a304375125b3479247411eca5a68166b067832c96e90243e45c5e5cb7650381b729fef129c045a072b552d649f4d99b357ca0c6d8d050f4e3303fad0e5915c8374b7c7c48a6ea7c068ebbfaa69ae2873f65d5eea5b7c06c1ef60f476853e5b89d79ffef692fec243c54866ee1d3fd5f6376aaf2b17add8b89d17663b3caf9d47f6223098ef135e4b68f3b6b161c4303c2c16703062e3b169c7a5dcb67b92d1d3b0fa90710ee96388b75ced66dd90c269f99336ec37b2b1109f3ece8641d7366d3a4f997874bf065726818cf83ae1bdf42035b4b4d93d0064ee626ac208d410d81cbef53e99e58327038782057973127ddea07adc834e90a86f52da92bbef7276c41910c8b483a222448fa08a980d681254012f01e489b14257c11193f31656f184d11ffc99c74ab51d6fff1be5eca8ae1fc56ee0c43c3582341123e8b84ea0a678a33e1b1475f86e1500a5687c130607acd01970e0855021fd8069914b4aedfd3e3cdb75e11f0be5b374b930e4d9024e25fc6e192b5f872393b24749d2b479aadeaa065e76f8a943e08fb0ad93076367b8c54b78740cccaeaeb0b66ce8979f2bc53f442f82be872e2bcfe0adab1b32dfde22f420e2e617750f1eb9f78ba18515a48210d5253f2d8a057968ac8830891a9ed84880ef4b8367e7dcc31797b0aea45d30edff047f09188030b6a424d3e2f809a0713b78d10c01051ad63f48eb575a338bac798037b90ffb52b969db0ae9b21f013b8264373425477e2f4230fb5d70c8f3e6641e4aa555997dcee37f6b2b74f66d6468059e94d07ba8290bab6550132326d748840f5ea2e6a6f83e893e16dbee55f25d0bba7f5cf93b604220d587d6a758780a476b979071384b1b04cffb51866bda179ff26cb11709fdae246820ea46a846c1a0ebec23b40d3102707bb71a885dc36b9e957eab487181f0cf5e746c1a99d3820a1a716c1b6f745fe8597e8d12d670591b0340e4d7cda28e8381b45e31b99cc9de06f26a6e6dd380ad3298b77a003ba28421d9982ee7434555a8e679e10e6b23aeea2877f92b95b865886c68742483ba4c70574d9f4506716dd0552b8bbd9ab4f697ae12e8b2efecd721df5890dcca056d3c73755802e2daa67ff4d2b3ef4a9f7c2fc071fb0f8c9d068c50690142883a10740f89516a852a9a7825efee7c314dba9c8502db455f6898f2611797e96c5502c0d16e798a09e7a4246cad755aff88934a7f6b2b54f9dfc814565d47522a5b47ed816bb72ab7e70adef4d97c7f2f579ba2cfa0dfa3ecd85f669aeafb9cabacf0c7b4ffb3b40ad6129fd1dd88db0b26fbe805268c028bb5940bd0a3e98fd8a932579b0374f3d95a4aa932bc90517cf89ca2155eef7eb3f2946be8d8ab925f0190b28087cb197c10cb95a84452a586d7880ea37ba5472d8ffe3d64ebd4567775db35fba0014145021f8fd4b00f505572a0417b4569dcdac83c313cb7ac67b76521039cfaca1546d9512400545de62ab5989b9cb33ff4f2e6a460074652f1214cba587ba8ff8ee4f63f93080f32099983755f5ef9fdea7c680fe323cba254142ccb6b70bf2f0e505b7c5697a5e32182d03ab7f9d2c51560d052b7e632c896770b62c532f472f0aeeee0122feec9f1837389aeb3e7d1b9129a735ecee9fb26c421474ffc40ec20444d302374c5299322fce3cb4d52ee0831f87c82469dfc0e6e25b47f2582b7f8bf17724c4618888657f83b6b2bdd04c54e4fe09fc0f8766474691aa2c275707460d727fea3c1d02057698b192d3864f626030f96393f9795ab54854973f0cd705620fe0a98a3a106547515d7bf2a90cb9a15827d5af91bfb32a0c9828e8d9886ca2559ba23fbdadf1955b0a4463c8ec3244c5575bc29825710b2f7cf5e8a7a4abd00f031bb90a75b04b3f411f3c52da7f57444df1d340eda3f4e380591760f9889f88d89b52b642aa0b223876d6a82b580f254bd08897c44fdfdd138b0c3c2a5d6170594878ecde0f2aaa9f84255b6758a2f1de88f8a9aa18e0a79ae7a1ae68c5d74f4a09b74a2102fdd2c63b039e27e02788733b9ef416f998615cbc54dc1cfc547c5c99bfb696846ca6eb9d1134e6f8cecf08c995efc5e8f9dea7d9ce291803b4d12ee9c777f5135f4864cd5f4d75a9cecf6275c42233edfeb6d9e67e9b0c8ca8c81502b5921d6590562e6ad1af51618f67f28aa40133ec22aff527bb8c41185b4d376d36656c40805d4e63559b7157719838f6b836b6737e7afaa0c43536c6b51b7e309052e8eda8aef77a79852fe7c522deece3d8d4eec6a6901ae6c801610ee6b0dafe9f7945e1f174a2dd1bf29d91ab193cb46b4b09d1d158cd705c0e0919acc7829ce3fed1e459dba6beca4f62a40a1aa24e8f05d93781ee9b3d8d7090a6ec4bf35c8194fd323e88dc63c188a7600c223023019106fde4c37913dc984f7f7d482405c125d578f3c3a498d1f9194c5f04751466a7dc9667d3ff00a5fee883614e0eb96031558dbbf589a0c5f6018ea99135b8f1714176584212b700ce947400897648fbb18dc2104e89617dabc969cb67c07f42792c0563ee20bccd63722aa495a841e0b2cabba6fa49a4a1605d0ef1a96b5a112b6891901f81776e01956a5f5554bd1caef7b742d5c32f6102361ab4b35f24f5216a71b8b318615e24996cdc3845eea89d3af62d9782c9b4c5f0b8054e081423b185dd880fd72033672763c4b10dcc186885812a4a32a551f629c4dc7fd148c710877f9dc01f32ed10be4104dc7982b0576f044c29783e35230c9f9b884ae643d350616536d0de38432d2d8c80c2503fd03fc97300c3d1f76683818447f3f9a853b135dc323b1d06ff59542dfb41b5753f24d9f8b571a4696cf1702529ea12f1a1b6a57548987eaecbb76c411c53d7caca2c616c0a6f8ec2281a87fe30bdecd1b433eeccc70e8c82aa3058feb12c86d97aec93b1e5c378ec52ca0e2827d2a9984ab958181894384813e658e5c17410ae4283c1b36f1026889c1c8334c12253da04d73866283f0f39f3445ca0e6ddc543f4b428ddbba8920d94df3669f33c21b68b6c8651c3854580bc4730dc24f087b704cb4b13eb9dcf9e36c5d4a3eb536c32eb12dbfa4fd4aa70360a054e29ac6cfd0fec21ab18fa993112dbbb7d20705e5a9bf9df32be7bbf5b00491d3fc6f1e0b9a1124ea143bd65a062e6d7329e1c0260fde6901bbe84edbdeea42e81e34ea6bcc892eaa1b294038971a150b045bdcc2d6a0606554d7856d80e1206d1c4d47e93fd70d7ab0cfebe4c2234d899a27e79b668b4973b490977e5be496d64a472bb3717661481b9163bb1d2857ef5c19449b377af9fc86f517a757ee1c3e5e39021186472b2b55e21496458fa959c0c5744812718d949223b6394a3ec791101313331a97b5496fc23f63bd417a475ed0a66ac75370dd149c1957572eeb69186169788ea97a61cc641706ff97c63bd0527016bec6bfd0acfea9e353cb319b13fbf4d80fdc20413f881832429989e8f30aeae2494fb6364aca9240914470e5611902ca2736e832e24f2f5fd45297a4800dc6ea82947ffdfed0241ac908e3bfe5acf11082759d3eaa314e12ae184d40fb978d187fa44c7dd8a5f0513a50685310fec96dcaacd94d105cf145c406d023306d33cb62de18e99a6229499bd4d3c29939e9d2022519cdeb1845e274cfeb8f4bbc79f0831c62115b5c38cfde71b18b04101790239be055af8d3da07072f87d428530cf49970ac8b5e2a2c1dcfc3b7735f303b324ea98d637b08eae1d4867f7ab1b8dc6caca144ea243aa8266f408f303687d3f06eec9910c5295bdcdc80de42e80e63f08d5ebbc4d6b38fc909a04a49952bdcb67905fb14dcbd334593e9f4bd79e453acea33d52a9902a0b72f39a7219169d8acec5a02bf1c3a9c5432168997ba381902c27604613c89e3cc731fa2dd1b698035a9265655209ee86d9bb2534b1d86bd8097e4b7a71b786b8cb39dd1aa47f2bc6c4978fcea758290bb4b2b741be5d481b01baa4adeb3ddeaac6bc69c84d7fa3ddb562a43fa8ff4cc022eae2f60e540d63568ebc4054fe0f185305fc4564469479b96d7619ba1e90dbf4f07025930718a3fe45a67589337d3bd4577524bdb81cee03d8a291c542522aad41310be78b96cdc8a19946a6399e04c4784fe203d378d5600066a78fba9a3fc251dbecc495e567577213db43bd4c360f8c119870b05f8decf3aecf8fef575fcbacc74153d048482a0f634e99de1b82ba2db2f7eb4a70d82d73738dd249a5d8cf84978f10104c91f566480ff4dee31d41c933860df69635574516a4cd3643475620ff5005e20c676300407f79b9391ed4b8f4fb11dd605f9c0192a4b41535324fe92ee8a1413794e89122cd83e188b790ef2870ee2706bfbaface69562a1484b331b22bd843c8b13baeecf639c02c6c611970cf7ddb7b8649a6b9f429e3658614457afac90c04ae90d7808e86c65a3f0be5e828e66ceaea817f0bfc81aa25a8f5c67a7cff7fc3f83f113f75b09de411d859cf028f1b45161a3e361b6a2786aea00c4bc4f115605717b0dd6a6decff0b9f6fb0585b6f67374fc62da457fe0b6c6e5818298cdd375ca68bdccb2a1d7007a113f0372ff3d7843d122f252a72f8dbe72f4ba4ada869c21f804bc8d7b9e667e119d613f00e23e976facca21bfcfce3fd544b1a9acc83a1e25cbed766fac2cc3024836f8b92b729af49b9fdc0cf2de1d7bc719d3724f0466593e1ed04eeab5c368f81e04bd4344204e6ee4aa7cff4e2d72bf476d8c6e822f9ba0582d8f3146eff6efa0f125c460b7be4650b5710848263a307d1ff6300b466348f51b60adb1cb01ee3da326d99b162107e0e7d7e67fd1cbb798d041bc3bbee94dc46ab0be99953ff718338df4a0517c3794bc8c7dad0e02f432766962bb5e7351ac97fd5d967ec76cfb8d57664929396f35dba8fb42c6c2d9621ef89961d5eab9ca681dbae0393f67a008f48c54501658f9475aaf539bdb4d792de78805a7e79e775bee05071a6ec5c32a3f68a245274eb7c65e1da601d4656973e823888887c7aaa1a05cf174196e98f6a134966c34a0c2362cc903790ec4e094e47441f371aafe4ecd70d7c3bdd8fde3a1191edfc6e6cbeb56a525786d8c052b92ba290053e9f51d92f7267a7d3d8c434567e4efdb83a3038de7bd54ff231ec415762f07e4af2735f93098f324c2980f4d3a7625785dc30b4ff12bc3380b5fd28f5b835c821ea8329733a2eb3a837e186fa0f21356290a02ba4e6bb1bfeebc042047c7960cc25786862c3efa744c5f91954d9d2a88f0bbc624ff528b38ed653b609cc820e07686608f20fa3583acb0d76e2fcc0b4ecd7cee7bba20b8117585092e685724b01645b720620b62e3ed594e47412daf1007e9a3301c1a1e9270d22d9c5896fef0087ccdda16ebe4566e0a6a69535ab469a9d36378bdb43e690052677673a9213aa7ec1ae577d012941f2b4e3cfc88d7810f86df7aa15e79c7087eb9f7d64f95cc009e542ccb6c2a0979817ae0312d037dec86335a93cc30eb30990d2c2d66b95b0f291499c074e0c8c7009a4ab7dc35eef4106fccc491552092875c439b622b4891d04f848b2fb069514ef616f032e6d9240267244eb452a43b53d7f20b65e66cd8757fac361da4b7561d60005ab941a61d3dd8cbf8be26ee0938687239c8534a070d5748fc8343f7c9883f4e54d2b9fc849fb000294eee21814003a3eb61140392a2731942ee15aff43aff25329b71326bf0e4de068a21683ad8961ae17a969d058bcea519d9a1a7af8542d525c4b059c553890721c0537a07c1172d4552eddd0567596934922d3d3b625a756567cb13b01359ed18e7e9e3204cbedeccc452a5347585878ad5f00911113f1e594ce5f32131e9969ea684d1507f89b8d548c1916286ec539552915b629f3944ebe28b3e92f03ed20d787e7b17b1385129b59dd8835161513c3a14e1e16fa9584eeb15389b4d53b43c1999e640d3de9383c3578b87bec7b796f85db1a0947ae8941af8cceb0c345ad549e9ec069b72235eb5f85789b4283fd108236f4e131c0a8766e5c8691b98f4952cdbee269caa29471778b319c251cda01ec1769c5e3a35252903d01b1ac1b1138d69c25cebb7cfe03a717e58298520680112d104b58bcf225e0eadc5dd3d42133a3193c6f7a8c32a0052dff1306b4ca03906af723064153f9e367c469ecfcbd28f0ea18b31519902ece9f62ece7390e172cc708e4b0fda64d28b7d342692185f00511e458650dfaa1c817b5abfc7cfb91742476c937c236d8a96eb25409578cd24d5883750ce9b4fe1553dfa59a1f0a68bc4abd4e5d7ba213d00230903116f7d4c64088d45a6574b70251c969f5e22aa122183569b62d1fe82a22bf47a0b3c5cc4b7cf59ea7b24f98af52babefb327b175063e8cd6e4fa42fd27d8c272ae0ee33b0c271d44540a9f96b18cc4badf3d4597c5502d3b81f0cd3bc1b9364596c04ba1b4909174a57ca1f60a1a0fc5496396bf2dc9c108b9e1d09a6e2405297eea819e63255bc683903a8e0333dbd9eabb769c6b66ce1fbd58c32d975c0a4a253208b985bc7a864d814f3bd6308bc8811311dda67009858958128ac007aa34ee738ab866c2c37084c6a81711f5ced1e9b5b8d646888ec452caf78e1f893957d6a32b4afb89fa9f9ebf4dd129b95803dce2953f247121245361242bab0685826aeb1b606d8a972263ee7859a81e2d47a45a5212a31851a17fe3529176784666486251973b3f0caf2c259ba280fd3ca82cccc946ad83810eebad714f9c3324310119e1a89c5b2e703b75eb122d441c5ce5044590486d0a22ed643f946ffeaa46b6a16d86bd0dc4f785e20136bb52de904450fefc50d03b172afe9802d80890454490d3747f6fea90e820c3bc50410c969c796d874190101ae836d70e4787561f45fde5bc064f22923e889d58dcb7ebd8b062758e10edf147814bc0f4368cc3ed869af406ec1f45004a28929a450ce3da4a980c0bc7e70f2fc19a870846d42f53ae3f0ade8f9ad934dae66ac6d7bc8cb746f151d064d4d1fe48e70268880a3ba27865ced0803e2b8e6dfd57e3604932bcdce02653548a282465d492646cb6f03276b2821b791737de7e41763dc854e73efb644589ee1f85962abf7b2c5573835d6b9e916f6daceb1dd18f3929a112ce0d0f422745b8e918e3f062ddf5676186596e18dbf9542db698d246916b03b84934ef0e20747e09739857aa616b313326a7b8864d405eb5b086a2ad3ae74b5c99c7b16d75019afe87db46b9a6d8e594265c5fa97038eb168fce8a44d7b752ce4af89d54e00bb091eedf1639e65b58d7754576cf1ecd8303e7e183710f13222508879ee473ea481b524bc29c5cea3256f9f8c70ef472168935dffaa65bb201806d7ac4e080a11ca83cb7f610fac8d85d2dabbd455759a8685ca2d9e88f42ec7f748e9529f76ad78646150734fa04a7069413121948f963c13ee1dba77658237a13ea72b4eae5aee40de70602ff27274d6967ee53fcca9d27b2e7911e08101e9080aef3f39ed092078359b7a40c61ede5d093a7b246fde51ec8acbe562657c9d951787696987a53e82d221659253c74e6840e0b78638093ec86c688ede32f4b8b801f5127c9b6fcc2a4073241fdd521089ef20e83165044042a08110ba84b04e921ae10c431cf8e99b58793d53cd7f7b1c5c2ec11d8ba0f496f0503132e0e0d121e2231ef714190bb136b7128231e0e3ac50a850e63a3ad272e68a500d76bacc0239d53beebd38ca464a08739a70c0c781eb1b85130d7583013374f4e780eafdf29c249d78c8fb9422c3ce5b4e3a885cbee2424dce8bbe205a027ce35bff3107449e3dd7251e80463500c93d0cc1769621910e0dbb3514e3e9adb747ead8dfcd05edd45dc385e5f2638adaeb21a7db819fdf0b0a6f9e8d3890392cb418e4415e19a9e03ed2ea37529320345252b3699d1c988243f2e5941c98d4cf64832e2c9164abe60728693254afe587285253730f921c9c4272b2a59a1c98d4f4e24d963c9144bd660f20792239e33d9e6c621207c09545838b8060689eb00281453d3e19c24a0c58e6bb24987e865c08319572b30523e640cbde130f089c780071b633f3c8cfee231f0c363dc0f0b834f640c3cf0187b4261ec1719230f32c65e4818fd4463c883c6b81712069fc818f9a131f685c2c02f36061e640c3de13096cae081e485932b946cd2b9953f17ed432be58e79bca6f93787b071785773c3fa04dd70450b5d93660fe5d710a873e700f0c03adefbb2550281dc52e511d071f462e05af129b5a4634c443ab635c1abef29f3a26252cbaf18bfa672cf113f8cfc955aa2374c421ab7bae0d5f7947ba341aacad6885b92b9ef8a5e5cf8cb2ad99906218f7b5de82b7792fd912851e56bcc5d01be1afe5613dc966a4b05fd56c92a9ee064a2e2e55a18b0034c82e1ee25d0b0fd3f8502e61cc442de2b91f7b8269ce01da2721dc94ea7e6846087c06cfd697bc6816ce843eb2b3f4bea54fd9c1f3f12547cc13cb54e30b678b2136397eb8888b13754a53d6a95b5c4f50bb225bf8697f3260302155d0679822263d98480216343063262f2efd4892e0811c4ce804ae36776fff46ffa93dfd3566e13477331daf897755b876e50681c0f22bd539860d52535477ac9e5875f5d0c091b630cd61540447aee35004856a95d00b6ef5c4ae3d3fde5f77bb6ea84c916bf89e9f1b813659b1e09d9832240f7d0e665a0f46ade957fec1ff3aaec1744d59f4faa9c8866045b9564a47432b9e0c79a523f381a0c2a1c5fb30b615c3186fe4036252cc3d747392266a5a8576656a053cfc311de3d0dbd9adca873326a582efd5d6a9d7914c4492c9aa872301075cf932a05e8fb80af2bb340347d794a2a3bf37e53d49e76a8a7698b566180eb032d6d99e1295abcc10b40837e05fc7f6c0859e163023f7a2b493cf6351c5f986d82a7b0c18acd143974e5d73e545dd74fa83228a2d27e44e614bc58ecf5126b07b2a1984cd53e54b7fdc7643a632a0ac684702c5008620ef0a2830f5e21e8fcb0e2f41f6fd3a2cd34a65811dbb7c95731f2e1bf9a409fe6afbd83a012945f111ed6f738544fed08785ce2433c49742e28539b511c1c1a4fc80ff98050f6fdefa2c3529201820939c2abbec0eb315be14ea6959cdae86e09754d6e9e6b25aedea1af6a2bfd0bb4f585b8093ba59a2446f4f5ee90d14da2eef723a651888c382806564457c3906793bd9b90dc40a923e000aacfa06ca4e7e988f4e58407aca82c2e7544a1cdff91409b46a7e517249962d534507a45e75532c7420ac413381e0ca1a2327956a260a84bea4c02ddbeadc92d6b36a7a159c74cb51114549f7902307b4e5036ab63e0973be154ddf90cd9cfcda8efda813ce0f2f269aff78924c72bb70a0f67312ae29a1ea8ae7549d4dbd3e5574d4dcc86b97b3e64b2e1fa220dd00d2affb1a0801bcaa543ce54033e58aa5fb612cc02ba409764305cd33d87d5524287d3016e04c292536743c1a07b9fc1a16b9620df97e44ac92b782ad103a96b7b0831957339d29a3a2de9c47ec418300f7497168fd321f89e018c27c0021bd56be2e75e05a8fc5a0fabc440161825619367886331538890a13831849ca5a243f0a1d36a9be4fbaf4653650465eadfc0df2bbb0295281bad130c6fc0b1afc897c58bb5f76998fe3808b5f3102b43655cd0bbad5fbfc64797e6af7554a7bbb8404b7dad9ec0c1eddae12e80c312abb728a1fd2932916c414066113d8cfade6d6b89236dd63b4678dd4e566e17a726f2855eeb95e68a4f54265ec2ee1d962ca33afe5ac0da3c774686cedfa06ac988d4d65cd86c50c65cc1af2b45d560fa05ab0364a2ac7b8a95e26b3aedfaa3403088b34ea557b188e1f408b17481c0e5001082061ef0a720f0b532047dbfa1a6e7917c0a71dc01f798770091cfffa156266a6009897d5832c8659928a3092123644a70188879459ac20473488cfeb0b0ccab4f38913a4802fe87a0c2ba31d402559b7b68054351d0ba1255ae3ddf9eda03e9e53c167cf45d36739d86eb3cde6c905ac593ab2d9cb3e4b4f0f1805cf884ad9d5db1e92a1e94ecf73e9f471d32d7a89a1b2ed0d1df8c3d0fde6a8d3f4bda10aeffa816e17f82e6893c5a933dc9e84522e5a9a89ad51681f1b479627f5ae063f9029bb8b522eea9ab3c676004dfea7aeecd7fcb2a60995baed01fc1c641e42b31bbc2381ec255d07855f7eae01a1180fdc8cd76479a76453f30d7d7c5e65ce0c91ff551a584d6550ccde60e7907021a0e6ac2cda799fca812383d0475bcd0210b21f7fd3c51b30c240d9e644fbdab05132461c5c0d053b1bc59c0360564152e4d4c196608020ef81ee8994474373791754579f6d656d00fd4157f465b44e59f305d43924c411ef1e200ce0ac158d39274aa58db5750b0269496962eaf0e9178a4267cee22f9014eccbe5015407ba445213bf649f028fc699dfaae2b470b6240b17c2186d90eea55a5a2abc923727929e605ca2cabb5495431908306da90f20850d0ba8a26744fd0fd08251adcc0ed314199cdbf84243d36922685d28fb1a9b3526f3074b58dd36cf6ca87f78be903e3f6e5fda1d5c378e555f98f62d61db1cca15c7c724b7630ffa6f23e41e88d81b4e69724a6f5d6801ac9f0adbdcbef0efbdc28a0bdb88535ebcecd8e59d434f48e3c668f9ad62ddf6356cd5a3787ea4d28673506257e824cacb55b57a590b93c3accfd87cca1c871dd99d6fbc6552373e9a6ebaa81642e70fbc3a9eee03051fd43e0fa3f5861327f810194649329e46c805424da10680988e68a9437dd7504a27d94d95356a0137983b58c06f294cab4ab7f4fbcd892b51441c15d990f2f1394d7c850ec1232ff0475c6a5e36fd5a445bf93f5c58c253ea194868e249c189685363bab22a83a7a11f4a0122017e4ccde67a4e8cce1f917c212035b939ebc27c0ec58e2bd15e5497ed2cab22ad3ad33194d7eaa21d8d4cf80306eaf878ad43f7a18ae3e671643a78535d9278c1923dd1ce53514f7451e12ce2a71b8aa8c999ed9e2cd625005251a66914d2b0523525b0ab3794c5298ece01a39660c9506280b1903f7faff7b15cc72e366ef77336ed666b2620df101857b1edc114783ddc6462c747090f02192ff25328c5a921b46e553d596c5775783d8be163bb9d434097bd08c1fb0cd62a3631621b1e48516ee44480e46ff672644b83b99226c51136f3a036f2cd4b2f5de20c38a0224c07e62806ad9c6989cb180bb6271fd958fcff133c878bf345d351bc6194243df4c0a3e55b31960e07c80529ba9a8dfb667870a8640b304c7b0fea8e643c70517cf052522324684fc9ec67eb6dedc281059416dd347d684a246518a9396a23f5567e9161036b103d18ca5172ca32c988869c9740ad6ec252cf109e3539177a2fbfbe95f6bee395773fef2b2b1522c8b855a14d65a9d8017886609056dc3c9e77679c9fa354d9ecfd37d209ab18a69bc57aa9ba57dd912fe34060e979538274dcd2d2858f4e000d6226e5650d71b812b4fa0d48616a2195bad28a7f576c75f5ba30d9506316261702a92bc07d12c8b4ee587ccec3d81d1160a79e9b297fcc524b3d35ac940772d1840f9c5237d9f7ef72f77f01f8bc41a84ee677dec0cd4e1013e2a54f0005dde81068717598c64bfdb47c9786d45f19ed702a534af0ce4a0e71aa85f90556480ef2bdfbcfeffa4501d4777f5969d01ee7a7faeb27ac5186fcd885181d91239e1fba844d666b5d098a025d8aaa7326d3645442faf29793ad29450cd30f827ef13987dac0f5adec5da292a37ef91ccc414dd234b0c37916600fcead52d33e6b2b32a3c2bd063dd454513b8dc2817ab520f06d36fb1b48fdd04a0ed1071de1bbdd137c5a1ea60772716f839bbfa3fa8a4d70585b0cf0ca03a02258c6d14aa7ee5e23eb5b34dd2f0091c26a741cb39d9a3b4ffb20dcac79c3a97db4ac6cef3a6c99f43730c97d9a0aae7f5d99fabd71f20c705b06ca0ae411f3643f33202cfb613b42722f8f06e0bc676bdb26422209b9b9a2763c3b936f9d8c9c2717755c678077a7818d42c1554d2fbdd1159c66b5a7050952e8e8deb298226616e04d1df8d8483cf9dee66d6367af2909c5daca1599aba3e543ce4ef0c871c53376a609b08a5625c448ccccf1540c4eae95a4ad9d7157dfc5320f39c7d3acb013a10c309ec9abd3f74e905796a6440b6adbdb1093cc820ccc87244b1aa51554d3bbf7cdd86e29d9d07a5b63f04edefe5ec15fe526c05742217bb7f9b4eb8eb9ee3219f0922e4cfd560296b24b13ce20b032dc4d22c31ed29c3c5c55472d34d3ff2eba54149f8bf0eeeca371b128da2b6dc06b38a7a3365ccbb7b61a490981cdde4bac6bff3ed1ce537b31538662d7214139f5f48d38fe7d017a14e6e51794c742493fd79b0502a846af5273ecc3dcd9abf2d6e9cbe9267ac9d1971bee5e1bdad7fa8ba753a30e98e5f2f55b0aed6d2a9ab5d1c2f4c7f0cd9eb33a56123f09429bdebaa0e3bdc46b4803ed7e152eb33f146f32931e15ef58064948937f62bb2316ad38556f59dd1d4416810a32a43cb68fc19c3720c47f36c35b025b6aed223752ec40c24b59f24b52000e6ca779277004ada8b2d967c5f862b6dfd322182a8e57b1576ee922a9d76a422f859b36bd9a04d917dc4d26fcfdec83481fa8d386c2b6f819a178cddc8d7df2f69ec7879feed3be67036618c5e108365ebdaaf67a718c1c693cf415dbcaec3903917a1dd0c97f6de697c01bba34e61d83e84489d52098fe366055e6c1883e677ada58a29dfdd49d1d18b50095791d3f2df16aa2193d56ce9d80981da8100a6f9cd93f3fd2fbd81548883cb085959ef46cae776568f877fe8709d54c32cb44a0b8d931f1c3633b3b30ec2ef1d771526e55b0b055576895bd2ef3089393a88a140739e47e287c0e3624875486dcfb593f53486e67b4bbf1a0a3413ca33801ca11d38562d3ee91be61795a9ff752944e8ef737d8367fa9d40f78067da51ab21371e6a393b8ba69bdee84d8b3eb53de87bb0805bf80d04ede29c40f9b3b410f58568e8fd188f4c038a56cb3fab5b05a390e306cfb8d811102873866be08aa2d478dc65fbe3f594579dba7a3536941ed35f00d5a01289c2dc9cdcf3a1e1d665dcda982282f1e25e1f37f1865a392726c16afa48f88011b2fa9ed3880a1057ecdc57db32a5ea4928f2c3129d5cff51db90eb808ec982935098a1260e11da11f186262f79e0c598208e283b8a9a34e1c6aaa2c059422638fec3ec285c162ea6aca345755beb21cd375a49c48c6f93bf22edf64288b6def6f9b8e8d54f20668c7d0f96ac53e3fc200733ae2fd4afaf2833701d2de1c4c482b63e2ff686a2ca1239a05875a561bd047d75f8cbe6cd1e09fe91bab7c9e18f41e5f65a03ba192cb99aaec6636caee80e7b2123d920fd03e3e6dc841d28c521174557e7bafdaf749606bb4ed97e59fe23c2c0ea7c8d2f3a159546dae09f95f1359693d45c74215daf715c1690caec103eb3bbc05d975e0e467766ec64e6113b54c4c9320c26f39518a0ed2871931ac6fac3b6d2dcf66fb5d23417b682a6fd418948a31f775980a7fa5e984918f45aba9184ec1dac1f6e00a1ee2e1d24f68325fcb57afac2cb492b733784b8ccf2ab209c13e6aed10291465bcdf8643920de9907810c57657000d0da4de4cedc30a8d582be606753a70686a0f921ecc9b241ed029c20235cb0bece887e16e113a5d42c5afec8b511b3b67dce60294633366db1916e3ca541d422ef79031985019e19b5a452d561b496e0658832cb86ea7d70b1874a287894d194b152658f5163a4c3b07b917db3355420947e27e0786d329c4c64375709226923b58324a5283839686a5669454fc7d43d06ab84c515f74e6ee210e45d38832607220543b5382db8460251b50d606c8c6436881134c6d844f3b2fce7c38841ebe9f485ad124d74511721dc23b3111eb186b9e8cde1fe655049469360f48522abaa7602ce6f18a99f1598b687e9692f422083cce7b320e099344b0e3cf52be2602dbad7827b5e0f33b5bc60cf1c35ba51d76a836941b2fd04bf3de9d0ea68dd43ccd982be49d195c8ca0e16c2762af86c90500bef014fecb54b9da99f8b3bdebd2047bdae1e4575b28b0d97c3a930f97277da2a8fc0d6a838d103a9f0da0b3a81594687674723f827f041dac79c34abdf6fbe5aa82d88a0bf5191707135364842914b5701ea5f2e71372d76f37699a642c586282c42a8b862f896d1b4753299cd1ce3f9d362b41ae24f93d772b96876fd3e16b977d2e25f324d4b9e4dc8507897cbaed2724325c7424b975c941bb363e105c22e1d5755dab253e3c5c40f7e97d3c992decd16e7af36e41ee15e3dbcd1c1a2133a0a7a39c75c9e95a65f32a5ad0be509917cbb347d173b5a2da369eef715a91e6c7e930c18e661a6791b62e099a02f1a329d352c1ab341295112860a0ad990eea34608ee3bcee09a231e460a5d213459c9c74b0b708a3e17a240f7ccc0902d39c1808a8799870a7433044eb69ca560f0308b22764dc90f0bf43099de7a12ff6c3bd0e0293d0176a1f78e02e8022d6352a66e0b491b76ef54b7adc9985d55b7027ba4809a0c9a168c4952918f35aa961265495d712a29b250c84fac4851ef77887b4254c7fe6f98490ce96fe85347ce830b831db2d83c583a8344cc13a499c63ae819f4d368da675b88c86964a864a484177a8846630bf353915f0f30fd97c0056d0f979749d2490cb3d2c06c966969f2cf8a09e825e95a5e0b026b71685fe3e3a939ba51332c21a87a81becc4a427e81bd55e39d57245e75efff7463b0c2527b024520b00a5c2962ece497fec76ce3f340dc68093ab26b9d98466206b740a084a963434ea9ba960facdb925dd5aeeb6c349a49096ae17e643a95d65eb77adcfe328468b122836310af2dc27bfbd2f4f755c8809e4b73392f644ca6fbc0a5e1c068147e97642f0f4707ab2679340887919682989f04e5fbeeda0b6d1697e9b717cc08c9bea85385f682261e3192ebcdaae1a14dda467956ab46ce53371505c91eac668e0ba4d255b0afd0bd6850328f830952d0834176242a9d738a36a71e318065810d6e5c4e07202da026f3744a81298724ed96880b9a816a4a99ed3112b661d86bf37401dd32afd88dcb6f9502538c0004508fc9b391a6d0b9c5520c3c904e19220e0f8ba090150ce1de72f89d2ba399ab910dc4d6cff6acec839c591b0f6fbf1480b66152aa87cd23a43f46896667a6bf6eb8b74ca4f5c10c652d0d842b985c004a8f5abf36d96d5a158bf8c4c46d0a920121b4feecb0112561f4072404eaa34b665fe3f9d88cffb968f00b376fa379b960b73a9828e33bed01ccb7f8329dc008572e71bd79f0a2bb2d0bf74e48daa47c1ca1b24ca52b1921957c42badc8065dfea7ffc02fca79a4d559a20249d948d66feac29e3f4a822801d4c72c86c7486b7a65c00d4c8a6fc7b0c2d49c441f9e82577b631e197a8b188908177584a075c47a127b69a5d2f069d7a28059ba2d744cedf5c261ea7b8f5c2faf362dfc4170d3b1ece5faa645e969de84d38d695a17848d7d894e55fd2b012ff9f210be84a5c5bb12de5baa8c561109a8bda0d26971293e66414e8c2e5cb2208adb64c339903fff4e2966d4f5b3b505dd8b09de4f8c3ffe2c29310bc1d80c4aa0e9780328871ba07fdaf896f100ddf316963dfe0434a8b12b14644446f41f2e0d7f92ccdfc93719a151431abb11bec58469ac4b9bcaffaca908b00d4bfe4358a49514c3c358b70b8c30e47cd2bf39855294991a17bb511d5def6d22b29c31f8d0c68e5c2a203f095cc2f5102db5364163584e0ddc22e260158e17834e2814cbac76ccca388cba5b842e8b3f975b6c133febf0235ec76b76cab59b2bc379e9f234fd021fbbb82bee5967fc34b4e820d56a88d5292f8d0cb490a1f6f4b8f130a5ab30384558a58b3a928340b8eb4831c7b1334626686c4cc0993931ba30b371862f8e01ca4cd15d09e102c43c4cde8b588fca4d67f8ed0e877b8613e0a5b0f751eb059f8613cd7186eabdcc41a43ff342dfb34ec1523808155e93017c0d2d6a4883dc71d95822bd6f9794d8ce802eb5c2c6758d2814e4e2afa193caec3a4a12491c901154c946f33e9d12166d8587080269fe657e3df963a0e903f3494abfc979c262c51a959cb8895f53a008ce8d95bd2d0ae46ee7286ae0973d1fa5fe40bc0e212dc5eb4161a18a420cec78be441b71f8480e799803045a4d58503ace309748411cbb1c84744ef9d22fe4b0a83b78378cadcd1fd0539a90da2b484785188be0c7cee14a3a3849c7ab4d88ac8b79541c3da3529701341a5678abb492b15e61fc4bad8a8264286106217fadfffaaf6ae827c6567040e000290e14091534115652e1b3ab65a07fde6e09851cf8493bd810543d0874f5d0511ac4f302414e931c8982a2713711f4e9c8c8c50284831194e220a446a3752058a6cca741fef05e55bddde18f8850636bfc99f4360701b170eb40dabd88c2b6ab98a118f103bc8c2d193093569ccab4876148097fc94763b98f89bd47a2c79ebab92bbdc46fb589727dc654deaf20b839b4180305d59998ad3b11fa54a9bfcd42f287e10065b85ee7193167a4b70a6f52bde9416c460fa6de88060a49c3b98b62b3e4df755fba4aaa3d393949d656c88282f0a985def6cb62d4ea05ed8722116338c652c63a9ff9c9f0bf260e841ef05bae9d3849fce8f131e078bd0e40f8126294282719099b2b01df48ae35f98bf5b4527f00fa54c09e25b6c83cd5c747b49416273af320887409716d54b114b6a774cbe140fe75d3bbf07b39238885ea85e51085f8c875da0b0d487101c617686b0055abdc0ea83c6e60bace293cadfdda8327d7ee215e2a95de2e603ab2d6cde87e822ce38df13becaab8f414606905b752f867ff7283174a314adee4020514063d09390aac829e52407d851d25adfd16a275d405fe92f371737dbcabd99413ede52b181ebf3313caf1c8c9f309f4996de22f518312dd4fa842654ab0fa944be97ba44293430321ea10929b66eb2737f0fce43a834d6e93304f86170cfcb023499a1bb7cf209a998100d059d67f1f40eda00bd581488584c6a1f3cadbe1a7a0fb726d9bf2b9a264996ed6275a3949edc73fc8bc833b4f7bea84e97444c5a4fee2c8dc4c51208a1edba9a7a78686aafdca6c96f17917b6a145c446df6626dbfe096917ba18a1e7e48c8a1f1a08176fb1252eccb34f325ccdaaa56da56c1974f273a652cd4bd9807e4e8716b9a2647ae10f4ab7b12eb324ff3216a7bbb44fedb340fd2455e0bf6f349c5270d70952b6f63914a3310f0cc1ea579aba5ed896a422a0f65755ee4a3af3461cc53e01127ee7cca8b3b6440df27f8d104b9bcaab8c34c61a5909db18c9373133189d8d13cdf7b09685dfc272a8125a4792b12fb68ba3a3226c226d12dbaa89a17ead58c435a73eeb8e3bc9edf487080c2ad2bbdb201cca7609ad7cbc0c3ab0a63226e69c4c61dcebe38a1b37cf6c5886d0ce5757dd63b37b887b8866080d40f0cbaa59326440f8ecf181007e83a5bdca4162ee389a2becc988ea4fc82afd66e1fd7ac6e36837589caf48e8d777ecd32b97fecc3a7ebafee00d2ab923e4312b35c20677e88b2db24e16c14a6ccec8ee0acf1ef5b46b030a83abd569646daffc3392d054f4df53bccebcc4761654c37e9c885fe3f3ae8fe872d88a9245f90c8c1000c6cf9d89153d06ac7cba04c76da952215573e1ac3ff82ef00fd1ed052468c8d5ca420fed6b728ee3834b957df50e5a6a5fb4398419ae99fbb47e10cac2e00ba21bdcc43bf3cae6884da3736bdbf65f9cd9875b590e78dfeb4d716359f0c0c4c3afd027c17ebb4aed4dbdd8d3cc0de0a915885fa36e2cb4e4630d9f05f88ee3879f00beb67d1ce5988fcd990262544987ac272c81b5846c1c65cec3eaa576043ebcab05cb6a0e62ce95eae52d63a6994d69e0c1c57087ec95d6423871bbffc8170cb8f6d0a9a58795ab152645e0481d1acb790da1193387c5c9bda50432733372d57f30c407eedd5e1271f09f1c958f68c3ea732d123d388ac0ce103e20f5bdd11879627955c794170d51032009a4f768896a4db0e19a984e6e78aad1cbe4260e9cec581432084d0090e3b0c22d59900b371c2e2aa081def538ea974b8b98824176660cdd9250259433fbaf355b517dc1d9cafbe333505e101fc5bd725950cb02bea1cbd9f056ede106c820174008c6664af8fa848f0ed03e814d1f87854068bdc4433aa99802a3c63dc0a329d18272c80ed239017dfcb3cb02041c54a18ccdeedf247c8bafc62c5c826c08417bae9c774efcd05e4cde85bf4b1b9b4116c5e70c16439a43e7a2c74460a81a1112d56410abaf331e3463e956774e83e0e9abad373b915a0435a5ebb1f2b6a47496f94489976dd062a8399b45d6ad7cc43b12498bb3925e9f6d352723857be046320675abdeb6469d09b756ccef4d7ceb652ad0467b41790dc9d4132acb5121524877ef79a43ab53e372bc228acef6eeb2c94960981cf92edab0ef7d9ef55cd4891a9f9fc9d904c515f009cfcfa945506987326a70789c0e8483948b43a6ffaac0f7d6cff81ef0405515e72f2dcf2fbe3f1381ec58e6c37c9e6c1400b03f50a007bb3245c9381161e3b5499f3e6428caff5339e301cd68c0f0b8fbeab0c246f828a7431ba41cf62e7867c57cd68d8d9926b141688e940758da66f8c230e262bc7ad7a58ce84fa15a62ded91122ae7ae960bd330982358688390a1296806debaab51392812faa5b8c7ddb9ae8fd87f7eeb3cb4edec88f532dc688cf8721b85ad5b3f17d594722e9a9bf1db7a55ea8b29c2b62665c2afde2d5036f8f9d876945fa465493b406738a536e0b792b500a46293efd519f29e92c2fb02e70c0984a344394ca533b3fa2695fad16be1644b70f01839f58340bfe03645bb7576871d36ea058cd96e827abcdf44119b024e4531099888079a53a69518b9e664938c419c07e77ee30917558fc7437c04ae67c1608cbe9a1509ec6b0c6af746db5d6db0ee8b081d316bf1cef7f7ea92933ef128089f0b7f3425db010e6efcfbddab960c7052289872313a64333422b9a4b3cb61df6402164dd478d1298a4046f4a988acb373dc0fe397392edac2e506b0f4bedea64826ef898c69a841d976a4dd83f8047c283363486425e436db45d324073d498a3d987f5a1148ec39fd760d87c98eb6990f4ccf67594ab2eb009a1c07dee4224ab6f1b6a88542ff93f472e97c8d9e3cb32fe0d1ab558eecef70c5554a0c7e7dfe81e91ee587cc80a57a408fc1327ffc161fc820d1deb0b8080519e1315017aa754fff720b0ecf37708837ca8ee711039d919f828c4b852752d437fe47c12d7d3efd06e183e8d61ac7a50b448024714e4e2ecabd53aa154e5bc38586a7f09cf5bcc2f7accd02879dd314dcb1050bcf37dcede83c9ea24735413e525ec048a25447045c003aff288288df0578a21477ac4e0a33e5818d559d41c5db1715300402e182f26dc1f698ccaa5e808728d70a32c0de9018cf9782514874d40b7f6b5694fe31d07df57a2dff69fedebcca0b4108fb4d5f88c9ad0942dc84e0291f07d43226a0d308c7d12df42e608c07d43614e0169cee9085b1c5e4088717af3a5059b454d8311730e027c277611b6fbd939af4f72debcf66be0206cf983c009016e9d1733bb16446b3d64a6c24e0c5ed09eac9fe0c8fd1ea8ca108a7313e18d32d41951a822a9c8fa192e447b85a411462682066d6a4f1a406effe793f5242561396b6224bbdc8db37e578b5ffa88a934e905b15c9c47e1307f69aef43fc0cf7217ba00cbf7537dc09773615c07a1e578fe54745c1bba26b484ed735596a550277a647fe67f897629df421e5d418297539ed027879d5f9f5eb9a812b081a196820bd2cde1a2e3cab663b8c820b141d3c4bbfd13b89912240303e39e29d07d0f4c84717409dd2fa42e9a4141a9d745728d2a2d8471fb36da323b5f42104e0bbbee82cd5de38d94f384ee9ebbf13f2be6755b3ac37c53a74bafa9d64606136ffcefdd66eb96016aa56fcfd8c2a86e3733094d63fd6145919f2167f47af70472b0a077e98fd4b917b8393028929152192beeb335657ebd73e17ecb70ad44be3b82dcbf49637e1fdf06f9ce352fcf6b9d31a9f9aa78df16a820f98e8595b46cf35dc193d5778b33ef60e4be13f601e416e3bcd1de8a7698536806e7837f043f062e19f02da87aeddac46e7397a9f325200f2e9aefe8a3e0e51ed4ec7dd0a97309de9def0c29cc28d80d4c75211d43d845d17e4955d9f3eddd9d9b5675d7ba74e575ef2d1ef3e43eb7e647e6beeadd7815a15a9432f7afaaae78670f46c352a3ead8c41c1260eb3bb0f6a7d6db59f4dfe2ef59d947566d936c63a9975dcc0f6b91f79e3872f0e762cf2aec82a1d920d11f58987060396679e89304167f0a27dabd06ae25c384bf83aa2515f6de60ed48ee5c76cb12283213ed7f067bff40d8ae1d25bf7744c925a2d38ba3f75fc0009ccee9d7290cbf73face58482ed6e94d77ab5d852b773a568eb9d22148388d69716d7ce999bcd4c508c567fdf76a8e729e56ac8d736c2baa05a64670268aef44c5b9e118a2b6ffdd86659369262c6c8380f8e2c6711b0e609d0703851b8f44e729fb39220b0be4ac0fbebaf71cb1b325cfc6d7893dc648bcc44e46008f222456fd1979d2011b55d089641f8f7b95358c3c15fc611d6d4a9d458a5fecb1d532db63ab7138cb00651806c1bdb1d38b3dd9b87f6f4382a948156817d663a001df7da368a373ab51f286510c7352a7b6a89af682bc9538976a759c34f2039559f49b658621b8408f01e403e0142b80780a73ac5883b77543f4c4594e685253e512cc891e48e5a5a64420ab8347474628a28bc6fdb637a59df729075e63a650f581234acbbb151a0e0605caa3b8902cd699cba0b5c7113555b7811238a2a8d7259c3394a0719b0b639cea51bb9840a46a45869a571df68420791a9c4c58270a61804648c15045ad9c4135fc231f7f4f8055f6584545b783f6b66b4544f27b8a5adca45eeb2873491691f14059a9c3672173a472b910c789119fa4a08bf11542426d4c4aae849db9554a0232e0c7fdd2596a5c7e463da438826ffc34663964a1887bc2cf1229d1be1f6810493c22a5757545c96841cdd435d43d1920b12c640074b1c8921db2cf6a45d857d2872bb28705f4a176c0b8c26f047b0db496c89021230b9d522b47e0111addb1568b60715af09c609f6980b11d32b22b92eb0c14827043e3b4172f3a8b19ce1e7eec0f52104a8c954dba4fcf9699984151d1320c9ecb6cb76fc30d59c0897f8ffea689ffeb1524c5070159b524c08188043a2eac5a91619823e2d66092069bfa529c72252d339d57aa3bb73e33cd69c0a9245c2efd82edd7869152c3ee3141249315670db871a655104a0a9d4358d8156e5a955ac58978c5b4cb8f693a414248c0b6f181a5801338006520abe30d743ac634107ed0759536d158c88fa2366b11ec0b6dc9b22836c85d03b6902c5b0dd8e051d514bc09607414c2b73ba3ea8d75aa0e94e46e42f7f3d50c0a393b9d5cead16742d6d97948bdc4f6f72e5fd1b386ce34ef7ddaa6ec02396a6a4d8194c58e9281424df9d3127dbca739f74efbb11ed6cb08bfbcd6bd1ed494c73561cf7ebba205739aaab637b3bd0c9df69660a0f9aa7720d5c91251b34e1efbf7db5093f12dbb53c96d4c948e2533508abe25fa19e22b320b06580075b620aa8deb04836f10469287a84cf28eff419cee32303110d586dc8092c5c420f903775263650c80174be79ba2515383c6927d12547803e15b85c434870377ad5a67d09bd6080ac12bccf1dd2790acaf559eda18e1cf7291bae44c52139893a2d530157537a5ff2ba1d880cbb18415e161b8ef3e7e5ad7017e5b0141fa6bba44b8563f832c89e82acdf8ed98a353e7ff333c0016fd0cf2033a7d64c601b02480e446c71a333018276fdb125820a51353811e8464590cbd52025d4895db9588171c51c606b82e032657930abe00028e5c178e01649ac2fca70264eeb60065b235444c915ab9f37d9150b2ff52887eafebafef3cc8efa1be03f5e243785ec7d7f2df55a75d801f80e27fc67bb721b416c10dc53b710dc91295882ca88abe6378ca410e5e8f70a0f173e36fc7169e2f957f1020a688281e88d352c5396ee64c98037598e1b149f456dfd434d2c7de46422eb9d27521b889016b25c22cd22b43a389d6c7da032ddbb54e9587e5b5cacf649cc3f3487747cf53ee7a2adaddd8ab734e76e53197ef205b4c6dcbbdc14edb986a701464f00a53d96897d27a1de186620e5823df621a6d13c44100a14f679f74023937727eb494c8676e23f95c7d4886cb08ab56957de0e977f10fc00d69c5c742e1ff71ccbccd447f299e86d3e2ba5c280766c3f6068cf0e7e58c64ac0929ec96920b09149f3d76c7d7dfd30072f1d4d7f026e9703b6ef3decd64b932684fb598e6fb2c01ae728012f40451082abb7818ced873d4fd06ba348a63c15875da1d8c3c8987d65c80f8de9076fea472d02c52e5208d483ae865215516642e883de83cb13945ec0fbb9531a2d594a523769febc8243f411d21212051cdc4c6d7f8a69b99a66b7c269fd818297c9dbe90656448beba18fdf637bf95239a0e1966bf58e6efb083f2d531f5438f758ba931ddf270703031f8ee3a722fde24ca28986c7f46b8740b99020019294d0debefcbfea35f5cff796f139d0ba5c08648f831a3224e9f4d77590d356bf37e579d1be4cf3f195af5dd6386eeed16756cd0547d4bb1f68c18d8d80daf9bad97cecdffc61cab5bdd233dad64db4ec9d1b0033c89b02277629402eaec1bae76975dcb179c0680c283e102151dc4d1e1725d5b6222eaf446135ade3c263bbfc31b857b213ac8bf43ff21705cd4f95811ac118162c77a6a04c806f7c58c3c2044a7e9a19553be3dc1b07ee0264e57976dd5c8822f1c813657e055e2ae9342319d73cd62ae5e6ee2ea3232291034efd3adf50da43bdec88fea61653bb0cf29c74832734461b7d1d05b9a6df628dc5f7e7667806695989a64aeaa0bf85d1149f1f80cbaf9e75c2f9fe11e43177408e707cd47b0885ea4719b13f5faf236a8be3f21717688d559ccafb5b2414b9bea4b53856290871874247a8b1ba934a53a90984a7e88849d59bfad726ba99f3b23d76dbac020d8abbbf3c044aa9eddac51a3f77b6e8672b1c8f86556c0d54751ec77cedbeb20f1fde931b310bec0639f188bb0184ed785974d1ed87177656abded0a073af6dc6378ac17ccf72294576c8eda9c6d44d0446478eb9bd282645ecf7b6e0f3d9b9503990435b62c3c3c5cd2f198b52f3b93b54ccab683710e46e7a2515ba9fdd8f0781be87d6e1fb918b7102437f2af4dc1473e6419d20f7ab3dee0e23a1f7e8f5f1c3c3d7b13e2ac47e487862f0177bdf9c145127bf831fa27d39fad02f19728f725e70f43d98b8bc22d3ba30df460339a233e7a9aa8200d28bf1f930d2eac5eaabadd16caae84a4526d5b466602c88cb049f8d0a894eafdf84b1e47de9c64a57c9495d3540c18808f97e69064cf4ddbf1ef6dd4d56ed34779a4cfcaa9167db8387ee887458046e35e3775a44d35a21d8d066aaa71b12720cd291f05b092416596f205f22fc238344c85b733339f8aed445126c3f3a0f0e739d2d03353e58366c9e7053da31ee403057237c9ac98029e83f1a12ee99b31bd82e4611f0bb20e1f59fffb40c2ddd3143e7761dfe70ec536e0638a9c24f82b4a4b538576779cf608a7e03d2cec1e76ddc3bb26896714035a405fe236708fb6bb90d126cca7d61e6e9850fc9b4ace0568da23c422aad0a50e792bc778b707fa34a78f51599980e20e60d6f285d787eb21317f34cfae50afee6b9b1c23457df65479bfa6abf68c852504a1809c464df201627dbfb9abd1995e4d9e2157bc885c893318381797b52fde4422fba5f7a703eb127bfbe97301623723e4b36aac6a844efa62d8cdf31be3393115a4e52abcfcf4177c33558517ddcf944c2536f8de5622cae388e24454e8c8fda6dc89c16c1d63c51e67ec1b47d0f6aa0ca72e30f2fe318cf3840b0f9c47150b9a1b2dcbb5909dae1e83a9b74657ad064fd0e886942267a359ba45810f15be401e7651be23d68d2b41ac33421c7a0f11318d1f6ba0f50096d4408bde0f21b07d9321197cc45a070bab0dce3ba924d41f26caad31dd77bf71e37ab1419083a8acd01aca1d70d5f97f22519f2226cc03e2d111f7f9bcb73595c6387032cc9aa4d8b8c9c84f1635b44dbdee64c59e2e629c3681e167bd653d8e88c4824e0bff6ff09604064846ad924b58c8dc46bd61b3b5758f7ec6f6217cea8fe27fb282362e9e77aaee53561cbfc4131064a5c96e511a6407fa1fcd60e982ada0902d2ca0a724130e8596144b34516f45b8bd1c4313be0f6d85dbe8ade84f28f72a35682ffc3c6b021b00b2d3bd9eb41b438a5b935b4f8387121220799b8f4907847b609f8f84683f2914b9212545aaba4410b8c356ccc27669740ff2299f5c0344b35c6f4c0ec356433fb962e95a37fc80c8ddc0a1466281befd8532e9e97b039b71165e1f5c7686486386e5fa3150b4f43c2940181d8f2b2a28ee9e118abf9bf26bb8751c4e6d1ffd6c7d20bf7a047331ee94d585931146ad95aa0ad8a8c994812ac30cd7d5999fae3d1cf4c0ba52f0ddb980310a2f7089c2c45eebf54b2e1e470b37a9b4abd07b50860b4a8a5b2845fc49d3ad350bbfccdf77e6f2a88154870cae39904ac406a4aaca62b582e29693f7d7027bdafb2f555a2fd95e028c3ba45489818aac176f93ec7dc51912182da3884d382a458690de2515e11b13870c219b89995d4cc6ee105679a575c4f31a8d65d26103a73846f351c6829c622d7ece5f0b8a817dbcc97b4fd8e607eecbf78fb1c8a07501629d825f5ad56a5ff460f91221a44b088c0f28d8fe182cd67249d2f5c707f9c0a450cd8974d79071d4b0ea9402dfc020414aea5af122fe98db838f8fda0c5d694fdd3889a7271231300b3ea9a15192fb6a84169fd33cb28ac36d7fdcc0e1e09250a07186f6f1a2c2d02e5bd89ce05b8293ef906cb8634d2f013ecbaf8d513e32145b89d339d9a8ad3912444b14196c27ca5e4d0184b6387e923cee2ee9037009ec95d39f6849f0acc3004b309cc907aaaad6fe0f251971a1c8e8bf89777a44b9f389ebc5a7fa3eb702abd6872aa873c1b0fb7a073d76ef4a0ed7fcafd1ffc99c81d44c38c208415f6936f4b824c8978c491f5adf4352c66349531a6ab72c060d5749206d4252406171fb7088643f5dbd32303a3e2423e24536b53350ce9075b6772b9956116d9632b4f94bf38881c58034c47136afa079573f9574a4b60326feaa606213c7865d0cd8be5cb09e6ab5d21f9449173272159c55add7f36b044ce834c2b2a8a83a9578de6c7fb468ccbbfc9676487ca1e3f0910952a15947add1e0c2cc347d6c23da64a1314411de758a656225d20da238e0384ca16b6097e23c95fb111cc9f51d4a917759470a6b85824598f31bab08482604c6c31bd286f4a04cd66d8ab297767dbfa5d212aa03a2dd7678b11b9d540e548b6895b27e2ddf409e75c098a6dc820e21fbfc3db762f6e4784e8598359af34a02a7c4bb6340528bdba182635e3ddead434226a6d95a0fe3c862c4071fa7c3e4d75b36979627d210b1f3bd4a110492ef01f9c37236cb4d47409f09f38a1877bf0e8f8671f336c1c2939c2a95e971a6118dbff63642b0141f891e94ba83a7e01046a24d2152345af9cfade5fe4265f9c65bc0ef40730091795f6098f9c7bbc1c6d5adf7c826a0b19e2e01023284e8b1e83d863cb257730a5572b0c82a7bd908170cedec44c95bb805d1d23a1d6351db6f2cec803a8f585834e7b3bef5f45b9cd13011cb79c0c8622dea54a11e37c960bfd2be6f7a1c138a8371829c50f90c8a276899e5f441584550a968c7ebfd1e72d90fad24ea1bb0c6d7d98a79fc6483325fbdde643b0e7c37b8c1ed6e6a826a1b2f86df5e803a5bc3f38ee52c0cc72476bd4ce84f2f7875400f3bc3576c01ab544533ceb5a40582475ed747a7869f871bc9ad6d87be222beccf246f6a5a97d6d3a483b0e3d884fafd37a7c66633008a6cf48a2626f50d0502a735c8fa3e226337c34c27892638a6b0eeb0dc2fb231114fd142ad76aa08c07f9676dfc783501762e5048c06958e97a84cb942a1e980ed0ede7bbb0b2d7a8b3e503b48d5328998114544dbc838e304675760b6fcc3b1db2d5d201409c3b7f65e6b522b613db61a7627e566d5ad40fdf113b9663cc0cae0a88b937890410073432070d08f48806ed185cca590c44d4045535821b3a035b3653a658746e314b2e72eb7738397992eafa8a9888cf546d2030b821f7f2956c83559ceb7c6dbba2ce3d7a40d2886b864196e7cd0c46ab837b4fe743c8caa18a2de565caaeb8f6dcc6c983faec6850ce4de4882fe77335ccfe83e3b5ba3d12f0a034a04c9c515b2265ed710189505a262ad671e90d073ac9467c380b5a20467e34522bc01e75b74ab048be0e22f0a712257af46c416ceec0718d834dbdf99ccae90139250fbbb6b8141370704ed299763a93b7a0f4a29a815d2106ee859a1f100d3899ae69bdcb354f4c5f5d8d90a8c12718c9d0c52226bc0aecf1a6558a0582954ec7c5b35c3aa6915e53d154c16710b7a3bc72716052e55820e15004da4b8f02e5a450250e4086fac606c15729bacfc05b70d53aee09525b8c709d7bc01497d845181dd2491fcd62697bd01dbfb9ab9028fd36ef61c36d84c6e4678645a3ef7185c83bb14be204ed6cc4b89178e4f95b87b5ec0fe0fee882fa566b13079bebc2157670f49590df37f1ae2cc89b24a4192e2246354c6c36304149804ff8c4f55492966289ac91ce46a4a78a52ed8413fe335136ac45178f85ad4af2dd6a1da1808a7f50ecb5d30064a6b98750907d854da34aec355192570d2c63e3af6a29bd86f1f9739157fe84a1e6e9a2739b7a1f141c43254f6c5ff5e4962c4d1e60aed7fd473fce453e2389119e40bcb1a38ed9352c70f9865aa5421429a45128ece7100a4788ae0bd908b93053994f34c7f766ce0844da81f58564f248a1dc5a4ae6b64af7484f1ff0ddee03cdb5a05d8110ad32b176409411591f3232127d2c2d308d49d91cd537b3a8cbc5565287c14b66e54c1a983ee054ac24bfdb0db28613e6a2a42af0faac88676513de43e0579f5828fb856cd1700d9c33cfe4912cfcf68556fb5baa5bd399646853a55d41c184d6184362ef243539adbc25525877f15d41ea6504f7fd1704623e07bde6a128d50a9f40733fc8460479b2a80261ad43ca316e6e3ac4515575557b22cb239d1336b91ea69942efa27e63398200d0a31ff8373936673525fbc85ea427650cdb223ae9b7f724922fdca08d8c11d9c949e5d45de82bbc564e74db23721de40154986d25545a9a454c3e0c45167c40cc7607e58569f6bee9b986b232cca0b1bda16a8c4acb14e17db8ae201fc5606ec74c1cbf63a682d96726464e622dddebecd31076f6b7761fa21d5fe16625bdb82a272b1b2c7b852b9bada38b7314943683e4bf1eb8297f819a7c05a79233d06402b799d82070a6555fb3592166d3ce246dcd08dc504e88f9cfc388170a447ba8cd990d79a97ac4c86324a63c33499efd3bc55a09731cb53dc4f3dd41232ccabc08113a3c90f27ee7002f8be3fe8c27f700c1a17ede09208efee3662c7f7c2b9a27107862c8c6c140fb54751824863baa1fd6af43596d8ad31cdc211ca6c110113e24989faf45b5078f17d27387a65c8fd7e7e3c063833ceb44cfc488c35c71cb604d4f4ad17003b88e62ee75ee1f8aab6d08dc0aeb8d572e5c04f0c15d444c1b6289d72504ecba653653c7736783f538162ade6d3d75942a1e9e14d6e4a0f8d2330dff83732b1d5ec0c1eb67ca1945ece16633a269d6ee30a14324d43df506758f26a3d4e3ce9a3f24416f74ce0265acfb13f9a30e8aeb62cf5cca8d3928387b78731d51240cd26033fce19f8d072654f52ff9d2c0e9e78e2347553532b5cb6b2f9fefddbf371b4f2093585aad210e529e6e929055f28309c5dd40caebd20b8295ba802f72e705f1742e42ad63202e7728844255d763c9e38cecb1d1cc528ae6c5be760f7d7eabe30dbcbebb3e6987dcbbe6a31383a9d68e00b10bbb997fd1d0e47b58c1c7b6522a260459c9505e42802f33f178071bfef5dff127f9543638e1ccde56ff7c30726614368a8ee1f683f0a2cae16a63cda92c115286b78c1ba61460a27d551c8888d8b142fb47d140896689eeb64327152cbf0a6b81617427ca0729611b1ebd7c4c2e551c9b4aa3e7144591a48bb45fd7b29c2d458d36e15f38886b406217eb8f0ccc52e35d6fa490757709cc15b5d483e45fddcd31e6586b04a357b382b6487b3009781e674abfbff9d5c2c0de7e4c6c6989cb84728a078a37e6b5ea0d1a1047d16b2f06923856e8d4f9981770b4a26e94a1ecfa8a2d21954f80ca7a800e1b1a88b765300d5b858eeb51756341d2d3d70c38d66aeaa3248bce3f80f944736eb685d572f1f4eff1ad9641b2b438415b2f322c84102d110e1c9c0bceda70a4abc6909f0e6ba36b06046c75b2a1c8e969efec62841818c615726147481b82bf8deba284332a052d25bd8bd4f0f76b89c17addcc89149bea5446802740f714239adc97529767040de613b511292549e062b73d20bedbfb38724c240dcd3a497b60938f07ca84c0c7c6af0c5b0b181384a10d3e555390951cf286e23b94c16102ec2b677dc5245b734f86a31cc108a114942cc01d338fe00f025a807a8ea6445a50faa5293e1c4069497ab3822441c6547c4038f295f0fa308892748f873364df71f2e6c15aa0eebcb1f912e443bf0ac2fc9b032882499165341f338bc716b37c61844ce69480c92106e9c2428919859f49178b30253594cd9dd02bf3698544f35d94f62692ff4e4179468ad1a588a4795f93564e65df4c5f037894c78243446ea037d1eccbd1902745886c43f50eb6397db98d445b54e945642568cae8c187194dc312e65864de8b0e57192665f2256005f88b60dfd39b330b908a182f8f0b30e4a6880cd1488687a60a079a4944a4cb6c29a2a5d78afbcfffd07d40e3a7bc043a9ae8ca9b4a05ea202d261667617787828ed800ee77ac9ffc4dfb8cc3bf7d5927f8b4289ac6788262261370342c45c3dfe7dc6a0c0e2daed8aebda4455364b89ac48f125ae1da6a82a8a47c06bb4055be31fe381b3035aea4fa4e6f65493ac9014f05b69bf1c5930866ba42062dc4ce7a19c21a05244bea353749cf227cd376bbc52ef5c9f0de9772828a3611cc9b50b2c977e2b1cd346e8a2a61ba7261ef5095f823bb84e944b89953fb87ba002252432a870dc81cc04c3792a63335464716412a4fdb64c686869c41c9ed92ea0e67913caa714b2f6f683100e80004444d10b022f7fbbe105bd83ae33908f39e54435e91781ece14aa99e41737228fb030c351f1cd7494e7e2099d09cc750b28168999fe3910d68804c8f4ce7735e7d443508c0eb8bcedfe247a21ab9ae1dd144509321533e8d0f442c4e990ad7345350e841d7a44d5c900a5da45ae614869cb5d0959ce1e92d6778c67356a72b9927b50655230c4744905af5dff12f5ace801726b896b73b04f08cc8ba0eb141b1ac93db7c35bd5eba4865e2eba42352a6e38f17b48c4746c1556697163cb39ad04bddc46739608d9aa35b908b93bd1bf59263006128b3da975a980b4cb5e63aad801e518b423cb1b5558eb55925e5ff91d197f9ef1fc98fef4280be6dc77e3fe0dfb68271a0e3bbb6d21fed677d705ff6d51e992f641d3df5e45031f8b529549114d09b18b80162961691d31316b33cdfcca14754cdc9a9a4dc40654c01a6752d79e848c206b2b79224a4f987195e9a28050c9263daa475e36a9710c798dcc183c494b72996ffee1f982c8611484df2bc36eb76f866331a1dba9e1e9ca61aadab1e390aa8161b6550de32a3293867875a297c4ca218ad1c44bf6fe13a4c2fac58d20ed55d997667be3656152544f53249482b671489834e849112631036c442dad876fc5bbeb29b01ba2bbd5b81a2ec7eaf7bb5f587df59f7324f1f856856a804b7c3cee210317e06d7c5d3119520258eed685b245398b5a06555939e616c90d7c474d543b5ca3bfdb1df6a2a05ee74518dbb15669c2cba52c405a7d035add75aede9186f3888c36678b7d59b28de3632db97986b60b33b0cc51d53d81bef8c4c6ae639d57ba00ada8e723c7dc4312f6c7b4d90b918419a9fe548fe391522a80ec086bbf19d8a11fe97e0338f98ca852ea460d1b68804c329fc84b3b9770156ba37c369b62b07bbe3f326019dbb4fa80ed942b788765aaaedba67b2d0609a29fbc8908d00cdb788b933b73a45e346decf76e523ceecb35aca35afa22c7f7f1f340dc55f9b6de9c9b27e1e4b88ee9d8604b18d5cc2c2eaa536f91e1ce601bce1dc6547bbc80f64e51b1058c0e4da2635e27ca91ab1e886024d57baf3caf5dfb83d696c80bc094965315a63d4fddeb6d249d4fcc0494f64fe2faf6de36da0084b6f9e6c74e8bf54462b79e58dc5619d44a008a8ee9a8063c1a72f336d0d8a440e56cf6e0ac4c217f5b6b4a99bd5906e67462457df01f43a5d8ff8ac834d250eaa9e3255eefd008876bf5b8c5b28c25cbcf9745cbc8f72f7b7ddb456ab75b90de00e201ee6b4953470a2f3329e995650525c6d2ac7dd2ff3be2c76784982f30d5d02dd3303ecbdc1381fc3446275025fe16e695ee23b8a38f6dcf01366a79c55ee209993d9b603357fadd05c609ae845f5dac50b674c4aa9467955a946bb807e112a031f965ffb19f37f43f606ef8d0d88b31b761339f8455a1d3a105b030c677e84bdc849d4ab044415efe11a3a35248101d0bd81e26814f80310eb666dfe9bee072628c37aa66ac283acf5faf4838a0b51e140dcad2693ec2c258f3db07b1ba87689009335b1f2bed887668ab2cc1d8a3a48b2287fc1b3a501a866518e5c591f441cbb7728e60c622bb9d64a6c3a35f39c32513709fe57ee2fd6fc3e19f0b65aea797f62fdfc33a76cd900370001f9ab7deead327e990610badcd304601143cc29cc5716d7dec8e7fb26df17bb68c60f58639c42f02ca2eebdd9c09b1978ed59f98a6b805c2989447fe3c4440983571cbe68e3a67bc5296b4834c438749545b056269b07f2d3d99b95928c61f8c72479edd5c108947a78c133cb3f637ff844cafccd5b1d47df389669a8cb5724b4659d6adde82acff6b217a351088696f54fd865b401c1f18e5c7f474ea001124f3edda106df236ca3ae24ce150d75b330ecb19574cbef69449d72966a926a8572d39d34fac79261cf0a8bd0d9170648b16d82bca3108d407068e884fa8f68eadddd8eb1eaef5ada567293e0919c06cc34829762797282283ba167390e5b34255d619fab385df16dc1896cd0bb995751c365054d86fc5692e32f9582e4b00fe61001a4a7cd791b201415ba8149b1a6f2cacd06f289ea14df41e831b7718529749497db8271da85521c89f4d7321c08182ce6876f2b837b2af7c676547f81ea64efd5d4ca65b0e43dcef9c0f760e77818145cf05f45a032817c88d7e8293d29a04ce024182e6e8b559a8433f74b0c47765a99910f892b29aa7ff54c30ad378913a83f52f7cd7cafaadf970d14136ce13232beafbc780e9ba848bcbdf1dfbfb1ed89635413163e9d0bf055da6aff02bc6a5bf59dc0b16adb8d23b36e352306860b1e5563847f5c535a1256b8d6d567a06a21e1107a279a5f8ebe85088923002385e97ce82bc62c2082302b15c360befb40418c01ee635a3ef715447269849fae62f7c1557409933167df1bdf196d940b0e9195b9c160d00924bac7a1ad2fa9860025a0792bd843397ea34963275bb148b64b65a128aabd2e67511d59352b600ab1ebb9227c0e29e205eb545bb20843e60bcfad5c42920ed763c3da095eadb89d50f894fb8446e93294ca7c2203bef7a20c5d0d0ddd15a004d047e26fc1c81feb615a6b5d1428018b93cb881a2d8a5f4eb115800e317c5088ebc3dcda104575a4ec52080d2cf8a043375955d6505bfe031be1f6fcd13e0ee69f991843a627ce76b182fec09d487860bdd3f31ccd72383ea8281afda957cb9f21f8cdd4873c410497331c539d6fddded6bff2d4307ef960b9181be2a5729220bfc8e7d170bfa21e24a81ff17c41ac32c8320b5bbdfcc3741855d3a103cc6d9230d62acd20c9cdeb1cbc6679ec2fc9baadac0c42ea1e158c78ec025696ec574aab8df357b44498942f4f0912910f6443dfeb47c94318cbb0af4d19a8e3587e58c5ef16b42fe459f75617868fb17bb7cc7b122e7ceafa1d84865cda03eaeb81c16a04e7ad9aa5d743afa47c0e288203d5fa9f47d97fd1c5a04d1d9184b5ce57fa5d4bec6dbabe2fe8c1dcf5a61bfe106225e6ac37bde62618ddc4ac9c7e5f8f319271fb9a195b0ac74fb61801f28f4418bffd0de3101c98654e2ab3284a1a18879836e42837a0e3671176b2d487675a0320baad9076ba31536fb7d1aba0656fa2018b1ce29de5e770c837f2612c2c9f349c2f353c42a67a6aa401f612cfe2a877a60aa9f52530720084b047fef7f780160127b658d49bbc7d674019e8529d5d0b444d7d51670c87fc1b8fe55c0ea1608b06025dca81d9e23f74f3677640746be3722f2692d1011e70690e1155358cf6dab6ccc6383a5bbd0068974101328502eb9a8b47a6236f0be5714407cca8fbb4f4e7d802641b1ba9a573e62300a9e1c95e876e022efe311971536ba420e770d5288499299b42f53e86e87c647777f1a1f654eb98e6343f5fed82921a2345114d06b2ea377836f0a6cad858f1cd947b4694a4393924e297d2ed1cf7d9b06d2242109fe3cd7f356d8576c16959bd79507feef98cc5f5358f9b28879ae6a0502baebe50fa4c7e35bbbeaa1b8f84ce517178b8b8675fc58a30adfc934f531efb8aeb6e8ea2932a64601bc93c370cb209ea74732962288aff8554895a21e880ce6121bd427840d0a7f0a0733c042ab0512fdc745abac28a435d8a494bb04b63b74b8a91d53ac6c1f59f079d728ca4947985d2a378ec95acc0b969671f7cac32e0b21e73b54e614d8db3cab971b2fe21a48e0c380787c444479285d8cd200552959ea627ab4a3fef8185f0508935015ce62f2005fcc2d9b0c0f8884847162d7963e7e8b70566ff32b68712ccc712e19b0aaf84dc0b44f1fe846d393ef2fc0e2fb9560b875686f4f670b4cc6f270c907bc4288260a2f2b56a52ed8d6010badc206822d7c52b791d4c1859e24f5abc033e1905fef24ca69a813568ab887b887e2a789c235a27288f0bf7a54e1052c74674ddfe1cbac9bfb7ce17901cbf5e4ef8cda0acf5f073b7cc3dd5461aae520146798152338ad349a95626a86b77397d0aaad6bb69d1eb93fb565199539158e8113ad23fb840eea9c67048ad04d18aa5adf8a000eca31aad9c9bc78f26722a95acead79a5487b16d98bb3523b8f624cfee94b4697f62940846c5c5c2d2f278f19f07f29cb3bb2c955a986f079ba164fc02541faed3ec4f892bc30637126237142c08253b61fafc15b459886b0b4cb3e6bd4ba016b4e4bc785af3d451af0a4a550527706719010717bf93809f2a8df0d29d0ddd4c576eaf87ac9707639993406af260d3a75137f953b2a486861c6b414bfd063f5c68b9a362fffcdcfa01c748d8c70faf2e62d436adc8926a922a477cf71d233c7c662e07657e6a2c661cc0b0da3ba38bc093da4d1a6fde5bf7354bf44d75c53d79c1379ddee587a48c406b22fbfa333383e791350de135b61eac57d98b78f1b032a91a107063dc48b3d7ebddf35ac88faf9dd1723ca3757c874800f1381e2ebc69f1e5074cd759b4de598e227ebde34f1bf43886d433bc1229f929971e732d89466db0aeeae690b6205af457e6a469ac59351e4fc0e7176fefd640056e9f6452113cb2f920efb0fe8ae8442ba82812c9c270fd49b0588cc030c5bb4be0b2fd57b6d5dfacd436c2786a62a4cf55cea318a3e186363c10ee7c19e319efee9d4f2da18d45c3309b98c694d80ae2fe1bd08705629e2648409baf0f30ac08a490674c3e2b1b3708352fed547ba88c89bb822520cceaa8d90dfb60e7df3e0862b4eb40a74c9b8f0e17f4ee526de4d04e45d755f72edcf38c00e4c4375818eb15ba566ca5b1f7c66f04f3f2f14d1e46390b51870fd13b8ad80e04393364f2252207f456f4be60853d275dc33fb3d111c04de96f28baff469ba08d17e226153353a620792aff10bfcb0f1e48d7fdb44c5c4b8ab1a8ccd708a9a6761a44d202bdc6b66dab9ea9ea03d33c4f9a3ba560c198a5e22eaeb12fa252cc079cf1505028cf6832cc60b5de78995c8009e5626b7163b56151f8b95d6c1db44955a6d88f3078099c042729e58beb30b1f86ed5857c220038d800a627d25326eaf1c4e628228735f0b488c1ce327e99b9bfa4e2007464e94231144f44b63114e7dd449a75b510849f71c3c87c48e1155c148c728f2d9546527b326ce01b525c4209e8f842578e3141844307b6dab72005e8ac387b39314176c324ce13634b2955d0a21ddbb1afc5a8003443911a0dc3fac88e830ee3bdd68596f5c99bab31fa7263604b7f5f46519a6efe500785fcce0dcb026b636141a373b3b6a9494607d95d46513fcc03191a62a22fce6a4c146b623e058aae04431793ca92e42e5aad70421064589b11c4d610d5731e0dc0cd93845877ce10ebf3fb6037966b8e555264ae6ab9ad115ee89ca7df72c1488c24d0b30d478055f300c77098b273fa7003c5008936107f915c389f8a902432621d40d144fed9152c9506e0e1bf5b10df4cabe7b0f504b8a6dd83261b21054e1062682c9f3374864dc11ff011d464715467f5123b119d448c7a9830fd71c60cfc7e1e0be4e0fa2e7a0d3ca1011522d87340b714da5a103a017bdf2756304ea0c56055ab2b15c3ce67bd2173e5ed48091ce1f7e263b2881462190049f1856fd12a60e1fceee37b1cf6c0ad9e53487c32605a6e1f79351577136f4303408802fa0f9529d0f603b1ad3f1ac6cc25d14026e78a86b2ea443498c94da2e16c4e150d68d64534a49d57a2416dbe150d6bd74534b09d57a2a16dbe150d6ed74534bc9d57a2016ebe150d71d74534c89d57a2616ebe150d74d74534d4edac3fdae429ce7f7017057836a6fe99bfdc60d8180b99c82fea0950adb5719e6abf3d529907e7dc278719f39762c9aa9aea04885af2d883db5c0ddeec15e3de1fbd7c61ff6a9b90c392e505ada28c52e976575fa1fae389656641befd20d8e3ca0f6cb1c26581baeec4f4b873e07c6162feb7cfc9503896bfa41126b2f4bdef1726391e3a97cc499b4626e8b0fc4f2af2edc431641e27d07b00fee78ddb91942d5de7fc29ff5fc2c9b69130cd674d00e6a6464f472949f89a0a0f1b8176d0e369d40c3b97919361d21aa61f98e3c567b1a6abbe9af69c6c84881876b5d16e739c47901757bf4f65819cdd4d40c9757098a88f191dbf49de834c3e4a5ca94a06bddd7d3f5d7ae2dd440624b971c45dd3d99cdd6915e722e1414db3e0f0e084851f903737aaac8a2154f9cc485e178d7c6496af6eda26f2a7024d5d819d04989762193e19f05c32d19b8db2927fe0767e31ffb1c6cd525488ecbcdc61a2208139d8fd10d3dca5d6d3a4b5962a4c44e35f3d23504e1c406a1699502310dd8f7c0bc7a557af54c1344545cc3f39c010e85771d8763b05dc52594611f6046a16fed29d42345057ab3f7d017e7f09c9ef6f00adebc4ab06d24d8d1387bb64a053f43894f6668ad32a825003a4cad4b218e95241c850b6d793d4227076cdf1564645f188393414e4324e967591cf5aa589b61063572b6a120b4870f10a50f519cd55fa9178ac992aa2a0286af88b4cc40078353532699b7148077efcac7b4928b64ec434e30f9e46cde1463f88f2f3315f08d8a0e94ba4d7a63935769107fa683946e89de85df32e662609a860ff097ad9cc7895696f46fe075c208df34212d6a921a8bd0091f82d9095c682ceda5ab80f6f4cab4e4cf934273b28f8cfc3c1ef7a65927e4377798dad6e716b34668ab169e2104665647a4bbb029140d27342fe8afa5caf840af76daae67ff65ba0d71c6feb0057aa1d51f3e79799689ceafd1d083fa13f4272a9ee43b2dc1189270d9f9bba4bad821035f628ff7fca41b0086c6331eb380649597bcf2617d29d8d1812862a683dd60965f0706626b2e5c5b3bc91017f47ed56b1547f8a3971b6fc203ff6aeb48a36a5e6de4d442453eace84b3b3bb466127a7ff39c540c8637e9a97c4a46e523462412fd93915dc042b8f0ae03a36b2d0e6740677e828b59d8e17d5ca0cb1b3b50aad3ccb02a36d1732451d12b30b51aaac0cd68528412b43a02e44ad305d48ad842e64ea2742c624c8301b109f477221b5bbc4f40fa2bfbd3b267a5038c352b0773165aadffbe276f46f6cb9d0b797155b0ea35c5f93daf6114a33959d0b558e7b04a4dc58879525b42332c5b7686d6febc22b07e99baecf7d9364b37e7e3eeaac75a2f7a5c81a41740565d198cc50240a157338ce8344f6b7e3a6aa791986a7d8fbbef4f5a3acabdff3cc39d95baa40e0ffd82522b2b1cd231cb9f98cae1f96bd521c9843b5ebedb4c349af79085ec8aa5633f08e649cecd856359dc8af14dfaa321dcc75c2bec989939ca6d2faa7fddf44d4af664e5101c90486f0ea40e3f2c1f4afd0a3654d76454b94fdc71f330786e5cb22eca2bdd047d06ee1135da0d8a9363dd020a66d5bc21885735884ebed0c48ac3abde677913dcd70a52db4c9b0c0303404bce2a611ab10c2b026d70e8720357088c569f39becd1d61f160899aad4cf575026d98505a66be7beca5cb11d9ddc738b6824350ceec0ce49731248bf063783d3dd4c887800730e4aaddc42fc1a65e51b976934ad659a965edf78207f65edc676a9a988bed4870b04a01fa1b364f1bd26b525bdee0c9a5d199b5eef880a8bc87a47ded5ebb8f0155d0d10959f56d5726d661241a7c9742848ad78ecf51d8665b57fbb69bfbdeecb47247ee935f6ac5752e486b0e4397451bfd5b8ed754a2c6830de862adfee754cbf39e58f65ac7f23bd664969da7bfd73436021210a4de2d8691fbd2010b12241dabfe6b676ba362ba259a9b1aa44db5776512b9e7fdbc5c52a2acc9ef62066489a932c365c65f2cc5a0cb321eb11ebb660ac0ded21ce30e4467d75c88e4d503f523b8cc5c001cccfc4c2d790f3b36cfb9de9ccafee4b1101bebe5b56f880b7e031c96f26543c667d6ea27c457a17d55b0e41d158dc942bea605ffb598f7e9b88159ad3a730938debd8f2036c26d5cd02b7b5c71d165b68bd5a245c21d19bb623c105f51ae3d10aea95e94100978854da0da2f5020dc5585673977a920ec1320da22dc3bd3d1c907fcdfef899b521e6e69b43b871756b8464a558b6597208270f0926bb0ae1d7dff5a492074dd4e06f35af47a78370e5c9ec0aa66ccc9a6fed3aaade173ac6aba9bef6a313677c9f74ee645b35d6ef3b5a1e0125d5a7cf21953b9d95b60700d88126a01a878003a0203fc5276de0e474e968bdeb79c377308ae7741b8ee743b2810a011728219c4583020d25ccb39acabdf5822cadc9d32630ce73d5863f000dade7dd95814b8ebdc1ca3b8f1be4c2df6a30672c447591f501c698fb148ab76c70031d8b5a75c08e0485f2933f15250134af654e56f581181f8352f17b279c83888af2dbc580878cf2a2a25a77698d976c298a04ca875787f1dbbf430313688b7e1689c687e1f18fdab07416536b94344a6ace1fb598fc007204b08f60c02ed19c4cef00795c54ce92e1c0038affbb3e1b8c8a3759d5454f925e1bf1c01bb97d3ca6b5f110bbaab4fefc9e213f058491cbeb2e4b39a75ef6b100dfdc9b9880ef45fb26d9b614c8debc7feebaf8de6a2f140a01c1cd684a26a0612a25ffe96f337fe2c7e647f97efef53c6933c6022121a46564013c7eaa21eaa35d6b81946e9edc896fc60e9521e2035c68fbfe4a4b6cc960f3ccf800ee9906d15bcb74da04409163beaff113ccdef72d7c7061b6c8a4cc72759340c93d4cb26e74c6288baed899be3cd6574a71ccd1c12a7dfe2fe5931a1ef94ff6c47b56b3d857a3b48c0b89917d5d55eb0c1938c1ab39a98dba0b2f2034fd9caf3ba7792da37f1002f492509a4002bce45625e6d934403cc4d004caffffc752205c594d075571f08a245571f0242eb46ca4427c800c4fbc9c561514b0910696a33947c31eb9958d5a853462a0914218b85f2293d0b68e0d8489dc80d31dffba156ec04c616964dbdadeddf6de5bca94520a150c5d0c8a0c599c316006eeeefb6fe671d71ff3ec976e3375227cfc1ddd86575a911338b478acf8557cf9384d447f9c493411fdee842fc853ebd284be176ae889c2224fd122234f2dad386ebe75c2d3a2fd49b46a1fc787f61bd1aa48797e68affa5483d685b2c24209e5bc3bef9c0e55e83aa1031b68ff0dba4ee81044b9c54afbadb068b5aa85563e80d2aa75928727fe2b2c5a58b498c071db3563313e67e2ba6b9a457f3962df7f00d43f4e9d055f942882fa1741f77df78b48e630f867cb3288896aeefaf6d745b117c234ca083611b2b961ab13ff6547fcede36faf79941fdb3e66bfcc6d8caf3d3675e26fddce6c3187561c1abf5559f6fb5cc7221d8370d4e923fa63f48e5f040856a753308df20c454e4c30b42bcc1d65d8aaae71474c87214ac8573f64690221dab1734fdb3f5118e6c25665a6d73e7b8f89980e4d60a769fca5528d8e247af8f83184a7e70a20262e2843dc641ab6cadb11e37560f8bb3495f4fc1cc71e1323a0a40f5b95ed681209ac53308dbb333108d3ace3c9322ec62e665a87691a29cb62966553277b4d2b426b7c8e91d298659af62eaa8141d845b3cfc055d8aa908d3636701bb3ec332e488446708d80b8cd36110df3f0dda547307e4d87fb1e1271c70c31adea5f772a74bd1cde99d59ca8c1084ebfa893ee7391e6960169d5f09d04d3aec3fee8e7fbb1ebf3279c9787205abf1b5c0bb6cf2f99d7b99999a347cadd5182596424b21960fbf5f3dfd75927c2d7983be6983be68e61ee983be61886611816230cb88da9ec3602e071ad78d574375ea10d452b2ab2a2d5b65401188c6e58a1b57270c98b12cc4528fb4e7182cf8a0815fe54c0a08068e520153479e0c1d16a9b887aa2fcd288053c432b0e731bb7a9d9421b8c56fb1adff0664105452bb72162021391250a603714610a3b2bff1705acfc1da4a2043755180213f640c58e4b59c3919d1585c1e75d2d425d1c8bbabffda59a064ef182665ff7b50fb7f7e7b619ae946c86af76b43f5c067723bd46da5e0bb2811ca93683646092f818f835df3e8e1807352c8681db181ba9f99d50bb5e93b6df20a5af4548bf32a388397da4ffa6e97bd26f5f2a95c00e74a4d7deebbe2b99be19a96906d9b82f914860073cd277e06e58393008094c224114c4af62d338ba632f5ffeaee46ffdfa33b00a0c44a13c158bb04b1e8edbcec697a4f42def2d4ecfb5cc1627b00aa1a7c7e916b302a1a71358e3adaf728ff7fd7ca46d4adfcffd3ebc4f2d59ad21fd207c75897c9cc0aab580f56331fdb7c202aeb8a71cac3ca87f49889358887f14fc5c96cd20ccd10381508f62fb9dde73dbe4f766106f06d93666308883356ea5c24525bf46eb6fdfcd1a4d27091535ab25f125a90332f546fc0e9935e369cb229d6747e056e6db014fdcaff2310c7cf0c31cc7ebf653c77ffb95d1c10de4eab71ff77522581dfc7efb4687fd353736e36a1129bf632af6615ffb2558bfece5af8efc98985655cea07cdaefd718da8f3a451086764cab7cf7460aa6ee355277ca5fa9a0fe1ca94f8d87ddd9f7e3b3739cebc4093ba1fceba23a8cb1ec4c4a8c39629bada67d1f0af51f328e75513900aa23e5c6e899c4be534b640fc2b7bfed0f4587fecd99c4b838637fb928411e5aa5e4e5e766ade92e4f814670a74071dad5e2491e8068d5a2e4c187896f5d558268d5aa132948342db67e745db755b6dbb70a17626262b0e74cd9f733ef817226a65ecef2ba972a53f02552fe2026cae0ee4ce5df7ec1972922dd0f62a20b3ee98bd026fa199c82a92f380553ec6547d4c140214c411d0737ee19703c26e03dac52cf03c49bc0f5b0b3b2425bfd6f4cdd523f79c5358619b94dffac7ca676711cbbf81a18162316b198b043190ccb64742d382dcb6a8d9731722e5d6aeeeae7ae804002fb96524629037b02ea643fe365bc3fe66473c4f898c75efa65bfec972f517ec43e8b335e068dc7e6631f831e2ae3e3cbcb2a7660035d2cd075d9c187825d36e5c790319772601763667332654c86d744cc639cea67e03051d9f2f2677839f26718d12abfe53919c6a9b17c8bc462cce05510df3e351ec60baf89181a34c02040214c635c5ad874a9c9c32b20402b7e95fa9f56a0562970897c6ea6eb1f4dc9cec4a0d3e9b46d3b462f6e4301cb6567e3e98dd5c2dbd12fdf850bb03275f11a1598f7d78eb8166fc7be30f1c294c55322be8cdacb6d98ebbc17f7db79251f2074e890bf3b83fdf7b5609a7cce076f3bd464bc8c194363cc96cf647c8c898291a1636716940f83c2786c96bc26b0cf9e08ef088981363ec89011e333794dcc88e1df49f89eb4cae5258e3bccc9e600df677cc584be192f67bc7cce868cb97406e56c7432e48399fc19f3719ae984516b7ccc3b8d7719e0cb0e1fbec6d7781f9ebd236abcfce187181826e3c10cc3c2efbc2666bc8c18f339af091a8f65318fe3e10fe0cb8e1aefc3fb00eac4d000bb06a8335f08d31911087b18d58ca9659e12d8cf25479c683c47238b11fb980d62a2119cf19bd7c47c0c9c82c1d7bc26647c04a760ba60951fe3713c66360df065c74927c60b612ae34fa00e084eb08f7001e87eee2ab6caa927f95cfb3032409dc5845a1503fc0e77bcbcfce829b120aa430e4747c343a27d7a4f53fb3a8481fa1760ec10f5f251604743650d2a3f460b1bcce55139b33751cad2f8cbd861d7e493dfe2d74342aee6721b3672928bb9d4254a39cdaa2da92de83ecbac30748fb48fb60256ed3fb07e26d0a8a429d1966ccaff09d49540bd08d49d04baa4602eec4987ae05b95e732d6803abb62bedd30143f7c3b08f119b3f6aa8fcd86d3d3124008240c4a7b1f0a21a1c44105189d4a0c0c5aa8acf533c0447e8797687d8b7e2abe031143f3e3fb7de8e8f3a588150ff2752c5cefad145818b55151a912abe98819fa7f8775545ddf79720131fdda87f04e357e1c353fdeb298ee012efce3bc63c70eb587c55eb5030ef3b97a5adb26cf33aeb102a1d5ce7f81aa8d342b1a923c1299cc6d728c75115bd3bc68ddebdf42a477ea0114c0202fff67ac49d1df6fcd7ebb1ae9583d81b38e6d883af7f1fc7f9df95c071a6ed7aa370fccf2f638cf125c288f1e35776f135a27e59f5e26b1703e6c5ec1e35bd77314bcfb97c5f65684b97195d5cb2c75c3e19dcc34cd2bfccd3c3c8e80b948b169695ee4b25afb4b97c2d4e31b6c46759f9c00a43fb4dd19bcb61d7697403b75535fad008d60cd3f18f60a751c145b60d2b03c68f42fd0cd99fa67d26aae3d179535ae6dbec1e396b01b7aee4ab28eaaa8284f6c374c89978f07c6e23bf3f67dba612fe183859da4a7e9c3c56e058c96769ab987ddd2c497c1ccfb0f8fd9fdbc8affb2470db7486a0d9d4c1c0299cee7f94e3a88adebdbbbb4992c43cb0a88aae0b0f5fa0ee31b168a00b267939c0aee41359d70a04f14120bfe3ce0e7b2ffb4b7bf07a2f0bf290e0d21eeb5ac59a2ed22ea12cfb6f24715c376984d8997e9f322b1cf86e68bfe7f8809802600a52c25192c2b3f13ad0a93a211c119c07483748536c436c1fd0dcdddd46a653db07ea10b401a00dc96cd00c04d86e0e2c0492468a200a117726fe8c8fa033cd4672f25dfe2633c949292508b3a13aece717313ed06cd829290015edf7617308b13332d585ae13503a4222c2c9fd36c35671dd57c91f270756ef08f91815544a11e9b6719df4b697d91cf2fb37ce2b75bc45b0b455f64932905b5fc96d328db535752bbfc8be74938bdb9825d9efaeb8ee5e9ce89ef44f74e013fb32c917648fb6df225a645564d511032bf368ff79aa9f347948bf9ee2640ebe207b4485ac766dc822d457dadc15373bce1d4350ec49e06e4afa7f3225a53fd3f81cd691e6ae320de42542b657dac0299a62df1e97b4cc96c80862987c0273363e8f0b729b178e7cbec5388e5a87cc459c2dc0edb690c273e40b545ef02dc6edccb74ea41ca126ba4ebc8006ba2bdc7acf57872106a2f2622f86055f0a5a3d083dc5a319f98ec4744ba5668d5eebaa41ed116a7797654a179637bd7861065bb4f09abded33d99c31377726bd9cedb9ac6359798feeee2d2d3291e1f10fc7710c6acd7127f2f88b49abfc339041edb9ae457c81557301ab06b2bc80266e6fb0a7b0cfedb76d931b4bd62cb91da749ef4c5ad569aece5d9e8adf3dfbefe9f7d453306dcff2f11b49ab481f3b93e72efe81d2485a4937397d7c77b9cd099c3c148c7af8e6ebdd26f634131adfc1570f833d2d14254d4e4345291d3fbee2141a5966916d68b7cd7f3d13bbe49ee537d9be9958b69726f76d7b96d7c2d73e57f48f77ab55df47522b99b1271ee15e5cb8b8ccda46023926b0e63379de7b9e121e18c1e86d87cd44f8668f4e79cf9140b0856035112c8088024690002a4cdf6373c42f9940f911ecbc1c0f8c1dcacad1baaf4aca42a34b5deb5046de480597b21761e07896c8df98c8dbc6cccce0fe0f8dd35846fcb7afde3dbf04c7b9fd951cd4aadc62261d06c9e7e556ab9430a10b05ba2e2cd640b9f60cb050a8f61ee5ab35b44127d0ba55507f1f6dc3ac4ef5b7b79728df6c5f3bea4bfce5def092cdd1d4c1aa813f588841a16f2bb7b240a5c0686d568b59fc3c857de66ca0ecc1a7ad0b8b3250aeb5f722748578cd0d7a025704b9e529b059edd36a4561d2ac36d25744f918a7c36e2347585af8eabafa71582c366244b388a477032346aea0eb24054632749da880887226e66f6f92601ade28ec1039d6c90a2d9400540068431fd11245dcf0601afe6a43f76bf6a6078f8d9506ed9f7bc352968655dff7c758d5cab7f88a3a7d5da14da2edc237cc848555d90db39886b520a661b0e29838f12b0e208ed081d3e1132cdfe2014c73f2c1347c03c50576869fe01b96952fdb1ee0e30250ac141ade1131c618638c31c618638c31c618638c31c61863f401959f5806466d03ab86b907ad9224f8a69f97e01b66f5e01bfe611a297cd3e02e0df3ea6067580bfca6c94cd890833c2850feae0a5360f18d1374b03978093bc337dc8469f809ac195fa0fcec213163860c2fc89011238b1831608660605ebaf0f202830b3060bcd8c28b17a82828940b2db870e192051797165868d1e2f43a9d5aaed0d2c262051696952aacac7c50becf440593a9348552c99382e775425dc74581e348502091b6276c9bf644d332276419d6048c9d50c92e1a23133687bb2f617374102b81550c3250d65a59fda04987cbae0ef91de4a02abe971d54544149bfb47210578928f82a077110f7ccba3df7bfbd635a043988cbc09155d4b3fae6c353f8b6df26b6ef23ad6a70031ded67671216e926d17e37f0a5db67874347db686f0448490b88839804711328942b036d4a9a742ac8c857f9a75548f8e5ec5f47c215b17b8f3894db301236c5ef4493028ab1806214a3823808095f91f747d749102bc6f6ef261cb45a8c823d2ab848e6e115b8d5f179ef68e0a1a67d1d392c38ed2bfe4cb1df1c4bb99d4a683109f9d151cffddd3d4fb6744f3ae779ebd2f33c97ee1e98c4fd318e5bde3437d0f158f1ab25fe52ba2ff1401d7f6fc9063a8abd6926618e8bfdb1412aba153fc8612007e16b79396b4b4d5445af7d63fa3699a690a65e23c5b00fb1591352990e17e3be26f442995661cf6112fbd1edf0de9f5bcf045621d4d47594fb12a8b31d723bb0299a5622fd1c365f7668dacbf9b263d3f1971da4c79ef426f047473d304983ac5f31f882fdaef8057b1b5fef344fb37aa779643ab560c854e86633e9704d4c143a8619d13da21c0b67e39bd2e1167518eec318621f47b82fb30da555b5b79df2fdae7c53a6c30d9fb03f8472eb6095df813af239fe7d86c3b21a58558655d1acef63fbbc73d81b276ec881861d8292617308f14cc437324cb35f071d46fb95d3e032c9052bf6dd57cc8b504c8ae86a55f7cb0579b3997460b77aa7d5aadadf4a5e2ed73b1ae94648b73251b8a9fd9544eb4427f876b5de13ffd2838930f8796abfc8aac8aac65330f81ae8ab5fbf566056c0fa2a9a7ca71813cf92f856fc4af33ef10eb39a88cfb1f0fad80b5f7727f9fcf9453e674750c23b9beaafbf2fa42de3ecb4af273b01c739d859b78cde9cc98835d62d63fb2e8355abbbbba074299bd93723a980e3da79d3fa7fc10c93d19b9d0bc27ba0fc9c6f9c459ab534701b53bd55c9241bf68fa471eed07e992492603d277ae5459eea24f2a755117ce967295f953f1268734825d2077bc34c96a6ff8b5044b48768bbe40f132c687fa87779aabf86de29148d3d1df6cbf82f52baa4fd120910ed972f296dc348d8914a5ab54e54e043fb5d4d68d39fa7ac8223d02a8568cb28b43fe9b199d01a5fb4f0071a85a28c3dad223de704af9cc853ed432f4ef06afb17056c1be82f4f75046becf960886aec21927122da1cd4a1ccc7a060be935065261af5327c351e39123ea1cdd1b1c76d98494d18fea350dfd7effca01442be7d8e81947013be2aa94836d08e514834ea88a6d07e2925f246896467fadb5d76d2cb8951a22413297f302ccb94e4b4686fcddb6e1288f64bd14d00dbc9cef473317af65148a77d9c3fba26a2fdb23f9b42fbbdd9d0ae9d01c32745a455fef84f873b74bd1c6c6767fa5935a4128904ea30b2be17ecd731ae1f8b32098d5029229376c2ce38591ad791afca9f963f0f835af255f9d32af676b27691056e81f88a5a550512148c8cc981bcd544f47356388319a6344fd9997e9caec257bd0c6418436b815c49ab5a0bbe1cc1944126a24c1dca571dc8815ae528da33f82a6ac8cef4158b6ad544f1130ae4fdd581be537420acc56dcccc9eb5e6963f76c6288bb83e3adccf220a1f0f18ea341edad0133c96885c387d381f1792c0d1a123760106b552d3a17701878ccc0e7136be8cb3ecb1ffb14334c3913df6386a6e74e8fe3221b6f245f9fab5cf5e034318d40975e2ec17a739edb7c3aead49e1ebcfb0ad3fd6e521818baae82d77e5ae34c95db92b4db2656fecd952bad3805b998f6789577ef998945115bd638c546397ef52ce6f7274fee6ee73307ef675a851edab3842fb63b48ffbec61605fb3ecf9753270c6f81c7d0aeb440d4ca84be1a39ffb6bdd7dad022c4ca10d54db958dcfa92f125aa2feaed1f558ab210d81734e59f6524a29a59452a2be24dfd2a5f104df4b8feebfff4022438aacf6a8befc49d775062564262b6443388b6fe5caca0755b4365941661c2f6f5a9bace0597ccca1506bb282d68a466078225b4eced063055307a40042ca7e310f0c252f95bc36924d748726d92b0bb4b292ec4b9e83c1eb801440509b0682af980635c41dd71d94f88f0b0f2d7022d71d8c18758b4971e7079fce0c7f144c338463e720ae9bbce329de23cae47b6cf66733a843f672927cec3512cec54e95e54ed3b42c1265c193058f0f9e2b8b1fb4301aa2a265acd12a57e4673b4388c8d74022bc930d711bdec9b60d3ca2e9f6daf3911fb7e1e91d37ecd016cacf4a5a6e80c1b7d38623cacfac4dcb56584850477a5bcbdc0db3679971c3ec57a6b661f6fc31e1f3bbbe552422340811ba6de0133d7818d13d4e27f99e63ef419048a7f8e5d36e928674c88f247b2d6b262c1b67b90b5f46d7c9501b280ff9d24b4eae5c2ff9e0ab6f42d175d2e4c703512b57be0e5fb05f2770f0a1f25f30f088a6d86f1352f0a2d90f6995537e2247283f033193b66971ad1314f0b00badbce34379daf503caf52c59272858c2aa326b85456bae7c20b4f20194b02886569915164a1a48ab30ca1f45abfc09f07d08df8a374ac91c3677c5d9f8ba034c8b8e28f6382dfb88e6d1e3896e4279898610691b5e713779f968956a5bb9a0078c6e35f65847e6245fab99f06fd3880eb97180b48a5fb2d075920425b4ee0b6753fc9cf1bfdbecaae6011c0a86667f6a9b219ee2cf9c6637af7df75f370bbeee9087b8cd778a5f7b2d7b6d67362a3b6c95f3a95d9c94f9021351a3afd13c25868b9ca73091839468f2142e62a2cc07dcc6d48e18f631c618638c31668fcd1f314f3896695b06c3050ac7e562c493164908f9122c2d3535376ee0c0a143c7a9f33e269429c97c4c387b74aab3f8e2e73fd12a188afd6e7f5a1b1f9eea98c73eae0a7cecb5edd606c663cf7bb33d06d61f313ce47c42f678a27f98b3329dcfc1983c4bb2b7e2574b7c78704a1184f74069c4cc4869306979d97331d3bb98d99e77314960bc0f93833c45849de9df78083bd3cf2da6e92f79391ac84c86f0f1576ec5cca53eccd76afc4e4f0c7e62b036cc8321e7c1da3018aa740a0c95ab80b35bb03d832a315ab5bd4d8d190f33032646957f192fe36b4c0eda263369c37f3f17fd779661d8bfbc16b56c6a1f3325a531a7d028f81bb1e7563a1b1f963d86791ff811614576f4155e59ad94bd163fd3e8cffacd9895ab40fb65ccda3e6fa85d02daffe2e5bcf81e3c9ed02285f10e63c78b0dc4d017e089084768bf3d8e11492c41f444088aa35cb8b49072eb9a1b3874d4dcc0a183bdfc530bcbcab71446e31b1f4042bee19d36c234fd44313b2cd8191f52a04dc4476028fc04da4fe225d07e20dc044e0265c1e66023b411be61264cd3ffc46827d334107b598462b1fb0725617ac0ad5cc01353dd9539130f723d69d50a4121226256ab54957778670a6d229ec254d8c8661bb3ffbabb3bb83bb3e7ef50db61a27ed2610bd17e7677777777f77dcec07675080518af76b5502fd84ff8aaa6bdf0efb7cdeff4d776b986076e637474c860edd6a57bc43efbd1d1a88adedc372b05d318b128e562d8cb114c656eec6e18f1c70dbe892d1c7c1399e8e09b18c4341e9b18c137d105850e9dc7e988846f221428d4ff0712fa8a024809dfc4281850d2e29b3874010b30a191088a388569745c7c138ba2b0aaf8867dd2aac8860efd2b58db579cb72b217a840dad923e1dbe6155d2061bfa1f81f28ac254a0bce40ed3481ea6912c6944ee0cf14861111565000c92e304af3a29ade20abc536002ef3e5e025fdd27025ffd07025f1de8015fbd15d480afeeca626f229528be3a0c90b48a01ef4fbcbf3769d502de15f0fe0ea555097827aa5d7480af6de4c4d73ee2f1d577aab30cf0d57b3c077b138f30f0b5bfa062e27d89f71defef465a550025de8190f8daadda41395fdb254480affd5a7deda134ec05bef60ee8fb779356e1bc0fe0fd3b4aab8a78ff96d22a01bc8eaf6c74f3958f727ced9d66e1f8da3d365fdb47f5b57f84b03772c70e7b2379b84aab88f81b43bc03e0ddc65be02baf018aaf4c849aaf1c44f3955d427c65217ec97ce5a120be3211105fb9889d64e0bdc6bb0fefcf525af5c37bf8fefc24c6fbf39156c1bc3f2369d5cbfbb39256c1787f9181af8b87d68caf0cc43ff32bfb700f8dafccda1172f1755f7587ea12d52d5a2396af7b94048fcdc1bd3fa3e0fd9dd079ff1e0ff821844815d2f9cad54f7e4561bf4247f866a90d56b554ca80eb1ea77566dd3230239528e2110662950bc81d0bec481e28409e1f2cf354e4322459d2081e5846a8cb1ed9e315987e0505a64f603a930df97d4c6fb221bf04e62e7f04e62e04e66ef880b9bbfc0d98bba9906fdc050e0306cc7e62f6940df917309bca86fc0a985d2501d37b10517e04ccddd401e66ee8c4dce5e73177f99b98bb2903ccdd992cda9f89d94bcc56b221ff8ed94d0a30fb8912b39398bb2112733795e3da900073977f55c3379d83de019dcc069cc95406309ba788d9460430fb888e9b1c01c061a3bac1379c863550222633e1260c85a36cc86f63b2940df96be66e48335d1bceccdd5066ee8641ccdd141073770607dfb0108840f9fd5393c886fce1649e0df97f987c64437e1f265fb1217f8dc94836e48f99bb218db99b02e76e188633e66e4ac6dc9d89318dd8901f662eb121ffcb7cc086fc3026141bf2bf983f36e4476dd882685b8c74f00d0896866f281e28bfbb6e7c53c634634e1bf27bb3db706a3bc34f9ae1869bdad008bed99686df39caef415c1846c3e6061ce900db6a070f279cd8d1841205e0e144124c186089dfc2546afb21d3c21456c3079213d3794c47e24c9c89e94bccdd991d05e85722091773ea87772f277b0f53580d1f485f9a114288924ce7cd08c1011144b7bb975392f14a33423c87615e0e108f05f15ccc3ccb9a37cbb692a90500430cd16263850500437c3435a716000c31448b8d159616000cf17de6e5d07cf65cd45cd3b6d209658303074ae5e2c206478b1b44c48f11c74b2f07f52a1717281b1c2d5ed336dfb6e6ddb6ad141f46870004007303e34587005e0420877fcc114820119303d2380289490023a414c0635e0eccdfc07881794d7bf19b971380df723c17494e22352f89b495fce96af5383266d0558c2206b04f57abc79131e3e92a461103d88f390209246272401a472031096004671912af79393139bf6d249297730412930046f06ba524f2e777c4cc99324610603597e8b09fce1e138a22a690661d938d4cbe829174a864b2cde4271da5c31b434c06c0e42ab38dcc3ed2613fcdec2b3aec1762f6cc6c9986d26147e99e12ce66c30fb37d9835a61be9b03f668235dbe1ae10510cdf81f1e3a245cbd14a3710ed2ff57bb3db34dff16ca815e4127a0d1dedb07a7c7e8a5c42af21a2ec95bdb257f6ca5e355a51ebc8c57a3176b4c3eaf1f9297209bd86885aad56abd56ab15c2e97cbe572b1582c168b55d43a72b15a16b9845e434445ac1e9f9f56abd56ab55a2e97cbe572b98a5a472e8fac1e9f9f2fd28e5a47ade8aba3d7105191d1d66ac95ef5fb508d2b0cfa160a48d37ce8f57ad5b0b25df9cb6db455ff567f69459f110a3bfa9d8c95f5140d1561ada2a022579150d156840dd1de5a5beb686b613b5b0b636d2dac676b613e5b0bfb392a3a721d091dbd8e868e888e34974bb25cb2c7257d5cf2c725815c2d8dc57a69ac218d45a4b18a349611d558598d2b0cfa160ae8fba1fdd2be0f85fa0f436d2bda5ada91e6d258d9abf4c2b5de0e8e46d212547011f71e7107e32433333333333333333398bde1a352fda8a352c4c7fcc8773c4a91285e7c06f2ef38ccdd9be4de1979aa074d5ace534898a69f94fa893e44390544eaf884cb86888a8c8e768080808080808080e0707722201c8c3550b7825c422f1f1f1f1f1f1f1f2020202020202020466bb446402d8b8c8e7a87d5e3e3e3e3e3e3e30304040404040454e44304c444edf3f2e997b39ce52c6739cb59ce7256bffad5af7ef5ab5ffd6a1f9ff6612222266222266220066220a017030db5b6f3b1503def13feac1103d51885454f841a72df6e67311103b11ebe20aa7c7106d10aa2156510406015c8c7886822fa9949f88543b45fe63bc5dc707ef6f671b46a411dfefdc8afa3c37e1892071f3fc70ed451bfb8dc382a8ed3e71df1c0f3fed425e56c7cd28a26fc1f411d7f8ee07b39bbbd315bdf15afd074bcbd5f4aae3af2b18fbf15c3b6df5f6e33da36ed99a78e7f3b89031158751cd361f6fc572ba2b1bf7ec0330405138a5ae4337c1a58c517fff90cdf639994fd346e5b4cf62410ecf929f8b427fd88a1d94755cc24e99b6977926635f1068e6d7b1c1dc658d39cfd6635375a257f2e6d194333507b1a63261ffb4dc58f1fe337dd98d83181f4a417a25d35cd0a24b4bf138222e5e43d505e50384a93edefa2feefb1dfd7d9f77621217f9d7d56ab161cdad4beb376783aeca5d5774cced32a7f7677b08dbcf0151db15aa5aa1a3542fbbba9d0fe8dae93a12954d33c8b6f290b851d5dc8bb17a251ef6b34dd7c5fbfaf4efd375357f24c7669362d69dc256c57a410f271dccddd9995b9bd5d692e3569bb7337ecc05d9a2aac9b26f7a529a937a7d0a87fd7751bc85b318df4ac440c6dd22a12b881980ee25cdbb424d973167f48084aabe4577e45a1cbbe454442505efdfe84affa0eef0c0db5aaa5f008f5486f7105b7407cdf8ba8554eac60d1feee1565ca6989f643fba950696683bb3f3fc791993f82fee3408ee41904d9085f5133920e7bfde7470b59c00210bf7e90308d3d83afc6222d60616f18fcd7e660ca58602dec4c3f36e436dcb70248a40f82c4ca47626906b4339d216955e5ceaec890f81594bbcca7b4ed9b668529cdcc27ebe910496753a8594fc9db29b2eacf7a5a7545ab3603ca8ef0d0d611eb2aaf9de98f4558d89b2601ed58d461bff8260b9b23d2168a45d2a8e8b31da3cc041909b21d7e653baf28bee4abd90eefb44afbf96915ff68dd847607d1964267e521dafff39aeb3f5573def6d2ee4cb6d3aa8ca75535dbe9e27c693f716507545030325d85f41b836aa326c2bf8d3aeca336eaa35639d8601f19f551948ff44c4960f77051be0dd3603a6c6666666666ee9eade708758cafa01145bb7ba874a7d1c79eb336eaa14dc58877f9b78d767a8c8eaad06e2a1d3ea18d228a48eb6f0771e3267cad5651e77951741805ca0d1c3ad6b54f8470e0e86dcec657e2279ef7316a42220b9540766d51e596cd0f3fcd283a2c792617de9f9ef34e9ee7f20ceac46ff1fc2e5c3c2fa7ebbc258a2811c108c635c5533c9da2070a8934822f3b4a5344da8125b0f3342df2b7cc5def5698ac4431bb7f3033c728bc1c2036df572d761f8144b1453f78beb7e2571fb824bea964e2485e4e07d67cb18b5a8ca52efe861db84b9afba38174a0904839ee39708a4863ccff58300a2a7c3f3a6c9f30fc47a13eade42626ec94a229b48f4c89f2d57db1fcf26815cbf7f7c06278dd7a39a1046be94dcf31c79d4a123cfd7a4db878f92f7f7291eb959ababc77f23cefa38b8b2c9dbe16d2e53d5032617a97c769394bf14b427a8ad7510ff532829559bc4e66399287669aa76f617a17f13d1308aeacf1e5bb787189d1040c1803ac4d4d3c854697df76015d98dee5eb8f6ebd181f9f87dbbcc6e998de33bd8b77f1ebc500774417137c71f1a72f7d8ddbe0789ef72cb0244fa5ce4322c64b5087a3de69868c1823c6192719606523f414e3e4f51193c96432995c4ea0fc779b0f86594c637a1c7f99a5ff26ea573a93946095d22423a8e3bdcb4bb004b658f9dce66b01560dc479f13040b9d2f21ee8f2d5f33c9df82ede034fefc9f5987071022b4bf0e5f4a62f3d8edbf078d1f24d2efec5d7e8d473f12d4a4ff290f05ec785cb6f3c5c7cbb78016a8f6ae1c92f7da9f4262fa7c49d26d3e879927aef3d4e9fa614e2d4fb16cf9e122eefbdcbe3b4c9549adeac1c5d8ad09210a72ea66f312b1ba1a6c7719637cdec5b264fcb5bf1ab167089f7ddac19dd780ae5e136dfb7f7f1a5f7a597de47d373a5ae09ef4b334a1e7cde6f5f51b4c2ecbc7804220504c40f316b113ac4af973384c3e17b916ffa957f91e08b132ba00256fefbef57c0178661937d5a54be76038817bd01a67ac03440bc36eb0f444334106064651c36e5631fe59ecbbc9c2ca358a6557f51ee4f3d5d307a91d2e10b518791be0ced4c34d261ece930fea35858f6d803316b110ac4af9703c4bbd107e348dbb6d726d7e0dbe40ff1eb6d13fb6c16a17208ec711c88b95e0e8662bd0c6d8eece3bf486915101fff8508fc972cf666d3688cdf18249847196955103d47be97dbc0ec0c017eaf6fdaf86d02e031a63542c8ccbc108dd23cccce86259909b3610d88da907b1b93e76dd44c14cd9c42a333e069669e76867b00b450ee576a849099dcdb9835538646e6b79f7921649e2b79393360cd27332323037e30b60fe239cdcb092208ee356e86bfcdd49b26cf921f5e88466bbc15bf5a42e38198312f44a33e9c7a5c53ee7ad1a6b88f469473291bfe00fad086dc8793c789d606f726a06267153afd61fa900f730a8dc6801e6543ee398f991e6567b84f698172ef58581aeeb9d86593e90f3389e96b989ec6e43e9cdc0f93c66713a33ed0f8ed63bec69c42a33462c09a8f460c0d8e06f71cb659c95f3bc33dd54a9ad1d4a874c80ded705b3f40e53bd10308e3c33df8def055cd687b24b695ef3a7c19729bef239691bcef1ed5e3362bdbfbb80dcbb3640bc5ea99b1ed782a7ecb34dabea41d69555a9599b2ccb499a6ac3f18d12a246e336218f602c3d361fc85f1910fb3e336dfcb53f1b50f6627431d41b15046503d32be7d1ab98d8fce87db6846a887f155a33260bc8c8f1a95169f56a555423a8cbf348896ffe8303e08c4c5f0d52572c327bf7e5268fc3a24a2b10ddf17a5bdd6366d23719d37afd79524e8f2e0acae055a51acfa4274623dad9a11ab3a11ad289666f462f4d19759bb17b3ca77f9fabd7ef81175f1380d45a340172e2d66bc3899f566faf8da51abe467a6e936a7196c2a7a166b73eaf154fc65212f1a3acd606dea40e36b46abc9616de4765839d344b13c159f813e2b9c5aa7236d33e375ea69153385f23d81d9393581d93931a12725335ea79e53cfa9c76d3e29a71e1a87a2bc66b0e1ab1ae7e1ab28cde87bb1d0876279b265ea342314eb2302a24340dd8bc6ce4563ed8468fc6febd1a8b44afecac6a224daa27586d18b46961944347ecb8c221adfc3f0999e657ebf32670c792afe36353a430a8ddb672f7f46941943adcab6b8753ffcb5bd49eef6dd3653401d6e9b96fd36e56b2c7dfb17f99176af81f235ba651ef8223bd99250e44b32e9d822926cf8a648f121a3d02824a1c856fc0d5cc3573baa86af4a961069c6e75c3aeec15735ef888e6a461dc647b17c44d4f7cd78d138e3d5fcfab0aecb26e9e5dcb6d73254976d32d3660a490b4f89540fe267130a2f87889422f20e146d83e33e5ac5577c47fee35671791abeaa199dba6a5ef47d1dc677347c5533d28c5a6544e3a98714bd35deac548b501a3f2d546045b82c043668c2154fe836e10a26b4866e13ae20011df281293c20a40352988200e1c00634f043a766208aafc3c0052c0045052830011f128800045a4e3bc0e7bf1153e3f9010e6800035aac74052862c7f3cbd02822e699fb2e6209d6af962882868e02acec6c2e44a227d0045fb5127cfd48f01545778a7c0d29153f82af1a91af9f08bea2420082af2195433ef0559be2ebe781af28215fbf035f432ac56f90af1a90af1f07bea236f0f535f035fcf1b546e76b0dcd6a9881af1f0506be7e34bbc06681af1a145fbf0a7c4551e0eb4fe06b48351f5f6ba82681af3511f81a42e0eb5312aa7e74499ef7ddd72a17cf7f6a15eaf9516ef3e261a85e1ee6f965baa655329eff46ab663c3f0eb7f9677e6d739c9e9f81803e25325a8b50063c4e673e9a09c0aa7d2500eb872201585160fd22600da928692300abf67d28d47f38a444e4a93669da3705583f9407c08a7a2160fdb003600da500b52060d53e2060fd501c002bea3700d6d70058c31fa697a7faabd1016b4d58c11a7e06c0faa828c08afa3000d6ef02a06601b06a1f1460fd5015002bea2900d60f7d7c2e4ff5578569fa6b2400d69a3002600d1f02607dd403c08a7200d800b06a2d90ac5ca05c5c5cbcc0c0708172913123c6e97d8268bf8bf61301ab2644fb4500d6ef45fb430056d410ed0701587f888f5744fb3f0066af29400f8060f6ea00280568023596e60a02020139006e00d400f803ac353a20a8b9320046017ea0e6ea40ed686b6100ac3517006b6801b03e1460455500ac1f05c0aa4d00f4014a008c000801b005dc8a4848f8862484a5e97f00e800b0012003c015904404dacf21a1736a2bcf48d34a9e51c9332a79467366ab12100b0b100b100b100b100b100b10ed9f135b95884ca61291a944642a11994a44a61291a94444fbe7942b93cff7f97c3e9fcfe7f3f97cef43fbe78c2bd3ebfb35ad33bd3ad3ab33bdbaefe6f4d5c76a61b5b05a582dac1656cbc7a2fd73f6ea73f57f55f8263bc234fd35352eee5daecfc5bd8b768baf0aed67009864be57e4364a7c3f09c86de6f7935a6e5380ef2705b9cd8eef2709b9cd12df4f2a721b26be9f63b98d01be9f03729b26be9f13721b1edfcf15b98d13dfdfb1dce600dfdf01b90d02bebf13729b1edfdf15b94d02bedf63b98d02bedf03729b057cbf27e4364f7c575418f3b5a6c6571c75857ef8baafba43a9af5b54d7a893f9caac9eca3e4035ffd9f8ca4195855e37bef210116f527d65233eaacd0ac0d7eec9f1b57d806ab704f0b5838af8da4203f8daaf12fdda45abaf6d7464c4576755f7412209129007053d31fdc753bee3a904ccee311b01b30f3099c889c93c26ff788abf09034c1f9ee267622e31df53fc3be6e729fe024c25a6bb3cc59f440bc8c753f18d98ac233ae50f4000733da563aea76ee67a2ac75c0fc05c4fe198eb299bb9ae32f214f637e610733d0580b99eb2913d0d90a7b40762aea77e98eb3eccf5548de973fe240d79aa7fc69431634c12149250939ef48b490af2148909a945527264a545768436a96592806affec51e59689449ab57fea46999987aa0bd166ee76f718a394927be7e3afa45d255e0ee949872dd4ae0e9bd4eab099b8920e9bf4eab0a374d824281d76fc08928076a6065f7f2501d1f5768679704ffac8490eeb9ed356ebee6ed0bdc6d711c2147b19638c31c6d728365fb48f524a29a5dc81813ad2065f3f86611886611896811a9553a3714a1b7cfc2b415011001779801a681a4992660c26d06d366ded61ba8d491db7d95aec8df43cb853f0d56567b086425a25bf4a7d9e433a8c53c81a4550c810068700a14086b46a3dba4e5490024ae21885ea46a1288aeba2e4f67248dd1d95119442fbadf35ebe67da91c48e5569417b49f9ea1a49ea0f82bde9f717c1e680797f229be3e5fd47b03730debfc8e678f1eee2fdd9049ba3c5e638bd3f57b1372defcf27d81c2c2e2ad81cdfe658797f5ec1de74efcf2dd81c9e0df6fe4c83b599f1ce3d32be720e627c651fb010e80c10b5297f199a16e3fb74ba693fcc8ba4fd3030daff02e58244fb5b9c3cdadf522aadf47f279aea427b6672aac2a04d86afa2a83f4ad3be0f855ae95645800d719a0054a0ae4a6243ff866c8e5e994c5e4ec79dba38615e76c67f9bda7cb1337e84461944ed8c3f73e1ab6b04a455d266b98c7b96427bc2a0a5df9c18a103ed69a2eb718fd31cc779399c97d369513af424309df2277dab7efb0dac3fba95f913f5836fc55d4670c3ed4d5348a7fc39ef088d0621d2223b612d7259e2077c8af6000bd972625d3c50df3bac1d60b6f747fdcaf66dbb81494cbf26508b12d75f7b6d55088d31fb4e3b2252924ef6f1bdd965db7a4a6460a76959066aafe7b66f4d090d3c699ca7bdb49716a55543b34787fe9d97c3208f0efda316beece5d735759cb3c242d7890a76e8ae0dc62cdc898484f631c6d8d2edca813a900dfdb95397a3fdc6ccbf1eb858a66d2412f6dbdc9dd999fe38639248ad63e65d661ddbeedd0f2174bbbb4ef26e378665196f77fff24ad761076a5ec4a3828b68547011c76c62c06d4c952e7f7d12ad5a2922e50a50c04891d151dc892ca11bad0c4a983c8112c55b1ee42e7f0df9606f3aa6f1772ca8543172e48a23df7196f7b88ffff82787264fa24899d2ae7e0d11151951ff46c2de9c98c63f09d4bf798c5c814449ab6c7cb3baa77dfaa781bae5df24d81b14d3f89b20fc810d545a55e35f4344454647302ed89b671a3f728512264d5af5e22bc3807df88781b8c5ae0740218408f330606f6278b84df719f8ba5fa04eb445bed3b343749b6fc28e6f643ebea9f18efa896f6e300d0e18bed1f17c8313c33746b83b9801b0f64d18ba0dc6b037323265a0fbed83bda9d91a2ce8cd8d1b72a0fb8c044f025dd7c134fefb4aec0dcecade18c134fe36ddd713672337ca129df2700a19c15ba00c3a123e9f96e8237d40fd250d5615afe8f08a55451c6ce82714ccea905fbf6ad287c6278d8355c5286ce8cfa04fc8371109d3d4f04dac24a854cc9685514f32452300000000050315002028140c08c462b148301185651f14800d86b2526c529c0652968510428a184300c000000000000069d0006ad86af3cf498effef38c655c7ce8e19817fb261ef600a61f5896a4ff719548e4c38815dca47aaa4b25a058140dd59fb5efc6efb7f70efb2e2c6a27e3735726ca8f5b7501f210af56e53e79418008f50626429ece0d382885f03883116bce7c09e90e3f4275d56d3fa2a1e4257b607f41458f2a23090e273cdde5dd97fda7723d38bd3b9e7a035b383240dddc65fe821045cc76dad2b80d0900ad056092015f71a9d5f3c1d5eaa027b52f29da8464f670999cf531936749f7b3b5b6525fb612a8d04f85ac53af0d864e18d67450647aacaeb88317f1cafda5931e95a3eb1a872b5e6a0b45fca0830715544440722aed99dca43e3aafec1730e41a66952b2c18023b4d90826a3dea4a0baab8fd082ae2cf25042c4428f48b65389e3f2d54d462510820e96bf721215d5d2c2a8628e32431efdf40775e00a76ed03b7223d65acc09c4ed5229b2e14f0a10a24db8a0cd9915b74498bebf532f9b3c94adc8060f5ba8c8f7e0618566864e3f26f185f75b68a0a4daeafc05caaa25e3ca25be8bc8bc60a834423c862cb740421c3a3c3f19b510e013a95f985c302b999080d71f02056f6914171771fb201c29b835e1e547e1317e16f34a050ee5e3ba7b69890b6fb934530e3c9345db32253a334dc7015a6f0e5294aa584c067d4bea296eec64097a7b7fad25d401e660e17b41ad0e2063b5316cc9c93071c7e94df9ad77f6664ef0a6169c504cef04258035f3495f989b2aaaa4ac48576f6ec7b9d9622a6c7e192e389cb6ce7621beab374ac540730980ed312862dbdf8633bc7ad34f7e9179042d59ad947371806eeecfaecb78098b5b51bf28298cc97e4c53e0cbc5c1b4575439d987f328d19e1e14e3d728a24291f5358299c3e16501732e1a1ab5d13381bd68338dd2c5ecc538f6aebb732e32c646237cea7a6ee20042e021f27c2fb99b196683ab57cc0d636ca74fdb8d751a4fb420651b600bfdf1396ae4f2cec9409bc7dd41c6233d8862c7352b3944307af74c8d3115708ae72fd7c6ba9fdb24a2c100ea15ea7505fbf1e5a7bfaf111ae676bde7c7afd62da495445cd8c766c3b7760196edacf0f1ed81d9531463082a62b6f335595b0ebfbd7c5044bfd4871ded1a0e92a1556effd0604ee5792f2b842dd425614b501bec18326fc1b2c4ce58525b2ae12000c185d17dde4d90fac97f00770de29060f2b5600cdf76daae36fd92fcfa49ec6c8f58018d09d67a2c65a8ae7731e4305753c9726709fc32d1a2b583be77ae0f6a0b1b80e2d604f748bfdaaf3c49d95df32bd501812b4b9bfa3d164a4952704f8c7f8957db8989b8d4e3b38e66d1e26e2abe70b2936865e0d63e22d2c114673ff75b26cec8c20f15d78fbbabbb0261c104748db006af0da6d7bbaffaf3fa0fbe11182c612a1a210fbebe8e17331f6350b3ace3ac07735d6771103a1ab028bb6186df4aff93cdccfc46f39756c93c9ad98980bd79905456ccef29291154666ccf2511899df858542be5937b44d71bfcff09026c3ec4a5dde5e965d1c3b6a7c44b5ffb5b7291aa4b0b2e5085304d1d8e087cdea0428d7677f858b7ae58d7853d61fd23ba3fd292e01d1d40abcfe27a79fc0e15684f83096f0382b428a93650bbc6bd9740c64827c407e497289b5526197ac362c20b9d02eab7b6c1dbcce79d1961105cf0507110657dc358cfd59a8a1b3a6e1d15778f2baf2708f69cdebc91d50f2a2f53626d67711d119189fa22026730464cf512d47c7f1be1470bc702cab68d6aacc7d4bde40a44f65d5215e7e391b91142085677f61ce96e094a716f0077808685d899a0aecdd6e5fa0db2457284cfc27ee6534918b665d879813efb804ccf58a2b40695ad585390b36d1e15d14ed09d9628d969aa7f6da7e13a777ae057414d426958664749b9d28534e0499f16117b690213fe1f0bfd505a946a1d7fb787665268592ca7e014c10415f070a81ec98f66e07c9ce958640f88eb596753a98d2de5b61ceecfe5ceb7a598a492c82ac6cfd51461e0e525c62d7e11e6ca258f9d4a17ccb66e922eb65065cc4a257c96eadb305c7f29cff55c28f2a5ad73473f4f291bd55b2d1916694f2a0489a15801ecd34901aac4cd5a9434392957a4ef8cd0a00aaa297f8eef8413397263e22add7d9e62328de7560546675bdd0de6102bb86135aa91c14b25f4cf789d0583a3476f958298a45d1545719fc853490739a1a55ad0a180659c41384099d49c94e496c87d51648e9d16d68c3292826e4732c2184183b25ba2f4ad701ebd32396b8976fb89754fa44af523c8e87cdf09d006798d2f87417d7cbcc88c407e59239b0b553137acef673c6ff9d6a5d3c5ffc9fa9568573c5ff9f6e2d382f1ef9dfd5b65379dee7455d2ca66453896c5ff6cc2d5da4978c03b9b1e75279146710844a69d1e4e8a4495e12790779bf8ffa9b888fdb9d8c5e8fcadf60f6ddbd1e9618334f6c85280582dfe5403352402ff4f57040cf607d31dd2340d0ee7151789656321907aa0bb1658381969aebe967d976d9ce746efdc3c891fd46d51484f4e7e89f9373e193184f129403df22d5ec87748191e7c8b2b76a383da9023ade821dd17887e0a6f8045c7e7658f930b17d2d582d8db024a8ecfeb668d7d43660570e7d1ab9a61c37f3f142f49f77f53af89391f894211d10c79aac37c2c53b3e5573ffdd069d575953fea6bfbaf6031d08888290098103c6f39c2f82389deb066829be07c29be9d91e16999a16951e6cc5182605a8587cd63237c2da1281a1069320ceb782447fb5b91cab35f2c18df8eb7b369a09c384d44bfa604001a5f806c413b410a0d93b6491d3ceb66f77d749b764243a12b8d9376471d3ceb6cf1782a64ab1aa10d50647f4477b3f04fcca9d4fb0a66bb15c7c4392840a857bee5124ec6cb5df85fa96700f4c08c0206c3b9883a2c2038d6ab95d50a36346265d26fa44558bc39f2611ec4cd87659834882746f733c9e82d41421cc609216e6b0ffd3456b36ab75847882c0ba40d118ca40f1550405156dca0eac5ad30c8c09be13853e4247a133a851e0b343b8b54dccf445089eea1f6a87fb58aa44a930404badce6fad1f7cbdfa2d309d970a40fb6b0153f7877d9310533d29565ab883e73081b0c1c22c53994a6ae4b5b46289ba17287d30a05e2ad2fd99a70a75d41bcc2929a5c547254efefa9be3034da055401d505429d481625fa9e0e740772ca8d85e9e9cf2f5f55c52f896dcd00eb9eae5cfafadee31d10a1c67a078b5ce8760cba4e5b4f3c024da663511a5bc24f57536e92b922a439134f14865de443a6fa4764c905617a9f8bb4791bd7aefc4cca42c3f699686e9c3a7f9b3a495b87f9c272933102b3cc97ffb73bde5cc1a3a97b442195c6608faf7b263914a3da784c4d5401bf762d71db4cc431e2243bfef39a07c465b2e607969b0dea49a4eb21d5f6577fc900fb17b1e9bf26d3fbc141842ce76d0295bd00ce11e626bb75a59b9cc59ec568e369e5b366046ea49809f7aaf50e88fd1f1276a8ea573b0ed87f410c847c07acfb90a1a807def3481557630fada11dbd0a55bb25767736c4c409cea1845adeda5cdc6452a555a5ab01c4a82dbc26ed20fb5f488a1133c3b1710d6dd26d7349ca8e420823e1cc2c22673653ec38dea343e4df781900ee50566b48e478328b962e369841925c5bc890c2de45ad7c4d8681ac7850199e44c5370952dc89cf45a1669dafdd97d800736bc8c407e32d51a1cd9f129dd9591842888263292f8988bd1c91869396dfd2798280ac9a15a2dd6d162a41df4c571663e599438cbfc3018a1ed16960415169815ca6f2c8a9592254f7c11eff7eb6679ba644a0316891a9043f10cf813e2192e92325d1782d689e8f5b79bc99283ab453a92af9549384f236ccd71a482b3e91f00b461d1610840b3a4ae19d46377708297b9393a223d6e1e907da63120723a41b99f5059b51c8dd1408eefd18f2567a4ed8d14d197bf929cf14cde484578705c7f377249ff39afbd73096a9df84d36d720723ac670698e1a69f44bf4b40836693f0a9c746b593dd5b92375d90ac34c903632f1cf3391d108ffe11ae1da0bb137f14a9a9e56d4dafcf1061a6223612c4e5dabcde41f73ee1a397c41c6fd74807e0dca10aa0b41eadb52f5cd2c9ea2831a951cb8b2602c22bd878e95cc2f9ff695d60f57977c4e30e7a34fe93e8ef7594dedd74a2e9712e4f49b1797235ab7e39fe34d32a77b37c30bc52cd7af775a8e435df8746daab949e285bc47bf9eba404c6783feb3e6a8a113aab95f2eea7a8f904966ddcadd638e7b00cb51282241ac8a9b386a62155594bb949c7565276484be3c3ce3e3791573b0f72b650c5aedcd023ecb169e0a86f8db7b4ffc8f2af323c1552958544d5ace4d03d875a8109899820852007bef806e32413322ea1392605248869e1dfa15b45752372714cd318c9a45e4fb1e470f0aa8a39be6dd340d374d4e0289a4e72931dc2d4e76be09c9346621fddb9d903d91b911a788bc4ec979379e697b1e33729974f946a0da4c1f6aef60bac8122bf6813ac388f651a23be97126bd31ee61edaa49fe4b244e533ab1c7498dfefadc117aac0d947b8ab93ab08cec12734da9f15b7b913cfbf7ac0689aae18dc80ecb5b5bbfed37a373e8a5d7eace5b04fcb0735b83152a2c6d207b15d0ddf96e4b879bf89e32a1a0ec7be70996858173ea402c78a695e7b2c60460eaffa591c9f48a981de168cd730a5726628c95cbd5a55759f4a2b0d41e550e137f61d46d192a8b2f3778f675e73183f04f17634cecee5c0ca05e4ad184ebe8847ceee0470b8046898cf086668483cb19bab772d1b4b8ea8d2d4824c3a3778cdd40f19b4a0c7198751a804b03d7427bb5e2b5c01e8afabf1ecad7bb74bed1b3f43807810914d48360bb30994b06283c2d68637ff3aff1bf6a2e16c708f2128a30752fca95d0061b037a493ef757eec18d353c9ff9fcaafd1980ec17b32ca096034704e8037bc9ff02c2587bcd820f545bc99b3b75096f63d23468f1b6a7a6b7850d24892c579eca015d66aa15af7ef2cc8873f4e62eb9ed320af0e4388ec64a862d8a04a6d5d4ea352ebb9db8294266a22cfff67e0ae5d2ab3920322d7a99e6fa4a48f1a069df9ed09ab48bb8a371398d563d8e5ad53867beded94837b788de7150326f91b6bfa37f6ce8d3c4bb91e58c4f05398f1c7e8c9137a5db8af5538fb542ca5cf5fc5964e0057d6c3d3d16bb0125af1af5e55cddb634ebe005d0980a90017bb38c37d5d04b15c1096a378da2f40024b90537b27918ea3f253bf23e83fce09ff79e1d4bbe82b8fc9ef8e0c706c41219950eb549b8d99fc1021de28fb26f894bd964afdfe3f531684e35ee63c942a2cb1692f69909b0f64ca19d4cf602082ee32085bab8d98042b97ed08193005c89bde6690e60c210843d56ccc416de07664d4a0639c40e62d52641b5807a8d9ffde22b3fc3a8a1861bb10a6bafefec8d9b51bce07079033e258004c37e5e133efede1bbfddea00987deee97ca2dbad2444fc94104c4888cc1e3e9cff880f8c7278c779d1701f61ab724cabb6a44abac99f08884cdd2bf7908f97a2530e55937533a93a7df421953a99d4071071b1786d988ccc6861f698fc9578d943fa500408e92c6b9e443aff8b0f988375bfaffcdf0adb05f1d378ebc46535aedd6ea1dd88dc71aa77e1673ab1f98508417e15cdbfd7e74f2b972033c37406a51cf791f18f4203c575fdcf236ce856ddd97db1e958204d8e3586814741466a861d05d8491b8d59000bb570e61c954e3bad59a8c89ea276f6daef1d3714f5d253a39301e98d73fada288abe7180195f3e9d7a4938627c6c688428d4c1f4c99f38c4693e55f559b554c76a7a90e410fd661a563038c082acf6dac3bcc552cb0f6b35732f17c7644093ed9eef278b13eabcd3fdef7bde42e1611bcbf64a052b0de6fdb7e8131e4b8f1db3ded4315f4dac758401cbd00efa83124622ef21e384513410e8d1133ea815ac3f06a4f9abb5e8ca6b8a2075083b07adb87112eb08643d444e1808bfc8267425ca5c6e638b06309b2f5c45998b2ed8a77d49f5f6269e25dd65fcf613f3409e610f010699c6256a3e5515f91391a2045484cd3103857b052649797f1185d85935cdfb8e8aca511b8440f24d9db1377a128233087eeb164779e0350d933487b26ba029e4eb85c8c3e736f959f930ec0623e9c0afce0b01f893a7d70aef6ab149abbd72c3530375076625d1fcababdb928fcef61f8d9f2339230461302779e3c2388812d9c61dab27b2d63ca24d864b8609bd25caf9f2c95d28e97c9d419eccc3344f7ebefd6920a640c1222f755efa0924981b0f5fe64d82f6ffe4fe84163500e4c8d8eac66f1392ca3f8c93cabf2a7a92f597823c9117a3ad3f507aa3d924dd060567e49018bf377115d43006af67031517d9083b56de96b31f383d14189ffdea2be03eb3e5072efbc9b6fed8ca7f2f0930b1ac3a2828129d013aef24cb37841e30451638e807f63541d074414936c8c1079feadc890555bbfad855c5d2804283cc426081a10cd390f971f86c3c4c01c4c15a7556068c878bc8e24f9165629b44a626bebd28a655c549b2d87d17414f1c4639fc528fabf1d090f1952032558c9c6d48760f25011a9352c0492e40f9f083aed49fa8134af1b6a52c1fd053477208704356d0527c4f54be7c32e99b4f1733c5ab9c8b64d7878e2d709f895b69c8948345986758d9aedfbbd69bd0842a2a89499994fe9de424946fe921a990751ca9c4aa9532b6c546ec095213934e5316488670827ccc6ead179c3dc70988ad63ed0fabfb904209509e9df0a14dfc4fd43259df5031d7040aad2f69400155675e067a3348a2e0d1478603615333ecbf9d207382c52a1119d9d61953f531b647a851098c861f52eae311ccb7392a91570fa4603df228783f1aad273fde10aa6895bb6b71aa6537e3f37d6180c6b773428be8513c4a12513b54a23eaa912f1129f475d055faf15cb95cc1d01fcd2922775448822f11a157d89993bfd3d5a0a4e0c28730c118fbe0c22d2547e56e651ee27e90ba7f01868337b8b3df48d8da28a4519d9e84e7734eb9a78d74229304babd68c26035b627a0ba5b8478731ad2276d1c29cf320c796c154a10a9feb6e53145cce23b764a35f0cdd014f74feb61af860d2f05d75e9b3f3a675e5a9eb8e2279484582443461742ca68e92388aa9705d1e9d8807ebe07d1129ca997cb19e27d2f62a5fdf60529f17947492257bf33fc1065029828c273344d56c47b4ad9500f1c7fa515c4aebc490cd8888715bf1767bb328a6024234386a5271b18d9deb79119d345acbe8e60006a1841d3116749450d73e47a1b2970e0466d51a68e9084ae60e89132dd60f288668c3a2b68cd66ede82bd59ac782bb26152bd4ab5c345ce1de7226d5c66c6f0b17958a9f8822722f3104a0625c48d088f3fee53e41b28c9041741629f6a44503c7720c511f7b169da72f829326719d89b26d0d0d54e5e60f947c09857a979393e62c980e424d51a9ae97264adeab7160458803f46e7f2eaf37beb049e0788770fcaf59adb474ce4f57d232e320a50d6c53fdbdb2d76d23acbcc6fbb345bddc8be9979f115b188b18332332404998966d01a443460300f232c22c7f907f897ae5adbf52444363eefc323ab85319380daf168a6c35337058a4c3783d7b89ae89ae759499c9344f48fc4c0afb429bee1dc97fd88b3c8ac0bfb46aa287577ccc408c08538be096851f95cb7d33207d1c22e83e917a9575dc287a2c6764769d0b6cca5ba35ca0fa0453dbb514c5f48cd3f358048e0433b11bd260707ea2a54360b6fd3bee0326700d9bde109b629bd31fb0c9cfb44a48b60042fe71b400912f9841a705642b32fdaa1671429a894598aad11e324403cb6d1c2403bb0bbed0ff7f4064a450c9903eff11727273448e62a1890a1d363f8d89e88e2a91d8556047c2ae333ba6a3bf637f2e9c23bcd22ce33dcd38e836637206bf3b0b84aa91da0e42c735941618f9724e31be271019f536ffe71480be6c45ecdca17b7d5515772395f09e1195d7a9a6ec0da59c6744445f7315456e8452f8035add133a7f85be3d7c87c4967b29b19402aaa7d854c07f54fea6893423a5d10fe0de9eeb8d5940a009f8796ea8e858502a93bf60224e16c2e7924fade94c1761009272af7d098a6d8960805c916201b70edd5173186cbe448f084d4d40c513e5878abca00e8983752346849545b166e098f82eb2910e353c0e73c7dcce68ff3e69f389edce09c529285100d27f99339f3e3db3d26a17effceb59cc36de6c780a97c553f41ac7532c1af7e79dc2decbdf4ff03685e0dd9b744abcd281896c4725c17ee9ef9c47e3944cc8485ec99a47c4b8d014797ca2296200465350e13e0ecb0f2f13c0159a892ea23b9d94f5a59332558c4eca546ec64e9d8746ce1403cc64f8936a047f6f214bb76590b1d955b0c043cd951f5cd3d1211ddcd9f57207299c632cc073b11d1d504b9dc1f9e835ed9b1034f265958d1c29e44dc6ccb3484b71dea97aeaa3422b590abba5c2f6e378c67cca8279c80744f4517359b8ae6d676f3ec75de56ea67d9afd6f10ddb50529d5beb3259e77739e680d2ce5a8b8c18c01e4148893a24c14582bc79c02af58df3256c3213f96395e2d06cd8f7bd4721086868578994575dd6beb8c891a177fbbe5204c3069db3407fb65b12319f2a46832767ab68fb06d61eaa9e7bd3675b9eeb86ff35ca4a64cc34e6d0c99da42bfb3fa87e83751bde971f6363b88cef2c29f765e07dfe4529b9fa1615ed571f351a02d1136f3bce1cac27107a807f62581925fa3febec3d76e45076cf3c3f504306d31578e57cd837d4cfe6fc9b49ea24f6f690b6286b3b63652d4f5f5afa4bba5185f7fc3b8887512354936a480b6fe604640bbaf2607584ebebe6afe73de9efc7c23d12775721846cb0d69df359ce637d22e33d221330e4acdd22760cbb711dcc831722d403521656d0603c3df20b50daebd2af8b9e3e7cb4d18f50c45d8a4da533c2e3fa6355799df42762daeb2a7f424e59469c9ea0a8fc375d05326e5850c0c91c7444a46f929ed8daf8231234afd467f78bde93bcf0a56c6750244a74b4a74cae0464ff249bd5cb276fbe434666f929204b8de98767cf5ea3d8dde7bfd3fdad2c8a27194348bb182ca495cede920c2f8da8c7afac84500c451cbf5b70cdfa51e652dc2a5b265b12083a757d202b917dda6243668398910f45ba37895c7f65c7178d4108c0beb4323695aaf91c334c0cba8dc81779541b6d7b753bdc1b52c033665ebcc7674ec68a64ba11938145cf4508984fcccf5c74ce33cce505497b0d9a59e824a129d4948dffbf5f562906da22d54ec49899e3458e8889324bae00e34b56491764f541cfb076537b6e00cad2980aae6ce5c0d7c6ad6b38951b7a5ccf2b5ccd24c0899384e9af78715c1141469d0599f74a1a9fedd542714a216d72c5e83d733ca7177a402d1967936e9ba6fc04d6f4a46f7bb9cfd9d27a4c5cda5efd2a72635dd550a2d0309a2318edc9e89c5d409369b2b7b8b886b9113bbea14f4b9e61e89d1450c2e33359bdd07d54292834078c13f99817729eb81a03df07c112550868cdf16418c185f9ca11e24db0e22771626c7732d9455e7e229afacd214d9d1355c759f92e333a7744ac50e6c23587fcf039b81592ea6b9c74595f2689c50d575ff54b113a99c619a70b9275d2451801763f388a18e2d01b598528c42528f70fd664a669b9990b9a69d0e6c9cef2e9b6d3a5958f3394327be6d7e60ef15733ac1a2b737430b764e56cfaf8d23e0ccabc19ddb2aedd286f38138ca52a694299a4b9589fe871a74684387e7af58477330cbe534b6570c2191e661aaaebba6862c5994aa5cc9ca294ef87fe3f6e33ff6f10f5d7684faf25480968d13bdff2a16d1f7cd7d4c7c20f9267a4c20caf9493039aef0a0d650d0aa48e844a7045b8e10abfe811e34e8400525b284d2a639f102e7b914959dc7cafce3c92111836b58e41ff31fb77cf0e31fffd7918e1a72829446aa26dc646b5aa44a0b11b45f0c5ede7f1d27b0dda3cd3517f2d3089d7611905baa4de4206c824d172cc5428ea8abff453ae0e5ca3cdc593c73f388cb7316cff93cc9e1ed73da607a8ec7fcceacece97c34709cb1f370b316dfaa6211f0cb7469eda2f8b2f62dc7395beb4369dd6139e21ae2fc2e2b98f621f6d57163a3a12703bbc905e8007903ec199b1b3b613556ac7022988f15137e3bc3db8bc7543d5604e7234c264f1f641bee43e4f382bd1c4d3f18e29ecd45d09922a83eb3c33dab9af0d32c41409fe72ccad1fa6012040b1e93817903131fd0e29f360138c6d789f6b33a30e4a22f0f2ff57d7e7644a0a5150fab52fb33201f6d02ea91ed3876fb4247654c5d27439872a3587b7e111ffb64d0eaec4857801f2c9d9b7e91c89d69bee14e70efc4a9c64406a956de43aaea7deec3cb6a6b4fe861ed43062eebe517e2e39ba38f2345895c9b67d62fb2dc7f54fb6a2162cd918d8a300188590f2a6117e840c7c441e0e4d93a3b4149674e2c26e41ee75f544aad853a972ab6a8e39714ad307bfe09da0aa27a6889a84d9cfb66328d1e2e62a92a1c182e384834c047e4916d91d81bcb0aa5e8d796306f0d98289a106d136d949bbdfefa36d703f953e3f40b7aec7d26be3a3739d09a1748a28d67341a854e4321612e8f8429aaccb8cfc4bc4445cf1506de7924ee0f29c16ce0904aff983b0ae8396d90c0929195fd13f041e972ca1c2a9716f46b4943e94419a5307d497cf13e4d64d75e6a799942af4e5da365a0981f74eafa98cc67b89e7bd18e3427d7b2e41fb15e165f60e94e8a5636a2ba19f150322cc08e67aa6c986dc7c3aa30769cbc8ad11d89c93c0be826d5f82ff5252ce2568e3b4df07d6e0c3e9921e98904465252a111939139b95cf4b1f2b4a050668913063b02a997002c470227b5d7d239b88c6a70b9d45a21748d1e361cb98d7c0415f65726931d76a33090651aace05aee7fd503be3b44c5f93e063fea5f209352aa1be1e80bba72e5a8fcdc98d223a7f5d3aaf2ebdc56d6ce6078801383eea212ebe98b6bf3a87e315ba19108405e98acee945f93c56ac912bc0a2f77e3e5582e1b9afe7a2d9a2ff3463591fc5d20194b910a02a515035c4d1558b9e0a0402bd04f06e7cfe1831e74ce340a5b0dfe86a90863eaefdfb715fd379278f61b5fa57540f0b9675ffb6be20b999fb7a66b80f0331f7b0f1759a1092ba5acd2ca931156f999bf20f5d8b328e50fc335a4035287f10e73b0f513bb430408355dff7e70a4ecbbc2847d033e8fb5f9ef103dc36d4bff18f19feab62d82fa666b259856e159e11b4437d48006c5d80ef1c8ec697e0929a059ea976eca24ca52a21ce534c9094c19878c5450f3f5c595026b6eb5c62fa6ae0f7bf8d0871d7c0c638eac974c9bcf4f960aa4c4d2fd3a79626dd34a4517bcf3705c97411d999e649a5bb43cd7cc46365a305b48d60e4496fb98d7b8682fbec5a9bf5f695fd2ef90ce2b3c59e5945552499ae2bedcf851add2bef2a89f4032c8b3a59285755074858c939549df880ea4ef88572a20d05a67a9c8a934e450af8b1aa5cf8e94ceb6d34a00d6c4f2e03d5079c1f8e4313c209ec10a4b023ec9fac2b9c26537c3e59ae4237ac066807af4c83304053fe968355d116389a56e266e337fe21c06c5ba4e295e43563172658e2d7f38e2a9f8de35d0e3b6fc69b5002c16f87110c361823f8ab844d924fe2f526588c3a9d3f90ff9296f621f7a932bbc9592660ec0c9c17664ee6d7cb4b86161733736a2db0e7a37b8155d28295feceb31c5ec74305c9c2876dd79e8ce40593739a15cd01f3789aa84fd3072b011d2f82463f247c6e52f419b2f423adfe41bfd923c0b94d310e0f387cd2436d06288d7ae1db39d41bb2926e1120c3a066268bf403f3e457c81c1571189338d14c87c0091051e3f96495ea8024224aafa9fd99bac7bc2b3616a0fbecba82f7cefd6cff68f1e42bd0686be21585cf60ccf4021f5048a2e14f041c227718ce1a13e57451762a8f18e99dd8cdebfc27e1000100a9334b998715ed080f5c9499a3cae39486ce7ed025b19c2c69ea55075cc8213235a99adf0ab6da49037463e95ef610d8711607e8b3594cc0e3b8a6284314ce81147a2f762d85f9e8e3f86090e1fd82c356e98247170d552565db0fb62d9d78d86645817e6d4fe79640ed477bf29fc627da69be490a621824e5fd74d34fe027e73f1645af9606ae98f15d18d655a8991829b84872f334d436891450a6631c33f0e5b52b65fdd327b9bf29fd41373a7eac7ffa0b7ef8bbef29b828d2799989a51b8b980bd72b861f1c55c4813cd13bc5df741d9b828ad0ef5ed123e507d5805e862c813ea7dbb602a0ac392dcbea2c2cd0f582ba74ecf5024201eca9d3b8a154e151caab96ee838efcb35acd30912f95926c43569d99572608e4389670a7afe37c0ce68025c92f3655f9628f885e92cf9980a6f7dbba0b29386fedd1528a6124705e585381c931d526d1cdbb12ddc3c9e5e5f5092aea3998ede16faedf4288e09687bf432feabf8a8df179d52471d51d2f58e0cb159b5c218713b2dbb3813235716f8fc461fd04010718ab3748936b82e82cb4fb1dc47d0537eb06aff4d4c2a490ed0da027f7274dd579165dec6043e4dbbcc2a506a928e444a0aa2db811cdb6c3f58a3dd560801b11ec30b69548c36212a69b7cdb72a1f05b755595af8d8545123545f5814ba99e59553298f3a9bc2921ab9648c0d56ff4a664d72925f22f1b8057f4244c0457d61a3c81af6c04e19893cc96eb32f33b1339ce225a7b518786aa92d59f54cc441e8da728fa57864a57f5596cb8f545ae48e87177d95895eef32350fd92789cb73abf4aaae29fe760650b4fe63c3032563ef54d6708588b68e8e6d485abf64e2d5e01caa42a6966c688ef495311976180717fd487ef99950e49155289ae5f886c1f4822e89966667666f455eb62c00a526b25451e539c6a7861d57c1395419ef689b56f6af27a23902136d8b9882d1505c8d47f6a4d9bbac721d46de7372715c23846a09c881d6a332b742602c0afca1d029c02e13ab2e3b0d3b690003cf5952ab66809afd552636c301a994491df5e995b94693ced47911016537c99aa20c0bb18398fe658ae0c518dae335e0770665843c29daf26a94aec005632a3a8078ab22a1b10c77f36e7a1d380633bd0893e7d65a8aa9ad4081e176e98175872017b2cf60a6eed5cd1334d20b1e96c360ff0e8e8c19034884df6439f4781d7acd60d434689aa6f560a2a6997e009c4f498d8dd9aa9e205eb2c680ebecfeafbdd44a6cf7b94c23a0a643cf8abfa67a63e956b9a2b1d1d81add92a59b6c5185b5b0c5822bf7d5fa82ab14faf8d1ff4e99e04b07515284ae739b00612ff899cc4ddad086f06e3fadcf9ec1af2900a67044b2d6710eb0042e34310f51e1a1c761f7994bf6c8c3f8d2c1b862519439a949d4031a4a4a207a732e13c04e1d9fb90ad3ba64583fafc9d4aea34a377c4a774f0da888300ca66fbb67e6c01551a8fce380df1535fc1f14d03665d8e9ef2d26498c7cc8c8a4758fa96fbe16046cd2da39524f35784cd407265e4d5fa798e58c395075e868b35301db99269f7cb215947fe717a696d1eb830c398cf786b59e07179f06dd69e4ef5acbae2fabef29f057d51c05edae76219e4dfb031af43ed027f2e805f2f45994e4b2cc74a17c5ef4a1a390067cae5de08903927da205a0bcd2c8eb12f065bef32e98e41fc4990d7ab74061f25f68d8e4905bc1ae712abbc0c8763dcde7a1c2db57b3493cd7a193c6a9fb35b05ce9d4993a3b23b23f1a67853182b7c34d251dbaa588d421b402e5b166e3afdf916f7fd6fa0d03ceace00fa1f4548e918f79fca9730bb0609bfc7533c1fba89ce38b56c8425b396f601b45b3678f239681997f0439742bdd1f3916e41f87a691a7a084d7d26f9fbb998c4d9ee3cea179f8676ea1826be35698cb4cc2ea749eedeb73471a7930ab90edb2a4bfb4288cd41a138b1056270d89500b0d3df5fd0d088dec56d480067cc6b1094c25759ae0a08a2d856376cafc12f46342e02a55a345c59890319b2f27e35e0663fa1feba444f9d44a3ac9cdc8b2e420c7845763468f029a3731e2f9a861b82818f730c55b217806507c570e58f8f59bca0ddd3559ba899cfcc3544393a8dd6e941b0288dc791b27bb68d19d1a01acd1d6fac69cc67fc5531226623e5ba8953034e36ea371720bc95690a52b3a82d7fe6317f4bc878a7471cf1018908bf3bde05f1c2b65014c42d4281a628d71bb2822a0cf9b1f35caf8503c6dda922fdeb401b237d3a8d48ad54317e81411282390bad516150ad0a09e918418838cd0dc0c99fccb8665bf36a035a3629a449eaff4e9adb831333f90fca4dd7db166b9585d81d9254475bc7cb82d9a53cb357491923cea817d12308c85ff0839fbfc50c36227c80e588579c3255714737ab2a09d1a8c117129662375a4b2378a1c71c146a7ba062f234c9bfa4e789bd5e8bf63b1c2484459af4ca650c501f022c8310a72cd6410b2c30b7119c7d8fbd416b316a2bd9828cd7f813c279aff32abca790f41f2460e038985a736ea606ba7a151c3f020b84997a3065e495cdd679ac2c9e0c3c961b719e200077166170f4ef1cef2e07dd576878d628fd69d2c8e423d45c4b13678eb4bef2894bfd742769d8d429bb8f9c0d62ecf1e36d6af9db9ef4df3c1fed58092de692a1e3b920c023682bb55e297456173c6506068a4a991e1ed9ab833a9607a372d8eec1a0c5b9b0c993a1cb43c2568289852f83ac45c47a601ed34e685d1e4b11a536614d7c5958f48ae5cf048abac0a82c452f8abd61f5b0c8f604974994441e2ddefc1010aa55705c9202eec688135c2f56422bd440cd3ea8c6b3fc77e4b794770c32b826293e7d8d283ae6c39e22c543f4e7370d26b01f17660f26c977e80c3ada3b9c9059c1a97179f7a50c70d0905e87f452e6fe040b13a2e2a0c469e75dce590d2d5577869801849f72d6750b9b97157f6a3630c038b2b17a86201f431f626ec01ab35aa3cbda72d8d1075e59e9711ff691d5f6cb2e386aeaf2d0c8b807db001d1b2ea20c200be103d79bfc7a0c01e9c5da3ae565177bfba513f14ddc8edbec340b0da1eed80da2faf98c443b25a99c038df4e5ab0f579441eececfc067d7dca57ac003dc57909059fa902a19c6da089e30d8494519b864b75a135da139dd3f4e34ddcda4351d7f10421b4dceddd32312530eb72da5797d404858787b61b558709347808f97f1286350d198ae160e59d7127e3b7df8b3feae5ea7231422e014a32159651ffbe4ab3eb54aefc2a13ae2572e5aa9098f01409743d51c31280eec8276e3af8e1f4394b30cd84705522a2b3f7b6cb31c4c54429d8de83827b1af4e8a0827ab8f194f31bb60527b86a6996cb3945122404a283017ebb42b6a6a07d57cef04390b4abc44e765ecf556268eee4f2fd5c2baf02731a65339e7587e4156d39791fdc0cf4057f156354c3ed418662988e1423da1d522937dfc081e2ac51898f76a9d54bfe2889dcf7ef785e12691162250bc22e8f13e373a8d88714b5fe2e7f5e29ef71723ce490e39671fbf95cb57ce4d65ca001653c55534daa3a9d2e7d29b40f14c52b21b3a18bc8b7f30fe509f6ed4041ebff0922b097d4a0c802431176b0098854f17ad71864ba5c594cdb1bfeffeb48f61d8109b405cbd4d2e8b062adcd27d12a15b13a3e30098f34c417e71f75d4a4e5d23a2a5b75c8c67972d12058871500ad069a37a5096ddb36a4fbd9dc6c65c62371818f3e220390866b9c5efcb9080f655bb110f5a744b40380accf288984c7e1b0bfff043702ff8910f9639a5456fd4d06702e54385752c419836558ced3f741bac36b4a8ad504dbf3b35f5239f909d0b37541ebfdca57073f59e11d72e48ec6595ad029b5dc36769dccdbef5e7a9ceeb5e64d1645195c52931cad9b524da4f8212c8223003036dc19b4e7e85e5d168d78b212ecc242022f8c2c16d47e45c6628686ecc1bfe79c90f08a052322e4735a2b544faae16158a01456a6d5b9c8824d59c9daf7d685a86c90f0826e25c3aa4493558011d770da9e53c75701ce49d82a270d46d3e6f3dbc4bad924258b0d259c657e127ab63bd9881fdc2e0baeecabe2a0fc1e297bded72a94695867bec69c8220d558e671eb3f8cc131e321835df3add1caaa90b93a8a578ffe33819a8eb27255743896dfc9705c131edd4eacc3bead6501b3811d0452f2d861850c14d6eb2a882043389582809c1feedc7719d84133a0c793eba6b00fffa5c7d6095f08a8287a5c9cab26dff345c068b208b203b19471eb2b07f3b70f19ec67a1ec9a50b2312e404c71c92d111c7243b9f6f27fbc3a20e2fa182aebff6e7efba1654b72c1d3101041101fa2838356024e96351f349cda42125a5e53032023a88b6af3f25db57c9f889ce287fc6babe59f7f46ce586e0791e2cc065c2331a00bd8a458f026dcab915c53ece0059d4716636a0a8bb80965544c881890dfbcab492a26c614be7690198a563e67b3d53d68601842f9a8e9c3515c9f35ce0f6e4598f3f1c535f7f4a2becac65cd0aa6c3545c36da6cff81318ccf201ed660f487256b2905452250e5242081cde52cee499b39b25e3655854611a4741e0c914cd0b8e55a2737952e51d08d53f40530158aa15a619cf8d4a5be75564f25e245a43e4b82c0af412ddd73f7419292a064a4118dd03476f150531ff48c51212e9e387e58184692e8792788d0cc1a66e3419ce74154bc395871b11aae558fed72660aa7b8d558e480d0c0c8fe83064ecca0288fec47dec3f6ed1f51af303b8f81ff0c4b2e60df73e444b867040d84d4dace34689f428073966148f0703ef5df52043d14a3604897d6a10999e91f1272df9ad0c74d5a3a893eb911bae53663944c4be09e9e4e3dbf63492442924ad90f025fffd17344c6cf0f13d4f30bed400d1459c210ce6bb639bc07f4ebf9da5e06b839138a8d649675bb0e9194da9fa635200f79ba7a18e3bb556c555c84a120d4df148ac91a316615af30221a34a6a723d2d6adc361a20f4c266fd308799174228fc577e06a76a9dcb9a2d1ad3da0016715e140d72fe1c86a00aceafa6e51c7ac8edab6184c6d58887470c3ac12bd66eb6577958cd7e503132df5f52f82b83e032be23c1516789bc38d412bb275905b6a9ec177e62c887fc9cd1f08c27aa185586fc391dfb454fe1d80b69adfae3eae8364753b9038d85bab82a88aae4b1f22c6332d33deaaa44252b098b46d4847ff1657abc5cf35dad63376e0306bb0fdd95bf995160e74370ce85a44010a2e4bf2f2882a5af7a4c3a0270aba16fa335ffaabf00be68d1e48d0368b59cc295bd9e6cfc5f22ea90dfbed258849ffb3c15b95dc2252731cf1c1ab091b7f0f8258484912fc8946aaaf792e988b9bbc9447f58cdaa4a9a329799cccb2c1336c34481170dd42097e62912cdca15923a56f10160c550a6bf9db25eddd22bdb8a7ee9acda54f8ea6a141ee2c0f0244a99a85948baf557529bc28223be8952755e9759141eff137574ab7a5e416395b1b26a2d7ff5aadb7e0b0170db088111bd93983e7757f99281252bada9a5c18c3490b5e2ee86d2e66d47a70ad03d6468f8723399aec10a25cc91a0f959530f35b98ba326da22a1e7bacb10847767fc9a09e9cc5757d089e6f06e94a3de1e70776c02d63ff01c57ad667cde1784965bd7f7eb2a72c38bccc06162a112919313cfc9445cf1f211e7f4f1b0f8b79652f28a53c26b73fa0232a7ec3ebf8dc09c5ca6ee2e38ecc522bab320d7f9a809e5d7cf58695006ddfe2666432bceee729f89906505352a0836bbd4a299d4aded9be1ef80d87f12c149e63fe50a67528b6cc53db1fedd2ebe205c42566bacc815119ac2650d41e41556c10c5bf80d5e5e67505156f58ac331a344dbc21f7e2054013b337e4804f8659fb999185c0f81fc5e0e3b96bf79d56f66fa651c2ba28d98410ae8f72599487faba213668c7d4b5d66942a0b534cd7322ebaa8b3039ea04e9a71ed71636802f97ebb4b1f861d2cc634b67822616760d243a3e279aaa7049f2baae05028abddf3b79ae1471d1615b0767c09991c332e5fbeacd29395dec83c259e5b29d4ab4f45caeb9741a0304305115f14a442264890b63fd96e93609e2bd5e540d7d30fbe165af0609ea34467a41ff83ceba5998ad371abf9c93ad7387d4c71c52114424f0060eef31c63ca3936b745c5f8ce8fb73948f6ff0d191f31144fa8d7f5f162937d2aaae90938283920f9ae505013946391f4c9918c8331fa670fed21284a983a99aa441a6fc957f11cf90ad84ad46799b59ab589c76839e8d71cf64df743ad63fabfee0c6853c4a320760ac308d069d8eb2052d2c4b58a91e860311b7a8c3cc47a4cc19751ff847538699866f18cc959bc2092e1180b8c741440fa5f7d809320d28cd6287f8bb6957d400c62d3f07469922373ed719570c1da432e4bd8ee8fa24da876807ae90c5c3c2b83480ba83d3490954cc3ba6d0788fd0fea485e4d45798a950b253f76389891969c7362a15ee1341c0c307707f1b4678e8eb6fd4873c2ec5c29cf91474b3e6dd6a4810e4919e046fa1b9dd0455f74a1179de8843e7aa20b9de8452f74d1175de84427baa18f8ee843273ad10bbdfff5fff01f7522ddea469aa852efa285c236c6014775408c607fc335acbf967a136ba03d9eaade616c048b8ed7b32921e4338013057b2c08835161bbc424594cafc9b9ef0ac2c39e3de23f33514cdf42a8a6f2c5716222f30fe74335971836878faae6f07a7e4fced4d2ffbe5431a4ccd5525627acfc2e1428d332f29379824bdefd1e043cf5296ae46234673e9826fa3b8dd5f49f29d527a0f6f412863117ad7fab4a3646e04516aa2c809a0c3380c8882fe67ffed36195d4412c3c53effdac0eb8becbccabfe69db3fcac4bb4aa0a77db1c8cbe2f0c4cf2f169661b4dd457a5c8b698d20e3028d085e43a99122231e0d0452c3810e31f3926f7cb0a6b4b2f24b87b5202ad4f8aec078825714d058b002d03ca3070c926a4468983001561eab027c4aa814e01b1ac0b71f726991aa88900237438b72a91e60955133dc85d9c313d693965d9dbaa82a89aa5574116881f39ff3300ed5ad020ebbaf7d2f2f16e4da2ccc6cdf8b817f1cbca0937dea65db31e1eb8f6e6fe6cb052bca41f05ace16ee8c0d73bd2b962a0d025cca5e8056f67ece8caa3c4eea2a018268fea6ee57a08a9b08eb00d3e702f268c88ebbdd86a54b44af5d84e99e2ce497dc7dc308246edb3a24cf041cd2df6586a7a3c1b16436d770480aa26d116216ae4783eca300cfe59069868728e5f2532e8d3357843d147fe071053b81ff0de8113d3629a5271a42d8d1e6e9699d63bb2f741588dfd4ff8a527200dd7c0f526487e25032927ad5250b5cb83cd953331a16df65b3d0a7e36be92f6e82902e48d2bfb7d3d9773b2e81062c5b05a4b51f88fbcceec230fae72be51f30d437bbac92a56603a2cd4c9dbe7e05138fed197a3787b43910a13c2522f24c655e3e282d8044ebcdca837a31587d6211635843e2c16fe8ddd7252a053deb08179838244bfd65b66f4d52b0fc76b1473e63981db565f6f1b66e691ac9c961198dc60ac8aff87fdd9e09272e3fdaa9083d283d064c56fa5fd6ac2b974f3fec0b55b9fb062c8390f09c191aee028eb12a8f5aeecf960049ebde925c106a402e7906912cf3d0cfaed000113f30366e9b51deaf2cb8c2756ad9faf0dfb1c41b9a07193e694ddda4ce5a00ec788e33a719fc139713b354854e80fe072e7931aa0a2c1895b2800b9482f531a765900526a1a4096fd108db120ef90364000147e1fd3315e7065200ce92e2243a7a066703360e1fd85c28c6e95c9fe5d09af3f79ab25ed7b84ea56be299958ebdbee7bb6a5d31c1223586d2c5067e5158c548c1573d0e491385f6c299c03708be0c6911c12e95e1abdb5cb93051dc540d22211d6277c8ea159d92b530789f085f1195e498b0e5e935460a4a381b53cb92501708727bd01bf019582b40594b331e81d7db69d4b82a2c189073ac0ab9870355c9eac3377e4a38eef91191aa46d916cc94e2136098241e41f9b6e2d5d673c2e2f7289997d7ab8622f88169be61b217ec4bb523701e89ebd694d678a7ed3b74192627cc7edb58bc58917f686735f1d68ac3cf98f96e34aacd245148811bc94f8cc1877254fd4af4a6ea9160cad317813a293785083554fa955f4211afa61a83d8c890e1da58ef7d2bb96c88c17b0547e9e2b7c3f87cf2bd527447f4576c9d86850f00d29644481f364122a229e038a971942f0337207415a4196fb6e801270b95d780d871d30074c88649bbc622ea7c91a11850df3dc9c6d0fad20496c64f6939f79a970c57e1a434406158efe14de393e398ad6af40a4055ca2fb85956038af8fdfa2bfbb4880ffce58310cea620682fd329722bd5f16409c6d31ee2a42a6bfd5689710adae0e708553f822d0214f154296f3fd7130f4285336a9adb352dc74c68fb5b42e8ebe4682dc04d6712319076c4d92e9fff5071251257489c14eec08dde43a978167ce96427b725bdd406a63e76e0168f207c5092cf4fd7a2732187d97e72141665d88439b0601eb50d346f5320577e924ddc76a1daa6fc5a7f4e0ba1f165e3f04317e711d642f0ce8924d2ab8d3a2b13f83c72997b16409e6f4f7f2285237e7dd27e0e0968e2a80cf3ba938fc2b2ddc92775f7a6e5eb463b21c15b47d0caa1708885c8cc18fb13a239f51e184f45e8fe497a78be67996d85a50b66df853db3050a4a5e5d303c06990b65da38943652bd0210f2a428824ff7627e84e480ec80056d51bc0999a45e6ce2b176bd14e1fae9e943730389e07ce4b6f0c92e34826c67fae0b94039d6c9e3250854eeb2848809e7ee21fab53c43eceb2b7ed8ca2e1073e6119f393faafac65843cb727d7ca4faa6b361828fcb64ea03982def74b9b12611a8fd6e322f8ec6a146abd330afe3f2cc9eb782bd889340f36002c83582a79d0f7a5607f415516624b1e7e665454c2e2025e9f792f4b2fc97d2a7495281dddfc381d8911498c212addec2d3e0371b3090b69bfac591f624b02a0d62bb30fb85af2087892824181e8375ce2d7a3096ceb43c3afa0715d35d9f9be028ca3fe4958c799dc4a3ce9c5908223e99e8106a279b7a08b15ff1bfc87173225547663fd69e6796c98f73bee20275f5e8b4c1c25bbb7a28e315199302b20910f7d5b322cb667fcf1529661f2f200d88bd1206c8fed8c89fc8981145b031a333782e56eabbf43d223eb01c24e15fdc2cdc906ed070335879235250b627af2ee1b1cbe33a186e64b80af76d057b19698b63133e638e157e6e0a902b822298b2e2b35a55d3a930027a87f76a912fbf11d6d615ba579edebec3244bcb9a84ceac30e00605745f41ac8b0a05b1bac1a81743e7257e7c4f7d768b069ad187053e8d963c3df7d67a8179f50ef50936233642f73d31293783ad12e608e39511f4070f0ad09a1faabbd15be47a6d71fd27dda86e0837ab71b3c038f2f8499680587100de14f2dafde2e140e7a0ebbeda1c0bb285e29f408db4b60ed315c1092c6c392c529d0f1050f9973171aa672170181502b84e2dd12a0abe24a4b6cb497555d64cbb518e3aada7a3ee48bddab163d62ee827e882050de7e5012805949ed8b9fa1e8c6b8e9b2aee0b6766fc73a6ae887e0d8f1031c19b1662e759e14499734054802178ce78476b96f7f81a9d32460bf866a828aa53c2d2b07c04b77d35205c86a0b813b7e500f161fde1fc82f5001e847e1863f23920af615f3d2c3e0223f4900c17f8b29fcb1c669918404e91ad5ce379f656d74947edaaffcaf6b446e3a492649549cbacd7b64f98b093d5e49c15358f46296fabc01e61d0a4e4d697c3607695153627660d4e029890dd90c0eedb891b7d749ac106330d9d558477198783aebbf4ce92be79fffb7f18ddd0a7acc2f6f54f4aafea235edee0eeff03eb009d84d5b95536c2810e55de8cfab5ae622a35d5e7f222f58220f423b4947bc9f4af219426f74d72f630471ce50db21656bde1bf654b876d5a4a3383f62a5db25817817383cc7482ab06544fb84bbc3d3385ecd3cc01bf59177c6bd8bd18ae1dbc89e454de24f3773340bf963778fe74ca912d85d2819f5363e70ac91ae7dd1c1e0ee80c4a11f114f362596440181b22d1ad528fc2a213a6bcae55cd0e5eb7843e62ca9c5d168daa99d8c2dd01e8d20a2f3e72abae4f07f55b46d8b713cf9ef6ae25f76ce51fe5cc5c56571ba1691919d77d9d643f0a8ce597d933d957cc0fd10c01909d477c241df4907f9f716cf58ed38c1eb81f58f2dc659fe9ac1182217b850bd648184c2ecf90d2dceacda97d9614316f36f644a56b79cb54d4427c88539510d7aabea2239164fdf3c7ed832d33065089048d83827111ba638f01fb2862db707c12b5c979019a2416a7f0bfcdc8316a402e4aa7ad45d49ffe99bf71d1782a85ea7404186b6eb4c3d32e7e70ef11ca4bd7c2a0a7222bed6308b295e7a380140d3d84f4dc2d6b4f35d8e7a3a25319bc2780d4249dace421c8b2ecb9764a489e9137f60a712aff26511987cf6c2f2e5608604900cf4c26e45e893e53fc12947177a1e13103b2db25874612e2b55930d8f2c36069384f95c12c269a199cabc4d9cca57ca3f50832f0e31f031fe12121af0fc6d155a07b953552cf21050b4ba69bc72c071953f79cd20b796fd5a08a2253dfdede77963d427663118c261c3b91649b1da635733bb7a2f5a15204cf22cea8ee6e10b8a807e5fefb43399f51925a2ae5673c55acde105cf59b05ce40751e8b9a84d981897884f591f50094ed4c2a0606cfac68220025673281161f7210dfe32fb459d6b508caf74fd03c18c6a30b9f3ab27d650e59f89316edfbb98e162b83c9a2cc39d70da1c4a348f6d17eb7378c27526727cd0c44a878085a85425c736bbe00cd8cefa674a980094df58c6d3cb436746f080f77f99b5cfde358641c16ae9264d15d8b5e2ebaa19e2ca88e69bdcc9d33e7e46d81320b73d5eea7aa0dae6684481cd36deaf2a1dbf88eb81dd8280513db3afa49d1a15a230a5a075aefb85038f543ec818ebe21dc5562510ce37a358cd2664e4a62b3259f239bfce12c846589f52029872fa2f683bc34ac2d6a39f371b783dec5ba6537ddefc29af71a90e02edfa076eabd120058df7fb85c887e71709496121ee42047cc074d66fcd0a17a8b8dc1605679cf0a4192e3ba91b13bb1026931fcc73d2ea9c1ac32a915290fb4327d51b236439414c7e9493914ff730ca6193e04cc69f08008db1ea1c56923a10ad53dd385f56402d2d4e553b0bf80e02a35175d2fc466f956f150faad20e9d2c67f7b08d4646ea575f24a9ce22f1a5b84773927ee3959bb25e0a2cb057df24981e769d854324e83217411d377265c77ebc585a4bd4c58b46f5ecd8fa25996af289324c91673f909b18d60c7b7011e2f176885997a64c4464c9c79115d05892309331b0d0a5df53c118437da10b66444193d4cec661c5955e18a4a0c7496bab480c1d4f2a6ca43bc99562eaabe0ddc245c21b8db991f3f45620ba2767298610393327db9ace0859d3caef86b74bf3057a2b5eb11e1a8522409c0726f6946c50666b4544b1894f054f683fd37e0faed659e57c344ac21b30d4550e6affe398d4b4d13b00414154987a6221a972a263583235d2186e02d9075e309bc332d0303be7f0910759440cfdd429aa1d4ab11bf09a167bfbb3183ee96e6b63c0e535b1076286459f240b7092f1317a56dc79690ac8a213d0057adf506176d9788b6514b91b6cb40640d4e44e1e651eddfcab98a1bf6e2dafd18ba7e9ef1727ae295a1a66be8ea0c90b5229bb938a5f538c04121969ee5458a01dc5ddb2546d3ab0aba3a05bbb2b232575043bd46dc79d938a3ef18738c24b0c21954ea194ba8ac77843f42854b50bc032e5a5665523ad3bd2a3dad1341f7b19c0a681cc8016869849418ec09e4bc8b8a4fd877feb97d0a2c1ca60b320ea5cc4020226806ec7df40a944521878380cd0e69e830030d7d8c74241e5035c85ffffb7b706908067979675001963d5b264a789406a2a28cba021106ebd658627610b0af90d74f1584cfd6990162d2aeab5063c790e0622201e72119a1ad2acf2bd799b2cb70b215f520cdda5603d0186d6e5a9b156ece7ad0ab3b057845e635ffbf487a242b0b4e822efe3bb5a76a7eacc3f0e91be7bfab1f35cbb18b7e02854ce630ef328eaf7e377661845d8e644a6870d866cbc8e19f0eda1544ca6eb541844a8d95762dc13f1156911ad3d8ebde19289175d4c06892d5ffbbc2557b7251fa0a13a00f4a8254d3a519e623878e6d55859fca18791c2d9d7179fd367e42f6b9b44a28ca6500043b9d27644fc3aaec0dab631ba79cb099a940b102aa9e4a4d0246e57f5baa4209b195332b09a460590de0c403580a0e993e2a517d5e1c4dda8ebde64ef3f2f7387308e8384b5695b968773982bfc84b86a74559c7884c8eb21c0222181cc486f860ad06c8f8a4ac01d78bf711000ec61d624807d7504ff215a87d26cecf41b279a0fbcb1299e3ff61530810a8094725a335925838a4898cafcb6b2760f82d669960fa07e9372fa014a61746a99246e5e4b21628ab5fa75fcf2b065ad97dc1f42b720fa09f12775d7523c1c47da87a805e33d02759086aabe51fb8f32855bfe8b80a6f6acc034a1d675e8a881cc0cb1563388d4260b8790c0021c79a7bb7d6c31e7de731c06c194cba436c7b81376fa38b6d4b208bf5ef0a9c6ace2949dea259bda1a8b0b714a25be116cf745e33a66f5dd2c5fbc49c491b525eab2008b278081155049c0d9ca9fa91214d20290c431948b5591c0ff4a99820cd05aad6b4143902d6d6abd201637142da25f48fa6aa050417484804c134954f0ae78cc0e910e0721d243452a18c0a3adef164f4df2bb643d16420a444f25485182f2117cb15736cd64772e46356acc8fbdb39c16e3e5f9a1bb613daa0549459fcd715256b52c0fb16ae01af3fde671f265ff906ec8f3231de1ba5c5b6970818c2fdff70e14328940288e9b56f0a04117802e060847e16c2cd059e0f74a8c3e8d33fce86c707d6a3df28bada07c19d294245dcbed9dbca4820f8e037405908fea72e9303dc79dd268db3ec5104d7c4661117887cd941567925cdef29b80f0a5783f461022ca83070b7cb80414e53368e66444ee824cbc0a33d2cadcac465c9f267e203cd72181a44f50414ef84f9727236aa39d53df63f1149b0bc8794ba1d004cd45b1a17ab3c4aba596c8ddf858368e85daf265b509b748e5c736318ca86b6c41f080b9ff99a15d780666c92b70f30e2af7cfbb396790d6313beba33da71788363722b4f3bb0d3f6ccd39a4c3516b0eb24ff89811f42050730a86a24a9991f69f62829add28efb52b371d26ace6336890792fea44a1257602c2aa9231e18b02b7099c236ff1ae59abe3b31484a2fda44b2e5fecab0152d5e944d9465195dc891a7158865155eceef3e3e833a7c09798637697d7d3e3e71d8d421c049d069a61ef711ecd8478f99bae469288383cca37786c19c33b601dc4bf394ce1cd06beaba786a83ddc0b8920b4ceb26ab57aeeaa20a50f28ec56dd8b7c4af43a7141ce63389f1410e7fdb6d28a633f3b2782c07ee718791c0c261a9aee9508dce314a04a41aece42d63a74bf719ad07663b3c1edabe533f4e570067a3f42f6675504902dc3e8a02c58f5c396c6b7c8d979d1170ea749979300b252718175952726ab538b8ccb8ebf39e4bdab73ab1695d22acbdb94dba0bdc84ae5d06c54d142d38ed63007aaa2f4c98373772dcb9c812492e052cb8f541ed1bda632d7d3385d145a10669500ef24ed8b90f3215f9670875e442b1789ad76cc239a4d60306821b706087f6403e78d942a6382e25d15332531941212c3dfa2d5561377054d97d41b98f13380620abb34bc08e47cd2f4529c95158e05054c7eb1effecb1e5b632f6461f5516c789bae59a35b01b261a2705f5737ac5e2dc6c59212fe813a44d828dfc7c124e4848789e4f022065b6640c6bfa9d4ff6e8084f4ce37f25cdad032db7c9b6cddfc73c18b4eaee1fd7285d6e4c399ff898c5273270017a00fa72f50ff2d4a2ae1888331a1ffd1211a1a984308eb2eb1e3f19215616330dff39af790f03124e15b2b4e8adfd314b88c5dceaba6cd902163eb08bcc60bd99b62de5bc1c5f1b342c1fc3548e9c3b037c0538378502767844ecd52c71c0e010d96ea460cc236df2a429f03dd887bc6b507af21a526dbb25611c8dd2dbf57a6d3f072ac34b25cdb904a913fa1a76f782bba8c291891d99ff1fad79510c0fa570ad5bb94257ff372b8b5d55dd36262463643157d299005076805ceeda5ab7fdebbc8b912aff0dae389a56b758c225b9a77611e9c11d86ba56855da77fc4c0f33856548749d95de5d70de39c9cc217c2df6b8fa0f4c68658d88e2b1a0d38867b23828d46811ad4086af19e4962f58b7483e9b389828d897abb9506d122b031e674c8cb997ccb9362d14516b60f89ec5a6122200a22124c6ecd66b811705d10edbd6398f0c7813a6b03eb7787a03015e5204306e124f4f85cbcd918cc59ac1f9db0f5a5d9741fd5ed6b73a4a047d011abad07ef23f174053616299646ff0d3fcce0f2054f45e9e8b765e8ec6c2a277e0445cae6c53b1920885292aa480b7bf54313b0e3a79355cff711681e338ae765f82f33cda9db4899f80fc0451241238954cb914ce32fe4c42dc37fbdff7e9cbc40346eea70650e75e61b6879fa1be6da8f0d7c4b4522b4e69a5c654479cd2f92de9f09a882ba3e87e18739c708d10a621669ec25041153b2d7777b1e69a0bdc12598e012027ce43e5aa0df1284c0125572e1489ed127170e89dc37266d4b9c8880a3c9817d94638fcd8105b68f4da336596b48e9dd537a6c0f5c9fb764807b50fe1ac8609ebc517bb7a723f7ee955cdb307b6805e4a22779dc12193dcda4bde457042d2f1a6ab34f618f61311c0e7987febd5a82590eafce8075b29a2e5e0e8d7e6f170e2319cf609c5102cd7678c57550c1085dddd33056d2d2220c53913745918cb945c985ac02f968d7c1df05b3dc9a4b7e37bdd33a9eab73709e36660a3697adacc37971c00572762a7d4e2790697d4e6b21bfa8c9329096a82acef4e0b5596b8857912c83bd8b43d91566ea5df0655498d19b5ca2a7e6392faed919948225eee2883d19d96b2910d459929814575d6f3df32e22d64b178000401866f64966597e71d59dba0c147e58a0986a7e0f6b7fee341763587a096e93ba124f923d472eb1a013db0fde3a8db91481b6179acd0e2c010f0082667c1475e5f6502b044356e465d9833241c5931f6edf80eed5660df8688843678c96627bc954798424693d9b17710ceae21e1828e17e41f081cf081704bae7b394df05b3ad23c3de88c0bdbc9dacea3d9843c223cb41dad04fffb1e2f770350c4485c11e026046351815d895093c5ccfb77bda4bda256546d199116fea330bd269c131e402155a53a0d1139f569c6525cd5d5aed5269f003150af8ac3f975cffbb85a10b8123989f6dcd948631cc7f6faeeb55f3812d73088103fd709cae761b685ed0aa7b802c8c0833d222b60bc269128045453053e2c966b76c6d88e6323736eedac8a81ce390a4778d9ee3b9e9b3d6968e889a6e00ac065539bf49b952356a491654e7b03555b76e848cfa2d7a0ac257131232a9e49930f312ae0217d242865506948eb7706da35700a29b82137e30fca6442fe3ae36bc87bace1abb2888848f0acfa77e2d6ca050f7e35859ebfb2567c1721778409540d0a72121cbbdd2e13bdd62347decd0a67e892cdb319c18930a35cc69982476067e973efe088a9d8d527378fb79fd0393d4125201bbda51a5f29f223c2baffb200ee04fec291877fcbee3ab64aaaaa0139d427b7c1083ffd4217a286b5276a0918ca5c13dea48750c6859a3ea4bdd43eb3aafe06bdee4e8a41e418177e05e2d9658c1f84ceba446d350d0baf8ac9b137de56d59280b8b5d8b583a8a903c1fe1ec9898167066d1f0f1192f8eab80a242304de5cc8b2bb4036923720a03552beb7a329c1e45c2b1e2de2fc7b6ae9b76cbf1a8d2bdd1328f12f1590c12fb802ffc74b7fb78940c578a6c385d8391b128bc8ebfc737dd208120ffd7a0143020318ee077db993a91ccc110fd9c358171bee3e0a66adc3e1846e50efaa9e5b37b2dbc560a0a5c1991d32ddf30533c8ce2ad0695c52877676d461c4cbaa240283c6874cbf26f482707fb33876d1f0bf6f8b4a26faee05d9f2476e7b78b58f45be58da155b63973f30a274c0bab4ba472b16cf3e1f852fc23fca43a6d6c8aac03d216bbcebe958143859b2b51186b48ac5d5631a2a3293dfb09a460ac6bc5b47fed8f533e37645437ba43c67dc83d5c92624f7485192e8b990b63cadd44801daa2b2e21ad0f4b5ecac99a41b550efdb378a06376ee700053f56d52acd0fe59ce939c65de361926f784e91f884a6cea3ccd6ccf69b81d304f0e0b1c505473149fd5ecc15889eb3aec6de7007d65e754e998e57a0a62fbd6546be0002b27da34fc6f7daa492462e16500afed9f2a12869db79ee1d761de2782274d86f44bea68922a0156871728b9a668c7c88e68867a6698d39dde20b3fc2d3803da88a71d4d7406a1de55af489edc415a10698bcbdd7f261ec7cb08acc871368e6c3622c8d601777ee0c49567188dd1edd729b4909a4d079a51350825aece910c31f613dc95dbb93e228495970349c41f2eb00591e1b9c3c2bfd584d396629617059650430e5093536f37df507caf15f9defe16109e072ba946d29a506ebb2ac804d6bdb098b4bf688d805f651cb08f277dbc665bdc61cfbfb1e7a931d8987158d1d7e0faff8f042f07fcdfc1e46c84d1310f621b9f08f2d3b0d8f693eba74ab5d44647c4a33e0437013eca351e4a5b8779ee043e7c9116732e64a63c926e4dc6771eff0686e4305982cd844c321a134a7644187e6a1c20ce3244d93a5cbc13d6477b334167fc8266c12088143548344bde649801f2388e4140a034e6a98d1e65dd3b3c282baad4340428f8993c03e6208d53f6b4d4f0c5531816035fe9d08fe87f14c249bd925ed319b2f44dd44329d2be1594e0f7bb754c12ca32207ebe7c96ede26252c97c3a16f5ab6f254f777289967d4fcc0a24e9121fb3801a833408a075c536f47a351ffa3fa0948aa7f8286eaba94f929b27dc0e69449d1ac4856b83b99233129f59c40ba46661071e0e5140f2406d4961f15a4dfe1d2a00d72d8a7e1715b5589a25a5888464309ef9b20203733047dbd4878c2731b41acddefcbf54a48d92d9802ac8411fe38ab182b9adcc66652af070e8b4757be924f4397ede98b351808d9f944caaf173aa3dbecd8542472545a51955cee85e2b52c636888e5c91cde4d745209b535f46c33e9ef58da83600c7692f37788bf8feec15e335cd49fb26e39d4a33f27655825eae9050697b3964587e43a98c0322963a9356271c34fb49287b4cb4819ce88452640147899952b987af87d8c26889f0526a005d68e246bb8a947fe50bee50d8c1b874c57950646536d46008c9085fb42b917f56822918c013389ee04667e8213e5879512277d514fccca4841ed50e4f5fb90f1f0718a53037d3e24ea64d3be4a06937925d369dffb8f0b983542bcf30bbd10f240849bd151adec91d50c843adf06cdaf170ad19b0f87c12b940bb31a853af747460d32d080966f931ee7865a12530bac192b744dfcdb45387face22e97eba047174fa1b25b40d197f8402c1699f119f8e56e05b67f065225429f27495ed7081d9b7dac90434aa3f79543387f805ec712724845ab38f4158c0fc06d5e5f7b3420140079659c80331135208c2ad2a05da95310b2eb05e5d14619e5f54063bc50e2c33b1ca89f1edd1cfcdc88ec2eb737bfc88206ec6090b541b821a04808c4ac229c46c66776b8109cfcb727252b728e7fecfc931f5a07b740ef145536ee9b1b9e52ec26a154a8b1bda28551ec7b734fded02949b528f16e44fdbbf2c314c21169894ddb5903bd08b7a902e2727dd8fa1add7a4cbe8e46e1b82d045d18f731d7c1fa33e2c2f8fb8d064b9f3038592898ead3b39aefe309b1df66a1995a510943e6b8bf1f0c8546be6d3478e09a6068de15b735a14bde3686c444b023f6c8cac50842b8d7629b15214b454824d5e4e67ec62d398c205733444bbee93219dfb9ead451a23e1e3f208c60210659f793e078cb35ae914bdc33229796c0b29442f64c71ae51002111f7066ab1f34c20d2667c3da3768721840677fc8de4c88ba33849234aee5a7a6864afef93486eaa9a837433739ff68439cf85905df6fc382b00f04e4e7e5e334944237306a10ee3f291cc5932ee3c55c1d1806ad8ae6e0a70f6805b067ff84ddb4503aa69896feedad9e748b228a1ecdcd67ca2a848be09b05e26e174e196116c3073d129ca23ff4846411b5cff2db72701448ade4f3a46f8f0e6263b7274bf7e0904fa0de783e01e1d3c8d7a853d044dbead369e71783a2c74829fab08511fdd37eba44927bd2a05a7d09a3a4b48ae309245148667e44ce53bd39717eea4357f4e3b1a696e8fc07c6aad140b6909cd8cb3b58e059c946d7792312e4c65ccfbbb5bbe3e8232c7e25db288a5160105f8e6bac1017c38ef5c0509a1395203d1b34a8378ca1842b3874ae429bf9c348947850be0875c0a0c48a4a6232cc6f7515af875b36fc6ae70f9686fb2b2a747429a02cff7e8485f5fdd1752ca8713bf5f27ed87e09ce39e106aecb677deaa93095e5e8feeb34d29a6106a31f61c39e607253fef623d296df02ba84db21c2c7893dc86d51097f9f710da2caf09850a462783d6a520e5479ae7cea019dc9d6141a84b8be0e5808690c06932eb3880f4ed9c3dcfea1a390a2b4dd3f8bfbc9a862f6c2ad5a1b4b78630c974093f4224325b7d7db8af312e462b9d119358db1a71e177b9deeff30d944635c14d679f5a8ffb0e0c7d35057a6314e41fb18033c4d92f59d4f5c6016b5ae9c7ba5b3e19ac1c93488d4d661a184de04afb66d0d1e301333b69f4fe30e5d665ecdbe026142becb6560cf5ee4d022cecbbe142ba19deb335d68f0e4f08b3c89ef927853a0d8cb46261cd36c7340886295a9aa2fe18f1abf51732f4b84fc1a3e5c8f470fd31978cb40003dd157cd035e44869a2d1a7ee6a8a004c7ba98715e7d6ac1a239cd301a6eebb793b493f5f22f185448156df03cd731d120003c2da96d12d30630f27fd8c8a826bc50665b2bed5ba7ee24119c0d64c87cb35d03efe00cd720a43e0621701661a47c479f6d3a4828717f0431241a059bb1ffe4789a65417fcf851469c1b34c08bb631e493fd1550c43e51fda2daa7303f6202f5738f9a611387bf679a97c0a0f1b1cb2923e2cae24e38e0765caca3f90ab25a9295445dc0691baf7ad01d5053b6a5cb8710ccd1a5908abf815869d854a6999f43122d01944440da0b815ad79605cc0c8a5cef7ff8e1de6d75cf189954177d183cfb519fed866e5e23b9e41d1e8beee22e62f003dc30cb4532388416330218df5554b8a3007fe63a5b479b99ef7e11c0956ecbb4c9aeba84c5aad9293692c5cf5e034fd3bdecf59f00522f3ab94126094d3947101a75612261dcc2a20920cb83e061158414bd48cca9b8fec7bf048da0012d7d013587790800c5461873c84d14d0650600502c2654daf6dc658c8ab3603a26ef1f637f147b7242f0889f36090dce1e31de00d9a575db931b414929b02f4cd55a3dc319d3facf2a36b556dc12c4fb1eef397d7f3da0d5a786250874748d989a1a4effe90a6ccaaca0ca0da58c6d50be76bea7fe4c019d5c92958f616cb7cff2e98bba020b8864df7474b4341986c1246385a33b093b8db694f36bed521d8ed881ccf679c89cdfcbc62c4ff9f26637aef158bddd98568b3db49289ace8b692a9515c75fe69c11f9c85968de5858096db3295d84056c61faaa0eff4918e77d72ab575f084d980e0cbd9d73882de7101a83b70ac6a7ac17d40bb45c1d246a6cdc718a4e8366abfb34858f7c190be6edb50b4f451105489aec0859a13db974eeca8d6fb9f48411d9d941d2dab2ff644db805e3b299aa1f25966fb9ce7a5412ae60654998895e3d25c9a0d9178bf4b3f985090e51489b54fe6b830dedffb8bf474fa7af810f43ab777947b083e8cfbb125cc18db3165a2ab1c7dff4f5a81d819bad0f0f84b2bf537be96c23e20c955e69eaebe418afe97f28bd780fc5608fcb54fb68a1c87127cca515c564502923967df1e324ac117f7009cd81fca76e81c299fe28392496be8fe7155a003981828a7d245c1ab07deda6b895201f93ebac0f045f35d506f84b6a2ebb755c89b4920c2120e439541d3d2cf756d64df52008c4f4f2565011e3a3f8b19c9dd64391285809e5eed3fd6009c8a2055c457346278a957d6d4ec300fd829fd1747ba3c407774712c4e4edb134e709b93f27ef6f97f5c5a09ea6fa189d8b7768202c41e7534496610955d7129c9967e5b190c190316c248657b21ad7693afeee6105d59580c41499e850bf02a0ee5c6a79f4034650ba55760e9ed74a9136ad053b95fa297d88cb031bae388666f6f397eea552363766b062390242c333c9633af334fcd2b8f50d49ef0872b23532d87208ddca563010fff35f8d6e0462a6900af8bd7ca21a48e114e131e881c6849a430c6c1412f0f458c071958bb40886ad42e990dc8019b456413f7e3ccad1d319c7525609024c4a2780e81a0d30233c0dfa80f847c1ca16365bf681ff0b4de90dc265fb05af55d04dd835de9a981eab19c4b712cb83868ce528309fedd45aa762eceeeca6690c8e2e7018e8e9127375b0f6a34fb902029f5308b8b918be5b09bb2ebb8098730a9ca7201111e609060f190434e4a8b54d58555f2e0ac54107c5d0649142164a5dfde835e33c6b5322e07085b1c9ad7782212c6184935b2499b207cd5d18f83070161d08a00949246b89b8f1877740078059807493ec9f4d9aacd42d3c9390ec9c66c3c845f7a29d2dab398986180c9fe2807b4ff8044fe5f81804db98c1b1ce71c91af88e4dfc7e1fa011a1b43f63bfeddc86859de3562184cda818a5d2d271cb44764b6fe8ae5d8c2905f476553b757418a206543264b8f5c049a9b08901ad8588d2608ea7fe82bf5426cc39bd92705a7b56d2573027e6a32edf73f80270d6547a22d50a146473112fd5a42388d5faea57efcb14adee80df2976bde608b7304acb646acf1a91340d67611071af7c2d911d5eda5265d9072447c6422a71e0066546c457370971e6fe6000c2bc1fe50762019386323f443fcf0801bfaae46b8086741029fe7c34c1aa6d418ec03f6ea1ed9236449477ca5ecc22dfc17c3ec81541ced459c820ee3c00a292d865c6fa109497617e22b88fd08ee453655be1972f3d8eec6b161cfe04b09e3f049f6b57233a3eba1e3e9e59ff1848eae60070c0a3f3ea1da47ddb54206756842eddd2865c9e16a7f78a372c259bed7148c4b62a2b49ea0a67c97f020c34311f18830ebf72f0a881ddc28679c11bd4530fd11e043a0e38e4b102cebad729d4b11b83bc22773264a65e0bc900d40ab450a0f380a40308dc26b582f86032ba0d70afd6544a3af33597ae9a881fb2f906bb0c415156af92c4449d8701ab8547a65a1dfbd7e21530c9e31cf8f311baf90bf8f3b1cc7b99391da0652d09ccc7607bfd03d69eebbfe0eb1d59223192ba5d93634c40227d9aedc2bdfc59c1aa6422923d8427aa2e9003d21ccc7cfa4a9f1079cb66ac1c47ad2106bcfa8fbaa64b05fca4d5412d2bbd5535d68c29995d5b2da82ef2ef30948c9fb96b2fe338da6de036132169a8d436e3056c5a586f5d43cc20b6d56fa2ce779fab85f49bf0ac5fc41c812f806e44424e4c6de8deb56f8f192ca4c85d6fd237e22bec5e5c5352e30723eb527fddaa5066330736e76106b06897fbe6d0abe002638fe88a0d269b6f6a9bcc1627a2c34e09af9280f50a6be0f48721127bc58f7ee7cc718e8854134842778bad28c7aa4ca27f82ccb892cb279747b6d4fb3c9a3bb22119f30524cb0f06a4432def94089bad4d6fcaa5a1584a7e07eae806d58184919480958c36b48dd1c6a59a6e74846929701d6d92a1b1256935b92655594f33050e9599bfa6c93c82df2ed19629fd9999686bbb11b38b5e4bb6bfc91059ee6478676b6c01ba4604e9a036a12db28ea720b0132a8e73210e9257fc5ec46abec7358b2b193edc074cedf9bb8c37f3d1ff1e2b49a2df023b37e66e2b4df7fa36ed20f95ca0b6527f834a392be147091089cc930257e3f578d320c746e1eed3043dbc11c5a0a4606a48ae909cb3096a47ab3d504495ef86f8da75c96ec1088361ec9bff47386119aa787e391bfafdd3b92fab548cd478b475a0956f2cbe06a451709be3b979bf1fb467430b4caa87b57a23361cf904ade6e75b6ad05847a28ef4c7db0622dc8a0648f2ca30174ef5dc999b5df84eee49986383307a9304608a577255d44b34a8e766a91e56b4c14850ecad18ff62c1e69b8027f4e257f058561b9484a97f9f356ef4a0a2dd61378d740394e0d1a04ba6205eb7607dc1aebb1d14fd51c85fb98d6bb13850ba90ef30d45ad677b54b12aee5d491f6f2e5d11263c462ca78167897e25ba1d8a431f6bddf06c90184467942f182122d4bfb2c4b12fbcebceddc5bc44ef58848e8f284e39b7e3919570d65fe37829c8f4e891d1a8fdb80b09fa30a4132ea368f47e7c405acf194ded2794f7cf0464dabe52e378c4590a4b0592f1a8bb23e0128ac83bac58bfd2b9f45575852886d98b40f119cb51d242c7e152914373044386b8672089519e1317eab323bb728fabb4b5dc3bc90a0203ae50c55dd8095d805da8faf39512117201a9caa59f8f9c086b4ce9cad32c86bb35a48c1a117ecc8643bf18e9c8d8800070e6803307216e236a38acabc7fee23778d282047f529aa627684d2a722ac9f058b67dd4cfc4c84b214d6a1aa567a92591c111addb328a0ae10440a007fabec1c0a109da3d33082fe652bcfd01059868ec525967421a59ecc4cb8a4ee48b9addc6716c6379df10ff959180e48d1433166594d902bfca7dd414957d2911258982f10b6ed8f124f5984603b0af28f4b45dc49ba7258f2c6579c3f798c8a1af4e596b108c12706ebdc6146e64a4cf34857806221b3befc6975bd5d0bae8a09b60f7daf872ab1a5b151c7413ae5e1bdfaed5433f0f0f217f941fe41f7d59fab801315876ea62f7645d6551402b88681143bfe291a4c28c15988d5dcc03744550691e214467ec1d991b5524e4ed92bea7815d6211c35fe8f59dcc2a9ce7e0b2cbaae8eb6b501453c55518466b3f83f2a580df96db0186d012be7375fa9e10d058725944ff8447322969801ad5f8735704a45dad814d9dc15f29a284e60c2ccdd9e2999dff185084c7ede1387f35d79c7d7ca543c070ce86b2437cd4ae4f1dc7141d5508d885139566f4bbf6e99cfd56e74c8c3245567cb1fb336d79fa12120d2324a64b1d02b51b4cb288008ce783431b4bbd04132fa11b8710792b9c7703932b1dd21a63200c257f3293bf529ea4f238bae92e43647ac2cc0f6378af000bfa6144595d8b31a982e7754fafc3fbb62a08e8cb0a3eb4a1521543b1a2679d641ae18ab634f3d2864e990c1ae3f7e3f84f58620c9e4bede97c09d716c4ce6e618520b78e68f113e13c240a4c63a60932b69923c82c0e02679a1320a0e69e229d85e6da789911b33bc55f0ff44fa93ef049919b5ca15e488fd4b2458efadffbb2b025376a692527443de7752ec2e05b382a423ea113220972d9e463b8454d08831f2644143805722f3ec6ec08d3e2a392f9940ceee146443e5d9e591d68baed8642bfabfc21d094a984c43e78d77216e94c9916f752bcc180b6e31496191b1fa79b32d8fcecf2a53e81bf45be0716b042efdd7970055f02f96e4584e05c951256526e3a2ebd0d1c9c2406b81938db29a9a37a01844c6a303007acf9601ea6d2cd02b0123e74c243a6f2f397c5e28113e52e19619e1c5f7c731d00bf0b48685648e1addfea21f58c6b84ab5314c3b8f394f8878dfad0403f3a1799e73513a046895a41003cde378433098fd69a192deaa954750ff761708a5fb13cb3fb26cdd210987ae3d63c14bac5395a3f6c62e64ea4941344be97a01fbb39082f3ebc0c43dd946610b3a30dfe2286a157d9fcba11cb9b875930e8e33d709b776ff83f6a720e453e84188c9f6d8e07f7a5889024d10eea42572271628915c317f75ec94e109d7c6730c4afda43fc7982986161184c821ce8b512d5cf0ab3dc84b3e1ac8751647ceb0ea1b7596b2d538db814b79f391d174a812b42a1e101110a1df0ea4cf4aefeff7fe688c1f6c8ab3cadcda39ac978bd83f0ae4a48c45dd2c0f663ffa3f3a7c657d05069313030e5848cbdd2aba291cc439a1ec9e296dc73383611a6b301ad11b0417e47341f112210787c5eef4287c6a94522b9ff0a4a92a02dcba92436f4dc922e26597a2c4176f8da8879e07c0e7878a3214be46352a602dadf348b35005f2e4856e63b65ee6fa5b2fac006ae6da63135b0ab1e15e092c1e5771eeab6d90f3bbe19ecb1a7f3b22c69ac98f37cbe4c770f8d3fe136ca10ea1e6c7e63c0f50191705a0db7a7b69bb17b6c608abb04abbd02854cc4bf14c79937961846c1a15ba40cccb8a78d927e7435f2fa1179ffbe94c5a47a6701f7f45f8a5588ace7f26a0087e5986ea4bf56590721b8a86c5bd2fc4bfbdf888b18be5a8e05faa2349c060399028361e16f449ebe0ca2973fe1086f589543ecaca5077a6a2f76ff376de313054ae4010ecfa144521f4b182fd3daa06a0123a0f260719570953e0bd907f99a75eb365e39dc5cba344480c59212f7fe37b62c68ef851d16ad9c8d5c1dcfdd6c5a66f574694a2184ee5e24db0124a092a8f5eda2b76a34031ee92e6e4c3f3d95ae445184d121e28d4d4b7e0301d2080acbc98fbeda096ae47722e9116c085084365f15ed485a82d4c9ee1a8a7ca907ad5d79b7f3c8b172ab25840fbb8123e062715f740b1a6818b10d2fb596343d499d6e853ec95de99e326a28ac498d66f37ddb6263e06af26b0ccb2c7396ecedeaf92ec0b45785dd5abbc22d06a9b8b542a621cd39cbf051d8e61508512e36224fd28a2526aacae17089e34a494e63b03e11efe834591d4831ad5ae06e1c289a859285504010d28f36cc0513c0c4d8e4760229c83b102b3e4c6781a64c16507d00c990d50cd88f5aec4bdec65894f532cc4f63874207565abf80cfdb6a6c182e83f4d3c346136e590d8636915696df10c9275ea8a906a6acdc46512f6b37e9a80876137328053c60040a6413a859405c15a703d95f75de944c458afea095c2f756df0589a699bb8ece3f4d6a15cdb243136e877167b7a7eea8970ed2ce388d3b6e1724781078e97a2549158fc4d499326d4f7dbd9578e05fb7f8848484b4bde5de724b29539232590a9a0a2b0af0146404c5b68a625b615eab5bf7c75e6a05792b504f976691fb550cd40c61354c8aac6918e88f550cc019100ac7a2c0784c40bd0de3c9f1547b7b7b3d5a6943f02edccf91c8591bc6fe8ccf4d15087fb07c10f6b7b8e6886597b8e6520c007aee7b003de70571040ffedc07211fd403f71f2f087fcedbec8d19a6af998aa0717a3c30576de901eb6f9de52c6e064208619218638c7dd3373ed3dd3beef02737e3927233939b812f8c9b01c913dcafc22360d8cd4e8e37e13a8e045742869e04bbc930ff8a0939c247d5feeb927c234f926da15c92217683c9263c89d7d630447dae3393789e18c2930dd0fe863d23aca7650cf7106295e557dc43086d7e9d116237feedf990d4bbc9d3b3b65f90efdf461a06624464ac95a57dcff1d4f6f2a1f53e7722cbff36cfa1547bff20aaa8792906e8770fc811da03f16f0fba297a5fe561ebdfbc20aae87d99b55eb4b9f63fcfb9167ff16774d1a918a5137339152c6cf948220cf3975a5f8e68fef37f74a6129b1886796e6df50a40dfda0dbe18a911c3b0583d8ddb61e3671ccd07c68a613cf9a5bee3f9f4932f46b097238fc9f7d08ef821efebecd6be6c98fbd6a31f1ff352e4cfafd1fb747ce476601f6b7d717d2fae5c451f3d1e5554b5c7dcfb22adb54ed1746e4693527a91fb8bb70761f99fcf4bab4b31ab8fc5ffe2d7149e9257eef7d7be391aec79c8c8c349e961567b6d4e0cc3b069b71724228d2f7a4feda9d5736ceb895ac89f14e2b4398e932befa9b104b7fe17df278d2fad1724a4935c3108e6a21b0b5b3ecbca1d639ca1adeb1edbe57c3b31ac555ed912b3815153b2abefc91dbf2d9be07e984d4e92444727f2f0e488326f6efdecb51d28342de4d678724bee1b5b224befc3886822f773d83176933b48d6b4af1f4485512fc500d9d7e721fbea0139823e90fa9907dd84518f070e48f69c174485799ffffc89822ba3cd958f613fed6f8e5d74328661deac674d37a622b4a9f990360d03b31c4b236c979f4f0239da48e516067903aad5fb2212a09fa09b4dd1cde8875a4a3f96c22cc2d98d35fb78d98bbe7ec42fa07f311269dc07fde82edf17245e5a2f488040922589481b2e5cd8a5faf23f39a790e37357c8f1b71d38436647428eafb913727c7b05cf7e050883041e1d9d1d287c07cea0a1772d384fc883714121106804fd1cdef0d7654df33e4742febadb257f39f2e27a41a26e2fad17232fad17245e5c2f3ad9beb45e907871d58d0bf7c5256fb4480c7108b5884321ca650ffa60494321dcaf459cb30ab77753115ffcb6bfafe14f729ce8e357d0e743a1b7d954446887cd216fbe4c6321ec3afe4497dc77b67025e8234770b9ff2e351971e131b58a8836505311a6569b92646bba6918686af916aea9e5ce639dba402f2fc3add2a180a2e7488f63f9d27a4182f3be20997b6982fbd9b9cd6d6e1bd683f57c1eeb6918f95bcf0705142fae1e9a3d26318a7d8639c630ec1d630f39ce4abb92350de37fb73641ac07eb71325cf8ef189318deac94b54aeaaf3946a5631986d5315ceded7f16a72777ce096efcb7383e2466b1866df5fafeb9f050ff4aabc45c52ff2a31cc3d9bd3a5b63a5deab7389689287ce7facbb738104250755011f98204ec80a9652a424a29a5945dc3c48dce9e3d16b67cefcafe16c33e2be2e65c95ced521e970545a1d8c4a77bfee23d35dcd60765d291b9fc7a570e3c79c4ba4617ac5a43d60c1dc6a69aee86f691375a1b834a7e966d2169e8be0b6fc0acbd3f22b3ad7e81ee98edc24bc2e893ef9d1c3eb2af98e48b56918faa6ff462dd3aff81699ee7e5132e1d2f7d3928cd5a6b22a912e79abb2bca6d454d6fc86a2535055afcbc4e4240748565151b1a30d6e9548b54979c8bdb03a362281fe5439324b2edfdf939ade05bf1831b5cbb7e0b13ad94d70bfd67bbf2e7fbecf9f226eff4684c856c4ab45bae40e869be253be59f7ba64dc65ce36bd4c4f979fa6d297be65dfb086d4d4589e179e7da2b21a36cac3d0a7e84c208f46a38f4a0b04413631c5c6ea92c93459fcc94897dce5a1ef8a7e64ba81d2d4aaac5a9dc825dd6834525979aa86774f92636af5fc16ecd29367e96bc0d04d25ef73e1c9d3fbfa4e1717d38dd70de9582eb8abc124ef82e07e957547f75e5311a6222acbe6ba988858f12d1b4b8ae00671040f2d7ffa20563c8b0fa2e54f1f7fd46a98f9d9a370537ce848c3f4bb3cfd9191916b6e44b6225df26771290658f12cde8715cfc273791f5afee4954a3fe79770b4b9f3bf8d05c475b3cbd3170fb9363dc54172bf30bd8bc9d4fdc66a98fe16ac82c44dfe2b547c447a956fc12a7adce44c5069853696088a4642bae435a3153cf9c975c12e95be05fe82e41628b8c938c31e9c200dd9b60af72a2d17ffd2faede5bd1757975cfc0bcf68246a3c6a95e6f774bf8bf7b50b6e979ff3a5e5e2e2e23d11dfea92ffdf74c95fa51539703fcbe35239d221699894f930fb77ae86c1b6c5f70b122d5ea6fb4b3c2e2e5e2cc17571c15fcff9e24df3c588e945e965bc057e296117f7baa0ff4ae9e6952eafacbcc9df1a4f7525efabd7c5fb2ef5de5939e6cee5fea3963fcb7fcfc232ea3ed4b9fc7ff4ffff7d8a57d184ad0744b1e93bb475d352bf89366833f5cbf4dd5c70e927ee875c0befe274c92f127c8f5c17145aa4df589e5af13eb29fe2ad6873c1b4e482e95b936dce7629451795bc0e49e73a82d3302dbc2fc8889be9ef5c9ebaae2ba4a66c110957e548c3a874c95b2a46545c3ee728859b69af93c2fd6aaddb168bb8d9cb38966af9148b5f2159e0daa6688a7f7b05be6d8a6f49b24e4ce3eca723246d9ff9f8a54d845e269360ec43be0afcade04f057f29f8ab28acda6dacec4fc25f3dc12e57f61fb97c48d1a8f5d5dbb93e67227fa356f6ff7c2a2d993f9556f6dfe85bac7dc5b24bedd52d63427890973244b0b0e55b716386eb3f64d94fcfbc3d73777729a5e466b29ff35d66946e385b9288c333b51ac527de6cf126de4c5757d3259b674d4d4d4d4d96a74bd6fb51c890dbf2fade57af0aefbb2aab96555979ca73da847d921a9d8c61b2310ec33ec35b3637fc99e1f68862c83fe6c73c3d084f10093cd9c722d95ce55c9ae1c9cd0cabd96bd89c9986b19745649c359ed2a99935f2bfae46cb3c1cb38c226b197a0a74b355cd158a86d92e031af0c3cdda7f2a366cf1d625ed2bae17cf6c663feb5bfcb9f4e4ea6954a3ad4b3523d73e2d9227119bdcd375a0ab7193efb81632ec3aa0b2825d9a2aabc9d16cb9835d0df7107e3e19f74d27b23793e4a9051cb57b626252d353c449cfe8082fefb3f2c423d820cb9f2e386700530bd0992e968a9caea66b354cccdd125d12dd91ce48964f4457d311e96aba1a153937a7560c88cd175570e767f807dfc9d3c6f6325c27434f285bdd26da743dd8a66f934f64294739dd39d1890cd72e75b7ee88c8c866c4f29edb37f3be918d9430d7a8ac2637a3a2b2ea27ae1363f854e44c1749c74da49d2c472c31dc4f65b55211328f4cebd1d0cd54e46415db3c0c57458ea74a3c25fa9e4fd9c9f2432356bd1f628d6cb24371455ff2df8895fdf7231b4f8146372356922c9f00dd27b2bff85e5cdbd40fc236ca9e9e61955a0dc6ed73714d4a929c691e0fa00702dd84cd1b736d9849aded886c5db2598c8d61110cf7696cee6a462cffc2fd7ef01efae27a39f262e4a5f52f48b88b91c5637f16288fdf3ffa47cb6d3172332aef02e5e5bf4098f8928968837cfc5f777349cd2539bff24cc81f3df6beee539c0996a7a6eb7a3ffae9f214f6f2234fa481f2f23defebb0c7f2ef61d0c4f2113b2cb13cc52c9f825958581e637d2952be05c23c84598111a630969be4c72fe1661ecf15dc956719adc495954f618d56a2fc08dc956701ad3ccbcfa868f1f33bfc751fdfa2a07c6c81bf9859de865ab468f12e272d5a682d5c44282817c5fb587eae08adac803e2b5e8a0e2cbfe257b0d4252a4e65c2e43116119b88fdd525f92ef25b60c7e9520b1cf30a66c152b455fcdf06f17b1fdf9270c4339e8a097a9986388ff232e5a58a978fddacf816718b871c4d8b156f577ca3a4f85c811fb7f04a36d829fa2b9e85e555fc8ab71d37b3c283715956b0b0ac7c5c69c198c5b787bf072863fcff1f6e873f0b0f88985bbc2ffe7c8edb81f2d8032266cffbe2a7bc8cc79597e9152b1e8ff9a0e791f23f6246c976b4c1f81e7624187b1227383e8e3d3846d12b15b885f40aee2111b8299f2224fa6fbab82b1f05631e8027f99e839be27992ff309637d1a58bb13c557293fc9ae27df5a278df4de179ce87b12c46021bc96a18220d13e10c1dfc63ee8088b97b19efe009e6c1582c1f5888c747e70f63fd88d9cb8ff755cefbcdb331f36ad7611ef52a4f862b82b0082183b49378808422f395dbc65b48fce53a75e7f2f8af4a3531ce6a17927e354e4e929e550dab6d6e747660f4e4d27717067c9562fe7ec5543a54355552e5aa564555554534dccf6dd010d3e2892d242b9cbbc1f7fe1cc1e495e589a6659907e9cf1f9da3f6f3adc7633ea7511de6732fd3f987a43166dcc7a7cf658f45cda5276b5eb46fbd2f669ae6998ab89f3d6c1818352dd3b09b2c9f7e564d4468de8fd75ea64d45441af56d7326cf8d38cb715efdf11fc76193d157cff2981f4d45441bac97529f7ea669dac7ecadf53253eb33b572f6f7468f477cee2bb7839e6434cb4ea83dc9b28c9ed039e79cd58b3f413fc29f2fc1f46fe81b8bde72dbfc7ecc2ccbe267dacff8d176b2fc3eae2c35cd93f966affda779f17a3cb2afaffdf7438c9aa63de77d3167df0fd15404f7f3294ea827cb371571b1175d0fa31a0ee8632ae2310ec79c6519979365d90f33276adc94d293780e66f2aaf34488643507602afe471fc37a3694b2dbff65ba9b093c3a192ad105223a192ac1b3cabea2abec17c8f1610ff5b1df01cbbe07edb3df217bc8cdf8e8d1c37cfa3dd8a7bf03fded372f08fb74e39e72de0ed4b3b167b5451eebc51c376541689f65dbdbcd63591bcd85246b695e4a0f5810f5312fc51ffb202aa84ad94105b91e07802acddb21f378a89fb20390202a215490e321c5bd1dda0720d57bb90947e24c1c5513a7f48093d2c30ed59138d366deb0f26c4d9b1c753c353f4615866592941e6610520555333bf06403489d0c84fe4a5351af02f4658ea7e8c7df8994fe9c2e8913b91ee6530f46cc71130e92aa33a3044368bd56f1155f1f20246108ac557cbd5e94308628b8562a67e1d8e4dce418df599e9238bef2942867044fac54f1bdc653501563acc9d17172763ec8933f5f75d2fb4ade2ac757e4683cb707e1494225b6004576f956e24fe26cb187e78e9f5f9ef2959b5e95461164f052e9248939387495e10a21b220b23f15b0b0e58b2f24aed68decd9d1c933e7d52f895cf8d04d1da598ff473de82fa9044b29a510a65fab554b399b67b5caf207659027f90e3b88472016c6f8012b5dbc28816343a9122fd0b93194f800139a8b4ba98558261bca2ceb6e74851c813df52acaa73de641edb56f4d7af3abd34fe61fb62cca0c704d8838c0fe4fe21c323848eae1d0a51c0d233dff4f7a3926cc3239e47faeeda5f0e00181df5ee7a6d8adfb556f1e1bbce8122d75a9bb2edef89342d37c3941397e7c0c76740fc613ae4c7fc7c81f133b2bc0ef6f17dcf8f429fe4a197a47d8109ee0cb9a51ef86e126d8d22395dd523e06e55328b919d8d1a584dddd4da78c8ebaf05bb6940db17fa6eeeed4e97419a394b4df3d8f8dbf33c28d9f0c1ffe064f31768aee1863ac525e37c1ef5861e320bee284ac0048764a48fd0bbcaa7a4774ffe4d1ef2b90fdb2db3d0d6988b0d41888eeeff67cc808a57fb097b4dd0825bcf044864a78a189fcc10c95f0c22bc7f843664d8331208410aae01dba64adb504b01eccd1a5869e0fd6460ffbd0301086872eb5431f341fbad41a06df5a6b2dce1ec3590c0cf8f1454b97e20e5df201c6962ef1d0a58ef6bff83b74c987f8d1f38107e87de73ef40e6e14d29102b9fb0cb93f1845a4b19521370c43ee87fd3f4431e4865cc8fd3bf0d029f9fd096840c364df5da0cd8a364422d126da10e309e0a99fab44daaa4456a471859c858ad9082391fe780238a38758e40928d8e4fecec60f7efd0fe6001f835ed7252019424f45ee4081fb75584f9006606008accadcb22159d642b8f4659cd6f66dc83624b68c4b0900f1c8f2a290114f116eb8e1060dea6f0c110c0a00a100a46ed0d440d1981113f33466c8c82143868c1c3350373e878c981b369e66248018144a3500d50064c4a0720c2aa3542f03e3d021e6fd060d8d0d158d0d1c37c8c8d850e1b0414373e3068e8ff97903c78dec86f71af00d192819a81b7eaa6ee0b871e3c68d1b02b87143003754aa1b376e601c0250fd0d2a1d74c08103070ed500503870e078d55b150a070e1ca83c00150e954aa552a150a8ecd3460e1a146adac841839aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899aa8899a3ee7741d3a54386ad4c801074d8e9fc1a1860c142a06858a413d4a06fe507f83068e1a343668c4bc3f2a46464a4ccc9f1e15332306a7e88879194f13f33266c4bc8c97118342a172d0c8f1313972e4f8188f070d2a07cddfb04193038e191c6ad4c051a3460d540d944a65e363626c7c4cccab625ec665de6bc02a940c192819aabfa1fa181b1fa3fa18944a8542a1542a1931aa1814968142c940c5bc2a26e6334a15f3376ea8623c950adbc8376e084000366cdcb061c3c6cbf48d910d1b361ef5166503f52814ca060a652346868c1931346ad8c031d7a031038542a15028140a2563060a859a21038572b761e205441bfc5363c8fe30380c109e6cf03ec893dd3f14c31f001e45f6e90efd6ff0491da36678011b02cf4b2bced803450f760afda5d5f3e2e2b982fd383d276a94526a354a6946b3ea51a280959d4a2ab3cc3e7dfa96522ab1172396ae68f9af7aff5d7c13b976776e464ac9c9135cd077f753841e45f4293f4b5e856e18378bb8f425111ccd66a46e5db9999a65da4635bb55cbcdd86dd3b8ed0477f42bcf71339c3cc1fd3ce93fdc8c3cc1357996b71f8ea6d6968aa796c7532dde0aefab9ef75dec75ef7d9fffe4eb8d34a2621591449eaf5b29be7a536f20cec94d76266c2e92dc3cdd3a383966fb3649a57d993da592661a9592bef4be4b8ec1e8924ad725df6c361b6f537456862b82a810220669ffcc20c3344ccbfa312cda5cedd62039b6acbf850d23df74034d2d103cf9eb4c97a7ee3b8624bbd5b49771ed0bb23d68db1efa9d9b7d6ddb3e2ce737acbddd7adb7ef370b23ff6c25c6ef2ff60482e28076b424bd91e667f4cdb3cec356dd3ec4f10c779d1e6e2cf7364b61cfeb49f1bae41b2c52622b28aa5bcb14d6d305ab9e7c0534798c446e76627b772d7d85c6b6abdb7ebf2adc9f225d2fe473a239788dc4530cf8704350102e5c0130aeeb66a18ffe8550c049debcb53b5d65a6badb55696ad4bd1bd4cd795a76aadb5d65a6bad2bf6846471e70d77c65e9ec2300cc3300cc3304ca5869109b6f2148661188661188661292e44252e70e71a7067faf214a594524a29a51485de105d798ad64a5774456fe80dbdc9f353f407f49d29ee3c5f9e9a3a3a2f9d97ce4b4747a77bb1a5b89f2b4fcd1b37cdaff5e66675536ffdf05c102bcff9242e87983f3c5d9a7fc21f2892b8f23febfa3eae8639c2b16abdb7f30bdc19d3c9f35ff074d964c37477f7e328bdb1f971816136cd2fcd16187689056ec12b3c23793e2622cf9eaf02b3ace02179be0a865d4ac1d04d28787e0a28f23c31814ee4f9a3122cc24b846a5cbcbdadf5ab3502d7bf7dc8aff3675d79be75b145ae3338c33d1a98e78727cfff38d68787e28f173e3c3727c3154158e25401c40b28296fe3f622c320ae1c7a08b2ff01c9a1d0675f1a3d7c3bc2a5d0e8f3d967d4c3fe17fa91772273864f708fedadf739b8daa847cc272fd3236c4f42275ec8eb61ffe34e3efb0fb67ff2d9879efbc89d7c4258e69804ee51f25f905cf2275854f226a213d1db2f39391179c98bf0c93b97c34a85a74a7a169a7fd25b16fccd8d058bfe139045efc12eb19070caabc0dd436e078b9cf2324dc2295e05467916fced90452bde17c495453d486f55708f98865c84fcc19d58d32556873f1624fc01e1b901a20f924526f8e44725b8c777f256f4100892451e0442279ffdfde6421f39d19fe092cf9b60ee4758e612dcc3722f0a853c085c9007448abcfdc783b0f4715e8fcd332203f287a837930f5543947a881837f577ec21ba8e2f371dc94dc4fde2ebe5291f72b8a9bf01ee266f09f87c4ff54fdcd2bb6e82512785103348744b2493149e5a3286eb26b5e97d0de567b86123711f58d8f2cd55a64e7cb0892ec6a5a9ee3ff8a24eaa31ba4b593312e96b56df63b0aa363fcb6e72fdd61e0b6da8db9ad548250d53bd0dd6edae54f02dcbaa4db415e3e6854d0b6b045f35325cf9cb62a3cf82d3c122ffe8120d4552632db6adc3476033f4eb3acf839805e84b0a809e7efea68e6c0b37e295d43aa2a9b7b62437ad9c5a492e97cba36887a2a93fe15088386da2ef52c8b473fedc895213cf44b744a68de34732fd88937dfd9fc49c0e8dc5763d155d11a7c7757b668fc5c19121f9aa244c24a748a67fc448a63faf0fdedd57afba20d7af9d92b57e8434bc552f16d2309d294826a112679339f8e40dbe5a2f46ff391dd98abeb7b8ff3a6f8d44b577686f4b5b2993114766282a325128db6adc8e38315ea43a877ede729d1a9fcf5b56dbe4aad46998e7757777777777771791ab8661f1c14df465a6299ebe0f9e8aae145e8aff3a1491f4be4a3de8281e7493a51e745388cbc1c5846c22d337f1be2a9dc8f4459e5c696e1a6ddaaa4fbe735462646f256b106fe28da7e2cdf7a225f580518ccf5b6ea26f62a461e4ea01393c2585b4893ea59c877924ef93432486d5cdfb641223ef93af13efab269ec8d34276a559d2db67892b240cb6e4f8817524498ce26689de19e26ac27b6411136ea6426ec7f69d653163ad83fb71df2f04f3320ed770ef43ae1ae6f60754e707f4d9369594ed473ff27888429ef47868987bce8b51031392e9c328ba44412f870839e25372516ad56ad7ee6ecc7618aae6ad99939ea491be0728931e6bb5a9d6db7599f77d89ca53caf53ed2675f1f85db51df3d2062d6bcaffb378cf45f5de174d42779f26be6a50021737f0f506e0fca5597e8db92bb7671709b7234fd3cb2ea49ba2591e54b2e9169addfbdd7fbbaee4b2d397e601d4912a3b859a27786b89a80337ae08cced8cb227046cb574e51b3ce6998faf67dc88ed341f24a9ef2969be8d34f89ec30ecda256f85bc655b58bfd5d11e10d16678e6f319b528c43dc7846d98ebc59ecfd614883da41805c6624fd758d3e6587b12b65fbd474c0329cbe9127d12ee26d070e77bb7a8a4004c45685ac119d9d3ff142942a1fa5f561fcad5f7438b5c653153f99f44927d88d391fdccea67de57b32c7bcc03c2c58661cf52e2fbd97df8b7cac6f25a175b26857489fe8621966d924faaa5dbcaf426d3a73cfaeb7f1f4e47d72798c82e3254e2899b2c399afb256fa9890910d266b5d63ff910b7437bcc03226692f7f5dfbfdc8ed057efeb179d3436f1527418f110fd8f98433ff278dc2ff17ec4ac694f5f844338de348c7dfab1d530d77b4097e8d3fa1cfe0260a9a6793fba44631ed0bfd1fe1656a62fbca18cf343e74ad408f880e66f351c55466818aa209647ee173f220142e153c81eaff0c124b2894c258e39fef20637f38ca87915f6fd2e77bf096853972283e14397628effc4049072085676f9b0e58b2d3f40f91e247bc37c11a57a0bae7c28619445e4bb7ce7e12fb90cb73cbf97117f05f0972d31103137120a8affe285cf99218454361249e7a458378f99832b1be67b0cce88d12b009d519ac0ca17596a355d1a0253d126cb3445861d6da22bb3624db4b9c1f52700ce29808adc5e64611826c2b06fec9b7e968552c8cfb288831399e8947df93b4974e494dff2a19cc1854d1b36e73cb8451ac626d28079e374f43709e08c1ea0dc45ea4bea7df1eb0f4bd68036d48d44703a58e458e46e1feef343f49e26a2b4e447ccf567e4c119f33a892e9d3cf410fd5b43edb78da7acd73636de36b8a4f79731b8fe5fc48126ffa9c8b40bf138094b19dcf9317ffdcaaf5ea2711a26dabcedf0289230c98b45ba24a3c4a23c095d138a6175fb13fcd5ef7e9d09fe548cf097e52fdaf888dbdb1a4a59521445222fb2ba243fef3bb89de9379c91bd94ff350bb234c2be4cd3ff11fbeb87308f0cc37c31cc15bb1a46690ab26c4522302f05f2609b6c3a2cda7c3a8a4dd5fbe012b1c29394ed7d3fc0681abff6acde075fd493d924b940891e2f64c73009d94632f8203ba6916d9be105d9b18c6c9d0c68c88e5d642b5bd9718b6ca711b2a565d842764cca16dbcce0926d35c313d9f167508b42888d2b804a44f144760c95c8167a2b71061664c72a72acb907960634ac72fc201dbb03d6248798fb42ccce0be567e874c61c5fbea45e85120a167ea7f25d4c8c1c4b3135ba179d0a84dd0de10f89550339b1f6400338b96108a1840ece9123d9bfd6ea0eb0ce821bbfe1c993ac5a3159e32628bbbddbafafe0c69fb0216c395f461b787bb7cf6803d83142086384b26b0892b06860a66f29f51823a43f318c092d9d524e29a5d73eb8feb4339518468c74c7c1fde852880f48fe01a46182ccc46f18d8eec195a54b63a630564951e60aac6c0c6bac312cd2e9832ca18c199b4d659438e89183fcf939c41ce2c32e626f746f84b141331b0db68390216884a7f8119ee03b4733475345a5a5a5eb2447230d406bbdb77d062bc1884dd339449861d48260865c0ed0a35210b9632f2d0f622f4848f7cdabf4306b0b20254729679d5277a71937e3f5e96375c3dee563be3de6d225b6c98f984bcc4bd9be3e75f7c7304a33114669f52aa594526e917b10de1ecb3cd229e97bf53eeadbc78dfa87c3b24b9b179dc60c972c516ba6b4ba3f754c07fa18dd3eef9925af2e99e07edee3ff95b8472ef404d926f936b87d3780c50e81f5b78e8da879555449cf8b102206895d9a9004219432973c5f90bcfdd636d6c48c0567702f3f7a20cbf71e0401ba0f20cc7c19e34dc8d28f5053360e432066ee473865fb0dfb98db2604ced85ebe0fe12b27c24de021f00d6c1b1d99bc35d93692c9f6277ff21bc6cd90485fb919128cbbbd0d6da11084336aa97ee6317f52bebbd7f820075fa24b31d7dfdd572e44084cbc96784929a594abd56ab55aad56425e9b665f2b16d95dee7a22dd903b85c828b67e3971e95b0d7f9e011f725d4897a4af5eb5dedb759f04922b75fc55e2f1ae470ec9ad83fb7d9e3e6d9d6ef9d2f195a77a489be413a9452e11ddaa8fd4e878adde776f92d64096ef2f4fc51a68925febed5ef0cab2d7304e078bbc75c9872ec94f003c49ed611440fb6cd3b2cc4e912883afcc9a2167d9c32840a665da1489b46904f619f6f2972fe13870467de942c8f2650f820053313e8030da4b1e72a480d3842ce511b24cb1bf4120a6d8b7d8c784f0099b0038c3fad030994b014601611820dc42968e53852cdf6658be968027297f004df209294021c9126411b294f6219ce183fb1e0fc8a2ff3e5ff2b6c47ecc12f4a0b7366ef7376ee66630aeb54fad12565865fb347baba35385576ec950892a14c95685b4b833877fc8cd7234f6419f0d754b4a3e9c0e16845b7249f625d6da8da3b1d65e5b12da4aec26cab81df6e95bfb412048aed9d7df3094589bd866aefd86bf1805a03894a5a5387bbac5788a07d944c7444c8a09597e950d637b51f2f9542e2854b2e5d07f37a770339fb725db0f992947b3fdc968435d93cfcbcf9b3c5780969ce9f0c1d99fe0967c82b3ff60263ebf7d3e9fed379aed3f6f379cbd8ddb07671f9cfd863ff9f231f3275f2d2dd9923613f91fef9579f2d525f93ab8d9bb5c02ce809f7d7f8cdb91bd7dcae9b09f65dc0644cc9bf7f128f91f6e2d168940357bf931f66577199033eb7d0ac859cc02b2fdeaad709fb756454bce3219df5e7b8b79504a33bc795f4bcedee22f7bed95b31785b6ab7d626af8e02977451a1cb4a15f76a52b41b95d59a6e4ab4d52be4a30bed4fded5298b4c185592e91e5ab50b1491edc8f35320c4bbc1aa6b324926203590e9125fd4f9e61470bff8494394d64f992892c251459bea4d40637caf721e50bcec85e3ee6ea5bbb62835c0ebd61084ff66be1917d8a8e9bb3bfd94278a2ded7923df62520bb1079beae8e2858d8e2446d2206fed732b96d9a5cd0c89a90da041a61df76cc16db2f79d930260fb1aef3dabdc95bbb8570a6fd6dec53947ce8eddd50f71af111c986d942225b42425dce248b6d51b6108ed52dca56f29d8ffec4c4659cc4cd94741c4d89eda212a4ef70c42181a24e4ce2ab681391d8d5cae6797862feab31e2683013cfae6c211c9d7b132c734967299c0ed2f7db95edbbd26336363632e61ae98e7cc6cd6c0f399a131ad2f76894e28190211313932ff911b7034be195703bba3709795f8fba3f69d09788be93b5791ce3b21bcc8f48e00cece7a748110a358f674cd3fefefd908a88048934327b72319bad9e8a366e9a2fe3a6e98dd9f9db0445241189c9acb199597b92077755a7e779614e7dbaed6f9bcc211c37bc813c8740ef1c4df6f5adb771186613dcf92b17c23183f26d9b2ea283387f6eff00139a9337f9c6d604934c4c9ed48542295eaba150e8477fc2edc03e45e77d269fbd09b7a3e443d5fb4cfe92bc141d427ff227251f9269130c12429ea22fc13b74698244d8081c1a0674bfdbd1a1bfa223c456cc4fe70bda626498f78d269d37d8d8f9b6ca2317f78819eb9d86f1f1e3a9efb8b7fda61fc730ec9dde99b377764cf2d71404fa7c421b92db58d88934fae77716600a42084df29c73d249833c5fdae07acd03727d8edb81bdffc6e9700f6d3a250efde39d25a549a26cfff84f1e9dde692dece0caf7c8424283b1a7b56254da6db33e7edcccfda6496e3b452e72dae7e37d35727c6918674496edec58e781333ef7429e72a761b4d0303c92d29d39276549ffc8c093764ae0238d98136d905f1725e0a9c81373228d966883ec3cf2f474c60e4b14832d52450d6945694b0b2cbd8030f3bb9bf69c33befc962ce5d7d2b027f274e906d73f47360f3d434fbcf2a34c452514f27aa8fcfc7793fffc2160b8c9bfc2709df9ed90a73bcae84b46f39535993ce7c32c823925de10284f7a47f13c25e53b37a53ccbdbed6f5cc13de69cd3eb8135ef93d98af017c42b8b3e723b406f5f84ff59f0177be03f087fd8ff7b57454525fb4c8544f284803917c3acc2fdec14e91b7b089bf4804e95a4523ccbc34ea9f87fd829931fa17ccac34e9dbccae8e79bd4ab6285c55b59f1a028882bd5e5d0cf14efbb2837f4fd273d9fe48932eed32a2ada3747fa0f97d22a2add299e11242f032477d24355dc71933f090f115710757f88c822fd1759243cc403481c8427128e3a5127dedc788a273de97d08942f79a81ae2e406e5a16a88ee4f50bc2148efdf610849de7593fd13fb1b84a691074d22ef0be2fa76f8807c0ff864f2f4b88739fb781fd72f85a0172bc9818538c8c75e197b8a831c802bd7a7b0d67b3b1830624c12dc1e3186bbbbcbc8ef1bbc10264e299d3edcd14fb3961c3d1ef42bd541bf6213cafffa5b877e1e537a14c8c91325767de223299a955eec53b7cc6a3558171be5faf30274baa25015dd92cf6833b12719a986ee25850b9417299b6c18da2b980a7f2147f45fe05547d4f05f8d24f56fa957a717a6ffee28064bc51d37cd5eb969ba78f8b6068c7d78505ebedfb67033dd2b462fd864fad2bf78db829b79e1c1b8a61726d35bb9bd60d3bf28f9e9743a8dfe743a9d4ea23f9d4ea753fdd3e9743abd9f4ea7d3e9f3a7130e271c27d569fbd3299f644e02387d9f4e374e364e354edfa7138dd38c938c530d7f3ac59c522798d3cb9f4e0038c53805e0748271429d6e38b9f8d38b3fb59c5a9c6c389dbcd39f584ea7d349e58472ea4ea7d3c9e9743a3d0b6ee684030e559611c00d1b3568cc9011938209400c00dc808261438b16ef595450ba9338bab921a244d47924aade0a2f74ef8745050b68ebfcf9589414142edb6a38219dd89717dcb906cd85a84494bde8eca2621bb7518cce39e79c73ce293dd33e6b1d2cb2dc5ce0ce8d8de06a883b9eaa6e8a3b7127cf67712c8ec8fc38565dad84ac6ac0fd2ff0c7f4e1f9446193a7ff497bebe202c74c5f5edae01aa17df63ea40b2cb3bce99475b9697e6d5d942ae40e2192fdbda761baf7f7249db255e7eee493945693f07797b33aa5551bd1a77ae6bf86224781e33f17d2389d6ad57f9d9365fca65a00ffb5917ce3bf3e62e3bf4e22fbf74daf3ae535feeb1a1a33b694cb88f92f6a21e5483ae531fe8baf00c010995f2c926ff82f12913d1aa9e1ddc57fb1a6bfb8fa604f4aae9e68f19e009d92373f340c7dff181595d4b7cd17ef3a6e72e166bc6f3ca5ad66bcafe27083c3fbba99bd54de57f34bc6fbba99ad6a5db969be00bcafde681d1bad53c3fb2a8dd58c5595e17df5c6dca4bcaf9bd80b5b798abedc341fc6fbba00bc62bc3a00785f776ff0be8b729d0ac3fbeab5a174e329ba7a796abedca4339fb6b8b9f16ebaf7beee5e9597c9933a377a52c7baaccbba5aa0dcdc344ce9e75b221ac6f4d3dee4d2878745d7c2a5c39d5170676b577665577695e7b79cb4b0687999b69a8e8e8e4e9ebf62e4adf03a9fe0ce567b692feda5bdf27c4ff4f85fa6b595a7344dd3344dd3344dc39545054b6711ee9cbd3c9565599665599665d95f95159597e96ce5a92ccbb22ccbb22ccb547c5052503e5f1ca92ca8a4cc3795450b19a20100000001e314000038140c078482c1682c4e34717d14800d8a9c5676549d684992a3905188184310010200006404400086b4016a310458550b58fb3f8b548cd12829138ef1c48826d1da6f960739e17dbdc09ec034d3afd40922e18a1bf90abb095f2e34303350763b026bd76c5f07b1d2a0cb59d7b4ab90aeede78d3bd624760ec5b3ffe2b0dad0582ebbe55b4c23873555ee98a6c7b9ac216309635840512de44d4c8819f6713efe40dc36b910453a2f2300873150b7eaa2234c7edf5b92a7ac01be577c9b56e5609cfc223afb69e5dfe7f8259426040916812552d2af49acf49ad710c7e6150c873e8cd1b7829117fb997d36b3025148562e4a8a161937409372affea5f4dabc16ba3dbab849986c734b1c6fe7cf7a4224d50172f9db0460df1e5a56ccd0bac9b13ba2787ca0d0ed8e3f8c9b029cf3f8c6856ab7d4e030fd2099b9843e6e718f6bdce78f03fb900616dfe35fdb4b99f418b7da643fa0195da81d7a2e09487fb1d0ec7d2f90ca2133f65fd548ba6e5051035eea680a77705c37ef2f827f31d081a07b056eaf12f04ba4f5869728aa933b764cfffd288f8a626099c7a2dd15fbc67bc601c80e44516d800c0590683049d06c858480c8cae7a664cf5eb0a5fe8bcd58e258a3630edc6cd21617a3507c97a08c4e9c6c3ae218e80206f295ffd49b2fb23a3d091c0adf30cfcc2d60d9772f1fa2601e79535a7210930a80d93f256badd302775aa4577eaf3f8a2383d862bcdda91693acaefe382360e6e90ef90d0761668bb33387c1e63de1631be4714819f8d5152491f648d2e452067191b72e3a158898d6e46939b558fe966ee006e29bdba023c61066423d820216dc64255e16abf5bbc96e746ffd51d131e20f91b07db753f32426fb213cc8049cb819c34d0e64fbd24c648880af9287514a61d67cc605eadae141579f8dae3882e4570df998e7c2df89c2707dc022c357ad79ea1df25aab2d4f49684163adadcb3f18004acaf78138e0eef2a40a3421348ecae3430b79dae31c7bf403ee9ec907c390cd21ad253e9297d1afee9a43602e502a5cb6acd03fed1f856d9297708eeb8a228e65fc5474f6382b2de3fd624ccfd5d95a711fca5d3d3bdcad298bb2861d20ec75e2aada03e53b78b89a114daa6c2b073f7adef4a74fb80c35de6f548b594ee78bd922712501aab64733186152254c69cb10f9da55cae7ade3be4a0b98383eff704c934f6a579610f57f9fdb2eabff8c40790203707212c3be6d4051513c58230b5712a08fea1ce836c4003b14021b1b58ae2ecc2308ed394c81fdc10d4f7a87d86a22b300bb533ad635f6222dbd725bc1aa81f353e07f255589200b5592609d2a7ed3d57812ddcbaee25b75df4f22804abebd5887c0cd3a2ac909fcac7a5a5c673d5bfd1ecc103d775c5ced00c3e95a5b38dcbc51f55bd3315e8376e05e277fd329207f8df46137aacf40abefaaaff655e391423d230c54e13ba514ffe57a51a4f034a8cbfef85d5871b2cbc2146f565679d038878aca99e402fe47d084e651b464cd26f19a74250f26772726a9e92d110af687df7b16382e561ce02166155b35bab2ccf966d3a4b665d7e09711bed893d6336ac8b6b55ad7501ac7da2f5e679ad0e4d4114b10924eadc79de267a09abc131dd32053ddc3389f2086a66087245ebec86fbd57011468539e3c094bb077c248d8049b69a0da7da11235163cc268a3e10dc3502c13387a2b3e68f033044685af71e494f1aa29dd8ee8d93593f116424b51a39deb4848ff56ae0d266e0bfaa4738786d38d025d0fa47709bbec0dd86eaf19f0911c2ed9ed72f9e900386279a4e3984c99b403166aaa687f37c28a53d2183222ef9642c3106667a907d91493408c21f274de610789819a4eb8ef367e1e77378ded00908e3b6d62ef9d3c7de3612716d63e798481851acd80879e355a17e0ef85303c8de52adcb43c7d8da365d5183552db3c5bfd77cd5cd9e8a8f977b5df92c718091343d46a8bfa0c8095bbd1f91a7725334abf093444915958a51cb613e7d5fbd896795692d3423ef71aeaf08d48dcd81b919d981ee42d194a2b085be86292ca5334d60d92daa36ae54260cf9818ea43160f242d299f8ef521505af69c721d448cf876e16d00e28084e87d2e3f3507dd728907de05cab5d3691c157b4b60eef488a2559974f37d9673a1de53c7e629b29679fc9432eb1c99903232af27192649dbc4e2138b744230fe4a6cbac89fcceed49e007c7fec78f0aa004f5ceab782763fd531a443bf200439a959236e69e371deba1b78e98aa22e25c63431dc65a4abb1e99042ca4f7b0c897f3dcd1391b793428eb74eaedb7c4f4209c7a951d1c763e5eacec5a93ce9c5a2be949baf39e614fe92cc3ccca99b7faed10d264ee0b4309051d0764aa655e4353ba53e7db107b45f1421cc1eb576100f25be7cc2b13fea307b73568fb13edd79598a7a1704b63d4619bdaa62e45f345caa59463672f2536d29f33bce21d6bce48f871c582c8a05311c5790a960d9e1c069841212101def4b0e70452b1762de624c4bac3a6938175658d410d63c233b31712bd9f32f5899e026fe04843b9c91d75466080ed4676a7b2b1d142d01ded585bf2df781970428e413dcdaa661848b95bace2d6e2d06ac069329a23b62865bd1d075630f20af0dad835b7ac2bdca48536b39f51ec56f6c50b9932d86cb60f453c45cdf0d50ea99ae73f1af82fa4948a07880e65f9925042f93ffe6534117b316a23e13854b2fbc7e3edce58c552826ea4fcaac3eabca49c2b784f9f7cc1685c993a596f183c27abe9f4000fbab4e24d7abc5776268714d3c9d00fb1eb06b058a043b8135a2a3ef11d3c60cd7ba7004c07b8a1ea4ba6d3b014a8c0320b19711c091126ce13e660f9a309bc465cc7f6fa5a179b1d24f8fab7f7f00eeca73edf8ed69ed97502cc4e683ca425111f07af3f6212cb3db3481928a42e7fea9d472eed3c6037c9a5414b89250a6bba4b4f0b3f81a5d697ee14000e544060874444321d86f0aa3c57844aeb9fa3ff8ef66da0c66fa1895d0d09d1c6f6b1a718c95a84dfb25888494c0688c77579f7f18b838e3ba4ff1302474a653b470ff6a717d8f710200bbc70dcf1b7a032d602cd323ac037f318bffec7e9983de4693e60c7890cb7190d3fc248787201cae2a187b02a315280801ae634b15a9e6180d9b64f40cdc1cce9811104f1cb4f709ba3973734027d7eb3aa1197753d1ba594eb16f3d50c1de46e8f6ea29fb7c3a72a959e50b899b65f92a4a7caf841610ec79492642f95453de32256f3d8d70eb600a133f2ea3c219355d94755fa2d505a75dafa49868050e02c148b90b6333d285fd118277f0b0aea257becddb91a2faefc115b8ef9e78f0974eaa2232613b26f022cceaed93f787db507f4f453df4141fc21e3ee809bb4934f1340159b9e13cc7eec16345051312eb1da419cde6929b603f49a1db40a993708698349a7b803f37b65dbdddf153741260ea623d7a2478939ab42b5631354381dd66c348146cc46b73ff5fc2f798ff49b5cb676c8dfe984c214008861817967183b9196a39fd1e092b36fd42a182a469db36c924b473da5298457146be3905fcce7d8685ff0a3158f7ea669f0c0141a4b7a958dc8cab9379a4abc5a2c29d79b22f07516d0c4c44fba32e0ec649db2e5a39276350bb78531fc7b30162fb4d8e9a51b221702a25505b404f623d10cf5a3138277055d0ca4f6685b377626ba93b4f576c3dac14e3f607d518818ead5b45f5979b0c5858d58953a641fb51419d1b31252ba36904722a8aa5b3491f5e7af598897b8726fa48bfff15f7a0151f8b20d26f6e8953efa39f1cb07cc4841ba8799c689d905ea323135e5d5d2f32a21606e2edcb440ab448518d7d0cc181b2dee759a3251671afdb5a62083d227ec9b7d21db156dc2ce7554f8497465366deaf0e9cf5e20e06c6af50e263eda27d07e9e79d86bf8f6ac837924f6a7eed7bc04de2fe1bc925f4db3093f46a8559002856734cf6c2460680894245ecd889a54fc9aed5a2129ca39e72b0938c290570eadddd1e013b3a53585a5ec54973a872a2f4ba2d83cbbb0ee9d97886516bd6a82e6f24caf0eb8cc6b9562808f15fea83450638433b0dab8dd4c577436ea6ec6d8ef99bc3ed32d89e9436bdf7c4ac4c023df37e27e1817b54850002cdf80a51c80b2c78e711e1db6063366cd5fcced4f28829a85953c8e009a68c2a70015924bb61181da325988e990c11d19f88206f4e91f7b6f1b65577ec114b00482826770465408f8d8330e3ce81129a7ec89eb4346b1df64878365e761efd7a05e1ce0da5932830db414624a680b3113f5fb0ebeccf5adf0e1ac3efe25c0ad23ed246df896714eb3297ec9e88dfec7c0b4cc0470285c8d93c0482450c2df2ace1f9014cc46947209702d1da9c7610b94811785c98055ac770adf0a4c24482655ce6727dd9803c744fe557e10cc40a1817a83ae07102206dc730875290e1e2a75e81b965211f88fcc81508334571b7003289c55041068f8f3dfc30f9d8f5f19b9722855e863bf182bb2e901fafb36d8e3c0b6d083258bcdcf72650b12f6a339ae0f9f25b1968642ab59de642f8539a5bc6596979c889584730204b3ce02ec02f3d9f084080c4540a0c28edfab7575121e5a7bc947e9c62d65c152b0bf4ac7d1b1b61fb2a69493c4139a8950cf5fc608963277aa61594fae64126d8dc8c929d9255aa68c7415be4216ef4661a1e2504a532e19671c6062502532200b85ad84ad3549eeaf75dfed1761e0ab552d510548a912dbd801ad1f4228878d702e40118c60b7e1de194f8bb096d0e976d42f963568a460c0a2fba258cda4d653a1d3c48571e3c143ced455e4aecf7a3c23c0a681b510855bd6ccd4721b9ec71ccb6567e9e25c9ebd7ff321f8e762ae2a00acd2c686edb4d78ae21ea5e2ac0325269aa4a7bb3fdcf3851fe240d44ed670f9a95ad82a5f46b7f07c2cc3b1160aa5b9fcbd826858a0d23a26746d321fb06bac623708c0c912de95f048921bfe6310dd7554140202468c628c0ec97c490fe82db4c972404102d2212e517b56323d8444f1e96f45df8456e7935716b36564e2bd23d5d1c64b90d562251bd2f4588fcc4401221590692947989ccbcdc02c2128d89030d5f961c97155a30db244cc8b77c6b2baeca940078c5923febb57445512b694304fd137489a7052a632480fcea9990d92474b1e39ae51b1276c540378dcae65a8f904fb1d6c8e7b3ff60169aafd57a7dd87afa8547d0491899ace89064ba4f33f02d137203cad2ce9a6c8a09ac469990e3c9312b6d4cc84d011c265193a75b5907c9205178ccf20934ef14c01113f26f8f59a39ea15c6cddae6dd3ba29c5f90a799ddafbefd19e683ce35d0a005877fbce0d011fa03261ba930f645a06267ac7815429aa83e5561724fb8ec48abdbadac17e9423c05c2053d00e62d67812c1b7cefbc1fe0216671ccc1724ce7ee9cab6985fc2471581ed4f61227090335ee34d1e93b7871bc500a1e6f1d6030c9ffb48dbe8d7fb418b802ccd88ea2908886918a982be4096d0b31490ce8d3b90fc83589ca182110b481155dcb43f20b8d681d64606c8304e4858836cea49100d0878e9dde81ddb92bcff01b26f669a99bc5f5a878a1d12dc893bc190f3a6416673552bef0d1fd6eea4a6b03a7a410736b803f88108bdd90e8cd9580130fddf3fa6e08325fc9c0187cedcd318eb1f47e9fba14134743c1e8d2e5e87533f237bd97455d01530092b8288dd43090d3348d8553e59402065a358cd83775d82d79494d5247159d013012b7a627d9ef9a06870f60b1aa26ea2d30a2303990398601b0c60dc0bbb5468ea0e5768b3876aa4461763d1153f630ccae11d96ac8a5fdef0616ba06a399dc60e50ccf9e2ee3e8dff3551ba5abc3fc27523717d2c4b5b51bca17f69664fbb57af13feece47041462d92a553f420b2f550b0e916730ee8adbe06ff65eb75142d86a613373a94287d68238a8d9a74f7bf9aee9c05523ecaaa97b4ad7b163a411afe4dc979d920f5c301e5eccd1741dc8cc04d8cb208f5fc7d3827d17a4455015e58f79fab76905483f224c47242bb2fef41937fd78e248658ad9fd22c0a646e9a64839a6f8ad10961fe71f4bfd2729040fb9b496d7ed2139fee275d02106c7f3bd7ce4d3ce3d0fca54b41c16d6ff31a99a9675cfabf54092ca045de5878a269e4dcc8c49c85f71d71a1ca9253b446928db19e0e98c6c7cb5716051a78d810d49e15fd2f1c82913860fb2fa19faad4bc4437c9c354d95d0d39b4f5c9b84cedd08060744688238cfd54f4c43efa6a9e1510a016482b039ce65ddc3de1274461dda3ba4711948bb7992a00ce28f21159bfc7eacbc1d14d66427b080169657de3b8f6acf3fddcd982707447aeb4b1fa3c5e5677e0b0d40ee7fe33ff3e771e9b30e05e8eaf88c6d89de1302ff9ed5553ac7ed67e8786f90197f8a93c43ca3ee16139e5753c825db8ec9d3ecd8ff226838ad3b6c6d9d00e18dfe5b5bf3b1f966de764a58d3b9f7258fe72d0d7018981eb4a39284a57fa41892bf161c494fe80288d92072652c90313a5b403ba044a384864251e5e621377aee12224c18718ed3eb1a9cf9bcf689a3ad618c82a64e38b30790f5eed2eb050ec88cc5073ad14f5d9d8476cf20e23198800451dc13915cf152c7d5e896d18c715f02610386beba20ca872ad64e9b38a6fdb381e0043075896fe451ba8f8adccd2e7356eab1bc7a3c7a2717193d4bc2b58fa9c42db308e2797446c60ac5dc1636eb0e8857f98ec6ed2f4f966173f8c6b6fa5b3f39604282f48b65c42ace27b3a66983b8ca7817abd37e6e3417d999fcd0a1ec0038332288f0763d541fcc8dd5d3c4d7e72589333c06d5ce80ab0556c2a407f053da7997bce3dccd7010fbcc7bdb9cf5d397f977ab6b9b99881b416dcb89dc7104d00df1144e333eaa0655492c73c4f6fb1bde7ad7f73c3fcb9b558287ca58cbb5934e2bf41028bcd81c3c63d0961e96be05577ad8a60fd0cb8a120e559aa131db09f86638ee773e0ab00519ea32fc3f9916b41b85acfdfa05c25d2c87b32fcb6b5e0b55b8b638a4c92fefe4f924c0525e09440c0dbca6d03f9a9b0a1d6ffe56b1fc5e41ca7cc8e709365d87b002a574c90585bf8a6e823504d265e2dd2bb1fe05dfb546dda4797c0c692e0f9fc80bd2e5ed8d3fcdc5ae122b87cbf2853265ae9f1125220518762983048491c50ae27ed69810a50da53f6fd1f75716dd01d4fc9fc0b734fef12973df7920a057f10238be0c86163a68bf3ccbddef96df46b42b06eb2fbe5388157b40105980391c392c964d8220c100d3de0e7065bfff22362879d67b2e0a6be0c33d73181534568832ce0e7811e3d348c410afc68c95dd80757e72b1e7f8af760a5ec47e8e1a76ec5ffd05693de45ce817c68809e56e7437f26ca8ec013ec6c61210b374ea5101e7dfafeea185a44dc0f609ebe6395654bf165d174b7280c509d243ea932907fb7eaba740409f2f06122d25950e24439a7dda2464797f21312b8619a674ada0a48b740d5a0231b15cde2758be12d543a371ca9da8f39a52fcc327e69011aeffbe9e459107dd160680188f1fdda96c7fd123a45af72eebecf6e052a04a6214a4c1a43b9ddda1ed0f4013cd4f78d58d3250cf14adf27956c295cb00598f673cbae9111b4a546543e6510b1aee7d9b3691aa2569eae2f4c51396047330f56613648f7f756f8deb402eabe9c92534aacf030796a3ba2c819453f7b3a9f48a91c0a8e5b026c699bdcbfbb44f2083912c90822296b457d565495e8d3cd006fabb46ef92caaa3824acf8f50f19c3816739705126ff9030373765e6b0e8dba31e03bd1c1928113d572f2028d9e6a73c5ecd8c0c23fad9ebad29067a7a45ab9ccca65725f7e2be46952f188f64cb3803facea3ac23e4f065460be72a7213fd2825fc50a7c2763867998547ca7e7371c1c7e09952392ba28192b7d9d880df3316a80adb063801dbde4576f351fa911616216d5f8eb5f8b020df06550dc9117bbc4adca5762441898a9387e25bde1dca819bc1aab7d9e8a0ee311d595b1144f7866540f48d4ba64adf4751226cc47a8174f941bb8122a47647d512256fa3e151fe65354ab5fa5d70e9e149503d2ba2cb9957d95c00e9311eaed092c1c017764c3eb99231935b1a8dd22db0f666865be582a7a3836202396c1204cb585749fe14b204ba81c91d445c958e9d309be63dbce9d3639e9a11e81aa05d97ede9db5806033096fd191c67e1d9a7fbb79f258680324315f567bd9eb78a9e304378d72d6d85992bee3201b163ba5a19d4544991fda1d9cc46d6d4af2c258c380aba977cede5ba0a1630ea1dba2fce4c3162eedafa68cf1f62c4fb1e28c688f524392caf55557d5149025a4706817068d8a879327be97822e4bef645cb78059399bbe5546cb3495217ba10c313c9598d761d6dbd492ab9e3ac4307c6d1ec09353f519d04fb2186bf681c9c6551fbdcb2e82aaa9e235f4314de62afb1b5b04191634962e414033952e9acf4f745e509705909f3a6d990b04f4c28e383bd963550d637ca423440147284abf8261e07f9a544b63fa4527d74601c21e9fb88d87b31a6508de4dfa207fed641436d3249b2ea7ffdcbcb17c6de13dfc73d9f6773c612874c4a661c2fd45323a62cd0a3ae465937670d7cd4ea5a91bb93dff740bb93afa00308245c90c9c61a6e65aa3d7940b85b1b410692271b79d2d42a603b7a7ce4869e2caf0b613a034a97ae3b5fc6491ff56a8932e6523e37e07ac8fedcea17598773fa17dc607a1f3a3094942e9192e594850511e99ef9674e0c6d19c8e2b24288b8caa88d34e14db61ac79f548c519a7bb4134bd9531817629774d4caf0e58541003a4003bd8237f431d4f575a5edad253b797c1ea94b27a48d993290040ddab94ce56583db281e4a3d9d5d3cd01a7c6fe1c91d9af6fc6dcc71cb0e601bd4ac65a1628d175c649ef71370cf6976a4efdae762412c0d2ed45fcfe18e90615ccc375abdb380c0c7f363924a2428f111df66169a0793cf943a488a1cdb3b743186acf5b46bcfea57cf4047829aa826357fc5c9d310b58d5553f5193362f573593da61d597b0470c7e4c140013454840afc2311d2b55048b3e686ca503b616547ebad990e314bbc22303cad7449c2285a2db3b19738aa253c84051129b0b85294e0dc12bb898bc395374f7c7254e4d70303dfa21bd34a026008cf4915955c1d5d53bab688ed9a17fb1d77d55047525c5c65580567a9d5a552fee768560d418e95f2c5e1b64d106ad082da4c88273563fad5e895d3d54d4c00734f85a5227348c0be94577b7e12f72c9d02add4344ac752d7ab1846fa5cfb71504a54885e25a974b36e17adf27c40f62c934ab2b0f17e5161a33ac225e8e3236c7e96bb9eb0560c5bfda35e800f58797488ed5c3435efdd8d748c9a0096ba99ab50b31927ad7b13ebac92766b4a1dbba85b8c78b04d5de520eb6b850d062ca9debd70d0681209b7b73e5cf63897a7220cc3b4e3b0e394c0fc42723b6bf7eaa303137d969db951c270a9bd0dcae379e0415283a0c10c888ff4862a6b3337a3d803df29870505b5595245e6860605cb09a9552ed5e96047ec893885395a91a30e886ebe852ec4044151141ac9b3b2eda43b70d1b6c59c69c247f31097440031ca64cfab862c2703b5bcd64c772629b87512ad451b949e28f865aa13560910054ccffbd6ff964c6625732b2a0699a34f1b94779a230b57c702d9e6718ee7462b5197ee1603557ab5dccea202528925119a2ee6888ba7b43eba44368c614c9215f9937eaad465f2f72815a39888e00f7c5d6378de995de9dc1dc90631184a029c0f4911c047ab9da447a92e6cf2e851d7799f7026d8cb4404cba1327c4bdc1f9e6921bc6dd9f29ec12ef99852a7a720551c407fa8931771bb9e5f260e717c904e695e712aa9b48e5165008a59bc054922612c518678d5ae208d2530d1db909aa7c21fe23beb0a537614c9f0e8ec798c17bfd40ca3da3b1b19e431d79278f0e633097a02043786d1480081966f0e070f70d520a076fb71064cda3d58f2153d78a008a16c557134d33887e0c9e0a3d472c28f5502fa85d2a66a60ec5d867dbac40714e70ac050e1d96bfc0512518a57334996e1e5ea0cf95c3a930c91367518fcf382cac62b3f7da9f09408a676ec49d29f2261aa26669990acac1514f5f4697e30419b1771caa1d8de25e36be1c44d43c2066085e3a13a029dae8f9afa9ccad3c961235b374df82142fa093764a7df5f1fc06a353c170fe9cd727fe1a0f2c67f3a3609df9122528a6fad6d008cb395e38ea023da43cf654a0162262ae019516154513f972c01653685e56633638f5cb04959017264515bcbd09f5def5c808a403367b48ad22a7f55dd88ddf4daf18f1c0228157c48169f3c942eabd0084248cbea532f7d8c14e83e858ab6983580e9ac55b10d82585882cc225303fe14be5acd60854e291ea062f07dace3a8333e0ec890b9a6183563bbe6432b5ba6a917f0960ffa489b74a8f19775aff3770957d0093a8a797f10b3f9e82ce06c8b7fd9e3c227f1c1aec8c708084c964b0e3d16182ece9fbd90f99958784cdf9f2af6ccfe549a86c08f680ed7e3b13482be830369ce63bf8f6c79e466f6715492bd4e95aaf49d69ea7cf834e8008232ff4ddd00ab8cb45a9d1590990d5fb9acfb22ac84b89fa4e4269f2e4f444d736ba6b5d1c9c338b5006d2aa7655054d8ab694738641da24459ad63bde2a971460fdf60cbda45c91d5e6c2f8c311e542d64032e31bb84526d91e7473bfd1b579ccd6ec18c120b0659fdd8589b42579badd9304145da75eec031b57f700e7a862cdc2ae2f850031d8a9733439593832059defb684e8bd1c8678e2935a5e22ec1a2acab300e8141dce370e50ddc7ae770af9965277adeb1c342bd82af435a99e6f7f1e367cc9412b0f0d05799a03d87c41eb6e106c52512a095293128883b660a042359126b9788904c61babe22177f8b077bfa6e3ee183cfa0ee3a2b7bba2661b24ee0142156934dc359b20fb9fcc1c517bdea1b0fee81d74ee5679b9fdd59aba87927de244fc86771f9d3fb00d65e22df397548264e0b66af23d65b743de47dcc6dcbaa028f6d678938622549e6dc36fca9e8ac16df71ebfed285026065e533488ce1ae4c56f31b178e2c9e8fee93e64c21d0df3bc76c6445889ed761392f9821dde3e7b0adc4b7ed1b9a4eab9653864261357fddb8c216f5460f15499df8c79f275475c9c54f25dd38ef9a549dca06aca4919cdf3368850dcf1f7fde6d91b2e0ffc654f3067bb50f86aa9d5c4afc26776fba26d95e1efbc0360e8fd60a2531890da76cb685b587a47a73c2051bccbcbf886a63bdfbd353e86efee5c916912bd58cd45c9fdf6a18dcb018365c617ce435fabce1b1362579c540bb2593eedb1001108e8c20f69ce741c2bfc036d0c9545a1ac3c3a731d5e42248e8e7a674a03a6f6b76f79087d7ec89c131183bd6a945ccdd7e4ba5f42b7df045661a2d2da3493e215317ed2ae4e9ec8f21465a70e7cddb8fc2df959a91dc0a6000c538926c7dc70077fd0b425a2007acf02fa0e3421fefed884ed6842b28ec5768fd4c17ff16369574d33af01a704fb7f3ec685020c9ac15ee06bce0290461c7b48b68cb1ef3c58e28edeefee9ecad2e5556da90338310fe2409798f90ab2de6058a310092445896685d63cea2bf3e92f7782545ad9d681fc780b6fc9f0986bed9a0b9cde44905bdf0790ee2211c05b5ccf53273fd4edc3024b705c338104e30eb0b26255691a7f600bdbed4aedb1da2a30d32ad1c2642a978cace72fe024850c9bf85656832c9137463f4f66c7851c40aff881f60a1647024ce8c29a199390fa6b45fe01a05794ba0716f28fc583aa2feb1c5b5918a2eba308712220adcc59b3fdcebf073c887afeda742c6ba12900effcfb275427af1126044b7cc20d2de0ad20101393d5361840f90ddd5e356edbac4a563956e1ca00a34392b30d369254938240d16667c74a17c98509c5442f7245dcae858d4594f51571702261fffb218028f49b21c751e7edb5623f442e10e4e5eafb7ef8a836e085f733c13a45dc5cdd1fd19732d037f8ad32f70c372e0c6455bb4d71b977163ca1e8852811b7167f50953b2c7f8ec9743108535a62939a1ce093255a9d7ddc876050da0f3948c2d0a6624a634f24324049a1a06ae4d1e2b5b40e52e5b50397d453ee57fee89215d51d08a930dfd9e3945fef49229958192d808332e522e51520ba6652724c6499a8f3b2ce806ebc46c438a1f5a304f715877704aafe0a8a25e78fa75cb0b7ef8d85df659e27d16a027010668587c45e6fb4e48c62a0b9cb724ac202eeb8ef1989589a7777aaa407ff569dbf4df19dc27c299943a88df4b2dd1d8d75c60976de2829990e83b527f169b7f10820c35bc8d3c88f402f79b510471f7d6f323aeb79cb6afa5736963feb1be7848cb9b16fe3d7c71889493a551d200cdc430112c9f05109f4a0aec719b88bff7e3584274d5d806dbacf7b0be944c8ba2ca4a2b8beaa3ee70bf00409df408ac08a4557070be26c1122f117974eabde9d702e7e00f44e193fef92af187c517b5eb6e429bff10707366124c68eaf7d2481caf98a76d683e494feaca5199df8815d351cd382cb9bfdab077720fa2b339cf3dd75879cc63951811353159e8a6b2dc0519b236bed892a6dd52f307f2b50f86629d2a65fa90e7008a2b8da64c56dda6c8059b53eab9b1f9e9e220e86138b7c161c46252ea4a0fd24c4d190d4345056891375357e3a37c746cd22d779783af79cc86167766514a61f77875d7e047b5fe0d0f7d13cc4ba269103236f7d255b57b516bb814c69030ce2b8329f34b54704d8f9c40c05c06619bffc386c705cc3134668ae2b1ebb52c24309f04a8d6cdf4d192e551e531e65d8481dabf7c075e289c3c4c2cde30da1d0cb8f79af05184f8b99270211ca2ac1ab075aaa6a5e7505002f140a9f6e1d482ad095ec55d5ad838eed647c2652da6ab2b251ef9de2a29e962d666d9670a98eba4c4e3a8d65af1524a5c14ca77c94d2ea239da99937d2a5d6ca8fd283a22631ae4889ca0a005b0211ae7f560e2e7445710a3f386d7319aefbc601a71c2d30470f003c22571b1ba803600731047fca1534f712ef51669f831572703886c533cfbb143241c1ac131844a116ab42ce6bc30c9bf3ec796c2fb7c68182d3c55b4fb43423f01cfe693a8ad793bb3f684594d66359ffcf7852746b3f14f715fdcbedbb9080f26f92698ed360cee69f26eee8469c3b6aace97f25cb65eba850c75459d67a065c51cb53f18b35d444056370f0cbae402d31d87585e0f6d80ef48eef95ddb51ee4b19b8a098de3496b147bbc4e7af0b44bccf754e05c4882295f54640a1fc77e087e726229260a4012ad4b19473c11720b325a8c7ecac0e0ef40b8a05b420878bf37cb77261f96f1095a7d9243fad3d6c61ae89a8025ad5a25ac089c819c56e032e4d1bd99d8475f56f2ce5fa95576674dd0c177842148004c2e7721f800377c3c2efc12a2bc623086060b625e7953c9d43d4be10c178e5fa46aba2ccf901bacbd482c25ddf0f69aa67cc46f2b50f3597a8cd27403b3c463a482a1b6c4be4818934559d79ee4ed49d90e2298b3dc382e61174a53d4a477c20f20b461a1240941a47b238680e05c20c227e5e540b0b94122674aef2250feeb40293bb7b28daad09caa77487165300abd1416a3fab06c3a01e3e8501ab02ff8f04923eaa93794cad674a07c72bbf06eaf22e61d0a817b6f1366d7284877d31a61b38ef74ceb6b562098709a221f8962518d273711a1ed77e451046c51d3d54a56d6ec92e60483ac28c43f8e7930695878218c1ab493f27af90b3891c9756a37ed4d24bb794c6f6efa40303a99708d8a42d0d5955e9964ded247b93208ca11ec5b05a8350068df011094d5a35684cbd7a84165c51182f2193222c2aaca2ead2797d8b13abd2a2ec84d44c5e72028abc0a588d7bbcf88e0ad692df7ea9c5a5426ea7108eebbba3a6938c01ba96da295b981a04cc62e80054250be4620fbf47c97be7be0fa4751946801a518f23c6d880095e65a2f5dc362fc5ed0a22a21fc2befa4f7fba424590433217b283f18d3f11ae3d21d26382f2f9f1c7be80d6e08d3f15627ca072393165962d45b553309f646467a289658a8857d370964a2832008fca8cba630202d1dedbafc7925ec13e3a0acbd3f74c5c5e3c29ead422a9ba1005e44c9ce258dee46e73a72f267049193dd0a2f84016d794ae91fc53047a40f0eca5fb8cf14c1ab65117e9b39e402512ef8ac312d031eb1dbcf4179e63ca3280bf4e75e8a9a908a385e1c60099adf27a82f288269dd44d548da26ad28311f8b9892ceff9de835315b0ae4c292aff114e610316d9171504e29d9d2c7547ff1254249ece16390cb40e6bb2c0e86036111b41203ad62247d039102d195b6183a464ae7b54c74f75a228cb5da62fb0c44e26bd783b02c8bff57d5103fdc0a28cb59d6d1543a144b4c1de766ba435331b049a2d99d76ca261612a7fece64010d086837a3f51cd770d35510922a3258aeb5a65e52661b6acce7ab877a6f1692d51d6997f6df864974e515a9311fcd3fd33af961e1cd14520ae33f6c046eac133bc555795652bfe5769397a8b44dc8624d00be7f5be6d11e83aae76a52b93843fef7f6f483d850cdd587ef45e12a05095efe06fdd2e0e874298bf58a04ba5f2bc0673b7e4635670862ac2b19a8d79011d03f8c28a977cb2abb63575cfe4f5dfa82e69432f4b059aa270065b1b466bdf78e56cbcc46d8e2b8928a559df0c3877f0060007993da70e63632d46914c6c504a2296819ff21c827d2cdbd7f182fd8742a8852d431fccc1138f25e8563caba38a67f1907ae599663c2ad42e2cee2707eb7f4a87cac6362f042c98ec9084038bb646d6aa32ed23398bea091ef1dfed2228cbf43ff1625d632902a6b850c66159fe0ad87abc5e654a0808b29c3a0b0078567064d6ebf4d9674f7c06645f4581552009a798674f80803d463f5442713ec512c8d40cf84beb0346c0597a2d586caceb0b8c1dbb102474641ecc4b28309aa475449b62461c44f59e3b29a812bf1b049574bbcbf62f46081f29d2afac64ac24f927ba2903a1d6cafb2a3850d84ccfba5db85f91f76583d4b1defd3238b6b3f30b9ab2108a93c5b27c93e31ecfa2d83cbfd0882bdbfa541766f570c74b0519432f92f100a9fc2bafa0d7324a4aef91790fc97c2e44fb838d6130d143a1d18341f19cc6bcdeba74bd17a75efdb3753b6f00945367b4816494f4d37526fdf426ed7dfbc51fc81c70ac196e1ff5f45361c8a3d805515ed18c59c96dd1e96667a8a4c6264410749b97cca8b5aa004da9fb06cfe2247f0f179a113e3cf38ba9db2d9c873fd7bb4e521419bc75233a030e0da7e7ac20d9925fe2045537bfed38d566bca1102ff1c3cbd6b3e9dd39269343c7b2c02feda27ddd740fd3b4001be46956f975e3a5cf9872b8a0a80382a096759c1e14584a52e495fed58cce302d397603b3dc8b9516b37e9109b9c795309a98e6d5a6c9b5d2785bfa05519a0fc11082eefae81749262cf0b5c1d9c8e7751ebda3c76918d8783c6b8a9b80d7d05b384857d97dc86d7b7a11df947dfe3157c550e9063353109446191cc7d2516cc2e855ddc19c70334dcdc3ee81d1550ff5fa04b0b991be4f65f6ed28d014125f82423b725d2ebca3d5fddbce8a8415d700cc7d2f6d13122f5bf47e2aaf53399e7658429c98d0a7e87491faea1fe7dc0b55fee8d0a7662a5c743651646ca8ee212c1c7058e5eb5b717b0ca03b55e56f2bb665f4f2de63d76279ac12b25750273223dd0a5401249852265964d02d6bf6f8174ccfb06d7c043256484b0642ef44d811cd28654e9039d058043866c0134a33d2c3ec6c7cc66b2738438758e60d585469f019e9a078cf011eeb3c22644716f37bb7d70362b84453664976e39535a478f2896b83a2b2488d0bb92288d6084fea869179b79e755081a3e121a122d5de192916cc51548e7f4782f54a46904f7942e237210373bfa9db6b76cadf4b1cc7e477b11b00b107a79367db603e0f093b215b6b40261ad723504d5c94da13eb434f5d79e079b26539dd9bd337100eb81679c5b2fe52fc660a1c88ca09cc2860363a7ca0d8dd055ea4f877c66eb9def0b4c66e5471c8a6bbbb95db13ff401aae020ff7108c222ba89f728f4a96a492466b5e8c78adf55a484cde66542d9f0b3b55bbc417e810a7ac800e2bb4e6d6fedd237713dc453d4eb4d66cc4f050d6813b68332e3966d0a3aa2c2d609e25198c96cc339b67642c98c5ef082806cce95c44a54a21e010e73eb36964245dfdf3e21dd87e3d62ec04825ea9a4a1c3b8dc431916130e7f12eaf1df71cc1a3aba9cbd42c98d5a7ef6a27aa909de13b9e369a1f3e90947821e13f85837eb5135386de7cc733b96e619bbeda2dc3fa3857fba8e8fa6a87200b992d31d137e3f4d26599b3105b40d70ceb9654905eed9496151b8b7e09a6ebf73c61ce090998c8f307281711af765fccd333e4e9daa402ab658aed73fd0573bf3b5ca79d17a646966b601e05b3a9b0a25d79fb58f644f3c51582dd71bc0947d41723b39a04101b1d2cc57005a7ddddad0dabe1899c23d50d982a6b34714fc988d469476c1f02d3e9d62e8c63326f44426e046162a2ce9112c763de727a71189a668a84d4b9c0e66cdaad7fa809b4b324d71aea8ed0ebce61e0337188c9a146668e5131b213ba2a0471f81d8676c66c91feca2e3908dbc8b52b7e853afe299b6a533490451e7e2c0a5ef13f24b6d89d525b0c93d23fb35998a44e8bf3216f0aea31691974634fb81a25f75aa201ae97788947cbd0ed2b99a1604fd9603d56ae6f1919940012271604db5b34fc630a6802582728f2176bdbd5c799774b03171b340fa809b799b945b11d1c52c2f8ddfb42dcf94e2a7073194ca740ee80d2623ef175f2243b06971ffc6a4b8117ac302ca252aafccece7114c1cd341cb95965a9413ff4fa9eef1b88e775fd09992c6aa541d000f1ab3ddca301d301eec9fc06c831beb63b63f407314e4e9771e8cff8019cc7eb1d63847f89206d7bca6227de35a3ab041ac62ae79ae138d65083d78c2dc2779c38fc242d996cf75f4fe23f6a8b61739b130ea61cf983f41b7c9fb23bb660f4e89a58f93497756c3bd2b17a0e86df1e2332b248ccb2d6664607a81550eebe4989eb067cd6cfbca86168da093709d57a2b2f18579ff29ba10b66450371b46e701725896353206783547ceed9a1aa2cf6ead96788805ddd95434a55a5b150427c1c0f682917b8962af383abf09d2920024475821fe56712209521860f41f0c5d6bcde841c63c03909d88a391c8dbaf17557b323626331cf2068d804dcfb9080fb5886e52c02068d430541e91e934af46e1918d7454dd1683f5b0bac0b60960fdd18c1dc4ec859adfbff67b61ba48a0e2b2208457675ac973b7a86e55fd2d893b90d39fa90b6acc68a13224a8a000a66a8ca1494bfbc5c17c5d58856fc1d9071fc8f757f10b205f9fb34b7b3757bd26db4ff7331976b85f2c1d88fb129024f29765843d1a8c3fe114af22d8b869d4779b686f889730b61c54c0aec210e99a0b7e48086f009cd6b0f626326060fd49ea676d00762c04a6192ef3cb95433fdb815ff6c343dd0700e18319651a5d9e3f3771f34fb0f9afa9c0df1b047948cc6d7006025e32019340bfa3b2a647524360a2070dd6f833f3aaf8a9cf38d12823433a1766528ce13d442048347c2a2637d0b317ef0e390e065918fa6c491a95acfa6b4ae2e026eaf36f3fa488fd61619b66ee817914f0696d1dc90c3d5ca9b2b03f99b83818ad4331592eccb4e56c5ed0beade62bfc307621698cfdd56a97a6f07369068c0a1b9b6612738c45be01477cac1c3df2da236c0006040260c30d94c54a51bfa644a67af4d5b43c01815b67e7d3c6938e19dd1f76ff0caddeb505fb49bf6db25b2179f1d904b1fef4335b1aceb70051ce60ca43b33366824f5bb7663d145315201ace37da80d98c03028694e11fbc66d980f759be01cb7620f836f0cbc85b52e191dcc772c8611a23b2abc8da65081a24bc42a31293ee9677102e885454fc8c415de86bc0c0f30c00c46350e33a9bb8ab8477bb85b2233a8e5bfd1a0ea2ebc3d6e044ec1a61eaa1273c16dbeed06157b7cca92af815bd9e21f3639c6811d4c278bdf270f14be5f715af89ac04aa901c07466109878b318bf6ca390d1145545223ede210c3ca98613936f7064fb082ebdaeebed2bf28c88f4dd279f7b6986a8c52ac56dbb54cc59b44083280bd6a2fb5958c6f690ced56bd4ac47ba16d24d8a68f6e4a527788ffc247cf1d3364d7983c438939dab40af6c7ddc0c28a205bdb35f2db60556fb3791a32f6a362e0cde9332efe6efd8efbe7c130db322c0ddc4c018172576003466ea29b1276274bde7e9279dfc2750bbf17d4ae38882d090676ca11b40b313ae640b8a1467457a6905a0fe0d4984131c51a7d12a1f19b7fabd76376682e217930c43cb3cdab95ce281769905ba43fea706f8916e055a905a85537e33b8114d7c94391fba3d2f3b1968816820f991fc54db6645d1bce5cadd073227ce0f8290cfce4963e3d215603b2b3d8d9fa9ed43df4905bbba3177a9da87ee06932c1846974d299426bb6a5c04efc77678e721d4a61fc67b229b7a5869383c7eaa186f8e5c0f9b7b34beb3e97cd1d42c9df4bbd0fdb223a326d9c0d496d96cd36946fec2783fc4e53c2de1906951aab430f245e773765a997b6f970e2349c69935c813731f3b7645774097e2b45287f0a7c1ce2cd0f61d8630e2affed5a5231917aacf0277c6a07a9e25ec6d833abf53298aed0a1fdc6314df6ff9c238a9a0df8071cb814eb3673f2b4c0f85d2b68ea840e3acd19f362c71cbe7856b198a594a814a63d3ee12394c886908e9915ce75c1278df51d0d277103c66d63986fa962e2ddacdf2937d7c9dae5f6ef15cbeb47da0239435483e82da877ac8a3d95a2cfa7ffa12cf8554fac2c4af9fa20840fb6643193bd3df72c23306d52a4406ce701377726515fc2fe1de69fe45a445f74bd3af63c7bb8da2eeba0f7fec6e9cd20838baed74dd9d404d17de42595283d69905ce05a3653fc4fc17ac4effbc4dac758b338fc403206add2c5f0602361f4fd341f09ce7ca1e2704886c704a83fe6156d7cfbda920f159d1766c52a800e20d98443e210e646e57afade94d6bac71913ad0e419cb505d4147196a712ae821f8fe18e1bef1089b841eeca0bc1c1d652bc39f40b724def15e24ef1e945cd86c3a13c20908133ea40a5568aef9d9d376aeb0d0d5b0522e1eacb0a4a7a60855c864ea3fab7d90826be925b3622638c83eda048b8376beaa05c917352ad13444ef62f13507442d6ff1c3934cbd90fde5d12296f4e144b25779f95bb4a0a1e88f25052374c058d13b9e9ffebdba1653238daba47f8a039065c34a50c4f4b84553928d5c6e6de8fa4198d02abb5a021364ea3871b5f7226c959911415607b36720a3994477d36a75e1eed673b419e180a2cc539e726d01205ec3d538e5c2678444b40e6a892e55ac86778a597aabc53c22b34b2a2d642e383ed722b5a3afb310827b16c01deea26f290bb10f65af68385a9a7b73e41350354f3922c1beca81fc749180a342172af4d79aad48e532c5d9e7de745b667af0826ed353920a90b685705bade9d0398115a074a27e4e096a4e27d200ca1736cfab0387eb6bc0d6de3503b594426cb398dd4b1595133a6c0b590d43e0c04002da3ca72fd338f604df1f9463e0ff162572ecc8153029038f1c14060519aa46a645173cb88a76c5a53d28edeaa9ffb450f5461798e0728c2cbeb0d7baf0677b28121f5d27201b5797c23caaee6f4128b03341de42e32a0d7c5e8339f57f06902d8d3405c996457d0ba9c5981969b9af58ae4cb5323e835a7d7b84c1e3cea748f452d022f35fbc947d1602530324e658d1b0c464d1b55866317c24d5acb5b17243c0573c2b62062a083e1272f9d71ab8a14d50b593061ce681f503b62422005af3dc01f2f591b9e22c32c44901ca3c86f53093cc89fa4aadc29021fa3f51f3cf89e9a96c74f41b52e2442e9a4a500cb41052adb7e9c92d985ac6bb40b520ebc081ab4d716418a7e00ed17e4c5ea46bdbb86ac9a4e1ef32ce01f74e8bd5f06eac69576cb981b92d72ce924ea17b47449abcd15d220f25a6e9a13b1b6d37137c2ce4df58dd2421b0a14383b0147e560ab83f51526a3008fd0a7f223952f284c3628c0a050423f2a0770c9da025488ca1ea25165809915f9b7d6046a31cc007eba11f374ea17ed30219f035bc5a4f4de773fd5eb1e0ec024f032e148894f0cb258a061b314f2adb61af1a6a4a45757cf7e53128bdb758f86be13ddc225a61f58a81b3206cad45955153a268ee056316002d8bce4e9ffc220e9ba8f84bd5e6dc477982785de4d625dcc1102d2ea20025664782931365b0e64e3b46301cfa3ca12abe0f11065ff6739c7e92609ba383fc74005e540b15a9eac8dd6cf87181b0c108152aa79ad4eda6ca90067a3494cc0cd533de34b14d6c7f4d2521670ca7859cbb272e6dbc4140af7d4983ea477019081a37d62eb77cb46d645939b77bbd8158c9d6ba68b1b10362e6154a8af41c0a873c0c975611a02ea00ca32ac6fce49845ffedbf8d8ae152aa138f3ed2e7bbbfad7ac0b082e24191d514d4829c2584b809151df9ae1e91692b75049041d376b5ee5ace012ae48c6e8d561d343f3e993feeafe71924cc82d0b79d22fa65ec24a07a64c6e6f0e02687d878d777410bc0a621dddc92910871f80b4660ba66ed755b3ac2cd51b7e0653e0385b2f25ba297a4c930f661a41e598fd3ac73b509ff5092fc6b4706e0eefa9c65496c178fa882e634551ef3a471b41cb826212ff2b07a35b046399c83c6c0b5912f0ae2eaa09b1020aedfee9bf72b581ba7375bdb695932fe40c630b0b294d4cc7dec33e5ae00d93806cf943072d15a00ebbd02c0e5e0710566056c9a09b5ff601a19412153ffe437389062876a21bc3f10cb264d6da6929bb2216abcb449aa8c5413488d0c40b1e4beba3ca2e8f6cbc86f153b998d5613369662314e63d6110a11cfda3ca170bdf8d292bdcf83318f28b5d0314433e65c42917d4a6ca2dac2d76da3cb17f514a19cd00b425e7e4385e6d087ea67458c5fb45c062ba539bb4d11f8d1f90a3d7656020d8ecc874685a1f8a9c614fe7a88d8ceb24627d93a0aaaea09d3c267275d3e81b964a04c4ba3526492da6d1a36e3d15f91fe5355bed5bbc3516472b7863d778bf0548731d4d88e67acb352c08fd2dbd58fb1b023e307c72a79ea537ecc76298a9d6dff01d2bc6ad1c5b8ace8e9eb810bf50a31fa59373f991b8341360b9c0d63ccc3b110588de11fe8e7436fc0705148b55469f0a21e17ddec62354400be5738b72458b4cdede17acdd9bc407b4d042638af68dc6b227039753a26d60a4180ef060a210cd5c85c569417860d13cbc6e7d784d53ae3af095a927d7e2a153107c4ed81d814ac9fcc559b2a9320fd0d30c2d753043320704c6ae5dc292eb310ef0dd3f05b5ef2606ddd12ac9205ab065a4d516c8f9bde10335824878232bf193b02a9e4ccfdfba40eb2688d001c45a0af9cdcea4809b81351acd15b4cc2ad021ebb5d9b0999c993b29b9f6074df9f142c0ede10a4a07445751a008353c778cc14f8010c432cebd9f17eec58710707b30ad1c0fccb246f80d489f591dba2a0638939b69c679ae5fd0c126245a3f45aaeafb8a2ea9b015e72ab007051ad5000a06f2da5530aa4516e216bc4678fb2cf6c012eb3a80c5842200bca2c4f3f3b7ac37f4548c6a93e73da5cdb9acdedf0292c50cc04f3a138f80532ef3fb581cc55a12f52354e63c6cce276289b46e075d46c76fdfa882625c2a8cf5a3ed22cfa9339e0cd790a3122d11a010915e11e3234a89058f1b16799db8aba2d3bb4dec8028ebe8939ff44f424145ee7fd5e11915fe8c8c8c0b91915b64480748156a7f214bcda7214d9a81249877f381e022cbeeb48d1075309566baaf0f7265b937a051f3ce860f14cf0311daa2c795bf73437f24cc15a2d1c70e1402aa366fa7348a5bdc4e3211e687d0e81b8e5af2a4031ed999b55ed420e6f7cd258bb46d4712a676627dc26d9bb5e31600158e5e120cc927a6ba9bee0df1808ef9f6b1800069d4c9cbeb397b584e2b908f5b242e9a117a4c50986aac2b5ddbe3ed8ae0fa1fdc7ace9f5fdcb1d11ece7f0f1a53038e64c9030002cf13dc2d702ac13e33e3c6ee85ea998f37500c1d529b22e35aaa17dcdcafbfc81be44da5772c842ee1c2255bddb0b5c97229ba2832fd3956e23408681c0365e3bcf67ca687b11890ec279df242c5a7a4fc35557f4e2e10937b981e0cb5c5ac1a9d088591921919d5ca985341f35606c8033af8fbf161ae88b2e74bab969526431745f9cd6b4204517b81d70b930641c45e1bf5a2aa10fce6a8c84f88a52382f16772040b561f090d52d370d8ddc751bd082559e16060b05ee09272b69aa710f0b5a7ad802ff73ef59eedcdfebc57c8c81a4fb914895a55f8726ed5577d6bd607b0e1f3b6e93fac966e85220dd830606c6fee563c8dc114bf1004ae64080bc3372e2f1a43734248d38005d68d8529ae4348659aa4a4d5194dd28d4613b0d82fa7b714f8671f7ede296563921fbaf1d99d23aa801c9a58df55563142d835642111672fffdf49d84f687ed1e74e2f57f3b8f3d426e0da00840872e10971f1273a4b278b961c3290347983143578039f2b2362aeaf3b1b4949e44939309b3ce131bcba9509faac069fe02bcc23c603a3484fcef29f8a91803f52ee62eb608ea19095c0c9539e84b3861e54ff42b1638ecc8b96c4750e15184bccdd18410af181c736442a57632aa239ce5ccf74305286566c80ba7233d84b039ed9a71474c02344366424f5c99718312cc238bdd0312647f728e9ba0de7823df595191fd078cac2614648e6581327e6b3adb187737004c4c25390d61d1bb7dabcda37c1f09163886bd416105e2e99f7ba888e0ca8da911dacd6d66c3b8d6635fd77daf669a68de54b5db033681a5ee13fdc81d70e0868dffb1b6a8a1a77933a0d3842604a5e83acb0821c76b6083913eca4ad4198bca36b629f936807ec6ff5102dd6002b49298890aca7dcb177009ebb99de2b75a5a07a4f2804c93bfc7e613d5740148a45d4996ff1747a46cddf02dfec916a32d65dfa6a57666e62d95a624efcf4ee6d71c3499c886086ad45bf2cb2417b6c5f971d94b39cdcf4d99a9a98104f0196713df283f535b826d5f9ef2b650d0b66731b07cd7553eb100e426ad57d0bd89b30dda63eeb42b139e66ff1429ad00eee530e83efa8a20b8d7751d64d0813c868e6d40e4e5c5956589520cc925e0e1e4b746bf973e714347d3b0972f7bce0c55170fb836bccfdcb867e3ca16eb6035d58f2bd188435cd964a0352bd20c911fa37668e9793f1ad251f57e62fa59e16c6f1c8a72c8a1f137d7f3c4a13e02319ba0ae15a9da8fe63e6f12041181fef914782bae6cf242a29bd75981d0e9266220099176de977c6c6ec432904807875e09890cca1c0ab0f54879fc481fe665ce01ddbde8eaf5fec71e37fa6c077c5da6dec4b65763c94dbded34d56cad95dc2351dfba85bf1734f6daf97e03ae91f8f888611bc4fcd28b6b14c3d3c2b13e81fc8080d685f72f12c444c1fc8749bda9c2fd118862b234ff42b2b020ed6f9af02be139e0c467d0922b0dd11a6ce839e90562e5a7b8b29c198d84026a3f92e47f7739b6f14f19b56bccafb85184e39c515226a95dd0657c52e43cdf446135325eba713ab7401ad7ace0bf897b15e9234c28f51e5545e9368e6d21d0f5bbbafa781638f97e00fa19b12fbed3e38966bc3f4245adec671301599012256ad6566e8f07080e5d37ad867e44a1b426d2e2cce92b6326b87506418e99be4de5fff2f8ae753940dc94fc457c764dc85e844555efaff9bd4565c29f6790ed9a111ed157b0c0ee5593168cec7d7275630edbd7c3be90e09613137fe2f4bf827a09377c3f24f1884e2e7ff05d119558a0f501467005562bcb98e3ee87f51d984a3f94d43fa8fe9a7b234c107e8bc0815a59c52044c4b21fec99bd9b7299d07a8d522b5bbd7264aa4d91e4ae1769cad0419e3256f622493bff64a6af8317ee95e921e6b8d89d5bd5a3ee28ee28eeb42543fc5063cfdd472d7251356e03b2b473a9ccdd71ae3dd57b006ad5bd318f7c319759945be724b53326046e6799314918a3fa164c2e0c15d93d1cbd79c57763d6a021135a9109eaae9c971c6eb08321814e117020901ca6e6c368a9f1b314c9735ff0d1826c11e3936ac73ede9da08033be9dce10888ae387bc0b014eb5e54d82a76610b428f5566ed08e989a3c94a77af910690be90d53ceb4458ceae911c39a2bd05ccd706979d46a44dd19cb1f4e0bf041867d3bbfc8d45c7ab60532358580861af379c951aaa7389cdb72a2305e8e88a493aa25f9f869287a66fe8343d621adfcd7a0de0636189f1001c6ac64c59ca05858c10d3ce238ad02beaf9ed62274233e49b5d28960b08a89217402a3e359d00ea5b10b9f2a6fa2f8fa93f4ae0e17e51b555c3dd5fc77ef82770d42e1ba881101e8048e3d4eebb7238209330937e98981a78fc1c95ab1bd1d82845071583d73b9f1e96d0188ea925a373748dc4510575752bfb27f18a2702602a98e8fddb58f1c923ef0ba727d6744f253fd719a053bbaba1de4a9529b62a08c9b7e8731436bb612a50cc5aeecde512dd73b8ff96d1f552805741c4932ec13864c79b0bcdb347bb4f5ec889c61ef44f7462bfb36c4cdc0cebd3db49059af036f5454fd92da774263e08617b3877871df7c6f6a0d8e6f57c5c1bcc5e5468b865e66fbb89c40bbb79c41595b4e13bf0fc5352d2787d15ffc9fe536813d6ac85580c70e3bbf96e9ab54ea6b4eb34c44b8538be02a709cff199874985021542520340c848d99801072868fd934f95ca56d899f83e459635ecb888cb5b424a61b0f50886b0013840a8fb5f8703feae3a66246b1e79f784a95f2079c94a1c6ec60733aba5065471899b6d234e25c0156b35ce27cfe25b0540a19396109ad072a9a6c9ccc10a07ee2e25741390ade7afa0fefdfba3e38c808984f7cfa4d2a7c30646ccdfac36d84066f9a4e0b97eeee386a5ad3bf146af3e839e467a49ad91c0ecea7d0ec0e0ed17a9d8d2dcda6b712bd2c7e06eeb205f7f456be3415955f36a297e4f93a0e78c705cee38d32687e7a1fa0ca54f3473c07bd5583ae927bf9cb4266a89bccda91737e336be60e147698f114b2a5d2c134c69b39196b3863cb26e956c2ce7eb2916671a8d3e2132e4f79a3367861fa1ac6f82924d8348cc435df992e7420dd710aa5347fbcc74ca1082a4c67721ae3f7e40057280fc3618b944ab8831a13834dff5d1403256d9df8c560b9992e89e205092c275ccebe0a8eb55af2650b3af1231eca1740c6a014f0e949dc5af08670c84ff5f810084530b4bc2e486f33b7b0e7f7a20645b1ff85caa28ffe39c41cfdc4c5849635b30d567c656bc35b07acba6333c9be73ea27332e68188d2a82315cf7a23a04785043dbd9d5d84c7d90b795530cb1f771d9f06b033aeab47099c7ec4975ce46964ed9b930e747aee4755a8800837fe6c555095e63b8fb0134d45b46318c76c561306e1db80022f9cb6e8fdefa947f377a486005f58203c289c0534103932891ac69cb74a1cd3e5044cf36b46faa4d7853356586beca5b416dca9417bde141a44ab0b4f9b47ac8cc03975cefe1dcf8ff6e1a64f173d8b98393ebc8c236551b3872a3ba241b39d165a232eceddc08851aef521ad86ac9410ea7bbfac6f54c1e161d03aea78306368f1c81cc09574e620bab9594af85c19931419810448e63a63dc96260e9781c66c3a44b6940aecb48d0ca1f050c8aca09d2234fa41cce85b6f526c90c4d38b6842c76c022fac77a4bab304fa292d8c16be92a23477ba49929389182dc56b4a2a815cc4653813e55a3cfa7dcc50c42a65ba3f3cf8730f9555a4937e87300a1a301f7e414f65e57cccaa8ba0d82988d763d758a2cd831ee1a32a90647dda2efa0a2a7aa386af4c98b8bf41403b657cf5bffe58ef4c79d17f21d6902aaa1e28ec4fbae179da01a2cf4328f2fccc04576156ab78153b184962d7c65a73fba94d6ed3dd9ed1d455e10e41f3667bab584cc5b79bdd1258bcedbfbaa0bbea6091322e56df08ec067f790a295614c6aff675c9ec7221a1e8b2c36f3e6ebbb2e4b927dc404f2d7cb121f357c47d7c20b5c7b138352af3c427af887695cf24abc23f7100c17878edf4cc73fda49645e09a43879003380e3cb2906b612ee2da29c45ec8f63ad8906f8e0c0210971142f2ed7db9c458f9e37f2f538890da8824e0b8fcead79ae37e3c54047d223ab8e20b817032c9da15b1b0b34f8c67a9e9e01c8ef3183791a437002347bb95ef7bb8329880a390ac60f26185aa093abc131115c986c8e51266a71084f9e7e27a6ffe861c5698a6176a4453d5dc75e32d298470d5ac5540655060a23aea50e8c5794cc94f9d51646f3cf905d792b5b3427808c109031208098d8f0ae3698df5e7e8c7872847719538da417a102ea8137c3dda19e249ac7fb7758680a18343ce144542d340c93ac0dcb3df4f49b48d75a3ce824f35a2eaca7890cb04023c2a39de34ef0b263ee4b076117bce90ad9e4d28f2f534f291394884d968b53775cff981870415bd8e94c06555172e5ea7c9ebaf28a06fd959cb7e027099721ae4e8e1458d38decc040f14076b4d2ec5d0dc1649ee424ed75c9785c0d8ca764022f2b5837eb43c51718654945441d60e30416892b4dfd3bb83e7efea05c06e3844d66114a1d4e2b446675dc74e3e73f4e31ad28fda3ac8079063151c3cd2db06c80d40f36daca4609135cacb93763cc053d27e6394528cccc17c5a30d544ff8710536063ad65febc41c075f4ccc02076f2cb196b6ee237eaf4ed3456a70ba94ea3ab042dfdd394611237e97b05cfd20f56f24d8c0c4763d9b9155ea8f23abd460afe6cf37345c6758c56104ca67ae2f112335e34ee8b059800ba2d309fe460d8411c00fe8585c85ec13a7a883deb6ab028f1a44de71ddb8b552e0fb98e7a59fea3ee465a801be9da03f5d011986b7535bdc9e9493011a9b45e95d7a9ef35e8e4c489eb624f931116a4b335f9af93148d6b568a348f2d7cd8dca336e844b7d456a4e736ef34c1c9a8e7bd574221e62e24f493e2e9fe44df8fb86f412b91831eb54ee013d40036ad943cacdc9f44dacddc9dc10fa83c3bd596f4f69afd4feee7e59dae2bb65eb4a75cb4fbcd9125471eda578803ce0e9437d5a38e21f03a2ec1a20d7363339ddda0fdde6645f32cc3fb46d4c0628a0f75795d794c0dc85cbade12604125750f72a25552fe3823d107e816312e5091e1858bd434e2c5593b26a4cb650100796970ee71051dd99b27706ebd33dc575330694d2a57445266a6cf0e0259c039a4ea1db834333a364e67b72520b920f651b3b79dda0cb0905349ddbaebbee6219598f997eac8f27de9aa4da9f8a9de8194ad78b736cb8de66613e31445b9e20230cf433798723da33144a1c070798a80c93c5defb768f2ae387cc11e0f3cd768f9f7d6cbe582f770a710ca214a23ae753bab9d0dd5b951fb35fd95ed1e7ca7fef9724bac7995afcada536ee13a48cf0faa5ed29b0e8b0a7594870a9b1249fdfb7eb158b811c49ee127b4677df46ea311680966b95c30ba9c7f94f993f633338bcdabbc1a030cee357f1ad1c29f6fa4c36816f4316c29001f1212243102e4c1062ea44fe93768107eb93d54ea8fbe808e8a6313eb6a4c7fbaae5fdb72ff2ce4d7548c74c0d8125f5ef4d2dfdea494865c713832d632b178f47b1545b14649492796bb9dadf09c82067a69d8b5c4f6eba6329a6b5bb60c7c507981ac251a7f321cbe88e4baa58c4b7de23090607bc9183086671f43bc7c46f84aac2e388a7aeda204cec05255c258ecd69169c60665fb54a3c2e84679803bf05b0a1684bf1dfa666835342073d8bf49bd876ef64d14f6823f35122e0415bb7f213353517460850e74740bb23d25100208e11bd3d838b44bf13e9d522850bbb5e4db6810eb674546b696b977c31ecddfbbab81340aa25e8367096ec246673052d20d6a01c0da39ae9376729e1b7907ebd50090ecdefd107d831ec8d717cceec69f52f08b3474a5c6a0abdcb65627780e82293738608a82782205d817297cd997dc25664aa506b57a83e40aeb1497d710a162eaa962e752b5b76bd53e1660081df14158ff5dc159ed790018326a69c54f2dde06964c82d70a9825279d7ca3e28a602ef73df60785bd4f6ae74058172949110c4d3e94d9c4adfb32d94d0631d09a3b95846e9eb7d8337d262c98d58e19074d548a2355f38f5f8d3f8ffeae9f4339e242559fb321de34e7cd9bd6267f045fd1407234af344e1d3f4a479627efc2268f6639329e104bc426fd8ee72b0e985dc017d44e75825f17a12ffb83f516c1b8e05714e5e5db153e69dfeb445b13d4ccb95e1d37a4d828597b3325a89747db0d4fd7a4c541e1153197f8a94de0fa0bd85d9d9186b33c9f481b784b2c5c0f9096b7ab429d70807430cb89f2665e8034603378a510bebf548d317e551753c9d353a255d77bc8127c442920b0ce4f28fa950a6747948021488c6162cc7433e5bb8bd48bd8907d26b62aefae12de1023c7a27db0773e1ee28b59a4e5237904e5d07fe78464af942a1732212440dff902035f2eb949da9dacce5f9d3a77fb7041b04ef52d772b51c7a58661f47db480afa0038d41a0766dadb330a7c89e2b0811053c1785f7463cfa347bd7573a4345492e476c9d2912f236bc11194054dae0538b2a6e4f34ed80f9eee9f66a4a3b923f6f5168780b1b176896301377b42a4658ab35636197750525220abdc5fab99714232d1f5c00ad61313ae2729f2e29eb3953af55ed75b09919b08b8f30bec24312884b7958fa165196733f60dcd7129e6d8b9bbd08f0f75dfb4ee11ec83d85d2d47e1461cd47d3dfafa320979a9c80f619b680c576322674a63acc694759ddd0bba4bde454f97d6f31e434497cc7253eeb2f11d8f48da0c3b9a1139537d315748990fd1266bdf6a24bf6139d4e03cf85f233bd8396dd866fc6a6464446cb763d961381ab622ad750c4585f9b9688d65f72a391a2109fe728580009645f31e2b134dcc6e9ade6a3fb12518ad329ab50c4af5f160cf342c8b8761175d8b262159943d621aee9d6a4fc17c41d8eca9b84111b535c231e0043d1c43b041b2b1e144e00d390d3d5cc9df7c0261664cfdd67fd632e79da27a629449a0dc85e51afff8f54a68431d24b6ab7b71b12d5c06a53f3dca087117355dca52bc230c9396e6334294de73444f184218a72e37060b6321acfa79531ffe768f362334b01b8ab97682ef7a90f2aa1dcb151e9534551d011045bcf6fca3d01930ac89a02ab8cfa05c605fab30f4049488300e61852d3da1474be4a2f2ebfedfd00dc0a1ed13de100a37e939eb5de0d2fa1020160cea1d2b7b6685420553e3e781431079edc6db7479da8b37d085c4e30103ca8880a6123eb6307445782653165066a801e7382c9704d0484e853902552b16c3de06153698ee856c17c9db990b473047b52911cb9239e740265677e9d4b2063591aea1676d8a7070f6cc10c04b686be11b4564baf8fc0ab30d1d2c34715b9d9269ecf56004039b7cf744bf090528ca8e40663e745230f55dc7b4be272423103669f0502ef90ed5e7c1b02874308f28df0b54a2d9de1630b0334af50f97f6dbb6c252eb219d48869ed506e4ab0be66150d36d53a68c5b532a3775f9dbd376e36aa2d6f05c9a7b200051629301bf917836686a4804d11c3c2c0cb0e75f7b7a5005cc961a0d76ecf59d6a8695053afa539f74b348bc423a075d84b4c64d252f52893a4d33e337a311f5bad5dcb270a30bfccdac23057855115d025334f574b84d55995250ab338476b54a5120f44d3655b1a69af55c45ba6fdbc4796a2375e1a54e6946ea888893ee13328ed7ec5b3018717619c60f680bf0d34c6db2475dc751ac45a6c6888e0f538e9bc87fe6a7a46fc21bbb186b2a1470d2d666e83543224423958584d2d59fafb772091ed234a4c78d1977699638eae3e095d9b070ea235ccff59eaa8fcf561f299d51417d77779db53e7ef08cdde6ed99430671ab33bb89be42b101a56914172e3ba2135d1035a4819acdece619fadb7aa41c17bb1ed6740d9133db371f88d826b083a858243df36ac2e0169cc8a670109a9c4fd03058b706a050d574b33cc38e10e3cb1f1576c247bdd2abaf13b1da887e35f9795a64649be6b08de7d8d61c6a5febecb844ea2c135938b2fa0b802b0f32dd508e01d8195aebb5a82dde7aea3621d17fc22752eddc4d88abd15b11f4b56cf738b94d3aeccee9b678124d6bf6d43724db97e403fc4e9b3ffd78216283de14f1b4b805183a0e4c46cd3ff9ec3a4c9a7a6e937e5c02d4a2ccd0d6f2a8e48c349f80c1965764bed0dbcd642e38610a64e1ecb914ad4b40da47129df31b818ba22dcb36c9b58882cb0b6a7a8e0426801f963ddadff44cd87c82a811f4a483667824830cfd12eceb7a448b5896690b60afa6393bce6894ac71b59415f6c2f4cf2ea091c079eebd7a5a1d3c9ef54e47d6c0a765595b7315d2783bd13aac684ca700a024f14a791978854168000dbaf824b9bfa3ba161bfb1dc1bd0bc2c45d1e891b1ade5e02926a48c7857e5e7efb6c756f08cfc197967092075e90e996ec2683d68e60d49e90ed7979959494ae6d2449b184bb0aff372390e3542eb9b2bd14e0d32889ad2f40a37fc18d60cb015cc2b3b6259b3a0e39a3df3d1a8dbee6053a1601a561e03a4d6f4257fcc23e9c425b7428fe7fc3ac35149a75278a5a5ac3a29875328d9a4ba55926f4912fd09d8ab6130b0559f970527d8a9c87d33e8905dc2c5da51beadc59a8407ce8a8a2317829a56bbab27c781cbd677fa3501f0baede722fd45b37d2fb627eda5e159cce551a9fa8d410eac0c0f0b7dd403542cf52861a023918aadac353e7304b250b7b5f6ab2fbf14133637890a22c615d5271a9bb32517fba0e205cd5049a6712c6ac8ee16c720ea2a3851b7755662f9e7350a59bb4afbaf72604dced1c3168e24a3426e96882c58e2efcb7a49d493dc1ccbc1f525a053f008ae8e1d741099d01e9a0a235bec9820f3cd2863191e32a761d948ecbc0f6b0d43574e5a94acb8e94b44fdd8714f82d06356eea28381f17ab5d1005e044156295e46178cf97500123d5ba33b00a60386ac5be3adb201ee4e0bc65860ee22f04c68fc5db02e397168b10a726675606d9284d305ad8af3f8b72872000fb25e41324e26ee25d004d6817c0bf18714006bb8f03ad3026cbb955d64c6ae461a622aaf7c5f03b337d66ab22c72cbb81bc0447bdecafba63e35e4df27ff1b1a7934be3e0677a621fd919e77fcf4ed567b978b010351f3eeeea6ffbd3e80a0d189b20f31828147d2d9fc10f3a090f89eb496ee8c068a50cbbf58ee01a38d0207cd2d3fcdfd06c3f1ac3488e81ed0d4c8bea3a2525010e6f43481ff36bcc38ee96f50084e667b6280623b6ba7455c04cbc33876073b4567580c02891dcd359d7cdf894b9bbba41998187664f03b3991df588fb6ca0e3e94d7e6b9ea297ac40dc2a028ce825952cc88bfb25b4c0479c434f8136deb054d81239e96da17cbe4136412feb05962fdca4bb79682f98cb8610194a710d98532b25eb9e870ae121762c78c6b9202a62b27a5324195d986b4cf791136a5532951cc2013aa7ccf4cb2d24c425c612d8c16a1a82542416a97f2ae4aa51c7a005c7c19e37e0ed56885b5c32a2fa98914cebbeb4d37673804db6121aef9ecf1c606d1bab8a2b09a44364a2e2bd9469ea9213f175442cf64426dff19dd36e2aee35fd864860dc739949c4efc0170e23097202fc1a18442cbd977166bbec977aadcafb963f422ad54e5a53e93d4cd75c67d29029c8017be2d387c314cad1db7d1be93b08472673739ae42c3f7bc2970a3adacf3a7b2dfa46c104dd84de4521cf33a5e2cc08f6a630855bac0092a74dc6c8164021c75adffd4a209de3ce136de5c9dcad6079619f1135148263d05145abbac4c87a53a4b03678d2db1dc1ddeefd730c7f24f29ffc12efa877026935b03897cba43752d244d6dabbbf0a99913fd0afdaf506e2dcd1f047b2bcebebe1cdc8c0c09fda6842e30a141e896cc399dbbe79dc2dcea3a1077a009822395118b4fd1d3dadfdfdb7e72276a433552dac461953809f79b584c505634c64a44376bd5c2abb73d4ab43b38c0ba58b3ca67cc4a747c65a42a346e97c83a6b9ebe8af9b7d2e3b321988a63f7725d8c4bbc2a17bf874b57390133b59cc9f2635202e80fca8659150c0cef8d9edfa517b192ed3802e86f9cb64afbde77a409fa6006ef377cbac4b1cb9b2496ee1494f453a8c29576bd3eee524b2e76db07e7c2b13519cd04f6ba3b88f4aa764038678574fc9c2bdc43f08172ddb0e0bf7e87c8586bca2e22d174fb1eef15727ee9b2ab869abf57eb860f63cb2c826675a6b5e3f695f378e76779591d49aef3e6a653f5c2915966ea01bd6dd035a9a6013b97b0fa769edb68f783815425c5628dd13ca1733c39272a98ed76623c30e06d0c88dfe270254109567c3a94ab2d9fb21ba1363f0296dee650f4eeb4f335c8bca2f33ae779de6e3f39e3b6194d9d6e0b722484d80715c831db2a43b82ec1c45a3401e379b2844ce6dee3301ea348edb319eedd8a2cc99a3275013a47d3b4549446398a2ee4a96439e70da8c7c2be02556bea07f2cdbebb8aaef1ebf9054f47705b951860d1d758940f60be015a5ff3dbac1b31e8d84119dcbc933774fd45fb0a0774dc9cc8186c2495e6aba73227cb5a03ffe9aeaca0cc4dbb1b5c6f270013859a7cf7a5dd52603094d05b54942a33db400f114bf24cf0f1288f54aa9ccfb23f3a0009fd6151a9ee27705f8a027dfef11b3a116506ae617dfb7a3af073c774b1662f6a2f378b0bc206fc67896de62ef2f0a08801150cf08439fbac123903bcccc0c61f2ea6df112272d573d90fb833e30a60e3fa0c6a925693e46ea55fa4b24251a06d1bcb0752d293458771615fb52de5e6dc45c2f005b2f7373245e6059682637a02309fda361d30b1f63cae34d2cd705d20a13b6e35132b1d717ffc0d61f7a03f52a89110171210b4aa4101f455491b6d2280b42a216f2a7e2f7a581c10202d87d3ec79c7d924c672e171da830a315ba8c550c3d005d52b03f5518a6af67636b56ebdde59e0a3ee4d55164d783f0cbbe025cb70e0a986b1b647bc38cb603d3547f69ec70eaaecb923f22d61a9e369af10bb0e171d36820c27f513bc35d68212ed5a36090e52a2494a3368e8036440a8ef6778f85a35034ab86528a42fbe56b862af4b5c62eeebd6fc12cf8e54fb2e1dc153538da2e01e7a97c67a0141d5d5d45fe2f5552bf2c20006f2bd74fcd6713ce61b822043b9e0f21fad0e5a8973d6a8003b9a38b27d8f1e894f67f92d2818bb0a4da0a676a7dbd5d8af9abccc5d69282334fcea05732e67dca89f43500f3d3b83cbecaaa85c66fa460f54adfcbc66b860d6b492948a87545825d0935f5d70805d1178993ccbe6b3b8953ccc1a4f169d4dde08c5401809f5b4679748176e3b225134f431032cc6c9887122f8be0ba539bb5c16aed4f940393d136f076a0cc8df0400736b89f15d3e6a087d09abbf47f994325a507ad403d55f2c8e5571c1042bd4592a31c51987eac0c26d88b39c7a48e633cb215f3bc701344763c986508597d3d1676f66d0066f14879df7e99129e35d1df264a8435943008a992b1932011d3148f676bb78bfd8185b9bd90b20e32e98b1291dbaaa15821e3dd31c99b336055b83c70e15a983a192d85d6e919a6cc9c0801ec7a63c4ecb14272eb048182e040430d858ad80bb08a06ceedf69b77c0c4ddf1ffc9e842d52f03e0389e11bc1d76c76162d58c40a459f47673bc0bfe0c2c4a40a904821710c7568231c4ad2d495be6330fc7500443eca1a24d1954e9430f1d7a7ad7e29d0fe821d522ff51caf3270980a9a0257a81bb6da967176be3345a76dc66d9ee6cc5ecb1af30bdc4cc96272793442403ee90b624c3deac275554e29284a821a47a242e04e80e3c6c3cc5505e50a5683ea990e516433fc87137c4c97ba266960968cac61680233f614e4bfbc95b8eb816618b1e31799125c771a3bee774113c110868055a5e243e04a13e881f4ab2703ed11213b2e12a8b9fac099e68535fcaeaca7d18b99830365bac3f7eec9dfb2a62f63ef2242fd78874bdd6f2207b2521a1d7ad9d24927fab5a12320bb3dc47957baf6cc4455a59c2da3b5f5d2c2aa8c83cd00bd1d3098b1a073eb6ca46b16158646dea78a3f49e5f652c4a1ee1a07a37ebe227a617144d692b48fdc25eca1fcefd47149b1bf7d34febcbf3717d3df6a38cb4b243e6a7e4c460186a2ae77fc4a509e762b7031a083a00a87e3120ee86397f18b7b25cfc0b8a60e80c5041c2c2dbf4fbf3f9945a118dfb94206eb96c370ea9d70293b6f5d7e18a905405ff6f82048f47a1adb9dc21ae87d7c75c1beb6dc05a13379ecd4b6023c63bbe7728eaeec355e1bbc254f973913a30efc3c4c4aa03c037ddd42bd77e45dbe17684ce2b003ea8048074ef4b9790a8605ed380a9d21620dcbaa23f259070e1c0ca5452e73807dccf7007d24c96a22b01acf5c12451bcd2124a13a6c181ae8247e381b6faffbfc12239719941e46ffd70362198b0fe589c81609d5db431b77aa4827ec2d8bf93ef7d34a88ff3f1b2a454e49f3f2abbafc7b2ccc6ac51f6d71fc9860bb4cce31857e86b4f599d5dc8b47e17fe2d90c68b60181139ac7d81000839881bfc3c9d6f8be8fe432ca887e585481de0e086241b84aec3994c12e02775c83b3a9dfe308fc0d633b59bfca36b4292869e34ea5fb48077e86516ee37a03dac1d47005e0c71df7e3234f6357803f71177be82eb31e05bf41a1c322edcbd915ce030d6ae06493cb71f635b35a7213304f7d95b4fa015851714cbfceaa8967e3f66d853bd7e6ec5d6b4da60bfea15fd58af0d37d559aa4e40b87b055b7366f5244a6f695e02414c50acb2980f34d8adc07bedfe55db07a66529b19a502e55694e3647bf749d0a9c15fd35108541fb5ddefb17b00c5b9cd5f9884d324b109848689468bced2936b9a4cd608055022c5a056e1b467c14541070759c07f0210e8110c47108e238e4d258e6a289b48294b01296df23c00b17d2c458e5248da8fda78d29256da26d8914f1922f1ff7a96ee20777491152848490c397470d79e9370ff633c2cccccccc48644a01821522151e1430fd59edb90a7375cbfebe7aed7dd6dd628c59b8db54188701e3f334cff224cff114cff004cfeff4ced334cdd224cdd114cdd004cdcff4ccb334cbb224cbb114cbb004cbaff4ca9334c99224c99114c99004c98ff4c87334c77224c77114c77004c76ff4c65334c55224c55114c55004c54ff4c43334c33224c33114c33004c32ff4c21334c11224c11114c11004c10ff4c0f333bff223bff113bff003bfeff3bed333bdd223bdd113bdd003bdcff33cedaaef2cd5da55fdebd5a8dbd7199beacfea77c6628c3dadc3186bdce529f0abc264aeee79774fc98b81bbac0363fc0277f90ac64d7c5f550ddb4cd8986f31c62b8c474272aa7bc981318681bb6c03c69805eef2103ab4abcae8d5c3f48df6a9eeb019fb72f50cf74cdcb6a6b3319b37f67dcb721bd0fc2907fb98961c04cbddc1502cc99f925ee879e43882deef7f8bbfb4e1af3b6b6ddcb6e68d7dace5608c6170878b30c63618e38c31c62ddbb65eaf5b77bfb6b3d7b77a65d577bfab8f79982ca6ea57ddedab7d56f57d77ac65bfde18e31a8c310e8c310d8731c60163dc02e3ac04632c0477188bdbd670cfc415b45b1bdeba369c85c1b68d50bbdb5485618c47186b3218e31ab8c39dd644510a63191a6ae14deb8096941643c43921cafa081e398648031a692e8f581c6b2b62cb3aa4b0a6d1e84d17d1d23b34368575d664cab495433cc153d2283d841322cd63c443d2233dc41044687ad34464cd69224edaa4316b8823348f116b08224e2c22cd834504499b5825161124d688658017ac8920e535858fe074d65a8c13a22782c8a195f5111ceb892072686d9a871673c41341e41004c6d2da7c48b1d0f8c68f4b0c8ee35aa79336e9d4ca48498f4eacd48cd112ddabb14a2c4effbcdc89d33074cc693422c1d0a39386912ae954aa345a41ea46265389855a0141e9d20c49cf2cc1158d4a31a7ad089a0cd62f2a3d8af9e15a268e53e9520b8e7be1e2c54c51ab0403064bc5e1550c1ba66895542aad6299f448c84873ac51894543a54f9af4f2c2719c1e914627fd3353d422a1564062e8110b887b7919e91357d23138bda28b71d2a6d248c7d025d28b7689c1ab538cd31685c96432a96636c0b96817312bdd2246a5633a9d63462a6e5452b18038138a7b89d934cd82f5a27f5e12eb850554d2a693e6382226d6cc06601c8bc6498fb46a23712f2a2ea557c474317863fdbc9c5671a8285a9b765991389256a552a399a2162a66d3c28d5a240e13c9b0914b15ad88d5c6a209a9d4d7715863fda219d1995cf03625856ffca0b4b4b412116642f753226aa54a51483105154344538a8a8a8a8a8a8a86ae5cb972e5ca952b4343434343435b8aa6b832944957b064d11245515151515151d1952b57ae5cb972658a2bda889b420b952d45536c1c152a54a850a142a5a8a8a8a8a8a8285ba1b2a5681b6da14205158d07890a152a54a850a182b150294d29116d65e641d252222a116da58987966d0aaa4a911694152d57b460d182ca42a252223a49719ae244056a084544a2829a32da52223a59395d396139653969196d3945312a2a1199a8380d9d884e534e544645a72adc1425221316531693165314a62ddc142629b82b2513513705868aae2273c5ca566e1e153253682960b6745194ba0e06466b199912514bcb82a5a569a132da322ae2a6e0ae64c1282d360ed0f049a748245d4a9d6268d0d8c145af348f4aa7f411ccc3c91317925e6dfa898ab545b145b1cd6c39a3b4932e6920275dd245b44e5b114824bdf9000849e33490d136ea80701cc9445a01d95aa712d7fad97610432348499f746e15d14a915c809448fab46956a6d291f4a6479a55d276d0da341745d6a9171a589b5aa5165e915a18638c310dac4b2d522baf46ad9c73cea4d6a8a5ad5a9aa669db6a6b6ddb66a58535d7da5adc4a6b71dcd6d25aa3d58806c638b4566e91562f39295386400adfd848d306070e3341e82f34b542d4d442bb168ac3ba51838cce4374d058d33ada961d90686d682b63749ec1060dade5568f9c193ac3c07001446753ab88c645ba5612532b89c6497a0e80c62df48a9795d65ba9d2196522e91d5bf983ce4bb41220b6a9eb6060b496f9f1c8016019cd6bcc649b6def906ee521999636e4b5b216194bdb52654bd73299a8e8346d0a10ebc7d4da34fdc3d2342b56b6b45e2c2d8bcf670d9172d03425228065646cd0346898d18e6d092c73012c3345b3e2639808b269d968b0ddc0a46538c2036486ee62e81f98ed0a9b16b08cc6c3c7302100fddaca6d8b141d0b25b808609916dac58a8f61e207dda3c3c9743e868954eb6808c0329ace51b08ca655baa47f644e584bcac730516a9dad3c35a83dad352d6019ed0a5846d3da962d8b26c536a34de988b66831695a9bb295db1455b672dbc20d116d525499d271449a6632c5a05ada96ad14b5a63529b672d49ad6a6d8ca722b4fade5d09ade88b6f2466b3ab63207adedd09ade8ab69287d67c684d6f57b6f287d680684d6f59846c5b3629b629362ab8218e889bb2953e684d7354b65200fa07bd44bbb4a661b6726b4de7a1546b9ca5791a63da66701458cb36a384f583b36c3301f0a1071e62f0369384f583b7b4b2e6391283b7991d583b31b98a902031789bd161fd6429f2162b3b7288c1db0c0eeb478b424b1694f5a3613159256bdc86362c5b95ad68b3b25da981f5a3497183f5a34dd1ca2c564c8c46a44d999161583058398a5666b1a27b715971555aac4ddb346d07165196acf1cfa985595448408a166ee116152d2c45eba42150442b8a56ced2da3477a5b5e9a22c012aad12c62893207215adac51ab1cac5339e3ad84633821b995df94cedaa499a056444a257c5a11c928d48a08096b534c101a5a38a7628228b54c41945a2a4d2663cc95603a52cc8dd616732a95541ba7ca44b82deb15114e9fba9892def448fbc91aa55f2e6b8cb74da350274d24eb530b07a1a145442b6bd52a87cb7ad318a34ee08228515c7044187211256ed35fb7c2231c63729131d680122f2b542c605231a7d2a9b49934fd03831aa2d5429f627e38189d57393098d64973ac1f2e05a351313f303734194d6b32da490a981a4cc820d23c645091824bd5a05183b59aa2c9a468a434265e14694e68da08ae685068333090a2480a9426396d3585e350a9d309460c9d4a91a6b434195adb66a4b48c19ac1f552b05c3fa71d14a71319c46c5aca29c4e1c97d27865844572c222119138294607e87e34265a3e88422369a4346efd14b169d1c8d56ac786514c60948aa604d6a6681c69053383d3283d4373a8130d191a8863e1215a9ce6f4abb9542a45032505ea84d2db2ae7a453a71327050dd68c193366a056a30674270d93622bf1c64971d229549b83d239a7d30985359954ea240306052303a582d15823735249c0c468545adc8f16a5c5b1b4a0c9c868522ca0d334a7bdac50b1881123c58f96a5054c0b867b61712a56aac4c56ca52de687d3af06d34295382dca89853529d966d3a470bab46ddc1663a3e182152dec02275a189146dcc6ad5cb455ce8b4ebdc4b8c4a834aa544aa550dc4b8ccb0ad6a6539c8a2ba954a5541095dea1e5ac7413545e58e854f641a771455863a9502cae8a225ce89fec441bd26468c46844dbcc14195ad39c158d4469aa282f60688e1b6169699a2bda4a1a286e8663fd70aa16b76da9d4b66da32bac11149a8ca6475cd1284af793ab6829b155d9a86824eb27aba0649b8d9b510546716a46cc0fd79a6132c9a8a165d48831e918318aa82143869e11f3a3226ac9907144115af9072dec82274f8a7256a8193ac56d467426bd696ea6b566b05eadc50491e6414303bdad8df5b369184c8bd3dcb6955cd136a395385d2a998a388e4ba5b895268556a4914e68250b9d574662b83687d33929bd43ebb40b184d069754a615d66472294543efd04a34582a4da6c42a75ad6d4b65938e31d43269548c189b8c18944ecde0343783d32cd34b09b764b05450b24d8c187ac706138359c48051e4a2d52286c58a4e55ca51b85409b5a54e1c4a974e3ac59d3828d9e6643ac5e4289acc496f50b20d67e248ba54fa51ad88ece8d186559a0c5ef190b0e46e24e3073f312f2f99db46a3159d6aa425a13232d2b9a4555c5ea17768a398956ab4ea562b5689e3f40f0c6645e44573b94937ea5e74a75f56ab17d6eab432926a8d56dab40292d2a395146d4ab7ca598d4a58a561b65207868b17bd62a5b5285a12a395dea1e9514a97f48f89f5e3a285e234148ab522a3502b544c93161a4aab74a775b6b20786c5b172d6398fa6b47256753a15b30232e26062a862e81f8eb40232d2402b4e23bdd2dd2a06abc41a9d542cb0bcbcbcbcbca038152b6b4f33bd60b5d0a2641bd349bbc474305bc942eb6c250b56cf4ff7b2d22bb4ce7ac58b56ad5e3addb3954db6190da54959a1f30ac80a0df4826aadd04d5eb4a6f1cb0bcb6505aaebb4d669d22aa753bdbcbcbc6852720e2eeb4de7179dd259bbbce81d5a4a9b74e0542b344a084a771aaf560441752cacc974ac9f953601e9f4488fba155d49a577682f31b895635c582b184c2bc5d2a4641b93d6a4e41cda9493c9a4d264f28c0b11b9883c7a81024d529d72869273fc8c4eab13775269ae536d198ade4c3ab532a2ad80acf448a74a2e5e6260460c7029e5553ee912698a890425db68194a8e8233941c65c4802e47d1240b988a68e9934ebd9c56a80d858ac92d2028cda550a89f26ad0dc50282d224cd9150bab5e9d28f4dd3b0aa0853d6b24c7921bd6815d18b6aca8b2a4a26ea5e3a95cbca25bfb8b8682a1514151415141594292e9973421515912a8a8a483545a5aa92895453549aa6daca175d5aad5aa8569a0a0a4cb79116504545a48a52e5c7a49aa24d2995583f996855650a6b8ae9a5547a5911a958295dca442a950a8a0a8a0a4a95176dc482292c58a888545358a8a2a8a2a8a0a8a0b0d02a2216aa292c54513a1699a853a9b0c6ad60a1f10a4ea582a282a282a2826281d4a673148de44c2c05604e85ca52ac985453ba2e77564670050a2c30c8a222524159a24a5195258a14a06512e002a6c60d2da382a29a5224a5eb5cc0d4b8a16512d09974ee5cc0d4b8a1655450b4152b23e85cdc504151117556a2b47e342b9d15cdca56e62aa64daba0a44e1a853ab17e3291155595934a554505054b4a09a34eafa27424544ad575a7943ea9ba953e9d56a91269a457da2a6b1717d62af5c3bde4fcd2bd68d38bb662fd74ad9594959495949594973c42a2a453da2aca4f8c49afa270ab244e27923e9d4ea6933e99669c34ad5aa13bcd6286ca455b69dca62a95348b55a954d22ad54aab4a3a9734ed42d35e68162e340bfd2246d5d25cb48b9816312c583f2b58dd8b8bb6529552acb7d442b17e8ad04c2c986e2b62232217b1e2485b36bc8a4232fdaca6a44c9bc9a4512b7d1adab8122b6b1aeb456b2b5ab0d0a512ebc745ab64d22e54ad52a75bc4606d8645cc8a18accd742c9629a634ca40e7c27a4bad1249a3f4296694816ec582c1b4b89456b14e5a5b01f9290228c5fac93fa84dcf182dd19df24aca4acac6b2f2a291a27058a55df22a09540bd6cf6aca4aca4a4a8bac5bb8689556b15eadb59ad27239e9ce546aa1593f79c50a95ee5c748b45ee4a2d6a9858702b54da4577ac95949514521ec120856ffc6c5494686596368262529954a8ac2ae90d011dd0498f5a9d0b24ba1f18986dd3265316181549a348122a86f5534469152575ca79049a8c957cc58a96477045234750f28665bc959492def408015d6efdc01075269d4f32de4a4ab641954a3239cb0d605652b20d691525db8c60a864c9b2955932eba788ac7fde524bc5fac929d6cf5b6a99348af5a345698d32ebc72d0285626db9b492b26d5145e1f4a6394ed56925a0a173f204296f5a6606a3db66ea34198d3371a61c13c3b5b89f1961d7023130a1f573a3a5c188a108d9a4e51b5a9a36a936256ca8e14687b914003a184dcb1aab23226b3b52311de6482492ee463a33c8f023b76cac48d5e83097a2314346eaeb304ce7e409ac8dda97a26134e25a45e4cc0313361e9bcc8fa985bb968b568c2adf1076f9a7c35894f0414bd334ad4e2367f2ea081e83173890812a38a1025ed0020f7c5aa1d26458a6cc526206ad9c5bdb86442aa7d35ad8051400014c6bb491b2d662325e05e1529b4ae37036e91d9a4be7e489cda449319d46e6d648e76d2b95583448ac1fa3961681d4aa1b699689894de3bcb1545dd64999341993c69a7b4297ea4adac9132392be613a82e29cd09d3a4edb48fdc82d138d5489d439794283e1be6e441a694268dda83c39c9ac2748261289442209d1da34c7d2b0cc88d3dc4ac8d622b5064004db8cf46815646b713f04686dad912691f02a8733658c6344446bdb98c8badb9648711ac923ca0c194f6109ad1f2e86870e63b14096510b63b1c011482d8cc5025184610b4a648d042368c1683258e798dcc219e3c038308b870eb7600b515aa4166ec1169cb434adca9a460bb7400b6168c1f0e83431a4b0114341bcb4aad8b1e10c012d6bdb2a479bc16959b4146e614ed3b82474ad4ea321246b16a759497524cd711c471a75a49426695266713f3098188c48a3d16854a335aa11c5a3114da6ae5103c645e7a25399a50cdcd023d3489b461ac834228d46a3d1103821a452297c438f46231aec8285493aff90482412878af9319958efd6329546dc68c49138184d11a64c722295228db84d2b6d58c0434c2489442afd90b489f56e2d9226b176747cc498462b549a8ca9c990769862caa3f168645c300e92bea16fe81a302e7ed0697a857190340c89a455180749efd0b2496b267de2c138483f267d32e992fe39e9d3496b402713abb4828914e7842e46d722b730574518362c2088324a40125b6ad3b4dc699ab66959cb2c1438818a1bdcd0507652446bd33bdbb6755a4b87f5cea685d3a269d9382a1b0abaceebb852c7c25908a9cf05b8a447bad34aa491cb6560e32ca06d2ccc65a11b755c12545c69e1165051d4aa69e11674c10badd44b0bfda3b158d1a55ab863d1c2305a380679b261d23f32b4309a31aac23836dd2266856d36cd22e605cb6c3623bd2226dbbcc0686dda65466bd32b1a365a9b4ea158ad4d9f62300e534cebc714431383839e61861b6690418619196cd890b151a3860d3568d0a881c68c1934cc9021e3860c181800c0c488c18a0103460c8c172ff40b172e6670d1a2850c2d58b0b0c162c58a1a2bba8e46f7f232e3c5c54586cb6a05b352a962a85229182914ea450bd53ab5b6ac5b9b69d399456bd339bf6094db5a9a76d9b62d97b2566174a435178c716416139cc6da5e88c845e40df502ee476ee56ed34e9ec82f26a05d30012a2ddcc22d4dd229d2496f31289d63469b46c5fc703fa7520cd0a6398cb641bcb430c6c1611c232223bd9d5a58d515d11a712d2e66fbc19a0c46e54d4b0adff8196155e745d95c505a5a362ddc022614a1951aa9482a9dd223bdc1e0c66ca94c2693494585164c9c16658b2aa5d28888545a142db4386d0b0f464934dd8d9f4ce4c336d342733aab42901b9063b3926d38fd73da60a0cd701a0bd1868588e846118d66a509536818e7176051e517745aab6391faba6d6873925a0277a5cb44445c1147c4b9d027a21c85c382050b90d46864d2aa91697bf1c2b465954724a5559b36a554aaedc50b952957ac5045024ab0c1e163bbfd289a23434e0c184cfdde67cb5c32d775bd33f6f5aecbabedfb7a17065381ded533f1aed7ab06b980da1df32d0e18ccbf5c130e18e320dc39b9e97959b6ed69b74cfb94a7474f0f1fb8f5402d1be4fa9fed41d3a3a302bb3c8ac003063c9cd8efeefbf5311e4af070c20386bbca846d65fa9dc95655f7cd23dfd023cb932d3c76f0f841083e10010ad429417407a85143a4870fda559728d1447af8a03f3bd3aeaa8d2c31750e73f6c312259aa6abfa0725fa9db15eb76aba1d6100d2fd3be3be494eab08c63c74ffb6ac4c3673d7242d225a0768edc018ff98421176dc008a1d453ba8ec98b203098c310170670495b7895fd517df311c366e4c6d6536e7e77ddf0f6d3e707b65c8c51e86a2e9f912877f77fbbae9cccd6090b1afcec118bf1d639c73b891038d1c3a280670d9d60be161dbc334fb6af75553aefe3ffbeacb05024727f7d00d21e1854080aeeb6142ebd6ae8fb57b47b3afa6697dd4986657fd440925c4781317fb5795fdabead2b1021d4d601ce34d5c8c3187310e1ac70a53770ef65d599dc6662dd75bbbfee5ce64da777675b1efaabafaeab9eb3bc64cc82bbc9059f9cc3ff20f18db40e3806682106850b435de65615c37795dcff9ccf5b377ddedf651fbca722d6359d83b635fafdac30955d37d100b836dee76ffae5e8571bdb2eef6ad7ed91f27548debee74fbac2a50bb632fbefa54b7ec5fbf866d957b998a310e22a6beebacf5419a75358dd086f9976f7bd060d0e5e004632cb3c161e3dab81d4081da1d6bfdbb839630f2ce58972cd6be2a805197cb0131fef57696afdeb72dcbb96782a2beb33cc8af28c698c518af308c3110c6f80763ac628c5f18631f8cf1ef18638e314e31c61b63dc83317661bc0463ac04630160ec03c63c608cf1118c7730c64630c645301ec2618c033e52e3ba7e7dd51e7478b9bbc70eacc37e770fe2b6352a08d67838d26ec280d8619223a6aa6ef7ea573b1b7bd995e7107a65310fdb6afbeaafce5895896f65fab35ac6beafdac407e9cebe5e1ffb41cab00b4b55d76565fef5b65b7b266cbab57fbdacabbb6fd977b7fe0de23b5b84870fafb63c2d5f55144d63b3b647ce9169320e598531184c38441e50dfa0659bbb3a8cd53a74e81919d9e66e5b93aa5e0df9d578385e966d7178b57d696ac04e4218608c85608c35e0ee77fbf0efee6a5f778fd6ef74dfe23e1891c57cf4236c8fd723e9aa0f57166b755e770fd982e07ac0dc0e5c118e880c18733e3047beecaa63fe0df2bade47f58171c6c175f9ac6a6be36741f8eee29e898dbbb2eacb3d0cc67252c61813c1dd1150e01999d5c36a3eccbb5ac78dee6acc05e38fbb0f061f1123d47a261ee398dbd6087920170cacf96a3e1cde26044deecfb49f274872ee3f1c3196d7a4b3d7abfa08b5afabfaf876c786f565d9567b9fddb2af7b84890db8b381a2b559c2da791cc6780663ac0028ec0e8c65300072c40002779e0d8c31da7d10dbb66caa8560e97e67311475b95e0f836d99cb9dc166b119c71863fca3e615d4fad7eb7dd8d95ed2b3fad7ab69f6abea1f44d7bcaa77f5ea7dd02b73d9d7f5abf63de89a776b9f958569776bdffa97866ddfea96ae59d2e3fa17dfbed5eceb8382fcbaa4a7e7871c84befab2ab777deb7bd0357bf5515ded83b67637130ff3ad8ebd6f8c75f567b5abbdeafad5fb6ccdbab0ad5d15b65f57fb540bed588d4f8dd73434edeb5583d6ed63da55758779f56b57ddb294d5ee0e7add0d8bf9d715728552ddbddab69bafaa7fffd6dd33d9ae6fd9ef53dd7ddf2c6c06db4c7c5635c6f255d5fac5b7d7ad97f5ed5f7ee66741e81eef5ad99ecff275c6aeebeede9d6977f67a7bd4575d55d7caf6e855d53d65b50fd24774f467b57ff1f4f041d5af77635b6d5bcf84dd21e243fbacaacfaaae9e49eb5ddf6a1fa4fdea5b9ab7895f656a3a19279d4c08723793ce9c30c6393837dcf33053018cb10f1c4dd383ec76efdcc83611ef5b1e1e370499994207ee6ed818e31efe860a608c7974efd3d5366de1f0001c7a743748413303631c00dce1d0028c31cecbbe5cd95e91f877bf487c5695860663dcc201453b9a208cf18e8ee603fbdd3eba7f5dd56dfd4e8723081c36608c7de08e660918e31c6a7a6a66e0c002c69807ee7058c118e3601b6c007ba2006b90c5862be0126c280a7550b1c14908eb3cb87bb26383070e916de86cc0354c01ac5203144ee0eec94e0d53c21635f850834e0d1e28865c834c0d30356030082aa4c0dd931d20c02818631ab668a1e14a0844a6a1ca14dc3dd92922038c310e6f608c310d321a7a70f76407f4408dcfcab641daaf6cd75f6d67ac9006e26a9b6af6d542eef65aa8f53ce81a17c672f6655b9986ed58cbaebaafdbd530d8d6ae77dd2d134a693c13f555ddd5bbda55fdeb15425dd9f6c5572124baa6af7b65fbea65beafaacfda5b96f52f5b64c3665c7ddb2dd35bafac5ebd4cb65f9a7dfbf62d6ceb756bcf5bf687deeff6b1b3dfdd6b7c8ce531f5d5fedd6a2b635b996cbb342ff7ff7bbdb5dbd23d417a56d5476d59dd83340cb655edddfd9209a1c2f6aafeaddf20baa6f5b297ef265e770fc4325955577df1688f44cb92bcdcfd72f9ce7225354e608cb10d28302ee1ce060930c6588622608c83e04e860674320021430e8cf10eb8b31185ce060d66d030c6588631608cb166f50c8c310fb89b010618e324b89b81f5017733c4d0440881c2878d2494d81802460c638c3b1ba28d1a309ed498420d1fc0a082711120cec278acea7ef510625fddfa34365bb55fd5fdae2cd7fef56ebdb5bb5f3c2dbd44897ed719cb530d83a941ad67b25f5dfb188b44bfdcad83a2ae1e9628d13c88988ba67b77e6fa4189ae795f3eaa0f7267baf5415a6b8c31007037e309c6f8c4dd8c21333c30a3c8753d67db1d1a1863dcc2dd0c16ec18e99e89eab93f42a4b73b680d627dd050e940a14183316ed1e001c69807773488a0b1a5fb967d91fcb8a199d1cdc0546c8942861619508c40061519443286607027e3e5b6352babbaad67b2b2dc8523c69bd8c478139b9334d313246d4c0f6e2ffab197e037434fc421b371df190bc4fd8bdbbcaa8f0debd36e6e03db9c85d9b4eecc06633c03c6b802186320dcc1682f84ea6a1fdbaece01dbb320bc7e6133d7b7baaf5b7316a6d1cfb2ad4c7b1850eb635a68c37cab577523bddea7ddafd6a143f7ed5fae76c6b515ccc800b12e57ad9971f510332e4de3cad43084a6697d5fbd2b23e4815c42a9ebc5dbed5d9750bb5735ad71b94b3d61ac6100671f31a0c018fbce7234c700f155d59eafac1682adaceefedd5d36d33ed5af3b8b69d7eb5dd7eb5defb35dd7c75cbddd41b299abafde75b17de6ba5c2fdfabd74a6e1784ceb1dfdd5fee7f5655bb423b08b6b56fb77663bbddb2320c3fd515727d56b5af5ee6aa4dbcf630f515d4725f55fbac6a8c6dbfdeed96b93216065383b4ab6abdeed7ab5befd36e984e5958aab766df55d5ddc354598ce5daddafbedfdd81380b4bb5abbe5ebdcedaae76cdf5ebb22fd7ab30996ce6ea17575f41fa5d7deb5fab5ae36a21d8bbfab69d71edaa9a095b44d7e8d5fb74bff44cfbce72bd7a26aa8ff62f1eddb5b8c15e93b40803c6b87b21d4967dbdb396cfaabe5eb648e722a67bd8acfb1747f2b2455cf880dbd9ebb23a186320b87381018c3d2cdd30753369bd6c91fd6e1f5d856d1e30c62fb87b91a37301058c7d541e2ccb83314682bb173abc6cdf403076478847f7af9aaa2fb6ddc118ffc0dd0b0a60d7f7ddfac892f8acaa4cb661ad6762040657ac742d9448a205d1900ddcb5e8f1a16b71d382a6c58d1a18e3ae85a945c7620a18b3ad17420ba5da779589da35fbea5716f3efbb31c62b30c630c018eb803b90c318dfc098a4038cf110dcad48420b18d774ffbe6a2cc6722b00f19deaee6130b6d53ed5ebe6faddaf57ebd5cb58cd16c118e3c8c1dd4945cdeb5df555617b6dfddbc46bd8cab62a9335c777967b1f9f65db9d77f56edaca91c55a9d26beaf415cd7b73e6b1059acd5f142a848fccccf7678f177cb5cd587d086f9237d7b1d1e049120623e7cd4bfb23d5c95c8cbb24730c63a6e607e5df7ab872cd6ea3c59c2151a5e9e0c8940cc9415e8000a8c600438b000f300981cfca0091f44f080078a8e239030c63950d3b5faa8b0edf242a8ee3b6385f6108c71b9aaafebbb7ef177c73cdbf58c8cf7bc9db16ef7428117228cf10fd909e7a77174dbcef80d4b5033342819190268028c1863114583310e3f8c3187310ea801684da307a0ddb6a67df1988fd9600144e1b6356eeb3b4c9da5366fec631cc6608c4197228cb1d65a6b1a1b6c4087e89eec10e14200acdfadbb07e2eaba65ef8c48cbb66d4e10dbb62c0f8df6f4681445d3d3a3d1f77b98d6a89e99f7e5a3b65abfdfc3647a34da3d4cddbff5aebb31c61bee5c7050e1ce65069715c65806ee565ac058870e57d53dda675557ff0ad2335ac78d96d171a357d5c7a76e5bb3dfdd5d18f780b1108c319e62a807976225cce1121eadc825fc924730b24b36815c89b72438194a9ac934e2b69cb186f30e5c0e1997728cb08673ce9ba69373296b396f2421b4ace59206e348cea45cc25a5ed56c1a892483d299d3346e4ae672d650790b5a3ee151e6b4cde7fca3e5ac99926834b4ac91382d4b41cb99a4e51d728c9c37cdf482d15672c930727e61da72954cd272d63657d638d449d45419c7944737b61c4de3becd7c21b395540434cc614d0399db64b89196373c72405642c61aeeba0e679cb9ace52a64937643ceda48d3b69cc36c934d59a5699a46ea916dd0344ecbde56939261aa21af58ccd02090479a8ccce52d636d47d3a8cc614d2561dd9313b0e19817643ccaa80cb42d933257caabbc51d13413ba6573cb9ac6694d7592c9a39c4b1e97c30a2f6b289249cb39e752ce68d634226ca47cd2b88d496669411b8e7c4a69d954cada0e4d06cdc66663c31bce2f99a46979c5751ba7c9d0342d9332f7f3e9464e8db43cca2e65d67420a54e5a4e4daa929677c8a69c372d735927dbd04ead8696d24ada286f59cb5a4a2b71791b6d67deb24c3e6555ce39479641436da56ce2b296339a330986e622735a1e71f9d45279d364c8dba6699cc6e553d3f20c0d954fd9c469396734dbd050a52d73262ee75ceafc12b4e130ca5b3e650e269f4e68ea071a3264007059d3485ac9e7ee8597d2c959cb5ace19072e6119c618e3608c8f608c6570b7da49c2823c45921aac79922085169e0b28610a487612bc1d92b005efc40c011b49c20ebc9118282850e402ac9122fb670a1d2e2043167eec1ade1903636326c1a503e55edd202f80cae4ce6218b7545181b1ca18308e2d609081664b9146d3b30116872ade0d38681a2bc8b045ab64a8128305aed26209ee192d006bce00186f18f7d5bf5bbbdd4909a71b60b7adf1b074bfabdaca6c7c67b9bace484e5034d86068a6b4da4ea5928c5369b46d2f543c4614619964482893c9a95ca84a0150bddb6a5b99a230800486482e5ae9c4d1ac6c981e1842f1a0ea1c8d8b119a48639484cba41b170ce918e2638501340ec50d9909c2107e9247a8cc088d9bb1e1f8c1100e3b4f5ebcf078b20131e20043324e3da85c4860e8478cd5e4a2b830d4d380ae74da5623200e01518c30712bb66f0623ba8081d30d407062a202022e5a6ab46345e9e484f81fac14a0c54806f50355438fc6dd503a0b70820b0029c00e1460e3040a2830184acdfe040cb0025fb20986649046a04a27096572d9ca2040361ba81f25234e1b484c3a34727ea04e3a2a24fd06cb50c7d190a8d2d9624542a57258406c600865d29121456268b475a34cda81841ae520ddd0ca21353bd960d221a14a325c7abcc8c01539c5705183871b4c32458ed46004ca54530a57611964a7a4e24a3346e8469e549c0d7a47e95442713623219cb9238f686c312318dec9c4b793ca900905e3541a316528a744930c7783bb41e2c0d00d2e9c8f110e23194e37b81a2fdf66a30043353679fb1b0e6e1b0d80054403d8f506421ff080162c563ec08125a0144180262ed0f7bc07082502f0818724487686e8a0839aa14c0d340040733288410e3834b066c82855c1c10d98d8c00e3939a0365ea8522418408182278a9858220317a842812432364c4002a900ac500517cb0005a81f2707aa54b48029e54908513451849e640c172994a9548386094aa0c47723457408f223a70252107000165b46157cc0031c28a2071e4a12c605b7032d59e0014707792a912c50810a28c048119c1c36a83218b42f685ed0a8e0a6d055d0a4d09230da9287a0054103c2e9072a1f683bd0a0d080b69f7cc36463546325438ba1bdc82e56b418b1d056e48e73d1522394763299342e6f399330c633562f1b8d6d05435c0286b821a41b649a743123566860683452956a188211dc053e2e866a890e90a00c71434e305035600c30740a0027804d86d44b52997e984c126a336fb0c190e9ca900b25469cca2d014eb655155448181a55313452cd00c290eac52182a1138c8b56ca31b2192541f42225030205e0a20cbdc4747ac3b1c2c604b3a28a028c703099a59bed65bb31bd1b0e6e480e312414c989a12d459ac1d1a4be2d732a8e06f56384432900a4192414e947e542e5e21423f5a214804d0c0520cdd8ac1460946588861f2ea65d34d8e050d50b690597371c5b0f6e67f5a2a4957a2875235269c5868e5eb864526a1b71aa6ddbb4adb499b613aa06b795929458bceca0569448a5bc953891b3e1b249c6b6652825337660c8c509235690381a261f05e0905000964be32ac6f0042144b1032d34c832f34152c51816302587470e3a4a76b542156c6ce85e4ca51f0460a44815396801961914e05181c00e092021083a98010b4cf001266c6a6a70d93c60f62ac06db77085298af0031fc48004451001841201f860a408901f33c81003c617a048c1073c4004015c366ab0eb0c2f2e48384210b1d5501563e8021794fc1003c68a20cc40062d6081094a0002054841800b8800f460a448101de44006385001151d220c41073998410c58b0820d2c81c413035c618a20fc80052b8022044e867c0f92b3623545139880041ac42005281841130b4880ef3d04c99959b1d2410e684081092cc089ef40e810e4474e0ed465c5e12630410739a8810c5280821180a009064871b24487203a72a0a5f8cdb058c1e12a9ac08423d480063288410a5000822618b000290970a20412b89628c9c1a6260c601822e4c5c508366a4c8982840f3d7818480012424d9ec0288c310db83b3d009faad8c6c089610406ed0ba60e701cd09ad098c8a0f66d5eae49e1d068361c360d63866c43ab519ab1c9d0604631328c530b162cb68e7b59b9742b172a19a91aa81527938954da48a4d168cbd86d6b62b395c318631718638f31a6813b8e05c6353518630d775b117a7af467f58c76fd2b94ca68edbbeaaeaa7655fdaa3a8750bbdbfde27aeb975db5abea572825e16ec301c6d884bb2d0618e31a70b7596005a55b1d813176c1ddaac9d683950430c629dc6d49e0253535353fe8d7ebb3fadbfca3d9b93ff70ba7b746505416e33dc8eb5db785a2eeeb8af126374132151324f92fd3718fa3387efc8380ff4a12dce35892a459823e7c40e985a10fcb5e8265b945ef39c07fe5c7f9efde3ef7f6ce9e84f7f5b38764398a9fe4e90836809ba0b8fd47760e7e25ffc8178af6640698bb3cbdf8c1937fa627b7f942d11ff202c4d134c3f183e2defe8fb0ed5fd705049ba502c853bcb37bfef43c087aa0277ae30b45bd4ff72eefd3fa188ae2f04023e4e66de2df95ede1b3aa3c7a56803f77fa45f1dc3edda5b8cf178a320172fded612e1c1c1e84e0fced87f0402384e69d1141d1d603b53bf6fd11dfd922373a2b8a6a1cc852b6399a1f697af0fcc21d763127e024bb2fcb310cbd37fa6ff6178a02e528e3f94bb104cbd4234b5ff23028235182bc4cbf07c3f13bc13e7628201f4f31154d2f9ee3e9991b01e9177a90939f697ee4fe6748f495a6577ea6e871b2777200f9005ed849f0dba6789efc9b9e7ff3116307b71fbd69eed193e9dfee13fefdb4f43dfce3f6fb0b43277bf4a377ee748365ca47b21be013bfd07f32f46029a6a7ff2f14757301beaf3cc192fca0679afe9c6523c8ced33efa8f04f906bd9dbe50b4cd43a9197efcfc38088ae968aa45809e83dbefbd49f004bde7bd509488f4f34ad17b914c3f6f7fa9f7425102905d24b71fcd9dfeff6d717ca1686c88d234c91e9e69e89529274ff385a22fcb0ea097fc3cff0f7f5892a6087e2f14fd4290ff133d3f8669187ea9c8c7178afa089d231fcbf1db29ffbcbf4beed3840cc9733c3f587edded411ceca239726f9f2508faeebd50b46fdfa2a867d2c9cdc75ffa501c3d12fcfc0b45d70ddbf9669ff7a6efe01796a9f9f50dfa00c3d94d0f14bd017a77ffe3e7fdf4deb8c97493aee7497224c3b22cc3d4fbf2bcf9697df9bff21cc90ffe6fa63fc5214750c7e5e2a86b16043fc75f96e5d943febf0792b2947bdf68867ffbaffcbf0c59323cc1cfe31fc97fc8c9137ca1288af2acde04cb100cbdd2879e4cbd8f8486071a2137b24d44b663284ac648af9b69e995fc034f50343bcc7fe317a666f9f9f0876410203334f70896692f3d07cb6ffe8462ef3d3cc74e9622488ae60b453feb725d325754c913f43cbf4b3e92201f43f085a228ea3b5b04455134ede7eb7bdeff66f979ff3fe45ef842d1d7fb1ce153a6e71896a7777a650f53d17ba1a84ba373f3fd111e3ed2ee7ab9fb95e35dd7bb32123f15f9289ea60fb7e7edd2972f1c1c1d1d1a24373cbcdaf2a0288aba5c32f726c89b1ff75cfc4c6e92a5c94db19fe917491f72ff8ddc87a3f8811fe981a5287a4f4cc171fc7f3cf7c8cd9fa67b6f2ff4e5478ee416fffe3617717a4c9034d34fdc6358f27393dce59de5d97f0a9e9ef87ddff3986bf5301415c259c2f3431120ca93fb3d96630af6b41477f94251919cb9bcdb6ed9b7c424457f6e8ffcc6cfc16e7e1e269bf19c4ac0cf45313c3f3204c9effbf4879f92a4e84df1ebe1d7ffb905707a6927d36e7e7e92a2dfe72b00bff75d8a3efc76c84fd2f35e353e88e7289ae16896fe8f693fc31eccde4df2fcdb34fdff4c2f7da1288abe7cd6be48501e7a5896e3e667f991a1787ebcd5f70e8a2249627e3f76eff9de27d8c70ff2fcd4034330fc7e07c174770f4929eed46ff31b3d49a67c933547c2b3044b8fa7a9374712e45c6787af7fa1096ef113cf8ff7f1445118ccf39c1df2dcde4b3b2ff717764f34673e6debc687119f929ef99525f945f0f3a7e715f1cafe8d20088627d9bffd812f1475954476296ef087e6d7b94796636f0df1c41a2f8ae7fea1f7f6e6ff83a51742757d66a91f22a4f4faf6442f15ff0fbd6f933a740049d12c3ff8bf313cc72fec376010d30c4b6f9364298e62f947d067967a9c263dc88df759f71114d541674cc55d6e3efa9193e24fbf1a6e4020e3f9bb797edfa7fcf460f9e313c3f27be4ff4af3db1f19be509426879fa0d9bded7131f5bc789e2f145d3dccd5c4775713dfd71c7c70ef7de56796de2f4d729ffd85a23d7af0d28bfb237d797ee2c861bbf5f15b36f200f9e7e6097ae7f8d354ecaacbcb845e14c5115a5b282ab46e9e9baf05965f0886de27f717cbd3045f288a838363ce6e5aff06b9e981a2ddab3296a3a8dbfa57b6fb46d1d6bf6a0d37ae5575c9d8b6a368fbb23bfaaa06ad33d78a1c38b87bff3c15433005c7d27ba1a848ce5c6fecdbe09ce9577ad37fcf3d9304b7f8625d30d8e628eaf96a64fd81a228eacad85347788e5bdcdb9761dfa537c3ff5957eb6693a3f8bd97fa70fcfcef1e8e1ca6d8bdb7c7ce4113fcfc29be70c07026b4613257f50193c5d41b1495c554148dcdd622a84982dcf4c2ee6dce390f4b14f54cd8188a72cf04e714f7fec64f9afe2bcbbebffd32cfce3fd32cbf32dcdbeb25f942d176bf788eb27f663fc91d8efcf4e918f6178ab6afebc2e941f7a0df59ac861b944cc7cf7b49861f087a123cf70b455d6dcd98925f2a86fb134fd01cf70f5f28eaba48f11bbd8f93e706c390fb4ffe178afa576d830010f2707bd07f64fa81ddeffe5f288aa26feca3280da0577edf2739e9bdf413d3b1bf50d4fbf6e77ce1e7458ffcbcf736ef9c2c6328eaba5e977db93c8a02f1fce63fe5a67896bc34d3b37ca16810dbfad4d880fbeba2379e5bf4fc3bfff742d1be6e978bed288aa2382d1a9e1bee7908da478ad49cdc33bf5d96653f41f083fb85a23eab0a84a2be65f90c8e2f3577bad3eff3a5e899e1f94251178a8a34319635e160f28f3cbfb3e425ff21b8bf178aa26878438c655d3eadcb659a693dacaffbe572b9b3d6e59a21a36d60d5e0c3c264d060c30d190060dd103343cb30830c196ad890a9c1a24163064b064c0c1b305edce02226438bcfe5dbef6ad977bbde26be060b1b2b64e8f44be8f25c5c1b562fcbaa6452421ec8f536f12b0dea73bddec786d30da612c98611576e325a6ee267c0a3a28d0742c83eb6576ee38112304e611774c089168e01860176016e01c682598057805580a1c029c028c027c057b00970093009f008b00870083008b0950f78e0892643b87bb27376c1c708239a9314764113452d8c3318dcb646a87d576f23dbb19c244cbfb2457af4eb95f9aedfaf768dba6d8d7fb78fca64f306f03440040d3002c6b8a76d737af4da332323db6dd03a43d1233d23c6231ef8ceae3408b02aa1a1c1d1a1679a7455e6fd7e087aa435f27e3f446bad572503d04dbaeaf23eddbb847408323a81efec3ad3dda32304e8c01911e1d0612cf7030f73bddfc35c417ee52ec00022bf3d80a481d7ed5a870ecd5b4e4687a771bc6fdf548800f004e9d1da69f5d037ba4957997c1a870efdaaf13eddcfc8b86d8d4b7d61b3988dc744e391f202d15535907b03a8ddd9aac6707867b1b47bb57d493c7848591da086238ee000062400e4b635beb33a0889228331fe7648c0c8b58138417e256b3e1cdc3381c176cc0503c65807128c90c4c80e2251a07800a6d241a1c1181749a2012b4e8cf10270803056573d18eb78589aaaab8e8e280a8c5bbfaeaace016a1af4ea619ed611a3570fcbc16d6b62dbb7af4b644747d4b5fe5547fc0055765cbeb32b909414d4f625c0113b18a328baaa1a7da284275d80c962aaabacf17070cf4468b7edb6e1490f8681cfaab6fe5dfd0c8220c195263480316e65fe7581380bd3abeabe7ef56d87a92f2e6379d0202d2570f6a1fb207cbb5bf6bbaacfaad274cf848d9d4ea7138a87ae79bd2bf4b66a6f77cbcb8cb0454835aeba5b1f17f036dd1fe1aa27d4cab2ae4cc6b6fd75b787e977ebb5a542e206c6d875db9a976f598ce56e5be31ac0b880a11bd888a12106d0153104efd7cdd1040638a12ae006c65966803196c11ac4ae406b127516846f6533209685b9eb4cabbf478c7dddd94c100bf37cddb09dca68d7fb2fb465af0a53d3bd06f1edec9d7d57f79dead7dbaefb55a3d7bd7dba61ad1ad70bed580ea1967d775f774cbbaacfaabe2d9bb6f46cbfd8988fe9930ebe75db1aa1d4e5ba5b96826e005130c62f78d7bdaa31b5e5aeda756cb67addd598bb835c56479381104e78dd53a4c7f7e0b6355f0d880387876deee2107ad576cb8cf4c0183b016bdb1ccec2602d8cf1a6372d04d8c473db9aee5fd7afaed6bfaa2bc6b6ff6de26db8678247a1a151c80718639cee6532b57d5d34e6eea01bb7ad5165db65a36ba2058cb10e3d3880316ea28a2aaaa802638c3910b4448e1e57cbba7a340fb72d7a5bf6e56a967d51efb69e896f5fee7ebddcfd0a5ab19633c004dec01b058c359c019c010d6b1a788d90f1123803180317a8f2e6005b00630a2831812c18e3d54745e24a808a0430c611c0185389711f7ab07f0d8231ce48486186997674d3018cb13624278726206103125dc0186b2f14a0a50a10a002050f30c6230938808aec03740c3b30c699095b58c0106180c0124a8cf136819e52045e36f84102c618639cdf218cf3db04e3afe6acf170ac416c9bbedcfd32e26e096261bff54cf8966dae2180317e401218e306608c1980315ec094d1cce80512882082ee55d98c73567f57f7eeec89205de3a63357b3ab7ef175b73cb6a1191997abd6087920574cf6c1f9ed1250848388e9422dcfd6daed9e89aa250748b2d4742c41f890a4f54cb46f67ef5e7d54243d872e0828d9ec6461c0b8267db9fbddaf6cd6b66c0f8d1e3172e4480e5bc56d6b52b5490e1c737710df1f0796d2ad2390b16d07daaf026ea424200a13aa0085d503f19d82a18b1161dc3dbb623f83b1421e48a3fedd30d98ed9d8d8c8760c455bf64551148dc188e5d8eff6e17255c6f2b85c458c044172248707174fce9021ad1d970bc5182381008c3111c6f8004f126080d7bbee6e596d84852d390740530c5005635c008cb11118e3a1d8f6ddbf787a7a58ee5bb6478f9aa36bf8665fad6b70acddfbae72758644d774efd3ce5a195f7debbf6f35db7a2170acecaa378f5665ea0aba1f541dc30f017e72f0b384d713b5e7078daaf32307f3871255e607138c35ead6a06b8078ec755bf5ebeed7592bd3afeb3b8c95d132ef81623a368ba94d36115db36eee65ac0dabba5f405aaf7ef55d7d5737eb81764cb32dab5755b3e9d641ec0a7444d7702f73b5d0db7a19dbca34cb1c5d97c5374ce6dbd144824477fffaeef3f2a9d1fd1cfc2530c64598b31d734482c4c709c698081f0d608c0990faf07902c6788897bb755e3718e3010c797d8cb110aefbaa3115e6fe2160b87bb2f37f7ecff7e1ebfcf27b5fa6fb30b87bb2f34d1f7befa3d08205774f767c077c154fc513e1eec98e7ffd0b638c6b7c0489b534ef4ca65d186ccfe8559581ed97e5d135ae7fb9fbb589e89a99fdeecebedab5c195ed988caee9e9d142698dcfaafa54a66b5adfb77fd1d474af5998f6a9d6dec7476d5f75d5ecbbb2bca7c79dfdb8b3cd7daa7b7ab49709cd5ed7b7fe7d5d15c65fffddcdf5aac65c75dd2fee637cb7af67e2e2785f3e2a4cbb5c7d5d755563ad7f7d77b92a6be99ad75561ba070787e7c6ed615fee99e83df3aedef5adccb7329aab32f6d59bc867758f8fed957b99db0386b31eedaa5a7b99d0dbf3b2abfeaa9ee932dabbb0fd43d7f4f47899d0abbd6f5faf76bfaafdac653d102fc6988777f76b67655520a800c4033c4ca6b63c40548131de0163d9140c93b03cdd7504638cc3fe3588bb87743b02fb474f167a50d0f5a83d2f5c53b89898d1343237dcf3b085909630c642382f77eba028cf4d6f59ee8fbcab6792d384e7e61b4981d203e090d200639c43c76130c6413c3c1c67f5435c18acc5a5608c99741f9bb92bdb0388b3301ebce347c018cf70f6bb7d681a14e5b961ff8aa23c18630c5302040f40e8006102a1818001c2b4640a4c58e283252b58e28492254396c8c0862cd132184b544b38255a5092832c58ac28c180124928211a922979e51e253bb01eb24ea7c4c4dd931d253ac3ba121825a6ac044f81bb273b48f8c107378002774f767e70e287257e4802774f767e80fdd0936130989ab67ec755a36533184cfd2dedaa11c919921c20ad1dd74e2b4747b3ef377a62cd5723dbfea55d1bd29877dd56ea7bd0ae2a0483d17826aabb7a5913af5d55f7b85094bb6a0c4559d525737bb40b836d2ea37b6690c818e9d1a86bdd5ce8559bf42041a271d030d8ec6b57f5edab5d55f7e8d1a3c77796f708ad5bfbac2adbb5575b9e9b95555f99118d44d378b5e5e9a1b5e6e1c3fcc09a72e693311264a7a57b7a8f76bd9b44a33d3e2ccce57b8f665ffd69ee3bcb65b46f59dd33f379b57db5eb7d82fc8ae367b0cd0339cef4cc7c32467a64745090cfe208792137dcf3e00a792055dfa0cd32acc1e15756488f2be4817af4677b82f40809028633979017f2691c8a68d4f5afdaf6a0716897042ed03bfa062d86668da751edddcd43e3d0351ee63b0eddd3a33fdbb3d3b353039b71d8e65a08e6dfddce38df9a0dd27d9d6957c803a53377a6d9f765d9233de81b6e4073788c14b9e1065d23e481f47663fe5561305588c6316737dcf360f3691cbae6f5fab8aa4e7b665219233d1a87c6b9d100d035fa55635ef7757ba04d441731a2c8901d1976b211298c80a033b23b232c8ae06007888f1d9c9d2c3b1fd891753b4776d076c6b0c3841dd41d74d881861d503b20b1c31137e0eec80e477c1cc1a1db610bdd0e34d881ca112947068031c61d921c47b670c4031d0f141dcf920f20a902890c2421404285674b122349c82400e061421258129f2228d8014b112649d8245030c638c902920821490f8ad428c2f50803c618137182c8102b2237446ef88061c20d7cdc1832c4906e33e4868f1f427ce063899021ba0f8f31c69d909b1b3e5c213584f810c2f80725ba4608069b7d0f93c558cefe3548cbb66dce1225ec5f554dd3b26deb7f50a26bf4dad2353d3dbaa6fb77fb96b7744df7b2eddb254af60f4af4daea419628a1f94189aee95ee35859bd1ad13a43ba3fa22305770f83a9423a9d26748cc098b7827c119d2c3889ef6c0f1d2304d170101a415e90e8f8d01175686ee8b8d051e9701d102aa600c2842200b90110284600c409204a608cf1bbced81edf1f615b2f80952de263bb08f73224deddbee56b1096c7edde17e15e86e4c8cb77fb36c961797ef8577559598cedf1c266fb7b1f2b5b64e43372f958c1cbdd2f77d6d9221a9d91c9c93142ce0b302adbfe85628c7598b9e17df9a8b11b64b4bbaadaf5ed8671dfb556407c6301f9fdb16f9224bf2df2f0933eb6159c7ef438f985e3479e2a183d2f24bfd22b4d101c41317da1680ac5d9cff4fb21387e9f298667f992b96e52c03dcff33d8a5dfc3c308d79241b0af60739e726b9c1103cfb0926b979c9ed041ef7bc07cd2d82df34ffde3a6c57c093f45272ec2518f6b0f4a24e9ec066829e9a21f71e399a699a82a3e9beeb7edd95e5ae9891ad04229896656a8edc8bbbf45f7cfdd8482072d214d38fdc2158a69fd75f2d2bf330ffa2280fdb08441e829cfb3d82e6de64f821695f570427d83f930cf9f63e496e921cda4250f63035cf133cd3fed394dc2f17fbd720af07826e20e0e5099aa4579a3d1c4bd12b91d0e8d8ac9420fff8d7c3b134cd6e96dedc3e60f614f4c4defd26454f96e10b455977657b086d1e28fd488a7d9b22199a633996dc33c1d99e18c32f3cc7d487a727c594934e9022599ee5b7bdf845f10cc5ad03fe0b53cf13d33435bd2fe49d03e126cd6e9a242882a2779a6913fd1cf9988e5f3ffff89561d1ff1fe4a9c9bd175f2e14c5415264074565313e808d89b18b3e3d77173faf9bdb4b81bc7775b60df82f343b59fe1d7ebb044f53033cdd2798eefebb68720e8a2f9c97bb756e7c6c4b8ce20ed372fc4c7e06b165202d7d6a8aa4197233154b11dc30f0d3bf77cac7737fe6798ae70b457180d82ef053aff4e136b9b9f77992e20b453b8cfd2ea1f6fdb155193fefcfb2fbef3d10ec657980cd0264f8b767a6a019760f8aa5fffe48bb55a0f4be1f7ff7e3479afb7be94601b08b1d14c55ef612fcbc3c4df09bc13625d2f0831fe9913ef56528fed2f709f8d4f422c8b90f451ffe70bb5a7f804d022559768f87e27796e92fcbd42594ba56567557567587d8225096bb87273872eff4c21ea6ad8d8a397ee0e8edf31bbbe77da210aaebfa2cdbcafc06811114f7f747de3d49f6fe4bf70169698625f97f174933fd9fabc2fcabbe825caff7d91cf0c7b47fd00c7b173f714c4f225b127bfc9fb7bd2fb7f9c9542c5d5b034ad1243b787a91e4dc1cb9096463c02efd164dfe95e297a623b8ced86d0121d949ff859cf4db97a7e9e9d8a674f39ffca762f84b1304cbef85a27b534007453efed47b9fe427e8892f146dbb6b93528ee5297a2f6ed08f25c8bd178a7a991ae4da12e07192a79c8ba7ffff1bc5f085a2417ef5ad105b94d38b1e5896a4b84f530cc5138974eca0d8fbc8d3d314bf0f54b241114db393246882ffdbde1fd3d98600f024bdffcaf19bde2fcfd30462231afbfea67992fbfcccaf2ccbed00a34976cfeb2907c9d12447733b22053b08823e35775a9ebc93db13930cc7f1f4befc46302cbff0dd9c7c5fffc451fc76dac52e96e066006eee53dcde06c3d12cc9ee926d0500b927c3900cbf789221796e4684fe4b53ee4592f7f3733355b721b1e4dc04b9e779d3f33ce4436855905dfcbe49eef29fe6ffc2cf85a38d619be44fcb52ec62babd07c1178abab6e6d1c4907a72a71eb9d3f04c3f4f2cc3708626389a9fdc5ee9bbd9f7eb9d11e1a181a13c49937be3587ee2797a64f9854da65e088e672f4fcf4332d4d1bc406efef5d2e3bedc6907bdef85a247342afe388edf0fd3f4f4e2f74cf2c597685d00cbeda5252896e5f981e7987241144fefa55e687ebc93293f576d0b2637fd77a61c2cc50d8221d7b47096e638a6e3df63cabfffdde5f27ccb5c210f246a5938b76796637882e1199ea9e75810bb98fef24cbd09829ff7be2b94a0ffa3478ae0778a2027fd0b455d3db4297a0f4dd29be0787acf2bcbcf0a24198a7f2c39f8f5302cbf7108115a153e3fcff12cc5bf3f17cdd3f4d1a830a65e48a63cf53c78829df45e281ae457149d02089260b849cf3b3f6e8e3fe5e1e386878feef9962111f2426e783429841f04c1533c79498ebfdce7cb25733f2d0a27f9f12ff4f8374b2e9aa209059314bd910ccb747f0f929f7c3d921f9a14e1364bf3f326f97d5efc694c07ed09fb877d97a5099e62689add6b4e0847f2f3e5797e1f688a5cec2f145d83b6ccdd5a13ccf1939d8fa0c93d124c7faa31c12c4f3334fff9a5251745f27ca1e81240fe7962374f50f4cc31554219f2cf33d36f96a3e7f1f07b14c5d192306ed2ecfc7f6f2453f01c7710da963404c9d393607892e407cf3c010d09fe0c4b5f86e3ffba2fb7f7bd56ed0864f989dbf33f2cf9fed22dbe5054c803ad409a1146d2ec207892e7ffe9089e5e11bc2992e3b73dee995f2c3f5523c2f78d29499a5df466e7de9902d186409afcfb5ed9fd48f2ee75b0a509a17ba2e7a1b9cbed4541faf313cf7f9edef43bf53d470b82f7857ff4ce9304fb364b0f0823099a244fc10e86a2074b9e83f6033025bf27bff44bc1f073317c693e00452e7efea5fe1b4bce797fa12801b41e7ce9f7b6efe227fecf5333cdd178e0fd0f473e9a25c84def0c7f4cdb41f7f8e7fff3cc1f829dfccc178afa685a3e0fec1b1447d2fbb4dca9f842d11f341d7c30fca1177aa4f7bc718be32bd572309e5e089ee0f6de988ea33f5d1ca41df4c0b3a7e13ef739f2fff23c688ad0e8dcbc4d726e009625789a22c93d91f7b4346d908ea9e99d65f7c693f44a6f64ff1aa4c3d4570f14a5c1c191a1118356037fa664b93769867d9ba43f69e091defca9d7c3cf7f100c3d2d8bffc6d314bde8b9e8c3f47b288aa201d066d0f717cf1d92e7e6dc83a57fa1288e911e342e0cd6a2e1818686e626074565309666eaf5d3e3a9e7c56f8e3128cbb2ff5e9ae20fc5d2043d18a4bff7938761ffc2530c39a8bd40343759ee6efaef913c044b1c1e1a9d1b22343c343f84d0e8dc1cd15ce0c9f36fefc9142cc3ef692de07fffff89ddeb5f7afe4e1240c3627adcf3e177ee3f92ddf33e9a1b1d146d3516f8bdc1d0f4e1e74df2a7a47fa5da0a3c938ba2e7fb1e37ff3c7ebe50b4affe6d12c311da6ddbd2eed6ad1b140dd25410a6252f47d30ccbd3f34e0f424182a20786a419fefe3fefa3ab474b01288aa3e7a7497e7d0c3dccd5b2aea0ddba86dcecd050508220f75e4a8a2649863ddcee5e7fd04e2092e2f789e1ff1be41c1cf70b4585da174547edca377edfb94d1e765e76d37ddd0d7371cf4311259a09ce4e7effa7255992fef3e438e426a69520ede19876b193a268f6921c49e04ff07fb3fcbe1314cd4f461bc1e879224f4ff39b3eede3b96741781f3d3411f8933cbff3f3f8177ed1e3de8fd68d0b93c5d41f2d04bcece7f6ceed4bce471e6e10a426f7fcb8d3f1a7e0187aa7156e86660fc931f54abe41fe9b789dd607b14342ed03dff4b6f9c91f8abd3c4970f4407aee9487dd2345b2931f049ff0baffe43f770fff7782fdd39c00b7f7a526999a216992fef354ad0364ca4d92fc25399e233f5372a671607fdeffc7bd3fc1ef41cf2c42a3739323a035f17939829ec8f7e88527efa65674f62ffdbd8ba1e7fc24ffd957558850eb673bd0fc684c7c61ff23f7d26f969ff7f6df8067963c14f728861f3c4dd06ba0ecff8327efe927cfeebfbec407419183bc9b61f8d394e4193041303ccd4d8ae4177a5f9a62603447f2ff718f613a863f3c2fe08d22f981de478a6695b414bd33dd2617c9d2fbdf02e90ebffe91dbfb7e14f95956804c4113f45213e4e7e889e048815d92673a8a7c24439214495189341c4f0ffaf1fb48bfc1f19b002f491f9ea6e985e628f6540264ea6d4e76cf13b9f7bae709a5ae578807cd4debdfd703117a65b19cd5c80d01b40888274f77287ee5789669f73c8d0a49825f8d0601902cc99ff64eeecfb907862f142500017c3b7359181fc0009cd01ef079f39fa6d8fdffdf9761364273c0599afdf360f752708b2479a2280ece901b0f4b3710f7af1e16d092087f69f2f49b9f687ea717bf0690a35792df79722f147b3f471d8d015e398665288ae20ef9e723b880d10b453efad47fe60ebbb8a77033f4634f77e8f7d9c3bd15e0a57e971cfca4986a52c833254b5104d39f821c147900b4047c25989e27f89567e8a5222717a045014db0343d6e9ae61e430f72251a1222dfff8fe24882e2ff9eb95f28ca6a503c69f6b0f4beff63e72702486f8efdfc42b17f10f44a5023f2c4713ccdf44bc37114bd511c423b409972133c493214f9f640ce13a01d919e60373b0fcbf4fbc68f7b21ed49f8a5e426c1d2fb6e7addf44c684ece1d8e1ef9c77d86dfc73dd9836680f4db5efa77698ae6e79f99442b40289abe9b671996645a8aa36644ba79ea4f30f4e117bf2f745bf5bb3cd07e73b4a1f13c5372ff9224417e7e7ebf50f4dd28aa235731f64ea6699a96e7087672ec44f218bcc7cbcf4d7f9ea9e8c3af7ca1e8db7a26282ad4beaee76beba6f56feb99ac4150343f208b6104c10e9efc047fe89ddcfcc2107a4ea66199927ce4a950fbae39efbaf9e6e14806831892e799923f1d41ee8da187a240f217caddcd7f7e69389e5ef0fd4bfd178263f74e4f9e22151ce4e43f47feb968865be4af55cd5df0e0363d3fc5b00c39f7dce4c2f65e5a96e737fa31f452f3dc4208865af0bc9f921b4c45532cbd78fa174e8f9b968d711f7ce42cf8f47fa417ee4e8efdfb32ef7b50c682b8cf6f8bbc7b716fcf13fd0b455f3d7ad0f0dcb87d9db13c9aa83f50144585c85700bbf86df30cff2996e70ec329ce510c49cf34d370f7b49fe40b45adc041917b631f41102ccdeecf5c05f11bc9fe7dcf0cbdf991e529e485bcdcad43438e201bc4e381368c070f1f449ac854f020d8bfb19769c8c9fd95e50b4551d415f2402e170ce68350f46382a2ae4b873c056f87fce4e0177efc7f2f9652d8a5f7d3f48b1fc9d394effd2347617b69987a8f14c1733c39f9a1e0f917f66f14f7f789e4378e52809b9f9c3441b27f9e1786fc85a25f7e42588ee1478a3ef5e70fbf373ac1f4407024cb13f44e70ec2f77bf7cebe2b9f1b074f304ed23281ab45b9cdc847d825fec5ecab9f8fd0f722674fe8d26e77c8f9fc8c15d2e812cb72fc7d077af831f77b960e9eebef52f4cfd6b121485c1768f4c252b81e4229876f38367cad371fc2f221e36eb2c111475b76e9293e0533114bfee756fdc696992373989bca573af04395996262f77d8bf8c84ef13c1ed71500cbfc8d3f31fe124bd74f7fdf951dce527bf178aea96fd493c0fb9896c84af3cbfd2dcdf87a50fc7f47ba168f740e42288602f7be84bcf34531224ff4c46845f9ee5deff3cfb173f999e7d9d9979085f4a96641f4d503c3fefed2d84ff91e4f7a5ffdca6588efb04c27383044599e42836f7c04dee32255332ed5ffa42d11c04bebdf4143bdfdfe8cd91245f3c373b283a440642699a9ff7bdbeb959f6f1933f207f29feb48b1b04c9b07fdf0df73cc0603b8604456f82641fecb2fc3ed3fbe3e979df499a3df0c234e5654f4530dd24e7fe074d129a2037b24de4ddb01f28bafaf7ddb0df661e78e4b753d1fff08bdb8fe34933e3f9ba5f770d422373d3fac84ae41d9c64798a6437cfb24cb9f841f65d836829bdf33bbb687aa7498ea06fe25714c541511e34ad9b1b58d6010fc76f7ea03f3de96d900479cec1988e69faff399ebd8b1c4c71e08de428869ef97bf8c7540c5f383969be41eab9676eb0a7de0fcb7f9236107f197e677a9e604a7ee719d600f4a2e8f17177f2fbbdc19106e636bb09faf3e45e4ccbeeb39ca6c8c1702c7d7992662ffb6edf2639343430d8ee41e3babeedbd75930445bb5f6728ca5525f20c46909fe0b777e7fb03bd0c4a7104399996e9df1de41e8c41bac5d2831f1fcd31e567c961708ade09829eb7ff0ef998f6178ae2dc28c92ff82337c1ef75cf43738326f9c291b1ad0f1495b16ddfd905fef43e377f1fbf7187a257be50b405296882fe9f5f9a8abd2cc314cb1f3d33047de9474ffcfa28be70fccac27aa0a85f59186fd1fcc82c28436e7abe144d31e564989a3baf80fc69c9f7f7bce93fbe43530523097e353f64284c52f4e239a6e3b74feefdff42511c720ac88f8bdcfff47bdc0c535ebe50140727080d4f8c6d7f702f4382a208c828e0e1f74d92e49f7b21497e7f02131447d17b64d9c1701cc5d249bee2f1d2f77ea6e307faeea5de04fd7fe22792fd0bc17dfeb497c0fbdcf3ff2bbff720e761f82393a0143f30ede479f2fe79cf879b1e79041ee7e4797a3e24cf321d3f17c1778ee5f7bc7f9f76311ccb19ef088db7838c6b881c821d76323d3d90043dcf23790982ef91a53f4b103c4932ed62119dc30ae999bf7fbc0c47d1fcdfee2f1465df356709cf0f373af9035e79ee9df63f86db3ccd3074650ff0f38bfff4f84fcd907bbe3f319a9f8fdce4e5688ee7f7e40b457196e0ccc8dcb4fe079dec8478fecff9e7811f34cdfe851d10b909a6def949311d7b4a8646640e9c1ed94192f31d721e82e728924df491939f1fd3132cc5cf7ff185241785a017bd98eed3fba1d97d9999f822f7e3fedd2cf7f75ef95f288a43246fa0fce1e8479f7a1ff6f3f386a82f6c462443c91a00773a8a9be4a91fcd93343d9ebcc4f79e2f47fe913e0cbf901c33b0fbeea6f9bff97dde19a6ffc543c640987a20e7a2f77fe4de4bcd0bfc2f2553b183a6e729b97f58a59f64e83db0fcde09faee9133323ab2054ccf7b9f8b67d9c1b40cc13357e09be5d84b31f5db87a9197ab0dde326c67df0e1fa9902e7d7cb7e82df7fe5f7f8e8bd5074f53017f74c5cbd959530cfeec5d2f367b8539104f9cb0583cd3e8ae2e004698dc462413212f204c42f4df9e764ea79e2e785de0c0f9a96cceb234b807bbd1cbd497efffc42ff431d7e50d46382a231dee406488e80e8bfced3a3f1a8e4adcf768118e528858c218440ab66000000e31300203020180cc6e34191286831d7071480097ab45672489a88932c8c5118c48c41c610420800849019101122db20006b60c6a70a588121b9f9666f6e7a5e452c6023d2c2c46f6dbfe848611a512a36bc3d3c2bce6ee03d5b47a6f90c6b25ae4c0211444b739dd53b1df0f12782437cce4350ec421cacdaa15790b6a9bdf1e49f9c7c13d690ca63e146e491bce3423b0f62753d775e1fdfbbc77c93091871d8799a3938dc4c028d42a389c069fe3465b83d2215287a05ef1a929f39cc0413fcf26bb8852be1f3647b4ac8a10fd22d04409b865fc1f6ed24f14d8d4a57fca158369e053590f6d62da3896a7b77554c1feda7fde742750a78441909f3c28fdce67442d860cbfcc5253f4cc26ec9e7e85d11cd95550e2164e0ad32a7be94f6670f724eb66087da5d541dd03fa22f84f3250fab182cf39eb07d6c118982521701329ae2eaa1e080d1fe2c685052e93b68e9c7af7c9861fc4c13c4a98b8103a7caf6dc8ad8ae147ff6be3d736f611c5e8214a8f55390e036a35fd3f4edeb74a963761346849f7b6af2808851714b614b8c35208e299e805d00d626d1c8dc1f218106da04ee156a3bcc65123f99870481aa78c45236e83af3e872efeed211db79e28efb5f842bf308791fe8ceb5420f96df3806e0c1b5edcb05825cd70d117f1f93ce7ccb41ff03b03dac3312bd710c9e73554a7e2fe0921f698120caebc885c2870cd82164b8646deab81101718924170b17be075a86c797289db2b3b88d7f58ce0813046deb57a89f851cc37d8fd5c8ccc16b23535d51b9c63a78a1d6e8a9939d9bfa30e98218c683cc6d3a4dc1cef7f69d7af3271d2b76306879b786c38921f9c0bc2010dd08dd4c7258253cb31c5007f25e634f5b924256a846a68e1ddcf04ed5a85512121726bd0ab0ca7861a4b95b0f359878efbcf863456c5121d6e49e55e6252ee9d6966e2469c0eec87134f022dfe483e5d33f2652a663ed9edff86d2067f4f1f5e93ff093194af9f596705e712e57b51192deddd126653e428bde7f3edfd3c38d721aa5414a10f39a53e045f7425654b4ba5a117b3d4ecf23fe594499fd23bb4e54877e89e13d731c3ece547c7b6d47ac5865523d7838583454e911daa3a23e150fc5a98e4b5211d843c2528e182ce6a13661f2900bd9638e599248316303232427cda054e5b1069be2ed1029c5131999f107eb4e081d53b40335e45d6f77d0671e40e7d9fa55605ddfb689f5f427429bcde818f48b2cdd9b17b051d463b0d1757c2128e5bcc4767923b8b135200b22a7089532105ead9a36d677eaf14dd317b110c75c8d087523496fac02d34f8214ba4aa2387bf0d494c9140bc2fdbf36a4d93f93977491cc0b4fe6a76032637c4b41df3429ff1db3802435d10ddc773dd93702acf5c4cc67853529c3e7083f1d43a80b3e42ff0a8d071e04345c671a4e520192fb01da0847cab656486d48c2844d822ea584d8d8f144b2c608110947b6c020125bb613367174d49965edc374d1119ca9d16e278703ad3b4c38de5fecc94ccd7b783f7efdec14f35e409c500d2500fbc909505a911970dd49825ec70b07758cb799096ab0235d3087f05fa9d3322be1936f582be7dec6e57ac79177d4250aa5220b874c4dc2b485c58e968fac0c51b5d77d18c2e119526d2cc5caffb1d8b3c77e413cd2954e146d336de683ad97c24dafbe10ee157f5713ca26b7f619380caa7e09ca6d080f4e5884557bdd1d0359f8d999ee3a736bcdcc34fa3dbe42b5ae3d162064d8a84ed9e584528de07c6c32021129267c06695ad45d6a22fe507146efa004685af66ef2e32adf3d8298697b6766f86719ed990dff5396e707b4a40f34901ad3067f02c612fe946a005177ab1380fcfc636f3cee37308f4c7592bbe3d2a670023df0be0e2e3bf1df52ec15df6bca422f26ae3e6c4eb6ac6f0ced31ff031a89244b9b7f3425084d82a067e5a17daba8df3cc933b598486e87bdd18e9461c8f898bf54f8f85b4fb97964a6ec459d797da24ac467044b06a7b34a209cae48f69ca3b0a727506c23ef1ab7bd7554372824a3576e3c8e74c1e447c2bb3e003c4d46883277c76814d90606d746e1d01aea390d7ebce53cd123b81277d2422b1c1628fa724fd3426a244d2c6875b72ce844477bca637571bf3c1c6dbeb63012d5c98bde4e8edde00e61de7ae6aacd138c325ea8d6320f6f09979619d4dcf7c60e6ebdd31e96010dcc8d8f7201a199b519bc7045b7712c7b77f0dd6ecb65baa61c0c4ea8159b421d322ffb32652b2d71ad2a8b2c089f994a370f0ce5dbb252d1591e75f3d5b53eb6901288ff4b29330b0542fdb0b08e51082a6692436124a94114d03218998c7ad1f7eef37f707d8555adb2169973dfd1ee3e4f2c0bf782a4c2a677679be91e45be0b1d9ad5f0d105b845bc94e969f71e7c7f08baaa1d1b25d4b07cc4e8fddf6ef119e046364111baa76e4ddf43c6520f03987b8857b9371e781be21538ff2f53cfcfd2f333f5fc4c3d3f133dcf069b4064d8b4c5d4f3b7f4fc6c3d3f5bcfcfd0f3b1ade76f83d3d522ec1390c1e88f5f7434842376b72010bcd982f911f70bec8908f003da256665a601993db8b8f3b74a74e0a0485a1f6305f87b1b9423d0d1f1f2c4d2397d3b7f8757ec7235370abbd0c0994dc8769bf6b31c32d6e1c8baaea5d1f5cc06c83db6893dc2bee994aa2c4844208e4d2c32cdbb8f7914236bcb35a678f6af58e300c4cb4b9e8f4a784300d34236be98b19e32ed62b8dc1a6ae3525d8934a390984577c00f04000ea0795c2f8b8a55f8471b34737e8a974114ab91c6096a601bdb421adac3eaa7fc9895e38343482d4bb665167d391f5d72607d9475dd548f2d94c28e00a41735c4899ded6afd4c2bc02ad9c85e1b71b288c957fc8acc865ca423d098ba5c24b51b76d0b53ae91466070fef63022aeddbb64d606beeed0e922027dad4aad2ea16263966b3516b3912ae322847fba6d658b6a5533a01231d593705c36780ac8aebeb9c3c817e8b81366fa52c6598866f54d8ad1b375e5a0b017dd402f73dd7474a9c4d45f9a0afa0eac8b418f09b375cbe2977e98c89bec6eac67d9cfef0eeec0d0d8f089afe2bfd0d19fd06a101029eaad66460d2be7ed75d1b9372e2f0a757d7e5200dca69831036db3c708294d207d32d8cb3aa321ad78ca35558127ea323dc6b051aefdb08139108717b599beaec7dc135d3c45c4f3e72cd2ac261994930a490ab4671668534c2a57cd03c4e69fc7982872b7be00fba28acc4b36e30da3855f904b8e5d38cb10b03fa2a31eea7b094e19b5b38fe7772f507ffcdc285f62296c4094921abb6c0eb949ef2027d63f197f688e59a474c23d14d6e44b7cfec45ff4d87e0e48fc2fa22bb125964f0c5b015cf646ab649a463b8ab93270e7dae661a363c29031d6db69f611eb4906f8256b5ff88c3b0853934ec3399d250b56cf2947fbf22e79c140b4f1b75a6c9f0a57863f4707ee7db9b86d5b4c987a2f9c50e9403c4919be8fe130fefeaea736618759f7672f5aca37b7d9a2e6be1adfb567883734e515b94c02475beae16efd57acba6ec471afd62a05f017ef74bac1548cecba9d485bf3d92c506281fc6fa060ba15ab815bb9a38b1b3028079b375506e1bd3b8440003d29d6805748912f403e26399b71d52ec4edcebaf08fc619b4304b817c59a2ab5a3b3c5cd27582baaa289a4a102676382aa591f2966273c87de38921e28b7275749aa5b48b03e9e7012bfc22783fe595d5a2d1ec860dbf2e891c9ac40e74d604c74f1044b5e34d00dccf0e9635712d8a64a384d87ae0476e5779c8df557747ff0fbbce01d01cc5d750c4868d7088ddfecb810518bcf52136cb72c99f3974668ffb06f577c6bd77e7812d4d51f7313a006fdc92b49e6181d3cf18b86b92350c3e8a4f11a2295b60764c3a5bc2ec6f74ca8874528a3a61529e1b68aaa7d3fc9394da2787faf65a2ccbad164ca1cde93a470e61fe0c8b1028a52203be96a94919404540b41f9af62456e9ea85e7ae7d552aec3d0445485bacbc40f27736df09aed90d6cb90f955217875e48298b2ce8a5bc6b742e6a89604647e03d43f6f63f254328bc23c9583155ef0bbd7b325fa8d045372017745c952dca14c8292665504bbe0d0511c3519408912b8ff756c2dd272da2c7a6f053ce75df8c8b0a92dd0d07de36f49283314b2cc37089cb7fdba9ec0e36da1cb1c51a90faf9384d9fba512c4f44d99f2da49a50fef54a6d0f7c31a8fa6da86cb19f757b2eda9303066236a6a22188c1cf89b54610309268be63f1f9e93a3959457a0874bccadbded11b44f24147ecf5f60aa106305972965eb4416b4fbf7c6605b38659c40a426aaeb6a425e35842f35a28ce6f1619c6ff6a11111ac10c4efa342ffe0f01f9b7c589c5dbb9f1f53443012a9e23a776c4185c77a77f894868cd36381c15e56fe3e887a371946bfc6206342de7f5da20abd4f56f633f4f6346cc9f6449a67c9d33034cc53a5c26302e8d974eb829214bccbaa4d06525c83e4936623d0cd6844bf11ff78e940caa4f48142a975a1516200af2463755f6b19a8ab270ccc0819c38b94dfea4915a56ca82118187e68d16f8c0f8849534f895ddf3607a3d094f79d79e06c3724ced9e4a62f50a89b8f94566e3deecefa32dad9cdc42e97f3bbbe8fac320b9972e848af1ba9036708ae9c6ab92f8b914e0110ae1da13293582f0ad4e1dd493859088cb442dfe28a0e84dacbdcd76757a639c447d3cd10031edf09e20c2212e2b79b37b53cebec4d15657da5d707a8c82d2a431707d562f21b4b8e32390dfa135dde676ce4adaa2e422a7164986f5d72fcd365aa7181302a310315c6d60daaaf09b05f760e04fbf67c1f96fe22a9328f80ad24e5fba36632eed0e9bee6ddc8592d2539d891c4f2c9e11f495102380941375d3f12f7cd31d369177b9b928ae84414b3a31f25d9e13c0ae0845fec04d0547a2a6831479b5a5d22e23ee36210a2d4afa2108beab812a5abf2d5498d5f65e2145d0ea555da2246a00436c0a8aa6e04b04a4d63fb20af48df9335f07200d9b01e17b9b67230677118194ea81f72c382e1e8b3a3d084d5616c037df8c5cfc97098911571b7c7af5b0b54633b3423c81589a24ec94fd71edb1fddc7cd7fcf11d2877dad78de3cbb487c20ac41459699c0e269a695d3a5ddb7e5c5a6703cde0132b0740d917b5ab581e2f871cda8f0aa1a6584767e936d440809945042f6e5793878424c6b3be0209faf13330fab52a8af4303ecdbdfccba6e7ac64ee26d2754dfc844328c2d7303e4aa96d5c53e75f9d4e7b78b37a27148f55152a41aae691645531cb37d907bc504d95b2c9c0765020db52d9af811683e4afe7c061e19f80d3d6d0afedbd65e19d92d47dc42b77186f45c41e4792ff9f850f66f5a2b2a3cefd48e996d13ab94beec2fe89df11e88f639479c1c83668a3e6f3b8518dc6fe770beb3a62a4029f517666ce516964375bb007e4eb20a7463a710f0c92e52fe812899b8a963a85b23cc92d70cf0c8b72ee88856f6b2f60991f15849292b1f26c364a3f776dba5f64834e930d3f435003eac49154cf707f07be28b609dd155fb8b7df11db586842bc8979e618d8a8f6ca160bcf92018206be3c7f7da4773dd758ebbd932271e3509fc39d0eb673bf2bcf84dd1432009e9e22dafd90527ddaf0e66627c24c455aab83955a465c3986226f0c57830bd99d9bf048bba0b1e4f7cf976d24dd07dab16c19829a80a4e9e6e4d29f52bd740f456b192645cbe8e7e208def7b0856e41be57f6f1eb9f3b9cc8924ae2b0f51ca4f4d27388135d6fb7c19b022fd95af9eeb5c3a6cbaf558c33d8180e5da54b561201f2b12e62cb4514d8fd72c4d3633cbd68997948cd6048f1b31801c913e8490c8b31fb85c240083b6b5b332ffa65d60bbc9226c38c70649e424448ff7de823c76ce9ef4cd46361a9dc30f09989371d9b42ca192419996cba607a0cb46330d29adba6cf42e5bb6961606a35d36ddf56836322784f2e190cfb05586e277d021042dde34bd6c5a5be3adb8974d879797faf9b2f9c81fcfdc0d85fd2f7ed44b73b9604b0062d498b765b105b12161628a21d8079d34fe5d0f4b2dcca6a5288eb3d4348db5d8e8a81b93ad636510b3754a9598add943d86915b369f0c53d422f66bbad8dc1a0315b3f11f75f68877d8ed93a9f3e66ebbea407fb7a0f1dfd44099c856ccc92a62a62414915596b2f85b4939352f4595c4ca1bab4e43df6f7a4d03b715ce0b32f8a8bf4bf8ced57359b0c46ef828ceebe729a6aa6b36d6059a4926fe9fbc50ccefeb4e19da3cb5b3b9a2f751953eee5539e73dbc3c3749f305f0470719c8e6c047a8dc18996d6d09000cbb39a204efedbb6565cc9ef783721e2acbfc3ea4bf9b21221b8b7e245de1ccd8f35178bee8de3dadb6edf8c1fdf5c8f8c12e7c2394f79f3b56c0162cf740559f9c1783be4b4bff4749633fa3b99e4125ce605ef8991a1b4eb23368346a83fbef5ecebbff440d09361d000e7162ce14f57f2af137bd54d900efaa929c95a809128f0d72320c39636429f6b0f4624f25e263b98a9387c2006d8350e3cdfa058d35ac4c9fe7bf6f03d59dc05d0c5840165b7ff9d8c9f76d78683fc34b553b326cc9c355f64d38e15ef1d608e4ddf0310003d4e989309642e888963d4419c3113e8fa8ef6d297e735c8c1b9b8756e9f787bb79258a350df6fac18313b3ae5cd0c1208e5c17fc8bd60aa640e61c39e411ec8962fad73d2cea9b6e807308c91c18ce9d7469b9bb26d494fa777ed6cc9c1b796feacaa9ea28923e3651673b7c3f392c29aa98b801176496d8cce1b7ddf7e7e7763434a888ee6290278470c8fd8a77ff706db6dfefab1b7edcf01d309c3b7bb29308475c0770567570b6cfc3df7156e48dac5fe379b737c59344ccc4a0f81a33b1b83cef494d3a2fc0972b9c4a229421c9c57ff4342651c5dec9ab4edb33794170166ed25fb86c241e742da3dd4c2c86f859c015a9e92fa3b01ef2e97d3ee890bc1f6ddc7f531487180dd7f76ff081f4d1de7d3e8737f392a292bbebbd181c83b4fdc118fe7e3d3ab10ead47cf8efc61f14dfd4421c17b831b99f0e3fad2cb8abe2855cb0dce7bfcf6de0182fdd52fc16a2a81ff8070139c8e09f6e1b5b2aa4cf6b753302a8bf3c246707d87b73b1c844565ff3d74500cdc4d2aa33016c56f9c49141ca95fff860133a7c87f56a21b2ed96369632b6a8a7766b3280ea66928f639e893017d8045062e8534047fbd701e2e9a211739f06c0b7ac9fc76e72038807b1062f92c80e75ca3f64e0e20a683e78821e16a3fa738a61078720c60c6f5d86dc3065b9911a19b4c4d1daf4434b6a06c13df888c6c08d1850484316d0170586e4228cc4dfa92d70dc60cc0f25e4751e8a4174316e90d39bc3e650b6366d62147db20f01a95fd446319a4f5ebea5deddcf2018b91e9a0e5f84d08c4286d17d1bf1d01e4f422d0f86185be2f03340bbece20b528c61513c0048f1ef8784cc00ed8b546a71098580242b0d1f63ac3631a3fcf039cec46d6e83e1d573411d79b6b31815c6a240746e4e856a68fcd98bab2982e4a96b8b3d4aff4985a6e8319721180d922ec1f0c0186174fbf51005db95bafc211c9e3665752977683c90400e20c46dffa11dcf0ea0ec3d84e99ed6e82ecd7707dae32db8bf39c747c67febef6c480812cc04efdd35156dd1ec7f82a826086d8776ebba3b55af3e12e914391ca27d7ed79f16c29c6b2db262e7a854e54e83cde83d997223044525117f30c29824132c5bfc7275fa1915d99ca6ef70d46a95860b7f6544f0c0ab92b9b401a9aa6edd1f92ae07350692d4e2d1edab2d0c8f5181540ac49dfa1a04942551c8d1a8fbd041f9e8cf0b7d72a28a98d2da78f1a258d080dd5c91b0ae5c3ba0f57aaeb2c70732eb63fef69fa87ebcf6750b3e826be00cc99d78bfdbfce8c058b5eb0bd4b13b0fc6737e0d2d6faa325e211f4e53090dcc196d8eb60b26d4ce4948b9f89bd5350a5e2f33b7e78daefc433a6c3c0b947601ff3614820bad0d0e235f55a3fbc4dbf1270f91aa5d33a30e7554c98bf1fd629f4f1fae663e655c294d562f85f9ff65e60768f13e6b27bea8ab7a0bcb67cdfb90c37db962d34420e39fe7d0c6c85941fb30c46fc7b010ae4d2312a73e10e6e3e4c84b5bdf23efa6eae727b6e77ed2df1312ac276298f988c09f382af607688cb19f4ebf9da1026924adf939ceae47ba4433a5acf519f64f5c18bd4234339788e7dfd2e2d8d417a8e158af4da8fe544166f55930812a7cd4ba70ccc6d054e8b2e080895f45ba34e2b2bf95a3ac2861f2542f9463da412797bc3959316cd0d1766f36404d5f28bd8a92da6fdd6b17666f7aa87ddebae43b450d13565994e0e5506bfff2776c40bee8208ec3ad4f5c832b29ddd2259cfd12e2f38ecffde410bf3332c6bd23f103e13cd0609b5152e939c3474dd635da09d7fdcc13d4ce524cee617665c9d158d7a74ca14eaea0ceea65d6a665e64696bff4581b74419bfcf8a219e44a0e52c6c48720cdddc03ff0fe07631d70bb779f5dc0bfc10b214117f1bebfbd36b917fb8368833d1fab5540f27e3e7356435be3a066a3da5b63c6faa37546bbd87cdea7d2ef8b8363a6ca4a317a5997404e26d616167dd9abadca3a4bae53408a7581837f3404c8042d9c8891b9f5a9a24fe51285fed5d3e062c9f80093de0b41abcacf63d56c1e6678635e4c6500bd498c9ae8b3034cb5becb9ad517c2d2be9b3ba6cd4a17d3af1ed2875cbead8d45fcc8a2d90ea9d3f42203ca5a651ccc70cc72ffb74f51aa3336a199fb71a83ba2da8126ca7eab06930fdc36b58afeb652da7d640078f9f70707bdd10e7d92b5499e68f4f0249979cd3dafb14e9dba63d2baef5e2147e8094c953a920859dac65f9f9777ecbbf849f7e5e1b8316b621fb4223fcb11ca7fe78103991ea637b7ee73ad5e98076d6431cee31c658085ed17e35a391b4bb42520281d23ca92bc7570e76c503d56fd26a5351f958e1809101dfa83a12ce7d006f3c6ad1ae753b88dfa8ffe6690d96e76fbe676cde15eedd52e1ec0d288938fd0e988d8864324eaedb9a995526df6f78826e2f8fabda41cfd0eb3f7a0c991bb65858b942eed925e36692650e7d562252dda18f0c8b116029671f642017bf10c96fd0fb9c8b5eef6cd88767ee9c01e6f898e818032fc16a11d20d2a6ef2ae67772dbde7ce8dd1c3c6f168b6e983c58740ae811234066bc63fcc136df97827fd5b3c541949043c635fbc41fa654d4ccb206d08aecdcdc132a3515e8e75b82df1567a38d3e9b7c91b04de9df7d726dec7f3b8cbf27f3cc3bc4005fb2d0f99db8d12d4b3ebf128d11be7678cb8d4d572d64761db41662abf4b6bf6c677162ca44c02abc8cde25f2cf99e670bda4b886b2c4a73d8f4838943e3791ed06e8cfeae98dc9a86205832cea3e2ca899f848095b1ae218735ca8a6b8bec9fb1c226ba8513b82a9f2b9a40559adbf74c2c5fa5d4a9245cbbc83dd898e43112de87e0909e4e11ca47e3b645dcc0cdf86536993c273a4f8069a1bb7ac529a9a91ee82043c51d5b8ee5cf7714c73792903d709e24946388441b1bfeff4dbf16a2ae27716454512581264cd05e42e5f34b9e5c5ed4de70e13ccb069a63188274bae8d36dc7ed0193df6c6412fa31643dad2ef555b125fc6176d945be63c93a1e956b633f6c10bff721a3dcd9cfd888feab7c1205af4de0fb67f49333aa3fd13f798d4a360bf5ff16c24ef53826b1719e2bd32e52c250b5cbe29dc8536deb8ea4316cf4be4e845a3c22323b6cd216a0197fa0168c1f871b2fd401cd49295e1520a13806df3c546171f83e7f40ff5c474673afe69df11200a61033551e00add3aaf11a282ad7f8d3ad047004af0ae87ffe5e9f1f804057617ab55e4a05ce6f8f07d3da6528a68c487c0db03c445bdeaebdb83ec9ee5a5683ae9778aeca376634f1ec1bc06fe1ab161ab45a8a583e4c6cc786448a0bffd757346642d0ae9a5fd726613121c3b8c5a6901b6dfec78a688f88f87bb21d70c42988e57bc1064fceffee1adff24ef3ad12ec386f7d55c3aa3bd7abbcb50a89a5e48ce21cc34aa729d04e93bcbedf4710438b49e19a30f3e00ed1652a5ec8580165010fc9ae302063a8cbd0da0861539a86d8477665ddd6658292047e35dc67cd0b12288b0d6b498d489369c74697ee56e0727135c008fbbe880179633d24caf10d6451c4627b0a6d764bc661bb0faf4e55d7a5b0131bd822eb48de80b25a046fac2b3cc7e53deafa635b8feb5b43f509db393837eaf5b587fd8f0eeeb83bb3ef0aa8da42fd4d9b0d41c8a1636cbeee357a39ced8c8f5b7060bb34acfa5ce67f1fa82e3d93b30d5c5fc269f36cc58d08b1cfd5cfe85cf872aa6e11ca2e1d1069660931f89ed6683813f5781f9dad3e862f371521377305f0e39011398b55b6ecb31f3ec0ec9c7ada4b5879665059c8f38246ccb047e5ca455254d70368f6cfab0945991ef3662bbeac464f169152dbe667246d32a3db1c7b4159d2d28ae7e2752b17193c9b036ff4f0e44004dadd59da0fb464b6e6f15af0f532390c3a8caf8f593bc26766c3c4f0eeed7a99ed242fef01be3ea91c570a8d615b7ede3d73d44028e98e06b0908add68f4edaf563b6c8893fdf907f408c99e4d6bc32fe0c8d74bb57ff71c184b9f07ab2caec664deb36ea01f43424ea3e233a67458eb54720b1b4ea51ec9e8d928874f6a67b5c9469699b3f55c417d4ad5fa8dcca3cf59e9def21657f9b92dfbffef045ac5852e2958bbe7a121c82357737f49cc41eeb00d3161363f3d709bcc5655e70e9411376011121088fcf1f7b15b440df53668ae2ae6ae493779623f2b129863e15027a04b9568006187b0e688cceda6d4bad7774c90275910d1c112a3a349f1079c25352c623651aa4aa59760fcf016f4c014cb6779ecf61a48a7178cf31b2a6b79af9421b50a02f13f901a6dbf51b006a7aef0ba552fdee47e5ce4429a5975de35ebbc34d59060541ba4492363ea01f93daad30817676c39025c6e399b555ef3b9e23242d12e1533fe803f3f3a87592f99ec3c2bd1c1805a6b207c0f44477a113985c792042de4cff4aebadca0d8e709d01a9b8d071ad7fd00d81b0edeb1a9e73ec84dc702f82c6de94920e357cc42e9893c6bf577407e654c8ed5771300e7862176a193468926f1e781d5496a62e51fcafcf0d69c6725d5c1ff792024f39b097df069ca52281049246281688646fb82fc8ad1037b1ca5d7d111f5f47d1b60d4f6f2aeb77b5bcdda5b5b739253664a0910afae620ed023c8e53fde7ec37105457b46494a03ca8f59c6ccf377920619ca507bece70371e35729e8ad32482124daf492e86248444c9aeadc44aef183474aff7632ad44c9f4075767722d1433bea6f22818bf07c5dda2761e95414d776b4cf692881fa9e3cfa034c6452ca02e696517295e6d36aca817e63d077c41d12793c7f699782fddcc9e0fb8bd9d66549adddf1ee443770f6e2b970e7a2d2fc36e0cc56f1fa9fbac33d2506695c5eb25d78c91ae77d699f002077bbdbfe3483e245336d20e0ee24f990f86e05c0753efc876916e693de844f733c6b3eab0a85b7c42c4efc2ee1ec4838ee5b93ed3f31f9f6f8eb882a0b00d7548eecfb0cb63682a039f9ecbe3d7897a5a3e6dab1969f1e06b09f56c3cde5158e3c1a4f85aa69d94969e0f01fbcba7dfe676bafceb0efdfed4d9c6830f342f74fd52f1cd6ade965bdb006c9273a0428d255879957f45a8b97d44d995763d8e09414c11a7b7ce7b35c3875d49f73e84ceca4142c7a4374aa35f9592472cb23697e26570988196ce879f421e59194fc59017ad2c0b8fb7208891741d03a487c0b94fbac1a28e9ad5f5b8630e283ab40606e3b39ed4745d957e73b69c12bc4be0c03588e0f7fe85ebd05ac9f0266e328c9528e385f26d61e3e093b8dda3f8f5fb3f6d62facb841bd7a7315b593c0e4dc3ea6383a543b60d0f40eb7f573afc4e20ecffe96e50bbbfa259547e67d3c90f88f9cd65280d39ff9f5f1449df5bda14c61daaabeefb34e40748e711f3eef46e02eec1c133f60cd516cf112271f397fbc0ffcf29e1000d21131df417681e5d087ec2a26ebd028d5d7d704780f9c80c4480dbd129c2856911bdc683e09d99f0f724bf75f900c8327f1dadae56bace9bcf953613d2198fd9ef0a1e629f27fb0b88c6e2775d21887549eebb02a7fbca78e88769004e8a0012a69fe74cbf06277fd4eeee53973a78e130e538df8e085dd32508ac5a87b0c7e449d8cd2fea824309bb84d641a3ad7b8318754e620fdcbe05c2a496306af49cc8f216bc16af068a1b9cc9810f3f6b0426acdf4a7ef86481b7f117f1714e49f689cfede165d8409f512263c28e4194dc99d8737ef0f114e3f0b881218fc30fe3e6077d03e25591614b2842b487618b63caf0d3309b128fa7992f8e6b3485275a0bf0f57007bb1f349d461ac7da1941936a5e1218250bb89d3513585e6c3c02bc667fcc97a209e7d4e63e83963568995f84d643f0c0ddd2d200b6b73279c6c817961f74dc7fe009df1c8f959365fe43a7f39d78768e48fe0de9ebb5b1947b7d6b127a3ef779f5ec00e222864f8f46679f27a400052e885845dac613e34639aacff9507e1a3a027cfbbb3cd9d7e30bda042db31c75720e4eed82acc9cd173efa13530fd880e072c654f72288d53e3554ef5c1ce81bc6ee13ede581a1d536b2c5167412eae18fab8d1dcc972a17b68c1cfad575d098e09fa11d604cc24a23a1e7115730b5e0517e27715acdb26ed2bb55c46130391245368c5f3c6830e33f2cf6d95e10799b0c8506fae0c4ff4befd10bd38f1b4531363417fd099b6af527873bfb3f09a49fe476ff18d77d749e6963c20f75b6cd470e4eb4c5b45d233e6e003c4ef06c7f499b20c0e4e5a6483a954ff80639c8b061f198b71006d600f07312a525c18a842c5f8cd800581d341723e331196a7ebb6c91add72592855da20c261e875c37c5990080a9f9546549d435f1c30726dc05c3fa51af33fb6ff68c8f552a3f2bc098fec3c0c0ff75189b14678dbc53c463653f6bcc6976e6880c986fa7542c1f8b695985fb1b8235ee8897f86e2341e595659f49781c77f318c8a02706d2f31dde7b8ecaeb00670abcaa72fba506a67ff6c52ddb4b769411eafceda6f6a65e674f88c5c3110dac9fdbf0e8c0a533aad127fd0f2ac6a691e7b598cb0ab03100541dab839f047879530f6c3ad50391b8a187ed19b647145427aa672405065fefe1eab7f91dea535b7f8add2fe54aa085dffd1f3522f3068b32e9df62d3f700788a0f2f75271a384af1abb7b9952e7d0463497aa58e84feacd1849791190383362ce6bd2ed152954eac354608ac3b12d0d0b4f2b5f42212e1bc4c478cd14c0a4655fafbfbc1f45a9975b674ab10d49f4650789829b94b79d6ae47d229bdc0c4bff32895fcf9445f888e0bec51e9727c3330ab3a89d44fe2484dd1a818681e13948c933d97d33732d5a6ec74e739f7e9375e6f5bb4d16d27b5fbc4e2e24fb6e5b816b9e4b2ee2cfa7317ceef7c92fca81b6c2e1d96d8dea6584b96980b069d90aae3fdc5a7452894acad9621990ae2a4065f8f45c9a0b88db575f8414ccba918e0df3d96b44c5bfc6d995114c30605d39703fb0f4872fc8c5aaa49bc0ff2710fa1d8a3c3d83728cb1f7e5000ffb9105fcef99910864daaa7a9b758428066a0965c7921da259b6a82901b06a1ff489696e0fbffe4b3e000f82aacc3c3cae5bf4bd26ddaa9aa8ae40070ab031631b1482174a2d79c601f8babf1804856ce21b833e342207d4dae8c0a9eb3f43b689263f36ffbf11641ab8ed92f9aafca6cfbc8c88d19b4c7d643c36e34f5b2ec808034fe82a57d9407401edf8849ed4f9149026068a47f5bff65ea2287ee94be15057710285a4f876b7a1da29fd23b1b8cc56c465ee422eca548bb8bebff678975a74da77a8aef564d1bf888b8e228ebc0909fb8f95bc5bf1b5760d31d34cadb4124ffa123c88c8ed010079c7e1cc61f4eb43aeebb972dd28612ab396bb3e687bf37aa01ab9725c72b9ce1d01123263ca83d87a8b42580df6e1d7d406e01e25642f762cb55544478f52b57adb7a9599bd085162a40b507d1b1aa00ac8d6153104ace186bddbfaca7f837f760d86ac1831423320708f9b0a259c6385e655ce05e1d4d00766369e75404601b53e14575deeda533be411eb2de5dc24bb78b8dc88ceac9cdbb2c7b0c3b97ce2715d94b52b9ef5365f7563492965224e337ad77bc421b9c98625b68b8ebb7bc2c33f216e2f0d43004b615fcbb28ef1b65acb02bcdd236c43a91c3ad13021195e98e03cd64254c756663aa521971055d01a721c41474d805ce6e1015708bc374a43f2a9f44d945682be520a46b42b01e7f9d88a98171e45a271c1eca1c2acfa7a6f9296327c739a7d6ba9f43ad8234db05765d708df13ec909cb5d8fe02bda625265c6fa871c7dbc8ea378e1c523e2fe9dc1b57158d94e5fe36fe170db13b8700ac8b711b84460f55f9c9f689b4c74ecc226f9c07078a3659ca8d467a8260be1e3f65a56c4f1b343e507a41f14aee70e12ffab72b8949a8b16f665e57b33360384e067b3698601240b6ed42ec3ac21c1dced7e6417ff398a27908a970f45904fabe3e05152da1c6dc0d61e0d3a5b6ecf6633b7b54a37c470dd7f333e5f260220d4b99ab5bbe7f378da6dc6c6b7d517b8ec5430abba432e697b2be9335aee49fcd87ce3279bf7d9c6172cfa80856de635fbc87e400c5d7be66f39f7b3b806a90a19edf7d7bddc3e8f90e1cedbf88def5cbfc7bf7169065d6378b7e43443d4a7fdb7e1e90f56fefb4f9f9e6a8b4f47bdef28100b8a07ffcb63d540349724cfeb3b3506a7e31e63bd8e03cd8d764de5e0ad17c917792119fa021ccb331c6449d48149cbc15c4914de4240f03431c35fa7582d4f2959da5b7ee0f465d66c4bb9dab9b596302a643eca4a884703b896aaee568c83ff01c0368180f1265b2cb981bcdee7aecc5b29650107b44da6cc9177b0da14f4046217bc6b7ddda13062bf3c097a5748b63c26ae7be31874c528f1c61c176cbed05cecd48777e94853d18d67af34e0b4ade159c28a7ffe6e67fe91d04e0fe6ce83db54331dc765d6995803f2863e30603a3d2f2e17f96beac23bcbd7f82197213f5b569d7e019e502a2e348e6590e672b53852145e1c2c343a0cc8aced6bdf94ad8834a892de6ccebaeb9add21b63b3a919f7f1c3f570a52fbd2aaae36d3e0a119487cddae2a021c7e4a71fedcdb0fc9a744f0b679fd40d16e5bd25393e5cff83ee209b2a6e4a26bbe8cacb9ea3bb2b23ba1a2e6082decb78d3979093c1b6f440ff77fa09fff33aecc67719ecc90756df92d67a4f4b70099779fe35bd3b9bb6a27bda6ce3fb814e1fb961cf40930e341f1b944c361ef7fd75159276a5071e90b33e781f31d993466fb4a0a3e504f45c8c0d1fe45d6b9daf0ea37b6ddd2c32dab405d325f93900e20b47eeaaab42720dfb908fc3cd25fa1f621b28bdf82146cb45ebd96db54edaa727bb1a0ad8a6d7b6e96c76654053cb745f1144116814fb0ea1d36b2dd9c2645fa81945577bc32159ec157e61bfaf92a9be1fd5c5cd2f19e1e939e875044a3e76056acb3a575f6f541bb502c9d4c3fe808de1bdd85efa838d4d79af981de718d1cf5904a957b97745ef41f32cc6af84578d0beb76189cc741d28eeb6d1c927f634dc8129dd5b8edba02f191f3b33cd7774e483ddd521e7b5be03cc24a5031a2f9cefe83560728bd3b2fecba31df9f5e8fddbd6b5e9bbc6c11490153b78945eea5e0ff4e057667262e8e29fc73b4aff30a3a4b3efe5d5c12ec139fa2e25e0da38364300e7fecf5a85f1c27ab909f85b67d74d1efd072cee7177ab831eed4f02a4d564158965438a0d76bb35d45385634e396897df78d7b0e32272e51c153c2f01191d0b7da10e71f4bfd85d602c9086c464f29c3a78305627e9506a10b053011154bdeed2de320a0a56df27ec34f02c577bec78202aaefd85fa7ec0397181480f16c5a4bf55dcec2b50ad1bdd39c70d72f9336841f58eea3af0b81bebc60bd4cd0eca337a220e1bc74f4f8277b909686808ac51e377027bffb81efd4b9a2a2c3ce1e19db39a78200de03784fc69d9bc41dcc1d7d69dea78c34c1d5eb491d2e538ce05a5f177866b3e38e3a9cb18963172c07e7bafb0e54738e00b2a803694b58f91a5faf1b6c3b7cea8c6fe93bae85befef71775b8bfb51da7222361da723ecc63f7ccf1ffa33bbba99991df5b767f59b6888ceed7e09aae79b64483c2a22877c6747e7a3e9db5a81f05e8597fab11eba53595f8220c3d9985a95b4a20a0455cd1c0d84c986d99a362c6828f60af82181954fd5b543d38012bad0324e2a877f2fd3c5d8740cc5b556d25190c0cedc9512dbc619f404949c5f67ed10db439d06667c0ff1ce8d269bf3dae0f04b26fb53d80253e8feee23f9c53bd398b317250595c493df610c175cd54dbd276dd05bcb332a4596c4f09bfdae41fea5b17a67b21f0e2fbdf9d41a82540c0fb62615c72cb28119d8f3cf00c0f72847226485169cbaeca40dc7f3169206dec74ef18763d4b6cd412d380bfb41a54dd6b096632378c26e577b323eed0a286e28a2138b3e225f1f174c683d988f5678809c1828a16c11fbcd54fd9a7a55adcb65ccf2212568bcadb988adf4b63b65fea3115bc9a23a1a70fb8468ee30d216ba66d65fbbead454d591399662ab40eb3278e264ffd0a47a0c5a44aaf6c68955dadaee3c80b25ca4516ee194357f64236fe2ad880c5946db0c3ca44a28fe14f4f3401198d5655b9260100c2d464d28eeaf6d5334c2c9e89a455fe0d3d9fd04426f465a1e6bcfc2a725fe347976f94130f1c4401330cc4344b659cbbdc51dda95e1240322e2f447ff3a6b0d1125bb2b0250033a4bc2ec31bf2ed37d2287c900217fe23b180ac9d40ce140868f873a55a9111311e64815f3fbe3c24f4f65747e63f4a981fc3d6f5ebd33e65ec42bd9bb547eb91d29c889bc93ce40071f4fe48dcd7315aa44d6ce0ea6cfeaf1f3b3e6f1ae6016aa940c13253d203fd67d353c5959bb137f2680c51ebb7cf3a17522f37f9fa220480dfb11c42e62c838c5a3e9d61a4007b5d4c6af798aa10c021ab4a30b4e834aa5228a025e46498dbc593734d439816a3a2b8be1e5110cff555806142970c80c592b5333f2bbcb4066befe90c8718b553e7de9fc439536548e716a6022082e22f518cc4c36e078ed641c3bc062d385d1ef77e44e1fc03c37a2fc2b218011d675180c602e77f8b08ce3d8ec0793e01b08601ed716a7718c2f6229dd072fc5002ca070f9e986ea506c1b61015ab4a61294354196ad5760c0fc4f683fbd75b74b0ef745c4043ee6f428dafe574b8b498f4239590b575b22c84179bac8ed7f47914330e6dd158af5611b9f5e2b4f22a96b08f8a5834a706f0329fa19a88e9a98e91e8a8f5411f877bdc66cc31ead95f1413c61f24b2415aab0efcd0fbb93286f06849ca535496f943035d5b010efee2bebee03e8481a8d79971548c7ec0161fec0d834aefa6050893eeb70960ae3118256b07c25413122a1088bd100ec73cb02efcff1a7ed39ce797de7cffe83f6e7fdf3fabce7bc8ef50f56f373ccf7af05cd21fff8a02e493d575a837c074eadfe0283180ad8faec6eb8e01f0b98ffff6b7ffcd74ff16ba7f4fbbdf930f973b10a59f4181d3258454e077a42e0ffa4595e7f8d62fd40d07cbfeb9bcfa0fd697fbe3fafcffb77fecc1f7c7f5e9ff7cf7b4ed5d53f58cdce35cf3f2e60cecd6c9b509e060171c47c4c4fc6759d67d67f668bfc42349e61628da6f8b553fe7e7f6eda8fff08d15bd4f6503e4b5d6886de8b54edcc756e9408cd2b7bd60bae3c294faa67a5e79ae8bdedfd7b9eb924f1dbd30ee58e383dfa77c61f8a61c57a0c5a6b4a01460c796afab349e4e77c6b9f98613a3e412ec5ce7c8ed31fe67c9c9d9c56388c13426738130e0327e3583359ea10e52128f99ca56ccb1ae604694f9567ed49915325d3da70b52f3372c4f3ef05c3bff99b8673a4c0e9479c85fc6c68f5390b4acf2c541d06e769d36a3cc5af9dd2570f1138d4f5c99fe49c0feaa5f07d0b6c0458335e89f8ecb407783f668ffe7a3cc7c237d9463c0fc2b36d986b54f6df124f5bb6e19e39b3c0f35f08749c5d00cb4f0146b8f37f3442fec63ec9d862158e03776d0fa8eb4d094badd1d30c9e050a72f51cb3bcd15fdb19cacab039cba48ed7e3ef54e3297cdd94e62a51d0d0296a0a57557107dc9acd3b4e009c658348e2f98654df49cf10e7714be66dd4775cde144295553f986107c10cc511d5228b239d314baf94544432df7dc6607841a0c8908fdffcdf607861a0a55cfffed3e0c2f0e5898fddfc6d606861e0f2a4476f31eeca92d7eb5b6d8e0d3df0f4ececde5e8616062fed35cf3f072e0e5d9af4d0edff064317872d4d78e416632f8de458f525b58c932a23232f1ff1d050d2e15c49c1f31956893413643a37918768f2e0f8c1c7cfcfd6ee507b2bc12e33551d722014a47970fa52b7dfcf072f5f9dcd9a6501878a1b8b4bd8666da1e43b37eaf3bcaff3a10ff5cb3134f83e3fed9fedcb0d6b59081aab26ded2756e105c3608314022c5948c66be488c99c2bc1ac8a28add617d7b3bf08a984260b3a05032d3bde936195c5bfaba80b01cfdfca06b38c10f280d221599dfcfd9c6cef612cb40dcce4fbf5726679d3c78cad15ba20e8df5389e539c217ca916f1b207eeaa1426be21e8e29bbba059bae6adb4873576653a84e9ef61e4924bc267ac84474006d952a962e5e8827debc4222442d002f3c0519d788758ed786c4a0954b8d48fbd357a6b2da6c560d6737af7d7e8c157b105ca2d766414ffdf8fb552e37cc3a7d252fc11fc366e1d5f288540472b0c4fcee08bd68791616586e08e2ba919eb5eb661538c0c36ee6b2bcf0e01970c317c35cb1276913e0390ca1ea161d5221527156fd7b4126bba0ccc715ff72878de92dd2805adc4402a26f85231936b83511c552cecbbc1aa563bc711cc457e0e96abe0ff637c18fbc4c1a80dc44593a3ef2238a6a1e0923949a6d6607c41a4582281593ac2a350de0c16b96a2fb2eedce79a7cf5b886a32f0e172477b8da4bc1c061dde9d7ab3c6f6da34ad64f304289516153d004b3bca7645489f9c32818e164e6742653504341aad9d6f2d105714a3f010125aab6a8d71449bb3fd0593a64c8b547b65555c9b23dc54a0d61be08b8c7cb73bf935b9e2e9c61f432c99830e6747531345deb9177ae1e837d37e8b1234850a6022b7664956ac877576de0654b0560392b589f317289a29852a0318171ff6a66a131729425070c357a16fad0b2d75e606fecc84a6a0d9d937e1987d173c67c468724b0a71a391702dda23d3356b9d514ac393c33e6b76e730e3e8825a78dc6361505c4eaf9f30873e84036a9b81b2908e2341edad81235dc322654046b27c17380ce83f6c72d22b455450244718839e210761706be190206dafe7b0104168c096f646bf9c3a9333b611c325a5ded5ccc3be016060c5fd404fef401b00557758a5da40b5b3e8a47913fc2cf13897baade1c285165b8daf050b3e895fb8900f19f18dceb63a9fba4e43f6d609907e7c6056d00013c3af1aae4215b2289d996fa3f948d279479e367324e910433ac1b13f7d5743642644371c9c6afe036e3231b38da439ed6ad028e78df854428f4f4606989aa785771cdcf8f72aed15002b2145fb864c3bebd9082ab350f6ad1b740f76b882149533742b16b855dc0ecce06404d85c659d12504a6fe78b17210fabe1b349fbadf372591faacbd2054dff0e02a369cc3b6c1ca15bbb816ccaf7e326f845f3e1848599b7fe2b4384082065476bc45d5f97675be3dd05a97b65aacb2c6fb2230db186be78bc627495f5a364c5fceb1d384c2fe3e9e03194059f77b718d4667a6d57a5358cead694429efb03048c9de75174ad0c80f8a112b4d341fc02237bb38ace88046ad49c8c03aa449034a960531cf75436ba4d8b392bf4e4412ebb65562a124fcd82ed02ff9f8dd915edf1dad1f943cb82c4b3af0b9dcd0f81db88df39fe58dcea4c6b469bc272e5237c078e0b4090b12a7f11a392d99cc692b8ebe42a7510f2e5dbe4728dd00399f297126e54467c966d7f9c699ce542dd90e006ae2f1759b7f761abb4f9278d8e0613fb3d978c857d7ac1d1081e8adf91fde7b49dc430c4d65895a3c89bdfe158ddd53c35a0a81efb6d4f547d06daa969d6a8bc69e13ad66065ebed841955524ad5aa8cb55ab4ba726576076d44023688c536be8c0e49c7fbecc3433b6d7b55a1271cfcde1ac7141df56ab06ae0158ff86a5d23667e590bccad8ce9bd4d252a3dd7a371be4ea5a598e0d1b84b1873283e5c034c828e29e2906cbbf32942b36cbaa1f565d0819bbcbf05eb16be270cfba7318e2910544e3741fae365d3376703a91990679ccb776a29517c8a4ab2d82c8ef56ce1b49b2b4905f47745df73262b14ad145c9d52810aa397a26d7578fcb0a16b0cd616de825f4661a1827ace2082618cd2a56ea605268fd597beaaf24ff2aaad66fa2673154fc852bc30d946e5ed6290a20119d4a3e4030e5654f08861fe9fa11219fa1d30e2ae0f489c7c3a8a4e1acaef16717338ee8a12cfd3fa6a46367729b312fe143c05b8ee7af44622533c10d2c9bdfdc5404be043cdca7ec7b2a23139dc4005c6cb2fc57e0525bdac1e504c1f36ff37dbd80c5a6861d7c7ce003bdf6ab6248b7e2b456bb4ae45921c14b8dda545db66c7a936b1281da22817cbad61b802f6849fd7d73b88f574004151a1a3ba6907fd63091d478ec81f1f4df4fdf7a2eb6ea16f5c96db94dd3b11948b1d85b36e4c1ca413645e095b6666a5e8ab03111c23c5b1637ebd5fab91e1af0c5635fc5795f53f3e8e3a56110387712fb62f664edd3a7c97e1913e89a5ade8338aaf30ba3b66d9846d26a167b9806d925673262f313c8d0630b28a61235b79fa63a26c6bc5e7e029c759d47e1eed6c57d0631790fb008f0d8eec80bc189eca6bf86fe2883ab10c36e0362c3d33559717d4fb9d47983635732045529a75e90055a5ba5c40191be6542b0c822030f50baac01bc54c6032084a9a42c3b6e6480676d42457e908628d520ba6b1060ca762897584a3ba28359eca8fd026a91f33668102dd2f159bbc172179a358572c638ae15f508f7de142204f8a13b39daceddda7755122c3d010934d91241289ce5d29647bc33c4cbaa72ebb53c52dbd3ed9685613603186f95cae5000923eae02c7204888736ae049aa32ae1244c2c3e5430e2491c447882f431743dc2b5e1aff4c91c8a38953e508bd40f3739cf3c4e7cc4ad0893b6feadaf63868c229f57fd89e36d6bc1ec843af5b87db98492763f41490f1b3786831cc4f1679e1c99e4c6ff8fb824740c94a50c011431e7d7a88e8b547fd4cb03dd2717575295713bf8765c0281e5cdb80d7d57bf829004c145a52bb7d33b2fee3ee280a0ee90992398fd0306153afd2d0f6a150410c8a1738ad40652c597e7ffd2129f9bdf2663c0cd60b791c0164892b97178739de5699dc088c7079dc29d482ee4b61e3fc281c7129eaea4a5dc41cc22464e0aa760022fe2de01751c37c29052ab29439ac1d74e3221ce621b5fe516a13d5776c67285a6bd601b53acc44b2b14e7ab63d7c0c95b9eb41eb2f6656cbe9263e2e395f9781385a2f2013f33ca1885d25a1ac69e8380bc4e52529379183829a421613321620af97dd0af99379b51965b2226d29b63db00efe8be8413255cda6a968e0c03d65e0d701fcc6b6eaa982cb99a2500e61e10f5f9cc6eea12f35c18e2c4d8dc1d000cc41efe2c5afb6258e8a983175d749286db2a1fc496a8774a977334dbf0d6c37166a4335538c88106b024d0b33fcc7daab44f363267ff685c96e7733900623f8003780b319f2b97a0d1144b4c40ad5c30960899b7f13d1f195df57abe691cc3248e6a56e6afdaad99af0c96b830298dfcfcdd9812d265d1cb64c22bbdfb8041c79d17900fe89b250cca0dcfd000cd932c28dc1855fc4fb814a57182c958907a915a67903074c8e876c0542d565689c11aae11cbc907109f13d5e859e67e291ce2e93857896ed000e12d8d3a45111abf406cc49166c2454d229a13a22031bfdeb21ca120ca10f13f980ed9e9d64fbf927876d39fb3bce9ddf11327541f9ddcf22a02972dcfd1bfba59f662c36e94a6c3ac59339c48033c102c6acc7fdfff71466da0ec7bea3e6d6ba428cb398a1abf84ac7f52dd332002a2c8a1ac081fae1dcd3c8f4375da3882bbecce327f4acaab21460f1d5e9fc55e05e5de19939ca120c0a66a6442ee1729e524c0516d89e10aa875e6c7eda5f95a11041d4032a456a8233b9b9ea9623c6170875c9a917e22c45f68b9607b8e5a19364d5dbfac559cce3c692eac992877e046a79eda219355e6b49009ea9a0f83f52a28b05451bb2db423b2b980d47e929c95d004b127899f286747d974a3144526318d350068f22217f1e9466d33182a535147fc51b2201b763e7ad8d9c1c6e812dc5cc3b2f4d8814f4043375dc0349715b0d6ddbbd7e68f7f5d460977019ee3646cf20a7c122bc9b1cd7ac7ceacaeec358dca860dacef022952288a5dd6f03a141357ad88ddf11b3cac88f6711740c2a4d2749010b9058405ed2a98c380023239ae5b5043557c3f73e8e26dddeac1808e59e21046f9c0bbc174c6ee3d20bba736c6fb61115812c310c8a73d603dace87a0162bdd8f7fd5b6d88cfa50fea06eea0fbe07d3f6b37835680095c2061703583e0bfe0e70d857140e91299830b0e80c46bacfce10ecb1e46cfd6d249412b90c974674bed0680d5bd141c3a1258590a921330ec12769680fcc2a513bc69be30846970caa456b826b21365d610f738adccf4664ffd2a81b17fa533300d85c9075210d8210507fe9a22c01909a99fd0013a5d457e5b94909d06820477a90f11803d5c40dbb4a03b1c66c1429e9970e6e6f483038630effb2a67ade07f5cb827aca0b942b83c370da7a171457c18bae275986ce441a67039baefd3f5422f00332cefd4c332a8a44269d740ddfaab40d35d46fb2b163a815990a5d39e46c358eb509ce9978af0ef77ff2e5ce15065f5f6ece84920b470e5a3d1a7a4463f16ec1f2491bf314e5e11844d0d6af8252142e7488a1a7b22a1a6bb0048d71ac1e06c6696d8bdf93be9414d30d37d5f6ee5b9cdea21a5d42095a6451d9f90dda58229db68eb1eb0bb3f82b065ad3fb1d9e217f60bfcf5f7b843c2bf025601d366f48d593a338364122d520a1f46765da821d1446923207e172e51f5126e6b67d4ef208cc7d2d97a99a8a9a2747b8e7aba77d698299c9e6840aae211e495941f2e3853e1dcb1d18b649303c636644d545860529381d3938293bb2acc67b8da82b119147676fd5eb0e45326843eb99281c1fd5f03e5838ddc64a41520f2304c45ba0f5af6f98371dc4168de0e0a6103f759a2dd263ca63d25fd867ccc42fdaf0ac5a2b640deb7c1ea3a7d0b8481b7c98d24e886bdc4b598e36120586d2288c05438aebdb55aa8c7a2a26baaff404178b4a7a8bde9370a1333412548745b6d68e05642ea9ae13c7b906d747e3a5831b6e0d9ba270c3eba2e3c7c359755d0283dbb2b3403ce1bd134c24dc83226004872af49b6133ce91f2d71e9dcecccd1235b99ef55099e0ef2f6188109e2cb4eea87945aef87ff8c0b87ce4f27b8b3bc32f09181ff44c5e0ceca13fe1375380e3cea3ceb710403a4ed2d8683c083b5b30a20a4cee6ed8715f3273a3c986ef4ffb4902591f1ce59af19309cf8f5c34020a9b3f85e092aedcffe484cc93c368c8c05c4477b2e94dbe6a95af5b5b41b669d3c7acb00ff4f136010605d57080ccd521d814db5f1e87094a8cb760cf30d563225e9d6f601ffda05312810ca5ebe4685c96e860a967357b1c765f6d46dd5f96fa71bcdbf146c9a23a0c2a9f5801446ac01966f19ce2dcb9783590afd3a986ada26146ddb466f60b26be2ec59005740bc6e09a22fe9988bb51102850518ffd7edf4a947ea1fb944019e96b1067ce26c618400d8a793af8fcba2e615ce33c6d19c9c3f244dbc16c1275a334775ed6b585a652bf050a9b344b4d44c605611ba8345e6b645ca1691ede387342b8d4f306208d23e3b1c8c5c262de222ce7ac8c48beda317943f11ac2a0537ef88b315fce5d4044c79db76f3d2aa7db82db0121764a9af131860c940e3064eadb91a36601b2ee71ae9479cb3d1345e583f3cabb30612222e30eea3054702945f2d1910e319fd16d2ae1f02a77b7d2d8871d72914ca21a9499303150298d1706e0a3609225307e862358723ca9d3798c367b98f585da699a7683c0d98e0302203779907a5f0c92b018bb3b5e27069bebb8776504d73fd1f727a846172382676fe3e333dffc01595195827afe5896b433a6b437d626d3acb8d121d93547746d676bf563768659918539daf64daf771501ab679187d57693af03dee41cb4ce30e66e38f01488a017752fc8919f1bdff1337b1ac11fa455ae6572ccb64d3bc3e8960df45dc3e6f5d2d3520f63881bf67f5ab57653e243a1b668448c6811db00454cc5b319b9cf074f74365319e98d738aab42882bed1e07f7fedc96f8c85f2a8d6470c6532bb3d9d005448af020f1c7cda0eca78506a1d4c8dd00f7b2f400cd2e6e5bea3ba10eb4983da0052de0469af167300b4aa6eacad0d177c5dd827ad44034a58de85da3b10b3f9b8e907fde9a9ad362220788353c11cc0adc86bf054f6f92e2a138c8a6656dc7c7e253607dca92c4c291599c9c9d99ed31689d804d952ef7af85e7427623539b8e46da86273852db8412876cb2ece2705c1f71b16821bce1908b8aae9d587c057813fde1ffe7fc41039b8eb3120499b717ba8dc94b5741e22c8ddbf154c48312c24880b0c7e211b5b5488e3da7c2c28eefc0a07c6ed01d9110be1b558a8de580397aa98a6057bd14b536ab7dd096a4cc5e0a6d21a80ca7b6a9b8a09eccaffa4296b0478f644a92cfb02507957edc2ab0c639b6082583d7c67ebfcab3a16c28cbbd0dca544eddb9a7b97cce884d0ec7475a4fb6a2039905a7a1c5e4d9f77cdd7d42ac7f0b71d11e85ee80b9b2b4bb1a050646b0eda2d822887fa81d6150b85e74fd906026cc230b258f002bf0412ac614dad9db9e551301df6ef83a342accf59dc8775534588bc40091158371825ac693e8dc3b2e033e823566de5062b266bbd85e0a012dc969bade2ca41e6134b2ecc44fc59f2c9529af19bcedac5c15a7a2bfdb18f3e8113f74407e9e3d5bc55990bf15df7c52bdd2b7664501e59ea432236133c1230ea9b22993dce10621e58d84232a488e0d19e8c3194ca533bee2aefc89a7fe1b15392fe8cde7ef9bcb91243ed18561c0ed0016450aec5300263408a8683a877cc181e237348cddc83887b67d78112c695d17fca2a5556a49d0ea484f6e598e90a58507ae9d86674c64dd50ca117d221959ead1889bfc6c81e64c69c5a572f4099f64802983449890daec8a0382bf172a2131fe89a989b17b11e859b9f51cda83e967078517b2836f1896bf117a26d564362135eb9c433996266ec54058786b69bddc4feefdd417504a33f70039c6085590010e72d3108ea45a753d63245617c78a4b26a17c1877dfed7a821565c84be9f8854f50f20a97beba398dc8bfeeab70496c7d9c29028bb9aeefd5bf9f8029785a14294abcefd04efb6530d768c2df545170ae3523ac477d944dac91c89f2fcd6bd31007f3a42bc3eee2aedc8fa6443047c9891f229cff2dd7e7a61dca9ca95003713790878e7cf880d0e59c673c918c8f8c0670b30e3f8d9690cf177aeb7b256d5f04c1e383ed2a11cba325d13507435dce99d8d994f644d65225503d35a35bad5c86a064faf460557030ba5a75a18bdcc956e9fefb7863a94a2da408361055e39e7baec50ce327603d858fbdba092f3a05b8c90f825d5c510516828ec8a23d06d0a938483f73a994d7d5e0e97b5c60bd2e1f8b33924612f8fafcbb296eb41e66e0d6988bedf7fe2df6f79ca3956a4352e74ea5fca542990c986814dd99ed97cc44f70544b942b5851fba6a0cedabf578b2c7f66b486871f347a0630f38ba8b218af36380353cfc6705cecf70dc7d29ba724cb108e6f0c38fcfa25181c9787ad68803a4ab35c4430a38b8aa165950e0dce41921f3d817b1cda78401ba3624e8d90e4c7386e3a4b28fa31b348c1412a48e203df9f8a8557f9737030edb647264e9256d0e4a939327aa3e0319eac13b10a138e92f782cfbd31c767239d4a74b77c986a3d101d51f4f6e4d0c1f889e4eae57824d15938007f168f22e049e089dbbe45a0b540c4b533e5918e15f03f84e889a143d936f6c021da8c6b4194d3134d4f8c1e51d0206124dc0aea9d0dd10b8c0a97ce22171d633647a4672b549250e63bf8ea89396d1ff38bd4493d3fa1ac144db471ac1915ccee62a6c7041c39c15d5eb2065e7e2542899522aae5c468d5bc4cddb097a9a41a8c736898d7d280c9ff4420f06e8b07754c63482bced82067105dd3084b886a1fd07e04096ba89056085121bfb50e329220a18d0a2a341ead88cd5b622e95336f3f3c34f0f70bc7fae84f356858d8e890aee64093c99465921ae07f95609bd7021c298c963b11c243c86a9c533174cc4cc49cd6e9058906e5f539fd3a634ffc726a79c61849c0b5c7c2567a2a9546a6cd892662fa7867e3c828cd1bd040ca497f2833347a219fbb59bd6b1e87cec324797c1ba1c8f770175039032fabb95002d0097253b4bd25c256f697a8abdd18913553aa9efd013f550a5070c4c6d75c6429d7dedc740b23a33806fe0d6659ca76f91063cc8672afabb81af9aa5e4127e54763a2488dfb210ddf648cda1563640fa90088f32626fd4d20fa9e24eefad28daa54cca30697d71c28810bbc164f7bf84f0129022979381044d653107ded8d869b762d2933ab351de6fe66e95e06ae61ba902d3e07b6941e18735fd5f892975ba3f993453f93ec3e0200865983ee5942e42bf8dac987a1050d53f732062d1ac9f7ee31533abae708c0e4e5e1d0afdf483abf48c16e061ca1937446a2ccdcee28689606991723b6ac5398ca23a2ae546fea9ebd6fd3bca8bb362922a946aaec84a71efb1bcc5991da73340056b985660b94eaa0dd80ee8917f3b53ca516a5a63984d3ea5eb65f5dbc8c8268c3b4804f69d8c3ff723acd6cfba860fee7e2b9d3369b1d2fba4b9303978ebc6fd4e99f8731299883afed977aaa381880ccafe547940050c15b8257bffcccf26380bc9cfc4a5a86a5429a36efc0cb6845b4f66b4f0fa68dcabdb597f3b14404d349004b440bdff14c02c69a2c3f4c3f9f828d94516fd9ad7ad820f8473524ebef05d13f9fca16c1df37e3e51250fc3de0d6698e704c7cbb7652c5a2346b28c30c6ea3a03a63a3e9234afa0de9d56b7baf49b452d7b10a3463c84b2ba510480fad6174bb34d7a7e60bf508df73ff6149e3c7b161baa6602822864a5de49f0814b37373b050788529ac7086d16c4776522514f2add83077c1e3aabcdacf6929402f74d8d08aea4da536ddad918e15d4c4fd835003dd19614f52f6f6fbc2cbe5f950dedd9c67626bb9e4e578438992682ebcb661de606b7795122cf6df714db3686b4120bd82f11d868a085ab1cfbcd69b337d37e16d18faf57846deac057a423a275f25effa9f81553d9166bbe1ac3b31d619e3e1e2593faba50458fc6ad6f4e9f454ba866eb2f9e7a2236ea39996d84a91ce4efb654ffd5fae539168fea6b044c8827ca1cde40866263cbd61e74dbe405c831b76f1729795d6ebc7e0c43084f2d71f1fc342ebba1f455d8a110c9ef9a3e8b042df36552206c71f450d71febc4be05e1bbd043c1004696e0d02f47635a0b72b3165dc1814219d7b128bad14a1acd2f76edae69520794d559dbf80fb41ed4e5cd2942514dcd944fc847c23833030a34e56510932502d42bdb0d5e652ae0adbce10e1b6f4d3a086acd6de81d7b5d38a4ac8220c087b4fe5c49df304826e6511189bfa0ce2d1ae237f10504a910c9ab53c283e054b9752dd0981233fd3bef8b5645408672a97315df0aa0d2e612f1fbb0271ac4d4083ae5167ed8fe450ce5023802fc33fcdb3715b02faf04ad8178c762d20697595e28c025f33b129c7331f85df77573e322c12a0be7eef33cfb8e311e05dfc40d80d95754bc548a6921f8191c761c19aa6c97f156ca1763ff318d523e6737fbdc3bc8361c641085f5b286f450cd382905b9e3235c402009fda91349784d2317b47636a17d330840de5f989cdba53db4b8759eb8ec14a200712de39ac170c22bfda1534a13a7aafecec88a8eda8da68bc30198c3e232e18e58c3011e4084e714976691cb69be31638f223d59ff688669ba7c117c86ac178feb7b253e8522ee2fb664d53662c4b9b20407a3f3f1c8827052240bd7dfbc4b3eb715878435b6da3d295af62650fdf4393d403cae1addeb480228b155a2d67eba319ca786210060207704cd2133643c4154c3ab76cd0e15a1d60082c01c326bd95a2f3b3e1569dee31f0e1b2bfc6cdb8b5eb003f805075f5e10830b42125f569f3ad9d1e7b38a2041bac937313c204fd5c9fa4817fed99fd805a142009b15819940986685e34f559a0e912f2125378b9d3ca2a79e234e340cbbae6320893fe0ead2625719a26aed059cc3440fcc9e59bb92666cdada5dd963cdc8e9971868e544df3845c8679181a792106859978b5d8322bfd9558db190874a0d97fb9054f62bfce42d7b51189b37fec2bde4186f06ac38054293fb2b392d0f48b86fc647c489f116a6a21e2d423af85763a01dd150a5be50cef006437526ab86c88717b00a75b260834c800388352f257070fa38a2485628fb6269ccf009e62c3116355ff8fd2a8692690308a95732029c11aa4e3a9a06060cf78c1cb8a2d3710c27889d88a67dd952f9d150062223034eeef20656f79d39a20c75886ff5c3ec9888f0b21132f36ed0bd414f87444a2a11a1baeae1c1fa4465995ef63ad4a200a1d9c8864c0b3f08c0fa8ff1a29de8e9b45430e60e47458ad7f49a07b0976a40b38f9bf9ea732e838672cfbd5ca0becf1deed8988a66ab68a93642f468ec48727591b8b39c61c4a2da0ab136da62d88520e6b794744f74dc5d6f9e98399e919a09628bd828fcf5da3b90c727002158e2f1f3deb3dd54fd5677ff936231c4044546295e5d199d791373e00ae45421d8cd9b007f246d5bbdcd5683f44b722954dba94260573015072c1addf96cebf96573e9c4a8735ee597b60a7aa912a103b93d1733ba2d2bba28543efbf2c5e35df93fe9c1a791beb730f17a14cf3ea0dffa934842c42914e629e2277cfa3fe257b62da97045dbd9227cbc2b692396a10a8fd571af7fa58ea9881e789022ca0d16d3b5de083f8454082986a8a6dad94ea80b4bf5f82385930ddbb77ed6f7d0b85cf80275c31176f7fc9eae2f5cb8ff8db169286dc64e780e51b8827f89fe7f8e7e5c7b8dcc1972e431d44a2c0f99b0218eca511c7bd3c3434b356611d2344c900d0ba93469447fec1fdefe76a48e34558d965d16b345b8c19158d196ee6326cee9840940dedeea700d02c84455daafaabb2353071e9727fa5314b7365a3d70dbd296f682b607b43639eb0ef414394edac58c09edef5c90cdd1ad6bdf4a44befc2513634303a4d49df6d1237b7acacd11aa80cd76058777031ed143a505c6158278b8c43ca9d9c230b54aa332b22cc27ee523631c0e35e8aab5e369f3d372f96e5478a36611df6b1162d70032bf6312c766b62777ad62a1ce9d021a802bdb56fa24d839b698741bfca869e98be756b2a842dca0356fd89e6cdf129c83d71c96e14c8acfb86d58395e60939d8dae6d6c25b0249038c4049abf6ce5aed9a5d3815520d6db5ddf6c03919a765df592ea56d1b69596c8f2cb799093a73e2604a865d08ec6592272c023fcc492e1377ce661d9eaed39c58119f89e735c8c2d430a7a0b939a68e2696108e63dd25c40f237eddbe6d02cbb1a80b9a34b9cd89bfc52f77c9b6c5f185c14c406eba9afe6df6b4420a734ada1c1ce91ca93b087ae8ec51a67ae338bec2fecd207ea20f680a918e48340856fded1405d7f76049a19946323d8652345f1b64a6429e955e2728c38f4ef28ce7312692606b06f9c29d5e351374e4b27fe7bebd6ab632660adcf4f1606bf9d44c76e9ed0b6ee950768d3a0f76afb42ce8a3b5e5909745caa38843a5844f2a9634646ccad3ce1ec9850db087d56d2a36705deea4944e212d23a5b834b14c6bad34e265ef418cdfc6f485691f27918bc4ebeb1f60425f30fb9d420cf7cfda32e112c44fd5daccc691c50a0cd50d36e5fe7dfbdabbb90f9db26e42f4f774b2a0b5e7db6de4db00ad8f6a478aa5c93c1178147e446cab4d88a23d18aeb6e0a437db20a1a28a26306ce803bcf10c274d5d69fe17f1cfcac0acf107ce304b1c4df96ef311b33eeffd93142acea51451e196789d36159677cf6add28b8a6972b96e2e6db7df4e5b51b6d741af4a92f841e2ed11aa5264b01f8cd2b5b03f57aadc67975ee8d5a79374ffe7ca28bf57da610cb75abdce3c62a684e4b89ff77a39b5765784f657e64e64ae10a536d8623c6cc344791c1dbc16c49036672bcacf28449b9f9a6aba9acc14dc3f5d8579228fa359697f2be92bcb2032e13896669c40db3b8a86bcda099b120685e324f4c953b1fe60643c1a3cf79f4345a41158206a14f4f88d737dd06464938a2c356c63c412af6c36f66019c5ce04fc9b19179595163c10fa52eb437455eab3b6a6a6123f7eacd225f5c610a3b7d10df8b413a620cbfe939f2695481e2de7381df51d4390ea7ba787f0a48926f0fcf37fb386f326fbc1d28d6b7693d6650f4fd5ccee475395395e2681568e7ffb7b6b5bee7f75b3dcffcf24c2edbf55d97ebf91ccfe53ada2ecffbf33c9eedb51ed7e33a7ddfeb3bdd96c77fb15c9e6ff7aed377f9aec3ebbabd9665fe381ccfea5b9edb731d8ed79db8127f44909f473ceb5967fbfdf68b0650baefdb6ef31c63ee941e40994ee729e30151598b00c5f6e30a504154ba56455c3a018a21b10e0084a83427af5f5a99c8c21d5066d946c63801c21fecaafc7f6c64dfb4a37ec2dc2745aba47daf1ff5895c140af9bca37e039b67053bc8eb531e9d7704e829e57630ab1d98dfa443aa76c372bda2ac14ca570e1695a0995edb8491f3d1bd4bb9d6acaa71e9a8b7abcec1c428df9e14d713c2d8a6812fcb6a31b94fc527b9ea21fea6bdafe11ab24484a8b81c8b0c52792cdf4bc9a2271a64ff6ad8e2ed34d4d4a2c142c6538d6000ae8608d15ac61bb99a767f806ea6c84b92036818c27c66e098bc5453e7849e266554e81f85284181f42225e6a3503ffd20e558e52e9964a619803550b8772ff8cc79f537b334d368ba6607f25b9439a12007e48e38b54ea3a7f46bad2adf6e135ab93e8cd34eef94d00ec9fb7129447cd4ec6a69f7336de10c30e1867c236f794f77ea47a959692447bd483d5c90c7b3966ac9d35e4aed32d19cd6eb1bc282075c5e5418dcd642d71f8a0a908485d03caab9c1036161c43f7b72d8e1293f3911e43c1872e43fb16afe558c12fe9f4160fdf986a39ad5c4b0e6438b614270f635ab46a248bec96740b22dcccf3bd58990bf736a09883d684ad78a8f757602d0de417350610bdadb945b5a7e62edbe8c54c6b54aa732ee83ec2a20854b581649fea25753ca4cd2d483f38f79b8f477ddf36d302882b635b76422b8044890134002e7e565fff97df18f217b653983a28504fd4947f405889798c07252686b6079942c98af4db12a1f2a25379582c142e6a276cd5bd10aa8bfad8fcc76ed148dade8de2153e10ec5169c0e7a0f0918f028092eb0254d6cdc22c115814319ec24e70cc04563784b28f9670e73193eaa56b471aa79ffd0709a53dea45b0c75d7962ab742daa48a8ea63d6a24fcadb48230fb638b76b6443faa79a4caf129575fd0550abc7256646ce55a1145f0da5e6f9455ee504a181435ad1daa834fe157fed92984b3d4ad081c8a20d751dcdef1563be7c790b96e22ef262eeffe0074cd527234f6f54e17b03de85530d7ab1600d35dad2601952c3307dbc61516963007cd3fa5c5f2b2019d9d002a0c092e42502c25e903c00030000c0003c000303204179c8b876cdb8c6dcd8a4a2336a524257503288bda2a1a473cf0d2bfec9492944926c5df3ec6a3377ac001441c08098e23ea02ba02c9028f7229e4499d1385e2d4b3185a56a7a556a16855ad4dadc2a54d9727a06044878a9e7ce22c5e2b5527bd6407d7138cda39a739e3db6f783a710e2d53c44e32a664c509cea3af104bc69eb543934d3c52d7eeb0edf294b734919a533a3fcabc3bd38688846c31c9c43a89b567ab08778c945c31c1c4ae66acbfbd93affbac2c4b087c592410022d3830b9447b32fe6b43aeccd09958e217fbcaa4127b4deb20ece346888ef7a031a9c4d96fc7ea968f37efac2c0b25de593b49f14297e709870e12a683048bc9249e0fad7f4acce9b0932491aa0edeaa4cc8dafd547490784c22e12d31a4cdcd9927b32b564c20b19ab264ca99b85366cb62f28876ce7d97ee606aed6c65e20884efbab7d7382dd36f445f32c487b1dd5beb8d60c208649bbbd9e91ca232ad2c8b8bb14a3c6e84942c926521a1c06411d9de59b9b7d56b6b565916122d268a5088bc982482ad86d03ab9fd2b916a956519c9c1c5041148f1b9ef10ef71b6546559403039041e644d495bcbc3ccb0b22c1e35aaa88105044e044e0b07c9a1c3c603aa20636208a4cf72b1b6ca6cf9b2cab28c88545ac8a410ed34a773f6f3facf5f59161c22235b904851c6841079db70d161af0a2dfb41a4ea7a6ca79a8e1e671d9808e25a93ad5fc7e81a952bcb2252322252b2c8980482011340fc61d1f283545a9fa87a7de2074f7a0831a65caba16295650963d2070ed460c0840f7bd043ea65949a4a57b987566559a430c9034b478f2adff9f5513bc183a3766d8d55ef7ddb1599dcc10e9d8ddb363f8a9f3230a903bb9654f1bfad4a480c11910a487f9c31a18302267360c616b1e9763a0c7d934ce480d8612929e33eafe3ef28f90811f9d851f21122f2e184491c0e5b675b6559cc98c0e10d988fb0358688e74aa948c8c40d0a5b2f532b6ddd30a98d36b00111fb3aad1a1bdb4fc1640d0998a881694b86ce5a8d4ae1f1491a10304183aecbe5c394dcac4dcea0cbed48e5fd2dce8423222323fec5c40c06989441adb3145aa48c5eadb3094cc8d09ae979de6ccc9fac1e017cbc9d2d305f43ee6d994f27d625cd7390847c786861b490d2ffab6f63e8202bae2c8b57da5a4c163c55abd68abb87ceadc1c2aa5a4b57c3c3f58f0e03e60ae8d39bf13a574b7dca0ac80a19315640cfea1a23a66c85a98232ab7e7b43b618b31b2a3ca34ceeba2cb593fc3f60a6f0aa3bfd2a96503f436ba4700bf5e9454c15cb26c32b260aad546a6d1bd2b3f0f4aa2c4b060c141853b6a8f95fef2cb7cab28894e4d831d2be304f680a0f9da7fb1d555f2724f44aff346ed5cec74c1358eabf7574a97bd7695948aaf8c230e117eba50c5f9925e879ea67b6bfbebd26a3845eefeda0b6276553672609ad70b922c274da08b7e241b248ac30c32061af136ba9b9a9d4f665027384a5925d578f9dc48458098c1152ea639e74a8d5d254956529427a57ea93a1be2182aac4784e3b3b68d929c81a711c5ec9a18519c24aad2d255fe46b9db36818212466cb30952d6afaed82f08d33fb0e2a957c35374038e4d67e4f5bced6e28b400054607ed0e9d2393fa48f16dd3d607ca01a19b262afa65cef6c34c0f4e05a316cff67d342d5ea86078e8e29a54a6795a65c35cc0e76db2d3cfe6c46078b6926dfc4fe54e7dae46051d70ff19fc576f91b1cb4b4ab936f3656ec7e75514589732186b9817ff3f3c2d5c4a79a4984606cd0cebfeadd54a8991b04538364a81b4af4e4932e9f0886062a3935772f17e23ce8033383c3638490a74587cbbb811e18193c52f5aa1017a2766229806062e0ceeb8f6209595f7af2c2c0408fe5697a43a67ae1cac2bca013233abb5f7f92cabec29ca158620d116f1d2e86615ca04ee252edb1a163726b819f733e09a1d6d4aec71aa9181624ab4385b286589fea6456a07abf78d041efcb08e558399617617cc0a8c077114a3fff45baca4d0a924aaeff0a9d5be79a25213e861665183330a943c51506056acfe1f5468f92766aa68c039813a867cdbcacd5b3a3db468188b10d88d86ac0408229a54db12132ff4e7cc4a3a56a5debd51ae37247ac8656b36baaceb7d5cd03a611e8d7215b4c2b5199190cc3086e7f4667d9bbe14a5f0452ca5771a276b47fb18ac7c7bf8d2eb6d862075b160f1118459c6b9f76ecb0cbc6f811f2e1e1b12c34acb8a2060d2e96a5ddc3738834922b4c22f8b445ab98b811d14ab9ae6ea72143c7848505cc2194b1a6d508adf4ce14236308b57ea573489dbad783a610e81dd7fb723c4fc618060c21fe2f137b55ebad21843a405e994138abc3ef951853eb6c56d2084239f35c7fb41a5ba71b085b374468f88d1b223472886060596e888054b126109f1cb5d3e689ce526b85887cd83080f8831a3aeb610c9f699a3fbcb66ab7d0a23a4971fba1f39bca964a711fbe19217cb5d491ca6d3eb47dfde5d699fc0cfd1e149e4a087942c4faa8f4700c3b9dd6b3aebaa935e21592550112983cb4d7d529bb13193ce469be2ada6d75874f6559c6b880b943e3ca850e336ff56c79c44140161665183b2856954c59bbfa759e383e2a246390800415307540bb5863634aa16497a852a2c38b902dd4d0e13c97f1da2fd7657ac5cc815bdfea967ab2e9b5553172606ce872d5a6832c75563c483c3cc0a861e2e09aa7b7efe93ee14936e0b0b756fb3544458f387dc0bce15373ce458cca46078c1b0efd714f079ba23cdd3674727450b34bd6aada2909c3b041d9b61e6e8a2bf395c1306bd86c4b4f216abbe58b8d1a10753ba474294ad9ab4a747851c3a40169422ace3068d04d5df8673d538bcc19f23fed510c75ea6d9a95653103b647ca8c50d11d6aad2c4b3b0d53064469cf1e76ecfc163a211f0c8748434386c6e8a4d5887bc98a596559c8f8f83563d0d5fa78daff27bdb36250cdc397dc1c065509e152d5e8cddbd911110f0ff900a961c0b0fdec6951b2ec5db9e60b07353be91bffa4dbd5769112375e48ebf1d1e251acf11daa5145177af56998d0df3dcafd0ac9aa801a2eb4a72ea76ddb0110409c226f8a83870b78c002768094546e7c844c7154a044c56900458a1d6c0a0300a084440718460abfb174dc085920040800c988371d2d3292a3001a0000fa2819a9908078781480b2841c381a331425943849127c0c111c381cc7002848d891a3e1701c02a01c01797810806204f451025221591e1e05a014010f628ce7ecd9937d53887096ead75628793e771716a00c41b932dff68996baccd65d5084e0892e1595d529f5bd82700c7d25d54ecac5a9070465cef03446a91b2f4bca0f70b19d3b8694bab4fe0b240b8a0f9a0f1e7af6ad92f3b407a5077c12d257e7b8cc69251a141eb07e2e5be9971e73eb10ca0e5232c7837b9c6d5dd3c169eb15f72a5bdb2a3d25072dad1e3df4d8e7f2060507cb9aa5b5ef483f7b31e5068a8e9aea17b54a8c88620364bc90b1b6aa78b8d5c373ecb0218517283550d4d22debc4ce94baa2c11e86762dc4da594a8d66a0d2d9a3e4feaed63d65907e51726edabad5251683c3ee4d667c9626cc0503e56d31d4ed20e505df162b5ccd5c2967bc1f464cc75d6c8f2f8a0bfef4d32b4c4cd391515af0e71bab53e8acce6c4d61814a64beeb951fe67aa4ac205bf3b8151eb67da6282a488e4ea5fba310dee1d6a0a4802575ba8efd8c3f41c2a098b138692736f2d6d20f75414101534c0f7ba9d25e5fa494717cd84178fe8933edfa827282f46c9cd0f33e2b2f2519059eb5c857a262cc09b128f8cf69c888f21c2fc4a160fcd6d988a15fbdad581850ac3b7a6edbf73c392217e61309716ecad7e3eaabdd1388bd92a2dcc4e7944f277655f942df0ab1a6ea7042255747ab4bd12f6da2b59d84167de2cdc6cbc268a2919d221e5f7c7794cac4e5eaa6bd7e74ebba30d128257ec6bcc412db39c05ca22d6cd5ae2b2dc53d84c6124bb593362fdf0f3386c003aa3853094ce70e356fd9fcdc58655940403ec4a04463cd3073b5759c31744826f1bcf03173a9f59d8c92d0f3d6d87ca9573d8c9168f9e9a0969b940682c6a812348a63882184102224c4ba9434068208128441911407b2280fb75d03124020518e45390c8218c810638c318410428c3184182223424443ea53fd4ea0801d6e488f4607b58645876d1805737175d862def8ea1ed8bac756ef81a759f149f52abe447b3502460ff52cc82fa1c0b6805c6f4e06dc32b870504d5cc301137602e9599dc194e10da01c46e868259b03759cd4de54d7bb26d09d7cf287beaf8451ab1edbdd492e208888991a0015ee0b2172cf570e6d7fb33284fe04eee2d27b4bb400f6d79e304347d64609ddf482df2091a74121be2a65e22898a6be1cf6c34e7d54a7d53e8c066ad8b23b019e089ec3d8442170a5b3840af1f78dc3cb18c7dd0ae504ae4b69995451d4eecc383ebb6fdf2f53c99f23195c9222bdff6536c96a777aab0853cba4ca56a6c1c07aac283f4f77d41e2e3c1ff5ae77134d086ec4fccc40414d62f219441c2086cef709b7fa080ed33b8da20b3fe20523b8e7deda5c1712c600e249465bfff860ea2cc1411a4dc655b9b26cb641c52c4b8c1e43ec426dab62f74706f38b02f1e8c1a15e857d176b15c215f20dcf1613fdf7c62aa96e1d4275f9c2d79082abf25b521b5d9f989ffebc95398042206b561f723ccc34065a38c68a67ec20af13ab88806dd968000a9239e38a7596e93d7b5d06856fd6cf1f8ee6ca21cbf538ef458e2c3f3b62ffa931c34e79869da26ae929d4c6c877baffab86812ef549220892596af5b082b407331c1bc1cb84e860dd48d473a18439258dd43e3268ef4e24af63992a1c38a21d9208a31756da11ac45286441f85cf838a0749b45037bab34116a9c26f503d56a6c735ad9d8e5e72de32914cd881b324980531c9d5c149d07dd5e4b600712e643e31dd72ac18962a00a740629b3f313e225c3503c84e3f6f425364ed81eaf52a7ee2e3b426aa3dca86ae215ef1f781247f787be58dce184d52ae95e41c9d6bc3ce068f459582b0c938a41b45c3ebe841f325741582b6d8978cd07d254b881bac83b596644163779207bf9f5b25df4fd6d1bb73160dbcd70eda0cebc761b663e9247b2a89208728b4303787fc4abaa1cae7a45691102a88f1e747d83a68a8a662d33ba95e5f83f209d216616bc3e6cac8fc4dffc95fb0369ae02447d668df2076d3cb92bc29915637c90d2c9e62e16a07c07ab2b29952cf91df272f28004343051bc8857cee62f88c8d282be2410b66fd5c649647d0cb09015f003db570b0b8dc3804699c47de6951ac09b42cdb2d069b22227a44edd09116909cc785a80fe1097ce5d81a921a078e88584082809af760f0c0af5586bb4c54b61aaa8c92e1c64133a7166322c19c161025062fe35ee7052cc25b268858ddc2b10c62361c82e39cd14d31ce9c641e148cc76ae54dbd7a5a408dd47897a49f4fe07601aa65233f8a5fae1903efa8cd7d8a6804550d5a6e8bd4cafef78d9980b6b0ca87d0d4b35e20f95d1d93f93d912ff2fdbd4de8b155a435bbef2bf0c60b46da65f4f250f83635e3eb767a2c4249f0d6585e5b1901c2e555c44f161a88980f85b90b3b12055b8b3f7b23864ede239957fe9548b1ab8c77dc9c8485ce8010055abaaf0871d465e226180cf1c571f8fc10b1e09197e9031003e9bc728905d443ac882963538527c3f92a7d959d4a88245eaae3344094d37e6d08ce6fe4c10ea7bb440a2653335b5e4f32dca5b56a355c428543fe91fc578826cb18eab5169ffa101369af3fb5ac9237258b4b5d4bc475d5a26f487b7f158a6c90874e24f75c19d4a81abee7c9fa7b5ad2a8aaf3c3b98faba3a3a675e537bdc553a1657b204ec9516194290d472d4b27f02aa667b3f49526d4602caaf6a9b3f5ac4059d2e1a2929d5957e5200d0435afd2bd356f85d4e425bf24dc58b7a1f0824b40e1f138efbd741c270e91a5ce8fa467dd367d2bdfc906cc4035700404b67ce76a6c42fa86ef682c1a3bad28c433745e5185f463400a044fe611289685c755583ff1cf90f59c440738d016ff6f58732153f4331b8580eaa6850a16d9c5fc322d6a8788b5ffde5a3e260dc700a60868c4a85f5ead5904805b151e5e172ab527079a15f057a4421e474a0460dac89e267a3561ab1aee5647d9968579d5be003a4a3b4b22cb77fa6c112271c61260ce4d0e9e7384d173a12aad8ef2dbfc4443bb609a7b984771c8d2cbadac23f375465d70f6bc1e0b61767ca991833469315842cc6c085f9d02b9214855406818aa9da070ee410bb489f02740db124e33a878bb61426ff95815e7ba5c78e4da1599ade4782e0d544d856e4ed5990e51ab763b64ccd659d692a331aaafc10f31bf2a5792edcc5eb982a0f20755cc0d0045b36a128318ffe13e5b6f830984b2717399edf96e15413fcc9033923a38fc677b5b1da39a81c1fdb1ac7fd550b6ae2dc9817a5cf57db5f31d79f34669a79381e7dbf6e6a5f1af6e25e6b5c3734b014553330d964bdba4d3434b1c381c64e4e81e9335294364376c329029939934d8b16d7fa3d4d23e2f066a415cfa199b473761cc412c6ae6ac9dba7426ab9f62908b6ecffc59bd14506ef5aaf806df6c5a9fcea6f4655ea5f397dee64587cd35dea5fbf195aa4060c06a5a0272f9039fe42f2af903673c974337fd336927f5556e68ea9f0a88a8650815b7052042b990dd6a6a1da20bd2360f8a1e04b0da6b557a3780f913d05053a9261eb2c82c7ce8e402869617f9549160fc73f121c4e1fa73cc5f38f7682488acfac102d9c7fdd5c664e169fc74113afbf4c256bc32b285f4570196ac4d66666b511ec881efde52d381b61ef0661b7fdc0a2ddfb95f571677a03e22f08b3b090fea1131358cdc238573b64fb94fac5333bdfaf604c818cc7ff3f8270eeb627d84811020ff903e9793289e1d590e621f8c0aaa74b1615145681ae079ccc9998581dae4561125ed0db6c203ca2310c12f667d038a972a6b9", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x45323df7cc47150b3930e2666b0aa313878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x26aa394eea5630e07c48ae0c9558cef7878d434d6125b40443fe11fd292d13a4": "0x03000000", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x0d715f2646c8f85767b5d2764bb27826878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x08147368656c6c", - "0x79e2fe5d327165001f8232643023ed8b878d434d6125b40443fe11fd292d13a4": "0x00000100", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/bridge-hub-kusama.json b/cumulus/parachains/chain-specs/bridge-hub-kusama.json deleted file mode 100644 index 5e45e1528a10..000000000000 --- a/cumulus/parachains/chain-specs/bridge-hub-kusama.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "Kusama BridgeHub", - "id": "bridge-hub-kusama", - "chainType": "Live", - "bootNodes": [ - "/dns/kusama-bridge-hub-connect-ew1-0.polkadot.io/tcp/30334/p2p/12D3KooWPQQPivrqQ51kRTDc2R1mtqwKT4GGtk2rapkY4FrwHrEp", - "/dns/kusama-bridge-hub-connect-ew1-1.polkadot.io/tcp/30334/p2p/12D3KooWPcF9Yk4gYrMju9CyWCV69hAFXbYsnxCLogwLGu9QFTRn", - "/dns/kusama-bridge-hub-connect-ue4-0.polkadot.io/tcp/30334/p2p/12D3KooWMf1sVnJDTkKWtaThqvrgcSPLbfGXttSqbwhM2DJp9BUG", - "/dns/kusama-bridge-hub-connect-ue4-1.polkadot.io/tcp/30334/p2p/12D3KooWQaV7wMfNVKy2aMz4Lds3TTxgSDyZAUEnbAZMfD8rW3ow", - "/dns/kusama-bridge-hub-connect-ew1-0.polkadot.io/tcp/443/wss/p2p/12D3KooWPQQPivrqQ51kRTDc2R1mtqwKT4GGtk2rapkY4FrwHrEp", - "/dns/kusama-bridge-hub-connect-ew1-1.polkadot.io/tcp/443/wss/p2p/12D3KooWPcF9Yk4gYrMju9CyWCV69hAFXbYsnxCLogwLGu9QFTRn", - "/dns/kusama-bridge-hub-connect-ue4-0.polkadot.io/tcp/443/wss/p2p/12D3KooWMf1sVnJDTkKWtaThqvrgcSPLbfGXttSqbwhM2DJp9BUG", - "/dns/kusama-bridge-hub-connect-ue4-1.polkadot.io/tcp/443/wss/p2p/12D3KooWQaV7wMfNVKy2aMz4Lds3TTxgSDyZAUEnbAZMfD8rW3ow", - "/dns/boot.stake.plus/tcp/41333/p2p/12D3KooWBzbs2jsXjG5dipktGPKaUm9XWvkmeJFsEAGkVt946Aa7", - "/dns/boot.stake.plus/tcp/41334/wss/p2p/12D3KooWBzbs2jsXjG5dipktGPKaUm9XWvkmeJFsEAGkVt946Aa7", - "/dns/boot.metaspan.io/tcp/26032/p2p/12D3KooWKfuSaZrLNz43PDgM4inMALXRHTSh2WBuqQtZRq8zmT1Z", - "/dns/boot.metaspan.io/tcp/26036/wss/p2p/12D3KooWKfuSaZrLNz43PDgM4inMALXRHTSh2WBuqQtZRq8zmT1Z", - "/dns/boot-cr.gatotech.network/tcp/33230/p2p/12D3KooWFQFmg8UqAYLDNc2onySB6o5LLvpbx3eXZVqz9YFxAmXs", - "/dns/boot-cr.gatotech.network/tcp/35230/wss/p2p/12D3KooWFQFmg8UqAYLDNc2onySB6o5LLvpbx3eXZVqz9YFxAmXs", - "/dns/bridge-hub-kusama-bootnode.turboflakes.io/tcp/30615/p2p/12D3KooWE3dJXbwA5SQqbDNxHfj7BXJRcy2KiXWjJY4VUMKoa7S2", - "/dns/bridge-hub-kusama-bootnode.turboflakes.io/tcp/30715/wss/p2p/12D3KooWE3dJXbwA5SQqbDNxHfj7BXJRcy2KiXWjJY4VUMKoa7S2", - "/dns/boot-node.helikon.io/tcp/10250/p2p/12D3KooWDJLkhqQdXcVKWX7CqJHnpAY6PzrPc4ZG2CUWnARbmguy", - "/dns/boot-node.helikon.io/tcp/10252/wss/p2p/12D3KooWDJLkhqQdXcVKWX7CqJHnpAY6PzrPc4ZG2CUWnARbmguy", - "/dns/bridge-hub-kusama.bootnode.amforc.com/tcp/30337/p2p/12D3KooWGNeQJ5rXnEJkVUuQqwHd8aV5GkTAheaRoCaK8ZwW94id", - "/dns/bridge-hub-kusama.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWGNeQJ5rXnEJkVUuQqwHd8aV5GkTAheaRoCaK8ZwW94id", - "/dns/kusama-bridge-hub-boot-ng.dwellir.com/tcp/30337/p2p/12D3KooWBFskNCQDVjuUeBh6vrszWrUvYMBBhtZRLnoTZDdLYbW5", - "/dns/kusama-bridge-hub-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWBFskNCQDVjuUeBh6vrszWrUvYMBBhtZRLnoTZDdLYbW5" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 2, - "tokenDecimals": 12, - "tokenSymbol": "KSM" - }, - "relay_chain": "kusama", - "para_id": 1002, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xea030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x1024f063334d367a9a9de80249cc2d39127236124cd65601840387a5048afefa27de0f015d686f4ef823353d5217a87686d3b0fb5e8a46d6652c3f217d85f2ff1afa66e865f8710e3373bd7042e4ee89e363dcea7ca2f46f118d5b5962967f3b0972a5376b58ed027e2aeb7093e96e6a3c67a5562ba8dc883562cb88ceefcc3c16", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x5005ca1f000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x0000000082395e6a00", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9170ab9e3067cafb34b160da9119e7aed72a5376b58ed027e2aeb7093e96e6a3c67a5562ba8dc883562cb88ceefcc3c16": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da91a6f5560d454405e76bae8d20f41990624f063334d367a9a9de80249cc2d39127236124cd65601840387a5048afefa27": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9609afedb001690b07828b8dac6c74ef6de0f015d686f4ef823353d5217a87686d3b0fb5e8a46d6652c3f217d85f2ff1a": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da97896e968dee3411be7bcb6e538298679fa66e865f8710e3373bd7042e4ee89e363dcea7ca2f46f118d5b5962967f3b09": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x08446272696467652d6875622d6b7573616d61", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00587474043ef944860f5520581aa5037f9463647bd51e20bd6080b25e2406f1abe2ec64b0ff439520e6ed1847818671893a082d0b4f42116c01308207e08dc5aec66d31d43ec516ffa92d7662a8fd98ec1f76cab795dff6de9bc82da54c29a5cd10a10efb0e1c4f13c9f633aca37a92de6379982bb2e96028fc7a9299932a1e86bec7249429b798fcab616053eb3b55520f2327063a65719ee43b900a9e543d4966d3c3480f631dd10dc01013bdf629388c9cb39a5ea32616f37d95349b2bc62433a2298b8482459233a3906bd2ddd5c38e79b4ee1899cd455a240e53c4f6cc47e3efcafa3a7bd677e4d752fcf7bc3dd377dc248309df77a74a0a5f7255d23aa9ff2e6ab7ab3314bec5d5195aa78ffec7d58ebed7715a66ae260ae16370abaf4afa1e73dedde7bdd523260a3f3e6661dc99b56170b9fdc9ecf2e8ffe9b755930e4ce1fff4db9a8b9b0e0e218d5c875531f96b073b6ed333ed8a6e008822c32dd8f64c49e3cf64a1deb3bee3bf44b4fd2bd3f7bb3de03fae1ed9b7cd5899cfc7ebceffe5e840625a3da0f12b0df5c7dc35a087add65c6d9285f6bfad5a47f4bdec62befff1de8e5847b49f93ddf9ffb4a490b3c22c0fff9fee214cfe254cab1586faaf06d4cf1f6b0d08c667edc7d2c81db18ee026e96a8fd399a1fffde3905847f475c73f93856e00881e7b9427466394f45749dddffddddd0b757777ffdde121f8218a6f547f7fd7a8fa68f7ef6814d3fe410aedcfbac7534dab0bb469d541fbb77994603bd998bbf2810add956a4c02e8ae7a38a2da4f7ffcfdd728ebe93e666d4be3c614db9ec9d47acf58038a1420b21e630d487c8babf1e363ad019934fe6aafbbf7ab01c1ffe9f8ab39b69ae42a11956f6d555affe3d6561fb57e3520f998b5d50850ebb1d54a5c6d424b6f6d7557d4fab8d5edae89921c86d840adafdb5d0d42adaff187c76d6969d3c1e388238e3134beb55519e87b8c336b7b7f018b5a72d3c1a291ab4c2d4e078e238e38e2a09588c228e4cc5f4d94257b1cd8de3471613b8d3077d5c38a564977d5c316ba9f750fa7f64f8dda956a0c5d5a75d0fdddb13fd8f2e88d296f4c5fa3f877e96b54ff3ec61867fc5867bb343eba48e96ea9fffb7ed7809a5ba6f1d12589ee96f2bf6dbbeb8d696bfcab39f7560392ddf5d2de98ae6681652eb0a5fddbcf5ff7b1eddff77e23ebdc1235d380f1f336c9982b55185a1fed97fc52aef76cefd449f9eba48f1907ef76773f35eabd3fe6f0fd41c8bd8d6973b5df7d2636b33bead3fe6d54a3f8376c7be6feebae9f35a0e5b6bb2a81b6bbfe9f464dfefe53a37c633a1bd56f6ad4f36de96aef7ffaa779d39941527e4999d399c19fdf9f3921a68f7be72a53fe9f7ea601b67477d449fbb16d54e5f77f9fa30389c95f33dadbddfb044cfe0bf01b716ebb7b5c95749fb747b324aa834599d468339cf1d6744599440df36cb7077ff5dfeef665a32a53ff7dcc3718a6fffe6a3eb6bbfae8be73b2bbfd9fc63ce3cda9c624666128934c667b2c6115d5e10194bfbfb50b3c958af2b30664aa287fd6a8a5fdab016115e5ffe9dd76346764d20d009173af816d63bbf3c20126fffe96b0f59e28efa1c00757ca192194e93bfdeff74fde13c57a28d18a5c149982027f68c15ca102942f62c6a80296149493eff43f2eca2905e53de48616cc152a40f922668c2a604945912928d277f88716cc152a40f922668c2a604941c1e2ffb8f51dfefda1c7fd05e3df46d57de6b6bbfd7d22e61b6c57aa2a742d6c1730f9f7b7a4c306c36089242e9d3674a8a0c3860e183a473a5e747c907325470a3938c871424e0f72769013860e941c1ee478c9c9418e303951e43c915345e749ce514e1c3945c8a9414e17393de4c420c728c74a0e14392ec869418e11392fc801470e113943e43cc961410e1039a290430a3a44e498428e0f398890e3448e34727ec821262705394de4202187891c71e41c21278d1c2a3952e4ac20070539aa90a3821c247292c839418e0c72b0e45421070d1d554e149a247214714a3aad7152c2a98d131b27334e4338a171f2e21483d3151c28e010010709470c0e12708e8003049c20e08c81a3064e1370ccc029034708385f70c8c00183b3039c30707880930353114c49386c9896807306ce0f70dac059024ed28d13372bb839e2c6e8460537546eaeb8b1e246cb4d153745dc107123e5c6889b14dca0e046899b19dc507193e5668a1b19dc60b991e226063730b869c14d143750dc3c71c3829b2a3743dc087113e5a6e826881b206ea0dc3cb9f9e1c6879b1e6e54a63126384c5030b9617a82a909262498904c473019c1a404d317261b98ae98a230553159311961926213874d1a3668d8f4c0a68bcd17365c6cb4d80c6123844d149b229c1ed4bc5133851a29d440c1c6079b206c7aa869a3e6083548a861a3068d9a356acea8d15223839a2a6aa8a8d9a2860635596aa6a899414d0b6aaad44451e3848d1a3541d8c04113070d1568d0a80182260d1a22d0c0a0464513041a20d0944133060d189a18d4f850d3038d14345868544093021a24688e9870cc31130af38df984d9c614c2148346ca0433d59868cc3013073440cc20cc22cc1bcc2f66976983e9c5e43257b38bc9c5dc62d2606a31ad5842b05181c98b09889c31333fcc006133c63505cb4806099923648c648cf02b6686f05470312113c522423fd129e82a1619355b2c38fa8a0504cb0839516815d8acac319a05396ef40a72b6c811a29ba841ca01a3460dcb8ca9440e1cdd0216c26242bb20878b1c2af4949c29e478c302c25ac34ac285021313da896622e70639aa86a266ca9584a584b69263044b0d4b4c53b1d0b082c8419248d7132e363022b02230299811d810d80930240c50802b09272c4e3d385d71b5f156d718b08d9926c80461060a1e46526130ae1e5848d6102c30d61939502e1ec8377470a0c34547c1b4e5948413146aa25043058f024d1197159716ab059717971225364a3c28dda00446a907a523947650fa81a94b498c121caf0acb0d6b8cd584a7c5a68a67c555c675c625047fc2a57028a014201cf38709c47cc22eb0a1c2565c8c23c18d201346068d69c435e01b701716141889d760245c5b2e2eae2c3a893e81dc6215711dc1326246357d30bd611df17a20038425859f601121b190475848b081529a82c98c8b0ca9326d81a3841a2badc44c190c25668954c429e20c7a89d20a729e10b5340a4c63949c702b66cc88555862c808c140c02df8498d0bac29d6129612960c2c144c272c24260b6695191fac221f6309e150b0869054c8195854ac342c362219d61b561bd69115c6a4850c115715388839039b13f0103640a0419a656030c05080a5006b027b01e604460596059b028b01860593012605a6028c05d814ac05970f30283025b028b02bd80a30176054ae2f9718d70fae238c09ac0ab604f60466e532e232ba8a885368744093031a1cd078a10183e606345fd074a1b1018d17345c6856345dd0d480860b9a2d686840a3054d16345b68b0a0b982c68a9a2b3455689cb0a260fdc03a820d10d612ac2fd71b384fb84e80f306840202017f803e4028f0098cf26ca033058723871ba52a2515e0ac2153844c514d16d30c8f43aaf19e5850e02481c6888b0a9714bc08384cb0a2c430667a68249921b8c872828c94d6a2b7b40eb024ac27e478824d143021b0281c038601c3c129602acc04af8097e02aec044761ae715a8295f4a8d88ca141c2a98c8e82c3d820c114047f31d1c02a821504d3155619d6096ac298b0e028a62498da2815c19485e5031b241aa31810a0009e9906c40263ba7c2da1d41eb403110f085142242807214230761c9004091172cd40718390241f4002e4c891241010ba21e8c891241030c0cc13bbc3912244848270101214f40102ccb060937c0049112124581224021d841451428590048580044482fc4c950dba0149122442880829a28406dd8024890584908820c90d375016669cc021c90d4138b430b382dd8104414684ecb0030982664092a4c80e3b0465609b51c18ea08812ba24c8c892241bb8c036436585048920480434d4804310084040a40603cca46077307243500e3734b13b0821095a12940392223fc30492221fd09999b23714d901499125424d828490e088122544842c09c2e1481111a48cdc90e4484ac7cc121b0221448488e0404428a80234334a94a0c8112245848a20297233830211dc10d424a86626895d920402d9cc097687a02242459624c9414804446c66905824498a08115922021c84082539b28390224a28912522a0376f0a6be48624473c20244888080e458e106122b31c74c40344849088e00342846e085a52040724458408c9b1029462adc0e8b2852e11b62b958a3291e788700bdcc24ad87a3af01feae8409d6d8680bbf4d71d63d4a2e67e8add1ea3d6b1376a518b317aeca83df7d77df26dad63b7776ccd7737768cdd0ebddddba347df7d2e13bd5fb73f7f5132f3cac4d72edf3247c80c6962f4dedd185f77cb27fdf96e8c71a3f7c218e3babcde945266e635ecb664dc4b3225f93ac6ce715ef76eebb575b9474bb6f7c67d298f71638c3872a663dc8d2ee5faf3f806f0b63b46cf5ef7831d3b4ab9bbddeefdba775b6ec7dd8edbbddbedb4bd3bbeddee175bd88dfb1e7cce31f2f308df8bf141678fdb2de5c6ee95b26facedee09fbf1936f4646be6b4acbb2dc6577f477f9c25de8bb71ddfded7694dbedde2fc69fd849778fccf0010e6840472303948931c218b51d0c7048231dca1867bcdbdd6334c118635bcfdff5fcbd88f9f6fa9a4c1ac7c8bcddc37b017dea75776721f3d63c00b1e345b3bb2f6b7f98c3a679bdd7c2d734976cb81de17a43b8d776efe3c7bcb2574a99374380f7643f87ddd2df6cf85c3ef8dededcdcdccce94feb8dbd592f0b9d65f1d4bced71773bba1563afd5fedc5fc9e7b36b69bc7b7b7070bad7dd3db67b778c0edd4fbb32c66e993500bca300bab97979bd63f77befb949cabe91b1a335e3eebabbcdc66e544ecd5eefcadce63d0574af7bc7eef7ae6b574a29a5cbf76666decccc7b7d5dfe9e3fe9fe64bcaeeb6aec5d524af9dc358f1bd71d67370ec0b3ee8e7105d0dded31ecf0ddde6e21c616ba7b3d6a5a6f7b8c31c6eeeece121063d6bd0f00edbd0d805df7ed861e978bbb71771d86766c773b72f7b6ec868ef364cb766fb9af1b3ed87d79fbdbdd8dd2bdbbbbbbdfbe17fbc11929e525df7ab6ddddbbbbfeb20c013cd90bbe6f17bede9aac1bbee752beb7beeddddecedbeeceeecfdbbbdb6a87d13b6e773fe6d6614327095eb34d8225494210148218038a85264946200400940260f815604000089014c9610722397c028e1431c2730002f0e85ce872b890830001288001786a70385224871b84081d1101910f04e1b063110086007042449604210902c1921d04802d0c413bec10b444490892dc20644910932437042d114264071c6e08128200232805c0a0e486a01d7a4a39dc2044c4034272d8a10892221fe8b60f145912c444c80210a00005c08043909024424a48b0e48600948e0431093a22a4099110b4c00208921c11020224454000822447727c93201c90141182a408911c6ef8c00792701c825d04042df9809025498488dc90e4c811223a0a8043d092201c9624118252000c4260083242e4880784041559225480a0101411422282259c8dcf078444c0824d93a01c84082129b24489901b76281282254484762040cd0e394c0b4392244b728cdc40c403478e245952801d22414b7248106444885093202400d0211404821c2bec20b4439126413aac4500922445846e20b20312224b84840815094108927439168626453e10b4440967b38448d0911b74982009f29a45801024498aecb0248889101c900429514244481008882c4922b48310a126413a982009f202685e3411af6bd810229ef1a12122a2b87008110f0d110d0d0d1111c5a1a1a1a137e43d64888986867c08112f5169c8120d1111bda1378488878686868688de901d1af221433cc443433d648887867ac80e0d0d1111f910221ee2214b44740d191ae2213b34d44388181249226b081113f10e0d1111bd21434b148710f112c121bb43889888e80d592222221fb244443d84888978c812f19008bc14f0ee72087620b201717471c612a020052ac4912a3d14a2548983827dc6edeed4feb894b71a84466e1be2d40f1b47aa2847aaf4bde960a5c44529fd552afdf51e4a89737239c1022b984041173aa892ba1e4ae9a140297127dfe1b7382017fadfbe77a24f06fab0e317d87baccade1e53efbc7fbfe4d13aa7ccf7fdafbb1d8f04d8fa15df32c58de8fe83d1924f4a6f96d192dbcad285652fcbbc397b5bcaf6c2324de6c9c878b3cc6ea66d96edb63249741f939999c976abaedaad7618ba4f53f36a6abcb9060cdddfe2a5af749556b551129217305b380b1b7115568d01e3cf91d60b577745b9dbfd3d185f8cde1cb9dddf83305acfb2bcd97a3046cb92b274bdebf2e6cb92a5d2756158a63d4df366edc2b24cd3646466e69bd39ba796b14cc6333319cf99314d8dcdb3b1f1669b9a6c6db235ed56e7aeb042b638a7773a79f38926e3ad26e3cd06b3319932de6e341f4cb19b8cb715341f4c17e7e1e078338e9491cb637fad782365782801db1d3572111785a129ae3eca9cedd26c775977fcabf57270a5c4ac9c44997298e5d1c4acebe5c71ed12f4bccca61c2f0eef0978c68a6e4a8c2452c858bb8e88a991dbd17ccca616212ddc35f3a16790f7bf11d7f33a8d0a3683485eee12d7ac7cb7bee42fd6b7ce2d9919bc0e808b303c985a418c68401431f57b9e8c50c08aaf8323e1e4c7e6c9bc6d49d4eff7e018716eaafd39c049ac2df2fa210057defd328a7fc32346a57406c41f97368d4527ea1eea151f147a051bb122289fdb202adbbf2547d5a7d9ebc2421b43c8155b0ec2a081ed0ba6d50ee473103da47972c9b0f2eabcd07972e8daaf31bc528ca93f2c7c00cf0df4167a86fdec47c5a7d28dfd0edf20509b4b9ba5e28fb54a0a98f2e3f3d1b35c32a77c29fa7bbd25b8f61966571ee25eee37bac33d6dee73ca3299fe6eb53f9bcb2de9fc3342a7b7f16d33df3fdb98d46697f595f9279b9b15177fe341b17f98ebf9f4aa814a292db5c0372ed7df6ad0159998faada973e7becafc74a1b767155885effd3d85695d0eb57b3c0d212b7dd49ae3aa117c7461a0636c52adff19f58ccca2b5e79cf10dff1c7647845fde7265f93dc772767b61f66de09516ae6df3644cac7b82a2faece13955c0d42eb111e6a8489532b2598f90db3c99fd9a060abd1c0cd3c6f929bd97aab3ca868ff8fcf7012d47f66fb8148b5aa6254f4c4871e54292844292c6e46ac0cf1a4b0b406b9ef37b54ce73849eb1217d8eea8700a59655ed7c6a9cbcbb551e04777fe6379b84c0f544f3a8aa64293c8a4c8edc1cb83df1f6be7c2df172f3ddbeba50bf55d6de1a3a579a4a017980753c04557b8888dbc07fb2cdbf8b16d7d07f2eed38ec7a7c4cdff5dc7c383c56cbd674fefebd38d5c9590abf371fd3f7cc725e5ad4a2a23c5ac3c0546d1a80a8fa02a2b82460ea7505885a7507f78e43dd7fb4330fcfed7065f84619cc8ea1b26ac68d78bbf3e06f85729065d126995c1815fe85f1579a17b03baab2215c55863aebfccca5b683f6f69d4168df2ba6168ff220de9aedfd262ee2a8831d43fcce3551b18cdf6f09e063c595948299edba3e9feae37ef93a944fc562f85b50df6f9d71874f48e3f6fa7eedeb6a9d30ce69bd2a82a1f958cf29ba2d02145efd4a70589f6571eea6fc5ed4260fd1ddd5fdee5e5ddf7de3d7af4e85e4dd49f3fbff77a777a0fab7ca7bf9f0233ebae9fb5eb4987e9af4fbb1f6e5cd41d4ba1fd6e90516ca6fa3e2f03ae34a64597bc4cba2a559f6e4fede84bd513d71df469aa4eba625255d2eda752a95455524fca39fb77b9250c35a0a701bd8cfaf3f6fcf01dffa3d282d99ae34a634abae4e938623ead9d98efb60790dfd99e09f08ebfe7a075bd9c8440fd2b0dad1d75dea92b06f5af25ca1ad08fe5e1ef39984feb2679a1a1cb6508336865158d0f1bb4d1ddd219ba5cd85863ddf9c954220aaf604b74e038e8be90a4d6f363bb959607bfb55dfc4253f8fca1052174f8d6fff44f6fd6eeaedc7ab79ad1dead5fd62eeea0fcd085ca4363a0fcfd949988b9bf5fe5aea4c989b298c11359c818e30427489192a1753ead27f6014bb204127230842e68b044169a163350a1832e9a6085104d202395d1fe29b320a2f2830ec8102345142ca801b66e6411860f5c8081e508405c3478ddf3524a992bbd87552a95aaa8f2d0fd4e4eef19fa8112b88861869820002155a22d7b7770336781ed1cc25c2fdc0883d2d0f5c20944a0278acd30ddffe99e975a2f5b63a0fbfc8e9ca80b74bfb336df4cddf14b6207288c0045163dd0600a95f4e28d1ea8fc94db49f2f5f2ad5fefb9b8e93bfcfc4cab89fa4aa552f990aa3aa8efa0a9da51cf42bd8b942ca84b6e46cbdce93d32c51f37b9bd4d4a99fca64631e59ffc3a1ac5bfdec3e407478c61638a2a82d841cae9ca0a16d4dfd4a8a627fad33fdddbec8ebfb4997a87dff4c43cd15d597182dad05d599142773067e4e110d87acfea8b2954c8e92e0fded4fe64060c80830372751ffefb0a6dc0cc7d78817d23d0dd7d397663d7d7d7d77f9d8899076ca61fa80500b0a0432727c70967851b934d0dcd9c91d132ec2a492bc2e7cdcb637f351d380e6ac5ffa779eba9c7b9dd1dfeed6d290f3151770f81e33357e57bd9efc96ddfb3b85f728f6efff6af77dcaa90f7f63b7cbcdc924785bc9ff0f7efe7f5f5fd7adaf7a7abf9d39f266266f2f6d1f8f0428b7fbf8415fe76f71efc0739d9ddfbd7dd7befdfbff73ef263a435d678bf8bb22cf956fc2aa5251bca33de2f57275d7eeba1fc6a3dbff57d3531fb6b46fdb34631e72f3794c5ccffd3567d52e8f11a98ff72d544f7678698fdfbdbc3c7521d380e2abff22fb30d987e6b97479d747f1715bfcadfeeb8faa87c6bb301331f954f8d3ce7df9f268acc6030e7f7ef0bf4c6dcebceb99fce020c25bc082174088f9c5646aeabd2b912228c0e21640821840c397ed25d0da0185522841046871042c83d77034ea14547ac8217336ac0252929498b8e38855724c384089f11d314ff6df13d86cc3ce104b24a25f9117e7c4b72db5d7ceb31eb02efe166fdd380ac1fcb11721b9f3c0da81f4ed3890a2e9820554e8a7c8c163ec60d1f430377e315c924bda25724b3e9637c8c5479a1011524a4305768aad24aa5828f9f7cfec71a507cb72ecb7adcc64dc6885d253884c687ffe318ccb8d680a4f5e2931c43c82dd312fb1a60c82bb10957ae5ce1455252d24a87f543141aa40009294cc71863fc7e0861e408e38c042085d80c3a26241925d5206909495796a0d1c83d55a98ba77aaaa4a4248c46cec72c0fffd9c476346534724dbaf32f0d0132182ce7693b1e0aa150e4c2e6bb8e87c787d63df2999f7155d23c569a365ccde944c3cda3c949297fb7f4f544e58ac2dd29bdfc1227b7fa429199c4a147a435fcf22e278d2b04297c2b8b18638c985b177848a315217ddce379c2e14fbf1a3ca4958ef8049fc949d6bf8fdb9391bb9bfb79b1ddaaa4bc5b7d94f9997bddc5879b0e7e6493649214d6d713abba737ed205ab2c56c96c7227bda4a428258b65cdaf3d66bec220f3b5001a9c14c6af4ee173bb6d8f0c557af8bb3dae87cfcb000af00bbe5db204e1f11e25146006b0147ec17fce9929c39d34ae9e78a8e422579bd60d83c6bf36a6a5ed6d075f89f74896c20cd87d41fe53989494d46397476d2abf36ad2c85fa07f11e36f21d7f29f7a89e68dd23ea8f651b5336c2fe745a8c8db0af92ae174435f88cdb30ae721d008a1b8542a006e4697c8cb38bb783500362f1b68ce42a5318b7cbdb2e2cc3f28b2ec8d8519fb9eb6c6eeecb9e06b9d3054ea7d28b5540f81246f832c25f1a238cac01815cf62084ab0179f4c5d7428fc6f89163f228e45e6c48a567b6510ff63b7cfd4bdfeb7ead01e92772e629f3951ebedc1ef1e197b687b4b094b62740f0a4e42600fe93d203f1a9ebafa16b8b9b0028875a72306231c2d2b6ab80e7e4652f9bb19d0ad872b6d866ae01595f25157a55cc0d5bccca56f3c1df0fb7369d7aab5f855ed4801edceaa4dccceda6c3c6c799b808d36156817df2bd476780ed8eca46d41f0392724eedab4ff615018b7dddd9e87bf9d5d4590eebeb89bef823430c7ebcc706dff16f81c2d7b8da02ad279a9db013bd4eb4b4aba749a0a9c51d591efe4c0430d45f75b24900f22294410623ba0120c2f8bd816da3604fff468fefe1f628c6d9d32ef0de3f6ede423d8373424dfb9be831ebe01931578754945fa260569e525b4521f4d1749707fcd568e8d4fa4e5d240ab9e64d4852f8bdc9ee7cca7a4aa2f073f01eeb21c757a87f159a3590d96423fa7e91686d23bee2298beb31bee3ffb898fcb58da8ff26d1da46329b4f484a499fd163c17ae908bfd24840d2d865c0f5e2fd3c9de4bff7b3bbd37b721b9a2a95aa871496f7ef2d23efe3f3c34d0712f3bd051fcbd121c47cbf147e7c0fb51f4bdf632f7bf0f9dfc67c24a3fcb69a3dee0c6e4c597b5c364da7ceb27f42881bb99ac3297b1eb723a78d9c5c5367f4fdfbd7a717c4ef6841aeebce5fb2a0db274feff4aec07fdb43c8b778da0c4d23f79647fc48646dbb5dfca7013d274fc899781b019b26f8bcc113e55f0d4807dc6a47d97af8ba830c7983dc6cebcdb9d8cb56bbc0a38fd380ac13aa6614fedc1eefe1c37fddf3dc3cc1af939ab8d37b0fcf5b5c95148399b59dbae3e9ceffc7ccbaf3e75f4d76e71794c9148bcb2df3b8b73c6085143e9b206ebb1dfca701c51797ba06e4d1f7d374323d13641803b97a53ac784b9800e94de1e24d795762d2bbf2aebc296f8a5cedc020e41a15330ae126b14c08ffa7e326b78b198d4ee4b6bb139fa4b189b422b420e48e6434d2d5623661b7182b0c121c09068e847e2b1c09a390f33193091fe3631cc991ac30b20af5c7b2fa8a68fcb7552091eef2a84d82acef540743e3ff747542853e28b33aa942dfafb6dd45ae3a9942dfbfad3a128ddf5be41ec799679588c6e7b8c1af4f45dfaff5d5c7d0e749f439d2c977fc1d8cf75cffb87ae41571c9e629bea4f14b5c9593c6975c9d277aaa4fe343ae3ead275a7745fd5da3a153176725f98ebf37e14d89f54da133c8f81af55ed12ba2afbb9555ac8648d8eea83cd41f035a69bd5f5fbbd2d7a7f0d7a7c35fefc91ebef41eec21578ff050ebe363d62657cbb4acffe96cfbdd818f6dbb3bb5a3f04f14fec5d513ad934e0abfc4d549eba43c142a99f4fd428eb93a84bee77f1a90a7ef7f3c426b5b1a2d8b3bc2436184f021878487be4ce41a10cc42aba82084d17a55544a907240cae043cd47d34b967c8f164cc72065e86280f9d5a25b79a8ecd0ad9d6a8a0d7b6425488416952a54683f5f254ec555ee32257295bf4cc8a9a658960664e5b3edc7c78a8f4f1799490de8bdd47c34f52f65174a3e9edd08bf5a5c65328055fc42b6619b952bcae4971b6f21b98a6f61153380b3d817fabf4c0e8306cba31fb24a02903ac75b96477f89055be2e3c294da84c664238acdf4f0a854aa1f52cb2f1b7543f967146a74f0efe8787c7eb25049f97f50a08646c1e7b761087f0e8d2a517e2552406194ade7e7a2264e58b0855a36a0d6470dc892b10114be8483c2cf1ad543e116142e0a86a700ea5582a0fead01f96e4ff76a406c442d7e557835a711120d2788b043df470de89dc1bf0224d07700fa9c40017d38886d3c57a954aa294cc080be7f2fb3693ae9f81d9d0b3c53d0f731348a81a0ef7d64f889c00f0a04d982beafa151fb057d6f030786b441dfe3d0a88bbecf6177c5c41bf4bd50a334fabe49a376d5c40ff4bd9346b9a0a2d2c39346b15064057dcf521ae5f43d1ba5600b7dcf4934ead1f7fc9ea9346aabac80bee7281ab55fe87bbed2a85d5169027dcf52346acba0ef394ba376a5821dd0f7aca5519b03fa76b58225e83ba26f3583908223d1fe961770c30a1ff4c046117078f16ede53a9542aa3549581bedfe569d47b9ff7de7b4f6ecfa6fc356a0053bca05dca81154bac5ab0440fa02c21842d9660821666d6d05d2d1185254c91e265ded05d4d7102698a9627c63ccfcbc293c69ca1bb0202a90d20a08081316d7ec8c64c19baab2094a0f5ab4c8cee2a8828689d1a108298a279be7b0208eaef024f1058f0bc226cbb074e6a6ab83e9fd6b9710afe4fd3b03fdc170dea4b86bbc3cc8a0efd9262d6f56243a3fc7f644b4468f29eebf4d867efbdf7decb1ef6b4f7de7b6f4a5725fe4ff3a6bdc7ae92b466dcded582f9fc4b44dc8f4abfc743fff5bef180a586fe8be3c11fb64708218c97f53f0d2184d08a57fb15c5ac3a68d8d49327f2e33f29fdf53bba7b39f8cefbd2a6c477decbedbde55566c7fdf41eef864630a2efb197313951fe57f41e6b3e34e63ceb22db23fd374cd468d894f5446c5826a801a6c888fb82c1ac0bc6060e34aabe21cf881b2611a3b44a7fc518638cf18aa588c518638c31c6181f8b7fc52fc597568cf1b212e39146551da146d59c264a628cf17572b6c7d301b63b6a4945e3638f661ce82e3261b9a3740f703073f7141aab60fcc4bc1efb93efc4182363b5554fccecdf93b13d3ebe13fde1cbb8158d5f7d78cb14303e554ef1b3d0c85768fcea432357a59c5e5c4af6627141b215b00ffaa4c6448346268346f642e36f6d158daf86eee267988ac6bfb8c886eee2bff8bec5bf5c302b7ba1f1e373188d3a6a54c5f9d2a8ba5f68fcf8eca551fcf16b68547ffcf7d27bdec78f8fb33d7644ce4849f55a7ab114abd3fbebdcd1dd8bf38969bd9456e97fbabd24ad08df5f2f8044dcef05d663d795d9dc43d3a1217ebf06e0fb63de8fbd06fcb3efc7b0f72d7b97d19100bfd761da74e9a63adb7418db7452d2fa9fbe4ad6bbf5bc0591be637d5bd64bcbb22ccec82635159876bdcc6b40be7c198e072c35689c0ebff69b92cf830e733a41641e039b9279ed65381e9c60d1c04c135663a4348e07f932cf03961ae4cb703afcd613a578b85ee6b5af41e6b5e7d738275898ab417b8b7382bdf64eb29779a2d4a63675fda630d6807a890e33307d8f814d59bf04287e101dbe361d7ef99bc241fabf4d87069997af0199971c0f586ab05e7b1e74f8af972ff31ad0bec4f160713acce9d070bd7c0d94defad25baf3dc4a13b6d93296deb3bd7e62eb36d4adb36756d9b2a6d9b925e65e630a43bff2a37cc4aa2d7ef0b66d90f6651097e43967a68d5ac268e63d64c5a312bbdc75598991233464b124d912898fd3feedb9145e22a4c7e61fbdfd6ef757777774368c9a78367f5c826bdee608c566f9267ae2c95aedeeaf4d1195d6859327b4ccc2a6953d9a86e8a716606dda559a3fc5907e5fafb85ee623fba0ba35b0abd27e71e3d3266954166a55276bde5814959da2f7977377cdd1b345d9774633657330ccb324d939199113eef19b6642a112d95ae1d58a665ee892e96652e00adcb54222ae1152f4b3ebf9a3119b631c2117d3f85331f6279bcafee51f685a765c29aae62fa03537ac2845cdd304647f47d7d1fbdd0f7ba98fd6174f72ccb8a96b4a4252dcb8216f7bc74f73ebea30bcbf4f7cf8bf7bcd4fb77d4a8a54f876965fade0343df7bf8f579a14fc6a328bc5edf5ddff5ef860d1b767773fb62f09d3c3e62cc7dc8c5dcaf5326cd27036c9fa7983a4b1f11f369a4cbe509165a3f9b22af983c4559d80b23caff4c336ce93094ff1233f7314884597b75f21effe7efd52bc2d4d180f3f0743450e2017e49fee3746a786fbdc53989ff9cb3015aef9c4e0dee04be3f518a2855e23adf1133ebe9599be44d59dba6e2b629b86dea6d9b72a02027e7623eadbdc29ee895a9f66ad6d91651b75bc17647b5b2d09e2adafc7b82e5d15f9deef3e647ec0bef0c13dda7d177e43bfd15f6b08cac2376a7bfad2a67d0b6980043639246357a5531eb3b3af29e78148fde513c7aae49a06398e5d1bf5a9088e43bfd3f1d91bc47b64fe5e94a5fbfba518d48ee4611c9dd2822953a1e237938372aea89dc11ed7e6e2aa67f8d47f5444b4f98351ed17efee2643e30dd1d75d7f168ea1031275d2e504882be2d47071293b7d0ea53c0b8d1f2682eb35a57687f7d4746b45547b4fb5f1793dfcaf2da62a2f4484878a130d0e52285228acdf8742783bbbbbb7b8ca5eb7aec8a57bce215a347df22e7f303051721dca06ff9bd081261fec83ecb1e7b8c73a27df644a99920de83713a35602ff3329c1399c79e28359f28c5ef45dba329ffdc82f80effccf6c377f84b62a6cc36b54d1a615e5866f5792cdbb0ed8798f5443989ee585a71a15bc2ac9df72c0e8c52d58d287b12d9b6296cdbd46a5deacdc7521d474c1a5afae5a2461874351f3454c73fbeab802c0e8c682775c73d66633a05093475aedde8cecb984f6b27d5d0e55234055a170ce5189ea7b4847951318fd07ec77e98788f6500fcf8af51d7c78f9ffd6c54e923e783f3c58c5f7da80cdccfb52d91afc3908a5ea57f1f1f6e4b84e6d38062a9f48ffa0b9529854e8f98a8cf4f24bafaf22a94dfd49d494777fc5cd45cc3ee86dd0e9fc4a494d27b738e9fb01429a24001120ac25456c16fd8c5066174b75486ee0d806006855ce5e19946682309313e45e660ee2a092968f5a22794bf3af5a21374a1fc2ea5fa14a7c259666595f748793497084dea4344d917f8abfc1286124ab0d1c6acb76aa2fd588cf159960f969a9c52f3d155f6d1f43d56ca5cfbd2f3e1f43df61ed47cecf2f07f1c8e1bd3b9da6f3de49a9f7427df351ffdf2fd49a3daa46a94e42e2c66655589c6871761f014d3faeb8af966d00fbbbb39b80949ca441a812f1f5bcddd8b96073fcb606e1223794fe97969f054895bdfe9ed3d84db7b6babce092535e96eff6d4a3637e8fe5a343ebc58a20aadacaa5ec4468d6255a376b5c414cacf4fba8753cc49507e2f6a547c7e4c7edc2ab7aa0ea968bf5b2f97c77bb831951b53ac795ba61231c5d8995a1bfc1fffe9b811512824c754a6429d53d2ddfeba94eea6f7700fbbc31f85f2333341f9a7f76c8a59e5465ed41d7fb4c1ac5e4419cb5caf22dbc60a1f4bf9dd995be7770d889d88ee79d9ebf1585584ed63d66f4c31cbb2fce373e4b8b72dce8a568cd647aec69fa1056a24fe72e4aaacf1b76634fa889cb71bc9eef1e4d246174af72587b901752fa83fa6017914338f708200d4ffd280fc48a55241e9ee96e105455054610611b46cd1a6aee9b6827677779734a036c2cb3f1143fdb3690412f5379d8cb0a0fe3afcbf51bb3a0208eabfa35139a8bfd480bcdb80148608e30c22bafcc0031b294856115c687f0f8c30f2a1fd9188091744a10a4a24a18b1a7051a3d11a039502440fc8f4356a7950c414d44e0e68ff9b5bca688de149aaca40858042fd7d50af5100a0fd52d0fe961108b23d98fafb300984b0461457242db1f241aa4a9a8bd618a8fff2346ab944e1b260a898feccaca3e7a59c6ea376450411b4850ce9e7349d746063cc120fb22b330601eb626a74575286a06d9938745752d6c8ac9819dd15113dd0d3098a9e4fd349c734c130b4cedf81e49fed42f73d6c4b73625e74574faad03ab3a329e9ae9ec0807acf4bf1778d5afa830418df81dbc9347f47e7c2222185dfda76ac4077058418f4d15d215144ebf37815ae423b8e319902417ee8603a69547f93eeb6c7fbfe9dedf9d15f11501740fb0cdafde891ee48b03cfa7f784f0978a7bff988338400c33ed07eacc9f2e8c729e9aedfb91cbaebfeb883eeeeaee2bdd2e8e26042badf59e432f9777be4efef16607b24c766706d50ffda835adcf64e6531d4bfc240fd2f1c4ca74b1ed58072581e63d460d584df5b7a4a77b0fbe34329e5a42d7dc7e1c65b78d59d116f4982b7a0f1c1a58d156fe9cec88893e0298d7aeacf3960acf116dec22de193d1f2f06f2dbda5b3741775306b67a1ee71081cac8106f52dd4bf3d071d77307f78bf97252f0827d19d339828aa4c9e52190cf58f5ecc2ded56b952d25ebd9649c0fc37f5de391efc9fffe374f62d33bf12efd159fe26dea3b3bf29dfd6991fc7f1f80eff0fe6a636f5b3cfcdd5793ad5a77557b5a37557dd0f0c6c7760294e8706f8f135c0bf1c0ffbfc91e3014b0dfb1c9f077ec8c1dfd4a9bbfeb8bdeff4c36d7da79ee8ecff20fcfd36788fcefb4d2d6fd277fa77732ef335ba5c8a86a0ced529e97269c3085a7968ff13fedd30dece05e6fda9de368571c64f4cf8f1b9f214f895ab04b11ebb56a0c3367d1c853eee81be5f38e87b24f9de7bb9618053eb3b3aa217fa1ebeefedbd6f61bebbf7570c665da41c1a55a59246551d4774344a0bf2c4fddf4befe97f2fab70fb975d0d2186eeaf0de663e9fbdd517f29c6192f796fbddb87f2de8fbf5f24fadefbf81ebee70deb8ebf1d1fdbad2aa1f05bb30053c8010579efc5079f8e23267c9eeef6f7e126793b11deb30ae67bffe7db7bacda9c6734f9ad1fe23d9c32f58ebf9245a21ee17b6b935e9d50c762d65d86cbfc49ddc411858f75916150de2f32eccab55805f37dfd1f393f1168d47bf818d480e27b4f89ab52724f21171f48c711f33d8f0fb5361d48448e9033b247bec276073731bfffed802976f6eeefaeb91a8476a33ae7addfe71b8f3681e6aa8e23e643ce880e4c9c5ab97e4bdb0fa57742942afdb595a0f45867bde9607d954180e054f6d9974adb0f3f38190a2fb3dd3cce568f509cc75c03bac991dda3c477e05f7ffd6b54f6d7e778ecaf4dfbebfa2ae9f56cc5f721f3913351ebb513bd9e88fef8b5e1bcdc98aef04abc8785d7e4b3b0e5d0b83a698ecfe1aaa4395e7b1d20322fdf870cb7dde5784944354e0748f6dafbc871f3337f71442b70466e5a0372c35522ea385b3d62c2b6fde90a94e80a379bccaf264313c4fcd2634b533477e585185a7a99c716f3ac1ea1d7675b35d12c7bec31ae4e7a5dd767d96ff7b0f0f27aec59d8b677b2fff16baba7af796d63c214e75b03d27405ce88cc979eb519e6977e3520325f7a09acf0396e3e27e2bc95739363850d0826f33340329cfc6cb31e678bffe3d6564f9ccd639dadb0951eeb4c66aba5df8188cafc0ad86a3e88a80ef63af2ad27a218a7137f8527a2da86c96c95a9cc675b3d42b35f61f3a1fdf57103a2657fbdb5f9c05e7bb901c95e7bd62420f33832db66a5373dce568724404475b2d701a23df63e346ebb93798cdbeeb427a219a703e4faec7d5c3292ab43b4f4339f71daf5334f442fae12d1d2fff40a1bd39b9bfff19b6dbe69ab11a0336fb3551be8ccd76cf5089df920def352f06d781a10cd725658f8d5ac147d8a056ec894c2c284e9bca193ebba83a52666dd24258d724e820a31e5d285ee17baab5512c5b0ebb54b53d21dfca80179f6327f6d5af6329af67c6dfddad6d976f9755dd7bbbb5077b04977f0317ebc2e73fd4fef143377050531d40074576fe480629d3d0d687607df0263625f27a7e03769943f7c278d5a0a2fae36a1d7fb66d14ce32a11d5de37deb255227a699c0e16b5acf74d7eb6c95fcd6223a801f9b6e451df74a492465d0f2f4e88698903920f5fa851d6437e42e1c7d5a90d30036ca50ee6ae5661984ebf4abf8fbd17278dfb907fb86334acd498f179984f2de93b55a60efcd2ef914a95d2815c10ecaf771f7c11a38b2ad55120c85becda4ebe03c67c6afd885c7fc13aef01b23bfe3e90feabcee1ea874c125e6c990566d12b8d29697ddd76bed3ed2c0f2f4077ea411d86ce73707464036c7758ffa8f53ad66f2ad389ff68d489bf29ecb5dfd1289dd22f95bfdf354a07ae0bddf3bef3de337d9853bb7c50dae4f688c8ac1e609ba977fae3367f309fd687dcaf4afdceb0d6e9a63121dd3426d3ed2b8df93a4adbc97bdab087f990ab3eb49f36830bb2ebae5f7675b218f39dab3e1d44626be8ae99b9025d863373eecfdd2f22782e2260e7d01dbef6e7eecf1d3a84eefddcdd9d6377f87cdd17ca2feff204219722e7afdf7b90217c9e82c95f82ab09c8f583527d388dc9ef8f5f1c83c9136666e67766f2e4078f0aac1fe397f5f2ee26e46f76a77f4fdbc35ed60b0df36565d07ac35efacbecc7fc6d7c2c88b2e2c2c6ea055f5653b8983a74575d5041f361e6a0bbea420c135d8491749a3ca73c9d4ecfc33ecce3737a9487b2b1066aa64772f7a9bba3e8807677779fc2a8c11639e80208ea37a0fe7fc2a1d921cce81d6c8f1a1441fd5f0b3287106300000807e0620bf5674103f249b3860f5b8cd1850d88e0c3e70c7182eda18383c0851007a0be4515d45f4703f2b949c9218306509081062ba0fe3966777777b7109e1662500f83fa9f648381c6941f5041258a1294e8165aa67d2085a085156a001c98842caa40bbbbbb7f050da8b5226e70d3650104ea6fd280fc14441a3630649102066c5183fad768407e1a81105a20593952255101c01c228cb7c4cbc19625c4a079c2acf20a351a80850bc8c0228e37c0152a9a00e5888b24b46081460a1833fd329ba6938edfd1b9708513b45f8687c9114cc8c284288ab27843c70a4184b11a19571041fbb3693ae9f81d9d0b3c3158a185f6673e2f508218585a3046063fe0a23313e58dc5105045196568b9e207564431401530a0fdd79c3078230a313f7882c4e58c9c53924aa50a428a0ab2591a02ed2c48b4c150b1d2a1a20c3366804519ab2a90a0fd3134ea946508da3edd39ba082c9606f4168c2ed43fd698885031fb4c2105c865d2106e8cc14451156aa0ca212303eddf7e9f0804e9ce9a9b1e03751968a1ae0319c4a1c94075a2d9217cd0d11d77185258098214550000162a64607902463b8c4aa502221503fdf11dfe2224c8c9dc24639ee80ba4a07d06ed6e180c413b89360ca4409b0ddaff4b3b0647a0cb8576cfd4110f344e539c0063d2c4a08a996d1184c9821722660eddd515236052b8128796659ae8ae5e00c5ca0b989872ca78500466884943775594e484283d685f44616247e70201e8ae84d0c2e3055b66c0eba1bee7ef3d43360c8f0f2e62c898758fb80c8105adc186466933f8268df1deb3ccc862658c27d54dbaa26a610a0b868aa1fdcf5aad02bcdd59d6d38515786c716ffdb3fcbd8f3f6d6def8161a34704acb3f8be317d5b3d2243671e67f07f0f3723feef6df09f26017e298fc8402157fd9930856f410d0846d85207f37bb5b4bbc05fc87dff3f71fe6237eed3f15ca0fb16677af163b5acf8d6b3112b72496e95b65b1774d0edd666701ab9af960d5b3eece253191f72a6ee2693793de18287e77f47e7c2efc87e68c28ba328befb1d9fa3071c2d7eb0363d945cf0248bef7ec7cfc78a8e40418b1140a0421c47f0727af2e5c919ff113ea22b5c9004106e5085082b53a41cc78a10a79295215ce0048a4377e50233687d1e8902cc5593bf9ae87cbc9065770fc287ea7ff0193eefc7ee03c6eda6edd1f2f7b3463537b35c1edd5298dbc1df7a84666fbadc0ebe6b40a010f5b7409e0379d49fdfb9b6d8a7c0765fc7c9343309bfba94dd399c52638479aacfef026d37989bfe75fafb1b61eedf9cf1e163719d50770d08b6f41e4ef5cfc7d3438cf19b337e817f888cdeb25f775713b3e30af47142903ad72ea0d8ccfba6f2ab6f537fa646fce1ff346f3bf805e7749c4c2f7292db37e9a4dca26a68d3d602db1d4e8618b08319ac5258fcdf3f0f4f141d10e183226e90832e9720d2d81e1b4c10822ae5037521bc2d9a98a24aed5137e4f24c30dfa3fc2d704118b46e920bba70ea8918d30c7f04ba93c17adfdb7bee0f1f8490c14c268f3ece08fcf7b0680554ae0e4aa87cff758f5c5542a511ffb8d5195f897cffb749ef4de8d186ef42cd35e1945461eaccd0fd1b5d2e4548a1fe4198759396bc46d5ac9a583a57e73c9dfebb8e87a7fa34d1c1fc15e87209220c9a45a8779264dd2496c252497764cc9702068d343ebc7822d384135d2e5254409b2e172254f408c3018cefdfcb759267e15308218c727b92ab1b5f843052fee75c44ff1e42e1ef569feee914377295fff1bfee36c9ffd396b54bde6b2eb0fdddb13309739f553dd38d69c4554df70b28baa07c01ee812e57796332c30c517daf03e4a28fd36186ee6f10280fad1b07fd711a22263fd36d05ecb3a6c3eb30a90a8c1ad3dbfc3e66da6cf09d7e9beeebe67f1afb69995f0d68e67fba04c49c2ff3d65f5ffa6b05337bde1edad3fc6a40f37f9a8130e7d37018578928f6bcd55df9ac97cee6ebc9f475aef034bfc266da7c4e3cb4fbaff91fe74de6b16dbead3e4d4d0d2714e9fcd67cccd7a18538e288834e9ac9fd74d72fb3f974d7af6d04581efdb20893a78646552148ad147dca8602ed009befff11a451fcfd3c8daa0488a16bd4f5fd2e340a7e3f017cb3d97c07fe369b8edee993a7316b53f66954c66d2696a1bbfe67cee706aff43cc6fc8f8fab0b8676658ab58a5560c61c2579415a8551ad8abcf01430abe7e5f5718aad9e32f3f5bc451d9c5abfe9d00257e55f7f713afcec4c05ea9163c2547242915a379c0e733e29197aa7993a0f7c2e2417c27c863a10d27e0a64a1fd4df849afa45ca1ed23a67218292bec48a552a95258760a9453a86a92a1512bd07ea646e9489a516e8bd6f5a244a688f29bb64dd96c9b922a9aa629c276c7536666e69771ebdf5fe7e9fd34bde7793baa0f7dbbea2230feddb1cbd5209587f632f35bdfed080fe5ef9f861a1001502eeace9d74c7d520f4fd2e91cc5683feb6233c4ec63487ed4f13a174807465da1c112d3d76fa425a27305e3e27350a0942281b03e22fdd1d61a72e10935203b292fddb7420f11e839696814d65271bcc7e3e821cc69a04d64ad1a7328eb57edeb88bff7473bcd262ae4e9bdcd649f7f8f88e7f652dd42b4be1c20e9642fde22a3fa1fe4d7ce43c7dc7537da8579f2dd487569f26ddb9132c334a31fb595b7ed3ec4cb4caa72a7566046c772c6b40bbbb8fb10fe6ae5a905443a3f683f08e46596fbd8ff596f53c8d7a6fc5772b066a3db6fbd6ee6ebb63fd8eb47eddfafee5613d7b99fc5618f7c1931faa50f8bf3d80f8c1f80e942739c677e03737068c747777778eb57437e6741a33c67b988add819f858a0b851007147e6d23ceb23c201050e018305728fcf8f0798c94733e83f11e2e02d3b5e32b5cb48bf1185e7619e95407a716c76396077cf8369841e1d4326b47618c5810b3abc838e0632e20402e80422e142e0e28dcd91dd82d8f2bf3bd0f69143c8203abdca0107e901a8ea4f7744e59b3bef31e226a744ce8283cd11dd2348c5195231a1f8b4a4cfe187bb2874640f0b1ce208410426f8e8bb42872ace42e773c86f0c9ecd3809c8b3298fe3f3e48a3e2ff8feee28c16d3df0705ba8b411ae55c85ef1ffdfb31df827417bfb71fddc59fb9c124a2cba948e30f0a344a036aedc752875506ca31b84079870eaed90fdf898f3dffae286bbc2b8a6d2ca5bbf83f3cae68e5221f1f1e9eda75ff27e7b8a8bbf83346cc1d7dd2d128fff8ef135da0b1c3cca0ab1624d1ac51fb721b15f9e852c1efeeeeeee67674c7562ea07ea8656053d7c5456e477710be0769147c1b1a051f3e07ba8630287c25500c85f0a7511cdf77a063efd1b03bf0c9a0100d0ad5a03072419607f4c22a27bc97724ece72a4bbf759d84b16ef29b23bef99b0e5f5e02587e5f1be07cc87f99e56ce22e59ca7d37fed68e52cf40dd91d7e24ca6f64c48e43a378762525093ab54cf8d31cc63a0186cd00317377b33b773b63c19626cadc550bc2a0ef9f6233389875c7e6a0bbcfdb3bbce707c88af53fede3e9e3ac147dcae29cdf7b3174175ff0a351fe3f14e89e4db91756b650ff21deb3294fd5fdf2a72fb3bf3e979d498411c6945d3031d3e2a28a59138326b0400d26849817dd5514465089228829a0884363c1b4e8aea018034512142a3018b6d87bfd4acdb2bbadedb15fdfdbe8f298efc50761f78bddd0c777b6fbcd19ee3d7fdba4effd78f0d51385ef21d710c6ba75c36e289999abdddd4f77d2e5dd79efbd7eef3dac24ad082f991c6860727bac5faeee4eba33d448e73bfb16e4ddfdc8cb632b746fefbcf7e8bdc8aff3b98e284131f91ffc85106e7db56bd8510dcbb2a2f55684ef09cbe2673d6159113e21ac08df13f059f009015f84ef092bc2f784258410d6139615e113c28af03de1cead3f8bc18dc9685f77b5ab5a99adf39d7eadbbfdc5c5b62d29a1a5a7a5f71e843df8793e9f3873ee96616e9747a403a824cb566b4341eb1c433432320084a00113150030381c120b86e30145d3761f14800e89a24e604e9788d328c761145308216300210400000000446a261503e6149e8dbbfc970f5424549f34d9cb91c88ebe71d40831991669cb2ed2f877c43d5b3f8d6e0997f7a3d8e874da3367d5749751d0777b90a571c0853ca7fdc9c1ff802e558ed8df6e906faf6a2d3eb1d8f8bd05ddacc328e8f2c47279be8658f3eded26cf18e971f36c003d6e1f0ffa27a082166e08b466406252377e8cdb1f5b1a8168d444a0af9025ef00fb77fae6b86e5c370155d80214fd72d0ced47b2f78fc2583c5bbda9965acdab7fd938dfd5907ff2c00d22be0570c689f6bec37d420d55ee7da69ab145b79b1807854355784b77f5c86e91e0ec1484beb5c106afa05248fe1f713eb5933a7290d0097a8004892ae2e0e683d9340552d704140608853533e576fcd33529468d6dd64a02057fd1c049adb3bababc4ac08af603504df344973f4fccc59b172ded80b4a4d68f4143bf6773c0ca920ba51a0f6dfc30852da848aac8615a6c42f3f4d409b2244efa7eb6de653eeed04c9ffbc658520be78cc77be5ed7a30222b762d7e7390d8aae00232e58c55aabd32322b3f8ee4af91afbfdaa54a3b2cb9e75a0caa99692b1e93ef0bf0bfbba28ca8bc345d7e8c50e36161ceab29f3c8c48b609960e410bc58478579c5fee76fbdd8c8a9f96388e26e1abb76dfa05be74711f1c08f79ae61a0066f173b344f5eb77d418f34332707375a9226feb6ec7e9deef6d5d301a6eb6a9dba687f9d3881b0db7363baca1e481342a3ee1d65676ab42baf7f264f5049350f772fde1da4f0d4075296edec24e78c6f60c3c8072ef768bdc751f3ba6f0fb8609763104f3157036e9f437fce8dc4ea6dd6d3ed026b391b56ecf955d5ba4f132b6955298a51c8cd97c77bc969db6a991c0e9591896b21f6727f264bb861ca63f88e3a4bcdec921f8e5b693af4501e2b35876da342fe01397e68ae31c2cb5368766479354f2acf627720dad3a3a93a6f8888ee7b916088d70378f1e94489f5e8ee5f3f94993ca0a833bb92995d974a51aaab9efb9ccf20429230a5ba6c4a5f578ef6c4f0d97a466b4f2f3d413dc83948ae352823afccf565dd51e05470bf30e71447f4b5e7e153f04477600735b9f438200fd8c2429ec6bb1f8cf0f3f116817d24a4df5355727fa757b5dd901f5a39acd1337a27ca657f889baa2c5b40fb20c6e13ae6c95f7b3a54209c37220f488b47cda925cb60d27545adb1be2aab6d538c9a4ef427685c82ffd744d00d3ee68e93827ba3b64139a2d1403f484607a6893c0bcdc8852933cdc363b71990cadb020cfc5381bd171513d51e07645032def933e4d684cf31eae60745347776fda3d2ecdc408b61ac7684f22fbcd34fc1bb6e33387f0e72ab33240bd7eabdccec6174401440fa3ec105cef98352432f27fd0bbc93e31c897306911e3ef8d014d54e220b892894a0fc83a342e605e338af43088eec70481f8d67c76f38a2ce6fd9adcd79b644184db4ea226a88b96edaba35a91021c8052ddf591eca9e67f68784bd4e34223a13ddcc36e023c83ee8e25174f970b558036fe283259846ec7f259105ef4ae7c48ceafb682d35c1dedc4751cd53471aefa3ac7a8a42b27789c4832aaaf63c97389fab6d6233700756b783aa559562373814abc7a9efff4a63a40a958a841a3bff8830eb1a3f8471c762cd56e3606f93da05b5398d80a9f80215ae4ec6a8e915233c67935cb05fa331b1b69b6b256f8fdec417ea3751caa5653e9415a138822d7c39df5302832bbc17f80c1168919614bda08267f3b579baee52fe4bea250a45114e243659925c29d17f3a6de709f6d4665366d4e207a96e762e452c0e70efcd62d8057fa9ef2743fe4e820a71cbd5a44c2ea939c9ca9afb77a838ed14727a37557fb5d2bec267ade9c1942fcd1594052da228a03debfd3cf6645b6e0c14d5006e41129cd8e64d99ba9215feafcca719e7e8cbecfcafb064c5f076096b1437716cec0f3e3991a33016978012cd465b8db812ab8338600f33998429e41a1881cbcf33d220f7c0e36288d4200326ee805e7fc040362e1f2d737ade64059dc8d163a084a064c32a796909c961b95845c5d2495fc444050ed901f0c8e086e99d609cf3b526efb030f5f742622a3cdaec616b8dccf381d850d92322362702176402a1f839ae0b204ccd8028f3c7e82a184877765a045bf4c500d3f0d027b5aa43ef08f34e1e2fe1eebff4d86c95bac02b68420c9a82f4dd95d03166e16661ebf487956aef2364bbfc1f8e890aa0ce6b20304f9080aa25d28c426487c751d72118648ac8131f5175d424fd083ae8d7fefdd343ec6bf61c234268986c75cd151fd6c6fc0b8389da1837f411468cbe40d09d7d1eda9d237c3ff4edbc70d64d1014c4b90fd84c643f3f54f58a960c9eb2c100fd828f9c423a7cd44622c5100485f5d36657d1ea94f4d545bbf8d4f5a8b9e94554d2537e7e17bfa6dc9b29a58cd3c247ce70f679ad94ddbd13224494fcfae3f47e5d1e5669b4466557a46486ece110d3ca1dc807c98bf950e41c4f66f6416f8530bf4d5c8cfc5ceea5d3fff2f62ea9409dac3941d75bc8658568ae2c85c370e93fe8466ce3600e5fab24203a092000b56ca3043cc1029a422f6c94e2b4a2bf7c947b77958834d145bb9dd4747bf133773e12a5ccc5779fbfa78059e62ddfb7aca83dc4857d69be216b26c8290d9b54641dd5bc95fc1eeac826c71544e1aee5acded203e9bf225e73883ea55a607b61ae2b6a346c667052c3534f5869bc6ad1235aed84c8f2a1c6b4795b3108eeea9af8aabe28bd0964b23071d05d6cfbb82567620330edb714b0acc595ec10bfbf66d3a1e6be9d19c9a61acf31fbcffae11db6de5727dc42f9806e336e4a86401d4942db9464f0422d2aa81b2dc9708ee5488649716f4f536be30fb3fa959d1cc2fcc10bed9d3b2728c98e773f46d168c7990e47007ee80f3f520ad4a023dd3c11a51c85d7ab6636e8b0369f5babb90b8568a6b962c9fdb13830b63048a0e319198e1785bdfe5f1a910ab507ffaad2123c4709d15a3b89dae0a44f54aee191f8d49c822bc6698b163d93ba038edff0c2bd6eb24034f9da26f67296ebfc9b595c88439dd09f19c6a0ed21add4f97f3bed901bee1b44221f474627048ac8e1703c77785301e70f0781427a7bce369126ba9fb675398d8fb4d3e3401d6a0dd9a82f301ce6e606acfcb31153b82aab60b8ad1586399302fd5b3dcdd1520d8b8665e43e520b73a866e3f1a492f7f1d5fc1bf338678985ee77c9998c28efd08639ba27695eea56f582feacf8414bb1282b34d6a64a74baa976a0198cfe1a4791c0696768a26e65166e5e167a35f37803298d94073e4d197c9043734d411bf8933d37bbf188f298724edb8564d62a8978b28b2757c1589a95e69f301a165a621c909c81117acf04cbaac90527d6ef1379ad2f5417f707f7febfeb1d6684867af15d18e53e39a947e317b9ce49957abdd2b23c38762ee80dcdb0cde20999dc5350342c47b92c6fc989b2438000d0b3848721f82877e0c160a0f5a631d1452dd706818055087d76dd464025274bcf9659127b07e9b663badc97a62a33661fab790909015f94d3b12d27cfa1f87ee1f02f8ec1626618593dca0c34e6515c38b1674f6193fee038e5db97d1631ae8ed6b504452b29c2a436a7f028a277a0ace42729713037c183e3de3baa08c2212639d8df733773b55d2f4ee745d9f185ed4861460eae33a1a975b6d44faa7d30baa4b8a974f5f1cbbdcbcf619e64c8c8ec2b4125d0a7c252b004c5b266438bc6c679c54aef7dc11e1ecb29e7e0283674efcad06a99e6d834af36ee9ebefa5e582f0b4c0099501da02a2e39379d08c5263bc2b39306eb08b2b647352a494716671f9960a98a35fe85f61d78d963618e0a974d6757ac82a0169bcdaa3c359705a5dbd511553bf44d94a95c36f565dbbfe37392199e8d9010759fe2bdb44588d961f2fa24844fced231c0b38ce212c6dd88358d76aa5e7ef5c53e1475fda176d391895bb3c57959acff90753ab1064e6016f516e4fe6c53185aa3141e208975152d0591965227c0878e2c1049a74b8cd41297acac54398160a98d9de53ade3e5ee6ed5a43ecf449ed35e1c251cfb53d1b5670d2b545da6083f34baea4bf99eab86f8aa3b71d5f73dc4ef9af5cc4635501f28f976e267d5afb5306ba41e43012550dc22880c7f8672bf0abd807b6fab444d3b8baf8ac0a4235e3d50f39adedc486c395d143bbfe237030272ef1c9c7a8c755d9ae6b90a97a4e4e416cfb06861a9c6fe4f2a208126e622f24f246150b8b10ed5d587d4d9469154a0c7f6fc88b6378f06535f97143a59646b226edf8f97ece5ad2dfaae83ad0ebcabc0f3b20c3b1537f004046ee6eb8c9a325e4bc05c495dfb9c65a8613ebeed7dd76d9e5f9d07f151c0ad92abc7c7f638711cf86c90a265edddf79caf00f690334cf2740dd4dbba57d28b2189efee7d2c0b05dd50b72c9569ae0c9bacf80faa5c1e037a0fdd5ec35926e4253caac206f81e0484cfd0152e56c9ca3f6b13f05c5ca3b55b4fbe2c4af7baf03829e4c74f59ff9cca2a5fb5d8f094d4c7f113345feb958c33606f9aadc96e51704fb4ff9aec5a7087939a208c305f9d25087ee349cb6bfce8f438ef8f21102382b2a56cfe92e8e787e5923555b02b70225a17ea84623baab3b33dfd4b633e27ed2831d94ea3fca9e743b3c8549964f96e10c3b5db432885e161c9f0fad6355424282c0ca8705185067a0c0443f9705c400822033ae9f88f2d7bc575dfa56d5b80271c13b39be9820a7b012e86cc13ab032ec288d8bf507b63c3c699f2a540ec7c6c86494313703f928c348e719f4e4b36de02a04d261f932a2a14a79467965d4a97c3b2f31bd9ddbc520de223a0d76fd65b9a7471aa8b3e0b58ce33bbf71001a63996bd62ececc3831739b45b3145fbc3779d1967b13d5d6e72cf654b248c98f025578a4a8d4e5432cdfba06f513d03ee81ffa87dea1bbe85ca3b361581b87ec1eea20ae1d37bcc227454208b145913b84300ae06ae83b33b22a969e064cb188d679f62f5e99a80fe83a2391f0876729175e971b62d570ee1aeb426a7f3522624c21212964e61df5a2dc1652e438093b62f2e62323ab428baa5e649214d5ecf9f1d40ad34f503d6c312d4573bb4bfb088310e34ffe9b68920ea709f3ec5028751922480eef2a628d8faf31a2cbe34747aea1011d773131b6c3a276e534fb4167248e05a009fa9e55dbdf7e38554dd2f55374b1ce15f74b1016615534e0ac071debd51c4bdd4363af5d66a649eccd0c5dcb81bba463513da63383d0318f758c6e39ee2e0209dc02985ebe75627d2df779705cdaae7a9fdc116e5b1a3e7785bff8d057961e823be7107a8637bb6bbbf648f63be9d7717e0aca827ab41e895547fb78fa45004ed043b458ec3d651c2373771f54cadca6d8204c45f11ca7165c1eb498de67d823a928b99f3b13e5c80de0948e88f67d1f4aa2c1ce5e613f1ffc98007cb73e3f76a763fe76277a50f8313c0a72c035a88e459a51f92ee1e535a5020432d8baae0e868ecf8b47c7e1fd9e335a9457fd5c9f9a2e2629d591f09306d8310dd46f0c37f05df0825a8cc36d77a4dc837e3263bc92094b6bfabad0948edd576f275f592430cc8d438222ebea3aff6572e32ecc5d4e8f45746c62955e85fc44a37011d755ba6214567522ee28a383780a6e60f8d0e8c6b1ff3b855578ace1ceac3bfd7c9808140741fe0d7141f74a1bf76922116d72cc03f92e9558d125f8256c2669f65820f32d63ffdf716e0a7f3377046f39a476089408dce642bcf821257f5a5d0c04bf42283695b53c2442b055d4a862fdb8e90b6d00a39d4e3f088685fa318e18e616ba3362855600632fa7146eebf59683ee5d70a09ae1ccc116e7720046d79437d4132a2a0b706bac9cf6b440a7f3656ec059b9ccc27283c0b37047573356b726b6f3448bd81f65a9d7745d1573846c7c0fe0de9506d78b2094694a045b658ec90fdb90a6cdab3ff3db9e2672acbbf7600e7d8c7f90509107a8e2946da22af1ddc822c6aad746cb241bbe83be8420d9b6b0fceec17b099edce6b9e0a5a7aee4867e0e50cd424400b5d274380b2a987a40861d7f57b0df69c278af0e846e7d7196017888772b14f3e9ed3bd227d396f1248c7b3f8a896895896b7bba54862b616e2cf3772272eee9f40d315857035f03ce08ff77cc880c8e51391ae047cd9c2dd86e7bc81e54fca9be6ee8214673f88f51e2a82a4da1c1983655e9473549904ebb08682d032e906d5cac11620c3079559e2c799a3d2070673f79ee1274897829f4431fd0859db5913990f09808b2ce4dd63005e884767cb2f3430243baa3f143691b543f0348005cab4c037a0c732d1a0d18652d2eb2885577e219152b6e82c438fd891db25ed5567c17d82394339f98050746dd3d166e6956bb0ad68479ab90a123d9b585e546010ce073fdcba34f6eb7af8ec7d77fec19817c1d4ae64959df0a0ed1ee4cf2f3bc6fd1778a8a5ea0a7dfecd6db59c845bbe1acb02ef9a1f1dace54741d27f05f0555e54fb84601b24407093a1e50ad314b13015e4048d8b6745044c5134b4b0706b0ba3a09b256c7ccb1caa9a5ab8cd2832f1d06e30d735f5e73274b26556b2378a4a0b4336a6c962d35717a7599900975cc90cc1c377ea0aa7ad94607e5a945cbb8c7de4c51a4b6cac061ac65d4993e6ff2b75036cd41452bef2cb7bfa289989b004d67c98cd71d57932da498db90349a0012acd6c258a5f7c58fbd3f90396b3b3fbadd34a2bc1e2bb775a3ea0a2d035bdce3878468130251f4150a4065884081f3337d80a7562d6aed72ccc387fe792058e598160c55d7e9325b8876f8821d3f5867961efa46e77d29baa91bf986d497478d641d0796934adfbc628544812c2c8505414815c1315e9889e0b9194022160d1eeabf66720bc64e506d45419235eacd74f1d10829f5fb00bf34a605acfd25cd9ca84d0f4f77ec44e3495deec91949c62198de3ad3fa3897d3b15c8edb69764a0ec58645c43f1b8bc4aec96d8d0ba737d12e964f394886de4383df1948e5a6dfcf49bce5329044604739a17649436e4203b377768f786c92920f43215e4c2967c2243eaf32c3cf18f50f0e91ff758fb331a135a325938dfe6342d592a4e0f97bbfe72754ee87c0904dc7fe294d884252b9211ac546dd5382e38992d2df09720b446a0c9f6d7a4c400934683417248dd0d0770236c5acc29035ab6af8604030d288b4f51d7c2d893d42475811cfccb805d783813e0ca3e573600b23f75018036de227d1190a6ae1c41465c7d311560e41b5cd5baf8cb2215277a3ea6660bfa841db5cfc113a225eedc5b990b6a65bc7432c646861fcb1cfd05421506b60d929fc27c944ca61acfa5b0c166ff4184c41af2e5b05dc3ac6cf4ca08870c443edb8679f427187d6533a14a251c7c0b5eeca3db6e69ff100a21449cf39485f09aa477c2c635028ce10a196c5d1f1ae94645fb183f05e8e8fc881d02ca5414b41e12d444c969c651094815facbd508054f6ed442759136b6e2f8063563574241f8d71f66f056ebb0de5e4d820407043ac76a41302853dea8659eceae07543c36844f11812e97da62165ad3538b7a8e2256f545962e3a249610127c1b128da2ad166b3e491b5485d871a96cbcef1fa41c11a0eaa173e7c0da87ac8d9b8e3e2f3d38aaa479231cbd50e0047dc53673ffd730c61159dd4d99280bc91d99cb562565582d3e2cac5a731ad9d904aafa07dbcecde48c2c37c34ec8260a4f3610539c312eb36989e850c2c966b200749d6ec2284d5f654cb2f6c225f2c3558d8c23e10c0f533280a8b60fe8ee44a01605ccc2a472ad94fb881d4e37a39cb902bee62b87e96d73df5e25afab5954db531604805bfc5eeaa0dc8f35db74c08bb7c77dfd8034520d709719d1cd569794fc54fa352f863dd10367c7ef1f100d5431b5321c8f1925096d28b3a37b6fc382f41e646bcbaa7c4355cfef8241db18a95b39aad8e7e575fbb5971ca2a5ed0c0c3d9397e2795eccfd1489e62669d25a9c3e2a45bf4c4c496c85f2b2294a33902aba7c2f61a811693585c66c47c7f766c3810a2931dcc28d94a0d098072cd36135a02f6153919a3c9db7a807a23362151c64eefd7685b4f5c05380288e7b740548e4b859ba6f543b7fabd92a04a424502d03fa17175697629b9a8160ff4b111a571c8f095ea5d4b1bd06d33234ea31bdbe6153e278fc524f5fe82cdf865f612bf12be0146bcf12373c9a15aa49628ae93eb850e533b00953251db60ed8ef2c375cfb4390cd7f459c27662453ab9d10ba62a0074a971d6a74bf02e3e6040ee718093e8d48fc530abd08bb2e893999766766b5bb9722db97b83234eb2005d9d7ae4f06650d40e7384acc9b4285a1959841645a97a14fa2c4a0feaa01ef10fb0627cbe4bcbaf119f232a2161b30634411236484f99f21a8607e797d3fb41985e769be018f3a163c0b5f7129be85867409dd25f3ea7bcc4ffb21ae39e9525bd363e5b88ef9067e11833c77949dc7e6035595b71be61597b5b4123f18f03749fa1e7bf75e9226e38d114c26c83e9a52d0fb6b235021a09db77a0f293b8deaaf6437e5b70468893231dbd88357ac12484ce78bfc52c775cd0b4317947349927e775acec08aae07a8e38d4c486525d713a67a8b7ad47ad7de645d5038a49f3312736874274c5279e851346266a4e25d3a9014e99be56e2edc262a7536f3ccede58e9a8ab74279e6c4113a94e2075931b79a06e0f8c9bc40f3437ce9ecc7287063433a1fc139b99b68535c3834cd5f375e14daa7c544322e7866b19966079db0fcacd000b773971ae68bf98689ac43284ea8574ba6c3fe7d2011d4533332acdf26c2e0793a66a800e0132dd318ebe0046748916f802e30b1b776594c95ed5d09214d789054cf497c641504238707934cb30abbf80c4ea437395a67676e501cd362c4030429ff908e84aaf452d7bc85b2a2d06e00df317c60a79d807fe411c0c4c2f37fef398a52798327b50499195f48712cfa4176b6504ea4ea6ce0c78bbf0d0595f4d2c0e4428aa9832dd7b9199da76e259eb9a89ab2765576ea4f47ed215708fd5cad31863e7d59725a3771a2daed06dc9c2e315e5d1718990f68618facb08007e6d39e41fde56d1fa5b7fbfc81e392cd5d5f6baaacde80bea792a93e6ae12c00e9448dd1450b3258780021c7356177a23bcee966004469858f44c89b1d75712065004cc81149193a6236a006697c849dd938c43f37f740ef3375ce652c8725d4714992318e208c363a7083ba1996de30f6892921244ebef08836a3aaea5e6732f12cb7d2511fd76daa7f7d4169c60802802c28f54700d2f12c4435615cae44a2360a953ffb0a0431973e4609c2359d6e84e7eab43acd67bd3343cc58e244c4fca2ea1a4b4cfa6f87cb1103ab664a40298e7506f08527a94ddca095ecec4275008a97f933be18b4c6cbae635f175e21ef68afc145278062c8069178e03827afa79fd5c9c73391d064134f6b8b65cb8d7fa5eaaf8d586fdbe689978e17b06796ed6e1886b21a279c00988b794182e993813f0a449ca04801e232aabd4e5fb324ea9015b8eeb2c2dfea7ad4c4a68482a0e30e85c6a4411b32ab06d9c4f4ebf66056b54bcab494572a128fb9dc682e109a2a711e1c8b747a32af8551b5e24beac7609029ad617d34aa7c0d55b6ab81a0dc6b749257f256952ad50ea14d87b1f2d9a95db856d8abd342d6be6b023f7d8c14d3208edefb3c891dbd32fb547072954e973f18910cdfc2fc6b1393eff7da7c0f59ea5a6d221edf0b66a1140c50e652db48c8c8a08272569f9b9afa5bba6a062c01adc0f91e01605faf782e53268c4124b10a2218e3ed75453d0a5aa8b7ff87fc052ed03a038a69d8502385d89dbb1b580860e0e6f8ee2d0ac7d71c2c17051328debe30b0f8ad78fe3326c8ae37ecbf809b8a05e8b80c0dcd5185c5c26752a9dd3c2385c9d110688c2f183a551490bb11d62855f7607235dcf3371bf69fc0014559f4d40a09b7fb4becd9bad24e8e503b2067c178a09048253f4b372a92a369fe94a53c1cbd620e1c999d8e52629b00bb503e446b5601bf8cf12eb717e727cc7b8a5abf2440d361492c24f35a71c8204e14c01dd970762d9873c1855eabf302703787132a13d7462bd4f50ce8d631d8ccf47ac26a20e8114231e94a67f8df196c5b6b8dcbb918e37f88c77a6ff987876958f21cd514bc41c286213449d91aea61e07732610cf773424bf613e87d32d3e1b7bdab899bd7db6e5def96edde97f9f04ab1b50c86644a7452669170f917bc56834e6f84eb2dfcadbfa5bdfa9996eb709e60851527d7ea1a7359f1239b70bc3081af601c5eb1cc9c93a16b6274cec4b31f3e400186dae18c32e14ed5b92427cbadf5b0f4822be6d4349a45a10c545b693c56e640a8879493565af48a1b39e43aa4beca607da0ded1967ea154f0404d6408e043b2c46fc3149c1b3ec8e54eacce2cc3ecccd5d9151716ab7e63d0ed0551b4ebba4a123fed4adf6c81e065fef06c67b2e2f01947ee66c6755dbe239a00fe073d3ad62b70f447baabbe1952a5543ffdc621df182a216c8430c18eef930c23b5d091146e8e3b2537a23c64fccfc7169b1ce5914df2f56116465087d194d6fcaae587897c7bf4b6f4d3ec888120d7c8421b88d6efea1061324be6422a4da51cd7b56328be5c6f8e13feeb449440f95ae58f0968c8f4b3e219960c9011ad43b86c96451a46c74988abdc8b85866ea7d8ac9906f251653381c02ab65100ee3a6f07cc301604d3f272221c76c4a7eb2851ffdc780f6ea275e96912271efd8ec71caf1eecd9494cfdb83b7525ee3488e857750b08b1ca93f135522f474a18ee9ed936f9879cf4e72e1982bde91aee56829bee40168021ffddabc4c3ee61372f852a8951906c807ce68c837fd8d49741b161320ae3d0d532e68b2b279a932b3ff1271ef74be40ab16392db523a7c116f4d83c4f760cb198445800d46b0c7d001226a5985470c34bd0336f82316cd08c89c04058e372f56555dfc94a8e24074b02804b0d2dff681cc8d0bedfabfdd4320cebfdccbf2f6cad753057a0de83c97c008f8ecb774faf9f94b156b827a31937499fd9eae4a933dd1d3f3c61b19162952204607021baf0d0cac3f9577c5b24aa57712893a802c0c737acece6c557f2a784ca2d27fed1444ca2771e846338a55497c346b09a583bbeb855141e08db6b420b864cc5b628d9976f366d1001c426059fa8ebe158422828267d50f97fab560849b8f02bff4c81869787a4aeec5ca3ba9531c4d2e9489174e3d30729fd0f1cba81f5ba624df2e59a5e2b8c8d1cbe3812040cca154645b6323b56ecd5da902bd1f7ac03a570ba98b649f50d04eca97042d385a8ddb5d0b58857d92c4774f503947ab5496489048ad7055fb1522c684660dd0595a0fd55940e0834f763a6057d83924ed8e82e38df68699da1d0c9c0e28249c7cdc6ff4be68acf8e0e4f5ce884aca124669211d0075216ab4735b68d9004037b2abdfab06d0afdd616e5418c8298444ea0981eed625d76f864339d52e86f7d7f08c2967439dc1a3b36877ab5aa79a0e2b51ded782353e89dcc0a9777212fda5318b25317c33d3245d8d882813f6d8204b61c102082c188f4c922f142bd368bd070801388d50e896a8eba3106bc059ce32bc6e623e75d42e718b3e1f1ab6dc77382589c6ceb99275a3810a06d5bddbfc1f0e3c549f81fb2955b1266a00016e55da0b5dd12973d3b3b24a03b3a7504d014898f36aee22a38183a11b5fa932bba18183888735f5d71c8025010a0175910484c343b0184832edb319db65853d940ecd7e01a529d208be0bcd67807c7d15be8d666f18a5e2e57089d0d050ff7b27a756af413673e5d12e7d9b42e994947bbd04b839be513566f40954f9d02edac8157ac82b7f4a38c8f83bf5c213b582cdb2da4d965123b2a808fa9b737f8c51da56743d0b95b64caa589c0716b2c3dab28163f01ca7bfb37201bb69f75a4287019b3a91708f23912e519d17027e506b0561edd657084c030014ce3327085e0b39da0c2bc0a4961962aa134f85e1a09e054ab119e15a3626d7504e212a7b62ab9a86845e12384ac11f1dabc1262e702068fa76c14d08467ed3d00eb1be3e867219e14c507249e49719e0ba39fbb65ee68ef0195b741442a8f8b7519734cebe9b12f66769158728ccfec85c05fcc0572522c54d22330db63d8938ccd3c382f641a4bdd278de508d1172b918a36f761c61c9f516eecb7561073a23351fc618a72bb8143900a353927db00ae2f9bbb834e77cd23bb22c07c0e69cba33a8f45d5ed8099bd7ff8e4d16c737ce172a06a319ddb838286441600ace410be7dca2142dddd246ce678c8c9561006c97cd939b135a88b01b0581a8c525e0d6389423399250c708c248ad709d490c308708987d2c5f4be7fc93e9582530b7282ce9528213500be35af7497298a573596b293d80456447b810b304d7f048ae82514fb43231378cdb6113cce73be57b06d2b60a8d931c4ac0071c56ba89e505504fa41242e00df4ecc32fdf24d90616ad806111f7425e48215a9fb55c7d10920dcbbe3e831f6ee7ff8f157b0184e92be9e44ef991dbcf13aa591e6009a926012696fe42793641a17e44a902476f081825f7c2201632e9598f6cfcb15afb69c9c146a1d2dbe304985201323c7d956a0623cd6c0c1cceaf97a8a29256290bb0a6f7cf7aebbd3643b801ca3012da6a86d0cc709b6239470ca9986f8d8ad02a490113269117b71e519d06bb4f86395252634300ee89fcb017c70d5ae335a2bb5b73b08fb0320f33046bd07a0da355d7b811d9b7f888122d435099cee3fb416ecd78f03aae9f94232d7ee1c216f8469713137a560a8cb478b6ede66135e71387477f7081251ffe566d43c7fdd10086e9f613e1d6dab42f8ef6c45b4ca1fa4671346906f316121165fd48cdd9dc187a2b50c36871ae804b553cbee6ce91d7256acab2ab8a0fefd28b43c3377d7e2ffbbdb9c526281a4d5230b8ea1547cc004857653d08d2a12a56fa9f971c86aa60679ffa1152ad7f048683c609a0265d9cdeb2ac840c16becdfbf05a3e183eb41d5c7c24143c891c22e46b1c3d1a9223a4e6c6b04669505f4af9dc6c282284087257ec7071d40175cd389c75e5876bb34d777297a5a8a03155a5d1fe6b81a1048a0462fc8c9ec5868008c1ce092d228e06b6c0f88f8f6be12a0e70910f67ff12bff028a5b17d02580c566c7cbceb5ecda21eb1ac6900a72b65854c1503493366bc1046a61c0e7e4550fa639e3d36520ca28d3f22c60d284147889f83cb83bea001e69902be1e027265645c51e3f25a99e71abdce4d9bf3bb52df028a20115d01d7dace60f4cc6dd1030963937cf7b1d88ed2f0afda9da605785634d738b5deaf551bd0f20b046c17961bac0fefb41632972c80a8b2b2f2901fd47bd0c367320189ea6b307578ccdfb6e5ac947b29c455381e9ce3b19db4fd1ee5754bdebeb70b6d68ab8f67ec14db89f7acbe2ba38e1be0cddd4df7ca0d40219c992aab4b0419fbf57f4d1bf3079bf1681bae4fec5d965078e445a6c42ab20b5d3a94dc92f7e7944d80a1390497f4a3ce679b39041f2e0aaf4661678ab722bf9ab2c6c12fbb04cdc26e3307a19d7b435f9f3e5f3c8838006789ac092fa9c845b35278693b959f28aaba51a387c49dd91a93c34a105f1108b7f7966e07f73d8eaeb0f2480ba0011a6057f858776f544222d5628292099d391d766b7a1a65caac2db2f8e47d5434f22983fdf4b7413a0ee31acd291f89df1a27866b174796ee5f4fd6a4f6c35420d302390053e921551af0072f7d5da704689f84ceca0c4e627bf682de89bb873d8595c9211784e7970d0996658f7d42222a03a19857cd71a6f2e3e3ed894ac5c276b5a27436fcf669edf11ec93dc5a2e4ba584114758d6039f6540d1bf1a9d79c8b28475da488d8bf8fc142538added1949eff553b98fbb8cbcc828aa7dde1113b502a819cae3cf9b911e093fc5b9faf2e1d3d0c166c49443f901347925a68a7fa26a56c5c23084fb023cd257f2deb8c4d6c7b0e4b233a79da70b14941ed108a643f5e74112152c260eb18a384446207b0a0b36338c68ad9f4e86c088d5afb4951c76a24834b23e7a52d05066b1be4bc9a784ddec39447f37bda87c66d183552fd2309f9dfe3a41ecb0bb733c4a0e1aa400cda2d59c192af91b9a3722cc610ea5b13c3ed7990a225e010fd3748c389123768ea3f2e1745ca3af9d6fdafd996b86747139778bb45cf02b6f30ef9035f5ec2053032583ffff784fe761eb00255725c64ec2a72ecd2403ae4ffab60bd7ae2e1bd0a8a73f5eb7114b35fcf5d69f9bf7b918bd748782944f8d3f7354306d3a92cb8ce132161b09e8c07e4f31087ba39b05ae5f0987001d0149bb438bd6283c19c0ff0e5a1ae05100f165ce9c50b586d354254e6ef38fa26d2d6782fdb792892d1eda7e60900aabc634ef2bdcc3e6734b3327bdbe7a26b198cee4240617d578a6e0505832d13430a7faf6f15a7284ed00107a51c16c144b77fe288c8b20ebd110f048319b7df3e5eff1415dfde11c4d767af6f72f90a5458e0a9e9b1fc8757e58fb73531592ca04eb4db47e94aebcabb8ac392efe77dda9d13d407b37db1bf2c29370955c11ed444cf12f81e3ab5de6f1d7415bec9b43370597e9c75fadedba044a8b33d62715a6cd175e73a5d889b68ad6899ccb37ed733edf1e43e9610af2acd0248f67bc72dc560a54835c3e88f40602fb5ea490b04935299f64406ad0437dae2ae610b4025b01d5d91d5b9e28b8824380318ac39df589260bf5434e642c85f76f7998133eea6cabbc44b08257f9901b19bbabb3cb6eda831410b59c5aa5e1975dae9c334c8033b2c18b3a94978d0d83eb0118b123124e13680b6f72b7bd1af3651bf47de5ab4c70b292f1b5084a138967910f8d2aca0911e9b28a2bc589d53eef6b4674dc7ee7f06df28668b29c52147cff61ae094ed804ed667c1ff0c9a2b44d7fc8e747e5bc8b12fdad165d91aa85e85662460bceffa02944859aef0cac0a2a157a1ba518ba81be77e0eb953c80980186335962ddeb5b65a08491ef82d1af4d27726d1851d09f64c211f765ccd8c75da14492896ad708d85878bc29cdd112525f919d7b9d2202277069c47c276625b2ea7670abfe885b12a76dc61d063aeb0900731efdca90090510b62e973782f949fe5c06ee20e0e0cabe310d5a3f3027215fe9507cc746b86cb0ff71688b7e101124339ffb6b823729ba1b5657d7c79c9d000d7675b8a1d1fe9e4cb073d24562b0187c4e1fab51bb714f408480b9439c6a7fedecceeaf8549031957e6ef2da794e7d0007a7a64c49419adbb27ed3b9834c567a20afb308b383f9687f38aa92303c1c01a9a16238019b7a6992da13e1becff98d7cf29011c6c926d7a226e583cfd4bbd4ef733e79b617833b3a5dace41a1c2759fb1f5da516fcee9d76ebaca6a62ff84b52779423f045a9b1764b5af49b36e9c09847222084bd96500ec185550b9fa5795f56df9abd45355184010b19116aaa82a31322cea63f4d77a093de023dfe60fc4f491e944a29b251c8b1b39e4eda599a26a2bf85ee9426d6c1857d9faadbfa7718cb6395af33d9a796a3f3ec25d35934f1b2166676897659187e1f3103dba345b7ea647e7c2708288a1160d320ee2c35e313ebf101475575d4aadd19e05267878ad5908a8e5b47f23ef5743bab2538373a61cb0cdde3c0165ee3e839a490e6de3270eb6122bac0472cad0cae49a6568244c3cf26a5629909d401945bed905627ea201d4df6f854507a9e6956281ea4dec6a0c92d1796c8457b5b939ab46cd99e661df33018c6f233e4f7e0b48ddbe56f3363b0459ad7ab050cc68ec762e7bcc6727508b2181d093b65a24f649ce8d1272a6983acc044045ec8425050d315f1f47c835eea3e7f2e40b452da4a1b52ddb21c4ef70d724c33899f562102b6257bed5ffa81f3c4d297467115c0ec805d11a2ca87656320ecf111b99dc0c37b084132982ce1f9f395d802cab2b201efcba5bb6a3bc76e5918da1fff360bfba2511bb667f36928245b30729bcd1aec9d3a35609cb35736d8af2bf4179f548119f107f4562cab82c7cd16fdce85693808952f805712b094758b9c577503d648c26c46f8eabc46e13fd3c6ef27bc84776771329043ababa56afeda512807610f7152aaaebb3dd032b870416b16e1e55a45c4f91814f64a242e2007472b0b606f6306bcde633343694834b3de3ef78043990fd8be6a101c4eb391bf79e186a99137f4d3a43076870fce2fe9772d55646e04a734382ba3bcddb357421ad127a2b8a2dc6746c394442492bc45956bb1b91bddc238d14ef6fd7bdd9bf8804628832295001bd888b231967f1b4d1df70a95549247ac7efe7c62239707e701f29b2169a6366a2e576a417279eb68c55b97ce502336cd7c9de80b68ad0ba52ba1555f31c798a378b74853ee0965a922900cdffa86dc8260972a3f0b7e76ef76e536374f6d49f9b8b9ec02d4373f3197e3ee3a780cde84525ea270460b7aabbd78c0d2e771e1b517ae52f2444908345410a6fda993a98bef0d1224faf07204c0ddaa2a58dbea0bdc7f39342d9e74793a12dca790cf528aa3fd757985a4090a101c1e98bef1a79bb573827036947e3662cb98c7725a0ce2b13768ac1370746f7ed9cdc5ab517f6cd8e70050c3a0af37a43941e0f1a0096b35dc8f6ddf7fd229e20a19609c2195a8ce75c42172b141be033be6719d876c03201b555e1a3974a095319bc22bdd7e9e4569a12e9da216c61c5d0a62c23dd1cbf63928cc919a5cb7e1176c2be91a2d24544daa863f633d07d340bc0b9524d000069c933adb489b07e650bdc7d14f265919d512c3ea0b1d25321165f275278f51d4dba9d43096ca2350afe61f6f34689ccb7898ef472792e22177ff8daed65ace0d237e2a588342e29d3521f0af08d5c9aa4a91aa4beb8b30aebfe4eebf98295969d5c2f25cf6c4123acd5479e875fa9341713009718713934a47c3b5f27a432f706917ca527adfaa728edceeaddf9710fa408ade4c9ea9ad0ac5024c79a9c5a2161b8fc9c563006b191d75cb5fc827988cf23d1b5ea1f0162195bb6510aa3b4d18397e086c1a1b4d88ea99178ec74e6979e88a208fecdcb5f0e5afc41f44658881600981bd82a8ae3e5b0ffaea6a0ac54105e55ae7365a816acef240f4139da8bed6b6a0f247bc41754adc46397d4c9cf45e0b04ebf3bed2b9dbb4e8507a9c64e6e21b2acc29da8c6d49ae80ad68842fb999a4685bcac28d93872e7e6b5c430a92648d44b50ab7d93528b4a01a0c62c7618d7a5860294c4d0d2fc9a46c726e7d13f5aa18520f5238df143005ea31ff83b38593def263a859c9409394b8d9f5c022d91c4adb00cdfdaeeb1970909cc134e2b4730ecbc5f39385003fce64aac60b7a0f0d36ae0a61e040441005af99c8deb4709e85e61a2bf539c2cbf66451ef80664ac1fbe0580fc2b3333a6371875d40331e8072b0dae41b03cef144057f40165d2530301064b70b5006fdd596d355f5b398b94f08e09dd64f4263a33ae6f0539b64d58ce93464d23bddf710093fbcb667973888c5011d5e5fa0c7b7ae78bf076ab2726f7422b2b2e1ba7ebef454126b5b8056872b4140de2cc3f70767ce0ca92b8686f66233f2517d2106c651d003b21ea095056f244840135554257215ecae035892ec5d69c48ff565e00dc32fa1e27884e458d643887aed7df07739774a27a2730a164522d95ba69a817288625f57d9908e8d72beb68f2e6a3639789f9b918bfdf258b5a8c7a8b2280a77f48c7aa88f2ee3051a9f705e79baf85062044b428b7613362afa130d187289f3ca03e0eb357e497ad92cd6302b7409c47668858545d595d1e79b55f3d5b2ceeba1e5caca8e07308c1f95a3d966e1798e83f5f881fbabfededf8a661cd48308714ff71f2350fe717eebdb7a47f2eaf253ba62e0aa92558cb37e2a7acb439eead73692a09e5ef8ff6d04ea4de14479fc25fced0c895c110df778c6627dd2a37fd919542abc168a714524c490acc170a72d237c9da03ca11fe775a867b52c6ad3d19a6c4a9cef63ed89628f5e99b118059ae1b6bfb494dabf8d6a285947d073095dda2eed0f8669967a0374fbd8822f4342eb0501f40bf56f852f42f7c6091a2e8f7b51532cee40a2717495c10015833d3eb93428e0c6a85c9283162e0f83860404a9f667f4ff0414ad949e9b809c998d7e567faee70f5fee9e0e56dee5e66e3abeaebefb496d8510662ff3f60a94e5ae09062d15d6c58419933f32cff5e3e6729d6fc9bd18daa54e856260cddebf186314b214795543ee58fb28695613a1786603aa8e6033742a73557c2be98390aa8404e68bafa543448b3be0cfc09aa94854bb0383f96c19704dab1b460e175d98a33110b00a871b37ad88f8ed59f7b45fc0f8bce57e572e2c26e882e6578ba4398fa075c7d7ca536e15af2bf9b92d40c95a6ff80546d6aafc91ad1b191abc8ce198c93714982ece2624f70d4f1bc41baadb1774baa263e328fb430fa7dc219489e95b10f9eca1702c5c430fc4e4453cd91b24bc1209d36de1dbe366836101a77e3f34ce0163a0d9d2238f2c7b2af45431195ced99313bd43d19ff79bd9799c9243fa60f09c1a084049d04f60e8265930c078ba575fad74047f78603725a05c053d39c908727fea98700565c0365b78fa4d3b4660cd0c3c06c20a19b199390b0e7e2886841e00025b0575d297245d659926233b6d5ef2628f132565b995c0b11a92159d8ca163a98608191927501e8a50aa7d4c19f835046ee218eb744371df7bc36464c5b28a7dd16f5c42c68d0f2917bdc1519444d1e9186eb7719aaf2f8a421bb960393812922530bd344c721a0c82aefe793f3f38448e23451b5b18aa969ad2085661004669ef02b0fc50d34af389d6dff5d0739cfe45457dcd8cc2e2d2ba51c14b488d855d29b681a20b6e687e8ac3730428cbaa83693577d278d9e4c91e8d9dd2ef39b0ce339b1ee8e7f2df70f95f6a5416fd2da0ef54c5624953c912face1ebca8a949dd73be41b0e9aee84ef1510b6f278c212a03afbf97176d66ac7b84dc713b27d6ffe38502f212d391667da1403acf6b43d531877e496e901abb46678eaa76de55b0cd6414500dfe241e9bf4d2659cb4a296dbcc9e031992a6036405e1e1396940c9ca58daf0563198f0aab2bff64611bae20fe29d5690ea5df3942fad395da8ac23d05202f84eca6ed85426ee6285f589fe35d6c8a80ee553ee16db9e71e7faa13bee844564122b497e58f5269ebcea003320995fdeb4a860f5b4b2727be5d0be2b7aadcd1d5c44909374136a49c9dd18f7fbc3efffde31aa7051cf135734acfa110dbebc66e073fa83143bc5e3e56d009fa79f25b1239e1e6f23e03cfd298f1de2b16fc869dd2bcac43f224d8147538e218ed064acdf442b8fc09676f16fd1fe23d2ca7b3139bcc6698d61c478d61cbe44fe5792baadcd78d007e486acf7701461b96c7be31fb73c862925772be84a4c32acd6c5193f39d16a88500bd42b2b71abc9270da511da329240c9033efbef9d207b2b3b4f90cd301452b03740d02060450c16cb8535020dfd6b0155d90719ef377d950a9dc2857480b106c4a59c595f467ec02dd6265c257ffb879e0e6ecf401f1b9098ce044bb59a15adb4cfacc2cb3589f55057543aff5ebd0a2e5d83b1bd9fe0a872b398d8e8b60744ee4ee6be712570ecced8d33973e0fe1bdb6fb69fbccdb14bc6d168cf3b533cbdd614480f06e897468d970a6d9850b848a46e626cd9f39b9e6a6deccf8479bf6cf909039445ea50844360b14855f465154e3cdf1d5599e3c399134bd421c273aee0b8d12448988e58285f1d4f2f820c22fcce3efd2cd390236ece0b2acdc3d76d6687462cfe9d8a0fb0f735577cb4d08fae9cd3804a5038b3926384cc28493810b9eb4651ba901146c97222de8201af0d102a0837a50728d2c9d97a873418a13f8668c36a871c43e5206639fb011b434a3412540b40892f4805d52138ae5fce51c36d3bbc25b78478e865db925d4d4853693750f5fe043540c2eb8b4e36a072e9c5f1a18738e7f9a0b6cf57f622c4438a101c33a2909b1b4f4792a0ff20f98d08bbc690cf61d2f310bdf7ac63c038f5d4d115264cbe81140464585f4a7e253ef2eccb19cd20d740f949aa42cfed6014942afe2b40125dfba169543ca9c60a39a6179ae28b2b6491e4a7735f8ba4c02590bde7940932f5b620c388b1bd706531fdcc1c38bddb209fc00d70a8a1701f1422bc21eaa66a20b593a5da46ba9da73d019b4adc0a41792d551acaca9be34b4a984540f015937283bce7a86933b918d5fa2e38a25f36445a180452bd89a11e86aee9384add03839e2255f47b92feb0567242ebf9f4e25243d1fa1685f0543ff0c0bc8215e63d62f45e4583a095daa0a207f386bc446c4e6488706023149cc5cdd72752c04a453568c2a90a6ea5ec2cedcf18600640d8ecba8e4d5cd37ab9df43da15e124889105edd7aa9fac14677c39382584a234d7c980c405468037ecf4b6860291320eb752b7dac91f0d21e8d0f9c06a3516e64867a8e3877cf91ebef21d583a1db9fc7f1e5f3f2a3403148f5cbc2725ad249b400812d471e175faa51a8b10581f6ad89bc0a2ffa80be724f6568637f54939d771bac434baf4b8b9dff110f76ce33b111a2682d65cfa4a86283f04476f9c63a8c0e0793982353a4a33bb8da8d69961df233b4338f84fcde0e0fc54271c93965b18fbf6019cf52d588516c4d71de9021a12cee1b57ef396e17d66f608d8d9994e461e2cb52b4bf4ace32d3be711b24d5a10cdd61b6e3b5371f5cd57f3c3e24523621b1a8ba4481aae5f1455ea52b9f13dad2d00ea84813446c2c34f08a87c6d85f708f792ec44a755e130baadcd767adc5e201214fd67f8b1c511b76487ff191e9aea0e4e651e823c01ff6ee23a0484d060c030432847c564e56726577c796a96091e7ee72f8bce034eaed73088e52d52a89239f85c2b1653961df53b043ea1309dcf39f6981275e28c3a8e44a4239b2e858a113a107701d62b015a0e35bd46cceacd6d4e531f0d59417656420401bfdc0ef389cd693f65164ebbebe44f89e2631cef38104a50282e45e3827eaf45848f45e095e3882afe2577078625acaab320e8b3a24a21143661f5c41f38293a5641f871d2f35d529fa6b5a898dba20bc8e1fdca11fb5c64516493bfa57a0a129f440ea5f2ae06224d5e90dd1d2772e1e8774bd37f0b9de9c631b05ed05de79a7c5f99c955e10323e498b4271c6a58cdaec3b1da5498f541c74a5e47bb3ff5159447dd5436702e1cb1992c1555929f9ee49ae24695d1e5377dba3a48ec249fe2aef48e9253a7e51a11d47a477a43e322c5382fe031e2b7af886120a45b0cb2266a6146e9c2ba64c4f0b7e66faeb36f7628ac3b03d26d06a2a0b64d3fd7aa0af754195a07d601a9d738546c5765a5982c3316dea9f0f800562d25588220e0a89781b064cf6f1fe9f88edddeee50093487c97ee201a2c2d26f497bf791fc3485d8cfc6d411085280002393b7c244e60747da0e25c063d3222e96f8d4b994a8c8a232fb9abad837944fca29c9778029f06cda34540ec823020b93492aa806daf453617bcd81149698e5125d7769ae0388030cf0e17a57cf29c5b38faf5f51ca12343a889a6aaab756444cb438c1d7a003400872fc8806fc0d9ad3a9fdd813d073d3e620b2c1e91d180c50c382be8e459f483859124e1572ccb804b0057b208bd7f443b491846d08045205b2ba6b6d0966e72890fbb53b336c716abfd4fa921d2d8a22df958b2230ecb85cb2ffe8cd5720589b3cdc3ef9d6025ac275e7d80d1dbf62f5141d9d868c1c7c2ca23c1f88a5959b729f86f48f72746c7cd84b18b5c31f07cf118079e8f20216ab42bab8247404fc92e46d7d4ff02d6c65ecabf87d9bdc9e8483bebc21387b23ec47dc13d067241f803a20f1c0f48909f23234f154f211f4ec977a08b7ab09ca2c1414264c749061c56600e3ac4fb46ff614bef698640a03cd4ecb6445df8deea902a8f729bc298acf6e5b8a5fe4126753e0b10f5a8f1af8c06012f65b1c0935bc3133e92bade360737e97112b897007cae9e828071cccdfac20583bc6a7cbcb4991dfa771b52289aeadcbfa219ccc682b3022dc2cf4a46799b1205e02321f431bdfb0c2de72c03c7d47f14a40c5bba5bd30e3b934cfdb0dc2cc577013b1b01781c7b75e947d47e837623b72d565c6badc5f130e13b252514be5b30cd1db89c839da1386246940d48ae5fcca5bd6e12830a2953dd34ba6727a5e3b4c30c45a95af537260d1b18f9d4398090a5acadb5990d9ae1893e5d670d9eb1ac28953557a498f8b6f6b999f14cf494f64122c55e6c3bf5a48838b89efd3af2f1a06783d3703f6490a3a15a3ffa22c8c6ccc26d4d83bf9a99d272a8ba123627a46d1ec9153264a1a90747693ce36285ee5e6856fee328ff67c4183af00da04522d60b72e38f44f892132404b5c68da1064c1c5e747fa1cb1a1bd6fe8064d1aa3a696c17cb073bf9c69a095e3768551a1359951959fb788443a81fbf5acd215ab535ca853ae34d51ee5be733cc6b1b6595c967fe95767eeae634a18f928716dfd7982dbc85fed6f6b7509077d07b727806b2c0c0b5425381fa67c211f6d210f9c08e9d060b2532acbf8f4295be64be59595c0b7ab3fa117b80d46d3207764ccb9203d5d0899868a168112899bbe761ccf5c5e7017ceea0823fddbed4c992aff7a77ce3cbccb9fe3376e2bcddf1d91cae8c3b15e04b74886047a524bf3fc16fbabe9a264f4049e4cb842c32b1fb92293ef60395962e620e0d788043927c08b9be616e816b42cf51baa33754f1f744af38bf7311c1673afc632221efb15fa39fa5a83a40f221f385b8ac3044ff75586a9f715de42554b67ae7c3b8cfc88c4a6be459cc04896f11482f00935ad56094e5faa28f355a3608e2948a136d9e42dbb212188ed07a212e3ad8ddfad0f72b23113a6043ef9f973c6a17444261a094742e49b14bfe79a69db695684f62b06fa2bf41fc19202f416c3e36d6fac0e00a6d44cc0a0626529236f049abf9c4c806e52ecf199043d4d8cd0dbec676339ed9ef0179acf0a84de3cc6692d35f20832efc5cec3da6ac93a92b48ccf38764b7c5c22474de80e14a9a38458c865de1f50924986e2c328a5fd63445a9e14aa7083888dde2d2f596d61295d23e65df00da2c731cd66b509b974773302c3d6393e0163f770614213538eb9ff721dafc503137afae29c1f3a7206c8835840f5df68886273d2c1fb18e875bae650bbcde3797f988151a3f7991808f22f0f6940231d4c80fb049cfd3e0c64108e5521c134c8fa6d53144b287ea38352f943a4c014d628fd4a00e921364383a968003e76981c287e54e9dc0030afd700928ef112b84bbbe73673108d4560cea4027ef486b3d67cbb1703a507ec26c51e50db01146b819e3386818f317d4e3f84f065238bb7e92e4000b33c333e84b0e3629c8a94274d44bf74df480860ff8058f6e0044acb641ed83d7e382de9ba56802790126285403c4a428b9245138227b634eb43428a78157de8466c9ac8e8fcada95fade16dbad39c6585e1a4b8080b44631988f3b101af992e9b4678a7f709630b2599552ce9ab9897f6e2e331ebc82bb97f09f48a5f76c25c78c1cbedc2780bb410bcdba20bf6ccdd0426162113193e0799b41b96b564eca64b279405aa04af6d6722321bdac7b4a6f523cd773cc999b855c06ce083bba2e625390669188bc42c36f42179bd2025b98eaf6c7749af6f2cc777ec9bb8e5bcd7bc44a4d140042f19905a6c6fa204d28ec17c73b512cae365ff13ee525f11b680c56d2ee93dd908941ce88fb0b2060a2a871a592cd78a49ddbf5c282021e3ee2b82a70a23fc10052e14ddf1ca1c80f053599696cf81839e5e881e41c860dc19068ec173118fd10da68d894ec0cba9f8099f529410e2971740fef5fd5e341cffeb6e91b25c5c9776bdf8fcbfdc4f0e29f4016b548b42a2862dd6578cb7da936168d3d83a0bfbfad27e099842b1426deb86687c614b88b0177d522146a1a71705da3a8165592764ca49c73a4a673f7dd981ee8ff4ec4729dd4df3c4b3bd55b32ac7c71a92806c1b2a7985829c7961dafb8c006679466819d42c0c00752c15be2f7561dfaf5f9dc95779380a2b660ba23ddd18705fdc11a74ef6d07b77ed85db1d338fe6a4ea11d50c1c0f38be46667b9decd2b089aeb21755f6d83da4605ec34ea5590412d783850098b1078c01015dce4eba5e9192567be7a1c3e690a50e8d71cd006aa144ff30fd730127fdfd4b7b1650ad4ba610aa508722475e00c0bb90d9079684fcf01cc279f79b3cbbb7cab396fd73e0f3b45908853712c309817734306ccef21f36ff566f07d28393439dfff2227e0392b5659b865476beafad0521aece737bc1ec7c101e04aef3c6795ff56949d08b737ae65be47c9776a1ded3ea7a4abdfd874bd69405f032be20052a0a70da627bb5c2924eb1e9544781026986670d9e6b2fc700876bf2bb394f40cff87872fb1de0be7d480c08ba1716559f051cc1d3f3e5d42b7728d6f6799308b6e926bf82646929bcaa4d65a407ae20cd1ba4347dafdce93d452461392d6fb9095d4f6f6552c5e51d735ba311268c9ec417700e8a58328c25c97160496eec48b70d3236c1c5908e73b1d53b2b562f7d98eb9c1a6969a6b63a108f83942e2de29b009458c1b30f0b2c12dc2dbd2b886dde613600070d5cf67668e345521e288aa335d20a5a8e92244d761e8760e18ddd19a2816648c43203ffe4ab063f8932577d2621a1461f9815942961991a49fd31d3a63863238ad74a98ad0671d9e39d0b50a4bbf3b5f82f7e406a00167270b3b79c57dc758720ad2513e8cac8d6e5ce6820fec36bead0fdd6e68fc2550013525fa2a51f8235239758831425d5245a0a7831c178d40195587e75ff200f1d775d2eee286f7cbb7be30a023c15a6a6a4a8c50d0f2e38b14d7b2d7bdc926bddae777896f8ce061905515b96c43929f9987d536bfd780e3932090919388470fd8f4200f95741b44b7e8fe149171b532169c4869ca91c7baf382c0f91cbbef5cd6ad12ea6917c2dcd553361a3066ac9effc97fbb7d8b4721e0c71184b754fe0cdc186412c634eefe49cc44bf7de32851a667acfb25988537ddf6eb6fbdbab5f45e36c3c591a385ca2e3770909025ddf1471678a6605bd47dff9f237ff4f2f4a253815cbcfb4bea0c44af4943c9a32ecf1ce29c538fe7b7d548d8265e7c9fbef574fbb4e92c29db4019ac0da711e6686d4a69861649eb343108c2d964b5bf2dd3d2ea8ab10089511405a0fb82d00516b870bbe9cb6129e79589ea28d08fafb88059738f07182aad75fbc39a3e451a160a9861109f3313a4ecc43cafd7f415cd4c116d2684374708c7e0c4cd9e0180a8a83433b5db39fce872e193526b7b5ddef322409284d47c0b5b2aa508fa6f51396a68af29e8d83452b0313b699741100f84931a91f644c3c848b50c9b7e571ab96574fda4b74d4c5bac7c7959cf9e0ea9be395224ffda8bcf5f43f6232dceceb21a8425f0addc436bdd44a1342f9aa5811a5dad2b7a3a4c91e933d0ef1f781078572a5e59431ea00c9c2700a9a539be3ae1a56e734cd110f5de0f9e07515e4448605bceb90b48035e27e98582683ea1abc270bc46738374e7ff5502460dd822530c75267b3ce992ba7fcfc27c056ee3607dcc000aa46f86c7a4f029058c19df57882e0229176ea8a5161adbe7a8dda8c7350a5069736f786055fc069d784ddbc05e81c9e1223bd09f7a617306b50fa1c8ec57697b88d17ad63ab781ce45dabbc2a237470a3e758f1d9f661418a2e533844c879113268fd2a7d193ca32e86acf2b8ab3f51b508a6ff4849f2da61e4a5a5338f54a789e6624128e351161bc4aa6421853fa279e0f2e433804f1164bda6b60faf04627aa62492202bcad81e272c1fd17292c1eb607780ef67831463345c8d93ff9dfef5ca859698c29696ea2042ce9d44661b493405956d0a55d45974b31dd3d481a2593a5f25051d8e3e33cbf4783cddc1a5ff24dfef5ccbe8a29f336199854274b39e1fd27bf7fbaa277fdfd42d5dfeb67393d96b98f8fd6c82bf42dac1369d0d9e0dccca5005fdfd64e979793e4108e365967e411035f8ec2c411c0f33ac858dcda55ad7096efcffa8c8e6bf65e1e2c8adc8282d2ebb1088ced7818b8a6b4e92a502ba25a5e60cdf44abc8c8d1fe3dc40b991e479112e72529e953f10af9fdb771ddcf2253eab10d63850013da414da3425a6c344ccfacb64a3e8ff9eb65ab5a8bb4f1b5a50d430340a27e1b9123f4ed347d34d114d2a6498dd7bbcb6c01f5cc829c360e860f59b02cf957136dc87c1db7ca4d81213a9fc6dc98269dfae951dfdda989f00a3622a50473f51032540ee0cf3f6f685e4e1c9b83ba64847978fc033889e8ce14b47ad2023ffae16285ba83a0913b09ec9aad79bce61cff469bd268d49a976c0664b24b41408b82d4fac1b56b409e1c8191e032610939cec987fee3cb3aae3eb3cb0c8e722cc4940a1e3957e3d2c2cc4e49809f78f0e0b735ea140dd913d2cb8eaa73b7a542c19be8992420b4932b9d50f01aed09c7d56613729b6ef9cf0ad7c138aab3fa934a2c6855483b8fe81fc3fd17e911510383e11bf6e74409fe4eccfff59989c43ffa626b58a517fbc6132e58744feb912a4a93c32a06d809e22411c1f40ad98f3d7d902778a9af2823f7b11858b094590b957527a38e53e2058120ac91de996afc18b5e31d37149d3c51da80fa32d84d21186027f2bc8a9c74f191eab99b114eabc63f40ca71f383bd9e01c2c622fb1979b583bb2d16603840dd096812cc05d493e9a541491332e59c8f90d55916577bf440ee8e4d61518c011a201441758a9d647b39d479632d2680ba30119bc8875dfc11787760fba78921e68a22e6c74140f425decdd369da1e429b7e0b4017a1bc0b26080066ac7b611c9a5d154019443451965a934c50ea629215dba15b896a7ef27422a7306ee473eedbd75504a06ea77c54a534927d17259d20ad46008658d73958df49cf296f849301bc5dbeae4825d004f6887a4a056f6953ac5c842ee23ac395f84ffd6bd2dbe03a361693c0c9a4813d5cdc836a3046339ba6633367fc65c6d1e93393d665e9602d68dbf2a1c9c2a343b1d9e2bafc6386db8110f0feed0d43c9902a4a5022d8c4d8b828b6aef916f94adaa1c0665031adc0c802c01b2620485521d438116f657295785181e415092739af7a43fc9151166fc8240b75f2efe0ebd063c09dcc2d4bf3c639caeb96c589c13643be88fa580660ca7ef20a6203d96c4687be1b9bcdfcb5d954fcc968d738b2b3fbf81a935b73e85d4cb14379b474f99094ed30c0933249b8f2b52a44d42524686439f5d7ce28b31adc114d4a460034e9ed60d3d3b5b1623ee41b272bb45a7c43c54fa0ac3a476efa4ee2f438484de3cc264a6c7a5f9a83c47cc95cbce862e5bc58ff250782bd383d9a7f94252e33c2c98b6728c2fa3f6cebff45fcb7d01efc7afc150b6f24466337c333e22490c24249a57ad79fb1543e381454229748313a6402365688fdd26f8d02e79e476afa0bd9035242c1f5b56e2dd04fa991cc7ddc1e22c7c230c30e6eefdb922ea00f0b4bc5305b362377038467453bd818be0383fe38f0b17ed2e9662a81be6ee1262cc8206e0c52181d1c7466ea9509f93c360f9d57a08aacff2b41bf421102476fd096962dbcdebcd40426a293ed53afe85b1626087012330305b41cb120d2623998f41257d438c7e081a98afe3822e122457fee60602bf142fe25355f1ec8fb1c07a4076245c227ae43e8e071c72d662c1c846f10501de2e3e2c431e81f6c88e0c8c476ff4b274e08ee7e967ebd90828b2d89edb1596a04a9498e1bc1bf5291ee734d7f3b0345f41471a843eee3137a1ac143fe3abb9f301ef0aba8da7e00ec8fd615042a9fc0981031f87d1434b811330ae5a383b0d3c8421f71621d7eff4d81d61b8d68cbb4e42f77ab2d25b0284e4704a1d60723847779fd0563bac018f6ca16f1aafaf296db07c966a04f31d291eb54de17193b827deaff1f06807928b4f1aeb3e35234cff9d40f2847c20b3ce97cb38c3e03d8cc44d801ecabbce29fb1d6c13a92c956958aa884422e3e6250d7dda7faae9d7e0818a9765ddf3357ca5475a0940ee0255898efeac3a3d414d59a40b56110eae369beafd3339011efd43f9820e803892518c28e3a72eaf7663f44a0f15a1280cbe71111784aa49fbafbbb3b15978283b88341f1e1dce7de6a55bd557cbc9ac1f9eaaa468c7d7a904bfcbcef5712e0c4fd9982638153965f6b27bb2c68b84ec27447258d627a52cf46151fdd597b34b6f0f2a8b7067d43f9860325070f0ffb4660a373d2d631242c105f92224c1750b8256da702f1248c289fca0812582c35b75e1150464f60fe2511d052225202ec10e4d0184a6ee7229865ea29c96397d3983806a264b8a88853163d63fb5c4ea257e51da3059653e363d8fe13372dc985949322b872eda643c8475c9bc14355f4749941d9d5b89ff55685da5a324d83a9b19420974084a8a7c7e091d6ff233e9d8387c797bf65936599c102931b07bd5123e39a63baabc6145fb058d49594b3abb1b872bf4952a9e89e0dfe2cd3a03d04229407693a1ea05d358ce66c29ed7e651040e7288cae9cea58b9a8850df5291199adb98fb0bdc1170187d2fcf07f876763c57f6d3497f30030de2ee1b30de2f60e2f029140e97c37e8fab812fa2185c18d35640d9f55103ecaf0ecf96383109ee39508b6de96cb6080d86d1cc842d37542b3e6b603a042d716307b6718855da201822657421c7878fcda64de4e084db27b054ce7020a9e767d56409c0da5394d7eea3e5c336024a61795c9b90ead04b212f5ded0a5a219b6970c22487180c271f38eeccaff0a7666ef3cdc12225900b7063d99e3ba35f827e9e14284497223fc01fbadb5b62de9468d7423ad9b90901d5e0748071308d9e921cd916da7d7391adbcdf09ed30bff095de429fdb19ece67e82217d11eea80401ded2e1876b4ebae4879b34b0a14e259f8baec8a7c54a9ef3c6edb9c1b84145ac7b2a7c0278fddf54976cdba1e6537574c297c89756d52722d7b89859e579f36040f770e698ec62bf2497acd4e3b270ecd4e6a55ea29d5eae955ea754da97d636047b74db3dbf5cf3ff597a3f4aa68f45647a33a4aa70bc50eed7cc76aa736d36ce369b38772a176da09adcaf6ed3a47035ee7686cdb8c18a439aa76b30bd6a68d3d9aa756b3f9611221ea3befccd74baf1d5e45bbd5d1a087b73a1af32ed85108af9251ec4e071f96f22990850776728a25252da38f137be0cfb7c718b7bb1e69f766edd953e08561df7efb79fd93d82fed9776aa6df1631dceeacd2ef85db70e07173fe33bef5524be133f2f8ac3ea3c9ede3c22e91053e43174d1e3cda0bb7aedf5f47ac47468af371f51710848f0075c30f67a6a73cd126fd825f97c653bf6cfc5be61b13e565b7fd98cdd3d02a16faf7602f5f4d3e3abf578ae3daa235e92cfe32bc9e7d835b95d92cf0dc26192ec2bd73fcfae7f7eddcf8d3dc28ebd7e3b16b15335f494d66cd6eeb9254f54edea08bdde95d0b7bb22f28ad968b3765b220edd2872778a0af15e3fd11c22d78ddc1688e7e9ebcda21b419dd3cee3ec3c7e76a2f6fa59ad5663dd2276edb5134f3b1487f518b51bef76337d0bc495c6186f6e814cb0f2d11c17c65eadf5cde61e784be9a93df609bd76d92832ae4960d479b4da3bf663f30c203c37bb60cfeb8da2cee79dcfe93ff7f3ec9fc79ed259e2cf6558d9269fbb46f9dcd108b860124fbc279e3e66d75977c7ee8af5eb297dd11cd6cd2eb86e36b7448959b6ded1fa7e5dafdbcd2e78bb6673c5daa9cd3d489edd358a8cd3cf49ac6b93cfcd126bda6558d726da41a7be85b0bb527fbd5ff5571022d6a9ddeeb1b907d6deb1f9e1d076faedf49f6317b12bdb8d3dfab87ab3876ce79af5746c638fcda0db12f185d96af3f50fb8e0edd87474020e937c9efd73cc7a4eedc3dbabcd3d70fdc76aa79eeb7a548f3db32bdaaddb3b9b75d5e696d8b179097c91685fa1afd76e490c2a490efaaabd5e2dbb79097cdd3de27987397c5deb96c5d2e61dd8bdb2b908dc0347eabd8bb44726566e924e569185c4618973849de39c734e24290a4e729a260a42385df6084e14359d9abe42c127a6eb13ead15121a695e9f1616a8cb6545f121587fbc2e73c3d040ff75f3b6c033bd4612642082184104218e1fb42d72308616c202d46edf76e3f064c3762078705165858e1a6045f4a35166665d666ddd808015203e475ad5129ab8a13455595949745ad5a2d8f25b244ac023c31afb8e28a3a547098ae670ff0af2c0aaa4bea56777852c2e546f5b6d9057755ddead15237cb69aa0e5fc57bdf449833477b8dc5df0cea93914e54f5de7439bef75ebff7dea10d4b84c1ef5d4929274dc39ccf8a8a6131b07b57fc8951619cea7b5524df7b1a4e8d62d42ce59549275e0e4ecd12378497565408df7332980ebb3805000077d844af129b471842482dfdc4b06317767a451a5492d0e3453ec59c1aa360ed802829f0092fd804bb19277481e76cec5115edefe60694c4a00744197126ef93c5efa077eb392ada016548903502b246de452711bd4b5e55555154f5e4fd0164b31c11d91e7a349dc4d6b099a501b8ff02600160253499ae8d5149e01d34917173c5f0eed8014da6f3802693e8db2719d8ba95055dda1f1a08d141df9450ad0d09d5f548f6a83ac9439664e4a13f2c6249462e72199f9895bfac8c539bddcc0abc84b652513b41307cbd8350891e4d2ff97c588fce5d2de9b1845a1dbe468fa6f7504485c113fae9d3e10905ce2d8de9e521c571c41b0388971dbb4a86dd055f36c75c0486a7999d8d51abdd5115169ce1e7a975c1d0b2e0695b26ac5d043c03c85f36054ec7462c1238421742e4326eec51b53d641deed86a4b6c16914cb76e42d66191ddee0f3d6b40140bb4c9946df4d0287407cca2de092de0629aa8876c66c1a157363f5c894017aff509b35b1dda0b964c7915ecf29abf604a431b7a66dd0af5fa948600b0376b17b1ae93e4c09e5d05cbae4b9283feba8a75334b862e2c1f4c856e76c1f5da1dcdd153038260781956d4d32830fd0814183ef4e9ea19aa9b810213185ec6e77c98a438409f13de054315d4dc03b740bc123abc6e2e917408192227f90e3a44e8f0f2e8d1b4428f9dfeca511ddeccf279540776aae282e73ff8caaeeccab293e4909f5791f3bae0ec92e498cfae329f5d978bbeb239bbf608887c523b01faeb1d786a2debd8a9cd2c98fe511df092c8c36724f2f318a5774d22af3c490eead555a8eaba60794972549757a92e6776330b86a74f81d4e6ec1bbda3413c2c82ddba254f54ecbe734775889cde1591cfbb32729a59964fc62ecb078bdc3872ed1415a29e7ea23946ae2bb92d10cbf8757a33c98da2db0271e8d7231d2234848c9b1f0e1d7e866c5e62528bd9477340ba013c21765447c443e4ecd8e98d3dca2d10876e2e0186bf3e25a6511ca043dbd8511d10c321b01b7b449fdd79f3f51688e97577f4687a63c883c74387f03ba0e5d1a3e91a132a7c763416e8d17408631d7438601d170e05b9c5a676b0cea6d58bd9685d706673050496401e90140179b6873e109b33d6474d3bad37c78ca7f9da3e370dd36c961dfb75698f9825d15e8ffdc25eb1cfeb94b665da5dd93eef8ae7dab1cd2312fa743a9d4e47d334ada3699a93d2c98861d682357db21d3b1c52e339e8d363b1ce318fa5cf3a37d763db8cc1204fc91315fbc7c2213dc28e7dbbd8b5b47b611886619acd945e8325ac5918e639cdb161d9a338b03b35ebb2c012a6840c0b2cc11a9c59602989246694901189ee12b0046f405dc3a881d9cd6622f0e6f974e2a5917a66f39dc7288aa29e4f04760182b3edd33a1c448f68a594524a75a87fa8ebd188c02e29109bc13203bfd72ca3a88ba2a85391d24efd511df55407f6799ac52c6631d36e0e8c9e7acc683627903d7ea2f5511dd425d14e7d9268c75e339108673fceb479e7cd4460ea197d95559b6bbdd95df97cde95ce336a5966e0ec94cdf5b2ccc09f9b51f11945458afaf450b5665446d1d7671eeaf13a45d51ba92c52d4459d09f3d74504d60e298eeb13f45c12128935c6ce6be679d6b1d93d9607d9038e0dc03188f62c881e55acbe56919b657da81e74b1ccb83eaff914a855775d73be1231e3383b8e253896e0cc23c2d9352d7f70fc648fd563359b6537b3b9f3ea749bf33373c988c0916e56cb9d2be767631f88d8334b440e7ab378cde18b65069eb7aed9bc049e974e961938c6872febf0b4574abf5b36bb40915d8010016780ec40dfb1990577a616b7f8c98db1ecd16636febad727c69279747e5947b33ba861f55b7dbd9905531bad0beed8fca11f2dd62887f83cdeea01c91e698fb76693daebd16259768ff679766a2b097dfc768c84bef3cc350a0b26a177bb9905c777ae79ea939a8ee6a8d16258ae177d9da80440af9fb20aa3b6fed1093c4ceb0704f23c63f9e00ce4b93bccde3487e773ecd910da101f2dfbccb42c9b9936b34cd63a65c532ebd566165c3f158b26c866db31db01e511c6288661b571166920fbb008a28c3c7310e5733d3757ed23dacd2c1fec66d9cc6ac5b4bb3ee97ceb6c9d8fd82cb1d6c932bc7dcb2a468fd5aa5d96cf35334a6d490cea279b53e2ccf2c134b37c7ee0c182dd658d528c8c84da23450bf67cc247f8c191dd9cbd5af3d69cefdcf528b31e6d7e3bc8c61e595fc19eddba2531a8d8edb4389714e8b10e57a75d3554af0b4228e91017e82287377fba1eb6f6ec9a7538b36b211000fe800b9ed78ed98c61ac8375e625f17ca5f379cf9def4c78a859ed16e81dcd6a5a76ec115ecb3c87d7483c9fcfac8e75493cf42bd63da7d63db75c8fb4c3f949033da5b35bf244cd2e0b1641d7ee0ae89dbb128236679705c3a08b854222914f3d56af9b1fae30cbe0eccc67d76ec5647663e7664cc3209c1042d8823b5976d927d8337a68b357ebb1f940640cc3ea79f51cbbe77a4eef39bceeb9eb13d04336f6c8f30d7e83a00be7a575344b5a56e76617dcc15a30e639b51267d9476c0ac46cfe7c7a07645956a8f3cde6169cbddafc30a873ec9d6397773e64573a1e8c1e64eb33bb55db78b3f97329cbea7c763ca7f77cda4db3b9a52406353bf66d9eda95ceabc39205abd835ec9a765d8f26bd7909160c5fd33e2c2feb4a98893002bb4f36b75014471c19b94b6037847091f608c13e6d76c1d3f38ce1c37873fd8c7685bef19c9766b30ba657fbbcb988ed9a8eecef51c55e6bf564373ebcd96376027934ed1d0f487a1eb19b45a0cee722210fb63d521df3d7697dbd24d9cd31afeb1e8f5ddf6c9e77d7e7f5fa5cd8a7c753bb6dd74e697dfc75ec9a25a99fd7b27a73cc7bcdebb35dd75df9bcde95ceb5a9d10fd6d13a22d0b16b2221cf310fc8e3999aa59a36b5ebf49a07d3e8bd300d9bd629851487f5097ac630861debdcf3d9b15a531d9f6b16b3d93bd730ac5efbfc3df2bc631f3e441939f4dc358ae72336b689c773d0fd78306db6669d36b53baa6918b68d9c6e3230ec239d53afdbbc2bdaaf4bfbf539b59e7f6c0e8f3bc59ecd6f363b666be36a73675acde6eb7352db23c7a418f60cd3329b97c83123c66edf65adc750778470fd7ac86d968847d68ff66a3508674f13864d18364da03b9a599f32d041d324e7b64dad5a4dfbdc95ebef61374542f39d4f8f8dd5d180d3344dd33461d627ad7a28ad16f5fcf38f471e5e45deeca6e99202433637ee4b24a7b64e12e910a2ecb98cc39b47eee810d6e176eddbb36f76ca3ee1d4bea96c4fe9cce60fcee4896b9279817863607ab7c3679d4ea7a372fd532bad577534b64fb73a1a70fbb4d9e98e4ac0f3393d7b9c2e9a0edaece7736d3afc4532bd9325ce15639764bad33bbf8ecd699aa6699aae52271295d045b6cdf5684b6252026bd374157a27174c837878fa663f1efacf2d79a24e91eaf07cba2b9ecfbb02fa748c5e960ff6dce8a65f12d1e1a769b20ead4fa23b7d9a93364d6b3a9c1487fc344ded663851d813d49850a7b77c525e50f4ecc1f01dc700ec19a00fabe72387c75e9d0fa0c3cf3bd7b17f2c0671f6d9944e0a27cf69762d7be88e4278157a8f78636050060f33f8ce5d30f614086d63ec631fc61e03e03b57dc39b41d6780cee1476cc7833b1761b83b9f210bb2f4734218a498869a316a8a4a066981a1869a3f9d8646434fd16868347411a8276b1589fed1a8860d2723b32f2a14d20e70303a2138c5f9406905fac62341931c889241941ef005a2d44b59ab48f453fb64a049fc2b4194478226f17fa557b2e4504bd6192a456a29bc16e27cd8c2f9202ff2a27a01472ce07827312ea6b40fa7343e8333896f83c4a92a6827626084518467635d849add14606fe10c103f9fbc04e2b9a066d7057e8754e5e1ccf68d9b9da1c237cd3b83434981266dc01107c737068ead021cdb091ce363cc5e707cb50e9a68d64763378fb4cf9b7f5955de8ec88a7a26e0a8b59020385e074d72e7e0f8fcb868218e467c46860adfb985e0f81e50ca5a45a2c7ea467aa992d559154d684229078565155d459d34aaea02877b4583ddbb8a2aa59433bb819b9165c80ca1e6ab86547dc090a0c9cbcc510696e01718da68d96190884d55778c56c430f3bd673dc3201475ead3bd1722c9cf890921bca7e037b0f982fb57ce7583fb14185a76d55c35211921db9056407fb25ba9aba89675cdeb7a39f88981dfe9cb212a4232d0e47db2ef6a3099cd6aa0c94b7663a35d5bcdab5b4d377dd634599fac8aaa2a1957455531465851f1ba280e2a5655880adc9fa11fd80ffc1ccc4251fca26e705f8ec001f7e9480eee6b325e60906b489bf455d3851ab317290a9316d653548bc6bbd5f4a8bf0de9515715162c15cd56da6a64ec407ab1d5c8d8012529193b703eb8ecfd67b1aea2ba2ba83b081fad807523bbd94818356f2119cb7e8144c45353f2f35ef9702e4709ceb2c01c0a4f568afaded562a4cdbaf00183fb54b3998df652b31cdc27e1900c75339a1ec900c355d327d5fbd790ab14928128f55948c6ba516f46331246cd578d109c455885415b61ca6e325b1476fb014dfa990582fb903483fb1b4dce8f8c264846d3232930e7e2dde9dd48326aea55138aa24dfa94e2883724936119c5118aa247ad840f7984fa9e029fad3e591678132285647ab4d5381a65a839a3c1fd1c92c1fdacd42779abc14dd34556930de993cc026dfa5b8df3c13d47e39db297cdc1f9aac1fd49a9cc9c0c19d90438c17c2fb66c08a173ceb9c7474deeb98972eddcab925f24fa4889cd747c99311afd2522e79c8b437d3763b5a78892cef4141f4df4a12a0fd7ce467178364fa77ab48c62f3b264e5f1783c23d9088c3683fbf3e62312d58a49f93059678c467fc9eb9e1c8430c669ba739733d5b154534f51df7b8b9ee853e37443c19bea3998d9c838547733fca23461100cfc4e51d06647093ff770c0cf6a4e54f5f084585351df21cd5161528c8932d83d432ba2aceecf52b87a6909537de09e8ea769d2cc992904f7211715900a488fa09db00cce954da9264608cd17d804322104f814fc4645c235b86f55328d52018126fd998af443c3412ba04f594da6728fc2898a1746d987651c2a12514e578b9918ee29ea8ce9e760e603778ece393739e726779be184024f17f4a8126253aa10da872b1f37f81de6c4bcc8c09070471f3f62de8750d592b10f83d1a3ce6e706736382b4d174c51b37474c2c8caba1b568599c048443c611c34893e220cce52e21923ac2a6aa226f80962948439756a18b4107f81f3c70adca7341cf4a829ea93cd150d9e2eb1a8d329cb52d168323d6a2d46a381a3d19762a859d362705f03d22759a3016e1215da8f3eb1a24f324b45d3d768e07c70d5d2e01c5f2a20b8274cb40f43395511f6a3aa2c7f006b3353db32d0d05051d327f9c5e0f7dc34b88b3e795198e91b8d009c7b087eafc116bb192dacc05a44810780dd4c1662c03919d2d068214617a53e71335160e20bfc4e839f7b54d40c67de7de0f70c856451d65179426e99706e9bfe74c57b53d1277db1a6384e5033cb07df921ebd477226ef3f2010fc9e5f0e7c2f3f2960687cd4c4e05792c14f0a47e35d86a1e6270596c2f9e0ac14d3e3f487834699fefe62fac475176df2ecc32fc6dda68150a8c7b9695e0005ceb0e4eedc5061200af40167204a9c8126ef9006bf77d3e00c69220d35c694c2ec010956200339b0e0046ba0c3180e808499f8442720030f6cd082171f3649a8e1051dac27ccc42702c116576c81083070c10dc230c018302035623793c517b2e08248165b783ec882067a31af176b0730a05e60e960240e560ebea00d61828c2be40aaabbab6e6a3c09e314a1944f260b326c918439855ab19bd922084bd8e2099c8f15610bac0a216f50821033e05c7f0c8b3014e205862f10c39938c5197df2847061627827856c212448bcc2ec27aa9bf3c554f73ec5bb7204f5fcac3b14c82be17243deb223904750cfd5fc7c4a4b29df84cb0d799bb83e6f9577e0e9927ff60829e45d817c139625e52dd78474f24d58b74213f726e4154113778a3a092bfc3b8c75988de77b389a3062ba19ee511435dd4d8e87e37eec2a4c3763eac7c7f75d89cf46d94e8bdaf753d538320089b7685ad4c6f1ae6d08243e02dee105bfb73c24de495c901b4c5dd42794e8415e30f519352ca6ee8660eab151de0d4a657abca5822aff1ea64eddc4f9709d3a0de78375eacf3c1cb104352deb1c8d77c49b59cd703fc37d01e0f902f000e07e0070ff0178760a9e109b7645be7f5912eb0ae100dc47c2e5c501b8ef00dc77c1029300d1b83a49751d8ef8e15394162eabdbfd39e79cbbefd725f55c3be7dab917e38b2fbe185d7c5fd654c947e38d955de9962a5b84117603fd6ea62da6bb99dc7c5694c1d5bfa675b8c7d5a34f1cbe5afa84fec22e7ae507832fe75cbc2cb50f0e96f5eacfb6483c59af5fe718af78c52bc668d923e0df0d1435bbd24d8f24aa127e5f3c1b0cdfd2a307839a5d09c317b10123ae2ba69b31827a1af1f026cb7ed9fcf0551f0f8774de95931082e303296d9dc00ed5d1889dec0179175f1212c31be1c006315430b1cec406319068820d32870d7580f1b1417aec5087177bf45cd3e0067705467553ddbcaaf41a96f4a82f12f5a861903867764c20d0a4ff458fbab2c15dd94caa9233c6449900e046113decdc9f8c87125fdec51d5f20cab48112675a188c9dc5e7524d8a636a9a43e2492621b59937f4141a4d559aa46ada5468d2578a0b66629d894e9b4c6e5105f105050ea5a28126b105b8732a1a88228234a269035128e7037c47d1b4a1aee80ef53d8bbc503714aa4626da24be7ca166d1439960b449bf21505d5315eb296a678360b8aa54e1b098a0e9aa54956c445569f38064a82ad14c1b3bd894a64d8f2018f53d4f9b4aca9b8f126625ad4bdaec6672de0f9b96a9813ea84a5a55966e26e7fdb069999a385195a464cefbf16c5a264e5435553339ef87cd44c576ae73de8f38c1692627763bd7d91cea3b6ce77aba76ae9dac3217eb5932c0c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1811fc26c51c3289d7b3c986e468633efbd9218b80f733ac2866926a2cd173dea5782f09182e0fe34d31417920a2b5a16ec675956f64814251f8cd5724191a3f2704b8fbac775651b5de03e46d3b401d99006f4a86d68487444bd3deba12acf7ea8cac311144120d80f04b23267c3dd905e690b75821c94179609e0b26bbad4363739f0053b08432291482412a9478d9b91cd4ba21a086d88600c948124f80302813315354568c3860d1b369e1bc16686d5ed53c94852fd2102f29991901a4d63432291482412a9870d08a18d2eb5cd4d0e7ca1a6d8366cd8b0d1d9b00f161251cfe62627262626262626864422914824528f9b9b9b26f58f06d2332da469a64822914824d2eb7173e36edc4d48041b21997e4820754624e48fa626a6542abd12e926e7a561da47c74448229148241249060900b0f7121313131313135382267d59ab48f48f1e9037f3843c9a575372871d1313131313f35ea9547aa5577a00080056e36664f392a8a6d2744c4c8c7ca930221f8f19c9d478a4474343434343f3181953c55031534c8c813102c07a0bf5180d34693aadca39d734f46689dd5caf9b453f75f3e8360deecb4f0b6170c34093be3084c9e46059d0ba0167e8bb801532aec69a2679cbb22c6949392d29af4f89a3e1e1c4c606d2ca408deef9a8c1dd857642073e9cb09c703e38ac4772861bc9db802846e43ae51f0f3cfd09017175232076e79d81251178ba1bc94a092aa52105eae7614f5681fa38ca55eace1ee128e76217ae01a32042e008a23c191969034a94b661c3b174ff5123622a8bcda481fa6420cafbd13f7ac62ed4fc7ebc21381a7d98839a9dcd1b82112c3dde109c0f9f1e55961ef56dc88e198d6e03b70d1b6398a9bc70c1620c36e820063746f8810b16f011a3bb780e0353d4600b35b0c20e3062d800021ba8680315c2e006983050701ee1d8830d1846a7f4a8e4c4e1d8047402bbf81fdc6d4094286f00e165065eccc8c0093f6ee47a82b308c738f2c4c71aa5761d1d03ae1360d859d032f818ddd45c8c340887b385e17d428c31ba6e97d2b1b250005d9d284bba07db657a2d03e9de7befca1e3d12e067a57bd334cd3ce11602ac917dab1b411378841240487c441238ca3064c55da194b5ce681fb077f4a8bb9bda010f6f811e35743b9ce5e1681c8f3e71b79dabcec3eeb0408f1ade023c22dcc10352d7c6ad011b4208e18e3eb1008f86875d5ac394779512eff36ca6fedecd553e5b97e2ba753db24edd0908e76850d6bbced1682cad2b05cc6ff46567b4097cbd42adae74d731a1becf80328851b8f80343dcb2472268027d402113458f60757728ab3b94ee49f9de8d3391b64aac4750ba57f89c8ba418137d44992cc230caf89021f5498e38c051f449ae110711077de20e6fe04dfc51e34e5082a3b4b54731be9750df9de4c09ba25651dd8df7de7bcfb22ccbfabbaecbb2ae9badebbdeb5dd67b104208231de24bc988871aa3d18807672f0a521facd1e683a736a3c6b539d45ca3460f8df2b9019d1d19a1bebb4b08e14c69ceb08016aacbd2f2d88145cdae5404745df8986f5849f5bdef7b81f0c1f7021fccfbfd867f30efe53121fbbd3c18c82388941d3d827f344c1851c44d097e2f0fe631d127d9e5949e0b307c09c5c567d4e821c61863a4ba638c718a31c6d7a843bafbcdccc4c73b17ad30d680020a0a900b55bac6a23674b5b6a046c1052d1a67a705108f011f314a9f51a307299d8dd16bf48866479017e487ad0c15c21a6e0886d083dd4c144a16764e00630b788a429ac82428c08a19f9bac1d3675751bb6fb8b76d5883736debdc08dec94fd3a18d08a254ef6562741c8df72d7700f7a71b3338573ff0f4a614b06e54b7224193e9cd859ae5d4599d8e790053206a4ba051eacdf41238e0a97f7cc4c09308d7c053166e70026717044f5316375ce0cc039e5e3f8a432588155408edbae98e4728e9a1bbbba3c063e8110f1d9fbbbb29ea517fd457de5b4af99e7cafbb71778d1e413b4a3141ed4308a1e3a2876a8594345e78a31f7a0473f577577d7a7ed55ff595f728fbe45d47ddb2aacb7debb3ada4420800bf5bafad2c5f7583b0512305ceb4bc213c7a04ffee8e1e79b0a8373d4a49d0b4f40914030e3b60adfd3271a185a440937e02b07b89f3c1e1f7defb88871ef5a39e42d92082e813ca518e72d299f4a9cfc90661537ed0a21ebb2e02bfa7fc10044c09e2d6e8517f2b43cd23dc3dfcd027d9cde41eb8e8a18719213ec0108317d3cd10b9424d02a2d4ed0ece3b48efa07607fb29d63d9793e8ae6eb75331e8f5e66b379fde2cc2ee741de83a68d2378f707617e573b303034fd7e32dcbb2a25559f7dc7b0f56ae7ad57b417bac832613622470342611380388c031a04d801f7651e0e9970c9e6ee1004f8731934bc2d1989e9981ba68703fb296019b4ca8d4eb178a931c550c910c000000008315002028140c0845e3d13c0d44710f14001083aa4668481acaa320c9611452c81863082000400000000044004405009d0b287c5b387ecc55b5e4329ae508d11d57a1151ff5676ce1a779492bb3735505962154289cb3d228a43ea5145de09140a7db15700cfd98bdfad9ae5accc1a932a977ee54642e609a2600d6cd97915226f166a1676c5d700ff558e9f2074b372a2c018babee2361aedfb22f29d6ad2bcd205c599f1a32ea0c7dc7c95a7b8f45415cb859b26fe93582057fd299ecffa9c21b5c50290b31b6b4f8b6c71ae18b19809df68f559418940128cc2da712161ad1ff73e94d40c90570210c69f519110ba3ef53da936f3b0c873a81ea9440a459632e5d389b620f60662826a5c6b13fa0a9471451016e4ca5155dd1e6c0deb9f43caf912c1f9954bd43c2e53885ed06eb4979f94cff4f2c0d3365583df99138aed11fb9f3794837e1e689f1506b2d1f42b4a3973a5bb4f6042576b346fc82d0f96ee724bba0ee2fbb22dca407524c926af98efe0540baf965e399e37fd2ec03d7c61991c38b1dafabb7f8ceaec81c865e7d5bd09e4a398830e9c887262efbae68ff9cb769fd3ca42e2754e905c07f2c93df7c46b0638e7977375efc3891447a94c232f60b26fff9414982417f28db4535ff437e675562446d8a5e6754b6250556a4be514746da73772a8b46106722a54858122616fc87edf1667d7f6595b3a9570eae384abd26905983279f31d7fdd95af7bdfad52f882d3ed86a9d2d840ea8809b25b4fa4dd4d3f137827b5e3835076136cca0fd4a1748a6ad902cf574ceba664d43f2aa40f8d43d0e90c8aac6695b0214e1ca8c860d9a72923ed556c2b8e07c4597b6d0248787d250ed18165ec569a55db1dba53e6298d4a988828f01103d771ffa87d8d52621c92690eb1e00f4db3e3835c797c4036e2041c2e18792740ade815a4d68e89fcaad0738850e9591b829929fb20a103d39f182fc98d9e2e7081dd3e6625547d4a1bb856cbbd4c51b342c74afd7f441f51a77705bd1e633dd611439bde69fe55873c7a062fc6ad81274339f303220946d30fd31c1fb1c0b7c90770b48713de10d7213d5a32e497e19b93f354d3930357d89685c6b660d3dbc51827e30394b4b4fd461475347ae136d087d8290c1583f825146acd96e80faa65bea4a8ead7813fe8573c5006858f3f2092fd35713fc587e1e2d1086148cc1f00c9b3a48a70a2a2e3b00f35d7dc9052df115827d885df7ce012f44172cf11dcdaa2d5ad1597c80b61bc501aa0ba7cc761543ebf26ae97aba68c1e36f2faa392b87426a9f4e7ff665ae4b3c683caf28342aafaf2672bee2c31a7d1f308f577e4a27bc16f22698b0eb92ce1d593fdc94f5acceab07b104eafe0e8ae0cdf80d814b178d905e2efafdf298957d102ee15da78b9056a77e104dd01ba08e67f44ee8d2494fa82b8a7e87e308dee9ba09d289f53ec278e35b826e617aaced455ce98cd17e33ea863afa5eb1b689d5a74fff285ea32261d8aaadb8987d00c8403b465b6a4ba14e6ce0885ae6185b277213d68b669105b721aadc96d35f0d7c788c39b5d2dd363e3d70c9ec00ba4cd691e080c1099fcf42189b751966d9abea9b68316bfac8bc78829b0916afe630821c53e057e251b42e04b8f9dd851f4790e3270d68b61e5aa60fb1807388c22ff2b197867ac3f8bbc02df8e2aefde17341ab865ff2d0dcaabc6de97a2772fc79c41975e6ded2d05e8c17fadbc05486525e2f2051d6c2e051cdc7bcdefe551409179bf67c547b64fcae6fe75a226568d085229b3e8fd5ac2c22314787660a325882d8b2cd027cadee9915123a987451e0e13e024934f4918dcf60f058d286839ee3fa5632d9fc9a5041d28b25eda1835d472c30addf43d190fa8a7f8e3a2b142c8afc8e34cbabb9a55f8d188e0e1ca4975566599535427f62db94a7ee90889de2d1d50c919046f1e788e3b120c1eebc145d7a6611132adb41f41da94328210b8b65f61de336b4d31f2c0278bc7bbc5c39e847ef781d1eb4478f47867c996f7955cc1b960f598c616a1d8d6308dfeaba0883d6c67f7a1b7407e82002e6940074ae803a9db7e22e1073a65e628815b5295c74ae7acbbfb05160ddfb81c2b7032b5f0e94be31f0030eaccfb968d0756f45e6d404c0858d942dab7b02c0556071a0a6752ae47d33b4396c923a4808df63c9e260e428d5e6d7afa1f841085276ed84cf7088f398b554cc59fdfefe705de2485f369964a701d784605412b812bfbfe391f43a2ca5ae1e21c009945a2ca60e58b2ccbee2ead5c43d1a54312c76b7d74a23009d9e4cd419a07f946aa933d823a118baf7c03efc3ba2cd745c0ce6b03beb13515ace3cea93bed53b18aecff1c73ec5a5bd438446eb6a6bcf165008bdf338c7d6d90b5f786e0d4ac5d84ad145caba6a91755c470c5a0f57e993ee36df0a75cb4cac5ffcbb2e15bf1cb9e6aa9f1d032485b391e196c49d661932ca2a8aac5e61e496fab1db5bb1afccb914850f09a61bb2c43a2bacb266d3d592e3306a9c8992c93897f08a6008bfb40b42d4adb33061fe4085f7b32509dfe074ba72ebb2d15b80977eb799a187561e340f975a599bc90c119916181830cc2354a98cd428e0fde1096b32f9db865daaf0d7186b680d9c0bace6b3da1000a2460d4d45e07f33f6b96c41dc48afe8d8a7fb2eeadb06b32972cb0658aafae96b92486db194f440fae3feb1b8da3c15737ab33a99c81facbd88e6902f8ef2ad2e6042bbd4d92c14415cd46ad1c04334126ea27a788a5ec52bdc8dbfee16d481c94b5d8ad07f5c41c1fe22c835cb4159c022c964810e3aa098265bb4a6c4801989dd57939ba937a738cf2198c0230af190c1b4a26bc54ab89f2068a01b1a432142beb142b8a739ad720147f551b3ce21c88a0ade7006d1270fcddd138527019a57a78422fb16d0f15bd91948c53885cad424513434694ad3261aaf2ec7d9e26e19c57fbc5b7179900f691da4a1be3fd3de33bf9470d6aa08f89d17fa252eaa50f10fec2aebf1603c168120fc1daf9cd156628fd0918215eb14fa9c1196a6b333e66a2d6393a46a446bfc123d13c66bb9d97863203be90a6a651dbb38ef2a49e71334e4dc7bd28e71338cdd823058cc2765fe004df72d5cd87430291d1b716d1e6d6c5a785d60d7bce3f78906ae855418c0fd74b59043acd28dceed54f1fe85471ccf7e645f616c5087724154f6b0b38a3f3c7480c6c688347eb2928a19ed3c0a648b85c1e2927ee875a112cabcd82b787cb39094b59627643b6cf5084547e85f2d6c8ee9199a4d8c9ec0e5084efac417e3bb76124c3247e52d694f0833a7b8218c537f13ba3da7d9b17d73af0f479e22d1c4b34ae52f7feca0ff4cbfcce4abbce671e3c5a3ab4d2965e00e83a285ca038de9fad76a22b08002107f309ce25eca56b0bc9e8723a3b01831f4c944cd4c8d5f50e69685bef1e844e57a8a1d3b23de79e122611bbbd274f4964bd9b8f3b42675ba39cdf76f185c2018df3db51e9aaa790f4d4a67ac6146e2e1c3d2c9a22dca6ad12e9f9a2ceba85b6a0bffa0afdb9f82800e8a7d60fa98257254c3128a3bac56523ff1c8adccba3cc18ec23bdc86d4c113fda9267485d724bf05a9312e32d79534255131d85003f45d07108415070b3a244bbd04bb32950751271478a09fd5dde3d21b644cca7faf41274488661d8f01284ea2fc1b904783d73d01c2a07d8de85d69e19ab6c5fd4d416f37d56251d81fa43589eb03cde471f6348ed382f3ce115550f32f63eec94ed9d9891b387072ca48f418869b1a8e352bf9fd9a20fae5570d8a764e9486791f4abe73566e17125ef60e085db1e854aee61126867e8dae34e64d3f8fca9f1c01ead944a5df213c7151697a7f73a1bdcf416cf699e204fa37640d417d61f0209a0f55a53bad478b712665760af18e16a3b73abd7aaee1ef2097970718f41234d500c4ad3661871fcacbd9ce90f916061906bf1e56434b40826e744d43b81eb320f544157d99a17c35d85360b28417b643e7009a9b673e3ff14504bb45a8da3128d92b78d8cf7e29c9449dd7c1df3447fcf234b055a457d91639cee2dc563b3398a3b96d879f1c9fb44fe68926227ad48ea4fe9d9f070bb3649189e3672144b43ccf0aafb65e7e5160f852a30a2efd85359ed605c7b3b5740c91b582d4be8f0ce4c5410d798b7c0ea44a0546917965882c9aac272c138f95cd3c22928106b03a51bdecf12aa35daa2242ebf459aa5505014252b73ddf0e1dac07f8252be17451f0ae3c32a07c2df3cfaf824cea22c861cd8aa1801fa9b588afcc598e66996146a5718189666da602e3d1e8ebed6627a72bbffe35c64590ef79cb9c9447af002c10ca5f0546aa1e537fcfbcf6df4c852b71d63427eada4d2b29d3346645cb381ee4345f45c3dd5712374f0ad8767a05d5f276343ffedf4300e62519b2eb9fb373094c6ddaa4047a5281c43be1772a443d815fc89e8afcb719b8b5255a6cb05fd3dd5c2e0d601705f1e7e9dc714cb02c7b25c6532c8de79db37f962ed400b49c0a5aae0f19c3ed700006be130912daeabff7284da1f8b282c20bc0b515c5a5f722150cd07cb872739224e5b60f1f305de34fa04040fddd9c65c0efd5409ffca387c6692eba8936d0ded2909c7129c0991a1238768097a83885750c1cabc7a32b12aaa36d4f48548333ab8eb93fed0df3269d0c4a07cacafe088cc1d40e80f2dcf752efcd35da2d62689f9a4d227d83b7819fe0fb19f5d92ad586683f168b8b1d734acd1f9083b1083c5af9e109819407589e7804ca280e1ad5e0f12a70dc5b5aef283aed2d45b159ff91eff2ba4889ae3a69717a759f331f205e250219fc96d1f657abe1e19ad81978ab805813ff69dc61ee4325c7ef32995314da896afcbece69fffbba7f8a9f8aa278b135651988821b5dd68674343f4451ba1f3e9539479cd420b13990fc335dd1c39b45a7fb2fa06d0c6f9e82b7742ddc10ba88a27f8e42134a9ab28f1b58429f7fa513c7502eb0cabba701d7b263fc22858fe570bf4705167492d7e96c516643a69600539ceb13d55d90dbf3ad0993c41fe5254d0a8cb5e54d57e933541f302d6a169f0582bf989828e874810173de8a4608e8bab4c3336ffc8a0729b4c229bb3dc13939d1d7aaae1fbd80b7d24750e6575bc1b4e9cf305e84e26a2c82be51df577b3d9aa97b4f1a8504cec0f6becc3039a844d02797e30de1d77e2b237b34289784fc06027008924f57974e640250214be420ddaa5e01ff53d64b14f87fb7b9c8e66742a2a884057d04e919fd057beb9a02df0d85cbfbb6bb2b03ac357be826ce01604b637210eaf45555dd1284569ab491d7118bff85317a2dab04ba07d33a4d03d5bedd270212209836fcb812bc76ed623e1864766933763bc3b52568d4953e9b71d11d563b17e2eb00f4c52d15f8f8b9b9da9689b3213e5c78b54fa739696e5205e5b726028032e6ad705385aac24485fb41370164dc138e9618ff014e968aea34e48c4e66677de469d932596ceea313a32083b588b0f547d90d77effef2337da50faae845b31cec22aaf42b83dcfedb6ef161a5a9c7a654db165fee73f034ed34027c14fed2b142ef4ef9f8d62d859f8f3adb33d10217ab3ab80d97a83dbc029a98e68910ad863dbb9531e8f71fe9cf7f2d963e450cd54f0208b288521ed38e018a7696599161e1d5adbcd441e803218c80bd4891781fc86d23841e706e8548480d7246080f171596a3225102e54fc0df8ba6bae40832ce84cc85c0969c7609450d7cdf4ba2f879041e2f2068f60a182fbd0ebbe789299bacd96e0147404040fd01405912e5ef03faa173388764ca7dc18e71ab3a67670416e2a1c95d7e5c95d521244a2d9200e297b9df74d0161db03a7599cd0471abde5dc2d5010b58cc398679e6b744ada42d9f35a44bd3371552b2f1882e1062bdba56fb78781fc63a7df6b8b54e62301f1f39dc480a8194d63a79322688ea8dfe8cf20f4d9ac309d38d1eb96e0bbe6e42c944b81caddc73f27575b5bfd903cd7f97af8194351bfa20a34b8c57785a7fcdc466d8c2cbe91e79b63b701b8f9230c8048e10f415f0d5d1a11b8d623d069dba202e80ac91f8b38df6f6d111b4a4c4ef42674511e8200e12819250bbc9823c238909ba4a5eb904d3cc292024a0683b05ff6cda69214a45d94362d8be137c20325a734ee1cbe23009ee53f81cb33b06b3cb75dcf54484b09b485773ecbcda9737805730da9a96c7af047c8b39f090f0f0895c40122c9c44a51a884d496c311fa78db2eefa1dd3f20c49f1e96577feb03a721a766b5c937e9177405ce398ff1684d16d81c1ac6103fbf674ba7e300c9058d895379556ca3410010f82a2f1d3aad8c8a7030eb8f0b476e6cb30ef233b95e930ca4cc91433eb4fb1e2194e27ad43435ddb434c53798f6435aac754c6045d5e475633435d02b1d768014cb68c0c3b814dd9eb2f60a3e9ed561999284a869c602d6c7a165e2925aed38d5301f9d0f998682b8521ea2b0805511beab9bc3f1605dd542a3085572741651844482919259ff97384b7aebc6c31319f0e625e484451ff98d761b88c71eb882eaf7ebd4e82d76745bbb5f325ee4e14cb32da1b8ee6fe8e2dc6527aa4646fc474dae2c5ced6db52935fbdf4be575eac7ea2d84613eba9bc85f112306a9305f2eb26306f8fae28896eda385dd6b70be475e0032e8da480d3747848cb28f8031a8e84553832a7a3907876af9e19738926c0f00f1531ec3cef9d6fcd75c230161e8c82aa165456bae1e465e4c6d4e24d2e088dba5bda70c9dc8410250d90b5ecf62cbfa5e304283a2dd3e64dc50d407b47c936c8f60e7656b5d3bd34ebd93215775fc3ed2a9fb6567c2b9368c6a11119ca0e129be8c5afaf3a6fd82e59d8bce1c4a754a1e7b71d0461bab11d7953913fef161b92dfcd6b6853217c846fca97dbd9fa9805d22a14bbb9024e5fd15daf5680b4b2ea4be455ee505a3fd0feb6b35b27620c0fa502306c729f141b0076e37bb5b65e40f3b547af489e600834bb924437b88099a8d03e55fc2d892098b8f003c3a9f9e08a4ffeb1d755557a0baeb23043277d684190823751e9d6a710989c775c1634c8528bace9190f3defa5e062bab2e2bd1c32bb2128ae437074ed9c9b2bef9761c2964ed2ab2fa41e540b3fdbe3862c4004275006b400952d27043ad270cbb291a291ab6d072317a079571b44a6f4e650616610141be16dd2a3ade66151abad59568b01ac8293b39f30c0d157e60c8712ea29e6c14a5988df7c090986dd536ef86373be9b8d86f824886bd86adae775e3f56d8222bfdc32b81270ce7dbbad0a07c686854f3528bcf70b2e5a8b73444b0b5c235b8b52ed80543dd551b6fec82ff8835bac25f4936c598ae7fbb2a95061a5abca8c6140b936fdbf4fb02b231f0dec15e5dfc4c7495c0177d00ab8c6f6b4dc9c06319814dedc54a56a54ed928b2afba0eb27a31746a36a4244749380108d8f7e79adc69429f44b609ec90ec7d03c225da789b2138f128a7b8b283aaeaf70a8613b2588b1aa309408e8a7c051623413b4783219e0de793657e9084b918cb36c4b277b08dd6835e810dbf45755baf0b3a084913d0891b27f931d8f51ef58cf644ec585a87c2f8b35e5c061bcc366d903814fb44b72382ab080244b3fb4952c6889c926366051ba4523dd4f4090d436eeb011b2e1a1560f10799431615e34666403ba11735e031ed5b231f92d7750aef395916f3b32c2376df40d654a46a5852df1d4a20604230eee981651dd3864ea1f41a2b28be8459cb5b7d0752d6718282d6b3554fffe6f85a6483a9a296a8646e4528ed55ce65494e9b981003821021fec68c8a18e64bd542b8f96f90000d28f2e0939ccad1a4f08ac738c598da05903ae4490d87f62a7f48acd2336799b2b086c02bea677e979f0d5065956ef044f491db1e754770d142fa7b68b6d7b0bab8d47d65da27635eff022738973565792544089c096c43acb7173451a4194899828e6822ba8d6c0136c24746d035165c58ac70b679dd79108ea420a448c1e74aee2248a8e40e67435e692956da5ca59bcf0f7b8b920dbfc1547f2212d6bcb5f057bab67a7b725dfcfb01315c1975f41be545393c70fcb619488b5cab06823c4df906960845224d57a5561c3aeebf057807522434c24ae41bab2d2f231ef4b479dec0107ebeee958a3f35f10bc2ed7322a321c99164bded56e9a607c8ed431028d46fec95c69d7fbe4b122d4bcc730f9dd8bffeb94dc337e7308a692ab23d7c6eb9b73b5a4239c5233b13a22fe328048f7860f6a7f1ab152c3b707a040afbca21f043744dcc10d1fe29bd594b412fd545b8d2c8fc8556ca540ae25e80e6439ec912a92239c833408166b33abd61adf17456915f2b82b72c714c7ab0d81d91f569a03416cb69c76082d44b09d4f3be1493b7831672582bc44ce4b85cb183694544f5661ea16c6a68c81159d3e88acc45b1aaa4a04c5e85e54896051171ab004f4aa159896d297ff903a9cf03a69459a4a048a107f53889df6edce150a33a0100e4d08814325fd0ab21251ebbe725dcfef4377ed3be752c6d1396419b1688c3a6714494c059e1ac79f74ff79bfeb20e75173227980a93862f3b3d1493c86a770b96afd17522a5182154150308b5edb5779d453472c5341b24de61453004c7506344e3634bc48d557d1c96101f3d15b526ce1875a0445b84ddeb74cf7897c882a3eb6357c328d95b0a4f422d0e1a86957434424bd86944026f0a090a281147d6ea6155ab05a1840d836b49687135a92228fdc9a7dc48df50505edd0a85c141178e3eb08f81fecdba02bbd3d07c3ae10cc7aebaabe58bbd766c1108c48df7f74ec4a5ede556b9694ab779def801b03db5859427d4eeedd479d8d033f10befaf3bbc5cdd457c9f79209cf8a62ece3af58478340f7be038a3b8187ce17c86461efb12cbddf4bca47f709cf9b04933fb573f34ee6fd5ba9972949c4335e8316d2dca95c60d7a627300643a786197f760c48b51c6de36cf7aac940524d945861102855f8197e0ab452cb702e60af1267332f6af0dd8115c7c1b1b31d58f412383e04ad1abc69151e2f8ef2e570f96ad8c4cd18e4c82d0601b4ff6f065ad545b161f91c7b52b26774314462edc04de7d1e182f93dad30b3cfb5705c372bf53b7c296bec3b60a62351d53bda06605ad236aae139d654d32daed08be69c22c8a2d7702b703bf9c6833e8bb3da9b9c13b5d8f8150cdc9031b3a923c781ee6f74460c56513530f63a11beff2981804ffacdd7f88b30dd209c70c026d11c043141478db4ac2daea8489c22b64c21ae8cc06fc8edde359660a030d34e9d80d61bc025c2726af078c7a0d7ff6fed1b704691c96a08e4c0058b61a95975e204668c31a1133d910db9fbde5c42ad39f47fd7977b0a355a762f1e354e6f3e8b8baeb17381fa54b454ccf58973db93cde793a7297071e8d5b066acb7d35840799a7d9c48dd5e2f507db8a0a8105aa395965944332a366b1c862098aae5d2ed077812fbb655371abfa9e7ca7e9be5dcd7a1cad88158e11421e48e3cf636f98da8e6150470eeb05ce58c423baaa36ab4fe9bbbfe8cf9212305bd8ae8522c40fa0dce6ccc0f603689e820f9692fcb2515b0628fbc060867c8a1d630176745485bcee1f7c2b2890e5edb4075a9062b61ae86c61c849c2f2c8eb819d92a74b725e196221526faf73d0f3392a73a2f08b3bae04c987240eb875fdb8f9fa6452924af4deba6e2d5b4e1d9f48e6e269b3bbb3a51b52138758b42e054ff64d2ed2fc46814037acfa602517abd3b0d4f1e13b8932cc2a8e00d2fcd28a355f09a68ab61c081593b6e08c57b6026aac05179e430b346434206d76f652a174b3b58ff841ecc0ab456d36fa14d5b7537a240c4c892bdffbe0de769ee893d4d40fce063bcc07939c6cf03c4ae866aec22e42009011d35e4204c2cd48a1f9881226bb60a97117ed80915040adfe5be08138bb333d595fd87f242848fee3ff646eadfd3901f3bc793d939b82a2eecaeba584c9d3578d08c2b74f64375468fccaf7fea811097a06b49cf8009d979e676573d2b3a2aaabf8ad4e2a388bf997e1f69f01eee7e25da31a857621f435abf6445e99112a65ff1223c53af75bc946748e1269b460bc6b524a42ccc459af93f1b3939201b67405b67562877bdae3d2015397ecd9619aac2e2797a3981a3b47e385f416420b63dc19b0ed711d1ce4955be4868a1a2de7f520d2e9c43889e8e007ded5c4686cef4b05641848f86cb0a7a7fba932991d31bfe9543405d621a6d9912951290f581680bf5bc55e248b011aa53271e80c0babb2decaaa5ad942aa1a58cb34501f74cec9106e24e85f215022aaf2dce524745387e2414352826a0168fe8e2d32de23668aacb3408b1d5afbaa41f29f8bd7d590013884278eeac13be908c353898d7d973e04dfdf0a8280d3ba6f88bd25e24100418d66445b92e580a645054c7c9e75eec11075b9180bcd8f68549b6c1581239d7caaec4ca85ee6cc952aa596662731ec7cfad30b81e7f56bde6add90548c271a6d72d36590784c511af5eec5c726d5bdada02d19c8b3af7f5e58768085e3e9796ad8081a83c233aabaec0000b8ec674cd9a0e9f2423528a41777e7ebf08b46d1c63a3b2b561edf47a88b1b549578aaa90204f6a908b7d82d42f31c8784e003f699b9765523dace44018b99372d8c82494ecaf7523ca88d5cb6727c8d51204a12d4af0770f9936fcf19500ad6ee51ecc39ba43773044dfe6ccdce6b2d6de572a3933013f8dc10c1bb863eeefda511521df366508c0be55291eaa0f9d06f67c0e33a5258c37c77986e9edc4a3c78c2177b6ea726bf2105b26b8eb80eadde9f7422af016e3c68d51ca1804129916f3a1f60ed21de2a64b19309d55462907e7b8b65e6f906fed6dd17c410864dc2519e61f05c604bfe0a8394f9334e4dc2cfdc3f21634edee7949f2ea8df049a7f71f7457c6014c40018ac71d7f1611b41decb20b008825a6c4dfda77a4d46c15f8c650001d6c006b36eaaec2aeadedf09bac1c9c0e2b113125db8b956634ff92ca32d8bf50fefefc65f5dcef122250f1e35b03191c51b88ebe413a53b4b5dd67c98f39239070550cff49ac5419c07f040b977ca265c91745797b98886efe447b487a8744d52824d3264ef60ca8f08289696ae42d85868daa815d354bd48eff85e033495b6ab596e341db75fcd50e53c72ddbc3f66c8c223acddb42336c0b166f4d2d7c4c20acb1958195c2459291142f5c0ae85e97e37d0444284c1680d777321b7739437e5501e1f4ae7181286beaa05b353dfd0bbd4d577a831679019baa33430a26195dc367d0512f729a490847a65557c4b20a26afc000bce439176396e707a3292a58420301882d9bc2a0ac7bd6db0dec3589f673595790e86e3d2188dc19f60c574b1938d189b8a0a7b9113f453acaeadaf975e33aad43141688fd891cf33eda6f89e4529cb65101d66c89b412e777ac95449b47bc6f9e2122d21cb1c466c255d659826d44885f852819daa3175cf0ff27e2c817ca2f9093f9fe871dac24e14304c18e9603af529aacf40e319d1c9694cd1719e81d131e4e73285864c8570553c9fd31450738c712ba0a7a03a128c1800c68b9d5ee2f3a85b630584492ce666a6eba4981364e84b03d282020719cdd8f2737deb1dda6c4b879c26b06983369bb2a2fcecf87d59fd090b8d5fa6990103a7c9370347c48440147ee2fa0a1b9f4b9e2ac286cc0d050a7776b2827d71e2afa8ecbbcf348ea7b16da420c1cb11bc69a5e48cf7eaa06df73e22bdbdf535fe08de4f30519e490253a6eed88b28dfd833a9f0589bf1764495c36140ae76e834367ad9a67ff86f31863573c6d1bdf394164bceb802cbe13e5b826bc5a80ce2867728318c5955af4b7e5e2490a7d85818b261468135db65b51471a79b20d2c0c064e36d1e56edcf8ba9f00b4de0a9db53d09bfc69d9ecb92ec6e00e7c7544d8b24f80f41d31d6d46f77adc9e2a2f033d849a0357dbe91a5d09c22e5d28bda1a9690055631f455e785200e143f799d0ae7bc5309db4aa70fc862694a6a7157e24495a608b6005cae1ec3fd85cf42b454c6cb256bb4c4c89a24f601da0cfd5f2ad3639c7b64dca2cd34adbac10e323c98b004daa9557a1358e6799751225d2ef17e19cff4554bd984cc0dc513fa9324da0d9f02ff0ff374eac3ee9a4a9130aa003b1a33758e3af76d60b29b7504afd889d49bce08e8f087241eed2739d69cb0c3b478f9bdbfcf56e6370ca8ad3b497ece35126e72a17fc1cc13f04d378b181f2ff36edfc12edfa307a968fa81808f41f54fb53ca56a9b6ebcd4b2151769b1f1cb99441422fab157ad9d0cf73bff4cbb8f2a25c49f743232dbf6cfd9c16b7efbde44cf34bb5ef09a325ab7b54099a19da796b1d4d7b40b6b28ac2f073daf76afebb3a7b470e1e4727860cff464be8bea5b972585503385905191351cf5e61a656905d69d9d4ec9db080409d27971c9a1ce8d0d28110f979d159f9ef078b4062af1f28ece11aa986ae44fc60364dfd28bfd5f3e1a09b9b56eb4227e8502d51c81b656bda790e59005a3d148e1e997b2d5d14733c0b34ed9d46ed73a6ddb1035c0243671fe3237d0a7028145c460959f92c42ab224b0bb7596e67da3cb0a675991bc095b982a05422c4466d750a032820f74a71e2ad6647afb4cd5ad3a95052fd7475570395de6b9c63cab49b38a5b9876af515479377a60d8855be393a98d8abaff17da93e160e620ba51c468df476f8831852fac7567da12ab41fedbc9de845c2b1505c7a3e441f92baa035f18ca20291bd8492721234450e9f89d5331b6e613dd1140837f8d0da93fc18bc3a84c71a1a68bdefe7abb6c909b69970f2bdd1a97d581c05a0be87c30a35d8b6d10ab45d87bd83b7a197bae86c0d7fc852164e59273c918966ece478750a74c414cc3bec0a9f62ad0e34e367b162ae99c9fd8af2fbb1769fc1aa079c232d79e7792e8edfd0246b2e36d5f576311567aeb464fad847d90497f5e534be4cab63b7319dce45be8ee17b8c6ec11850f0dd7243e73452ba8fc359251bc33c3051f35a04a3a97b2fa40599a9f263c451c9cdafc376905c8a558f622630f2a8af9a1cd6ef987e097df0ae1851f949cc8fd050860258186d26e5846819a3320c151b0dbfbc4aeebe3eaf855acbcc07ef16d1b36c7d73b9ee802a91bcff53b27fa36c56e9856b713857ade745f7f75fd7f19c6b68b22544257ddd3e677b41a0e084b1fd71da53a001a2acebe65d23bde158ecaaca51ded00710e35e8a5e2cb611fc90380a8347b0ed8aa4efb929ab53a3130b2db983e7daa79c8a0239862e328f0cb0cbb94aa115fb574b0a4ba7659ceaadd88618a2962846e0d599a5c8857858141425e6642638dc3fb1e726a07d5143c87ff34f63fcf9ffedfb0740a1f459ed8e84cb1fcd9069e227a823466488a14eb9bacf972116b78507f49f04e402c772caaad5df672e0a3ff2e3ad84f18619f121aad9d940ebc4dd9ae3d32bd2d70e8dc2dcccbb027f10ac7e09760db614099821a25e9b56f5b569d79b16fc4199f2fc3bbc6b1ba8bd8b5095f949ea3f3298109afd2bd657c2f1997aebeee5d7d96b5628e36e2420604cb1120e09407f2fca0f0653e7a4096e787e11be9aff98f5c079a9f142f1c0536478dd3e4df34d2b4dc60d3bc5230714e151382c3cfb8dbf534d020827325ae108cdb7e028539be14f2d1e493fd12152c35f1d58316e13571c98b32bcdb6fedd02ce6c31f9e779a98d35b5bfcaddafb3478b58cd727d613f7ee291a36a22b65fa85411502c55d7ab741304f80a7f85220080e62b74146fd3379150f4f9338aa1e3a28424dd30e2663cf2e0650f71b4765061de33b406de538290693aa41f4e1f887d0f06149606441dec29f87f813c2c98af1ad849d6e1f98d8f551ef45efbbfb57b81e99cdeaa8c463fba80cadd5edba36fb60f09cc4c78d250e7c602f50d44861d6df334b82a7bc242359fb5c4adb02804a5fedabf82d382eb61a3478b8016980b4fc94d2138f05129b649eaa16c2aa4543a243395792bcd66c92ddc90735b89e42080b48fc3169c12cc3c0acd2c77beb1eef262b6c0b0677c348b61683cf43438c269ca14a7e38ecbf3cb420f29c7c370b64a5a48f15d5f0f0c61bf2765d80bfd559c5aaa2b0efd28e40d55b548fa0e275e24b5fc26f946fc9ebd72abcccb3890b541f264a4ec44459ec074a0672bfa59a23657dc5cd340b7a5a8f12581010fbaf35def7666a083655010c88f92c369d1216ce84888614c734ebcab3f8f31e3d2d3e8daaf2d1326ecbe8d6f22e4cc21e60617d9bcec01a8dd328774aacb98e3fe3f98c3ebbe1c6845d4682aa7a559c9897e40c35025cebf59e434ee560a78e71c5f362b71a14f649d9761dc1ebae4388b393e364b78f5b3ccb6dcb4035c19406000851d3889850c4b3b211dda22976df236ed0c39aa7b5cfd2720ae51084a6fcd4725d858e2cd70e876a2272c6534b2de93302c0a1382749431085eb11d29e5eeccbe919fb1f0d44b398a2d2f5d61502b568d72735adca62ec1e852ee6ae9107d7b64b2c152e374d10b48e35f977a7424635cc06da96c6497b8136b5603347f08d7ad55c6f787373fc6113f7a852e2abc1f3772973563871b2c0137e7853833a3accdf2504546ff4c594b6f54ae87c1cd54546e4b7491601a979675e56c14050f9ef024ed05513c58ce50ab47e6a5befe730e0fd995907dca1a7741b772b632d09e2db9c405a0468802603c90c01e8b2ac0b82f37eae3bb75532adf0bd6c1391d560d249d93f5aa6cb9d4f48cba823d96fa53cf79c3b97ada9f52feb4f284ff79ad3d5e420ea869cfe93e719ac716a5eb49505c212c6734014d38b2eec75a0ed8540adac662122928d906c6e47b18d191fdca9208892fdc3b6a0303d5fce55ae4680a2bd40d0f399bddce5ec15de65c0e211851e2aa2c6a98f247989dea31f230f293615bfafaa17bfac176c9a0be64f8ab822a23ece949280ce06ff9cf902c32f1854a68314c46c6d5bd12fcda8128b9c39d4ecd2b4bb6118016bd71345a206271ed286d857ae53063846fd8156d795bea19c42996acf50a27e85f239615d963d197b9f5da290c0a2549df196185e605c7cb9a3fa1e11e07e07ef3243cd57e236c3f02d89c658e7c8f3056f864476c58f71681229baf0d243a658d553a8fb54fac932af8f377d608fecb6e52e8355bf36f00c4258f81916c7083b51986af236333b91d245fdddf027702c5d52a936775c8b99c356f1d1ce8f234d7bd6fd3422b8cdb980a06fcc499436b2cf8a6f362a2096c0ddfd3ccbd787371cc5e4c6b19d62cf1ff0ebb29082ac3cc8f87b106d22203b25c8a0d50510e960e0f13fbdaf96bde101b92bf0f4d62f3d275e74892b5195504e616180b23f84e0d01ffbb43e9f8d6a82d710178b0b85a0057e921f2d1030f208cda480ac63907ac02f048df188d24452002dcfa89389efd0f194242a0b7b3282a860809e5818a2d51748f59804b4e9dbce78f0c6a0f42d91ccadf82c6f8bd966f8233bc003d8c8d73e4c352df0e504afe08d4650cebb7bda8cc3a50676a03966e3f486b5511ce77984ebd08ed41bd450ecd43de39238b6c46fc2a60e3dab610c94fe2a82595dbf2b77aa2c87982a81d1f3caacef29e1568e4aaa5ca059b60bb46e7745601d85e5bc4ed5ad471f665adcaf80a1db021c6840005ffa39a5658a4dd2060a11cf9036d794c96f4f2e353f3c7c6f3be10f75fdc294a57493033da0d33d0ab73ba9b849514f959de4e4b8a60b773c0306b25d3307365a14dc70d23caa31846250bc942ee302a891ba6bb13cc94141ad5975c8aa4b9dc11dd6347d4c3895ced26c5d2ac8651414d3a150d80159a331cc57f9ea4a0ff4d8a7342f3c1891b6620c5669755886a104ae1b4dbcd52cf2e46c05a5dd0ba4dde42e064de9fdcc494538fcc75ad173e3b3c8cd82f7c023a89894f7384e23277f9771d8b2ee4a4e61923347f99950d94561b337104c6c77739e1be064929d766d228c08a28cb3636f785be78839c332f5e298ac5f3fecb2fd19e0aa53d2951ce0ab142fdb8fef0f34114a3da7a94924321067721e35889195aec81016c087c10358d5f8a162371a44123c2fc9f1b47aafbe87eac07ae1e0c19240ca80cace7bf9493188e449e4e18c2f0b9d094912282d154c8114f3ed0cac56463544015f288451a1eed9e7ac66e929b60508fc832c84a9b2b080298a2088f9d5039e4faffe65b5c7f2b807c8cf2a1719a670a93ae5af65e906105b78d5c806a565a84d32d69ac2089c87659c2fb7bdd057c9a49479614474ae40df91f98a9de47940a701d8160bc584d72361696d84feada10a52a95f4a891b205304f94a60cc3ae482051cab675058a879662cdb28587ef0a3ab164a07b0ae2d38bf79ba574ea14801d0d3f3555544df504a437a9480d48cc1b457f20b67c6cf815027ea2699ca5a85143f3d42fd57d5e315a5a59387793ee678d50e3110f6237eabfd9f98062a51e0e08f14c25ad9495dcd55fe2e588bf2c1086e05314e4ba1ec41ad2a2b1df75e7d4f55e0326e3110f560875842398b07d425e87c507a075d5d0016b304ba1c82c0d8cc224d3a405a938d5765f523fe6e5bae78a79883b9b0f9bfd209c95c16b4188e2203347f1fa679139b823cabeaa7255f718f84a3a1d3d2bb061148dadb5cb93b02c1c0836a165e869b2290aed9bddc212d6971453d00eab2e67acae4c0402ce4a166dd45f9b746bb5159f65527cbf9214adcdd853939a854334d95e493ad30122f43569a75e3b29c57bad8515bf5bfdd2abc125a1a43b87bcb5a9e68972d5aeeabe50e26830661b0d79157cc4f9f0a34169684e0272b439bfbc36a3c564edb1f836521d3c6d40b3cac1b7c91bbade9518eb138940df5873a55185de23b09f1e6e454a267dad38b26c4555ca46ca07dec63af53b885fcf045946ab768c6769151241766102042b81f5911f3a7e2cad3657b4ccaafdad25e6bb8d7bd6d5a66feab96f4162de24979182337c9e65adbcd9ebfb418b67751ba058e63a7b200c433b845a1582c1f52569cc80c5f279dd87cd466f8c7d9f8e9d87d0c99f2add4431ce049bd18d7767030487e02dfea1b089f1732dc36d9415c709fac2e6f1969888a32fa24789a7e5a45118bf372fb5b00483004ddee5be5d17e7f056100d221cf39d1803f9a092c0f5e694688d1fe11c468e97e51c348af5ce3b7db676a9d289bec98e18367b6ecb4a3c7ac8e16a552502b329b70659ed98d2ec634d7669ddb35c1f9494a3fac0d1be748158fc046d843640499fc5e5b663101b656194a88143450a4ab2d0dbcb1923750c3204fed18a03e893e07dd878c9bce83403a6d2181d9f0d1d083e74cb600bed7f3c12370e14cc6e0092643ad47c420ded9c3d947d9f61fd1a8acd0736dd432bcf994969a6f31b2a940f773762f964fdf1bc3a521c16095187d01a94b580a3510a28a1aec82ad371ffd15e0e59ef8da8d10d08154ee4dbdf31dae1bfe17d41e20bed50718c74f2cd9ff025590b752373f8a3dd33cc31f38afacb8d26c3f3a7919bbc6d30a900321b4d80878aec4fa8619937f8495f7f6930a52d480d302451d5a486edf431bd9d05d4f818fb0acb960d2a17e96db683f5cde9c95d721008e04e94a4511cc07ce74b10244c422f65bdd05f5ae07f58d820a272aded9f66932e2930b4c4f72719910b9e44e2f3558d7fc638425da4603421a6bbbf4c58ac1d97542559aea3bfaa9f5fda5540c669acf52c1a7019071dd2ce7983aad64482259dd3b13f5444d72ddddf13c984580cb02efd34cf72dca1637f629aeb4c147bae6a20ad7070b3891993a30721f49a10a189986632bfa441ce679a5f70cbc26d1d68789ce8638e1ae8d187152fb3e885f6e6f8e224d9b8dca6fc6842a9a6d13f3ffbf8aea92ffb7002fa140cc3c337c2be6c91832a7c5749ecd975ffac92a6aa09234ef482aa689e2ef026895613acedd7480e19e5f8bea19acd24d6c0c6bff0579e2111e079daa0a6f2cfee07444becf946e94bcd864356871cb5d64209cfdd0cff26089398ba6d71cad24c1b605992bb7fa33f0efcca7865717627aaa16a9d804b962ceb64af4ee4465ba79005b6fbb207106a55a87015e8272b4f8869cd6d891b0aa502b44bbfc4dc22e764d7fb81472a78eb92378c9d2c37b57e5b0bd4368f9f83a749a64fb1904496c5941c07b59d437fcc253a5410201d414db030afb7f7a9a0c3c6ddc2f276fdc56a18e9219c58d814eaafaf269940b395981ba87dc99b9fff7bd87ec0e1495f3025a87de2836de7c09ae7742a56f6da2be9df59b85001f9eae1e2b49a706c8f8b1209e225424fdb30a209b7d5fd54d12fa3f79b029b0b01153168190ccad4cdf339eb47fc7b6fd183bda5d24ca7d4817da023443551a729224c65df481aa0611183db2bb9223d04e1817c20135b8293ef3ebfb8077b8210176eb4fff795f050d838fc48c8f9a23a51a776418bc1ef12264ebe8afa6851405c91bd1267082b049157e81f296243983a00785dad3f4153ec03901f962648ac8f4a85bae43f51c88a28d5e4bd264cf7a07c9c8398e2e11d3c12393ac2f92d40c8c7d02eb502fa51736c9ec5570a404aae25c5c3c4db8643d0df076e482d4305c05b09edb7e828a90c4f6fe42073b5811a3866fa4efc576621bd4c8ac644210c4dc67bd602cd3d7e860cc41451d14bb65423879f2586fc4d8995bee5db2fb9a267a7e174ebf15e4323e1513c56e41de7d6eba0f5e26e6478231c6fb767b11056057ff330d28325322c3f34cd618631a3af6deaa51f184a8746f0a5d9d96a6985b08e8982156cf6ab81d658c9fdc6de1c216ca94f7f505792b076871c87f6399015fe27a4bdfbcc1148a165802472cb24d0943287817d9958cf0db57ff376d700bf131f0765a84e3b3a5d631f159d02d63237c59964c1611ea2b924581d31c3efc0ef534e53599dc6d1e9144745b05d702a5a17b1dbdab2189a28f0b6938e91cc8498d68ad51f1d43fc650a364904b4bfd631229fe8d2fe2055e0540a758cab944bf14d6b6a837c23169da4203ffada05012ae720566e6953740e74ef207c9e718889bba7d318f715283c47a374af4d7b5024010c962f9cf853c5017e4c34a2857ef186002fca2973d4f1aa6438330a332859e11ffc21d6a62dfc5201e7af24517ec6b57388480e6937202c3aa263e06620cae9d90f18a22edc0c234876eca03c2bae5cc2cdd0c43790a0328d0db6230552cab5c95784c9cd481686ae4edfee4c5e71560947c917cae7d0d7ad5692702c5871d5187f4aac318c0afcb33a84818efea696d102a566274d727388723275d027226a873ff4523e3798ee7cd20e95788e678580fe358ec780d83fd0d60061dcddeac0143d3d52a31122a4a31c6803dadf844b8dfc6a8f86a9b906467cd165db30ed5b0a1d5403c2e89a20e83fa2084aca65529e5f9ae1fdc6513db1ec2b915b7460c4eb1ad90fd1ec70246e0c1e2f44186d8672821b7fdf2f802cfccd9ee269944b4edc3e721cddae0a1b38e2ef3dd8b3ef846b19c105e843992a5ad91492a0614d9ed76b24bbd44048763fe4d3dac29dc8038c5af8a38eb1c828414b73522551161fb4aaf2bce0867b1c309a7884c7bcd359cdd3a729359aaf5162ed453172575cc61a9e13bc53b940699e8b005d31b7989ef2425fc0a655896c24af9290c62b37596df86c9a987000e77fb7ecdac2850e8bc09b158f0f533d8a03b5557e0e9e61a620a434a63424129e48791d285c035d0b4096b5e2e666e2d26cbc109f452a56f366fa3a68aa7a6089c6a06a83074981db0649a530ac0615dfd606f058c468ac547122ff98498f1b47e83cae59bca51c9c116ce5a75bf058bf6b799d018114e6dc6b63b423b947b1513cae82e7045b69bf1268aa29f6527cbd06a72890caa80bb0b91334bad9681b035da80c279a12980ebf228304c9cad7e9627e81143006822a92af1119916d354653b16815db3f280e3ce27bb470fbda1e6c88c191ce0209e37cdd26273224a87aa14ad6639226486c8176310f71bfe232da2823a9a0bbaf5191f9ddb05adc53ecfff28c9b4fcde50093aad13e9c14612004ebf33516f461694f4131c011c36b02878bc4bf64af25d74b8f9791bdc4d4a82e85293251a320d045c5b00f1db02c6caf43dd191f96f3e6d42347f8d1167d8e3d8946ed16111a256ef4d8b240a31ad1c22f774c9f51a43da3d2d17e4aadbf89338a8bcda8e437bad3f53030a36865b240e665141150e7fe8f6f0a19304d46e1de2019951bce5c464659aa0397bf3a0778071ff84c8ac728e74656322b1ca3e20da866ef111942273368c33ceb1c92aadaf94015aa2327f98477721f56fe530b82310afd8c7bdc094d68d25701af7836044b04c5a8a6c7254655f22d49618e72a2be41aac504c428d140388c8a2e826154a37f6154cb7d7b24fba8aaf16f6e6f4cba95eeb75c698d718c1b1f6c68516315b914da11c6b641390b34e27fc977231490e24af7215cf2d03b56376dccdaf7c2392aea580312c614be191d3a17f5a4d7343556cddf55beffc62a857b44e24d200b7013e4be44f18065de9fdffb8bd9382ce1828df3de3d61e5698233ec609ddc272b9dcb00feef0477803aafee591a259e63270e5e14ff9ae963eda062c41271e7328831426925169fea90f4871f19c83bb824f74ac1526fab247cfa7c2668b671a44c3e56e83ac73564467123f146d5685ba4cddef3eb38e6a86e06a2de6a4257c2fd39f847fbbeb2951d95cd3549c1ced93fa855c6c9f5fe432f69069e452bbc7d933adc55cd8d55442cf89b2dac07c0d64c19f9fe1cf692b19702792a735be2eea171c38ce6034769d6c52d4e94567a8ae49abb41a7b26a15fd8bd79b797671dd0b12933003a020fb80b5cb5cf4f2606814210dc89e2c1d2d55f3e7e463ee85cdd45bc10b1fef1f4bd8c59c7e88094c7f0d11c3268b7f4d877c3af996117c20c00e2ccd989b42eb7922499d67bf075e6258ee4e9f0b6d05178ce8e5f2d6135599b691ea79af69b01f03ae5941e9559d1f5cb518f44655a3746626c8157596db9a03705b05e79c774756c39467ca8434a6e1866ae77aa630c5ea2cad11cfb6c3e0b2384c034cbecf24eeb614dafcd902464e37dbf5e55b3c59e23b5058f7453e830528afbe8faadfffb7287b559640b1adbe6ac74fb95640c9ab3b6bc5dc7a5ad96cbd7adc2e63e36effe30a4da0ee8a76abd048fee51542e7ea699dff7df0dabbab6b647325c2bf6f01c9d05cd4e986c9bb3a806da7523ea544afc603da81c75605550977b3142491b777d19a041cbaa4fbb42b4cafa0a417a864ce5c2bf7b39b9b663b73324d0fdc72ef5a73b6e78f8c3d55efc085f80384da27f4ad07b8046353177114073d0e63cfc82c6e1653a6d3ce249c8100dc082ee43ca7dd0ffb3a9b27ca384bbf0aac96940cdf37eb1614cc8d70d50f262e8dd13edbeaaa081b110ea8422281fbfbc9314c4ca0f86334862400bf665c4faf030219efd6f4f4134d7523430bb4bf0604d31fa45555c0cad26f556cd1e55436732743d1c6c62683c631518aac59fea38f4a7a6e0226873606125410bd5dc1afa181a0cd3cb83bf9f0baf72217a2c678610d2fa3ae750a42ca8450e0e8d0ef8dfc8f842c3ec714ce067930304a6a801fff28a93cb9b91c0551c7bb84e18c849c1584041a94f0d67cbe6d07561cf9176305f669bf737a3c86cac4f95b180380019f12e4757de3feaad00703d651c1c913d43b8c629219dd97549634812823b1d075a0cda37e9ca633a7ee975cf76d99b518f60b847a969f09fad86fad5ab1b2d2384f03a50b2b3408f55aa28c18fb36767319c10f2246d41ff725e33fe5dc7831643f6522badd1326fcea5aa936b3d879cb8be616c9a19c7b91f54c3f5ac6cd758803dcaa1630f576d68170c19143c1448fc0d9f5dfabd927ac5a55f8b270508ef4d23fe60faed3ab536b0c27b1825719c757917b3f06f407b5778e533cfcc6a18cbc1d303f2f3afaee04f0d3feff5a7d3dc14039b72a9840699de134ae145d7f5dac14c962a2267ddefa3c76729d7a780367ff8a61382aafa6900db4c8bec8790148d7c2950a85833839751a06090ff5f5b4baebdd2bedc0693a1f49da53aa783eed53227501acda02da14c666594018d6a603f9f907d92f328fa8060906bb540dd6024189a4bd68d312f598fc4971431084e95fdc0dd2c5baddd9716cf1e16ed87efc6c936da49bbc93b4990f86989f312933c7d677051ec3150e3d42ba91dd6d4bb9654a29a5f80576066606b2d38890a29728a713e9887652dd0dd51391214a820309229a69937f9344346d72d1ccccf4ede5aa29dbebd5a84d797e3f36f46b9cc84512bddae49f55919817d2b51d2ef987213b8db533fd3556a35aea03bebfc685fa78efafb9ba3596cce991a6b365244d615cb8d407ebdfe0616445ea10b9d8e4df6dfc1b0ea3a0ab4dfe719bddf6d241f21c216fa86ec468afac46699cc8e589b139a92297c8258ac227287251416d2fd194e99f91b657c329d3df2195e9db2bc744431271222e7231740dd989edac3a91ab5b20b595f2f06f16dc99ce6a937f0b50909dc8c59afe0630fda100a63f669afed0d5a818a584aeeead95c84e2235e55b2391ef357dbaec20f89ad25435c68d4b4e03f9dde8e68b4e44c6f417b9f804a7e8355de49addf69afe2d84541976c289714bb22f290fe7462317456919297a71221796856bfaeb9069218a9e699aae699b5eb9e24be68c74ba14d3aa9952cebf462ed98a2cd566f9a03929b68c6b6ed703ba30a6e99a97e3fbf2b57933bdd3718b53be39a96bd54c2d29839aeafdcf12b46b442eede05277a539a17f0b84d8f718038bd9ddab1e638a9e1d330694f9a1591d618ad9e994d97242cc5ffaf463f6abab96f83917262d89ff8d8a9cec8f8e199a7827a1694a5d3aede54455b777b561216f587cd239bd46093ef5db4c9ea2f395d240765e03c5b9509413a1ee84c2c98fc46427028c1e41b0623a0fa636bb38a328a9cdce896821e4b2d7b07234c0604e3ec27ead46092e31122025b2f31ab7b1719b9ad9794db39487bed7b80d9f7493324718b27907d9794d7c7e57c29f60351113b52bab0565720e3b81ec771e65f20b67f2763e65233911e7b8a8bda294dd5ddee56d57f56e18bdcbce91c9eb6e5f8c1f37bf8739167d83dcdddddddddddcccccccdcdddddddddddccc3136333333337777777777373773c6ccccccddddddddddcdcdda13b27f6b96dcdd1f12854622296bd4d06cf0e366e68e68aacbef3133ac42323f6666666666e67f1b8b22867514921fa6df7b7ecb1f80adc99c0ed8b258610bed611f1282fde350d062c3a6de6fea71aa2d85bdca533cbc5f414cad1ac05f3f423c85712b504128f59e5330ec1de471aa06f05f2168ad3eb0f75879601a46f20731cebb5f372f21bbbb5bb9a5293377b3a63233338e963191fbcefa7c861c3336813fea4a71666ee64643533df9c3f79eaf73ca0c452fabe6983bf654f5d33e4ca13d2d794682c9bf5af2df134cfee5134ba1a9fad0424ce2a9c3dbd581b635d8a94e8ea099a3213eb505e5c12db9f43b64af889634521efc39a48ed45510a0cc6e6b417d8cd48718fa6a6c5cf239e25296d2362923d1dd4758f2dedded43fc13ab2635ae6ef8dd115e01c39efdf945d805b3189e96ab5bf1bdaa6bb2e62ec8ca2a0fc71e07555f485df7b4380a4d5535b3e235c75573668e6f93b90de8779ab33ee8746d94484a2ead8cd44fd23a530bf5ef6bdb3a93c8ceae777e2673ada33cf6b32aa4fec3570d148a832397bd0ad9de7175fc8f4423918e76afc2bdbd5d4aa5d7f19b84dcfab9fb133526a343850e95d939dd0d5b2c5a68aed1b7d13277bb7491ffc067e4e8999030acdae9c14e2f29fa406ee74ce7266427672f84a0e6f4617a266ec1667019cc4f289b51064be124f8097e829960261887a5300e13d00e14a208baaaebfb63ad9d7bbbf7f32079eeaeeddeeefd4422966ef7c69e2708b9ecaafe465a63b9ce415490ebeee2392257dddd6396dd2c736c2ab1879895e1d9f6879581412060d47f1eecc1d8221c44a250163d980f71e39d3c1ff4783e40e0863dd8ed1cfc300023f5e4a9d5f8bc32e47eb3ba8356793c9ddcbfdb6e0fd9d684e5acddb387310c0c97aa606f6abc41924fadb7e7a41f3d7a60da0641aa3ce2c77e3003028cbe021475836a7143c80c19338f0f4ff63f64badd1e4fa68d74bc47848328c608a3a6651e37c9a3cf12d926d5b67d8800e97f2ea517edd5a3ddb09c42524f9e5ac3056c66c8fdf0aa3b6862d9c6251e62967d70700516fd1d465ae5f14ed3a688cada67daa4df69c87d87bbc1a81d845c2cbe62f3737df8ab09496f3bc1ced44ec35540f4bb55790cd9aa2fdb9de5313c0229c1ba6fa662aa23f71dc35abb1546d0123e5968da2b48bbdaa40fc39103af18579bf817fe2ec79bf2905cd53b6de2ee1c170f7cc226f66dc56376b11cfe37d96374a49c824fc6becb38a60aea4309d30a9f1a874b53d0189a0c2d404f9e829e564b184f8ec9d9511f3b59c77b4721d6aeae5f8c614e430be13235d0d4a513c06ac6d794c824525b4927694d5b7fbbfbb2ddd7d803a9d92f0987def1108d0baba93d8da4b395484f12e999fa1ae6e1ece16af765ef492263e601bd3c4924a6350e6467639533854b5524b7f3428c12a9e588b2cb442a0eb095c3c5a598e3e549227d6a120995bc80e405159fe0772fd88c7230a311337635706ca12817e217120973e3709831e37b8620b7dfbec3c17a418583d5a81caee5643652dccf128d9fc395230a6bacb938588b83b535e63e84a2a7f7fbd0a5f00573f8c48b430b4571395c8e1166fced0364b5d57c338d82100a74c1d7cef76a6315a2991a46da146725cb98c8f7309d65ff48dc0e97e20b315c8aa336c5efcf129984ecb89d199fdbe1d3fbf89c95f89aef596c586e70e8a88fcf7c8f830a8e1d1662f8c4f30d1132623e381595c3a5a6f8ef614b7d78e6fb108dfa6099efe160413114f5822a871266fc8886ecb89c195f736135fb06b2b3b1822bce110697038aa0d78c3972b86cac6674c126c7177d03d9e1907de7c20b02ef6d6407d299f141397cda8fd9c707e1f0c9d3ea3499c913c7132e451c2c2ec5d770b0c07841153ffa74b89af139870b2f2cbaf06a53fced5c78cd98c335e3376afbc89a71e370b0da14ff0cd9e160cdf8826ac65797c87540002b16a2782945231d54c81a335448500eba909a1456a4a7c915f979a211417ec0d8ac90a032361df9a6aeb6a062842da6c085b43175d542d284d6115a1649386945e1ba118d7448d11755cc4e7e1730f8a2660b420260eaea8b1fb8907fc6b644baa0c52603d9c2139f17c81a4684e1450cb62978a1828f0a6468eaaa0b2a4c903a5de47431031bd3a7aeba80c14a53170d087bf38e6cdfff547cf2ef9db98d9af411eb46c866d33281c118a51c8d605a54f8a493445c19c10a9ffa77f8e49e3d59000c0c15b25b958e87e46cdad7f4c94827dadddddddddddd0d499a4ab1b04d4b2bd5b4ffa317352d8c9af6bb1e515d4bbb9a1d0826fb746e48115e02a14e4873549bc60b92a0d9802e0e9776557c6ae9d7c9392f20c86e551b88915757a51be8bd913a559bc29e871524e0e16b4ab5a916e55a6c083d61052585bd0def2167640921d87b4dd9808120882a9248615c8b7241e0632f751723ad4c9bb6692408b026323486ec5635f7bb179502858b092732e0628c566a5f3627a5ce6b82648f38a334c53ab82485fc4d04c4c6a0f3fd3b329de42ad90f03c9ff48b6551571695b63965cea9d1e1ac87e4814e544d0cceeef1e0c66bfa7a12887ddfb61f6dba1f3294c39b5675495d81c1bafe1d23683966be1d7b9df5b10d26ddc89ec3cc73bca114ca332eedbd41f63841cc6b5fb5299bdbbbe33dba76048a4ae68a0e13b1a60487c6a1142fabf1619b9047bd9288c8361981c4fc81ccf6994f49c19de8ccac373667bb3644443f23bb7d13487b450d78e5790fd9d336fcb22b46e926a01186bc1b0c7ccccccccccfc981db0bc04fe370a72b28b407ea38156802f9ac4f0c6a58d5c92c15b31c40e66a9b4e38995b94f810c30eac1f0244ac4e28526c9b68680c4ec34cadce7edd20560eeef076063d0b9bfb9887494b6b453e78ad6af2ebbcc8d44f26bbccca0212d0217660e2e4cd767f302d9af7ee9d4ba6743265c6278c3419b2ce4c6b415b4aec26a65630304a3a1097515aa9093b3b3d3559061ea47066c089aa648e826ba8956d24ec4cc55d036b21375139e8256e229f0143411fd5acbb44cabaa2abbd8b5bbbb4cc334cdccfde97e1ffff8cefb841c08d933706f075a2b91fb5aa8934816ed676391cfb0f3eda0a94b07d299bd1a268361d9bb0c9f5ae02b3e3df1225c099f711bbf712cb25622fd35f68f21fb8e314c6b9b66629365d8679a125c6272339bc96ced91544bfeaef2388a51ab6994473972ad46869e2ec302d9b94a89dc64dc8f78f65e86412049a46b4e2487385979c4f768c449ab3c625c5671a921d77e844bfdee3ea3bdc540569cc4ca83bf3b2373bf359bd9dfc19cd90f3d9c56d3a6eeb49a5506adf2e0e7fde6d576ce9778bedf8ff06939170f480732c8082d7b75e974c84c7fad1bad5695f311e1f0f36f2f3e612217897fc01b03eff0820fc32fd8d969933fdcd9e9b129911d8cc2257f4dff5845765a94a9b9b8f401f28210673a8cc225872e2e895c992823b504790d6b1704ad1cd5512b2cc73ab9009f58cf07b0a969d87ac41ea432730f9e3ff8d4a1c035e7d576508f1f3d7ef069b91d5c6a54e446ee2245324528c29a5d69c624398c1a8a0af40e2932977361297feb2ad817dbee7458df2531f6dcda89079c79f62a334839551e2eab3a98a801466c318c315e187f17c320a03873b908a7dc7deff9ee33917dcff73ddf5d666e48bff7b825d1238644032c102be024c6e54ba51d14c8000c3b58bcb05a51b0e725e053915297bad4a52e75e9a54b6d6a154810e4e055c4f7606066ee3161404e90104687c2218450a76e0b1affa57cf5b115419bc011d49f3be6d84b800f6816a02e0a6040d5820cb4a8bc7427e648102171249545c3723fb8d40fb91e30bc0b0d9f0181f7bac7ece12e90dc92c8518b18637cf16ddae4cfb61c60e61901cc3e218031c68c04733d96c0b32c6248b020682e8004c71cc32006ddff87d7207de1e47f5a80d8fefcf6fb1de0dccb48d0df23e0666d107cc80de97902f62273f763747f6568ea12b3d8dddddddddddd5924c9ada99821889318172e3df8fedc1d7b6f3f108039f3079b3a25dff780405fb9b25ae22fed8b892192839c937fb500be0ce8217dc5ca7c3173485fb9321f47e47d0e71f28f80316e48cfc769c9b9d20e1d5c14f91b435397e56167b688652d9445626596c9deec6a9f60cf655aa06d7123451d4959fa8cd4e3e585069836f59328d04b82787c90ddaa8a70a95190db404e0e3764e0e5fc90a0b2dd985f660fc3f1798688f270cea6f7fb51326a5319a76c8290d4ff487195412cda6db20cfecc3543f164582a501096b3e0b681a7dd0a56f762a673695f11ac27d3c8e20a2bb385a9595cf19aa49d9e18ec0be9237985746e09f6241b4257ae5cb942ea714652f01e7e91f8906bb1017ef619672472dc122d298c14ba72e5ca95547f6ad0d4e3629bb6f9a599cfd0d4a5d368a6bfa692be5a6ec54d6407573ce10ab21ad57268039938f618f62f8dea87e11642ee63015970c525e7d9c1d5a4d942a55aa2bea9e50c8c228c2a88610855c8e006082874a0808026555c901b7169a368a46333d3d455142e2668ea4a0c5653f1027db87145ab0657e8200d39922229fb07ed8a2c76684225e7b968a4439362467663f697a4e8ccfe1d7c822fa4a9ab2836f3337525250c2631835867113acbc55e4942deed4c40fd89dede5be6518ddffdba390fa9ebe1d2fdcfbbdd03b3e62166aad0f33685dd28bebfb7f57bcc3f1b2686dcc75e738f6d6a8dd4ae36b5386a12f220f73de424af99af5e2c7322f75b555bd6e0d0d8cc13c4fa8ebcbb3b32f476ef4e81dcf76eedd6e71ce69cb7773b166184118886dcee1d1b4322f7b77dd80f723f2691dbeade2096e6792c8e4655b68fbf4cc3a800218771ce258cd32aa0509590ac226bbcb75af21328ac6163ddd76d5cc16db0b8bb3b8bba0f7cea90b481a3abd860b9c182bff738dee12ada0d1656e507886f0f0e88ce556aacfa0a6d0526ecd245c660cc3c9e7f70346aad9f63517e1352f3488053918b3bc82d6118863dff802268db1036594bef4d30fb771d6e359e17f166a98fa7d5d85a733fdd9a31725ea33c5e3b21bb1d93df86bf67636b955c50a8c68daeb1b58dd47ece359c86dc7fe1d37b9aa85fb69b90dd0edd99fbd9de9954bc861fe735d80ae4fe0ea622334fa4914068ead2754b3525678ccaa96ef1cd4b291ae99011c3074d10c3063f104308ed8964410a9f18c81b49f840919f2ec808831585309c20220c239e8431c40ac0b072058c299f27c0c05181f1c50cc070f2b142fad41518562001c60d1836aed58481b62124b28333fa70a667e6f2421b3ebdb90f991c99fbf005a7306a7d805340b13217ce3c990b6f5ad00571e67e07577319cef0a983357369f8d4412594e0530d9fba66c122f814c301660791f02d660775f8207180ad50937628c5dc6e81d41517349c16b3a48516eff2eef6b6bbabbbabbbda6e0f7497b7b82991da77bbbbabbbabab6dace15274b50bd62cd74125668cedd238100ee8057ab50b870a87cac64dbb40afb57163e34693b171a3c9f0e7e32b7e3850bb40af76b5d0d28e68eaa2d1d0f0695ba3691c251a125a8d46c325ff4ea3594ea3d996b9db42c84eae629b7825598662f8c92b49531d63848d034d5d3a1b2f25fbad44f67e2791ad925d48a309c5f0c9ff71447cb6a03ec685ec4231631009c56c0c3bf93b0707937fb1500c29a40a21919d2623c3a716e498beada9d184681ad522645318d7f27448d5c89f5d2866882b642687785071a1982864d7b30be58c46365e2f9a6fcaa7ceb5b9fb7577ab2a8c43d4d043066316a13b7cfbfef53e182304c2a9803dc7489b7a5e25f51c8875027333a1c12d915c1405b3638e40ea5879961b3eec6ff886fe2408a4bf5882f856bd514f216c3d29f49753ea6a146c14f6af055dac3631466a9d0859322c8732c0d93aca83bfa180bd1f7c755a070d095fcdbd03ada320f79fbbba2b1277d57f8ebdd7efbdf7de6b774223cda0b35fca435fd3c7be7beff779c387bd32f0763b6fd476ef2935f480350b0bf77682f3697797480fde03dc66356b04cd8a8f6b1694592f64785f507a36119fafad735e5ce27f0bfb060db9cfd3997b8b8dc32838059b18de28808765d664bc084d5da4100329d126a7b5046dfbd575e6a220cdaa8c9cb9f1bd62b0183398981d0c733b1d735b25c0ef0cd9849f59dcf57dd87befbdc73d00dce316dea9aafa7bef45e5d363cca7bbfbc33e401ed7dda0aa9ec39bfacfdbbddf1534dfb6b820985357f775a7bed1640d487f6c0526088107123485154ad040ca4c1a52547214775063c61b9f20ae68544c1240094fb494c0c3e47fa31a3f14e12c971c21093f302667ce24cd1494237e60032abc6085032b3c4794f0a000937ff50c293df87084131c22a4baf809a2069b22c305f385c959132fff2ea51d52904045896401880f1192c5881ea488893685dc585f4809e508e9c14122e1d4d5ab09b3fb23bcaa7c9420a30797d28e776922372fb61f88918424c490c21812c7d455941f9210a50673f4bc45231d2f6de27f7963c8229af3033176522850d6922352482dd101186401ea8379bfcbe1cd1ea41011647ff6dd0b1c92805fd292ed9db444fbf87918eea191549fda5ef3bce04099ba3a634a6bea0a27059386466dcf1fe471a4eee70da1078540da923cff0283277bfecc90fd90045cb9726566ef1f20d98783814d1f92a6626c2fe4cf206a302300cf9890eb417ac1919db228d05ae3f032318d6bd9e65af6e3dc07a9263f4c644918d8c4bfa4172a5e94cc9eb283b9fb3a012b24e0bcb84c149b2836a4d969ab7b2b224cd97fde3b7ab43c0c0998dd8fb95ca72e979fbc834ffb1e18bc2687b4a86151824f51d38ad0f40788fbbfe7f1bc973d43ae03ef756a35482a85184889f9cc906386584ba4b63cdf69cbf31d4b0dcbc3b087f3cf70e85707fc77c225a0af416216481049089bf86390d61032b337880ca41046f92a8846795cc8b5e2108e9342a450cb27ff67c8eefc0103c3a5dd7a6f68da7683249fa549dbec1dcd0a7f8078b4b87984ac4ca32412260c452592a5fd6301c94de40c4b0d8b0dcb0dcb147cca9e7fb59d36f18758da4e88e599425f5e763013e9d1f9e9e0ec422c162726933a16b4b7667132e40f2e75a11b246981d0b3702d428a6c0cac44b14ab1bc0e2918f6d0800555ce0e0b8b8dfaf03c3f0b133e31093473a86488e5f170120bd9c91bef216d7366f25f21478d123dffaf422c298a339e8f9e7f69940888a7156782b489bfc5f3f27548bd2784e5e56bad4476219647aba2b34ab1bcb69f19d8c3d590a5422cef817cef3bfe39a290efdd5d44721bbfe152c3300b49beb3d4742c371d0b322c2419045e91ddcb0f9846d9787eed07979889e4d9bd686a3fd86bef2d90d6e467855a8dd2147f28146572177a916218c2132bf87800b3902c2c241662dae4386e8870dc10f1e049e3f895e3b821da27bcc2824b2c010b845e722d42e4b33c0b572486213cb1d21808d2bfd35688c56a93139267a72d96b65888e1126b8a3f423ca91a2c356d8a3bc8ce59568dbaf1dc45e9abdf69d40d8e4514a3b6c3c2693b939fa5903a3b969ab8da207f1692a624a90649dbf4586a623c29961b1ca9a91049532092a69aa5596a586a72bc36def102229ef95cb1dfb347c852a38c64dfa3519b32b28490ecfb8dc08fdfbd4cae453d2dcab5d4807d7c1bde93ea7704d9c5d91f096c0a7ef336a8453f879d2ddb0b819ffde77746528bbe9125b437923d7c234b7c3821fef18dc0cfbe492dcab56c9c90ec21d7a252e384c4f737e25c8b72cf25cf7b560ad9a2b5685c4b0dd9c3f846fcb3b7211a69fdeea7c7f39ed746b9783a0952840b21435e21124208211108218431c2ccb32a1eb123b2a3f6fac6ccecb35720fbb12451677b11b7a83db8d469942ab71f5cc32772f42e2580bf47489d0e531fa687401d747049477cd2f7efd7c1a7f7df580c641747ca386cf37153b4c71362cfb108238c1ea1c32c83915b2d3d0cc31cc3308e08c61806318f8761191b6f1be1bb4faac9512335b996fc3b97f91869d392ff23452d69c93b1ce6ee2e37a4c8648edb1219185e1462f00125e041c80a279bd9a8a48d973535756a4600008080024315000020140e088562b14016c7c2bc0714800d729a427c5a9989635990a33888a29031c410020801061802c4989a99b941000a3ce0ca3d44e60a2ff3247324dc8aa53a2b07047a7195f73b599fa5a2f8405028674a039db61451bccf3ce6f61f81178148c012aaaa35e5779ecc4d9a72fce138f0422cd8157dd1b596f59779d894cb873b97126e0b8bb94133129df468f500c2b05514a826f69463a0f1ac577750a51869caec928b239569a3880d491a21a9d82e3322ee9ebe86894ea7357d0d5a5aa5e9335c235242126e6f0378e9a55f2bcda2cabb88a1cccbb5523666793ab6843ddfbb3dfc6b1c4b3a82d708d32160833cead2e120271f9d52ace0f01fdc7dd1138fc76cdd4aa0a63a1dce49bd8d69fa37da231c705eeff1d3f7233510988168d4433ac2b9c8127410a5fea6f15ad33d5e87338d1a0d2310c3305aa8ee1a05dc78fced106d937cbcd16cdaf4836fce552b6f0b834c4474e96584d81ab500f7ea5d1794fff02f715a8587922bf9b9925d3d28e05c248ae347766e214b1193365b9d9ae3880f87e6498bab61d101c6dfdafdb121cf2a282f133b775ab9a49b476fc83664fda6ae19c5a6d11082a2c30c8745c5ec85f1a30c0059a9d803b81d2e7ab070418978037b761215a40c338688b1db267324e08ea8d3a66210a64308d0e1124f0359cb4a7e14f6d43612090c027ff87d6599030e7d8c5f6d7f749308b772a99470946a253e5e19d21c13a6f5deba874267405d22a4b58a9298b9e848f643fe1b29b473529c9f5ab3fa4130e4e9d97b999641235a71f014edfd5edbc9797ba69b41d1b6a6ceae72dc254d1b39e3034745621670d4d9a49620e2fd5ba67482228a194be26f4b12930dca56bb5b5bcc5b75a87699b97074f13d1542485d775f73939086430c6f71d14013e7fe549ec814ef86435c9b38845f827066bfc7ade6bb4fe2fc10a8df12b95ab90b0bed4c50c2c78f98f41cd159878cd5033868b9e45b647483fd994e0b368a8c20f9f6cde729a8c5c9e3c79651569f91b653d2f43c13dab8ed84936c004ac62f0ada007a1705dceefb5c7e5d4a98337299f8b7b047ab72ff61e78cdfa4aa612cebbc49ded70996b99d00d5eb9a13727d1d2f3d8b36fc2d9f7087905843eccdd02e183c616bb3204d8dff41e8115b60752a84af9c5bd262b729755365d4d9d774e285c8c6f9949a17dbf696ac139710ebdebdf050c78cdd48894bc3e085bc4958e2e81057cafbbf602b5900bfd61bb3663bbc34e8f3b5f42721c8a06225440f43ac439eb5326135c7c19fc18a18361e90dfcbdd189cbe9b907faf9b5a3738027bd58d53688886ad963a456dc943e183995eff65b93ccd6643d722d4cb6862c3242912dcdd973dec10329a5ff352844acf1b4cd4a46fd65388b429d00293484db6f190163d61584178a1acdf21492b36ed1b11f03686b530d3b4936d53474a929f914c47ad7e3dbbad07bbd443718c30ac9c46eaef8b5ae987c277c0951e535ad78914149da7a66e6286d89eac9962ff9d04d6578c92f5658458f2f2e3f4a30ae08161a87b08fce4cc8a3a119c99026da6e0c2c7265075f79e3c40b2412c1989547eba4c997b84643748ab633864a54c8170b642aba3e844cb0324d1bd0e96075b49697d463bced406e74e9b6c9c69381bf3f019858aa542c0128039e4c3eab90065b6c3c82f1a68622109669fb04e63fb2695e7e18137e718eac61ed93a1c2ca68b4361fb824fe34b46bd894024943f2940130270ee282e391c080417e4ceb072cc3e0d10b45e2eff4cf55eeb7f935efec1409b119f60e3a5870cc71f9fd6a2385c853d9c1b59e95bd241a59b033cb6e9b08a0d7ed34e18e46071b715ccf076aa497fc14e22e9edb367821a39c37adf9584a28d8514b03e255c0f1bfab3d3b74b3da9e83ad8daacf090378e77bff1cdcfe7f472047f954c88d4d43b4b09e40dd3ccfd3387bcaff13637ca2fc9c7a761c0179f7d12982dd3aa34102d552e00c4c0a4f826cc7a766797bd8c4acc150ce8b5916f7f1a9e3e232c3eeaaa678b6a45d60a4844c36d148c443cbaefa44b97f4aaf47b9f5f0622780ebaf81b5531ee5739732dd835ec17c26d92ac3685b060958f0995ef5d61734a2dcde00b675db221ef3fa8221c60e20da417b662c9cffc61d217923c59c588f7a705ee28a24791f0898e32da5d50f97c17931b86673f2a06f2888efc1fcffc473ab8498a2299d99ce04d3196a7039a1be7a2b9cb8763683fc54d073ba28aa4b41542e4de1474a0e7dce4cd1fc05c869dbc708e19846eb509077afe5f70d90399fa2f2e6ec26a358c1b6acffc90839e25ea46b772312b14a91e03b7ef7d5004ee701fa6784cd0ddb511fe6e5c4eb21836ea3d8500f5e7bb3f53e49ef311891b21b6216dad09e84e95e6876de86932ff2d62feec501db2e2dba6b7b3540e7f9629940880e1a3ca3617e3191128b58815e809d77c511c0661f3d3bf26395a347ccfb4533a5a4588dda86f4fd46cf36b09e66960fa99c3a4af3151d3d8d13abc66d5475f42a880512deba4ac9031f3776488650c8c8dfed0108179a9211d6ab388501699d12d4505babd032cdcc36a01c1c42f1540a263a37f19f5d3d0d57cf954159cd7d1f6e11cdf8c6912bbd223f3b3a14ea603a2c19521d81eb8650ba0186fa3da63b23bcc9d96a8bddb05ebf241322f83c73cc952051fcf96ddf09dcf87fdaf56573ee77b0a8d19221195d54e6e0677d01c854814cd77f8a83921e0f13fda2b744c2cd90ae201a581c141be40e519e6c0a3d15671955687750900c8c4ef257f483249240bed162bc09688847bde8201c292d7e749fafa983833e907e2885356cd7eb5ac0dc48fe3c04faf19054295374f745c4c3c686ab89ccaf4ccad3977099e068ef73c611c9d2f413145a3db40cad1210bc00346df271232802c381d0e00dc0bae0c8bb9efd337dec42da95aa8449b34321c32e3244c26746b85c46e5782c0add880823cddd052c888035f5d608d38e0d202d7f535e05406cfa0c27f1a280b8338a89eaa6b028dca0f02992e5a16ba17704212db1bfb650fac8b5db4e5c3e18610cf95f396dcfa84ceb755ac796de6bc363351ac603104d52b5019b26897030687afd2cae21a184915c65ff1e4cd04ed95565a40b26af809c73776390b7addbdc9c4f73bcd769e6f39d98060a652769d09a83e5be11d6d95f475a3e42be8e2e2583584713713239a9f63cc041f34584d4963eb813b5bfdbb9cdef6b031939b27d6aa0d48b10fd4883a7bf03ecec92ac34d0fac2aaaa20cd4254d6113665e91b287148e081306a44143100385fc271f04e82596bb22eae3b1d02c8c9176517e27dff78b410688be283a4d19098d1511649428b2a89274996cb380ae7b4c637b279ca67d22574cc865efedc66b6ae93a188e2552ad545b726b14104ef956eb6b6629a6de22f897eb85406964465bb13d343fff241075a7b556d1e89e151f7378ab7060dab374d5a8250353da8844b4354dcb51f232be6e68f19a2131e0c70ba2d71bd02563bc1b6e11724a1d911dd2726d922121bb023914bd293c6d8f1c84cdec10d212d57104928ab43fa28ae620f740ac884b47adcd63feed0ce76fda6d1dfb83411dabbce30a70113a48462e4efad50305574da86399c5d5576fb2e9e33d6616e324b1bf2c283741bc6347bc27d940a05c989045f1e3ce3ef1cc7037215372e0eac6978c99411db7d4763b1ff741a29e76a1c3e8cc00086a74094837932f4da44f85cce846f21d18e034855fd7361f3b79812b26323f7cfae2389d83b77b4ac6666dac89c7d756cd22d1b0245e82e68c254dcac8b96dbc0b5d9458c59f9c8dacc8be2d81b84a6e33ab38ab05b2069002772169698d436fb196d97ed4d8e85dead59d38a237ec4e4200a27d75749ee83613129a8360df778c0c3e868fbf858ef356e6bd8e09cb83c10eecee8668b0f368c050995028d9bd3c55d167432963ae049488d609ad4f47ecc5301f6e923da8c79f95c931593d11540a873718332614ab40e1aa80b6a2852f8820cda03ceb827d2211cab3c2e97e1da33cebbc1127324ae2cf0fb2c8962ac04c4248eb56dcb7e09dd2d109316f35dd1afd27f48772a5266a89eb9d2899531ceabc2c5caeecb900c59903e7176071d5d5d9a826dbd2e05e2ad521590d08ed9de9539fe8c89c1af145425cfd9dd011bc9e2992485d8bc95cc5cf6fb8c760a87a69a490cd8738699ce84ef4c4f070a6e7e6ab1983d044732dd15a60aa5d8e01984f953f82b8982d9a1fab6065210efceb692e5664eb07be3cefceeb4bea5c21f479c2acb6ad4178f63a6837804d52e5331b5c331f4c53a287cd29c5b2e0b8a554bacea9dcc1fc15d2d5ba597a9021eaae342cd17434b1b88cbc558921de2844c176b89167a43558cc005b0e7cd586cd71549818e739e389bc9b36559cb1524fbf6e0c38f77766abc9378eb28c72ba8efc1be55ad026f0f999a6c4b6869430a5f82ad24642f0ccf01d099ffc474d49b1d7d04625e49943cc2a3b5263a8d6a04630331c392b88fb912ee2142a9293871248548761a7f39d3bef5789ca13983c89031db9ae4d25a97d8ccf093d7d3a3d8aeca7427712b7679a920f76425f2fc61a218c1a8c56730bed31d7a2aa95d3f54e047c1309a0b630b5564444f6df4773c3077f26e41ec2fc4b449b5d0208690b2ea62ed359508a47c139eb50522bc5086b41417e8d92d07ea991f0ccd1157c988437f0cbff262238b9b42302e417457e08b7546eb673e6bb1e05cbea084b064e67234bb47f22d527699865afc8ea5ccc3045ad8619e54d9115f68fd9ef20f47a036f93980cb99843f89382c1e23610d2dd9bfd5d8d961088cc10e6727ed846d0e7473428bb715d943831ea6369e80c3a15607917b4fe8437c12c3603a92ae7bc48f9feb880d893227d82c2c3a2b266705f1ce67207f0441adc8a1ac8bf85e907043f5a2c06bc3c12d7e7bbfd4adc7f676512c50f343a1eb3a4b62d5ff8db2ec66af091bc6fe7be00766b2a65f56629a9721fd221f4e6c1ec228c73a902f0080897d6895b01804590c690ccf839d9c04f8688bf40f95bede821040e29896b33f99851665af23c3cd7f6d6020b23694d0649470b39862270cd95514b70571466fd6c71f500f52dae41d98a9bbc86437d2a50f52e01b1e2c271bbb860ae3854828892ca3630cf4eeb570a8711a7448e7c6cc479c2a9dcaa9b15f77ffef1a7db23a62fb8d495615285e5df91e0a7433ed0097e43f3f52a70e84a14a06da07512272a06ef83690f5c01634a6148f370bcb7f713bec4fb75ebd32d3b383fa8f9e78a5ee6a8c01925d920e8cf4005ab487e4a13ba51c8ad5520bd3009e63807df92468b14ca9f3dcfbdca27970989d37c932254137d6e4de2cf2ec8bf1bbfe5479a294f106f9b519c1ec0879cd113a82ff890b5717c1a73e198a52afdff733a350aa2fe91d297c9a5b292d2039dff8b3e400a65bdd47f309bd38e20c6c133fa3cd983672aa650ea775df9049da1334bc207c96d22c11992b5956f356d68d26336a38146fac4e092e649748ed101b9ffe1711ffedb529d2a257812a24506b9fc0d482086fb38ec58c46d9ce259f043c2c02de2fc9fcc17076471be5d22a80936f45846bdbfac2782fdff9e9b11903e16584ca4b43639d753177d4edc68a7ffbc8108836991b0cc3964926940b1e8e65479723f341adc7a459a68e19581b1b5bbc6c87ed5cce0360d8efe0b08946a6524eefb60e089e8a6dc4f98463add1fce6257d215a0dd390dc5fbb39a3d3bacce155f3c36ac8aca93b74d59bd2a1cd3a1bd41d849bdf8ada49b3c415bb6e55280fc1a9b80009b060f7ebeadab97b265399302781e63216462eb38d7c7c3b2387309576cb9ec04ebbca02439f4f7377c6970727bd8fa6b568827dacc9d42247f9fdaea91ed9cccadc83d89a0b37b3c8cd3ca565e37f58999b0c5687bcdc9df206b37c9790a003ecedf5170a821265133a52a421c6a72730db29dd31823cfd4e1c7a76fbab1a991eb221d0932b141b3283b0cc77a3fddc94b062f5afea0f81b348f9fcc768f0e08df63219f10d56608b37ff0b127b5b281a6669f453b736025d0c02bf27e8a7dbae61f2ece507c864751ecbb41843c84f72c32b337e499b29dcbce61f451da0566aea6ca1e097d766e1e9df9cbe6b5bdd1feba6e07ac6fb4d07c239b60d94eb2b83d2585e3a5d9b23123f5606a64d3eb0a66c09bffdb4fcb3ae75af60122c954327b853e30d6b10964c03cc8b0b718a390d43c0fcefdf66c9eca22f2ee78230e94ff1e666fa54896caba91debd539edc2abc1e386f88b477992391d53977fc1b3bf3c626f55bad045040fff63d6c42cc4fd4fc9eeb07f8cf1bfddc17da6ac94d60dee0d51e072ba7144426f75cc824a9b32f93f53846562f19ae97294ac192f17df9b237da2d8deb7bcbaea01cb370a620db0a9f6f2afc0a445f003a7c35d94c0d700f524e12641662597fb7299c98838e2ec0b102db1c9a2745723ffcc3ffb462a9089741f7de30ec1935ea37eba55e7f4b50a14cdc71a8a5b82b1d56cbc5b369e3a228ed5172e4fd1a42e502c55432c0de8ded718b08d85323866e92027b9e80434bfd6897b6fb815211046ddedc947cb1a2b44ee42a622670b6656b5021fa63e3283e241b021c2da2fc312440770bfd425074eb672244e095c41f2a81291e07e4f71b08af5203821c6c09c76b779c7fcef137dc622fa4d7d65777d3d1161874ed1df01ec402c4c4bc1e8cafc724deaba37f801d665df00750ed4f6874ee958e5d7d8d07b4584ddb6009efeb4f706a84bebc8e9174e6fde770c7cc327ff70ac627ed17ccf8f52cf6ab047462136a83c76c749235f4bf8dec93387164a2ff3460909b907ced33811c10c7452d38569b7361340ec31db62842bb8300316c2367f4b2609324b5b50860ab8c5ea11e193bd1cc672a81c38928e674103a8400987ac049a027f4a16ae2afc653e64953f06afb82af059d6d975d521bcaec39c2c745d24b8cd9f7c28a0b4c2df43ecf6b894b1b50c6c5d1c03f9c29626f102733dd39c307af2193054b695bd34a629b816fdab92e38c41d6edd18703d98c3b8b004a4db31ae458797188dd61e194d2da16147ebfd8f58721f6fe36c30fb4233a7aaa41466210452b8d2e4e474eb9086ac3598d2833d193b8aaf0d51bdeba2bd4d8a3690d71f52c9c1651b9ad51f5116c6fe882e6a94af3708e4ef59c7529d9344152d68d11ba3e4735c5eee60649c545e89535c93909a96935f68251990c8a1b04695371902ff7c8ca4b18c7de9fa114b4b8c92b9368c3b47ee5d24c54614e8d493b3257fe7108d71aa858622990318a041be0aa04ef510fa51632425656b98626d7fe881ad6fa40337c2c611aec740c6f7d6aa2cf7d7db24447914a4902c3e460e2f06d95bdf1a83fe17c2ddfbd3ab3e6e6a65bb790770e6b19a08463f14a4a952a43f482ec4ac532c1ac08c5047906fa3bcda628e3ff30df9fae77017a41a50fabe553d811f1abb58b1fbe8bfc74537239b41373ba08c16842adc2aaf8a2869a2dc1b15da90e12ee13eadc215c53d502b1717934997ff02940609e535d3decfbea9803a848e74094548d516adbf1d582eb8cce5e10892820a14b7e4064d12ef36899df91004f2ef75ba3c99458483e81aaf39d33f5a8194d32ebbc06110b633337d2f61938cb7d81105434a59f0ad07e644585fc28e88d4a0ef1d04079e471e830137c0405f1a6de5e2c26443c410b903650c4cbbc0ff5312b35d2b0959737d25deced6cea56519d7228ff8badbeb30fd953a0a6ddcfc1e6c225c802010683438e907411441108107b7b306b0c4cc835d0d4a81e113dc52483281f9c415057d09b432f86710f339bd011240f2abbc988ab77dfa09f34c7e171f8a8f02992fdacf784d74757eff223fbf8c1068de5101abbdde4c08a2fff45dae86e9e5d94ad6927df45febb9667bfbd00246457900a0f347a2ff44abffb9e829ee868ea48e2bd532f0850c853cf3325d44c669ea51d3d9d45e0dade4d57fd73ed8fc1e11f0e52b392c9beec9ee54fe156af99c8a4158062590401f83e82d5ef849fc26ad4aa5864856aaa194f8494e83caff5075636a99ca33614408f52d26d1077b4efa17fa57776b5811362aa22ca5ace74efd770cab24dfd0ec6a65c5db214237e9c774684afd37c9b028c7d15e4e347e73e5e446e9c1b983a8bdefdedcb023e198d883492740e8d19b95b7c3e2ab731e367a8e509301f81e7c1157d959efe26a28b343ab1058e4f96a69f8cd0e2590eb075970ec514005f1cd9bbe7cce4083ed89d311f6df0628969d02f902679994a0848d356dbee78b8dde70725950f0db0bebe75f2c5bda692607871fb4666a1a24e4341ff03d048b03f082c9557bdd2f8de213b70987055a7b74035b1bd1da00c6d9069a15f509b47b0e96a0b0d14816b332c1d2f269cc5f5dd8cf32c3dda4f3eec5a7f728e8bf85d405aab9b17299520213948b969cc2fd30a9cc1e671bdadfd41b33a18985d707aed44a6a0226fd41aaad8fb671ba3870a746f4b0c26b7f0e9ac5a5a017870d8b4db3391ec404a1b71306209f275935c80c1d19fa11860fd24effbe123b5e11c920df09d6c3c60d5dd9dc4b0d91112cb4accbae8cc97d57740709fad3bcb0c44d42a5df6e3d6bde768b890680cb44f95bc151c5ca7e700a3718f68b95fa36ae7b94a3a42d7afb0d66f2ccc74709ac9319473906984640d1a162a5375e06eb20317009209ca965272e4cefac00564a6a26377e963030f06361c565e7d38b5e4458fc95d466d01148d514c624200bbddb554fad7fb2c375f0268291895069528a5eac6319d3be4fae22a04961f47b17dbcde8b97ccf7afba889bc48672283b1879406635f98a99217c0e3f2cfccdd620d7451d0d73b33f9d6c878829072b5a5bc7c84ca9adcc44a1841984831c2295fbb4a0eaa6421ab9db8ae2604dd8bc54e6044acdbe6bb35e11a1c30ab83994400072b55ef16146fc0bafb789b465fe5c2797cd9547dae24c710e97120fc1e9bbb7f8191ee5edf0c5853a987aa8b0fdd1a504795746057c017807122cbf11bd7a2b6113f81b40efd070ea9ea7a245e768e5568cfc7c6d4cd96cdf1be878028d579b41901dd5243dae9876b4de98711b4b5fde013cdfd69cc8747f4d13a5e360c14f37ad0d772960e6f4c06dcbd20afbba0d63bbc7646499f679e3fba2aa1ac8cc4043af0a9ac0528997025e41fc8178717aeda6e11e6ecd418761202ebcc7260c821eec3130afc68c8d9fe127836b61420a8f99d570d7e7c0b5309a4a5c7526b5d1bdc81c0b6ea9ca869abdfc5783abefc80f38d6fbd6f25d12be39c20ec208d37feed33cf4995c31f09d62d842c540ae7081081dd311f360506b4d5aacde0ef1f7a2cdf2f9eab03ce57d3f40aa4d62a8d287bab2e3d385ce346a21533063a250c47d9019c89e2078b361c382309b01c48e3c402d9278a2e22cc5c9ce068f73c13b3fa0c7d8f72c57e054dbfb1869dda2fefa978198b3e83b2bab94cfbb46e0b432c49f48be55fc52bbdc71e4fc5f8a557289479581338633e4ffef88f34d9dc4d2691232f6aff1eb1a5234e7a4dfc26b0f98ac6a8c6293504959e8577fc200dc26913ee0146b1c8780baeb5edec002248d7442eac3eb8ac0887b0c04e32935a56ae58be811da3618b6e422268a108dc3da1196a04ef341a1de3224226979eb8cb1285ab52ebeddf9e6fac7311a881674588e39c47425c1c03649a95b2824de38f0c14bc739c3d0871efc38a592cf642632835948f657804a540bdaad9de06b7eb30c7f6964cddc9667be5ab2580fbc1d6880e6b4c8f2239c5273e3981d8a626b34f8b3db63549d035d32801bdb2e442d3adc9a39a67994b5a8b3e65aac38f6828a7859fb0a814e34a039b7b8f405c14639e992ec667260ef88945b711ba9f701d1f21d53b60bc6b8efb66bdf7cfe89116ce80329c4b8694f357cfd85c95a4fc0a51bbdb18fbdc78f0d2ea9bb34b1d4943b61385957ce432fb98b35c91159fc62a3f62f71882f07fc0a3a1b3aea2a9ed4c654ccdece19e3f1e9df93300e4440e6c35da846739b81c7a9860da02b8a4f0044300d95e2fac6ec2aba5051572cc0ccc242f738a149f4a3b58173720212db6795887bd13c0f71eef91b789ccd2134e43f31904693cf054fe66f0ba3ba582607af0c8f41d9726bc384a4038e8a8e3e62e6c12895350f85344c86ee8c43cdff4d286a892d157546a3babea770a1450dc6a9721aab263412f1c5a4c3643b7124305d7ee4c070f9efcc35ab3260fea97683bc0774e04f27a5101d2de8031a9646b0ca8f5f0a02af2af3e3e60c1e321795f9f69c92d6684e87205c5f27884c18ab4202706a774b8977d190e3678abaad7a1b5f9bb3cd8f811b680b301166119696d2ac5b652b16d617c9d7c1a81d6274ef078be5af5e64ffa807f918e643be17ae03718073c799560a179da3aee44374fd7cd80fd1a282433071038d276efc30a73bf0eb5fb2174714c0cdd721a62b1806dd70346b0a9f78633da7786daacfb9127ab2e83081a53d70cf5209a6677261d2aba4a9e0c169a286e24b54579fc3d962fa164458f9a8d20e1b411b9cf433607d2eec3d7de934cd39497cad2bf9f5f6987f28161c919a0b1f734596993463327bf809797dcf328e713a5f6ae7634166b331a598bacbff64d99d88603507838464e1f94e6fa2dae44d2b5278b29a4a273f899ea8e374c59a85a9a657ea84ffb0ade66ad809f5db5182643b6e6fb630744074baea19b9a525d6044ae9d09620fa2d3598a70671bf2b6b38da57fecab21356e9dc08518fbc1ae2e826f4d009b8e6bb19b22861c741e532656721af2a95c6e4fd86991d390122ca8193e0a56a1ff2b3805203550b5081d51b37760d546d6de4e71bffabaeb6838126f5b1b1c6ad49f61819555640cc3f1616be019a3d273f0f4b07973ca355c32b398e046a6b2084777e2d0cf26ac8fe6e166d726bd07a37259345408daf05e644f882f3069be69789fa8d7b34f13b80a78f7357f08ce779fa583821d899f2496c2777a9ae82cecf48632b004955c59b73e2a2b6132c2b31cea8d97b5a804b7405f1a05501f548c621067af8f0381586e4ee971b458aecb6d9b259229edb1d25cf3eb63721c761b5cb257b7b41fb1f4def9f8e57c9181701ae16c6260e3f4d6b794ded0357c1da05147c76e3e6a4ce7903999a34073dcda1894f2465534fbee90c0aa076cf608f6ced0919ed3b94867dd5a0140e51b407fb8be71427ba1c37b8427c2e4d95d54a76dd91d667bf6e51efcd252003a0491f220bc81f060a5df559ad193cc0889714423da7efe075703be2dceda8245ada0edaee9c3e0af7d1bfa62d121fc4db3e442f5155598976702104ed0e0ffa7a8c6e7d8e5a7bc807052e79adde4aa210320fb0af51977a9a2d620dc3a58c4f4f1e7f37f27fa3885482367f6f896aac9866730bbfcb8922743257309a15998228da7acfe2d12f9498119e25cf8f7935ed82dee0e2477e318d2477e82ea28c80544a1861355582c008e9f2eca2188e00b9c2be71efc3fe0d7230c752f57dc5fc65f0ef8c9c6d899282ba78c80a0b2c6f264a6063a3827c83ef2d9d3d0ef23c2109176cc8f50ad7e3c67bfc11976d10ae869f1a5bc80a665538b4b777cb8de4ab2d609168efb963a0ca52fd0500028f80dc10bf6503311a65de717ccc1db5fc7db1196c0c92ac8e708b5482302290ff18060aa08b44e9d43f4228265ad77f957bbc2ce4102a997318d29bd000be292cb504d33d086d4f3d65ace143f55572f685b7d6cf8806b8cde0f53b982a6a1167918846fc9205b16395b7a1cf1f237050d3cc9f904a08796b17f06619c8cee714bfb26fa1e57186c62a7dd70b3b52c65147a0130aebe23e3654ea963f5fb6a6472566ae7bed7b0648c27fb756d9f8a0006e9726bd247a53818d4f12d67dba11686571269533646e55db83e2884e570b9a747dc32b0e075a4816d21456b7f6ac97903db4786f7d2201d4a9b2c82627b22914513a57cf009932d8cf20c75b14cf046979a9f9ee60b14595b99fa181f5a3245b814ead59b211c476e3aacadef820203e15600c2654b511b9dd9340220835a778a6151a3ab3ceb013756d9a768725d29370b9dfda03788e86dcd39754bd6f4f1b34a80dd0f821cd89566d379df012d377a568a3bac7142ea2fb05db11e11f70d6d998759443e10ef23533d217fe46c75237b761e83c10996821816b8134ad20e1d02266fe97b16f8f0422228cff8cdeec75560aad5ed56683f4f37023b4d310d099d2a296f6f6efc0d27ef1d81b991f3a293644f3597c7147db5f7717f816e8ab7f4e81aaeb3bb83a1b9cc21665cd099a0d4d2ac626196b7838eb03adcf5bbbabd5ebbd736012cc2ad1419fd14f0b8d0b6bab14fb80f2fba1e0010656178237254fb3fc4f5fd673a58266b2eff8ac8bae860b0bd19574075d3a5087c287ca83dc1869e7cda0db613bca7994c2268aa036b9de2ba820371c697bbdcaf62b4baf1d86437db2d85915cd339b376a5a41299775295c142303b2c37a843b3bae9d9c461ae45721f00a76c09375a87505941c37aa3050a95bfe96d2285292a14c120268dfde908c67a74c254d3ce70b271dc0becea42c740cdc58fe5100b3df56ea3f69add7b53cb7776c84ea9b9150ad4f7a8ace7a866d6a475adad40c58eed42f5feaa60f41d7e8646c2680083b97b41282985f51556c6315ffca9123f1c203f6ee110a89fa85f1ace7c47e8e9427b3114a840a7da14d4100a620498288636df5760d92fd9a219c0abd4585e6d9f983f24eda4b57988eedfc32052a1c26205079940f7f668257cfdc9bf3a93a37c6bf6336e646d47e975069f86d51a6e8651e4e7452aaf04582f4b3d1fbfdf06eaa7d5c26da6f4700c554e7d54ef7c72795b1bc698e51533ff6e51a19dcb7d60bc348cbf85466cf79989de129b5e1a49140fbaabede48b8968ee13fec5f61d885bc6d5e76cf42b193ce446ee8fbe8749a0e1d03cec2fd70492b9ba6c90d819873b76f2d6092425359c0ed4c49252856016daf04eb93abdf391c9426c5916838cbeb24be12a8b5bed1884e6ab542faa3cc4262b3fd5aee9b446edc08b1cdb3b3c73589f583b787049982e7e4b8b4d7d605a5fd15fe728096265466cfb370a8f93cea8ff01d9e94ac7bf258211a2a0efb6dd8e57153ef6e2d1b2429b50dea76097a0097294149b792938413c987c8a6546ef3ead4e84bee870618b699b861631e682ab29c175085b73516b933c4bf7ed39a8bb7a1e6e81d8d7e268af4ce2b997de8188ff9085f8b4f09ca74754e525aa06dc5ae319ee548eb77fa244d53f1b2e288c0c7f3e7040841f3f90780d91be7525c59dc00e02a9b0a05b59385f9c2b8bd222f29794ef1b34d5a54453cc0ea2d7abdef129923878a8f5beb458b01c6043ad87fb517c01cb3710c8cb7bd51dafb24d0720982f18d093102a93483b86f8b2db33c632e779b46a5ce0d48e647fa7c0d096211009592761c31287b791787d830374453703943e14ff45036c83cc4c471661245675488a1920c4d217bf6efd3f0a4fca3a6ba8b117182fc70ab2498ed91f4baada18a0a38c887f8515ab9d0bd005636bf24c50a7f979124e699498995684d1b9144cccd1099184c4f89c07a89e427dd6b1d299c3d3df32035fe3b90f2156e322570c8601218a3b14c361673b454136b281f0c3b5e4861638a00d525986000c32be94d856d13df7dbb1e0feccc5ae0cea45affc1028c4a02daecedc0da1d5cc3f70ca7b340787bd7724436f235d689166c139bccd25a9c8836db229c6b5a710ce2f9584c60d97306541a873a0a90bf29ceae496f7f30373fb80784f7b5ef34edd76f34e5874de3f82e2af3c66ede8c916a868dfc49b8e9588ca7cee8f74a8571a2527ab74c722bef40c282f16e5bff309e49fefb97c300439854f7e73831bf860053be47dfc15ff3fa04cc816e50d06b928cdd1f6e6c8e33b6981a255ebde6b8d9fb5908c7b2071e7c43ad5dd0c01bf7482d9eb72f26fba752172f29a1a1143fc0bb249a0ab4578a6c3e9aeb5d15813663383eb94fa933a1e0369424e5a7cd4b44474d5be44fdb633781c881bf2420b26ebdc37834ccd12eb75f21d07eecd1deace6d301d9ac22b83325e194a1f53097f0186cf6911d709c6d5593acaba12a0bdf9211a7affba64d3b68f96d15e1cb009619cadd9636c8de33780bbba8e7980d2f2918babeb04e0d5d539b16f45f6b0331ce875c37e59113bb3f53ac2e921251697f90ed0859247ed194cbcfad7a6b9270ef6073076a5d663f6ff98d87becef4f02a087128043a8452fc5e74ffbe9e06b3f8822c6f60d8cbf8fe6b28807125122b469d419eac8f67fc2c860f046c991d3b82f5ec1f44c8958798a8bd5cb0304a0675e0940e53a94556cd450f1e016b78f3e16aa5e891afe9689b1d82551466dff8b08cb7c88ed3624a7f792467813d861fea8f18f950099fb4027a9f563229eb1c8c82f1a19fd1d145ffa1ff0b37f97a0be8cd081118a84d8ff2d5a969462dc07711882c8647ca244dc438466679ad47eaaff0fb8a242f176269bc8089bbe93ee8637c1880624b1fc4a9884edbde07cb1e0214e23d5ea799c23bf912a66dea4291624e1e2ac92a8eaab2fc701034e43dfb254c4671df4af55bcd00e8bf47e769f737c15d92c0903ca564ffdccc5b2588b7f276b8c55fd19b435c0c50527ec132c5aa3dc5eaf5502695eca6cb6251304c8cdf3e32aa6bd9cb60b71bfe202f5538f22b812a3522a9550210051ae8bc2f3d7bb963b05f1a1b16af49d3c409374646cf7e70bac785d003bc658bc24e3a2b8c71064916875a80e2caab0726dd6a91a8dbf3d3a12966f6e534166b11bb14d24948aafbb17462c53a9a0ca60c9a720c229c8a74614107f9cab842b73c57c25b24e37adfa433bae543e2c9a36d0871da389b892c8aec7a587d22a7cee49c6f972d20a04d827fa510db5e6b1849bb62c5e60ad361a127d72033cd7106b2a2a5099e837ceb95071c65a54b01f68e31e59c490e102106be460ed8ac699696279ce2413213bb412a060ea9a1160fc2e240dfe8b9a9b6061fdb87932f562fbfee4f7075c6dfd4a3e55bbdc85b72c5396c7fbe8f454fd4180a6e4b7dca4ec30b4676461c5f4a576caabf1017dfa2089c44d9ef080b8d8285a57799c4927abec8fe5625e52d76462021d59f482910ac5a80e334645b17e0bbc84d4358c841fd4a7a2a170e5a6b6a3099092ab9b6014b20dba193779011aa91e965e1fb347adc05995b33f8c92b4cf35dc55ec256bb2988b463e07308ad11bc04062ffa033bf0b6543687aa11b0a5fe792a7691b0ecca53ea85a5f0b5a0472cf0862e4b021dc6fae7450b00a5ca972b8213de29ed6077496b2bda0ed95c3da6acea2ff053b92ab311f731de208e6d48479ff318e5fc48b23b12bb04b20d71db802e59334d5376d428babf895435e00153df05af42042a3349d28ec9a1949558b1465fb43fdfcb56052b5e37d22efad1a5b628c24efc70ae9e5d9d103899bea2751340ceba3078f40915d4f636de9312385139dc311d451c08fd0772615590b2527c9a652347cdfd1d7773bea8e627d7d123adda8149d4b5ed8932d0ac6a61cc6a810cc8a974f629632cfd1853bc1bba2c2ec0a329a8d08dad3bb9c549b54a97c59169391d5b14c462ed925a020ff1b0986cbbc4675197b3c757e93805692ab14d34ef9445de767073fb874de8e54aa7a39b47616405bf204d318711ffd0aa729897829d39c1e8c4f0f71d31854559f09480e6814ff42d7968bafcd17f8a3f1c65f5613c23e637369e9ad262e1c352d73e14385822954c27516b803891a94dea4ccf4645062cfb5b376b7d7a365f3e0a690d8fe68338c7d3a7a3159f9bc6279af92d288d8ec0566cab311782cb30e0102e31867b2b5efc3772963b3fb3a10046ce7b684f3e7c8bc7eb744224d375f367396e6f861820071a350fdd63def29fe6379960a0a55c178f6a15015f21c5679e28da0aca934de0f87bcfa424c2b9cf08642559eccba206ecfc09927fbd5e306f02950d28f07ae7c1bf4f68ac070a5027fb34eeed1880f2e6b2b34f746c0a0461fe24ad1e098e1faac681700cbbc44d2cc255d4e8b95ba62e04ed2d9b58c04bc2615c1888bef2558cc11cb5077e6d63ac09b10268be800c8424852c77c563ba217c4fdfb68dcb95dab6467203dafa2fb347205876da3e4e56adab80b81a22bd96eddec99bfc401af92f9b28f7825e7a0b069d262226885a1199d741f6e2ae3bac6cce1250c2816b0c1db08cb5191984a4210c756c0c7e118d7e97f153ec0c9dbfdccfd6f19d34a97c4e5bf041e813b4c396ced36acc777dbc5bacc30c1b3625acf0bff028956c0e7ecc0fbac91380159763c9b8bce7a8018a2dc36ab121dadf830fc6e05f01f0919c91f278773608822c29283ec1b8c869f746c6e3394b824ba1ae42e84c66b69988e7c49a7a68d138c6e111e507a585d67f878587c32d51d7b178cb64e53a3f7c2718097d6a2f7157afb9f7661092482fe0fd3c5bd8fda31088f7f04beb3b07fcbf15e4407eafca18a8050e9522f8a1dba7b3be999d43bda18e18a62b0cfa4e09c8d48c81e2a4c10f9161cb486cd881f923787730153b40bdd4676bf3e5f650b9386fc5898ca52c432975608042c80458dd88d9278ad62a46cb7132a3497837df712cdfb60284b3f1094305d7e06584b48b89b430f0c1c046338812c1f8a8bc4bb743ef4b74db4c55b8ed09e6ff5dd8b3fb7961dd9f510c682280161809e1b8320582b22149250947411db5e3e51ac66df425e8b80ea3c5ee3166f2ea07ce36608009e66c5f4a3a49e29794f234fb8f92eac5dfc94b9ab875363e4b08930bef6b89c6806f2b0c4db3964709da7552c7e8e21647b92e0fa0cc3290dce90e41c15130caf6a796badd91554415050959d712649d7b2b28f398f93c21d1da2626ef2020c7e362504dc0c97e63b767ec49d44b5593e529d9a66b2704c04a06072bb8cc80a79af9405ecc586895880ab04bc8efb2a2886e00850b70c8ce9930e1a4d8040781e2356dd0992cc69a8506d3807958249e5c5d8e11bbb3b801c14545a663e3ff270258cfc1e2e3b7a4b63350db5e83a32b8991f237b455496b8355297fe10c8bb1f6c0927baba46652d1c6e2091ad840d622275b6ff7ecdc06b740d825249301e8c9abcf80091428312a5dde83c18ced861811c7a49bbbc2f33c7a2600045be4d1891fa07c87dd40e511b721792c5e1a8f5f31964275e01c26ed296ed490435117990cd61237da9331b8839d9c68e088172cdee58c53b8063f2b5cad8301a91fd026370a38b48556552a3c3e5f2163dfc97736d7e10d098c633c539d78a23a7165b21c8226b0fff3ee5a287613629cc837adc942584d8e446c578cb936cb5b7e092a635e301fa83c400a32a820b80fb7bf0ad30b23700633492d5d99c2c0f1f9bd037c8fbbeb74504c5ba29e46d5ce1df479b4c6b5c9f99984bf7aa90206369ad562d01543086876f9357a30e144faf718fb335d75b7f2a9f3858bf1b4aa92a979620c4b52ee2c6012d7c0c676d2029493736b832e7a55ef2c108be0c087107af3ef5eb473b58f171b8b358bb52169fb174099959ef3fc94586d953b631b13b5e144fc30a8d6aa35753230941f444c08cacf3293e8c18f4fdffa0416af310d5f672d89541cab533be99d5d4a6a722c549a3148960126868cb8bb51096a2eaea760fbab525ab5f634aad5123016a2d5c202b98ce8e33394bccde595dff54a7a5668fd6b183d318efbd4ea3baa21c0474be243c957b43a3ef1af885ecf56a42ec81983c372cbca21a4d30bc9baf7ff17fd5640aa69058347397402fea30742881b64fa05463cced2b91e7dbb6e2f4ce9295af34387a33aa0491c66254e4ca6f4c18a9830b16f970d93ef531aee83ee0be7e6dbf0453d00e18acc1ab6613ef5a8c7b3b1c8d4d7a35cdfce5ec44ebb33b3d49600708ae3a54ac54339b35d0c8b40686c622ca8eb961aec959502b68b47b27f76ccbd1050366df85c78c9fe075c06e5faa3a2b24d8efae47fd8873c02eea0118b52bae30d3b55fdf11a3e8c4efedad9a8262e156a414d9578c516feb43875a4c2b5817350aee45741630d2556ca3549c33ce91114391fe67389ecf1861f5d3edd6c10540aa2b179b6507d6e860ed1418b233a03165db53283d1ff4ac036fd88c57bb93a9737ca2facc6263576803346e6013970bab8acda6f6d3e7fd7c216d24b5920908209444caa149d6b32b12a8eccc5407da997c295b90b1d8963279f0558b24fab73760880cf205191c8c9d1aa4864383c94157f160ec14acb4127e5d64096fc4df6548e8e4f3dfb4728574f2be730ba252b303aa1092fe338ceba3abd1042a27c412a87258bda23dc5255342f8a40bf99e31f323475e068d2640413e0634d1a211f6fad2df714193ba4a2a18e64287fb6ca9652ed4c03baae81c0f98d6ec3b16302a8c3187afd718eefe97446ac3d2cfbe41667a10cd4f8211b5570b494654366681c61d1506bb4b6a86ca95ecca42cfd6eee9be8768fbc5a91336e8a88d27113343b414e5a8c7dce3c0cc7007e1071b98e1fd4187146d49f56a61af5aa5f872e48a40a1f7969b08e36d299f4e9c74628b52f7386970ffce75fe1ac7b893489bffd398934c8ea443186685fabb323da7e7c9750b7500e65b4430461b7b354004500fdc15cab0527ca7d0b268cea7600f4af49ea096c459b4ae47ecc31be93a19113287aff3b28302b942ec48a083a08c76c91871ccd0818447ad19e8cbcb6908c1c33265083442c52bf2faa28f543822bb1df000bfb1d3095d178497210d30f05f18f104a711c3243a2db103dbd7d630a61e142217440284824e0047c8653c7243df3d600c5a31cf08e99b7d7bdd11a124b49e3e2af966d5c90432b0b18034afc048d6959166050c36a37c984c975f268775abcc8d340c4ce97fa74a8ee63012f28a40015ee085a9d4f5fb1378e8fad699a18ed7c20507987bdcfd20401b543e3e581bf9d988ccd6404ab8ba53afb7c9ce427bcd53b93f50a83401f8eb6323b73d0a61a42e4712256a51b3c9639799f7a03b878a8842f042c3ae3d5a3860a343a7a41349fac042095f7dc934034fbd55765751e29211116d0e1e881ef450cad4f478df965f5012579e4f69e916d6e9dfe782e7750edb26abdc8890c991ed9af6f22280415ac7295e06193d1ee682dc4a5e8c25802d63de343400b87b060268ec071439e5a1a3e2da199367a0a88dc8385ca301d26cd239241e4498f43b1e46cbe27dfd0491d67c28c765dc60ab40de385679677aea155f4316cd1c1d02d3bac35640be75a4f2caf4d0a95fc1b10f8343463ec2b7ce0dcf357e4102a259eb470c51ee3135124c57fdfe943ca4626150e2d68b41068251bb635121af7dacc262f2eeaae886b8a416c141c2a5e83201be77480c6370eca909b3ab768afb3f817c53af992b90c94d267650b642cc0fcba52cfe7adede322a91887ee1ae254afba26556790deb12ec495cc645c7db8710cb7a1854586ded6015d978abec2f9d274dbb4851e1107b2d79b7c5b587b5918dd1acec33b8d0adbccc4885f30e835aa605ba3c96b73a05fe1eed700be4052458048c82f942d6f55fb73573730c827a1946ec806f783ff1e78e7900b6f2e471a832473c8630c40307021d2f8f1c1c40a8982706c27beecedea91791a7bfe3a8aa02fbd41247a53811a219c8e53081cc29b5274c2e9c9b2c53803d00dbbc53e7f8fefab1bf30191ffc67d99d143b853696bb9f6e30902821557c2385cde7fb55e902444e8c9aa2067ec1bcc26712330c8a58fef367a8b1e9bbed914350a71cab1ed0484a172e0218f1f9f2f68642f8d4b5bd76a874095725afad58e412143a18bce6104854c1d4c512b67a59e445f72c78d172e550fbc4ef207e34b3f224c050b0040a07908bce3427786c0324adc73a8b10051261ed5e18e260859f1d5e34df0cc10c93a91ab9445ad05443607562e1202be8ee0e9fd44ce85956d945ce4994e4e183d4a4abd027c30dc4ebbcf2d694a09e558c22d85339a2c526deb30a215b9a97035d1cb567f00c0b63c3678543dfcfc7834eb207a89740ec905531026f85d5e8408f819cd0b1c608fb4df28d63ac32958636b58bc96b432c4059925074c02a0dc93f7f23c9cb531e86c1495159a8a9cd502c544674cf340a515329c2c181f4cc567e0c64a3a91f8c13b134d3fd163486d3eda7531832a54e4e7d5af330f82e1dbfc30674f9744ca2ac7b0a00814246739cd84ec383e11557eb27622c352be5f1a6dc05a474a5d591797873e48981283236f0144138979dbc6a962a1a56a007b0a0a510bbb908cff29f38a0fd5357724c45a399eea1a479c6c2bacb88e2eb2ed31910d30536c8c5eda66bbb788e64640d1826c8f55bd41502ffc0c0bcbbf6070ee0fcc0f667b2bbf51edfe6ecfb0cf1841d536f86c5b436e037604c9ba89d5582c3ec0bddd404e7b3582d96e739ab2855c5c8dd202e5b5638930a4ae459745ebcf7af96d8a4e1ef4a651f114b6e667192d64449c0c3f3b3fe330fe08ed4d96ef76dc903e8f8e62e6efc85abf32b3f64e3bc5bf2bbe2e365b00be597e2844e62adad2d55a9a3468ca983ef970ea62201140feca0cd55cf20c6718e22d08bf4b6a66b8a07c35b8b07062502642ddca8e17b6f08f1bb17a993d533bdfa87a2cd8ca813ec800b18fe50897dd4578cdc999121aa491fb5f7cab3bd55b310a34408a93e749a495fa553cb71c3860615bb6202468d65a77fcf7dce724c2f7fb6c9b76e4a66f5b46cadd2181c4530712de3f4341f6da39975a5c95c7a62c0949d79ec38af9dcef506b2187072c7e4fd2dd908ceaa89cd1696b0a571a514e6df414b67f450218c97ba48c67aedcceafc0f43b3b8486e5de0666783cff30c6fc82652028511c8d70c0ca80bde6ae1fc29c72307eb4f4ff7b083c3bdb17fe4f0a60618fb341ecfa5639d47e0f9a3b286be736609578a15a43b8942f4d22c17890ed8a6eab32183cecd717f6abc72425595c2bc321d906e0dd294aa9e71a737c736b8550fcdeb509032e239fae29503da06337dcf011f0439f4133d9950f1cc3a6d3ab270f25281c1877b69cff9c4b63129240a61feaae60ca0a98acac4a1681e063b55bf628b14d9e742102f2eef54a185562ea15f447fda459255f04abc4af832c81d42d0345634947455cf5ee981aff0ba1233904d0043de5f7ec6aa68d7505b6aac89b560d8089ea2aaea3e4ae5f24e5d653636e3df6b68a8f7ef929ac448c9c2af841376aec4cbdd17f7a9bd2b787c3871b1cfd1da45e3b2ca77255d8eaf3a99aaac4db9a37c95791e4e77764b5d60ae9b8b342e85e61495d698c74e022b95f2dccb7e17622940872983c0d7e96cb7a13d705701191c51d37affad087682e90ce63ae521fc000f79c69399100433a16696958a2b88a772ad18e0b52ba9a6ef3580a1bc7b4f1ecbe28c3c025ac689cb87e11d2d80b1b709d669a44bf4060c8b754cc093b02a848a18a02f9171496891974e88a049409d8b4f32d1e08aa24154396c47e5b11f8d94edbec87176f0c6b127c15c4bbddc67919d77c3ea7ac4a6858fd60ed9c782c940b8fe92d9ba63a633331fd3b0adc24829219c9f9351fb931f90aa19fbf3728c3ced32609cc648b46b857dbd4001dc09c04722b1b14fb21694f875bb2884210bd6fa372af6a616c04c295cfa9af88c597714f654eaa522d4f8d88a117f7b5a717c36debe6df5f91d3af1f58eff35bade5f7292a8d97a0ae9237212f2cb8061da49da794eaa427d31ecb5bcc2bdec9468c1d2118e1694195cc3635229fd4fd4b1efd2b9843d5e1bf137f00111a3fdd3b55654512c5b3aa057437b968ba3cc652ce39c3490e4380530a9ac6a07fc0d081d494084eefd22ac606e4c9101b2fc5734465952d5fbd5944b7a51f5cabffe74f6ac8ce47d0738002bf61a9e2020cde9fcbb442c0033d47a69957a5b748bf381b1596e9b0a64593e057cbe37a4505a62f21d22289b321757e9217eb529f4ce98aaa088d041a157867c83208313c91f7e071e88ff070bd8ad22a2c3526f9286a77e1515cd02a62378a460f4d6b387e08965cb98a6d1cd227bf8056b1f6fa4f554a2868718704a0eb3bfef7cc8b286329624993e12d6900a8ed8d6535ef95652c457386c7f4e14d0e9ec13f73292c3faf4052a31d83a0a0963a2a72f9acc91765838bfc0895bd9d3aac5bd9a38c088e107cf807482559735fbd4b62ac45df18f53d6f37363966c0045a2f28e61989724b88d365d28d67936bec4e0bea554ecd28de02a55ade15bace189797c334fceef94457f17431ca3736a8bbec830f3e5131e07d21f13953bd431c36f9a50b756827470cc7483d6251cfdd45b0a4607746e01e5311b3b6561c6f237e3e17475af00cf53dac567ce989c8ea6fe28367d2917075b8110b8ff40753ad2f2fb5d54fd3fc94b924aa18501e18f98d637444510aa964d45f904c8a3a5ad6b8c2a5ca9a495be41d676b15c6668a9dabd10cbd42eabec08ed92920f393a14427f82a7418bbb66ccee28372ce746a7cb38fbafbaf39e0ea7e0fdfdf2a2793121f5d8877c502dd48b4043eabe631841683059e3eb06c01081692563d555fd29880e61cf060e68bcd8b3b02a0fc20dce8661113f7abddfc1d715e8a25b10c4a21c85bd54e6ba63e6071ed8e70986ed2e2b463a25c97ecc8652349ba4963b252b912e34e58d7cb5fd1574ce8b06c69ca961401f4d3c4ae3244c7234298d9ba50afc0a7622542da325ba823d133ca6d6dde38000ca0a7f32ae6e03305e0cbd1d6f44b8daa0de9b3e08f2312b49fd9061a27a98caf043f2a163cc192c37e046a04b2ecc498d5a0632293031cb6066619aa5be8c56430040af509591245f457c94ec00807ec029f30f45d86005d8572c8310b20500b7c46acd906342ccc61b101096161dd893e8d5a2a2178e85f67b89420ba32a9672bc42c36d8ac5abb396b48f2fbc07aebd87d6c7c2d0ffb6230f69c0c6c753ed15ffdc63c2f67282507be1d80d2fc9da72bb9cd1b31a5e940a6dfa95ea239c83598a83edd782d2d6caee39508cc52417ddf0fd7c997d5668ed8445e363f502e2256b94582fb2d268a3f51fd1a71128d955e18bc198ba0b4a8c65bdf54a1433ff6e92b2b87d444b624ccaad1660fe67fa6dcb5507d06b4744b4192d653e88cb04f62ca03599f363a731a8135b48a5cc89d89740285672590e3d7be99b88280698a668c5fb6455f27235572fa5b1f17158a3910cf1f190e640a5654bce52b4544f15c0ef1f788faabc44fce625fff1495948f54c66ffacb82b55fd131810cb88e0ae2f0f03410296d80c227c98a8de829acbae104fa48f99cd0e723c5f0d2ef473d46fb05d1e84cb9b65e9f3c99f7299f6e180a0f05805fd3cf4d449166a1f8cfe34789139baf4330c0b15ceb9b87eb6e3e16733e3aeef90aad11a38210fa89618369b750cf7150fc481c7c258659af07a826f447cf0e2d9579a0a43b45e5fc75e09966a751f22040d8e00cc8e3454d89b55ad662194c9d8fc686073089f85d4522ceedd5ac70bda383143d10f51c169245fdb8de24f819e29522675a4f683a133ee925a549150e8d1efa3c43f1f0cbab2ff374f940a037a61027759409c15a5035fe966b4bff54aa593c47b6a56060142c030ac93cccee2da54dafef7af4315bea1e0e47b8ee80f3371c21c2113c8c8bae40d1970af1294908fddf1643eaa7062be928b611f95ed63a3b464efbdb7dc5ba694920c57077d0752073d5c14be4b216c387453b2e16c38ddd38508f94361ec7c28ab6840511a7860a0d080a201e54a9ae4acec4dbf1f700e6515e7700e0fdc67bd8220abd308ad876e39dcd7cfb0f3ef86ed5d4308a1aff33e978e6838d8651f30136d1ae24f19c3b41fc1e18ef4e795d9ef7768f9902321eba6443abbe5acccbe0d46b908fa77aadedef0dbeafc71018a5500fa545c88826af4a9b69004c6c18c8d121ca480066058f24409429cba0824a633d7168e20a780821056b0640b3f48726a28a86a0b48a0332b496c61085234c10314ad81be269208a18c23f7b3c76a0fac7575866659a6bde7e30a42dfdc9eeb317f9a86611fbb4db2328e4dffd85d4bac8cffe5f1310c8bd0bb6c3d68ddb256b0bbbe4b2cdc5dc2b21c3a11336eb0f1a487ae50cf052d66b63c3277d67c331406617b7a90b0822596e8e911a28817f473b7b4e57d17a1bd8432e4b81b329448ff3ab345b8c40de1ff708ea5b74417a15aca732372b489c4a4172edf801bb834834b170f645d1ab82fd425d0000474110abb1822b23e9f599ac14e20ebf3d991c3013b346a89b6de59cf5d0bff06512e425b5bee86d3d7c4795b6459b3f6d8e83504096d36884beee3a2cf34eb4568dbd45320010dcec8b1e22f3a19315cea9155c60c7f1925adb78bc2172f069736882ed741d4ea5c869075864f1297a011b2ce787103d3bcf0e8292ddaf0d0386b8fb722a277f05623b9a9a8a8b8f8dae3ad46a3f721473f92a315f9f1472b3c54f6e58f5454aa0dcf486e9b9423397a1595d1c759e5ac5189959519e4ad56566c785634e5e56824a58a7c15a9a222e5488e469d0d0f75d1d5b7529152fee85546a3d1caca6865349a3ee45442f648d16fca5bf1a8f04685f601140af5037d2fd6bb80d5a9f6b6ab8bc3a3478f1e3deebbf85aa23ea3cafb18c5e9030bd5befaabbcca4865f4f1555c0bc00f79f1fe2bbeff28f62f7ef45e4cdd77f18f625ddd81ba50f9f72e4629ff523a1efd2395ce85881cfd6e415dbc0d56f938eb68aacc9c90f8b744ead4bb0a44c8d3628b13cb0331c4e674739d58e6d3e016998647fff56f07aabd6ba28f514a9148f4b544e316947b6d37d7d8a94a536f1ae3be658d46f15f9c55e55dbcffa87b2f86cfaaf2da0ed445576770ec167447d868fac04247af124325ba0ff81de0a1f28e7964798c25c6c7defda3ca3b8bca632ad3c7682a31048c678101e359586000e05948efc1c80fc08b1ff2de90947ff1706eff68f6a2aef698a1188abe17839b759bfed8634fea5e74a486d90f403704002b53767507182e42c4cd7a2cbe77970ed6fbc71e42163a3489694f3c04283ad585fa90816a433770d11e9afadbd06dd111df3fe6e0c3d26bb6f4b8a80f4dad7e9f1b972e1b1556698116ff718c52924831fea3be3cae8fef037efd008dd30796aebbbb7bfab060380a24177d5c71fa7c2fa6c6e9037ebd7e7f07f8d7fbc7aec6bfde46c72ed209c4f4614d25f6e17cd306ae8f6088b2956d6bd76b0bbb08897536a767738210ca18b72791b8d1368af1ba664a393cc525fedeee1d3bf5f908bda1d4114f3571d98b87e7c692b6ac6bd991bdf69acd4973e182bbe1edee0dbdc7058c2deb5afab3b739615d4bff3bd99c8ad89c92c41c2ee9ecc81e9b40b2d9dd0c1ac81ae30ed3bc20ca477089bba53beec42349287ffc619a203661403109d33c15178e504e2da1ec439979b810045ae36acbd90214688d4ea2c714d3d4788411a6794b287b3c82696acca15cb324494e2cc27c396193bc01e5b8f360f8630dded324868938ee8677731b69b3b8f89ac541003b614a646f83b16ec61d21ae6783dddae28e7bdc893bded06143e8dedededeb2611c7c0de320809d3257b58fca530dc3cec3307a20fb9790fdefd4eba976e761e83c0dc303df6af82cef4e93a15906196490c1f7c990614335003140c87b5248938c991f332ed0ac0e08eb2f08ad7f9705dfb22610d6bf0ece1adddf465bdf6f753532a3407b2f167cded5c2aa05282df8c820ad19c81666d3c3827a9f4006b4361420d9424c03697f3fc182f6bb698d682c564f484208406b0fddd0760b6ed7e82716eca116e21fb455c5105c53b35de335916bac530dac59e15c20890421704969b95b5f2ad5cc5c5ccdd6448e5fc32ecc08da8f9a9a1afff6b7d66b56e703077c7e1c8ec3979bdaec5220a5baecd71566e79428e40fb7e276416c4472f997d65e5c4896c3c75b746cc4f2424b7033ee86735c8e37335f2c42d3aa46f9f1e280f0622257b8db5fd31afa66e33fbc21093e336cfe9929b43783ffe02855a7c07f70546bd145740aba882ea253d04434113d86266217f2c0344c9b9a68e4f4600554f768b7d8024cf39ca0bd0ee01cdcf5e0529c3b7df0d0dd3c3c2135e77440eacf0e609806827c5a1f14da5c6ad10179b45836b8e1ccf1847888129b1c4b469e4ba5999997977d40c728a5d7f00aadeb2e2e2ffcdc5c4de370aec677103264480dbce18202c93573b3b81a8bf26b297e23391714487e96d586f2c5d5c4173111a462263e224411a2fc2e3586b4f1cb3744831124f7376d9f89d3f784124308a2f43da184930d48a9857c4f2881a21a7d4fcc000bbabfcdd8d9dddeeebddfcd42fa1920cb9e32c5bbbd6b77b7773b076390fbedcd1813f23defcabc7f6b3d8c09f8de5b4b568899e59adbc690de1adebbfb432fd75ac05e91b2df7737fb410676ff5a970dcbc24ee052b8148e842b2162517027b2aeb8140e0547c2a1e050702680a8432664bf45df5fff3366dcbae00e15585df245cc294fbf05447f2ccf1611eb1529b3adc135fcdfbf55af360aa7f36051e0f1ee3d9920be357c095e93f32cccd6c8c19a76d8550f6805e4b63572b22488901b7d2a2baec04275850fadf28798f97f29c50401a806547055488d3e15155f9882c4e8533df981d6f7c21322587862c415aa275150a7f567861ed08a3fa01763a8220c2318c20839d041821545b81e94154891c416ace0031838e108562881521855547113058b1f40418253ff0ca6b1c1048ad1fe1c6dc25af085220c2d01288b204efd3b3c951552804058893e951531a02af4a9acc8d9818a72767adddd970f9758097f1b0cf4ebb3438d65415e3fd8e9bd187c6921aba6c282e66c7aa70d6a1fee48200655148ea89c84e10a59e38c114dfb2ee664d8b76459dc9450ff190d60534ca9869270be8282d619ea4357a0f5862834b3301c58cbdeeaeab5c23a253688cd1a5febec9fca5134fb851b73359bbdc6bd6f13d510d0f76264b362588f6b15b9b4af61deca512eaeda4aa0af9bd0c78db0972843948001d0f7afdad091b6466f8d7d76419bbeb97d5d91efc9583e9a4f13a9acac401ad5057d2b13a98c9a4b2eb18b57e24eb232dc3d2bc3ad646558e55fab542aea5be32ab2324c73b54087af59995e46b8c43d8517837fa56b273c9825bc12bfd575125e0c7e175d3ff160f8af1638418b6c8d5e3d197e9a56bd127f477115e97f145ab09f5aade2ae9d6b5ea9cbc89512a94c179d647b56c9c2243d4a6a3c5a67789172aa57cabfaff01aa29fffba793496368e7f3f611a2d0bf009d6f33714afc67b32d7f3b79366c2345cfb3c1aa2a7c2fada5250bebeb611640bd55ea564994ac7755be7d2c58cba8d258a55160a5367e8424157c42220589c0a09c9f1e0d1609b12cacff570a8cadd542ea7723a954b556ea7723c94ebb6aadb4fdd80ea2654b7215a37287553d5ada76e3c75dba95baa6e3a94ffd52da7e7a76a405513aada50d5a0d40d45eb7653b555d57caaa6aa5a4fd578aab6b3435a6a2713aad950cda0540d4559bbe1a7e970507644b68257a38facccccd7ac05943f1be2d1348f0e321cca8f658180cf201685daf0fc189447c34ac057a9bd6c533baa61f865fe00b3c6037c8c59658c8f999514f335ccfa353c0d343c0ccc97668da537c0acd2005f805949057802ccfa04f897e7f3f20298a83679cff6b4c905f033cc3a33c3ffaca5ff6ed6ef7ece4a9a3f8059e5005e06940cef326b74f9965965cbc3989504e359667d9627cd5a220db509eef04e9b6000669d01c0aca595597fe55dcc4a5299558ee61065396b9c55be6856d2acbf3b94ffc8d6b08e58191df0f4f860a68f504e006642c0fbe0f58c5ae5c42bf1fbe0d15849bc1ea6b1522aa6b176b89d7834560d5e89dfee731bfe71edd3268b4766d6788059658c594931b37e0ded4303aa4d9610ccacb134ab34c0aca402ccfa0440bdcc3a43bda74d57ea1ac0ac71ce2abb59493febcfd023801e19668d2eb3ca96594930667d161f22f94e9b620e046a539c7931eb4c2900b3961e00b33e696556927431ab54813b9447b34639ab4c9995248240d1a7442b048a30098c09cd506dc250d8509b30a08639626b604f783229a6c1a0d8611a8c07af068f0653f24afc9124b3591f4361a8a1d20e8a87f2102605655aad23b09e17833f011da6ea309f17831f011db6eab09f1783ffea30274878e2c991584294d712ba7eae947572247dfd40a198e3274702a34f4341f1c99148ff8a5ddb7636747b826f0336f2cb5aac0713d2d3260e7a30cc413d16d6c3588ff58f5e1ce44244b6e89881c7fed3471fad3b5b70f89ed58328efc430149798560c45f93121fc188a69d6aac210515c71635f091bde6f58b211ad1814cad8106343d817d6f44e351ead9909b220289f2aa605e57f5ba3624394a78d2fa45ee9d5e869e30b469ecc521b38950c0f2006da7b81b08b0d53a25c2ac56040c692199f95937ea6a92e2f3e04843e69dae326807d9c40b2c7debb1df1b30924fbd830fdcc3d1a48fe1d892a08e87b312e1cc8ddeec11cfcadc903cac502fe6c28deb1ff2c583787c23a83c226e9b0debf0587ebfdaf09e1dbd02e817c4b75839e9f1f1b8a5eff5eaa3544fdb5ab631a65b0aa55b9976224bd8a69fa79f23b3781fd1defd7d229b5a9020ce3efb14a527cec6b8956804dae83cd1aa37d9cf585d6f7d6fce159df13ea2f88fad4e66b98fa3263685d1ceaafade06bd98f085c331501ff6918ff9e961d9c73d3751a26023002af61346eeb62c3b4a96587e8379bd3f5b14ddb6f13c8f6a2c9ed10bd3681685fbd877af51deaffb807ec899ba586816fa361e06b968e95822a0a6bcb8eb539695dcb8ef7d96713880bd99c74fc63949244729d16daa17555426df2550f91e493a09c7a48a2843c87fa348ceb407fe682c482646bfbdeb60807ebfbadd94272c1f1bfde8510c92a148ab215563740d1218ba5e9bdda1e8710b441481c456b0f187d4ec4dcd0989e1854cc4dcc8d9017d4e3053581fdd0ec06fbc17e72c038a415085d80c0e5504ec5e570394da06a2a2de8e6c86ac3428753f268f00ca6ef6113264b6e2061e1caa010324a319e0024190040dfcf7b262c05f43f24d30c1af04b10881703e90a490596aa0265611b6028ff5ce96a9ec21b827e2cb3e4c89d9764f941b6f8e0f47a1f29f49a6f7dc5523af45fd387b578c0ad87c5524c630463c234efb50fc19802a6a88b72e8ae104cd123e88dd0857319b13074bb67ba6e1e0cf7458267b29eaf2228f36f0cb30fe74a77e170e9ba119275e3b96e584a20fb7d675da16d9d5c373f9cfa156433cb88aeb7c633bcbca09d42bbaf07d3fd4afdb0ffbd3f1a32e8722b83f6ee5377518e95446b8be3b5ed392cd5e1022f12897534b62cedb32c7a3468f1cb38914ad29d75b512d3788dc55c0e2ff59a5bf4c1470adddf7e86f6df906387057a7c4048ce113b49544c7e364813754290681fc49f9070b639f8f3ac9366cf6dbe39bc706945e36410b2fef53f6a1e7ceec636df93a9d9af0e7eed99d321029a7d8969b4ef7f9c0e7f6d56a6990e9f2f3e641175e08f6f837d2c752e4e1f5be21237f74291f557574540ad3967647069e6c5c89133a51dd218a3c20d07da04bf9f6fa233216bf7d07ecdc80e973af56274df340ca783730e97ba7a2af5803ec1096f1ae607b2720ee77011a6d1619ab55260d02c6903c9cffd245e599caedad0e863b7a0db6bdb6cc9f1e8f6351cd7cf3d7c1bba5ddd680f34dba7753634eb7a6c149b4b6465aeb7e27314fed86b5fb17f18867d6675bcbcbbbb5fd06b22ef6665de77bf476465de5fefbdefeeeeeede210f38320d3f7f05a2fcd0fe97be4fdb14597264bfdb60d77f372e1f91d0b2766a310c2e31320d5c64a0bd971a8021ca0f55f04587d7e4e17f3d57211f8d94ab901bb85694077ceb21b7858c6cbdf6b89aababf1eb520e870bdd79ad7e206b4aea4a49e188f4bd18d78ac21f4b7d9b31004340f88f3741e548b8139c89c5a1abe4cdda63e36ebcb96471e2157e9af0a00e7dffb0a0ef9bac788e388edf08052d51a58e8802e5a749129e1cc67922e4b3c4486a51409c4860868c75a125f4bd9194a3a238f9e949522467e809139f1d23421805e444498f4e112c38b072404c29569f4153fafdbc17a3caa00f0702d0e741c87d7f2ff441281a41a13d4ff91151a0fc3449c2d3384f847c9618e114a3a238f9e949b2453667a8c76392a3b4f34563c2bebf6ca0694b40c29970241c0967c29de04ef028dc094b8822891552e823020db6a0249794ed961dee6f73ea0e88c51b471215f2659f0449e87b027d2a2252d0f7841349a04efd36a72ae8fe06b6c6d2fd98591a92b5d4451e5967e8bea0620ad4e971379a0548a84f0a0f097487647d2a2e044169f04d1e1c042c4824291ffee37298213e7f7310da7bb1a03fab93f1c51a8db7c5e1ff626c09e45bc982addbd7a865d97b18f6ef9148148b0fb1b89fcd7d18e6d9db60d82eb610c28fddcccadc8010016ed34576e1ee5a96f5e8ee7bd01dbab484b4c734ef5d7ff95b0e65fff5f199aeb7e6e3d2c2ebe2cec68330730db4f74cce6f0614f27d8dcbcb8420f82e7ae2527b8030be5597629af5d8c3999581d6848fe9808095811f2106a185d1cbdad7a2cb61f778a13eb18530d0de4b0bf5ead1006221590b74c87fbd08b2896447f6fc98639f61d78ca7fdd8bdd36b9308f82f12c9a54d0340a9bea023837633812e579a1fc887c4a09c5006b268dbe01e3027626ea26067ab83818284ac91728ffe51d1809a81c9f4fe713aec0f5677134fd6c36e07a34e41e8f3c129fc161c3645e1f4b15b50ef5983ec90104e1f29d4a71296cdf67e518ba20d0305edbd5407a2ee43d85df840d8c7eeb4d83d2a014c024cd33d5a017f3f95e4b261cf9607f067bf833f9b4090f403c99ea7dca101e1d7667cdab4396ddd4a6dda667d6d3e86790983e441b243534d20d96b134955823f025bc50e8a803a8920c80c228560f2829308826413d54ea828823af1f357efb1e1af7b3fd72501ff0ab8a9536100c85d7376bf2c1805f52f2981d618ea0e743de99f9fc143c3f4d79987758d6a987e1e7472fa59e7e686b428c93a4224929428ac47d685b204101074d2f14727bb6953dc6998fe1eba50b462292ce5154b5d2a1f2cf5e34cc87a7558122f46ff76180c9e4ca7ac206bdc49d1feb8d3a6386bdcdfd91f8647833210cfb43d18285b63df8ae1d16cf168fca1300968af0e7dfff10981d69725f8a4a13018300a76378fadfbddb5e0e028140a45f721758aa21bd32cbf26a242f2673a921f4b4208a5cd271e9e895127fec728da2bb02e685dd0bf4547f765c12520843e64b53ccc6c26e08b7f38d0a66fae86b1d798903cb4a94ff05b74f8efefe441f96755fc13e7aa967336877f70b6c62a5142ebe27419f7e8a8523ecce384d665f2b33e5c5ac225d58bc1bf4ab6c636e1c48bc15f170894873635378b94d07eb908ec499b40829cb2c93b3b90fb75551e20d11e4898531f6f0bdad3829d3febc757bef295af7ce52b5ff9ca57bef295afdc95c85aa24a4a14ca7e43611a489fca0b4592b049a472214cf3545844a1fc45287f75940e653f42d9f7c9bafdd0a3b1359240eb8bab3a065a66c49beff57bdddebcfe9e6746c87de8eecea5f720ac0113b01b6afc8e3181052c2b5c826d12396118f8a2200ab1b7c1d7aa4dd9508c525e582772e223088af21c8240d910291b92246e552690fe5956b31585bf0d758c52f646b9639ad23dda2aa6a9a255fb304d5dd93aa6bd84693ad2f510bec8492682d972dad4a936adaa61e0934852768ac22849af89ba7e257eaebb5e897feb7e2c6519d6de1e8142174fb3d77613755cb775a2558ecc9eb117ad98a61f3ecb8dacf1afbfde9aa226356cce3496680ad4faee9944ab0703dfb2f66935345f5b031459af753714fe77383bb4be053f736112b6d232ae8aa1f5751ba2d0122de1993ad37f154941e1ef123675f3318cf5705aa21597e05b0fe1bf173879489e16ee61036d6f30dd9797d2be18bb5c0d37f77ad98677a5b0cf2fc7e0392011d6341c2f17d076e3987e291b84aca9f981cb220f42d6dc4097c3b1d6b26867d0f7d2bd97a0d5188628d0c210a06a4181c14dfc90a24f08f435817242b5e56a2c1722244482fe80d48af2624022ccccccd38ae242128a50fb436b4c6d29116a4b8988c86a41690b8a05c5e77cd58242f953acd0de0b0442d68d7249063108821118689a0ce4e352864518830c8bdc2d336b9aa6adb6da6abb6dbbdb6ada8c6102103a747bfe1bbafd3322af5273a9b4ef61190b0b10b2ff7a0803e9f1f74b6d8a316a9123bf387ae11256a2d667338fc6f6d66b9b8f1da2efc5b0815aef5c0e90c3817f9bdb1340ec504dbb2ea8e3856a737d587a7dd639603a4b10fd5e2c1884d69abbb1bd9be3c9d0251d4fe1ac7267259164e020fd6d264438018a3e22980045e923820972a8962204897f107f4af9f7d263e8ed7bcfa3ecf14aefbdb7edb4c013dae18045757bc30ae07771055957c92ab18448d196452e6a8bdab8a84867502dc81ccff195bac161fe01fb0eb848a35a884371a1275800ad9a38f1e96125bc84793845d9081f611d2ec238723a10b81cac08b77836f72051fe289419e5587890d0901326ab9f254928f71ca18cc37a3f82726a77aabf45a23e795a96cf28840d275eb1f002baa1bda669afa568acd928f6b0bb9e99afcb6ad2b0b945d67337834b391a407a591c97b72eeb6238338369b087655dedb1d123687c9ef13d0b3983c4f1492e5f8a898b13745d127237786e4d48c80c2f6b95828415121138e7eb0a5d9c5127db3378a960880ba23062e5d0ca42939c785d990f8c10c48f0f0a5ed80298f000e8844d9b13e6058961da8b217be2b07e3bf8718a140c3901c93ec8aea2b4e084c4dfe6a4615dd65d41663a6cb6ecc0b0accbe66b2de0638fd3814477e90648f07d58afe9d42744ea6ecc0bf2f253edd1cfdd80b30769133139a204e7b794b9fde81db37e6fb6c6f596c57d8c1f45d7accbe9c868e46ae26baf3d2b72372c497adc0d4bb3c116f6a8a8db9cbae110d9b41b22384aa886855c9c8cc886cd7a719c0e5ac77137b00d831b112238296b3de14814faf43591e4064dece0099da1af891d28110a4393a5588d3ff2ec77b3e7e4f529ff54feb149658ab2093f723a327a5d5ccdf5db6bbb177763ff65d495aa90fe32880fb5de46633ee31ce452bf6f929e16a29b5f21b7673e9fd76eed81e93e5637e374d0e8ce5da20a797dfd76af3333bbc4caf0125bc3e55a37d0de0ce9f021843ca073a9eec20e5ef0827fbdd5f180cff07277ea16b420649abacc0faf87f02db8d66541ee7858977559d65f0f3b1ed6f3af756df1d160ea16b4207c7ef564df565c2dfbd6a8f6dac6d28fd8c3d2fd0bbb30ec8aa1d6c738a743479b63d176ebee7dfab0a7d66253d4d5c875556e5d25d12ccbf6b32c66cc5dcf9dc32b8b5ad4b4e58d1616b118addf2c2c62315e31fb88452cc32af659fc38796011cbb0d8f1c0302c8bd66f1616b1182f2be50410e55ac01f46425cbf3f7485e067ff381dd7dcdfedb49df5c5ea61ebf66b913fce300da743075f0a7c2930bea7700aa7f0ac317a8c36f829dc18135f0cf8be85bcbe463a63a387061e8debe137e0d1e08733500cfb19a6193d7c194ca3f2f0678cbaad935ce25444bfcd365afe8034a5fbb154d4558c72738b35dadcffebaf8c053698b3feea9c7bfbfb3be9eb81ccfefdb55df696d7c6a3d174997fd0ded55deb2385a3fb17772d3a78d06b561b6cb1994204b974fbb1bfba5e47817c36b6c652f80d80f1cae1d487a50c453b72e2e3eeeeeeee9ec54d290b14ed8f99d1ffd21fbb7084f66f4dab087ee0c490052dec36e459f029fc09ae04fadea1782691aa7d9c10a9da24cac9c9c9c981b3fa4f4e9bfc090f867f0a9d2ca4acd8f12c7828a398f027b8159e059f82f2b34781fe131b46f8179c38f8faa7509c50f84f9f18f2a3591bb683030128965a129612a164c55242be4b48375840c80e9347838bf4b013d4a361e4d160ca8f06e73c1a1c376f22b1eb4114d00787803fd0f79ec533710ee53d4122914800203d18e680da2452591c5073402d527140cd19805691ca00b4724094df7f68cb3389e2006a2025e06b50518e13aa36b13c18fece076665c30f65e6a71261c1bb9aa797840f5be83571307d5cb2d855b462a92a5a518ea888480949344456524e10d3542c25f4c334553a5951a0d4124c0887a74906e5889b80a8146d15a64d2e15d108020000c314003030140a08c42281302822d7767d14000c8b9c44724e9909b320878118438c518618620031c0200302240322440100013bbcde27e2566dd18795930d96613cf3ccfe086cc1b64076d1775d7496e12b8bebb1ba30e39337b61b12ba0ba88b55804057ca43f1da77f83a5d22f74c206cb34d43bee498c9f6d17148e89e470745aef449ee5e22d103c16d6e322d064fda90e865b7bc4968b075fbaf6e06450476e1a7344b364f747831c6d934d473bbd852081b01db54dc418445bba63596c08766aa0e6b55b71553768460c9a6a26a0fa639415b83f054686bff5372da2837eda788b131c0dbd32e82d25fd004d139ec474ee79656a0acd1ba73ba84b08d4c7fe0050493e7fb49cf1ebe6f1990d94e555212a796604d62c404feed99f52491d004bd947c7a6d7dadf163522414aada803f74808fa5dae12d12665cae11a72eddf723b13ec57be4b66ff77cca28ada5883144a42be8be81a08a0c830ae0968d8db8d1426c7e58eb409f1f808f017ce39d41a7ad117e637d00cbfd38390ff288e13ac4fb3a0fb21bbf663b12705aa3e5a544a099d5a82d2878773ba6960b7e7af4a2ef44206fe1f2a9f09f4f166d06ed92efa993344efe0a833be0792d303191cb04dc00415343cd07f76bdfc7d38d346f447fc67c23527c7776d37f6f30fc2ce3fb619d8f2d10c8c4ccf5504bc9b62e144ba39c9e1bf56060578788c3ed3580e1d6945a0852b7c957023e9fe1030d5773619c084810a7b924191b0313156d35e55e7f083a21a0b1398e093e446a44cb4a4b40674026a47858cfbb24bcb3295a784e955476bd7f29c8270d5d3c46f0aa55870ae1242e2bebb69e73101e4d7a736a69009a32a5e190f686774a2109d369ec0492828a75bb8cc1a65a47cfdb5072a7517f70a156ff97c9a46d2e85111c03c18fc7905298780964683587b543cb381fda95bcb824081f04d53658b80b4b96b622501a14e01c62b781e9e86150bd7d50ad1f18c40ea56bb9c126dfd8a3e0d7b26c4d73acea79e1170869343d4dc4a55495f455882b137e9f80ee1750835c861a27d2899f400f4700f4e8eb000157d02ce3419cd1756f32f53390c80fd0f966588ebcdabff51b179da1060a770cd5873f572c4e3fcd6d61ad27acbeeea4b55bb0ca0fc956ec7de58e317092f8b87c9b5e6e812e07f8a9750fad3285707f982f77bb1d904b6ce88d2707da6b748d5217e1b86ff4026faf116bc3ebf9540d4873d45ea8e105f645bdca6ae509d7d395d1a4227ac361c396a285fe4efa02c818be6fc9dc91fa2c01084b3eff4a3477f0efab5bbc81d9a1c1d698c18e513bd0310eb12d6039fc2debe7d61adda466b609ce65569dfb76b56ec9c39b9fe8044d607e76d7a85e5ef014aa446503effea15237102246e40a76bf7fec98a6ba4817262363c07609ac94492374fbc34cbc14071c560b492bb2a134f0d577e7280de4ebe48961977cf0e585527605e426a5fe0060b4b7f690c0f5bd12ccddcc460663ac158e7bdaa87e2c0ef5d5c88021d7b0721055dc7502cd4befb0ae24430881e82385e8451a1ed0bb36ef0a78ded1b1530dbbae9271cf870ad236ae25c005c4aa7e256d42eb0d908ce243c77b409093e48ee833b9c0ebee55340a773b67815f9717b1a913e93425a282a696c0f04fec4e94a83de78c6907228b2bb7ba3d3bec42dac7676a2cca1940050e54bf099e726c3330ea39882b3d8195e723458b1f30ddae5da93ce7e48cdf8d8cf575a3013a3935cc78f6ea67c38bc1fd154026b03e46f4447cced10ccc27f130581ca889f917d0ec5f9a176c2a5371d33418d48f9020852c24f85ef7dc6be730b429f6f1365ae39d5fb9e3079ce789a808a4b3847842acde0d2609ed4ddb8e63aae859e9b71eabee391b1dcf4bd95665b316bbe81ec47535b99d8a608cfe5c2be3692d462bb72b2f3b14e8919624d68e270a8600edec85c28c345e1bc462451da47031286f60b5d90593aec03b2ed8dc0d760866706893c4de838de08bec362ae6821d9fa73ab9dd6fe6a40e84cfc2957877ef4107afa1eb314d2c62253b2b8d29cd1e060d511e6d2b467e09d5881231a04eaef82b557631a4b441da82772345490c1c75503d94b615f25807636ed71639d033c89e778ffe3a67fd2d8ac523783130f33eda0d981b0d56cdc160026bf00b5ffe832abd1b98f8e073bf0273e9c898650b1b0bf936e7038c9a8a74bf92378b6b1dbe2420edd9ee7e9b02154bf83241300b8793a0431f54cbdcb458eec82d2782f828f1d8cc1a341e8898acaadb5c34f0850900a08e17d58934abb1761aad6bba98dda7cf1a8992109caa4a4fd43491a7e4e7dafe63b2ca0f937b499586baccca63bbbeeb73e6188900d3e74c1dfa3f207051e3542aa958100f0a9572d7f0566bc5dbce5df4b57729d3669a6a3b145d8872e80d46d05ba7856bd1441e7e9d001a2547948dd78510979f4d943d66952fd8b41708f0e03aa0eb37d21ef934c74a2aa6b5534f699646edd8b16675cd44d1442ab6c98037884eb1ca8f8015446b8d6d06f31aefb930ca689a199464c05978719b37531e180a28e528c9d18f11ebf477717f558396ad3434061f22fbcef269b776fe4747ea18ba1e1f70c3b1c70c478a07d76097835e4487e7adaf1b34b623c03219d27c15ddffdeeace89e501c2368965979be3f618903798d119577d83ced1d7d182482645bd1c28c91e05c9c37562fabf58934619dbe29c2a083394249e258747803b8a69e7817d766dfa5e83cc285c647a119264823c55b11a4b4ed5c3155f526b567fb1cef6a3a85883df34b7ffb9b689a957d4100f977468b7b84cff3fbf152f68126c6853f761029eeb9dad419ac72d97ed09a4650e0c6b0ff282650cecb9e09d238a7ecbc589160b5c49534d4a6d492ccf863afc491af0305634bb0a62af6368821e9e40abbecb1a568460ebe925c2f5ab782a98285f1754a6f574b920f926565b578838e8b57c83c31db3e416fbfa8aa6559b74ffee4b42241841015952a2e1576080b76ec03020bfc037d972d4d72b807c192009f0264a2a52c816d64543a9b781c902a6aed6770b520224ad8ea68577a3f59406dd9b1b5aad4351901f8ed219c4c8444a0ba17ca39c32687c52c1f08e33377f10b8f90bda800b3c0e2193adff2389cb991c2276a956c511cde4a76ac757a57236141df86832fd0fe2cecd0ac47ec8e5bf16e814de88848a627fdca3682dcd7f13951f67fed78036c1794b7535d40bfb2ebe888253e6bdd5dd107ba5119af21007047f3cbcd6f9f3a111e12aa31934d832eb920831366fe1076b64f7d6ec01c9e8b19c2e60647e488146332cabd89ed7ee89f48e552b180881feb7cddf4de3a0808e31d9d46b5c5785866e25dee2850e040d6bb46afb7df4a396523e5bfa073ace3fc4da8bb2fa9fbf9c34b4e8a9ca4820a0d82b1ae1aaee066be8590e1b2cf989e77a47bfb25b583c69f0950e99c5ee9ed655f45e5903c21ef4b83a49d94c1a0ff39104ec81dac4b1647e57ea87d71b5db722d4714942fc16f6cc4c835f2aeedc6d9611e0d3028d432bc5934e5b30c1ca1ba59063472f5011d714cf332a13ae428f1b86b6c74f30d555492ebbff648b6f97741a0ae49947d9fde93264ef3b8b00a5c1e533bc68f8abfac08f43b474a73d74290683cc1ab61b456c526bd19a7027ebb7cb78114fca864a605a5b8a251706f3095bdf936f84684f652e22918528b99b5775fc9a9d1c585aae48ee3aabefe2b0039d1ad3469108aec66298dfe72fd05a859f0a01c5acae705f22d2495cef477e91ac15455b42c4c86478d0791efe5b604c2d39feab9806abd8b0893e663c8acd0f9762c7a80cb78a70467b9672f63da4e556f10375b58f003b382b27d2270b62fee2fd85e0932ce69997802c32394c9c41e7b7866d39286e27c4b2f239d773a10f680cb7f08a1cd62c4ae5aa64ed2ac9ecd592482237c366cbee6ff35f1cbbcf11752875db43552b39adc4a0752d920f8c0e649a6645681fb02c4bad830eb694a50c15c56e56d582e48489a5a80c78915d314dda43ee2d89870cf1e966df9e7a7ce9f277e2938fe8845578f2315687fa3444b06ed7d9152e9ecb066364011131d248a6486ac8a4d44fce7c74ecf12e276c4a0e238c5b3a197b55a6bec4129570a86c4e03c3baa611c765f2f290de122ea0ceb1069333038d173d4f6afc3c94b2b41a3d1e58a307d801fbab6641a15837b7d646503ba8b5b632f8988f62e1dc699935c9bcb2d93ebbe34ff9f941535bb30f65dbd029a364e9aa2a341e075d874586acbbcd2a2cb84a29a4b2d728608c08ac86914e98742fc7ad92a7efab9f164a6f90bc8bb8d382f428551204f21c33e37bbc7a0f5fc2a04d4a42204ad3336b3250662b0c16f6b4b2994fbca4e4311e03d0c21b6225ad4e05966967f461132909ad42dc56e9c6ba8b10358a4a2fd90dfd17e1fb466022e37714da48387cd6e84ef8d18a4250c1519d4f3e5353f4d8b224d6c75067a58bc624eaaa286ff9a44a6c0b8d577c1763a8ccc532d5e59a2fc235fd7c4ff909393c11424a961255d6f902259711289d685120a0b40be34ae05884c60782ba57a13ce8af32b7390f27194c3f27b299d5897b088e4acd0e3e305d43f1ac5a0ce0bfbbcc1992bb2f1fc2c61f9b0fd04a1409e0eda1d0d74a1912bc31610dd96902771859729ca33ed32236cd1204bbe1c171e41abb7129cb8d531f1c4e88595e7452df0dc50377e8a647e8ae060db78a016460648d156fd46ff2909b943dff63408394f9b2943734d97c5ec293608780dcffb51b15cac37df246714e67c9f2da3f45cf194a28e48d5d363b740eaa9162149296596f6045badb3179547a9a3e65f301f5271be3b76c04fc8a361c513096e13e168b0e1d1a74a687e5e8f4ae64837338d5cfb9d1b9c9b9737e0eb31f80e7db8cbe410ed11d67971c8a4756e77672140bc2373484be8dcb7571da10ae81fe66369b6ba160fb82c5b8d21a730e7323a9e1d1ca5d25cdc884168742a78405fc14ad69d695e9c4193d75ebf1c3136f2add2b12c3e4efb1731a00e080b8794f648447790046ad296f2032f374f28bfd211eefc34e5c0154edcc9cf6a0ea834eb42df8fc1315c4a47ce9dc517a75750806551056c4100b4ab55731a150106bec472e8e1284065eb090474a20d291de6b4cfc584fb7802a22ea09198a9b970b167b3e659829fbb86e2f4e47342a7a9c7e87f0e3b1d7f88d3582041f3b842c2a667feb7ff189801af05d3f5463c15d900ff98ac5f5f331a9059e98688ac2595d75c1e841d7488c6f96a9e8a1593dd9faa04556ae2674fbe4833b20cf25d12021e87af5fa0b14a4d8e988dafa5f2339bf7ca439b2b56012b3071a49d4154860ad50efe7bc6c12865abd2726165298b55e5d70a50f3d2c7bde1efaabd7b6845a727d2173af97c9d58ca04e831d16c4992d2496c2db1411ca2fef8e1886e92a146539c7c32e4eb3b1dbc26f870c9e91ae0404e49191271d4d71e7cab1856d3592e70bc11b1c140451213f3a3cdc29f1e221b02be68a641fc2fdef1ea27833c95657d906605ff1c9acea6327df8b67dda81008ac32e4dc9374dd504464cfa0e1a00053e728246512cb0bf28e03f6d4a046ee87a58019c0d3441819bf254a4c6678078313011dd3e9699184dbb59bcf2f36ee55b945262949bcfd67e6205e1b9bd373a4907029fc307bfd245b6d5df287e8a726e6ef07fd95b1f237cd09d989d906003544f48f8a71e9705a1f00ccb395df67f4f33c4cf966f8024b32a12f026635dd38e24bf4b10ccc5613e5018b42394a3651d2b12892a3b4268ac4a2941f295e13c5d25713dd410d8898d02bd3fca84cd8020655eb7cf888e724d9ebcb0edbb8a40bdb1288b7f0f2ff5d108c4b7289c8964cb799a11fd4e95c32f608d321f5fd78264b80a1a94db38280c57e42d8490e7cc1b1d80811dc3bbc9fe22eba1f2b9b182be5477001dc657ec0f9fb0da86c959fcd4c1f8aa05a11b584bb94920f802da1084f4260d3904620fe0480d0c8a05e194685e633a6e15a0b21bebc1fc95ca0b940409b61077fc4e68ffbb5c2c61334da673e82d88f43b9648726934327d97c7b06bd6347729ebc3dcc23cfe4fa9622bd1244a41e226a1511c11b91010575e2fa0a07718918e26157e1bd1716f526b405625d0eb56b4290f361110a2c888cd662141306f9db01559a8226d5b7692a2e86169f2969c0292100bd65c2f09a3985e89dd55f5bf34752f08ac93f3cfe612ca519e7e6a108b140010f0841182a343d6f2dc99e58a5ba8374ea49e34aeba1a6c76028dd1024cad11df7803e94d46d2151023c47391e4054bc24772cd0df7270788a5017155eab68cd28309aa05a211a825e2d4d9872b890ed34956654219977838e53cf36ebb61ccabc44cd0405dd4737b8191059b550c064e35a2c6480499038d9ea2fc0f51c8b28fe6bdd039cb458be7a0e8bc4e472337c539ecaa4018a8e26ad01e34a25243c3732d4ee48257aeff53fe35f4253faa699f36847421499083f908a9cacc47853389b0ed09d8dd09c67e000f65bfaf80b7a0d44d8653b87a785ce3effa000c712243b2cf06b11be9f61a1b1c14d04bb566297069c72196a7183aff7f448b0cb7d11ecb7c838855842ace61d99996723f4eae14b08c8fdb7cf315a660d286a33e78c29ad8e60af08a84158048d797e411f67d927c977e15ac9c484d8a9cd476ff263e277e40bdca79a0f60a2469e101af43964170cf00bc0ece98386a3ad3ec1d234061d5510f75772ba3d49165058c84fed92c1630f0077ebabe722c9736c290e7095c42c76601fac3a619d4f245fad8f5cc4993ad376bb7348f5a7b258cd45e6319188e4f7542837b11b2409b1c277edc476cb1d577682ff73f751397a1d4389be1e3821c0868d9b9b395afefa8c1397a020e4715e38f80c7f6b7b57182fed4773fdf7acb64ea78de7c7e968afd7a5598081160eca79c6a34bfdfc69dcc6a94cc5fd097b1dfe81002733dd3e065ee59a23631e91d5f1bb0fa1f1cca61f6696648c202f82005903db0d8ac0708b12a3c0b395245288618b648ed8ee4d172d50b18c7b57ff44d9b71278d67c40f36232439d4d2133ae03c9e220ff32742a61a175e8e4b6be72edadd432048d118a39331e25bf3b32f70d98311a0b80856a58e01b26e8127e3c2afd04b92c7b19e571d7273a8d081e4c1fa190164201380c70de4e282240b93c1dd13a8773371c499977ca733fc2598d0ba12b37202aec8833a8fa529326eb776c1ea187ff5679bfae155a12ad692872f88cf9ddad49311755fc69b28c9427170da32632e0ecdb16e16684d902e09ed2be0bf1b38a3acd7824a9688fd9c20e4c3e083f8b8f66ee67ad48e53b20a0e1ce1a08d60da398d71c76ce1fe057a246ef60e42ae3e2fdf6640ea1a769c75ccf11e5eec0883121c6688f2482655a94091aba059a8e7fe5dc9d66db4508b0164ddce39ee9bcc0765e216f057a5e22b8653b28fcc71a141c4715bf4b62a8c78803e33670a633796e8576bd4361ed1a4b5e4b6a7d275e5780ea126267955e63dd2b17448ae716190c568256ab982bf878a425e1d80005b871b036cdb65d40f2bfd3e51d0304a04b3d7f0a64f78af8a21ace6ce7093a6fe91a8ab139178a7b0219699f9ae5278bb08959b446ca6699fbb0aaa618476247db5b0f27da6fc588a3854f4b6ef3b0aa6559a17356a4211d265292be007f7bc415e8af3579247480f450398ef97c583f75b6767a3c8030023d2de42dbeb4d5d8db9659b1f4df1f83a70a4709db69318dcbde2865b12638649e082d0fb0c617181dece8d07a75e7a022850758067b93bb3d8fe3b92530168e22eef0d435055d8479af4da65dcacd10603deef93363e41942369f0f6333a3db3f18ff777487eaf59ef48356eb2048bfdf53944540cfa2b9250cd820cd1d3bda5ffc582c5ca458b8ab1442ee79b7a7bd6361a64f84062703331c2de2abbdb4d7323496b02b0eb12c99db80695af102fca925c90c39ceb6d7b989ba16da9b857619e607504e5e5ec178fbadeb8ab942c1f03a6f07e007c7783dbcd0b75d079bfa755376b43b69471b3b136644b3a05eb790f5a82a2034f6f5dcfd9875f5fab30ea0eb2d195900987afd0d9c1ddb2edd4bb6c5918c674eb542255b978282f102e5f51738f5bb4fba2a8051fa7f58dccb9d851f2db767101ed77acf1029c36c08d1732b412d10debaca16e7bf01b43a0b1cc4c343c5e519a9eb3df58cf1acb550648a40c0b7a130d5644c2f9579365b91d9b0ebebc7111f309d5fac64f949e0ce54c763de6bee1651248fa99f9c1b80615cff730270019c431d3b4764746298d4ef35e0da843062b3e436b0d6c3ac56cebcf5bf8f38fc0400f92fb24affd37b261cbfb7213a0654ec7b88daa45752c6047c5bb117f677278607a90fbf9845d85465b2f8afab94d871c7f81990b9420af3bb7dd41df215a2ac60637edb18c184b832c38e7cd82c4d979524c7df91c58bcdbbc2c88a86028a771af29117a07d584495017d59a1cffc1538149a26c010238394ca6376e2a0f513c1719cf387d70e8605abd5dcc6def3f421a632fd6dc944a699d04d073676a0d030ba1c62ad9c3376f70d7596735a895543e7aa17aa5a6b9e7fc4e153f2dedff5b80109fd1de9bd77f3cb4c0ff992e121ed80d0357d3b7889a35c3ed492c05de3810e1049a1c05d7740c7884529f045d4e11c209242015db3fdd672301878c4ed136c019008e40f1744ef3bbd5a6fe6f94c75907c399268940570dd0339441c6503bbae030e246ecb0aec9a87728c184a0309b10e5a569f2d977ce092404b489d86a7213415f656ae23a42aac046ed1d289aab88e9f288b8e2186297a0c015b52f1b8f1e3c2d249d3edc62846e240fbc6f22a9d6ae7d2035ecf610e118d12a9d348e6dd6503bbe6e11c455ccbd1470e2242d180e63a3ddf4f8ca507c610afdfd73292e31c0d3b1a8c48ca576ef22e09b8d114fe42e43194eb7dae4d64f2092b220e64e16656e8c9aaf371f10d7af4c186e6b45588445ceabbd37cd8d4fdfba977af1ca6e21457d8bc091f1f0f2eb19e6a2d68a203580dacd3c7dd23b4c9bf854eb5666e81fc521685c53f23aa3b6d556f239e1d92837eae1aa32736d6690e1845e890ffe45db31fec4e2042dd746fa051d44040884cf467de2ffb57c0e553e4c01b85c5a380f8685246f27ae7926801f687d437cdbdd4931fba88f99a47d22cd6622a95c1f528e0c03ab71e9f7983d81270de32c274ab32421b9378369cc7477a999beb906aa1b1d16b4e782b75b2daf5cc0a84c6d9ab273cb0ba27286b5c92c6de8bccb85905ac1171c0dbf1829d3020161a3b177a5e06d10601fbec2ae4bce51d696e1a5ab74e89c33177ba04f0e0138c32706dcaa59a57a566496f3e8e35bdb5a5a76637df039d3604b21599aefa523b117c012ff267c8995feb3181a161e730efe741652ef6f65efb02069d67e974822185d9647a5c846dfe067a53292819bf0f540e79287f0cdaa31e508d2107c3d23f13471dea65b7ceb3f8f7f825c3bb1f1030256eedf5907abf8078bca086ee5dd854f812a695e02e90a5485006ac2872a9d1622ae2beafddde60293cd12913431a01a970551cf5433252e1aadf74dfde3adadbab9f9eb6ee2626e5c5362673b12627cb7e28b4b13ea1f9b77d7c892b7be5b858af13e00f541a7676871b7d7bf81be100998cab4cc1ad9cb5e4c62089028e23bf400e55430998cafe608b34923aa11e8832fea04edd69ef54deaddd095f065c4fb33e6c7d776217eff4b7364fab12309c037d4e05f71e82dd847722caeaad7f8a15be8cf6c4cb58761fe19d845dfd3b71f648a8133878cb8a7d7e7d68d6de109495d14027020598c5a0d83a3a48749744a3cd810857b93fd53c89a436162b75141a167bf66c116b4d948dd83e86dbcaa95d58a7b586855128ccac94db05468c86e6a9b85b729c79bf3c8cc8158752ee5ac3e6a519de91ddf33c130e98270948f9edaada2ed14232bf76ada48e8a2f7f9446efb34406e88ac73c777e05ae9b24c5b515c67a89cda2a6ccd95c05017aa0bea56ae7027431c259f6458acfd437288abe0ee306aa2c3a732ae50fcd9cad2149c07005d8030491515409bca5a878ed4f89f3e7664d531c499d4684efa68ead45eff65c9bfe9a825c46d0afcb2db26957bde64b5261b4ac31b8a1478b366befcfff942f8bb2d8d7d4bb8887d222e8ef97dab9e2b952fdca0b5d056be75107a0565e5a049a90299d7c7cd9a2d213b80c4bd9032249ac009e3c8fda2c84594d89aa9550fbee505318204ce07ff1e5191c3cbdf9e928f2d79076a913f29cdb65c9684bcd4a7a6a2fe77844818a645214fa2ca01278069493cdb2be9d6c806b0579515e2d7133d93b70046dd5419f4e1034bec38880fb2688572bc45b3b8d4e2c4d97db465b96787df85720fb5419e5cd27de283edcc0f38137a8a88d69973c777cf05d8d03a0e21b5647c427138addc885c9f0a25a294fd6ae4729f648057c7b4578482bd0e4e4a32f191d7725315b7cccf219bdaea79d9b34969ebe5560d541099d6d0aaec658bb22b11d5266876d026b93b5970d42cc24431f02f47d80da1544b4e639d092cbd38a976b88b81fb5e18a72e874305c8131bb8f6a6c289425fafb5f8c3e4000dda0ad0993d57a5d4c1696440becdeb6560a33cc3f39ad68dd3325eeee258b0b6736280adadfdf8a579264a1fe4896974bd7f72d0de52d62cc783efaa8faff36524d7dfa3cb2729681c86631d7e46b5fee049b0be04bfef9782147956f52d084a81e3618fc463855e5901be6d9c36a653d237a93c5da4ff2df8c90090f84bab1b9422158e4d84af3a2e8b2c5b4cb0f4790e706d7a752e2e00db84961870bafe8e4550a4ecb88291ef6d8d9dca6854f8a7045542bcad3cdc28ea10c5746da3859c3cf05e2efc23cbb1a319a57eaef80b687724f69dd6b0632d6411b15b66bf51fc46692d842b9f02b7f069d95fae66e9d59c3deaab93690ce83dfb38584fc93f4ad982329b9605a49e8b3e753669ea86a2d2de49ce3c21d827b932b91cc9db759d7f0f452f35786035f314bca0eb5f87ad551644eac5b0e3ed4b080913d6a343838274a3fb58b8770bb358fd63f1af9751839e6abc61e0e0c20052fde2a73fa04663f876012849e31420b73e2da1053ecd0894e7ad966ec911a9f3e49d990b3e3105e84af9089d8ee8fa3e35352c4655ab4d32302707304cdb4b786f996eeb944081235be49376f6840934532ae1b3eb525d728055481fe397553fdd4c1ae551c61a7f2dac36bcd832df6a4409ccd1542ede1e6935d2248ae1159306b20b0465339cf4f61dabba66a3974d2b56a26ca836716177551663245202605a87afd1c2b267e1e44ecb74dc781e13d8bcd9b2d6de1fc308b08be396859ae5a368b046712f3168b4d0f89fc36cbc9be961a30bb3480d732c15e4008816267f5717c01220fa213fa873b719ac66c68d6ee4f9185569287f06f826601c8d0d8b85183e09620148f8e21232a4313c9a701eb5c69cf9a849dfdacf6bc5a4df8bae5d3ea58f31fa30bd289a47d7cb61bf1b7715de588f2495c040d96b89d0ffc2699a0e211fc5147f0f2f99e06a3c8fe39b5c851df3c1184d961d1c1dc21ef97314214364b46ca54f64738f5abd29bd823178b680dc6ca0cce3029192592fbcdd74869ce413d0ddd1a4408e8d5f9ce50220912131d34654916df3e4a8ddafe6ebd69f7bc3a5adc85c01629189c92b394b35890083a9dd14ce7ae857bcdcc07b8fd837cd6b9d832fa0a777e0316a2896fe803a2fae367505ced0a93d0825e02b3a0d5b16718365b652869f555144b186ddaf84ed4f2398de40720792b5c2c0e975546ea08e0c4d51561e35a275955f2e44c153ca5f37057379352d252c47ab64bacfad070c5a60dc20f2c3d616d944a900cf55dd3239bba2b074d4b779d655574e66368136248cea26d1f3ad5d0c862c45fd1a12e7a30afaca7f22fe97f354d98f2bfd751cf8dab837fde544123fc62dc73ddd5f8f58fbe67fda5394a4d09c635e611c578dc20eed734805631ad8d195fe7e3b9f654cd45dc0a0f0a4cfe5331a9a984e53ce8cdc14d2eb014e52b6f6ef436d1407bee904e0930d022344cec22291b0c75e727a2ecaa5fd28c78c382ae7dfe6d76f6f24be2c787f8b0c297f00ec3f1a39274562b8c54531df93144acdb9a35e91dab9dfbd65d160ec8b24ddd693c0b8a8abb2b4d462e5bed14d6730282d5b3b30f27fb2f645cb135f7e8de5dba52ffb2442a1a3723c82f7af087a227187b6203b3bf204d6c585602a736d99c6e0d9a12dee9b5b810f36e4a044a35036f6a37a32dd99df16858a6c61c3538bceff7061ea3b1b715527632c94ad0ba392c00d440981f5f03e2282a3a48f400d4f73eedf49682c6c2119d1a183fa4b1ff523d08439706bd28cffce9202c8d7bd0c645905b696af3d866d470e2de0e9ae36cb9d482fe0097bf0fff67aa2860b26bc6862ac45623e097c08db8436685eb9d9cf60bde51f5dfaf694912a17ccf8b5d5626a165d060e969fa293283fa3833651ea06e9da9001d092905c6d17daec3fa5e9f9b3c11b49ebb89450c4bc591490476158c76ce4767f7441258d818777c05c6d86b461de777fb67408cbd28e5ee92b44cf6e35e343f2590510fa25a5a7c28aa72ea44694849f14526a0a5aaaca2b3cebb5ee67944967a512191b5e5362406ae706b45f6e2252246b98f200bc007c29d340acc1910945471450345729c941b77260d34dbb63938e8a20d86355b44f69d729c2d913e1f03ee1b7372c45e47c98a3547d851cfe313008fd10e3dd782690004117dc81c073a17e5d9a29b69aea2e88a9761a55565a5a624a71c7d2548ad3c9271a28556bee631c74bc21023d220bd72234d41739a0375978069df612d66d85105e9b8c248c1ac18add7b58a16f9c5b8920b6854823349a5db0d3eaaee169a6e2559557e649387583b2541f22db2a7cb089bd991c63493cc90bac4a849d76b5ee6fe5508cc50ee018f288456ecdfadbaf0f14803ddbbec400cdc6d827b82317653d506ac8558d54572ee2b128fd14d8fe43f7ff7fa8b5ee252088f8ae0a9c6cb6917681ef7a0598876fe2a28342b9b8c098c1e6ece29bacde31da176a8c99d807ef1dccb908a761af0ee0462f743702780b0558042027a66ca6c657fe80de9e509d4a57a7f27f236bb34a92f0cae46c7991c6332c8220502ea4b0964a7b78c9ba11700de1e64dfb5fc3e3d61d4442bc1543f5d2be7c72f62d04b0d8a96013e34e328cc6399c7e1034bbd504f27e04bbba1248b21fd538859f4872745f79181ad4130738103d520859a7ac38dc939be52594c5fd7bdc5393099a2b9bcc6b47d0216ddf725d3bf53bc6e67edc090c3b8155ca2f15ede8ba7372c5849f6e0d1389e61eb4a26ae6551488aef9f5bbb98ea50576f4eeba28f03e676c015a9062629ca389675d641391d70075f213699e80dfc8c297f8a6695e2d96df8758c785099c3e80c7ed05bd3e472b12566295c67ac3cf3bece93a4c3cc04f4fed55f5f36053c3f1194b8b6dfc43613bf26c971350aadce185d2deb0eb385b84f116956bd5c2fcc5bb9bc967543afd7c691974ec94c0cecd10d5bd46fe7fb5791c57dd3d006d7c4088025df82eb5b3c127bf11c956302b7be89208fceae7922ec7fde528231289d49576797f53b9d28a76cd251f46b046bbd973672d80716525c66c32e0746cbacf3841570228878780d18077e083066ca69ac0e6930820ee752f13a04282401851ba8401bbeeffca78d51f72342fdf4624330bf0cfedc83224ac30dd49e7c321561d9ab4c53ef2a7a865e7e4d77338825d405ff8f499450b5894430e2e88abbf15060e6f4567704db1010e7dd789aed46c14b92507efed873bff39ee142ac853cbc3dfc58c2fa91c33f73a3e1a92628703a03850fab36683bdba9c143a4918127cfeed122ddb5cbbaecd69faec8ab8ca93a657c099b8fa560ab16d6db85e61a266ab86dded47f6a3a921f458e70243f8c0fe13327069956e9163248496e1d6a633af210d5d4745358069942409350c466aecf138809741cac78c1e759de049df5394c09b73ce258091541e75999ed7e1754564fccbd3207fb8630f951077f880e9135b3c5832f09551b4c7222149d85305e4efe8d21572f067a82218582af1e8913f2346109cc5b4acbcc55ad39925c462ec001ed1d4ae87420c597cd9e1b55689f86f8a3ea538dde66d01bd8e863cd110e0c0361a8a65243fe03b55b2a14c30e1dc14c883a7a2c43e25fd9255beb4879bc8c13bedf2161197422dd892494203c0064b033fcd3cacdb8c2bd0641037d8416fa22684ae8297323fa0946a96a667c0ad8ac778c1b53e4ead7ee8d2a3a469f42c28b13b223132777d13ef404bb0b5e93507ad226352fccf099246301c0e006ab8bc0b3006fa345adecceea273274555f95448afe627c625fffc0fbe5532fc389d7e681d889016640f538067d9c21cf1edd90a43d622283b3dc3a1632cb49d45017f77d7eff3f5ab8bdcf332f802472a7389036394ea4b8679d9101fa37ca4c2f549d95f0c189ab36f923f3493328a8d68bd91d3786e9ff46da6749fe14761ab364a0a6ad721d76fe98b9019404726dbda8e49e4e98edebcd9a04b50c13523c09480e0acf9cc1752e3d53cfc391d55effc09635b514b85ae7bcbd87ed6cd466785e2cecd409814c5bead400ff2a8912f01ab4345d1c5143e94bb05f18d6af669137b2090a8265f976d414e9757ce0505d34416585ca730778f8926ed398059a70d494b4a51f5082b59f6c123e6f35d801245eb362d46dc7e01241848d4ecbae3fcd815393d82c8cc7f6daa8b14e8a8d389e5efbdde28460a9e2f3839dd552acb9d1e57999a01d16ba4722f9e6ba22b431f58b8be1b8363b2e73a3ac59343cd45412cc6c3a5f58d3a1ad9e2bf8211d644e3ba3707b90b5a098f26b95266a174ee28dc953e220a2b770667ee8352706b517b7631b7fadbef2d645a912fd938b812cc79d39e4d16c32280fdd18213da29ac68ad45dfed573996b4051d8954130d8045277b8904eca4dbd13a971fed51d99eb919337fcf8dd30061f6d10c76ee35d52f2b9fe724ced64e234fbac25d221f11b2e07ef6321be285ccaa12553dd86329c505c58fcc4897b0939b8d8f680bef62029b74b4b8c47de430c7ea54d4cdf3e1101c111414096c4adcb164baf82799f3dff7a788ff621bd573df860535c285ddcda60ca4d4753d0e0d9a684322c2c5bab4d475d03d4ff7bcbb065d23ee4701c0547f3782ffa201b0804590a6403155be871f9f21415f8b4ae019726c11ae5b7f21d24e02ade216858e90e89aac487a41aac4c5d77c864a217b00d8d2b4981012d67092c10f83730fc72fc80fbb7092f324912ca77ac4219469b3bd6897fa0609fb582c888d1882a6ffab5d852bad1bd8b140c2ac78112e93a4809a2623620410726cbaf4ecd3ada59f2b0796e497ec2a9939530ba6a1475471179e2833481271d38f30b59082a2d3fc944187a472b96cb2e27b91f2822a3b266c21b480bedabdaad7abf82761ee7a0283004649090390818c6b74253c92689067729e7b7fb5204c1ccfc61ff25daf37ef7447d8e43307ef730489d5c47faa516306855925ff5047c3cd2d8d120c811194a51618e83406bea8911ccbb099f0a50d22275b84d84f5424fbd998c32908a9d571eb0b1e841c1da67cb2eadb57831dbb8af4c32caaf6d8dddfd2b164c72767813d5b4eff1f842a8d8b626c5f9daaf3e1bbb11d0537adb89fd0c711e3a55345b4d33f44b68bbdf2a5579f53439daefdf4de59e2df739b530090cfb7906b7a693a24cd519ac3cea7fc67988d44eb69f45dc70ca337ad5c1cf21ba7b2e9a37d974896c53a01e53f05a8da87047f056153acb01ff570ebfb304684ac2a0275358b7f4d63cf07fd1fd0dcc596965b25c9fe191c3348ac114a10d98325310ca6cdbc2c56801e867eb97fc1a52a316bef89982b4bdfc7f25afd2a929b4bc3ecaaaae517fa3259518003c690a59c76208d25d1cd82d602f69e94bdaf0788bc1af65b899547a825a73d22af93d5155959f5d8de4820bc1621951a9de8b66626333ceaae83f2304a45c1af534951bb4eb35923010ce2676a15f12145a2072583e2b10eb20360eccb9f8f6935b7c58b27d269a4cae724013031abb9c7127960a7faab6fc469c56143e6759b00fe00a9b0f0159badf5c7cc13bb1cd28368aa3cb5cd96237c8719b8e9a2ed1ca6e8dbd852e732622b01e277ec0aee038a4c870a24f880ca71af767027cd22f1dc927a2caebcbf5d9162aa246c7b18f9470af8ee0442b5741c3bb84124d9185aa10b7ab4bfdee01373fb4fbbb13fd8472b721d64ac069ac0d551a005e59dca20b0d78ab8fe4c2f427566fac27052f4fcf8b58c21b78428e0012ad019a2679cff0ae41c91b8066a2ec680c2e550265d4afc8b2e1d28cc7a165f147038e64583cdbe2ac7a3f51790cc0e10b4f5b9bccbe1f7e34d0edcc60d36bd62dff06cc9ee2041e4d5e28d01b328bb7af50e66f25c2e10e9f1e097f4989903f2eddc479048f04d190cd762afa540fa62f885a7f130195ce114b8e3a2c92947de8761a8b7e7206b0a238477eadc2b94caf6b6ee7e52a72f35a786b11772f407bbaa82fb41e5b85676d2f7e31766e1b783eb580c408fb06cedcc5861032e3f587d30d34f066dd76db3576f104894ae8d752587bafe458518426fe03249992028edcadb945d2f2661df866ee7f9aeb79b26c968b497a636fe01409d65dd6989818baa7b9f10e65142448ff04d7a8964ef881a5d6c334a31fb122b92098c3ae636e6d75b539c94f385190ea68898c962b1e89ddd033cb61f261fe84ca3f259276ad3aba38d8836aafd8a541c33a5ef2f1c309a41ed5aa01a6de8ccd0867fd78683d2b6a4a1953bdf84cdb99a951929f28fbc170958b3a70781d872f7849c58f336cd56e0b576b1acac0a3f984704daac08054192fdb4e1df367d228ee2b8392b5cb065f1121425f17695bad16352f6cb88f28581cd0eaa8d76b99046f63ef2da9a00ef8a73fb9c4b0f5d9119d8355265e6f050518294b23ab9f65df3baf627edd440071646fc3b04f2f767fb2e9c5524c5a50089d2acefbb70a0d22dbbd7cc3899b9b569eda950aabcd9726eb4c2d90442e69acb876d5a4805f17d2e96bd8fb4490a77c64ec350e81d4aebc794c83ea7f66c74ad6c6f17faf73c01e8a2d722319c292be637fbd3e4f1764a42928df5bb23a4da882015d995265719fd7bcd453bc5322c8bb102e1464c47bd531ad0e0524def4b83ed8eebe71a9d2d385d3110b5456bf8372a9aeb8e5ace575b46c8be3574db3dd7a647448685a89855ad5e6171e005bdd3efe5c983f6e367e23c55a899e4165107de9c30fd35b73d1700c7e182b911f75b858651f013b8570696423174380215213259908315ad497f13d9b165f9a4c4f341707caad3caa4c49c921c59b8219df41f666dc0d3e752dd34112498f070a86ce04314af4f3b1352b5281500ba77bc30ebf9c7fa45bb701695b8f9f2e0b13cb6169f6ec6758df6961a7a53dba655e1a53fc3168025a8f6e401fa60505762968f2b0e01ceb03348ee91b0247d8f33a2cda46751a6c3cd3dcd2115a3464feeff63b8c9bfbaa1e2bc13c5662c95c23d73542f87601d9ac46f6f39db6a9155395e6dff7bb1837f31821f46e990d73ad5b54a5a9766b2cd6abd19600b04815d950beee2593d590fdbed32ab5d25425fc3b7e0703376da41452dab1058e34f7635cfda382c2aa461e26ef7dc07db763c932be26dfe288d6a4aa83d665f0ef7ede851f9884f5431cee20a419ecab12ab91084e48c20507285101953a5c3719f4d6866420741d84d87901565ac779023e3e5391df88b6afccfe7bcebbe086b9adeb6b6ba363e8aadb633c374c9e3e35501935084e4ebe5012022e4b40eda83006f4753b992ce6f2f78da6682b0a28e5bfe7bc8b63407704dc0d84ca69a021bb1a041e830810c3a73a92354feb9bc430a899014cbc915610721f1d9b92594c4fd58274a0a1e970d2540b896ef8aa71e310e26b661bbbe7597288874d4ad9491e2f04f17a923f2a933099ab2d39985c2921541f977a336552e43cfab39242abd72af8f4890e90ef4080dc59099c7882fdf9c1c907fbef6ba854d616a20c5eb807410a5760f121cf4f86308fd15b9cda74c8f0a6757b8f75e3fa18dc944bb0371eebd5cca1a8d093917a89df544a7cf0424c40af83e23758c328f2a172a38cd40bf2579aea7aa890da49c3feaff55882173ea6db9180b73559bca8f748904a2b27a19e8ec24e87de92941581a3c5b08f57350e33fe350aa78dd4d76a5facb8e1c2b11f21f1ad409295720da9b6b00269482b71aac99f032c086491ac75b8868c9101446f3996e109985becb5065b626644f7345c681426d817a55388bf900619055ac1d6621f066889f3e0fac51b6d3f27b28f4e0b634fed1ac7881fd3a24f0ba570d549cdb75b3118fc35fb93c6157b11e6b0918269f7e2da582731be3488992f8dcf2501d1ef7cf4d363c7df8976bdd0daaf82561e524420645bc096a41d72cf9066c712b0c05fd2d6042b35a0d919a34270357382773d4d568c2b3e25389c7b58829818b56d0483d0033add26b701e2eca20d60cbff7126516c0ed43e4647ef0ef665c87af847b934dcb2390684e1491a5459060ef369fdcbff3a8843b1de336b0db06963a503d2a519fd805805f8379b5315956b7eb33f412f53cb363d75266bf2e5c9de55e0161a1fdaff7771b13313d8486fb44eb7260a25fb5c724cebfc1536f4628b488fbd0d36bfe821e8c5ef0dadc2c7a6bda3c345a9bee2014f46e0e482c2abab590747949f48fedfe211173c3ac74dd014aec6bebd84e0599fb13b08e1e13602151e08cf7b6da23729193addd042e357afc82979614da381a95a4e85f6bff7b40f9c3ae9c584097ddb40d544a0878543b11261f8cefcd4611b5b4769556944f42da51307dafd239106401461931fe18742ab517988d6fa284cc1af287b572420684d89c3095c65ffc1fe03a122671d1ea7447a73d1e174d02bcfa4d930bd2219ad80a56994cc8af38f9ff88603029c4095da2ec431f8501f9ef8fbcb32381de0679053af802cf559dacb622af6827cce67779c48e5e455fa78458103e83db66b7ca74e157203a840fd5de11ee47d57bc0623ac41bd4852104d9d9f971459382e2b06d4fcd8ba41de736b73bd812ffa5483dc6ec6932473be6a6dc0d27fd94d17cc8c021c4b46849b4a24dd1217f4b63e51110b80e160e434e97b788331c4776174cff9739c347cf86d4fabcd037e7630df2c5258d363f7e34046d341adc63b84de0f4e26b7f8f8002c736d65b19d4ddf57f0b82b18edf59294fd2bedf80e5c0c8d4f1d7a786663ceffd920f7e8be93bd3f00d488631c96d05569f5058e37b98dea0aab70043e805fd65e94c748ddf7fb6969a84d068bfab202afc9ea2e0571d9de93af3b9951566a4bf1faa79fd8a6c5d039540d56cbf61f8462b36260562fa13704909a1ed40bf6ba412e6ad37b7e71eca70b52e90060a3c93b9f1262515b6e9660056c3b38b02ddd492df2d669a34aff094bd20a848e92dfe4a1cb440f916ed59457bdd4f1aab599e275242de076b54829a0d6e589c2e8b5ebdd3ee262c81b600b320dcf215fe0157d9ab591fe627c437ae7abc8d8a647e3c7e023cffe2cb4951510501169ee6d9b5661e84e43e2edf8ec42cf22fbeec64613af60cd861b95c72f8dce068eb8d1c8a9a221fb4d18523f64035a17d95dd43a93f6e047c98e512c40bc9913bf6169319b162be59256ee4f9bff8a31c99131c8e19372434d43bdb2a93adddbba3c1d19ef50ab31f8fa85264b39ddbfc8603a385716a31ee6d27959c71cbc6f6ed5a4f507cd69829e592d26809d2f871c51fb069d7e49e380e5ddf5d4a9202b6452f98f1daad94dd054a500aef353b10a71e517267ce9a1fc1b4cd76b9f93477de4b1c91d5549d86870196a3614108a12284befe59a76b8be95728196ab0041e0d946053a16cdb7b1401409cf59d244d829706574748a69e6a3bbecd0e30dd0fe75b468b368f32e01091a4fd09c91879f6ba8ecbdd936a8b275946406febf01e277745f6c9312b82080e8e098d7526c185785c7ff817e654026d4bf340c25d30458674e969f1a6bc1d2c9e8b1fd1ccece71e1af1454317154c5618b6ab13c7bd00412e91ce275e4c9720dccceca7e263c83b760d331bfde9c29af5ab007c247f7805d5861c27f49a8187ae14389c6c68fd873055a371303fa8f57aadb71f7438d007eeda2c564d18e3ea7afde056ba4d9039632822e0ea33234c6c495f8e6356d0c1b57ace02cb252cb599b9010297d97d966b38c2881be93f67d5c2cecdf801cd29932a7653ea2b45f0a77a584a89b0c81b70128631e1b9ad99cc7c1c0fb767ac0c52902ebeebf514002db62cbf4cea7ef422aac5def2e149b987a51ca7d2871e1a10d074f3a452f3620843062527b94fe508ba88e76fbe203accfadaa61c088884b0071a924aa26d2e9f49965170836f02b228b3cd2f57530077749bd9e8e5a7599c11d8638cc2a8dd9cbfe1ac81f0336c5a6baaaf47529017cf74c39e8b333940a205a8d203f639fe4276f54633ca2ef282d40e42dd4d2d7818c0aef526b0737bf886bc87b16bd725f83ce6e3023404a0ced98c788bf2e22bb11ad16af244cd7038272dc1100b96dca0012893fcdbf18a232b312404404ba1fea6ed6a91dbf88b51650c2133a0618f69bc1cd75530fc6e284252fead21cac4353524a3def11a0126942d9db2cf76da0f785d0fc501a9ac598633f8869e18c7f09143e1bb3a5091a62a66122e584c6623abc1a519694c9551ce49fe3025cb40cf2ac8ae66b83a483d71f1fc502807115f7f2070c51486592a2fe246341b58253cb697c3310171cef4db98feac50aa971915d202e55fcb6c59b2417145fd72d0d44bec07a3df3f3c54e339ffd4129e2a7b110dbc9700faabbc5786864ab0794e40bbc184b71ce722b221204ba433dfe923cb2f0c387047a663c309bfa7a5c390c0fc6fd87f07123a1225d1afb203df9db6c33acbdee92c2e28f2c07cf21e8b1d9d48b18984c5405c038a9a92790de1a627d59f132c3cf7614b396756ee93d690ad1396a7856496c928b42d4ea350c554c297254a3d0b6cd48db2f29bcaf76339aa5eaca3f874b25a0d1c9d3f65c98331cc95e6fe1c1228d8dce178d3f0535861163d5df049a586a3636f2815dfcca26e338457a6b89a3306ef37d626545d4bafef143c89e5964bc01b84f100be8c0b745b7f4773d79ef8232d5a2f36b4b596f4c401dfe4a5dfec53b116042019bba2792dbc3d5962420a2d307676e4e34266faa568b0906b495d97e14f8178e8663f4e1d492b00635a9c5f0e2002a24938129768800f17e2c6112e482a845299e669f894862e2c16ddf91f8987a2b659ac2d9c7312a4f324a1061a5c11b72848b063d6a7599de478be9f2bb10753dd983b5e726c10b524f685315af8b20bacbee02075d10398d81ab60b02ae52ef11cb2759ce14b075dd0d22d32120c4a66487533cae9599b96f4c63e07345421770372bcf782e8aa271b8d67f0f9582c77465ceea09cd3724656f483d27056ceb94647a37fa56c1399be81472ec719af40108ca55cc3ca083021d802ce38af87964c1a00108f66f568acb715cb7c3a0827abcab33747b2ac3a1bb4dff1f0109893c03a1a0128e4f4f55be04bf537dbba8ea40291a6bc85bd27feac3e6bd24159a57e3538af88ce8578a6bea5e492f575dae917069c0c7e6be4d891b584e729b65fa41432b3c8374f3ff80d991fe620488650a81a4cf8968d767f4259c6c250c2934a1f9877bbf5a5ef96ef5136f19c8515b5dacaad470fd200814b861645fc2d0f051387c0e283f89ecb773b7d2bb1c3a9c909699c5151dd74811681b1fc1b71e89838ea7bc4c47ca0a05aef871c6ccd62a18f5902043df053ba8a2c1eba645949a5d6fac726c311844a29e8aa16bf32f10bab9f22a514b4ac0073bea48066c0df0c800c656ccb89b6f09ec5f0284a29602a13032d2f32ed10295bb62e0a339a756626bb160ddd94aecda4c35e3332bef594851d337d74761e78682df1eef44735c138ed11f4efd7a842800f3e245b7f3fcdfd3a5be3fa98c3d8c3a48db09648696e66752c12d03afb755bf0271d198b85fec584b3344f90a3834399a03bbbe300527a81a8ed354f2ad5b878440cc65fe533987086a0992ecc43ef072d5e37a621a58f3c5cf22688f21838ebe9df4237ead8e8455c89f68b30666681320711a8fd6e01f46b65c5522b90d2da878f5811d53325f5e2602c8545037f1081d8822cfc285f53ebbea0d5389953a3cf032e0f5762e3f2255378ba91a46e57a3d997e3311131eaef6da6f1cbad89c46643982af4b3edfbb75561172c945c625d8d8d06f24d4ae829aeec581e234a6c79017b380e3ff0c147ee4ad3c57a3f8c123e3c0d5f40301d9784264c6a2051b63b8cf0580c7ead64571009072344601c882d472018d3c15624e90c2a33865bc686d81112416430088ac231106e46f40b74420e746f85b8010ed6f48bcbb02d558c1ca8fdbbc3782c3421131dbf32670c877df5291998f667c9d69c215d49d110f53c58787e9ad313cbf1e24d23e42a4252a349e220205fc3c611d6c60c0b595d130019cb60d8e7f748f3110a1286783454a2d3aff6f3bc4f0ba3d817c7f9f810fe382c02e49af3efd7987c84c2e6d42b42e011eef15018e986fb36ad8d9fd281917ff9993f6f5fc228ec348ff18b9d4c54c5598e8783a95836a3dce7c152554292e62541cad57e1f8394a50936248b6fd8d0e59c1973cf9a8057c13126e29aec06bbcd819d614ce742c984d8230587aa16f22369ab1faff3d52a219dbcd3eac389367d41dbe5d0583f0394ef73337c56d3140cf79c71e7a13d9e069dfae1345c81c22f871ab40cdb5ff2d46908cb5d5f9ca1877c2ad801e3682aa68018ea57a72190ae35da6179d64fbb526c09b859c0d1fb1e9bfaa2b2941c7fb4e60278f05f8a6435e53db4a4a85978038757139624fc876a43713c22a517bb98c47030b78114e9780de2f1c0996319af006721c82180e5023c87ef1131a3dd14437e480ec0e781d6249a48d018af18320733c78ae99b95e4a9dfe02e263afc00bbcbd6ddc5392929dd7479c95d8c76c9d151e19828c1721f006d49d0f1677feae83847b818893143765953bd435cc7d140b606e31307176b263aa87a6ebc21533aab55f91677f9247bc57accd814bb5bfdf6f321399e18d2ab59403407d4a0ebbd50656e6e7ebeeb710312fad348af81c90f4cf52bde3ed8bc6ad10dadd1a355f2b3e806bbe8854ddd68db717370c9eaf06a53167c7765a7f21cb1db8132f802ae67776dbe16078feb52b31280421b50629827dd86070f2fd1684fe9de9820bd63791c4cbc84a445c901a94796834d5a0457cc5099d867537e63827515b4da364f2ce45c0460a726950c46cb35d194777c66d0ca1cee2add0017fe76058c1995af5fbbe6d2c3fc985135ef57d725e0f150320bcd978c927ca6caca601918630293620d9daf797eb15f08c04a0226ad054cde6a664e41425892fc569e5919888937e8c2f4c5b849a60879e734447c194a596b4ccdbaa1d40cd6adf559c22de103299cf63a2ca4d9a112404c4efc6df4347709e398cdd550b1ee49e01ebe2209013e2d7d1e78ddc671bb4f96d46de76dfc55d5b366b0ccd7174848a6ee913d3c7ff62457d33df68c142986538a7d8c552c4d5e160e0888210ce97c71101ded37a90f6da492e75d3a5271bdbbc76a3e5c505f6e9d49228f09219eaba97e894f4aae1904096dd2c65cbaf302db44eb68304187a156c6c544876fd4161677e43a30fce6fb11540f4e4eb2d1cd5228c76c36e49fd7e416c6baf184ba6daedf6e5c0600b17b2138712971127449b87a618db0e086de67e97cd6acc8b3ec4fc55c713e4b82dbfe745228b169b6713deefc045482e44325cf27a026571917b14a141e0c5a9f1df00b66918605843b3a86bbe77db1b4290ddb412f82e23f223d8fa5da6e5baa4b2f97f1e690ac5da04d0ef98a02a9aa2c2dbd7851b7e870a22b19648bd7d46c87e78d5bead3e50a2be71c67d89310632bae41cf0ab540f29d022c1bf20d77d480f2de97655f19d92ca7a3928a8ffe15a6d5a060a795600ce37161446745ef2a6e21389e7335eef1d247c315a07fc729a826a90df9687f60b392232c44f67f9393d80cdb35299e4416f3495f9b0fc248cd8b50f7913d171d892f4ff2217759d0c062dd914f7b800d149802ea2152695b601815a70dd9dafae9fb13007f30fc03a0a81b675d82aab9be09a066636a2053b3e1fa4ee24d0fcdd8d4b82397679edceeeccf7c6ed8f8f16245a830239df15671d8ca345aa428312ac2cc2028cd3a6a9b58a395dd9b48ca4c2903ae067c062a06d961803f3b0d60bcf3702c1f293853bf28e0735f21019fbb0b08f8ec3ebcf8eca71dc70232c2997ac6c5e73e02cbe756420d9fbb092b9f9b888d63b1dfdf3370a666993ef710a5cfbd031a3e77112dfa5bc6b1646070a6e639c0e72e81013e371005f8dc2c50f9dc31b8fff53c263893cb388abbfc9ee09e14dcbb029ee15f8e63a9a4cf0fc7bd23b867847b40c0fdaf07ce4f3e3f957b43b83703f75e80fbdf0a1c10c782722c13009f1f0ff74ae01c189cd302eedf8033c194a3788acf6ec7b92738c704e79280fb5b9c09d6f0e058aeef97e158b037f9ec6c1040430ac9e73f11c226563813dcf913c7029fce38caf78a9b668da3f8cb096c595e096c115881c09655e4e0265963cbf2011b8d0d07375333b62c1db0e5dbb2e5d14c617f1927959b64eb862d4b1bb67c63a8fc1ba0f2970cd8b2bc0bd8f2c5fe305ece8b9ba48c02b62c13b0e58b8097175b5681311e175b962c5bbe35ccf8afccb0dc84b14c5b96a52d5f1a582d78dc84cd388aff01b62c0db0e55b80e6c166b0bf4af360c75e5264b017ec3fc39655f8e778cbfd09b06539802d5f942d8f72b03f692505b0657903b0e5bb62cb23ff932dabb84e5107005b5631bada96ef75c2fe9f922ab62caf0c5bbe316c3ad83f058c34d164cb2a46f7c44683fd479bbc25b67c4bb63c22d9b20a5c45354ec861ada00c0901fce892906cd97bf06b2cd21ad73b533e50cd4c999c506b06314ff38547247aff591da193c3721448cac820481aa99233b708a871b53cd20512254ff26595b1acb0a393f3f96cb97d648d2b9d21420d8daa5f2af682c9004b6128ec64ed6b4c73b8d0dad1a19997ea42c2b5ba6a2e1a8aa5d6b85ed7e9b2c12573a52e540bd339c2d3da91b231a459026b5543c24fa3332ec5e91074a503213345d01d60ff1c5be05c4ad39917d2e6c6e1ac982c498a131a9c8b59f364f71138d319ecffc36d3861bf497180fd230b6ed7d019af7138353734d89d0d7e6e1202f6168ea569c0ef11308d38c2965be097e1d00386ff4ea0e042787d6a041e06688458811030303030303030303030303042082184103d7af4e8d1a3478f1e3d7af4e8218410420811240c3ff0c5b6bb5b46155cd72408a838742cbd8170ebe05477921b85e1d7006068ca294ef0c963015b08098a44dbddffdc49fc6e77a4cba15c0fffe4c10b7482a57cefd5e0bebfc11dbaf8c3cd0f6713c700c0be651e1c8db7f5b5dde801dbf060f64e1188eb1f849d7537ec081b75794185e3e588ac8c865c9cec6e24c94d313a899f5bb88cb3f97c7ed198f45f51d6657ee4305e989cb4daec03ba21510dae2425254c8c4ea0304911830c2a5edb2cfdc7f5c47e86b4acc01f9c26c5dfb218ad596ada5a5157d84b735c5152de0b75ae35d2a6fff85500f6d2200669466c4b46a26cab46e766daa2ad2edd8f4f8db4497bdb722c7e5f8db5d69a786badb52ade5a6b6dc95b6bad45f1d65a6be95b6bad1dbdb5d65a6badb525de5a6bed3f6badb5ff72acb5d65a6bdf5b126fadb5d65a6b45a1b72fa34b38aeb7d65a6badad6f2dc83e4916c3da13294cc81083898912940a1962486172c28425812a3961a2c48a50284e9828b12114355162e9458d4c94580a4295583a3fa8122596ce0c052d9dd0a2482c9db0a21e9df05114093ae19b283aa12834e9843572a7459ac3a1593fd89026c5d9a0eca259fddc1d5daa1f3fdf13b6b3e98daf69291c6bea43993639cb5970c65950e52c1a92f7f79e3639e4e12972da0451281dd40eaa85d32511903641952a88ca4675a3ea9289f777549b208be52996cbb07874e91669136cb58cf4f88e9d2e95acda145128162a0765d3a5f9feeda34d51a5ea1faa06a20a82fd5ba65fda1459ac3eb11ac5ea544f97de9036c5566c1189ad224642efff68da7449bf64ccf581553fae9727d3c57294f8232277480bc774b578e8128ecfdf784770f6fe321cb5825219a5b8249835612847893840ef2a1c37de11fc01c862780df6969becf516ca4db4d542b5502d148e1452482164b98952482185b0e5262ae545b969b65aa816aa8552b969b2582a968aa5c271ce38e38cb1e5a629e5bda8d842b949b65aa816aa8552b949b2582a968a15ff62b949aa1c25fec58a7fb5e24b796f0bc7c7506ec25a8e125fca7b5bf149b467a37213c67214d668742fc61a5d19df41296ccb04c5896d2bb1d91689c42b3ea256099296a875929960952061895800b05725a2973add6a092511d14b9da2707c8dce566bc6ff498225baacc962e1f82ae49baa3ba7caa7ea4d158e2f03169aa83b27ca276aa270fc18aeabd56ab570fc1451b29e0e8bb5c53709e2429cbd46aaa654b9545d52f5c94c8cf4e06844a2a644b9445d12854114d767a7f1477338d31a63ad560b6475022a3471e6e62773e1c87171e8affdfa661ccbc3d86737ab41bf335036837ebf8bbe31d0bda3d18b341d7680824bc1fe6aef098e054642d3711aa7711a1a1afa71cb01b4d9aca5371d0fdba75fadb6830e91c7757129187e3a8ea53ea6356e2df70963ff9ee0581cc67a4763ff8874093e5623775e6794735958af1a05fb6c25c94d313af911cfcd4e27f3204d7a9942e33436b8d7bf2e82333dfad8ff89139b890e88e9df0061daa44c3f94d5989bd5f170dd72ffcd5aea77dd6cd86d07bae9d04e27071d76a859b17274a4d63eb4f000b013e2830df6efac9f6a53cbf170d65a465dacf6d19c4b995fb54cc30b995d17e89663c5e5bdc0ec35187b0f12b3196fe35afa5876436f36e6f6669a847d8e87ebf67c6c232fdcfc649e4c97e863ff7cbc992e3dd557aad1fc8ac01810972db7c0fd2fa4cdbd19e1fc53f55b4982a5c04e66c0bed260a1e6341a7c12dad3691ab0975a8e8767bc0ea9e2a6be6914ec3123394530a642643504638d83b1c7faa96c12f63860df60d8cc5ade769b843d66d2a2e18861d86603cad806c10c0caa1013038fc4c0bffe5deffbfdf3d183fde30f37cf80a1c4598c2adf61eda349103f178ac1e531823b6ecf118e250651702e3ae6b1802fdde43352de51084200b7966912f51dc772b91468bcbfbeda2c6b797ff9e5ef7dfdcbdd73c4eeae6b834d82aee350e0efcc503e7182826ba3bf659a047beb19075b373b6bc6595dc269d3a74b19d6e01955ab9ca68b74893efc36e258ea7bf8b9b590bdb54fb59c6d996af9bda7643ca67da649f03f9aff6894144d631a1a29eff591ff93fea4bdc78817a1c2a5a93aef08b6c1e761b4ebb8e9b3e9f8bdee4f72b0c8cdae836a12fc1c0f3b0f67653f393c39111ebd23ef1dedbc60f8a39e9bfde427f7f01dd525ffa669211876901def9d2682d33736455a56401c10bfec86ee2036f4100c9bc6a5c0c7c2b5e19fe3cdc860f8bde32667390aec992efd70208e25f6c31ed4a7fd75cb2fabf1be63eef754d6d2ffde635ce60537b70ac3cfd9531ee3325d72978213e9207dfd9f8c525c1227d290c79f8c526487b67db40c8ebfc2f05bd5a50c8174093e9826a134d771222e053e9e2238e6b9f0283816f0e1f348c11da81e0ca11bc1101ee152e0e78e01865f4f94e0e6a6d1b91e7ed374118ee5ca6af43f22bcbcd6f1b06f0fa64950e6f968d2c438e04b3509de2881733c1486d190479766681a47810f49ffa3d1bdf09ba64b411c8bf3076b66bbbf5ff65e9a944997024ffd2a34fabdfd5dbb34ca852b6ddcb0716d1045fbc35037183dcfe0828026b8f9e22b5e287fe4581a5ff17297db341caabfd3e266437c7fb7a1072ca34b0efbeb2fa9e1cb41084fba3378e23613f8d0e5b488de2fba787de0c368e79c730ebe4bb984f8a0bafeaf97d1a5eb7118b99410bb275017be638e45022e74cb1b22b15a6ef11c7c41b6b08a105657b51b1a5389c9c0eeaf16dd2ad89dc6c30a6e0eac60b7d9783f576a566f933e9f49f8ad73ce39127c2729ef1d8dfe4f27ef142bf86ddf241552ccb8702be058dec7b7806371383f1b1c3f6ab905bebe4278e167d3a548812645d2ff68b4cd1cdcecfefdbb806379aefecbacc831e0f74a545e6681dfcab1889f53f03b65f8bd87d26e9987153c0ac275f5441037bf158e3dbc95f66e9a1457efa10def7bd525f7f1df8d9430c3a1079c42885bdfd587ab8623922ae026d0df98e31cca75d1805bcb2ea7456bc18db81137e2529e068dc0ade513b899bccfd0065fef30cc9e8d4bb9be566b5d0a8c28b8aeebba60bfcbaf0b7e841146086d684c37e852f0d420961ac4a3ef92952112212f4070bea7e83413fff7d224f7b74bfdfe58b4454b3802c3e0030bbb9a232b0c5f7c5ca3f66214f2e2033b212f31b8b3e71cc54f841f0afc541a3f15374d87021fc28ff07d832f5d0afcf872e1bb16f0552a7001c7e23074d0615c904aa552a9542a954aa552a9542a954aa552a9542a954aa552a9542ae5022705774532370104f9d79882eb6a8ec06057738407ae1952f302bb1ae962666626c5b3fad5e05c489e1efc7ed6bc482d4420e611e269aeb81063f0fb1853465c0a0bfe802722351ec383a36a1e3b364fa6c7e5b4a03533dc9314753eb8ba812c68047eefb0093d803944885a11fcfeca70e801c7873bd0b1dba00d848133ad4ce033a481043e432222f019f600029f6110dc0f631c8bc894438dcfd087077c8627a0f119ae0007124a70a6779af1d99be080cf1e8596cf5e05199fdd088e63b93b70a6a7bae1b31761c3671712e3b317a1019f5de55842dfef4038d3cb61c06767c1023e94524a29b51f4b29fdd8a79f3f4f2bfd58fa35dbb2fc2ae1572d52ed6177779f4edf7cd3ad0ea5f2fbff125d57f429e51c624e39e99c33fb39a7fc7c6c566badb5d65a6badd7adeabfe852f6d505ae5f83abf66badb5d65a6badf7d650ada1faf97ead3734e99c93caaf9fcff7a66306fbb496eef03d871ee1d31ad3e8506e4fc6e38337a034b373ce39c49c736694da5b5f5e593ff2ab7c9a633ae59c739acc479dc68348798339279593cea7534ebf445152297b659f0b770129af2ae5f522cd2da01dcbe95ee32b2f60889c84937889977013efee6fa24409090991bbfbacd3a9fb67be7fcedea5679f39ad3c6159a73fed45ddddabbbbbfb8abbbbbbbb3badd43feef5baaeebbaaeebbaaeebbaaeeb92d252494b32b25a2ba5959fec6369e4905be449d666b54aaa33e70d289d52564929dd6c5429a59453cafaf948abd1f991f323b33a29919d15d90cf9fdb1ce39e79c954a0b6964a5524a29a7a4f15d832fd28880525e5e3b0711d59db8f7a4dce4f62084230c6345718bb8107094e7423e16b05503210b36c92140011861e717e3161f5cc55abfe1778c20ecabebeea62b163b17f31f7e1f7fb8f9e1f734a3d1362b4dea7e3cb0f8f2e27e5f4a4a308c41718bb87104f3b18f2fcfc57c2cde602c1e4106631f65a28f4bbbe102bf7f66336afd6c4695f223099c49ca14602cf67031606c7b8131af5512fb86691216a3e329157764f1e53ac1f9314b8cc91d586e19ba63d12f218c9f1f865a94946e10ca8669d48f9b3d85b1cff1056328199f01c6de633cd5a538b31af1db531ee332329b11633cc598c257cb66410663234759515121a9d48fca3bf7d8b9e877b8b6eb6959817340785d15f49fcf67f5e77d11e845d94ff91784f05b7eed77fa517e8cfff9f8f4e9fbf531783ec5b1c1f48508fd1ec291009072af72af7a95a9808264a741f9e8949d66c5897c3efb8ded1569db3edb68bbdbd36d457dfab99f6e4fe6b39d642d024051c172af7a7569e00ae94725dec4676962935b2695d85ca3d42d378e2c19724936fa59ce8f0e88e7df00e1f9fda9b57e566b1dd555fd95aeb5d65a9da6d6876bad9f0f4046e35341b566a09c7dfdba01206bc91ece6fe6b36d598dfa93fe7c8d54a7f6b0f4202e057b121a8d8d07c1a560ef40702c9aa4f21e7b45bc6d557576a2a6d3a54864e7b31950ca7b7dbc995853ea0c366a2a9f19c160ec637cf80952803de481b1afda09fbaae22f3ca355af1c67397ad7f207187b29e53fec257d1d10677f0384b3efaf1fcd613be77cd014cde95626d72fba647fbac0f36b7073ce39e79cb3f19c53b4653444f3ce09ead57dd0cfcfa29f2ab216d1a6e3e1bbe587412bec9de6ddc6f4e7497777777777770c598cceb41ad9d3af33481537799046c1de8938cb71fcc66d2aeeee7e6f9721a3511b76bf68233c19222cac6b7d0477e0615857717b3215c6f0669e8fcc698c5004fbf9de7157b17d13a3573578231e17eee8c1deab50dff4542ebb1530d618f32218c61a32c2c13ebb0de8b197d9d3cf0f08c69c2845d632371d0f83b6ec5d66830d0358ea88f48ea76300eb9a53954a06294da4aa8575cdb18aa608acea926f29540e84c6249b0121dc566e7a3a4fa73acdd3793a4ee3586017e1434a56ba6b5ad1f1a62e9f94fd3a20967f0384e5d3975d92f54f6435e4d7ada58ecb3bfa7eaac10304c1d81f206b59811f90ea341cd0e56812e630e736179782053980ad1ad472b856075c0af6371c0bec8dac4a8a55af7a35c2d8087e3691b5f8b6830eae4bd1dddddffad36912f64ef31758712c9ff7afc149efb75918737777ebd45face6e6faa6591f5b226bb9361d0fcf4d6ed3bf35c72c78511a638c31c618638c31c618630e5de241e6022b8ea5fefb175d824fe2b30ac96752c9e72ff17964e2f3358dfe7d0dce857381df8f34a76914ec4d68ae514a68ae4b34d7249a6b944681efc513198d18657c41d3a5f8f2f3e7254dcd56226bf96c397bf9f14bb21af17a321a0fbd6a12f6243413fc028880b957a32edcfe1bfa6dc82d6ed615c1d8e727c3c30936b9f1f0e775407cfd0d10bedebfaed46de5e9ab506da50697ae10f921231c8cfe8b36f56aa54bf2492a4f1abd4987624f29a694d62fc968d01754053f198ea51d4b378f76278ea5b1bf288be1977f0e74d361d3f1f067cbfd3b3409f3d7d9c9216bb9b292557193d3380af6a4ff3af8f14e1d1dbb8f07d59de4ebe50713916fc24809f708d8b9112f10e04cd751b0cb5a1c671160d73fa0b5428b1dec9ccc9c29ae5e48708359602764043db8524be98ed7e3d212f58ef6e1f5c4d56ab57a3c24484a1a2612711fceae06c6b579419eea87ed1d29ec5a5d9252cb310971c5c3f3483c3c9f5f10fc80705fbec4318438e312c48c8b2b2f61e25d9746ef3c12c1f17fe5fa3b49c5a56cb1c20021846f872b61f7f2ec10756e8e0c6782a1832b851e7e035c893e2439535c3dcf48baece09fb892e8e14357ca1e4208a58417842e2bb7723c979470e5f19dc7e557a8e5eb6ae2eae1c7e3a6186d1e8b9978a5961fcf9199d19647a32ddfeb64fc68f35cc49ec722be0d8e0f572b9e1589edc2707194f871f4d936f8210d7baa853eae62cf73016d1e8bf8a3d883e3ca797ce7b45aad4ea753a516a76f643ce531317baa897ce7ba09a660b8099edc0467767c47faccbb0a612824c2b22c240a61374d8a8f27c795ec17c7027a1f707c1c0ef3810eb8d2f5f15d9e0b87792ce2a38238bd1ffce5c8dbe1484e0747821fd21ae048f07de5a61d1c0a74930c8702ffbdf0ac7446bec3da718e44379176e2482737911c0afc281d8acd69e5a4e2e08c73970d8deb0a7d7e186a212ccba0086226a1ab99843ee432214f39ec318e25f4f11d06ce534704d1f11ee43811717e687e28f4220bd26e7018f4d545a43d9ed7f3c0d031cd820622a74bb0127d7e3c3d8e2566345e74652da19fdbdc5c9a145f5623f4f7abe86e2ea0d08b6952fc3c1ff4bae0586ccc0f7dee17d1837e6ab746e845a11789441f7a187da748eb5593425aee246c7d73c287ab03e21baf85a7e861f48912dc164fcf8bbbe1829d4be9acc6bbf1b028a4e570291e702811e60820744a80231870fc1c5938e6df70c1f733082472c9e1581e0e7eec841c01045717fac1660876b8074c8220f8043b212390c1a2c742a2237ce01076428e40e12a4d66883e943d9d966a5f69f62e5d027d7c14f46bb52fbb41d4826533b2d00976590be8459b494b63d1ebc8400f38f422180d722d1cf10487be529b851eb4b99ed0e692831b7a79abb520ede190c7841e861efe95cd083d0c3d0c3dbc01c2b0033de05e893ec78b01730f38c7875be7c0ada794cdf30226e28c6e6e6c419c41c731c125c10921a93cc9a55162af7ad52557d373d38f475e2eda425b16800d15642311d7e1dcab5e451a40179b134008f500c72702c5234ad783637e3e700c3d1e1cd0c5b1cc8b7d5cc5555cc5555ccda97da6964dcd4ead4e8d4e6d4e4d4e0d9bda35b538270ff3619d67c22809b708421ce656304822b3a196d89292ea220e8e3f6484736f3cf562053b79ef68f44f6a1e37037fc495284f9ce30a6ef1a649319e48c1cd7006fee852f6fbf1e18c8c3eeec90a06ae9a47973e1fb38f760a24c071e7b1889f27166df98e4623288249d80919810daeae9d7bf083e2169172535c394a7c49ba2aa3959ab85ab50d6e23700cdd3816876f3894f8f123cf8359dd908c14213204a786b48a71456594b5acc0d9af1ad0374d1269399a143df5a357f17148376f330a02c49148ffb1572e2e257e8d39b88d839be30ac7f82f7e5cc59bc8722cf3634c028e479c299e1ce50b8ee7b980a7c7227e9471412a081c7f108944d8ab348906f6224c54452012242422908804e861b409fccb047ee8455f2b5ce188598d152e8633999444f0e3490c283e979cf81c2e25be48736992c9e60187121f45c9e94486b36bbdc413176012753ae15a1ddc874538ee93f8ea1ac94fcdf540ad45b2b934296212da0d172cfa99830bff7a971ca2eb619803e21b431f7a99cd801f0a855ef4aee361d1966d7c669ce02c9e4ef0e3e9144f109ea07c13d90df3ef75dd75d75d1cafcf02c0f5a1167a11111cdaf20986105f0d841f8c7129f241f86a1f9e0fbe5a8693e1ab5995c557abcea3e2abd11d8aaf366d26be9a6c1989af86f560f86a57ce85af1681447c35f8502e45beab390f2e453e8c96e1f86a8d41db894b910f9fc3a00d360984ab9de722732cfae388742308f767584d6cbfcb3f5904f87af11e48ba033f806041edeeeed7dace63390aa4d1910af74a8912328217ec6a7a782e76353d3b988718369051e36187b80216cba5bc978577702ccf3609738d82c1f0b1ab1f4ea38cde7df24517dcc78347c83649033b5c0143d8dae3d1a51e4ebe3d160ca56852fc1d70b842a326c117dfbf16bdc21043e0e0124d8f4fd287eb536bfff3554a19fa7bbd5e72cecf3e4f5d4a29a55f220863f5f9e42774879873ce39335ba90c65d7d60f952ba4b4f4124118abcf278798524482a4a4842c314b484888e46749ad0e88ebdf00e1fa9652fa1fea745cce0aa59406991ba8d4eb59ca821e2aa29104001316000038100c068442b13ccde254911f14000d748c46725c409405e320c9611c478c51001802000000000000024056034bd03ea6b9bd269469fb26ae6cdd77df591d10eeef4f8e4343256bcfe26e0e26cc60fc8edd0d339e811c36ce91d344a066afb58eac54e877b770d860c40c467171c1d128396f191057db038ca661a133fcf06a6035a4f74b4cd42779870b4ebf66fea96e46a185451cd2923f27ee660214e1c6f94e4d91c48c91424aa02ca73243439ee8a510304b028b4201389ac03214800c01cb6a7b9e00e486aebc36a0acb61ae2f36f8017005d4d1e65399ccab4f0fa4e879999c8203f93e9a51f124079573b1aa87821828b69b7c2baf8e895e6dbc9848f3726d5db5bddae3baef3d95c2879186aff00801156374556287f3e4fe03c8d31aaddeafe6deb47176c3cec31aa995e217c0a299a793897066cbd1fa70becd6ea095921926d86f49ab987a70e68ae574791efd78e3460d0e542987f2973362e49e35b5f97928745d7580a01efe20295b2362edfc219b24c60081f8dcecc1ddc129c9718ce7a68cbe99e57e116a910a8bbf4316e11d2ef595937eac02062cedb2bab88590d789bb5e496df78476c9bb0988d2391696bb70ade314f4a2b09a56756fb95909b7a3804c7aeb2e4130ff009b1b5a92b51868de47936e45662b6197d01657347c9db98375f2ba6a240e75b584c6256684b174b4c309866c18c495e74d4c14e1b31a14c0a175c1b5d5e61ea99005678c6427703a4cd11114bf91ee8b10372117bca8cf4b3b1bae4d207691639618e90e963a29f1b6560499fcc55f1e65ea9aab2dd448c0a2238698192b938eade693134c62a5fbb92f45c6db86afcd36b8cabfc060c59e7d4147272283afba70d7654121696cbe63711353907ca0103309eeaa6ce42c99e01df90d2e4625b1398bb8de2baf2513099654acbacc6ce0cbf50338a9acb7c28d1dbe65b98f16ade92f9814e78efc0f30ba2c79aacc8854570e5afb8c53d0f2faa814930cd31ad9ecd86a6cd8214869f23f5d951b3bbfda4f764f81180f4722a0e31bcfe3e88b9674a6a5b2e3dfd8f027beb0d2aede18a15522fe112cac4013ce6124a6e9071ec1671a4a127ad5c69d8c14c1efe249024f1b7f5907757669c31936e4f0d30e06bedc78c8e058e381b253fe01ed45d29af149f43f26801543cc605e3c77f528e4d7c7c8ed3518c82ff8d6c63f849617d5c0c8d11ebe93630d15be4cf6bb3797737c2c459f85e01311daa2326ff3a3c6e1e1755b8a65796058aa5d66e2673c95328bd9af7f07ad58260584c782795da7cf3345f277367e71f4c5a8f80d63cf267075569e9904e66449ac2b19ff159b9a5477132a9f50568ebf8638085df93f29e624a597d77bfa9fb6811792d6b07dee01792496777f9148023ea7ab1202eb8780448e8adf64ed6d9e4698a2c86f95201f93fce30d6492841ebe9f69ad25092a3516b85ed417b39d01cc55418aa11c5a5ec35bb9a2cae8377b8d46c578f975cf6986c735b8b1c0ad16886f02ea908bd0a57b3783d7b782c0ba46ef387c99634c31275de9cbfd2f131704a5fbb01076eb08f14d97bca6f8dfdd83ff7ef8ae67e3c97649709235c4a933e83908501d1f3873a0f6d2fd1bafec13251231f1a81d188e7a2a87ec6c2595bba24e7d852a7ef2a635d8944710103543c755ffdb0a281d93cf814d0c48367c683bb1f9e5097338d3cb0002edde546eab5e49f85bac0ce8d946bfd5a1454bf1da10a231755996e3f0d3de8f51c89bd71cbc8ab07f2082c3dfbb2fda692761cf1d6b7334f1caa42a48f2a54299aaa45c524a446814c9685dafe6a81ef974593c91f593070135d0710b588fbdf90c9edbe8813ce6ab296a022242379acbf5c4f083a919b1c3e1ba7b914ec1ddf40ccde4cb070367e3c438847e18b3e1bb5910afc82c797ec20b3eea2f8351b2c2cd7fe359b7f31f572124cacad007a0f3995854f53da71689f110edf7a859ee2fd001d1d8bbc644dedd44b10a6ab5e64d569ad44717075d07603f273ce21c37e573afb5a5a051dc6c56c2e10b470335a3513159d1318248f46a0c4fec0503ebe2b58f1690d9f6ca605a12c2257c7e26658f95a7045806832a355a7e724d18d0a2f6aedf2e1f23dd605f20300864b4be4a6751f48cefa6ec22c412ad935f8aa786fe9da03e5b0dab19d977bd960b60f617de1cd3e70c74097b81a24d1b84630049e14b814f82d43d12d09bac4714727c17e3310e0c42894a1365bc02d3110a857c48ababc56851d791caf22a08f8d7485b33360aa4dc06c552568036e023bcc11eaa0f09a23a1162e35cae8f2ef8d1ff749743bfc8e40701e2c865c347196421e7e031788e0c3e71513377c9e10c570233902b6edabc1b4fae533432ba9abfdd3d65257bdf26b01846864d90d5a8a73e10bb0e1f67183ae8ae2811cee54a7ab8fec8234066f869fe96dfc903297cf659e959f8b5ad0225cb67af0ff7684b851f7f933354f5ff42e674ce5fe10cc780e28ed3ecf7a4c962ccbbaa88bfec259f9c17c087445b602aac67971552edea8493e315775907d24bac5c819010f4f09a3455cc3543c4812ea2cdc4bffd6300b62091c4085acbeef8f3d0c61714e13cb2381efac33b69684a286686887c11f855a87c1b21f32ba19af67616cfbe1a7920cb3c5833b777d387571ecedcf079a40575eec53374c5cac730a21553a1541c7621a6c921681fee4eb5063aacd0cb0341765e44228cf48092bf555ac3c92205a5637fc08e40b7c25e0d7eb49a32bf8271b8a300216219bd169b186127752cd8d361640d142e2032abf14630e9ac20ab41f3c000018d4b8214c7cd5a4e1fc73829e9e10fd9e8b2e1dbb4cd607de02adde650c676de66f05b3ce092c487725906a6322256655c56475426e8cc5d3fbf9b863b055017b9c0732f12372080e853933ebb358018983090c2550e2912309ea4d01a2e7c8eb97c5f52495560b4dfc891299b46074d8297c8567bb9257b950245d21991766b8eeb4023ce9fa5907b8346af5318e5b96452bd52a7e0285161c99a67ff49c237e5ea81a686269c9c55da8daf28fb894283b0ea85569415fce2169706543b45d23f0030bf8bcda026bc0065da5b29398a91e0597df827e345d0e0037f75ce02ea3f4ccdd5704d084e362ce6706d62d6f2467502909fa522479acfca2cd007b55ed6bbf63d8933284c8c940c54b86bff86058e61b0d2a1f4998f36c3c86e11d19c4033819eb2cb832cc60e865806d7f6604d786cd88c8269d019a4d3f23643b840610fb8f8686dbf6a1347e057e1a4690415d10cdabd1dd1a9bc5e9908b929cd6fe5884814911d323b29aa1b9aee09679c32a02f6b93dfd2fdcc3d7155a28bca2dc6b23db7fc0c4a7d7d121f2dd0619d6e53dad731782711e6641dcbdc5979eb2e388941cec4b719fd2735006832b30e2e5e9a2a27ff66dc68a23e5dc713b2846aa5c4cdf454a39ae0c5192e90b76e2b0789cb9f1098ff3dc9493ca1840c347363ae0d077370b1d6864bbd18f552a3536327cda2d4a870e270280c9250a8831751267813b9b1cedf0c859c8c3a1b2107adde8a76c7060956295c07cf658626534c7da45d9cddaa73d2a1b1214d97405f1c0458f842ec88a734ae718025a0760ebc8a71d4adf540411e1c1dfffdb06e982c455bc9551235b81e0c33173a025689cb922fa961024a4415b760dd007001ca8db824531bbf48f95fc8e1cc208d994565299340a3155f52138a8964afd417684e7787ca7cd71e6de5902fff8612c81d5889351afe37438baea1526f6a8f4964fa441f1d30f2e89527af9053a5cba0a2eb9300ebaa69e025d9d9f8af31ae9f40aba39a8039dd4a189d98fef01f693b737f6c8a5d413d0216e89cfcbb24d620db1b7edf4d7530afc446a41f3e75177cf3ea7a219290ef477026db9bcbc23a7de24cb972754891ed75012837ea3beae8963c942f26a1063e098d8a024ced964530bb889d334731e261d1f3e316820ed377bb59cbdae281c40a4fb2d60292bce3c44b17ecfe8311a3b8f2ed88c5016754edd3e77ae9fec44741046d6301e8972b0b6e6342c2c6619d1805796f75ae099aa3598dd95a19fe4a52b08063f0bef44ba598bce2db90b7da181cb56b5f595b2d513961030d1c00b9b5cf8adb0e418a9aea648b6d072bf29ab5bbb622afa094bbab213130411adb56c9f6b6282da5efb667a7140bd67fa5ba7111224cce5b2cf576cab06437cfdcc4820db09f36903302e0369986cd9864727563220fde6042a81ee2b483e30467fe8a1426f5a94878b032b88a89e3dd62ba889c8d492c0f11359a10e87d11a098bc0d7f84998ac048229812077974a9c92652c1f2f030f706a06f7e8cce9f97729e72ed5eddb227f3480438dcf40234855754f2e945c34cf0a7be4527475110045fd729def10ec83c4be815d6b22fa5190c44813592990d6e9b073e57c90f21c7cd702dea982de6099f66cfe0660a733d7268ae3990070f7eac5b077a7de4f09d8819a78a11ea5802ed7cc62bcd242adc22d51c83010ca65c2691984e4bd2af8d576baabf28fc277c2597b6b43327bdc612dece5978430d6d581eed5b40555c4ebda8b3f827994ec2a3b79c3136c56e06f7cb26d46bd118c8193e1a0fc21d01a7d1c9a7ab61d4cf51fd1666b8cae788594a0bd26ce3ed0d12d159476433392a72b0bbcf259ca584df03734034baea9b2fa5f775c98e107e3455360c8eb6a9587a962c4f059098dd587169ee532c8ce197d17559916bd24883a271511267db030350201ff4ca04d9461c1170e9032c72d04184d5c2ad350949fc5fa54c85eb0fb2a99890a9407f79a46df8012f66639121947e5addfab4f32a70949127dbf67f590d925d51bf7e122b371e0a0896e215023dc907d3987813983648f8120816deacdbd67da75f7b53213cbda27024178c8e64e5ea71adb29ddc90be2e90d6f704d88082a5f380c0cd0e4e260ca34c7cd2c10662d0daed0e6d9b8ef613e62beecdafa01cfba264d060a67b696e172f61ae970d95c1d26370cacb495ebc9c8ea48c0658ffffd75951c16fc45d6a2e4a326e8922eb9b98bf42e2f1a0c68a80d0be45f101f0162f4d5b8b1d17348be9d5df9a5e149c0f4ce9b15a54958c167061affb011503a94c66446419cd806b839ba813ce01ba06e207db1057b09473f0b3c75d31149a9c684b4740107fc81d4a43cf4d54b3a5253727273400368e7424723a71ae79339dcb45c1bf282ae75e72ccf89b9ebcec5f79350d9c57633490313927adb3b468f752ade7f43f9a673fb36ea357ce6e0ea24b40b67d839b4b2cde955b6e8840eb5f4f104e3eace4ec8700f365438ab5805e896ce447e3ea2b4c47504d38e4b02fb62cf22f33088c9f7767d078d9da55eb77546c6f6c7acb583b4b5b01f2f7036de3fff65887c4b28c85fc6545d40f7801b7144a4596bff1dbdab0bcbafb79d5078b7bb15f6e73a9e1090c9244c603530514da8a7eb48e068ae73850a12f5656fc193711610669595e1edafe4adc782578c13f2b522f0665c309ce048cea7f109798a6e0ceaa409f2a162c530dcd7c7a4bb7e7f9a685251e5b8d32a48f994f23b24962f3ee518e9d361cd8c7575813eb850835ef8fb1160c88275a7094d8ca82320273621ebfeae9e0925dd787f32b53710110f296d3b66768192f9c8c4ea02fcf6ec024260025f4cf16f52f98a6a3d588a6ebebdb90d9cdf4c816b7b5af813d7e2473c7158b48aaeb8f11c3d7788337a00602f0811d50829b0b366ebaebf2e27a1718db5df895575c13a211a56567194729da3e6452c97ba80a7c98be80facc1f96f95d8e80b80b389dd5b31284722166999b08b66620f46e6e4ef5fd7c1440510c07b201bb4c81406e9b6957be0ec6a0e9ece5f47917218ee24a81e7edfccd6149dd81794139a8c8f7cf278fae251106369c187c42c3586f17140ae2cc5d5f19ce8c42212d8b29a6a0fe4f2c203b10e175ca3829aaa5d8ba176a2133832a9281d2fc0287fb06c3c49f3b6665fab933f01bfdf0c69d930d769892bd4d855b377df5d9903dea5a4125db9b225174cfc82a38517e51d92b1442776fa52115990f505664c2977e2d74f8e19c25cf64d48998e4ebc20042e81f0f8881d5a8a52a20b162f48f29fbc4c6c0a4af28a776fa2fa3c7b052217c93f676465030ea7d8d86143369e8a4f39e81a32c64427d69a7b4e40cc4073ee957314050ab415a3cf85417c4ba7d2bba68042f58b2b9a21624f462bd9cb91057ce0ec577bb2b1c45c2596f0c796ba0f269f409cba4e45f6a553ec6885ed3eb92dc97534c4739d774299fc65b0bcbd75fed8e7a06f4c567928e1a0c5cc4e5920b891499a67f1aac9c9014f86d9fe16111b49e826cd86acb6e4d8028a0036f6450cec88dbbc8e853b1f28e38809a23c4ecc9e844ca9996d6d255b0d94355c436e7e6fb43bbe5f1784617b4bb55298e3c36208d5e4b196faa957fcac9a9757cc29eb295caef4574658a9b1102aeb7713ec633dd22c699f2fac3d8532eca527b4aeca22e24b1099c1b0104205bc21774b4122f4a27b41a810066acc61be0ae3c25016410a04286aa527ddb6fb5ec817cfab5343a6dc1463f9b98315ebbb882810a38e9b9a3d7fbd558e8aafe2b6da4551eb45b0d294beda58baf6f1ec41dc03d22af791668a6105472d37164a951898963ff5c638c807705d9b6161428494249cb2f780431da1b71f3ffe62d00f245522b729232666b58850cdee93c00a8324be3ee45b248396bc27ceb0024f330a9742c92542c5de75496d504ff954831cf14fe2c5d2dcad46c3582fb67ad81c27a4688e66e19dbefc62502f995c248bf4c0c4d57efff443e139d4e87c1a5f9972a9a94d11679235a028069ee0e927477ef93420173bc39684f9dfc726edae2d3ac76547f1247efed82263cc2ac2847f9130466de057850f4fee6cbaba161021f97c2f2e76fb2d38387d4f345dd01889481fdfda3990cd27059279d54582f2ee93da25f6e205b4e5ba773ea0e183f3627daabefffcad35ceb0f2562bfeba5213e58f9efe787c4640380d9a24fbd4623509401676bca6538403cd262fcde8ebcb26f771d06bf9ae5256f5697a156256712bf5e910f3506387bdd97a6b3f815315abf0fd01d25a7183d6e011ad1ce45ea956c0ebb3d37e93ac2c6fe1a36c67a0bac4e25920473172b49fb580f4c4f02ddccffe8278280a7139125da84a2298d31a51cd664bb5b9faa730a8b95095b0012aa0322b94e86c82dea43f4c6b5c7a81bf59e1d1a42ce6981f2914ae01e1d108a5d870a1fdc73c5c0f1ec4a4e034a4b84655297839cd8aa8b70b3924e6ab6168ab01bc31a7853cc0a65fa26a89eb4e011886b8556016578597d8aa78a1bd5a8637532c311630981c8a9cf2ad31c71438a0c4237eb2d3cc822a1b51e86fdc53f2bca144d94be2303da2abf19387b850e727031d46f0ac240df3cd64fafd15023a89175b913721c0017184eec07e7b055da3f664d1f3a8f6647fe15e349845c3eb05ce57fece7f52a9c7f859165db76355c1657e3e1a80e745b2c65853accc73af5167f447767dd67feb48ffad87867c1cd959888a929d9250e88991156e1a7c3ed3df990fe1cab1153fc7496d57a2990c1e24c13af25110962cd2aca517425078e918a44a1120a517ea7435a842e5eee84d61e74e12dbece9455dc63605e4bad055274e11ccf5099d86f9fecbcb3c0a0ddcda88d8c13b17a5d8a8200e5b713e98b5f32df4189f59db8638c38fe6f26bc6970be79565c3222858c6c79d2383e0887129c04a191fd7daf8dbf2b4a7b35dacf2a493195f8ed7bc223a20d7a2480d2965f791ec793e33aea12c90fd102c9a5cdcbb8a236de243d460f2d8f5d8df55b86a20c20d9dee622de5b28c4eca1c75a0ca7e4a295ee1ac7ee5fa3921a94f5aa60d5be96ff0fec8b3b5e1a71aff85bde2d0e80ef0f51f8cdd024cf0d557e02bea767145837bc44fbff58a0d95e326c80be262e34fa00d9708e3ee11b33708262164772adf11e6816741f41cf52876f944503748a50274afff3e1819c51b86085899fc87bbdd153dddb90b19527a0f41f7625e92a3a6a19aa6c7bf591f98dfd3d838b1fa44aa4735180940fc294818cf2188f72ed4d982c1baf38c24ff964ca882b68001d3cf1f30a08b4463b4646b0693074b07fed9d4cda0d0db2b765ae40f2dd02d28b8184508df279205bc95570db52370cbc5f88191c425063422e31b95047c0c628dd961a478fd6e8702071a3e482bfe5bd8ba885f470d9384d3da4ad31a7530e727b9fb9a271a03d901ccfb9a4797fefe3a96264e8f168d3443870b66443bb6b20f0382eee26f0f652e90098ee04db74b587934970065b2adf3ef8f95dbcaecda6c5321bc5a3227030481cf3a788f3764aea959feea39b2663a37c15ed9bdee1d8c6c7eb9639e475a4aa4eeba0c173d329e42bfcef9c9d671780a855d2ee8826b7d9f1ae16dab3ca615e87060f0f804999545a79c305fe3a08bd30fa9ea5c9c96709060401c31884be6041e394d564f995aa666303939d33f585c313513812355e2ed1fd3737d4364a98e730de1128f37e9a8a892fce24bd2428a0175088fbaa40c24939feef117d189f17edbb5717815d9a2ba461e139691b341b17410559aebd433b3b35222c81e423fad94cce7b9af6bdc8563bf9279e84a6a2840fe7e1f07cb100ec3e220c4111257088fc9732c45a20c16e620e64c67e24a03b5edca7519c6df30ea1a733adb2291ec816439d75dff54906728f3018061ab7b02c9fab9320e0d49281b47f07fa0559d8775fa69582c99311e22652aeb0c8e575dc3ab7adc477b3a1a5c4cdaa004063ffb4ddafb7ac463b87ce259a0b988100d4b54d266348f0377b102add0bb6c1b9b164fd5e8d2761a9f2fe674871da0a6f722859e04e447191aa4ae34ce597258343dc363c4a7bc9319f137617b74b5822f0d53528f41e7e9089049480a8cc0fa98d52563c47aa6840be7608d8302088f44d141af7bcd48de130011456a7247da9993b7d9b13979aa41127507a54a4c0700e83e9436ea3a8461c0b63cd0b8509757b3e01cdc87fb049c70b65de2d0f2911e53cc2c582dbc07fa2ef3d78e8ce7f5c3b6ec62b01e10d7141044008afec6c1faff229c902094bc77ca070ccff526d8e2dc28ef5a3658b75ed015429eec08804288cc02e1eb91994844b512838f05dd6832fbe09f1e1f96c6b0f615385cd3944ad5bcc3bfb7caa791f1efc18484bab63fc60cc4e0ee756f2538aa8fa4ca0666c304c1db4f3d0325544133f38ff2aaa1d5034d167e4f2989d0fcc83932e8251afdf93d7f206d3d12999e7856c945e16ddda9acbc579ba53b0991ea6479da9c146090737dfe7ae48a6c0d7b2718ec5d85ab841f689de7a8a3478362f97fe0940423adaa46f39b212de99a2c86805210f32411da70664d00ac0c612a0678f814240e5ee39f55e9a133d9c095b86893b7fb8f3d53e9841400032363f217cf67663fa986224df95150b2f909d882ee7fdc10ec10bef025ee707d4689c87988919c195eb9ec373cc953777e678230882523e70981d51c2b151ebf0c2f67d9a83835686f8f9fc31af19a8e0a38ae6eff662c154aad526930fe1fcebf758a328b20edc847d71c7d8f18531648ac116f65273218719e2a02e5fe699b42ccb05fde85b477b7a7ba7fc21ef059fd5f090eb1abb7b07ba2393f530a5b512bb59db60719ec7e43de08b59e9dd267c08f4433ab8f030e0e9fa96649aa887a96032f08ee01eb3a8cc0276bfdcea6759733df5474a12ab59086d99bc4db919999d7b91191db5ffe3673cc68a570aaa8ae0ad7f32669604b87a820ed02ab91790a773918a3f2d09ce7ef8323628d3d1b37c32feee7389506caa7ad815596ce16f97098f41d408c029c246a12f36c63ad309f5caff3aff43f9b15fbb9ef499b9be5e8b906496d3928852b0a4dd96c3816e06d5449aca9ecdac4addf3d01b45149497cfe50059a7eb74285a6253658b34dc8f46c2087106956aceeb731ac07ceb52442dcb49006608edf177280dd99010efc3160dd456cdf84c393c49897392cfda545d04142248dd30ec9f08090f3c0130104242354b798c3b192d9c217d39a0fd5e1781310be2e3435e40f370cebc9c4b9a2cb1521c85082124293882f8a179754e131fd9e8eda5107c3215d388962f1fe84189773f515f359cd017a33d900f268cb78845da4848217a484391dbb3fbd0bc8781c40f5c2ab3b2105fb8347a3d7f61ca429a31f1791dd7efec3c20c33f12f4849973f5749fa55c76dd562b0fcc64e448818e22e8e03a1a701f281413b0830c53406742e612411640f828b1794334e720326d5363bc5b197c12a9c59840365d92e35268697e286c6da3602d55909f438ecf98656294ea685e4ae91eb6cfe5658a268007ef7233f4b174a8f9ac955503a1d925acd2838427bb4e87c9a3982f3cbeeb08ac75157b98a3c980e2885fc3918d5841826fe685b0abeddf46c995f6d234b2b6d78c6e63504e2715713510f9db30c28b230535c1de120ce79059d87a344aab556b701404753ad75956374111543699c896a866fb276e856e7d5a221bbdad63eeb2633b6f58a5df696581b8e1d9aef839adaeebb8e5ee17542efa288b96d84d09bf0a07d94db698260faad0e7b9ecfdf1c589d54be660e30374743e64cb58bc1b767b434e3feefeec55f240e015abde234fd6366c422285f42779140c86a440b940c175894a562476e2866cc6f192660dd75d76e6bdf1915e8101d4ed5f1d20a10dc15f5b8f7ebede0d0ab9d463d3bed1166f9fb02fcb44c33fbe2952ee776135c5dad7d4a5fbc93d0bcb20ccdde5ecbd99ca7295b9e129ed080febdb0400b57bbe0c9539fd5f7fcd11dce460256c55242faf04425e32b29ff98b428122f2ca3da11d266689829b8bcd47ccefb371765b5aae0f04e0a76a469d5bede43986db5df291de800b2f69c3bf1a28fee27d91badb115d8fa2c591a76c862717e1cf2e64e036d8ecc5adfc1cf68dae9c519268759ce21e9efb28888e8d7d14c36035301475bc39fc1968c134ec2f14a0b4cdb0943ee1f1c564b4a55c54c51302590e0392378befaee977c34ce189c171ae0603d99affefdd5892ce976ce44a63318f98bdb1e7e1ab35b9fbf6a21b5553919f00002a235a7f36279c5e5eaafdd32076d4f30fa86feaf87e1be60a1e64d199ae0d066952e0970589c54872d5d649372b001d2d39dd8ff2f8d858611e22b1133fb742c63ab83a04f9fec190646f630633ea11e287275d864ec276f0b6fe299956b29ca1d0fb14db9a0f958a1de82f7e03c0d1e16099d02f989f001c96ae6f501aff5707758d5f64cc51f2c0df3125fd38995457eee8ae151826cfa2955d8bf73ad21660d2190b2e92777b38d9742b45212bee7387c1d99d44767637ce94d813c67c12c93debb2504b5edcc26d4a16bb4d6be11d63e12aad925a7079b2dc220b22ffacdf7e92874d8c6bf6672b28db9e0da2eb39fc5268233814371dd5ad015051eeff14df4c132c3d494b345a32db8d0079e7082bb7979cdfc9294e7c59217d95c503ee319117483e2112cb5166464f1c13b23aa567973605124c8bc7467355bb6e9d4690133a8d1e2683c4dc9cafcddc686abee00aa7a6463e288e3e26244863dcf35ea0a8cd0c4851cf27952fcc10269e9db228ed1c897de400e75eba2a3c55e05d0b61da31439983e764c494e011cc36c7e061c4c49b0718a303feed3941e587f83cac00fe232996e8d06ebeed0b2a866d66298b29c2dde1ac75e81c2905556a5a28f95be25282a9eeac2d5f2b6ca6d225d4b42fe45d5ab7033045f4019b34e5343484a4397a102f22c198497d4c3418057bf2d9858dd40b97a10143a0c842c4545013d2c25607756c7a40da61236de1106f861a5a815db9636f36f8dc8ccdcbdf8a3417724edb86eb8beff79ae1a714e6f616f524a422b47366e988c37851667fd0bb7b5e4b47a6310286b0e0e31ae7190c1d2a30e688e29b763c1ae515f2cab29471f38a28b4de7e1ab04d16848f1ad7284a436bed89d9217c887d60651356800cf4a63fe868a5725df28b9e5206af4ff31b14c6ac58b3116c58b4eb0049441766ba9199fa7ebfef60f0a4c66613635361c660ed8762a09a9b8338f6a06c2b156245971daef4af4a93d6af083e52320dcd2bcef676ac2a9640cb3cfc1455878146e7819bc073784744b74e616cdd6d066022ca4da5c7546d528052745dc074524ed8001e1078dd6053c0087cce57f057653bcbd5d6e4ec8f3e2bef5286050d70e9082a7e5af1d04ab9155d1a27217d892ced11763f64121a66016d7169c589cd6f2e77ddcd804faa06c5fbcee35a9f72dd2b3561f38f42e6cefe935086532884faf4f1b1ce2ec1991b053e62349d19a10d20313cac86b20552e6f1873be2ad00bc32c50ea3ee0aa0fe9841023a0a125b18218f615952f2b56f01d3b3cc1ef357ceb010dde760d8f231fef7c9b7065fb1ee9f5054101fd2f88b4ad35244b858c61415c1ea0bb1263bc875be328f5650587b56b4593f547f849815601b944f5380ac03d3f8e0b845923127a8f47191c858579c796267040225070c72583ca6c6243b895ce2329272b580434903f99a4fbc17f415b123c1cad06a4894e36888710c159ee7a7caf408725173f906d4d88c6b1e12208b9759ecb2cd1eef90dad733e6547b1ceb610c95c396d63c3b1861c5c14acbb90667810a03e6d0d13ac6c545a6c40503f5939feaf3e71e3939f264ac6800229b7ee1fc4b0470c6e49be9db4a8ce594234d48f33d3b0544c004d3092698997842568cc98979b299e8000632ee299ce14db6a8d4988b7332e04a8732c7e68e012732160655b0b18768131649eadebb566f58cab3a2ae9aa30ed947cd21ccc109abdab9ed0c45c02d805bb5c451547889f00083c0cd7b7c57d4dfce9077208844cc23b770e222329cc759955507dca85c119ea8f6d239eed290221b0dd512a423d158c4a7f2f38e23ae5835e870a4d0ce128ed83d7a9aab2d90d703b1c4a3091d22ba654626782b63e07320f66731dc817b5391ce9deabaa8b7a38bd5eb2ea60cdb5a52dac58cbc34281db738767c28a13fb3043e0e4c65ad24b6879097422c585937c58b061486f0c975df9596892a4299d41d319620ee9d9bcd0bd96862b220e27fd32f0b8b17d18d4ab7529df55b4df908428062195feaa751a57427195f019108c55458aac74aeeb82407e7b6c750982ea212a9efb8c1772465d4053e0471ab90f4d81f5f318775de5bec31e35e50be1141035b1fc6ac3f6221ab51f846bd73794f24023f537eadb788126835965b125c134baa7f819d1723bf1195833e606c5e168b9ef5572d1fdf3a18986814095613c5e36ff34fa012adf45bec2914411c4fc2c1b671ec561dbd0da66ba511eefa35390d2e97906cdb53b361834d93a4ada0c3fa302848979a0bf177af7f8bb97058387990a2f1890ac0d940c1160d6c8dec4f44333de9b468ad2ff0ed4e7993b97f8e2de30ae7322690ce5dee573efcbaf01115cf222f6abe8c196a366d139491786ae8c70b383bafe60b6dae01ce27322f501b12bfebe7ca7f0d21c03a562b61ea3a28cc5c86cc54433881bd5afa079100c1161f9111417d4c1028b07ba70f069670f425ad697f06c86c9195d20dcf0035a8b38935412ea8aabb9f208e989a1501590a44c9503720d15aa1a0a6a071faa752bca645bbf71de0457b79536e4b990ddba5e6e316e76882fafba84707ac28f0b58d81728db65d96de24268c12ce6cdeea125d31f4303e5ca81af19164bfb3b2baad9d49a27ba57296fc2537b4ede9f9d3eef756ebcbbbef460da4a6b76d7282a8a49b42edc0594ea57f88afe26fc8fc0c8e514f44ff7ea117cd81f18c523b261124dc86634997bf086a42a115280b8c2a877cf8e0888ae7c541f37b18d280224e88cecc1582098bf060c8bfba3899ebfb370b089b1b15425419fb05c83598507bbd1c640ab74b0dc0b08ccf934ae35b981500a7c630d477bea5d11dac90ed5f0ffa7ed7ea3f7357eb0374cf7e4f468583de109297fd8a4e6bf34a2b7def6e7d2c1f2e74a0ee2a4ccdf500001446740ece212a5febf6b367f1786204278e5a802f16442bca09affc2b0b8ff94f03e0bc5d37a551eea839414aaf4682367323382a98a83c2ca433993c24a6fdda3db0e597f7c9964a7542b99273e2692353ac4f5a9bd597056ac640bbca92e14571761051353fba86fcf6be81d7d302be3855eeb055a97bcae0b777cc766788eb376710568e78f61c0bb6fac6c247b0e8288468191ebc7d8c0ec4bcaa124de487afc749d30e094da31a249d76e07afb0e03f809e181af104eb6caf3312d40e22f989c44711dbe246fd27c6bfb0677975e3185e9770c171d73fe1aadd77d0c610b49331f0e4355086bb4196dcf8d8d9d87bd063fd24a8a10f545a95374422c363008a7cc742b6c36ef8656e0692e7265c32dc1516c05f67370990d2863069ab3473522727ecccff3df92da2599cc32be9bd8393ef8c637488cb7f1554e77bb689db8b2b96401a41ed866a0fcfb2b3c6ecb1b9fc0a01fdba2c6a31de1e876d39f3ea61fc4e5263f9d9d5cdbe82276b46eee41bd520941bc9091f4a846904fa1dd6496f0db0677751008c88e769fb1fc65376c578fc2c97f1a510befe66e25046a22ab0ba34e72e64371d87e683d68470e420a4b79354453f5cf8349c7d81fbee83ee9e50069f44765e06563f5408f263c71d4c8f961978f36e2237c7d776f9aff2506a730239fc466aaa1cfd53a2beb06387b8eadf767735ed9eb96bd6d9ad9037a9de0150500916d01e987b6e1ae1d644ce656b5288d6d45917a928121bec8e5a4aa3c2893c65b6d2cbe23168ce8501a42c43505b8baf4fe94513d0472f69aa218f897991d05c706a2ea17b2536177faf4e91d08c5bb8c1dd7af0a09e88a306a5ad0e17610f300536a71f570069e73025292216e5b76d3e956f99662a2ed7c240658ebbd413ede0d7d90d015411f50bd8ee740688998e531367261f6d769de6aa505faf70477ff7f50d96783894619e93c345195e17532270499c1cf9bd464a3af4363268afc33aed71c55599ec3d76136e75dcaeca7895ac66b2c039047e4c8e67339ea9f4f01ebad839cf47911d3cfc738d180a06368b6c9ba3f7ee365f9a6acc3835ad6094d535afa9e063e7942e49a736361e1a73b5fa3cbca607623f54feab3b4493e32edadd00b919f8da8bd2d6effde035bd2f3bdc73f81ad95c3db0832d06da94ad97f6ec054815189de9ac0e36a47665fc4089793ecb76c909d91de22524408fc31b772e63a91a03aabfbf2f32371a475102d6ce78916b9e9031f01227fe1d5a196fd3dd59dfa884e91534c324d309045cb245fea0a7b344194a17d40de18802203c17e517285eb543ca75a9bd4a9fa3dc1951037ca222f7911d1343abbc4d4c524041809648425a421a50b114d46e885ec14bb83e6c6d96bff45a8fe7d39c89aaf544ef4bef7bb990944548d5aafc8d960731f25cc860d7c0d29da120111c8c7bfc8e780c86c621f646a4de9253efcfdc4b2e2733e50f92f7cdfb7aac4e006ccbd505c015a120713d68153dc0050287bd5ed230522a861cac8d3c99972a6c3d83f4e68334de158037cafb32beeebac474c8ee63be34bbc6be8b68b1778c83d2059956e279881b70ce37a6b583ce0eae232422208b999cd46abe52e73db0ba9734749223f92b88174affb1cdc265da710cb1df6610b565898e44cd2b351ee95ed46bb5b5cd5701e9601f00efb87840f4f807c01d2706901ef701788f8903a2c73f80dcdae655003ab80fc01b4e1c900ef609e88e8b0544877f02dce2c401e96e1f3c90ef0f8b60d3757e9b6ff1f342eca8ceb788795d6066396f990dbf330f38db4656066d1c3ff61bd70c7d786e7a0f47cd316ead8e38a779caa5a338077a8163e6f6c8fdfb7b37b6aab43483d267c4259b9257588e4d885e01ccb2a43a772f5454f798b9156f45b8e4e79babc3dc4940fa55f1f3f2259e40ed5712902721f3ab1ecc133a1a7b1f5558e953a481d73ab1174dc176e535467565d3a5cad1b11a56d14a014d9f143f5375497b8dc82b84ff115575a077edb2a0504ca3364a56fc4ab0cf006e5c6200e9b09f80f7dfc400e9619f7e62f195f48dcaaf0ba2a86c5bda713b80f9ab5edc775d4a16d40a5d51b98de69916c67bcc5e75ca0c2143ed4b706b709a5cca6a56e9e52b9c622a8bbab89eaf7b5afaa99de67cc8493ef85dad32f45d46ab11780516b56ca2f48412478ba240accc3918bf243b60fbddb45aa1cac893bfa97671ce5d7bf71d3af59d6a1b70e8b9aaeb5dced89aa277ff54bfc069d41b71ca781fc201f63f245d740992fadc3256d0cb1bee9dbd56c166ea52654077709b9052a39b8ec1039ee0b4d18ec4c7b2e36f76a57cce7425610f756a2f6b663b47501b1929663ed57c63571f14e78323775d4c8c7c4f014245de2e2d3725173ec4e2c8378e30466ea32955915d3de8ba62e2097ae16eb03256c71547e696d818b92ec14015d9994e2131b28bbc17879c93cd424614bb0045631f7da45e8f893322b6117f7a203631940160a95131d688acd2c1656421fc58b0f465ef6c6e789518af8db102fb5051dde63b6913dc72f1b46b3fdc18c3caece01385ac61c4605f8b7b8811bd76e63472fe3f39182f2c65e4433ea2c212f7aab5c50df33eeacbdc178b14c7c72d899da26071daa0f484e6a7ea67982cdf0e945cd4902f7b7b2c3982ddeafc0df1de406575b7795ef6950b3be959cabe1e060e933d0f373ba8010d5f3767f69de853f8e44648be4dde982be239764e3d403d1a525ff25178d602338c00f60cfbd448d67312e41d0de1f8d0cca815bb5f03e4d6f643c527396216d181c417bcbd25b86cbdc94313ec76e01d61008915119a94dcccadadc1170f1d2560cb38a89c5150c947ad05ccb6666cc8bf94bd376d6e55f6c2c33c96f24f30c9ff5340c4c2fb9aebdc9819acb86042310c3437eab483b6c553cfe8a93ec518afd7badb74954377bfe14a2a016238875c0e3dbd26bea8f69af59ee4c027b06b2df4f12ffcd407981272d03cfe9162440fd9e51a9c056fdfe28d9f95afefdc86e7572dd2a90ffcb3aac1bc47b0a405281120311834b05b8decc3b58180a4a9c9d2fce0b1f9c4f5e11f53bc1bf82e2a2af8f6c6e2df8221bd0391a53a4ef3af5a86debd92b0342ad84534133a0610234a1720453c9ff9f9fed84fb00d79682660922a572b1e7fd099b261f039084f236575f9e9e8cbfc5d255ec2826103ffb34f41c44dd93c0aa847f998057fb4e00f12f761dc7ae2337f2b02ac715b8f554fab3388fa047f2dbb9132498734ff20373f3052b5a3b50a6c3c9dec8ad80bfeeea29892f8e4e4ae8e7c8ad9aa3c36aafada393cc2773abfabe997ddc5e1c8652b013fffbbab7c48ae76c9ee3fa76e25b3f353cdff24042e46971a06c7a9611415d33aac4407c846b0bae2269cf658e093dc4e1dc276bc21bc4ac289e3f5f4221d77f97af5b88b05fb639d78474f9ca47a6805df94dfef77b90c6bb0cb6cef70cef1aedd20352fc57126c4f019547ceabc1089cf88e44b3a2ff05000ca8ecd1607195004b3c88dcdb11af47933dff16e0c786701f03bf1cb6abe71d045dcef49641d9650eae41b8699f5fc2c8ed6ed475d1126338049878c37276f9febe86f4f64203ec212c8885058ea852214b845707baca0104b27ce9ca22a354add2d59328e13ae1e3c3c241ad3e30401e8582e9a4f1820149cafd1c526a7eb03bc755d4f2f8c080e460af6db0c71a3832946e16dd0420f629ead6ffc015912d83d6ef5d673e3ae9f1a14964c26b895d20bd5de2b63f78f5abb602ccbc243b7ad3c74b69543bf59f2e8362b8f5627b6557a96ea1995de95db26106bb3e0d16d561ebd65e1a1db163c74dbcaa1eb8a6daa5ea3f45ea5de81d9e29dc68352d636ce7882fc6220940c94d5c0b5d99fa5a35fda6ee2677d17c6a0be513a43c62864c38711d6e6e2b6b0a7fef7912edc561afa196d4f9cc1d984d352b711dff7220aaaa92da1406601f77d1c61f14a16937b0fe3d19541c47b6c9c2b2f4c5895b54165155e0badff3d67db41a80b881d33726122718da49ebe156f30a3a4c9d16c77971d349299406ca1beda1bb36d299cad865a8000fbaa1318ecc93db87006473b28ab4fbd8681de66695776ea9457d5f1aef8982bdad17c548c7e7272fe7265000f77137c326b35cd1fe3e967ea1334b60a738f4bce81ca3f8a6e6c9d1511bfa757a509f93c9ac80b721323f9f368da86949a5aa52aeaf12e860cb94a7323d7b5e78e91cc8007e5dbc66101b66edddce3f8c8379554a86772c71798f95cf1bb67659dc402a6f19eab05daa99917997cb07831104f1b99956c04106062b3c8bfcaf19ea49eb1dcbd92173eb9b85c1cf593e9c4927d04dfee15c0cfa0c0fdfc58fdfe745dcdac87865cf0cd5ec467336be346a74e1a8c7798ef2b95d1c4ee2f556f74009a29a2f0fb4546e7490a0ad0ef43045d8237bc248cd37a61185be2d21a04139086bfe0053d9539b5a62d518d67bdd9b21e8c8c7d0f38b83c89b74b58d59dfd266f83bdf5003121a31dde514182e4a86e04e6ad85881ffa7368a9ac7a53f9b516d9fe96a2d09e8cbf11371bfdeea42a9b581c03dab778063024dc44548c3e55c48c067f364328a02efb8e0f9b9bf38347d6a743870f78f8a0c30f1d76e041870f38680f185cbee2f2e51e40e040050e10b08081050e2ca00d6410e89a1c08d982b4630a91a1cb22bb387c16bace3ab1caba7bbf0cdb15a28f831d7c028eec9b0099c75e34705cf1d425d01a1b6db4e8c2c2f30e2326f698d86841524799afc57c24221bb4daedae9e33e6985119237c204eb3c596075aabcc82f827b86664fff34334fc083b88ebe0796bef802f2c7205a3be9264be865e13b489fa51fce4b7c4ef22edef757aa491c3b50fbf17479070224c63937f0aac74989c2a62a7cbf4a20a333df30f759869991da9614fcf7c4f096b5ae6132ef571a037f4498e1254720a1a3eab56ca7882504e792112472b652c68fd96ce345b83874bcb74aa164437f59a53c2e811a3f1931c93a5d7524348dacaa9904a2dbc5a4e950d80045deb797b6709ddeb9f07efc127f33644c516cd82cc81a040806c2d499189606cfdb764fe8f270f885d9124b5108d56fb5da6fe27f2c62f262999900dadff4de6fea4e40150abd2840e99e155bfcbd47f543660b24aa2c82331b4fa4b32fdc7c96b3e6f3f87665b2b75c3ffec2fa7c2ac244d1178dff1a745be28175f40331b90cf45ce171cee2fc6944e94db9fde08754cac8ea972e31ab968391e3a5eb252c5f9b8715600275faa015fc8df5409550afd23921076e2336ca788153cfca6d6ac825b82af5d2425406129fb2657d08b1201d9ee4ae073d06dbe32ac3c82de490733a5302bb3a4d1b29c83f49aec037dc0984f513d6c6077ac23641f76eb116be58835b69ccc22ceebcc441e9a12f384f459e186ac5fe0ad586e87e2982ae0b4876aedd8c60fa37cfc93f538393f7c50232fe0aad5ecd2350490298734a58cb002f48bb7bf34aa1e5868e091dc4aa813d7b6f4060a6a1d69595134a281c29230aebc020a0cd0a95122a8d69670bfc1c38f5419cc973298cc51fd24d1a5b13f8db43e459982c9d2903909f7bd374054ec9568f3256af5a849e1e184119c3405bc5e6cfd066773cd80063a826e45a9de87d7d7bd7a5f3bb03d381b3f5420e13ddceb702026761f4205c2544b518ed458d1234b9d6d5d07661d15da0cb3c6f92119ea157a5f203928a704e9060a5bce85150d0897b35c21ef6bf2f7b18e40b82dc039ae258bee3f3845597f896ca6d7ca8e9fdce35dc25fab85e2596a433c22878c953a0cefa05d017daaad8fbfd7428ba3eb531f4e3da2bf61c35ea94996aab7350d6aa3d516feb289875f991f7c29322ed04a392cc56bd4eb2858d6fbd0fa57e6d88877df602a6d8010db5b5c03c50582cae2450ba802f9fef05ca35eeb472431ad62942c42b14bd4b7a0b5d8a1f9db217f51c54c31d8db96b4ff784bf529d98d1dfa6265ea9130a1c42c32d2538710618938009595e579b26ad3362dc764df9bcf7838bcc0e90e5883a853a61fc8d30f8b1bb2c3e93a9dfc98de4a8cb5d208457479ccdd3f74b07d365f9e904800ab8c532c62f3fdc0ae4fd1519aa69ef3ca6851cf7de2b4a784e216ae91bc4d676ad00257974c8496479c62c590adfa6433bd38ff6280f22cac385eb1125b9d7906720ff4b90ff009737c18fc4c2eaaf956584e50fae87441c8842c9e2c2e1911532ca843c044c996952ded62d8996d6d21759d3a178bce7d625f248e419d9f119df5dcd6244ee80d85a124b4f3b4bc53995de2ee8ea63b743ba22eae4deb5b896c78c1cd917fe0440cd8023a014e665b3016564d0701d0bc9274b687a0a1ac7a3a9150a5645b7c32cd8ef96e2342e610244497da1d042267dec44835a3e3d7dfe9a6c2e3d597f2ec1d06ca326283180bf5cba4b72e5ca751e8ed331d867049ab4937b2bb6db9a59429c9143806100670063a4cbcec7018a6e22cc8d93b3846c6137c31343865fce2a7c5091846be05c630e2863b908aa4e00505cce3259ea0dad40e9ef12b1fccd12bbfb3be48a4142efde979a9e91aa491568ea19fe35f70b0d0ea16e0190c3448bfc33a634ed4e9953ffdd80a62c50798470c5107ad4fdfa6e88736ee905dbee2c66f86452c6efc90adb816a0f325cfcc61c91749660db3866dfbd26f9b9cddc854f86edbb66ddd1bf8a9eece04818df6b62120891bb70dd6608c490d469996662e6ad4f050f05abcd4d70d115b755afe6fc52f86effb80be181aecbeb6f92252833e90701a86af0f249deed8631c93041b7aabd5cd8f517c248ca8c531e11953288b40fde9f49c17a24e9f6499f84a164f992371fe4ebf8263a2646dbf7d5bac566b3de5ff20185362815abdea698941241130be6401c9dc534936942c6fb170644ed7f5b4346999960f4a9306e3b67d9bc73826cad6251281646b274a7f584d1f4a296e7c934703ea9a9ebdf0f4993ebedcf6de323d609bde5fea0d895d572995064bf16f37a46fe8b12b782608514602398c8411c19170e3730c430a41c48ddf47dcf8a525ae8cc916c7c4974eb0ddf2d61d8a4736db6fad5e6d1fdf777ae54bdcd8844a47faff92c2c172438f75d79bb40cb7fbc4da2545a4b8c530c2ae4e8cb02855da460df683a1f4db578218a4bf6ef2c556af76e2d04f436930b6abc148030a97c8fc7c7678a6a371e3e770c3d8bf7da56d2b75737e5be90b8ddcedb78f61ed51b100c7f0cbf03f47b85df9f10977fa4a8e064d1f4658e9e3c7289128f26021ea889f2afdf05e6890bb004fc3b2f00ceaa3fb541b51f8589f238f954f7de90b6d066ec986076ee95320b8a5af41825bfa1515dc120a13b8a5771f97b1d5c6ef7e3e0aa51fb747a3e0bdb47836b47c1123342d3f3ddb9daca9fb4a2dcfa56f696969f9f64afd2d29b0b95b8b7ff5c2a6c267c86ce1ee22c672c6d20690c209134e9c30e18409274e66308324e64f9c3bfbc44677ee48ee934b15dca11ac5cef8908d5846c4cca10dd309657d8565540e339fb35ebc9c3b3759368cb008ebaaf5fc72b493529ede4fefa777aec4bdc71ef8ca3bd7715e4c55f152ac3c0af58e7ae75a588e5a8aa68f8d45a230fee0c24e2618502f61bd5a21e219760115847b22f1da97ef59b8109887c993aa8d496db32251fdc4d45e09ea3dbd13367a07940710e04a1a9c8a6f6104e6e13fdfc433279b0843fd6a25c5793ee49b1e75ba81ea270d4e2967bb9c0a4bc7797189d80fa078d90047f5e26d57bb5ca7d38a0986d3bb0ba7d389f362e7c50ef8e56a74ad3ed26919ccef44fd83a9f798db7679c3ec8c151b11e6329161fce70c588c45d9ca17c62deefc78f2fc69405dfff84f2618b4a7df2e5b53569672590e4b675dbaa296b5ac652d7398c35ca6791c667ae8b1d0631e03aa61f2984b0b5ed9643c73e23e7cb6d13c1a4f443dfd503fe30b9b753b07f55ce984427da8a7017551dff3668261e593fe7507aa650d22dd88844232b52b55860d1d168b9f0c269379bdd1755ebc332694ebe3faf125ac63bef5bae805be235bf18261e6af70c396790f5f86182de3db11e6738558ec935255ac1f79eccee75c86fad0b5b8b15ea13e6ed00403eabd57ec545cc633ec02ea93a82aabf5e43a72dd7000e8bc78515e071a9c6fe35d61996a7ecc01c33fbf343c589c4518c7ccf7d8038e991fa1601d51ba280503cad442903a519fa31ce528944798f3541f57eae7230ce5026774b65d4f3866c29a80c19a4a5721456a074edcd9429026126f1735381ff5b5ac8bdab5c2856d03d4d74f222cc2222cc25c2e97ab63d665dae52a97692330ccfcb62eeb4515c376192abf010708b7655d646a81fb1419767e189182d0df9efb82a09e48bc49bde27e46af505fcb6878ee0d41bd73cd4591f5c2f843c45ed4b76be7898b894bc99d6114e24e53cb5ca6030d33bfab55ee4c92ddc9321b1c97f6c82ef304a4c1f95ddf38c433a5af85ed2312afe6f3354f4aa05347a0c5cdeda53ba5dab7f6ad7d6bdf32897946939adf9c4c1090beb96b9e2335d7dcdda5bb77d588b2dca79151cb9c48308a3cfa277d429bb8753e654d8a73e7c904037df926930bf4656f3fbb60199e4ab87336e1cee9ee533db69ffcab17af4d524ba425accbf9d348f3a6d19c8d434dcdf29c69c46acdd085b89af69dd3abe61917344d339a93da348daca335ad6a5aa59a4667f609259a840131ae87035cc6853f1709c89f1f83fcf9fcf32be284bf18e6d3afc8949f8bd33742e355fbfa42fb448da3005b9f5f3ed8482a65d3f6212b1532374ea6779e9442bae68e06979c160ae92ebff6fd53fbcebbe196d36510fefa9e0ddc73937e3ddd53d30a3a1a273d5c058264e96d4f3df9ee859d0bf4e517e4db05f99b37ffb61712b942ba5bb5a75f90ef7e2e2ef0cb975f10fe3ed9309193974ddac753c4a7b32bf5d6f3130a4bffe35a79d8a8237e58fa4221dd6527d63fba8d3cbe7efdc2ee5222973f7a8f2e22a4bb3ddb4faf47b6cce6329226be497e5607f66ff8baa1eac6f62a1cbf708d6d2bc7f07faca1041b3291df187ad545be31f46a48748e3f56eb86b646993f21e60b066a90b5218e639462e7141bbf5d7653355750a9e80aaa1c1cedb46e4ab1f1359304369adae1a862d82ac586b62bd929c5862ec5727472d2398ee33ab23d85466eed66790a8bdc95febf362ea3cd1c869fdfe6f237cb86da4c9bb94c8c5f5859072737d4649735a2cb5c73a818fc3155356002c9d204a7237bd0df60ff4b8fc65972435ba5ff468e9ac653ca97744ad6a6b8f159d547e0e4aa9f6327249669c76cfc8ecf53584a061b8c7f63111e975dfe19c5ba2cb4b76dc0c597bf11fc984a593bdfbf7f6910f488cccbeffd8dcc71074d643ac1cae74e5ac1b9c47fe9e8b98ffd26fcc25f101507387ef114a53ddbcb000488654064e815d3155a66fb7e1cbd00d6d36caf759119b6ff8000f5e8a6cd8c03cb7de9e38f1b84be10d5955f4b1e3b4c6d817ef30ba910d5c5d1307d3707229a2f1adbf263614315cb4cdbd7c3715fdd809c58373cb1ea2603e2322a29bb8ba2bb7da9d3b3cba0e8a34edf79b63eb1f3a70bda160060990d300e9ed956618edb262e660cb8bd7d4038e60656a64a5ad89932e13852b2b70a51f570cf7dd732dc77bd5abdf453e540a65aa1c16863c3f14b0966ff86f65f473db840b431ea34d83c0dfa336955af5cfa79855eb994ba94f6f26a2eda33cde9238fcba0becf457e61aae4d5cdeb4e9a14e959961e643ff1da35857d97fe03f985f6081b461e96ece453cde34fc528e58c0dc425e19252ca29279506fd23d19421cb4fbc985c1e2243dfb9fe1e4687e924dd48542bfd429b4afd83a04a3574259d73ce49bfd2b74dab94a6ce054dbe8cd167e59139cff539b597b56af4e5a433c618a59c5156227401bb0cc44512175714b1dc9d5abb59a534c90665dc3c1bb62f51ba3ddf59c408cd7603c726097cdbbb47bfcda7177ff32f479540d830ba22d18dae5e19b9e2935ecdff8115f10b08a01b46d70f500f01c1d3603ff703a557fc469be9c81870fb239147592c6a999b0af43ab284db1f8f5a66868b5f4024dda6697758afbc555b2ee7e9b13eeb954dafdcbfbfab784e7f173528336ab06d832e34ba5e3a323a9d4d7dc4315ac87c9e8baeb6032b8ef4cc61663c36cdd221bafc4a3213c0e5978eebd66ef786c83b836543f0f28a141b46578f8eae5ea1c2baeb49cb304d57b1feecae9e79add6cefa8805377ad53cab84d5b8d33e6a5dbb6a75530b44347c5ead28433eb0fc6ae1b46eaa14965f4110ddfefb0a0286c4e786f6320e383724b9507352cd84e388fd4bbf9005474d97c271c452b06bd0c8f597a6dae00c6b4b2b65f8f15c7e2591bd5a4939e45c7e2521baa9cb2f21702ed79d2ca2691f91ae3e6a834660d05c238299e5b2cc88e5c7f16bd52a33330b280572434424a594d26fa494ef3d9052fa34729854b325320303f887f6a994f77815ff75da35683d9562dbfeb306319694d87e17c27263c764463fba7a7529bb82bda302591cdba1adf50bb5af327d0ba6ae57da0295eaff05ccf12f418ec0e10a2f9a9802072350198a02d5c410b1a4f3e0bffc531c9c30318215485a373842468305ab050ffecb73385e430c248678525be5844a2983094e68fd04018756105e3733909bcbe5d7cd0f38377cd5c6038e9334081bbeb4d74523b733c56fb7b98d03db1f5fc6975b30d13a4dca287bd52b297f72cc6d1d730e367ecbd060d337c2317defea536f33f988b39a205065303d407efc38be274383fdf168c804c2737e913ea7b5aca7cc6e7f57e955a83d52af82683de319eefb1b0c9ea9dfcf95be9a60d8be725d7fbba556833c710735638e3f10f03f95b2b6bd0ec9c1ba4d29330ce4326c547ad22b59fa012292d59991cbb629a526b7e40a6bd206bbb4d5abfa4d5b3a3c37e6f20bc9ecaec0e64e9bfa53aef7216754a100d5a15e815f80efe74ed9149edb584ab030ffa341f9df53930f982f8606e517f207f05c9d39ccef6850febf66f201f3b1d0a057008f65e6322902f04b0a5f0a295493033805f9b9b420bf22ec30e10bd7bf8713c00b532f5e68fb07e0850cf479e17673fb3d6f88bcef85f5e87694b873258b48cdb9fd354249bde2322e5f0178354249433648643776fbb9230e894bbafd43653459f150194ca07485f58a87be30ba1de5da0cddf48a932edf007835433743ac1e62e9f48a9b70f902c0ab11d269794b8849af988ccb17875723c4c447fa0425f58a9970f9ba7835414936d3e6a6578c74f9def06a846e589425f4a457bc84cbd7865723f444e84713fa09aad22b1ee3f24d7935415582906a1052935eb118976f0daf46a8896b73edf48aab5cbe287835423b3c251e219c5eb1122edf16af460847288713ca7925f58ac3b87c59bc9a57924d67c3a4570cc6e54bc3ab0962e263f281d22b9e5dbe33bc9a20284027a0209d5e71122edf15af264827a8850a6a15f58abfb87cad57f32a32b246af2abd622f2e5f9457f3aaf2425a79210535e9151f5dbe27af26a849906b4690eb75d42beee2f2357935afa3d78cc66b76d32b46c2e5db793541372c16164eaf988bcb97f36a8270725a729ef48a8d2edf9287c20fc7f0ad09dae9156f71f96e5e4dd04e833c132fdf1a261ae2ad09e2e118be13e9f6cf58d39eb32b5b48d5dddde7744dfbe9b94d839dd43780ec0c2cfdc2f8e3840d234bb2644e44aa3f524a29e597d4603f514c064ba5e6d79f065db77d4a3836ac3f40f55bd6fa55a09f94d6efb3590ed315e8a72b6a9876992ed611697bd25dcc65361f87e98f3737f587339ad59f99830aa509f6873b32b9c08680185c6c2f6d21a8ead19b07de1f600dded4930a5395c14e1691404c3c333333333333736466e639048ea5a5f2f5778c5fec77f65441dc0db65ba8bb87b0dddd0d85d36e2cbf9792588e31dc86a25d62f91987eb8e1e8d3a9a474719756c1c332bc7b4182559fc90794e8e71e4b9dd5a0b0876caaf2453d22ea594ce1db9786b5952388a5e47b65862675c7e1da9a203b2a6cbaf23b02340af1ca224b86d0736fe9cb16aee533c0fc99b037bf930e5c6e5d70d125e3e4cd154e6d4c89882e4089f2a9e009a4798dc9cb3ce39e79cd3a76bb2d61004423f9c9f6a50c530efe57c1c1868b0bf6ff8a9d4a53df0d0f4ab7638c065fa2de0324c042425897c30c10d5086a0e42849195618a107583dc2863616416ace79e4a1094552caef80e2e4c5d728f1c0d5722f41044f5c30d4048c24aa04516472b232840d6b0e02f02801b3a1e9ffd84aea8e31707040920110621c51046e0718b89cb4a6987e2ae931b048a26cc1c48b8a231f1a106165872326d0e18d10e16ac215537c6c70f38316540727350c8b23d54b14a008402c08828b295ab4643338e9f677a4020c25e4c0093a104216850bb298f1aa41c6ebcc82165f40e1e201064ac086c0c21a2205f296925849d32c19219d5864872aa694dfd28ba6d9a629e594372ebf78406254f9bbc70e7f61470fede5cfaf477bd92619d9b463c70e4e6e68bd0b661a1f3e6690c1a956b7908d924a0fa4c19ee1853438c30c0db60cdc6f5ffdc21dda677afa491b1b1aff4226a232dfe4e16098f99dc7c2301386a3fc90c8957efda3a1c895f2e9fbcfaf87fbf9dc94dc27039106bf6db6d674a856b0c0c23fe832d6bd1211d6ba0c68bf0adb03ec86556ec840fd04fdfa4668aaf63718a199cf4f6be2759180f6f563d0be7e459cc82fa2497617ff5a87bfa70e3b0b93e58e4844eac1d46f3851d3e6fc18a5c1086b30bea66930212ed360308da857dcd1a68937a26860fbf93ec14374c1cb4ff0187139a7cf496a1d26ba3c803f1ab9fc851e9b532cd7d06712689afab991c3448f1941808b70e5dfd0be1b3588261f377060e987f5c7f663fb9eedeba91f3b8cc680d7a2344c8cf9a7c16031723c5a1128a002a6800ad8724cfb70fc12c6987d21bd7219b6b388fcf955971828fd8c74c7975cb7aac19abadd2a87e9e698289bd0a7807cede75315d0e71e582bd5ad5d6aa50aaa76b020e756356687e1d98e84033f65c35aea61c70afcee3670fc32b178a15735aa6e9491f3bc924723bd59f2a48d0dcde671144059e4d8d0d4a6a11eed81c7a3d8bf59dcfe66b39da77e8f9e50bc57223708bf90eeca0fbbab451d21bdda73d411ca1afacd166e95b7f2dbdb01dd51ea45cb216887242f08c30924be38e293448f0c5a209484102ddabfbc6ef82aea0445a20b9bb22cd6f61147221604febaa84116494fe8e10550d0780fcf102b3c4a5c158f0f3c371c1951ab5542f9c1050b9f265d14565e7ef9f840614b435897e1eaa3b3430d2093131f1d8cb02832b4cf8b1e583a1cd8ae0c5314b60343c85a2d82606b44e1841a846185e52ebf7a8880434f151c5f3d51f0f03c53bafe36e5a906a9b0337eb82996461137b0362ebf7a704c3cd87af9d573c331c1b2cc8caca9082619589315dc102c0a975f4600b5c0b65c7e19918418460c41a7dcb4cb2f23708c40b21da15625caf0028c2ec9ab082d4c48bc8a8882caab0827745e452001845711431491e455840faf226a78314972e1e71b9f63fc513dd896a194524a29a594524a690b28a594524a29a594524a297da16070fc926a50feb8ed42545d8332be50abb5a9d43f08aa4cfda172ac7fbfd05519f2d00e16542b8039fee54a1c2c0dca8f39d20b8e3e7754ab704c627e5ef5741f568d4be188b2044aecfa3b8767627784b610445cfad11c73b3b1b25dede3e7b2fd90f8c22beeb5073907ab7855b5f96ddaa2dc9045eb9c06e97bad537be7527904abf96f2cd3a3c63c6b235cf116f5b9f4431bfe5aa779f176de0a0d43bf87cb748ec3d04fa56ce71e5f7a555f7b8d6bc71e399afc533548df5ffb4a73228f1f78467bfa8d8457a5a7df41b0cce929ea869d63fab006fd93a7314cfd92e70cd6fa26af7ee7d5d73ceda67b1c9ea6fb9c687f83ceead577a79a6b9af4596783254d6caf7ab60f6bc7bdbcd45fb12bd86818b07a2f317c910d23a38fc85d83b4ad8c572cc159b2e34ada399228ad890d19e87b34c001b657dccb68fad40e15d87125ef649ab2769e6cb0ce6dfb367183dbf62fa1bc46aef62ef4b321cb8b7421ef1ae313db1fe3f768a4eb8cd4a0e7e0485a955e310f1cbf8434a8cf2e2b80f534f343130b2c15cdfc10b5f102e673f47ae8cf4f2b6a18d7649acc191593ec303ef324b817ce0527c0bfdd6843c2869c91911bcd98586d7683c3d3dce060695032cd4365c107f0a71e4a088c00ffe9a1aee004f8bba905eec60f15e3187fce8db459af909c63c2f59f9c11c7f86f48d8509371aec9ae6761430d15bbeede4c93d8b076dd326a4d03a806edd828995d035c7e25617239948cf2d677f72929ce0d89b414d28511866e87a8a37fbe77aca8c35f7add0e5187ff7cf926938fa086aface1eb5f1bd1a23be1ef89183069024504031b4a1b69c342d201c9a78de28f0da5cdacb3e950447136e319ee322522f24cfcfe1ae287849571b2db59fcec72fc42c9cdc0c819da22cad5feb7ad542a751539297795063ba96748d8198b6772bc566b396dfbf95c67f2317bbad7bc1ee63a1957a59f5fbbb8923ea60fed4bf5b76de3ea56b76dab5bddb4a286e998c344260d33c3848426a1424c29730a554297d025530a455237fa023a840d59e812ba33a5d01dba4395241182dd85f89082e380904295489952a89239654ea13a730a0582ea00f13cbd06078323f3298c58dd6d8c310eb941c80d32e8c8e2deadf2a1fa80aae50c6e4c2ea02236a534206309a423b62fbf5a63e078b5baa07ef9d5326a51b1a158f0649e39b0f1e39c4558a7306cfcf9cd29e794ce84672f38aacc8f7ae9f7e3093636944e728c427c36c60d424370c7185b4603901021084a1223076e78ed7812e7b12b60bd4a9ccd4c9b0ea4d10dabd16d81bbdacc2a99dd66f71a62382ebf7ec0c10f49975f4a6c685c7efd60747d78c818fa22cafdcb435e40c1c9992edda54b9f539bdad4e68c382ea7cf6cf269fd93c96c35d8360210c0102b0001680100003e3870d8b8b8b06edc10fab1612308299572d5a8c183020a42392d2d362c2c3e346800cd9811d45a5931b2f685844205b94ea7d7cc6462755d0ecff0e59e6f4d50e9f9f2dd9e2fb714c2c26aacfed0a30aa502d528958816514ae5ba74775a2d8d494965b76994dbad067ba784544a2a552919958e846cc8197148672127931571312a9147e928f5b3e386f5c759edad26b79fce6ab536f5a02ad2270d967e1aecef3e75e7fc4a4f6888a531aaccc69819915174a9c81a5cc246b44de1dc9b2f3d21dd967371b8ee885c7985edee86739b0916a96371469b0d77d42bf9dc8c4bba9d4d456a30a9757be7f66b2a7836a8f0069853856703a8f094ce574185cf0615debdf9a9e02a68af82d675ac065bfb3a9c201bd2275eb04b67bd0a39225aa557216de2ada4db340a51afc2128c9bd22b7eb900e7f69760bd0aeb4f945e851289a85721673425f2e8703a180799e6a8f4add5653d0b15cd0002000a8314002030140a068442b1482420d184790f14000e7f98447c5c18c9b228c861188610328610000800002000203333330a000fdcf898a9bdb39ec031240594027a0c17b3dec280979e012428e1cafe59e4283686da0ab9343a097d30514a5b6b88d35f94af28878f88f61713f9b68c7d421e6249c8ce42e63ad4ab1b8c97d653217509b44fde45e29db29ea06816bc90738c1c1838151f7384640e36a52a8ba0b54b6941356acc8d161aa49bbac96cd914c6b59eeaacef41855a06737eb59962e23ed7b6f5d464f0413760f5d9bdc941cdf78bf6f07d4598344422f881cd3a69cbcf6e303b30b4f8ed3ca3f4f1677c1cbb3ba312f4a847b8c49105cb5336b54ebd4a95c4a0f13b9e9e98c0cba09c5bc7bbcc797794eca2c893327650aecde501be1c24b911de624ebe04e892ca0dd8bfc8656f217a1b1ffed58bb4b82078c4fd86215dcd8726e0dd62f2aa10ee352f7a7cb84b2f13c2c98fa5481f810a7592011093e96a1af5723e123dc500a2303301cc5228c7620b37e3c14e0ee1c8fec56765dc6d44bea0ca52a4567e41b3486c96575e2d158d9064ba1d55e475b7539e53000a8064ed4f7581f589da51f00c13922a3c1137ba6134386d378250b90ef819654df3b01d5121c6680890e1c6f5fedfbadfdf8b6de3c4e6d0375cf8a782e3f18320a0b6c33041b27cee4cd7442712fa26e69d6081d95154c3935f077484c10d5c3f637415a32587955d4f69d52e087436bae1dc279292a893c738f28dfde146c5434aa1e7afed5d88bbdc45cd0194770d94226231efa825402240b12d3a15e22d3671a2fa6acf20c4a856258f96f52133a9efdf0f24f92433fe834641e8b19872194c78b45641d9b7992052a2f35225834cc0a2359069c560285a933c97bc0d0d908f027c311231c55ed1f33272ce1e67c8e792065c74a0c102bb6c5a64123d45ea0586f2f38a30da1504b9a82801267767554961e8a4e1b890ae8a5904919f13b708bd46e8bfa3c9cb0822c7d56b83b6b089bd3ea542b75b4fe0bcd98c27b1aabf97d0904e58ae4010465c8acd5b7425d2c1f34338d8a4a0890e0f47a0bb1907b40f196bbbeae5e64f28bc1fac6dffcb85f0721e60144c477421e1831c0504343a0811524ae2aa9e0da61221896b02e1b8d13da3b7afae9bd9b5908541e43930c530223a51ec38aa06e7004be0547ecace8ed60b6ac94ef6872ca5be0d15106249e4f2f920b895496b8fb12f9096059f1da12485ff6dfb28751a41e84285028b9edd1b7b2e9c845ae1ed7e23dc76c2cdb00aa5f5230cd116dec71fcb369e2d8cf1030036b8461725b6fa22550856b128ff4cdbdd0c409a811020e474740a8d8520771f673b81bb48a021d9b388ebf9315caa8eb00bc4e33735518072b63b96f0ff1d77d5c8be8d3e8c71e1709cb90693e42000a239a0c168a1561ae01145cbdb24990f75ba479fc2d4e4649f0ffe1e1f97caf62df5cfda38e7d34f863c2916604e0d28af092c37307a94ae29fb8477c2d4eea0322e3a379618623b4ce3cba44580045cfddf9f874957cfe6e0c3d414da61aa670f400326b330729f7e13ababefc293791439c8deac427284d71e44f845a8fff2c8a2eec374d5399fca95bfb0c95597d2a2ad6166642d659a35e89446dc40e052ee56f1afc03c7434f5458cf327c35169cef1b5454e8e8aec7417491d27a9e5f59e7f707b46ad3f9b1ca4e469388be2651075954c8439a6e62f0fb823a07aa8883875baa7aab791ad45b4211633b2ee0bf0633396e7ac1a13fc225775461ef2fc22c6fb8b8cd3fa750af7062220162b644ad4761b1a06eb85defe44b70c148a3d3e6c81edaf5403ae23b9bcf3ceed991a5c8be7a6b1c56d81a2c2b7ff30ce22a835c35bf654d35d04a1f44c9aa5d34be85234a2ab9708456bc842093a0c286e2062b678e7ff2ef76f4a13e0673dae2ab19e63a9e592c4df09688dae802ac14c146bcb12e9ca4e841ef20c7282c9f77ae45c7b7d7502a0c827546c84acf3bfb2b8614c584952ea3a6fad09ca6c3a45925aa2ee81c872e2c9d097a7f4cfeeedd4a6256e433fac4f35871437d7b63ca773fbd90fa1b4dbccdf38e48b96f224e32115ba551e36cba86180b73c5bdfa22cb6c27b4464b9388107f1421e621ec853140068bd28ab9730d26e75efda51ba7eebcdcc048958addf923afda4f94b6e148e59ab95f93049251fdbacb2258e4dd6b66270b33d845313eb9c22198c5a7e64ab55c2610134a70d5cd7a9774ef8b080494980a2db1a5ba52cc318faceebde7a7d6f1739899a687fd48e501de716ac3e60ae832a0d8fd1de7eff0ff582f217bd05e7171fdc57447e09b866501c81f62cc9db424e0d9dd89bd23418f75c80c29aa5d599f620b45ce5fc6311b4cc3c6263796a833f6bff195c198c88b974d1d21382a6cb1bf999b323e0cfe5213113aa2954aaee57ea6bb7080119ed2c45869c73bfe00889cf28ba23ec5f08e683fcd25fc3e174108706382f70bcd50d3c0420fc15d2bc3e8896f378fe8bdc33b3cbc988da2d3df97de3579e9885380657a482ffd54f659b6629083278a0a03bb5330086071903f0b2950543a41ee0fd0ff67f9c671275dd92fdbc5fd201147e8798501a67418914fe72abc68c7f8b167c95cb4649f34e33fe59e10287eb5624a5853ea3e5e4b1a7e81c14cf61eb9426670bd17276408abb59f9a6abf753ad579bb9f7034fc3d2a7de9f7d71bca98ff2229483beec6122fb00a074b3be01432301990002024a80aed7bc2e1944cf2fc686f9653280314187617e17bee470aae127ae8a7523fd2a82abf4788702da713102cbb963c4ec26c0c07f024bda0521dc755c1d19f9155e19b527d0fdbc1b6d7e1f74dad993f2674a8ec72cb958aad31f06e9ff5d2256b08a25794c83fc4a8dda6679c2a054bba03709015c61748dee9380befc3b6707f03cd2254e4558e751123625fbb159043b749df54324644dda133d680816e4664c4cafb178cf14c000128d1d748f6efc2e70bc6be2d340e06d422a456106222582120f8ec896a9530f2c8c2d6041d7d1c5b1aed8a707bec300289322ba3e324265cfefdca2dcad6e666d0e5242bb48f597618114259aa62e9229d21f11ab6ccec9cf49dc3a07437b8baf50c4bf4f38787114bde3c62f4d838a7c4e7d06106c639d67183324e535ee4e52e5ec7110151528fc764fdb698b6bfdd2d6c3719d1c4d5ac371345882cb69e128d199786dd6bbad84633ead9d14f383a3d88ad80679b21f194c2956caf98f639d538bcddd8251fcf4b43d8762ec1d136d8aa72d78db737af7a9b63d27548b6927096e34c49abbd9b7d2901cbda000c95c9a5076d14bfc126d2ee75763467b812b7d3d6e40723d07b802a9afa1021a99bbe5efb72a0cd3dbfb7e846d63b808f3a67dc8b49d2f63898c0c5716205af43bd72c4dcb61e2f1772eec28e398db3557fde384c24ab94a4fb939d90eb1a6e756419fc537edac14b6abed94671b0188a066cc63c811737452d6eb9cd0e9f8c70944f209202a751b19d9197189b4594fd6983e402364e29228bdb806a4b59fb4dac274e0073beaeda1ef67576e152a54457722412f9b7ab41f435472fd343292c9102d95b6ca5d1822e264bc0b018e74de9052aa0b7a07ce81684f92bcb78898f25a4c5eedd34708fa5ae20d7b0ed4a94b293df33a546dd3d2f1d53b739066612215080980fbb7e8e6231da7f3b8ecab4359016bb991ae8148fed98426524b67c8e0bebd25853c406fc8531e06b58f82db92c0ad01bd20e058a0b5b28d3ec56293a6c09b0ec05650f44d0cc87285d09b209a7d2591c6e2e155fda7e22a6be2db9946e264b9d3eb7be899e83c044210d424f48760325f8239ea17150d3341189f2f8e89edea2242c518fdc02ee2a5fbb2da03b5686ce31970297ff9fd0f19100ca3ed7cdd06f31a5d00abaf5bacc309c29f3ecbe83489b9842fa27814fab0a04bde9be5dd9baf62092cc2a9d021caece4e92ec7567bc282061774f9a3bb72d7fd3024b2e0346e055af54ce9602f9ffcc0bfc75a2f41bec00c5e4d0c0e896450071e65e84b7b135248d7bddeb6870142f13993f652e41bc3427e9fe017e26ee91f849433cab0ef62be432dfbac29cd763b95d411daf2d0756e80add8d192b2403e04e040406dc7f6fe501482260f57b9d2108b8cbb8750e7c23da6053605a422dfed947fdb05b4de33c05621837a557424db19f08458bae8ba4813e47270de6db41561998e2bd03f35a925953a8f45f48ed9e2a7b99a29d62dac8c125a4d152bcbaafaf93541cc5a9aba342fcc9a6a86066a32f0d194f79b4a5417e4d02819cd4ccdb8957f37c2ee92e8fbb809d38d13bcf2fa329b5ddd839b01b8028f7c61f93b4aba73630158e79aa5ec0ce18985b5cd23fe97118cf7f07384d520f1c947382e5abc5fedeaa5d51f1c6531818b59c44d2a8d9f613774eea82339b7be421474df0097651827210ea442f798b2cde012f4f686f6ea9ed42e1e9775cb933bcc36305249f8fb526d9eb2ac332afaee46face44294186dba18de2867603e369403046dd0363c3d85a38a487d96beec93d4dc01dc916ced0e968ab76ac5952839192cf90f2fe455b565a47a73a31b73eda16e9f6ef2be4110476371e9571ad28573eeaf8dc4e3a93dfbc1a90bc84ad2a399ca17f0d8f8e9a386d52b16c5f6984fb9ed09ee574dee5f8317b2acceedca520c0bee4c2ba6e3640c2ccdfc5852ccd5aa65e1e4bc61af690af78367971bec96efa7692e6c2119d6bb394737a7829e3e8800f6177c94ecebbde089ea07f4b1c7a8c0e963d7fcfc8bf0aeb3ed267dfaa7f4a7b7a1603254a6f53bb4106b36fa74207b337a5e790b40df73224ea695edf7e4539ff4e931989f897c3ee3ab2883d56510196a69290acc4f5eccb2bf5919364bc2729c0f8a159be6bc3d808dd8c5ec68e4a43c18c8dcba812b1230b60153ffc5041f8487f40f42eedbc451efafb02920fe94457b99136496ea3e24ff94d4063a94f7ab5981ca3670cf744144b41061453bd9bc4eb6bf5df0320eb91f3d57008f24040d157c293da260ec01d9634d1d6025a75458c2955746602ab724b4bee6b2b8bca30be83ee8ea27a328a6861441482a877276739ddbee03fa5532488ace013aaa0528888093da4b1d061feccbe3fb1e4e7084f9d3a9048e858e54a6a6488bf6b614652d53c00eba4868d5d1782c7e0a24509689eff72e85e4e53322a5d2caf540f9dc93faaa4a893c94b81e87c1a6c4baaac8fedf387d88e097c33388f654ca1bfe74218c46246416d96dd24dc25f1053827b83bcab5b0f8124d45ff3ebf1d206003c519a4a9b3d47cf2e40c6611d7563443465635a66db8d8e4f82fae21a5286c7056a38600f051b9b135abc1904c9d5881a21f2b352a31b79e4a7c6455fd48db82d7ae8dec6898e2ef9b1edd2371aa344cd1cb4b2a6f9cce4f19a628e8c2293f4b195987df88d4143009017a9cc7f486d3ddeace7fd8539c7e898d7a43cf54cf4b4953ddb31b25fbd5e33f1f9321406dfd1778f27167748bd87b22a57a9a1dafcdfe98efa3f3e03c180fd90cff880c852850843099112746d8ca7956935a4e715aa4f053ce3fb92c576e912e4d052d4c2bad2921dc12c7b467b0003d42d55c34287c87c1b420845d3a9c6c4cded609f5926c31d76ab3aa982f6ea15532737869698c7578a1cfabc541b30620b9167fbc89461e03d2d578191322024bd3a8bb9bccab6e92d0ac0926206f7ff0e612a2b402fde32f7c9f0d7be73d89ec1151fafd62f8c96a191ddcd0ae14788672df6feecf3c18bc612cce560602f1402a8b8e64e1ef9747c6579c625b8383449642fa1372b37737f5a8b5f783117ae6a1623161cc8ab284050529e0f59ce435e7bce310037e319f15874c7f3852989509b472f8dd166e94c35cc184a55b7392412ebfd027d8d75884033010ce27efe776e2f9029a3f505b7e7bb6e5af7b568c0e3fa639bfc6bb9ee8321ecae1ef07eb8ae7c7b792e37816f3273da7b41f3fbc88cd1fd807d888b796bffea8867818ef1ab835def6c256e2d118bd7ef0b63ded67c1a65cc1a85315971afe41c1befb3df952144513da6e43ff8b5fc81c3cd7151557a328007746e6f7199856cea0a5d03e76ebe08ce010a600b77bd06b58a8342a35e969d36e38e261423d6c89261898aa10e9561a8ddc82e03f19066fff46f3ace4cc2d47aee995cccc116942a4a8bd0bea781d232b3539ed91fe015e441784abc9975c6626da3c993a671aef2966a4db59e8842049f058e1913c9bf043797f2afa21dd627abdb39d046a8540f51aa61b1439a0c679256662d013463666520f5b3ca468dc30b2c5b06944fd6b140b8968650b2ca04b9e0453f930c36e3512ddc26f057f7f42bc9dd8a1033111676f4900de29671f4dc5375b24f66bd1251da2c3d2430dc03eefe91e3501854fc06770cd342085b2255d0cc7964bad82723a38314780d949a0a6a96f05be156c874766b4d46aaf1f6836476e43218a69be158d12c2edc6d84f89faf098d9af1171a9e568d0604473134723e1a064d94313999ae0561e896313cffa055ddd2a06574b22bb5cfb61fc0b01918dc298e0f30782b76c6ddf3c1a7a0f3934aa12579771958885c7d062f7c027995d77d99acd7407ff0696e9f81c94d8e3d84a6be9a4fd9c4a5031428bb2fa3391946058085c6f179911d880ead0271ce1cd5644c5b03e899875706160c8284ff2ce11eda999fb7e21250c536b9d43e53fc6dc20e12d3fb10323f9f2e3bd85a6eeec302262ff7467dc08cd78ce9db74a59e2533c356336f580a7aea5d93db941d75ade6dc7af24ad2567eb495ccf82770dbde34453b60d15b8f57fdab56f0014da7a6270ee49b4daf9962456ec2da733b445bf5e47474d4ed4cb08ce11ac5c1792b8d19d5c3ff03710870000c28cd9aaaa9e7ba3bcfb0e8bedae8c09d6d2f055980074edf3128099756a62af9f0d6c3f68e4a7fee9ab3d2bb05050cb101462b76566a9ad2d193511e20a3c710438daee6988858e445ab63161bf7edd00c6148e1071f0fc58db4620423c8eb0d9e4063f09481dc22f55ac777e4cbcd4a22f66e6ad5ed13b64cf7692bcaca245ea17880bc85853ff0014b818454759e62a7e3bca705dda1544beec8d0ffa3862a3474ebc307ad589272e90b92beecd5f98d7e816d907a8df2df4ffadc5942d316ef5c172fb339a9e025c89ff001d53bff27f2f63a026c395574633af09618073bdd97038ce597a17592ca545591fe405138662ba9792730a68c8fe1f8c0f3f05b75e280074ffbf94fc3d723024f659907335bd0e89d4ad4bc4cb154bd80f388033e3de726df575d1b140c8c20b6cde54dc639ba43e111be2a32cd29f85dd8a6cdb09f0c26cc850782389e9233b30e72279467204be54672e89565532022b1e9842219c7fe1e60d0b8222b7bc3e11b406b73dc82da923c15d2507a503d2f83f7614bce5f72d14bf96a33c1c56723dc2dc04e8443078b759e388c5658b91f9991a5aaf8d2c0dcea1145d505844ed90858a1a0a6220ddb0e4dd35c7a6f9bb92a4ce3964ae4e5f0aa67cf9c91bd81cd76773540dfaede11dfa29522365b5839b43040fbcfe30d1edb555224090eff0639822d6a93af515f2610f0aa80838269e101f767364d266025ad3953e12a4416a32fead8f895d26cc258611db5b2acf699f63aaeaba3bef176585e1ecf69ce5a2d4698f2348d8600953d9f53e8f066759333002a4d0c33d585b7ab22284f7d08fe11c3c5664b18cd2aca84594f996ab466a9b92711a75d2e0e9f86d632e2ff31da6465db428021ceebb104fb0e713696643488ff4734c775c290055278093bd3f6b50dc6153c8a83ea3abd789cdf7bfc66b0109a784fd6c9e3ff033221cef8ef1c3aa0bfd934d186fc967f120ebee771fed24c67221779cfc601833351c08ca28b9e762026a3519cf4a9d397b3c9f304780a64a1905db0187e138efff2f1f765e26bc5d9479cdcce75af7877a44aa1edcd661e60604c20e321f782634899be4fc5b25bd423ee33fe041e4a0fb18727e46311d8bec3e225e1fe1c591e244e91030d9185ca12f7050aea455ac6ae22838982fc687556a0ef35969357966e451a0383fc28d5a7124bf5ebfce3574ea06bd6eae894113c71495425151817b2097ccd784a9f7e3322f5f3be2eb6d00faa2dc1ea61715596aca9f27de26d4ce45af790ac11d2e101c4e91efb800a2cb86fc1d65b4e2212e019f15bc7977d15e2a9cefc3985cb8e18b31124a4c9ecfef1b24cda7a8008e4c3e389157096e6950dfb3ce1a1a085c0630307698b904c2da417267130bc479887368bcd7a53560e22e6e19be2f32d08888bc3e5c70e7b20bdcc46c8817601ed838aeb7b7dffa1340dfce268dfa8a41f4967be1cdb5cf09448cee49ea198e7400a66d7cd89079ae01e880f5c12d4a450a43c7420a11d3b21eaa87687c00bf14b73ac1ebe1d0035ef86a67671eea01b3f6e042d9455725ce848efdc720aad13373d0d072aa3183d04ec50ac912362daa62a30cd5bb2391b0085dbed0c5ecafde4c6084e425f301da783f83e2ca53e66b83c7d8706806810b6f7ae9d424124f98fe8ae5e30ba5e58370cf5f50fb48046da2415bc58c4e7a9526ef98d1ef12d911a0ed88e06b2e9e08b5700740d99ae7021070805529bb66a5ee66db9a6871e90390b26863e3ac2d6771927feb486c0f368b0d0fb197ad728b6ab2ce3640d734698feac04555e9b9a75889dcf8e90e9db9bfbc2f3f4e731bea01d9126873a65fedeba28dfda24b2f144042b5c386049683bcaa994b01b98ec365a97b61c35437f124fc2a6a98f0d08f2585c5a38ad5dd71d2982689438132389b7c30c92529a42a8d9bcbfbd11acc54275476014e6e0012de6e002190d960c4589133d2ea280702b2b59a8eae5feb648eb6262153d9981cde99885f06aeb118584427847b59f3c448987190db1a03a31645b8c670d8fd1e317668bc793eae124c589b478e59f47a8fab939f26df1f294eea96013fa8727a53e2ac0ad37d743dd3373c8bcdfe5e9f9f7e302d9b05aa1595462196d0b67d065eb94b359bd7926e5b11b05f835080633b00739732309cf74e388e185e498b62cbe03917f6a203c7761342c2ab4d3adb5501667b9cb1a8c8ba67670bbb06fa085c14537185d2fadad075736444100f8b8bae33f68e4a8e71fc1a95a12fec2a70e73bfce841b7e4d685b47bd610ca0d2c47bc15c6b6a132a241627ec017a0ba0d838e1b1a136f3434d688d972f43d62650b7ed6ca9833f168dd6fa95a68d14f6bf56f88bcd8a057a9dbbaa77d036141a3ef769017a725f173490f4bee458547dad184ed911bc0bd6b156d1d6bdeca575ef001987e8b41d08ca679aac9edd88cc57590797413744b1b335ea2bcc932712a019ae916b2b3a5b61be64d46e44a501b2f1a2157e6752868b9e5a150a84612c4ae3ce19fc4d6885eb57c9067096d26b90c6a5cb34f35856c6b6f1d15e4ca849e62421681d59a8b4e5125f448e5bc424aec2ebc2f3e6ae6218759757843d68af375f896d982a3c28a5f4b2966238a8684fc571a707d4ae158c722164c97b4820634168ab95beb11caa5fd4ef2289871683a52764fef0ccd7dbb5f8f9ad119259d82912ce8e201a70b1b9ab599be339f4917fa0312ceec8ad15e5fcce601fce6cfac7934035ae05a415701605c3aac0fb3339a8db34e91de284974a583d6f3be8ffd377e7205fb41e58d06992643add80e648379b78b17e58db730ccda52dda56d688c9aca1b1bbd33d7f41dea817aaf941b4bc5decbf027ce3253adba1725e519ee77dade803274308d6cb59aa434711b07b998680953acb2632c64d2610141d0622b29ab606fb7a9f9c6f0071f7ccf1aa42b8017248c6cf5ae6036e92b6f70467ceaed6f1ac95985444baa108ee3f3ad5899353426ba279fdf423805ae5c3c8f5c1e21abc116ca83dcd5106c630348fa40e4fd292f71e61fb50c1c6157d1e95f80395a8cd5a5537b6122fae61f86fcd1d3e04d026c7393ad865fd15516493db1c8857fb1ed5b595c8fb96832a980618f35cffe3a442414287b9b05fd21b188442af614c02945be387af90854e8a9273203216bef193859a0a0a98fbbdb508e76511f492d0cf4e3df2507e8a593d1838d8cbadff14655e470768a9c15fa5fdcfeb36ec75fde8cb69930a140a9274b670ea49ac9f073b706c06de5a2cc7c5ae473572652591586ad6dea5cb5b1d432784ed0a6a17b192883332bbdbb203077e4bcb40e45718a5e1446e33b981875be32c36c995c7253bf2fb764275f44a47cc9eaf7daff7ce16a102a10b509cbe31848037549307de3034912b56a935ca751fb0798164d7af50c168140aee40be60aaa613926acd97128d1dd006e0ff85b80a4c985467dd18647821cc3875b1958ceab4d363fb393e87bf20cfdcaaeb2223a559fa395749dc2b0ba93655011483a70ed071672555d0ad221c7c33428b84054bf9f2f70de709742d08d3cfa1b43be50fbca982a8e2ae2dae6f5cd6e995958878669fa10fa5d7ade513f02958b8f24a58eb86c74439ed9b136c81c49f0f20e780e5c7eaf44dac2f80bd46c4ea43a6d997223bd873da1def4091b17254c4c94bd7aa6fe717111f2bf98a121b0b2c5a3c6820d2013844af4037e3bfbd22d0a0042d2f79cbaef049cfa9983a1784040783b3d04b941e8b737e6698c4ed273640dfe8da2f0b14ec81c215e8aab6b830c507b69ff4c947f120e123aee36ada381a7779162080cfa5f1a1ed96b1666f94f86702da1f995a8595ddf5a4f89f48102fd2ad8963082c3d044f3231357fe3403fd47ed634b35ee89a0a6e5bd583f22a35b4a0cbe5bd7af287f19641892fa561216028f9261b458de25844d48220d7ec37c4c14e6a30c0e3ef1adc0acf7d72949dd52cc348b060a4cc87bdd978285d743ea51fd1c99b62c5a35ee71918ccda3f5b4cc9924921697ad02e1de69916a1a2318a78ed339d096630477c8508f802dc39ef38486bfbf5789af31020ceb86dd0e619ef1c4f3d96658cbe01bd53d2fea7cd987f527a889b65253947d5cf5e4058c4e1bf3e1ff004365dc2179763da0707610d4b613e9b2cfe7663b2701f544dfd86211e0c2a63d3e8e6077f19011dd62898e7aec33cc9da73070ec48baa59f98dfb0ec150d20790bb8c3b4460a3135d42d832a439d47d798881cd4971f1133d92c340b6b1675689ecf71524ceb309c34a104a9a65462f75b579fdf8650c8d50f7f29dc42b35a8026e1d011e1c853b2e684c921bbb632fa277b36e88323cc2fdd6218507948eb2192d4db2e0a59cd8f3fb0884c901b17c8ccedaf8a4175cc271379230a9deec97f31943e42fc91b23da8cb53402afb86571ff044c5ec2a8069fc9b60c6054d7c562e12ddd94a177f44cfea8c22bbe391c183fc76d2336e861958b045daa12ecd6c898a509dbf8d9c24af344ae3c57b467b6c401a2be870a08b7b8e0563b5ca42c247b570b7af6e1a324287dc660fb9014e947373ed6ccbb00e19ab21daff9f80f3c169d6b11c9fac355fd452cd91bea5c6ad2b3aef9c46594aaaff351848ddc37d108e6fcc8f1c90175f9eace2b12ca0d99b9fe211a7299dcb7f6b6526724a60c2007b152a7e3ff735f8a842749e2096fd29711be40084106dc1c917c615b9b8215f22d6f1950fa9cf23b27c81d4a2097880be0f49d7a84349939e50c2f5ea8e3e40af44909ae14d3447d148cc1ac7ce6c906b0fd001608a38faf8ba6f269912706cff25cd6aec76e0d7e219056f2560590255630f76029a0cd7a4271b3113f023d1eac51a65c0df475f2dae8f70ecfaefb6ab79f85c9f11bc9c3b3435b358093f09960004246799bcfd793fea2d55afe3632d29ecf7d9d4c924b555b6b576e27434583797e1ab6c4e0342afbeca7685be416c17ccf4411e7ffa8111660d71e9604724c30408c4c2340aba592b2b3c9d0ef6d88b85f6bdb84532319c72f48ef3e5b953e2f30ebc3e53a0a2119c0682a2949674584660cf34552750a1d85cb9d5a2bbc4772bdd55a77d3bf1348ef44b6b59c1e3d078d4434fbb02df21454a212e2bf50480b815ecfe6cd9d0607953726c92d4d0f6c4941006409714e94aa8d1ad9c97c24e7b25bc967b3f0310fd332d9feca8b8b36a1dc465923fb522d026d5a8a8524e94b01292e7ee024d8f8367387698c8b88e4324d594d557a2d02b2f0d3678d4482740b18c210369a9365c505ded399f5982e03afc12054103874f57f2df6768b8c7fd2399651669e6f5f1de47d97f0fb0f23d5fd321881445aa37be38352f83375a7c5c4c38480526c3077aeabaa92a6e7ec05b5803a8c5ed157811dee6434884b062cf127a91d2d615460f2c162808c0f79d1d60a6027efd3edd17e3f9952317033a70ce287024ef58f9384b6cf6042940c92d05626c208fdba47947e055ba8ec37f45cff49ffd1647966f8fa94188e1d206c43145db727034d7004608e4ee06e3ebf535a7661753b1921aa4ec69a041e78991a579a1aa72856cb8258f7dbf4d92f99b680855d0d8421bf3f02f6927362a12a145fbb796e7a649b59ef8138e11c97cc28caeab182a296f87200bc889035402d697feca682eca4c23d16c7b2e79a50efe13cee3496226b31c5677cd90b503c505f7a62eb65a0015247095a471603a3821023ce309c2a805b636ac81f36176a5fb2f3056a56343203f87a66b6c361c0c9405b4ab9a42d3117b240b2b588f9ff29969d4c853816e3c0b6897137222e6c28b37ba8d8bbcc9aa5a0d482332aede5f109ea6e996014eb2e67e073a4dd38fd5bad5fc80a9df92785bafd12d38ae7798483de397d88328a0100911c9d89d9241c5e4b56228b5a3db425fbbc72c0f4ee7f7a07ad93d0cbf47b0a81dac43273c24601f6cc3cc63f53ac079b0f2902d13fa1e383cdd55645247311ce22d40a7d1e53908df2f2f574a2812a1c82c395caef311e926e10ccbecbf68982c2670c774539c8aa1efbf36be29106d948f22004377ad6f5e1b1ea97bfb24c274978176b429656f9580668ddc8f2fbb294b4a51b74bf704f404d1075e57ba284b03e8dd65a2834010479b9d8dbc17cd6297984fd77b23a18dde4c2e026317d74e184bef88bee491411c3231ad0aaaeec108ec1981e6e2cda2892907fd506466ac3837fffe9d5a5930d6af9fe8407aecfabc77400495e597f71531a1fdc2d27fa80baaab8da12fdcfa091e4dc558bc5aebf96c66428ade1d4caa3d5eb071540fa2c541a077bf2e82c7802531ea98aab6e4fe400d7394faf3d260226c4fa8ee3c49b2729c15c560fe32d31fac54cf160dd4a8dc7eb9366a1c7fe4aff67b00b04b1764c7219618a988eca129462db43715266d7bd9d6276ebaa760df5c7603f2168b2ac9ab2d6123720e09212c0552e2f838eafa3a1a2806c19840c895a29e0edea18a6219c8ac709a0a761107cddce1b304c49a44270de458ced617ab7ec860e7636b5c16586ebb0902c21ff0aed37a204ad9e6bfb6e75e48d4423c114a31f0343d7e1c4f0667cf79b34ed7a612366e2f27fc8672e5a116eb021bd4df7e8bf608925f7d64eb724f5f6090a298337c594d07c17a38e1e6538651879e36903a6eb551eae0d9df83b614c5b12b203a924cb1262a0edd41bd7a40ac0b43085a40e6a56964ea20e79064e12dfb8d7855f4e719cd4a324f3b4badb7c324ff3ded33fa46f173336d9c411e478e288aa43c036a6482b67bcc567fce846bce67daa00e5de0c7962983bb01bc9121bceb58408980a44db24afe2e58dfc8e3a4a17e0bf87b2ac2df3e6ca17c2f2645dd2fc6acfd24954360b1367d40fbcf95069c27ab81fdf32d8c0d28975213600f6bf3c66777ff9f7b86b2060bcc50e61d201efe144dd701a880374c3000c01b2f49500b4c7fc3906d5c64d8d4381c92bf5847d3d6216f71257ef17de4d26d7c31b3291bed6653d2f30e80d052e8b89ae45f2fd158f643363d1f0e95b22a67ab32caa453886fdb00cb6b733b4ddceac7c353b82c9be6ed8e8af79ec5a23cb4c16b67558cfb4f841574f1b78c25137de7fc19043480b57f3fcc2078ec65850044d00f1302d32cb53f424f434699337f20ada8a9459f51479586b34b54371f83e4e72a74839c55ab38095481b938a34ddcd78b7f3658edcac52cafa783272bdda959823efbdd1fd2626df0c1784e5d47d8dd996b8e021421cdeae1fa7444abc0921b84523bbf881ec8df0b54fd6a00caa0bf7f9d9d543a75601618680e6c6a5caa11bc4905a59a8e2a8de5ece7aec6ef06546e6ec6a71a3e1ff637f1be276d515c7fae24a64cd7a8ed55dcf806e448ad6b14299f84d8102488d84762e5135cda19b32fe0c89c611441b6cd0cdaa84bc40b682ae61ef32b1147ed8f0ca4384336c4260481aaa8978a4761fc75c5464106f5f1cfa4609cbc9b80a758edfc5b24147b3e843bc345fe10f37a0cc18a955d279061708f0e943007131414fe7276a4a622217a7b577bd7364b0913ef278f5357b077d6e36e4d04332d267ba29be50e8919abe9c0831859e5f51e34c024a473afb6c0d417951a9b97eb2601b46598be88c8de44a39d72d90818bffd3022ae65e18a251a4f12b28ed2d43bd5b22ed2c607228d9f640f28d4547474da4948c10ea797a21784692e6a860732d812d3675dc3093d35fb30570041118265efce8b29a895bb6463e3307d23c7c0c02b81686b983227452584884eb7f52c5a695b6738762fdd30242afd6ebc808202fd6832d9b83d84942b84dbc9de6703d02620c97ef824a2cfdcc7c32f43440430520f5989357b00636aa0a15e49701eea519d6fee511c123b566faa99624e0055a23ae0a8a635872b308bbff83f386f24078709ba008438c0223b6b763284ba5ddec615546b2ca532871564712b104932d3c5b8a19392b5b15dc858d01f31bc90661355b7f7cb3eb005700bb2a5d8119071521af3a2e22ff579490a06db646fd8161f91bdabca0e3c2c0c2637bd3720030add074a3b8ec0d05c09258b0ebb5b2529bac1ec0a607e3c325d04d1b12415c761261eea2bc935f27ed23cc8b75490d1621081bf6d454ab232548eb562c4ffa553714405ca1758ad990128d4b71ce1eeed636b2f79196e3fb6803f2ee00d781cc6125aff2d562600335537e8b8575e1abea4e8108d11114c5bc66deb40a19b73cadcaa9e9ecbb81b4998bcee2873f5d6346099507bf1bf2f2933809e64a347e7479f516d8c1c8b4ea08906391e3889ba3a47f58d88798c36e9a59f4e3d88e6f46224312ac58e3484a745eee39ce1c03ec6a6aa62b638e1f3eaaab70fed5aaa160d3eccde81f65dd108ebdc303a01dd6baf5153a562b3a097d09938645420b914f0c8d9d3c4fd74655e17b5dbd689a23db0d0f9c9c639cde1f05d96d7e95f929ee44aab9a258072238a3707dc712c06ce00fd21fe01400881aa5f73a94605c17cf90cc01fd28ba799a73dacc294209f83cf244674ddda31265d71b9e661b4736d449ded80cac69cb3f7d79c2cbc125617cb1a22632d287653fb6a9555981529d60a94706bc6b9a1e63da25f6bc45d86a131762eb033f5f557c70d7047254c08b184948467a9ff94db1b8f5616800c746a65985e82419c8c0e3a6d7bd0d2398731c3184bc5fbed9dcd023b42f2a2798cc900fb28388def3b0ae50bced563d95a1ac16addd70b7917b688fa8e72234d530ee22f7335fa0343985d844f41f82a4f35530bb42b37a3ef164909b7ac63f183fea32d68b622cc99032f23bd15add23dbaba158fbafd8d5613236a55b103249c36f692291e61591c66e2910e281c842b6eb1b556722a1e8b5842269c122ad9aa0f7210d0369c3a3b8c73aa41dba9bd61c00ba80b74ef6e3f45d085f5c27e5a5a21830f3056de8baa6783fb64ed978cdfcac1bc43dd761a418c126f96a1a0ea4f6c38f99dbb0c7a35c219486a87ccf077f19148a83c53708afdaaa6eb38de2c6e1c272196163beb3c3af2d4a0da1ed015d8d995382a4b00d324b8e071742db800e5a8632cde251d3ef15b1acb3dfe49de1db5861f6d381f11a81be134f8a1307b1937828433ccc6fe2037f06f294d28ebd1d82e510f0af7473731a4c0dbe7696070c40841e57022ada9b59e37822ec9a82b1763a0a13bbd83241a9f4e69ddecff6d3e84e648546354245b59483d1310e77572693976793bd52f5510c741ab37be7d32a083cf6972f842f42dc7263dfbaec95b9db446b0eafd712d4484e6fe88dbd8a857f6aa47319db68602e2ad65e21e0a4a6bef85d1543df1260f11a95bef604dac71d38adf09c10897233dadd28d0b76f725b095b4734d49890b4fbaad6c6113857857586b586ca3908e00841971010cceabb758041216c8aad3e92815154fb72108a2b48934fd2e2ea2e2c9bd897e770f9c01fe26343e01519f86291b79e5f94821a12755b82a03e2c01b80b4b307cb20e8085069fb1d2e146403db43ca4fc649d843e0edab3223ebf40870a71ac695e093d4b9acb5fbdfdef38b1d5eaf9d74efa1f4e12d3d6d304bcd5e42a1c80a687dff639481011a5cb260d28badadbc207cd53723c768092d9728f39d206c91e57ffbb89305cc9905194cca62a84e259828ef5a3630065be690e6d0544342e431e84203c4ef0f56c7465d48c8fe439eeced0089a2688b105fa7b1405948885a69278b0374694720df2893e31774a1374c89a0a8d612753c70cf36d08a98c34d4e70591053309b405ae99847e7a81ad2738d2df87bae87a29f151ea9149c0812fb3f631976c73361fd13d18b51be6aae247e7a076ddb81ff0ad53c25eb76eaf816207ed0f45fc6d869078b4b921532d85f862f425466d13925126f1cd1586f91fa5467fd0e770b9d27bded7f253d0be9c50d24505ac03bd1957b9bdff349ac9430d582f86cfa45206d8abb2c3717ace2210cbcf599b43415465488ddbc0db2ffa296b75aa82bbe86d8142499451d9357161a8cae7f09dd69d98097794ead05422545feff417a49871b8f977bb4241048c1bc2524954d4149ba3e7a70b78ce9c6aa282130551ee4c5ca96483b7137f31ae1251abd34e13eb332685c76925654aabf05e09222c689739de704b6e984ac512e538dbeb781c7885dccb6c5f216a180c88d69d1fb75d15fd2729a180f8711cbc8873e2879800fd4af0c34d5d2555ccc6a63f2abe3bf919f87b404f231001f963af238770c1f4b069fef70fe29f96c2b636d52550fb38468a0eab1c2d497fd2a88feca8fba369aa3997b349169d856c658e1a19e6a0ff6c33d34a68c38d4731166aed9373dd7070f16a46da88a1903bae14fb84af6771be9620cad24dcda14962e55f48c280714b40141bbc61ab562d5572f4c3d97f9c1fb930cece97d4baffa3ec4dbb7d4c119e80ebc4be908ead92a9fae04e73c26af6b2e2e641d307e3c732b2adee7a4ade914aa0e9df00446eb061c8acae8cf48c04ad558fdea46a8de54d7e0616cb0db9ecff7608f764a931a95dc337f888b459dfe696bd855b743dd11b83e69d9cf4a1c2dd41371d93270fd4134088d0bf1775cd7a45510952634da4e1f59e3686bb6cde0453557997dd4256d146a8aa0e05f81ae23c32196b69eef35e9c759644e2a500ccdf3306a9892acaef57947c4e9b50a6bc8eb98e8dfe0bf5536358c2abbce855d93a0403b48ead654a4c0f3042f254557a7b681dad5458e77c352af9eb850b5c7b44761757661e3f1229be993625d51fc1d6385ecd51b23167cb878a5acf26df563159e9ae568162b17b3c2a0990417435a7aa5089fff4ae587843e845c28365b2758f0af20f48c6904237f6dc9233131fb759f500c1644ab600bd376970dbc8321b9dad68d3f4f99aa1e246411ea7809d75959634ce504ffa6de11c7dc64c2eb4ee1e21e056dc5850161b258a417db9a5a71da4e8f2863dec22c928be4dc0463485fbc9f67cc43ce1f5dcea077d9ac5c69b474f178d2b084a6ac97b4dd02ec796ad1c6678caa713e7f2373185247b655651ab0c34911d7b64feff615531e634928f9f150673f04b47e11d627b57ab18e94124d4f8be9dde459df1ba46be659f9fd5db84d2274a8c8c728dd827d33965de6e2df75ac00833235b9aa42e0570c500c7828085ca41bd9284de2af68f196ae8e18eae940ef2162dee2e631df0514b69321dad69326ed2bd902d81535457bc930a73bdaae20013e028daba897b81b731e967a0d3a1912708e61624305d89f8c34b74c5dcdb31a4eb2bf0cae89986312455cd75a64804fdb4c3236cf5936f31a54e87c9e75c700c6faa3bfaee5961a7720b5d6973efcae14e23bc457ac43036b60569a81ef2b4003dd854efc74c5785a7c4ab6bc5f9e5ace191bee308ad25d10019e50149f7c9d5693dce8b2817e35bae2ba2c6e6cb5d42f4eafc4140280e25f895ba6c4758325a6eb291fdc241e7da5222d4d5c1b134b0fc6ca38f33956abf4c00ff7e1c79c145ca75b10736d73f11097c8261348a96b64dbd129a7bc21968faa6eb8dbf3bf3b26249c7aa3927a1b9ddce78beab43bff4f2bd90fc57e94ff3167a5988253f5f579413689a06a26263d21f70e4ce06b84a24d06d6fc0739142cfdb8cf4a629e3b6f3c6c8e5e21849d137a329dc03927cf31665a5320359e40bb4e371b6af4a435e548989d3db4529b8ec439521a5f5954025b89253adafa10013bda88f3e083df1c9c4a514d22313cd818459d66d24f8863b61dc4a50ccb8861d0526ec4b11177842f16771e15f96a80cb05e564f9360076ccad6e3af401943d3a531966baa161c34e31adf27441203d05a6b2cb88ff27cf99fc5215123d89755237b08af69b8fef629bc1fa03b97bb9c52cfb88ce6c6d9a9cca5815e8eae9a9638a01c1424d34da43905dbd9e68b6d03d67bbfe98e8213500ae20398d6e903fafb3703ecda48647af3e2d33f1e24010fe90349a0806924889a7c5bfa4059aef8e2eff1af0c1260649d465e259a4b7f0cd39d513902d3d9f931b4b3e7c21609a587b55e44180d41fae6bbfe8eb5c566b4e4b702a84c295a9b1bc8c22e45a793933a6998b1ce024bda2c86539de0ad93670549f09d5456b482d62eba36b2628f1cf865eab1b1efa8bf2263aa81264812523c8f2da682dc1eb79064fddea1a20e7aff443f761e51ad82473d750f52c1b8397819f2d6aecf48977419e38abd37b5a8c243ca41ac6652f0efbeb117eb143b4f8b94dd5fce95a1542af1777fdb5d68a25b00d8527c29375310535d3270637c226aaa310c9f53ff3a8c6a1ad26f3551929ed933e1453284d7424c5ac883d70e556b0c741b6fe8e717f53f53956c663338e5e528973726c7c7325cea2a1b89e391c6f48f5a0aca1f91132e27ac6e43ecc99abcfc139d5cca704195bd2625a7a521c068cb90f63b82ed7ab04e7848e2ce478574332037e195d7e2db24f87fd9f4ff372b8dad7b4adeae58b4695174e137430cd8fe9b609e040692e8210d45191193eb4bf7aa93cbebe58ec2328e9c17ad6b145c482e558a431abdad1f22114a921a43fc4cf15c0d0aeee4d7daa00cd44b1d693e1b80711d162fc13e44aa5995809cb8bff3ec6d6fd2fdaf919d0997d243e42f7c198b075cd2082f382ea76946ba77533467c10767d93f6050c53101d00f9942acadd76abdf8c8acb47a95e107b1ac6ad2c0bb81fc2b095dbc8e576ce34d974bc67c309c2223cfce41e668ee2cbaae092c8579cdfcef68d129497f905846e1bcd471716439e7f652630b42b7be0fd0af9c9fc2e9d79202693b1c82fefb91c1aeb928075af4abfa52f13055ab0784f3113fa67659ff901cfebd0d3050b111bb119c7c2bcd040bf7d4642e3d5660e95e12434db96e1f22626299fe0e4465bb8110ae4a3ac50c06bd0ba3d1cd57cf9f523ecbd085a18f84fd4bc615a3e863765ebc65f0cd9d7dae6faa1a9a156796d1eb9219d6fac00d2e1928db978e102a2d7c96c51e9df0ed68537fe24ab6fa3956e0d8708eb6e1a78bb43c41560595c1fff1050b61c5923069300aea28789b295a3e2778220d5827123d1067c043216c315889da390fde6c1383d859172967865adaa8a0c0c9e54f90b9bb8bea00d44c6b104046edebf44e0223dab5f5e065e795c3fa076a9714af83823bfe992446c32205df62019890f62b56297ab6b7badb3c3f912d92be9f5f775bdf737026efd71f5c20ef52ba7fed4335f3e7615d00bb6d98bb6c5d6a10829478fa3b0c351772b1db3d068ccc04758eb970cd50c10628da173ab7b4760928b8575f479f6d086c3c61ba2328a06c440cbdb46d905a80ed7ea01f065f97ab50b9853f252e1cc11e96ccfe813b67b3d4c01d8e44d484e9c041db0d9240a8f37be3de9410aa4f08d699bb50beeb1527e921acbf0608ff8e60cc6f6e4c9ea3ffd2124a01c23e8e8c22dfdfbb6eff46afb2d2523592311164c95f4bc36f55094ea42fb46c3a0111bc1d170d5640f97a1375f040616f3b8abea25622b574892c34d09359b29d42fd923479a29f89f00dc85005ee0c620d6c1692b4033a9b4d8c0a02e186c451bb07b5312bc9bc2f7859d4ee2743b7b8eede95c040a0f61eecc231836c2ccd16b0d960f9b5cff52759d3f34f7896df2156a6c7fb999ee287147967d99b9c6be639469b0cc2164c2887543f87d66a0cf9ee918946d7ce05d01e28c0ff11c19a535b3402366204a016ae7b5522f405962da088a1f812a7863b338c6c0f97f94c385fda5de018b2615bac4dfb598c219fe54131888a352b3e766a085f709ee4397841c7a648175dc0a948bb199833159cc62804e7d3c62d204de6927567cf603c61474b512398d06e8a9e730d7c5d94cd51e84e6d116e54ef4e188965f9376183bdd829605727ff265b03dc802389b8ed69018d154771f0fb6537817665b44085dbf6e37950bae81c5a8aabea253074de2f14c2e060212312b35841c3265e6b10f1c9c19bf58d1e67cf955e0da7a2e0092c8771486424fc8ce7168fc43cc8369dc5993f04ac91042b11ad7425ce38372bf1b74eb971b4a004cd9a33c47a89c8a3aa6bb41cbe6d4ea7fe839c2f27083634ee661110aea33699fb3866a124dd956bdf3612d167b7454de6ac16537bed5ad3295e7b556318dc0a9ee1e2495ed51b634ce8ff39eb84c9f2d52cb2bf23abf8d49472a7a7646e188f978f01e410953d545a33e075047e460cf2fefaa4b4b1c627d919081152e752250e64bfa9571bc7e1c625a52ba35a110a3adc79d0a2e57179b6a35de2a4509630788ed70e1c634a61e57676fb880f0b052ea41d194716ec05541d781f99f07e82e5974b6661b29303a70c03b4fd6647e7f5151c8c4fdc618af6e71a2f44f9418e801597ac152f8404c41f57fdfa96f771bf943e1a48999fa49b5a0c58a25e1c2bdbf87271e5ae249103ca54cbbff030a9f7ba06b62b09f25d49d393078eaadec4c9d52233fa5678248e3fece19b50128713c8e561041e1d762902438d80e4feadab033acc43d92022ae4fc2b85dd850a2d109e6e57d543e1adaf65444e0837f86c788fd8130186abd6e1d6586e74afdbb8d80e3f0ed009e1a9f2cd88ffb03b5bb6d6869140cae4435840b560b87e546290947eaa59e7328781ae0716aa17a3cd5011ecc666b9d909372416d809f723b679ecbdab706c500acfdfc858aa31eb4124bc8363c6f370ca8c27e2a18f4d3172a920edd65d210253bb8f7613c39c2b2dd069df91623d2d04bc967189e1882d852ce53d19e4b47ca6c07f5d56f998c9eb451e14fd3355a5c655bc0075975c9fa2cdada6bd0a2fd830b3b622f15b2318991ab51513f389e0b55c204dbc7db9d2c0bb108a58c56d802814b3bcd17bef9aa588c66ad3ec6495f77dc358b181ac420cc4ef7687e3da0e97330f64575396a1c19396ae78e4856d81e1ae35b7fb61a1092bdd0527176a69c5b0bfad101725ae297330060e7028fa02994bcc2fd138e1c323ac41427781fdb4f3f5eb19e437afb9ba1cabfe157f9305361b4df90e40b2ee2ae958c487221f0f0852576d3093a775b0f4358bf802cb4883ac26fa7790be0ae171109f4565fc8cd23a902cd409e0946dda483d0aa7a840d69cd2aaeb8032aaff964a945dd2c0cdb70b2a627454e70fbd6e0ee8760707bbd63f6df20b2013e08dcc2085e1b1bdafb44d8263fd058e7e5aa220380fa1088a194618888344d99acbbae5ebec6bcd33a861ce74c5e2d7e882a8391faa0611dbbce2937a6c082c73af0752205278318f308138c3afeaa581a3217366826bb86b689a51709630c179789df9a7d35ad89d3812ebcfdae8860345c6033a88baacf41951df347b08f79c997dc8c21b1bcc616e6bf098c1f297b4c6be39799f60e39279e8ec8dbf07bc5af9ea7d4a7b10e17871130cff9540cd37a29c44ad821ed3b4bcfdc38d669760b9d54c53dee49f8362df34b982c138653cd8dd64bf315cc5084113ef13da19047c7e85a4cc5f31c4b5a44425960320d8a6a0d1a4dbc2fc8425d1cc2dda820a867beefcb78761f4ad5d3be7f798043f6816abbb84ff622545cedd8d310b69ac51c25308f403c2699de846c2ab67b3292aca4847c8a7598d19c5076523f8cb84a02d80c208cc97422226b28139fd22b4b6c15ea80428d74cd9f7839cca5a75163ceb9273e9dba755729ea849652a3fd99e1c7754539e1375109975607c0004145bb0aa9072ef7b91d0eac730d80529d188437f0725f6b0189aa849eb25a2501a1b3777fe6206337fee3873d40d60a00e36f157b17d362858c007a1cc0d11fff6f8df2b2231e16b9104b061a0d2a8d43d29aa57702cda37aa142d7790d6d78d12d78130680041dc6399df703949b7436dfc6617b0175de5a12c70541def2c2a15c2662542859a3c9d2d2cf02d46b4ef763e70f0965703b6d421e8982e21370fe95e47867bac880fd03f4fd83539a958cdf7f779954a2562359cc7b2681d1f938a494bb13d0ae9eb6742f0199f681b2614964fe8606052d9403a1f8ef2f7139d431c71c2b33807c033db15dd7d08b8e23ce4bc6a3000729ba9c151fda727450b281b0118ae7294348b1241e0c5b1450ef098db4870d2fa013e4333d2a8acba8e24e3503caeec4d57198e565cdb4fe16335bf1e68817d2a05e285f05a995eac837483ea2dfa6451d9b17261f90f873eae877a12d383ccfc31cebf953cf6fe4783bdc1bee9ca52348f2ff9bb3274a47f6edb196927c254290810e1a2868e9d140cad82a676605d3cfc1f6f2bbd6a4b8dd591232ccdd47ae448e022ae93087448eab0e245184cf5c99ef42a36853a92cbd74d3c5992adcfbbd94fcdb131e7952e4fb74f91f6039c6c9678b656a057f1cac4bbec0f7e04fd6b009ac2e0687c72e43335c63d852ba0cc6e246be3f9c772a2b9b3c7e5131c1de370dd6f48eaea5d90b84fb093731a083735e435c280cac2a7e2763f28302dc407c017cb571193e94c89068b3328a3c75c88edbbf059ad912e467ab6b8380a81f38bf56cc547e8d7e05e597bf03422f4e75614c881f6bd1b2122260db21f92a855412c57e25a8254ce6dd74f95b65c1ba73f1138450549e3c287a4b12460ec393aa655f9d1eae89976e0de8e9e3f9ead60dc5ab4359cccb042a826c561eb77afa3960ebd266e92379a6e724727e4b72082768024885d89277d9240f97aa05f8034c40a021a4c91435d4050b29a0e112f64e94577bb5c6827b513ae13a1a9ce88e6027405f2d4d6af142e88ee35cbf91abc29620b0fc8596c1c76d0f390408d983f52493755fb2c7ae04b033570e1a910f9153322db287efcd50a47535b22e5de526e995292320404f9034b041bdefc218431c81ac3d38d7ce6b21aab3157b94c465b2ea3ad495bf0064ad7aa25dd981042ed214c02520a6c385b17330318edd128cfdddd674c91666ad665dfd1960c0ff72bc1624ab05ad45effcbe4e0b35a63ad166dc9e8b85f095692b5cd3767b96153626d53d43673066fe0cb6e94ab1da185f945a675eac71225d706714c4388fda776fbbbb3e4edc4c91c35b4e179f26951d60f77d40968fcdc2c4749e5fd95c9fde5ffbff5b9b9befd239ab4b28bdb92634e3cad9ad4a7541677c45971bf124f0f9e128f52ab6d62d7ee43ca9325a594ae28af695ad571e47e95a7b24810c6e0b2fcf81471e4e925573fca9ffd71f975c9da6cc593fd57cef2ee5d4f683f4fa51b67bca516e743cae2ba4da8f3b4dce53e40414219d631d9cc57f43a8f8fccc624b261a3895e2d1f1b3e401d2434249bad9ad53c50d6ae16cc07ca5cfaf8f8f8f8f8f8c45a4034e80a9986f0cb238ab056abd56ab55a11166111168166ad56abd56ab566ad94cc8b619889e8bee050bffaf57abdfa0585fac59a3df7a32c021cb94cde8ef33721d2933fef4d6d131f264b916bb458e417a32cd3183691c410326c2289a11c4f32dd1920dbe4cb63464fae5a849ab3c8e05933c540895ca58d4ce092174cc9b10341671966fe808d27979d5ca78d27cb825ca98d279716e4ba593fc94c0c9b580209998961e289cb35c8b55a3fcd0a2d24b1c850ca0d04d6f4b4d7c4124fb234b54d8c8c0eee675da599ab2cfedbe2c9cf72d4ff4afbc115db8013bb939900872bcec1e1dad140a4310d15739df7cac161cb75b0bbcf1bcab1fb40f039e22ec1add8e29875d91eeb933f6b04c8662aee107d62fbe810c772151d32a1a36f4fd6e5a8c7f5e47295d0b541d6056fb4fc9816ddefa3b42e1a343abbb540dc5a20d02642eb82379dad0bdec4aa59ebe23a27c231333cdcd9dd31c36c5d31db635d3178a3c4fd6893727731e8c6cce1fa2fc0108b75036e2c10bc0254592122eaf1d3c89f7599bafb6c91fcf86b89a8d87d5608c9ba7e6e0af6c49d76b86f5df9b18cbb75d99ea3fcd8bea2b42a86ccfeb40d5c32448f5812eb93df0ae54f41feec507e12d0122046e4cf3ac96f81f263ef88824c6856d436f06594ff8ff2a3705d2e48904c1f48e08c1ae9c1480f46807069486847b4234048dca9e2309c59867805b6bbe5584897e49dc7e4ff7f314cedc88d61b9d35dad5637e0d498cacdb070fb6e2b3f2ec025fbafb8ecb8a3ca67118ca8aab8b3e3584f3072795a9f397e6833b1630a6d34682339ec1ee5adb89fc7dc88e28f15b9ac6dbe6bbcd196d039dc9bbd6d23f33866cf9e7295a42da41bce9d4824dbf7964cf0e2f3d2bae13e9fbdf47871bdf478517bfdefb2587b4d7482fbf92c969d68a86dfc89fc5527b921ca894cb704afe4c63e83a85641888325b178f702e472456552a5ec10f83ba1fecfa569cf29c55e61758ae5e9d12a98552d8a921dfbd4a31ab3abecacec3c6a3fd0ffb89112ac8908217e78015769d8710b271a815c8931006b5c95818872fccac2892bb2ffdc1a90c8d49ee38f2d5d602e0861c486116c16575147c7540a28386492aae10252210dcd311962bac36dfcd1d3f77f94d655e4756c2fe50bc8fe5ac9e01d43e88e0384907abfffbb430821fc2c382897aab4be6e3758e397c29ae82a0e87089713eb9013d0a39f1d9945f5422965ca8694b2d3a4bcf76a9aa6d9e024e8f655ad17d26b42a1bd1a737777b7264d28e48e388686bcab11847618631bef22be5223ed208e88ad14b7318c38268914b6e042c491a755d107580c3f72728cf8e14985254ce24f6492618ed875bbbb310a55513f40f351970b6d1331ce8427d30d0d733fae0cdd322b481c71c436e41920964349828632cc2fc4a01634dc7b5d85a1e7795a8c1a36b5d72d717bd1c39f873facc953108a61fa76c491dd77b43d282ec4ff33277de979356ad4a8b1319145853435b692db301e6960d1246ec3fcbbfbc78e31469fd29e577123f618ac890b71e7b21cf4f4e4cf8485f4811a41f9971f53269860428a650a28b4c7648267da1b229bda8ba78735978b0b9744d1d112dec02c5b6c7b331842880c937c0ad3cc09e74fede5c72837e20f0f1146fe6e0ef35f5288712af584512a05a5e698e0c217751c3b89e38a852396d244352c59dd1d579a7456bf1059514714d99c1204b7831abda67bd4349a928191b7b8802a2161136249299d543ed6a8a4536af25f2cb4cd672377942ee816422d8ea390a7a05086f263843d5a7411b2b800b824063991dd630e6290c95de81734ec277a6790527e0eae23f91f83fe93388eb1b6316a55d44168491049b2c708840bfd0892bf5814877ee8c85f74921d7ff58ecd22710ced3eecc2864dbe9d4c8e724c654650d3309c53ceeed3e6cbf94dc201610f13148bd29c539b5a0bdad4a4cd97fa524d69cf94fcddffa94eca548afbd81bc7242d4423262d33f931d25e03c9dc82eb7e773526b4d83b555671bf9b9fe87e90d8c93cce21e2109191388786711a7ba086896537811a887c9703e2896b8858c33510f12ec7ec6ad0ba080447638a610dcb0e30aee27e18e288fbc94b4ce62c8ec6e6f1f75145f147af8926e7ee76778f9aff477777f7399b4e8856d0f28b853964d49ecf0c5d35676d92ad981231156c0eb2e1391b7a5d22db8a69b11a8bf12226690b8bd75efa6b2d9796b553108e499ee169e651a36413466789c5727f37672e93e5fe38677336672f55dae67ba9925be2f7a3f85205dec0d29412acbd2e1571dc0ceee7b2976c7337ea04cc34974997d5588d49975a8dc11b588be4d6aa459d004f92bf6a246b0f524dc9fd68abc6dad3a4d4b03cc5f0ad1a9b3329724a495bae0a77c673548d463546c10131d9bb549198b750665a6542a31ab7c700cfbf8b0a693e97556e5c5fed3991aff62fbeb8dadc641b572d89a5745b5c666662c01b19938d89392a4884cd64346c0c8d48145ff1151323336382373332c475460419220020c60cdec064886b00ac66e5e247016bc8515d14721418428dd3f272209868d8ce25fa382aba5cb04846500c5290080414233342cb8c081636942f184b182358ed8b4bb309619341bc0501aa7ab55989ad5601e8159e39cd9420612cbd825ddaa3d522cd4e9d2541e789c18a0460b52325588789c0033158a420711557257856c2ea10164370089e85b8a2360d5c80c8851660310880f4421d80a539da6381007f42c1460a1168af318a84a39a3053236512a6c92ba28a34932c393ca43cd36ddd78e4d65809eb9d5e4154e34d3625b77cc11d4833d26cb6c9729366f2e55d005b00d28dcda80b03a4485748242b50b5c95870c82d61122661d2005613c2fd48b354ca4933479d2e25cd1acf246c2661302f240cd3200531a54ee8130e100f601160254cf200aa4833d24c8bdc27b8117fa4d94c0c0dd30c1931605e5c5a66665c562340e1a3f5033e8fa3e8f467390a4eff774d7613dd1d1aeeefdffffd9a5abebfb4ff3e82d81b99fefffff17f13d5eaee1e272519d12f60746f771cde5d5211d02c73a74378c27abff2c41f869cebfe0e438e3f0c39ef579ef8c390f39ec4e3e8fefec41f063a053daa254d89a6445362618cad55b9529b74e3ec8450e078408c3898dd1b38ae9d8b70467280cd94858be789020704a0caaea01476e52acab289dd2af7b6d22429880d1bd5de1659239522b1b4b8bc099e776f8b5396a36ecc9826cd24614dc985b16fe2791e30789e87070f4f0ccfc39a25f1ffe276085296a3a8b854477b2c6b795c8ad42dae94dc78124522226a7fd657cc226a75d5c58f1350747cf85154c455f71f53894ded99da467698cace74ab06b04092c51336d0c10f392e98537ebe0b333259a6e8192b18318517554cf043184200aa01096e0b716730b1cdadfb6847e1e33c6ca7c135b57cec71814d1301b1d8210c2249b47ac0010f47703bfa1b0a181b44fcbf917a4c1288ebe9b1398088232f74a8306972c408f9ffff228092c289f223072e1f448a8020520118153fe8e28bd8aaca8f0ddf41d351dccf94dd71801f8004ab88155a4861c10a86e41e9dfcffff516ee36bc2422320220642624274386901ce7785e4cf84bd1af95918228cff7f874d44acf28991224a784085106280138b90336f246e3384391b4e0e18874824d2f8bb27981c639f5e728c2799d8279938fb74739c91e334e5d88d63db1cfbe492633cc9bccc6398acf589cb316a750aac715c7b006b1cf78994e3c30a2b05b9ca62ff4aafaf34944b429ad7a2ec3e15d6365366357a1f598e27192aee57611046595487b320cba7da538551bbba75969d951dd70af3c7337c942d34dabf4af12a05e615e615e6ffffafc9f7a9534a3e8eabb8efd355587b486eccede52a050555f58afa45064276fc29a066913db383ed7d58ce985eb28f45c731e209e4248a0a30cb19e431581369d1fd6066505dc19b9f30ad7b686519ded4214a391738b52bb1cf20dd70130987a427cac5fd2eeef7576b0a2911df4b392afacb51ed4efcd5369d8bf20c72149d41d05f748b3bc3fbcb69744c7c11d12daebf72c43c23c020a74a4e11a00c9714f1c9101e65082580c404423ba229993e66103308edc86401dd2690e9ba1fcc0c62fed08ecc1ff3c7f4d140d4e94389a664fe8064fe00cbbd6d1bde5aa2ff11a816e95af9936ec821a02a4e693924b79cabd84579e28fddcd85224cbaa46bd55ee3d5d6f55db9c789b5c9ea6fea90576d3337fcab99d3360f21b0fd373bfa143687a8d3071a778feeaee1149a06cf0dc2c2385a07d3a8980263c911aebc615ca25b73b8a353a74e5d926e449b4ac19bce14e770a16d1c537c0254518a61944f019952ea44a673d2b447713cd10eb74725a51ca6183ae71cd7241530dcb60d73da161f16a9f7e87e7b2d426242acc831b24a1936113273e5ef9b0c69e588bfc910a05ec25d05e18a04815208a043dcb0069e7083da82c38db845a59af11fbb8c86610e8be250bce17962519c49f176cac106ce94325ac7c2c430e7b83854d364178436e906c429383ddd2004d57b743bc3253e50e488210b11d1eb4dfd1ae55c92947e5e92fcd01e7a7fbadbfd87be4f4bec7fb8d878e2b2a9bd39e7a494e338ae5621ab2f8111836c21430890ede1e1c113c68c39a445417ba8e5c2f442570a8dd8eccea041cc0c4215995f996638305e08132d0a118a48921df6437ba8a93d193264c8983163888bf424d2006f4a2c904bd0296753f22f2de82c91bd437448ce1024235c81358d1fd6f4f81e7e5643a6641a2144429c2c112284616424c8960ce141a445f1a6f67e00428687350f6b3826a91f233f3f31b7ca854b8af8a1192e29a227b793a6a89d3d9d4ea7ae93214482a5a1a1a121818418434a20dd28a18412482a9ca0e7916e7847f47d3e01061e1d3684c9ccb0c990245b864d8638e140ed0d3e5d52048fdf208d5e9420eed86d03908f2b3e002a72850e4e1881f1b1851139e860020827ac28f182258864ea3a08e9e8f42c53197ceed01d7eeed01deea0e16ffacf1dba434dca985a0c186ab91db1458fb8f0791cc5c58d58be703b26dd5c363a8768e55a6cb53f6f5cbb3ef37f27595962215d77f721965f99e60cd2a1913afa14c2ff1e43ed56f8b94377e8b2fde70edd21a74307a7c31dba432bddfd1dce8032b09c61595400e13febdf64352818bac3181a2d1313676448372086704666868425562b2b3a54ace850d9b1b273a4a3a313a38e8e8ecee5e1840c2f5ffe0e8e9360033aaf692f9031c638834e74b2b3b36365c72cc1bcc168878a951d2b5462b44225c61d54ace850b1a24365c7cace918e8e4e8c3a3a3a3a2ad8f161aeacecb0b263e7cace8e1d3b66723a1046187705ab1174d08e489c1aad0cc4691c8e756377c4a1d2e843edb0a32c807362c71b6a17e5a3ffb7c41f0d9449a8f44d98f5b45434020000009315000020100a88046381309225c29aeb0314800e6384466c643c9486434910c4388c8118c618620000060064904108991aab210086d505b61f4d2108fa60407eafe5da663018990f94b4b9421fb326538f6692803dc0c684679019c8841043e1f43be243fef5a382973709529d3d14b03bb2f83281c5787173780f814fd93b7cdf1d11d7788d09cd571ff6eefb2caaae4a88329a34ce765ab17125490aad051336409704aaec22b393ddcf0b8cee33c0a16fcffbabc912d2718b85699a0f5139dbde0b5b8637be2c5ea391dd43bbaf7dd6f1a1ba93962c864333ea69bcfb00fbc9966b543086a2710a4d79c5003779c83fb182a2313996e5e6d38b05b275f1d29dfa7a3499f4e54c2d22dbfc26ba66ffcbc8d1938472a859e67fafb11a7e8248368322c3d2bcdb91f4937c2e3295d21086997d4db3f6ab7b4cac52df03e7504466c8094616c5cbecb40919d07abdcc5a870c9dc2f192f9440ab3933088ac3d4c46b3b47f260a6bae29b185ba10f8d246abaf40761aa6f71e2077a527f5bc3584263dd06285bdcf7e49bf2353fd2f882a8686d70a246f1ba555f7a996787d58860e0baa7e00b7a8f336db70e07a8d53df72a8731487911a94a2e7c5f190f63be0a5a19e50a404ab30e2589f2652dfe828ffe41bcd130c26000109180102c22e418f5731fe8fd3acfd2839a92fb2a3e13f59668db8a8a3d5c7fcf9609205a712e49673e8da2273b4ab55f1f1a1bd205f6c90a27d50db829d6adfe93824b6936c4680a82395c0bce6bd388e5e7958daeee39eb18fa292eeb5ebe59afa013145ff77871b65f85b533f5df9965df0df579bccb64b39a01db5ab1a549a4050bb73cd8118074350a589ecfada536942c5d39cae89b1999d33b7ff560e59f40ad65673c04172b89b05f6ac84647dc78a53c0c2c4b116655f97a289ebbfbdccc296063e37cf78687761a16b24973d24e33a26e0f7876491c3e27276b0399242035683d90632a99945510f1a080e953e474db1b5cb8b1790a64d5a760ba04efb3f134991dda555373e1363b2bb8090e063be126f31216f4aee17277b0b08e477e333abe7e22cd291b36db0161de2d99c09729222948a2622ab6847b18d369883616f077d8b3609082baa57a3618ce22a7222981c519ced93560f1a6630a7a4d5c3241c71bf6445718a2aeea537cac70db61f1dc92728ce2546acaf0eafa36bd0b1356460a8f964583bf1fe6d15e9e008f01b62731e016b527c263718a8e7b581c6d6f504a427e1a6865d566af8cab256764a7f279d44395b3bf91520bfa6e1897f039a07861b79b9eb0b4d36ff6243d844a380a8143398983dd48fd8e181b47c33a9bfe4a672c8450f5858c9274da3b5add2db6812b97c6fe08f56622d3ed643b19d369925b1bc410b2c9b16a2ab808552e6d015dd1b480ec9e5b49c9ad798c1396f29467644046ec42b7d10a4cfaaf51d405be43351786f80f4912006b3ded98e0735ce4fe83814c502323d01d68a78465e91c47ac1d80e87a13639ba01d1d757d30cac8c5a8160c6fb983d0c8ced1304d072a4c4380778e431e5791c10398394bd5eed3424e8f90aeb40870317bb2789fefc6f3b44609ca1faa2f30a86d857d60cff9dda3754d714824574dbc4cbfa0f12cd412f0121fb9e8a638d5d031f8a97b2b92f382e7fecd079b1338089e0e69d5ad7c531b4c01c1f9a7db52b02b277406d1f57a7d444be44cd8561d6ba32345cbd39f9f2e62e8f83ac5232a245a8862821db52c087878b90f59357ec05a8c513060b266344a425fe637c9fb3d1f4b6881d062fa0fe85eb14e3388c54e643084b9fc5d69c1c8d86ac26875f653a038f845667f4826f59617b0f1545e5de2afee76d08bca1fca87683bb6bc54202f6453553da3ebf41c55769de052adc81c6696a9b66f64cc54bf0a19d5a5ade5bd53badafb796be5fb9d74df61d9502fb66e2e4bd5157ecaa23406fd35cc3359134368323cc2ebf6c1286cb8c2210f4d66ea33b6d4af89c3e416319d27fd66e3f45a5f69e67ad5e7843959af3accc0aad34d732cfda48ec5fb56ee4d993ae7534d3c6b30c912038eae359c0b492842877fe594044ca8a67bba316cc5c6233e50ff2ea75a88e7a67e915d3f30fee8bb0a12e4efd61f3b7899988894c8e9b72210c8454601a161023974b79f41bd39c5f180ac93684261a7ea7b6fab6a58c561af9df8397a9447b02030559cdaba7cfe71b0641fd23182461fd015d9a04bf64415cea71b7c204e672fb56343b19a4ffe07d4b031c4987a7ff635d844c3c7cb9875d1284c5bf124c4297fb209af84d01a9a848d4850eb5b19a2cef1140f3057e9628fae8abd98a01104df6dc5885c7d30ad36bd9144ad5886787256c7c31a0447aa6e1718e86626722da7cdc8a5a33564faa5438548dc7e5d5ef9836f560eca213ffe205611289334704caa2536419c8cf7daec407593460e7424b17669a1e879b2f6baa96218ace99f7b8fda855f596630c3e99d1d61bd1eb8587b2a7658fb6343f1be1f7b7d593a002862689854939b1e2e3fea814d0d645fbf1204a2e35fbb3e6905b1db11709fc79d0ae055a4099e38db18a11c8da5da3b561944b1e210b686d9fd4133fdf1e5f4cbe04a67b578b36eea74512795b2ca2f14e4a8b6261ad0bfe68047c05e3622e8d763546c2889b4eb9ba3c1ea73e711e9b03c2c552fdd99c61ab00381cfe5e906ac454f48c89ce3514f70a0ee2e5f8170f7d26c9bbbd582788c06630ea909501581180b729edd0c1843296632ec4a73727608c560da07529ebd707e201cea3e5b5a3e58ee32cfe5c7ff595923c22a3c9d5dca46f0f716f78bcf9184bab863ede5abe9644ff0edee7666862218bfa17ac4d7e7432fef95647fee42cb8b497d5cec9d096e29180558375c1d2a478c69bfbf60c8597b9bc8280de25526d0f67c2cd725268b3d9872019583f9754ca0b685cd9ff8c1163d74d43beb8322d0736747340509b23233583ee21ebc19a60655bfb2be25807c9af66c557a1d7a3d8a15e15d627bc00c934ea516877bf2e26abd5cd6e86488f727893afa66492859792c314764960e2f60f32bbdfa8ccdffad79bfde8b0a15d65130009c1c5ec91be037b6cf1f4d34ae05016a7aedd140c9c3df4a63c14a88d944ee2b809be9958d0f25494a20f9be614595d3a53f9a6fe06147b86906566ea31e21d4e8576f27db3da4f1529559f61e91a4d63083b04e968e08354398f50e685b64d431fe04f11fc2109d5a96f8c8c5ca1fe2efbb0f42cca1618e2d78cd1cca24cc17fea83870573fb17ee1fb6e03f4412af228bd860182aeec68e515af62f75e274dd84e1a810e1008681243bcafe869c3ca6bbcfe9cf1a0416d9713578a45006c3c91e75a81c6abeade9845c33b9d1e7610738785d3cd665aa0711550787753f81bbbfee8074dc6b6854746d2f559d1f10285e3e97064bd2ac04452f2332e751ed877d419415a5a955da2570c41bd60b58d39b30d4db2f35465fd50170797495df1a711c3cdd6c70bb91c21b606e3014f91bf23aadc2d753b8a4792eb88aa585f43debdc34155ee02d93b276a26b0fa3b11e74c0b2c1a6eec914a36edd9f7f713666cdcb1e483cacb914c001177655bb1f8bbcf9407a6c8a489d15405a455d6447ea4d86974e7a408a0d1929370a6d4550d2778031ce0cb8f3038339565a70354a40e868a09beb1d46be393494c40b0b11eb7b0101e72ad0f20df5918739c98ebbaf48b963a73492ee684cab56dd951c298f03c49d7865f03d1348305f1b0d0f7cc2a2f9ab4e03aaae83dcacd2bcb094d487ddfbbac325c71f17a5646d96c8e45a7bc18d65d80ea97726dd7d606a9b3bc351a91b0402548473c3ef6dcc551434fa66039496d469149758a1b76aee2d7466e0cdc581d5ce3caf7caeceecee812b8048d474b93acd4edd088f714b493a699b34faf374681e9eb7699bc03e4755ddd716c335c0473ada6e58d7ecfaf598f92f8d08feb09e7c3ed391eb036f93354aa226581dc4fe0e7c87f4a5c846a6df94452e2b1da5c25c80b816afb1eda6273e12d7ff2e99747da0431911e00ffd23703b534ad133a820aecb6b45feda05b3aa46f880e8077ad56be984cda38b98646deb4587e70846503f57ff444ef6b4987081ba75061c28f3b34da1bb39345f6bf83ce1f273ffb5171687658f624d636796f8c0166b8421158aadb9dbe8bfa2d67aa72ff088d1a51cedb8f2b7dd63ea1f0377c8cd81b6211fcde5343dea16026777c39b8f7787e411d22586e2ef91d0861b40a87a23fd8188467a72b0d241d565154af9fb5c335fbaefdfc5fc761b60051f4d6b5db675bab9f21949bd9b2ec17adaebfddd37e59ee4c53402515d5f2bf3d7ae985535c60f443bd0a94e4be76c1e55c424abf5fac5208b02411a1ffa03ad4434d3d7a35fcc5aea19e2672c3e4ae93ca950b40357d42692b2c43a632b4256ef638233681dfed61f861b8e703738a3bde95cb9f6e426408d871fb3e46d8f2a800335b0503d0f7d34736af3bc55cee10062216e1132c132e16812c9ca1a8607fc3a79057da8bce70aea119495761d6ab8c7b6d3423f203b64caad275da2a4f89882f7c8f9aa0bfb5b00cc0aa8dbc2b5cacd3583d4bf91d658ec09b3d170240e602dd016985e15ac93918d604de20898ff382da4b56a86f67a42497de7806705984c5009e18070888144d2826e8ddd213c447e6497767c1a06ac207399252c97ef4aaaff8ce378f335d22619d06356cb58192fa5c023d1f18a0e70fc32471e0b98d210eb376234aa3cd5c8ae2838bc4a9e8242f46013f44f47352b0b3a0487f1b34a6b0f08db90bc76d70e45dae509f9208e2c0ef52c5b047989d2b0aa50213f03722e75039024226781e6cf517a874cd97249e2199f970639d29b0f5e597cb3e1daad2e82d5387e0e9fdaf344e8bb4cfce3e71598f5d8b0553dc5ed7da11e81a08ead608da33817930780155200f5cac8032a43ffa39696748641bbb100f5a56dd6b350f2dac0591168f91fce1c664419081f4cb571a6e0b8b2c1f33530108478f6b34416a1a450727ce298a7d7145f8b217163c454d53b5e0a51c85619f97208cb5988bc06a9ab9da90e61a7f5442acb69cddb09c7d9dd56da69ef09b8b28efa3048777eb4c2b3931897f23c62551ab7968f188b059b40d10ebc9a4210746ea2a51c41540e4882154895cf2aef65275d89c86682463644390f2c10185d60040b6f0652dc05115aa1d1a5af907abdb05b9d1578c3f77b8cedd102fdd08cbacc94811af724c72350e3535ef0059ffed948ed2ed3189f88cbe707fc1c63c90e4368b2344ab013403dfda2de93fad80afb4cce547711a99efd3473b75778812ccdde3f76f02edd3c96a3b013c45d32308c0abdfd5af0e0e8a46a49c20b8f22067b71545a3619d7701d8c0d375ad31f08c3d114baaed6114e9c5ce873a3a736054d2d0bdb497a3dcb1de9b811951b2425a50e4aefd242cec304d9e8b7cabe04c636e46f8ec19b1292e2f8c812915986a51f231e03a91e0de01ffd9baccad10d49666ac406cda687adffcf7ed3e3650ed091cbb3a7001ac65b439015428080712be4405432c64cb091b8213f2ff3f0628e32aba326b13ab7ab7f1df7a0957836d7e81490b44a0d1b79aee67669c842bde28ef8a2632cbec0d85a8194d9d2e834c45221b5a4c087ab08de1e4fa84d297fc90fe60d044e9ac7ac7c673c7fe1833fe1319b1c919f60a8a60bbf55ddb158cfefa000a97bf31d3ed20bfbce55b94999757e334b593a787daf1d3fdc63d9088ed1cd8d5aac436b21e9c91e058597d86441c128a637cb420b2be3ce7862719ff1452cd4a9b04126662b376b97dfd82ffc095cc3e26a27f095510277e64b321b5db44ae4ccc329f1d6eb76222cb8a894abc45a1b445356a5a69421173d6045229cd466b156ebbe7d92a5c32d0c95842853720c06f36afa2d06115604ee3dac4653be62e136421e27924358dd89c984fa53f22022618797df0b564046dfa819db4e24a05ea4e017854d4e64f2e41a85294c4aac8317064f5b8d8ccc6de54649065bd8f62509356b327d7c065a41c1f60c8f3741783b2c82df51579142d56b9818965c5791a2edf6a3e65da0e1ac0b1a42244285218cce59cc7939d378bbd1e77bf082fc85f32ce51bac1d691f921a19d2470777f3df6af3a5ee4727874dfff0de0eba53ccc90885c2d5c4f6b09a53f02c7e5d8af118718bcc8c0d8afa4454667a5eb4f5b1c711a9f1935c239720e9ede1bb7850926e59102bb6e603d69b64a38608f070dff47e4e91c51692420fc3b93480031870cb5771791d2620e69b4b88d2197c833668c2dd026d9e10a525877224586e773997264702765f3e720cae69d2cae7f3e1de27708deaccf6ddfe8212a2243a8344769164e1c0306ecb6aa2c52eeb7cdfb23fc31d224aca90c8381aee6089f806133a954bf20491a462c5ad279206e958801031ce1ff927fa314a61d735656395377abc28947eba09fd417983ba1d9d2d2f7a16e23c724b45d5906e81700fcbd4733dd7cc242c26375c7c2b34fcdb1046dcfc05798d6e11762bfe4024bf768b751a9f7192a297ede89bfe86fb36648594ecb341024226fcfa3587329b0d24cbaa022443c32a89ef23ae0cdcb1ded5337b62dab5f120735f135aa02ad55eb5182e6e9b1f5a8b029c3460dc57c519fdd9fb867a409df0ceecd15f16106efa4d7f20db05d27e9e1ec948e2970ac49b571b07ecfd3a16be322593082f53d2720ca4a17f13ea585c6e2cb4a954cf187b95ca1a2ba551d3139d7ac11869863eba6bdacfb747917fb06bfe063eebed9c817582a74a4279e808edc860b7a11559e97304f50ed3366e69e7acc4402be209a55236263c6fc5329f15e116b6e5cb9cbff2550089039cc8e59851b0a3c19f9713b6dfc144bd4e60efe9827d572ce84fbb0b301af8e4f6fa86e7038ca8270f3d6e4047a1635543dbca199837a62883f466d354869af10adeb210bf865e7277637fc173835d8d55ceb2e5426d761d2410d20123d95684350d6d7b1d319ab2eadf97ca87a8c650d6f0081a0f66577ffc1c369aad13616c3d8f610bf243d6b23dcf95d952765ed28f0e99e0270493c5ebec00081b766bf6940de6281725fac44bf761cabd88a89c2f8c944e892b6715f08edd2a2e0f8c566a176f80a8f1c69493bac38361a8ed345b9c2ab943c5ce268e8417d31a19183c4836bc21a93e08551ce5ed2badca2f7b66ee14141bd6131b4e281309f4cce4b9917b08aa3a8fbe97b7478eb97acd5b39dcf8093cfcd1ee59395820348af31706f17430146fda13fe0144b4542cab271020ef712cbb6d0cacc6d0aac2e0431f03b816e50f2860c24824981a02010c32ca8955d3511c99423cf2acce580b70731b999c7429e6216067a01cf0e77946615cb1cfda209ead51e0aed602f129a3420de3571ade3e2b5772caafbdd88bc55729bef8e94063e75ea19c35d7346c2738b5b04d073470956e60067891a976dae43fcae1e8d6f736a3aba4fbc109cb782b111615b2273e01c863f954c22c6bc0a512bcf6483bdb2118b54990963e0e26614bfa1ea20b66d00d9cd6bd980aa09ad26cd7b4f03c3052754cd139b15a8a168d647f0f5932917c6079fd2c7a27cc2970fce297ed162e4771dc7ed4d709a173a63618cf415721827a8ca0320deb264bdf6817986d5e9a95d9ff93db9e1791f6816d8235f5c98bd190a623e3a80a8df0517895443a6d9cbbce8df1601bc74378a29ab09977776905f78701ab7e8340e3544f4cda2d4af4495d0354caf549a344e47ea9d8b9fe383f0d7517e201aaae635e8c741d3682d6a5c656f82b4128061e1f44bd1d3970191dc9c1419e3169fb9657684c79e88ac2692aed183dd804880686909f94e3b062e809aa36291722bd62f0fe930e51f1839d625c59a4ada40647e8e2d2e685b2a42cc9e6626cf647278a9f3cfe660b5c2ee4997f4bad60fab299997a401a93da0e83c0763f0ecbb4e2d421f0d0a167e8af889e4779d5e0c2179b456c19feb2ef8e9e5f4854ad17ad0edd744a86e9d592d4bd8eac210c2e74a515b24ac32f7a5911e6a71ff4abe57c2e6ccbbe02fd7f4ccdbda22987a8ca4d10bec94f695161db15f736d56b33962a74ecdc89324038999da609276640d2595202662d086ef146dbe4538d7b1c837ae9e07b34de772108fe0bf62dab3f5290d14c14cfa9388d3ea90fb845abb98a493f873cc99c0d72a089b6f587f201532523a0b66283cf896ce9808b87b760b79c6b0bc5ca65d08884d482a38be7281fa9e11b81ab7ce0a092576b613d3ea151cf00e1e8ca39a39f38a042426d5abaef899902036802f219abd6d22e66be6471630727e7103cd5175377918d9fa7ff92d0d9c7e9456493dbdf41f6655ab7c59cd774b22f5401e6a4147c6dc21be382f52de362656164dd3f43467623a348edcbd21fc05b6ead6d695f26c6d9abcaf3bcf1cdae885609667c2c0794e2da174d750020e1b42fcb37085b98a0b5fbb21a796f0f7e65fe5423db624b5f500a8a95e50a00edb2fd37a823f0e03b5c34850ad3c7d39ee46020aa6ba94b43c32416b1678585e3d8ad2f878c0781737d0f03be9e170ef49bdd891a3ebd889be7034395677d39faf9e4fc18e6896bccd5842a8e64d853aa08a752d72d3cfb52b83a63eee7b7a644944d461ab6ab12b7d05dedbe300aa97a99d90fef36e97e63b357b3ecbefcdf7760509b32f818826caa37f512969f3711ec62e2d0c5ee4bef103e52b90096020186657c2d2c65d7d8396b6acef150a30495a917d7cbd8f2df17582e398e47a216b0066520161018ffba2f4177458dc4c5298b83fefa41e1fffd8a80925f7ea20dca6d79da71d227640af060d41b5032810b2684e8f48bb820ffbd541fdb3461c2d61c638a0d063c79b6874d42148bf1e2648ccfd00bd22a078cadb72e7230b00024c320b6db375e6e919fb8f009820b54ea9a1c952b6ce06b076671a62cb90a37441425568a3f3c5e59c51807c332fc39ffcd1a0ea7e6a1c928b81caeabbfbdaf8a30538fb6db7f12dbcba49f6e6d3244e43380b4c37358687ef4edf86091fd8a546fd883ddda73c67b990c29e17fab1acd4f40ed5b73417dc0ada09eb401796a556f539e7c3d4297cc8907bea80c944cc97c7036211872db2f97bc8ea49d48e792111607a2a55e97b355a36be3bff917d7a461755307b955b8344c1ca9385997fca3dafcf724a7b34ecfdd641c4a05aec5f2c28309a5c8268096ff444cd82d0207d9c807ec65d6874d69c1c0edbcefaf37c6941292d0544a85dec27bf27804654a7b68d88435d001e6364f616219934f2c514b34eb3795853a076eb96fbbaee694bda5e4a6b45ab36cb5daeb52f18ecbdaa82e92cfc98083b6dc782222fab853b717f2daa1d3d54ace961946c6920a2ae0223f957dbab19a783e1d192189ff265ca2fc31448732e7c3c6ebdae37a42ade5de69ddb325590465163585320fdd373ba1533a5129176d05e56267ec4335a66987c2425e42efee06eb2a1724e65dc8603f6f77b1039238d1ec90e2e4ea2598757b825c71656c346cb984bccf0d7aac823c65a185f9ca95df745e01d595fcab430c4b9ae459a85c9b141a72e9bb27be4499b5273e5ee4862b30eccb2d98adde9b462308ef3559b4d9080a358c8f847b0a08610db258136cc43fcd9c138136c9ac584914509377a1efa066c9d3468aa51fdcddea501812b9e85fbb7b3d0f8abe8f3cbd4d3498eefe0be0c6f1f6e18a0985d112b9be928de993818525bdd9a15028061ca07f326b9b08a7a6dba679c2c3b5f299e4c3dbdb664f4136c790c00dfb0454f8832679321741b85c61de39ab658bd6696a684dcbb700427b900d03345e503fec98d5977abd07287939c41cc19f481f0bc5743d263a19cbfefe166842b8c2b8cfcd99daef8a0ae00a86110f5d8f29fa779cd00482bb155180fdb91d5f88b49ca12d821310b9a8466dfa1c79090b53ed5718781d5ff68e04501899604f3406ae27085a04e37c56fba3735d3a30e4aff9255d8199faf691140383c3d1914744e912d7f1ebc476ef984925376e638f6b277bb0a8439a0ee7ff82139e7e5234c2543e8d10dbe5773b289fa25584c56a7d7b841201c640e4bc9d0dd85d2475eb8341b331743361b126825b133a8f666930024029262e422e24de03a77fc40cc37ddf87d735ad8884271b2265a09f4706813a799211fb8ff361267896cc92c918c215127b4dc231ede20759b30fcacb91158a74d5b70780eb9b63dd783bf839ceebe18b7287867e7ece94154150cd030ad176ca71903c38af8f512ccf4e7e393faccfb71aa0c4000e569aa6ae4cb163869d9736fe303bbda51d78fe7e4c8a743dcc6f1d68ea617f8a5144be8ced87d6f0cb1472f9e3da016e5c056f24bdc2f87ebbf9fa3cb2b96611da8a6f8e8408338f5439e0ca4f415e9d0a862f551ec2f574db93d3200f189fb550af5d737394f14b86710d51bd28e0f8a103916981f87ae8d6d2fd9ca2f4062a31dcf1a0cc6d5e45b537cabaa472d0c081398bff622473ec218b6d11b52147ebc5f02efc59d9b6ec1fad20b68cc32234e481ae7b1a6ba2c6a908e162d43390c34a8226c2ec11e01acf6f70717fed9358502269fa9101d24713ac1604078c741d429bba5bb93a5832ae125d7b5b91a9ed50905c7a6cabd6d0ad52c01d2a8be17b9727539c387b26e16eb11242b078dbca74c71d43ea016e7e2b945644545df438b61b2802b6c9f42130c9a44ce00963f5c4cef83c3bc4022e9eaf887aeecae0484571b63f46cf4620243863889f478a7c62d09ea037aeb6803a226278fb5ec724156acb62e706d47cf5b7a09b0aefd047ba81979ce391d4f17bfad8a050171f42ba040c32191e0e9e7bbb1e5fc10df94edb1d2b5d78bbd6b2e0203037fd24abe2401c0f00abc256b7173cf9a7a54a1a91eb7b82990107eb79df238525c275842f3b75e67ccc3ef1e4025d9b8f05b61b542035a68ea7eeed1b6edff1a5b062d9133c9d8b39d78740e8acce1523ae4dc604e0e8627dc64c0118705c97fc4af731c9c1b9164a90ffcb33ca001cf30d4bb1961950038cae0ccf0b6f5a846c291fa426f00149c9163cb2f5d77957c0a0b10a7d83c0122b2fc98a5b5f5db5638240c464185c8ff8ae4b170d8e05b94214994d0ca06255621a6f5ba5a6f64d8e3f84bd6fd7a8196584cc282a2cef82009c60194dd3c9f014f767827fb4d008b1d30c40ec17197b3a8f46fea5a06db999b14c903aca178b3e9278610e0d05caf47b49aed10a165bf7505397855d820c618b3547392da1b3835d22ff279986721117cb9e271f5a23e0ad49cddeda2f3c20f984490cc13d5c6b6c89487c67ed1af22996b70c5464b46c03c9995539e19bcc8034f394ecf4184984ecfd30ef1a54116e131ceec0542bd846a5e323502152d3b98a2aacd25c6b18432982022224142ec5d47d113f66047c3e7546c9ce2aab383ead4b62df454d56e14e1993d7f18b5f651505716d6e6e691beccaccc0d34b5cab2078ac8d04d19c555075ad24c9ae4bbd884651f09d77bc90ce45298a2c1ebebc38148d5b1766f4d55f48959cf1e4d990a5bb56b7a49c64e95ae3a8e713441503338291c96f7a3e11df02314a21e7c34c4a016402d32b366440f4224efa7b805ffe21dcc1fa4d655a103434319dc8bb41397657a96b8912439c1836b27da08fb5859ed138da13af658c0be5726562b35e04352bb2e5af38f15c6eb5e566d298451c0e505ed2468242fe845ca8fc565d83f3306b17eebb47f21067b656501ce89625ebc6d74eb4c5eaf7488ab236515c622ecc104e8e87f6037dd065a2ea45afbe8f9c142f5ff3a3730f38ca0a7ec7fb932feea13cff9c12e8e2188865f06aa588e736d88d665ba4fd34339e3226d3d8780ad55fc5e077c69303d9d3875407fafb2c4d955ec21628e52d6089820c1db9c5832c2ff3d51fefeb02a75de729cd72910d65b3bf7415bffa92e77839392de351be12cef1c286ef5034292f5f9d1db2bbde117bc81caadbaed00082febdc0e419c08e204d299b5967744c042b6be0b30635c4dc7740d840e35ab21543b07a51b832d3663bef8e9994086135d7c98e355f40f5cdf8b2203725773de1fc7daaba03bc2314d7b9a2c78749775ef059b8e57285e671141d8f4f0ea9ead1f2e9626b92d07926790661de0f25be2c7830f5e2272122e771be5a2f8756c16db0f706749d22bbb1c022bc1386354b43cf2dcb7a7f5b91c547cbcee5162f40c745d0bbbcec0a9dd3e589c95e3ccee5357c2e654453672eb4f962d8f5eb3e95b89a5960257791b4b275e38e7bfa9270cd185899d53996a9e9bd609359baa4a5a5ea3c99857d4079ce8968ca2c61870cf1975928b025531cd6886098c99f324bd1e306813a69cf95593e34dc77b0d0082d3448ac8d87b2e67805d84bc0f74a32cba4bc6496460961297693cc627997b7fc348650966e753dc8254059ba41bd4ef8e5a6f35a2236b925050bb3a31194f0315b9427ba58bb36591c59ea74835a594ed51d917c7ff6ea6e86e4f6e1b4f6452e4a7537e4373616964b250442e01f20861bb9881b6af566a32b549236986248cb8df59563507cc2dd26ba34aeb47b77351472cdf7f7de517c2a5a1ee0c3647d36cb507cc673e6b274f2ddae2640c814dae47c9ae69e21645cef5e8f6004771f04449d452ad8935b6db040483c9b1b8a25c12de1d2289a20b768252b43775ef260825ce1409965dff418e1413105621c3e63a4ba163431eb335e6d74a257c02cc67077cba8a847cc5c2dc2ac1aa99b04539b4c11ae373d29e219c86ad36b86781ed63552d843e9531bc66a8b654f733c3709c44a3d753304c2d3a71267e77a60356cd250ad2a7b5ff2167c4e9d95220afa4dcc2f8eba833cbd81dc12edf2ddf28ea8fabd17c82a6a814007c3a2b8541ed03097364ce27c16c3243cc3d690152611170ee583a1f459767c4f6ad1fc91749727a61e5307c8caaaa33d3fb2f6abd0f0dc0c462aae63311a37d199aedefa29aec8a2621749641716157b0e9e16a60344d1c313601c5e595559529a42a75dde383cd6809510c671238d77236e9404c73b083d619609c1e27fa9d8e108712a96e4b903d0f2bb5001390a00de18bba91ff68ef8abc4c2795d1324c45da0c193dab2877d8b8a16c893dddb893138821a40b399b00f5e4f60fe85bfebfcc98a928ba16ef39af41f0e5031141f027dc550d2aa9cd34ebb550ec74d3c7c94a7c890f6811e4502c9320343be9eb21e8302110b21a50a66753942b010915ddf0285cf737038ad6a60dafe8d524933ea9501d5be0dda297e901eb384eef028a4aa0ed92163daf30f96e2bc79ef03484afcb65cd3025dbb8ac992c91987d419d18a3e0a4344e9e77fdc7b326ae024ef809f2b310115d87bea5300701c20a9b6f93e2f63b826793de823269945ab8027022cc4ec44738b3a714474d3b190aec423953b23d34cb3425e80a5349e68da2626a31953810fc24fa1434994c80828c93baaa5722a3bd0a21f8a81552b64f0de0cd8cc8f31284be05579d01266edca7882c9a6db9933d247e17a97b3cd46ac176d3aa8b64158cff96b74c32b7203a9c6275a62ad75995a0ace87ad98bf2e184da71cd74010aaaec428cb8372c1c9d263dee140ae99b8239b647a6732d760598582984dbbad2d9ee9244b3d3a1eff528fefa0bada5bc79a2c03ccc9c0d4576e88490993e381f32783b645785761b6235214148e53a4eaffa3f00d06440d12db2db3682a9d946f4ddba1926bba309cc62739f243057be770dc7cb72ceef3f635487a0950acc0ac5f72c75d5b875b99914eab9a16ad34c41c66a5fdd3ac9e1b80e15f13870db79118b13d2d43b772654dd1e4be86ff40128616ea4cb4027ec30687a97d9834d6e07c02adebb05756fd7570dccffc14d83ed5f0231defaa3931a12a5bb3f97e2af4889124024c987c66b3d5d9640b7b7bf836561f3bc6a1c5d894780bd68a6d7a76fe4f191c645b984ee0da920b544a119588e35a14d4622d8eb33fa2e04ec94682ca9129bcbcd387cb5c8a03288ce7e6c9a94ae74f625bd857aeb8625aa9a10de247ae126945b999bc6ed80d3202e2facc3d1af80d9fb3fe9fa012e8086646d3fecc4b2400afef21553a90ced2f408088aa2823a94dc74aa26ff9250de60006f5aaef9f1a2d76c7d22f2da7acd61cf9e902d4da22bcb0659a818ae97118e4c65a1962af2c0b1728dbed292eac214df95ade386bdda70708e4d7066eeab360d84f90b052a3762a59afab18833b4f2d0ce483fa7d63fa141cf5711395e08c57492cdbdac7d0f13b08a5a05e1fcf9d9340ea58a43f0f796cebf99cf7b33e1d481161a7225f6f032d4b4fb50df25286d973fcb23802ac538844fc5e15a10a2af895d5766bdfcdb427298a2c380ce842ab418c9dfbd72fea13944a7e0cb2b2b55249333f87df4f8a3d908d19418b44d9c791174bc81a4214c576cd69671d3814f6ac6c0a939fe7c74396b4ec086d5a03fdd21521c6c2d5033895f166b876245554aa90fe651e483a0bc22105bdcad87d6a80940d815682a4988a4e9ed4e9ad2d26556747923c8c0cd50bd2cabdfc470d4ac10eb5149749d1a5b885ad0ddb1714658e4a86a8de2e89486fd2da25cab51d45ce60fea88441677fc8f29da578a7b4011dc31280a917df64e9d9938b0fc34dd7c6d9e036ea400e9f4aef77feb1e8ee4da5220d447809a58afae0a16f34d6d2f0da2b01f70fee46adfbaece4e9c35d73c293ebd845836d5eab903120e0a670abb20fb531c83b84b7f069228612aca52915b4ac0752dc14636bcfcfa3c82360ea94f9d20cdf545896fb97a01468711af6f9b13a02406bbd342dd8e10f23e7a5b9043f4b5b5d9ac0c43c4b065e5da83100841f80d071d1cc665d16f84b337c042d0e755163e03c3a481577f64a830682ec46941161b5f1d3dccfd4dc6bf6ab1e1060a2c4384a917533bb8e6d88a0a37b1b0088b516924f849794aeac85e81d88c1ee48878989d963bf2eb6568b5a3cae41d75e25fa8e217edda41c21a8af887d9b4adf12526e24bcaf1ac1af979c0383ea5a10cb1104dc0350f1c15e0cb7129373d1f5fb2604edf20816b3cad9b865d2bb55c9970c6a5d9b6d8bccaa5bbf7313f1452b0582d1797804e7861fe5b80bc4ce019792d664d79655d90b163c4ad7870793aeada33521beaef582fae87bd9c5ab1eae6b0ce7e59511fad53a6e364d17d4ea10da83f87e87b13538179b0b0d434b716a02e30bb5b8f40243531f5095640ac4cc00032abe9cd813a8b47d6e2fd96f989b4f23b974badcad4b0c628aaddf64c18bdc2d7ad8d68a8754c0e210094c6be943e4ed9527d231339a78797b6be5536f7b03542732a7db3a31937cd88955d035a82fadbe1c56c3a9e47b50a714803fead2626e88182b15a9bb9f312cf46e1f8a5427e380b5c93c9726ca3b9b8432a90d6fc42f7e15302e9c1eff3e1a7d8156276534fe7ee1743a02c398cd871b1f04ef0f9fd95671e8d934cace951111040303e6c0780d9f342c113ec8a422926ac8f9b68f64588cad72d1c4f48a2de3ac1ae6e189f8631384f7b2336d479221e618468dcfe0929ed6e9f1c2bf26aac75940f1813828bb21865cea91fd01f318d0aca8a6acbae4e2c8be8d77ec74ddfc3dcccb48d282a98939e761ad87b7dd3fe517260721d67624f5120d1a2d9d18aa22b8a4bc1fad35a84b4d69782fba4ff999f6766864e13467abb8046113d4a80eb50d5dff0f7c0e4c330e6820aa724a077f5cd3d691cc750fbb35cd3df0466aeb28df0c5ce4d0f8cdfe1b3dac7bef2610dd4894dd30d6b846d2812f53350a8648ad9b0ebe8ef301b4847b5630724759d15bdd0767b1e2af5b11706a4b79d81ab1e150d03896d45065de3504dcc35c58e132e145335ee29fe0250cb384c4be5102e760fecbdd2b05347826ebb4c76b69e655e24c5664a88f925e5e4c6056e728dd7dbe832ede8371b825d6fd2fb79b49f736bfbc08de29587d0b4d295fb04b58647766d29fb9f06ded67152c0970f9ac7ac0593a8f4d64cc0821929b83da239681eb76aa2884bce3ef9d45e4759a0dc0dcb908a1818fec43a1aad2bc081ece0c68c725bf09beab765cad225b06db3ffcbac6db32cd05440393ec65c130cbd8f9ace9c2e4c4aa16e2b89045ab3e2321165b3f52173ac94efb6adca09093032d0c700c830161a38216c2a734d06984e023c18bddfcbb79129110c57e4cfad0649478c382d1a48973817497155459e634eddc1dd351e5f2233a2366b6ec6bab7e20d6c1c86059806886ac4b7935f91f55a928bf1afa02c1d6440e822d33ce781449c829875e291208a89c087ac5ced211cebb703a8ffdec695a7b3ec1c00a1768dd78c8d3d4c1a98f902ca7780f69074b81441af32193645d123eff00d32e30786277a4951c677c620017f947ceddad5f33fcd7417dff1532840d0929e21a29ba0caba8503735060f697071ce19fffb093e72c903a548af32d4f83c1e194e3264154c25431f939a3b6cd983fc836865b6d0515577eab656058572270cbf116ce821d99398f2205d0dd54bd5d3965485bbc7e4de5953f616b855cdf55d3b2303c21daad7141c22e6f895db4d2b6b4a90e1b1969f9a51709cd367b64477693404ed2d2afc12014f3786f15963ffbd91aa7210eda618e2991ba417391fbed1dfa63fd1382be2ef4d650a584feb08f8b6223307e5d4b1a64aeede6effbe55574a552335d16bbb296444c87c756aafe08c650c910924934b26f5ea93e17ae03614dfc429a021768f6648a12b0c3a36ab25be332e7b9aaf1661b7beb5a913f90c6d910c2a305004695a130c1d64f79198e2679c9e03a23e666ddb54d2e4960b3c15445e6ddfa209cb5230a8a242a31ae3e314a532717ea4a29c6654bc24931ee453fabb93a35fc847017ae0af9822c259810e484b3e32f2f5eee11439e535fc729103d93d1c68a70fee5040e92af8eb695cbbcc03661ef22dd11176b6f37d9a8846c2a45bfde87ac4e1b6250e5ee126fe32271543f5539ee468e1096ff4d4d42976f801d995f1816d7dfce0447b01170361e978b201ac2a98187972c4a4e65c04bca9a58a0a02fe1679313ad5c8f8dc7d65ebf2d6708807fbb715bb3fd6c860857350ab1a06adfc02f33c516d103e2a428f7c4b0a2f773e8428749373c739464e5389583f149046b8c2d328b879509ba35a5bd25b7e527fc35581c85591f8d5c87354f27d933affc7f997e9b79d4368ac3c94e2540ccab3d6b54305b60e09ee2b37fec2921c2c277baa12197110deef9dcaaf8c0ed3f9743c7c9c8c85f250b79506ab0c05e6b024b002b1b70960041dc4bc4d217748e33a645e80240c39958e9bc4f6a990919a6c28b0357ecc942787d3461964922c602de2ae2f38fb9017c2a7b2a5d1a2caa2425bd3cf8e27e12501b7a3b5118550af7e0fe469791558b0e1b733a2ee06d3e5acc703cab5fa875b4090b24a074ae66bd9b71af1651a897d1f788aa168d975c08138559a5fc798b2dcf7bd73d296279ce383d9789221ebee42d61df4936bbb678b22a69a0b19f4a6077f9164c70ed20eb962a2a34c78fb5b6e22f7de5b4a29a54c490631081b08d908b202b7e9beacd0b9eb9f0a782aa700715e5ea26055db0b962e7b32c71186d5d57a5e5fc803e2d9fa09f0f80d7cebb315ad27c6135f45b6b2c85655898ef213233fa41faae4cb1f96a66d693f2b3f5e8f860f4e9410b7fe55ed05e987a3dcd91c593facbf10e7c25d552bee346cb510e7acf6576f28cd01fcc6b13577f0ac0e8e2a0229eb8f4e0c2d21f8966ff939e4352eef355df58e3375e3bb6f3ea8911f2abfa3e94721e0f9d38febaf3f3884609c7467787474d4d539d45387fc26e537f17142c029ae054a96b83e0901d726b2872c3f86868b3ff55dcd291d64ba87a00fc6386ad7391d6d75fa53299fd475616f0e419c9acff136fe4197afd9b8edbd9a10b6d4639fd4479f7b93ac8b0c4fa606179776e9ee477a4f541197ecb372c5b2d2e8ee8af1c83979555713da13b18a9845f4429b626d3c8a479ccccb8f45584c5918968238238c706db85b604b4bb7746a7b79c33218e3f8c2edaaa6dc31a96a726e84dc2df3db57191ecebb892fab0e59d612d4905358e6b74d6693f96775367c9d9379215e35f94deae55762f80dfe1e3c9691fb59c8fdd203b97d868d8cdcdf6211d093e3a7f086e542a1321073bf0a596efc91e847ea31ce4067fccf0ec1f83927833b1b1c8b9c4be128e5b23685c6cde15e28ac631096b938f6f0da61940f6e5bd7798ba9f75a5a5232a94fe1d88373f2be54ed837f48411c5dbfe9620f7348c96fba2894abf88d8c53b29c43392e9ce237dbcb6d7bf983edc5391ddf920377d506eeae0b8e444bb0d60b971aeb78f86d877896da75ee43903aecb7fdb651cbb1caf1e3d3f8cdf6f179f4eb6fab83e3531d04bffc1b32ef667b59f3cb05f2b2e1ed3d11e2cf8ddb42d8e226b3451deec3a939e4b1b63a5166eb641eff8ef84499e65f0829f9839f7fa1eacf1c9a433f433ff1e7508c4745f1bb49143ff784b3bf984310a7c1e8a5348e785094e524ea184caf46d5030fa797a49492659da19dea084e90e5cf881f26dd5433e15eeaa5d45f146f9d2fadc5c707631f8c31c675874f0b78c78ec73a74b4748c31c27c6de2c46fe213bcc11e88b68f5bdc925a5cb8ef6242a8a9c13109a738bc14027eb0260aedf898b463c7cb1d3b76ec88423470aee071f26312c4993fbc1af9f2a350079943d3892525ace4594496af82d7437e1773c85289b7170f670ec11ae94e76d07ce74c88c2281ae3cda332687ec777730804105c5e7aa9979aa99b886cb83b8235fe9fb6c807df76c8b344b0129ceac1ad8cfc46c7cbaf8e204e08df8d90e5d7f85983fcc6677b2c3f840df6e035f241d8e08e0d16d16cd0a86548ea533db81d3c82499fc23b292992200e5c4ae1e7dce5f2f380c4ec0d633f89c2afc3c67723e42c58e052eae5f7d24bfd86fb63cb1c4acad2e5bb3994e5ccff068f9c939f63e3e9fc018637b6aef38d9fb6fecce0f6cf7c577fea4feda112f9cd8c94989a636e8e49e5180dc7d64cdde49cfc69fb477e4de1aeca9f19f9d677f5a7eb3a4311fbfdf0c76fb0975f99f84dbf7c13ec7777d5cbc86c2fdfd85e8ef9e9bec6d6a55eb61568ee522bac10b3b6c950a2d4abe97f1bf9f0e8687b5b8d447e43f1ad951376064871bd2cbb6fadfdecbeb5d745fbcf59966537b3d65a9b6536b399b5d65a6b6f66efb57fb37b517fb32cb399b5f666d67e66eda33ecb6ccb5bfb2d594b4b96d9ecdabf2eac23a6a132f8ef3dfbdae682bbcea8d76ed692692fb7b468d95fd9b5d65a6badb5f7b39bfd7571b99fbddd329b596b5f88df7bdfdeec66d9b3d65afbd4ea586bab8579e938839be11dfbd95fdcd9bfdfc5a212ec90beacfd67dfe2e7dc263fdba210a81335af61824bfe7b38df7c73c20963965c87ff1abe8c45e447f931c6f8f2bd18166e5f714ef6739712156bd00fa5c8fd3e3489e294a32c41791d4a718f717fb692a43bcf397f3f652a4b7d39b85daae352339fe10eb5befe7840aa87d6d3ef08906156dfda2afa93fedc5eb6847825ffbd43e9efb9f30da420f900a5a9e8a42b3433f229bb93937f3b4927086dec281e0e6645f64eeaa49602bfa4fa4a6c1eb2c7187f7b382ef422ecb02cbfaf5c9d14b138e7094882fe6fe12e553b29dae8586edce98c2be3f3c68e70197e2f99906588fb4accb11f84a82e09517e3a7aacae66540fcbfebeb6ddbfb47fdac3a6ac695ab6ddcf969ccb1a8bb66538752fae4986d1287b0df51a5214a5acfdcd5e7bd46b7f518c1e6508bf7b812fdfd158d8fbcda56d1fc4d59eaae0765c95fd63f2301573b5ac15695a11ac89414c707412e3c2dde1e9ec455c8c0b77e73e4f67ed3737720ebeb6799173b085db710e25caed10998f3496ac7dca394dc3ef5c7667d10392655be769c4ccfeb2b22bcb50a8cf50289a82ab7d178be210961cf4806c2f5b5f831e901b6e14720e5a1f8b8cfc467b40500fff426d9d2392f6f7b547fd75fddda68d2d417b1446b9b8fcdd6cb61fce41977951702ec3f189d58946bc1ed0c6a2d7033e1dba9d1315214539ca4fd374b4b75be7d97e7c220431e734ec8fb2dbcb47ed85787c125baeece1572eeefd589423472a75835e0d7cfa93c86f5c1efe94e237f765eb3adbbfeef6b2cb16b30bc647b87cffbadbcd578645bfd1a213196a9aa669b1e8d5c0d734ed2fd8ed104a54f677eb8c7db6b914e7e0c7c870ef67b57a2db2a06adf4526aa866b10c4a981619173f067702fded1fe7e863bedb3bfd95f1cad4e869f73b8c372b4350705ad10eb0a3d87481c79a0107360e5d4e23062f4d51d93b251638c0933068dd2d1c95352aa422577a5076466ff966578115908c363f61f238b2ac2c84a55c03072bf2f41a5070436bd1e4db0063abd9c6b6e30622f559c5372ceaf8a26c19a8e30c62308c580d0094a899b6092a55df13e5da7996f4abd5cf8e438b428bb0d9d66be29f572eb554ac1f728a79c53d248c949279a034fb7eae706df7f30a8d5bf2eb72ccb33cbc29c5a3bfe16a8835c4ffdedb4d45e2ee9bcf08ed31e248dfd34e62477f0797ce7fa24795a9446f9d84f07692c2877d0c23bf4a1fcebf27cfddc3a8c4986d94fdccd8bc2795d0d2fd93f99461f5813a9532ce33fd84f771893dcd885b5e02028e9bb7ccb7791e2aeedcbe682bbfe69c118eb6ecc285feeee17c67e68fb409c18f4be9f40273108e244214cdb6660b8ed9329ad4f9b520c885adfd87a3b8f6093d2ad3b827514a2b9bfe3a1d93ecab28f555ab38d7fadc51d0fed9f8fff707704c38030a08931c1805a841989f2d3d1a3b58d2b34e94d986275ebc3fc7bb9d5afb6be9e9530ef1b76d1f84d86fd75c1aaaaaa1dfa49b2df4a4af97056dafd29b516dcf9f47b1f5ebc039fbee38ec7710f12ffee1fff6ea7dc61cfe33bf79364efeaaf4b761336ab7bbf31cce3597a74f8471ce21df9f71d773cd023ee30bfbed9c0c004d08965e8f7637fdddfbf6d11ff893b1e67c2be56ed1deff85f0d93eff22d3ffd351bfcc203b37f0bf60dd4c4a1cceff4623ebf3e36e5cfeb053f2a7695e24e62ab3b824d0c61d7f25be223589630637847fefcc61d0ffcc69e80d93c30cb9f8d656ca00d6ea0ea61eec7deab9f325e30db7cb7aaaa6aa65ce79cd3fde8fa8b524b38c5676878d8cc59bdb5c1b7416c9bf9b9b98d1a30a9f7bf2e8b524a797cc77e923c25262df996cc37c5627c7410ecdbfe8d2231f846d779cd6904633154c6e01dfa3113770f922479feb3e920f8a150eefc797c27e693e4b97530d328dfa683c087b3e3698a773ce6e1fb80f5bbeae7c41d6c92fd6dadf06fccc0702be6f1989fdf5598c7337c0a9b3c290c9027eedc04f9313116d3fa172a0116fb6811fa65700cee626e2c631fbe10ad04f9f3e7b72d227fdac039bb1befdfc126195e4ba4633eb345b0dc59c696fb3e3ac87cef70c0ee0696799425227fa7f18db7b6089665578803773fb23f8acb2ee7df803a704abee8cc56ca297fca18eca345f0b799bec937fdb7dfb0105813ff5f7097ca8135fc017eb0e6e20a3ff8aee678cc23f3f6600d2ac7f660cdf54185d5fee5988f0ed2f50f89bb1f12773c5266fb234f8b6702e85bb00468b14c35026343fb42208e1158133f1ef990b9ff47b67e5a3f2dee5e1ab11fad8d16773c12f361595625a99452e64ab18f1661e2da3e373c3543958c65d417f12413203f242298889092b9fc90886092899892afdc3fe337d6e79c53becf3a67cf6fe9d35f4e1ec73c9ebbe29d7eece37cece7765faaeaafea5f1731ed4192a4ab10b8837d921cb70ee6ee22eda7ae02cc3bf4b122d9c5e3f116c970e719cba84a1ffbee08d661b8dbb14cfd6925a084fef8317690f893c773b444501ff14e7cec31d4cc62763946bd95610bc747555667d2ede53a73cb1c3799fb6311d9d96d0957c6baea06ea2072667e57dc75d61e66adeb5cdf6279277e7d8aabfd28437fbe7c9baf7fe408d64522fd3b18ee3adb2258eeb78118ee2edcc5dcb8c3404fae6f4dab3399e46a93336fdd06727c0ee4183fd312ae3c7103b50812c7eb740dc08628433957d65d84c08ca2239f9c2b7b4d2c6de1234451ce95f9124b473957e645a06029e7cadc89a7a49c2bf3295a1ce55c5903c16489a19cd7c50f4a5e173f28e9205eb0220808a62d88ee4c3f99400747291a1914be7192f7840b529672a2c830e52beb1c6808c349ce95c11f287c722a22279c8a4081152749fa2707207c5cb034f9c9b9b224ee850b47594fce952579492c449194f39c001d1643a91f61e19493a41b165d17eda2c6a9c94a0a54895a41b700610708f8790ddd819fd75951251daea3faa64a2d3f5b3ad517e23dd249628971934ef56b8c3a5ec74b27898556f1706210cd224bea4596348c2c5fc7ebc012cbd6b2c5209925cb6f128784a6922c3f46bfd1f10f8bd5914ef55d0ad1cf772842ce3d69c0a7a7b43afe52a25815f8a55715fe4ecbf8bb98dc5125175242b1e8904fb350abd3f2d4ead0d7b1d1e0bfde162b3ca4ffeb534bc2cb15d33887ebf38a9f2a39275fc746abfc70ad9f6f05e3271d4bc16f3a87a829356a6c322d58088adfc08f97c842a150755616a64a321f7c0a1da47af91088c0bbc13b5c4070a92eb8aa20ecc0d5dab06a56aa54c51c2e057322aad4449de813bde237968a41b1d025ca849de0375df527581c33d3a5544e4484caae8e1d3ab28e31e678797a65c96f225395f8e3164f90589cd39c9c6b72af4f7dccc3772722a2791c1094fc26e6e5bb15a3efbccad1149adb97e6442ec58b70cc60dc1dc11a6fdf51a51c5f6bc5277cd52448c90fc4d9f130f5635085693610b6f893e198992f493a9df013ef4c2c4ef85225aa44ab502b34cee198a9fe298bd7d4f8ee3db9145e379f32310e924e414e32bf6d243827ff379ece393002a892cc7754892a51258a853ef98dcccba75952b061e3dfb391ca363889e385f8079b4b711c9bcc0cfe7c29d58aa9920c76a2d4775429e63b27a2595841a15e8956a15650d85b56cac6b6424f18aa44698bd4f0c5ddcd4f02ca6eef76bd44ef5c16bf8f7af8dd74b96f9e9fdfb8c780e0d22e32f22e72c743fc69e7b148abb2af88ba15e27090e3b82caf59018853e3b17fb05f8d3fccf6b279bee8a3291b7f350fea2697f25d468d14b581e7cb3ae5b4ae36afdcf77a5c69b811e724d63f467c7bb95eb189780595c8056a0a0a15fbc76fe41ba9aa7c61d8dcda88935d14e5f6bb7ce74d3a8cd7c45dc887fc86a833fb9a7c92e5bb2571742924c01af9734321888c3c5b7086bbfe212597e4f918eeee1979fe855ff07c14be328b809eecaf399e7fa7a6e3deee29382729c53b124b0085b292614d62c86cfe6d7a4098f8cd44fd7ba8877a97e97f1805e764ccfe211129655854c5a8e9680a931c95125f4262e228fbd7c84a30a5256ac0796338214df1a92ce9e337f0db8bec1f675e8fae17e6015a1daba373188e93897cfa9810c7b6e8356e7d095675dd9be08e4a3d68c9af9b9369b3b44abb9f44eef007f946d574b7dcedc8b69aa8fb38a2e7c8ee31d96d64ff2e95e503026f9665d957e7b27f36fb67357cb30d6531ab8ac9afc7e6d96ab9219bae47d3c91c1e73c3eaac43d42941453c8a3a4814f294daa54c092a2282472ca2558510266187381c1525051149293ec5c809c4a1946b113a9f69ece26c46c02eabfaaf79dad8bc9caf2a4495e0769d44248dfc26f68b4ad0b3222ab17f7f8d1063ac8ef3e3e31322fb617c1a8ec70f1ae7fabaaced6d15732e0add7ebf68382aa594733ead54850be4497f87be9c12d22eaee737fe9688fbcb2da18450b6952f887995af88c19a2f89453b246e2e67be28362b4663be2aac5a58e5f9ba30cb0e897fd921f1ab4aa3cb11d85442970a9e7b9a9f2cfccf104cfca4e0fbe687048590ec42ce6ef9859452da0f40c14557a57c596429e551bc2a2888a07062490baea603117c81032cacd8028b242c8eae507af5b2811262201dbd90021b1b1a63e82058d8c1924b8ce79ee6c9d8e2b9a7f9af7e7610c4b484076464f9243332fc9754104ff85c587e484938c8577e48494c158ca752053fe47953f7e5de194375d4827bdd97aa89dcdd8f42d8a024acb8a8482206394822074749f4a04acc0fc98aa72b4b92beb83d8d738d8249050da8d04135e79c732ad99067d339e79c5309873ca794f2619c36cc390590e7df1df2fc940af29431622a3c5c5482c8f079d85cf92141a1745365242a466019fe5ba2549ce49a1f1295209a464df11821dfc4295460b044a5064750e981131725430bf722c1d30e18d1adf9214de18365620a227098e2091c4c01032953387971b5fc90a860c1052a68a042c509ae4882357d5f9094c04115a5f80286f3f04d70617e484743d603473ba8e0d4831b6e681264040f968ea01c600a30aea4e0ca114b749103bb38d2a1ef0bd291098eaefa9880a2892c949a60802109060f9042c50c4763dce0082670e0a203a28a1cec40075e3c5de9d901045148f07483335e20da020243f060062b320c2d41d1e29d81c30eb010c20c2eb8704116465e602286a5216a8042045652d8706025062cb8e003192078818d148e08011554c430222a820c2c6c95285c8c01c443173bb822052c611c3dfdd090040e33a8e2002564ec808485a8861c6060c5039e8832c50b34943c89c28676c10f2968a18a0e5cccd042510c553c20c7071864003202638c23947a86a801183624b1a40524b250f180be010c8096a001932fa84c71618008092daa0022861178414500305062062376b88209175250008a26559260018b085c88e248154d3885c0043dfc3001c5a3f2bc68420b25208010020c9f277a62b082051a8628e30a179e488238ef080830bea0e208a1195a90e3c4032af4149ecd08390aa9b73f450289655a7e7cb9555833e4b185900872f7767768e33720691a10e5cc9710a02f3f004e394802e09403818ea84119f9bd1a247c8cac1825e58774e5498ffc908c4890ef03d23836454e7c70820443b8004b0ecccf39886414821cffbdeb90041326403f42f0543c7c9c1b22fa4dc725e58e271e81566a9e8c70770433e20886844da6b4ba534f327d42a7ed464c4c3260c204e80788c70f8f1f1e3f3c5e889be4a184870f8f1730261810f65359a9ac545854552a2c00e05383464d969aa71a3466d044b49426c25a6bad0779907fc099f8076470f5ac15a5b4daba2479d63a8b9c4af0d12244a70f379b1621fe14023d62efa9ed31a0105268428c3d1976f0fde5ecc990c7b3ec91dd4f5c186dcceb5f0fcb90f0727d222f573c33c3adb56e1d7d8fb427cb8d07e6881b0826b9b8c4181797eae222615e8379f93e3a084cbd3418dcf56498d7b6aabd8d0f585f5a9d2a04c26c31ffac4e0cee7ab2cb0b71ed7af56daa8faa5517171fafd6ce00466cd448491729ebdb48c19f7228428142fea4b3c4f39f8dc4b089f536be5fd678f99df572e2783923f3dd4d65893bed5dbebb38b091192c836fa49e7c233085bb2745eaaa7067802caf975f314c8579f90f2b867dcbbfe00afbfa2edb0c0d57c33c32bbb4e0eaedc6e3d9e53b1b155b17bca361974afbaa06e6f1cec23c9eb5b7d8878f0e82e11ded5dbedfad092e3098c7f385bd86491f2d82a417aa2d11faafb2aea7f63122f6278e11ec82b514b63ad8f746ab75199973e9dbed104bc433f699ddb00bbd21e7c386bb3c99733ecd89654ea739c598134bdc4ccd447fd689bb66caacbf1e75e7f52cc37286bb23594dd6829fd764583643c3b5f0112c5bb88b28fb913eaa7ecc16deb1d95b0f7731cbfa282619b5a8e3ec2bbc532bcef0ec6dbee4b2acf36b95b3cecd022f59e29dfad66741c20484ea794a27a5d977f6f2330cd419ee066a2130db50ff7a80ba9968ff003135a540381748a36f7d55fdf517ee5e727dbb557fed6540cb6bef56a77ecb76abbb3dafe95e72b555e76aadf52bfc67626262026202b2b17e5970f54829149f4027dea4837ef0fc1851efabb78910c76b2c8c6d18962dabba2afa313fbc73459965c53bfecf8437adf78e77287d38f68d2fa5945252da9242ba5900cb12ef448c19313162028425456d36b00616a19b7c4929d59142e0dc6a05a294c98b517eec187150df451b8883c210c628f143a30bbffbdc8f85c037e3d6402d42fca802941175c52565951c427e4845f4c0a4c827c7e487540453be2026a58849708ae78a3b573cb1a75feb775d34a4b3ec507fdf5b7f5b1ef6d7cde5fb5bb6ce26d7eceb3f6d8bb9d3be56dd11acabfd77b3b1708735b6be2d919dfe982fde41e17e6b73611ecf8d793ca3649e15de41fd35e1520df378ce70d783c23bfd32435b44e6ae6adde4359f6e93b6eceec691e6f71a7748624f378c56a7e5fd2a5fd3eef5ecc5759bf55bca2c9256670a8177cbfef5d497ebfb17e7acdb9317c59edfd8fa2357dc1dc19a081d49448bb0595fcdfb10c7e5a1cbcfcdfed5b2b9f0d0527f6e75d639677d140a85aaa8576b4b7d5b37978d6ef4515bf5f7610d74ce6beaa59bf53ad7b9dea273d877fd8aa96c22a610481fccbca5090c33c298e4f679f19bfbef53cf09ec6cab5bfdbbbdbcb575335c57d6ed0d3d2a71dd7b063925e184253f39bdd44cc17525b1248b8da5da6feae7e988a78844bf77ff3c1df1e4a48905de47dcee520a85055935aa46edeedeeedeeeddf069835289a8d5a81ad521aad195d52552a420dd0e2e2d9171d688d18a542b56a34faa22ddaed65ac3edc7b2dcbaa42e79e9a11271eb10d76bb8424495b630aa4fd84008892061712e7f7619e11631e489bbdb127717e21cf7a50bfed3e9f7228fa6f43d8710767e5d8ffcc0d57977e76b5ab9ef1d0124c0ed00100b71ae7bbc7dc9955133eeebf710f6bfad3e2ce3f8e5c0839e96ac2875510bb5cf125c721ff7a9dbcfa95cefe1c0afeff9c3e8feb323ae39ad246fbcefa4ecb05ce1a3133a151fe1bff75ee21d1b4af7860b5f695ab9f01140c201a49027dec3b05638311627ae0e43bcbace4f425821aece59b95f6da0f34d4a677d32c880920c28e997e7be80db587c47d1028ddc477e45865664f87528c3c7b24823c3176881051700a7baa4ebad4119554beeae07be80dd63287b85fd13818e8831c61869ac28893c5c3fd9477e4866fce41710bd4028778ff40227389de36f63756413d75f5671ad7f1602d6cba45b42bdc8703a8a93522aa584f1a9452bbede0b8531437cdf867a2d01f47a538fce27c6a4d3bd494ec0b94ff5eddaaf67ac35957a48b2e3f3d92d3c5cdddd31fe8094526ce3dc9b18c634e0e34163835b04a73e93c6edb760451be2aa88db7f9d7b463ec7f7288509c8917768a513421823445111679cb44e692f0c8b91ab53c6ae48688d72cea452d825e3acd8554429a558d297b4de28a5c4ae38b1abc8cb90674c19713b998fea7aa68c91e276c2850953524049fcca513b403969ada2cd0f1e28ccd6d44753c8333e8ec6b72c5a6b7f356752290bb32e14c4efe825593fc2dbd0703c46b06927f8ffe58bbd17abe14efb9dcfd8d7dd0ddbdac9c49e83db6f0371da894d9648b188e9c84765d86d27eda49fb49307b4931751eff590ed637d485d9b322e981cac0b34402159f1430e42df15597ebd5964f9840b9464f91e8e8c6189d0c3dbc3660492129597e14951451619422ab0c8f0fd3d1cda5204d7a3f9976357efcbcca79a0553e6922b44ad6a139711f7a54ea94cd425ea12af4c2cc1c4edb0252a77293b2cbe0a1c4965f80e6b0d1851ae5567ebcd84f745aefef20ba2deaa446e5f2ffbabd660a50c16d820074912ec47d270c3655df15cca9f273ebf5229f5a1e42a9be4fad5867b05590f371b5b8dadad4e9d39303032284c24ed012d7c8821074912cc2807e693cc1ba6c889527d4fce0591bc24305a0025074992ab0639309f246291464e94caa5bc422e759432bc7c2797a486b8d5915c28c85b2cc46a0dd7460c667b39d0ea9c302d135c19c6c38941728c5cbf934fafa93621f1704e904de44a25577945ae2f4b2087c85546c955ea70c6bb72fd98e501715943ae52865c97e4faf494e52e063dc1f893eb771286faf3e166f3b3274025b8d93c376805d6d4f8549560150fc70656dca5c2b85ed4dad42cb84253a0a8a9ff6c03e6c7a78a8cdb795393dfd8ab5ad4c20bf3dc712d809afc268e65bc9afab57ec43fb9e290eb771f712946120505faf32746927ad28110577228aeb0a67ecfbc705f8e8c618950cecb7101a691464e94fa9e5e8ffa561ad7e53b2fd230ee5ac39db648cb77f15d8b4f7e6387602e1b8f4d85125af01379996be17a1187492172e148d45684dac9b9fad18973f52d1c839cabf55d897b82b6ad10f305fcc67efd13ead75bffb21b9661b697e34df2abac4fb962dc8f76d9de31fb35319b11389bfc38e993eb8bb971f7305b142b7a53fd54eade5a2dac01e7ea5fc0b9aa88db3da79a539b2c0abfd7233ebd9afa586f7163d014b97e6cf2a483f8d78736063571aea29ee4fa3504b77e7c82b5befade04eb63cad537f4af780723b2be4389eec676e6c77f416efcf931f2c83cb7296ee748c492e2b60ec59d91adffa2f9d9aa80ce15fb6f33f7d7ca231f0f95d70b9bbc18e07f3c1eef537d5df887d7f403968c404286f5d5c8afb6faa90ad01bdf11bcc2a16b71c96fd8fda2689a4e5124b9c4a328cc40054981433f58b13b43959e45c131076b60bbe4ce2ae4c8cd81a60c3b0d10e52354e96acafdd5c70786cc03bff3b326a432c4fdba1b763feaf484523fa8c207ce4d1ae74e4023e725c8c74227f79d9b58667e758ec6392d288a1f986baeaf87fc97648592a634a0fa8a3b50bfc242fc07076b2295a17446a4a01ca3f489474e39c667e52d2971a512102121051173e8944fc39de037dd0f03f84d90ee4d01237751ee66a4ffd3703ffc6314b2e272f9b17e0e871e83d75e8f6e0ccbf5be51efbd87eae053d3fdd9415e7bdfbce6e437eafb21d3f777d7686994b57d4cea6ab5c24cfdc18ddcdb6bba1d6cca4b664718723fb44118387840ec19b91f92913b8ddc65e4863cc80dc7c80d9d5028140af5d539d4a3fed9bba136b8b461159d6eb5e41b5989e2f0f5557a2495e9d7bfe873e2ca7f353f5a245a209527de891f2d90ca3b1086ebd1c49853979c00fb755e844abd82f7bc6d17f38517459533be787a010a500e33408164fa418a5c7297b0c850830d6080860d32188109821081114eb8e082d1941b7220930e6d034a3f11c3fc805ff53e7cc1cb7ad57b8f475666c8286594d4c8b9478b9c7bf18bebd174d0c9aa5ab2dfc8eefdfc9f3f8fd9628cd542e8fe1a00d961d5b1ab782df83f9af77a2eb8c1a625dfdd01a026775755c8042184b58ae9b6d7e3c125e7de772a8af8bec84114688c91e5033ae0e18beb47861ebc3e9211415cecc88e44aa4695273b98c11843463f740cae262dc821678f564cf9c905c80f698a508e3cd06f214a3f9535b8f0e9cb4dc4277ec94dc4bf9b0647d089c9921388053ac1a72021283dc02c3e4d454b4c622c59120b7482598e94886ebdcc5575d0c9ba2eebe39012bfa901713c4a89468ef374b01499045d95f5e4375d4ccafed08bde21fb2f91255f6f3dc5a8d591af6a29e77ec7f2bf34f9fe32951539990a0ff11ca2dba8f4ad7565450a15d108000001008314000030100a07c5a2d16038ccc25cdb0714800c889a42765c1b88a32488419442c618430c2084003000046084a6a601010dd3415c0b5293676f7ac941718748bd22c768ee00b3c4158cce923d47dd6b34aff8887c1063ad253eac56a3b960549646f1e2575a67ca80c0b0fbdb8617fc271f3874f54cbc606f256f13a8ec6c7c7ed651f3662468f3187d435f68673ff60845244ada426dc97f0d661afead828aaeedb3f0b8ed731a00e0e82463eab209dbfb8a4b99f1a0123b7283d1a65baa73f4aeebebe73551acb411532fa1bb4ef26a9492c737a0e6d38f78ef0370ec4f0430388897ca83514e54c5dd1b396cdc17cb899eb706ae5c9707b1b5eda39a03e56c4e2e27dd4146602a1c27b766ed7e5e8d6c832cf2766e6d42e61c088309a28eb88e67d6c7bedebd40d23d07e8f2dcb3d587e59d78c05cad1e3772dbea2ee48f316342e503d6d607fcc64cb766282d97a31f7ac1fa79e0cfa30200a02d4fb535ea3aefaab01bc375ecb2e7ca0e31867197b53604227cd826f6752ce709a615b7e163da74c81abe01c0e4e1c72aedcfa8777e6c61fbb65e10a4e64d132f103f35f6f88b1376254ea551f64d8c6808d84c9eb6d10b1780d19073348d9218ba26cce286582655439512292f18c167ebf327202d334afd14c124b3277b13f85f929601b81dcd5aa226e259b8594498397275f534fc4ae0011e85df3d9a60db0d2f8987c4efa3324e8f56ef7508ad7276d9d7dfbbe6178ba1ccf76613d38e2dd06de8bcc1eb383dc7b33b09c8d8e15f5b6cbc42efdea3730b820f07ce32703bb6e6ac9b1627147e41d5687e0b0bc29a231fb0e184e635c9f7745ab78141c4e5a1e1f6351dafb94dbb5be798b111ef13a8564b43e93060c8cf94b5863b6612cb56c2b12dba668e4ae17246df270e509df238f96b35a2186e0079ffd07c6da6b563b1ee7b64401b2601f80c07d863dcc3eee8e399c1e5ef93890ad7101adae81f452ac53f2eef8443c22b7bcb83a69931db558fd490862b69b2d3908cdeb61918282cf57d1ab4848d5c2cc224d866d7da7e374bad69499707442528f177509741bdba06789b6860a6ee4a78e9d56c8032b3e7d6be802096b78c1c227b3383956b0b9b2aa778b6b25c5d1b947e2717427dabc2d972b06a133d78fa9f4ab0c489a85fdfb3b2c11653205a297428176fc6e30c19d264f232803b731458a878d876333938b39b569c190644d83696439620bd20d70494342099122b2dffda303b46b1b0122a0a50531b96648ddd03778e841b413df2d88af0ee6f7f02a2c168cb1fe7e6f278ca91a8f6fa504cbba34cb6184ca02d1aafeb91e252db48df02ed90ccff0ac9c0bba78c07ef1b633ea338c880386a02642722190adebc174aae46c45810cc313ce791b24e0411988eaaa5283b0bf2db295746b13964c1f1a496764cd517032cb85ecf4a178f384b2580e77981993903d1688e69dd880518ee416479600b1f432512187b0fb087dc1d79e80f4518918d4f1be051388be59ef2857bcf57f01318524961a75bd53711bbc8d4483a00a9759a0cefd012a3bf9d4f6154daa4c176f4326d8b01634099a0807aaec35fa0bf5e2412bf39956384c74b4025091c11147ad48f7af17bda74d326f6eb30a4356ee9333c20580c701c9e870bd44e18887722562714e8129bf32674ca16c5468daafc7a94fece5a5631bee05161e1e1431545f683fa2d83001f87a1b2a6363676ad5f5ef0f44a506d514f81a554193f83521c2d5bfd99afd7c21091589a25b3fc0b76ddc6a72a905533dff76622a54bf63bae7bd8d13645fe1da4fc5f73e5d9535fb8a2f229692eadc38fe512705636b6569ea51a917589b37261ea32336cbcf2f0480d7a184221a8761d19921f7083f952c7919cb7253387a613f2d579c2a93f69a716bd6e9c9e8a4ca68f81539e93a9a6ee4376695945fc210560f86e0def140e47c4be675c862a92e77896f5688ffc08f301fda784925e4649665f691f164ed2a42aa1d65868cf88aeecc7faad30a978a844ec0fd1ff59900eeb385d6b122153bd7e942a6efa7347b73e601af592e80e190b2188656e88e933ea6338a565e20d285c11bde8ba837e153abb20ea492c955dcdf685ba354001d37c1102ea9092ada047a3e4e709ea5689a8b167850ce48542dd935362e6a58669bb19f8218238f712d2d21ef4c183966e6414fdcb36929a5d86b70f71a32afb04e126a7c546825fda78f348d13104996d00a7ca9c01e00062e0e461d5eae6dd5099d65ab0dcdc04f767656c33a20a1be5b64b76cd48a9f13e24e84344a068e6baa67374bdc830370091eb319013c5e04a48621046d039914e354c009e69b1e285a19e86e654279c591d488a08543189f1f1995a914440632835ce4b63cebbf157bff8ee456ff4765b872ee0674b2fcad9c3f1d3e684c8bb45f8135708e64f4332cbe08c4073804128c14e6b5e5e46849534aa4570ca6451e5c2dae0805a9338ca70c0f9e3dcae700b8bc05ef29d963a946b83382725d2ee61944bb44d7ff832049bc8a4266ceef082f783b904bcecd68b5e14ca44dbed1e8cbad909c2dcbc0a00217d0220712f020eaa228033de631d9a0f9f4fdfbe7fdfca560908da23e35dec6f44136ebae9e332ced81fd4968b55f0a93f4db723c697557a1aa3c978fdc889ebc9e26260048d0f62c7e0678451157ce4d7febdadc7b3b6f67c2f5e02c70bc9c432021bbb003736c4059b77215d80b7a86e075de85ebf211fe27eb3690ea2b27347612b6de56ba3e36963c087aead1cb6c91fed3ec0bfe40b2aca2b61f6aa46d4bbe1319016a320a7dc9590f0d848532f157d1175d3feee5ebca3af7bd30fc388f4c323a200e95c6425e9ca5e77f94a08a2751bdf2020a55bed19c8df18df9ae8f424d081713f4152b1d1b3ca029e18f84556dda74e0db14cef2db5ced1886e5d3d02de0174acbb5de1c3c3e02f5244a0ff0a6eaf25a08e1b0f2560d0937182d64e4a1035c8030b9918a12b56c247ca74057f15fc769683d002c64aa3f2ad47bfa8e06763fac768d335b771bbfb66386286b7ea25b2f772621a8278e54f8c184eff77d8dffed80c00c647c99e62580ebe53c5567077e27bbe74ca53165281f04b410d0b029b270d35b2c2ad776d78fa322d5292b14be9a05e0abb9414d22d29f87ab9628509cad4655bb07c600baa1b27d1bae6699774215d7c9281a3f9d1c9608cec3a92c355785e17a78cca377e583381de193eb5345330824a0594f6ab97cfe23dcbfc3ed068603e4f5502bb3b2371a90e436d0b69578be65ad3401b17534fd0013f8c12b76ca771df91948b3076bb13a189d04fbd1033340f9e52cfc81b07a6c46c0a2c2a23f27a3ab87395a359e777794a34e15790779c4a533915e5463570428a41a04d61ded88117707515af546d648508cfa9c0a76a3ae7e90812bc6b1286d6ff4e6a2fed613cbbf8e99d07a4b2c0ae056ee8eb7e4674722a58f6abc2e3d6300ffbaa503892f613cefd8f9ee3806e57c5e7800b5ef1dc0f02f1939879cf7362597edff00de7789fb3100861bc663516ac8b5607cb3eb09bbc232d0499f16acc919a21ada634687cec0c85dacacac00f520c8ce466636261d3014a426fe6e7eca78fe6a6553f9d29883565d4a3e286a6625e7a9ef4b27686b4cc453a27be778ac34d6f4fa5453899c8132beb3dab0c22f7d0e6f12ff85ddffc701c6e6839cf48317a33dc7967931f1838487a243c3ae2e1868d2bd8c1507a0326e3aa96563fb100544b513d6afd4087a3de755c480a0771afdf98aa5ff637596427a0545644f791f9e948ff15e936de996cc657fe250938ddb9365374f6bb945cd49799aa85fd8256a2b483fccfe44e164d2c569e0692a13b46dd43a9be5b97f266ac59305725a9e225bbb92f1cef16279b8b97c88afe875bdaab5618e1f9cd2a42b0435b790ad87a031112fed92373fe377b1dd1a8e37a2444e52c3c3e5ae3c0055b855ba728743f7356f984c89474da4fba746a21a4f9f509bccb18858da72735d1ba3d99b8078e3998424841d3622b5c33f52fb26773a7bbefc7f42976ef5c0e09d90a5c96f599076ecd0f3bdca3b1d20b27f0cfebdb7b062582fd18756864585084f3478593cb765ac3fe5d35192b49a8ae734a56e5f3733c8c079038a4f8a0d85a6f2c090024b4feaa52758cd6a140c00430c882349c6c10201e0a05b72cf1e31b5240de3b296aa3d08db336eaadd820d8eb95d814b48b10d900b57174a144b49498ab100f3363a679a6dbdac7fe2e99254afaecdc0d12976ead1dfe60cd58fc06286e19b7502a38ac7a2e2652e753f62481caa0628b1b880a3e2b9bb6599a76358c52081e8a7ef31652bb2019c8eb0e31d452f46aa66cf44b287c9f1652c64a8afd4ec32fa2c6ca0a883ca2a28b97604b06245e051b69a5a093a4cfe5cf2ae4ab92a008e6944d30ba16a7ebb396f5bed3d0f82334705e09d7d40c853bc787ecfca89c85764c878386f38bc37d1e5a350d95b6b88f7137f230bcbe3b45472e398d0ca4f18b0bf851331f7741c2c66e8aaf342cc1d93134c23d84e3d04f62e9adecdcfd2466ebefbf3f5c45e4947bc0904875f0860bc26130238d6ac1a9811bc323ae60fd3b89dbfc27b20a2e1bc1a353cdac535d356f4c35fafc5b9c6d7eb09d143db6b8c77322e42f8d8adf20695a92640f1a2ff3c6e2efccafa55d26cd413bf2f8373aaa071570be8a35fbc94de396f7eca746b714e7ebc2df5881207dda3b5fe63a66ff6668b148a5fda0d04e7b75e1de48713f872e07084ebe81e8d98a77d06dba76142a65ede7ac07bd264c67654fd100133a36882c8c803972632b761842b7add9369e50166969cd058bab58f075cc96fcb255330bd57c0e52f418757505b97965a4684a10c400cf9319aa9f7248b8f584d22c7c443708f1925ee01b244a283d78f78a530a4ae099c48fae7061bde12ee9d12a485d84e5dc73c956c9ccfa9411aaacc09ecfa4d8bf121b8eebcc31686955e50bf0b8b77e0178cf922bc16cb4a0730ee9533e89d6c61ccd9f6212225f65ddee8a2447a18b25f5be1729012719109391ede0583e4f957b70b108f2bb36342a81868db27091726bc959896e10515788809ce7905cccad17d310702912f429033ff0bd22b4257d02cc67df8343743244f58473542126a3645b4651cb6454df0076b9730d82279cac18cec35c5f06b25e3e189f68b85eafa74594937a4ed5955e1ad5e8649f7084e27fddb692a6518c9862264c6ed770a9e9883d328f8de4d7e497302ae08dd2e6b80f2a8ac7f6c42cf689a2ff8c4c072b1828357d6787923d754be43ea70d0f89473c13945a9d6b873b99612807e42278901182a4c35cbb584ec388537e81cb4f0b27178e1cf338cdc79ec966042362a64aa241bb6811b483777280e8f892bcc7b3fee53116bf0cb1cb595e1f43c08c8fb9ac1b6c2b98de6cce02a539184c3c08f20a4791024153783735350b2fe988179dc32ea819f33c60b380c4481a165d5c99adfe800b5bc58bfae9a877de25637ab618928a84a2bd726896b3b819b8c9bf6330ba47cba6ba7357511580db802862b758a281a0f09edd432af63e7a4e7c140db957bf870e265b45ce6305ccba873d9d01759082bc69ed2b50ef2eb6ecc743b8d1eb98d46a9f39ecfc053ffe234606814aaa49f01f372c04242894e0045a027ce99e280a22704035cef42373050d6bf8072cb36b50be1e3d7293a2193f8837f35612e81cff570ca730086c95fce571e24d4d2b45d96acf6dd503b05fc6892256ce1cd9bfad4e55929e0cc7859ef0c3186336998011151724d58b876c70234e0564f591d9caef1aa9abd74c36a27a15bd5e43138047c74712735f521b05ec8d5cd97cd3785099b0ab939c3c9dbafb5977eff0f2f32e21c80589e4d96424532546c90f7b682c9aa8abd8a441ceb1668655caaf90e3f642482d1cefa029b5846e31b650121a171b0fa406e9d5f314e8019cda428809342fbea647e870df80c74cb249a3b12ba1819093a9b6bbb1f9402eb9afbf958d5c269d241b717027a1cdfdd6f5c6b82e487a7a3a362de290339a4b97a4eaecf74e74687aea51e0431fc179bc9b2d26877c2050a554555f067e653a958e90a5b709627c04938a14f3f11f581cb134e31febd0bac99f2bdf9e8694e59c8ec0a76ede05c8a1ec446fe0d56ae103689b5b39ecf06859fd7d198e1e43de68f60111bb905943c874722927244b97782df9d374f012b684287ca3c664cf212328a252ad94713203498a37f7238f01c114322f2cc0194f18b43ef6c7aa82bd7c16e21fdc6807c76804d8e4867f608d3ce4a50a93864e9ae2f9d11c20d3f5b69f27b253e027439fe0d0bbd98abfb6bf443a3fa13c5e5ab12137f521c94e11790fd850a220a5c5cd52f2e2ee011fc21203925c8706e0af65e8080d72c4729746b29abb989ce6864efbe1734498a29a53c4a558794a52ae25f0aacc24f6ebf27b5382200874b5f7af48112d748d007f8e2d30512edd5718b21ec281cd177ecc34fe808b6912dd83d83751fb254e995519b2b6fbe912451ac523d5c188b73214d4071bb0c1a8c4b5e29e10323ef8331c42ffd888689cee7346364892737572f8a1d246434fb51f376341885731def3137087c186ecc166084b078faf593772b34cf76c8e33b5eec937e9b102739f9ce27f1f743a93a6544230484a45bab7a8309aa81b5a150f3d12adc2cdd38ae0e74460e37e9bcced30ee877a6454e7fa4ee23d5e269ef57bd315b4f56751f10f921fb734a148a7cf00aea7bf0e3d2268a8431c138e8c799c0a10e2b89b655ba8950bdf46e8697aab15c56437da4f132e06d8fea136c707ab29b20b2050b1a4c2b64b95f7c63d7210d0c527912494cde1fa81e3dbab98418b9c2e14d363e0b36e98a98a55ab2c2a70340287f0bb74bb6d4d3f4fb31f997fb3e40e3c7aa676ace01125486e59698dbed2c86c674e5725f8e60cfaa14225cd5ccca44770c11540febab173e1c915aafe6ea479388590f3b9076a4d31b4770fa56c48c17753315c3f8d2de811125e59fd065683153cdbb33a6f55c75cf827266b4bfbd0bfc33f41892a1a4e38a9d16de22c5502382718d98fecbc05e432967e79b700d56a050b302de40c377e3bd3683b9c8fc69d750b2b8dfd34f4aacf0c3d4803800b2d02dc8228141b20198b8c009c4c18cbb3ff1d89747796a96ee6b40a5e0963dea017f9c55b1c9f868499466f305e8228592519bd83d77ba32601bf09f4e8fae2a1162a86388b6bfd3ad3a963bfc162082bfb2ebac3bf955b370462436a69ec6e69b8e1c016e33c52cd3c92fa86e9bc6dedbc9b206d8bdca08d88037b07f095a4d1d732540cf278347124a230ab4a50051fe93f14e87fcf1c8058c9d7003431838696628488079406a06510856c69600516428f8fb44b8a80d8b0e86acfdc10af303bcd91ac73b9c07faf3097916224e37ca64962d9c0c08da655b447743a15ed90fbda8296baea7f5ffadbf270c9b1e32276776a1da318c143cb606244b4dca190a6f2f014231c2295b67ddbc92f6057de520be0749f9b4f901070d0ed51bdca799beb0e9555e86bcd7b43ad8c154a486d5249ce7f8480ca695c16f5c0a026d8ebd5388d78b4be6fa4057a0f7abadf3806b8cdc12c549fd436d56da488614460a889cefb0d92761a72ac9d0b166312a8b0768d3cae1de68e4559bf2d03575346d9458f026ccec97a31187cbdf7cca852f9b9141327199559ff5dff1ceea43b027b85c8de3b9baf062bdd7cb9484e5399187acd4f80a7fe32ab622c2424969bf34b3318940084b0abe051f630e7e522dcd41181c07dd71d1d232ce41c69a65544471168e46e7478f95e1b5234f2d1f9411eabe3808baa065a8a978b78cdb96ae6437d1a49499ca7c97d1d7277d434b786dde88dae74d7b6856c4bd121200f584394c2ae3429781062a8d2bc61fc47699d7dbb34212a1d30b8237fb2f6df357c8435f463d254e287cc98245793f15c36f780093dab4b97cae0c48fbc3a434f007d5f15310518aeb1a40d3a65335c0019be608fd3543174d3a34323c8195040b9f38bb44e2ffd9a5a27cf0e471d5fa69d80475f60fab6b88d8434086aa545ba66fb27d7aa97f2d7ccb5400d368d5563b47e44b917bb147d15152304b5d246f5a7d241628816c84be13b695b0f833cec82c2b067edca672129b8422ab4ac6484f072bd183ea5747492ca13128c979fce6335239de87eb2617514a0ece298aed94562dcf682a2b82762a17581e0a6890ec28e128de89882df2aa4d256fbbe5086286d33726f5f2ef5ad4b4c2e612fdcbdc94bfd6044fcb51f01647ef3da9554d1c01d4acca3345fb8a5c86c4606411c0c5a98f90e53fc653f404a3daab7629108bdff06aa3d4b88514207c2c23d02e390d0d7ec3d28c18583054f1c3445c7d37924de5b306048bbc348fbf232229ef31cfe824c38812a6295dc758b7eaf446c3022b40359d5254ed180b634a7369cfcd11477547694be4a7e080f94bfb6beabe85686ba877fa75ae048d38fcebbece1a80cce0d0a4b0c3215c8915e3496b3a24949abbda3bdde5ddb6d7848dd65a756deed9d60f106dfe545bf381d325676ffc2480cd2db373871d549d8fe51edc743e0750c1a95db605939657fb1ce69d04c7d91bb1db12ff804b07f4cae4669cad22c14acbfbaef921b9769534422e354eb471cd74f113e20a2848b10eb0db50855cd10d2c8a6d555ee3ab0b8ba7cfe5d17a1ca505094eed3d56d6876d5f108b45a36f57e7414b548b3345ad9d0c7c1c97a2a9f81e0982266b7e79ce3d33bbf274962d08181b0edba796a3fce3b14013b296ab1677c61775d48f8292180f431653b62790bffcdc0977fd54056122b2d10733856eec127100c3b2cfaf5e06f37330720e1b234b43c84f920c3fcdd38431853316ec0041d043790846381531cfd06b2cc01bafbf2764ce4a5d2970f1bcc0eeb91a4217735ad922035c63917066e74cd2299fbebead360893732a1a2e203901f17a29addfb63294dd67d885ba3e8d7d547c45ba4ac42c89ad19e6a88be90361d97a98e797ff44a2c43625c5a7aa1fa08a272c784689d29b9dfcd5e63bee78e0f693d96d142d386b8d5173d76402864833a65a0019e327b5ff98787e0bbde638add3277c38a4517d790c95cc61ff8a573ec6705b93d2bef4c32d404c983a515bd1531e3ca0f52793884dd265896e36e57741f6e231099b7e543c5777df1260be15f0c009ae80aeb120ab0ce1f8404e0b372d3a05b255e9c9231b21ef40a133ac9e53cefe5a035f6f8d942b91cc31b1397af7fb16abd45ad36391b568c39c593f0ee74ae049d4ba685cc604aea9033b1282684ff0fd436024238264898221348a114e465fa2c82c579bc0a191ffd8011ddd3ea07e2fca18349d3cd1ec9584afe54617c1cdc8fdd367cab64a382e61c0c89296cb4015e6f62021bde83487f94a1ffd9e2eec4f1893020ee0db46da1e6600d75407ba51a417a01eab11b465ba94e702b039a4c3e7289f52631f86da84f752600469b257ee2b168b65b5c4c998f2898ec873a6d5d155bce613b8bbc12bc29cced3946ad2f2801167de9c92720ea75cd43fd454059ef7259bda4e3e65b0f920532695cd67a647e6788e275dcb26040ed420018da7083d2e0f5285ad4c421977978bf94b550fae2dbb65a605ea567c9cd5a267e8726010520b9e9e167a0f564b71a01647b99a3698df40886a278dd7f2513aa65b912968ec7f8202d04fbce3e050ec40ca55738128717ee76ca0a1dbef8b9374ab3cc526f4226e2cb92a22cba85692e48e5ae96c060529dea21682458a0aaa9006e3d60b5c85915192dedae85c141e54c11c35f493a3fdeb1806ad93b3523f5548bfb590553737b851bfa6511fd774ed2ab03814db00abb952002d04c120e5b3e289c2cd61fb0369e828479c5077d8ef65d663976cbc0e1cba926da2d68af26990516a62e512ac601af72eb24d69bdc05edba3d1b3222d44f5a1184155592c5798c6437e047fe08a6b5d307d78e40877d2d48ea47e93002cd04b4d380293e0cefecc809820f9308dcd65e297a51cd00c1548d64af010ba445fd4667b4367b1d1d6e646824491aa6411ea8835592787a079da042fdcf4e24ca06e00fa38f65ac4c9cc62209b4c88d21dc719542ac07b9adb7e85c0e21da80b271bb9c1d73484cc8e2c88025cf90d51ecfb7caaf5a082b417aea41d090859eeea01198364046fda4a069af143ae7ea4851ba702ea3729d3e64c009007e33261640270b41ddda3101908442049e1e8f1d1122980e6bfa641d804d858d87ff65bb43211206768e0d8b2afbd3ba0d066825954bbf2e1e3ab43743c28349f13dc38f59cc13f947fdaa57a3a48320d647f42c40b41a0a05b5dcd8ca5a9f6a2857864f81f78a174d5e08622de9c5c07c6712ad9b9fc1d4e1428e515f653a3c1abac9622992fdb72fed9e5a9aee17be401e8aa8f1a5405fedf9e2cd5f15f733d159395ce413f9f515ebc91e702f1120c16fc4d96926809246a5266002e34db38a14e3b50dc4ce527a049382f2a506441daf01f3acb60727d7b95b7ec8feed460de240d1a0dab2167622297275264ec911dddd01d22ae985c88501ceb2b5725056c4339084fd8a501666e478537a6fbc5e1e94461292e40a569b306e8d8b3635b54aeac73ad7451100cabc3cfee34452728545403cc86184ec5d1ed03a7bb1c0124c569dd87261f0a1db4e577ba0c5c9fe8cb50c1660c24ed5dbd8ba36be026be0bf2bc7138558afc052421a6a860ef5eec773617490e089fecd207b0e59eacefa1a1579b1c3fe0e5bfc7a321d2931c892d2b07ccc79e43c2c2d77139793237b2d51f19407c144dffef0702067e09f4a3a7283a63569e9b6a2a973885e11f7fa39dc58eb3ab0b9071395a4a280bc9b752811328590c948964874f8aead89ef2da4a60e71d4479a5c711e3b00dcc8239f02a7ae262be94e614470f40469585ac569e867cbc0c7290a6135430689e882d445b81bc892feb80196321caead90842753fb834c3718f43d0a1e7f9f4f67778ca607f47cc9e17875ceb07f9b60f0c6ec1e314e2d5a5059ab6d769c37beafa535dc1c84e077482b946ca94486987e4bd725cbfb6e000c22dcf083a5d5bc296e18d387236faba53c5245c2855b4a8f085623de10e84f2c0044b68ca5e0394b901c1b76802d8b53fc45439f3c4c98cde641c3146f09bc72792ae287053d43b14991a053f077d83c66554fce25decd0ad89222366dda253ead9e43d7948120a520cbfc474df043a8b9a0aeb5b30826c5d738338bff2d260110542010928c4dd452cc8cdcf38a4f056608d5c39e5fb3aa951168e51493702a61b5684d910189fd8be87a80ac199a431c090f09da2ada075c2300afe16c2329b3899b6800087b8a6081bc56f7a05c2be04e10dcbd54aaae71393bcb99003e5f269c141a379d24a97e7b114041270d836d7002525b3809eb3cc758f901e6a2773ca9e33f057c9ea825dd5cfa0245a0a904026e255965bde4679f8a143e1a9c90055b2ccc3e645d572bd0ba175694bbe1ebdc002cc6b1caededa69b23d7bf7243e66112bc34437cfd26f4f141137997e818514d353da6a1cb254144b686d76de9bcb8c3d55262ec2b840d5090ae5e87a79b37a1f343db772420bf7a0466f51381239a8773cae2bb82ad5825776c6a2d31845cf1c56b2236011b5b9aa3043c3b697c935df495792c9136d44e1a9b1167bbe806cbb194f25cac24a7883b1a5994126e87f39b78d07324b85ea512e01c41d2b728124d63a4a23e5548f4ad33b27fe6d8345df10caeffcc27964a004da02d57579acf80937bcfc92badbcccc1fedf3e28286783c0d803fc005806ba0c80fe704a0d00112558a8ba0ff6e04a54b9d9ffd9866ff6c14df6bbd5b1de079acaaae15b40fcfd127fc39406b4d6e5af1c80f48bbe2275ff7a197788847581638b300ce796157803235c6efe521e5d2e17cab15f3eaf2d7b7c7ee4e55e3e6e1be67fd098d3fb5cd198f8a1b8a358155644cdf48fd70aa8f7d0a68513465c74bf3ac0b1ceb623a7f5aedc4c825b9f2b4da3dd2a8a65b201e27d2f21164f8b602eaac537ed3c509c9c12726f751817c5e0a9ac43e28380a746222087d6b0b320af83939b738dba0838cd08843ca7a0074f990714eae4b789fa14191c80950c1124453655be8edd201266ac02005f831bcb0f3d9e46fc531a5a519a56ac3933080ff3876aedec5f2d3069dd15f10f45ff74aa09c1d5428b659b332240070ede5b3a4788200f580c5c2d1cfa9b65e3891743b1f0edba9efb95462803c3be406d13a2bf615981c1c702811e806bdbb13f657c94ef7d2fc28fd6d3fa8034a7b24aea0d470a94dfae1d29a8c7b89493360fff4cba488699e8cccbfce433845657860ea8670c18591eb8aec78c07f1ffda5b99d7818197391aec1366f16598a752cc88ef7f3442de500c78a7c00d30ef813cde01be150dd45373205cc99d50157e152038847e1b09ecb59a08506a44a072d504e194e6c491a6e426f070bca06a3656474da08cff77ebd33e661f835734fee60d4316cd21be8cf8d255e0ec52927ad602cea306ba93d548921138fda3e4f0112832066539ba22a848523f82562ba6ed1e4463a9b3399864b3cfe7ada753f2b928b305a791f1c0d5ec233168dabd0f08ec9652e4d3682beb2748d09f67fd0397228dece2be766600b894cb90e642097a15b1952d70db5d89823c91a0ed70bfbe0a0baabe8613a51e901ca00dcf50804b41bbe8b9a8c2bbdbff60514e0292acce04e8b981f801f0b28ac5d69f9f2d017614138ef6bddcaf4760bcaa8c6860dba60af6487b76e0fef5fa47d6e641250a7a3261792b93105c5e269c75d6c00dc26cc1bf01af84ee481e379128815e25e8604575008ee52330fdd0e5039f47a6021ff7de63be6bbf72919c08a59bc627d15ac20737d284d0d9bba8a2272584e41ee799f7b1712faf9c7565aaee667a71f69c35202768eb9048e6b8b60fcb7239185b106f2272b65190578c9b3d70b0eb63aaaf2e70aa074738e86aac3ff23ef0a61f59b122fb9077b1c3336f863fd6882419107628b19794298fc4395dd276d0f9eb868086f37fe7e2b1530a63b9362166fb0f869302722056d0e279fb23f520ce74bef39751317ce04a2faf44f20f0281d3fb0c69b18151da6d611c4107deb97d16c6bd9e09883e144d896157bb93d26455683513324c481f02614782cba76462120a9846f1a712477d68e423a897f4df2b8845e7ac1a49d3fb7d2862fc5fadb4f2ce8251100720a835c489278ded60e5fe89b515305a2a9d3a28f392257505a6a84447f8c320208c294d8707e1dd68ddd2543df9e99526be57406b23752a6bf5a736ac0a86b7cc2764473b0ef0d1225af15b0b61244a13df2bc0368440eaebf4a3020405fb4aff9e88f556211b9283601ca520a65100b4ff9f0a3de5917bb060a947e87b829686e5405308a0f00b158b4e528d77a43ec584814b95ada38b078f14b41ec418bd2abc171ec948e9f27d879cf9c33e8a3d2b052f05215b960b24cf2773c8e6f369cdd0586877f71d1b3f99c3393f4b10f7fed1ef0a02ec1191727c24b15dec20fffd4f5befba19e48362b55a99df1f6925c9c2fbb7ff6aa5739f4345610a962a8469b45ee8e5f7edba22b748a761dfbf07af95f3bc3c8fde0c6e5aec6cfef05f712f767066599a591ae3f9e5ad798e0ffcb13b616c3203f327b895adc9b8e3c011780d3c065038f4786b1ee84f5cf3d658b092706bb4b70f6e3e8797d0b34f076ef527ac7e50af906967d0404a58266a485903cfca1334449532775ef2f77f6555b8c3f85f79310ad50db9a5d88077e3538f6c2ea946e6449bf3a0cca75d09040d34da196828e6f7f16b4073933094a1f812d641802c6abdccc83bf1851160cfaf3a3aa2f0ecd2cbc83b10b699d65b33c7c3560ca59c5a2b624f058be4429ff9f003cb7c0d43c1ec4afbb0bf5256b868ceed14b5e1469c147fccc52ef059826cdb227e75022164dcbd25980e00e7abc02d679b82d9316f3bd1eb6300d5e7a83f0bea3f7594ca7d31cd98cf8f9640a74ab249a1a099e0cebf0b3f123ed3344c4437ef2ed9c5e8e3ddd1a15a5e5d2d3b595763d14400b7bfa72dc7598ecbbeb6fe178b8fc7d6521fad79aebd379bd7f5c81e94378b6c70111720b5ba4ef18274302ea3467f3a121e2fb8e2687e7abd45593dac27962203c990fff626ea3fc80f4b538a1f8b0224145b68d9f3ceb8f07674b0cd23840bdcdeb1e29b65dc9d159ec740c60a1496acf8db0e0bf3440d77ae086cb3ebabba6d3b7f69e81d9f1858a01311d4567e2c8ded2b951e530fd435675e90d4186337d6a9e2fb9638c5ff277e9a8b1d2f13dbfd0af6ea5ffaf351495019e37e0f9b88a3fb5ed5dc9df39e64b14e807d3fcb80b3a9fab96ad71d232f1e2d5719694eef7a385b700ce68b626fb0c43a6f7fc4d790dfc7cf71c9da61e746d0fb802a2a667485659dfe0af4b37a8a5c2491d68f2bc4aad7724cd74da37535cecf51972f9e133b71325a776c611a5aa794edab8c0c654a6ac76c41093d966fed9ed68b041dd2145808e71a04f7d4ce981cee7ab9bd0899d0f4b6d799d711d9cce8df623956337489f65463a5e11615253c58d2fab929580f8ca5fa332326ed8f8a2ed5335f42055c0bbc4e045d8d928e9dee57e064fc66c439dcf4bb619e2999fa3030786b6bdb3b4f81e7815e9a464a31b0245b251b15ae7c7f885f738fad1721cb7677f5e5501679b2d585cd645e3895a26426d78e70d233b63bd8991bb0cc41dfc243ce7f831fa902fd26c302752ebeb01555489ceb1618ce155e925be6350ee6da2173e1653370d07876c748f0721b16bb7534b875fc507631007cdd893f425413641c557dd909aa3d2aa75c134959f38911c201b8b5cd82ace6c9b0dbbdab82689bf4a3fc11442ef23f6cdafef8bb2d7268acae164d66aa83be1e6bd7bdd03428342e6556492980112d5925cad1c0f44b90cbcf8385f52a6c20b9b5c84bdec8bbb7cafff48de7bdc6369f024ce3a0f9de7dd08af119ec953f14611010aa1c1d228b0584d09b1ac6d8fce37f0e82d6b714cf5840130490ad516a903793629bf743daf967bcbe34440e2a3d1b309e1bdf09b90259f7aac374980af6e9d6fd2994897018c3424be505d62006f1934354d4ead4070300f2d5a4a2a4bb7ca69be17168152e1ecf54ad8a2a1f40e9418180817faf9e43aa71fd39156169f5892fb8fef8c3333d26f9c73d1ea6b55f7a7c03490a83fc0a904039879f1ee117904fa23091c4ffa7f703a4836f47123f2c6ed4a59fd495d785f124d3ec6895118b2f62696daeb58519dad1f3079d47ced2fc9d1f4d2382b1f5fb4a2cb80009eccebfa28d1647b72a462c77f8092643ce1f02af73964a2fea17003d31fdc5a2a88b4f539621d1e827341256adf9aea42501d0b230a0c680fe33facd77aba90076e3c4f80e8b63015cf02191877c267f0309769205a03f1a5bdafcd1f0a817119ba3773fa061ca898f80f97df1d11d607fd2203a4968ba8f5d8ed41a9b16973a3af7fcddce59d7b24f8d33347561cb2e12c7ee0e7961455ec3eb9fcf8ee4aac509b0c0e680ccb687fb4dae03318ca77f154e728fcfa82fb995c0ad1f0a5bbe03ab22554fc0bab00d05f1e386080e0c0f8c20eb4b16c828148291b5bed33a36e4333229d2769e596353ae4ec917d08d41c8daef18f71aae2d2da608b3ea469df56c9a5a3d6f35b17ae856e294a754b13db79c66756145dda1506cbcbbb6c30f953df1af1fbd9d5085f7e0db94671e3847c10552f3d0f00dd682517d40cd6fc2edb02e85403ef346d09aa7eb207d6690eb490938f8adcb9f753e7a05e0ec812bdb8ec2b6da37f324e463ff475ea4d246691b4edacc6b21d8613e3e01b3d984dc64d0eb31a6dab50a1ef6be5cb2e0fad64bb4ff7f0eede313b63a8dadbca35619b41c926ee29a3035a1fbce89679d94ed1c764a11f033fe308b31732d959405a0ef3362c6b3de3ce9ecfdea7f418d172c04b4f4b7fae75c153268a0bd646355292db2098390bd4fe0b51c2ecbd5c678a02185d6135153653d0a32d09418acbb08a2dfcdfbf50e72856cc78dc0d4489aa563e2306c38a97e42fc46b50d824701d01455d6e461c066419509cdb4d89842b4cb3e8283c31392132403051747517a7bacb83c7a27a67b1e0778e276a5f502c6c5a6435aaf006f8e5c2c07ae0227ec79656f9f937b7233e33c3dcd82e40efde94fdf6536be40262ee01227df28ee324d0d6b1dd6a1de9bd547d58332dd1b4ae10dc6b7c502f00b4d06efdcd2e270ccf873f3f24d2333ed42a1ef45790818b64bd159b5744d5e316f658101766c0c07b856b28178a283c5b7698094ecd69f867b124fff3874a29b2d9eed2ce818135867668e9ce532b7990a2c0caf92685c6965b940abf8b278df92e65b6b4fc5080b439b8731533a99ddc1691629e5bd32c7aebad7a2a5085160f38f1e344b8808e308695f988abf1102ac45a4e35ea4e916c60d97e2a038a8a0dcd36f9aa2d49e04a48efaae09e489c3f6fbb350191a135e5933cf053943f36cb23c754e7d247da4e7c6a21202dfaf9ba6466aedd9f31cf0953e848b2dea2882588f66d0c2811dcafbec4d3ef7ea3584c428c877eeec6c6f21845183573ee749934cd124790c682cb1e343c917d2a81e1b2a07018ef9dcc5624ed8102fe13de2fdbb0a2db1e12f61a86c851e5b6421dc507c3b2033d0fa8b708f4a0e9d9896ea0f597e1224a85288e44aaa5fa74439446f6a8bc4800d52bd9a87f3a108330a0730a4686a074f0dbbd9e6175d1f6bbee0fe0a239aafc9a5b94255066f5186a251497817fe9b6490d481f33ed0765b611b7e88372665ef6243202c18100354a12a4abb8204badba8c740788c2e116e1891bc34a25e64eeedfb6cd59b123ec9fa393eaedcaab1ff7829ed8f613b85a5b3036bb540c72563d403a639c590106c07c3eea71da60d15177a8491a6e526188c9e97e5a221cc904f2ed11ed03a277af36b3442b9ed897978b9441fccafffdf9016daedf7e68d3fe2607bb9a901a78a8e2133c54b24aa0d94844d091f8cd9f03490e1fb9d6580c5bd24072f9f9de26cb16548529fb0952bbe99f882cfed152c845d7155bdfa3fe180923c27bc7db382e6e81410d988e2c53ab38e50156d54a43d243e7d0d56b73a596d614462cf4be5f5a5c80a7f60baffd520d69a6084111207a62585e2d2f69c57f6238a4233d61c1c087ceca784a8bd784883b8ae1a4ce55de34a0801997c4a9960f95c365888002ca3490b66582cb05a7448be26d72956ef72b712633c97fc6b2be06d04001fc5e5bc5b77f001e38809fc362781774b90b0971c1d69ee8e38127d489834e9259ce5d282dcb1e39e2112e49603807074cea9854ced5b88458bafc6af6dcd9d7014dc1310d4035c109d0512bb9a554dbcc647c91352a6810de4ddb07a192f1e6329ac6e74b8314cbe36e60444792fac72aada84687ace6a5830fd968eab257e46f3eac8c22863c0036b9521d542878c80084c9b888a57c12d01556117a2631b800f46241c407867fae8be31226c398d8dcc8c3c6c98ec8215803dc05b529222a155d79ef7ee51034813b82b1c492d402ae00ad09db9ac919501c84c704196bf1883560bec1c34c877c4efe2dda92d2dc915a300d98bbb02f6f24ba1649bd6ce72bbdadd4aedae82251999f883a7dcd48d31fb6ab8617e2d6d166795858e5d99d04fc4afb167654dc907cd5eebeb29808d746ce317eb9696453ea8bb922471de23d6a8fb750fac5956af3a90bbc475bd4bebb50a70d619efd0a7d7532b363365dbaa3b16ff3e3455690a0f9ad0758b1420d3bcc17a57c00fbacb3337874259e8f0aff51ce22e09161d80263b5c6d1758e84e0731a869d7da463224083bcd0592a99489cceacb8bb92168b2d2ea2399fb7498d0c9c493b778b5b58cb0de72ff06d2249ca544ed9329010333651970ff44ec5d3fb94a695417b1a76fb5139d4f0f8ff9a0ca5c6649ff188891dc13702ff501e2c1de5e7378d5a24b39b6a2cad6ea00a5f5602239e6f1942168cc2a032642ac708f2b34e4757bea425c1934bd5d1331a99a0358dde18567f15f27852e8e1568f67ae887b423544190d6244a4d3353b555d1051bb3ca946be667cc0299ee9597b72ceeb9e9b6f89651aa5e4e2ef8067b90c57ff2b3e04353dcc8492feb20b159db4a7546f26b46086c7f79449ad94af381c10d6d3368468b9f10e0eb845cea84614aa54de8cd441bd3b879a8ee0e280eaae6eaa0c0df8815537882e2256ead5235886f65e2c29a62505e6d051d42f2c63da86109f30145db15407a289f7e12e6d35e6ef921fcd3d622d37d3b2810381d1b42950e99e1051ff21b9241c19ef63c0457f3ca1c0c1d84826a0775b54ed516a8f5a6c8631248a1f61b9e3d4ac69a70a0a46db80768cfa5959a62a2331a8fc05aca8429ab8f68edab40e5fa8d58ad0bc3faf6a96e6d60d2af756ee1841e6fa6cc94722a46effbc34ec0a91d16b811fd11c2090657369a514cc15963907c8f8a0bc28063532869c41b4f12973b6596068d8bac0f0c15408b6edcdb5a067d040568cb2ce73b7af4e3d37b4d5975c89bbd01de1f25f12001a2333597853f99d675e041d0882dcec9de5330a82559749f04cf2c0344c078ddd32dfe9d73979496a63498544181c19eef93d69630a4e73d116aedd6f3c31f09657ff8198424cdfc9a89fd42ab58eb7f3d186b567b253fd518f7e5e0e06f9bb72e6de84a2143767c29396dd3c22464fd0e0dbd89bcccf8ad2658d2b02d636132525c49178b02470b8bd458b0efc381059b2dfd0522a9c9139389b0e675f08c0c279ae3e89ef1f2a569698cb10883997eaa9275175e280ac0ad1d9d639809aec82eb6fb1832ba77e54a6690395477457225e656aad5dc26dbe81ac7c898343bd8e13a5ec6d5ac8a09ffc078791b9700887f3bd5214f1c754add90c9179f2fc26c1747b86f2e4c3da20e329e7fffed15ecc16c34d6e6affac99bbbc66b4c89ecafca69fd845ba12dc0da4f643575fd566bfaa9f7d39ac583db9a59129eeaf4ed49e0e128d7ec1f1045e86355c9c7e9d31d5f567ef1387b70adc37661689aa5f1409d3f5fdf1c51d60fd31d0b7bbd8db8e20f0763e96efcd1b0ea9c46dec7118f0825504e9ff7499db774da5be735cd06efb1e2c35a25f3819cb480ef4b41eab50e5ca29ecd6f7f91d67abfa51271106d65ff1efc4f72c6277970d92e52f86d0757df335aace4330a588d457d383e0dd7823e9fcb809e3c38dc539ec369b201eb0d562a586e38c75d1ae43094087092ea1b5379c926a18a82abcaa6838b3cddf4d2c54cee8c3dccb60bca5b8f7678aa6d61c4ab27f4ac5e7659e9981cfa4560dad92852488e81c96c0a3f115fe539e6c12c4c394d51ba67191b63dd045cc3607a589070702353e14528fd1d6f76a7763160d397b7e825f7d401065ebdea33059ec8d1c002f881b0f41af7ca3b05ff9dd86211e51c95525c3916e0a32b14cdef032dc08a16f4846b49ed37572351d43e965f5c980ed4c3d5707df370f6598039675738ac7560882a8fbc73e7e7a36a61621e7816582d65bb7d0b9392337b7deb457b976eb1a778cb10ef32a059d464d215e7bfbba46b78f25dfc42c613723cad8a44aa341169a5519ae4863dce160c4453064c42db604a015459e158315f5d0df8f0200e28c5080c4d7fbeac0cefb1cb304ed424b40ce6da9950d57929d56ee9a3b34f28d95c9c2644c3cac2940ad8c0f356a4c292978aaee8f218c0f7360c63e98c76bff521732075d98b6821fa3fe9b319aab43afde27c3b666ab0d28a0d8bde98c49852bf7b0ebd2223ea5d8a4af9f6015d54b4eac9ec22c1bdd71a5ba8518d28a1276daa301afc55a1db9375b4fee88228b210ca9133aa9d013febdfc9f800f945c11e826203a167c76b0295dca61055ef24a045f548742037297962fb17c2dadc3c54ec54114de095991988b23139a349a801cf505b5880bd0ddade9a7e00a18909712af9b9c47006234026494b6362027c963bf292aa789684546eeb1855ad55d12042886d6e50be7615d3e05360ba6a9362cd423bc05680bcf7e95c3b15ef0442bb19f9a158eb744f42da7947f052d3e6a3d7ff8268b8b5dd31dd8800f7548b5a7cad94632373772a5efa52f1f51045a9ea03cb2f00306704a359bcf6b8dcb46914f6c5869653d151cdda067d5258289fcda4cdb685d16929ed6a4b11d9e6bf670b9dbcb645096be69b2832e93846637914209e5c72bd233d80dd3e1e51e116c5d5d1bf9dafe7ff564a8a4c3640afd9ea05f6c58abf5cbf75d81f9aef0a889d1609c3c3d88ff5c1b8278cc16ddfbd9abcb7eb0198a54288c6d43a3d0131debb441295ec7f55b7031d17b69e0659b15138785ef7f0ca7efb7d58fd038f80acd1d078a9453a146d80868909fd23a08f252877fed1dda86b04cffca3e2596b70e776b8ee6dcc549218e51d58b85fef9e63812d52a0c8dd7f6e24e911c59ba1274ae100f4776cc8381c6085e23be925295a076654a9892bb5e8de39db4426fe0dc4584a62ed56decaff86c6556c5dac18284e0dcef115187196d43cf560da77910f02adbf3ea21756a95a1d879008967538c4dab1bae6e21a0972c944d0072ad879466a316c1cfcb2e4b00554062b5e2eae17be8fec5eeca32a58a0497797189ad8b24b51ce4328e957c3e30f627df3e6bb0efb71cd4bd47df8de3e91f9893af5991f8437965355f99a71f7e62b80b40bf9c5994d7576fbf6b5270cbe2ac3a6246f116acbfe499a003d7f0da22c2f34c28ac7f9a96d3fc1c9760ca37dd08bcd7edae6a3229c912c5a899c8fcfddea3e08ed144c5cd3f4cf7fa92e5b2b5806870ce593fd137a64d75a41c40ad2d0705446e6a96f5239e77d4151d6dc5463328ec9e115e566e31264614bdb80fe9775341e0ab1c9aa037cd8be105736d471016f1ccbd353f043f316acc5c98119a0835b74f55882ddedaac2e53928b5fcc4d5c5b02879c245460ad2e9a74775bdd15702939a3f9417b436a4783de0bc45ea22701b832452780f4b52537b543eec4d57cdd37fea413d4f8b815df1a84746c71c1b5f57451fc560ddd61ee237b4c17148d507244dd60125ab1ea4c2042a08d45152d80cfb07b1bae13ee891c9593d2d81bce25f37afb20a4c7973fd37b746213f326e0d0e3f338d9293fa2073030653bd67a9d580ab4ed9a9f6ea2104324a612cefde7ad043a85af9fc6573a98f190eb1f7ebf081d62148a58cd2ddc11a769809704b7ec623ea6605c5ee9bb0e58f0dd5041639ef54e83bc331edc58297123d27fb2a0ff284a6c8278849a0a157305b7685160469d764072c1ba63f386e50c6789b17474f409d96356845c5aa05323c4e14f5aba6ba24b44dea3ea95ffa70e42b8c63b5024095f8cfef02be1252fc70065175a5cfc89bf3dcbf71061f9b6ca741d82c282fb0834c7b2a35fb208f99bd4566939616b21720edf5d72d7581ff194e341c424e797351b745399da47b1e7c73fbb2997b1cb2ae4ba7baf2f4026f1f932e3bfe47c13fa0fbff8fce766ed8303e21b7dc13dc98b8cf83a83b1b190c0591f0ec36d6f11179ba5f4f18a863883f89ceec1f4c2e8ba1cd5f253dc35067e36e948180e00fec9d0c00866af51567b66d54a5ddaedae87b0886965c9bb40a46191c439eba1cb2c79144124492df5b0fd99fa78fa1ab41c8b074a0907d4cb377ef4891d07509a056f7bde35d19464ff7a3092caeaf99374444bfd1284a5c5d9ee4f4ec6c3c5754ea4c4b921244599307e28a2c2ea5ce02bea799904c4fd12b75068dd10ee9324210903f2152c5ad3119a7f11a0fddc99de0d2a3568777720bf5c8db52ff113fd8b2a71db0f87dd99b4ba742a6738b759feefca62c26a5a4b7e9c7a0f37b1d6b9cb2060596c5447f60420a01572fb2f4d859382cf3e718be661164710d42bd90dcc771281baf425d64fde4406c048475abb278afb3282b8c4b28b454742ae03f38c8288dafc02d82cc0939c7ac2fa6472813b417bedd38dc421a121055cf96ec29f82501f94da51f3348ccc4450e091557b4f47b7aa58bba57ddb4a6b629410c92ba61a1e0ace90c487e7fcc228c7afdbb8a499bcd9782594dc7fe9bbdfe08d6e59eaf032111536c6543bc0766c37e42a8c98161000743709820220deab225a3bbd6f98bc8d678daf748cf7965631f6184a8a2b4a3b5e973ac6ffcf136d0205d4d9a2c61de7ff87e14ee573c5dc55f88399e789b26dd891aba57a679d5ab16a5e8075a6c28426842561b442088de5a889bf715d3a93ab95e242051f371f8921bbccbc1de637cd244948adbb931bc9959881811bb86a24e65b2855bbe99d004317f963d88d244597de72c76e95a4a29531a11c904f47b98182bf547c8583303fd7cd1d80738c3a5bfd23ed8f183440f89a68dbd19b1a471a8d25dbafbddc240a2e5e8a4493b8e5c9703e494da31ac0a355bdb480e75320258c5a5d07789d7e2307b8f0f4639336ec199fbd4e41da908d47ea32ec7223f583398530d6dc4ef73aa5840ae650c97782503de30aab5735999a108b41105d2b00d6dfdccb08dfe793b229fce4cb36853d3b6a331c98450f16a92c86510fc23d5a52fca9e4914f560194dd81127d3f7cb6bb4d2db312c48886c77f112306a53aeffe6eee9f01a6420b50cb091cb893acdbd704214b9e64cd536b905e6067dda1d4d9f7a735e1dc89a9ff1ae093ec6a73d2be80f18b577229f06fb87a81d861cb1312a8ce567c26ae02036d7d3ceb5c50b7584c5db5bee79a6ef2593c7479bc4b4c2a7cae004db6756d2310a29440c16ec7ae2a08fb53c911307fd5f13dfe290ed7a7030271d489cb981866441fba4a916a7da56ed7914b65b6d35b85ecde1cfa6d39ef3ee6d1dc5d80ae3c2075d95bdb200a7fd151c202c3c55c59f44ddf5e42c3206e5696fadfaf5f9e950b4d8a7f6812f2fd80e49e47d32530c67ff4511abd555811089c2683b5bdf5614f8143694287b2093fe6d8ee198b81776460bebaa51008bc67348148ec1fde4ad4998c8ae7ff3150b83162f6ac38db8a10bd91136dddc684d88254a1300c0213b9e792f6a3a44051dafa1b10b086228a560af080f9ead66e98cbd0416b185123015e2d1706fc236a27402627db0cfa265b6439814b2a720b5eca822b4ef5b85d2be340cfb8b0f7f383976f1c1eaf30e5b46311d822942b7b1b5476039749106f67c081da75be05522c3602174f5a94bdfbc500b802def93eb194549194557e8532280d571c2f4fc0c8508cb871ef060497ba0456fc7e4b9045e2921b85816bcda49f9c17591a1b5ffd89b68d377a968fcfe58917b8d43591fe3c544691e89eaceb24006f2cef5098b36c506b0e08176b805973858ab4d31ebbe1856d65578016d8aad123f173e0d9b16c355da329809524920bda2fa66adbce1a9c49c98dfac6ea132323f83deae68e67b4e032065e5568d20924e93e6013b0287e94786d8eab786a813acc9fb32cfe34becbce26de053a277cf0f176ba8546199abda0cca9592b046ffa3187822eb88d8f4b844528f42f3de7127a4f5d802128cd8008537192cae3d9c2ab12f2cba235c6257ec6213d2789d047b345dc11163a37db23f8130020f3b64a7a7bb1370b305dc287b35b62689f16d131c090fe37395aea58fb0a481f1ed0a4daaaf2f94df8b2fd1cfa4f0249b75d323696d9043771675efb66e711c647249268cdcc1cc265b29d19670497823abe3d148617764fb84cfe25bc4b86e629c3e9f9307aa0122f288b1987608110c8826c4c23716881f3fc1a0683a827034981eaadb77d3e3151d2ef5d7a6952164d1edcd512035aa06281006314cb7731933ba9be801e275d5260101354502dc4d5f39c5024add0e876a097b9d350d6347c284b60c51ea8c30aba6646b2259196b7d654a333095648f57f00238b0e799bbf2d5352abaacf6552c9244ad20cbc20a17ba5d716b9873c82c1fcfec61a6434733b477a676823a49b219ce030b95c4e7a007e69fee55d683b7a58a33d900c0c99c33e927f1c808ce51f0cebbb5183c3953b7ab2431e25f5739ce861f640ca94f984f304ccbea6386d10df8f6c8499e64e1829438c6f6e95c9d25f292c6c38e4583245f99c5e47656a10105344ac9809174042d13f71f3c5d94f337217659222c18d6253f6d7516e1d79d889fd3b6fcaac8b1d9f907565e7bfbb328d477b3de45f883a5b0d8302413ca07aee105d9284915ce0bce06f63edc9d60afa25fbb2b2d708044659984a9c42db48c160a76ceb9a35a805645594a37af80aa7c7dc58ca09dba40b0daa70f2c169b6cb3039941920a7f2a8fbd69be0726cfe1d68ed15e8bd5d9cb38aba82abc9736c3fba1728bc34188035d08de095c04dc6c9be2853052825d9e7856cf0e0fb79217658c4c88caa5c44d0d7906bfc4fc8180fbe91844ab025d5708a4bd83db51e6e9806242f00703d2d15ec9e4751860cf677bce92232fbe8d971366e1a5abf5abe71580378261efb3b5a158d88bf615c3d7d8cc15f1fb1e9bc3f2c24a833d108b15ab24de299eb8b3d3d953d5e264fe41264480f50ed67b5b24bc7340288166bc999694d346bfee7f5b50f83b09e58404ee29460ae89e21f0d3666b2104062f450405106630d3caf98f0aa0f3b89a36b9616b1666d477e3def66eab4e0294ecee7fb3978bd916f4fb9c67a18fbdab14c40eea4ef078991cb47fd6a432f2ba3647663daee1343c11b19837c89503bc45aeb71088fa32534d5a44c22550eafd8694086828b0ee4d5d3a45c007eb35cc3f23141c5aa3b40b49d989cc42b73f3a4ba832937021b4b013be0de47251f6820a4058e3043e1cd559d06cd3e2304eb6072272d5cc248efd9eec5efde0146d04a765490f7c19c2f40ac066dbd74a13831c46a8e72d9488a8867ca4997ea3ed9de80b87c22935e84bbd3df242ea2bc1fd0c91afe38c4ae4157e141ba27eb1dbdf822ee8835b5272d807cabf8d2bd0625383c428eef21d4df7497b523c61620eae6adb6e14ccacbd9e49d93a940bb062bbce0c50a83804a28d46c0a4c9faa2314de058d880ced5cd1eae3a45822615885ccf82a582a0901a12b99e9988fc9b4ed5547497372da86289df7acc43f92b920ec88d6d5f48ae481e0ce369bc0516ef1d88f78b33a5812d482f80befdec3b198a64aca8574ae63a0f2a6cf6c258c5f8d7c2b868b021e79b5df89bd1a4af07871caa12f78532285e29c983b4273f6ee9ebde6f51711af120615e5087c6c79be78954f123a88b1d18aaa112fd4aac634b183763cafa95f37e21e100d49717c454540e04dab7bd40136db1017fcd6787ca052cdad2b108078a052112acd77113bb50c0a33d5fe696514b3da1b07cf52a85e6f72b6d1f34a579449c8c7694ff9e0ce63c1083e0a91ecb7d242956a18125effb3594c32017e1c16727d1de0d51030e2e6fe1705a893eaf709fe9896c4e0cfe6cced6c50b91de4210ee65b2b36516216a7c4fa9083dc3a57beffeb8c55ef3294ce05a1f1cdfc9be4d5e41ce811513322e59c8469223361d06a28969450c6eea902a6b8d752f16b581907c2cbf9ba9d78e602acb28be6c87c8243383c567524881fc7282b724d5ae0e34694f328722f496b18a320b6ae12b0245869e962c06c7716b118cc63c576748b4e3706145b61e4841ad32e3a3c71cc0b8d87b10c2e939197bb839aae49f947b04357863e3d2d8024ff678af4d58b8646890d8a082b85838cb59786cafc38c49b4dca417b1c3cc1e962c013df8463c5cd0ab0aed922fbf6f94a2ff70fec113dc9311a00047f88a5acaa628ef68548f59e88ea86ad0136c4ac42f24b87ae55317b19b6c7a7e4c96bba88b8d378e166d79db16c8c81b2b372922ba9f563702e2e8d2004044ad520b49c604fcfafb0cf9b6094006996c26b132ffb7f2b788696ce4eb51af18cd649f23bba484ff5ef888ae929dc8a1a399407ad8b082a99b82c47662bc81717a7396703246acc53765cf927cb7027b3512012cc98257947ea986f5768dbb0ede6880648ccd83539e458ebdac395d1e62c6674062f919968843d957048101528e0242febd1b113a446999d5f43760b374441b34083bc11be544b6e5023f875adb9aaa64deb98eac4963d4edb819dd8a0c07b9888ddda59afb066e36daac552562d55cb783c7232b9b70b7921cd1f04bcbc122eda7cb57a7f0bf679ffaa24565dc9a0837e72e9d0b4f453b4e7a84e90662fa908c8cda624dc13a0b5daf84ed25bf5f11ae8b9dbf7cfbf4dd83405b6a30535d18860b6e82852d993b6f27698c0810579a688a91c62a92771b6295bad71b970e4429024780df2feac15c85bdb8acbceaf3d766d183a17101fea325e8f4f57de691376ad0a75bde031aeea960a3e6b756b88485c896b45f317ca4f04ef003de91f6c743326d1975fdc658c3f9da9e8ddcc35d1a8bd6d7dc996667f560ee854fe6193951c173639d4027fc50231e994a604baa8e6f0afff0ee23a51462ca68d318a507a2d77a168a80a4eb986d941c7ce6b7b52e4937f53f5aac21a888485c606f9a73e5ae6ad353b9147d2e4039005931fb680c58b9bd0efcd87555f067113521695d7a41c8788ac56a53af03d9daad8c98fcd9961601cd8efba1e627cd79453285cf852e3c3025b7a29811069bc7a22b392f7a9ac37a7be0b271f091ba851ac49a1c098732711b5c1267678495b0fadd7607c3b6f5839294a8df58fcff75a51d19d4ec9bc884d23f555aeef773557cd0488c17ddacc7cc0927a39070adf6351dfd2b2990a0081e0cf109fcb37df8f2f0658a4defa97b86aa07b2113401db01388932febe5ee9331283d3846da23857ab7623041ee977f6681230a249adbf8e728809f7b54047a0cfec28a5064804cf69c95a8178cafad55871a735e3764b5add681007a63e2a4a898f51421150d36bb37cb816de343f8c1eb7f001805ea3d38caa8866dc93b8b6434c8c31dfa5f536590e9a7622fa9de6dc2c8036ac86eb6cbcc07580f40048ae3131860e98e09c3ec7a6346ea87a68bdb29cbc03f4a9199a88a5fba827f4c07a2a2f8092c485a8596c5ab45733e95d7350c7c66d371828fd638fe32ffecc8b3f12bc84006b6cf00448072f990a7a5a0eea5dcf2206ff43e6ff6fd86014dce7e80844ccc6c9be8c16767292738e5aa4dc801b2043983630c4eb36e9b6856c78d2c9a2f0a9de611dc1b3c4ce19689898bef5da1fc13cb15ad4934fcdd4199c7266c4fc9d833fa214d83e5fb8906c75cfae85f1679a815d34dbe206d4ba0b8bc8fde96eb3855250d87fc0d78b40c23880cee200aeb558ac870308da170a3880b960d27d03b82ac666e9e1b57f186ae96cb4031bebd68b055e1c6aa19128a3214119c97a3e555477991845e4c4c4c0c38dec262100fd043034965d265c010dc295c1be2c450a56f2c2dd95641911ffe4157701067d83749478e46b2aaef725b9079cac774ec72c7fab978da6923a133ce771412d0c3d8651c9afa401fa6062824c95c9f5722a1aa12b80c241201c9f570c44769d82e3c3f7e5a22dd24d8f01cc55659252dd1ec08987779927514f84febebe99bc6179448ebf8952a649d512a7940a8c38d06340351b01e9d66173ec4b29eda3ab8a2bfd6ff74ec068a1196667b80fc64869c250bfeb3c427601a3ee7a25f6d5793d0698deabcc19d759803f842129ae0a0902799961c4cb3d892241001701014bb19c9dd18cb887f8d1892ffa4fb4c9f0f9c00657f573ff87f63cdcc7f1f837a8e0e7651bc5579587443c40f2357340e24a7e86a1f5e7e5199493ab2ea4084929768aa8cbf38fcbac92bc879e1e3a921ed77313fa12190b76af7254667a46e485fac25b0a5a2b4810800fe945f3276901430e9742257f2397953498aa1ab992e5a0eb1b9f42a161747491b163b452c4c87c64f77dca39c060261b80034458a703a9fb39d85fcbf754aa76a10f96b7c6f96cc287a31d5325ca884d2812a902d38d7388ae396ada0278284a80b07ca65004b7aa33770d0651eef0a2c304171cf4cbf7fb46f73db63921f81c3f30fdb6ab9080d47fc3bef8546a0eab4b8c44641f81839e1b81656e090a3b5c0eb96e867a026ac7623ef57932099980dec402e885feba239dfed4419b1ffe99cba840e3840846d3dc28736a815d6bb12e53378e19f9a21d2c89f51b5a362438047e0d5bca0a973f5e92dd115d0247f7f82aa604bf1b332619213024ff2b27277a8e4c9dba385c7b0d2cc5a358e172a76fd6cd6e9871f47e86ff411982c277e1b3331955f5f99feebc66d3a3fb5e083cd8e002d733def05f6b4d92cb23bfee013fd463f1a502c538d927e7e27c408133061126e461f65c9384cf472d38d90c883e41da473c663ed6607706ca410b9b91a44d704651e1b2571fe7088806fb7a39e5f26a6f3a48d468844f1eb8aca03c7a3af6843b752f385b17837fc2e708365480f6280f32728a3e50fd7bd302067f6a133f3945d2022be58fbf28d24bd38679de0d9e63517e69c4c18568b1e58fb4ea6614585f58e42ff39e2f0d2c8963f39d2bd0e415897f7d99e1da03e2a328c6900ca02aa6a76f72f1906fda068a07db1cece80bc96a99d1c2dd8cf83ecd00943922febe8b2964357ebcab94e2fbee743a332349db04f6b5db39405d3628f5b1636ad7045d756e01a9d96c5042111f2505a4ec74bf432bef2ed8107a6e9fcc7dc9aeb6d6fb4eca47b7f36589eafcfa134db31b510ffbd594d07643acac4c6f01cef7a39ffa6b46b2d74401f9eb380d09e82107a465682ec8c7c2294ac04681839b1f8f2e00ae17ad4da3d634e442cfa0c474f30c9c7a800e260fbb18433fab240e5bb370ca477d7059b1e3ed11dd32cb9c4aa54350fa11e1c30dfb4c855e33458404718ac48f98b37255ea669576529069b94815b53f9d778ff040bfc15832bf835cbbfbc6093f95c0bb40a0325cb08c11f810126ba3ffcef30fe236da566969615e14ad844f13ccadebfca2ce30ab35cebb64fa487a1500d3aa64d56bdc2c485dcb3158a9b515565537a2842154b481f6ad5d7726618c6eea6372dea6a8d6ef814fbc7a80b58849d0ad0ee57a6fd46963fefdafda80feab85b3c0f69811f27d961949ae3136a704592199efbea691fd80bb5b9c7011134f4f22db1d9f69d0e10d41611d9f516f2ae9a5fe54805768037edde2910c5f714bd25ef030eec551fd3aeb11bd59ab6fdf2b4c5c4177c71627bab1f9fc023b42b38043a51996f3783e49408c7e8368fbf88c3a94a3a651a70f092055350ee437217c9957d7154a2aeae1d614a6238965a2b4769725dce31469f8e9de1da0f4c1a910bfa430186fb0c11e3cd353b33fa67281e4f7dfc19af9b365ebe7d5ce6255f37ccf888f70be40f5e032225d6d1ca5cb653a3221bb5ad0c7fd477a8e7f333b23828edc8bbb7fedc54cedb817478446f4392f089686262f766d92d369b3a1417f533d226bc2703593b7ce963d202532b67a0e78f4634550dc9f5c0e6bcd018c4e20c7fb78c86b3ed6cfaffbc0f08edf3b637fb99cc317ce6d2ba9165707aacaaea2b0b96b33b25141f223626d41980f593d02e432f3cdcbe2b78d87cf3402cbb526ce7475a905e4bbde3216ba27cad60cf5b9bd9de65bea062da95432111281fd7501b965cda095bda87fa8bbea77be01b2d3d50bcc0c723e63580e802b6542f57281f72dd89c00e0cfe95548cd497570a3040cbc5ccf45a4bb0d05e127a4f8e8e6f18a3de05a6966f642f7218af6aba2345d3809c9802f3263603d7d56d6036ea8095fed4e904b9cb0644511f005020c24c4a3bf1c581192bfc6c28e963b8482d7210332a8582f62cb9b500d3657cc76f81b23526cc541e85bcd8884ed46cf02ad8bbadb678420ca4d4407ab041f429d59595f534bc46585591f56c701f53e2511c48f55cedf69624b81cfb3e00b88a5d40b8b9ea766c034f239b5d73e89c860dc3c75728ac4cc4946ef2eab5b21a426ec943aa97c30956d4a3a3aded7b0277e049317174d9ae6a8006fb854ff27c2dd5f49074d691da43942006d7df646b2c41a49570e9b8acee65b746c6b95740f694e1e2b57c905184c07807f1611ee6d0f349322d45a20620a6c4227099284da8876cb2200d464c2203257a8310eb2a537193f5fcf791038e8835c02ae04ac62a87143cb6d4e09889aa2b1492db6662c8d08584d7d3696e882887667a2a7ef7b9acacbd5223815d164165637f0dfc6797db2878451aac009672feb1d56408b12666d352344271c0e48ebbd7755ec4e8558ebe38b5b751d5e26126fb2c08ea65b187bbc1b20689b910334095be4e630e9e772f26eac3ac5a14a5711ddb6c922698e6799e1232c838b34f010c0b7eb22ba822023199f9cdbf83e652985249046def5a4fa1ef3067412cfc32fce2574d2f45c3edf44ca62900a9c0d2327b24aa8fbfdd8d0e29f8bcebf1013db07adc38c6d2c04e1a843229756fbaa5782fa7df037f6c39f602afb49e98ccf45526155694036eb3a46827a42624bf57bc648aceed05c6c7ffb2244fb589e5f240d0f5084cc02bcc08725e84c3d84d971ed471f5f003df1e66c95974517abf68f03fa0823f42ce4acbb6c8e6acee2d88c91906bb114bd249c0953e41a0e4ae4dbada8d985bb5417feb71b04ef04b14c37e390e1f9aa80586d2a6f1220ff89fead63ae5ffc4f7ea473e5732fd740e570cdb3c35114a8ab92c4ed99866ce02300d0aaa7dae5d6f0297b6b16fc73fbd7b06de22d8ed18350b796707477764807bf400662c1e7b29c8dbf38190f1f8fb9dcf8602774aae0d0fc8ec4341a7d1dd27801fdfcaac3b2548b125cd6ed48357c3dfc409c3ae9d5bddc2952ee73a59e774095ab205635e996766b28469b7135f9371888594149b6fe7e0200304acd79af63661058ae39b3879305fe2ed1d44615b72330cbaf0017864007438a484c6228ee897c266aeaafa0849fdb0fbf8aa8b2bf13f0e5b7b52efe054f3a79b14b4532d04f402391645976e3af77c474264f2284f3d29cb1699c3e17175c494264ad52dca4810ec48bb1a52f9056039c589231597aacaa238616cec6dfc0dbee3c13fa72056fa6a83fc4035c3ed3cfa23736b14c6a9c4ccadc2663fda289773abc71509ec4a07ebcf092463f75d4e8c84c00f1827a06c7c4a1d7ddf81b0e2c3427aa820b5645eb1a3c050bc85be87a3b7a5a4e202e31264a6762f58f3bcb5296c1824c2e4bcde57beacb79ce02f157323a9b18ae1f0375b33aff1ddb9ec24c509ff1b3049a2dc070a5b6dc482a7cece0e0905a0f8cec48eadab2da777f9e51ed7a80f0078bbe6d4ce539cb98e4c98ac908b7d2611305b1f24ffa02db012c21030a14ca6757309a59a5036d55f465713544339018d286da5a35a14031dc64cac4e3678fbc29cad4612670c74d68f827176c98d1c60fe134ca71d505bc22a79902db85a6d4b2e61c7a8ef05e32c5999aef1f9290bde5de724b29534a29550675066d061243a243fe7b191546c86fdb79f1fc623b92c349ed53845467f9f12d6b87adf2bd6ee6226fbbe8a28b4c722b51c11efe43bdd38c7b10d750288047515787ef5c2795e33be7f11ef791f9ae87888afc74e33b472560797a60767bb75175779781ea7290d0009e06e7006099a7ee6e50dd8e7b51a5329b26d8d3d4ad93b5515b03361cb600fd4f47eab075923260eb6829c7d6957e015bf73836056c1d4c0d7293107fe997325b27a969eb682966eb4a9fc3d6fd8dade312b0714a2260eb24c561eb680966eb4aff1c67639335b64e525a22c0d695feb9ede4a6ce893d30309c00b68e7b97adfb5200b6ae44b74ddba4a4b4540240ece9cd5155ca4dee13ff4b259494b4a3302a958aab3e97d63d54bd7e3a40639a87e3269b262aff62e59bc810eea2c278d2f73f15b07cff1b6217c052f4508b831639e0573495a75aac335a40559ef430606c32db612b0c8da568b04fd501da2e0e9d13bd50195a158d0463dbe6bac2d0766db068551ca0f32c90b8ae3ce01da0adbfbc50d9761eb0fdacaa11e9491b7580b6340f85734d1a0d054fd304c39ef4d94f98d5641886651ad7114d9571d39392d252e99f13e2a62725a52f68895ed00b8252525a2afd431c8803a5a4b454fa17823ff1d4406e8a3dfed27fca9192d252e99f038a443efd30301cf75f2a511a895052d252e99fe3a417e87ef653477a4ef7826af30baa843a8553bb7162a788eab6c31f48d4eff47af854b7618fd71889baae26bd40316cebf8e287f12dcd9fbb1b5b6de53b34ef34db9187a269d2c9997e5102b3733310f9de4cbfffe126ebdff7fb0e624d9dea21ea6b16c8a0be9fcd02fae954e59daafe0b5f403b38f4a278410fe82b7c3edbe3cfeff93c28fc405040e143e5bfc29422b086091d1f1ca22b8888ae18225a02113694055036044474c50b0287e80a22222222ec8a2088e610290aed26d0501640d910904f16239b26598c6c9a8c414a4a4a8a7d3af02d299cf1c14bc2fc5829f54635bd8a31c61819e603fbd21f04171b06981f3e85768c2325a5a5120ee3cce95395616ffc572eddf2e998673e72dfba22b1c2bf7e5e5aa93912136634f7465b2703b375ff6405d3316c038970bdc1369c77ff8cddebe2ea75c9d4197f69d93143ec4bff1319256affa0f6575bc721511bfaf8d63da396403be6b8b959876f186f3ba49fe98d56eb89b92e1d0d9ebdc1a7129215d026e1bdd8d74d2e5e7c8182e0e5a48176955025f4729e30b978392b3f6ba369d792f3535b722aa1975309adfcd0e019c35c976ec6890ad5f8d736e7d6057939961228d70b7b5c2d574b866509d50e0b4246838182a002aa30eb82768f876771ecb02acbefb02064e58de6c423d08e8527a7b2f0d49e719a03679cb820f9d44992103e33ff8c43083720fcf127cf6d174710271a92409dacf3b1e63abe673b46db5abca80d38b8e622f954ef2d50e84395f7a5d6f910fbd08e51650bee587245edb80e2d0efe09adaa8808d7b8f1e4d883f95e7c328bd10241055465a5bdaf5ec24aab191794bed74b90e03b949191524acf766dbcf8b62e48900a254039fe03f2deff3d7902e8c9134b9aa5c6577da780ca1d0e95abaaaaaacaa792a0cab79930be8618a5d75fd2faa5066dfba543523bf8cc5d2b7cad48ae3e29e3c59a4a2f633c52af7f6f7ff6890270e0569ef4d9cf1519f559f56de9bdfa95ada301a38618a52dc6b6fb4249dbee68cbb68ec2d8765fb0ad2bcdf8a50d3982a4b39aca48d73e9d43f4c33a403bc44855bb231592ca526e5ba3fac707494fa0fc106e2a7dd5e087dcdd3af956c99252fa5bb22aa1005a2fd774bd6b7c69b0242ddf9791ab4d0681a1ddc391e17b64460173b31340bb1db6bbbbefbdddddddb7bbfb767777dfee0a26c7f8348ac0cabdd4dcab016fc01c2e0e2df9d5d6edc70dfa434bdbdddddddd47853c83e68417ab574508abf736ed89e8eede15f17d5ba76176149c284abaa7ee132aa4d411946a9152ed675987545da4e154f99130139982c514502c4187e8fb4e3e9982496de97066cf1f472352a70df1edfd5e1b66b4c0b28172041a62fed5b3a53dcd7a7f656f699df5d60664b31df29fd6510babcfc2b6ee3debafea1fff4c3fa9011902447dbf3502e95f2443bcbeaf5a78f05bcf6ffddc29b1b701d95fab5fc6877193924753da591f2dadebb7fe699ddcb7e0f4edeae72058ed5fdf80ecaf4ba07f3720fdef8314a91dc46bffb6f4f852ed9671660c841004e9c4118ae0d31349ce0ebd608730205fe0e3d301391880105145448a82340529880474baa188d4858aa822aab42075218612345034506ba39f245411555ac45082062a8612d51495944aa80a6a4e9e68a0e4a90ab41a1a40903cd5a1ca3f0021e8c40e956b3350d0161eacb5f0e856487392b522cd3d608b0a2bd231469aeb223c3cf7b7d6f74f1edcc4346f2de0a3b927a4631e0f441e0f6ea2401488ce3c600759bd94cccc2ce304164075a7d475a20b51d42d40509241523dab71f6a73726c4b4b8b540ec46c7f8ef463bc6b3f713ca20a59ad5c47f91374cfe5022cf9999f96930eca66bdb6edafd6813ae0303c305edd6e72423e10f7f6918e8c38d1f43bc3e3310e6868ce49e792f7e67474a5cd01cd024b5e3c6c1c9019f5cc70a6eb92d68dc30a63ef88b734dd0ea2b1ff1b9a8519da4f6d7f897d5f830e5f58cea9822cc4ab8c648c64c9ac3aaa931166c2496eaa5758b45275365622db28a2c2bfbce8e94689ac4f81149e58249ed642a142e96d4fe1c3bf416948b9a6b2b096554cc69910f7f5949e5a2feceaa2fc2556e35fca98c47acd5c63acdb1119cd31c168c42092d39826e37cea524c6c75ff6062d6e987243d10d4431744840a49faeba48f2f186d25cd34841ed0154c12b281820b536fa699c483e2428061840152a93dafe4e7848a9e67cab827c682767d42137dc509946e54d9ae48e192403a40050792301ad8d7e121528a92787a2daa49e98938553b99f07d6f951fb7ae9a6d15f5b27a4361046d40602a7363f090ab485473f44f2a3a439232d3a80688eb5e526a8649aa9c991c63aced5258168ce878fcb4773fcde49a2aaa84aaddb2995218e0fd9b0030478a00cdf89d84d19f6f0bb07b7b79dd1efa8376ee1d1fffe6d1d92ba6f5d326db1d704ed5c747875698e69b0214954f97d14557e9475aadcf112f5e980762e2e5028fb0671704099ab857311c1bffdf3ce407dcbf19f3fa7b60313b485474b8f67a4391ef15fdcd8864fdcfd392ffbaebea174ccf51610d606049f3aa63fd3b8a77f63b9419fe6582aa6756c44eddf0d9292d252e99fe364d0fcc95327cf7356339bb79dd1f7683bc242d3c4b7961eaff2f3e0f7f7ada507732d3cbc02d9602a9233d0f05c41db470f3e74a0b5a8d130966f527c34d7ff6e403b59bba5a4b49bc3fa6a327f7fdfd2968a549551f7c915746a0b8f6ef4d923a973347af9a397d55499b663ebc4b4f7b3b3d13684bbc87a5ad9efd83a84d150e15b50eb1a3ddb2eb7bab2f5985639d3312f2cd3ba1d5b8104f96c0341f5f2615623ffca6ab21dbe636e96d679c53422bc36ac2ff2a40664be7c9cca95ab4f13a7b9b5f4a85ebe7c99d5c8979db13684bb42247562dc45dd8ee98e0451e763a73a6be6d682d5e918a6453804d208e50f7c800ecbb85a3221948232604da59551c0c6441528a10b5968d90dc0fe0cc79781f173b4fca8cd68b2932971dc649a8332143e81ca2742a7c68f9895798b7b57f839822a34cdd069e2a7c25f185421f33461059c3a46e0a2768b45851112a153e1cfe818e6d1336255b683089d2aff3defa099d12ff0657cae712b310165b0cd5ab96feb20b37c9b6b5c5bfbcadac3e62531b826999571d3cbc8b48ccb442babd9afaaea754c5724d678ca8a98eb72e3b98c22108949fae8fee29beb25bbb3662430aac3cacff48b8a0a5451791ee201ed96a88d740c57089f4fb312d2317047914d08103546ae6d0877b113d2d213618c5344582b022bd560b41b6e92465a4079083ad1dddd1106f4cdc743cb5e5813fcc91d8fa142ce6a6457978c324a50ff0ee6c626b33ba29bc63cbc84cfab6ce2217f813fd43dd403993407799a8359cd0c16d01835db78331e312ab3956a2eead0f744ded4b6d8032cf8d497a3be1b352a99f2976540dd1ceadae8321800a85b5700f071ca4db4340461a00ccc908c938aa0ddfaec00819e7982052615c26e7de06b530d0f9feab0f25d8d0a596a4739e52f30a864290da5188b1ddac90a79465d43192ac0019b103c20c84df7011b0ffcb8e9808d8e9b0cd8e8704335b00d9858b6cb9c845906d37e820525a5c5b1cdf9146633f36320ccf9a3964a5a08e664ac6b34b72bb9653cc847737bc3734c517b68cedf3799b5b17fa3b9fdf9de689bdbad85b7ce657332bc5ca2fd86765409dad59037f266c6be6d06bbc89bf7de7bbd41863f0fe8699543c855b51da9806405c44c3cca522bd2351a7de7bc7515a6c9f993b5eba7d661b55a4ffa796535a4b72ed2c57d759208cdb0c95c6986691691ec871c3955d2685e181fe055ce7454ff9c216421753cc2b3240e2a1a699431c61c55b617392adcffad4ba42e3ae07b3f7eb0bbceb404fa2110f8fed3b5f750e38a24b2cb6007ef63697da569506a2e7533090800facb74f43f6cff75b0ae4bd5f1361f5020fc7d84b92e260ccb1607bf0db409ed64ff252b95b037a752d217d0ae54e1ec0a67744c7c0861dab434fc97c339e79c8fa4b6d6c98e6b7fd4e45b3fd39786a45a5a11afd2ab929bb06d3d5b1bfceb93054f3127c93ac23ac23ac23ae208eb08668b073caaa00c9b246a5d9606493f532a533495226d25094ee7f0b29ac8fc33bebb1b108e186fb367d767d75b4c68579a3f2f0c66d797b2ebdf7bbd445e8d1895d9f5160f6827ab915c1badb1a5790e89eb443d0de95794b4899443d2a6b3af8f3a24753e6c566fa77aefcdafe64c5bbb92a45f9a6a2b3a9d43c5f55a41ad2459416d2b39b0c22e6deb94d8a5edb8ea6372a55a7274a6a64ad194e65ae508ba92bd6d05d59ca53d6cc4cd1a304b9b35d376a8bfd0185649d62903ab6aa65d9ab53622a9b45559cd4a121c54732b42ace4aca05684a89da36445a7639674cc5c116271ecab5aa5684663130098e49a693ba3a7da760edd8ace935694740efda4c792edb8ea7b1ed06ea674cca86f9ba9b5414ae9e011d7a9a292d5ac2869aeab6a7eb5a2adbcc86a548a666a25a7a7633a95a254c738139e8e71a252b482f25ec1b1766515e1bb46de3c63543d566d982104ad9e508970ad7271545f6dbbc283758c33cc69498104b7bb3f7777f757e17bfe0484f0c518e10f845b70181dfa131072852f46f803e1161c4687d7131076852f46f803e1161c4687d39fb6433af94b5f4f3ad9b4e9da18cb628c1ee17bf1c117dd428242ecaa50db990f637c2938ab39216b568df0b1266b8cf0d2301ad66285afd221824e9c2237cda253913f6f5e32583bd68ea5036b47858896da6355c17abd0ec986847a7f04259d2a924d8cd547d249250b952ca28caf92c5e2d07193f55267e6f84b431956d06ee254515bcb92b2c2a2c6d76561cfe3cefcab5ad239a43a87fe392712aa54a5d3dc696db416683771743a66e6748c928ee9829c16c7be7865d0ab6b3bf32fed593b34c3b29a9d595ddb91300ccb6ae457d39999979997d9330ab8f5a49307554bfaa52b9d2a5037f5943fdad2442d56d658c32c1dd0681d412f1e17f297ae74e08ef55756035ddb8a33714827eb4927998d82d606cec439e1543ab565d4aca8c90ab5a8551562178c95b4ae3952a1b182c7f282b2ac3c76081f84706343f81c42f8b4af969451728e4b88313290eacf0fb6fb046e628c51db40d360e2808f25080b6cf717fbd2cfb22618ff018358dc5d7ef8940013638e165744f1824d94212d28acfb244a154b44c942e9791428ac285254ff1a318a938ad57d122565053460484c8cc9c40257b2722b9468019635c10a24b6b0a206562491c28514211c4809ba8214285286809d41ca0e32202946645a54d14596aa420c555c5185501558802ef877e16a6c5605c5c640ab29198a4a2d82e88cb2845a53c8ba402b285ad017490461810413a814f483a09913f439cea38cba4fb890441557d4ee61a6c0c048e3402c143fd0994273043671054d14ea2982e6085c810e688272c00529d01c814d6a4003b7ed1cba1a35bebf5c007ef530b6c82dc2afb6f847600b6620b1a8519fe151a3168040487f692666e08324688e3c19d0c04742c3750eef8604e484348518637cf04dc1ddbd0a7232853734837c2c4931d159c6899193ecd08f1e7cd87a7a7a1cfae85a5a5887534cf8596a6735ec3385763b543be9c3ddb7faad5a7a78e5f7ca5bd752a365e6875781381428b4c78f9921fcb7bc5b27a4c2f7409e0ca834bd6acad04241841f6c7eb001922c1d763161bdb52ccb62a9b2921850fc615fa41109e368188276371039711245143e04ed4829274ea2804778f0adef3a4b63e917ffc8d5daaddae4168128bfb763bd6747309a26f1378b007f7f7d4e0433d06e7d6458b62ec2b4f0e0870ff93dacdd87b6a14a3e972a35226fc91254747ecfb5b74e622c3d6306427797c73d33d0d669ae972839a9fd4c6a3f8988762e54ea4a3a39b563d4cf9225a82724a32067250129a5945525bfaa2ab949806231c66dd140dd8dd4382957bfb6a7c097aa45594c7356db53e0a38fe1952e6bebfce90fe5cadd2f3e562565a9aac6a28c2852ff68eebd2a3a7c32db8f97a3b9ae20849121841042dfc14d4cb31109047868ae77f8d1313bb8944e6572ccc058354c841042082174777f10be3b7c2ea9e5853731eb6577e5d5b7ce7af9130a6d77aff8f2ea7a5cc5ba1952fe6b49bd2dead2438d590f1a40d4186196145130330b99db1614ac232c292c28584838e9dfddddd588ecf0bae362690e6b5e42f2acc6b97a8e4e8aa7c7e7476888a8c84f289c144f8fcf0f5011ed53a9518fc3e5c0e8f4481ffa5302fa204ea86e0e57a2124896e897b8e764d6870ae93942550b752ad21041a29ed7c327e7d3fe448b0ada511ae6a571928d07b9142251fe5651f72d2868ffdca6d4aa7f5aacf0e7cb6aae4a83546ad990d7eadab6b9cbba42ed2a7095d8675aacb61d0c3edcac8650e6ba2c9be4fbe83b05e0f0625d73946db0d3eafe0ac92d7ef7d5d67df1b75ebc191bd4c9c71df66b6283ad7468b7419117eea2f6002dabdd4502dd95510445c2286ed94dc7be65f8322ee3bbd5c3aa92d52665a88ff84de4c34d0c68a209dd64400324c25d8b1a7d74b7436f9bd07961c338d264d8d0dd766dc4e7ba839234d677b28b1b1de323a81464f580fae86132843b162603aefba6e5e4ed7beb84f2c397f139ae7bd7a044051554b04cc176df7b6fb5774518fdbdf73c4208df7b0f46187ddfdb7dd25441c86b2342685141f99f7c113e089f4708e183f041f82cf8de8bef3d7e0fc6a5fb9a23023e081f363bc3208410c25147c9b604450f0519c29761a3f78f8328431a9ecdb3b171b77936cfc6e6c517f4e8d10386156398026fe0cd0df30dbc813737553442071d74a82188aa9252884a08ee2da6c01b7873c37c036fe0d02823c58a79f6055e3f5836e03f5924e1b35015919b4ac229902b2237d512951095909b8ac84d25e4a622725309b9a988dc643096c016e6649d79f63298c5acc26466cd9c2bc349e9cc2b9bd74f1351fe99661e9802c24811db9c4e9c8451368cc2b2cc9da8f24128c8cc7e0c8d3212fb30cf3e03814d30c53cd0c90b8456c6435628b31e5edf3647309591b217990af3c022200a024115ac09e6e4d4b650168a6871bc6f0b65a172a012394516c9220b50fa2253f1416a5f1af2002651fb3d571bf3a4813e76c23c10e0d9e145a6c248b01ca6fca553cd19815e281915951596aec17137606056565860f08c52c9e5593096ac6627caa2ac862130cf26b12659545484da30055315a0982c9ad2a6b8c124280b85b292b4093281291698a2589601d5b0037feeaf17e5db49e0f77c4d371cd048c0123c1198ee18b00e100fbc80aefc3c58e0a67292364d9f1e3688c8a788da6d511549b0d0627105ed38479624eb0861ae4bb7444f3091839394b3fddf859f871eda649d6aa42a338f1215e268618ada6d149569ba1c95bda5bf0c519f01cc5766b2d22ac9e86f616fad859f2b6fb409f4ab4b13d07e560114eea6507870d7d18cb86902fbe25f05d7eabb0dff289adbca525e9f2adc24a988fac80bd4ad2150ff36491a7f951473062f4a7058d092a0211f4687b801891a9c0b3090e0409f25fa65612894df77dfeef36da1f31728bf3f1fcaefcfb16b08192f6c5a129b298837971096259fe37355599665599665591c9f2b69310e64575230f3fbfe1f6e6a1aeefae1a6f98c629c270268acb7e567de88308ef85ca6d11de9c23e4d3337ee413da9d727e108b5e2b14faa7c6e1f6464606038eeff7a52ad8f4890e0198ff5b9b698a3b9f64d46a6b2020e195c7277efd7edee6a52c260c812572a15f9c2a217698eb02cc346937451eb8554a956220b84f1766bf0dd182dc3dd5d06b6bbdb324a368cbc474aa062ca49da7ea2051ed7b8daa0c9a8d331d74a3546aca1c2a89506f7e565f58940663c648d3f2bcc35963a25e6da8a4a9d17e6da8b3a27e61aad13c35c23d5391ad539c25ccbea2461ae617552ccb559e70bccb5abce15acb2ea5c992c986b559d30668c190373edd559c25cf33a65603364b4d8307a25a8fdcb3defde5e15735db480fb3632093502eebb744c0504e42353b9fd528952aec852c11549d14a42d7db7d94619611b46b54a33a09cdb0ad6b256f2b35a1ef79522d8ae6d6f19224dbd7f591546242dfd6b5115a27e9117c27be0005ae135f588269209c52a16f6d447310c8b7c6a25b8b0a5fbac9077f810ff9044339d28f326cfb5d417cba4ef27debbeba0efc1ee202280c3fb34bcf0d559805277501759f086d51e74b42ade74c7ea31c268803fafad3a8cd67a660504c1a15371f16c7fab036bc7a8b873e869173167298944c0a26f5eeee2ed5e14a1173b9c0efc3e6ef30344d30ed04d8673162bf19c65a7c4cbb99c07602ec598b5b27273635eb31adab51fd67da5d1825e9db3a3aba0256ea9839bf65b2f010570fbf512c3cd3dc4f370eb462b6f480efffd26767f2277c8ba33beb119e58a8c44db745b9746846000020080315000020100a8784e29040201e11365d7e14800f7d9242845c1b08c330874114420819620c00000000911118a919898200fd803bc1af6462351915783b70486f39f471cdd8d64b555100b0355875db084556db1a35708678bd66e6c7de65c9d8015441ec85aa25ddb07fe594656e4b286e0bc93274f0b386958882743a2dfc211389e0c140d9961ef224174f1da7d835ffd7e9610e9f3044d1a52ce0a069ec0bd81ec15ad17b41ed33cac98166fbf6477e70f1a123fc67f9d40b4d9e792aedce3bab69cf341d2be95bfe57a005270ca956725e869c6a59c4163ffecb442462541d47314a1d9b29acafaa20fe792ab76b483d0798b877a24273f2d057b5e6f56e060073a162e7abdc8d4358047070ebd7d8d33c680612431092cdf52eb63444ff0ca8ff33b907077531fe1e4935481af1677fc920a9c29f7d2e84e4b68d72044c4451e9d786262ce7ddab4e9049f74236023860beca40b2e61824de9079e673e677ddabd9cb9baa557449141bbc01b00dc92e5f4954660293676e385962c7beda6a14ac70c02f1cd9e2819fd785a4aad1dac0db864e46c9488dcb5ef87e53dc5102e1c39bd2e66becaba76a9ae0f2fb18a7b329bd14b555b2c77822d32644e08aacd094dc8e095bb153247517397c4066c3020806f5ae8e96d546a357bc930fbd982c46e8644657ae9fc231dc8bf7284f0aad566c32680b818fdd692a05eb14d518b5435e389811ca0317eda86f0429c64c744493819d9e815702f35cb6d644987a4445f51d2bdbf73a40a325bddaec447ffc3f07dd22e003703bafb5db9e8737ec74fc4d3de1188a35b703b7c967cd8f06facb27d4de91562c3601e9fab3ae5058036a17e768ed8505688084d154ab37ce7ef3ab2c6d37b5658288d1c06c58e2ed71645268d0e8ff9e9d690fcb2d4bbad1c01f5f2f20d1711fa28d4f46c7ad349a43e99b88508b50da700c9994af10cb535351822085986b481fff34b0b07169b7f5e792e476b09fe4b0ad2b74023146ac67ea5ff8d818c634ed5541d24f777e68a8696fa73e7f818af381377e29dffd5cce1a9a4d29bb4fe63eb01300ff4499c2db6bd3cd00b134221606fd8043e21ec216dfbf1c0f0f65d8ccc37f864dbc9d389a31aa869bdf3026e423f9ef1925b37c622e98fff93d2cc05cef494f691ddae33309c9b2a987b95b22346cd95a33c740a180819e317b97f93f0f77f045047d0179e904103c288e4f07f96a2695b185ac3aab206a643177dfaa42b3d3f6613e9d9a22a67fba965cbfb169ea345be70e89863c71052089ec7ffac2cd9206909b7d34aa7025639e9cc609b7a0b6ac848c00f7f424bd1b1818c90d78042c346a8603baaa2fca50359f44dc5b823c92232ff74a79066bf757fba7ee8d0f4f3480709fd8a062fc5b172f6f23add182eb96ef43e4dd5df9121555c1cad1808d7cbf5dd6dd2502ebd223e3aab73da7f094a0a9c16cd0bfaf7414578b09597b739c24a0380d8764a6c2352829d75146932eb8f931a2ea417dcc32de281d1f733c71117b04127810c76fda531de3269ce016ac224b2cc9356f1df7102812bb9aca3fb8ca24432e16d346453512538537cc1347b5b23116be5303056396902e7483e9a21f66221393eeebf1185bba8cbcd693a73910d986acf7e8e3ead0a2864ed107f53e508ada634b31982eafc54797c5d2edd1de98df6044c0e58c9445cba3b0d0912b39eb825829e3acd01e80d8cda396bc09cc6c8e742758303f2d3c829d56398d0517faa88cfde5c364682b3f2c296b54557888f366751d1e5c5d5d63ae6d3d513079475eb0aed5a29f386d4b8163f591ffc3f88b13350bb5ec35659254e099179150118a6648973aef2f0633eaf95480fe878af35c31eadcb6c47762e0f22098f592fe30a3b325926f911f7358f944a0e106bc8d350347526bc07ba5348427fa7062a2141e2dc030ec72e30245f7f5b6c2fc103d5d603feb4d36d3cb09436db308a58815daf2e17ccc64f8c3f0d8d5f16ad6cd47e9f48f379b8f6205dcc7c847f6703ccb0d47e0ae607826dc66bd972137adeb8292e79cfe9dadd662c1d4af57795dc832265043f78d77fdfcfdc996b2ba2446378be48a4acbff34f3291813ccb65c1561e690e4f6a9b49903573b005ff243b5b0523bf73e17b46a5064f56ef97056db2c29c499cd4a94324b3035c8a3b31c8066a444e4ec1230ae69916adf0a13712905504f61ec2299680fa97c6688a2452b8633b2b59d720088f246ff691ae328e368d55a4bae15269611d362cf6e371df54e08c0fc277fa64bf270b8df14c3078c848f0e2388511a549a6a31e3dde472e9140f63164509076786fa07a5a0b4bc2ff84084da3a8c95820f451d916bbe592984775215a66d1d81f0376c0a7b635aeb3370713c8c1e5b47381833253b1c582ff6ccfc085c60d046758ab4a209cf56e9b89b6759a02dfd5ba5f4513cc1ed0ecee2993d5ec61dcab168c23c6d804521245da5e9e36a0bae5a37600f190e58d9e77ac325e6690c4d72c96cdf1262c4f239e726771582471a18e39e9b2782f182e8cdc840b00083008617ab60af1f389962d21702aec89be00d1963d2c4bbf76976d0f6629cf3e1bccaf6c1d84b18dfab13f040f6f2c260f572e0c82c9b7e08e12ef7246f65389532dedf4b2644af11c4554b85643f98bdc2d4cb21e8651f8da54a11baac5d07f8bbb095fa990dbc4cf3690a19b7654d7ab38c91f94e70c16a19c0caefee38b71ff222539838553fef31da61ea798e30eece26f5151b18f07e92b74588ee64c8d0351003635abc7023f4c8848312d952afc95f25be1599b6359e108ed8fab77fe2209972b2e8a03c1ebd95ead383bbc6e2fe953373b26fe9fb5f672a6a1eebfd53bcf97851bc9871eb3fc5dbc717f5c51eb7fe57bc7d5c515e8c813bcbdc77db55ae6871e4fbf23e5457635f5e0666634f037efca587a35b90804ce96caa1699f65d212816e83f5ab9b6f4d3c4253a34464dc9f70a87f45f160da4359702160d5614e14d37524cdd264c796e51acce74177f22b26641dbf8216bca38088477ec69c0bbe248e82edb1587790e2b8f7af09e24eafe03cce728d62cab95829f193c6cea0cd2c8a43356b42b288cc52bb6c23110e6d068632eb2a815589e8dc29020a07895d2c226739f6384142b0ec3f4fb9e495bb4a41380a42f32af9de0f6a40edded58c2cc76458e51f4058804df6fd60d471ce0addd8e4d8de8d9a608215aa57ee4ce37f32208501ac2fd5ff95bb21c89437ebb5b4b0ca8fab88496a11a8599fd68df54ecbf083d23f548030650d4e3ccadf0680bf5ea129e03697cd4024395677c9105c94fb5cc0c4c94d3c863e630412ad86da0cd00f35b82a588b185e42490fdd854efb62a52fc824de700d9bcc06c95d219426668a49c096077344045bae04586f81724cc2686967915d6b5dad89c36658be54ced5eb40e59683cd456256af7191c9dc45da20ca365e431a21cbfe97056082537f2c8125cc3d1e7a18a902672dc98f2358fd770fa1cf422255ddc0043aeedf008296f87c2a918a2e094e6c54daa83f3a3c1db0e481f44825b0acde26cee587c7bfac5b286b0f17949d49f7ed3730d8a48b281ced857cb08971b0e8566d1088531d31364319119662e6a0e683c4951b8fc4915d44f29314518c2eb55a51b850eb6525e9d5588c5317098fccae9f9819285892a6f6e800f2545c9609387c2037f3078beee3c3d3efdb022555ca38db70d4039de4f7f344b5bd26dad0650eccd43e4c3669e56742efdc5abae52fe428f536179bd04ce8b73175aaaf1eb2857a8a4def81feb338b47758ea48697dde4c7f8a392dd57bdb80afa008c6891465896a9e571ac271bcc43e67b4654e99da7178cbcd926cafe9e7919e8742badbeb0b1e4f77ca2de3bbf47e877eaed2874b3d92653f22e7b2d6d97c57fb88ddd79142ff915347a4cfcab6d64a54760402156a7343c765f76c94e2e41ca4e3f267c3a3e5d0b0152b2f3cb6566c72b524917c38fb6a7b7db1f2751d1b5d5d6e4a5f0ddad3174e8f371b7b6b185ff92a9f555c991b6d16207e17fc4d7f8f582324b888d3c2193e7141d8c5f14b49ba4936ab660ae2ae914df55330de05bd2d2aefa7e3d17d68b379eff16f145af141dc86463ed42590a6cdb96df028262e86a0a3cddc30bb086c3af90bf06c6de5a39387d2b17f03454be6566126470c01e296e930c1e4b12365e67a1817836a1eb469b9869e617cf3da7fff013904c62eb8ab84b61d82bb042e4a28fd54ed5ae8616ce4e3e5521ec2b338d1f7b342859417249724aba3515d1130f2036de9dd9d4b0d0b1736f1ab815eadd616e0bec29eedc8fb2b87b39af91071c9527be1b44a960e5e24f3bba4a53db54b7064c5c09ad015c9288bdc1925e18cb0269fe8b5e35a40af4634d0f2850addcffd85d9928392921918476bf6699f99cde3073a0dee3f7220a78a8134e9cf6601eb61554be12facef2d9979279c1d254cc63b357a5f9c01edb04528ab995fe2abbb1ffc4e364b48895b2a6b0c019a22a8fa7aa7b5732ef01675bd272ddf822d7c67386ba8a2938fd83c18a0b6cb78c6a94401189bf74538b4db0a1536441ac115d6bc0bc613d3ce0ab88e32016895e06067fe50266e890f2a52f1c5dbabd1e23fc41497af5203972560a185431d6c265d7e53c2e532c68b8223c0afef534ff2cd4dfddc72f61664db688473726a872453c942055d4927487c54cd4c8db56c2ca12da371abcdb7d28a37383beca87afe5f39d5318d69fa045009cb6283af801c949ae8d46c4fd07c07cfe5fd8c4a66b3c84ea1881a59bfe5e96c79ceb3fed5dc745dd19cfb0588b7b654783057b3849a98f34713ac6954af1a395a4a024b1e35953c8e176c26082849f37138078fbd58de65ed0e2018b5b0aeb44f722b6371ccbaa2880386091f5442ce66befcd34bd5849f9a400f97e5e52c492102b6259486a79485fc407413b41f4ec7ffa578d0c1ece26921af4f7b8a64ab2dddf5b144e2537304848435cbc9c148cfaa7b3e8a1b2bb12cb8be7efeafd3ce6f0eccd63f79778aa666600fcb60ebc4948b7ecc475c4c0840f455859cf4e924210fde4f5a22ba4a1c0fbe927cb631270a8d2f9943847610baf0e10e0cbea72130466bdd5ed3b4ca25b81ae0d4015b3c39a660753f8cee400d3c36414c031b6bfc42589891a251579f5366dda7205ba879872551f203979cf9be6729b9f9f4a5df5b2cf2bbcd75ccf14a8039a91e4f6a67e280724441d450ea642874e30856b518f130f9273ee3bac556ea4f3944ac0d72cd594c0ffba0404d53c5a78442d1919342b0004c1c762ae99d1d972f6658c00b6be3778bcd2a2c370598bb1408f9953cd72ee21568c3b7e6c17c54d4c1059388ef27070b3936a4c7e52eea3ffa7ac92e734d76a349e6dfb9b48e6fe83728d1c7af5b31e84bb3131a752de726b14f5fb8ffe190fa0d76043b169ed852a6394c35888f20a31b730e30b285721f316327e01e52b64ce02c62ca4ac42cc2dccf8c2945598b985185b80f2b0005eb5a23a7cc6f7a20db5c9324cc06dd21101d1d581a106a02df29f5463a13562e86f8f4d979e5cfff80268f06e5e6c0e79bcf73ebac58574c2a775a94411421d5598a02b94f347a200aba436c8d9338c02dbe4e8909f4a1a0614d0e2a151cb7f55e30fa0a567df97326d8549a96bbaf1fbeb3de9656a787ad5e213baae1215aa710c31052314b7faa8970792387b401740bc8a4ce544e6dffa000884e57a41ab9de3fce64b1b812f079c15d69f8d3ad2eef751b843047c7209986f67f1b97b301ab03bf9ea9ac22b4290aa464a276b22c72d05217b90f4f19d51445310104e110f0abe0f9bfb51ef0f04fbbe42a40607c8bf14236f0ec057a11934576900b0447360672a75838e234b2cbe9e80226283369e699525b848622b09284a91cc85459264d2ebf3c8af529584880377d3072e70248758fd9f28bf3986dadb0cfeae1b2304ae54a78d4ea845d09bb5ce0cd0191ed920bed1890a4384ecf5b6174a113135582329a97bfa21896f3ad6b2ccdce7f9b6c6233fb4f7c9e2cacfd45d6ef4901d21934232ac3caa21581214a9f4c03f1de978f0b6ebb598e9b22eef2bba7e686a0fbce19ac6782951fa70192d448eea3efd374fade1385acbd5d24eed3a1b9a3e08a708014049d0a645a1899a5b0b1ec5cb199936b1742c3e18087143eead0c0692d494408119498e1612293e530957c212b4675850050293a040947209542219a65b627ffe2aa8232a4a3d16820a7e46a1efa4f2d40b5895c96b01ac886f21b27836c4bbdab4e0bb331f068247a22852d7759279eee52c1f9c9d62e01c0d0a5186702b3ae051411b3e38f83584ca805f958684cfcf96e070090368e1fd3b14d0c2bfe809871e5ff192cc09e79276d828871bff73039e201c76e4622fb90d6367c326ba796491281a9b399d48adbe209fa17f99c8b3a736934b6e790810180f7830dd5f67033601fc2d3353eda0538c4b224084aefbecb6a49828b37648696fdaefad56d8bb5b6b884b4ad2833001ae3678b8cbdc411cf56332393e6932502affd23301156a107b8bc1fc2dfab1ae07ae4458e371bed95c1e0974358f6b4b2f43ab1fa3a95349a830b1b2a32abb708e93b368e32f91dea4f15d36e59b9850a819b8f971fdaa4b6787bbdbdd755e9d6ba0c0505c0331633b8068bcc2d55a31d53e2e5138a975b1c12724efe793769ad45708fb6fea319c1756459aa87c68ca3cad84a554ce4ba6455b39a356481115eae3b6db7a246633719c47091614a5cbc25077304b2ba4fb6c45239dcbace83db3d05a2ce8d79fd4508e783cef0db91753801dd465e8e38d1c751c8693863f39e150a6f1db38b4338615847dd21b79558719244bead9179bffcb9a492a9c9ca48fd215bce56157e9a948b556ea9c0774320249b376fba699e95656fc20ce75949354a0e2cc4cfa0675136346a51b5c503b95a0ef5fed2d69a864d237b598113ba847752009dab345c330b2f6c7c3d5ac2d37ccd8e74c74a722cb864775333f23a98a761697916371b26d32451b6c1c3040d94b7a7d75e8d3d0e7f9009a5297eb68665cbb0673c8c600d739bfbe0e2afcfb2ac3abe70fc1b8293543bc318856264fc72d6d1b69b5511f93f3a34a81d3eb59281f8f03d7beae1cf5435669cf60ca8d31a1bdd078cf596d0e5a20a019c22e939c0b4d4772d3203c6a6e6866024a1d55115f8cfba61ac056a5582bef3b57caf437d3b4e83ae7614b27721607bce9ba9db7269c8ea3d03d955c357245c18333c093eb42d4c473182745b3d01908ce82a0f53abfc5c38eef99ed7cb464204d28673999d3ec0897e901fdb25c13d0c214020f9327c4c81b618af19b27759e91a1fc199ed05243125a9720c190e73d8b41c3178992b7562dac61ee378f98b78c503dd48011418c53930c0b14d8a8725edb262142d004b702a1ec1d6f28cf1d9004304c9aeaa171518f88bd49b009a519b742b3fc83d6e66531b5938ff7a9c514375f3f64af9356aa4f4098562fc54bd3d6d699572f294fd84d65164da8210ee5c246bdb1e700394b30564d9af95ee5ddfeeeac59093db5682be63af535dde0c814f703b5b91f97fbe7a6fb3049a4025554d28692e7e49ddc474ae2ac649051f4289ed35f0677eb732096f846775eff093cbb2604378bb5440045d8ab8e6e767abbbd6143f4d93503d3d21d1345c0509d0aa38cd7094861b5d3a41621cccb30cd7d8eeba1e810d3af73efe16a1a2712c0d7051953fe2880665373e30b4495d9496e3ae823c77043cdcfcaca6b28fa084b8ee9631968d7ca5865d50a666b74b3f95e55a3b857600fbd164c474944046ec3baaa0a0fd684d6c5af41e1e2efb4539a029ca9cbdabf1bc679fdb7fe0de1c8b233edb5a00a99122a5a8a7ef4631d1988f709e3cc5f30938098df43e96906b69efa9e76b23b5c00e8ae7e18bda965a40e436ea205274a1db1344d2745f7c6834d27866131eafbd2a3822b3e778447d3bc390014c274fe4bf34ba39b179f841bc6666a3ca55cbe26740ad122584b9bc7629dd4fd058528daad606a249ded69c07bd7967cfaa29d5cd84be040ccfde12dfb5b515c3ea28476d2008794192df62149f363be7c9cc649c28f3f2a43506a58bcb755139fb2c17034682c1633a84b5130d424e8ff48a9069b4d14ff9af6b871ad9db1816d1fd07548d50d20c6a9d9ed3398270da6db6bebb178ef4e4ab4ffb618c21ddb74bfac091bcf0e32aec074851cb4dec726aee4d8d0c8bd46af45e59203e2839b19db73a859c21e9da8c96bd2d409dcd42120646a3819c236e101c6a1806bf653266c7a494557fde8778bf5734edf39e02c8363475c34337b054d573ba32b7395096e2883f2dcffca028d94e9b061b4c8cdd0ebe92f90e9029dbf691caf0df7a3848a1f1de0d3f1f67748ee1e70d63c785b2151817a72de0eba078545f12643a0b6ee649b4b5b2cb2259ee106ff4b3850789ff031cd3d39b6c34d7ba49870633620594d0604f5ac11ec98a6bf1a1474c061459d2d8a1c0138b0e1607274009a980687de497630d781817c76f2111d0650dafd1cd0274de01dd23236aab0980c630af32e289bce91667bb52d4529377b4ce70bf4ff503c53697abb12ead14987640b9ed83ac67a7f1d6a8135dd8232a88edddb46c754aae0fbaecbbcbb13e4e31cad501ecb23c163a0a0d329fabecfc2bc0f522aa857da472289448e5deb4d5ea5d2215d3c34eaff0b323bd5ba4508b368d7200150d297b42a17a379f7839a11bf0c2174f6b4012daa3d1c959b4c4af40a3584be4f1856560965b4308cdbf34f3652dc7da9cc49affe20162d024866245d3230482ec869c0152bf14be96590564fde444269384dd3e769742b2bfce0871e7a9078cf116e82f547c9d80e471f0cba058d1d35f10b13cabf9dc2e2da05ea410a844a8a30a2785829d79789b46b0c313b2946009de7fa401a52af9f80ca54acfbc9992c52be57574dc840742beaef01a43e28499584d60793bd0448f963ccc351301940a77875db8d70456f13b2a6c394f0bd13dfe4bf4c6f4d540bed81b16448849d97e2b349d653a146b1a39f4958d7014af3de491eae861a635e3efa2144328d8bc24b955f67f12f49e7dbd628167a30192b0e4169ef9be46fd507e7c5d54a2e07553debe8a40fe6c17920d06524b3014c9c4b9ccaebe06da7154c0f5ee4249348f1e82ae88c99de22f9f91cf180701d24440764cc0b0a6524cc92c88cf2ccfdebc0f16f84706cafdf2c8f29ac9e7106019274a7df75f0e36ec438ec937ec24ba24471323242e04198995859c0c660677880f50133c1d1fd4fef032371656058dde388921b5beea432c05acc3acc07637d8280861cc06f614e0372bf9ba02e561dee635095d618fc2188b7be396e84cdbbb7604f3d3d31e28ded1daa0ea31458092e7efa65a655f47511ab0cb11cf86b14388f9a5df2cc5a68c48d3c2aa5f008b5a4e1a0d959db094cb4a81fe17805a1048b23bf6ce387ede9595908ec8cc3da0d5e66eeb5b4a656e9e3ce6c0ae8353eaaf17fe1a4ba7cc8cd9cc70fa1bc47dc970816300b03fd9a223ee85fbd392bc61b5dfcd842405ba881a06cedbd58945170c38a2e1692ca42c58a1ca18a4baf0e5518b16e9a20ee18a2e6ba94d9cb1482c6e1cd56ae376f132ae6b06de71f7cfa6b66a6f9c418a5015490390de202a4af0b0ff4b29c0a43aef91ac71ca2864e51f3d3135ad474960d7a7da465cb90012657fec280e6c715bfebe9b6645c82602138417d43de66dd936a8ae7c75aa73d6a1505bb23fdbe608ff7a30d325f3bc1469a1b862045684b22a8c6cd8394f1d661c5175422f5f5ed4ca8dac0aeb5019bb133078182f6787b3dee16e587d855caf87354c9db86b94af6bb70589964ed0f73b17603caf9ffc85376c786038be236b4fa78eb05b4982e0c5baab8fc8fc4667cc82a6af66aa9366f6763c651a92a03f3aafdf5ab412314abad1c193d0a080d35aae84c6dc9fae1f9e81e6dee53306db966cfeda5a70051de863bc51424d326e0cec6685d380d4c145c7a4ce9e4df79bee95df5e95d93c3c186d2accb0eba2c6377b2c6f272198b876c8134a332b224f6d8dcd7f8fe7089dc588617d7a8e989aeda4f764c3e51955123b1d79092e074e3fa22585535b2117cf6b4592f52343ec5a83aec4b2285315d6f25f4a860cc072d1144111085eccb5a2c35ff81ba8dfc25db2a0f1f0e7214c39084c1c120386ea3808eb79c1eb9dad50eaeef029a8275f15a39b2e75721f436b46f19b9dfbfd309ead38e20d6433a580074239004286757f104dd273a34c7b38c3efa3b6d602cd558e7376b4d29149c41cd6ac43446462693062ac9cf0875513e1165d343d39570c00748aca1eb227d64cc2bc4fa66f2d3320f0aa1c03ad3ec04a92dac26092a93987a9c7fffa9d4b7291a1ea9074507450916027e885edbfde815907c45ff7787c41c17421a03edd92b3921b62f939940b47993d52a6609b217352dbeac4b62b3ed7f703bab5346c586551f8909cd7025ddf06f2ef1c9c0e274b70b99f1b1c435d15e9e25f639c9dd25cf8b2065d36c90228e275bbf18336b9f645840503f9ab07f33108a8384c956634bb1b7f7b55a2f27d5a2014bdcb17a2d32f92e0872fb1d65d16c73fbc1b7b0c9934ab012142a22eb3b3c5ba3fe2bdbc7289ddf6216fb3c9b2321c311bd26eb362f7a093755946f60c18e1258d5045df881ca4759257e4291aa83d91939a8f48d22cd0b2b0e833d5bb3ac104370def8233591f123aa8d78e7a19d39acfd7b1dd5c146acdde282b3f4ccfb94ad77cbd881515e49023b0ca88e96f22e0de0899cad7cb156f4fe967a4a413a93ce614a2f10eb1d994440465d6daf33b606848fa26c00b3635663c4c8406daaa2fced03f743c8a75bed5a540d03ddb59ed19c98e5db660b1db7e2c98e6dc2f766b4b0c39f9cd80c402553e97dc926b993099e8a7d9f388c34ba31ef320fb819fee0e9c59a4c17760a5e3bcf32f9fe4ba17a8d6b281d65389f638678598563733e5e3e37fbc1c6bcf6194568912eec6cc1742b86bbf65cc18ddd71f964c80afff75950133643e98edba8120b2b3ec4c3651d66449f6a8609243991ae623421f472ce602d08bf19629a2745b5d6519e3111b6eae08cf3922459e2c399e9059c59adde1b654221fbad98cb4d37fd1b4f14b41622cb0e9221b0fa1ab47a9d5bd917b541873550d6108388ddc32ae1eb29cc29054f17ea02f64944adcca08f8786f5944a0b87d481a4500ca6ce31bcc8eda93e49a58154cef0edd804e9bdc364078fdc979f6024c0d7b24bff0b4d277d42e7b3fc58eee3407645e05f03bf0d8a0c6976c2cde697da17266635a9f02e26de1195019ac46e6e842ee36dace72fa2ad6fedc742804ce31a49be27b59485774dea4545ec9952b25acfbcc0639de79870e3eaf09e466d3f27b38529a52ba50e82e2e09aa8d3739ad842b2df41130a144aeeb5f154d6f1ab045a47171a8bd4ab6c6f91a7cb8ede3dea6d78f01aebae9f183018d712bb794ae7f547da2e668925a8078158eda3c81ef0f217a3babe3a04c9b09571cb88ffd5220680f542e6e3f3318668465782b4ed6bb5e8dee7362f9ebec5617eff56354673bd8a8ced3ae8c176cb88aba2358cdebc77f9a3325db15096561503237c2af7e8685c33d45b02a770819948f1ae96ef4b9c8de97dc62934aecdb19c72731f76a0b0f8aa9f8a8724a77825333bdd3b1cfb43efc88d563b9e0a8b83deb21b20395cc864c497646b94688f1e0b0ae0aeb30c3d9759177ba4fda45e6aa70f0e3f88e2e4317ac9b5c5c5f452ca169f8e62f84365aa11365b62d23500a5deae997859846f96f4e69a589a4326f00684262de720a58560590de704ef30f94411bd3705b88b3acb498e65129ccf89716337c86e72bca42c9d94cf8f19b1a2ea48325a72642a3c6c522f8d6776e132de1565152e9e62a8e2428570b148e636771109d3b207355cc7521fc5865648b34b6385258d1cf06a85f1cb5ee1c1052e5c3920a4c5ab839dbeae3c148b33be4718e715784e71d32ea1cbd5443762fbe2a4f73bc8226743226745c1c339216fd1eaac4e1703231c28606cafccc7dde3e411b8160022dd3ea7ce17d93e0f6cae0f00b054f6ef95d818d854ef9b1f918379a0fcb433c84db05d7b8da8a7425989c277f368e6edc2f40a05a08f0651e105647343f88c0273022ff88c3d8b4a8f7505d6755054132209a4f8fc484a7df9673078b49336a4e4207bc89252ca249bdd8ccc01096fdf76dc7239e96ffbc54917caae9932dcf13a9878867c76f83845131dff88d8b9a486f374516b68a1d60fb2164425766290bf0d1e92bb64ae6ff8b0d55de6b1b4ae29754c194da9db501d6276efb24c557a351d44316089023c3137b9aa91a6a10280dd7a5cee898d4acc1e84bc9c0620e4e52bafa74e657ca5069072f6f7670242b7b1bfbb31b518f26b3755a98abc2245c2f67b0404b3021333a31577e2860e52a49ee62544fcf362178eff9e59c716f70df0cb06f920d16cc3a419401a13931080240c99fa4effadb7ed0540bca24dfbead7880d2433d3145193d200a08d3bf0f6cafb8a29069d35c0e899d554d1132f52eebfe14117cccdfb4ac0de32f9a8e4ae541c29a39f5bb01f383b116c36f6d0a8d3b82c274430266cd294907c4d67e0dc5a581141b5d613763d4bc30a4505223c772006e217d5d06cdf575169ddc9d852887bf68fbc32dd68de0f38009a7b49eac1f3714d9f7cb17bf0576b08c0f6cabae138066f228a8555859cc723474a7c035508e8113f9adbf5e72afef2a43c21673aa5add6932d70ced6a0269abadca8c126587304faab4232a076e284e9c8e5772ab4904ccc4e23cb98f569b1b99a46b88d15f646d4eaac4e83e9066f97c78028590b37a7c5f7f1b883e82abe82e647d757776eade289fa192fc9888ece25c08b0e1615a680550d2fb3d2053c4cf40c2c9735a722996a83a285232260f0c13b38ca6b204a3ea65811ea6a30a1a14f9f0ac8a063b4410a4193abcbc73b6751b7df0134b9bc2bb6df34cda8f6f400037f01ce1a95522028000185bcadc7eb9abdf24ef57621d7203e3fdf5b1ea514054f29390bc17928b02463cda81a04decd03d68385ef202c2fa302e57db1738249e4ca8982a87662764d20dd078dee15beccd3da461c044320d8326357e9d00c7125015619b92071c7fc02cd0bff26e396925226088cd3d2bb9bc532febaed0f1bb5287bcf6063f09b4c5c7670895ab8d83cfbefbfafde9ee02d1697e2af988c853b35f3f2926f002dc162d51103d70d5d4b0c21cbd1b5d55e902f9c893174c9428028dd74648bbf6aba5f106053ed88dad8bc03b5a5723b3df79377d08a7aa138178a6bf546120f63edbd530a38f5dfcc36b74a091ef1e417b2ae0055030d2ee9c298c7f29951cd47529d3a7eab89e29691479efd0408d66580e27e6ad704378720869e271dd101c291d8f5452983d3671511c33865ce2d088561de35fc211ce10c518c8d8fef44de5488f61ef810388a98fab1b500c26158e4c192bf51bab8a9037bf708707b8081e1bfb3791df9a36acda12d63b0cd82996cfd9aff8d143fa220ca8ce99e1c38380ca32b27fce3c6b2e12819245a4220ebfad808cec8c2bab2fe0d4f905c29ceecba0f568d38c2412397747d891bd36323d32d194363b45c7e242451a391283bbd6ff29e8708bfb62e8686b53a939317eea48ab070083fe41116d3da3a4f2ab85e5bcc19dd5ccfa3d481991b058c62a1efb359715360232b4722ed0a82dcb115584a0f65b33f68529b0eb84552d7bbbfd6ab0a3cb8b04e050f69614ea99f4f8081bcf0b8209c8f378be578e6aa6d12004e14840210572cc3a20b8b3eac5f2839208ee3463a078f600c4a68e0605ac629f7dc294810a15f07809393d5aa5b3611c40fa19b2083e7251be32f1540bc261c100946223921ccbedb8d8ee84d5905c35c4b0f78a72e58e76f85d512d1362863d913b92d755b070a5714ec403502db7a4e365339162fd8bea77b78bec84f87eea94b00c91c79e801bdcc2d09145fbbc872ab411fe4a05121875930ff1b133ab05cb3894babb2c862fb089c051df8040091cce5957d278ddfc2c1dd4e8abe2c1c26644841e0b725e0a508b404f30c0a08ab1c2591d2e80d2740a3d5252333ec741b3e8442bfdf5347bcf7bf04ee743bdb205855bec2a782fddefccdb873ed77a9db2f5d35d3dbd5b50274e16b40871a48b0446b1ab40f1342db26a913a7b7c1fcf1218a0e57afdb3b7203b056c6740488671768cd056f0db8ef902d8071fca1a3e0c1a165242b37f2182200876836fb51357773658cef401cb13e155f99399f854aa027090b266b8789cc96a8188434f22b75f63545168b7eaf723ac31abd228d598022160c7d7684a0fe818a04229fd694f7412c67fdc75456ab4b975a68138190182b92e0023fb975641eea3d031d0e702af9d9b73bfc54844860a96647bd5bec8647f84c5789e00d0e002233ed4b36e25bcbdfc2691ebb3c306b1156b1f450e71b252b20c1a009c4a86b86caf781f92983bf958c243dd3896118e6e82fce8d0fa0828de235f97f608927be54317504f005f1268d17c74554898f6cbfbd8c38e9e15934e20e820ee839af1a8ed5ea176b84749040ad01eba430f286cc4aa33ad5e57806bde2427d3a9c845857f755e5d6bd7e21a2cbfe21aa44d51a3a9728f3efdd04558e50f71037f717d1526a34a230a2477dd6a412d718d21dac0451744c359f8cfd108ba220c6bd254908d4844ce271d6677502e5ac3f64382b1a5e9f83322a4b75ee5e7071e8fe8359595a4adaa6d2ccbec1886156435d9cbc985de2757a74acc6245362d3ba76df268816c289559c2a9ec2bc9239b069956ca516274eee6a500c014a69dd0253717ca72c34c12d5c338a19ac027c0a623203aff5c5b6e17e4416353d9acf1667ae70e60905c74fae565a818afc488a0f7691ad7d358d51d1d32d1251c168a1d86872cedc97824ec4ac03f997afeabcfbce6d4f22e1e446e70b3a3a9181818922c5dd055547f1949f3a74498f21bdaeeda97ca5b9fc562ed10fddc7becf889e38ad634db18ffe25a78b9f501033ce5ad772a83d77511c429e2e90bb92f14e36f714922c7442a2145c5330a313bca085098a3f53cc5e0d37bd62d39cb0a90447522c958281526ef05751107c69b413b50ef2aa809acc2d5df188b9b220e332bd89bca23374bd2be2e47fd846db3a91d57e5199419542cede159c88921d19b95395e9d4e524e30ea17622326fd2c26d3180c3e11ed252c885ac180e5444c46048e3748f9cd09873c3f118a3c6f82808b91de440ce7ed329590f6ae53a7e05a94a7ac84589ca8486528843f458bbab02c55ce26df680c09017c9e636c6d998b8bc036a478fc74b15798f22d944305396d518b04f823c5fd49098460e177ec6d2364d8e12a98da1ee2274a8375cfca442208dd7bc03f498650b24115a9b93bfbf16117c4fc28a7c959d44bedaa64e81567572aab8d1d14445a721bbf89ab2f8632310ca430c019035cb88f084bb57c9956705888beda3c8e0484d272e928fc1ecc32276813ab6cbea2c9b692b54ed72e65230ac12b26c94dd98c16773c0cfe5017ca3c8617c0508286f26750a9a721f877d9c40c10104ce5b31e9c762286a8ce54b464c02cebe20284b2b6ef2f4f575b45f445dada4f3bee1bdffb6531d0e2d95795807ef83b837f0badd87f47ac3c0390ee6c2dc14b95bffeb5b598bd66ef707cde3f10740580996d70d9c7e298ab221af073bc76f068b587979cbea65698eb5bb281f4166a187f36a42e43a1c18502035d71f46dd141cef8f7fc98f0c29e6d8e1c8ef9a0c457c001dcf5870801250cbc1246868427b62184f41d943c5aa73b3a23fd85b1dd906abeed877d328530382c7a1b7a314166abdcef8fae427c49db2f7c9da3d2d618c97088d1c9b041dab91ea6a716c8839d751763f54c92ded49d9900e2256247ce64ef92f4263b4ab9171fb353d401fe70a5fb572257fafbdd2fd8457bd913c9f1b199719b7e86070a481aa36bac96bbd85e071a86409f0466a1068668ce24d7c3843311cb51f02d0f5d3316377a4504d03a3fc1d54576243e96ec5b697873c93e2ae21f3c7c24bdd56bd56497ff2300fabe5b6b306a60348b416e2e40b78796c32dec83b98d63c71e73e0e019ecd24bcca1436469b9c9a8e8a38c008f9aab2221b3e88a0d2f8759223c6383c0d08da422b93eb11f710150f74ea708f66a6abe410801bf4f9fff983e540f8900900eba28d6e39fde3b756c05d7eb850ea241e57ad0ab23aa2fa50f727fecf1bb50b690a6203425ecd877fcd2a56c53a6a941e4a2b2d5d482bafd52e5dbed206a0d5267eb848ff0ebaa701a6d68633d9cd08774794378a24fad97a0b8b09e72edc41852606492facb01da6afc3656f766ac15321f707e2078338417784ea502690be82001380157fa99367eb03258f1a83f35a49db23430333a99c0bccaa1e838b1394daba14a5b34943f715c6c76580f14b1125cf0208cb77574a089976d511821ab4dc14f1c7cb26f736d3a8ebeeb2152861bd2db9b0467662f7203d592112c88b390fce912536ed3859252532f38fd8266aedc855b98804c2ba57fbdab772370d3233f2a2b3c9b6b4c204a338cabfa84bce5eb0c574151133fe0322ca8871e0ac2694d9a6f5e88a0db4a4ef40325ab492c77afed0d1720c35edff5b1ab49ec3301531cee024e0d7058c8c68ef05e4033b80b49bee4f27ed1a3706af7de0598fd9c02edbdbd4b925e65a2527dd0a7424f2bef7fd08f77438a68461b5eb619ad0d558d23020f655f3cf2b2f50eb7d05c259880c01eab85e177255da3cbb16376f48573f451e4af5d7c22c79a5278262ac1d55235f0519ab7790064acb938bb666a8cc4a3e245cca6402c72edcb240cc426391e1919dfcac9127b82172c648088d3ac678c478c8d28e046d6dca526b95b34809213ef20004fc8e3252184d71b84852ca5b6e8acfad62de1f41938e922a9d4452078ee8bca13a0755e620d116cf7d1ecfe1cc05877b0cd7030264f258c2e9803d6d24e9cf620c5cca43823afa2b3bc9a6652fec6f392c852e9b2024a98408a8638484f95a6312a6a95e33659f819d73e2f7b5a6555765227e1b2d4c8858fc71abc494b538df814342a6bd18273c8b9f92de7c594b9be5f609e3e2e5949f09a40b20b3d4bc0cbf09ee1267cdbc421fb1b6abaa572d3ffa54d19c9cef72faa2ce7100c538482c5f36d6dbca11e6146a5a610a48b823bc0a8b3cbd5a5ed832e1a67343c9b356c19ce159c5fa73233e56407dc4920d977255b364cc28db02b8de194eb2f1ea6bba68282b6be4215947500be4df37e5ef157a2db1b4e119c80245b0f241f19b475261a6ab18ec510184c06a93dcaee125edd9eabb51c1e31a1e50f1bfe1825ddc27ac9f3ed0297948cc1b8ba31b8660f437d93aa2fad99263546e2f259535b88f4d9c03c423da6a0ce2e7d2af0bded8c89d2e183981469a573de031531a704d5066a3285dee3366a1a5810eb48ad5d5e10c5eef56508301fe79055e038351c8235f9059c0e3eea1bd42524425b77800b45f0c3e3ed3a3f277770bce8a8a0ca3ac513830b8ee6e307e091064554f8f18937d8fc665c1552a17f0eceb0803531191b2996bbbaae509bfaa46ae97d58c18bb3a1b84a7394a41a01e1ac2b9b5d0588ed4e5c606c336c467ce2bc08bd8d509bc622b4ef78c00d80860a6c606f16237ec04850fb2161ae1427692928db52ddc7262f3368e18568e7b801c521baf01f3d90a5a422bc9b18aac6529484854167c007ecda89a105ed858e19ee8e7240c8b0eee39fae23e9a1d1a1313fb95622ba9ac3619bcd0c4973e7b8157448a171049a5f878c1f9632398044a19a293cf538759db9338379dd5952c1c922363bc9bcbf3f63bc2a9fccaa342a3af70937310beab9e270b6374b947f1749102e12a105965f0ffffe400346d60413dda5dd78a7115c0b844168941ca1c0531710c6a1883c408b36ff577835a087a4122bd9cac637af98f6c32ac3109a9df1045428425c92a540109bf385dae5cf04730f9c9dd4a70c8ca06c580c435ff631c888c036cd493e18fa1b630e6c2aaf3e8046cdb5a4b1a87433dfb15be0375fbcf23acc8fa0608b8e6dff04e6989e60df0126050753503726d85b96d16d87050cbbd011b2037075f44555731e600abfec822bc282a016079da030bceca71f588e3fabdff7cdb02a0907c3136d8a79823d70a297d9752228e51a6de729123425cf746774cb4684484f0ea21033b4c596cc855d57d655abcfef8c1d9f9588f23cd48c7c0829f0dbb6bdddde3af6f3c8eacb425f27c1b1be4cd1ebff49e91007ffa41813eb327ad9456d980af72a4f5b2f2de7c79268f83b49dc6a478dc707e6b4570c075e862bec4fbd99a7626904a46e9556ccde41fe9d9721069bd21311504617b2d31b14fe7a521b961846923c2807900f2fa93c2a60ff6c41375836beac4ed6a56aac91a96e4a3c929237016636371b1862b41e220993aa1c047423f049ad73ce0dcc581101bddf9344367091270846475579174e9120020934b016b99eed7b690bb313e6676140204711476f178d57d6ea8b428f80940e610e6a9252a48f45ba1310318ce4007feab53af2489aae76bc5f027d3e53d19d95a344726e5f82a6db3f3a9b1584ccded45b36d41aad9e1b4dd57e504b11c1b55c7077a715e9a9b0b8eb321c709227da898bd7d8b207cf012fd20e7dfe452a581536e1bddd3fd21719b1aaca3ac5acdd55902d79244205517eab0e7043954993ac3164161e7e9348193724d5b9ff0f9f136bc15b80113e52aea20af1fccbbe310e9b64d207927c14e24e80a19de8abd51bb05ac64163f922b1e760667dd424e75f43c37ffb715f3fed33d771bee00ae99ac7baf7e18a281197cda00d0ab04fb91458da47b11c1e5f2a9b95341f25bfedd8fa5d838443920052ef7ef92e2fdfdb0c41d7b3d65984c25731cdc2dbfc825c882a1208b65bc54d0ae2413c3626cc294b0589b38a559ec269e9226bed24cb4924d30a583c940b3e16c34d69154e65010bd42b0bab5ee9a9bcc812f9e9470f43f260cfe73a5e59d1a5a5cad95dfac83d57abb0cb55228e1e029297659e7f5ff24bdecd812fe89402854c05caa2912da0d9204ce6f0b3133ad5eb82777576e904a41d42e0dd2ef344562239cf8e1b6f36a3ea4c6df0fdf85c979543bd5a2bfc9192e1c7a32d0e64e956dc4402d7f2ef2edfcd170bc2b54fd004aa75ab774b52653b10b946a7b5bdd006ff395d07d78cb5eb41c29e158302bd81c0a9e79119010cde9d7837745f6aff9a150dc5ccc3422897398d0d31588a255a1327e655aebebbf44c452444e89ff9e648834c36f75ad486d4068efbe0241ca7d1eb8a91a6ce89f40cee7209db3d4f792fd089b9706e751012fdeaadb22a41bc99a440028af10f7e7a44be8d41e38d610186c4a8ddee8f70cc51062ec7c7d37183336b0ed86f02d67dfc8d392b01a652bd8fc60174fb064d5e592d01009a1217d80311c5028a7a7efb474ef2afdf499239373e2ad85827634d822c3135cb9a2223f244633f4c7a9797e9bfd75f07c64c076b67ab59b3c6ff1ee601b4d3fa7bb4129f9ff1108712afc1356e403a55b0aa56e0c3c63c3346c37ac67526c69b5a10ac6e782268bd52ab7798f24d94a1e4b2648ab7d00a7ceba0dd583987b8ed52f2c3ec4dbfd225af61231b309952cefbe16eb9bb1f5fa7ce969d1c3722cd0acad2a1e286e718cd3079bf846f921eea471152a31abb08a184ae5e18b4528e77bb6980bfee32d28dc35434601ebc1b610536e8f76117200cae327ccf177948f985d3e2711840676207433128522102e98e7f9a9bc1776f0d4a5dc973cb900e090baf1219a7646ec0dd37ef2e4766b7245d4a10156e62b04dbe97e309e1c0ea813049d359924e2bc2af7bcb7fad96cd79faa33c0d1990ad4fcdb67d3188e86ea32cb475eae66b3c710744d1e516b88e11540ac8ab30169457753e4d6161adee6029f65567bc90e2ebccebd3724da36e8c4c5f4111660d2ebb103586953d78d8a21be466f7fcdf46ff3e0b2e5bddfc34bb78f3ca5a7942bf792107161eb2470c0f614047c518449816e277df33445b0b397ec6ae07ac10413fad6f9f3c1ab6be1e5439f611e532f8bf6328649a268e950b36898596d93f770a13fa65f84514539a75a970c4267f5c7518ac57a9537cf203da00dcb25d4d10bb335ea3890b1973a69bfa9ab28b5a43b300c603ee96824dd1068103a168ad1ef8dc44de5cc85ae8907b6c0a96f02edfec5b9ad4f03ad6cd58b2fe4571c454766745e72c9e1359be86e596403bd63e38863886e03c750c31f4398ae3a85930df9f2ee82e64bf024bbe842adab8387fccf9bd4be1de680f18096c69703de1b5f4b0eea54bef90fa128017534eafef89481317920df58e281fc4101f140bebceba17187a14c2bc1175c200af2418c1e05f9c2fe28c80f182f7237eac51d4823e9ad06b299413e0dc820dfcc510fe1df2680cd243c6462da1a782768cd7cd541d545b9340b69a6cf86a97a7d8288673d6b6248b6a485702c3dd01a35099723b4cdd8588887a3395f183de3cb2ea4d658cf9c3501d6faf8142b885bcb098390f610b3dfc7194b9facd97400b06b78c347d8f80ec256ca28a19a1986bcb94916e2117894c077adfb242267bc7b412101dfb4ae945cc8a0566adf5ff4319f15bd4508c9bb16c79c9e1f94defafa158bd2f855010b6cb7c3084a4babfd51d0078096f06018e7a8e8e03778a70380c99a0a1903b65d1bdfb03f987ba659810863b1d0945c5903ceff4ba11b5277bb3995dde8c8040e9951fb199c815c749ecba769df5b48a836443a5a6ad63cd1e95ac0241144385c421590945a6c14210ece5103b2349deb1ab56efa4b883a40546a0624a1580d2adf873f0bf7cc095598da0f55716e8e2fdf5fa5fa34ec6bf63e25b0afd9760d93ba6caeedc09c5c1957b2605fc3d3c9ea0737ded770b9197ac43483c21fa880040fd2bcafb9da81119dd3140bcd32b7a426e96b2ea7a451f09f1f9a6c70f754cb673aaae81d76704be625ea46bcaf219587f0be666f528ff7355b6e6e08a8c07262a63251c1121ce0760206b8bcaf895780a2fb8e93f5e6fd1a25c3a1c0a23dbd9fe84db132d991bec638dcc1fb1abd2fec0ee6afe801d80add7c600349fed88ee8283347e3d1586688ba0c2a74c65bd7ce429edb313f0f4029d56be052a992cb19a4785f73f573fbff19e12ca293b0a9990ae81f1cb16e0428a1e120a98070c492d5cc77bfa8521d6121c288f5e90a1e16e035e99732a87d5eb9fa936270691f458f13800e739226007a052539a0f2b015747dfbcd319a0d7dfaa4630551e153a09f5fd23f2a75a32c73e65fddd784be80dac2af02ee1c8f49fd26865fdf0c0c7cf9504d79ab52ab205a7efaeb91ffccd2d31854edc0753b360f3962a51f98f38e68d98881bbca7e935f0450b28f2496de588851c5631b826a1054d312802ec5caaf1c6176343c9127f9029dde67a9bf89269a6786b58f7c408dcfeeddee7bdbf8a08005c353f980b452b117ad627fa9aab25607660e304b676f1c975d63789857194bf2d49b60d4a598ff77140f23001da7fcf84ef451d1093f549a9d0a53dfb868d253af16d730334f34ed08fde5e14b83328974f221e27a4d176a1572c96842e833a7e931d3c8e61d2f1494a6e6683c0e1f1b8c40530923da24c7ba33c731a7e033cefecb3f921bccdac1359d07a69898c09313541e748ac236b75c398199ec484b6c316d8ec4a73a38606031a964fbf27c32c201c0b4f8e052a642c306cc184d2a8fe00634daf9290ab08eec6d2e10da696a5fdc1246109e8f0bbf2bd87533286c6676b8f4c154b8443e6a9082ecaa2aac6df78c308436bed7a33b06c967646616a3d2f6a16d1d4970ed92149f711d1fb7383ab1294f650903b9f5f459e7bea9769120ef1e91fd8f4d31f3f77ed0506ab67d44986e5f0dc621e1e883f1bd1391309a8e3275da33185f7737fbde361d1a61dd04c9896b361dc295d94fec348461da7109c8d4453dd02b7df558811a0dc796fbec129d35ad7c1009f570f13cd3134d082170f8611c44ce510225e16a3ed7235d48d0f3654b91d7995d143437ace8521873af573e604cae31eb43241b87bd520a7b251c92829d46d8682c367a2a0961c47e4e719b7e3d50ce46db08849ec711a208c324099e7353050ad54be9e0ac78cb2fe0d9ee0e98cf5970975101cf13984c15ab37decb55cbd349a802c3f2b295fc199cb28e6f16c4a268e71e2f3d6cca0779643f8ebc65308d1800c8a4baa35b9a1eddf455dd630ff64afa229cba83d091a1eba3b62c0dd0b52e0dd09416d70755e78b863897f1b28aea356d403ab9768b759aeb7814c3e9d17ab01be2f7976f04a3a2d87fc24b925b901b093936379da51a2846037a6e5b6fd164ed7111fda5b82960348692d856fe84091e97a8c52aa11244946b81943601f5f20048001a3c8da82c623166a9d1fc5ee56683e1f525601bb00ba2206c04a3030da206e3f59fa0058fa8d37a54a3803554f1ccc650dccc7e0501d72d107ade7f83c636a75bb8f7a7fb1a9d35bd05e276401e90a516dbfede62caac9f74c2542481ea69cbbdf1608051f657ecf312bffa16c0c0f59d49fa4633a2889dfb2169fefa574e3444ac2692c5588324683548be2eeaa37d72553ff1c6c962b34d4b470c7e08652288c6e25bf93e62149714846d690941419ad236722d91304f3bbba407ee2458bd8e032dccd652a752da33f0cd57650cb3f89d267fec639882098c9ec470309406332f360ccc220329510e7a30df3ad52e5d156b86e2f65ba1f371654d6235bfad6ffae1ca01361c119fceb75ead402548cd45934812c6c7ce81b37f12337cd4284ebe92878df96269e6a371780bfc33b196fa4c353579e8e82573c8d3f907639593cfbc0c321e5ac40c57a9447d0a5bf851663fb3b38f8bf23704fd3499ce41610c7d6957071f223d0d5b34b5726f106df340085dc2fd0b1d499318451fedbd4636cdb721275c7a9e26db6e3342f91b6ab28186040317f835782b035cead3c3afade2a6b0a9a7ade9a9760be0001a66b45d2c412aec768f84d37b2013000534ca0dfee1f4905513a9da2b395c9a22da85d68b05de232a60ead50b9ef621713783b15ea983a11ee22ea527ccc3e633e5ace831c7f480cdf5a49cf7d5c99fa94ac1a8833ed8cd07ea80a2b720aeb10b22c939a09eca1f1ea8ffb66c8bb196d58c734ec3ff5491e9ec29a2b10a1cd62da432f2e6799b3632e299ae7e5a29dedceaf291dc7dd50b7db755035232f4c740d9dfda0232133f18ec2107d28685d147d03eb4137f0dc7ec2e4006047bce9224c329f9b3d14b3cab8eae890f2df3e87a99d0702012106914303473f08f20ff3f862ade431f69059dc1d5398503071578cf67fc393e1a194cbe9d72d03de98144af32959e52ea2f34104295cd4d729c3ed5b088981e470d3383891e4fbccde1f0684bf75e7ea580ec01f74320f5300f7052814b7bbedcaa45193b9890a82503a78be82303b989d090511df17056d9106d3d9d097c2121ca4e4a3270939f88bc6b2f99f6c48d1e4631d04a54e19bd6019fb773244022448eb9c6dcc78017e1f7067230e82f87d59c26e298ea33fb92813dd9701b850eb15838ba9113f752a1c4d19b2bc8f4d460f5cddcbf8f0de2fbb84219ad18dfbd9a97353c28ca9ea8872f0d97939cee51dd562e08af191b73ff720bf969b33c25d5c03209beb8aff3a4556a3168d43dcf9234b423d24903a53a2bc2d5741d4fba084456986144a139454ee6dd252693fa080c6e8a636106e90ae75d5c81b0d89c3783359f9c7d6935a77089d2e6682199c4fcd69ba2a842173227d0c364cdca4525dee08f54e676eedd001ba160dac346f311d08d46e64295e8ec2ab4e1e19eb32517be777c46f5f9c0f80a4776fc03d22fe09527fd755603a317696bd087eb9861ccd46cf855172ff01ef66904025179cbab383e9636356441809ad9b8910a010382714a296669ec1834964282a170c00245e0ccc950519f7a5817e35b8e823c2a3b3c085a541c11db1efc4cdb1a87be4e3276eb954be534eed0513b18637a8dcac358091b44982a867d17621ee0de904707ca462050b167aa35318f16ec8aef1ecf55b1f7dd0482956be7ff5d83f3d2d1706989857851a64840801be81358a5d5bcf0750423188ef0eaf6851a379a7fc725bcec408e702541dd1bf8df6aaddee784cde5a4b2e50c528dfef48e832984ed2ded88ff8a0f47dacfddbcaa3981c976a2082d673c1e24cfb11d170dfa37e8972ccbb2e51c6f57d34e9f79ac841fe7be11fcd2e974849c11ba28f0704ca8350217bd654ed70162c7dbf6246f1f4929d306c3a8812d1e8af30001299d7e7a03cf860a018bca5bb048e2acecb21c93536ab383b4033d45912a88dd78da2e85b5615969e388e1f007233fc058532f6ac396983b439b3cebc788d08da53dfa9babd8dae6294166b54bb21a7620aa3b457cf5dea2f56ef217afd0f32fb8aedd2903268c4370ecd23ada131439d0b7271c2385ac7f10864e440956b8cb6de00bee6150fb16d2495abaa61aafab3e215c9b6055d424663d018a11a870691ec5f352305b832ef8018fd89c19bb75b386eed17d00ed0f4c0d845a36995a0876d4645422121506a5ba9513f7ba86c6e6ec5ccd0eb59133959bde1c8a963b27122780d9650775614b5a683959d332d67340472d2deabce459170c96accca27d133c6032e6a8f83ebe320119d77a31db32be0ba2793d01a5af67a6964086e729949587e506823c0c5a8cf29754b638fa921f80c0f11f07fe47e932892933e9305508be839bb1617337d1146c0acaa2e0045629afa2f41c6171fd505dd955317ef94a0cfbcf61ad00ccddbedf40f5fcb22226db737455f951f352ba49d950020368813327d6f0c7c0116f02c475cf29fe747c2ce223ca013ef06bcb8e0446cc0eac3c7d0ea6d065c2f77486968f56cf7b778d5216b430ac8d07454a82ca163256bb22ed0a4ff9d07af22eeb5a50968690c7a1652453a734b489e940763f256a42828dff22fdc1e7142df0933a1510d4a793bc69ed1b860fa9b2dee984823a2986dd872eda8cf9b2e9d91cfa5df73ae29947da43ee0fa1a0f890c4c49148c9d780a0b2bffd1dd8569c230716ebad859ca4c081502df6cd8770c10a5c759d6fad879941eada6d2a476f83158bb8ef22a5440ab6664929b9b35f1f8e45e82e4b73e3b2e7f7fb90864c7091fcc749bbb1c240349d1a084d70dd148b3503a40ba7812b1f3481bfe7f03c39fc4781c918d96fd25de21b95f84e0e070540f845d9410f9fd2441177e3639125ec1bffe226e4866895bf2a8d2e6d7d8dddadf5e849758f35588acc36d78e51e2f3e5e63760b439b35bc5b69095647c71dca72eab700b7a430ca2009f31d0b7f4bc04e165529fb9c5351adafd9e19f417aab82ab31a33615aaef5e0192005c65fb4d7a8c31d4d4510ac6da922b394697c5da025ef4cd2a3d312904ef87f63fba6d192f29888425a3d7e0789e3eb1eb8a5a79dcffdc177c3d351c37310cf41186bc2fee49e9f2b34651264a3a78eaa50c66b320f8ffcc644b51bcb00da4b895239697929cb6f954e785265ab0b66e2d7dd28c29486227891a710ea475c893dffe0cebcdb088fddc6433e95d94ae0f22b99cd0d3350f341d580cd2d6f60f6370af8baec4d6c2c3134698e06ea06610a3cacb32ff57c4cb55e964b01ebb4f5b2093f1996aac84f645a3af2c0fa59fd9444b77d599d97ee32e387c802dc53279516e5c557658615fa2f9e18075c1de7577376c818425571c101c3cdbd3ee198da84e5ec183a0792c5d640e8d0fa62692d6260316263b05fac660d0a02ebd604b7de9a60d65d12dcfa652218fbf603d47df071eec284e00c5ca696683c566a7e4e0d8f07cd6f879a36be73c73e36f777b9612b4ee4d0aa53b4b90cef05727f29402c2c42ba56cae2aa7a00a81a24d816a9af0f4b03b99571fedf9f93eb578834fe48bd378a3d123a8c2861249cb0ee757ef381abf645fa5467044dd1b30f3f0b92d95d54627615df80175b3c82a80f487616e20529943ea0907d021b0505a6c837a10f99f283f5ac133c4b6f0f40610802a216924bc36f767fd34279ae28a71bd9cd4f67ab6f44ca18459e6d3b422ffb995d75e515be19a766c9f4c8707b4211ca1501bc958d0255de82b9a5a4544727f30509bd22ce70f3578e0c1292fe8fec8894934c17bb9dc5d15f77a28d175fa7bd0d4b342c2f0ab4c98be30d4dd5708a154ca047457d15c4d48c7fd2ee103b86b1df2264c341a48681aa330ffaf4f5cff6407f32cb1f0355af1aecb3017f1004848bf2df4724bde916b462ebe2cb85014fdb2623fad747ca8d98d7784b8f6779e1424907cd1eff607e71d23b6d15f382634c66869581543c02d85a051fe1af9092e767e7e0a64590abe20cf408aae3c0886c471623f875dce8f0ac464887559512c33a875252a7fef85e19b1fb9dfd47121de033886806179066debfa323373c7fef87a2e546e00757ce0a63fe4dd2fa5822c7523e49e61113d4d4adeb05b507171a1924d19d6c5d65a69c6541bdcac7a0f31448dffc03894ffc9399ccc3a1a15785bd1070a31b6ed0fb554eaa0f2cb19fc4295c8304ee54842a0e571040ea6ad201444ee2f0c8a2d8df610d4033f0294203f706008141a70e761a89f2f4031bd8d802b94ca249f5cdff6bee28a6ea3fcbdaa9ae054e6f90a013d9cf680299b24041d68beaa5caf57f3e5a5bb3841042b69432440eff0d870d457caf7c99be447c87f80af1b5f20de20bc4b7ca77e9fbc3d7872f95ef946f0f5f1ebe52be4adf1dbe3a7ca37ca17c73f8e2f07df24dfadef0b5e1ebe49bfbd6f0a5e1fbc96519e97bf4fdac628b66f87e8ed92226dff7eb4808ce84e678cd1be933d01cbf71bec18f688e6d70567346a2396ee3ecc6b909cd311be7aa330d34c76b9c6b70ae81e6588d739a738ee6188d731a672734c7679ca9ce36d01c977136e37c03cd310dce68ce4934c7639cc9383fa13916e3bc3be340731cc67906e71c688e65703e738642730cc63906e72834c75f9ca7ce3ad01c7b7186c179079ae3179ccd9c95688ecb9c5d70964273dcc559eacc03cd3117e7169c7ba03966c199cc790acdf198f316672a34c75a9ca3ce3ed01c67715ec1f9079ae32bce589c97688eab385b71ae42732ce60c750682e638cc5905e720688e53700673b64273ece5fce52c04cd311567dd79089ae329ce28381341737c82b31467269ae328ce26385fa1392ec1f9e95c04cdf19573116723688e8938339d8fa03916e23cc419099ae320ce56ce49d01c57390371c64273fcc379e99c85e698cad987b3169ae31ece53ce24a0399672e6e1ac04cdf10e67a5f3169ae328671dce4d34c7399ca19c97a0397e72c6e1cc04cdf10de7a4b313cdb193b30d672e34c7359c73e726688e9b9c69383b41734767a473179a63f21964f8be928821d0dd2111bc08dd1d02c16f747728860f9c88ee0ec1e081175c68e141e8ee500738b00116ee83ee0ead701034a0420630f019dd1dba8005ee01dd1daac03ba0bb431498c077d0dda114ce01dd1d92400420f0d3dda1075c07dd1d7240031e447787187020ba3b84c202962840c95002de4377874eb809434910708021030c15a004020c00c95b747788848f70440401e086ea1be93baff96e009edf00d584671b846e88e736c4aad5998d15d780755e83c53aa7699dd568711aae331a2ed799ea753ee3f53a9b61732ec3c6e68ce6e64c839b9b3319e3798c713cef70ce62e0e09c6790730e2327e77c46e72c031d9d730c76ce60ecec9ca778ce5ff0f09c61d073f6a287cdf89c5fe0e3737601ec5c06063b4bfd9cbbf8f939b700c7990b1c38ce64626716c462e72d80ce638080ce5141672d8282ce2bc871ce22478e33163ace57e8d071b6e2e72afe33143d8ba1f4ac02f21c8624cf603838a780030ece5f769cbdecd871d6099da910123aa3a083f3141d747096c283f3093cf0e06c02d9390a99ecfc343b9760363b17c1e37c85078f33d30767223ef8e03c448fb3103d7a9cad0c9d83181a3a0301c2b90a08209c977c9c7ff0e1e3ec03ed4c85463b4ff971eee1c78f330f40ce528000392b0539ef1024c8590721e72842849ca10c39e73064c81987daf949ad764eb29d6fb0d9ce36109d9d10119d7344ce35102172a681ee0eb99d9bdc6e67a4223f2a52e433d0dd21219c09056b085e0d614c1562781615dfba0d75fd86be3e529be3d09be7d0f13a14e73b34e73c54e73d74e73e94e730daf31fea731c14f618fd3910c5f1201a7b0e0a741d34e8a7398ea3465e69004ea98e93f4e780d2efa0e4852807ef80eeb80754e832dac167d483f3a0b27f4067ef41797c887e7010688ffba043a75110fe83fa38104a7b10fae34228900fa1415ea3426ea3434e446b27426dbf51a217a1441e02bd5d00b45e048afb112a808f40453809f4c891d0113e004ac2094091bc043a80178012e006a025fc00b400470035c093d003dc048a809f40933c01d4842ba1275c0134015f42957c01540147812e3903e802de008ac21d4019f007d0061c02d4018f007dc0254021f01468043e012a815380a6f00ad009dc029402bf00adc031402df00cd00b5c058a816b8066e02555e12b500d9c055a7e0374857380b2f00ed00dbc05ca81bb403bf017680bf70075e130d017fe01ea81c740613808e8072e021ac38be8b8437d005018143da4cf4ff410115019eed119b543524fd0c501806e2da25c8dbae06248f7907e08b45c15a1254e0848d615a30c375afe10a12525a2e5cc46cb1f355a121942cbf52284965b45105aee1820b4dc32b514cb058346cb1dc3072d170d1068b96d0cd1929bf4a0253ff980962c85072db9ca8c967c45464bd6e2012d994b07b4e4288468c95e6a297215b514794c2d452e534bb164304e4b1e43072d198d1cb4e4368268d94d8068d94f62b46c293868d9557e68d95760b46c2d3eb46c2e3d657ba9a55876153ab4ec31656a29960d462dc5b2d1a8a558761bb514cbd9a49662399fd4522ca7943aabd4522ce795726ae112452dc5e9650190f49b278af80900bc3fee2d8457979737385bc45d789c78e9534bb1889d086ae2a50eba45dc841097971eccb688b90c39bdf4f1638bd86908132f6d44b6889900c0122f0350b7889708d3f472c5d4522ce2a62cb6bc5c2d4cd822dec285122fb70b066c112be105095eee1713d8222641185a5eae181ad822d6524696977b462dc522ceb2069697cb4608b688b1bc91c4cb5dd3648b38092748bce41b9e6c112311e58897bc83942de223a818f1927fa8b2456c841045bc6422ae6c111781c495978c45cb16f19526a697cc04972d62a6278878c92588628b9888298678c95478d9221e228c102f594c155bc4426461e5256b31668bd80a1741bce42eca6c1107e105102ff90b30b6888108a3ca4b16638c2de22a652cbde433d0d8225e5ae38797cc06b7b145fcc31b3ebce4354db6887d7042e565dff0648b984a94292f7b07295bc453a8f4f0b27fa8b245dc83103cbc6c228a980724a4bc6c2c5ab688a53429bd6c26b86c112b3db1c3cb2e41145bc43b4ca1c3cba6c2cb16b10e61a2bc6c31556c1147c902cacbd662cc1631142e7278d95d94d922cec10b1c5ef617606c11e310c693972dc6185bc44fca487ad9671471d21a37bc6c36ba8d2de21bdeb0e165af69b2456c8313272fe70d4fb6889d44c9bd9c3b48d922ce51a9e1e5fca1ca16710d42d0f0721271658b9806249abc9c58b46c11376962a49793092e5bc4484f1cbd9c2588628b8ea698e1e5a4c2cb16cd1086c9cb29a68a2d629285d1cba9c5982d327a73318297b38b325b3482173908c872bc3d06b28411f907c8f24487812c65b67b802c69b5bf40964443ee0259ae4ec85b20cb850af20e90e546013907c872a57e7c0364b953b4b34096bbf3f115c872a9407849965b35740d902523f5b80a64c9491f3c0364c94a3c8e01b2e4a5d92f4096cc24bb05c892b378f00a90253b75700a90253f097d0264c9ba1d4f812c198a834b802c398a7c04c892a5e82140963cf53f802c79a7e30e204ba6caf106902557059d0164d9484047812c3b29f60590652be1f812b2eca59f2b802c9b09762564d9597c9e00b26ca79e9f4096fdc47313c8b2753b4f42960da57304906547e5fc0064d9520620cb9e1a5f00b2ecddcd4b20cba622005976552dc50190e544aaa588842c67522d4512c8722a8d409673a996e2915214812c054096d309578a952ca7ce08594ea80090e58caa5c8b48008450e44684ee0e11d9e8ee506d88902040e8eed00fba3b44a3bb433e280848953fd4e3031eb32c952ff3e0a9f23bd055bed08ea8cae740aaf2497aaacad7912328a9f281942a3f86e307e6f354f93dbacae781aafc9da8cad7c9c1d955fe4855f9375d55f9362f576ba9f2594c95bf129de653655d657ee2e6b5eae2c383e3848ea09f263c10a25c7c0ccd9c6c437e301100001059424c182f4d5a6451c5962eb818a3c4175e942181186180a1e58c32c6c8c2c61a6860d935fbc6b691c40d4e9a20b143942747fc40458a11440851a5082c485cb9c2449316a6123cc185082aa68862083161bc08a145165558e9828b31417ce1451920c408038c2a679431c6121b6ba0f103afe137b80d1f6e70d284ca0e519e4cf9818a941e8810a20a0f5890b8228589262d4a257882cb0e544c11850e62c27889a245165540e9828b31397ce145191cc408038c2767943146121b6ba07143afe937ba0d1b6e70d2c4c90e519ee47ea022a5062284a842031624ae3461a2494b099e38a2628a282a7f063161bc543e132db2a8a2f28dbae0624ce58fe08b20e5f4624839cbd4291b8e42d0473b66d88fb86a27f8cbcca5d500a8ad656666b652bb6b734e4de6335abba30475b5b3d43035d852374c1a3375a7ea8659e38aea29ed8dc1d8213e4fe5b4313e4d5bbf218512d28d0ab6b0420909d73a24249cf89db63986cc1660702c1d9e70c4f9bcef2bcd1b6c6081846b2a2424dc246fce4761320eb214ff43c2c812e643f690a5ec63aafc1db2a4f197a5b212140e597e4923597e4a959bd0e16ec8f29bda55ce89fae10c128eef2d4df0a96b4cd3b6381bb25ca817592ab9c8f2736a91e5079504327d542cb2fca42a7f5122597ebaa5a7ca1f5265afaab29412597a53200e065bd05a3104a737655ccb9d1a72c19540350cc38b2118144cd5f04c0d411136069432a09075bd9461a5def40cedda59df44238d74b882915fcee07dced0a56dcaa3ea3403528541ecdd090dc445783a1963a9ae9730b0a83dea7ad9a1a9e2b4fdec6c5ef659655deb3ac796f5e8dace105cab188c403d9b7fc172a8183d10377766ea7a09c34c0552d78b1867aa6cb6b7ee061ccbf7ddd947b6dad52d6b594e0de3eb8659419aa8a982d6ee083faf57202806525d2f3358aa1fd4f512069a2a760d0beb737aafcff5896751fc8ebcdffa58e2f708002b28f6effdfbcaf57dc5df57c11004c1af7ab939d39ac9b4a2a2c42adc93c53e3c28d8b55aedccc3a95e072a7f7e45d70381f845f5d821eea8a5ac02892e18ec9f4d7c603826812b9e42356d30182bb12c9cdee776ed2343f19b3bd1b5f2668f2523106c7566aa944ded107f99b6d5e81d792d9719d90ea191c9643debf770b1c4a6a262e4af5a62d8023fafd56af1b071cd8ec289416ba7cd6b91650b9f78ef4e4270d7c92e59b61092bbb39561fc77271ef9817c27dec33bf93e64486954cbfd06d91fe511b9fb638ffb4ae05a8258dbe8bb3867fc914d7d8fdcd91b839b39d5b53d777777ef76a9cb74b1a86da4cd58915925f1b442628565c5c5aa8b5517ab2871b52a2335963bab2e562d5821b16ac1aa051b5f29031212528501e67a5512bceabdfcc8b2ebd6f01f02407205efd31369692401c97a6831ae9734b2d41296c6522d451890ac472c09eb5b953412eef571da5a2ed65d346703118ef52411f77a91aeb368eb46a6abb610a4eeab8415a32e8925e6dd6875b810b01e8256cdf366ffde9737b66492d63df284c57947627f66b43c1c1ebc82025b118b71bda051e5058d2aa24155fb2e34a6d41206d4481e9dffe800bc4fd657a2f87d8db06f91ac1b9932d46f258ae20a31ccbad7a9fb2ac183ba249610d43c6ff65cb3c6f3bc5db306c7f23c0f0bebfb5a1200dc546aedbfdd6dcd9d936b9e377bae5953a45fe0ba6bd6d4eddd86a14b08405d722ed1da1d2ed64132a604045f2d2546ab873fc21de18e70ebb5e74d6f8a710a2a2ace98a24207af8c1ad0ac90d0a0d1a1d9a971d19509c69efd7993e5e4650da89d87b4c6ce73aa419287eb7fde9c426226090c22c045b83e808bcc6341a67937d3e4c878515e72583079c99131a3bc38c99131c2aa8ce57891ca6ec218cb7f545442784c5ed248a1c51421d5144e5358a06b290ce9a66cd8222a77064cb872f274669c9cc01973064737c6cc541ae3860b698b1eb4b0c0a001868329306a38313dbd94c0a8e1821f72a6743674a1baa1044ebcec20eab050d3544b534ca01314af296e90a698483a1ba8a250e25b20a420259a32963415bae6553e0b519519a6632f6740e57a6ab9543338c38d5ab2156f365f84ae8dd548a7003a89475fe720e3a529647d9b9677f63d6c912b9c0e7cb31508c4902af15824ef906f045ef56226b8de3a0aaed651d80341195dd82af1bbab47b8235cbf45969c637d9cb3d677ce5640398c2e6c555ddc37c2519d37325b7471ac9ea1ce7bb4f44a08c29a9fd57b48b9e99b737a2f1b918ca1e7fc5440446ba7ad69f5aac41bf22961242424249277e6792dae6893f7791e7f9ee7a190d4e402515d018659c3cbead100c49325e756b7a1c905a20ac3fc314557835febd4efadd0c52f04ccfa6a8aa1c339a7f8d984640c5d3ff01e10ab823696ead76287a57750247765a5870023ef1b0093ef55c23755d046529d241c55efe2cb005d67f896188a3fc8f528e4990315ad90bf01784848bcb26f043134d8b35ff35e187e1b8c37c9f2dbb9038371eb71c297234823e18b197e1d01578db96976fb6b827718c4da2db4ccdb5d6fff7920f8811ff881dfb7f776c5edbaf7da585a892bf14964edec63c5208aab95b8c44a5c893788a1189ae0c4f33caf82a128d65a21fdeaac226d56cde1c018d2ae9e8713698f9eb5ec03e7d7bc9f8dc7ec8171674c8138673458892b11058d438566f4ea7a29430665a08029c30b199451f61dae31b53cadcdb4429b2f18c753f834674de3e2d8b91e7f7e21f97945b07ad63004c1e9bd59a9c330a977c8fb98702cd50e95d61686496152984446a0cedf2319f4e65cfa8a5a41eb53739b1eba3d4fdca1bd0e7187dd29848b042f35c650cd6b06a398a6f534b2c83033b6be401ad1987a418d393f54f12ae322a38c30621033cf04328f0503fab9f1d945070e3926f7f6f424836794d20ac36233467ecf399b25c5c8ef3977ce5d01d16a2af2bdde39d362e47be7a5aec120d6498a372818b7ae949177a5571704cb4001538930cf3535831cc65851066e9f0335b61095015754d9e2090e55aeb8822be7d4919637a8a001145344210316e0b8ad54fe54b3378f03b2bac2eaabf314ab43727ec582ac7a73d732724ed17966379673aa95909090a4e0f8ae325b9b514461a6f65d527b9bd5be0b8bb64ddd9cf15dba699b512ea8da3b7c68628922a42859e105d741d4be4b69da8e505046171ec030b146066fe0faaea5ae3510d3c66e3431c68a0f3090e209aeefcad2b5aee2d4c5f5d4b5be4b8aae896d6c6d5eb9a2a646b537336d9b597ad6676abf55656b138895f181b052fbacaa699b5373c69f42aa4cd3660216bb25a28401d3450b70ed346d47438c49f3060c5ef0459a3670fd43edb774d356012d2c285366091e6e2802d76f4175ad7db0853828ada5bdd15ab2a4a87d56145b9b4d5666a56d33a967fc661d51fbac345d13a9d2d43e6bd7b5a652fbaca969435285861a24a145145cc4c0f594da47507c81822d6a306306543081eb1e6a9fa59b361b31463829d3458b32669ef6f6da676d6175e9daa24953b5b71cb5bf429ab65dc1106340d15d99a2056170fd5552d79a87da5f294d9b9017496b5cc0c31450f880ebaf96bad6526a7fc5346d2b4cb1c4132b766e54c500d75f65e9dacaa96bab2e6d6be1fa2b2c5664a4f6a6a3f657bbaeed4eb931c409be48e2055dc6c0f557555deb1dea05c630c344d20d7a18020aaecf4aea5aeb50fb2c25326a9f3545949ab6deeda676bbda17a1885396f606ab7d9169da768c145b683153c61b64c8c07547a97dd169da8e8048e3b485872f6b6e9002d7179fbad6508e94a092a50836c23c9172025ce750fb6254d744325d5b4d5b47458948e196b0cbd3de7c6a3f84eada6e3f4c132e4d5b3f3185588064a4f6d653fbe0ae6b555d4beadaf6c3295df36a3331813a2610aaf6bf2f4dd7aaf6c6535aa184540c90f8a10b25707d30a96b8d43ed834ad3b62d2841171318f1c40c1528b87e52fb20d3b41d1501444e09242b3e744101ae0f66e95a27d5eeb0f63fa969eba4a4a90f4ad794bea5bded4cdb91095ab00514515c7162290caeff65e95adf50fb9fd3b4ed185ebc6022f7e508354c80eb7f4f5d6b1b6affd34ddb91135ea8218334383031e505b86e27b5ff45f53f325dc3a99a36a6a2fa90bea7bdb5aa8c0c952f298822a64c0ed79d939a9ab60fdc6045182dbc48aa1203d75d43ed7b545d6b16434175a9cd524c5d9b6ada5eb8a2c50654aa9081c6165c7f5675ad69a87d2f49e987daf7a6742da7da986992a9fdf9346dec3491a6edfbe2082a3378410ab61881eb26b53f95a66d45c515663ca15303440ed79f4b5d9b4cd3b66218e14414279400a3050a70fd99a56bbca6f6a753d7bac64ff8899ada6f349d66d67e4f4d7e6781eada469191eab799aebd6a0cd832566abf971a4af394eeaa1a112295d7062e80e20d2cc6606a7206aecf505de31b48edba46d5e734bca56d22ae9beb1203b6b6da2d5795794ad76e6a9f95f88dda600d679c41e50924c69881ebcbd0355673d434c60c338408e38b932dd806b57734201d4183252e55b2e0968c6dfc5198361c66d860268c1359949a70ed466d31ca58010aba68d2430cb6701b55046a08f1044d1562a6aec0d17e18cb19c50fe79831cbdca20517a123732a752d09063af5fb0e59dbc6efb006fa746974a993479d930b1280deebc8c732338e4e585263d9358c653f8d7306a3e791a9de77ba3656ef3b64de6140de370535489d60ccd4a04e227582f182893a8f4c58fdf875c4b389c138ee308e3a8cec65645defbe1a8cece16abb49c4280e31f21823eb04a309a6aa875497832316eb18a2b53bca8fe90dd11ba2e7da20c14c56ba564e66e22c23ebcacd6e079e27085d3653aae8621e567336cf364cdf520a544666b2e5625919e7d7a9ceef6462a5f1565c8cfc7ddff77d53e5e834826cf0d72ff00ef53b6a65c55b43491b0120a7c33579e4ed30deb820e6a549428a291c37592387a79b9172133a2da2706404c1050d43dab022096774a3011a64e06670bd61c318b8ed21e58eb79f4d7954879cc931e15a3762ad612c4537a8e8462ed2ac34965eeb897186e689748547c3cb091c345a8437db3de77ce3c6f3e62c99bf40cca409dadc0611e73ae768bd5c552e5f452f209fbdad727ef3974e0dbc06d7ba386db5149366980dd27fd1e96587f473e8e46283f46fa8a81ba5c82245f76bced166f3b2032175a35e45ad972f77f8ac0e10f6b6fadec716115f2b8ac5e622c572731c3abbd8597fa4538c88b3b1491271379f51d376f3e63538d76d10712fd67bf52262992d6a55d78c9a33293a757306456715eba3dfa2391b8edb0d12922f9a34e25a2d23eda249226e46a353cce6a8ecd3c5da6654af8e562d7e95c3caafca3795792afb540eaaaca3b250650f2a0fa96cab0c80ca01a8cccccccccccccccccccccc2c446566666666666666666666666666666666222a3333333333333333333333333333333333333333cfc033301366c2466cc423e05bd1998b9cffbdddce97ed8dc8f9b4bd11d9ce37b2b7daf948f63644c8f928ec2dc8f929ec0dc8f92aecedc7f92dec8d76be0c7bf3b13710f636743e2bedadc7de3e389f99f6c6e37cceb2b7d9f9ecb437d9f9fcb4370fce67ddde3a389fa1f626743e47ed6dc7f92cb5370ec8333d9fa9f6f6f3b96a6f3ace39ceefa4bd059d81f6163bbf99f686e3fcceb2b71fd8f9fdb4379ff35bb7b79e33cf79676f537bcb39e39cdf545db5b71ba4bd25ed4d696faef3e7d264da1b6b6fabb378fe7cda5b78fed4ed0d3c7f676f6ffc151f87ffc3a7fc19ff079f08bff207c03781cf00fe04f81ae0bbc00f019f9bf0f9099fa5f0b90a9faff0590b9fb9f0390a3e7be173157c1ec3e7327c0683cf63f0190d3eb7c1ef26fc7ec26f29fcaec2ef2bfcd6c26f2efc8e82df5ef85d05bfc7f0bb0cbfc1e0f718fc4683df6df06713fe7cc29f52f8b30a7f5ee14f2dfcc9859999a1a0b9b0f257f9bc4398726dcdfd0d0021142957aaee6ec94f1e940d55b7ec1d4ed254aa4ef3694245bda07879f344e95357475d0fea0ed5b5d50d405d2696895d629bb669b7ec9655629558122c0956cb6ad937ea66592c8b6593d824168945628fd823d68835628bd822f689ba579669999688256287d82156881562adac950d628358201688adb255766997f687fd617d581f96ca52d9294b44dd1eb687e5617958292b6595566977d81d5687d561a36c9485b2503687cd6171d833ea3ed9279bb4497bc3deb036ac0deb649d6c6e735bc3d6b0342c134d7691768ff66867d81996c932d98b7b2bfa42f13dce76f93af16de2cbe5ebf465e2bbc4b7e9bbe5abc4f71ad82226c1f72e6c116bf966f962f926f145e27bc4d7886f256c154a55c4a936df17093835e6fd7557efb8803e75def8c458ae14a7804ccbd6c593051ec9022b881dfebcea71d16a30056379e4fda4e7793934b1961865df398a468c9f1e39bf1b5abba3e562bda4504861da80b23049e19062255e0aa2ac0351d76354e738e8ce613f393ee0e27298b2a0c02d05c25e77b9c8d832699dc59272b1a4a4a4725c2c17f9009694144f8f8bf56a310005299e1e17ebd56abd7a6893ce59cfeddce5bd872e6ebf178ba5e332dab98b873625c939588a2d8415429d675a6bba68af589256ebd5025ddeeb7525adbf74de7a934a788c76ced3ba8bf2fca35fed970b257005fb95e46351146696f13026a179ee7a015c2c149220915a3db7fd8a2589b5eb4a587735a9e47557f851af86e157a2ebac2b719dd5c3fa8b347a3d245f779d490fcb751e92c9cb45c6bc1d1d0a94c29ceda8aa9092949658284839853d4ae984e2788393d331a09fd50151f1311a7e751875dd87b6de436dce435fbd522286e157a4118e51ce45311459ab2f11bf62914cc6875f31b9b92886224f2886e21c00129d501c6f70725c8879802b0f995bb138bd237c73136bf2e68675f39b1ddae4fda33b0f6f8e43c77fdff755c54c10bf7325e2776e2ebe4925e17548a3f1e1e2705eb12437a3982489d737503a23483809870f8ca767ab1829fc0f65f1d098d773b3b32ff00664855f5dcc191f86e14d184e1dd62e6dccb977f0d3c9b5cb5bc1605ca493bcebd0c5f5387ea492f0636824e2d0a6243707e956a09eb01dfa6226841fbf84f59c7fb42b984363bd1b69acc9c54da69188a47da125c9e93ce7fd8a99307e7525e357463a1f0f924a702e924639c7192f529c87543c8baec4875f223e5c9d890eb933e62d599d4532c98979b3e28c34e691b9d5c3505cb15aae97cdce91d7af13cc834c858021656519439af82310bc481ad91c341a1f863f0243da8a68dac2af4826390f2f924c9a94e43c64121e04190a26d2833028184325c1114106c236912c0048ee9769c339110a14282449684b3425281f2818140f540f940ed40e14f81f7a73185ddd878aefa1adf350d677e8eb3ad485832e8ea6b4441393442428249c9bcdb119c00e9d806487e671682eb73af89cf89b873f61712119eb1cf0e195800f5707dfa4929b9b05a34c9d5542b84827d5694278f04ac283a451d377a3915402ee2b49ee7557ebacd5c5f0e0bd50dc5155212521f1449ea3d9afdd172a505c96b83cb13c96472d30c56297efa528459d17a5e85a295e869fa7c0ba117619ada5c34159ffa13ccfa1b0f7509fbf765ae35db1ced9494107b54b612783f8e4243a7dd395028f0aacebbca573263d3be938e70e4d3267f33daf35c6950ecba300db7448231619556984a04a1c4718ec97c96834a2174017c283e43fa2696b1249174e585c2e073beb399ff33c2475def49149723e9f64da763e63bd22597f5d09ebaf8b3c3b748718b9c9da7665e85a4f9652e7933a7526112bcb38eb9405f6d69fbfc0da42b04dea7c39a70c3b34cf508cacf3bce73b0f6349747ec2e27448a326253ed7d1218d74eef37dc592bc48a3269154c273d78d6024eb5b8d7c481e91ba96b476ae7326de75ce4332d921c99847e2b4be3896c7487396a4b4c494c56971235d9cec5b759ca3b0714ed0fcd6715e42f22fc980786975a7abeba0ace7a03e3a8fe5fc87eefc74712d24737eee788949a226695cc468f39bb38618b5ac0db6b6310ae652274371d4098c7bbd85c49564f5d697b0ee2299b8ce7a8b64d2a4c47516195b268b1327b9af243f37d2ac559f006c63916c65b5850b2657d9a11d9aa3f8d778b33b5a2b14613f642eb7bacf73acf71cb62a47b6021e4617079bdc6a892e72b5f22177ce56504a583d248b3cc2f1d01d2ac39ccdebd01ba8a5260f70056973acdefc142394ae752b0992695b7d1e85696bfdf57919a6ede673aa5c2a24d3b6b828a929f284c531d39cb1d3645d9d0c55272f2541c24b60e7e866cf99e3334ac7049a4113c78c4dd85c9d0e2a3e075d3d88f61c88f21c87ebb1d76134e6fddc5c075ddc9c73ce9e73ced9fae2a678d697ac5667adc8d832615d9cde9c17a737276c257a2b5204714e8fc79c738e3e2bb1c5dad1f9961bc56addfb07fac0c85c4e7ccf73abf3bcc52e1fbab8168b05b6c4f0463d4a56463ca4471ee19a928cdfa1314f67f51c1af370686c24733956cb9be2fc8ae59a36f33714697a73c28ebe760dd1e2cf8a1124d31604e3a41c2fc7d84b58f99c97321c275a5d0e0a7b50eb31ea3a0eaaf31c8af391f2fc86ee7c5f202e882e0e882e2e461787832e2e872eae059b36cffb098bfb4822266934d8b4c5f63d87dde74b7ede4332e9f9cf7d48264d4a7afef373263e8791b1fde2605fdc0fcceb57929bb3ede7fbd2f5438ad06c839164f5be5c6392c7ac464030239fa7edf503ebf159bd10eb9fb0389f2fb949434706d7f3efa00bb17ed3098bbb2173b9d661cfb9fe039219f9bb4dacc9243e64aceff323dcd690547293868e0b5c0f09bbcf95c0ee037b934a7eee731fd2c8f59fa6fe0f8d81fff9110e46632079f0f5235c0b3422029aeabd05a3b6f5e80a50c599ea799e93156a54d7153ad472d3542f045767c599ea1da86ba3cf6157e2731869d404fe451ab1ee739054d2f31fd268f59e1be9a61ee0fadd4599ac0e7b8b326952b222637dd85b879d098b8c35193361f59f2f69c1fef3d60f751d465bf7a1acf7d0d56faef3fabe92d0c5c1e8e27ce8e27ae8e278e8e276e8e2744e585c0e99cb8dcfd93ce73aebb99be75ecfb570402df390bcbc9bad72ad8c308d87b5cc03bf8c3d475fdb88a9ae1d6b018f96b483dbfafc74b5c1cfa982e5f754596f790cae2af8afc9dac49d8107c54f4a054170764f1b2c7cef892ecea34eaf117caaf7447a4eac2cc6c5f14b6f077a51730646795373068a3151f4aabae655f09e9a3415fc97e5ebd2369ea82fd7b5fd5284990a3a4da960fd962ac85439f08b113dd4f2db52c1b18aa1e73975ad247aea1ae84d795dbab65a90a0969e1415d4523d24223e782fca8baae019bcac8cd1235f0041a29681c73282074197d34acbd7e65fac4c55d6490017c7ade99aa18b258a63462446886ad75c2b846795b0ba718561ebab70b55ab1560f59ad7d9120922d1b6a64f317357a7d9c336f8b18b7652eefb125fd8a2de18f1f492636e72fce135b240c5e65915862e2bd2a8ad032ef22b938af67de270c46242df31e92465ae6ddb551a013addd518a4ed5fb7ec54f0c4551141f521716e7476c15cd1b5b405df3def2c4f00bc390a8651ead651e0b6446efa01623ebe5ee2a0e154566fec48f3fb26c8169b84228cbb9788f2c61f0aacec5b774a88cde8951e7e52b093aa4ac651ebf8e6081e1a0468cc381e34c595868e188966519c52c2df32e922253cb3ca81187c742d7700ebb37840a2de8b8f77be72cec346d3ff7fe7abd6cde359e9d7b97795ecf752e529d1d980e2d5f4551ece9b9ce5b3a222dc7aa23529dfb5017b6a787941dd121df328f2784c1ab3bdf9701461eead51d1a2b61357eb524c77fbeaf2541a7240a3f34853903a2464027328addc89cb18a18758e73ef27634b66ecf38bd341c696f47ffe4332017a7f71254d249f6382b1dc9d0a5dcbb9f7fd724a30ea9038bf79ceb4e1b8e7b54c0c6f648ee39c79bfa125432957b5dc5d0e1a130fbb8784840ba231914c82e33f7f8d003edcf1f5bbb625b04820201aa32b1a835745728590242bebca781cf48712cd9977189d6288689ee7451159473b9de305165fae2cd59fba5fae388109a34b05aa0be64cd4746aa4ba271ce15a3bead25e6b4bf4de6a5d248d62dedfba9178d74f581ccc689c33f022f923dc697306fe08e7faea272c4e248d5c6439debca47db8c5b90ec6bc279933d0235f386171484823237306fe0877d68f7022195322be75916ce20096d7bdb748a430f691b10688675dc9ea36ff6e431a357da412f12cd2887162b9ba242f32f69d71b125acbffe229bbeb3c826efde2b4948c692848f2d693d7cf8d619375f47bcd65bde6c815f9d1947f09f4cad2f0e8c792d9249ebafd65f3667f23a8b8cf517c7fae240af2a859681b7a12acc19087a2dca2f19a218b7c692e456178f53b9ba7ef3de57925caef5d773acdb9cc6bcdffc08e7a2ae2b69b96e48231b929de60c3ceb462ff2a9822d166d51a69877d78f704631135a675d49ebac7b6791464d1ea9847517a9c4487306de6849863903196787bcaf4891dce9c4cdd2a1d5c4b85b8c375254fe8d145d9ba154cbd80cab8949a2a91d1b61d6f9f9aefc506ada18c7642a87534f930c0e696a931ceecab02adcdd48b55e789f7b88b194cd0a8e539fd8da26e717a3ebaf8717639345c6e6ce1948b23ec9147e845bcaa251b1bdcd8f7052b1fdbe451a352da9a4751b923667df8dbe16bb8e24918d50c67187f82f8cc07504ae383bc417ff798e2d69dd751729921b5bc27aeb2d72a73867bcff56dcd5d2e66c1f4e757f547c4a8c934214b99d7a7accccdec724922ba65700156a9f99058aa465b36db044791f980f5c4168038524145198b3598a3656b0b7a28d528e33fecd5d617dd418eb4ed75cbdb375472c816a4fb2c568cdd9b37b76cf9e7376cf39bbe79c5d84172e08e5fb8e9ef4d0021a8821e3460ddec065a96092b0a27efb254a10eb7d6152536175bda8a1c61883d6c79f97fa9d757585efb3ecaffbebfe7825e28c3f30fa7d49ab1f91bad7056049ef93a2b57b73b558bddb246c5d89937728043faf77fbb532cf9beb7537f76eeff6ba5aac559ad6f24c3581e5286b9b875b801a4b75bf1ce174455d2f6a64a9385b2406b1de6280d539ff312155bf7f718252033f46b0d260a5c102c3da892b561a35c6728795060b0d1618161a2c34586186cc6055b1aa5e640ce130729796d1efad11d63510bee3144b05633952edbae6cb85d614546b2a0c7daefd2a01569b1ca976086ac890db6ea4bd30413edf0a02c407101f3e5a42bac170c8105b15f81d27a20901e223884cf6e387101aedc70f221a8d8846fb5621407cf800e2c34710203421441d0ca909f1139daad3fb7e1079b4fff066551e8334900644880f5008e80304c9ad39d450b54e140211ce0f22efa9e94f9696cdcfaa784c9955cdd4f058e2c1c4230b8f2d3cbab40d47c723b7abf33c92603a18165ddb28aa2c2b174b28886ada66553fbb2037d244f740cfa33c906655446fa21b6990e80b2ab5b3b9bbe3bb3bde548a9aa1537407523524129923a1904ae414d24a0ea41cb920354155416982a87e624644a052744a884948c703c4c78708f9517b9db0ba62ec93295c31f6bcdca91c533a87951c4c39967258e9d2a565e44c071414141444a51647846441052b469f20aa69635c909a6eda5b1e480b4a1354d5b29943298712101f3e80f8f0f1ad435ac88ffe21e4c78f1a2984d2dd143dc33b5b10220f5efe7cae3374d7321698d1e62d0e79a70d9da266e8192a25b4fbd10111e11bacdb0530ddcf6ef504f4c0587700a56b3f94a67460a56b3f3a60eae0880eb6742de6913c927840e191e3813453338bb1316e2d8582a85a80414868b654301b8c25959a51d8d39cc93ef81a37d3a960bc5d7c29b49322722389fc0847840ca5c4706ab58292a4348524c356ad8456af2342423b52886ada7e70bb692372166d672d55ee224e21452b546ada848cc21b194611a1acf4c2c2497346022a1544d5a0f7b36b10ec2e2d7629e9ca70c16a9e825e0d8ce709e9ba86a3f25b2bd73856b95c66e8149562beb171cd284622bf5d0cd2cb45fb01bed5143c91a0a0a6fd07fd41d3321fe40f15f9b36bd9ee75e4074dcb26e8791e48feec7ea8847656c6b18295078f7b49b575e38aad5144bcbd1cebb415216f3838f4b3e9e9f775e4cb7871da42f8eda55863b18740a9999ecded998edf481d393ab136c6a3ba415441542e187dba692755229427e926088b2341513741503b347ff34a12f483e6876af67dfd98c0381ea4399b3d46982e27889083b414e279b67b745f4786dc4833d5964e6b4e719d5595b32adbf775a476230d83ea5a493b687bc9020c0aa6fb32d2de4cf386f4d684bc2f6e2dc8fbaead01793f8c32d23f678c6510d5e78511c53f648c259d9d4a4d1b91bf5eceaa88903f668c7d21f7e84f9aaec560672a50cb763f54414e36af5a52292042401e20e7791d1902e4202d6d077223cd82b960af2340880e1201e9f63c7285fe8fb770e0a0fdb8aad4b46cf2c80505bd8ef8a0812048eb6f8aa102aaae181428d52075c55041437ded70b1543096ab911c5f4a88fc461add4ee4ad1b5d2dcdd98d32132fe1d8c5b1294550574a3b34bf382234e4328e545d3b9a55cdb09845cda0663a21344254b1ef4b68e7d168f7281108fe007dfcf8f103fcf1c307e8c160e497423f7cb4e8f23ccffbe1c33be87944e479e468240bde3d1f1e07ae99c3d82f7f401cb9ae95b3aa9d96fdec7ed080a9f33f54493894a62df73989890206751ec7120e2b6dcbdd208931c1933a8fe388b6794a3f69bab662a2e852e77faa40af1b8a7e6246d5b5924ab590139020a2a01f411d1424e4dad7111f37d2ad8477d0032907bca4dae40ade949a33da83a868b403a19d88f61f4d7b29b4ab1e8dd20ec382051d0c4cd77c7c1e0625d27c74d31f3fde64ac0663498576620ea347613a1c2f46a369ba3663347284ae342a45cda8a93c5524d23c9944429927a7b4cd668a9e81aaf3749e06ceaaba56fe64e181d4351eb9ae6d549da55029b4ab3f5966ba6923f2f90a04ab404040403f422e171132886ada2652d5b65c2e10e7e7ad97ebe56a4af47ed1fe83964424e0a82049a5cc8cfd138cdc94e8fb3ae2d16ea48980d0845c177a1df1f15677777bdded75d30ed292054fe84502571ac5c9e124e140d9e1c231771889fc763e95fae01f7c3f7809ab384c733647212aa1aab1694d13aaea2049a84a6827b41342234425a4a603242134426984a884d4748024b4a352423b20f7416db7791db109f90d902142765ce3d4b4d1a939eea68deee66c7ec7b52f1f3eee8569f049ddb4a6d15d55d77eb47ed0ad548a884a11d1add4cc1445d335a2cf532aa21f949ea19194a2a1a2522618cb202a4fc8735e477c902c784915c8756c1407a965f3358a3384e224b52cc78504a123103aaa69d97cc108c423b4dba1f99c3adff271bd5efeec586146d96b0457e5c1e34c18356d3125447efb8d348a2db9bdc88b904c62497e7e6ebf7d7144c8308a4afd64298560ba25440ed309ed747c7c533a95844addac31f6cb9f5d10d5cd5b39200ba7ceb7565c8ca5d0aeced2b46c5e6807529c8f542acb4f96ae9533aa9f2d33aaaef1989aa5e91a8f5dcbe6accaa3b3aa96cd075175d1ed45eee3f914217f76d3b3f9ffb3c3f9f47e662d996b9cf22a0bcc585229a1dd9c511cf5478cb1a43d5efef0a05366cc7c304ee56cdb7ede6ab1aba9901442ba964da1a724d40c98f1f57d51a92667555e8c424ed356e4f3424fd376fb1c77da603a211dcea954d78ad0ede1628119c38c6411cab81b15722222f454e761ba9dbf1c77889038e44b2a95634a1055d72698b10ca20aa26ad9f48a18cb202aa90ea20a4a1354d535a4ae758ef91c493994bae6e3f339a674edc79295ae1dd1b51f59ba46fb7c8e2d39ba742dd6244543a96894eee854cbe67d507a869a89b531f6b99642bb924aed6a8f9742bbcac1cb9f5d1a1e247cb5492a25659c55cdd4943b6ae748aaf3658fdb9b481055cf5e47fa83d39036fd6d27ea031c2b1cbfc5023372abc7900fd738d53590c87f7e0ed34d1b115268d7b3f91356b81b49a55230f2f78397333aa2b143f344e8583567f32d9b1da410edc003d9ec3c3ee83104c2e785b399835db15aae970d90cd48b543f351435f29edcdfb3c7ba9f3fc0402c940f5eb21fa02f7a0a5f8012d471ef4056f464b5146cb39e5012d777675be035ae224d579215aee50d5f91db4a42fa8f31cd0725291b4cc31a5ce535a9e96a30e5ad233753e070da2e59c02a2e59c8a09d117bcfa334ed579d8cfaecefb0451d5f91e5ae658aaf33c42bb524837a97266552f78237dc1aba5d0aecedfc07475de8652a93aa3ca90aa14a7544e2a43a62eb3b7383ded4835528d69d4d4791ca6ae6d699b8fd3a8a66bfb458a9912a89623d558a554a76e871bd41267a94e251c6a8973449d3848751efcbcd5521453d7cab00ca7aad26a4ad7ba8bab962ba5d511752ad539a4ab35fbc046b8ff3ed2f33c0ffc1edef3a6c80d962cb8faf354108b801dd97bdefccacfb6fab7a2bcbb2bec7e5f8b8c18729e6b7a31e456c80d2017432e865c8d2177c46e08445f28f3484f041346212debf78be67d2001c61e32d9077e308c3b7e30f4804271eeece75a2823e2f7300a0a46b1ee971d9ebcbee8a0c68534b2ea7ed1218dd798b155f78b0e62408d3775bfe820e5bac138d6fda20394ee8b0e4b3760184c1479e77c9dff81adc4cf9b9f3b7bcee6dd1f46bec77377ea30f2dc9de0275a91b5e83155aaa95ded5410a20b52183120837406d7ed44ed375294daef5cd758154a6f549fa5a60d06e32efc548bfa81895c0cc41491d44d2451fb4ca66b215f490a2ab4d0546d6a5f0623ce752dcc40953560a831220d2745e09a4bed33d31bb54524d3d6ba39e39ef5862d4b9801050e51a4c0b5d3932c5ab50f9b36d10a9635a8d8c0082cb2a001d74cd4fef843edefe4d0543daf8beaada07a5090a81e16d5838246053ae2c9ea6e91aeac87af232cd8971c9cd4d5eae0ebc8aa858508cc4760376e8c256cbd90210523a370384115ffae9514e85df3c8d26316f989540dc37baf23e191c0d6b5ee8911f5bbd7351e3a358c654779322424241a7448549cb69e9a92411552e75924c158c2ce345335d24dd592c148248e1c864d9aed2193bcd4791e1186c3143b5d7c496222476a8e393c51c8e01c16dce0a4cee39c618313170d8ec14c7c832ac408d18066c97ca9413726278548edd38410e5aca8fd108c0851fb227c714255fb05e8daeb48b3d070cdc68baaf3af8f6a8d11b23557d4fe4e1fc6431552fbaffb054905b5aff8d2444a0d40135518cc4cd2527319bb7db6d8eaf36514a3ce7bad3437b802a8f6590de6724dec7db9c1933ac33041edd79106776f4ce9a0f6c1118ad4b7516ac0d479ef4b434d11240cb6b279e2c4081b77600d429d5f1ba4016930eeb081096adfebdaad366cec6163849131baa6b8a4985e5b8c3a75bdb8c1840b8931a8ae1737beb86030e2a8ebc58d2fdc684307a52f51a86e30c2761871ea7a29438c2bcaa87a9d6074d5f062c1d8da810d3380685199c1250b33a2786919c1ba5ecc10838bb2dba95edd2f517e606a234ddd2f4730b501c572aa1c8bcd5284c988785c1b53d1d616ea92accddbd6cd058d20f9b2a58269194391a1ae652c8135d5a3a17adf50376dabdd6aa723210552501963dfb7aec8f5da33d33329a826cb302a36bf54d3167ad919bf8aaa31951f96c1557552a89b5688abd56e8586cf5aeada116d632cab345553402b2a17aefc6ab7dabd56bbcaf7661f81244b922d287049a109159c68a16b257791a16b259fe159a97cf6ba087395cf65484548c5defa7c11b85c32ba338ba65cddaac94159a2a9966c65f5b4d285ba302969da16a714268549a153175f1588b4bae849e93ca6d163f2983c262f8bf7e4419db1b79b32c65892a7caad8b251199a94228dae4d3b4c1c6c3a8ead3b42d4e37463d85ba39634fca8971676ca275484835e67dab4761402d83dd6ed08cb1ef784cd6832684568b1185c04d9663a8ab3c594e386ed0da9dafe21327ea245bcb2fe8215fb04ca9d0352663e210236d67fd6edab63136e1275d702521c8be8bdaab45115a5d0bb4acbfb16581ccd2116d632f4acd0698dab41db32183febc49eb72cfc4c6de525b895a8650bbb70db0a4adc500d4eee3eced8511b86e188ae29ccd27de1d18d2d892302437b60414e791d7a297d672bf75c33a636c21f3ad1bee51b7a4adae1cb7c912a8ee4518181db3c0b0c0fc5b8247ae475cc14caac08b1b39279d93d4ee7a2ca7711ef9562ca79103a4f1a8544b166b83550a15a2110004002020007315003030140c874322e180304b0351af0f14800d7fa254805a1408c33086610a21448821000000000200000333b30d08953f7ea888d757a2ed439313be9dcbd7ee56d8aac8deb5920eded788402d768bece5fa5a913d73378ae49f97da4dd4ebfcdf446f9f1b4362b802a01189a529b247bd6e0df71cf053a136f7f7d607d0b58629c013088029695dd9950c9931c8464a8104d940369dcf145503d93c11110606598c0389db88fc48f196c47d90757a4c66e2f41cc22980df1dfaccac1811e1c56e5c619c7d2da8e15fe834ebdf43f1da032fd2f8348a50599622c0ebf493349ee2e6fdab445a730b073fbe3807efe9db6a4d1fc64273bc9ee698a0df6236c53c43f0a0852d9b003eb433f46ab9b5515fdd29212ff02af0dc03234f86e080f597f21c6f9b6023f1c48758ebd6205ff22169f9be15cbb62e503c68817f7edcf1a978f8a967dbadded0914e342822cd3823b57e6cd51c57ff607cdbf4f7017c7549921833238af4aec4f4e594048fb8ca7f25d1c346d01173551c35cf671e500434634f7811eb6e1a1223b1df8bb5763414055528908529f7cf52cb1d8bd04491cb286986a89e2177c2f7a8a8106f71043fecb7acc161ae725695a59e05de351b4eac7e1207ad3dd0b52e7c58d0c237d69a0dd7c83064520b5d80b9ba6a69a67390a6d1d52f30b605ca3e7acc54a6cdad5eb52bc9330b535b96be140238b9fa2db31928173ef327b23780b56513d9090ec450afee3716034c6ab49ebc7b480844000cf653de6469009b9f02e98d39482dc543a9bb2b35514015f9d9c76eb7d3f2a7a4edd1fe5745fcf2bd551fb254f716cc07b01483cb5e4f4f4669b2fcf18454e40eae212456df5d0d9d4777a30a1dcabbb9a16e0908614f059657c7caa0a0bcfcb6bc73a8823cc165cbfc3eef7e57e66ed1b90b940411ab3abc59b5701156edcbe699ebe1b13f9f912846086abd75355ef657ddbb2eb5e4244949b326ee08ad1c3275fc9f2f4d2c12f4ffd4d28f8d61d9bf56f9167aa82b46e90e8f93e2693cf15d067e350cc327a5c70ed8ba8dab827b628797adfff2d6c8c0b8be1772ac0e6949c4b9ffa5b5a1baa5e344abf0655b4ee7b4df3b4f5b9ac532889875cf08501f62bc57c87e1281a00fc053a5b07074fa117b1e8e9c30d2c9899342444aa49e6e7c426c7f0e647fd5f375dc69afc533be67871d340ce471d10d9ece52ee0f11925bdba9f007fe32410bb564b6dcd0ac1056e6b31a210fc11b19f4f249f88d214f0358f7c2dae60d34327c0d7522e9eda51e13692ca89c4d147fc312b19dc4ee5d7b9898f6d812f75e1e9b11ae87953473b0d6f90ed55a34806b60040ff0f102df480fc3d8b021157bba427492896118e38ae92c4cda8873ee660fd76f8ea15a9fdd64e44791e343d7973cd42fa5bb0af6706606abee62c7a6e71fdc861c90dcb626060c991d817995c120f4b699f1774aa953429822e70368618c4b99ac7a721535070a1cba7825b2b75a64e823d2c2fc193177cd05a3991b60ed63ee7101804f083062d39d44d8bd9bdb888dbf296694d6ec6440a7f6e0747228ca808226bc01540f036e7741db754d2c7b9b41b96a14a3a928696448029b79635398c0364ec11c8c7118bd0b4c4c44136d09e31393c79e3984e3a133235cbc72c05ac14830718d3061d61421eb5fffe4193e19605d84e9b3ec6226aa6b069bc4e2722c07500dccd61028191002877efdff3e2d27735b2114ff3d77eceab530f88371729b494301ffb019b6d3bd9062506a75d1d3fd01b61d0416692eae70cd2c97e473eee5a02e08a297e3f08dfd82f178e1b4bb56e31e30cf94ed0ffd02624bafccb68f87f936960cea41f75bcafdb5310a65f894bc8c2a6f927b4728ee2c2178f2ff1dcbc00ca80a97f95ce06fc09f87821a51ac72f2bc51b5faef0a51876b680b54028e29258d736f3f045f3097ed932ca22f70a6e04c4a0086e0e6f2dc835704cf4a9585987cbf8a0d285a082f0dc80dc3c051b28a10d0e8b9e1315e89abc23235506cfa2b971e2c40c354eb1ccc683e04743742d3cf97501b1193e8eacccee82666a2834faa8d8551dc1d2eb8ed346d9869644a6f1cfd6d26ccb312ed3547bf62ca0b900cb9730c283d3effee11191d10750d7f0aa540cb94146e002bbcf6568d8396f55c9abdeb240872cba2ed9ad08e0c4be1186d44e1f282edbebbc13d05eb9d078ac2bd5b271bf1bf59e0dd2307b4e70266588069170baaf46b910482845470970fece65cf693cc5662bc44fb6900cea705d29d5d27b0e2cbf2626704c68efebe33f59df262d22758de4b768e8409cddc13c735fab9f6f64f1c1881190a416a2ce5eefaa9d268b10e8df51b9e60443480a0d98b1beaf6c7117f31019e5e20b95279d088740e681a6f2c7fa4b906bacdc8e3227a73fe940f4e5398c8db9c1a3f71ec0e386e57f40f1146490a7cb15f5e0ad561102da4c1c5712859cc96cf5db6b74652299dfa73a17830471d724a444288949c8f52c24d954fbb7be3fb79f270ee2aee4fcca87acb7ce34227e347fd119720f8855e96ad9dde969478f02c5bf198872573bb5043efeded993164b616f05ba9d862f733b605934e0b091dd7a5efc023bd8b99da0b343543dc6a74142c7089754835e30512823ada57e28d03be7885530515848f0bfed639bb8a68dd8c42c2760fccf5983f26b1f4d927d328056f31c222408d2bfcc85f72ba289963a1f3a10309921b8482c58eef4a3e538faf6a7ab0f2caeeb2be938e8da1498f709c5e070ba1557720654f5dd3f210c8a70e0b8de8d9e488f4e9b6521a011f81c675a80a86a439ff2623e2d0c62809557e0190d225cce8b50008d5f4ca1b02de80df17ff08c21144c04062377d4e0dd13336579df8215ddc49a1b61b7a97e9643182961506592e2f3254a70f3b03c7b54f92ded0f0af5f4583efe90f7ccfadf4076db20e14d4ef94f9c8f135ba1eb06f883dd1055d43eb24a999568ace5aa184dcb89428247014026868b52e63a229237dd708c68f38024358f988c8109eea3cd8bb0aee257691c80db419a573a1c45453c8f05c9015ce41d04fce60e652393d4b23d596269989a6d4325b1574ce2342dc5359fd4e1d8e1a595b33042f2aa4cbe944488e4bbb0fcf7a03cfaa20806850b4e8b268c210ecb8bcf8c0fa8f22b82a83bc90c226a3e16833f41be0cced3adc9859ab2b10800c3f90f4dabd546c72beee5ab1a8e0160f616dd74b026176f0ffa3b0c2c82e3cf0b8ee664b098a72ada5b4c7be3041d09a9e66b4452de34b8071338608d5bc4201d0f8e4e5745dcaf0b4c1e9b7ec05877fff0bf258b86d5f2cc21ecb9c0bdbe12d1aa250f1ca985c1d90aa88e0e68271c18299468406584d067583c65f8a5480aeb7086fdb4eb9490b834f97d18238380c6523b3c464d900c19352dd34d8119f6c0d251c4a9e66d9951bf9f73dbe1e383b0c05da24d1dcef0b670799beeab7c7b2718c7a38256816d0b8ee06ddef061383d949c60421b39711cdd24b41a9ae83863e3908b0674432270cd17241879441ac228ef2ae026216a7206b7c6cdf6d7f33c88c08cd0455ab77c44c7a7595c696f5ce2e97d1472039c1d44cfdeedc318928965559b5c67087b75541399183d2a353223e62275336230e5b6cc55e5a57d252a80dbe03d0ea0909491d7f4657c0776f93afea865a9722c1713856222aaee239f5ca9b4af0c1754404704fda8c403c2359a15cb296710ea41743554a2831126a0496400657bde9366829ba1b8661929d9cc1905baa566feb424e39aec0dd08ff7136de16c78da614decd6d7780c46db146b1b1b4d651afde217693d688283e606ba75a2ea14815cf87303c2f1ca3708612ebc9932cb6e0364e4e6efdb6d74b4bd99a614567b5378ab8c2bf74cc96410a6b5d639d37e28b2805b1cb500cf68137f874b17f92fdb4e0d089fbd646fdda1e2800b5ed321d30f05ba3248e6d9002c872d707ac69ada12a7fafa2f4630fdc69c8ba4bd7dfb53b843e81ad09790a2911417662cb8bad48444f611f4593e5d86131ae0e57e80286eaabe5f0d34fd3800bfe6843820a3722c94c532578a3aed2fc5b32e5cc4a46089b66330765bd5ad57f8b5772f810a91cbae6fdd9626624d9a25715ead613ee0c6fee70fbd0554b141487b010b89ee71ab9168cc53955107a9e20403d845feadccc21c907ab14adcb3e9975bb55e0aff29be3e6c9b256cff616c4b5269a63867ed8247b91996b224fea0478bd64ac052c28076b1fe61fdce24fce954427c7e4f6f509796407b438158f20065b4668fe9f1a47a03aa8ca155ff990236be726fb717d900909f61c0be2c56878c7b0ee39d0f64cc271482ca57cf03fa944a1f46676a3221b227c901f013c7d61eee1a50e019777ea795921170022f0bbcfc27202f19ef1496338cbcbe98abc67912c11cfd6a6514ee36e41e14c79d8521e2f16ac0d7f4def7f5a156b83e713841d970b88d07459796b6877f00af103c23a56d555c042ab3a62345cb55aab9a89e03896a57723f63cd82d7c50109484ef0386f20b52c3bc8c89b76a54827a657431f190c6e89bdfd4791d614582a95dcffb1a6051dd52625615f6e4c6c4cb043a290b808988b1bb5b74f452cae7e3e7e4e27ca50682260ebada0acdf6a0a0cbfcba9b01691383084403eb92238204d1e48bc0b9953b73bd192c7ee3213ce1b91a41680bff8874716e280ecc431ef1c88d342896219010c4a81c0160a5ed6c5c5484a076a2953f38349615c22f514f8ea22858f3d659adce4c4ce0341ac9c0f1634803759ce430854874fd76165fb12dd6dd47693a955df45b1e3ace4be8890091824543ce3af2c87f6b0ef5d191f217ab526f0287dbdc26e2aa22f243a3ba190b22f943bb9476515fe8d53caea9b801fd55b1e606ca2c222a20e2c4cbe9d19c9dda19bce3ea6b9441b47506fa65c9eacf69217162d88040168f72d374263cf3d361673e1297e514e16ef974d077efdeba0d6d9fa98889e57b9c0e64694c61a451d63a7371ed329ddf709fb602dd193a6edbc67e40a20b612e0d87b43cc38b1ecc6610cd5c750b3c8ce48634e27de64177b16c63ddbc4bb88cad4bac25b6a1adf0e8da18a2b500722f94b383f119ba4f570e352e006f238d61cf4ae2c745bff2b565aa5bccd59408be6db41c032f6cf17b63c4a2ea57c3f70d51ae3ab9ba881cab0475c54f02f3cb63d8480ca968950eb97e0e0749d0cf603c1337808516982004be68502253801883a1e8532103b483a4f10ed92f5011b8d17175f98aa13dfd715bf8558e7c51038ce039d982a1a70c89405a3c3ff54488ccf1f1a22fea05fe4815dbe1da9a40422a2996ac5a69d2e3294dc8f42c6b81b0d21484b8cc5813fcf0eb8cf9aed44c96a6caf25d0990dfaeaa770ebc24f0fc6e12ac24bed1a0c9c8f756054a3841d43aa18175f59c48c0cd98ae4b568e1e38cde0e2c073b3a00ac4476c855fc0cb93b142fab186ac5812fff0bded60128b1533fc17135674010de03512276dc58abe902b76d0e00336bba2d76819299ed8c1a2e7feb6151178b852ce048b9d7dc596b9ba987b9ad27e07bd4466c9cb500cf7fb0a767ffe4a3a4fffd5b13a4daa6782c72b0da5d446696560a33fcdd482dae6f3697414b19ee2ee2ed938b75e768a3689d3e00134a9b30fd7f4b9ec8d3856da46a9748d51e91ba5d2a511a46d63ab6410a859d8729fd3d090c6cc7117daca25f0317d61a72894ed1fbc27ece16ec909b90945fd466a6dafcf9d0cb5af6eee97f2b3aab1322d9f1fc021d77967e23bc7f4d1e8f9821f7c11f7d8b33158f6041957a93be51ad20683ffac898f4d5e6016a02a706077bb5f9df58c493b4db5bcd14070b14d958b05a966b79788f6b281a1d99642bad861f8285c5a0ed9398461f88d35f9a2d448cb43baa8167dd79d75b23391f5985b19892891393133b9c4e3061cdf93deebb6ef24622fc6fcd7a42dc38b2dd69df932685f2b82461bb361275271cce2a4cc201c499cc2245b37c0e004beffd401d5a52bfef0f23da426923f315a4a563b18fef4dfc4e7486474bc3daeb235077cee47780381345807807f9edb2c6bced3aaf80f5179815c78760e362333f6f6465bf930c28952f9bcd23db034148bafa0690043ed8ed5481a62a68dbf180889cdf19fb881f458d1461ac0fdc5b3d2cb17dab9f9635564751f21e1a9cebd11ceee73d64e27e35cf3b3aa7e902dd856d3c14d0b79e8c24c2aa6a0188862f700fcf06525b62c85c4bfddcc974af56d08ae711fea351fc9f41093d9d88ea0aedea1ff031e1b5c9a43caf429c448c22bf2fcc07d69ce820b4c73d4b3a49b3d8007eb886ac9c0592986958a093d82286b2a24dedbf2b466b1a866165b6ff708d6461908a9a859df7030ca1ad469a6946816f48aeab3b5c2d64b42b54b2395a28b81277e4dd5f10b5dc73f23d49cd9c40ef8efef53d6301f69175885298f2a129b06260ca382cb7227312fcaea036502980210c000b0956d2a78364c27292e7c974bc09d1f0cd9eef3e3a7a0101fda77ed1488a8dfb8e7be540243219968fbdccdb75fc04c4e456d07c501b5449abf942773da908960a06d902cd161fed95289b4174891be0e769276c553018af6c036afa3a399144e97ea71fd6fef0666c1d48bb4fbb1ec2474651c88614e979fbaed4c4f80d5f6e7d75f86278b95c5700b787db67e08cf503495ac6ac07502adea9ad55f72898813353233677482a5da10b48611139829a3a001620d5b6ab577ad5375f70a32764d5b2aeb248684582c6c89944eb2fd94d39051408a97b157012bc519ccc0771a4b68a0cb7de7f54e863248b52e1c2a6e33041ae2b9ef368459280d00649ead9660c3f88555d3883e645b33dfb35000ce696951f9e032c8fd2fcba1b4fca340b244e40682efc0c148f09486937742c5ff37b107af3cb664195b8c227ae7c37b8c2e64f5295b40dd796b69491b297ca1636eff8711ce003aae960966bb72b62e232aa2ce675a09a1fe998f40d0d8d4f6eb9569cc6d6c3862c93e6ba48622503626ac5f59bfdb6b9c2eda64041a335de0ab66c3d6e1dc4fd9e1f9d4f5fc8ce33aea14ca076c8e752a4f8331834cfbe3d753ac8baf7b388a6424c9f561a97a88b37487b42ea6d266628336374cb63fd4c1d9482da4f630e304e4640255fc29c2bf3fe9da95115a75c44fddfc6838f2689274a42855008f6906acb3337c4ebb7d113942e0b1fc66d07f39a16753f17123fdb579db1bf94698aea83721e2ca97519090d81e5029932ee1cf13e0a598938a3c22ae33b33b9ffa5a5119db148d2a1c2050e60c8e3cf300f13d8804caf82197ecb53ddea5e199fd95722ffaf3a9267122b99c7bc98f9a20b04910e5676292533f6184671a1bb9d74f187574c80c1f50abfd5a8064fb787062252f4258c11b257cc57f4fa0f4e7995311a5466b228a6dcedf0cbd4918c9ed8847c0c81971d76be283bc3868229b929708202a93265606e5a1a01c844d6290eef002efde8fc8921c6abee972bec72258f3133be6185a96bfadf16599f7c5e7c3aa24db8af1d1bd68c99176a40f2a1d743bb9d84206e3f54f4b450ee9fb64cf238ad605b21be6d3e6ce413d022b416949c49b6c86ca95494ddf842909ef52c3846f220eb257636cf7cf6b2dd58c5ec9238be2996614e3772bee6ddab279a71d83008c9ba4d49250024a8d9ff79916a44eee3c30ca0f4928d9011678b2641908a2083fbc4821abcd7e54834fca9c18221d5b063575e402c7f22abc8461482d634816787aeb0f08dbfde781e10780c3bc2e594890245a1719e2e547d98bfde292430994c5862dcdd9f0813a8f67e356545c14de0010e67ae6a1e936a9d612c583d6631bd809a62ed0d438ec6cf78ec60a21681d78306d406129c4afacc68b32430810cec832944e3a181e5e8d329f325436be66f02b632d659fef721f0b4f96659cd14dd900a8e5f48bb206c8e3c45fea58675b9731cff305f5e8361f5ab12f55d721c42af77581587d608098c7d476a3194aa6de81147e3cdf85eda17b09226a4465569b95d15ba47fa8e68e09f967f695895a48567d40bfa86b3e9f783ff880bae2469621a6e709447d2c461536312a022834f1a4745b64bc296f81c1a81f163c9e1d661015238150d698da3895b8a8eb20e0e469d30b58c873be51492b76c5b134961fb3058d52f9a2d306653a0867010aa3e4f2ac6961ca454392e82e48cea5c50faf422a1fc03cbdf7486caf1289ab0d5bbfb7cefa026befc758d0bfb229d44e296b66f4eddade5c614a9b7484fb3a276a1e5d853d8ae16fa0785ac42ecbaea8d2118ce98e6afd74960d0fc05a6b3ab88f6fb5dc06eba46846fd4a26114eadae4c5991b58eb029d9bf023fadc4d278d5851da0c40afa47e0327050fa73e527bd8f895fa593381806b0cb1562792a94832034a858b290747387fffa3a41b062acd4c87ff783872d99f234d65efae61b93867ffa93bc074d6c8c3a8f873a2822077f9029d0b697a00cfbde8585a74c0e12d6b528a06995f692ee434da3c4969539dbbb1a83b37ba91d41531dd0e48d55ec7020c2f46170190fd291da54095bda4320b6a38f61ceea89a63a222763f86b847c0f3ebd8c227b6630d09cd7fb8db422c21766ec8b7f61193ea58f0b4aac49e7c892aefc32f28c101cae7236f19e05b48a2c28172e551c93127e45ba0d78bbeed78a7c5f587a3198ad1555e9266cf6a135fa15d5a9002372a1d43fcc881e288d5f1ad1a4645c912b2f86829d0e1c2f1a2438fa73791878b79f8612d970a17279b44fef3801b98f5a163c469a53d212df36363a29b387fe5889a1bfed327ea60c4904ef8e440d54683b8c83ca0d2dd71ba5813506b9ef0eb94cbe1afb92cf7fe0258cbcf9a00c47950c80a9be8c67401764e5749f43b02fef57d48fea1cb3150f5e38a584c09aa90d66b16a6d94ac8f50815352432dc912d9a9db222ad563cc2644458df8ed8b59feba81fa0862273cb3e49bdce29afabf0dba2ca6184fb46a3ec484ff2821a66153e706c08a01cca71310476396441ac4d4b8feb903586b7dfa8f1c02301630c20128f534d676fee307a28f016c081827044dc9a4c2d2af7d0c98ed9e5652dbcd65b6f07a886887f3f0e9b1e44820c9a9c879826b7034cdd389b62b18546a91647a3c364b402af20015cf7125407c8439bb341122cf783c8199d08a74cd2f44829167930745b270f1ba30dd8ca64d2986ad420dcf63d2a13a0ae2b02bb84a1c587c8d0dc640a1200ea0862198054208f4943505c198eb3d776dcedc3021fa0132aaa22c140cd457131e79070b14061ccb5a19ca3b0b4b0dd711534776231e9e535c7b006b4849d46afe79c5933890b3c2c2d252533f6655e15435d3d610868d7c2899671e4392f0ab5a80d50b0b5008694070ec53f952a154f62c2c042cb57fa12dab71c00b8e4d8ff56a61210ead6cfb4efb786af0e06b70963a4b4d58918c16d5e0cfb97fc9c83167c6c980cd6ea0da4032812c517b4fa1858e06e3bca3c384581ab47b4c2dc7cabb0781b01c43f95ec1639f716a214957870ef4909d028d91d1886001ad2bbd82c97460ccde777e9d77da5e614a63ff129e4405c20d98050c1f6bae0a4a25476be9a79f5e2f442706c8899cb49b58c02adce941cef87eb21fba7829d0415ba0f89205a392455fcdf484507265a433479aa017815f2d7fc6774d14f90cf61a9f0f096594b6a350d2799403048fcd1110e3728c11f6df160d0574993f09ce899f38081294e5cedf7edcca4fe15b138a3d99e3f3a3c8691050ebfddf50da80171c05a5ceb72759792a16c1660ec9b9741bc8141437a2889f049a1aca63ec024090b9e962f0cd6357738159ce45e3ff8b6c42f5470b3d2417c2fc603b859479f1b7da869e861e65b8a6b8e47f1b634ab703b81048809e951a4e36f724d34e0137be1ff02204a9262a3e47689271c0d5101318867782a511b9bf92dc53405e46909283908f5880b7300df10c23129fd0f42f2c0a66e19f358fa188c939ee9a132ae0814e2ae5bcc38f9fb5f1a06ce7ac4ddb872ffbfcfb8d52068688b5688a1dcdc40a63e92e02577f128911239e43a2b8469410c51b9fffd73a95d8165e8498b66c45f6746f0e6907feaa75887ab6b814a7071888a4a3c091ec5279e92b140d87aaa401de943b5242917c75c7d07a7f9fcb6f7e2a7e99dc1fc04346128d650c5810c735132cefc92be8c6e9a3f1e839041ffa190be8f77a84dc984383b794187198878ef81c7fe8326df6f8db18ed2c2b583b2a6d421f8748d10122fb949308056a2346430e6bf7c602af5fa1d0d4fb358bd3a976e8e28bb3d48e55f1173603c1db38e812bca4d574659e4443e37f816247e1b55c0021b9a2af5a88aaba4d4d816b901806e200d7374f0b6b6b6e6a0d1968f6c52f0593b298f7f300f213a29107a34f14993ef12471d24186ad06c3a497a05894f6ef88058bbb8572b93b29e1fc095c1cfa5742f0f7a0cab72174f6ff3ebca8839d61f5ee04a62284310c62b69459ff22621bc4732f3fb07cdb43bb9e883ad38a57397dc4b91061388314f95d8031e382085d313fe35a10217d83821e4ebe0b2a166f4b0a3a2e743f14a5a079c49684a21ffeb57a63bf3f83f31b11cef23b4efd217ae697dae7cc31ff05f8520c5dfa8409cd1292159d0e08991cefe6b528d1d21ffcaa3dda39d91d4fac222384636c3e7d6e5a63e5e309fc49d6b794a44204ed70d1ca137165262b9301bfa0f594d996daefe42d687265d669bcbca3c64c36b410f0c5477917c638d8fca8777d5aae39b4585016f72cf6da88cff9c5731ef8d0d66693c6780d2761d965e6db45e938569404f90f555f35782980ad895d90cfc5a3f28e3feaff0335ba85f0607abc6853dd059fc8019390c238861704baf43202b66a69684b4e0ecb727589d154dac49be925ab0bf863de54b4994e32c2846449be41d6cd77ae2ea49b063fbe0eb8146b12eaa68f36f9b5d540fae76e4c2224dafdffd1afbedb5cfecbdfd6469dfea34ea0eb558d69beca5ffdfdc53741b2f0c200ecdc9b6a1571abfb431406357ef8b9f316de919307351e852a8989cea7e65f8915ea65c7a408bc0b33f24ca87815907edc8a8f5ba99fa151173e62a9d08f488f61e3175eba38c01fe306cb1e44c564e8043df4c72f6ceb338fb20fa686ee3c8bc7eecd9c9e731a97ecff615802b6f0b88a49f61e75f8647986f66ba2e746feecaee8b58d3e13809199710cfd7ad02aec3ce4f19ee6eed5da0126ba4a737caa64fbe03d573f1affc82840dfd1c3e12fdc0a721f9f20b1db44f2912d01c92d25ad8cb08dcf839c988caab55463c3b6ce1ea36e3220d9f1877d067a6968a2ff864733c4846390e6fdb7b80a0a0a51029c8aa150fd4bcb918435817eadc55857206972fac189ad4f76d6087be229f49fac93ffa0f7c14fc17322da808f9c84f9e226c0090136c2e98a9f05221698ead1950ec5162c8f52ae75ea224ad9bb4e20c378be27b382f6c65d23058268cd52da743d2776e95d327b279c126214aa218b40b361140ae7d05bd51e11d76e93ad84afc427774079d3a1f6a0d8872760950d304638cb313fcc384493ebde7d919b7c825e5b7b9f29397fb7676de340f670780b125aa9c392906a1ea9de252af995e0dd984a69bb7081f93f6848d2a8606ae85f7b2860260c7077fe241e038de91b51372d85839ca8f7264d1aafa8b22153ce2410d573d72730aefb5b574a09a13a53fa597b604c10b0c5d9e876730a9fc96990200bd180461062ac05a0ff425949df5975b5ca3595a225522fff2df9bf5ae0133cf3603edfa03caa580312d5262e5cb0dfc93bb494ada58b9c7050e83d5003cf0bb9e46ee046279424ccb89994a4a9f0adbff61a6dc86fbcab3fb6c7b6987a8a868b256af7708230268cf51c6505e48c4efb3fcd73bfe8cdea2458a33805d49820646f4e6652f886228e632a268103b80cc1e3516b455122fd7d68ca82c21ede9f51e977c82e34dd074dbb788a75b14dce30afb3a7b73d054a215e1ea5c9d21014b34d9c7175fb9115af041b040e351547b5420579ca7d326dab189076ff5e7dae9397e838d9c75571b3f6e97cce4c0d8798b57c21b6a956edbbbd28942a93437c5363c444b3f45421fc153e6f481b70302e4aa9c9c61833bcbeb92c8162ddd8670e5a344194d90d2e71c8b3e6c4fc255cba31c4013d97c42a9d01f6a0e4e639f1f35d34d5bb49949dd7bd85ba29326eb113bd607e6ffc9327140934d7bffa0bb809181e52dacb8a88f96c7ebe619481acf694c1c426a1ec32126a41d0e0c4e8215f52bff3fc84a39053b212b7f058c377581db47eb73ef476fa7adefd3221d87c6da1ba9d83928d7aa128dc29e369b8d685d4873b09325b9cfc7412c0ef5e83408319ca01626f3fac447000b5355196c4ffced659966dad332c6b2d090c6fc45d2d2b7f8f0797f0d1faad807ea9148c0fa8ee5dd9c674ac4ff0c5a2d19c9523f30815f5a4f5f11b8d5c8484e4e0bf5a77a21049c926e45d935091fe21ba3c71e5c284615725325af1e3955e2b3a4e2190925eefd9f6d0aa4914e199a27cb6c334a01a6e3b90ccf8aef57d918e0df5897a908d4e68fc6625bed44b738370c64a9339016470c0e51806b06b05346cacff2591450f6f07a80d0e90068d3dda95d7a2875cd2708a7cdf31d01eea2e78514cd7fd7f53ab8db7228822b5280f0bb00ae26ac5c4c2cbfcbd65100fa1635d855c01b1d5f32760e010accf0bb30eb0ccf467b60cc10ac37595ac1a0953df757997453059a511863bc1e00e67d588dca2c52f8eb786499c1042b88e2012b967b4be608ef88e91bb384c4f0d6e30473140bd0c0fca54aa998f07c74d479e0cf94f8ec59de8c173ba7b7c6642a434dd4147025c87de9ad9264b9308c5a6014e6eef86a6a68b5b4c153f7adfe4425f622c0b0a461c43d9db8ca59420a3d2207b33994882731fdedbc6888e0ee4f9770a4e8fc91ea3b1716d4bf13713cbe80bd68020de896eea4593abd138b1fd726831c276990210b3c4be3d0e455c4fb0e383a718ed8fe23f2e06511a018ee3b00f5c686b16381916afa2abe0d0839b4205027b20b143a9f8e76bbc38fe4c9d1c6604702d5852e5d1480bde7417e2da871b327016592ca69847cb611f16a84d0c0ee10d2eb73ee9333bbcde37b9418b21616e620837c3b07af0076e87f6bb2e579d80e11b6d95496fc445e3d09844d72ca98d6684cb9a5340d8b87c82f6832513bec10bcd9b4ad68df69354874765f866b85bfbf011ac4e1833b61907a4b50b95fc2424da4f99e8c510d19a1f5290660542cd481ce4a2ced3f20809e7f907b17858d56cc77d45f0ac89b57cbf7c586bf3bfa817d8f4ece8f5ae2945fc885d762116156cb7ca3d0df25fccf941ba251b58f1a0c9f19baf93edddd7641569726152c29e1f8b5d50bd004eb51eea2957781383c2197ebeb59bf983ac3f809166f0c0f95c03898e8381eda5513c69baf5ba25a080c4d8f9063b5f7f3ae2f5b579347942526e38b7185c27047a766983f573caf72f9ceca4a90702801fc23d678a17c8cf730b0c1e13efedd394381deec1d298e0c5d0db522ee7686a2f2059efc901112e347207114107d5a3271c5a682cc899f14513486f56d777826437e6e9662368a0f8d730c83b1078cf455bea0d401df1ce7732497c3ae337a4a90e984c7c14cc3abcc26c89893bc3c34bdf47c3475864b7d3a61c4e062c5033874542c4dfb38b9b7d5559b8c5b90d9c3f0a7448f1c2b470035bab7ff118c8be762d092e1e9f1d16fef258cc438b8e0e6948b666253d14cf39f133dbe93027a7baa04281d7d9fede0411b6be5b485f424ed51818d0e551dee54a98976eca0a9701786d2cff31ad4dd093392846c5f63908e73af73631aea0d6a2e54241bf947bb06e8af658a5a2c2fa1883e96677d59f2e8a7c2c7522547b14b9788517af171c5a7d47a786b3d2f3a8334a2f42efb4c86996816fb0014885d27a7fae21e3a92278d9315b5ac1df5ae270c0ae687f1038e4ac73a8337f447fd0da88f98d30a283f237888ac46c03b15b1a5db397d166602ad9ace5f004a4d509396b5387241a7a134166d1ca051dcf3061dc3f8f0042e877e15132716d39937ecc06d1101acab241e2440aac42c87903cd8badfde687ce458b607264785ce025544cacd8bbaa25372ae149ec939c97a43d90d859df8fe59f60ffee2c8b74d477730ce947ae6eacef433531c15932799d42b4e1722250011ecd2485029e6d06a5a978b9bca503d38f772c968242deac8b8aa31b2c41d75ccfa429499b7c2af31ab164703dcd63770cbfdfc78d202ea1d4e140743167b25124c63e2d9b86f944091649acf2af07747d0374a2d8b4be648952265fddeb8a92f1ce7f8c1c5a9faee1a78c03aac2077c143e73e370ea3cf99f75de73acd37cd466201fc2b3a85124d39043a7f8b3ea23262ce6890741a89b4f739abd9f14f207abc1bb9082404a8b970a5851430d8c4fd0193971af791e6770a1413cc273191dd4d1648430ffce2a86bccf8273180af4936a2e0dd9816a552f4feba93018ada6fe485a904c78eb02bcd68c637e1b987dd96fb682425781a9a240ed26c750f0452297620a76a733b9ea316238cd62d0ef492186c8eb97edeebf5038298192c86832d10e7348f5639233786f20becd89b6bd31be71688a94126618f2a2d25ce38fea33334727bb740bddd625661835ca47af9724bc1ee5a3a0df08e18325ddef856558caac312f75e573a8a9408eb6d4980abf584bfa20ef212b6c392e058fc454ea34a3714edc14dca0415c9374fe1d28a7e0ab7af1a7542347a5695d18707d47adc73217b0d608691777f02f013e9eeef3024c0c490c15b6ff58713b9a7e39393519fbc434b6dd1d00739a197aaf4641365dd46c92c5058396e50345a6521c4a4e2f0b75dc1129358ef1267902019a07101a587ce2c91508aba504fe25e52c69c913f153ec85a356f6bf45140f68b2b492725cb3acfe3285010fc7184bc68f60d24b611325e4489e9f1fc9eb1d38de0b621c58654304183343018531750dc6986189648ceec03eb9a8364be93b555441c8a197c182b642cd78332cc5c662bca51dd89081c31daae42c542247ed0f833f33425d2e48ccd3f90c95ddf8e8139f35846360c5b0b626dec25a354a58442d2692f21f16c534edc0d4880a1e9e708690d5fc2ae47721189dda32879a3eb12bbbfefe4960f81be217ee02baecc5d4933d71b2b6465fd0742f86e342e8da25f4d0dcd639f7b550075bf3f48462f8b3ac04dd98e0e396fb82439dfc2ddb7e7525dcb7b5c5af55b45ac988ca44b794016a447c70a61ab373dc4b45854286a50c19f478265097c87f21d65d060a0a19008e271a5244544dfc1a4825f5f4c6f32955ae3831ed78d32d7192538765e04391a7fb0192dfe6fa5c7f8c6138eaf6a498ebf653de37592f15dc7c502f5ac4449d7202fd4e09caf7bce38f24bc20284a90a1c86d958f19c8d1f2587f0651f12684bc9b30307d9bcfb40610d1c3744e3cc0e0e0ac844c6228284ac24c3820c7ff94b2a75de9ff4ce60bac2432e6a1c420c59313858952ce00c26faf13bd0ac9262a52905133e1a1319457b44da2d2b1a0f0f9ec322ce3bc78af5394a003fac40aad7d16002a53e1bdb5c3fae3df6d9b7110b4a04bf58a94e044fed6bd139d2d160c1d9c1390b443d8e5ae8252350a2bd821ee74f457ade07c63f85fba3f252a615d0ee2b3517945f1364f63e58f39994f89ee38bc7503c981de71b234d97d4e380d95f03a04f9287f50f5002ee9d447a85af16fbefc484a6dca20c12ea58a1fd5ab307fccf83d5e11c5abd0655d064fc81149eebcc30969f392068d4587be3416e0d0ec97f36813ffefa6b911665f9be5c67692d3ebfe23673e22a43581a63210f3e5571e55667e6011ae7170a242c2a122f3889c288080b81be8b7756cbaa79c18fcdca606cc0ef484ca463507b8702fc6aca2fa68b018f5865b5b2e9e8999ad6d24130d61745f1cdbbe73aecc3f62a77e94aafbba5ff77d626ad8e01234c6f690af230995a3a1c9ab4bd2f99dbc85f06c6a1bca71225d46d47954a8c42b8468469eb4dbb6775068c59f18581320765fe3ca43f5e47a8a246a11d6164fb619de87f863805311716bea97171df19dcc98eb498a2ef146501e61057829009de8922d30e8ecb86db0cc980803558c1be466a30242b7ca3a93023c403d20c8c3f5d7a38bcff56a024c2123fcf04048e301484eec27394ddc071cfb4958808084269ce9d1cf925cb00da3b792d5fb2258f20715292dc4ea833d2f65c37ce1ebcea2bd0f3150b31d414da934804e0e63c0be7192265b675da23edbf9e1fd397e0fb94a06cba4ce322ed0a598a0544d163957c46b96250139b5df6090fd1f636cbab25d4b5cb0cd64856ba3a16e26c2b7e54e417e14718cc3fa4541340e986483dd626036b213db35e5d09231741970afc1d1d54081a3fb489fe6d0955f3f4ee6c833a8aec59a1039c5cf8feedc84f47b5366f5014e4d7a08869ca54c41f5e8e61b153da669b2f90723360fc95929d2ce5546cf9a2c8fff38e61975b9fdec2d3f0ee6dc9cac6e7eeabdcdcc8dc61f970f80aa28ed92ace6b59fa5f257064c75a30826f677eaa07d8735d89b834a7548f0a721aec2e03df280f4673cae7f5fd291f0debe69ac825af09628de8489144f53f3c136854f9800ebf3b3af92bf761b3c4defdfec49cc4a3f387b43c59c4d13e41cc073e88c8d96d955050261249f1bc817ad6117f1e837f072b53ff54a5e13274a5cdad84a7fc7e37ad5fbfae9efae316c71f5bd2b27e1dd389145b0c04c5a45184af52c15010e16d9157a5e03aaa556d2d2e2e49b66c9a165d7b5e7a3959f583b1cce8ca92b180ee207d5af199724521ea91e99e3d0620abed19de4ba57710e30c6ac5d9ebdc8a2c87154abd2c03f50211528458b1f2d5515948210c31a31d82f2ac5cbf98c9e64085c8aeae810680f2d962faffece28b3bb939cc2ecddeb3d00b7c62a204fad76359d3e6a527cdcf33b8d9b494d3568c4af63ac9364ff5d869ccfc88a9e6103e1e0d1fa20f5932ce61767626cb02f7fe534fa823c44b703748a78a3b5ceb5cb89e162d8e1149bdb071a51b248d9b0896f06a5ad480bd11d6fe18679430de4bda5249b42995d4eaf0d98b897887fc4067045f5c48263d855612f16ba66c82590c3f022a729cc13450bd6ae594837f36a502a6c18b7cdf52c1dd84a4fbdb55221517a57ecc1101969ffda0daa3a1cbfe9c49ea2925eae2fece85028a392381115185077af582292531065192ad020baf038add78eeafdd7db35abef20a1ed4bc1aab7ff41c6b03215ebb90c597dc37ef12c0985effe1a95652104dd5758a5f9181e2e4bfd315d1f95fe33cc30b1226e54fa8c19741a0de15e1559f84e0b1642d819d5de307bb90fa8f6c6841eb1a71bd15f7a03bcf69388ce42d5ae17953bb5eafd7085ae3d4f2c8521c9fb152a946e2f6f0b35cb011b3eef40ad5ebd3dc8f08b1071cd5e0d327671e12aecfb50aff75a326c17f88c77c91063bacfa565fb0b5905d8537cede454894a2cca0f2ae95e0b0920868ad0786b928dd720b711bb19e8968b0756ea0d55b4185a4cc6ec90e684f7989665b96f4dbf58f51b6af5d0e84312b1a5b15bd2db23ae3ded8dae87e4a57c75a2e19785f12f91a5d0bdc4bc1f32c6aa8bd21468df559bddd0753179c11eb6a2b281df707de32e325c871e9efe0e06fba5ed297c1d4e9cef29dc9f28d83e45ecef8e947b8b00b46552ddf5231c54248e598eaf6e9a07cbb87896bd869052affba1b846669fdc1f87e1f754f979d1fa00ed34f435435bf5d9d2dad85f949c0d4d61543425ed6a5d5db0225f2770206691eb2fbe5e77a95812ef0b6644e248513bb34444d26e1c7aa1b9e10d462057014c2530bb95e9159e36b0bb8445e50b777f82c6ba0fc23c50f5f1f5fb7b87822e3e86e129b396a7d247c13e2b6e6581d664ddedf64d41cd38e79bb34518dc54be963f5e7ec0d545a3f2bd34d9b3ff2c0580b109f79f0c4a2e9e18f762cee8f7d0fa030a65106231fa751072ef2fa4658a3b57b0e47cd4ea43855a0967d5e04994f4ac58a28c79f650bc84dfd93e95a812c00b5cce66dd10b27a7e0672a0ddac4ac9358377b3daedf28a1afc6dd30b67e0d5fe301806f5a2e4896e7ec7c75ebe93a86160807abdced34809be700e1f4b1a03e8120ca39ab98808e8972d3aea8752d265e2f3f382e0b047b1b375ed57d975de8790ee76ccd0a00bcef3a67aeeb92fc0426a6543678e97bdd44612b968bcef3dd6108fbff527bfa972eaaa851d6604692c14bad4848eff4dc05a9f13cbb6d1884961ddffac25c77ea388f846ecd8526afc560ed85663f2fe6a51a27d0a67886dcd223e6b0196c447a210679ef1f10bc22e6f9bc1a453207ff94b6158b93822c7f1d98dd8de8525e8d81b0c1400abafe9c79d5bd805cd14ec93ae11d76d5169e698d7a445ba61c6a9e48959500f93637f1cea23a2fb39c1879df7abd08278640d070c535c8f45cb5946324b3403805a3f0a248f90993d82567ec9c9279055e1e56256915cc324bfd6e94f15d144442b5f7176cd8a74d038b70df5260e5f36edd32341f2d00863f2ed06c5193650f0f54a560ec0161da7dab6f0029062dbf73a435cf431d7a87daae1ff67d78d8d1a8bc7638470227cdf7d8df56ceb12831ce56508f82010847e33e329770e30b403cc0099fde1053d987729c0e3fadfbcf200a82f7e765c0a717395c6ccf80c00d26777743b5c5bbd1c87cc77884383802cf0e69e79468fbe78b4cfe0b0360bf83ce2e69aae06a46376fbae8c6da68eef5ac2d90c60047bba4fea85c10f9cc39b981c10a4223150e061c254334aba2fd070ec1e3b826790c02e4d7b05b777021965a90668d8a70efa8ef88aa62160b80889e1c309cd423efb0aeb1403dd6499a01a0b3d7ede72c7c84ef2e199b87311204a483504f2df016c01672c2fbbb376335d1012faae02f4536f498231ff974d9e97571cb2a56a18e93f61b08de5269097bc433337d712db4e18ca1139e9e0e0f813d3e84e3d898fc70d01e9877412ad433921ce48dacb8267cd0cf7d7c919291b835d6557527dc453cdb5254712737edb384c90d16ea1a809e79369b7a4d21409bbcf2f385ebca8a24a2fc28aa3ed7696b0ded075dbed4868fd9dba241ededa48afd756a4b60ea54d57c7160c847e0569c8ee047173e6236542128845c958ef12222f3648378849727f8bb4aa1db3aa8106d3cf740dbc88d3b3389da7e9e7058cee800cc074700d24898907005e55e073d520dc81b604f7971cb53cb864cb15e4208020ffa9107b56f68109481319cc8f99ba360026ff9fb54bdc46507a9f996b0366aab65c74415de9b2504a9372516321de28e1519b073e077ee7fca86cd8ac381863941240e5c0f162617203d2cb8c7df76034473b158e38c152d3685c21f4cb5d25ade07b80f40b5cee24f6cb6c3d9a4198d6a0033b5589b20d18636ccef01dfa6d648a3733cfd7597a3308ba22ae685eb9ce8d6ed9374163359e12b986610e1d79935116b6ca8e4d202a5116ba3dd8aedd9a6cbc3312a0d6c5d586a85f00e967de88fd645112a206595908b09b2d07b2979e185c830d682470c462772cdee39e0f7725a808314065ecc76719da1c7a725e1d1bcfcc018f1cf73f7ef31b18751d705553127ed4f51e596e743c34c4a1644f395b4a5ca407b274fd799b9dbbf90368b57ea6da279aff4d6fc202ce99e40855fbda0b4d73f0d8b1dc958618c88bd9c4587c791d399263382a1c577cf93aba3091ead160160aa029c4c257502131aaf80f68184cc3a86ca4994d909806faf54d8f2f81f378346e2c2c2934711acf016e129a0ed562cc854511141ad792cccd1c6ae4e2878ae6ba0c0c2315679b62fc8650c652f57e6183df7b26017b016c822691a2555383fb5de63772a99b0f65e56b91ffc6f4c56a9f52aa03d10b29a77df905782c9478094f6aac6c6989ec9d0f4d36324951010dd956446b78410fa98d0a0713f62d143a0db0a25e643dad111778b6a9821fa3ba447ee92a3290ab0d62588d6cde8ef1a760568a2b820aa445d47cd0c3877e1d98c2299a0150e1160265cd0faf20535457ae720e1e2ed8da4231cef03d0ee00dd5b14ea82cf1f4c8932e1080b269bf56cd28390e792f0c006111ea842582930a36cc765b3e314c97f548af1f22e836a37c255282ea56712536c995d70f51054ec860b7acb7d6632083c062aefb4202fa9ff659fb4be8c78639309f2a774d31a1f741258222668ea2929dcc92a751d62bdd05ba49248fad1211947f94687498757f763cced2a2829cafbf7e9f152d7e63885ab99294f019c44e548c5526c8cc21da7101cf451d7ff881ffcb23e405bb0b0c84f39db3b11f24591fda1a29513ebaa92ee14054fae750a872a09135d06f6bc46a029fda0e1c7fb77b9a8da3f684ea88273b0b7a7fcf4c2b24464208a41a4d661f412643789317da000b810957d897ca9d65a567c4a968005933ab326151bc26c8c673f562c65291ad0acc51dd3fe64086f0485982f411cd9fc07e6e5b8197098e37c56cddb3f97cc2b4baaf7b1527baff0d12698ff4e5d493540a1f61c2daa18f4f9317fa0439c414d6f8b04d782041ec542ac0c51a9f80932d64196be1de036eabf8cbb580ff352ee5eb0e44da231e15193cd47c10a6e71eeba23801ddfe7554ca5c6169afeb272b6e48be028eb3592310d0ac95609ed104c23fc8055450f18a586af20c995e61048ef530b0ca904dd958516bff03510c7c20e24926f89c37e0328b6e02e867db4e1e94aa5fa9710ecdc327d0b94f5ef9085b2f1a0243aa58d6e903a4d660007a4ad357dcb8f90e1fd4a9cc386cdb2cd67fc187bae3a943e869b50653551814b5fa84bebc7e091a37a77b281c041df8ffa48c0af4d0d5d60f40adbea2ff17101190989284aa8d3a457dc1e07cc6d381fd44fa53fe0f406f7c095d04d90cfdf84eb4b0e787b1cd44f5b28cfdb3a940a5aa52c93b71d911b71b45f8da6bf10bed6c93876b18a15e1991eb129abae8edd2012e25b4540f90ded72ce47c8025a09c28d62116387e938ab2c0475c03f5740f05b65b73a394b708daf0e144744a12171d2ff67ce169e1d9f099bc749e8e90e97ebf07e249a8a5a0a00f8dce2105619e1392d8a4b94f5368e03c7e390d9410ebe39fb430c5c7cef56f35c61fa01710381cfa8e6f7b8a427bf4c957609f3c4588f7b6ea01a939e4c68d1ad08e201bee1723d64408d97c42e248397230eb9acb7d4234223fc58c96b11bbfdc7f60f9346a4e3b035c6154843d4e49a358efea409ebf1eeea3297be2b9b1a32b783f21cddcd40e20588f53e8612ca54b0b6a4a86e3816d31b5a039be749125cf411cf9fe357991c992726a51c82365d7b5b5022e99577bb13de207880d3ae28ba4e2fcf78612cb5a133954f7c249e3a9fa73abc8969d8fd6b63ef3b39b2ec3552567510665c09406bd0b58853c0d68bcec33454f35009430d6daf0690fd6772b5ffe6f8cfa0a4735abaa00c4dd3d0b99f3a8b52a068f791e113331b28d990f01b3f775328df1b126b2c2d7336d50350d111b3d143e68981d15b614adae1339d34a7e5bedcb8c9842c5f920da8bfd010561730f95e0f65721ff8dd12349032f901bb0461a2b803bb5ced5f7f92b24fc9a7af3a26128bd2e93b67c3e6d1e11dcb3eac7c19092980268a7cb49c4df376d011491fd2ad24a0c9b3d14e93c4cb47eab0b41e7e52925680d55de3129f96a381e5538cee83067bbffa7d2fe47036d0981b67a906c7905f11ae11ddffd7f62565244db725232dbaffb8aee7a5d82e04120cf0949fd0472f12a352f84e314bbfa956da818016b485f57e1a618b54c9630a4dcc44006f40b541c97b18c6a5a9df214d2f355cc752abe664a370f7c55c8c945cd36336fad21751565fad9f69d8bb4c701560bea8cc44ef9ac8bf60e5858fe48bd37d568d77db896e47cd398c9b3ab744705fad9c8ff3a0935bf3690009bb814373ee1598ffa3dd001fbc1fb984b073e69b1053e8a197c948b5202093191cfe8919ccfff7d7afe7119a50c15af51fe89f011a85d8461185337115a4c23d67bad780ae93d79872d2912ac1d41ad7de59edd466fd7cf124742b69a14ac1a8829769f65a9083c7221a23971c7b4375d271752b433fd67de285ca7662e2875afb01ce0b799df4da97d76dc65288a308f3fb6f1d243d239bd829bb93a4d836e3a4149057908929d88ee0034c20bb4ec4337cf0e9ec94458f03c359efe211a023e4e7478c97538bb5f0a3ece558461794d16cee779a7bce0d412ca9e1d1e9681bf278b1e38ff7c283e4a1fbd9ca2aabfcee38d8c260a1759b9a61ef3fd984bcf923343a092a894ca5d17e9fb02bb653abfdba3bdf910f1f59c99f76dd16270d1b78c35f3498fc09af1c543426ff24fbdea4d21c415be0784e43971667103c2511c128084009359e65dd9bbeb89e7f83fc23a7378f0d475ca156227dcf42c1302363811ab72c652bbc89fd08405602f78450f5fd9e4f8fbf18366a26250d6aaa357fb3073f94c9c11ecb25bdd30d16f4c414de378a799b75d1dbac40e2ccecc5cc7382bd13378c34ffc48735532364f1a31bda8f20cd901dedd2d9cc782f0ada5a2b5b6f06214de9842c9766fc238c7a4fb1665bb110554f6f034b24f2d4d98d72586fb05e51215dffc38dd2a4234fb3fe2472a79834920a5bf9c0138641a8941ee1872590b159f5a844259e82fea0c08374d32e67c46e6d1e542cd73ba6b7f82ddd065f0cc1f5d86081effc3b19856816c799d5f7784f8ac23cb36ddd26baf78d5fd259b97afafe8520bdaa6bf169b055e267f2eab1eac7ed65dd8c78f285843cf31f81d2df15c686c663512376294945203c2308a3d61de601e8a5c70c8d8c8e17675f5fc34c77a7e50af2a008983c8e3995d44bfc38ce14afce361831fb2cac9aec253ab103f17a2b0a568c34eeff88f7dc7e0ad34f528353be30cc600ba2f0fc1075ae1e015a5b3055538ec98c52981b5da24864aeb700a331832b79bcd5f0068418054aab32fc3f05880dbf0e8f5ffafb0b3a48493d816d12bfe9fd257b0f998bcb9fe58f5e3c940871704b69220b3d2d963660f0195b129261edc186b3671e42ddd6f6c041a25844e7678c9b7a8d8ae88da5c1c4558dfba7c3f72d6bd43141bb50517edf210120fcfcfb2d7d0c1135f245c7f5600e3e637a65339f9248ac29792563ae0f530698265aa2d6dae76ce019803f37a308d47abbb2efc1df96c6184cb191caee1eac1ca361e801c06f820eb5adb2f51881fde3546882c965f11e50806f182d540b668ecb85835508ee55fadae1cd2dea1d8d6936d6178aff2fe9d4615d2ecdce9d24181932868efd68642bd3d6711c767485a180685d6b5acba285099f289c63aedf2ac3752d90f469d06b03e4206c69ee84968d02308e5cbe6b1b6d245aa38bd195aaa81c9444dedbfe6905e2e017776871a47edd3d2d36943d3f69d4d0ad8d52bc0ff94a8b6b3b726d29a2d8ee6fa6c0c6aab92b42380ab9eae952b081ca4b2a0ec3b44802bbda45cbef4391361bdf5f3f0fb7c2d9405edfbe2bca6b0132691bdde72a8a623571ceca3cacf5cbc001cfb5ef6a2de43627560afcf0cdc4483d6bc6ea0474c63f52e1cef3b2a86b9d55bdfd5e9bfb5ae1c9b422dfb1985e992c8b93001dfd498ce6718c388d26b5fccf6f072e11164f45630dd36d0c1995dc8291647ea71ba149b5081b3c2a518e8a327be34805cd3942636829383c92c0833abf07bb3224c8882685fd7fbd584e9c2af03521f5c2c3531436c868ce8e3a12dbec41bf9a3987a73a94ead608349ca3c9022c0fc22663d056160b4827e27e3cfd36df702adb002e9e952132febdc76a1badcaf093ae24f7942c1f2237a6abd77a116f3da5484dd22686b3b9927bb90f4b34e3aee511f6097216f508936688ab20edebc0a575d2487240a0f17649260e4b3ac247f4b888f2ddfed5c8ed4c808f17addbe83c86fb8151843d31e5cab3047853f9ba0401d4e6e516b2416867cb57b79ded283e875214ebe8a8259436017eb3c9126e7e6533730d7c151d08557315fbc5ebb0f86d1828afaea1e940e9b771ef2d2df14c295caaf3e0d2dd9f8b7c4685e1c3bfa414e9ec68fb1558ccf890c8d2a6eedaaac35cf5e3130f15ac657db8234689a60deb224d21708bfdacfb50580e936076b47ef201f645b3c40576ec6f90c2f99395caa1a9ceb580b7c13b4187b09c6a59eb71e9ab1f4719ce87975a2671a41e63099ddeaea5870b690b0a7a4e41dd3ae7026c3befe550e1de50daa75398c072370927fe8c199c976824b149235b2678f43af8423c237d95532a6cc5419c7064f0822ce0b8324850094ba162d0d88f4635da1cea02e63cdddc37d61a010c11ffb10de57dda994e476936639024bf28d00c3259874373c4a9b6e726265d6ef9b9ba8ef6f9118d2a4ff246ea2e7bb0ff970995d292b14838be52ffa0b90544347533642731c40c477194e2d42870ed365a65cd9166e61f8241f24681acd65d25cf30625ce131325928351d5606c3dc1d61c2d1c01530ba495f79f3748780d44c29f14b67ed3dd1cd0a3a39031f76a72441103d61a2e06a96f7fb2eb3e58d253106e65c239d57f1489bdc5843f28f7e0fed45c28d40cf8649d85b19f5175ae183948085b867fb3aa6f63980f0bfff79f7e038e44a59e3f78a6e6e36e0d2dbac091ab5f71dc923ba1b39aba80742c3c72d55bb7f48c9e4621a74073dfbe44494c353a88e85bf9137afa15222b5acbd3e06352e38feff3fada8af6ec5e256ce4bf064b46eebc4552eeb91101c939fa476d46ad340655edce56d8e28dceec5fdd67c0dac1e475a3f61162ea282ea881524937322a68c6511748b1644a058f1b1e352be4ac3591a17599936520bfdfe07ac20c51c432aa331e260fc2d5930f74b02ab878c5906103cc82d10aee5001a1f3c49d3679b5e5608b0e56eb01009d1776fc0f1c1aa9515ef6a751cb984838c2654299181e8830601eb3fe2fdb7da83e144089e4f97c3a79149d715cb63fd1e22d440d2b0394ce400d69661833423fb5bf4cf02120ce0af2ed0496c30a430d140148b413b3ff626f46e5a0d940b102be2b191434edc61ad5b0e274bf4799b9a7ea63d9fc24454cc9191131c323f1528f2e82916eb7a0b667666d113f43472eae6d51b7b6314d6d35c7b51d536b8b21a8ade8a9adf5bfb633756ddbfab58d92d7d63aafed3dbbb614716dc5e6da9acfb53dd2d736d6af6d9db8b6526a0e6a6bccd596ea5f5b09a5b656b7da26a66b6b22d7d6daa9adea59db63626dcb8ada16d16a8bb9d77633515b19a9b6d8666d4dffda5ed36b1bd5d4b685b6b688b3dadee9b5b551d69634d4d6f054db93a0b6459ddac6f4b5d51dd6764caf2d86b0b6b2a7b616b588d756e95edb6ca6b656b4da225ab575be6afb4ea96d4a51db02626d4587da8ee76b8ba2d756dba8ade95ddb19426d8bbada56d06b8bbad6f63a575b14726ded766ddd3fb55d116a5ba4ac6d81505bb15b6dd3f9daea106b2bb76b2bfba8ed81b6b615bddac6d4b5b5ddd63699525b83acb676476dd587da9ee4b68d9faeb9390071fb801d67d6f9b60ffceb16e23abdfd49f2f0e2438dfdef87212404ad7e0e79b4faf33caeedcba30bbd167b68fdc6101ffb954ad4c25bcb6b003a3ffd02272f76562136b262c6bf157c91ff9d248f67243d84bb7e07d232e71ed73af0f7d77050a081359cd393ddce826afb72c5774f1649d7931cbf5245c101af0f5eddb34074bb83e1e05dc374d22f4f03bc7530312fbd60472dc62bc528c7adc62a8b298eac8daa8aa889af8e5e8f5c8e5f8e5d8e5f8f5d1e5f1c5d1f5de5a6c727b50c71b958b717893c98568cc9163a1905e3b590cf3efcfbcc84026f64d0d5afeac10b0b24e4eafe3440072a434d8657b6d86ee23028357a44e6b45f91c5b024fe54435e2c1619020ec86283e6e6aa2c16d0e3439905c8da4cd2592cd4c6875db4803e2ddc95771ed6c2ac167f2ab61845c5c7da16601c99c06e31d08c950197d202507471610051ee948b14dcd8ecb9600bc7a4a98b1573ac20bbd4b18e81ea5db495c4f3808fa017d021f0f2f6a29c04be4ebef4468703ee0b6379f8c25fa4b7c08f041896cddf938191767b1f5a30bce3decf208c6d0258a5c2d47680211a46b5de7bd58769ddf78e203178b70486568a696df106b918a641dec38c1126761f431cc3a2c77c2abbe7081979b3fbd823c328c7bd5e2623c37c61c9055919ada85ce79649d4e5f67a8d24de6e7d7eb71c89e1b5d35224487eadda41c90f611b5233217c443e8119f6e95300c809cd798ef0b78d87024b567d4aeaf460796bac291d5926cfb83b3beedea3e0dcdfa3ebe39828c86d115200eef73891b34a6b2bae45c284e4479af5964692af7f30a952c39cbf938b8d7828782813bcfeccd3289ab45a6b46ceb0f9b5769353f6cdc73939ff167372cad7f93b69673fba31a9177a2235f4191ddf676a1950bed840875309fd8d154a9687e87349a25d0f4669e519fd5c7eb4e90b29d4409f939f289da8bb54b983295ecca6c9c59beef63d650afd34b956d4dadfa86061a666d79c5a7a51155458d5c9f956bf86ae12cac6fab8266bdfab564a195b7f17726dfbe74a2dcfebef62af6d9fc05265059b5d456c7ba4abd6056499e2914d2e5f766bc92cabe8b3994bd016fda60514a13677e2daa7f9b5e4d2dabe8e6e3bb6f5965fe9dbd65de2ae36c6e5ab30b7b9d9dcdd72baf037d4ce3fb63ba7e4aeee2a5e7c11797317ea5ddad7cb2e8c6fea62be755f7ec1c5fa4d5d03b8ee1130b0088287b309fe4d1f0c01e4fd98a06de17b5c6fef859d6d8b27875d99af6b87d14e2306af25f1e94cc5cff6157357c4787527cbb83126f12712173cc57d60f1a8b87843304e9a8cef91c665b67115723ca01daf79ec71381139158d1cc948ae87251f539343f1c9058ef235a0720c59b989583ecf5a0e862e57e9cb0718e6683ce60e98f992d01c1ed55c66369fc29b0328ce6d38e71bae7324e0b99ef47c8c7c0e653f1720d0d768d03158e8261ffa3c283a98185d45471f30a4a3c1a43b54e94bbc74f89ce93e992e89a79750c880fa73feb14d0b4c16db876fb9f365abef54f75d9ce457a6bfa0fcf7c116e0fb6cdb76602712ec6fc1fe53835ddc44d8d1df85fd74d8d5cd871dfd95d8cf8a5d69b1a317fb89b11ba28a7ebc7afd737bed6d76ccafc773b43156e112974d430651e4af8e7c4b4a720f7abac493c345f9c5946fa972d39b84a16f84ab5958482ac0ca44f2268d7d63981aeae73b57f839132ede7cf2d6e30da2c5267f12bebc8766a898cfabcc68d8c9479aebdf30265f4c45d7b04212b678efad72dd48a660c8b8c84682fcc7b172f7da82b5320a6f329267f33fec5c76ab501ef050b2dcede158e237b82a0b3172c191e4fa178ce417abd405f690c22dd67b8b5c1b93151c02d7b24922fb718c5c76af500eb0d0b2eee6f1786236b82e0b1132c19372f557cc6416abdc05b610c22fee75cbdc1b90153c0257b24826ff38cc5c77a9501eb050b2ecee795c623701d716a5e606a9ee6ffa83d1237941f42fe8d90f96c68d06290905642e50c72e12101711a2d6d1c18a8675d2d0997db0b38248e7422d87e9c6d52e7850ee35f88f7e5ae9eecab5a6da5b52b2e52ba1d2c105ec76548753ce32c240eb70052367ec402abc5d178f04b9a0d0374baade99e876e446ddff72299cb19092e54052b29b1a256b2d0e6a3953adcb916a4d0ea6b902a381ce3d70fc5aacda1def4e7752712025b1f111b403c7dd87031ded9ae7ec76f3b036e966e62788bc793d978e23878dd9cd05741f2bd183393769fb1c2d454df488cee6ac6491c78b318585f84c525e7212dc4bb67712e3582ad390a3477533d5e9e5fa93bab27885d34f4d188e248df1cb27935b428dac5d534c74a7c81f5a2b0ffcc6792237272f35f480e7e14b62a086c94a62409dc2d7a966fc279a5e2ed9130e2c832f1d9f1aa1d9fd74738b79b83ac5ae41bdbf3cb8200bf43d75810f54afe85aadf19f478b68d1bea716ed31350b5c3b757f7b64b12dec7eca721ea54eb16b53fd1f8f2dc0725d4f5cd003d42b7a0d2bfee7d1a25aa2efa9457c48fd45d7bcde9d1e509cc8b89fb2d81f8a4d84fa9ce5a7638a29b8492293cd6abcd6b19ee7d1a259d6f984c5794ced22d776e5df1e598ea57a9eb69887ab53ec1ad4fbcb830bb240df5317f840f58aaed51abfa165b8fdfe7269a0d2a48b31106c45d6c7ae3e1f5bccc3d59c7601c5fda5e01ad9d0efa30b7ca0ca1682ae582daf588c15f9a63d9efb3c4aba01749980d0e7d12a90266b6ed7202065b980d126106579bcade50873bbd4b5917a25562a05ecb73250ea90669a3c501dd04c53049a433465c20173fc864c7d408ebba9a90a88633764528173a0a64f2a308ed484c909c481c1fa89b11f8b2264e0c9b63042ac6819c59f9b8cecc76474683066c7c66d02b16da93900b3e510a33be3ddcdde86b1cfa13302b77139b070a6bffb605c216d03cbd9e6cc39c35e7cf8a64dab2a3f3ce83b2ae3e7ad8c5aa72ca326d9c4aa4279b4d1b17a675e206b37e398c912fe80e5e43ab66cbf1c970481f31d8fdd9227ee7002e664d03e77088047a8e95cc775861bab4ec650db1ad6949a7b84765cf8159d42bda5009b4002668bd4e944abfc820fa75ee74331782e66c5bff5184f8c5eca9522f81bb266099c7406fbedade119f605837f6d89fedf11a1813170c44bfc4675e57589c95448c7d5b24be8223a6f2960bb0eb30d8864d4cc53a440e0cf35a7f198475836f5ecc8416e20913f8ca0f9271bf616cdad0fb8116028b5a45aba0e0dfe04e7ab5c76b7de0b7a8ec201e5b85172179288f52e7c29bf0aa6ca9465f3d4c5c3e65e15cbe6e0ff410fe838a4141f49fb023285bc745bb63c30b2575d29dffe4ef80509c794b0d2714b98d1275cf09368235c95489727a39b07c5b9ab77ddd3c3c33f9001bc1a5f1a6f84c912d5c27a77f1241947f5ae3af8ffd0533404a9c7c492b51043cd74e349f9453025a7971be70e1e36f3aa28f723df1f408299d60033dd537cd39b62d0b17e115d389768f3091935ae6512fbf660bd58c69502cd0aadcd91a78332fc235f61dcb0e5b701016e9cf69db0a4e5999f1c32383e5393ecfeba9be3bcb6ccdcfea0d213722e0f8bef4179b3cd8ed082dfe648e5f707309c657d2dcb7e304d2c59626ed90372901b7fa76fc958cfbdda5b2c2645783f019b51bfaa5b9e9b5876394ffb344b84ee19b9a33f1441eb42da8800fb9c507394f927731d95ce8c2d75810401ab4590f43dd4f0327e4fa396221921333607884833d0df125a52d2e6e1623eeb2792ecc3828565a25c73012d2bd3e4970b6066b61472ca1d56afa1e4abdbea5b0247a4efc83005ae0a568472bd7100346bebf9ac18e6c240b1e6940f011e35b758a3f55dddfb8fbec5f461d291a9bc8419c8844e999895a5505c59dcd34a47141409eec4f5b56f63b8df7007a20b34c0720006069bb9e82c892323b6384755bcc3467a4af7e9e4ab7035c907d742a52c630b174c45f8c5b6229a0fa57801dc6fe0b67d6e58fa9aa6d3f5cae5e6a849474ecebe126e630b62729620077a747090f7d3fa0909176889301e51dd1c3de78aa091fef42906042e3f8dc41b5a0880e58575bab32a1900ef46cc8614e49ea54e1422d39e4466a8ab420dd88b0e68c81cdb6877b69b167ce1c39d754213f5165178d3d0e84a78e4f21d0359a408d55767679c2781626ab4b1a6249d56838dc21125f9038baedd2d9345901dea2e4c795861098bfb3ab26d6ac7eda9a1490e135393080d18cc236c4426e4f16b1b23a5ec0226a336e97a439c48a08b83265d09334bb9c70a03f944e613dae7d45201f9017ede612a3a1912824311327e6aae343db03af111c2b7ad322d653b883a9f76125eb02fce5d284c64dcd4589020ca1cc358c685e8f16abce4ff60fe80981d9b5dde26cfcaf0e7fd2b12d56a399baf0144e4329095135125364cd8b15564a357f68e5a078f6fc4da44a0276f395b931bcbea52e53217701378159c0b03fee6673e0b6fc7b5dc53f82807f62039a3a80a859a11d6cee526a3963144a973a6649f531dc274b64577112b5191ea742b9a81263512a9f4e35d8c6feaee021b8132bbadcd69bde5659e5ccd24194a325b766665e70e181d3e5d89d06d4a1d7cba5f8644ec66c459acd9e0669bab8264d24e523a9e59086c658a80d651f5fd76a04a54f9a4917460bec06860ad692ba743e5baeae94ec21167413363cfc39887c9ee77d173576270ba366745279f81c79a8690e8f4a7e32bafa71dba2d3ba3fcf77d5e4779acdb157d38f19f34b71053a77d1eca7425095924dde450f3dc127db46a989e450f1f67533fcc72f980afab6e06a8b198defe1a654adf2f065f48f2e74aaf51dbba812b7074b1edcc8f48101c3cbc638bdf15309596c0ad50eaba00da08112d7f16b682ce6734313bbafdccfc98fa395704fc4e6f5d01307ba9c3025d2b2c5224c5b7b4e03cd871990bfe6a5874204f88adaec440d2aa1c2d9bddc70502d86eef939b67414e52e6752e4bb022174954591c162d7ac4a22a6a393be017482bcf894b72d54df53daa8f13251e1d1825f5119ff65c589f4936e6babe06ff7810714cd50460ba2978e1834e3a8b7e23ff535907081938f445ed63e6a779575ce7d75fe69417d445636d99feaf217f11abb8108dc392a96b7515ff35c5eac8d3ad32425bc2de227a43adc44f9dbbdf50aba1fbb95e6fceeba00d01f34122e262141e9244c842237f6df9d602e63112fcdb522616167b49037d492b4130b5c94c5d01cdb7960004f585b339abac23fecf24589d91733bd37a1b82c655cf2f2943a787c1bc8c2a7d92090070ac9626ab9e1b6d82624f55b1e81185e7a41ab27be9327909d6f6e229e3fdd6e0fc7b267cd4d18b1210f03f6d874e00e44be8b0aec738929304cae3380cc27500d1e3f6488b4690b4ed9daf2aa003a8a06e9695d7f6af773e922e948f004788c111407fa0a2c9b8a9a0a2d6b95c78a5054b7104f98e72cedbd10c8b8aa12aff702ff26e1d40cc06f24727911bab7c9b99aa75f2d637f3d70f29119b9014ce3fdc09b422216aafb748bd1675d9615aab605a610da197aa7d44e60a90eb42ec41d91d311d5aa6887b541c10680c5040e184d882ca01815c8645dd27f02c797cf0ff70ad64949fb640f3163e33b88eca8c22242d5ba57064e06e0603143d26b12ca3c6ced79f7c9be170376b3006bc024eb67e50bf2282c057febc6c9f4114304d524fb49b8397d7b708f5e8b056fb1d74955cdd79ce46f4cf51bbaa91b40aab5238f91f7d22a8cfd0fdb9215affcabebd550e21811ecd83dac68365672c5b81b35e46117e43e0d11b79e39b53c4465b5f2826cba94914c088d7f8d08c64c84ddf913e6613774b9192cf7272599c98651024ee3f91a2f0fd10362f0bf5b7b9d49a3cab85441c175a0ddffb79cba49a001a65e3cb6678046511395dc8beeeef33445437af70530045897ab5ff9ae8eb7353687c0cc3018ca2027af431665d40ccba4a07930dc9c398e051a3c041866d1fd0d491b81f53b027ea804ceac14fd9312c831032f18f0f23c41fd8a4bfedcd66dd910906cc5fefde219b40b242ec99ce79e584fd166c905bd88b4a28da27224424217bef2da59452ca24653d060406dc059c0e1b4624243f5a0ffccd78a0daf5553b54bbf6c85ff1df709bbf991df5f1f7b01f919064d9d6de98d7536d24243fbb7a25a8b6f42a90f43c19fdc82d424b16041501d102c267005cd31314578c81831327c0614a163a6647241c82d882e02084435067f19dd606a519d38f129136a00d5a2b9d51b47cfbb5d60aee48e53f01a2162dc61af7c3fad4d61a7746a768af482263fb4fabc5888361c38edede8596bf02504c0647e7427756e8bc2312d092157d7744027ae286a21a6b1231d21721bfe3115e38d9f8c8800d4b5d9228010a8208d3642e01ee20c39e8f818d007644d201ccce7644d22116c4270d49b63fa501891db3d4a0c314403bdb9fe68663bf992e294bb2ec2865c9d19e6f87a4080d6dfbe4668fefe7c7c19f7dfeeb652f677fedcbc9d12981c708375e30eeb3a71f8ef69bf63ade0ccd5eceeeffcdd01466e84cbd0d2af5e5e88f59b3b24ffb10b4edb50ba41ef53394f366e8a77933f575541ff33a2c2d8b645aab2f47ba828a5c2d191423555a6be90f659005ae0bbe7b1d16003eb2541fcaa29897b19ccf21c2c95efb1c221cf9d9e36c1ff3e548d8735f4e8ee4be9c29bfa5ec952d693294317be4b937f3d99ba9df0c08fef771242c8aa12f5f04b55a2cfd314f84a3fafc39bf7e9cfcba85933fe6cbf1d6f42057fed05bd915345bb0d86cc16200f0ecd1acb119cc635a385babf7cf21c2c9affa1c221c99cf3d1bb0625e7f394438fa575fceeaf5abbe1c221cd5eb2f67f5f92bc78b3e1f9215e32f2ef4221d967dbdb68faced9ba91f0f1ebcad903df2299a955fb2f273af7a221c4d3403c2f6dce36ccfcddf8a70b6577d3973fb6691fe82260c1659d987d315cea014be19fa85907ad4a7be1ca2191ed9572086609f62d8c2061b945a2dd6cce97116f72a6c8ffa6642c83cb4f9338ce8c85a9a35f3c3f9daf367f8d091359f08094209259a5a2d5664715f0a2a6c5f8b8b1135d1c4892bcf5fb5a021c0f3da91ca0ea76785acb5427b5ad89e7686475cda7ab6666cd6cc158f8eac8c25773863b715a343dd82211a7c7e50faa16985bd2b74a837c531fdf5fc7befc559d5dcbd629cdd7cf1b59e7f9d138a46bf9ba2e9cbcf316b5a963dedb3a77d5bfe2cdbdefe96290d1e00ea3e75621785c65aebe3d7bc1dedb72cfb42126cb4cdcbd16169d96b9aa63da5afd11434fb9ab54fe360fd6614d1a928e50b951d390f521f265b42c769012d6aa41cb68834e18cd8ae1194b123cd603218d59e2500d8f135ce9bdbcf8fbdf3a97305092df919da8c1cacaba35ddfe8c91672b0ae86f64aa868d728498076d0ae5d4c46cb6fac1777075b75b0b8bb2fddd3ae6fbd95cbc1baf28973a5346b2c9d012bd29a7495b45272ca5287d8e1aa69cb5c29cd95d2aebf4af21b19a6f932b05ddfcb3187a462bb8355bfdfc1ba26192e19405e63e6d56da9b2ebc73164b464f4c8f0d9b58bedfaf8c2fc264cc598fc46ae9a4e48b2ebffec3a130297824c2cb2ec4bd30ee6a1404ffaf3619dd3ac41bfa529a3b4eb6b335fe8b083b976fd1553572445d30f655ebbbecc13fd6642a029cca79c08f39379fa6470d00e69cb6fba1d292a68069e00543bc3a9e727c88f5c4c924c199728fdb425cd69d688ace969b059a30d71b06e3d0e569783553a596ff3f9d980fc266e2007abf6d6db3697dfc4ddb30dd9b423ad71d0aca91dac83ed6abdeec9c1199cf9f4e997d37d9a0eabaaec67e18a6907e0b5295dd141483f4cbbfe56a46576c5b4cae2372e447644d8c1e417e22d487b92c34983cd1ad1c7b79e5903b3ea6b4b5303dad5c5a4bda690569441d1beec1a2b18447bd0e1fb87e00ea19b35753ecd1adca7674dfdfa91c35b90dfc4a60ee6607dd8d0f64493b28355e9f97730bfb933f7da8af442d3ae35176d43317cd9750bda35dc8476dd5ebbd64aeb5f09bafc26ec7eea539efab467c8ae149c5f67c4be259062387aaf004f035ed9f287215b461a5e23e553f9f5903ff70ea73fe7cb1ef2570e7ae7a013e930b569fc238de47648ce831d28c85085bd7210bb27e30a2d3f66493acab924b120f93049f7efd2c50ee98ee09c3e7fd2907e3ebf1ed34ad1f5bf1ef3e7ee41e987a594fe059211a7a2980f3c1750cd3fe05a4cc0742a73a4316bdcd2fb806fea01b93da0ad568ee07c9fdc8eb9e5cba9335367a6d28104b4eb0ef19edf440626039381c9c06460323019980c4c0626039381c9c0a4b22423a32c298b9225c946d44a7dba7339fc4e13423c53ff841b7bbe8e7b33f5db11811ef367dc80a2b6ff091ab5fd5104d85ad4e274d077b59e0cb3ab17aab042a53de27b7ced18c36c8d6eeeee78c6625f21930f90556b69f9f7391adecfae0940807d3f1308b02f4a027a9b2063fb9a2061dc7494ada92de69ff77e7e2c39ee83bac18edc0e4ec706fb7e266cb0ef6b7a9b92faa4280ff8fe80dd73870543b3894ef3f734608c397f39cbb28c6da62bd3a40d3ab4791b1bafc9344dcb7274cf7227ce95ce79bf8f3a68f1c5185f4b63ec08afdb96e5a67dfe4ddbb64dcbaead328ccd3f0d18b968335bf0cfaf23eef8338bf3049afdfc5527e38b37fcb3cf83fc9e79feb07fa49952bcf85223befc3981ee551733b032a4ac5c0e99ff7e98bdf6e1d7de390fb29faf399743cb729d1f69a896d8a63fe4ab9e87a7eddbfb8cf3b5b72fe5a9de5d33c43d5a7bee4312563bf5f147d093db213de05ef585a9e7fee9a6c377f517f4e4c169ebadfad99a07a6baddf01be7416967aff5d0b353ef9fb71b38946295df98dbde7239b614f785ddc637f0e6e1af1f78fb4e4ec7f62a6ffb42b955cf71aa0ff456bda6492ef58524ec14a7c3041966ab3e461adc075a8b7b4b793db647d57db91df2ab04b2d71ee5514a29ede1affde4766c5ba745d3efe19ffad05fab7e879b07fea9df2a4fee6ddb7ee334c96d9d137adb3c7fe776f86bafe27478333bb44f7deab5d7521e6ae7507dca0b559f0462a4b17d8c34b84fa5b614ea9bd9c17df6d96fdb57b32f7bde8d31ad8816699e860192cb5f6b08eecae5bff7aef6cd59848f878312a7478771297f1d7cb947cbfa25a02079bc46648db1b9ebf1705096e0a04df66ce40f6d18f0d9a8efa03421b5ef834d3e4033a8f9563d90ab9e0dae7e51fb7b2fc68fe337f351dff685abecb3e1372838e7d9c89e4d0f3aeed086c5001b39f2e43a889bfb50f05d65cd397f28c8adc9adf12821d42e123a7b1e53040c84207beee23e13eeae380e4a11a4cd1afeecddcfbc1368c69ff3f09b7b3f14e4b65f0e2a370e5d45a7ce071d6ad78e05d041498e899191104741045182217e8c8c84387aedecb52ceb664df6f1b5e838d3aff7299d35d39cc7c14c4e6ba7a59ea5540432cbce32ff447030a3f4abfde086b71ccc3ae06096d5207c5e9325d0fed572ee7230fb3a84963f7f520f7f85f1ec0c7ff6e4156f817e92e9934b0e669f5d3a7b77cdece3b4b5037ec32387f84d6624b34c8f6067a15cb2b33176a6a46767493736abb2b3cc5db326cb6cec4cba4bcf2efbc8598cb58e33cb7ef39756124410251802bf965d46f4971859f67cfadadce6477d68498dfced15bc3de7ed708fe2b14312e21287e25e4a8ee3384e04ad4db989f1df0fc497db319fbe185b7601767c7da1644bee834a3ffc3c1cd40077a1431b1b7f35d259935452a7527eb2c941fcf8352984beff4f6b953007f1d7236d5fbecc4ff16f5e28af6cfc999763bee6c924dec2fca410fe4c44e39730afee14dbf01bbaf1e3f88d7cfc18182166c0237ba4cb6ff26771bf5077a11ff69b78b4c3c8b431f6d91803610d3686cd1a8c5f9740c326c68ea36377a5b0d89fd961e7a69e4601fb727b28c36c1946fa3bf7817df937a64ced8f3a3875a436fd4c486d9d2b65935aabac5fab3ffd9412b269d34f8cd413122a549018226204114ef80842c4d20f2c2e3099e0c8132b4236b0938397292ce850451756754245ab7ab23064a451b7b0a19174806d04ec88a4c30fdad31085f8f1e7d7e3730ad0ef8b3a50901bdfcc241a05df12986fc244c1f77ce96044c1bbf985fecef97b146dce786da5d3294542e347592ce3224bcab86451b45812179e699145c9b8645cb22c322e99165916aa9ee83de8d779b4e596483d286d4b01fbd50fa907a11d77dcaebda5c5f7b40a749ce244698a93d78e539c14ed104f719264c7294e7c76dd718a131736b7e314272b6c89c30e045a7efadda79f04e30a18abbe0e6bc3997dfa3aac59058ea73b1bb2f7d8034f30c58d0e9e709f459cd8c243c62b5bd624b476c36f620d067460038552f9f17a55b163b6e4e9cbb7316bcccf9cd09d83f28f884484d8f18b9f0932cc9e5000d122a3133a7e84d198166932ee66de0c4e96e1d04d3513c2d47e7a0a9904faa941bb7a110909d08e015c741ce9f418a3cc284ab730828168e9884969a7764c7262c8fe3b39295d24d9514aec69dbd8518a972c5b8a962c1b013b4ab1e2b5895e47fab3e1ba1f7477445bddcdc09a4e667210671db5c15be5727440e8c8619dbdfccce58f0cea7ed071d79964fbbf9e86947644ca21e62eec88c4e488a8c815a3ec8834e4b48798a4d096455d12daf1eb9cb37e19fd5367acf5cb783b32bf8a8991f9b8f272745832af3d6d7a312f23f3edc8fcf462be104799fa32d3d3affa1baee5193a3e268166dbec73ce39735e4802d7819983fbe8692f85f234f9947dd072d3cf41aea3e21a109594520a45eba8482925f676f0e77bf1c78cef63fcede0afdefd426c2df6c7d5a99cd2a54bd1ba2a9d0974cc9ca7ba8fe1a0f33818bf6b32c676e7a99e4c428b28295059347530d2840edbb5c6eae30ff6fc89d730114abde472c4f8cb931cac1bf6fce8fde769771a6a433d8acb11f3282e074a6a727b12ba9d7139b6a75bb665714f0ebfffe8affab92fc4da977d3ff8f3a348a33ee75cf624741b7fcdf0cd2e9ec1da63edf3a350afc968a8988f5acac31fa5fb914ccac394939ecc977aeca5b08375532939583fff6447d9275d0eca21bf89d7cb5e7adca73ccce9d5cc3fa593835b620ed61cf99bfc26ee268f8bf136595465d7d7de0972bb569ef4f19a3a42fcfcc88fae748111fca46b47e35879abf7f1ac55aa83fc2474fbe6a739e79cf3ea95ac3e87fbe80d08f1c654e3b8d4e7f88ddcab8f87e8be8f6711e50f258f1c4172a9fa3340072b97fa6874d01287df487924b3afef47d9a33ece1c9362d3ae2fbd117230f0ba7dae59c38f664d7dec4faa2bedea2ea0fa57562cbf4e88ce1ef5a9cf91925f8c1b257db20ce57db965153f9abaab3e7fc3c1594316a99fd5cff5b174451af595b4bf855d4084d629a1e9c718263db44b82ce9742eec6fda6a550dafdeda6ee5fd4bd77434dc06fee77e037dbdf07697ed5cd40799cd72969ff6d048cb54f793ba9d72854eae3e6fe866b2f4787957a4ddb3cd4a7525fea370ff5a5b6e7b8d4dff0d496359ce18c6f132dd26c1ac5bdeae38798c6c1fc28ef1dccaafc59cb258d2790519f73cef93bbfa99f3fbf4602a5f276541fa3b5eae34efd0d8f51a13cfd2a954af5284fa35e85fa544a95f2b457a168f2d7232e1541048b31c618e34767e84e7a5c3948e9d3d944c63675d0698bad527a8d9efcdcb568a9ad94691f05207b29ebcbda45d1a1fc51ca3f3f3f3ff547e94749934a4a474f8e349bfaf267fed8af1fd59f7cc9230769288f22d6ba9b355c0e295f47d226d2a02fade8f9a154ca5ea98adf30e1a734cba630ba6d4f48426cd2b8cdb39dd7339ef64aed87964a9d54a21e6afb512007a9fc715043a271a418169b36feae482507e97742f4cb1fa511228dee8af6a77a86a74a25ad78d650f00489670d07c49a5a97d8d5461215a4306811058513d3939c01c3bd2e39f99aa6492e87a67de671a003296e842a5a7e766ece0ee2cebe99f93de4df9fdf8c223a3fde5e7be989e061c0418ae9bbd5417ee491e5d7bc305ed9186bdd75d4060b3ad41a780d9e302cee67c0709f665709f71dd8a13f09dd74bfdc6703668f81c456071d6a506b1cf09b187b41c334d8f48626bf98791a784936aae8f9df476d646152dddc30fec8a5b868aa5f9d149d7f7e1700fa19fe99619c614a29a5f55e2fd4c118d7d770a54fe320a55694664aca9712f5848eb83707fda38ee6524af73a3d2a2513fac8b5cd6beac79f9ca4a2e94ff0299ddfe660ad35c95b901e638c5f7869a5b448fbd3f718bf907a1597be0d43fa089106ad7242b1446847a4242d9b1d91845c737e618cd43a18232b82b30608943a08ce9a48e300b2867e44da3403bc804d7f628904060ed2a79145ffa543964d5f04bf29a169d327b941a116488b349bdfacfc06f5f13554dc597f7c9447a33f502ea13a0d6e42703501bfc1df0148f3ab6e06caeb8c347510cff7fc9d149dbff834236419f7dadbd1af4aa5f447957e8e4bbdd65a7ff6521a85d2284f7bad6d0d838cc6c1cc6714d1d33fc6a51aa4451493a60ecec40ce4474a29a591ca4fa8b52591201dd3114949acc7755a7bbe4e2e241e398ed6ebde7ba90c550ea818e998ebe3de2b821e8ec460049421865e605d305690ac5cc9b2cc5f5946a1b841a6c482c37d129a35111351a50616624d5e6238d214461431bbf7de9bb37d1b6b4588141eaaa0c27128e9a13cecd4e0400312101b4b6900012646521418927049c113960b9ce4ac0571ed0084a5a7090d540c8171f404ca8fddd65a6ba36cf19af825b3a28cc192c2d3616badb57609d7b6462c70a5a0abb5d61696680b4cb4055817c500b82082c46be2d821c82a20867ac3961bbedc30060e3c380ca9b8b3d65a5be4f29af88383b45057f447e0cba648c96be20e6dbc362f30c618e3284b5688cac117578c6d625b6dadb53b55328e9d2b39ffb0d65acb33040b1b37c1cfd3f88b5a8142c95a6bad15a56c65295b61ca5660d98a53ce2a0b83b57646952db8601245cb962b2cfbc5124c9670527b7244aab2a587f6e4e8e2428bc9d3d2154fbc08c3e6de7b6f184fb326621732d016495158789ac1e90b981c968069e19e1914f04505f95e30ae7d77883888548ca51892c2488a2752244951e588018c90a8e10443b41475d185972b18638cf18f272a7c8a2d720a1fa94413307ae86c34164758bcb050aa9d8f7be9a2e8c1a7f9e781e2887b94b3756a92432e9ba056ab050376ed887484cf26e46689886989212af8824b172540a0eebd37862433ec60c40f2e3ff840eae28a2d45f1a07d1bcc83b5d61ab9928d64c9469ab2912dd9c81770025142e2d9feb0d602e00726507ea0200261fa7aefbd4741b326625c04004d98486a0245966945feebf462e435f149526579a9f23d3347a878220823b6584114d6e5b2af8fb645e0cf185e137986f8e09801e84130da910d60c1c4c2162a3e5c49e2c24b45a2c77d7448c0c353e50a25ad2aa4780a9c08915fc438f072f4458a919414347fbcaeb53d336c6b73efbd5c605e139d6296c5e5c9b2622d6b33fe2c6aadb566f80b16505f641992d4a522ca15dde995d674e95dafae0c60b4b0c2119296238240d992595860b5d62a848be210e24757b1b94f338f5c79a20920409a88b1d4650b17389e181fb6645ac5eee44ce5951c94dc15e02e4e338c2a4a4aae56ab05242369f1a4b47ff44427b9d46ab588c808e586a41ce410242d96703165063092ac60592db2c84be4071b6cb8a7b941b3d7564b39fbc3b64eaeadd65a6b915690655b4b7fb4bcf062052da890b39ab8b65a6badb5d65a6b5770655b3b81d83057a08471628b99a413c31421531cf961454a972cba1cd9400ba72426887eb05c71a72f62d470c1529016acf0d1f2c2132cac885179946490a20c8810278454d1a459895131adb596049493e1070821beb89cc0c2ba57e424aebf1c20f1a457412cd84277d45a3ae4de1e2235e07befbd41b5666c973cf834ffb5c70162f490050952a005872a28289203521743eebd4a12c892051b0760384d1caed7f6c209436178b154451640ba7853919ea4223e4e45155f340d4e460051431231b0609483162427565c78a470c16114abd7de7befbd5766878a7dc364fcc3025898c6404113409204b915493c71e003bbb65a6badb5785b6badb5d65a6b6d13ca2494f390a2dcc364c2c9af0c110b929da31b8e3c89824b15fa6717ffb1a145ad562b07f79f1da16461fad9d9f571efbd4578c9e2c1a7f9efe166f8d2254b8da089268a98e2ea22c91018603124311f1e7c9aff2cbb3b40b8a030317a1b3c74592710c2d65acb41ab9573b53bd65abb8210282bb850f038ec56dcbef7de0b4be23571081b794ddc2cd813af89f583dc7b33133d3d5469b795e13b5b041442565f3451010d41af29885041c49598e440c945ffcea127af892ddca35dddcf734014e435f1664faf1cac41eebd374a8c89fa5c25a044799285964f6cf19ab8e9135fbc26d22a7fa35ec950bd183184248b1316564c0124672985912c462c09a2c308a47812d4c5052e6b2d144598604815613226fd806d409428d517eee39bd4f3726d8811db1ed10fbb18a15831b4ef0dc71407cfb2c409ca922dbad3ab4cab8adc7b6f8c0928312d5aeba7489c03231a8b09e6433cc5d8edbaaabbd65a6b12a6591337a5d7050d18d90942c315493e6070275f929c88718bb0e16e5c74d21331ec8f7d6d823abae4359109c3b453b77104c5bc26e7b99343d2b6da5a7b6db5d65a6b7f5b6bad45621f5b7b04936d2ba5984589b44873f58c8bdaf7defbf223a7033f8d83f307085680058f0f2643c8f072288810e2850ba6446c96f012265a4bb3bb73efbd51ecfb5a867d2f68a4adcd9fbf9f35d675ef2541185418a12206253ffc09a4252c3ff6b595d21a69a85d02a7fc63f42fc96b4bfc6ab5b6bb0ca2c856ebe5581f212d960a5c0a727c6987184b051b184c00c4229af140ca4f67cf2ea830b154488017277ca05d6a68b15448800a86744d3ac4db73641640b4582acc1a362e47a608f222ff0109e88504f4c4dd7987a0b7430c7e041d0855041404b04e294168c14906547a8c33bae872a575cc40decc971fe26dde1a345e33039831a8148d7795390a11d50c004002a3150000280c0a07c40291602ccc234d760f14000c748c4672582e0d07837118864110c4300c83200c03010400400030c83289b20601ea5874e088207cbdbe16189bccb94a6cddc22a336792badd5ec5ab57528521379977aa915d61b4c4a14d155a4abcbe337d96d5d0898ac6ee2d481c6793caa3ac4dc92dccccbc0834d439e1103bbc030ef28fc2d2ac9f3c5a057bc5158af2b50cbbd39f1b55980a97daab4df4620abbaa0745bee07ebbcf697af8f4fa9bd3d4c12e3bbf450281e931bbcd59446b10c85490c5cbd51c2ec4f8e69ca26bd16f24280dbebb26d6f1bccb3acf755e700cb131ff7790957366692157a94372fa0875e5e5dfc2d249232a95a9c1237d44354e5c5f6d9afdd53157bad2999acb221cab39cfe07ad9a74500d25d3eceb67183128b2a22d2832ef3b22b361ae0621ad46730c69f6071a1f5924c68a7381db71c24b1dc87cbe2bf6eb1cd44bad8883e7f7492808816993b3db5beb57b8a91df42cdd2203655a72cbc4d4023829cf433f49c2231e1191cee6491456210175e3b671928cc83968c5eb83c54af6ce455ebf9a1047a5e1db3722589ac2c684c31b04abc94dead38e527a901bcc8bc4ae7825c05e16aa411a1a434216f27966f3583ec01be11bd230831db63399ba68362fda3eea5dbcfc43503b7cb681dbad983dd75f1b2cc86d79ad7124f616bc075922e4cb38278986e609509183073186c71de3fe8c8176c359b238dddc51e8fe71146a3eeff6f112d4d5009b071d2fd2b23f3ca7e37a60bdd2226c762d1452a60d445848987e31743022a3b56167cb83c55dbc33be91ce437a973c60501ea9e3011425558e04ae9395ed133f927d34c1870f6b4414cd165fcc930a72b88ff740dc25a7e84394a1a31a1f82c215c20cb0687a4804eeb1bc0cc05b9666f8e93f558d4048458efc79279ca3708582fd00472d71d91bdb83157ba696418462971300b70a5278ee96f2ec370200296a1e9b7a8ed2b16b7633275b66812d4b3d6b332b5e26e53682d944446202d8d067582aa6b332acc87136eea8fda4ce7f42c55f955404b79aba2f116b95981fc69b653d8594a81da026a5883e9b2583e571c2ddfa012c4bd8a21e777450c3a306dbab376f4d44742f565b879e9f846a2647d855ec63ea60b279e8e1c85f973b8583597b3729b685c251b9ca4f5fe783c2b4c5f70e0ead5fc132b8e67d5576cf61bb4f3c191bbe112a92aa4af859c2f4eca986be451ea18fc4fb9dbd04cd128de8914abcd71526708b211b37cc67fddbd694d59bcf03fb3cf9f773b78d492d940ef98dafbc977837a8efb986002ab2bee7ad0136057ee8de652f90d0a988ff011bac2196b574c8fd5ae3ee8c1a02be9aaf37cfb65ed0807bd4164f0639cb87dd3031223e82c5192462b2d531adf4a0b9bfdcc9cdd17fed8509ae078d67e0a66489fa6e2f12055598471116abd5e5d67492399683896ce8158943f711f1f8faf5fcd679172faaf079d2696e9c7b006bf16f5c4286ca1b6593ec1965a87de9f945657644140d33ec87669d90fb52bf172ff8f59af5c182742d3b068d1fa4a103bef690e673b21fb37e16103e6b0214f6aee758015f7567804f5b8a84ed1b2592939d301ed2a73c6a7362a1864dc3bbda4541276b907bb476e839aa80b5a93b8ed69acd4251256b883e07a65b6b8c2d65cb0373b565cf80ece93af416510d39a56ec17fe2cca37d0321e44d5a4042cd5a66c65d4dd2a82468f187c255f1428362cd6da3a57952ed7bc7c1db603d7f624f0c734187fbac8f841959f3871185bc83e4da47f0b2393951a167c3944e9b687c7f2d2f28075c84eec10306abbc488c3b80c0cc56d945aac30bd5c969709fcb994216ee02c78f68c25f413d8ef62805b03f752e6a509ed733ffc4db58653ecf0e1a9436e323a84a4eca03d3455c0d552024d680c015e21b30e5b53d9e64b1cb8d1e7d23739ceb2c159775bb811077449004aaf83956a284fc55158dd9beb266caad5b8c1db669498cae396a1a4885e5c5966d2984529b9bcd3588e736b7f72bafbe76096cacd4e1dba4655e4c56a04147777e47e3a4b033e214fb76ccdb776ad073326224968c3649a5493b709cb64675f555bf1b18f1acb2c1be5994d34d8453585c9030ae1832a7939f5c4c6332a03d1891369175ee1f214ddb9828dd6ce456afb2cf279ac9780a735c834b1aafa106ef217b77add1a7bc5afeeb7b0ebf454cf98e9c2c29a50a0129ccce81a51bd2c5d8006db56e0ee49a21b58158fa67f228a6b077cc50e7cc76ef36e4042634b7f02c90196b05bd68fa80561c5c70b9bd6812a502136a5c59ed31793b16da70722959b62eef642085b64440f0841fc2151ac256136b574207ebcb7ec4b4e2dd88b6b679fc18b084b5c63a8e8db6a0ed7ee7102aa4f1f956b0c991d24f1c558e74a23614fb8bd14667acc25451d1e5cff28ca57d03e4e4f6f64db720cf986d7a052ca36a5db8b19998d0d40c47cb4a197bcf477c2187dc33d179a5373647536a147f18bb8e7c065034a946fa416036c609f111e0a74a651c5ee869ef2d7117feb9bdabcd8b62375781cd81f75b72763d961eb0355232d7021e5fe5ae0a9c1546c52d167f95c9f7d3c641dd26f3360c5b78ab2c3e7c60481ca7fb0fbff0af77b4afee5f95afd95dc8797bab5a97bc78e45e2516cf4d2ea3fef831223bc61edf447a2ea7f69d3d04454723c75f5523dff3387d096f80d9a804fe635987f473b7a708c3b14b15a8ac81daa9965db26e2204cc5e498d74522f9e74f8e0cff102b3d9e9e4de11fe7a42ab4a64dbf7324292d0a53f21f2c3cf850b611c5628a482b4a2a51b975a5c0d4bc6eda9b171d772a19c730a4b051d7aebb76f5a89b8695ce6ffa2ed118e9d42e3a657623e8b0a4cc2fdd55b345af6225d73947562caea0d66a86fb3f522d9c5e2052a0cd4cdb263282c07ed15d90bfe085de0a31a82d97083b6cf2198b7c4e8936e46c6b6a69bb9bbeab44496d031bb3a244c90ddc831246f8a9dd1244615bc1e30ac260028a64088732f773f7313a25856aa11304aec1accc7ac1c36fa9bffbf0fb88a66ca154299b0b5cda0b59fe00a99ad7a4bc65d22f2f12063e4e31842fba6449ae504d173e5194ef4ddb468fc37240a90e86131c216e0e03065571a36594ade8780c546d7027403eeaeaeacb019da9898966a12e745e426706c99c932ce23032b241cae46474feb285be5250531d517aff84ec7b9fe10c68cc482b6bf969ce6214b145496c78bd377309d31f764c4eec434ea03a028f6b7b75ba903b8709b506dd0ca2acb5b58ed416740395345c7df0cdba9adb2b25dec8b48b6ad1e222c4fa0e1b4e9aef6ab45c00919b62f916aa4c33168d308db0b69d81e19fe3fb00f6c5d2afb06b272ed2560aaf159982d7f7e41b5326f18a2e162517ea0f890394558065f97a822e1ca33a7d66ffddfaabe8152350a81903b019fb6bb1d339b3a48535b81caed4e75c2f24208e35eada8cfbf87142f90761a99fa7ae70c7b429028aac56fbfbd2ce4a6536792151c7e6f4d2eb5984da8512cc5cca778d5bd53057cd58e373a780682eeef24173fd49c672e3d6aae7b3559a1822fae86dbcb19f5538afd74f23567d2dce4ba03d7c69b8ad936cc3f8b76bdec392be751339b36cd1e8606ddca7a4335ceab9d54749cfb67006604568719880f9e0ad7ff68d7b3292d1b769cf62b14c6df9c22d8e53094f0307b73d71bb5097480e28f11932a26775f9e56a416d2c33d43181eaac972fe0aaaa07b25fb0b6455bc9d8e2c810e6315415e6d13b89b59fe126b6715c30aa9339e426239614c1bc7a33833ad1ab802833bae2cdd6891b42647fe2d02e2579569d0c9e60e7f506ed0071f5272054f99848207a17d5e9c2ea1eb8f7070b1abe79f58b69d26a199f005d3b50a7f835646f561a29bfe3e61299f6355bba7db453d64fe97e668accc6d56091949220889c41d411f2c13571204bdb11f3465f870fb659f63c875e501d3c7b52addb30a9d3acc14109cb62cc39d0fe6c1547e945a544b4d66cc22f229900e275358745d56a1c87de1863de7f416e63266724980f6c69c1f3f3e5cd348785e9560bf52409750b59f5cdd9b876396a5e704beeb790a9a3b4190670904d1635693683ac18ec3436bc6c6a9c8eb94ae44c5636bd6e73a6db91d44d28099673270763d23f0159f2164d2128ccc8af9985eb7bdae356e5b49359f335c435fa3a443095fe1ad936b9a1221bcd189999f1cf81e5991970079944aba2a88304a3059b3532748b4943f69cb01fd146724b7245a8e85da9b5628589e6c2408de45661e207b26db99ba0e31dcf6d2f08bb08505031bb8075a9f8803d21ba50ba1f1b4492593d24d34265539b99c7789e572cb507596865b968d39aa531010e8293721c8ee7efd01ccd2442fceeb78af6ad22825d869d540b0a9b88c943894bc7c88174fdf9c9d43f4e899c945a32b3ed9e5978603f90a3e496d551fc44a10a340342a2fdbe2ac6f2e9a0d085404c28a6c858e1c39475f2373cf7642246d4d7ac189f547db67ef917cb50a25f9c223786d9c382d55e913d35cca87ec659961685b7dc30ec409cf950d6375dd1a10a5adf9f765a3b0bc443cbf99f1f7530ae626c47f10312aa4a19f2fe52d31b16d35dc20da5842b053fc58faea2023176b05fb4836824cfdebdc8eab4c42466092aa0a8a10298d73269f91ef56ffa2190ce5364d391d893f1318310b395ca55516e5c420b9dfc1706b03c9e0c53aa4fdb9e87821262c98ba1242cec5bb87cb11b3201babcc449e8d9e421d4f79f91513d3e0fbae2784de6b07155f2a28b43e2d11e45aa968c546df4c8255b82ea0a66889ba7182b545325156d4bd12e77d53ea2d3f8829fec987e01c316abac489742ad0c142e122a9c5226df2d3f2dd5c5868b52359e41c5963ae2b726d31651896592f78e2f72b542e8f26b211ce482955739c3dab7e728d73dd7ad32760b5f7d3f50226861b735d0f8047469a9b627dea3e56c7f410a389969cdfb9b74a568551ca10ae44f9d7381d53ab39e1ec3541f4751e868d46098c898dd61fe76a2ac38e0e1e507e8fb83829e75c77df031f2ead935fec175811016fcf09c01dcdd95cb45af48714d792414fb9b405e87514d4a1957c58b73187c5ae6e82ab51ff8a57c82cad13dd913d459afffc0126ce579b79a150f8052e049caa36796130aaadcb62b6c2554510a31f3a821bd08b84a98cfb8f863447d4f859463dba39813af3a50fd946c1247af129e3eaa2d2f1453e16a37baf9ac5bdd6ac78fb99043054e7655d602dafcdbe8a97051c07ed8973fc4f06d21480569a229d2d31ad06adf16844d900724c46cb8853d14b33e13a528a4254d0ac4dba25278a927a8b1bd7d715feff4970512d6e2ba44460f3f3a782250857e021d938902d40f2fe3df30485062d05ed48de90c61e3e72322e1e43ce14e2177fbaaba6823db782a389fe56cffc2f9ad1c0815b030d04764907a7eb443e2dc34ddf0711b09404eb1977f403c17d4486e9fa7a9de6cd32b1570f31669ec8aca3b4612d06c353af21ffc1ef7668c2a911759dfb8dd27ab626ac630dd6714d28f89acaf1a5e58162d7cfac0b2ad831a78e18de0cc1c75621f9773f1184221465617c83790a9b41c771bec2b466d7f9f8a567aff228660c1a90348601c3c3244378da40e5db4cb3c55fefa2e85dd113071e87c6d16cf93963afb46c13c3cc61a24a3ade832b8458f327b09b329252945d7e49c07d8dbb249dab2d85fc180053e2987bdcb3118cc1df6ad1e22f99efe1715fd3b9a6376145930183c847581a135e16f8c316fc6c876050b756361584f2079b8f3c0b33ecac566d3d8cd18a8770ed783142581b65efc53c1e7618d2fcbf50acdc5ebdc5242a5f5355022f61027efebbb57cce990377494e33f03caf86a2a59c34d29ff163008271ecde1184d133ace1ec7f0e2e7c588f0a47a73c3c62a680987d200b35070c84a894cee18bc821a030d8427b639edbac6396084e1a163478c77e22857fd632d9010a7f0b88c7e3921ea8ae2bda7c9d5785826c912975307c01fa870ab8c502a19918c28d37b74961672da533a824d9f6268ca04d47fbbbd0c2498491d1acf39e66e360c13bc28d2830d9fe37ad85d777383b5801888d550cce7208ed2561186263c19f7926ac91f23c490f3f1d36090a6b2139f0310afa3d89387ae382b42da7edab003868e52b93304064ec82e33c5468b2ec7f8b99023f31066b4141f5c166533dd198628c1dcc82a6d6ed848441609e652db5e32a14ab05068dbb0508e4a6c2fe64521958263a06540dde51092248eb9d0dc32207777d29ffdec1aa7dada8ba27026c66e0ffa1fb47e2b6e88a9d0284bf2ca4c9dc07084f86c13655480c8808e710a63a615ce5451e72bf418040bb603a6edb51fdef10a5e6526f7faeda448c3a78cdecfafb09b0bc7eb50f0448db6baa9515e61f5a3d908b4492f4a6d7c0db851a6d9aef108680e14b3bf805e1d2b14ae03368732b7213b062c9f3da18034928f093e1d711d43b5c98a6bac1eabebf7d6db9bf2db9fa2a6c49f5871238f69d61a38b8a432160b2153febb012d8027fa5560a2e5754da1467548b0489f02bd5bfac220e841a6188a46faecf55601cc40192dcb91a439601cbde462ffa1eeb7e7b52e5459f669f2e80250948a024b5b9b9362ca431382b480d3201ab814d48881b70e9ce8745bc2691747b1c88b0fcd96796c0d95d0aa0dda91ee632c530d91aa9a2d1e6411d75c1da671ccd5d01d1527ea69c8e9f91cb94c1f19163a9ddbdbd79fd03b33664c680a650d250afd6a939a4aa14d82441ed40d9d2b62b6289fc312d1a068b40c4076cc80054f8f5708c361ed3a6977c2068103dd6cb529f102e65ae05fb522ac7b739e9dac5e2af1c346f10d3cca8b85caa2e5a78a5a74acf1f438062fe6c9c52292eae67c0cc2552660485879639e4375e065821385e0f6c25fc2682a5ab8a855aa6e9ea6480067843456b2b8657003ab6ce5249ba0567916ef453df11a60f76991ada9cbfbf4dc8b992bc551e6235643d38aa17aa5900e2a8da8adc72d463a0b776a98ad41065811dea7c8f34896820b23a3dc2bf789ce69d0498bdce2769a20b759114006089a82108333f28541ae99dc49406add04403769a261820b4bf988a74f34d807428fe832c99d7a8c37ad0d660c093561724c5178060b23f1ad55b68cfa439772a8efdb94e2abc3c38a90a3e0dccf40fc84e18dbc26836bb7a213a9eb11aaacb7bacde8e283345bb18e9ba6262935ce78b4cd8c65dc9a2b68d386bf98e58b363407c6bdf70b4a189085b1e99a0d7b9a9fc1338d731fd615ea16e6fe218618f9fb64e9fc3100580a94a0fae9f1f23ef011a19fb4a98678b95683a82d9fc036249f74286d985bd038ce4edc968f0a9072351010b2630fd1847b15d311131e986a26fe38586f5e71e60289b37a10d00d577bf816a228638ab81f67a9f0eb3b5bdd0c2df96b7122080dff9449bb41824465f5d8c2726851498ba13e86ad4110cc6d9e6a1a8812b1c76048470e811490d727cde573fedcef23cfc567189d36beef92f6dd6c26d6fb9b5424f3ea73601def996485b86ab9288141f66d4c0a94e8b13c384499d4abef55570a05217b21ede1a39282b53282a12ed05e8834829f0044a36b9356f17d311e7e5cf5ded8ecce66233136f8a31dfb1ca02b93188c160b6c01fad591246c1e468425db8def7f412c1fa41a11b73a1fe4f6be70bb9cc1399f24aa616a32faf0e57d3a4c804ce79b66a8421e8d3f873c9702f8246e32aba3b90f66a27f7203b49e76856e3c65e239b8a48c1f393c94b9c512cfe1348a0a5ac3bdb4bd62855d261254c8c68450f79d67897d4e9bb934a0e5d40e4e2b1250e94273fa90d8223585954a68365d90536cfb68aab8bbde8365927d6d2167376ac3f765fc40380413a1fb037174fc0ccb8145a2836dba1f0b78fd3b55928da3977fc5ed1d8ca008bc7a683b02258588a8f23a2475f96714c277e3afaeae8686bc8cd96ee013ffb5df9643706f35f45a0ddf9afa0d60f67a64dada94ee24534cc7aba16b09bde32d6700fcdf8770b176bc59c1eed0532cc1e37af317f4281d4d9d6eae6e997bb07fecb007e08cc40db8306cf7131b071d84f10fa1f7c9c7cedcf5bd8f1669e3f7c7b6784a4169559bcef0b1ede76daaddf9c331a24c4d455e2be76c04682a950e4482e0ea5d45bbf51d3376043acfa2b245d77c0ded6979228a9b69eb2ba7298b5344386b5c387fadefbdbac34b9e13a63a34dcfeda308eba31609be3a7332becaf4dff1cb970d569312cbf3d12b49747a54f5e2ab291a2a3d85443177bd62164eeec2cb44bbc9c2dce904809a1eba41c28616caf2b5eaee9b6e4f57a39f7b29831d815c906ad6c88862d2c62811b9f7143c5b514ed6cc992728421283f8bc494b46f8a07bc4c090ae6786528a631cb94b8868dabf6044a9458673580c76411002bfaa6cbc4c4d1004fe056fda059b6eaf0c0a4943dbddfff90c8c1c00aee39b99698a2134cb7167c574e30466977a6f9bd85f4af859129e73e086a5102e1778eed931f56ad9b1b796324b77cb462ba2c30f559d80977ddac0d712d36b62dab2cd4851896d0308b4f1c48aaf7b9d094ee2683dea5a56898da6498652188559e2f276859ce67db1e42dd4d760147e097be847be013a8905b6fa814ec14ebf2d82854cb7c8401aa36917a56f7bb8548c2962a98aee814646b7cbffa6a3ba195dfe623e0b6963682f36c472fe3afbe754231205bb8488692c241cb8a89cbf2fbb251f9b9a7e4ccee3b7e86959084ad3505e475e6ea25313d8411e1234fb30b3249d526e175594877640f9dfbc1921bc64523a913174a8d3350290ea949ccd917b3969233c5c729b921c1614aacb86f0fee80e816a0fbd03493363f6c627509caaf0694b8c98ee6c50be511a8ce7a18ac007e8210b5a887c2d935c59a5026ded7dc9bf651e288981c319c0f707d5156249494ab9d3b9f1a261dab375296f972d82430ccc17eb5d351ec6db27839c2a9bbd8e656a533eecd34ff4d8abbe33a58f052de0226fc720d40daa515d7b88545b55140450f2997530501e720456ab472200664a96a169b910d00a692572ca3bd712c737bba4a7de9b3830e64f689105cc130af6a435663ccb3d3ec20a57650858412a55fcc3e0c69989511b924bb5413ec3ebbbbac8af7e4579fdba73e4fd7204fb9300b36e7636131632b4d976391407f44b7cd2bfa1c11283db2eda8c3613dac72de863205937a60ca126631be9bd3ee24444ae57460a1bc6ec7e2bf63d2f385914b28a3d85e9d6994cf22bca8ad8927332ed6cbb313edb3d03dca380d2d61300dc33085790d0130e554566ad7b259ad0b9f72db1c57fa15505f354e0366077f06ce9cf8180c0095a01928943092a54453c26e2bf837dc687eb288d121127a0722c43939328dd3be3f5a5dc90408feb07a5fa5021b527b240c16aeeb3c5f783a830be78342cbc37d2e0ae89d62a6425bb6c86f58ac6c139b73ff13c815e2b77ab8cef1a343b9ca54118489f5f4dc5d927511b16f704f114cce186936f0daef8f752d8a699282f05b10c2eb7999d5464a1bd1b5ef17527a36d462635a5a92b1e51bf86d850f1a2c5a3801323490239e6db490453597aab57a096c8797f74cf4be60f5bde30b003099e68cdc15a417b45a1e139a5bde5fde916747f18a39acc7853173a9b0fa6ca6d9c659cc8d9d1113bdbf882fd1b82994f8a4ffba3308fca9b33481e95248ca2567d6565db4a307893e9c29dd74ea60eb50c3d631b21bb894ea51226707773cc0f97a1ba19128969ee44548c3366157d377403c141ea873886c76aa992733bff297bf9b2b429a373f529d81f45241ce59e671132360b10fd68480da84f49d30f132c0e4dd692044adcbb046a8204e20ad4158341a0a0128624a7dd9460732539ebfee6609d21f95b257c60139e8f62f11407e71e0ae4c97740d264f20ff1ce4b1c6d32e293d4262f12be3d5df2ee94109e7f1d69e9f8bf7049386d8694d7c90c8e047ed99b4d305c1cc445315130140aa65670f498eb3864808c96638a92168722d138b2920c37375dacd66973c3ef72590a11844770d9a07d9588a35d996f5be219cdc5b8b599e291ce492d28bcd68ecd77cb605d1e543c18166ad2ac1dad6355233230c9903e9804176ae6fb4f18eccc3d29a53345d0034dc035b1b5c0f53e10c156b5113da845ca8a1162647b9ddca90653b8510b54cfa74c55fe4e8640a48c953f55d1a3bfba3536a58398dc9bc2359cc8e0aeedf2796e6f503a4e8e23cc60c26fa227457eeb035a2dfa9c4830c8350490566d8667d373b8518f1dfb1d11ea1b3fde4fdd3cfdca756bad4adc61194e621dbff968137b38e1d2d446d86fc23165b0f1d8a42ae04e9a10cf856b28350da10bce1fee5a3b449631290805b5581f54340792465c9da83590db1543566071dcf781decd0de455702949b15f186391302c316af3cb902e0dc2c5e221a2f3e39bea07370a91db149eb2e893b4ecd50c700ff961e94d0b9ec5c23bf9868066bceffe72a46fc20163ec67233ea42bd196caee1cc66ab820ca4121b40d44429b1b2bfec49322576f24033cb277d064096a5c0bf742946b4bcae0ec7bdd6c9ef23502e085af641d681e579a450a548c134aa13882c6ade45bbc8b793248d9461404adea2a26af39d270d4e2720b93f745230d6833360aca785886fb8d91645c926a23f39a44e2dae81ccff5682a6adf239ba85f3883996f62c79c0dd8de1942ca4e8fd98b20238cfdb49b4527c106adf236ac83e55ee2f4f00b9eaad862209a11e6500807c241c6a09da97d5d9a7be3df3942b388408f8937ba5754ab7c6fef9f89fc38b386ec79e252f0d7bb5e210c27ab6080621b48731255ebdd831244464e36a0a99048b7bbdd68de7927e6280beb63ce73f5cbd5a68ad864358565c2f7cb5f4cc0a261b7f5cee504098f67fcd100f7d648c948bc7c2aa75fc089903af74cfa4ccd013a4c3d74f90add47bc8fa6d32fa4b897b8b197d34d18abbc015214d7a9442a3af239c785cb682fa7bf3c7b12c9b853e20f227f26f56f27a3f2f53793ba480c0a1b19809bd565b70d558b11ece8b26657da0318fd914b9128d9feecf52dbc690339cca246a8f96573e3c1f630489c09208745115a2b34cb13e509b7f4b013a1172d6fdc275b2a7f6ed058f1d8b58b1eac4cb96e0c8fd874f91693c1dbddd5d722951e108c74e85034a3e5b8b4a2e279c3bbb6073d37ecac9f1c50a01e414d2cb83a42287c0f52c4a691cf30beeb3844bf2a178fb1f2f555660dfada50f6ce12726020a209440bd89b08a3a6ea03c7e10bdb7bcb65e42560008ff2d2fd672a002fd94408866001e7e182aea03c1541335c76578eb1ef4d17eef220816f803fba49f344aa25172ccce4769aff15b376e76d2f3520b647f140d8b8e050ec6dc47d9f50957471fd615fdecb9ec9d8db3372be7f2b788f102975cd9102061cbb0e5038109eece97e27ab253112d5aeafd6709de208fac3abeafb68563f41f2486d82721716aee7f13bb6c04f5f64be9a2302d569d86eec452a883f411cdf68ed7bac39f5747b3dba380192adf21d58666595023f38af7004ddf4050ac5f6d4741de2114397b118c1756009ba2cdf4cffc1fa16168641ae1795d4efbdd42cf4151959480ecd717d3505172963476dbc6b4c2167b8e2cf30759e36ed09b3e02fa28f518fe65f6794c041b44bbb44796e8c0af196a644690803c0bd723a691513cf1ad9568791774226fffcc1ab4ccaa8cc438ad20e81cec412d992a3d8bf704dd35d6788c38988745b3bd993a28b84e85212981cceb1eeff12744b47bbef6b97d2d16e77822fbb06733eaac1a33cf52ce63807b221b831bdfe9591171df5f1beb62dec1ca9fbc4948388edbc3ec73c3a9fdf9bee443dc2099192c36d7dc289a0a345ed36f47616df1200b8c1ebe5da61e893a3c3e08410eec9d46349aca38ee89fca83ce7ec88d07222cfee4e3814d4ae3c95fc521898c48c44b1a89bd6ca5dd998e6cabb7db828daf3a2669b9c283842c0aad263cf97b2cb1c646dda1a64856965f83b85bc85af08afb709282631cf60913b7e85de02abbbe9acfde3d758f40516209cc14f632996622404e4460541cde65c78e097ca304db8b50f88d584ccf4a69ec9cfed946dbb42b3132f6ddafbb06df39f90057784d65bffc5945404c246e2a22ce969ded284e9cd0239ac3eae63ce45f6ffcb930dc7907bebaaf0fc65e10e87004f55e6b996646e6734a12847089a6b27f721368b3b0ae9406efccc7c955327e98e8ebff9c5d2553cf6f77dc6d1210e4863b9e9cec5e732c69c9470d15a06e34593f209ac98368131f73463c1f669a4efe144cc0607f2740781af25ad021ef172047aa8d36d448bd639e5e1ada25a766568fc08d63064649e97477378817af54adc34d028c46ef8c2f1671046f9b6fb9b18ea8edaf02e8755900c3db981dca0e827526d495fff4d28048271c49779249849b89d487436654a3809c775fac11300566ae4d1cd028ba672fbd72801208e1c40bf3f24541f9908d4eb3a4f272c81ec163e73a8768cffadbeab0d236387640a998f6a58b5413f4b4c935ae150a8c4ad360ec7d1f6c7415aebdf70a4651fecd7551a2b886bf3ef561dca84d0e5d3579f60942e1ac6d533b0eeab0f939d1cc08307f04e8868d779ac5175a5bb41433d1144e1f17b31d66236a1498e485dda70eeb91b0d91dcfd2847586f1b9236637c40299e97a17e93c41bf589d45bbc592cd3b6dfbb12edf77187aee7d056b2c59459cd3b5dd5555475312396e2d4b144b12c07e53a6f8095641b15ac557d42e9f9b61253740851155017a44cce4e358a097a15dbec9163dd35cdc53041572dbd6635b8f2346ad1df047c914bf0aef5721d694e43d141dd8552e9984484bb18e84c23fd6f5db365154e2a2027f4715c788ef3bd4ed2a3f1a5bf4b8368c0b5466ba4ffbeaef6659214a80e737816fb27a858f3be5c01eb342d9861930357d28ef87a1152550bbc8a6a6659c1f690fb3ad5305635ea26dd6e2124320eedaf315a78891ebd4642e6580e0beeb4c09c41d8343debcd6096f0488bd5d88cdc7e8402607392a2b1783b44c9f78360d1ccca57752111b4bc5082d6d1141d474006f3b8a38160e02ea119eb3c93819fa40176fc1bcfa855601614dcdb098450b9f2fbb63121884998d3e7f7d3622f699c8fee8417ee79d309d3427bf31cc304e0952ad47399fd065547d12a62d139218408794b8a2464e0c235e108e6827f377c8faf5811d7362d099847c083f72377e001cf023c1f9f8d7672fa3385e64301a9ceef16b820ee1b76301fa76f0588b383375dfcf9a9f7920046ff58a9da066f1768310f04d9fc9b2bd781ae4afe43ccca935470febc5e16a6a27e5ca4dace28cc13b3741aa9294198e50a0d326ea611d57785863df16f777a775bc6ce88c9219648057786a9496bbd9e377865880be50f24bc35cae40bd3af3a58fd35c8c4389dff775db4804e848cea5631cc1d30d358648fcbb8c89c1a1f7542fc3f124c3c7e427459dcc82d24e2dd4260a44d85244ff30a2ce117b4e06ea2247032f00e66c007ffaec67829083a38a7f3ec25743ab45b99d9265d21cc14b5b384afe9e8e3f0b3c91b41936b12fdfa1cc7c1c00a9cf6483edde99fffe1d33b024729143066de0733410ad8b180e683f9596fa07afffeb148b56316aa0b72731c70ba68fd274f4bb7bbf4428b21e0b1a45f03e102dec5913375117da2a7d8bb20a713d92768cddda00e3984fcf1f5b8570d5b4835ba7d76eb5cbd43e370cebe444cc4ddcb78afcb4e4ffe509772d0bed5c5982027f8bd0c411e487c3bf375e21fc27ca0f16686c2d8c410bf21e6818c6939737c2ce07c047bfc00108551497a167d52ff92f12b4fa7a45e33c2a9680b8454a0d3525971e65528a282cc70fe36ca93ffc7c4ce681a9019fe17f71312e042d5fc365dc35ee6ffe2920f72b2be68c4f25ffe6728a07b783023f3d33e9467e75fa2f245830c25846cf7391b91401bd2ad9f19ca82c1e7064ce0b386d3f2104a123ef69fec30bb65bcd40d57e0cf047717a2894b4b1663f3c5acc1b2d6bf71e3a1dc6db70c3d17008da6356269c3b4de6e9c7f09bf48a94ed8c90628d464af5dd3e31ad8ce5ca11aaea6dc66c6a3f503555c5379fc5d15dad99b00577013fc3a8970aff33a4aa26e3d4856674558b7be1b5e647955aedfbeafd9f51768012206e0fc4bd25769569322971d68b2140392e904604456d26170a2749774fac0341f78b69267eb430cda6242cb405abb8dc944fd2d2d8895064a5ae3a04d2313ef264ad23f50d7084b2ce74f27b72bbeb3a94f8d9ca7a89ec92a93932e85007661ca05d67aa03195b43fdb64eaee9f0e7003913d41fd9e074c10808740e0808bc7d874fcac158b8c2ef97f1a214e929c27e63b0090c8b8588f2b515036fa671057a46e7f5f77a0a298d090567d8745858a33b875c4d94c099607444cfcfb87aecb4df98e0e46f163e54f66e70b80713d2f5b2634c886b1f609db3da703b00cd7ed058779a0e21bc90c96f631c76027bbe9d71176f7454d0fddea88eb28b242c478113f5e40a8843827145b9e3d62919d3e4b61910b0fa10918471fd96a0d41c1175ab039e9b507058ac0221716eca07484c538c833a3e7cbb9e2be5073cdc8a2306615eb29e17f9a682e9d71de9a041e1dc96cdbd47d769e8de4f38596a5ff5dcd9ce7b1a7af29071ea7c6b32af5fd2740cb2090c900b95134917972c2937219d24a1c71fcdacf89aa1f9bb6c534f576a0bbeaf11ac45a87db528182e894a5296bd1d75f417ff7c406388e17d220edc72a6cb3836c803f7e499b671081ddaa0237c5bb547d284a8364d4d744c836142681e88b09b1368f328220386537ba4d3a407f13072394d4b2ed4b8f9e31e954bb9d01498dc81795919c89347292f3cba3c507fb3658eac1f19c87c2c36ff88c8eb963a98b4cce5f7f4636d83d98cee438969dfb52d3725abf3e4f919079301c0857c2144d83b0abbb90dadb4c51bdeedc7a2472d8fc4523330c96cfe498abb11b522863c9b5098067384488b37e7fd00dab22fd664f6bd91bd9b30456f83b607401dce5c175c07e35c7af43c2fb1e4bc868241af13a613fd0edb2ffc29c6561f2dab27be31f71a5fc59a29bec60ea1dfade0e6a65675181c4ae958250108ddc9a6053e1b74c7ba90b54e6c4f46159e4ba1bbaf4d00d9cd6e552880f1b06582fcb60f96827e3b0829a8e16306b5a7ad5fd951e7fab4dadcf0ca0ca6299f4d0f4788a136e7ff0059bdfe597371e67834001b29bcb33f34bd7fae585986b3c68d0cb48c300f72fd85885da2fcfa81bd751b0c6878940d53add37a50dd438483fe8856a30bd521ba513aa7ba322f2134ef2d7e11883168bf4b711594bba755abadfa3f20a09bf1f43498c0637ebcef18805715cd5b199434fba512bd16894fe81bb2a3ba303bc0d8436ef57c789267a2a3ba527ece296ba0db9e96969e953afa06aa117bd17ac99932a0d84ae222b38e9cd9a5d88a94fd29a981464bf5988ba520a8cc6682d1a7645066c8c2873163ab4d0c58ac32a57abc6d14bc3d3f231acf81099ef43e01cd3d392d011370909078282d0a0b85728e2ca5afc5a136808f15afed0bf2b3cc209626cb0f16ca575c8a7cb26b2ef068397f4ad473cb71a2d9245e9da96b593f6d8116c4e1e81fe1de000d4331f14f0e8551727cb6f14820db97650f0c8473cea51e2313ba5b0864745ef01b50c458c0e6b56022fbde5c4b710578235c872b6c6a184986d96750cbefa30f587e999066e8ea15b45bf9aa7717a51854428fc5beedddeb12191efa0f1563498e096fadfd67adcfe61b81559cf4ae9a5857e0860ae55af59f5ad083c2c88956f64d8cc231f7150e4e75060206ea824d1dfc70a056d2c41d01acb32a783961f3689e12f619c89afd18c878a030822f4a0a16ebb05c3c69a9dcdc9dc5ea2dc52f435427ac66378bf701aaba393cd92e31281f4cd6828a9ea4f613df309fad4ca49229936782c20a4b4007b10438b07a6a0efd9e2a8d2614dc9deaaa9a795e449049a9a56105656b7961799bb097594bb7d87630152d47e55d038236ca8b3135c5d1f373577c3379283a5319235b1634914d52d132488a938cd50fbffb908bc3a02a1bd3812d9fcd53c11471c1ab0a3b7feb5d0f3aa79f9c696b2c8e2718a7fe56b2cd2b592fa8699e32da2b4666d72119a2734a6cd0b382f14d06a17bfb5134a7a5c0f24e1b8abca3e1d60dd0d5c1ff21920f562c6c0a9742761080eb86d99fec7206f0e42cf0a77fa8be3bcfaf497e0d07bf392d5655684a6cbb16e15068d0ebf446267350da40946f900e728bbf56c37702333fc87fd580bd26214bc15f487ebbb642439705c2befaf9e3ce649e80757064c579199b862655790beba7df5a2d0d171a9f76f9e3a0dc48fb52cdaf1e0da5ce9d1c174711a9c08ffa551d793fe3b7098513a83b31f18d3bae84abfb375eab628d56c2d43469db26f8593eaa67f36afcff85c38e22c30d3f4b3edb25bc2459011d19d5273c47d3554c8ca47fd354f3b9050b031b7258e208a855836ac870212fd00bb77d5712a747413d04e088435e772279c4508ce75a25b512cd84140301c69edb440d3c885c54bf1360d5c9f4b859e0965276feccee9fd4d906289edb8d96890ec087761d03073aa050279e68a920505ae0c150ff1423d57768a1fe2c1532dbed67d2158437e80d8a67f422868ce0f33da919c586f809925ef22c7a2d8b9b40a302cea0f6914be5c0ed44b28b2c5b94301623fbaef1fb183d9868eea0a81d47d2e1c6efae16f85e1833b54bec0d20aab22b60466033f6d4bec7679c831da5d41577d4b0f7ba9d01dcb4b2996362bfaa15b6a4481a88229cc4b1e31fc7a88c534a3857adbec6a799ff441c6aa0b4def712dcedf88641038e18cc6eac02c656614e868b5f043e33af1f608476bb89a3480a5a948576c46c89ed450fbc5b8e833b1beb784145b2fd9fc5fa7579eebd30b1b0c99750e9bace3190b81841ee2ad10bd4fca6bae7fa34a8639ee85fed9262c54b97803cbaf75bb74b3180d3605b3bdd98e1e357b3a3ffbfd0a74407e336472cd2d0d974f0280946395c5098e8d433815df22bee4ab140c52b6de4f5c7c4ddc6564e2083a79079eed550c5850f18b09e04adaf39530440af00fbdd03b72bc52fe959fa2a8bf01004b9ab488847ab4b7c978447a871cf02066d26f28d4a61cf3e2e8d24cecf1ccc207bf62461c34e4ff4356cc5cc8c5c77af73aa74b34c4a5d18b61658fb8de50a1c92c2d993cba29101bf33aafd9a8c0172ea3c636a854b6653b7f14e0919b192ef37dae0c62046792b2656f3af65ebe20bed569f06a96bd0999fa5b5983af8998e11412ef63f96d2aa2ea3a7f9c11988b483d79f04a735feee6749bc42d04059148065765a0a5e7dc268998e17687487d99d0796a46e16d8d44dac2cbb8b413d120de2299c984f44e2c2e7d6d4b07debb90e6087fdc4a362bde1f6ff17eec9878cef5a5e1e606828fbb42c0c5aac52d2aba4d7aa7c20c5b1a3672e336fbbe87451f292a03d93e868c05be493fe6f850fd0c95382541783b1f926d5b4c0c5e08fecda6e52da08f176df7a74bbc03cf628a51c86eb62da9651ac20c7f8feec4d0b3e65cb288e77385b6f3fa213b132471c73704874fc49560702a109f8c2c14eb2d09dc67baa15f80f2149bf8060c4eef9d94229d9a0a2d7b9f177bc8890c18bc93802bc22c388843a248c0667ede9bc8011951eadca2eae8cc08e365427079c209b240489d43633b8a72507f8df04018cc4870b231130c54586a0397d79851128780634a1aa93742bad6304c414bc7f7ab9e1fa95c48d13914c4dfc9adf032115650dd7e22c3ebd831e3cf71b89c57ad4f7893ef0e0ef880dfc117262ae222b54404ebb3e688d831169a73cf5202b1b461f0c11c6731c0e59023b9f0faf161acfd7c51755a06aeb1a00bef5265f93c89a86ca49ff44aa7b16f586f6ad2e1626cac4d6cc8b4387c297b85e6c3b2e5b8f70ce39d7ac9baa41d286a97373bfb8bc4ce974edcd83fce5c5b3e0ababbf037bb208269d96751a708aed57ff970c6454b9c93d2e4773037a1238eb30000c3c81239b1a95f9124ebffe7d7ab6a3d821e6846d6e7aadb818b93820ee5ac75c8c6f82a353947d0fefe6c028bc5f97a9066bdad904b4881b09263247471dffdf78e347710cac62f27c97181e67d9e9d9c071a433f82fb0dc7d901a5b45a0cbd9c131b9c03b7ebaf2306d14fe3c5cfb6e78c78b36139a43d7eaba8e14fd4565f6cf6f0d9c4963e61e84873f1d202f9bac04121ff0dac4cd6aa2fb355ca3181fee80c51a358fa82b85e0b375629041f68b0414a5540e93c9ddb0c99e6fea1ca740e54f9dcc850d1e040550dd23da1a03a425ab76618eca15f0e55011c7a3e14698905ec6183f6bdbfa951b6cf1e7def1f4c12806e30dbe0d55f6a78f24d5a96841f84d96a8e4a4ff529a3b97d8f1b23649160761bba5e271c07e2d6f8b2857f0af322d734fecf103fc7887279c0dfde7ecd901dfa3df7b6f297033388803db58b386a14b876d6a4998da2cc29291b002139f616f8549c3b0cb41b0d3d509ae9a03f3f36e877032a9eb3fcf8855a07a644b2c03381b814391412731edc118310fd6e0732b1aec2e9e52b3fe23a70e1cf8ad0d6a55207babe937567b9e5a5beb3525abb840a1d5834b1758431e407f46e420ead7534eb8d04b82bc5f12b391d90134d71281ad1d4617305ed6a77328a9b2dc54dee0e637662b8b0be03edfdf5916465112628ff8659a6b9fe86d45990b35926a89a3ad2f637e4aaf153c55fe3637961e7506c358bcb222c1b23f3ec21bb0e78c84cc2af8b60f1f8e48242d1891e4c2e9a8de8e60360cd363b9326717a5b77b34ff65080f94444e49a0b35971265d66884fa4e182f2c79a597312c762dd0927252598be18b4524e511b85545b660a698d99c80cd65f2657346952164553e019c13b0372fff94e5dd1e5407a4c9e99042d1c1a3ae7940c346a83ae83a71bce1b0dac2cddb1a456d0aa7dec7bdd2bd932c9cf7bbdf1dd15b97ba0d8e67f23cc04df1dfe62ef4bdf9d8d9eb00c80faccc11f3ca7ca3b0714c6f7e813759c01e1c2f537ed12e29374bbb4f194c533888acf241817fe1923ff0f5224402d0f7f02a2ffe5a9774903708b4676b5a434cbc0b727f7a0bd2dfc65e6b86597acd5e8085d01df3c8adf7377ab4b9a54e06c8bab7ff6e1a16332b7cc4fa30a979a85b28cd905a79b4da223947b78c5b8ac331f75a3fe43c1f491ac702a85541e7f36b940197a82cf807baacad9462046997505bdfdb50989a591cb72fd40e1669bb9e01a33a91dd4738f9b008f205867d75a62aae695aed3feaf52c6124439dd3efb8fcb45e34cf9b39a8c14e69c17053548377f0b4cb1a836a9d29273abbc3ee4adc912f0937ca5a4e63d11f90dd8a0bb7aed2d7ef40176587bc411e7d010ffdc0ec9b4133ab0c8d65b8ce420304f8333c11e2552622b23a8317330d970e206e47100accb0f0b81b3ec5403fd6f8fdfa4bcc94c571b662bfd30023dd1c6c11869dcc51d764604a7242eb281bf5db316f90f2f982dbaa4a5df7bab952808f8f8de47fda61bcaaee884775918aadf96d1637d5a1edd13c45ca3e96764feb49e1dcdcd8c55fb3eb520e0540bb6e12b2d863c8a2bdf0eb59109d542b856e28a72a71fa76c58e59c2d17b9bb275597cecccbc7c6e413e598c6810db93e4d582440c61a5019d18e589f8bc1eada61fb39dae90ef17a4b1edf35334a93b5e68cd74600036d81058d4a606d1a0159ed5b51818b4da8aec6a3635d530e642c481135cb63b71ab0e8fe258509921e7ca179f306a0047a11b89a9b580a3d870c6bb56c81103b99abee1113ea4e1c321214a0dc0ad4896860f0972baa14f3a173d938115964725df06184928940af6e3b9a8a107d4658df5b3137bcd2c6b1813ea24b4641ddee5ef2cc43f6df81e7f86ca4d1569ae2a1de393ea95c32488a8f5b573745bd55da4a7edb45bf847a6245a89077560026cffec60649997b9ec2b7e0363a51e20fbaa87c81ca14b87260d92098e147ed358cd6979e39d7d404083f66a63943388fb506caa65d139f2871cdfdfe0903dd92f984423a049bb825d058f9ec382df1a0a1db48d637330581eb2f1a85c125f5883b3d173957742b401647fd86b91fae62c32ca9ef2d97a7147640bb0a5e0e0c39ecaac171dd7503eecdfdc55e2e0713d376e00ece39adfb8dfa582187f32ee4c2aded20df491e25e08161c4e720e27d0f794fac653c079f2c4a67589ebe449fc4085bc85db2ce34803cc0b4aee160ef77b725cb8b66b5047d0f8dc2e6824e46789b5dd38db6347aaf401d5b84227dd505239525af3482803c56d86da6c006dd0e28d2deaf5485d961e943a6ec328ac1a05a527aba980523501246ae21d16f95f2fe6b9b62eb17b5080c6757b7385ce9eed37f3104a57b54891ed126837a4efd1aab1e249dbae854de64d807d5028272853b0d6776b6696c015e14ddcabd52c890bfffa34edf2c586362e8e470fb3615a703fb375045ca4ac44df31a5c3bed3e8181016b2013ec987374044c2a0d01a1b67bb41245c287a8d5815a1ab8474587344af5144e34e6919d9bc5c87c80185a86eafd172af3d18fea0b8eb6b7ee4cdfc968307b3144993d4676534355789879a07e7ac4a02f3b0cdc73118f62168c29442e62114f089189e7c29086b62bb7678982ecaa3f8435228295afd742b455b1341dd02db1fc70c46b72b818a2b5a436421a713c8cbfa67ed5e3702f5f6db2325f116c969d7ebe39faa3d3c517d90559b731d13afa24530b33fc2c47646c1ecc8886b696100b0d9ca61a99f6375a45a4589d85c096a52ab5eda2c124e4117e91ec31d620cffda42fc399b3942716234af6b1932835e822d95f5a729d6fa99f89a488407ef9f14760334e14549c6131a019ad6cf5efce74d8aed7f2dcd331d359421bad3f3fe3a89279553ba406f029a13ce906f21d18e468b806755c78b22bf87060b94c12744f9d948b29ade73e36775c1cd6f90d2fdb940631e30817d24495029d89ebee97b030813e174ca48be159dca0dfcaf94e601da51dd455f500cd24d07a2001977e7f99dc345834c7f5bd9812f003b0d905f22c0ec156da4c58009b752b30185199091c2d6151c4200b310ed61100a001c460004d8eec9a6f693682fe6efc9116591dbc2b87b317a14c4d49364efbdf7de524a29939401bc0424042104455264a08016448727764565555596659149657b56b1a1a4323fe209201e27de18da985a6989ae8fd984132be597d71a1104d9299b289f18537308f90ed79739cd27676a3c29d2f5c7ec621ed001c2cb665466566658665a665c68d0d41e97a0e6a659a62eaa48f5b93ca2eb74e49c3721456429388e13ea5a28893c269e43ca9a26dd122a32544d951a30c63826036c63dcc3130689244f0081a0879e9a42aa4c07644288f8210829404c41537b506961264ed6de7bef92979b264c2634646b2c21b2f69473ce43bcdc3487806d43c8348987106b60f4478a882b444c9220f305955120d25973041024fa429317a0bcf043e2f2a1b2b0422f332f342fb52f258fda1a6b4508638cd3bc382e8529d898e59d19ca302b85f2a862465ab313fee17a185b39552d0f741dde91ab349165b2faba34c86c12a9245449ac9260611c2b4a438abb39e78cc5756960796926b5e3314192a18c2fc6186356968d710b30c080a4071635388896d4d492d8921cca78c9f8628c314653864373864353c4a5d1e1d2ec94b40d112e5f26949555e117c6188309c38129c3813943e2c11863bc84913418634c048a9be64fac0691a0f9fa78f072ca5f8f049ef47071d1d0c48797ca43042e38515ab7796badbd40ba6c6babe02de3ec615c615e61606164a430425f92727138901d97aca5064a941dbf659c73ce59cc15831213a4492d4c1b607928dba01f37cd5850962ea8a030f9e4f570620b524fd8994a0f2ba1fce268f05092d95293061321f7a109555659962b54a13dab8c092374c689353f55a99c73fd408b822073484913223dbccc105b551da053a555d3dcb6a2697b30a9e1154433427638d2e11f186309989902a407a035538240611de52a562239612e2b2e2c2e2d2eae4723846b2479f9563b952ad0da9e54ac7499356a43b9a2a715829923470096ecc088d85c538531ce517bb4f40e0e1cea96629143093038863872864cc5410337e4e454aacc9ce374f18631c61803ed00f1001901f2016a020465fbed07eb0ca9e511b9a76888ce909d213c438cac40c3c38a97529955500ab32b5496a5133adbb38a99d6ec4b0fe37f821e147cb842defa9c7306b373c1f05c30462e189fcf39e79c3549db683d24e7bc26e652a16436c40f1f506030e2880501d1c5f806321b1ba14d48e971d91d6a93060e4316c7ccfe98d552bfebd8711ead49da464f9d73ce3907c13a368c316e02aba6b99130c6788c8a1bb3e2c6b04818638c319a154b76c096541f324a6bbc4034575b8a53c94eb6460ae5dd1ec648f6a587f1af8db0e22a10618c2d0d1d2d3a73c0ba2de59654bd8125e689361e39ec78b9a2c64709a28ce009353a4272ce39e7dc85e3b8b7e1388ee37470b969be6032218cd261e85465a0119565f963d2f6acb2e3a2ed9b73ce390721c1ce964787c34895205df45b17668d54ad5a26260d26ca2d48d699c191a3858e265d7ec1891e3449db685dbb1bb82383871e2050410b0b62645e24d312fac85f7894e1a106d7a8815565d534b7aeeb3a3545fe84d54c2d292d2a90c612b08ac485e4850486448644c8822118b5856816e9e8dc7bef4dc24ad24ae24af24a024b22cb27ac49da464f3da3b163c8661e6076ee3a6ce4ab1322374d27b3cd094d3ba9919e0c0a2ab4cd1823d63831e403402c0879099450235f73ce39e7dcc1d04282c5690b20cc255c4be8f0c052028928283b7e35f9feedbf9d56d906a74176fa8751aa00a6ef9eb1205870a2477bc682d8a99b562e369486c422878d05b163d7af513370147bc686c6ec70cfd8d0d016f7d79ec30d609a1461f1c1dab2420a056493fa346190378b3a341e9f19eb01caa61dd833c64398ede5b0524ac3bce5ad6e4abf0335f8bc2705b06bedeafe5eba7e98fcf93bda9e1e7e060e7eb5d651fd4623ee1b81b8ce0decb65eaa23f9394ee5507cd371ae008109982704ec0a63cf17df74d59ccbaa39566bd0babe71dc462b64854a18788996b7bce58c91ad50cdf152e95f0be5bf7fdf598e33b7bffbdc9c47fdfdf442d17707e1c63f0ab76fb204df3736ea06bf6ebabdea1fb7ddd8a8bb7edd752439b0c3af397fa83ffc3e9cedf04795c7f739953fc432b4f51ebd87e20b45bb5be0d01fa86bad9fc370fc2c86f941d046985584e0f7c12879a98213347ef741f12ec2e8f57b8af77717c247b1c34fe181fe507ff89e7fe1eb0f5f24471bd8c1f7e167d0c668248dd54fd8dd9324f7f1927f283a2b064d37794b97fd9bf28b42ddc007d40fdfb3f92cde5f01daa81f8e2fbc44a797f0f7b5fe97c75b31f0121521fcfc9ec10e680a43fb7bc0f7d9463812cabf6213c0cebfe98c438f1effe664fd50b4bb821d8cf6e83d2d7e3c64d993cc9e312cb3edb1f85ae8d024dda4af458eaf850e2dc28bf0c2c50debf6a8570fc912b68dc8ed9188f375e174bab0a16f50dc3209804d3a8b246591fc6093374e56ac978582fe0eb12b617e88a8a1e68c67bd20b5f76f9036beefa006f8defb6d74488e0efe1d8fc2a3933b2ba5dbb47f8364afbd3809555344101122f06ef0717777f7a7fe1efa3809ab3a8b5267a313b6183c6f6429a594d2ea042c028bf03ba13dff30768097aad7bd15bb171be3223dbd148ea4dd3836e6676b0fc3dfea934a9e58e29e44d2ba015e2a42db3a1da71be777d381def9f59e769c345bf3bcb00706fbb4dee6a6411b987e3d0ae9bf60210657508dc65ef759ecbe724fd25dbd310bcd18de3b134dba2047acedcd19c31bb72c944115da601b3f2f4d40a36a3c6ffaa42e25ecb1757bf14fb221d9bcd09bfda46cb684512afd8b7f018314f6e88f6afa9b7bd8a34912fd6dd351451299ac5671ce1c34b9e970f3bd6e25dc7833c79bec282718a07b84fa44b93dff14b79184417eb9411d49ba6f3ad0bbbe266fdc5a27b06b7de2dd11e8f933d3520f913339e77ce5554d73ebba7c6b18e3fcf55011b3e4c8179f1c4892a8686dc6a9eaacf2820fd7e3818f265ae0b1e3091244a89002131edf91bdad42054a3744193b41991eb22c546557742564b567955613ba125b3c414eea8f35370593191682d27cce394751b969aea2b034c9062f2bcb8becd018cec450d444875471b9710eeaa345c10a40a6a85c70dcd0a52e52ce394f2a2fd6ce79686b9bac49da46eb9c5d39e712b89a08b265cc95165240651f3b5fa11e08a26f8f0345babdcc79a038f7a6a3c35976793c53467e7f0f8529637b7faf079db193411bdf832349f73756228e03252c58bc7f5844939a4576d51ccfcb34dca4176e32bb44df9d28a6eab7e93491de10a73306fd94e3384eb1c22988e24d18a4e7dafe5e9d9b8efbd722b7abed75d269c2740f697744931507256d110b84acb5af63759fd119dc9e4fc1aaebb442c56787ae342f79ad39cd856bbf09400f4065d0d1ed8cf18edd47776bad7d6b33bd38941e0a91a2be647a92007b56b04904ec17c4896359b3541f05e5608a47bfee6e44455688dc6040647404f0026964966c720b22b756773368c3734631bd7463858acf9e56a614ed4d045d0495a016d44f218267dc4d2458b4eb7bd3bff066117f474b1d1d2f81bbbea7fa78be7088fbf8a53ed5ec6e783b2cd21d76dad3ba236f643a699b8e22e4e7ba2ddcead6f9d06a4ef8e3a64a86e5ae61ac46376e7b292fd1cf22a5370cdfdb44d24e4ae9b655f76e53b9f768cb5ad97b29ce59e4b8cf2c2f553a52a7d4a9d31f7923d15aeaeedb53d18e9b117d7d429003df206dc6a07f1366719c4a4398e3e4a190a87e380bcbd40fcf84b19a5351200b6c390ef9d5c0156804f4a90f36a91f8640405a57fb8a5a8028443a7340d85752f14bd14fa7db740442e3f0b53100cbc0292512e7fe993170b56940fa7863c6f6e8e9531bdb6fab1740f46fef411056431056411848036720f64193e00fd1ae0ffe74b08dfab7d50d8126b7d5eadb3e9b27419a8ba091cff95389167f08c2c84d8bab4cc1fb9c48de98348faa668cfa9be318d9d9f537d996c5734495cf995dc3d7ae7563bd7615b2a74479b2c92d6857a721cc71c84f25731c12a4852fc79953a2e8ecfae18fe3e85dcb6c328cedbac226c3a05d9faa3e1e90e638332684ceae0f9e711cea63a7bed4b63a5d503a3d65edfa05d9f5c9baaddc34e99cf1a9a605f563dbff4b51f12b5d3a3ff9953b8f4a50bc3b8aff743c07c5d7ff4a14e2c7e3a65a7e293a7eaa9bede7a7ea7104e9c5f848685aff3fd5944181d07593e0c781b429c3770542fb2641da08d4895d85d04fc7ada3eb6a4b79a9da6d67d71f2fcdbddaf5b795e3904f6c3aa630a355ec0964c4ceae942c954665e80628c2b317e78debb6e93e67ce1aaa2a7b71deb83cdde7ac51179d39cb87ecc579c3d37de27ca7fb9cd98b2dbed6de7a6bd6a7fbb43e84a65fddddeb749f2e0b9eec147bc67e50a1823d6359726cbd67cc87250830b44317623f6cd13603d833f6832bf6838e4dea978196db05aac97f0313a8c00711c8a0015eba5fbf9eecfd3b7e3511d91978154df841c36ccd902a30dc404379911a3f8e603142c3210a10ca5726946b621002b2e5081242542214c821488e196af8b28507e543724c68814a141f50f8a1468b1a54cfd6d2820df9123b2108947f041ca7f2006911f203882d1d388107e542386092e242c4870f69d4d420dbfd2ed180dd22f8697b9d6a3bf530188a6321c7aeed58b61d77d98e5fdb716cfb573a27a5e1114d2f2d3aa229a57542715d58cdb1dba63589f45f2a9d4e17f6c1f7b7b42ecc9cebbd6f79c164d857b664fbcf765b7a735f2b3307bb78d88e615b2e6bc6f0ebc2ddb265b8424bb67fabb5ddafebbef04f695335677bff9b6e24a10b2a5a02c5015b04e5c4be09a80fbcf196d5e4b713511c9a5b12dd72caa0a422da9d62dc04bbbc845b2dec721c2e9668fb942b58b63f6e82a1d019147b49bc31d8be41db7f1352e256cdb1565bd8f6eb38d68319665b0bab3977ca34f9e720eb2188ed4fda21d88cc14393b8b5dd1fb78ace6cdcc22d5aeb54364954b036fd6ebecf9b7967e857c6a37da9cf8857fb7436fd6fbafbb669fd5f2a9d4ed9a66a4ead5513fd0b2e389d4aa92791e80f75f1129da86ff4917cea7967367dfccd400ddcddef0ddf4192b4c1ef47e2e71bf867ee1d7b435ea2f97e58a41e919774d0a437746bcd963567a23a30badba46579b31983da1f2fd1b7b0d4969a32c2a7f8bdeee7c4f96680bff9e718fe200066896cb1ddbe477ab103b0f188016abd21af0bd1053d9862b68f4a46efbd36d535473f05a143e9714b55d30c9a566fe6cd54b092d0f7fcb62e14fa5787da227a9b6c7a539b5e9e4dbf3a9d15780ef7130133fc6701ea688be646edcb858a00992f1436bd2dee3b6a2fccceaa69482c81fbcefbefe79c734e7d47d03df739f73d056f7c0cc1fb6fb4b33b54c2f75df8e0d35bd69cf04be8fe7b5a02f8e1d3a710081f04e1fbee43f8c654082138aae857d0d67e346967b49ac33df59ea2ec50cd21f2bea19ad3dd7ce03d099b846e9ce3b4374c191fd855a24c1c29d3bee80c0b855a409fda249bfe0e9bbe8739f03d02cd77f31a8e9037de76685b53edd815143aa3884d9f524ac96c0a65535b731cf2ab7fd884ec210fcf4e9a811a184cd87697cd2cdbdfd2396746c1c194222fcdfd3f65d4c74b739b660e264b78fcdf23af220633c602a6c93f08e86b8e02480bc05dc70b660c7f4ad3942aa1eb5f7081ffa558cd6867b433da49019b5e6a4eefe5c53c1ecfe5fd782beca5b64d6b12e9bf543a9da614d54a7a12b9752806b478d2f371f1a467e4c65f6f24fda49bd2bb184977b518671be93940858a584039a9bfb5cfa0e96750370bccd9c6a3081604010df8711514e9feb86e52b0b3117d771b78f8cbaeeccaaeeccaaeecba5ea783d6a0fe661fe3bf3167fbbddf4672cef0c9dff35cd5e4371020b9106f20c08284169e0bd159d5e442bc09c1c5dffccde8b06af2957813428b77f12e469755937f8bd159d5e4fee2d268d24be56ac3759eca713e1b2b7e8291a47bc56823fab611e9fe44252db2abe6b4187d8a6f915d75a8139d5a401f145d61b8c314db66b63926565bc553970dda7666715f9ca80be2572166d7477e9b8a1345c5fb2c36721b6f5c2d4c768099f3baffbe0e0c9274a834cef605b5746848020000b316000028100a860342912c0b831416c6071480095c82445c46361c8d460351281c0a8481300c444100c3010c053010c3300c55d29c9804002e007bc2cb977b834d0389c0ffabb40faa0a5152511d4efcb8d7d4c3bdcc95551a58392ab241ff22a7adf51a73c4b7397b502a82aadc802095e97b01a530339c910fe8e4bed30359c36afa047e1087d454115cb222199f16e246102d6c4ba42f5f588f802993e64a5b5028884436cd5ea349b3a93d149ce6b9f704a84ac221a8e7a9ff7eea3c22e2a828a4fc15f1bb3fd04b92542cc40c59a788b12960a502529097320e4b8fa5bed3639bd34951a496e572f32a42cb927cbf4d9a86dde830bfea6bf781f4afdaf7569f31ed6e2051d3331cac19c7c5843d36188c6c55567716427c8125f047d8572ea898651a18503bf91d27d5fa3cb888d7c027a2650c801d3ebfdda2fce66d835abda03b48c4e3cb26840669ab3d3771436bff4df3943aa4276260b98a1ace4cad9f3e907d8e57b2aaeb33e3108999eb012a0190ef263f6eef390298e3186b9e2bc1675c10a7a82d64458ad167a411afe00669e3e5589575bb93cd0dc682afac1750dfc4836a29fae9e3b179e90ecd6fb7ade24cb66df57820b838f3b81f16a0f67853584791e447b9ed9387ffb7aa6f96e7583f08e293f37566299a0c40728f6e558ca2487f77a5fcf8bb27baab2e84ab038899fd2799fe37c5cf141498de8c2ea153eaf307c685ee06dd98f2e350ffd1fbf031292377bf71710bcbddbc1240a2a61009067cfbc3e487fd36dcfc159c67637402a20ffc1261c31c44236ea694bbe4ddcfd88451513f10798164a5de511db05b85d2fbb3878c1bce518953801da96b69c46935c9a3cf3c620e9f3cdb93f4ddbeac0060813e9a4e143723605b73c1d4612c43cd7008032a1cc0fb99c330b230bcde43aa012bd5a960fc8349819c382a50813aefbbfc4d011c93f7d07ec13c81abb57d151495de36ad973249274f354ec1fc36260876591dd301cf0f6e66576add1d71be65cab7f959bba5cebbf5bb4468b002cd873f34b19ecdcc5de0186433fd7a000a267a4819972c3e58ceb00bdd64c2943386135853d237ff72a3d33c90c3d96f1623d663a8b9eaf9da4ff4f836f805d9797ddb2f74dfa33861ce5c5f648e34ae93d19d47dca69110ab912adb06badec8dfd989251517922e7549cd1bb622d38265a30772e76e420245f645fb90d9eab05f6a3a61bc75344ee11d3b9a764c5f726c33ba64b369c3affacb9d9122087d5f354ae2662490c54413d8252b5dcee3b1bc14f0d4a0f63800caded49ed2dee1089f181d152abbc5673a8de6dad2551cc3e3c89469c3159dcc3930fb70b224f76c69bfeb32e4260f86c805f2d4923cb21fdd7b0a3393b1cc5ac80064f5049dccb2314a6f28bf7bb85661f4975682a6add40681375f52932b25ad02e32d5ee0507c7953d2d185f90447e2bfd82fc355d1d9d06d5cb50906c16a7933a512387ba2db388a5189a56b599b0e0e749b95c1f9c950711c556749a650677a788cc0ee48896d5bd489e204a355438883a893de390750768c124b61b25fa5861b4ace3b9595e230fcaeb3951a77b33b7f3efbebed574c618101ea50031d31a20bba14521cb7a8a3c61ae88460204cd5f51a57eb32bce7d6256937ad390359893e5c7abe404cf0f4cc9e0d2923b7280c7431dbe7e286a27fe3b899800147c96f42e58043839b1d6f7e132cde5a101336e8bbbd5677c0ccc3fbf5471c932cc16930baa1078145fa01635b4f0758ff437f9e41f61611bf9647e4e69c3ec680c020a0d58b96e644f5348741ba82a239555ff33a6d8aac96c2c10f4a1efc2b011b3e403510958acc5e70890b6b2bc72b9a6b592f20a1c7b7e7e94e9e94d46ded576641d4c7b5de17d44ee2cb803c97d4cd57756a2335d89f1a57aa16b80ed1acf5d0679618a1eae3d57a50391e525d9a1059200ab195e6b0e1aab38a4f0bb661878ae28388f1b5c6a92a01a51dab1a821868e5e571e60499fadba4cd754713659e2ad30ddbac000a11f1cd4295f069bf2f6c5f98548702e62724c92cb10974a4298400098fd11123a44fe9eb1ed77832bbf74ef342303e4bc739ba16a86362731b39ce7ff4119d03e60d7f43e2c362a185d37bfdca66a2665610b1ee55afa921fed16783f2940a17be48d2c135e14c864dc80b60761263b825fadf9db4f41e49759d7babb796e584e1bbe2a8ee0bf1b1d684b5e3d0b9dd9d5676b893b98308b01657b9e46710a0b734881a3a95a6cfd6b2746cc1f7ad101ac6eee65e359642f2ff96a7e0d3a6a98dc7c5183475307ff5f0928a4763dd857fd2c917f4fe43b7d9571625d9ea5ed5089df79e7f00dc70352e2c613d3e70a556a6807217391054ab6ee9f47d6d3574154defff01dd5a5587a7a5bd57d6358a6a23fb7e0a43c89537a26347c2872c0afae164568b64c3c938e5b88066c15c1466e6906d446efcdc717eace394cf75bc710c8cc6c884d100261c4ae5e4ba7669eac7957097d63708df715b3788db580a82d7dcec6423030698f685215fbe747473b33d3d07a12ff0e177b50620125ac54aba12b2be695d99c2a85caaee6be36a211c448aff841880a839e8d8a4632d8b07e2ad01ba0d01cbe023c87fcfa959857d0a12bc0d963521233f5118e7fd57cdb3dc4b6f5c394e3f9f8f303870c30cb04ec81e9983ad03be8476afbd47743034da4da7a47d523ee8c0620418181fc3d9ededdda6b8cf30c0c71baccc41d5e755393e0d221270ae7c79b8023847ad870c80396e7de4dafbe7d8265a05e01ab6c910249eb2911f01a03326f00746aa0a19f8d663355a09dc1fe51a2ca84f6926906672e38f0ff043748ee17f25b974c469f5d21e710128c610cec9d48c89861d9d01e345b5e59592beb5d600ea181aa7eb3a91fc20a9b5875c26e2eda788937a85b1fc16755876bb6a2a7a9b04dbaa360c65d6eb9ee18cac3ca673e186faab8eab82c0cf5f3bc6d5c9149b97ba6d6bd20763cd4ba4b551c33b820cca2e5b61698777a900017157307dc0a2547b403db2ec8e117f34cf80b4800485a241e9c9696b56d407fb5fef823f19991942050dfd7f503cd7a98b4427141472106de445a2e68c0b2684333687362fc85289447fbbb67b7278975a0a70c1f726502a15c940d944846752f9c20388e28c9f50e5b1a930b1c8b6e430097b6113f61ab67cb3164d6f45f8ab6aa2c4a22e4855b5e543bb4dee3152328804c6ff4f3d32accf20f515a15b4787daae4c6d423c9b3d3bf59f0a9dd479eb2d6d1de8dd4ea8fd2c7791a8aa54b028dfaa49706165b60af262e544c70bcbc7923d58b3770aeee62dcaa7188aec015cea12573aa6a5cde3956a930a4b642a57067c4fc00e04f199f9513390037dc19c5d8e4d1dc54306a37bfb5a1afe54192d7f32ae68069d67ed2f2bd607c83512375d61a3f382883343d64a5fbac53d14d1ff06c9c1fe57af31e450d5419bc00c596a78ec8b950e4040d6933b46a8b6497c616a5ee859519e4a60e36268a13308baf9ab1684cf26a3a51941f5f3b23f1c2058c94c72ca5afab39e853f1752dff21f5ccaf0267afd01d80c5c34d507f3ed70784c2ffa95a74cbda30e0609d960ad6ec97e8a83cec05042d0ef2ae66c38763ec3d27175b330137866aa2047d22dd08078e793498c260217245324c41074b78913a6f5a61b14aa0fed74aa986fa2174a96f3728b28939e87c12561cc8f1ca4cce17d4c7408cd6a9303aaab73f62eab489582225b286b3a686559753c930e63e596e66205dce55aa81020ae4184caf54dc7e5750bc891c58289485ba572a98a1ec2219fe7a1e3eedf5df20a4b46031b0307343f4a64278edcdbaa5a11f4ac05442b7fea26a46e7be081842e9ed7fb1dd8375cf907d7264f51540f85b82dd10df1236cd0e6bdca6620afd8fc6c1c1eec57533c4950e1368c8d881ed8570e5eeaf6b920cf3ea3f3acf21cdbc849a0b107c06f0b2eb8b45e471b3a31aed54eb72556294405b2a1233054205d870a0ad7080da87de8415b016247cd51900d1a7d5e01a30f546c289b1e98e986a6fe06e53980295db84e975c06e5124c0eee881db83e1e530a965dcb41b859af142c110a8f9754cf1657a65bd0f11099a4f85ec69b1c26ddb9f6de295634b4401c1178ac28fe498641109f7d56e41824822cd462b6e57394a6e7ad99f9c067c41116f59516cf9e0fd73c1248a82a07f829b91e3aff1c08f0ee026a715db17607ab029a6b959508b77dbefac07b387c0428497e0f6a934895ab853e8c090a71e865728f3b9776d0e369bbb3c7eeeea1d7c7306e38b04d3c4b80838a88717e17c7c75900a47b89f50163b6ca9a30b0c787409c8702e74e1db9f7394996454f892a9f76471406349a28ee628449d1d1034c26433250d09c145fdc746fc3468e31c5d034601b1c8d947d4d208e6bdbc18c4b881f59e79d6808e7afb824de94582b57f2bdfaf39812c1feea9189c2b51c3a98de934a8a1d7ec5d60e3ac93fbaa86f4a51844c61ad35e86f756065e6501a7d6645e0ee75a8029872c81d1b7445debcd2e9e6f7ebf5974a5e6900ca348fde182a03ab85196476f6c3ddfc96fa94a9c5669121da417d49073129093a11502bccc6092722920a389d198ce8e5daf5af63dcfc5158887743f7db4ef013501845368e3d739738f7db0a57a291c890b951837e8e1860b4a12ae334a30f0a153c8f12ae4a69c6c2fc3f72c5fc3f5e3f1eff37f1b1af960d2289c91de6b9c9bd6c6818a5db547baed01260d2f4bf9e8380ff50dd63c8757547effc81a61b3d7dff152a7f5416026cea05de2cfcc30298855d570187605b6c6451541a7df40b56624b25465fc85e28701fb73d00d568fb2374941334ad024ee50f853e10060102884831f2d066b15a35ed419ef3e1fa16207fdc06a9a7d2065dccce598841edc43e70f9f2f2630dd198e52814bed723174774d28289a97413b77308d4aa7918ec264b99a3e3a58491daea2e71fd35776281e8d02f4b6766f243058fb10b75770fdffbea2165f72aabc59fb571a57d80ef5bf87545394e50cefb3d952cf1a36047947f807d0eebb666e1135c6d37debec11a6d66237e873d6fd80fa5298d8e98db09d820a3054bb0a2e96efa48521202e92568bfa2ef7a87ebae2046e931c3cc2705649356a4f23b4f07ce1c264c15a0ed318554efa0cede1ba862deed791218fc6ae687ff7bb0ca86512a7d2504a5749e6e8fce2032977d0c17c1884b3eb81b76ea846b8540bb6b36663dc52ccd74f40135f52ffe649a212f80dd6855e1b1709dbdb87c1899d018393e222a6cc57e55b0d6347106bfd7d943e88240ef8b4efab46b597b8c8634b96be1ba26ad8bd22b540deab4970010df7adb4f696d87d8f727b60ff58b0f2ef2936c30e91d2b4cb63aa759a0b99d4e58784468c371dda622ea174c7d73b49aaf5d4a25a91e46db61a2b5ba3439164badd854ac09e023ce4f816bfd24e9d424e50dbd793af6966fb06945ab18716dd5d34760c0fb574b85a027a8f674e9fe86c57a902c109f9da8b6f71b3b7242dbd333ef9db2ce574db97f07d4573ac724569242d5d0f73b6416f01bc116f91adcabe47768a826a5ba71964eb431734a16c3cab48b2285ab18cae9d0c16e2b8893306d2cb47694109f3aa9f5fcef6f5d20ae0bf837774b659b74f9ee329e4d417084e6ea217b1d0e01c141ffd58197872e26ef45e218b91bd3a867561434867958a375b026ff41af3d0052b5b604bea56aee67897f8e679f674a12a7742363290a928ffe2107a2e8c7a09c40ad9ec8fad97e4a2230e08110cca72e08c88bfda641c216dce13afd066990f66b1d55f0fe05e7423b1cffd78c24b1005b6dac01864e33c8305f1ca811c089184e80b818b54e4cbbc05210b9c54142939c7a63045d312868cf373ee41dbc7fa9a89f30ba368849924ba36b0f1f3869a33b1f79a53757e415190db1fab77352d6dd34a9b48ca6131054072bf1095381685824da37bc575824ac4963ff39a0088bc41ad2c92dca77f7fa91b7f9e59d9909b9b5f4c7fca84b5905cc495a8c3b624e909e9b2bb026a56c8a93e6caa76b5ef98147e68226c5a7ef8c095377bf0531eaf893a05cc0694b2cdaf5b2471b6f25b1b47be5766189a46db605ffb371d849f5e2f7916e78a2cf9c1c91c85a1efdec06a8531fd7b102db90f2df947f691dc8383f11535589e2874ce02d13a1b08d5257c924c3c9b9cc686b68be66d7c0cb3fbbdeb2d16dcd65aa149edc607a2bce8d4697b83c1237094ac7670808190b3c3a2120ea2b645c84c4315f89fe0a2564ad306536c7b9fc4a4a04c81ebed29258a0343ae83e4927e8014b548e9f2528aa39510c5c8b2b4b56c1fb61c6094bd0a9ad9d0b741c56715dd204d2875c6081e4fb926805f0e51fcc5f03c1f99c1b110f342bab3e072d4dfe49b6dfc820668a46ad2f0286ddf9cbf21895931d5b92867d3248e9352403820c42300ca1319d5cf024eb4bfbf870c79465f9f84c8ca07bad2c6db44885f2332e13803cdcb9b31a840a0987417819cd79200ce3af6f9840cb0092d8e14e743ac14624121de7d8289d144673b833930e418677131074a626fddcd61f035e230ffa2eb273a753f59626e9263790717d4007a1d1a6d58d81a4f27e5305f53786722e2382c135134864b5fed04653f071d422a72d19ee5cdba02ff67433a2e748fd30354f6c423a2a4f29066934ea15f60422b159cb326939b62d373005a52e2ddfdaaa19f6fc923c3bcc701f1e8ea595c44a7791b68ae3a5cd986b92d9da841a802a506bd087fd9b7f73aab877fb20b5d1c77076039e39de669ce87cb506fde59afd30679e671df90d405eb0e3682aa5930c4f7e31b4f72eec2e3ff82b69a3a58b703151f6bf2f346b1c63c5fe5d68bea80bf9eedb6e30c295ba88b9832cde7e6421833e882320eba3f01be268f363d1b60a0e08a671d5d51d1a28718764356be0627dce8219c07dbcc16e4911e8e9237022533f5dc0a94f35d083db3a52ffc2fb93d88c80c91a98c632e62114d09089f7855cb59daa1b36794adc14110872e875185f6b40eae9073876d18a57315042f4e4742991eafc3298cbbd75829a883436e706158374109fda43daac23a7ff0481dfa3a3fa126e1b2616f48b084f0d7e73c25d2834f3855c93cdd8d68ce561109ba216e3566ab758009efadaa48c67066cbb6454146425aec586b504c58b97f08a362d8e2b0ce24302ec125d0da2c415923a31ee8151fb56bd149d0ba67fb49c9f03207d18ce83b309b8dc302d224d83a49005f167ea3c0e0c0043b6a9703dd9386ba63e674e950d2420b292213700d78ec04c7fb345a64f12c22fbf58b8da9e0047b466718292213ef430685f18b4794199ed98939c4c1d670835b338d63941e769905134bb2ccc7f75241d209c3ca08c903efb994e7a4d4c729c2e74ff07cd720ba68cd006e126f91269f28cc53080ed47a97b33591b01693558b21276d1a4687c5c80be9e50f4e69ece5063930c023b6d90a9d78807b364383c728e18749b8bde8c31b34d80e4a684e7e0828bd4acfd806911671b0a8172ce296814d9f62c9d3a6a426d4af6d6bcaa93610c7cfbced2e7c54edaaaadb8dade71ffecd876ad8345e06cd3de00f58f8c9844ce0df2bc0324a64da4b0d38ea22be8316a6842ca8e1495a80b945b9b6293ee66af390249a72db259e2f1fabf370ceac2630b2480a41caf8114eb3556a11a43839ee1bc3ef8d16d438edf01b20aaeaeb92abc11bdac839c88d6afd1c6b507fa34b8341bb01477743ebbd08ef94c5a4fe9d492989da830a490e8827ab93e660b954896a1f6837aa978836066d05d188f1333ce18ef3faa475a6ad85c46caf709ee522ba5c36b4f6e63a34cd11a47d76a3a6aa656744b16026961dcbc0918ac47abd3b61cc37875533a9d21f1f67c201a7d3048d0f6d761b3e9cae7384fd12a10ced933d5971057f18ebc878ee35bb3305a42879b912a8cee8eb0331f31b2dc0dac0af1ce13a913303bce416915c1ee258ff32ae7fd06c56c328d10c68e45fccbb1a21659b4b5e465a8b5caee0be3ccb63564d0588052501cde4c236c53307d2176300cf46066a1da57e4de5dd1e3274be0e093ae3fe54249108e654ad3a569b5e2a71918f0bc46d22e2ede904fedba84faa3fa856afd19edc23568ee9484520a6a3d0f4896f8e831a9353ce2d5007a93e6b20eb4bf408a36125ee1d0a94c61604088beee9b45693051a5afc688297fe6137d175feaaee9862950f8242c75a296427d04665014c7c462fed193ccc706aa960a90c959af86df8dacb088b4377f349774993e770e478049a79af0144b23934511eb1989bf31253163bd64a6eb7d70da95469862a315eab91ec7954a86d88a550db573a40abbad262fb78baebf195074d21d1a79a6a5836e1f2b0d5d650bed561ec3bb40fb4045e9b7ab5ac98b90ca10491eadb8fb8883127c17c5be6151f73addf6c5c3b1829c4ad05a3d89f347ea9451363c61a31334f74881d2719852e3e82c8e1cb130e9058b62750d6080ede71ae59dc859d34afba63ec68930e915d2d30ce36b602b1893a5958c3faa797feaef173810ea13f9faff5efff498e470dfb112cafeaebc780a9b200683f36921d94922598fdab0653e731272a4c638c94bacb7c06a32a990e8064f74332920ce458826fefde8fcece307a46db527be07628aa49f16b1f6c5c09a7fbefc2605e100685f1bf7c87847985db47328f41720d5611a634159a46875384281662be628717e841d03e10950215dd89304bc2bb2e44dee0191fb3fe4e36b6f077d6c959c468c95ebe462d9a2b4bec887b91d41af40a6844deba7fe918e82ccf37f9294e89c50d9eab8f698f48428bf6fdea484812e5ad22c23ecd7421338e523ecbea4541e89526f199b62717570ebd6f59f4b4efab57b019c8208ffabd7a8193b1956ff9088e7a74ef74944846e5a04bd9c03c38da52fba9ae88a9d29868d5cc960821b910db878b172f1f9e3d5262adccf8d5f2f788a73b7dc0f681e9bd62a237874bc4691014f5dd93ccc4b361d21b4d84f1b9da1807e32e94ee81466492e0542430c88453aed76c76813040a7c53813237d5eef617c7395d134f90493829602c95971df55b2ea554b0ac697454d09a338fd5065f15ac16af9a3cd5e0a9364f3578d5e45d2d1eb579abc5534d9e6c8dc7b306af3fb68ef7db4ce9e6890ead95670dde35e45d83678dbc6be0592bcf1abc6bcab3064f5de3e359132f93bdc73b60e778712c68ea47a93d80a8899c5892496665303d22da7edd345595119601b979cd1824cbccc855b7c58b8d3d5da9f8670dbbbd70496cdb37294df9e49b3867bbd200c23a45428d2fb6b6a98a10d91d448f36f44a717c680e087daadb023da35c2be51f78200a68c8cd121dc32cc2651c16d55e220fb326f8c61d3012eac63c570250eca8c6b9c9e4cb8fbce7a5f3c07e7634dd433bc2675d10c5fc5e1ccdc717ee028d01e3c1617680c35659c574002e408b2752300589ac4414cafe828b8e8c7414cfae4dd494556febee81cabaea515e32b1e35805a40bf07ddeacd004e11330d6c7c9a49c6c4706bfdc31e403fe5398ca32c06605fbc9695b05f8e6f67cf3d8e1be613bbcbc234bec9c4061092ae7e4d778d5827e32ffe1fe4523ca8fcd7ed55f1f134ff6e6b6f687f6aaf6d898a2b0ff7d1ff6f910fa8ae9ce6e85522bd7e7c2363fde51031b3595023189297c981212acd3eda971cca2de2fec59684afd0b71570ef9453aa61ded8f51794636670efdfbadc5cd5422e47ebfda3082d06d91c3cc9f379e8860fe7882c67a3404d6e0194cd5ed502a207117e6e78bae23c366e01d0e91286684ed6a8c28ac0fdcbddecd01f8bdffaf9fc369246006d853d2935821061bfd66ad9be68039d588bf466b721bbd1500e226c006a0469ec375e3525be193ef506040132406fb49e4d6910143e2e586e461cccc501b45c2d311bcfaeccf1b63e40f8d6a634ef51aee0f37c73935b2d3295299c8ad786a3bd6ca261c77fd5b7b421db3d7ecb6eb840376f0261c9502d2e21b9f34e61844c0e8845a3b4ae229be924e3146655de6ad1108e995244326d7ad60d2b49fa9960c87e6b8e2794f6236a5f265ec651770d5cc9706e389a579642d0b7f624da95bda06c3c255333d2ff2c761017b6d978e1a10b2339259e229a003f8fccec5b594f25b4d41de4a02e1ee4c6ce725526e923f132689633c8a64c68fff2f8c69b5e292fc45ed41930e5288fc452b0e2f62ab851514a35e5a0aaa47f8c12e4c16e3244ca7687eb93b6e86b7768e38aee05bbd221aa08f17d91999950165a5a2c8bbb2e710518cfc9782b421784f77352efa4c7cf104258f089e2e78c16985ac06b86ce360c70b5b0f580aaac9507e8fc8a532dfd884dd1c457b4a92089c423d363384c63b4a724c915897e4ec4816745ed323c321b3f9af83945ce8adc2b37e8d2e9fba4c3f67fa34996eb09c45206e4c002f4ac9fcb203d43d1d80a055ef43fce41fa3a71b94715fe04d4dd150054424d90b87e45a3b658630318a2abb21f66b9fe2b9d75065c46582fecdfbbcad57a4b579c1c1cadc012874191731e0a78cae9b7d2fafc56f0241f2968ca5580ed3f1679eba1cfd8100b234ca9dc78be7e3d198f40bb05c4debbad77a5a504a61076e4dbef1b16903829bacda66ba887cd8d407e64951cd0e70abf372b60514c2ccad433dba3841d4a9a75e166480c672ca6d82f05750b5304c92e4c6d8a52c9bec2cc7d3951490881dccce8a6e1074b0814e2cf040805d65dd0ae31b442a98596fff7401b7746a1ed43613e22848e04566c82cea3631f991e32a9fffcb63ab92cbfa2615d29423b1dc2b296840a46ca4253644ab8348b831730f35333fcdc24ae7d0373f1f2f2ead41074cc5a3d06d5b54610f911b2b8fe4aa4112c66115a1a023b5079bbfdc6060d4cc565377401e438b5e1715368d8dfd32eb32706ba6d4c1886a21674936758e62ba996924deac882f033df12aebf6ab92ce9e8006ee0787e746208dcec7dea56341cb0bc2a6f06c36c900ec2181f311097487c6e7dae19dc35a385198575559f00e90cb183a2ff2974ce8ada8244a3bab4a31d7835646f50923468b1fed3f647ac39656145c5b498a85e4f8e374b3591cf3064940ec41382e781640141b20062d9de669019d88410d709923b6d3141c0e7050f04066379c095c532bc2c170d046e396120450226992863576029367583d1e67459a22c6aeec4ad8d59c510d9568f3cb26240298b06314881b803d0257abc364f1681e5c9fcf27d8e8a93afb1773afdd1da66171bd78baab877f41009b254e56cf789de81af6361b225f4253ca8a85008616b5516a19a74d55b611f6ad316d13016a03d983d4608ff886a502a1f453a19aeac6a089e7be51efdbc4653109edbdd6c824021c1409a66a3c549c425a98a116953f12ecb1a41e1d4c9b465e770a2520e543b1be560054085f0922169020f3c391fe82017bd2b2148b18466ae9925fa1da6df21f3815c76b477202e38cf482b2fc4c946047d3c4378156cecae7ba38368f7d5510f7e5a03cc4484874d4b7d99f0d1ec56f540c0de964995b4c61538903f58bdca9414f82184620cd1056c159318682b2e824ccb8c55ce04083737af9b8d680fa964b9679a21a2b0526a01b6be15729306f735a4b80ff2f35bbaf8eec2b864ae3a2c54a31ad7950921883aa2c4ab5ba18d320f2630414a216d241fb285c21fde5a3545670287ff21f526e7a840f4bd883a88e7db253e6187cc51190e5b4f8aa702d392660d2c4ac4d87033bdab3f9857da2131a83dc27c9e261fe746fc0e56f92570dcba6561d52398359cc51595e4b0089720b7737a4e891dab2612ecbc9cc62e72506a833ce2ca4e16044a0e23066415e80e684185c16431351c9f857ccec71b4c403ad25d98383996414a2150abcaab39712b3badc74bf3920074b66ab80518aa15933913beeeb9c5f513035c80023310d7c43fcfcf94ede9d041ecc1c2d7d2a25d6ce2b941966b76f24ca30a054127c336a7dc2f3758e6e6e019162a0df7ffc62c88f80aab80db01409613abaac99a36e1854449b0c1526694fcce60b694cae9d34fad21cd1318a96793b2dcb9711600dfbd15946a5f4630d6bc16e8b44c028fe322d542c00bec2c8af05392f688fa92fbb6bfee51dde978a1e2eb33b086f99ab0c5bbaee32d03c55917158c83486129050de6d5954168ec0bef89db5506384ab49f7d637f354a4536acf9d088fc35041cecc115e7e0f505b9475c4dee3c72a35276c16548f7d0fd1b53b2758f1cf9c6e0a285e22b2519781a2575a88560728d5d9417e2c0a06ff946db51646b1e17670f09ed3d0cea03eab1ed80793beea29a53eace5f75066b9600ae34cae5887edc1092a2e853e6600010e4b117cca4ef255d90eeb50893235a361886e1de221db0093a5f3e88ed7d0371355ef7c8ad7ad3e6f1abb1db1efce4519836c01a7d004c0347fa4b139f177258a773ca90b50a25626bd60981cd5e7f008dd5252f0bb7f5208206e23dd68d22a0003fbea6962257433de3c89853eb00a4c66edd229a363b5b75a48618225291e5cb6ac6d967d9e0781c846925480aa026c56df306322a4f75e5f9c9453d031b0c3fb8027fc41ca15f2c369d035e7b9e2e4a1ccb05cab00acbcf05296043289bbc6efe3410b4e8dac529e4b04b0d472420723e683d1fb38aa8362b46c622d2fef732c651e5f683c943a0cb3958ccc6020a2a1055e240b81697a6a5bcf1b9fa55a41bcdf864b008e1eafa21f2f12d09634dc6c17640c12288ffea12545b11e7d331155e38a9e53804281da76460fde848191a47e6bc2f48e083e97c35464e557a39fda8d9964e7291f0de44dca4dba7760e4d230d5878d2790a0425ade05f4cd953fb8cc191cdd9963580c1c3085a77612bfee92184200d197fdf57cbe9ecd78d646cdc8c0ac7e4081e8d130b3926ae88c300cdbe4a55c8ce1843b7839fba32c0bf36a325a128e637ea3600a25ae428736e9c03b7079d62c10be81c8b61e5a4ed4105816f99fc7992fa9e933023974e8e39909591738d1f383ee241e81451203838a5f4e35068b05efa3066717362b254061f24af8669e900d3aaecd0052b1e1674c546a7612689190919acc00f25ca4b816f4277e408f845c8664aabae2fe07aa1322364ba481a468f45f37e1ac00fc291172e82e671acd345814f2c585512237a14a80a891c662960b947577bdb5108d51a93d69711c3b20bc41ab81eb885967b0f651691e5eb5868a6ba0945980a098ee60e034ca9a8f4499749251084587e48b191b6107ca48ac1b3b6b42ab33935608db71ad92134444acd989eb5aac00507f27cfcb255548f8376ae9a873d98409234292c8990f4f3f5c0d1119cdb90cbf1b6b3553206a8a2faa26344c2664d27430e738bde74b814ce0abb9b1dc200201c6278f42c46d2f6c862144f25d744d660e36817da81ab471469512ad8d40222c021524581031024fed0903a72758d480af3d0b4a816a38af94604f63a379a543a3911aae043aeb1aaf94520e5cfaf901d8b13fbb6ade3b4e0f4098620488de050126a3ec98d1fa99f52e51ec6d1569b99841f83006bb31c318f492a72d0a4b47a093370bb1e0d1436180b595592c55a04dfc3c37b871502bbc0736c685ff9f5161310386eb3f0255a39e09a92960fd95f1da99b8f098a488a6dab767285765f45c733658e11afa0203a426515b32716d7daa5c4b8916402222e1c3642478b31477ed6ca6093713247fc8b8497b4690db28755e6a2769dbcd6e1a3260ffa9d104f9bf2ccd4ad47edca59d450677509b020f430dc07c717840a6a14285eb7ad4608ec6235fd889289fc1419e6daefd9a457e07c74c8eb84b6827b8b0a070e760d046be0d8b8444dde77250e3ba309a4fc2b114113f6b5398a08d33109baf25cd147134b40efce466260dd2b8a692141bfaa99d9c8ca2ecadcb0a295d232d09f87922694250f144eeeba000f26cb806ffa209a37eea8c0e8c3408ed147114f429bba4cd14b7a0a00d226d0e016c9fb6696460e82cfddaabf956be2bed55400cf2c09c1f28ff60e5901e3843922d9711c2409e74b9bb2037939cad6b3005121d2bbd4965161742fe69f05bd36b789a5c071e2b56c8b953340a330da8c11705bc5e5fed2e4980a84f79a87e2428da53e97bb25693312f9b92a792b5e3610fcd4634f342104a731c4de7c3519c44e86bfd4e0c48994f7a1b9ec33c10d20c838ab114eabaa1caf8d2a551f32d82d2c3f800cecbbaa5ad50d0c6e5ffd76f6d7328f60364a72f7a33e30d92e399284a37244475ef7c1c9006260a5c9307adb5e5aba64383133b2546af5b84eece632e0435fc0bc9b15e53b695b412321b2d0c042ab1e486f7e68f2f14e3dfc58bb2f18a6bd68ad31a09e9608b9cc633dde3e80f15cb5799cf7d7e6d14cd7b175b6e282adba5906c2795bf85124ae0d0ffdd053c1c5ba3d4c6b1027a26b96072406cc30cb80a66ef1df3d13014d71cc57c75af07960659b34abb09fea8ae81d4b301293efec169b3a78efc183098c2a6c2cd319907e4fb9979fa65dda41e88fee209165d8f0f5b82d49cac5ab7737c001aa63c60f26d25fb1091d746266ac9671df533d1081453d2e996b111d5cc210b03196a55cd5321c0b48c4dfa0c28625c87f83ce1f000789e3e2c3f9785f91e087e06cea8562beb2a5ac32046b85c3696f585c2f2608253b4e90ad5025746fc4394ae56474e18ed1eb986126046086be590907c2094e4e0903768305a0b4bb0385d97df6673707673c1dd1a6823798848c8ef9ffcb04f77f52d519c713a2d8c437c376195740be83f06315a6f8e2ae9574c427940afbc84787714f2d1929f4c665a827b04e3e26ca80e3600072123537c75dda709c5320be84dc5be2599d82791baffb06656b39209201a1f8403f850b6c9a188d803349a841bc2bd2365a6b3f735f6c8b505b7c8492abc9159116f69a93310980c0c7f196f656cae57c34b056ec11d4d11ef9981f75b4caf34b8e3389a50e06b8f14b4e3224bd2cc546435aca993d917d18ba015ebb13bd04208310c025caf1ba128c249382ca0018ae421db57cce6451eaaadc1f4c0a8c823e046c2904bab90e0a2733f7b63f4907e2697801b530c3f08368f30334a9132b4af653ec37848d36102a6ec083fb10229f621c40fbdfc0002f55698dcd77cad39b54a9f4886afd81b06d5d5aef86466d1b0b2be6bbb8d18291635c8c41133ab946db0f0749b0402b62a2323626c14bb9a95377d1a93262e0563b9623dcb4d09b759a9528aea1fde4c68fcad8c66ef4e24533d4808a1c17235870e90b5a88ac791a20bc09252c631969b00751f0269bea41b077008c32cf207dddd920cea6e84cf208495c8196d89517cd4ab7d977ec1402ed00a7881642b98c00b31b0b2a82ccb49547e4133d94aa8b41decc31bcec04968905828c9c99b6a8f13743a492541d1aecf0569f0b3f464f0b4ae6620226f964bcc2e9d8e6dcab14083a2cdb8798361a33f8135137e9cecc5e33777e0982c794b8579bb116a9db6ad07ff52d681578a7f499835574a4b2a85420e451b76bdae19254499dc22f43f2a10f49b026abef1575c50d8d1a803d9da1170905b6bb2602b38617d00f40eeef6944691980c890590de613f052b24a606264c5d96bd6c019111fbb8d502802308eb6d905ebc621dc6740c8cad049fbbdfcfa3bbe39ac7db03381442c8de7b6fb9a54c32251965056705720576c66232edd56c34ea6ca1d77017360365bb7cbec23e68436961c8813e1e1c2ed45e6b90b07fbf11538c1b7ff80033621a31d58bc371a08f03a9480ff7dfc8fdb60a055b3feb36903ce99fdde7394a45c68c986eff88a9537e98c2bd36982dd520b83654a77c5808fa2ae75f6e6b1b883bddde40414c03b8f114a4e56ea8175b702ddc8e8a75dfc8e55c42ce871672a024d829049b035f5aa51dbe5c3b0b887c255f3c208107071272b91fa20c5a1851fafb399015aef0e14413429c6802e5440f5213536130d4297dc75054d80f63e236a83d27c27e1c881bc5cb813a4548732d9d223fc4f1e0443ed35efb4ae67647ca8e5625f56aa5af584e85fd3c66d45efb60294acda0c50709ad8b65b81db79f7fde6832557135aeb3c1f409c77fb9cb8ab0cc815930713f0ed429f194c50b07723cb0e66a9097bb1ce4dd401105c684bb1caee7ff3610ed98d4d07caf4e0d7de995035f4a3b2635f0e5be7c23770317a2cd5d1dd7d25e73a02dd56da8f64676b09aaabd18e4d2ff7874a31353e840c993de505c4b75bb430d282b9db290b9f1b4c5e97e59e99405cccd4abd6a4fe6f68b802cd7c28150250ef4420acb81a467dbb4ada5b747490f36d327fd9890144bd6127a4d63e04035bac84ab7ff338ac97010305131c0cb20ec0892b88cc9cc1ff6c342979b8da40703d231a3db9f81d28365e0c598c04e98e9f663a1f460a18a85a2d6e83616dec648a08b9538504b142e7720e6561c688a2e07e24023e10b35d0620adb5618b6ad389073d9669893d9581c88e3b1b5b655cbc8b4173ba66025881eff4703d37c942c79c2efa0c64a10535c04d1e3e74da7e9c4154d11b6dd45bce25504b50a958bb8c365ee46e53a2637709f6345e33a263870612dc913fead6382c3f6dc735d35c913ae2a79c298142c631886d5f6b0b7a8f678c3565647f454509e4812f04504b90a500bb6817936af79df845ce6582e3fb6e96a14f1845f8355ee85dd486eaba6b655eaf25b54a760a16d26cab08428833fffc604b6519f7f93e994eb79d3b4ee62497001f1f6d830176121e9d956bc69ae0bc130ec688fb7151253b8ec2eaec3431185ff7b5b5deec4bbaddaa6b27e81034a296566ed051a231bfb538db647bb1c38039c2b99fbb8bb4b77778fcc1f2577b83b9160396e92bd0addfcc2d2a2eeee966cd56a2ddfcf4d2d5bb2bf56ce9764abe4b1fef557fd1c2bf4bb2bc67917323fde6a6f5e1d778e5f7bb17d6f788b0596c5e57fde9a2ea4bd96427a60fd4351b6640a3b08eb2d39d35ecfde62628822738c726317cbdc35cbd644d98a28ed69c956268435a9e1baf2b1cbdd4fb65a5106eeb6ec34520ffbc9166903a2f7d348e16de962a510569b00b6b21151814454b2c58a21ba644c58b0dc01dc688ab1c2154969a006a280b8f068ad745b83b9adbddce6d81c7356c4edab91fe5ea82b25875cd9811e052b5b737ea36cc8566677f90ceca781a8dbaf8192a5811ac822a9ab089a64754abb0f298467d83fde12bbfb99b9f8dcda76c55cfebf623aa59fb9bb254bb29a455150dde426961098152a9c49c5fce00305f8e307a13b801b7f38c1ba1aa5d44931bc2164e68713a01f4e7c2237814fbc225ca16f5257ac3ca93e663067c6b2a4e1ff7574fbeb487ae8cbee05f73cee06da9da6d8713f37754a3c4dd172fbfdd429920389cd4d20aecc4e459e8cdca4003a037db1801eb0fc039e01edf5634fb05f445d6e8a2937b989ab76026c8e54415e78922e4fd4e51973799e2e376b19263d30be5ace6bb80d462752eb0b6b2d87b3f9d7781e57c351dbfb0e8bc24492b110d829916198ef20e9d93c6b9d7fd6f9631d487a369dff104ff8353a2a47846599a68e4aad403ed8efd39e10d9929961cdd11c35a8e6c89adb6103da8034436c582ab60162f383fd4636a08d0f9a21363e6c7c8801ccac0935a146e4458424526a4f083b13639433eeececae31f1c03a4783c923fb6bec1e86242b1752259fdb4fc245f48898aed625d244f48890a40810646635d9f9de4f32739ba445b26aaf86794560602b17f61321ddd642174a84243d9a50138a902e9416caeea70935610b6c4b1392ac444c214da809638862886e6bc24c088bdd4f434392953c21d9c292224a89494384484b7ae88b98444cf264d304fb91ac444cfd4cb22259b13a228b82587277777777efe81e637fc72c7e444e152c17545cfe48bce43a5e388987bc54f292979a45041c265f9263e5bb4c9e8d5a6fcf2d7cad18db2083cb36128e8c0e5f2edb341932b6189dbe5bf633cb30cca46392bd0b9f63a5a46372fd8ccfb1a245130c09e32f92662d873342e90d26ef4287c38537f9ab7343c9cfe870ccf892d75c98e142c70407171e000f001766744c7098f12ebc0b3362649b0c8ef324249c189dbe9c8c183366683f43ebbbc9e0b418222d74e22d3181d1a92fa29974e24ac42a56b5ebd27a94949454edc24a4a4a28a73f0555c4844623559097940f122aa6741a8d1ce42067f18f7f42a150e8fa508bb338a8bdd108544359d8b0642d49594b755567eaa932514d5555652aaa02b9fcb223658ae8db36d61fd1837d4cd10ac5e5af2f59d28375b554bbaf7eb596be4d8c28b5243d7387d01397abe9b287b58455613f5749562dc9d4522df586554917cb3fee1f9233d1326201895e423c6ebf47fe7c989dbb0e85fe4640333333b73347430d8165f9c73fdc6269a151157790fe74d3d6edabe5369db9fd937bb2589335e764c1b0585a1e67b2a20c4d298baa2e15448a8548afd0a20c325e2e885712f1aa0167081bc4edab078e142c750255416129e7c09e740663b16d4a118bd55efb0c47c30c1df685dceb7d353bda2df9268b4e116807f6a3255a92b55a4b4baa922a8606611bfe916170172912a9582295f4385855a00a64f5cc6c352701c935a06f6418fc1d949e69c4112225464b90442a1a6acf595a40544555fce168344f1c31fae68864821ce4db1019a11dd99155d920f685ad0fb6a4cb1675d9c65cb6a5cbb6638ca3d168341a8d46b55aeba35aeb68c41ab1242b32f63956a8ec5876d429f43256b3b63eda634b1ab5674795244fb85f93f77390b3d0cefb396877b071e5aba356491dd520eff659d1e5aff7db4697df8aac8b1d591f2fd5477b275b495d1db5477f60a31c49966cb11d5d3bb223191a25a4ec611de4ae949be45f71aa885d2c283d3e41965d05733333333333734f2e227633f7b89a22ac04473d6e8bbb8151c17e1324495694219256dc537c401fa01d5d294783dfc8310d1d732c8a224dd49ca8d6640102e3295fb910577990db3f39c63835de660eaca3fc073eb844881e0742f4214447b10d3f85dc8d7164c56d1667e696c7619f3f43bbb4e79f88e2206739f90eb79f8783e084427148412ed4d5aa2c1710be60aed4b5ba845caa2b48f76bad19c2ca557bf12f54a75cdc3d5dfe53a75ca82ba5830b5543602f9494e10bd59b0f9d420bec33c109a280b8f4e4d1a5db2fb7b9795e1fffea1c74d05933ac88e2608fdbcfce2a59bea9890217c26d41f438290531650571826cc36118867e274d18cc9e71b273114ffaeb0eb7ff07564469da2d27c17071fb5b6c7f17737a08fb643aa81f071d440171e1212ac18c5edc638c31c618638ccc551cd8f871869ef18f7ffc2391b0f47b25b6371d94425aed39e860abd626c4ef180b8b6118f606b8d83b26310c932eaf7caf86cafbcf9216420a70e3498bd36de176dc94162fdd8d272d429703713f8c84cc81b81277e27634a947b739f0b664c9d90684e8b5dd80c0a3243d938778d23f89885e7f4f1e36f7cb4a9387b0bd0ed25e6bfec5731d1c9bb7321715f11ab4f3e5f0eeab5272b2733dc75d4c96a9dae321da76dcaeb6133e7dfaf491d933622437f673d67db55e5d771ba0a197b0b4fb3230726717439fb049bfdfae8c41c162d80b8e27fcf1ef57e38ba61a376bea042a666e3c6d01e4f6c7266e3c5141baf14f54882efd8e2bb09f7799c414dbbbdeace131a13181750c5c9fe74960bb578701f91970007df9d7e512e0f78bd617faa4dfc4dfbb87d2880317e0dc4b5e574703251fa362fc8127593ae5ea6e2accd7a15374686febd4f571678073afbf3a3a1c61afff7488e994efa97dd1714c7bdee4b04ee41ac9138e862b06355f7209ec673940ecf55f6bff75c8abd17cd17dd5de4d173b1682f5ff3a8caa0e83ac3a45f3f39bd533dd921f2deb544c769b0ef50a82dd3ed203e216dac981a9daa39fc375af1cccd21e83da9bfc696fbea853e6f671fe742b29d7cff911e6ceafe1840a40f78be1ce176ce41736eb227758a7d9c0c6274e3eee67af4b9a52e0472ca26c11458e6458c3001d835c9152755940229c056986e60c996078f08e094ed23c4dd1ec507b4b8c2b9a754b7ab2ce4ba5cd8db1243d18119811266cf4c4e5770c8c28dc022fff142205b104719e20a65ccf3f436cc3655233949a218fced50a20881e67d52bc43a24d616db982d2d18b79d941aa5760471f99904b7e32d11857fba64cd16d66cb91c9aa1f6d2e5276d3970d13445481185a60813f7d636da5e369616b27d3670f3b1813c326ba46045e152b87b8c2f317af40d6a0373fb65836aaf5b6bc9bb41498fa6fa36294da5a96e47f1c2dedd9a21ac742158603fad35bf4bb3aba0cd12eca7b5409ad4344d896eeeeeeeeeee6e6e96ec37b8ed23500b4b4469799cd1287483f9a1214614fa41e20834881e37c1400623b6e131a6d1cc41ad818d1185fee773871f421d2111e1fc8c58224a3f9da1981e2e68721f6246234e088b9973ce499b4ed953a6f873cbc0facf29432bd0a2b64981200a888b8987a804337a0141954aa552a9a44aaa381d0ececbe83ec02ad447ae54546ad4902c1982606f2a9554a9a44aaaa44aaa98f31f4745450002e828e249ff77e22426a9bab6b09f2c4995a44256c136623a05fbce62b4a081303218529565946a60045b2f5e038940010fd146e4bf4b05e3494cd22355302e9354c1b0d429edc0e888bc00e95b9226b98b0341f005a0066a5a9d425d402250c003942a10942ae9d1400d045f0082600a002d08126394514af9028d11ee7290577e0e726e45884a30238e3176d75081b09f83abcf5c620b4723559097fee983848a299d54543cef9f4b382215aa00572b1fb89a506225097e599a4a44e740617fc43a97b83d2ac97490ebe309fb796bcec97aeb8039affc1ede49217dd23bb07fb7aefd3bfca023245b73d47db7903bc186b96711ec275b379e805c7199aac0854b514a29a594524a29c7184bff1c8eb555cb589ab1d8e17284192a7a15951a2ddbe1e0188ca0070f2b1fb854e14a12dc922d23225de23655e2363d02acd1a2e06c6519667d749d2e25267c50ea946f962e4ca77cb375fb2748451cef4b2de9a99d095f9d097755fea0f19772775ea241b0df544d55946196220a15d133399c5952cd92ca5bf313b32c6ceda14ddad5c03f3b1c985767223b2f39137dd22fa7b07fe9089c9e493f05e9c800ff5115951914d05e83cc802f96a4c7978827fd3f4ab7a3e8072948410a724c71a9911d1a9056d24e3bb885993597eeeeeebf4a2022f0cb4c2157fe33f4b37757499e30e82a71f7b4027333333333337373cbf95db75652a6df3d243d7e443ce157620597bdf3514461d912e29f46c07c1f8d7a3492829b99999999999b5baedc5daea4c7a1b0920a971de502fbf9c78df85c5495f82ce122140af5c476848bffc0e37eda68ca39fde4e323740a5f4ee14b679a4e58983ecd6503ae25504a315063d20ca11942c3038d4b47145731fa93ac4ac01217929992d0ed2791216195804a7890b44a586e7ff46118866118866118866118866118866118866118866118866118862e832c78178158005f0e6badaf19623f15cd10cd104c3304d30cc1344330cd102c0bcd10acb3d00cc13a0bacb3680a20a1451a9f264f3442640f913b4629e79c93ce39a7c718a38b5a5d58fe898dd418dba34b77a9434a29e59c7604c6741a3326c7b320668ceeee1e6d757f6696927264a6d15ebb6398080b9c65b7709432c61b645986b1f449af8c6633cb3ccb649675465dd336e61eb62c0b59966519566badb5d67ac929438da62ba3d9ccfcaad775d52b9359cb205934599645ce062c2c2c2c2c2c52b24c59044de396ee31d4a8610015159f54d2f87fc1f3bc5366d46dce194d29cab35d4629634fa67122a1b14a4a2953720a969f6273baac564a97324a1967aba29471ceee93524ae9d1a5ac12eb8ca58c31c6a819410a4600c20873ba14a6dbd0c39c0ec4741b7a3082116ce8c1861ee4b3704b17bb692cd5d50a3f378256a96b25e7a671b1d726535275e3675545c52f8e067fcc5337e449df1b11a50bdbc550a386951cdbc3fe7043ea05cfc3b20b867e31b5ba565d8495b6cd6de35c75e3464a6e9bcd6e1b49fb41bbbed66aaba7328375a98008d86dce8fde8cb3021c4e9c6f01a923c618e79c735e53824f7f4e3a27776c97934ef91fa593d249bbd975f732c6e6c832d3f12df56b8c36e44ff7c901bf3d3e2638f00a7d5ea11d685b31f1e76bd280cdf5dfdc1e1da0d77d086dc6cfa0e1eeeefeef52769639f7054ebaf4350d1398af6e5d7a5df4a990f6e86bccccfc95d51ead578828b4766415220cf435b97132344a9f7e672b20c913fab55acb798c74e993341dd76d5ded5efc66a4fbedd98fb0f34fbc3f55b319e7faeeeb90f4c078faf2d422ddf72dfcc789212324a3db6e8c17dd2781b4b0e93e1973a9a6fb6410189d8fa48c6c45944d906a339ae2d014a526388c3c8c87d17900c68f7c5ca175a4e3011e46be85c7d1426782030c0fb4f0303eaee018f916ba91aeca931c303a499850d9da648bd64b59c42216b148032c168bc562cdc06dd5144db672ea5f5af77957461456b6fce32017652dac254397863ac52451d2936385be4c49b9a24ee29ac408ef6a1b217e74d145094c4e1802ddf184983984c90a94f3577e2b0304dbe597272082119acbdf20264517ff1c8eb519f06e77102cf3dbef147e1a9d2272997348d60441db00bf490e1ff85cee7c64fb6f24808baeb7a86a36e3d09f2dfa5a7ea487f370d539f68565c276270903e47631aceb2f7be6ba4c07b97e752aa5dba593ba8deb6313228aff27e512220cbe8a287e84951f234aa7fc6bb596b3751fe79fe52c139bd8c42636b189431ce210872ca065340c6358a36a36e3d09f5847a2ee7dde951185fd2449ae582d0fd595244959929e1c2bfed2243dbee22f554f49b3fbde4558db4fbc5084563e0d0720cab891c6e749c003faa4ff83e1323f03240eaad7c2fdaad70e8828fd0d88303ca0633cc0ed18e3f57700064494d64103b1091bef175947d0d0a28af4f40a3f65aecb5460515858ee06cbf5d8d579a0bef4609d07b2aff5ea605decaa3ca9214fe2cf6e19841669c8971fbf3fcf89dad6e115acf392a37d66e298e6b1f7ee86caf5330bf69a8ea53ed7dd90279c1c2b265cff06ecebf3d70e4712dcdd509feb70d478794231ba625beca5752f4f78bef4919d7f75de6db4b09e0d71a57ee46e603f4353ea5dfab63dfa94473e39ecc7e9489b789923322bb2f960628721469354ca8f2ebbda24b7af70fbb9d60fc4e00440d4600813f8808315990209c4134e56cc5c9112b6eae06147885042125b9cac58e2c572379eac706209d6de78b2428a29acc88d272b9080c5bcf1740413142e6b473833aecb079bdd780a42170a38023d456185eb379eae08723ffb202d76b1638c1d63079992a8c40df7f6b8643302000000a315000030100a8804e2905838d1b49cec1d14800b66805074563c134a634110a4308aa218638c3286000300200610a3100de924000d5f235f820f1d5f828f1c1f1d570c7a7da04b00ad834e00ad833a001d847ea8f48c4a099474ca09948b4aed901e41494709418948a946e81b2925280929d5da1dc187cea7cd87d117c507668128c51400b1ab0b396a7d8863932db0c330152125f98e05d8382eac72bf83d68e22dcbe7471600d7a74cc19d3f03a3cb9f6df89e09f90cee61cd2573267ac12881efa1f4273c6229aabeaf9402899f2e9b039632e8e4b480c13d798d89fe09c31a22b78385eceb63e736633524f2710131501b466bddd5e173073cf0575bf00bd082d6f3e50c8d55d821212f0fa1082e9efa503112c991bbcda628f2c4df0ad974216f6ccc6046d5f1dadb027068603b655d12bc3f514c66eaa6ed3c4ceb80b12b97383865fc059249137e75d286cd3cf6a9809483ddb2d4aca9b0b0a7f7567a144069c3c43632c7d8580b76a0a68d79cd85dcea2c42b39a31ac73c9362a9e13c46efbf9bacdad80caceaa7ef0beb2789c99ba3e784ac434e38930e2c5ae0fd92655d9aa85ed4309c22836b1d522ea121458899ea478903f3bcd0f197c7e3f22248df354d6effa52149bbb0f0e83f57342b0347b66d456222b143ac9e056652918518ca7240601802e40104ce065be1fec35d20a1c358ef4883310478d9a36d467ddb8b5727770a970a1362df737320ffd4e65bfa4a40235fba1b615b0c009b8453d703ee0c65d745812cd5b893a4cfb26f2ca911d98ec2c567f140600efa49ddfe8e5cd999707ee4559661e5792e02de9764e70fe879759e65a0875ba0f2e93be967d43b37785569f9af6e77175011b53a2edbea691b31786304b5e89b7d514f82fa7e66e71139290b630a0c1c007460c5e36371dc34b13bda842177ba322f9ea3a0dd69f72050032186a444c5478459fda783a913cd9d828e401c487606550ad9ab5a1746642dd06ba1e3556a9a470f995b6bef062859288a0bec2f50f4a196e58ed465e904f0137e3b8e99358851929e9bfbccdf8fc83da47fbf569c41905c6df7670d09f906b874b1fa8ca2e559ed2445fd174b5cf1a188686e9e5c100c2437001838157b9091accc1c7c354166b23bde6c022d59c720f840b43f12d185ad630e7cefcf27aabae99305484785f3e0719d81ef52a3b9e89cfea47269c43c9dc527c5ca6e42cceb16373fabc68ac80aad14668dfda38fb30afc9133384694aa5dfec1d22dfbe1ecdac41fb2c441f131628d0a2a941fd6d46196d6818eaa7f791aa65ad37e3cb96220657cea8ecc1fe40f569fb9c00f55ab8e100b778157587f123f4b6d2e207d85b4f6d34c1286c55d632958cd23ac90e28bcd905343fbc43e5807584db5dc6a4a4d406684e691cb3ce575073c940ee7814d08640bf958f88c92331fddf23d7794a1fb7517cdfd5629f4df3d47e743fa609de0a99b743a44a3f4a1f0d86d753ad8eb105e6d5de24b3c2e88fa29057b7cd19551a503200143d58be8680ddbde0c3a402738b53850dd08fc34c06894409b2c63aeb0a0dba306f4ed214034a991cc9bb23e42bed73c93f5abdd4b5accd4f41d327a04373049ad2fcd4043409af4618b404b2257291399efb390f697fa26348fe88d4c3d86c2ad1b66b2411889f77248e444b18b163e06b642ed0d2d29680b87d891f89b46e7633096be9cfd122f320342052f12c45a116197402cc524b86ea689bcc3592fcf3062bcbee0adf7cb2389aab3765a118c031d651364656b6dea9428f0896dcfe1d663db94b8bcc702177334638603713a6bb4d696443632b6e66196dca9440082aa4dff5ca5c24e6e745e807d49b19c229fc36dad28f62ac51d2282468dada440c00da9558080d72eb559cc21c8c6c76ada0e3f9c92241060fed5af96240eaf96b4e281454c9d2a7b1f17527a0f2bca55592ebe72a3b9d49c435c72c93503f9dbfc9b68043f53ab047d3189f8eda27749a37e855d2345df0d8f1804911dbb43a6acfa5168a9f3ab764f808427e097def3129db0125b41a1e6978dcd38a7a220ed035a2b2d33a20f34a1684790c903c54c3027133e1b52d5122d47fd6641a6d17a21be3521965a6a62ddc4fb0e30f26e7bf1e6786110c1316df6bb1b0dfeeb0b75a0c7e5054146d66a2ee3211da04a5a1c14a2fca14af6e364efda105d3feba5f4c131fb8d99c05f2f72df026c333c40bb4f32e451720fa6ab0e93342d483c2d389e06ab88fd236636217c60e919b6f0ac9a20276a9f60e9c25fbbcd4d24436670641538113098469a50eea6780394ad5463623ee4bf2ee401b5a681ae5de119ee2e7ac1e0502eb180716304ded0de8f8935757cb2e59645de7a3a897b076a72684c07bb520874485731aa11d38ccabc8ffc0d8c1f1ebe715ec4165e654bccd8299989e08ac8eac241ded3ea3e15e17299ce9ada158a7ee2fd5d4e7ea925570099d5105ce28e975d0f5240bde9738b1e5f1c21ac4c2b7d5932bf3cd2f1373b098010ea768f321a433e13c7b5bdf71701678819033cecdc050211997bc14a7cd60b2571ae1a14aeef33e9d5bc3f1b828259cac4021c637b7946509e7eef0c210025935edd071b331575b1d5fe68bc2e6a005209a822c81e8a038d24804927ab13b03866e5b1edf0bfe806408be29f95f06564f26abb473ef023743a815120612c886e048f38e61cea1c56c697caff52ae7b9cea1860f0e610417dc13a817d0261d9801050d94a205fc1b40488286f38d51b7e8ad18061e853cc87587cb56b00af6149725036c52c56b6983dcc6d2ecbdff4567135532f3057646134e47149accf2ed93689fda0ff280ae640ca52d3462f2c39d5391db0d1ad9d384919f2f44a0e57c865cd510199aa6e4ee846451218c941575238649740f29d1c5226d64680240a0051b633b274e830484e5ce9fb928b37bcd9f662edd6743440bfa3fe71a1245f812cf5645ea5adab0f0759fe2f5614671ae7d569228d0dec02a2aeb6cfbc3d88345d4d11755befc4dfaf498e959e3d67a9461ec769443e2d927347002bf841ea7bdd0a47ed061fecaeb9c9f663cd0860fd2902a8264400b96b35b84dc14fe1ed5a9379e38e417498e9746f87df231650f480cad48fc06cf26ada974c84b65b84330718660db9bb4a07ba91807ff9b3c56bfd60cf22cab066e87d109fdc0b4a1e58460c11e4f2d0ad57409bb5b16e5dcf0001c219b2d67d4398a05596863d6049b24e4974aaa037df24ca516aa85cae63d4f3c4c2b2a0ba94c9f021867fbceacf66b72887277627a93a6b408eefe1df667847723768bdb3481c74b3c3a67fd49fcdc84618b9796ecda66f49d7419410cb607e4b8622f692326037033d4d6475db6dbf10452af8013c967493807cd2d4564d321563d497a38b30c65032b7f173d55466f1b8cb4187f015672350b8a673589df1e56ac0f88611560d28c59d1313e3c10c148dfb1428277e0eb1722787e728dcdd617aa2f696431feaeced7480bcd889df65ab781d027c9b480bb5b6b612b2bad6ccc04f085850c96c939895d66c516976f1cc5ecbcc5b0880d718996c44a7624ca439f14ede0876c4191f711691a40aab2a2ae7d4f15384908ab3946b569483b72fefccfbabcb42963aeb7189c097eb9fcc04ff50dba358a112704528d85f8da11927aaf8746b3ad80464868a5d4302a6c8f482158464d3ef78441e9d615c0de651898730ec22e5c8c71034ab1acb0cc0b3f82f247050de38d5222b39ba8dd06fc6e3c5f9b749beaf5c73d7421dd12ee94d8598e47acaee75ef1fe4ad3b2d951b5eba2e6dbb47dce6172cc30d4b9e7a09290036c33be5adf8db7151fbaff2132abf252243c1ade753b0910783d8a9271227ea46f4fd10cc20fefc3deb91f41ec43cee40840a008973e5963a587e1edb12a73af1c03283ad6a291d891b219b67955faf6880c74d244cf62eabb3d2e9e42549d75f80f5f281c87db11056391ddc381c1892e49b27f4090b96240f69cfd21342f1dfc55890e3177630e0f697cfcf0d2d19838a9e4d6e9b52c9a16138b1ccfa097beece3facbfe105ce42e19b02bfb7b44149a5c099d5c3d70a5acdc22f1d30dd94642e3ef40d57a7243eb49d1bf123c79d6f5603378505789743e203cb71079006c9a66fc2de710aaf7575de913f0ad21dda8091ca02ff0b8daaa082ef087e35d5b27d130e97ec1bddf57791ed85b30dd8b518e5cddb1bc1e26f63d18dda80e5d3eb96664c3f24e0cd179186dc6f2604e0e0668117a0ba4ba442e10a4341ae39221c5309a08bbb03c6a510a7ec0a19e0da35a0aa78a96da6fc2989eba2fa9ca1d53a6a101a54c9ed809379ebf92042194a06af02e2d5886b45e55885df47cb60748bffd0f1bf33451765469f28adcb9a5d28655ed9998eb0e9774f7e2a6690f29afaff02a642520f65a73c4bf131a70be403841938d83105941404831ea19c0bf9c74c73404b88995e5762ccbdae443a5cd3b6d23fbea4eff269ad38540bffd6ddcf3bd6b976729956ce0a8eae70cf53df7e1d6fa32c2e4afac9bee0a9db79017bacc561f535e32bbf0a1569d2c7863c0eaf574554b309ce1c5ca57140ef53c192175226f92777d9d5bbe2bfc2673be72fdaa3964aca42099af6184eceb6776cec9515d19b63099fe7d25a149ac547ae65301a897eab70bc5320a4cb5c4cf92c1ed27635bd04685f29a599a196a7ddcba6fdad1213efd0e003f53b69f8dad2e46cdf492506ba796abb0e56e2ca44a5faada16ce36ca6c2ea5409b4559438bc7dd4254948b6f834dd3da55cc40fb6b2f956a49b69d3d0ea0a2dd10ca7860c17f984008ca47398296079e9e9eff9a4ba243c42933e07685049ca172416ab8c5120a8a9cbe75b1d70fb400fbc5dd2b0805ca448b11b6c12e6008cbc45140f615c3de468c8179aab9b251608cd9c848574fa5ffad54198b97e23074e6eaf03d37188b8a3d536f24d66e50b85c856e62f5ba4474f25d9bf5d0935604a8aae3bcceffda7bc90d2b57302aa9572811717dad5dcba3e3c72cd48db453c6e97e22bbfd65fdf03f5dfc4584a06f8fe7e3a02378c0917015a4441676c1b91abc1105a1c7d2344c88ec2f8dd3f2e2fb84338c306df9f40859be216003406b53b81ed5f336f98b151194b6b5ede43cb8374008040986f955aa3e39382b0887b0f5f0efec1ef4365a2e81d3ababeb97b5f96f63fa0991422be33ab78d6124156a633b91300ef4c7eb177199168860d74c932bcb4387b16ffdb0db4290546cc6d6d56c3d97817beeed56e1c6a077ee374821bb061c8bbf37740b559fb11ff4849181b452ba79188221fb04adf7ee84f9cfaee2745f087850c5482fbdb6d3e81b75984c8910cfff69f8a9ded6d98c4952d95a2cfbcfd107378dc5d704f2989437436038a08ff5085b9db247b0a7142a864922f5bb1ab6661d0c3108ca095df69773966c04b06b8d6e4b34012378c0b325a938362cdefa8f24aadfeb29a6e965638532467f25901c53a8a4254ed48b893a7a493272ab21eb32b940816139c38f0d3275ba66f335a3341679fa38fb31fcc393889779e638211f9ac39e4ac6ffacb51bf2cb24f547931bcc559252bb72ee6ccaec317b52bc9418d1cca10923267fe8fb31d39ec16d83ecd7b220b511d60a8b8c85d3f92afe10a8d83095a8c7e5f9882ccc96cc2593c5fbc082b9954d1dbc38141096e995dfc30699e93f40ac99cabfcca2e53fb1c2f1d874c920cd8da7498b44d660418646f89fa32f2c652f91cd570d0754617d021e8dffe7894450b8aed9d884935787fd4518ff78c0d6e8de0fa248a8102d8bbd326c8a17131fb5f1232de93cad254609410968afc5c966374b1320e46ecb14cc01e59cd5ee024e3e510d83e7d9e174bcf435b8e1baab1b4d4d303f01879ecfc7591c694173d1ab0e2edff2e091f80153d325ce496b68bc0615aa798ea8e20b8d07d7bf5228d7def9b9fd11fc3a2bfc869ed4387a9747c81f9e24c11cc0ddb7afa0d1c428b9c533473d59160630fbff33a6434856784ea31ef716a2bb5d6bf3eca1e18370175405841fb5ceb7e4a6dd0273ee5a0ea2c2160137ad691c7986adf7032577098eb9cad2754f34ed29d31f786cec28a2e7407ead6fa1804e40304f21bb8e5c2076b2fc9af658148113084a1007876abf19bc97f292fd236cd8b56983a401ba5ac42f5550ada2ca250268e95203ee86989bc3bd2657706b39e886d31d7b583b8db442d3f6d978856f5e15828ac5f55657c061fef954a19a487e21cd703a29d603c6c1f8966b8afcf32c5a10d542976ae15d6f427aa5b84807d061b8b53a046007e5e62484c9d4915e4052654a609dd05ccfa2c51136b1352739e9e16ed30fce8955ded90dceb611f3a5221d93169dbdee2645b55d0475976a5af5a54313f6b5051883c10bc358440dccf3f13a34a7dec808db4b0cf426f0762003b4d9cdd671949b34e7988660b4b517390cad3059c352e7b531d99aca30962bad86c47ea8938eb0a10d89f62a5d56bad14956b3998eb4639b452ec959699c23c0b2a59269438d460ee59f017e8a9117f0b24b5fb75152820e5eff03f4ef479f7a76d66de355fd81cf59e10a4286c8c28c77e8fe88290ec76f18dfaf6f0d634a955c8b2adca80429598f68254e113aead84265d719463cc0cef4ad45afb3a1661e8177c7da137a4412ea9a0403642b41e9d6742f9a220258232fbae7a3a71d023390057093a88755e41574c76bdf522fe8299fd9af51b964f5ecf96f117832d9a078f40c45a532d3d2a46cb54bdc034e661134958ecb6c5f0454db58c016406bf39a457ae498cbef1e2d6ce4373d58b58d20fc90d6bbb818efe435f2921c2223a786a691e3af297ded06def1090c83d68d18b9335d713eaf996b91ba9119762df7ae1dbe003835fe9f185900d28f4e1eda0b865caeea913a11ce78ef74469bbd07027ae758a18e9bb56217081a83f864b24f8637b30bab2505cb04ee92e16a35803f3ea42a90525025a90e0f69d6087e7ef441187397ea29666b07ca7e5f87a307ae3bcc671c3b074e011ac887d731c978f4c04a1bac1c2853ea240a9cdd04b3c237e25c5f6eba9f0592d4ea573e5faa3938cb8b7097d0d8dd8de90e641acd739df805a43e27d7f41b347e07ba8d36886f06bc39bfdea1bd265a84f3b7a914fdede1be60083c13e003016ff1718572de267297a96aa810dff53562eddf11fd4d15850eec4dff401cd9396ad2661c727e3dc89fe5ad37c9ee268f4eeae2a6114c337aed91ef0294637bb493fa6844d7aa60a982d1155fdff13b51b2748d803b0cf0f98a3a21e9f42b7dbed5e0cc28e0cdb780153cc6d11e17770b1be2b14dd88710889824b58b6ebe2d610ffb67021e42fec4f63c3a7eb6d21150df52a5fca6dc8a9bd700f9e0709b5fe5f78548441ad3fa65d384309443c34ba5119dc25bf612d061745c0833215846530aaacefc772f9b10b2e0f9bc099f13be00c6f2aa492a47efc03ee1662ee9fb110a78f69e0df7459aff31ce5e271ed4642630fc8ab949fa77958c3c2a1d37f5ff021db2feea69b018e47765744ae0fc6c38f0ab86ddfb26dd55fe29f9987c637f68a05f0f109bc2b8ae954503af0b00288e6b7c00ba83c8fc08470eb33a26d5a14f4f693078b7563b46506744fcea12925c54d229fe2bc08d81769bcc03c43c6c5f981ed190cbc46529649e177f2577d9f1ff815bbef3bc805632af6100492952455734dce41854a9b7fd53d48e5aafc356f3a9a22559a6f874f3cf1829978038a55a1e65233b6ff1d58c8cbad1df84b8fa15d98b749e6a606892fe7e9b78eaa84a8681716e9395dcdd27cf1944b0072b7cc3b5db7ea316e3a1d678b39daf55636ae254eef639b6b4c6e3bb8dfcfe2415f36b922fb91f12842b9160905a1e31d4a7f4ea3123a0e99dec8293704baa75a5214a60ff303158a0813a5dc0b59b1c90ba659159bb97bf78a9d17a1d9c6208e8b41d8b82a0ade716c27b71b2b777180358b8c1b1032e986294151558690b5d7a5cdbf66df4a546a92887509604a1bec53404eb5a32077430523a68266afbf9f985bda3ae4f4c31c0b999a6d354fa48741d94ff126c5cfa682298c0481fee8e02a47794e0479e99f34054481aa65779f6a1d4c4a61d7939e48f61c58488d424ac4d678bbd22226f22052460d1c267a5375bc0cab94038c838839889a10674731eba8a28febbed0388af1c00566b5e164b95e25e658669f43d4c181cf1cc821a2a42f767a14b6cf1cd849d08bbe1a719141826352efc2032d88032083d134a618180cc421775b7813ca6861b7627a3ce1140382b60cf22013b3fc10fc09c2d1c34fb289b95cbbf3a7a9f649b3cf0ce4b8c848ba91700aea81bfe62c3295edc033489d5a28242e144ce5a75a09a70f4de63dd07a4b8c6f24bd3151c2108d65407e970008bead3065f6403f8c71da39261d614e3b02f01c4829e94ca0520defdc76e7feb48722d963755473212e658ce1a31650d900ee67e90390b68e6cc0acbd542395c5e0ab062208d835dd95d5b300db2dba463f5d5be11b4030e410430d196ea9a82d57a88c72b488a65c06725d1d00a18610e5fe9927910cb50ce39785b8afd6441a198b364170ffcc2499b83103db681636deb9748abc1e2046856a645d9057aed707adbd4635bb126e6401e2d95e180a139119eb173ac138b9bf349901109f54d542ca0d270aa8056c56956218279cbd0d62544d06052646b177811045c52f3c20227b4e8515399468a3be7e65abaca01fa267936e405cac66da45a54673f5e5606e751b50da7dbbce15ea298b99fc4c0ff2dc6a7e6fb010ae7a90bc0214cfad07c85d80d44b653c5a4ad1115a97e30a7db09b4cd939c94f6c9061d700efbca531930e5cf1c2bff9899f46402bb4ebe284bfeea13bb809052ddc5b74cf3158173bc03969b8f7d982277c1a19b67550c0c6c23d47a30c8f79cf3e9026166f1b9b07ee40b3848fc42d9eca51a94a76256ed8c18d108f2c064ad10f8252e84d6dc892c63dd575d19436f718e0320720a70cea023cb2efe0d6f3d7883ebac8488a40c0abc8e215c097ff5504daf5c2185097bf0f5e43a0dd6e49b8118d5f01710370d16bb5f6db75cc068fb78c37e16c0169b31cd6df9196ac18d94fabfcc0f13126c442c60e2768a983672b6d8e9cbd75c2e2ede079a4ecda0285e0bb30ddf0209ea49db857cd9067b9081ba414c792621ea9e060755821e7c1ac60a190fd563cd502c1c1aff0ff53df6c2c3e1bfb9527ead42b3d55ff7a572329811430993636909ff5f661746544040f00a3406d04d5e9bc3c98bd8dfc765a1c2b5e9e9d2f5f20e30080e07135952c9fc4e184a9021282c1025e9ebd4de714527f64a8f6701cc15160dd18edc3e0ba732f41d0e1e62702ed3d035c18498032b5639e0a8696a0bfa941c368bf87813f1f7946dbbb1ead0e4b9b9d8f77ccc358423f96d92f6b7ae1c39c7eb4a9abb8aa8db39612a329d31b5915b036b5af73bfae2be691c303590cd0bfb96c0b6f4bb37df18072f64ec1c53caf20253745b8bf37a7e3016847d7e655eef617517277ccb1277c3ea58bef9ff2b84a8e139e8fa595d478bf67428b0f68f18860a8bc6092e23acf0f61ce1488d267ea22ec1d527c9d3190996ffcbaeef4198f93b81c44d9dd250ce912d6670bc6e478d1d41f70b387eaa458444d8f607614e97026aab287c8f2b77d30a95a4e6e246cf8373358db046be3c8c5e1cefbe94e11a3745164beeee39d96affa5e8f2123b9728da74980f79efc19658e74493a5480b0ed10de786253d4c63a43b11add96d8f6a0b60597fa0c17f31568800e0d21632d8c11fae9ce4f214e57f23fc2b2f08de458af1230b38053cef78ff0927c7824776066ee3ef4acc4b5b2e3604188ca7ce6928633cba5f6585b065715d6910b9f01b4f91bab7d06d14b4046046a1b2479ddb46790aa1af61b93de5aa8994a774df13c1c3e2e398c2fe23e4dba703c26e00d9845e82a3da6ae109c5c382d55866d41c52a8496d8acd7212f9a969d5b606faa661735712864418a2b94d581088157c31a040960528c92e0b5be84a88ffe3ebfd879c3e4be9c83084813ae18eba15aef2e8c2999dee8356ad6502ed313c6963c476b830babe2559762288bf5cff938d635e4a22508ac96421b9782f30b0dbfda0272b56b7aedd99ca5398e897dc8666aad9e0a347d6ed34f9945486b9e245e341305e319971e64135adf3c4de05171e367ad6c18f8f666da71a99c9126df5c2d55af5ddc29d9edafbd0a40b4a817ffb2b5ef4824ad94e4816150d9934b40d777d226272cb7a1449fd484c16326ba70b68d144385cdac149356879f933665160b8355613501e765357cf52bd8f2673d652df77e97486ea00016294950ad22a58658addf3fb0df0f1aa7578de2a451c802bc8f060c4b69f723f5e560c5826aadb8ba8f4a5dc1a3d294c5ff3e73018704b118b5ef3a8f9ba1824a111c652619065b5eec558a70b0c60a091e86f0c06760d6ce30e9c7e9a8d566005df51ab8f6fdec2dd614b40b9a198ec8bc58ffd4f316b19865441ea819e7477b61ac65fad80bae349378121595b082b01e9d646e5446c7e4f5b75ff7338e6427e7c660089c1866e76fc660092014c1659402c90e908ce3ed19fcab5cd9adc3ab0f8cda85a6dc37e10086cec4c52e753fdd2590d5b49439387eb00aa2d6a57e54a4027c9bdf4eb51b078dd0953791a9018f3a8d28b156b981a6a1cca910257ec41a4fff796661f3eca265f5ed223489c2709aaa09657bfa92b9ace08aca097b758f3e1990bd30fa49ff09a1e76c7451ff710178d3b30b180abd47743f54d251d7cd2be7ee9fc7abd1c500a4b6909983520be8ea6e43572c4db66404944f38778240e5d8675aae607d661d8ec631920cb9f30a62a6caf9171a87b8c170e89d5bbfb42d7d01e9efd060afb61a45dc1c3339b25effafa677bb8bca50b29ee86b83e759807c89c3b81c5d0b2934a2c62e2cb0cfae2a30b0b270c9ab00494b3d923eb6c0564757e7d8be7becdff6baeac0ef5fe114b06d1e7e18d2b1d6e09469cff21a07471ce3120823cf4a5027e2d048953f526b8bcd436a2d935904252aeadbbdbe38b32e560f5d18248ad8fd2044b574d5be49053266233c87d10591dd40ccb99a5499e46f5111b44c38e833162ec737e40b5ed393377df7108da9dcd1c54e9034255ab113448c69b99aa8e98b082b5b4806f3ca82a50c260f3fd76bb2d465fc8f7278bac79354384bf06f805c563f959e9ced2f9565e871cf6d09af088b66514845aa230191e9045ecd05cd600f4044d63166409b833041932c201941ea1a89da591ea2b13a070ad6ec95e86825ed019181399c44e0433be8a0965f292c9d896db65ac495f1c566744eaac6c868e7fe5777e78581325e590f9aab32a278604839a7bae634a2cc076a09de0d4c17af72da7ff2c30eb801ed70c90fe1db2b6f91ba53f7b547b2fc7a6f55fb5eb498a0d060786449bffa99b27e3e2d383a8fc42bb0b64102823f1910a0c234853ef11e90042381d548aaf027829d569781c5ecc6153cc7fd2aace32ad71ded9ce40744923e8165acad2b7336a652a347ed9233f484636977d924861fc811e2213e4a8a8fdf28f760eb8769fe13de15fe809ac2c425fd3460bc4bc1b46508b9aa3f2b503114a87e44e5d4ddd955d87029632b575643128fac34acb0c2ff3b6869441b7785d94b8b5eeb570e7a4141e989fe31e2e5a531a284f02975b2e9556e4b4982daec94a685782d4fbd46c6f26f2da5cc5482707a179547986acc4c67519583b715679153ce1205840ce6e563192d8ce3eaa8d1d3401fa38c87587351f69305a434a1d8a391ada4972a0728d2ef78a372e8a21fb67a1d6a2267c09290e396818f04c7f6c9457eb00a61f1740a7a479ecaf3abcf3665ae46bb63c3f0018b620e4ad221e136f452ac1666a604eda708c601772e396cc860a9741b17002f14a2e083b93a427f51873bec53a2a15859256be4eefaa01615e1f24e9a92162c320ecad231ce4751fa5ca13a0132e72fadb459f8665b09edbb8e2c02faa70fa41a461532a15e10d24287d26d9596f03fa35a8432300352c158ce42221b891785b23a58bc9eb95a009ae481b2a0c6cdaef0f1b8b9f7e68f1084823dd42c13f18a73d54122d51c8e8d6dc2418d0255211d793e2530478341242a50f7ed6dd3756402f261060ead3388bd0b66bf3f6ec3985dfe43272233b40c446f283468ef48d61f319394dbc56eaf6e3c7bd315a235333cce7ca637b9017f5f8cb3e7b546051a685312f37535e21f05f1dc2b6234b8adba1f227355e7d2e76ad3097fc8557ec2fbee2457ebdf232b51dc9f6a0dc9d4490c483022374e5804f1099c8d68af5fa8cf7435ddfec54e5f3c86a96010093387a1849bf838b3989e20bf8e0870676284cda702bdc476fb12ce9825e11e825892643c93af50ba30ce89ad165193355902e6a3d3614ee38b1230776a4697dc528a86980f04f7b755341c4780f76185c246fff80475c97dae63f2cbbcfee084550e5aaf31eaa5ea2172de041bb04f29822facdd164f4dfa817e27799ceb54dc455debb0b30ca87c969f68af996a72a85d60ebaa799b34cc43ded4f312a7060a0bd6561b5094d2ffc1263596029747238a711f52f2050e87cfa37782b66c3c22b681ab2c45df54017c8bb92b9bad8eca931014e644dc6882d6566b8ad7f367849e568d38f7dd7201b598d17434f16479f79de180ad32bff269b5037eb5173135752e59d23eafe37b650b1fbd348a29fe5968dc2083708e0df361fd66eaeef97d252e600d0b9321b77b870626f77d0808ef79a1dd282ed5405156f8759b3e0259afea5e672391a03c18afdcc44f8d57c1a9f1f5349dc246ecec95c464ef1945979e3b5e2e830e69f0cca49b5abe834b7114833f21dcf85be24936df214a817cb5c54360321051a53ce2d5c3d6abf8652c44e2f65efd46bc730523526217c9c4f488b210efd294a3a0cbe5dde370fdc7de34d70bde8ca46ca2ced9758b49f041026cf6db89a06f28bb3ad2986f3aa29c444425ea22ccb60e71446c1a3ec51a20b6cacd202a395665e2c0fd693dfb72c1e6584bb225b20b7e40a682c2f0a27c1ee4a8034406eb34f036e63ec9aa8b642edb9e599214d75b7545217a276ebb5cdfa38580bc4a6c653a59ee565d4da075d7c257f8434016107debb041761aa82e152b2f46254d510fd54c4d6d066ca64f17338e7c37f218f44c17263ef5bcc67d6a5b219879c9add2a69da5d078b21c0a2e58650e98ca70106762298e3c0eeb5c577b88352679b8a7953a456ec72d9f170f530275ae2ffa74539c2176ae0352c14d113f6f96c29b2224e65bc94d2cc253185e6d671a7c81fea240c96fdf36e81a0d2c8f383e23c47ce2633310d6886cd0b11124f7c40cee8771b1191d73ec31bb5195ccc25954c6f48de3796829b77dd63e959966d32bdd39a1f6775c890f2dd7ccac2d8960286f220e9e31796f9efc4a880a5c07657efd0fc654adbdd33eb08d0594eed6c896ab0053d98faf4add69026011d6a00a439aadeaac48031daa05c092d88316a47458fbb7fe3578c42ba213bc8553cd9f3b4e8e8958513d7f804c99d6f36234f99ee29cb8f19665287fbad6fd457b5f80b553ddedde406a2547aad275f8de24e4787fb22425bebd59ee127b2279f8547e4a6b9cfdd6bb8252a3a90042c68ebfab402969c0c7375b233301cae68b57058a9c94375ecff2c7086690b893405f5c18e9440f0bb78d5b237e70721bb611808e80281f13565d62e1f86902117a58f0d4321fc24bd2b21fbeb67b82a28ec326c48bbbad3beadb798d40439416445e38a1f52d98ec0c0f288072050a9aa8e58548066051608777a925bbaef11b81611c69404e15a3b5def4a776e6017c852a75487939095626f17b78a14c941bb9540e294c4a52c8d838a690316423ba20f0168499318db7fc7770e58e7aeae272ba03a8fcace6becbec81394e736110e09c2ef15d4e5f9ce19e38c74ca73cdbe52415c35276391a5f4a79bbae8f2c3abfc4c82ae6e8da7c9b767d37133c132456227be3df2e3add3e3bc9f538cec551bc746ed82b83ef47999b6deaf633b419e15bac1d68f6833910c17092c70ce032f4d77ab775feb22dc582012f20e071070654299075bcaef1ae38e0950cb44775d9c2b58065114f8d9d62a6802a701214542f253b363b2021602f9d708e9c8123474584e43431054ab387805016b4fbd89359a024bb1c2fba25996edbd02e102f4054bec758c59d51b562d6a08b0dc9a4ece8802732af9971fc483f9f730d156f4cefaa8ace49b5d026f275c6fd2ba17105764c5f2a5cc48e4279a7fdd1a9edced2aaa2b4131849267d83e643beec0625aa7f87f50983aed625e64a12ae706f8a587531fbacc7a7391c000a28b326312ba6676f923abb15b86710c3f7ae8e5efd8faad99cc49b0a993a02992113f5cf9b81ca440259af2a08080437b98bf3a6fa255deee561a8e88d1b0c199d50aeaacc0833cc6ec533f0ab8ca5e969f30e7f8509744f8002eeba9aa8cf20cc48be8118a599c9c1522c9d85633a23f8172c0472d568d48e326ceaf6afba6ccdfba20cae1108900de508f46fb75f0c3a0d75dc396f6d428f9109ee02bf6502fd4cea411bf6381a7cf16ee2d1ac282fd186d60c11d1a404d4866020bd330bde4c58db044acdbd0e73511dff78d00243270d405e401544a25353083611ecadc7ecb58f415e0f4f6c9fa6642b4972a3aa401e783385fed004ec44a70d609967b1ca0ddf5da1064799ddb11e98aa3750381c8e4ca02598e9756c13c232a7660a000d7be6404b5f792ac0f2914c3fad430b91c6a7920daf0e07f2100043428df71a12113164465f619926ac3a6bd18c8865e9fc1b22e9b2ccd6178ac5bfeca895d9f6235f4ddccaf87532d6d5d85ad48b8aa3caca7b90fb80c7df0891309cf91e56ed22be3ba91eb0d28c77d1076abba587b76c3941ce3eacac5e331a9702a760e9c9222b5a00edbb9005d4a1eee551d5b9998ad15ee5b40ee0f231ccd80c51d704d2013bb26b70d3da1519c6af39ceffecabf5ea04b569a7e9cb0b5a1f0eaddb1cf68b293a79f582dc3952ccb993defe85377a3aa41bd69e4cff026b215049c089f06412c051a3fb64b2f0037c405e474e511beb6d8edd17b3637919c42f2379e29d6cfde254275886c8f5da3ed084f1d49e0550d010158716d8714fc6a5603c51f0c9fa82d810b5d556c6b62c6944da7e746b65855a4a5781d233561dd6b2826d14806249a68580b5900d279e9b75cc084b307824259c176088b6fa3d2b5d972d8a81bb59f07b430c6d086f5d99a0493b89462acbc0a9bca0a81ddab9801cc4aace7232ca58c7d12f1904ad61b79669bfa5c66a5f13ceadcbe8f3d31b85c868c0e5afe4808384cb62e66dc584346107f39971ec3d21dbabbeedb03b7d439e906a5f9e5ee7a72aca2eeddbe637df01f611a622dc09cd5dce0c5cdd3d87313ce3eecde0d80934c780549b2f039e3ec2340fd57ec9d1d037e11593ed7b4483a064468d526523a9e359d4ab4332e26244abe72b8a0a9a6c4ccd536fc45d1af53e08e8ff68d2f1155183bf7b7e2de3ff29505cf077d082fe874c602ece13882eedf872bbbb8025c3ba2512a4c35003c6303482a76e2d1d7fd8e394bffb4b599a79496412e04e6e6b124b697791e8880c977ad268f2596c26d071825d4576592110daecbf4b2c2c47fc26308705a0f67d57328860f025eeff6d90003281fb825e263a3aa43e0ac9bc469968ea1c5344e4d744a0465c665bdb300ba2d36bdef27b1f647ec0d3336fc0f3406ed2f24deacdbc0c36fbe4016d6b218b02927175d64e7f278e544741059846d08d4af925b13d9cdbf18bd5b79adcacc10085353b5ce1ad6707005dd946485195dffbf13acf735c5b096276fcc34b657a33e294e85d4ad33580803051b09c031f42d5aa49650cefd830e6d4d2e22e47b08e1d527504363173315e6f7774a0cdc4f4b9027c5a2c8d0563e488316e5b83022a96166eb9a31d82e952eb22321eb4a7069407d4242149cbe038c6493f7e3c31ff4ec2868e8b9bdd571b3ef8120084222640ab9b6867e9d7c753ac2db496cd805c8f84a8bd7f58f47a098d4d73b2ea43693f42a68dcdb3120ea62b946d70eb4c49540cef9a5297389078d2678b0abaf3f664c6186b5d98a31669e249d103a5fe5b00f5d9a76a2a86fb0f995134961bb389055617e09fcf8dcbc024946447f86b154d944441ca4d4dba51450dba8c59114c3b93b999cd2c9886ae96f57bde80a8b2d689ab689ea67d70aed31f3074d984d034d4b803ed8f53707ebd6b40a2d10b6d0fb69301a8f443263ef26a20da032bcd40af611698bd38367874c7965940703c829332114494b189dc34ef0e6691674b3dfd06d7888f592362cf49487b441436c850418739bdf2913b650d34ae7fd3aa3520237f268e57b1d53524a31b7173a534083021888c2ef6448f0c32dde7d477eddecb13692715e5dc208c9892db3458e10ee16623e8d4f5152e406629dd06975ff10df549b91b85ba626d97ff335b4d81d9aa45a6e8c983f2922072cf5dc31fb8f818408c260f2232b7e1b9d20e82b9d719c3833d264c9f851db57ead8a681f66282cc3d177c25a452a2e5d927cdcb52d3226aefccb63a7a81ec0ff8ad2a064c48c09d0f61d7b04fa3a12c3a36c53eb39cfa6065809de2364d29f468492f4d8d1e53fe44130e12082ba863e1f7a94fa128b9e4cfa8fb101da4998bbd7c0787e4c8fb945bda2a45648db55f8bc3dc6fd92f544ca7ea23a109338bee1b2875a5d9cfb0c870c602bf3faec860e5082230d39c3d5d89713ce1135eaebf1b4602db09acff9b788c26278581d88c74e91a4b562ff2431f454d28f060abb7f90112b305ac32dac0f161353197ed5426895e3bea5295fe52d50ec01294f1b1b9a6281e897152380a7a8e971fdab82b267e86a758c0f7e851463d7d1079cbae446bc126e4d6375df4df0bcbb78dbe041b9408b1cdc0da791fff070022fa8daf69bd9006e88604346170e1204ed864c22e501d1deab93ae24de4267b07fb77f11d6397c580a240e490249c6a687919447bf75cd9ddd19a81a43b15854071d9925adababad84f8a2d2c58fa81fdd8515349c54cca7dc9be99a06d3639b8642492fa8b859866a1d9d5143c70add3211694f23077503cd8577568966fbdd364f42f632264d85f8ec379498ddd0f933170c4ef9dedc426b8c786be2b389421da73cd629759b81909cf7c6f1f3fbb9d2e0f018780b28c48672f484ff5dc2cf50832f536f258d093538c9f10055d7b6e0277c380394f02e6bd89bb9c392ce2516befa227876ed558556d989bc6a49740335aae86da6668f27acd852104a84c992630b441aeab24f347c8b6223cda08b14acfe516eb90cfcba3b5e58813b7b994e0d2d8bfef945e47fe0852bdf38d8f108beeb93ae39093b099e363559b3919a752eb1acbeed7b8ecd2e1104ec8ff9955ad03357ef483606e98cd31c07fee8bf9f27e2e839e236b7eaa2413bd73bffe318b0107e7b20b07f10ea8ab4a66e9c31121ea015258718c8fc1ca7cf0b9061e4c3ba2c24e574d298488e81c4e1f5c84e9d1b0ca8403f53fd46bc4378186a6e02d8b8646b7abfb05d8b29ba9ffa9ffaf5234a16d42cc5aa83d05b795ae6832ec1dda9a3a1e498299a8ed3e03f091c15dd6473e39dbe965b9f0cebcabcd963ab9ade382ea440f2cc60cda2e0d275960ed10b5ddb84431423e1fd50f355f7bc29708e4a1dee65fc45945e52e6ac04425f5b0c244461743442576bef1cdd7845227df9038c4840a1b0c20f758cc415c07477a54441b12f1a39cad3003fedb6c11dedb9d4bf8677a20e9ec1fd869528f3c4c28869dc7ca832aede7da04c4160811ac8ecd9b54a563c5a6063da59ab890f04ef57a866ca80a7e96b53c2fe9a13ca1c3bffa73250f6070d2fe98dc54c317973067cde4b00903dc0817aec2012960b6cc4523a8b058397f929ddc2574b8b26219a0bb6018c8d997c1ef52574c194ca86887837f1e8de516eebd8dbb5826eeea226d12844b4c90c3838c821c28115d64b789c1ba55758eea24ef252c921e091a1a2b9dea53aa764243d3a8087f7059b8df1c7986f5eb200d8d239c462516735cc0ab5762487f7c380b2e2a21a33eeecb97f08be45c938206e55d10b5fe24a5d5f10b948f53cd7350fdc051847c60105aa962b2fd931386b760447043cc85fb78a570fe58e795855d54928e8bef656404360004d3ef181d508e5231e6717e8aad2f3a1598b63d1c4c90e0a6e28d21f7181def9df1206255541105688099b3599f45aab4996a3c82c7982cc9bacbfb1c3148956d2b8d58afd4a7e99aec89d8ff9f4cba545686e28823d7d6123fe7f73b499b9114476b4acd455052bb458f5db6d6b279d288f0ccd73b31a470cde53e23b3d126c299a57c529084b951b033c6a90df8cb2aaa9824c295972b34ddfebdc620b2a0c35515815ca2dac3eb1ed61b4b7a56028ce6c7754c47440adeeebd69dece75d12cfb29baf7821f709cd7fc286481b743cacda4f20fcaa8daf565cb22ab1ea1694111e60e79d7616ba7c4375a3e5a82fddd7b39ca54b18db07effd87db2e7a43a6e5dfe0d021ff2dd7b68a5c9afb2ad2230bd5232299fb2aa41ea4d3af8f0f981a30ce6aa43ec2ad8034857b78ee26906b96aa3aa1039c60ef28ef4a03905eb1c9ce71f59f172dbc39bcb6a51ecacfc51e0e7c0fa2a92af42962f1663a5a5ec4ad6bab0a25c2a18417787aeb3a42e40c0ee624b2af21a526c77ca9fc1858da959f8fa574b83f21391249d466555abb0ac4ee38d33026e5a4bf5091580a521bc58a66b5da6c3fd8f42bbc5e576724c827af90a5a842b49efbe362143d33dfa08345a00aa8eb096471fa053839b06899e33ab8bd92b8f1862e263745b7087191d90a0bc0af364a814fc38da416ae0c4f0a6fb393a9dab4e77ebc050d4e15fc9ed410917746bba169b3cf54501256be94b397ba12fcb4e088b966041b65dae4883c8f28ad70c8d9771be9b560d7f782318c43bc8bee349ddfd2014064fd8dfbbe823ee2c28ed99cdcbe8a18ebfc3568934e59cd97539fd5c8b756f91c25aac4f9d54d630df57a3b228e39bdee5d99d1d9a3c8ae19bb46b42ab8dde11aef14473b20f30cc1b4ebd8de11e16a6afb169548a4d0ac4034c1e10c81680d8bf6c6d724b2d7d2e801dfc0b6d3052a4efc3de6ebd08ae071294c4a8a288290c78c388dd4ff80e8016eee628e444d98d1fe808b1012af7ffe37060857a49e5c297fcb907f28e46f512e2df163f343ddf4c0dc3ed69a691c8aa865f4553c432379a36bd18d5e99479489b91f87a6c0f42cae430beba2d3221aefc679d398122e748e1463909bd93b64d13c401c7d260660a36bad3b50c250ac5adc28d36f11b258b96ea34cec92ddd216d8aeb05ba530c3542b60939fb529981763eee5aa511c4303cd57d3ce5a0fd0d22129d7f564de7aa7a097427d3cb20f0e91cffacd1f76f397a81d78badee359d916c5258eaafd87acd8666eac0200b0cfdc302ce18dd0ba19099b5a11fa2b053f6f63836e6b61ec139f8f31c35e84dfc420d6d72912c20ff960ab6f73a7c4187c94cec7eadb47da4baf5b5c61461e43ad4563a3f38477cb78404fe83be505af64132f525f33cbcd2cd5f2b8fb6b4d95e18ab73c97d933b1c9f572a2c5d9503c08bcede304f27641ed69be9bba30df6ddacff749ab3887d6f6a51d224607e74a9da6d4e578809b67836931e5a2ca8506052e7443aef2ace8d2284c4e41295b11d61e3c0b189412b30e5f207391abdb4e1191cc723765f99f857bb37d3f85b71a9e9dce19865a72e8e0ddc3533aa7c2bc99ebf8b6b2c15066f5ac3d3da16e534b021d9be69f6613308fda4b2637f1f13cc50cc0c703fb37ec340c67a76bb97b0b30dc4e3f858d2d12bb125f8ebe188ab679ed394dac3c6405c8f21eca0c4926c9fd38359d04cc8f683e36c933e392c9b33117a5e9998004cf6d1641cdc4404dfdcdd0bf02727c87a6afd854df2786850db429914afe4ce21435ce0a2d149cf8740a319cb7a0ac7423aff6758b19d0f7e67f82de56ea93949aa790491ad32e1a51aed7f2cfd4810a1820e663c8b405f46f87402192462c0511e3bd7e6679575655319c67aa1b0ddf7c8ea11a6fe8e0a200f453d8a3879015809b46127d0deddf37f737210602939374a26c75d3c9972cc379f7c7f72072ad30cd3d67e7cb04298a07e8d5dae17c066357e5d338fc3400e36abcb40e9d30cd85a4ce18ee3097b3b49a6650be3ccf931a4006389249871ff1b2ff46999b91ef1ba4e2412550aa447b53426d4bd3baf5b1156bebce12f5b02b8238f489b7d02692ee0b33f4933dd81787ed1f751ad1f8b2a320d5987373a8e02cc9a3c9deaf40750981f3fe5fa6a51418909bac8e0d7650f991084fd92fd691dcce692053ff69d38ce9c6b2e2aca299352b0d7fbaf3cb12099af2b2ec6d4be80ff96bb2b0b37473ae5fc476774d7e7d92fce4e2d1f576fb9f7791f03bd7c2d29a9ea322ee4108b2aa8ecae4e5b49189639441626260e451441751e9eeb1361b5edbcc9a1506144ba217d52cb48918d02332fbfda50d53b1785f64f146640075b7de95f0d3a5a5876ba41709b7599dd694075fdea4e5c135bd7fea9b4a36c9000e983e74983f142291fea26bfaedea0f6cb473dce299ba132ede26a889aa058104030c39d25ad083434939d4af4bd76f7d936f98728410f2a03fb7c643ec9a5ae8715e4590c2aa1a7ce1c0702a87735dcc84798f9f1211a9bbd113c40e61e47a9c6b992a2b727c60c81f560aca5472ce478aa9309b02c00ddf5146ed8ee1697e400cdbb32df36a295ce45f0d90139c8d75c2b02cccf71023a538d5d77af24d855d65bc60abe9f188316cc7b9f01ab1cf71b52f76acaab9d883afd3d742b3aaa67ecdc0220ffc2726da0bb9028f3d29ec21b66adfedbb3f3e151e365c4fcd6d7cda5bc20712169b77fa849e9632a29abd7a121c2a42919d6be6a7eebfd7813f81ae93ed6ed2e371b5da8bead859e6fcd4d5374c14f27b130e28206350c3d1140bb5a59ec47c0da85a0cc279df4a252fb9a421a6da5aca935952c87760fcb800f0e58f624ddf183b279be716a146e322565347f29380e68b41afeadf0b661405b72223838a95d1bc6839604c35226396adab827b1e1b7c8cadc3d6da62f761551dbfc04dea57b29636521eee3ef650666c335f88486654b33e4cb79ccb71c0b79e79792d22bbb13264507b3d9ee8825b786ceca014baab83f58e57eff06c3f64b896f44b104c8e68e63a86528c8a1092f42608f1104cb8c5a2d5b28aa67b04224885f362830b299fcc878b4f86b825d258a1788fa5ac84fcff6f38379e8f3e72465f90a327341f87043458b194f74d595e4e6427b1a9c9c9cf75898c9d1e1ff296feb03ef68a4176e5702e969e892b3ce14ba7d50107047ad7d423c8878aa16c37589226bffe8e2df07c0f2bf3db5184d255b58471fe262a9533f16326ab291f50dee6ec08398a8cbcace3ca24bed93a2e0207f8eed4a40d3013f6c1e868e461f8fd7b1525c9083b8d2f135e756107d5af24aac0db11df9510f7bd06f9c68bfc8e6ad39c943875223122678a2bb5919d8d46619f313b70b26342acbcba9ca1b0240561e5ecd0275cc2ae78635cfe8825c6d26028ca11b30895d73680bb7dd2fc4c7893c3d51894f509b5a6a1d6a010e5f429351fa1b1700f1a7679173459ff233010ea6bfeae19c1d5d68cd93385aa6234969cf0058743edfa390f2b984200e5b4511bc1775df02242441de7097c2c22879cd0c190ef5d30a1284fb40330f827bc82bbe9f55ab6cddef8c89cbbce870bae84f6e8c57be20f5d4cdfd275df50ababf93f841d8a61795d4968b7b3bf610421c8744dfea4bd1494af59d74e24bb402548af97d431f94e5849ac1a9fe3094e93c9763f6855f79c36371ebd6a088eeb0fce259d0351308b8125c66c50df979f53f71ca803fdbb612fd48eaa19fdddf3596c36acc41779f1b99e16deced4c567529eda88054a7752fc5a685810d0029131266808ee709c29c29c2df9f3431ed83648047046d043799808dee20d8980567e15900880de046f97c04df89f73f79f38422ff77c01f447036aa436885720da59a5032dc561f24315cf978774e2b7a39ff45a5c13efcf1e733efd65171c69971e1e56e665502d2682635fc051cb72dce8cc5f466641648a1ff72394c38f7bd741412eb1a40cf12834b27293bd37d9726f295392321f08990894081f958f4af751f9a8a83ac0c5992c430f9e1fb97cfa172ebc269bbfef27e2545cb5774f070b9f5eb888c1a72b5304c5deef27d6ccf95f50b7b4bb811590f5491096fffdb0f0c7023c25e51cf02dc16acf4d4d7b4ea6e807bba64dfa9a974306c758137164b0fc6f099616619a6537c61acac2f2292873c860faf4cad013e3a49452a5721a09059b2d9ed4c115ed0752bf5ffb24fe3576a380b2972ebfc9b49f1a983511135318528a43184a71f79e4de8cedc27cd6650e95de72af756496fd9ee3d650f54aa9919faeeee4dbf5d8abbbbbfbb7bf3e8974f98b0099b99b161430af58aa7cf8a73c82f42634296cd70974d4d2e5de2158f1e508ae73c4273c82f028729956063236569494969fa4c9f69632365ce68c5ca1362524c3232a22e3db3dd8a4d9f3e78a4a5a42d9b9092d275912932511c387cc997542a29cee44cb4622d26b377f088639d8cce69c37e4eeca7fa00f27524cc2594f1f8899fc0c56e79771fb14709012ee296ee2f41893d1dfff6e8ad499cf638c28ef5c89cd5c644f7ee692d0d6cb65cd81c99b4b0d2c120963444141f40aa30c59290ac6dc2ca2849b158e3835d62e71216b1c635959c26ba8a9c48768c2822f130994c40898860db32616d6cb04dd462dad430fac15deee334b38acd6148632a31f110439ce0fe206a17532516b94b70872a6c8e4943dcfd4a5f220379b4cfdea63ece22e27be05d61dbd09f018b026b23e4b1f1e5476f87888f4cecf3a314a650c1939ed7ebf5e38a36b051dbee06d2a482602710f3958364c386164b703f8e9fa9c1c5e08836529fff675431b3b521d8845760c2fd346c6aa6869c5625c59e3a60a59440f369daceee8e1fd2881e861a5c2186447b865c8168071ee2948c0ed1e8a73566a2943446dabfd44c51d85c6d6033eda98d946d23f9cdc4820b24a4c79c260b9b63d112eecfd1810e6951903f3e34748526d28914fe4dd42da46ee10e924141fda45bf1bbe8473ae9b087da867e073b888a953f3d248764d85268a8873a0cbb83e493a01eea16076cf6a1b641b89b38913d16d64f9ab0affeda7981e311a2ef2ea58c4e93e3cf77f0884d11acbcd51d87aac38ed9bcb02fdf3fb471059e90068ee984b5b14318d2e8a2140d2f9c4c6c56a9626c2a0686576cc2c012ee4fc2533fce64d9edd25d4a97ee59a6655aa66559a7b2db3506e48b0334b0b9f634713c1e78d77cfa6d03ac6de8af32b0b95f320a9be7ab739d3e32fcd5b098e5994c7c1ad661bf624d7f4ef792dfc8fbea57bfdc35efcc5e45aa6c6d1644b83ff533356266f6a774febb2459ff4e55b1f993dcafaa43b02566b7269bdf0692a9a3bb1b49cd18638cf11ee9b05d0a59228e3449251c84fb53441c913c312ea594524a499dbabbbb747ffa392db39be50b37111888578e5061b354924addfa577fed2453958293ae38239fd82a7da44fcded93252c8b1edc2f97d42e4632c14d3a0481edef17ced207afe4c74f425244daa109f7f310672a4699ef1eed90f5dbb1bfa882c976ae7509f777aa181a29faaa6f1bfaa715d1d5354dbfbc40b01faa62bf0bb0b002f77f679511162fbca474d3aec6de04731f8f7cf94341c9e51e3df95274ab093ed2d802136f2c3a8c9c74c8e9301a724e765d548423d6e103a36ec520e8c0098e18a5c368a85b1737a1d9c7ec6a51348f7d576cae494995a629463981a2c2278a0a4ab5b8821b0b4b70df231668cc498935ee4a53a638277b36ca93b8a458e32fab60b3164bc2cef957fa85cd9e84fde7bc5accf164c2660e09c963b1c6639c5266024ebef48fc84a1d6017bd3929cd3eb0111b9fb12ff618bf2568c4064fb093362b78511ae5479b3b1c553106ec1ede84552a8dbee9be53dd4bb85313dc9fc5a6c9ed8486309c6bd85274d83d67acabbdd55f38a7737a2a694d9d70fda07f0463ff0d56fbe6eaf66dc4a67de00e4bdab43e2775f45b4009d63ea7b589e38cd9e9b353e3e8f58d4af00ebf165082a3d723cb4ab2cc45bec3e9f7b7f772f4d7cff1221a9eb2c61afa5f13f6fbdb0e2d519696f7c0acc93c799e159c745d9437248c3ca3f8d3d353fa1a7d4df59d15a060ff4ea5fa18a7aff5e5d2108e48c0d1c80a53302703e8e5e8fe4800ba90a6931107cb205f62989971f9189ef79a12773d1e52d3406f87f7da476fc6d3c0979717199a0c50e2199af65c4d9665327ec60c564ccccb5319d9ff8ba6fda6759aa681fd2aaf077fed1a2171f731bc1cdd7fcfcdd0b58fab54d66659f62a6f0e75987dc6a4549479817e138cd7833f65caac74ab29e2449cfd8bc7c39fbecb8346489c63bccb6755603e2ba2bd52b7bccf9e4b793c2476393d7de9f5383d7d0f8cd8c5dba1c9781558e4377229d76a33af07c6cbd15846875f5e5ec6af3e93311471607cf6930611a7fbecb9aefbd5cbe81e0628318bd783ea3bd577cf75d775aacf691860c4715584c4da1b3171f7457cf8e5e5bb6b84c4da73347448d80f6f1f23099ba7ea0b36cf1facf2227e8c3852fb3ea23c4df532c088dd2b426219af8146482ca3bb39c6779fbd3cf5741491f131aeca8bec5737c770d22dd52d126306754bc6f554df793b62a86c3a19717214e95ee5450ef9458c97cd0d9b43309f15915fff3b8f87b743562ae389a2521dd2af1dbe680fe3c60e514fbf5bf4763160cac2f463cc3030f530cd1da694524a1ff5d1d3416f767aad03236e019f05b460ae4764ce5480b34781b17bba05ebd612b9e4375991cdaaece686e2814df0fcacc86f3215449af93710c2f3ebcdf60578be9615e1f9dc1d8222c51cca6460e5b7cfacf3a516ddaa1d66134706c664d76e3eb0f6d4880dce9ec699a94425412f548983a3a4944ac7f28a222a1ab582d81cf7a19ca09cb8bb12285ae01823288db81857c4b062bb2084a007ccad6acf61ae51fec4f4798476dc0cf4e35d4106f0e36b2e123b809ae711c23777ef42dd4c1fbf27840e9f43901a6a901cb84705d9de0b82f29e4748879b81827c0e42d410e46d84a8c1e67984b89b51afc3cddee7f027207acc5c24b5eea071da7a701b0f1a1789edc1c30eee22d1f0cddc6f3d7e8248340c14c409c8e511ca08c833bc0c1749a521c309664e1a33dc4ce365b8482c9019b69b5f341e0fd363e679b8486a0f9897df7a6cb3c7369f4788c7cd403d5e0620333d1e06880c33cf23f472f3f62ff361fe7491681808081808a81808088d0a6447ea6100e16e86f1a78ba4c337091e21eef43c4208b81908c8ef0082c6cd40b07701f9192e128b93e011a231c3f308a56ee63e05e3e6d3c3f81cdf41470e1d1d7270e11c1c0e70030e30fc1b60001e078ce10d0002e06d80372dd006e952c0d70063f8028000f81a4002d88034b44b013f003086af0101f0344001cc00d2247197022e8f507859431d7a002e4b8a0efd650063b84040fc0c0800202e8bc869fc8980407e08d8e38580407e07ecf141402097f5e334fe3fc01e9715e434fe175c3d08caf80763fc0c50f532e0ea59a08c8f0163fc07aa1e05aede03657c07c6780aaa9e035797d5d3322e8b49c7b82c1fd56535e9d0df053c6118309382c410ace017502302cc0935c030403f0112485be0149831e103262a6097cfe922dc027e871e5ab00809064c27f79b9c5dbd9b96a6b26dc300d67ad08ad0b4f7ff6dbb471a6bdab360dd62f5746b3e11761613ec2c1fecac26d83fb37eb0b39c60cfac20ecac27ac21ec2f236609db2f1c715ec1561f88ab2662e87f1201f6e79cc0fedd09b0bfa702ec8f6a01f6ff562fc0be82c59a8823f6217c31ec31f3aa7a00573ec01fc0a1159844ba7eb0ffe003e82e1f6074f500664dfcb8a2a7e36305b3c2fe155f919680fb19358d7f451dfaf700a3cb8bbe22ec4b88004f27d89f37af7cb0af60b70801ed8304f6ebc2fab70d58b0fe2f455e486a42f4c99ed988aa5a89539464141f483186c3060d1b1b58ce7c873247fc7e29f3cb06b9ce88cae5fbd2529251d3921117a06096a3264d381e998009b6c1f128054add910f0f16008e472590f2750c67cf5201ebe96cdb6641896b8b6a0a5bbfe6a09f5bfe48e37aba398539aee5394fa7e5b996daf25cd737d3c57df574ea472f07065eaf171258c94abc7127b07e87df47232a6c3fa73b4fc77ee7e97c6f41cebbaf3ec78352ccb5802c5f59fef374502c8f6241b1a02c8ae53f0be66a5f7a3a2b7b79505cbffe77ed5730aeea4b5cbfc5e559402097bbaa37d561f6d1e5d92458db7da0c4d67ef47458c022506f9ffb5858c0fa9f8ec6a80936b680c4730a361fc119f53643a52a8bcddd125c51ffa9f087fa6a6f9618f5f5338fc709a3ead388fa0eb544b7a45ba8af3f3d9d6ac1983d0beace0e43f9e40636cb58911c92b19311921c925248a26ed9cf4e9d84f54d746d1fbb25e40d89b72ff23d77921db70473df815909ee58ee6a8788595e47c42c77d5f24558be3e4bfd963fbd12bc81b9c3dba394bcf0d7c202e66a41efa38752823f100318051ae930f71b98e31d183b8cd2dba2c7dd9811d8fada6f9bb6c98e796d9de0bc465f8a3811c7f8a0166b66cf299b684c465b5882fd939c69c2946ae06d21e653b627752b57257f7f9fc202ac459c7e281c28caef785f13887eb9e47dcdbbda91aef9d2356f12a11fa2eb880dc42aaefb8a555c3b3ee4168e4a108463e0785482228c822b5210c3f1c8043c2720c1510aa8c02c14905f847f71051b69bf14f01efa85e5a580df150f89fd25f69b75445cc448ac822f0562152c3f56c171a6998634240d4943d29034a4d7905cc9955cc9955cc9959ca691b42267f2e682b4240d4943527a252fb8cea1634e1d4f67c260b4a848471b1afaec1336fbcf0fb64fc4a6a6a222099330fb84dd2aeae6909ea4d312fbb70ebfad3501652ec591e05520c1f25781db9560a46024e0fc1fc38eef55c456cc22769f2f9b8f35fdae2d51b1b058f36561f3846d4b5a934fd1a4c4b09da66716965342011767327d617f6e09728ab6c27530614085e291a6434e0e136c963d75b381cdb207cfa6d7bc02eb79c1fce64f91be3c1918c1a3145f45a9eae8044b5e86e291cf955a03777e1b3f3e4f605491165880c32e48801bc431adf2414565db81516532e2c2898d1e27cc22232ebe20e5cb59d07538bb91bd70d4426c83e347bcb5b6de9afbadd6caddba6d1fb3125ca9a7b3f520bf629c41ed6787ddea5efb186377719ceee96c13476f47cdde47759a88b3d76ef603db4c3ce02ab0e2115ffbc68e638541bca93fc46f6ab556a5fa0f434d4ac139691afa43c827d556957d55f83129cc3638ab6ca830a53452ea3f56125d39d461f6034ba5d46cf149810a2aa83842cbf4ed24418a37241bda867e229cb520dcdacf9c3f68f2f414cc324da3e006723c2790e36af57480388d93941a993e1ea54027a51c4fd3f812e6b6ad398e4e2aa2d7afe33ced722f1694a7b9742e9e8e3f8b2761c0f074ea73744e23d3e70a29b45c91d5ec8a8813351fcdc7699a1ea196b4264df351b1997bc518359f54b7657882a797ee93829d722e25b992f60e026dff793ada12a660c46e05eef529d9ecb1c8bd62cd77052ac6bd5e1167c6e76034a72a2d8646352da3599daa6f427f341f1d8f693e1ea3284a3d6a3b0de54d16169b4ab9c0e8703c9ad6c4c1b85787da6a89cda825eeb5a4058a0965a55b3e1127a5dab816a58732a38dcba0fe33ccee331db68753104114b0807dbafaa3b52955cc66533077f798ac199d465696640c381a5901023ee168b4c594a2ae8a27a67423e08ededa942a860a474e14e1c8891d1c391174e444088e9c5022d54515aa9002eb49e1c060c511984cd191e088c9133afd88490bb2232628c08ee3111313e06c318cb3f286c4387800a6e4c2e1d554e452e2e262774b29dde386a2a1093f78b936d072025ff020290966e90b1e2425252525c914e1ecbd263b9f8b19b83df574b070a621019f9ecbb2fbfdc49ad3293b7d9fae96d4adede60a489cbf1f2dc6c294de17a658335f98f09429f20e70dc47450a2902b60e55faf21b8aed9f3e606da27d965f7d24285f1d36fd744bfed42a41ad0bb1e6664a6a50179e742b6b4d75a85bb9f2f8c81b59e27e4983fcbe99a4a1bfc276f4cbaf3db7f6e45a7b2a4cc866fedaeb98df1dc1fdd21be43210a8be067e5dd2b549d3380527aeb0da436ff5e9d06b5025aa419f146caeb159ad983556ad88d2d4e195faead02b4fb7fa4ec755ec7c7fad0b11277a52e8d58a0ebd7645aa4835a806d5a06e1b6baa87c4d12c9b71c61833adca8e295ab992f98c82003b7b039362436c1793b10e933a945364940efb7b50945599136b70f0d8f899060e29582b8d4e690fb44816b3d962997da5b16162567e5b252e766b7aa5adc437205b5a21c6186f8e31c61b3bb4b15114ca489d3ead94e2e9d3095a1176d747c54ae9d26972a60e97965c7aae043141c6cb6589f58f381a7d6109532e7f2f4447f01728dc136d68d3c2e697a0d74b90df44977f2f2b2d495b7041e92a69dad0cbd086386d481b7a097a8122de6cefff121471e4ecedbe401169fcc5074d9146defc3205f6bff985062f434a60f7a0581385cd2d492f414320f7136bfce94b10f697a097272f492f555ea4f85e2f462f432f482fb197292f44d89f4ef91a82752b733f1fcfb784fb8938fd325e9b265f7a3e4897f69c46a4116953c418315858368d6836e9d0ef64929d0948bbbe945d4929e27c4a4a557a9af44d8c97165e68447e65e9056332656b44ddca9f064533d294b2e0e24cbe45d8817c8f8fef46a69114e6de480a28014f6345b8d73e8b7dcaf674b3112398fbe8cd22dbc7ede736bd39c19c2aa2bdc4415b18b4c0da6bb48bde8eb0c320e0ce0f01853c37c1f01f0c67604fa7db2fe4a5f783fc9d9741fe07cbbeacc427d473d2e351bf7b20601220ffe37b80497a7c90e7220e1b8dbe80822366791d3804777fe2a2d75dae4ae783edbeeb5e7a2f230d3309ee7638feeebb0232bd01dcfdf3e8ae8ca1f7b4fb77af8789658c682cf35cf48e8e9a31e316e158e6c658e3bdd25f6ef6d1fdd373fe32465f5881bb97a9d22d4ea9c3ee72555660f30a96e18893e1d3f51b213e88f7e85af574e82b261d8c13d4161626e8c26443b0427c86f939fd7dff958ccc3bcc8fdf24912e21eecafbe812e23d21401b04ab019e9179ef673c473d9d19d6dba1c77ff7393da37b99bbe2d115f9cb55f9885964564e646456437ec3e33dad6804862bd87f055bf5742b46d08a6805e5262631c5a3d712ecbff2917121ea5686f97181d2ad9e02e6c763607ebc21443e8897dece0f1fc49d414e0383e74f87fe035c01f9f14a5c41c01590201fc4077193cc20afc4e56391b047047920fe881f4fe4f30a76faaf08fc1f44c0d5cecece471710e06a4788908fae4c09db3d37bb1fdd0701a38b931ea5a38af02addea6eb7c0f797590282abee25ee7e08b8eaee57e4fa8c9060573277d53bb0f7f479059bb1a69b18f59cec8280d1f5038c2ed6cd1d461561518445117e82b5ffbe68824fefde4e7f121f2fe42619f23fdebd1df9497af89d9b24c8bf7cf82382bcfc1fe0cb873f62c8f7fbf05cd6edf0a17fc8ef80f285801fa4eb582cd6b33ccff3be76e87df458dfb1bcf7ae4b50872e0352ac29f21be94a792f3d1f36ff220f4c6d582c49ecd2715fd1571471a490677d8c373bef7d8c373fbefb186f883c0c2237461a182f8475b34ab57363a4f16eb618c6ffb831d2c0f85cf147c5761f3de6a78fdf4817e70592cb7c79f18498175f50c5bc20fa86ba9557b08fa85bb986e093e283327da68f15981f989f2d5c885c88b8a064e3116905731a2e6c6fa987f98a628dff8cc266989f0cf30dc51aff15cbfb6f4ab7f2f4e9c054872bd6cdd198d5fd57f4197d48dd7a51fa96fc3fa6cf8aff77a56fe8cf6745b7a2d19529d8ff8bb1bc6efa742bbb10617fcfdf50936ec523b84b51c421723182797d43350411a78da4f0d783f6df7778ba21101fbfdae91ed403d2c3af76e4fff81ff708202f3fba727c82110701a36b08185d30609e2cc09ee44938af6055860fac80dc56309b0125e039ad030246570f30bada0be7bb802c58873e89d07e7ecb91c639b4677916cce5fda7cbafa4186265478a1f569e74e84f88acb410f2a45b598b6ecdcb7242643564b5d4ad0c2464b513d4ad0c1464a85b19e8c7cf2520bf5dd64f0c53b732508f9f971504bb61c9017a706092e3739b803fef64c6fbaf88ba95c3c7f1fe2b28ddca01f81b45ddca38cf2232ea5636c0b3a0ac907678ff95153ade7f15cbf1feab283aefbf4a9279ffd514d6fbaf9462de7f5565d5d4ad7cf336de7f75a55bd9866fbd6af01400a6c3921c7a5c4cb00faa89f7d339a144ddca04f81aa0742bd3f036ef1f533480f78f31aa79ff18a46ee5d4fbc758d1ad0ce3fd6362ddca2fef1f13a55b19e6fd6392ba955731534eef1fa3d4ad1c23a64ab7b22aa6a95b59004fe3fd63ae742bd3fc0cefcf7a752bc7f032bc3f8ba75b19003ff3feac21bf49325d0a787f16ac5b2ef7c1eb808f016586f80e442de03790039168413cd88021e01b6088cce318f2370c39c0101478f30dff43700c31404c0386fc0c07804464fe06111c1c1c6efe077366e0102182f33c427ff30ded86c7b9482a8e9b71ea101c37fe87fcdf7c7fc6909ff13c4237dc0c34e47110c119f20620826380e711ba71f33f0ef7e6199ff36003643e860891984b042472c1e71192b91988c8c73480480370dcb87f03f807781603760a90596fe322a93b3c423bece8d841c9ecb06edee163760aa003c5809dff866009b93c42d9c6b72e929a515fa346ccb374bed6d7b848ac15f23c423137dbf8ef22d162be1c5fe322a93bdc5ca3eee8d8f8989d98989b65fedb89f99e4728c7cd403baf23a4c6ce17e022b1350a10f339646efe5ee7590c68dd6ce37508417d77915421ad4e46084b880ceb79846cdc0c24e45b0c4009f98e01365a32bf03eb75bc076e3f2e8f50de916bbe868ba4fea801c5e570f3e67535fca8b919018fba48ec8f9a1c3c21ba1f4f17e005b93c4259876c536b705d241da635dc5cc30fc0e67984ba9bb1b6e30770915404dc3c80fac385bffbd1dd8c7afaa30b13d3d8b56511fa52d2a7ef58ca2d7cfe71865b32e79cb3e7ec25dd9a50b0a68aa981cd36b169e22f216fc8065536163dd14c64959884c91b59151ca77f944b689fc92564956682b3efba3923850d1b8653ce25f1c6364dfce96037c5683e47df8609f68f55ab1a0eaca570df7c8462ffed66bf35481ae2534f477d4dc61ae40d269af56b6d87c30636c758ad397e339b267e8d296bfc94787e7b3ad341db212dfaa4f081e1a3f229d9262c0c6c13f6051606f6052e5b4ae904927fc7297d9a073b2c5ec12e9bb4606aaaa2142549c90a242845eefdf18372bcb2a753653373f7c13eaf947ebb7bb22876064b383255c17909b6130821064f60558794a5eb30c3510831a8018c8b31c61cf72bdb6b175d74c1c273da68a54bb418b34e4527a594524ab318638c714e4ae79cf3e39cd3a547ae6abd553a299da739e7e6e9c4a794d249e93ccdcf69b75f343971b426416b123589ce4bc2a35c12944b824b02f56919931c3972749102a58fb315a912551dc89b19ab44734aced9a507d19deb9cc3f3562214b8f712b86e1231379e8dc743f1a0a60f3088219d37c46729dd5131ddeef6d9169749fd8b25509f12e06161716f99d497407d4a80a745cb34971a860c84b9b8a452297718933a0478a84f09f0c0f074a8bbbbbf4cea10e0a13e25c0c3b578818b33b19de3baedc471d2939528e6b712d913d02344c4269ed78b33128125203e62410c497ac0104a5c253a6d2809e33e8e856b21a2934a18512c168bc9198bd26127c57888ed602dcbac44a793ac154ad354a297b5e1346dd3d2e2d233ff34c2d0c5252553312ad57c87d1ea2a5125d2b9809db142e9b0898c5422dccf9db88d4371dd4f4b1439dc6a078e37aa563525aa0e989060c2833d1c8f48d0052218c1e34312335ea7b2457071a66b6cc40738eb1e9f8296be5f8bfdc345fcde9f113b0c462001152e8e465d10054d5411541d7bbd5e4e2c49c2fe4c68220aecdfd994aa8929b07fcc2fc1fe33ddba013b08aac0fe346c9a60ff1a36b4f8b01f85e00bd89f876e3181fd81740b00d87f4810434481fd1f10811e20607f23fe4428810980fd314084fd93746b4a9e6e89000af6283d3d720456f0231250811d853d08c78843e70d4cd072012ef874000b28184ac213fe01104c9b830f9cf8e087075030a1410b58ac682207d3e51ea357c14261a1f8a8582775b332b031b03965a1b0411f151b64836c133516c5b7b181d215fd460848ffceb7ea63561f09d7c77505f355d64d4e535f89aba69e38e18a2e2179fad069ea0b01d9be81f49f6e1295d3d4ef1b9d6653357d8df180ed2bb4f5b6f56fdfabecdae8b0e6384ded9a2dde408755b1b99bc0e8a23fb2e90d6c1376729f7d92d36fafc4a5d18fcf813e3a4bb2650f64fbecbb2f90ec4f3749e6eece126bbc5eedf667b1c66fe20ff366e9ed46e054b36a4ea3cd2cfbaabdd3c838fdd62c0327a599539fd35f94529a6d5258f953935946650e6d34e12f2b7fe62ca359466558b719705f3157a5964d4ae7742dc63863f4ee6eeb3475566db3c257046edb90d4ba21a9da86a466344eef28a9a4799b48366f47dda2f744b2f99f09694cc18403db12058f0bfb1da10a96a50757d8ed069d147bc2f1880919e0fc53b013c7232680b01702267e7498f0395a22c83e13a212663dc5604dc0fe9ba7e3425d0337ac063109571acc58ab138e603850620af68c8a0772e083230f3419e1488920bce0feac29092d1ce17e9a6531844e421229d802891ee0fe7e0e3861398005ee4f1d75800a26e0fe7702e378c42305f7d3e8ef8e35e10e0217b66f6c54c216044dd31a06f6c3f1e8c5a4bbe2e5020f0b36c3f1e8750328eca02b81ed703c7a0961899fa30f0015415b62411c8db658eab860637034cac2075cf0821658181c8db200658a2c28a1038255e16894852525985e545818381a3131f172c00485ce929836713c5ac20111a8a2e020f86831836587415f828b33b97b4d2dc8d624ea70fb3cb980b39f49903711f09ebe7006c359cfcc820ace3ecae9049cfdcc7e22c14646c06f265296dd5c330eecee293a0d6a5e1b4e93bd771c285dfee29a48d944b2e930fbf979122145d724f21b1fd90487709aecabac55b3c20a8c980dd25c9a57aa265b392ad5e8563c02ce6260138d764c2224ce725cfaec7df8cd679f6121e3b689b46df5275213e5e99b6884a1ec67946e45a32f98e06c56c1d9c72c8b91c9ec6396fd56b5ec331bc98433cf5ed6bf7bcd3e3521b39156955282cd1f56a9a415b21efdc8115caaed36b175d5db7cdb7c11477ecc9f3818bbb0d33b7d069eb22c8738cbb2ce7eb4f6bb138d9dde5a9507a63c6055331cb0a7cf3ecb2598c6a507c31d58eebb0818e996f7d407677f3ad98f1da69eb3d97f50acfd94cd3ea753609ef87473cbdb1ef6b3abeaa17ef69c7dd9883b6c638dcbb7b7437391e2e9784f9960f3e3b8c9e8a82cbbab2ccb69540dea737c3b9dde469c98c2a7b71daaa2b0271a67c4f93eab3cb222d99f9ecb40fba954cb3592c2f6e6ec8d90d83ecbe7b4fd0c8c9805b41d525587149498dbbaf6bce74edfe956b7abece9531fef348d635ca2d98d11bf99ae087448735cc2d406d3c73d272450c0040300471f9cc00966f99cd66a15b6887cdf216f91ed6f916d72371b3982b76c6eb8887cfa526e3ba2a4211f81e5474943d6009659099679c3da732fc1683f6bbd9c1898070953b282fbc31afdd6fba6bc215fde88d8519ee779de47efb381f5bc1b7978ff7d4ea340a0969fe00af5f35137078e9deff8660fdf9da8467d7b3a311dfe557518733a3382dd3eaba6a703d482fa0e5c7d2ff1f731abcf9160bfa14cafc7175d87d1a5a36a874d05bbdd58b799491afc6bacc938507bb095b0f56ae06afebc32cbb2150f09047b17cb5dcd899d0a15f6b6f0297d4a1f183ea517a64990375a2c5bca824acc09d893c0b2bbc33005d780a35118823027bbd983fb8f54f0f381c1e6eab45bd2e1d32abaa7c3251dfacb2749029beca804cc368641ce3285660680000000c314002028140e8a44029138209267aaaafc14000e878c4a7c549848b324865110c52083882104000000008400200a4951551000c3866261ebc9c5af229b17fb43f8e5b8277279203f152179ae4d74792e6d9ef682c14ba6fb6142b5425bd33ec5b2ad17804e27068b431026a39633a417aa8e1d026555b3b699d387ed11152134658ac7eceb37b045ad9679550f9dbe76bb146e5ee99fabce944c75cbedd2b4544848d13faa440dcdf98c7309e1b38fc24d6679cb78e2e14c38bc6f5a32e971d8b3946d4e94ce0c0ae66d15e303f1f672861f5406fb5a7a048f7f687ac993929ce04eb2a9dbf4952e097208dadfbc72c266d1d0f7bde90d6a00a8cef7118a8a6b09850bba7ce3d4342f768b5123eb271dfc0b9325056d06d9746bd9657d955eccede159883705b2ba01eef8174cd657986980992ee5b9997b5e941356bc5ec8ab73674a5b91f0b0f9766a98198d55ee64d4fe01a069fa670c6c28915d16ae7d9df931c4d90bd88afa1037c191fff3e10a92a91e60465336bdb822df3ef28837935cc05aa995c6de072eb799ed31751f06c6f2565a73b2b77548a206521681f98aca20ef768e4906fe76d10269ae10276e527b7ba275514b4f0cb1f733eba3d22dc940a2d9eb49938ae2f3f97d950dda2c29c0a31472d63e617219683a55729ed08b8455a20646f54fa121abea1a139a3ab158c589a60bf850ebec905fd515c96baa7f0876cd672d8e42a659f3595391a5357f7646d0ffe0d8ade8c27ab21c2e73486cd3c9d12e3db61115d7d1b90449130553023b1b6fe6b492665161e93fd36701683f21e84a31bab91843da7eb41c84bf3c27685f7b23b9df447518a99b32b1db39566d48031c518e41ea96803d5085f600097f19971e4bf4ee554669a6750a3dcbbf4ecb14f5c7057cfe479198129ac29f978be2d2a2294e67701d3df41dd5c2b6945dda5828705c1b9555181b06da5345989b823506ccde18d4fdc7e0ec5e6612c4105bb387f15e6415fbe5d4c3873d6e84843d8d1457a368762bc1d8ff18be017b1686b6b4411a2ddef94a50e6ac1d8a283b2393c21d662f404d73eacbf899b635d86f81d22d67ff58c01fb36a38f5f394881ba24c4d5b674566fd5e82c6d54fea6e006013e8f1be84cb1f54a497c8883b479006956638f03da7788835f41b512c9835f9f1d4ea3fc730bbce13656b0d87534f84ef3fdf61df52cbf8a0faab906b9bd2c5543bc7a6778a2b0a977238828ddb0c77af5a5fa4d115c324ca4151c9766c9e3e285e1755d44915e7eea8e8328457d334fedce8b533b844a306ddb6324986d78c6648aa3c6811f9f6003b16e65c4c4ca05f2ab7a15fe5a96eecac2021fb65c741b16343f7a6169867f871fdc867ea64aef2665c0d48e8b9577c35eb490fc24a603b3a7a610ee6a746e88a7134a9df0d52b2e23cc4d841178b15021e01ca81243613980e98d1161c9bf3a3c4b6e6194a4a8aaa1242af2d76075d6fa22e727a354d5e19a0c4de392211af52ac677d5cd8ede0d01019976313c21327897db658591cbb0c8458db1921a56777cc01437a3202c571dbe449678998e48748c16448fc9016603e226396095ac68a8fc9abf194225278dff880500a81bf533cfcc7b82f5989d51f4d766b611bc91ed9c1cf392f61ac1909ee7d8bf73ee7acc887fc8214ec8343536c46888861320ef5de840bfdbe77371fcfe83152dd0af7042bc208091251814b259276ab463ef30a9bccd277a46723eae6a60bcf98282bee6214b65ce7bc9c275744e353d7333721b2f566e6b669be8409f09789319ff138291a92f136c3ae92a1721b7e6d8b7cfcdffbe8af03a737197c9433c2ab4fdaaa02c85771cbd7a2eb0a7fa2a8fe1fc0db02a23f4ff3a7c0c77083e669eddc54c88404a61061aa7214de1422a0eac34cc26557e425d5121aa60eacf0b684de3a707f6cd2ccb2ac42634c6d8d9ccd02aadefed0e0b6d5881bc26a767ecacb7bbaae33f4c2865ebf745c7810bada3af36ce96e8f17036fc564ddd8d8fbe85ed186b33b92510463d54d06a2ea23b1cf2ae0473e14507c5364b6f27887caecf0c7c61753b718ce32eb21cffb62f9056059e86e7a7fb97d81f3a0d2824b2c0dce8121d9ab120d69cba927460435235c26ef753dcb432ae30e6f344d30832181dd4a5cd48ce41d9090f3a05c6239a2a884beba07847cba4bba66a5c41cf0678e021978499c9a4179c3abdfb31266f59fc7689f1802918c54543b0897b70899e64eca591774e8a1c893c987078430109c8b825659a9584ad2b9093b04f1769478dc7798cb26ce9b95b3adc2025054325b48f528ccf564f2d06dbf062704f9966a27f69efdb000748440955dcdc8f9a62f9f73918511a2ff8d2b987523e3bb7c28066621bbb5314eee08fa894cbe66ce6540a48015503c6a93045dbaafd8e3a0d69044859348d78c77420cc3c968a45dbfdd4c8608658c61e8481f226164cf92407656c03790b542e2006955c560787062b3a537e9e3b16ae44d4258eedaf5ceb91dfef159a71f95b0c54a853054fc0c42218bf7f1ce24e95b26943edd145a1df0609a344654f9f79da4a759c877d432598fa6beda0a696a21f7793261aa26b0460b81ff7f8cd464359ec4a155805ea493adb14eb136b184201149890541047aa4fa82b843bd2953f5f21ae2a8a57822c2638f9e473a7998e2a09029e708437477dcefeeebaa99932b303437d5f558a2e489a5403019ca29e7334fffe4785f4777e818d4dbaec9911010ef9d9e780b3dd30bc9b890f5995d8aa40605c5e3b00fe501175ca2a431765e3ee81c3979824fbee7cd12d31c2dd936544dac8d899804ea03fd3cef03cc05623dba237bb987db9affbc8763d21b73a01822e79adfd1d36ae5e2657c57ee22abe0e9922f827ff0330f838b94878b8f62113c62a865982f821e30267e5edcc84518a256185de0f0778dc1220903b984699e99583c5430e11a10f2e2d6c138e42f7bc48847456f71b788500a6a6f1a052f5b2a3893f1402a146913b1efdfa041163a5cc091502a84b1b3879b88a713254f26ab4ddf6e670a10f9c3d5db16d6282da0671506bd2a10607f9a0fb81a87624c9843d268a3c08e23e042accd3db244cc7f03149b8f03dfd8a62a379209009fe055ccd2abff248d7789acb14b4a7101bb1327272c40a733e1639402e849c13c47e79abc2eae812135e23a9b00e39cbc62a971a9dcdc8eb3811671142c92a20aff4c6e9cad98b348d2fd7c9ee9d13a9852dbef5953a37fe907efff803361925e55d7b4d0086e36c025b2e490021c7f38919e690551948f68807012f68429c7328d4e33bf7aaf45fcf6abe1b40f7ef8187e4aad5ed045615f118b9d046a76a32d982799ef12d7e8bb5bacfae8950d494740c84e83deba1d5c07a4994ecd264a3015484151eee54994b356abe52f459271c886260a6bb28e90fd41f0daf8a8c90c8cdd371daf0266ce247f62bd49c07300a28f8de509042591881a04f511c4441fecb3dd83659a1a9a09a341a5df64f717e929b31278444ec06648b74423c9511a27fb3ecbe40c3d36e5aa073311eb9e90cf6688c21fbc7a4dcb9570a8b099ce598a8a7301c513a3286c3e583ed1d42f3e1b6e8087281312212c09203af878da03926877b7039e502400040dadca80002f9f1c4ed51c0a93a1504eccac92773ec2d61a43b9f2a305bbbc10c6dd7dc206cc017353030d768481148f3eef31bd05dfa2c709372cc7591f070bffeaf23f39a4c89d146d3e3336ee24acabbcc09e3bd9801e986deb4341ba433cd8b10f94b107986d7fe1216eb1c9b4ef8ecaa72296707c351c94046e693701f7793a711b4a410c68ee48b76b2b1ce2948d5a039a51f03f1ed0ecf905c2cb04f420cdb3157d1f1cd2d7136a61bd816640f3d0858f5449b321387903e206c5e4eb49c9d6c9c6ba3f5249ab7ca92e3c05884d4480d8b74b9fcd28324b6d67bbb59b2261a2f850099e171ead9e9760a0cdd42ec2cdeaa4bbc83b9fd55c937ae4fcc3e12baf019d8dd7ef907a4d756a9384210bbc0acd62dfb2ece006b135dd7d1e7ac93460bd59bdca4fc2a54be189027cf8278bc3c60e6fe604ca862189b70f2205139b4592b45235d0b36898bb0ed5a28b9ee42daa83606998e25e61afcc55d1e80415f6c874d137349188d1cb52a2e5c2f9a4e77a6f55c4bf82c0195f42a35bfd13ee36b94bccc5a96c5026f33a0e45f6930d364d3daa14605016b0351a3bc3a1222c205a99a355e930eff9d6ce40aa6408cc4e2cea31a28d00b8c16ca010d405e23ee187f7284d790fe0442930efb09c540593b35f25394f7122bb21c5cfd1fa4ac43b23f0063ba203c2c9111d9175ec494c1bad466b85881c7e0e398ead1f53d67edaf5e74a406e74138e61e31cb4638a10d3b8aee4934333bbd57ee9161aefa8e92fecc0584cf8a6da81e73cc3551d7152dc60c42d6257091d56eeadb45a47831204672e966cc0637b535e2800574182382ba7de55620838831920f488e0d651985954304d810f08a0058d003d6a4402c518022bacb6c0e8d0afc8e0a97b55ff810173dfe929cd4f81e480233dbda05a9fb231032d19b49aae133f047d1379d104a1b4942e357a62e673d4f53aed22d73e61aa09e001781370c19f9b1a26de722eab7dad540908f0b98b416956a3636b2ab5fe3e81efc11a129b4d4d8db3ec16066be10731658881d8ee10245723b68d7e5f723d8e4fcc98308c79a13114216b58f68e0b4fcd056d18e915f90533fdb8924fbe3c016c90ca33e1fd0457ce4e97d47f419b1e3564ef111fe9789afcffa07bb30f4e28807004818b8fd9a5eca11a8e595245b4035a7662d52fa57b4de50669784c0208a6822ab638d5a800501b987f93820402a2d16172bbeeceea5a8a29fbb54a8e536231de11b06190e5b09beb9f6da074ee092b0aa6d8ca51ce5536ba8e550f347a8cff8e8f2984267bd3b071b7b8916cd694a882b44d9580e545de298b8e6f825eb1695b444bf39158544e633488967bc92cc73688f9f26c469144b61dbca962509b35f8d923a99595f936886e81eb002de52ca67f7f1c1a5d24d49ade5285e9a79b26575c8c32604999b62d58b1e88f19d7502b510addfd1666cb5dd3504c1387027b7d74224f8020fb08e0b9000f80924188a28af536de10674ba0f498c786fa2d7a2cb287468c08d04d2c658bb3e6422331a31871bce69c2e01ee1344909ce871f49f144194584440c048bb3f4a6d41f02f6aeea923eddb299239d36eb60c779f49b251dbe0d38b29e19be7f157e0eca69a770a504b86f9b5ba621d304b283bde239bcd3fc743414280267cbc7380ce9b3b3a722a38cbf1080781365b1cad144d920236abf3ea473c40386f17d9b1535dd63a6b6e5d8066067e1f6c72c2bababc986c7dceca3998c0e7d90ddfb47711a7df1fdac9abf7dddb2559ae9e06aacf6883e57149d8b93863323305eda527f022dd5ac695d2525266508b370d63612d07c4f2c6290be74cfc32ee2473d969f53f5bdf31fd8022cb03aff3b616c268f840a187a9f03b376d285598fb3461cb4451cc36f2c162cfcc374d4c5f2cf6b01b83de7ad3517bfbe62a06fe8fbc1229e70224a4608494ae2d06a7cd1589e996ba05d14ffe682def2e0f6784b5c38c2abcb95280bfc635d17667e573fa7805ead93aac1c550bd2bf825c15f6c308c48a18f471e8f7f8e74e075ff0c8a669b453e62fa0e6bf35ac9f4901bd27500377648185400df8122c5bbe4200107d267c63b5c1b6af588bf49ceebfca79342403db54b6f23729478662218d13e7a25b086138ee007475b325f9c24a6295070e661dfa88b02bdcebc59a902b385e336fa025b39eeeef60df7e07f082af90021e38eb4c19c974f22fe01ae34e48248b843c68c051461d988e445b95d7ac9c8a012fbe56194c3e27aa63ba323c50d0c68ee16d31218b2acbc86bfddc09e8be439463232331a15defa96bf0be9491ddc5a8039e3b1d16dd34b5481a895c4a2521fa32b22416d285f263e7f59b985187f322f0a52ea8640e625d998dd6d508d7555bb4f3cafa290b13e2ce4e08d5562cb989e7b1a97861112b5b50a682c9452119568990a64c3a486ed91c8e1cdc1cd86b248fafe4554a8d64fcceb9708c5c70013a165025cec7c89f3bc3166aa666592a5a369942825ad80566ecea32e0a7b9e9e1022e3112e8a79dd77f7f098e8e2d89dff0e2dce3514ad724d9564b450af260aa9e01454d7f1f61a6c3e14027b3e7092db51ca6292df176125a3a46972aea435d08c25d164c701cd14198a0535682a094c7c25211bbd5a25b65b049f4289560e717eb73c0177755ff7e56faac5edbfacfc6444326acbd41aa08b45e619e123810bee6e344e07724c39efe511f996ced833d9952008a967d64d0e92130cb63bcbfb421e692e7a6e70000e0e481fed0327a393565570ea120d315e1e28af8499224687b76063d874aac2885754dcc8605d0e1984ef2aa13a0c673a3d2adc0bf141fee344c9a84258e70d7518255e1415d68267b09a479970e0b7688910a9563e4555582e43a20c1bd1a66580bdc7f1f1fe12cfc54654484090df28ace5ad8744af279531c688052d1ad9635ff14452253ded2b98150c9066be06c3f9d4ad42c86c77b686920158d582599f7c9c5662665d93d41a8b221abd9f18feba07f6c48e7bf66fc505ef3a633876491925c34d7d7a88744c884722af38639fa98e882bb2d2a703ec3344e30540774b8329a1815b6dce63f4090669262c1357d925edf4e615583dbb9413e85157abb6f60f9f3929b69532a7bea11a6faf420b333c20488feee3a335fa693498fcac4e6a135ec4120ec7680b03fb8954502a9dd1382ac8403678f746a35be4e12d31ba22d0ecda05ac35b1a93d8ed216f6950b701090d1672385d06724544834466e7e333f96fc3415fd70bf17dca6b6f91da8c2fc3dc0e499825be654c2325781a29f279bdac851b78d815dc471d4747140132f7c766cdf8e72a9031e5f0b9d02073ad3a32d4c3c0b3c61d5e9faa0750e75a084ad18d8788c0b1ac2f553bf0cc3e59bf8b385a7df6aab6d26ad8c8d18656a502f5788cee27c74f8fd0475986578ab547a43daa863d89270a8968271015ef84795b87c94c32f39b24720826a3760c692a8c67e13dcf2e73d4c0940f5f3b199754fec2b684f683704824c193770469c1df09488a083ce8accd6d23917935cb939ae590d048bb93e4a3b5190b351dbc254f6b2d5ad0d46e21a70e2269e8018b96b42a339892ee3fa2b76e31657e4e4a5916383f3cba56880302ef82a37577d09848fe1667826938f8123810488be6184b677edc09c780c078d09d977021675cef068d2d9d131a2bee80654d2ff2b7517659dc5e32548fea3d3785b834ec9219283961a13f128a48c0735b83c073ba2d15a98b39a73c12fb124967fbcb77a14b114ade6148d33cb0a72ed8667509e12af65663a010b8d6f47f5d41c606afac4251bf97eba6143e633dff4564c2bf1a4589b6f70fa7e7fe16844c1157e54a988f4e575ca48880c1a8f10414194dcb88c0fafee18f5a701bc08413770e3bf16c737e43fbf2d626e5418c0a79e368eaa42a4914e21b924ac70bd2bcbda501d920a4b677b109084f9cfbffaa92cd22f03819c5b6f48083bd8cd8538b19b4aad0bd8cf0870a7acb8eb26f2a7a9249df81a94b16a44a70c432b6ad3637244d1ac687feefc1b9f3803348e9ab72c29f9f2ff07e63a662ac14a498a2628f7d48f99513bc18a0ab5d548b5b1613b73e2fef86a01f7072dc601d5e6ccfbea0091a7cf0f747996eb4bf7a184b178c6923e0bef91894fbdf98c6da77c7084d0a1750618c0a126292d300ad136ebe06c396c97cf9c5d6fcc9020bf8293c24b19478f2a91b552fde3b9c8673986ef75111cfda7fde880a989111f56b6081dd21513033831d066ed328df5529424e1b698a24f58e51726cd71e5821c0131ea9494a06b1fdcb4c8c9f92211e2929aa73e4f1879a57a53105320dd770cb0c46ae7f69060cc4cb7fd841f758c7bf184a2fea51c38780fd331992fef2f79e1d61ef0a03726faee91d91ecb01fc605721ef2305a31d079900d418e9ad00f6a2a763e3aa1f39a4c7cf42ec0dcd25f56aad5a063a60fef01215fc142fb312fce2825ccca8a78d28ec7bf006bd6c7af80bb1b680c4b2ef358770377a60dbed16f384f422df86ddc72775b12ffcdbb8b3f3deef85f6bda0b6cae5506b96a20e3066419c133fbaf18f940a0e3fee9f6479152345b7c229619c0e25cdff749a757eb42cd52be3d900d3861a770c58a31ab0f753a675a0675adb96e9344e63608959b96bc6a5b0bde8c9a8f3d374ca025a1fbc2f1b7b4a7b3aba0caeb1d3a6870d69b173c5b03b4a59f9ec51b9017409438fe3d9c00e7dc59a50eedd8d190634723fe1073f48a7b4803dafc8246c304dfa72f9beeeaabb0cd5d571d9ab580b81bbcdf306509eb4a877ded81f5c0bae68d3f54f1c89163f3b47834741510083521e1c7e6465ecd2c45606b17622230e84f38e14828ff08c24d4cc3cff674761b5912764b0817bbc8e5ea6b51f8fc866f478823124b507b4ca5f4dbf8bdb7f84948fa6aef3dfcc020c8e7588224be884f6a6755d45bc5b0924a54a9806ee9bb6c12986630cc2ac0d78b9c34d32c31f8bcb223847299c1bd74bbf426c4338afa97a735d1b90130f372ae34b8f42cd13104e4b653d835a26ff070b6832f26ec9ac83788f2a5c7b32358a96b6c1dfd7fbf73091ea30f75808cdf372911f49411f1862a96292e9d4d31257d5ed6df34f525f3b8841d919441a5447327c80109ab077ac2f5436de99ee06a28af4c363f67d5e66fd6a27daed9d92d01dc562ff5aab5e1582ab3c896308112aa1639c00612913a5812c56fa62816fdb6191a884868831e287cd8405c3cac6e5bdbb9872f40ec42dacc46a227ddc5242bc6c7b286011bd1d3c42af0ffb564aa779bafe6e120a4b18e455bab7f2ba13e563020a80ba03229566905e99d669ad9d2b89a9f673643ff4f5ae52d0d233eaad69328db1b04bcfa3536d3bf6964ad1029c64eb89eaa8eb05b1571ed10c4cd6f33a1f1e2877f5d5761af80ccd8df8f900991ac3f419cb6390929dc8a7caec39d5f456ee1fba9de03fe90b15e87f908ee4e26ef9c578fc398526fce2b98daf7bb775b956409d983d07d5339274b0ee05a229a59d1254a4b94f8967918a6f1ce9f30f6b90c3d393848baf0d9800c1d4c9298f2757307df1f11ffaaf64e090862c569d7d72a0df360228ffc1690a349b500dc5348ade3b88bf119de9b77b5fa1ef8917e033971aaaa98dc0d11efb57119c85bba2fcc710a9845786ee22ef0cb061218982add4de1a5c98508eb89b68414ab5f464b6f5405ec34292242f356aa0ec4447aca8c7e6663bcf44fa531b6d639ec48c2708fbeb6815b39b4e05d96eb6845a138f7c8f6ed2c180e4c75f7220396f4c4bd54ab2a57985dada29f5d707624dac9945744fb3b5db0640db5c16be6283c57f14e6392acf3a3ca2f67b27fe0f5adf0400ef2d3362a12483ddd437a98e43bc044dd89acb7bc9a15822789af08505bdf185f7e935b55ad1698301b78771d816fe7605b7eeb6d99cdff58d58dd56d48b98f4baa01f4ef35008f236c39c12bc37c01b6657704ff4c17cd693a865d3b373ea8e79cb2cd0c28907ab5234e891c3a5480f77ceca88ce917ee50e2d034fe3b57c7a4e81e9e6713c53e03ee9498c4ca84d6645f8b1d95d028d7b4078759568e8dfd17dd2183ae7cb97217caa5a5bcc6bde6a310414d4b1afd4851165cc8536990a7de33f65c2ad8e351234cd18590b6066cf25782d0996fd743c28830920bf55414ffe3883120fcefcfe11bd298a32e4d77f59a2d8f34994c998df0e74164b87f794e5001f70f1bd78030814b1c321904524ca09abb4e6a30698a7b7d98c82dfc4173ed2e81cc611e8c4b6af9d1edf2e22efef1f9e403453495e3af4f0641742bbbb8443f5c6d8c3d11063a1f8bbea21f0fab1ed2204a53d42d523a34541a79726847e9b7ee1532f9372c48c77ecc3c17f94bcd9d06bd82fef8c350758c20a830c5ec95f19ce2d5d35c26ef654ec289693b0a520b26acae54e3021c178db1821e8ce03eae33edafc40caea38c9a3d2e0431b3f9292098ea8a53658ab3fe59814cb6298c01e8af0d47762172954001d6d7f93df6dffedd9c195d4f9494e5a77a88c74e89a7f9b844b5ace5433ed227046777eeea56378e0fa28f7b0bae1f5a81e4ce77f084a51a14e163b3fd5f30095338802c648bb00f134ea922722be8a49afcd313be3e31c950b44e86f6be4ebddf8facebcb3159f0a782a20018a302ed14135490fd236c3691b8f1f497dbc962722037a182e4849abf4dac57c5fbebed731271c90e6e467f16dea1f1edb3ee6fe32699cfadfb6d273993bab29109610af4ef05d59056ee772edd25937d663f62ee4987d78007130ee0cb172849187c2ddc7ee384f2db80dad4fb196b988e0e64047f17eb31895c3ad8e118a9df0bc9dca699ed534fc96993cd0894acef4e4816de19da25e14c03af3a03b8a23bbe43b9b21bb740baff1cc0fa3be334160bc8d7a913671c9a98e9fc400e918c33ae49d53fef534723a91618dc70a22ceb24f3fda6b707ade37c548e4d236fd6b86759c9403a903b7bce95a0f59db647f82a3c9ae5b7fe8da3694010077359bc72208c6813cebb3288eed3ce2b4d1a9def39a691cbb93ad2802a57df8b2a60ecfca3140218f31b2115bfce2c6e3aec489903ab5e41d07fa00c71ec88f2a24cb532444b05fbf2fb2d66383167d5c9e951b4edf91ac2205d71ba16cc0b5231dfb8cb0c4f256b87a8ebae4f62805d02680cc14f925327522d9f17ab52754945aa8614b895b8454afd60fe730361d6ad166c578a09aef3fd6d90ccb21f42192aaed80fa3496da898ec06967620446803ae57bc53014484dcf42caf0cd3f58fe410a6e8bc5319066df505653772051e5327d6c7558dff1cc5869b637fed71d461b089423a83926528a57ddea51c4fae51e05c7b1a19cefb41a473d9516ae862e1646143ce919d40b635ca2c7836df325e14698099e4b24883364483c9282b5a6439a21ec4681f9ad7e20c4e63adbc11513385a8ca6e563893b0c21313b0db3551b058ee5a7e800b5de917a48fc2100af50c2bbd7f414f6b30bbe77a2b603ad41394980436906a561044f3bbfdff31b0008ce2ebd1afb7d4308658836780305f272a69012111fc4beab95356c4fe34b0b919c24648280c0a3f1e933165ea40806678fa690f3d46d73953eeed9682e47f1853795c5b820952f395f2624948e63cc6a0c5347f2f3661507253510f5e8e798fba0fe29d447d10b2d250a20e7c05ef33f9e11a7d01c45484a93578738113e33fef608f248f6e40522f5da07123a77aa1dcb137524a453b78cd0f5dd21de5970481d063476a4ab4afa6883cab238a24be3b57511c1c72dba283583d105564e909c58f30d5d5fbcb3b4db2317b3e5e36df5574bf4d2b3cfed806cdc61fede507491937fc717ad4a5df3193fb9a5ba0379d1085bb8d8fd34c1ce511ee5396144f89950689f8f456d4a4c8d522c811a0c7e0abe7143f73968df539875843eca3c2cf729a75d5231f3f27529354f5b542bc7622f27e1a3d6919a165a0d50ae8fdb2c99e5fc07bd423f41bc94c5a5e92112a532c6777cdabd2b25d96760e5635c64d032ff7a547eaa22352b714485d742deab5468224017d41395230a3f7eb41632d70e6ca83c1e451656cbb0fd2e920fc26c67640812e683bd8194acfb3a17cae16f48b7762bccd68be6e19817e366e302830acab2533dab61c111a742605ddc624d017d27cf24233aad3e24ba561ef6b336e1b311b7254b81aa91cd61bda166f3b18e665433388b851ec81a538a1bab1b72944feda7665040b78282d0fc4bd6a48abe9b1a15bbf8d70d8ec71ac6263f525471e8598b18a3fd130617f4dbb8dadb5898a151fad008c879da63de19766c1d529d330be061ad255efb4916512ce2b9db046352b0e91b6a2428a35556c683786fb7ac430175c44d5601cf76d569e7fc8db9462307c0b92132c1c1a66c1b6b664a295b204c339db526692efdc4a306bc05dc19d9fc5fbadcdfe9b3a10454667f3ea96498be10520ec222d177cd9976da720dbacda36504b34c8e1c9ef436705f84f9448938c68849e0d36ede2f81a2ad04cdba13fc339aecd03816cd1523eae14911565fb150699d7cec60b5f2dd16552318c0c716c4d43886e95e3d68be66f85432b41313d98e0913c1c0eade7b04206e945fad886f5cb5099dcfa54a9ef901ed49172570af07ea5a0f923e876eae882dd501c0d32e84a4d3acb0c9eb5a970c6f88d46f8dfe085e7d1afb4974228022b6fa6395641032e34d2559dd2ec6c842146450b29fa9444af572b2624e191a1b0f0b2b26794615d6aa99d8171cba590c28fc8be8176b39f2a25f951230637d69aba4eb2b0291398f54b2615d274e30ee86d588ce9ec7c6aeda8b4059d592a8b416799c1a3aea3cfd115345d405dcff8c7965ef01fb99f6803a742efe0c3e9d4b17d252fb092e14044b43224bf3deeb9c790ce6c2ca22903a3e10954c8784c938b214796a9b9528f5625548ca5206b800266692e47af88db147a88983edde6bb13a47c56bde515bcebf68cfdbc693814f027f428ae2c1368cbf6f21867fc9e33faeba1183681474a2230519242e6fde654ed3c67eb09959a4d930849a79046a015de72efdf298c530e2013c1628c5a4f3804f836272fae25df8cb11a632c25f58eca3b73d8a9d3c7bd03ecb0de53c43be7bf66f3357a910fc8fc8f6c5bbac44e5a81a05e81bc24ef56c42079731357db0fc56bff14c379d56d3448f85230fff9ddc9ffcab4f59819e52366671b1bee5b838d6f5a88585a0e538c4897aee51a80d5bfe4067a364d9c7140b206a20f6f8ed720e6e3c26f5f22089863d83407ae2b1944a2f7e98a5e79659f63f42ecae57fbe94c9b2f283d55cf0d4ea2bff6ada4d8f9121738cda48cb4806e254d31bdbde9898d30c3fc166ec9310a0124e70f3f6ee791425d27128a6d563894ea020394524c795c0ab963b2537a525e315454812025c5a8158557ac5d27f5751c05a8f5d2c69b829d0273d5798f5101cd21acbf2da190f5d8026fa2fa641be6ea528c4ce41e9f84b9bd2dede3c91abdd2f238457fb69ea302842acd0754da16e4d9b9441547a1708e2351d1db952f93d8c1ee6d52fbab9e2b14d7c8d11402c608778f5127db5e82a7960723915201cfab9d0263e9ee2f8bd3703034ad3d029beb8863776104c321e0003137f6290124a6d9907a7e732ec73486997ad80b2a023e83bb6e2acb3fee4b129901d91f6b84616440213d4816a53967edc77a21650a14a302cd24505f5ea743164d648766a7a12d679079ab507c6e598d5bad5b064a8cbff5e00222c7a27bd434d3f8c622e5241592b0171bc9f11c39718fcd1bd463102c6ca15fffcda5202145d11a28dcbe8b217b0a1bf683eb3439c8742007cb0993b3260f1753de6a50036fe08c869e271070165a071179ccec381978f5a5247fbee5f04340fdf4d89b61e14900ecea1c2df11aee4b01821dccd280055ee25efcba0e970376f723426128f50f5306d4a08fd502e93546e56a325eee301285e4e633ca436e5b097210af4185e7b46352e64d4bebe24b9a9dc23989f4790342652deec209cb890c8dac72c72cbbc55c5e4febda551441800f520645b5636bbf46bbede274ebaaf48c87967441dafda251d6f2dedd004a7b383ffccf34b804c42c07e4a54eb7e0b93a264495c5e3451cf6b8b98e7c0e558220a84cfea13b77794476235cf62e2e3f57e9b15409d5d0a749bcad0919fc038ad08387d04bf6a818d5425eed6fa72c4fba3572d06917dc2ae496720648ded9577a96aefd72521860a56cbe8fa01100c030ac2a23a9e0cf67898cc12bef261264c02925143c02f590e42d5f4fb6f3bb0f0b0ce049803a74b2b106a8b46204c8c7dd7e56d404cd9b4455fe6dc0a6dc3698ac45fdd3d46781ad1e6c3dc04855742f5f9538c62e400098cadd64a97738316510a460b01179af7c616aa39060a47a8b16e794c4728c819841196dfa199afc999c859c4b25dbbf0601f3cc597c39dfacc94d271758a1fb4a9485a2ae6c16b0b8c254eab29b6a1d9f60af238daa8daaefb8696c961d0cd00cd457d66dc4e2d1a1d7914c8728a83291fa770041d10802ca79e0d3a038ac34feeed9812852c277aa6adebdf660fea53bb0c9bfc0ef5e0aabad2ace34fd528bc7607a5b64e92671d235ae905f1fb91d0904c6febaefebecc9ed74d3df4ef7aeba375d2449a725c4d20f309efe0b42ca788bddc6d12112ae76d983b8dd8149ac6bc75847e43b0d05b4715674a80bd03c12f6ef53ccb0b2e0b03d11eb86e27a0b042d118c5ff3c242277e9db085c5740c9e09d2dbecc20ca21411372f67e925a95309eaf2cb609c30da4f3dcc9c5475f545dbe9f16be1f0bf77e07d9fb97d7fb28c683e781332134574847558960ef24aea19cefe44025ae5556ffbb1a6287c79112b9c493c891902bb2ee7d91d547fcddff104a02f351722062de727b64378b3654043c9459c0a05fe799dca993bc8bf633d5f0b5f322180b2e073e85a24beaab124556f4d37334a3467fc3b2ba71cdafc5a86e397421b889e5fcfc03a74c2909ae48c7d5925d0036da0d3e190dc4da2c5393dacd950442437825bf8e2ddf72d392ec5944a467afb61d8c59b0ea937161d91efaf5187f6349c0353dae5cab376574558fde73e1d4cabb3a67cf61adb548c8f1971f312c5f558e4c9668409141c92ab5c52f5daf8802faf08668c1cbacbeef7048052a2e61f9029858b15556fc148114da0112b1fdc65f899852d48468e39d4d4fd1f85acb8ba8e3a70384b860c09707e7151c63d357bb5d058b4a6e9984c045b67ef12e65b88ab4b4247d644e69ad515ca8c95e59a254ae2da89c44c1f31403cd0813e3bb1fc5e02d5e488378d114a39fdc118f66f603dd52abb4661147fceb8166d5dfe508725d2c80aaf037ad7601b261f7a8059e2acffcc415b773013ca2e76861b6bb1f166ae101205bbaff63e6fa8d991286d7e82b9384cdbe80390824ddb260e06d8c5975caf6e0b46765b7197e3f248ef87bb926b4c8d0bff9dc3c715677aa5d6051ffac7ebf76510df845600f232c7a6eed5975d030adcfb2d1ea07221f3d3d176e92dcc0991f4d4cf64ba224ec935b928ddb2321af0c0b6636f8a731a138f3261b50c479915a138e94aa22f517224740d0799d4a40f14f2408aa438e48b3552b567ca9e1d656001ae93788f437a9c5f6d45cac5084517c91b38469e9998ff5cbef164feedbaf1ad40db3993981a9f760f22c87bedf5bbd7b3eb3839a53901610b76ce8b8dbaa2bedce2d3a72e8c78de217f66732058617d3b943e0dd7bf38d0e090f4863917a12cd96d4a7cb723c994619f55627789d420ab6ec3f3f0f978ca4d1c03d46ea6b53084678d073d7d52f0f662394f8fe3e69375d5983a8f683888f7aea003c468e047eed8caaa1c183a60d1e805ac1bf2cc607de6ac380f96a67b4450a83163fd14d1f4870e37fe08455084604b9e272f520d29ca6a6443cb8a8fc7d508b4fa3bbc3bf26022899f09edf4ed99a0495654eabda48a9901f3ee9d1723cb3decc34310278fbb6591c26f8b58659b9e6c8f0ede55ebb142ccdc60d311423e006211f87adf1dbf4779e6dc18fb5fdce447454df293c84a2942c745c274bc067052447c5db9213395af231aa110d250e1882058b2c74c94b7929321f98e4280ee970b72ca50480b645a88acd0279a72f329bad3be77653162644ebe45182966fe16c9905f7e126672784010132fd93649d41a6d98211d01575b172085d45a31ea0f98c23a7272001c052c2011a37878d91aed108a6934a06bcdc5f35acfc3cada5a2942f5b28a5a01d33ce0d1b2bc7d6d3514724fee004b53ee288f6dacd49a68fd9b280cb194254e5f61203115a9ca8b4f182d7dd9b94c10281ea426d5b2846bfe9303653e99cb5a50aba8ecf1184632c2fcd0e977a20ed052cb64e383986a5538e2458f55e75c5dbd0bab49c718a8fccdc2b3a150b8946412d68fb0c9ad7561fd3dd529cb5b12c563ba868ad0f4a33abed9d390342e234f8da124d8bcb7de419da47f5b9803902e2463d48013d55ba5449fd5dd0755b2a2c294de6414f3fd205d6e745e86090f250f0faf1e06129474c00f3c65ebeebb5845e94b8570fd8d9ec75c5a9f0784153199e7c5c5e9ff3ba1db82cdc6ce903c8f593f7b4203162ae848041471a278292b878315e06d29729fe5e94231cd64951541ae211425042a1c8d2aad13a9c3e0ae93b44e05d140cc01f9d1f0c1e40fa4b2ca7eb634ccf422b88df5d96029f89405555355950ccf7495476ab461039f20a05806f9de95bb67db6fe12bf5a8d98b36a05370e9c71e404f0334c549fda7163b0b41b3fb145025b208890ce15a276067191fa0ecbf244e332434109210c611b4efe345bf373f868fa315fd51a176b9b795d4b1043893a0fad45f23d6949c582640dd66dc85725045f64705d4eb568de0f6efca633b71a00d894e35a7656ac49ea607294ad92979eafa8b2dad67f422c9c8ee1f12b0d49f1c92ca0876567170a817a8ec644d955cac1fc8753b5317b7990a2127ae3052b6567eff4e88c39931e06676477c66092d9a69e754cdceab85055ea864ef04e312751a6d54a7781f032ea655f43995874b259c0945467226107e6251088c7e901e3f841a12622e63881f67af725f89805ea8ae0dd9e03d498c07a359c246f3da8c6518e69e6097ce36ca803cf2d43dfc95851cb9f892af322785d4b51412f46b1579cd9cda88eb1af5914a060c2797c4e57521532dbc74ac9921ef0bca3a727d0ddd0790e7d002e4878999768328ebd6cd95f0a931778910b9a8ba742dc77f08cc407ddb227851bf47e7ada4758277202ff921762f46fde711df1e12570ef32c1694258722d8110e5051db0ba1c3912cb410be90b54985aa492ec644aca380018171851cebab6a0c17ece389fe000134c7bcb53d12a83ab2fe1190c7351e2882a0c2a3c019173a5b08bf0eaee086d6f47fcc18dc6a06cf48f89e421c0314ab9651e305575348f5a0e2dd7ce7c9feaae193ecd251727b5c273755cd3d4ade4f69f652ab4cb54d295ce922803ea261e13a6061364eff6e09812d8054881b182e3f292cc50357494b1719859302b1c0ff962b346ab17827625107e186260a68a4182d76b2dc3fc14d8e962b2e446193736a760ebcc6f92b3ddd9ae972a65dcd46b64ee4972f8165601c3656bf7f3b92710e1c9c157c136032b4c748a0cb817de8b8fd4a277e6c7caae09c9e9deab80ea917abe0dd8910ac6146ba50b4bdff4901aa9bf4786f5ca0430298a9f433a18e96e181b69c485c74318a9792974d0cf1c109c750186505f41ac648f244070829631675215b91f995745b6b15d579fb2308df96904017a61dee72f02073e6e9c0934cc8200d630b64bcc35307d1fae5e465c333f99956380400e9ac43363d081fa44079cc6499da6b7ceec41da6a0e152cd35668b5edb02870d9eda78f17bdc48e3c362639498bb07651f64f8b38c075164164165051337a005888788a6c6f6029fa1aec05cdf38f8ad00953ac6b6b5bbf13b8142fd48ba988eff5d575c5962e217784acaf1a291389f53c783108371876fe3e94a505c02dc4ca482c8046d74bc9bea25aa139157b0c8baa9f2daba69df937ea2ab6032aaa56279a9ba31ded4cd7cf9d5df2ad985ae70d334b540a11b616d11542e83db803f33d3133bdd12ea5b8d1b8287746fe1bbea3a8369fd40e6d491e01c97206d5d94defaa13a5deddd165bb5abe90951b1fa9600f2d26b7c508e92b70c227c27404a60abaaaa067f39d47050bbc1a1d44dfb7e9b5da94a7529fa83acd8282fdab4583971408c2ef699bfaddb4d78f651881857e64ed8d2d67365db6af9f363213c23a4b705936950890b65e3a35a41df396687dd02fbdf8d17b40e924519ea71f35d1636ad92f9bd27cc6107e4ee0bd77e7ff0cb62e5df5e2a82b4b2839f9a0349d864cc34e4a8cf738778f73a3277044ae1c4f4ed31a3cf6853ae73da936df48a1efca02fbae65daf25f7c4158a8a9eca3f3b18bc22dd2608bb6aa7687a2e7ea3710a19ad3362a99a8569440f48ab6af5dc51bc7526b0873d228b18553cd08204a3f8f074e34dca4c45416ddd499a7ab39021e4c473f3a4a32ec4992e5d9d88426dd6b68ca259f74bf62da8e08405353844bccd0ca0e11ba111f6902bb90737c1680b311473629f7057a34819c73a81e9f9e31d62df572f768376c38f77c99a807c2b98127f56b1462261073fe0a0a92b7da9d596d09b3dad05c44a5977b82e46cd4a9b645b9c1796ac7cb283b50002ce3106d8913320abaf759ea4b22d22aea9e16d089d1b12e42fa6e363a3ebca3d3185c354f8debd44eca9ecbf761fd29add2be8ddd57dba158c747d6d842c26edf4dfd7100312dba212f30adc2f2a709dfbcf1bf545972302b51007c26f42d15419e1c6a14386f26f7a3d707f3c2bfa612f9e4d90bab8940ed31d4b35934c3698d7caa290fac3b9de81b5fd5c7969af2836c9f4814a44a40e6be852092802ae9a3dcce47f32d7543be20df6ab5bdee394ef780c01d55bac903531490257873a98e17ad3ec90e3356bd329dcf678a4870f26806775e4b054ea2851bf27b2af5f04b8c7856fcbf4dec96c627a4a195cf55b94f5e27fafba075f94cab9cc5ce2491202e2f092d1dd31a75efab65967969c5c69a5deab47ce094c9a815f4057e6d6e72bc6203816b2c45160312777e276dd5162ef2ec0d9bb8cd4b01078b520d2cdb39ca2b11893634272f22017e6c560644e2be5289cdfa731197d32e24e7ef292d31551270861ea25fe1c24a401da01d47256232e0de0191c9a4174a70852b8b819f6535464abe6c723557abbfb89f52fbc704e2555b2004ddfbdcfae82df72d8dc0ab7dd888f77fe7e2c72b310c4eeebe8821d88721e775bc07c54347ebcbf20ec3b0ef9bbd4bfb2ac57527d607c9d529988c16066bc74df7a989f53e12fb504bee3b6d70551548bb435b44478b338489c49a89e0184d402d42bbe03ef92058e1dfc600f93f8e020adcb7e1966b7aa077712197502246db435ed771ee49ae7775016cbfb893f0aae95ba5dba4603cd11fdeee6e8af64759a50f0fd72d21c72309abe541b35323060b3626593aa086f03ab4b381b5ce4746993dfbe276a6f981a513d0cd3c899a59c9327d5af7e8ea003feb8099166ddadbd34c4a1da5c8f8093749032fef149d64a3ca8fb8979735ed15ab61ed5ea9487ebae90ec1de20931cfd5152db77db84871650512d9f4aa50adea8216daa4760fb989be13280d7f6a284e8cd3baa181d6dba974e6931d7d05bf31ae88636b6bf3c05b196611dca3a4a36ddd2ef74c04aaf55ff9054950912875ef25014b676e0039557fd3126df994a54df42a6e73f544d830656e1b809a9c9a4aee84f2a86fbd1b3deadb9bd11caca7fd53ef4228a2a9504dec238c12275db68d3ee2019817796422c38b6035b74d563cfbcb80af34de553f610046cc0fad2c1fbe46e4117b907664b7edba055c368a2c2768a10f7b81e4b40cc7824cc5df0a7dfb3fcecc4cfeaf50ed81dc2a4ae0a44c3e4fedfe96df8e1502892a0e78c9430ee06470673da4cfac0161a53e8431626b9ecd03ec6835d3674cb54cd0efbee60da71c90bb0a334250722d691b50e67b9ed935ddb8a4dcdd7aaa7fe11788af3e9abee0dddb6667e84818cb05ab2ecb2a109943a1cb5b941ffb3e1f8ad6c52a9a442ce48b6dc58bdf8560c506887f1e0c2f8b03ca43f86c487b91f6953640a8f37892d0511e3a61a47dfa46febc302d6b80b52b30e44044ed7c307fcdf9979042bc4d9f0e199f69c21f714882c57c6dcbda101910df076b86983903c521d2cfb978b195e7f0f59d4ec01163cb3e65a7345ec3381da12397c079ab7fc6d9884f651a0effb1d960b2fa0f5da56b12e40703550a942147d6e098a1077c6f7dbfb03237e6a7f529764dc682926ea2459b3c722775c30322aa5085f36595e8addf09322312e0c923a010527cc8ead2fad15ac47fa23a992479edd2d263f94de66b6fcd02f2a43f9eed8cca0b4397161f8be3fffc092188b834a2fc5cfc0a6c8e6e267ef2011d339bf5357821477791e73583c146361fe96ea0cad979f164c96dc3d2bd2c65e10b78fd04f652cbe416c7568c236720022a2ffeb369ec944414b0f83d42fe643e861f33309d70409232d1a04da24ca8320d6b28bb16258ff474df19af48ea39e6b41a9089ae014f2a7ab4eeb2dc29e51f65edc49c82d94a5cd2266e665263af9ed9230cf1807b050e2b32f8fe9968c5e22c094f1f2c8e86e17fd3f7b16d733ffa69863abb287f662c54348c9c61db5b89c2fc54ba05db5e5e77df3337e76f2e39d183572d3634522131d34efc7157c81934a6006e9b229f1ea29c43220a6412d73ed33d48ed9306c832ecdc4cc311ed645ea969046064345aae8c4383b51f9a17a0f4df11fafc9e33b69fa95516e1e846a85e9a9dc3192aeb09cc715e97d81247f67c999ca62d8cb8efa9e6828ba9ed64b40e459fa4fea8d15ab4d44fd65b00c413f93fd1dd34a51216d218ee5f4ae7c0d2d18f9fc9d1336afbdd9672cac22c799aa97b6544a227fde723eb0a83f71b3446e8b2903f67d79845bcd9cd23ae6403a4cbf1dc269d53381fe1cd32fe80988c6d04f451f364251eabef0637ea14d83b605f7740474c96666fb53f450bccbbd5b2c722cdf7242f88650a5d994b21789ed87d40dfa6b95c76983984c86468424e7c876a3b3ba48175056e5cecaa3728fbff6384f42243abb2b8ee098507233b2d09aa36d3e23bd128a19997898603522a7eebbf853f4f41837fc39a1fcb4c68fa8d086e26c8b5d910cad7d5bcb48cc375c57c025486a801409487fbc0c2edc57f610f828cd8620878ffd73568170e5ba84edb7498753081827db9a9dc494485bedd250ce9695a6c2368a2baf4040a7f9bcec8ec499c0d1e78dd002159ad90bb83712370f4ad13f7dad0a3f3e0b4ebfedb6b39b7644fdfde4a930c686511195104b2d2404ec169d600952717061e74db0ca848b9c723e05de9020e37c9691ac77f7c5de1d1ecc2d75e04ee9cc42f2debe11a861a2b193d22884b6ed809b55bc98e69e81ad75b5b8e594a08a5642945e19965d4384ea2fdcca762e6ebf12425c80edba9ee2badb67fb11da1e90ebde242fe58c3dce66303cbb153c9031cbb1c0a98752242980ec85f11576c02b708fce03212f2f7394a95c2ae4e76d149ab21bed295c0a1deb589eab004e026254587104ba4bbc059628c1f3d12ccb85542de6e94e09169ddc9ee5b5a0c2f19cbb64fc8f1b65004cc83811009c0b5a9bbaec1fb9bcf7e99d756ab0a4c38284cf2d9970526042fdaa6a295b13566711da3c32793dec747da5e276148958a948b87ceb211b7b630c0ae751da83fa54a05666b44c6ce95ae00fc74913ff6ac97eb8d45a3e88f41740971235cc3af17a432815d2d3d72f058442f34287f4eca20c165f0ed3596983d8e269e5f4b96765bb287f093e01f789cee84917b9d43dfe3571f9d2fccf439057c6d9e1ce2b2727721ab4ad56d8dfe6628cee664aa69b50316fabb316d7ed33708ad90b8a308cdb9c3dc689b32f55d11de29e5729395696b092441969c3b8b5129cb1e55374e006001e84ec1e3cd10c3ce53c92e1353b02132b8de514470f6d959e2627392c913c5dee6b0bef1a4312f245f2a728057546be528cbe0989044ed5696a9f9d117b7374e862b8dd0d13a857c64c8874cff213d832cb396909975180ea1324b43a54e79109860b49ec1339b6f38e5354631aa3bbc056cfa8e851b566c871d6fbb1dc09e41e7a0d1433be262140e279ca83c8953ac2d42b4265b4906292ccee6754b91d275ce5347639f2dc0ca2a7a41b603640121de79a9881ac8e89b3a01857ed5c27ad9e8bb1989031ee55a2f0b8620f3b8f07cb7515bac2fdb180670d0b78839cb14c14afee8224051a75428d9db9f3fed74c6754c87473996978c0064df8c5038edb93b3de54942f63da218c98f01094bb1a0a51cbb6ef4c65f1e0c65a044c6ae33edea1294b662a59ca77e191976714a3c26633ac6705aaec4f77ed4d2a924c6b4beb6e1c152ebc1514564f277eec838d26619c6b3ad96b1450cfb7595011a8f08981862272cfe5d055636483ae504be4943ba57887d6c9535c8fed7cb29b9875f28a1a0cd851f5944f7b7d0c8f500e1531864d34300323c85dfe090eb5e34938096204ca3820012d5702b2367788bd90b81133870c9d512a2c8ad35bf9bb1155103f84c10e4e6d74374fa3464be2f5ecd4a103d8ca50705cfbd735a7a5981b8e6f1eababec9d141f156f905fe10d323842d6837aef9cd26af98952ab0787d758558c77389906c4f7295ee79c90ac35d37b787fa45ac12546eb492d6e8d4109ee6646bd7d74133506622a654ae0254b7b0b6ca7650d621eb7b6c93c65dc1bfe6ad565cb0ace154f90942b9b0769e023914ac4f435fb53a7feecb7a1856d257a0ee134988e00023c3f51e53634fcde9186ecaf717c324c63f51fd0537bd1cdeb1efea453ad21a6d694607ce57e07183c166a2100c56eb471a92896531bd15515ac1ca8d3f8c0b71a40445c58561bcf1786f5990672ca5e6523944d9b479db7d3929ebcb50f37c8d07cab3cbdbbeebe38090011c162b0cd8b8572e2d320e1292e70c6f69259843f12c5b39a9d7f9e00fe18f72933ebedc6bde8075ecd89cbf94c6959617d13ab850526dc30cc5055a20d3b3406722bc8a5720388f684974eca5b49b02451c433b70331d74dcbd0780cbb94abf595b6c49b636dedea9abad87d9ef62cfcf66be7a4d2e0289800346ea6728af21b38540bfd0dd541cde232b0c8551552c79b55a624da6447fcd4cffd98cc58afc0b5883882b5bae2fa0147c98f93b5b49c864cb1554c646e35f51918a5c1f52159d5eeced29808bc639b6bb872d5c5e0f08cd39a28a51ec813cb1c88f133696e1f94e5fdc07ef25df9b0eed31c6a2b95c314481e3c9dac9d98bc5b29267eeecbbb2607488bb8f540858b3a5860d506b1924ae6f6432b4fb24619199043a00c1dbd547560bedef6cc4023833057897a2fab7d128f549450205885565132916a15981f5116e8ee7e3a0581b78e3b55d526ee1506cfab43a434628bc14e9579ee599ec20dd84bac09c296a6234ad8760d0412a0e09627c1e18631cda185ac4c1f84d960451c9b576c45bac26b180f3ed9d19cb6ca53d580b185e99c21b6612312a32bc6f0904b176368b7cf0764e778c313baf12b7a1850e21c90d8ea7c889d06b8b885b88b4c437e562c3e0faa45c1ca7fa2b3b9c18aa4461e5c0e5628c8088c5edaf0e4f4fb7b298ca2e76549a122101a7eb19f01db8a5418426627f15eb20a7620e8231bce7e99aaaf4245e31b11703bd901c357a1c16057bbb508e94e0d9e5014bb836392f9b3fe521436865f88384f676956e6dc2c7e4003dca5dad2152b4531b1adb5ede0ac25aa9bd73377bf65af7e95926e68d7afd5147eb1ef1ab63d22dc70e12811d872557269c63c509048c22e56a71a6e5e1c925bd200becac887bcf452134e620e1d24c925057291f1bca7b613b38bbad02608881d89f66a0c2ae00fa0f5347d4dd37458c086eb598fcd3a4a79dcf6128455d5b324e95c6c6c0f9f495004bc314156c0b3e60da7887e6b02eae310388beba2e3317e2d10672f1cca6a4a53768600b69f40a1bb0597df96cc744ef198a4ad366ea7d43c40aa31bbc78cd269e2badbf8c54eac037355cd6fd275fc93fa31623fb684926c566ad8bbee8eaac60081695a8e911c8a4183c8330310ddb5b0375d1b961b4d11d1564c19618a87287af33843d1a8588ea263e7bdb302ea7369a0b60a4086b525d9e594d1d120210117f358390187b2ec0a05447f7b924fc21dd2119ead42c7554879d842bc4af491b6d4cd75750b4d3fd5a3ac2afa19a82a0dbcaa9c437ccd9fcc1389a8f26182150ab5fcc40b729b85427d2d77dc321ec835c6c16143a230c67940f9d25dc57c000c77b9ff06b8ab28d2cd8cb74192eb87ad9df4e51b469f5506b162a598fc39fa72aa4cb1fefe14c481377c5012e99de5478d1094711b67a8590f386335b7aba78c26a7c0a57a243e93a89e774ba8eb5e5da442430b933c177419b34068198be786d478d9cebdfe5bb0a2f65b27b79730f780c4f9ded4fb2a4a298a4c4c67323c0df30f4eee65aad57598ef739296037d278828dacd0a5792e028baf8fdcee8d2dc2bb88dce7758c012e768825dff1a303312ecd3520710a8f613851981d66b1c23a6649d13247726c259c2da6979721584a56650034e02ed44c66b3ecb057d32278eb9054a7a8d83eae12402856d9e01b67b3e3b7ad1ce7a5b5320c69d7e26b8ad026a1cb77f62dbd88571a1c1f9178dc29cb0c6158fe24c0ec5d20a551595709025f891139799f086c81ab3e547fbdc4c5c499986538b9b17803dd5a0d0e78a52c87c532bbc4c5e9c57dbe0484eed01a02b08be6eab0b28dcd04507e8ae7280b71053d57b1bd1789015465cf1098abee12fa38515c2a532c3aac709ffba1f91ac84a69a3a5229c8f0d78231773fee2854f02018a232da2e7d4762682587ef80a2f33f296416b2e04ee0ea8da02a5da76e7f3b7e4cd8036ad223563c2627d23bd0665fddee12aa8f8622e6938112d02d27379fc30849e726500a9efc48e96ac0f83096ae7c66ed49bc3b218a54a3ecb32d8656a4f768c8a698d97e57357d6496ef0831d624f20832e6f2de2f459dfc775cec33d9237164f2aeb30a533540440df79694888ff1e690a466a1884fdb12257458bf84af4814e506706e3892514e6cfb252ab3e1f474b0a7b31238fbe567189b6cb8c0504b81bdd47edea56b1fa998516123ba3ba89e276e7d90419afe8e3f52df0a4d4b5fd1e70ded3ef0dcc746680d1078f8c43066676e93dc014c3586357cfc58ab3920ac258223f84ee3aca08b917b09d07d5530916d33b544055450c67b8ad5762df39531c16f4110e01b8c945facfe958062bee7189866aaa8a4cc1a5e50edc01a6ed2f07a6a71066316c883a1f96c6a54ccc2cfc8d21b1e4a5a87cc1c6bdb3adba06fcf2b24c79de87a372f204d270b00b5ab427b5e5d3e76c6f038c395b10d6c334995b95f37d4f9dbde51bf75cb8b4c2458c67fc5b454d97de14d51246410ae66d4af9ed30cbe986d176104bd09c8ae2d27b51b7a129800ff53022e07d63e8c378e830322582eef5b1aa79bd791cb1bb5c4e78225bf9a7eaf34777f6d571b52e9d54cd42ad6dec1b1da03614409082f0146357a3f4ea180a71bf50edf86ad5ce4c36c92692aa50b6233ef74399e6ddc1cae3c3ae48a73da8f74f9189af760364945714248717bcfdf95144f012dbfff9ce3514399eab7e2ec60503769b56ace45a5de5642f41ed1232684ea9090d9473b4dcfb823abc9e5b826fdcaa63522161b85fc7a7d760601b44b03aa66727a5a30d03a4a074bb421014a09cb43e3794079fd9ede5c20955a5e46dfbee4f5ed93b1fae472a025ab878f877ba2a546c7882a8412a2129f9d0a10b87acdb00ee90b03a0e186cb4a52f66d5f348d2396506c235b922da594322599028a074707bb078f89b2cdbb63c0fbac9fe8babb5f7fb66658ff769e1bcf955bc4799cd09291d125c09d50d47e6883e28b703bbe4a34c03986c0ee14fe22eee2df3373923b828107483e921ba0f7ac0b5fc87d4afa051fc6059023696f60bba7848b0b9f88dfba4e111093f1a4082845248931320292ff8c2010334479818717001dc1c003f41ec90dd0110c0d341f490280decb0d49028088aea4f09e080813d1951fa22b29c87f1cd173ec3a90715002184ca9411555b48002888160d10d5f5ea0830e5d9c562006102c853732027aafa47b4458c2393a58910dea46c87d80c96c716127e77744eee43e20a4088b991bb90fb013ce754417fef30d3a41c395dc141abf2372bbf71e5f48d1932b3f808023a51bbf835ce7c2f50fb0134b6efc4e0417cac801a1c265843048c01ea8dc9ccbb11e92dc2944fc448a9e00654635b0c062440646f0df14a30f64e88109d290109084f06234b40293b9538c46088384510b08385272c1889d5802c4df89e0c667e658942e77e8dd292f3019a08c39227e221fd061072a8a9c313202a29cd1919111107f477423d771a7223042982e6922a0d2020b1fd018499306884d605d6fe982ea30fe9b34c6f7a79b8d51c2edf50d7187db92118aa9ecde82bdbf5cbe7f269f4af93edfdd6d700e99c36d350e0e84223f4e79619ba9fcec829173bc5b42bf6294135c9877d47e61df7d501fffe53ef5e3e7740f7c1c9ce39987dad6a13ab475e8c78f367818c386f4cbb1284b264b95f6fe97633c88b939fda2f47126cee48438160587cbb12837dc56bf28bc19330ff375222adb261b9f211da1b295e29d9fffd597e221519041f2216ff23dd500f92dfff177a8ba054d1ef3f96703e633bd2e1cbd50c4e80e413d0b4557a80bc10ece48735960262a4c4c70ebb350742bffc8b81ea82ba58c314208ddbdbbdfbb31c5e3f1405dd44471fc31c5037599793ad486f3e3a70b5c107d21a2dbb90fdac97ffd92a34abb1c8ba2e4c28ffdb106f061385e25c46f91f169a0a8e3c6f8ef8b54e6c7fc345059b2fe09fcd9b3e5e3a013878ef941ba87633c28ddf9152802c79dcf29de66d3b3a275c59dfef35993cd785265cb057cb590bc5c7fcd3df0f8cb6d1f956938b14fee5340bfb3751354d59eb135ea777757fdc8819ac522e2f66b0f28d21286062d37b8c10b323100318b0adbbd6c6c872db77fc787b8fcb8d80e56ae92cab60bdb2f80ca160bdbafd55c8e21952006e50c2721850c2e5c9ab2609102c4a9ca9fdaf19e61fb80fda22c55b05ffcadeee99e5967967d3635cbaab35fdabf540fcf72a1f6a89f43defcbcc66ef4957399eba43353962a0853aeff7e093de92e47bdd8c43a592a6c47e318ddb24e2d54b64e7c61c26a14dea86c99da87317c20f3c4142d53a880b1a8980f4b311f9874136058f8efbd4a1292d3adac42e23f7c310148901fb238162c1eab20512d880a4610e86101e2c9bb54e89e16fc13aa8c71e197d03e118805b7e3a615b0172c3bddd3e1f88046467e39e5c31aa57cf092109b3132ba43ab1bdf870c6937ae707b8890026e33cffb21e9ea1e38847f48feb8801008420ab88f0145b739e69d97e2d1f9a778bcf7ce5f8ee0c627220109884c22b4e8c6232ef30ee5bafea0c975feec3e9cc3f9d191e072ff3f9779a7ebe7fe1ffde37d7f0e14a61b37e6d80f31dcb8c56bdf1968d0bc34bcc31f195074c46d23dee1362a725f9644651b03aea995b522bfc131284a31285a623a78b1c1f9f1deff75123ae420e6f20a01f13574aea8dfd3c2df2b7a6f0704dc5d7b5b7c87cf1b1a61a05676ce4688c80de237a0374721a43c381a9453024e88c8ed239be80f46f98ec3a3dfdfb9f841fe505ef9d3af4b65bb84ad364d2714551bcb458808bf0c546e77e8d01dfa6b5b7def5b08b7be7b039ec0f2af5e3e53e4e2c617dabcf6289baf9a66f336a1f95d8a7bdfaa57ed00623923f6ab4cf1107a696ebfd04b73e3737d9baff9fad566abe91aee996e90d003b19cfd234540963b72f32aeee9ff74083f5cb772df2fbf597db675454997724253565c12fbf627f7d7c84b037405beb55b10d7f1c87d01d2c4f5cf9eecfb07711f95b5af3a625b47f88fd8f757c17d546eab514de2ef0f99046f66123afe72df3b973dd9feee1fba3fe4d6797fc4e16bce72add66be7b2e3ca792806e2160997bbedb20796d502726790907f071b6e42fe9de43aeaa91dda6b5f5fe33e4ad4c34d680a8a4b423fa3f4b3fe2394234241d9610827371c110324a03f72c4bacefb23946b118945b1e30edf3773d594c04a8fa73e4fed50a56ad7efeaf7e651cc2ffadec5a9dff747df9baf371ba71e50a482a42262a040892b526401c4ac73f37463719d76e9df6c1dbca8ff71a2bbe2589b10ede2d8bc8ab3d6614bd9d786b335d46c945ff5b9fe7b48ffbdea7bca07acaf5ed47325ba2f0999456f9e6462f74912ff888cf25d87be2c7fcb7d92d03f329f4e2e09053a22d9752217aff447eed97579e3a7d25cf53d96acf458b2d263c94abff8c2a6ca2e1d337667f46d4d297df5eb31c570fd1f5327b90f07dcdbcbf5273e6a71fddba9b8feaf7b32b8fe9064476c7f2744bbb45f6e996212180c53d098e007295a18f962028f4265844d3459bafe3b59cde558132665fa5d5d00f77e47a13fc85fafeee72a62df8fe059da77524a4e8846bf6d18f5e80bf09e79fb611e1d47f6e5a201f0a721d41eb0c492ebba1c5382caad3672c2a0d8452efee35caac2e025ba78b1405421b0ce566eced4a7b22ccbb823daa73a2037725aad5c92ec8fa05059f6a80c95a1b2f8831248b1332a2c2a34aa2455920a8d0a8d0a8b2a29a68492950cd50319acbfeb8aed4a78edb40ef80d889fd2ba1cdbea97bf175e1aa3b729aa4f6dbed51e7f2d6c80e5341abfc6999ce9a98c8f61a4a48994a42d5e9ac47cd13d1d8f54dbd195947be91eface5ded612cc6b118939b7a2df5c397b88ec5b9977ef94c5930b673a5ec616ac7901e3cbfc7bbf46db6be33b5a386631ea1d3fe3d09aef65e3ec5f952f76247b71fe5c3de27f4509b7b49554ee8ddf8a8cdbdf0e317630d25c1a51ce7ded42f8faa26ac52f72c758f97b8846e5165e119bcd139aa7cb0f1fdc23ba5e45ae80bdf8968b57680c1ba7d07a8da41870e2a208c9123a203e80a7401665bffaed70e95f4b97f3d4b69a094d21a9c7129d74d8ebef724e5e27f7bcd8942cd4963a09452fa96e9d26f557129d70981bde45a2cfbaf772181040aaaca49163bc2ca555d8e7151ba9c4ac1fc3739cbead7abd9123b8209c909815d150a544e624854b9a8cb312490926a97a4abb4a47a623986c4925817252431a52fd9738d3e22120a94b96f53b2b83d6486b0077a5f4f93a60fc03132a4f499636448695cc22e26c625a96138c060aa26ad160ca6baa1b94879efbdf7ded3b830e122c3b536b01c2be2728c4b92db51fe8e713172cb70627180bf5b70fb6d6bb99de6a45a271b2fc78ad0c2354c0284f045b85d0c4a51ece0775903788b1b79a31f37b8452c66802867c44e2ce9b22bc2ad8f53146027960089703b0aa79d2af46e03d1a47dfcfe0e7a9ff590c73c429c467b14aa722068dda1966b5bb669d9d71ab58c99a728fb015f7b4ef9c85eab9f6dda7bea07fdf7afb9c73c2f4d0bf40a391aa3a1275f97a9dc3e36df51547dd7eb155dd4967aba15dd5aabb6e1d0cf3ef5d5a6c8edb4e6af81e14855f955d65af4b26c1322ba427e2b100dc2f9313ffeacffd3b366fe9835937ecd501c0ffad9674c177ed0bb71d332140ac505c5efe0b3508442904401fee43af91a97f1cd344e6e369b370ccc243ca0239b87819904f90fe8c7b54d88e8427f9b8d81a0d0f623e382520f3f55834dbdcbd4570ea73efc148753b91ff4e5d347fd0ca274fea093665c27b74e7b9c4c6e3819c7237ea51284fa2a5fdbb4c8a37eadef9f71ef28a05e8bfceebba8d6a85041e25344d1fc6e5f855a6f2c55f045b8bef99d7332734236efe9ceed8895221930b9833bb7a39f1b9f71e77c90e3e4860fd6c8f8effd8fd7b8ddba4375c4f2ff34bfc318a7eac8f247faaae10d7639db2f11ae73a9aa186c0b71391644d36da4cb312b59eeeb720c08323e868c98b95dd1960e04352c71f99f2a06eb445c8eb10087fb942ec7b084b903b81cc362e4a57aa09a10738554b8fc3d506674b842446a6e3734068b1694db0d518152c7dc6e28863104b06288dbb140c510978d8c2e739acb7c8d20b93189eb4534b97f638c8832ee0bbd2d7e7d0fb92ea64509fe38dc707ec4246effdb82de772dd0f04fa1f03f8a5aa0b174fd3b2671fb4707b5bfa778bc8f911baab708a53bd4d7b9aebf85f7d7b7bf43f5f217c5d7613cff6ac3b56ff49b3afdde1eedaf4fff7d8f89faba75a80fcabed66f4dd3fea7bbce9a6f1c1fa84b39219b9a28b37eec31930c9f8435fd3f2e9f3e3ce33ecdb691156cde880d5111900ddd86c0aed0bb2d0c75ed1dbc6b7463322e0c6a4654a0214d9a3469806cbe522a6b845e1a9be707bd26b5f153aa474dfc8e3e3faccfa91eef2b7db466abd9188c5b5babd9f806b7ba56b3f118b746ad66d3be37bf36db1133b1306f0b7d373064a65447acf69c521d598d9faef695a3bf07fbbd19801aed37d8ada8adb5d4bb5fd46ba97747fd90ecfaa25edb86f80fc91f17b82d04028a5327a0fea7df734b8ebb906b1179455aa3a8a452a9544afbfaa9542a957a76a5ced45a6bfd1bd64cadb5d667572523cbb22cfb1bd64c966559f6eccac09873ce293ffe9c737ac1dddddc1d9927c277ceb1a39f728e1e7c5d959999d9c67d631e1b8d796cfe86b581adf9d46b5fdfdac0a2e65b1b58f93636af718ef7369fe21c7c6dfe6d2e1b2ec8ba8d0ff952ceef7ff47d3e7d76673a5b7857d2a7dcdfc905d18f93739f52bebbbbbb10d1f7b735c3f6db6c38fe1b8e7f6f73f6744a57f0a1c275e79877e8ff34a51fe44ffd870c6957480177485e7f5fa155b894ee38f77cdbdecf8756bef982da15f2e0a514ea23f2664a749f9017c18e684ea199264d9a33f7f97d5cf7baad726a07fd16ec15028d8adcae5f689e2992e6b64083e0fb4bad9beb17a2472f14b9435a989785a2fbe4dc3a7ef9cc0df5457142efcc85cfe1f878a91ddd7bf9beb5d017f24ebf94cf80a223eee31d06fca3bd75d0bb7be367a148c8a5905f1804af3f17c4df1cd328fdca009a6abfb05dc3b11eb4dc0ede7e0c7ca1e5a0c2ee91dafb77455f1fb5758f07eabd3e66f7cdf95d6d7be681411ff4f9e9b772fac59fd9bc5b39b583a5cafed6825b87828ec3c36ff619f7ccc3282e887e9612a2577ec62dbb03ebdf6f0b199d1fe594304619611777973fe79c51a5e305a14fd83d90a77c1865740823f4214c78ef41789b5542fa65fbd5fdb03ff2505f08add6f585ffb8e7fc9e7b6c87ceacea1e0ba0a0024593d6d3165904a5a4aa57bf6cbf607f4f11ed177c2914e467436d37b8bdb77239d67474ede558145f6e654b03cbb1289e5c8e4531c6ed5ab1289ea815f57d4349515a8d851266f554465603f305982cee7b4bdf7bed3594440d4208a3b4c103d5e69c9366355a5035140a85aa1a0a4c2a954ad5d8482a549ab5d6aa56ab2c58dacdcdcd0d8b464d1836b41a356ad4b0d1624a7343f3c0030f3cb881a3329293daf15ecee7e47c90aa00d07c7bac189833b1279880a0bd4dcba1f2f74d18594861d4c4448ccd142ff4402d0f5e54414a810cc2b822072898c4cc393d30813f21c5152994e841abc186144ba478d24316af025c8e81a9726b5c8e8161523987bcfc912dab95f3aee71c7ef9675b8b5ffe7463f1cb7fca4d637eb97bdfd7e3735aacc70911bd6ebacfbb7f16606d564ff59e4d64a457847950b748e600e6e987b74a4d84370009b0ec1582089c63b2b531c1841baad54fad262cc084d58d79e34623f11ed550df1a1f36a156a2ab7a1c38fad5366034be7b7dcbbfa3adef347fc83972de3f720e9c1b3aae3fac8377f5d5371c52ace3c8d9de11f3f4e36cefc8f6607823f47bd0dfda1e101b5cf7aac1d1e0589cdce2e6c6889318f65140113c30096106962e4400f5bf32ec83002331a2b07225055ac200f5ff2ca07b1ed2ea7f7cb5a53e6eaa6da86fa5aea38a62f976cd3362626202c232b29e82c64c2a32b6bdf48be931bdf7b624e9228b145c18a560067c06cb16288c809881490b8781022b44d040850c1839b0172b4f189d01028cd111af1fb74612b9724378c02b4474ebfb80b7725390bc51100e48d323f398de7befb1d24ff744186e900327665470a60b194527b0210645bc3062424a4a810632bed081872ca29891001ac28841c5891562740142ead77b4b966d18758f898190dceee1707bdeca3fed1ff8d3edf108fe7373e6719e9883038deba9eb461f709c42bf9e17ee29f5abff068d4da13b1890a7db4830e8ec53b4040c1a82f8618905606c01d4ff90b08f560323726003273a90220650ff5bc23e45398c99411725535e80a609a0fed7847d34a0431429965802c413470021f5129cc6c90172ebc06f2875e2fb0f16b69cb03101517bdd612abb2ae7e8cb1a7bf4b87920276ddd0d52c83a10049e0be12b7620dcf81a100ec531bd6e04e21146c87534fe7641177e85fcbaa63916f3bcb73ce5ebb12eb41a85b73921a20b617c20fd8aef66a4092a77fde109219e18823b009b0283b5a8b45a2160095302343bc8420c2b9cc9dba119101e1e110426b1807d3a4beb442328007c5cae8d88ebab0a8d756d57ba933aebeeac3b897bf99dd44ded0493601698c4a3e8beec5fd683857d2c8c5d1a0637beb9715bdb2d377ed38dbf71ddebcbfd1b97b49a449fa85f10c975e2bfec6bd2d436ced159a6526ddf7940a69bba76bab19f6e5432533bb89fa91df3b3adb76dd3d249aa278b2a63834b98d0e0686c389c0b5c0697c16570195c0697019f7cd943fd7bbfd349ef81f07073d508a1460dd6795fe3b7cdf935c27b0ac27d1f828dfbdeb5c1f736fa8f07cb977e26297dc87af8b566d192929260cffba0bba9957a89cb9225c124cab920e45836beb7740f545a6ab9d10c4a51412488a46ab2f573fe03980493ba27001f43f8f8f0838f0f21ccf90e4218000821bc594108e1cd0a5208e1e37cd749ac8710d2c89c4cf7701fdfcbb88feb5b0fbb876e0108e16645034a814810a9b5dcacb8f8aecdcfb44eec2ffdf2d24b9d0529fed6480000c0cb5427a982b0ef41f8ae936e7cd7499dd44dedd43d207cfc7e0aa2b23637ff1bd196e43e415c27be13079340e05cc8f9ae933ef88ecbe81668e9a4ced25a6a7e1c001bdf0fb69c8db54d71fd8d8dfbb50d79746eddb7b6ae3564de8e9d86de657127f42bfecd86b3e26e7571d00c08fd3a8a39b1a4aa4245452c0663c4624026c644193126c8a8d034d174b9892f973fa77b9c89180ccca050b9eb2be34fde04cdbc0917c3c494b3f35733d8a7fb5e997ea982b0d396f1320e39fa9e99fef7c52bf3cabc2f9e196824bd54559818134db41feab32ccbb2eeb49b24b9a5c3e10e2abbbaa774fb7df3c7548a436fafe15f0148bf20131a2cfd0abcf7eeefce3388730f8129f4ab8100494185157a95c4a66652f7d02c5bbae75d46a910c475fae1fbcc858baa99f6ae734417c5a9d0af06a2ca62bbb7a4e325ee0373afb0254bde8da91d38fc9fc3ee8efa3935d8f7d9e380d1cbba2a26db51f97c21eb4a58099761b0a46281e5e75bbb2e51d9d53cf9467fbf3c65c2bb3da77623c7067b53999c3b10beef87f2082a9c9adc6ad3c1db09d1aef69e9444aedf17e1bf0dc91be1bdc38730c8e2a5894325fd7ab05fb3d73c0797a8be74e5a60184af32633b9b0b1f4277b7e11cfe33cea91ac3767fe7fcdfe99ef9ba33fe9cf3638c314ad819af8c08c1c408990c6b592d77f77785189605638c483c293bb5436503dbb5ae6c754f47735cdd23e56bf279cbb161cef7e6935350091feaa50c9a3f391c1fb3b94829a594524a699665b0236acc89af9281edfe5d0c736cb0ddfd64e005c91dc0130ebedc9dcbb125902e0fd7c10c2c0815720d220086750b5476c18e66d8cede18bf655991045575e60601a83df8720fd517f63d935059d7fdd977d0d1095476714a95031bcd75fdef9d8b5347a76e7777f7e6ee6e0ee2b1333fa646e69c73ce3979b253c74ef479eb74dca6bc62c2a2be632fb4e976d0041e1086caae0ea6fddce6967ad6138bfa4ca3a9ede53a3d67cdb953fb7e8dd32ea5b03662d584955b0fc975bc828118fe71ca293d321508ec6d4260f703b0cb5cd07c3a37fa75eb5cb77ec7ba35e7d66f758fea6bad5f9feae6595bf797f53fceda54ff8488ee4ac8efea39b563c5e9e85709db3685460da76dae7e3573f70cbbcccdfff16afbc57cd35007ef75bb4318e30e6dae92b0cc75acfb564858e6e42a06963fd67434d59a57888a19478eb9a6b473e1f24391017bada6984f7a106fe70edd2191c3875b4ebf5ce6cc0ab894e453e1bbb498877f05ebc41074879452bad12a8646a54fe8d76331f711ad30f4ba270881ddeea6b7e4df0dd909078b6131b7b9a0c7799605ac96ec7b66bab4a3847d9ff3f005574bd8f72e84972ee45660ecfbd514f0692f552d073671ecd0de6c5036df42443e16a0f4f2c1d1296d633db1aaf76fd5aa7aac27d6c28030cffb6853ed50642c1d97ff877304619ef7fcc2b1d3da47d4a3b8276c672db7001b13baa7510ff3d48efa4d3921aea69a97cab8aab19ed854c6d1e93eacd6f1b96ab2ddebfa6ba77bb4771ddd433f7bd4672dadbe6b9c101d175551dc7b2f7df86cc74bab7d4c709dc8e26227d10b2c0b8bed5e93d7a471faf94ef16f6dac2736be09415651d88ec5c4cf008be99e467d77425ef79dd03d53e33a6eda31b921f8b2304f4435613db1dd6bd26405855d6128768f94eee98434e91ef89074e0f889f409e1a5fbeedce065758edd894a73c9ff300feb803042187154c075e1af62ae1b637cb972565fecfbf88fa58c52c6a90407bd3dbeecf862b73fc9f055115d4af6c8ccdf9292fb15592e257bf9fe6f4a0aa52c61674e39a784afafab29e47c73328fece07d4eb5cbcf3df8e29853ce296d0588987784b82e7309acc7753a7660cf4f888ecbadf61936562b52bad98ffcbe84cb382e7752722ca480071b32f3348e4b5f6ce278ce3923437e679614760afb1eaea4b0ef5f17553e861d3b4618237ce66115565dec8b1d5bca28655c85b10f6ea9ecbab1e2623b5813217a40f189aef813996580e0bfa7fc54efe9fd6957ceabff6d5abf2acac4c85c8971e114e3824a19295e3459bd4029e6059258174cb12e90625c9411eb22c969d062062d6a208343eb995acb6ae5b8fb844cbcc08119d3b6fc7574c69091a141153a65849cc5c828a9ad31ee6a4c96bfdd0fa3a4b4774ad0e1629df7d49ba32f4869e43807b20e34e2995acb6ae5cc396592314d55886859d6164fdccebe94d510373f14dde0f46402272a90e1cc5317639a8c0182aa54506484114963aa487af201072eb4f8428b33aaa86ec0d142092dc25499363850325a206921446c0b2b97c6e5d81638c086ab2bd6ddbd8b96154a5b2d206afa8417c224e184c30c52b6900018679cd144122ec04109286360b6f5ef7aedbc76fea519e9d2c475aea39c10d87577779fa2c4b44515314c6262a0cc16cbba5e3b36b6b821db020568ae8dcbb1315e28b567614411131fc2c82283334986c8a2c5ed2c11628eb270b222225b0de1ee938526468e780063c50559b89855951511730c178f95c0c10633a05481060c14cf2236a68bd8982b8a54ee9ecee1757777f7d7d3cd0780ddeffa0fe61c0a701e7ef8010673ffe1060d288d9f8269ce39a7fd2b9498a64d9a73ce59c383ca4876c50c5740b1a9014a0aea8a234a69a538b8a248ea68f5f4748339e79c329440881c928cb132440eb660e1943d81a91186e660b583ad024409ae60e2454c105796fc8aa71b9e7aa094521a9520a9c1911c921879b2e4e5e9e9e829899c569461059a550aa2d070921ae2512bca54b183150fd275bbc909715d8a859524403e10e8cdd9512caabc60556099aea2d8168d6151c3d52ec7b038725b4f286db55c2b1d2074b960ab1c6030368388a72d846042081e746045f70456513a0b63059a277600a2092e69aa70e2040673274e9c3c485737549144c5d20a055388eb528e5738587b3956050d2837277771a7115cdd10abe2cb959763552871bb8731bd950d304819ab42695503102e2610ba5cadd5095a2d97cb5d76b7775c2d51a2448994981392550c2a215631a856b092a10458e35b90ee93dbd10ba917b775eefbf79c985ac13eb075fa7b0bfad4af76ea573f314eb75915847d3cfec21aa32f2b252b25427e790671f3156af066eb9e20edebd601791ae5565f81dc9b340fc8cda40cf4f9c29509e00b3b6aa8dcab2357906261965c8e4d212536850daa2b5647de7bef69f057472c3217c7851f61cff05c7b3b544fd876f62d10f213f6fb5be060b8c0ca0d2f78018b247a007232a272738b9b47e5767715e0a434f244193d096bed9c54b395fe964bdfcba532db38964392173b1fc27e41db2f9863ad34c3aa80f4cb66199def071a8f323a84d199acd06ab5b846f5d32f1b9fd2183b4ed930c20683fa87cab24cebec49335035d4dddefcb4c0996533b3519dd02feb107aca474a4e19cf70774a5922a852e8d7e50c85ca340a1f84ee31cc1863cc2095199c524e49bbbe682207236c772859e0eed3a50c7243caeeb8598f323a8411ba749293811e9c653426a34ba8aa40bf2a0ae6d860a194d9cf39e77c140a6667607f741507fa559fb6583246eb1f1dfa908fe2206dfabc36840e23bc92094238a16a01fdf21823e578a8ef7cf39f261f8452c6ad280b9e1fa8140e16553d0a15110900004110004315002020140a87440291482c188a829c7d14800d83943e6e50174843510ec3300882188841d010038061801042c8d4d4500d0080195ed4afe4da4a03f092092bf769ae1ff50afdd46eef9e7d4c2b31335082c819550e9161f34460f310519efc4f1fd5515bce842cc9d2637c910ad10d06528b9c89ae77ac714a60db14808b50d2d00f7c4c05a698441e92352114363391e71f175f06e8aced441c58c90ad231fcb30248e17c6dca3ba70b64c325a5845a4711260859a33477e1b57ae04bb04b8c0eae36bf8082fb0f266d17c26832c079034546cf5b872ee796c61dd5be801ebfc626da9b2a895d6ca822ea63c02a6d7d8e74622978d604be5fda5b615ad46d707de6c4cfa19d574cfd69508f3f09fa04e0d5cf19b94ae39eb710ae82190190af2aaf34f8941cfae73db8b82698fda9e8133c79f6b9dcae8bdaa0c5b6e93c19ddb9b44cfefedd42afb6c9006e550701aea56770687ac22df1cac7f0cd1b21d85bcfce0791245ff9788ca70e12881a8f226e3c7db9accc3aac4a8d8db7a3c4df0b3d564c0e207142f543eccbe2534c4fbb9d2d4c40301f29572ace32347998a1c4afba1612e07d83b37a3188a770cab200acb261059f0e8c6731f3803d1356c2d2d51e88798d23d4755c1a905b7621b8dba7e3b0ee34346fb8770c4c74377cf9171c1529ef5fa2631b31b3a1a2ad9ca336239f585a555427b4efbd760fb7c33c6c7959b436e212093ca351ff176be7352b9b7230df77346950a5fa794d744b4160841447f2b704def344e9e2557d786bbd16122d870482c8c3ccfbe3392b9879bc8146489d1d7aec675966cef82549516976b5d9fa395122af503ede906027e1052b67e0244bf8c5c879431eee3fc911d1071821cb13376228b4975e7cdf5d6f3ded32536b07ea1e11e416609ffda5f2ce11a9e7db32a7aa1a583cc3e8bd15cc51ea3a426866150d4ec3e19304d4b83e11a6546ed238de960a4aca2b40f3e2997d319f2f72c462a476c75a3567cee328d1c050368992dae15ad6262b7e83dde5d3f84b8d471bf30a96b240e4f4e50592ac8838940ddf30371d99014730fa2003560a65809682ccf05220332ca5f818499471b6af9fab97e950f6ec923ce11ec4ae98d3fbd2be5e40a931682cd133ef5459e113b6b3489c5fc1272c66c1351a374ec6ece96f5e2c2cce4ed4e776836b552c88a73cc72a3f9494d88be1a72008a94c901a7281869f231ee054ec619021674cdbe8287e3609491a19fb38c3227b9b983447f652be1c532c7280ace4a40c17c6826f55503a6426614bd4975403ea50b041164ccc823968c0311f307f5301683b520f24da64dabe2c3bf6df3ce91a07dd62423e80ad0d195cd2ee19ed0e2813c6f7c6020fe240cd08fe217a231d22827d234f4aefc1581a17d69cf56650a8490843453cb2e26698e6104820a1be2c9c2acbe1b21fee3b161e89e18e2614bdf393280650f5084f9ea0df88efdd45e0e0870b6e1a6f510bdce9d776724acb0d57d64281a22d61bde369b48bdd337315056e79c225c20ab80aa04007fc222d156316dce86c80b4267f60e92a0f12c3208dd017c3ec282bd81e73b940ef30b3eb6320fd8eb8bf5df70e59dcf2c207054aa1329e2422b4de2bb46cf991fba006cdf223aba1403f27f751de81011bd9ee33d62ee04bf8450c0d6729b7433a99606ffe53af02a477a74fade1169ce17501a3305fca1afeaf2d024cfafb821433ac8c27d920199ce0b25081521a173b02716ef05411006111d3c8d9a9846069b538e0ce67c16bcff75ce7e239fedecc21361c023498e75760c209d850ac3c7df9895d3c957b523c6c99419307a6d9d59aeece7777b4d6c9551bd72632bda81176b1cb0a320bd05c5ac48ca46d7a5097726cdba065f00f66bb986dee8d2d0a1164005eba04a09d10e7555b2a29b40f51d6e3436e55f5e78cb870618e5b5a688e77915d41c8d344f769fb764044d0a20f03647b1713fe5015ea44d67ead31de76d47e8ffb5e31163839a7931b062db3e8bb55b365bcd373738f5ed855d4686c386e29dc495df44de33569ead0f92644941b6ffd7a662dd7f2648fd66a73cadf2ea138e75574ce2478af3d8ebf7ae3be8b345f3fb2b59aa2cfd1be98f4ea54994184f06773e9ca554efcad878993a14375a97c304ceed15ae3c785ed6242041bdbf1f285973930941ea976fe6665f296aac2de81b092a37125fb8d7f74cc18e3bcce50663376367d12d601969c3b858d8911319731ad174b9fe9eeb0058dd885eda3cf966408f60e7800c046450b9b5f4b9e6f30bc4e95565281adddf4423d6bedab2d929fedb0f0a239c21c416d8bb9e9fd5ce20e5ff4e839c7afec53d7761963d29ec4bcaa29f163811f288fabf0d6b5f04fe4ec45938a77e2e024e367485464a3fd6ff986f41c913b666e32fc0ee087faf8fa8ffa9aac648bf9229088f5b7e4c3815f26de9621947f887d65e5de0b5a5f30e037e0ceb261aacfffa95f055b9a0953e2a13267373b55d6403093a69139b55e241db8c7caf69283d9e5c6b4bae920af3587e467b7431407c7001af2b63b7bae838938cb455ae6f877dfe3e508f7b8468fa1410d11ad9b5a08255501d9aa483d77754ac2d829ce2d4e889df5d749d02aae65eee9cbbb96385523a9d85c74ef30d3a3c1a6e75d26845797a32b39281a6e65ed0cb4006e14383da0e8929b0e2da76423061468b0c45a38cfc21707754a632ae082204ef61f4da1a1c800c4cd4fab255b549423cb4ce2e7dc1b05e3f08da45aaf85eddd6cf64c7acc4cec0de33ba3a3d703d6625f2a99bba402eeedb03dffbb70c89e2261eda72aaa49fd58637f457b897284ad35b9249ddd955966422e8bd6d42e9f39c2e543c3a1644e5df0223bf14673474c9a424c6f440fd32ad19452a3b40dd5576a57873e639b6e37573184f5487fb32a1f417155b6d4b07325524cea164757b08e4370ac8de18a90da921105b9bca3e5543ae0f8f17668553a0f6778739a3790df73aa6ece29984ba17757306a9f64a090b300253c15850ac2ba8513176a2af404609be34d1acc7ecd1e3a76c23d0d50e55935c3363eeb73469375acb61e027881af13b91e57163578bf8a92fe5cd6418f8c9aa5a0983c376b6ed17cf947423068cd596a24b2de56948d3ab3694c5c92c3f680e73f882358888c93ef10c2fa14e2e295c1ac89130494a3322a34cef010c808d1f8d387f9d50039260bed10fc0b9d8e243424bdb5b18c1e0fce31c82f4c731e35cf6954f4964a12a55a0c48327fa2241dfa03eea9721797f5f0362c16c65cc0b53d149a1e27ef570927e92dc06abe704cafbd610c1d892481b831b8a6391fe76c24120561ec82531a02ec1856515d46f7c51f3f7b4ee84cc67398a6bc35e580216243d8b6908ba993df2632939c782a5964b51e51b9c0c01fc3120e125042232254a62d2c1cd9793361eb2f3fc38cb8061c6232e2119603fa2f62e38305674fbc7b25bb7fd180d4c1e20cb84a349705f976d7abea836a8b7292f75ddaa60785331b216a9ba7e95f9097a1ebbf182d374447634e262986f75c55265642af6417e58c0ca9aa4105fe0ac9f5815a402b0074aa94ac018e88a3234ffd100fff70f99e0e87e32a294f27a5f6c3e1896f198349241aa2178a4dc2dc6f95a3edefb43fed89027c8c46c79b38c93a13cb4a1446f82a68a32eee97132118ff81e7cd13a34e4216aecc6979c1052974499860c7b9df242946660a83a40bf4a6d94b4b318f9c050b5e688340ca5ae2507cbd9ee95599d9c558715516c67c858f1d124fdf8dfa0fd3987bed62f6764f080d27b1488439e7913e7873bc856271cbc6f18ab89fcb905b980031908285875e77ef97043707f110f15c581642583c04d53f2fc870104e6e0f458dc87f8a436f80c294647a9acc1995086d61fe34641d744f6270a9747f51c9f5ad81e4e0a9655102f488a310eb13dc6fe93379459e8b33b9c75f993a658e7f8dc91a429a5a0c38f119efefebb49cbdf8601a57ab385ecfa0e68863979172d19ce8010073202b141825051db3a93dde545f0c8b49aefbf13e410c7c45329883268b8719e3337dbc4f646984454b22985910255ec55a1bc446f0b352c48194d6d57260f84080151ca834ed8e256deb8da97ef721299521766ac6e636a6e2d6a2b13401f34c70df4d2acbf5099e25cd1036d12150f4e5b2b9cc01a9f8a2a7652c126e57b598e3f08c1893574d587b8602dcec4e110c657c50b1530384ac91560e68b5b54cb276795a83737b00a70cf4aa30a2b49eb390eb1e187e44113f6de245383b9a6971f913f89ed909b31973c34aee6115d973848372579e5cce6e6f60685d7ab95bcaeea4aeb25b6d8c64746146b4bc94bfd1e397c6d6afc34cb4d986a0ba0e441f79ba7ddab19d7ab02b0e7f542cc410077c06bedcf4a851ad21763b4b934683bde7db65d78dd00096cb19cc4eb505c0ec8add4142397a55f1987988bfb3217793ccb2b9c0fa72447e87a2ab2ca6dc71ae6f678401873b91926cd66507559daee5f81c7fca9ca31db25444175928844b32554f450ff1fd5382ba6bd97613a7ab8c51fa6dd73310c0e4277bdd054154b3f5986cef1c17916eff97aaf101daa30f498ae98622f327b6d168d15cb6ad0aa558ab2e293717871f07ed0d0632d6d7b40036bdb7a9f5770849e35c73bc0d2f3d6242984ccefdd8fb00705b817b39438f1915f5de8308a1fd72142891f2f24fc02a52917c1353083c8344087b872fe14c4728620a6abc089cb883ecb803e8a62fbaf49ce48226d613c9d91354e17cbd1daa40cf7aa6f9f5e4dd50895f8138bc88a35f311c6ae368abcca48fb339eeaf66e108d0f1aaf523845ee1e9e42435250454acbc7ff73c4d8ada0a5483f4716e99229f9bcaf4d0e9711980aa0ac5ef5deaf433793a31a807f39d24d67ac0c986699a22506c2a8791941be3bbc49be1a5c25546c5396a8f71dcd24e2542e37dde32ac30606009cffede0ecb80d5e066ed34c376c238669697b2c3ad70e31b9b64e9e7db3d9e77c2daaf71488dca408352e16a95c2e001b0cb2e39ef6717a0eee1e931dee92b502a17408f0a1c10a42ead7a680c579869889dea1b6d4cf31586f81f322cf15b1b60e2e14276e5abae4b3f0492bcff1125337402d3d06e4604ead68e4dc365f480cbf595dd2e976ee133d7038df6dffe402335905db9f3b558c8e97b3610427921b091e831295ae947776f334c895b9be4520b898c37903293e569ad7eee3509619709a07d76bcc77c9f7cdf77d1a98a5b5c4fc78d5ae16372c90880b168b0a2254108c984aa919ec48ee308b7a22f0beeefb2d2769495d7c3c71dacc6bdcfeff5d9805be51744ddba4854a23acdb0339fc3ef5698a844aedf2113eb7107c858dabd385f31dcef811ad5eebe230c054917e20b99cf899fcb509c280ddb8c66385c21de9c41457eef83f31eee10c5b36d2589c39beb814c716a339d767499af372880ab5499190333143226f97dfd3fbb33f8be8f2ea21f3f2e2105dbdea14668256092e301893f045ccfb8c81251ad3b418418920a087fb72fb01824d50d469ca8c7a0490f5a6fbee77342dac74585910dcddd17da4741ff44f81db7a329b818dd112b72a8f3116291aae8629890f63988be654ab15881830157a903031ab2172b96ba66c1fe61c6bd8f0025b4f84eb801ff0be3116460decfc343176a61d4d9a572ac1e7a5c4b03b1eb7477e39abf3cd62b1744eccbd9ba817c6d9754ba7d788081251f2b7025b5afc4f53e38d4bd8025aa28e8f0a41aa43c06b8249c487139f503b2971ba499e9ab4e7694c6291189850a52f103e35af58b086840c9eeff494022e2870907a9ab1a8f0f0ef900421f3a459f645a40a6dc574e11e631032b4ce38d06255c6d81a7e1aee92f03fa2b435a59097bc80a1668f24300660f615449675377490f76645a366092136fc0d28fce62f8b03a06821f7b467c5ce0e48d5b19d48cbf12167bbf8d23937a4a4ac94f1d16d2b6188ba9453b5d391fd81a81b461bc78e320cb83795f52c9b2f3e7e786310f46cead5e5d122f2050e06027dabc11345e5ff653e36d92518dc61bbc20b480efadfa7defe9e43ab15a11a6364ff87f46b18aed59a3e7408776ff9fe89c74d028029de855821f14b0996ab5c08f45f903ad778784b1670d155d387a716bc6ebb173d8e9831af576116c7df5c615de3cb4e2a6186f4216cc0c4d19266bf83d31c16eafcec7240b901507351ebfeacd3268dd728758376126d536069dd1851783ca0735dbd70629f86ca7ed5fcf41c2859fd265003407beac89a614bb932bbb8d278c006a29d3330697c70e5d15c692e1d04fb3e20acb8599b4c1c2d26b5ac4b00c672fa53fb1724f7ed0eb3b9033409c4460f4cbca99b53eb97f4a1419eeadd1dd80400c290933e153b2d507b2c41761eee5d4600bb0578d034a41ead726375f017a67a7b97017f861dc24510241eb7ce34bb10c347373c4c60eff59c6431e22b1aeca01c4f603672e452982060e8fcb58293095c8414cd55bb0a7d76ca9319f9688dbb206c83e9f0057518f4dc1e18f3e8affb998fe153cf5128c1d518f8e8b6455b0078dcbdb81b1bc41087465ce892ea447c1a1c30accfabc4e8a4db2d61503d63eeba97854127dde08ac0f8a82d07cbd52f4b0375a5c62f4946320d2ebf0942a875e9b7747b09a6226205672770723ce7e876d0fd5f6a19d86192a73afa13b283e3b8034aca04f64636436d0dfbff4d4f04ec7529fecfdcb6fe731b3bd4832a33690e8c7a4d5a941ec60a587ac5b4213f87e4826f317c4cda49b4be82032ed343b4672ed7896091e108b0651005451d08b8150006261d08a28a8af00f4a2b056f75b4886729db37a75508a412c02bd00904541150649318805a01700bd2088e204e22f0662915bdbfd055ce18a807e611599c4497796c3eeca0dc1af29ec18c9b5f30c1378402c0ca2081005412f02a51888851bc45b009aa2b0b6fb055df38a453b58a3b1e89cfde88af712798bcdd9d7cc14eef211322240304f1e254c2c58a7702b45e3bd5d40ad378c08713a9bc2b554503fb8b8741b5d9076732a70f499e50a57348a4a0ae74a329bc21d4e3c3b4d5708e7768334e7001d9f6ebc9d7453e377ebd57d331135852b34c2d914ce4dd1727c49df0b5585f66e3a85fb884310a3e4e3dbe267c6b7804622fa7ee6f816ddc529436e4de610f2cc2c018900a131b2ebd951645b331ac3131915fe08332b4a16691e01c6915450ba56e6a02babb6703153e8867d912ebc9c5a056e0025e0944cd433e02a42ce1ff3dc4ef0749804982e0285dc819c08432d8170b425b8b159728e955fbe7cb786b21605b50426957912f1affe21ab75d729b622a6f627283a66140f93e3ea3effefc005450ffcde2deec22a8036a668087d9640634ea4838084bc58ffcc02c6230d1bcff231c8b2b0b0fef854bbc179e6fdd0db7cb545889ab276325a5dc8363a5726fdba36817dab7993c17d76b8fd8e43606c4ea7e58ac7fe38a391501eec578d772ca7461c06954157de748d9bd46373c559d562fc1da884c2c109cdc5e38ab343b760d5e43a139430fd27c6adf73ee29045893dec1b93f4f805157abf95542fd436312f786088a257d8b79ee9d7c6db51c42b58abf01911adf3b9f7405587365abeab384b77ea44f3e4c5adb1eaa47039ec29e2b2a098cd2ab0b82f547669799c6578f642ca2586062b4e46bd1f67f4bb707efe5fd9b6789dbc1de4d93f0f32e053ded3e7934b9433cf13df18807b28393171df08fd3eb140232470790a6ff8193e85bcb535a2ba91a1173cd11258102395af697fa2702b8302dce64837ce45e6e7f0b40c2fa0dd2d73788173987ab5929d3f01ea172a37b9548a7ef4cdffc06e31a7f62510e44149e851199e21d7dd6d1cdaa9960f10057a4eddd00748bd4eb133e4cb0cbafc09aaf19607e4e647018618b9fde285388ad00387cefd755bfedb59069da6a02f22566c07146fa5159be7d803c50aac0ed969740278c1e16a641af796b35c20f3696d59aae6456245afc5e5d46de8fc7749007889ed7120fbcc501e877ad1c206c1a31d1ea9dca09201d91f6b150fad6dc0e823b6fcaa8beb58a0cad85be4a11364016354366f06485f4c612871e01129f4be22d69457c3980a425a2f4b4b669b7a45bf34a39dee6d9d373a7a32920e31d01f227eba41b2ef11cab972ecd7e0c80cc3f1a1d44adc5571b426ff10f91b60880451513dc24b9cd4ad59aeba396e95f6ad6424fe4fc95e308f15c8f2db02bb8f48f5da883c86a891a98f8a5f4f6b7662d48e499e7f4c08480d1f54f1b341009a74259dfb3c29063f705411cc491c04ea345d550dffba34fc2957f4d4033a119ca58a83a105555631814972e29cdfd6692b59ecf2c1a02d8869b5b552466f92e5fb79933eb12519be18de5e53c06ff307e7690bc51be4af78c8c196f03e11a4b87752bcdcd9eea4f8b93ad60c97560afae286373d53c247aec6ac66ed618a795498241c05aaf3aef75850b356a15a287586b3f748588ce7f2bdf364e194ef451e8cc8808adc217407acee44a789bb3a3bd02848a05c0154296276903b004e118efdcb4a6c7b9f499a84f70b7d07087f90d3b47cec701d70c0c269d4e99585dace639fe78418c3e16cb891a08b801fa599e31227342a76d9779a2921c835b79d492e8da4c6a06528ecc05c2375fba700317919461b99101815a1df9004b3367c87d9b6055b286d8904098816fbb86184424de9ea6bb2649d30bac5d35e657c7b9c578d7cc0b14456a758595812678aa5e28bfcd1e1c3ef124a7612f4f7d577cc3060e63ff229ac4d16da7515f6aa0a261308fc605030f919e1f205c68ab232b8020ec3cc68a3b03abf22c71fc8d458d748e0404e356e97c64d0ccac43b4361e3234778fc88c75704ad7fe449cb2ccfe41ebfeb7cb4a7737dcaef76510028696001c5541d5a70bbc77eff502e79216b96416379e868cc611575218da9ccde44b4a04a8a0693e4d86f4a5906aa4b05e015a75c56147fed8859ea988053894a48d5b142b68b30ed164cc06c0d6f4471529a562e5477895349259517d8910e197560cf2498ca22ede31726017c6f1fdda9446f5b06fd7d2e4f9703e2590b39415f1c19ecac7eb1c2af8e8cdf29a9268c1122ff548ff0b0ce29d98963c14e208764012a2362bacfe581f28f9499abf31f741823ec6cc8715142d618f92402cbb1a0fad8de7016b5177dc22f7bfd437a4513d2d41d3a0c35e64a2016730c8c7eb8619f9d95701f98a6567395af1584071b1095210012d851b7def47beec77186343f07e706f4c812fecc31583a3ad2b54cd8371a7108cccb5e7c7c99088685770851835a8090a0cd55c1dc9b909b390d2e81870a1d9ef1bcf3c29f41a3f7aea7975cd17305335c50324bf6daac80021d98c95243658548b0cb112842123e6c23c8df29129c9d8457dc2a9192c5e31c06a41005e1deecd23ba2b2cf70bd99b60665c456de1640f5081410fb912b541203bc5c3afa360a1d3d0757909d2d45f505446a048a05ff9909b3ba4dcca33dc0527531a035afbbb29a0a464d7ac89d6848129e8932cb61665a240763b0da762d509084bb703775e0f3f33b03fe1ab9e3379173aa47c0cb4ee98a8b8ffc722fe42c7924f290c7a4839d77b162fee55f014c5ea85699db60500a3a2e5778789214dbed286dff9a77d765c24760e4efe1199c8ec48855e690b5bb67c465f17dcad3cd6a6d17f5c8456f563a41325c1ed5871215b7a4215b258ae22d4ac0bc0275235d85d48e343250cd3b65ffc00aca651e64d43d17f8c03b7349c6db4b9ada7c932da2316ae30020d85b2f1a0a5fcd9bed3bb37ec454ab173b7ef993abc9167d6a58834d8a7d14e3f6ed92a5569b23ba70a5782d72a115c2cbe34f9dcacd513512bff54148f5edc5d220b27a21f89b4693aec375acceabd375b64ed579aabb1dc16d22045241d00e6978e1646d9117405d3eac91b18bb1a651c710ff66652d30c2f5df13c5739bee3cea074e84e579a61288b41992b99bae38b9d1aaf4bcc5c566aaeeb714d58db9a8df94c2eda65ea5f12cb6dd530cbaf5dc6e8aaa1b7ff1b269a5db6d8d4ae75d4c9baee0bc57a8ee198be326158e6f88aaecc06c2727f3a66b720510b99d61b2602bee028fd996c6daa61fcb14328e2bad1379e4c68688b52745ba7ea3f5918e6dd054e7c159b04b84093b912c6f6c1d7ce38032a79b815e054ac0fc106dc59db088e0e55096711a3a48bb78eb9e95e5387870cf2ee07a0bd8fe4dae95081388c942a97dcc60315d7283d282fbaf5024de8e188a590fbe4b4a312d9bc5e16dfd8a706fcd96260069ce79faab46611c08bf82c9cd88eca52b23ba5614797c03f8abdf78c9910508c88183cb393d593308e176a1671075e8759d71e83b746e02e37235d083114a207e5a39a4b853f25bca3caa69946535751c05a338c249195d91a5f93a6ff2dc972a6519f863bd655bdd19f3a31645f80e5b088d68358a9e15633a7c2501a2366c2735232dae0d9e1633d0b6b14f22d8d2ec938c2bea6620129dbb8405c86ee900e75097640061260a72bee6c16bc85afec11959b988ab91f92e4dfeb56b4341aac03d952e38c93f9903e896f9ae0fd454679afb358c3bfa7fd9b654511c633873fdfe9393e6144709d87870afeccad4324ae64c10c77ccb3c42c42b1954532cbc1377cd0947b270b31ce14c4930aff95e7897e9a89e94a38a457f7780ffe4093b5d4c64cfc6ae7eacc1ba52cf3fe2b84e41186bc3939a33833e74e61409614c98a6a16f1df91e5eec5e1f73cffe45d3dd70058ef8705a20802dc6a7bd02631845c1059f5ce80531c8f1ba76394e4738274c9017285eff7b87a7b5e16c284ae9fd33586d9cf1462aa20a14eb077001df92aeb799c9902dda7e4b53ac128b33bcb88137f28643c124bf27e79ed890212a7339a49eff7366fd2e52373d51540f8abe1fe80e09f19f00c94a5edc5b21a448bc3e8280e9f4fa4817b6d07a6db8bbdc65daf82808b101e0aea8c7f340a59dcf8057cb7542997d3b458e8da113d96a34c3d469e5500418507df23ece9a6a2103e2769b31f7401ee94efc7eb9f91f3314722da423b41809d1691ddb4861cf1dd1c2be3bb2a5dfa79666c09060678367bdc20651f0689843ea2395ef4607dc948584a06182b34d1279e3f6d640e174d0885c0a04de1c30786e021890b94bc04eaced3002b0b8c15a039d3203a6e4feefbbe15624244450040d578a9d65595694d00fd559d15484f24aaeb7c886b576dd0fe98615f50aeb4f82f8392912e25f819f9c5a76390da20f6955db9bb1f4622c054eda3403a4144dde1e656bd62a65299e0bc56c82c7a0c131243a6a7a49ba93c0ea8bbada3c4bc252e309d14f9706124a4b2e4b054efea5e29e93524c8592b00dc1efbb324afd4d94fa9551ea32766e98a7548b3c5686288edb920f8356b4fe9df7c8ecd7aa42f96b8531aa8bc4d3092c0fb5ce7ea105a40521e7f82ebbb1676ea5d7d6ad909a403afbb03a6f00677e37e8fe7d4ea74c6bcbf16e10498bd3704a7ecb8f0be3fabdb428a60ae2e6ad8f7b42b8a108550bf7e8e47cc8d91c228160e2fdbfc9ff7762bd91a46aa618beca505b2decf124c912a0d64ee8a7362709977ed09b525a9ce54b1be7cf370d6f8bdc120a03853a6e9096faca98b26a371f4c26ec97d4cb200beb68a04f870e72c5a13522f91092d97b3160c9ae7f7aaedea06b54c97935da97e85aa351e267111b62baa045b5ddfc83f391fa51bc60ad0faf484c95d924b22ef63c7e3541fda059caf7cb1b3288e069fe0b44d2b5ab94005bbc05213f914f4349999669250b35e5a89f1ce53ff98c94d81acaed0de18c13f6393016b75c2a914c151d17c180cecaddeb89d9e71b0e0d7b00c251c17edfa2752a7534f540a7762812a30c46fbc2e68dc9efd73a4538fb032c9734a8d525e2011744ab9601921c6f440324ad1983286d3c6f7a3e1ac7fcf2dc075f71184fc1b3acaed041310c4ba595097f61c3b2e05f5426dbd17d4765041602db3c825c9158d59770ed604c5fb0984e2f4edca975af6dbd3216807e0ca58c9305aeb395f2e1137a7ff92090a35c11a7d1bbe4eb4865098674f9ae6a5e25838f6274978462850f41488edca61f6234e7135e6381a588bca0fae2de1d7fa8e0d7690c9fea8f70c9395b12ea7c81c6f0f6f74c9ddc1fd1bbde925e4b50b7f2b2785aaa6d1197e9a61b7909c96cf2650b710fe2b8317bbb3f9108f86015f2593d2297e7a8f980385e65d8fd10b0340aaccd82c2c0685020aa4867d11592db82de4c71b0a52cc3be962b33890781928e3ceeaed9a39878e7b4f12187a4b20376430e41748834cf668e6507ff57fc87aaf47ebf4c6eb3b13752b809d9ac6510882761d9724fefb5125aacb24a65a67b4ddca985d0bab5e5e4d627dc74962d42df2a8fc72822b791ee914f29e2a63ffbd88792cea77885dd64c6c6b15a096ea3cde000c9fc198a15f8074cd73a0c4d296a40ad1b1aaa6f089313b2020ffea2f0ee5052e3c0d8f45e07c705070127f94b11260beb81e5638e565b94a3ddd145a25e03a48c3361a3078bb415d9ac1c3e90ba9ed32216c5f07f1851b6ab508b24cf0e41d8a9f0d7bc02a379bc650501d7e0e39940ce9fa6fa16ed66f07801c0b0605b9a6c00319c6db2ac8eb0a727519b03671ee9bb0341bd51fd96b3162dda652470d543540189cfc0bc1f217a1134d5fb68009c22b2b3397bd650bc17b36cab78d52613a29530ac7a0352bf3af6a5fde52a1bb84709a1203845da5cb5e3c959b6098e7b53437d5d5ecccb142396dc203cef5dc3598a1469734e0b99da7e54fe68735f98e6786a8dd40e2f38aff2c2a3032e73b4592c200cc8daa1ee2346e6897f0d5c1c3fa7cd469bf7a50662155a2eee75983ac79fd5ef414bbdd6558fcf48fc38051c991eec3b7ea3cd94af4715497fe8154166fb6453211dafd4d373ac27a5d336daac9801d222000967273885582dd02cb565d72ffc5a9f086eb4b93d070f03a8123efb88cf51f83f6096f254d252cb1524116710849cf1faada0fe4010ce0e1fd14c98a95ccddf68734e235cd02e40519a9a6841567990d0bb57270cad9070851dc9b307e454161e7d342c0c5d2bf3c6364c939c63a025da4c5c906a77a945f66b9a29d5ac0ca258e1974c829e16ae34df932e957a87e48c7cf5f1a84c6365b4195e4cc81eac287a68eb13e18e0bbf1249f3f233d7a1760fe3fb5454b2e2a3398d107bc17a7e520a5e377acb5a869179d0d5dcf6d036fee743635604031a92d16688ca584963b82b39e2d39d0a1b925c986c8e4c4b49b2db0b0bfdd9050052532803b2f339ad1943496c66cb68b3a2eccfd52679dfe0d1d79711218dae194ad1d446b499e15d201359928f64beb0262c20e429dd6710fff9343d31d36161c58e56967f5e561f560d450f6256735183576386eb5f9b2944380bb6cf43ce0f4ef3e83c11773ff2ed081c236641548e3bde34def16d34339139bf10c4d40790401db0cdb9e1ee9ab8989658ecc086557ba9cf5292f5b7b02830f9cd4017a18804bc3ab994201c8dde3a5df9cc3ace04eb96b411549b2d0f13747cd4d6e632c99de14e2f4016ae0a5d0c4a5a276a8d8c54974629fec50d7e00915e8ae14672b2884d6c62a56b6d5621dd9c543f0acc130ab7c137dc1a9dcd97140565178fbaf4b582b00fa86cc0465c755a51b22243e3aed3c14611c86b996ee42f12560b4e79479ad51bf9ac05cdb01df90b2768827f67de2fbaaf0972ce890706048588dc5f8f3a6b3818d8262aafba8ef49f43c0a568418a12e0b2ccf1aea6150a72d0bf89dd611618b0ae20c8f7bd6d74776be610de6c9ad6e0ef25a193dc8462016159d72c013c71a973dc1908236ff8283844c1f8fa76ed86d1f2e81d6ae8189f89dea3b6a6f73cc7bd3728d779a1b6cb5cb6c7dadefeb3cee4375e601b2a90e6422773ddd606e573dc181127f5f547582876dc6e33df2728178ca7011d37455363dd48fdc243b552264fc73d52473028946ec57742ee62502d1b63f0b943360e24c041ef94d7eaef43dc89665da6b289a9b1b085e75336e486325629a94bc14684de357925181af033d1114d20978859f1a4c9015f7ed930508b0650c865187ea19445fa00ce992839b2ff816770de7722d7249b9d4fd060e299fd9ffc4c9e86c7a9da2d1f82644db77e4a3531dfde5aeea8351c3ccd9f0f8613e819c792378c28d2a73a609f6e1cfc8e50ec574ff093ee3ada1e68594a513c8dae009fc985d91cbc4cc3a8f7ab87f87dacd34c46bb4b831d1985705d73ae0d1c4540d8e74a59649645a13ebac05c9aa5a0ea25ec92d07c406817708fa852875c5f1a4b7b839a58558d0aac06cd46166eacc6ad98b137af6ed6e284f970ee49474e485d10253affec343c93e0040a6c6755b6488caeaba65768505494cf62f56bfcd6408d00654588ad0accd4af00878e12be1cdb7e81b83e3880b1e3fb72e285d5880518080f5d0970c9c1c83a4c795c0aea616033cb57bba9f2af538baaff443da9630da9ccf8582cf2166e495988d52e28e012e86b827d78581cf9fee5d76cc4ede1b1ffb6ae6e6ea5dcef1e6c2ea9786ecce96ef32bc4a961bb958b6c556dd95f39ba1946478021fa905180256c2c9db0e3235c3b1e978d3a23e57c0c8565a00ba084e2322ff1693bc51be178140cf14475cc21e8bb6590cec03222e557c76ee55b8e4769684c64fc0927546b3459671e157408428d8cb3e16882cadb26227ba0a42aac0e41805e15daf7ce1e377975785277cae504dcc4b534550cf44e981fbcda126b08b9f6186042e5ac99a3ccb423c977984b0f792bc69befd4c69b7dac3b66d66a6ea83a4a7821dcc759272fe554e329b1c3faba6313ed7f319b5940d7ab070ed0385f690b0220108019fb1bc52fa1afa708db7693860aedb7439191fa46aabf4e354562135a78f07d9fc8eb38d96f377d4ca57b08677e9c02c3ad771a86dc574dec9bf31a839e72d97da888f9db9e7342b4f2682c5572fa999e61527c4acc4b8b5ac0afbc1d0843246a464c54b9a05de14b310484bbaaddf8f30b513d409b8afdf0c19e0c112222623589ebe53ea35b2f2a5d78877876a16f94dc9471c0c4a4d06af64228d31d9a81bf195a085c690190a51f06ecc3dfe80c16303dc85870b2f0a3d36e8fcb4609949ff8105b1e9ae5c75fbbe708182bd82584acbf3bf2952d96774820db4a092c13f94639b2fe777971d167cb6b562401d4aa5699e257791c42df09d48f06baf6092476cc6da33164fdd79cda958529621a890b2d9c0e12914bc32bbec82dc3c6392b3242807534c34401d20b27f49243e4e24559b301ec0f70b0cc4b224beacc74b68cae8a7ece55f0138dcce414af09fb37152730a3449d8e07aaa0bf8b4e4d7c0dc4a9f89ff6a9e90f500742242c8e08daf75cd665aaed553706f059fcad187a828aef7bfec5025df63cd37e5cb69fa3e95f4df87289200f3c83f5940b27533e8c921ee15d1a301cd9db461d6a48fdf9d0f01d162afdfbfbb4c59fd350654612ba35b5801def32cc9536a6e877c7f1234bdae30a21092998222db3658b1db4c85ba3ccf21a0acf826ec5f7a36e9df6c2729d284e0663d91105eed769a53c96102f8062aeda67268de1296fa00496b4c8f45867d4a454966cdf70f66f788e0c1081a386775637b891c230b28448370487703bf740256c7e6252610feadd237a45f975a5193e043b0984734c709f7e78dce6611911777150bca08691d144863191bdf2a169d151f9337619077635e355b95615155dbd8b598151cf99410fd7f4b749031a00b0f04c3cf6e0f49c9559de86e8d58687c010662aeb646edf77a02780fd25744c33e5adbb0d42559e58314224f36fca051f51b14502f55000850a68ff16fdd13d2b6af73392c9fd03c97096fd806056c18eaae12fcf14f3d1e896f40b408251d3249960316badf5619585974b8c0341cf4a2dd23cd074b8f7d9768d6ef6684fa5bbfce5a72cd321c925e2cc9e554b946e30daba3a1dc97e1d27e4d286f42f0d82106b6a79ac5b17da06aae6b3a1b71f20dd5f89b7dc7ae77d5be19143d1cc8785804924af9a63ad9edc26a9634e7e2c85795b41c1480995e7b88d6f7ddacb24a169f9452b5b75d4e4ae44b0dff6e537a10b625e02d16220027381c23f8dec0f045a870e82bbe86d42735eef5663dbd0c29168bdc4b9495b36b4045eb5219429aff2d80663e40feeded762375d5dd59b8c6e553e896df0a41c9d8d290d670c85c891f9e1cb56c6ae03b2943eeca60d2f3c97129074e8198e8d035116bbc798bb21b397a8fbe915105b8b9e7bd2486dc7688e5d6636c10f6a11e80b802c08a278508a412c02bd0804f116805214d6ec7e0fc952ae11d6d905df738fb4d3ec19c969f71926f8402c1e44015005415f00421188053788b7009422b0a6fb05bae215890e881b7ec409f3e34f7cda58f03197fbf9ae94e9b44a464672f8dea6f0665542b02c941d3e6ca0784310443993e8f38d62c0bdbbd4ce8f75ed3d760e408664e4ab29dedc7edeb085d5468ea89a95a2066bc26f0c51bbb1f7c0f088bbe0bbcd42bb356133d38ae607e93294b81cd8984cecfa2bd4dada001f2ce7ea3fe2a3282088c203c5c6cd12cd0ecf91b836afbd81100882020ad6105eca51b9b0db3e73d823a8e19850b7cfd2b59813f6089503638c3484ce831cc131e41cf5e54c0fa332d49bdfbbe5746df5e98cb30a26c692a5050df1a5174ee4d090f1d96d20d278fcad207bed8b30b9e4b01be0e81b7afcf00f9d28d2547849f9f8efc6705ef7a9cda7378d23392e48d5f72ac5a063c4735497ccb9b6e460b040a037f30ceebf6afd590337ea239a51cf2fe4b407fe849ff36b68d30bfd954cf8e92fe26be7a16419fab44cfd8aedff5e9bd1927ea07ad018bf90b64f9001677cfb7f3451145c5e243433f2e16594beaf0a3e15097dfc143218222a4c545ee8789b22f8ac4b9f5ec06d3fb33282a78f21b1663b706f78128f61caacc34f18e0e58c24cce2bcec39c984b9ee9d86aa4c3882190f11e4739e11d1562fb9b09b83b0cca33ee5ad2ee0b31c04e20ddecb1ea96390888b13966bcc08a63160a3a5e260ecfe56f89a8e41774256ac041f710768290524a58ff9d5c9fc7adad0ba6ff0716699c846ee1e6e91a92a71b05754903dc452363ec0dbbab072074e5f1807ad38fccfbd4efab573dbaa48d044a509b11c2c2dc063029c663681f627b785f394c4e49544036c05aecf4a3db474e69bd010ca6e69b6a76dce58cdb0d1ae2b271e92fd0321955920f96d6c2a19e12bed7508a97ec5019143cc8a4fb3c9601d9e892126df2b7cac0f3d97f6305b2bf857ca627d440b14931fb4e5cb08574b2dc91bd264e6953983b4cab24a96c316b34c59d78de3a95bda8470dfeefce08d682466089e534883f408c1346fb2dd5eb49d12e0f2f5ecca96087beed7ef9c70f0e3223a8a3eb3fde952bb52a9496cb6a0072dcd1d32fa67b363e990dfd5d4415c4616a9c43fe0df50d6f787041c65c485105d66e96509f7454dec9039538a3e37bbca37543618653835fa0b9a089f14ca7a04708d5129565d54083979a620d8ff3b10fc284ea1d612fd9003f896f0b988c50f04e2a7b6936b38b817632103b056928978590d192b075eadeb9a88ac956b38907cea98c3196adcdcdad4aada4ef7087d2b8d9a678dc4d6ce2bd7a844c89684b45452abbfc68cb864acf55db04ffd90a35ca39393a0cb791b1cc8270e1a8f0f9282ebe41af9fb5643b414363537e5629ec0cef4748336eb0b5031b747aa3f4f087ed3289a0a44a27513110f7a0326873f54c513ad4af21081b3a832b41780b807863efa46b482f641ae08f0ee6c1c0a9fe09c8e1594d6f8c25fac8012848c7097e328ae890978eb78e8fc23af830ab2dbde7a43e1a8cf090ff3830033eeb50d625c0695f6f65b3c4a600a1483265a911288ceeecd424ee9c976a5d381b5b9893421174119a29ccf0d6348c11aa006c60d551e02a2601219d6acf0b291b7953e20b6974266648370078d82609a0b1f160c499178490edf50e5e45eb0373ae11f0b4817cfe3e46eaaf00c59f2244586f415b307ddede07e60913aae3132db529cf4b409942041ee7889ab6f72c4436f0704484196a5e623aab6a26c29be5f3dc029e598e1f3931783d451b30378ea6bc6130c465b4d46557d653285e406af9aefc5cb82bf70eb6c4fc2df642c5e0e609176b75f6009d45d69808e8c4c48f4382cef9a39543a9838e7a035ea8efc5b2fb164f75d52a6245bc0b282174ea1eb6e1225d70c746684d7df2c483ae71d507f9373c23e8bdb645a2a2d7b7f26e00025b92ce20827e40818d0438fbd164a7d513c0fefed8d3bb851922e08127bcf0b578634ec5239bb60f7ab123632c406e0cd698ee66ab79b31d5e52b7209b941aa942386b8f26c08e5bc2ecfe12d81406486bc3d44960f18c934fb2c867c8aa1cbf8e0100636b8dbe6040414aab116b23cc657544591d76f6d87c0abc4112bf3bdcc8e5e2aafc3c859dfd8d98f19891bf5e03cb37a94873627daf98dbf71e23d230d54a444787764f9153b80c4a8b0caa50b620a8adf4bdd9b6231c820fb5ba64a0e19cb8baf8ce36320e2f63ff9a43e464c5c9f019121c2c86a1aa29977fc4e180ccfb4407393504e7a0e00f94222be51a35ac811f5536c245aa32e50e179ee0fa039381c4b0bbb1ad8ac2b13f6746f9a5fd0196dc21842e232dd26c7d6a1da23ee9921b03c0bda6eebfc7a07cdd9e07c1ccf8f3d2986b760ad26d31b8ec34b40466a10f6eb73f31f38ffa2b49199d0f8ebce85809f766a3eccfad89aac6369b6d8c8a3d280d068869b33db2d346757f24fe6ba2cacdcc06bbcd849a48de6aeadb28196f8224649c778dbb03535996a03bc33e9def0d364249859ffd5300f294d4071cd2bc6ed985f3ecd293a17a729bc2f41b4bd6f850cb94d13a7a39b10fd5eb30aab198eaad01080ad97ee312bd9d70a3f4d7ffcb9f738453f1e3063cba70af24cc4d58c89f208f115a52a1c94a22899ffb062cabaf42c968ceb13ad060ddefa7d82daace063bf39bf28b82ddfd34e35b43a7ea86dfcd70d2f2fd200a0b516e1362b92cf36d92550c868b122b6d938b968306c6de0a07c3ffec26817345e8508ca4eee5dd21574bb7eb7d12838d7c5ad59e841a0b4e5cb795c0fc59db8953ba8dedaa7e752a9405166f0cfa77ff13a833c0760fe18cfeb50ba3ba0eaa7af8e0d5576fbdd2446f9c207ff311088c03dd9a4e12a13fea0217432d8430cce1c047670ecf0ed4e4d7d99b8393b2d2c6ed23ed837aff320c70b64151c724585e21a24a0647f2cecee54c71d06058ff1e3db22c76a2e5c826f0bea4b51ebb59574d8d3e0e22dbe5091568dec25edc226f7946919a7d9675a7f1fee7d51c9ecb4827a8266897eec4d5c12eb40924c1d2eda7482a86e871e727b833197220f68cbac23e0234e3378e5e3c78c2460112a3baca85568c1cbba36e9e74c97bdad69a5ac2fa04f6909f58b1fb94026571e65e2912b4da755f5f39a2b529a62b586f89e941efee5a7aa485aff051390b060bf3186588ceddf500ea2b4c7d6912eb948e9a2e83eb056eb4764085f6e699f291e31594bf1edef2ffe54048ad88c6743c825c2ed56616205fa7b9e7321f09c940df0ff3d3cd8372ef9e29c2bac1bfc1289cfe35f0c1030e1b74fb4bc7990a79a574b47e6f4b2a03cdae04bade579c393f11c3d768b627cb0daba52b5c8f3f97fdff6220666223d7844fd5ee7ba77abe84b55beddeaff7c5ec5da01701607f5bf4fa21002dc87f2c1a725438a1d49f2613fdc6b0a8afc94163e50fec03bab9df3e66e0b4d02d2a788ab2e17928e4fac079c68098cc361cf746a83f88818cb67bea0e7fc47e31128157cd13b4ab1cb113ddb053db2b513fc1414687c01378858d14c3cc8078f06e21306e2f423a7393767b431789a916b0282013f07d1607347773eb7146baf7f7f216870f043d000b0b16f9935b039f30c881f53b68390422c6774d35d906703a3c86b43dcb4bcb0acd906252ec64ea0ca106e8f374a1a01d593ac9ff1875d0964e429ef9d19c6eaf76139999cf7d1dca58a65a3cf2dcdd15363d19670fa94225aebc16eb90b37df6b56f7f630dfa5f599813762153f5e8230e9fbf82aabc73b303a0c41ccdebbd26d227e274654661ed964d5643b236efe435e1c603511a0533f1087a8a05155f6b6091ad825f9164b9def082d1aaad6257648aa228b47b2896c4c702129a46c575667e689c11f43b94525c5c942ff992f5d7a87b38d2957dd3185ca7cd4795be938f07ae0896d3bc48b9fb4519ed92a2cabdda11598323556dc25bbc57a593a420e54bc04b86a56147bc4c214858e08ec6d895c5a7bf7eb4a8caa9f7fd358455691292d713eba235a2b018c6b6af1cb244f8cfe79c9023064b43fdc4a0c91d9023464716bec80dbf60f352db3f0831c81883a9a39e1c3538f6c0192cb0ef8d25facbe7672fb8766bcd528a5423ef5b9f4b2cfb23082de9db6950d90b4b7c88c750abd9438c7ec01a8406eaf5c008acffc5f7a40e91b370772534e2ed236b79186119ba06d58caaaaaad107874f70fa41b098ff9f9a74752013c2950cd2cda1c16361729e270edae9b84b967a24d665137a1f742af0ab640bc6b8e2825d9b107c02e512b5757452f73b2b2621ab101e650083d836a0f10f9b67a3853c4294d216409ebecfc4c6b889acf858e5203e727f9bafe65ac31485c6f193d5ebdf714c726d62adc3ffbd349704039b18a614211452fe91d70a7b71ec1adc45cfc0991c8dca82f7a0b7a3b24d161592a9f97aa2dec04b47d9d162c89ed64241c17628cd081746167b4235a8af7b1b01f989889c45000324f75cc21bc604fd0bfab72aa11b5b2cad839dc77631836981802be5242908ab1c83d22dfb4e40d87065404cf1f7ccedbb9b3dab3314620e244666574c928f5aa2025079128474d18d91ddc81bfcb229b97e970f008b24b8d6d01289aedc1d976b49a37ead56ccbde6c834a0d23862941568f2780c8871bb89023c208dbf42128f9fb3905c17226c2c890bf4ea609b3bb839ac23938f5130cf60845885c7a3ee24f5abe9776bfffc8f6662a6c69009296c0bc5895ef447576cd96c093c824b50e9c1cafd02b4d3783796c48641e648d645d4cadc4659761782482ea7bafb8433a6b6ff47a6f7ae336cd768dddeea88102c9c7a2533568c448b6d372d63cd2b752fee5c7cfb614a5510b3b31e94f5c6e5a46b08f5160d81c04ce3728d671afe23c8256cd974a92417c190c00ff5789e69d800b3844b75f6b405c550ee3f446719c4989ddcd6c34cc5b21078b99cd1998a4d544891d943a619dfad16d3b91912917d53e57d3fe0cd362c730f0b0d6f060bc6920b338a7db8e95a962b3784bf2d90ec3c37d4967c013d6456513295b227a2ba1a407eae7ec87ecdc0632f82e263f5f46b4f9fb9a085d701784392d3ffcb8877b7610483b3444c518573a5d3d83d5cc9d4852f1109b35e04ba8b8cbae0235c1badedb34151ff5c3ed5553fc080eca6d35d038c503486b1f2ac71dd2538eeb6432444ce114d04f5d31b2af6586423bbf8833d5b5f7bd0d0557a4e2b82a06083e14455e19a7d05879000bf7c2528f64d8eed831d84cc1a22a6cc9d03da7eadd199a09e801f27f81951791691697c6f687b3eda0b3c852ee68090c32e2eeff0c7f61220122c11a37c2dc7229e89645c6b09f89e8dcf8c1e1aa70dad3ce0572bacefd0e7825571bc9b2620e21ec111aa707dd6c5c9e5e0aa535f4429f0596fe415694ee6bcead24eb8f4a967167545922dc45cc99706f703707d52dcac565dde25e58b962b23259505b8886376d3cf15c2480c28dbc5a703a0ba4c181f5f74aaefb4b54d1d5cf9707d9305402eff681814ccb8751ddd5c5fd409892f4b1539b397aff3576865d360bedc5f0c1aa8dccef64428102b8ac3062c008e4b2f96785672e81346d8386b09ef65d43d2838c89ed6e782a2fc997430b16540d89ed0a6bc1c2adce169db9658340fbf85c43f2b2dff3c4d7953d61b99bea678279f476d06dc10dca552ac4eb6ef4758e4e8ce3b8b56f936871cde50f62bc3b20edd33de9191921a5f89271124e73596e185d70a194c8c5681d34d4127af3ca97dde2b7015eebf7a84b0a4892054bd88c6916c004f206a699762ae71ae8410ba2a622688e0ebd5de9a1a12e35dc7a498881f583fc239364029a2df28ad88933ba63bb85c174412e9a1c71ea0f7c4e9617b57532a31556f646a0cf24d446efd641f05682f0eed90a27ca5c2f9a9368e1b5a6ed1d512673b1ccf3e30f533d3c8395d9fff96746077bb6de55a0018ba853afc17bc11077676de8083009f677d846eae130bac6b15f05ad473e3a5b010215780ccf587f40e0e1742472b843911ba5f374f0563e18cb72409d707063113e39e2a703c9af8dd11b896393b27431764a756cfe5bec793adc244129f922ed5103c1053b71247bb6852336df8a46e749280e365b7c606a7c827b1c1fa17a8f816577408b5aea5d211d94926abffa02eef1dff08ada5fc980240f4967a14c9fea56fa588e948ed8d5f8803ce79a56f2f9b912462295ea8a0f10babe1e3d003f8f3d630d864694343546bc62efe61e933ec6a1cd5e104e69278c0974f78bef9559ad152ec999c529a186740a0d32c396a9731e0417be23be67f20084921ffb8e1cc2b432ac20ec653d6fa9d8402a8619c13b12df24bdd9699deb7b978d33191d7acae7596a84c811620cf4efb29448f3ba2bc25e6e47d7a53276af9f7ed2e3b7638cd61c5d5585071f0800be39628de17c88cee9e3d3b104a6dc9c37a131961ace0c793b5ebc6ba9a7b05d5e921df3501e27f6f19e6f62590ea51985c281c3d7ed6f92b9790ce445f1054623adabbf2eef4efa2e02f489f2de61480cb79805a7b24fb4b9bd1e52f6ab255be4b5ac95966e3109421eb9e319c256380b145bfe41f8a7084b3dde05b0506d2766ef2f95a9395caf1b58de2497a277df72ae087acdb5205e62d97cc5bac5adc9ebb8eeb18db3485cd0d6368be1fac6a81b79e819a9a9b02ca53e48a43c20c8451e73817e6679b2809eb2c12cb5bfe76aef44a0e2e947213036ae6fa303c56b7c4ea6a56f2ee68774ef84473b560484c9986b29420b9d02963340db06b6dc958bbe405d79008ba12d73fd1e642465327943db0ddbc375843fdfa3e74e8d8cc8347c9365f131427326cabc0af1f0a84f6525bfbc2dd43d9c0f8c19ca5d127b836580ec83f2221ed00ee33fc957be57514d2367bb07334d0de5ffeb843913e857b74294631271cb1b4b09c79983da6b834bd72c8862136990151fb875b28a7162a987fc1ea2470dbbf12b457f87ede4326294eef61bffe55a90c3375862ed9bab46902ea4ef9b8db8f18c525bbcc2550b355e7eea5994928dbcff88ab8a35265c5ae07bc2d7ac074fd840c3257768abc702e4fe2ad0998f218d20bf471b152ed95ae1b7d7df8723f9dd8dbc2f5092b94286e2e040607e0ddbc980d6e39886fbab42d799078716e109407ad2e2174ac52afd788e334c177982047360cdb7693f19106c1f608528cc13fae4e93c65f58414cc7d9a00752e1182b4d0c988dfaf44b7321745af0eabac74afb6ce977207c2e7e5408bbd90b821f8fb24481e6f191511c236f9240fadec12c3141c147772683cf4025e50f06b479873425635c4d89f2b3b67ee012f8978140f4cac961ea5db842ef0542945148f5c5da49dae87de75edb547dcab1b0dcd759eeb9d43d6a47e09f87c43dee12301e2fa92b684949d9da40c3a90c2b61380752a77c5d1db3548a7d211323df0a319121c12010b8918a63ad98b390a3fd39a0876afabb3c02266e717cf5c177b9d9140e70d0a06b9d9c094f71f1b06136e012a9de784dbf9639aeab4a2b8388ba9aa7f97d2d600708731f05da39003195ca688e211161f3066fd4a031c50d0dd400b5761a99d0a81d4f6200fcd6ca6a949d02ad574a5ccdceb7047a7c73ede2673ce260395a44d064a45341775c19a316bff61962c87c8980274f911b14f6748d8f70004f46773f9744268cf3825793522ca622190039d968de6fb39b6f5ccd839d4df2e8b7df4e3d47879e30bdfe77452f05a3d126d87fb5e560d9f108872266377e2b09288dca5a1f16dfa41a5e9be9ccb9942c8004e26a970f887a4f8ed902dc39112f565b78614a692dc8c6657bbc2e5f2810a15aeee4861bb3f02ffadc5cde0d14085076b9772b37a653adf14c6b2c7dd28fe1e511807a7fc35805edb17477ce9c10815136954fa2adb7d97cf8fa0418c67719fe1075cba069b449fe408eb2bb7daf0a1a142950056e94530819415c56ac50a593120f85f09907546320debe1f81928d1b60282868353e5e9fb61954ed476265b5cc51d42cef7bec378fc6ef31cea0982aad22d42e64f82e856f9f4c0546d2bf25ab6228597f422adb677395bb5d9fef2424ed501df7b909250c250b0f3beb10ef6e7cfd4e8fddf3e254e07427bbe93040e83f7e0cc3b5190d4beae8a72cafcd990a46602f86ef8120c42bd70d1ee3c4b6e9f0db5f98a756d017ecf2e2bd6c2acce6a126976a3d0c6efab0c4fdbb481ca3d4971ecc5d5765b80f1bbc441b9d086eaa0c904453c612309c52bb13e306eb9b40f58af45d3ff2ab610134371f41216514d0b3b6f1fd8f380620d8e996e79e4c9daf506b0bbe0d2052596ae74685a55d1138ba546abc679f1b04e260efe66f4ad1879cd92c9fe029291d2023714eaeab89905e2251f15e0e8488cd0e182b901e78c4606dcb6933e5a7cdad3850f74e04a2ac636026c43f4af187bb04dce1f87e1abaacf13a6632635a3702dc70532dc06424ccdfa62fd4f1cc9577df88dbc14893894bea032858431a06c8034805b18c3ebedee74c7c965588fb81a2a0459d6272b6336b6221ec81801ac3e5f649996366263a0a42c219804467ce2d03f63e91cfb5fa1a0d3de86c0f82f7b8445cc5e81dd19e4b0bb81156bb42e3e278a86b64b714a9aace8a5ea1771a59cb59db11aa3ebd05d14e70af96170eea58e1e8acc34f9cc1d4c890b10974b8c9140f66b00c0c821df023a24fdf8170cc7cad4d06294a69fe82d429d0b44d8adf0224353ce35a60d9627f23539413b6ff2c501e9fe4fa79e587a3dbf9e4fb70a60b84f79cca2c5d80f5e87863563d8ead40dd5583acf2e6e22bded7cd6a79328344ffff570c8a908f112477e7dc330c8e48e8c8a39de9a11b236308394b344f6b2fcfb814431485ffafcb0d470a0124934b620e727d4a4fe8eef90b196e9729b016e0ae7889cba4198f5f162280a86937e4406c804483ddabb03e1476511266e3c76008f7afcbeb65bc5c537802d8648eb63124f610f188af45e0426f8b5f0d7e046531c9b3bd26198f03e51bfba2e240b207463edf539e57cf5752f902772e59d01e2ce6b17df9af3a9fa04d5c40b1901caa07d7582da3db12ae832229cbb091d075100ac8faf37323ea4e008d709e4bdca5a07383fa8f2fe725d0da4f1f000b1dfd4591e26564e2b72857030125f173c4016182006e8ce00ea6bdac7686f582f8bdea2f9dbd8d5af0638cf2fb2ce042420019318ccca7e4faa8b0cf070b158844298e4618948e5e5e8798c1c53711baecb420394894b27d72512255cae4b05e7947ff440b7550de73d93a9b2bab3d78221fbdb7c0c657e32a42d98a61682eb96eb28d0ad622ca25549ce21a46c638802d5ae58e60b485bc362b8c295d58abf136d864cc67a6f8dafe0c9f2ef12fa9613229d72d8e4928f08f1c7df9f095c3148f1ae8e4c06573e49e97583f4ad862c24deabed7e7047ca9cbdb0110a04cd0634f985d19eb4344ebf7afbdb3a1872697557e7cfebb82eb8bcbcf0e93c2c4dba0558147b956cb82a7b42f5bcc70adf0a9673f074e1ae88fc825f0834574d970ca43bd373d36d47f0e81646b9e6eefd4ce794d22a2477729c54eae0b949c1613352bc70ebd1990133003ab9a17c8d22121ca519dd6c338fea6c4566659562abb0320880c79d3b2f7b5405ac653bb8c28823b207dc4039f43d7754693b84e796184523a1c5d7484b71b58a99b4c3916881edd699e36635fc1de786afb62a473a155bc53db67e032f85bc96f5302e35516c8ab69a55ce7d5a7e168ab84ef1e1be3eaddaae3178f78f78b8307fa8a12490e7e170b226548a522ebadc3819b695287cf757f791bf43a01d1daa90fceb870107cd117e648df6fee77f06bdb228c2157917948c70afbf0f1f2311ae0360b1f32e78a2647bff3ab8b776ecaff39826547116fcd5db9aff2e8386f65d2a182f8d57682617af8e13f815707770f72eb85538b978f562da81ed8ad08e16d6279647b5694446113d83c3ac09c4ca89aafc79d9bab1f43bd957a12b4b9b0d07fa773858fc194801e88109b873d184d30691c8352fe1d0e0f064b0dc83b8634da197a18e9e7c89d7c7e97ef81f495cdfcf131710fa547e670790d4d846271a0ad2a41e876ffd30d6f89e502d1c40b1c9caaac701b76e41720c839592363b876f958c4e18c9995691038eb6c5d7f0b2f2e8971b8a939ef72fbc9a5bf901738505b17c2b747303b2eea32fea752914ae03b7c1a9bcc3a318d23903137e0d8b2d31fe02a1c1ff80f7d0da8aa43d9e4daf5d27c8325450c24a4f8a8836dae6f44a9633f207de22d89587f6056f804eb352082b6e0c6d5bcaf09239cdc0c4ea88a39728d09391dfb7603c21ccf7c4b6793886f53344f6691dc1a3d4282a18dda149ce63bdfd3f3253401702266ed3ebda6b70fb1848e14ab970166515f9ecfd38f8b47e28aab4ce760fe18666c80119380967a1753b439c99cd738da45921ef5a2a2c30c9216a14ffe368a3ef59eedb1324c7654302952447c069411fcd0e6fcca93e580f748320a30ad9f4950abd984dcd8b3c2eb73f01f4b5021ae455625c308ec24a07fa7aed25ce245a88bed652463782fa0086a2ef2e841e2c588dfe5a71f4e8ffe5d1342aceb7b03789080c07058002208cd474dd258b3e57cf4589982d8f57845eba411771f230048deb6fdbff9290bdf7de524a99a494325a0612069f0574fe0646666b7230e6fd9f4ef95bba70b93273985666d27432994c233568ba8401b3258b937442bd1a9148338c0e8f5d74c4273927a5ee15638c1fd41a000060b1022000178000e89402c036375de77938383900c029fa7252ea5eabbd5eadbd17632cf32ca35366d9c51896659ab67199b66d1c974a652ea552e56c6373d379d7d129bb2edbdcdc749de7e1e4784e0e9d322707274747e7fb5ab4d859f96a45a75cadbc8d82399c0db97574360a7e9c0db915305bb40567436e9eb8e33b3b74ca9d1d2cf5c517f33f9ca2df0991e36cd18829edb22730e545e40b0a727c1531dae11785b5cfd85a0c44c240f833f048480c20fc481848ab9afe19340331d0c15084ed35c6eaf83f80f98fd3a96b8c3d24fe0f3186613b6bd40b29eaa8fb21c71791a71711a317912d2f24233a505a3b1d5ce26befb536642a040d79eef81a02440a5e43b66cfa2e5cf835c4871dbe8b42f10a41d42b044170b8c14ade767c0dd1a163ca590d5432b7e36b080c55f2b7e36b8890ae29a7767c0941d3d590f38e2f2161760d215f70780561c12b881729be29187f1f4b8a3b8b559d689a205b82a8601e197984628904b2055b6b6d1027b427626badb5d6febdf79a10a6d630212a5720462f20416cbd40eebd189a9709587433d02e4a8da3272850a04c284e9c50279f0c187f1f2b067716ab6bf232dab286890e8657088098f0e465740591ee49d7e465f465e31d5f465db0505233c5d50275dab180317661cdd30eff5b6bb6d09eb8abd3165a393b6ac922882cb4ecf05d42b20ad9be7c26b3276e2c0b28b327ee1067234c5ab22041b742996f09e3ef5b32953a14d42ca561ea52484305489a2847696200d221e950d09246c9be3b6a49638495c49dc5ea926877e40a353b22b1a3962ba0ccd5bcde9430f0d7771103f3842cd7ae0ad835cf9e79ed9384dad1b538b3a097d27b6326fb8e5ad00cd98f351a20649cd2cf684cd8f4bdef5956cd0edf255988d81acc9359e080939a1aae60a18a295156f080828d756875fef0951b568231c632d8d88c0b1b9b91b2f1b551f9cc0b7698df5f80b3b0d7da2e48a694325a7b66886dadb53732c8a91db59c31c1762d677038d384450ba538d53f9ae23709f1e0117fea0d6cf93f66919c35343c7fa694724a39a50c02d35c9cb004122b8e7849830511206a668a3558184a29a55a155136045815585441858b334cf28c0a3befa8e54c9028be2a30febe3254acc19e10b140a94c0c8e68c972858a325065ce44615150c99ab062066bf01151180be2decb21895470d9418c131b7460819aa83255ca60894a9571a10c95a8d6b3a420428b1558aae842c514376be855e1de5bb443932938c880080b32600274c9ecfb19481921519d91b7a3162b92d8da8e5aac10c29ff2170ac38689da12c83e59edc31a75b168be20c9a42948ae0f6338f8b4c73e5570b5c3077efffa443ff40ffb0e1235e1f727fa61ff3ed63fec5f7fcf5f07d4684e992dc9b4e54f59ed58edf0b7ef6f35a82f144d4649ef6f41a9c8e958cdc7a8cd531f977ea771af519d03e76d2e6713467e17456d3a7f1cff9ccbbda661d388bb5d269a2d3f3591a693993497340af6a8cf69d8e63177ffe66fb48fee2ff6da4720ef6f6c82babf796e6965dffb2220ad823de6ef20d27610719f3ffb1128b0a2aaa7c08a7eea2350f69ae4826c1ebfe482babf9fe3086f8fffea957f8e961d1aa395eb1cf271b4150f5c59e95441b9331509728f30428f084420fcf37b442002753f7f84a0d58eec55afd23eb4cf3e02ad8082563b543eb8577d045a4d9de3e63b9bbfaf496e8716c4fdfd19b30323edb9019d56533bca5eb5430be25ef51eb47df6910bca3aea15fdd4d38314d35df0d43922edf9918beac4586871c6cea89201829959da64ec47ade0724d87aa2d267bcea9254a69cf39e7d412c534b5905932e7dbea5094e707a9458c1a8945c617464803c8041c4126091299138e001066734d80c147910931604860858a1c5c60844e21460562925802d723349c00650435e60447440084c788c122c68725ae15636563313b6c7ced12b63a6d41eb59504530c15c90ed8bc8cc9f67a17a3881091d846050535668811827617270011492094c401501c2440ba050803aa234059a314c637288d5dddddddd3d4affaa85fc290945db3fc49f598defb5b65677baed0dfb9916b21fd627a168dbaf12bb6922cf4cc831e668608eddc02f75883128641f03fddf2597178c5d2ed613ee2c9613538af122664c155a9c2c967f9fcbd5251958b5169f8195037130b0daf9429c698bd7b4edde7b412195b66d3a2fafb63994f4807b793fdc7438b7ea351dce7d43d7b6d15a6bed6b00f270aaee431e3e210f1fdb69a1fbaab7dfc922a21fb4863eb6fdaae9bb9a1bfad2cdec50ee1bc27d3a546f7eee9baf60e8517b2671e59e10dcf55b441825d44f5af1affa26e4e113562d64ffe6eb8743b34e34add6cd87321cd2a19720ad509cb52d05824a470fcdeeebcf279d5fed7c39fac66fd0b76fed98ea511eb5abfd9b57d98a5f477b3aa57354fa49fea43a1fbaf68ef6be85fd146783ca4f3d472db6af69fce93056be8e0e5d38a0477548429143458e46edeceeac95f6e5be993e461ac03e36834a9d192d0a433e6d1fea64152bcac03bfe07f3e76dc0b0c290567c8b4e320cedf197fa896ae7d160030ebe04da53350f9f6f71f01b8091f6680046da83afa4db53950d186e2f31cef9fb6ad5e1a6431e3e9b4bb56ddaa1a401e4df12eef7b55a25d01ea73a3a5787396b2b0ec5c3676f1ff2f0d9aa4f7de8da3e749bc12fbe908f391bdb0ba974282f17c2b6b72f81c268117ba8f49e3cb1cfbe9fd29c43490f36878a72a869a47f30c13bc1e515c1d8e58a51bee021b987a405262c58f18e1cb5c0e411f190bc96bc6cdff1c50293b4f1ce82913d9fe5c2813ce57c6988a52d31ba28a59456205bdfd2fcf3bd14e44929f50f9dce3964e98ad3f6f7260c09e4ff5be6c7a89948289ad301455bbe1f7929c8f4671309f5c3aa3bc0c176eab2c872fbb0a27c9ab73c5b346f8ab31402e0c0c4088a0e539ca9224a21850f2fc8b004054a4d50248450e208a326171051a4f4f4c496147610010f2b287201861964c1458809546090409122988c3cd1040f5720a145966b87ce92b315b2766bfbe645181105668c2c61450c9e94a002683e4f84f15f4e40626488234574004a224d874507f55a224393344b60d8f4bd0f5bb2b4c377e115a02c41da61c4b2e7372047963db9c433398c5f3040ebcf3062330d982d2b72f84f277da7d386ecacc8734ec7c2aac29dc572c9c0e52ad36161ad5521866dad8d4a73b3e34b85a41de65fc2d808c6189ba04402251fa4c49952154c6986acb4424a096953a2a6dbf1a584451625cd2b85a3170a2b746a3e3018638c57272831819225b412262c345787053843dc9c1deebd375038204b5e29287554a4792911a10426c5a4d597586738c319ce7086b31913839f615a087f944f42d1c6d3a3b3ce774a2709455bc81f93d9bdd6d6ea4ee99cd77d847bc35a31795bd02618027d493f8d82429e39fa135cdda8a1d442f3e917eda22d391ad4c195fca24dc110a6107d50c8ffa9fbccc2e57213902143663a99da45512185843ed8bfc89282bd8c1c0e0e7eae13ed5a33f70905ee6290e715dd2b69c89024514b9a7825e9b2d435e14952a0646a91214691c39cbd8f074b52938404ccbdd70ef110bc5030d231d145b1c18eaf24529234a93eb3456b747dc971525bdd5dd26e8a1cbfd65a6998ef098cbfcfd57971b9589d13ee2cd6ecc6c829854f8f4bee72754b28f13a92e675242a478d5afad67ed1d6ea56c1b8391036ae33224fe98176eb365b4664df35cac05feddfa7384070b91bbe85ecd7afd4254dd5aa47a01beb7bc33e0df39518e98c61487d3ff265fb53cd7dfe789d5f759cd1a501e217513959d8b091310ab04fd7bc8c1cadd9e64f84917fa4a5d96704e26ad0b759c8adf6d971a15780d8e2ee34bebbbbd7b8f90e29754abd2b81bb3b757777ea4eab6793bdce29f50ecbec82c852b2ba1e220683afbb82f1f7b13a12b8b358b3da8b311c67b517df38abbd36da1ac3ccead1098db43269189dd078ec5490e54777ea4e8bb0c4c6743d743d743d743d7426a822bb111c799df0d4ede057b2647915c9411291c37f56cbc5094eaf225c867865bce3ab480d2928328508fc2a92b48bc410a53ded78c85a88fefc89fbca962c4edd6bb5f662c7984e893156adbd1763ec628c619986b12cd3b46de3529e4ad12953294cdb368e4ba5541b974aa95439dba841d3654b963060b664b1584a95afd8d86cd9f36fb2dcd0297b7e47a178ee79744a8f3a891a33c3a8c99bcdcd4dd7795ee779383839393ade869393a3a3f37d2d72369def6bd1626767c5e33c3c744a1eda626767b5e2e1d16003df60033ae5063bdb8a87f268a0c11639643cab7b8db4861c661efad56d1a2bf183f9e39e3329a5b42e6411a058914189abd180d9528a2f36c7dc873895d2119483cb41617cdfd396fa039c3f4c87df6ab9acb5318a768c2f3c18b28726ab907bf80ebffdd1a7ee51d5e91763fe60fc7d56b02d8e2d11c514532c85ead35dc3216a41a81fa91ee26c58a1aab18eb3278d08e0902de1be082ce4f861d196be2988ad08434ec3e7e7d990c3ff9e9ec4c870b46b080ad1f719b3e5ba1165c82dfdef8b06cc968c32a49c766e5b9421250d39868f02b6288304b9ed4ba77f31fe8b31c659f69808d8fd21bbb11e197eec7ee41c707548332ab91af4eb57df7c627c11a6368d1bf145ae46a432c61c9681b17fd51eb3702ac5711cb7811f5f784c191831df92ab61dfe9db3a553f55fa07cb2992eab10dbbdec6309e8de91053a952291d67cbc3d76565c02c4ac99945866197327b96cb6658b35f75e8da6ea5d724df9f98fe0e5d996b4b99655cc5c00db8acd0bc14883dcffcc1ace6cd1fcc65d35fe1c0fe558fc110fb10bfd67d8c2f6e6ec00e0cb1b709b1c76636fd2e0630bb6e3c1c0dfb18c8bdb73d7e19763f3f04fa9dd652dbe468d89bec6fc095fdd4c79d1f03553f3f832b1cf5555f5fa557f65738529f7deab3cfb09fef451ea14de7d9924299f67458b42b37a9135f0bdf17e3949308cd064896369265e99c73da6aadb59ac57af23e567d8ab1c6aab1cb9fac1db5d07cf938fe042a427b3d01b3ef8eaf274ebc9e0cf1c4ccfe6692275868904d9f306dfa3cdb9cb56acf4a0ebfa699933851b3e3abc9101b013bbe9a406d0c6480b2289ede0f39ce160dc1b5eb5073d05b92fdab5725e7d0317fa40772d7b729d264ccf6b7d225524d82dc0e4ea969dc6b2d40ff0ff4ef400ae230d9f75738e8dfa73ac47ef597c6ce3b18370543fa3931bec04fc190d2cf58f66dc2b4b7cd7234769e823aefa02ac61721605487450edec7790cc4f91b5068fb9bcfdf75ef81ab9d8ffbc374b5f32d3e6e6dfbd56fbfd2ab1d5da3687bbfc2d1e26dbec5dbe400228190623c00cfd7a02d40ef3fd07b1d304c3df639a0d0cdc7add1cd410c4787db631ed86916a63df56f4021ec6d74cec018a0504a6f9bae711fd30eae6a64ef4fb50cd4b4cfa236f64376673db42f9b6a8d7e867de41c40ffd5c4cbbef6b5c939a0e804d85f8a6b60ed3fb9547ce12a329f5575e6f5a2c5a961ea1bb681e1ef0dd3b2ec2f8fd5df6c794cb2a43a1765721e612e168caec6ab598e06e674cf77894ded9aadd695767b94517394e1db3a9e3cb3e54d183cb3877af3c7ad6cf298720fdff4b9df400c0c45d8586adb736a1994dbc662da4ff0fe667d6bef9c0dedd778b345e7f4216a033f9e168c1789ef8bb1d7c0c67fa7efb97119a58f53d6da59ff6290c7b7ed9478b6f20a34fa6e43b2369e31aff7fdd578b6300679b030b7bd76e5955262f8ebef2ac1faf7bea66535f0be31382fae0803c37418b7583086dcf19cf20714e39cbfef3f633f5f32993f53e6d203b87c90c2b7697db713c9c321c7ff60cb92f7429e44b367bed4dfa5a143dfa0b578b624de74c891724b62c490f4fb28a5b352f74a5d096f054a25161f2c511ee5501eb5ab131fe350322929e90503d3ab851c92b6740a8ae2067e7f1bee5041b893fca48db3373f03550e624d7b0c946fb5cfe66baaf7b430ef22a21f41fe944956e4f531fb98679ad9ed6bea3d9c73d7ac37faf76bd559d6972e431f92c90eb5ed7fec0a867407c9771d43a9b469e1d5a14c8a540fcd4d87e6be7a886a9a563f82205cbbba2f5fbbe1f583e68ffc5a53af4ad9fa9aa7743834354f0a391ca25e34ed39ce462837f7fa29f9419a74aaeed537cdeb570df49f416d0cd25e7272b3d26edadbab552fbdf9135dd770a86a5ac8dfca7943d3abfbdbd7af5f37cd93421ea25b6a5f1ffb0cac2fa4e9ec9d0b61db12fb206cadb54c98d9dbb64fff052cbb831d5f2f1ced17132e2f264c2f2660b6b6b7a83d595146fee814b3843cb103ec71007c5210fb46dc10a3a058726289c8114bac2540acb94be45224427a893f2cc125c61269424423c35294a56e0990252196ae5822c0922c4b1e304083254afc9228856c22765972e9a020a593a5c51ac0f7094087867100b20f0b00f9a8c9b5149de9ff9012488b2cc78fa32483f9fe5153b5cfc25f6bad9567b6ea7b58e4f0fb789ed572ca417611d16ac8bdc1eade7bebbdf7de7b2fc65a837a6ff8394d12683c385370a6cca20db69058556da92b57a368fbd3f93326081c8e0b6cbdc12de43f67085467bd82b6cad177a46e918f9abed901e8a9c9f3b71f3c88d2002d1f172d9c1972d86ab970f9c4f868d06ac8ad93e3d56ac89d93298e263f5a31b3e3eb862edb67c75795a71db91b768f8093e30ccdcb2f1ca66c175a7793a1d03bbe7000b2a3065a8cd8c6461626b3156f50b3e5c659ca315cf3478a604b9f2d3d20a9969143bcb104e3a6ef4935ee38a4f4ea53a33e61d0e27cdd90e5a8c9a98c3f3e5bee72d76d44b3d6cb02ec61add552a49582f463ea519c1d509f136f1c2a9452cd63c3a2d9e41c3f5a2db27cba83e1f614e3fc7d5a95e747dab3b2fa7152c8934c8adb72742dcb474df3d3e2fca152e64f8de51f72cad0708eae451c25f9e6fa474dd43fc40ff0368c855de3dadc5b93c36f5356ab5aafd9a546ab21b7679aa3df90c38eaf1bb6ec02ecf8bae168575967ab5e914397cbc77bc82ddfe3eb86305bbe6e303373a43da1ef7065f5b7b7ad94c33cab6832a7341a311f35452de481e2ece0a829ca8f0a98b87bca2024cdf97548452ada9aeadacf3840b0eb4f30ac2e67cc6c6fd828b2528ad1a2cd108a54b4671a1c2959ce9f947f767fc25d7b1c2a3962f920d8d2ebc695fb2086f5a5ca1c0e3a6bad422e65105a64b90d9ead2539c458488bd32b638398bc265731b2533bbe6c48b3e536e79cd45f5598dcecf8aac234e7182dce571527696390a9bd4f6c8f62852469b46c0c89284851881462f024081049668092244d66c29299b69d61880a2f1c8184c949141aae201963c30b521c69020385181b906c6dc7970d40585fdc592c570b5c2e16b893183140c43471610a2305d29228741802480a529028c28d349581424cca888d4111853ae1048b25dd892698a6d4d003134098ae28d104d309987af896f8be2e49249104171abe5091c111494a40c248112e98e1a1c81527d010f5c4e55583d2b63bbe6a40f219f17dae15b85c451451846b08974b0897ebfb3c20e69c544e185d5c6df91e1133a099c1880a8ea42005410415a78dedf8a2328607edfa871f8581f9d87c34e9d8749c2051938e6cdbe66f8fb50ed5534d245fc52344ea4c7beefb639a6adacc791cee739e7ba2261d9e7c771d3a4f35117d1d9d03e7a52672e17c8ec6d14433343735d1d39efb9ebea0ea53e00a02d86faf03fb4d1335e127da7468afbaaf6d9a48049a657a6a2269a493a48e226ad2217f6a22a2261dd94b4d8401da733f7ba2fba9cf2e9b8f40f1cbfc501a751f81ee4d2893521d08b43df736a08fcc47938e4c4b27b4e73ef63e36c92324dbaf9b965668cfbdcf43246b1f444d118840f5ed47204cfba81f814269655f296a768b1d5f5392b616679c2929f567cc6c95c37e042290fd1d12a8fe8c79b590745215cd7967b0511265cc2bca0bf08eaf284fbca2a8919a3f38427cf952f7b891f5f811e48f5d4fb077c2a226db5f42b15d471a747a4fa278d9f2e3e60e70e14fc1b0e82918dea84fb57fd421d18abec7d88a4aa4539097241c149484c1c7b487e5da9bade8f1b450c8f2a3cb45678e5e2c10e434840993fd3bbe5a80c2c876edf87281891d6508284e3bfa186b3d4a524a25a6e5e56c8c81f2280a463ba3ce2ee28b1c49590318e71c26e84babcb3f6d890123ce29b49616a5f5eb7d3ff19c5256afd3dd7da83a8b874e4a65ac30c413e418b325953c0a8820279e1299e41b07525b866d100b480f2a950a6c3a9bd96fde52ce3edc76b6e3f990b7b980f9d472af717ab5637eea23303ff5457b0343bcb7cfc0b0849d3d4e81dadcb46c2bda1938443786c13076b14f8f2ceb37b5f9fa35a5ab4d4a87ae02c3dfaa9f4155a04db76d9b57430e5b3ea9cfbe7e2bcb40ecb395bd0de8cd56f619fcf8227b55f62930cb5e661a03b1de66cb4925e90f19eb30fb7cec69943e681146565dfc9fb4d313410e5dfb0e6dbbeaa1b9dde902f027f163cdca0db0b690fc398347bd9976a8c4cdd754b174866800000000c315002020140a0704e27048244e336dee3d14000b78823e7e543211c662410ea21888821886611084620030801840106306225403129f166f51b1de5a447d255574773b07494ca71e5a74fa46a2d01a8733a958e7c042dcac208c9b041dcd0356b869853756b89640730f2dcead0aa8dca4e86c1db262de5874b891283467e39954631a870729c776371c2428a6438f836463381b9ea41fd3389e496aacabdd99744c73b0c2dd56707491a277eea0026a7712b4360eacf0f75247a2d7d2dee299c431b6791071da196251bb360b7e906d7f92759e7082c0697879d8687a637a8761b05c70beb611377cb9a303afb56e246632f6e62a66ebb3fd205fec9cee33c3c56ffd2f39101ae46e34cc8de7dd69525c843f3d785da4dd0cac8dd1fb693d17967e6c77cae0dcc76bdce4d01b731d8a4a24447e494ddd826233c8295137bcc302f598a7cd26913c6dcc66b073dc33effbcc5d6f0678bc260fd4b27c57b9da6c2afb37389bc8b87d5d15e277edb6b79b28b58047a048287c679703f92d0322a61c5c6876747b33b025c6d3464ab8d0d5a43a4937b606d62f858e902980d0fe23bbc002be6d9adfe0bb28bebe973d61303c3f072baf7b4c829033261e49d598a9cd7439dc2ccc678fa33f1b8c0e7215f3ef779cb0ebee31859727f0aea7362d24eb5b687a63902d6cda2b6f19b82080eb49537220f8ca0787c4d37ab11992d6eab2a2abae6fdbe0c1d5449f896e56c13f21112a800451af998825e166a32fdd2ac21a214805b3fffd5f5ee91e1079eb9ff0ec4c1f1c94b0a881c98475511b052517a4069491688e6a5e51321f0abb31a9e87e30d7b107029f366603f5651076fcb16b4eec06cc7af0dfbec48dcc496035ef992d66cbc4c9961d76db776f75206feb73fedc73bec0e1784c5f3b81c0291d5c8990d78ffd71b6ae4449ab399e2ae24a933f7a0b3f28a88c11bbc8820cf177bd687fe1506e3112346f81e9ff01b93e46356fc154b1c47679b55014dab6fa120b161120d54936a1350df3a171ae302d020b45d8c6f4f7f283942888a0ad5cbd33dfd1cb4ba04fc30c4d5d03c50df098abf7cf5bef0d07020fc93c77541816ba54e3ee7061756cb803b0ab727160cba5d350b46d1770d37d8ce35e9b1b5a179ebdbe63896efb359ccf979d4c32e6467be09be0cbee7a9e74a7f705a38b693d10aafd38c1980c7e96e592d7b96411690b7336dd4775893faf0c08157521c0eaccc74038eaa20f99bd82110a36c725e2b1c788aebc90db69820d6281fbc42d9523866932999e5d864000310a54a77d5223a1c7a15850f10f91e37813bb4619b2a14d2e63699c24407a92bcd569df5fbd5238aec11bba3ebdcf25832972e55ae0b163d504099c4df567bfa796c7af2c870c4e66fd1ca2140d40fa126de598dd9f0afd39903c5b643dcd7dba18b68268e5abcb27ae0a58d22bc0a1e994cee78a19a008b8462cb7b8896ba15d406f6b9caf94c6e40e03be6a0f5bb31a5281a7aade6f6b3f56bafd2115478529339e6dfbaf22db0b8aa0d04ae900fcfabc6c0cc5cece6ba2c2ad95f5912014c4cf71e3776c68f2635c52d3d9c7b3f20d8d7846bd930f390db11dfc129c1fc5d73b2e9d471ee58bc467ae064ab2e682208e8fd7ea1933ca553c24bc453cf86eebd912c9a45da6955f7a60eeb5dc68b6f8e4fe3a045c4b6c498b41a16a8b2f99d82896c1465a55008b0584a0a6b90c55d592c4001f9b07d6e4b97c808d927d6c561b1f0298d497c47b56cdd0c7021f1b8a5b4c909de45dfd0ab480212f96ab7364a38d64ab517bd807be85dd8c3a65d04ce80dc609777b15625c8a78e2ba076f72a5d28ad6dbef2542321146f1d37761cd896d5f138ab9c8a061c9d1173d2d2ff2f6b8503ddc3c51bbb56d6ce560f58ad70287e7ed28e30e4c5c6232ad6156bd74332d6cbb2a7c0be5da16996152b2d567af5c3af3bd8e27fe1554c89b8a9615bca580d04ed0e86b65a8ebbab955899184460ad5e59e0edc96839c051659440762cb481aa337aab17d6844198d79a8a3d6ba4b802c4f26cdbdf7680eff2e879cd34989607bfe075a7755f15eeaafcb7d94e743a5b95f8c26900c86fc3724f9f374e7710e2708ddb3b4f5126f6b6cf9cf47786443279d6a81aebffe6b9bbe10da8c58b8d78eb72ed2ca3020fa78644328298fc6d0bf537677f41792381fcfe6ea09bc3c5faeecf918669cc05ff8d6d42d27f7e240ad22022031f741fd257be29f11190d3cb1b59cbf13edcd428a00dfd946b438e16f8c7697141bf8d745a671c8380c7939d5aa352a1e58d7da7ebe43b99385c5e67d4af31ee115d4125beb2cec53cd8dbf74634acfa89b9c382560e99c4c65027e01bd9610363d635148e2059bba7fa367e7e1869a2a5160940570734f0051a8bd318703fdb7e4ce0a2a33fac855f45e5451a16d6a05544b72b1b42fd0f5b3d5cee25713989aa617d99bae1f4089e93dde0e7070df83857aa6a3168200e8afd69f74445c228065da0760f7baed4c1e6c2394e6f82c4f4107b2ba29081c7e9adc39c30016ae19005abbf914d49cd9d2b168e41209c234daecd1f82a0f9c241ddcaf21fbbedc5a553d663c9e0e220e7a44aa6700dc417d5ddacf8bf7cda5e129dab0c8d6ad122c94725440eaa8961968d11d3235949fcab97b098644323976cacac62905695009c1b86e47dd7a42725f36ade7a6b066d3c4f5485a45831b88b67f39ad2279787eb77018e3636c77c58da66bbf1188254b55db0194ab8d2396744bb60f80c8118328af38f6d630f39f87999dc8b60354ec3130765870fde15e36560f681a1d8694c876dd217ab6be951fb88b85e98733049002b80948588a617ad589cb53082560422ced16b99c0b77995fce2d1f76338650779312b1558804751f794c5dbbb9211aee851eaa7129541d953df0d3576df14bcdee7a7d58dc4a75c8af39c75e9e34c17631d0fe815d8e0d8b002e0d86814c99bfa638b139f9e598796ba85d70d2ec61a77980cd13de150aaefb268d2874a6d8969528b77bebd865603eb02d297fe5e716d555d2e5e665222943cea132ac324460517708853626667be0aeacd6653b740651bb492886151362f68385886ba8e9468bfb12a2e08fd2f6f8c125e640e79c2a07844dd566740111d232f97ad1304aa03c3765e004a8584073458ad755e6153154f4ca9269fb0459781052fbd9fd4db7cf7205e41ed10157cb06a802854d4e374464b715cbe2ca779d316980adbb42532e3407960c1607f21fe0ac6384871200dc60c56b09a5b51318ad598b9ed97cd2afebddbe89b331afe2f349a9df9ae5c057555e12f60af394437c22779722bace5530f409d97762e50ec7c6e7d9cb6abb5997a2239866b68aa1396b80c501c177e02c4b3e594bb4bc202964e8edc201423d3b7e486afccde29933c7f88695e6ce5698b42b0b66f7e3d36eeba8bd9b789f94faf6b994520cf9ef48c0c0d292b301027184c136cda5ae8d71aabeaf211eeaadad4c25468876aa50836cfe33c6aa8510fd89df275b8b8e33977b163f31dc0235455112aee41c0dd9d5f3636c812baf6e58c5e908889a885896233745cf9c9b1f7e1bd933aef3670917be0db7811af86c3b84f4498dd37af5298ac1230c859386df90d6f6a156db3e9ce8691551cb50fa34d28d1a5dbf8bde6b550b4309eec8d22f5aaac80135cb6fa8a9374eff9407db3ff1d781f4f149391778cea0108215989c462c671a25de8548a320f6585b1ce899137e1eef83d442f513f80b8737236e2215f495977ef1e005e7096a354ae54826c7b87e18e4c07ef67c7be103dc026edb3ef163c46d10925f5d063acc9818c4bc59c666ee79e23f031d1b20ec2a5551ee127215144c528e5caf73ac295ef3cc6a925c2df72ebd735df085c40d9b1986f2e60dd967ea2e97304e052c33c997f04378e4d21cd8091e17fec6647908edca3a330d5e0112f91c96d092f56aa4dc1c56340f69d843e5a548832dab180421f61cfeda8801cc4225ba74823f769be5448196b3b6a7e6a89502671ca302c5b5d3a5333240c27821069c3570a2e8b7e054a65789990a97da59f04a3b7d9784616406a10e2b72a2acf8050ba53420058b07d3274f8d8dbd0f888e912bfcca060a4b0c5d8f4dcbabfd3ccfd63a03a02d6b9cf1792e67c4f9a032418d9b6179f0b3eeb85aaebbb8f266702874bfc318a5f8c9f677bba121d10c8e3566e21446f412e94afa91ae84eb542d435a52b590381fa4d25f4ff753af998974e31b923533d83ee0e11e44876897c9f3d7e0d4bf9ec7fe8e44f5f4945fd965fa3c93bc49ad347b91008307fe216a38a32203b6393bdb1a41c058c3f962d62c4713d8cb04c15ad3e4171b874f2ecc2f42b8be806e368425a0645bb8b86490a840d57eee74fd812e9bc82fc695663810a6cc42b5b95cbccc90eda8a4bed1d95077c6542d9e4b4a0dd89963234f1fb9a185f30c80a9d7952845b754aae2cc8f5dc17b9545db20c75a2f0dc0ec44e8512c77ab0b224014bca1bab85aa501f72cae5231e571c66aee11052360e614cdb6ebe8d317ed0f054fc923760e0e6441dcf92cc1753a20f9a9c100b977e022e9cb4cc2afb4ca47454e7fd6b53c91979511cb1efe85bd37f690c99925ab0119ca83c9bf727722ab9da8c7bb15748aa614534a3021d88590ae00aab09ec85605b089c585ca9c1c8a92d1fd142207939f53c52eb240c92e6a3ced966e2d14eee7f54640ba60c45095b694958dc48cac06b34730a3fdee5f3831e7e138c1e316fe141647fa6bd7accd5ac0f7cec8881d58e90475c1b207528bbe38502e91bbd4132ffb11857d35e1ffa6c473c7dc2217fd8b43814f59d3820d0649e5288d3ab844ba9c0d34f8774cb119d0fbcfd3df1b8af344ec84f00578c52ba1e7fd59e0447c9160b2e72f093b9d6e5557d8597a413e7aff464f51208c20471479dadc6154b49ee86cbe4db1a500ce5931f8d386666e12a5ec887c4afb0e45cecf7d12f4c0f88778fc295be9cff4cc5888698155b387143877c165d53abbaf18a059fdbf6a743a46de30b50550dbd6d14c06fdc929274979d1ceab2c90c28d0d371c8b450ba147c8e4bd69071af50a3de4d364cac7cf26d071f1826e47f19503e502e8db313d4809b003d9d6f8cb6cfb6e1dcdf23ff0a2479792fa0670c6e8784955eada53170d901058847f7a00fab681186e1415ad79d35f51d456b5411204a9c4964c70d8652b720c9937911e75695383c8267b17613039a9ea570a88efb5f4ca3683dc125076df9459aeda817dc4b7ebc3b78b7f9922c85b8026a1bfb150a11dbfffadb4c1d306b8a04ae2e0ee134256af6d6b6b1fbb8d13c1e5452043ce4cca11c5fe671caca1d7a98550906cc3e1fbd6edfd3b69feeae8a2b34c9ce8c560cf2d8dc620bbf1c3ae3e10946b0434cfe0f4f40f330fbcfa27f7e3f0e62e0523b9251cb985d7e71b16211869c1f6203bb7e53333c7930eb1d518f0f615aab669cfdb2c275b51fa9b27918e1209b78749ea060289101248a9ba680a410f8d66bbd99f83fecaede6a5087cfcf0a395f19bbfe23e3ca09dc947a43825202a0e0642e61c8ec120e6f5623316e05184058482e3c92ad1b6f6e594532ff77f581071e2afed9995cf42957b4e1c2a66e909de40cc129d3633ce3c1c3e838934198314273fd779d4d33bcea010b298ec776ab699b9b3857fcb0dfce0663db5e4f72ce01e952439b8d92893121992940e68dbe8ca5454db4b270205dc9b350edf0685cd163cb342e217c3b997440c8df514d6214d40fff0852cdaafef22f82f319e03f5c5ce0da6fc5ffdabc6eef1b7faa5af89402a027146d5334b829d3dd0a8fd1f26c97a904e68e445e61336342c25046dea151666555939baaf221cc0f3b6796ba09d0d8fb332ebd1604352d9d02c760625eb3c46da04658635e36189e7d179c38bcd740c4dade6826cedd06129fa405f2feac8eab0e485e627f63f65bc08aab7a00b8b9bb0c2c8896eef1b7ac3f26c756c2509e83607945a78f11189bd8ea15326d5efa02439e885db00e29df0028001fca6e4c5d2cbc5bc3b8fc14b464301ad4f37a492b447932c64fb50ced6e95d5332d5209694456c3e0d13398b1afad063c24ad6576fb170b1f8278e872b61f490d350902a74b5a20d7eddd9582bdf810e864fe03173ad4acf60242297b4910ba81339d57f89e464f6d02b54b342db3718a989d826809e232b906bd882864565e696de8bb734c8a2b6b89d00457a169211ec0e606e8c186b4044a1996b8d221b617c0aaf38f92c7bfaf6a19fe864f83e4ad40c9920c2fef22c4f53ebb9e6313673d6a17cebc5bc71bfa1cb783ba1400bb4e34a7c2787974a9a8a25e9d793c3a60907049892e539553712e5d3e905644a6f16594f24e45f98c9e4f1f9bc54642019d3db6eccaaabc2b38d15bba2c6a4b988ad85644056db4190bd0ff4aa9921ee9a2e5c3ecd7091f4f9bb66b211479240c9b2f8201338ea53649d0766754b2b8d5de82dc7e82de752c83ae264af7c8654169447657675b0c24859797bb28ddceae286139b6ae1ef32fa3717d4961f4ce09469edc4a5b5e81ccaa5c956e81cf79d5b761c980eeb17172ff23ee0c266000414b3812a796f412dadeb1d4b24c9305ccfb0c62360ae771155b0d6e2acb813c3038be6cc696cc6c168d6cd141ea568c5abe2aab6c29490dfe52d40596ef7ba36f5dbd797fb035b412be8e173ac86e0818ae6d8729f9da96020262c16b42d05d7e9b7f4c792b2613480baff3b836fdba3c0a7538328592b34f811f296eaf215101493c2f235d2a72244dc3c191be8864d6f43a7482ba81989ee5767403897d9320efae26ec88c0015966b116c8158ed28760836670177f63426e03777b657f62eeb60b49dc85fb014f084daeb44dad08f541095438a264a41c29656689f645acf76a078d6658c44d2acf7e1002b573bc46ad98a13d9d720b1a7d59159c1677694450d512bf3cfc62bf783980b3d229f6ecb0dd4765c14a0294102a2b7a8ce3be66331c5f34aae7b8228a9b44aa833a10df90b5d16c4e10246661b938f99bb4e0672dda74409b3a4fec1f8cbcd8d8420380b67748f27ea61565b4dd8e4fda029678120be77f0e2949a5b936e0ef942c754d8df953c9a9cbbdbb5c2203ee567bdb8e5c3fc0952ca5d00bda4bf60c777a3ded35c27a35e4b3644b42af8ee7c446f4b526782f1daa7b39a5c7eea5e61537182930f3e0c395b05e072ba1c076a3db00d19426d798d3f06501c840f73102245808cced580d0694ba1764af90fee0eaf20dc7df6d10ac295c12ae5f0523eaa516445d12406a8ed188409719ee27f5c433519b81b4e0c3888b188fb63862ba44b0e3504d9e641a301c2e32d61c5b302bfbbde30e792947ef37492cb95cc6b6e9049a7907f32f52fffc69fbf38e740004836e2a5022d6b9866c5b4aafe461e966ad37b984f91f23515d31f3b231e583be9ddddcff4f0d352944f237fb7648b1ab32cc40936f3edf23e984ec95ae5167244c28378ca1ebebb3edf72e94c5b3f59d7071eaaadcaf2f5fca1409ab6fd3bafa6e0eec2c0611292ab77aac929ccc5d3314ef178ca8a0dc184e00dc8ce05477e72791e19adf865b1e4b5955376615b622e9b71d4404d98c95c4f6dda0ccaa7544451e5e1cfa5a14252dcdadd2b833e90b4fae383d9b186ceb8531f1b4eac2ea0134148e0919a96cc93525ef083e570221ee87f4837190399b3ea1fe2566b615746fe6b5028d77b7182566f010472761b29520ea1f8dffb7a59beca1b7423749df89529b30d217c27f3be083e169a1cecc3ff538080a2719b20caa4103dec0761c590c1a8a4250d8f981b7c7077208eb9bddbe79492c8c34e50b8fd9307ff044e1ada08c0ced9443b7a4370b90de404d869aa61c873db4a58791977a00222279009ac476fa63b27761b76b11b7718bbb95cba438171deb7606582d19266d5b710ebd235888880e92f0a5f00f08b4c615d180de63acefafe98e4d024990136790a856a928708560f18e8a7474e346178f3a680d5549518e40bb9db4d13969da5c5ac0bba7f1468ba3b27b814a53ace409eacf88a4a886ec2a8294912f1d005d326ffbd72664b1698882eb12daae71d1a40f2f773084d98b9966ee7cf1708db36b012a895606afd2a29f9c2388739460acefe2097ca63563153e2443e79e16edc6ec5109e65122d92e887c2b4b2f8f63bd49c40c91eb64040c265b743635a4210b3897a4c6bc7fe1bebd8b4a784bc753189cd64cf0b3db222f54080ef5921510d8ca6dc0de649ea2ce9380cf79b5136cc757487d56441819bac4f51f656c21d9588dbd1d1ac970c5d84b8d6075475333c0431147a752078a6b7e2e85917c8a13303cb2bad98d35657d3dfb70d815687800c4955adccc7d3488884a72ec0c12cd770db1f3e4a2bda25d7f734431e7d7ec5b2c76c6bbc2ff8173d1eb37e741fd360e124dd7878a535047cb7ddfa07073ad2b1d4a0870ecc84b3077403bab3a0603669c5c56bd2968e7c969f126af2f6b6675c083052464cfbaabf07de7b7e31bdc431d1b2a1fafb703212ee1a4d0206b41a11590c424b44a994865593c8a4d7e5703316917aadf65480c92487585247ccbdcb3328d9747dfe2570398d3326aef51c071c20e4d9d4f08510ea00117f83d9d64c0980d2ec1b534e4f7cf8e20cf21c7d2033580d3bb5da3661d3e5087c9a4ed950f6a9d1796a5c5303fa0e0c0ddd3b7275c2aea080e2118f1a34c35ef12c0fb4e5e4b33fa1deb10e1b4be88c64c19502e4f9afdc3366694a18c13fe9486a98f86e68dd9f0cd6293301ab3dd1d7f6f406d83549cc54aebda7445848e57cf453b2c5ac1561c3895f1757fe2517f60b9b32b3a8e5b51683bc5be96f81e41826e34c77f1f2591271d8d534267c5f8c319c32363010a205651abaaba20aaa5fcf576d68383158848c025cd65fcc97c30ae0aa56bbf79f84361f7673f2b06c0310882d24a1ddce770f11b559d4ca417737821779fac53d4d65219daf698744ca3860d1698e0d1043de8fafd43f0d64066c05a5c44f59ec25221adb3cb9c86fcf917858ef3c2b65c237472cd7ab1980afaa8d9cdc230befa8d23fcf3217802bea63b94b2319e1454fbb039973f49256adba559266e30cb6bc373a3f0e28c1fd2eb03c8f101ec9770c70c2126496c880cf53dfcb8d2928a2f9d1da83869800e080e2f41152355a420d5068baef914f8fb7b9486dac064b0b52ea77d25cc3addc481dcb365b20b734807e21529b99e295b2b4e0bb1ed1a588e85e575afd5117b85066b73521075f52f2185df8c7ed3d270756a9052a7f3c8f947fd54f7006cad7561dc862fa16d767a7ec69f8c056b93a083011438f27619d7644627bb1501c769830e3d8c9f93559ce5768ca9bcbf8f35257c78fafbbbf36c7dca9d3094935402f0e6c46bee6a8af4112d3c78a6e40ac14b122d16e1f49a42eebb4f0ff78edf5bbe0491c846ac55bd6cf4e5d44f1287b6312dbf03218d198767d36e152aed9e21ceeb9597196f22fafd9f3ae53acc07b0a99757b7b2b8b6e399b4dee823c2e42d2c62099d7d15c87a61e54f9779e7263ef5e3479bdbe1879d9ecc279151281099fdf65375673864d814eb97f4e0b4d744596ada97f1e5dc2452d9fd5465598eb9eb8d914f46f8a500891b45a0522a4b95093e4e3bd764026341dba3be02203b62c71e9aea93bcc3c0192e3d4d2d1a1bed039cd5077243537ca16436207e4b96f244957c8beeea6bfb46e27903ccc143bcaebea198963b79cfd5d77303227324947764dfa16cc35df08c43f642086307879c917fb26a4d269786aa3cd300f4a2eda738a9b19964828fffb1c8f85815db29bf4c002fdb8616589def372793591e89ca6c0c34825129960212214b64d2b99da1986cac1163010b3bc14097c096880b6dae7e5c799df3710bf5026a2899cc7d91021f146556f2bfc17b5a46d30f3b13bd03723cdc659e09c00cb5c64d8a944dd007d68480d5f016d4adcccad2e1951fe96bc2c150bec5ae4f5644523485b46a2bf3d390c28e08cbc669da3bcd5a962bd2a6d4e888936961535f2eba46bfe1135ca53b009a2067ce04c7c3c99ea1383e91f24355c0c36a642bb59942d1c127be62d3e654135935fdf524d282f9dc25bfc4deaf63c1f919a5ed83b15c4f8d8186ddee3aa84c405a19d44107edac4499d61db346aa2190d183a76ca5cd4e94d46db89f01ea1d46c43de23e46ed40659c5e04f854ff269aaa02b09afcbc9ca5c87cb604f71212452d53c6e10ea1c15026b4fc714d759922d5e9efc8e8309ed121ba2d9b89891f0b7af5a6bfecf5ec09da21ae7b46cc9fd957c3505ebfd4feff6933227618f04ae0b15dcddcf5eb58ad5ee326411c6ab82880f351e4cf80107b7f6e47cad1daf79526f49a761034e81324e1146ddb4cc98c647923aeadf6d8185dacbcbaf1b25d60202d1f2a3167834b89eea68537812d1ce4ce567b1427dc6964347658193966a78ac4ac05aba2c386a217a4ee3ad83f8b5ca7ce0a5e9516b28e0d4d3603afb2d583dc975390334925100eafd5b9275787f9196338827f0a8caecf9ac2d67e049f81bf7e22c6710e2fe19cb0ddd178ce69b603cdf569705f6d2d60ccf79c47b05dc888f9ac2858adb855220f41a71b00bbd85a62e51a532c6ec6bcbff07fd2566f5c1794f1db142eb2a9cdcbe77df8a79e08bd86622105aa0121eaff3130e0ea9151b5080cbfe2c8e5861a193e986ec9f010ef4cf07d800f7e964c7f96029b260a1c35be05982db5a7250b281e48f3596a6e420c6c05511f3e20c91ab9921d4412483bfc70d4db1a7d38c189ac961eef03ff7e41aa52076968b344c844536ec8040399e6fcc1683d8d6d349bb3d5e72b48a58dfe65d4c9d8d4f4bd8ab8691c906e536524f92092d445f6e690e30d97b99132c27177b7aa07fecd312165c4d09cb6ddd7d678bc432128406f7164838a96cda8bcfff9f911cdb6beafd1fad246f389d2b622bc8a289452f33a3209327e1dcefa814003f573b56962ace2abfc3d658660944a45a1d2b0bf35a45c8ab338a4dac19b24f4b43491d6970e119e9daaee929670d1bb54174cbf988960a31210166741dc9df3a0f9e5ae13310e7df1313776b50ebfe4128415643e36c28487ea626d94859f199c5bfa5683f5d3430d4c07c002c223b780deb34a6eaee4864c49de74626d31e76d47de94efcbccfb2733af9702ee1e2102bdc8400a666942f7d5c1370c25a9e8bab9d119b18cd6aabc708d72f32f5639d6d4656a211288d7bd3b1e5db15aa4b285ef180f4c96935c07ccd6c3c1290a2ade2d5d55f2fc19ddb4b3072f948a34d6a1fc494d5b81d5588f118f2a507a71822f893aa91d19d64bfa6060d93c9051aa9c70b41728ad4f1b95d4dc236fa0326facd24ac01e62f2bf7682b2af525bc1acb0a9ab27da30de93638ceb5e539d4708295bbf8e58ee2297f2c2b4455e4067117a812da47b704cd8b914d1219e079cbc61a99b739ff5a744db2830ec66a2a6b051d16f79256c1650f626b2ed3268fc66a29194f5b69444640bd52f5d170217b2fe1050b940b18cd195f0716264e288a42ac5b55d48a0c79f9db51d870199d5997b135a70462503d107f5eda6c5378bf848ebdcfe10c8ee8f2732fe48b9ceb49c8f7f0d3706fe884aaf9f01334ac4781b100c009a000230c7fe9b79ecbe97c879642bd84e7a319301494c6148b2681508690427c5159b810ef3c0c08693c83075633888109371eeb3a03e81bd4d7f37918f176df5e49a59e489f1b4750d13942f31c904a040972043efae9b267b7084ca0ef59c7ae64393934ecfd9b33a935d39638acb9842e161d8d9fcee0eeab984cbe896d024cf8fd537c7b085b101a264210ac17730994eaf166d13648c4173b12786dc49e2ff5bafce72249971e34cf52b4152ef0a9125b2b84b1592607a6bfa08dcf1f209974040ca3a825559e43e37b231b105641b783ef7b05c2c0807e87923e0c0b33a2b3f80afb95d297b4621857a131c0722775ba54c5d10463458d1bf37baf87242eb76b049984971542f350940e603b16f627d3d286ecd9a4a112953c493a3e5dfd552d7aba425411ffba43c9f579613d6f311d22449a46b7be911ae0226a69423cbbbdc52ca75d32ee567fd3113f6a446aee3889114c350c29a20069c9fd7795096b16249acf27583b6de60ad0d1b177bf39ab79b7eacffab6aa94ec2c763fb43b162c216aad259deb762f80bf29d7ad64a9a342b487b1e102975f772156af9f3774b0573aaae37f341f2dd6f16c8aa615f3d7a4ab0425fa40cca72ca24225eaf6ecc6bb9ec1e237257e6e28aace60e4d5deb536344ad0cb547f0a4b8dab05fd29df35ac3ff0c5e28a538e04a582088ee1df59663e7be69367cebfee364a2c20f9dcacad0b1aa9002fa2ffe9c69c2de157216284ab9353f02baa2aea470dceeb06b78750ef163417d47fe33be0ffbd5ae04813258621cca3dbda7cbd9b645e1c048260e9bea03888a42941d3acf927605e816b5bd4c1b1134cf3af23e65581a6e739b0432edacc70b9c3ef3b99c82e25e67ac9ad54c1fd2950330a51a39d3511df7bbbee1d631c27372a5745b42958ddf7bce3bb5412e35190a119a8b7709440d855f805a5d968b816519dad3abc90b2553bbbe74629db7d058c443260816237d341bb5748c21c334181ff4ff9d89562920e58c641826d85ce73582203ae44918695fe2878cb746cb982090f8c33777009d0d58e8d6016741be3c667708db1d0861f623c2bbd5854c04c303672f0b9956ad4ed007b4a42853f6b3dfafd86255708e5df844cc04629e6162290cc9b923751b54ae213bbb1984084c5569a90db4bb7a9b1c9b51d7a123a542fa1d9aae28315e867903c0938f3d30b2a2ad076985ab017ad780a288a045e8452fb6095e590f28c0db828ad1875f70d07b4602c24d094834d2b17b4c6d3798f69ebd2c3b5723fc173c2d1ec087da70748586f159e0d4fb35f872b1ab10d3b826e33ddea230091078152dacdaa810c422f39a5f34164fbd324442ce00551dc2f99573f44c950b69ea57c908935334ffd65cbb47014aba9fd0daf1e3689d1ebdca0f8469ffb6d91eb71e1c8481392c97eeb69144946962c2526a17c6edbb6cdecf3154e81ca072d0ad77961c2edcda588cef4ca6084bf07188b29002e6f9f29933d83a18dfd610b2a0500659b83955e288a09e05649e2cc4b28104e56bb813e00183fcdac92f24462cd6909bcf7ac8f999a5495c3424d944c2d30eac3677ca134724c4da383e02cc011fc9a62aa4a27cdba3138fc9b96c7c361b4d19c4361e473e758f06cacdb3eb880803b69761645f67e2f2b47729f3eba0e3dcf543b0b849f54e54510bd0d30bac584dd3e5d6f7988bbfc66b9bc8057275e7a336a8b0484be50c510c3658038d8e2acce0f9b871ec3d9f0e46b6c4eec27e45d28906f766ebb64821c2166d64ff66504c6c08dc334f7cfed35c98e4c91f7b215d5a3d840305011e1158992aca9ed0ce72a3759c4d8a8459c132d0baff9bfedd6d138d5799150aa2d9a90f048768e0e987372bd94e9e083f739a41015d04c68dc5084c4683b44f5bbb565879a6216de9d624352375cf81da7f68deb407e9702807546108e618f28c7025c343a14f6938d2c33522b317e4c5db04f1a43a999563b61c317b353f8fbb2a20c95f2681b5e9148c58ad6af2ad911c204cbd2e1c69790317dcfb40f42c7a9c35de56a0e6c91ac5eb78b1565e14fbc589f3613a4cfeb5eaceb74950523d123a5adb9996db71e475bb1530ff50ad9ddeeca7b06ed98bee1f62d6fd2ad2e88fb2bb91a3f2943bb0cd8370fce765de031cb95d332dbc64692ba2bb03b2053c53a2b97da6127042457ec84b28436af75fee617fbb319cc84750de385cf19a6a13e3e34bc2c8d80359e7d713006a55d94247f1cd3c622fec16f888f2af7a84d5e1e3c8297e992379b11544f4db165a7aeda90af856ea2fdc326fca477d04272b09a3adc46487742000a95ead9f7457501b61c6218182b64bbdb6236f08e692b4dbd2a19fd046d9b765f72762121ae540c6a8cd63e92e5fa6361313acb238818e562a61427604550298a210115497dfab3101122da55feb4a14c54352a1b362c505794b33ee65ac77cb1ae95e16f6014bcbc882dd6621c1d6778129405c310909e1403602ee74a2cea527286c2e2b0f27ba6e81b327405542c7084105bda587b11b194557edf210b54304c16390658c7ed9f3d5c43b7ab5b01ed0c343966ab8c91b33ab048a5436af848b3292a516c7513d5f48cd331097baeca1076204e5a0fc929c55d004e9bb07055f4bafb9ea0cedf274ea9d08b4cdf0e3145045d34f338c41cbae5c0c61b53efd8bfbc6a16121224d762d1689b27d34267292eb24de9aa004483b4bf5f4e2dc0661d7db015a00e96fe2b70c4c1fd16fd43e9d21f6ffa24b44cd4f7b2347482add8a7d2ca2f882ab126c1151ecbae296af981b80f90c7863199c443befd8f293c6898581e7927d96b7b301d9591e0d227ab71b1a4615f9311417ed2bf1d701c3c081a81e6f0819287656620fb1baa38250c90a4cf22c277fb187bc9f35699d1244f65995fd09e3a9bae0352c2e7c85a92f64be21615e7e15e460aebd837803d5f141a283382091db045eb59c55149f10d76c184047d55a52e5d26c3199eaeb04ded3aba29b17f0730041d008cc183a031e64e0b0e3008458e175da8b5cc629dade8299332ab6102670bf02fbe4feabae4bbadfa2a7e1b0c48cd9b22361ad56834155315694b3b1090e7d37f21abdf8e6daf50f39f1dea6eb335122c2400798ab3307386150c1619e6f15691187e7441c5ccb971668bb67d313cc541c0e756de9c1b59824ef18a1ac1e605faeb5c39bcb868a2d4170493d77449da0c7213ae74df6e483a85bcaaa96ba61cce531af36f6049e6592e39045517a5e126087ec7f5fba901fbeccef93a5c4b15dc498c1c962679b961282cef7781e8f4c92000fa0c12926695fbffdeed4bca1c7fee7358f659798e0eb27cc34d00e3740b15c27ff295e635fa7a326c27c633cd22e36ef13bf97e97d924a6160efd21c058f142471310fb8501775a956f624522ab1c326339c942c0379092ef7d978466adc4efcc9cd0c00d4803400ef54569cf9e1c54e5017014725af1e888410f3a2d718b2ddbf0901e86611767ce3e05343610bf01af66d47e6c0a58b63cf0b41de3ad0bc1655bf5a14bec1d3a7c20436e6622252523b1bd48b6988d917f0f8fe5e60163423597eb010c83e35f4fc374cc2e482898705f8d7664d022da90800ccf6d4f46eb38bdd9ba7983022ae7f7ebc9677d1f880a3e203d62987d1f5ff924a6a1f2ac90b3a6a4b62fe443d44de5ef4489e186ea78a29e064545485dcb732551539cb9fb9435e4c3924af517572740d87dc4588a46a7670e1d4868e1f6afbbeae499df1b7e9da0582dff08270081cc079d812078f0d1402c71711a7d2fb0832eafd6741dd4510959d7cfda9dc4ec6d7ae63300c38cf99b6fcd67c4529db4d3c515ab5005510502e0edff1ac8a2b7d863a8dcd672280af758cc5be5e0f83ae63c5089406c4b417c939f09a6af0450c5badf397f05f07660feebad748dea874828399f8d3a24001086d6392242729ad83edb2271c826e50ac70ce2b5325f0a920fd9b024d50a4be3b508cd623956146ecc3092eb3a51e032d6e8fae6d7e391a4cd6779c8fc866d71e6b55194913cbbd1b57d3352de5f513390015079a322ad062708f0139dea92661e7c69db9b40a5662c34433c806758ae4dc91b4bd93c492902e4e209f8d08b027b28b7be06e2d96092b48dd2e488c09e5e6ead1a7f743b15d1b5b3f57a5caab4d1814d90e362a511395f7ad29580ed0c125280939bf05018ba3b7404dd1b5864111dbfa4c6e835142d1148e3b92b4fe4c86d8ea46e4b0b852a77ae254bc252d31222df1136ec37e2b4f6a564b983c8b02401838350e84f894cd5fe3708c4011da858d97a0d28a250b7b39d648512db4358935ce6c5dcaba1b82b1debbef60985f4d83b26d5687ab7018634bf1c4143d74b8a6e5f83b37887f1c0352447ce2dec363ecf235a0f57d6fdac7ba421943a8671c751c91c5b4515f03c99615097591242721548d510d353ee63057c6f31c42e4f2a9eb52683093fadd029d0344cf5239e70395821f590bb37023747eaa7ce2abd603941922020ab753b3de600b62fdd18068e9e2cdbc3c748a2679591f274118e57c3715315bd44ed2318d44dde48afcf3daf05b393b2d2ae1b441331c0970e73b30940221daec7c3bace740c2ec086d2c21dd7e3ad4ae2472e9da8c6e4fa923d8f4ad29697645588748b4a032aa2db79f2b9a937eaaa36348d04f19e608bfe148bf6ac1dcfbfca93a526f7127f353ecc5329cd1aa996007db9c7e446cd1e7b46c2d1938a44f48a931a30e61d3d259da53a7a68c9c82156f4e10b7d5319122576780396110328d91c2ba5bd8d69fb19d0d15e5e6b2c293402231c7842d458a866dabe772c257360e2a8d6802e0b28d32a676a50ea2b641b78b7911d12f2fe529af229e9f9699767a0d0a88a6db37880f39ca3b6f00baf117ffa141a2526c770d2ff31fd0d9cf10696ea2d07d84c2e99088a0b0206ec43460e6314e231944c271d25709c1cdf3086c1d8475245d22571755bc8724779764614d5fb626ec5e5a813c064fd6b0fa83d6edaae00cb51891bdb73aeb3a128b8a5d6c39958b318ec4e342b89d0fbbf0e3b4f1358a5b959c4f76b5729ea17446749028064a938635d2e0c30923b950d7947fa52871015555ec27a7356aba07b99e2e58064466171036fbf7a057ee791540145adbb741fb07bd9045d4c46002eb70a1914dce5750bef65ad2f42fa4558d73eb955fd5c7bd1c05f2267ffddd6202b17900cb91e16f7f02accf9d123c9dce336b0623fc966183448e65d6ad9dabdcf0eb65cd6694d02aef02d10ae540ef832f59f5a3a18fcd56097c8ad4f54a14314764f63189266d6ad1855f34bf81910fd24afd68fbe677669eea9f1cbd69242f49b242d3aac589537c2f3bf011f349121fd71a1c0ac54cf75682db0434f8cad15c115113d90da957534c97ca3ffa45a64627ea85f7b18e3c201b4f89585bffecf338539f3a97ddf07413df0c9dcb02afe51b2b505d4fb030bf17b4e85e1368deefd8161db96ce6930f5c3edba89b3e9b915e748825f2fd808552b822220c03310bfb305019e715dbbe7422c62e058b361d3cac647eae4fb241810fd13d8e82e7994104ad17d03ae8408a7a04aececcfcd74fd40b732a17ac9f3d23a63152b415eef8d9c3370baa57cb58676e9bb41403dab9be0ddc9a7aabede4c92c45ee9eca97f5dec6884186a47b4658cd9f09310d9e0e02080a8c3cd0eef2134e92f32b436be0ba309124c0db6f07c99269c7871e8d912374d7d3d0a9b3ab39a9e717264648d202151d7dda070bcc742fa420940298f0baf62ca5743311be7566c0e86b61fad1de4280142a3428c327d31bc3a4c9245e51d43fe55bfa7c69104a3e87d05581c7bb6d283e621731afb691a5b72b825ba6de4e2c7c6d803a0948bb7c4b37e36e101214e658e16ee3bc8a2811919432ff44758d630abfd3d8277f4a0fadf1f1ad233d89ac805690cedd86d313a63e69a36c0c17d1ca07cb0d764b5dd944ce405d10c8f6b84596d3263c6ad5867a3cb2756c760faded75b952ce36d597d663804159a6e632f7fa69a1445f7b1de1b22c64b6fffe49c853319790f810fa96f24a89908d3307eca03d86c719c8d10ed0ac334ad10734122bd1692175eac5af165dc0bf234368f907cfaf444b863512a33b551518b5b8c7690194a3d1899af92cfd1046765dd0bc6fb5dddb57bf562537f739ec3e1cff540f5714ba736146d9abbf1afa23dcadd7e5c092d810ca16fe9e1c2ef037294ac9a8a05698e6fd827fe6b2f889586d05914d142a72abf6539b4218b753c544cb14ea39053feb1dfebb5e29b9093f381ff063aaf741ff9fa903e88718a6b4f23e22ccb6e3857b22858ab68d38487fea61c1e4909bde08e6b6f88d8b6990aeaa6cff48a96285d3d7ff989dcbb79d7e782f1d8e3b2ed3e518901217121a781b7ba7d1e40c68bdbd517c44bc06565986be20fb52a76c7ba98b3a88c37e47009e221a132137f0732dd8be47d48531501585391dea7710f9040b7b10ea91769054b6bdcd7b833a9989f2b6fc33109ab7b8c2bec98a87854c4e8d7ba4ab3cdaa2e11018c4b7966efd6554f453eb4740b06c94ced6558b5cf46c242115b7d5556e9f2d1a040cc12df425abd1c0bfb518a9ef6214d091dd8ec35fe4bc13c09469250b216cb104b885d9e02df672499e32f1ff7e94f30bdfd34065202a245fa1e54dbbf382b8692874beda516c1c66928bcd728254e12bfc4c8fba4c46aa295a2f3563529de8a7a0fcbe4154c41e514ea2748bb057003777931aade5af56ca2bc1e8b8173ed24969183ca9c83db714794853b0f07562ad0d3aeafecedd551a03f3a5e8090012ad2b2d276598dc1e8a8681b3addeeba768f8ba0ebbbee1e6fd6433e16cb29181e9d4209b2bba92e58c4c044ab1d8b6d0a00f292aa61a1f2f694182e4193957bf861aeddcf8d42899e53018e2d5abc13df20c408e003b9af559faf17fcff21da512bfb838b8e5edd138949aef57238bf3301a4f6e10495f007bd7b59db6303c721e2f2512d025d1bdd0c2de51c5f72c5031ff12067e5f7f0bd6f07e39d154b8a52d12de32809befd8898306b278bd07043097f2317fc5452e37bf83e10289fdb1d978fb832759cd14d1e624ab23522ca872971ef5ed2cae10d66bbc28d7bc49a8922ead76c98e88878210a2a69f242342c1916970da22a494ee8c4628a2ce81ba78b2c3c62b98dc6a1d8908d5f9117406a03d175ba6c1f69de68c5f53ad616ed7d2b43db7f1c8102cb12c75b04b85a96e7e6c7513191be6c06e2ab758d2b6aae60ebd0a5050a2858c7c8f434190fdb1faa25f1e4d6ed5a029acd84f7d2e2bc46b3945b76f5f959cf5e12dd4f8a4177ab6e66f085362e964bc720aaa36b500a4b200b8b2c5ad1930a2176c96333a39933fd18c0b903fb1a855cdc6f2180964d703a16ade09dd2f302fe2b5e4bb9955bf0511b13de1a80d20f8a4e56b2ae5cd7f3b9e361872d687f9a5bfa55e61ab87bb3dc1548e09b66d8f7855522eaaa25632b65205c29fb4e90fc1009cb1217cd18518c981d0f835a43a38cfbc09f7d881760024a7aae71aa52300561fba26c17cdb546aca9e436dfb01faedfad515f09d799e9178e961b5adcea1499100d04036c6a7323422cb20ac5eccafd68a1cd8a9e5363bf60185293911e2f16d84ae8b8a896166eb456d70d4737a5d2a008c6960208acb8e7c19937a4c79f73584977457be1231d4adf295b904d01199e530c70dd6f79b0588d6ac94b55190802951b509f52e8a83315654f26432f596ecef9ae4802df340cbcb9318a888c1907e91383265e87490cb3f7f1f10dc5a8ce6017e651b84d4a3ac7ee3eb69af80d31d9433a960c8b04a82ff041c70e480a533faf274456259adbd3996942f8a41daebeebb4be5bccd8cdbbd2c48725159ca54930c705997a9613aaaed64de53c4513586d954d001fd046c67ca324657cb7363ac8ed6aba4bdccadbe9c84ce1e5d249bb757d606d51afd7ab258d741368a6beea96cfd140bac0e72c29a3f143c8814cdea0f088d1c41556d0b007da7fe3181996a74418aea8926881ae67adca23e67934dcdc9910817e91c8a603bf11f879fb32068f1f16d1837f6669036880276d0d7a4da04c9595933883d7352becad129a05b0dc41ed1d61888239e6fb406bc2481b78db14505f7193533032dd13f369af67b19bf96a4266052606ad023e88b4f51c5084986ba36e8384e0608aac3a9278a43f47b0fc200dea23b32efbded1a031e6067746201f732c2d1128c951e23e604a2cf415e3058a861d9844d8e3268b6ca53e46c9f53b44bd5ec933347e4e95be43f58d7505cbbceb3c48744145bcf60db94e40ee1f602b2c61aadd735d5b8c4c7a7fba3d340fe9d4abd64cc15440efec726d42518a688d0deb73cfb42d5edd5b6f8f2e66cadbe6519eca9d6a7db00d6481fb6b82c5b671c5ed2a0df22e95adff513328e480eb2de352eddf1b989825c6413c07336834a5b520c576edbaeea0f86549780a6d294c3091cc4b71d240555ec870652c02184838b9ec3769aa3c1fb4ec538758285162c1babd64fe8dce17c470541bff5aa129970800b2ad628585015c0a462f50d6846bb1b167651879e1b7faab2549d94206bffe7afc9a4cd0d409857ca5d40cd2ddd8fe4774a55bfc762840a77c8f90a0264144228b901a145f8fff52d47ebf8b5099bab63b83ad68ddc629c6a5d8d637f09d91a9e66c5abf56b007731161dea5b6ee9a555f9fa84a976f1f053def905ac21c82ec6bb6893e0fb8ab8699323f1dbda3213c9953c85114e0c77d979133ebd51f39e502e6cb6abd88615e9b2682b42853a8ef27629791f77e9cce0d7be72c22e4ec41720b773fe1b0ba929ca5437bb688a9d7606ae7d099c25cd509722c6fa7647b7e5096e2e4595441f1daa2a0adf512dedc71b680f3dde536843cb043c899ecc554a11ed499f8343ae708f4def971c91a85ffb57c10469ca5ae0bd9e1f17a54c4c9be6206d9ac51ec1939a89d5a8cc1da58bba0dffa6a93bb549081fb279d71474a3fd5e06075148259aa971c4512582bde1f27a52c82b57bc905c40f6a881438c2a5764b426764eafeb53708c61bd3e7281e49e96d498d8e78f16193199ca5bb33a2b99af360b13d8df4d45dee5e10dd51fa2adc36a0b1f31fbc9ae4c0f2226df6c94580b65b1957b436fa24614c075a7f1c758e2d2decc2fc5b8eda89cbbc711c8f1757e4dd37a1da1970cc31fd5a9891c35a23692bc610ba5ad9ac2d06dc60880cad25e7578c26748eb60c5b5a96d5d07501ed3278a3e3e6e7f476e71ecf3248fcf7d001a8a619d1e6751bbcdef7608c822704a455f3b3f5ad13328781d7ff9e9012ed12d4b026a45069f23e2e8a9ebfe6b8d2b2e3fe0b8fa330f465d97151834456bf030ba3aa2019204d82787946f576aac9d9382c0fbb88d3b10684fb7d90446663fe4429397dbcb394bfcc4bcbc6b59865e0fde9afd6ad83691767b61beca66e12b0a451fa225e438a05fd32d7ff69664b70d961488e604cf3eef57b2860f258b2dcc34119c06cd7c521784a74edc9a0f867619c83fee8c33dec25333954a668080b719975a5d25994c73bf94c75d4cb44277dbb8a13de16fb138925b026e38d7903d29d059f0a2af5e40f1a052ec35eca4b4ec27e5ea78de4f82803aa422aeda0e7b4e7d8006751076cf830e974dd4e637a7cf4c9d28b0f1680b83b30bd5e7c787ffac639a15b4255a05c390734270ff4fa3264c69ab81291a565d538329adeb37db890ec9a518bc83e46f578c9e412052df137966e5448d91d9bd508e4c7e24a66e795b2020ef2a15f3794fe1a76c9a4b66063be1058cc6ecbeb5332a451a67456d9a0c6d1f978be8d77875043125639b68dc70dce9b9502577902bdcabdebe92dabd11eb0a0073dc5cd2b0005eb2cfa111c040234b08c6c52571111a733fedbbc271a720482af32762e2b1a81802e19dce5529ced24d6a57471ab9a9d337803a58dedea95e64f741881621d6872f133a8e9d1ffea6ca849c8136180b1d62194bc0f4a46a751674134062c441d0004bc9601a8218c698285a9648f76cc8c36ea56c1e60967c2f8c7817352b48213e59b9c4c2eb8cbac7e71838936ddc52e8b0c608d78c3ba6fd5b79709a73e82fea1989f77d49c9cded3c5a54c0580120d39703901ce5b5be0082c62ae3d7d5803c66f1a9e2cf5958152988e6d0abbee3d57972b89714a23181f41aa274b244e025a147cae495691cdf38570d3b8183b43143017eae0268341673c085eb11fe24e8de0cc501fa769559c601c1cdb7fcf804916a5b2894d02cfabd7ff2b4c5ba8c02f4f7041e61684406eec88c86d967d7c0fac01c49c010c9933cb82a34e267af1a71924f84023821ba38093aca3acfba43855478ca328ee5859d33ae98d5aee4b8c742b6e70019ccf77411e3948a6377a1d3ffe9380db3445358ff42f65d290f021165d8197a50a8cc4e17c169e68a2ebb5eb5cb4da16bcf0dc0f8636b1d583fba83f683fbe4c4f6d32ab051eb347da06feedf8c0d84d18c60311402105e6b208d9bbd9d5306ed562f7598798f40c5405b59e488aa9ad5680debf28f39598bc50b11c57f9469cecd08e4d868580fa0f087187cbe6707cecdf6d05f444ac4db2bfcb179b205a3dc44054aa915fe4d8af4fb3d96772358454c75c0ea0e31dc48991b436cec5a6418e990a8d7250c741fdebd57e52ecf86c5f2f83da7d2fe16fed55f6bba90d373c01bcdc01fa413d445f608a69690e647edaa3f8cbfcc9d2c45fc7858f4dbf756c0daffde362a65579c3d0a0f5f4d61b66ab55c47bca99acb18e8fd60c12c3a733139fce5982bf8ba2a4796eb14af4f2ba74873984a4a864232083b4647dfcb23591bdb2bb7b4b2965b6045304c60323744982652443c586132e4e2e8a884548617c8c4644e30b39c42234a07ec8a218a293212cc41986a4184da81aa574418285ec808a88e4649c7222818a885890a47c903f442ce4187fd018837e8cc420592cb108b39402489568a5cb142c31a888419c901f388d2c8a884490c8157c8c3b8842c8718506ed474c8cb1268485e8829014a48f2a52852e5eb01051118d9c8c711a991419b520d9f041fe202259c8213ed110c1fc8c49315aa8b1107dd4528c5faa46225dc417b09038a88c409c88554e6294224c48357c1c212261398ad010957e84c4186328b1e0402905d942d507ba88396019a950199beccf898bfd39911e30912928250122e2e00295a119501069489ad1cd10a3939f6e3ec923c9a79b21e8fd606b49b05708cb6906e03902123b627a1d3d79c0eab47604c5684b6754a5823b4201db8e5ac0ee5108b0a3135e473a56809dd68e766018b4172c324d464f48b3e1012896d9a2942d66d93cb2ce48c682fb79b1edd2dce528661b257960640466c4a403dd690dc89410ca771f487be19241b371efbd1bf743abd0759df749d5684c60c6186330a46da159d99b67265797cce887c562b1f6ded109b57052751919e9a5c5696912ad9626a1412dd301208a9ac4e54653464c680e41fce97049961541bac090b62065c829720a47e3fbbe8fe8cb0ea7fd711b7c2b222d445ec8a43da612ed6061899442d2f607ddfc1128467e60af20a770fe06c898beeab406444b373f048a90da5a9027dd7b4aeae6f7a3d35a10a15a90138288d02bc594af8030d58e9e826409d2854640a904c2708b51158a16b5a3a3138e744c09c92a64ad914b37646ddb6e6e4a72485966b02344146626830ca32c5736a86ddb9450ca71db867beb8063cb6a7e1649b7bfbfaa1456b2c8d77a70c0834cad878f0d726a830e84af81d74f6f6c702805ded3df2568c7a111d8afdf773f7c37187c1b10bc016daecd9b14b2bff730f8b8e52d7a938424956d4928dbde6cdd5a4b33506be1d52f4db2eb6f2fd4a298663c85d49665cead16471a715646012526514933bcf0cc2082d485c49c1f489d03988170519554d98e0e2b3160a87081a30524434ae843ac599233760a40c46c861301b3142a0ccb6933bba2e534e124c08cca49ce8010a9220ca15558a82bc8d01a0c62708071a2c0c701b3fa258693d230ab71562171468d3a98d184d41798a816158e6ca853359cf4c95980d965d1a5cc0ea52d3cb8e050b454d5757cc005bac4079713829997734b911e4595069c8a43ada1665142ab36ea450a0ee7917328cf2a92239408970d84ce86b30f332aa4926005e80b15d549a15039a3ced1e82c5b33a6194e9a04c470f21907e7ec8c3a17308be16146a16852d7755dd7755dd7a9505b68d2a5cab972e51c60a6a4a4a31a09aa637ed0303d51904638a9931c374e1652909c15c616a70d680c0953c4c8899015ba8eda740385c1ca89f4e264c08c47b5516b378c396766595a705b8d080ae3174add234afa254c680e506785d18019b501c58e1305195ee79ef194f073aa38310c0aa6a2684f37e4604307495fbad0d239e55440073da39d01e8ea8c296704b329dae4494690b3cc79bd1e2ac409130fec869f285e9054741d4b12cc9a4e08cc88ce8a25842edc6af680d9e76264e1458426b21f436e44603bda21eb42329cb35a45a686d9023a662dafbbac1dee4c0bebb8d6ca75ac82c09a7bf81eccf65bd12dc216d6bdb2f4701086f5ee3fcd758ceb98e7791dc418631ddb686a879f190e7c55a91eb2362aa6c326756373581980aefa9e0b5f9a72e327fc84a36a6ab869bd508796f3f013a6c24ff8098e32b154bfad37bfcefaee47db147addbddeedbc2d031cd5e2e647c3cd3dc3f11396c25258ead2a8ade162cdcce7ba4dbc7bf17e8b5f1abfb4198ea3c0178ec24f2b203377934a711c0593c1155197bcbfe1b14dfd8ab840a5c781ea92cb66c5a654ddf3a238cd3d8e7a4f039517685fa0ad5ac9e07ed8bee97ed8be7e1ea5a254607d1d5d5b5d3f2b034ab5fd6dba51b5828aa3b0148eaa20ba6d87c6dae068eab9b3de5a9a93b3c9546f32d4e4d584d6c30ebe955dddd55ab95a39ceabe09bdbc64d2bebf6de7b3bd8ace03af6bddf2af77d5eddffbd75b12c08daa71606722ba39b276c76e9787605825bb69fad0fb8e23a79e6bbbc6d56762907f37bf9b737b7eeb307d0821be20bec6ff661b582ed3b6e65dfc7f2ecb3ea0c37f7def69b5b09fba0c620d3cdcdcd729385691d045db4676bb3b5d665611544fd8f736d5f5ddcaf5c319c5d9625088a7fbf2d72b3d22ba2c577de361365d7d91eb4b12ec41561c1fd80b9b2836f9a28410f7c0b6ee6b15a016863b5562beb5fd7759d8d55101cdfb6a56912521b7673776517c5232a85a1bab920000e62ba2841895901648381e809d15454d012a5b5d25a6badb4d64a9378d96ab590983aad45f9f4b06a1294de5abf1295e2d09b7389dbeffd12b4d3129ab572fa59ee6ef76badb5726f7eaeae69eff26ef7de5b83aaeaf7de7befbd3e36f745b6372e230c338c4f7694be711e3aad412541f54821c4049c041338a06cb9424850839ad16fa735a812ba19a20610ba19020a548b510714076408553070118f66109f4ccd96d4708484a144c28f1b88c6221c514c40717a797241063da9a061ccb8c5cb98058b18c314120526e450930c212a8028b530ba20342aa1419e208238c6e9c50ca7174f9911852fa408342ca1128f38e1a164e431848946bee082f8238511c909630b19a20d314050d28345090a72079812b44c89a10a14159ec62145c62e47e40c1ea2d39048e606b9828411840f56480213694952fce4b0810da3112baf28a29628928611524592900f302c7041e104b261964353acaaa983b18798f1d545862b240952c4265223151232454dc70b433b5ae43861067986b002892c05242bc61a64c6d90db52c648c8a28a489f825097963092ac8061f1897e8b85143dcf233a280419a70c403b1ca111eb10987f1a886114a1512c813d2c72908911166348a50e4820a640f1b4423bcf021858cb0186918d9004718316a4b07328c00030f14d9c334222189493dc4212b8c1e048d294a1095802083a9850f13076490aa2b5cc6d80c39a6c4a525311c79521a3ff8618548a4c231e260c2d8738a4c8ab8e0a0888a3263645e461858c81c53c41e4cc6a5a6314a883805847cd10259c2c642a3d3c6349a7e6e8831ca408485d885480a51aa2a1fed3c5b073fd7cd5a14d6a29b64733a269bd36473429e657f97eed265f2429e5fb6ab15d83aae42411667680b2be6ea1049067398737347835ba64cc9c1fe9e06953cbb76b3ec367fb3993821faed66ed6696599cee6b4c926a505db239660d2a7ff4fb36385159fafd2a64735cfd7e6502d4efd71fb508f3fcaa2034b865ca94453033dba22ba20615f5fb7907e4e609afee1a74455cce3f8b739bb209329afcca270d0d474343f3f945934f1a9a2ca3a1a1c9b0fada34f5b5f3f6334f6d8ef9f5196e6e9a9f793a93734feec93db9270718c4f4faa2d31a142b5b687ede9befed7d8d4bc7ecfe7b0ff49abb9cbd5abff77607769ca73337b7ed3277dfe940cdae799dbf86ff88bb5da696b19ff6ec32efcc87793f8b6b9f1aaec19dc9bf5afdae613dabe39e65b278cdb37e6686b3369aa796dacd4d1aaf66b59f8666ff36b3edfa2ceefdcaa563d9e2841de466f7f83dd8ff3ccef5f69500b4b78eedbd5fc3b696b1b786699fbdb79659d8fe92a575d6ac6dd3f5b3fe63adb86d95bbeb988ee9988e7952a214f502745a8b02eb6077efbd3a1ee8d8d39af599a5bfef6003c3fb0bd40efe089b7b720fdef859f8599af5f9859fa5f3a9c3a71deb1d9c5fb502fd39cbba59ff8465710d6e67991ee83a1a83f0f58fb0f973f5583aaf325fad586f6e7a4568fcd5957b2a88cab78f9b5ec7fbaa7a3f806019965ff9ccaf2ccbb09c35507d699d6bded35a6b1a57aec9b6be724fb967ece7058a1494252840506a4f9edc7bef35f7779f769cbe96d1efc38dd2fa94d25e294869addb56b906b7d70b6cf4bbc7187ff8f1c77a56f838ef67cd7cd525742c07b3e5e64c5ee99c73b6d6da99991773b7ab99196e6ece5a599d437ec2eba02d373602cab0fccab00c03323f0c24fb3c597dad80641fff7ebba8c5d979af70cef59573eec93db927f7006ddb7d79c2f4a4c6139f4e804e6b4eb23ce90be8b4e624c8bbdf99956f9bbffadf67ea68d001aa2fb8f5f6aff213d6d432125f8bf5a0f7fa57f5f430e7f1ec7eebd1bc8731375b1d7fde7f2f7233cf7ccb45edf7f9695cd47e98314d947d631b189bc54f78dd7b13839a9b28bb177eaeba84b9a31372b36e0fbe0962eeefc775ead7f77805c2ce0d6deb21e5fc638884ca9aa6653d64d500b3bfbbcfb9c0ed123d97fdea02adecce7c1ca761d8a5a33916c761eeb187ab876ba843ccd55de2b25aab6156cbe8e6b5a1b5f639edd3cd5bf17bd5622d0baaf63b7ebb7a6dbd5dfdbecaa3639d6cc565d9ca344ccbf47d10b4f606d5d070a0ee2f57bf65391a5bb30daaddb7ee6f45359c9b26ca9db98e596b35ad8718637c5fc3c07a06dda0ba1501e10f97015c370a2728af26f1ddbc7d98839f5d9804c6fc35e80a1f739d6a0cba9e7939e2629707b4712628aff85ce1e9a1cda58d7d2a295c69eef4044a12ba12d8cbfd8bc0d7951878aedcfd4769f7dbe2d88eb770ec8f4b48ad8872687b4f3dcfdafbdee7ddf2bcffbe6dbbb5df782784f446069e18b674eec118a6be90cb9ac4bef6bfec6d8bd301fcaf04c775409defc1e7f8fede2cbf040057da722bb9e7a60ef8dfdbaf55a1aaf2145eef0290eb1fa639f86dce062ce628e5aa8e7d70ab5bfd6a051ba8bd5f5d01cae912e07fdcc30515dbb0d3177cb687df046a073fc480d23a7eae6fbdea0b2a1d6131df9c760e0845b75befbdf5524e6d49637f16c7da10a58d6d9f6fce45efbd76e3e1aeb5af63cb1a9b524a6928857669c22e5f60a97b29a594526b29a5f4d27be9fd4bafb596725ec6c8b0cfe6d84e71deb4c143ac2d6515b695258ccddbecceb7557a57f46d0efd117723f2a1aa2d99d5a49e6a5235a8964a123a26b4b3de083dd7eb2310fec98120d7320e82af3564d87a8655a87c6d1302082805f48371b40f9880e9ae4e6b4c9e421dde78bddd34cf304de2a311dcafca60b9aaec7e80599c57b9629bac7e71c9a214d07e3d8cb1059a7b58bd8e7eee35e77ef59d79a2872b1d9ac81de4f6e3d56e209446f5aded50d2b6f971967e5982103dadaa377ec384f426dc1dca20dbc4d93eefd67f1b5518d6fc7d96f53adcaf38f72ceb32f3899e1fa4da153ed539bb4ce41e7e6f47dc4f96eb75519630acac5b9a9559d90d5985cd98ca17174b6d2c00197a21bf70546d0a502d2a0bcd3c747db47f1d6773b6afb7aaabb7bdfd3857ab73ed32b6ef6fa0ab955bfc8dcdc18fd3b74fca9094a06a010ad0cebd8757df8fb0dcb576f54d514d3de9dbe7d2fbae8467ab5d81cfb7ddda3c18e1b5d72471a277b8e397863067f3805fe77bee3f4ef177663e815dd4dbe99db538f62f94d638aa827f776efdd065963d7c7d5d2baa31b06dbffa1537c35fad56abef56dffd8aeff410fc1137ef74ec3251f68fdbd8bd3b61b5573e8efb388cb98712b463ee017c1dfcdb63fef7773ae732f389ee753fe2ee74cf6522f7ce3ee732b74e3beb0674725aa6659ec763611c7e9c3d6eb67a186a988eede0a78aaa632a68238475e336ce01eb596b39aec366d6eb3df7f1ee37d7ab82d86a50bf42fddeafe777f6cbb99dbe5dced5e50eb6fd0b44bfa11553a70c9ebf31b4a425a6a627a98d6eb02f8db6699bb6c932345ad21253d39394f6b9524f344cc752ecdd2a6d6e1e871c83399c629365766d9536378fa363da87b69b76eb69499ba6631ab66967372d6ddfa7d12c2d0c6925c871b9756c4a29a437e66df2e995d35a796b6f924cfeb0666eeef4b0f2ecfa50d492b4a8840cd9535a57a4090023170000280c0805c4223992c420148eea0314800b6c9e3a5c442820cb02711404410cc4300c03310cc3000c023008400c7206198ebd0011e3f2fbf082e744f375ab1e2ace8e0608543744b8cc64ef6ced1f77cda025d48224b510540da40b806cc4fd3746d030ab2272a36ccf0e8265a69b5cfc9f0f747372fcbdff773594a578f6110ca1449fd5dcec143c0bdf49d2ef0255c8ac116798824812c0bdd2d1c6313b8c33fa032f989eb2efc433a74f97e93506c0bf9392d8faae3b9b9b69fc03923df692f7369ed564523af72cbd5981abe8770e3d41b815bcf364bfbd17897867ba09b635f9ed93b879018af5d841a2362b44448e925a4f6d82a5738be25962bfbc07ac1ced743cdd825a943215c69ed8e16c85116f05204f26dd6678b0bdf36cdb33ffe56c45299213d5705bb4c3d1ca88820095140fe210512f018c29c468264c1e4af6bf1d559cfc3165a48cdbc7ad4bf6621cdb6932ddec4e8a15aeed3b2d804447802d275ec65d6e8165d8931ca89583bf88b1a285ba8bf07cdfb859a03a813b9f6cb061cd6834371000b524cf5593d43a3091c449197f04d21696895ab6fc4eabc4f004c1b277c109f4065a59d575d51df9281a31f04a97232a0aa8f67b6ab7e7101b6d44eb35a1481a8f80d09043f32e89b94cfefea95fe27c53e7b2f6b7f9cce81d9695568c5aa0fae8a061e6c81ce164509fceb0f8bee50504d7d63bacb5303d2a71d44a5733d3ec4089aa228dd938777506e6dc7898ff332b16a70f9870b4a67ab8865f4d89ead08303731442173377179ec6f46b4c1fddfdcbd2ff826c8a6644f3a984d3c05c927bb88afdca27bbbbd0752510c248c36d8341d3333180a073df6724645dbd2b3ee768d7362cf48a81d9a2fdc5ac60f23dc9e44671a811a5a141e9c6fe9057b7e976e690de62c01036a995ecbc552b905420a2841686455d5e8133d00e5beb3c5b236e0d1dfd843cc9e5a5a1e6ec02d3bf2f48075ea03a18639a1bcb56c10af364b3fa398c3d6bae17b008f78c355d8b3ea01e158b711cb0cace4201ee85b186b3a68fa9fc15573032d7f7e2d85e9999c9aa8ce18f68b016c19d3ff754d5dbbf14a4258eab4ab09f5c6d758ddb65e31df8eb2538047d8673be8be9d913ed94b50458077dad8ddbeb11781a03ff3cb202a5a0b9577b7b8287cfcab194d47020fddd9a34e14e502789e75ceccd7d225bc06cd3b5a395c805590f74b6e76313fc6c709613dc25bbad12b8888f91a23098d2342904618b6fa836d99103151bbeb2a90415b577742cc9a592c0350adf53020bfd88f64c8a9036e2a74582d153b9869737547df30409a224e9d96f7738ece148d71e81d9f2a1e04ee8fd30c2401f4dd09c22c0e723967b74694f19c102530885185c7717aa9bb465b0dc5ddd71107390eb18996c60b24a1d7fc9a68e7c9b43a6196b869f5c725743af04d166a043f8ecc7572d56668763e8995b5122b463a3b494150fa9bcb54e09df323b90bce21101c45d98cdaf8398e89aa24ea83a49b566e67a19136aa191276dd57da09bb98cf06fe8362ec0e1703e6b048f2b31d1d3168e458fc9e0564fd8745f721fbb15b5923bd2b95a7c26fe2c239be3788d39b540c00976b560ea6813f9a76dc13c9ba619487a35092dce44c2703e4eca7bd8ed977ac0c698cd2b3f79aea67b66d5dfb8851b62faa7d7fe11c25b67ae4569c094e32d299059bf448fd69d1c5a768434f22f3260ef327cc328a4b9f092f7553da4afd422f058dea42f6a24f49a256b14dda8853587ee199dfce60509093895053ab69d1c14af90c60d0c852e2f551ddb18bff2291ed304dec4a84618022b33e0ed3fcec75a0d3e6777bfc37bc18eafaa68aa475cdc41827be0c671b79fefff4455a8b52d43b9b31f69b6827aa5a89a401360b6d70f1f0a5c7bce8a93a36f33f581c843acb3dc90108761e7dc6dbc530a959c128c271d7ea80ba1f46f10fdab5045d1055fe74d623279fd43618b7f041b0d47d11035e89e7e9a0191e2d36603e32c3e0022ee456ee1332dbb2404a48d01d2db83e70063b6a77dc16c4f9d8ed3b0d6eed16d4dce48d86a80fb89d04f66688352bfb2620042a022c1df5409d4e198cc9c1886d653a21a5e70482c0ecca38d6851d39fc098269c9c4c741b1d1834f5a86795f830d83dea895fa4111161dce33ada67289832e623815ab55e1feea504475bc1bc65f831eec6687a7bed0083f839065998bcd978afc543620e7bfcdb009d6f16c6d127bcb10859a957702828f10621b4361cf3e3875dc05e8505dbcaaab8f6dc454b97b3f812c61957229275df3a7d91a21358e6b0ad2e64531b841c0e5dc93ddfe450c6db45734b5b868a850246e2bf4ca84d30b7f5b7685b4d202ebf8751772b231a3f6ac2292f716e58e9fca6f5c598e06c85aa981405a349000403124790e08d14ca0d6bda9b1b36ff0fc11bb2473ea5d0e17805547c97284583a890bebd73c8406d38cb4594be8fb20eafd4c8ddac547e5e41769c7c969a2b47832ff484a2680b786304f26b6541c9deec6a62b13b0a11a59e1661a6a4c9a30ce8f5fc3a3df6163590d16675512dd79507a53fe88fd1d09a8e019b80d038ac8a88108d0741f50e81b293b362b644a0cc103e4bce6a433547dfa8d90e974952a4cb3af60d90fa03d844fb10e9fd6f4979b41b615a9c4d1b61061bb58579f821bbd702f0d211ea980007af71d346ac701244ded145acc40861fa3ec1b66f5aceae2e92b20b0fd660cfd25a9f81cbe7272da8d063ef548bae23c230d87e0b272fefbe66543ed13110f0d9d701a7c401eecc69708cfe9c427f18be4cac8e05fc71d95ac45a089ae484a91dae9eda1ea7b49ae0262cafcaf650e720c8bc0189338f98c0f57a6468a26188c976fb2daa69ef5c48ff9250e82faacd9919c79ec5f9615097312643e715503fac6026d5e579b0bce07c7e94cce2bdaa91605da42cf83ac8660520172cda853cebbb3d7d291cdae41aa67c3cc7b081e2505a5f05fc9d36b44ea31c08c5d830f67c92847463f1a7efc2145cad83c0c729b7f88f71e11bb9842ab6bc8e8f0866239c8dfd66c25f0e7a8a67f0096c37dbc10626b1dccc151e1b5a83363288141b982c70aa0537942eda9276e98bbf4573d5bce0eb854a4625784156415e6082c52a318f6d29e1c53451a23ea899902cc7974da179e2a22e15f31e6ac31b10f4974552bedf2eeb453a01354d067ef75200c092019488310079a3a8bef1c8bd52d38049d2744796602e9b6bf2154f156d269c98d22d86655ea1e38cc8fcf34fec43fc8df5ce40b53e6b9c138f6704b3f540042654bbd804ddba08dea2d272509a5be71ad619dbe2067b98b3e25ed99c4534414f24fc5a32d67825e43444d7817f1f928ed106979e65af5cfde3551c9cd2a8b5fd38b7efcf268a9e9211741e808c64c80dcf33ff1391b6f4a54c5c481e3645089362234a7b487e38fee30042d356a88c2685e42dbe1275e267d06669a7846be7ea1777c43a61f5b6df42c0ecbe60dc21757464bc4c36caf45aa8002d781ff58c8ad1b73866e8cde85bc0d2a61004a7cf45c2541776a522c70396acd66c487bc1278ace3d057bc5fb0dc86742e2ce2b2e75e978b538de86e19d95fadef881515896034611c80c05599319abc0d95ba4b67a2af0a4c1dbe10e496b4cb86f040bfcbd093d9f328ab59d3e9ae09c73aa62fcd21c5289e840aa6909986e4370905fdedde5c09655860efc8292722537ce744ad506dcfb8231d81b30cf9466cd01ef18a9dd657dda2a2f6ff3f0af1b6f3febf40ff2a566f27e6c0401abf8975d56415a8bfba87baeaf96f742e72c16334b5d4163b366d2e024314e02cd6820137c527455c0256b8015c6a5c3f809a659423fdafea5b56724ac545d003edf2de1b1e01ebab468d080dd55c5eb562f9347e1d2822c219a160bf07c27364004d224272aa44bdbbe06eacd8b5e6c63f90f5498838a0f01e7c5fd027260a4b59c6dfd94440c4b780b18acd08d51807f45c70cebed4ca6da40d1bab45145ffc5d6a08b8d900ecb9a49b0f35546f220c10f98cafca7261449f08aeef0e2be8c15c8602d62be6b9256a877d082422f2283a3ff6845478d467cce7b86dedeaa1a1f1aa861dfb973fa289fe54932eb6b23711b65b1eb17dc2dfca155542af4d06d3e14d2ca9a4c40e56b91280415e7c8f8257a784dfd77f58a9ac863ef3cb3511db35f894425ac9f1f82447abd0d31f5de9f939be42cf9f4f184fbaa99bca33dab5a50402c12ab62a1e5f24662d29fc53038300f035dd680807d1e79f9a64b7c2ab8ef31c69482ebac6d38dbad7166c170dc38641aec83bb8dafbde5c620464621fba855b0d60732b0f0a532e18f073439c1bd87949fb160e8cbb59a125161b29df07590639c4ba53892d7db8c5af3720cd8f4df7e169415e0730002008a17191e68b27f7e941bacf02b56cafab1247337497b492e15f3a44150c7eae9098f68119a0250486c7979b4e7894309201f54b9f907a879dc8155af29b410a8f4e0ad9e290b1cb7e7c291205d304e2a8c5b406221f50bb731fea1c42ad2b82d5d3ff65112c506a09f9ca834e437cb58bdfa2e6c5fa968ae24d06eb1722b00be55940439e068cda2863d084c9a186778330bb0a231f4b096a4ca1daf916981f0e4234d43fa79246b0a40e18ccd20d0f0562e7b33b8ab97c1ddc073605738c8954d41883769b47e23d529da194c9ea29504fe52961da1968592e345ed180991f322c2bdd4f4ef520c711786aba18f48fe956cf5cdcd8e2eaced3890c5b2161c9b26c56026e0745e0c25e833a326aff3c85649cd0c6d9afc3a35b329d4198f4301998a6928d02679d3bfe9dafabf840c8b0dc92f4ad5fdba9e26452696d9e9b1327baa0620c56a4439a58d4a3dc1479067b79436fc27c7e0057316238c107e4d76a9b30200b3369dfd9a848bdbec18e6602db63569f2b091415987991138ca6f26f2c45da32019e751673573e78b8a26f9e5f66d9f67d37d9d98083f0ed40a9dcdef5652f40b7a280d0453500baddd453cfd5737f4eb681bcc4393428b0cf2206c81b9769c3a628e4d3479bb31d7d5e720ca179534106140018dbe67d28cff37854774381cba596fedab3740a03b6aa26476b3e3b083e48a58d90d0a83cca0d27305792ee21edfd48d254622ef5cc8ce3a0f11a2bb4d2fced46b090b83fff766d42c32c22a2fc7f0802df7a2592c307d22e5622272be4a6480c30a66b650697de4a5a9c917720c9889f920b12313f4c91bbaa7d0d351922b1d83cb9e937e6a38fc3f04adac1ffd5e4d436ef5e9440146ef607eee54d94bcf921ef5bef155c6d2eb72d9b05e9462fdd28ce4581b85379752c2022090caf78d9c6071db55d0dfb60eb49627f4fba5447461fa73fe4022c0237f915d9b464ea804a73343c4ba20ff2fd617f128cd601a5994f4ae8b28172d188938b8af53d3ee4ad4f25ca7f5f065e5a350a2aaca716bf47cbc632b46eb022a407c6c5225beb2a27cd494da0324c5584da9354a390dd506c8b623b68ab654ae20c3b5c524714f97f4596ce3fc9e63289b9322e586aabc130e986b703cd318cd364ae7aa411ec8ca8c0dd093c72edd3e927556ff084ba808b44c07300fe2491f464b1c45f3c60435add20a011fcfdb6fa9bdb720f15000b9c563705a8b104f83952af0aa9a8dce9025a2ad9626830aebe128256e0c4ff5fbbf020e914325f0b977204de8af47b6d21e25fad2cf9e19f804ed35522194cff47bb8642e09a567d5225bc4072871d205bd4a001bfecd0d2ddb9a338e8819d6716cb3c9ee3bdb64a35b303fd8cc5da167df256e32dff13af156ea127872c4e4132dba6632cfe6f6e39576efaf44200c9f5c0f74291e0ecc9ee5e14b72617ccb78625c6a8492dc2f33c8fbd96195dece0a953ffb4574b2cc98ba09f69effc7348af68d8b52b4545379428b88536e79f7ad3a3b2cf0eaec072e52d9f03c699ab41f63fad818cd7bb1cbc523299ca0fbe5872ee2bdea9a68807abaa3ef0fef43a6eaef8a5201005020e2b0f797355f470c6c54e2fd9794587fbfbfd6012f39279b8eb2231443381aade54719c1820e873552cd72bb41eff20b22f6931b0f253a0a759869ca33acc47ef57b2503c362f8da203073e60e34eb8744f1310ac9d965cb92f1f074b2862f162ed1a1095b642b246f8fe3d8e610de066fc490aae0e72e4a13cd57ce54f0cb8a3078cba789a5594a9bac4070e91073f9da21dd63446566bd0af9ab4971917e756814bcc2cd177d1f01ef19ff3b91048760e368f3aa1d11b128ea59fd8c790f66691ee72f89f3d9c9c25cfccf215566ce52c43194bf29612882df8430b157630666de6a88d5b8f8c4fc0362bb184644c7aec9cd51e1e0d2656c17ee0bb0a392180ff9544b0b3f8d2046e4331821f1360ab5a21552a212bdc69698a2b8e951682e67928acae80260e39e19a4b61b1ae3b23cf981a51c12134f2bd518e15edff931085440b7f0e05815d35ef282a2577f39338a55a11651db331d6b98a3185ae98c5f6de926e08501d2a185202cff25fe00515eb31f40da201b44561000b0acd925ed4f8212c39214789c40363371627ce68f106ed0f0834081d59783d8e6eefc38e071a0ff679a352e1a135b6d89eca517b1e50727bd78bd0c67a16a4a9ebe893c5f066f378d22351c34702ef6d12e119be300dd404252f7a3ab11c2cd712e4712f86059890bc862574a04cea8d756e6fe56674b05a1ce195e94417c636d34faf3e36a5920d15cbb780fdfe7cd3058ee9126c797631a12e0f058697d9d6c1e0b992dc28cf7df79fc0dd92cd57f07e43f79fed6376c06cc603de48bb4b4d20a3407f22258d2e0e2624c53be25b6dd4d49bb81df183e62902433b2dfc63017542d8843fbc0510e8881121ff432fab2a3d3691cfe97216102fae49c85143869a2accf9b0fdc14dd01f1e0b79e90110c31df53617c1049cc511e06dc4d2cabeeef69c326ef12cad1078e262de2de093144936cb0bf3325dab86806b736802d65dca812097cff0bac63ddbd3f4673fde1dab0cd58643ca7132b04a98cfdad301f625f95a119f5e74824c1e9fb8290a474654c9d05d9506af1130da6a9626d964a69de2eb915ccfd3d3a7d86af3a5c3beca0018f188c3c1cf2c9d3453b88685eac02b5cb1513746cbacd8ba07212d1a055501491dcb0b2919b5992e1b06c7171284d0b56a57110fd27b8b2c967e62bbf00ddf0f730dfd65363cb9d2acce7897e411a626c79ea797f4b77cfb19e11ad75ea0c16d8d305dc7c8874f6335f6986cc1a68cbdda235b728f5c5174a31be5bbe96fa889f660e7b4c61dd5bbb3b03642984eb9c5588ef9433852d7ff331dd5b24009b4c1d9f268ccd80fa495425648000eb68e80df9d63bd004b00ae4b4d69ec2022880910965456e58aa22808a4bd59d461e5e6acd3ca22a273b49424ed9d5dca60cbb9e565916d1155084de857fe3ed283c209a974830169fa914a787b63761dcf4cce64609dd39b933111b45ad8c8b00cac5849acb9e9da220210c8e9de9564da3acecffc8a0688ed274487cac62882e639738b3d01cffed28ec5c8ab068e50068d1cd04f03a5b1cd31007dadf9e67390f2770e397d12e70b90d2191a5ee08caa36db5342ca61ed010b6d1fe61f25e0126f82f12ddcbfb32cd4ba3569eb94bf10aeb6c27c56c5302cf84516fcf691997b34a29eb3038f94fc2abeecc68db887288bc4fe4422ab0d99993630f387da932e2e29ec2804e516dc2e1923c61044648a580f97cb63d086a4ba1be71d54afd4c755d44e0b5a1dd447280003dfb78f02df999c22c2b81009a69406cac1393825f916c10278bde5cd14f2d7a78bf36bc923a901b417268a9ce4bedc2b53c1c019a1d62da01c5463283de3b6fe85ae312f86a63a7047656cd8d406d69f8904a0b8f5d5f34a2960c4b5ceefe80946e90106a038db49242c99ad3aa3a58b2aebf913c97e16c2aa52cec4ab280ae288c90c36a78564145a28182f3ec9f357a885c143372867c5261d6c257d6ac4104253bcf5856e7d6ec19e5c3e107910500a08563bf31fca6f230b9b480d84f9a0d8da9a4e188ac026588aff5aeb1cb0ab972338da98cd619fcf1eea0549845d4ac9d38fd0d0da97259cb9b83ae376f343314ddfe328b327b19c1aaa411f6d5e1283d66a8f7a599482fc9deda8e59822e5c378772a95287009aa195045dcc7d97137e42ecd07d4c1cb942e4cdc2a5ca8b96614802818fd11a7f40f92585642de8da5eb7d2ee1d200c5faca557fee998b7732f9e3876b0649a284f3656e035fd3272053eee2a8f96c0d2f9054060cb53d7c34390ae05214888aa9d548f850f0ac9f0bced8935c11dac2bcdf6158daf6b305a6eb28237bc86b6e3fc60548f82221287f58955cb4a5a2425d770dcfc6a291356ca2d7d5634db4a0145fdac2a4be8797e9d79d179b8112fdf9a5f2d548d40227f3ce428ad326a096c60534ecd04ee1a107cdf060f66bce78f1db7b1241d59bf5a5e28578493d8c4796e1688e1442ebe9e177cfb6122bc1ff6e3d0d572ece08141c4abdf3bc86e5aa9d931b311f97cf26db8b615494ac108ba5a96086faadf72c61b9e0ff26d2bd064e55f8b3cccae23d906bc966575196d4ae8ce09fcaf55606ac08240015cf9a72fdcd429ad163a597d91b3ba2e88b44a1826e1daa7b25aba4f123e2b36226891c477b060002a5e4f61b5acd7b11a8d481bf1e5da6e755de2a516683cdc65a835980d02e1c6e2073c3464666919a301c635301f8f7bdd2f26794f472df4802d6242c141984155831cd25794b0a3230377ffacbae001a25186246eb9072a0a4e414c3cdda95a9a922204351d3429ef24fafba92fb6b5986d9b5de14e48c2d39f8043f4c97458516be4cdc3480a87998b4f9b17b1e1d52c87030531156a77d3fd83ae0bfede010bb3be78a5b22fb29e05b1a3e9850ca8f31ac86c5d70d836ef24eb792be8a54d6abcc4b55994c6e5894e0528d342bffa903435824742cb01f462c2791f404a10589c34b02c1b8335b0d40c1e4c3f1ceca2e77b430388c61e6dc806320cf2cb2b6c3ddf58d77eeae21b6611c1639626b3d95c60a11e1b7142ca985f4d93671ae20542c1127828410d5cf71eb48c236cee5f5c25610f5802be28835214eac402e87e95a837a26731394b184b8f20bad1f2433707e214bf385d13db855f3ee11bc04cc3ec01167d7a2b795ba00081d8f9a8fe00964217cc314a49d4a7592fbd9ae33ea136ae15af658083754a00dbc44b2fab3515afd3fecd7d250058ca009b64a7a394c959e8464f5f34aa73a08415c83df0cbf326f5087a80bdf9573abfb2b2b83581efb8847b4173dbcca11d220d9ceed1bb21a281dec79c6c3580a15167ce3e15276b9c78868516c014b3bf12698c1b80406e8813aceaf213a2c5c5305fe47d6a77b362e02fb050b74b7b0530d5c84ad42ac7da5f7eb2d838fefa155efdc980b83a22e2a961fe8a235f2a18876e6cc103a64b20afb6ade91e18e6d6fc2bd82a2881efc41481482ac848de0499270efb9542550931116503ed4dc6bc670f2d619d81267b76e359c06e00eacff875333c9111dc9229c8497a6627d9fdb7b829bf1207a46a59fb7fe2b02b08f3e1a958c012e5577a65a6adf40fc97a44c9afc44636beb2e4772c870e523574aea8242e785f9c24fe059152b373981efd10ddd301b71ef41ee51a9d59dbe1f14170c197e668c969b5ffe17771f29a3c5bab6f3bd969a9f40a5e62bfc332631cd86a0aafd474fa58c2f1dccff5954a390800eecb1d44882bdf17b4e2a1466a392344061e86dbd9576a0c21bf13e23cc142897f9e407de5aee82461f7e10ed672e55e3f482a5f59d84547967fa9013acdb95deb56e4c81322e86d0b6356acefbc60b007ea5d71193ed20d4dec6ee1374f001e9fbd69efbf2f6c68bb3f59536e75cdf0b622aba5c2c2a92f0a49fe30c55860e520dfbc6a531a3b650553ba6d2d15020207e40f8aec8145e7f1da1595aa16e529827c0bdbee505ab3680830dc0d92ba7fb03681b8e3041e66537a0c36805339cfbcfc01af46634e90553c07698612128ac82d2b554c6351a189b1bfa8ef388030efa8c3ef045345956d0e60b44d804824b3aceef9b302ecbff5b8c00a50e9171967662ca249aadea98590d688adf08db47110e12eb4f728ba662287e9f5b65d3381f26e2effca9bbbfe0f04dcbe4a8bdbb3faaefb8c8da8c3ba86d3f324720fe9bd66e2d564c733b72f6526f2ed32a2800befbc42611ca5579720a85b509b57684f5ed4877c419795e8ee2979027d33884c3bfc7ae23c126acd9f0b993817f2913a3d7f045ce071f88273402a62cbc41b590c9bce03c5da71bf0b9be6e88799e39e4120506c120718db303e308ff80a89f6d0b4c3ec963385664693d0472a1462854960b22f798b6f0588955a08f3218c7b9d24ca5b7f7605ee0fa8b9ebfda6348edd03eb8db7e3f6c78fda08c57d0285a1b8f718415681bbe591841bb69fca6a9402a2a5868e9e9a284c072e9695d890a90c76092bbc7684e2fdd72295575c693183d4a2dfa972d6891c9e453b7004e020d02bb173638b87bc25f0917742c1436f8a8cbb03d46fc6f95f5ba0bd264c24fbe47313ce518bf396926ce93689cfb4145029ba1e1bd3d8e6502b77782038a766e95383b6882b093d1993f7fc6063ae3381eab4adc1de0042912864b2aa9af856be50ff445711a82247d412e6b4c472dd53c6014b42568fe7f9ec94a4650de10b1b4f917f79bf42d784834a9c752e8b11e5af789df2a1779d249fdbccf89bf301a60c6a419788b41d8508f22fb3a8eec6b1f1d7cbd74334e6bc18d472e7d3a154b2130ea2849354e4a37e30b257bed5c5842d34cb32119a9f2d0b216c4d1c1c3fa7b75f045d7f0b27682457c2f4fb778b630ac9787bb9405f56b7008de2ad3aabe40f2cbed20f76e0b54ce3d17766b4d0f98bc1c90de08217fe135b2ca5f6928cac88185a35cbd0d9782c8d17832964dce212506118f361e674e7a9b30018e2f4d5486cecf910a27fccfdee4dff2bf5970f932b5c4e436ce79ca7f39f97496a9ddefc596adf816af1e0af8e4ef6f762824175c5d4622230b887a99621ac3395323a12c41aeb7622b1f1c4746714ab8af42e26f58d48d65c41ba21e94184846943f14dda9183c6a91f0c1ff1ee9eaeea81dc55594a4cf4286e6af065e0664456e964aff7d6da6bf989be30dc453345615ec82f86c0a57858df1b75d964f07b7e382803714eb1a0f5a4849bf3e290543209b8be20d32607d8a0419f1ea160893d99230fc6104a2ed61a55d05eaf1d74f086d3b93f5bcace3a8994a138a80a2c862102a0659e351dd8c34867298e57a9e16eddd498956419ea248d6102536bcbbf9593d46f09c70d6ecd84fc9506a36cc54e39980a9e37470831915d47e5af29e0b132f2fb5dcfdf2ef569ef11403696d3fe65590bc7d258008b810e3464d14509c667db99fb87d5b5727a24ea8dcecde2e0f65018d91d648d9e88b40e9e837bc5221b3fd8c37d9c4c8ca98ea2e620e8548f27cbaf3041664d936edefc1e6e3d7802358a10d9c3b4635d8349f3958d95415b3d3c09a0229d67abcf4604eed93c1dc4d107d6b13f6935c7ec124ea080084c349373da28fe861acbf053a2da1e0cc81340fb295100d9d03ba3069c699321f61e0649173c5ba343c662729568ab0faa939cc57ae1d3353ab3efcd3a78f29689cc9c92f016c8c82d63df8a27868dde18c8f466ec1b053125e0f1914d117cf822904f6e06f4c81973a2a42d5a6218f5089b31e5a62d6646069f89ca3cfe9188a69b58177e81ff592ccf8e1986e39913e80469517895ee8e014caec57283359221b984f036a4208d1e022dc5ed471faa5efc194a9506a866a3708485d00fb272606777e1004f065af9d27526f9b3f32c21c88206339cb0a070608e16f8c7fca7d9ba8355330cd3c208c23fbe5ceae1ae53180c65e929a4d63ba0ec2f8ac45eedc69269000404a8a08b8cd80b010409d9f2145b602e3881308d2063bc48ec3395fcdb9060076a3f523b39a5e5caab7517296f65e29194e630f40a100336a932d724519ee005c601665c614788ed92a7f03329ffc92776552862151faecaecc1372396edfacb781367a98e81a92d3387c794acfeb33b367d4d5b178828323a5219a2c4b4c6ca62babea705e7413b985f8e0cda0481b56a77a1eece50f861e9f96a64948597d5e3c621ee9cfed43677344779d9e1a9e7c23a5166aaf70fd86f275392d884521aaed95d8b2e1cae97146024c1f3f7b283c298f92d914c8b037eaa7badb599fdf85de2c1bff9cc42bebbd2037fbfdd7f36b6a7b86b4ca78efe1bd4f9edcbb3fa8eada3a63049f1d210565d63130d13942adda9197b98b2471cb8b33fa6fa5e4ea3972011caf3804d0928e3e30a40700388ebf0c05122f8b986b9012f8c2fc23d0c0e86db6520a08b83c7dbad37273602220e0752188c3fcc7b2c516d3f87637adf124a14b4bd8ac55a01fa527f93a6c5101578cf0532fe05324868fd9536e5d5c5118ec5adcd65aa50a820ed826c819a8b9c260fa0e2b2e7689faa0592b7b91bbf2b40fb98b55ec6a2531edb6faa2e048503d77613b105433f01c8e069dfac71987730a6ff499305ce12c2408846904480285f0cca9414c80751a0ff51a28082f635f76ce19a89e273efcb034c28f12dde25a0512e0614184ac58e14e882701f810ce4eff5746f34758f7667557f6ca9939d8fc071ecce04e1f36c1d48aefddc557f830438b2c78dc2c479b24573f170e14fae8f3373db7f6c829c87bacbdcc3bd0485ec905e8ea622c810845bab411d592f068e2c059510abc8ae4103a2afb4f5c4a11ac6f8dc318e38f5b0996cc61f5a555075b859698b19906346b4cf50a5cf104b5a7b89b6659be92cc8a04d9088248cac336844930658a486467cce9f2b6dc226b88c42ab2a8994e230b8fd119018e5d453c8b527e0b2c42625ed46991b85eea5ea90aa833f73fc86cd2ce5c70d7307f2e653d8a61ab2d2ac85f63d22c814d412c2c7cdfd4079efff0a75edbed93d3b01b6264973dad09bbe02dce6ed3db2054f45ccddc6d5043d12e70aa10e7017fbc8958a385ebc2f5f43242517beb05cad60ed9f77e3a704c7d52176250c659afadf760946c693d77e82fd98c6262ade9c7f43629a6813d546e32d6f26fcd6c3255ac2d16353b501e2111072bb5d41056f9cbc40dd38ea603fd593c6e6ce2260e534beaee9e5b38871caba6113d3ba1c46bb20f195f069735f3bd40866e64f2b51f9a07082805244ea41f33c386977386e862b89036c813d8bc71ce78726fb9211822549805c267a023859546b48a030461c0c2784bc2cd50a576b00450e6c8c0a37b665b618c86dc07f2469700f1ba1e165b756c83a924e1398b92bb189a38706485a25d5f9caa710b8fae397d2efc28c4cf11b01dd1438a215509fa06d05a0aa256790e0cc526622e8cf0ede64123f1bc296ec6651b83444b8c5d11083753bc1fe2c8332b2f02e3fc79bf98333b66328e7679733a6e2189c007b994547f72a81f0f0c147ead939a2481e54ecc861841c073a111eac31380deda8a87a6f5c270077d03b2e04bf1ef5d862a09cdc1e39a832b608ab19694340239414e6f16c3b1515a698bcb4825809247b32ee4552540f445b1bb2526ac289e9a39f86c8cc2135b112665c15303ed12456452362abfda29d0b9ca5187d157ec876ad84c5b196f734fa7dbe1357c7a03f8022e68565d1a371ad3cbc361c1954f269e7ee5b412a027e10f31afd548d6fe83c17dc9150243d1c56e6d94bf5d257568a0353055488a2f4b1f794ebcb82cb8ee973bd428ad4934d18d02fb7407fbda9fed3a453bd52cc5b293225c88e5a3748a4a7c21fb51ba2741723c8343914b0652533040353851c8b897b654d51e622f2c6d7b1341187989be05d8069ffba5e61adeb73275248cb07c5eec40fe33516ee9534cead05857e119bc192aa88736c34e8cc6d18837476e0ca228d2f924dadc64bd2449bb080ae705b74ab60f4331c12680a113c69c46da2990d6b1c5c92daba8e40246bdcd3f2a4fd56d8151ce9a473ba345249f1cd645a3c91394883ae49c5e558e0749784a08d6347aaecbe6bd1919d644a67a34bdab68d0398f45aa7067952f01a078604c2d5592caa405910ae886ae1baa263715705caa2d802cac265c1591a74982bb816d555d8889ef4b855caa20397e4ac357ac986c4bbcaf134486ce23a5e48c9db4f2b6c4023216f128b38da624de34a3abb578b6f2bb82c7454a02c8a16d02cde57bc8e45871e29546b3ab050304ed8b52575a48ad601410238f12618671749a4ce9913598c57e1b7606c1653569220a471e89380c215c645bab9c016ff166c0b2515a90ae215d1577c51c16db153815a41ac02dae25f2c3ce59052d04165269d9dbc56d870279d6a5e2ddc5654a7a40e835ca3a2b965f674ddb8c28c9551523f2d51151c3948f16c50d1a4f81af38a1d167a0bb40581c547594475914cb4736df10c6e524ccec66bd2642b898533a092106da2e2429738987488052295b4725db3b0bd0e69dd6a4a3cad301636d093e4d138a44800cf758c01a1ca8e3977e86090f4e4d2704d5a64e3e8e9b0dd71a4ea3e68c5667fd2bd164c85fd4b9c691fc200068700a594ee19f2d46b3d3b795c005ebb9ef569380b7253ec2fd7d3c63af5bd103e0d1146eb58b02d4cc9e219e9a48e2d5581ab308b0a8e19d2c6955890b5f05dd1b65058816e41bc629485db82d3027716b9a3911eb5348b9cc55bc2b0c37b4c4ed4c2c72c00f9936e1bd0748bce5174fa38ce525e464bc3b0485b51448b1b50244407520ba8d124456c1ca5482a57ab826ec5472ddd4038945a741d959489c6219da472691645afa452d7cd9b28688e9b94fe8a10c340b5dc242bc3b6b6f815118af12c070f2f432be6c5d475ccf64e767036a394ddabd0d41f40aaa7ae5322d7bcb09366fc4a9606033242581d5015efb3e8682755dcbe53618345a2bc715b44db22aa8214dad959e092851a69a477360e7412bc6b5a74b74547efa05e12956bb82519d2906d3779814a7f72d3f8ff843a73e63a8c9040ed68af45eab54c85a55670109154c5a5414bca6fd925d0a6bbc2141650d393c0d138d024f82e938a8e85ce02532d3a8848a0ee96a721f55aac8a74e47fa7c9d0d563c510aa393971c58d85b73327a8ce3f809242db38ca938eef3ab2a490da9e05a505aaa28a3583108af2a8e89523ce4d498364dedaf528d732085900ea6c089a82e2d0d427d529a2e170172c41a4854e0c1c387974a414368e05fb0a6500f42f1501e4b5027ac9555c5e30903a4e07aaf1fcc3705ba0e818d575f45c51158c3f1ad48660891f5585242ca1049d73c432f040345df3aca1dc6ccff30b5da40a186e6518664db9c262638189a008baf95498b8c363247d1f9e7fb440a64d5adb7bef2da594522629036705c205e70514535cebacfa335951d226ba5821f97f4600b1e57f3fe8d9c48beaccc5e9c5c589e70ae6e29cc2c5fc9f0fda5539e8d18b647325732c7c36b51fe74aac39b928deaf037a5a19fbade857849e9bc64a90bb0c34a94ca0e9428918bfc6388cc1f57ef431585f03edbe1d0d673e273abf78320163fcf7fabdf3eec03f87d417e7e7dc3fe5d873944173c53d855d9156b694a68993c8f693a2ef636badb5d667eea45cfa9980bb7edd24c6b87beedebd97524a31eeb6a71ba7b9cfec71aee8bcf89e46b3baf24784c6a7faa5404fce247a5feb4cd7bde7795aebf7915b8732302f447f7e9d1fe6b737b23138762391ad3d09069498048e5e7a1a0934b2b551f7181c2bb7cd74f22b95f1d9caa0323e212d7fccf7067777796f588dec4a3d69abadd6da6add9168bda59097d6b66e8d784adaccafc20a958f08dd7d42faa9fd9c2dff7492e1df18f30dd65a6bdd3b77d72fad06a5dfe8c2314bef66e75dd779672d12bdbdddeefd1dc7183fe9333857d72e1165872842b21db614cac2da358b6a73d74a8b5f86dad32eba3079b28763f6e9443012bda3a9154e3a8d2f74d00f41314fe22aac633e57e24a3c892b7155905863ea8af40e3925d1f739d9635c89832619a3817595d4ae502ae70cb528aa947b4a1806a5fc32bfcfc589f2428fb3e53e533e5354b545ae20b1c84f093dfefc16249d72b24044eacc9fa94741dacc9726ff82d0e37c4d31539c9c52cec8190bea525d929899fadc755d0d5d0d5d9226ab6f872f7a4e978b0544ebd3332567aaaba14b123313a46426d3a206fb27468d9deeb1512f89ab2c06a50567cd7481a1c71923da53f2cc9f443467a23dedcf20397a92184fe238526ed1639605eed4cae0fba6db0fc8a995816e420b2a2f7b1ae2e7be8fef5bb97be9f63b140064bb1cf7dc76ef6673b6a7db76a9a63893a7d6add6b7368c71d19eaa0954ca2638fcd2f4aa628a0dcce1f5f8fb3806c7edf1bbdf078242037ce4de9ebbee6197bf036df5edddebc960e722c7dd9ccd43fb35d11af7bd694eeede39675cb44fadfd0dd4660ec731ea7b3dac727a4c870fec508096b3b68206a670056685c8a31224c5d501d1da618593a8644071445a5821852013e0418f922836fa1ddf36e994bee61addac66434a6dad754e3be74475444156b11d3ddb7bbfe3f4b5eeb9a9656df4b3cb23ea4da6d605a133f7e40f32475cd835f15506476f32e9d4418f32363f488e693da4677e929c31de2bb8e89f4210173d5677e08c7048a4d0431a0659c5629dcbc881b32f4d332da2ec09c596425bae6cce3f56a5dc54c00e17a500b9e81f65b6f40eac265305f3f46548b9d0425e8185090441a10123fdab801d2b7c7b27013be8f124d3238cd9f1396bf598aa67034d70d1fb1f7d49681a4a17367d28324022beeb9519f528a59eb5d6ce5187d24592f4ce451bd24a7d546bc3ef89b6bf43714ea7213df67beae8d5306b9af57ab839e7acf5498f896c8bdade9cd45aeda98422e3ab169e1c077e1961029cc67fc7039452aa6b385afad40710ae823ceea628481930fc0df193dfc777feeadb02737f4f349616636cff4381b652c378b396dbbacd480ff72412e97de4268532fa85901e3f29c4af5f7b23db0347a0064920e7ddc833b2bd6efb0ceed06abd2dac334c74c638e39335429ba09c538bd1f25f0d9c9aa64d0dcf39b9accda96170fe9559bb534e39e76b52863dec9e12fc74d044f628dfe2dff12ba5fca868134c5e03c4456bed6b3ba4ee2f89d67688accdd1c2aa7d0e47f9da76380eed66ed6dd634edaa6cb0052584454c4807573647faa668e9f3f5658c5379a59457e2b8f77e1766307f25f077f0be068e39dfdbe3ef17c4610f8bb59de1fbbeeffbc007a4d7df79d64e7fad2b70de7d2c3de6af9b79a72b8cc14917d232db52484b4a48364515211d00d1755dd78d01574e229c4e88414e0839fb891d10827838b1638668012f20322f07c0a001356011784190524c852652f8643f5658a031bb800b5af8e00526501ea090b42015935a42a49aa1ca61682563e583100b8615040b5aba45441517c93565054023a0255410e405b56009a28ec889a017f7924209d8069b54a460c6b4199b5a5020cb322ed2c6a9ccf06c7a91c42cba2f2081b228245376aa2e9136aea2aa13481dcf61e5ab23a48efbc092366e02a9e341481b7f6f958ee8d1631ec3e238e6cb209f491dfa2e25db3ab7cae51a3aa252a284e4caaeef2929bbbea780d8f56daa8aed263837e7c37f0eb15fe407efee394be407ef2c6de653cf87fd22201d33a7398f2ae78751dcf9a517347de942ec9766d0f5a58ef6f52b77c1ed35f087b485e394f907fe2b6fcd758a4104b4e7dfd611d40e61cb211a627b2432adf65c9e777ecf9c534a9beeb3945976520347edebcb36fdaf9b3ea4bf8fc1edf3e51e8f9e34ceafafe9984fb7d148dd33b473e61fefe3af3d130b9923b51e8ff91e8ff9f7d297ef0362cfc7fdfbd3d34164d6fc90f61ccdac02d9be6f534531c088b6dc32062019561ca9c6718c35dd739ee6fe72a0f7246b3d2f94a06977e068b9cb5d3cb722339bc8b7bd2752b7febc992c6dbccfe0e83950c38c3e8fc6b937cf070e37cfc7fd30879d8b1ad4361b437e58b84ffa22755ffb5de7f9b8f649f6da273d673ff7586bb911e83d97b7e740f916f47e049ab6573d1fdccc725b1bf5b724381864a41ffde5ec99359dfc6985f87ccec11a0af131dfc31a17a76f01dbe196433048d953c6be943a3f73b6abf69c36b76927d6ee363f87a63d6b1c870da5cd38670d8d61080620b6ce96432fc8f6100daf0db3e5100d4ad4d4489d21f3a5b4b97fc3d1c81ef15fc7e3f51212e7a469d7481bf9ee4ef84f191ef5f1fbd43bb70c6578cc97ef3343aabdacde0fff1916993fec95f58642a86bd339706f5737ce9bbed5e971325ed775db7b1dd7e3fee653730547fffb42d7cf2fc0367eae6edc77739b3e6b07621d32dd17a923f773cb39bff6337d706191b9e5e3afde8ffa392c32b7fdebd15087fc3bbd1e267965dddca453f8537feadadc94d4c38df03aa9e353ead3fa5408b53fa4edf5a9113be7101cbd2f9b6cfa5586edaf79d9f4eb18583852fe893d1f999fb9b52f52b797ff43da32e4fe7a3fece3fb321cef0fe1a1b705fcb5c7da3bbe4f6486323da810ed7d037b8212ac5e7551fbecfd90b605a40dfd41c3d76a911ccaf4a0fe44e6be6128a43e91b96da8e367ee1ad624385a1f57a99fc7b8b2f35f2e7739eb931c4fe2699e7ed8d83334a1466989fe39fd8830d0094ddb94bea43f9eb06927b5c4316798dc2cf1571eda8f9aadeef1f0b0c8dc56f2b091dfc1cae3e270f4b76f85d83b85938ee36796527a1ceb1845e6a661868025a20a21c6119bb4a59018419f97efdbe2fbb870994270f1712124464a288c27df0e3610649d63d081182b31585f978f0b0fb6140a8386305056c8b468b142460118ae78428754173bc8a2e5cbd0972a52c8c000e20ba04f8bf785872f23c833bed4801fd72342a8a098e0200c20172ce1c9b231bec4b04597052686186079d3e3c74cd80086143050f059f19f4c7cd31724f6684ba12f51f6f8276f86f1f32cdb5f23f10018dc3023c110155a2891833dea4fd6c229cbe9f47d39f8bed309cbf76171bf57884ff09b81761c68f9313dbf4a9dfcf53da983bffe6cc03787e7be8f802d83effb6750065f3906fd167c37a094625aadb8b6cefd552c5eb836fd984fc88bd60cbe1908717145888b594be88bd527c5f7c172fe3e2c9f0dbaf0d20592ef06780915558238a2871e42f0421545321429f9a2b0c1a763bc84b1b91401c5e904c50785fcfb3eff3e8d7ddf7190b5481ab947128e0e2f339034178c81a6b1e5e6a1c29ed4ebb1ee9f471a7b3ef1bdbc28e1787f50bc00b9b47dc7613fc6d60a24458943879724a428f7484f2b2f5bfe7415499d59e425b5a51097d4964b6c29b445158a82d44141dad0b0d66a2da594565a2ba594525613a9339bd418489139953aa5019f8d511affac3d0847fd7dffa28c701461c2f1b46114e79e4e22291cc51f85e37f77e5b0ed4f55dde7acf5f7fd773f8a5d38deec1b20e6a144abccd2adcfb5e753221ab4e70df0f25454ada88aaaa88aaa28ef6e8096a702590b64812c9005b240967637c0ca53671447d25b67b7ce6e9ddd3abbb37d03a43cb685b16d61dbc2b6856d0bdbd6f6bf013a8f8d511cf9a79328fe7f9fd634dbd8be014e9ebba2396b9aa6dd55d646f4416d73609e73ce393a6ccf1ba0e4b9af02f8004cc049d3d8a9366d1265cb211c5401d8720807d6ae48244e56d594d4c9af04101011ae205a3ee42d3d1f6de710c354f4e64614ffbf4feb05481eed779c1295acd0f335b096b4e89183a960947ece5a7fdfbf28be460e16945514479b6356652936fdaa432bc9f498fdf31ea16861a7b231ceb9e85297b9e936e25387357de0a473f4390a7ad345f17432f9cc0564f9ae634a9b0ac4c7fee8a86f5fc7d4c14da7b24a3be313b375843ac2b9a5a723d32b45943dd6ed9fb71c7202c4d65a6839e4a4c990131b869ca0e4735ee79c2a4889e594b3b3034803ac5c9982aa627497ab9c73bae7607fa79c9d1d40aa58b9028bd15daeb5aa5083583b8114886450ce2904af3dfe04540892822c676787a9c68497434eae382b46775983e18bd1816ce68bd95ef8b098ae990f8441cd6451146446827a8cd9e6388e46dacc9f13ecbc1e1a9ac4212757f6284d342f0e39e9020e39f1b267329c70a51bf8a5f75e0bc3922a516e98816008fa0595255c97cbcd224b141b6a0a05268e6c996245104374c0beb0c40574cb168cf1162f6616594ef64d2fbee9bf0827a1c4bee006463c51450e1c58f15c141318e696279b17b1c5b460f89327b4e8c537fd17bdf8a62faa5c609bc5945bf4a74c4575308a90b2831f82f07bef1d63df25281022638c8bfec489c0de28f74f398b04a214dd50a425e88a23c4f080eb4fc768fd04a67561e21a226fd9b2e54f5c09ee9d426f78e2058b11615cd18104612c99c112991fd9a28b275f4a108417487af812832ef97259827242632e745eb75f5059822a61d222012e2a2a426d614d07a30829b37e616d1653bc092784141e98f560e5082dbc607204a571efbd5196e4800913f6de7bbb38618284dfc0640ccf62df3ba516bdf8a6ffa217dff4201342a45058a4604951f4a7bb837df2ff271c84e70c4b8068585244146e79d09f8ed11a63dc4507265dea4805032de6122634982c116ab0c5941dc2088aa24aede2862e95628cb95055510d61243898a10919623650f9e10375073f04e1410caa25a2e49a3a00143fe0b0644a952642e0454503d50d9c861c2421e2210a2c25d8a2082866dc1633862e4cac0cf75e2e2a2784c0a1ce9860318466830996e06284163cc8d07a428b253428d19f8ed1dae22318639dc5902a0b174dbee9f5a792bc308b0289193ce085091e5cb76c8c9f1ca981c5d0922e6a5ce1a51bf4988de439dde77b8bab44c2a04d7fba58f4f36bd3223f78cf481bd77abc1e1d534aa2c7dffb1dc737b3dd460c37efe3396a0a8ef9b3e723ff5322b57a3ee6b665dd1e3f0e7d783ee67b3d59896acb2cef63b0ba282d38f3633efd3a9f7e8ce3908f393064036bcba124558692acb6e6dceba9f5c7853dd21f1af0af3ddcfb9b4c467a5d81694d6ebf793de6dbedef76ef773a7cbbd783669cf3dbfc74cb2a5b124d2b5b56cb651e3b5e65f2ef9ebce9e7fc37ff3d421fa78a36fe8c3fd3b7f62f8c0c18183d23c6d3318336ce38302804c6eb3173d63994d93ebfd4e11b3fe77b876250779fe99463070a4156684106d50e521c8707ee751c80755afea0938e43c8edf4bb90ac793de65092d4a68ff16f3cb2ee6c48bd4e49ed2868f445d09e1fabe1b5e78ff2ef7bfeadfdd6c2d11f3fb5457ef0d6fc8678037bca9fef43046db9259257e6b8fc17ecf4a4a0e536fa55c3744875913e0d47fa9c05291d9f3ac1491307ab7999886682ecffe0e7a80371ee92e2404e85d28ed2dab9d793dda5fdf5f2fbd0b73de8572017a9b8a899aa6ffa452a301a915b56d0b4adcbc77e0d9d8a8b210f1bdb86ee72d15f0387d83d4b478a288ec73c668281e9117449065ff881513cf83450882f96102c168bc5629dd0e974252c9ecfc8ebb8edaea44e7dff9b83c4d16484230c4ca9a4c315295cd551186e214ed190de1087b11c86d65a6badbdf7de7b2fc618638c73ce39e7ac699aa6691a354057aa428f9468ccd9da0c70cbd2079ac4a1f1f26984d70949e3ff81963d802985e37dc12e2c87233db27d86f755e3881e71ea050404040404048442a150281425e2743a14509db56c6c55aa42e314a594e2144ee17d5ff7755ff7755ff7b5b2d65a6b6decc66cacce72d6fafbfe45b1026ddbb66ddb46abdd712de7486d54a38a9e41306e697004e75fa242d7b7b2c445d31f50eeef5007e7a620941bce908364916bca580e1bc16340e6e14c3e7d345ec0c6b5958e460c0080dbb45c4763064880d1a4916747a30be21d8d1aa0791142006146a6061e8d1b08008d4802006c984608332780f95e6b2875e11907a2e726aeb179447398a58dac4485a64024a52971d142a06cd9b4fd04650b25a571246272c47c0c8fd502349e19374669265859f626b9ae4d698ce73377924d6352d2c60abdc5806c302c34e94571744a06cc36f25e52076fba758ac27410c5993103943c1394a3185d8d6294358ad1d628465da318d02816348a05ed31933c465ab98cb4f21969e545a4154591563445a22ad2ab95c317e9f59b86a3b843d22b456966a82d1cbf942ad4a9934ca414af280d2aa7b4ea5b3d4b6cc162fe5424ce5ea683601b4c3c891b4c07cdf41c47b14c55b0d5a67385614e7aa536a53a65654516af68d1a88336fd98d24c6fb071836dfa31797e0563b4cbb8b2cd362d59a147ccc2ac92167abe56d2811ef1985914a77e38e2960c31ab94859ebfcda6ab3a6cb666791669d4977ad54926c61ef6bd6293283683805039a555df6ad53a1589b3977d310dcb2f1e9b79a40531abe5020aba3c2cb85029d5caf2cc9605ab2c0a42a5542b566be53cfea2fecaa31a42b1394f18e0c7acf3a33ee1c72f07e74711c73b4cea6c377ecc267ce2e99d2565d6df8b01f829933a9de9c71bf137feb49421fc7823cafff40872baa48ef7f35b903aa3ff7ebc91255943cac8190982a4f1e38df85b6ba97f47ea9072fcfc2c7564a8620ca073420e0e8e70bcb96142010850c2cdcd006c6a047043239200001b372384e08b7003c28c4c8dd2cdcd071ed0193031e08ca72a1818158c0a4605a38251c1e400310f0c38d2257b3e25aa95a81255a24a54eb8ced61c0fa39a495565a69a59d01720f03dacf71efbdf7de1f6f6680ddc380f773488c31c6f8c79b19a0f73020fe1c596699659659e6fce3cd0c7094c3ff6a3fde484d6a52939ad466689f436badb5d63fde80da9e01ca0861404d0a726db025bc20428b0f52e4d0f19b2cb312b61c6a42c539705e41dddedc88e23ff73b5e370e0b2e6ff6be4a57481d191e93c85da6477dfb3694db3d1dda9edad3ae4671d1c7566ba94fbb8d6a5853db97aed0fe43ea0662d3cfa06bac2125ea61e5de714e8612499bb9f3094a56684c29a594524a29a594524a29959d5c62eb59df4aa75628a2fcd2b02ff6323125e6fce913698aa6eecb9cb5febe7fe92fe7c1ff82c564b3a28a52ad562c56abe572016d2929516ccba222d49654c56ab55c5b4a29a5c364338992524af9524a29a5e4c9896599f6d947670e4d8d399887058a435bd9a581bea0279abd66bbcad9e599ad299b15a1522dbab2344671e803e5199bb1f9b1d8ae3cbea238a89cd2aa6ff52cb185a9bf5274769289b1877dfed2f9d3ff897f12f3c88650300ff512ee6b9ba077fd762da18abb4a9a6d7ed4353f7e021037cd152f091700d7c635dd116ef863067fd4ffe327c28f1fc278da78e6c72cf3a3def92b8d220d184d8636438bd13cd03ed058e3696fdb7f7bdb6094c66fd0ac6998aff4205542e6acf54780b0847ccafb26dc154569fcf300c2316b9b70d45f4d387e2f80707c3100e128d284e369b790c570cc9a8470d4dff76f0a477184703ced3a0b5da0eb5dd515820b0419c5b12d4ae39f67c2316b9970d45f8d70fcbe148e1f9b6ba8c44dd9243954340380024316000028140a864322a1481a864922ab3d14000e748e4c68603c9147c31c46511cc410431400840000000000106294527236090435610d19301fc342bc15e6da64a1db8dcab3c79abb271ce55a70e73565f249e46a31711d53212c539f81a7141d9e7bcbb54d8ba39ed43d09da0cfd0f6a021238721a9aadb719433849a318b01f27507a3f09e4a1040165f39396091444d321636b40791745283074cf44b5fb03f30ce6d1a1a6b9a3a204a671a1609740498c7b795074e9e9a86ce37b8b9dbfcfbc9ec6f2874b4f9d145dddcc0fdb28212b10fcbe9941522c03ac8c2a4b39a50d7d088673bb7c8a0c564e46efc236b5a7920a9d5a1869a8edd44f7db2a8f624d2505b624785af5de529645923c16fa9ee74513745046db26d17ee6ef941e35667ea609795b3ae67882cb373f44f2887e236c867e89121c12b0d6abccccb8166913e239b793ce1b934f5db30c2b884d105f177c1016eaee8bfcd27da05e0932a0b337b5af8360bb2247a9adedf5342b46c407537e3a877751f220c757d38e119a637b882b4923503d2c55bc48f99379f35843f39498e77a61261bc10efb08662561bb0880300a90d4dfc98def195458aec613ab2491781b0e983556080ef3cda6c254b68680c20a146d087291facf3d8641bd9cb5bfd4f01af16f5d3124e35d8a67a42c23ee05b06433cc7d1c426ae0c98e726e8648d77acaeaca4786e41035c14067a5bd74919080705f698ddd98ac5da7a3fc7306902802f9ee0748f59f3809d02a81a0cdb99a03d10a7316bb638ff351f1c4a97fc3c753b7e25adac0a4ba5fc0cb7f37e93116d8c249386d252cde7fcebb3f71568b190970e9461a3188872add2702f537c43133f6f04270cdf4dfc5847bc18fcd9d34fb894095b768ff8d6831f65ed4d8cf31eac58a4a500acdf42e17ddafe94753d27a416ea278681c354fe118bb79dede81a8284ba7e50099e6b9ac617821550f6372dbbf70d271cf95afab170f4abee2ea5685e0ec326ec3bbe9fc67744f783d61a8fe169cc19c62bcf5b8214af56fb1d8fcf061da555b1c97b075bf1192b4260749b8e2767c1c97db7fcca97fc4b4affd26367016a89e7db069f7ce9c1e8fddf44da4ffd34229d3beb099e611a70f0464e3764bc91476fe6592f7afa7a3f1ac8d6d53e7ba2ffbdde990cc22f30c8506ff4954aa02860f6013683e8b94c1f6ef45e753998affbabaacfef7102be7f9d1464996c3786579778cacd544824626a9c3dee168e53961d5c42d58a57bb0468b905035ec21eba545fb6e01b8530611bb9ecddf955704e8e044ee7e86d660e1f4c6d03da124c39f985ff00055bf37e58191ffe011ce4a5815063e320152e42f6935df76054aafa4503dba412288402eec9b01149b9b15f86ba7c2826c903ec09b52125343f539a3f92af97c243df631fb85972ea65a104eadc2dba91f68d3cd5b669a0c252c04a9565b984f428c2106fd81b659262efa176f355be02764e37f8f4db31e25b7ecfd674c49598f0dc033522aa20653a16a8dbc69227a3d677b386fb808530657cf92aa65f762d3f1a35300fe955b328fffd9545b3c956a6730f9ab8fa26e51f48d8a5fbbe0fd2a3baf7d048d66889932bf8c441204619682b3a0121d5e6e6b3b11d64642cbecefbd92f953459bc6833c963a96b39309ff88b54ca13932a20ab62f17a128dfcd39d5c7f25b19bff945576f8ec83afe651ba45aebc50bc12cfa02a85313cb70624120d32a46e13eb85afecaf27abc86f348c530da1cd88ede618cc186873e1139f5d694bd1540b3e463bc117bd157cecc90c8136c1c70d29f31b4f093e46208e56f54c7d02ed9b6e3dffab4a799d29e23a363e0b4aebcd4af62c42ccf60672e759e5d8d63fa0ea4aaea272e2b35a5abf9be78e2b103ea39fcf3a35b9c78492b53be65191ff84a2b6e1b8db9211c12073fdcc486480342030b90e2d7ed5fb559d497970d087d919b730ab3793ead91efe0128a6c09ae46d90e3e9cf6229f0970f0b1bc37f5de1860050b4e9cdd499c424ce6fd1f724183c35754155ef940fb4f48033930048bd91684c74a9719c35435ac6792ff04d50436c7705243019dac82b5ff6f95f548548ad5adf83b09e0c650d5dd981f1e0a382ebe1ae80ad3294ad16bc35e2186009d777e7831f0df99303e23ab8fb20eb34bdcc3e19ce53419de3ac70f7e142f77f437fe39c2dc4d3c81f2d97481f209b2801806e40e228eaad1ddf16af5b67c7087a09762a9669de75364146f756d792424f1fd9ac5cf78c8af0f94d16980bf26500b2d94537f61a68921301ce03b1601e4607804d842e1acc3fdb917d02de76ff0bca12df0d3073e3a8917a31a02938aecc484c0eedb978e0774f552c9675ff265a728fe5cf6f3dd6dd3754aa30fb17baa20dc08bd4dfd9cdec1725524b435844cc65c10b5ce76122468ad2206b0e6ea2b0742c830a741cfb3247d80cecb8fdde717c94c716ba0cebd5e187b5803c8875fce63db01cc9c78d937ad3bd0a620e5fbc9392c5467ee3a1a7de982059da1396a11aaddfb7adccc1032d9289f5db9e1bc1fe09e77c88dbdcd67390cf0c667251eebdb8e5f40ee2f90a977bc622616eceaf344ae4fc42aa5e34499b2b02d5d4fc5d5468b7f388eb451837586a213ff89c35077e35ce2958eb9d22b3802af9b93c590395da984a902b02ff7375f7fac4f0b469e72d241edfc2c58e594d53b3cd432c8b587621319eba9a1defa1bed338cb33bed12711de416d58d20198600d5d47429dbcaa91706b1669ba4551416e6daca2365628c4a308f6f804c9f47482a49a4de82320136a5f5c423a83434f20b9a244063f46a5e1d643c20eb0f451359e37133bc404c65548c0fa7d9c53a5b661c20162e2181a3e15c953ab9a53d1ee806f764160032004f455cb9892a5954a665b86e71dca165844fb5bd15a0e944604aaf40124a24a912655daf259526e554ac90f3ee5394807d3889ac6696aa6735f2e65e1fe660d6b85b40fe48451c63d1d20b974c8b69e0c8fa7a9c03cf951c14b5b2b53ff28a4528cdddd36660388845c2ac8f79c7774cb00169603790156089f82d811cd4ee6242b74d0910ffbc17d878038f261ab8614d0308887f1e97829ac507f4e75fa445334db036d0771a083da4c53916392bd5fbb7edd6b6c5505230ac5177aafb9f2dad9d82b35a509c537f95eb9feda4b2dabab65098d2ff95e77edda23582b8b84128a6ff25e77ed15a7d9a92bad843aa1eb1aa4de19b4ee15a59c86288ce0736a825f693ee54a9da95ea627b958b3d39c34848b78133e09ec8a766ca7513ded2b1735378da212c297dafbc1a85083a155555627a96f98f2d156c4db2959ca8c3fa3ff62c24a2b148a36e936d5f3387554edf47f8292f8d84b62b0c5eab1b10af0007a619a7e5da6ecac140eba6355ea372d24000c56f46f9699601130bb4d3cf265cacaacaa1945ecc9275c96813d6636426f0be4631487c3b41ffb37b9ef525d5303267b194c4f09e238bd370eec1a1020096d9917b0027697e6973d8a5e738d979c3230367117dfc8eb39f51033909da55fd849af4beea4a0bb797960fb0cfd57895fc59d8278b964bf3189ba66a8f4437657d2cb5df43b47f0e60cd84825cd3096977d6d3981b7d171f834632d210da5315ec31e05c20ccc83dfc4319e908adafaf830484507ba4269cac48a37e1986a4c095280b4145f97d9d12955a85b04d2efcfc8fe313e50596f49eca3ef92529fa61259f0c38b6216a0f79a3bef2e85d9c9ffc97a1a07ed65544bebf741f3e2054e0582d881e80e38604e3d94f3dcf3b0b1389ed02ec240a3b55c32052dde23a34905d30d59f1ba213dd71125aabc08ef0d30e2424fe61090028dc092202000bb72953f786948ae03d613c417e4ce46f028de695650599528396618a15804ac4c19ff988b3bb4da728230d9f1aae12c265d00105f0011e5976cc2ee4f39def05f1b8fbb750c3ae0a061735bd49f4a166a2b58cb2f110edd596689e0b3cda68dc9d5648e0a0caee7e5c8ae1ae6ac40ead23913d36d0cad93d4162e666acbc6c76ac9dbd7972c5a4a22dd2fb8fb106edcc1a091f8fadb812d0fdfd7490a7b9e2a2a34d17a215dc0cd08701624ed1c58f0937227dc7545974a276cbc3d64207587de36e417fefdd35b25a4b379a3b0a20bf14ce2369c358022b4e67da86cfad840510629d652c41bdbd1bf43e0c130e34a464489626d5bb741070c5a43f863a3536e3265cd1244e5717cbdb46b8b5e333d4e9b784a35a2063ad91d64ababca2402e9d6a5cd506808574047bbbd9cdad3bd8d8374abb73b35602519ad4a8c6b79c3f3026b8be9478e28ddae7be14b07d7bcd1dbc271ad13eb454b899a7615b3cbdde9cc54f57081a852a64b65a8841a8d6dc9a040ad694e67cded2835e443054a0fb09d1012fc6340a2ca309513189a4f04cb97b8f5d955810273e903e5c990202ccb40a1abdec25d148e9ebb15e09efcaeb3da701f010bd0c2a6bb32a9d1c2095d31c0b4f0a84c8c30b570daef4fb0b663ff2e0bbab5e1200fcdeb8622737f81bb6beadbbf3fde6a550c10e86dabda76fbde53343b221f630e5242e92abab5b9301e99dd13a010d787374d5c83aad0bb194dfce3db7ffa41fce513832a77b120868b8affaab34098e0634782371ce0ec6f6376bddb066bf906b0b0945002e27c4228b5caa867be3619cffd30544db750d5e89bd2704bf3f22554b5d7465c1133d36d7ee0d256a9d8722a21870c55cc26d3e08308cf39a601db50d12b18c9768d3ab8e3e84e180cbd81d5b0d1ac6b0bd549c42cf931550bb05dc2711746c1e3564839a5c65f2eb6c0b285acc8989a178b9771f42ab25aef37186a1439378fc82aff480ebda7ab7235c93f081e18884222a6fdf567567006a444b98757ba503b3174c33f2dbcc530d2500766e83c5a0a3e2d6d06bda38af7107e3988bcc5f22f0d34f721829985c262b179768a54ac9c94906186820993b44689ebd2e569c0948b350022fa764b9030e28ebf19c738d44a340348d34c3a03f29bfb177548fa12ddbe449446987687a86c9e4d28ca451fee0ac2d6315cf0097d0858a5201f93dd631c7214fbb924f36efbfed0b1d2df86fb1f30dc7477b0f7984964b301a47e9625f3848f3123dc9a9b058d0d96fd8722c484b1400ecc85b090408ef4196bed95f6052f104822988be8ca28dfbb190010b0296bedc4f5078f2f7a02f2ab1570866f063b2163cfec97e2aab9ba9eeea9f99a29ee6c4d7795c910633a672072a93ac1740a43ba7d18c06d75ee4754e64cd45027588be5c9706738598a6587828b83b06e9c206d1e465e26baa25f8f8459bc416bed1146ecc7244add72af2976917b16ffcae9ff98b71098ffc7c482cc9c32e4f9642f528a3d2f9647dbbffffbf1638d72821eee13db31a00d8a7acb35bd35c69f4cc1502780f0b1f7ecbbdc0639cb28756026d22b554d75808c8796c00e90a1857ea18822cc28a1ae84f74cb3a5010a0f7718f6931039d65cea27a9ecac1bc9c7c1aab993cf4c490ea4b675bdc749ab0c218df589ab6c1b7d535aa64429f5c3f0924c0e302e4d18b75b9b1ae30366c2efb09d40070b463346c838d64c61f340a6dbabe9929df0b0a92def4f5d17691fa86b285eb67d5630466b573bf831e7e55d33829328ade990c72bce8f0645d4b2e95e7cc780882672beab16cd555e23921c385937261e138cb3093a669693814c591922fecca2f440279da8c3f83a282146aaaaa0dc996546ae36e57554c0d3c672dda9a873f4b60be038d001b2ed950d14bf9d433fb711bfe05a3a6bd7e68bdd5b7a5c1c535a41b15f1c1b651aaf5abb29a0b49816373aa9e12623a502c05660e196fdb9ec5b30aec066ecdb22518bd4fe08a348f1eabe064685996070e35a77b27c0800aa2f5a7ea6adf214db95012af227bb02b30b62e7ceed34e740b9440220762e94334ffcf0452a2877db249e970932b38cbb7bfa111b743b6a032ed7914259a479b8b539492fae34151820f07f94b1d60d80b86954653e604e25348a3e7cc04cdb665431d3e2782de2c73ac988338cc2e8a1cb83192da1262b54bb0108ad59525f7d0bf04337e7aa46b7ba72d7fddf36e46ecae8f36d80a1e9521b218ab52b0c572a3a6a8153de1b08b3eebc18f6eaa62a20de97759dd42ca30e4879b25ed4db65fc06d7307319cbbea1838b70da69e3b87f123488bd7290c1735a12afc724394366cc45ccd06063ebe768f6652bdfe233b94238ebb801d820a72aadaf2b00700ba48af4a04e2152e9cc414bf572d8b4637c93321220288080691d91a8df1af1f184240b4d4c6367d7313d0ab2bc53c2eb41dd2adf81ecee9e737779f2051eb029c4c5c2387fa402e698f7cd264547ed5004585f2e9a899363d49f314b2da9b765d676e9dac5b28f89769be54348c74b601740432331b582850395c6fc6f96f77055302b026eba5110d8ef01f296dc61bfa4f60910df23f6d5622aceb8241f5e480ab072692ee003fc5dafb4dca46440b621bf2889c86669ce677779e665b06e03578bc4afacf3c745bb9ab884a8beba9bb4d5f1c113484df140602ced06beeff2f132f643b5bb0d478005297c2185a267f4cfcda92448cea1ff1e3a238b6202e7ee01109425fdccbdd16cc8d8b35afcc240eb725654832ccf5a3a1804a4aa520cfb8f339b5b94a9507dae7be1879509768f05464401cc029d983193fccaf638001113dae3bf77143044f558f7ea86eb0a3ef29631fb00030ce8c9c3c0d6cdc2b0baf8f7a896e6996339951526fd391c9640688c53183b2418e745cca98c05630ca92fe0bd70abd09f4df3383f533bf50567bd8375f064a532d14bf73a9ac78c3168ba814131d574976845a86c13cc696a8004692c087ecf244134e72e5b90fe2a2dbee0067400a70fdd18502fe4185a00814c46eda31528e317440f2ef0ddcbbfcc46a4173c464710504ddd66efcd0c1095edd20b056cfe802333319dc8550e6f3c32f805d5810dc31cf5118a592749d79621f47604e575405c8e020791a23d043236882c34eb0f9f9aaec3454da2d4c08a612856797b463608bd07f39c75df503de78d6d2803165bfbc06628fdcecd17a3a4a900a0c06d44c81ef7d9c24289680d600acb834727070e9c58c13dd6d18c942532d089981feaafe0198c519f2d0c15752465a4f9de06451dc2597605e4d43f44ea0b83e82bb4a9fcba5a63fb2e5e524a8685a398ddde83740e3e6addd0425bab6fedae5236d519551b73ba2799ee50723709c2ce11ad8d7ec351731e460deb3c7a46d6d607f480a90509a01856f0c8d1d1b54c585aa5411f68e939c715599ca1b787efd0ad8ec86ce55b450dc554e0797d1d646c94ec5a1564a2e95bdbdab8ef8692f36c5fe3a3a1caa65a7663dfb560755463f21e595139d0a82b97ac4d85dc7ee47d634d1ce084569c6823132bd623f0a133fb06eb6f1920f5b1fba9df2b2d3bd0eb521fd6811b6b48ffc9e673f8df9636bf5a6f0f3e59e403b6398879b0b8cf027b4db0ed673db49c089a012d681d7f793d0687dc9b7f1a0d1f02b7082b8ac43802fc096adc8e9fd626d37ea83f15a34e14cb87a7bbaa29d3ee4b92fe8ebd6e52f8a61b500c1bee9c3f8dae65b5de7ba174b4e52a04e9991134a18106790fa87026ed03570281ac54795b9fb2edfa1484298abfaf182d984a5bcd2a3cc253f45b8def61c5f64993246f980ca0cd73f6d6df6889bdbdd9ce41f42d326d7c28a6974fd39b57511618f98085c1d273f594dc70a91a4ea51edbe24290fb9bedc4ab04fc2f368c65d44688316fe590fb8ead95ecb313e42c2896eef6fde75e271efabdade510740ff4945fd0899b907ddebd47116cf9e5202bcdf894ba192e8274e0dd17b3d6167782eae6aeebedb8f568e7dd80b84f7ac8f84327c9862f456cbb91987c141fa5bc2f8aa3d600b73a0a31c3186afcb3c006028805c1dfc34137b1088d66f6a312aa7eace9d3da8781252baab1da7b14c46f259807e8c47b7b56ba88e20320fdd88894b85e464dc747e867bb02d9281f585fd72ab2c13f40727138274e5699beac0732511adcb5f19506560210a462d7a685322b87344c3a537c5d78fe4b472da7c6c14a7e6a296f4f70f8084dc6d79ecc46a9e8c6f97a39208f92c643f037aae8d26cdb62afbab4e4fdbe0d4a03fe1b6f6da9927ba60d65c3cb2b7884ce478b4b4460cab4b620b88e06569bff5cb2f13e10a554608666fdcc5a9bdc5590412c0424ddc4d0cadea3de3c7db11f99e545b02ccb4c8899e7bb9065fbc4aa3a8a3ea0666a379237f37be24174986c7dbc71af3cc3e364c9c92d6f749e10d71f936d1a3c1cb1f2fb86f72bf595b2ed277a204cc854e92313db1f07a7d7c687c4f41342c5a9a41dfe110407c7ca45b7ea6ab8cc5ee3b995a3ef0d903760b0ad90a09d69a610adcdbd6fd1baa3ece8b55b6978b389376e4c69592c8c4ae288de7d3e339f72bfe03fd771ef30aa2d70366aad909d0f8d708b02b270c7e5ddbf623f50d18d202f5af45c79b3d925d9a68fb01455c6c4162e7c3db420de5280ee9fcc8798cd2dc5491b3da16e884b60cc89ed75da7b8eb390c877a2948509336cd14a405743bf7ebc35678ded7c9dc75b089c1d94e71902d28fe62601448a28cd7fcfd764892002b3a051bb8e0d1bc88c300351ff88773c2c430f42df37ec8aa950a7fec2fd6de9121bf248a9ef19a68e1b30cab0927b44a4111896614888379af45fe809ef091e95630dcfcfe3953848b1326808cdd77193a26cf3931c180ea51868a31e2b929a9573cab00044f24171b6fb89a491a9b39253648d266b1b5b93021661e5063cdd47b0421d5c33929a365e649bf9d0dd8b8df9fad10aee32c386eaca5e89a86e89e13f2272bcef3533d7b02af5dcd9c593505850ad3579087ab6220d1f56f764cab6bff48e1189be84d1dd611c16be0e2baf9ba24193c0fa5eb4b16e450f687a33b1bc2f5834b640814f3d524b692f0ea26ca4378702cdd8ca3cb7daeb6d5db59f65e318ad8a3b0c896ab7192334927802f0180f7d90abb4de127ad205acd7a8e2fcc296973243b803c69eb3f71551d25b8ede2212cc5d7829a43bb0d10965c4244d688633161e9a19366ed0b6e910094cf9897194e6e6a2ee03e07c50b4ebc36db85e2579e53c14c20495506765dccaed22f62c8ca79beba40ebdb0cebda831efc424f422cbeb49e8a1bab5dce0557eb54ee0835dd56cfd57b876b868e88a456a5fe7b63a0b411586c82983d99afd1803d61c16843ddd8adde4c00248d08cc78800494e8edb397785c495b4cba2c5e5bdfa0d14467aa0d1b33a8ff8a5ab21d5df0d287408457b3effe622c3c86d82c70f7309680175384e46dcb1720a3bd7c7e36844129c700b74f3276444fc33ae397ba211ea6fbc27d05452ea823e3fc3ff8300b3660b7d5e55e9ec6ae87140b2421ca2d09521e01d5c6c9659cd246baafea50010c1084edbbd551b69270b0c07a8f3867de89eff4fa89a43e05d2ac5ef80b218c967a1a138f9c664d86ef739c2b18ed549dfd23a3b598340a162bb7148edab5c84c6449e78ada98d66c9e5e04ba6ab46db936c3364155db709ccb48e49729383a3a38b3b40740a8d560a6ba40fdaedbad1d706bceb3c35cd44ead1d0e5cf360a38659f8e9a5afa87ff1b608bdbef6dde8e3bb45ff1f6ade86a6f915ab102485ccb4fbb4181dc318f6b9756479f9f5535cb347fd880a7f0f6e5ab4c44574e121833c96cd4bc2dd37340dc641f872b04d2f05a1baecb8e4b65fe0c9de299597900b04c73d90542650ba726b851c3feff37743e4446e1f982cc04538f7b4013c9d6f2aa649e0a2c27123974428b60f8febe4c32ae0507c03c6581a49d3f5f2df3ba22fee6d9858fc831807a3876be9513fe68e385d97501b9c4a76345dd2ecbeee93807f0b795d4dbdc68dcdafd3ce97a85fe93ee3c7da15c1fffed051104f8e76b5476a46f0b686d69c75da327b8927ca583096dd9d0cf05a85f99aff1fea8fca78e9e0e943c5221365460bc66dcc7d2f9c696e8c8a8467b9e97e00095dc6abc7839b5aceae79ba777212ff1444c54431bbe015a888d4e8e3d42bff659c800730b477c6954add5591f39bb2529e8763b0543cf58ceb912d3d9de1cdeb9c49f420f7ac3e83d43657b86d1c46f0e5b02900305568b17d9285175250347a1afb1107380ba7b75a5b1889459e69d6890326d78069c2f8d8062011173520b238703289efbab1b68814333f3461e472ae58ab16ce99284e0a12142d5599e609a89bfe3f88d3485afe3a98fb30a8ae8eec2d84caf5dd1553e0f9dadd11db238f4ff276fafc5cc772ed5e2182c7a402fcdaf2f5618f4f6ecbf35b101272572f78b13855c85ec1ccdb00c8511c6e219de14dbeba5a8fa9a9416402924cf487358019829a5499d38854cb40acc66906fb210f89c22a1e50a1715d6cfdb549abc0589ffe38825757e07b378f894a62cb0eed23a3b7386e9f703a0742affb1be6ffb842d9a1d4f35be38eaf2452b8e93bd32d79d26d35d83b36df6aab14b05b28d8c012be3ff56d386500a7834769a89b39f7c5056d00d355abf59a0cd8b4ca12cc39fe85ad066d29a6699fd0420a9bbc36ff12d7a861f8be3aa782581c9fa886d702436f3cd9e9ef435a3ae5608662546e71a353de38059455ac2037d7203d81405393ee778ef72100a626716146c50bea482a62978a0f49ec08e48bd55b10adb84fa9310b0af0dcb05b605534688f954f0d273623c6abd59ce40a86a108dad8b76135fd36086940a8ed0d3002c28e8511d6ecc5380e41c2496e779fad9eec6846c939ecd2fe85768db49aeed488b0ce372307989b41e51820b08babeec6eb926f792d5284c8a6dcce5252980891c341655a22e0c4a84964b55d02430b4fa0b864efc666887d31bcac4575cd614b9398019763281d40cf815e467ae345b9c56107b2a6f23c792965305c2dfd3f60f21787000d7d86b4f39d454237b3a398cbac81fa05134dca3acef4782248ded2df233940e805a7273fdb9f63e4a28f3e8eea819400d790f441c8e32e6a243dd696d727e5df1ac33573aee1d6375fcccad16bd6a7e56a679295309bad515b1689f7cbe296adbe69fb9c11f7d388ca4f47ba31ae1779e85e2058766566512eb8ebeddda4d620f6d7e6bfbdfa6f379c1a3d6b59bbdca24d61cddbab5cb6aa46fa3ded3b65f776b8faca169682fefdd4e7cb3eacba02eeee8c5af947aedc4b2baa538ec9bf988b59488439eceb5729521bf1b7b6f9b6d76299082e18af08af3e7b344e030c0c62f8b6f22b5b5a9274bbbf791a1450b425b081ba209a9466b9e810c5537aedcfbd66a6098cc7840e0ee074dc77f9f2ca8bf5ba0c86bd1fefc6fb00f3566a20636cee0687ec1521266aa6ba0fef825347c135f14eb30e2cbbad3df5aeb4550feaf1c4ca2da372de303d36b7c5160cf5abe64786c586634251597acab7d960bd27474964e693687c14ba690ebff7c01c7d8d7de006132c84b450274c8ab2f7a6a83ba2775d738ce495b2a6036befc0329e3ad36c3be6c73540474cebc09bb848466777136c732a7730cb1e20f4e1b7fbb1f5caae5d3e1325be535c009b610baf65e5e46c1c09d1b15d92fe6d107cc32d7675b619a59fcfab9696755f6a8ad58c09791ed5526621a2c6b7bb841001c4a5f80abc4e6705e64aaf6adf5e4965c6a943bbb237fc11425919867347f35eef65513a7956c7ef1833178814a63efcdd08cf0f255619eea8bc4b14c7bf64d484a4db4597cea1882dc92eec5114b78e5c483975bb7ab21572471c46822911a067dee67488d733ef7149e3613e2d590b12dbfd0e9cd921a6150a0d24f31039381b4e8d33b54fa932692686057b7ee31028481e91aee68e02a3d19e12fc7752cb87516394bbd7b5cde004b7acc7539a6c776d9dd421239e4733b29358d12c79b62a0e16e0a5dba70c0cca710def800c3ba0a5356f85bada004911ac0d718a47be10475b948650e2def99627a67c8de37715d549ec1d5b6946bbd6a698ef645da96111bdffdfa7468228ac245eca7a5330ddc5ac8b0729dbfaee014b0398b166ebf3a0717aa0322d7f9b48485c05e82b156249ebe5a31524e221ae849f5b1b20ecadb0915e66e5e5bf3ea57f471ced2b0a8f2cbc664bf84c6c41a60504731b432645b978d9290618dbea7ff18d0d2486a926f958546c8d8552507a844576bdda4dc3a727d1310afc34a7b9f483c1ae11869090f794cefc5245330c4c406f7a1c6b14cd3c73cac07463f02e758ba1f8ea83fafad3a05d5f7ff15e1b4c5302980d8468ef6ab3f4c391f8252ee098b1ba75b7eaca103c591bde5199ed018670abe244ac9159700848aeb2f9bc50f63edb4973dd547e46cdd97cc15ac191d4d4d6270bda5933fafa0095eb50160aa401f0ff2049df81ff6ff553ba3cdf9a2842ea14229b8651672a54b9d71c8d2777996e0c9b0f1684f69fcb3725a3087dfe0c2bc46d9e26e0955365663e2111c4947f056f7bf1a2e04b284082518940ad4ed8f1796a080364a0f87e984e8ae72f318da68c1d0cab35e5070d9cebdaa27c686f7145898da3911c174edc09039c8ae912871433204f4cf3e8e3dbb98abc677b2561e26d406b256cd4075039d9cccd7455d2e47390203f87e5c8f0a5282c6d14cd05600ed7072c2bfe0a4431e603268ffc086c3da1906b91b3bd6fc6521e0adcf85a28688cfdd8a471b12b8f1aec0c188e8ed4af87e00df01b3fcf8e82c3a6d79c5364257f257660cab664a5aac642eb1b9265149361ccd2b1ae1cf4458b07e19d8e38ea4ed96e283cd447fa01255a0f0fe11d1aa083006759c41ae2d8a83c80d9cd86cbcc2c68adf7ab238123eaa2828232c4605b2090dd68d77bc41042fdf619c79d86bacdbb075c77dc0c74775259c2075ed31ba22b388ea9d9c435ce9a6351191134f5d1956933ee0d36d1a58926f9f8e68d4720b72ab80cb21a1ecfd9bcdba1538d4aaa7584438f79a4b4bb93044e3da9e211ac2c64c65afe5aad0b829882e2cb7f3dee6fdd2105bec3b550146c8c2a5fcb745ebecd4e63399a01dff73c6ede1cecc90176d7a94b4105dfcf228882a091e41f92a3950bb5c246c44734802aade4b839a07851b431be1993de81d3fd78b92d5457283cb2a265850a9b1902468248745fd822becac531d58fba868e8b0738953b1bcd578b1cf9ce8d7744528f7e53002c054d06d523cab7e5af761efa232e12fde4b0b1fa68aa20bcb7503da710bb549f0b3b8ceb1146cb2d2830b2180e649c0d19f566ed9040286bf7141908049a4a54dd12c2005fcff3cbf7a197bf2a255baf8ab3785cb7f23da362e05648f87142d3f9544b399722fdb63b2f15843cafd96bc8863a65111f329f87c33ff899a33b2bce167cb942dba0b17804b74e0f22c02a66ea2252da5b544ee3f563a6a3c0e99b9ebf1d4e65394db2359d76d47ae61012d928c82f4517c9bef2a10f940ee5dcf2a0eb3b88213d7851b137146ab2c6e45eb5b5df0e22d31290806f12a3fde96b8ff00ef19834bc4d05fd51914f03094694279f3c5102d045d427d75a5bd35f444a72dd0a8c0b66136cb6b41874b445cf3ef6733e84d131681f48981cb670387483cde39a8076274a205a15cb7cf31596c576f423a67bc8c3788141f4b8608f69164fd3c6abe0bd0d62f3b692e8962a9d13703a02a28728608f56e06439a2dd2bd0673c0890ef3d8628c6d94896fefccf968c6ba2d8ba5055b471906e30704436bac2b1f3a6dbee16c23f474c92435f3cd29a4292a8d3f9f46d93d917d23975cf684c2ef2363548413fc8259a11a1a96cdfe73c1472ee73707ee4afca07d26fa381e64a30183490a0b8b5d3f29a7706043838dcc9ebb76b48275e5523e50bad3a7844039bfb5ed056eaab6e2b3a46ac02c5c33f67b2dfe62f286198c0ee69c8930bd700d87b058fa3d6f9da42df6324be960a7e87c67db641674f928518d1e4cc60fb228fc8bd8cb3c2f8adee62d59a3fea699f928f322e49c3653dd382067fc68dcfbbfab345fef4e3f68f8b30a19045e36bb86f0451174df7a7b37500be55e02eb3b431018dcf3f9ec259b9eed1d287d4582b1457646f20f52446c605dbbda8bbfc883caa4c985e3841aafb35b0b66320b882a98e45d23c1a730818cf4b2b9ce2ea80eaa1210c19864c32255000bb00150a6f7f6b8da48a7a934d6fca918c3462155c2774c5e373ec745ceff481f92b3769a8308993e2aac9e6d2103249f4975b69690022ba0dc403320107fcae77d31facd325788c1f83c2f70ffe9a325d51510ed1281ae82d1aa99afc540a5676c218d9e4ab3cdad54b091dcacaa0d176d098a48d39622b451182697d55f04932c34345370e704bc4d4167043217a5676944aaab03dcb17a36daf773f6b6222f08e9148a030bcb735dfc03693a5aac15dd66bdbb4bdf2bea7cded36dff87e63c062349b6390229039c68a37286a64c7582d1d991fe5cc5c91d7f58855d19f7fd5d46c43ece796fdea06b8036555983954e5380466c80a33e0c7d43a15677d5b43bc6e6af41422159af16e4a074ae0fd860879c8a2c21eb2cc90986850b370413370b940ca5053a5d402eb808dcfd59c1ab61a5860768e45e7330ed99f0359a8b42c2ff659e4c69ba9070bc0111410a9c283ed669ee179c745570d77907c263c4d75d76691e83148e3e32dd9ce8e9f95f07f744517ed6c6ec850d815cd0b18de11a506104b2a274b3e3ae09b14ea918b1769d792db630fddc7875c9b4a219593f55e448bc6baa533a417da1a4d377ef13c2470587a22f0f17b723e46a50d5f4f556e2b853a32f0f33edad837c30c101acf2ef199013fa1be46fc437efffb53257a22af75f9b80f45a3a2ec76a46baa00d4bcefaaa390c9bf1640b82273297c0c1c7c332f416f2b02e214937b418471669784e4e2d150ad02d44262e238b19d4f5ac59f4950711130f4b8f2f83cca79931f1215ac4b0589735adf2eca83b6525b67470b17784c71d4f5333b3b61f456b3981600684895796cb9a7bc10977005a0669cb4f9a91326350f66a9d46f828c30a5e0d55237671b1002f6850b1e17125c285c5350190913778535ffec2aa9d6a4562145daf1b8f2483ed05894f4deeda76ca132fb41d0a1d016382102aa3c4b2d06f8a18e81dba9606009bfbb1948bf9066db698527b925f9734a950ce2a8e0d346042a5d616b5bcf3003962e1e785192dd8f099e54f4fd4e62a6c50ccdd7e81a8992e9c7e8ed9b225922b8362b920b8e86cb3868b15fe1f12dbf0373095fd84b8b137562643e9ba80fe31a817918061f30541ecf461786c98f8690c0da059d1453c212b9693754bd087f1ffbe2634634853a9d148f0c7ff54b8b820ed6380051a82181d35047efffd64f8d6bfa51e23e5556f28827dbe941e1d6e008879bb72f819c1a0bf02413c1faeeb707bd6c49c86b8119c0cf80452c0529775367de13b979e0c7e5226b1b2bc178daae00d1eb43d1f0d3a3c52b84243abc46c0443f8957a09ebbc8b2e84fe148595e886bf84a5042ce0bd51cb1f1aeeb1c7c1153727fe0f6184baa92f730ae88ff45e6ff5aa0cd0c347ddc79da0dd3cecbc6cd3e2536b61a0b24e3682d1943ef6c69dce1fe806d20a8613684ac418b58738ca1f4eb09b5aa625d8688a9313fc99a2ede007b2b2d7f57622a7107e2defd45ec3151b5dfd25d105dbade43664a1c65ab051ad2825dab99fab3a130322287a74160b76a245ad063cd47223daadb1ea38b709922bc4c821cfe5ab9140e464b8d2ba81617adb1340953768c938f208da60b705d00dc57e3d5468a8137d612806449f2abc8ddda0ad6bc27feef86824c7edc2fec759510d133019a2fb4d7e305a56251d051bff83765709d0a04e1f880ba84e91c8e404253797e741ec2de2c984868ec38fbbab042885facef0ec87f35b5bea0d7bb280ac6b5e913723e602e8e8765e9d726835fabf7927edd5d21a8fcd7622ed1f247596157e96857c55c3b8dc0020e6da62228d503d643a0f6e562210e8e40e4761c800ce0f000b05896f12d2735318b92c757d519b969962a64aec5ce51dbd8115cce1db5009c20a935a66a661f663f9ce8c43799f31b29b4d91eb99911d8a0ea64305dbc2749054e7448adc7efe24f630449d693bb6e996c2c339e932c51163b6410013a2b808d828161fea6cf90cb0e28bc3b623454cb18729c1f345b6e87b7b150782e3ccfca596505134a09712531552b317e0e3a5f8a9fce15800c3c1366f1eee074c7f02c88d41930e414b0e8b95422658c221ca68fce11a17eb425e58830ad9f0b3737762e311ee6880bbec4717ded5275d45754c39d3044fb1e9b7c532e636b77690d84a91a0dbe1b052efc1a56e7f0c80aa1394ab0a3ac1408dc46a127093ac9abb92bff2d8e0e56c7916f68cdb9006eabe634ea659d92a261d54c4c2fd0ac9ef87b5fa4c85ef653b26d4eda2a2019917361c84774e050ceb2977ead46705b29eb14b56fec05c5a6d029bd818e12a274c2970b4a20675347d319da9e228eac6732201dad515ac2cd3b1a8e236fe25bc552e4a91bcd19034c9f67fef220e42c3aad7f8d404146e0361a36de50f7c5c097c84bd0db0a5cd4b5632cdd20b866b471c114ee04f8df3ed3556add1149011d204a89d51d64650f338d5dd66cdfb68b911889ff997bf6e13722746ac7c6699a853b7ed36dfd0a40d1bc8182cf27e0f5f84986d734ba738bfe1dd75ba3a0ca8c3b5b2bc34ff7b93fb3522cfc03397b040930f3cd75398370b6c9bb0e3e859bef39505506a2c86b2d0acac294c2fa60e80e080e2bb64bf904f14df56e330051f540009e1010ba060c0c0a78c2b44c4a6063608685ca34eff4d8e37e06d39063dfb78dea5ce1e7e1473eb0ede1d2d1b65409c34d10fe0b560d85511bc881bdf50ccab718c4811825fb109172d0b387bd90beb7216b42d36c9e8538f38c3aa636050be0681f6c68e49c97e982a73c61df80748cf0b43d579316039e6d072ad616c5e422792eb6210d3b7ae5bee205cb5050d2fada983454b1f1daa2d2f98e771e7150d77329457966a0df2b29328f8940bc5f141b248dea9a6690e53af024ddee013563fb402f4957ecdf57a4e44da13ad27a34f3846ba99bf86da916430c8516624166c26d3a7301bada3e54d1f938dd690e283189b08ece3645be67c1eb1eff55ee11e4d98b7495c47545d1bff705e0dff5ab5ecb2230520c50a1724336bc3673124fefc6662dd8e802f6124aac2cce30403f82e4b152065f51e924194e566e2f9fac2800d82e3d8587a24fb5671623000afaa2a02e9eb9142d7da2a9f02fb797d7c995e6a4c277ba1692ec73705bb95464f33e7fb4548edf07579b46f98eb39eac684e5fd1ee65162062cbef301078b5702f5c4bf8fe31121daebc1101c54aca70df008582c46eca5f12f8b96f12677b4e07f44941fd7ba82ae5991c5a74a6ffb6364d48b978874101fb47afb2a6b7ca6cb3bb68ef85c179f225e6e7cb1a9816c4d8781257bf76f4456f4d26da1d5803e776ae54f5753ea269cee5333d4dbfde6c56571ff220dc62700ac6d9c791c551eea152ebd82f6082f1c0886e27264e9218af608e645acaba668b57c1e6fdcfe1873ba89686e8936a9e2a88bbc706b665938507bd9a8aaf3e1e153c1a4361b76a053f8d2e2d59f3f05d5bf5523c27897b59c65eaa2fc39f3fc1a1b994c9dde7b64b4624c4fa95a60ac21a263b0a36f32a8d6abaeed48f3e4acfaae7242e06dc8c844273942fefa436accd8f0a063a9717fb9aea6aa6a3c5f69d7d6a31a84dcfaf377ba33505ef0177210662c22bc182454becc81bf5ee49bfd329f716eebb3aa618c2a3079153ccc74568ac7eccfa28e323ec4a12fe397fb167c5fa9f34de56b872de4e64be533bd430c1c6dc8419f0f344fe126c2396051473bd8cba6a38c2ee85654e0ebb2a24f0b83f6c1178187b808035713b43b19477c3b84782d1d739c36a600531aa3668c8a15889f9d8ee98344437a52c2f31bac9d8df602682ec28ba1d02c4c3b559ec4968ba3a6ff6d6541745840b6362bd05188b55e0c01efc8256da46450ac355ea48963ee9a5a1e4706704953d55bce83a155d42509f215d91ba9e3a67478a965d7a81c2f130c6b47efd5f50b8fb93938c66210a823366bdc0b43c00791c7b772c7957b2ed40138019249f5e90808347d1c3478f0744c224413e7e796620b9a8ea3b433d1d69e88002892a059e2c7d251e2948e0596435d3b2d5438ab900328973a996b1ef85ef132c9ef19df2ddbcd3204326b541639cd034f3a169a18c08dda525166a9e11497e1389a5e3c1ac21435ecdbff044ac7d4e094610c7c3e8bbe41d63f4878702a86dda9a5542104ee933054d42c676b0b532bbb031b03fd6ac16e1938cbbb87bac4ce65b1b07ff0d4d06b5622369480c0ee49b2f4208ef5dfa8b95c7a6196f66fd48c2aa157f4f54657e32aadf29f277baac573993af60711e9a8aaa515c03369068a5bdca57d754ebfb178989913f51958e7bb1d01d14fa4e93b29042c5e505d2707e485318f7c3415ba8fb0f2914e04b76cf6f1b624a540acecde2159b18a10422b177b322801d2ecc89661b5d5d3b1d6862b6a4172a8f0be1c95a1562ea6f29a460116e331ddb21a4812bb6c89d472cd1e126a17597ad1faac12d91125b30148c96a2ded2852a33e6cc5e408bb44cf8d0d03b4b73fa90089d6e9fc17f0c7a400a827292a13ab92ea3f09e4ac7b6109fdc00c21a517bb2737cbe8f37ba9f5718106f3396e06edcd02eca8dde49fe375977c3e9e1db2a646fb444d3b8d838a1f1f67b02e1b2ac0e885da487e723ffb70c504bf948d5b02cccca1b013e9c089f2806141f41b1d5a2277c008b986c54ea48cb517c88e1e9f8b463341c27946c5368d5cd862d0734861219f02cd5d43497ef3f514a2f81c93028be8b91c739a22924243ab66b23f164d6bcd625a6a6a11ebc1b518737699b19141145ac38b334b99c9996dfe84425d9145189dca6853689ac19b53f41ba0ac0540ba20fc6f4a0947a04d495901685bc4b6f513cc75fc07c9b40010a43514c5a04b47973e72a96b6de52af8ee242101044ba65656e537383059dc2776719874b3e528e0764aaa091d2b16a4a6bea6a1a58e09017cf93bded9c95aa8b04e65a62d25151c75f6591c1732470e5d04625a2fb2813e9f8b75825fe9231932810a17a33f5710e58bb00b4ec6f3732407a870e73ea718f2d7387720679dbb72c9797ac334d70e0761f35abe44042fbcfe196942494c4c943a1f3aa3e857a31531efc0021c254202b8977670ef8d85071ce4dcdce7078e134d134de309239eb0b21a3b9c0dc81733b351bbd02075ea0770fb9b274dcff4aa4257aa427e1a53bec4ec25c99a917663317f608269c0fd19332fdce31e78036640f5af03f44c9b73c2aecd7ad6c12208b69023f4f2443856ed50894635ba2347e7f213822f953fd398b1e42243e8b455aae8c0983133d9b3754b78535da58ed17e4adcdca67e4ced4ba7648c23d47ab9d5c9bfd217219e7bf123c835b36102a74bd23306ee977b93a91f7a8bb98c77ba28faf22ec01b47ce18b52adaf08f37f79a72b4c2148f922706fb9fabf08008c3604bcd0c962f65156f16f65b1f7cf23a2833cbc3b60e552ddfec02a932826964d72b8138e523b9c69f61ff475fa1d676fa2f21c5babe102945327e0033107e7f500d568cedc61ea08e3223e1c7f8a3e8b870ab69657c2f0a3e7710d7428a2a393f8ec62b7d1b40ed690b35db922c6ea4d405a9159b4b2fe0dc0bd7371b5c0f13beba7957e0959aea8e0047efe460564593b7bbd0cdc9451ba602cceaea6f0544006e1b4289c927f690c48742f44aac540f9894ff656a5136be19f1cf48b5be0316bdb524fe15a832d51f8e8cf8508b26e17c5b98fd4790ecd6d39061dabf5cf851ecf0b4c248766f54a893875c6f8d8240134ea30ab7478846f6713098042019c37379040e91039e321364ec56f86158f7d6045e0ebf36498a2048eacfe849845ad53564d9c9f693e479c778a8ac353f16d49f321cfd51b0a01fc7570399ae2e80421a272bf9e7e685d1fa15580683834c75a3eb68c1fde59ff1549bace954ed182dcf5b2f6b51549d0e838238e8c2e0346a500af76ae81ff9562244a7b856a214fcca894bf907ddeb6c910a302f7ae922d57c7b736f547379f75e79b1afc268ec088a059c9be6846cced56eee1f7d0b9e95d1a48417548d4853f494380a0b25bd1dd1d78dc6ffe41c50643aa1cd4a428cf85f5b5b68ed9424b00a4049c951cb204ab45631f38484603bb4b901c710c23605b38806d83da00b05141dd990817d73a712682ced3495cea192bdba6784b784dc9baee72525afe1e918793dc64153244204899033239bae1c7a54e2cd5e70045f1a499f265545a354c19f2214c038cd4bac20e90e10de9ea087535b14ad1c6fb06f33686f9bde08278194f20509cea808c956151aa65868ff0bbe0e6f426492bd880ff1c03861881327707f30a737e0f2485683a4aa8ce0ddb9d6b48a30724af2ac0e6c599b105ea9d02a5de72047f61e0dc3c193aaa595c3aa352550eb5d71e4812d6526a9daeaa4490a0e245d54f2a152ce1e6a1dc88d03e6ddf846dbcf7b82ab6157c9b6b3c7c4b4be5456138ce981fba26477d9a3057c1b83cfd0770bff813571d88071620ead058e48f8a6dc68eed7256a170da95cd2409ae67b1c0a84c100a67ec43604a8044598c46d0368460860dd470197905335bceacebffc8a4f1546ac2c1607920c8042246ddbaa2bb7e8f054bba7bc87ba477020b1efe2e7a3a89a319f2805276bc91b0459e5d1cb80d364cd295d4089a9a546c2e3015050bdc7b3e7673bb6186e052efb5c27a3c1dacbdba46e07828790c8d8ba1554033c9b34005dd2dfd8911e4caf3c1b1fd4e2e32ae0222eb4f29f5206b972f509ac2449e4bdc8d1d01094b6b14552f0550d93440db4a6e4b22559e9c609fd34f092e4e615da67611e9fd166c12e6de08ec8047d6309417f4dd5b8b3453e37d45d265fada81d3da5f3046329bd50ab2407d70d8b04190e3344c462045a098a8f1dcbef0252babf3d89790dc922c1f8b80a3a143657ea9322c4e93a69431066fa4829665f95ac0a6901e564b5ae27424cb19260077b5c55ab9a7f28d9325aaf09542a84746c0e0af23561a24bed99f80d9d75cc1e019512bcda61b62d792d35a6affe4c8834d3eaa36ec59de0645ecdc5e3ad7efd3e60a0197175a16c562d6b165c13486530d3447d0fe10f2510bf18b62770b88aba2f53f55ee4cf2ce7d82609b4a1b4e9735eec53c157e06ddbbaff5cfd5f41236fea05a0ee0c52921468dc3b01e89b9603a4cb894ee975a6923370f7d1440e8da0c416ab7674562ccd302c2adf1d6f5d7272741163a1113be8bc7fd59ed5c9f91c7abc94ff8a39ac536121f557e9cc4371219612d39c505df9f75acb94a1fe842b3bf0054eb051aa3a9a7b93e04229cb6fb2bc602ee116eca5349708cd870af1641b27f7acff63170785c1fa3ccd84f7342b87087e59643797605c8d052355502f1058e8fea5ed22a2909aebd99b7d1e9dcab56fd2ea12aabc338ca7658e5b1f781ae5c429550c5b925f18aec6071b4b8e96d4de19f905ae40be63e6ab6fa986d5daf504195a3cac5b1f08f3a78e3f3b06f99eb78bdddb4836554d9a1b951f44505e4a4a1dd91f2b278c9b8f67bc310dc2adb1053a8a4b718a7acf0589c55107124e1d07fb21438cad48257cd2d58f60e7986105bb85e32133c7fdd4f1729642895c20e57382e8810a6a59162703403bd715dd399543066bbbd3a7d86bac0ae376a49c47c57d2d5e21982a79ea4ef1c964901b2e90231399657be35435a0996f1cb26199b3d0e89844c429c31613df97d37acdbace40479e5726e93057747d6e9a9153463ce56f35d54b93b5ed74039d3372bf2ccab9ac9cfb24eb7793b83a143b255bf283566b7496a7de7b6f1fd00182dfb6d7e964627646f9db36732abcd074ed32667a51459d7aea75a48b554cd5ec5466126f89847e36ff12da65ab5378b7437ebcf34a6d4a349b92c84d85a7d6a2e372f12476e55c5616c7bd80814904f5a14c18ed3bd9d16379bd32c6c1fcb0977b4ea92da1515a190ff666ead5cb09abd9d399b80d3654a2e42e71422e7cee07ec53434120f3e93b653b6d8ac448685742b13136127b60c750901b27302fe4a8d331fe2c246b22115dbc9d2f3c9f560323bb9b7d05273a935a9b882504793b8fbcf59d132368f8a04f8d722ec84e098508ed3bed3e583c661a085e45b56216f42364fd978417d34651a18560d582a4298dadee82a2dee1bb701350475b011886be40e477e5c31972a4caa6cf9f16872155f09742a2b5452864fbaddbd1f40da5b5b2b25de2db94db7775b39b000535860079f7c2566eba818a40e7db76fce66652b39b0d641b714c9c8fdbf0c4d11b9ed6ce5b395635dfea0e66ce34aba5e842aec1f247ec1388d06793090bd284c0cdb92df5efce4fb537bb54b6c2517f2177539835379cc19d9cebbce12b4fd08b64d907a1044b57a18bd9cc5e22d262da0bdb318ab177e29112a4d226cebaa355e2a1bd2e6a220b5feab47c86f198bdf7399d7bea8234faf4083847bac5d4a542e70df1b900840ea80536a70f2976345318bd4072e7242f88ea12824c5790ca396b174fa49bb751c47eda284024a571aa6d35aab06e2e2b8cb343190f582abdc66f72565e844bcfd125c73cb1c8406e77d465af75b77fda1c623b890e7b965f04d36a19a507b43e05b385fcc9f9d2210e00adecca645b28feb1b27a1624b8c46e05e4d5b0837d55512f11008e3c51af71573ae62b1ccdc1e38742d65883a2c23d952171310e16334190d7ae091f4899caa64b13701bde22a0f290e4e3c5d19763f2157a7728c1526e8475d7f71dca0931d7064f5c7e59d7dc207cbe90d43feab76931ce4e8d97891c22037cee017a11ed355e805415a70378a238621c824526ea393c3711327ed102c54730648feaf9c7f3725e1ad689dd1cf8a571a2685d2ef214dfdff98cb9637639b7fb1c86e93e77660ad4ce3a2306246be3f1941b670de0bff8077eda646fb9b74c52ca94a494011a0321036f03f9ca594e5a7fce39e79c94524a29fdffffff5a6b875cb88582a57dbab9515be1564e9ce86ed40280434122010881c251a0e80851a0a8d8cf160f638c31c62d68a9540a007c6aad8aceda16e6ee3df9d05a15e5dae5fcafd6aa2a8ddf2ee7436aadaa5608738e9c339673fe909cb47ad6c1dae5a4f5fb24a59452ca39e79c73524a29a5f4ffffff6badf5c4e5e22d149682e00ab64b9da371b48dbea163eed39a032ea8e7b2d4a7d362ce0a56d12db97472dc2e6f86ba867eb8511b7948ad557504b00ff44c6e1460517dc2d9bb8d834f398ea35cff871e5aaba211b6cbf93f44673bababbadad1cfc9796b55f5651f595a09fd09929793d620fa94f5a9d3a7aa4fdda793cb496bd5ddddddeeeeee2ea59452ca39e79c7376ceffffffff63d682d60054f4e995baa5592062882884d803078fe521458d7ecb489fac95564edbb66ddbb6e59c73ce19638c31c65f85feff595a6afdcdc6b66d9b084ca552a9541502492452ce9173cef9415eb4cb495f73fc58541630c618e3da2e27fdeeeeee7677777729a59452464a29a59462211b127daa508b52a9542a950a60ff00d12688b8829803878dfbb478c3636911671c7539b825baa0b66ddbb66df32ee79c73ce2d5ea9864a4ddf116ed43a18638c31feaa55158542a1509b8d6ddbb62c8e4623f81d18b17639f363f13972ce39e7ff6f9793ce39e79c336585aad00b4b050bef8a1b4882a9388a31220b443c0d0ae1b1bc6899227dce4a9f9366b3826a4e6ede75dd8ba730042bb04e980933613411e804c418638c71c580d3e9b4d9d8b66dfb2ba2b0cb3b1fc23befbcf3cebb8e524adbe5c418638ca594524a59853e442291482412c4c17d9006f7c1205690e33e0de2782c90e40e4939734a6edbb66ddb3652e3e05e3324fa58dad31edca8ad6809abcb5a2a56b037f5569f659f4943a21518820cc056d5be3d16d3c6b66ddbb6cdd0b49973ce76e9eeeeeef843a3d168341a8d606a05bb25c0c611dce00d30e63ec881fb62dc0759b84fabc07bff59f6f9682a60aaab90e87b6442107d86b8519393881bb5fa72e34d7693fd67d9e7d30243de55dc63d1437292939ce42427a59452b6777777f7cf90f6a1209eac33ad4a769dbbbbbbfbf0e1c3c7088931c6584a29a59439e79c739e29564a29a594d3dddddda507c45e2ee048e47201b55a63edea55c492907c4c4e523eb831c618e31d220a46146c97979db48278b2ced777131f7d8abd04fa97b5e69c73ced9755dce584a2cb1c4124b2cf1a44dad55e59c73ce9e73ced98330e79c734e4a29a594765dd775dd9c73ce39e5ffffffd75a6bad554a29a594240f5eef63bf5b1f6b82923282848aaba874842a2aefbdf8faf9cb31e79c739e14c38a31c698fa0e72db1ec4933ded6097a515c4937d07bb2cfd199233b6cb496ba5ed72feffffff9c73ce394d7cf8f0d1de514a29a5b4d65a6badffffff6fa9584a29a5947aadb5d65affffff9fda9394112434efa0773511b6cb49ebd76ddbb66d43b171dbb66dabb5d65aebffffff731c97626bad4d29a59452148ba2592346d8e0dca8a9a4b41da01f37347794f012253ac212252af63418db3d44ea1253c768cea050b10923398e9301c66e772927fdfff82448a85815b93db9bdd00c350dd590bc81c989ad9f3b949c62df754cc26a16641f862c7c131685144ed8ee09a1c7947e1f4b1ccd3761403c596764a9b01e0a52e346cd00212294446f8c50172a23aef88a151de18a15159b007cc20d4188d622d2966609097d0c3061e6689a1ec442c9c9226ed40c2073440e209a2d376a2a4c181084809b1576e46a80b5aaae5907bb58240b8b776461a998e45e8a576bf6d12a88020e2a29957c3e3696897da0931b7253c1d6e9f93dc7711cc7719eb30761c2c0ab015f69d6c128acdd65ad49e1652dfa5dd7755d5742ad03d8af7d7aa7d3e9743a2de146cda45dce87d45a55ad2a206045bb9cff34eb6057fd0f598bd6cf3ad835ad35e7acb5d65a6b873c24432efea5f89a627f847d10091b122a2af6419af3d0ec83445eba5103b98e9087421d61285431cf70c58ca3aeebbaaeebe228cee0464dab95beeeb91e1cc7711cf7b66a9743745dd7759db452ca9973ce39d7aa79c885ac200accdca895802961c284ad20916f376a00a871a36601c056100a0e23054f21858e3085142ac6622b85a4472b00e47c68ad8aaa805c5f0de07a701cc7715c3744d775ddd575d6aa3ae7c8390731b0ae284a792af2b66362c4c8c7d35a16ad8a91eb9d8899890bb5083df741f86aa5c913582fbe1742c3148323c6d80d4121f763e79c93d2cbf6c03e7125a609322fc8c4c8e020b303c97d2699930c0f484c324928e9b45062494848484a4a64f2c87d261b6830b96c9c747a40a92e483991c1084f8a8485261b88f8dc4f5c819fb80241a6191f4eb00b05d6490b1a84ef5f4c2f2ef7055fd1cff821721d825e6ac418bb5fb2e9450729e59c2f2fa7ffaf95e9e5c7cbcd75c304b359181f687345d60403034cc7a7d3d9bb46446066380106e68a1ec6e58a3291c7e269511b31c170f69fc5300ceb74608ad03a2eb04e32e079c2cb5e8a9b2b4a99b1e3ade7b180f07ef676c4d0e88009c4e1c247870c24c7c0a00324d4c486ccef33c5eca0870c91982284c434c105e485183c3132321c36d0d92106769a71c9f0a0062b938419ac1664a868a8a1da80e17b9081ba20c694818cb421c501b78188989e01260718667c68c171d30c1057de679af9e18a32ed44878e3f50a181ee6e9cae8169860d4c33483708d1515a2cd0a9db9a834412f096eced3f8af24226fad0cf63f1ee0b6043378dae36c3a53e16ff589866b07061b0de0ba1442d02507b5a0cdd0b40b80014164c7464263400810529100ca104383b8c6052ca449a894df60386d7fb4c35e4380f0b05032619789862e85032f0f4ff3fc6ffbf115e66a8f9eca9cbfd1322a060e09389986ad0713522289cf3e5bc4bac7004671c620bbc7829e2831fb50a15ad97ba51b3efe66af15244ad5638a294524a29adac890faa5d2e28a96a75ce39e79cd3da2c832918376a201187449728c33b1c987a100a014f100577c00c7980a497226aa987d7eb53adb5be4cab4549140a8542552fe08b9c9c9c9c9cf974ba5575ce9173ce39bb747777f7ffff7f12894422914896890f15522491482412c9a55f4edf3f954a752a954aa5b0cc0342adbbbbbb630b57b831c6dddddd9d79463e1a8d46a3519c41884f777777f74e76280f88acbaeeeeee56997d3a9d4eb81b376edcb87163777777a758cee5025ed08a9546dad44591e31151566641503f6ed444ba9122b8c8e353b1887a10422822124724b9e41381885bac015dfcff43933ef9a430056b7b5f72d20ae2c93a555629a59452feffff8f46a3d168341ac5d168341a8d62ad2cfa97c516ae7063c7d8dddddd23aa512854bb70b54b2aa594524a39673bc618638c2d4be50ccfe5a46fd29ff4542beb5596bdb067ed85611b84afeb649e778aa3ae4b9d322a4312cee9138cb1db5dc2d8ed2ee5743927a5ffb5a25f2bebaa2c6baf0bc33a9d4c4516e2292324259a8afbbca4623f8019a06652534201acf1e16d848078b20e7659abaa4fa77422401da8901891827262f2292119110901f1641decb25655e9cb0f1decb256559f4ee9a68d060fb80b9a6662054577afa006059776778d0fb7bbfdd3353ddcd6443ed554439211d13eeb4fdf748a7b297aa6796852975a478f7aa66152375cbb4b3927957352fa5f21fdafb5aaac5a559665ed65597b5d18d6b1375711f769580ed6b9efe6bec8bd144f8b378028d9081149f146dc7e4419b125e74784a121e747a763874d4907c7a3a42343187006c2c0ad066c8130207e3710e887739f039ec863b7bb94d3e59c94fe57fab5569565d9cab2f6ba30ac73619d4e96793c2099070424244444646484a4a4e4f331313919b17085a4a4c442906885fb1eaa4f3c4d060bc6931c324977b8403d60def7529ce490897e4affb7301b5a6b54b354cedd3db4723ba8db1dee762775bbd3dd6eab6bfb272f590d9da0325127e7b6d6c9b9ad75726814797b88da5e4048d7c30f345470351aa6186f620587acb241e500081a40b8a24c9ba1f1e38ab42c0735d85413034c4d4c8d073450b35d91a682473d6539fb4026828c068e16dc048d1e64d0e8d042638217684a31688288414d72c85230e67d261a1c9a03470348a094529aecd1b86400c769666e0772b0ea1571b796da8e7f3e9ad61f6b625251a070fa7f2f0061ff60e23412628cdd342ef713579e122c488304e891115db8309ee608346ed0c0e17e68e0a03eb04e62781da465825982209a20dc5d4a144d0d28a5f49f0633014493c2e40dd6898cdf415663c60629c87640ef33cdfc00c64f3a2795c944da9c73ce395b90bd641ec8469059183d6424c85490bd290686fbf799625a30826575207c1a4a8cec4980da78d7681db94f0d446f353a9c54bb4b3927957352fa5fe97fad5565d5aab22c6baf67597b5d18d6b9605ca86118eb64323c3817461e84b830a2e28e987988a4222e84711467222e2207081ea8d4cd098812ac712124dd802e50066c793b622ab6ffb8d006c6d8ed2e61ec769772ba9c93d2ff4abfd6aab22c5b59d65e1786752eacd3c9328f070424444464648484a4e48144290f2452e1422d444588c87bd146d8af2516438f00019aa5a894107a3b2201802008531900000221108571408db31049680714000b285a4a486e342a2e4896c863811021483120ca18600830041863c0ccccd098072287bc9d40bbe8227a12012e4435548bd8adec1339a97b76ae25b982b373600eeac56b045f1f8f70271d25c3c147f5fc21b56413380c17c2a58fee0a485c7d9c2327a48abea3daee3178f600337757fcd2a1ca992d67f9f9fbcedca3a43e79f1538f996e9817164eef3eba3c9147d74ba891548af59cbdc1bcf0dc11a8fc35487827ea646228775711bf67dddbdc3e57a7f24e8ddedacdc22122551597f9c99f257079f508fe60934c9d0231ac26a50959dae0d4c8912c6d434ef7f54680570997bce4c650c204c06ac2293c53b65bc235eba9b4650a9c4b884a2515dd4b2da89e1b15afa640cdf324eaf844a9eec9f1f1954c506ed09dd6228173276815335147fba4ab509820eaf69436ffb95f3d4f9111bcb6417c3541966b2417cdae62374b13bbf2b5d996d2217ad16a18b6c1d450d14784ec38e28e8ee3a049f809f3dc9916b9cc02951165d88d93e66be7ce2395d7f4108ef2973469f469c7470b607ef3f5f3cf2fec19791c589a208866bebeae47459d5c1b62adb428c2f0634242e2153d6ffbb308bd3cce1ea2cf0e67182e5ac3e313c8ea86bf14703754815a0c72d540147a19d06b86931fc9940c38a1ce6d79e627ae8f05377e44a68c99137f8a5a9a9dc14bcffc39b102a491518369a41c461b615450d49d712126f186c1222ce5e1c138fa6d64210a3d38ce70ce8d5f697088dfe7beb0201c755ebb66af2d2f3f79149dccb4fe712a5698420c810fc6ade299b96868b5cddcd000233602d1b7c1ccd08de174c7b7c24e275761f346aa8eed25896a622bd8e77813d8e47233d8a7a629d69c8726efc8d4b17b93a9c3f6d218e9ce9b440dd60b29556caf242a8f658499c444636e1312f14474f519257033112236f2a424e0be75acbfe7e22bd397a1f3cd78ad422f27305fdc1e76825c15cb6bb22a76dfde1fb060bcac625a509a0cf55fe7589746636d406189582ecc9782926e8b41ba01be3fdfd8d4f231efb8752ff872084f1be21c63c85d5777aab4590c84d2090a03c92b613a5f9e1b13d7e2fa7c362afd68f15f06167e88d17b0e88093f28db40e9806b0400ae009600a06e0e97b7acb7f1a2d8d55c437b84aa2b1e58c15f2bc3665d279bd3cc1a21c0b5770a2b62cbd096de71bfbbd453d5f2d47d16a5fd3a9672e5a3148eccfbdeb5e5789d39de6718119d40659b74ed553f0ae8048b6093df3d709c847980228d549adc10a5bc9068bd777d732ed59012077736b32f0554a382d32f4fcf62da6eb605748f39cf3388c0d9247032101220579ce36c9845661ee4f00b9e81c4d5f66e058ce314e65a74684458b30f661eeacef6ba4e73ddc7e96ad8a4feacaec3543f5a0b62363ab145c4cde9a5368a54c7058bca4d5c19890f6c33a7c69d0bf9d5b75ef6e5e912b3f840aa207a7836ff918c4c22e3f9783d11768d84cf187b4c80a8a5cf495845d71bcf3c0617b99f1c643ad6e83f44bef8695d1a2fdbb8f23652a679f5838d0417c7052163717a3f9d51389493f9bcb96dbe3821874cd63c5d15aeb942645eaeb1fe38e4e3760aaded093f1e041dde6b08f5f458a0a6145c30e7a7ef0e74dd5ef33ca8f09ec0a9a78f03b5256195293f7d77a4d7e6bac74287f5055e3d7d1ca85eaa411973767ace48d7ed351eefcea21870b868352829cf3baeb4a88fddfa4f50767f38747b2cca77678ebcdf9f27e4bf1b4e3fa88abe067e7f7f5e8c94454845cd2eaadc9d4ba754a692f7f4e68f66cd7e5c722fc5e650d76f598c2225a379281cd79ed4c11e9909e1cd7935e972b145ca21611615725634bfc006178491c74afdedc3d5160cbbe806a5d3580e0d86c823ad2e0c49f17b5de04bf5743b12ef293c8fb63ede213eb940330da8a69ab531af6d359cd45dc2e5412239c915f31c82a893f46b9ec379c21f8646a1ed9e0428cf73080d85e8cd8dc499dc6b24eed8e9e6b5faf923033c9dcc9ce07e5c01752c49116fdf4f6f38895671e8bc42f1113319ef468a3eb7e8907b0e32fc14dd07e7d10b2ac14880e5ccd14078385e93438bf244cf6b85d3759320b853179ddaf2ad3566c4ff1e061f49cc219d2ccfa263d12a04600913f77e6dca57370d0d4056c7602477657a912bd4cd94f46d10e27edb75c87833834be8ea6ee3498fb09271c6cec7545e43c304c9a6529040c800e1114dadb522c8153df56971f036c33691bb6ddd128c00b0b3abf3d3199e050c11e20d786821f54f3db871102050fcb6573e8112cb96181e28e61c3b41cfa36c95c3539dcd9ca7ea828775a0a1a2f44dcd971d23f77eaa369eb2eaa1db6792ee003a60228992d1f4d293191da4a876d420dfe4a146f8464c0936376f72191c0544b6d09d86b67e2ee708fd57e0eb0f045743784d905a4208d3b920680b30a8fa5a90026024a81c44e1046916ace7d2456ed2147d12a4605f5f71e71f00c453b6faf2168060aef89a3cfc3e453941fed21482a9f0ac1fd0903cadd64e3084d38bac43e8105aa7aff56dbcac001010cf8a48bb6c3fc14029fb7775c509e11e187182c1421662bb25010300f2c23e2bdc2b61fff3e92a8c6690f78f28567847a1520de36db9bf2cba51300c5be6947063f3519ebb52c43336e2ac04ef4c48e8d098ed6f6e9c25e6f9cea681af053509a5c303d7317c434e319a71b25d01fce89baaabc82bc313444e42cea273e7951861a82ce7b96ee2d43e8ac6298ed012bd50d97114ade67548f176c2764dfc3de3738979d5bbb602f5a2e3c5b461b3d0ed25dc41e4e9137290ef7d1061abe87079f5893fe550c0ae062c530ac52802d664cd5945046ca0432058843dcb34eae940d8e30eb3c4194a42f247826ca21251c104b8ceadfcb618e6b60046c5546f4ff86601112b0f8c5e5b8d7d6c88ce7b3e18044b1333a3853d1444200a4650308844fb3b3c1b557668e0aeb771f7c18040216e4fb70f14e2350f8ce911a08707f678fc35447ce448f56ced9489402a02113313d05825e6d297f501b9703656047fc03d1e9961b8747108cdeb5668199954a78c9c5089e428a773f1e8b2fe952de09778329fd09495a9f625b2600cbd5e225f5f82cf3049045ce444a31806b8e494e67af57219faf2592ced2861c887d7f70e0856138226ce80fa596f6b6f9fa99b1056c7a73d179c6b813d8d2c27470157bdeaad67e080af51c262b5f8756aeaf6faaaf3e390be0ad43f65e65076366c2a9f2be0390ecd22e07dda487c95a2fccb692ec7450148a2673950379c228225ca5ae92ea06ef35ad6549fefaa37b0fbb9a7ff0150aa43825986ba7f88616265a3ff29a3d3f821af5490ce0f64bc1b7de9dbd4bcf0f82757b56b35f48b183acaa3c6e04a6b3b3f3c54cbaaf958eba1ee51eb08cc478a0a3780d25a54681654ff0719683680ef7c220be47c1daf595528086cd17c3ff4299b2d6c00bad9317c597191f5a9cb2b629543c87b690239d7b8562e24d8777831561bdf8e04d354524db5965977d8d8bfac6e5be62318dc13710ff8d70434075d342781e332cf61b3241a979f7a5c8ba346301e2515a819edeab3a3698900429acbb9147b15aec329d8f8afad82c1a1e60164c0b1da2b5cf73436d02bff80a1cf23276359533408be97fc894a6ef81aa82751d40d33a9ef19b1253b308c33f22c7cb6fe38cc50d65349f8618d0c74dfde95e92644b9c2b1a4e866ead395a12a043bf70112d3651f1366caa6ab3d670c0f0ff89d985c8260db1a1968bedd6b63cc7e7d8d88454a49d58dd80af86977d49514d62a1f6809d75f1dbed2b0b6aee2f31a2211ce257cb0986f785c7fe06219409c6b1d1367811fcf1a977fcda880b86fa4e29d70247b4bee782b945bc6e7e1f6dabce36a3babf44350918c5c5a08a74a3bdbaeda8f033772f7efb93ed4bfad5d1d8599d5895e4b239100906ed9173debbbcd0d8ba7437006baea2d556ed6d84a65c7d78ef57f6b842d5b060ea15e2cecaf419b0ad9fa5a936272acb790540cf6108cbc43af646de84cd6024fe4a1a2cac26396b76f95d6d5897b47e350d88bd26ac2d12fe1f80f9e844e4dea3d4397682b6b64f1020a9a0a6c0ee1cbc3e538909b753e5950b849e0218ad040b14062a94c9763b663083d479eebafccb8c3d5ea063893fbc38d1c26ab417e7815a91d9e728f7eb245a9e5d86ba9782b9f91d3331cb66673ccf09cefd48049d92855e756dc8d990d0872373956fefc0d0fb98437147b638ee87fd4194aed669c6c73287f741851f35ff77b76d712f00049150180e04d918e114ca0a185e500c8c3fe08db5e0b6a49f72f9c296e4e2cd8d445cdcb14de99304458bcc92946e2987bc5266f642c01c09863d7088f070c22355e078543e294d239184e811b5e730d348528fbaf00fbba0244ecb71e1617b4093a204fb1a0012aa6ca80073eb78236db2c5ae7ab06f64d8133f87aa241e89b2dd42d844976a2bfe0a44893cf574476b9fdc6e0e07acdce12665a414a183c547c770be303bfaca28db99152beb301174af277d748f92a96c888e610fed8afb50d3e2292c179b1a457e326d321456873617309c48e7d433f52525f100be829842c71ed96cb107eef363e9ea68b7a0f283cc254d10e76448bc0c879a156fc13a422fc9eb77d8525dd95f79f7d058988fa78e7e6082fa7b4d80531ad697c20d7987c61c0ba4516ee98b07c710c110c6ab99143f94af1135b014b850c3688cea09153f4f5bffd9508ebd8e0d69550ed0da2e322244212c0069a0f656263428404b1db070922e859f793266c930056112a385d618eeb1438f57b61628dc05d1742ee9bd6b8503f52294653269aafafb0b8ecd042cb7c7c8cfb1b6e87c947892464110b2bad993cb94d2cc57be3d476162794dc7034ed41a09f799b112ce9a0716fdb2adaca8e101ae526ce3027d11205f29c145770c486b898e65c3f0f86129b61c42fecc6ed1dc4d67cf64624e5a143e7540ba1b3a50ffa4e117cd90baccb77866d649d81a284755a1618b35628b6b8825d7df9f88e41298c396365e6642948085866e064febf01dcb6b230848930cf079ca37cdf405db6cdda1466047816716afc6f606e1b599a424690e523a728ff674073205e0eb39c80c506380863aae7c184023d222bdb21f6db9e90f1667d5a25a3aac8e6a1806464241e3afe526721adcb4261e27b714d38c26cf461fc1bb77078897c0c1147dab28af1bdf8417908a29c6c400a66bd70cb96113fa9f7f89cb4b2ae0ea11a4ac4414a24f24826edf39319dcbecd44eae12c904ee3ad354ad194702796e87f0f38f475e01ba162891552f18f5005795e1df5137195381a8b64db1026276e2024390fc4b40d30090dc8c8c88db1b8c4295f6f55e3338a76a4dfbce66c962f26d3a59ae3b8d03e6997bcbc7c24fe702a510bb55b51d38ee07dd59eb9b12f882b6de601fbbe46d04afe22596507c533fc3c68e88ddb4d5ccb393ee47e7061b7bc6b846c4e296f03d9b24d20e542b37b119a8c72badaff1a25e5246e954d9c86b1cb2d628b0fbbeb60654702f77b91201116f1910c6802a0e52beb226e51b2df162ac689232ce6802ea8548d978c053b39c6e2085ea70e480b8b23aa1a9f9fb10fec261cd6df5c4501d724c20006810a183d8d808a9aea5ec306581244b4e40801949c86e2f6949cdb147c29086a4cfeb9ae9d107057b6655d8ddb68c6e43c6203d20bc6b1010bfbf7ccb4169da93060e0be2358fe3a6d955e115352b9a735b8430e3e9bcb81714abf91ab1d359aa8a11d044777b60687a3b8ee17bcb702006bfe11ff39b8a0720464330f1b619cf50f10e45b913813b79d72464627f705e2f6fbe6bec0f86107d6888ab9b866b865289efcefe9cac9ea5c0ead60305e05fd22c78ebc06498400a43da4f425c2772feef5a5c7a27abc8f5f647fc2739c8799b362a97c9e56e60b149a272d205649eca9dc043f0e378994892cb172aa37a417b763e597c6e0027a9c1de53b558def81f73a787c34e666adb0274b0d0e40eb8c5929d3a6facaba4ae113b581c0d8d22050e2abb552f9b08a4195629d61d24ef2a916b8721f883b2e06168ab45e86a07d5041394c5b56274603c1145ac5162c288a5d6d808a8249053afe04d213288a6f8778e38ceac4354b90bad342de7c6f2cc9759e45b342785105bef76a4439720f6436cbfd328adc07ee58e0c2953942b44b59e7dafc641d2286a1ac82010da993ab9e0ed17873e09250308ba8bd48852cdda244618920c1b6ba50bcd072753a3627d33c68004105bd6795b91f3dc16f224f206e360b391358814f24918f61c03381546e3bbcd21e992ea202df5880ec1e2c409b62c01d4664079cf0ff014e2ea8d102e8a208d94f39f68224d33b21480df9f8fa9aafd9964699f51ed9c67d05bad51ea255f6065ab658f572ba35d685053503fc0cb1c5e95d9e186f3b20435780a6fba4e193261646f01d8e615b0e41c34be306f5f36fdde1c00c3464996052bdd92b0c8301fced35903b583a77a7c5ab8b59e25288cdf49af2b4758ef6e7752566f5ec45a997c9bb5974876c7fbdc2f552ed12d69c156ad897245cd0832aa96b2b72c181d3f13fc0d7f1a9a9b4fd58bcaae083afcca77ceda7d22f5fe5d6b595679357d6c729299e4b049ef60f612c056d0794cb7344ae8aa178a0e147b7f080000770cb22d4366a55150aa0644a092eb4eb9b8eccabe67087fa57f969d775ec29c69c293396f0c6a66de0e86112bd45d5413deb247d38735942fd6e4dde17e2db829a984b7904c1ea47682bd6f4c3240058a2250f034fdae413a966bff26aad05df6e1ee15d659f9266f5799964947f33bc77a68ec06c7ec2b8603fc6817156439b1fbc045f7c8966fc80e7f8b4345246e79e965e54e7a4fddde3fcb99f94f1e8d3444abd4f73dada1b28f40f155309b59e1061c60ac095c9a42740c3c3e15eb8fc1f86c84e25fd385edb0a2d4733ee71abfba2b087f16ae6128824548a91f27218b66acea32510ee4d46ae1fc17707042d5fe6cc99f3a7f4d0d48b272f0ec532d2ca2df634a9a6c5b2965d2a52ef24150cd58b06b32812634678b45c20e7c536345eb47c683aed3f16eff2d562de0d8ba28565f3079053cf1b3c51bd3520455ee2b16df63c990abe91417a7270bef96b3d699e4250889b86605773b644d58694649c6e711a79fc75394deee63c9d552b43af218b37ef4c2e6f988e38b0b9ee29df5832f19ec03f806b381d3669952c3a20a22975032b3ee26d3677b1ead3c5cdaf1b322d40528c40c84a5ef70ce82f0291a130751bd41f6caff0194ac7eefd74c46f981dd189c62376a3e59869ccd11048dec52591e7ab5f377e681a3496cb5d94069d14f851cd6f6876bf9eeb014b64549da268df557ff9bc0fff83cacea7dd3a2c5e9efa9d540312003ad80bd0d0df7c5260cedbf688c5ea0fe98d1acfe28e60c7295c551f6b6a3d58a3e32b8b0bb97ae83d41a1c3e0a44781d988ab3de839fee4ef84d608c37ee0ad9c6271e42e42462be168300fa1e102c566af15aed924934bddde6a313436288bea61e7da25add2e6a7989b6d4c8f3a0bb38428688d18e6f5f10c31f54ecef66f214bf9b4984599e65a0e66e087d53cb9742aa41b13627d25f4c678330125c1dc75c1b3b12d542b95ade571e063d62c222b6a65e2959240bb1d2eb58859ffc9262c3f3537182d8b910c11f114e0583945fb7639974f958318f5f5786d4c2cc7a4fb49a086c5ca52e8ea2679e8386896c9867b943ae62cc90df13564a06b2e6ce20eacf7bd45a02f2dc025cb703c27c11a27a83a5c5507c8195a2b823b02fb7f0a4906bfb8a22a37b870182294bb32b374e14249ba272a7a3afd8f25387b998c9e18d202e90bd95ee372cf168d750fca6ad8ec82510b2918ae9b48068f2bdb79142c7a3e7585f687844bd70f86be2a36704f8005d2b4c1b18e1d8cd9164c91ef1fff21db8cc9953dbe9ef9a5d5d375f5f0f039718b00f253061429f59c769a5eefb249472d0b42dc628a16e43c58ca2b85c3b5a149070ac0a07e15001a5006b0bb86d1265349d1e3530964d1ed1eef21a8a1bf118d53ce63feb8f1f29c64686809dfb2ad7d22e7fe4712b8484293393d6a9178727f62b0e45b0c5ff9a4170c20b59c5aeddf212e46a32d99c6fc653c79b6c554de8c6bc300e2da7dfdf857d5baf34a0cdef745f0c73a0e3ce4424260c69621ee1580a904f486942a5541b888c3b034a73d8f06d89335816c998ddcf255c6671c10ec4e958156d7f1a06f11bd63a6af4358563676dba161e3bec9713013e0d3ee7bcbebd54f5ba86d54157a982ff617129db55291ef1a7504d1656e0b1e2f2954c4ca58ade3dcf681831025988f445fedf2ea7b7ff00f36746b95ee3e0ab6af3cc1832f662444b2732b41e138a7daddf19e80dc2c08087647334835294c8e930a258fc29d691d89be2b410648ba7c16ef735631dd012c807daf3f6518fe07918ff09fc6d334dc3adff818aaa1b892c7e4b307b44953e11011baaef1a17317b80853ee1bd2208d52e5bba716d9fdcc4bebd16ebfbec8d9d987a71e4b60866882fc982a3283bbae646fd9cdf070edef7b362860214b9ae1ce5d596f30aa068d011122188280b836159df9abe196ca495b67792919f3361b34d5afdead1fced6233f2c0e515f6e6acc0373055030ebeb25960e5886941b99589984521d733e4a8ff5dae3b595fdd013924914e1614621e8c1b9f82625f454848802889dcd06e1fe6d9c27faf3d074a54620b9a92ce64908bb5e224358ee456f1175f4325a1006ac9dcc382c37438a9b60e761e1c474fcbd72e11713078614b818c454c9b0aa2ad2274d95882851257084a7f226a1a9bcb52c985c08c9cbb150385b7d42591b4b5e3b543eff51b9844a5793b7efaafb133ca6321b3c6b5f451192ebf15edf5efbfa180742a159df456c4e9366baabb6f39a0270b2c5b4b28170813d5c3c0b9e7fb9ef1996c430d2351e0c41078a5d00b4a4b00cf95a8408059c811773618b2c90706c5d4bc7c26d55dc5b0be1deb0d7c49826be76d5355fcf5e8059ef80700fdec8e0b866003287613c8ddc0abdf0168c2c7397f884afeeaad7ffc21f4c82fff00b1bb20b148fced8ed69613c501033e994312700cfa7031675572d3dfe70d0138e4367e15d9722b830013122bb93a57aa10a57fc0d5e05b04ad45678f28515ec853f187186fed00346e4e80f7e21c01601ecf413701f65b21003037acc06e8e9b035aac466ce65bb146c8762111eb3086b9d0f163a96ea691f4041ec51125f4d36de263793c3e45134488815b20115c37fbbb96a9b07dcfebac4f8803f35fd3ef77aae154e3227f54ac2b5b1556d8b75df43756d3a3cca7a3cbec41bc30defa2664358cf56e8a195dcb210b63269327b7173f747d30deab3b699af29a94204ec82d742d298064ce8cf0c1c623250f0cdcecf032b8dd4d81b7f336c84dc80acd136ccf9f45cc9806c8c646cf92106c9783e83282bfedcdc8ba5b32a884c1e7ea74e59b2fe6b08a8dfe86b3c9e7ff966f701f57a6380e3aa73c61213e6c74b49fc2f413f9354cf051158977356c72457739f6179a6b1864f81228bffcd17af63ddda36bcdd886e9d27e71437573619bd8c5241a3285a8162131753ec1191727bf478b747e85d8a8f766feec7fe7aa0059db4612c725decc01000e7304ef2b9a869640968f8b64ac8e2b4801efe0c1f61aa560266501ef405aa843f2c8fb136aed3c633ebe662be0ce62d4d77db15c3f8b412a26e098b1b814d6a59c9f717ed25a9e43dccdec85ab4fdf8a093bb41075272d02b15e896a381a2c6481c6f72b0603eaad9581b372802f0de6784fcf356698765cc97b6f56f4e2eb6676165c63cc90296f05ac0a3c00567ff5de063eb09f605e8ae7832dd6849d2a098e67c2f1a502818d511c307c92d7bd7d7298a40afc828e1beb67cc4a6b39f1b8512337665cd6956807b0e80a9e90f2d4bad79255ae8488e41be6d742f570309db4e88570778e6fae09e1058f39578b52eab3eef077fe019ff437f5810e295e2931bc6154e48880e002cdae081287bee40b596bade75d20967236b135238084afe1f5e83814a169e68d5e11a7ec31fa8b121b580c5007ef2a5c750c898242bfa96512af445903abf9f85ccd32c81bec24eb41818ddcedd4beb4e7110acf62b53c1797a125bed68c82617159f0a17319784df14ef55827f5848db853a650ff15805b1181f3bf3937dca0fdc1a5ce6421943a684dc0239545012c8b03a106338b711aa898dd1cdef58d9d8d13fd39605ccdd0620665bb6223bf33a4d30758ca5dab00b0c0d146b34d94294d47ec2efd0c78268152f91b3eab612303be10411e57136cef78d7aa89395c711d8fda759f184460b5f245969d8ddd442ee14d8167ca0816eefdd169118eb37f2842fb5692db1b0e56a69c313712d4758c7ffd94eab426550dc2202a30e897a3beb1be89bc4ab91665089507aa9680d354ffbff193e2d0a1e566823452ff981fd0823e1c569c452581daff4eaf5327d48091e61245c2032bc999a4a0a75a58a2001f30d28aff4c454d91a9f1d41324df8679a03649c27302a49500b7667f2e561e441b005339e3ac216c50045111551801815e79a8d11e51699c5e9daa041aca601f24ac5cccd7cda039c3ec62c365575d0a2b53607888da1952ac50917623af0ce50f1e983c6b20ac030b15f057b78ad6144673ef07413da5b381df019dcaac693a2465171310e09c73c07f1c1956797fd7cd82d7d065f7016730538dcac87246ef586ccc4e695dbc698355cd22b3334f715fc235479fb8583e2284341f4ea494c89bf8b04fe3325f262a1f59e31679d8cad6219ecc56759b68ad363e5330a6a5ad3843eec4d2402a5d22c6958c83910607ab058e383d8e98740711045ef080dae1af743960ab149448ebdceb89c4acebeb35a9b81208b498a86dbf6c981d0cb06392a211557426eb8c459ef08968f70a45d61c29c2cdfb0bb27bf1db08396e131623ecffed6cff0085825dd146cde763c382982b7866dcc9631042cf7e4851ffead3842ccb3c7ee6ca8d0b2b3ab289ea032d8f79b21f6e8d83805286898eac9d9af0c70c9eeb2bcbd6e8751c788520a8c180d7053b0c886bfc006f335f6535bc9adb630db65511530140e42b9689ec1e26b599b743f1d3734bb7f896bcd2f060b5301fa28057729c8e9b1e4f60aa0fb0b8d88af5e103e36b129806418fcc512efb17cd9355b1c71c818cb184d3dae890517f580445c0f45e7d923755318de1e511ba5c21e763c8dd71763f483c5d137d7ddefc14446951aaf5648eef9e1e5b8a38488fe6770f1ac9db2b5a3d0977f5d5c347a44f1aad7202d58f947300d2c42b4678358d449001bd5401bc7b21c5f4ce03f1a922f3ff7daf8b487328a77fd0f7288de83fc631228d11ca4c41a919d2733539ba32442eab15e18c5c41e0affca071de03b1b03b02e1041b4ef8de5dda83be148fb02442633e5ebb2af51205c74d56319e55cdbdca92ecbae65baca393b77f079d45bb9f5018bc30bce2b3d4d3b48db718ef7d20442ef7c71d38a072c4cd38f16f0729e0d86ed73e4eaca149c88fb471707999200ce73381776a02b0e623ab9caabf9735fcadc7f4db2baa51db637e9b0aefaa8ba0882f64c2dd0783e7a630f684ff46ffc68390e2d7ead05b73331dec5f9a7f376c408520a793b39f228e3793b196f94a0b793978c525c65ec41a9c27aabd20da6e037620a3c25ccbc0cd4dcbcb10621fb536431388693d7a14b7b77a9cd55c549c97c17036cdd11fb6bdddbc1356fe63ad1d5f04c5312a4961e664fa75569b5b16adaba26562cf4b315f6d21a6bd5736bc94726d9ea40e229176a3c7f4b53991b6d1ffb645dac51defbfba5fbef89817af157e0918b0bacf28e81a39c34f04de1389db4deed6a506f5e40bb5d76e576ed75db56436d8d98559a50e1bc5d3b3fa2d89d330bfae69b504aa14c985e5257134ae46329ddf7c72bde248f947bf5d80ac3c74b06fbf82df9237adf568adf6407d7937ef21ca728110311e56ee67ee9649a036b382c37df0abea4d17e3bea89616e6d1b8eeefed04523eea8da9af38a2dfbc99dfe0da05473cae820396c4cfd9900c8accc72a653ddcafe83d2f6a265ab1c0df675fb99cc947be34ea5f8c1974fe70c5d91e750bfb5de420521ff69084fc0e8d3df946095c4bc63ee30cc9f52696ea61c0aee51087697914ee8de694496dacf8c215b3f6ab13a33f1d4275b00104d31d1ec68931814531af1925fd10bee7df9645ed8090878ba3fb6cfcaaf4ee50c9d37dce5a7231a0f706d92045b1258e3173ac38d9a30a721925955308c24c0cbf73219f2dce24bd3a1ebf9f2765cca7c3b5a1aa8e8daec2e475f0361dff8583ab748ddcde531c921357ba79ae8e4b9e9a3860fcb6b1d7ec5a390f98fb2320f00dbbe26b80b18bd97aa0651a80e1b75eaa80853cf8e947af0e8d1ff75e78a0a22832792c99d07766c1a54d5d3541c923510db7e89808ae497e6e04f96def1f7d0fd77f03055f8c890ea10794da20cbe6c9be66c717b1c9e1524039634d22a4c54a8023a5f2a1620a142bac429ba7b115cb0f7f34ca318d454cdf04d54053652de8689c52f4f9be5ad9aea71715c5a3cd32f9622a3dde5648c40561309c2bf5693a548aed7a03a7847941ab88bdf175d9dcfaa2ecec16439692f2e4bcec8fcec91e3ea3795737aff7b7de9ae78fa09efdd6ca77de7ed594c11d0633d687081e46134918604d1858f6441f00f015fa578839eb08a63f01cf83ac1d994465984cd833ab4f40cab59f8f15cb0016cd44ac64df9e1406423a30274be1f503bb5801d7f265aa489f7d80653cf7c063b4d1f000ea46915bca5653736fa82e75e3e06a2c40790cd3a00406803583765a085ef02c67457d9d52c92ae6980468a337a02fa422f55c5c23092b8dc2162d1070df6b4439e477d25a24a9c08f3d545e9c202aba659ec94b44935342f4cbc0a4634de7fe24d90c4abc77359c7566c7fd30944f10d6a4d19dda29ae080b6698321b8d2577eddb8829faa3f31d4468452589723cf017ae9f9a2663b03f92b0c4c51e535db259f709d9f189e69862019e0d31d478b4aab8b85ea5f30ea4300541be64345130aa22623fffbd23e7f53eccf17f29d5592d849c330aacf6ef246cf4d92b1b84d22b0b5c9f77cb1cb6c8284d4b88864366a102405434ae9e711fd9b051092eb12db15cf15f9c65ac94abe0f9897a492b78e20f933f72f53652096605f4406682836f885ad90248b30dcd458bea0be372668442f4685a65f0f5c9fe5bff10aeefb94d16fbae410dd225592dfe556b3146789869a84060b7f9a7c2609d04ab5b7c5c5107accbb153d65b857fbbee4c84f0cb7bf24df24a4ae8c3ffc023e7ab8d4f5cc6d5861697738e0e08aad3134e5cd13f7bb203c8ac55fcf3a972483f3b2a935c26631c3b94618e9906f69c00dde17db33dc883d38d3f3d9b2830f7c313fefe6e8a3315e667833ae95b58101fb45f75a992e76c243d88a492e4af1496c45db98a8225be9cbee8c0a990c27e4c07abae692e7fabdc5eb35d5482637f3b990f9af979f7711b844b324f63ca1998ecd59f31b859a0ab2de5e07be402473e616d10b2e043ef54198352127959acae410d206fb0659c45e918d683847fad1d184ac8cc843558b89bfe655e58163246ec8eab67f8fc89e8806ab415f1d37d027f5b69d3e733f972ce9fff135a0b34898c1ddbeeb74d0d03221c0ebe5fee1ebc1f06cc350b21cb9f498e838fcbb79a55298af62318bd2fc9f598bb56b7b09580c224c1908ae1d6089dfa184fb0bb3a6f6d9e43a9fa51cafb6cd16d65c58ab9ac03881a8ad659ce7d790975b719a76e070c9e200a3f2b669c8adcdd1ed42a6207fd0808344e2db65e047be4c8a6b871be234ae612430d210987dd91060c85012a432466bba10fff079820cfd7105f4eb49b253f97b71c3f3be97e015baa57183496282ba5604a44ca169f7cd35f8273471941bd5ad9384928937fdc7bc132941e843141d89d0a52962a2964774680e56fe883e022d821ad2ef237d37290829e6cfce4aad6a7af4cf025d4bfad90db346d9c0cbcc9eabcade44582e408a2846b82a2738a7358f230137dfa287cb619be12325dce8a144c28b93088c33893d0b07f4b94d986bf2966d973a691fb357992a7623e62eabb23d6317fa29d5a3f4427c6f9c80d96dab331e0cc05f9dee61c8f145a08a4187b31e19e8a14ccb411f037cf2ab9f3ba9d4547c3c69a13a7bbafec96fab6c034aa5b2e243282db902079277fb7c01416e7cacc41eb8f5698089a3b71a40c9f00f885f52f5268aeea5bb7bc0c09b80958ff6004340ff043895b026493f189b02da9480972c9c9f0872e4806539d78972626188ac0dbe901e25d880264aec5f2d633efe35b159b44f15ac4d24c462937f7bd08709190e8021dbc9b14636bd91ec74996ca35b94c4f6525d651bc50ef92374ff7c06b0eb426a5c3e5b998141008d3d0a79b8b23b0f0f69649527183d81ec0e447b4f927bd1b2e1c2b9b5e8d93dc8dc219a461b348bdccaf6c7f3f7373795842ec37d9ce344ced0ca56497cda31ec7eca0b56b9165280fa848cb00bd1dc0a9335d7c5c885df6d7b03891f326cc9f9906b27fbc1ecc03ed61d4cea43f6e8d6ee3caebb9f8e72722643b4df5d011a9613a349d1ea7e36a8d502953449b30f6c8681e6f9e2567b42275f7695911b107d80f899b102bd0ce95295d14b9f8c31e7ac73ed21a5485bec2ed2a57dccb44b8db08ef852d87c24c6de455c7de7f0630ff84dee908df337fe236b06f0e996eca6941d37c7cf16b80af7ca1f04705ca36a30c00095ecb756cb8357e67cbf2a8da98fbe69dc6a43f11db29fc1401da67b7b338fc35c9536729bcebac2590c8cadd2f4f4cca0b1f3cfec547b9291c5cb1f7617abe1ac2a84cce0bbaed9391f955dc8358b2a2ac2ca57050f46a80247493ab1ab8be984fd9db0d51cb745a7f962bc1fde482d3beab55d2aae9e68ae44b3a13f55b0eda17ff5b289a1afcc2e97ce69dc375b7051af51cf03204969ee3abd4053f21f74f2143c9dfd81a813d11112857d2f4d3972a5f89d833130872f5efe37ede9a41f1347f87e8bc374f2a5a1c540da0b296e98c7b91f8bd7b5764a0fcfabd6238d4f273f2dec3cc41d1fc703124c59382821a03c752b21ae621f4282df2cec79a6fdc2453eccb8b8f2f54536b038a8dc4a8d79a6419d6b6c84372d1a56b4dc66c50466b6e72edac2d66a012169fb6e95867a8bd9aca8ebb28a72b835c59f718652d3215e7a282d2d9343b053069ef9c5407b76716b6fb953fc5a85f5ecb951cf93b5d2f3b10b3d739ece3384ff8058068f37d77974d6dd47d15612fb2b70694a0b4cb3d7658acaa469c9558eb46950e83b8853924adf0778bace07e2a7d32a08cda00e0b7f4e64e074b4f28692da4068344d43300801c8142f849eb8b66b8b7a827c93e23ef69aba3fda5a5d8a74c9a0eebd29cc4770575be1ccd211533d17978b706c9a951fa6b5ba707c3a15f4e3888a259c43f4419c595eefe3f7f2bf588964e629ac40a5caf82507b608b65f5c15feb8b7e845b8ae5d2d795252536ebf0d4350c848d57c773392f005f370a8f3ecc086fcd5af9ed1e5cc94041b65cbb41e8741515462a2303c21f41580dbdc6cfca02d4aec001db3f339d0317328d9a426d36b441b1f488866002dea48b94558ca96fa472c73e8b4b5e471d62d642b40b243a26c505b1662fe241fbd5f4b3dc30a2bec39db259737d866408470c1a0059790598a40551abe9f557b3e8ad6aeac344dc4265435f9ab4d2cd8c92d30c07ea42c24628ce470293602ad0a1a23945ec0547f9934d825a270689560c363951c278c203e748e191ee52f79653d7e2ea293d6ff9fc3b13caf0b3f96d1a8c3f4c48e81e381c51cb0768a2a133178b6c081a6a2ea48c5d48b9232253146e64aa45221ccf85b77b96c4a25be20c01ca85b2f9f4e97e029274da707152a15848aaa0d8f651d88e502d9c864d98df08b70344b21477f9ee8a8d96c4784691940136de275fb1022caeca1f73b696ddd4c84842727193296d3e62a753f787543c4734c4ff74a083128b94ce236a02b9e8b1013b6c7c3c23646ce5a7f48b457d27f8ba3bbc3df86ebcf03326b671de05800720bc382d53e280a228123278fb137cadd662a8bd83295d9a072988664607a36fade6b395377bc0881ddfe96d1429eb9d22456a0b014b952dda189beb36745eeebd8c303eb4fb16f6ef3220e26e148768bf9525a59afed12220ae6fca755e487e23097529baa580ce3d22c5760b1608ca3df2be3387b91227ce2acc0b7fcd643b06a339b42e9f82a3ce9f66301f6a9de35b0b76316e3ea2c00da34f42001aa5f1c1251d865ef6b00989ace44207785d5dac6054e13d71ec782890c6d172fe4a30df9169857dea8f98d42c15ff01dcff441bfdec3ddd87c12a6d42955b6a2246ec40fa5b67273fbb74751a71f03ff75c1efbfe8043016d3fbb91149a260d75e131f56bac00fa9c053c65a13ee20b1354afab79c52df884bc39e12be4c90a752209031e521e58b8704d409dc7c6bd5a357471ad950b4e7161bb77f2a414eee74bd1a3551ea0ce4e51facb182aea26573bd5dd219ea5342a50ee0ec46b4ce83ee36c30eb9f09ed64ee8e50d9d3b48e97d5e8d15a112b6bdb324dd3d63b0d740c7b93a397d7791f9983147817fe4a63ab0132d63c6a9d57d07b0472807a48442caca52f5fc2cf3c4ff00251b1a6e6c3358cc2d9d5c18e4bea0bea720984108729a9974a6546815257d60faa27006041f81eb2990914915ac22e07cbafc1e6b3af9fb0bb82126e735e212e03734ddbb40941437fd495941256f57431663b1ee4a90c1ea269fe1d7d4fee14e707a56fad4c87152ca3d786f7812742fee7a6dfc8c5553d4b309c1b07260e036e03b04e671ca9d8d60cdb3da8479e8b4ce4381ce3a906f3024d50ea46241dfefce8903ea63e58e05ae2c351a2a9db16d5a4c31990993f38e3b68f9feb51ba518855cb90d39fcb372044eeeb8c64179e128385db0614a94c88c836fdd42cc9db0cdc944b7a4a61c36f7e44c868e3af7e0a5db69aef7d4806c2e9cff3ad3292ceff322d790c2b901d7ac496af640c71d1a281913247d467257111e525f64ba0d457dde552bd22a97615d11354b6e607d232c27b4ec6ecf5e83b5538ffbefede9298a643243d9b82ae4a94b3d4a4db2667b04035c5369d20a294056df3c5b7fd471e7b8dab5f11ad4368527a7c29204428cfc51f2f88c6cfd214aa5f701b56c84aa7090cc5919f1ed483b3792f584d4cea41b046b5a3b34ee8ae9729121fd8bf6fa57695e9643c3cacb16228296222472dc9f6cb7015a02f53461809011710e29d123323dd2f448c7ee8d0b5368ba0087060fd475857e3b59a1c14dd590ca1540d33b6b2d09de1dde7c1744710ba61a5be69ba3d82ee728547ca616c6b7d89fcf369ec80ec9f801d19b31cd6cb185e0b7220df2bb57aedc528adc012403330337035424873963255c7616e1517624e79c33e864493a9f3f7f27d407b09a3852975d1f747a10ea579e50bdfe57824e23d7ae3545c40c341d7b8901d547db828ebdc860ea9d8a8e36a6f358ef7c67350a1144d0450c6d8c1da10f86608f9ca6e25ed807fce97343601f804f9f23820e00e4e97334f584e7e977264b8232e38312f22b722944d5131f2d74a97ac27bfa9c69494444dfefecaff8f4b31852fe9593f05e5b0e4e4725d16edb743942cbd5cf9f750aae57d1c66025e88320a81e7af3ddddd4b0fb2edbd4b086db771ccee6d1bbbce1e1d6bf5014cef8ff8423429d27ac3d14e64afae71f0afde7ff50adb552ac6a1e1e71c343ad8b54fe1e4f7dad7aea8687b8f330eb6048b11223c20e543c789130f3f076d13ee59207ff850bc0b012263cc0d4bfef3c0851c45ff125519cc19fbfe73be8401b00eb1d84b47f3ee25749f57968bb289c414224449901ea4010053689e70f029120418276ee113d369f50457c30a4e16325ea8b8459248e10c5cf8ed0008c350c5166f03f41dbb1634729fc8e871fddf0709b4c3ccc2693e9c37b8ef7e171cc5e0fced9f090764f88699b8b217f102c0f69dfdccba6c6ea1a2b3952d394634038530a8a60631deb545f750b974d9fd67bb3acd62a001938e7dce31dce3d4f1f74d95e67875ea7d3e9743a9d0ee79c73ce3d2fe4bec339e79c732fecbec339e79c732fdc7c8773ce39e75ea8bfc339e79c732ff4f80ee79c73ce39dfe19c73ceb947ec845c1c37aebfc42081182e7845640cc810b2a24ac9b6632faa1a74908ebda85c2e58ad56abd56ab55aad56abd56ab55aad56abd56ab55aad56abd56ab55aad562bcb62612574004bb004cb6a6f86730bc016b0056c015bc016b0056c015bc016b0056c79bd58ced3056cc9b804698034401a2e00a879dbebdf5e3febf5310ad00afbd6120dd4c0fe32d529345db26179f3184f7a0cb64a51580d67fc03bdc8ed4440dfcdec66e76db3262e0aabaf48314ed5655f3f458adb373983407c5fad7f3bbaa1556b1f16d6aa9cbe84bf16a06a385fac84ce01a7cf8a5d6f58823d51d46e224b0158c3ce7f7118432d4b5553e00dcbca20cbc6fe6a13ac546ba5d683a3b5ba60fbb0b6769825cb940e55cbe8189b69977e6953d3e8164f712d702b2352c368187d8396e91aa69ee05edfa071d0309aa569748c86e118638c47a4c7559aa567b44b9b9a46c768183d22c18d0956d22c4b22729134cb6acdd22ccdd22ccdd2accab1e04c363339924371299353712eb89366611b582633b79aad662b8263d1b79a7a82fbad88cd065b0de782336d35a6f9b19d5c0b1c8a53712e38d356b39ddb699aa6699a2668a363b036c14a2372446e27693b2d264d8cb7733bb7733bb7733bb7b396655996b80666b19909b7b00bc630b8dc4e518d480b9989c42b7805c7c0353ac631b00cbc8261300b5e1995209cc9344dd3344d6cc305c76018cc82573089c92c725992cc64ea60a36913ac84432dd3344dd3344dd3344d934462d262129398c424262b8b25d2217ad94c04253a454c2227914b64627264632473511dd18c68462484484717cdd413dc8b8410a940342382227a895ca219d06563d2344dd334cded2ccbb22cbdd707ca87e903f5c1c2333d1aefa5592630914b243aadc8490445f412cd885c3c95f3dedf37224736462ea39811cc8865b4327a59125a0ab5423a42e6876a7a1d43ae904c25d550eb2b2d092de5bcf7f7fdffe6b336c14a98dc4ecddc9cd909b7733b459c5dcdc2e5fe3eefa5599a95996866792af35e9624cb7b7fdf3f8964f25e3c654778ea2bb79bbdd715b92cc965edeffb2791bc97c8e5bd40a78d029dc4f151a013e8f49576445a928bca7b7fdf3f89f49576045c618f22976b8b5c2297c8d53b1f6a59122b8a5414432dd0c98ed0ad6bb88f58a8a536bb9d1f47356cf7503b8e7e1cb9f43a628da318efc711cc881c95f47eee22d7085b01de6be1660ce950f9b03ac56b21f71d86338c2bb5387b64d0c992d052a5bf80ab4508b54240844cf021997ae23e8b6ec2b2ec4828f45ca8d509b546e468eb5ac73dbba72f81fc38aad1b35a80da4731b00f365f7f24e3c308f08dbe1f473023965e4764af21eda3957a82fbdc37e1167221214828325359b5c9cf2c4d97d2955fdbfcde4432919965979fcbb348a6caeaf52faab66aab97b20d0f86b76aedbd59866f86b1a6e5bc6979db38aeeb365cb7d968ede1c1d11e1ccede9c7736ef743c1ecffbf8001931e2fb4242c01ce67004f5fc2372389ae8012116c459e940136c1c6c7b527afa70ef401cdb5a1cddedae87c53ab8c3a66f758adc4dd8f4bb798c7bfbca3bc4680bc3362833ec16a2acf8d20ced675cd7b83bd19e7664067bd458d6c658994ef78b966e48bbed48ea6e5d6aafc7c8800ea555add5ddc7401eb67d1e76eb6a2a186c22b6bd19feabb22337e405bbbebd9cf90114776fd636612c56599a4cdb2c4b92a4a6595d2e92dca06b8f3695025ddd65bfc2d05df12b89242242427eed4d3e9b7305adb0bd3ed24bbfafa48af48ad47eceb2a8a9c0226631cbf99460dd5efb600a4ca03b42ce4d4becd7e7740836efe8559754fb09c17efd122b9e745bf1063abac334efc92da9b9ea12bbad2eb95b49863176d2335d82b1922c8ed6d5713e9f11ecd72721fbfb2658094585a5af221345ec4f54ee6351c5b642db2ab1e2273f02b4c79fb5dfd45ab2d696eebdb7543fcbb22c2b558c31c6b854434dd3344dd34a38047bd8a34db95c95aca4699625355113c6027bd8e336c9a5fa1da75245aa31fe124d3ce998d6b0f829c122d64b26586947bf56b42d3b42ff247bc0ad1b15e0c08103475531e9a0010c55661162aba4a8c0405568b074305880c142690a8d18d62bc5654a39532f505a6b0f8f172c2fc8fdc2c5870ecc01c60c0c178c18183a7c58a534a51c82d2105aeb8b9a17314081550100416c800515322fd0f8a194330cf4bc421059a339e79c737e79e143e73af60243042ce8b61b353466c8c10d261c2910504941c92165054cca89032911c09aa6a5b0e89aa6bda45c20057547ae5edf9636e56a9db4566befcdecbd5986b19661ac69396b396f1bc775d80b63659af3c6715db7d9e86eb3d17ab3d11e26115eb22a695694f96295ad92b25013556599e69cedcdb2c8d9f9b11c8e9fdabad671cfee07d343db77eddf0afba0037400f6eb7fe5577e65f9c9f4cfa5f3955f8d7a42bb56fbf03c1deed980505e8d67da4c7fa43e4c1f27fd81fa60e19d5fc96980503cc561b866792f8fc6a3f186f06aba47534f70ef0de111e1d17cb0f04c8fa6f3b96816c8c66a13ace4bdbc97f7da4ebec25536c39cc5597889b90bafc149efa567740d26b90bee82b7e02b9dbba827b8e72df80bdc05afc155dc05c69ecf332f4f618c31b698244992e4299ee2299ee2299ee2a91f143e287c506800f6285809f7946d98006160c204280311d0bc5744c4c3da7a036b690e6b6dd83952a02188ad65d720e36461d3c082f2030d34faf826ce0eabf9041b77ec45c60d5d46096436192e9c20a3450a326440c9c8c00a9afb6d4f0b818cb28ffbb10b5705bd3deb5ddd68586731969554570eae5ebffb8fdb745955d9beeb18b65176a692e867db7759b8f5cf5a6bb9eeb23121275ad68d3d6a288db5f0b6b82db4d4755fd0c2a5043c54805cc16aef8ebd9035c06185075cb06c908ebdc4a8818c71a3efdc9a80dd3158a0427d12dd31627002fd183a482ff2220302314e2d8891001d23c9a56b6f080952481a445ec81569c3f7d9d39ed75a9ad50b0e516bb527d841e5060c2a32bb632f2a3ab60e6c151a27a87020c36041050a83e5b4f38b0aaa8ffb5ff8bca0c18d22646c90d1a2a4c1d0b5195262d840ecaecc3c6c1f360c163f6c1db6c6ea61cbec116cd57ee192c28b1b68a0007fc7a19c6a3f21645fbf24fbfa27dddea75f729f7a18c03ef6279dba8060f63570873d6a2c169583d244cea9d3b221ed1a4c25552d64554bb12cd3348ff1a46bac4aaadfef8f368673320125b1396c4c25e18005a3c56839ae0551e1d0cd748c71ce4ac899e21230c7ce8fbfd36e0b1de367d1f16f704771572beeacb5b8bbf75edc7d966559863b8c31c61877df699b2dd45436f57261964a9ea64b19d3317e4d8ba00cc69d4a2762add5f16b58fb84b0bdf625db3d6575abdd4a87898ca08addefeee6b3cf423e33916559863f15d809b8a78e80ecb36fbbaa7bb2245ec7e3a9466a4390886d37e288d0e39d2c491db7ed9c54591662a54ff8b1fff99312187eec83fea41b5153499fa9926a48484b981e717a6ce741a89e19cfab92382df09e2c49ad22a0a8c0ec887e151e4e47977884c048a4fa1d6de211021ba9cf01021bb176a3ed8ee6fcfe8e06adb03def999129f1d0889c8ea723725ada849640dd533de20c3f23843ce849087910f8216f451240a093f3093d2e3b5241b80fdbfed89da00f79106acb9280be3e3ded48f5784e8c2509f9fa9c9625f97cd523c431f70f441cedab8f5d77665fb3ff10cfec3be2a9ea152466cfc3d1f3ea75ec4e8fabd7068cddd89d1ef3ec293efc159b3ac6ff09f183216647726847a8a510fc5a78eaf83f16d8590f794c079365a884920fa790d508040000090317000020140c8a44a2344d71200be4dc0114800a587c46686c3a164b2461418a032186a58c210418400c208400420c333366880066007e784c7517611974ba0c064e8745b0699d76e2c2b0c2ea0803e9e6deeefda1a58f0d765cb8903cc447173c08dd01220eaf3d0c5cc6c291f6b7a21bd7f8c7f793de9fe0aae1577e59f92a5229d76039567105a4f7eea692ce3dcd7fa4f12e6118363967693a6c4a104cf2a48a748c509e2a24f5a763277b8b6498f254413636b6dbd4595d9b2d47297f66756148c1403f66a11e18c72527e24dc43a8f030344b8ff339ebdea20d9266d1a0642008052be7594676899802833716cfe872a99182eb06ace18f829fbf89d812ea492c3f632f56f6b63ee5bfc2bf7da62f7391f3f687a371c21730da127fad2ff0d82dea74ceb320602817bd79fbe4af14dd098a83f406d47e1079f4b073fb074c490e0277c33d98a1d31c110a10af79dd3bac2d241b2101777c79e50328174f6bd08dd4d80d46abfa3df9e1340fe10781877aa0f3c49bb624eff3d43239e3ee0a44e569608c655167f2b2b9a0e5cc82c0a092c0342042c8f6e14329c12503076a831479d63b3a7bfb1b881fc14452d1480a2b663115661e9978f45d787c55085412e03fb8cd3b9870011234813741593fdfd8c98211d0c47204fc054353e40efef49de2afebbca41ae865e573f9907a4fd3c56b232c8befffb4a454a137378cee77a5c951d048271f26127039ad48323ef11109a7ca3e8be9b53e944fdd3978dd7bcb0368a459a39cbe905fc7e37d94a1adca4d89335dff697eea2ea6d1f8e456b3be3b1231819f60637458d3b893fee81beb9672fdc46b2eb2874b7c34fbfcfa2bf0cfd8b9e830618ba1cffc3c4135b6d6024b3c0a078cf2a5e16528aab0db240c46d5984db4fca7e4c70443302ef0fca7e59a28c11eab3f48ef826d9c17a0f9083b91881865675b05a61f95f2d9a00546e7aeb590775d730e5ccbdea7ccea9aff53f8e1671c42afac87e2e5f50e152266f4f60511714a573103704cd29aa2ab693e6119e67a0a2f7bf75e313b45171936d9af940ceb81c0b942f98e3a7b15c45433653701a89491205179f5c7f882231f1398091b7fc78ce3d234160a2ce4db6c950b65c0dd89ee99a192200cd0263032220c71fc0b077e11f6f7d510ce3be949e8a7d6069abe067d30bc2ee4c6f5780534e6f580fbd5fc70abce02346fe7c4a6c083a17994e434ca0cae53256e372bdeed4cd7d6dbbdeaf6355414099deb10669d24437f493b2a6918f03e36f03941449b6613bb153603d365e43807a8fc58290c5b541b0b3839409d0dbd2a429e9f305308de5fe8c0ffbd486f9ff75738012c27464a4375b053ad3396256fb0d13701ce0ca2bd008e743bd0517d01b8051e74f83a6e2ae968dc163b19761d529442ed5933b56e5c390fc58967e70ab3c6e4ffdb1e47ef477c3c48fd5be538377d93af0768c8f02b1a5bea9ee76269e14650b2c835a1770e617b33ae64220ebc3521b75de02721168dc7e08bc313543dd55b549f543cae63c3e873d8611a6bb74103e93f3645d9e1abc554fd6930360653e1169d0657db418b460fd4dee8dd7faaf2e5c4206ac9afbd1558847573eeea7d54dd5f3be92bf564588b013d060a8fa2527bc2bac8c17e837ee9dc097c2918172ff76404726a0942397cc53f3651856f04835a0a99a47aa905d44d34f799e6ffc4ba0377f7dbe751b72dcb9a108528f6541a08fda1cb35d912720d22d982728d2f2c980a8fe52a084535b2e71b73232b742aa1a191f7c9e07dbd6671c7a20ad3a0fc8d814b4f9c198ebc294230f429d0a9f44ab265794aeb5184bb453d4819b2d2810bbfb88021e0de71fafa320c917dbfc0b819e04399e0405f23af188266322f43ed0f22b6d1d923cbd74eb71fb48ba7d6118a4ff71c847586a10f48ef6f7dd9a9c0e9af3967c4ccd305fe0c0223f1699537d52a24ce6cd18f0aa8422f2ea3743a17ec515dab3ae9de757bab92a8b496b33fae0651616a60ae912f2ff1e6df0b6c99db3ef4b5841946f2dd612e8f9c8d8f6849b39a8ce9443f1a55903a095e2f28dee8b5c3606885ecee1f6b42cddb1aa00579c24908cd6c667d697d1fd4a4007a7bd2fa778af1cbf4ab493ecb1f8c254426f47f4043722fa8c16dd3dadfb009b9e9688ad6b8ea972e7d5b8ac5a60d15e9e009aca3a1903c05731516d919575e8abd84d0d9463e590ce924bbca6368558b93fd20e1192824c857eaf925e3b349d725b124c9d4cade25100029b9b438a1bb8d43c4afc2454b3c7fcf3a89f38c7596a4817496b7bf4d99033daf7f4452e8a2bb53a25adbe59fd55fe47d870af403416cab3d8a3f06e15aa93f678fceba63ed0b724a5fa70fff5a80be8eb498a869d549f4c1ea979e44f6a1810651feb7f5990321bcbc446e21aa586029d8d57117d474d9c83585d0470351964f1d0d91abeb817a2d0c97e92b404d73626cc77761ea8634f181f9b20e32fde107bc6d7b33f1b9cc8ed02e7394702173fe5916a75632a3c14c160a21707c003e98196897ec71167111567aa9999137840d401d09c80f0e0872550465a4b548c689f18772175e4363795207c7371f86ba23d342f1ce4d681c948a92a62034cf92699189d9151b2a6067bc5475d8d938bfd0ce07f170db5127dcda20d730c645d3861fcc067c8c513135cdc821f99c5bdf812ccd21364a6a7422fcc981f8ee96d3be5e02101d3b437e965fd66d63870d4b71b6e85c8e44c92d2016661fe54d6e32ab1c9ef72311b1904e49b45c779f2d37aba242bb79f589f9f6011f22e891bdf7f886a2b90e07349b8b115b03c64ddd13bf3a6766a717d48b688935ad664919b1a948b567b58bbdc161cae50ec9248e5f5c793580e60fbfc70329fa34db4d49c21b66558c3ac5e281350ed56043e49b93888cdf0d2b312bc01d5a01bfd6d1a7336ef9044ded1738842cf3405b44a6efff49520f2d2fecb6849435a755bd061bcf976879b5d6f556429a5650280d9d762289ec6286f43fc0d24742305bf2ac854790790e8870bee3d2808435988962b43c7fe54c083823df9d2ea077a2d021afee0db8e4e6dc7bc325c5fedc19d48452ba3792418c6fd2a9062d4cd174005d84f293d9c853be7b7cadef9d527428b93a5b1f1fedc128f8a93ced5687a78548de2a885e38a6abe516720aa7cbb7452364de0292ab789876667f8ae0fecb1d696e52991bb42fba12b9e3be5b54f1be5e5f844329c31c206f7a0c633067fb8783367b113a833f2f1e9e94349aada59421d23348b563e8791d998ec19bceb951a855b6e88f75830eb71f94cfeaecec423a2467dc21a1d767a7ea5a59698f5a42f8ae5cab2daf935b6a4bbc760690519eb5bce8a2ec36dea388cd425a09714cd808d3a4708e1a1a6c626cf6902e62c15dae0177550564ff2786dde4621c1e343c966a7889536766d617f081fa397f67a184a3a52cc8427167e9e3d074145b10bbe0874b069b115ac2c074389201140ac706c2bbefcb66867177c1a3587cb55ea86a084c7279388f002f2e8dd698980bec00d4106dadb44b3d0d0611635d88e6b11353b9a9953509a654d012847358d51854237fd9725cd76b78fda0344b4d9225e0ec40bab7fcdab967a2431b88b51df646d2966800f21a0c104d607335152650c9083249d3f5dc3ad0a5fbc0d51882f609a274ead3593e04331da394c611be0e750c5504ba21710787f62969e8a0260f2bd50c45c16d132dd1142181423037916e5400c06686ecf770f61cb2be779a9505db69f2bb275376e35ccb91dd61a01b8731b61e0234ea86289e6aafaf237e41aa576cbea7f7df68a74b5b224d3a7a8187b8eeddb294e8a079f6f8a7bccf7a1efb6d2bc6af1177e1bbe60050651a236f49aed685d3bf53272cd32266653777ff1026e48931bfe37c3ca1422936f995aa9b3a5cf0ca3190efbd5738d9d360abd6b5a5fe53e8f1b7a5a71b708bc0f37364d814c114c374feb60dc3795516309dcc2252cfa16ff2635b52416b0e4e286ffba51baf0cc7a6ffba642d53fe1f67cb809ae5abe97de3b059e56336498ec40540328ebb65932c6089cde3cb3075305e4e7f405cf232b911d2efbc1aa3d3f52fede1d5e49e3f923caecde153596fff93a8dd666f9d3fbb7a6e6bd359466d7ff267953ed4af8048f4032d120244866b337d341a14d817d2e44f63bd01409d988344e94d101c2199d1cf950ede2c1ea4ff5603f0d84d2d4c0dab18ed2a0dbbc1ffd4a2f82ce258dd6c6454e2a2354f9884500ac6aff962d6a2591aee8ed29790225af68443b4ccc7fff9e384b20f671e8b699f542150c7b6680e2100283461c580fb45315d6a057d195ea7c479eb9483a7db8bcf2079f4c1c9889e9a5c71050537b58b71c1c9ba7d327a7f534b51e612ffc67a146b4f1a8f88aac7ddec41944ba5ccbf978951c472a967c7f0749c4a6dd6957c5dbad9934d5de4ffeb20a87dd0ad74fad619aed8819d0bf68faa9c87720bd86aa89e5a882642e435f9064f0cae61486ae438b7dea7703aa764f4283c70dd86dbeaa7584607acc91c9311e1e30147b931c8099e60b6797d309bc018af10410228cfd7487807af51a6b33a0ddf3c2f50a7d5fd4f09e8026ba13d147baa7b2c5d8ceac4233df0704000156718d3526d9300fa83a8b1ebe298f2ea8dcbe636079a9423c2faf09f8137b9a4648b3a8a904516945840ff05fb52f84585a2ac1f6d7f2978c6333e20d5a13ae184204fef2740a500ca209a105236f362804f7c00a725c617b2a1a8b02f436c56db60d5623de98d30c01375fc47beb6cc2e6e40c757413d74673335656b01e3af3b4317fadcd21b2d96ae9c3d970af339c9871e4d4aaaebfeba0553c04f654ee6130472f12f44d3628edc693e1686ed2be8c403fff052ee2486e3f1fcdf77453aa6d039487f62d51173f4ece69fd1cdd99b9373687afb9be748dc290b887eddc54e6ad6a538485626e5ae8488cca3ffa0eab91a0e460971948146df6ffb6193c9ab16b7b74a1ce65f69e988bb0127bf84ff640c6bd6969cdc13ad0bb847a6854c4ef95a7aafde4771d856c99cec2e56b62d8ff1277985ca855729efcf9806b373937955fc4d1c067915ab6a95894e65327991cd5160f27110fd348b6ec9117e1b4a9854836ae1b68568ecf37a50f3d964dfc28a4ff2625b5803fc256ede106a6d277a0bc02394d6bba50003475efd1d0f9719e85a8c794a6ef9b7fb8f2ab20fc82a2c4a315a611cdec9d9445829417df117548a1a0d7ce53c4167373f95f1071dddfb1144265a19cdaa558d9f453c144957e050b81b2ac1c0dd7438c94324c49ea0e084446a4a338e0e6b23069276adbee6ee4169f2a2fcaa53b557160956ff4dfa51b87575428b0d26630813e40114743771b551230feb9ee8efa2d33f92a7523cb6f97e110662c9f7fb5dd324a7a43201557bb88ccb8eb50cbb6228a0bb1633d55bb46c7847d028bf57a2044fe4c009c3bd92e8667d81f8e8a87276b5d387aae601eb801136d874031618fbe1d80d05e62846cbfd1d721aa0b9d09fba64462842887917915b9455a7d16dd3a04b846a538b04129099c4cba969b0b3aad283e3366338a710e7b29011ae1b453db6492f8cff5120fc0bb565941529c6b3e9025d73c0f09e73c426c09dc8cea5b540c409ad1d8e14e0faf0985333c4e37977fae3c8c16c3d28772c5b8e8cc9b1523b0ec6f816d6402d7aa0114591d2e0d15016677c8f92dbdc4bca277a3ea5a4d8df9b53d5cc86561c58943a035b8c0f048add10b8d0493204d44e147905203e8d44e1a05e205d795c7862a0f51413b0ef0214db83c2a0ebca44e089e3ade0500e6d73739e4e14062099bf7ab38452735ba1739344501c9739b3fd58d25cec5b93a54d904be303f4b4b5ce282dca203a8225d468d38aaf89b2e6aebcca2270949b35ecf07a12d8d95b0f6ed5ca877db5b311ad46b92d43e187efdd0157faada38dc9e360f70f6060b793a0dee2d81e6b6cd6bec2278daa62f9a535b7cfc39a7dafdfe46dab0becc67f0fe0ef1f889bc7b17a5e2e684dfc95a31a281ff229f861052d0e9e0325bac72004ac8ed286e951b0749042b07db8a6defc38b84337192843af37d2d1bcddc3d367e6525ed387a311ff5e5e151292f84f631c1ecc4e49bd6cca8e05390684e19164d67a789ca7b4e3bb9ee33517b7ff9e42b24872525fe13bdc79a01a497d4eeeb9a6ee337e74418ed960c897834352bc4875399818baf66d90ca5a122d151686af6ea931f35ac7620485025deb7d151b3a739f04a9b1b25101d79fe8a1e828cd65b69930b4cbbfca73e89f36cd5a12a0dd106e0ba8084454aa1ffee3fb3ae3a31583beded2b5b82b6b7ff489a972b119acf1da27a66d1f9df1c22123a1eed3ed44bc8fdc534d26b8a3aaa8a9f5a053d21006d4c6ea8d1601ce32a633809e1b5cda4734e0842c82d3aacc5fd0fd0d124f048d3cef3a3d72d478936b92be78e9988068e4f2315e832053d077831048eff359fab889c527985e514faf6c79ed42a71a3be6e22b79ac79525ab88e85a290cf427821364aa9447718a90d8eefc67012a98f5623a39f6b31b3ad3442afa386017393b3511998ea1f95623e24871872d676526dfccb6ba56bfcfeda354feb26415f48913e9fa7c388c6f8e799250cf8962c78319ed8066b8d907f6d59f1dda4acce8979f633233b76fbe7f4a5d42a78c085a2ae079cd3b5a42160011a0e9f8b190691e2612101c074f0502f81b8a40eac124a00b0ddf11a4295094c3b0236c5d4a107f49944f3b4a6db816a202b563150b2b1d6a573bfe44880443b9b1a32483bb7c326495aa7f6055c32818afe03ea3a21daf5ccc935e4034d1fa78a955f076047a63f6860cb5c812898c31b323a0584dba3cf14856be23c072ec6f000793d04caea3d28f30358e933e6e62c7da4e5d2a629da62e61059f767c845e54380651ddf6d3cece02bdc3e49819bb30532bbc713dbd418b13117a0314768047b6a02827bb377a87fb0a5dd5c66ed089f3df6da871f05881c703abe5d42a1ee520166463a935dad2ecaf0dd924cf2f2b2bb39cbccfbaa2b6970ca5d8cfb8c25948c4f30cc86b7d6d7128d6a382b21f14d0fe44a9eb3e48b0b670734b83a6c4a75467dd8ce6323742440b6c85569c53d0aef4c006f55a116e942adca2651823e450d40b7124c10e31e35ba8976e9639762c8e2e4e5cadf8225e3500688632876daeec15c7665c65f01c3e09d9395b05498553511f150650c0a8f04d68a2c26cff801e46c086b30d69dc36642f85313b08cd90f3c3d749f75fd7c202da1f12a22cdd4f58f7e866b4ffa42a6a00f5d05e4aa96bfd7329dacf96fcc1a49c95372da01f5db47fb6144d925f4d21e6cfc65edab3bec425d56b519208b9785953d2bed646df8d6790a4b3a218a94bfbf7e24cc6e6ac852dad15c120f6cd208f22d54d76e0946ec15611daec42d3031685b778ecd140f1d4807f7b8e2f81334da96c649c69efb05a05dba113372d5f78378ac0565f4e34af36616379d223df8958088a67d46c8c22623480967e92edd940d14a89b91ababcee412c22caec5c0d9a2097fbcd3596ed1f7838ac5ae65ab57d0fe248f5d2a0f0a7c3957b481c85e46016354597c306025fcaad52aaed53205abcfbfc5389141fc76a0808d10a114d1c1de08960388c1129cff6c58dbc6c1a94c743e0a13b79cdcff51bd6012506a592336d4716cee31b8caefd571adc151acdb80d3c5a75c5560c89a2332cd56af8cab921149ec3d4ac2c6d038c9f6840e00137596898eccca9600f0072895c32a696f2ca9b655f5dcc19ccf101b74ca5a5d06451a14b6205970d1620212da47cb9f0480c8d06351141da3f868d229dd4c2c07aed94404fe4d305ea770fedb8501a84e63252d58b6b0330c2fe1e46ec41c39420ad03ea51ec45e661d2b0d76087c1b1ea11318ae2b19961d97230bae12f9c7a18af21c8686cfdc5cc752450ffa6ba2d99758d8e287efbf6db887cd48771807072206752404216a30462dfbca50f93cf953508c4a8878adff66102738ecb1af73dcc2e9a495543c187c154a3460080c05ae55ad3d8d0c3c097fc09f0a91181f0b363cbc334bdc443aa9de84d34f2f255d31fc6a68d8e1be52093b44e3092ff30f9ff66323a331578a9ad1c6678f7833a1a143bd9641ebc797655841c2943edfceb67021a78d2d64b33f8f9308f2360e7ae5b47dc39e7a15d0c83919a196066b90aceb141d06847bca0557351860225a26d339d957bc49c8006935a15d64e64db9be1889770517d341146663677e48881f461b02e32ef54c4783a0ec95f0d10478a5db4ed99fb91c5721d6c8fd71847a9fda44d55e8132366d6fa5bfe06409e5b6796843d7b4a00b4a784a13d5969206c9eb3d1f8d31056f054582a6f0d9be70021145ae5d08be90e1e78e20041c8f039778d5b3ae5c6521dcfe1665bc9995c8c2e77655e2ab38a765b66313b265b4a10bd800a8a4bb154a9bfdbcf7e75a1818e8f26095c1a11e9343b1941da0e9c3e6882c0394c6481fc17020a2880e021c8f11cae94c0c069a408a713421c93d6384820e42479ca71a40b280efc4b8a1d41b99acf55fdd4c8d226b67941fd66a721738bbd574e8bb2f71fd17a4cf37c31b2e79bb6c170ebe4289ceef7fbec9342e58885f41b0b6e242669c9707e7b7e424d9cac11453cbb4bd6735deb989cd5008e8e8d45e6f643f4ee8266333fc0df6fe9d3e892008e83ea2373f995262bcbbc27e1bb95eb91f0d7ab80ef875f80dedd4543241090bae8ba56d10597ac92173a1128ee43f1e6056ef25d49cedddd5697b2dd9378cd2ee17f07a7dd1226bcfda86cc9425f8c945e5d74d0976c5428804ba66873cb0d858af242ac8c0eba6462953849f70c18c5945a157350d960b9d2803f510d16695e4c15cf92b5680907244b0eb77c9336d0956e07bc41c590c027ad522a91cd4bf6701d76e30abba2a8f96305a98566abc5435dca5a16aadc489b3a3759a0532a350215440ec5cc1b744d16043246ca17f510abd4eefc14a086592fa44b282fb6a1fc3599e51d2b8c9d536b322ee95d81c6d074db8872a4b947dbfd137f199a51e6eef5f4ed90ba5532b95a7bc42633b510b8b901d957255819b6e483034c3c17cca4c7009bb0cffd70c62da1aba244b6e996aeb5feae0884c23833d3bce96c804f00430470352499c7098c4c300cbf019c9658f00ca23adad68d47dd7b2f6bc9abd1012b6532b58aaa23bea12b9f8a8aea983f37f7c71f7eff1d0b19bf61a6e022e7e7c34bca56e6f70aab26d7838788a733fdd438d21d155e9774d9ae21eabb864cbc6a1b1c37b8f4f45a0908dbcc440faa1561135fa6849de62ece2a8d24e357c9595f2665c79c243241c9638eb6d18bf5a1b0ce0bc37b250e736f210604965892473147f21ee4e00f800a1d24a816132edd6a8fda11eb1f1b4dbc7f95f330a15874e328cb7629f85e154cd808efdf4c3c8c5d563a4edba0571399ee3783e9835ef164faae986fed582036d85d96accdcb23b6eb8f5ad4a31e3570ce5401fe8b574cf134980ba19467fdcbe2087ae682bd42c6fd4e6b4fe325ff3221df3d77426d4797d03b87af249739165f1b7e9bd1e8c7320ec512e26117be6006ddaf5397e9364e185662a0ffdbb865c6099338338a4ac95636d1c793cd4b0e95b94c1ba7646066b10dbafa0ac28bf36edea55cbcafa552de83cbb49c45838d12ced73adb7a9916c1c253c3e6e26542bd15502d250a85f6a9f9fd9fddec7641e1fe9d057149b7c742488dcb0cbc1829bd68d148eb6451ab005ea6129bab1b2835956f2931facd654a27719232f3653cd3b601c6367206f7bf820de54a7ac26778fd005f66e0b0e0ddd9f65e870e1d992ab5b4f5f2823f5de64307306ef75c05af9d7f4167db904f69ed6499794882af5a1975841cde4402cd8e92aa98998120f3a4bca71773a4eed06fa195dbe10e1d95f78d0dbd72665ae911e101393595995c1823f695c682a7460eeae6c47c2ba85c2c9fd9695b32fa561384b42333c955f178d3c00f50ffaf39366b6f582d008e4781c2e99900d93e0398cc9e26ba01e5b87f3cb4c015a0a018068bdc7433cb6101be10956f17336166e6ff02d459530e1465d8ff13061852782cc9fe966e0313a5831ff191d48639047176273fdafac37b259873211bdbee6c56b2d408109ab066cd57d18b2eea0b1c3331c409a3c522e8874cc14ca69abe444b142508282001a8cb7959f8d9d8694541b25e2bd9092c6d7fe4a1bfa4d424679b536c4332619e4bdfb048d005d0c525e134be85bcf9a5a83c96bfce69ac0d67c44e90fc8c89a5447bcc08a69b78128c4347542a12a659289fbe5c18ed8c7731f4139e5012e8909760477cda9cd27a43b6512e7d0a76667c53176892062bb78b41c7cb0f353274de6c838319e81dd3b96bb02124bbc528702112a9f6c30e117eca70b33604c9ff1080c7fc0dc3086c902368f9cc26f1983f99351916e0d849bdc147db16770a36d43f12a71bc01a7910f6af0a1defaab565327476bbeda4da6d0d510522563d7daff289ad2fd479bfee1d9527a8b45df13734ee5766ea3f7948cd8b8bd29ac04640b6ea3a8849ed55db558dce01c28cf1d9995a4451063c6b8ad740556a62f1a572182ced5b6810bd1f78f52492f5fc547baa3815daf61267ac401c17e60c9a2c4e6347baeeb7b46adf633787cd72e9243ba7915d1e0a5698c03de52f04095a640f894579ba82f57b64e125880698e3065d947a06c98c810f5055a6b6818368d4f6e31c79fc20a74bdfa9404cb34b81009ff3ec061bcd39350af7b31d6ad31ceacb3f596959701e8da996ba8441a1cae893d88902a45ca6e32d59b4a8f92b7c5a5ec75efa2c37884bca705692b7dce05d3912e7e8ffaac479ab20055297cdcc7850c7344846d48d8bf602eca01dbbe584b7a1320c05cee29fe2031fafc1078b03b741dea78404baf229b16b50ec5666d73f9c1037ec7740d55fb78cb9d5a5a8bc3266fdf25609bd9427db0a74d51db3cdcbaec723c0746dadd25d78776f0b1b78d8fc4e10c5bb797344344a8894ee0398b2be0de20872e8ea82897b2f4dd27aa32ac2dd7ebd58c5b75c338fe48b61476d4152fa98093e7a72b5a3f310c93144ee91af439bcf391519c69b23b1c9a7621e9f0bc7f3a64d7fe768b8313c68deec25865e23e9c243f5949e49e3ad070d2b740a2d1b553ccb60245c4b2730f5ed232e2349a353f0701315d1b7c0d04f01f718c16ea8287c11e7818eb3b4958409cd261ff5a6e035a00dcb21c74974f0efee772a930b308bd0b715f65d708d6744711b6e4d33b6ff2e4ac4eed260f0fab11c58d4fef72b3eb7a90c2fd806b813136a3ae545020d67980271d98028b33a8021d2c19aa02441063fdb329bff03e4c1540f7cd805f5a739fbb5436eded1a7d4d5164b2c7950fb85f26ac95f3f02df06672bed334dfecd8a3dab7aaf8a86b3d924c4fca336236b1daf65cef58822f59a1e2239f7dad7935941329d00db854d408387e479cdbd91c8a1611416b9b7c4e4ebc3b586f6265a4577b937cfb149a2138df4b16c33ece82bcc56afa85097c99231b34c1b86e7010262b6f1ed3cfd122bf0e1d73ec481036ed60787be1bd34c54f841bb533caabb320bb3757948ec75242bb7d3889fc6bc31bc408bfae9d4db63640e5e6d6314160e70623420c12b78ceee0f12947964983f6f2c84582d9a416192f9d246d6e4922b5136cbfcb20f8277e2921d16185c20243ade0748ba2515c759ecf96431b5da927d2a480820d46b49489058c3d104c7b12c79de8e06ba3df6d51f05c306cde7dd19f2e54892cb4dcdaf44954eb1e385f874215833f7a07b90d8c8dde991ebefe609f6c4ce7787886ba30f3760805f49a0298dcaecac8325b670e0771aa04c675bc9bb0a4e20ccdd0d45c392b3d88b4fe703ef6ea6091f693f29f626d6df2a39afe771a2c7ad9fe41f421d683fc8bca17c5c9f59f06d1df3c16c1d9bc17b2c0fa764295525453895b8d0f803993b71b289474231007ffca825041b21a8a131b697b19e1f650a7be264138f8462007e72764b8b36425043636c2f637d3fca14f6c4c9261e09c500fcd0fd96166d848086ded85ec2bab71f180b45a78a6c449111581f0454230a438c78908453fb532d36de7fca802050475143386a3fbb7a8e2b2a54fcb2d9cfe0e7bf9e93d10c32fc9a8a6bcb13666227bf53a22b013248010fe43a2d1e9ad8930434aa6d1e01c87f4702ec3e8a0aad33fa7f1b0c17ee77a845db4773cfda7538ff825a82094ceb8325b4b6163670cd34a81990ebe6dc609f09ec6ff0a71d70f21983970292c8d7dbcbb8d447fa47d02895eb26103bea161a9063620113dd5085f6ae10cb0de67021f5bdb528215283da429f4f79bd7a7e37af30f998b4a0c989900a6f2b91342a06cd2f8c0cf312df37ad8171e8334ee1d3c2c3b00c90dba4dd1077c798fa9870fd548da46cbe119e0b70bd06301ff1b930fd4b8161978e5bcafd696cf4aba1aa7d6029bcf95e1e05e26de86f38ea332cea8e2beb4e5eae79836c5da18e89bdcd45db1ac20994e19ef5e661b40f0aa10b5d9c205d41f0f2870bb126a6c5c17a91a1e3f7ae1ea9aca1651620244eb44061f9ae98976979d414ae1014d880713b9d776e8844af7a1965eab7cba8323e24db32fb00205a7af1c271e15adfde3ef9034bbeefba7f506da9819a6aa0aad9c5aa4cc58ea12f2559ff025de09d0ac0089d0bb2a06c53bc1d718e5f334e3abf188077ad5eaf25f77eba8f583c1a1b9ce00f8f8a13971d917d49ad8155fdde9dbcc9517dd07c9f20c6cc17ce692f97029be8656740689f692d7d3a35b0788b90885217250a4d1785d0ed2095a12f7e3d74015cc65758006e07a90ad4572b936ae059c4017aa47f9905da9cb0eab044db500db41e3e3ea8db6290293c8ca7735cd92f59e860a68c64ef67c947bf71abdd8bf9a1e1b48b85ba704d5717ca64d785fad885501d853c58af13fbcb42dc063e600b42b91c5cc31116a702015b87850a2c878e55e90276aab1309013bcf65200fd4822ece05351e982e48a81be04fac5b02737fcb3509db9a7de645fabaa09ca29d68648f1073287b8ca5b1dc138706f117ff08d924331fc1764b319470ce5bf32b3a6399733f54b4bc38cc15c421b423ef86c08f74bee89b402107b757766b99c01bdd4581fe3731e80a25ba2fb4672fc56ea5e81778626b8613c5e5bc694883d036e1f9ce8b6514c2a499fed0da00dd828c67527298371dc1b400b30a318eb4e528632bb06c6c45857a2db8cd470a306bad23df12da3c996372d17457cc6183ef93de3c764109b3aee410a0a5bfbaec4811082900c6243dc8cb81e6886c7d7a3a61add8d22e5390339ea1bff0272ae8e2278088398826310fedf43b3d18e0551f80b20e72212acc32e8a8b5f4010211c5d4c4ae1a25e446c17411cb688d4663ecb7f298290335a4e4510871713d99e7bd65b0c28a89f2e71c2fe86f3791ac2be9568d553a46704e4d19b9559c1e20c11401b159340d074ffba0a80c6fe638c02311a8f17f83d52b18a624217bf073cc6e44e817a40d0b72b065a32e1ada7c0b59b0e04fea31d02889b04c16d285e95c0f4703c7570589d34f538d4dee7c86727028b15a3a8dde4ead84cbd444ba419f5ecfb4758f234bad01649daec680885dcd2bd040f85fb7e0b3a60dd07563fbdc864f9121c135dce0fb1f4e91a7e93cca4f15238ad4124298b1982c6921b51caada960bb7f13125ade7b7b42d7cca608fb9d9c61debfdb27225be634d5cca608fb9ddc013bce44862b48d86e6e8c59ef4c813a3e2a52a8b139372262ca7ddee3c5a1de5a2d2531713a91e8c8cd5b5906baf6fba4b71cef43a0e88f6d942783923a4d1e174fe200ea998d6f331e37ab3cab680a77cae3bc6435e771e56ba4c7cd14588f5b05ee596c1c25fcbcd890bbff69d0cbd32cc876af6cb2670c8ea6e6a37bdd21374141eeb9f9ebdd0bb21b89cb0af13fc690432ee0fb41f662854823c4cd7321b7011271525256d45af5140336d2c10c26a06095ee41fe41039b682d55c4e08c392d3b817ef82421a29c926672d5ed01633a50b19d28e746826cbdf5292780f18a98aeb5de8afc5589b61abdcedb7d67b8e5f6aef78dd3e6fe6940f166dd4e6c65b7e70693e29680a2cbf52fe6a1f2527ca244ff7731ac90d9468975936f48a737a730a10b4dc3246d6fbc7805cf5c11194a51a2e918625c10950aa34e27bb7f4e642b10896780e149f4094782a9831b56e22022b2fbf9993d0e060d9e69483409a369043b255ff37ee071b3b5a2c63f1731c8a0bf7a85f598121f7e2015a0b5b4053b9519e935a95125f3a1ebd5d14250a8e77a9d5918232c16a06bf29bfd6572009ce8f506c9a4837f888fcaf67a9b20a4625c2864e07a19a0a8f6e5fc103b5416412bd64f746e83c250f47e17318d45e7d74623dce52dc480fc0d9f61fee07d329efe359ff7f1c126d43660b902aef97da999482950be234e08e23b55326118e2212e72d6a65aab887a1a05518e9b8a2ff76b08ce2e5c1d8d2b8b1976e01db14e6ae67226a90e681681bed913ab40af26fc989106b2e0b9016317c465ae5c22652936ccbcbf80c93525e8b40ed202341354169512588e2ec7223aef162761185cc1ce7633149bc6a9846a0b402966ab01ca8568cd1b58ebb11d9faebd95257cf337a5520e7ac0efa7a7c12da7de5cf45e3eb06febd9d864a307ec361fd663bc2d8802c7200fb2d80b94fcde51f8121ce1114167964c45a0739640935c51eebbf0beb3bd71b535ba7389a4dee25df8c56e59b2528447251374aff21c54e193256a3016ae506b94830f2acec757d60f54873cf0e0c996a7b53b86c3652190f38ae89e7135880372dc349a0cf98a23ea66e028e2e6dee7d76ebca8e699403e4e2fc8b063765c70cc13718463e28cae287c9428cfec3181607492a391ad6b05badfb126d8a9702f2f267ced89405d4028230902e173eb8cd46c4d02aa9c8d4f5b805451491ba096e9b8e4e3aa35e2fc6f2ce9a40206d81324f04e651a8a5b8c1ed84af98a8aa12901a68ef258f5cda6bf2379c4524cf59f3a0bc07b7fc212a81f35f413bc2672548ee324550673c3d1b66e92486477f7d2965cb903e304d904ea04eead8d2fa78a4fdca34c3a7374b29faf148ab1c4afe063a36702b1986ddf8b90928fadc81b1f6389d141083536ba5c67bb2cb90eb623243ae414ba51207c6c77602c0e86e95328dd36621aaecebe291463c1589c0bf1e96323889130962a27d3c0b6d65a6b3a744a38383a6e6666c4acb87021adbcf8405a193518e524e9a4b6b56a71cd6dadb5d65af3b47fa51d393370d4ccccb8c9313323c61dc2d8da3f7708637bee10c638c1384d52ce49e5a4b4566b6fb5f7624c5115a6aa2a678fe7f36921adb13012122222c24213a1c13b81bf5677233aa37faba75745c115a5dafd4a51c2dbdb0e4f1a40b4d8fe1f2056b6bf754f776cfa203ab6bf8581c35a791d96c16dff975d60a7f846b1efd9c7cf193eefd47bbceb0cf473068b421f3ffd9bdf7596c2e989bbc2addaffd26fef00eaab07500d3def79fc396bab7a7f6a555f1f7fb62a1dc3575a3f36c06deaf17b34090f996a14ea2b8d02f2d4af0c5320df1e62191c0a10dd3e748aefcf370d413ac5b77dfc0fcf60ffa3fdca566c7feb308afa97c328eaa515d8d5578c02ce90ddaf4f357ca12ce3c0f6c7bbeaabf1a738c57abb9eeff5ddfd09d9dd43a23fbf084c43ddd84762b8ef700c59672a1e9d555fc21b3e61b13db6c4f3545575f54631359d81eeeaef9ec288b1e9fbc558045ff7f1531fbfba30e076de55a3b80c28fce9064adbf31e9da580a47a5d9cebe7ab7a7c55949e68461f07958dbf5e597dbfea358223bbdf2b5bb1abce56d8b73a539938e064c0c40f21211870db7dc0171faf5282f5d2b65a6477b75ae418dddddf6ae1ee5278a908f65be62206cc0b1733335eb870d9ee1fcebb71186fe22427e942aba5d5d6d88b4f2a5855fe5c35a98b4955ce55f6cc783ef8e4038269cebdc72b797cb8070979300f4611333536de4b69c76b79a41d39333370d4ccb8c9312386e4569c0be7d26adcfbcdc33144e76a88388cd32427add55e8ba98aaa72e5f9803cb01008c7f0011202122212c2c2080bd7220140004201104002aeab5d00c02721121c8347bb04f0f0bafcb96b520298d43f02cc28bddf5d859cc19197f60d0bac115823b046e001c2187f7c5b39f7b2d002667c26e435efca0d02fd7b4f8301f4ef73c3c7bf1bfe7a3c8ce7f2f8cf35ed0f8fc79fff669b63c601f3b9e0f6f09bebb1f95cbe6f6b2d7c7cbc7d5b6b012404207c2eb73faeb63d6e3cfa87107df5e76abbeeec2f80fc7b9190ebd1ed36d7713c931b6c7057d81e2e84c6000ce45d3d0cd53fc7c9ffbce6027dbea6ed017df51e7f411e18e401d2f98a1e0f8f50be20c8d59a01b2bf1f11ff78b6c7d55a0bd5057221f3e4b641210f72ad18ed8ffe216492d4fd9bdbbed86bfc8557b1bcd7b45df6fc2ce438971f31437d4604399b3831cb5b5df8ef0537fefb1485df831bd036a6f09c97ba3a73fe6e668e83237f007989415c7a3c0f28d44a29b542608580be1502ea4fafe906a3fda68f3fe2923338aa6eb4fb59df4b23528013e96e5addecd9f22d3bca77f8e46ea7ef880aaf2a499bf8ee087a8ca6905fdc9b04144002f36fcd3359802be1ae0814b2db90e4855e75380233555348da7ecd995b230bd908f90b21f742fe12aee1b817bb84bf006766e04cc38124c816f0d246717fed7d38e32fdc172e7aff326162442e9cd96fcee05c7d4990b3503667f6fbd0b5d9ef5fcbf408cec137a13b0e04b2b543cefc8614e134e1f55296fede73ff9cb5439ece3977c19188b503c9225920788bf4029e2b24e685e07f5c212f2e82ef7185c06c1c2fa09a1be40cba806a7266b96c08236406a806468c1945d868d9d9747111ed784e69446261bdb84d88410c104ed8365e150e96701b1ce213152351f7eeb15175aebe2be1f4f2d4faa6afaea9da15cb63a467523d0abbddcaeb749622a7ce09e93449ce866f63360bbbd190818b6dddb57ac828ee63dc1fa367e2517a264eff07e9994c1946f2d8f14c269d8f956702e7ff6c7921c862c36f93b4e15b2ed9c2170b09997a0b09399b301bbab7f14222352f04456ab416e05b3ac8eef30e9d0df39778b7e491f34cdce3cff28e0d3f5f22392f04ef67b7e491f342f02d1ce4094726b2e306087fe27830c78653c786dfde3c62c31d1bbef5e14585968feb8424cf908543979dc11724395788ec8110622d3c104a0fd60223f4783cf73df0f3106223acc5e3f912ef033d95cc2f3d3a739fab8bb1602c180bc602756810514323c68c5cb9af2af755ae2a99e5a7bc3dabf8f9eacaf2565171ab1795443a392b69a93cf053fda764a5fa4cf13fa0f7783e3257daf39fcfc7236d72f555a5b314ee453ba21dd14ef41be904ecee7e63a4e2530f63791445d1a75e4551ff1e367a588b0d5e3dea6124ea987297622c180bc6329a6c2083965db21b0d226e9ebb7b15637c7c453ba21d15155854c22fd2c1252dd5a5a8a874bf2a59c1f8e24a4ef12bcaf354a5a9afde13aae1fbfe15ed8876443b37404c7fd7df4daeb9d6dabbf60e1b612bed1dd6a23987adb4b85a3152bc0d5f121df2ac3a856eaa33953d5944f2548a0123868b21760ca1631f60371a43c0dc39958ca4942a2a4425914e490b55d9a29248a764654e9f958ce6cf9fae4a39cdff7466affd6ced7dcfb596d2d45a9d559d0237d52219bfd942c26c5a329a3e4b46b564f44235efd46d2cf5f3ab2b54533dfdacb310fd11121d52b80dcea8761b8afe08dcb2fe9d9e5a5d2b7c4a1dbe3bd18e6847b40373df5482215eecd06e3484280981b307b01b0d21668480d908d88d46103adb560f23b9fceef417dfc3481423bdd7a426e1018ee4eb9042f7fc0952121eb2d42974cbcf52a853c75830169fa3297ca6129812aa66c7b77ec4f61cdf212f7c39fcd455bdbddc4ffc1e97ffc7057f84be75fbacb536e53d3951d3fcf7229d69a99f1f1a3c3a9b94e7df343d1ae5fd7df953eaa9a262c596a2924847be2b69d919fe94e7f9155b3ed1e44a567686a7f5bcc3564a9df2f624610a944fa34cef79f9590ab7c94a461b876ab6d4d823b1e79d9c94ba2e85b6eebbc754be7c5169be48c7c1207f968ca49459cacb4a46db7dcdf8e4e3f9ea43a97c9c02b3500dec20f91ffc143e991ee5f3789af4ab39c9ff38986ddfd5a67da7494e2fa7ebc12fd2712ec89ff0357d099fa2d20bc97f39fe4c81d974f3e29f5467a21d0783cc59672910a6681db04699ec4b6975e664a8c6760f0576ef3616fdea65265f769c2f53e0767f3f0bd5d895761bf9f63f2e8fabd2573afeaceaecf8d495c26d443b0e86fbf645a5099fb025a35de3344d139d5ab4e35c9093aaf1d8c13612d6877d77f531476c05ec462388183b8815981c3b8816db6e8791b6ad178e565ae443675b7e3a62f19d9c7392f24d27ede443f750528d02310dd9632ccf3d8d029f9214a5b2b52a2a5640fad80ac55a6c940aef63236cc5c100ff612df46a94f715637130503fbd171f46da93fd0ca650ea7d7d32d4495bf561236c052361248ce4aa8f1ac55601f9c280db9e7f18c593c17dfdaac2657ffea32f4c79ec7baefcd485ff6d7c65959635a3de5afbf0ca54b85833c83006eaf1977078d55f61cd205b9dadd8f5db67291c67df4fa9b19b066054b83c1111bdc271465604e6c7af41fe34a3d4d38d836f7a7ef7991bb11b7ceeef4fa0761bb7b14eda7eda728ff25ef40861bc628c719aa6294a29a59c3264c89021235a32a80c2a83caa032a80c2a83caa0f16d7df1bde76e494490df9fe013ef84fb0908e18918633c314dd3349db0624e5831373739393131564cb6139f786858dcc7d77d4ab1862a46db7586bfd2eb8ebfd114daa08c95edef89d9e1fec6e8d8f73f6270c414b1fd3dd3e39be75dcf0fd0e7dbbc8fff7ef58b83abd4bfdeafae8c7e7b900b72ebc37b51948a51a58fad4a5b44e47b3f3fbd3215253c5e104a93f0902fc85f8d02f29546f9f84bf74da11b44c38ffbe1e179fc17f4f1d84b6ffd4befd7dbe6b49490fde18c111323e74a672a14fe129ee5d1a61e5ff92bea844544c63a4ba1293485c6f870f36894558c6ead5746e914ea57a662641131aa29b45a44e4149a32d2c048c568b76f3385be0dfee1282b5842583ba8019f4916aab1b314b853c01931d8888825d098c10b0d2066b0156cb404f7662bf724f0dc1d4208638c314ed3344d933401df56d610d3b535c43401dfd2b6dd0ff05928defb9f3c7fafb2df9b3cb4177a14bbcfe0c83ecb3e4afd39bfcef71cf86472fe0fe613e8714ef8c4f7841bd0767523e4e5f9fc39544fbdc456043c9fbf861a2aed372ef29f6fa9fdcb4271dffe89d56ed35a701b2c1879ea4cfe8b6d4bbaa3c68cd8fe2ba04a7d5086ac711c071dca92d134c109c2f8f4aa89fa4525914e11fbd5b824bd248cbbe825bff71c7e236be28b35d0c107b5c448729a9c76d63e6c6572ff3016e7c25b21ed391a593fc091f5438671b28825b07e04f5eec6854541ce3c47da481bcf91369e630269236d640e7923753c93491e21739e892d9574443aa2926847549236640d59236b481bb2e699c87734ca1acb058d54d314784e8d9511c904d9ed1cdfe125d7591991443b252bd27324ce33c9a4e78ca48d6772c91c9e236d443b229d292ae58876a6ce5c73aaa7ce70c89cf31cd1cee8f6601b0938724e24e71eecb45e647f7f7971992f2ed609320a7d992fcfa4ce19e3994c73c633997926b6460d1b135bc146188b9e2e5ec81fbe707926f05f3c13f9aec6f9c2eac17d8db55a2a80d33a41762ee00be82fdb615a360d18973d5d66cc33693460584020ae67d268c460c7f69f30a0cb7cc158aac6569c0b93c6462e2ec34165ba1f7152cfcfa08bb641786bf59051e4c73d498db13c93d718e97a44384d964b9e5a6b61e5e137f8cd8624870c515ade394863748e8da4f4a8121f1bc918e5c7489d94d24df81163c148f27293c5869383113e842c2c1fe4e9f5545dd8669b754eca7855a48c719a7416a50d8557dc353937e1eb5ee99c8b252327a5cf6cb75c6494f91145dcf35d672aef269239b56cbe3d5b0b2e2439e498c2712ce0387bd228d17544335f16c645fed5651d9636f75a3672c3560f321cc9a0f3c9e6994c121df2cb1c674fd7f1f9befda78db9016edd64bceccc0de2234b462090a824d21195443b25a3cf475412ede429bfa824dac9a29268a7f90b210ec4e92c05d6af6ee21095ac172e4035a21dd00dc80684533202e100e500e900d588765c9290849c4d92e772384035950e0e4fc88bbff0f1b0de17504dc865b170117c10fc59a5b3e1073838efb9532782a54354b27890b3146e1383929197ac83d7f4efc1375dd8c8dd79909fb66080911c6c816d0bc8d04af9131bad505febd52ff189842c5ec85ddac7f73de11337c62956f9e389558e3146fbb93cd5e7ea3d5567a38f8d5cadae5278848c9120c6e2eac74a83dd35d66bdabee399541eeefb11cfe47ec5276e556f8d6dc2dda6236cf7d2b733a15e6f3b13dcf61c7fc1712c2364f75986efe935e5e546602c313bfb02039c975d80dd68c0a054831cb72eb35f4dd3cc574a3cb10c754bf9f5adc427dc8e17f2f752fb38b53dc12b2bb9f6ca2fe43e453b25a37a4da7ef4d2e19bd908a6867ea6c9a1f1aac65842cdf4327da79130e2ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb2ac6a655a45c8094218a14387eed0e183eed00b0061c8f59423a8fcddeadc912dbd7826ee458b1a23a1a0b5f0fee77ce1829c4114a0a031a06d480222bbf6a2e0b8faf6d699b086902bcac66cafd5da28489b17e4cca3b0fd6d64f4283c67c2d6e744b0113bfcf7d47c7c5943c82646483c90e1bb8491339e89933164cc8e7f77b4f55e168c6c3f731b152ffbcd377dbd54f6bb528876423136e2e3cb6dae2867bc07b6fd08c907f268b63c93f62bb0a5c5cc268b0d47a32773489bd6c210f2640144cee0e841e87ebe70427bd77c986dbe926d24dc9d75051986dc644ddf260f27ffc96f3bfe73ced1cb417dd3017be33a1c6708f9664affb98dfc13f9d33f9396b98eddda0c72606cec6b371a302f5b974cd60b64b41eedfdab61e4fb36bbd68ff455769510ca9c37856a93b8485ee8592cc819096f814342e49d88f0ba32c859c8ba42ce42a13973161109853674be834fd771d66c58037a0c44a592119ca143c6e65930f078c57f2630fa0823c115db9e1dc9e107eee57821bf79a1676323bfb78e73f01b8b4f5a0bc1778b25e036bf7dcf91e385b45b6bf5c09b8624fb3542126c71b7f49d862d1a925ec8b91137408750786fdf8d1b379ec7c440086fc418e3cd8d75e3c68d1b376e5837ac1b376edcb871a379737f93084674e480446b6d45fa5c7926e0a8befc1ca81581faf26ba8191cd54033f8dc83cfa73bcc133e81306670e4469cc43dbd8d175e270d981e253efce9fd9cde5218ff647a505b33b9c483a39117849c41185610b2942e822af1c91cd0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0bc36e733b16c90dd99d0b16fc8b19f8947cde4cc733ce7859e25840ca7e7e4b8085b6cf7961072e6393f4c3f8167627a676770b0b0e386939393e71cb6a6e21c056840037f5b59333cdc9cefde93c9443cf198261224a288489480cc7982f0e4edd0c9893b796fa9a4d3eb818c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c0c0948bdb5301bc954b86ca8b3fa387fbd2c956bd52a9b7a98a5701c8ac207c1bfb57e08fc0b1f043f3bf594ce40400f1f7e3cd499c7473cc3ad4f7d7dec79a8b314d4d793fad86a88ebb77740f5f94bbc07548d3fc2afd7e7f3d47b3cdaca0fbf5af9ed53efb9acac63a86fdf7e7dcfdb6a7faad47f34090f99d234545f354af559a38450d5631df2eda16314211a44a7f8063df555674dc3fbd47d08ba0f2fb46f2bac19e2b75f2f7ccae2ac330a56ca615642869e5fc8eb53fa948fe0773886d75916a9d99fcff75b89f7c93963ab51e857aa5b8967e1370c6b7d4851d4e5389baa7efa96bca8640e5576b5653533010005d315002030140e878342612049f23c8d761f14800f848c4a68481c49435a10a5280621490831001002646000606430da1000d17001ed439d17837db30ee2819583fe07cb7f626f1f207e866b2bb8ae9dfa2dd8fc7f4f9996ef0e27fa0899af6cf7fdf29d23f62a2d4e13860068982ceb5df90f5c9005be805ac2950dd61a5bcff50707bdee3e1867d49c010ef3192d230e758bae3f7a17c1e86fd0ebc70fe4ba82667ebfd5423303e846934fbffd28082e21321ee607dd3e0e4a97cd63c400cbd2cf6a4c703b747fbf2b1f7be00ad7df9cefef079e690e38ad1ecf5d58e2d785856e0f49424cd2d35fe81944c9910d506d4c004c102ba1593001f3e3b88ec1167ba555ec56011c7afd4c280118983b29f1687cccde69f6dcb3316e3c3b11b0de6fbc191b036880f9b45a9f38355e28217013f2b351bd9dbac0e006b7bf62046593a27aa42512ed78b7e011145b3cf2631f1d9b58758ba7adce4f9786259c751efc451505af31688ce1112226b446870e1e2976b7ffd8a5429cb308ea7f56c623ca7e49f205a6ab63f1a03c4109db3bf8a29d7fec5c3fa439823963fa69cf0f4aa79e12bf7d97b7d04a374058862f1dca243f13fdcf81709486afae3f7c2408849e075c7eea0c844ca36e73dbf3958394c722016acb25b4bc61724eea790abaf8322116ca62fdb243b68954108a70c8e1d0609e8e80c929f335898811d1b6a72e3c48fac28753de9a4997011f6b18c36d5cea65c6dfd70ac3ed901e3dc14c7cde036d0c95d22f1aed86d38a56a7e91ec8455f961c8bfaa3e040ef328ee991e8e5a023c1f8bf69d47acb4ea5249722839bec61b0e18c227a09ed5393ee63cef5345a0d7515bb0220f82c36fdb0f6a02b1e516d08ff57965efcf34fd6f50b74c7ed1242bce9418956626e68fd288d62ead94f0b663152916ac1200f3da466e65969a63847e019534be8c22d1c17b0575127b8a9fa06b7a7d4239d1f80210a20e4fa03826d7c7ab319c1ff225856c087d9e91ca3478fa10f8e29448089c62d7a55fbd63fc9712d4e7e6ff86acff03a1850ba6b776746fe0c8511836478d60e0dc00c9c6321c090fd96adbce8cd90c8290df048aa717a933274310e1bb0f98ccd8aac29e0d121c13ac738acd61016d91e06605a0afbc67220382c06e3fd332dfcbde40d6655ddc3e2f806a74931f190053613053dc280f369964f021ee6ea827c27ae22269be7ed7f734f6d18502380a8ebf77cc2b339916a07b1d9fe2b26ddb3a4fe241a96aeb2a07f17f556f732287ed584c5f2f86ee92adb2cbace27d6a0febbc201066b35ed25e273b090d81ef46d3cb40beb5b17580962cc43335677077e3527a889fd57f89795127c8513a82c3878a6d618d655a5d491e217101b031b89b268f08c024f8d82a2e778a6dedb4242aee934ea78dff485fb0d11467c2cb03cb2c99028b09a9ac9b4657eeb49c3b8e40d313a9b7404f7246c097b2f7407331ae52a28a7d4eed9f6f858359e66fdd34d4338ed8560f91200c762a7cc9b2e83f6d364ed9f71550fa21b26a3a65267a60fb106e5cb66f01c370c541c9ee3db481982aae2a5685812d9bdbd18cc61fd5fef42aaaf081bc48a2de57b683f9c5bceb583be9d7f64abb673ae4cbce05d396b2b95e4b82b61b12d388fda937f49cae89017b2c405ddeaed1efba2617ae846eb926a4bb1474de6780407dfae4edb82da3539dc98a11c4abe5842c4422dfe4d9a18b1af7ffe48c0fdd53ff51ede1cab83e02f3afcd9a9eafd46871d1c68a97f6981de2f9897124766d07ebd3032aea83e3551b99aac86c86914b298624f1e985b56cbb010d3e184140fb1b880f2c2f24db61bc6103eb9829f443993430e996c0d6b8f3b08b79ac2c8ca913ac866e808b23abf0c01e8c01faa30a00c4d268dfbe8a8636ff4818dab99a0a9e85ab5b79a302d6f91a471dc17835c8273ae255433a857305dbfa5e1b2eb19a0b6a7f26dc854a49fa9f2310721d1eedf7d7db811f0ec85bcc3c54812a843df7cde87955c56bb2bc3e604667048871073d96f3300fb15870274f7dfd4383df7ca210fecec0729539811ec2ce1968cca89a1610c3f2ca18f8e3de648bde98bac2ff64814d41477f3f2ba79ff404fed6ac55cd06491e8e73c996a7fe1faf116dbc268296ee0e46b1324127c3e8573863e41fc9a055bb69e8f44fc54a7e783da432be880cbbfc3baa2eee9a2155e76df8c2282e1fba8a8d1310241aa4b656798079b48154db765aba2e4b05a1aef3cd742375f32b03ac09f2e206363245184e23c9bfbc42818158ec91b42bb2fa2d6a7475df4ce1f37269cd3ad102183db802f587db1ad043293188727e2ee53073ef1ccc9ca585d071289bc01996f8e8f5f191a4bf7220105ade26ae85c0c1942bc4b7eff793dcea8c47c39bfc2967c49bdf956278352f433cefd620b40525f9e3d2c6c04f53489a01714045f33b6cbc6e8214e5dce58023f6e835c41c3148c3ba232907d0687f5120df0f401eff790585fcf99baa22b95c9d84d1eafcb7a07ad02fee61c08cc3adac08059c7ce70ea224810f1319a8a366799aee756bed6856ea6270cb228e31cd2e64fcc10e610a22dc51b10e91888fea8a73c6956eed28640404b4d0462028d83e7b574158c7e39268e30433f6fd7024c7ff81efa0967246eada81706c200a632487f9c29c2d6543e45c093134587cf8093b1dcd7329b7a7940d02079881f5447284654234981c3af7752075b7ed590a854ac6041ba986bf3ae8c4e46f95b705317b51b57d0a273eea013c590b910784426c67e6e7bc693858d2326ae242bcf0991930a0ab5f35519ba2660b5c067e192dd398bf2e1a1f4b92e12c87260a132f10307e884118547167e28b008ae2a62497097b0b5499bf34d2adc7081655179a12c6a75af8ee7aa150e4f067c0a9080babadbb404438229347176b7e22d5b25af63cf472e079373b3ce0a78cc82b8ef7003c660d372fd9b3e210b53e638c3fcfda62dc2541796636e761df1b9359936c28b9b526009e64c4a28e8a483587b92feb5fd870588e3d8cd38006075ff98941635087926a65a30ebcf85039140c33bf98ef7c32c186fb066acc3bbf26f9831e5d6de3f7f590ea0c1e81bbe40ae5cba5dd8015daa1a1df88b8c1d22523df5e30a724289ed37db5fe56f1c8acf711ddd3dd4cfe6dd34b7c9afdad7b3ff7a493afa6d3ce65d1dee1898890450a9ef6c2fb32a3c148cca53bee7647283c030940e7e0d1240897a764ba8c4cb04d6d29681e8612654c8bd2940e83722668235940bd667041a2a6c0218305ff2a9f07d20371555ef26a97b8266974b32c9324b53ecc8d9496d2488aa831592850d8e64362b2eed2a83ca0a38599d89222459135580e839280bf06faba35db075364564e046efe2a11405b8554b92899cef641e7f15c836b98ee81076e36499e3204907759c0105a96cbcff7f64ede15ae8eb137d2f5a890cf9bfe4b5d8ffc2a2e76ca7a68ca5b60ee8c5031114c075e518712ce678f6317589664cca96b7761752ab8344378f2a8981167420db65578dce7d6900fa2138cd613851dbc2970cce1d8743276a0f243940cabe7781e69086efbdd212d562d8104251fb340269567f0ad8abcc8bda406edc20b7024a728321f15b8e109d99df800ec1ba684ce2e025371969893dda939e3d155cd89c10081d0a818ab544e9cf63080f520a9b6d6134e76122402d46aa59a3917f4cdb14f4cf60f16ceacd86822c4ec4c1d9fcdccd0610ce066db421c5a6738982001a4aa6f2d0febe6f48cbba1f403180e8e7dc5419fd4416c0b1a3517b0d5e5cec08029d813cd97114e10960e07d6fbcea2fcab239830c80f1d7ebd39e1c1958b9dc40eed0521d7216585a87a38c6a163068af6abcce179e181c6387fd0161a0f1e1fb4f11938fe3b2a0814a169700b2c41cbb086b2d3cb99b3ef230112d28d5d6f098aa18ae513dbbe98a862215cd450caf4103854306e85e23ff078130b2f7c4493523a979dd9ec55a523b27f2d52027addc5548701da91fed2afda4cbab1b88fa1076f800146a5e036bb61ab488dd2894fbaad3f45fd9b9a33166df7518286a6a11242186e4d90534bb015ce8452ffa5985308053d4e6e665c7b6b79384d93c157c07b6a5f722658514b3bce8ed3d28b3b2cdf2b2376fdfbd0b257bd62cd96271e1db1b2f5f5f7f2735366c59b0c0ca32589b22cf7ac42a0b310e6e09644b33f65a4024a88525bd425b15e60644fe0be9f8b48f9a8d21bc57b1df93bc4e2ce58b45b1a780f3cd2ee92310afb3233aab260a824faa54f5577d66f70fac21141a05d283a2815e7dda946e3ffece5e2f98267d391ee2b64a3bbb783e5ebe8b4be8459ba43d20d7afe7d8f36eb542229f4539147e8a079301e2b2bde8d9f29c5763849207161dc54a93fd701f41e85cae4968e7779d83de2b18f0b135cb2d12466caa331cbac755de49c23a9d45c28cd190bdfcfa18ef4383f4b69f48b8fde052387e88da684abf9653db3b803545e0fd064bb20e754228e06c5a4910c3e83e143c1b719149a383aba45a3395de9facb6c4252d94305e8806b1ac58a58de7f5de8dda3d8082936a4b8dd56b9d1cc6cc3df71064f77651d4d6ea609cebf97c9248856c6c3f4c2ef30c2b03c0a50998fd54964176861d66bc3756dcf162d4374ca298307b71f7f513ff008cbb54a8a550838270a537a8518f23f04d6d25a9a5d77eb1a41ce74bcbcb2f48975017155d9458b9f4f27d54b2b1c0fae2fbefafbd83221b16ac59b27cfdddbb57dfde783f35dbec2cb160c9c2599f728f3b7790abe02b58e1b1d485970ac3e7e2f10bf262795711249bfbcbab17295096e3495c04e6711980f380afe1358e53b45cca192db861d171d2cbebc1547f60f5760fde015c3e6c5b56a9e178be043edc836944482fd78391197905010619a0878a0e0bbd5b0e8d8add01dde87d2c7ac88abea474097025414adf8c2c17a1b3d994bf662a279acc4a86deff8869f7213831ddeaa5ae0af641ac7165722e2a84b8d3838128b8b9cd4fc60fc0ce3416e8f7b7103520e20ca64a87bc0a22da60c2efcf8e0b833c93d6f05d2f5df5085effde29814c045a7bdffa95397823e86e397e7a80ff5d2c7758c1be1d98b37b30865ac5df5eb18ae79154f2e78803bcecc1108056f62ed872708c5d6d03d4b6f61e4ce576d4a6bbbcd44da25046fd88fa81f9c51cf2b2213972d2572c4b0321b66793dc030e582bb7d5f6603cb7c4fac6df4ca84d78279970d2f235ff6b35a80f00558b103d18eb1d95ee128755fd5f6bafa295514e558cd2bd2e46f077532e8c86fd37b8083d18f163e8f55da6691ab64526a567f41e0ce443a61c57098b417f0fc69f79c9bc8a2fa0d0b81802f477b0e483e9de70f3f94fe7489e7a7178e10f214f6c633538cf2688415b4ee2f967844aecf1a24acfdb1fa731b600073bdf349af57ee9a6b34579ed98ae74e9d976964c2ab4f8ffc162e6d9f6e44c1d42ad29689a39b84f229c80ac1cc6d20dc74d7e07655f800f15ef6a36622e871bc4ab61845c4b57250b26bb22c16b309d3d1839fe81e79b4de3154e238b19724d09ae91da83997c98e4baed36e80434b74e5636e9ed6ae91cd9667241a639780faffaa2b9e261e850b62478787fde31d31edf44d9020a8b665ef444b5a399109ce8dbf062ba3b78c4cc7b8c992edd1ebb85394455881204f89de1bbf743d17d7e608ab66a8d5cc1bc618a72a06e1a3e0ee1b1b768b3fc778868d2a55ecf371d255845344f11f1b096e46228eb229af8562a0993c9fd128f9a88e6ad413c527460670dfc315f4434512e6a8f54983ae9eedad75944d328d984391b36ecb225fb59279a8f25a2d9c7f8523c61472b0eb567d18f917fa3424b2590c6ec0a7d41eca1596c18a28dadd0c6d9d3bd739c1bcba26d5469d67f96094161529299dee8cf2a5860059494be39b889d5d26223c3da3e6c6ee7d9128094c858a5bc491f99544d722b530a31d49c58ec8a0783c63200c24bdcaa048f53fb8c284c33de1ab745d934da98ae3e579baa8972dfdc19696fcdf643e630d811847117df1ec63d69d1a05b86161e57ac68746326671b7d9042b60121fd3c07c7ce0a69882f8cacfce2d03edc44316e5553b437f2e0eb6875420c6bf3ccc334ab88616bd33b11e4844cb8d8a9db8043d23e1aa2179c87bf4e80089e7c49ad547847988e47242ebe22bf7b23e0aec2474b2614033b85c078637dbc18ff7623555c9e7af0f6595b12f14a3bd5434b1d7c78492af04dbcc589b312a6a7009ca99a58eb83fff4c8f6a03fa9280aa33acc518712d91e76c3ff85257670382f47c7641e0e031d4523eadb43d0297338b365e6fc1e9cfe8b9a0429f08170db3f9513b0406027040d80e43c7d68cb4183a92c935a7e612efb56842a5c048ab3850f806596cdeaf709dbca7ffa51f9c8141f94ac5ca98a082c3e586afc6ecd07f25e823af247e2e559fb1bb935501fce086517b1b74f22b90f8557f761ddbc2180138539182dd2c4a8f70187c5560f3ccf8e519cf704ef43d5291753733030c40fc7b76bb6f4c350a07e489ea66a3c1a8fd279c040fcc1dc83fc6176b00f66ff50f4944bc2111c82ff006f4c9a3780feca47ff503371d15b37f7dc50e89ad691d2746a85132b2204ff375e87df87c6f67a7f466554ecdc83f2a1b42110422acc73596c45a31633188e0bb092fff0d1d9e45ec54c89c8a2934e852ad0d221154fe8d4a60cb0a099025ef40dfae95d0fff0ccd3eb728f5561cab0a5b69b59c98fbf946a537403ea6188f5ae1bf5dd4f935a3e29fd86c9af5aea32edaccfa95b2f2574d621b5521b140abac0452779cf7a23053399e197e43affe7248c969817bbdc156eee78ffe5f371968789a17a43ef56c6274da6221486e4df694bba58e67efe6d9d4fdebeee5a89f9d59afe91f6a5d71cc7774efea24f987c648c8b897ef2fbfd5f4fb2bf288d8826d9e146d09e6403ab606c0e88749a5a8fdfda2b663979682264d91667aaf5f4dba15c4b4faebae806c0953846c195cd0d37ea0c9188ab22a6400a46081a97f3def38bab5e31570993c0d1d298a1f4373bab2bb23545a2f3f7359009693a3169e6f4c7c1277b7e4e7ce987bc636712d23fe61acc81044512661902a518914c277545f416d6895795334ce7650ce836cfd7da3ad5650a56426f9a957c07b3d43eeb4d28198719d64a017e0a272216f11d5410fc04584bd7f8aa1417017da667a7b37cc9fda0f8e17087db6a5a8cc18a1180ff5118a0f52a556684108bff0b8514f72c420cfc2d0c0e2e3eacaaf0cf775c846e75f2f2d70de41af5580ffb498b146e72467e071bce394b4898a560b946e6b7b0bbf622a0d320d8946b7365c6af2af5920a974ad989994372afb7895aaccab5f5157d4384a4add2c281b7b0741e92ca9b059e06a7decd418189c0a55f191355751107b97511a983134d1561331a980df2091e866b0e3526c42e4759a9e2c6092d62a4a06372eb85950064540c723882acbaff025f3557b623f0eab55d4732c8f36eccb64e516f47c1f391dd0607e266abcb8ebc2e8c6d35229fd61526bb884b8d0d31a1ff89db89c5c37d287b4122ef4c7e5fa46bd1a91b01e928e9edc4e189b0ad5d02a8872519274b420795b21164588289897cad63f5a53ef6b6426109edf7ff436dbfa550dec4b5012519dc8e05d228075692a3c6a8f4e2230be05ce693192349b9fbac24c22f467ee45e127649f78d77aa91f78250e68c825f8383c7a3ea421f83bbb78a0dfb9f5e34af4eaa96c3ddbedf5fca9646c178dc9f7edd1514a7b38a7d53dd72d9d82c1c720f80411b35f1cc64ee1191a1be7123106acd3b76b749151c90b8f5ffe6f8e8ae226d3a54d12446514b819b569f09584aa343dc8ab6d0d6ecbbdd51a94e1c952a9b9384ca0368b798303ae472c89aa0fc00bd94c342404090ccfd3cee9e6f4d0986a0d7250e557fe75cfdbc95d7f18295a3f55bde50c1a9adcf32848124c6eb941f1bf650cec0f2afdc49c3528257e33d3e76c339081440ec2d820450e0d9f514a98b288eee868a001ee0913aaeaf6b2066956820cede8999db6febcb07dde34583f2fb979477b2517988b87540b8adf0777f41df1cf56d43012439b930878264f1044cd494c615ad8639eec866313eaf6b56bb3cd7991674e1f06d340ddd2c1ebc18124f9d1f23d6b060731aa7e70f393fbe2a82a8df0bf8f661b6d411e3250d1012bc568298bcdc267b7f7b853896307cc2383ae68634788ae7d34e80e2a887b264e059ad9a0cdb68b36db9acb5936eb0c818d3528a9aa9208650165a06ab3c40a408a3806e9a3994a3a15c01e7db405d8c3a14d2cb36136bab054efb655d12f9dc287b797be7561ee0a555d945d10779364cfb9a80894b8b50bda60cebe9a8d6247baf904b07a924351458a33882131259fdfe7c79b9b4766dd2f0692ff3efcf67899def358de641b7118d67a34db3fb3bc714c30f85bdcb7527182914d571cade2ac35fb111866034bbc142ed29acdf66bead100e5ed09d4a37dae810fddb3a2f14357d01daff1268fce740c177e60a62a952c473fa2b0a4f0b64f1294b50ad62638679dc7b3b827a1d69e1279195118123c0c587f95e7d8979d7d23f0475006bf913587e89549f0550f631859b5bc7feca270b69278aca929f492d10efb32c7b945d646dc88b32f9ce90954e385007bff6bc369e1538a87f95841972a8ad6b6b42d1069140c276e07948b81b0b8834becb3cb722fd93a72c54be43fdcffd45248d0892c1597e06129010703ff6128a81c238506aa3beb2f1ca92d91bc879a03216a4135d18f755d536aed7f64a36542aa4c034d2fc0a9412dfa9b028fd247e3f0da04edb97cf62e2147334d093040f25756c3cde0c769d2149bcd8c60158120f303e9db4389775d9cb3ecfb40d52ec41108058fd2067c4f1610934360ea26d6aee843de7b6b3ec787dcd34a21183ec5dfe46a5ec9f9b24d6e5bedb21e7a1a4dc795432ad93609d22fd6a6021130a1eae3615ad09da63920d8dfa20c826907ca4cd9fa6a0d752a1e1db3fd187d19e0d99192c24db00866b9a5f6da7d89fbbc3eeebfc1a5e1b3339bbeecdf828c8b17e13abc685364ede5f76de5cf406b78e455ba22ec2423c4cbba0e880b9ac91718e17ecf19183d290e1abb33277bdc4ee953a5751ead280f42099d1a7b46e601b1bb2974f49a0b05e4f647d72383bcba5c6653d861623639ae131a6ae75399232c760399c90a9ca22a1dd7319b46fe1595996747626e48fb9ce633f553112f29007b88b564143f7f540dcd963aeeea4a213f8fa74b46553e04fbe8c601820ea98009a61c1502c28a7225bc18b071fd3723e88249256204817b84e7b75761b060ba8ac45e38fd129672e0e73f106b273641e2523636ada0ee725058f0b19db893a47180c30a62ccb00c1b4fe6682b14094a87ffa5bce7a0955050e88aa363d53b0f254e546065af5515c1e6f8e5c8135da5cb725a2fedba0df61b7da2086a2bc819a0e0cde4dfa872a51121132e8b52e361adf4968abc0bc2dfd84540b98c2b2b19122511b0f8b83f4dda2a3176645ff812202e447b44d315ac15010241edd55ede554853044d3db68cbb2d2cd5156764a6fad41478765dbe784d2f60326f5ecdf5cb4cfa4ad0f30bcc637496da8b617d654169a20b5fb5bbcc921f2ee9fe6161f1e5a9f0898f267a0476b3cc03d8a4e29b269921d42408140a17a63e381633d052c620b08424dddde49b833c6e0037510425cbc89ff8c56f70268626983123a88104539231f56d90ccc8aa1c47784c8cd2a88861d36336db8b1750bab339a40df101cd3333885f8103c2d9afe4750563641a2ebfcc412200504667ff3fd1322dcc47e65622285ac2dafdc7a8f8364336dfb2f6fb4f430bcbd24f9948c9ec60947127f630002a0493457c282b42731a6451f82fbbfe92ea8c5072fbfef2ec31545d26721054ee112e70a34c7a78305479441c00f88bc0160a33536cbe7e7608af4559108910aad8c345cd31cf6c4f3f112d29f6beb89229c0a76647173e18aab27be17bf3bb68e4bd5665f64e6341f16646f2d068ab339a860a09e7a57a5d81113d5915234ede0c16b2775305bce43aaf623f59baa842416e0e9ffc4a4ee00159b05999b0ce907b04527948e209e13df2f0a0d461a2fd500ec66ae29021550131b1f67753d91d9ad5876a355ece8b9e50ad4e66d82a0fdd71ed162a507b45631feda1eea1431f24fbc7f46ebd7ef479451557497e49ccc0fb9655b3d1442fea797a21a2c51c7e010b0fca1af992d59c7b6234590d51c8171804785d9afef5c6adcd6323cb24b9a6180ef656b8057129a0ca79b061011793b10df542b58ad5b70f77b7d331d6e2f5374479f066d7c6269b9dfea2bc17f26fdcf163a467af7f8cf8243f562e0c5dcddfd837e549b511e22e215db76c803e3bfe6d8092b7a9ac2651f8d8132d864709868410864fb8927acceb556e367537328ce2c1ad28204fb9fa3eefc7d218f3094ba153f5963e442d9c3c02fad6d7d7ef254ca7f703378a9cea68cb3ef72a04da9c79210fa652be64e325db389aa4ad6847bb11cfca22182f9ab08053b8369419f3ad372221c9bed2a61386d15d5016a5e6450c7debed992660a178012dc35b83fc861937bd7ef7c5df94fe0ca4711bf9b3ecbf5dd774edbb4e349926ab1736d5c3922d154d17e71cfe90a4215fb92a1988e3dad0ae4d2ede2061d09657d34b6e585acd673db59afb1901c6146a12dc18612d5e3951740b8e7c916d35b1cbac46bc7d8dbcefc0fbe48a86747c2aa6a139a70137445ae0dbcb96a0e91807e6d408dc50b0a66c270b836668b6184ee2517452f611111fafa219b51f3f45b3caefff2ce3ca4ef315a7e805ef6d0e8a8b116d44ee63417889f72e166687fafa85b9b4c7effc2fcca45696d2954cb9b8ffc0c3d80fd542c4c47fd7cedbe981f9d436c587cb2bf55b6c1766514549413690def1467b62f3c2c9836b31d18579d022582bd9f9dffc913ee1cb84cd686603f0e88d1629f30f785b985f2185ae34537d17c7149a31ad7a7d19530b73f8569acb2558002a606591ed868c0a0fc644352928425f63b2c3573d38396d776e4a16f3378f73054f49c58f1d8c315304435ad369038a66c039908ea961966ff0e0c4c90b70a83753287f96929ae5a5f432c229fac70790c3713884bffa2548237d406454035b81cf444dc7d0b106105511c7783dffb0618477767e03cb9c580503b640129b35ccc0fca34af96665e47a86dec2d8f789649ab1edadda8377a00a8ae57968970756a10633cd448b7b8540d13ec0523e24ce31d36ceb1aa8421020123e701977f0fe44fbcaf07fa3f4e6adcb091881bf57a7a4445b1a8c5c00d1878d2447601c8cb1bed696397c9e2d7114a0e648b46632a0aa12895a206ce033493a48c64c4c601b950a5278d16ce6190642a481af4232f8fa1019b32f5be50d3143048037ad52f35fe497ddbfe780284b1c232a1b2750d9d21833b8a297c12c4ae3e126d1785d625346f238f9f1d64ff25f598c31272a4c2ea13f2df110f72379be4d69665e6113f866ed65c793618ddd4d125750447ce3193873bcf10055bff783fb402e46c172bf325cf869c1dff935f1b26919f3e0181f7bc08cfec395c63c13676e6b486f39fb4c9291d3029d20090d0962363ce8ab11ab5cbb6133b3b71dc199b18a60df1da761b3e6e4652707ebc32b6defe9f0bd3a39ac5e550329b2b079fbb67a88409e9dd24d901b32b34eaee1cad6451f5d5fd5f7f97c6190d207a1cad3c2e665420c4696bdbe5a9a8d2d24f555b1bdeaa7d3abce0e05e9ce0a51f9b34f1025a37e8e90c96830a9e872fc5c6c75232ec77f25d77fb59010953d8328bd2f184f3346c819b04fa709dd772c2fe40113f89241b5b2e2f2a823a02297edc2aa435368c4ea2a2ee3abc25517ef2af3a43a7b565b4e17dc24c458ad92ad68da5c3571995638d4cdbd0915c79929b3dee7b70bac1d6998324fe9fc363e925411328cb1fd08444aeba70aaca2fc6a5ccacc8503a42bc32206a4737e4a02ec64b52972c11e897308da3bdba13dee2104a7aa6c8afd6feda3aa4999c15e2833d13a479ae23aeeadaf0a75812d1aa9958d266cdd9e3560a1088aad15927610ad70cb0a7b000433a1073f07437531b0c5d9bbb7e8f2d287e51518fb2adc61a25f564c13547c5b6feaefbd8e659fdd90a7455c6644eb2c0fe0b8d205f000208798921d4c183a4c86a55b3e850ae88bcd7f43741a2730b1d12bd72527ed1bdf777905c56d37a62ca1e941d113db051434f5348bda32ed228a23f2c1f40fad7892598f71a4f8e0a588952175748daf445347bdf1caba46b2eefd7669193c82cd2782a32741928536f38f495e7659a46f47a619492a2222efba2ec0506b6016db79f0561a98e16d93269e756624787c8dd3b420b1dbcfc8af0d6382b81646ff96b49cf258b35af08524ef39333feaccfdc5a1e327856c7a17d6a0aa4051cbcdd6d49e627555cb2e730df7a5721658090d05db4d334b20c7e1bfc4b7e8f0bd5122d472b689d90cabc34e12282c270308a99c348e185eb551a228c821cb802c921a368aed8c547733d06b9ef72d7facf7129526a023bbc0ee53288d2bcd29e032d4a6828299356a02aa9c15700d27925ec940e35886fcada250de709979f440e848c6e27707dd5b87b038c566556fe12c492d8ee1faf674faca6b91cceea4374613fa8bf78a17918a0584874031fb5a33888a8f6fe1b06fe4217cb4bf912ab37c0f9820013231baadd57d12dcc054a1b476f743261817c30b9c3161cf7c14db14e7dd1adf312614987ab95d6a8a03da2083905f0ed67e169c38c562f2b6b5c4e9b562e82b2957b62f3439aa0f3b45e522a33889b37e9ec07e52d9a3b5c081c5fd34bf28bff51d4881826676c931c6cfbb7c304d780ad422d599512c7f16cadfe67b08cc431fc503392ac26d30477fea26cd96b59b4354e4096356e81375be28a038d7f588277e99184162a0c1907a75b7f55eedb16c9b9c9542b38150614c9116185faa418d1552e5fae0a2806caa6546208c3394bbb53aa2cbeccc0c2218a3c838259f0effad7073fb0621b800964fbc430c39122cc4e6a776c6a47087d6e2bc533f25ad31d7ec5bf5a83480f01c756cb13e0b87c00233edd5ff971ed48e4d4b781343ab262fb063a382c4817a4a2fcb2258794c502209a4a73c644dcb6de9c32ffac251c3335a0cddd23cc5d892a6fff605450df2406c979e912a419da0c4adacec213d770f45e2c3722cc7b00cf7c789c00a313429786cf53ec6ac71ac90c6298c939a5c7e78285de319cb89183ad964df56ca6c16c59333674bb19ca616024b1d441ff72650525f41893e5dbc63c2bb14d510f3eac6e0bbfa4e83ef92e26fa7849b8ea883e8d8f87ee03a68e986f2ccc0413cfed4a4418ed689c139a5aee384becea33951abdf8a84b7e3802df978d0686d680ffdaf00ed162ae5b41003a258b8ef626347a78c44b12bae99bb4e93641caa98aa7251937f800fd289474f740d2417fc150fc2b1a68d5f8d4fed8bb152cd0ac62f81546409e59bbf8ffcd918127437a0be5e2f7bf5ebd3a2f79603ada0dacb89899fb3befd8835afa5afb0b2075ba3f0ba1824a17b10888f914e9fed8dcceb188640445664b1f290e9da56e2fe410206d802eacdabf176639c48662e59cc7178fbacbf3f16d20719771354b4953934619c478d1f67edeffba4d5673dd64f4eb554f5801e361663dff8d70292b95962325b23c24001a0bb8abffc6d18b21f977e1decd3b3f6337a1fc68c3055798a58338025c2240b4275c95e6a05174741e315c746c140375ee4b49ec2470474e5ce0d44751db34ed94a5c0743a260ac390a101a31e5eabf718982294b20a7f1e09b6810331100dd297f71ba168c200a662fa3759f1ee3be2826bfa609600d4b5e3cc9ff5557418b6ff3db8b6252ef1e4b98ce66517b21c887a3df189431e4b980e3e5dc453a70fdac60a05976d6ccebd48304a0d0a082eb22f73aeadb233caf60e45ade70ed0aa69b6813c2f807b99e09c1884a3bece796c1d4eefe21775ff4b2c6fa9e93d2b99a2b07319f6676ffa18f0271ca24cae2d93332583c0807ba4745148cc4ae757b7205e36870ccb1b84756b3e003c70732c20af611de500d677fe049f42b98d4dd28229b941287b80014368754acb9b5c64daea02254206f86fd2167cab72ba487caf8e29d98933e037aa6bdc41d635aa7837ee1b1baf372434dc88c1e75864df51404922d852b825280fedf9db09215d1dbb5350d605251d2266e2cef53753c985ab6842ef064775d4cbfca60b46c59bf749e5d8606d7abf264a40ac4e86fa74e184c895694fb470883c1d5dcefcea60818e6d55730c29a991b6ae12f0dd718c4840a19254032a2a269b5d523970f733bb384ee474b066947cde960dc2aa4aed9ff6c226d04609c8ebe81ed821201c1d88a46526842580ae5b6c5768d016516e2d5566d7ad62a52d6fce76c127622830340b14839eafe0289b8a3a4df457e39b45c25aecbfcdf34991a62389a445d9699610ae9a91e2dc28764c2fc2f4657046847209a868e70185077ca88a8d52139950a126e652abbdb310c05cc407c14cb4d607209b67792760fb67f81578815d13bdf567c4d7edff1d8e6dd2fcc78c0c1fe3920f4216599a311f6b34e67ad44c62601bb7fcf876e2bf68926c2f0d26c14946f4f2dc3e2f1339451cd6162626dee43535c88edb46a21f9b0925401ed40c1b662fa9e5579effddf220cee1817e1b672aecff467b5c2538f1a602fcf1f3bdbf6acb4b09f6fb825db06e3d37bb33d229fa13db57a307591aee3ed70e65c55bcb6c188c04182c1019f648d5d5186c5c1bfde91462f1bb0ccd801bf01499c43f2df353f385cae1297a328130c97f7960de62b14e367de8a775d58400f755dbf5a06b844917adc5361b9dd861354f0e94db92f3ccf1922fd591cb8cd768d1cb4adf4a0d0a11d856324f8078033eea20ab47fd68c21e26f6839db2d5aa1f62cfa31b2bc176ee71e44354cdfa53120991f013c7712aeb37a438d0039ff86fbdd9046b60d371ce620dba211eeceee2eea5b15aa28041adbb64f184f01c2a603347fb8b15af0629b690ffe2fa8ed661a4379668a5e13de10b746e7385da0f072d876f651b595ec149b9b25a84d6ba220a30d1ed00ebc8c113e6c6e7e80df22ab2a42e8f0d9f3fe17331d06b9665f8c259e54818149cbc7b78783bb39c6a0e128a9de5449066f209bbf1d8df21589f9d133783c7849f4475b7495b3dc402d2eaa1ba1f7a5afa856ba930d457c6055bd3a79040c1fe7c42258525779f7bddd8ea8066f34632a5076aeced4ba3848807bbfab79ab67d318e9ebcaf39521257537bca98ba53178d824483eb052517572b2acd4092387f910a9a7a142151fc0ede3a42a19dfeb271196328013832710d6767a5ce062806fafa6d0a1133dcedeca1921ee7880d60c7855e6aed645c67a3977e0a43e58de1b7ca5651b577781bf65476036534176830df99844571ce3e976309c6affddabc9901c2aaaebeb1e04c6f89b3e03b5345dbbe2175be341993ee0ae42bb049f04379c03d49fcb2cd8ce04ba834ee17775e4086deb34c1028671831fa6351212a5ede3e61808b8e1f60548a0b9f82903ec7c1045abc9ef5af98d1fd3d03c4f5255beaf68eb3cd4471d1af01acc38d313ef33764463d3a620df9f622924ae1df1c517f23fca4292963e5733d92023f8ed1f15586f7c5b937ad01188d414f3bbc429666adba1f385a28d1f6d18736b93ef6a81a5b8be2b079ba71a6ff4f0b634f84042fd5e0f784baf4e35459d72b9a713d95eb7151435883b6a49f9838ee5910fdb69e38c578165adbbdcdee214fd08462210f232b1743c494ec42da2e52ce69f5f1daea1be4ee15065388f490876f81f3da548a3284ed9aa9ef18db98062a6d357971eb3306d2f3adafa276b732c8349a8917ca7ac5f03a51ae4a1ec344c6f9ef80ba19bd6487ea3fffbe8d8972219c303ab0c6c52ea0c26e0ae0ec9c7ddc03f08b62dd4bc70d7eef76aca6e95504ae1104da618d99f0eceec85f6f471dc8697ddb9e37f45359e71c99a2dd658a5954cfbe2260987580eb295756834a714847f9b817d0d4dc8100b9c0319afc1759561d917a244ea418fe8f973ec1f14d3aae3a0531a856e4b588097f1ad8778321c9152ef51afa7016f7d6d8a3dd34e50f46a567256f8fb2fc8af82bbcb146941c2cfbcef6a6500e9c0ff8e4e525d0f83ca520d62d1007bbd4c931d5aa0550f170095f55d1454a7ca2b557dcb46a4e3cd68898254abe428cf2f5959c452aef9c28e013c7e93543341a47e306ff347d5e4e82e62d9034db9f5d8f8055e9f0428154c0410488e444dbd49eafbc20c3f5ee4e67cc61bf52672e31c5215da706d53d981e88e159758c2d5447fa7fa2ed0d43f10e6e9a58a28280ace0ee0b1ff99fe7e3493f6816abd025803a0dbbd485ddadaed7f5509bb144788ccf1984d3597cb50d67f3cc65fcb8db007a92e0a9f71cf49aa4b716d147595f4f76c442cad0c43a0244a1b0a923eab9a382ea9e326c38e991332ca816874aee99bcab6debe22b1b68c484aa672e1c295ba004f6e795caeadf8132ffa0eb1c280f7b2cba3a0678013e3f9e28fba8c6b235e05b11579ac39c47a8bfabb831be30b7fd5eacba12e7ea5e01b6fec185fc5502c2eea3a063629e8a42e3b8ef0aeb7e12e74814df198f4133d3ddf9d201193d64835407cc4da89c2a6912cd72b006c2967feba56cad3d00d31a233401fdc51ab641d1ea1da36f7196ea8b9ae787d5839f75192529d8299dee3a008e99df25e70df816072991c1a475969bc9105991e45d8f6f97bbc4042851ca90dc5aeaa4dd01bf4ef9f36c6b8b97c55b20ef2957d919d27651bbe971bae7201c10eaa4abebbdb749530731bfd75c8c36e717eed6ab99275ef49fcb24c58deb3c848f5a62b4539abcb4cf79e00baba8c3436afa2e32ec44f9269df7d5e396ad55a54e9eeafc0d5603f49d9de4023de54f48cca8689b81e83a7df07c626dc5e7b324c51b38b2a62440731cb662d44d60f1b9624a06311255633c4a2882041e76de335be8da915c617d9e9525e5d46afdc996f8084c5015419820df81f34a76ed95bca358d0b8949fd3d3384aee96f7d23ef9063e8c670bb9fcb76bb9aea377befd86de0ccd011470f975d8569749bde88bf61a01c1a1576d5b0ed6cbb3196e3d08fb31bf52dc8bfa4c390cec330f2f6da58941e6448005e04310e37596d7db218c64f596d2a7ee8d9bbd949cdd3055f1354c291fd40edd460f3b136f72edf2febe9e1ba43d817641d53c044c97d638abcb57d526db271987dfa5ab54cf9cb0d0abbeea81880bfd75f532f77508423f7cd0f058ae79a29a77f5d1e6de8eb16622b81e158067732e0063af5e595525e4076a6fd9b423a8f42e7cc0aef5ee5be0e8fcbb43e13635da19047209e8ab175363bd25d52e7ec04e1dd8e357863713f4aa8d1742eac9ffe63d22b59acc702d6848f1350075eec68fe3e12372b8b50bb2c5a63082e6c6065f31db533d554cd9061440282c7823113b0d3ee4610e08bf8954edfacf914bbb5db851822402f84a1f6b9f7754ab68857d26895103bdc31f4704f6274ad90a57c552a97c1b731ca22e51df44037617c1bd4b9d2b3f6317c1d7e71776bd304161228f7ddf47098e1123bf3d7d5ed69db9c0c8b64bed08257d08bab9ef148b8047414ddee862d5bde44359370a021146ff72e3d609ce2638187efb2237a29cef0d41df47a3f59ba02187c73ca6186d9631d96f3f0cf8e8804dc5d3672f6bd27f0686c97cf713b6975c193cc77a4ad25a4a3e9d3291936c87ddac4dce3b1ee2390ef599f0d65a4de9036c01e57c4c89b3b046910c4f7d3b573c45606dc2fcb108dea6ba140e7da3de768fe04f8d7f5555ed2e91b103fa2285cb388220a59caaa3d279a418fadfe37355ba8fae4476904e179c7a0e3f9f6733ec849819efe1b47d6fb5bc22256ae44b64b84906c215681da801f04fa8a7f25c86959111f0b404c099bc5989371b5caa9f1bd84ccac2df563b50d2622cf6378ad23050a46dba31dfc37705b1af830cc06e4e1c35b0689c2330b11cdb4a7f314671e127b4eeb213084c4cf2d080207284face814bcb3342b4c7f737c783d99b4d1de0dae423fbbb902a83aa228a6044fe1eda70f8cbd729dde55bd0c27f63111305e58d06336efba00c73f9acc6501fd8170a5ebc28da836b8b7900f46976b1006e85e179615195ac9e76ebc680773973bf8d7ab838cdb2903b4a2fc6747eaac188c9f4643357d13ef3af587843e87696f653093fbd75be7074d44484456fc34dd0424298887df3904e69716123fe0a1b6754c44c5cf898805f075c158ae4d9d9f304e347b59f18b46f02ba6a9badaed753950a1423f46e3fbe88cf53f1989c90f8a3047d04c6611fc1606109e6e2a7c030dbfe9f958faa5d6422f32c14f84d069c6bfb24ca00083210484281f30e118d8796f689dfff28b6b1aa4702dc997fd450a720b4285a97def7ac547d25f95b6cf955e73eedfc0bb00d4de9204f9f75c99b7aa19a014728f18bc27cc313721b7891f86aecac0c57666451f503f7a1f0710ea9d97d4a63f8e2f54c9013081f38dcca45bffaee323c05e110f8cb75de270f885667e8ae4ff596ef1bd0d38d1552e056f860b0514f44e598fb49dd77d29e018d5a433c852b646614e9982535018f20f15b78bff9197999921200085ea71932168b70c1d3f105295f8ac634bd941870838143fd1a5f701dd1aa8d9b3db9dbf9b3660790f5b49c0365fcd197eb302dc6ef96df4ea074109303bb743dfa3a04a675c89e885c3fc2bc3cbe1f00864cf81819522c8d4ac39c0253a2eba54dab4ce19a79becde33dc3b384858775b2806b5427677487a7122b8bbe526cedfb8623b649aedbb5f1894c28ff7e3b5f7199b7d5a896feff03415c490bd72fee5ae8b18381e17805a3abc9653b48e8bc42424a11eb2a938c91de413e43d78fa44b8be5584512290179766afb46352c2ca218207d9ea37411872a7d1da5d2e38ce73c1ce5490bced281a4b75f83f452057aab1f6e83fe4b7ea9f9012b36f2131d7398666dbab0459ffb3414dfd1cd5f1455d8a1d7871556bc14ec40618b007321d280e2daeebf4b84be02137b5e302c215d9241819e8ab309ee1acc3ec157469f69d2d1920516293f165999da603fe30711aaf70a2fa4ee4d0364f036083b919217bd62d8649df902d5041de840e7d6d21b9b79317edb2684c2b120628b828216b50bad15e8dd8f0baf9bc829dd0a6c546bd1b084e1f44ffa26704b7778abed2bca142aaa00f22eb80f5a6d9fad90102dcd404ce78c4a10e56106867351d08bc262d891d27eea00374c107b35729701616018c0f551c18bcb13bd77202895b4ab22de5f65fba91b4bbc96d146ae990892179a7f38e49991c90a9dcfed6cc0969a82e122b36cc985f385c8775139202880f740d770eb51257a21f1227cdf59f898a32f23f8717cbf06f20d22bb1559a316d1212ce1fc24872751ab136a90aa81eec74271376f7748a2d89b2818c8e77c3f3368f1ac584182e443a415aa3b7ccb3da28920e5d8c14ded3e8cd13d779939874314fb2b5172985a48bf931d4dd30dd291cba7bd61d8c0efa99284f773044747be1e72996a07803f31c3de372743c7ea69ef1db68481bcba2ee06407730ef5d7baf90ee26ea0ee645b707525ce9cd4def758ae204fd695e2798278969e8f749cf75d23b99fcab755ce9ccd50a2589e2140a3fb460fd1afc0b899ecc25e53e870f53cffd52ee977c7acdfafd8ab313f7d5a7e3cf5669587f56ede7f5ef7c11749cdfe699c8bd1b78e763cfdd5929cd6d95e21253afcf446d3efdfe2dff0de761a535af13f4c7799eb7ec167bf8f95aec99fc254c1d7c262cd226a6a1d7ace307695889dcc338bed2f17efed06df6f071e94f7351a4b8c77fcbfec295da9ee67f5b929bbefadf32cefd92971f7bf8e5974e6c75de40c7f3e661a5b7a7dd6cf4717eade3a799e6fa2175908eb65af0dd56694ebc1fd692fa9737c93d21f730d3ff2dc96bd6dea34a14125dab24fc3c29683196d9a2dce7107e9e2015c97208e73e075b946b694150668b5c6674fbccf67677e374b7abbb7174370ddd3d80ee5aa8742d53ccd0dd32b0bafba6bb6174b70372340f1f7f365aab56e8737f5c4ef069ee7fcb5eb39eef241d533f9acd66b814cbb1045b62747700ba5b6dd1ddb2ee5627e8ee97ee564df4f779b514df67f2b7cd6b33be25e898c9bfcf61d5c83d9ccf25f84def39f2cd46c71c7e03e90de772ecf8ef14c10fdd1f0085149230c28a9967389be5c76f9b18ff380befc491e52cac8f67362cf187f3dac872167e0ff4da5b2ee72c83b37e77e3d09d2a42c583eef09db88f9967e8b9fefd5ba56e73a51e7e065fa952c7b98913a7ff9d8ec7792709d632a4e264f2d1a16387e21c1e3fe31c86553a6fe0bc93ccc13978961f3f1315e78cfc5f12c539bb5fc375defc4cf7f1df5ace1ebcb6168bcdf28be224f3b5245962582cf623cdb5bc2a01f8b5b56ba3a3dbea0940c20afc609de2a4e1ebd1a8582dc5f871ce8ff3d6727aece0a9eda081393b3c53c74707b823d4a163c78fcefbc03ecf9b31adc43938977609fc1b9893a92dc7daee0473ee87222d69393fda5b4e77e7e82ec5e3b10f2de82fd2e60d9c7f6be9e1dfcff53d26ce7a3f579a1fe3dc2fcdde764bf2050733ba433d75a62289fdcbf3a3d11dead5dd31ba43a1a05b9c4c76fcdbdd2fba5b6828a10e15d4dd35ba43e1eea6e90e35eb06d2f461a5f771a5f87aa11d73c067c2714c5d5e5ff41ffe340fc5d2deb0e374b777a7c2eeb6d11d4ad5f87a79ac5d7bef7b9d1e7ebd65feebd5d23c73fdf14572a49ee9bcd96d95e63cc76b6b3e532edd7da3bb76eaee5677ad4477e3ac58bbcf643d972938c909e2eb81cf34c3cd9b035e9c035a519c39b93b2f8d8addedd2dda84e75778b6ad5dd291ba408210529b801a6c6942670567083274748784152ad073bb2981185b86c9af04345068ee565a1082d8ac4052801f37383a3811d2a32606080a722f1d00c36283925a0032c20bcc44009999e12258aac552f5304c14677a3013788586af115102a540e32bd6ab9515ab5b0a41cc000a894a7564154aad54a95029976140ab584f295ab6c5030abd54a48ca61fc85b57a8159a95e5e605030ac9b25d56ab55aa954abd4132594c338ea0953ca5bb2ca5bdce546e9498baae509ab85e5a9173800217b71d552cb52cbcdd28ba7dcc5a5c583a894528e5a7a59ad54364a289051a55c95b2919169186f94cdcd2b77b9614ab98bb7ac6c9cd890a19c3c91c178cac6890d99cb0d4b2583b9515a39eac6c913d9cb4d4bab644bed0d43960282854ac920e594725a49710a82a5f24979502a081b294e4e38b141b614c4eac6092736c884f41499ea07146a89cc8d07b06e38f90f999e41c963dc864ce53363937219142a6806ca0f297fb9899272948c8cb3582ef302b37298d4ca46caca651c650385e5a8146bc68188c2b209c2862095c3d848714205a93c081b6a8eac7cc6935432313633330e13e34ea8201829322c29323ee3281b28308e62dd40712209c6510e25c653329d4d8d8bdb205b52f912b994bfccd874508c8d941877f220187fb19132e34178108ca3666ea2a81ce5a81b29507e5039cc4d1495c338cc8d14270f9a71d50b1d666ca0fca0f2989b282a7f714495a4f2148c8d132a08c659364e281b8260dc09151483b29139b2f219d7412585b50488a018473914188712e3280fa20a82b109c2092736c85c1c15744388ce497741e672b3b4442ee54be456be7255cd9195a73c697594f297a3957b2ae58202991b0e60a97c9e3cf921e52aff01e52b7fe2c413294e1ed49204e32dfe03cb63bc6f9e04e1412d374f7e70f1981b270f5239cccd0fac9b167fb9f9c105e52d372a6fffc1055553373ed029ddf024949031012353398aa66565b34241a7f21b513a77777f220505182a997ee997d5cbea15e515c4cb693544cad5ab2150455ca043352a0a6ae5c444dbdc8840b76a992a65b31a82f58402623081294e2f39a2c83a8552358c8bcb0d0e1760badb454877e182451423ba94a35a55456945c48ae5a242e583f27625171559dfdc8840d782aaa2c64a8d153557d45c5103842e4a87a57bca0f0b46a7091d4af6f2e23b52aedea251322c585c6e941a0b16abeb6cd870d7d9d15bc852a828b2d50d96dec28a2e95ba61617942874596da4286650b2c3733587e80a507c5c2124512356ac8948b7873428792b1582ea2502847a1ba22502825504920d115d125d11245a9b96862b1bace868d9ba8aa92f289f197175413b2d48b164da45a6e48c95a7c4aca95ea9890a58e40e3441325d533338509979b30e54a5de9be942be53ca852539a5051543e303e338555c58635e5ae642d517ea2c852fef3f3f3937a49c14801065cc0c00930646d031854f9e9a4d8e2055160f878cd11ba18bcc6957e54353631a866a6746c0231316466b8cafbc55710681f305c85624d41d5605151e1a854336c62788b8d8b2c2686b7380d1a323168c468e9665151f9a8b0344eca552c2a2bd90c9b6e991837aaa776a5acf44eaa4515d3ed5ad180710459aa08316466c4906a49ddd878a27be13349a8669848f534a17aa1d56abd30a344caa59a618285ea9929a91ed5116a3071572d9f4962e689544faae52a9f5122d59372154d6b060a148a060dd48b1a2b883049f5b478aaa56ad9bc7e8830a959423743d34f5dcabbbda5512997192d37bcc6936e784d8ddfb849dd2401c06ff88d9b27371c00374004c1f01a21d4f80d57fa912939111348f5bc701858547e523d305ce53f7440c5a6e52dd50b962bcd24f1f3e3c5cd0c2997ca6b521e000780d7d8d4f80d5702000f80dff09a00b838006c6ed4d8b09248b954ac221aa65a4df99111a1f2b9e12a18981b36ac1a9b29415efc88a0537549cca091e12a672151c386ab9c55848a86cf38eb02ed8386ab669288f9916133c3c60c4f798d1a33fcc58c1a335c522e352e1ec34c122e2e3349c8a099e1e231b8c430c34665c5c5c56dd470a9e1e2345c5c96a8719a1a9751e3e231b8b8b8b8d2cf8b17425e8811e3c609aa0b316c6a9ae85adca5d5b500214b75caf58275844c85c58aca0aeb653533a3aa918ac108999a2cba94cba45433def9cccd8cc370971b282ffc859a23330ec375987118373abcf017b0aa8b551415170d5329790d123a2e542e53ddf8aaa5a54546e6a6a6892ec653ce62bd78bf60012163b9a0687961a39ab149b52440a66750b2f1d4728b898989f18e89116396627cc65336318e7a3184860311a44addd41ca9e1343ca986d3b879e244ca9fd0f01a2a1b35800882a1e135a448f5b4b4c4f096192f9c565556344f32336c5e1ce54152ab2a3160b8cdaacaaa8ad5538c1b31e53a9242c36bb84c4d159d0d8fc16ddc407122a986db7028346e6a544ec36170181c4a8d9b1ad54dcd11189c862b81e106c669d4701b6ee3a65538a9191a29522e9a29345034aca57b92b19e80e9baae0a0d142924743450a87c6a788b930aa7c55bad1b9aa7174e2a2c5d0c193264b058ac97171aef1729954d0c7fb1014296a289e1303162c0d8f01a36366e5455543832deea6caa28cdc85e8899b94139dda0a2a45c59b09e5c62fc29d575366ca45e38c138bd708271a261b9128c93ec8593520ceb89f5c4c28285250aebe989f5f49245a744f34465089d12cdd393154f7253cad5b2b2c245cbaa4aaa27256b5955595591ea51f9d34a0b590b965bcad522a65c2dfe72934a71a17b71d50bca29e56a414549b95a544f50a8705a9ac64d0d171d2ae543c35535ba99140e8d1a2b3a2518a7971b17168bd57529185f5549f5bcf8138cab822053ea9e56ac276664a81f744a304e43c01401c3c48bb36090807192b5a05e6c686c6aae90394247c36bb4283d49b95a6c584fa8705a5850c85aaaa45c2d4a344f55642d4ed3e23458a4664451b1689e642dfe927225d50d2bd5e262caa783b8b0f1d44a01400b2a97172b2a1c94bf60b162050b965e11411343cd91181c064f8ae106869b24954c8bac268b6e55c48b151122e8504a2b2284bc487122b364326238ca5555d0f0cc92d570d40c9f715511dac70c47ada2dcc4b0a1f1948d8bac860d130be53468ac6868d1d2d2ade2a2715a5cb58a225bc962d8a8b468970c1b26968ce64665a55d2d6ec3468a0a4befb438027e8812644365a5860d134b46e3468545bb5a52321a362a2c1ad6e2335a5cb584ce69a1b15902069761b384132b08068f61a3b2a2c269711b36aaa786b5784d14ba96172fbcf042ca46a96553d34497f296ee85af3a182f58a917426054479899918291814c8d1537a47433326f979a2bbace6b82d02975b295ebec509af9110373d3374a3fbdca5263847e6142e593ba51523da13cc681085aa150fe24c6656e92665cc6656e80086a79a1228b711914a47a5aa6099927562d3a10e22b1b189b9a26ba952ba15e54a897169756bd54f142e52508aa172aaa272aaa1a2b949a0aa5a662b54a1149f51451ad5435553aa59922c8a06e3c29d5d3472997135417a4ccc4b812eb9552b5a86648b9521e2448ca85e2021459cd169d8bab7c6a5a7cc6810892916979b969b991b90122684585cec5553136342aaf294107734344e5e22e2f2e3639a2a45c2e4e5e5e5a5c88a46edc6a4ae02a77c911c505081726b71491544f9154cf8bb35a27e52c5f394c6a060459b264c992254b962c59b264c992254b962c59b264c992254b962c59b264c992254b962c59b264c95283a5064b0d961a2c35586ab0d460a9c15283a5064b0d9629d448e1ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57aea464ba83a46ab2e8da1b488d27994a0a9929323559743546800185cc130c992718324f30649e60c0f0179997979797972799ca5336329ebc06142a1fd5d393152b4a2c2596928ca7158c27194f2a7f92f1b492f1f42453b5dcc87852e1a86e5a49c6934ce5aa1a4f2e15e8dd5958e9427381886c6b920e39331e696e32d3f120051e8820c799f18f34a762ba75ba534578e81a45d3f116290e04c8eb8bb35c7b71168ab6890aac94b8fc20e3d0810071f0622114b0e330207ef3de167eaa071d8cba09904424243b9209f90f6f0a692b032f742b0338ba9581026400886e61c0896e612008ddc240147c66e0700224d5e0091d93b073757ead46439fb96bc71fbf0ca7152d98a379b69506dd3d05cd98f30c1f531bb844062970419025435d2e592ba28c344a879bb05af02fe9a1bde51f3d47435920a5421141c9d731980203519c60c6769ce5397bc193b93ceb81e2d9ac698eb93e2529f8f77e581f5f9bbbdb059dbb9382b4f6f569dd2d45d31c9f89da8044d182ee3ec2ffb5ee1ef2917f09a4b9bb59801fcf9ae6d8dd50847496bb5f3ae9ee15a820054947dd38ae24641329cb8f745f0ceb24f248b814c95b2221b9f65e2148ea83f887ee7cd18a42997c10947de9e491d4278d84705f04cef0cb9b7125e2618ac544b1d4797abf3c82c979933048499b74c39348f819cf2233cfa1dce7909bbe08bf6d1eddaf38a3dce7d01da9e2b15cda2328e8ee23123822c411d1667f796cb4b77664a8bb7147604760f098bde1fc85af97c919ce590e8cc546b0e9681e1599375ca5b3599de01268679e43444653f44f77460868727ee83ddd15e9a0fbfe58e26ac132fceb953ace8ab52420b5d922fd041551904237127cbabb8aaea8cbe96ea26e224688e80f78808812322a28620391367339f228d951a2a364049b469049f83014b931a3cbe109492b8726bafb06e63986f33bd0dd1ce8ee0d7477121940a2bb8fb840771751810974b704ba3b02dd0d81ee26c201dddd002116d0dd4e4174770210d0dd07e86e03747794ee06a2ebee1f3a1ca8800395fe3ebf4f6b16e870d040f8d856692c368494efeb262280ee88a068cf56690627395aa116221aa26f7876ff08e7df5ee81eea8ec8157ae619e2ebe5e09a64089124370821e94790c9d72652ee3e930531b5c20d48ddbd841c6f6e8a7fff08bf8c474792b7cda3fb5424ff87e4a62fca5644c24fb315ca8f84739f43fd2258146543220e43a22327e350c6b3080ee713019d1899456e7812793c6f47b547f222496f924d0a71560c6afab0122509e9d0cc73289c4f04e38c67910fadd051f8617d1297485f7e7904891c4126b99656881c2f1171669bf4609d25c644cf4433382b117e11ac49f2238574a85d2d43b74d77cfee845edd8daf3841db5d8aa03f10b4811c9c5f14837cf02472bb1fce2792aad3e503385c725c9678b66a2fce737d9cff6891dcc3b412dfc03a6f900b11942c41d07a6d163e2e03a08a41051c572e93e3cf30f572bf34b3556a4380ee6682d42f463857a7e7d286d42df6d78736e312876e25484df4e8ce86a7eefed0d670e2bea835608312e1572a86b67a0b6c28e27d5f8a53492c167ec5197d688b3e1e1a25ebee1bdd4dba0392a2bb5fa4d168057242eaee1bdd3c7407a40b7cbd5c8eb450867ea1bb1d48c6335ba537e74b271fcec0674205a06de86e2c74b70eddfde0829c236a859211420f4e76743706ba8aeeae75e7638b1f6217b502ba7b49773e3eba430bce3eb495022df051e2eb7d9e36ca346bceffcdb41c2c5af0fb6a8b3eff705ce4bcb85ac6621f8eabbee8d5c4c70ee48787748c61e9b096b5bfb11fc44690eb8fb949de6c74962b69b118cef5ab25472b64ab14279975b1b18b813122a2bf3cf6f298177dfe0b562bd463073d9c7477cf661e1645eb3f5de86e519cb412e74831b4e3bcb94988284e218cff86a16c56c66220bd5fdf3623b190f06b127cbd9cd90836c562d58ea30567185f1a8fee7cbae8ee4ae74d08897777d26c049b7c2280c35ada205bab44f87a1fdaaae3ede0f17460b410f6f4e61cf062d8083629c9819c46fe6f52502e5391e6b2e746773f13cd9389de0f67788ae29ce139bb8179d266b74c715d68b0bb77e88ec7b8c3dbf1766062b59732d5cfd1c1f3037e0f5ad8a3074f0f08fe0e2c77c979711d8f1923424c9c9c17e7364f2243847477f8387bafa5d9fb3d788ee61f52263a1ba585ee36d2dd0e267dcbf4ce1c4cda6b41db9d8e24740fe1ebc1789862b1588cec8ee70acdc3e43697a1d11272049988d7d6ee93654854ab444c767c246128ab36280716e11ef7451d4fd8fe6eb3a38a204eeb3853afd376a7187e584b9b71dc27ad93739cd5bc2570d2aee7c4cf93863f8ed4737fcbfe7d8ec121ee65f0ef6d9a4662b11dbce217fd6939519c1fd29a1d720fcf22ee611c7fe5b22bfc265af317c5b81f626d52123ade3f12cab60813858f24dba22e07095d0e0aba65f03c1df795363ec673064de0c004384419dde5d0d0dd7966b2bcd70ae1ebdd6a9913d4dd3abac3d173a7e3791332ce62311c8bcd66f845dabc5fc592a9d2cfe15f8a3f9ce5c761b5b4590e9ce139bb9f31b5fdcdf573a5b3679a2fe6321567bed6c812f837a1f0473a452191ce21464221929c37a9fed24c7a7c3f1cf2a1057f28df6732cad528cd85f331929a24d7470a3f93e3e72c7b09a9618aee9e859fe948c51916cb59fb7036824d339c1fe339cb617d9c230323d824d35d8edadd2edde5b8bd3c96f1873d9b7db6d525eb6e8f85b5744c8d0831493224ac8f24d2212fd2664df2228de6fb4c95682897c951c8b537b0ce47926dad5308576aa3d76806d922e10cb245e1d3e80531ad4492bdf818d6ddb65629b6b54a673850dd60136c049b7240dae4c10386393fcf337fc7f3087d786a3f3a7476c06820000d3e0690850150a1f1f5404cc79c1c10d33116c3b1585377336881736ee0e75ca6779239a3053d5a79cbd4e6f9fae3f922e93ec2bf6fb3d19bbdfed3fe96229d357f268aebd73ef4298394eef6d1d55221b932c85669285a22b9fbe5917c2df9e2277d266a12921f6319696d91284ea1fbe1b5b1d80e532c36824df7c36b84efd3f091705291126ca39866b134824126445d011946d0c930018fb91132dcba3ba6bb1fd0dd36cd804e86546e7ad8bce5b411e7639f484a99d7996d15fad1227db54549462c275e5451024a11303ca4acb40800bba930cb0a4d30d1dd46ba6f60ea6e5b7737acc6d7a337773641c0f573d3bbad7e6d0d1ce7df8c7b25c48a013174afa4c0d0bd32808dee55945ee17a453b1b1bdd54c4393c3c1edce9b163d27c787678683e3ce0cff7983a66cfe401be0eadc623dcf109431e3c660e98717973ba54a85222bfedceec4080f82d41d5e3b896ec0c530f07fb139c99bfb08b8627feba1fd6c7aedc2fcd72b4d9ccc318ffb555ea313c55381c31d1071f09fea1f0c33b414c876443bc6a69a5fed78e4dbe70fe6d961fc7628fe4de37fbcf6b163f0d74997b5fedfd21ff5ba6f73e93156252a73faed25a5867cd3a584b5b6b79deca890beb63cf9ff36c2be9a24833f6bf934ce27f717ebc74e7783f4f9c1f194142c4bde99eadd2d182953aa6f74ed071a5e1334dec619de187d38a21cdfa33cd9b3fcec33b711567c3f02b9d99661d4f1ce819db1b9e36fbf551fc6b6f989c1553fcf56db4e9168b33e3397a36effd65ab94e6afbfb6f637244b7f1aa6a493feb9363d3fa637cf382a7e1b7aa68eebfc519cf7c7bf91a3bd354be2bfd782d7de4b471f3f53ea4fcb33a4619da0870f96a1bd6416c27dd1b7c3f7a345fa5e38bc165789dcc31786c34a49eb55e65ec6539c36788d665bdd564bef2f71efe9cdf799be3ac691a987753e58ade7c44a36bd63ea5f8a9309d326dfb7837f991f7b2e9c7fc569dd56afd11b38df6bd6bfef818a93665a2985e5c45cbf74f2b85af0da3c45d1826eb3d7721c2d48f3e379f3582c1623b1c7dcfbb014c16a410f871fb497f42c96f86f1321434642b118cefdd2ace26c5d9a89e2e37668f27d68c1d8b743a617779fc93ece5fe2ac368a3d9c7f9b306b2b1d3f13b5796e8a7fa7576bb163997be153912467b534149fd65e1ee24ae4496c9592e414ef33191de582c2cf94466ff61ed96890b54933cf21252fd2a64827932cdba232634b24ccb64866abf4966d51589300e94e060bba6d6cf83c3392add25c27d38b8fc46dfd709967c633f16b9d377096dff6b9ad52519c6048f4d78246c8f112096b6969b9342a22c2c3148bcdb20de79268c999e750b514537cffa8a77490ee64ac6c96402bd23c779fe91fff25fd696eb3e3f0bf76b7d7ddb0995777d79044774d37ea4677e7ba8b8184aff7607d8c7f16d65f02276df6f4e64a6fe01c619f67c639f89968a623bd64f8373c4524dcbce12dd325374ff2918449c2fc48f76b19db22199743e1e36c588574f7adbb560260606062c2cf998eef3bf8df9260606062727d2621dd3d76d77ae9ee86818189f1606060627072300ce7fa4c8f411bc22a9d638ea59e87411be6e4c43099f3cdd504efe0a3cdb81482818189216a9a466a91a669c41b69c6efb55cd2fc15d6f79ce8d916b957ad674c9bbe36cdb13e699dfc5fbab474f2d7732ded387d2c475ae9e87f4bf2f0c759e4deffad7958a7db2a7d3dc6f8699e13ab451a2df66a1d2f815674d17355e61ef97882983aa6b7248f0949322a722f27568bbfcfa7e3c7a5bf3e9b3d77e7cdd5823ef30c438a6dd58ad3bfcff15f9b317ee15acd7e386ff65ba638c73f5ad031bd65cf65907b1fd2f7168bb3b404f0effb1c8a3b10d08f99e790bf42a2fb2165b2f7c85f403f62b19af8483f467a4322a71107e27f6d46f22773d9dddd0747e2fe2225470bdafa7d9f1097c1bde9757acdfead66fd45729c4d8f2713cde0fcd067c6b9b45eb35e8931759c692d5d9cd9664c6fc68f249769484b27b44850ae4f415a0b4c54cc7d0e37b0628b6e3025f74b3748c223e90ddfe086a9db222a4e404513154636b8820d7e60831f6c80a3063fa84112fdc24fe62a759c1b9e19bb8be2bc28da9c28ce12972e5ba53e44e4167cda23e11accd0400b1a4c41830574340069208029a0304514dd14790a1fdd1d0b3fd3bb8436e4b0eff3d757330a895e5f0c87f391d0861ce6e1b8704867b95fca21164bfa3c630bcadcfb7076841ce68934d7d233f8b5da5f3b9f96a9cdde8773bff4e138ce8f24cea4902809dff0bcd95a259a4112ddb2194421e75fc71327fb7a063fddddd5680636646045d6c94008191c75b7f75d2bf451212f83ae693178e2c31830b1ddf292f67e0fb38b41d71e08abb63a9eb79082b4449aa2c514263cf0493c4ea0dc2fe53e871d3d2550ee73f801be920f2d3825487ea429acee4cc7ef6ea0ee60200539ffe61887e764b45f0203ef054778010f5e00a5bb8b74f7829d17d8f072f799709e89e2ea987a2c66e98cc42eff70905c469fc72638ab13fcbcd6f4217d485e83bbe0032e60e2029aeef66e0982385a896d766b91e496788e1c397278b95fc2e2948205528452e820050e52e048e112c594766fd2bf7989536fc7611e8e6bc7619fd0e77f7184bcef43dc2345318116459a4314330a02446114050fa01f2ec387b3e332fa1c06f4c365f07e691a1192eb333d50d20ff095603cf30c1facb6627ce715128b25e1592ec91b9e44807eca1fe02b69a2c3d3844787fbf82977088962c00229e8f07860b656299e9ee7510f0f1e2246b1d8083209897e4a201608008a2e40c144db8ae937fba5993fbf653a7338a12800142c2f27e279eb567081157c2be854004537e1c1cb0c4e7f65b1cc6f0b4b9ae7c49ce75f9b63aa022515d0a4604a7b1f8ebf4222d78799e6ad0c7d7ca238853e9f29205310830d508043c109a8b4177ef8d6da68d4eb7d266b33e25e4ea4518c2d2eed7d5b9d612e2dbd6438ffbabc9c780227f0044aba13b89af0f0da81078f9c377b9d482770e94c1084b9011330e96ec2c3abca4c50a32b81164af081121c35e1c1435a5a0f73f796aff557e893da2a9df36d580219dd135dbc727dd9134378a2896ec2432e27ee09274f0cddd2bacdfe844b47822190c0e945737da6fbb9ac7304699ea3cde5ac4424c831822034e1c187885e3bf060ad874f92f6868e272e9c37d9087e18013882179c80a2bb090faf1d78f0aa25cb69f3eb7527ce5d5b694e8460278e747792ee9ae8a2bb9bf0e0af57487d071ebcbf653abd89294ddcbaefd76a250d9ce41238459f989cb7fb47ee55ea3836749bbdf7a8cbf1c4754de8b417d6d2d61eec4460a569f87d2e0222ba1bf6b713c1ad13810d0f27fc5bbe64d3d7097aa6aefab7a4105869af0b41115ef8f92ff92585008810b8badb56692e6d6ee2dc569f2f3c71e15f1054e912537fb0520c8227ee040199ab73746b9340f0d3384010c3c3983a10502c068473488ea727fd00faf1a3c9060101e1b87e8c2013208c3f1c4126f966a3bf84474709f4a3c9062d815b02870f6cd1dd9ecdb4dc1c3f87793833d707ed98e7cdf5b5897d7a7e240f5cc10331f080093cf0b587fd7398177e8869cdde5b16459b9b8478a0a5bb8dba5342054a7ca0bb9174a744527b38cc8946849878aecefbb66a45b7354f245d07a2e8eea5ee3a70d48199f672d388e7c0e7800438d003075edded619cb54832751bd6e997fe2ddf69fbebb85cc21b78b28119dafba5994571bec2a77e6ded487749c8ba24621a7082068aa081260dccba9bd65d06b6908125ba0c0c61200b18c88201243030d4218105891c20d1346fe02d49ffcfd589837db6e35f9887ff6b0ef3fe6bf563308f4747f8799dee4fab599779ecfb1ce6b976987c7eadbf3cacffe1e0789ecb5f2e1e269f38414ae6b28b225de25ed37beccbf8c3cf61b65aa7d72c3941231efb3e87794b985ecf53a4b376cb75de30fd7293b495b6bedbec64e9af6ffc4c67ffb5efc31fa6fe3fc43322c4645e5bb3d1bfcf647177c4138e78c0113d7447cc60c40d8c804167846884d819f1d3dd5e8e1f2dce9113f1c4e572645b7338a6625993791fced1d657f8bf34f3df32917bd371a6df678bbc9c284e9aef24af7d911c699f0d8f9fdfaacc0bff25ce3afd67686804d01d4d0dddd1fce88e86487734df1d0d10ddd124a03b9a0b74370d1931dd5dce16dde9c474a763d39dce8eee748874a793d49d4ed89d4eed4ea7ec4e2701dd0dc3a51584a65b4164e856101edd0ae2a35b416ea099e95a3008740b76816ec19ce8168c05dd82d1a05bb01f740b664577bf9061b560d492d05d0d0addd5b2d09ded4577b69aee6c347467f3bab3f5746723eace5680ee6c6477360374678b4077b60d74378c1a3166c84ce94ea607ddc918a13b992974279385ee6666ba9b114077333b5c6ab81475e7b2a43b9726ddb92875e76280ee9e91d131745068ba83e2dd41c9e90e4a50775066dd41c9bd10f3a25b62c8e028a23b1c20e80ec70abac32183ee70e8a03b1c45e80e4713bac3b1457738b0d09dabd59d4b86ee5c3574e7eae9ee00bc8eb80145835a32033504454357012c3e3b9e0e2c5b7b5d30250a143059daf4bf4b48d0a925bcc75604bd29e32f739d77dadc496b45ff5b5e0213e3fd9d7866ec5e2d9e4360623c9ce9385a70e2ee1c6f607d5aadb93829f824f699434d1c5437ea08d50325e309449840107cbddcf4360be946bd504c80c227497a338e8d78e27ea09474a39274a392ba5148dd2824dda823dd49207712b8a18eba514644243083046c1041029f69163ef84ac26721210249ddcde33942d19213441575a38c2ca148777f20071c504444ba1bc785afc7c394035eccc374034ac8102a8850372aa81b65032a4837ca866e14901388a8820a8eee540fba9b76e7430ddd33948a88203c3a2262ba43a42a24fc8ccb796b12f2801f07b8c0c3feb623643ad222f7998ca0f8c0ea4a33fe3c4525f6c8e650b48fb31487fd71f9efa43e1d3fd37d243f4237040ae6105fb7c7dc26fca0218e3c36c4cc10309d1055b4e7400e6423c4043c66f3e4280428049210443a0655504de8ee0274c7805b7763808bee4ee1588053771ff5f08369474a0d44828cbc8dee9c66e0240327269c92e8d96df6caf158f83978f672fac1897accf3f4f02b9d8d6013d8a4801b2840050a804037cecce51ef39b57eae1237951a439e0be28fcd00ae107c112490100e820aa80140412dd473f3c9090a6e7a5397ef896361d67eb52b5783e12f7c02773f93e692fe9373f3c30be01a748fef51f1e48481efe871e8e1b9c36e4fd9265aa14cf3cc39abde14924e34bcb4b7ac61f8ad6854737e2453c1cc3980677ef46feedfb6b6b19c7e58fc539c4bd8f4747f97df54972de70e3ace093f8f3f732b6a23fcdbd3ab660c5798d7e38b15892ebf32773f8efe7ff5acd8e98d679037f9c37e3b7d55b7ea617a908c2f2cd4645c720cd988aa2ec47cd3e934f9c1b9e4462b1a4bf2e072969b34f23ee654c45ff80927e7cb74c716338ff56fba3c5b854aa59582ead5b9b675b9b6c907bb04a5d893d1231c581d5662f6f49d8bdfbaf5b26f221b947739c996768b3631c989ca3cbddc35fb34e4e232f9bcd9e4b529c3895ba1c27b9374474a75882748a6259fb7116814f2211d9241cfe834f22813629533c546d91bdaf43b545a2388552aa9627b82c8c13e332b4453c3c19d2e389cf9319ba27359e74dd93171fb2f880c507297493d67106e0f21cc71980e7aecd33ac73f4d7003c465a7f0dc0c5395e5b5deeb15bb6d517fd85bdc90e9d0f2ff041091cd78cc1720f53f4f0811ebe8702746efad9bce5b4b30729d37dfcb63b6f423d502cced2c9fbd37aa0740ab99fee6600020ad0f444dbfb3dbc18ce176f367a1d674af31abde125dd1d768733d2a4444747017872e39d8e4b4b99fe1ee14a00ee783c9e0e18ecc50962187edb246724c6b9b41fdafcb889d6fe923351a44bb3a53bc7bf21b54aee8be214cab3e69f144492a111642234824cc81164929b84cc5bcae62d65484224bde1231cdd281a06d08d9aa11b25032a0037dd281b9477372a3f11d1dda8ac031a0562a77085049ed0dd292638008223195150e1d3dd281b22b08311110bc08014dd8d12020a02c0b92d3f44d0dda922426c6082103884b84277ab663c804a142c5084143fe86e172328c0052a08312e04e96e14165580c0932e2c70854f77af8ef85e2e70cb819212ba1b15041a0f0d786880132474f78c56de6638f7392051792aba4ca3bbc789cb2518adbcc1de16d24bcbc11ecebf52809c9ce00cf715c5630876e9ec783b30f09944718e182500d6bd423eafa8008cf60e097f076c029b60e4187ef9a593193986e414dd29199ddd427fd9da3bfbc2cf4fab96e2b7859fb33a3c3c3a70134948d4f4619db216124dba85c4936e21e1822102a0a1bb468f96114974cb881574cb882d74eb889f6e1db1a45b4718a05b472cd1ad236ad0ad2390d02d2456dd4202480b95ee2eeaae12e17ea6b15928d21b18ebee2b74b715beeeae42776f41852c524c010a2c5248a161a270450b283c218b8c6791230f7bb52fd24a1b66eaaf794b995f3bc4fb91669146717dec13d36b71f7ebdb7089ebd7c7f606fa2d2d01dcc3b8ccf34e929c3972607a27ee83dcc3ffb8fc340f2dbd4fe6b7391d72ef04ddd29406674b52ba1fcfbf60a548e18b42b82f5212825212da85284ea1a669c4c359519c8eafcde01c02fb4bfa749b7974847e9fc433c8e3d191fb25fc3947f30f07e7e572d56c0dbee3eb8162ff12db1b4e9ce1f43a43f16f9fa738aff59ffe17f49ac593e6b52423e17ff85f648b6a46b934c24fafcd4448d916655b64abf62ec1d922d626354d23b9524bfe4893b038654dd3c8f5ae1dc1a6197e263ae6184f32a4e1db3c5671b6e6f0d516855f6d14295b8b043791603c45a1fb471d0002173271243ed317216d5206c26bc147626b35f4ee904eb226019f7ab47708c659519419006ca2bb030fd08d5f243daca51de2e5e62de72d27ad05b422bac15adeecaf8ca9e8301a01be4fc4f67e0f9832d1d0e7fdb0d239fe457501b03087d0f4750e81f3cafd92ab554674f77737677c4dbacfe81bfa6ae8f618387b792cd3f0ef2fcda47b852c1909494232b351fcd846f1ce2c14ed0dffbde5d933d94b929366b11c6778cec407eb04e72de7bce52cc0131d3e7277de79037d7643b1495168253d21a98a6e07f2c35d407ef852129974441211dd9d73b4269ee7ed4044c4258624aff7739e64cecd484840a2028707242390a474583f4fc74e8494e44d1ffe0ea4191a5f2f074916244f7e6ded76a356d002d4946e140c5a8062c21125babbc78e03f9bd2598a3478f9f1e3e3d7a7af0e8b1a3878e1e3c3d767ae8f4e8f1f3f3e3f3d3f3c3e367c78f8e1f9e9f9d1f9d9f1e3e3f3e3e3e3d3e3c7c76f8e8f0e1f1d9f1d1f1e9d1f3d3e3d3d3d3c3a367478f8e1e9e9e9d1e9d9e1e3c7e78f8f0e8e1c183c70e1e3a78f0f0d8e1a1c3a3c78e9f1d3e3b7a76f0d8b163878e1d3c3b7676e8ece8a1e347878f8e1e1d3c74ecd0a143078f8e1d1d3a3a7af0fcf0f8f0f4f0f0e0d9c1a383878767874787a7c7cecf8ecf4ecf0e8f9d1d3b3a767876767674767ae8fce8f8e8f4e8f0d0d9a1a343874767474747a749075f6f2c6b4e1e6b4d768879b9625c501c8afbe0fe8a79c5f8e0eeeedda81774a35cd08d92a205473e8f1df9f11da17124868b23257c9fc7625edfe7b15c7bd13de6c371cfb5175d1f1020406cf0d83a620114fec28163a91b15450b8e10103be27134a31dd31763b834126484a5dbf38c886044a5654405c77ffcf01d9787c08888d104962abd37ec3627dd56111374783bb06b69b31bf544378a04dda81174a39ce84635d18d1241372a042826ba514b74a33ed08df240a75e6815752f4445a89049f2c3d7c3b3fb2448f38fb74cefc414d33c719df68273741f5fd31c67f01f8ed334c719729cb844faa0e7b893af082d22a43dfcd79fb420f64a9196e62f59ca41097cbddccdf573c839e280324289160e557466f3e87f88876d262915c9717e9f936349b3bd2c927bd8074e0deec373780dfe5f9bb91c889334cff28b3e70489a5da038c11910f7fc624e8effb5d5465f1997f7fb3ef772347fe19034bb1c9613ef14e958cb0bcbd5deda27cef1564b6d24cd3ef1749bfdfb3ebfd4da1b92661767992f65baf1cfe534fa3215cb51e6435c727da45c1f690689740e690981b5869a682fdb6a448809a6def4155b2ccadcfbeef7f9a44c1e7e8e9ce3cc38c99be608d271d65c8871a61337b3b5342f97296cfaf86a3d4ff7300f1d3c78f4d8ea387b6d8ebfefd6891fb4381bd69acd0989ee934fcbd3f6d7662372a4116412ce201baae84ea14065554354426c7862448809ecc8881093a34e3549c9c07382aa2b7eb4d0dd4052747bb64a458addab34764311511112d91227406277db84b99b04f4536452254840ab46ea6e1a00f101c80e4088e0eb01b9917f58691e1d3fa4c032193f9a3c4c5a3aef5009a25041075a3ea0c0d7cb8f6162aa0d69b539af327cbd6a299eb5620888d1f65858e992bfee93251296253dd8e302b3a5f9b89cd6cf067e10f013f4e3a35a3aeb7eb0fb013d5574e38903670d56ad55d2bd8271e9965540b72c11ddb24fba650dd0c343f7ac2748776391cefce1ecbfd6ea7975db5aeda1e96e2e7854e96e9cfba5297d7fe95adcac56b33c9418a2310fb2310f26dd3c82748b870e0f1b3cba776069eda8a263b0c36907d9dde12c5b11b776ecb02388db1ccea0ee08c02a9d37fbb04e1bcb0be2929cd95ce92c646ae9e0c1085678b0687c33c0f20006268f38824d7374203fbcd2f188222a4549a05a8afa21876eedbc5a666fc0b6c807b7365446e9d0d249d2d201a27b0896a3856d3aaee5751f490ee44d7384b5728478de87b3f5fb76bc06c7f7cb30ec2d71ecf9f1cd4689589b1486a251f88f4bd22dc6aff0f17dd2272a047dcb14f738b2f4b0be671c250a042d1c1944886e7812193f13e56eae425e046b928e022a868ba6424b778bddaae188c6d7fb41ab8619bab13829d08f1c8d4a8e27398e109bcd8a8c8890900851321372830c895112d26c1623e7df62f7eff730abb636e5a46e4aba6109fc9b50cb3545a32ca0441425f03152c71317dad107bdd966cfb3e91dd0f87362bd93e8435b1434f4f4265db0d2588c369657c8002d1ab680af776d9ef733cd8f479009067afdb87688284e21710ac5623121b54a62b1586c36ab1f86f436a3e49c911803c56240201569e51149ca6c522cf6795e7006c7d3e72d653fe62d2710bd96e267a2b64cfb6a67599cb7af81af64049b840c8595e600f4037c25403f9a6c502c167e93a5c5623b3c4c40a238854690492ca6c3143a19c3b1acb3d90c00dd9eac75838aee6eda84dd700a6fb8926aac78ad9a245a3506a8d1698ac39466451a49c5189e5a31301143932d6ac5e0dde5a522499618062add4dda2a7d91de70de8281886e2fcc89d46d110c3aba1b674cdef0bccd3c876c68c0c692960d195a3650354ad0aa0101ef470b96af5036711e49738d26ad1a2fde676f383ac9d77f8da4f97b7dffb5d9e7ff3559582dad698e348aa041a43d9186437385cf346f38d34563a6bb5dde9a21446bc6ab4563a5dbcb4ddccd53e6fd2d6db4e698dae80d9717d31a9187139622e8f20f698b06081a970c26b46410d1ede1ef739b3f5ca991cfe9e755ebcf54fff30fc9b8757b3e0baba5857426a3fb568ca7ee568c293192e8c6319ababb637cdddd8a11a4a7675b63d868aff33e4ed2b2d2f9734344deb241e324dcd716936e0fc7abdba2d525a1d535757f339b3d146dee64b46060a1056302dda4bde1fd5bbe658db4378491d37a618bd60b447c17fbfd5cfb71b473ccf36d936cbd60c28b09b45e0099c9c20c0d5a334ab4f7394c1c4126e41cfdfb62df0cfa1c664488096ecd1c69cda45a3241e816c2e2d75cda9c4abda3b1c48fa425c3d49299a1499bb1b76254d08a31d282e9a2bbbd2f37c10f673311ef78cdcaec25fd7ec6b3761f674597793770922d98215a30b60523a3c5ba81f7cd9ae6e8cd3c87bed887fb6a2d929c98294845b2e93dcccdd17a3f96b939e6ea247a5cce59ae0f74c3f3c622e251ecb3c57235abf35a2f5696ac1b1162f242052e5b2fa4e775ebe5a7db2bbdca5a2e5c74b727ceb2d2960b159727badb730f6750cba588f65a2e479f8f5a2e3ebc996718cea0902816039f29160b339e91387c5cce6c958644b4d5e2e4b55a7eba3d3c5b2b2bad5594ee6b5746dd52b5e0042d556da9845aaa1fad54155aa9285a29215a295b771b79ecf3e6587aecfb1c16f37e69e66ae917ce2752349b315972d634c7263fa82a3c23424c5a2824da6ba1722d14916ea16c7477abb178ada6a269ab9368f50d479dd1adbf25b55ac7039ae1be76214b39817eb44662b1249cad5d104017607061055c58e2420f1768d8c210b6b0812d14d9828fe77df9f1cc717e69e658ecf39a75f9ce88f3e1ecd0befc4846dfb4452e27fabe1ccd9fe6fd4869f3f678de4890d6498660164b5ba5373c8988e214ea824a77914417647769eb42a75ba6052ced69e1093c714d5a08a20556e3bee6d6e62c54690fe3fcb5a3cb737566c1a99be61947f5e159f8dabbd679b260c3561916a8f05162a1086fe6898520dddd5c60692f3771397fb92de2a202dddd8e694e34020a898080ac505a6188156aa8c21555e841158aa882d01657b658628b6f8b1ddd8d615e7d11d69475d0a11a89e2f41a1cc965f47ddf8b626ae4deb7f33df5e9f8bebe9ae43e156eb26091858a2c4b645940169e2ca82934d1ddfef23c8455ebaf29c0d04d8185250b2c1dc0526241c222430a5348816c519c428e4bf1c8615f6d9127e4619d3a780dae83cbc8cb62f9e264a2a5933c497a5f1427f8a2ad52ec134614059c2b5a90c2951d5c51c0951d575c5a3c418b14681184163ca0d08413402104506802851c4fa8c21336f0841c9ea093c553164264f143163956b0b0f2012b479aece0af5838dd6341430e83c1609ea3069abf4645c799fa7c8d9f690cf67967c7634639440ef370906c5674197d2ecff76b96067f715a12f4fc43ba654bf357be8f2b7d613cc9d22facda240ef33e1ca4cf6651a4619d2e7f659a6dc534f6657bc3398ecb611ee8985e4be4de776d06e710fce15224fd95bf23ef9b7d3b0e9b353a1de847fd1bee5a207ffdc0e264fabfb5d1de9acd4e70eaf63a2704f170aea54cf3f6344c4727c068c294eef630b6622eed2b97b4263475dbdc84236bafac094c9002c7e54cc04c703297b3382b1de2e18c2f753c71484cc0624ab78783ff6b58101184c551db985c86858d2baa748bf30a267039dd15df153addf476458ce7d6667bc3cd705f456b69b158d2ffadcd705f81927ed48c8a58215a018315309620457b6389f1748779e02d2d9e4d429640c35395a70f3c1d29610b4a5842094028c148093624210a49b040126c4042164860a26570f732be14e3b88fafe37c79b3cb9f898af34bdb7cd1f3c4792cce9aeb85e7cd45717ea2386775be682d0cc9f3c0fcfec26f9bf7992c8dfc4b9636f70a7f5eda0be7fb927e2ec74cf77fa9ce3c6f79f6226dba7769ae8f848c0422ed2519192111f21ea4f97d5c7a15b12a60388215421c61c711504658811142232031c25011b82802108ae043117a8a1053a5065d95045439eaf6c6a021b7d52daed48d1ce6fefaf0f4dcc4e1a56b71fe7d612dc5997139544332c37d9d551b8b5523c7363bccddfb667582b3cf61ee31245ee94d35274e98f7485e9295de272dcdf482b9a48da5edce218779d77edf0bc7fd3c225c410425ba5b487744981141c61074300426dafb1c539cefc1eaf2d7e3acf834c7d7faffadbd971349c7f93eafd2ff3be49b431032841a4360092105ddedc9208ef9e6791e2b6d6e003d7a787f5bf26ceb37f9be1d7e9c48182f81b60888e958bf077b6bb3ff5af87f6b54083edd3d3b65d3874038164bfad16483f06cb241a23841f09504010620d400084e8030801f50f984bc46e4fffac227ba8179067d7fcbb34e7f25b997f1588297822e8a73c9e8f31f90dd9d43773f18800fb6e8f6727fcb2f1f34f1c1101f783ec041c50a54a6f0705c78ce62b124afe15be2300f2768c8bf1a39ccc3451ce6e1ecb88c1ce6cdb2b548a8740f72d083263a93e5cd38aac5e1ef97a85893783de87800041ea080071f0f583b58c10e9c76a0a3d34117edcd66feb48f56e259f813c7b393e3289c9ff1f7f9e31207c3ea144912574b739d380fbdb4b95c93bde4e7192c6d2efc6babbd4d1aacc4a5cd798dc8ebf4c2ffeb8db96ac3f231e9e1eba0880e5a399022073507357000051c740007374f0847c865f43d9e41b1d82473348ae92dc9e51e7827a635a2997ff4e9f2eff358aef33ddbfa39cccbe4834d9fabd3488d8293268af6be686fb8d1e6e9617d241cd8e8f646ea1847a4e2a8d4cf4a17aa20069d42432232020000431100303824188cc74352d1883c2b15f10114800373c466944a9c09a3288929658c31c40000000000320030100d03083041da68374a093e03ff96a46b81d7bd73fe99cd6ffb092af5c3851221a5a3aea38ddc2ffb7b62e9adfa0b677dfe192b72fe10bf7cdf646a31cb1d540d1397be6574ca8685d297bbc3f09f33c3d3fd07c51d79dbd51be6125ef466c2706315a42344c758a11e6f8f6da49b8e0114106d764b53544211e2549e7e7932751dcdb15d9c593ef4c44e02109652e941cb09937c8c45dbc6bafd1710eaf26db9626d01930060034f9e4e7bbf87660f38f482a3afb9ea247ad456ef40282f805f30339b7543f68cbac9966349e09962c6f8795bda15e62291fb62ec8b42436ba725c592be1cb9472c654fa80e9e727611e693e9a317fa60999ee0fbe2870884dbf36eb6e4925dbc12adb99d50c2d6505f71acbde361b2e053eabc18c0de63a39dc70d7ab9067f4edb3ee2d2c5c89b5738ff441ee1668528ab59d31c75ce0430ef849e9f9ed4758efb573c7eda2ecb79b76a19f340c2b8a1270887aaf66f0845f10209cc625059525efc0d2bd3b9971eb2b21bb2e35fd6bc89490189cf5cf9accf929b89c1e2131336d3bba93a297684bc20b002154f093fcbbc5b02961c3f5669a79a86b31c6fb0abbf60e1425ec9b0b19b1a375adcca405672c61685dc629bc14b39f1716520164b3e95dbc7ab76d645f8cee2e04802824dc67f93fe56831614d86fe8910c762facc19d65e8940362d4832561941d6bb9c95f822fa58be2fbd3a4c53a6b3f21358bff8a60d6301613ff2718e2aec415be75efd49f235884a077e0feeb487097483c8cbcbe9a99849b2327a48526ca225b5e2fd6a90fe91d6f74f74ab7522ba55c5c191f119704ba8e3f8cc8286003f5039582819df56b321afcc32d3840e2d320adeba20b31fbd6f02ccb36d8fbdec91b5bc1b26f07d686844a4d8366a121426acb60886cab5cb0b72c7891a85a7473272694571b2d7f5609ef2d6523fd6b561b5ca21705a14b49a2a052d81824b69268fdd20c7b7344a4fe2e4a42e80a2dfc2a0a03cf4b50d0d07844b55859b53e0e6d4cf056ba9607554d101f9d04f5508ea6bc119c91fe41939e828de3ac0db9a167bf361e412f4dce219b1c0058143b7f4ab077d449f90cab332bb7b4eb1555ad42d4da13700f0a96e647ea6455f0aa32de61a29a51b91319323293a80778f026670baa2f95cee53c3e5bb55c01a62c927af7e50d882fd49b3ceaf4b790b3a459809326ff500af0c4283530fdeca370b10bcb9cf38316f7ec777649e39c38642825d1c889c4489204905d6d76ee82fb6f1b2db1904658a1bdff84c80e016065776aaaed91f1c67b726872e87fa0274a8301d0d5eae5953d77b0afe4b3470eac0f2146b3041102ba1bccf4a92d6f19a955475a8b4821eb0dd3488a24a94d476abc36ef62b78584a71f21baa1e40d521736249e29986e3e8a6902641168a8beaaeada4900bc9095160e41500ad8c61bf61632d33a111e676f4afe12de33547ad3624c6306cb96da0a031158baf378afe10107fe4ec4b755d409dfac744a7fd964823ee1e32422c5401d30b3a7630868c23e7c49197b024d55e8ff9f1417a62ab43485c308438e6c8f5a24dee612bb17f9fd29f66c5da2f9776fa4b42a2b261597877c6985997adc7e3120f94e24e7df1497ce25ce53e39b99d8411b3b61519fb76533edc82dbd209b122dcf539683027118d20882ffa4aced917ab1c4bff8529edd841381a13cbc80bfeea734b26a880217d81cf8b17974060944930b46a5cde31f98b502c58923b95d98e3cf33b027fd767d9cb9de920ca17d205b29e3dde36d7217175a79befa79a6e0760672da142556af74b53496ae0265f6f6d8f585503625f40c75ffaf0766cc84eeda17c8e49d545d886e8815dca61e12e85c67fb24c21e50525c29634fa055f0f3eea0d711e9d77fd69f5ae4054146d97eabbb3f8cb30a7d8047a7d89b78cf46e21c2174dfbecbacdb3b719df24da44207d0a19d0637e2ca3816c72371720cc6112bbc0d88bf26d06fa65354707a6efe1af916a92605c3bef4fc81a024506aecbbbf3f0298c4d0d2ff97ff924846d467ea8d0a7c730574a2b3cb8fa8000350acac4f823d00f1940110313ffd499d311c3ac186b0673ef238b210d8fd60e4398b97914ec1fb5edd968ee8c0bec72681c131bc5ae79724dcbc94cb17c9645f474e03ded3de10df64e167a2180658092058079336b921809ec705963584ab62ac8179798f8f65439193986e63cf6abda02beb32bab93ce2dd14be662ee606074d257b6ca27d368e51e60f6ec89a921305514259c6e72ffc08695d37d83bd87451fdcfe07824e5e7371bbedf2183ca6c4a5970d988c6b586e9b0278131cebff8f1c90517e621de45b58b060df4f33fd05c94f8ba964b541105e91e3a93bdd756542d669335c03c128bbc3dbed8ab88d81a3c6a21d3391ab0cb5cf8b0eaae20f24365b3d233408129dc8230efce8979847f32c18ba746eb61cfc40d63c0e6ee26975ed3b6219ff30388ec5007cc68c32b26c4f13e0161b07aa3bd1c0ef1890b0de2a95096085043f670d7593cd809c9a5d8c0ad9efb614ddf2bcdb3a22465245ef46d9a0278f4c7ad796377cc31a3f417750f31e072a04ffc13e1e7d75a768c6f9e6bbd3297fac847fbfbd318ebf387d79ea58dab3dcfbb98b1f51d73a83100dd00cd2df46375bd836841908252e3b9c0ab655cc7820b1c91ff3f5e6395316bca7d13c702af6b3e5d5431b6849fdd231fcf23eddead79140e0d68abbbaf8a9050c20d2c57a0705eb3db1baa43f36c97e71813f64f334b779462ec34c87c149cf736b8e0716257b0f6d61069b9fc69a42dace34f416398efe081002e9f490cfe7bfe1f6b5675467459ece9378122c90d452fc4b9c7ed45905e5209079697c962a539b0df89eefea640b4274af9fb03001b7cf596954e2cfbcff08d3334eb2bcaf0272508b9baa7f2a4ba40ea8bcf388e20f8e98e0fb2d634df5f6b5a040002dee244c97b70e4c3684cde3b9d9df6c80ad2169198f61ba7ea0dab66bce1fc34505fae8fd014605f08249b8fc04d44891f7636623a076027397be25d7ab621d92afe69813e2b3f0fe41881509dbcbcd5b213f6eadcaab7574e59b94ad073c9239cffbb74178eb9674a556371c4cce1a839842bc3f79c1e3f1ce3f49f3700d5e07f31d278385edcdb22c08b425c0096f9a93fcacd6394d109bc2eb65f441ef9efe08d569feb453ef186bdb85b9c42acbbb45c262d126b8595e3b761f0791b99dca8d4d75cc6c82f3da213b174cef009f0fc7df7d6342a574b403671db5c30fee75d8d495d42ec7dc1a19b4a3c8d70af33aaf51af9250c62fb44a9365317c1a0f337a2fe68c2893b968de7b74932476f73b01e77918806eb1f72c4c26d063507d7d2020e0bee03905ec4b43f8bd8dc92d6a6d6f3e82cd41cecc367b95d479614eeed81e744bce44c9e3a2c63c1189249843e0a3a77f976c2609a8422801794a4dc5261c896b58748c80107466c7c41f4f3334677dc5ad943f48efb1cb94dfa1cd9f8e2fcc862246521cbb0ed273378501e4d6e1e802029e715fc0b0abd0f8a6817e26d4e743049051e962bb822deaff617d715f029e26b065ccc2516f203444c8decfa06c43bd5cd7579885cbd09aec25ac8d1485b649380afac80ca4394d7bbc8a145f735bb001aa2cb543d85cf86ae4979d3868c6ad327c61e3bae595ab39e7f46eaceefaa573c28247b558009fa429c900fe952620feb2ccdcc5d974ef71b2e95aa172f5878653a2f95290bcd3712ae5b7fb3390ea2d87675514e30803bd021df3068f8e3340191945bbbe12308b055cb222a674b9091cca4aa167653325f96542f777e47963d99612703d98e8a8517709d123dd500b8ab3484d953536004f31ad0641e1e996bef815fd9f92d2cbe8952fb0b061c247755b08fb5603cf9f2ad9e705e06fbb648f59a48fe3d8bea00320b8859c59a0c5287d5574825059163d48dfc60523b33d67cb59c6a3371f744cb32497c21340dd7c0f7f88524b7c5b87f3ca1d9ff50283c0791baccd4d2ba118cff84e0c12a9e9f7839eaba44fdf7b3952fee47be735f7f07461ce08b9b02a90a830211db9518c2801ca814aebc81bb1b09cdf37b44f3e94ef684f20887c8bd48dc5dd94c003434b8725501a4583c6636028757b587632a8eddbb9588201db38963b42c2cc78ffc04eca524ca4605c27f83c9197e267070a5a8b905aae4b1274608aa5f1c2b75ba5724c44ed87136ee6313f5eafa74b5301c202117c001d9608736de73a3da2f6dc7f4a265265fd4c3e622a31b2e7564e4211f2eb454bde3bd31c7d9e305c385a2fb9ab5e22f01bc5e0ba58685038a2ec57e45b7b53cefbea6b2f25d2d69f759721c36da1c9ea61795556b3e28b087fa911212a4ef8f54f3d7710e0089290e4bfec355d157aabaa7ec0e422726c0e94513fcb508f320e2379ea43fb34af7d143df96fcc12bdc322f12ecac32e657f40e3fb074c7a67fc20a04cd50bfe7a9b917b4b430590fcc81dae47f39910ebb3bf87c1e1baf4a4b565de3505d3a48c4344ca7c9ffa36d639a178c660a1c008ae1847d974e1091655bce49e43cd92572ac9f4a049b083682161e7895c83c56ff5c77cfa0eeec4d89228701dc09db5789ca865f5817891bf97ab2951f71911bda71e26009ad8b6edda1de12ba03b34ec15a1e64864f2ffabd63837edb71223a21ba61e5a7aa102b058ce893df931357af916fa996fd0e7c0fd2fc5400e9c5c84ceac1531a3d6e7cfb470c0ebe49afe3247114dd38c9b0464c2df172cbbbb41ea0ab0ae13ebb6a704e562459d792d8d4b8cc73ffe33dcda87c48d7c10f3631b8e3b3b8de1c7cce25b9671b8e9c7e24b331ed78c5472a2ca1967660a49a9b9eeef8718a0a61352e8aaa4c072396ce6c65df16d62b598e1fc623d6e6f467b26522ebbc9d791a18146c06a110ff2b3a69d16860b960ee1a80a87a548be0486d162c4bab9ccc8d3f5e794d63c9c0542624c263c8ddfd21468251a933b0c67e937f1553b5c97c7c90348f22a4dd68b8f01e9cc763dc87755c78308108f1ea9c38fbd541e007e1e8fa15be9dde64c7b78e84f2c7fd7db79a692a36e971e97793439ad3002e2f2e20eb7f241e41cc89419c7aed5c767d39886b192379fffbe1366159bc8ef1294dc19e8dd220863ad0f4be5554e3da65d5976e4cad5227388eb7c02b23778fcfe8a57beff1065def9521e6204daf1f18ff6fe7f5fb4e61f5da35d9968140a0d8b6ce291c41fe57722960658fb042d087ba8ab0dd6f591df433c5f0fb664aed2993dcb6c5a917184cb167900f406825406da9913417b050bb24d25d577f67ad377a1f11b0495c14391a13b0fc386414de0832556e63e3b7f483ee4fa2ef1153c24636b9247fdb7b28da963463d0faf29c89f54b72ffccd2156d5a1f9acb27991dfabba298e779e7ac7ed7192e1f58b497cf8f7c38471aee857142a9c633e5b2fc4939a58f62f7dd3701c4d0298906318c9d7ad704ca7fd286f3f85c70a8e065756a822af506a50e4eb73248d1e0586c971b6f5bfde74ce61eb2ab7076fd26b444946b91624df73f0e63c588bc44c03753038a6c971a69203b2365649fc4e8083f31ecb1ff5583e8f7c3cd1067620f4df8f1ec95d3311a6679791769f25c633785cc5a41549cfb53c3150899ff436cc6cad837fd0b194fe9089c684528d332bc92e89f26ed60ddce529cd9b28560a2b2ccbf1f17f9347f8dcb3391605150575b469b89542e82ce428f44a807317959e2365fcea50db38b0fc161d9c477280e97f09f430f12dffe43bbe8c0fcd02c463c12ced91db119910cb7b5e79ea71e77f25ed1fbd02e7463be0080136c72b79d726e746d8e277b4ceefa1f60dbeaffcd3da8f179978548e2c09c79870cc1d8914be4cc0c1cb432ee7a78117ddb345b59ac9923be0e55036499a852d4922f9491b5f1454174d665a2f52bbe1006e156412f1b327961e3b1ea19f786b8dc31db6affc4c68fd0e570b6a6bdf4925ec0be4243568cb050f3f74e2ee67a2ad9ea942497699681506e79b4488d529ccc5135f9509958aec8113248707acd1dee54b3a70badb609bf41749386df16dfc2b0065be4dd9207e99256bb719611a26aded45c4e5a5df0866cada7cba31a7d08b214ea5ed804012239c0f801fdc5b66be981cdbe2b308e55995dbc808d9d621c6cbeae9a563341eb28027596e5783af5d7dd59a103999871411c32f84a25da1c88c75dd7fd3ade3b4428ae42fe6688af02c8e5d79dcfdcb7a50537c8f7d259dfdbeb78e2b789cf815743870736f92a026baa655754429361c6438c3d2362cd9d4773d8e85f8c5d4bece5be680b2c3a9e0892e9952b5c838f3c6bbf60e975997c8afce5c3587b8bff618215b7a08da46e1c1fe1bed45b54b44a3f869aee61610f4f77d9f353b484244e5f4ef133d0dd8aafc49bf4274c3cb97cdd169bcc4055f414989ee93796c36a4efd9d03690ab075d2f31668c9a1c9d53fec51693d6e578dccb23b2289c61aec9f31da51acd3b7213bcb03c954f51b778d2dbb4376eb00fa56d59e2c96a88fe88d53048106f69a3400bafcac5c5521ce78b2d884a0367047692a37feb31d10178ef9262754b0ea570fa094187bc6c294a1a10bdc6bf1db6384b261853b9b6bd1169a1d2666073b20c8e40594651523a76c371cb39d3707fd28661aa81464b47093d1ba86751ff7b296b58bc4e09bfc67662250c1af30109f0de1a9357b7e1cfeabdd8078f7e4eea13ac1b28f8e1d9c7844655f1d1d84cc08b6c89a0bbe165b2f08fd4b27475ce135d4cfbbd0e700f8fe5fe401f18650087030e11c3484d931220bf78dc386aab05dc1a123b60e8f7ce6a9c00549be68b08afc5a440a824863c43cccf1f0ec83eb664cf6b1409f7d480328968ae1bd9a8bcf4e706229efeb6185c072e0e6860aa8a13a4d6481e5dc8723bd5d7e1f0884248039850651953cc28aae4b649dc8459529c3e363f4ed4b88a3ef0740e81802348699b10f58ed774460ed6bff8306553d1187a409fef26b9c650be5cea6f754e44bf384fb941a73ad1db168a13bd0dc8be76d2ea37aa85f3e68b3c4e634be6efc400284be3b2c018279865bf7ff9e61989966f75773c251a24d5d331e92cdd00b10b491cdba57e3220f95d5ebabdf8f5146ec6a53d874aa965648889bb958b95d6564b57c92ff2ab50a0b256aab975581440ddfe80708bee8f785da569d7fced44d83e117056273bbc9e6f0134b6a11249d670c59142843c64e50115da477e29381854b39c392f525ee4a348e551b9b4fa53c73bb96cace336afbb610de27af89d952c0f1819c3cab0f56caac8f3af65210b3ab2125ee0f26aecdcd7a289658d7e110cbc0a359e57e113ca734a29db201581ce3b80c1c9a171b72c7b3cd9b247e77348e4bddf6faf59ec0b960f46f607d398759478e2cb8fe2aa60bb21a09f76ac6ed4ddd9f1a07ca159591fd7cbe33c1dcd3e5ca84c728bcf68c801a70af1b55ecdec3e69dc9428fec99231d1ae5e5cefbca173621c046eacb49047b58dc09768ae2bbed592708fc0e8051c4ff9f66dd07bcbacebaec3144d69904389c02cecc54dbaafd08022996359d09023a7fa4d1c38ef59171dfd45259ca3692e5330a739b92f444ff95621ee1c0df80a4ae5252425c7216f5cbc28beac9df21adae09311c4e8d6f63684fc40815a47d7445480d896eac1082e5640ca0ef11f489a60910925a637a5a2bbf1b9943922ad95304b4af322c854c4f95c11884cb61a4b86f74ccd203899ad14aae83b388fa7d8fdeb391c754f90a1b9eadff186ef235dd4b74ec9c4677543f2560e39de21ab2cecf8062c7942b815dc08f6e3f3c51f94c4eb3839552e1bf0ce4d1f21870d120387681d96d83f86ddf3d2cce6d7646a59ffc962a243e87e52ae6d664982db1ab300e138a8e3a217720e87f963e318895b362359944c6c31e8348d318c67e18bdd2f7b56b8771a33d32fe08fbfc5635fc0eee5c27f091667ab5fc44873799ff681e8b63e97247c23cdc2a5938125534582bd9ea727186229ef2d7118637859969553b617fb08d7af9143b963e10d6b24b054cb8584585671df2669ee9f1ce9384036121589ce0f1791103aad4b5c1c4eb4cbd40ae9abc667720790a5d963dc02d215a788f2ec4d1e4a4cec789d18f19fc6b6397036c5e7e7ff26df79e2872a61b949157dc9fa0efb4f638d05d1211470fc4474f26e278954d789135cebbdb18d4fe5d324b6f19deee4b2b8cb9d5afc94095570de11069d9c1c11add0d8529e53ebd5b98a5103079c9d006e4fd83be1309ba2b81b98c492acfa6366798187d9c852f5a91b62b551b35014c439eed8e2af9efcea0d94a28d43556960829b803959f3eb24f0bb2ae84d5d519f174667de45953b036fd78f398786b8d27ced588a3817939d5ce89f698999937c1d2d1fec8fb286106696cb30efecf0364b37e4db865bb7f6fdd6d4695a6f6d4a7d17b5594b1729a92cb314f5fd2d18a51fc3cf75801bc6a3121a0105373c4bc521b1dfc8741ae98a912aaa29d10da2c00d798a62fcb70e750046d336d25c4d8fefe3258c28236a720490d7653f57e915f7b57824e91d68e704164bbf145d094c1d50e5f3d87740614d7c2dfce1945f2309a07362b322c786296a8e771b480e8f63b4db4c28a26ed80a2c5e6fd65583e0dce024dca01b1f0f2f69f10ed79344d1b38c157f14f4f0b46a58a28f641a0f9c90d85f6e2cf31ebbcf6a69c46b440c0123a6bc6e986036dfcdfb80917f114ff4117a0ea4566a8fc6536706d00b58ee7f1bfd67c7cab0e38707e31075b215b444ea5ef06a030ccd94ca7749957252d6333d0e57f8208504c6699d4dca7020515251306958613422b0a79b92bb21ba0464948ed61258078f47fecd8d53ee752c0dc32c5f2fdd82583b808566dc868021533926476b9eb586b8c92463ab89c0bb6d29abb7e62f17b4449f81e7d4e0d0d986e34097eda9c061d9a2085c401c99098974cf3186908949faa86eed875c50a21154909574f070005ab189afa63a133e3acf76ff6df33024c955e2bd0cf57bf6917522055acd63ff9341f496b3a08f2439fbb630e48d4551ff3c6997acb1fa03f97a591841dfdf9175c9afbe7bb6d45d056847e7ad2152dd9d33681e63a30cb2a5c11b4547d2716bfe0686774c98e16c68300f5efa0ea9c21f87ad5c962eab9af33051fa34f5637d3ec0b0fda6980a6f588714caba9b9d823424b616310e8980876a893b080dd51094b949f77834e7b1bff857bc1eefa810da6010dee320771567d10ed4a0dc2524ff86ff29abd0502eb9c5009355e9cc7fb8aceffd61af6f375a5ed23228d1c89b45539b03600f6300f6e6be7e8d3f9826816865e7defaee34117eae2bf83efba4ceeb30c8c97e5e110e3cf59470301b9605930125c29bd7ec4748e47dfd2a8eeffd9072a89e8fd179b7f2b529090745d0cb8f63c08d07000e226693a4f9c0e007046e3120d2ce907fbaa17b12a5fb8dff918e08733873cff228023903b2586ab918091ea14f0a0314b7110f40193dfb76523a83c0465680f2958e83f82b074f12988420855db32b33f453234a1e84181976040db9d0f5891c91e0093e6b89b0de63716e33dd44dd3e5d7ec50af3d4921d03b18cc8a57615580ada50e247d6d3af8c8c448d755f965053c668e9260e9fc05353a6170cd379f20744c830641df996a44ffedeb291320fba18cdbed303c839f0ee972bc286afe6f027cc5483804f0e280277c7774cc808365df81e35d13159dca9c8e8c6ce9eb2563cb28c6db1c52cd57cbc6393f00d83fdbaafcb2ae81ceae03979d944d19b6950ef3dabc15122160011881786d4d5696b84aab87de03d3a077a700c0ab3d6bfe88e70f11517311c3335b36c98f42213c0f6f405359da5deda851c5f9887ede45bb8067a0e2add937bce11bb71e90e7ff7eba7c6f2db318fe9dc357c5f957d41e8983842067a868c608dcb392e609d9a92e7015a5f78e6e10cdd5c5bac10c59631ec3bfcb9e48d71a816bac6b4f807ed2c09c9bf905e60e7c8d88d9a31b028b59c380b43c7856a049cf67c8f57661abc14e2ee0ac9e45d79154bcd71f6c6c00577cf47cd0e3ef92cd38a7ada3c5a9e7d6b431a648756df6d4301a2a3e32a11b84af59ca6e1039b1ece6e132c16264c62164003b39d087948e22ae9f06caf66a6985bfe2268a54777fcacf3bf5e2aadf2fa26ed481cba424904d50ca2201ac593dfb46310cde0913bffedd08f84edf72c07d8ad7c938a8805e5c28d377f77355b816a0d9cfa6c6c696adc79222a222a126ac78a3f540ed7bd9a89438ec11232b63493166ef7537a8fbf5f5d46ad005482ec095e6fa624c7c592d83ed2e71207a0698c33ebb720dbfa11e99d6f666f980c315b4acdbe1c3087e643c9c7b032597ec742e03bcae87d18646baaa32337666f52728da52e9931e2699cbacd0e2a92beb7d2687e4789c58f1d891223ef9bb60e64c72a33fcc8322e8417255c19ec342760513953c3e9c72eddcda53fd8afca5448e9f231b8a64fe7be3c953bb9c3c4e1b8049bd9bafdb028bed9cff031b7f2c897448dbdf83d0b9a041ece3b26ee19413921e8ca1863f1f421bb4c30c68232f3513f367315b28a79be69d41316c004728efaaae16820795cfb7005061dfd41ccca2eea97cd96712d2627e0a8432c307b8fb5c0ceb7f64292fb819a7fd040b2d91b578508d91d49bf37f5fd4975f8b2764afeaa28c90d27ccc941176e728dfb7f9cf7fbad51e9aed73fd776a47287c5358939f817be036220ad66704dc60a45bb7ee160757bb1520ca593df36c489a6095bc1f6064f78530d1003696967dc6638e38a294188a28705dab032c179399f228ce1b61614b0a61ce9dd2ad29b9492e38517ff1c473e997e4efdf2288d8f565046a6451b3e55deb7fe7ef67233ac7ce094c74719beba8adfe25a53506b1252678e67a1fde5f87740a48f8c0c6098f8c73057e40b8b49751adc5ae81fb196d8aa6dccb97af4d612b9c7dfba3d68ecae610241d661ad592b35fbacdd31ee3fbdc0ea4f48899074d9af98444f5af67e9e5b897da57303d9e4ab94578ab3e7acf7cc42000c036b66c0b153f08bb279c7c42316e1f35d5cddcbd6f4eaddab800f9e734784997f357aff817522d821a65c7b71a443f50fbbc4e0057d66c10bed2acec1fb81b7350f4121d71a4ccfec8ad3e829ac27c07632b1f36ca0b21a4b76637cc708cbc67c279fd33c4688a199bf4cfa1f23a983771bf250e35c8d62aa97d5157af20d1f0497d746cbaa160302497a39e0641d29330d573df7dcd48c25621dc06fd9586d56080dba442b9a26811a7438a36ad904b6efe010b3540b1ca52ec20cc1cb06cf665759e159e9001a0f48062941023ab81267eb79fd6944ebd34f9a585b106ed70973d908cd37dcd748233dbe258d86ed3719adf0682a68609307b1595b8c53f1c6697c4f8371627c1e5c16dfcb84ddb4bbc97ea77c9c62a7b88600534688bc12183a6315b38709bff3fc03fda32a422b51e496fe866dae58a24e6956d2a0a25d53b4bba4d122854fc55ad8c390bcda3ece1cac4069ebf1c70f27789eae3af062d0c118c87937230067acf8008d1225871c1dd676682aaed64cdf9584aa74e067ca513a90283e926087d7c088cf9c2819d2212c9dd65d1f1cfa7004782d0d4859313a26c540b1251e5a00cbc4140e820c3a0433dd0250f25c54ba2f4bb3c9c91fd229d27ad74e0c04815a6d2533cffb7795e4d652c8455dc243d7e5515a8b036bf560be518fd7f44780ae0b1f87e2704ff04a0e963ec6f3ebfb216cfa5d4172c70f3918799583b13c1d5fe301109cfe8e5f9ea2a5d851d3eb655fff8573e719e0f851c9b22d89e7c4088704b0ff429ccd8e4ac1dc7fd5e903d5cf0a6807b9e56de79d18ca38c3898ffbbae5c45b6683e78928f574bd6136451678b498913637587de1af73c58124b147a92786ea5835d3c55f7f70ee2ea38c34ecb6bedce0553338af01705c2a1484e0d790149c65e0070cfd1464ff1e871ac398479e6cb48fb7ccf129ddbe1fe0d899cedf1c93686403785737d6baaf0bf401205c2634f6d02428331977eed5eda4f87fdc84c9b94a97f12dce7ee0c28137eab9e134f2fe22e5935e20147e041e035290ac59eef6b6c364f9635f7b64d197c2a427c0084375373c509990c9baba33876616fec01b93fcd10621f05b517ddda7ea8b9919d7e2110934e38b5122c90d57aaa2ac74cf2f9c63a47d09f672d4c7f939feb8680554d67dab8b678a41af3ee021bb154fa97eaff135ea11b2aba05f351d56f0b695c6a5d124b72e085f304d11c203394a9bbfb5c6c0ca8ef23412b1a22b658d7c855cd07cc6ce8882a2d8e09df806f5b9a22af38260ad9f787b9151353b4dc611260fb018f29268b53932e709b85032c37a4532f18c30174a32c0bd9a658b8d29ec6752052cb453e610df084ba7ce54c4a0b891ee93537a09d9d32233b7f156647d929be942a105b2635133c424cdcc910eedbdcf5fbf28504bc645e0c23be4ebbd4a8358a95578778e2beb4a4176bff452d002d3a079035e4808b7943071b7e24e6f734ccca7571d6c9b932d48ea795a917f423332de95bf37f308150865edf16c88b558033117dad43ff696405937e187ca2ed60d4f3491b4b63ce0e930a9c46152f838d9f5c35fc58900d656ac7c5e044ab1ebba2552203bcdfde3e89f1a364b4593883f736108cee74854446c721e11e8777c2ea5efa2b326abba0405b060e23cff3763b3c5e178fb02dbeb23fce9d6e1b4c5fe4971aead524780905ec1ac06e2a771a7b4c8494178ad9bd88b8a7a32c78142b5165e7701d5c855566404f5fe4c9ede238d735319aa5ee83610c47e459ce0773f8bdeeb34b733419ec182b9f8164315af4f5e67ba6c34737ff714d6fdbc2b142f908c475d218ed546bc8ca0265de0e7c752bebea247f69a2e7a6a5563ce92c27db05d0e86ec0642a3531d733b3f80ef2582e8249eccf44aa768d0aad618ec993333245422c61445283da01c81413991d0e58ce707ff4b46678703a3a624380d1df040111c4b2d9e05cf617976dd2ba8fd9ea32587689680d282310ee0a866cc90dcc8ecdb95a1bd4125b3509c026c268617b4f3ce67eb53eb90e8c1435330c9eee78eb98ad5734fa3afc5574fd7498270b33a0b0a05358f714000181617a8e37673f3e91cd5f1172b8c2535085286470f02fa7a1630e6203c92626bc6893d93130e75d1df643029d65cd7202fedb86f1c9f9db0d7b75c6c4cf7d8ad7d94a3b5999e1c7c72b5db60f39708c48db56e32b526dfdebef9a177ace24a33b826aab389cb82dff4c951b4cf60f092cf1e9fac6b28577ef258c0e96f3de85272977eb758a06cb32433c1c964ee0771bf1eaeb303a86369819a2c040df9ae29c5502d336601f5ec07d8d4f1c9324dd1479c75e7220997d60c0ef19fdc65c2c239caffe17ebab13033490d94a231c2a2248b6134417e78a1d4ee3e05fa461ecc6f488263f5e4d72b34e3b063e3e7c3d5de31c2f6b372db84b3a62ee11eccf096d4fa8ddd111fe31e861360ca4436614731131dbaada358ba27c298411439334044db2f19c6e6fddfa3716ba79967aae473003e6856463bbdba275d1dea5eb8d825e5bf91341e33c709edaca770812fac4db4667ac045d39d0cf6933cc61ab4414dde51ab84f8dc97a6bdf78c3be0b8d7d5c21d357990bc10bcca9ed53258fc14fef3bf1c1f423bc53697cd5397f9a2dd6e8de661716b0f42590ddbee78e6bd532e4ba80c09b2a3fdaf2948c16fa71e07af5b90410e0162b92f0f24fc33b695b9aca49a4fc5a076849f33989167ccc8d397c76a72460a3bc0fa4b289d586160dd9f59866ca2cae58f04408bb1124484aec25692eba2681f4cac9c743b54e62e8203f0464526c682f7580b0214e7e3ab9a281d52a2fe14f77f1a2262ff0d12e3ac354fae4eabea6f44617efca6c7e6dcf8fd9421feca2379fc5b7479b46e8f447f1f91895930b6bde8a065ddc4f65d05f15cc821cb33cd7d1e9af1864fc197f3be5fc80e4d1d15fc44aba7a8b8300b9ba0b79c9aa208318d590b2710d4af6d71a292f8b6175e50f95c7351de015214fb1dbfcdc8237bf5a9e0618319b83c11e63556ca9132142c51549f4830f622f0c199d9483d2b9ff8641a877c931ff327a3d957fc4f85c4362c53c8a8fe42834534daac256952a3c6e431339075e37a0169599208ddafd65abe587b43a914f236d5c12c1bed82651a2a56dc35f06e8a97722810aeba26ad05fe32f3e42e9cfd0bfc28e28c6078a7a6dab0b5d6fbc6e1b924e231e6ca7407fa1969ea19b2520e6d65d0ae915ca01c131dbc252b3bb9f9ff89a3f7518786d7104650203208b1f04eacaf3777b843a8dd5cce3740b68f462f5f06478ae11f7662d4120e592404f601898490d7c15ac8a0bc27e1784ef6e24b8f9d01a58d3e4a0d470d53b37284868ab0790f4948e34c98f3ee0a466fa52e6b79fec00f0e42a3937541d086370f18c31fa21d7a9da3101026c5c57cf211f8665217c5649f2e2578434643c7230195a725d1a69f819cd76f11e6b871603efe15dcebea524b229a4c50eabea8478fa31c939f6b75b2bac0e408298427db3b0949350276018d27f32ee8d73f411386fdbb0f9da87ba7d0944bbdde6203161e789599d7b5ff63d7e582bc3415e8463c2435913d73896e6119696761212168c090e9f84dee69c9487ce3e47c3322be04169626ea481716d682f3c185ceec7049910c9c68923015e02c3055206a20c579de308eb6ced489869d32f60690d968c56c4f46da2cefa38ccc409385b55ade8424f506a3ea17841d40ae023c68f37dd028c83be7fb63625a1ff987b4c33889fa189bd6dc71a886f79fa03a8e6015d78f7988b0713f297dc4e8cde4e5eca0875aefd35427f84d129906ac43a072974e2633219109c49aa94bc1d9b1a7f4d07f4273558b473ba75fbcff9f2f283b36a22e979628896f4c8bfa1dac2d0ab03efa9d73a3629f224166d28e680483401673e3834523d205441d84bcb6302c5e14d3c87c631455a4f465fe7f70b0d8fdb4f20de9cb16005b252176e6be1ba953ba189d69bd8524473827ec685b266873336da91983140440331555b1f22fda638d4aef0186a337ff99111c68bb2fa940856fe2204ced75184b465f76b756479cb657ba1230ff908dc21a03297d6911fdf47e0bae07a834cc7f349f507227d2b7064e8403764c7552274d876161151ea7dc99d37e50da29608c64625b3a386ae41a99a13a582da8d57be8f307ca2e0b754fe42dce0795800d1c7fdadff3196710584a310702dc9631e07777461b34f0b8d713a2b9d0c0586e9784fee16e087866a3f6a0a00d78f600e81825c2f562ae5d8cf70cadae5df08fe95ee73e08a9369f47806bb7d1224b516a57f90230588a648812635604b7bdfb49733a9bee79439982380031ea493e24656be70f53cb1a88535f598316ae3eec7f155710d04db6cf34433eeb9c8f86334f525082d4216a8d22c20b78bdb7259c9225fdc07dc93b5587d6c7954e603b2b0eb48037bde1208dd582d75db12e618404a50967265dc3f400629cfce1d89d2f4c6a8658e6fbf21aa2fc0bb520c0d963de05581c9a1425f29017c8ccd70654e91fd8f2c4a6f66ce0d0632c09b2edfe9f185c2cd93a36743b95538991ae66bb5336d065515c24490604363fb22800f408563ffead4c721c21117810709976aee1dab02e7a38734193afe632c4054a4474446714f5ec8021063ed8f6cd019dd1f60155ac4c8638bc9d9ea86982222f83b45e5db49a748fbaef97a3284b647b9018eef20606e21668df5c3cdc5cd5ffde0c77761f79296b85d3db4d4d609d79020bf82884abdcb53391a065189aee3caefe17516ccc679315bc632de47426c9bd51c6649bd82b230cf9bc1dc595081171a3526ffde5c0c702a9c870a85b414a841e93d855ce9f0e29acb063b51c3bfc19e4115afc6b59d34aa0f5061c22c4511b5668363f058419a80115a03f7a6eb248b3c0062d58426a0c2aa6410177fa114252e1d01b6e18662399f9f99fd408761ef4ced9e77b39fd99b6b211af2a10665f23d437dc067039f8cb94d3e5e6c39bdd8ed43e3ca7ed6f9f49525e962a3f920cfb5be764a566f3092c3db5ec6f0c36cb5f387666602bdeaa3e39e645e1e2ae11766cc1abd310ae7586276b0bfe54e96fdfca0b9f30dd202f53f85d5f845249584d5b61e68241ea03869c125308f6efef5d38a59a41bb2ff3d2ed00ee9e3e3cb76ab186e91b90bb3e1d3033a64ceb0be1e66aec19fab46e7e83f203a787615fdb4234574530477127b042054e28b41b3581d00ed36c0e3a6eacba511ad09c1ec04fd4048b117db90667bdce40634322cb2a23cad03a880d89f0348293b3ac5a68ea83603c29731c381eb091a7abb157b1e4e99affb373464640db7639f26d2cc1fa3c1017b75c199858e62445c3d61ced192a254587d0d56e0cd962042a754d8106f60f3a0178a9a1f7e5c0440c3d56e01b561f9a0df8085bd4ecf9e40fd24ee2c3b0373d5f884d3ff343ea493fe0090f191986f68523f2f5c6d67cf2f07af7ee3e15557bd9bfa5d42d4dd77e2b2718a42441fd9dc29b3372199574f5ce3cc3b4e1dcc0ff72700560cf6c2b04f9c8ec36573aa391900bdde4d6fc9e556ea56b528181d003d1fc1f9e97fe4798431c1457360ac1299bbfd7e620867e878732683a8611e640fbd0e46da357ac5f48a26dfb0d6e75bcc1a06859dd8f07fbf0cfa0568256be80a0f77a7f2cf17d3b86137c5b6e7d69182eb4685e2e29949a4c8fa7536571df2872afa6c76162e8e1a006340dd01ce068473efcef402ed68d04a0f300ad1ff1f95e65e08714452628e43b3ee81c15e49cf60a018e46aa488fdd12c3034caf19a2d56f62046dfe53afe130508631bb88a063050cec1aa1d072edf9b2a5ffadc4a1846a85b8551c1460dd977e93557265cf06ce34ff8ab6e787af38760139b7f0bb0e1f617a1e0752e32dbd9e67dc0afca151c1cc9977f66aa4999dbdea936bb567b59aaf7dfb101b913a8a1fbbb119f5f6ba218b61ab1b39f79c56b896fc2e58495208dbdee6029b21efab3b328c828cba7fed6fca4b23b18fda8e7b23d39255a926efcb38b15ef41f32928e5c901690bcf5aa5d582a6f981100891001782659ee23f60914bfb6b0e6c13e9478afbdd526ecad1ccd4fd15806e630d98869af16cc4eaf8b3303ed76782b2b147828822a820740f3bbeaa9dcb401492ca53c262636396f66fd48e868bd3012a22716ebb4abd39fb395d2c7e4861f14bcad170a59094ec4efffdc211514003543f7a53294162c5fdaed5edaf7725a1422e704f21f9929907155fd4640f2547398a3980a3d3e58f7e3a528c227217ea78e84244b39bd8b8166097ea28540a9e18ca94b15e5ebe8ae677cb4258b9ed40ee2940ec48bfca6399f17981fb44c5207be2f88dd42c8cf0ffd0391114a0c285b14b57cca2f4c1c270bf52eca32650fcda89dc7f9a0be787b8ce37a34fb04ec9e54e4ba700bc28e389dd12d8a4755aa3663e3de7577f80a29984fbac19bcef9f2cf9f27a732481ca5a2ef9c8c2b0075039bd8f49df55636122803dad5a6fe2d1db4d59cabb1e858865acabfd6cc7023f312bd68844213bd16eeeb017e8d6f9f6e5a9277e0e74406afffee33f7d6455aa992c43430eaba8ffdd94032679b7d78b987c44ac4a9c1265c06b0f7d7afd2d58693dba62a340ff348afed4cabd456ea98879723c0044a80de991f4e15a1454d90244f375eb177a62a6cc39f83d9ff3f75d58796a6cb1f8ac1cd1044cbf2d2e05f87058a3e1fde48930edaf0b917c414dadfc328717768bae5f93fc7d8fcbde292e8778423dc77f736f847600e6e218369a5b2257c6aae20ce1ca78837a39d4260a87bc5e6fa2aa40b0227ceb134ae55a198b4a850032f08ab56684162b92f959022444b4dc672498c5dcae34d13fa8985e0c4609009452cf79071871ae5287b3e9bf35f5021879f24b3b91a48190507ab90b816f6412dc66b06409901cb9d4dc3229b92e03b8a4e0cd670eecac765f2220788673f1367614eb8cc741d163e3c9539a5af14c39ba7e141a44c1062eec8fd35f1bf9a316b9e9efd1b8a97855d5cb997e81a8461dcc6c53dd1608a1355642f49805ef8b2c3492ada6914c508632262f2b15d5e3ecb2c1fdb6ae6a35398d3c694e656c64fe4412ba251b58bafa6388946eb12344d3841e1beb2588001f9e498e140f1e91c7619e46735369f0b370cc039332191345caa3c649df8801aa406aa270a93f322c3376317c8af9fdb19c4f7c6169675b6bc4714542a1e1d9510a1a0a57441bb2b489c7f588f3c11632ad99975abc22dfee04af09b3dac8b35a6a3737fa742bbd2a50265d1fefad91ba835655e5202db32f07c472b6436e100fa61da35999c4d05da64af569d6af054731102e1688582cd8f4363ce8afd159cf6c65a31d64d2e9b6ee709672ddb851d36bd2a6dd4b4a987cf522833f474c20697ca2941ffa1910f87d2cd3c22ce238530ed6282d8f35de4a7965957ae75028e7a5b48d4ec4b02f28fe891173e92fe38c308153fa3e095529dcb200c8c501b82e81686e6589584cc6f77efadb70b698022dbacce60097173f611fe21bdd45198cdcf0a015ddc60dacff7dc3eb0d445711f37d624950672179f9f69c18e212b2a38824d15028608411fdc8f234d5f236988be92649a227d05b73f59269b492428908c4ef763ec598ff6f4194a40df260d4bc4440ea931beeba771e38cd9899587213c085006069b2448710f3b2be7c4afb1fbedf4830f7032b6a2334da825a713b4fd396f2088ed4ca3fe5f964bef65f57164557ccda7fc291f72f68f86047726c33b2e3c8deb8a698e2fd4d9713127644b8da762ede9ac084e34f69a604c4aaf614609fcdbd1074f5fcb38a859650f5b878e6a91898dd057a955f1a362ed6e105fe5d0b6b24efd3b503a47296b9944cd990f89388f4737774bccb80dbf6fa61579ddc64014bfcc5efec6d5e27035bdf40fd0ccc16d53a96e45bd16996d5585d1604a073c1c660a616f92be25cfb18c476fed3a4cf4e8bb259a976e8f53bcdd6656d27686566dc06688bed5104f7941cea53249dcb6d4bf8fb136b381e7ddcc49a152cc8aab3c6680055017b4e0fc0b38a3ff9e4ed64ad1d71cd4013bdc293fb3013c1c32d5e9123ba54fe9640bcd2a5cdc8dc1270b873eadc9b04acf9d5fd5fa88f729e37cb3c8f73b5b0df05fdadd7d82fe86142b4c8ab2ce06580b3b33fd2075cb8ab28c8e1d7e505088084101dc9c8a0053f837c2ca1255f8297e6f3d51a9d1cd8714cd5e06605ae165443c29733f0b0bf9df271845b82285edc5e1f526931971ef56e687e2565274cda45ef77337d838744fb2bb4c7be3cd8ea68054ac9f278c71a072be44c537c7892ab38d9c05147087c3282288e4749adefa36a5d422609e4845a9994ca5fbb8d52281bcfbd415ba5c29b703937ce2fb7aff3b2dc5e90827e47275d5d534b9703d43ecfffad92512f6ffa4046241958619ff950544cc9f6ac8ccbad834afbb54131dd91dc8bb07a2d1d2153a98744c4aa76490b03e8ae2d5db1cb7cb0f81f9b5474dd2daa0d273ca9a36882867b10626a6ed7405dd64cd3cd21242cf41673a8e9907d0c680601109d3cb82332c905f9255b977fa388efdf1380232b81c0722a1f1f061d31ab5e0178565dfd04adf89d032eddc129f1e94d26fb8b35b86e45c9291d04a8310593aca9008f7e6e90534a582017757045f1fc7ee2253983c492e0424169cc4bdc8499ee7a4cf91b64fc2d9e3dd0cdb906637023ec3489800c18e9c81e6329062ce704f140606c24b8a0b0cfdb834dfad539ba37a674fda333f96fdf505629071584290e69099c7b977fc285ee336f45202573f06e0d4e657db77a297b50b3daba56b6ac2bdaf2cd19d591c567825a3c6425233c24be48f58b25d363aacfa58c041b89bfbf666ccade64d7902c8f4aa714966de4db62ca49bd08178c86647e13c1647b045e1514308aba8fbd5cb26ee154e9fa6438ae93133a13bde89bfdece19ede0fa11692b015583fae52ee3cbba45120542afb7cb5807c44afd8a88585a1b09471b5000af9ff7fa35099119343853b8f76962d189fdfa22374e5be571f2b37e7e5831fdb7dfc3e93b928da20e38f91faf206b2f855fa09a8b9ade454c7d6d2b4dc617ac6dabdf6fc8683bd25c63e64b1bad7807cc3211cb2750705f8b0df6dbd499a5bdebed6f94ef22641de66324ead409769a7db924526449b4bca01fc1037bbd3b45108ec00ce8d93eb88f0033caed0fe02d80ebb21235737596c5aa589d048e8dd338456f2aad027f48bf9938a85c51338415724356b4eae2116f940b9dcc6413d053e8398df6dbcc73712fc99e2806cc82d6a1eaf42236d0f8ff5c7e1c7c7a02b12e8f1b4193b49b4c4698198a9530e90df2f705dae902a606ff37f4ec119d01570cea543765105e3d511acd1715ce4484ce0ffd61c872da639205be36683de5c36389bb3ae277058859824b03ff124f630b12ddfa1c25aa44c3f3b7c4bf060357546b2aac30d7b38c007eb8e85c7b0da545e0003fe6f0e3c0be8790dcfe1812215f4e5d599f3f0493f7df4808d210e0b13fbbf74b1e3eed8aad36d9c3913fb3f371675c8e0bccf69035b889cd954dba527f81828b37f8073357fe9aaab04e4cda72ae06e68b51e855d305b4259f996022624707524053f5b553339058b7c4600c123d3788278a3654d32128c8d4ce7011d5ce66352f742b3209b639cbb7967fff48737fa8744bc0bcb506078a0f9e744b8fe78a9a6889e9f6527689b6b91fc0c30999fa3b5e02610eba40d67165163677a74398a3f4f9b639e0c7789d32524572e06d806bfd38c8189f3805986209c9e9366aa29a73056e8cdc4f88d38196f518a56fa8dd2a755ed655748422f7cb9e1cda6bfe858ee5414140a342ce3eff57d17142936c74383cb370ec7fcdeed74d6db785855ff466f2b10faa0f0bea2a6dbcd9da1730d6ff970cb839651edc489d1df1d2ffb1531e66b5364d60cd07288c4ae9889cf4d5adaa0110af74b41b2f9bb15cc1c52e5e6407edae12594d33b8ade11713230beff17738d84d7e4d29416a4ec60d7990c93de6f718946a187203040173f64610c965bd3fd990eae30efc6c9867d3d40072b82ddd2a9ef0134bdd20beeb801036b8d61d96495ab1069ff848270052b495cc422d235c8bbebb842102105ff861ebf459c98dc9df917219edcdd9fd1cc1caf33a31def957fedc3cad5d366ac2b3079857afeedcf6be00b3daea26af5617f5411dac34fbed15674b9eba46e28f62f18508d325e62343c569acf753062291e2b43ef0b98826f652c444ccab850eb1ed4d7be0a61303fb90c9df0b4ff2148fac3fd071d81049e0042c7850f43048286ebb4e9b89c150a63b9f15f1d4c477e12bdc5e58f747d4840209d29df5a6a3250369a2dbbd97d6913f85f391f35c870b0385bf95bed0b28266c9bc0bbe75a39bf8fcbefe3419df490ec3b4db5103b59e30ec243d404785e7285bb429a478c91eed0f008fddf50e4df89ce6bc821b9aed5db0d306a32beaedbf7dacf13dc85d7a317c83c4b886183c04b5c71b19e05706df40839a39a4359fdddaa32001bb27b5a154e91644c70ec49be4df903220e4fe7e75d79fb67a3197be3e13bbd7f267e1fa70df4856b6fc03d30e96f597fa55c0f85e39a415809a158f8126df273a4c63b3a87fc66c169a9a74724a945937687d0137bb13b7f9d99996f6242aea96c9ccb66b90103c04dc9feede53c40774e715eb58a7df3d226194941770738b88e709d167fa46530ee877cf774943e290f98603e94b30a31449eb36a21131bf1c9c1316a5aef4f453cc86e77a7d912120042afb9fbe5489bb6903a72b860e86d9eb78769180e0f0a2404d3bf49f791f8e00fcb298db2679cbf84cf518784ef164bd3fb38d5ca223f8755365c46abbf29044e386b5da499a7a8d7ad76c1d2758774b25a90a2e1d1e82cccabc68017c41ecfb8b5f70a1a3949af53999855290bc84eff3400784a5721fe672e685d9ed143c46e6ccd065c4e66d0612977c0c5fdda41a7321311740a0e52485c935e41408d9ed9be029ed5dd19c5b945a81af1d8721b90c37756de26151b34c1bbe5d93dcf3c447e9a3330859094f3ca8d6967788a40d3e800d90e626126230904cce606a2b5458e94300b68a42335f14d1b52445a1484a5b6501d3ab910982405acdf79a96fd8f4d68146392e01897fda5e04ca40f7e9474e702024a7aae31c87a94651cf75a1e33198beec06653715fd84cac4ece83287681f96baacdd2aa20d2ebf7bd0685c5af1756673f974434dcac10bde6d18a8498771ffcd4fae2cfa00b6c8a1e19a67a49301dbac6e37d5c7aef8cb8bf0b74c0ad7f21233ab05c4e8a7b036b28f2f27d24476fe01c69bffb5de358f6dcf6bfa777665292b059aa06eb3607840a6ca3f8b7621de6fa1e75c028e638bd20efcb76b15081a12979f4b8481edcd548dda2e4c7dcf6b5dd38f689d73f35ab19be9100a594f4f3cb0f399730bbbc4ec1fc33e2b0a1265790b139f670d3fb25568a416efbc9babd5bd36a0e58ab6bdfdf398a1627f8bbbbf183bbabfd42f49063279df666300426cc55e30f487b26fe6cf515c0b564c8f158ffdc1732a9755078dbd15340cad3e5cb13431922172c371b27e96b6e1089b1596f9a84b6a52005591d6155fe5ee90efb9008c7ac14e57ec8ef8f6eb16e3b55dd19c27f0f26f28731c4c117a8a4826fc2abc1007291d648758293cffc4de42b1f491d52cbecfc0f2000cb8675064c6cb8e2c7d1d3d7c35711a37fde7e17f7215fe9f0f007fe30aec46002bf681276b9e10a62d38552183d7e735a8a97806d1da06152d364d0094a7b3e96a4f552487ed5038bf86ac1dd036d6c4e11dd4a1f8006fab855a768aba1b8bd8817a8aa9223414e8be40e2d8d8a57687699278649489e918df75c6d5cc1ad201ac91b3153adb48ad3b610edad20309296a67fa799f03904d332ef897c989e3a2475f1f350554967e29479d03d5fe3aa66bce28245f880e67f18036b7febe239e313025066066b64df19bbbcd4949a166d323bef37eff8b83d68c0bab9829a129a8f8b7437468a435560715de37f3bf01c61486332170aee3b528de8ee521e57827b0e1ff90412fdf9c9c9d05c863ffed8f8b92d1b0b323bb03616860ec203d6e24ea1fa8758820b1422f9122c2f0769c6cf031ec8e1de7149b0ebba5d3a141432f2a6c6a09902096af08a1deb82bb295ed295bd76857a34d0f45a8312639b04d93b9fee7cb5c915f7be24688488652d273531878fd33c3e5dc0b134c8d3c09944f6b937a0deb2477cca175a444345545ad04067a82269ea4d12fcd1fb6d938eeefbf43945308e2a43cf5ff264244a58349d7f749a35ea8db1773c7b6f608b08d80406d11f382b5054dd152a24b0356a9e04cc20665d40038c60c0d501aa2ce5c6b032bdd42dcd5a32225e180e99840a0c5ef01b15d8b3102b98ada6bc7b410587b85dff96f033a07a16cab175e8f4089118805a3892c21980353af93379db6d3aacc4c4b67f7438ba0ca4ed29d1ac08b9cbca7e496db77954bc577e5e1c9033bca9ee7767cbc03f7b39c404df340b3d08e495ede62bcb08d7b6d2047ef23364d517a0402c7611fb9d91292991f0c453bf1534bf9053d389e0dfeb41e4f33e9d7dfa881a1f157212cedf794a9cc75d00a53bc4e412caab6baa55ce2a017d400cf560971202a0744c2c90cf10a1d840844d7945022589df58380691fa784ef412c237673b411a37068ccedc6e73c43e2c38268d23587d57b3b606dbb84237e5905e0448c142b63224058b913456ba89dd9195b87adac4acd9c7c8e0735082fe9a7af53fc210ba846b29b0c043aa60c9a8311a4db1036e1c7e7666981cb1c621c37a3535037e5cd96cb7dfbe6921534d765973f83fdf742f53a2997979ed0e0967b47ea3ac3550d06b60a6238386287c3369371cb7772565d7cbe58180da901d9f10c31e3b4717c9138c7ed063470ac0d4cb922f0bf649e8f3e2e1f6dc430ea72d2181d2a030f64c07c8f9bb2874383f409c8303d83d85250e45f94421673afcc02f8888b9b24164225eb589702271c7f1ec521b9b08f16fe4967d0545dfd8c0661cdfa57ef43bffebe23a153993321eb1f931681493bc882bb5640435bcb5ba528691878d6b28842acbd75c3d365e0821b28b844d3461b85a75b402acd819c5680b200c9b388f7993e204077c165e6cb25f598b89ceb8b5ea47f7670d5cd05b1fb00a9fa123b593dc343f594d84a933376e02fc18f5578f3a3852cc16bade36250408985d7c74215e40f63b0c5c24c28edfed1b91ee48a93eb4112f1f56ad6b85f76e3b69c9ba335928807bbe5e1661f003abc3517eba6022c0413b5c56de6d2dd9bfca239cbf460ec01016849798c53b9ed47262b166a9ff3114349ee556ccd130ed563eeb8951ac5a3e4a1e8367802b04de7f50b5b472722c04d0f7e69d0ddb612ed66afc3bba5202f5121ebbce1f0ce3f99f73b52575c58f10d16ff74fb4ae82e114182b0fc5900e7597f3817a9efe12fa3b92fe18d0de36f61ab97b108fada2e675ae2f0650a62409227115316ed0044e7c6180b0962cacd219c88df34220aafe0b436e5d8b8016665740e9362dcefb842e8d77dc491024d8403fccc8d074bbf5ddbb9bff66e12158a7debea555134e62c8aa0a6bab7eb3f69cc773ac376c3c31eeab11a14b56be1050030696aa1d2bf04fccd6ec2d4fa4d84c596492335748b2c850a35020885079456210debd1676c2e78266b336897817c7b920ae5c03432735414c4b92a3137ac4be696ffe7e620bae320b15c174da55e9a6667e966124dab9b584011deac4944575cb53e856d0a812751d85b7c81cc46d683499ad039a1906108e8bba78b5b6e2ae4eb1604f0db42ef68d434ed09fb709c9214698ccfa3cb91001b5c2ec5e37f988f879cca203933c96d459a420faada3bd4224f06b486543bccc81e3ee222075781c6a1a1a638f0c05116c2ee95ac9e5042d42ab22d022744328e09760c5064784c0e5200419420aa6a2dab448bd2f0404ac1a83333b40e7e43571281b0648be52cc9479f3d43595c5e0ec91013de4b41d3fb595f56e8ab3bc54988c30fa6d13aebd8126779a159b983aee958278f9970ab2b23b7fe2f6170a4febc299b5b52e5b740ba2007bb8065cea320a3e8a62688edad78a5760fd7268246734e0f073da0c36eec71fa2952dae4ea2763533ca88be1ad8317594a0f5500dfe13c1b55b910028702366f60f4a1cb78141eac343a047a21676e284f2054a492d284a87e9010f399fffe58ef3a97612f8973fa0eccc0d3799fecce47dd427b2e8d37d01ca0617bb66fa5325dbc33eb15699066ea87fe583c2f984f8dd1f93ae7aba56e01eaa58674d9fb40030d4c5b82e0694e3d0bdde6f54180f6eb09f2d9ed9b48fee06a9f723ac0db3127dc8e5e67ce9567a5d757e93a38acb753875fff3fe0e6f22cffa12a3eba43f61fc8fd273164fea5f2453b9a7de5055aaed81ad91e131f3ab5d9698391a7861bda33416f683e3c31113352856a2d68b1e2aba71b57ebe45e02819fe73af54585beeb9a71ae39ff8a0fe43cd2f4861aaf23e5c29e00ec8a93ae703bf353ca0eb069796536368aebd9d9e9b57cd2dca69a6ce0d1c6dce87c0254543b3782a276d92a688cf700b405575d39c0858acd84f59dd1fddfee518410bdb16f2e60e526b66fd139748cf9a7b5cdea72092988538d50a3c0cc7292df80b88024b9b5843ed825800dc0947bc46553e5be93902ea1d4cacdb30b1446d18f03c66e404cc888cd0148731f7bec7825595281e12c4a25f066e1d862ce327cd0ccdb63d68daf9cf3b00accc6ed1b6eeadba5582b90f8938798cfd539fa1d6e16841f5189f78536009048521faacbe1b426a80f036645a87d23e97541ee5644fb07d89b32dc3030a485f627f39fb39b37c63bc1bbf1966321a22062e7a439d1f6065c40ac26ba43f428a77f21fdcc49c0d6e83e24afe8f7e017c81ff8fe6fac83ba8550e7335270ebbf0398c3969f20184820efd797cbd01a701de34126d93d414975db08d429a4b176edf88d0261ff646d21267ce2603dcca1460490e41f6d6299ad25b8ce7d8c3251bef301427ce82a9e282fcf5e68d3a783c07ac1da9b32c8152723468b39127bfac2fe91ac632798aa4c87ad7c0de68f168a9172fa0b04d68722ec6a20c94b70d8e57a9bda43da61a4e62b0d7bc54746e9e86f9ff68c21874afc9459fab21d5d37c62c9c744b1f4027cfe8c6c3d6d1dddbe65c2f91ed3322ea196f41d9612acfbfe12bdadbcdf16f5d17f2f71613f40142c3318a0106480f31d2dcb25a0777271bfac7d78a0fef196d30c091897f407f207103a8df7e7b8fd3150e7baf5637b816054c348d53d27cc758333cfd58c0c8558c49e69feff989d16ad33fe2f4232d0a82e30bb39940b0e2c02671c603d1f2b1ec5911bea9bf96115bf99ae9594f9eb9a54796bed4a6920e34c6aafb393d0f22d33fbe577e659311e7ff8db73af4cf63bf07e1173b96ef1122e328ab7963dea8272e077bd876d67841ed0114d5b130a9728b2354d90c90e014e747d244c0efd6d56b353029418c9acc40d9246528647daabf1ba98f348488dee79ae0f1edae8d765e0722f0214447a2abbff4c07303ece5100a1e5efb8311eead9f5ab42d4fcde36d5de0eb9e2774ebe407f1f6ece8c532c646c3fb48620eb8eca309227027bb82d184462b80bafad9836202ab609cb8fb9033c47b272eca2dc5a6e6632f52c3b60523115bc84f0ee89105b3b3b0c0ba95a629b06a4212a97338a8c970468ed4a111617c1dd34150b39e77520cd6d8befe80e639ee164ede169ab6b0846e367431ac581eee40e98a964d62cb6d9545b8d703a2678785ab5da208f1a28a7f6dee486ad837db15b19939e93e9f6edb41e709cf4880c5382910c329ee194512763389e29a9fe8ab806785ab304d05e5e5548ab1d0acae7e7be3301028b0702dd30f70e01c3544de1ce4ec064d399c7f86bd110a6f9ab6506b5f3267564a80a2504eea736ea3d35be60ad114b493f200117c966f0f74031485668bded2ac68baab94f0d06967e1bcea613b5060041b098c8f953d1680e5adc1861a101ed2346a03d7011cb7a6ec26572e2196da2c580920655a8fd1a46eacb437335e833567f484e8c300e102e381da58daeb298dff70c9b26c266366ac61f7a69a5b9798e66bd44814603972be91e7c04794d4bad8847fa5af2cef6b4d803a05d9dd34452abe96a60884bd9a3ed7d31a7f7e9a4086d6e790fafbbe05ff7ec8e1a4abc60daf82ac6a92e2ae2c8e2f9272ab7111c0583d0362dedbec012ed713c5cc4d63451f6aee9aae8187967873783a93fba9a1519e55a0d1ff4f6f9fa0bacc85a3cd2472871a14fdc28ae60a6c966fa9d4d091a14acdf1428f65bbff7663bb5d6ce5c6822881228e2321fd3b2a60c5814d6600a71d7b401ceab89fa74430bb647bf8b41092e1c666fd11974e2135c08f83dd8aa6e23cbab79fc306deeeb2da852d453f5b39791ba21ac1102772d95bed83c6ba5cdcbcae713efc145b516fd317e8167dcb9999f5f35535e7a094152bc35cca8ab945b1b6e5aad69c2cd59faa622ccb3e91b1559ee19d3aff4844970dc944bb9d53e77222309b1917fa569724a577b1060b98c99dd205013cb75841331128ec6042246a94e6c36509fe8c56ce77a98d2413e1ee3881c3a0609d51eba6e681fea882210c022b0ca352744d8a288dfee220aacb685c2a6d95dff6eafc53a48da16471e17effcc42c96090ae8d5b913dcedcb7d10f1d9cffb494e9c19005bb8aefc3134a3edc74a7bb158bfb2e36c4e92a76534f23159ee0fd34b90222bc3074c65a83c36b70a354ef9aee867d20e7908e9e52f9c6dcb0482a1edca998e80ececde9f8526fab23dd53133ad34679b4389994e1679549d9c3b8f496c9dd5b05a21d536c2622634aa027d05f50e25a5b93ff641531d051b0e723e0fd12b1a9f34eff2a47d863c18bcc90a81cce44bb2906a309702a43559ec4f45f17febb7a364fff816379711e93daf0d3e8b8bab084fad6b9bb8bc15d870cffd28082cf4e61d6bf0746c2a1502dd694ed1ada6bc511be3cc13d950a349411ca4d9d587620658ee8e5619422e1abea698972cb359a7868ea6f147fa175e951311ac06b27b005a3651fd813f5fe3d85a525c4a597c79893b115c592236c41f42130c6f2a23120193741fcc810376960ae6b627cc0c02209feb1eabd52c38c83f330e5a49820d33ace60c68d7afccf8d3cd59402034afc22806a2081ddf0274dd05d18cae59f8091f84e4940a4cd90072836d17c4e0cf6800b6cd628ac0bef65826b32774f657d60aa393f3a96ec339458ceb331bef25e5189c9a105303f5150f72561eab0e8164036b94d0c297c011f37501901693025554f0638130f09126e9beb3b7b33dd12643310e96cce234845f67b861f06c6db6c494f0b9bb9137adede32c70d5988c192be4c48c3ab1fdbee40aae817d413435f9207f725861a269a915fdefd125b7656c4efd37904ea200764ca32c6e8975fbc0993121cb7ea7771791c1f7410faa06ade0747513f6823bc275bf25fa74546da32cd3162001c3ded2f3aafebcb54c380ccd68d6c90c48ddc6e438469af454d1f6c527ecdc144fdb0f8a98a8402a9909bcfa493690a4979d6ed4aaa1c9fa490e9f20051eb6dc68605d250cbf9cfc99ac6c1039b9f6782691ebe9a912b7b6b45ca10ad9c2cf16a87a1120c59a774ea287130a9de767b4439fd5c931c4cc1915a2e16178550a51509e4f069be9738a9bf4778589347b5ef971a023770265a3b1cfadc16ac8b2dcc0fa5b83ac695c56268672d86560786b9f05a5bebd32bc90d5a9dcf2ff09808501e68afb425aa0908d97ad321f5d0d87b265152dc7c80b09e5637c6328ee3870b9bf6b02796b93032164e40a329c65c0f9573be4b3bd6bc03fae2e5e0bcf15a14f8f42681b15f12188e3dd32b8c8a5eb0020af69daa45e92eedc847305d3dfa363be55c030c2f8b72311a7ca0f33c02a304e30abba0d98831c005d0cd22b512bbe218132ebc8f77871e5fd3e9d66283d68abcd36d8e968f3aedf97ff17e736e7de4daee0daa462e2c9e404cdc6d3879fc1d79d94f857aec693605f56f1801ae56e2b3d3589cde1c9c4904e7844e8bd7b794d885ac082d35642c30af095ac4f77b144f34d60773a380ff8e6cb81d71b2abac3d405cd2ce4cc755c2c500a49de7b9aba7ab186956f164e58dcdba3a403dca57339424f9c1f8684890e7780997fb9e1b4110ae0accb0055e045154bbbd6542d59b1b931352564780b2e8f324f8d3493378780d90576d8542307da92285a3b19c0e6898076999f3105f9f41444bcc5600807a3465b83fb1c648dc2e4db12ec6cecf8b8af72a76f181e676fde1d1e1aa13dd297f0c333285865190609510c65104b000d2d627a2f77cfd9d0fa59ef6f03d6833f7b9e63ab2a6105c0332944c13e834f8e503b232bcbd82b63c830397ac7934ce382478a83a60641ee11d8092349e42600ac96ad2891b66adc349a77a469b8c4720120c0b06566101a899077ab9a4b43afc9672dcaa786f5b540ed05dbfc140b281c714f08ec591e5e7158f6f9fe13ffe332cf26cc71088e160583e98aaf57ec0c33db11302f162d1aba68064936d35697a2be709ebfaaef2188d2f76e29fa35cb0e1885a04f3dac354e80687a7fdd1fc1b7501d9c378f92b97f2eea16eb54192c20adde855219123dcba160dbf2cb4d039005ed8c3c9ab3d69189c6fe29c8687d59193114dae66e0ae74498b7f47b64808d6dc5ab5e6ee2d6124dc7770150a0df3e7bb5b4ad2279f8b955d32785d7f8aa619724705c488306eabcd6b619bfd8905d32ee7e1a0da700f007acf9244a614fcd186d3cc3de2eefa82767dab977fb9ea4e8791fb25987af1f9b5f5a5e65175cd32c44066b0721f36108b425d0717530d3393fad8e99770de828498c27e0c4f292dffc835779cbaea02177a63002d92bc640d30828621fb6f9163ca8cf81cdbc26a8749eb3741861685c4d1aeeeac76be0de5239b5caafaded98bd34dcbbbbde3924bf64b306e650401482a64d01f0bac9fd038e34cd42bc0c245eb702398be6106733afc4c35cb08b9e4cb52fa7020019259378b0642b17e6695ac37c2e36881211906ad7e78f3fcaf8034230412bd4205b2e0d3e645e084beac5d29d4acf13323dae965822830f29c81740aa6d1e48c30323450d23d3528b39fe9f4edbdf6589b7d171dd9c7ab7b562b2ca3bd4f77330af9dceb117949d9c64be7c531f00e8261aac1f89fa5f72daed10a55f6b6a547039a81e38dfa63d07da0b1d598433c04eaacd9a096a5bab1d814ea9d52a2f852576ee0c02a9a5c6c056f6c7b3fb4574885560996b2c61aaccea4a24b534468779ea7abbbcdc716449f83a188954d98a1c93ed8e40ae117aba3a8ead6af9387b2858b6a6b1b5c1211ac0fe5e24c7297d744ee9a59381b97d22c571cbfba8c08c79355a69520810f9e8632a3af5a51e67f88aee96204226ea0b49398b35c21fe7c1e10b1f160a48e4064a024d2bc55e904f61b50a44df81ebf26c399385d1c075713e0cb90a7d29578dfc7b315eee5964949e49aebb51e4101041b3ddda0fc1073566d21532f64e155d1329d3b6abcce7e51ec60cca5147604f8af1eae7981703717d5a15e8b47a03d3751c3ca60c15c89929f44bf08965d50706bd63698a40925481d03adefcc145383c99638a0ca4872a986f545e0865e7923bcbde59df878def6d8043419bcf3594e06bd918006f1380ad2a93000e24690ea72925f9c273ffc370390aa53d5af3c9ba2d8c4ef2cc81e181680c345860353e3ff8ae22c8556e06dc9b12ae3124e6117556231959369185fc0775a6038fbfc2a51a99487d8d0ce004710d10de0fafe6946cb39197ae5892c97782123b7f7ff014f0a35c286e08387eeb6ecc5ba4629d64604f03b1e286c1d92eb5866496046950927125348c066612d8cdddee64a3266d736d791ec326730981a4ba7922dcf6159dee3f677c116ade8b823070c8c97f799b6f2ed049267d8c52830450a0cbdbdb13080e8d6ad738d6726e8f2b3f82e1008a345628baaedc343d27d6e7cdc530032cab6798d359bd5002f39c730945c5a5df935f0ea4091fb89790179b16fbc6eba333a18634bd6cab482ea535d68752122d592fe9ebbd118c026ed1381b904b60017043342731633cd96a79ab450f87ce93d94aed12a8317f4f8fce087220ae901a63a7d705b77bc4abfb1df9f0cedc418b8a5d7d6658fbe0c731170eb6f6d5f81e02b859422b8dc40ab23fb6f431fe8791436dcb1e9af274f377f57f453fd7780b42cb93a29d1bfc42da6f6f8c5908ec110504e8e2d66134925642d1584a9cd257de35805e6f96b4aa71391e08b8d5eb7c1415584aea98cc264a3d612c64b84ce1945de5f2f7e37cbab18185165740f178a4404a39f58053b579955424ca378fa30535dd904558161ebd34d64af042c5ac09a93fbffce5651958ea88f212dec20c10dc94434d93b6b89c8de85d9920c8094c46c6bb91222b2e7ca33ad61bc015d45508f2b228c5946e379f44a5cea85664344ba0e7cb15f005b5f62eb0aaf0a799dda7cfa168db841e021045076bf9fd103578437005d24521d8eacc2539048f6ad9a732daa095bfd27c8efc1b92911304ba31a0f9eca2d08e26e7fc04b2c53fb2996f635b4bd26966491771783fcb7d797ad4c0b54ab824d4550f1fedfea0278bde724129fa549edb6182542c930ddf40c9030248d30a00ff1a258c0a2968b64e9a0aa221fde601b181cc4ce19f540208145eb614159ae59ea008ff36707087520ea5c9c3a5d3a5b1bebb180ef76fe238431f6c1203a8af0d865a2618d10f4d893cae54ea554db123447e120ae94d3a91c042b449c1747dcaa5d2eb748efef21b84b8e52aacb0548a56446be9a36892f70b74a3fdcbe08aeea375c55d6c9561982b13997d5995f4dc44c7eb6128daf27ccc4c2f0b77f03e8f91fa34de7e5353612504b4401bb7305444b72fa550d46c36d44deb6f8e321fb6be060330fdacbdc442c271d66ffa0a32d2e05353c0d3cecf0b298ff5949b6864ef47b720bdcde7c12ad67bb74da3f6607aa3056c4e33ce1e03e28489b31a9e8382d1a57aabbbc14d5a24caa9dddb3446048a428a4d09e455d8e71b9076ed08eeb4a0df3414ace7ed98947383c388f8c3e0d9f8acd0738dc844b583d350ba8364513d5e4e937825d26a65ffc2c547c32b200bbb609c3848ededb6e16b0619761d4326a219af28a1464a58b057e4a451aa156f6f887635f7d2c27531f87e1eafb46cb9feb2e7d82dd2b2ec62b9187f942a052828d5715baa592b208c875863c4e252b767da9c9b54b27c075d2b0edfa21ccfdb06b47bf69f8ad8b2012ac82bf828ea2eae4b581e196873f1e20220a009110f6094388c0875211f56c3955e0344f1c35bfb24858d14577edbcfcfe935abbd0a0a1e61180da155038ad5b3f26cd46f974547dff45df1f46cd7cd4c40e9447da0affc07344a90d90dc23ab337553bbb74437a5bf3b7b5bb001e25402eb6c00dd7c9466a08368202f885a4372c2449c3398c664a6242030e26b3689466d99cbcb48c476c3555750bfdbd2416c037806e8ea2074044ab251bfa5dc12a46612c93ab108da89810527685c7f3f28a3888285a706880a7c7b5b3b158013839e5b1c884f627da983e7c29734b8c83a6fbf58ab343f240413cfc4f063345c486d12889fa1c991e5e5a0158b16592785218aadb149baae838f95937d50bc7320005350d8b64916bf4d04a6caeeae1da9d288e6dc144858e9c538025db5ad30e8c73efa926e7822393aeb91d29f1869b9f381514a0388d03c22b2f53e4a043ea6e8fda8cc9e5a651a543774e617c0b0bedac2a01e2fc574da5d805668ae9860f7576fb01a5c4bbac932df473b8e9bef7d9fc63030d41dbd837c6fa13a4edf44cc068309e2e20dad192991b12384f403c4d214278c20d3e08e79a55aa1351ecd2c13f85b83a3ea0bd11e8907b7c34aa9a9f91211071d3149d8753e938b58dfc2f3d2d68312bce5583896a040dc7417186a1adfe32f97dc740c1f38c22e72db455d708c1127228b47ad073de5fa5ee7195c3072f9f421b84969509c11e41ece90ce049d907a3a82414175066d11b1907d71b98985b6f2ede0630244c74780b2df03e63e9fd39ffd3fe0b78341ad4a2359bd1aa2eab4e07fddb446084b775c7cec263d80cb62ff25e6b32bb0846b89ff5b61ee2854e2fc3e83ec615ae34b215b93634bb196863efd200e3b6f1a01c04cd0516f51f344548983c98a996c5a48bbb0efe28597acf12bdf556e0914e1d14733f87323fe8e2cce74641b6cddddf3d241e2cb266f78c017626d81c4c44ac8f3a7e8bac6cfe05ba484ec672cd31ecdad2f8665c64896d686da65e15f3dab948bd45f214326d856cb0af5cd53e093aae79f84d61b8dbad1ae72bb75c03aed8544dd850bd1793d39c37e000b4363626630ee5e1f03e1cd5795afa1912251f9109fd11670e4fa66d1da456562df4f195aee29c0f9ad3cc8057e3a415ad212cc73761af24743177e3ba9301085435e0e215c16ad14dee9081ffb1ab8a85e548f4505f93bf716869453432d9ab5e49f8c7290caa27a69da5d461964c5f7d8ccc6fcf8e021c33e47f0b904b07c718200471cb204d5a6e037c371f8b2578e22e50cb4538be50812bc6065f8cc82430fd9a8e350cbad1d699cc8cdf99f6829ccc6ffebe8b75f4f1c6d1b5110bfabb6f6f8ac90c345b67945d5d4a63abbad30adbf3efd731b61a105d0ee136009c732f05aaafb4a6df734a7db3f1d5341c935c96a5cf4e7e586f967d030da37b146336152daa10be88d520c7d8336d0202539b480de40c3d03725026d82a6430be80cf4ac14835ea027e8387480ce40c74a30e8045a828e430fe80cf418fad25b95f157d5251f2c857511d304e26959fc676bdab8b53507d6b07144b05b0c6269edc6e4604d9b50fafbc06f26f3530d097d3bed0e017a82a5b523a8ea1295914c55252db29183f0258d3f0dbff7cb5f64f8403fc217c798a3c49726ed55bed9987bc58aaafd2c72471dcf18d9a584487b233c070e87dcc4241ca9fb1c9075ca309935c43b49d4c340fd5386c9d6a5eec8e1eddd1000f54b5ff037c4d6e40ce17d4a6d57211eefea3eb8dea61fab9901fe76f1ce76b54a39d26de5c5065c020b7e137166b922e86f3b3a6b4c82921a25309b4627e84523098ec92e35c5f99afa766bd6c23b907c73262d93c844c11c6deb0f6380d03a7add98bd9c5b8cb2b79093491783a8fcb1b2401f9c3c0bcf5478caffaee1d35692f09438065c71c1b40b43814fea31c3cf5cf4a49976f554d10fdda675fe35bbcbbfcbcce63d5e75d81f5d152d33c1b9bd6cb5cb2fb2e35f44d9157e5404e407279cd66cb2329ae8bdc3c7219c217bd374ad3cd5ebb7942e3032692fcd2924a103be1c05890f4d10608b366d288aa2288aa22806b1ffbdffebeb1f90a7101c4ac14171501cc25e4206bb06ec460ad64372e5c5eb2bd8d146e0ac31a5e74bd7bdb9b27b5b868a12084cb80f84a99bc0c76f961012dd13300ef00d537a848f21013ac208041441c410421c20888f010a0084cc0f3ef4c0c30e3ae470e17011e0061baa180afc51c554e08348278c23d5115c65c5135455957363049954458548157502a14c505515cc558222b45147113ad5f5c745023f4223f0038921e4318436aa245584f0834f8c109a203206446680c891aa9a8939e409f8ddc04f22e1d054d5b54785eae33aa3d9dc2aae2faaea124108f6f8d4a834ca20c0a41115a40f6428249292aabaf4b8f228e1e4aabaf0c0a3aaba3cf024130d7652555707525709fed2283f66e38ec7814ada11fb8daab99c7aaa830e6b22354122e1d0585230848e0a7f04462553aa96eafd2b2619d4a364688e781bd263215333e95157a04e2076450e0d54440c817a2cb41043aa8a4dd1535c19c040d51cfe3b324df1509c96a450f59fa49444295551cd9f4c506027a33328a9de514974bf86841a55f927a43aba238cb3009653525255d71a71544f949c9c52a5292412ce1292ad29130d26999abc044652b0542850d489aabae030dde0984ea52936a34a9a79d4ff929489869a4c3537f554539a32430504ae379ac36ebc7881ab0dd672fe89eb8b285575b15155d71a39ff048909268d443339a41294aabad4489dea4d555d69e0d1098714a5aa2e34aaea3ac30c2935557595718d718951fde99b7415ad0a57c5ab025611abf02a641555758551554992f4950b8caababef0a2460a0d1427353334531610aa420914d6870635a890e82b3828988b8baa4231a1c4fd29fa4a9224ec0a1344289124c9e96f70502814268da84061d2888a519512ce92124ec60e882d17e0e4ef2875aa5172b0a989d4a9de602739d8d4846c8d237172deca8b3823ec84c6cac98445ea4b36a6d2631b53a9391c2698684e89e6a6a45025d38c8c111247091968718026aaca0261cc50651143481f9e2c84d4545529077591ac50c1aa8215042b90150c72f34302c088c1118ac0381113037c81e19101062d804155bde0092fc0525515cd06e6d08006ca00030c31baa82a2fbc3831919a615441d1c4e94ba5914c124d260899d29398cc1240c8949e04635a90bab28525bac047089a88230d34a254532480055070fd93207b5c092509dda004a9220803046942844c12236492e43f0d51838569062571ee4f811add28418d6e6ac954a544bab119adc04915881f3515132602f9a1624289d44bf9d1290508066200f19840056c54d54d0845e5283d195fa0fe64e5c4a0008eaafa14ca0a2af532b8e60914c0fc0d14138df5396f45e664caa851ea64449122458a1829d526644056647252a7918c1213a43147090c89f9038eab66a92850f940823eaaaaa650d7151fa8c6168298c00844a1183fa650871f56aa4f1f2da8b0f491aa2a131f33e823884aa63492c1824ba81308068b2fb54ca940c90a238c588289256488c0824743a4f23f4922c5094a2aff131919199992151390c18247a1af823fa40518bca085045c2ca10402644a4f0a41c16498f0ec608f3cf64855312038415585aa089b098b9ab752494d902a4e0448f5a5fc294a3d7d3d5108218410bef7de7befbde79c73ce39e75c6badb5d65a6bddddddddddacb1c61a6bacb1c61a6bacb136e79c73ce39a794524a29a594eeeeeeeeee31c618638c31420821841042f8de7befbdf79e73ce39e79c73adb5d65a6bad7577777733c618638c31d673ce39e79c734a29a594524ae9eeeeeeee1e638c31c61823841042082184efbdf7de7bef39e79c73ce39d75a6badb5d65a77777777b39ed2237cae3514364eaaaa320202554c1da4d323714748dc136a8ae9f454729a30d1fcc8094cc23151818589f44dccbc044ca725557545717a512a652a95706da2aa2e074861a241595155d5d580aabaa8944ca3992952e4d4270ca8aaab8aaabaa898a2aa2a0a5f4a676c644e33a893890695bac179294a4a4e38f79a4a4a4657464ed41f615b51385606854b384b528f42e12f61516f5029d4e84f9f534932a42a8702aaeaaaa9aa4b4a8c1c3844f99289a6aaae28a254d5db98a47c4aa6844304eadfd692933fe1a47032fe54c5279c949511a54e232b53654a28507d5b4920fc49a046174d555d5054d5f5e40907502a4ea4849ca04e4099a1a12129a04821050dd127539c800245a80a25502449a2a4f4564c354fc2c126282413369f7252c544c24ebe34aa52a2337130a04a69943a99ac1219d0cb9ce0d8c2d52a0f1031845555153e5979c0e1419d4039368442d59b54a9964636a3d3458db08c0d4ee9655036a88a858ca949555d03104055a1aaea0ac0058098aaaa9cc04faaa9ba048f4c53e0ff9329759373ba0e78303e37722a0adf47a54c2454ca4492f222ce0daa2a747353932409dda06643d84ea80bb8c8d65360e468c388aa4a922474836a238eaabaa962d828037502a54656b60ea14e7f437a916c8dc3460f159499aaba8c14219d4ef49a4824250638ad61450d16546a742a292328aaea82b95cba48a38caaaaaa9c864cbd412227859242c6a6caa3644429254992541e1eae97cba5aa2a205ae06829038d2767dcc08c2caaaa0c1754321d9950194dca68525558d81764cc20551a996e423164e041c61b230663e8515551da9524499810a16a1325aaa0722ae971090b1326994c3774129dfe26648353c2a6e670f0a8aacae184f143555552ac89d444aa963e556fc934839d24490246012ad40934baa9a119cb8e982f2810c41702f0a20c5e10a1aa649650424626c91557c8a450f5e60aae5e7c192a8b0c63a86c6e156370d145185d20e122072825f86d3ee5c4e6534ea82835a2620b2f54315be4515520fc4ab6a8620b982a92a94ab430a4aa2a102a468b35aa4a063787a3c5142daa0a74329d4e4f223d16a82a63c4e79048385906f54d6471a34d5152d253bc145948a1aab0789a982cae10a28ab140162c70c757a982839231025545341698155841a5e4a24650fc2f71911430a4aaaacf3257a04a38a12b56ae287d4d95de66743a22e7ad549537e881d811554ca43054950586aab2be50c550200f2f50a180120ed41ac48e2861613a5911aa8a62288003058e54a65c7222811169490ee9e646c9a3aa284a0dcafa4302a46a94c415a19329748508352a8db24c13a81308951ad968a1aa2a2b0b554aa3534a4a9224cde13081425552e8f43758aa8d1258aacda3aa65a2391c25b0541b2c65409d4022541589505584e54955a54e26114ac6644a2579d4e9affc098bf57f5a527a2ba6141439350aea1960a2f1982b77a04e205c251173e5559f427d2974fad42864f3372824ee5f89b98203a9e2fc5081402021524f4291fe4a12d25f79522849555952b0a0f084aa42e5d428ff3984caa937285425dd14ad5030a8624e50d0346957922499e20911aa36618209254835553231114a92e447a754e80615fa2a289b9aaa98a6391cd30748249c25261a27ac40a1a2399c4a0a914c261b423d113246d89451e55412e91092953eaa1063e5357926885022630476a2c4fd2988680e47c688e67086b811b00945c006432088aa49555577f820662463442aa8aaea95a04650a44c265c5f0a52c524292f81919492931b9b53932af4c6e6d4a4aaac43ac1ef0a0aa42212954e8400086704802ec800213689007109468c0005cb280298191981214a2860c2012b84a5a30010f5e28010541d4e0c5933880486386760139fef8e3882ce0e0060e3938440f272cb0839a319628824b5e424c86b17260e1a0aaac1bd820067f21060f52c5e0996a0c5e30954c3407b84f40a947d1cade6191e45443aaaa62a9aa0a08948c4583aab266200342aa9aaa4ed4547522e68a19c45cf1e40a2455f5a8d37f951a25261445555983c4a0b26050aa3222d597c00895c231e5d427d515b25c51bdd8bc549e25aceaa56a89b15eaa1aac961b2c1a2c98e6f1aad386c787970b06a6c5d3b1ac8a0017a8ba2a2b0a4f02acea258996eaaa2ccbea5c4d2cebc5ba2cabe32281cbbaac97eb06292ccbc57aa92e6b0650e7727119c2888ce5b92e4f1a96c7b22e2316172eab48d56279aece5b16042ecbba60a65c3b5cd6e5e2b92c295c96e57259515804b0acce05038396ce0b0dd60d966559d7bc0600d3b1e8b05c2ecbba3a21ebf21829f22e2416133056cba7b384f5725d9eee18b92e8b881aa235014f1f89e3aa3cd5d501cbd319c2d372599daae5025612aceaaa6cb0c186caaa2c8f755955b060ae222ceb6ab9ae8e65390b090bc642725dd7e5326309715d9ecb621dd0911c600e60cd00001dae37ac962b07cb6375acea8a72c918b13cd53572a964aeb0cce85440c0c0aa1440c8d5b15c2ccf8b3583d581e3ba6092742cd9b1aecb237321293284d562592fccd33f30eb32e20273599665bd585612ebba84d071b18a5c9ece15ab00178e65758eb08a1cb92c9817eb52c0e5c3e5c3d543a7ea54560d96cb755933786ce878ae1caeebb25c2c4fb68a7cac232d97d562d1e0966559d60ed7025c8e14b92c0b83e4e5b2a2b0602cab73591eab89d5c3352f1eae23d7cbd56275accbbaac24560fd791ebc563755a3a96e556c71ac22a6221b12c2b09cb87cb48e7c582f158976525b12c971b2e01589ecb6af158f33a62752e1fac4ee7ba3c97c79ad765e97019b18a58309ecbb2ac24560f9791978ee581f15896e532160e45c028d141408bd5b18a581e1cac2245921c69c00e3e5806f058d7e572bdbc65c300d8912696755997655947542fd54d454522d615a82855325320e109864c5147124430a522814941c2112a2980084215451d3af8286a2155943a0291230a102628509000812b3c01c2072d3041020f6cd6810312b3d2000247c20c1f07c28815916091215e91c81c51a60c15e80a31f870c415795c461cc103262364581108a0c3082bfc70850c921f640800808a8e0038a0baa2458d4ac6c34565bda0aaa4a0e289980640e1d28591206c90a5c80b0c8c8b11232e2d473a3d1479e9b4740680a4460b9a02c00ce16204467a90d4607990bc300049aa3343c786961f7081812c2e345c2f453c46ccd083144116235320c11e2368d0e27a3bb44cf1582e4abc20cb124f9c88e1e2f218f13c21c20b598ed085d59224e6070568717974e81c714816042021cb0f51ba18400d4d78d161a20518597228420512016020cb9201dcc0a08c74218b12a9224cae58c38697229d195aac78c428430b184f4ce708a78513ec2852840fba80f9c21b345c475a1410f3323d4f7c03fad822002d43185962e4002e56788a78995ba4a00e265be8000d24ba98e13e192306598ee0e40c703143abc13a41961ca216465ea68b11181a3aee8449a707234b5eb47032831498263bd025468a344122052b91822c04f018118db82409c00c2e468ed0023cc003598cc034f1c19291a5a563438be512858b9196245c8a509280233845848069e262e42587199c28f2f1d0142180007838800e37140133048d1407d0c2080ce8c5cde0dc499417249e171d5a92746211241e216414f052e4c588078996273c520156cb0e1d205a6e6045606e67d224708031724311d76286e6c88319c2f3f17c5c3e90a5081a3c4eb420a0c587221f0f0f3574a7872db28090b03ab97384a7d33281023c800d53890f1118d2823ef8f8c01d636451012c282bf9ef150fb0824a15534c9112e5c9029a24916e8803046100190f2183246285293821014c0451001d7278a1030737c0c30351d00424e96100488eb8c420101584200f3ceee0401d74c8316508219000650003898c610b968a15aac08290690d34469989248cbce4a1461a5e04083fd0238f2433124000478cc0bcf0b0c3094c60c56328340b70b284ce7186186000e00870057c88e00359503185471c04e0d181215a98828925629117173fbe50c108ec70830d3226b08139e640030a0d13490881c412c31586eb0b9e2bc854e17a82c70917125a8e6005e142e4f241914390f4e0d2c155c81548878fcb8a0702d607a687161e66c8e122c035004b0031016801c01563d9e0a1e13ad262e42a020373bdbcb45c1eab63592ed50c357476e80892c5634616cf13972264ac172e68618307b2b4b42079394010b4f0d4d11e0220b903042e6364f13c297283111e70e0224b110678a8747c3892724102b30446ba18e924818391161b64814141160158a14511efc891052446c8d292489616243af8200b92540104c95204071aae97245a906869238c011cc9e18d2d3c6564a901881a80e81c1183040c0e31896cd1820018f9a244a7868e12307764e940d148b81871d9234be7888b0e1e238e74c7f220f1186164490b025e18e0a2838b111708201100120114c1a1c80d2f0ce890610b171d3a7d6cd132832c4140c06323130aa2074f122435b8c478acce119d194f94196e70b95ea878d9e185a6650034582e473a2d1e249d4ee7eabc74603a458cf0e0e9bc4c7901400d518cc4bcb8bc589d17cff320e1b16072e8eca045911f5a409085863db48871f1ec00e3c4161e236c5180904c9548199c00841fe8c0101acc00a78a1435d2a04d2460093795ac50052484b0a10698970650814293480e7ab0831fd06070bca1000c1801914264c08213f0810712a003b88193420375e20216ae3084437a304809b2b0c003aca05205141a264b7ef0810037040248167c88c0021508f5c083a9f4030d462842046cb22452062f74c18a0610e08618446440880b58700213f881c61962841ec0002aa0d03829240784e0600570341142100ac9810c066181201eb8830c2fb8c0c21510398405820432822eb23c76426366b802139660041a0c02880afed0430d331e871e604503a8704293484244cc0c85e480067264408d2e1e3f60014e96d02492d03083a762c2120ac9410d080144057ff8a1c71a6774e180053859228924fe9a0800c478aa4498b08422d48006840c02880afcd0630d35ce30a38b24841c60450290008d410c4f9ea8810622f090461964544105b3c30c3272b084a048229d325c646811c315061810783e70e971e161b5ab3bcc021d39a283808ecc0d3f5c3c583bbce8d0c9c1c2c14300eb8622010000003a36786a9881061b66d001490e4778301253e405c6e5e572716969e95855a543cc943d2a92ada9d2e87483c463d31d9570b298529a9263a628e00a9921644a23999f1a26ff8408559bcc7c20749d0d5860a0f6bb31af8c4938edfbd85fa0cfcece8f277e1cdbc316798340ccbd401db28ff66795afc60babc8dbe65681c5d40408841f8bc9b2ee026dae35f37ce163ee98ecf6b8401daecfe593defcd93aadc81b6e81b6f73567d7dc94cefeadc83b340a39a7052af1f4db98633edd7abc5e8795055a2fcb35e757bd5d950f8bbc9b062c2cd0970fdb0b5b860c33d7b5db15a8ad51c6875b8ceda1b5ee56a0d63efb6c5e18f364b9e139885505ea20ce96bd8dafdf94ffa8405d3ec96465fda04399eb1428ab2f27bbb11b420cb1b70b2c29d0e6574e79bdca5c1b64320a74e23ce74b6ce77dd59d590b0ad4e26ef9b6b5b33218ad8d4fa0dd1c644ff6bbbbcc62084f60398146f75ca7cff7f6c1969bc87bb6e381d504faae3ec70ff37c2c3b144eaaa65012071613687f8ef1795bf8b26458aa4da875bb1a584ba0d63eb373ba87ebad13db4fcd930f08e42d104b09b455efe7da7506717c805849a052fee71a61ad2e3af62e6c28b090405b6d0fe2c85c66b8d9d834ad45601d81caca1ee7f8cff6f56bdf08f4336e2f1dc7069fb12841a0760504621dea76a5a1261e56112894f07d3bf83ae7d9e41381bafba27dd8dd7a4796dd102874d931ec26932ebe978540a1757c23fb8eb55dfc5a1068edfbfe49981dcbf97f36c10202756d4267533679fb5dfb033a61ab6eabd79f36573c45deed32091622f46774fb12777e1fd0fb6cbdf8bfc597ad6c671d42f3cdb3a17c7d5b73385570ec3b61835372299b6c85d5036a6d8cd53d77edab8c4528f26e7e88c5031a236c3bdd7b6ecdd50745de4eb276f0aebd796366b33e27f2fe60c7f9fc09076522dd8f759c4f48b6d3974ab3fbb074402d7e0e66e70fc7792f7c22ef902935732c43e86cce65cbaeb266f2d92f84c207f185f235db6cbb9739a0d82b7399b197f3c4525691c441bdb362c9aeb3af336636a6530ee5bc95526c561cd60da8950cd7db38c7e9acac4ee4ed50960de8f5763bfb6ffe773bc776b26ae0ac5df7aa64d7ce57ed137947d89a80402050fb16160d5abe63f0e599fd9fb426d3893574ac4531ac195016eb95173acfadbe7c121e854a267f127612e30c2c1950f9a6c7d8d9620971bc4e08f5165f9ef539f93096cf7d103af1c4f96f94ec75cd97c580766533be6a1b673c3d6318d08791b9fc9c63533299db0b287b154797ccbe73d94a473517d09f2dbb16636c57e374794e61b580da6ba7b38cbdf9b2a5e399018b057446f6f03376ee6164d1ce10062c41e883cf5fbb89197bf5a550383894734ac9f685b502eaf7ad740f4a67d3390745de2f62b102a10ee689a56dee0dbd6226f29e645880d0ebd519bceeb23eac9089bca500bd6e62582aa0ef7ddbcdd759199d752df24e017d9755c6dbac9c1537f622efd367696dc142018d2e31ce915597a7acddb6b04e406db776f5ba8bcdba7b28f29e5716cb04f4efcbcf1eb608237bae89bc4976e4a9fb37a8921310287709ec9d2ddb73fdee5de6a4c849a40a024d784addb83f6873eed833be10b7ebda89bc592301f5b7d335f6fadac3be50e43d02cae63767bb32175b76f28abc9f1fb43d8bd1ff5ed65c7fcb22ef9c4a725da534b232a1d5c77b8c4dc824be36cbc8a2c8db8ac92422e1516b31b0f8a0d21bb3584a97def0e127f286775822a012defcedf56d5f258c21a0f061ff87184a26ed7d2ef27633a2d4888acfcce733f34961f954c934f399f97c663e369f42e53cd6700ffa96493c63735966c7d3aac00201f5fbeeee9b1377bcaf7d7e29663e33b4891f9d6a1a96c0fa00b5ee60db2bddb91aafb5226f532ad4acedb0f4a08dd57773e627d9bb124661e541bd5ee7ecb6266b7ed3fdc9743ad179010b0fead24adbe43738dfbf5ca50c75f400657f99937d9fb129a1bfc83b64c22e02560768adffaecb5a9f4777a18bbc4326dcedf0350d9590c9ba83b6e66674dff96f672c5be48d7a562c0e5027fdbd8f0feb7dcfb216f9941294d6ae6d4633baa6a11282806507addebc39c41347183b3a917795d228f6a7860908f4a961f2c9b933201008d46643325875d08b596eaebefd3c9f671779a7706c428f04161df467b490cdd8af5f95b38abc2d0ea12a6b9412e7c3da00c5d1e2e6ef72c6ac7d7d226f39c7c7872d4b38dd657f5fb3d2b0e4a0d75ae60f33ccdefbec57e46df3ae015a2164cf5ad7aeadee5e29f20c50d8d035577194d97ac37dc5c20075f57dba64d3b507df75228f4366f8b1c987fb4af61cac91655870d0c93293f8faadb9f6cb5fc57d6a988850b5890855454d3e331f299f9a271f0a821db0dea0d15566a347fcd3b3bc56e428100804ea2b2090cdc5f26015961bd4b2e6acc592b12a2776e6feb02e402786d89b7ccd2b83b2649250402094159349a487d5069dd3637c91c5f8d57ece22efdb2654c934030281429faa120704ba7f0504facc7c963cf199f934e104142090c521d63660b141a36c19df1a25b4ce239b320f6b0d0a3b7775d3461873869f45de210802b91a14db98dd7c5f59c311e609e9b0d2a0cf4136e76cf2b267f17d22ef50a83592ada5291cb0d06871be19e374d94fca8eee2e37c698c566a7cbde5a8bbce367e6f3a979f2018140ad430defc875609d41e785115ffc503a686f4f9177080402f51c9619747edfd617e3f739a18522ef3fddb49ef2b1e302ac32a89d2e32e6a09453c2fb960cfadaed38abb517c36fd3c7a0b1599ff5c29711be3c2386381f1aeb703e351f0b719c5bc012834e97ac737bade1e996b930a857f66273153e081d7606067deed9063f370bdd5af7bea0b53de3cabaca2aa7b3368a149f263e331f259f284f3e2fa2483736238863794159d7e760eed8648d4ce6bfc949cd4f0d93cfa786c9073bf9d43cf980402753bec9a9018142a41b9b51641dead768a884ac0f585dd0e68d6f7539ffbccd5a2cf20ea5be8a9b72c9c93301814020272010c8b1a6a112b2dab0b8a00f4f26fdc67ceb6db6cd2de86d6b23841637c9dc6dae0575cf2cc37266266dcff9ac2cd4426fc7b9e1eb6e75b23f354c3e201008540584345442a12c6874d0cd171bcccc5dcf28f28e09b0006de7ecbb18fabd5f619e15a08eddb7d7b59eaf7a5726f2761d9950805ac8a4f7eb89a5752de309d077aed93c276b2ee29b2540e36cb359dca2c3f939f77268b45e5bc5ee8eebbdeeb0d0af5f5b629b3dbbfb6f2a85b0a09731082163afd9fc7ef3151aeb6b9c23acd34e6f9b712893b5627f67f0d6ae32a728c4f319ac5fbb61d6624651d913ba679f73d5df6df944dd627ff7e13798319c1f015a1b96f37d43eb0ec68c6fa8bdccb1576c1b42f62e36515ced7d075bbfebd2fd9668eb37ed8d56ce78ef84d786fe7d1c71768eb96d785a126d1b735bf6d3e2aeb8ad159abf3597e7b4d96ddb5b214031c4f81bbbf7e7557a1dd18e36bf3c618536e2ecaa88661cddb5ae73cfebce6a15dad66618fb6d8dce6f9e9966d8fe5e289dd996f5e7d3fa6ab53e7f3a6e167f62da7af64f0b5fbefedacf4badbb6d616bf6e463b7d3d2d62ebf6899bbd0c93c67a516378925acb03af738ce2ba86ceebad86c6cee666719a28f41e6e6b319feb5f7ca0750f69e6def9fadd65aad7400ad0fda985fceb7d9322bada032ffb3bf10be37bba56c007d15d76c219ed8f1652da9d0765dac163fd77f5fbf3380e2299be16ed6fd83f57a15145e18bdcdaf315b16a753417d5e88dfba64d1c2077d0afadac9f9beb9bded91f9143af1840d4fdbe6b3cc6eaca1b0c176b1e66f96a19b510a85b14d083d37d920b3194a415d7e79a3f5ce51503763ec98ff4567f0de2854ded62264d8b1674c3a28144237ffcd089d6d8b69a8bd36d6fb7f2786d21b42411bdec82cbb13b6eaee7d425bcd354f3ce33306ad7c825a972ecec7d3ff366c6f01d4da5c6db3b5c5d61acece09cdf2ca6ef0c6f7dee0b54da893edf6da796b7bb739136a199eb5b6ec77f03ae696d07bb17c3ead7d8ec1f78dd2e7a05759bd21fb3bb313b4e2ea6694373be95ac2199a6fcc30c7c693356ed64dd0dc984d3927930d7fcc4a6885ad36f61aebcc6eab0aa0ec7375b6a16d5f31f304d0d9587b0cfb47d9a06b26f22e3d2974ff4a68360c8564d350092d6182ce18dbfd7a2db691c1cb723685e69325e864d2abbf9d1133091f5482bedbccee9dcfbd8bdf2df20eb98eb1ef5f719204cd39b21c3d432ca78dcc89bc43ad63ca26bb98c4c6640a5539854230937a6bb7ba26677e93b13745de2197924e5763beefa2739135d644deeeb43de758c40dcac9e6e32bf2c6c274aad22dd20767b77dfe8fdf6dbd22ef530a0569e7f7647691b98631ab56e49db2c973caa3eecd19ffb16df1f66729f20ee1520d9970376780a3ac5a581b4bf61a4fe7aac85b84c2b9099d4c3914957c663e359f9a279ffb536051a598ed4f1a9d2f3739af64b936bf8d89bc4f5574430c044ad96410e84fa64b450ac726c4200d9510154ddb3b9bedc79a31762cb1c825ce6789149f4fcd934fa834f2764add2cc168850ebde7bcec5dd6c722efd449cabe2612490148dcb7d56b76f76f998c55e4fdb7649a7f4b504a4ba244dd985c0dc8a78c0e6173fea0bfd98ec906d95c21914094e51c65aeedc95b636d55e44daa573e9442954cd7bb3462fd27d37d345442538ea0ef5ede8ba16dd0ce7728f246e5bc95f9a99aea6e0d69a8849a3082de86d5def7a6cdf8d99722efd3971040dd4e2959756efb55385de48dc2ffa850eaabc0fed43041d50f6b381f29528040211b132ed513a87e6a9e7c426fd250095961141142e19c42211d88e8177b18028b098b940f4244d8640ed0ba8a64827021f611c20043146008208c9011e287227c603d10c183103b3403e8100a22876663baa13f85426d25c276731fe538848620402864801bb0549b1f06d021132954a534aa52c544ca410032012800006c7c8839995295071b4211b6507b2b95648ba8a10034c89cc2e961860ebd28c40312218ea07230d24ca6930e458a80c1f54f3abcf8e092fa2a39b4348a07cfc8c6c63444a715e03ad527dd1dac0e61791e2a1edac8410d1d586f534b9e1cd60003c9914a890212c0c4124a249124493c5f50fca07338e5ac6f61cdcce305cded62895fccb6beced58240cd21e0e9a28126cac345f36cd1ad454f4f968aabb777372623084422bdbf445a97a141ac43068aa5b50f437cdb6c8fd5b844090e14a52520100884ba31b9189d3150b70f1966b93ec6f85d140365f1b6796dcbec4cce9a9f934e18a86c304efbd84a086166100c144e1be584f56173d732f705fafec9e86a3ff764b6b875bc401fcc195b5663c5b8cdf8ba409bb5ce323cfbe59c193b2e5026996b1743eb5c4ffc760bb42dbb72bebe30cf2c594b2dd0581d6cb81f6e3cab7c2e0bf4e176534e26a1cdfdbee11b1d2cd0e6248c335acff3be07db1c9d2b3c881dda6cf1b4b942f7ac403fb38c3dcec9ee8cd6c52a54db9fdfccafb267df83a04305eafeda67abb3b8ba973164dd99028d17f7952dde7f9949eced4ab3995074a4403ffb7b6edbbeac8edb3b059d28d0cca46c7da36516051d28d0066b85dedf6caecfa32c41e709344e5b999d973d9f19df7602bd8dedcb7eccca5b3b5f2b3a4da04d5aebfff73993d73dc87a8f0e13287ed8cde90d7664b1d5d75942831ed051026dd0f957f9fde0cbd9a3c81b8b2f55a9a50a4534a493048ab37b17b7da60e7da70eba08304ea66fb76f2bd79edcb18c6ce11a87d5bef4fdc5ae7d6f067d73e354c4a50a640a979f2510202411b748c407d42092bbed1598e18bb129d22d0799dfdeb1a9e9708f4e63c9bdbbed1615fd61902b5d0e7b7c7cfba3ec62f042a67752f7facb8c19ce30781fe75d5bae3e82d5f5c2f10286cb1df19abb24a9ff2fe80361cbdbee9ea93b5d97811a1d6c157e7637663db7ed60734b79536bf63f3bbfbd94368cc7f2584aec1866d67ed01adcd36773fa3cbafbaac3ca08c5977eee493afbdc37207d4df73d5baf96e6cd65cea80dabf2fd70c1b9ef1de280da1b23dfbfaee337c2e5b16f2b07db5ee3526734073c337e2eaf89f9439e3804ec757e666bf4ae81af41bd007dd63d8337be6b2cc36a06ddf5d7495b98c7f3fd680f6fbb76db2eafab97f1ad08731ac53c6be2fbeab7006d4a1cdb97ebdfe5a9d2e03cada43bfb84d9b9b6491101ab39badc6286d8bcdfa0d42237c18fb5559257c19037a6bc73ba3c417bbf7240c689bf2b2665b647edfc3f6029ae3cbb1badc5e8cd705d45fccd042c7aec3aeae0534de19ffd6cab285973516d058319bedbdbbdd0d760b426d8cb5b5fcd0ddc76a632ba08d490ba56bfeb07ce97d6a9880a6f8cc7c9e90728383df89d00d0e7e9c4727109af38b2f637bcde2886d144107105a5b632fb29c197c77b10dd1d6f0e8a88046182fcc574afcb149d8697452406dc77b674f88e36b9b330ae8abf661e86fda27f1ac1004028126bb40e704f45928e1acf1fe63365a07028140a1ce498d60b36e6d02ead8c3d83eefe9dc32c99a20a453025aefabccbd96adc6fc194a0c74fea06f1f74ffaee5c4f37e8da34302da58cbff6a597e18368847d03a7eb44e1fadc307f56aabb4d9662c59cc2edd8d8e08e87de8fdf3babecce733364340ef7cae1fd76b6b84bd07fd7777fdd11f6cffa4131d10d0eace1e7fb3afd9f82a8c8d8ace07e895b159289be36775c25cc279533a7ad01865635f99cbdd32942f0ffa72c38f2f6cee5f669689bc73f228652a9d5a93d2c183be2c5f371b6f6317d6e6e0141d0f50d9de93d72bf3cfb06b751a2aa1ef7480d6c6306cf816768dcf842594ce1df4b5e892c5aed7ba85d0a1191d0e509f6ee2791be6b7d045294376505b5f9dd133f61be1c479b2de40a70eda70c2ec24cc2d1f76d6d241b3ecd9be66db98b3662a753799f930faa41b9c9a4f94271f343a1ba0f3e39c4ffabdb7be8bf11cd4e58e77f6e376abb41d45def353c3c4c6745a020281402050470e7aa3740ecbeab5da96738bbcdb191d0d50e993c9265b67765f628b7393011a1fbbcfd86d79def66216799f4ca1d45779cda48301ca6e9b76c2db704787bbb54e1c54be6e5e596511dbee0aab9446928d0e1c74e65959c6ef1be21923f06d89149f26e68dcdedbc41ad639fe19c76dae9ec9d22ef36f37971e623713e519e7c5abca2e346e702d1b374eec9c6d5f32b458092ea28756393a5d346bf53878d06853a6bd0f74d4aeb5fdbabd1ed8bbce6c9478aab1d35e8ad59e60adfbfc711c69806c5cf3dceceddcc13de3845de5d32a1e16093ce5d63b3cdd7ed9e832d73bd8ec1962cbee94ce40d4b26d20c08f42513e946f7a273067dbfcdcde92e83d0766432898e19b471b3ee2184d8bee65e157937aa5306adf0caffd9ee6f36c6950c1a6dcbacd68ab1932f5f8e412d66ce9ecb2d4691f7a786c9e7c67472020402a1947cca89295572028aa98e18d4be1a276e8eb1bdcd33ee8441a78d2f67bcdd707ab3564f1404aaa7ef8041bdc20b9de777f90b6a71b4935d6fd7b61d7c2f6837b72ccf795dc56eda2e68e7671367dc8f45f9ef72416795ae61c9dc94783257b7a013b23aad659f1d7cfe5ad077fcefdabd70ba58ab77b25036718ccd9e9db6ff7e2214b20a27acb76118676bb00c74e2376bb550b6e7cebd4b068a5f6b90bdf4beb1f5b563a08d3976b2995f2cfd45e7a4182894d7a7df581f42d90c8681ba965994b6f95767d71f0cb462096386ac7a9556d6fb05fa3e46ebddaa8b0e5ff602ad2fe59b373767cee26abb40dbe6ce6d3b3609e56bc905dadec57e3f7f93ac31f62d50d8e26bacc56c3b335cb5405faeeed964b0b3932f6316e8fbbf86f932bf0de2c7027df9b958dbfb28bb65c8aec0707c8c1b14b99c725c5688de7562e9b57a96b3795701b78bed84d03ac6166791b78c595c5468d0141ad497141ae43657141a048506a3add345d81f73ec9beb09ed04f64857131ad4a88b09635c4b68d01a9712e83fecf6621673c52cce97c69504cae45b0c639e1823817673315ff79c6386efbc2d8f40bd216b38656cccfd3b69042a6bc6d146e8306bee569681ab08145ff88dc59ca76b0eef13814aebf7e539abec37ddc543a0b759fc66c5b5b587d0af10a8cb9659e66267f6eec353eae60a02cddedcd7d7ffb263de1e6b382e20d09be7cd2e5bc7d1bae8cf81eb07f43577d9edb6d5ecef1f11fa9895ff5876cc4dc61c08c4e43ba56ea4b87c4065646ebd4d9673cb7836d6a17ecde8b80ea12fcaf76e7dac357c52f6804e189bb9c7d8ae9bb55653d50910a875c809b978409fbdad595aaf3e1f86bf03dce4ece70edf6b75409dcd75b67f6d7b5e6beb83020402815aa3a112baceb80ca190d58a219c2ec3fa19e642a8736be38556deea4de680ca9b9dcb7ff83a429f1607b4e2d9f5e67e3799bcb6af1bc48e35fe37f7627bd90694d5dbbe76865e676b666b409ffc3671b3d5c677582b0d68c4f3d999db3d99e5432cf29e01f52ce5bb87dff328ad5b19d099db6cf7e0b5dd1c669310fa1cd7576d7bb235cc2e1cc4551b61751846d9a2631e038ae3736ea5b5f3366cf3c180fe6bec3e870cc68ef5ba175039ef4b689de5d9f67efbe372018d30cac720aecc35fbdc4a4dbd115c2d6830c3285bbef1d6fbacb280da39af74d31d6eecc9e8c725c8c3feee7a65bb39768b2b98764eecdf2cf7b4977920b7d995cf7cba7c5dc40e48fef9a4bdf7659b8e61ab027abfa77bcfbd627c5ffb14f864b7dffdcc6e43769b940b05f42f94ffd1315c1ad5136e8da542f199f994a07c663eb8347a22e7f438517c663e8f43aaad73fef422546df299f97c6a9e7c584340ae13bc7bebcdcdf6c5d3a309e03bdc2a9393d5ef6753e49df35642b2c52ec1c5cfe67c9eb16d3fafc8bb994cf199f9b4273e339f7ee253f3e47353a148390181e64db5617d32a5eab40ab9fea00ee34737e3b3f91e6e2ff29632041709464027f36ce19b71c666b7569177fdcc7c6a9e7c4020e9faf2835eeb1736e96e7e9fb1e33e68cead59bb8f5964cd622cf2d4a350d55171f1c12e1150281db6796b6b2b7f66c8da035708e23ff8dee267d7d75de4ed3075ed2121734e7ab318fbb1183b4a1050977376dc6c6eb0b66657e46d633ae54f0d934fbb62633a2dc939d58040d70768cf06e5ff67c7e273353f088f4b0fca58bdb0ef8d72b2171dce8356e758b7bf51caf78e170f5a6dab7fe57b77dc8d4d0fd09f92758bb9b6ffd7d6017a2fecfa0de2d60e5b26efa0ef39ebb27b36dad916371088492f2e0ed058efb5195a565dcdaebd1d14677baf74d64ec9be555c07ed87b9d9f9f08ccf61bd74d0ebb0661b6f9c1ba0913de6ee3d4a076b767350e60e1f3b6b18bb71b372d01c1f633fedebfb7fbb6a8062db8fcd37fdd6d8f1ce0cd07f6da7dbc7b865dbac6380ba56218cfe30b4d0abb73828ab15c728f3c311c2161b0eeaf2c42fbaf3c67932b7ee5b5c6f50d81136072bf6f66d4ae6066d73c67c677baf350c2ffed43cf9804033d4b0af349b8bc58ceb02b4a165b0d50c6fb50f563881ab0d6a5fc43263e69ae3ff18e7c5069d1e337b50da7735720dfaa283f659e7f06d0927c4c234030261613a9d5aaa41dd6bc3afb54b7cff459c2b0dca2a7bcedcfe7c1256dbfa53c32465329d6cea9f5252d0a0f5cde82eb62fbfcafaf80c9a1f46d898b13c1d3bd844de24520d79fbd430f98444a99bc7345442582e33a8bcf562d6d865d04d875da4a112c2571974def7cfeaf3ffafcd6132a8bc0f470b59bf17fdda31a8fcf8b5ba68df4a5cdf1583e65765abb83f36ebecab6150e6cc7e851066dbd73508066d09f39496bd96dfdfbf2fe8336b9d47899d7d565327132af4554e6fc31a89cb0bfa20f4cc2ace193af73952b9baa0ff10da7ed65a19656bf5e282e628ab63f79c93f3b6eb06a35c5b50662b9ed161d68db9d8fcd282fa3b7bdb189c1035bab2d02cdd3f77ec76cb7036e812a153d69f2f3fd75abf752ef27eb20c947db5ac4edc5ace3933dc64a0ccdd37fed7ea3fe9ba8140d001d618a8eb1c1b73f8be61ecf213f927ca93cf93628921c3ca1a6ef6d6e8acb419ffad375272fe897e1d225861a8d23537e38df3fdcb53e42fba75e647a71a52bda62720d04c7034c8e58dd6e6756e5f6d66f3edd8ed878b1b7d8136de1a2e6c50882784f959ebee5dc972172e6bd0fbe4cc5f9f74f8d86237b770518376ec26b16bccb28d95e5990695f2458cb18decbac7189e68d0c9aa95f82f7689637b3c83da792f84ef323ef78899cce2620675fd50dee89acbb86677b37029835a67a7bbd5350bb1832f4a0ab89041aff4e6667c9effb1e9f21854467fef32b61ee1eb29cf7011837e7e9fd15597f3b6c71c069dcedab9bf8ead6338633068ecd622c4ac36f758c3f90575f76e6d194b79b17447868b17944536db9df34d2bf2d7af452e5dd00adf7459be29db65f0b53c5cb8a0b9bdc6dade6b72de596b025cb6a0b76b9c7e7374cfd8662da874ebbed5b6194ae857ba64a157b2f62a66ddda57cfac25117afd6b8cf739872e43f9b08da0a50c54e666fbd9f7af7d9b8419682103c5b0cd6fef3df6acf46676b48c81da8cafbbb786dd4206b11868ae2d376b52ced8f0b70982963050076fb38c35cfecbacf9f528e1630d08ef0df6c10e79cdfb6ff02b5113319e7abf2a33bc45ea037e7fa97658b33837d6517a86c6d65848ed53a9fab920b34bbdb9ec48f1b76d356df02bd2e3a891bb30e7aab1db5405d6d0fe173526681c2db73428fd95f7cfe2016e85be86c8e503a77eeff0ab47533db2dc36615576905ea9d99bf695bbb3eb1ab0275ec3abf9da33f7f9935445aa840a595d05bbccc277cf3db0d5aa64059378bdd6331c6e8aaad91028deeb2e96e9d84f556e651a01136bc787a63f8c16c1b0a147a8e1fd9c4cdb9d7fa04cab07d36d6f7a6958dc569811627d06ef2be78a7b4d66b65b809f4e6173b6278a194f3e365029defd6e7ea6ced397fb54ba0cddadbed9ef9dae8d52a81c27e891bbf096d1268fedc0ee62aeb3be8b62281caeaf939e9aeab8dd6cd23d0f72f197b3df3acf1b96904ca9a5d3b9f652beb8bd58b40b18312469665cb8f2f8b44a0d3b5abcd6d7e9eb16c38043a25731bfddacf0d4ec72d42a0ef7db68b8fd5ebf2dd20d07c59fbea17be1c679e0e08d4d9f61ebadc5c95d6c2f6032afba5adaed5966de78608859deb7ccd9afd3671331fd006f39c2ffaabf5102c5a7ad0a06cdeb1e59c8cf98b8db5f080ca7ff3d91619ae2ef10ea895107f65ffde9bd9c6ac03ead9e3b4efd63a66237e86d09fb5c1596fc37ea193b5107a33eb68af9595593babcc01adf85fec87ae2bec8a714027c31eeb947f6f6eb15926c567e6c3a2f84479f221ddd88c424fbac1498562cb0de85768b1abd361c3b71fb4019dd6cdfb72cb7c99d7cc6a40fbd6fa3e6b677b6d838e06d4e1c818c49fdd7dd6626369990175d2ad6cd1626ff8644719d02a9d83cfd57a6b6d2ba1c89b10caf275d839573184595a06a1af326fd8da0c9f57ec3506d4796cb341776585ecb208032aaff3f9deb16b2e1bba17d01bafcbebfcb67616c316798b52232cde353df19eae5d40a374b5f68cde8cd5eb2c052d2da0f14dfb9c7dd26216d01a599bb0d6970fcb275b33418b20b43e1865fe7f0f65c69f5b56402bc391c50c6f74d7fae24fcd131028d4718f9640a8bffa565a089d63f5ef8f4e35354cae1420d03dcdcc7cee4ff1246b473420508a84e3de6801e4ddbb94ac4596f34f78d1a2022a21bc19b7c8b26b0fe29c02eab2c40ebfec0cdf96db45016db6e38c166756e7fb8c27a052b6c9a6cfda2fdb33fbd1a9e6a55a4c40677bf2552bdfafcd7e6d0968759873b3169d9c13d6a6a1122ab5fc41bdfa3b7c0e4b46028ae3fc8b9f319bab8f80b6336b3fdb36db7f73f75bfca0b9d6e67e66f8dc73b1c13e28aeef1bc336ba57a1b4ce07c536c77effa66b1cad7c91778ee994423df62602ea57de96d866d6586c0eb18c720868fe66efb5eb79de3671de83b2e795d96ed2616c1bb1c81bceb48080da07a58b99b9279bc73c3f4019cc8f41f82a6befbd88f5a0addf3bcc3fade769f1c32453c83b4a4b1e74d6991bebebcd9c745c271e543a732c32e81c8cd7b629f23e9952f76f50a551084a8b07dc63f8f5bcefafbf7cef809df5caec585fe7f01db4e585d83d8b9f9bf04d510b0764bd535e2833b3104b6cc7cf0a6175f5cd36e36b9177df963aa8ecdc10d6cc9ccb791dd3411b67763fcfc9d8f5fb9ec85b3aa0650374e266fe9131d72a86d7ce415d7319bb7d57bf510e8aefac5e9f37c659ca971aa0d95b73861fbecd36fc0c5067e36dfe2ec69edf638701dacf6199f3c59dfb59d8ad1f939638a88552767f37d82e5b8783f6bdee18731c9d6451be412bbeaf3e8f6fd6dbad1b6b342d6ed00b9d943167e7724b8759e40d9db45c803a2be5eb18b35f092b6b83be76b1d99ef2c9f6f06736a863085d7ed2e118ef84710d9aefacccedfc76336b5bd5a02c339871ab164a3ba19569d086b6c1ec2283f2edfc875bd0a0ad35699df5f6f2c914fad288541abd262d6750585d6c9261ebdcc2fa6e633ae5d66e498b1914e7d9d2bbc9361f93ce9f9441fbb5ceefc2381b4ac75f936821a3650c2a638b98bd88678b12ce0a02814082b48841ff5adcadbe742ccb3bbbd56809835ee736e3cb62953f996b6c0a500b18d4e5ebe67d16df93b146fc057d8e3db731da2759735dbda075be95b8b686b20bca6485353a76cf7fe164ac4a0b17f45908b3b3cc2e7c17ca683312a15257d8a3d2b245ecead3fd3df60fedf3162ddadffc5ba785b64556734b967ff341363f32779fabdfdadac293c8640f4277e8704e29dd9c537afd7619d76e8da185313e913dcb4061f6971b94f8b56a196e28528032e021030d9e31d0fafad9dbf6b27df9ed8b8146dbda64f7ba177386778681e2caa0b3d1f69db765fbc040db7c36ff5b8eb16518e7176847986b96f1566c2d76e7051ae19b11fb85d17b56d8ba402bf49a1f3256e5cbd8e4191e2ee456ad9d35ceeb308ef96ee161cf9f3762c75ce3a0426e6a81c60a9b84d7d61931fcbeb93e6956c09305ea4c5a77573fd6f7df321628738ce765adb27c050a6f8dd84e37a13bf7b756a0ad3f631b21fc98df4158053a1f9636becc1ebbb7e1d00cc34305da22eb76b5d536b37c971f179e2950d970c573c6c9a0b437b72c1e29d0763046866bce6e3bbf8b02b5f062d78ed91767f3f9a040ff3993ed6c6e5856eba4c85d3f36d13ce979027591b516676631d71bbdbf848529644ac166fdd8547a4e4325a4c4e384cb6c7eef64b517bb2745dea54abac1a6992634883181bebcfd72cbbe6e9bbbd5b304daa06ccf62e337dd7dd7b0dd541bf77f4a59d8ad049aaddb5ce56d8b638db09340ffdeda8c5d79ad336c1d09d4da6fdd629633b7f6e42b8dde944fcd938f29557212c573047af1c3f6af56f95cce2e1b81cafc99759eac59ab1fca39a5ba51f2f4a9d1734f111c119c6708ce230417045a2b9eb9fe74c6327eac81d0fa07cd8348633ea0efd3a37bd1c25cdb7cee3984beeb67734fefe7b0d68ffdd844030259cc5c77c0d303d73c68a01d388f0e1ad4d66308f51b1b93b2da371993ce5308f557b1633dfb5d736dfe149e1c50e66fc25a65b51233cc2e0e28f48c63cb58736c26ff06f4bed6e0d73b21966d56b701c5b16bad8ed967af3f096b4067bd19bab671da66cdfb9738898d06b4d5077dce6fdddc7b907966402fb336e35a3b46fce2638f0c6875ecaeecbff8e5ac528abc5d211e42687cb71f9cf8ca6a6b9d3f08bdd2c2dbac7b6f62586f8b8143eb62b79eb865f7fb228e0706d4737e9b6363d3b6eabe89bc597f6a989c6a663e339fff25a69af802fa6fcaf9d239cfd11f211e17d0f7fc1a769f4eded7f0f5b4804ac76476f5ca5aaddfea22efc802fa564ad6d97165b7c66805a1f0bdafaec9d8f2e2363dc2157802a138ced9de0db3adb2be2cf2ee06ea1b7800a10c33fb9cb519366793c1383c2aa0b2737c3da1b316df08992705543ac3edba9433cbf72da3c07302ca6e93b15ef7d8bd76f89a80d619d937f7fac29b7b4e4f0968b6b09fdf761b7eb558b6e1f983b6ecfae6e7f13af3bf924e0181dcf39080c2185dc4b83d3726b3bd226fd7271c5489b696518a670414db06bf62d92fe296f84679f271edf18356dcdeedf76beb708d2ce79442fd2d292999462910c8d30795b35b67696bb3efe655e4fda480b030e594de89534de9453539a577020402814a261b1bd30d390f1fd4e179ddc9f6c79d5dcaedf088a041d713029a5febdb0defbbaccefca750eaf4576640ada5670fdadae1f95cb76cf6b29c22ef99d3879a0704ac7395b6d95827660ec567860a5cc23135e15c6c09783ed013bfc6b1edbbd69e09f7043c7ae0c75cbf19716e35da6743260c9bb52c3c79d0089bc326d9bbfed3f3e341e395b3276b794eebd7af07688515de5b1f3f86b164b303b4b9d9b13d6bb8a76350de41e7ab2da39b99e5dcbe7280fecbb7318c7375d91d3e3ba8633536d998b36e98b3ab833a9f6eb60bdfbec33e596c0f1d0d4ad6dcbb3973b1dd640f7a3640ed641e31839e3d73d067598bf1abfb3c5badaf3bd46d051e39686e6ddb6ffeecdeb919e7f068807e73b5c539675bd9e474343c19a0cfec7b0d321c9f4396270628c4b5e1db6be3abb2e58d83c2facf5f8b6ddab7304a3868937f21eefcdebf41f3930fdeecf8c1becea31bb4c6b76ee22c6b8515fed4c27301faceb1b377be6693f93f10e8a6dab0323c6dd0865d6dd03dd8113b976cc6c306b5ed5a97ed1d86f36229d7a06f4ad9f5db56fc98b3ec4fef89470deaf01b630d3b56edac2c8bbc43adbb61514f6ed250092dc093068d1f61cbade696d0d9746378d0a08ee5e79aec2cf1edc7f90c3af1cbebfc2f668fe3fb2b1e33e86cf279df161ddeafde6ab0a852804058d4130844432564e32983e68cdbbb5d7deb647553e4dd6eea890a1a2a2193870c0a6795edfa61ecb259773d06b5ecbbebd76678c6dba2185436682d7b8cdd27afbcce3c61d0f7662e7a76cee616a5570f1814b68f6ec2d95cdaf8b0309150f7a4a4f52de5a05e94bfa8e42f4a658128475110832008009088cf0808000063130020381c18908683c188601ab75d0014000442625ca03c2a2493c8638140200e06511004611002300c03010c435124a531c85c07b11924c55b3a4b80262fedde329a8ff84d57fa59a1489ab133c5b78f1c747a96b29e439264cf8233a731f818dbe7487ce556729495121c0fb570b50ad0993ffec9cf0d190b58df27ba98a81805a7871465a544108a88a439f526d866588b207ac11622c7ef078270009298815348241aff16efe0639429a41561e29b76b7ec9ee0c832ced39082554560beeca44b9319a9e46b61f42d13438e30998af40a3cab04a1adcfc515348bd2dba0994d6bc9597753973fdfff536a7108d9f90007248e229af060be07c7d83c4a68e75785f2b947626010ea80259c22616fbe7694c94e4c1e6d8772d468a32148f9e1385e6bfc35372e9dd1a5b94e2025617c0fababec836845f34fe7b1451089fae6c7fc7b4010b67a889d6affd121864cad8f2a0b8a05dd94a4e03fd03f8a341b75a467c64d155a95328e7be0e165f61b696b74558031906223ec2fecbc9f11aeaea5c5e353acaf13e286be01206291b177c6c68af1bb19718991be182bcd4625b2614c8b6e1dd5eb4662cc2337f3582e3b7aa377d4206f6a5335d38caad5d163f010058f0e38271254b30c6a44b89847ed535337c56e5e6fa6cf42fd42af729e844ed95fdf3b241bbeda2f25a69a0a442adc132038f14a86bf42ff620de7625acd089367b3f5db46b8c37a323c48500dab952e214a2ab7442072eac3e277c15c240e4bf6b3b4ff67a9cf123f4bf259ea928f31775e676a96a52d3fa1652a600b984b2906022aa56efb6d82fb528f8f32fe68edfb485ee5ed461899f32537af0ebe29dd9c4e5d5aa265cfa3295f79d5437c86a8600215b5da4cc692bcf18da70362388cd68f3c5c0104d5abd69a7d98375810de7da0ea9de0992b892ec697468ce308807ca834b6cfeca13c83767c49be83451100242c7138e211088e8c63378a62236f6dede1dd7ff1be9a9183311ef18b071b0604f3143607c686a81d9418d8df63b48289c42b46a0795b6894389377a965a83c924802edd5a8b582b154ea81cbf6cc390ab344f1b21d19c6aeb2897bfb9ee4d6665119110dbb275562f5249c35ff11acfad50840ea0eb08b1df24b88fbe7e5a5d613c1dda635e280f69f959d38e7590885072c9925864cc8468acaa91fcb9cdba27d1977239562b97d059a7cb360bd971ad38687e4440f8103e5157bb4377221283665f433144af1ea3fa36a9f6f00613d616f1a1482ed6c76ea850b9484ed499dc336f400b9668c0432e462ca2f16ce07767828ea5eb554d401157a9646c64538a530843cf9848e32bfa592bca1ea6f82f28232ca3fcc9098f6ba81e60c370398540af6a14ffaf1732f2c98daa6bda0f32bada93fafc063b3669ea69329857a49c835c8bf8c2f6f1b119f3f53b3377771914492b2994942131b7f5c7840210fc626e1d088ba1a01ad5890cafd3255466cdda605d420320e5f283edac95b55ce8644150ea79d023d23ad66555527792f771c9ee89ff9c04ecc8a3157d2ce4ca6bed77d5f66f357765279b5d5a1909dd5d8429455d0c91d6393fcd80cce309ef4769b52eacf52fbbcabb611ec0d560c409e32b7595c4fd386b9006dfdf93f8d8c5ee9c2b2701500f5a2307e65a1891f4b3f4c52681525978cb218644ad8c1d5162cbb591235d48714d9a514ff385656c59fa38c81d1c485b1801e44082a0b27e70226f90ab7e31a04ddbb7a2cbe9d7a62e535186cf6b593c6bcdba1033e61ba2d8a398dc0543914f6797f784deb8132d119eee42f81d6d855b974cb175a1e361062a0ba03e93dd983392462f8c11a61a68fa3f2701966bc0deacab4e69ab580977d216c437d04b2bfbee3755193f68e10bfd3e8c1a1401a2cbcc26e12eb47f8e6af944649eab3caa172999c43aae1e520fd39a036bd7ad664bd8770a61f935d713ce406e221b39f01ef6e26dd6f641c50eef166d5cb448c1709e50f8602251851185173cdc274f24c9256c01381e2e6c97cfb0b5d66954d219312604bae24165554a04c9650d60dc09f85017b919c2ea7c03dc1a4125550961f7d977e81ad4f770c3a2190ccc94446751ad4016388cc1932384c0a7546993e4b047c7918cd40030cc50667d2f6647dcb5f6f6bbd0f56babbde18a852b4c549ccfa16dd06a1d43516d385002d0236f23536d4cf194aec0b71a97b5a501d0db4743be6f66fdd473e43b6a2319dace40087708dc21b22a42bc00f100d7e2d56a959de339c21776241e7860d05f0391d281a491312ba265fb5986bb8b779a33572f8a71ab06ab7d88919ce4ea74a0d0a3f1522131e04bb6e0b612f71a9c900e688224a04c0f818189d66e12f17c394b82a1579738b0b4077c7422741ac4230eb6d93d972e6df382db16a9ddd310c5450809df543432a7605745b6f0166376723ab5ef347808a7d3d8198191207752e115fd6b9c5e57ebf6a49631b58496a2789f8a91728c93a9ef70a710d327e83475610635fc7872c6f040bbbde843fef7d9505403efa18095eb2d6cfdbedd929f08e9f6e38d7723f796fd251122dabfcb27b5ebda8ced6eaceab86f430e47ed44ade9889b1a2c2d739336eea44205d4df56558752e2dcc496334b79152f657b7dfcfd99647c0e6d3813837c8b14915b5013d749b73951103c183eb84e877aa174cb7b9570dbc93c12f91d61e0369b6095e2800ed197e94e352a8c7c3a1750e9ea3b8a5db8a2acad9264d31fb6359cd008188f983b22c1f2a281176d93543e93ce244679aa0d6916fe7e12cee65e59fca20ed138e60ad6c8b2821cab852eb9db459724b9a225aba01e5deed722a1dc6b1850d8e9e6508098386b2cff4bf46ce003baac44e0625022e4bca8d6605449e5060500c73bd631187cef50b552780af4a524d840466760c0d1b7d4f741c86ada1e0f170ea6cb20f8b56b5e9a05b90fbeaf2fc0df6cb543a1b343ff89532c08a9d533529ec9d18e6010405609308c719d61a14aa7260db69053f3a531f2c188134a4cd806c49b65ad0f33e7c540858f2c5d9af7939a52c120c2dfe9b1c517e17ec48f3775aad8d94f4c9ad8d2e8722e0257d2f408b49ef4e0ed1a9c622d327b6364b3e6677d1891f1f0e52e968f011851554c6a5c88b95867b7cc08f556c14a205a1c695215609f9e070e11ec9706b1a3636693381efbf02b645d87c30219de2689d480507734e6afa80aacb81c30de7b521f4dae7d4f52c21770fe918efa0e62056e16d97dabecb165dd4c8e610a12a236c7945bfa5e900aea802f880a49cf3e4f1d181c310ea42ed700369d6f26aab02f4a44a35c175a03d83bf10b0c9444cc072e4c912285ebfdc70b8a21dec955afd1f9448ad79b4970a78768dae7ca9880301a6dc0ca203e84906d0be09ce3278fd62b7e9ff89bdb3efd2f2c595e80702b98251b5a13344a4b325d22cc8e50164781f5440dac08f7d442373e38be5ee623c1d9437e0e097e3f4ad454747e4e090281f13422956e53330bd4a4ea5cf80064cf72f45fd0b39baa7c4a44054c8f05fe7301eaf4a61a91510e83a01bd1394f60a58cd00fd0838e6041abd45a8ae8a0aae6211412abea24be3c96bf4a67504befe510d8ff4ba4079215879dc8c9757ff96a78c1bbccd6a07ae3a251776fee52265071d9db29aba4fb4180173f52b73dea8b2f6ec9e619bdfa48ba85573027bc5ed6ddf46522e8493a58302f14cdbab2630e5d8093d2d6612b3cadc187db93f515e7d8ac14c89ba31ae9454573174ea4d1206daa3cb3b11b50e97cb367d2a3e4b6a364a35aaf622069d3be2444804716df3c59d24bb7ea170fe66f04d0695861842308face29a9df266dac30801293a01f3ba81e7dd81804e8ca23a8c9840face46f8728149169bedf93c75208ad649dc8d92d377c498312bc469a3298d53b97fe2a913e169eaeed771fbe1c452b68035c49ebeb9ccdcfcac79aa66f61fa704449a695c40faf748bdceeaddadea53aee7cd2bf44f7ef84891e29e82a6e6521d1ee70e8661661b8b23a7e9bc831f705e1b5c286ab3612c88c952f19db5cdc99648ac131546682d1c3e7d20c498ea9f4d509810c9170b8cec64a4d1e56778540ce20221c168cc5b702fcf522cecaddcdc40a29f1892863b20ff574bf9c75100d3fe45b8d0b01260e3cb7eb704932eb9bdb6aa2038ccfca40e68f12b106807da2b8b07fc0e6c8ac80d599f94329c053f0de04114bfaf01f7b27c469886f2725df964f51b8056a6481bdb9cecfecfa2492bfa9ee5c42b2943d371c330fd1ad814e5d98831efea37a32c800e9bf2804ec8c36f87907a4ae675ee458561fd497aabee44eddf7270e22509a833e18bac166b082077145176839adb2f55c9b6986eb3cffc3b759350e7a768266bab7c458f0a62f979660db367e09df5758f432e0afd8b028669e75363deaa6bd5a6018aad4cba62714bf7af07a687fdb8a8c3b3b46950106ac52341af4f7a85a7c2d43c813cc065dd48fc901d92413b092586845392706545002e6111d225f86145297b5a3e57aa2ccab7a93d86ecc0715afb1a838be4e9a4f501db47cdaa114a68a66faa92d122c75e953601cf8137386ef8b5e550588d80f4bd698d6ceee36ca7608d2294f19af8941fbc3d33a830f0368166d0005bd6187cf94fb0ed82118578398650c6a18d14e973f120078bd2dce6ce517ab5693c8bfaaa0905c581540f91d749023f2e8ec462f14743f8c1be024731f0f3f447d0dcf626431d3e80e00cc5ca80b2806dc2ba40067193807e339976cb5416fac524e686311b554ba12511a5d4520a298594aa94424a21a59052955228a510ae4ac5bc16fa349618ec309635d8612c31d8616cadb1c46085b11d6359835518fde019c53056e314b0e1453ab7bf7738b3ab811b4341704a441fa7801c887f4e25fc61039947faeb66c97d1719b04279ea646dc0e59a231b7c3982e58a83cdebff746f540e642525a6c8136fca8b8bb93651e85a1ab881a3ae6eb6cfb0a96b01017870af0a5f2468791f0f6f1ae4cb01aad52237a6a143786d41d1fd7b865585c0f97bc2dbfabfc58391e2b2dc105eca4570e3709b6f14edd7e1e2f8b331c7d400f951dc517035993182d5676d22b9e9d570682899903b0fa003774be3d28a9a501a22d984b07cf94364495163742d4fb708ca5d66781b4003b77ad146321a158d22046e1618a22cb302d071852e5291848f7da4a5aefc8e3c064507471722649d1058317d5164a9d8bca18beb9c7583b6775b220c622628755bd4d4b74e09e56545b591b3a03f7329aef524f75a3964866c9c26e66b77e8f2f5dcb751fb15e3cd315015ed723b8d8039a09e9d11f0e605c69f730b89c13b3c388572148b4643a6328a9394aa81a354e46c9e2376ad8c2ba3564829d9e71ea166dbba00f8e5e47969e19d5b2944e90eb136ccb15831fcd8246d25a616a404f93b50162138c922b621fcf4604fdc0bca30ee8a95d207c687f3899fd3a5eaec65dd38c49bb6e9cd8a82c98e4d9a3a52cf2eb1cb103accbb4406fe7e613c723e5dfc855ae76de93e74eca8cca48814839d984b990441bbcd5e8c26b69a14e201c2bac093de18029bf20fa65cf097fc7f71c522f575d66253410b045537e303a0b4e4b831ebf3123db74e5f82e51457d28b514bb90b2347d492c1afa8d65b9bb608caa02fcb087f11036c56f0606de031117c903662cd6ab5e1af9a2376ffbf359471b636ac84909110a24e2ee2d8ed69a00adfa3f7810c23863532c5c4f0617631e666900f3719c13b948e5c5e83a2a77a088c86411a8380d4d8b64fd1891f1658d401e2b9332692cfa4bd2ba5c3d88229a3f7cc0783b0076ce878e4dd7272c00c6f444ab17bf1128ce694926d7ab014caddbc2e0f6befe08ca54bc95955d33238e0942890dddf821a0b80040fdb0f5a70a3118450d039b41006065069bfbc08df4f0b4e2d5a0181b9c444c210a427e00144c881f647139537f7cc783c1937ad9b49ecb2834c18c87927a16c96a8dffd2e8c4cbc37118a2cf4255e82f04dbd1d29f50c33b36c5d339a04fdf16cf5d1b37d3984595109192ac7d6b98b69b7d1422c46a00d6c8b2ea7f54669167116c98a15864686c884c30abf8dfa49e1f9f9dc1541ee69a72a0b87b39017577e2bb1e7b0921f302edf1281c09e86188b0dea94841039861e23905272e3c3c2333535b35d74c5604d31b6aad62ed26280ccc5cc629d3b1256734c2dcc129962fecf823c87045e881a5e4290ba83b0a043e94aab614eade856c0401099b53ce11131c3672cbbbc6b5e6edf4c693367023ef97a13be2f1f992979f2fc3a73a8e652a993d1f236e2c6083fb483935db4f34a245fe5180afa257cc8ce156766a55805a9bac4fec4b44e566c0c2b7fc9a0acd13cfe2d624c12e37be95c18755c9a7b31a44034511ad3c15e707143e79d4f4e208bf754d7cd441858b23721caac9fad2941ddace08438c5ca204b07e5c5354c528b86b1a46cda81ae091d85485d713d5944dfda21d1cb3bc86a0e1fd45b073fe2ed388a657dbe57af6ae604bd1fa7327f6171ebe0f3d1a4bb82df93a03b2dd55ff655e8bb6f3725c4ecf4acffc13fe3354df4701c80aca9e82195177bb686fdf1d79458b70f09a38a434e0977d4e00567ab96ade935108d6a911ca27b167c2275c93c3ef96300bc83da8eba85e3364685a5e3d0f6f0609aa6b43bc6a07e457a94a30008fa15e9f71f90d27eb84688e5f65bd5172205220ec39c1312d42f320ca7e4793fedcf055832d00310d4b50f65a6037c5d7ad1c39b2aea05b86ebc1657f924103e4ce89219ed628530cd053573134a9c76a2f9be8de64693d1ac8d08a437593243ee8833cad58d76d738c317f9bfe64ea5f745df1aeda5db032639922ab3c1783878269e7ba81a46c91954ef83e289248da7110dca0ccea4c2809e8e89d04e39010ec9c3e3c1c0141dfae93d552046bac11843bad0c71d444924a9d6441d72f95f44aef4173dde8c3cdd71ab64ff511958cabcc5698b6fc030961fa8b46e0d728d32c2480cfb706c9098a0ad000c2bfb45662890eac0f603031fa3822ef246621def6195746f9470478f34c27a60834b9654ea74ac4c6511427756a542e3149e601bd59e1748a64440ab035dc0762c3d1d2f04b81e26a1e449f0a60bb197e18e30523d490f72b9b822f912b288b8f83aea397f0a4edc1d30683fe294aa00d22d83c45d0541b90bc9463cce6d7223a35a053b8a2d62fc90bdf866cc9a61f85cb469d525fbd15b19ae989b6d245356b28831f0ee6a20d9ac4aba294ce45a6fd01a1b18a520a25949c3c424797ef255c8ebbee22896b35878cfd2486df68f7f2951537e825043284895328f63e054128d72c58b5df7132c7434e410fab924f413a8306e0768b9a3702f859bcafc508672740f292583cd2ac2ecb88edc5699e9e20d146a114e62e32cce802871132e2ee742c65584af582ee25c457888cc454c285e03ca8883f79e19d23085c365d5188902c229ff37b6a3f39f0dbea1fa049dec445ba7c2305e50e63f64d63e9b3533b6e7ace71b6b79af3fe47ca09b6b7f4d61f7a0e3258f4ee817779f19f0ea331d831689370c8be0f2556e66bc21f30d3fcff24788aa8cf44fa7b1e26d6e6418fcf786939c08aed2bb5428f0168d23f42d662c4468ef84661aab832a915e66d6794c580f41f1fae5bb368c1cfc4511a1d46bfc208cd4a2c7c482f4821cf9532073e48308c4cdbca45161035ae4bb75896c091ddc2cb5e68b4331f0b3e05d88d2293344a3b931cdaddaad2001bc2cb2832a893175abc5894964e7c89e4ff585eca56261f4209795cd25ad84f2dba3a43a5b6377f0b187aec0f6a62fa9b3aab8e0f57d67159570691a1b6536181065402fe1612b4315948f8d59e8fb8c5ffadbe3f7a51a9ce78aa8ffc991e1477288c77502e6f3d0e475ecd547e64a0f34a555e214df381f0d2f11e287bc17e5b1fd2ff1bdfbfb1cbd32598e35fdc9f036c07c43d97f1d2178c71a2c6c223befe02f5d02de978b2f6136cb00b4e5dd521757dbcd2b698052957b7ec450aed2bcc843e6e94f55cecdd8db1a37c4ed7dc27b37465d3b5b93abf80a3496ff759c8d504e50dca1363b724da70e4ef4b5d1d67ce214ac92a1bf08ad918df7c8fa56ca210a4f5ca6c4cfdb5e0dfddf7255f737d6a137d74b35ae4b6a41e856ec69de1921293fa6225524f4c3fa84cc1a3908139668eb8a719db58baf0486292995a09866ce4cbab5297f1f838bcd11ce241d14e53a609a8d96aad112491e4fd54483c2822df5980d3802d04bb50adc1a179773a03430e47bebce09d58c14e1a523e4b8ce22140fbf364b8353fe478224b11ca4299f6a9186d4af1fbeffe866cdeeeb5d9ad6d65b1ad7f29d4e4f52bde140ec6ace4dd009c24f5a95485e1d4772a7ed5615c58f4b52148917a9d04fcf7f25062345a36effb1bf6c29ca4d39b9075473161cfabfbd29694199aaa9e7ac24f579cbec301bf8c7389416be52785610583bf057d7acece172e60601d51447e5b2ffa6001810171d27f8250191e707182dac3839a0c668d67821dd8d1437bc674b38fe85a4eed3c837fc8c61e0d35d62b3b17a8bcdc179fd754ee2b29abc236d6acfc971be2a61d773a859e20091366e52fb60b1403f07ada7ade8513418de56901bcad3bdd12d8891cc1a729b5d918dd391ce9e61293260b87d7a774ae8fc0e97c9e7a2f92c5a8dd30ed0862a2481e959f737064e44849aa6d0ae6460512668a63145204d12b2f3f3861a33265e741050650a4e8d323d69c54dfeeb64c36dd704bd499b6e7c6640f1d2d6369ee2c1aaa39cead01b9d65c3305018f1d4c4543c37ba19bf14035f65dff76f60711a393911ed94ead81835ffd8995e8c86bfbf50a21b011ad0ba982f93380d8ecbbe4875e0e3c82be418274eb6c0f830916d91d3b8e1e93fa13bc722cd3daf3418d435967f583708a44e40a1fa8ec0d502b8fc8b3b17c6f391d947cf2eba556a2800a494bfa8215aee7e940722de576d6ff5e97fc5c14474be21ca5f2004625a3ae30a14645e6a05bd345add01b648f5083b35025f9e635ce6a5b74c029fadb65158ee1484ec9840551b7bbe217a7b6874bf71f6d94fa0f04b58b7171234da3d5ef8c0eee2240c66aaf2d02cf689c8598257dd7ece8fa8b59ae05aa8e4bda09c8539506558f95f512411031be75f9b01dc35e16f9780984540d3ffb6f13e4f9934a4abf8e4c9c84051f42f4aa564a711a69e6474b29b094431bef2ff6d8c301746974334c73060b312052cae215a0af4430ce4d0b0fafbd473bb2c332da7c079be44a60f0a74b0fbec0a12e8a9ae1372bc0843683711d8cd7abf7aa031fe1c49cc4b959aa4de8cb3773ac2c9d397decbfc8c6d3566a6e7c10656880bf78795d63860d518e757faf7ac1b4feccf2fde5b6d3ca162a9646b60dc60f42bd5eca13820c577b5b6d3f391a96c32f14bc83776fcde9fc888e6223f1e57fb6c6ff12cd7336220a97d75abbc3926f22c83425461e2cc94e7d4ff872bb4c6cb864c44277e0053382e234307e56004ff2deb70038b8f4ed554835dd2ce0a42b367d1141008445f09171e6e8d9fded83019ad6959b857b32208d75eec9981a72d690f5526c1db35152284366ff94fa7a432dcded3f501c232f1c61e78ff75e920a8c8bf952229878e1a9ea1b30835b11cb45019c44bd3f5d9349130186593e9298e5be2e47eeeae9b63630eebf2ac6aecfe24357ffc28f43fe6fa8d5880c299c5af675612c218e1d6d4543955d709600af62630a8f3e658a56b4e14e97141875f598c31d0e3a5fab40ddfe1e83741872ce4090f295dfc184d6e7d599ef74bcbf8f285b7f21623d7798509a4ca29131c10fbc9b15873ef7226515fde7be61c2350cdb73cc8eb049a4b52870dd7d769a41a7f245bfaf598953b1c680eeb871c719e8a33f1891005adb55dcfd0c9403d8a3513f029c0401c28bff27821429fa738c87d030fdc4bb89148474d3d8022a3a2c416a9955b0e0324b65315eeeccea0a79c0cab0de02af8bf464edfa32fcec0fee1ed806e6a58c840e517e7ae082d2a74c6efd714a1df7f849ebaba06e8d1ad98a960cf2420810accda0ef829bee0808ba5a392c0a86bfbd4a52955bf03574a9e449b56ac080714847ecf2e3bbe4d6203338ff0f698b61aefb265d92925f1e28764c67245f0db612dba7fad7cc141aeeae96f5aa38865942c5e954be09beaf461180da3bdc5b63f674e4f66e483c6e2ba13714224f5ba2ae76c400b7a3820813b1ae845d3d264ac8b39cb1c10ed9a8e7006c79baea6818855818e1c7a133bc78f32cf7314052e92f198451048d70d1e8547b0b394861244bf00f6b3f4fcb80eb4087784302b14e93cdd5a0af9af7a72d5da03e9e794f69e636b95877bbf83f616fa4b7f7f24f45ff407d05a58b965b2e7d3013523e16a6adde2ac1b868935e9a60d8bc4601e4660056797634614c17223233f43d40d8e1be173b05b12480969011d20d9608c0f7efadee14feaf5fee6de8138648edd94735be4c8df60c986886bdb96897c98fc80ff1db55785222bd02dcf6d98dc36499e02073d53fe2e125a5442e7c98dd7a74b4b5750e7924de2f644ed882c613f9694d16d11cb0f17a1bbb4fae96bc930f0351b41051bd9dfaa89fffb750a7eaa21ff022160222d80130d0d921701aa9b32261b275b39db301b858d9cad8d0d818dc686c0d6c686c0466343606b634360a3b121b0b5b121b0d1d810d8dad810d8686c086c6d6c086c343604b6363604361a1b025b1b1b0a7c5b5df30326c444d8b2b621c26a1b7b085bd21611d8dac61096a30922a8b5ed8720254d1041bd362911a4c4268d0b4a6b50e80d4febb68a2e3d8f30c1d927e828df28f68063ca3e8cfdf8968e26cb722531cab3cc0051321e5b79d91c4f98ecbd07cda43c631687d300ec440e7eed82531b1a7fba40d29b34362dad2ef27229a307354c11dc9bc4825a372bd9c808eb429e77f991542be3187c9103bc296f7ef7ecfb6a003933ccf9a17a637031337b6ef49b083ecdb0dc15059ff0b231a4409cde58f06a234be4cff46cd49d716e0a7922ce4aa81cd0e4fb439325501f8d467e63967dcef008bd7f3f5ec57598a571cc6ffa5394e168b9d7eaeb353165f6a82f90bbe3b61427aaf015f1c5af49d8ed4daf28c0f04fafa1a82ebaf8ae4474a60437f03b482e1dc7c180ebd30aa703d1366f194bd593693f0947939e65df8a2099f19666ac7009a86e25b184a771dcb27b0991c6dc96750da11c54b7c473f9cfa444cee3d7d9af8b0925398685495cadf9550d641b9b6f6addfd2b61b9eccd23332b3de994d4c0f37e5eb5e089cbeddc0c095da43a8b1a4723f7aedc00595c218e6cd4b4f07005f89175074e2b27f2ded393fef3fe24298862b14472ae28d3c618cbfeb3500a293528e81a20cede03b10155ee354bcd103a107e828708bc12f800f8da70a65a4a28f1ff5c7cc501d3e5508f39797461aa666f532426a6ea816a4125b5a462a0685bf49a91e9a856051a957df41161f3c52748cc777654d8d144645fc343be1041cef86530b886bb26c20dfac099d3da681793779d9cc6f2041d498b1334126dc85148b423a320d94e8a8eb405190a89566414e4dac9d090b5264527df0223db0b6643f2cd0d677ba89f7bdf60ff2a1d5b0c2207ed0591714178ad9f8113dec8c6a6f70b953db894e0cf4167b41c711bab4e1a0ade59310a65cdce539d64b784b858a3bad734c59a644a438b299cfa9a274eb0de0ccf5b65101f94a58979c4ec36f3bec9b4376aaef271f3e92ed4b11bff6afdfc443cbef07bef6a5dea3a3a8a9913ea8a8daae039bc0122052250b57ac5d332f112a58de1a7ff6644293a34e1f1dfc4c5fb4389df62eae0d7fab2b9f5902a1e6ff1c2a1a91e4073cef7984de806b97014e8a7c2ce5f398cdc6f979c93f24ca329e26c41eb7ba44dc19ac4ee35233c1a4b9dc563fb988409b1b738f573d3941941140158617672d4105e6157cbae794cfaaba12c297327ae02e5cd5f05816368c658aefd802a1086eb718c86d39ca62d43b8bc378c12799d56e54535e00c99eb3d64f80a2e1a8f943b46939d8e9f49562e69b7f083073710c342a80e96f16dc97b12b5fae4da2d205bd534851139ba4f27363be41221df64324ac4d7357609b93206dbd0a1fd67e8679afbba2ef2d856388ca520cd88129eb8da838e433707370fb2f0342a1e7c2e07295c2a869dda0957a6bd9018f15068bc2a16be400588c7e7b1b040af16afbde4492ca645d488dff38881ccfa9bc737564c8580638f5159793c647217c547706fe7b01d1a4cbd0b589937979839104bc27aebfcc716750fb174ee13f68a5e61db1bbf73115bacc35441c6a6a9d227e35bced26ae9bbfca2887976ba3d8f63dca51248b999a21a6351b6e58a84dadce75ded94ad5a9e63aacd79a59afc9441ccce58111bdd33fa7697571918c3c936b38c45eff8d1213a294bc7ced6a94e45bde3df36f03d091cff2d18d357f569e1fa9075efb52457be40149aa9d99c205140651d309244bc267783c83189c253397f81a73b961fb501c436e71ea030b92bc7c3f4b9e6e484b6711ad3579382fc2af2d9000b69772082502c12a41df71b1ddb334910b0963878b78d52e825ecd898d7daec2b2fc43d7d51eca8add8ac982a26c757f15096a9ea30cfc23f0477467dd37467db79b9879b11a17aee200afff0694847ab5d4a6d54eb04cda0c9ab890e9a7101fe7f20836ba3a90a6ac7646e55c6310eb33c7e5a73cb84498369c6befbae1cbb9dce0f342354f8e950de2c9b753bf313f343784b4e980d790d6af7bc70c8a65a984e60217d84eaccde2092605101adbc105463f5337c42e152d34346cedd4ce0782803f18c2582a57b5bee8bbdf90f1e2a8f752ebe752739772630b482f9e1d2c9c163aabcc7ee1ab789c28c9e38ff79a1fa85afda8956344bbb0bb2883f3507271db8cfd68f9ef35b8786d7125189177fe0d6e88bf078357b06142577ab4a142c3d3a80b79254ff0601874b7cc892602602940b502da0c7011ba69d174898b96305e3a8068d7e8714ac0a6ba2df3fb5f9ce3e47da2cf980ab4272e7f622ebe0f50484827d074c52d46736c535a56b865645bd1e0eebf53c12aa009cfc50a88373d269fc3f36b69021f3a964c4522ebc59bb88784dc7a6d411739d13b2850e43958c90170282ce89a7d637fff0a736c754b0fc3962e04c31d14737d834734b8d1b88e6d12bdd4ca8c2777063866cd43bfbea6e3c14ec6f51faefc84be7f90661fb87ce1ffc6acbdf7ea2c1cc8ce65300b0df4729261dc59fda289d0aedfa1b441f3fe99787edf6fcb1dc1f21009921f5c53898861963e759c4f062e24e45e3ce5fc13545608dba2370ff592e70cd10dc7d8a6225b1da064ea31899572e25899ee6d251ea97ee55dbb8f96cf7fd24a37c40d93bebf883c5a1c705f58f1f9a89bf32fc845fc459f4fc78481bc7d7b38cd73dfc2978db9f4acc09a12e50b0409fa5548ec75aceadc6263f50f6e748465fe2538da34787ca8f7d132aa779409ec2d9135c0a1a28771add07a3df03b6e0f6a8c7c87fb4e7ba1f9bdb7f8c4efce8ff9121b0c4e6588bd3825f752df4ff87d7fc99cc0c25dd3fd88ce706f240c6f27cca64efb8d1f7389c196fc3f1fc3928927607e54873c45d972d02b698c84792289fbdb62acff3a567370c81a293c19279a0130adc9c53f3a2cbd94c7a6162699bf48731a7d559aa2c04bb69e0a074850ea5fbf8e7e8e3e7d26e789d4e21ba6b56baf985fcd66088b0bd36a275f3f6b0c1254e08fc346d43c0acf9eb62e53f0f87e593a3fa886dedd3093f6e90ed1b3cdeaca690ecca9a8cc7a6e65a17a7f65935991366a05520747e7b672de39679a6590eb439bb000ef428255a0e995924f0cc156b8e201ed448318388c44a7496b6b681007b135f9868304c1513a8a9dd85b3de4fa8ffbb9189754057115b25f1ff12b923c83b5313049489d3742ed1715cbab0574142f4dc5a0840bef439e149f4361f1081ff7ce573c8bdaaf3af8984d5b81667dbcd43a2c5211be583a54a53a5c946b5acde4482a43881dec741c68931a4f8404ab8a1d13500b692225124011be7bd611d31e4a1ecd2cbdbb813b368c2a30cddfe2302376849cf0035b81cb2f5082b7813808ce2570adb431b03d05c7feabb97050f0d8aeb1c21f6cfa2e1f572fd62801c633c4641b10d9705ab6ed7d8be669c9b3f613b2a58fc84886cf56cd45d9498791991f6f356e172d1741fdd391114a1189d838e6edbd0d709b7a2339cfdfcdea0e7846acdf21b3a5a73b2b3c2b985616100fab920741f817f50517eb0c5dc9663b1d988769823950fdebf0bd847d210197fa5ced0ae4c85cf3e76f279344477ad42cdec4fa3a1db7035c40d2ee8788a82efefab7f59125b0147e449f774b50f274cd8af2339a8e5f5f3ddaef5e63a99e634a29921701fd471aae352ec7bcb3c05595ec5b031f3d3dd5594ff886477d44a64cfd1895b6c55f3bddf52810e851df8ae504022b82175dac2c72067f0947cd69168b6ffaadeef3a3e0573a16687a0e4ca1c5fe729a4aba4cc0912c2c11a10e11520b4f8b30cb3c043dd54e58df877f1a5dadfbbc8fa6fb3b6ad76aedaee4b41de9456bf0a4fde5eeff7d790940abb20e57099208f5334d9151b85cc0def73097321167a0c3b7b36fea35ca827a970dcad659012c040909c97ada39f55aa59ca466e8743bea672f63006d943fa3489bd8137a7b528bce01dff83db894ac1397a4af2e834a227185570627d4e5a9bbacea17444c641d8cba1a12d20e246894aa419d2187064afb4d56cf03220b72a45d9b625b9898d8a68832140d561e0e87d2834ea2e363ca30b0384d642c1639560b2b18a9114341d0628ae031e18d16e71208bdf11cae829554d2160b691e088152c1840291a00ac1e84426bcd62c377b03040da2814bc2e0826bb161849d1866180ea31e0815b6868ec4e703e431d0085ae85c106eb60c403b55129381d102c560d309aa60dc70cd567c700d5745c7169a2e564dc90dae65ddb06d902c376ee1a01ac45ac763d3576fb581d187b3f7163f6c0c2c1d0138b035b6f162eac9e99b8d97b607160e98dc181ad170347764f6c9c0cbd303830f562e0c6ee85858bb9273677865e0c5cd87a307063f5c0c8cdd41b93034b0f064eac1ed8b8d932f945922bf23324a7c76f47ee8d1f18b9163f18546db383a035c082c688e80bd3b9c5083ad7388ec28241d31d6932a385e7d7b46143f8f45097bcaa47913d53725eb2b156816376cf9825beaf6bf447d9c2ddffadc59e2ce118a407d659f263e7085f98cf4f69e648a102161e9d7979664c2e290bfbca1c90776bb8cca72f338a1f25da5376b6381384c0cb0081430163d216bf5a82c2984523c2dba6282fbd55960db3ab4639bb0a2bb79246d1c2c0a2320fe2f6149c5b42174db53b6cc36e3ba6f811eb537fa8c213c370ffc0a366da0c01ff49e63b2ce724b4de005921e3307f2faa09482683da1004165b100b33ecd66a3329869a849f58e79c46fea303de95b6096d6c18aee27866ad0f1da6ab8c52b564d881b39a3a46c8b72dd482c2fca0830557112b67104ecc6210340328975a52f2d904d12f634873b4f38212f001f0f743cf0367dbd2e7409db98f1e501de0a3042b569d904badb2107f4a9fa693c8303d7fe27a872589b87f5d9b42a5eb8f8fecb959f9501956035c17853287d05cf0c69fa8d5894bf188f9a250d0c4bcbd2b28685eef3b1c1e1429292ef26bb2747565fab36d1a0e23cb249798aa51258e067b5f43a6a3f550fd24b5907461208953df0320fe91e1738eb0800e49f6978ae4491f9ee7ffb3b11d79a0c86d708b16e672b0b71692d61be557f21729d7ee19b0f8fd4d78b269f5738f175ae82dac8bd85733807e2c4ce6fe0a2c009a30187432cb2d713df61dcc90111eaa693c6205c57d09d95f071bcb26c008b6584aa89bda399f6df656aa3231cf676d076ac12432d04c84c6fec89654189886ad87c51d5f35cc51aecd146787a1d86ea4714c93e20fb0ff1bbf981471123a6b79301a24d2a5517e9b1d45021af9693b64ed81ca276e9807fa185fe0748a2758b00f145ddd8c3c3fc338f648c84a58c821140bca2c1453c1b4ede3254aee5dc92fcccd7c309ed644ea4791b91e9693a6ea500e956176e0fa2cb24e6dd644c02d8a64ca26e850e3880998f818dacfe47e4dfdea3eee6651efca49b0adbbb1ab68ca280e5fae9df3522094840d61a53438de066f8745a90d456ba40ad75e8bb2f58f2662e7a98d55c6787ddc29e4fcf1c2bb22ad0ed81950eeb74938d6638c33bc068f44e6d8001f545c8be2ee30243cbea7fbdb80fd4ba791a2a466dba48edb2271014b64f1c4eb8fab1e0a7f29c18f3efcb56bda1ea89ed088fe56913114ab651c4b08835341ee9aa375f5f4e03fb789a1b1be8bd22c393b677f237e48d51f4a833b2e35cfc147d84f9bfbd4fdf0e7032bb5b7964563051b5393810cc8c0fc0f22810f7b299271a59b4fa3a160db24cb7dec9d6adc65ed736bafa6ebcdcf7c571335260653be36a9db1dc80e96b4c1bd16c5af30aa257e054dd90bf2962dacb149db45953038829bcd8ba566a5afabf1e03323bed2a77a9418ad5afa64f355e495d8985b15a0bd9e5c6c3577e36c91a09431438a939720618e6bb30f15c91b47b1e03929805d00b687f2c5fb1853e96b3da41190ba5509060e1b9f0777077d543326493512cd36dedd96ec883c39f904a010613bbd07538ab081a934211916f503ddf4dafc8efcc2a5841683204915728ddc694210fad434980821f9292cb4a0d52e68e016226e615cd1bc9b101e60f18929952e109d5240a069e1064cabd4d3cc355755c8efc21b260ab8321368458f3b23917c8c238b36d234be2bb9b8e35a2cd48ade396686693971d1978bb90e151cf115a5bf8f17caf194540339807d7d0e04b39c2a4773098e2955d792dcb181e37433a3e1a8d92d6384dc2a7f7fef82acf765f4a19289cd9878a4b5647805661e14faad13065d32f7b8b59d271cc4ff8fefa3a4d3ffaae3eb62b8e0ceb34d29780abb30f10953883bd087e652dcf7f1f43f731ea93e0ee06bafbd4e626d2409b753fb677870b2e2018d341d997f1139ced7edb07cbd047c3dc5913eee55ecfcd7f26e7e5ee5e1439934c38d5af8b53f2e2bb1e37caa52da748fb7c8dbb4e8e79367c7eda6e0e6d20257409f7e189ff31fdeac05d66e858ac9410c48fa5b5582b423b40207bcc65d55a04ac79ec4254b7d39476696ade2321d86e9e94bcb7f203e5f925b084b4eb6fda732cbe3e5cc30f2c0d47a4adba0aebc137299d78d0e8d0c84434c9e1929a190b69a90330e48b5eadc890efbb2024fa53c6cdf8b40e4999b5cb451d3ed0a56809a0dafb055b63a39b4fae0ae37721c2b7f9eb826b88972ccbaf06deac65865b0245837846d47346ba728143dfd1be261f632948561db76bae12752a7019fbf1fb5694f8e888c92d1a7c300b02e697ad73f71df0b0fe67ffbf911abf3154d199473319d8e337eee7ff830601a096dfdb81402f9b4fbbda8707408187650f749459608c5768ce0ca809ef9b33cd6e0d87dc91aa5eda6c14b93a249bd2ce92a063afefbf7a31ffdfa5cf4e00a18de1f2976b99dabcba87476e41681ef40fb555b146e9c3eedf7fc189ea3175446494db2b7b80e1cf058cbfd2119b773f62a8514c81f41b3172747c58c4971d81ab3d9ba78c0e58bc596dd9444522167bb7d5e745e1e8cb8d2ae50e67ffce3656c1129a3bd28a74beffc55339843c57c65662033afcd55db0b273e3cb6cc2d876f2ac4a94da3888fa59ad6b98b0356c48bfa93f68d736380d917df906437100e4c860c60db46ba7d6841f5a2d3d11b89ab11a9ae38befd51906f0e20c51c1751ea791ff970f12980a702f8b2671ed7c8691ea86aa0b8238f28ea3f999b27ab9ea6f11e9cbdba225efcbc3e0a715430e03b08544f1fcf1bd05d5d392f0ebc91b83da0fa59d0a10df8f38a446ce317ef14501dc7e8ea512698e70208890a3792add1a0615fe16e56c0ea5e84fafe1b6115ef4d9109374af53526a8453e1258479c3a2dd29b539b45f03c19431f568721c74dcf75fd89f6c893e2740499114173e1833b3617932d2a525345df46d7731a1a78ef1730e8d3300118a838fd3f9471056905b0bce8e49896228d02aaaac45912758748871bfcb1e11f6cea098224567d6cfe09dd5dd1474bc1b32b877ab796316dbbb02ad42065294d87eb37023db472d4130ba34e47c561a5eab106f6910c3f2f415e7b9b54be9a5534b38e564008711856ea2010a6b67a3fc4fe3dbd239b58891152713911becdcb70eb413e907e5088c046dbdaf9822d49913e50e4128489ae344cc83a6c9603240196e66b15a2adcea2d58ee95f9dbf7b713fda803a7823a3e89e9b248d0c782b28976dbba89defb31d0ac150992a4b6bed0a14cfcb5caecd6cf145d04449442438846fbfd21329051ebb20cb468c14de644b6863ac60f76d6690fc582249d7a3aabdc35203d5f097f1bcb06b6f9ab5ce18a91b08f133510cc0fffa22c91e7fc8e2698ffba2a3f954fc8f39e99043e99aa276f209cb38f19774d7a40a812e8a57891d7b1bcc4e9ca294e8a3e87e4d9ee56fa8ca319f50d45cd805b5aec51c8c5cb752214f7578ef74c44df76c0d16670f797e307199092835c675f9613248a899be97cef5948dc31d41d1b9b3328453c1fe258740feaf86b79fd29d6902618adc8e72fdb92211ff7821996198c832d4dbc258f3887525869665004ef5c011482fa1c0a93b3efd4a85a236a42939f32ae9db31fc075ccb8cf441d566678a270c889dd2e9d61767e37d8866628eb9d660a8bfb4fcbaa16b9247b74e1b84687ee66cd66d43b973c5a2cca51847c083389aa3587f0d9e388dd29fb61647bc3f7d94e1014efc37cb6fa68bceedbafd9f44f6179b63445b9b44410b4c81d6754c714a3de6a23f1b2bc6d2a8120b52cf0d86c8bfb294a7c3aa11ee0c6c29b94d52a64f880f3f1f1502a22dbd86b5c57536cbc3230dea77498f8e226fd830e1656656a21cbe303544e6ef2b658157a4a5462f18b5c91d14ef06b1958dc7b0ef7f4425f044d8e3e6ddf55d6678b322805e9ba28927e43462cf3e0d913060448b1155508c656564b0c6dd4033c53fd0e4259006576ab13b6a81a85381dfe59e8f7a250c224a5b183bdb404b2c6c2b8dab5aa6e0ccec5e5572df0a01cb0ec74ab72c95954ce31eb3eb12e709f524bff5ee5f2576fda59a34c06e5f7a2193dfc168c98f92a281a1d0604baac079a068a2caedfe9e2467fdbd2a34df48364e730dde2960ad9fc3ee415acc7d418d5adde7844e2e98a38d59eda2b217ea0f4f78fe3738f84d5c9d5aa71966c3336bea9d922423f66703abc5c5af06448c02ce7d44780b3750f26439c33f3f3f3f3f3f3f3fcb3908acb6022541a62495b0b4cb48c5402ea524534a29123dab000400000000000000b043db9b90305cc90b7d0b730b755d998c4ba5c2420d2798d226d9f6850e35796982f1b2894c1455cbbcd3aa508309c6d93b5d1b292f88dc8ba0c6128c1174085b228b514309359260c87141e32a964e6a291835906050fabe6523f4790ea2a50c6a1cc1a474b01cbbd0bbe1152c1c95871a46a8510483500b3535bb17221ebc3dd42082312d9a4d343f7bd37f95a1c6100c2975bc24db101243bf420d219893d83efbb04f8d2098f3fbb49b083fa347c1066edc08430d2018adf3f579aaa8733dc9a1558a0c32709011c6196afcc06421579a1b721d63e03004d4f08129564e4d763b79da1f08357a60ea1773f550174b46d6850d63c30b0ad8b871c3093578608a26a3923c613e22c31a3b305686d0dba172cabfe9006be4c0a0acb4f56dc90e512763885156030726c95d61264ed211fab3408d1b986c55d5523c21f2d67331be48adc3c5f8c201376eb40e1574d5b081d9c3aa2521dc4a95bcd4a881298e6fe98e6176a76512d4a081397cc955d21e5b3f4434e0c5561268ccc2e0aa2ee2f5238d8eee0236bca0808d1d638ca10127d09085797489b2ea6ce943d258a0110b737a10a253987ab6f1bab0c1011b5dd888c08e06c301376e88f13b763418e9c60d58105582a5a54d3cbb8c1d5f8831c61766628cf105b147d07805173f22c8a70e0e345cf18993bd6a5247860a89038d569426e5bcfd396bcc7cac386fdb4711d10fb2ef32d05885d7e9f77942030d55209f43aa5c9ed25b2f1847a5e238cfbac9336fd98f81062a144fc2a3c8d36ba36425f8828c2b1c85081aa7d054b88ca43fb9b6840c344c91858d09312663a30b1b5e58814629ce90dc17b6eee46413292c9b532adedde8fc4741f8d0d6298bf29fe88b82d3ef11e779fafc502c41dc45d88bd77150104f47c8294d14b934fa44bad4a5a84f5e1311792221a48aea396d21954e27ec3ff7d4d14644f90f27ae204185f89c4d1ca3b54ac79bd3a51e4de09f2faa9fbbf4c93b13779296b3245541de9830c74598e8f02536b1253b6db68466da562ca40c6531ae0497258bb4b36849ad94f04da953652a9378e249fe0e4b024d1f3d399abe515a46c24f417ac855cf27a290c042c88a58692c8f682389894fb0e8133c479ccb54bca8a62a45be11a451fa7236a1c3c41881981be9a92ecb85d8220efa3149ba7fa656a5884af9b60715a56bfa445ce2e5eebd3acae9082230f5ef2fe2ba9222e410cc6856c6a40af62536044a7e07116eb464bda46c028d4268162b450bb1ca65b6dddb62fdc7f479ed1422041a843066a9244a843b4997828330c504b522fca3e7180edc414310a66d358d6cfa746c850261f00b2e298baca0133c8030974e59d52a56789efe60f6dfdafb10413cae7e30a71cf4524e8bedb3953e98c7ad4fe4a4224708423e98aeb5ff9418bda0c4851546181138048d3d18d458d00d252ea7eea407937ce5881f6c23b7f6793025eb2fe1d1e74fd47830f5db864aa1a2e594457730bc491d8f24db46e3b683e9cb45b46988e9e4711dcc154dd35cbe66b4890ea6af10c74d2ce9dcfecec19c744747fc2c9153a4c8c15c9f4c75e414d25a827130d678fc89eb9856619243ab04627c5146038a05801234e0604ad3a5c47d481674d66f30d857e7a7896e4aa77154612582861b4c65b6dad9d3a90de6be139df488af54d3b3c1f4793b7fa7245f7fa13598b488cfbebe10d63d27004305078c1643c70500a00a1a6a30a9243a43b4a7fb5e3e0de6906821cf8eb890361a4c661fd93d577e95d4cf60acd20e79151617ea2643870ad0ebf812b849fd14d8a1820adcb8a1e34fa0a3c320650180020d3398848d7adcc80a632d7a60c73f8046190c2a6479e990ec42db050d3218ef3acae7111f8249ca8ec1143b8869d9cf75a35262307852f2de4a29a52a6fde6380512a40230ca60e77495e4eaadb72b1a20106d368dafac6dcbf279d2f98745dfa5152f29fd6688c1d387290a10214a0076878c1204ee5aecb1f84d0be971734ba60324f2594d6926779ae2e74ec10c39c00f58e0de8684019010d2e98cee45e85bd09d1798203ad0c8d2d182b265748e179665ecea1aa0593d01ff235316b1a59301a583068999ff8613b67e9fd0234ae5037685821695421695021694c216948c16844e16840016f10e4008d271c0d27248d2698f3a54e419476f11b35134c69574e95892046b48903052ac0718231c600432d0336bae015d05882392cadb6ef895e105a25185784ce295e6c2fd88446120c56a77384a02ac4070c301aa1180eb0a28104e38632cb9d4452edd43002348e60be2ee5232c59ce134d4630cfa7e89d9368ecde5f047399cb886aef944c732298e62e44b62853494f43304bcc1e97605b15264808a6384205b536755aed20184fc7ce923b2979903110cce923a80f93a03b56fa03936411a6d27f5a9093e203738987cea1b4e2afdf03935e3821412c448f8cd0e0812965be6ec85e5f98a41d98c7a4be6953ddca80860eccafa7f131fb2999cac98139a89cd38a7c9fb4f3d2c081797bcd7d5d2f4f12271a3730fe9905f16ea65aeab181419ec4f30b3f57b165a45103b3484f73b91ed1a081d13a29558f70417a2467618e215f5f23c63f08932c8c6b21e7521613aa5d140bb37c4a6d42ccd5447b6051376cc62b4c6e7721ff6775d773d01575234930a315c634afcb96217efad33c98c10af3dbe534e1b6de83c08c55984cc4099246e5f2e4cf053354615051ec44c46b875ec8a5c2dca22bbb96368f21275498d208ab581df7bf61cf3885d9cee4a964932a27bd29cce57d1edd3fe924aa748a5b14134b2a8814750304334661aed2956387dca7342c426688c22cca925092fcc2ac94c2402db82dcc0885295dcbc7c822adde4ea030e552e9835a975d53499f30c9ce47d2d6d852d57bc29c2e2f9f2ecd2df974274cefb7a7730e1e848e9b13a6b07f314f6b84897b3761ee3d25bed4447588ab264c93f3e90f9b75fe69cd84414e34520c118b242a260ce6b7172c897417db7209e389aae0d759b184f1b36453fa53a7d44f254c9b63aa520c55592ba4843982a71139adbe09c91551cc9884f14dde26e71411143324613cd5d5326ae9b3d69443ef13332261cefdd92bf54c3499ddb861a30b1b637451011b5d786206248cf1a57436cfcf4197be3198f108d39d3469fa3a5746be1c6148211f21c8b0be9873234c1e235ef8cedab1bc5a610623cc3526f462e687464a29c28c45983fd7db769eff3839a80893ca6afdf03974495d13618a93238d4690d5b624220c6b39ae87147287205f7f4a5e4262a918c214c467c995c4a410ed9fce5ab9fd2a4d0845fb25691ee297dc6f1097a810622129c74b27083ccfaf2a79669781304fd029a4f89721cbb7198020a9d2397d6f92cd7fe02b5bb6beec5693f383d1946a79f46471133484197dd0f45990f525fa42c2076384b2e421585e8ee21e189139d266d383a77f7325d7891159f3600ae92e9fd0daeb155429ccc0035ffa3c3c4d168fef704a3369b275ecc5eacb48a1a0c3b83266d8c160292ca43fe931ffb9327e0236bab0518b820ee39630a30e26cd0bdd0f112c9c5467d061c61c4cdae969e9a427f97d961666c8c1946d763f69970c5d7a1ccca7c7dcaab4c58b239c0107738d4cd77789b67f9312cc788339959216c1a42487d6158a60861bb00de6b3a07eddac3f75850db886535ec3bccbcbb26bab573a66a8c15c3ae5b6e7906a2f726c05950643303f2de77adaee271acc39e5149d79f5a452a30012669cc190d3abc93ced39557a6d7841815f818e2f1cd585196630091d3f462cfd7a1ea33298e4e5d7b41416b79f371dcc2083e9741ebda39392a2d248c88c31a04a7698859c7e7e825fe8f06286188c16627634f948a29fe09f0c1c627c8e1d38ac84c1b46e3e3a5af58cca1d16bc1856c5ca0c30186e929ad11a26ff2d0e1d63e06041eb281298f105938e27ffd5f7b2cbafca2a0d98e10553123ac40f41dcff4287174880195d3088b411a6e34ea91ced1d5f82b5e1c503fe0b1d5e70c194bb5a25eaf7ee639fb1059312375bea496625ad8cb1438c085cb1400870a4195a304911ad7bab3172d76ec18b81835817361e05657821466b20f553206f77ccc882b9422d440ad992fd8533b060f0746fa5f3e85cc1a46efa3cc9fa10baaa154cd12f05dd5d1bb2cc9243ab0c1d3bd68b9b51852badc509ea2bb42b4f9841059c3105bc2105bc7161cc8802ce8042e198f1849be184e3c08c267cbf82cf217c48c164962ad6fe635be99a438b8c3150702a858f2898b3e45762ae78ec0c5555e1030a26599161f223e50c11fb7882d126874bdeba3e6b75f0e104635f04612a23e24c742fccf0d10493faaa55afb470b2823ff86082e1b554d609ab16913e3ef85882394d8cedba10a9df7e25986d443ca5e5ba54084149304dca4955fe9330126c2418458e0e5237dcbf5e4dc2c711cc9ba293ccfc5f85d16b0b1f4630775cca23aa63672c9b41f8288229594c1f75dfb71d3a114c9ff74f4f1a7178dd153e8660ee3c539d6afab2fd058e320e0ed331c68e0de04001190cd8d10273e3c68e163c133e8460c8656f33cacd4b792408061fd54ea723285df2c7c1e40308c6492a99ec36cdef1c2954c2c70f4cdd1f82eb484b6182ed03e3080b274487f58871ad6c071f3d30976d47b14b3a7ca9200fcc49b4c5cb51b67a52b203530eddfa1b3a9ef8bd3a306704f73e69a34be42e078609233a46a867d987dcb8b103350ac2d0c1070eccae17d783d09318a95346bcf07103f3c8c9a8e8e93ccea54b071800067a47011908860f1b182b8a5750e22676f2332c7cd4c01054e4e468e157ec549cf04103c304a54a579d4eb3f19985218e450e21e6435997050f59986c338492259f58983d2be8149d3f2778c0c21cc45d4a5927ef8abcb8e0f10a731455d1f76b39c7f97368690e3c5c61b4db3521264c4e22d94c82472bcc93c33a927aadb56cc9a1b5da85072b8c6d51bf4cee5ef09479acc27c597c23950cd350b11ccaaa30adcaec69eafbca8aa930cbdac7ec3baf30f7a0c2209f2161725e75994f61ea9cd31f75d77b2b690a53e7f0f1cad9b1e5b152984ec911edf15b97fe2285a983f6a43aad554a1a8541a4ef1c7243f7db1a468b8136bc7880280ca262a14f8487f4b90f85413ebdc37b8f9eac0d8ad4725acf097a63b505030cb544787cc218214faa3295729acd3d61d0bb2fb516af6a5c04061865e8d8919d304b98b9f1bbe06b41597870c2702afa25b56c5a113c36519ed4dfa3bf3a449a305b842c29953a736891ca8441e7972ca146840ed9c761c30b0ad8f0c084e1b4d9a7b02e42c50ab98439fcb68898291756324ab5c0dcb8e16109c35878e6989fcc3a951c5a6424066e7471e346175dd8f0327474a002762ad0e20a1e9530a41c115a77fcb2fd420943ca6a42c52758bf79e70b30c0e824c617a4001e93400f49982c6e8d92ffa583a930163c22610e13e926629f04b123248cd73b1f9f4599675be8f108534ed926a5e0ad113ee8e108f56844f160847a2c425be0a1088f446421e294f64b3bc7d2830146bbf78d1b5fb40e2fb22e00abf038445a54fd8e903827cea1376e84513a76a060141e86c81b5508f520c43f9f4475fa0791b02d9d1d796f4f108ad4ed0b77a2dd2281c8e54b8c0c395d41f9020f4098777dcebd3eac4c337e24c605fe6048393ad354268a501d3f183c5690adc831299eaa0f26a54c629ade98d011e2c107bf3fdd945896186966c0630f8c7e0e3a1777ef2a7a30fea8cfb2a32abf4879f36052dae2485371d9f354f0609ea47c3c04f927f3447ee0710793699e782a5dc93e497630e9f3b8a02c2f5bce5d07935e8b977348bfa172e860d4cd7c1d355e31ece581c71c8c576ddb6ddb312ce92107d3cf49b418298a83d9739c3c2f5984fa16ab5ce001074358b318a1ecb28a6c17f0788369ddc27492694b925f0e2d1c63ecc081e6e10643885b275456342f4ec410a305ef618ca1c301ead10653e5575a7cc5da09150f369884da7c5ca9770b1e6b30861297be2b6b9a8dae06d3e9a4d457279da6b2c300153cd260fc946743bf538edd88ada0071e6830cca59ce4560a92948c1e67307fee9cf64c95c70cd1c30ca670ef9284c8dff70873282a7b8f3298b4b5d29d0ee15d2f4c4629ad117890c128233e7e89ef301a72adb540087028c0630ca620eef723e80822854a0ead1246ebd0b1800580014687b1811b37ce430c46ddd1cf7ccfefbeb10a50c064908102328c4718ea86043cc020028f2f98bb5312a526fd564c645e40428647174c1f5e59d4a8b10a3b71e11887c716d2430ba74a48a2a1f131a35a95147864c19c4f5aa6e68bab8a96940716cc61654988f0c9efded383c715ccd62d7282e7965910ad6048bae2a9b44a9469ebeee051056396ac4d1351fbbf7c0bdec55880158e22838cd7e1de561e54304e8e3de341a4589fd814cc29bcc547436d09fdab3ca460f6f3fe947e59d4e937cd230aa62e1129173f8487e00105934e6772abaeda6b929e605223bb748a641d9fbf130ce947c45aecbe0986e039889c3c3f4a4b9c0946bb50196dba72ce464b30a72dbf3f0d39425a90128c213bd3b6262809a6bab754fd2952b5a99160bc4d0fb22e2312c47c04738ca87b49977812e235823945cdd7a9f9eb78b708e67e19b548d5e7e95c2218466269e4145642daca10cc9de39cb091d966e21482b9d773c54574df423208a60b510f3df359391f08063d15f3b9eb1f98373547cec5922732f48141d407ad13a7b2d3df0383b6a033c6a35afc5becc103c307191a4107152e5ee5ba038f1d9854d7430813ce5d769d81870e4ce221eddd6c4e7ceb7268d5013c72601e25cddf52d8b99d706050725287d95d2af9d20dcc6341461cf5882daa640353746fcb7f3a5f0373d095e58296ee3ab57bd0c07c41aeee877f0bca45b330874fd1375b21598c2c0bc384689f6d42b81297c6c2ac7773792f291d151658984c3b425a3d3141e7ee15e64ff14d3c25b9f12757982cfa9f4e69c425cead30d94c50ea5a192bcc97254ee8a07222de641586eb38d14665892acce9114d5e478ecab2a7c29862caf42ef68a5b1615e65222e9150fa5272a770ad30749aa6355a8078f780d5398eae365c8a8b95ca3540aa355e59b92959f657b5298eaca929acefb288c91e2eb7e999feafb88c2a415edc3a5dc1e77e95018f74fcc54f5add5433d354071353e61f6339d453e9a0e1523353c61d0aba4c258881a62419d306788ef9e84942e5b9c30e558b2b409a174a8bc09936be71cb3a1ba19499a30793ccbe1eec2250d4f260c39665cec889ae7c8983085b90e72439ea82eed25ccb332772a784553794b18a48adbab24d3a52bac84e14f58f077cffd5f1f254c3a854a0f5325dde5da811e0c3526619e7ca584a4530e2d31bee81dafa3d4908421756e8f9f3a464dbcaa46248c77b94c4b2a1d489882790a8b63a9d32acc21a8f108e36be80ada9f15bfe38e30bb581221f77c700b320fd46884298ff8a5323de1c67a4698d296acbb944256faa04518d7f4c587491e82f228c2a4e625bd5af4489013611042e9db383db2e2d5351061d0d18d5ce2b4ba2b5ce310e64f3a5d9efa6ef708d7308439f4534ab9ec92441d3f90386a14c27c93dc92b2c8a972d9350861f090d24558b98c177710e6887a6a94526acb4b158459f65ac289100f25c14098b5e496c5beab1ab90061f020df29c8fb0793344fefa5ea7cfd42fc60c8716e9dce534508d21c8a43c70e1490fa52a30f89a464b1439ab152f1a1f1d44fe35b9d837ef70835f66035f4506e301935f2506ae0c194dbd67d7d2997bb647b8752c30e56a30eb9a3061d9618e2295eaacd0c49cda1e45032cb41e95ae7f34b8d38c0e10d35dc60c8c1a329b517133e477268951a6d308a0a9153f66c67a3424af9a1061b0877fdb983aa4e9feec2011ab061c5861a6b2835d448839d19775d22770e5a34941a673087a092a88537957e3e6630a832a1df6a3c0417498d32989258a5725d512177b66a90c1209fb79329296b5be9320e33a0c6184c962a17b27eb5421583215964fb90440e234a0f832923fec8fcc8c9e3976030995413f2329fd792be6036256221c4ae64fa725e3095e7535af4c456899104d4e882792376dfa7ed082f3f17cc294aa94dddb128a22d186d3ee354c5498bd5b56092f3eb19123b8ee89d0553c5cfef66b609a5e21a5830c9ca57cef94d4feed5b882f9ecb5472f2e744b94420d2b987462478be7137eafad82e95489fc5137c6bed627d4a082399b521fff0c5579255330e508faaa4b9bdc708914cc5beaed34e5ad27fb6c881a5130c972ef34e2d3dca4ae40c11cba84160f2164fc8d97851a4f30a5940de65a3031d953158cdfa2bdfda48c127a2a186ef29b4e16e47dca4fc1fcbda2a9aa1242eea56010b23ea468b3eadfa360f4e06e93663334475030253593ad2b9e8f799e60b4caaaea61dde26e2798a3d9ee95769b60aad53821ad3e07b532c154f2ba3627f98ba94b3088a98a4a2b2a65a8a80443aef0f0083964480b26c1185759fb67b2445910090695211749298f6012251efa3bfe3d786804d3a735f195ebb4c72298a49c4d925ca63f494430873ca76ee45be2e8433004699b163e470886536f73411c0483dbbcb85d4a5a3d0c04d3ae4e922221bce97f6092f922df7d6fc2ef03a399acecf5ea55677b60b89092497c0f6ebae581e14c5dd01e4af489650746111397a39ed6e6d4814179102342acb96e990353ad5cf61121d94f38309b8e7c89c8bf5fc21b984ca7fd855fa4aed106863b0b225f24affbdc006a6050916b155b594d6403a08141a794b5099ef2df9a85f94a9acead59177b72b2308886a44f99a42f25170b835fcee1fbddd67e82852928f5de7ee9720ea75798df52a8c9ea6e51f2ae30495321fd2f4798ebad30779b30255becca73569847c99d17cf3e428b56e189b3b895f6518541865013d74da93079a6a864ba3a94b85161dcb0dd10d14376b9ed14265d36de67e725c536539883b69b09b695b4c7560a93b4243d6ce5d65b6ca4306986e8cdc893e2a6360a83dc0eda6a219f1aa589c254f154ba09f5dee15928ccdf21c7fd7039478b19284cee41242d7921cba7ec13c64a491e9e52cfda324f9862592869bab24e185dc42eca950a9e943861f8b3937b7a96ad4d9b3079bc9ccc52f8772f69c29c42ccc8ee398def9f09f38bbbfc89f8dacf63c2107744a79689faaad725cce2c154dc557c0fa3b284f12559a8a462a8495055a264316ad2cb8712a694f6a1174a9b9f6712a64f2d498e792461ba20d38478ad98e444c2b417ed5b2f05130b43c214ad4432f72ce14c7e8461258b1c9d1d6152ef3793a32b5d781b610ebd596a322a4d5e4698e5e64c84761761f2d60959bbe3a4945584c9824a2e369377d79208a39b277ddbbf66722c441846b99ae713eb10a610512a33312c43184ead7c58e844d3b12a8439ce8776c812b13f5684305ddd96490f7ee62135085308917216248c6ba4046198f0ed9d4e84ad452a1046350fd1f361a9650284495fddffe4ff0f26a53e474e9dbcb1fbc1fcfed172f0fc569e3e9884befa8f544a08a9f3c1a0be751f3ffa45dc8329a48810b2280b2a82f4603c194b425f48bb521e0cf235cbe782182174f060f60f7a64dbfb7ad0dec1687a2b4f05bb1896dac11cb1847ab31b97531dccab9926d7d1b62b4907c3a5ae389d35f77e0ec64f22ec541c192d3939183c87784936be2a1e07c3cc8e0a9ddf720e1c4c522cff5d10f9c4fc0683274f35498abc5fdd60ccf7d6f50e5e7e5a1b0c6f31da62a7fd8fc50693a98b5d5297aff50ab4035a0dd0620da6b8369f6a3e77889f2fc4f8a2ea91181728d58231ce3e6a1d0806188f703c12630c0b68a106d3da2429492b3db5d49206434ebee3274a87701119636020c78e2f3c906830ecbdc4bb94a4447afa0c66dbd05ea15bce3e8b376e98c124b36452d48bb9193187d60bb4288341a95a917f11055fb000c950ba71b12e095a8cc124420c51e7f145deb939b4d6085a88c1e8d98476bb896bcb4b0ead42042dc260505e975427eca4112139b4c0608c14dd36d2bce97a3487d6174ca1438aa269ee1242f27788d136042dbc603871baddf5bf6288db05432eb7a03f1b4954680d085a70c19c3e34cd6cae554ef4646cc190937ab0fdd9329d4488f9400b2d9852bedcacf55829b4877ba045168ca22d1b93a45eeca494430b0ba611f74f5b912a5410b982314c8b8cd02d21925273280cb4b082d93d66de5de6a96cb90a260f2f3a55fc6c22a8e0f2400b2a98de3c46929299ff51cca1350573a9a4d2d362cc8ba839b474a085144c423e7838f9133943290a26d12d2967534a563415e2400b2898b2e4634b46b08b1f22e30906d392bfa408cb6f4232be00e3777c91830538767c099c60788dc9f36a22480e598b26184c249576499e98608c3f1d4f5d9dcea7db128c727672d13cbcae6436d04209e6ee341639abc4f57c39b4080db4488239e88cfc6126c8c96d3312cc92b53a5cf676b39c600db43882419ba70e23e1432c39d70221c011032d8c60f488339373c5cbba96a145110cf2567476b7a70eab12c1144158e44d490dc170625623a96669deca022d84602a135a41684f104ca2d29b34952c6ceba605100c4af256b6182afdc5dc8b1f18728a55d59ecb195b0b1f983dae9b1059630634800c2d7a60d6bbe42972cbe520610b84008701b4e08151440951714cbda51196b1030561fc0e4cbac43556a4e724641d9836f77d3bdcaa3de93930c4ae4aeda633ab9e8303a3ecba5c36adda8e90b2a2c50d4cbd13ad7b2b6803e3dd7b7e9178e5d0c2d13bc0784fa2450d8c9e23e97ef5d0125e177c41068ef731c4a8fa2f74ec602d68605ecbb5fbe5f919083e6661da4ff149a42bd1294cb230d6b7c71ef56f2ccca73fafa948e5a7820a2ccc2971523635fbc123f60a2b5718f968457eb0c22fb52d4aa7be5433aa2005df00f41d28e35598544e27b61da65246ebd0d1a90ab3254b62da5482f5376edcb871e346710c3e52b11fa8d08f53ec8729f6a314a54881a3283798031fa2c8a2f885b2ffec5d0ead120a497c80420054f8f844294f24f9e8c47e70c2343bf223885c0f99e5c7260ce925c73591224d1825ea977925ed3e32618a3ef271ba5458484a78840f4c98e349b952d91f74e464a9aaaae2d59278841401f8e0e31266af57d93f5dc994ecb7101f963058673711cd8a641556c214565295f6d35df3154a98c6e3f677927cf25927614ecae2a78efcb15629b6860f4998a35aec8fd029c26cad868f48989312e167d7494e9243c2e02b4aeb484a23d3c2fc0853484a922ef1af5ff372e1c31126d7dfb514793ea4a53780034755f9ab7e34c2a435aebb3e6ef12239b340087084e0831106392bfab7a1c74c9b6edcb871e30336bab051011b5d6cc0461736bcd841860a4ce00bf877803fb1527c2cc2e423b15f4bddcda88daa08c3ea07110b7141899c1435c44722cc1d4a9aa98f93453dc515f8408441a85790d4ef761eb239b474021f8730689d1c7ac7d73f4d7a8630c912e33d4207319dbd1c5a37f82884e973a7c8597452ad5557e68310e60aa22dcacecbcc773e06611272e6478e49b69d7c7e08c22cc1c428cb57e7d0aa127c91c418031de22310a6119f5c949ecbcaf00108d344cb14e5c1f25ecaf03118902e50c68e2f748c6182ae001911b871430e1f7f30e7f83b753b3bd5c9f483e9c56c73e4927a7f3f868f3e9844defcbfd8eda7a3c5757c307fd984747bea3d94f1a187fbc8c3071e4ef071870f3b98bab3c79bddbf114a99434bc3401f4883c0471d4cc9537e76d0952475300a1f74307c476fcd0a5e9d4e3d0773acf45b49de45c8ae7cc8c19c239ec59b10f4d6f97130987ef91a2bafd61a4de1030ec6d49e305ff1fcc0c71b4c4245c51391eb59547d810f379853bea47ff445aba74e8bf0d106b36c7fc7fc10e1830de6d8ae3f16c6b3044fe7d0da127cacc194a38e5d8587726891812df85083dd488321a4ebb7911ed53c943ed060522ac4137b11c9c27f39b4cc56f07106a34aae8bd748eead5d0e2d523ecc60b8bca117b2a5e8d3ca709611cf419bc841962a0f1f64308b929ceea2f4942c39879681f131067392102e27219496dcfe210663968892f3b1164ba6a44cf01106b3e8ecd82147aff996c060bcd7ce31ef39cbe2ff05d4c7ead91ea1f78221daf797b8ff127d7b170c397448f418f5a34605401a3eb860481353d2e965b914a12d9854dad53a9531f3f368c1381662363553f4083b0be62c216a6ddac7a4ab74e18fc35fc7183bc8b00090e1030be6f32cffd9cc662ee86707d1d1858f2b98ae2628f5cad6bd11cda155868e1d4c820f2b1865ef43754e57beaa0a5e0529c031868be0a30aa6bd345bf193914ddb1c5a0db871e3c68dd2c207158c7d3a2d9276af1cc99942a9d5249b79578a9d31b12a45b6e5ccb61ce514237030299f91ae633904e5f21b4c9384de272f49e7f6bac13c7a5fd4d36e83e9520ee993ecbb1ecbb2c19c449caffe71c927b26b3097b2c8eee9938945560de6f70ef2428d8ae1a13498d3d2e51115644754140dcfe5f568217c67309f0e1e6b45c65e546a0673ba203e44db74e5b70c86afb4eea04b326c4a07710c0655f91f23b622622606c3588630b3097e15296130ca08d9ab5727180c263f5608f3f98241afef930e72b2aaa770e105839bd2a75e4dec824944db63c5885fa121174c22c92677bca878096ec160979fb44794344a490b065de17ff4f49ce83d0b8905635c9e1142dea8eee80a86b3b4353a479d1ce559c124776fd2636d881aaf0ae658d6767d65b2e7a682f1d5439a5842fecbb42920175230e9eeff9deb2d0a26a53de759c996ad7228986e5cbc2798b32d4c8ed1a25fbb13ea46185c34c1543a45ed22775b9c09a6531dafd929649120c9a1a5e3cb68307014187d19e06209c62b9de0a5ba7343ff71e042095c24c1589dbb3b7c091dff215ae00209a69fdfeff41caf3b133218471d14b83882e1949945499d9629820b23982f9bef4f1e0f95d46705c145110ce6d6dbfad17350e5173e70410473d292373629cbe5b447072e86601e9db7153c7e808d2e6c38c046170db0d1c506810b21184582e4121145a77bd8858d2eb60c2e82605c1fcbcaba2176470b04532789a15ea935f1bd1f18cca4c55e79644df190810b1f9853c8557522268b9fca450f4c7baf272d87ff5316626470c103d36a24115447773db379c0c50e0c627cb32e76c0850e0c29eeacf2e9cd450e3a797376ab6effa92465e0020786b495761ac954acb46f60964f2a89c91739276e0393c872498930b935b5d6c01474c70895a95e12547ac0050dba9b24232ba2e634ac599c83adcad6b59da4ac11b690c50db688850eb68085f9ba2b4893943cba9eafb8938a676f8798cdbb852b4cc23d6bbbd3d7832d5a81c9cb8c76b95b0af261a9e35c9da57c593f45cab0052bcc22797564464a255cb40a7307afdc4e39d9c863a42d54614e79e76fd515f2368e4009de02376e90b1452a4c15413b7df874d926541864ddff68593bd3ff29cc663927eae84d61d2389d43089582e5be14e688e35eef41fea89e14a698a6d25c5cee18a351984bff57ae3849440589c29ca38733b7cd4841140a935db66c4a10280c2228d94adae779743e6136b3ceb5355599174f984c4a501dc253c65b3a61c849d4d4793271c2a0e13b3657164b846913e6d8f94474c89bce9834612cc9ff5f17a64c9857ac6274a8113985244c9843aef787e78e9222e912861166691b7611f4b784c934f43e88e4f61faf84c93e7e57c442dccd2961d02ced10569f84b174ac0f3a6478278f248c1f3b884d4891827922619e5461acc44bfe5343c2fc31717e3c8f30bcd66737f1f94dd88e30a57ad68c8f5c177623cca1941435edb27b624618d394bc8f7c2a4adc45984ec4d6e9ca5339a88a30b6094f59d9761a6a220c26c2f7e5583e22cc7521c4ef201f2a967f0843ce53a2847d6f0893b687f578f57ee2429883cc1a1dd74b432511c2ac3a62f205916f310863bb76ecbfb80e0ff91682309f8a65e792238418fb1681308893a839e2195a5adf0210e636df5691276446eb5bfcc1b0af16c95b5fc2567c0b3f9882c7db9517b116527c8b3e98459f7a9f74214e8abe051f4cd75945948abc1443df620fa6b3cfb2a65c2ff4e75bd8174b3ccf8361467799b430d197381e0ce67ae931b4a4d1d31dcc96e24ef72b685149763008d1af5b6d1fddff3a183dda588eed7430e414f5ed4d55bd85e660baa046fea5bbe55b0ea6d9f794a026feb738182f2bd43d75e0605271f1f0a47e8339a5bceb0bad52253798e34e1e21c279909c369853e48f0f55bd50321bccd59da327e556e1e2351867d3845259fcc4bb6a3077aaf594928cdd3ad360f64ae92dbe7d5096448329d48a6e24213a8361e457df64ad24214466306d978bdcafca6012b2562fe907dd1732183b47de4efcfa121234069332cd0b6b9fcb845e0c06f5da2517642ede1e0653f0997cf36e1f75301844b2f760eae677a22f18438ca5527f15e6e40583a5c9eb419f5d3082bcd456551f2e983bea576ed12f13e9b3059352bdec22e6aefd1e2d98b259d85f6fb3609caf5575f7327d27164c17e249d3bf5faab62b18ac6edecc3c248dea58c12c5792424afab72d75aa6092399563d57b4f52870aa6f1bc11715f4d89c99982e9b3e3e4775e6df7a560d0fccf213b488adc47c124b4f34eea4eb524878249826a27fb4b1e6ff4049399f03991171155e404a3e93c53bf222b554e134ce9a5bb32b622489709469b7cd9a936b4057709c6f77c49217cbc8d5409a60f23e242cc49307f270f22e5c86fa748306557588caac81a9623182c9df008293d093d8d6090bb586f962c82d9bbef674545634b229862a7bc3b62db637843307de978f1f6c8233221186fa425153d160453c5f2b812daaa7601c154229efeacd23f307956c890798f2b91f68121a924e31d44ba07a6506aebe926e25de281c9f6d243aaf2f7fd7760502522a775905417d781f9375efb2ee4b4a6e7c0701276e2acb5fce8383077ad6cc5741dd9a31b1864c57955dc0606f51cb7b2a57a54a706e6499d6f64c549a1eb2d68606cfd30cfc2f0933fc8139327f2c2b230f996a88f34636110a34a7da59b6c238485d152ab67750bf9828e5f613cbd26cac6544892b12bccb25d137eb74e8818b7c2545d4105694a75569f158620742a7527fa53f65598739eb8cdc8b5664815c6127fd1c4051791745261ec48b2737b0e2acc73136e7e445bdd730a43c85ed95f3e58f0b429cc1a415512c12e8529b946ecd433e2634c0a7384f38bbd1cdffe1d8521fe9bcab92a2461ae280c22cb3faaa7d97d341486ff944c6c43a9840b288ca222c8351d2384b37cc21c62ee9707717154653d61f0d3f9729fb690796e27cca7e299e9b5fd4a6e39611c9d7049fc269ad8761306f5924e789296f6add5842129f53c15399795da4c1843fcacff4f887f92c58449d5e5d74a7e09b3fb4cea0ca54ea7c712c6d3a9535d48b926e454c2bc365ac6342d2da829611293b9394a5a87a727610a959d51315ef5b6240c96dec1f298db2871240cb953d4bb2843c2943ef39e4f7e16d3238cab13fe43ce4ebb144798ad533821674ddba511a67422443679a594c90853c861524ad339a91c2ec2e8494ce57adf5baf0863e55688fa9d26c210ee7285fb0d1126a16562debda713891ec2fc1ad725c43facc91086ff112682382fbda5421843fe7d9c539d5813c2e8b1a1bd2372f0941f84d12dbc5a92ec283217844136526565c9ae190a845952bc78adbb97e40d089388fc96d3cb7f305ea7f3368b1fccc183eeb59c132fd807f3f79cc80a13592be68371478a4a16477fc5f760d2e55e6efa7b375a3d985fbe2c893c0fe658263cdc8b07e397976c89bcddb97207f3890b95dca61dccaf61490569d6c114621aca7ad4eb7f7430e7f710b573fe8c797330e7a8cadbede460109174bac3cdd8290e268dd1d93b9c9ed11a1cccf9913a255522baf306830875d56b153798f3e4450a6252da608ccb3935415de58e143618548e27d16623474f6b309fe8492a484f73755283d1e2a53209a3e2b29406f3c78b8c460a7ad6a3c1584abf2fdf728aba9fc1a4d732526d6e06b3584e91c3b9fe8c5019cc55a56d821a9d9307716dea7941c9680ce6f5145641fb9f9d480c06612e9ed49de5dd270c06e9c982c7f224180c2373977cbb53909cfc824174b490e9a283053bbd604ae726b2b729d321ce2e983c9698f0cf2541cac905a3eda5b7683ee21ae7168c6ae13e24fda616ccbe26b73d55e9f497cc8239c6c9778cf928ae25168c712ba34223fe25555ec114c92cdd64a88ca8d20a463f3b8ceda8946fe622611c0a0743815018080805d54d1b631408002028200cc562c170a86cf500140004372c263c3630202e1c1218161a161a08c2c150201c10854181202810060542c1602022d0c2ea0030763aacef3f044b870e0b54e00cf581fd7a02aef87f1719afee099cf49f71848b6ac740392efc3f37f0c8453a7d7403de00ab28bfbcafb2307eee171de7bce471a0feba18d1f3ba7a1a789cf4f97f405e9f502b87b0b7882c59839e402a50385fa3fe2a2a708c7ac3ea2e18c305ee11aec77cd036b820b910d271d132f9fe2ba882a3f2a19d16d06b8ecbf131c900fe481686fb17c02a5315f2380c06501775fbd181979fad95463f34a7a0167197f7bbea2a0a229d676be10028897eade2bf30198c925d2889d5da6bc02abfc3ed32372d800ff696c628ac6e34a86ac27b75fdb9075e486cc9e72e1544e57b6dc6d4581d09132af8475e7a95c973abd9ec8a0365f490a31e4cc404f4c383db9a08e2d929097c636198ad54bd40a05ec6efced63a225ee3fd2c3758ab017562d8bb973670e0b77b6e4c9fe05d59a932fbd736dd152a767c29a980362a424459892da5b8e1f4ff5e39e37206789f3d107dbb09271310840e6265abb1f788f1b2677d0a5c7224d80d2fac2de1c7c572d248add8d9b94ae14a34b5ee90237396f0549fb38f8fba7c67651731f5fb537c65948a215cae5b7b415799ad757e700daae3d039aa9a7f23db55ac4158149e50f0a41576c33a7c85fe377e561f30ed2c5719fa95e200e26835f57258d588cd8eed62f5ccefa1311699256048f1efb3e5b611373044861944e84259cd4c171b3cec6ebe9139c0ff977a998ab4b1106f0d57c5423c53b49be309b169f64e1a3e9c78557c0c1a9ee8872008a5552c941265d8f9410701c2670e0811bebb02fcd323a56069a882c139af3e6c29b00aeaf40a5fe01dcba9532b938ae6e741f44ac161ae155a1b6e48bc9e4b7ec7323bca98e01e3af01fe0281888a30e525bb9cc515244fcfdf09d024d3dcca2bd649b23a1749d89fde3a29e5e4969ec8f2f2081755ec434c15de4b566954061a2eee8a49de4b59dd8b60f2f50510af08b9dd595f1b0515ede0b28cd138eaab5fc41b09394f0a9b1ae8fe61d2ef6814e4e73795387edb269f4f528625f90d64fc2e1ddadf3781dc22296d7ca882d4111c2feb8d327e9643bf3f153daacfd072f631c9af939d90336644360a643980b1c38e8b202863ad9a9afe3ba8be03e1ec1ca21f7be0c17068254305034a1e2723b7070ad4edcea3056623ccae37f9da36f8b048a241fe4095f433b62ece0413009d458022fd3fc33c40eb6a92c6c2d44edb0c568014b3be9d0d7ab39f8f8a117d9d19ddbf2d120151181227184377f2477f6ca1fd1c13ae47c1fb5dd24e16774d02e48edc3fbeb5481afd4c9bb4658c4ab68a78a3a8eca22e6cd3d3d12a722fae69d6cc2554007ead81dd35d1d2d386cec1b1e7399f084b4946acd72ebbd5d039b54661214311cbd7df4f681a4745867affc111da47658171c2c9ce355a82b6f98e0d4f681b9e03774822efc99ac89dea93571898ae829d82f7a9bc6fad8ab765617e7d8afeacea9d1638a0e8d304e99c186d0549630894a0563aa78014325284ea13782cdd2ae14675ad9eb202ee80ecc290bdbd722ab993d12d41a67a32731dbb8cc10538a656e8832c008fff62ae66a9912929a6978d6613590962dec913818da0788bd85e26c827968272f2acbc16c03ba11fd3a8ad06324dc057e59f7e9c21f430f5b2c014bea4ff08d335cee3544bdef272cd79a1ba9b858e24f9904442084f8c9f3e0c2a75a25513223123a5ee6afe8a4aedc1d5da98371806aaddb24648abca28b66606223f4586655e2211733396290bda3ad4ed1dbda2e3dad798ef6e663dc11b42394ca737774a58ec44119585e1ede5d533fc234202250134778e7afe4c81ef930d588f5eaae0aaa6fb1bd611347821444000a456fd4460cc49af0ae204ebd4a134c15d2a13abc63ba2ba3a439ca128399ccda5305efc3e8cfdd309fd5bdbbab0c2b94150e9de5dbc5fcfb708311c3e5e73b5bcbb56b47723a5d92c08530f1d311452728b111d68aca7bccaf90f848d90aa5e54eab4b6e86957c2efc806c508637a66465eccc8b72e3c5ac3a4633c52d5ac5fae5bf5e8210f3030aaae834fd54a08ef9e91dab0198d38e7c2044b03d3f98e472ab284f03602ea7a67d150a72692135c8152717bf8d0bb6bc89869bd4b115fe338f9fbb72f092a70bf0639c39a07a9ca5ad81088047a6f0c39a7ff592c98a2fab5254cce82515a1ca7108144619d0a520fb4fec3ad7ae654836429f2a22d2bcc10f362a33e8cc08430c89344ce28253d02227e6a00b91629f08b6347b46f822f5586d20ff97e25bead968ccf32d4760ce8bad9525644e00c687644875d6262c71982094d50d228b74eaad1d2ff376f72acd2e9855624203d91ace3aa4b4b898036fe62f60dffd41a83c52748de5d27c7e904759783431ffc1112b325ed6d99178d8bd2ead221adf361c467232cb4fadc1626a10017cd4b4d1210ede70fd7f836b03f1c7829ce7201d9c2f1aa100fb2424fd42a86ea8332c8d9458ace43dd900fe9c4bfaff4b46a1288c54b6639e50d07ef7dc998651c43a782733a53bae5b2a41b63ade885a505a9198ceaa72cf5f8c3fa47f38ff9161d4926f34dd47da0c8e64972658d977e12629c24b0d5681c0134801604e5c43424ec097c856b7aec6c865ebdc9e33ac111ab44d19b3276150b875d94b39cfc4356bbc7cb57a1026974c2996896ef38dfaa2f8712132b5ee65526f7b908031d7b9162f75e4bd100cb15f3be58c2daf08c2ea1e285f1d7d3285eb416d317af8d1574adc9d95bd29e6a2749c6a7aded8b4efe6629dd82a75e0a62aaf875b379ef080bf14a5aa8ad1a7ee6dd3f8483272be51e114ce0fa53cc25a3ac78dd737b8dcbd44b51f6f06b742ee0915f45ad9e2d5cf9a55fce006eafeab40508bc3206235cd22c695ee17ef41f1ebc0522a67ddec7377424e808bae436cc6c6fb9f267c62b3256d66c595cddbf58f0ee59aa15a14532004b7cd79e226f71af871873c8878f3bbdb7dd368372f2beee6842357e82a217862075132498144615122a23ee13a664b9118b13639db470db94eb654bdd85937c34c0ab8ca279b2fc36b1d6a053b9ec409bfd4e161f36913a1b9ca41ec51f8a8ebaf9f2e0730de8548add5fb0c1267ea8d187656f76660a3182c5b322c841ac690d46c5824ac82bf6cc076bac2257199a1880ece13b64bf372f6dff55cd3fa3995daca55b6bece351ed7ed6cf6e54d8be5f45f010e7f1bbfcc9031b6043c0fb92e280f979dad768028ee931a1e1fc4e434a3e21b4e2bcac621e80c83729f90a20a91a1100becc93712353c605aa476117c105a6926111f8dab645d45fa782d8880e977c34bedeaafea9eb88558295a8d5a572789c1a44b29ba2321e9c354b1b2389b9523501a27ae392f0fb6604d04fbcd4919e64460b1a535aa0850a48e19c4ccd1015cdab2a80e4c7d0ddcad650a53342f70e29eccca81a65a705fbff9464033ec5eb4bbd8c5069c8b0531878b1e640fe10b85968a42efc3f28d17f2b772dbd4efd3c53ed47b942e0ce450f1814214af9035d5495f5d347767265f64ee57dc7017a4d7c0925d0b84d5ad4749a899e3894ba0cfb3c6707ba8c1c674784d95ca95b07906fdc4bf2da1cc51af9ab194518c2efaa8b7dba659d720424bd4d9bd13864f03e6dbcac62c223ab04a13cecf8a2530a548b9442397c8df8bf225abc49fc808afc48130c6d7b0c687f87fec1133f4be8ae901540d0d5283417a2b5908c06c9fbda990c1e9d3b026ad671398aea3edeccf4222fef8fa3f137ebd3a36bab1de42d1d90b3a19019a9f2849d3f54b9c03c47cc143696c202bc7e6bae0605e1d9749d840686e2230208108f2328ccec5d8cf1431b3d071b357152927b24f8570146dc175661927142ec972bc9a36b0d1a681a2a2fe70b1a80726d14a0ddca771d80ed6aed24a4896a8419f491e921c9ee364112f880ba4fd5ef183dd523273de6e583bf2abaca78bc44a08ae18bdc08dbe7688fe0900b350b4808f9c33a0a46882df5dbbc52a296edd72edb510e1ec8cefa489a36852e7d76a04dfd8254a0e6ce438da4e08c42facea6c0b42096a5653848dbce0360eb04d65d8d3974feab8fce68c43ebb21e51436f88e0bdc999b53648d0eedd5140ef19f4a5e35e724bb05c53a3c1282fd5e5b15b05567a25095baa23e744c731e00ada758dd522cceff0bfd10e791a03e8dd383855f9fb68fb7f48b79149cd414380ac957470296a1e30af17b11a2158d9f5276b15eb43b2f3800abc1dff4d500e55a7e7e6339b084a67ec40a819b81221b15ec9f27ad4908e43d7205ad2dd36aadd9bcdba1e5f618f7cc5656102ddf5cda4513c177a91bedcd7685381a645461a1e399b75880b928a94e733d0dad7b8add1b6e3f23d6a6107114d95d81417ef4440c8b96311e7d03209c09ed92da55a5dee6cbca5352dc6a3d1fffcfde11219211450aa8de77cf2e309d6d00fc6629c94c6388b117fbb93f9c5dbca38e823b8deb464808b79c814f01cc2fbe37c7e7f67e3f9e0e726b53ba3d2efe4851673ab50e5d5c5321de1d8b18a3e5f5b61dccf52ae78559aed0b1b9e8dbae60475c427766591d0bb34800eb449eb23f5f2b1e66d97c2ce531f9b5e1f58a0e6f109c6b0f3eebe9f9ae8dc3464350e30c691058e53710b383345858d83e965c5e8c603e6e3dbf910b7fab8c9bdd0a3563a75c451921802eced19d74ae5d5f7de5c2a808784f410793becfc3bc64519f345bc13084afe74756848ededa3220c79684d395e2411e7d3454c09ba2fecbe2e718dcf4d270cbb3262d32fb41953f338820ac53a0ce4e670104a980dc9912194deb788de50a75f96e100b93d0314294cd2c49fed8725b036b54c14100b294c3eb21ae94ec8dab09ec3598a53ef9e2035f7e091393a4924682c16c90f731aa253ce6fe9b7beff59a4ded8abd73250534eab431d15930be916ea24c8567833401ba44de39eb48dc17a9d67502be8f40d483509f4dfd1588b6e484030e30261713bd0cc0d7b3964087e52c1a55d7604fe635c17f78d79b3112b121640c7c6359456e6baa4eef5243130a9bcd820120cafe3d89173e823a91e818b7c24036470169a356df6551d0aef678676469a906eb524dab89d5c243582f11052040267d6b64052b793a2550f00d40fefd27cb70c0550f35b852078433955b55456b5c0d9877594508725fc09099640a399e817ea630f91fb212203f3210db3c2339688f5260ac7770be8360a9b20adfa0454a5960c2d4515aa2a3f33ab6c04e0133b5ecc642773b2e92c3f203f1b5c8a2648cc2c33df83afba5fa42cc6f084ed8fc4aeae5c54475e52562b6d3e51c37b5f4aded48c0d8ac6afa4bf4afc4dbc36da5365c4d3e5d968ce259b1520adb4ba1d8a30018b71c149dbb654c4ebe8d9e2137bd7acbf6cb175c4f116c33b1fac7a555d54a7386422d454a0aa8d81d22cbff57d29378d68fbba766c6b5f2f2ff55241c81a53176917616f6aa03d22a4eeb3da7ea11b95652166999062adb1a815a2b2608cd9241a83d211fe71b8b6aeb886e8f01b44a5911c9def7e089618223d508c9e8130a8c82ece2df4298927464381a38d3132263c5b989e1f1a085830a373e4a3f929e9506a5358c625dfdca11ff9765ad297af83684e098847b2ac9b64c0e837ae5f565f6849a2b1c7735d510ee8d390c21e3214f1892c6702666e1c068025465d7bf4d587a717a345acb97e567661e092376f40013ca9e02991942b8dfc0919be586d797eea14d9bdfcfbbbf36c134af050fb19ae7454989080c2b148c2698cdea3e6ee9c53aec29f83a26ec0249c9a74aa886e349731799a37735d8497f15906e95a9b720164c86e131c2e1b58d70be1a9f508ad41588b7c7a0cfa4f8096edc800fa3be5440c4792dd41ad4ac195fe84bd55bea045a0588cc9e67271873af72ac4d8c7d1f6aa71918697600e2fc402d42a6bdcea53da0e838d995370f8c56061891319f0982eca2675000a1974ef972b7810d15e36cd34646b9baf51aed67e04ffdba35f5a8eca7b1df53bf563143aa1e02cccc5fdfc20471462370a264e5db3d4091dca8936d8e0e026775a4c30c41137d08fc14ed47ff7ddf1175c6320067d95bde75a60b752e9e1d7d015576c937253b837410990fa37012cb192319e10b0a89485fd2a2c0521a783a40dc3ee640b7e7724124669779af1ff53088056ace862ad4db08d0d90521924fd22720c84f8b9e74e055c9d31bc3ac16693433ffa8349239c1b772bedc8546be175adbf63c01dde47bfd0c9f6ba38084d6a7864ea99b5a444a9952e014487cea91a145a259dd9ce6d2a2fa02ed4952a05002fe9854eec363bf51856ad11951954dafe87238878526a429e9e5f950a697fca7cac2564b1e864356e01ee789cf1dd09f1392f291e576b87302868ad17bc7d15a923587e01aa0d390361f224c3eff31cb5bd7796abdecd2550780967eda1b7c3732bdae8fdb001371b81d8f26c4964180101fab05de0825e997bdddc25319a7549d444bf96f92afbcefbc7b31a800e9e8d879d4ded0bc6e4db11311f74474891bcd2dc45d03dcf630703e8dcb2f87b0982ed272d214f675434f4b8e3b3a9c692e2b7999ec582f02bde5e415e9a0c97da6f98cb73f6716ae1ee22373a61db682292b0b9d14694371444cc15f0a87725106f4061472ed49e4c0bb6efe7b78dbeb71b730d1ee42d4c500da89dbdde112354e62db40d083cef8c0fbb2416c6c36e78906bf0d2bb907d7e4aab636ae79b0011db40e94a21b756ed0c01470148dfbeff5b897cc33eff01c01a007e01e4b2019765b0a515e1fdd86ba61e1f826cba8524c8de0909fc665fec3f39b3dd0f86e33e5041d49680ca6358599da8ae2aad6067dbe3b88ae5208472ec80de41a2283b391d74299fadc8fd0ff8dfba8462e407bc33cac8d10bc4aeba5aec0c67e7b9f1e18e62e2a2848e5b271ff8a0e5cd4357f4d23682870e86fcfaf57a2bc73e5a6d16a11784367cd4fba407d84eaf1990397599048592359d3ecbab17c9a7357cd7e3e652272ab51625ff31035a426d615c22102d3075841bf10560f8b1fa9a2087c7ea4b419010accbbd0051bc27bdcc95ee1f65a95cf7be006ed7f5c9425aa40b01a200520ec40c25fb82e75da903b6850e7edb2fe3a00cc61bfa2204e5d6da05e75abdc908ab41975b862e42518314f3621b0f32ac5390f7a9c01a8f1aeced9dbfd31ce1d5744f10eabe410fa26ba7b17eb5aa3dc18ac3cc79e2c3a09ff0172bddba5477d463bda9b06b3da72530d65de733923c4e426ca1186b10362ee073703e1cbb7a31b4c77575b445b7b10808a9db3503ceea27a417a3a2d10971c3848470def99528ea05369753622c2048a423e011a608f90f8148cabec7cfde1d2001369444e881e101af9626addb20fc31d5bdb36d620f8f90810a1b710ff7fbac2f874e7c145324a94d58fa0cd44f7ae951033c1c1b915a429dd01c135291adc09ad23d71015652d2818b5622e3425f556c7869bb25ef48185d84028e45f8a7ac5975a57cb9720337e220194b5c90029d5c04bd086474d11e6dc38b93258636f290ac1f68d073d14b0a4fa67cf69c09774d5614f4670f409c01d842c5c2b5d18df5de966e495912ae4ee7b8c48ca7efeb4b69b3d9c6eaf89a761f55881d465026d1bd5fdfaa9a42d01dccb34f17b608083f654322a44cd6ef0ec6917570597408b6d190efc4290a6441e7884b1da8211a3d11288571e450dbd0cfe8210aed0ae7aa5145a3eaa19b50dbd1afe834b42b14721450147b433d1b9031109ccaf894ef2aa3c8ac1bd423db01de1a5f0379452665dfcf7e12c07f2f7eeab4f2cc7c414a6f53097401d85b278e27a0c910a9317f945a3ac5f97bea646e7076d06ce1c5007c5e0f023e81b7cb354b110c64e91ea84b121aaa04cf03a5d20129db314316895a21b8799acb66b2f52a00c6e63507861bde2e361f8e67666bd77cbe69a54ea9513b4cbfe8fb423b4b813b552c34f9c9d5023983e660a624c5709117c31d4827e90e9666ca076ccb182190ff26582851cb5b9490fc65c05e2765c085814c3faa6402240069c08402d47cbe37d0f90db9bf6d12c27e408316dc94654fc72ecba4aabe799e261c50d9989d0d626d5e7923b73895b4115736b37fd4830c7a53d84004b7855deac6f1ee57bed07a7c739e4883662d61f874768d44790267fa268274db7b270de69d1114f72e826ed41a06e70d12b208819d094362772c53dd0741fb4ff563dc92d861d5a9692e078548afb36d08f7b3cfcbe76564336a1909e2124482887e742866c8802bdb407f924d64f024eb77c9ba600b60c22e3f5c838d585599d7aee999ff0f3402745561bb851debca70e5d29b01a5565376fd278265352b054237080d8cc0b068377619146bfd47306e56b1b9babf990747d3c5a5b889b6da576a7d0b8e6dee2d5a6af527ff84d9c89cbcd04ddc617dcb78147e933a9fd32e142a604e6d6cf8fa9dd50df519dd353eed10c1f4b94ad874f22f91411dd806958c7d25dfad7173724bdc25e3344db195bf7327be5fb25d4c2f39bffa30723fd6dcf8f935254c4825356a6913917719a659b29eca44244763a0f512527202777b69ca9407be72c46e86dffa86642b03f0661a139a46a2126b9d2f871ec0f838458b52f16bcdda25a291b8632e685908bce41902d6e6a83556113e9d9ed859fb0a6119e626731f43aec6a7b4c1787694a4a2afeaed44c4d3ed5ddaa2000b7a22e33f45a7c43b25b17ea642112d8c29ea7825f1aee64e9bae843d195f1e0727562c4f001a84252844ba247fdaaf0b20681899cf246a7956608655cdff836879de7c0c6ad2908460d959f998e088067bbfb223f660194cbb4bab235d1c4a6e8b1bc5e8b35ec99d71442b1b87c87a2c2e0697f334c320416ae4543d08ca953e5d64c4e3b3152d7a681b1597e26ca3f8631ec364a62f388646c87595218d181b3c8a173eca0c5b0256a8987fa614d81116123a39df6283a387926d024643f4b1db46d904745e1c8bfa2bb0547392a307f8c812cfba98ec389039c18b86192f2da4dbef509ecc2338fa9f37c04daf6516fe7e58287053539e21137186cb966608077c3d803bb0cfd3e4b5108037514aaa8e14cf1709361fb4191af580de71ebdc4056822dd78a79565492e68aeabedf9e284584ab83f0e1aa9a960ec66aac24515daa42da6c3aa81299f497523650a7c547d49d1a02cd53cfa4ffb5f3bf593b709012d34bc38273571a6b4afcf5d0c31a2e422970120b5000389595aca2112da475a1a262433d7fb5572874df82f62646a203920b885c1327e8c1e76aba0f8667613e9cf5022618f5e1c00d51e7f384611fd284dba2d6866b321da1c5cd351d121602454da75a93aae55e4959f9f0e811099b70e6e220788718d2ec2f2323734e0316eceaa179392afb9fbfabb61411fc5923d639baa830e147c35742652329f5a01991a60950a2515e595dda05a63bab37ffa04dd2d99e9a17b162de1ff475a5d341085a509bf55722110502a2a4315ddcb4e78ff77463ef53131139abaacc1d97e442e1cd500001e010e619d4b9176c07c0d85c77f25225b800d4f6b0ca26a4e056d3c233ddd9512ca1b0b2fd139c98034e1cf9ef0433be0d1a104c2d738d360d550810a0a1bbe7553113a01160cf20700d7437362b9bf98c1456786cf0da3d7fd99894226f36c89a3a7999b7e7c965f7ccda23bcacbeb969c2ad8167cec14e3902fcd61cc1e29284c9016abbbf8bbc31b7cd7ca90243ec5aef851cb6231ee5c86ad5f388c597b218c2450099e56417c153c7f857f2dbecdc9a2efe621b2024cd672331680e48186173e7499676adb033e35f68776f1ea69ba8d04394bbdae03c5d2c1b4a5a1cffa07c0f4d781772e8366022da45a899e778ce748139f65a9f6ad2d6e738b0507284f66bfe8a8048496c26924e53a1503c507058fffbbc6234ccffb3cc8f7f62d5fb1fdd5474ca2f207ba009f2bb22ea1d13af23028af21efcc36adc46cd997c46c33ee7f2ce8e9d2c6d176298c073d982f28da2092ab655983881653375b39f4d8ba8658e545297b456e644970ae2eb418497795aa2a1c76864409a81f0a0a2a04e8e693cae07d34383f8bcc403e44dbd521eab9feb8c412c1ac3a71b06bdcd89e9718531eca9c53c66693b03d96ec0fb4b8c7d32ba4c94a65cd6259e6c32e9510d6658c4ff1fd5771da7140d84e5a54ebe1e8fd26031409d62ec6d6ae3402ec80b959f8246c601e6452d4e8155440bf55e1adec40d70983a24bceb4b0e86a04d1aeceff9b5b27e6906be1119200674a07381fb336ffdc15bf1465795bf91093790f26153479eccdbce9977f7b95c580e55b25715119184cc3e62eaf0f2e716a3634040edd563c8baa290de0ab72d09d973217a76684f86e885d0e901212dec2df40c00d0e799131bad923dd1e34f7b03456f9eeecd533df8440fa0e8c5133df7143dfe74e6b636dc247892243ce3034001d41a5e29b1f155ceb5194ab26c2729b716acaea5c392b594c885ebfcf44b70fa703c6178427d5191046bfd81f286b5a0f74bcd8a375f0b38a056de8d327e58ee3b8254bd72e42cd4706fa2d95d44186be09a446267171ba50f0d33f5f910752f48270cb0470b23e8bac5478e6d45457133b8075327165fae2b760984a794a065090a6b0a92cabe37ec268f8529ce22d08839d7e76572b0781e49ff472a135d4a614cc55b51e9be7df7f456be7ebb16bd4cce350c7455e53d8efa44f767a8092b202448c7142ce9a8f0df78d469193f9fc17b47b49c8897076f5c6c8f56c8392816d6949da046cb06156c0beb545a3396b9d204ec5e0a26a1bb495f1a1091f65a99d9287c31512245523460cbb2bd4327985ed062ea01c0940494e8c216be97b64e27326e3098abc5f1ad792e679cb164c031acb98c59ada111c7d4e60541cc05d6d5a07407d9bc36f039e4219ae83ca2b2ac85865eb06c10e4c72cf2e186913b294fd6129b490a501c54dc253131d691018e8cc35b6d6066d001884c29d520f40a03e3329405ad5d2feb3cbf84937e2294b390a0c39cc3ec6d7af127ec23f737f8aaf790dcf7dfb9e50c995031577bd717bcf6ca8660d9bc58c5522051bf5a74523944a8e2ddc9d9029d4e2551680be6f3c5e00bdaab980bb1dc5c98b9a65319c17fb702aedc8cd6a5690e48455621cddc6d5760ab641003838dfb7e01c1aa0306b803f1948e6bb2a17fde5fee3e64aa3347184458b25b08573dd1d6bf1d0f251187002432ca05d39a00407977e8f470c8c29585a900b9ce2fa836bc45dd77f043ca59bc41831886d52dab99159e7dbc0f1b8701add0c2ef1f987302fb284d37586dbfb92a1a77eac9bec7783f30483d80410440a77d6deb0a098412acf9ab5ce4750127934b1141ea0040e2753d49217a74eb25bdbc2fd0a2b97788643d44ad1d3e2704fca02dfb61ff7569881832c7f51e22903f2efd43036503a1c85101fb96603a368fcf3284535538b3fefdb62d9077c6fa68ff2836355b49363e9aa1123e3348dd63eb2e52d70addb9d3bdac6eee74f9d225765d145bdd6cb3424552985db3f0ba18dd7a5e9dc9d707e196933ef829c3a802c0926bbc0605aa2d666cee190901cadc300a54d26e8ee03bea9901477d9c358ccb19860ce7020e4d4e73f94d5ada165131871ec122106746d9adf3152e6c2d8c1ef40b74dde52568fe0675ea9641f69598ef0f7bc0c89e3a68496cf130924b09d78b94452ab3114e0bd498cd18a241eb0f11ed745012f66c812abe945f64c3d1a0f4742ce71a939e7b0614cbd580f9582c8760df2013033ee9422cba249681a0d130fae5f0407070d139070d6c99c4d0bdea1d302af72529f03804422c07321fcee94388360229e10ae47b504851e4001d5909c517756536bcb6cf738d6df11c36e45d148c32ee563228df7b6112e65ea50a9180c1ad8b24cbaa12ba8dac426a9adecb5eafeeb8e90bccf5b552b84d7f8f3c87a0ff9deccc9bbf65aa7abe29a6ff36019b3b647263f92def687006c45ac6ae78320a0e76ffe4e48a968caff33718a055cefd105abbd753d1f1e72f0099495cbfb8f5bcc306098d4aa8da30c1ed26c57b9592cb29e25acce445b0cafc99b849a6275590fc2928accb3d554784008d2dd0cd687408012c8a23106d6b4bd1b099cc243cab862a2e0ffca5c8f62bb0a203eb5bca69fa95c22a2ec9ec92900ca8be8802ccacc0acc4ad6cb329f3f4f204b4f1e9bcb3285aacecfef1eb85f78628bb8e40a7e018b036c01cd7a889760dabdade0525009c3a463efcda0b76fe2c329007134ea5a735eeea0b58cd175107d1f4ede346a27f2d46504af9e5673bea39d1b0316ac53d76a0f689badf67471862fe859ad6cc38a40dde94c418db6c40c84ff5bb2f9c370cf0657eefb1da50e4b7fca368723400bc85fa7dcd66fe09d8411a0e8b250c01d369627a1e9926e02a92d365f87283ac2734dcb6acfbf63ee6b41259617ec346a202748e6adb9a2ee8955f94f551fae6f5b39c1676dde3e1b098ec8bdc93e18812d43401162db7fa702eb6c2cb8c4b881744f566b06f948bbc7287504128e1c909116b51292b82ed6d9addc2ed711739fbc95517e721aaf4a38220e07f3ec7579d66777046ea07cfd0ca1781afe676abfb0ab40deb359d32a19fa18f8847a2f4eec1f020598e357bc1dbe0831c275fb0290812f51cc22e7268e3818a821bd52f1ed4c295e8e3fa236c9556988cf66e8d1b3c462509292b3003fc6b4be1147b0b00e98aac0f03de96c55d0e3540b0a6d0013c0c3c0c3c0c3c0cbcc6f05bbb6f76e6d6fe96524ac1003a08a594524a2925cffd8fff5fdee2ad256a7d44ff8c03e102e10e3a0e420e099d337c1c1921030d93d0de2f4a925789c82f213ab87f06eab0e18ba2094ac97b61a3d604d9f5a2bca52566ab9d0b0dc88fdf71467ca034fd110408f2a26462fe3d7efe0919a75d14548d67d1bf65a5f7d545c944b31ecd1fdd4de96de4e2647d3ad6370671519c51275aa2fea798681033925b14e3f97dc9bdb0ffbcfe2003fd19673f5290206fc60f1f1cf0b6618b736dde12f7191a2341cc48ba166a9ca4cb33978bc64802f2e3cf481b810d5ae8232a4be4cfb264631645774fc2695fed2a2553b228480f63f2a7dfdbd7d00e360d72d0f811240564a061d206cc3a8819c9046cc4a2f8e2e94a0e3b93fcae1d6c0b8bb29aa930a1e4ec5dbb011baf286e079327ffe42c69458ede043a7400f991c8b0e18a629f770e5d9bf97aa43dd0400b52061a40d28f5694640d72f39baa04ad27064800831117d860c5a33aeee6242635b0b18a92ea2c5b2332892a0af36d5a33db993ae11a01d2a928cc760665de254f4545419e787a4c9dec77c977b00531233945d97ed47f583f77b0e9036c98a2a0b6e4c867b5dfacbb14e5eaa0591e477e12d4ad6798c1034951de5f93fb640cfa674ca3286be638dfae2509ed221ba22849ba313dbb6c1a99c7c3a3c79b804351709137f1f3fd9f1c53a028e946d7f418aad4ca7fd2193b4868fb89c25ce7cf27496b3d510c71aa7abb393b9e4702188cbcc04627ca291be57490b7cd79730f0ce8d091468fe74441a9d2253295f48b3588190932c0c62650870d4d144f99f8666270cd1a353b401fd0a143870e2067f83026010c46908d4c143d497a62274f4ac932c14449e826f724ff6d9a8eb944e124cffd20aa94a037b7447994ebe7ea4c6bcd3909d8a8c4a57663e7aaae72db6e275be724293132a5011d3a50e271868fc301148c714589e2697ccc1fa24ad0ad272e3626511236177a9fd5c33a248972cea7ff4c17fee5a56ac046248addd9449bd6f318aa03898292f604dd7773b5187ba432464e1f512e936943e7f5b5cebb23ca3187d9342a324615ed48193c3e4987471940dc7e040182361a51329d7de7ed544614e6d6d2e48d2b934a2260631125419c2494b8d993a0d44e467c0419411b8a28c9937abd93242af305d8484469aed3987ac7f2f1161125d91717971932779c0e510e76a5b2933c524c6c28fdf81d86504d096a4a0c423edc5060a3107b09e57f7fab2622e4831075b853428d6e90ee2f423e06d185cb26a9941e357a5d0a6c088215e5dff3f7deadc04620ca3944f6876af099ff75e0a38c327e0710b6b5018854cf642d35decc74f0d7f6bf6ff57c98e1e3c719762ab0f18752b7a9e71d4f4aae9eac6cf8a19cbcf624a95de26c92d9c176520e467c04c1b3d18762b4517b9d5a3767d3238747900f02e44c49008311b3c187c29e29e9648da7d81af38224201cb0b187623a41cec679d72489cd0dde0c3fe3cd80800d3d14b6b2dfa4cfa8b48e6bdf196fc6076ce4a17c15736d8214b355770790f7800e1d7828e86692eedafb1936ee5012f7649ad6bffd51118fa1820e8cb103c87b80db0ea5b2fd594d36deed888f2026384303818d3a14dbc24d0821d7e5830d3a14338b4cd56ad65fbecea16c3a98f451a34c4caf8df44846cc00f23a1819f11104310336e4803a2a0ea5571f1d74eead7a9ce0509cb30c4a75a7476cbc0165c2e9df870c93a3203dfe3c0bfad2f811a447d233de0cdc810d3794d96883ebb0c18632ec61630d653ad2861a2a715d77b39a4f305310206370000563f4d948431b1ab86c9ca1cc8619ca21c48338dfda4619d06c90a13c1b5fe665cb73a6720c255df727aa713f7c92188ab9a4500b6d2d1f9a85a1a0593f8e4e6975820c0243d1e470a28d9a1eed1c6f828d2f94c472bf3c8e121dcce385f27f0c76c24a3e84de74a124669d1f6ad5c4ee3c174a5e7ab2c899b1ed99ab6c6ca13832de6ebbc466c9b6160a5ff3317e8dd69c35ad1ca08d2c144f5853ea0419830cad66c106164a4acc478ce89d6ceae40ae535bb319127ebc6bcb14229478ef6a69e2779548582d20b933bd99f32dc3a74a49971768064b04185e209ff9283cea2fd791f6c4ca1ec492c4da7fec2c186148aed1ecc2449923e95a424b11185929bdcd96e4e7810ef6760030a369ed0cf26ed93a3dbc1a683ff918e9ac186138a3d9e3b6c6cbf836d9160a309853d69fe7c344779770f369850924f92df93fa8c4f9f440f369650d249e6f4bd7fa7c47e9550cc24bb9f9876a36ae11d6c24a1248fdf9a9ce395bd8d4828fdd9298da542b87d890c6c1ca160ef9a4685c9e924a9bac186114a1b65ff55ef948edab0c14611cadbe9bd9f643d19f7da2042b9f4fefbff653bd86c0ca1244bc70cf7f33c33103b820d21944ec9ef69399993a03a48d4084669ffe2d3d79c9c6b4c3bd8ee74e850440d6074fda2f8594f97861abe2886bcd93ba1e4a0a368c46af4a224c93b15a6f455d8782c508317c551926c624cba539aba3576516adb24c95136e7ed6e0d5d94e4605a655663c7ae4e5ba2462e0a3f2a63e5e4ef94c926450d5c946ec376d69363d0235b4dbcf6448d5b94edd3c4367bbd778e75a2862d4a82ead4a1f4c7b66d0c1574c009356a51f2a0da27f975345513ae440d5a94649f3ce11b32f8aa8134be8c94356651ee54dad525d7e50959b1004f16c5d8195c733c6144290d0d5899dfa1462c4a325d5d98cc6d51a68da1820ee8705d440d58144c92737bdc0ddddd5f51ceabf1eaa4d1faf14a3bd8caf81e3e780479b4203dd2f9914cc06568ae285f7e67657687f1d4b4e2f4b97ed3c9f16ed6604539fe8f9ac7385f72ea6baca2a4b64eccf2fd614f5ee1504315a52a516e637e858a29a5a2a42cf7b54ad850b27dc3420d5414c34c3cf1293a9814522e438d5394fc33798a924b53a7ee0a354c51dcd1a25447d73839ecb452f87557ae1eef559d567992a275588d516cf9480d5114e48a126e2a3e49a50495156a84a21cde538cbc9c8ed7c3070f20ee821aa028c94e22e3fa69a5e869c48c0f353ef1c6c847930455d5f0443156dfbfd536e8d768558d4e147fe49c08ff35f164722ed4e044b13fcc468a7f8a36d3260a4ae8244eac4466747e61a8a1895209722e6485ce24099e4c1433438432a91957b3061365f7d96dd18ce631da3bf80f352e51d05227cbcd697749fd09352c514c424992e7270fcda9d383c7d6a8445975ce4c2a97cd303f053a7420a10625ca9f25d666983a5da53489d29de7a4428fc8e0269244c944cd53ede132ffc744a23cef256da5ccfb7a0612658d7f92bcd2b6a784fd8892a61231e1614794127644d94f94b2d45c4ad68e36a2341a43adcd768a57ca88c28e4e929259d7b3aa5c444126e1a624edd6fc1615511879553a8bbaebfa30116579cb92d4e81051d2ea72277ea7e6e4ed10259d4737ec95668892691244dd749b586521caa1fef4f976d0b964558310e5cb52aa3fb2337949328882fa9c38bfd1bd934e2288d29b8ce61c7479186d12886266db1863d8f03eef0144e1e47c2641d59d3cf7fca118f4b78fe85496b2bf1f0a1e4acad4217f1fca5174c9e81e3b43f7e643417712de49da9c5888f7501026876ec6f4256e87f55012d65a42c920e7a198040f13523b9c6767f150ae8c77c2eac3494266ef50f8e49bd1b53c6728513b14e637c99ad6f563ee5a87b2a65e291132c7304de950f60f175264fe3c87730e055de5a7dc3ff4ed470e2569252839e9fc1c4b380e251d1eebffbd436612e1a0c6bf3d25e8f10d2539f6add2edc3724337944433281dcf39e5956d2865f693c49f786c2869104aee5ca26b28e6ea52a742a6869249d2f8c626e9262a4b43493eb9355f83cc79d255030da5fb6cda3272ba2ad32329c8db19f8aa733315b17dd1b81022a6dda60a410d33f8487a7ca0870f1e1a70408d3234a0061946789c91801a63e0710606d2e9e1e30035c480801a6150400d30f03803033fd20d7ef86841091450e30b6490f12a70400d2f74210135b850801a5b1831400d2d8c84d4c8821835b02052e30a02a861851b35aa30c2e30c0cfc0f343020460d2a94de42760e27d667fff0b800f54829b81a53287e14bd398e6d70f9f08aa08614cac94d692b5f07a907d6884229db24edbd12753ab635a0f0952ad10d2632696f90121033be2ea3c613b68613caa3274cd7270d26d88614d56882d76042d75882d75082d74802d640c2d53882d73042693dd4c8243ebb989c221493de568fd93e87bc8c08e553aaef62f3211483be911daf4188aa554308c5a8bee5aeaa6132570b2318aa9db21b185897f809362efa454989671dfd4ffeec31f6457935e99feb986218bd28c8334ffdf02274457353088317e5cd9f634ea393ab787e17251377b27ec74edaa4954218ba288c92459af4a04caf24e5a2d4d9e47a8ff2fc191917e57393eb4439e1d7a2738bf2db8587f6d8649ec43fde041e862d8afa1ffd53f9c69431accac185518bb2c93973dc4e327abada4218b428ad69fb6af1d31837cda260baeb3f83ff8932b65961210c5914b4a6ebecf2751db6d7a1236dc4ea5211462c8aabc1848ecd122c0a2756c9f0a89b34bea40c61bca278a24a103f7ee2c827390118c27045d1db574f0ced68608c2ac1181a18a348308606c6a8118ca181314a046368608cfa4318ad2886127334f4e92c3bf38e3058512ac94f7568901b63ab28e6b859dc9e9021e76a5184a18ad2c5c5c6886bea9224d9c1228c54144ce356cc667bcf9dd9c168a0a2f0f9e4f4261a4b563dac08e314c5dca09b3fab86ca5aa808c314c5bcffb9ee3e29111a64a708a314e510a2438a0af5b42d91a2781ede9e242f615dc7eb4218a3285d6e4e3a74850e19e3c6853044512a317dc7a7c6e8a9e21d43051d581f6184a25c5ab25fde64a6893040512cd10e267e56af8a910ac2f844b1cb5428f1b2cb242679a238629269c5f966fe341a098b208c4e94fd44b76694cb659d1b06270a1ef2e3e9a09a6312e107c2d8444987faac3759d6473b19600e4313c53a39a67cfb9c4e1e6e44189928ea7c7f8edf3f329e3051d0cc314691493ce87c899277d0a5dae27122b444f904d5b4555d52892d4a70189328963c39937c30d9a4509244513f653ae9a453248a76e97a3626c96a7a48146f4b3c49992e29ba448f2886ead6ee90a94c4e21471445c98e08ad50234aa2d6757ffa49ee9911a58d5922f79f44eabb889224d49456aa8892abc972362af49464228af2376a69cac6373c88288687fa09113287289dd2314a7e0c512a496e4c1aabc2335f88925c327f9c5199f49584284999467d0607c126080e23102591e9e435d137aa6a0f88d29a7892b9e9fd0fa55af9126e1ed6e5771f01a713fb2c542ddcf842f9bc2f46699dd30937bc509021cc744caac4fb946f74a1684a26e9e4ee3f39f6e44251cf74ba3c25933c3ab785f2cc763cf1635c589a68a1243ffe299ddfef3ccb42294ccf8f85d2f8b7888ca2be8272d7b99a25fb1e9b9dbec17d6492338fbacfad500ce126e9f8eb39882b19b121dca842317d6e90324a59d90651a16862f3a9569867e9e014caa76a4c8868f9f93a49a1e4b143990acd8d2814348858b5b679030addb7d9a677e7cc7ab8f5de675cc6676f3ca1b0256fc7e89e111e67fc483a636484043018d171c309c593ec6ef35e45a38c444170a309c538ed58b2ffed2e9f1d6c64f828033d708309454f77724ca73bf9cfa90cf33d12193e444002188c88e0c61232afdcadec2cf530d53abf52da419d85dcfa890c327c88e00c1f24d0a1830c1f6528de504231af09ea5ba269b7ec8e70230925258ae92fa57962fc38136e20a1e025e977b6a81290df61021eb1346e1ca154d2efc78cf428d232d03003c75041074880c60874e8d0a103080ff3239940878e26010c467edc3042e1a4f4a0dfadef60db16dc2842e163c9122bbfcdf54c4428e7b4af99bad2d3c35a861b4328a6a8c6ccdb0cb13dba2184723691e1d364ffa5e7835196d9b95c35d164d2c9c0286c7813a2e755915f9453c8b8d02d490cdb7b5341c4172561622661920e32d3677688f4a2e0a34910baa4cee1768382082f8a9af46d52a10413bd4a76f8eda2e4fbffbb5675527a76b6a70bbc42bd42ef63e743d4533da3be6aaad7c3070f915c944266be46eb955d99457051502b49f6b3cc276d92dea22c7fa2c8353741a379b628e9b81e9d73fa5a144eea26f14fc66951123c93ecfc8ed67eaa59946366993139644b923d591473fa9eacfef0f0bdc5a2924db5b3aaf70ef9258969f7eeed6151ccdbe15f7252f4694de4157e9bd77985ab9dcc6d99a0aef1c143d6a94f0d445c516edb8f93d48ba67cdc8a920a559304935956944d29c9e49c319707b70f101e66e42a0a27ef5a9a189eb34949aba220b7a3f3c78979d6182c88a462cd9f19d37bea37c1c813445051cc3d5d9ba9aff42795c8298af996f65defb9bdc414257162434b7dcde69da5287dc6d7ffe7f0d9df91a2b3dbdbb5fc725991b96cdb647be273cbc78d454651eef45dbd4195e0404414a5be52faf7eb94f2edd62a20128ae2485793c4581adb62048a928c25fcf22b63fafb3f515042e6d277db26d5683d5192234556a7ea9c741276a224953a41bb32b3d469443851d20c55e2e9bf6e92f526f44a79abf634130f95eb2ab946e99ae899c4a489d2779f122b9468264ae27e6d6777de092298288c9a583a479ce5c7510e442e5118f599f386eeab0c93250af39a4e6f7e9c1cfb57a21cda64ad5e8722942898bc75273ce8182243914914ece3bd4f6549d23a950c005110914439470df5daed1444225152267558df7c7e0e6132e37fbc09d21969a8001225a92ff37e2a91b1a482883ca23ca2e55293d838a21844e3ff9fae140f1dc720d288463f67b8be12538208238a2745a86879ea9c53b883ed0c0bf2c3870974e8105944b14d6ae8909f93c682d6808822cedaf94cf89344942e53751c0f99e1d32e828872a6c9d174f3203dde047b8862b5efe751b17b37c2b41ce8d09196034c133144b9d377b3a4eaf6f55ea410e5ce572568dd8b901324428872699df966dc9cd74ba88cc483033a74005932880ca2741edf74d69f6a12571d3a74e84823880e1d690439348808a2983a497ba6e24e9c7c90472375754702188cbc48204aaad3e8cd88978fa12402889289c8f966d08afca1e4a74fce25cdd87810f143419c8dd65a19e920d2876207e1217c537b5396f850d62b53a27eeab9dc5d7a10d94361830c72e7da3fea887e10d14331739a9997669a1695481e8a3a2a3dcc2d84c915c243293b5e559c0e3ac624e60ea5bb18eddf6c6287d2e86477fd763742f63a943e57a99079573a14eb32e7d2601e747658640ec5f07b9175219443f16d4f4e15d98ac4a1f0ff39be3a7b22702866ab86a767a76c132241e40dc53711379127acdae9dd50fc2477c63631ec3dc436146327a1340966ddea193664a76b6b2f9fed1a63e2b1aea1c7c40ded396b28270d99793b069983b85f105143e19324870ce2d2640a3f0d2521dac7d3e4121fb3e565104143319f3849f6203798a0e45d1039433964665cbb69c917930b226628a886fbf9155d166b2a43795ff64c85168990a1186a429ab8b13d9b3045c6506a1d3b414f86ed6d911044c450d8f0324196a03496890943e946a4ed8eab891f4ac0504e9224c6532eab419ffa8562abeec95632f342f1f3467f0b3b75a178279baeed7866912d17b6111959f53cf92aefd898ab6410bd55e299ec164a269a2c5e5283bf6aa6af20a285927cd22e466a902786259285628961843eeb1ba1d923828592d45682d86d958f252e7285624cb19e7418d9dcb78b58a1301e27232ddda4bef602912a14d39abea898d823f5a5424143ec7f9374894c81b5bc70d576d9ef589dc9573b9bf48948a19cf477d039097392f25c240ac570ad41c611d9277c4e040a05193ef67fd2b3c813449c5032d5fdecd49dcd3b25d2848266b7b2ee9874899f08130a9ad56c45789ad151892ca1541deac194dc3177c6224a484e1f37da88449250b6df50a3e5fb4464520409cedd9ec77ecbe7c7d86a224728461feb34f21b474348c40805259d8cd5a83629b22b43a408c5f64c8bcb8d458850cc1d654ff668da94c57a079121945309193dcacde6f841224228e898b435dc886d6e644580810c9440041d58168404a31863beed2c510b0146a94abcd131d97af81ccf2441c82f0aba2b3fdb4b902f0a5a7a1aee4abd282921c2f53a6dd071235e14a4c9d57d920e3289ded945c94a8e31689d58d9dee8a2a4d2cff429b9b19c3f1765f378e275c74fda0417854f25de666f12224e7e8b52bf26cf51624a4f63dba21c447e0ca14666b6538ba2f7de77ae6adf20c3b4287d27939dd3b6c97b328b828a3d41dfa5d9c75316851322325efe67539dc6a2f8259a7b4acf38b14f58944c6729d1d6d739fff78a72987cc2bc8893d1f4ae28a95332d4849f20bfb35694f624e9a44fa5d4968715254177c9bf59a399e72b6415e50d4a9bdaef4f9d170821aa2808538da24fa9378d53878e11fb44482a0adef6a1c473511a63dec13682fe1015c5ca1a996234e2575784905394d48d74dfd5185fe2c7142559343b69c556a528462db9e4f1ca5cb1931d6c21a42887c949e4533398dcd6284abae48637315b7c4e1f5114c4baf767123d1fa60d45e93abf9dea46590821a028c59f98042165478327433e5118e1576a2784c9d48478a2f8bf2942e43685fe5048274ae79dc4e81d4fe38eb8836d04219c28aefac94933a4f9ab1fb289722ed9f9a36f6e079b0e1d411219233a742c77214413a5d22a2a5ed3c4aa0c8764a2fc417df89eab90d6d9104c944bbb3795fb6697682197289c949b34b89dce861d628982599fe825c59b54ff56a220feebdf269f0cd71c568450a23452ae4bb83a539e931ef0ac43c824ca264e30c1df5dcdd408248d14826e4288244a2323c306b99f4d258d44a9357ac76f1543205192f57e7487d649557dc8238a31c67c2cc14c52f53bc411a53aeb24c4d5889ff01b51d0ee574a9e29a93bcd783808614449ac2f318b891ae42ac61f842ca220cb64ced9b75df77c4514d33688f2d26a629e9688b22751b3da9ca85e928c8862993ad941a726c93c098f1b380e21e410c551a3ebee33bded961c0f420c51eeac66b2ef6d8014a2bca3669d2b4cc7d22144d9841c7751fb18bad9200a1f4c8d4e5a63ca7d91a51122886236b13adde56d8ad3620f420251dc13ca7e5ebf04a184858028dffa9db898ece8d8f908f943314e3c99a9e304dbce0fe52073a3bb9f96f0c9d50312d2077baf54e688f7f850da36bd26b53b69db6584eca1b46692e64a13ca4c26dd8c103d144e6367fb33954d79939187e2d6291d4a3e40d6062178289ae82da73e84ea16888f1d7c83903b145e5483fca06bb2ca166287b2668a91399b4e72b229a40ee56fcf9b5b4f340bedd0e1eb993fb73c8d264884903930277a77bbb3e6daad7342c78f294d8b968e102287a26556bb92dbf4496996101287d2cc9e7c72f20ccf4e7a191cb69242a72f5b2f39db1d84bc017d720c4ac56d8b380c216e28e6e5292d2f254afe15d2064cdf5454b3b5cb0411a33d9af4fc216c28fe9a24e97c9a394486d7508a17b1617bc567aea386529f69aa4d92a8493a7d1a8a6725f4badd6828c898744c4c5e4d4d3b43d945d5bfe62027c9a6cc50f6a067bb369d8ea326652895cecdfb4c13f3e69c103220ba66b5699e5bd5e96a42dbeabb27b9c428f6184a6ead66265f22f4b885103194de4cac12e3a439d9752c8484a1a8d1bc94ae8b685493103014e3b9668b5f590d230af942d1830c93ff949b53931d6c18e205bf36efd3ba5675d3c2b4ab5a63e8fbb051463bd85c10d28592d0a3a33ce59e0e232e147e3659a6681c75ab42b65034352ab49cbd2619422d943d499dab4e2bb241f782902c1477f3de888fc94eb20f0b66a79cebe659de6e7d6bbcc74c82da43ae5092492fef4a0e5aa1f4e1d1447c9d6c723acd20a40a5e9e5462501993e6f9544844f98a4e4acdb60a9942492eed2489abfc532b511022857249a24ab46ecff0650a8942d94f752a61b2e71884dafa2150e0c6b54e5fbfe55c3ec30c1ef8819027943d27f9724a3576924f1ef000b2021d3a7cfc483ce8e1a3870e1d66a0d1c3439c500cedf1eeb4e4793c37439a50bc8fffb1f53235fbfc23ed383f3ea5e047901498f538837f0401821ec284926670d9f0b6cf6eb21d6c40789831d22395c13692c6193ecea590251453dcc851ee9a472db383ed2e10a284b208993942896a269b1908494231669af8a8b9fef81d87043018e14008120a271f4aa98dee1e53b3834780f038f390239446984c3a4207119d9b4523ff830cb5330e314239080d22b5d7e4cee320408a50d096cbf4a6c4bcf1734a8462926d1b43637793b83984d2a7893da6a413431226c57f7b5c065d308a9bd5f11fcf323d6014932489330529935388e2e9062b13939e849e10e54d269af28f9ff4f24194acad573336cc9408a2b8559b736ef32c9a0e44694f49b1fd9fa53703a2a4730eda9b422899ed1f0a2b7a932693a3b7f543713ba97f2a518c3e94eb3d9f5651627ba1187c28a5af67e5eceb4912630f252f7513d15f92ac8aa187f24923b3c709e72526461ecaa9e579479528e7e6321e8a9a3ff77cc5e68606fb0ee53afb8d7dea9ff2ead9a158aa523f6636da655c87d25965149df4b6838d0ec5d2ab12e227ad6f9881cca1a43586e7e78f5b6f470ea54f62d2499b60b9ea4971287b67f4331b935d94180e0525f3bf8813d97f62de502a39b747ffe437f3d90da5dabece76f7557aa681186d28d8596cccd3e9f7ffb56381186c28f89ca85cfd69a97c62aca1a49f76b399fcf88cf61d410c359433358beb955292ca98186928bb08f18c17d281186828a99929e936a6b7aecf50cea66e9214fff7f12533144c50bd5146b35e5c4381186528a6302592a19c36f5ac5f68d1b4e90e361f4339786f8678d34c208618ca5b9e71b5dd77547976b0b918612828c143d4893987134264f4e04106193eca0043c1c47c234b740e27786704627ca1e8fd66aa24b7d2bc508e31746743d4f76b294617ccf0e12300627001f5e0a1831e688488b105bce32aafabdde2e244348fbdccc6e40ec680185a285c6aeccc1c937d442da30c1e21d0a1438c2c1c72f6c2a35a28dd76b0f9898105ceedcdddeb74bbdd2e3424c6150a4a507e7af6bee133658592dc33324d4bd2d1499233ccf8401a190002e44da0021d3a7480418c2a949358de9fa563ba2b691e4932824619cf820f7080033a74f4894185c2e74f72a2aba7dcccd829943fa7d0eb26ef89a7d38f245d0a2541e67c1f54bcc4e347908c42294443cbcb9928144acab43b7a8f8aae9e502caff9b4799d3c7dbc83cd9d50927247988650724407b1a9408c2614f4e4784a8dc6d1d0498030a1fc49ed9b248a5d8ab684f2784c1db1e935a8d1a96b81184a285bc90e1f32b3e6b8382046128ad6632ef755dea9330d0231909090d71191557911e30825e134b429595b7437c7080521566d4c34e9d2feee15885184e2e67c92ad07914d399e95400c2294cb3aa88cbaa642474f3b20c6104a9d74739e136e83c8931d233d7e9c0f1e2367005112c060c4036208a154825e5849728e41077d30ca49fe53567e1d4b381d304a926a8fec604ad2ca14c72fca7a4a925f64494aeee616c0e18b9298d3497e6850efa283a31725f17b4ab892b66ec4c97861bd6b6c7adea969acd6e66ac6baf03a7969b500c72e8abe1ef35b09795ebdd145613b98dc5f32e82445998b822a6d7662b30f6471e0a2542b7ac4e64dd28d06075030068e5b9446485fffd1265b1456c493fb9eb528e597aaec2eb54d958ee0a045e9fa74099e5a6390f1e1e183052366068e5994e430ad9ed93aa7aa481645f3a4831d8bb2c87cf2eea5a87c3111020e5894936e30d124ad780e32fc8a82eaa4f24c7d6cc47c0439238d1f678b80c31525d1744789789356946f3b27b598132bca49c96b5cfecf7ad45761a9a65988a7912a4a3726d39faa1152549f8a4369c91f4687868a7266f993c486ba0d7d9da224a35e52fea89c126f1ca62809b63542e6529373d5a143878ef48347ec81a0933408384a519e8d757ac3a789ce92a25c2374fe2ccaa46d6c14e52cf2feabd699a194a228498274cda949f36a9ba128f7e529bb2e3150a4f11e1ee655d6f99eb2b1537388cf0f97b9f944c93d7a92737e39888f3252a04347101f65006923e0f0444909f9d929638ccbba13654ffa24ad3e39719a8d596fa29c9ba3aaaf3732ecab89d2079344ef739ffc9e9389ac4a64e6da2a4fcee4d53cc920eeb99b429d60a25c6b6a4cb43b47746dc61c071c9728984ad9f39125a7d23196288e90679ff3a74dd557a2e0c99414d57afa944e8972d6b0aa4cba9d44b9ece7f2f22acf549404e755e7d95521d765e19d5bfd73f2106b672490f9d349a226c18644e92bb3c88eb239b3c34794f399b0fbafb5ba8f7144a966375ac79c3be4868d28c6b4142d6f4acea74a8c684ff5ecec2e463dd63cd478d88fe7a0f9a47411c7c87cdd752e01c0167028a2dc57a71b4f7c31c11cf040b801ef33cf4494ffd42ab7736d8e55820311a5f3bc97e359e37f648728a9f849611fcfcf939c066880c310653ffdfdf3d13a522b44b9bb4a9f7f929d8480f0680352068f206810a224b4d6c70b3b4f9a9e4194ec777334bdf1e67bc4218882d6123e75a893203c7af000f2bb8264d2f811d405e1d183470f34469249e3cd38332399812310e5d099e3e456cf121b015134f904f77ed38680e30fa5fa3add98939a9421f43370f8a17862bc9f893215a3b93e94ade39b64727363e2091f4a65ab29ee33df433963fa37f5fd9cb3c8e40d70e8a1a0b79edda12bda00471e0a3a890b19bd3bd7cda90c1f3e4c1938f050ae93328ef8121fffe11f3e46d87ea426018e3b1493c949cacdfce1b043a9048d9bbbd51e4cec70d4a1f4a9a3c4e492b48174461a2ac8010e3a946793243eeee818b63973287b97789dac441f8fbd1c8af9a41e93b36538e2c08dec6b67998a895ea6a6d97e98f46b6579101e659c91821f41805001071c4a4296dded88d61374f38682f57a1284124c3638dc50b44e3a98f89ab4e91b471b4c725de610a7a734be053e74a082c4c18692d299479ffbc692adaea1f8195aae4a434e9e8c430d2559357d771855429685230de5d22173b2666fefa538d05050db329ee93736fcb3836da4870f1fc92106c6d0809d9f94034438ce50523352533dab69966e479037810e1d3b82e03043c13a4fc56d76fcea111a65a41f6770e3284341cbbc97eba7b95c3b82bc097247903f23d3087289830c2571f3aa474f275b8e4682fce0f12348ff080204c75052bae7516334316a85430ca537b9e7b21e538e27f90047188ad9b4d448f9ac0938c050d0595af3a6908e9cf166b007707ca19841493525639e14a733d2088296c68f6e1c5e288932b53be671ac3ddd8562fe9384c90f621c5c287d502d269d0eea5d3c1c5b28faba9c99feba3c79e3d042f1542655a2c94b06cd6601bdbad00b55addc2bb76c13936c26afa53e62a1d8e7de1f4cba502da14ae0b842f9a4f33f952d1b4de7562888dc53728969faae4d1c552829492ab19e23ea4f3ee1a04231a91691563ae5a4e5532826eb0d91496e38a450fc98417497a05fa36438a250b492cac7fa9340a1ec7a258bc8320d8f1bc7134a92e678ff6c130e2794849c949f2b211c4d28e668172506a999af64389850f23d1de11b75a46818c71254fd0ed1fb4a17d3a925389450504afecc953ff28801c191844e334b2bbfdbd63e34477e891b638e9f3e470ffc483af02182830309853df9849d921666a1e408e598b5e924f32a7d131fc90bd283870f13acd9080e23945534d566af9f4e9250077014a160a2243ffd269badd63f56063888500c32e913ed46cb966cf269c78ff82063045f806308454d3dc9939844c8ea3a8d9c61c68f1d7a1a031c4228f79eb893d22475e6d96094f24f844815e5116e00a3f42789f217ede5495e7f5192b5dd17f2355f947cd49feaf4c194aed58b720ce24e9da4497689657a176ef0a2682a7e37984e259f65752fdcd845c1467ad239dfc6f33cd145614bd67ace8d16d57a2e4ad63dd75bfa1e3c768c241ef000e21f40b828c6fd3b99942cb144f75b94e47472aa3229333ad3b62889f564a2ba68ff4f6d2d0aef379f413edd4795b4286899fc112f274c88d22c0a1ef467b351fa5bcd238b3cde632cddba33343e4649dff1bf2f514f2a16ac49dd24f31958143c7f35457be315e5a4c694e8246e5c518e1f99947613a1edb25694326ab45bddacb33fd6e1062bca2b9ef24ca6df926262c38d5514b3c798a95f3c7695ec862a0e324ab840ca6ea4a21c4b30f51ae6e4ec094245c9e74c3a61ff44b535394549c9796d3e68111deb6f98a2f0d9a52ba34972f8336f94a2d81b4d4cf2a3a97690dd2085a3eae2295bf2d5d5b164d3d33198e9e3c628cad9c498c442891335635194eaeceec36bee46288aa3aff1449a7823a40714e513badf6f4d522649dd27ca1b4ebcb0f5dc1b5179a260829be8f8cba436fb4e14c35a97204a4647afe484aeb2a2e2bada29b39e253547091b57b289929d70a31e7769620fb7ecb23ccd0dbdabcd3f16677bfa4f938982aea7c91fca45894fddc044b135eae712ec3fa7c98d4b144bcfc8c986c61225a14a4b8ccfd91b9528bbeb67cfa4a4b2ac9a12e53cb99397344dde244a929fba9b6f5066f3a171468f0ff800f2030d0d004941d2c8804be238b9789d99abce1d915e721c575372372251127e377583ba0c7b3a66902857b6dcab854ca5eef38892a853cd1d648e25f73b02f1d7f1d53d4563b8d188f2c93e3b2383ec06230a1ea4cbdda6b8a5706311e5b712e3b86e921b8a287acadf499993fce644943264cbbf6687871e1181f8a06d9e76a5431444d7738cd0136a3b370c5136713ec98e332944faf94be877d96f104271fb5635b3537d993dd19d632649333746dd370651507957efccec3c4a4e10c5289ee48cbe9f39c98ae046208aa1bbd625f487841b8028993096df732afeae27dcf84331543cfd9ffe761dd50f05cf1837e79294dce843e9fdab763fa7dfd4263e14d466e6bea3c74713da43f173529f623def3a787a288cb4f78e31d5e8a04af250bab212c4afbc69d90b0f5ca8eaa75ae8a6c7ac8bb89bf938aa27457728ccc967793a9bf835c125dcb04331ade74925d7d6a11cb4c809f124448782acf3eb513ae7d8fd7328cd65c939fc4ad97ee450d034f983facd9e602771288612a54e7e456398131ccae963740ddb3a673af4867290a269840cfb3ffddd50cc71b3a142e34e3e711b52da9b37e88c5136144ba7cc9254846b287f7c875aa949baafa486d275ce6a223bde5a6b1acaab413ede667afb9c464339c92478d40eadaaadcee058a78ee77b6975ec5d768679d37156bf2666288769cd284a3e65289fb81d22546a34951b194a82c926e7314cb5bac918b4f53479db5d7d5119934f255d08d51274520c05d9313a42c6138662a9dc13fe4ccaf7fbc15092f649c90304c042494af7de3e21cf3249ba42793797d05d222ee35990962080158abd61267c38d126775285d27dd051ec6c35938ba850d8ea505e2708d55d9929142ced3a9b8e1b01a45056aff4249de9b94faa1d6c4046121963a8a003be2040144a5a3a543ecf4433393de30c34a050b8b20c63724b6c06a5911f49073eca18413d7824776368c00d047842492ad3eb19ff3a49989c5018d94ec29887cca7bf0945dfb01b57bf6453f232a1b4f3e1f536e3fb0493004b28c893b9a9fda4d3257c2514cd3dae94ccada5b6dbc196831bf4768200492829a1bec3e82641c911096535f56c1ee7e00623692c08c13d82004728f89887c9ea7fa3356984a2d70965f92bef5f220325f541802214373e9958a565c2db4b8492e60b6defa3744647ec6e4080211434afc7cc5e360184501a1da3284f6d272783ec2083c78f4d7204a318ee7d7ac37a94e61d18a593b74d639cc92f6fef602be35310206a64f4e0e1bf28e853eaef6432a51f37be28a57b9ada133e2de3de8ba2c6cda493109bbddbe545f94db6cea5e44d9f42bb28dda63e99339e397461e87899ce6ed77a6c9939725118194b104289f69a9ec9818bb29b4c56d299b090e316c534f9c4fab8917766ee602be3d1c0417a347050ca168a6dfe92153fa2c06b512e6dfe96493629e38e2a072d4ac25aa68d7aebe231e591631625b94b52bd71a27673892c4aeea9a309eb23f220472c8a9ee23536c8e6789dfb410e58944fcf27b93ecfefe14402188cc420c72b0afbe6166e6319cf3444c8e18a529c8ef1478b347b90a315c50dc246671a993c28252bca259d6676b10fa173090572aca224a97ad22644eb7b7a5451b6cd615d4b2a39af3c15253195dc6964fe13a3041505cfbba7abd1838c1993e314e5cd20c37d5491d1c36c8a62f9871711b596a21cf2bc3e5e8b98f824521483baee8a512d39ba1b4549b49f0e1ab6dac1e66fc8218a527bdf6f967832675387a2bc1e270825ac3940519246f4847c8d61e9a71c9f288f6bd89ca2fdae647278a292a3ac9da313c5d3f95428f5529f522f327270c274ad31379d95cb2d95519673325b468e4d14647cf4a48baeb5abf303393451da9461b286fa26114a3251b410e7f13a55cc450813e593ca24335dd263aa3ec7258a9f33d4fd8fec8a5c7358a2a87772e1d1b70461e21c9528497ea1deb9c4eca26b0e4a144dc7ded9999e1c4d26f5e061d62651ee123f25fba6123e9c76b0ad9300062341c82189e22639f752b27f876d5340460f1e3f820041234724f02dc955ff20402081970a533b26bdee91e311dfe74d420699f94ccec8e188b2e9f36426b6c68c1c8d68d736b6c4cddd44f486924328a5564236c8c188d26b95e8209388cbe71751b4134758e6532ba2bc4147cd63a3ca43291185f7536a951a7d410e4494a45326da8ef2b68f2787286b36316e58fb0d51902749b2efc912febae72844c184ae095f9acb4108636fd7db75eeb6cee454e811c27350d2ab6e20c831084cd8baac2d114449fd961c4574e8cc934094444fb2c224f1d23640143c95a692937e54ff50da9e31651d5a9485fc503c2587bc99e80a531f4ad2c9125b2dd3c7ddf0a1fc275ab59992ece3bf87b288495ab3723d14e3a753627e3a0f859364dbfc4d1f25db782868d29dc454a149467c8772cdb789f3ad1d4a8295c93453aacad63a14dd5347b79f74289699ee09277328f7ba678ea153d4470e85d74e4aee637c6c310ee5d4bc6fd9dedb263814459f6462436ff044bd2fc9e18692248d5ebb8f6bca97e46843a9c4e7d38aeee81c4b72b0c17ca2d1ef7f5b43e135673991a9b304a9a1145b625c89bab8320d05996963632568288c7dc99fe4e40c657b33bd22d6a264133314933aede9e7294349abe6b4c16312ff3c19ca712776b831d53afe180a9fe39b365444a62e86b25aa94ed2ee3094cb33c612257cfad96028c8ccb4d174bf9ce47ea114d726948c1df36beb85b2bc69eec8c8ce1eed423176d4b0b26d62d797b850923309f1d2133a9e96b650124ad34d6fa4cf5d490ba5bd4fe941c68b532b65a124442b83124eb050d412d64413536593d0154a25091d9a7412338790150ae244cd67edbbd0f92a60f12bee39f95428db6d6613d553b4be5328d79a94e3366a2eaf14ca99f2275d4d5027280ae5282636c959846e8d50289b68cd7c85e809e5d6934f6c53236b45e484f2e998e329eb533a89a809059d564a98bb66b30d31a1a0a374fef70a2da124e69c74fcace9379d28a198b489ef9f95c994a02414edfbefbed34cf9070925499aaace3174506b1fa1185fa2e74e7752be11ca49d63c84ce5762e3229483107a72c7386bfa12a1a062de31e634c7104eb2c9d026c8f3e41042d97654f86c66493a9e60943c453d7e148151ce0df39dbb4d88e67e51bc0f9d27a94fbbad1d5f9442be843d13f474b84e2f8a77257c7a9f67f1102f4aee629e641242dc767651b0ee24899e374617e59c4c0c0f0d2583f04d2e8aefa6f36c6e838bd2959c4e3e314a880f9b5b14ff7eabe4112163ce1a5b1465bd93fc7bcf8dada945e9e624b951359366d0d0a220b29fe4bd360d15fa59946c3bd7be48fb0d9d9745613f99604a5022347f3e16251dfae34a9860a79e874549c5497258088d179e7f4541e71d6126cf295162de15e58d41b4a4320dad9a6f454127fd5ee2969f9cf3cf8a5258dfe7dee7d4cdff2a4a99d3eedd664da5f457452944cd2a479c8ae2697d6c5feff8e1a2a29ca254797dd09a3b7a8ab22933794d66be935153146496aa3fc94693a896a270e24436cc498a926eaa9a98d4cdf48da2247b68889d8d161b1345597449fb7163091f0a45490cea64ddb31e14c5b8bfa3e1f3897232bbcfef279ed04e08a183064f270a57d53144c8d6091a4e947264529a83cac9d1df44c9da739017a72dd66ba29cc4b7fa139f3db967a27ce2758ac9d3ffa863a2545f999faf2f26af97289afa89094d6f63ab25ca39bbb35ff78f47b1122593e2b38dcbea97478952e7d81a4c2651bc3fdf9c3e37d85d2e89e28be779cc2351d298ca3aaba4215152a2e44da2f388d29d14ae7db1e1724714ed578497aeee084d238ac1f488ff125ce4e4195112e3793be3ed84cb17511cf5581fcc83b6bf1551d052c2293d93f3e64494ba24e9ffaf6bd6444461942827ee47c3747988b27ddc18d4c83949fc0c519253fb4b1c3daba74294b2c543c9ebd7ae12a298df329d9ce8d5678328ccd89f902234778e200afe7aa24f327945571d88d2ac8e68d00c33220244492c194fac4fb7ffe70f454f4a8ccf96127368fc5078d376a7fa3bfaa70f05fffba001f0a16052a3097fa393da9807b087525cf96fb04ef225cb03d0839baf730ed3511e401e4a27d49a9226886852790078289d76caa43b79fe3479007728a87555c93908a119f200ec503031d32f4fde39f9f100ea501e11f2c73be949eef100e8500ed58fa72b469c24c60398434997faaa8d769be3e201c8a16cb5b2e3bbfa694f3b803894437e0ee219934e6bda01c0a1e0757ed2c4742ad6b4037843416309fe3d32bf66d10ec00d852d0fee41c9e6a13a3b80369474106fe2d24d299dd901b0c1d82927eac7cc1a8a1bf2fec7a42741e9d5503a793d881c21d7cc4f43d95c3c93dc391a8a31a75ac294fc41c36728e6b28f5e4233978e9aa15c654a92fcce321493a4cd35750913fe244379ac849259176a7fdc319477b3c36639f19ddf8aa1f81e5f3b89c3502e1dc2d56450d24c03433193d2bcf2ab1c5ded174aa2c7585d3b42959578a1d8eba3356fcae59aba509071d66e67c4858218a533cb77b6500e99f7c3069779df68a1d41e74ceebfb24eb260be5f07971214e6492f358286b9e3949544f3278ae50fe11a2edd9af94b8154a9fc7cf63384149ea56a17ca7ec4437a526774b8592a8f36da5b497f53a85d2091ac7cd3c955caa144a4a893fb9c43bc7a48c42d1f53d986c909e4950a150ae4cd9a24ca54f28b66990a93542673d714271d5355597a909054b916da2db9e848909a512328c0ea54a67f52ca15ca69ad13a6bec7694503c254c3f084f276a9250ec1242962c62d4cb060965554d229b84995c9a23942f33c79cb4c931d66f84c286fa5977fd1ef18b50d07f35a2456b5487088513c784b5184b0ffb008650eed039edda3a75d8072084625687f7de1d8cf249275e9ace098ca285becd0e19e3c9d9fc4541d98f6971aff1cca62f4abf321f1ae4dbbccd5e14935c62ec960993514d5e9445cb8449597b4a9eb90bbe5486cf6266eaa26ca3d397d251cc4549d29e647f92d56453828b724cb5fa75ea4c32935b149409fb9d32ca0413648be2865d11e92143694e2d4a27cd7edc9132aa3bb42827295cce5463d9c7cca29864271953cec8cdbf2c0aee51b39f8a63514ea125fa886e7a7a61519224911dfc93c7a6fb8ac288c855ad49771e5714475354e75342caafad28a790a9438eca8ac2c82437b828add5e12a4aaf51ef7c34544539f46e9a0c25a928885177d209ff616e848ad2d6c7a43f45413f9e787295249898a264594ac7d52437d5538ad25e2699e4d0fa4165485112b369aec3e6a49e1f4539c663682f513d26a22898aef5f624762839146539b1840ef71f5f6350944d0956b2592a6adc4f14f36e66e8ac93d7564f947c2d3d98a815996127ca5fab617ece46f7769cb84c74c79f2cd94482d2a357939834519ad12fa9e9397710ca445146a8174b935146081325fd3a25a658c949165da2642657c9edb61a21b2443985b727a5714e664e258a2566116d15bfef1f4a946c44694d1b9a4451cb44c9209498de3492289f94f257c22479fa8f44b9c32a3d34c9f6d121519e3b37111e4b091a3fa22093ca87a73b1d3de988b2f69a6795fce11e36a224084dcd26f87b8f18511ced9e33959871ef4514f36438c947ef2d355344e12a3326259324a228d757254544415a5b499bcc3b06934314eb63d83fdd36ad27431475ade48d25ea018df9a8e46dc522e25820120904c260201406226f5701b313080018401e8a046391684058363f1480035a322040342a221e1e1418160e4402613018060342a1201808088582a13020200ebaa72a8d0f59dc8e3311435b91c7d702b9c2ca9974472508f2da1e16aea488cf13b778423dfd7476651f072e88e61494b3ae8cdb71768c7515af4d9153cdb1186a8bf08beccc4a6790eeb735854f11bf72c15b5e9bc32cfe37d08d205a20117a20696508827ebf479927da46619557b1b9936513442c10513c22d7ee875634999995c4e885ae6a2ab557b83e0add27c14d1bdd9dbd98697d94eb92f5d243352a5502993d565cfafaa073c87bec36844ea9c733cf5b0995d84f150d841ed430d3d53363a6f2f53abbae2f415cadf935341e07df6364cc5f05518e072cd48d89afeb7bf3764e92ed494ea8052688c39a7a873a59dd2a3f96cf2aa3883b76286f653a718240eaf348585cbc1734ad99d82441a45deb55923599120bf66401bdb9006e00c388e7040693f70a34a8dcd5dfeaa3fb626757aaf2626fa6d8d264454d27138dcc08ad8519ddd260b622e87ba8d6a47adfa830060af408a808a4e064524061b23ea8f824244456f8940c0b19c4349ba0ac24d8c33fe813bb29d8adc4e026cbd4939af30eb3a0ec34f2db077eca35d96a8b687e1f208f8ba313870bef48a3eb27bc245a32605a4804c20cf8559a9309188060d175d4081ac91a76f7dc75d35100e72e500b941403db279496190c7d89e0392233a59391877cb701132aa422e83c76091e3126c361bcec7d0558597f59330016308ddea9221a30e8456de1f140f34ecc922e966184db04e902a34ab612da36e8323e89ac7ff189b4bdf7f6bd37058f6d7467944e779108910c66328f45292150cfafc5a2d54c68cf5f24a30aefaa70e22b8736fcd33cbdebb250f787f52c47ee96f08e2a42f8a771227a2c28da5bb8635140179cd9d7f881ab01e93b5cc9b9ca56be581966908f96d8a415d44e9d8d3b44289c9d6f7c5b47afee9cd0b7122a550819215eb4cb4a60142a63717f74773ac607fbfb5b82db9b44a043565ec234d6826d5fe3e21c79c6da34e0ded2a6f680c3568cda6066fae9b800f955e469fa5b7c31190daf3c40a727bde2cd133d1b0b3be7bbb80d89644186e55e29027b16aabc81334c53d9cd75468141fd2431fe5e8b1fdf8f6de06c8b88b6db4cbe462540da8a59cf9a7d441907b240e8ec2769894e5ad284949ac281b6cf9afd9f985b7e3134c9956c5e0242999866614d0617f05166205e4362dd6a22ac3847674ebf6013c8516b01e5caf3122e8d74346f771d770c96f01e4afc386ef00607d0120a443b1f49275611e07324a11746ee3df8d41fe462b42d4fe4c65413264ef7722c9f25ec87f1c7de6a99e4dba1f453fc88ddf19061490b15b49dbdc3e98b94fa05f2ccd16c53f09f9ade73f74184ccbb77e495dd0dbba7c2f36d622f54d4418858000642ced0994c6458980c43f61a6136958ae436801fab48411fbc1bcfbfdfc73d5718257d23efe7ddce13642b28a3e47cf48efd4377084648588445880b7d108be8d0701b1e8c03cacc3cba6811b59f07c7c01024046c1f782025ad500a7d51fad40e35cb026e4789398c0fd2213642c9fbe0d594e4e55323436ce9e361b1658790aa564e9ea9ac765a7695c2aab343e8450c7fb4ce8168463d0690291236aa44a7c44b3cc24bacc44a08044eba8806b11013a14de0b4982ecff8013bf087eddc8719d30e369eefdbcb7e0e153936aec51d96e2d4f92fa24b54f6a8085dca96cc03f677f05d0517e1081c800370181c84437032c0229f37266c1b4b1d2915eeab45988ad6f3d44ffd422a3ed9d93308c5e7b94be16638084600012480e36014208454c00010506171300e8561222a7b57388d381998e337f7e4ff9b317c4fdd64394b8334a4833bb8813bb0433a02067c301d0805db7bcff7a1d761fb5c83c7da69bc57917d34d169c31fb56541a34066da1122dc74608c0ac521c229b82d457773ef2a572609377f4a6fc99dd956dc9bf35cc877e8001fa0a11d8a1496c0c854ecf02096e95f96c9037edd8e7e6397ec0fdd71381d8c82842008a508e134a1f1dce8c789398a8fa4d03bbdd0128d51fa1497af49edb0350bba5d32eec48db811178b9b71a830b34458cf73d3393bf6862e11cf22bda19185ec4af994de28476abb229123796139d1deaee6aef4e52a98f68d7fe88e8071400e89c369700c0ec1009452a733cc543efa3b39b15d3ab28fd8013b6087d901da96cc2a10e0eda4be67f7ec965d60f7cd684366c4415228b78b3c160de249a0fe7e2af5dd04b7e016dc018b21371c0c07c1303015825e26bc109575fef81d8e41f6dda73099e25bec8e9bf84e381b8312aa242d24964306d6df589577d4f8081e46d5634e08c8a474dac50c0752e4dd1d0e3cf21dc0ba93d700846052ffa042b03b5951f1f0cd5d68b68a8a4340b781ea2c818f587d46c66646094d04ffbba0f9ca94d1194c85f346f20190295e724564a457c0d5587cb548ad1d40f1a56c68144774523a99f095cbfda01950b66e3539aef7b2c10ba889f76fa5a0f56a3120c3bb961ad315d65987f961a322d68f0bc5983b23b5309079e7a42de47fa84e9a7fea8d3fedb34d0173ae6f0d2ca03a1ab45d927fb0b9a76129753abb358e24200136d5636dc131e7191275e8908c73d943d63b9aa5f6e9c4cb7272088d871cc0dd5ea897635b853d5573e25588d5467e931da2eebdb449e248186e16b721719e90e1c1baab1d9e689441639c953806e070861c4c9f912d32349650cdcf0b94381451d10eb40be2ead712090bd0e9df82fbd11667458b477103a99ec8a65cf6b31cd3526ccd65f0482d2001e459bf1a00211ec58c8f54caf40a04120b4bd07f04ba3c37e87ff698f3e77832b12771168ed96ea50ea29a1b837efac3e43ff62cc5f2f693fef863ca64226973c5a5fb389fc59fc064adf17882789320bd3d42e5bcce429de41d30f7d1928efb4a01914804e508dc1fd1854e77dd9df1644011e5dca6b4ed8a7b814d819053db46fd22cb83416903d8ec55fb40ad25c751bdb46aa7ca6902690fc911c755b3c20347891b50f86cba6b490e151fa126dbcda74f130d28408a3d95b10334950c84a8f38d29e3ecf24601b67c28b841d4e99cbed5fcbe2504c30b40b7175779f70cf3dacc86d1fda454a3ce0f3347eb5380f070ecb75e0f1e7e0f8d9699028c412e745021bf1a3bffa1f108c200916b5dde2bdad1b24381a47ef6b5a704eeb047e7592725e89e121c796a61b9e11e052f9ef119350722dae5c476cd8ea02a91856f6d1c63f5ce7ccce7865fdd180a528c2ced962cfafb68c2f606afe4aff52b39da4217c3777027d5dd5a05c5a1cc85e9463a2e3dda04042f8915f070b4bc1a33853af102e72a9a6983c0f1c60ab16e306d4e0fe5717c173a12a5cb1165680412a7d91c730a375dc984cdacabf976cdbaa774b81f26f5c0b0181400422b80af8a0d88b150be82f43b04622db86040937eea8f8aa6fc1486db2825a1a1b08446d7c4c0df4fa828195a21a2e450f1777206a4b4e11c9a10357b46f5c0a11567ce918a092d9b36d6ca3042708241a6f861843ac68c5125419f1b870794925e65668a70cdd699d5b51b9860b37cabe3d44541671db64ef7f28d7a76a8d6754d94965dabe6c64c26e55dddaa8154742039ea4ec5dfb86b8736731bc91271a7571c1f137faf25a4da79e51040bc20554053a2dccad2bfcf69309b8a3b4175cdd5de50e5c0a24f57167db75a400eed70b393209fe3d708d584e5725eeaf5b60ea029616d43856dc19221b0e999d4a070686d2d0ee0d7e0befeef3a07a5342698474a638e016da6c3df839912312a0276ed38006a1d2f0fe040af5dd59520b5c2a1be1cbbba35e95da4869c0daa89b8bfa9333c56e559048c748f790a77b0a7e2bc4898e6ba697e63cb8232d65527abf6f285e464f4d6bc870c58ef81d5760ae56bce0881b3190c67f78037fa85585daa6d5c87a7cc0957abc7f1ee328a4eb7ad61f9f9c0b3362780ab0d447054c4cd347ca0af3b5355e3691eefece7c84fac0819d0f5c1163a595629e0140aea6365fbaeba40a24993808a13d6c3586c5932c29181835fbe05a7d049620fc8f162a1612777f6b19ce1d920f7db7a2b02f1f8973010946ed6e37a5010c829a4fb19170bb7dfa3c7a018f8fe0ff4e4ca4dc4cb6243199fc5664f51baa025c59f034c9c512f8c8d3a93112381b0d09b42cae83da6129b9fb9858574d5ca7fd76de42d8346a782967ad0759d0efecfc694e7d0d8c271a97895018a1c2dfeda6a400043f7c6bc4d9e229e0dc5339aef7e04df0169a603c23a424042c539b76b4e6b36c32515c18f24a2df7e546318056471b7b8e47b2e2f3ef4ecc036df94d99de20025d75ad96e12170c24f6331795250fe63a5cfbe721e4db632389e6f7eb85e89b59e81c6c8585d8fba3b2905a9e9864a73d0aa109cb224fbe6486adec7199926484539496b9d7e0faa20ebde1919f64cf2cbb8e9e78db42c5b93174ea9e81c1c2031943cefa2872952fd7d347ad0847cf293d19811cf248c0d44b078c0f6e3017b4157bd30606ccdd7790a246c2b5badab983a70d8340ab243b9ec359b02de050e4a4f8845fb61ca09d4c7b3abbdb3aadf0ec3bdc3647d09d85914f5056dd6515f8c178f58a4cc45b2925ac200eadd76413b3cc592395b7ff107db6b90e9bf9588dad736dda18a3dd13025175f75b13978a0ad1927298320cd74388e01aa1daa32995155b0c06ff2e9a9c38d01b1d103fb045499bcccc29b1d5a660634c06eec96fa1f48221f8c157ba56ead2915cb659b0ef2a81e851bde9d6a6397e0dd4b483858d4538030ca5e0c3beb8e720614fa5e267fa127c4b4f70210e000c1dd4614d6306d3bc3bbde7a45b60dc1ce3d5ea6239db58b480cc495cd9321825298f8e7405663e2a330787a64177da8982436be871d0b59c90c66178547d8a1e81951d194d690f12fc13142d13a59f2a10f2e84c8a5f48f58d447a5d3d703c9c5138309162c379497e5ce666371b6ee8d520d57976b28a3760cee2abe93ea2ba26912aab1cb0362db25278f503358e9427a7746c0652579f8224f72c0b4e108792a38fe0669a932637ef641473c275c1cef947bdd31b7d0de338c573181cdd69f2a8faf0075141a5121f5938cb8bafafce65e2a389c188b9bec6d7dd729da0d522c25f0c9237929910d4a0198d6185cd15b56b18c287744409c14ddc4e729a78e14f76ba6079ebd1962007e6b5a697fbf361ada7f0b0fb06287c356a3f58ff6cf73c5febb3d68c7b20f58e4eda7f84047e15a8a81d87d6fa9bac6e50c4ddf7931de7461c7b04dee8866c203c4d449e65f14e8faa38864d69113a5db6c307dc00ee9de20e1ec252382d571e7fb46c1c1232d13d41b0ef29a371bf4e3b9d33205f26a27c836659553e1c5c7c0501edf08636f24296f0fbb6c2c8b4d42c21c4e86805581b5c8255beead40cafdad4bd947425802fbee7890e896d5ab6f16b524156f3ba56b73228ad7b0fec948763d51a35cfe32f13250b3ea3d82c6b648dc843702096bd0ebbb5275db72ed8562ec980e406d0036a467042b295eb0f7d79c142a1bbeb33eef49253979912834343d4396cbb7c0bf271514f20018ec69e998b51f75dfee9778f2c5db7fcb968fb217b0bcf3f8a24666c295bd592520f4d02ba5fc1d774eefb60305391ed733cde317bb9db60283cbfef60ebaa6c6d45b8aad16df47c83b17ca39725f9db1d31327414661507f8c0b9c5a1174c5a2d35c94a3d42cdaf86cc5f0aae1682e4a8bcb82a27886d48d11d462d570d99f03046ee00d4483168a11682986a0bcdf2f5987f69f44488643970f0d957be2b367a141c33e885dee061f609ef820b6eaa6fd6904e04dda71927a0da26a999a307bd9ff531690a20ab434d45cd0d5045bd5988f3681111edbec4cd0a7f637d71ebbe502fd6fd4cd2af25072f0e8706b3cc39efda02888768913682514aa53f946a1b52841b80129ba6335bf7a501c744fd24a50d59b4aaa5f8a1f110a8b2685b5168b7c823c9dc97281c4de9680d4059a443687bd2e85d0387048202558f1c238b433b9c704ee4cf8773846eb060ff542976b3bb140255cfea5e6658e21b077957765a70b88cde5a42d904b5a57a7ab5637fb800eec1a111ce38ddecfd7d3a3294e9af34bd82a7d6c265722c48a34d644f6ef756e26785850a9d6b9bd5ef47e252d5cb91a230e7c46838344383333371f53ed40695ef6569eb04601369221d59c7cb318ec3bb1603fae1acfccd20cb01742311d696baeb2c62643e9389c71779ce242d495e89a0b7beebb0aaf67a16a94362f035bfedd91e000fd81451c457979a2733d74238a30e3476a43012540c7a917fe938ed45aa9bf69a28015c809e2d742b54bfded9d2a6571a788099ac561e1c68ab303dc068be84dc73cd25bb3759dda503f019a6b49cffaa42b42bee6a3345329c5f35312122c024aabaa5eb469723dc52d3c9749cf214a17e0ae20f34de242d1c9affbdd7c4a9ad3d8c9801d835823206be629ab504b9fafd7199253c9e1d5f6a9601b36d322e084e464d1a69e2e10f80963df0b15396275f22ff11889712a883cd18cd0a392d14f57ad5f9ba77754ea930396dea9fbee17e0faf6085c9514c94199ce1913d70f9fc1f0fd5a691a75bbc2030ee9eabdb949b31a42b0e285b38e8eb01cb661fcb20c13f0ca51c0c2c074d8adbe9d0455f635ad0f876b6aeb711def59e4348fc2369d4a1b888c4ae7b4f9cee507ac1e90a27c9538fb30ebdc6b05d6be345b31465e9c28c122d3157d6b70dd3689f417e6dd1332b1458401731322291ef593138d90fe0c9c6f21830c39e3fb453c32cb529dc9d40bf65bac7a8559c02aca2aa23da361692dcca9d0632edc42746d5c9cc8d6078f4c5fa37938c6461e1daee97a2060f313f2ee0a163eb7168d97e8eae19014d6613d15bd14107b29280dc0db51448438aeb11ea45c25441983fc1f54d763e30eccacab0489150231850e0aa053f8589630ab783df51be730cd20c27ea2c517820a4a30344c25542c12b177a9ec6fee3da7cacbe403b5d870924b37b80d52a24e2f14c43102513ee6a4c346c4613ec54032db6a128ed45190131b46ad0b3719d7405afdb7c1235f7a96402824aff71241c53048e54ddce2bb2a6423959e9901033368cf7bd9327ebf2d579f2e49bfd27f8ff9dbdd3087b62250b22c2686ba08bfea1231cc287db4a5f3bb829a20155be3c892b03097615228805c1f72cf00f11af44f0a97ad8a072c6dab0b160dde3a1350a58567167a8fc8102f571a390952f3db38f3a3cffae35de6f5e8dfc71caa4692ef09f717ff43adc91d1a43585bb071fdf25ee869960f4c4140f9cf519004832afdd99524ebe597fd469fb7708a50f14351e9d44fe5f8fa3b3526fbd112d39046ead80da3516505efb8064a3e50f40452e82b3f7713d472f90fc93ee64374f6db4d5bdd7c5f854bab6bcb45a9fd56412cc602aa2266219c2912e9b67f7b77632be30ea56ca8c56d0583412198a3e0d971cb4229b32db6a4769f75af4507560a1a78a27f3ca584d21a565a076c7130712a38293aa624eb32a6002598d85743f4d40f9d4d4f544c9e650c00d232b29a4d3b49ee5da866af249db575045c42f0c54d7e9a084c3c317ebf609985cbd18ef588e9def7be38b9c3ceef8bb9919578e8f6b01a7c9bafdbb9e75979627887be05e062f7f286986a7fdb08f1e61cd72afb1d5923709a43b5bb036dbb0130cde1dd745c4a09a843cf71acf14e402241c9ad98df318cadd58e5882772f91d7ee7a62b232f3d86e0c83d301a500e203c73b99c55b61f211e74321a87d498356ea2a638d3d282e13332ed1eb62423e8e9ca773f5aa0e9ef0270a33c5defd0a4e66c3ecc0104a28fb499b1bd5b84ac6fa34658567dce5adbb69b9428533ebb65d193eb22a89a6618b43cf6e6af0b4585c99a66a26db1425c565be6411ecb415bb1ec00b4d621052d6118d59775683d15b2b0c840e6c0a1e5cc1f23dc88ea06701fac86f5fb065bc51bb85de2967aefbb026e0e0a9caef13340d45e4e7a43b3f2e890be94c067ac147cd56655c696a9de0c07ad39746468ce40dc84fe26fc6d8acfad8121e7439278241bd2244401d6d02affb766483545f760b4a74ef25b700386bbe88f6eed1052df2f4a1a85d6768ecd44d463d195f4778612c37497e861efd01af15638927a5f037151ca96e3a3ebad6a22f25e8636ac586deb1ab0a083604e9e428479f3c86dec76508fb23bfaf07f198a03e7650cc85d4724b89d421b0a394db29f4532478ff1e5e96f8438791fafca142ac3830124928c937ee2df92023c5bb653b5e000392933e783e9ec605cc6740c0fc3056806d6029d7f53f4b04ec0400cb0b13b8c16dd9d879a38ae9c3c40d3fc478addf9e81c8b594d6eb2bcdcd7fea086f8adbba094b6d108386b31859fe89de7d56ed42f8a702c5ae38b17a03427aca0d47e47a048fda55f8d27a97d080c97000dcf3fe33b6680eeb3b10866135e679f3fc60d6214a3ce90904a01a2ba062d25df67c238d1e8801e525d2df2b41c343e1cdaff9d730c42545777b6596e96d2ad2c617780e3c684834183aa5d9846f02f4c8d97301c1d0c06483a03a3bce517f6a45799286afb40c5a0f56b6830e5f4b3b6d74fb78c9a434cbcd4421ae8bdc7a5c7e92885dde269799355ce0a32cc76ed0acd9b0ac9168870eaa9c9dccba7c77c6fb487f1029f691df45113c00c0e0285a69f1f48a0952dce1e02dc8398ccd7a7406924464229d4e38f875473ae44d1bef728e9ce661439c2550630466a9bdb7a70d82356b10e1e899b402af69218b21718e1f5c5ba0f6216afdd57a7fb9c5f829c83839cf07bfee380f585a968e73b06a6f394363e37cbbb9ecced735dac36b2273bbfea5cbe082e746c84c83f6da60a87aad13aa9e1f415b710770aa4b7e70e2f06c179b8c45e7e4202e8eb69ef1b2a04d6617946e1df3ea283980583bb3f251687f3a171935d0133626ddb8e17601c559df4e25431474bc1aca22a3ef75451cc99ef408f807bfee72f0bd5ab8a49666e3a20aa281e398f3b4c922748c0d1b51c7aea28c4bf76584754fa8fe11fc4eef6546ee1cfc4268a6a20ab9f31e6f95c92c124319e94fe09333bcc112fb9692419a1124174a3426abb00fa0e48335b060286673fb47550905a2ca702331fea2e1c0ba8c01937895f30419e9e1adc9b9d0978e9a5242b2f846ad3f3885a2cdd09fbc79fbd4fa8514622731ed566c77380713c62d691916a04aafebc880ce9275b1906107830d6771744fbee3e0a97a8380e20c4172f0146a4c97d359145022afba660f3aeec8cf2e51340074d6db64da3d7ddcce0b88e42993fa0b508290a247ffc8b906fd4fde2d7ce1db9aff3e66a344a6ed3e334152415793ed69731665cb56943129cd45b90af789821422c5390f91a0ca9954ef13588aad92f4310f0d569da08b781e545e6199156715800b8c43f529e72aa870c51d8ed69efafb14cb1f78c48dd8520bde3196514ed7f83c34ba79165078864d4a19de3a607dfdfee53549cfbfa42b77a851a8f1a466fa4bbb84ab4303aba751a527b7531b93c4d358e39c6ded1f4862f9b79d46937416bb169201ee9841b507e300f3c0428b931557a4d38620ac9d4fd4937975b5640580d2dc01faa99a596d135d35788e21544a44c111db859753db690af45db09161ad8d30db8353a8ae4cd368597b7d063babc8aaa5a16fa333ceace8051f79dd1dec60f7c77ba194217f5d0ad72ddd30e4200993f6f7aad3e027884a049f21217f308abadac611e4880ecfa02f1881fae34e025988fc690eab09f1552891f0bf9a54f930b6f225ba6de1739f5e1cf2c87f08246540b758ef5cf2aa918a2d59d8f8f3f81a03a9b407857c2b4bf5ca6d8b6964c85e2c140803c018e80d159badf640ae9b54e0adbc50a5c28c6970b93b060e91b2751b51c4b8555b230d61adfac7dbad1e948842851efa59715759268f8fd4d455e6d611e97e45c0db01e9bbee6268346a4caa1b1e3841c4a19f205bd83b4a9cd3dad410e51ee67138c3424a0ec7724291da14ff6f185e3c89fc483adbd2579493ee0da934e8f029c1f9d786c868171bb060bf78cdd549e8ab506b233a9f4e0b984cbf0cbf7c70ff576586293cb0888cfab259dff072bcdbb15dbd31eff406ee5ccef95e0d3ce92b81f7aeb4761be56884347ffa21021cd70ca653b2e37171d4c44ac13b43b664ec57a094d44727e755c28e5499804c410c46412ef050b35f892fa5196264e60eaf2407c9f7848d8638e70d740a0445d46e6456cf176aa207dcbeefc7cdfb32e4890f499b79d8a68a0505a8e71a7d0ad7ada8e27ec6f20b9ad51398c39b057c0de85c08f2d151a468fc2449c1682d7f333a2462b8793b596be81f255b9e9d0d3a5f3879576d7414e54c762bee02d25e7c83d3d0fedf460a87df8958877e60c30cb4fcc7d6f31195b384a8cd1db62c8d73a67c38b72edc718d9b7d5d3a678ab368336630c8aa1d2c1b556921dc3f4600eee230cdacef8ef723c888ae84cfcf4ab95316135bb05a40d4806587775001d5c617903deac92128d5a56dfc1236d417fff8a823f30eac8c5ea832471e361d7a9a4a7d753c16247ca1b3c76bd26e088667c34bcacf2a97b8c10f378f1206f38af56b86fc79e89c7d4e8b26d5cfbf5d4c24626bc4b1424ee8bbb0d4a6dcb1584c63b00060168500877731d5a376c00838ae7c7aac4436920bcab62e0adbba18e7230437e74940b3719b134960a7077cec20cc3096b7da80a0fd43b68c4f0c1012015e9eddd7dce36ae53950f2e187b506c08be30ce0d1af792be7edb15f6d12353ffb58783902e587405668e35bdb0ef200c46855fae39527ca08f44bad98b4e7aebf8c93eb81139b549c1aaca348d9a64f3047d62a2fda4da787348ed77350b095075023f1f74a2421e69108d939750351b9c3866c94d40acb0f30fe273b38198978924ff77580d82758366220e9dea3002ce6075af12107e55cf8dfcb02d8d971e2469073486271f23c340db5282e3b8778d42b1cf1cb4920aba248e5911de81f81f476e82449d13041687061586627f122eb63b84f093e8a6da3194d9039dd291129b83bc23e3f5e68a672681ef3c4815c3cd0c27590285d863cadeb61b09130f006aa2d3efea875cb4b42ab25048aff74be91985ceb430201320368645d42f8e51a2046d386048a203be24ac07155f7e434291b4cacbfd75d9e832bb10b7fea5425966f0370f47c64f90ef0ee7040b4ee79fb19c3a6e50aff566345f49e57f2027b109ab7896d320df7019e35290ad54a7ac47d3feb4915da70b503370532654e67194f99b08d5c613330de3a6137aaf009077374e2d4b468cee5a2d4779d937264ef089b5221d7cbbaa33e697fb075c44f26dcf56e3720483c6b865fd36a42ec4109e1ca200e864643575b56849648453fca36ce9dc004413c27ca225e757ee0c1bcae03a2ab44b3017ebdc873217b7c1cc283c07a30433f8b07f719aa707a0a2849349ed7a85abf61b81be5373e6e869d4846a573298b41639f3482a224921da50d13d3b7386d460e3a6977b5b9dcc6e0deea941be1b92aeb18e8f891e9d42b21d45bf2ab4f0998ad48352aec29fea88f36cefb3f0f64b695798e613596bc95f5dd0eb98556647f5d04c3839300328e2b8ae2d3f39e646fa58c192f53e272fadc0453386a336298bc0a93b094605f311ab11d0caf0d7db614302eb204f3d1033c925ca9e4afe51be81c064f4b1ddd23ca70cccdd5d3df7ef9db9a34926e097a16d02e940c6f1d9c99aa0e99078e75bf6d27e0c555c4a8cd99fa996f90f150740c069d025bc4e89b2995236197428016470d0cbc0d91ce593145f1f9b1810c4a020443a98247108d7b4998305be464686ed0121493c583f21a8e2ff8fefcb7ad0cd17cca8b6957b8336c2c87841d4a287a82e14ac96f241fb5c931cd7d9cb3149b66145d425c9c733d7aed0f6c9c93b0ec8879bc1c98e78b4b01894a8bd49d23c03139cee3a0f21ffc9e984692127bc2ff7b80f5eec06e185c20a096ae6166a75ecccc3af9a18bc1ebbed66205c960015cce289e8c7e9a60060398f7bff5ea3551ead1bfb5a3d1244205185b9d2a29bc328ea22134f1d8f63b69e9b1945eab27748bcc27f2e49ceb865343da10639f2a88fa8ab983df79212201319c4c3e30b6913fee2fe03babb1e97bf958bdcccd0e3831b7c510bc8622a580241edcb0270c26cdd3cf6ab42cb08dfc2a55e64a1fd01b2c249de4eb5ef84ff089ee532f24c23cc3c3532d1b00d0db42de76f24cb0a0a0f9440b4fa649e48ea18b3223f4935c49c2079c5003ec61658690a820ad6b463ace3f7a9c134caa7cd5fc8ec57840d660070ad74a7d8eeaf653fec284a0fc971a3ee8eabb256b8c78dfcc563cd4c2b8f9d9d3e5f93b36cd02e2f28af59ad08651b522f9ae7b41ac63293c4b4d16408028addfdb8d865f5a698ecf88d499a4416a08b233b57c804199a153486f7e4d9deba0c92eb08f0e0fc15dbde453d28ac22223b7ff8407785f9f954b1da68478b63546431a9d7157a0224ac9ee84b79e8bb4a68ca55bcb7766cdc20bafa401447a1f30ca61217e416aafb632f4942ef3d01f10f1aa50d621024ee96cccd585fe392380a35c550b7b0cad17a30720a78a42b5b20889ade8f3e0b8bc7a1172173e5a8f10603b973d647ba9c99a2aa06e4724a66d22ff576bbe1eefdd320e17d59c27762d0747bb6517fc7ea73b540ecb0e4ea68895680ea08b487321049f4537213c0a9c560d5e4ccf3714060dd7a0b95042eb108d2c8badb84894019fac50248f844dc8f39387265b481d7017aaf93b0c862b0f839884ce7dc4a7ce331a7e51608a7401278d540fadf40ad3e14c659fbde9f7bd864238258e0a0e6ead05b998b4f9e8b0689152228c8cdcb911c63183ec439b7bbe2633154b6c26c9bf251d3e9ffc563b6565ab5f09e95b8862ce268ab6e86e60a23b0dc1d079463c151710039a9399a8e4f87a2c3e66ed7ef4d2871ebcccab75355a62a693f43801f079b8ce77bc95d3a957ea26be993a67e48b8814c5582909210025e196ff38eaf2dc830fa94aea4c969790af8daf083d5609fe08c384a553873447d7226c9636505842551f2019660b3106f92ff57d956936452eecab5be717f83c94527c8c1b7df788964e501235f5b6141ca4397ef8f524a037e596b9f3c0870f2a0a109b9c3a0c41bf3130727840b145925eefaff24744b635cd4f04970794f4815ab81d3a6823e71b1c6e1aeeab46227a19a9c87b2eb44b8a7a0133c33e1607c400c113640a8b0fa777993e8fa8992b1fe09c04fc33728f98e964c149d38d2af470bd3c3556126c4a05288a14f2b8ab8de2a36e721a3889f60c54d1f05278675cec6b6da464f02056612ae3882f8ccc87761a332095d4feb873cd29360f92ab6f84c1af529c1f566bd1ce1da39ac3e9617b620014a590c6c72a42eaeeb34e4bb4d25c13de9d687d3d3da5e72bfd4e2b6239b20345d64a4bfaa5281eebb7a90c0e84de247fb9402c55ed618660ec9026393e6cfbdf68b608664615b472b5dc17705f4951d69ec344adedf5300e39e34d151d51746dbeb561b8fb740bf847011e99778a168237ec6b98e71632c49c4c4d91f5d8c0fcb2c2154a21b4842845097f494d9081a4243046de60d92d12075a0a704db53ddb18f94c7fae65bbd876a7ec0799598911d7c11f5dd6917bd72c32a1602de4458eb846dc5db7172692773110d596a4583b64513e4ce299700e70c06639186a17538e5c8e35e5b1d5229b35eb9c0fe089586a5c8b0d0d7a9ba7c81efbf76c0ce5c5745d02761993554bfea895e55e8985ba20a50185c01e90043574a2ff71167a979bbda94e7590f119cea2cc900c7cee9daee93d7c3292a270504bd5530615840519b384919f0599c43ebda9c4c5b740f12a431de7b2a4d5216a48d0de8613e6df0838722f64e50dc8cf4cf8a16b76088e086b0fd5b4197295c004ea6e7bace9712f3b9435b2563177d3ed4906098642c448b87aa45e8752aaeb1cf8378ae8ba9288e78d12445ec0db62ffa253a755e300e574eb02bae1c689f62dc16085c0ce8b5239148308cd91e9b386991bbb628134c0851c336a5800f8646db2f1ac3d4e298a429006e7727fd00fbdc0eb272f85dfdd1cdd86e3f06851094378799b7b9a207e208b8dc7bcc5991c014e3217ce4ea0501f2463e4b4ab94f9cbf5cb73d7cb0a541af076f0118061366d9d59d5be613ae30bf1357969239c3d4d0c18abb921733fa1512a521e43814d9f32fa2bdee574c4a27c2c9ceb3d152b085cb7432ec2c0a12d966bb64364839c1736fe23bf58afb4289358944ee9eef3a56bc3f0fbd1cb5b800ed105ec155b18c49e57d68b68b4e6adfb62fa7c8bc4c6cd31d0a90a84f1d07b101d37f2f58d8ef31ff6b66d1118f4fac61a604ff3752ac973ad483ffcbaf9bbf54f0f8ffc4c7247134218021d585cb9d31722da0e020a89e1b15504b635bf10b00e7dffc534293713aadd7c8920c740d054a01ba31ce5a3450b024e9f3ffffffffffffffff63affbb7acb2df0615abb69489c4bbf44be1c937a594524a29316c4108c88d9f90558138ce7e78900579058305dd6aeeeed018645c71031d400104d424f1a184628ed6a7713b42576d3e925036a9ea614d0e17759f0f24943c8e6837257b337ca3033764c8d0a1e3081f4728b78c984d0bdd30336c9803c287118a3945b59a78f16af3c64711ca969dd4a60d19b3a6fa4184625c5a7cc9256ffc4c3a8c8d1a7c0ca1989ee4982135b89ad4e3c0f3218492e81ac42997d13bfd230866cb788da7e308e311e52881103e80501ca1c39c52933d85c9d260bb41ba4f2cf0f845416563a3c83775f8a2681fddbfa3e899f03e6978f4a2d4f94bec55159de9325e14436a8d87b34d6b78eca29c1d3aee4d9898c34317e5cf1e6e2b64509b9da1b6c32317a5d22b0f75559250fa448caf61230569966c9c53e386072e4ae1de9f94767578dca22474cfe5492bd9a27cd5a9934a9344dd18d5a2184f8a3fe16a428bc2aa260db9b2cda27882ccb51d46c7d450cb827371abb536b51aeda924b966a3fd279958947cce732e51322939f91eb028c80dd2f35f634bf0784539e95fd19be175aa645c51fecad85b51d03d267d671a8f66b9072bca27f77b6e51f1233ee3b18a82c9d93a49ee932a4aca8310eb12635edd3a150525e34dd0b1a2b6b74445b9426b6ae99b90e29f53144f8aebdd71b113db3445514eeaf1f33e391a844ad18a6badc7d77daa075d9ecf4d4851506f72232789493670788ca2182795a02493dda61a8aa214ba9312a5ecf4fe9c5af00845490825427e040f5014538dfaaabf92cff77fa2dc39c6d751f6698387274a92a7d0e1f5bfdb04cba31325c19498a10499339ce8e9f0e04439bec6fd9da025af949b28094a70595132c79323d24469747938e15369d8dd64a2d8bfeba536094dfb1b268a291f848adcf7b6c9b94439c89af02fa95ae258afb03ccf4cd9f2983d45c7ec9cdfaf4449c62b41e7e0a619756224373e806cd4a0b1012f4a944eb95e7fd40f26c49b4466a679f9f19ab19b6a96e2e93bb4c9a484fd9228a7cd4990266b14b93d4742ad77db4f99ddf93561e3281db246f6c60312e534dfa56b46e64f3767e0f18872093263f2134bb8ee93238a269feab09f4d439f23edb8911a51be123eabc6b4b4eace88d2a7cda96f7212f25844e10413749aa7080fca5244b964091b53fd597b6f12513c953954a7077d216c449483a7d2fba77d163a868dc7218a1d223a6b7bac2d39a919a214d2478cf7c9c953270b5112de4178f0938f8107210a623e6693f73d873e08acbc464fd5333db75d6bdb836cd07808a2ec273d5da6e6cdde63203ab5ab7f95af0051ae8d9de47b907afca12ce23e9c9cbacb21461e0f3f94e34bd89920d73e94425d3b53ad557632f0e04349091fc374123bcac5e9028f3d94cb4eec328609a593891e8ad9a79b41c5f6c8435194587152f4c724c6ca030fe593ba633c69b7c71dca3f32e7e912ca245175193264c89021a388e0618782967442972083a7cdd7a1a0757272f339128d1c98edc1830e27a1f9f6ae39281ece6f36bec9350db6a4430c1bcfd6040f399446be64f31c1487f29b8e55a7e45b93071c4aafaf9397739393b7f34609d5071e6f28c587136de2fbd6fce38682acd5d79aef3a49966d28091aa64d0a9de363ce86d286b410a2fef93f774f81c71a4a72da8ee8bc1ff45af35043b936957834c14db2bc3cd2907c88ed9998ea98678588b6fc4dad77bb29e38186728e99b3b6d5dd405ebfc719ca1f6e7ce437969534d360dbc10d93438c1986682ff0304339aba9b76bcfe9a4b91940dba183841bf0284339365cd58934c9044d7a90a154828e899a6c2fe03186626856f7b8a54497907a88a1a46557e362af95391f86d28d123b73dcec018672d4543a851226997a3dbe707dd5e9ae6bb995e5bbdcbc55f97c060f2f946dcf7492c293a4b4765d28493ae7bd30bbb8504a2d4d9250b2fc73b45b2879da350d4f623025945a28deae8e36e936f3adf2c842d94bacd251b25327138485e207252b1f34c753627c85c2c77cd22466c812cccc11aebb496a4337520a7e00414269ddfd7b3d79da6a9d099023ec76a2963227f2163aa2ad375a4e0ca554066284d29ea792b9994c9694428a501425fda4d2722242f146091e3ff2a45bc921432809a2e307297b0aa1f031e7689d217b5278902094be3fa6df98c35d677e102014e7e4eec92408f3ec491fbf28c67ce20942dc9ef8b67df8a2206f94a44788f0a317e52d732f5945989cf9e045e12f4e5d096a74ee27a1c1763976e0c08f5ddc872ecaf321de739f4c2e4afaf46ac925e8338c060a508e12243692064cf1818be2ff67c9271b774efc3e6e51ee9cfbc574902364334ff8b045319de06132a6745f7753f8a84569e6c3abf77d1a7cd0a258bb9bfaf67a624bf9318b725af98b1191d260934549ca7fc6c634ba5d37170bfe8045f164f6f63b41563bb781238c1a3a5e51ea70b2b5627228cd9e1aae786e55a4672ae5e8f2d18ae27a1a61ee694aa87c3b6e88912361634541998a4b4ddfd8f00c7caca298ba3b6a9e24078e03c1872a4a1af6e4ec699ba5a2a0a9f2e563a4b843478e1ac98c6403b3a336f0818af2e5aa98a8b752aa3c681ff8384541a611239314cdd3b6860d1c3ad474b8073e4cc177493abcbf6f68b0e5f82845a9ef7d76476ef8db67a428758cf15bfeda6afa1845b1ab9975a7e69e175b26883cd9717ecae41fa2286916d379b9ebf234fa0845496c6998187426edac41511e11276589327d7ca2e44952ea5d44fbf0443966ccc8c851d28962f84fa6a9ba1d2626e144414b091762936ca2541bd765e6cb429d68a2986da5793a6de6479928756c52b5397f67444c944d693759922e5da2e86b92eaa04ba8ba2f59a22cdb61b1a6a74a94dcfaf3b56a26a17c4489827e7f9bdcd6493041348982876d68b75b519d214994ba53cfac966c5ae21f8972dd28d36f3799ae3f240a2aea32277d25f6cdff887295647a1d3d5c57f98e2828a94d7364bc37c8be11c50c4a6ab813bda5eac388c2ff8c9244789c7df42ca2e87f1fcecdf4e993378a2889cbce194ff7892806d18fdd3c9631668388b2e8a04e563149b4a8e610a50a1525fab9c718940c51b8d0a6aaf9d66da74294f5c4850e4d69a34b8428e6f9cd7525cd4c1c0da218b322269b6cdad4ef82287afa471344be8923e38128e70fa7c164ac89517540f09d7f23f64e7f28a9cf9ba4cd781fadf74331660f6ae12f7f25d387d3fa499de46f9b0f2555af27356cca6bd77b289abdc71cb3d34329dcaa4f90d5dd1beb3c14e7444d71562789ae351eca5be2865ceae6b05adfa1344a525927f607d1931d4af2a38fdbc9a8e37d1d4a25c8ddc6d149e6ea4c8772d0e03d7ad43c8752c814fae7f7bf39cc72285989a6b5533f9d8bce369384170e05d5317512fd2596bbfb8682b576a63629265eae1bca9d4648bdcbb60d657db9f174fa938e6ad95036eb9272e22737f144d75092623cdb24f17aeba46a28864ee9693a78f4d7350d051ddf47971a71eb494543b9fc644de27e7a86a2d606f1ae314d3b9e662889197eeb7492fbc7ce3214c3a48893b43ddb29930c250d563efb2e7b1ecc3194473bb46df0520c052bdd34b2d12419250c43e9e4f0493e4925d79e100c655142b593125a9412835f285f678bae756813445e288736b3afb8cf5d9aeb427963a488754d6e1d1e17caf74966d7cc399f6cdd164a63da294bb04f99acd342c184faefda3d793b59164a259a30bbe7293ae80c0b25ed3fc95e435728e812c7acac36c6f3562827f164b62d393dc860158a17169ffec7740ea242e94cf80b8d5e7d4ca17c23d64bf22b8d49896d60520b3ea450ec11dd4a19ed486ad0d0e13a708831a33ea25074f55b0f26d69307258dfb8042395deb24ad55da4b861f4fd06dab36536bbece622e4f0c0df24fce39dfeac309e5aadf74331bc7a490d3b8616c9820213148d0f8d184829a6998d217e220a140860c1ca41c4c288512229e6489cd7c3f9650328739bd234c286eee36b126843037a9c8128a399b0c6a3ee66bb361105102aa29464813333bc868b0f18e48122c6f1041020e224748ad6b36eeecc511314239ac9df831c9e1fa83a8080539fac3674f9c74728408c54c4aa812b3079942e79121143fa89055caac24f9931121947d4d644e77759246876d8804a1a449f4d3a6dd21461d0142e124fbfb24e65b4fdbf945496fe3ec9bc891e955882fcada724257e69cb10e482f0a6626858e71ddf1420dbbf3ceda53d3d349e97117c520fa5fede4125d4d52a58bf2e8f22c959924d975e6a21c1f166a731204c145497a120d325b591620b728a7783f93d1575be453b62896924f1c757296592d4a5af5348ae97f517274060e082dd2f53a6d7d19f9ccd1711685b78dd79fce974549a82b63512ea553f8e96efeee1c162599cb5ebe4d777cb55f51b8fdd3a72393891eba00e28a7265d0646ae3e67c42a615a52a9336752631b4785851fe1825d6c7b63531dbab280932be67ce1cdba34421aa48af2c63aebe2a6b76aee6c5d3baf7e8bad1435251d0f53949df3c69082a4a1bcca489b6bb9053143bf3526555fbd264b820a628659aa8d3b641a528998923273c9c2832931052147d637594cdfd3726c25e026414c5d3e16bca4fa74c621f01228ae2b59ac8c7283ab529ab099050a881a2944992c3348a10e22efe849627ca9a54b642456c88bf209d28c76c2e25568d6be8ca06104e94a4e71c27492709f23c4f830d25d4a7c35600d944a96eee94c9d589ce9ca141345132a9b3e90f426a1e256c032413455dfb3f3977ee9c3633a33051328f265b697b8989191a7fa33400b944b14bdcd52625a6523289ad254af29aeba3ca6b9528e960926accd0e52801841298083da72fd34e46da9049980c49600b2091b8a469f1d23a80020840a21c4d7e74653a49ce32790432fa9c988413af50b723cc283e6f258979e24694fc2cfbf4468df93ccc88b2897e9332a409b288f2699c12b38bc731195644694bca654c8f5342a589f04ec4bde3743ccc7564bb3ae44e081bf91911e5d2304287a81565196c25400e5192ac6dc50493d67646431464cdf7471d8d7f93a42085284871b351d227b19418d9305fe3861837cc9f8500428892b89dfdc4750f03904194faf34ddafe247f57021144f1633cd1673569150840144d3649064d4abb99faee02903f9808207e288d3ab9d3798aefae3506a40f85d377d2494a481393523eecc1560f697968081eb4ba35716f2bbfe43b541b4fee0c62879212479507e9259aea155287c2a90932ef6353103a641fc81c8aa2e412d3f82611de9f4b103994a3cd6f7b38796b7aa301240e70e842efe46eedeef24b56c81b0a1b6e2b4bf61cdfc6e486f2c62b951f13a34e79da50d2aed9acf11b3c6f05614349f6fd1244cb354b944c8002138800b286b2bc3b55c7439403881aca4166932f55ae54299334944ff89117fd58ae39090d05d5f964350deba1a4e80cc5990d13fbeebe3f44662848f36dbb369d329462347d92ccdd3e282143490c3a8a7637bdb7228fa1a89e43cb99882c497cc550d82043060f2f234f0986a19ce274d57c6eb84c0d0c0569279fb0ea77db25f585b26c50df91fe555ef242497a9afa133b5ae9d877a1dca2574bd470a1d42563dae86c463dd12d94aec64c93ee9204102d1493507b529f4c5274d02059485fadc235e6b0b96a2c54667669b9a3b117569e19e3888a8931c8154ab6f9499d52ef5b724c02c40a65537b26ff7e6cfb6aab502eb95d76a289fd964d8592876597bc9fcc32bbb682009942f135cf7e281fb70c9717112052285b774952b5e7865032240ac5a0de77b5c931661c42400522804007500001b31c3b706801028592de3325f364e3c7f509658d6aa542f39658f2292714ed5a4bcaa097b9798434a1a0ee4c76af96c7181a8409c5fca9f294186b4c06d9120a33ae5994f0262514f4cb77126e7e3fbd360448128ae7f227d70112709b80d704eeea1e108107948c5c19e680dfa1638c1c0508c00ece045e8c1c381400801d3ac640010102906860c6a0c10d63030102d09123fd18488c1c3812300200040000000040004c1846c7183698000716d0011d3570180504a00800d0a1e3c8208000cc0e836414200066874162e4907100000ca00109c8916cf066878e19331600800030e00058630712238c29ec0087147084f15128f5888e1cf713148a1bfc33c698f584e269ed31efa4a53b4a34d878c170425935f66fd39e349d3c34d87680e3c348616c18290c05a3095863470e1a3a6ccc9891003098803576d8a0a1c3cc9891003096b023e908238561003094803576e0a0061a63c68c04809184c267f130257dc967f4d0e03e1be32c8c9463060e6aa019c86dc78d1aa8e3468d1d394e000612120ec408238c14c601c03802ce988100308c6067688b5e5a886014a19cdd3ca4c6d9134b18c12042c97bc5ad3c963a49be8650d84fc2576e0c18422827951e7ce4fb6dba3208452bb74dae319dd8270706100a325dec94981c54c658e4178ab7bdb5adc9e7115f944e4b6a98a8aa1edb89f4a278626dc9595b5e94bca39a77c9f4bea387811cd94559737510d592ee3b670c1d3350c2404417e8b9129bdc474c6e69b09de5a2707a57f4d6ccb5c85e8d03115c944d0962336a4ee2796a1688dca2a4ab6374b6bcc48b4b838daf02115b9433fdbae7843c2d1fcf183ad274ec6e20528bf376586a10619d4668318b9345c1f6427a926a359bd58ac4620d165baf3019aeb056945d5c344b7528b74e6b8e1d3822ac38297b55cb2c59310db66403a3828baca2a4b3a5f56e3c4988a8e2b24aad2e17b134adbc5351f6d46c3a94247c29e98fa0a2e4c1f2cee5739c894de41425b5ed1fb77354d7b91153944f301ddf171ba2b3454a915999c99a66eed685faba8dce75213ba4115294c4fc7092a0f37dfac551942459f3e64c2e7b1022a260b3bfec0769285ceda0153f32890d149f283314f14451afbacda396704aa813452df94ed3b7af91132591117f92aa364990fe264a3ae47d1e314296a8494d144764fc943947af30934c94ef44133469ac39410669443051f2abf953bf9a84cbea12c5cb0ccf5955abfde79925f8cc1cddb111bb9837b91205e9d64199d8d7699f8d50a2f027b7f49b124f17429328fe6a86d02945f8fc18918431b2e4d2714d9f502412695a76b8ab9e6eec9e6c97d929e963ccba61041227c31e718e28c88b6b2e29ee4afa341a228d6004dfe99ab5f39a3a27a3d95be7414972d839755a046be279e179f7ae592aa2249fd59489f12f2f5b224ad7bbf1548f0e22cad9a45bc84d9f35298f1ca22073b84faf7bd77b6fc410ac959da7659b5597ec1b2944b974d2f8e9f7ff4ff41142a00d026594204a9dd963da33dd924549204c0602a220d6631e7ee733735a07e986d220471a015e8eb4a3c60b227f3019e6b982881f8a59a2d6647e45a5eb7d3019c587b33d9c8cd283c9082392079371a3f110b943294ccc26a6a2539c1cb44349691343dc83bb2387183ab20e05a976526f36a9dbdda383c9b039988c1844e4501a5735b945475d5b53240e253fbfd6d03a6e3a9d227028bdd9aa9d9ff81bca1d4e8baec86b65c91137943667ed109e22da6dd486f36cc6bde5643fc6dae3a85dd7cb86c47f666927d1c81a8aa3aa3498c5ae86f2493fbfd72046d2505a93754cb6a8ec378286a255ed98ec30c9c41c46ce5092495895d472c40cc553a2c9b7a679925d688b48198abba1d3e7b417faf626434196a017b2e4ad4f668eb4a3c6192132869226bd926eff3fed298988a120bf59434d5499ad31128672cee41b6cfcf27d35113094c4602567a3f4fb663df28592349a4912f5f688170aa32fddec36633ab7225d288bde13facdd4e99374225c287e7db6f8cf7d7f2cb205fdce7b6d4faf8572ddc97c3e31ddb7f648160a26fe78be4db18e4147832d8285827653e6fb73e2b4760a44ae801065c27e35c71951aaed41c40a6b9bdd757ba76dc689df269dd34e7910a9c245a860326a0a25f9e9fbdcead2c4a58e8848c146240ac53299e97b6a66444ea0e032f6234f2866d9b19027662afd4fc40945138da349dc249dc628d28482d8200a864da86387592c874110056110c43008e465496b131348201038200c4683f1903c1366f9011300818b42f1702c128b43a16040128418048320044210848110048118c4209649751e851650261e6a64589db613d16ded23f87631d261b4449164da43dbff931721b03b854feb34321963c25ec1cb76cb3911fec7ff0db63da8cea92cd5a03abd17c3633452d996eb0e84f7ed8ac9ac8f63af2be38cf71bd167cb818208c02393187bd142f4e98ac476a465c55562b368971fd8254ccdcc9f4094a3507e3216fd660061a86c3ed80256f5d8e928ffa3d130b92a3203841126fd4ab1fd241dc9bcdad475c93a8343ec57610bdf03e7ec43163bdc23fe59a7192dc147458646d2aa53354cb5add908a526b72c295cdc25b25b1dab674ed135e6cc274a40c236e1ddee1ee7521f2c02217792dd7ae8a73ee6f79544bef4d42f94dc0cf5e5edf0d818d3eea4fe4fb67078f9a3e17299bfacf3be25626aa4f97e6e111a647d7285c5e24626455836688e096d26b35cca65a86d53e41ed6f34c8ad6379f6b4b4654874e97936e59deb053d332c1aae48b0f89231172211086f26db68f88431623f0fb0a59393bb25b9cd0866dd0600f1dd3b859a53a92346b7fcf546505fcbac1986db07f166046e0f16d6e93b6ed36db9a5000c35cd327f1a9a55e000a11067bb21e7b670be83664a2f375bd7de24d78ccfc7f7f152a89eab3d0b8c9ee6245990704e183a59b242d64b5886433b0b05904e76465567f712c7fab39c500c6bf21e3948fd584753f999715f6c4959e8327510d3fe6a57e0ceba8159dad4c226af0fb7bfecd9011b8d6af7ca920024b1a628b1a8a98fe02028d1d08a4f656ec313a430c44d044fe42901c6951e91c103cd61a3e240eb563f44e4684178716324076f001472c40b943a0c7f5aa6f4cc81c7804a0ace9e618fc8ceb141d6948baae47b57c23400a2ec33a3aa8434fcb87c72d4e6acdd11bb6e5ad8dbf0071b3a64d432a1f5383c8110810564f1e63e02742a547cbf11ce5318771cb5fdb14039ec8b5e73914cba4d0585c9b3bbd7fec9c36fd2464ed15dc219461cf0e81138ec64c3f5b099998dbf9fb66c9c01c2b996562879dd025e9c426f771c881bd53c7e8191ecdca6016640e2bc9611a83dff68c395837a6050ad15315c073c261661a9ee0cd0cefdcb30863e389fc7e2ba42dfc52c77a7c8a1e0ab5d00d13ca1d73a81b3e8c84b27a1df46dcb04f754c35c7f435959ed7dd2f5b3893023950b6e44b2b8d0dd0c5d1a64e266d1374d5adfd359ebd68917863a13a7d6a92e0027db71914195c29168072660be4231a58427e728477548d6ea86f835b37a90a902a1246609cc9dd768123aec619db633881b3dc9cbe64ac62d040551a6bcc9b031b8f5062066b09a32566cbb221c18bb38d17b5a292236102071e6dabb1210f6a2655928d95022a118f7688ba1ad3f2447ed8fd689597ff668647c6d52b1d6c248ea3e296ccd58e7c45ed194cbde1ac1d5e1cec2eb7d39da0902b2c771932e0688a7eeef6b9c34c2f3e32367c69cb7a7c54545c2b28d39d6e36c440df9f093baecb2e1b14ba5b04f9ce2410a88f40d17e424b297c3d1ba63fad0defc27438fb133740b53d9e271e2dd802a6e619b495a42517c7066e3e1d14d314b2b1b3dcd0958f62129e3dfbf145bc665f2d4a98accab28e60361397b6cf36b68f910d79ecec4fc78e5fc929b5fdcc583fbddfa746ebde0e6c81f9c8a2570f962f7ade0df0a19ae4f6826290743dcdf53588fc6775096f4f7e2cefd5be1a3500d4acb3a11ffee0f2d1f1360f02d1143db106b3bb4833775bc8148febb1d77533875153e45ef1d9cdbdc3f4c4059a640bfb75df955285795267b1d87c595c94bee7519cd46bbf287cfece0aa6c327ee05747473c5dd83019c3b83b4b24d436301d34efe8d83c080f35fba07bd1a34e43676515b1e44fc4edbcfbfdf807e8f443e25f641d080046833a2a2744a0b567fda5458dd5f7d5b98249a5af747a699f96fc5c00a23cf44a278f4dae861d10190be154bc4896e9a4b197c2cbd5933b63029a23dadfc3452919875c87b90d966b7f08df4596c611187dd90ad11dbbee6cfabeda8ae06eec32fd8529d3842429f39033637ef146262eec541e7b45cdd78b0d9c982422a6107ce581c1c17603819e3d568ca4a059ed64316e0eb6e725022ec6c0d343e9508ae9314af05e24ee375787f6a7c78adb3d87327d19290e75291786a7ebc40e8e8302231a3d1f0139cea710037edaa9a1676390e1c4fb1ad7f5e112bd88b4e5adbc676def4c1d9f80fc21d5c176df8cb3f2660344718da237f28f9191dd0929615eb5c1f8100c8a38e7aed9091207f808fbfa774ecb6e7af971629feb881a82c754edc6ed2fb0e4de9b322a2c5317f9f465349a1b16d9d1a4041155b0a06c27e616ade83db42bac26ee757ba304b63a20eca0a703036f987e41c13729cf30ffa3381272485e73c5843c3468270847959f99dd10523d81ccbd72bacbc8bd566ed708da2fc310f158accdf18a231b0a8c4488f1536bcc6e597323c30cd8623b784e09fd52921a67242c434258b89b4301db8444387bbe514c41456cda8ff305f5d8d6cba0ec10e284d13bb877161b6037f37513a0e3e1538c70a489e1acba1484f153af6fddf890e17dbe73a1601df7b7024168829ec55a12c8b5c7a5ac6354bf165ba44b3540bf7230d8970b5a5d49973d7ff59282e2a6fbb9e5daa20b404062f145d0285a27c72702ba5d5a4621968d4342bd948bf7653a1bf2e87224582b4586a5b2f13a30859605295e08e7b897b165a62a3276088607574cd76d374bfd056d0c5484a0cd103145bd1bbc1a399124406152bf29d245efb04c0df1e3ca032172527b825c53038508d77cc4f848058eabee4c508f4fdf60860912a4289e8d63da40024c16bb478f30ac5aadceb773441b65e1358f397770b7e45be065b6c20cb039632755743597058241fe3b81210caa51142879ce61dc6eb09a45c59dfb29e9ddac956c1872b3d64557c0ac4dc428ec2ceaa2361ef15ab06b26e5cefe622cf9f31a2c647452ce77bd17522df5087b763d3f657f55077806b2eb89f9f13f19feddcf4169ccbfaf448b08096df3ee40c65662b007b2c99c970cd0e5cfd008be333425eb950054ea26f74e7be3a315d8748e6684898ac039ba078f43af6cfa57bd336a441b69f11c76ba59ffe0b0d2a2aa64cdbb262d3b5b02333aa82550d4ab882582aaa129bd44c30360833707aac3299bba1efa7bc34fc948e116e1347d4fd1a96eda68188b8d1d3e6858d930b89ff1802c23d8b0be1b21519995a7f48a9e600522b870ef7431f50b8c60c29c0e5e778cda4d503c067dce0d06eebd7865258585d7a31ff484faacfe44c983007f4ab5f28bd56a6c51d7191a23ca74ddfd2321330b9239c1d93b2155a364d9673c2789e86826a9d7ec2635912276071222a8ad4a3d999d6334c316872315037286a9d42268d1933e71b6098928cfb648c9fdc85ac1d10a309c060d26483af7537ae7824ce79dcb1dcfdafc7ce056f3f5ef499438efd396cdf42ba7b263cea1b4c59efff5661d1891da92041b4aef5825a8a32942ba90aeb1f2d7e48c9a79ca58984485791b6e28c8b6be1833f084b861849445d4fa71f572348513d47b1014fae97672869ca8941572f45d0e5b48a3de9fba40dad830ba50c7471a8a1db29da709417e6e5451361863504ec237546105889cc030fc505953a8610c34c364f82c03cc5b264e4af46fbcb47cc332f7fbcec181d78e9fff5a217cc0a22da02a587cc8ae4e3031a71ec00e933f1636a3a22ea6366d9c9e864593427195e7f05335ecbf5114c8d2895ea85a33cb4f7f0005e5640e422d9f97602a854cad6158e2dfd0059b7140106fb9955c56bb6b70c9b3aa971bde59713d39765771afd5a6df6ce727ee2b1eabaac12aa5f500673539ef92449e84749bd3ca61f34ac20b3a86f94c9a8535fb2571131131443d8a3eb0310fcd1197486934688698d8865bd935daa1ca95145cb0523872d53a30ecc9b17db1b6061df4b6acf543f2e9364d2c951b4fc596c9346506f7515270a1eabda19d6d1e259ee2c96e03b0f99dfb22853e8fb49c31fcc6c8a18c16f4868483bd6754c49931bd184650c04fc5fcb95445a0b0c8b49621d7f4d861f17532d6102e82bd207d171d4efa70508abfbd75e058f3a18c0857ac5adcb67e2e9b97794c08a7ce27cb04296570d9f370ad5e2b44f4d419c1f6a5232b13e6094ff934075cc98a4654f47bf51bb9aec695f4ac3dd28bca364f72511c16755e58c5ad20cfe69c20c052853c8483262c91cc76accf40202d5057e452e1700c0936f25cf437c0564877e0c2309ecbcf6cd01687e51603842ea1faa78a19a882dc4f09da947516c0198f2b34d3839f57eb8717c182f9b52eed77e86085d9afb579c5a12710421f50c98110cd4ba8cee1b33e16012bfad42949c547572d8c335425063a9f389333bd4da8c9990e2666924de76c4af691b9a302b1935cd64f1dc3679fbbd2584928dd4a58a0d46499a05fa92e008b7c2fffff3b6872103dcfc557f1568d689295560b17dc6e4858200fa9392889bf0c18762628f2b7a43c08291e32d5d49ac7f34c60c832d126d5f499086c32e357c79e7b891c7d2480a4a304516949f301984c113072a3ce370ee442ef101a72a103893efc83368bdc1e79ce917640a5d25b2581ef19601564a56cd919b181ed03682ea8b1c1510642344669c3761b25c152f70794b29593b2c00273039edb6068c57b2ffe256cd5fbc41e8d096038bdabe01dcb83d4fc043b044e9c976e977a293f80047b7fc65215cc9bd0bce0097bc11c75f4ccc0d7025a8780c759023943d79aca90b6b33d90ebb0469badbeaf741821c448126041d6641db5fa6cbf25b383a35fe2822db8fba515fb5602cffe91359670f73860291a2ae7273a1c408bb1d9008cb3423fed53b557e839616bfd8e209d9e3563cc06aced594ba99536c24416124b9fa4262987e01753adfcca879026c993d4ab58adeb922b7c2a1020b60ee6443dee2c6b461ae71e8b6749c51d4ddfa142fced6ad9b4e1e9f642fe968e80bc1c35b25e655f24b21c75c04d6751c84bda981d7f2b798743833508dfd9b6760e2c2aac7e7920dd581db2c32b67349f30141518239a93c3bfcdf9b1ffc34ec572679902229f64586beb5c1f1cdc77eb1829c0d1cd6508d987eb462fee0c2b0d42c3ddc4f24453ca01d30c503af4e733090536228c634944c3e825f037c19e7889d625a28f97d0451d85a6f2f19cd2b812a4486c5b520e470a5f2010f33b781d197de325702e347d16fb195819f954a1b20f31590bdc329d2a51004f16b010911c6d15b0f8bce060778e43c36e39a921c8222983dc7dbdac73a3d41c32c5bfb9ba1a2c5553c235ea1e63aeee850563fc81614cc778b66268c6b8e73de344aa08c9cadf34949787e1339d43185cdc4db624ce9f5c06e7a7f1802216584370707c432759106b81f94cb445e2a555000b6ec56e566f92e52348cc68b18c40922e0be04b4274a315c09165f51578267438344c13e7052edd2a1d5552b3f0a32ee6941e15b81a6c6c7735602730d52693d44d022ae32824a0c7b184bf55e46c1252f34b6e612e2326eeb55919ea871a47acc32ec19ac6ff65f9bf6d774f99fd60d5f036da575e0a49350c432a625823e7db97ba3d356072681fd81efdf1ca5e9181c4effe0b12c963617d9261767795aa80422c466679d675686e077d7cf4e0d4b18db624c7999343ef7b911b35eeab1ac7a36b2ce9efdb9dd52318815eb3a5546c089440b45ebfc13b964548283845c2faac217d0cc48b3d02d2c7bc463199f93f37cc91de69dd402e126fd47017e07a490fc205148f1ea63bdd6b3216b6b3e6af6b4c0687f6d2d89154bc09aaaf36c1361ba5d4cd9733e5afae129fc4d37e7a267534b550c67256642aa52f7599b1f8de62fa6a105618d54e08c0018720104117307b322738941ad98b603f80b11ef04c88e70757767b7beadf21a12ddee344bd73fbe5810df148da82c30c3e88e470050c2397f401248196a6b795d640cfed0903f475d97803c5e00d74198d75356692597c12678deff6c967fd51a44ca748f6d1a0ee8e8cc9fbf99e5d6d01c88c0eb74653878d1ad67c1eaec2e31406b2cf584911f6dc0158b32ef8b9ec83d7d29992f2a5f05b9735dd1779ff23ce1967e6e827ddd5c7d3d747278950cd360cb1360fe9ef7f273ea66b3d88707ed34ae8db1f58e68a8d2118bd63a6b2326c1e384f49553a97700a50fed7a0601459b76f43cf20f63521d4ca1b09c294ab4f4e05a735d4e8cd3086e03b53f3570823043fb3b2f3644e5bef0b8eb9536614000c732e703cc5945402d1de7346ba39242c5d48ebc91889efd7b45e1a6cc2cf0379852612328397aeef039ec266d29baa7a1c8d1473769b57df0d4b6d4472459c97bda1750365b503d22ac907192d813225e7a0e8f36bd0ff6dfd36a7d35c83a249d8d3d4029d55d89676b92176c136323c4497491a861a40f46fa636953176234c938047cca3a741446df86ccaf23614613a7f709541c07fb58327486ba17b91b1a383811afcaca3378a8a989ce3c8d75f228bca40a8af8de3ab4e58c77526cc616202db1f6688c4d206033a0488ebc679cd820d047241a0f9221c371a09", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x105a595f76d16ed474bf669465f7760d8ac3a6ac23bf8e47ab0bf91ee815cba83f284a26b85f39ee4edfd315d9d679638655fa1b271f033dfa0be167dc93335844d40a5a134e831c2311b939b811bb7aee0ca571f92d52784d35c43c9fb2fde36c6233ef754398ae4ee816f8209de3791fe26eaff064c6c002bc52936bd117c425", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x105a595f76d16ed474bf669465f7760d8ac3a6ac23bf8e47ab0bf91ee815cba83f284a26b85f39ee4edfd315d9d679638655fa1b271f033dfa0be167dc93335844d40a5a134e831c2311b939b811bb7aee0ca571f92d52784d35c43c9fb2fde36c6233ef754398ae4ee816f8209de3791fe26eaff064c6c002bc52936bd117c425", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3048fbf15fd7501d7fa66e865f8710e3373bd7042e4ee89e363dcea7ca2f46f118d5b5962967f3b09": "0xd40a5a134e831c2311b939b811bb7aee0ca571f92d52784d35c43c9fb2fde36c", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb399b5c77abc8db9a172a5376b58ed027e2aeb7093e96e6a3c67a5562ba8dc883562cb88ceefcc3c16": "0x6233ef754398ae4ee816f8209de3791fe26eaff064c6c002bc52936bd117c425", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d0eaa62d5a6fc84324f063334d367a9a9de80249cc2d39127236124cd65601840387a5048afefa27": "0x5a595f76d16ed474bf669465f7760d8ac3a6ac23bf8e47ab0bf91ee815cba83f", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3edade635cfad607bde0f015d686f4ef823353d5217a87686d3b0fb5e8a46d6652c3f217d85f2ff1a": "0x284a26b85f39ee4edfd315d9d679638655fa1b271f033dfa0be167dc93335844", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19504779d1fc6560c09761757261805a595f76d16ed474bf669465f7760d8ac3a6ac23bf8e47ab0bf91ee815cba83f": "0x24f063334d367a9a9de80249cc2d39127236124cd65601840387a5048afefa27", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507e9356e04043d4ba6175726180284a26b85f39ee4edfd315d9d679638655fa1b271f033dfa0be167dc93335844": "0xde0f015d686f4ef823353d5217a87686d3b0fb5e8a46d6652c3f217d85f2ff1a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195096bf19dff4e0e85661757261806233ef754398ae4ee816f8209de3791fe26eaff064c6c002bc52936bd117c425": "0x72a5376b58ed027e2aeb7093e96e6a3c67a5562ba8dc883562cb88ceefcc3c16", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a22b158098f4f2576175726180d40a5a134e831c2311b939b811bb7aee0ca571f92d52784d35c43c9fb2fde36c": "0xfa66e865f8710e3373bd7042e4ee89e363dcea7ca2f46f118d5b5962967f3b09", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1024f063334d367a9a9de80249cc2d39127236124cd65601840387a5048afefa27de0f015d686f4ef823353d5217a87686d3b0fb5e8a46d6652c3f217d85f2ff1afa66e865f8710e3373bd7042e4ee89e363dcea7ca2f46f118d5b5962967f3b0972a5376b58ed027e2aeb7093e96e6a3c67a5562ba8dc883562cb88ceefcc3c16", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1024f063334d367a9a9de80249cc2d39127236124cd65601840387a5048afefa275a595f76d16ed474bf669465f7760d8ac3a6ac23bf8e47ab0bf91ee815cba83fde0f015d686f4ef823353d5217a87686d3b0fb5e8a46d6652c3f217d85f2ff1a284a26b85f39ee4edfd315d9d679638655fa1b271f033dfa0be167dc93335844fa66e865f8710e3373bd7042e4ee89e363dcea7ca2f46f118d5b5962967f3b09d40a5a134e831c2311b939b811bb7aee0ca571f92d52784d35c43c9fb2fde36c72a5376b58ed027e2aeb7093e96e6a3c67a5562ba8dc883562cb88ceefcc3c166233ef754398ae4ee816f8209de3791fe26eaff064c6c002bc52936bd117c425", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x02000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/bridge-hub-polkadot.json b/cumulus/parachains/chain-specs/bridge-hub-polkadot.json deleted file mode 100644 index fd56b61115d5..000000000000 --- a/cumulus/parachains/chain-specs/bridge-hub-polkadot.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "Polkadot BridgeHub", - "id": "bridge-hub-polkadot", - "chainType": "Live", - "bootNodes": [ - "/dns/polkadot-bridge-hub-connect-a-0.polkadot.io/tcp/30334/p2p/12D3KooWAVQMhkXmc5ueSYasdsRWQbKus2YGZ6HDZUB4ViJMCxXy", - "/dns/polkadot-bridge-hub-connect-a-1.polkadot.io/tcp/30334/p2p/12D3KooWG4ypDHLKGCv4BZ6PuaGUwQHKAH6p2D6arR2uQ1eiR1T3", - "/dns/polkadot-bridge-hub-connect-b-0.polkadot.io/tcp/30334/p2p/12D3KooWCwGKxjpJXnx1mwXKvaxGQm769EM3b6Pg5vbU33wbhsNw", - "/dns/polkadot-bridge-hub-connect-b-1.polkadot.io/tcp/30334/p2p/12D3KooWLiSEdhriJUPdZKFtAjZrQncxN2ssEoDKVrt5mGM4Qu4J", - "/dns/polkadot-bridge-hub-connect-a-0.polkadot.io/tcp/443/wss/p2p/12D3KooWAVQMhkXmc5ueSYasdsRWQbKus2YGZ6HDZUB4ViJMCxXy", - "/dns/polkadot-bridge-hub-connect-a-1.polkadot.io/tcp/443/wss/p2p/12D3KooWG4ypDHLKGCv4BZ6PuaGUwQHKAH6p2D6arR2uQ1eiR1T3", - "/dns/polkadot-bridge-hub-connect-b-0.polkadot.io/tcp/443/wss/p2p/12D3KooWCwGKxjpJXnx1mwXKvaxGQm769EM3b6Pg5vbU33wbhsNw", - "/dns/polkadot-bridge-hub-connect-b-1.polkadot.io/tcp/443/wss/p2p/12D3KooWLiSEdhriJUPdZKFtAjZrQncxN2ssEoDKVrt5mGM4Qu4J", - "/dns/polkadot-bridge-hub-boot-ng.dwellir.com/tcp/30339/p2p/12D3KooWPZ38PL3PhRVcUVYDNn7nRcZF8MykmWWLBKeDV2yna1vV", - "/dns/polkadot-bridge-hub-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWPZ38PL3PhRVcUVYDNn7nRcZF8MykmWWLBKeDV2yna1vV", - "/dns/boot-cr.gatotech.network/tcp/33130/p2p/12D3KooWCnFzfEdd7MwUNrrDv66FuS2DM5MGuiaB4y48XS7qNjF6", - "/dns/boot-cr.gatotech.network/tcp/35130/wss/p2p/12D3KooWCnFzfEdd7MwUNrrDv66FuS2DM5MGuiaB4y48XS7qNjF6", - "/dns/bridge-hub-polkadot-bootnode.turboflakes.io/tcp/30610/p2p/12D3KooWNEgaQRQHJHvGDh8Rg4RyLmDCCz3yAf2gAdHZZJAUUD8Q", - "/dns/bridge-hub-polkadot-bootnode.turboflakes.io/tcp/30710/wss/p2p/12D3KooWNEgaQRQHJHvGDh8Rg4RyLmDCCz3yAf2gAdHZZJAUUD8Q", - "/dns/boot.metaspan.io/tcp/16032/p2p/12D3KooWQTfRnrK3FfbrotpSP5RVJbjBHVBSu8VSzhj9qcvjaqnZ", - "/dns/boot.metaspan.io/tcp/16036/wss/p2p/12D3KooWQTfRnrK3FfbrotpSP5RVJbjBHVBSu8VSzhj9qcvjaqnZ", - "/dns/boot-node.helikon.io/tcp/8220/p2p/12D3KooWC38TZJA8ZBXZgAYVrceoJ56jNNLJPdpk3ojeFkTAwZVp", - "/dns/boot-node.helikon.io/tcp/8222/wss/p2p/12D3KooWC38TZJA8ZBXZgAYVrceoJ56jNNLJPdpk3ojeFkTAwZVp" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 0, - "tokenDecimals": 10, - "tokenSymbol": "DOT" - }, - "relay_chain": "polkadot", - "para_id": 1002, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xea030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x105ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2eccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d28d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e656d2a621a4e8851a00566daeb02c845da19f19f208f52ec456d4e77600fc41c314", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000008253c5660a700600", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95d8c4e0034bc36208a740f371f8bb3b1d2a621a4e8851a00566daeb02c845da19f19f208f52ec456d4e77600fc41c314": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96bec8fda58278126c5774c03718a23c75ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2e": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a445791c00e77ce0bb8202f63e548da4ccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ed0583dc7b08b990b14d4f0d7acf521928d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e656": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x99924c6272696467652d6875622d706f6c6b61646f74", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00585cf7044e24461913521058e928e9f067e98eb48fc7d6e6b3e882522660f48debd62239d1e5d9526d1f6bf05cebc3fb7976636c99b8f5f4e957d7f6d9bcb9d2f74e65c61ce9c74947b8a92c36484efcdf486b84104236d97b6fb9655b14de113b138756e0156b1d995608cbbeca0ce4c222f90417cf5b111c0dc6c67afbf36c65f703b9d8f8d9d146c1db66d8f806d3a9f958d90ce472038d1363e5af8d8560ec85476672d859e79546c193c2c036c35e48350eb6165c9800ce4886c7f460e763775140d688d85dced21f948db17290be4f365abfdcce09e640ec11c505d6056914fc69bee7af9ea76d119115072d09416e10aa71a89b329c3003148f91c203b3cac26350c063784c0d380d22b252692ad80c9be131d819589cc1631e982b55f8c4a16c3e7673bef927df7b4f7642c039b9b811b1e8a7fcbc45abf5ccd2acf396245e9ea733d9c546cd5b8f1b110b5adb9158b5d8a8597996891b91bee46c4e60f4639487fd77f8d8c9ca6fd8efee1fe9bf1a1b052bafe07b3688ef8a85b45194725ca3b6df20daef0cd96f4e6723fdb569cdc6dff0cee9c442acc7c90373200e369e725db8f84badc69d78e04e0f30673b69f59eec3d65277bb230e7d2ab5e6ac35878ca476dadfad304f77e394c8c31f214a8c6e1602af2d28288838def4af6221bb0a784f30b52c63234331c0033b9786172995cb44c2d785859e7117d631ecda3c9e56501b36572d1cce0b8b2812bb7c0c5f3c0ee7eb023db8f5d5f9385bf0f3bb23172e162dcb1830c0ecb819dbf261d2b2b06c60cf77e31301818ec8897308612d8118e2b966158c5074f9071290debf3199796c0b10e5430859d978f52b39c8df764638ce7e91fcdbecb19bbab59f9e4ec8480efc5c7deb9341ba30cb8c8756a5e79faab8ba71b12ebf356bc7cb683d218698c3eb2728d7a51e0de2fe56c4e1a9f81c5195844cdfa7029789133d6e04684528ba99c1dd79d600e7cc699a5f166e4bd2fbb962da57cfdf7295fbfca7323d235561b1a86db88f433f98028fbbdd8d18b8c6de062eff4397ec6c3bfcb6eca78f8d9ed28838b672b9f41ed6d49e06517ad8c975b0e6c63951b92d7482050dbbe1030be2746fe9c8dfcebe44976f7f63d36aae9e56457ae13821f779a97f2b477aecb7a39d99db2e0e42f676d643d5d9d103734348484ca489efac85b7f8fdd0e3238795ae3b31d3bcae0e4d9c65b1b91283f3707acac7cf6b4d83dcb9beced88ac5aa3e0addadb8402f73e3b66943ccbca4156febdb723d1ca0a7923c2d944a068e57b43a28037de78c34af9beac44441badd05bcd9650645c0347edc4cc3ceb576e91545cbf320aec5796c0c6cb252e8b58c87cacf74772e942ca639c95bfeac9ca930f2b6fd5ebc35e4e16d92b8f8258f8de8a587656ec0b0381d7aee0deaf3cba180fb27e928b8d7f1b92878330704025171b3133966158d107b950e21fb151d0483fd68bb2f13c4efcdebb3676ce67b3bb717697daf80c3e668eb0bbfb6363e73be346c9f346443e935d26f9358c246620fd6b23c48b5dd74e0838ebd3186afccebdc330079e9fcd2ee3adeb5dd9beb57eb91d8639f4f7b2f1cc42e4e31fef7030073ed69bc5eeba828b4662a5dc3ce49c4bed3cad9732a79851b764e7ad7a4b166e45a49515c540e0e70db8f78b9a5d95672fcac2f3868436ea7d764a3e1e9ec64ecd7a9f7dcfde4644f69603db597f6c6c7c6f486a88a20c27c82e5ade62c539d2b14eb1b1b151dca8c747b20b4457ce50e95f6a213c8487107eb1104218f907d40008aa78a7fa7d54a76eb4ddff01022b3b50d531b4bd3c6c9ffb54744a471c1f7d600acb4748b4612fcaf66bb07c84c491e58d08c7d31ca7758adff2969fc98e2dec9ecdb806eed90935d9cdbf8d089ce7cd012b3bb3b71d919ff5cacb67bd1de1ac3c6fb151f159d460f76c06b5d9c9bf8d1b756dec7b96f136eb5dd979d85d2a0f6177a39de7e90c769701163ee3cdaad7086b1d76978f2cbcec2e37ca082a519ef460e12f37ea2ab1f057e660e179a0ecd85a9d10f08d37de3863e5617771b0f1d9d360172f3bb6bc25b12c9c9d109695f53e0bab10ef8d37de78c3de95858f1d37ead5d8a8771dcb30ace68b20c8b8260858c639a52e1c1f21c1c5d24ef111125b2c5feb9da7e29f3ac54743672c9f87e5f30fe6c9f806ee9dcf579671a7f8d9777e56e24e71ec549f9fbd2c6adc29b6975a6693113155348a2d8c87efc38d48577e262362b26814db77d871ac6f23421b05cf5b0ebc11e9f3f4f341c6b6fbafbbf2ea3d0764efaf2b1971474363ec8db64fdf2965b8c39d7339fb7e391bdf03023ed80f9ea71f8410c277085ff7a9ed8a83a41fdfefc87bd7db87d5e70f4cc63fee6d3f631bb88c6be0f8f0bc11e1bfad88114343434858aedca84b6d3f6b8d3bf5de296e549fa761171bd5a781bb9ced7e76ea14db7ef634ae537d9b4ec1f74f9d7ab6cf1b11789ee6e9d811e1c30eb1a2f69dda577190bcc7bfc70af42cacbc1179f53efbfea3abcf2dc3b082ef012163cb3f2e67fb19edd4ddb1830ceefd6ab67fe133d8c9c0bd2779f78195368acf8dbad1f2793a7b1db4738c254223654f7b5db41a0ba9f2cc58212c4b048d7def6f2ca4ca1bb24228c012a1d9f73e89855479435608055822a67def9758489537648550807deff376240e0dd9779ece5a6316f27ee1b9517cdaa9fb2c3c3f831d6d14df001c3c9f3723b1517c5869a3f83c9db5f6bab61a0ba9f28e2c11d3bef7371652e50d59211460dffb6f4bc20dd977ad536cfbbc1d7943f69da7799aa7799a3b6e149f7f74f5e12cc3b0ead74cc8b8b377eed4e5bfca8de2f357efe1c8f868288b652be314f7cee76b8715cf0924b081ed4862870d76bc6007d18e26762cb143043bacdc607123e6b4849396d3166ebc9caa3871e106891b2e272f9cdc38bd71323ac5e0e6033730b889e204c5a909a7304e699c8a70dae29483931827259c907033c68d18a72f9cc49c6070cae2668b1b199c64706374bae294849315272d4e29384d71c272da72c2e2f4821397d30a4e46b849c18d143747b8b1c1cd0a4e2d385171bac1e98c9b2b6eacb849e346093748b8c1c10d18a72e6e6e700a7393831b2ca73127346eb2b839baa9e2268c1319375fe8b0818e2e74b040070a7448a1230a1d58745cd121021d56724c21c70f72f820870e723c91438a1c53e430418e15e44022c7951c2cc8a125870872309163891c45394e90a304394290830439887280204712393e90c38a1a266aaea8d992a30539a0c831829a17e4a0a2a607353ca841a3264ccd979a1dd418a1a6083567d444a1464c4d126a745043468d979a316ac4a809a3e6a826073538a8b9410d18355fd4d8a0c68b9a2e3550a82953f3841a27d4a85143a6a609354ca85942cd989a346a945063460d116a865023841a30355ad418d5c4a0864b0d0c6ab0a8c952b3821a2a6a5850a3a566a806099a27d05881860ccd156882400386e68826063423a06982a6c8e405531a2625989260129343095319a621988460fa81a908261f988c603a328561fac204860907262f4c39303161b2625ac274c534025313a6221314a6274c48706e988668b8e0dee0b67033e096e0ace0aee0ca70643822705a3833b82db8257043e0bae068c07dc1d580ebc2bd807301a704970417031a2f252d94b0509a42898dd20f4a65947c50ea418907a5304a312861517a42298b12124a3028e1a05483120d4a5c945e5012532a53b2a25445c905253325284a2d285151ca526241490525294a29284551c2527a22c71a39a49023082432a42890a020c1b86981bc414b2185208330b77091995c90605e0a4820d0947858c834ac28e218ef05d40bec8c6d08db147678710263133365900dddec407b43e3828e14e87081098c8908a623481ee48001e90425296c5694a2b0514152e30941cbc2037331a16dd15e8065416b436641c382a56563827585a665930286054d0bb20d8905ad0b1207528cad0b1b173418685994b850da028d0c342fe8a0622333b398d4d88a484d905728898084055217485c2831417aa3648252094a574a564a232891a0d404c90b252448674a4a90ac281191b2504aa2b404e90ba51090dc206d215d41d242aa82b485d210490ba50f948ab62f6c6f6c5ec0cec82e110b9a313824e830c125462301d7028e0a2e0bc7026e059c0ab8293829b8147051705838147050704f704e7027e04cc09580bbc291801b01d7046765fb624282fc9265617b02cd1539aea8996283426cc2d6846d09252d6ab2b84470b540da407e41aac23341a4822483e2e01282cc813ca24f5836b0bc985f985eb08e60696115c1e26219c19a811503cbc8ca81c585d5e55db9c06c417825b096b0426061a9816273c216856d8d130aa41b3456686e44367264217d604be202c26b43d640d240db81e9035710b42f190ae812b4c804021a02698576665251000294b86c65302d4432da15b42dc4274c16c432a51cc8323228a4971c2ea0e1010d0ba40f220ce211221a918c588337021a324848481d9c8440f3c635841a159c88207bb08560e3c13c7319c134c68d9653960b09a6135c689c68d044f207a72e27179c707085b988707a6203739a028d12d7112e334e5ee40e6eb6dcf4401b02978593179712e4183749387d7115e13ae34ae30ac1e9cc9584e7c48d0ba6164c37c8518546849b2f37594e4edc8cd994a0e9818e2c330b345fa891e22aba51415b795b785a78675e17bae871a197786ebc2f70629e173a0a09048c079819580fa20d4c6ec42f3427b414684fbc275e14528bc4426e79287858de092817a635280d62112212a2111e1498179818980da80d30286052c0ca6c576c469b969a12d47ce02de18dc9d6c8a4f086906dc95e9069c9b0c8aec88cb22c1e99a7c66bc273c263c22bf39ef08840c30553156a96a0d9028d174c44d20b19c6a606c5723aa2516c44263126166417346ed074c1e404cd0c1e094a6be8009921865217f207d9b3fc3229ae863d4340b980132a507aa23871923d08c4941e274eb09213a4e9841f9c04818129477e7e825800d00f3d3f3f412ca000538d28401998d2f343867b7a30e02408202740513220a5a7889cd9041ee2470a14a01e209cf4f460600093091c0406a64871c2812a3d1b10c289142a16684a8f06380045c9e712b8e78729414c7102c589142ab6e7872941400068ca0682f8e107db638e0122881f7a80f031d3e02138d0e3e364882138d083644a10528618a267876e2a818b9042c556e9f1a912440492743309dc03040508293f508870d2b3819e0d2c6102444f063200854901a6181ec2e7879e283f208187009ad253a527ca14299f479822050338130dfe41ca1053a4540132a2c709077ea85081e2a44a0f103f5236a0f2f921881f158f198635e0040a101420a000f53cc0348dd001293f50a40049992205c72c02fbfc10c4cf059cf4006de0871e237a68e6195c25880568d30c1ea2470a90942a414401da00949a49049e12841420285536008413a0207e867022858a855265031607bf9e9f0b40019ab2010c3801faa1a78a1420a64871e2e4e6249d6099d98198352caf323e1a1ab26f056fa6048204c2a3f2ac88923812070747a2de91ee86dd1d734ce6397bf69c314743eed9b3bb27430821cfc90c19ce397b3237cf08992169428e1d61dcde9bf23dfade63d28c0d69e4394b724e4a699c909b21ec1821a531b69cb05b36b4625b1884d3a20d79ee808f61f784b1fba2b129166928256dd122417891ba9b27730e3c4f7342ca11ce3927ed86d1489c3c35d80c59ca09639cb39b526eee860c3b36e59e936384b048c3192343d81d3936ec8eddccb479ce48294f9e10ca375f7c12c639218c33468a350c1677f7cd6c86cc1d69dc48346234d4b22c0869f784118b3c39ca388940d8dd9372c38e7332604e1f944208217d4f2e40657df8e091a539a79c73000a480094a528e99c1b9c1300b22d1863c4228c11f2cc30e6f81ed3664a4971bb8131d28e50765318692643d8734ec88d31c72e6103d010d00db9fbcd3609a071389d5a46192964861036ecee9963486dd6b85b6be68ea6863ce764c834326390a1359b2d0819c2ab27cfc973b62c45481b8370cec9b1e54629c5688c0c29e58ecc32766bdd0280010880061ff39c9342eed72c0446ee788020da0ebc98999bad668e23737ccd29c81a37b786a3e164d81036842fc61f74ce3921a5944ee6f998bb5fbfe6d8b1bb6733b3d6ddcddcec7ac78e7edd3b1af67b94369c0df975c3d8527664c92c21378d11c39829a594421ae3b6c56d8bb131ac1b424a69a411420a61a4146b18e86c0899b70dc36ee6ec6e8d764b08219f206dcab01b2b71cbeeee0c72cf39fbcdf9bab5eefe0ddd0d4bb31bf28c5b376f36c026f160e6e6594384104a4a298d108b588c3132c7d90d9b69f76c8d069e0c1b3673bfd7ddaf23ece66686b09967f79cccccb079ca66d8b02184f0c1ee9611d22863ebd0a143070d0dec66669e936173ed1c0d9b1b360e1c9ac675942384102bcda0c3cd1d238410461863bf6e085f776cd8b0bbdbea2827ecc9eff50e2b76688134dc1ca81284067a34306500a2a74a0f1055827092ba81861e2955800830801b00ecf0f901ca057e7e8220800176f400408f9b1a0be80728434c815205c80990140d682008944dc5314de9a14205cae319340000eee9a982012755820082f243103f3f507af00c1a9002346503552a8701a00df4e889e204688a942a549cfc3084140df0b021d5c388208a000240ea061a6a82d03083131a7a7ca0fc5cc04906a6488932049428ef21a2e7c789115034e00307cf9081207e9c64608a940c6420889f1bd339237a809822c5c9142950a2fc80010c04516bf8f991e2a303648801c4c03400051104aa003c03949e2a363d3e4e808ce89912830d504f0606709e6108a021a418d1430002300d4648c1404f152a3aa62a507a7e7e70d29301285582001ac209103f52a2fce004e867035030d003448e0554050ad01003a001861c9ea107084a959e293d19a832440032a601889e2186e8a942450341fce0a44a0f1141fcd053c509942180f8a1c7c90c3ea91b68a0f243cf103b57941f80a05cc0499421a44c9182011411537a200f9ec1c99420a40c51a58708271cc080942a3d443839c00c37dc4003103d4e8200a2c2812a3f380132a2070622a6f440026c62f4ea09f14a4848086e4f566ff54a4f566fb512128a500ad1d51412e228b45acd95d06a459fac1e26242424b45a594f56b09f08bd9590905014824f564f484868159fac9ed04a28e395503f5909bdd57b22f48456504868d5d71316c256123e117a4242fd64f584de8a3e6121a17ec242efc9eaaddeca7ac24242ab557c22c4abf964f578259f303f59bdd52a3ee1d56a059ff06ad54f566ff59ef0ea3d69403cc263e6a78121a0708d05111398c802460dae64f9284b18b109eeb27c94a54b190eb37c9425065e705844127096e5a32c2e804c803e60620b32381e968f9818021926d8e823703a92c882c331451177dac20a67c30378020e87e523112401be400456a0e24bb47c94a58dc844185844512d1f3521848e82cec9e2fa072a864edd9f1f9636eab51738cef291095860efe1131c8de5231334615b0bdc66f9c80443f6a833ffb1c3f2d1125c284191bdd7812678325a6c79769dd4ac14430759acb4328c24d4b0f23c7a878f86868642a092ff81823bac8a955e58706ca9eabdc71acb475874b19be5232c60c0f512322e6dc171184970b126cb61108d41edc95ecdf28d218865f6f22c43940d3c9d8ae75b61b877eefdc4a353f787bd56fdf9614f8d7a368dba42828882a3c90213c022b98512cd9d6c4e58ba44aec17bd65fa558b240863bef53dbb9276b1da1600c6b3d5a5159b7390b616bd5fbf3a35e6ab918706c2fa742411998c356727027aa1e4f0986600e5b6a6d2c3cbad2848527cb75346a709de5a326ac5869f9e84a91fdf1acbe9cd0ec45e90c0d0d81600817a8e1022f90f8428b211d1d1964424460238c218821638422605154c0c5901a4c3063884c14f69e8444fb3e3434f40115147a600519bcc0a88c2b584145ed3b077756336802044e30610844c86204aaf75bdede4b41c6bdf386868686865457c7b2ea06e12f42da06810232446950a1093ed0a2e2739db22c1fc5d33b51c5e72519c31dd8e7736fc8b308e8c212c0248068688baabbf8852a6bad3b1c267d785883104074a4eacac19cf7952ae3ee7eef41c817e9ae2ccb6004318654ddb14aa8dffb0074c2b22c24f1f446e2695d59483b093f571602b59595862743afe47b6874bf779e6e8d3ee3adc8b3b4e2e4c096de085b5a7784c1517b9f154b0fbfb256f7acf58e9790a7ad95951d10b4b1cf0357f2bd30598c314b8c53c48825462762bc12637d567a3ec6a6b45efaebea900ef9d8491d770e56b58ef99a66b17ae32fdd4106476b76598f96f269736f48e8c4e8bbfa58168d334609392b4a79b2325add8d9a8d562c122fa768d62756fa5672deba489d0ecc81b326d1813b605801c3eaa46559e99475cbb2ac58e75714e39f15596fb41c63dc215d07ee90eaa3accf60c0c1df07d523d0ced859898f973c50c6ac4946989f5dbae8d285349dca739ca9ded7459757c664e2a28b2ea62eba70d1459757a60bd2bc3a96ded745d661bf3ab69cd5c1d59465c42fd04b1f51302c17b4be2eaf8bbddbadd3dba7f5be2e347ff566379d8fd1d0775a6f104bdf69ead5b1b474ca5ddce97558af1affde4d3f9a35c57a75ac75d2b1bb3dec3d5a53f5c9aa299b5afd6dacdef8ba78434c26ab54efaafabc575f174f86d9c5522a356c3e4aa99435764230f60c6a345dcd67477a967d76d969ba9a5bdd65d19ca7b38c7e7674d23927bd655996c55a8aaea2394fc3cd083de970237255da31ed9cf9acbb9cd5cdaea63b46ea68aeec57171b957136a336c39e65e73852edd4a8f7c31d1e9df36c1a454fbb74d1a58b52d370991ddbf74aefcdf728e9a49a8454efca924ebb49e7a49fa593ba52bd2bfb2813a18fce47a65393cef71e139dda4c9fef19363b29cfc436a0995ee3d959cb58c976d647a651f23b7690c1917e1f9909d49654a7e4be6134bfd94be7e00ec7edd47cdbea8db6ebd5ec56ef8fc67d3b4dc79cb355c870a7a6c26e07191c567f348b69955fea7690c16515085aec7ab45ec2aacf55b133e9fc12e9a57a9f1569b7ea433a76ebbd21c1aceda46dcef9b4f346243b4fd3cfcb6ecadb8bb292d2396dec94dde4adc8fc75da4db1b13ef3d733a861dd75cbfae14ecd690e9f6595eb68be75d6b7f346440b779e8e9b0e3537d146cdd774349dd639f33c70eb2c9a8e8339d7a7a9e3cea139ef3c9dd10e3bf6d95d1bab59ec6f2b721da3dd3d118eb32e621dbd3a8d47a3dee18e4de7bc93b14ce870637027b186bde523a22c36e3ac35de6a6ade4d4d4dcd79fa6d446a4cd7794370dc74ee94e9382e4fc31b82a326c151efcae2b8a9a3f42613a5a6d3c38d08bd398eeea6de95ad3199fe3622a68c3b5553efb3a63395a7e1d0894ed14b53476bbafb6ccd697832581a33a517876b83a5f5ca781d394e3544e4e10e8f8e1c27d9cd7bb103b07c148229ccd81bcb472130c36650935b6215304b4ff1acac58ecd47943d8ca0a9d68d4d4f17779a3cd71f98b5dcaadc8eb711ebf146747bda6d79c3b85e397fb761eb8d3a33e8139f03c2a4edd5119e6f4ef894f7ce6ebcc3b7f227faaef7a4f5cb3ab5e1cacac941e47c78dba382e7f4a43af41aa9de636f59eae4e3b7d4db7830cce5481a4ada1a9d786addb4106c755a0b635bf3aa8111ffa686baa8fa9d6fcbae9578e0ad417ab9bb45af531bde6350f877653f5a197166e49a4a59586278326697832486965a5f34684749e7e7f9b11ebef5af72c5f5836b76b46b6cf9d273526edafb360767fd8f927702776cebc466dece4c15d64fbd44aa42e6e9dd6a877ade33a1bb873ea9cf7acde130adebe203b2fbb6ad1f06490979fdd5dcd46c53aa4a36ba030b513646cc6e39dbacecd1d1cbdfd755b0629a514763e16462984936218774d49b07adb5a37d5db163e323a0defb356d786b7def447a748e7ebdddd661aced9fdcad83b1ff7fbc840321d23fc9cb0faf485d1ce38fbf47513eac01dce8e3dc0eaee02c197badf4dcf03291932f6226d464cefead3a7df4c5ad7d068a667b186a66fc23622971336831ddb6ed8d1c2ae9bcaaeb9eeba4d8783edd6cdada5cd63e5e08e4dfdf6d7a548bad1d24aadead3df4eb3fe1161d7fba375bdd1065a5a7dfaf3d76cba6373bad5d7a7dd0582b65fbca07dbf40d06ecfe626372d1e0710b4f45924d3dddddd361d734ef311d7356148ef59b13c3ab55debdc73ce29df9d4f6b734a39b5ea13d962fbe435673d50db08e7a4cf9e3679c68b9eac0de5d9597f9d75263dcb62a51ddffd17df0f0bed7cb40bd9c859778cf48f5686b1bb8f7ed26ba53763e45eaab7ad76aede7e56ec24d54b2d8c1abdf68844abefe1683a70e7a563313ec6f957f486c4cf18adcccbeb56b76d46488fd527beaf912eeca558ca26e9d89cb5546f8c275d60d88cca69b58e2d8d51eb9eeded48663b76fc64b02ebb9875d7796016b5c7c41bc2637efeaaf759c9f66d117270c754b773a762e546698f31f389a7b77e356bbdedf1d16e15c7fa75f9c31d1dad9e5e6acfae53ad62b774348d3eab8f1efb755dcf8a9db1634b3b39add5b18d31466bcdfa987832c8486aee0a0f422f1974e20d5d9bcbe3feb08fc6a0d329eb5abfae0fbb7e765dd7f59e753e257a5d5986f377517a789e7e37307b0962b4742c834e3cc9eeb3a52bdfab4ff6d2e5eff52c6ad1864ee1e0ec2ae8c1b3ce83597c2e08a1ce1b026f412c0ffec6a2bfa5bf572f74c2ce377d15eea015a86df67e4b15a82d3c9571d90b0ef69df9da30df05bbd7ddae4f4ed7741ccb717aeed48e7758efb3d9657771ea554bb73e4fbae93510c2cb779d775d17e7f3173a61fbfaf63a1a9e0c960dcd197212bef780bf3895c7b5cd08bccfc379b625d12cfc93a755ac5eaef6a8d7061e10a7d26059c7362216f462b3ac54ead8665956ba74ecfbdc8cc0f7bbf91dddf69bce3a0f84af19ee1ce6c49feaa5a6eba897ab798e7ab8c353fa85c3a6de534dbd279a6abae52a295e34c39e5d192d3dc32a7dd61a0d6fc87d36744ade061cace4bc582ec3ca7a81e4cbae2cfbdb8e942a0d4f86ebf25977813adaabe2d05b9fe7813b4f604efce9c4711c4fc31b727d4a694b27fdda60adefc84ad97d4ad8e59644b3d99f944e69e9972b5d27d56b839dbf27bb75170d6f48761dab3458d009fbaeebba687843966158ed783a66e0c56a96e66084c08abdc1f2911266d88c4b5e707ca444151665f9280937ec91125cd8ccbe6b566c161b9f5d6ec7089b4e712f9dff9ce8d476fec3d229eccc3cae6efb76ab9bf046c09d1e8239f034cfa029cbaeeeeeabf3a19c755f97d55912edef3cad31f186f4ad2b49d7ea6d4b4faab7eda559b19694b25a96f6af9455caae3ed7e9e5ef8fc619d4783302ed9515fb9bab20a167dd23ac7d57c362ef3cd6f9f485acec2eb4d0c2672b6bfd75127bc72a374a6a57ec056ade8858550868efb330c96ddbd9c4baedbb65d5ab59b1f3d47aec14e9d6ad6b59d67b57b4df579422fd3e2b769e3724f28d75f7593be08e1130073e805abf2eaf77bdd15a10be87e00e2cb2394d0f59f8807759ef917779f9b7257997d6b5a23744deaacd036d773bc8e080daca0bd457b362b16fdd7d763bb719a1b9ac3ef2fd124d779f7d1884f035b78112870dc9a2f96641cbc201b15887b76c6a2a94a7d1c0b0d9d5b195f2ba3a79259156f693e16a45d6fadc8cbc6f9f9d3c0f2475a56b1df7acc3fee6b7eeda3ae6464dd8c51b017760d1e333a74e4dd12969a46d291e16c11d8805e6c4bf7aa97d37758f76d7b76d74fbd56cd69ac6c41b729f7d43165ece673b76ec8003b2ecf50b64617f3b76ec80fbd1ec55b15fcfde7b8075ac5bdb3aa7bfd5bbfd6d47dee5b7ee46fb2a0e3df679fb8a8d8758e28558ac4f20cbbe5f20cb6e27fdbe228bdd1fcd6ed77ea3c54e3723ef3e5b766b4ba2d977c65e6ab75fb8c5c6731d376a7ba98b8ddaea05b2ac7552bdbc3d7ed3aac6c41bf2ea1d6265ad67c78e7d6e4430cd8abd3a96d3d2cb012b9ff1eb265d0f586975f2bc1d9156172d3d9259ab6a4c3c196695318b651856344f0751c6bfddddbd80f7deb3d7e1f0d9e2147996df6ffb2cc7efaf08ac9c5dc15704dc813bf3aad931e714412d6495ec9e8ab724f409f50af66322c26725c88cbaf0ddf780858fcffac0ca15d52d4008f9fc572f3f42c897870c218410c646f1dbb8cd4a383e18087f65d9f206801e3c7076dc9c74e4c061534363e24aa44dcbb08b5a5346d88f81f07913e2bd61b5c0f334a57c4f3bb032e7bcf3edeb84deaabbc964cca91861a37848fff2cbb8a35901d796ffce1b92677db8d227037ff59e91c7d164e4086b348a6de418638c31cef8e980d58d36561fae4cf757362bf11f0be98e19c8ed2381ef276b91eed8aee22382ebe55ebdf35766f25dbe65a58d6a0b09ae7f350baf75ea55e694fc7da7342be0a27d48a0f581afa38d028af69d9f125ae0c36d818dd84528e59c734e58b12f9a1547180ff88b07ff5e8c11d688650a5d06e3d20133f28a8dcfe4135c0fcb0ce4462ef24adcc2c6472ef20a0d22177b65160058592f30399059e216f6ca2c5776f004105cb118171d88e9d284372ceb9485cccb5f2c845a322052424745b90679a2eb4a5c8561560a61dde41a644ba1b6b44a0622a7954fcaab63be414acdca33a2c6cd865848fd6832a08c9a9a9db463ce99d408faa3695c9b699ef2d7343f2039521e403a611226d5b819502c3413a2fcbb64473fbbfbc44ecbcaa4263729ad5fd7964dab571e7bc6591b92785aef9138b1f27d1e885df4a23ee845adf7ad4a84b4b3fac85aa115ba3949a9654929a1203baa71c55cc39292ce6bce296fb194d845ffe4d24e1fd39a550766510418502bb913977e5156927e75ac9440d38b9aa34af5a27448f5ead8cb05d9ea0dc25dab979a389a6357bdb74ae04e4da5399d4cf5725cbd94d2eb97b3f4ccd7efc9523eb2f23abd2aedeeed6530161e6896e6b4b10ac5d5d6328d2baa10058ca512d7a954bcf17143023f0fb723f1b3de7e7c26a5f48915d6b88336681ca2daab57a8c8be4b1470f761b9ef8c8d46da320389e76d49ab18e65c2e6363ed9f77c6c6f73dc547813bd6637d59de992f8c1459f97bb265eceda22c4ba0caaa6d460cf77ebb88cdd8db4554e3de9978458ca277260e0d65f20c07696b509e610115a2788c31c6498d1025fc02185f322bd2bfb7119987276b71d6a2d63ab3552f90b4f3b1ce2ddc9c9c718cf135ab7cc20333a9c9edc8edacb151f2cdd6e3b46a04923ee69cefcf4a84b4b151b23e7b3dd88694724a292512a40ca6946f763fb0a372b634c2a41ab78594524e29e5648294116ee18863143b1f67f773b2932d7a7a414f942483aa12ed4571a427029c81c519a72803ebf0590bc59083f20c77b4cb53b8935dd6fba36375b451587096759ed6ba738e7cd631e75c94953f9da48e95546cfc7b3ccb279fd29a96557f7490e0c0e20c2caca496373945c74628d42bda300a52ca6959cf2ccbb2a49c52ca9e3840bd6e31aeb082e498ca471632a195d288931b92b673ce958df3bd118933d61b64633c3c95560e6c65058248a635a18d95eb2a7036f1fdf778d8878a36b663926825915927c742a47598036dae38dcd18139f0f0f3daec4e8dd269143c0438ed57c7c2b39535329068a307acb711b1a255d972dbacdf934f6641a719aad50bb9d8be0c4dbd703ed9b56326285c9d0d8d82dc34d67b7f7e6c76eb3e5aaf75ec3cfd63c35b11edf45857b55bddb5d17a2362f1b4c5966a5eac20c632162c7b41e3cc75ca7db1f4d6d4783b922de976380f1d93675697430e8d823c5797c30cb88b0145baf4a6439fc97bd3e17d87f7a603ab88963cc9b397617f36e09ebd1808766e54569574414a9ee43a74413a7c49fc01383e82628b65cb585aa39dd28e69f5ae2c8fd71b8968951b45fa5675743a08a625021d5bac665db2d6b0ee59212e3b86a54b1f35ead7e51ad97d1c8a2f36bb0f2f5e10636f2c7bf182190b4591cdbee0f8e8893319d568873d1b7a1add925c563bd6d16b9d10ef0d225992af544b3a1c264b2e814ba0062df94a9575e96181f800772670095ce7e145ae31034e9a91651a45abe02af02bcb5ce7f1ec3e7c1cbe025dc625760a47fbca6a3f5bed1d778c02b75129b89b71b15ce08e0f879765e04ed053f95071b4b3ca876b3e74180b68c9f2185830810540b7830ccec7b5ff19b61179f5f19acd012bebe3bc3da07b769e7ef72cdd9064f751719064f7711fd5a7ab19d191584fb03c4e493a1c2649eec37da84149be5201c094e1f8d0322e16da340ac7472dd2d647f66c0cdc2182579c08c3474e8479f6264c56668d1d0e7334343484840a3ef3f205ee3c15bc0f2deb8ca021864ba7ae2c63b9e894c9c2b72c0377322cb2ccd643934be0bc35e1e113f8db9a34e012f8db9a20f9046a9605e6c04ba0cbb63cf8de6349ba3ed80c0bf6f70577c49237f91149cec36fd6e5facdb0589815e1fc6d45da66456964457688a7b18e7e49c7aa24384d76d8e1ac6ad2e13461c2e4acca2ede32220cab59972adc8f46c1675d7eb3210bcf03b34bcb86e033224ceb2d7ba6694bb227e95895bdd64ed4a9acc2674319185b8783fd59ec11e870b02acba8e41a9d037f7d81cb8e6ad6a55116131c8f7a5deb2203c12a372ad334abd3b4243df4831e702635888727f90edd92f3d6e43d08025f5283967c88023f62c95f926e88023f8287f7e5b6845514b895bd6d499f87efd0bd33e9be4488219ec55ef2516fb43c7834ca87897dd4ab591ea78de271de7c9c3be5a3f2388f8a9dc1ea12a99265a270c5f638ceb32e7027c912a94a5295c01cc896a405d75d5848662f52ddaa4ea36092ac06e1e92457cd616e49303b37260f384e93d6e17d56cd8d09048ed3e43dc993d42394fc9d553c7049c72a1e3a56f5e870ba4b01d05dce52a00b7a2a075ca75136340a5e49c72a1d3a56bd2d8746c15be73aabde6739a05fc74c8f5b127aeb724b42cfddeaa874a139bc45f39b75e97220c3431549c828a96207314db425623a75a7e8d435234c936c0c0f58962409d3a9ab4587319dba5a941c4ba7ae1626a77503b365e9d4d5b2c3adba85e942e4f019180c387c76b400d5e1b3eef0d90f9ff9387c0680c367653a7507f02287cfd6e8d415c08d98e9d43dc0b7326d74ea06f9b64676c61e3e7383674801440928c2ac5c57a813d6964eddd477b2e8d4b5e13770a9810b1aba20000c1c0eaf1d0d39bce645c8e1b52fdbe1b532b4c36b603433ca74eaea7c86c36b6b74ea1ae0321c5e3303e4f05a1b311c5e3bd3a95b7378cd8d4e5d9bc36f439dba380ebf1175eae638fc56d4a9bbe33d0ebf59e9d4bd398fc36f573a754fc739fce644a7ae8e6fe9d425c00b70f82d8b4e5dd4730ebf71e9d4fdf1001c7ee3a253b71e86a0a8eae1f046ba22ddd685a6639bf14653efcad2dc47d73939edb00a3ceb360a1ca7ebd1156149e0efcec31f84071f44786040bd9487edf532e03e7808729c5a04c7c30070360b643c1c004edea41219d1bbfd00025840bd3e544d007001704d0e7022231ff50ac06240bdaa1f80872094870108e03e78f0e1a3deee00e0c107004e64a4aa570b0f3f4093203c7c004d0e10e4444602a8d7c717d0d50b80ab7e0b34d968139c0c7bd784feb508ad49772d4d8e6381adc9330b0c40002732c2eaed4e84d6fb33e0577725a1e1e27ca71641936c2732b24978eabd4e9360b44712fb2d090d3cdb311fae7ab1d324b72a702dd9f90d4b7abc861a149000cbbae135d422b8252732a2f5eedcaa4558d452c06ba845505b6f0d344902764e93505a6f762b09b54e64a4807ab524790296d490e434d422b81a68a05780f504fcf221bba1de9df32ce94197dcb02dc1eacd7e2dc1ae1319edd4ab65c96ff0a1c792e3f8b073c3898c6c56ef759e6b9da6a41219dd223786cf508ba04a7a9cc8080138d4ab6dd90c4a62a8d7c87b288901871edf26a0d5bb3d53f248014d874a6474117065a0330ca937bb2624c619ea9de1406438915156af10abc881d422a8917a81502543843c5392655149164f6454a45e2d4a3e4407204a1e830e4062389191907ab30f8917726d0208380e3acc4075c04187ad5e9c6b3a6cda898c1050af161d8ec30466d0e1324c6006194e64d4a3deed08a8573b0ee711811d60a845505aa4003c7076e8819343016a11dc0e478af4a84558b6de1ec7d9e1a4ae08cb6a91000f2695c8e81ab9390f402d821620003c72904805c8a9b7000f402d82639283532f0e2b87e7d801861fa945d01d72e038ce0e3838a41d70482732caa15e2d3b3c004c60d8e139980400861319e1a817e73848cf711eb508cb6a89808d116ab53029006552a4e6364c7ad46b731eb508cdd624888c7af0389191917ab53079910814a05e2d455731794e2d82b34910191520e7444635f5f6788d4dbd3c6e731e4884010b50591e05240001380c117280eec78374f53b5dea86ce86a7eae135743f4e43573f43a72343678056f57020dd8fc7d0d517a023404e870a82aa1e2a91d100ea36a651f04a5c652480ba9169147c00ba1f554b040e43572350b7323007beeb76fcddcd7d74a703a0d3f11edd8ef3e86e8ed39d4eea747ceb765ceb6e9e75a7c74ec7b16e47dd8efaa66e5efa54b72f3aea5646a3e09b744bce4397e44cba25dfa14b721dba2575030373e0957449ea1606b339ba8906123d68c3e2e82c1f141d4106d6a6835120f1850d5bd34d118461460dcbdb113eb23475ebd228787953c7d32878ae639b43a913221e8b5867a46df66a75f72f36859a65d15fcbd25f1ed6b2ce03a9104658cbde1515c2b2592784dc885ce70da8ed911e1a1a1ab292beb175e9d476b479d9be74ea3afc5646a7b0c36f603a951d7e33a353dae1b7309dda0ebf89e914e9f0db18b8c32ab895b14396edcdba7499178c82a75d7603cec260143cd66564300a3eeb321e300a5eebb21f300a7eeb3221300a9ed46567300a7621b1d5d8621ddb8baf35b8db2c70c15e7926862bcb58f8b911b12aca09eea232335dd605e6c03fa0cb8e600ebc03baec0bcc8147d26561600e7c03b231161e4b82bb5917ec035cecb0107024cb6364018cbdd9170bb32e16ee18631906a11c2b23cd802d19ffa0b08341fc0d19c31de61e0f9391239cace03898f38e43a77090549cf808bb5e947d279a028eb3d23fde13b853a3faaf728dea532b383ee58ec29c7e8603bfb2b05eb691af2870b77d440331f69ea680bb94c21d7eff0807f218866118c4ce9d10f0afe3672f8b4c1fa5671e52453b10b5daf91a8a85f490f8bf21b12aa92ce4551d18887c8e26b82b813ba4cbf7007756aaa8928ff2d3a9edf254808c6021cfca1fe114d5b1a153d7e583e0d0292c955d9e019d8297cf81855897bf4c658c92cf66f72ca96332aaed7143832ec14a86827d4b3847fe7d6e449edc886cb637250c44fe720237c6be478ef145d25db119f6b1ddba48ea58d59b116a99814cd801354a3e76511a259f75541a258f753f8d92bf3a201a254fbb278d520273d80d2b39c028792318086906b35e06631fa98b377435e592f17bef0c0ec2282584f00cee6a963e195a4e6d0b955ed983f04208a5e434cda651dcdd7bdbcc82835ca799c1c1c88581c09a5d508344608d316e469ecda294b3bb3118698b62206c517a75971ae98c25694e4b8b2be04e9d82efb662527d08ffccb0fccbc3be30969f43a3b80c0829508c94fbc20cc63ec15d1ca846a9764506c29645350821ec086127ab2604b4b9b46b6ec1c17a350ccb324ddbb48df42c4aaf1f98f6ace0eec932675a0c969fe9d87e907457963210b6ae79c908af7e18ce910c1e5a582f076c5766207c9d13998c7f5cfade29c73a3a36cbaba42db8cb47f785b9dda5cbc01dd2e3db0cdce16ef32400cccb928572271e16b2d9f8ee0277a8c09c784ad94c77e92e6ce685813b6f0bcc89e7e8e985b12f0bcc890d0577bb4b986682bb7c6479870ef1b090f7131a9c1078d03d4b87e0cec7d8fbc2d8782a70e7a5c139f14fa054e0cc7408b0d847592f679f65ad3d2bb8ec0d8167ccf2a9bc21b076972a2c84d6b60103898fcfde1022a8a5bf97653e6521f47cb815b9d4e0e066845a250ce49dd4b58a56690607b3a8bd34f83dc1c647051b9f166c7c6fd8d821a04330279eb61998135fea333bdd05e6c497aed58bcaeabde957bd5c171a8e339d4edc5faa17652f9b59d22a52ed3230279ec48583ef5f063394a58b8d7f5928e5b87bbaa715154f87283764b77a98f36816cb3008cdd5d5a52eb2a73dfb9ee11c998f9f8fa7973130c3f2510cbcd802583e8a01164b352db6685164b3a859ddb319dca4b66307195c671604d86612026c277d337d6421539bdadb8cccc7d9b1bb93a74ffeb03847daf689c8c05dd9b692ccb7361f6777240056763fec08b2189cb126cb4731206333cea2c69b919642e86ffce4f82c1f9e815cfcd8698de21f5676fcd9618f5d00ac855d1da4cf6227636520ef712bd24f221f273f76f3567725921f76fe383d3f17703e8fb341c63fee1cb2f09992274318f37cf09a8b0ec223e4087a0146c2e825ca24c8d98420413af56c5a4038fdd660f93358fe63c7bd215d4d2c03ac2ca4460c591942a64636cb0ce407dce53119d52865d9cd4314dc413d818710c2595b9575e12e8f3923dde8d465305662b12d0faf04eeccc3f70077187292a9356584fd86ba4d5cb8d1022f2d1833c60bc6581e96c7d8e206e462675b1c25da4ac5e7d13f501c3ce1c43f7bd0767a1d58759adfbe525d07e6dcced373d7815514e6cc733588d6cb957e75a48a55a4cfd7e1c42b8139b38a0eaccaa106f1c09c796da57a06c6ceade230d14eafd5a1edda69359aa2c2e98a3301faec4c2eae06197565429fd5a0a7a2978f88c88a23ff2cce9178f9a864ab384aace330d16e5dbbf5a7824b58a53d8b5df6981f2499d0e0fa6868c8b61a60b418b25af7b0c09cf98aaae02e9f89e7e952f704e6cc93ba792a7007fbbc117047fbfc05580811dc9337a4ab16eef33ff00e911228d5f6a2938afb7c4309283a49c1ce33e3501444b5fd3215ec7c86754fa575ef0a7c458d9ad7e94df61dab122222eda413652f9deb70e2b9af545bb76d8fdfb81a54aaefe841a4fac5ce6b5fa9b2acd33a2e38f1db57aa2e38b1e22cd19e3dc6ca24fb56b3bc2b30673e688b9dd71e163bb557047326f62ac740e24d0c24c29c78abcaff98d50772b10c8310b67a7d29915511e2bd61f940f496c074fdd71141ad10d61b5f18b2fd04a704eec8a358c80e8bed5c9f748c951065e52f7fb1f2bd61bb463138ed38b0e24038ebe532f0a41af404e634776db3acc3e193c0e0f0495fa9c258c9d99960cfcecf6a90115726d949354807e6c8077d91190ae6c877236cab9c1848dfc4408e3d3bdcb4ac639803735ed6e130d19ebd3ed6e130c928cc79c7381d9eaa9bdde5238e73f8277a0e65995ac9a7dcb55575600ecbea53a2ab6e6994f18f2baf582ae3f919c31d232670673bdf5b3e0aee64d8af8ee5be62e97d5d1e372409f1deb0d6d631cc391f597aad6398937538f32b15d6e1ccaa84a8cbc01cfa151c9a4d6451b1cae89dbea68863d566c6a80836f8e2cad0900afb610ebd1193fec5e43a5683b8aeb7cb30a43bc4e058a563d435a87f55a3abe57a93c7060d7a30a43a42e8fa55856213b088427584501d8262a4e0c490aadf1587c9f5fef53ed602eeeafa0ccca1ef24b8db652ca5d5475e896864d6b3dbade2f31bd24327cb47593e77fdf291e5ebc01d7a3e3f08dcc1cecf68f7545877d14659c76ac0b1c55142d47f37d96771e483b463a7a73528fbf5950a6e4494101161d7ea9125ba9e551e9863fdeab04e07473efb4a150447569c25d8af33c17e5dfeaa4146b232b99ed57330c77a9075ac32cc59a956aaec6958c7aaab63156f4494509863b1eaad80e31888bc89814898233f7f584272f51a3e818b7556f133ab0be234b4201a52050919f5ad43fb0ea38de531b6e0040bebd5b12f8646e934eabd51ef3550a3dea9342a051c978131e8c09d383434349445f51ea4539c7dc78185b09d31c6eed832d75feec439ef10b33c860f4e60bbad8eb590023586546d6fa3bc212db98c8cd2a967f9880a3016b3ef0fcbaba277b42c409de2a31380619feabea2232a8e60efbb22b350f1057bdf144f75f98c177b1f11112362ca6c3ab4ea30e79da7b12ddc9f1502bef186cdb060e64895719b6c1a85d3671d14ad61214ed7226de559074b88b1d1beffe8141f2d41c6e6b0ef4a7ce89d8bcbd0d010122a3eb2b2867d65ecfbc501aaeeed3d51bc72f90b513c32e2a3268cec65334e6f481b1143a633824698ce081a621ac5364aa72ea5d2a99bc3884eddd34fa74af63dc71b02df867df6b21bf61d76171bdced3d0ecb47231063bb3234193982157b6fdb1a1153a6516c799a0638b0ef5aa7aec7257b0183b12d7fe9e520eb704ebf65bdd4f6ab97b37d754eb691f8b08f38487cd8f75bb66cefab38476ee16fe1af8eedc7ee8deaf70b7fd8a1e07fbc0ed529586fb428e6d46cc21243b8c24e54b56530100966c2164fd4a08d1fc0e0095e6c626c6164a5055becc9f2d112597061644322d550ccd31d3f63ec67ef4d6b77a4fadc6814c67520e06e8a91e36913c755eeb193f5d279ee9dc3305895340a036a141627376a56ec46340a7bd2280c8846615d5b6914d6fd178685f4b13f319dba6a5b79f1f4534e39e594f049f8d7b58b1808768b0adcf53eadb451f17123d259a9ab1265772976d855796e58ec567781b6ee95d15d1e63b1bf35b0c7fac0340a7b56df1720705f2cf62e82d8e4fb279d8a167b50a7b0637f449dc29ec5d8627f5c3a458ff56909a2b0d87d54588cdbb018968519ec716131302cf68e2ce6650d8b31198b9d79a78b96b0d82f29b8ab63b1d83db65dd445454590d2572fc7550cc3ce3fb0ead3471c186bac310533f4323dde61a63d0616372c7c3ce9b092a8c0cd67afcf8ebbb022cf629f5de98cd5595f195463302aa39b3a10984e03af127b7f188ce94c63fa9c26d361675553c7d70343365aa69b2c49e5a4949e018da25614564a0005fbb624d663a5cfa15194d2f3f4d482d36e4981a3194fc3ee8979b19b341fb722d0cebf2d2c248b4e61f589c91e1b9cf69f4e9675db4a1ec2dc5b9168677d611808bd45050efb3cfd5569a3b0ecb2abf2b8b7a5cab3a5eebe322c3d093edbba3745a3e8b5eeea58fab70677bbc8d2c3fab2348a3eab0f4ba3e867191cfd0b0369b4743a152dbd033af54ecfa4537dfa1e58c8b3f441f3d79720ebe5a070b90a941a1dd14764a915fbae388183a536581a06e650fa4b0a8e622f0ca4b469c7be7275690919ffb89dc5c247e6172377fdb8ebd7c99650c2f31661fd508ee5035c0ec3f2dfd01b53e6004b98018d1ccb4357bc78585e18cc037e02b9b18c795470ce982d2c7c57f8020bffaa559973eef3c2c23734edab2f0b0381f782eb0a835848642f29b8ce32b564cc396cc48c974fc27a0d33dc95bdcc37f00d3728febd67bc21e16cd74bc5f639092a9f44ac72d29a047312cc39978abdfcbe557b3b62b29579067e6f469e4a227941f24b9c5449c4cfba04552521c461b678210933c89cf105235512b21af56365eeca4272d52d99500606616c012c1f61e183ee6ecc62a759699465a966a5e3814258165ec8eaa2d464e527833cec8a1e91a7c50e32f1648097cf6ec4081cc208db6884ad07bfc86eb236a3c9583e1cd36684314346392d1a2985fd284f8b5ef4c2322d6a1aeca73196691b299248b01f8935deb824753412890bcb2f71a9c2f2394ee3eef616cb37751534918606f6a3e92c8de29f69a3897aa88d336d98f9e2c50c305ebe78397a55bc2ccf8977a5dbb07c68069291649ed8d0ecc5f2211f591b82e8348affba218c51ce3827ec375f4318a394d38a9605fb5951ce6959945e58c430d80fb3e875615896695bdc36d86fd35ea63ded6d8f54e222c7c17edcf64a25ed71cf64d21e4d4daca981fd6aba1b2de3c89143631da7783ac17ea7d7dd58b319799dcd66e4e1d88ce0c8b1197936ea883a74c07e3a2809e7c8f5ea0db25d715012ce116adf87b00da651fc67802964dc990d3e5a84745446f0560702eb948a9d3e4440aba503d6d9caa0956a655b8955adcf2ed64e76f788212be379d3815516bcd58160357494e54a11d10790185225b15231cca93f6c7d47c1657e90c5473e81e5ca9181f433de207725323816630a57220b9126ed5926838b096c7f1963fb199bb1cf320b19e22ec7b190aecab3559ebd1c95fe00771f18db7f603a75a919da98315e2052a60251681acbcd7fd23b1cc7fd54200a44cae8b090d65808c3c3fad7bfceeb57c4059505b928761905e6f44eef8cb1fd1b833502561497b9aeebbae845e9c3b2e515bda12229ab116f8a2c41cd822cebb477e559b98e7036451c67c446a4081470ac05dbd7fbef4a112c847934ea74fac128fa1ce0ce2b82397d48ff7ab0f20f09b4d65f11dcea3d7159bdf487a53e58c98ca2e7edc8ad25eb2baac2fd7845870217ed614bbc291f172e534af939e79473059c11f4fd288f76af8bfde914ad8f0bbb619b8b46b50a28ed226fb3074e8bd2296e28a250028a84a3f80437f9bd37274b79ee846007f4ce09871d14e461400e9d9a7f59b2ec0481397dca71a72041187575ec4f731b51b250e97e1a2515c0698d6a3acb3c2efdacef2a3ec1ddc785c8d3c209ee72192eb60fd4a9fbb488f2d329f93e95a7050b61dbe71a55867bbf5c907e5850a8ff740a62db04cf7a161819ed143377e228efc4c3ca95ac0f8cddddddddfdee6e276cb15929f2ca0b19b4800b1a67ae70852c5438f66181843dc13798a1a1a12754ef271e19111060ef0f2682bd315c1b7028d9cb5e387bb90c18c4e0b097c9f01a16ce70d90d7878becf8930f055e1022b163ec2531730c1c27327174cc1c2bf8a230b8faac20b165ec70a30163e08cf15592c7c0e5a58782539b0f03d3c6182858f7285162c3c952f2cbc116b58f83754a4c5cc952d5eb04861e15f964ef1d10baeb0c5366f445edc02772edea079dc0c7410860a1ce4a00a5880c28e2a4ea753a3deb9a77a3f5d29c3888c33b4f0c28425acd4e0e64c1653ef4415b57dca0ccdc8f8c7b3828befbd283007a76f7da5b26a50f6f920ec6499764aae0ea78f7dc1e97926d73c06afd35b0127ab49c52a5a29cc812756ddd35908c740e0f95c947e828bf53e2cf61d1e361c63ce09e19373f28f78d91142f8be519ef405f7ce0f6599cb46c03d08215b249c2396857f16d6db030541469fd5dc8c3246da29eea0bd1042389b76aad27b9a57a0d4b23e507614e6f039d8944b9c31669a45e914ac29681bc9a2740ad61448258bd22958532871b344e24c92b499341a2df6a6459a1a1b1c16a523b03ae69c2b3fb50d097c7cb62129e2b2f1db76845a1f1c5ab6119145645b564ccb6263b2312d8b8dc9c6b42c36261b734e4b3e46c9b3072cfc8bd3b29ae01c79eed42bc2c23f296f90f5b3be94e4c05f9ef410a90e0ac51324f2ec387a2da7b906f77e4f734e4b5ab153cca8773e43cb0f6adca9d6e4e7cfcc8e0acce9289b158e73a811d77684da2cc3aecab57b055bbaf11e674f756c8a290e368a2bb8f00528a690031cdce0940530a478d24624dad82906c30222d8fe468b5462568046161518ad21850e2c98a0042184708755f15a67af66fb08b64f592003dbe730b69f6d449ab3104208218410428875ff12c203420e7b7958a8821958188685a72a68c3c2158861e1e9396e8585145f8099811096a08412e438b34566218410d232b8d94416d57baf0747695c1952bd2b81ef3d74eabda121d5454dc1866d326cdfda8834354307280b3f2d154c81022b8385976386868694e8eeee264df0421562a08535d22843d5386c378dedeeee8e1b9136c35ecda608f6f2f062ef0f31b0d8c008169e96c0c27351a861e14f29f8c2c2bf04161e497186859614dcfbfd7b1b16eac0420674aa0f6110b873c8504cf14498343e60460a2a0bafd329781b20847f95aa1ee420d800d81ec351c1c5ce6f4f70cf0bde29f5b0f0f30f0bdc217dfe65813bdbe7df96c705ee649f7f5d58083df6fb84207f1f0f76e2ef0bc3cea3e04ea9464a2f5729976d9d3ca9c39e59ddab3a8d52691dabb05356b14eab56c7e3c5ce93baf9ad43597a7a288b753a25ce99a79d0e0632ff3a94959dd6113d95125445a4c455444a702a12cf30afbd1ae669df30ff8ae0ce09d5a8b9a1c1c9c7cf47813bafd6cbd9323df8d0af88856476becf2ee39cf9adabe19c79adc3e19cf9d7c160ad8e001676559e05a2b60a10673106324f9f0cf35947a4c455cc33dc01d87918f806eb3174cefc9b31346a5ad6bbd5fde8340ad5a8280c649ea7e70ab887e5fe4c2ed8ad2700fbb46e7d3e0a0b613b2d98032feb38572dd2f6a27f459d8a573a75e3a577180843938f9e306327cacedf57859de767852f6aa13a351f43a76a1e00690f38f84b392eb1b1a3ece8cdd75c77b2c982bb25dbe7670c6177e260ff089e337211d6538985f40c32f9d83d1870a7394f9b8efdeab0eb3aca5ecfaecb84bd642a5dddb5b125ec3c7d75a59b30cc4b4976a58eeb6cacc09d1a25339b4b5e88e335e4afeea846c95b4c70a4637fd229edf240644eb461afd33c7b9ac9542f10b4a567a5ee32e24ae74695aa664de7699aee466baab786e63cfdb624d3061c5b8cb3366fedd9bcb723d6af6a734b0a22d93117bc53d8f51892a0bd2ace75f1b49601d1ae8e526b323d768a85b035d5fb63634de74cdde90ace24e54dd7230bd97ebd3722d775d34b9dcf75d3b3ab8ba5674f337534a58a83a474ec464a951b65536f4dfdb1b134f55e27e2d9d2b963a6aed471a57a6a94cca8f6b6ecd9c5ef41d25699815cbfcf5e35ebeeca2a61d2a827c1611fe0987b94084470c3c260790c2258e96744c4d0912429703e3f9aacd707fefd551feba45f2a81acf5f7f9ec91eaa53f5a91eb59562fab7b4f067e32546106722f2bcf0ce4d299b1755da70277b9ccd5d146cdcb2ebbb6974838a55aa46dc9f673f8d1a91bdbe7813bacea2b61d2f7a1775e91997e0c606c5f07877e49231d896fc8bbfc7c43e6e5e9f64bada6594d7bec14764d3b37eaca82d34eb593b4709f1dcef679b6afc3d96a91f7c8f30d8b1d21cd59df2852dd7aab6f14532ab8f8362424eedbb10e87f4674918a9722a9bcee95f5fe050f58d6aab09ee3d8bdb03de85806fbc61d3a8bed69d183e48e23035b80ceb2e0622ffbaf864909fdd7c324879ad08bdecaec32c6a57c7f651818334be6e9e37396d94f13d58c499d9dac8f8c7955c3ad596e18e16eb5adbf40e55f17974124b279d68147c555ee182bb32cb150b2fb354d13bf430764e3f7638efd2bef3b37e3530b1775ac55b914ce21ca1369eda5885786fd8eb63a3d63b962ceac242a211ec8d5bd8775a85bd9a2dd22376ce7be4c2427a442e0ce45d72890dadc862fb1c5ff72c93c1860b2c93c1860aeca51647feb2d35ecd32dbc7bfd73559beb1fced25c13b1ce7c460fb8f8885bcebb787112ca487ed1c58ef63bd2815d83ef37d4dd8be0d8dea0d1c6147576047416cc7f8f72ebdc0bd9f6943a31a07db3a3938a0513d34ca87465131b8dbcb671e8de531b430050bbb27f43c1dc401ee0d55231ad56fe24c94ee47eef87d8fd2a87ef63a2a3ee0e4ab9246f57dde7f1ad53934aa4fa553542e9546f5a358ee47813b4fd5a732df10230ca41fbbb7594fdc958d87376207419deabfa14e5d36c3f62592f864788f753e19ded1135d2c0d968f9e20b23d34aa9f74ead5278d7a43d8c67ae533abbb64c059bf1cc6880f8dea5bdd05b2f75dc257e49dcaae871fcd5af549a3fa581177390c92772596c9bc3f38645093f3489ecffb7d46de1bf25c718ec0d31b81a73f385859ef3b116f65795afe3da2ee5969547f76ef4aa3fab27b4e34aaeb1b6a545f4c9ffe80bb3ab6fb4658085b1db84375c0f53956f8b2685c603373ce869452319c2605774f43c53c2a6652fa863c2a46ca77022fd79818f888cb097e602f7fb9720233f6b2193a38502ddce532dbecd80cb501d71707ceac8de50761801216f2388c65de8263ae34153b55000b4da0858540e0f8dd2b88b45190399ee37d38522a1fe9af758a045a3a23968cffe29f8544c7186384dd1fa8e2307677331739a6fa10aee46b2d1977ea72b4cc29f8c746bdee73a39eedacdf3342c34bf9956dabbb672df9193724483c60e5bbbb325a1f79f8eedab6ed7a441ede67a391b6abf91e1332d212608411c618638c379eaf4e8cf1952865c8273eacb7f0cf071ec27377e9b3f02fe37e0c495a7098b4aadfaaae4147a818e6700bbd8e3fd04117319d621d74e962e127999e663ac53aa8411616ce36ac2b4bac5fc789a7c7b0d36338b136b17eddfa757eb68ac7deb31a14b432e24b0f51340e934389cb7c29c361a2e9d8636512543a63b10e275e1d4eac384bae636ff29ed523b2bfd7f723ee3cc32ad38368d8838c986c37d5a013cc814cb46f3508a50539d1128aa22cbc4eef1c9b60cfea11464c4acf7e84e9d89b64dfbed5234acfceaa1b6402da379c68ea706265ee58473acd57aa7e5d6a8a6c6ad0db82a5cb96a28785862375ff3e2c38b6e4f8e92b958eb38a045f5344f37706e6c03fc8884976d3838cb07fb19049e93435e83131bd54839ea932cc7935a806bd2f2f0cf6050b93bd77c6c293baabc391afc35962bd8f236b13eb7dfa779c26f4eff4639090451b59c83234a4229de6464cb85fbfae93cee43ae9da62214d0dea2298037fd5de82e5faeda2abb16c814565cec0a2327de6d4e9e8668e0e0756a6cf646755f60b8b6cde0f320a326252f3eb41f0450a50d19c54838c98906e53836c4e62c29d54836c6a736182baa62af15434fdc57456997ebb8ba9e2c8af54f34ce9ac2a551c59951031cc89f5523bc7c01cf8956a9ae93016e23479aaeb4f75dd74ee464c482fbd54838c7096946e3a93d24d35c828966265523a5783201698035faab00b9c636099ae0cabb05f8805ab4718b1eac22d47641587c9b76315a789f6ed5a0d32c251825d075661b5c93c03851454a0822f43432a1854d42aed42d937ecc22e167e87178e55300cfc622104430434000210c80c0da958a5d52384b23a74fdfa85612c3ccd0e3804101d59f681bdb08c85c7bac94505dc8503c6c27396c1d81b8b2c8c45f04c47f3856315a67af6c23316dea259c5b6b942c63fee8e31162ad1e1ccc38046c1633f96763e3f3636fb8f8dcdae9d27a517a814ea152a84891e05195368686604614002f3144030381c140b47e41151d4851f14800f97b2565c210bb428c85118428818638c21040040000660301b34003f680d704bfa50027063e8cff5db507277009cc9c05f7560ae491eda01d5b800002e2dbf7ba603d6cd23521ea4624119cf0ea8a57b2789e61d9500c181efb96acabab0d501e79ea0a303d6149dc8ee8eaaa953ae447ee14e0c41f6697726d546cda7cb5c21739cbee00cf93eab013bcb5b29467ff1a3dd5f41c8da3dff35f6071990d2b49af561bc2c21610e2b70d2675800682c56e0706f886b5ac0a384847156ab35c6a89e6c40d53826831fa2b5b99d00d63cf186546f4e773da70a595a19a2431c032f04d8ddab0d0888214a573b574ea2dd6358b5c343c850a6cbe896fb42e82058d241b6d75b9c311ea06a7d23d75f45c840f97b666cb4ed7f8564301e903133c679d52053ad4eca121f51e1454b15f5fd6914d967af6035cd83d9ec000287b165cc35e4ef804f5e0ca19bff552a6e792420d8bf4a3d728101c72247882bee00a6382f084b811972cc71bcd3cc900ebe13b9be4eeca2e8683e9c0f573e917cd0a2511ef5c9aa99ea9c910a59786709d685270e34fcbe56e297af7f7e3dc2f534b4decacc3ff4e982038c7b8681693349f314be39939a3180330409ffaeae5be80941eef2dbdcca6ff4dcb8690363f5e5b62f52f249fa5fa1209df95f86729051f4816b014c0f8bb479c52b0a05f8ad8fa93e28322206b94cb647df0cc9231652b6106bd7b181324dd0d4051f0733b04197f02179ab2499dd0c148194fc7b878da7544c1bebbfb530034545e5fdee8a98e46ce2b7b03147c419862fb52473edea95024e1ebd10722f4a20a85da4a41992e40b9df2f20271182751bc97f413e4b5067a6c869181fc2888f5a89490a9e9fa6363f8994e8c254b459169a344ed8385f52bf4e7ffe7c8b14e44fcaa20f32c348463033267208264627c016e9ccd24711db5d62fa0d9f2d50658d29c535bc57893eae92e60b08bfb08e9ef440f10e6f934817d83076fb3411cc4dda6f4cf2ec17ab89b3ce5a113a7e1a5ea7a3a5ab09f6580be055cb5ebc7d0b0648fc69d13696054e89cd95b5eb48337492b6015eb4782acb5fd789e334e80ca48d362b9d03128074241bb79a25588384e927deb53938881a655cfb75c27e60dfd855ca6c259fc8afa394252f555fd02d6074a4ab48b2596a2712805dfc8770ae80b5d7f1ec5d5de568f8f4d3e52efa02a92ec44bc6582bef36ba8c805abe75d10614d0745780250f5d45cacee554fe9c60453099a4d8602d3822e05931eb0aa715f37921c380a26c3215bd1e39fefa99e15a3efa78b48e9c56a6f6ec716c4250ef4dc26727360e0ea5f7e5624af42ef50ee38bed6730258bcae7f4777946b751df2768ff2ddbdd502c36868c7639af668f6bd0dd2d91a68cdbd921b90662f42ea16181b22ce4060648e9ec2a16949ffb528622a1b694fbc2064ac9db72abf847559dd44b521db857e82d141c40bca0751b16adb7eb952f282a8a477504cbf0fc4d10018f843ce21c2889ba009ea79cae30bba2fe4dce1adb5ccc00d10edeedf20a7b5235358f6a1c1aa967bd4588311a4bc643fa5cc204799ec9c88a0a844529711717e85bd6eaa1a5c646d8aeb3f042c55f5a8838db162c1f7ea18741744a7e5f82eb6187e105442f2d89454e08408834d9231581fc987d542468904e8656c7e227a6fca31588d717ddcc622cdcac18a98f0571a1ac7feffefa42be9afe3137845c1826827bc8cf5426a55ab67999af134e156786759880d88279dcd05bd1cf546a339eb653650a973daad21b283ef1698249dd9f275da39f1ea0bf264c7b112bff1524c2dae999d389ab998d5d30323add8e794b794526e56965319ba422ea131cf3c2926be78ccc56ac4dc110a5d5efe85dccfe75903c45b032c506201737a40f6980c9f9388ee0fb264626e6db85b97af784f335ce74484e4b5a026e463cb6a6b48b8105e4c79ecb8791d959156836cf00f1b12c0816d37092be98a874a68222dbb4e2ab544b4e9ab42950bbc71585a4e56427061fdce9ba4011986d9cd8db53acd420317289994aeff06d5f4a9f63d89b46197ca8d9b094d286e5832297f118d428171d2efc7bda1dcf866d635018d78072c13c31d23c2bd5c8d5a1f6e20049fe9d39274a59204d0436e3e7304408993fa7bd73e29d2128daf570c61d67c487f89ce62ec39950f292f95add8d2852dab2071839301d2f81227843da7f17f0b171b9304e09f1bd68c8ee14b9c73434bed9a6bfd254870bd467cb65e88ba845d90e57e77fd4eff19330d3247fd9241ebef21c0bb4e557084eeeef3149e35672fc4a34b32f12dddce15febee50c988ded143d3a8c5968eb429e2ce8ec128d211c09c578ff9c6175f98b801f6864cb1978934b92948b29ecd0ae71753722cdcee437f8a01439c46a6e27a10150fa8b6807c7da623eac3beef70f1d2639b764c3b3203894f4b67760171fe4c23158f27bec5c55f26d4b09891bcb402204a7b9bbd94225440900289034196d935e481c6d38c3d54a7c4508db9d2e4d1d90b52db3e686c65010ab9f731cc608811112aa782fc34cb88926bd733a0e512d7c8d0dc3115e134732ad09368367723e675c0d83b5c85790e5ee2996a6453e2d8bdd8d6baa8fe76a4eb3c0e9d4335597485f1ac1d78188fb6ba4c3cfc9f672b0d10d2186039920281b767387ddd257b3127791d128c590be20e89dfbef2a5012c58b0aebd61f495cc0d826e40b7b7840d99ad7703412d45e04e9e524ee0e9d9f248d0e46ccb6b49aa6ff53b92f087f5ca10c805c8116290777891fb8a35ee7d7be988d854de8158beb67dae16adbb94c47b5d3826936b5e467cab23cb08365b322b2d48674d2f34e1c89bb4fed568f4cfd6bd76246d7d692eb1fb98a0be5a032d12c08ef2d9bd31fe46b4479e7583592483a744d86fa4d7c5e30d55639834992778e8abc8e29d0ae26cd0e748025bad7e5958a633e58b65516ccb94095c6a8f49e476e0e30350dd29ad46e1ff4d36b07c25f90494a2f5f58c24c51095f3a2adf3bba7266af0c563d21c00345b9d4de8965dd5c073664bbf2b15ea65720454cf1f3f9b98cb3352b7b09ec0a37ee0ad13234dd4c4e92c48c0524b12e44564466d421f7b810ad29592d243262be8af59b169811ba1853830c2d134668c44517867014cafe3e0327b2e4619ec1ff6e65753c498453b693183661a97dc205c6f957a834abbde7219d1ae758ca9f483a2281902b7590e495a18dee8824a4f6b0336fac90fcc254bffa11e33a1d90d85472e350dc82cb0f07b6b51c1f92f3a6a0917e51761a6997c8003d822e07237e7a286cbe309e9097453daf4850f81cb03234878c1bfaf33f4a191ae12020f1e87577531d59879080dfb4279969eff7445b17138c32050b1d6f7b8c6b97d9738ff8bad7b3269d463cf054b1848d60e908443354d40072a37b13bcbaec6dba94dc1d333b6ac5c4522a85454e0b11b0011089f2053917eeb68a84b1817bf63e91b41de1b6110c13e68105a2983117064606307ecc4dceba134088eea89a603c01a20050786e523d55b23413d2572931c1d77804996c8d538b552bddb3d66c5229f2196343f807d6bafa34f93254140cc90c65c8cf81d7ec701f4c15998cc47ecdeb898789f05d40495b7a4d85f6332e65aece98e8f9d3640c5dcced3d3a9b0d3faa2ac5b5e163b5bfcd23459f1be932d79b4faf26f013801ed4d045d9857b25f8963be1c6f3c526c80a5362264238a0abd8b0d1a3f8d1286afa430faf0e6c6b55d1e10435595f3e30e7344a4da76d04e678e6e89166ea940bc0035d3ef0590168e5ebf426f455e10adc7cf03412a9a1ee96a7308e4fcdc8017d1aafcc9060573b37ec1122b73f9ca3437d163f492abd432a88696c0a3b0a2304b40031717c231d6c6f308387744958ecdd05816ca2e68643375f7222622559cc45fb865fafda11d70d8b159de15d6e9b19f9430da32e43a5b1b5ad263342035d4567de77d81f2cb5da845e1f7ab52ed03c4313cb5bd7e555807eb93c304833eeb45f8c043fa0282460184fa15d398dea08eb745f1ae8b56b4d9403094676bb34c34a6a306ccf2dd93a5978719618eb9ac0e59cc28b99161145d6c7f111cd2446cccf99f12bbbddb913313573fc9c73a131643254442dff171cf3b397de566f08667d7193b029d45b4d70acf1345dfd8a82d095c6b9f2b3e19d682686aebf6032a30a54bb58571c86b1851071c52663e5ded1325e8df5b47838a05beaedea35116b26f4a642f59fe551888311a373439ac14ee16cdf2adae83af485bc14c1d7d0b5a7aa17d37cd5d25b000d4ed9d9002a386d58298d930c0fb2fab7eedc0cee8b6748fcbd18bbce6668556defec9784131dd4e7943bb500a55a793440f0f5569d47056fca3bb6c5a13d19ed7c6fb2256ff9ce16bfe78e6c4413e4488545717b330b3d9b9b6891c581a7a347cf6e21b5551af78b1d5a9324effc32e5507a3edc9ee95b3df13de191568ca8f6e8a89f92619c3dc6f81dcd9278317fe19e906635d1e4b1ec12de7c25450d5834445b86b677ac6bd76410beac2e32a72ba3e27111afc047f4ed5c60d6e639be65385deb2caf7ba8e91c0872375e394dcad45d0daca19d5a7d8ca1e9bf346b066bd0a912a90cd54ce4e8e1207c39a460b28655c957480e889be4676b3072444252ee9c377ffa5109eae9ba00b566e82cbc0fad090350b59aa61c346f0f7ce6102051975af835b8696ed3e719a19bbedf2e105f2334593f2d106ed455c9000da6c58062a63485a0ccadb1588142743730407737e9be6e9be76391f3cb309e68687071908c27f0e6810346f57753dba90301adafd81a4f78d75ef7d51ad9fdd1e99038e6c900097c3174e6355477e5549757a237746954fa6aa970970e0e3910d1a030f4cc78f584f656ec58f629542fc380be5ce335dd65e9b259c1574201b9afc95318d734b0aa4641c80ca17c62e5f673146f47bbc80223cd5c733d4a35654beaae3127ddbfe9634ab9e61ebbee50b1c26d74e720d0e34a6a8d6a16adf3fbd0251827377a3b9e4f46d3884c2bb4a7e91cb59b48bc8032b9430abdb9c01e158b27b2c009d7b9cdfdb3f5b3a5c289b1d52121bd84d0dd81ba1ccbb288249455125b58ab5e98ec8aa162526d35eeb1e6fbebb4244a46a41d294af321eced0e482179f474dd1f9d48ed767f8bd4dfe51f3ff737bd7e927248f059fc39fe489a18e4bf221e05477f11d005abd9a2be8ce4af410fb1316127807e2f8ca8e5f228aec1b176684265f5ca39784725455d79178c3f414fbffc0be9b50bfe1ac6c9d2467c52548e03a2da23df020267a3bb1915797c4fa3b3bb6f05c69df5b1a2aba3924c29a1ee3e3498a95272a2adaea659fcf22b9718834b4b45306b45144b5b83395d5e5584004db4a03ce774057b467e23ab15f2371d7cd3118fb5b309884f8f0b5b6f97878b9cd6e57e598246ddf158a1be7a33582f5046534ac3b7c25cb0c6339c48e1d3c9b8bdb6b0dd45447844a727c13a0347d2853aaef95774c8b76b48022401734f82901321b105e5c17d25eacbbb8318a1947a8a198f268d88977a7a9e981197bf562d6f9904f7256a1e84ecbb4c922386603aac07633c40c4ca471a42234b87b254e24354f21b0266261a62c9035bc0aaeb850af58a6c1dcc75004f9bb688538a6dc1990773f6cc3970b01e103ac191aaefd058c900b791caa6692df7cd09e51293c62424506c9d7414f0e9fcfc1f6c9ba82c054c7932f4169a1a051b55020fed3e443b4a8a846f9caef5f30c6540d2e274a042f631d071bd7526b4686b45505913e5e628a5025f94dcd0c173ba3513f50387fdb7c6887803ed1db61890efa92080af4b9a06461fb0f089afc01a85219e37f22a29a705bb6bf9ecbff049b73a5971d392f98610e3c6cd04ae679d8f3ed865dc343572eba637b06f90ee1ce7be0969fba1284de86354481e68d34205392ec0de2f3f9455338c41f4a2e1edd5d8dd5366df2eaf2901849ce8807a262b261d7890830f75667f569111fc252eb519ffd907636d3266d98e1b6ce34b18302064a166e25361a667b4badfc9e5b6cdc5ed883e3d7753f24788b0d932b0b862ac51b0cdd254b8241ca4f1d1b07007fe4ffdfdb4dc00c7d797c0ff5532e832879639f177a2041cc306caeb6b288dc539c5bf65e90a5ab1e5f95a47fe5d16875ab06e03fb0bd9dfd7a4e790c3bbb0b435660ad380c4320c729449bcc77acf260024d059cd904fb71bfe549e55d0d26afe5b6c9da203a55f3ad3bdd18c9b270c6050ae1a2f3798ce16158a15c58de9b22681a0795b4f32fc158008c45ad20a3f28e36a09c4cdeed415fb112b146dd9a59fc1aa9d5038042abfdb4a2bc542862f4cb88f6b24039bf1c05021c2ef560a07ca97cc846d4812d7d75e1370f01e992748e2990f3dd75e1b9ba5f5f47404c475c740649d35a3dd9037721399dc360ce042d9f0e944c0b3b308bd7d9a975aa14575a82b019e424219047fd0986ce75bd9fd2896e66eeb08718d9802e01930cae93b9198800f8ac5909ace65be6d8818081d26eeacfd531f8159b3c7a193f39985cf0d18a8b37374dca10e64ea61219e60df10d9e9b6a3c4b1bfa580487279cbb2df8103e7b33a699ac4e7340f41c2830ce410aa33a39364335d430f148d1a2dcd285688434b040803ca86ee10e4f47894cef36e59f934d5454cf1d6596211b8ef5c76a9a357d7b1e1e6f6b4f22b875443bdcf511f7d73d1d73e307f3ef1f1baf94b4e09742e91796797d448844f545d1916a5199599521ec6ed251a2a275559476ac52e512bcac66ef30a08964b60b74f338028a0438420ac6f5dabdcb726505f0bb0d8956f43e415c660b3a5b98feecdc00ba26958756dd4a548cd71f90a2b733547606bd613557204f94d5d14e9a984eeaf076e87ae8d2275d0dc45cdfa22d78e544bbecc94beb7d1f86fd54767b8cfc395ef186e75cd1c0d8d70ef718d3c5c6ffd2b43cdcf77e0b6883dbc62b3acdcae79238f35def9a4d96f5a7e4fc5b34814d1ab26071e8b13ea086266347a669ba7580dc5aae067c7a91a2ff3c61bd3e5f3b9c74ed3e35d0b9883086bb7174cc70db67d4cc5ec45f89675d65d778c8008f99fa48b47ef828a1535c19f4423827c617b09fa5d4d80e5a14129edd286a70bd0d802903ef333875941e3665986eeacf49dd5e78862b166afbe5ffd94fe75b9f06cbe0e4bad01d2d53d801d423d8cdf7993cb420674820ab1233385016d08656eb75c0dac95e200b900879f8adff6fb4005c4ad46b36051f06e9d9842a95bed6f0916a95095a5ebada1812018b421dfa680c19f123584bddf25fa5fcbed5a6bfd4e6c54f3c0566fd408d3f27c2d6788039c2156f5b1f4ee74b658cf2d2a558034173cebdfe5aba599670cc74449cab6485d06ebcd63a8b610fe19da3a8cd9d6f1c883068688094e6bb28f71b76e91797a31fde3ebfa44bc21b5ca873c1a293722b3cfc908422a980092ca0a0feb5d8d833d99bf4c33637f1298a4404227dac306a2c4c805a81a087bad4971c01e5bd6bb0ef91a65066a68036fc1b0490a347265889c989c9e8b4b104701a1f2ac54768c1e36398c2bc39ca7fa1d9959cbab5aa57b86e1bc38e8d4a8929c342d6cf230fba4c096dff2c5b268a9f301d9dab93010e79c54c2e00eabf8a6125bcb1d8715ccf2a0b720185bd42161c6d4292813ed30e590fd7819206016285059df073adc5712cbfdd0722ec5716959695846590ffdce589e6fe8998e3a2c8eb85cabb5a91d96fe219167476fccc107caf6461148da957456717a43c1dc7d118563ed27420aa6bb1f0f6996c34d2297f64d05efdb7e70bbbfeb368460301f705dac3297d559ddc255deee3921916fdae8aa756d5b4b3d9b84ae5b2d3213834e283db4a949c18c3dee091ad998c7ee578b53546fbb2e8ce362480dc092e4c00c8f314669bc10e4bfbd222ab58be84f5ec6004fd24219e093ae33c6b77114c53e0373d121a15e83ae600551afa9db56436b2edb455336e3ac1f5e69363580afb4baab66a75087f3e8cc592718491f6884f811c53130da0e2685d36fa59b1f6dee3402a22630d47a131cd5ce999f30f4e9f0cbc03e2ebd460554d496841164b393b1165b32895c6ce3d7bb2c3abe6902080eef9eb4ff02d73aa49524b4b14493389ad0539721ba0cd56f1ad45bd1952e2725c5617b0662b9a4e8b368cce7453dd55e81f98bde6a6c5dba7b8b5ec4fe2ebdcb34e0a65d59e974315f55d40faf27f45ed12d61ff54f93c8d6a88521d229908bf0260e1e992fb899ed42360d52abfc7b0875fd9aacd548f2bfb72425253e3b65029f822c2a6c0d1d38ed779a6c91b00e923c99ec4cdf64906dc500433294ab7fb61cdcbff0d0d828f1d99abf2322fe020bf8e5aa5a501617dfab1bb347442cd624915bfc3927b7eadd33a31ac64cb9b768433c9f32a08d92d5415b400c064e7009111892f722984580e1174bb7569eb43005fac72ee169b8951f8d47f5fafbb85345b893882a0a0c2996ea7d401c6b8b71a73fc87026ade3ab25bd9e285b4354b60aaabdd542c1c5be2ed456bf8f7ea9e2dbadb5578b78b165ebedba518784a13de4694fce952dec7f51e9f8bf42e2f36bb0fe9fdd0bcb317a9d3598acea6c91ea73ce7f67e4c81a0542133403ba182da9bce15c1578eda7b9b9877d1600c776b5097c74f0d8bac10f9def9fe1ec4bd0f9bdfca73c70318fa835995ea895e6f3051621a8a0a2d2575a9c9b302221821d6b7143fe55ccacb4f4409710346e2414ab1b88ba80374d92f788f756100d9e1128213015dba963f3e61e78c8c051b77edc29c801409231251494ec2909ec29e803c3851a66a88d5a5c433239d9b2985004d48a479c3924fdaf1f22033ad5d57153f2873284ba17dd921ec25ca7c9b65319a80051f7910284aa902c3d3ba1caf0654c3efef148d80d17fe9f1cccd2a9e18e4de97d14251c012a162e52d52b69e05500e28697222944730a862feea3133d98459b8223fa138d4e34610e08f451403fa06bae9c34e9cbe0e27f379244a3812b56198a4908172d46d36cad2a8d09655bda74b47f4bf5b32a130f0bb4ab2dcdaa913495eba56f5492e1b80046929603ee6b010013a6b34a1a6d48aacba0bcd3e44a9d79a40335ab97e5a8af463e2b6a3c185079749a20d0d499c4b8174c8a2a4ba348e2203cc84e2c997d1b01dd25c1a4a3ecb0efd406af8c19794d0513e036445b8cef784f022fbb9dbf41220b696a07d69afbe0db052978ae96520b0df6d502f22d70576d74ae0ec60b3f3f75434621417ddb87a21def0231e8c51b0cc9cd4139b5756c237d2a6e5f1a0966c2ec82fd13ae1ca0c08d325d0d4e2b1e99ebf74d0241165b808b3d2588c9dc419107381a6fd307868ca7897226680d5c8620836e32dfde8f2fa8fd26d1c8f16d6201b12c68e3996e45f2dca248e20696ef6bfd87a8c4d7e564e338c8a9e5e3ab2adbc6703e19f64cea79954cdfd05f4c78ed908ce22371a3fab3ef2f8c20a6aa766d33dd806cc6c1da6bc80fd0dc107a166173435f1722aa18c04f617f819c99b56aa40cb7948852f7f61ed3721b2b0f6ae86bcd06683501896d0f3b9359d726baf070a6018fb6a64e629e721acba93c284fcd9cd08fed2147234053e2f31bc7c76ecf61f43447945f1f1db6903135cb41cd16f3ea92c1cf424d3df62afdc0f99623dcf4d8ac1d337dce887fd205928008daf2da2dc4c6c2db0fe9dfa0f55dde60c5ae60e7a35414004d369185cb8012b0d0be020b61747b3725f5a20e9791bc6fbcd87bd0d2a664ca631cb97f771e76ddfce8e0896e589a20e9199f07ea92b5068f1f4dbb98d09c6e969b04a81434aa6ce6f68128ca96c26daafee3bf5d8c9a17b6aac9239595d447944ff71ba5273f533f36fa6749f66c5867156aa3204d84f94919de34e3ce97011d70bab075b858a089f6e343a483f4e90e7ea8283e0302f6d72d6e461b541707fe7a9fef53fcda5d876d1da82360de247912ede4e811f82d1808a46b9690a4f3c840b7d96c60b6ab730b53ba32b325dcaba60e0d157c9f1be6b565daf40dcb8c1e1488c345d804d041b5912ba38a28efde178c26816c11e63b5a8bc4ab9660576e8284b821cde8319e2ae1d80c26e272bebd95fd324084b211cfc621bd4726cb176cc176db5155376068da07e682aa3213c0ec44087ce5ee86f756d66f40f5cac1dee049b4a2e3b46f1b1e6b31f24cc5ba110555882e01c89803961876a55b28f1ecaab3aa2ac6c8d8467788e7aa6e34e9c3c07c7e0743466d08d94e929958b184360d24d146dd1c95e4b82633a7b4c2c85ea4b7a09b873620331872067dbe5ab7f1208fc043bb4a1ee32f44fec45321a1c7641fbba40cf56c153b46da715cfe113ad7111a66c8f9ed326f74ef505ebf0af49647f5ff484ce9cdd92c41171210f2cf3cec215d59741300b20749ebf61c5c94e7b7c7dbad2e61100cd35123bb82f59448a2822abbd938fa148b9c07bcf332c2bb05f4061bd86e9df49c904529ca2d5c41ee4b114064a2be71a0fc0db9ccc9c8090db768d03ca1ad8022e106de4545a5d6983d3c20b684284824024e9287e42c6452b6068a4d4f0a47259a08d4d018684b55ebe4a24c89e648dbc81d63a60634ae0deb73fe17c083d442c176987989eaa288818b8a601bce54591d3a362e368a33ca6e6d94c1ebf55238dcb2a60cd494c34c0bae32d37a9714e29d1bea3d50ccce80159d637425d0a5ba95c64d37c596676aa08219ad871844d8ad69a7491393deb666293520d9d3f7c37d12b4fb680ec8c6fa395dff09d11cde30415b8415c2f0e6caf8de40009ed404d15f16d73f628c47c47323d93a268c539c8d9b6ddba7f78b15acf56d20071067e0e648e2af0b48c62eca2d7e683fae47585bee822b9ceafc3ddec2ebd771ccdde4a9d6b660ce42ab636eaeaf645e61ece7e762a43135f18b26ad0c00c4012ba24c7324e4585cf98382a8d3333970cc999cae9d3670f4380a604baf99b9c5d70ca06f1075e0dd6fb901164a9bf44cf92e7a0d6e121d00686c0dca027faa6bf99420e2a622e748af06cfc07a70d05c6e2df217a98483b061b6747e37a468074a9bc92c95f89d019c332a86a687d04a1e181ec91653762d6cca1825e3fdab6d0e8400fc6264ab8236eb2ca09a71942925b44a5196f54e5ceb9f0b075a39e23926b4cb109cb4a46ca682ab7c7692ec100fd6c11444b9a2795faf2c838ed80e3d93c5f5c9e6eefda77881bf84ae55105ef2fe00e28cdf6f3b1744e8c7752cc8bf15b430d9d3a04cbb9c2c4cf928efeaa2055ec5e3c37fbd0ac2c3fba290de0d0872fbdb0107e216a2f5e8e6205681228ae8557550de02a6b76c28cdc2198c4e2ceb4a2ed8b050b995227e13afe76c5acbeff0e40cf247f7047388d3b1e91cbbd87663e456685c33916c8c24bf3814467f4adbd98daa50633c3daf83b83efcbf877dbcb99fe2593854bc68c253f2d15c9f787d0797d8b736695dc2fc95526bec0d05720b8d3ef1d5bb709740deb4e1a0a01289350228087cc0e76cb3c4303e5f8535a1afe60b309a83c3c110337b3843ebacb462d620f3202f4b6a57342e9e906cd13b800d380f5dc8f98cd72cb07b26ef368ad09700aa31ac17e1ba290c25dd3d0a07064fb2e54a98197a1144f29427a6693eabafb6ef3c7afe9ec80016f5ff313951c7030935efb25ce306f83e9ca2de1788f4b2458e954b675819a49055400601cc6cf81756bb62962af0d0c9229b48ccc58665acd36625451da580e3bdc83210d97df402a7a1dd6d3c0a5c1e56edbdb4c904de41220555a9c22eb9a91815bd3b6ac432916e666022be718695a9f7019a2476eb92da7e3feeedbf40ffe7782c2de9c13c4695e095e5d5e19dbb8d1a51676ad84722558c94467dc15a73ea51621e21b071f7400ae4c422e868268f49362660692cbebb7d1a253830d8fba7660be6cfac9cf81923611da0dbf69717b88245c98db8ce4ea8cde5591372b22506ba839e7504e184f707aa292ffe1e25bede5646d95d0ec3771302b981b5867908f276ec2cdfa408df6a96c73a4368579ebe353ebb45cd09392e510cc7e8cd0d62288368302c1160a2c8b81c0bb33b80c3c26e97087ebad8f2834ecf0204fa503cd97220364e8b4055136aca315e5b50093538e3081e6085b7f6af582d86631a1e4214ce2c98c45fd0f4b6f63efdc148dbffec40d36df27bd2507254bce1378a196e4845915e0ca1d95423835758c21a05cf5e606c359c82e19aa89a44912c79d05be1cc30659a7c0f6c15e1f14a6bc47282ba2c1f0cf24fd81276df2337ae2c7076d2500411ad9257a4e5368bd51564af3ec47b3f9a17b8bc79abd88f07a26cf38e734037213d216bfbbd2278e4c7e23bed671502594656687e4f28406dd2161a8a59ca39dc9c82356bfaa76baf2227867b14941d852ec0f68f49a8976df0fcbd7c4a1194e4ed3b0ef5538bf11f4881246376aebaf255ebe29041f03ce95ece2b4e878f0df75e3923e06d826bdf80e6fb2b5893c64e797208b8123df3dbe3c818b2cfff1a143ea688920e08ce1884dbb3cdbac55eee5b70f6f23e916538c48c2f3a6ee60d0c16df12011f6821169a5d2642ec2fc361cc072b0b8cd82a04d7cb011297bb6ce54357a10dcc3b27ed9ecd73f84cd574572df77c2abbd2b3fb29645a802cd431f90d7f2cd7e691317cdb9e20e45f9343848f4f3416bcd2fb5f0e0bb0bb0f5cf0aec58d36c7c8e7177fd1be09cd868983132c272b8b9691c1ae86e5f07b3f1de5b40ea5dd521e42b46705cc4b57091a3781bbfbdfe1b5d60b2ca354d9fbefbddc2e3505150102850c652960408960022d5151a0eac1793b16dc73e3c7b2f3accd820f5dcbb4a699fc0c2472a783fe064891ece8bd2157a5ca08381cc658f31e558a96c05e712862baff81e19b7cd8098ee18250ebc258e565b5701df9ea115448205f98a8d9d3a8495aa6e619f34ef1e428613b254c4b75f05558ed7a6b51ef2b93149eb89e78c70982caa86123ac7292872988c36031923c14efd0855cd0e4fb94ca0123b1d888fc64b889f17a5bc60d45c481b30d2742a3ec6504a7d25c8e448c5af45eabf159ca1a48bdfe3b85b4060fccaddede25c1801be62eb04096e586a95e8a7e3ac8aade53c59a347dd5c10e459f06605ea3768a90e228ef6c1cae42884da1b0e529f510c49c0751bef13da523b74818c65735115d12427553af7c6e9152c59571325d4b5c1d49ac76132bc4ad0c6ff8c063b5aecba07bc11d1a0c7c632f350718c887095c1bc8a72372c989254e28ea01b5c00eb163a7afe78096147749cc809486a20c57f04905e08f7217e416f05fc7e91ac1011afaa0d337fcd4e176a6f271c8fac82c0643c815baab91c0a40a9f35620243cfc99e98c61661913b824e3403c61de5c33990011cfe04a8499d5c7cdad8033a0939a944042b8f462b6ae0e55149d35d5ee0212f407c9a8e6ab868768b595f38458841845f077f1a261689ca66c013f7341935697effd2b3af7abf1fce57b8b54cc15789242bf35e9a9f888883bad7464896dbfeef23abec196bdb4cb9946d9111fa172b46178527a8e0f2d8a6a6c45420737447938da7ea42a8129c322d68aaa6ed25f28ee11b8c055a09791309292f641a4434d0ef2efaefa2cf41c6be7b29a7186c9a0f35588be867b6395f55783e92a0bbc0b86d4a465770b7eb99d93b4fc37378cee5e507a280e994ce6d7499b3afbd5012127f6aa701e8502725e4e5fda11fb030d287a3b3b24cab154b8dcf1c09d416b8bd9e0973a291c2023b20f2c9efb6f8d13d63f2afb5ee59a042ab03172ba10c5d181144c4b0bfeabc6bcaea20dd3d87a1670244f79957486e3ebaefc3af4e15eab83e468419a789cbe2189c18a493637f029becac0b6c10f53b7e68a32c158c0f5e4df4c1e3805083374cb55e51edfcc7e625c058fda6ab4bb5cec0e49f70f648c67fbbfcb4a5a2060c720bc852fa90cb46443483974b92641f99f10f461da7e63871c3c1106d7e0cf18e68bc0323d38c20e5adc98da28a8ee26f321ff01ba7003cf9e842596b7457b7cc9500aee96fa84b180035826515c0c718cb0fb40961b4612bd461c2ca83d49453763798569edddd4d12ea8bd93be05c5f104f3930d41ffc8226861922f4b9a8759db680e023ec6f26f18ef970dd7dbc953b8ca992791d4fea6ec5187437f960c270b3aa239c3adefe08e85cf5a6318d4b195e6177c50ac8df605608b09d3b8646fd56509e8fbce2c88a016eb077cf03c55b0ef10d3b04ec769dfaa5f69d41f5ab6acca7f6982df66cc0cf4f7b57b61009aa714815986123021427ccbc0e6b9925b9c568c23727f8aa337b4363b74768fc7e7756f92aa2bd79e7e20dafc90607a11618cdd908752c2ae29d052a60c3ff95e68ab0caeb5ec4f64709001d746750571573466035eb39dec3ce445d73cf87ed2f3cf8d9c97b49ae75090da37f99838e13477c8adf3879f72565944cf4606ca26ac95898f4d62f657a43f3017b3b7e4511ed470df8a7a4c0ffe35aa2a3d73a7e86d1f4cf681d1cd296c1d6d495d7fdfb5957bce96723d4f856f4e92cacfb5bc570700804f93f0eee46d53370f1c3ec5ff6fb5455bc0061c5322e6216596d375c827fbd1dbfd5b55b585d5830956eb22bbb5a3057907f6500417525ad34a0427407397da22ebda95578f0cb120ad73871e7ac0d8dd187ebff978b3345303f8fdae08d2253d7c0308c50423a8b216e9dce391590dd705c1ebd4cd8904a8532f462dd0907c3b5214a5f7b5ed3b8660f14944c8ef35c98e37e6feb54c526fe42d00464393b74b39dc4a313d52e061e3851cd41d84070bea280a47b710c95ba274f3969fe71a0a2c8c3591ee57cffcbb4e9560955d400a810159a838d15e0d36c4007b1a2ba58708e6dedc18dc6be25e796e8954be5805c47e4cc4af9003323cd595a471b4ec23beaf9a4413e85de62b96508f2ef3e1c4209c9e552d93dc55fa93f0a29c7bc27a66a64ca244ae58ce51ded150b3f524ef8f84d3f51c277b6575d14d8052caa2f45ae549aed92683133ec6c86ea4761244f40cb0e4aea4d5701fb82ac5ab3214634e9e6c235fbbd071d0b71fbcfc76abe9a7f3bb778f716cd3d69ed048722fa43a76e207ca71b10010c89afcce6d23f6efbc90993bf248a2c2dff5833a84ceab7ccffbd40798f44c0b1342b0fe32575d948b7100bdb719e0540f1096cba158c1d2cf64538d6385a490fce98ec3cc23ce1fdbc0773bec6af1c60a158c260473648491a35ecc32b0eb06ec875d18725f4d7935eba66054c8105bbd4cf1de17ad74fba35c004dc809cd6ba4a2cd279102d967b2512f8a70f354d59e4130f50b2bc7c39825931522adefe8b0bc2a655dddc80956e231c408ab6d09fe6229a00a7421a2adf5b4c37ecf74cb660a8e477ebaf6f48795122a4caf9fec701e3b47c684b0641ea51892d902f600b93555cd2c9ab99bb443a7e585fa633038fc4f1f1b1b9187f5948dc5d9936d8957334aa1aca065a325338be996f8333ef85ddd5c84f71a23f34489fd7cf75412263b06b7f2d9f58fb9705f0d2f590821f5e9b060625845c89a44952220e008b54e3ef7222995c4b602d5d1b5df24fdcfb6f24585a109c574bbf896eb45dbe3984ad1bcd2267e6b9dd237350e9b46db904c672776a4dab94dea8f18425139d30742b278990c740323e47554fd378443aa5fd38b4afde4223b74d06251f11f4e4ba09c24c9c110ec10cf4d570ac2d23e8d1aa623a3140bf6b29990319a59d3e903db53495907a798c4be01c77bc952478461f35a36653a8d5fd9faa338e7b32100ba62f3e39439da90d8227ecf35fd2f19b331cc76503b9218d60e94ce11bfc961ac86c3e9580b57d0d5314c0bc33b246401f6f85e0bc67814082ee34e49dd8e5869fc3917c66db67e791fbb231ac968c3353d32f7cfa163f7472bce1b3c1b0a8f0b5cf03f04046d2ab31b05742c7121e7862f76899468866a8b01726d04379726acc8a04cee04299f27032bdf3e233c5618043513e9a0ee04c817c6c0a239444480482b8587666f96b2514876b247742e9ee4c551f7d4d90c70dfd7f3af7c7cde5a4d014f74ba158730b310b3758bd77a8c0dcd55ef62e39d36e2f9acff746842042932ba39f50afcee96c7a5239ea32ef6b6bd6091e4c8e815fdd33a7b1af0dd6e80700c4cfd662f5167145baed292e3813941dc8e3f32196ccd86c6ece9d9a511e552540360c5269bff484895ac8dd753dc32558859119392d0c16879e114ad335e29aa20fe417bdb358d93b9df6e177d1e29c5aa266ecc810f91f0b69beb694f230cb960f833b1d4ff236654a04de8343b8a2f3e1d7be0538676ae729eb0387c5ea36a313b910c5e0c5536b482ccd808f42c44da298235348b3e4e5c3841e52bbf76f62e950e14f42ed327d579fc5c38992edc67cbda74993290b1a20b15d1d83e97e116ce4859e2b90ce0b7dcf631e40856944d330b9912e00875eb9124d289de611cdf9fba42e95ce671c0ecd0fd9264030b0797ad475aae86d13a2d8566dce1c6ad098d9b60099bb4b955d4e0075a074cce51cc4700da251e7fda195b77d24abac44ded2ab7a4b54642012a233de1b222954d979653c8c07129e58bf4e2c343628236d3482f532cbe643fa7cff548ce3ae19651d74a2090e4455c8c1792e7400e4d307e192ccb8dd12d2a6717c3224635dccec97411509d12cccb313b9ddce210f36ac44ebcc61477601679be24313ae77f4ea8d66a342ca3fbc09f2ac87407fa6b663d246f9b86e383573114d0ed7d86bbf917946d2f70d43e9642e5eaca8ba007de2b47d7c09e26ed6076cc0f2a71ac916fd000ba784b76346e08435dfacb723d8af8870489e4653b7c587e545728c4af49532c8fd6d2e8c6c8fcb324855a8f0d243f52becf435327fc1a6a9f465783f0d71dc59f669c590aac721ec030711036ce188f11224b28b36c48d4d2e8a7b0d8bc1c462409e61a9fc2c768e3f5589690abeeaf98ee6fc6db460a2e2e2e99ff2d02dac45d5b91b6b7591b0e16634b8ec9a47673d227b0678011310e7eb5c14ed0202e477c5633777ee950c1142b82dff5d417a5988126ed98e98666dd41c50bed6f903764cb5da0ae0d3bbdc234ef93c4715ec277afe0752be56bdd305c7aa7112c50b17d1f0d2fe5b4aa98070553dd3dc36a07b75005a0ce769f5ae91c554556b985ba3f605a10487567e7e8e3138b92cfba9481c5012b4034bcef2d10b4261b73f3eb2cf5990cf1a5eed96a3636d3f9f7c3fa3637cce1af68a8f99c1b28d5af6a1dbf58e5fa963580ea49beb6313328ee473dd0583d36954c98ec5d580e0a758248bebae0eba3e437e29054cc64b514f04346416bd7b8fc388dfd5c6c489e6277acf423c16a802e849629d030c93fb3ab2e81ea689f225407e610e7f490163bfc2a27f0b467b3a9e93b8f8880ae3273f058a3509a430e4eec03c8b281ece974b2c3a784c52a2707508f3f0b3fcaab2ead7ee63a497891f05fd36d0d9a0196e338ff2e56616f8c1f1a5aa43ce5c876effe1177955a855303cb0edeec603f9aa6d372dea6248c432271c79bc67e22e408ac9df500d5162893d3321fec8263d2a77185a511bdb3da5036dea6754b15a7091eeb8367f0390d0bf3d6d9b672892e39cd192eb34d8af3a54074630b3f6a930e69e13ab2282db9def9c67a8438e11d4c82319de7311af3ce18e5e0551423a0504fe0aaf64dc890214ff89bc9dfef897cb630c0c8735785ec2bad8d0fcc8a3cc0efcbfe9f5ac7e5368c98359f6e518ca1c9f182a359d43ce7aaa3b52d56a5d05fda721ed986f5174273c112584d594eab757190bc233d7f556607fceb2ad32ef0f099fb599c50da497fad41e6a06cad488100655d01367925f7499d9a5ffab270ce2fef2f997e8705f24522e0709940a750b7bc05b7cb1d19d307dc617eb8eca63034f994d8c45f48125bf3f05f1fe086e6efeb96ecf194a19d87fb3cb5cbb4d7b8d1123e91f930e7598344a227e6996f21f31bcc6ce57950eb5227cf0bd5bb56ae0b8eb9dc6d9da3b7eea800934cf886919eeae8d9aaa8f00d6a6d117b96c24fc0b5d2171a16eef7fb7344c80ba2b91a4ca7f12ce533a58f9a6cf36b2d2bcd7ca512edfe547f80f703e6689e58976a6eda5761c89b8317ea33c2da9b384b4576a81b8b2e5935a177f94c8b4484b72bc4bfe36018f1228198bdba715efd19e90d96ae134006623ed6c17f6d91e57d956b9340f0e178e610aed04a1cd795975557a18a7fe5260e0c0aa372da325b1dc2944173d621d1e56f18fa0530424764c6bc2a0e701cf99da61a1220e2cbed8980edf7d09a91e36c82c0a5d5fb87e3d2fadce05a8b186409e1e4eae493c58a62daf333a2c8fa4438f23db6e910472a0556a5208d4b3a3ab3f8b62150a512cabfd73bb59014aca6c3abc6818c2c7f4db6885c1958549eed54905ac2896e1c7d7df99164a06af9a291baa966fdfb9530660daae46672b8b285477e638c342f62c1b9074ecdbf2a92a1c4ea8f28118c023131b425055fa19d79615466a5f57b27be25edc79ae3f75cf7f0bc414841d8781c5c2cf4bb91cc301832efd86c605ea64f28542809889d2962338ae208ab8663c9c4a01e1effd8a62fa20048cb13f40a918a1d195cface52b1709acde67372a807700ae21a9d2248a21b09b14fc6df5b0455ce55f047825ac6f4b6c4e9f7e69d5bdeb79570d991806a1cfb98e1df20e44a31d4082f9f8c94184325fb8e6abf22714890578820fb05046b61c55001c2bb352eb94496668ea1e8f3d4ff81128355fb86f829d3921705beaf88b414e72ea46db94151f27f04a16e30f90b51bb63942f056880b811939080c868109d8f3c5a425c5e067ea53c2c0a226e2e43c8038491fc20185688a5660879038893f8035e7fe65c1ce475dd3611c0712671a960ddeca76314931c4f9c2954c973df9e9ebbcbe1d4e1368aaec578548a7f74c8a82783cbcbed9b74f0807d1328636e16d071719c4c319d8973163870a29c411f0e6634f2558eea5cb810c503f712f16b425b433fa3b15cd07c756771207a579483dd836156f46f20d66cc2cd4ed973dcaa42bc87a68dffcaaf10b552194061c676a91c09cb38431328c76e1e7c44b508af6a89df100c2aa6c27907eb7728d8d0f6c6ccebb34705300b8d7260d8e81853a96c412d03623d71cd714f5745bf6f3117ec53609048465da9a5ef6e779c89763485adde10a24d7487405b3b6a52a9d4f1d8c946878d3e2996919dfa6b25adbdbf28c534cbe369944d9ce827ea1199946c8f931ab4b0b29b4bc72b9abf2fb702c6090bca3f94b62403391d6a1e056dfac9298ab854e000a820464bba7015cb5c62d52edb28a03f839f0633c4197f6134c8cdec42885ee4631ba919b6e6a09362c6fbd5167274864a6e15925a6c78f21ed359dca3a6f2fe0efe8317f4c918a1be6b1eec8622d588ec7abbaa9e8a0398867acba51c1ffbbbc396f03f296c864551a0d02427571633186ab6395c6097a3b39e70a05b79ba6521d4b1dc55aaea4d17853a3be2ff8d4b59c75dc7cb3c2554935cdc00a2c2c4cfb1061e5a25314266afe48eacb7da596db45c7e9940b41dc0f4cd9a0196ca16f5dda7e839c588f168364b970942ede6c2114f205fb3007250c82a23bfa421c2c382f7962c1b649766e975d6e18131c004b6e1c128de7539fad5335e3ae4c9bbb417485428199649a2dc38d374f4a3715cc22c8bce5dc40d4e5cb92c49cf607036f969669128dc92f96778ec22e031e5b4962c4424a0367cf16440086669a69b9904c4eb849fcb1c3d28f547881617ec4c46f4c1efe2577b128b86d617ce2f0f34299a386c95edd7ba882d6c0ee8450f86a0a910bd387d8eb99a184e3e6834e541ce3c0d6d3c68b37d2311d308a431b5cb5bab291b311d36a67d869fa0022f201a8f98e60af57baa808b3308e69af5c005613a2120ca4af5349cddb1dea9aff804e775c13ee72b7b7cf3b95562a38496c483fda1c0d35a38135b743943b14f97a51e911d8ce65d78b25416623c2209d37dec793078be11bded716255f89f8dc8a9c297fa4ea7f6ff88d973cbe2c56bf243632f85ae6152460314156d965326052a9442d34ac54b2b68ca351ccb8ff93757bcd69838633a58bc253dc20f681cd5a2181ed5b3f8d9433d72e07f3dd3ee1ce5240d32465adc037fd3dec4d4933d1b8c0f14ee7c3140a95e1ce724146e228385c08ae128ed91deb582a355a53eb14753ad30cc90cb391ad6b496c783baa2b19aac21141e4fee30691499b74b4d41ab1b5192cb247e3ccc634c3945b3001f6cd38f8e63ff08a2a694126c58beaa652f91d8e1be3e83bea2cf905cfeac5f946ad253115839d7190f2a6b4846c43b9a00f79e05354c617d7bc14993e40d1477e61887dd7103dd86e7f4c215ed993b2d2a068528d5e1b835df4fda9664f7d1d26b9739ca9260a020c3203dbd7217daad85afbe95b4c085abc60c5b5080765c4ed41c875cfac02eb9a262762764048f8c7388e2a0bc2c8fa7b010a7cb9d150095920186742410e8fbca129673317c2a4579a1dbd7c52ae5b18e410855bd4af648458d49398eecbd24e72acad88fc0b77d276bf621f68c2f7f3d1108e5057b47bbf9a188fc2b5f4e774009e7761ef8ed0900118e0f00915c7c5cd73709719f216287ec17572e11848e2d8809d2797c3f1a97eeae6ffecfe26323add60fb272a029ed3fe06c8345f732d8d0adc106659a88797d853780a5202694fe3ca47e4aa4c6603ea2de37f12181c2abaebd91cb467c68abb0aedde416194ed22b1ff8346814805edb7c0210d0a5b8e0b7af5f87001de60d7d0fc7f931dd8ed411f7bf0b05a00658bf29d05e3b4d87aeb8074f1b72e546fe30f31732a90bc67dffeecc2d645d8a7ece89276d1067e4a732248487624fffa8ecac5275fa563dbc1d4ea15548724233eef2d96b5081f099fdf1c90e1b5916952aef5a08437e1cc7759ad400575e268a8cc8d3bbb8c676e596113352cadcb472527065cbd93b362737f11a71be494f6e97dc68bbb47622c599e0e5205c5f06f2342c1788a50b961a4bca199d1d4b5c3dfc817c0dfa4a4cdea358b22a646aee41905e1c76279658be21dec2d83afd55fb65b1d604c7ac2bd2354a80243aef52777abe9e2d3d85725e904d39aa87a15c1b66227a94b67f5e320114a30aaccf809ba8563d50fa4f13cb22c3d6c049496159e5e8b3282ba1818891b365f2b42c9a83fd1411cb06984f805551e25cb9d08f927987e42b322bd274144093d20400c92e46976e0968433d4151a367c944ce57e6ecba6f538351cb478728cefc62d802ec7c74ec550ee76a384387aac840a11ab07d987f483c715309641c3a9947fb27671dfa327d6d3b47df5fba1dc408a5e6c0a221fa433b26b8814341915ec6c6a7d56a4fa3b0afadfd531deae6cd30f98684de95e565385a7b75baa152d2bb0306ba25acc31cd87c2fd059d3cdc99ba8d5063a6ee40b3c81ee9f1e7072597e0d7419bc52a0cd96d1a4ff39950f1f48d77117066014b47a4102f6ebe272213d93d6b59ff8c574820cd452f7ebaee3a1ab807613959791f1ed76b8a7d8322e71eef62e6bed865c4300539faa457a36027df27793fa3ef67df0ff9181000a02f5af6514b19ff0bba0359d2f0e3f89cdc986f1b06ea86ee072b456a6b136ca3662f0b78611567c6adef7fcb193443435380e3605315e9ea5d4eba382624be346b61787505ecced7ad4a90a5b696dc74963ecb53b8b1b23f219aacc2c741242a7b127b58073e4d7ec55b4961188e7b3db8df60a94ab3b9a50548ffc62af3d79cff79acc6cea86fea966639638b4028b46706737a161f68ed3ca815bc765ed4836c922078e319a035a6658c1bad897927abf8e43d15bddce039e894ce9291884970ef4b633ceaaa0f749711409cfbc5fc0918228288f22cd680c95e908cfde2425ff522a03692ff988a0de80232366ba87734165a6d9a3f253a50403037c4788545e15e25fa41f48f03db58409f819e9b18a33c9a9520ab01177ebc8205ded668e8ac88d029e9f00625d99c19edab457f37765565335e21f3addde63f57c79991c81ef12891eb8055d02605cbe19363082a95aec6e1c3ab796767d62edea21225d1eeb98958baf56b5b664e97b1bca42274b4436940571bfaaaf65544aac7f2da9d102bf00dc71a4c738f909f31f7b0c28bc572d83287ecc5d373abaf5e92a76706d9d6fc8372071cda75eb5254e8a80410e9c2385cf03a1dcc21b3e890c2537af59717e9a83b0e7ce531e396b36dab599e41242482a1bd886d2dea0dcbb1d4f086c022acd4e4257206e24b7bf689dbd6f1f195c371db4677e652a4323ea37a884e35f3866444e1ccb94db253ea7d8d5f4dd6834dadfb3120a31f89b458560b97a5140eb86664df5a2ceafc3f23a8d1e2654260842c3bdd872665df793ae5eab0cbb08691de22fe225b83d4ed081df30e2dae98c1d4edfdcf283712ba1ba46320be48fddd54ccf5964e99ccee9764d68055d3c8a286e7729b8514aea38929b5236777e2e93f31c707109f0f88d218089789f6cc5cc171921c9dbe458e96b94599964a3140ec266559e784db5b3b2ea0eb13d341b98c4518aa7370b0f93db8b808a824dc97c09ac1eb8d50b3a9141a77abb8081b89cc2470ba3c613e4ddb74c218f12ef423fd3a3897738c5649d608ae4fce6a067304a05ac18c9ab35408450ced8f7f66f33e6b0bb7f9d1cf5793fef96a8d6aaffc7b136449b2826ecf2ebe6251a6d700ccc5b8641ea47871233c425b194e5bd7119789e7d34eb2540d912a9f47b0a732ec3d795022fe454b76c7cce1499d6f7fb55bbf05fb71b591baf090e32f24dce1c878f69f288f7ffe4766e9f2e9804f87c9c47558da6800070d6d9fcc021c0da1c2a5544f0096eaea8d7d110341eadbc4a4dd0e58c6f2530a6c860e2fbc9bb87d4d9a969b531d616b777eac8a23ce7210c8c63b0cdd9f9e7a0f99481c3aeb284baa781ad6e1d67708f9df4abd9831b4ff079e2730fcc88eba803fbf0d051e1d69f426f9be322cb540c55a9a4992cf85c714740f3ed680273be08afc8fa8fbc688f28cc36749eb4b3fddd1c940d2fd1fae735fb1bae9eb7b56bc803224661ff9576538359e796ec11810d357dc5cff320bfe857726890864bd3703f6833361f6c04fb86d5fb70e5a313534713512778523b033505384084c18082d5b64e368810e62ed09c2b3ca93a21d4546bed18adf09cba1c26c5dca571624af58e6bf835409a0339f748cc4dc9800daf11b510ea3207e2155a624183ce7d8478bb35565ca23daa6f16cc6f4ef679606cc553f40787868713c5932d0eb9fb2cace1e8ffa72c0090e6d4fd8100be08a8952deb60d0c89f91fd1271bd7c4b8902ecf6e09c3a52a54ab2fff4cebf4e372a547ea7aea9883b6a4e7c5bebc5bdfe50a85fa0475bf73a7b5cf32e8995fe1a55f00c47f93a78543ed404f35ff50b407abf3fa1012777968d327874b2a7d855cb030677cb8d1da2fea4f47329488725f2c0ea8628c7df95155b614178eafe26aeae77545a3288dcb805d42d28c524b601437e8eface67831fb67106f4b87a459c1917a561f7a49a1a2bdce4254e9a16bee8c34b83d9b92476823a844dcc6d8fbdf4e6d27e220f30cb8a71660e51e19aea9c46cf996e3d78c68754269fd150ba0c06bfa45967d8de314a80f92aae4d9a6dbc17b1cd20de2418a3205af3217ec8d4a9d6a0f27bb6dd32d7a53e3b6df5be28ed2c719121f96023efa6dd2aad89391d0660ff93ad12bdac4773507df5e2c6a00b5207fb0efa7498f0ac31a009b1a4aea76c43b818b1841744ee1ec05d4216a19531fac06eafd65927eb34dc440c360ef49cb791c37a7cc4e39e55f080fce67fbd50cfbc52b3b57a516856b7021f3333def9cfdd331672616bc6c77128a1cb84de7625fa2636ae83bc952c3cc6daa2e97e6de5b04512997d055ee4018f56d45001912496b58830166e4024313c71f972c2cc37320cbeec7d2925675a607c0f14f5c365c967a4174ba03b437d203ea5eb021c69793a6a6c892dea868402ea135aa3469947b7029a00861844c05f545470c4ca4d1c2074685cd98a02d139a9fdf95aeba128a2daa9dd8781e322d23951c109ac5e36aeae5905afad8f1be7b3a123da347159ec4dae71d6923b45f93f2b9faee531403e0b1274078f7e95f93dd9c80547c91920ebfe249f33b5ac20f6e78aafbf378851b317c2c9dfe03cb042f0e11320b0783f82055e01a2322d709132f9e503c80652121f4c5ab3019bdc9b02bdc00d48b3c940cbed9b13acbe6f38727b7d9956fa0817a5c9d74b52610a057de9d0713c89287049a699d4ab46586e5fd85c712d0d11f01d51696c8c49722643df9ba822898112576052b556f032cd30661815cbf66e4c43a7ea51a9a26b9bcf696912fc05c8fd704d0003864e4505800811862f00a224600b71cc14c8a02d86da204318a82410f449d6bba0eb4560bd3980e0f70ffeccbb8d6033b2eb0abc2b75efaaec61302545263dfe54d6e4864b8ce00f97df970631233c4224eb06c50caeafc452a70f1b6d10203bb4cf7fc852e5972f7752f4010aa82b3fffcc5f2e0b83aafe7ce23187d447d426e8b45c3b4645bff3b1fba6501af18248b076531e4e00df3e6251224ef906380b166c156361212cdca1c540e19787a41e32e5d423746dc245617f00421b1bd20d4811be166961eadb6d9aac975ac360de38c0b57b9eeda3ae64239e216d92b5f7509b260ddf756f5ce9b3a1d6563235bc265422533b105e91039816d49d6a30696ea2fa1d97f91dc61214553f010ff80a3e1989c998e1f108c0d7b0292206d8575ea5884a62c5a14a2e9eddde515991d0835aa336bc49bdd357b9b3651a22f67d213d39d9eb2efd0d8200efe9cbfcad4c663b6335a9ba4e1baffbab58f04c9237f9c2c0f73e15d1c47456d31369bed6fdecad58830ef75f7eb66619c29a8df907f52bc74b03d4f29f7bc3ce852e8c5ff5363eff08d3d4d2a6a0fd6529a427cbd7b3cbfa916e7c4b83487a301f54d84c5dbd54284c61ee79e0b458431436f278213fa45f8afb7dfee1dd2f68284c908c923308f4e3da98c7190292fbf26c780cadde4c30bd2f701ad4b2432a2888e7164abacebef54ac323fc6600299ee5d025e5e54ccabbcc51a1219255e0ebd6813d452b51e966cc1162979cd5e9f2ebe8a9eab1be61a4da1de9d4275c9479c36fa542999383323026f030923eb0e8742f4291decf1b72ca8dfa4456356e8df559e2052146c943fca05785d413a757c40be845ed28bfcd8e185302255b580ba67aaeec24708baf80c836be8d1d1251a45e9da8612602e155320cd7e02f46bf2fad28bec156b317b995f06698a5f5a9100a32aa84285715f818b2cedb843c2fe2dc6cae5a50ce667311c103418f04eb4da53efa976bb94d240ec4b0c69fe75e60c185ef77ebab95d9a7d2b8a2d993ca5597810c234dec0688e5d7c901f665553d43e163b13e10e97dc22afbc9212e6b6b19d8d2078498a4e46afbc34afd62449a22ca1fcab85cef09746bc5f5c461f48132e95ee0d165c9c1627e1ae9b6373aa0ed3bda7de2c19fa890d764ac506fe28df12f5fc90f77b9230ac6da5a2c642509ba12794286272c4b7eb78b85e89a8d7ff75eab954843b4e4e8618d4e69d1f9d37bef2e8ccd6711729a14a2430c0ed5d934bda4577279fc5c734c4b082ee68a40cfe213e15e402fde77d6833b0ffaaa94461d3ec37814f6f3ad3ab441370cebbf1c8caed088e2a1b4917d58177f29031dff12a70bbc053446b7956f1ffcb389ed07bb01e92d3efbaf66f9120fa2f027c17d3fcf5ca8b882de01915d971b02042f66d11eb845e9c3bd7cc6c447df57244654f62b075aef9f643fb7eeb7b1520ac696bb9e09204eb5aa7374e20309098ba2f93d99303ed69d0aad204add197dd8c7d5224873c53c20e3e04f9a325f1ec7ea7a5188dcd771aa96730c31848cc1dc04ad40d6e0ac6ffea633aa8f7e8abcf0f6d50814aa5f7ed630eb6ab16c88dbe4b628b038194e88b071ff8e8b347028084386914c58bb373ce8f13621ccdc4d894d9c06661869a04970dd13b94cea56cfc6763ea7a0964030dcb8721dcfc5a3cb9f8abca49c8d8818ffa578ba6f8538031d63ac4c45a8a851626058ab183527d00b921b320630e50498d50a5da6d0b83b40b70eb8f35456f6bd01aa3afc078f8074f988fd6285f6a5ac8867e85b88ca2b54db6e5c929899fe836721e2c7a22a22f1ccbef0046cae01800b4fd803041be7601d8176359b6ced37a27610dc337a6548a4cb9055a6c1ad0a86353f990001edca34c8c7f2e980dd3d4a7880a30aa77f2db3e0345c17a8f9e139ffff46ba802031afee31f1b68b4e043c1938d5384bb68a1ed7057a7209115a122c7247bdc7f5de31a01ab19ecb29f006a3d03aafe5f1470f20e7c6de66c1fb2687bc1ef7a7aca397b71dbea870b4891c7458ae05e3e2b09d377644bf58b0543236e9f8329812c908e23b7e408aac3a34f43f2d7a81c57987947fb025b683732aec33ac4fd254249fde6d9752e9eba578f95929c2d648d8cb626ad75b8706f70e5516fec7ef8519781f2470d0e8beb4e7dfbfecaa9260611d199b3f37ad5f36489dee75e73a626152cb6946095d2e745eb1d5b5a6ff67e2d69083d8a489e56efe741a0fcb2fee1a7eef9396b8194e7b1a6d4da1659945fa0aabcc00afcb82b52012eeae0725a4a78f76936d5da3cbd41f22542da9cfcc324b6ef7faa8557ae1636e6f0970df6edeca6f11f25a04fd24cec0df696c79654369c086286dc2993fac24e7dff965e9a4af10bdd771810040bd5b56025737b3079e18d2c7754b99d360dbeb4924dd1cc7a01c558df1a7464f093de15120b2397ee05a611d1d51a3bae71c08ea6089fe237cbc953cc006085754eb400c1ce50b5702c03e7fb3340750bcd13980db914c41fe4a8fa4cf6207d542c13b31ee087a495474f88e98867c79362a13704035a15af701725e87b341f9ca6bb6dbe38f7fd2f04201c1f122e4803f1cf3244b6569c1a2f207a9442226517c0837d280b384745113c3b59a531a809d21ba715322e97d9ea74d8db3aababe0a8a217dc680c2b9d72d4bf5614cfb9da81f9154209cc9dc4c31a725dcb5ed85b0d573c9b2fefe7db63e715936edf082b75b45e1e04a8b34e7bd0e9b395aa5dea7c163b455c3dfa9f9ae13f80f8496d543f581238ce5ba7969422188b3600d82a1c4da4575e20aadbfe49a2d6a5a13012f112d89a28afeed61e339799a67e12c6f22cef946d1dd9ee220c7987887949da7d98247b90fdd92cfab7645dfc6e5db96e7a17541b172964cacb9e867425df4451e68a3e8072d4b5b3501d650052d42664eeec237f6433c02322fb105a19bcb7d7f84c33bcc09494628fcfff28b8d8adb6949a0b65b4a8ba40f5c170dba6511142668ca8f9271d7db218d97c8b67239c3b36091e642f8b445cb3a40dfd21dca80a432231dccc56a7ae31b7a4fe9241a6c9e6f7295a03dcfe1ac242f2d7ac850b15ca74301f240b877dc930e61124629384db2e9655078ce8ad30aafb40828f81816ab6e7f5c72b3ea27cf1ec1de02abef63fe87d822270a87de1a95de274ef431a9e613938396975ae62d19643e7ebccc93fb78f49b09fbb46c5a283bbd6df14d31185fae10fbd8e42b4e4d353ca1c133fe193390fe9077023cdc215b98e0852947c1005135c793b48bbe2908135ee75c1cbf252d5e4e091cf5a0422f7f0009a5accbd0ec3da4e33506957122f0a23b3a295f4b63883205993c7f6b835fade933a11c4b74dbba6797f95701c808563a6dfd8a038873803bb064dc2027c89b751c52389f3fc89c6ca552ce0c2d54589fcb01642b9904628f1f6413fd627d5a35f81605a1fbfcfeef299898cd1b681b1a097352b0bb58e98b3b131b620719c65a1d698ca512f0469167a3c052de2c8fbe96234dfc03f5c112af7ecb0b8f6ccc3072a20b90a1501065529d3970f4f273972397476ed08e8aebb716c82cbf4ca90b646e0769fa5637a6c23bb942bf0331e9dec4210f06c6605f326e78c838faef8d524ba0612bb642ecfea64b7cac69357d3bc2b889bd1f1da0cb86fd7b70b167e4d49cc889f3b4fef68b9cd3aa1a6b0c3a81916938ec0b995449b8d1d6557475a15fc8602404c530da465e8803ffaa555bc0555dc6c630e84f95b1a4db24a95c72939c6bab721bbea22be88556603d2adc2ad99dfa52d90d30fbaf2c2d557acdb082855fbddbf2cf029980a1fb9be8c76482b3f83c924322774f4b55c6ca280dc44c88d90e9479db9236ae4da2f4b8c67d329309c6fe4b9d9b58aab3e6ad3bc76d32911aa766d13a7c4f59a730cdbc97131c4894a5965e4ff7a97682aab9074c70fa222121ca50d7e5551c94d323bc09db58e7f49ac71ddc37770b8f7a777b8714f26be20665f87c799adbc81cb1034636e8e543475102252cd6d6324f42a67d24a82750204959ac4d58024cc20c71e67ce01e577abe12ec82a3828642ca634af58be3a2e0f657ba274fb5574ca172e47179366e9a9a6929f4ad7cd733038e607f13b5da541290b7537d02c4aa9511605f7a9241598389d32dce3c60154e81787ae8c72ac576c6a290fb4560569d0c00d37e92a49711fa4fdc83eb5f1e44ad74a78bf6230508147f60ea2a0309eae5270691bb26dc9998381413663d67c10a152d330381e437a55f83b79fe4d0b18d26494c2461406f926d72e8e05c5f1fa36575f51d3fd6c13469c8f43a956668be6f746259dc5aa0e7985417ccdeab7353e2b92a8e64fe77648d7ea2050f8bbf93dfd4c0abb1fea6fbf8b4013bf514e63095d5919f13a478a4ff7139237786b8550b370c48898918f8ab45f3dd944a1372582e08eab0c3c649f572c2207aeb05e1749ceb3714bca6054196737f40c6e031e8bf3a821b25e7b0ba53546d60fc852aa9acf86059e62060785ecd325930c3a3b76ef68543c9bb52485f4b304d0872882992ba56182bd205acf2c3054ba46123bf989c7fe0397474c5e3541f42e1c3d7482fa279b692e1e8b91ea397a82c108260f427ce542111d090541946b9a13076392277c92e4ce1d7ffb51860b3cf4efcc0a79a11e30e20bfa463fffbdb37843d62b5945762e1334b8d2929a7cf24db00bd1f9298d7a800cddcd551ad84d8525f70b8cf303797a6fe1574d9f02062c52b063312b2e6b51a3a6abb05cc51abf26d858a4f84f27faf1d84f7b0f3a277410cf3d91236ab91740d21df4637926cf1628eb5c49d12843e1f8b5f2ce0d53a5af01e8008ec6ff02e53dc4fbc12b0f632d8a91f37aa79003d11257f36df5a36d61b0fdf7faed0b53c639fafb211019538d9361b45313fce3eb3e44c7c9697a296f85ddc9f666438c4a21540cea64730287c28563baad30a771cc228a36aff90465f9d1961f16ce90e602edd890aedd7cd8b59e140699763fbec2b167c43e09f8ac9bed2b346989ccd73986c5e5807598428e61f35aaa14b648e67fe5fa96a6688e363141c7b74dac0125d8dac15415938dd210c78ddf3269113a484e3e7e30830964bef11d47d40cca51d9448494c664ccfc3ee058b161bfa52e66f2f68167dc38e82f82cbbe644509d6f9918feeb34934cf7d88d90cf4c77242ae8d533033b63d3d47da3558407c64deff59cff12bf42888925af0fc3412397dfd586b94c331c9ceab7ef1538db3c10e04fea0df4d402caa7228c5c30d049930ef92352cbb8d98365ce3e0b32b7c99db35e7b7406b287eae5be4ced27acd61c45a45106ac0c7a7e225b65f69683f7f19311a70e8028f7ae86e2178faa15b6c3eda420d962b9b2f6267e4208d972efbde5de7b6f29a59432c5070008f60822ec6fd95fbf7ddf7f34dedf927c0dfb9648fe7df2ef7b1b7c9ab28774fddcf0c5b2f5b052ebb2f256d95f9bfb3ef241d2f5e1bb1e2c5b7f4bf1c9b2c3e0e3bb4af0c3b2670c811ccbee75d963f06f1c7ff718fcfbf95ede9e57d2b7bd8413c0e0b3b35788142153ecf601b909940a9122444a4d7531bde079bca2883129e2325fad7f1443b2ec306e384197065b7f47fda28bfca1266dc6cd2386df2a7b76e9b0f5fa45f8bab4213fdb909b27ef708bd9f53b55975d7f4bbb3edc3dae27770f08e3720de3729706750dcd0bf67a892f318b2f317790b7fe569dd678b5f85576f15fd77d14e5ad38f7925af7175cfc298a5a145ff0f0318c1bea502cc350c43455431173eb92f7f5e2781c77f7012d203e9db6b53b393e8af1efee2f3eceeef3123b10f6d2afd877b0bf5b87fa6b68bed32ff1c7171f7f164318f91714c1cf39835bfcfbe2dfcf4f961dd44f8a9f37c6342401ffdd36e4dfcf3f9636e4833f8a9a8be4ce0f3ef8f9c5f173d97df805b31ec7edf3e239ef1efde4ee097ff479e9308cc16a685eb0d74b7c89e3088a3fbec47dc1b1d31aec34388ee5f7adb2fbf056c75d3fab4eecb3abecaff167c51de04da678d264d97a11c5bb5e7cd7933fc9fd12b5cbb5fbeb05e671fc198ea358761f2eba5ebbca5965a2f8f85194b3e2a07857c7c56f3d8ab2e35d3ff7e3c85defdadde7c5c79f2f96fd878f4f82e2e312fc165876bd7d5ee0383e388a8fcbeec3f18b25fe717c70f479813eafeef3aa80077cf8fc4e4f2d38f478e2f3e226502d38f47042535b2f28819fb3fe4bfebdb7cb00eb459dc1f1ee8e318935c653044397ab267cb59ec6a5c1cf5aeb7f85e35f12bf76217e7efd20b979c49defebbf0ffe8ed5a5feb1ecb9f5e25bac41707c4c6d445cda889f1f3f69236e9efc19bfde5d0658fc3e999fd32dfce3d6bba7f5e2ee79bdfe9d9a750b7ce957cd8661695ca1cb05bac02ce6075d601641171f071f97df932416aa2b5a8f1f13d515aec77bfc3c8ee3d330048dc52dfe8e6d8d4bfcf56249be2ec39f21cfab1c77c7465c0bb94a4c5465fa67e8a2b5f587c4f5ee3ed808c424c620c6baeca2f8ba145f6bb2f562d93f70f760fc7ab074fdabe4713df82329be2ec96f95e358564e96fddb3ed8082c737e16e483a5f85a3f59f288e0e3b2538e7fc43ed8682c7b0c0eee8e8578f833dcdff72ea07241950cb0786c8e27429cfebc26504e733c09c230aa8b72f8afb2bfe0afd66dfdb8bbd67af717fcee3ebef83b36e7d7fa5bff55a67f2c5f3de1dd77eb7bb7fe96aeb270f71f1efe7c95938b61d97f2a881f1085df0791f0fb349f597cfc7e67fb0b0ec3f21e9abf8f77474102f8b7e62ff9b1bfbbc3be862eeea6e9d156e88f4d7cfc1a2620fc3ef879660cce9027ffc5a18bf1f1ee2bd0dc041bde821f1e3e7e5d76cdf5f78eeb70dbbcbea7f5e1bf76f82dfd3b1697e1e7b2b74620fff5367cfdbabceffaf15b657fc15b4f4312f4df6df3fafbf8c7d2e6f5e18fdfcadbe6b54598f95ff95f9ff72bfcf0cbfee2f6d67322504e76fcae9d22890effba203fdc3de4bf764fcd8f302e1f378ccbc9d7353fc7a7214fcd9e28360ccbc1c73fee3eabec7e6c5fd8866139cd6370ef549ab2c7e0777cfd5997fa69c863416d02deb297841e7e876139cdee33e0f7c190c5f7b7ac7c862e2cbf248cfbeed6eef86158bd3b0ccb710dffde7bef95fcdf1f719e8f87afcbef471bb2f85edffad6775527c5b73eb74620bfa55dd5453eb9533ce91f5f2cc1d68b9fa26cedae39b6c00fb711bfe77eebc57dbff577dffddaf37bcac3ddf37dfe2fff8e1dcb0ee34e123c1efe4ed53f43fd3b957eae31d1e0f9f58f252efb0b9b177f569d142feed7db94b3e2bc76eff8387e8a72569cf1776cab3481729ac765873d17ee1efdf9f3cf90478b50f33d2e5b4fd2bc6b6c3dfed6e3ff76f835654f6bdf2a7be99f7a8b3f96aea729c9b27257d9613b2cf3e70aeab2e76fc10f6f7d986d5e2ffeebc3d2f5b81cbfa5cbfe82eb7f95e363d79e55a63f7cb1ec19b76e3dd92a27ff3a8c4b963d06cf36e3f7e0d73fee144fda8607bffef1f50ef7acb2717718978bbbc7e0598629fff2fee8df9e814e82fe82cfd956cef0624a7faee005874161bca6ba5ac82ba0dc84f93489cfd045c7e7ee28cf356c5143c0d5863c97f718bcb3b75e3aefbdb8bee575f718f0c97f2aa539bae76ef53a6fb320feb98517e87eeb3812b83367ce98e15b0d5d7067ce9c79a2fb99224512ed13e3f7bdc721cfc6f1e70ee4586c250cdf8e110b43a8dfd5ce2b7bc731cf16dccafa75c3fc62197fd29cf9d3957366bd210bfa210bef6f6438a5f77d9fd7cdf87296ee399f6373eaa4967e39e7cf9bb54ee1bed2ba141e0bfa050cacce8b1d999d5e92eeb3667fc7e21d8b711611d8fe7ee7bee31e7fc7755dc7ed7dabac5e1a101983e118f02bb73deef9c1fcde831904c1bcb90d533239f3d5c1ff8d0ce77e3962ea7b5f529ea99da113dd9f0597dbd72ffcf6be6531e7ee7efbeefdb75324d15e0d79bcafdfd790c547bdbd6ffd7963b544dd30c2ed7f6fc75b756ec5b91f3ad15df3cb82cbefdf7fd5158f628280ff521cb2a0299ef453efb9efdfe7dd7dfe1af27c6fed4f9ef3083fb9a4fcdb7796dd54611f97de5461ffab11798e56ec951f7eafcd35e400f7db8e61d3013adb9eceb62d04ceb817ba331adbd7e82e07ee8cdb3580c6d9f675b653f5165ea0be7d1c86f0c32bb7f5c70c6c7b4e05748bffeed4fae3eaaa0b96124a78f97275d505abc6bfeffbbea3e05416db2787c7744c6fe5eb061aeffaa7f2bcb949da036f45a82b2aa722d41593db113200823f68dac1d4c15b968244d211a83660f159b301892f80cf1a53162ec204c172fb3cb68675040ed4155de601ab93e3844443948f1ca08499d94740a57c8620f89d0a033e210158b31809c09acdc901bc6f9900ac3a4295591174907e3e9358a1c1ebf729c5b168b547e479d32b1d829c0a9afaa6a8d5d4831e666ceae491cbfe3fc8f1b6eded7d3ba70aee62304786f3a5f876f75a03af5f6178990c33e1ed6328426fc758e0f4c826cbdf1ffc1e0b413effce15ddcfefa68ea7136eb0ebf29e16a7d6ca9aa5e2d4a74af563b15ad541ade2f56918b3aa341b8bf5926f6f47c0ef732ccea962ab2b36bcbb7c8de866a5f550695e6775bcf7f87c2ffc2a6dce1a10af53c5d745c7ab34afd2e6d7a0a943952c4efdaee6a82af0ea5125aa54654cfacb5eeeb8bce17cb3add400158bab240ab9caa832aa8c6aad3db3bb6a2dd6f48caeb41a1bcccfca7352ba3bc8619067a594524a69ed513fcf09862c686179473da0df42f33955d08d7c5559576593520a03e5f3d2b7f46b7d4d89303345b245114973ea66c0ce2916299ef42b95bccf2c18581d0d4c1cfb54685784ec97bccfa9ac0c4c15b688a949ab15e754412b8de3dd55d97ca2ed7c71076d9f36a1edcfd7e966f6d6a4e40f0a4e4d8654de20805a009c68ee11300efc6a1fefd65a3b67fdbed0d086f9791d97b9236a11e0535f7beb9212573497858aeeaad8269da38eb4a6e530e48926f9ace5e0c309ddf1596b1a13d57485f7d748344159426f7cd69a9a601b3e6b370cf1cc67cd094a4e931278fe3c6b075adf1b2e769d2e4114a1caf08b175f7cf1c5ae11dff8dcf8dcc060ad97bd367cfd61b9b5f0f83874417efef06fd96ff815af78c52b5e91dc793ffe2bbeabece1ebf35b71a748a2f5dfdf7409f7f1b6191f7f7e5dda8461f83dc6c5f0fb733124772f81ebcfa1f872bdf2ee6985a5cf0d171fdff0574b6cc5c41a1a180ca65ffc2cc2b42866fd224c8b592c818f1dc06ed5d137aeef37fcfe4540032270372902598e2f6a7cf16dc1eeee37ae7de373e373a34bb8792e3ec71d70dc01175f3feb8a98ab8c71dc5f1cc3fe3596e238b65cb017cbd7c34a9e97ab04576bfbdc94e073e373f373f4e354c207609090baf9000c125130a4ee69bef97dde7fb1ff6afe83fdf7fa50782860b0d7eee9ecc768becfab81795ecddbaf81c176ffa129fb51ac660b5974350088bdbe039b1ad793d955e2cf35e70be65274b570bdb4b86dc61d82ebf38b5aebefd328be85f73010b4208acde33dec3d58b67784d78f3f772a69c5b73686431244d893a58dfdefc956cbc6ee1060dfdadd87b74010d4a106ad4d00be458a47e172ddef2dec5d01d83c291ec5a7803d8aaf05977c7b02b7df02b6ad0f27ff87872250eff564d9ef7b3b45126d3fbb78bddd3daf1f770fcddb6f952f0b800dc3f2d877b0afcd8661790de5355f63f3e75c669b6dde3561c8a27b6bc5dc7d9e8b8f7f5f63df5d1cf6e48400483da80f83fdad2b6a1ef65d5d81e2610fd615340f7b3d41783d0cdcb0320cc30f79f8b9e6bc6df2dbf0903f7e0bf2c79ffce3b7c83f8ee56c9129bee66d29a6f89bb70dcf0ae819fe7abbf55491df82ef02792c087b2b73c576afb05b92d303d7dbd205dbfdc55deffa5c53de2a733d4d09967aaa70fdbdf7f3b7b87b4e157b4e153f3c0cbf85b8c3fdc36dd9bb6e9ffc5b76fb35ad9fe1b8536b4ad793a5ebc7d6e6a179fb34aeb7aebb6d785e6fbf05f686bbfeb5b57efb2df4b6fb55652eda853c3bd645b7fb8ff71efff257e616dfebb721ec674892246cf37cafffd3613876dd06c5dfb19ef75dbebb6bf10a40002f0a60c7729f61dfeee9def3baf74280d9846fc3e37af25bb8c83da70afd3fe193df227c920cb5ebfbb0a467f80c5b2df26febdb3c990cb70dcffdf05b106e3d55907be630773fbcdbe08f657e5849fe2dc5fce21e8b71db8cdfa2b5e754d17ad7fff071dbf08c1f7e8bf1c3ffe1b7cc613996aed286faf387367af3847ff76ec1b8f55491ff6e3d5584ffc367386e1b1ef1efb710c1dd6370ef67eeaeb7bbaea43e1eb81600b59c02fe27769f3c43edc3af5871097ea2057d5e2f2e64e1bd32f96326cbedb32eb1684317e393afcbabf5e77b5f2cfb4bec2f7e497193f7c3b2933f9fd2fbfaeffd0c048323bec0f7e28fa50f099a24c9327c31244b91fc9d2a72dcc9e7eedf6f7b7bf3df274b9fd77879f2aeb9af7124499718b2f048d103431eb2f4f4f83704bdfb0f2e2fc62ec29f378451bcb86cbd2ef36bab13d318bb421721dd5cc8e37d98247f8664d903fef7e48f657ff1d92a679569ad1f7f2c56f5eee2cf6f7dac1c7ffe8ef57985a50994836f49b21cc9529c618b71e6992758431ef25b3fc3f075393e2e5dbbfbccb2c5f89aa705b8c5ffc8ca71477ed8423f7ed98873057c2cacbe965c6587c15da47e6bc9177707b938ee0e83dbddc56ffd8efd7e1c9ffc58958d2f96ae707c3d7edf23beb867958d20e82a276f95dd070471adf7adfd6c1fe6d9afb0b77ff3d3bcb5bbbf7e862eec868d9f6f8945f169ece7dd7d4017e2df1fcb0ef271246d5cdf433ef8ae0d3e09da11fcafeca40bdce3e3b1b430c6b7dbc6f5d6c6f5e08b4f7edbc6b54598dc26fc9eef5d1f7eeffa6f770f826587613bf91b2896fd82bb47bf6bf7d090a52dfbdd3e20d720a711696cfefbe2ee35fbbeaefd0c83590b921684d9bfde5b0b92bb5f3bde6a6d77f7acf6abaddf7b1effecfa5b57c0def55d5d01721b97ebc998de1d7c91f7c9fbf6ef8e95e2b7caacefc3cad6f7d827bfb5ed936f4990dfedfde77dd3f3be0fe4e2dfb2c3e0f76e974b0cde9741ae03f3e7751c0b92b8b7de7a2b77bbb9e27ec795d8f2aeac1307bff7f1560a78c8a3f956439ecbb95957561a15a73e0e59dc5d4ba0b1b6b8d289f90dba6e7ae9baae86ad9238582c7df9ac393da94cf407a58ab1e2246584f7cf39f2d128bf659d322c036e9f6edcdeb010e575fe759a531d9d01c1bb6703af9f22040070ba3da6a9a27e68849e2ab0ade2452a8db010a65d8c316d73fc5404dc3eddeea65345e5f829fd689b137cc3107e78c56f4190d250b5c5c1324c3d75d75a4f1521932ebc807dfc9c9265a27eae1b9d32fbe266413c44d3ead96ab7de5d4aadc8ed9bafadf85e5a62a32132ad41d3b76f8734fd9f53c5b4d6dab0890d07ecac3ee530d47d420c2bd484e64c682e8b12baab32437f50ae64a858545c74eb8c12ba1b43c6f60099aaf22704cebd4fb20bf62867788c83a62f00fa1480396bbd566034497efa3e2c3a863268fab56610e478dd1d0594763c586b393e6b4e31d0a7db71b06a8a532d43412ce9329b4f02d1530affe18187a126ca0c3102658359bf4c4a9cc9eacc2b2a2ca9d28484872339d415b7c904e1f214c8784fadaeb0ffda5e667f2b3bde3e328edf5e27bb2f539535e5a0ad92056297ea0a92d36b03bc36401cdec16b047630ca550241295e1fa4599d9f1d3eae5838e2a2a4062eb30a0a91a0c3921ea28e5ca11065d6412328bc834800e07143103060806898753008dec125a626d0093402860c18333d5ff19ab164bce7acac5c252b0baf9f95accebc32c4a5061162a8502531ab79c98923567a20ddb8818959cf4c40f09e9d086043983040927890c18559cf355e73d6e1663d5b2ed972c93997bce7cbf4e5fa5fcdeafc0c4122091352419854113173c2fb27f553f483460e423821840e49ccfa37d584f78f8ad74fc2cb98282b22199c66fdab62c2fb67f5617d6182f88804f119f9867c4dcffbe7445571e8f72f89d7fe01b19ae2e34906930c42c43c31eb1ed612debd1144d1a26a1c7d890232eb1f4d09ef9f1014de3fa36fd6bf23221e15225e15af891785578f8ad75a35c2abf590f0fa1ecdeac0b480a10273038d2276cca478f7ca90f931450909ad880d66dd338ae2dd43fa711233d5448f15a0a48066dd53eade92c7a49367dd6bb23dc8d81e66aec2f0da652975544a554a56bc7ea764753e10c3d00eab281c969499d59fbd5be255c9081c08297383285a66bd63e2b5732aa207276a514d9ed821c8ac77355e79efa478eddd5417854cd7834c97d411754731de3b244bcba2599a90149515afdf392c2e0c158e0815ce0837846baae19d73aae290aa38256ec92a8b13e2f53b67c42b774464a34264abb235d9a2d0f0be51d536a75adfa478fd8d66757e928420e2ca8ea11882c0ccea2674822c4f84a961048796a659dffa86940224459c2829528647d2ac6f4abc6f4b1b13c7fbd6547b90a93dcc5c85e1156729612aa52a2525abf353e4830d8890310450971a6614e01d2f3de1610490da8f18ccfc9875cc3401deb19306a0a410664c0d4f2f9099755ce3154bf1fa1d4f91bce32864700f32380913e1a317ef18a9d2b26898d6b1901495550e3a78bf58bcde304a2e11254678edd769ea0e99ba4d5517a9ea2a552d592bcf87a82b4d48387834cdbac58a00ef36abf66bd4e2fd1ef5b0547a54e1958a2a35e1360aaf4cd6a956dfd2ac0e079ac2d080ca911aae8e6610e0dd26c1a2430a443352003364d6ad1108bc5ba410b0ac8478a981134e9c9875abf400deed926de232c8701966ea55185eab90d59253959a8ac2a5f25eab68a0f6984124f1ea814a548fb8d009b2562860cae8774a842bc008af4f6b56676e01631565c6142c4b9e661ff04ea5a8ac2816af340cafb34e87f0dac42b75e21fd0a50f2c0efd0fcc1574cae857cb3badc22b3da2463a42e480c20b3ea05003221d669dd256f03eb314304350104e8424d18264d6271677002781d561c0d0103b4431d3042dcaac8e5075ba58cc034db6d44007252a2c2fb306f0ea24c8cb1324559cfc8065563f565730c0064b99188a98c490d1325bc0c6eb7f4c74bf4696ca525d254e9f4bd2dd5271fadd6671fa36abae30e383172008c0ed635b65a9f295145c1cff8d0cffc41feb0057597103d8b9624a1192c3411e9a1ad1dd2a71fab88bee9646d3bd5671fa9d0ebad71aa77fa974af4e74af344e9f22d19dfaa03bade2f43f23fae3815ea68b71873b8ecb60e118ff0718cf2abb97a95f269e855bcbd419d17d5271fa1d0ffae3a2c318c2250d56f13b753365c4ed676f4b77676841470b3726d8d11b8b009b43125dfd9ed315504940217037393dc0c2edd7ec19d984ea8a3e3dd0fba229dda191a6965fa36e88a6e9d77b6fbd2ff2d01bef5f55d07d5a71dbbbbbb1d1545131de27c498d55a5b60e2f5733e42c18603f7f1e39fad87226d756ce84f303634a1349b678488b09ad15d43657680a51983ee1de740cf89a64c6e1455cd382fb33a2540a3667538ab999e20d079e9b43a9a2ce72ce3f28459e312e4c62cc638834ae9409ac5c849329334c37fcb1326d42cc6fc6186f70c36f47f38dddd5639c29ac5f0400c93232e124f68b3181ee460c68f8d037119b3b5c3e50993ca0b54b318d6ca6c5607f417a7deecc4fec3afb286aa66b7b45f66b6a49c091fd1d464bb41d3150f87eb83dc814f6badb5b6566b6d190a66def491befd5ced4f3a9b15cfb6b73724c1c5169230ab0c46e6e8ac56ec3138586596dfa9c2c5e75411bbd2fd43e2f52f161a9144a909026c0373b6fd2d85787d2c6475b6af9f69b8013a031acf9c397366c6fd0c3b5067dc3e21c66cdbd3e28c4a6068adb5d2244e5ff693f2265eab0eb98e96cf21b94aa08906cf338fd8c85a4a2d28b3351cae78fd3a43169562234be956e3f497f8fc0185307cfe400348159f3fa040037e8d2608d46aaaa04f2b120984eed76873b23af509233266fa319393d5117f80b2c4a866756a8d2685a7ac8e0d220a1424b4197d4c6575e6148d4675abacce17e689314dacac0ec5a2d166f43befbf1b8ab55f232aae77c755569c3e09accec51a3716a7210577a6bb63254edfa3bbe3258a24c5fb35e2f42fd375aaa28fad8cac4e6b4a852cb419fd8b846575a8d0e6749530d6ad599d398380931b6ab36d772c44bf5f238c6477c7b4bafbcdda6a384aa6db9c546e07fdceaa281f414ebe2089a186d95500bf4b96e0f7f20bb5440cbf36cceebdbbdb78ebb66ddbb6ed089023438e341d317204c99126f846f7dd3dfa3e1bdbd1e760ac8f6224e5c955121e5752d881a3058ee3b8325715679609d39531a363434537b0aa68341a8e89c5e7930b44584f3f8070909624cab84003902d4374e810ba4f2e98090aa27788d010a321484394862c0500491332316c53583b5359b49d2084bcef70f041c36a8a46a3154d2b3ea15c48b20273d4d84a641881a232909724077149708e0b02e26e50b352c1eaaa7015b4d124deeadc998ebab9c0b7ccb79cf16fc6703426161d5d86ae2e0f23311b0f9a0d8ee3381b4b16677615d82104840b423469821add50da82e078d9dffc1be9887a102511dbb66d734aaa38d3a973d231272026b015aabb64061ad45052e4860d53dbe17d357280040b8b101021ab17680ea64e8750ac88ed6e1b91100200414589a91b4ed4588a0187922942205010036048822161f49c1153fa75e3fb2cd1cdc1a9e2cc9ad414d59de550756f0d6ac464e4148099240a125e6234294ac5994955baa42c3a46f5615652c5995940baac213aab29f6378a56f86ec36297a58a33999cf04e97dad380f27184146dea870a4559422fab092afa1c7c0315138d461b9ab52548a8744cbfb4b6e10a0f4846e0d071a60a11e7a0304dbd128d46bb61e71391a329ce82c6c091103a80388281c80b1d22e21581da31cb34ed2045a94b15d2961b3bb66ddb3c281c61f8b6e50863a1728cb18131c6f85f18638c8500a938734893913b1382443686c6e98cddbf5d7ddd7bbbf954032b7e2f8dd77067d4d5f8be1c3e88703e6a463e6a44791e90e76d405aa4a00091b141a204a912244b90ab20616e92292aa09089bcf130caa954b2fe66bb51559fac94b95b8f2c281f522e6e8101da8c9428f23c3041bfc48911175ab04f555438221b903e22000cb1309563956834da0a768acfa72e49537ca776588802609c829258a1b2e50bb52163862763a807d0933913cabad124648408ea0612efab0e1a3a883acd41e940c20999b1411f04a0a01c7529b9221d1b9724281381410993991e3678c84185a288d8d1022786aae2cc2a2bac6d474cd6b67933baaeebbace46c98ca0dad4d15471e64c87912e082101942069092b288799235034688814a03cf1c18212f5c1cae2cc2e8918d8d00e29411b10514ab8909543cb41b3f8ac21a992c57b7c1f13d9c7f7713e9ed03c35c9b2037b099a5d8a3c6fa889ba0d0960a9c8063598aaa10b121cb3adc692238e5a107aa31ee3388e13e2f3494a88739c10dfa91d8e39f14d4181c6f7dd23a10f0428264bb0902300d544871098121a36a41e731b6744a3d16c701cc7711ee7388ee3a4f8ac6d4992e23bb5c34c8296c8d9fe860c132923334c154d39e24616029210aa301c61aee336900b908a33873419d976b820d9b6aeebbaae9362a3a887d1891fbe0c71a1e11a59e1291a8d3603b5e2f3a90c0dab8f869397291c8c0491b14451b844ac58000aaf8cb80d6fdbb66d58483cac265e14cf33810b2914d1524311962d94068d1a8eb82071b832d168341a6cdbb621f1f9240310be6d489c470d4a70a083c9d298210a542408172162c1082b3ca4e0d861092d5ecad019f70527442f2c1531a30895419d1852b29c47960a4c10dd2e451b96a128dc86374c0351c599474940bc190d433c6f83a2a1c95601a5902703781e71c76ddbb6d58c549c89a46ba2a3c4aa7c16d955c5e16a612acee4fd8359e33bd55b01ecbaaeeba6a470c31ee5c8b15816677641ba1b3c20dd1b44e2acdab66ddbe6930dab59c58f380e828ab04aaa00c9c191a52e4e54a1b4a316726818333b583474cc4bd0fcbe2217aa1343b187718ee3380e28a9e24c201d071aa2635c97a1a2022879a2a3589c873dcff3bcf73ccff33c2746156722754a7a29c654719c38559cb94591816f9b0f1764dfa1508d2ace44525ac23b5f9864413aa65f5a731c571403ddb69a141af0ed088fa21870962ce1575125898d20989078a274866f4f925841094cc056849d18aa1f400511c40bde21959be86d83b28109dfb6190650835a8f2540aa6c192a22074a56d061bdf07044de2b9dc3711cc711c9826744ae74184bf4e1008ac81822221b2ad265a2d1683f6a45e2f329074848fc6f90f86acc20d48113921ce0c00c9131403c0165bcd2c2cbfee69fc7061621483f9088326586c64442d19e747cdf07250388578409e873382fefd2af2129dabda1392e1b0fa3106c288204191f9a70497262e88711cfa3128d464b61d6631d35e2b356cb32e239766032a387a61a80be9401a7e018e2a08840dffef0161a9ae041fb21680832445b0a3dbe8f89ece3fb2060658b9921c61471030eb22e0e3eb82f28c000d12c5236723a8c31c6dc638c31c64ba62acea4eaaab4550cebf992ac8a337997718ecb09a55ce11b513ffc887a42872526908cb954474fc4a05b34b9a82f40469fb3b140f30304881e44486a5c258d1163c46d78f37edbb66ddb6634a8f2bc6ddb361b758a4cc9d456140119961cfd900407961c9a58f203d3b8212500412c51d28214500c4b2c11a669c78680a31f47f0b87203ab08269e8864b9524e2bbcec6ffec1ac40a3e306401ae0a2a50b0f514f2021b344d40d476e7c0a8dcb575494ab868ee997d63f33a668d972c316a11f3c8009d2013109d26fa750ae42d56472b442942d51636c808485441422f520f261c204114d946ca8c1ca17a41744241c8a66d8249e500842483b60c98e17a058c8a188235e529004161f62a8f84094d4850c57c404049516acaae83022ca1589c40f5716084a90952337f458c2e9052d5f9478729f68d08a3c6f0540322cb14456161dbc70894214c5c368cccf146afa559b3203d431fdd2ba0643a5209583966367474e7f53653a8c355ef637ff5b78f8e852e3fb54a0c2962546f4c0830a4492e021f4f148c146b76d3cb0f8e6f10d48063c43b214021a76f042840e23926c6095c4880e2a090e74bc289203092d3b66a8d1c4161e32e42e3530b7711cc7711cc7398ee3b82f6faa4c0a070815a5815ef6379eb7ff169912a44c0e2398642da105a9c6568b5205f4ff39970c8e1050542b7469e1398eeb20e77d37bbdb7122a4b057eaf255652ec2e410840c25709081c24191ac4d0a981bafb732b6ddfbdb7f7ff5360021b058b1f1e586171f665c16ce3d4dc9c139cb3915ca70ee86dbeebdfb65d0e4a11944335c2923e40c12503f8831527abec55cb8db9edb6fdbdfee5575ee6ceb806fdbb66da58f95223770c1515464b661e1db6ba02e7c1b9a6ddb86efbdf3e6b290e7cd8b30f7d65aeb9ebf5369d68b2aa359bbce5aebac77bbdbdd6ebd3349c764754537bb2a9b4dd021c8a921a6be2756530f6ea02f375f307528d5c8fbc40aa253160754214786f3a578868ee1349e81431172fb0bed814e9d1713a7be0aa5100a9ad582a943a3541cea83065743340b0572a2e29891d1a92aeb76e0ba7cabd0293a75844e71ddac6248a7341562aaf8ae383a45a7e81053e78515ce7da75b78d52faa8c063d8ae398265dd719f1beaf94bd97ff20a7e7d4cf84499f7a5e6743d7dd20997da8b4ea198b731c54cca191010400008316002028100888c482e1445213ed0314000d69a0585e4815ce629124066114032110c33008c300c400020c014831a60da32000f8766f5fc569e37ce1860b56be27b07018554a9ef36ad1b87b81902dd8f6c31186433e4ab5ad834cfc1d9d6d09cf5d60fa0cfcff8d9c2e1db5e032dd6ac732dd1673fe72b74333b4c49fdd04ab14fcbb065bd7d313e73ac9c0a8b6fb3efcf7c3f7f1a192a79e1ede62dd232cc002ea4c1b34faa935315a2a46dbd70c6776217288024a60d5ce3492e5afd5793c731bcbf368b4a71a71df7a94d0b68f4d8d56cf08d5e6291d05aef62ad45102c1e3448686402aefa37e6701dc002bebf260ef5cca1c71f6010e4e34284a0ba87a009f5ee2ac8a985b38a3f94ae14cc515e760efa898b62b56e92261dfc6f5b75b796c4989c77b88228b662bd5d8670168d1d465d0ebbaff4f04d35f85137b41e08ed67bdd58e373524c665792879578e83e57a7a086603515867b5d7ebb15f054ba8a6db1753e3de0155478c5f2a538a9abb215b4b7708ba50662c3ac20dbaf02abc7cb71fbaba3a6cc999eb33fed1374e8e91910722cd748440c6363860955c0dea69e6f9204b8bc8ca0072e878391138589b7b7de44d5321a8327a3000b17a70ef52e6b081781bed914ddddabc8992cd6c1157dbebfba2585c2b9a7eee29e840e2c5d3f031d845a21bb4930bff784f3d496111c5d19aef8f05f82c25b4fea79a1558f1d50077d1f1d131014d2cd25a4ff5177c65768b59e3b187884f2adac07606c1fc2f69d9d9cd2437e2fda1f44a29f0229b1d233b2fcee8408bbc7cd1b149d12249e601d9a4328ea809d2a917e5314bd5b924227597e2df10df63af4350c82969f6a0b89c2b107d13f0b910e8155097b1e4a9a71de3f3850a8372f3ae180152fab754af28f7b06decfe42aaee060efd5aef59e3e08a19f017ff1be01fa5d66788429544bcff8640d79efc1b10713fef60aab5eabe68402a6129bfe53063a78b228c0a8ba73023ce0930ba9d15de896828e15f4ba1b3dd7260a5791fde63eb54e24ba6e8f366556aef420a331ca300b5dfbad6a1562dd2b9e6ae543b3106deb13eedca9e8e4c4c2ae3d72623099e61a7879acec90b0b1c4602ed3258520783fb1848befb1d0fd8bdc5d9ca159b42709f71d4a1152fa448f78370c7b082c587d1428e70462f08aa029432c5fc0090cc0f7448c3fb9cb28b5c4c8056a12bdfde11746a281664e9b02ec55eb58916e00ef60bb91b79ea8dcc1fc494255949b33e8d0e19d9de975488c156571c65b4e84e570c0703a56cb7a6af1ad0ef3198ac21e15be6c36dd62927b470be64f1d5d8d6a47ee1387b01f4d2da0a4e11a40d62ee4d837aca32533e5df28cefca097df6052ef764c1e571b308cf37a030a75eac18ad651e39b583068a46265d1507889c77ff1cbedac98b1b9464e32186eb1cef04cd57eb86e37cdb4f5c187b0931832624eaa2d322811456a470c51573b77e2cf30cd7064fe03a76ca54dd133ea65c127310aaa0853f43f4a566c2f32517d11e88e63eab3164ae3ee365a3fb2435e70cf826e4d68619659a2804554914064292a230681979643f069916fce8ba6acdb82cbd60c934ed64e8b45390a5371d16f897705ea1bfff44d6839b8f3223404455150cdf3ade55707dae7d088754ce2c274c9594654918c5143f89450d1a3ec3a3d2a0bd46d340eae2cf49f680d71a55101b424a920eee23b07a1063477388d6f4aa46e72095bf93ead51a549675d078b18058876e5e5001765175630531a592c8069ad489a5474266c65967d0091355aea7b26f71d9fa19d3136944aa297665507095243171208f6e7d9ac436a506b90f9912f9f187ca5d041b7d9e8059cb4056d2c45bb5cb895a35835332cf71728e92a5daf50b25e4e7138db344e0ac187628f4d6caed0a2f9bff895af93df4e042d22c39a6d2805c24b194e786f1d2b819923121f828d83b4d7606548661793f4d9d4261b27c6f278814432b1f4c33b0929501040a3314f8d12500e82417c3abbd7d0cb01172eedcc3aa3bba4fe28e7495837cb684e2f7b44bf2bdc4823abd3ca32b0c29d4e5f3ca7045a9699e8c5d52c3ceb0489040f8138da2e1fad67c035de345dbba2335c4fcea9a395b62e095fe28e17e1785bee276d323ec46402849b74b52d58ed3b5a4b9afb8ce55349485102e482b1f0be9e972a9109700519198cffdcc9c434a1019479900b22c7112a22960dad2e6ecc3afb2568f991093987bf03e1e352c41d96bee8870836a5e4b67f0903cd6de8c01e4543d73294af13996fa782aa5b099ce7dec6e65ee4d9e5bb35a0730cf9a838de53371e0711dae30ce5d97882609cf8b43956128a43104cef711b47fdd332852e6e6744ff44177e5e2ac1b49c11804ba39247b3ce7f986cf6546ac87027c033ea128742c50a7b6ea88286fa84494982aea98cb5aa49ab63847f6356422ac22284ea42db37456976b41305efa520921625ed73588cb21aa0b1bbc2cde1326d8479a054e08d744b7d882d66f3f6c71649071197175c18900df60e7edc3fa460a453b629454c9a11c59d8a063a8c35c484d1cf1840c2d20658ee55c06851615183dabec5e09c7f0cf46e4919a873afa623dd59797db490dc6ec478a4940e00ac37c28fa9c46d07d6fba9acb5c6825c6ef7520bac313820d4976add565780e12095bcec0bd8c2bf73f5b4a104060e5d491f4f07caf17728a69332134183de20d818a4f4bb840e8d89a678ee23a49dea57cc35a8a5d2c3244e2e58a98a5e9a023097009e4bab922243199031658f76cdf28a886f55f91387f00fcfe9a9131d65c71b10ede54d6b44cf41fa486551886d36f5e07bb6351925d1319669914cc145e4e3fa84f607acb50ba3ac75525a818e560065e3b6a60727964c7ecbc3972ad25a6a2a83edeebaa4b250aa0028ef43cb03227280e7b00abeedad5630069ba25c4aba27658eb87702b8ede192007302eb2ef7e3edd04e08f97ecdee2e520b713d715162d7f8db93f612673eeb1c9102520e949da82d9721ddaf4653dfdbb531dfc7f2c228d4fe228d4091bfea6a2ca951a6d5362c66f9c1ccdcb860ed11d4f4084a4ac0a000663298cacccb3dfdf29fcdbabf4fa5fdccbac99719f12ca8a39608cbc30173d5cb0d149788d37b41641d3277a090ab0a88b965e26cbb1cbd5fb9e361b9255adf6ede5540199fa528168641684fb1ed381dcade5d3c3730918a8fbadf9f5e45e1dd9786d04d61bd6870d4cfe4d065283ceeea730e1085ea40668149e3943321332ec4a407621da1fa9549e2d59395bc3dd2160eb7345dca0738c41b88eafd99f7d9cac2a1b3830650452226d2572944aa038a8b62eaf4556c80ae9c89a72f246977e09b8efb82808ca368f8e677033e4f5a302e1571532e380eb1fde703674779b397740e7b840defd171191932ec0260ba318ef2bd0ff930007aee761f11676a54d497ca50f7eaa669d5a26e9fa7650a5ddcce88fe892efc5cdd0c0ed0a25289f7cf929f4cce6055cf21bebf2c6f8d50bef163106bf87518d1b061491816bd045489a5a09f8ac457863724b8b6b05452716683f0497db2f921ec487bb464528aa08638245e146cc18541c1507ae0495951235e178015d8186e9041cb278943fdcce4bba8db46413995113ea170089d871f04c3ee575622679e3d1cf4d39abbd902a3103b85a2833200e40f22067ca2c34f6ac990ae8dafe66ea891e06379065121df41df5f29abf94aa24a3d389140abd2a6fb1b0d7936710a0994422710e12169aaaa27b7a646b771eb623b5cd7d481253314ac9df68503bda77700426c1eccd368cc279576b53f9b890b05764cf718dc30ec474c092d062861e8a5c500b0fc3a98e4119a506dd965bf67712aa8e947505bbcf1e142c0f50c494f7f92e294fe76850b2a8e08b040afa141968d002055114175ab4d0af0372990dee1241ed2b43f74e5306f06a1397cea2e296ad34695d8a0c6bf615e99bad850bffe6e4658b856239e3c485c6435ac59e9fa466704cde5329ed11ec7de88072dfcabeda0565b96835054ba6d55d6ef95086cb9ecbb2ab9390b38837050d4af539da454087a4b79eed39e709de23fb92f7e37cf4dcf3a8188ad7ca0bca0355fdc937c57c41e6d89133ef86e735fe9bf40c060814e2b89c6386614e2eb7c7cbb08ee9bfafca2087af37d5167a9c55201102f930bcf888d3e74272bb94f54b3cb61e914c24ea708ef969bc024a90959a1b422ec8f207d6a930d710e5700f6da25409f9cc55e0432723c92c32efd970eb8b7a2440a7a6ebe958addb7f855130d812150e6a6a401815826086dbe0afb1e450995a2f85a78ba636ed7477b852f640d2887039f7aaf8e5534db96279f5c51817e6812d97b892fbc39aec7413f25437a48b99a25d777088216031e4ac63c55066854b8b0fe03ac95cc8817009bb88c869aac2957e6b3e732852b602c2d5bdc9ca12faab840b6a66f669e7ca85b2d6e5c4c5e53aa2b01009642a0b494e02c1a3543147b61bee608e729b8a74d4cc69d63bff4cf9ba606489b1fa9977dca6055e96020c1de2cb086f3a05652cf08b1391461592db95e6ebfd41cd5faee909edb89ecbb6798b09742abd319a93d62e6db7b2f953f1a35586564e6c63acddc341170511435e5795aa8cac8a0e463d06499400e9d38d06cb61e5a01cac6c57a6adc0e04116f780f063628c79c6f9f441bb321965ed8e07aec1f40e4c54a7418ce4ef4ed31a2618520045646b4f3263a8600096bb58c2faceeb8abf09820bd62bcfd514c6062d38a9d513257202558f745dcc8fd77c3f5ef244b8ec3a5b7034c226d5227f7f3881fff61dc1acafdb866b6259b3e956298116fdd72ceeae76154832fc987a10e4e96320deee18242680ce186d0d713b1a1d7e0a4d2208241c4873c516c8722af9ae0d42db350a258b2f150065a14c492b88b662313af20a01435ee398217ec038906de85d228d75d0c819755121edf3a4c86db8f05ad34e0ba58c5064d5c3d7a91a862b59b2a0786fe415fe120a5fa2f9ebef09c0d9dcd62a33c322c730c12a00aa5ff3fcd9f351168a8f6aacac6f2afefb79bc4b8e2aa875dae3ff90b91be94c5aaef5ab7ccd41aa971a35905aa525b7c0af0936ed9e5f379655006dc7f488c4bc4d7bde16d4a3e6999a4e350ceff08e63394442ca264e0e57aafc2d14f2c39a20e69c0c010e2599dfbf42f4c4f4507749301e8c03b2c6e9265cef932d1aed0b8ef0b94766f06e49a74faa12180718452c19edeb8af178481842a4abd709c87e6e4e1ba7506059f27ae998db27d8e114e4e33af1ead7c8a9bb8564af17afe70155539f942f4dfe04e091170b840b9df79c625194889f852b379a5f2be1763681017140845bea9547dce727b0223aa90e1a36d88831839a546ac73c5050ca1ad9c1590887d5d6f12a654164829eaa24a523e4221e835f2d13d4988a8f7432afaacaa3184dddaa7be09f4884acc9825d75482bbd1da79ec357619bbe779b5a4a3b940502b855a6033695942d223d3a7e68f8334c8133b8a3b3d384e1a3b0c3bb0aa9322914337d516e2ce568f7c3aea8750faa763141f094d7291543217a209202cc988ad17eef06407ea68d467aeb996c652a720cf1aa705691d53bdd50fef18b9864c992efa88510374bd05e3e6abd071372b8089b2ead0ca8916a0234db48f2ba174f42008ef744051dba441a7f403cfff5c9c53d7e20b3e10fc86a602796cdb3bf0a8f1e7590923251af79386ac30be5b730904b5900d2faa94c219d354a3d64abb20739ceab54edfb760040f7c4951e3bc430fe8af7c415703173eb46a63e61c69d38519b7957518ffc98248d31005db91090744b7458f99c469850b1a9e322784dd0b6a866fd7c141d8417f2d833759244196101d65d83ae8ec1fc1a905f692690196afc2fdd629e8a77e34e732e861bf4d9fde34e9cbae89d2c1835816568b3721a8afcb9dc1a47d631b8a0d583a208d01fe181e1d488b142d04d8859e9e9245307423bc572705fa539fc449ae631f9e25dbc0dca107e9d5349378b2ccf3acf21f2da63416d99d9f0c68205c542c7cbdbac37d49dbccc81a85e4397349184252d4c1efe636f79f163d15ce75d13c2b98890bb36d0f7a845a9dc6ffe6d36e5cf2befed34e5513964810b38524d7c1821ae33ae8f17244be22d1825a48b7d1669ecc758f998d7bdf96a6cb9496c02480308e6b04fe024289bb48cc629c83e81c4d69108f49f4ac3c9a71b13397dec1e4f44512fd4844b73a11fdfa4fb50be5900b6d49106b77f038164ef84653a19c5c0b74270d61f634a590510b1ba35852c070c3f111f9330d790edb2b06a2e67540f05ddc8aefff3d3b1291bd6e4118263e915045e9566f1ad31cc6bc8d6fab32e8a246c62cf433e4225cf6ccd10e1dad86a09bbd17bb1fe8dc67cbed8eb9085bc9e5690db52435c38c520563db2a8f1556ea63b5aceedc4ef50bc13649d509aaa697be153979657cec5409aa992055ecba8e31744ef0f6c78cb0ce9b721fbe167991434735457c61e437a664d451a868b7446114a988898e59615bb676569ecf389261f418944db42369ae9f2f89d1f002534feb09a527470f03d1b38aaae1af331c08f7a2008932d4c6a952ce51b2fff206585b76574f3a675b4e8808a9ed75ab593979fdc72f809a85dc1689f9e3cc55b065e0c584f7893cf7e0966ab96f833599d3aa6e0077919b7706cbefa95d7a0687234637ca4d4a4dde887b21e78fd417c1af858a7a8c444513f0426cc780c5160d5cb3792453afde6a5619547ca63c93155f8db5e8a38adca2f551c2d499005a5606d6504656d2484c26681c9aab203e4773216b4d53491d691d2cdd3ecc76dd5c085e4a7f261eef816d12ae07d41e24342168618242e824f08ae81addfade4cdef2a5d71c325235101aae34b5075ed826466e2e7bf3b2af8b7cf79be3b1c0999418b61c7086fe11ecb0aa80f3b3224a88745f9a00ef9e7509a5506d9e9d2d859798a78405112fc50d1b841a490edbb9bb9a9a0a6d223d269e55a60adea2bfc27d4eb6da0ed2c9262cae5cfe5f08e224e418b64b4b3ecf4a034729b3aa11abd544f2e36195fdc379d7c561219277b7611a7a2cdc764dd55f4f763dd1cf8efdfa2c84b8c5a730b8332525c05e2e48a1eca8fba0f56e9fa0bad5132d3e17e703b966fd96b4f960cbc72a9720e698c355a884f8ff169d5fe3e22aada50e32630eacb9caf835e7801e165927bc8097e220171ec58302066408dc13167242b75b8632a1bef3dc7dd122e7e320e6c616587eeebf618c82f65f52279aa69c7c7cf23e2a425f865dccf5178b03df3ed47e2682590fbabc161952690c74ed71cdc94dcf53b81e34d111ed4285834592d0e81e0620cb4f698d579279a23f36e9b85df581a142b3e5906d3d1428401e0de0275af7c14417e2cd573f9f9bd26421a04b80aca55dcdee8bfff98d7c8475730c71913e0c2eb8027e48b1917a4b9662b2881d4e35285587f48de268555a8594a016304d308b881cffeb12eae7527938223144c88d9b785f2089c78b6d1d9c0c47b261262903f9ae5b5814268647846e693d8a2398b0921eef46a9ac303f87121f47b5a1dd088f717cdddfb84427e9b147239b83bf7a470c7ae3b9fcbc58edc15d3295ad18ec9ee48d14a4dde89e85b04b3696f7ee1d63934ec58dbcd392a80cd233bd9c85b47bf3dafd2cc86a8bc040f809e5ee2cbdba454eb563d88679d9d7c6d361a9c61af9d3437510e93468cccdf28164f531a976ee6d7582c69e52b0144dad6cd7472ccbdb13ef9eb6b450485ff417af1a86aa28b4a30cc2ade4daba49e4b9360c37c9c72b99bf86562e94ffae9fffbc36413e822255a34c6253cc3838d57d95db9ef5076e8ca94719e4c4b7a05c94d7b15d347046a02452769125ba9e4b6d170a4f4b22dbfa3ed7faa0806f88b65cebb304bb90d07892ded64c8601afff6fd0f48ffb265c59dff46ae16d8a250b4c3b93842e3e3706bb752aa209315b95325b1bdfd5d67d33921c43d0e5bb73c972c5432a095c80597fb4d0b84a7c50460f0fb0f6da38a3c502eea0b8a18838074d477b2996f8f3137437179e76d422cd97f1007a61e37353ae4db253635098e5eae471260f910b9acb4a16c2177ed129fbbfae728f78665b7053b70bd90c8cc9658b65203bad064f3af22c05df1a4853ad2b1c8d1949383e47d340dba3b2fa68e5f83834638d2b14ae286daa4ba3dbcbb41c646c4ecbb563a33fee1a35d1ff388809121bd1172fe3dc908707c3726eb883c388941191bc4b990b4ae5fb186c21dd86a8f03af7a3a9e766cd14ce9443985f70b682f949ccb85c757aceb3a799874ae98709326cc1354af6c7237f6ae51b34a28e21429530b7aa67aac7eae04d490bae8bd5dec07c304fda25d2d57998907df870f2fd9e29580f8eb22a8787bc7208f3218cf62a0d08c3fb1d1647230b5657ccb500f83936ab35dd492fb875d320c8dfc6a5c6d8d910fbfd72251142164841e257dceffce8dda3063e398d405bd1e808b1ab8e342011515bbf63854f9c3078ea3f8e8428c032f7f5c3e196ff0b0a140de18bccd31c9c9a0c76b635ccc5657010119a5cbf50ddd5cab972242587d1e7ea40743cf4b0617e1db4b148f5910469966ac5ba29a98923c0c9e4ccf502e3bae6b985d1eca64a6e3fbb21c71563790006f2c95922d698a006aa0197ed3b2a7d0606aa475838adb521d56c873354639b0116581e5a1691bd4bbf1dadb2befd27940fc0b285e5e642af43dfc265cc27c8032a3675c758a498e9e1e0c005b8ebcac27171da77190e019791134dc84fe513d9012f10d814198d44c6204d06474138772841082f0b45282a678e1ed794832a18ca1b241b9dd2daa00510557e13831b44f5cef359679605f16e84bab66fa16e3cc6b4da31dc385766494c246e10208f7a538249f68776a207b1c7a0aeac52794ef2daa31aac14db56890851af53e935014bf843d0c172f9ede4f2e23947c222c9d3c9d7b0c4652b46eb231eb4c8b34241c3b1a1e80612a5634e7fe6033e0088204ba2c4875290758a34a529b5d9ddf519cd8518648c379300e868304810b6db4d3a6d4644180c3c47e941352e9c0fc9a227abd78e681411af88df499b3e3c954d301aa7f247bba24e6d283019b025e503a306d487b13a9e5f41f550d89a5b616a25f3f127400cd50034933adeb281a91b62fb3220da33ee5466e54c5f94b1457ebb1fffec7de951f46021f9412ec7b184e8de0a1f2ec961b6103fce66d848537fab5fd023c37786573d942d337c6124051d43d8753106369e03bf57add8c5a8272464a0f05253be3c735a444c0719c97fbb30d238ac536b212156e0af069cee49a27603205c5f55fc419aa6e7fb592f309d9d3fd583cbbd0c0686e4e9935e4c1a9fb14dcb1b1604e5ab681bc05c8737c30b5160a0562eead05f32e4ef3cced9d32dc2e665c9969b52a339b445afe037b228e2b20ccea21133e0e44926b52445d83fabea2e2afea86695d23f4a37a095d237be062801ba1d29e1e2832c38654112db75cf2a0bac99d54c75f3ce7a1da3fae907e92f2d76676f53defc0b06a853af642371c43f30700d99522450ec01f163ba088045ede3496884b0280adfe853df0b425c64b40a3dfa74c1bb02bc4238b8be8f531e93d005395fecf0980bd189854faad5df8f709945ad0d96aef0737bcc560b5c807791df508a2fb035c684218a1a87b3a8b05e779e993fc459dd875581339c763556e032ec43df012ae65fe6820c68adc9cb13fd11fce1cd75374667deaf6281f02b088fc3d2310bcbd3e156c262ed6e5dc2348ec83fcda0018ef6c6fb13deabf309e83931b7cd1271a8b706ab3040d5c29df1abc691ce3d62b80a2752f4b57f18a33a7d49646ba9e4744ace2d1ff61cfffc5b3c2cdb9afd3609e21085cb97539aa3a9b20e25c17c644b759a1780bc2da320409abb197e35f1d3473ede842fa19eefd2ee135ae4702b75ec7730b85f209583884df6a82efe1b3f5f5093de809d36ac7a596b49d5335ffa0804efebbb36eba5decb0537191edd801cc329d00e0cb4a2f2403df1a8862229e6b89d612e0a02b3ab922c7909014b5e4e49e3057eef8fe34d8747c89db93b384f53d0b96923a2781fca95f3ccc28fe5914b13b4a352676a418267a43300fb0cd40fb421b89789a9caf20a1a8b51abf691b4463d57cde2e5e354e02c6e85b08e709797f7958423bdef071fcc1b0b9b19b43bb07fb86e278043a45ad0d087da47bd1064fd6242cfe3811e21166481eddb582538cadbbdb30db61ec21c5bd84183674a5eb20945a0f298af232bc7f1be0fc2c7c8296977b2ae383d620fd5bfc13e72655a92d44ce9448ad3035727da8398963e139038d48ae55362c3e94e01f6c6b45b2628f2e1aa3dd8941d748b73ec5e8fd2a40256d0504e5a9c05eb27665ad7b45161c5f065388360c6e22ce82b937e0ac5f17e6c1ce8474689c80574834c53aa9d8910233b4c838531a23ef40334390fac3a19352b8a9265791c46caa3e48ccc03611ec8e75869a4a3e945dd1dcd583efa0348de1463153cf964154a7b3763a44e8dd821fb2aa1e0ee404b650c376460d0531502b728c9412cd4d5a08faa8e80c2ce47683d0bc039d1d364ba74a62a51a46f39fefbb7e501945af109e425a97407254ff2b81d33a7896285a78e93a1ac288bad7990b9e817dff24f3e4278bbe49179ee96acdc1ac9c2e5eb676b7cedd738ef7d3a108880744b973fee3cdde4a891938595e530fb41048b636a34dca556b91082f7e1a4cf9f77ae828e131cb69bb4d626eb40499b6d2eb598f0375e1bd43e3fca521464bda743da5261c15bb1ecc9701d1d0710daeccc1fcf63c1ea32453ab4b7c8cba526045da8122a318a2677a9ee5d355ead826bb6cae3328706e6df711fb81bee9dbbcc858352d14b2b89ded88f9dea0e55a6980021802c5153ca8227c051a745955194071229f802c28d5b02600653f9bd8a3a55f992ae98913a0fcc56fd7e3c4ceb338b4b59c16a5649ed9a9aebe523fe0b949b02c67b8f6161e92853ba3c106d0c48e1d07c2c567129213b1790a2eec792538bab8a59abd96a912673f568c4903736663c6c79de4fe14d620c3d7e8dc9984174e7212b312c90f30e6ce09cb7d16bed888a6683d65b885b96a62eb7d9c4baa2d28dec9f2953d8b9d4183b02085c3a0ee6196e6bab1224c76328828bcdd2ea5789f0de683721f8030ac25ccfb9a7476368731cc58eac3ebc08dc4d601a0334fc69d2f9e11a155454314d389ead58986d4d8ad5ec7f369d14975363ff1b2f58cd144daae9fc0d6e3e686859960a0fac10031340c68cd78349b77f628d23faec5881a97cc61cf9966b56eb17fdf4ba1909e79120f9bf2ad8542edabf7502ddfef63a63595ce0252026301b0082de2f7279de62eeabea8ec8e4171feada6d5cfd570cf6c8b3366ca096bc9dc87db76dbb5a40497c58b8583c70df0ff74ddcc576200f3fd003f6dbc70e3d0a6888ce3ae36455051ef08c068935c056875f657c20b0529084731a76ea97e8f813abaa1a75766f1405b65a058fa68fca3f1175eed13c2ba80cb370cdf98179519b340444c22ef125f2ea1e60bb361c7ad0ecddcb0d7362056a600247bdab4fba653241857e7974f76969d0d1a335a462fd5f7097a03392a9d80cab01069c2a5a01a43ce4a10af372f583c4c4e8e1ccd005953924aaa5d54b5265290ded2c551ef4321b75fca3d20c537364584cd29f1a54d02bd614baf8caa90d3911ee633cb177e8f2e0dc3e82798013c57fed7793a0674294b56d1867b142c5130ca7bf49541cd02202e6b4027be1c4c51d9eba4b8833555b6b71f2a6b69a0f79eab6dc8800d9420eaadf884ba26ecd7aaf210f1fe2fa8d9ab26f63dad2f6e3938838b37e21c88adda57ee288de3bd7cccbcadf3f0912cf7b6a38c2bc6c83d0e1c0c392dd0d2619e0bc1ff91d2d73846023a0ccb8ae6c567b2b7df107205834935bc7a9632c84b331965f54573d6dbc9f51415ca65ac1fe198ea2e1ad91ec5214b4cba92997bfed4b045783a6acd9bb19b94fa8b75d5b5b8979886e775a2076a6176985c2fb87b2c1d94cb955ba1954b47a78b55dc9fed8ed05ec519e972b5daf77c7f9c56f37d2e8957c50dbf87bc31cc26a9d83d3b3d443b66c68cbcad9ef1fbaa365e8f4c472843e6038fa2b244251a78203dba834a71a37188815cc54cb92be5f59a3e21a89dcff42855ae977cfc16a9c7624e0d3fc3c90e83efbac792aec796c217d2395a2a9af94ab31e8cb9d18d4bd2eb4207c9d38c43dbf863c87d5d6d64e40b51aef8b21ae705c8c9b08898aa230b42c252a815b03a46ca8851a063ea6182a1a3cfefd9a814b76588c253a288439c711995326a0e5c8fd5a532e25551b12781ef5076ac342acc33da3f7fa062fd513034982b7be6cb0b047c3551451e76b903a9a207544de271ed929cff3fef25373d41b24500d19a7ad925e0bbced14486e886aa92e6841e040846cf973ccbcb3a5e787b8cf62c6d20f592a21dddd56c12020dad7c9c30fe4778519c4cb52edc38ebbc39df2d801370e67bd617af8bdc91a4fca0deb8a873ebb6ddff7cc299575d3b17c771b101870cbcf691cf5dc08ffc09ddc049752ff83159eeecef0e6bd300b94a1f4beeb2c9cbdfb8a7517aace21146258342a5b03ab1399eae0adea8b5ec417b00540d73ee34af58db9af08779d5f2d6383ffb5ba3c0580af9cb7f9dc8ed5eaa2e4a15dde714be24350c685d255fc37af13a8e0724edd8c800a4ac3877863de63096f7528dd46446cc03c740e4d00b5f0a4dbe0a352095055d63955ebefa6cf242a3c83f55ce4379b5b6eec3c156a39b2aed09954f20ecb18cd778587b87d2750b2d96751091c291c5946935b3e284a5c7539fdf3a6b6e35bdaf61b979ef4e1e2feb5cf6247c196cb763717f3feea70d23ca68233e586ac7ec31d45d80a9370683c27295c14692ccc8344d4941c39e3e28888d66b0ae0bf2e546c9631d67b96c84ab95848097b671c11050ebecdcde27bd7d186f7039c7ecb1f1b53ee7e127d5b81ccc3a399ed973094d76599250e88980172b36863282642541c0a5a8eb060b08edc92a7ad12173033caea6b03e2fd77daf075a3dfd50e6eab32e18e5b54a2669502cf7d6806a450d26bfb45c23b77bd69b64aaa559c12dc5a33de8a08c6461d9a767464afa2b1cf70a12567ec7db98b8390c6d16ca4ed23fc6a18c74c4816da1d0901f9b112fe6bad093056d232636ca94dc6d6ed18c4da385c9813801cfd6342408805640326c99b7acaaee5387533eb79c78c023eda4e59c39a281dc326f86e2a3e9158c625d67a97da3f83606568d40f205735baa519a5c82040b0dde0da147fe0e933f78c93367e5d4f12144fd5a8dbb1703f11d2ba5ca330edc4ae95f650cfd6e83e3160e58c571e8c54bc6dbc7923f36e4c5ab0098cbc6c426c7752dcf2690b356d69b9249e64eeb8dc49b1d630798d82d73c7304390b7443d4ee88ceb41216cc88a28a9b7dbd98752d02c1be8cd9c55503ef240575f7c945cbdd72880a0a3c258b7c09700a580b1658236e63bd510c7988e1d0d77b343e4e6a71125cf234f9a69504817886f0189faded90df981ab2a660cfa0046f52710bec352176eec2e4c32a616ef6d0a03d2bd84c87826a213aef697ce4a787d9e435cc927759fa2a395347161fd7f215744e6ccf11adb392af499291d5a27514e2d26d1414305a9b69c89925b5eca6da3c47a49e9f4dc52227173879ec55af3834cd2944b2e329d8714c0c1d015049f1efac3f03dac6dbdd8f5128520562e278c8be7d97e3473c35f30375ada3c80c225a089a7923de0eca1a32803fef099dabca4bc534df8288b7fd0bcfac6a2f867598b9bc60d4d8a650c56041d810dea828cba9e738d05163313fd6a3d3ad54c868009bfe73ce565283821e20bf5cd7d5174471e9e663f184c7460e253f43e9b02e98a14c8802f21d198c789aaff95735558b580c7c0eca2910c8e7f794e8f6a400bcc5954161756799be18b7556989979c0437e412b42d0a1cd5eccea2689a46ee8cab46e3b6ba220ae9ed1e1a5f4dbe267283160d01df75c7a96798c807a610157e07e3b38a880534939e7f846245089bc916c1e28951f365e028562e397e24ea307de1f5f8e3d337da4280f3d99ba846bf4733e3692d0c826ffdaa4c09eede6be094269c73e5ddb39930b372952d7c4657e61e0a094c7cf86885d8decdd39f18936539d66e326fc6341eb6bd99d0f30c0f06088f87cfd903953b0e0233d4b9ed1dd0d2ccf341fcea5b7fef9a868d43a34b561e1868f7f44b8804e72009bee806890ab170effab69f14ec39df0b4d76c583511edb2718d3e295b517c6eba6ea63516bbb6540a3fe84f32494306e83660f792dc0cf50abef1bedc96cb0cb871dff81e33bad40f8e06938851575fcf7f808013a8fb48614bc6fc9d83cde719db3d99d5e161130c3362c20cc3c4178caa973e4d53c9710a99811163a769362a9b93506d87de91a3c9541921cf38e2bfbb42c71739103d470fcefae45d87aefec37a3504faf926ce2c5ef4ed30de23034b107a5af8cbe6e3dd5893a599d4c79b4d7210c9a1babd92fc0e93834aa6a5f17bcdc032fe9640dda001b884427be17389081fea34fa64a1ba7bf36d291cfe0aad1b55f5cdfcb005c275780fa211b2e982a995d2eb28beb60e2e72697f6aaf77c6e7a26a27e72f1fc7cc5eec8e4def776aafac7213520aeaa1c251b640cd2466573b280365e84cc52e81f6cca33e4b55564ee2d86fc7490ee5f217fbcc4a33883e49194673a8a70daacb2161f71161f1a3e826e58b7c6eeaea0ba58a519e1cea495182f105e8cd905d42482027565edb29065c46682191122cc2057993831bc5fb51e61704d907d3651e39887478545768b42b99f8fa58c5cdb82156ff279a14de5f2a879913ab99988ab7b54cc788cdeb83d6fb4099acb6c8d3b1b0bb4471b281fa21bc7899d0d6165c3a79a26246fd4b9bb7bca094dbb0ac789ca2073ddb57d53e2fedf94186a9217e391a9f334c24d1fdb94e3eb32e1e0295fecbd2bb5dc8b2c21e348b8271672a980eb4ac2f1b2977ee14aa0cc4ec8b260d05ac57e65552e37e79834d6a44e6db473162868029e42e552a4d04026269f262fe4328ebb1708bb7a812f9d2a66577707d43037c1d14e037e969e14934a36340d6c1b84519366793e125e85af4d97ee87ac10b375c3ecaddcd6e520ed764cc57c388322dcd6bbe4e61b697f274037d1e802a6707e3936fa48e01de6b110eeca6791680324c409808ca9d0856c094419facb73bb9029cfe1753f34c1c79557afb5929635a0fd4b2e3f6d216ac302c3d69f11afd530cd54e967dc62190a17ddc59d1f328860720d525331f263be4871cbab01aab96994e97237c81ad2b0211314f606c969a8a5584377c81f6aa9dcf815cb295b25082df9757dc8a6c700e0ea84658b824ca999fca94ec39f2c7096f22368ad625372fb6b5752ef6b9550aa52734b3d54b82ec8b5ed29f06b43d61d7330e2e83a0f3a8781ee68f1a8128f5a754fb86a9ebab9e333cadd01bb4288aa148ffe81aa58eb64cb4e9ad2b113bac3f7728a5af616a5075377b0849c4f8b713b1d1b5fce50a1a091baa71cc8c91cd6eac257c724dc79534e21d884f5f72a67088281b7acdb39c31676904390b20eda36f35543e93c8c6b24240b78e25cace0f91ed9f5b925a69d01a4bf7f0bb75a7107a927f54e2cb7b701698d639217bc40e20d23c8ffa27123ab493ceac89c6e242588e71bb520541efbf6b17d49ee68fd02415ff040348f562eb576c5cf94dd8951d48e772dbb9c86c8bed3301f38f99a4f311414a30b8eee734cfe1898337ae09976cea01ffafd661084f996d7368ec9288e171c1c4e1d2c317532170440eac04a8ce6d766b8f7cbcdf2364345f39b00ddb86410ced4b4821dec75a451ceedc09d96c95505b46e1984e09a210980ad6a2d083998beaf32c4da6f39acd3ecc555fe2ab23a604631a54e068519611b9f3423132b83cef4e890cc920b3313c29961b0eb7727442ae0af7db238f42b082b1d1565738024e8aee02a140f66c97488923920fa2fbcb49f7c69b61a71e1b18e715ee683e50ec3d9749de75ec452423aabf22f287cb1413c7c88328d781b32105238c65d16b021505027f818857046a2a4dd330531c43c3d653216002b6d30fce668ac16c217f05968d6d016a8a58ad2cb985da744b151167af2773413c5890c538cb948a29fbdcc61450428b9c90fbb784686022a76bf30b62ee129ff8b370d49856a24da48c0bc547179d93705292e413a49f41bda2292913c3a7d0a413d88a6f0029b396b66eb20c5ed0f125699a2e0bad4c6312ba51760ded4cc06672079ea47b4b9304245d527aeb5345d74d92a44ac0331348746c29200e011cba5ec2d1f7e07c4ea7dc15e8bd3f4605bcc93f808d91fec790c982f6089877fd467654bac36e0165c227aa8a6046e2f210f56ab83858949f830da32736b62eacdadd3383100c17514edc4b88f5b675d25beae47b1386266b17ee495e8f63433facaff551954093c7701b98f688628b65d28a166856f8c2f80e0b782f0312188747d787c157854dd195e6a77cf659a1b3b87ee258e68ae464c4fd23677167c65b555c0977978d8da283d02ad10d2b1dcb6ce00e3b01c05d8a6020763a427a2f6e144049a84a8093d698d0c6a2fac9af095d2282f0fb15032ebd328958a1948afe896c43b239312b34c41cb0a9a5e42532fe6133d0a6ff71cb8ee4f48432f6cfd7c8499ce30781f1d071f9859b760bfc23509519c00a978e7f00851cf36cc0e8105166769f65f367c85b33f2af6f3897126d612abc3c757946870a557468c65fcde9e3d5f01455f8dea844f4ca275b2f041f54c19d3db3e2a2b7eaaf7aa480e6220f85b58c49f3383b922745420e01ff708f4ff0e3c645fc16234db3f2943ca3048b602749dac035cabedd1609ccc228077d03afdae580f6fc69b793bc124ea95da9453c1a2a903dc86c1103027a3c0cf2d9e41f354980c8b9b38f039cebd11481cc9c883533668791407a57f0170fa717f6034244a9adfbfcf09c2ff2353f0264700aba1e9567238ced94e93a110ca62fa27c95fec0d6d40f6bcf94277ca55c362441848f2585de3ba89403f594fe391ac3a5d07521b8ddb72c33afab68d2b02f4dd284563b517b2c6c08b142ba452f8633e445ac5497305a9b19d8d9e4c3ada07092a883c0cab9366bf9543f1a2329d51da799f30ca454e824e0b4bf9a023262b7b38c8af1c00d5ebb6f470707e825a0eab740848705bb880d8c0e66c4bf7de132213d1b8d0df13f735c119b6897313d6a1b546ac79949c4cc1b17a3fb713954ec6ed7d5358fcd10922cf280edf7045126d76c6aad513aa43a031308514333a7c3ef897c22ae6b6b3f0a46599d3d46149f9f7c10ce5971ab7cf17302517107baa8fa86994ef6fc600ef477b6a57b9ceaaa59c4e2b96d2b81b0de22ee6f75499207dd5d52ca08735e3acb8d23a3fd993bd764c4ade3405131cd65f15a7f565729de2925d59cad152cecd41c2e287dcba3ac57b70e0ec2694d9cf36559412bca1cba2044e5643316ad263883db80d454496358e23c10bd8b7fc89526ead48fa23f45f8f7137f623316e8398ae7c1066e838a00689829eacca95c8eea6f1d1dc441baae8d3a0ec85c7966a76969ae8438dd7c07490a4d1b2cf9b49a840a6039e9e6f14eab94da5a9298d51680eb508520000a3884a4a0c582b6281c24394c3fa003b2733a78ddb1170da9b6cdc9855c84eec23ee0d188424064d8d71afc033b9ba3a3d73d8ce27fb14cb08c59d094a0749cdf48f87cc53ab0c808d0751a238fbe4f6ade19106144d72e6c9a62ef965b82705051b97a631c08fa563cbb31091d0522c89be2178406c671824e035182db0ff3eb9c2ad135e6aa3c3bb2c97b2f85cf17ef0f064909cedc25fb4b20afac34a754ebd42772099b0c7339da47e0c9b4d16154bcd952dd039072377c3ca7ae2167f1357d0f1281696035bafdfaae6625e7ae7941e5bb65ed4db52cdbe7fb8938750ac6d79013e0355ffebe7b7f360f84b4b023db828fedf7f92aa4cc5727569f6d685c6ec0f60c3bff502d129ae20cdd82fd6897461bfcc36cd1ee0e0341973714851da96207f9889a8d211badb9481e9a6dfa3efb904b566d74fc7db4e109cb545a8382c9e9689e4a5b834f4e6369f63f2ab941b4d8aeb764793e76cec416800570b86637f52fbc3484d1690e5ea7df1d8d86b4949b6f03a4466e17ded5c65cd58bc45e87b08ebf74a8f635283ae6f450c99d9bb21fe0b7722d9a43d62514505e51e6f64c86e559d89d7fa55fdb1a57456b9a859c658f381e1760408f10086977fc7878793209234a2bfa2ea5f932c7781dceecaa048dd3f28dfe5418c187116b25efa73b92294160b5ebc973a47c448438fa56639a41b0c8526fd0fe73035703f369f2e4338922566e547922a7965db4fd5ba3c684a1c08716aa61cd82d940de11263ebf33b080bc47ed113476c3301e4b7d18d9bde29136b0c64e9b9b942d06d9d4ab6f71deb9279fffa3ac694fc1091e12d25b512033e285d14a9e29dd045d740cb5a06bb0902bc9241bee56a79646380865e7d4525bb7816b0b31929cd339ac4dfba6e887cc06e2b3c724be8317099aa17e3132d3bf53c39c95370d602fc9596eb0a354491e589517dc8358756d3fa7fb5fe73f60896171c1b4c8155a359d8423e3a19320ab8e50c25cc190510c2752cc27f180508deabb02e79b99216605a933a3281f91a316cddb4688519d0da379dd4fddfcb40908b0fd38a860d60a6ed8066dc7cf46e4034a2d2944d158daf5be9d0bef09b05f0ba0d36ca7779fd5bc402fc7b7f6abf057b8405f93c455324109ea4751b928075fd472381c7a99883b7547e4625c0ca7a8921758000b3075c8417fe4b76e4516566a9d1cc40780dbb28cc9438bde8526c8f3e25e337a3f6a58957e5b99c4fd66ece30937ca9612af30c8873b667d6b570246f0b23f796d96d9076972745296188805a0cda098397b2f1c137efc0a45426963ba1a9b484d0ca44d4f696a65e5df7814480fe9704c0944d224481b305bb0cdc40fb9ce61bcb649e5517c5b30e9a86ed0c604353914ef1aae4577998b53a97aad748e7d49e2ed895cf0607452a671ba40bac941bb82e19e237086262cdc6e96097bd586586e755fa3f2b205d6791e4c180aef12ab7f59a088b520101e61fa81871314b47a511bdec1fd17d048c8084a8974b5fbae1d2e450d66e2f9613cc73c938bfdfb0c939ad9193606c64921697bb06efc5a7dc0d22f8c33db15508eff12556f6f3430c626ce9c3d4db410112171d51e47fdbfbc886cd7e8b7c93d7df5eff61a22b124e9bf3540d976e859d344dacbc12a8cce1e4fed599bc710fffdf97590bb1ee0594be5beab33f35d97f933a5f0c674f847128dbe41f23bf83b14b9bcdd832e2aa3ffa130baf1666e215b2843ff266a34c4e225c4b6f788d5915dbb3d6df7e8515f561f4683bbe27d216a967bdd1182a8b9aae5f9c459f8ea4dbff14c1c0065648a58247503965e69877738e4294130bf4f01df0e61b496348dbf4a50030179646ca46c3386d80cd9a3ec76d64f2186afa27c921733c3187954fd510a821694fbf27de4fc12545002fecf7f24b5e82bc37b75857c82905c80e5e9b1a98f77f6fd5e6fb3362ad28ab93d999e88cb8b2a57ca4403e56db04f4b3624ee15a698ed605d87eaca0408aef075a8731615a6e6260592eee2d8551f6f84cc67c8b1e1e8582cfd1f87a74ea3e9a53492fad84e153d80fb0755054856515b7f6d0ddb3b382688fd8861d86e11dd1b1032844f702ec28f47db1fb6059a2c14e96c682f1e2cb0b5f1b1f857182765e393107e24fd63f0ede65eb662dc46fd4e79f3cef45ffde623d136e3087fefaf52ad29b78a339eaa7bf57919e84ba21c520b83d7c3316b6bfaf44830a261230685c4a0717c816f964b79267231fb34a01d41603da6b3e7a5c4090b24a072d36e1e5a613849c042202b4a591d4cd90add1829704d8ab240bd0fbf6c2083f82235eb0896871b6e6d71e5fcc0bf44f8c5d96e4049bd6bfe01ea305478cbcf4cf636784f7315f8488a811b237d97b93bda59432a594023f0867075c072d1ee2674ea2d5abf500e78a19f26b69b2b8cd91cf91b157105b60aba605b62e1974e1b6949a159f6fc456ab85c2555b60ab0605bf5a60ebea2672544417ee10ce08bd936ff02fa980903d7b336bf4e92f8fac8dbfecf93e80a2933d3e51c6a90328eaf8e98d8459e55f6e238fec8cbf92ea3b54973f7c6df9a416a0f6cb2ffc21a54449e9a5c58ba98cd49da930b37b94d2b3cd5a7a51ea08aa3a8a2a4e474fc74f83b2371d29e7e3b4947146df063f2453cec9734e14e4c048fc26ff76721e895d28155177a51554f75f3925cac249ddea12291d11996afe9253ca89460e94a4c007072e433de44812542965bcc2cf12450dc1eaee598aaa3fccaaa683a94177d525ca3214255bb7f198091e25b4e4b4d737d892c3653c61c493d3de44c112390a683ac3282773cdbd1718008411567260d8a2f850831cfff65ee017e4c0f072831cffb619106a95e34a052c4521e5879160a158c31f5affb4cf7608faa77f6c909ed6b31a12cd4789d0c6a8fe903d757e8c578c524699e3c7e3b797c3a7f6cb1c3d3942c0377ab2bc38c74f839dc35d3af327d101f9cbccdf7a614d1512520209258468201da87a958ad3999c9b4eb78c0e14a3021c483a909c1c71e0404746645a01406474e11a7d7bb5e0480921315cd0c30f56da93924a2924a97c2ae9b350e5a48944f56f2add93eeee947a4deda654484a2aa994920a492aa712934eea990b4458a841a7525e41424784442584c468a2bdd93e379ddedcb3d65c4e22eeceeba8d8eeb5cf67a4da4072faf6c94dc79bd2ef66243aa946db254f2f5e9ed62095c92e19a9419fd2f98bdf7ad1bb885c3c8f905adc0383144627450b4ab632e14626384a6856fc0a76f4be41116ac20680d06073dbac6cc4255db80a6d8022d4d8885a832d29c21f524a95df34d218594750b7873a802a7fec4da73f1d3f3a72602f7a92488c2bf5007589c29052b3d6a20deb08724f4750f4666f1dd5ac8f4a9870fe72ebf5a194525ed785ed5e570843dd90488df4e5e4f92ddfb85e7af12f6f252389bb1f63c47120b4eee3f4a45cd7a377bcd2aa9265bbfd7a2191babc38beded6188ff8d403d41dead9a9dfac13d3cf3e95a9549cce76eb4d67e7ec9e3384a1f6738d48f8c6beafc72eccfd9881d0daf5d7e3ba44284b13acb73563752f3d103c18245d08426d19508466d580d075f4e2524745b74f822d7ca20482e2a7a9621a8d31621f5f669b61fee1d0f177538ad3523abf5f9bcee49a611e1016b613b26d87fca902144050ea8c40f45440aafda5d060f307846b0b5cfd631eff8c76516b368ce81aa959e1f5a7efefa466f5f7d1de64dfdf5ceccdf48070f34f7f79d909cb65d12d144a7afada311f08f778ecc3405e0b5caf29bd25c7c43abfc6c244b70d82295c606fbc0005f85fadb64783de069141640dd7a8b67f31c3a1eba5139f6c9074524a29a54356f8544a591097c06cc1b225cb16a49f6d22af0946916ed5c174db514a690d2f29a5748aa29ed9d61446dd6a7a130faa8197a873ce30043664054b0f6a861d1e9c64644b9688d125d8249fd96b2ae9600ca13186c6287ac0112d4e723043872a5f0451e43f3b3b3b3b14d56d02cb4f518599dd043aa5319446511aad39a791f6c28529247812c50a2e9c68e244494dec791925b8075fe6bfabe148ac3e3b329072461459d0c027053c400821a124794a29a501959ed92a57706880650a233c821d7258222bce50ea1c257a967c802cdd80071e807e9638837f0062244155b04bca2e50ba20d1854a972a5dae4cb0c8ca22d7ca60848c39e744a2d433cb549170e1f131f25106a09e59264eaa0c5058533851448d231d1c79e782c445890b13172ef27b4e27234bdcc867f6ead9818a93cfd7cc28fe830e66060c3302b680054570a891544a295bc0a467d6091424a8e0b4a00aadc90137a9f4dac1862b54c9ce0fd3880b29d26589054d413c1ce1430b66a8d2e4a293664a3db34d4c5713976ec53d6001948427090f37a104171fe40c46a2163f1e021423e0c1bb4285164f0c9083244048240798528080a704cd43ab0618c81048d1ac58da42860d5820ad20678aa0cea8c4a7a786193f3fc42574cad94350cf6c9327393d4871308a3003885a4730cd9e39e7ac01dc160c8850fa41674b08764ad0d4aa011526433d5958d1848a24488660220a5e8202113899734e2f50c06382252e909498c23c60e1f3c3fef8cc5e5be44043723a519fa794d2249fd9cb8a114a293d32e99473ce395b3eb3494c24c1948c78545cd104180eb89282218ec44c0c30543b4c75870b4f8dc187062aa30f4f9aca90a2c90cb8d881071c9a96605133d1e0d233cbe303b4fa2864785006233559ae64c122bb1a5071850a9c28028d20271c3483aada82a9c89c734e1f2cfe460723451538d050e3014456c460869452ca23788ef03902e80826473839020aade9608af880c940c82f274c4eb804c113844f10401fa59472ca939e59295384ba2943ab4fbae8a494529a44a9679649d6245c42c0b3faac093a43d0ec6186288b04c5876ed5c1749d122762031420f859b2430c6ce841874b498f11343a3832e79cf309979e591e1fa09c219880b3c80d5d84500c9a734e1fa6c1c8c61273ced9c44f4f9db30b23974c315161aac27485090b53964b4a294f52269973ce39936891318184004668145ae0f080a619dc400436b482b2700e60d028988ecc3967154858154a58154c58155c302b78306c87244600a58b2052a054844311a9170cd900c45bf46cf1d375d184a45b75305d477d7ee89473ce39736861d89c73fac060ce3989a848a97332c00826a410ed4044182960a0268a90205269c2210bf32065ca2cb2ada61e223d3198a1092a579431c50e3704694e6a7072290d291529b5948c948e70b88c9c9234b1fa22491a34bc6afe28e9de61d066008550f402172cc528557ce892a8142519a38603423e33e433fd97771aa2e326fd970e5dd01714e4362cb4424242f3b752f991ca9f9f0f29634f174918116165890bb468e584febce3dcd3ac1e255a80c1c36ee3c1cef47b4533bd5a9a2b5db8aa4dea0a00062732fbb241173e5c64426f52e58f15aaf6d4cbe88f55d5fee837e312fe58d5f9483dd47f5dddafd0a07c26d27ff350ef71a5b3ab9a16447f058a0dd1d10f37e907fd58f019f9d86fb336980f57353eec34ed0b5f3e290dcaad614ba135be7541a85952dc8673e473907c3937255dc8413640d0d10fbb499527cd63a1a591ef82db7090cfc80fbbed0b57f2b518baf8610fad51a52fbf87aa1435ab7bf9dde25ea65e7e1f75de7c6df3ba6edaf754eddb9eba679f65ee5aa6795b9d6a59e6bf7dcb37e6530c4ba5af7972d3718a5dc137e86f8fd3da17ba50353a297d4dd3b49a6d9e76653c54e563f2b379ade02ce0903c567690908f2de9d6538cca4109294be5ea12d1e0a8aeca8a142995776cb8a2ce87ffae1529439523c031d4fd42dea9feebb510797075c3f8313b4e357e40b8babf30a83535dc2e15c7dde3bce89a01fbbc01e9aa7f541085e153b1c7fc99480b127589b43869d525f2c28a9a82db68f49bd49c9a74e162317ac199c490f3020c2f30c8d91e069812e44499df9f82dbbcb035980196a51c18568a2a538472b62f8a0fda636fba766c21b2621e0eaf468aae86027940972e5d2a7df684d03e7a426c3836afe773b47f1beee38717ea0bf94fcf79bb3bb379fcd7cf4d27c39e85c88a9dfef4d9c9f31dbfb3b353c256fe7ce31142972e5d2af6352a5cdec9882e5ca308502f2afd7034d8af79353ed33f79e8566856bf3f7fc81f4e833d4283fd3d9a85eaa9fd28342be6ba60ba12cce8aeb0c6319c42b3bcf6abd02caf3e600703cd5a221a7487bcc35aa22c9c845f87a22c5116a07e5628028e66b16256959f544c8bd1acebc4195d2a7fe1267d0375e1d76e119ac5dfe4d4585190d39f7a78ca2bb799ffa7ae27271d0f763d8fff107f3abf987dfa44724e5fcc5edf03fb62f6faecebe15f8c04e65f1fb35f8ff9574c0ff9f4e5532239a7cf2e6f73a8b739996b2727dd3601cea1bf31fb42b8c668dfc31ffbedb95e5eccfe9028d90fc1de7f4894edeb11fffa21fed8532f66bf18ed9300f6fe3db0f72f663f27fb7a5c1f7f48fc62f65b3578facfb9fe944417933dfdcd89c9e857007bfa0d89d2c3fffa21f1b1afc0f5f4e937c4fffacd3909411fa74f7f9d3a872243f1f0be93b049144ff4dedddd45f174471c649dbbc7e67831f1e85d46d7de7c637997cbe8f877dfdddd7796a09594a247a9812419331a9b8708a80692a8bbaf0c1ee3e717a681240c5ba217bdc0a060c418e7082eecc4012da798456d04f14f9b4ea43d641a07b46871db11ec8d50fe3c611b8f21de1b8a035a5013db76604b64cdec309109f728a50efeb1bd2313ddd18b2ed4d0983e655317bf305e9d3107864e4324380d7dbbff88daec5a674289d18bce8bae63c7eeeeeeeeeeeeeeeeeeeeeeeef6eed81dbb3d46ef18bb638cb373efeeee6e7a799c53ba77ecd8dddddddd172653bb4fabdaddddeddf2e4d7f5c838893fca9996b91892ec451e3fcd5aa067439258cc63a9675c47a5ded3f757eb2e533ed03bd5c631d5df75b3e7f86ed51e58d3f90adfea1c57b23feda2ccf84f28adacf36b2c5332bab60d6362863504283fd25744be7e9e8ca82fa9c73ce2c75ca55832858ead50c3a18599768063b35ecdeb1d4ac6837e59c920a23536cf01abaac2e111622a8d2617589b078e261745b5d222c8cd8a2937589b050c183395c342d17435477da415d222ccca8b12e111741d4f06b5890ad4c7c9d167a47dcd9c996c61fdb1b0ec4bb70a9f179dbd13b357e41e20bb92ab634aeb323f6872de8bc494f676b7b2d34eded0497cd8eeadf0f88d7f8e9b0ac5167f79422210658640dafaac97815596c2c2361ab07258cba6a30fed41590882d0dfbb534fb0171922655ba252a8327627bb3756f56a6b4064f7589969a6a8f514daa4e2461e2040d4695488ba42a80ba445958a95ef8a3c2380144939aa3ae134048a95b20d18262d42cfec6d22cdec249e7b410fc445a14556f356b89b46052f91d8b1f015546aafc118c2ef4b05b2ddee9290a3b1d21b2eec7ff1ab6944519e9c24e4ae56f28cdda4f88f9dc6a90b134c83244d99fef4627295de8ad9dd9716dd31085162eea2e18722f4d27f10fb1549977bc1a72939e287e5c1054198bcadf646974e882c4267bb35588f9d213a2e76de67363e919e61fb7e19c6e9d8a74a1b75a595d279a6250433faa5bafaea1db711b1f729be8ad6daa61b7b8d4fdd05b95ff8713b095aeb1709ba4e8826685f2a8facba3ab8b38240e1087db5c8fa3733227ba1047cb71446f96da0db4abd37caa4625298b5ac55113911012524248088c4cf6b8cdf5fd7d60a5ebc18e6afccbc648488c52f626003972f4e4c89123478e9f9a23474f8e9f394686547f2c52951fb50bc382196157604698513df5604698911759fbd4f85ff863d581d0acdeb66ddbb69fba6d5b5376b5cdc53eb52f2f66dcc5488c1446b6cdead736d6766f7e7bb1bd7d6aff6cdf3a7a36e764a6e22cdd658cddd18bfd537ba8e2748cb1bdfe69307a777bc72946b632a15caafed9ca832b263b62adf111e6551ed755f61d781dd4a0f3f62297dca68336e74a7de18abff0555f08d20af33912139dea61de979a55c3861ef94c7fb0bd86d42c5afd3bc86de891ac353eb9448f3c458faa7fdcd2a93e1f2faf7a982f7cf9d4ab1e025c776952bb15e505899b5c0a616ae81d1424d6d09742792508fb532f08d7e905912f6382ff8a2ed988821d86dba36f27f0cf8f070827b9f2069bd5dc4e6ac7c845f6f38998aac85937d4ef0f8150e963df55fe420eb58b84aff23bd6de4e9069f0021bfcae168070955ff39a0694d043851f2ef0fc307982c4d01523466a567b7de2d3f7177e75fec627c87c21cc077636e8c2af2e758290b0f57a12b8c6aebb37c2f9cca3790ca9198fd3675fd8753e8fd327d3600b5c43ae930989da4fe9f3531d2c014be31bfd8030d8a07f7b3b4b54fce92da0c121357e354b33d4bd4cb37a790943225be9a3ff71741b0484c88a49e1ee4863ac608a087aa8a8b2c3173f1c21240b28498880062bc2e822c78df82924d0d2430c94d20023872c588aff94a225a1ba446048a97589c0681229138f3342fcd3c7f81a8e1a6b6a046b64a13e3b7928b9791b1bbc4ed83688612fe311a934667e5d6d3991c5e7fac1c4a1eb5f9bedfb35181d21b68fac499a65d993b035fb62b4f7313ffbe66bef4fa4b2176a5548c5fe44a4621eef26b7aee2baa84442429240f80ec6d1a0db2a4e3455ecbf62d8e914e309a9c1ce38ee37522735d87d844617f6522f352bbee49eeb7b77fbb491f015c3fe83ebe367d969b300911c0df317427bcc1362336d59a7dd4c27f6a673fd09c3b00cfb0c85711886611876cdb9c4d4b4b4c5c867fa4acf2c31352d6d51f9cea9b72259231d359636c22235e62827659e4c2f6c66f4e2c79a60cccc7cca3466767ed63614c7cddccccddeeccccddccccddeccceddcccccccccccecccecfccd4c4b454a5a80a965695a22a430c24f9879bb9999bbd59056ee6666ef6e68689d2b9dd639472ca3929bd2eecc2b0d329cbb44cd3b60d85e21aa535c769dd755aa7525aab18a6460d8d3be840631bcecdcddccccddeccfd5cdb99d9f9864fb62164dbd90050a835959939d654fea6e2a73a33c7df277a946a7f4c8cfc2bb0e0373f4ea4e5a8fa1ef154ffd12c678fdc2a342bdc220c348b8b388151709bebfd4d68167d7f1e7bc3efbf6375ccf72f616ffadd3f167c8675cc4f037bc37d2c4db855361c3a206bb3bbc2dec4547f16f62656778ea1faa251fdfb5b6169cae8f8db9d053362e6e72386fed64c4e14be12366905bfbe4fab15f6ff239b2ac9b8ba4fa0208dba0221e3285db8aadd4eed07e1092182b8b24744edd798a7a97f5a083afe30524aa9a44f6964d177a794524aa74b8fee2e83e8755d30bdef36ef335dd30dc5a11da1c1113aad2f29fd17942b2ff02bfdd91bd060bbaf12337982c9939099d4e69e12d8a79f583254fb85b44de77477941a3250ed5eb9bf721b1c0b1061ba8c3f2dc1673a309bda7aea6ab04783fd263ccf6d87fffc42991a7df84bba058f0f7409bbb259f1ebfa4aa131d0603fa703fb882f9949b3224c832a271d35facaccfc39bb33b8524a2939c65d9acba78b5c7777f9afb599cf5f28a5947476f56a96ec5879d3f1f5bf8448779fd1a3f06b59f02eca96b3024953761ad9caccf839766d3c3690ea4e595f34d332a0e5d2a6bce87b129311c4d0a1ea12290179104a3cd1a783a94bf4c5525be9baba445f1c7d61a42589c809700023082a44588ef882a14c00c91225b88105614c611348592405554abeb6f8c000a84bb445861a767f44b75a92ea42892d6773e2cfae85002f66204a7a41ed972b2f23e5eeee3a51cba2863001e8ef9a6c1083dad7151d7f07b344f52a6bd1e2848c2533e841871298c1c389c806486a770004537c5c5085184b39c8e121ca786203a12edba00ae0b1a078697b59c90193f224eb42063a5c453c397531c60dd4080301d0945274ede0238968a241fc18f193049222865660a488a6277e8a3822aac1154a72a424d1ee76a69c537a0e9d5697288b14527435ea1265b9a24ba7aa4b94e58b1fb2e0201ee9527589b2b8a1060552851a572bf97d083be77e41628d9f1059fb190753c61863e470f7978679798bec6ad6ee833146efce666dfae31772f426c23074370d59fff6f6e2d8a17a59d1f12ec3808de8f63b363333b3d74c05707420666666de9531cae89f51173f2d049d7f18310cc3a4d7808a7d74c73077c73e8c3162f11dc3b02fbc40a73538f663942a905dff642961f405d45088740c3b11c130f90ae01b7c03fb5953a78e02a49472625ba977cd19575ae73f646afce40dd717eeeeee15bf06f9ba3ad94de7d7b1894c8e4b744a4e31fe5ef1bb18e3e31801851863f4a07601a57677197f2158f7b7777b7b57a7b3e8d1a34777ffbe69defdafe1b5577fab15ce85e336cb3cbf90fef545a04ba38b5d3a193f1cfed59c76bab006c352a9ea410dafcad8cef02f0da6d47d53173c948412be980271fdd9a989185b86689223421939fd1cb437dd40ef31f4b7ce0eea9f265dc8423fb59f85e2a535c842b18170864e4a745b7b38077b9e220fc8c1becde9e19c18ff622ae059beb8a14b0ef615b8ae2fe6f4bdf00210404a3b39d817e31f0aa7c7984983fd0128140a8542a15050b82ea5929fa53cad41ed555ed7a0a66ddc87c2aaf6a96aa0cffc27f985a7df06298f215d4f9f3d7fa14c90f9f1dd13c2d53f7afe59778de4242723d7f27a1120e0f5fae8101d7dae614dcd0a1ad81bda2f43580cfb9a05e0909f759ed6e0f629af6b708b0d6ea8e79e8ed3ee719d41b87258dd3e6d665f74fa4d7df446fa21733f737fd94a5e47cd66a6d29d4ecdcd1d03b747c7d91baf8ed17861d7633e2eecc22eeaf9b8be3f5e180eebe02a7f848b5e912ecf6fe3540eb0c418638c31c678852028020e994b03619873ce29658c72ce39e79c734e2a93fe9cf3e79c73ce39e79c73d23989b218af06e35ecbfbacf5c2ec4d5f57d7ad56ff20585313e2a8cb9fc6044c8db5a1c0cec4117a267e6c400318c0001a9a010ca0460000a046f9f5589a88c3d3f14715642b13ca569d9fc5b6e189e25fe49f9376979ae68275aef65b5327194997372823433ff4255fda1bd61aa4ef5b809ab597a31163a8f377e3913a45a02254fe9691f906f97ba34647a7c8e347fd85d78c3b4b6ed3ffc5d08f0ff6604c3d337f3a973affa47dbed4e00cc2356ee9aec71e5b9bee99dda4ce0fbd3abfb083e637356fc276624ff5e7b5f125a75ad4ba06e7778fdbf892cfcc5fad967aea0aac7ec54bdb742e9e8f7de84b35cdc27cc9c7d81b329675faf97ec6e46c8450af0f4398cf79747dc1ebc6f5281bf5fa8dabd7bb7779f5830fac74fed763980944aa63dedea6e3723301025f31ff56b6686f3f191946ab4e692578b06a40b3b6c6991a135077082312737d831a87a9caccbbc594d6e07cb9f2199d0546494dec023a194a297dc875663989482aa994df3b5a46ee90bf5ffefb608fca6d69660c8ff651e977c89479693a9c4ffb275f4d747bd3354e39653f8592ad2a95e238d5731cc771dca75435384e95e2388ee3525c2ac5a5b8a9751eccaf525c53a9548afb58398ee3388e5371a9944ac5a954a9544aa54aa554292ec5a538effad4cba738eebbf73f81eb3a95aae35ef559a75275aa174ec5a5388efb6cd37ad3e1a206e3855d3b7f69d42c5fee61bc1a2f3654355230a9ad301d3c6f301da43e4ba9388e53715c8ae3603e5698974f795c6dd4a85123c5a5388e4ba9384e954aed731cc7714f371d8e53a5fa25f52f302a984f2e35e8af4a7d3eb8907bd5b683fbd4679c0701ae196b5cea371d9527539e56b9ef069b7bef7460da0697da71eedc39e3741b46744dbf9ff7c67fbe8c2d708ddfa5d988d2b1518392b75b4ad47e10d92ea0db02f512a9cadf98ead7f97bd3f4f70bb75f1ea897db4b2fecba7d463d858a7d7b415a08574a3f9bbf1f7c6045d543377dc4cbabf3bd4af95c6a5dfe755dd7757d3bff7a205eaf6fb9725eff002bf71937f781f6210a3545973dead7072a43793164dba88fd2c7a874dbb67ddbcc72ee47ef18ba8e2e67844c5d2232802a0f9614d6e802591ab4f1a4f3333a9c66c5b47ff5974faf6faf33ed7afa3d45c7b5719afe698300eaaf8fdbe3b4d644b71f3eebe07a8a8dda4c20525be07afa8ceed528cdebcfbcaf9c777a218c7afad3f381faeb33cc03c255faa8eb7a9427afc7696cfb56c3d202d7d37735c804d4b91331f9547f99b6e11c9f52fd717caaff080d53c31dc2e9979e8ff94238c4fef281bd7cff1781666fe8fb6714a31f3daebe9d405fcaa7d80efaf2e9d5a08eccd6fbe295a89858e587621829b2a2bad5a859dc36d87092cff4f3eae81fbed1ff719678f50febe0bdd17f7de1aaeba5e9fe7186a2b6bbbb0f393bb136b167a620a1ab7c2a4317f2d0105729f2f9c5376a56fc5661d7ec051d8cc437fcb32ff440951fba50a5cf382b3548c910aaf4637c1e727f46621dbb374ecf7de1aabb7ee3a1ea5d4346aacd92ad03f855da6c8efcd919bf613dec25d5b38f93964686ae7f583f2cb75121911a84b124ca3ff9b91a3f366af0b3c8eb8e0a61f08fd5bf70087f138eb115d0658d55ffe2a9aed4176fd597d08feacb7396faf2c29eea53cf591a643eaabcf4e2f1d7eda6a3fa56e095065db6aaff163e29952a054c52fff26330d54bbb649316c2cc9e50467bf1245324a34b2115a9de571e74a9bdb0972ffc0156d5cb2b1178f924964f16d928a2f32184ab333568a388ce87ea85707d791b4478933335e844cc8d04f9f1572fff6282eee5e55b35584617fe12bbc7978ff5e50b875449a5410f7d0902b4f295065fbef0072fd597ef88d497976f75462793424a9168d2dea8541e57eac509a994eaa347cd4abd3f2a4ba9542995ea3381a97b59aa7ba37affecc5bbb6333a985749a666bdec4deafdb394c755a2b1374078e9e56bbcff09a91a5e0d0ffc52de56b9b46d3b5e3ef5598d942742839eaae1cd148c27b3782d704d7d2634a8f2b64aa397174f6e599aa5a521a3231a03a96e7df94cd33c48d5970fb1faf292f3f2bce9bc3ce7855db99746324bb354fd1de7d9f8f8f2382d8d249566c1bcafde5f1661a7f7a59943a77ab9b4375d3d841056abae0b5a7a44919aa57ab7a1f2b6d6f062b5f1bcd5b0f1fd006b57b394169bf5f272e965555f5ec0fab2e4cced2e5131019dcfa8b44c59896a182aa2110000a020001316000028100a064402a1581ec839e20714800e7194486046180ec38120876114c4300cc3308061882106206300524a51941451d97b1af5afc0647bac3f331645aaf548e0f0907503a70d546511123178403d9c6d78c9c21b3416a5024236f73d9ebe24ab74fc98ba3aed114f40c783d20662df65521a48b544cb57b3120bcaafd63a0893069d0b4595cba8024014ffda334d17aa87908d8c6ed5b3e816305ae3d301d48899e0bfbeff6612bff26fd713ea918d4b57b7b385444219e4806f39744209fe993b0def4a1aaba6a5d9e21fca548787b6c98b3d3e1af5fd0a1b6b19f19f4c81a05c86a46e0c3489f4a745818392943e743442a1da186a31bb8c165a4290494b905575a6362698dd08fd5f8bfd1dee909ed7faee7c8fd732a9f1f93b575bbeec4945329d294af7176022e3160d4af49183b5781c80d86c626ce36389a241f665cea6822fd522950f45a9221fa657e50cb29e862b7d5dd8cdd502a3fa83249f6b652b26e9b6cb0433639463b57aab1b6d1f501ce1e9403b8330d0994f74dc959c792cb14e2c64d3a746c1f803846d84cb78321029141ca2eb6ec837e9baa2adfefc6f9941b89489ec13608e431eab07701669a165a52d62b961a3b0646ca741872763ed8cdb0ea32b822612a52f8cd45626b2a824166632f1633f483cd2b812707d433d3f16b67a64a2a2bacff4cd5a0ba36b6a0f162fb1b84cbe552e916a34bb7b639610d3d2176da61ae5c3e2a3ae4b606b0eec7f1f96b1bb893681696e8b2e3ee1eb78f6a96cb9ab4fb008dad84fdbeb1887daf02024d834b05a2cf9c363c3ed6a6d75dc4879a0470f6c6172f4c71127481218961a77b00c2ac025eebd1866ab5fdb99ba899e040d2112f0838cb73dc2f9eddc3d42740e88480ff3f53a274b1ce86c2b22e49d8953e597ebe8c9a20978277c22e6a4451aa8b9ec87d41e71153b4d6bc62956f2c5f5a4c7186aeb08b746869329e261606364ef0a511be286511c2c8f2e139a3bb07b73fc62739f8bc63b4b25aadaad61cc02751a0669dc9ff67807e509ebf2d33206bf617274d87596c7f59ebe1fb90bca2e68508a8722b8756c967fff573000a7d62c4e0a845cb40f3fc0d9085e2f378b0b266ea15c0a57abf01d5e1bf87d8d8cf5c6ac53db04e7a49d89b9e41778c86ef002398a8cc89b19ae41e23043b726790fd76fcce0ded03329953380547982ef383b29c61b70b1ce66e5125fe880a0888a360ec713cf6ddd72a267eeb6d11439478093548187dbe9dafade91bb4d37ecbfae9279639fc98bcefe31270dc551c616ef86cfb792fd50745a771f1e9904db5c87fd81d0df2c6e953fcabe70770e4cb557d93cf8079a275a4eecda82ab2cb1b4aac41a9558262265ca70af17e7ff240dd2fb11a91aba38ea8d13b3f113b02cb4a3f089b7885c4c621278d422dd50685c7462d2b405e55bf8e284cbae4cb44206641fcba8461c7750c0ab1795b9402991db72cca8615f4b777debc816af9dae07df415cbc56ac827c90ff28b8005471ae3e5b11e3836f1c74b9df92e8bcad2e74b128b7e27df0cb367fe6093af31388e104eaaa297649a08610abcd607d79c0e71901249adb01f33108cd6de278d6b5890b3a8bc920548068248985579a6c1387057b143a5f61ab8f61990acd6d17f7c7b95d9ab4726f1bcd4a55219c446e688d831cff66372570647fe0033d4bb061629e1287b4025d045be26647060bf4559ee585dcde6e50abfaeb7e653c3ca0e38ac1e0326450a0a429f20068765a2a515ee2daad8fa402344013a98a3eeb3b1628535e4a2809cf98459691d5eae9a7a8203783eb35b3cb6d7e14d9d5fdbcc9717665677248581cac0927ce74253a28048ddda87dcc0782734a887b34bc0dad1c1fa849c31015a6569d6882e31e5a0ef9be47a71a3e08c75268397e63bfab6e89fe08be08d966215ea5047de2eda7e3885ec11eeb3953f2534c86e626f82142fedb2b3c70ea18b364699b03308db90bfbc0e04ee0d4e22a7258bef9c44d92f12e0a000c8981599cf427127c3ff86528f61eb4d789168eca290b270ac37e59e898311e8d8514bc0cb81e3cc218bb11b5d6108eabe1220f368e0f976cfd4903a600025e9fd30625d79ec152ee435707372a613564a1ebd40f7bcb86f41886ed17088f0bc7faaa8bb4ca65fdd40c9e2e2d5c6d530a247d68395d9952a0397b6cb1d034a20e6e4ff614dac67a20ed637a60ba03f7a5e78acf594e9888f3cb18aaa9803c60cf039d96afa7f6820b6cd63d1e903484a8196ea06dd1a07c4794d8020bb2135ded9f48588bacfd20839a7cf695561e1756fae4613ccb89dab8eef1a992e514d0defdcf29318c1417b84bce24df3f5444ca021c45834079658bfb60c9d6e402d729f2a2b8912e771f9d33c2c9b389a373b7c8cf6e1808b929b47f221ae275a08e9f5a32dd8c6395187cda6e14d8d851112b01fa92ba9d1b1e0b030c7d50ebcb5d5ecb47065105be3d7a6c69f0cafcefdd45da7085741cefe4c612d932f55779f694e3ee37bf4fee68d7b922fd5a87cc7fd757fa1bd421d10f39d2baa0e4694ac7bd9820ada5f2d8947f00847f57eafbd7a24a18fdcb5ebe38323105ef96dcc58dd472d41efcc00dfd3ba723d0fcea052fd0360c9328215705f1e2a2bfbd1883ca3c1fd4e6705892d0bf61938ece6d3986b77d37d71dce75ae8f0f56c02793c110942872d03749c69525ab062f7a287c0435a04a70bea4b5d8b8efa2a2ebab4e4cec61a98676696a6daf72b5fea55b34a17fc38305661c42ca12e2322d1f8f502a16b0337d482564641401baa08e24cd4249175d6def2613acd30a8014b00e05afbaba8ffac109e6dc8000f38903269839d7405f83df28177ed1b2da341330b206c5a66fb5cc622785dd0e747f5135c1d0f0ff5d36727725233ae32dba6da0f0fee58264784f64646002c2fbc7c84982310f45c6f14b7a932067c5a5cc2f4c2c43d206e41794d8bbada83a2c9d5f7fd50554d5928bc12f0e15cd5d3dfd4d2895f979eb32f3e7da624de3e2967631086b4d70f7f1a52acf4849487dcb02ab0b8e950c1ea829df468df5d87cc43d95e139b5c9c0046d222a6da6c40d6cf81ee37695bddca6da8651aa1de3b76fb200b70b06983f3085c743f439ad1e95ae57556607f8fdf39a161b6c5a6a2ffddd5e2114a3d03af9ca2d68f4a99fe6f6324e7792cdce6f80fd03c343ca44a5072d286544618d3654ffeaca5598c08c2990d65f5dd18b700e421eade3d0be941d000050ded48189ef8066002274fbd7b32381e5f5c0a7c6d544ddbdc31875f8dabc82c83512978a424b52c3636b2efc141309c93cc1c7a78e74e4c50889278fe2eba843c1eccdf12922c8936fbe6ad0e60094631044621e8fb509eb8306ba4401397f047e5b47429c593603c869fd64efb77cdb3334d5220e237c17a2c8d3bccdee0002aa6961e4d4732efdb90e0e6dce57b3bcbb4147e78d53e58c676da33db6ed805d7676f3b224100cce296003992e69ed99203cd784757af1d7b48b2859ab375a1655b6486299c02e0eca6affb38251d4b3c41d8ab64a227bb8e10a648c634c62e2a014b2692da7e1098a0a816e268735583361427dff5be0cfb7983dc189f019692c29d7ffec66dbff076cd017437e9976fa6d380140b47acc4acf812b706ec8bbd7636777e8f893fea8ad2a4181d1a54027677bbe5e20d2aa31012245bc4ee8e59028a4ae6c751be654eb28c1c32860c5b206eeee2bbe30eab4e1b75a56fb7a496c2acc869d3b2b965bcadd4027a27eddf2bf887573c4f5c4406ba40f5dac46a1a0e256fb5bcf4618e87ba0c9b513bd827d8322e912b6fab18594e121ac5717813d171535d903a577d8987c4abb5a9ba1e448da5018fa5ce033af7d3931b9cde068d5d1dfabbe860483e86d0331330c60ac811ff9d0fcaec2b637c038fe619249bc94f268f72ac9030964a81c9b2c615944fdb5ffcb21246fd6830ea91e59148ef56ad6ac6216ed113b2d41b73ffde328846a09a8661686be44cd686d376dace324ad5638e01ddfcca746216802abc23c546f05a32cc0ac4de65a95e0df9bb9f398dc3672286dba17f6bd97491d9cd1ee50d85e01858ab84b288bec9a02b043c96d36b121841472115d67af07f312cd16735f761674cf748cf8e06a88fbbcc49627a700063056ec624b6a75a8fec12e6e83e064e65635380d559b83a27bffe9ee0fa2209ed6db3c68e6f857001e5bde4fab916baa13bec66398f7ced013915e6646db64186d1e1d65a1a2c91e5b92bf821ef68a8970d7e7047d605802a644f53523d0ac07d750146688613f6a456b30216fb30cb54a81e5886dda06d9ffb1742310508d20cbda0e4a6f96e9c66b80fb084504aecb828cfd9bf9c4072c2b2390d72af544466baebb4df7a589e1a11846e38746c3949545f229a3131c8728dd7c3521b345b77dbf1cc19c9de563c5d9d0a5fcfe8f78715af4f3c3d8a9ba9b15c83bb865234061a7595fe0d7c04457bcac58ba5343c4738d498e80300878e28ef3e28f7aec8e046c64c7a29fd292501f007a5c959f431ea11316309a3d7ef2cc52066bf42c3bbcf8d44773c6e462dbf3791e40fe22254d91bf93c840e5661ffb36398fe7c103c26bb44057a4ab35a4359b47703a6c6a6e0fa08c8d6f890ff20568e627c55a6a9b5152d75546a51126d179ccb9b005fda0f88b207b56341907e82f162e92d696f13ae40b5dab60ee790750ac6416e7b21d956518cfb7b1e8b512f06be25287383a82b8e28de3cb00ae0cd66f85d0aa3afc74d7312e4412a4f2ac735e24110bd50e01f3d1a06e427a2a7e118348d10a49a837898da665c4967ae7d56884019618a103dfa196606b0e1b92431f888d2db699e1b08526a84536a787de1416134d51f5e713383bfc6c2f5a58919ff18a3855a8d84daf7fd7d40320b96e53d6a9e4cd6e74fa1199374c19fac833347a1ecd73decd26ecf4a6d54d0a18772e88b28c51164952a538ae38b559d056c0b303730782140d14ea79a50c74d73b79355787b2e3163b38b0cf6fab288ac53b8b427d2e14b8c94f0faa681a4561476cdc9b2ffb7f6ecb529c5eaa1aeaa2efdf8af003b7ff5755d60e93fc5dee667f953cc8940c2087b3ba63973c1173995f08156ff755178a29d8a689cb84824d0afac54c472e557ba8c0ea3971f8010df720c69a5f7a16a0e1c03d0696f021298afb7a580e3fe0ef0a14672fc841c0a40800989d697419c8bac4eb398c1ea6ba86039f410f21cd33d2b1a074e8ec6880d1f594af07046fe0d222c29b5e83fa8880a8ee142fe136f26cc31b86e303707365d2b82f3946040ffc7d7878f061e90bd557b69bc6f3294018a92088427d89d161a0f3bd2a382f9cd9461a15868e231d6ca74b91cd57e786e6793bbcb28284828233ccb539340fed8e12fd25f2719bc2c7ea8b46bf5a3751f99ffabb76f72eda5863ce0df6af5ec5428b26287bf840eccd05f87a60e9953431e7a20ac221f2debf0754027bd08861dcafbfdbb030b5b9b69edf74094388d2d80bdf8e0d1ddc7f05176be7eba94be2b50ee0e986460e970e599b04c71fae8378249bb4ec5f4ab98cad54144b420b20c56b87e916360e0c9c2c1149def9a6a607aaa54eed25efa66a07909730aa9a6eb6293912d7c545a453d6b69be6101b6c040a57c6ed3fa42ea2a9a3ec4df553dcaeb46eeda5d798b82c8e89da1b99d8e6887051f1bfd86390d57e0b58d36488eb7bf779cf1d69f7e6fdd11138a725f434975fc4b2424a254ed02797250408b7ae6f1f0092679d81ac0a20160e2f70d452927db62f7a5d17e8571a3386530abe332271becba5e9b4fc4aacebeb12996219c6af5b31f54bdf16b1be092c186da36cdf1f02c8d24044e9b79df1aa264bbb53f37b1c281d01198ffa01a1a830197fa505f74adf2a80a5fe3916fd324910007f0158914316e6216f6c22c2223c82871761be88382447f6cdcdfbe49590d0151145121011cee42228fb14fee0cc09c3ccce5c9dcbe5b05ff9fcdcaf8340c9e8d2c687d7aceb7b1998e675e799bcb9d0a7134904e69c8a286f977cc56a7b3b6a1724ca517eb2b48d2be989abe13229404025f68dc58957c69d1634a0efd11c991c268ab6eccb5b85f8fdc3062694deebdd20f026eb48ed8d99d6015a457f8190955460b783585b76b08fcbeaaf56729d77a3557f577344d7a0ef2a364e03226464ed775808801fe9647e57eee1332bca2385093d5f4fbc0966aaaced8a77f6c4ca15df3dddb5deb0bfb941a8b7ec1af2a0a547133be48abe8291efb62fa8bdd3a6a1811e9c69f1047ece70860c3df65029bca476cba234b800ddeb30acd1973593b195287aa01718aa7e37b5e24a7bafd03bd765d395cb0d58b7fc81c3b5230fdacb9d7cbbe0d35772102f57a70d740dc8752cb639e45ab0fb293cddf43d942633d5bbc2f6e0454d18a80b030df7a2df788e0775a403e2fd39f86bbbc70eafc99091585b7de501f51af086430872e3efcab807b0e319f603de307eb6aed6b7de53baf30606fbcb5dc10947ce520d082170923c42cd86ae0d88b5326e31f121046811231c1017122a929dd81754d7deca54f283eee8a2a030bc3ffc62f0f55a45cd0b0edc107650d3a1bdaf6679de50098f91a40a3000139186a08373e3fb39a560354edd4c75a948e756f14a078593ec047fb81ffdd13a14f9a860744e5f14dd5c859887be419129c5924536424d78e6978d2e16b960b9fc36b841102562ad938c8136231b4560ceb6fdac4fad27b7dddaef1b2b17619ace7e5434c014fac14d038d7ebb94f059033ffc8bd8c1a2b0c14e6a10227c6297f1c1c5f5915c5d70d9323377aa4f27c360d5ef8c08e76c3b3df402ad11e8ec756ad3d760f251ec8c4734cd66f12fd2daa00f8c695ffc6992ea3b0f37696bbe5036cac7b8c1280b5fe0ad9640ae1e2533aa427073c79870cbd081534f7578ee1170044be38fa65bcd734771cc71e42245a3c2ba35854e1691b46a963db9fc15ae35acc70d65534f283894c859f39026f0bf691e3b3925342ed63833920657aae5a44abe43c9b8ef9dd571c063a77b467ba069fdf0d30f8b017fe6548fdd4bac60a58a3faa9016090e900bd4160412df345f100019848ef7a10ee6b475235e1c69ec29431a42e5180220f4f028d49d51e7136ab397eda5d33e74de76045e6f71a8f15d59bd1b0ad9dc876de5bd14414eef65aa10219fc5efd1e87d75f5a99316acd334cd01bdef80975b49ec2acafff0b28bc9bb3500cfb144be3cccca8e0b06e5f7972527e8cb8e1b088f5fed7bda96448185f1d3f80d096d499bdb22a8cc363cee8ba02101f71cfd03213b493619769d0cb6cd1d6e222262482e6b2522c21f94e1e6fc6cebf59f6840b7b4b380d080eb9450df4e311aab74f98a669d8647525ab691f268a62507d254748b2e331c15123a18180205949900bd0158fc796c2f976058f69725d78c6618a37605eadbff36c18125abd574978b76fa4a239a277bf55e29036befc71e7275546cace99fb5182203f56d8bed13699d6f5399a90aceff5951544ddcf9a6c728f96436a84717ef79056cd0aa0c462f6438395e9e278dd45eae8bb74959b9cd469c698104220c036cf8dd66631a9e396634c9c7d0b429511c66376a83c145bf95d15a03e6cc50df26053b0a410024c4676a9b4d90f2aae5ade50a1fa963c4bcb552ef261aec3017de336dcdbc54cc5814b25f85bc3d4e0cd77f8acce1d92c93dac978d8679598b04f61b960bc466330f05ac361129cef6cd8a090bed7e084c64f1e4f327decbd991ddd39553a38de3b15d02c193564c0a9186026cef38542e5a864b77a5f4a5273db94a21e8e0eaabebfe48bc2a7b13b54f0eefba5dd307ccdb93b9dfab6b0d58b3b9f9466007b54f677eadb38392f9686fbc76e0c64f54c1910f298f36851bfa9667391938c1782ef5d8c2829bfe95779d646611f3763cbabfbea2ef058430e49b0f8ff9a3f4e8d7f86d5b65e9820252b9fd4b0f72580ad8ba87f0d02123ea5328d9820388f4a53749113478981f7d7f137694454a23cfbc21ec483ac428e57873eae73a9a88fc160a5794609d590ab3ccf8c4505e9d6f0fd07870d8e1d5d330e18abbf3127cf183df5a703f77675043b3a743d535262dedb40345d2c5ecf78443b5fd9f88e35d75bc3b3e343cc6696871ebed2867d4369f8ec010e84606123c1f439c427f729132ca98c0bc97322d2599bc0eca7530ca929e1196d3062df8141b80b3c8dd9821ad08be5ab3f9590be965f4d886d4cd7bd5fd9bd1d3a0e013b8ac891c9daee42c8777d28e6c17fff844eaefc4784e15bfb433bbcdf69bd925316e7a8d146db536be32fcac544d8de424631cb73d8a5b56ea1cfec221a306331d398c804ca80798c7e5d31613a3dc3b8b610ae4798fb2c3abba4b1f5cf5df0bc59a1c8edd3fa334b713257716bb1ad5680d5ac5c8841c3334fd2b8aaa37a09cc33798f04f51da93c4d2427500932da7d3cadbac0a89366a79fa2554f985951d75055a2572380c205a49d37724ce712159151d3920ebfaec8af60a1f438b76cd704845d6a4062ae8f9147643249e718461b2e500f58062213bfee43ee40ca4b21e4e6818595adfcf65de8cb7df845de70ae9476b539022ed5908a1c4a5c922d6ee5a29bb6ad121f715261e57bc6dcf8105c1ce4c61e36f642db5b1c845fd11b94323c14fc7fcaa80550a5770b5cda8d8a4ca684807f079c2a69c10df0ccf63e73a83c87ce0c0686229425b800739ffc4b70529cd96144bde05a216b158d5aa57104dfe6ef5f2755591df3dd21158c9af213d140aa6899df54ec171b5ffe125593461b0216e7dfdd82dc6bb2a1dca4398a9ee0dfe169096a8cda48640984e2a8bbfcba2f779bf775734e76e58cdb8cd67da2192420247d06435af675eaa16cd0ba666e675daafe561ec7edee3fe70da0f26252f816cac32602c143df7ac29e26d401ef039a7c88a986a1c302d4c98dddf0a6b8771920b1a9b43d8112afbdaad77e70c5fcc78b05d0265c2e1e898a0571667e331c03738d69b7da70f2ee3ac82b93f3a0b329b3e0e3c8238569b8a06199dd46ff48c84d5248906276f8ffeba645d2579d3a80cc5de6d9a32cbeb16ab1ff09d233ae2ef55388d9f5a1e02f50dda5f053ec3884fc46a32e676cbf68ef2255e4d3cb6deb72369f7b438190ea369431cce602dc9f80c02fcda3a58f3325467bbe009d01617971471b42e6e5a95c5c66fc70c51c99f03ad92f76e2f9d361fc1c90513164463a48e544562faff2e0d65ae07d5f02ffe029319be7724503030ba4c9bfa1673654fdd20742e8a6a02f0023be6f1222a4c07f68bd1048d9ef38be47e0e3e535933e678023d3491e733004206224b40030753bffe5ffcb4ab4aea2d4885e9ef2912be9a7c54088d3fa011a95a67cad9bf50649f5f00b2dc4b2fccd9986b3824804042de0a5ae802d20380efc4b078a5066b1f81a42ef16d68a9f73621d91a7c913349a5d3ca9839c5345f3c20d15b63a3283d6f7bfa321aa0d52676b3d0632126a64747ba334a20136e1e56db84215813c6b849b106c66ac2ecffae16111e1520784831188a27d88e604c7fdf294733d90ca125a8bc6c2d8561a2f32fe8cd04f29e31ce42185d341694e14c0f8a4b556ba75319bfaf8236f2de90f317668e5979889979a12542f87f78cba4321a117d95dce817130d6a0e3bd3f1b21d6e49e703aef04cee6f0a7a983144087a4dd91010772af3260c33986e3bd67973a70466e0338cdefa11ba18fd423bf9da1309bfe370e7ac217dd637373d8a837332e1eadf62efabe363e2a8d0ce105110aa934880ad7341093ff9567387fd70641125ed18738ccefa533af0ae470348718c486235a5fb98a828ab5e743b6f3693040351c48778f2b76d0d912b1e5715b079ae12c4d953c7a3bad5f110d40628a17905b278a45704e9b06297da1cdde40c3ac1856fa6f21e6094de3f02d286aa7056242adbf81860128772d063241c68d72cbece7315a44427eec1e17cac1171d83c7dcc78512914d13ea299e01e1c33885b89fe27ea576200f12fd75fcf354c0989e0100ba971d4f4765c3d5ecc13a737751c7c77a9ca44897423192fdc7b18311ed8a388e8928b3c4bc857b9156883b5f4fea93add594cdac567a7bf6fccc1226cc5c4a8434ea98483745303cafc492cab9ab599dba21961c5d2e540e1e584e60863115d615af5b174678e15789c072dbba1fe8158ba96186bec508c26deef2d7a4150ea928b87aecf27e62337339e7cec44ed1858f8bd34d437cc97042edad052a348f6b109440767ed206aaa92261910636ad58f8950737b558b8ae0f249d7e4a2a033b0051266b27461675dc8cb455d9a08207694d868eb3ac71d2665a8d300c70e9574b08e12cfddcf5c2b898df2a1c49256090f5cf6f9d4d9990aeb50d06fdd14e563910a6ae91179feb1dbaa0df48843c2ea533a840ed8e3fecd1c20b58d3804605cd0e384de809c6226526973fef26cc54263a7a2f6b19c63fc320fe9cb682983361520903058ae02fb9502765db79e9de11ad923cf44eca28143ebf39036ed9ef8b03f45611b8a62e71c103f76c5e522c1226dcc6cc016ef80e3d73671e922706d140610a9fffc1701cf06a4d2dd1a7c5aad1b3e4fde6d40d7decb6b3091b1359f38c0b359d848fbe337a314c518ec952796f873450f721fb0e37b38421ddbef7ce07fda743968d9f6343f532ffc5053c1040c8e01066b765e74d027fd1f61aa9e323eba3627980de3547dd97d486fdf7e71e8960a3e5ceaa8f7cb1b78d493e0bfd687605c6c01231ff34ed88257a0aa35ddb91595963545e46f36b8cdd78c4c481b623a073c04c0bca5531116dfe643cbb8e63d5306a88156555a66ed20627d0fd6dbe0359a1aab794468880cea4f325448fbd7d062d6e40d166b13398d8fd1929b67485d467e16d955548a45c5db409a1ec76d7941a85d648a78c629d5c0762f7859bd25835e08aa28455861521a05f30201dbecc24897ecf1f9d796b254ff497aee1e1b2980be4d80535b96c99df810f0bad718a66c832b839470a954447637357e56bf5e2b34e429e5befa443f0ffeca409d7ab1fd90e2bf721eb35975d9591eeeb2c2f3b0ae6f19f2e3bf266b391f7105d38184c8c18c9f37f6e2c3cf16a7358ceaa05c13782f1c8203cf09ed903e095ada7e50cabce09d9ba8f1d215a32af8b1cb100c374e53a022599afb107ef7dc99e0f53acfb236856ce516a69a4565ffe017efdfa46efbb045134b67e69092513633f0c530be02c53c9dfd956d4f94e7d5fa19e5cc99ed239270f6061aa08ebf5d0eb715af3e6cb08c72efe7ffd113b4f9ab06272235f6999fa9dff1765ea7c94a3c9afd6867765be02e02d65dc036081a8b47ee0d01d0618f8b0cc573c4a0279672763fcc768bee2078935651c7af515a0e9ffadc91a27313ac56360b45a9fdf50927f15072d471e0b9a9ae469bf5cc2a51973c71e8284064ecde949f9191795e6fa619eb1ca0e83aaddb1c3ddf8bc2caf76fe6ce07b13757fd84173f70902b503d5f34b8507b586ac0756f1d1d63310b8ddf1c10bc39ad7c244603b9e6eebeca1c7a83e882c23c49a65a5952988f5ff85863a0d1f82cebd120029aa8b3b7c38028b2eddfce825409ae10728eb6662c96b42d285d10eb3c71387cc260e9a13fcab15059104d314ef9a19840bcb413e6d24175f122e922fac597a3c9b88e6924112ffea080a50a732c6675ee0175c768af871bea4c36c68d043e46c68f9b52749b1870a522c03414a7572f9ece45cf37c18123ebecd186d56e5f0207f4609a76660c691d44c01d11d8c38afb3300042ebbf3f0aac8bd61f7bb94e5e8e16a4ea4239a5dbf6545cfdec6b8f299ddf8742ab408f36f87c88c3dcc216a75de946ac74d4dc3d62898e2d0fb58bed736e084c2c2016d9a45a59d016ac1c7952e596dfab665f5482f1739444873830ca784b617f0a10e678260394d38177f01c95859f99d0da38434986c0b9d9779d73d8a6acb2a8863d8a0e3ebba149cbb0070f12a84aa258d9128a44b958cbd46ade069e756bfeb0dcb4a9b20a1cd24c376e7461009d9cebfb230021ef7aeb91755114cda143ad4e8ec621a8048a962e96ad7a319e6227dbdffbd17b65cd912b4a3e2240433a0c46ed092eba96996a06ae288d7efbf30200842607bac2c2dacaaf543058c4320a9f4837f9d3d09b41ab6ac6d00045217dfae708f982c425b70e63f15b0a9ea81f3efc647f31d1e7df0f0d3e294a9929e8efdc2ff59a48ea3a89c893a16c66242f2dd79bb692913159adeea5a8edf8aea6952d31cbf1e3c32e61102e6255eb61285c2804426048ad61153326c87573348cfd05d6e98e5111eddae794fa85eb5378e0afdf00fd096e9211c98668f3309c35907c4ab69173e00f29f6e410bc1131760eb314e104f3833a072b30543aaf4ce7a08f9bb3dbe4efefe5f89c8cc7502be0e9a29cc353488e648e1c81f247661dbb117fb01bf2cac73988e3341644ccc0b265c539642eab291931bb8745acfd5ff5a8ebd3785487062bbd8ada8a3653d7aacbaf7f9b20e70a4d5d568033c2049cfb9ca23dda37ef3acc71918ab9d0ddcfe3d81053e1161c9b7512c1b774f31414d7af44578f440744340e79e80e7d090918a729db34b11e4fcbb9c0e79c8f9fdaca844c5d746dd3451a26b9d2f9855a0c991afa5fbf29944f864540291426d8a48512e5bf01250ff7b09fc75dde5c0c185547a440e48b38623f46393744661ad55d992f570fc0264c802ad46f7ae8ccb0431df68b5c680f0a240943f70d88499447d3389fe75f3b20aa1a61ef173a846a02f2bd762aa30ae007e1a189fde9598176cfc41c7f3a4967dcece58d86f3dabaa1b61670e31a7210830f916ad95e0693d361ee79b773b5cd6751800823fa4a0a1f05220881619190410b1992e419f971537580fd31771a0c1316cd4a9c699af89d7a497ee54cff40841b383c1fb292bb89357794ad716eefb480fe128f87ae9e06526a3750b0d219b262d37da245856e2077e021594e705384caec0c54e3b1289fe4a57ba7cc7fe49176dbc4b75ba600889d41a2227751d71608ae9d4498f8e87d903ad4bceab4c389d598f37604ebcc8c2a345185374508f4245f48354241db2cac2375470ec19073db80985d0cbca811b37ee78b14fda4fdbd6e469614ed8f1561dcdf68dbc0c100eee08926c234cfb921bb7522cce99efa0b2e82f263b4e6066cacfaf107ba87d5a8666849d1deb54684e72254b6c51b0a16d067a6e00c1ececd8f0c3f10c3450809ef9b6f8017fb578fd5d93072f48c0e34fc872f5c0f8e23256a58b31a43d6901726ce1c7ca9444906f618b714b41bd48d738f83d5e25ad368ccae479250628f78f6ff6779a96e5a2285b6f6b85619e71141cff4df568004a8e5e35b11ced185781804376b791a826203f90f9709d0442ab5ca4fa052b21d7b8b4bc467d98f1f26c0e866948e5bcf61b6428fc1925fa4bda7c9ec55d5d0f0c940e43b5d804cb5e2a46d611df4d908a26f9a200c36417730013cbc7f8977dbbe229e3f4c79b6fdc77a350089ae89ff337c8733dae21528614462c552cbe88cfbf7642eca95cd7cd7887a550db7bfe982e281d237c3e63f69fa0a12b654977f15d09754f22b881b8c6d36de6382a8c71692da916c1b32899414cfba61d71ace810044541463850efc8d4d297ddbbf508977f358747e05adacdf25659962a297e08c2360df915d381dbca22f0ab93c4d50fb4b9fc8f8f8a113c2e8bc92becf74c90dbb798ca7f8a4d0f86aee569e8ab16bcd31df5a0efa2f5810a7732aaa6009a339d96a5c027ac48d5d2d29982802686521d22c30c9a6f79302d5788a065df62227800c6e917856eae1c12b81782f8d1add432529387be00bf71d229c3c491fbe72bed65172c40fa00301142d445b12ad93de4be9f68259e186fc20670653f488e297f79f9d6d9b029173f1f90bb0e6a1d48eaf3247765048c7414dea6efdeeca6ed628750af399b5273c2cbf3e376d3b78fa3d618f584d3e32f40e90a8caddfede3651c1ef5f7d19f8671ff0de60f8324c10ba607dc99611a2b2465821e3662f7497810c23ef59bf7238fc2e6dcc03c20034834109e9e43ac7ba16fe68c234973da1dbb2d62708f636f703af16244b34ffd7bf4b985325418ce627c3e779af384a09c527030257ea138e956efe6d66eedd9eb41dab2d3e303f32dfc052f3b5d6960678aa10331fc0a1685a72a06fc90a9d8aadff5e0a4efc82e1c5a613e614fbe14973e36bc8c86640c032cb90648da02a2324a912a8e222dba4858436868d02e6f3b8ef588e3c075fbe0bb0970f43e5e1ed4dcd6755bb42c24efe9d7e8ec82954590d9f109d99dbcd60045f41a369f1900c778af522c162759f043b8b8d641b27f770dbd32e272b8712d6687666e8e524d9104227170f54526830f309fd6337947e1ee4b7092a61a43d0639c8ce620176a82c7eea803ec9444afe9a668d0f1f20eba263617c9851bd03da35808477e714fcd12ca51ec723f3aa5c4d7a3c1a9f40426088155800e8d7fccbf2c1380ba5f2d1cb831407d53cb998db9583e56fdebaa03894ba7e3f1762ffa86069d51db4f9c4b2c61331dd3124344d24a1526371c68f3c60f38a19c6934ce9735d70663e711e07fdb7cd5b7b523a98112906265d11c04a74df6916cbf74751a21c04b0f7d5d018b85fa204a16aadd05a5c119b21124fe771c504221a14c6ed3c5ae06e970e9684d95d576929d48c8f2c6850991c88f074299eb23ee5f4d7b0f169305feaa99c50e00893f9cb048b20aede8e34257ac0b62ea20964083d8211b6992deedb9f2dde3c0ea0a74c49e750ee694c73c2d1b4296d11da8e074893885c2e36d19f1fa63ed223d4754e4a2547a5e3e05886b7401727ff2ad22127dc03e60defc4c1779385b63eef0170d7cbacef684704a3d74ee1f3646fae33dcd538cac07b4a9d56c3ba7056a3cbb1ab8e55151598c3dfaed3afb4b8e8911c0642bb8343d61e7446defc93b5e67190d722caa795c8cbe46d7fb4d571d9909e828548acd76c9d251e1e64d0032db59cf1ac8a748b79e38aebd42d1488baa31bd26725e45098c142310480a979e40281eb7372af8c4f47c3507da115e88b7c0df525d210108b3d4dd4ec7a063359b33cb66107cd9aa3a0d4adceb937f63266fbd8b6c61ad2c3f5da143ebc4f0399e31147a5f99776807c2dcf644fceec9616d50b6ad2a77bea89f25420cca4bb1b9114cf362577fa630ede49f9fb1736dc61c1cc3d471b902fd044a12e1dbb3d041740aacc15f3adf9dc7d2937367375609239ebf1338121e409ce82c071ba39941b5a2530973800c4eabedc36f4e90f20aa0db779d495ab88e85b65f2cb223b01b4c89cb74ca73dbda6196ae429611024747c8f77aae641c51437c6161a38b58ec40a6536defb6962b9918cc5d5932f187d15c02341d684f833e06dfe7e03ca40e1928030c5c00521bc49bddb692c7182262c8adce5c33d7f2440b25ffcfc15def498ae83c27e3d980f2f55f9104b9faa515966f25421a51891f5f845bdc9dfdcf73b219890954f738a09677fa409356d9f2a2cac86d5eab4d99f349db2d582ddfface17a3258940683844f1821b9278343fa1d9f842bcaa048f8604650e69673c0e0e94bd854d3a157bba60fcabd27021d34a3c6594038f75fcbb54ce24a2d3e4945ae2df09d2d3cc7b652a6d8b449c15e2db6bc8790b90be4f7cbacc086077d9f176ea909a149e03564cebe31fb128770a7c3bb170321608c9beab2f665c81f7c419d8f6b9eddd0b9c1b2fc0b1c967fc512cffdc93d1dff433c4079ec7db5368dfc071401b2f479035d01313f90b74ff70d7ff1689abafda132a1fd13b7f1ee1e80751d65b220ab6b72c461340becc1122127d32c9c62822ebc3b679e2542b6851158f677d9e2815865895e001789c2feb394a365091f81b264038603c6863899a591b1f59c40bf47215ce9bf13c5442cea94ae9e4c61532905bfb0e85cfef6b6258baa6f51eb4b51c482529ac343cc807f6584a579f822c10ae5b45abbceb39ae80ca4081c31e726fe52659d7a1d4c63c43bd6a4727cb2024f8ad7a1ba8d3ce2af96f166f30831c773c8f54541776a93c7940a59aa2375ea8b968db7addb74d1450cd2c713adf2ef398223842fa28a1c34fcadc2e9886e1049bf90425c2d45ed92ab071f2ba2fa5c45512d38447433e98b272dae383d0cfb857748b13b33450f934fc7de054df729d093cd29e36b46238b0dc9f23afc4613e6eea0d591fca0d5fc448209a5ea5187c498eed0d83ae49b3420dde5889799d6e8042c246cd387384a94204050eb765352ee20ebc435e997b0d615bcd2eaddcd8d7f14a56a38933718f5fccb4a01b91e94f0d11c53fd5d0bab1283cb3896bd50bb31823c6ec268edc2d8fedfdc5837e1e76ace6c8a03e5380d75a64e76bfd701d9e1aa9208134e4c5a0f8a36a88f845dc854493a6349c05e3270104f408f6240077b8a4c8cdedcda45d64544e7294f8d13bd4b9372b4b220a3260f03ab7e75b2e68352baefb9025e54b340097a8229358ec1830a76a8d4e6a7d7843fe96ce369eedf40a6345c087efbf80a7a35d3f6717d02f215a8674513e652db159d5eec4862f35813722940ad7e13a485a74eaede6d942727278c52b5e6bd75731804ccb962ad09992faaa9a41f684a444c3fda48a45640393e95d93cac98c457796d51e8b7d1b544f279b99ed997f1686c95b8604d1107111fbb322e5497541d4401f852c4b5e8efde62dd665dbe1664cb240729e626ead6effb8402fe75ecb52e6162b09f3a1c99e0e82d7908751da4216a6e68e00ecb1925174e0fd3895b0c69a9c64ff777f2dbcc3db3c312ded549149990ca12f9044b3203d72db67d1317202468746093bc2469b691cd61ec7ce7645e54c512fda066627fbf7b5fbaddcf0aaf0a57e11837668aea376bfd86fae6cd83a1aa10f1b84d7e88f40e96568b6f6dc49d767f9029e3d09c439a1bbdcc2f9e22a489e78a8a5cc0c39d87364bd9fb71ff27fff151d1df7cfd8c442e703911b95cffb133701c484f182d0411075d4183ecfa1cb7d1c0040f853c83eba28a4af7035d26467e94181480a5c5b4f8a380b6f7e5da5d7bedd2ff832f6208aab49e277631600dcf1dcffd9b04128ab4eb487641c7785868f034db7e4ec269abec4546301a11649f96187930d0d4fdcc615bec6b166d8c8d8fad4e3e21274d3abf3921ea81db9f90c2fe7751e1cf2fe28fdea484d9a3760521f4cdb6a49b95736c3f4ca4fb6467d7bbb0be89c7c651dbe6b4bb2994bbfeef4b4721a54655fd1be7fcf6e77a7f7661a3f4a31f068757e90c2584cbf6410d8137986e3b77a4952af1dfe9a166944ef8f71c76f81054f1726fb31b92e9c60869df7b685bcc12b9d2083125f215d459dcd155337b92339e2873316e0e82dc1aaeac284a42f64a5f274ad0d20b14b3db55fb157cfe5e7fe59b792fdd5bff95dfd62659f895d3577350e0521da1ca73b96b3c1140454fbc16be4927ba354ad48470a2472e1302ac1c0ad255a27567eec8eb58a3531ec250be8e9c3cff6f7ef069db388e6c4b4abeab1abdc7afdf3d188f073edb5e5b6a2bf76150838d08f0730c1e2fa71249fb7816193b3617c91b4068af744dbe809acc386741c2697dc73f2a29bf8128f5fdf44e584c7a5760f689c0820dbd0b7000e40527bea681e48fe120a91288c4001fd117ce55c33da362c0b0564e23dcee56e4d1f7e02afa1bf508c725f5d28659b009f5beee8a5bb097d29a2314cf000760d74c664384b9d7de3fd5c0da2e499af67bcc20aa393868b10c40df3682bf7e1435c7762f365ed1bf6a5adbc6c42f7e0e01b885bf723d5406c01be80b6b3acc9021f72717bfe315506b8aba1250463a964d3ce0531b12c51fc5190e1218870b73a05c9c6eafba04e02a87cf17c86cc74970caa6ea6de3dfe9a8b1daf931a79d95e9abc01d702218f21ba3400edf922696c6be170a0d4e60c8dbd06ac8cbd639b1895111f7125acddc738c5f3a2a96a6d5a51049d8bd64e73c5ef719525611e21ecedbe4db420b3c64284572f53be731e12cad1b3c9352717f46b10fd1b5f19eca3701931ec46bc01782db6b9ae12547665702a7ff20206e175941a0e51c01e45886795a2a87ca3a8844d22693e2205ac11c56bfec52fc905bdd7f35ee58cedbf93ec0dcc963b4a6106142aea35873bce2ab6ce10f53086c3322ba8cc30d6337dbafbaf2a96447de48a22340f03177c2cc1cb6749850c4643f265b47a40b2a3b80a24fcb1dcbc52368900527a1dcc2198aea825252db40a4053d6d50d9431a1a566c300c836dc71bbe615434c7fdd56b44e813b255f98ddc98c5140a3affee03ff6f0d797b4c610bcbb74d05afc7f36882f1bed3396b9b8f1ab5e9a82bdf1aa14b4bbce4c851a48fd1a7e540a55c58f741b6c4fdbb5dfbac51934cfbf63c106e516c8f12677888e97b6f615563db46daf0c67fc79a1010383ecb3f960614aeab0293e5631ab76790a316f85d2b9765258e2639a6ddfd2e1dceb23360f6356474b722a572e9406e18578c41f1eecf10cf4ea402e6e290e1dc9dcedde3c208f4ab97e6c38a50d074c9a223d83adfd966ee5226ed194a85b9b5611c692674973b820ba75026d7c1e4544f054c2db0788d02dcdf12877b109968e7b0071df69ec1be55bc0b8d51d44f56bf55c55a490defbf0f2b357c7544300c257192209b0cf604154ede4bccbe952c493eeade234ded76dfb0cd47cb95e6e9ad5569817177b95cd7915c957826189b772882d391b56a831038419b942742e38200e42569e6b3f84fd348802fb0e221d2903af00fa1dbb8b9c316b55a745b039876b7eb302d5984be001bcc75fd4997fcbe3e605e7f10df6959253cbf4c1b7aec9542373c466dd37f4b0eb4caeb852dc32f1b5d683eba4a8c3ef2f4847b2b51b5ac13b50258b94cacdc87565d6464bff3b9b15ef6824e8a94a270d11c6171693e0f256c287e3de293d6cc1c9ed528e9691513637f2b558c1e4cc7ca4406a7f3b53b49b486af0bc85b8a51638ad1904b382b07b054596e493aa03e48710df272a3970de191e35f653e1907e47dcc609081ed4abeffbd3fce9857df195a000ac9b8daa0efcb6f60e508e44ec2016922b70b584fbff284581f29d8db356f605f29d2bb1a2f7ea3a3692a4f4d02f2279807838bbe07db34552f445ef1fdef3fc642f0e00b7413979bae753b73be3bdbaae486ea773e48cd9c1c4d8219616853be0c18dd062b2becdf4aa26eea8f3dc2923c3ee6a4a089c233b96ceaa48956dcf2e0761f96fdc3d994aba92058a6fa44dcd9b2082391fd214320346a611cd25d3e1fd17ac3896ccaaf3eb255fc0a886cec48090a5bbd8dcc06e1578524d6fbb709d0fd9173c11d9a1912f458cdc6c0f98061f8635b9a44a0a5d539d5a61f09b9d2f571e9e4cb9f2df25c2f2578f105323d6cf0640103cbd1b60b1366d14aae4638618e7e6719c7e88f715f61a27ebef60545fffff7e3d60f8bd16d89f11e775f7962da246ab2b0c06a19384b140b67ad2d497e755b39385b578725b846979ca5ee79c20158e9b3bd602e9f8a6a1ecddaf7fedb5e51243e68f0c67709009b597fdfb5e829c7c485c8f7c936b0838546e0a45214768a65e519eae603bd6922a4a3c07557fac549d69b4fb516caacd44d622c46b5e69ba3a153a7e0eabd751912aedcdc56d5e9a48999be69590600e4dcb29be49cfbd3dcbc662d9179f3cc18d17fda027ffdf11a3bac2e1aea1ea94bf6621d08c476b3797a1f8a58420bb72c4d2d32d692a7e14a6639d81036974f4c69cda9cf69fc084d401dd3d0d558f511d45aae05e7ffc8e59cc17a631476efcb251ac6311b80685d0eb6698f9591887f0514b2ca3e832df08ea0f8529dd4b3965ddbec7db9e4272a842f47d2a19abbc8c591b9c29f9471df0888f00681d4104f676d1ae8e674c90d3f079de6213fea7c4047602ee776d3ef1b9fd56a28ce28e31ffc10facb9cb7e639d5f565bc6a7529bbb91d940836e05f12af18a3524f8763bc19117228985c3a07c8e320614a845a5ae7035a4322d4c8572cf23e66653d06d68b817e9a21b5a700424e6fa31114a78f6eb10d412109b27dfbb6d1f7967d38ea49501602092d76cf4e491e124937f947d833be284cb70a531212bc5d8963e0eb362b4de191be093ba154c6e3213f6d533e6b6834af89e12e6ca810cd9e50f122e8dc7aa9c66fb4e0f595fff30047602d5435f75523411cedc59e60960006097b3c754392e6378f12e8b80708a062fcc042a5efca4bc574d6cece1bad199f1fc6fb041b415b37dc1da13e8a98e5034f43bc7c9ecddb9d800f2be7b17376ae63cd26a79cddafef3c7ffcbbdf6e387b230d64e45cb64e445e98732e2f4749b3ad6571d766ae065649adf961389620588468471642717c0001a7de8d3eb363e4710527d8028573c3a961dd8c0880bc699917a5607707a28e97e22fc49d4d79345dcc5891bfbe4f60ec34a1c5252a60df183daf4167a58254cfc5ec8d253ff293f07f0e0a0c1f7d07e11e5b23e42fe80df87954618612c88585874ee402666dbb388de3450b6866e9b69d545147b382fbc862f953afc8f50361c3a7e969e97d6e310fd7377245e607afef0ad806cfda7848269efd690976a83b51fdd8b621ee4422cbf8d68fcd3f0700fab41ad7b76c8b004620e38bf8a56c616c5d00c091177353a760dd00fdf2ec3ad6fc203d332eb7276304601cf69a531ca05338a7814dfad478d69f53f992b2d94d012665e74df7eea86b9c69c669c2cf45ddcdfd2d4684adaa284df1121c12a7a2a47d37a4c0b2b51d3d1076356865b109a06bb442545b9d518cd819a7d08facaac907380a149b1080a61af08a29df851d3145adfcb10d885efe4547c43db87b2db5e92e971d5986fa70e0d0cd5d4a207bcac9923ec9e1a33cf64182da1ce7fee2810ac5f1084996c81972bfb889661d338817b43bee00ea58c645d1a53d0818a844210f63fa385b1033f3f63bf5481d6d8fed1e18fa133878eff0def7b1cbc9558e83739c7805460a11a67b96340659a0852154b060ec7d4534de451e7f668cdb8f1ebacf63a750e1704ade5d7dece2c63c254382c7a0ff02c0f03be39a3b451de3769593624ca4d8ea50da52aefe752bc5fee2ed5e0d486c54b01edc9fa05fe7eef5b55caac8c39e72bd7b943e9d67c3bdf6e210558f0bf494123f0efbaf0efae06c1a9a5dab786c6122eadbf8932c8e7a3eaf57ec27f8f3c87d902b052c4b5b147d0398fd64b8d639c9ecf714561a3bc4a252593b88c8d16b1f5a37b809d50bb8c20defb96f5ecc3eea0ea079981674567a4172f38f3f07439cacf1ee4e250ca64484d2db0d8905ec0dfd63a9dda28ff039e0e3d274a4d7366374649046a40628504452708f20adb8e2056e70e37e5da035f8acec2d25011f227b08d5b0945420702914a715bf58e0636b1e5ac7099d57608a639b6aa5a80689baf8167c87e631f580ab77d5aaaef9179982c0d9d75ce392f609b8121195441c6c9f5e38655e4891589acbb5cf4dfdaa07ae3bd7e3a54862174b0093caacd19bf7ffea6e3057026771dfb3862e2899633f42135e7c34799965b313603b6d11a6c5005d736739045cb23fa5b4e96da02eeb869413db98eaafd9648c5963da5aa2cc72b0c886a1f1068830123a0e9c6b0c280e726e49db6e0ae86c137bb98c994933a7a1838fe42e490d4c96e742acf8f1aa84ef0aa081a5ed10d5b91dc32bfa75f79276dd5e3e6016e77e6289cc9e2c8e938eb1bdde277252ee149720ca0b0dd08d5596eb63bdeb4ee4c9471a42b478799e59723da085df629a76e9715e270b8b8dec7229510dc661869f2d85f3b9f5c961a206a6d595fc5838fbf441da984d1736b9aebc5082fc041095050ddd6e6a8ec5c4f6dd887d068141e6082bc8a8e2360897a291acf7e9c8e72bc279b63cb2443e1e2a7a0b3f9477343504d51d5571afcfd62e502fe14c7dd6f4b2af27b5f5f3ab24e44f7908a091afad4b1b46fe60e274918872ca06d08ecb81cac6a05ad723a06cf13631ff2b8db274932c1eb09a901de411dc357054345cea55caf36ff46b9032484e320c416342a0f61f05098ea601f532e9f0d4c1c59869ba0d0d9eeaf0c427a0932bcb8e30c431f60da70ff5241f4d20bf78a15603de72f7c3b6b8679188e29b10a72e1e0010dc91d05dca1d2b4b6cc4e1718454b6586378747d9fda14340f193fbfe547fc925b779f644691f161f17a8baa4bb1b796abdc6c5ddd05e06ff9f8317f7c544e6ec6993bb5b17f459cde43c3f39a5f9f66493edd9ddbb54e6563b416d8a0a23fe1d0c26db60929c85187a0c97c083db0f10117309afe57021ffdcc0d5c948a00451f16c984c7dd221d25e68eb88ab13eb96f80c66309089e1d2ed7750b9aa33d55e18e374a1cb4e5a4ed93efc60b88cad0f21b6ee366abc3db181d85f0efd3f8686eeeddc03312692b5128579a58b0b78ec53656c2750b138d76152fee2bc40beb8e7614dae26be0ee81c3dda23b578289fb2374f2d15902a80d8fffca3c457df006aa998f1e3753d4b4174cc278d1c42b30a98f7d791d5ddfe0037e5a374c5d64b419a08a291d5143d8422de42efc827d0371c39aae8f339148454307ddedb1bb3480e4e15ab5fc150086fa613a67d04a15b948dd883ec3fca40891055e99c6a81313db62f2586a441cd0b3b0e5a8c0e81ceae206f84f1316f5a228e196f1b74890092b9a4193497eabcffb0fa6ac3224b185fe9c78b728a2d2cde4023e6b0293fa8a9a8447e13d9fe527603fd278420778b3ad2d15bc5bf3a5cf23c23ddf3b79822050efc783e5cf0444bb68d3d38c6e4242f341ffda11ed4535ddbbfce9db0df41af688ce0ebe58dddaf95612b2657a5b2e98278b3417c1d996b9589fbbf5daf74e250c043c650d8472670d69ead0c36e024776f553044f7d721942d91e84578948ef438cf84e3b0777fb192a3942ddf4c7d7e96fb815aed2dfb0fcdcc92cba831d386522fc8e99ee450803215f39ba8389a211e3101d4cf8c70b8daf71ef32a53032865a01616d2f94d1e9ac2041fd5bd843adce272769f597b3eef717efd51380e911926983e7510922ae2ac53554f9f8f6ce370947d6d29b0727c311e1cba0c510e9b4e96746fa92d7f0c2d9e373f3baa885cb6c31012a2e9b4ea6d5cfcc3330c23fd54409095afd1b26b5f7f103dc5ac9e25e05c8bb8c5f497a70fb60005a938b73c969855caac6cad61a9294216b271af0dd156eca03258544869a1d06a2e0219e31f07c4fd6949d590021b40ebdd85fc95a8da53c228fbd70c3a5c13d3a5dba399cf783c6376af26dc9b1840b2c82a390b94011d460e1dbffd56fc13660c240d45dd5412cda084111465edb526e1f87332e2cf062dc2f9dd0db7e48f7f5ca51ec7155e398a5cfd8493020db325a00b56a5a2a93e61ace1f47a7a0e93dfe64a707b2dcd40fe0745243675606c136fa5d82818fe6f6d6053c20466a250c84f54d8c7fd7b4f6cf98c24d588ab30c63019f7b0dfc1bf33170ab7cd8c5738da395210100f6fe156582f2d129993c6ff55b049ff17870ce5cda07f8d5d8868259921184b937d9932d304d1e8ab6cdfed1cd030a9596dbdd7db00cd6e75c6ecb46227f94afbc3dec066abd6b604d48af000e34c015c6dcbbd2bc2151de509a47abd6e6d9b34b6f71a0b6e8871b9a7c0d973f7a44c07fc4d998371a884fe81286d451a73bae28dd5fc7c6ae16458b23089363c428ccaa50b3879d84203b39b66ae55fd916d72dfec992e7f3123f16b6d34075c7defa2b05bed8d5cc1540fa9143b07655322254dd7d5e3c9563a2bea7d3a01f45609a170474b57578d4ed8987de064afbc0d38513e7502f45350d8aedc0c234c7b0a379d8d55c859aa9a152ebc2b38803e59536503b4b96c0892fe29854dc4f79c9d334d7b418f5c06443e66356f40f8315972b9b43c245831f2d1925de2c038585cef29017baedd319e2f9dae0fb452f27656e35db7677cbd8dfc415353cae4a3a1674db7e43b78e1379ee8a63cdcd22d6e2f0a5d8a37454f86258bc377fe1d78958ebe1a2eec95bed18f1e10f78c97bc74c5ab6e4c2078b62e872c0b5baf5f43f3dc5eccd373fba276fb973b544c8454d3f143f68771467ec1ccd7a7bcad64b1c4ba956d6d0f39ed73fda327b9e4085a45fe5c0ec7117bd7e5e944340608d6fea2c720739a2e6d18ec005a8c4d24f1c8d5c752c283a24f8b0e1b5716d68171202dcd58af981c64211a0d0bb692a638f223145a18928e10282cd70098098ab77b50aa279bace1ca291f004a7eb6e6a63099b580768b73ce3cf857ad44606e370ba7668dbf23d6124f133b18f4f59c78d66980b7fc0a031d59694ee39c6a07d7880f63ebe0d2696afa6976ac404260191c7f1edc9b93ce13c4035a00999b98ca66000f2ee2af84691ed8535ba58bbf92160a8dca1f5eaac667cbb6e1f4d80b3d9bc6411e4fc4d57331e208e46a0d4a0c9bf902e81d6a09c3faebe0fa8e97415700bfc2e0d58efe2611af042b2220e0a14f9a1bda28369e08b01645f8f77c0b47c8f598f02896e7c34f38817162553dbc4ee03fa59abac56205812a9030ab9cd095b2bbf119f20602ecf0ef4ef2434b4f501641b1a3a37a243c0cca984bf982878d0da5c65bc6df3ef7f06d0f3e4c7417bfbc52e6a65c140329ea02dc12bf04fc413ec8590bd7713b9b794294919930af20afd0a241269c78e911ad5254592cb51dc4f52174df2fcfa845cf9c9f2a49fdf75dde827cfaf3d528725c51d5fa5953a2caaecb16012f6c04fa4ba9c4875b72c5b2cd8347314f7a49f1d4c3247712f42c11d4d2cd69315c82879766ae4393b1864ee47d412f947d42acfb1871ae08f3d7ef2fc5a6ae409f3125f648e7275219be409837922cfa789491d30d3c8f2fc91064a9ea69f3c5f06039b3b234c2c4f989e3c615879c2b4f2645922cfef6252a7cbf35954526725cf1f5956799accc8dc4bd12493286ebe4908529ca9998890b99a9a07f24c1754f945e6a2496682756aa666ea42a666e6d84293cc45926ba6d62912ac67e690295217f2c4e5da43efac842f4dd4d43a359f7b1394e77e079ef971144772b93803e42858a766ce90a42e48ae5c4df022c22fb299d9eaced4a40e29734fa37a1a99d4f132f734506a5c52c725738f9a499dfbdc6892cdd45040d9b40226ac3e713fa2ced8f123ea2773636565d34c8dd54b9856509fab3fd2a832575fe5d630e6becc1387faa3c79d0dee878f881e89cd5fa895395a1e852fb33e712f50240ef71f3e82e4e61733240ef72f65c817b8779067862fb29717264c32ae63756ab402991ac1a08b238f5f2b73ef79f87b107b3ff2e77ee4ee53a4ba1d18aaddecc2597b4231a9e33df7dd1332f5b5ba1ea9f33df752a63e2ae489fbb12ee9195d89ed913aa1efc9dc7b21dcfdd7ea5455223f2ae492dccfb592dc3fced446d217dd290b99fb7154cb5c0f3232f7e34c2d731fc23d6412e7c8cca389f485492671b86f2f3cd5240ef762ea3a72e88fcc1799d499cf79217d499cfe0ebb4ae2f4874299e36cc8a32671b8174d7147932c733fbec832379a643104655963444dd2f58c4f171b05e5ede5cc0766cf3f0e8bb2ec14f73d872f75da934aca8946d99b20157ed889af0d2eb6fff63fb8487f7b204027d706a9b3236f9fc30e2efa38899470c71f79fb51c3c6717f3be53e32f7392efa73ffc3c520a9c323735d2c6f5ce6b6df5486ace14568439fb651ca46416d9cb2e492b8f39d071f28809ee684ea2bd3ea6aad482629d1836f4f2b32050079eaffc2da3af512797e3f0098e4f9ed1aad741488ab17d695c4b1f4b7d04f50080d617f8bebd3fafa89c4f30dd3075ffc6052f71dd95ed329bcf9de9c53ca39e79c9544676ea154fe58c3167706774c9243ff5c9ddea250686170b9b06758a564dafd9c117f45e913fdd1a71aec13eef8233771c71ff4c71a06e913fd1f3d77687efade8449fa2f39b8f5c71f5674df853fe88f121ad7860d0eb9594a9c233457557d72fb6be8a966624408d9664896fd2f37da9e2d22c27305c14c463293bd9668e635c592e3aeea22a1f2a25dabffaa2e123d72fbe601d474bbd967aa0ae469d2ab4493382f64bcc0e47bd792a16826717c884ae2c89f81cdec40a646aed115f2e43fce78917900491dee65545e2f30fa23573f31baa209fdc29f5079591ea31a6497d9814a062671fc05f6cace853c80248e7f098efbcace85b1ec3d5d2b7b8beacc35b412c7e98b177df297d80bac4fd605b09958080bdea827cb9fb12c6d96b0ecfd944e2422903172328d32f9656a9d7524e373d63ae79c331ce9b71bf1978ca94f32b2eba431f0bcf94311797e464e794e79afcbf99d67383620db29d0b9a9ae92bba9362577536d71c7cf7eb58e5bb5b8d589bb4bfa7d4478280823a52ac50e2e3c2ae3a8af51f3fb94bd53b21480ecd37f66af1527cbdf9eb8e3977d7c2ddad4487221cbaf4feef865db29549675cacda9ab8734cf10f7568b0ea9151cb26d3d3d1b3884cbfede68bbe28ef4f5a2d1b2f41eefe958c78282aeb8f3e50d361331eba81b6767163216c91e6e7078d234caf0cab6d272be296ee83de97236157593d44e924de9a45ed3393b28694c28354877b36c3f8dbc7ddd41e993ddb6b95551cc0d5ba6df998663037227eb93f58be54e63b9c3d910ebd26f1c335fe5b7bf38668656bcb7edc0a60d9b688eb272e762b9e355d6adf7eddbb45c5479fb362e17ebdbb779b9b83dcdf66d96903a1f135227f4159b7e7a06fb3b68d9fe6632cda2b8a3cd6a34cdb21d6960a4a076e28e362b1a18e8c3f62a2f411feadfd066e5286bd3e3e48ea420abc5ed999f0af2cc7c66dc71c635e39a79499defedcfd440ea84defe0cccc52ed6c9b29d715d599ed9d8b79934e6286bb302a1b8a093cb729106e628fb9eeddbf4d0c0469b5738dab8b2a536515cef6b933bbeb4e6cc0b66aa18fd08fbc80d791a49193d01bad1e1114de2d810a4491cebe48e1dad47e2d8f78e10831ad97e0c3f2fb85428e691fbfa8f333ffe232908ac4d2e11b38edc7d55919e2053a6190948ea746f5fca948908f28d6c7fe6678a6c9fc4923af449413b9e90edef00923aa3c722d3ac77602242e745b66f3ff404bb03510743ed20db1f677ef269896c7f24059d5612a7473fd2c07864fa16962dccc16cdf8649a7444f69604f03ebd4c4dc09aee7d1665503c0235b2b6ebfcd6a026925a34d4fb63fc1111037bad0b2606d72e78f2fad21332d8963df8d6c7fe47146b6cf632675466fb7c8a3d7e005d9be4c4beaf8834366320d81b27def7321db0f0160ec68d97e17b3f6de2ef6f198491dfaf6675a96d6208f2fad6cdf41213c320d51308963bf04c7a5810de1914721cd5fd93ec5638eed937d1095ed7ba10f74725d60b9d88f823cd2c0b2fd2333dbaca44e673b7fa4f941f712fc422284ccdc852789635f888fec8556dc777b436bc3a4cbe2daf4f4c97e17daacfa74caf6ad0b6eff68b3caf66578d9e63187274d238b2ad3ca64cea67db556266aad3b4aa7365a69e158dfc894d61f2679fcc1448a550ca986144b8efa913a5ea6358d4ce9b829c9348e4ceb1332ad6ec8a468bd3c5631321d2d0dee587fe853bf354a13b0095aa7b6b0d27efa447faa4ae254da8f4e8d96fe4b139652982eee587f32ed28b4b64fbfbed129eee9d7a04ed9a731f6659ed2a94dc5a4535b8864669e9e4e859efed6647bd2a9980e6f087f981ed942cba2dab656f6f76c002208b44993d9301b8d2725df7a589da27f5aa9723b19fec31a9407f36910306a1b3f7875f3667794b42935bbd168342080a0d16840d068341b4ca136ece0a8c9591fd8d01adb924e758aa66e9f7eb0610d59e7843b4a5acd459aec445b8b65069ef56c0aaeff487b8e53ba4b96f7c211c050cd1e9f39e6c8a7930f579e9ff303065a54a1c9d02909061656619cbae583e9cdb030cba38c9267a53e6ff2fcf93713c8ccf33fd304e24fca32a71f799ef20442f6a63071e78ea858b8db16fa09fd0401e901c26242c38a090dab5ab78dabb5d64a43cf941b0f2a133d652f019934936ddb6809ec79816c2a7ffb3a1c8d94a078dbe6df1bd9dfdd81a0797bffb1c16bc81e9321a7f3f62799529f84ccbcbde73c5bdec26de33e26dfc7c45379d2d485b697af8267c9c9a55de8d62a2ce108ac24688156ba240d20cb71148b980eac08c309b5c331440620a50ed94e284cb2d34e2eed938f770b85508721c167a788ee8de829c22863270bff243b5e087758823cdcd7df42388648e8bd1822a10e77618c1716f1497692ec04f18d8e3c773a23a53c9fc3444c909334d94eee464323a58a6da6d8660f87609f241125e764194b028b3cafa0ea3e0aaad4ef401dbc0c765d90ee441fc429fd98b8e10bc799bfd1fe7d8a3b2c527951e82df8743261411cba0c8693097008f8dc7b221107f2884425f9e3055f24ca4184670671f7417cfc7233b17456bae44e26139cbfade1c5f4cbfb7d5ddcfe29d2e08a19f33dfcdc867e823e742fa92cffd0a81eedf859f4de86a38fefb97034e551a6f1351c65284b02d1c050e6a3ac71aebcd0479e79477c38955a3ed01f47f5c362a8cb51fda290b21cd5edf9207d071188ada3c0ffc050c610193d9864e77bf0c1b008f047a105898cfe0b8bf87e14523c5258eea7aedcfe236565ef25c8c3dc11852747491cc451f241fa791bab556355e6610a84658e62b9e8d6de5b2afd8fa73c5296abdf81727f2771c719a31e7343fdf9358c21e51014ee6b410779bc79a4b22cf32395e5eedfb8245c8357f0a469bc76f44b6ecfc0bd12bf237b06fb8db2bf7d7dd3f7131489c00f4b6cb1535a29ad7486c26f846da3b89f967b6b6d18137a991de409853f407a833bbf659f4e7d9a96e3b8101e891822776f432fb950380ec161fb121462c350d29076ca86b64f1cf591734ca606db4241c7a7ef2f5b5c77bc99d4a9af34bbd429527bd8031f59fa348145be6bdc64e9c34494ec9941a90b59fa3471c4ea8b69843acb38f938238f3f4e906779943327a4c8a3fcc9eeee8409b23fa9e49fe3e21113bca4c0ca011a6cdc60c7df0617239082237ed43843a684133b7ecad287491b7947963e4ccac839745e2fc2f52c7d563ea0e376963e2b2fa6d085d32d4b9f150e7a8c1af470050f1f0f324041162ba8c1b105255e662c4096410713b420852bb0a8c8c110ca5840cd18583c5132c612516400850a3e435801122a2b684258000c527a8049c28b2862e08410542046108a38c10f8250042220e18c1a4c325e70630c2678d14411980003190fdbca150324e0a019a16702410211790219ad21a81184296c3006106cd040055020414610a21023890eac30e30750a86009256810c6023220041390718413ab2642f079c1620d348410052762c0b133c1f864eee1b37467cebfacad278b071b3eab9e52c8c98df15c45d9ffcd2185ee0558a64ffe35fb9b68d9264b7182d1aafde4b106f7eaead4288385cb746a3ee9c49de0f37cdf7ed02d3d59bc49d47b566ea5758707c59d4fab94acb16bb9ab6c97b36f7421023d12ccea8b8afaa2b44facfc7da1ce6179ebf0f8c3942557fa6ca7a8d7853c28ec8872775339b5c4b9e36759a5d4912d7126fd66eed6514efaac94b8f6386ae5b5c80f483ecb463b561e2b2bcbd9f289dc90527a0b0b696587ca1d8940171758a1cf0ddbdce63571e7bb7cd9274a43ead4bae1eeb465caa93fe1ceffa6a5d937ee7c2a4396db6ad7dd169ebbd75addbdd6cad55a7d78a21bea3e914b6749239595972aabaffaaab472d1e20d43e545eef7a9a24dd5e6a3865a5caccbd7cd714b2f94042f30b556558ee7f47f215a1bf1c1e4c4c061e1c8a1aa0ee4716f0dcfa50433e3305fd5e2f2a8b45f9dd2c29d1e8f49a76ad24c958b958b575ebd5edd1cf2b56305ddccdd29a5ee4e2975774a69ccdd29a59d07ba7460cbc7327aa9c194db64727a6ab1de1f393236e469dbb61da55927e852b29c833cfe52b9e913e6b39df22ae998446546f562266846a8266332b27483803c5e2d6dc3965e661c6626e6ab5a5ca777dbb690cae8b833c6f278d0d059e7cc273756a52c172b14595759141c62943502795c1693b16818aad928c87cf6627872ceeeee396bb743d9b3d6ee6debeeee70acefb56728b7d94a78cd79558b3b6a014517a6cbc106d97d1995e40eb9d2a34c83488732ad3fb4586b341e7aa7d6da38409021586260622c37e594f9787cb65394d6f0a34f49f098f96ca76af5683ea9e2bfb97753ee9cf9ea1697460a9c1486a03c5494841819eca47b79e099af6a71696e4ffc81496add16eea4afffea2a37e8b35a28e08f861ffd1f3f71ca1cd55ff3c909ce2973b14e196bad86842338fd0bf2d055aeb59a6c267bd8b9248e8542ad734f15f3036f4e6f230b734ef972b27127b779fbecadaadcb0726502191a2688d1276e294b1f13b87c8bdb92a58f09a020021db12b0a721b20812a51020c7fe292b2f451420b874209295aca65c9d24789237c0a17b4024de2824040499c01fba296c41667dc952c7d927832e5de2c7d9260a2856bb3f44962c9152e98a5cf122c0ce1eec8d2670913d258e246d36e284b9f253f4b6648d0aa0b48739372c3db5390a752f74a9dca2afddff4e1f9e1da12f2c297465d39aab990b23cac3d4a108d46e4ee6fa573829ca7fb1cb1461119f547714c91fbbf375a546939c8fa803a4555644d624c60e092d794dc2aae4f0e9599d7ae92bd0173a9cc1a521e59a5e562a7d151545a8a4abfa1d272a8f414151af6acdf674b202179729a3de47e3ab9f529388447f6f7a64ce2d40771f023486c6e89b37d689b1267db8c08cd6e910da5c4d9421edab184d0e490575571e45a9fbea48e7f5599e55abfd36871e42aa94347b2293139606fbca48c3a4aae1d6b0771e45e62665712a77fc33239602e0f43308e471eb55ce4a234aa5f8aeb8d971cb0dcdc9458ee25b2dc75d5b158f216723f69509793ea38ed3993905a2425ecb55c6d0179fa8b24568ec03206931db417090d26548c505b899282cb46d00e3aa630a201a9d031071322d94d8209481b3df1c417c40d110c4ee00551020b7c35d125a19504d777bb6022a406cd13c3097b84568786135c9457a88d136c6bc0ac1492a848e0c0a8830a2c0ab4310185075923a83e597590365ab48a3ad558a20693bb45135ab0d1c3c66833123fb666e973441b3c9650ea53a54d5c17597b7169b2f43962066dc6fd2c7d8e58820677260a3db82f683815aeca17de73391e5028ae0b151dc71d65e9a3a4499e8fc6a559fa28e9318092958fca077547a659faa87890c7fb60ccfe48a5b6b4d66de3381baa58f0bc68aeaecef33e4b3f101459fac97c258ee89b78fc7846e0109aede8daab32e70c3d951d20cf0eb0bb5b042eb191536e13e9595a5a660b69f2b8b0b8b8b8905676b8b8a85c171797918b087471f9bc2e6439971ede14de0b10eee749d348a3caf4b797ad2fcb31ee38fa19fd746a46a1b9e83dfd11d0e88d51d0480ed0c9ed989027fa54764e644a69ff480d298e5812f5237558321db96005521cc9a8c83f51faf4e48e23d9cf08ca68d6a951ac4ff4797878d47214fd0e8fb0c0a3d7888b116ce4459fe88f5c7da2cf1a3de9131dc94650fa447f341bc94031ee38928d642359a6aa6d7eccb6d51ffd8ca27091e98f689d0233fdbbba4d5a9c5b04d11f49a1a38a4c47ac4c7f1cc951cb746621893c5e55a69749a623a04c7fab73c4ead4386a9269ab53e348261b35e9d45855a3279d9a5fc4f238aa22013e764f64fa4d271dfd64fa1e10ae912ed6c572cb1c661cb5519b5c0946167a32e5d154956954a11974ad391b1ce279dd170a755f37b3cc22d5ed747adb2ccf91ee45aaeb59da0ed31027655d856012677e098e3b43fa9238dcd755e6beaebad686829e73ce399ff4a96bab4f5d597dea1f65afbf0eeb8f0bae37290acdc5ea4585c958b24e4d2831797219052c2a4f81274de30b2d778c562cfa545f7dea9fc95ff6e8e718cc5eed3a65a5951355579ffa47d9a39fb5e29ee048e7b1834d20b36a91fb29c51d6ce22e063ab91d4ceaace4fece8b4ed1af501ad52feb535756eecaead49316af7498201da46d1eab2bf757978b313b6cbf8545cc9d1ac67c921d77c1fd3c765f963e539ac8341c3b596e2e775ef4a9832db92fb4281e0862350bd74817930df0a4698c212873de7472fbfbe5e0101ed9fe7b1ea67d92b256f99efc5854d90555f6ea37738847a4ba76e5d5d4fa5433a54fdc8b54979a642632a4f82233d54e7164ee09997b931b2ad97446e6fec50c7b84db46c9093f85cc852f58c8dc836b5c95dff12abfe3612c89e2de7af545e626562ee5f105e6a269658265ee54933af647b5af8c2bfb344dab13f73b54f05cad3ac5a4b91e5aaeb5d67461bc4aa53a6267ec646337cb55a5d684409e4a220516dbb8244e7b0e8d8ac6956f0f88577a42524ce2f477b40ea80bea6ab89bd2a7fee956a3a051908b236bef1dcd728f82dee090b8dd8fa35927e6fe163cd2c8723f0b26e1d15746171f993bf0e84a5444787425796461b1b0aa123cdace322e192cc038ae0c177d02011e42c65107145a411a7472c7d015aa6511c6d5a88671e5fe108b4e792662080f08d1012345460e04b1010d64000317b0400580a0c004241001083cc0013f34c007061059400f3ceca083021290030e08b8c1862142780e60809d9a1ca4000418400d407468f821a66690210601c090f3420070c2c73e00e002abe57ac17ac45c3cf2fd3d649d1a7d7fe8923a3e0acafd52021905c917faed7b37d8f43698e64ff8e67b609b77019f1e857bbc0fecc20300a31e6300fc631fef58948fe025ef3d9ed9f1e6f7f8dbf1fa7b0cee5c9608df2658b4737b1e8f769c060b9a5748e3a2710d81977ce0911842a552a97640f0446024ef014cc477007be085c0437c11dc81378285780ee0223f6223bf01cc810f028f9f01bc81d7000ee22f8033f018c01af80ae00bbc0530069e02b8020f04b6c04b0053e0278081780860097c04f004de011802ff001c816f0076c0ff801ff00cc00d781ff00fbf00cc8027827d781ef0027e069bbe074ce475c03cfc0eb8874f00d6e1158077781c70023e07ac80bf01e3f008c039fc107cc3db8011f03c78c80bc136bc0130cf1fc1347f002ce46bb0017e071fe083e09acf78e70980837c0170fe1a30017e00b800af836b78207800ff03eb3c0d18c8a7f08f17310d2f034efd0c587c0160193e063cc3e760013c0c38860f00cef917300c1fe2003c0e7ee1310eff31ce3bfe32cc943ef51886ae4e8d34aedc312a981a14770c5d234ccdc599efa779b988bf9f0646134382efcb51fd1fc017d633dc178d8bc6458345e8729188ef0f5f2e0ef1fd21cc450f7c7f18735188ef0f652e76e0fbc3998b46be3ffc71b1c8f7873417c7ef0f815ce4c0f787412e06f1fd61cdc50d7c7f8dca450d7c7fcdcac50c7c7f4d8f8b18f8fe1a968b17f8fe9a968b16f8fe1a978b15f8fe9a978b407c7f0dcc450a7c7f4dccc5097c7f8dcc45097c7fcdccc5087c7fcd8f8b10f8fe1a5a0d504d504dcda432ad4c3d2696a96572995e26982966929966a61f13cd04640a32d56c542e0ab1e9b161d9b46ac22548cc3a76b2005f09bb53f3fd362f1b984dcc466633b3b1a1d900d904d9d46e5437ab9b9e9b9bd68debe67503bb89ddc86e66373f2e86e1922ce82b6177c2efbfa1b9e8e3fb6f805c04c0f7df04b9e8c2f7dfd45c447d7f0f958ba7efefb172b1c7f7f7e871f1e6fb7bb05cb4f9fe1e2d174ddfdfc3e522cdb7cfbcbbe3f77f1f8263fc673ec90e0bcb3111989f098b903e6eac206807c6b3bf07622b8e3c11387485af1016c64259380b7f425a08140685b51a55cdaaa6a78655d3aa71d5bc6a6035b11a59cd0c0235b41aa09aa09a9a6ad5c36ab95eb0986cf643030aaad9a86c56363d362c9b96a36c5e36309b988dcc6666f36343b301b209b2a9dda86e56373d37ac9bd68debe67503bb89ddc86e6637b41ba09ba09b5a0f558f558f9e1eac1ead30f452c6d0fd8d1a72867e1abc04028f8411aa1d9aafc12bbb7324b47195e0b863fd1902e7fb2b908b01f8fe1ae4e20bdf39df307cffb6725100dfbff5b818c3f76f2c1765f8feade5e20cdfbfb95c4c7dfff67251fcfef1fd5bcc451abe7f93b9a8f3fddbcc4520dfbffdb858c3f76f341707f0fd1b908b04f8fe2dc8c5027cff567331c8f7732a17f3f7732b1777be9feb71d100dfcfb15c3cc0f7732d1779be9f73b928e4fbb9978b43be9f83b968c3f77331176ff87e4ee62202be9f9bb988c3f7733f2ee6f0fd1ccdc5047c3f07e4a202be75f87eaee6e20edf6f552ef2f0fd76e5620fdf6f7b5c5cc0f75b968b44bedfb65c64c0f75b978b3e7cbf7db9d880efb730177ff87e1b73d101df6f652e3ee0fbedcc451b1b964d8fcdca4665aa99824c40269ae9c73433c94c3113ccf432b94c2d13cbd4635a995435b59aa01aa01a5acd8fa36a6635b29a584dcdabc655d3aa61d5f4d4ac6a546118140285b4f0279c85b2301686afb0040502b8c4923010815986c02c1ec02c4260960e60162398a5086619310b07304b10986503984503982503980503b8e502b8c502b8a502b80508dc4201dc3201dc2201dc1201dc0201dcf200dce200dcf2036e69006ef101b73000b710c12e0bc02e3d60171eb0cb0ed84507ece2520076792500bbc072c02e311cb08b0c01d865760376f9b101bbd08660172021d8258807bbd40e804b2a03e0d26a07977a405c62499cfe8c4bad20b8e42a002ebd08804bb001e052ac065c9201c1251d5ca201977ee092884b295c9a01bfc8805f62c02f02c02f30e0971cfcf2027e7939aa3f00f80507bff8c02f3347f50300bfb8805f688eea47e197137e0972547f0ffc527354ff0d86b1c130260cd3e3a87e1a0c53e3bd94317c5f9a42ced01f621dc818468a83fc42869ca15f6670c5b8c61cd5ffb8ca706561955830965c90290ef218baa80e6ce81a7b40197b782cb8a38c4b860b19988b3cbedfe3a24f0de390b89e471997dc99a0e339bd108b0be6fb4ba6c7d80b7d216eb5ad42524c018a5acf9d99c13d5e8eaa747525ed2a5c7d72fca3f519fcf7ce5c459f3c6461f589e5c9063e20e661c21822303ff3336111330a25ca70edc07c921d8f6b723dd34ab3eb79ac63e8eaf18221d2edc8dcfc481cefc96561b9f84ff3a39d6161b1b072ffed71f1c390c6da993074f5e47e4e892bf318ba441d0f0c83e58e0c8ec1aa6e278439aa4357eeec3058eebc60b9d32d711b06092471e90600c193a6d13ad00442c30a9b2ff8fb3b14a4ce0c2b0f248e5b559e2a598eb57705448fc52b17278d2669b452e95ebfc21d6790ab835cb4ef403dfe63d72a2cfb5b2e88cab8a02dc8454ee528ffdf2a4c968fd03c7241aeec52dc0a9b40b838e40b3c903a5c15248e07896c7047aec66db56dabd570fc531eb75af61f372a489d3c87143f890aaa824c6141a6e8079190c82ec57d177d67fb200d461e4d2edc3b961682cd5a1d2915c2fce63871cc0d54a5aa374c952acff71ba615ae0e6ebf4889db3f9af2fcd01296640fa2b6d3b5ec4f663bb78538078774a8d622b44fd2da234276e3bceb426df856f107c4f5e6b1dc5e6d102e762f5bfe102e5e59cb52faec9951cc26f3857eee2b388487dee9dee3aa1477fb181c68911b16c94d933aa1ef3f32a78c35594d9b406618f385fe0e23f737c1bde3755f102efa4eac2573cd5efd336169e49ef5094a9f6412a77f8631814c32e40bfd2d0489d33fce3172bf479bb6c80a6fc70b8b3062a70bfbe52836ee4440920c82524652ca95085947aea194381ee3562317c28afa44781d53b21129255be123451559fa38b1fd5f4ff087f98056edc850455ffa30ebd8a9a18a86f4e70e2d811152ca0efdf9345449293bd38729a5e47985285e4fc0f24b963e4fccb24f14ad2c7d9c54917d9a84916de894f491a227d3cfa1532a99be37aa6f85cadf082b6276908e9299c8edd0be8dd9a1bf07b9d3a174940f1e961cb5bd0d6376d83ea607b9b385456441647b6b3fc687b9637feed8b0882c7a903b4b4a900511fbfd25f02f810d4fbf3d185cf803668c2b77fc3b8607fff93eecb0c43d4a149aa8bafd0639395f589bc3bd14c2948bf87ffd464c9ec5168ccbbdcc5db30e219879864298f21616a15f432134ec26bc6f8bcb7dcb2ec76d61911a16e97032f1fc816c59fe6902f954a59d49411f2ce8036ad62f65a71f73c3f6fd1dc694fcc7d2ad7476cc61e075ee9edcc903f7db4bb087d0db1258174bc07d08c710b11f7afba190c33144b60ffdf6a110b62187b7d09a6a58e4ce9e4d50e18d2aa4313af2a9f2f63d7b1e4ce38e54760536726cca7e2a73f1adf552e93ff383c15c0eb17414c6accce517d2b760960c0323c625fdca97deab204f89f41ba944927d0ad2f6c73072e84bd8631e469ffa49d8652d78eba1e2ae7cf72d9894372aaef72d78256f54dcef5bf08e580b56c91b1557f42df8ca6fc1a3bc5171ef6f54dc162cca1b1577be0d91de6652387e2093be0583998514ca9e6d20cf0e7f39851c49eb898d33a85b3dcba3c73e3bba119fbd051729707f8fd1b4ca0b5e23084d71ebf49fd8c8d69acd80badd5e74503cd690290ca8951f71264d9a2738bf7c49f9574295b0863cf3dfbff76f38d2b73297649f3cdcd59f747c315283ca2a0c2aa87b6cd4940ceb9ea467912a7e32f2497496643c5a45342485525cee4c3bd5e0947b8486bc2c3b9fd3279538f3edcd1f8944edb574fb6c4926876448dc9cb37a208fe7f0d1a74d43a2981b32b551d854d95f4e29715ace5aa7a80cf2f044a5b8a337e91e89d35d7354eb4073ab6a79a42b1e7ca78634c8513509776cd52af7b7aa534b5a7c952ae88da020cc1e1f205e0a2a243508af1a94570dca4b8c076dfef6db7be1f785de77dd187766effba58767a63bbaae7b89e5ed8b1df39ba11fb72f64f20cbf2089a3bae34a2b28afb4a4ce9ca12f28f7afb478d0bc598dd04173c9fb3d65cfc9fe63cbf50777e65aa92867ccf9bc90e556a226dc71ce96c83097746a1b6d5dd775dd297739b9fb91bbaeeb9f4b4854ff173f724efd8239c57ce2a7a80977e6a294722667a5d968141402c21657669bb76f8b2b4417cb45ead370ec62b93e0723c6ed62f98c1bb23935b41fc43f14b3a1dd420987aa543af990e131f0d643deb9d3df72825092995d98d3a920a4942333cb80814e712519b95d59a59d1c90a8fea9240b311947eef769738260c21d67cfec716bef2d957a3e2bbc93f442d993bb42eb6538cd5944dededb32edb621eebd0e674f9fbc54b2e1cc15e764c7e36c72809c9c7e538b970bc7d2f7a4ad6c836c32b1416091bb8adc4079d5a73a6eb76d1be37cf4ec42cf0b47235d2c84bbae2727670ed2928642a15145c9a7c515627be522968e3b7633a923937b7b0d8121cfee074a6acdc9338c89491c32ee781313cb37aadcdd6b666362b99f0b3f1faf5a05fff12327e774b2d45a504a1cba85a31123b9823adc398bd0f7a73e4c40c9a365228c92ccb8fda02107861195479c27c771dce44690b71641dee868251d9e348d93e55b4497b1c4824b58b60b6ec1b2c72479a43f4d32e57db732bb150f9b78b858ae41b2d9aa9d72dd3623f21c93d8cd6edcd685a3117296ab94c92f688021d71f51a75ff9d183efadbce4faa34aae3f8672fd29c5d2d797a470a4c9dcaf84230d4bcbef08c7eb520a5d422951371c85a36d09a5448942306409a5447d21478411d91231b3b59c8f3672ca9486c8b8f32995b31ddd99604e2654c6689db4d639e7cbc8b0d427eb61e9332571c71f3f3c9cdf24cdc6a53ec99733bac69432ab485a4ade7c0b47239f7f9d4c6c938929a549e6f0cb584751d3a7c41d652cc86c7b9a9489146fa3e45329d9f15706fde9d9cf9940426f7ff426348f484a506a08471904308184dc4301705f737c0ac09b74ca2dfe2183833c5d439f96dc1ddcda7ba5481b2543a66fe994610a60029999520faa419325190059fa4051cb4dcb95fb8aa49964f9f4e548c78f0bc7b9813874996ecfd18f898f49a7e873f3c96cf5a97f5681c41da70c36651336e74f97ff24f549365db52877b2df3e959af62486d328937d3465f746eeeb83d824c2329e7f3844bf6e8242b64a5fa034818bdcdfb653601b31937ced4da0947e60874cc54ecae7dea5fcedfdadb5361ceb7321adf5b770bcd9f60ddae7dcb66ddbe69cb252296715e6e62de734f22d51cb9bcf3a67fdf9d2b271b7b7b3ce6964d696503ae794b2d6496f9e35e5954eeab3c3f0af55764b299174ee69a594544a2929a5524a39463592e94b3c92aebf2465ea5bad5b2565ea50f0a8ac63adbed577778e1af9720d8550b9dfbe7e11eaeed56bad95cabaf16c4868a6a157c1737a49feb2535f3ee1206379fec0c7057278234a29fdec4f5dbcb0d395a4256952489a9c73ce39cdf0a47cd9547abb682cd22a6fcea64eea4629a5b429a5948e9cdc8f524ae9f755e95ec1c293ed4929479e41c1c245577489145acc0b7fe2ac9a1c69cc5e5834935e01490923365bf3c9945a963f32e4cc9f210d23cb589fe4cf39922147e288a670c79c1b6c4453b8f22b386486943a756f6ed29ba37986a3119906f54905c8f3688b3e9952fb49838b97f738933780646154d1ad564d89f203e36236c9b327c8888462439de3ca3e99bc392e9d72ba68fe0cb9198cbc9194413bad9b7b16dcdd662114eadcfb4077771f8944a3da94d27577f7d1ca9c73ce397bce5e2191585826cb0a69c4d2c2d2d2d2425ad9d1d2a2725b5a5a462d22b0a5a5e52b8277e76c90a7766738d22659bebbcb6f3aeee82c27b56e74b3f46b5daed271adb59f75959c95e5573aee68ab1477fe07f248893383f205b76d7be5ede7f6d5c91dc98c7e8ec02132f95e15956dfbca71dbd36d65c78aca5d595959597919b7579661bf91ed6557ae901efd4a190975728d7c13e4a9d9c3af2ae1ee7d856c8686c463177b8386861c51cac69d53d22d92e0495452c71f468c5b59669d61cbf768cf4f963e5030c93064e98302206498db9238fe20edb6926e36b71f3b25a399c4f11fab92914ae2742529d73e6916c4ed6d655a83d119b3acb3fda8ea1ad229672cb445e74f39e794b37af56aadd5370f19b1caf2eb9c73ceb03ef7d2525ae9104844d029fbf28b98aa16bb97b7c3481ad5412eed104622823e3504ee2d62081120e953bf6809db350aa2f418acf0a3850ca0308213171ab535bc287924b1914719931358d83772ff3d23b7cf09b2c83e2868229f3c059e94128693d2a5941ef6a94f934a2929363971e587a2b8f2bf77c9bde4a494748ee1d94eadcc1dade2978eaa6803b9cf7aa1ae0b79f6e3c04d5447f4ba4aef98332489c624b9f20064e2ca2929a5a31d2d9074ca2aca1d4a8933a740bf99db255cff4ae96d77f749a54b770f05def6b3f6e43a64e60d4ba5d7202a2975ce0c4b29ed597fd65984b9d95a6bad9f1541d360ab75be9c6fe753fbdc9c2f79b839b939bb7e91ba71a1f4e60475a040ae034f8eda08859ee32aadf2762af4b3561087ed436f47b76f411e4b2d07853b71f0e7be8237d46dab75ab35fcfa04053fc329f597eebffd7cce39aeba83377848792aadb2abe049d308c32cb727414adfddbb14dcd0b7a853200e524adec222dfcbeccd482ca88009337fe138f327e4f4823b86ae1eae2be4a97f44e3b2b7e7e647ea802c2c9b1c0f73efd87b1a572bc957b4abb277f5c306c10fd2aaece02b7b38d20f7d10f76cc3b12aa95de822415036527b8af8cf6cc5cbcf0029c306b129050fad58fdcecb87de7bc1d5d69f2e8aeb33c74f1e43184d862e71e6dbbf4ac9fd398df2f1e3bbc79ea75c55509f5a0ef7db438a396e2fb258420f4de9af478397d0b8bc47434353c2342f174c83050d8d8b068f767266725abe5b7eb4b996591ea626e39279d1c86464649e867edb9c2722b860f68d72084791050a5434ae9c1f49dc91859593673e0cc3e894f7fdf461585207fca6429e605a30ae1799d4f1177d892575eccbb83cd28f30b5fa23c30243054c6bb4f2238c55d9f1234c2df707a233a8c4ccd4a6454c2aa5660000000008000315000028140e8ac56291589667d2de0714800b7ea44c6e4e1acab22487711cc418648c31861060882104194043531a81007177226b3e4c1122c786bbbb0bfffe329b9b5725f86d4a61e0b675e1b6006e4ea3e39d20d2618913217dc84be756c5ef1020ee77820830c309efa205f52ec9b85aeeec3b19e78ac72540cefe04a5cff25976e6422b2b8adca413d966ef098b9b3f02c05bb2ffb95a4f0778eadcf4818001cbdcd22bf7721b24f3ccb3d98bd10c4d4ac0fe0baaeb0de19bd48c3e13ab2e5da9a9215a34232a5407cfce883b6f42a3811c1ee26f2e7582e425b99c66127696ccc10c082e5b94ec797c0ba10e4d4b2871c1a36bca492d1db9a0e5a816732a88d606728a76bb170d641629138083350be6f0782a762dbb95e331e37fb72090472f2a3ce0adb8eb456d78187f82bf5eb6ebfe2729786af2801b7fb22cd8893111ac736cc909904224eb3624366eb0263b291f47fc74b9cbc4fe98b76e2fdf1c4efeba471ecbb7d313d8509a654134f57d53e5f11d3c86aaeb61a87e93b95430d313af5035b6712b959fabbb32c75a0b584bb1402ea5a412508b7d5a25fd754046be2a3d065a980438416af6c0001c47106b49b04b4c759b886ca4645cba9283027c3150a936d1613aabd8de04db4680b9747da939689c6b96278b8cc3a04f7bd3cde554df1c1a8090a756129cbd895378c6be2b1617b760e9f65d8ad9ad222f1be4d505facc97fbea44e31d41c5ed9e1d7675ef4703e347021dc1f0fdc1a8728de00f7f87aa2d9408349eac5c54e5a42facb7b0820577998d353c05af30b5851526bb8e38fb9aca040c5ffae7d02dc0aa30d47843f1f1bc7a84f882cf29d30771caaf8ac6af3f19d2b419e4b118eb796f377f90180580748fa61320fb37a2c3d01bf4ec41201c8cbcfdabaaaf673abaa8547d7046238459b51747a97180869ffc72524a6102c1808baf30a1cb0abf8419f99cc161615bc9f5391e11019347022707385a21eccd386753980b8d4744931a5259955177705c4743da4afe65c9ce671a6043cc8d494d6142887f2e9da272253df0c1400a147633370be1da1136106798879e39325f337729d32fba3cc2a5fecd0414f61618cd2cc89a45dc7ef6c07d5ff4ba4406e1197e59f440a0b203755a51a3cc4aad4a2b4d49da3fee403d34e17b666730b62f4d9ab8f88bd1a0a5ea0dce9200bbae4488a56cb7b5318503bc9761fc6c9e76174185f98a13b2ee7e7669d441f64920c4d1a1227560e2ad57759c9a7b0e4f7a453be7f94c0c13b36434fa52e311186cbdb19af307a20f96e4bdb11c1b301d86fac7844475403ef98b347513c08acfc38ab4d2317c0f57a24b3eca814978f5e8c8eeffa76e04991b941571b8693a4f5c92580c42de44f82c661c3e2ac5de8143e158a667a18f6508c1bca489fd1e47184b53dc7b01d35b0dc3c70a94cc3c518767b6cddf9b406e00c5b14e1c962482c92b888ade94e3c2bc759c997b7231d61b781259b0d4e50cdc84ce02a2c21cb200b97ed0a41800c14a57f44a3dc568dfa7439204dba40e1a12e305bef40dfaa2fa43241deda4762d85cfe3c9b1d94b1784cf8e1c8ccce333091e50db866a9c7d3d7d02d5e1e9e59cdc4e6ff67fdc5f367017083c01cfada28b9d3779b65937e7a016a7df1b447ca2ee609a0474d104e32fc090335b8cb70894a69a9b1bf266fecd73129b6b97bc625ec46e6ca7fa116681a07d50e86e6ad0c3045b6cd3126232e6b0e46be726595c5fb585cfff2340285dda1394e87d63403a1df3090693217750cb671a5b5a20b50e7e05c6492f4d0fe193bc826c5d3272405f734090fb900366d34ea3c24ce54b03c9d1859b20c6aa500aceb891bb90051255457f86fae054688712c2ff2b852c026d53392417a213e67b2fa3e691bc455d48715b47f9f0f67e0e007506f6dd1ee810d2b7163f9970160e0527468d3a9e0f53312e6745f85f105b400f2347df2329c52a4c2f9a4011c93abd250027c61c227cc955888a19fc08c60ad81028e997eb1b9823f6df63462e5b93c50a23d30b3e09cd3fbdcab1c34002d230801b319a291dbe230554143e813f789d633a62217fa16664f8b4bbb147506ad78dc8496771573f421f3a931008b05f32790c1c520121aec842e07f4d747a6f9e361f8ddf91ee836a1713b1dcb706c68aee0323d90eae9041afb69436836b0342fdf60f3954b0cedf5ed75c1351e9f6d84aaf9071338fefb30676284ca9d9f5b158ef06b2dac7865bbceac5421887a4d2af3dfcdcca00fcef314de63264a0f8d65928f12dd15086e31647b079c4ab1f9fd4b0c3e17069d2ec3da754390342f1a4c97d32b14e41c8f48829fc81e613b05119e120b835ee15bca61c5b7b35242faf1d0787a176ac96cd506c4803cc37944bf33d520800d1a577866cb74d0deaac64d18978d49b92e803f1dd3514f39f8de72baf7fc2aebc0d1aa03ea7a189549bf8b565f13c522f712d16e5d875d83973310cca3967a03a8413d36c36acf96e368759242326ef6feb841a9070358e889f30b2968d368d9ff5c829eef08f2d20b1374a1dad8ed89e7386f6c67623b5244b48db7f4ecdd4fd9f0c3de894a036b277c20bab3d41c76d43a9cca172c91e98dfb9c5be2b475b5e2ecce6c3d7b90f0cdbe3defa7566ba91506c498a7a31cc353c8320d60fbb98b1c9c78cbd16335829f8006fb75d9b9e7d6d867d5f57563987c5a04dec0d1af162ae4bc568a6f04ddeb9f30515fbceaebc372c331ea2c48a3c47b054c21a28d26f6c926451702330039413114767ce1210cc57908ffc408fb31de3f943350aef70f4dd825065f56f112107e354a51977072f3b5f3349621b5aa3360563404f1ab8f76c390526d43a9db028d10186f0f181c1ff51c68e4f71c9cd5e5c5d40bbc70019f1abb5142eb97a557fdb4813ef8c09dfca26b280f5273058ec0fcbe36bbdead870109eb1a2d4e01cb9f1b597b1fbd8113f68520571c82be31e3c5e67f516420e09b6141e2aab3e92f640ea0d95529f5c6eddb5aeca494dbcf5295c651665c292111eca3c120f2c9d0a5c41fccbda32a4e9838947bbc851dadf45dd087c8e7621c6c61576c6428d77adb659db124002ea0a3f6998cda9355f236bd28a19884431461c9fd37e7346241ebabfdd2433ba262856937a6e54e1056394f945f7777ceeaac0186da46ee12763fa1f373d758710ef3698e3022cf592f406a1379cb19248e908215f98c8b87179d99c95bd5aa3add6bf568aaf02fd8130c5afba894164b22d1352263edcd38770116d5cf9fdf1dd83169974633b63baa9dc150494e5ca7a87038889271e75ebe16491aec01269753202f7750b0b5ad4810c042b976940aa615283af121d8f6e8514e0ef2a9e39a00d612c2169bb75caccfe956b69fa0b08fb99b9b680f537e5fbc6fc14831f4832815c884f8f58c54c18c6a50cbd7ea92c0d8b7a8a25dfc161c621aaf285860befd2681b71f6697c2216a9638c8a4998e41cbc9578c600de0b4c499069268af71389c039d225092b638ee64ffd7c753b3d331e51e7c3dbbff041fc7299dd40cdb50afac11e1937aed79209ca673f8e2a4a3795b6a2dd5a9a0d71502d4f5d6404c78e2ec5f2aa184f6544545ab92d28f4eef7f1c00b87a7584669d8af085dfdf06b336ece40bdfaa0501f6285d8b2778dd264fe488b33ff6119956bea30a9ceddd517b8ddb679a2930ca266d6c27875c7cf6926fa5b9f5e1cf87690b9420a8e1a94cb4016d426f455c3e0dbbd035af83c495222b2b2c415bbb5ec3ce51ca7acddf401fda3b98364ae3c4504b62a59360c57d767c44be34cd92839b33afb1fac6e3c09609c4cf1cf02da11628d36572b56ca76f89a944c685ce591e608420ec8d2672a2fb9596c76519d62ce767d15055b422cf78b3bf7f32bce23be5eb5435de961b1f32c0e0f3482da02a581f877b79f0566014c37493b9d1afd1c7b50050953a8b5e6d1980b7d743e94093b94de1ce2ca3de7818d71da00190c39ed82e34ea6b7d7d5576be8e5faa0f3fa83080b36a024cce7c37783ccc17b4bebc55f284624fdf551b835d193a1a86ce1312b6c017c367aeb8c6e80ac3b7fa80852f60d627f2ca78a75490ed4f8bafd6904f9b9d7ee400dc9f72ab9fb8de6476d57fe1a74004b208dce00470f90cd062ffa1af0dab4ca4493e2e8ed49dc440144ca2a6ad6891a0e599e837c78834baa4de132bfc95d22d038ff100e67929597ef6ffece75f393514e70611da8681406b36386e526e70c325947d673bc2958d9de40fc04422369113a2329d894a47810010e181a627a1a1c127715d794af1e43630b7bb8dbd55aab242dc6a9c1580d179a9cae42a622e52ccb6bb2b7376cadccf4810c6043866727ae90454e475ba340ce36a64b34db5694cf204950028dfe88efafc441a83faad514117035f19897b1a1991625d0e565f3f6cae016984d96cea3d40fc6fbd2c830bf16a064bda3361f57b8168a1e67ebc07ef53ab9bb3ff91080e845106189f0889667ee1a9b24aace8ff176d311ec41d73d1e5af0a9408e528c29cef4862fdb3df57d3c752c0b33278fdcae134b68a090860135ac616fdf3a5ac95aded0b10443da524153c30a168350e6ef4da09ce34a861146ce638ad9437dc28edc7a081aef022a4e0e4e34466f77124e76de17a3cddd5870b2be814929065c921c103927772667a8b0642b960f1499f3ca14479a4cf808e76067ebc24f0255218523f8e28439a228e8f124d64e0ba3ae71990fdd431c534b60e3ecbc01bd8a03793000afd7588201c84401ce2e73ba3b4acac023bd24da6f33c4831b7e25ef3a915f00a1cac9501591a6800281ec80c8a080464f65a29cd334dc9521da8821e6e4875be720ce35e6a068b7976fc61baf836008b5100a103c910ffd205a3871164dadcee095eb67b8513242cd446e0631f9b6273203cf741681de0220a6bce17ef601085bb0148557883c6acb0e349cf3671c6a94054a9dd35729e28ddc2c724280369af95681b3807b1abdd67152db23bc147e5ee925c59d304f3d9edf9232a19d8423df8ce08332705e00f40dd59d05b1a4c1d107d8815148cd55d892948a195d74f0a0e2dd6c6ed0cf81c09ea8bd1e6e1155dd20a6d5c212c57e7f21ab937bd302c74158960271aa101ac072d6f7d7585675d7c94b6b7296c776e3defedf4811db44adaaddd276292bcc1b1ef24d85fab660c2d7a996af93d7b457773f8473442a14d67c5288e8fe7d36c6cb669747796620452e991e9f71b2ba7a56f8dcd1003997cd6527d83bb62533ac56d4a2a4f41925105123a1c7e0c76fdc3c04150c4144115e7343c6d3fb517f53c7342ad21c989c12592376ac9e93bb34791f590ec46da672cf2bf39884fe648c8a1d2c259b1affa21b70cb25a21bafd3cf64109d12ba5718c565551907f10c90b13130b94d0ad6b57495cc5737b11ea2b62084e38f50f1f4dc42a064fa5291cf54bbfd2496fcedb8f89dcf30055d24fb368868ceaa9829027a22f1555759a7883cece0b7dd470a8aadea0222ca2c1bfc4d6407270aa84e4c18ae49d4e2904d3b4cdecd54845771948bb7acadc6c84bf064fe9a922da0fb37e0d3694e0e43f5988a5188c35be0101f4c7d1ff7b8b8982b5d815ae0ce2eacd1968966ea453e367477ddd7514d817266f126ef8060308ebec3fa843d59031bc900791b8ba40b2861e2bf281f27288f0529d8406cbe315cd7865cbc861b82d4218b8388acd182614a9c009cf80410ba407ff900b7a7ed2c7223addc200c518d1ba1b5c26c1fcf6a13ebee3ec40d4d32b3564150ae8ae8348f1f1a9d84a155468b26bec5a9ff8b455fd3806822be97ca7144e3f134249236f71b07c572f6256b4666d262a88205f5823249a4eb9cc3483f20b571d51f9ba828274d4d0f8ba4fcd6ce89e1782f0b988dea8362182cdfcb82358da82d003b8952029cc004319c68d21e409d0fef34c3837ec42b1f92c526aeedfa87571f704716096783fa02dfe335cbd24380298b0ac7adcd768c61e53513e5d90589d10b8b9fc40ad454e1582253e0209afaea2217dac357f0e7685538e680f5960b96c8d1a0370df3df98c260682df508bf76ce4ae88a538ececf6d9dcd91ea3386faad768853899c4f514f637132a572aea7c60f3000ef011f385514cbdc5d2be5697a37f1f4b646eb955507c5c742362ad1b747993163779c3c160ab278ce9f9d2cd73f1337c1701cd29d6e686296fa696c15475189138935c00d80f5b059066e7959946856334270a3541f7228a0309b0396bf5d5b191189f0efd1f40997519466a19c7486225a657486e57b1f0d512111a989f22b3bb8db6a9e410a9fd242282b6e9e423c6f58715e08c1ebc12996fd22c0a5f23836f2596d8d6f24196d3f3ecd802166069d449de27cb8f36ee214182c3e26ddfdafff7a4b1d12d177ea50abe42f065bce1287e2f31aaac15501c03358a238774b3183953c2196b97f50c9bda2167f4a383c41726cf68620a7efbdb139b95574a1ec85fc199df4b1251d93c2fb828d0bb6db09f28e164fc3f9c913b6f07746890b7fc4f28e61adec7f46c1455c52d99c219230e58542763b801259a5249b2c87b29a9258a7f49b2487b39ef258a57cd6a3f426d9e158a76456a2c426d9e1c4ba60caaf718ecd78b4b91817b5475a062d05968a3c804a1438a4d4ee8230182d1df79fabd580575de01e72f9f79f8056c32c43394a966a229cf8568d9a37261c4d3cd80b56bc1dcc73bec2e9d18ddcb53d941614514752fe520de18a277801eb92558589d9ad20841c4c8076e9622aab0f567716dee937dffb3bdff79b69e4acbdf377beeb37dfe5ec63359fbedfefbef77f8d17692c0777efd5d9f758e18673a9e9bc52039af269572c92c7605b5e8b73e83a68f7522b8581925df8add71204e5472079463e0f444b81c3bbf4e23d43577c367638d41974e33dfd72d6c402e1efaceb0bbbb701b84b5d45b9174b6ffd6155f94c786837a5965e10e1bae85cfe4bd959f924ca2c5ff74196f0a38e8da1791ef343858c0ee6580330e4ad70ab12e6bcc6d15862eb6d3aa518dda9c47487869b672ac8b853dd17d20feb0a973e09b8b997ffb018b2e45b09518e2135a96794ec09fe729adec29d4ae02d8c42192ae49eb97bd33bcbc01d6fd7883adaac07ee13b614fe3b5acaad3e705a6579e3f0703ce36d42a5f20b4ee36d7b367960bd251a0f06934a5f1263cb49b77a4db198807829bc0de2312cec9c5a66cbf8fc69798abb938940916ac28e8889973c0c2de320699876afb8c7439894adfd498c2ca5a6998126a33cea1987945d44b176a538d1e77e9fca7e55c86545d5bdef7ea700c1b84bc4cdd28fd936057738bf747a41137dd3440a35634967ef7f8653d5a715efdc546d32b2894d920c4b108b8d56e7bb9d744c27b3ac94794dd83c6848efcccb3b286c7c5dec5ea75d4aea563995bb863d9ba4f42172d3b1fafe20719c8dbc2383f8552ca163ddb4d4bcc631711060f8a00ec73007b56e2221ab9fa51ce2882fdb4d54206c8cf52070e12f8903547bd06dcde4ce83ce3ecf7ae0a0a1de3dcbcb85db19df32a434f1d591e20f7ac510d1825645d8f6ad4c465d381dd763f580232c8d1832718c494841b3da75c5ca8a73f7e84065dc74cf8dbda6c7140fb6f0f170fa88f6182e3ac5c329268f39610bff48ef7028b5ac87e2ce74188405f0d070cf69d43570a7995e67c3dc9dd42ddd9c207ad0393bcb8650f5e48135669aa37d2d42af7aa2f1281f747f2f4738cd4c2b46c453881b2ba9a27a393e878f8a03657cd9edd30b67a48a2e271eadc34ac3bf7a53547fd3791c7a49fd0c468c1cfa9a56acb95050ba22b4a90cb949680a7420744733f0342b34ec23051d8e1375e80a45c528b83b53f5eeda04907e05873db983048fe48e9db34e9a2b01a84b54ca85efe676b098425a7378dfda0ca5328d52b57f1e1701c7b098c9b55b3a3394e324091b9b3af326207bc2af786fbbf6479d0c9d25e4c82d487f3d5af8a4b3178abd48bda11817885a2f9ae1edf1c940dce33fb8ce3dc352d5d25505be410a1d10e884fdbf0773322713a0fecde381f7671bd41849d2241742ebce7d5eb4c4750fa9b1f7c45ce80f884d29b582b1cd1591f544c771b7a4431bb275f96360bbda64ab5f7930928c4f6c1ee965f897e0b70639ba7bd07f007e5378f3238c21eaa872aa580c41c8015e034cc398e00276d930179aadcf25952e0b5e95083f8ba04969c1adb4bef5e43b695c8fd9557e2c960f847e918246ed48860fc88367d0aa7489d9368b66e14cfece8eb7e3b60a11b699297f7dd05df4f7a575e621942120085cc52006d835383f3f6e2a87216deb493cda4e5965266db0943ce541fa67605f113ba00daafc583b5e1869b70ec1e84104a1f5c43afcb26893e18ad3d1f6a2926d0cb173687fa3b1960da4ae39b842bad60aefeadbcd7d96e48e3e2a1e55126e8382e38fd9887141abc9ef848dbcc343d92dfda6a01cd5ddf02cee476b7a3283ac4f6d432180c42d849b0ce50149ebdeca40e76c0e98e59ba9fdfadccb83b8e6ac50b432340cf1f60592cbba03baa32ec59f625f00c29e0ba98763cae95440e55e0c761fc48afb7ec696746cd48d41c5287ba050dcd6bc1fe3f1782a2b18a6a22114c268dd906261541f522198560e49108645431784a9ea5045c158394462182d0d5520ccaa6c48387d81d057cb42462bcc35fe4641fe25e1da782791afbc5f6b56ecf77ff7dcc158ad1a947faa7117e9eac9c9f9a14f04770d73be58dac2089b1022001621d53b197985a56be7f0c9af6f9553bc6a8a2b6360ddf4d573da8e4e82fd4930a7fad75dc953a2b53b9776067f04ca118c089c7d6d8c88d7fc869b0cc846db042308a26a34f1143f82e6f60e2687f8a1bfff4c5a88ff89731856ae8b3d3bcf86e46f576e566449992b0ae64eef9769a8be4a83dfb4950c0123599539b87eafaa07733f8a2f62aa9a41dc24390fffbe5848619292acda74f35fd119885a3815f32efea97c0cba94f604591c142eeee8e0f911029d193e03999025c488b3ee0934542ec5bb0e1d5188348db0113ac60ae6f879f0aee2e21bd7ceacb0233a9954c5adeb25bc893e027dfa92297bcb15d04f9b2cea4164b4f5b68971e6dadfb1a325184bfd253cc0bf863389814424856aca2c0333d503222c2069fbd71188c21c61c2f74bb809ccfa902b3ac57005ec4d4b6056377332d7d457e634241e6de74c6557e1b35db4b9a5d80633106221d9dda40d8b29643eba2d28c9ce6b56c7c03d2fe6000664f1853ff3b0eac2ac3da1011161dec030d05ed3ae1ad2dbdb4344b1bc4aeb0dd03105e7a71cad52038f6198c91a26b31b9b5766839bb4baac480f3dc45393eb120a04c30c241d18116e5cab031764bf1f80c012266632e8b2fc69b18c778d6fdf39d654f54b7749f4c789a09fd1f24ed165a4aa3bff9582bb15ee45a2656a054d2a235e069fac79797435c8dc6a0855c3b4f3fc3c9caa1b2cfe658ccc17ff70b84809a457aa3ace6579450f2813b8c4ddfd49396c64ca8a46b3754dd303547c5728f82c0956b27dc58087f48bfc5d0f41acab90c89c2c2e66a3cdbc16f8fecb2a7226e544ec71c947b68cd0a585d647a8229a1db655296017fb154dda96439fd9339b29518eb14715837b69f24d88dda03d2984b7a2a622e6847cf65cb6a549632db97de4cbcb3679a1ee6e9020b149f1f941668d1e2dc256236ecdb207e4560c03d56264d32f381dc86e6fd761580072c1f5faf56f0665698823abf45864163c41bccd00b250cc19db42e5548e7082b1688a3f7153cf7cd078ec724c1a734bd74e87c1b33ce1bd17e9005991af6048ce5081eebe2baada25a677840d34625c07bf49d15bcfe3d2bba1c047e2bff8d44a14e254ff07a33670d8555feb24294484ff6cd01b088a9d024754e30b9531e160cfffafe1cfb8d1c35c950f361466938ee0a18b97356f37ae8e1f1ba040aa6123c7adad3e89cdd409e0088bfcd489f684d9828cde4f82999568d8c1068b7a9c9b347b83b0b0d085bccc4b0915eb43159c30ed20ab087af25adf1183cc9da4c4ebd3624a6b5354e5481633962af93c1cf4814fc9ceda15460dae6054d8317d81a41d7ee745a7114ba4fbeb1cf96a750947989f26e98701badd1b8e0076b54bc73f9e698ca76e83b34202d9849184e40886d91d9700e1873cc7b2f1ac94394e989d1142d3b0150da659b11cf902281c6bf2703fed602bece5969c8abbe02ce6de953f6bb929efda095eaa8a5285d18bc5982b6e9c40353f311140e1c3af0ac6042c44330764ce4203602cbf2cf3ffc951d012e60e01a8408851f914d18c34bd8388806bfd4abba80322902d9fc86a347550ee9588085c55c23d0f6621ba9126a31a8a14beab90b685a2c3e28aece6b5b0c4d8648e61f46f67e5a06af2e1a932f59f9eb65ef3e8e28049f3e6561dfe5fc757d2ca37f6cae479aa49b322e7df2560b8b88606602d73aa4077b7a4dea1a0219b6e584a87abb00fcd10050c50c6ecccd0126c80febffa0a55554aadbd63489c8f1218042136a19045af938c8a29273e8507b801fb423f7ab9d3fb4c2d6a0f63408fc600708dea59dbb3501c6542603bd005035d54e9083995d3884fb3eefe65d5afb652f99a0a02cb4e978ec4fdc1a5e5471c9d75cdb70dc37427cdbc667f67632021723341396b7ec8ec413402607cfc2963946fd30497b251d2aadd748f3ad08b52616eb5b039f82c844d0ec2afa7c3f8f0dd94b3b4825e959afa74765ef4d64fe079a46e5eee72f4929002cd071750e87c09a9a573952c983e10d5d270cb886cad4bd6c478822876cd4d92b4683b3226d6cbe06b2b0efda35c7ed75e676dee1754796b9fb3843b3ade3ae767fc2718549c648de0b0dcda15e35c19e4a5e818c74f8342fae536cc54f2356a5b99c6953902da8aab00994c046cf37c022a0ce42ea5a1436cdb4e0763ab8d11d8d558aa2126434895f0287085b0b16c719fa863fc103c2abc2409745494ad48ae164e16d94d2f786312d84b91e08239788c805b1775934095d40aa4522351e9e0423bb94ee095194d95c317d9bb35025262d42b1cbbc05ed707a8f22250dde8e2babb36a04a8b426553bbb0a609057865cdbcaa6e15055a53b0b886c1aa10a5082025e0a11b9c0ba0893e60260c4b67a0000992680332311c9d030300145103c47430740604c021885c00c681cf3d78449b20747d38a96ca9168923503d0d2a2c5e7a0771a4897e5d1129984d5d5e198fe02941f0fa402203e74fc04afd42781b976df4693bfee86c51415aba28210ee9eb500faab86f231caa0e5691ce29e1be75cddeb86f28e59bc9280dc6c67427144e958ffad04da2bea993980f9a4cc4876602f34991c17cd06410df05ef2026e7990a473ff373673631dbe186992aaeed158ed4671861d3f8a25ef46732a198f2439f3a7f0a88c6545acb1c39a6ca2eab55c586db26e7ca9f52f7d82c5435e17cd0a551cd2eeed96fa7cad826e32517151b02b98a68ed4f8d22ff1bf710515cbcc138238c8640b2156e11936d31079b1a1a0c1abbea0255c21247c8f00420b3d62571b6ec00098518cf5e3054b7ccc9d3246704457222118c4cf9ab1f403508232c4749e11621c9062bd834cc0e417343cc51ddeae71defade76e3cbdc391aaf93c60d37a41abb15046876e20139c5e2a27179125363844e52eeabeb788afb03bacb6dd1e1ae469366c821f6a4fc20cb423e762b100c057abd0d1432999fdef8b8922d98f51661c3ae06f8ffe36409190960fa4054f251976939eb5ab0bb009821513f7128f8a68a397fa8aa0196a2433e596f236c9a23ac07c7412a62a1e84e8de27937a9bc6ce0eb149840072a6ef1d5403dd5107474183a5395af9a98472e131a14c27334992824c0466055d3be25a3abc95dff5cd81358558e3ffc9f6f0104abb55f3e8c32162fb173f2ca5eddb9593b0106bcae9a5c34a1712ec0528234ef74640aa425b884dc778f22834406ef13443a86bc1a2730f3d7249945893552f7d55bea36848599f9381c32f2be72280e63bbc6b5fecddcbf5d9dbf40868e100b6c4a2748f3a647e132aa607e92653ba6777c896f06a76727b7e4c96c0563320bee75ca466c554287a7f592a1d6d84dd2e9333cb2165936552e341d6064d8736031b4c94f3b695a7fbca2fe017425658bf7e4ea11bc316bbcba9af24c2b9dc9ce20e370bb174da54277c795b0efae75ead387113bd3d413ed916989787e9ecd958959da38ea24aa2169b5748156c1e52804018bc09e0fd8ee2ec62cbb68ab9de6f4100049577d116e675ef4921d9c71ad378c9d0953925bdca133b6003d299f3e3a131ae2697ad5b734e2acb24966a34da17b9dd9460a800b8a3b1ad6caff5fea8980f3655ec72446f97ed73e457e56bbb7409dacd74e7e12f089f1095e0036525100e794e7c887d3d613778039430514f72941e6dc24b03a81d1e199f3878fd137145bdf36fe8333322448626a2bbe1ad5aa0aaf5af0ca3147430a702ff67f24142f1f99977ee3dc79950191151855e279371f6df86928e8fecd2390df329d8c1a21abcb8a67b1733b4a8a6c02b608c87c7ec25ef07ef764348e4bc0b817e0f01224c02f2f6aa3728238d8b0c1d634efd5c52328490475d331baf578b35da1b24d3c2b84672f2e25976dd8fae850a218f8bf698627c5cec20d15a3c25e945ee08c413163929539dc45454d0984b42776830560638dcfac48106b8c483a1b96bb2871271b5414c798f9f4147b08659883a6212a3a06e88fed157fd955279e989034f00063bffb50df3bf299e78f283b9d4f234163cc833b006b1185e1e5d060d209ae221240a3f162814469f4610de188a450d332114c5ef35ef5ae3408d767f2546e8dbd87e0ee5df60337e8e0d5e9a97f6f3f0c1eb9dfdf043791f6e59423cdd9cb398862e2349ad28db423ecd61a6f963d8dd77d625b589ac8fb3af1b667fda4de7bd149dc519a42e1e1fa14b32e08dbcb86faadfdcead9fd8b44db9b1da22ee8386270b0d923c625ee1b62db5872e578100424b7beef2b00d3a29dd10bb158b34a1d3157f4bf7823cd18d30a202bfae0108cf16087f52f34f735083f5924e2218e17813c72e86ae3c33c5c2035f21d8d0608d8a859a4901e8a5244db926db8e147138f50c174094fcfc0490f68d32183050bd8273ee1d045be8daed1855a86051dc59128a1bd96f11be57074b13adb55f101ffa37b1f3e40c0ff225fddddb7adf1ec3f08e3c716ebececcb067ea1eca924e947ef13f6048491e1c61ffef673bc038311edc065df221dea5592716440d9e493335e8c7df14a75412f30fbab654ebf21fc773c206e7299d81b3443f52facd23df15830d333cc60b92ec895bf0fbb0b3aa21edeef5e4672d6fcf97c769eb847badb39c64f118e294a13b7e7b2a48abfbf794ae21be25260cd61489641ac736ca6375f41eba50b29cf320845eb36680ba03895a377f8930fe4282c52702655dfcca53e78f77561ed7e909123d9fb45230508713df1fd39541796b225882c23679fad5720a70b5a89a78681b15e28071dfb2e7e2abf06205e597eeffeebf7e17b6ef1ddcdce2afcd82045418e84e62d6426e85ffe0db32ac2273dbdd57365f5e6f709c9c2d3590b599377b1c155c9b0fc7f08628ee53d19bc25878418cf1de0e3a08b2c64f240ca68b729fdc5b3b7262ac82e6c10a87b174bb45b243a14954d944aea675c24c78955917c37a39cc3f23cf33ec484ca93e1c539d2dab7408b4082aa1c22f29512d34f58a275f9107e72173fb6e25129c5f09fe9a9178a77633b91b21a394cbf1d9853eb507368b0edcbee0d6a99875bd51fa5aa4e615d3d320da9f89882f50487f2dfc8d3e922a66512faa8611e60dce728822330962d85f98462d57453eed3a54b438e173812be1c36a149df630f570dda7983ba82a02fc1d55f43a0ef4eeaa21db688c5fc6ad137478a377471d1b08a3c19badb096c317d6b3de5db90adabac88ceafb490b46fc30a7b37902631aa8a68c1ff90379cd94d1501bf9c1fc706a9e12a3613c7ebea13d19cec1f9b32983429ddd8a0fd4000fdf31fc57730e2c3dd1360c237bd752e1f330b9d79f617e9559df21190fa919e71233c146238a624d717225811fc3392a60442027f34d8de3924abed2a50e47838db258e869d8fcca4ef576dcbe63dc9341ce88cfabcbd854f48aa33556b34e8ae54998430edc99fc4505e629e446eeec0c81027f91619d9b3d515cc7e9aa38c264c2521a632d9f63e4eaa90feea8d6a4759f3619b835d30de958fa6000ad33f5e34c88d497d428ea1a7b1976de96a12eadec3fec791db5ab18c513b2845261faef80cec37f04da39e317d38bd6a9712ba902ed7441d2fa1018918c5d1dd89f30c4a4912704986e53f43b74bb5cb16b663c91cbfa6c05e2b8843c0c454a1a23413764ed985b28e6dd82e87d821f698096c5b800795c22a9253bb7a462a701666d1a4a8a5cf2e7b3ac41c8a35aefa82163dec1394c699f88ee6a68f5652141a5558ea6d1a67f01a741f69e6be1eeef62ceba015b5eb818cba0be228b9a9db7ae3eaffafccb185e15f8121be3a71c1c0182fcc700552a998d6e6ed05a085dc0fc2322bc83aae657369a16041ddc894a612b24cd1c050b2c2e9efba5054d92eed02a260efb76d88ad72f29f0e8b441a555ed4ba65718bf00b725581a3a24c98dad144a1455a1f52fe92101724e787b9b9d809662621e1abb839731a18aea2beb02cc58939d681eda3bdd036aba89e703551e84044bda185f4f44d87e40727f7de34d01d60f1001e879eae6f737ce2fbcd51ac1cf97672508a50b83c4c3f5523cc315d504c7f93898b295f0042e998bd85f2b71014afc4e80b9c70522f7f049f4694a86c6b331f2867c157f3761676e585cf957d46a7a91c8f99a0539cb5ad87c423d34319ec5ed168aae96ec40f41c3ea1c8fccf6e3a96e9c0d574b1e657d9f1b36bc6ca47e86d614cb5c3a010a24e1452677c46ddcafbed505cc77724ce81463144d346d033c7588b379ee300573362528a7637191136f1b027dbf4d3910c62d04ecde2e7d8417a54e765434cb9907a966a57dd10f432155cde645f24e8a010f6c30eb8de9bce98641bda493ac0b73e526cde24a9d470ea7a95245ae9abdeafa4b6a8926a68b3469e8c3d3e246f6aac0498f0fd2b424561ba36675bf01f354e24f630edcac0083c170b26f0544136371e72b60e688212763ffe271e3cf6b7bf941a4c7f0d80ed93413b9fd26bea8d3100e6915604dbe531b40faa11427abad46a4c2cfead4bd6f5d0d0bfbe714dc97b1c0e079204b643e1296b69291b4aa2c54a71e4ba4451ef65d9204be4d3aeff81e89cd462d71fcfe150916e7c63a8c8bb0b505a19cac8c32a2e96f73bcb8876606e4f783e49aea3f6aa87a15406940bcf36dbb231ca89abc78151bebbed7e0d9330294c8b58bfd70d4c717ecff6289a3ee4668ed972a76c18dac63b553a94f13518d076e4e20e85bbdf88da1234a5cdb34f5b6f6da3074442dd7dc823d33111d8997662bb437bc9c91161124ee8427c1a6552898b7a61e2493fd476639ca229861b224a52de76637fb90b97efb6155e304fd6862283daf4179a5a750ecb1d69e5becc6517636fc95d3e5a30f2f161ed04fd7c73d1afe933c3989cc364d1c7ffda39d036b487002759e43b44ac1b0e7d12f6401883d5d5f05479f3407b2b75076a8852c003704598bdc53238346de03dea3e1b7168f317fd2f20128d909e62b81778aec42b64d822dd013b11f4ea91cbe27cf6db5e6efd1af9fb4e58c1d805254e413b1043619a50273558364aadea4035ed78cdb384e784b359e351d76812272c403933ac82af808238981c69887dc37b6c8db01b7a4ae9119b1ababd004f682bd949ac49eca87c53227de518eeba256dbeb5b49dd2a7e4699345fda66ae3134a1a57a715e796d775eebb084b1b45e9ba78b88111b31fd5095864e659a0cf55d4329d76b37e3a593d348c3431ea5907a69a43099122d03dbc64b90b353ef156c4dda24e88db6a410700c9ad7d649312b31f33e8a65076ee0856b855a76db56399640a15e68a57bb4a5130c9145a6bc892343bf9366c91bb27c86ba4311a33f863a45a3d4d75ee764cc62092b4d862cb6b0d226c3f6faa1048c911f1f24725517316b0779f395db9557a1caeb2b0937cb3834a58cd10e05a222da9cba35a9a86e30aeb5dc65442d0b1a6b30318c210ad2a994a7d86056207db5a87271c83f9306b2c6faf657ab0c7293a2ad1182a396e8eb1afaea2f988d655eb6f042df9759932b2a3038ee18be1088032adbe693bac97946d60c668464860300c63bc6f9d3f1c4a0e84260b9235e5f74868fc5416d48be18ce12fda2db96ed7bad9e3f2c3e7ff1d54712da19214dc6a313d6babfac6109c131f59b0773aff925e02b33eccb21f7d2209a9b981c5b7757064782f20e77ccf32f61df37f774b11a63dd1f3101479e2216d2306ad358f766de988547c2fb1b8bffbcff35b916148f79335d01b69cb3dd45fa3ed54697cf3eced0e4ee931b3b33c35d941ba883d228bf75ca0c77b7e2a331c9181c7e32a867c15df29617a517258ae38ec0a96588e36b55cd69c2558cb4c3591b0ce3ca12eee001d75e3704a17f44f1b859fc0efe84e8639787c5d29f5138e3a623e93ea01527a579ccc1870fda9864fa4fb86715d186a86e58ca2145dcc588da1a687e3860e0c8f0572db4f5da72431386e0d7b1e8da8cfaab08316c4ba0123eb0a35f02c41a065f181327d0dc6450e0da25d40a0ab266316d78a1151716e8b3859257e7d231affb4c80021992ca5d4f1d943fe091fb77122d95669a4bb17304f2ec98ed8ef31caabe9a641c9b09f8c1ad72918bae3e51b0005514b8d97eff7e4809e3c465f098498eb47457779847b1c87145665cd9a567519063a4e98fcebc9649af32497151c736f297f8277877cb7b24744e983b7f104c75ff61628ec528662166905d9a24bb1d3d603f90fa41f1c280d460cad3012688946ea818cc765c0da12aeb6474b0a4f68277ba918343a1cfc9b5a8b83491ac78a98673aab54c333e1461835e8940834f7905572cbd9b654366b8f215b90853b278bae856012763d44805f8500ce69993ef869361b204b5059b51717e4c7a8ddf49a41727183bc4a6f710617f4ceea5d8e9d611b4eb0ff5e4821396589c831878c2b8d578182d35f7aa218b59d390fdca0215d9c626f96a5d9eabb7ddeab558b77412a911500639c3937611bf59c113ba8c97c4173951142dd23b2d2a0a5816fbd5e7729be630878a43f4ad905efedd21aef7e28cb515c29dd0b1dd0e8a733ea2265c5b0df78f510314a7959d81d96813783a3264c93eccb496cc7ade72e5c7ecb4e4e0c24c835903ee77eecc65f7fc7f65d4699e40f82654bc65291c44309aa8d95d8adee182871c7abc8953a6e35afa5bae08b8f9cc005cdf8906df3f29dadf92a2234ec91615a081ac19952fe2d142f01a0b44347511908649e42c3cd5483aae91659442474c7177db61c69299b10f1e6447da032e7b3520046df19b1274fbf36b1c55df0712a844f036779755123210ebd1997c9d95f5a11fc379aa080a0ec172a60aa90808f20bc3d0bfef405e00faa5216a49827e784a3088f397df18051e0ce30785c337a261f7327e48648f4f389af37599040de882355d5763d48d8d9d036d7ad7fecfa288065ce0ba0a4b92ab925f825e3c8eb86322642ffb60b81bb0403063f025a0e379f9623378099a50fdfcd248c7947a55d0bfb99d0e9ed04abca78e0ca104b3e6235984ed501fa3a9c3e94fe8c0f3df61db4fac7f4cf06b89f68fbc4f044540dc40c40a77cbee48bc0468c8d0dc23cbd2cc89338d30d73b0b4f90e8aec816b603da4ba9347aeacd60ed79ec853514580c9103b6b2a4c3466524b612a0589aedaa945a5241faa5e0cc36b3c60188b44d08a183aef4686833d4c5aa40ba71b40ea821517ef5d3c08400ebfd7cdc7b6ba9c396e0ce3b3d92f16cce27132474733a5bdfae9c48f39c14d0446f2880f5a79d6e7b80862b7c9f95c553b7955b508cce5bbbca305437aa41413423a8df45088e2311440985771bcf0098f0432c53f48098a53f8732ce177c240c4966be46681cf7a582c942d37ec4056c6c76e668bf1ac8fb2561601f7316b3a176bc083f9f3f1d9ca89ad87de02af0c9cfad2c44cc1c46de31e17abdb549360098bac264d77a2d8793e0b476bcb504dadc43331b9f405eddeea110cadf542f26ec3ded2bb2b99026077a8fd8745b1ac965bb5bec333e4a9215bbac72267303bbdb1b978e50b60d31d04105764225f880aaee4f3c0df4eabf99bf3b106a610fedb5af4c9b0cf86d4c056be6bedd199a610f10bb40708c5fd1ff2c2ce05da8a72192b7b6beb79a2b6aff3ede6b3c59a3df474dea0f1dc7cf08610a921176c3b0e27aa0251b50fd33a958467a3f1d61f91b242e2bd1a27c1c3956920063a5a7a57b126268460080042e69c1da60d36a1aace23d9e4c89e4b563899e7c4c211010670b2ab35c51a526149c8120d0ad687aa922c5887df298f2b48c6493414cd57cd66b9803f825c662f04e5d94e47d33fcfabb48b593a1b83760d833272b1c1435e98da70175837893d710ec0280e5111c0f60152e95e8f92530acd8df0a4fed15703f754b77a62c97c0e9be7400bda3e99220418a28ef3718010306633b315531b41941c3edfc01a0083164226267aff7d334db57dea3f34e3624c9be272c9371320f253f0d2c763aa98a8e8360d09e6874330643152cb79fdfadcba709c078e0b0184bd884bfff9ceb1dca0430b793b521e2f1f97287aaf8bc3b2ddec0ced00f2e7398b5652bbc27932e3faa186cbd7a7d82410c8a1ea55661f02c4ac29aeb68bc3c48eda1298cbc027a7e1948bc5900b75c35045f83d554dc207729c0a98ac355ffdbea66fa1298844b31e475b3563f18d17bbd45fee9f04e934dddeffb8136c3f006928f7026d82a799d8070e0b3c93114e7a52238228efcb3cd394b1968908e039d5f5d6f64699065d1841abea96ad7b768c15fbce7b101970f403139f0b71e29909f4ec03a33e7b77113cf55d003ed33147b5bb40a07cd2698ec07327215facd5758544d1623f56029ed41b3cfa85eaf18d1bdca9b867de49ff3229d58a9a3032cd47e2a811e9fb1b9c098576e8e7930e6324236ff348cd53cc9583082f37715b472f722c66681194ce38ff9a546477d779a329e60ccf801a4cb29443a808446d1e2155e84593ff0cb34f0fc54bafe66dae627015e60a887bf1346ae4c9b674724ff12631a220bafbbff0e84595ebb1b36487658ca2c811d87935f38a555daf1f55b9b35a99bd86b2fdc5b1a55a2d55f2acd49212cd62f7f69a25c89153cf6a96895d33625c56b273bc836b67dd8b42182493acb3b12a21546d3199eea5a302b31f3cd740fd752e4af7e51c28c312d751f81e48f7ef540c3874ec63c6ba2fad44f5b80900a593ef1c293cefe25480254b38913e7585596ef050df56309e6def004bc0f01786d9bdd2c636bba046acc0e0e18782497bdb427c5e9fab5031d52d4995842faf89e1c7e118d9d443019b70efd0ac35f7e41ddc18cd9c5af4f8f5246e5d5094570c3d3c1946828ce8b9d97c4dc6d9da683d0c9ea056579aee0e9b095de5bd155266af83a9aea62da601482e744f010f604f4facc2851459b57e43d20bf5d6725bf96a0124903cbc6ce877b4cca0f2a90b502dd676f20f5f6eedf6c4ae72d95456ab09965bb9f04cab52f34088fe7adebca3365810d39186f5fa6e1660453ec439affc24b58fe9587c919c5426a5d281311335dbba4b17746ca9155731f17a42ace5a2db1ef69adb53d4a11749dad2f935bbb20d99e08f654891c2f699126983dfddee4deffa21b8384807000745893a1be45b4b39ca35f1168c497208dbf2d50d1e9caaabf4b7f24548070a86044dfc94656be9102ead399d3c908e6b810bc90e797d00f652d5ea4b989440910eb0de7729917ad3f95190dfd1ce6238817c5c27dba103a4ee2ff8cad596500a167fdf4b1b1f3829e28ca97b60cb3905edab72d65f8ca4530c81fbb73064c97f0dd0704e2623c733209046c43bb8f6ef2ba1c98b6f8b1ac9b41e35473a17cdd6b35739d8d0f2dce2b479d5932f8cf75919cfa9d21e5428ffd5cef77878c23c5617d6cf41efd9a09febb96b8d9342681770fd6fda68cf32beb50dacc434f4844e3372b9a9e3c89a0db35547951eab4a886b125fa97ffc302c90a00b634dff9d5e36805baf090b8d0817a32291207c4aa01b25f3bdbc1e119f60ef8740b3db7035de16ee5b4b53e946015747e47b98243977279ae53804e84185419488287a9e275e648883bc9485d6b08ab9ebe6cc4543325a845b432f8f89c743dbec3d62298179ce2d69bdbd494229307032ca9293ea5fff73be9029c5e0a0c27344482c82b33b8bf24701727aa8dea2c1b7af5a9bf56702f96ac35ed58750e9e6698ac75a19e9d459ec28e395dc269893b654b545b42107ce3b822dc0eff91f9ca13ac948e14ec3212f5c104b3e1c1ffdf5595f047da1471d9f4934d169e6f2c6b87b4dadfdc465151cc7bb8458eb5e86f9e9366fc0a7857287dfb99d15a1d4b9a06cbe013256797e9cd96b62fdfee0f837d6487b258de09d102da1bd2f29153304b276633ee2dff1f6808b422946c3c90ae24dad5b352e04a88e42b6f516b7a0eb0cf24cce84385b68319f7a7a45568c83f1126514fa12641cee0a6f811c6889699680da1ca11c11a11b7e658bbc5e6d48cfb0c807398abc27634fb3dd81b09f709c798cc1c34b0b712ee7437e49368761aae2c8c20704ccd8206d9e96b0ec813acc05f40b01fa275eb210e6a4154605dfb209251cea397c98180224a0deff93e7efc8877998c71c4f0af22d443ed710689551cce249824164825c3da1e7050266be23e6239586643af9684ca2ae6b67ad417899287878442d2dbb7cd57731030e4d67d7e2289dbbfd4353f91a07d4587c39ec18221487dec76244556c1deb516413cff0d0b8cc387e8faa63fed4d7966e69f86b1a93c434e60efe3e93d54e04b4eb14d1c56f15a8ef3e382b2ed1d1ba6658172f8e5ce620759802c15ab96257850300bae07291ef344604bb04c859ff29d3c582c546e86da8c0d4b8b5c1951caede42d13dc64bfc8b7642352eaee307f2c8427b22488b1356c39f21a656622288481f84a09e9ecbbc83bf27d5896ce001e3b0348f16148cb238b27bc0e86953455020648287a21a694a818a45fd5f709dd41146ccd55980ec90e731241e35c4b854214d4b27901ba752a83ec199d592cc9ec9383a4311ec0f4e8b1c9274de2ee3a3609f446be7c24c6d3570c0594ae3b19c20a96b5e04200e7895fc18ef9714e44cef9e44cc52bc6cf6f1a05a0d67d98ea1dc057aac1097b44fe26557dd708a7b348aae448be7feea6c387759483524017ba0958acf3034878fd49f9c00836e9ac8ae14af60a0ee67e56c192e4579440edf121948c5aa8bb01d4ac0e4643749fd22418f4c7f743e344e6d83c4fd7ff5ab9f2a88e7541c4816ddae967466926fecd3dbc2d7a8721db0db7fb5986f676dd22b6be91ac5db432e20c761e369b5bb93f4c64f84c7001690206ad4c6f136dda3b199c98364f348f3bbd1008f3601228e6b6a413d45158d73e42978d3b1b6a740d96318a160a88f11d16c063f338a08ceb1b0855a08e20900e3eac2628d32ce4e27ffca56d4c8210be16a36c4b654d598620bafd62be2896720ea2da996393581425eac7f25d09f124bc31b0db36ba1189846d1b377ec5792e189f2efafec688ed6fa0eafbea203261748f624d807e08bd043b7f9e855518aa69eabe404c36dd724a0de142960410a89b68c0b0c297fc5b56381f45dfcf0b4a98284558d30a8a23195159cd0eb591476e1ac972cae787537e038f048a86050bd0c817d14c8e37af6adfb39f93eaf320564d55708619b555052333f273c5db4f1e3fe0d7ba5c54235f103a53bbb62961a9e26b7b94b032ef11c6937d11b07592de0d5b5453888428619b0d1d79671a7e00d277df51d72052d477a28f03e1c0b3ddd9bbe595362c0aaa5da2e6114dfc61db06622bc990ccd75a945ac6fcaa28ddc5159103cec84ca21b6d5cd755885ad3ab25160a90c28e183ac251c2f1851b933613028e15cb8305c0575e9fc7ee9bdb60573b1bf12bf5b71297f1ab889336dc359d78bc2b29508b9ac98b729438a33c63f85584957fa01b2aa25679909610f0d79a65223135ac0ff3830b32447f3d99a54aa83e2cf88ec49046b002d3f77e6d6d0392f822aeaa2517ff1004a3f4eb252e399650906852c2fb6da16bb2dec31f69de47011c8e8cbf98a8d7935cfa7aa1b598ae6c5a770053cc78019bb1283e483858035e5e7c3aeef233ab4c80bc7186785e5ee67515d883693ba3c5315e6805d75e6da150748f1c1b0e8adb6512832e358f131494b28136db1155aa9b9ada90291465829c9e87e0e19e5bd064bba3cc4ef8c8f23c2be8fedb235f3e3390f08379853a19fe0f701364afc89e3153dda4926f78d40645a38ee4a4ff21131133358f8d3400fab3ed1452819a3dc8590e30e5917fab2d150114d5060856968d11555bdb7aa255174df81647c40492724359f67e5747527efec5df039d812338cdea26d2dd9dc781343a884713acc4469401c560934c3a32fd35b3a83a76d1cea9a2a5c73f857b13521e8eea572e6253fc4618309e90b59a623b1ccf2a678b6017917acdca1dbf519d3244b346575d3b7a8d0fd49f8560b872163f4929eb6be61e6e2250b874db26a79dee211979747da99b93c78ea526890aaa1137c815705b5954e5ad7c70735dcd46b8eae3b1881a0d136093ec8aba2caf7640b0daf5a11dc2172da50bbad64e5a049ca0b44a62b783d32a6104e5f4e8107003a815c58fe076f99a2c84a113d67a1e64a45ef16db4b516135ebc5707dcd0846b999e247d889f25b12cb60235eace9f4ef7fd50e2ad4821f1b6943539a48750f77bad9b771727303bb0b7f19145f9c4ce66f62a2a367bece286cf5cfbe60b5b9ca45dcb2c345e0eaab768de9f4b842c0e9b7db47fc2fad3c68db9d2309fbf62796cafee775f391198a0a0b3b9d1be50bccca775e05b3059b420762c01e9dc558a8a3e2c2c3075a5da1333b374d07915d91d75d72277301e3564fd0eed2773c30adb845011137759ca5d3f28d34953b0526e582143a31825ade33e7b3ba9f7a8990c7c562f3019999fa3c36209caf0f0ac5b3b20235bf787ad9eebc1351b585b41f0a7b715076bc3af219bcf41b800d6cc3737b344f4bb157de637d88e4855a3ac0126d8bb55b369a561a68af9cf6ffc22937bff5750db97a371c68fb3eddab0348c75735a636922215bab597d2772dae0da4ea65db6d3e7defd7104f9b716dc09f6fb5486d1c71eaf1345290e18dc8bd547ab9d0a39840eed599ba2d2933864364eba85d5b5f3a12a92ae33ff556ff581e63124903120a91d5813dd779f2cf11e06355a8a8bfcb47fbf9d3d3c11f50f5731ac4fcb3f2f9f92762a9510ee01484bea2319b0eb83b0562544961a76f5b6a5947652d4dbaa5583c3792a4ee803c976e9d2c1757424ffd40460c4c86124adccd43783d25051cb3d1bea0e2591c3db4c72123f5638a70939a52d6920f044da9b747189d5874c00923e637b32743e65db6b86bd0efefa67d191cb41062e9871378cf71b4b18c30a1a6ad10ce822b00452d80986bbea83e755977e45bb5e1548328454c29ece273bef88a3739cd9bd3d85d07b1e217c2e32daf1836f474bf6218d424e49d447a13c1217e2255337e8157a598baeee0329b823ea9d29bde78873cbf0be0253686d80ca4a5978354cbe32b1ef915f817a624d4d374a38babe84af0ef552b2e406b50bae97012b0de089b9134c23ca400b0e0c5cf6c70e83ca08c5602c056219dc4cfdec15f5e40ee2403debda22ff1dec255ece8b6945e32da148e1aa68dbe06e7651a0fcc4299d31418e274a57f0531345b9151c278982d30a8e5678c7a7ae82bcf82badaf6041ccf8e2df2bcddeb77fa114d5bcd041f944b06ca82c91bb3d91e808859aa127f4aa6a6c92481a74414e04fb881600a5fe22dcd222d4120d9a4bab264514f060761052ef8f2b723ccb82d102e73b344fdc8f37314a075477eac49c3d381cf6015b0d02eb37f16a290566c68f8b2930ce773868e1606e8a190469e6d1ee2ac095b960050be207d72e8a2a26dfcfb7b5df77011f7fc1d257f304755c60b62628aa619460f134e081b3d20e6a24e06b3be4ce7fcef31164b4dd78df04607e1f82d9819a1f40b6e0378f0e0539fb41115d00e3f3628b8d471737e0c6a1eb398643950df100fd186a80f50d00d694c068882e7e4570fed53972ab75b7fc25b2254af494e30088711d212ab1d123e995963911ef1464a5d10da4d1784824e353f0da86d99362aff8517ef4455634b8bd21f29cc9f7acd06054609e667c31df6a91747fa84718fcc528aa6e7ce427be15b906f8ff586de0e9c14170f36f974c27bb82382f366bb1f67e6eeeae473987f416779d5d11ad18c00ba0d6792863230adab59aa31464c9ad0148ae083a8079bd4511945cb1cbb8a7290ab5cf2b729911e4c77cead6f98f82ede9f876fc0c64b7922072a3fa67fc44cd4e82f0c03a99c36644bfc167d6cf1a776363e555b173d46310b257281db683d73d31815f5fc70dc0eb76338909004c7ac51abce1aec1fbc229b4b010ff35102b9afc307105ea56ace8ef6f25ecfa7c05c4e9b49729d123d0539f35aa8bfd2cb55c7ff936a6132327a092623a19355e296667d1f731e583860fee4471b873fe7984a6e4a7303b515482df1fbfc0bbd64c7fb4dc8e31358e5e69fc79074c2212073b21834a8342436d3604f4b1e99c0c9aa4e62dc3c203105e94b4b5deef06057047e3d0fc6788a23b7b034ac14fb8a89b36c2cf5f64e07772df3717a748c836378ff856e430314ec49f8d4411bd0c21445518873dca6b971968f21713260b7257e9b22434e2466bb51026daee753656c5e15330ff02154d240122c16cde00eceb6f81fc40c426385ab6cc522ab0f49cc6f4d10a59d01f49c55db168c0bca7f9311b7bdf881ad0552a6e3f333e69ace51aef89364f23a2850982c1bddd2c44d711a897767a675d985cd1f1aba7557062f70d1c8afa69131ccacd843d406b3a21809c886ceaf18a9d338c4af905af8f673613a2a62c0615a565bf49152b98c647c649453c73ac85ca32e489132c29801ab3ecc4280e2c924c10e36378e0e13ea372a954c86507d21e423e7652a528d71a6a0abc833c3f02e98ae950044705c765147cbef562bba2d9c66a9abff0337bd4e4231340e6298d407b17da1cf92753dad4bd8b9e8d68671ced529934480be1c252467bc720fb9de12f1e16e093104b1e5f080b6d178dd0e6c57c657175a7afad5e49a20d44c59d28505e77942f67e74e0b73af4bfcae508ad0ead7ac0d499d897a8c1080fe40a7970cde4230fa89730883dc5d16420b1fe2d6e6f42348e6e5d568d3ff74ec2e3cd98020fba10a2676ef399fbce121ce71d4b3225f7209bbc9adbbbccb3ddf6ffb31c729074817d0d65bf3294d6cb69dde2324bc9b971369a2a9e88dbf61b38a57391240d35ba2030e27ad6c5b65f0281380a70bffd50a78493312d517b868a2db2ce5c60b00e740a624d0d87381ba25c67654e1f92e008b169377c2b5f0a00ca5705cbe6907e74a9a46b3843ec3acdf1c9224e7b6cc4fbefe1ffffd2919fc6a00c8383649fa0ee8c43ea0a4320957d3e2e8010edd9949326477ebda1f7ccd9dddeaaec6236d7667300bdea321f5a2ff51d33e414deb3e0d2b11f5ab27891ad2bb442b56bfc98f6c3404e5b6987e88acdc413757074ef4eac0cbeb619efa7da730ad9edddc8f07fed3bb2438e33046240020669f2efee05ffe94f2b78714ae880307d8512a4866d8f60530d565944c0de5fb91c7d384bdddb41eb2f2663ab666e6826a66410c73c1d4ea559f134204e0b5d320b8ebea9d817ed22cc6f8dd044d376039824467c2cb684983ef6b3673ddb2e8d16487c0d488bf7241fb36fa8b1159d575fd6de68eb608a60b1aa795d5cd4f2a339494b649f5ac35f503ccdfceeceb88bb7ca0f790a2f66d91052ef01150398700747d3fa04b8e4e5dd55d60a2a1a2fe099c3a99642afaad6317d5bb41a14bc59d459a8480d865395a5c10bed4d87563405c70b87987e3b557243cdf3903c306ec3974a39119298687b2e21ea1818fd84af4405c5f2be6388dadbb4fa9e4cd30aebbbe81dbdba6d83720b8e6c9ff9a92ae255b18c90e4dd77cd18753dc3633ca862439325e7b6f32c12d0bff3e3940ef972beaaacdbadca5d12550bb812036e3e5f6e3994def36a7873d7a2d4ec1dd9d8a38c68cb376c19b77d0f26946357b33c3c2e92d753253205d396d39b2ff5454e4c9e0f51164d1fa32e39cf6385c9a54de9378757f3216d397fbbd508c5f9d11135ac628050dabb155c10f30f575656cb0d8cb3322b89e18fc271e40002d34d1a6c2da61e887fe5f1b8833180fa152d5cce920102ebfedb59314b760da771db161d262d66b870383798af90f22de34d137285e8f83dd00c4c45b149c9007fa05529cb124a371edf60407005e7dea98ca1795505031bf0176311f6dbb6cc2c8219c398ea171d4c1c4245a64a989f829ef2449fb5b8089e6d1e727e66c23ddfb6ce217541c505ad92e8c49f2cd81a79c8ae550cfbd1edf2a06ffcc8e5a1522b758e79f20be1cdd589cbeb381c760f7b60c1d7f3688d73cc02ecfd21e49690366db0785897adfb3bbe574f45e77594883876a7ad37f0d34ebbf092b58237805af3048683b6b101d785d4741f9006dbc448b146c438f765a472baa5633061247b1758e0b663f1945b79c83f0ed39b5273f4097eed042ae93eeb6dfb0f37c6ca92cc4b59289f0fe58fcc28966d66b22ea082572a3a492980218d0d71595ff4d7519eb76e1d6428a565ea06e5ff4049485fd1ad5e9ade58045db954fbf7884145111c7d7adc42ff479dbf9b8765417692191d55a034d08a1e6a6c196daf7ede2ddbfe91a49d6d453c902331308706c53a7bbf458902770aaedf85d5bb14f2845324c305d85805aa18c8259dc1176110207ffdff016762b601661c632b79e18c56855b18f80566c230344ef09ebe4246acbb4a00bc4a6f12ee49725b862fd675420e023c93f2c0a68f370b5327c51031db926187d072f40a204b8736554b7c0fea6315458ca92dcb2d07d40b114b37f28e3c78a682fea332fa7131136f3a53e3b2e2701127e1695a0ac0a62ba4b6decf425de0cec097dacd19df35161334fbb97077aea56d9b586530f650d5d09dee7874fe6305cc32e36663402cba6f7815c015a01787a2d5c63a99e8cc380669ec7b651921b6064bbe37d040051e1118928aa1875b1b0dbc9c79d817363053a7873fbdc9db54128c29ee4745d11e402ec0761715b87ca2ce3eff076f783b2103375d62ddd2b1cf2b927acd3ad88cedc7ca258d5619761079706843a13f5a102ef76f33a744f850a7e69e285f96ed93adf3a61240a57b9d8104893fa28a175366ffe4e8dcd8877de2c28e050f4c3c37efb114f26c0434754a06791e66ad6ab833d8fdbd03d74b3d88741582eae510f1c8204a8c8357f3514ba661d4f1f56898a4b956a6480ae6a5128a22c04136a396d2afbffd8a6d8eb8d2b37ee2ddf7a4e912dc592ed7a2ba33b0a7dbd51679664626f44a4c520e7cfa2298b8a70ae3ab39d0250c1c30cc0d2f9484805b6293822ce95e897225c72751c75fd4304956781e5ca0a203d5dd3a87ae52edc7c1009f346365cce6de71dda78f5817c6a304dd8dd9f5b4ffca910fa5c7cf312f4817497822b0aedd914e0faea0faffbdc9255747ef03c6b7bdb7b63f1734ba7c1fa423fdae91f6096a69b6dc226eb99b6c6cd16254b028581388d0c1515d585dc4bb764f1d523e496b0c188d42de90b1ae04eec49f7f23670a21257b734ebc5a32fe3442edf1868541288bff763a561e45ca4c5a3bd21cd630e579fe3d08c90ed04e10d6349652ee8178232a524c149110f0f5641ab40623e3f374883f10e95f733565077eadf7c83e576c4d13337048d51a5c9c84a2a8de0ac1b1c41ead4c7ff99f12ae7b5798e5941b9fe16d3a3f1c5e34203bd1caf832e3a249de6f3bbb1c9611ceb38a892a397fd6c46753ef935d0382d264d943e4ac2538a13b3ec494733f98171533315a2936774aa229c5bac82209d3034ae5eb938b1d3f50c8325668d6df67f17403b029001b350435b65d175d338627f690f29d3459f97a1c563b309e9d9f2430bf2a077a8f67e762ca60a067cc9227b878da7c622476d0c692c5cf2baed0bc378ea405dad01a770c4fdca6bc555a9017b9bd4eb69cb7c3297e5b9519c9c4149ff3590b78097ca66f6f3a67c3d6d111f4c43b5e7fcf960a13f6cfcdfb19f01f17be7d7340df96e690daeffc91c3ec03d414b87240f2ab3f5d37e401587d449dc2b71adc094948f8dc671f662daa6af501870ddf609436653a8e6e85226d075cbd997012f060777c7c114f42a2a4d4d8469022185e3e41ab2dca0bf4f8e04d2a08c4b15ac1d84b954fb2a7bc86d68562065e1bba75f2ab8e83a2ee41a60d6be5b4cd958e2f9bf63897996b9b43a98523d9b70dcc69aeede0e9619efba9ac6905a9d54f87b65cfbcb8436869f61146260de5a6cbaa4125782de8848f41eb8ffa2eb0d218cff7c7608cdc9fc7bbaed1e252263f461c7b72a579c15113bc437bc49e604f5f610e25515d8fe81329f6bcceb315468d3ca8c66db471748f40542f05f2012d08846d5cb63a28bdd6cf4ddfe1093c4b8986623aced7348cdb3986b9f29ce60776b6d79f8de76a031ff3280a6b7ad1cdcd8d4322dd0199651e68b1b06fc371a46954a6205560569c0b5fe806fe243771198c6b0e5be0cd85fd0a4af29348ab23c16ca5673e570b5fd65cff91446db12974d70580bb180053a42d961e6d848082233e4f95eabe100a5e172b95c3bf1f9c54d3ef3a98b14c688df82377b927554ce6fca04895981b06a9054770e323fcb38f9978b3ac7a20a974b871c883f5aec536dd5d80047e54ab69bc162cc3b86656924c9f59307c411e59cf555beec575a012fba0d94dc669ec1252a9d60b01d15977e9bb3675c26cbca2fd5a60243a9d6a16648a5b6ef1b49ee35ee110b1e4463b496439caa356e5ceb44ce878c8366d6df97d8f179115317050c3a3021e4397292feb2b496e21343e1d3913b70fbb6d797bd727085879828a8d4530b2f0e04a061eb342a1d63cb1d94335b7fe1348229416988e82826db19f22e5a4d644446dd4cb34b522bf8293f4548d0955f7161500ffae461c181bc8784785dd367c7e890783a286ecb454489616049496fbc89d6a3e4a51235bd631a35eedb83fa5a8ed651d4801237596a349fc15517340f44e45630274c38477224e6fed242a8646a2fb5fe79f7392a5614585e7f864355bbc059472914e8ac2d1e06db10b22f36e425274a0938f4d69439c377e4696a4ad77a38778d83bac53b9d14a0d484d9546183a8a52340a0857282c61a4f403332e0f2a044b3a24cfa2be9be232664857f9646063ddec3bba4bfa73b638e7901ade35b27e563daaff24e028fed2ebd547dce914ddc6a75641445e37f20a83428b9705e98055041952aa13875f9f9d0a9b01fab3cdfc7267469591ea0369fb4c739121ae5b405c9476f27575869d0b127fdc2dd9f65b307f7df1174816f411049a025b9557301e19a7039d69d932a2a927ab26b7437ec29ecf603b25741b39d0c4a743b085a11701bd4ed4dcf4cb32fc71dc7daf91304b4e3d1eb9457400a70eb9cf1ad0ba32ddd9eabde4b98c1860ff437edb7bef2df79632a59402470940094d096077f7be942df7eb21db93fc916166103b1e0db2142850e5e7aeb02d4cb8b52a7f3f0ede51710fbcca2fbc40ed15a10758b5bfd06b34a12117693048498806596acc9f710fa6b3f38ecc846850870e1d0df2c7705b69ab9a79e15209b7256caccabfa2460f3b8ed2e131fc3628624fbcd3208ecc7114b77d2875aeef96b1bf1fe257ba51fb2bf50ba9ed956c7ca190ba5fe3b76f3fabca3f84f6f7e5d3b3adbca0cacf36d8802a3fbf0e476d2cdee9d3c69b50e5f76ffb41421b06a6b29b80be54adc503ca5b4b2b41f4c199610c0974874c0cc7b46cc254cd0b49757d7c3e2a3fa1e7214d3d4f448131f53cc1051c1e495092fb704ec8393c4854391f7db01f5ed5d89f14501c3aac5383c957b221ff921fdf7c417a601deea8a4a74fddf7f3923e611c03f5690ad1e0f7771ef778dc24caec9b1fdf34d84a1a5ce2d3e0a86e5ec8446af306cd492989f40f82a18cd7e801479fb86a9ac7685cb2e11f6b8ff8c590e12f05aa2fd070839aeca8000f7fec5fc8ecf06f7da8000f1d39d820100c670de76a063162d735eab8f1c2300b4c2fc3b64222cd34f842600e44b9320dad3140b0b1f7678fbf1d1a9c69b0ff86cee946f6b751c7f8d7eca3591b681928bf8733c6c79e3b6c4e2189292851af77ccfb2f7e2a6c1b83ca2128cfc9c363fc657c6829be90ba83460c1e42a4ba3e345126c68cfce40b600a4950a1f237a90a600a494c2196f885800df610349c9546880ea921a794d054cf9e75e70cf3b13e75f617a92386615f383daa04cad5356cc6488b51bba17dfc8e1aa9665e0fff18721d613f3fcecd83e9988edd15526e41ee6e5c373e10c68a710dc62d4c8fcb9a404bf385d4a973b33537bd928df9dd775fd8fd0422be7c0cc48f9db7b133f3fcee37ef6cdcbfeb3eede7f4686ced3e7633ba76dff4cb0b696cedf143fc30105f7a67e33cff7acef3f123ca17aa5cb90993a0ba752b7f251b51763692eb93afaf8b689af3b0dffad45d370f856c9ad795eb5318021174aac4bf35fbcddb5ee3ad33bcfa5c18fc99972d0cfee9611ec7d810dbc2842b545dc74904adc067876a1070876a903e85a010a0ece1bfe6476ffe0a0e0a74a5b53262a471e9f9e0e8cd2f74f9b5aac16e2422918adb53fc261ad04a7b722d4afb4ef3286965857636234a0aa54aaac29596aba4124a47d248e59735d8d3cb9d95113f42a1f2c7d5caf0f71adc982410a46a63fafb650f16b52c5ce609a971912e9d8d54d2604b95ecd94a3f46fcd468dfca504de609a911a180ae44f1a4ff4a6b65ca509fb6da4f77fa84a451d90a953ead131208d51ed24e48b0861a529dda5c8e939b14d4901aa94d53b53f3a92dacf52a8ed48faa4a4f9dbc546f911139599b5269547ac1534d45e696d8c11954739957788891656e5e629c3a2a8875b5de96cb89b31ea3866766ed3bcd639c118706a36149ce6b514c630c4aa66bb81d3bc02942108ac9a2d05a77df6d927c407746ab46f5e7f655ebc7e6545f1b1ce865ff384d46cdb28fef3f7bb68903fdca138aa41cb132dad853163c709ea29a9625e6939ce8a8a04e4a985c15125ea6c227b74b6b867a5b53224a3478fd33c21355c777dcdc3537b04cd835a69adb4fa84031aff4282c6972badaeb329a18a1061b54215e3a649eb437ec04713527ac65d324e299bc832223cca8b7451c6dc46c8bdb3c1d702584e8e9b654becd58956e8ae29ae889a47b4e3b8853bc545c1b44be003eec2d13e5db2bbe17fbd96c9ce46fca2942b63471b39bb9cc0d43047208421c08422964f9f5ab149af80829eb0a054cf846afb97fd386a4e4a492f4873fa4bff66745df95f892851020ba45c9c0d1c6a0c6ad0d540c36c28fb9922a061f643ca86a0f854ce868af868517090acb6293a4b38d60d0fd0ca688988ac8c966a982f9af4862489f8489cfaf3f3f353453d2eea11f5887a443d50e2942825c628343e0651972529bf195d7d6a48ca38035a1953b21f8c0d341bea5328ea8922d4a730fba97d0a39284091f543da61c70d0f10b788f4349494911f97921395ac8c965919fefb31629d935212e93f5bad6161f44ca3b4540156872c0d4b809ed1570f1683221479d3a7ad2b9cd0d8aa610c923831c851d9f39076a84e4ecd8682b2a1a06c28281b0aca86826aff6622c518ed157e8a25547edce65e8a24b4042456ec8358a9d8d72d203ef601e1eaa51bdcc377fee01ab3212a9a913e6d6c7914b16e50757d5167b0f25c4d96a3b66692be82456a2432c4874ae58f531ae53db1d5279752a47a8fa3ba261dd31fa9d470ae7a6efc67480de7ca575512a9e15c799094ea23d670ae587156ff3a9fb90a02656779944631cb59dca8b21c359ff45c31eb499fb0da506afb37570d3e41e7aa3693983f4575afd8c6f8fb82cbeead70c21cbf6b4d2e4496cc9259a81584047c583024e009cced2e33112f4267b3cb417095aa627f47ce8488911a7223152b83b432c01ac4a3f26f06f8dbe36f55832b4a98bbdb638c1736316e4e307b815d204c83dbadc90b4def85dfd9701c735adcb62d6e9bf7c6dbde406773f746512844e5b0ca5f78811abf1f9d0161e39bbabf31d72fdc060eb57d2606496e518c85b1c58ec60eee1f948b5be4330b839f6914cd9061acec1c4bb039337f38f28ffb071bf3effe00fad8987763dcdde524b6fe6d6506f78c118d180ae13e7046949189cc9b64063d861ff4988e01ee4fd3eff1f3eb6968d51930e331fc331eb3bfc90b1bcd741d7fc338ee184083b9ee18d0beeeee2eb51adf460334b42a3f1a5a8ddf9c81e3a60425981eb33478614c0eeb6670ad593703ece516c5187f5b09b306acc74406acd3e8b6ebbaaee39ea2f87361f02f6f9a48fe8ceb93251b5a0d82abc42fdc40f54f88e4cc89cb87667d666664649814ce68f33faece064da552ceae03cd67033e5d6a996042846b3e1d87a3ea59a77dc8da873e9fbfb0f3dabd4894893aeeccc70aa7fda675dd0ab74d8fabd6893c1fdc0711825415fd8a154e68f7db67afcdd7b6ae0721b57bced3b8d6e96dcb5f9d9d0de698d7ef23e9d20df002a0510b11f1b503d368a5fd3ff40f1da7fa90cf73f9d08b00424f5099e543bff961c1367dd8545e3eec29a50f5b0a8b0f3b4a0bfe45f1ee434a114e57798cff17ced9e20b2765f185b4f4d597cff4a9f05e5ec57fde4d121f4170956afa128b7795a3dcc7635ac5c233fd0aefaa2a5638a1a677f997dfb2cee6c5f4d3f462faa48a97213b959fa7aef06265e1e994bc9abc5d182a5ebe6db0e46dedfae20df1f183d6131020f42254785b57785c597c252f8810a4aae93bf27d1b868954943c15bfc2dbba051d6bf6db6f9987fd57eeb1eee6bee96ddd98619d8df91528e1c051351c501e0d5e7fbd0b687fb8ac6dbd60f3b1ff0386bdd28d7decbb7add784545582ed2a819b2912a43d6217f4e4a49a47f1094c1584983521a6992a376788c7cc948269d24fa24f037082491aa94b5823255fae8d07040b967ba80ca5f1829a9e0851248c121e1509709126ca85a5d263620e2252091fcc811310075991cb1810d706a48bfcad6a001291870adcc1141d504be3062a886a423846a3849e0f55b7374aa267bea28ec310f67d65c3fbd9b21666aaec7993559f6cdbf3c0c08037ca1ee77a4145f88f5a9e9c0f51dc0e2297affc7ff70601fbf066c0df6c5963fd81626fc1ab03215d06572c40f931ad4237c6a20543b47a76ab05fc69935981fc1beeb69fc0a52e3f6f8d1357e40bceebbd4ed6e04a0ee77a403f114bdbd4a95ddad52a5e67a9a3e72fd760f4840cdb511caf6cddcdb3ebafea8524587f8a1ffb8b155aad46dff1f5db7ae1319824cecb82ee3b8661d1e0607ce4b02a415e055aa54fe5e642f1e06872ee6d0795b135738ce8bdd776d36a802e68a02268d5e8901a2ef5e87a8e3e84df7eb315b8da8a35bc3c2c271919d99bb9b998cd6d80ab6854932b9d6e636e6362fc96e5c5659324025e76dcdf47244de1c648901dd73afa3fb74ecaf70020d628756a80aa91152d35152ef86fbf5186d850f0d6287ead6ec16e0e2bcadd9bcad691986a0fac7abbb61808a61524a7fd9c59f7eb94b778fdd9cd825a3fbbb4fceb63049e26f8e98c30776fb3e3e077ac8975b85d439378ddb368ebb1b5ea54a9f22f6d9a67d105ca5625fc8f337ef662b4028e727378efbad6a5977c3a562493266d6a428fb8074a472b5ada3926039620e317a0e4ea552d9c71b1363ffacbe655e921823c718314f074e9220666a0fb00aa9c9fcbff026fb21920431537f788dbf5b802fec6808a91dc310c41b2ef55a80574f02a431779f52343f202d230b64dc22cbbacf36fce317f6fbf7f08f76bd32b62e8c6ec1b630523221a46eb2530057a9fcc5e658870de3a6e4ae30d0c8b5e5ca987f3d76bdc4ae777ee9915d24afeb9d460f8cb06d9fe2c61cf733f6b563f1fa1fb31240f64b2e02e90bc3be20bc5efe35d92280f8fbf92b7f3eb0ff316bf3b745ae5329308c42440982589550c492ea2fa47a4743488d3f3b057475205db1df26e79d8de8cd2e9aefdf2980f9041bf63b34d82fc0064dcf3ce3a44b0222481868483532d0190ce17c2003de05630c0a7b6807cdaaf6f300d42929bdc925414b39be1d1e53c351a51cd7cbbfbedda1c118ee6a26c7cc0e2927563f3b64a004478e28ac9fce210a946f401968f5e3aa19d018b4c4c2e8b8fae91947adab9a0594bfd05971573fd5a741d5fefcd4fe1a3d44564e54559ecea13f3ea18c042ac323b3d360bf0c0f8d0c6462346980d7788ec71c4143107c1155cd861d413a647053fb7d989c29cafaf0b37b356630e7fc687c6537e27a7183fdf574f431c6e7f8eb05b132d41be26b4829a07e4369e7d0effff990f547ac320d3648d31be828eafe853fe24791d09d93043258444aed7f11a3f691eb2fb9bc719bc0cc1459812f764822c3af3b27a5fcf20377bf170d36f88e82a9e98f30754edaa0fc10acce34ae4064c5fa8eaad0588622aa3a135b358accecb04026183af2dcc699ca19ab0eea1cfab7ce045c040d027bd55368185bddaa90c6565cc2c6f443a1f6c7b844eddf56452648bdfa5918ded39d818632317292e01d57a9a8d4fe11efb01125a6e6e9f9699e3e31cfc73bbda455cd1306caad42c2491606fbd72a9e061bc9c2e86f1e57b50d68e82a57398a739876112339b491f88086b34e4e3ab1dd248997fbca777e50a673e8bf86d07e7793131358676210057cb14305c1177ddad10b30c28086d4444767489182fcd47e216ebe66fec284ec9fb3bbb35ff2c22eecc2aecb2ff7ae8f9341444c68383732d07072ced076235b435e4c750efdb2091a766a1b03a591e5a8f8acd3a9c689387d0a3b9552d5febef121a71287e8dce0a42227e4a8c89ffb502a7eb19f8e38d98a49583a82e1489d43bf7bf40634dc9f1a2c49d090b60efd151336ae599820eb1efe10777777bf1f423841c36dd5184408c9a2340638b57f04c40fbe59e9eed29ff9e28b2f66969f104078417e887068c82c5694463d97c4c6359b18e8649d595b0767c8e44c4ca448833fa0fd9daa21eb94f8f7a34033330383a0dabfc3360161986b7086a673e8efa440fbc319251db34b66130a447af2503a66697a10a563b6dbb97004e8063ce10c0c48a61723f90b73243e4d7fe7d01fa7408fe07c4dfc4afe5bc3b536040d49201b41fbfd081820a91d92a0acbc6049ed8fa3da4f6a0873c3297f2cb06a5c88c90c88d41f5d351033161a509634b8751095ba95c61250fab44970c2a201254a9f4a34a044a9456676a801e424e7679de450699c3ead132252fe57e78028a0e18c4c9fae6b07a823045fecd0b02c7af41d8e0ae2317d751cc6f9a6614122494a3833333353e7d7a139c49dcde5d7a3800e35d8171268c8383755fec53a7d92bc33e4a81daca18e8791d8b82af6f18ec74458a748ab419c93911dd0feee1c8d0433ee9c736211c3e60da16543e4b68fd11de334ce99c3b089c5d7aeecaf9f73f2e4aedf6eceb804ce592efbb9b9fb17663f9110dd31c758734c032bb7d13427ddbeeb0b7da8375ad860a5868c48501c72fa552348833f3df0ff40f268aaec8d28fdff27fd6793dba6b99a3b19ff07d25f9d0dc7184dffff8f11b131e86f3fbd90abf349197fe1a4f13b8fc3de3f935c6693691976455a37edfb47d13b1b6d3ef69af6658cd9641767ccd8f54d798258a37f0411e2b34f02152975a9d44d821a5a75d7a329f10b89e102d1200648b547f641bcccfb41838706b1893588693f7060d8fc1fe6363d4c4e89c5c561aa9a17ee144a57744557744579a831b3df2cc6f923d60454a952854b361803a4da23ce08a9dcd9c4f8313c9fdc691b8c311aecd0ff07528d1fdd9311091ad223dbf3cf492929a5edf6557b0f671792ae9f4ce011ce2afa4252bd68bdb88b6e5fb115f2c1f5f9b9663eb88624ceb2797df7f5956e94ae1752af2fe4caa359e447552cea878ef1f7e7c13705a052fdc398eaa157fddd3d2ecbd234e8cf123f2e4706ab49c31f350a817993c9e4bec12ed0af733ef6937bd63c927f17e8d554e40a47911d233a8c735d3c846f96a5a34f1c394a1c4c182805b4a3412ef1cd10ce6990bfc43acc467234c83faadbd97cb82c15108e1c3a96a276c496cd2aa0daff0db2aa96604a334062ed21dd0334d6c7fd7b6cdb18d8b665b7c0c65cef326f3eb3bbbbbbbbcbbcbbeb4ad8dcfd223dc76e6208180f68ffd6ed1de3fa0e361ed015d990be0b83bf11ec604a5d24d465b20355dd301ed0d055335289546e6e867c3ba02107f5c9e74e1068385da5ed38ea7ace7980beb99a4f1aa5a93ca6fb143595a35c89a67225be247eaed27ce20b364a5a2c7edc2d02db9999dc61f9e01078746af6510946f4d40ce3927facf21a025de18472507423aa20258d9239aa3e65532577a411b963441ae9987e24d92777bce743b9e34a1aec6d9036c8bb2b775cfef5a1ab78705017907d943bd208cfcad81bd9c7f762b80d4e6f1bc496d8b01cd00cca12dabbf6ae5d81f2fb6398164443b036866198b66dbe3977cf971f3ffb17da63bf6905a8d86fda566cd3364d03c255fb5ef4e029780083c9255708dabeb7efeda1d06df002afeee645a9a8297440e5ef123404ebf5a0a3e6b7691eb7d63c59601accb47f21b3320a50af0765a7004f5e1fb77167a37ffb4d5698ba7d0b84ebf6bdf07af062a7e0c15e520b4aec54edbf6ad9f69a767536daae54641fb2641f66331e93f18c77bfbeaefd3633b332ba66ef038f03649f6559966559966559f6dbd96c1fd860263f046bf633d9775ff673fb2ddb9e3f1a5fb5edf9f76d58d3b4dfb4ecebb12d276c2417905e80614e74a6822506029ba6651c98da765d97a44075f96bd8b2dddde6ae3260bbbbbbbbbbebbb3b272a3ee831fcb9fbba636df076f728a5740c7b678ecdee2ee375c5c6769743aa7dc0b94c0acd2a4b91522856590abd2a4ba1b2b2141a2b4ba13e3d40fddba5d01f2ea5d0ae3c02ca2fa5504e4aa15b39f6c4bceb86eeeed714ca72f73d8ee8c865264ac99befeeeeeec699188d541a1a7fa075d8dd700395d402196c661a868941db386f0d73153bf429e939904dca728302de6b9205422a132e23664dcb8e18a18897c7ea28c080020c5efd0630dc0086cbebea29c090020c17090c2aae0b2c8cfe511704571e0ba33f08cd508021bba16bd9a1b172fc5c5a4637a4c0fef236128ace06f6f10b3fecfde98f3a1bd8fbbb6024152d5e192e2d2b4adcf49189f999c94ca3ee468fd1c8a5a5648a994b314cec721a59b4da753384f40c130b6e5706f6fbb3550079e52a57c94496f26977830235be543989b1232eadae8858bcbca0e8381544a82427b3a8ecbbef546ab214b813af1a6ccd0be24780708245458c27800754ef8d91ef9d8dd780cc7a651b239fa580b16c8cfc96ff4d40c6d831c6187935ecfa21664df61be3d5846cc26bf47aa8f193034713abe8ed3033c3034d133e1e43a60919ff9ae8cdc103f5fa38c618b70cc51533ed3312e909126f2838913b7f21ebe0080d3056c1e887d1c4ae28671c95fdca544e712ac5442c8a577ca47e4e605794be7a56b9a378c53f0da6dc79d53f29e93fb59ab1d54e0dc1dc4daca050a1f841a66973aec466672c356d53c192b1b6f106dc8e22c80e0dedd00eedd0a8ee0b5914b3f8486da601c90554057532112c6661346049979b24f2879835da15ebe5556007eb071e425e2f2f070e1f7404f5e5f140e3f55063879919cd1b825493e407109b03d6bcad89e4b735b1b359d1c2cd2223b2f3fb96659a077a47de63c640f9c3e795b1cfcb897e64623c15a31f46d9c42ec975feda7b32acd22676c9d889a28c5757c5cc76d418558ee299b158c562152b00356415cb511dd8987e110815d11ae21ded0b4283216ed12e0cadb2101bd10ae72b0345dddfb42dd3443937dc40880e80d005160f157cf044074c2819d500c7cad836714109430c5943116660030b87253c416128620624f0026b8147896c758825a8ddcd82ae387868d4e6b0820f9a1084223fb042ab2666a1c6fff8609fb81a5fa64ff163f4c9255e27a0ae8336825a77567a724a39b729a7ecce66621826fd270fce91a1232dee6c624783ebae1298d82055934da1fdda0a68f6db4520fbac0aed6c68ded65c39a0e19cf2e3baa33167c8c77ee588a6a8cc81cf4cf6fd52c751daf7cb9d6f3fb0412984e6518f91fdbd687076472e2768085609ca29d48384262e238250e5fb9046613e3d2ba38594b01c49901b5979111f27d29a79020947b88cf0e9849004fdf8b45aa14cf59189e1e3a88e4857e4a733b2ea900429612d11f2697539a14cf5918921e325f7191a1e3f78d82168a5ec8f7c8ff25ff878cf27589ba33f1ceeef9f4307efae56479ff6ebdddd6fc33c1d387234d8bbc2a1233a8e1c3a643c870ef7665d4d6c0b43fb293737e7ccbfbc50fbebfa4874a4fd7e987dfff585999cb10be3cab4baf16edbd351a3b60fa663fc3b80a1e08abe82f803e330dc9561870ec686d070593bfc0937a66918b65d97b65dd7966ddb36b52d9bdba66513bbdc3d8e8139eef7c78ca021a93679c2dfdcd8a3939fe3dddde79d73e5ce52669641f247fa34b80a4972d5270f25d0933e79288124509f56eec81d9264f56cbc7dd36378c8e1187f38d8f7f7e8e79bcf2fe6cf27fb7b86e371aac19b063df36ca6fac4b51bfb74d4a0c1d160576075d33c76b44cf5c4373c84c5fa1d6fea53ffd504fa93844dc20cd661a4e482898fc518e36b1fc3185d732d6e8c32c618637f33e0cbd0eef6d1e1438c1c37536286e17aa2294167838e0df1a73e27a52760c1c4d819f0651a5ce168d2a4094bcf5797f9c921e3439fc29f1a2e7599f0e8d49056f781a3e6c472b02460414a4e95bf1941c3595f244e9ffabf7b248e64a208288dc27270b01ebf51613cd80ea6b3898eb0822a3b2398e87216867cf67aa8f0e85c9fc86761c8efb080b1a8588ea3b8281d235f8ace942a25952a6577a3aab21bd2536588f954f9712cd1132a3fd472581606b7547e8981da2f2fba30f833506995bf49aef2298ab64645aa34e2a40d46586d00420d77a89254a513364ca9214c951fb957728eb06282c2dfdd3f550b31babbfb35fee6eea69436edeeee9e91c9d1f3a397a0f2e9c0d1604b0968c8b1f4502058417ee01805512a85fc050fa730f3f6bafa3fe4cf6283ae69dae7af7de16aedf1f5d568d0bf418f6609b4dfbd4feeeffe3178a4d490aec4b0e22bd47dd3cad81a9d1dfbc6b0ac09588d39b1b931fdd826bd1a343c7cddcec68eca57d3f0d0a708f68033610c1ec24824064f500d4991b5b9bb6f8c33bef27335f6a2f6f2e82b9cbc4fcad3c9b67d8a75ebeeeef62682493d88fbc302342459c317c83005680d6c05355461c3e185900842a287b431132464504bb55b092b311e19411215f598ed7eba856dfb04e4aa3df61700dba27e39acdbb20e57aaee839f6d7bd23eccb2acb3de3e9b736ed97396fd66af79a190293b9b8c26aa2a3fdc7254b4fcc2ae0826346f5807ed8709209f44c284eabcf1ba22d4db94f4683facc3b68325c0b6aaf2371cd5d603f9a46e46d7950f6342a3a3ba1ca1da350bea93940ea54f1e451de0e57745ba9dce489f40ce7140f09f44a2d47970706674dd36d5a664ebc171d40654e586b335a91267eb8a31a19c26a409695234eee11eedbb9c4680cf18ce79721cb5519a33e7cbdf563c5fb05fe4610b7613a07f53396adb987eb911c1a5f6a6a2f1b5cb5942e7f7e7f4a93bc0cb4fa18486470ef0d967cf9f8fd811e9d3763a550e8093579713dbbb9c01446f1e8014715fc946acdcc7ca7d9bd732bca6d231da47f9001e2fe918f998c74ddae31f066a50765d8ea3b8c763e44f12fbe729e46f4a1ae53c1ea3e2ba510d375595ef3cdd0df7f854797d5d4e95cf895a319a71a4b06d67f3f25bd69a2d1ed2b766a96572e18580ba70e12531fd7efbad08a777366c7a9a668f6bb6ed967171dbb891c8568b884ef3ccd93c8da479e6cfe66924f2894501e1260f0847b54a3e26659445a0db60bc49fd35278a37c6b4a60f2515d387a3367d780d91d7f7f2897fd93b7dea9f320d5404e155443572e954d3875791abb3f9de04b2173ff36870690667fc5ec8d5343f98064d4fd31bb68c999e337943b225a7f850ed2fc9327d2b7bd945df7f8d836a229168665acbc4e2e571b00ed7cb6f8003f684b918c18ce668f4d835615c98b4392925b59ac7a7f409abadf9262f34c51b2ee2c4544c5d3857cea523a95c432e2257eabaa9d1a7f0fa1a5d0bec8a29eceb1a5c592b94c573e1d1d69cb1d5ea717d5f83226950beaacae6e1c178688b57f12b422eeaecf469c5cb8f3c71489fba2255462355e654498425b698f3695a73ceaf060fd727a34896118cc7512e5e7e6bcad0fff5309e6f2b2dd6a7060f8da4791cd53a1ca70c55f92dbe8ff5fb421054ec3dcf851a94d231293edcd6929ee9b592d67154f37ceb609f4f699e29b54b73f996979964f1a5d2fc648bc587b2155bbc6c11d1e9138b222412e977491f3d5383f223bde0f018f993d2160b15bf220ddd942191a8d5a76eca90887b93c9dbaa82e4f9e0e6e150c8960f2cf37c44975695dfa2e1902b34d15b6ff626c1d54b8354aedf22cbaf7cf4bf7ef36dfba687728fd3cefd9be14f9f7e117bc7963013d7939ae027380df5fac5e2af78ebc5066564b00df3628340b83c37fa4d7b14fe237f176f318f976c0b0b0fe95b3696183aeeb383692c329aa6844cc5de9dc7b66d9ce34f7fc3304dc6283f40f149841265e5a7898f48c49472cef5d7f3a0cf7ff9dc36aec5e3250d5e2fe328f6f198eb9f44a2574f1168d8388da44f427ebdcb5fdf44ba489f8cf409fb15ed99d527fa2d7fe5d4eb3d6c9d7a5d5f6cf07a170f636d5f38bb4f67e563f94252dd16c4588edac5fec22e0c7bea4e9f7e0b46b11516f71d2d5fc84fbf170d62df833f1e0d7e1568f0fa0e7b1117a54ff3af4b847dc82c66ad8c9b3e61ddef76effef9d0e0f534bdd2ddbc44dcc3e21e284b5ae1ae9ae4fcf4296422ccbafeb43262d6d6eb81f0bfdc775c11c7b56a55d72fdb6fbb3147e93657fb707f6aac8caedbff10a44ffedbdbd87efb5d28804bd46ddba8d46d6edbb287c4a7ae94ba4c94785237eee6948afde64da28fcc159bafbde6c73abf300415fb626b7b9ae626cb8889123e359ca9db87fb33d3a790eed0a7a7f91aff2447c58de1e7e636bfd0b435f753b76faed1e0f694f473afef6b60bffdf60bb35d4bb6ed6c5870cb85b1a39ef4f15ac1da53cb875dfaf0aa2baadb52f78615bcf9f290a300f04ffa75140e3ffa75970780c71bc3c21c5ea92a6567336a29bdbcf45e0e5da9eb66e3df520c81863c84613cc4541a9491a3c743ccdf0c0e5948e5d1f31053e913e939b2d0065bc07423180fe63792d7f2db965e76d53eb3c3fa6c93fd59a05d790c994c09168adf0b50d358084ac5bee5378e93f22746c126505cc52731284289ac1865fe34f1e9ba88612dd8b77c40b8c607b10f8685841a942fb12f0740b5e54b7f618e955ebc7789309248f48ee0f0301eced7e010ae0fd33063b10b7b2afdcb87b209ef432986ff503e7172f9509aa1ca11e93422bdfc96d28be7bde7e2ed82387844b08f8e7ef4246fa8f23725b644fd034c2d05c1f5e581c4daf241acd496962f7d40b8be7c617cec7bd120d8f2c13428392e4512947f087499e460495d26395052b78ee3183fba57ac91dff342ae5ec496d6ffddffe8d1c962fa6592032917e52167b1108e3ecd91fbaa699ca63d6fabc91b35d8e2dff3c155a84f5b77aa7cd217ced1175297ef63aab25a3c5e10fb921717e47ff1e682fc9ec72dc8ff1e5d90dfc51b2dc80fe3913686792fec69da06fb5a7c4b16da20912aff08cca764c714a524d27f08b6608ea58f4f1b25592f1f9f7bee6c58fcb30e2f2fff5b19fcf25decc97b392b0a2a03c5efa278ef05f370f060bcf8e2ad7052f2e20de8b65cd89037e9135663c90b4bfff2ecfdabeaf75f379164f1100f499664ad564371157370e2879d8aef1e49b0a08c44c454a441e74417344e5441a7e208faca914c2c2aa670641331473e1175641a2e22f21af2614c61a43e852f4f6a50f6f8c135be7c2990a0a9178f2babc565b57a7959bdbcbcbcbcacbc55145e3cef5ffe5d9a6f9071ca8be74b1a94ef79eed3608cffe2f5f0de07d7164c90ac5c160718009c62ca5100f89c4522e1f0a5603e960e0e8509203fecea0bba7867390adb18172e5e0ea5a82e5c54170ea57efd9cd7b0a0fc2a0b8575e02126807ce9822115b4aa14aa520d0b437ee859a8321ae9d346116caa081c23aacc794175f17d18917cefe2431e7a799a7e19a188a9988a3792eb8a718cdd03fb460d7adf36e87d8bef07577ff2a5408212e9d3bf84f914d8475f795f38e5c378bea463e4bbf0fca741f99fe7402db19b717d0ad983d4a0fc1f5c471ec5598e62a1cde56514e9d1fb58bd2f04417d79ef6950f254d287db431ac7eb9b06250fb5f86660f5e5f3260dca98ea13f6cef218f92d2fa37779675d2f5f38a5e9577821d715d827590dca7fd36f1f4a9664ad0c697a39e987b4aa50f1bb2a689a85176fbc88d3a0bc3a96a3de63e44f1a3fd317530dca177d18534df0b3faa4f13bb3641429b43218c8fcd256159e0f267921497e0a2fe46ef0583eb0eaf98823c9aaf25dbc70d41253a48de167f9e81752a622afe33c3a6a30ce1ae5d703f369d1347e600303032e0c5e1834baaed8ac38028d0d6ebe1c856d577a92a8b16d8c3146f9b10a71661f04a61ea8642dd655412d15cd0000002000a314000028100a070463d1603c9e0bb3f80114000d839e4a745a9b89c32cc7510a19648c3160c8000080008060044840007c2f9d51056e5634599f5b72acb5dc99baee6ec9bc6490ab4c9dd8e61060a620f196311adba79d2fcd24fc25212a55f10ea33403f91a090d1028b284cb2aba747e31c17f532e685972836cfe52f497218b2728aee28d6791af87f0f714ec7647dbc93d0e4f0ad20e785f4cd94406d4f5d3b3f1d7b48cf131f370e0735cc0a28837b13b8c121e287aba46a8bab1efaa208572ec62350f64eb3d8dfed23dcd851248af28ce0f4f7d47a240b648dbd6b132bc808cd5b9da67d5dc3d3846227803d4c2dfd06c890194dc9940e273158984678646eb9262f737f046211802d24ca9996163f030df7dd17710ee56d1498e9868f273cf005beae7f32201f90af8dfd867a5a503c8cdd84ff2eb68f958fe42e7a676c10ce940b6caf9bfd05a0cd72d76fde78cb31f8baed7c792e5a50976539526975a07c2b1d61cf09333b514df400205f0faa7f5f0800014aef6081a904dbb88a194c3e63087a16373dc66c408db3a5405dc445e6dd72e9b34ff98f39c3ac46cdb714922eb73f2bb59aca25261764aee5fb9256187a257c0ae1afc723a6cbcc240b243a24919d933c8c5dc716e62f82a272e68395d77ace4838b636680908f048a17602f730217aec1db7b7f7dedc26ca2ec4e76e370566dff1ca25df0f17e1eac9462efdd685c234311a32f4259acdd435996b604c67e83395d58b3235d9fe8becc4a3f6f5a47b95898ebbc3cbc31874a32ab2943851f7237e50f4a7f5835877c75518413e5b24f0590e5528111afa36875d8fa2314bfd84be064a55106e150185c327b7e7f0b94bcc26906c83632265a3b14654eb58094777bce4b8dde90d39250557de773df0ecf363c3fcc11ed543d907aac151d501e55f78962f63c2cf819e250ad28c31041613ab120df04b3448ddb8b6c13e3a7d3c5a8e54b30dfdabd0e8f0c44c0a051c7ef040db1c1d534e45ad9194d9be058afe1cc048eb0691979d8131471cfeb7bf8500e3a46d4e3d8b543ff952a96d4a053113f8596672627eb989d08670c11a633942c0f33bcbc8a0b6a390e412c1561ec8e194f4a17cd6831734dc60aa5fba6c869490a06b78d77c26bc071054aaab96881661045cdcb0744bd753819a2455445ba0133adaa64a0a529ab953fc7118550198ab4297971997b04767a0334a005891a846ba3c7f1a3b8d955d61a164e98312e6967dea3cb07aefdd47b953435b12b03669f7580667d361d7f9c6c2d4c44bec4af738e9d32d9181f0e084559673e402e25326b0b0f4ade32354a71e4d8272f24e7570b1193fc696105749ba70c4d240008c27d140a9f5a38a2993eade4287b6370eb46ccab79df54ec0e6d0ab0e8c36a5c599f06df6d32e7e5b9bc83797aef933bc8cc8b648fb74ff1d9117732534b632223a9c50baade78f285c1b9b8d7df97e90c7a10b21a1442f0062d04c9ecee65c2c7c1a5ad01b26b52fa560099a8199e64cb8f7d99d911e78c601f6432487f1c7be6e94158b29eee076d1de41c409e82d5195f429de739f1e27a73065e624cd4d7852b4b42ea85f5c4ed49ef6fb162ca3fe909d57c7362185ab44b7d2785ac29a3ad276a1581a04645f6ba47ad60bd2044e46f16138072688fb8c0a6b5530a19b713ccb8af327d61e4bc52fe0520238e06f300316f3aa4911a4e9e61c3a600660b6577677754430cf7301f0b97b3c9a6f4efa48bdb053dc609c8aacb6dfcf5be19032734486111490de101ff8611a6b75ca7e8ddb44a488899e3a53b85430e15bb605fe42d5b2ad0056ff6efd7ac0533df5c49b13df62add9fd1f09e7c6e78c0e2c8d03a8d081e85f6f5073b8c99020fd0d0b17df06253817eefcd9698b80d052caf0c56489d8d729b169586e906ffe8170c11925c21299ce3abba9f38d33c6844adf3d8ad45ba76bcaf2754f82ef8f5dda5edc584049a39cf1d5a1bcdabc1ea02c9e4d93db292c2da9382f36f096bf8dee98482c1d8c0953393cbed5be83487abcf1e5f13bc402840e98c7b7a8b41d2dad2afcbe6d88cafd725183a04cb6949266b7f314d02119c89db07f3db5b2c381b62b24d7b07aed6024332f1f26b52752e02c5e6262bc087d728062f142df0c13cc1096aa6dcbf2101da06ee58f4b7c5f63f9c9df2e3bc4cea9fd1459a46f5f285c4bc34bd54b8c434d7af3981d0d1eb0e769da4a1362179684f44d9c70f59ad06deb1d7e5db94b0f56ed5dd3277f681da1ce330bb9df88067c0f2885b07e54a596a791943475c1b634e659ab32612a8b204c6b16c8cb33011057c9491ab02ce4083fb43952d747efcfa36bac85f5b0c99b41e40b71667cf7bfef6041ec459e92a649ae742a6bcea678803c14753848a412b8e05c5358ffef9f99f70ded12f242751f1f1d8846644ba8a814486165cd221a84f8870b436a45b2abb80aa8ce3649d1ad3d8d5bdb5bef1704c17aa6bf5aac2beb449d06ba7b355970c01e7cc80037f856cff0a80b3cbc0071a5cfb57f295e7c7240a5a0aadcca002067dceff1656fc2f6ebceb1e1626c33c7f44b2cf43bdeec726775d53e4f17ef9b5b0a8d2aefd949099b9d0c056b451f3b8c3d468463e074a0241e52ff9104f2c90582e8a6880d7f18493fe6822fd9232d2fa4c4dee0c1d4013eefeaef0e33e20ef7bcbb62735dfc193d8f83dcf85cb665f0fb818019b11fa887d3972d3f8bb457fa561fe96f72b5ac0068b3914220c4eb927eec2da7e3e16c8c0a77f9e8c96615137a043346944a6b7e9d6217bd15aeb8b11c849acef96db1739783c1827d74d6efd8d0d36c508393dfa4154aac7c547f5da22d9b7e91ec2415da3a8088f80f815f0766950847c2f07e8d520aa7d695e2f17610fd84120b9c36a50941422f27cd882cc82351f68ab80d2e8f0710e30daeee4de7ebc43772541e67d308e5c13ea0f488089abd4280aaf2c9ec41316893ce91c872c48627048aa4868f3413a1baa6d4dc3804874f88e3566ddf49a7dfff137db2e0ae67d61d954d9e62adc1d58d3b3b869560ea62624c8aa389afcc0a3f41527106152b18c3e59c4bb0ed90fe9b8359028c89a802caaedf2ed371c3da853ac60750cb51d59190879058c95273307c4e05c103b48017780c57ef1c1cacb6f105d6325c16755d127f356ea0b20230335dd158c3ad19ab42ecc5712487ca180687c2f0c341c1184b9e621c1d3f6d2055e8159b922e2472e0d9265e6f5fe943c69614ace3cc670d70d48113bac07be4c0438594f048a38d0bb49b0cbe7ed0d7f503c53ca8c17c441343c2f410ab1ad5655bd380612e129a924e4b567f449572121ce74264492500222f28e7579de7fdb16cebcd908b52d8a69395012244a550386d65beaccc202a60c208e020cc42db0eb5b32a4a04c2b6a39c1af08bef110f6606791392dcb28a6e322cca85eba07f19eda617cbc44eaec8bdd8d9b5d4fc682605ce124c2d1a6f8a4db7fe7fb6564a870db054b98252556f73d41768a9445e2df8e0040a881e263763a1a80235ec7e9bb086b592034fd7186a9c009aa48e90547e4bb004b31a624e6cec708f44f9057da108ee90934c5972652fdd58d68192d3adf06a8909cacdf493e6c1c21dd149810b94331e16a87afbd798519c37d61974db59fa76c5c1d5d12821d91351af5ae6c0949cc3545b8aca38ef366aead5925dfb34e40833fcb623d9be545a03a0f18c081d6ce0294ef9c1d2c874b4af994330388c60f1e4158e900bc00c3ffb77b2d80c013091379e868dd9bfa32715c6bfee402256ee0503244e512e17f97d276caa77789e091a24d6af96dee771f5a35b0aea3ecb67135fadf42dbae7a99fe844089dc334bbdc1a178a92f0343af693c99ae8af2ca74c2ab162fac42c4aaacce146a6c905e17b855d0e33c02e591aff2773fd98b51719e793b8d3a53e04f5e446455f8af745e56df7359cbd5d945fc55812cbb2a988c54484f7741318b86d2cff07758432781253e5cb31d51b188b3bc8b376c44a3a459be18dafcd116b3976f68eeb24a403f4892847b8a4ee7c1ab7877e54120fa6f105957c1b43650eb33470a20ed87f5544081378a6295f32f7a6d4813e90758c6b454818b445efed278d5c9c6b8faf024c936ab8af30f896611f921a5b1cfc4d0938bf55410a9652d67c1538e675932c4bc4d4a6b472830de15a35e6ba72adcb6e5e27d2a6e95b90cf1b6b3134607914608ef32fd75d36c062c05b142f378136c0ac5c49ecfa47b10ce68e5979ad4fcea1fb168b7678662ecc28b735618de1fd8dd8aade87b15e34c2c4781ef8d7f3746e9b231bdb056eea34e06c4b958c27fc39b6551c0dc6c1a60151663eb6171b6c530dbcb9140f81c9d618e03ea6f4c032fa2b2f1fddef22b907f6ce2e1631d054e982fc1da5e1e0e6520fd7c882362d41c77631f0a430abfded8dec8ad479b1b6f8d9198374a02ec0fabb991f64d446125c1951d0b13f38ee762c79e547ce08c450fce0da21c4bdd9c53e3ea12171e0d2610520bf07e6d9b33683771a8fbb5361aa541f052fb1efa15b2ad05ea64fe29d716b3693859ee57bb55c4eba5c1e2f63eaafe840c70503376c7e7b49202ea0eb69dd1fd7ebb36e3d0f6da1d10069c7d9fa6c68a219069b5d4fbd9d6cf5e0f5baa7d4a886193dcf5d8cdde24f2262bd96ab0009f2f4df3e824a56f6e53b757eb4d4105f4000f20d3ccac8327d7483657df9051394fcef35b71e741c69dcd130c52fa5d2df6bf76fdbeaec6021b08a607d2b9896cac44ea35e930ac7292d02837bc49345c659e23e45a5e1e4a98a176e890cf42a2f7bad19fa4a5a6aa08a11f2eb43fe16dc6429e64f0fb2f742503937f0d654cda72f87ae72df7ba7b00be8ca907c71b68326497c5fceee1fadd64cfed1f240925b69ce5902a3812684d32202146a36fe65559fcf8cce07a3061d033bb0a54b71b1a7b05cabc2638db2c43eaf56921f47c33f9f064fc5d763a37ccc141a4e43e6440f9b69a9028f7f2713d344ea847d7b7de6786fc0c47afec14cafa4339d6542d3464f10230f513aae2401a7c45901ecf129bc050cd0f41137cb379af16a34135f191a88bcf3d8b7893af030e067f75c66a13194468f7379e5bc3f729a4a13a7ca7928d095a41a8221590a9cb196d67be18b88ab20505b96a0562c1292a404f0a6625cc0ee52f6e61fa838f46ce737a3eb3c575bf4cf594c714addf4108b4567b5e19f6b2ac8333909d40733400417a0c8efc88fc421d9d26dcd2ae806a9188734ea21efefc45558aee8e023d1b7b2e764712660e6852d8f60a8346a987ba322222e725050a30b8838494d9e8ad486216a686c12843038380e8c840f879289c9dac98c6bcf1c7cea3574c78d7f2a2029a33eab3fa70fdb2ba12fc2951f5c0e70637686c09bafb535ad580df4ee65f290a2c7b71e7833e6f90525c18b9296da0aee1e163b52f36db5eeeb01b1c748514629ca24479df7b95f609235682eec354470578518589add9bdee551520b828faaacb3ff52add9ac26faa7292f178b0ca3fdb7f36d2f490e15ee064a20df076f8e1008f80aaf4aa78e567fa6376ff56804a884d279fa98efe943b555f9a366eaafeaf50460fe81183b9a77fcb5ec3cff97ea7f472c63d28d8dd17d7ee5514a1714598b78352a80a50693577f822d1336268639e50be1b57f65fa15f98913ec1b105c4a54fa48311f7d7a2cba90b16c3347ae0f9dc3759480ac0961c3f9b060fdc4cd5e9db199e36ba3438bbad88f7483d8ce513551f867b448bd7d151ec614131293e3206c22eeaf84e0817f2e79e33a71351f03885bc82853535676c1da24d5f7006763c589eb156a3c9f777aa85ab0bf1529aebd65a48cb66e715453181fcfe8d094ef09233001fad51e6ce822cff691757f24b0bf125f92219a72e65862225c70875471e7438982454915ff866f3825f51f779a83641204390093435069c39bdff2239f4f0a9a1ce60752cdba94ef5085f96c5ed34dae364c72b086286ea6d0c8885b2a944236e2dd6d97a2834da5ad28f148ec22516f25d512560d5adbc305a128e9eedafde8060a6b93ed156cfe8e6f9d5ea8366c8c5fa2e8f07426b97b523dea0e85fce8998303308c1712600dfc8c1cb8680e2e9be2c648981f7426f112c7603cb65b70e313cf4b081dec33b8b3712077802d519827c695136cb9a781f6d75438832ad0721280ecf4c513ee92b0841c75388b90751a8d5099a0d7695399ea1a01a11a463ff0288f3bb9adf38c9c4d900a688dd7b9dbca041f215a0c1ae9623b450eed584bec723e7f9408385618221f8c260d57226f360a71eaf2c4dfd3630e5379872e55a0211280ccc1b820c1c82a184f915ee041177a74bf7af8ff862c77d46b37b2738cd7dd039a0e722ec065d0a9662dce7e92bc48b343a2621298c3dec904a03a1eaa59d43456ec55b1066d992e5c7e3e9c2396cdf76cbe6a68769d897f8a19b6a613278de8dd055eb97acdb0b58759dae5c700caec2f2b597b4919e17efe6f6b02e93ea3afdcbe884141977437ccf639de8a1b3e272af04b39b382e24dd67e17461013557474385db9cd6d324b51e00e19d110a08279449d1211dfc2b6d2323c91c97d831c4b1948a3324ffbc0d391c551e3499ca0c1218687ce84eae6e54b6f52a07803184dc40e84933ff7f0e4934898e69356432e46cf2d810664357a69581573e9997a1484e032b8c151230c355ca66c4668a096cd0dcbbabe54e0eb702df03452d603ecc1c8b223d16e84a8f15f274732652e640c9232341816c24f13657a2da87585a29ebb6382b762c3bd4222175e004fa841c093d386c8eb8d4a780109aac07ae36bfd155f93e801e8e74ec9fa78572c7712ca0040cf963816fdc87c1c442c0941ffb3a7f897d040132d4b91beee33dc977222fbd556571ecf50ca926a4d56efe769d397cd233700f1fa9f818fa5a3a59def569a9883d9435b11491fe5e56aaf23c087a23cf8e9c96d1c81840c46084b932d0010d0616a12b7e104ea63916ea22c6f7360e7fe2cca687cfc74d130ed161b3691c44d1fd80b7bd8e2e286419df544edf0a9c377bc187405ccaf4ede5ab045c602a2317934810ab02260d7343a37d2909a5e70d1e93b74ce0cf048fcb88ee6bc4033fe44eba50c9e2869034b2c01715293f6121a2ef984b3a9e197ddb81864bb7f5b340ebf28ada9da2d9d5760eb08d41496d370576a976199f6cd179e8630c9e342e0a446225f7703871ccd41a094ebe5da0ac50e0f14a06524ea04c2874b1110ab46fa985f4c618720d960251c7473a3bc60d283cac30f18921dadbef7594718695caa3eac23472b5dd7850704a9db8bfabbeaefc8c00cad1d225c5659074d00f1d33430ec0d1ab23f4f9f3ef2e4ff3bd0625bd736d054fb0a07098f16212ec43f9755d1f042df7e6526d5f004e163be9e5cdbcaf762ab83ec61861d34dcc6fa2ec82df9dcb7dce27d463d33c559f5182de994ec36e733fe007e8d468c44944ecd1a61607913724a11a460c832e2575bb0ab9dfc2151ada1654711d1ea4e23751f6d94708206020297e9dfc9117b2ce43c8c7e952fc5cd50cd3ccdfb259098fc5ef1e5c64d75ed03717ec1b59135afc5ac2d66fade5080f67ee77630e4972154fbdb02c462011741bbecb04122bb49da47aa01da49270fd37ddae2c1607d4ee7d5e63a2083f27a2da86078ca9e01d3b67239636f8b6e22ccec82343fd4809f0388f8747d1f7dfa143ccc8c38688b405eff02c7da4c6e375e26b3852131c1faf7f32c21a74d85c9a68d86bfe50a96e48c55e41073bc500ce16ed28f507fde744f42fd8ba5dfe44ed45975c79b9620a72f7f71de4c6ed6e08689d5f171b1c02787c9d190e5bb19ae41f9382ee46b9eb413f01b25f15e1ae3fcb8aae195f964887e220fc4a43d756e80599edead1ef8e30e267bc9ddfa8e46c53ab8878f0049d7c04cf543d05a60032dbe7fc3613f0b5d908399390d559ffe56c578e2e88ee6c16aa6303dc78b36dfdaa2ea1c92b6f7afbb1fbd154565490e644c29716cd14245c40bba1ec7a3927b77347b747f07dbdb799d9dbf903e895996b2a4baeb05addd18079188f70fefc3101015178e8928030ba173680e933152df037a06e16f10632b73f59e7fdf4aafaa4038e4c39ed074a84a9713a1b69af43ff649597e717e0bfbcc3fbad4e5c10f09f84af91fcbbcd35e0ff4479231114ffdb552e94879f59a04dc47639ada15cb9fd4cfda8af57a522a5970f01da6d3b1895be8d4616641d3735ce65112728f1f9955e6a9e24ef70093fc72f3283b66ffac09be15dc97520c9680f0018839866a26c5f83ca1a7a2f0697da190705d1813c2277efd0d621a7195bc42d9d1d54c035f12de752adcfb24824996bec71014369f77111c8c5171aecf288f843d9479969cc96b85cfb3a0f69e04daba750dadac888f89390d2b2277015aec8a842e1cb44ccfa9ac83c982854e7efa3901a80b91641dfee736812080a15db123d35fba4b0d2ee66e97d10f5e062af96dd455f79c63841fcf72aa85ad3a46a4bb96ebe60a8f2d54fe74da16af2e2e9ad6838478feacaa708a308794248ab66f2f1b7bdce98de130650be8f6dae3bc022b6210b0555a86259ed596e49e1d9f31c2230c2c0ceaaa9542a7aec0b1a1b5ce3736d38b30e2027b54f702a19848ef84814132efd7b973f6bc4381cf7085cd209c95e4f0d7713a4a5acd6fac0d574f7b9c7113e8fb3b01c237cbb007e61f12181496e792ccb9c4994db47200dcfd0fc3e1a05500d9c472601ea645072d6e7e1360b10be6f1565e5a398c9f12dc120652b929d0c562dadaabbd5d3c96f80977c86482f32b5b42361bf34941b30ca07e7658ca77d56f79435b430d390c67460d2b64239d2595172f45ccbece6f5091b3783b3f332047ff5111f1beba14d282d0c7cfc548723f75711c49e79dd1b01599d03819cdf3d20888f0c2c662fe2dba6e0214b29b0af4a3702c4dbbcd5c88a530b8c06aa6cc73aa06a0d7470d653c43d0bf3ef95862f9fcc0fbd1283c4f94aed61e9d8707c160bb0421b4802b1a1f993d62b7f88d0e98af64af17c1c0b50159f5e79ac7f6dac85561e9c5b71af8a1516c7a5ead6d37046fab9093f8d0152d6b02c7faa514d8559f505654e37e1edc550e43d82ecb3701f2753a531c6dc7ece2bf783891cee6a8d76879ad31736c2cfaf9a51c2029ce2075c37cf769441150ce1282da40c3a0b2688f09414a73f4f2de1dc74dd09681faf222f329f4c8b871f4d02556e11a20eb3eb1eebc96326b35fafa60b27b4cf0e75252432d19f5143b96f5ab980938c24398f0b2fdd3c7231ba73fe71d0340b399ea847089ed98b3b09838a820aa2e6c23aa9c28b1fb2cfa7c150010390a30214360ef32939b7a13d641e0719800d39bb6ff72ced2533b3fee322aa6c1dfa441a018646fe323e06a71ca2884909ee64a21f34a76002daa5dcb31e30e45338d055bb6cf367b65951a12a69f04ecc5095cc13b0f60c0ee1437001f175ef2fd5eb563a44150257b80ff2af10dbc915bde41fe04f7eaded96d6e3786211628f551288da64a0a5419f887e77028c6bd8a0c75fbe5367cefb2dfbb9ff0924ab2b2959947bad721147c94f6b52c2f552825cfecccd41e91142b913bba3dbfc31684a8811f76480651cf4684a5282f9a0c1b902c8f179f323e46617eec5fcb6381b751366d1a33d4c84bca12efc01e955f9c80c973f95ba4b85a9af3c11859dfad4e6a50e30f61ee1c794ca8a9aab6ecac8c663aa738de41c6ba744768fdf582ea8d6efbae43a7f898c5f90be3c98e4ebf28e24251fbfccb6cf273d85d274ee06f0c46027b48f239a58bd9e70e1b9270bda5a623683809a5df64e94f16710d0b8354deea5c3f81028763bffeda130d7a5a298e90838e53903d93f129a742eb3be99794b243abe6a84891a6f3e0fe4664c16fd051a15e5d5cf9a5e3e4b62d8af367f4e15d448bfe3894762f568d246f73ebc4745b11e5326e974bf51f35ad06efab1d09be7f608df6e7af2d65c7c392e1a53ebbeb89158c129ec814615241b88a1d399f8e4a3e826fbe77156318c86bfa94bdb4f553e911e20eee9a4e470ff14704ce341789e7f1d149300906c6a05edf425be19a61607267e4c1fe985f000db8774995b1f34f097d2b692b6b7e22f87a21982fc88fa9db4d1130e7940580fbf1475c18f5ad5aab2da4fd3031210a10658373b11c5e2ec6f16cf516a68c60a2a84e400e3c932f95151030999becccf81e1727f59a7925aa39428afb22e3daa68b82618c9ffde8a72dec83165a229abbb1af92bba80ee5de384f69d0ab493b5e3c35b79748314ac057a01a0f839f8214fb83f3950dffd092849f44b36319209c2ca61af4518df802a4d2a813e0a3e83f61479b6c7b0e67d5773d569a902a88323dcafe576aef4ca976b524d5151556279da178a73a625dc3812c9d7b8efff099858d625bd6110273516575be35ef72adbab12f0baaad8e93e2e199e66ea740864cc76b7d7f2a6f03fde53cadd888aa47222c9f431294096fd04775a35eab4f9b032b477d8f38139c009e8141a93fd2d157fa7720b8c941113c63b0e51688920e72ac46934221f88489fa32d287a9c986e4e967763547429a5b3e2137910c430aed04cd903f53a1842343ff5cc8a0e13e92abccccc605fafbbd9a4ade582613e9a2b1cc10052b19a54b8246829dbaa45ae0ab1cb1b706369a30724a682035628bcea06037e8aaf509d7c378dea29e7a2d43bfc913cb1be32590dbbeac296867a36a78bbec95e74880321a841f3f56635fdcd0ef7ffc360e82471a283985202f448a374a0aa31785b2922112df7b4c627fed9cea6bb990a05db7d7d8d6f8223f1cfa4d1a7080b7de3beb89d982b7f244c3122f9958c2b740a3aa3beba7772d79a79d8bc03b5e8c513692b831f6d61a6e9057732c27d34c5f98fd968cb823674d987795e7ed42aacb4ca5ba11afb7e930a26d932912f9cceea7ed1334e8562132d933540f73ecf0e6a3c3ef4c9cae303d218e82d21c14acd3842b0959a5508001a2cf8bd475f2d2e6c3de9f852addb9653513dce7fb895adc8cab072e2f587792918c884e01b70a47d4b9e6a8ff638b4c6909ad2a0b519e695eb434989925e120bc4e6988f351748aba592d2c11fe85b260d72856db35f2a42ca689d1d12c5474aec4d593667f2d2351046a3e20c840575da57a8e7d99f97520e0fda995128c32729e928a2706783b6ea746f4b355b798deacdd3353bc1884cf4f0184cec80359fd600aae2b73ab89b27abba1505b6d51c1b721e8d9b4f81bf5c42a377b0e341840fda8be131c016206a2618378cab5c420ff9ed9c109905143aa578a4c69404087c7cda98de09ea810be3e4e9a1ff1dd70f0c32438e0c17e4faef8295835de4067729841f0621138246226b6b4b38ad2707042fa09d003c16f2dcc9b77bea5f2a10e1b129ae7695720b58554a333193c70b4a100b90cde3902993f4856547cf655e7632c5b840a2e3ae12f4ea0a56f32421310ecbe1e0f1ed7c703cdde8042c0246995754d25ca8a116464108c98b10d8487c1873a24db4e6506c45afb88c5af09da3b82a7404e52580f7d83c075c0372aeb8250942206f9ab158f38c3f531d1cf9face70038da36d4da6db5a3799aef3dda088b488e8d159ca260284b800e520e2a0b209ecad1411be14fb43d86f61106e820db809f84f7599d22212289180a83c48e3a67f7b5ccc7de6aba5b6daa140ac5e50815a3d837652aaf7f2115b84e1faac44c806b82ec755a70e5381f58a4321b2c7b7b1a58f6c22cec718c4984ccd34d3144eaa92e85ca238ae3b7c95907508021433e416a20c8a3fb58df760476b02ee4dd1c01407b23d51b9dc9e379068f9f0881038c822d3ae31fc3361499069c396f92a336571aa66159c57f0f2e50356b6522bb612182bedb295c9eef1fbcd7db987a39da8a80dee4ee964f69b709b5d78f74ee19bf0d5ba7b61a61cffe0462b5a8dd5b1123082af915bf6111b0ea8215ddd962f3575ee7c001d6392d753941a93de749f8c63782100bbb35162b81b48053d174bbe96b36fcd832db8deebd5e600b0791f52cbc32ee3b723bda22dd0d104adb68759ab6e1d187dd9c1673556f30d342d87600b103634bec1e861b78c8a276d37bbacf97decaa7cec63961f4fdd7a6e60907e6e9f7e53989bbf419846a5a2382277bf2c08f99cbc796f899904bbebadd5797bcb1a263e033e6beabdad4c92c030ea39e44ed9a10485538137de0a0a5b5ba6fda444d6d4beae0acd58e1496f97d9ed812ac6f6dc89f128e5ab4198844b327a1684fe88d182dc2a10250edbea64382c71642258af5f2a70c250aac0a181696a1d6dc6974f8fbb7c45c188f43a5d23268cc356568a2b90479f611a8e5e043f5be9777bb84e66ce7ad00e9bb888e25382d950721ac982a065e97fd3a115ab1018824fcd9702c504a6b22f5124eb633baadcc58f7167927dcae96ade0e8fe3586c37425a04f4be9fde26bd9e2132093df2275e7834dafe21df54c624f2a1828cf44308e02cdb3145f6a38ab4e05bd4bbee8d7890a173ba481f0bed5ecb820990e25889e12efabc750cfd32f24913a63c6fa5899226928a53377ca2b7ed438e691f0db3cf342a3675102720d8678399c1cf9a05cfc92b2eef51a6ea7397470d971bb3e5ed7eb7a02d78d49ce27c43b5e93ec612b30fd569d952a2cb7537711e3a332a15833e96fa4212fb1dd9965f4574483cb7f28d030ae9919138976dc855672c19ece9efa2d309f5417aab6c922e8ba3451600f0d96f2afc8159c0f32ff0d6931ee86c5f5751269bc7287bc76c1a650c3b48c200d71903e74bb9defa3e53bf81e7eb7cbc9aaf836397c955e3850a186e7f0b6ab0be07fd0dcbf94a6f00bf13f16f61aa34ab6c87ba3ec6a0c3fa25a3b6eeefc3e19a99623f1b81bfcd087744ab7e3c26638c485789d487ad2cd898e679bbe0aeaf6013a9d4aff7d7bb6fd49f9bc2529b407d6478facd9d7e0fec0d8cf9c0a60f8be6a2013e3256f3f357c3620c6e35c1e69b9d87283158a8194a471118ee3259e20b63381ec45fe22d37a234554043633e0b6d222af2ab9a35a48a1b29dcf4edfe0e155b8c0250da7ba77624d0881bcc30dee663e1bee307ffe7ae9fc1b128204fca8d250cfd5a44c6e18e69d61984ae7b8d35cdf5893189cb00008b10692769bc9875832d68024210725d278f9406105d06e449dbcfa667a393268a94aa2cea1cdc544c0e894059a1a86b6af08a7254700c032cd71f85673d22728cd38d502aa0ffedeba2ce2f4ff4b803664fe413d41d51e743c62df7737603c5656d6848e88f49f9cc801658e5c62102368a63aa2a108e8c3fb98db355a5eedee94c75838cf0360cf9262674a06c4c814b5ead62bbe5131282f90fff6f62f4b90d320730254a0a360db745f19a4bba79f4be4e8213a33a563211169541cc12679646a23c5b2a7b26798098685e45f86cc18526117bb625e8aa3bec00b56240f821a562bc17d3abd9d9e7f4028862086a074ee332a1376180cf0b3be836d8eab3f7c0d48b63c9ab86b807533181888d03a14ec891f7ca014e0d0fe40d67b59801f2d7afc38c9ca454aa41abc1abeee40310087dfd2bda92104597bccb8e9e4212063dc64a81d7fbdc4c8c0af8133cc4abb4d27a41165d5ffcbfd5d615ce2c609b817c92bc242b8cc4f64234ad482444af04cfb8ab15ef420685f06657357107114e0439fac5f6495ff086f104241bc58ef8788e9afb752a4b82d8a627977108c75dea2cdb47275cda4e77c7022a00740e1b93e46e102554d37f16f9a1c421735830c05ed201c8ff1c4421b6188da9cd84c8c910b6309f24a2fa50448ea7fa4d6a9b3c9fc8a39db6dd24a50bb8fa9651decd4a7069a68d79c241fbdfb73516f4b7b642128183384511b16e2ee179494d60e95a2c29381b35c89109a8e363610ca03e93400e3f85caeae9efee3afcf4391934670a670a690bd13743299cc07446aa6e9f74620af819a15b108659db376f7b8349013db5dc8592aedef5d2b85ed6ab66c2959dfee10390aea6a49e36395380690b3aaaad958bfce3a321ae972f0a731204367bd8e69b8f8e815b93c85b1a1ea32c4b2d1891c199b6fc814e028e7fffa8faad2114507876a09bbf641cfd3b66af7e88e416bc3ee6cbb18151200ac425156b72f84671f1d50123d1fbc66b3f8a2e70200ed2894844b546047409926822ca79f1af4a9292fba164a8b19c34c2a3da7a43807f008eaefddd3254b7db2d48b33f4f9e9e47f6fd4dcd03b55d8a46093d474b13bfe43d92c7589bdf1a990e7e8b4b243133bef5e1b6022996a9a85f20a4ea24fccab6e522a9f7406139de5b67003e9f5bfc8a89d512f2dbdb3fa2160661599d3000b6bfce0a69fcd1224aefefe6313e2281b5081da9b21f3506869d1e5c2430cc3c69b98c5aa7f4694089efb030d57610dea7f4000328435c22733730c4599c9663f7671e453cf9d1f6ac1b5c2202cd57013f429df79aab7adfc2a8e82ce6b8587dbfc414e0056e73ebb7133d8eee195a5dc92d27c7a3e9a0bb9ad03d4ee8ac78758d4d4b4adbaaa5942ee2304333ab6d651b4e0e228be1583f3173a92f609a3c769f99d27b5d676196711dddf82bb4542d8f1a8c9e5c9a15445e15fdaee20341304a3d6bded31a1fbcbe74d261747ba5f831dd00f8707bac399e81c6da3fb0101f5741fa08a4c0e8721f0ba4d2177b8092d38f3c8cef56ea232b4c7ce8dd1908d6e063461e01a1f6cf0f88466a65f465e8285aaafbc304c7437e1d7f8b177aa10f7b2ccbc19a7b6d34021112fcd2e1c5a9e1020c1316e637921205583698b0388d11054117eb39ebd087b214410c6cd530aa4fbdceef1353ddff24018d7867c2d85121a6f3166a32e56d340225ae1685c7262a0cec70b790af447f8243cf80b0e064684ac092fc2c47aec0aba2c8b6d5a9c24c1db8ccf15d89aed47a7002a6a332439c47b6c17a5d829ff0a4e4d21e04563b2e07e8c7fc3b4b4dc7cbcace99e33e76972310136cf7a2f4b8cd42134e6aa45904b4388ea4313be9957c0134e1a4942fa482264659b948b5101ac371b061beebf531917cb892dcaf64c0cef28fd90218fba40a9eb68dbc39b8ccb9256f985706f40d4855249af220c8fddd80e404433feecd8fad33b8ef96def0a0eeb4546c6a55def1b65eda6e78cb0ad09a56dee02db9c5eef26873d854f6923fd81445a39e352ec74a17495b32ea4b1ba7edca3fbd8737fd6642fa34f2a977c13f97523766b852cdefd3e57be24b311796dfe7dae2bf61d86e34297c9efb0fd22e96da253c054682582f53da29cde6bd663a9b8a4564b5418bb344b5f38436c40d8a2570d4c571e472c57304e202e90c8e28bcc0c1dabcda7732426dc3ea34d3ab10f658180930fe066fa9edd46a096829803c56515a3ea2bb27e96a4975d89357b66ce4298b7e2d60f9317449fbff78416860f22965935101b14dffc41bffa31b39c5193a4060b432377461ea9250ed77018039790ccd1466b7015e34154f77485446de7a6ebdf414d57db28c1be1bedaa3c04523779da3d4f5ce7c7552face3998974590fbd581a6c7ae74705148520147c969c3181680166e59b18d07fb2098ad3a3ce89690548534bd747c7f741680e109257e27343a15be5e169b0a5f5c640515cd6c9563942835992a84a19c0360a2428d26bb23bed6792059cf8b9d3db9b010654e17666ca4573626f2fd11f4ef162ed51c72d4300029fac47d6dfce8c0c91a81f52865e8fcbb1232792303708203d68e63cb99a4873391a284301e4720da12ce9fbda4131f403ba5509ab6ad0e0302a7aa34de5fdb8538237000a00345524af5e248d5c844e6fb1834a4b7f4065f2ab48f79989c217b7f99c34c61a1d1cb2ec0308e74d7b11417ae180eed07f3c25dc52393867a97ec800fb63f6ef13eb8447ace3e656dd2a58ccafa7b97b145616cf1369776cd4cbed00efdc88f311919b8a1d00824f1a2d23671980d161ca969d1bf35d23417097a56a7a12c3b6277dfe804d27439dccaaa80a63b2b3a709009dd6402aa9723b000092a61fc4f070782e6e087c13e8c3e5a0a1677b9b8dc0b1e9acc59ab46552b7653c52f838ef05790c38ac3f7a36c5d8d994efb1047827fd62e45e0ee57868fe551546dd0504f236d72dc293c0370828bb2864f594a658155181ea85de9787f0ea1c5acd38d9d0e76b6b5c3c7c124479647aa6b0d37228b771d43313b32083f3e13308bb96f01791744170b6ee6b81dba85e05abf4bcb054c53cc6431671d73195a5b47464cde405dcc728a4d5454deffab733d6cc2a576113cfa6936b7665e49ed6ec34b00f531d89ac2a32ba8743c71980feecf9e25df3b08d6cd0a0628f03e655d9c288b9b03c09058033d3fddcdef39b473bc6b49a9d0839ccaad41270364c425563c3153c8fc2926714b9ccb4bdb0a7efc6e5cc031356f7998f660f196e9f85a45dc0b2071cbe30d0c5496f07c68835b2ad18e1b50f922c12139dbb72ebcee18bc1a5a435b02d861e7350036a93056ae266d172a7432435c82852e74b9bcdda916003aa03dda731051c240f81a9bc709b0dee28cbd27752a0d5b2add29747c1b82d0bc7aaa9cc14d41fd6a5b9466677df6c7bcb69c110c2c220e39919f63c974d4a006e7237cc5c0c3005864a6f57996a843253801ac5ac8d71701c2a335e8323c1b75b219f4d05f4ae26d69dd442adfee03e25547a53c95251bc6c289cddd88f1f2a474c84d1ec059b4c4f439fd0f5978efedb79b736975bb6a52096018f4e9b078a1dedc50c080504bac1a899cf741f381f520f8ae06e00b0420c59998e31dc8191a694c32a577b12bef529ab6deaa0174b58349f852b67d69ad947549aaa41fdd542b18e29fbd125ad1f0183873115264ebdd26ecee15a38d27b3b856ffdb0b124658e674e7d1b18ea53e756e82923057612a410613fea5dfd0f722fc099fede9290914c40cfff2de3efa30f3e1900f55062ce411abb572ddee6fcd346dfb4b061f8984f9903d2c2d40477f1bbefbc218f451035a0f041f1123aa4dbd38a7c84dccfb1423e4d5da182d3539cf3c9e94f43553c0da786762d5c0dd1135d9dcc9a525f06157be4fa3011a4d7ba303213eb352489301fc9b34fd5f12c3314b63b4e76bbb8a3f88d2b8a670081a9db137688d6bc6c662009bbee3cace7568ca4e6f0af4c6a7c69a899fa4f3fe8a6cce270468432831d6836a348ff767577c611c083cbf2f466bd7c18a2b3666afefed49a450087f903b5e0ada2c98abd2755e9e7c9e0b91c34c4f252c4e8a8514d58d0ed63391cabff9cc99c9c15ff1f754b56a394cb6f3e4ef84096a27a0c019663f48dac9b0e863650f2e1efcd6b4452860f9c821e1a3d79897fa9d6c6618be4c95517c42198bf77fbbd7817188161ec98fca697494f995301878752f1c17f357aa20902d66994c9b298ea703a39d556712fe1869ccbeb3cde66d1ce00f8a0abdf8140da477262a9fa546a9f92198f3e1a1f2e92418e5e621a7ef609f552334b76631506baa4c540dbede5a6a6cdfa4c14088d1fb86a2571d896ffcdcf4e80384b0eb5f4f0b2321edeb553cefca4dde2eb389977adb25f8c7ac1d8cd2abae1e466fa9b43de66d702e7d3bff0c6c30e0896cbd1ae9a9b3a2aed536ef4ec0bdfa690cfdfec0fa66a2217e56d0d2352c218a4a2b4f96a8107ee8cb18870a332fbf6cb31f2308dd7f0431058c34680394bdd1f3486b55754963c3066b024c08992a25688b2dec96545d36db8234574924e88f1c196af776a9dec302b8573865608b0daca80e25c44029fde815f543ef0d1f9bff0636a30cf72d62f4829e5dc6690c7c4d0a566360328bd853a14d6cfb1f8fe2f5d2a3c18c622bcf1bf9ef8966692886078e2dd025c766639f5750f661517ba7f373a227c12bf0c920bc4dee67595f055eb7d8355b9b7a6b8ff4fc7014336a5e10e1790a1d1db9f86694836d8440c94fe0439841b01daedbb9bb33eb7dbb51cfb315a15d8517fb6f4877148b3c5a92e543b6d28fbc831638c53ee644d480710f55fd033a3ac32fa97f87e40a1e97b7f299a173856e51cc990ff49b95ac80da5b623cffea28807c862837920e0ef79377e6860bf6f4392738e91b1603b1750b060c8772939565c6bdcfe9077ca153511ab28bba7f29ebbbc19c9f393f48270dc81ba68d5e2b23e4dee505d4d30e96dfe1f1ed02384765ce4e27168f3d58463e7974c807aef7aa897eea9871edcbf451a06fc771c5e28b25592fd2798c2197a1ef599c37d29e6572c5017f333aaff33a7178bda2b093c9c13556b362ad8e9dab37df53e3492925e6e3caa81b7fd07a62274bd3d70e192baf3b273402f76d732e1596de387abd82b0aae69e81e2e1cd46033cf138faa5ef6c632b7f26a213c86a652ae0b4a4e67a73f798a6cdff900cf18828db225481c8031c97fd5cd467ec2b2dead12f3cc66a4314f175bcd75a5debd1728da766ed36939ccce3276d5c615c3a22cda53a17310d7a3606a5b48db3d6e26090d76a138c1e67a27cead6ba6c905afa2fbe929b125ca3c416565c2e6ceac6b60724d02350176fc97718d1101673d01a6336d6e38c9f8b52714cc2524213d74c94b2ff7eed3851af1be683f11ecea6e05fe9c36789f4915c659bacb8120c4c32daa726639506c5b0cd23c8921669d0fae9010716e7d862e42df848e79f25018bbc2c7e73b5063ba7059f8d74a87bf57eb3b8a9e7ea31d195a54bddb6ba1b8e979f54ba29988fe93eec1607da50f198f4c328245c60d6c34140117c1861247a040e39c4eb9d582bb060a2884f4e66750a79d516382e9c644d6c26ebebc06fb62c817f73b0cb0e0ddd62776592bd4ade03c46855848cb19ccac8a747b6c14c701256e591e51f1935289def9756212dc0fa3ca265ed7997b45be745475004bf1b9fe68a674259580f8c86e64fa8fa0d01fa1e4bb239c492632727a5061ee65d8f21d2663909d3c6d21b8140bf121642c12839e6e12f8763afefd1badf81e14094f6861049d43c85847e9dfa4509600a61808bb76832cd4e70142c42b1781d3a0e39d9ed7662aa850d904811cb82fe9d68cc2cd02c1d42041990c958176d39ea82204fd06e6bc61ec2340f823f0e778c55ad40c2520985e1953509de311e6fa26e6eba209247f86ee5c57a1029a52e293d85e9d3b6f83d47eeff6778f21aaaaceff014f13a54befde39a6b7c9adadda285a8ebc9863e8a80086e59285536f0ab3834f88523a4adb697a5e0982c0f7e68af6e223c2a8343c0ad277c64c5c644561b46c59e126f3cb8a9d413257814def7d94abcc7e1d28423cf62407b58f174775fe98e8d4da8908c2420ab92fbe039c4fdf99623b313357faffbc36ac92d198e8ae29ed22ed29d326874d2ba448c162673b5897b645e62478d17d0574d0952599518abab3e46f8af2ce112f3240207fee34a7e5cb75e4da310bafb015adc297f57009f1ecd3915a98b9b5eb726a2030d8c99a592eb272b4100e792302f9339c39ed7c7d62718c96b959b7b14b35ea2d45edf1ea041a8124c5cc0735e53efdd2b2e8b4e9afceff953bc37139d87c645d8672c9d0a2e176df916d14b492a0b07d1f726409e69bcec0f8355ad6d79be2ec8e9559f9afcf48d688360d67e062f2e0922065437e4540042643568f448ecb38342d85cea515e6ce65ce00ce347c0a47267ebe8eeccdd4972a4707f3c5500114db3efc20d40322fe9c617159f31e497b0e9e6850a590dbaa8431b4e838fe9a70ee93c583e6c0763a6bdd9d330beb5c3c8f2b940b83462a8178233f0be533c20120edfca154417df3c3d1b3238e88fe8a0d71438f06631b85a894bc2c1215cc63d146682145dd07d9842e57286571efbb7e69126b6e00f96430baae0bf72ff9fb7ede072f32826744f4064884a43d9259fb0c9b8e05377c680327fac47a0048434374e5a365b12d26c988a45e3806be909382d234515506990b7145fbba2b4b9094715c7c455297d7d6b1c22f57b1d4d645e5f6324b12d5c05fbd6920182e97acc63e6cc001451d8753495f998a01d4d06f0043b78ed62f35ae13b52e17ccdc8e601fd3333867a4addc1eb4dbbec70793892fa7081291ebb55006bee9a2005849453b37e8c0dc77555281645a9d084b3d861c99278ec93b2a8eaed4d52ae31dff6cb7d81de834a3e3016b157759cbcf679df0d59d8b49c679bb2478ab6cb2460c283287f8bf44afbf8adfe53f86f1a76a5a713af8dc6cddf73fdd4fe0a038b0fd2792ad7f1120597647b5f456a4d2fd9ef71d79b0954cc3ee5a5d558b7a80ef937b57791b2e086e0f9358ea1012ad2e2410c2e8a8c19c3cfda8761dcf11f5329ac570d2ba7a0a34e60ed91f912699d551bea72a9110d5fbc8afcc54649a9896e18df2ae8cb55b532293ff06bb993c682295bf79e4505a7723f7846880d4cf51ad04f265ec6c1990746bb28deb667e5cd434488dc15a1b22748e8724e13c58e72be6288885db914c9c3fac41214975936bc75b1b080e1e40d8b489053e2422ba48af9ce415f9c28a2a8206429874c1b6cb4255be051b9f013b4e928a4d7ebd428d221605f92bb88d64a2f417dd85b1c154255dda2e074e6869138523b8331f261c128980ebc3cf6199236ee3b3b4c4c9b8168ba2de84c57ae39bff670fc2c09a6f28ddabcf02763f0990501ae20a5678ceba577bad7453a7b6e77d2018b29b4533520faaaaba128fd3c467b5562f6363aadfbdfd21deaac5c36d36cb1442816dd62cc9930cd2edd21a8e479b79d949a57de00413d6d834c7560f2621984f0ca548dc203817262aa60686a741ef362cbba4013d2aaaee0844b844f0c481becd807c6a3a0033b3e8652a903626b72ff83079b0e443d9bcb7db677d4707e9ee033a5a2a4e09f9a7aedb3b32498895262017be921e39156b08629a49d378c1ad16b10d891ca1cb31910d9e1e093c7ea4c8a456344770a4825b1367d782dc8bd9a17a20fc6d84530814a6378881d6e63983771ffe86246f8570df2a0808191c65f051b3e77f9ad92858e90c80edd4f838e603e1877aec24cf4a1d309b39878f3b6a3c58b066cccb78685baaf1e3781bcec2521f9cd5860fb5dae810c9c3d8417905fff80de3e572cc6920cd2cb8dc0e0877b81b6b8af6b4c3142fa9afb404516de310cc9777d85c52898cdcd319010cc506b3c3746fa7a43c2f59f4545f15c253464342cf2a85fd28ff1774688e72361337715f83777d53e887ce89d58a5be3e7f09c4779281f2c0246a65951d8eb96a11ee198834e575efa8ffbfc7e123920a725aaac51cbd238c94446edf751211508017284dfb8720dc5077a73961418132d4dc0572c5fc91f081cae5e5e2848aefa18b0ab97003eb1552bb6d9bc55dc8f3ff05a19bc13931465d50db0baa6a2058e8eb9718cce408348f865421d94d4e42a80d100606aac3a15c731e9589895f8e9d9707bfa321a347f1f8198ef27a4e8dafb679bd6305ad7045f67dc6989feb37453c2e1a2e69e8a41ccf6bd6aca780700e6c020903949d03d373b9dc84a9ecc6015d502a0838e36ae616f253aad0fde65864bc391ef736a6b522beaa6bb72de5618237d6ecfb2ffd1499b71ffc04d3ddda9f1578bbdbcea1309d2cdf39f1c5e9beaea8a21a2dbd315f589a321b6381da9384658294c4852711cc3d79dfdba6df5e1e5a39b997e0fb82b836296a572e92fac9de0f3c0f84766370c10cdb4c1bc010aa884b1e86479d30e9a94a19c24cf736b776895c551efa9b145f712ca47fe7071e72efa0f8ebbadd299b50c72c8c8568e1a96db689c11969e65e210e8461171a7911f338708fd49671788005032132b45b65d95ab47ac3367e19fa227e680384e77b9bab625ab627c0159a89842c561ad6ff910bfa464c6f4ff1b4d7c06dbc405b7e60a628dc43474830a6fd785ad95692eb4fad9938ce2006026f18bfb6c0178d8ed74c68f9709cc10e2c02109bb754f64971f5aee55381f72fe315044b95caee39b76fcbcc6a47849063d1f0ff5856d4420890e5e68cbe2fcbe15f4e6b31a88b842c5d8b9ca9a77cb873046da66f090978643b35a54d31ef35896e5355f840f99956a14325e8fdf1c91b6e1fe3b4f4e737638ea09a9135dbe2a0e786c161616b774e331220f48e4620aabf686834ee6868e3925052c33ef04eb8e47f2aa4ac4f5b4ffc96edf1769517df6909bccaee73f3484bd02290d593e38c11e2b4a9663437de85d850b48957f3cbea5cc4326aea0b78289201f4f8dd92a31afb65b2f67e3bc70d6cf9fde6870320d10662b9b07e36ad85bd93b468ecdcab55c476de504444b244b64111c781ad0825ab5757af6a62e6072e560f022130247966a31ef5a9a0915a5300f365e29f2eab824776e67a6a690a10e23982e5019ff5be7575cfd1a8a14dcecbfcbeb5eea75ade4c59e01b5205627df06e886b80dbd3d3b94967b3ee165149c7e1636f4f51154fd195203b279078110b89e5a39550cf5148ac79a42378546329a8bd6dd84761794592571bc64cb7bdc7eccd0aaea5f1794526434fadc0ff96bad622c92f6e2d951fb2b4fd8058fce2497271989f5bcc9a98bae417e4598a98a2f958614b3cb9b5e7a7c59c3505791e6ce5ef948fd195ab85c31fee812519965450d5b0b471fcd81911378e2711cd42f16ab9e38dca7cac51b2db5421c8833d5a891d4bd2103fce5096a95e8372bc8adcbca7b3ff82e6d665e88c14dd3b29da9aa7292b6addc7234754ba1f72b5d49e5cc5edd854a3d9a57b5505d4d596826b65ea62a42fb4b0b50bd932105f5a71d1a19105237eaee23645ff0e121bab6635c5c045a159adfd0f883004b09e152cc8feca5837c02baacb3bac4878adadb3ddad0853a50224c3076daa9fb96f8b3b48ad4648f2a21006c5532732932e10c5d58fccebfa80e6226a6749ddb8a17de0bbf28675156e2b57161ae4ac594ef58d43f7f221edb64fb3b9723d63b320b26af9875c1321a228fffe0b1db31bed3ac7501028bf5f7c0163a67363e8421b74559a4c32c85521235ca5e2ff2b2015bcf9d0210e3f02564a22362e8561eed487f5d482574146d0412ca635f5a684096f49184f9181b8131cab661b2dfeacac3c7df85a9c7dafd2a50901d3053f80e1cf17a113de67c2b1abd79b924adeff4831558ce167fb16fc81615bfa1764fd40944f75c9f730671e1cf7d05385fa0d0526dcecebb6fd7c5f695a7d1cbf522d594be07a6b53f13b8e5c7cd5b5b30daa0be8217685381f3d4872c036a74087c480c139089cd0b78d73cbdca8819771603c9ff49765de53a0b6d114e0fe626e4ae1bb43021e3075a876c1ebb1d5402d27e93090cc076a194fbb4ecafa69d5396a96e469784f73487ad758bd0591494ff7771179d7efdbd2e74b51a229eb45d929d5778707af1184eceacb3ad0bba905fe9fa9f53ce1273e4dc85644945c31833df1e571b93960c23c9c53d1d9caa80262e340adaf76bae26187e6f3559d2915849a81b9af8a3539d099e90b13b26317d942d3f4876a407e32aa244e00383800485cfb1ff224f039dddfdb668d9dee3b5c96162f63ad6efd30f0e44f03e8652a31b3d8296b927fe466959ec3c2e2b34635d05b50eb2fd9330729b87153962ec2dc3d833400fadcc708570a804e2a4da717604e6a6f53424b7b2fc6b081252ea91ec9b2a277a4124f208b71fd12026ce01c4e908cac440b7454fb532904388fba637d4ca45f9cf8669bb5d8e11c8cfe19a623601688b7f6fe6d92150fec951b80ffa2b6fb7b02a4bd995ea5e1376c21e94eac66082e50a42fb236a843967b0a79da5b6ce9b85b6b77bf73bef2eb2bf3734728cd2b010548668dccd48c9ee5b6ee16532c5c4526b8a26286b9509794d77cb9dfa4af98493f8a78535dd8a7cfa99e1cf1cda62c19ce026bd3f61813b796b95cced538c543b025a16e617526c118669fc5e2e34c139989a192fd130c653c74ada9641ac2fc24ffac25bd04516d5133c385bdb18427864ac284f7ea0e352ae1947733a6a9c0086c1b005527601d052dc0cfdd840a62c142b6d3f08447c3932e286b6724040523522630dec4bf960873efb513931cf1d883db529a9d802295dccc62385b92a7b3907793a52d502f83b1aeaa0414724811d50edff726a4d30a5fbb8351299952b4b3326ccc0094924d112a1181386c36955067e46e12e88412756c32ffe2a58a788cf8da162ca28e3114e8dcd0693ba16e3a43dbde04bbbfc3d105c78861bd96e7d5fc985f48c212babd94a946658ebb857e664cffc48ec77d3a3648ec28c780f551c6f9202741248bafbee1f1c883d88446218c670e7f7bea6cc9aa0b2c3207d5366766f2e4d404898558f71389541f06a6b8b0a000296b1c4ef6f26c0903ac2d14155c67fcd2a4fd90c943bf74d7fc11e1e1db9b0d769fd9ebc4e32f93bdc1e6759694f464e6683a3cd8ed16c13b56c81fe54042b0ffb722632be1da8b5ebb31a8ee042ea75f36900facc3e143c241d8c50023ebea7e0dfad52cbbd8dc5d061ff1af2c3ac0efce6294298319c92274833ee5d9dd72edd8194dd97b7abd4febefb93cb2bcbefb86a83376b79321fd05a7fa2001b9b0565e3bc0491d29074c59adda35365e31bb1cb1e2e0eb70a1c46f86e7d583742ae1d60df4b6451fb18170528e586b635c5aaa6991e2d07d9d3a80128f3d38335c081cb19cc609a81a13cddbbb44fd135063072fa35026189f80bacc32cd6efb71c039a8ab77c484db5dcfc7ebb139511c5e6c5644424be529341536acd300ab5510cddd1d36471aef6279eca02a01c0c4c41b46a8180f2c4d140a8c7adff686bbe8288352a1ffcd6c2b4c875e00a95b3732fd259efde7ce9fe131eedbb11f366576f1f68ac0ec7ca7f20c3b96bea4af8e199ec8c0b6825092536012791b446d63c7910a959cc14ca95b7e1f81c09af48ebb3e40fd52e4c088664cb51386dcbe90d3a280a716f1b3cf5585c3c82a14a8273b4c22c27536093d30fcbd0728eeeb7d9be80a21f0f2686804aec87661e99dc6fe01590aef5e810a6604f027c471fa8a46c02b451fa65945a60778fb1dd24d3bdc05c915456f4fb8c2bfeef5a4b9356ba231f0020214632265ed9a4ca6e68bfcae39be9ce60199f10c6b55361a9a2708840c3c4855c7f25abd6e6187f1f5e9bc246fa877bcb56452e6db867376cc5667cad6eeb84ded5b7ba8288150376349c46a06f8baaee57ab0e1bd6f6eaa1df9abe263b30cb3c7e1b744fdb8646bbef3bc31dd4560ee8e1a9a10fac44e1b15482b0fc273f22af07d6bbea8670fe5b3f593fab1b56870b4a5d8901ff0b6e7305599805103b919b1cade4c56e6dffe7da21b6ff4869f97d34b898f8c60b3ff9da28257b227c869a60a10a556e512342175b4f58fa4a8101fd2835f07d7e80e6f921bfd61397da7f1b5f0fc5f2cc976c1025e711fc92d707c2a91d5f9aa12a38f046e472e5c5b448b3ebe477003656999ebe7555f4068feceaa64cd55f22c275ba66ec38e52002b66f5a0d0c4ee8b94cdaa9a6c746f2076cac50604be7c230cb5d867d3757cab111deb05ed1c9144bbe2f1990263331820e2964ab0827e8b9aaa2797e74b1fc6a00835510ccd01c3b07d8d24df72fa90054258f20b764c3c24712796abf09ede4c66dd53392981a1e9516cf98253c9f9fc578e1806b1076386731ef151529988961dc0266b86ac16773ecea6bff64eb33c93d4aebb2d28c10cc7a83af43b0c9704c62a63641b1be5def597f4f15bf6478fe59e352eefa4dcdff2970371b1ee8246e3546eb77f4764f2f5a7a09e3d2403ac5d696ed30eed4827e1ee1e14db2f8bb972fc993709f0f63879b0bf45dc158e29c74dbfda0f0946b4287558677ef5a2a3dea05bb7e687980698a6e5629c31f0381957c529f2bc91d761358b3b1672e9474d2fc7e89c76dfacb2bf8f36e9f149602ad2d433e332eba93d630a5ea128188db80ebcc55c006e86d71eff8aa8c1e38150971465cad99c5123940a7a5c9be5531765e5d4368b02ef4ee9f173dd15f94e653edd0b208a033c6dec37298a9121efdaacfe4e896b6362f12e88ce77d482c442814439fde1caea88c0d39eb3c2573e018a8eba3779adf9c8641e63c1009c7f57652a706ae7aba373d8feea4bd4c2a4e3593a40ea159535c0b229754a338e69f163a8b187defdc84240f1a0e9c2ad63c54333b483c0c040c70c0c0eedf5e77a1e70240ba14902d79a855057d18b378f986fa90a810c1256988b53a04cf5b9a74e0ab5bf097ca295806e2162666590b842ad810fd374345b7a9cdfb6d92b5a49949574e549c83dd43219c05130ed98e356d428a0308a565cc7185a3dac1ea3df615da7eff637f1f62f6e72dae294fa9d0c499719431182d78e5f9784c3ca6196457d5eb3def0fdaa932759517a976f0f0e0ac04241c03aec895a22c6ddc1e37bebd1537fd45a1caee68e5dd59c551e4b6ad453ca17b92040637f79c3e74ccbca8c14d6c2a9c989157b95e0ac9c617f9dc9cf2589525b3de0f21ce12e9976a0ac6568d59eb5fc7d824d9b2855328aeb3f4468880019e3ba1c9c352ad47506118da5ce64b5e91f4d5f81baacbdfac3eb44f85657893cafc8c9669b93817d73aca887fae0cd14e2b87372a6e8b5464faae891c5212d102e58293177c4359aa2f6f92d2fa6e16254f36aab29609546cdf019731be11e554ba3de3390a545ed556fda788f92d93976895e170a30ad743a04b0ee04aa9d3ce543406f69de31bcdb4b42e4eaa1578a44a085e818dfda5940ef88d3d086a79d859baf5d18998f088a44510f095656f82192124f8030a13b520da9186363156f70cde1b65267f2068afdc22d2ba9e4f2116858c55b58b1ab47cd424b520869fd95e8ed87cc0c80abb57efa6ff078eb3bf33043adaa91c85efe3c3dfc3176d8535492005499491cd5f1baa9000d31afc7509c87c5cb5114721f4de152b64d43f68c3e5c83bee1b9328333a23bb3a766a65193f93d6dd40f23fbb3adaf2b08e1cb009b0881d1990d2c09ab6c5f87630daaf59c4ddde9d5c1d07f4f2905eeff24e9cc7ae37cf7c093ca3b56107e0f1bbbe8d3fd82bd4f452881d95b211b8654f3ea235380ebdec954dbc90e4436823a19cf134d8a649a2bd1a27144a2421f4ea1a0af3dea00cda7bc58aeef45ffceb1b2e6d81e2113a136771d90860a0cf870990b2e2337982ffb3d92b9fd379305e423a4836313c23e76ee21e3aa866a68f3697dc45115419746bda835f942175408fc3e09fb3ccb0dd2ca0196995290522814d02df4f578bc800774cc6b80610a3a7c53a7d85378a41eb246e8bca98990ff7f60c32d64c9c372dc224538a224e25e1ea7c85cb16c438500615f6ae3e5002c9cf343ada3d99a1327b38ce723e643c0fbdb534edb614480c3b9f9a75782f3976ae5db2ec2ce995a12cdd7e184d647912a15bbe7931088062bfb40131a2b30ce1deb0bd374822f83ae2ca4a3aa6f01563c8e96a180d4b2cddf65130418091f882a00004f277d1c11f34f6bc0ba6b6f734c0dcec8c3c22e740818b2efa26da1758785597312f7e6cf9f08891774aaa59a6af24aaaba816a23145edb362e56b73726b8267031210d100774dfafa27f8300540cef40fad748eb0fbc67dbf7fa84767eb57763e3db1c76cfee37ebd217d777b60e41b8f9fbd47565ae53fa20b65cd143c1ed8b05dc8b3379095c7c73a60e0d6dd3206c67f1e6dabfba3e446317328f0471376d686f954206ebc24a2ac7988351fac9e1b9e8cdf69d050605f7b41ea6ae13e47a89364e7a0dfbe4a03ff35c9e075759ae75685237b7eec213e45b934c60a98c84d3979c353723947133802933b82e98413e719e7930673c1b419cb3291583056c972980e8d538e31b42da9b4d2e4832a7761e5a4ed6fb47b94a506ce11e57c079d09668f15d06be6d0067d89a7921e03e0b9c5c5f8c107babcc24649170032356c8e9fed99db46287c2a945a2fab1e2872765a27be6280ee038418a3294d5d5274710d2bf2d3cd744fc7558e073d0ef9eb351f15ba494ce7f88f8433a019b7d4bdb131e309eaef129eb7e9cfedd19965c36ef3b303add486d2bceeacc0f3f8c0a409a02c2d8c380dd209257b87d9c37a767c75057efd4a58fd2c352e4f3d61c616a9268899e7ba5c66b78eae161dd52022d11f3cede7701be6d360a6871106a5cab04869f7c7ead40b711d40fd27247d47d2e3b544452f2bc57d0a2874ac672d37cec4d8f75a4ede71ea4e9b64ddacdb0f9a1e404e554cfc44bc92894d48cc0dda78024a06cc72330ae0260ae83a970fccd5ecdf0e118812222ffb7ebf10e3247fe6653a0d7dd063b6ef2619d06e2ed20245490bdd2591b25a487c89899d32cad3b732aa26885079a9df30965ca0b945b36acf5b964f45f8bd822354884d0304ce28499a70dc20fab89c442a2b131cf6fe33266d4a31c0b8d30faf9376665f632f8f71ec4e25e5637e006b9aaab385fe1aecd903b4dae19dec6ea0d93b467d25e7b25d56e4566edda8ff4bf572d27d67686d07282bdad6e4f8540978dc07aeb98f9479dd47bcbb3890631a0f33057212c16365a5a81ea8bae8f7a89db7a6c302ee81a3a8da20747d1526d288efdffd9eb10c2acf5f6b9b9f8fb36862c83f6f16d1b28cbac4f7ae5272705633fd03f33498514e6760ff32dcef1a85f9c37a582243751f30591c103006518ae25c7a6d0112f4a0d69f546172a5ee65583f14c1c74d787359d9c7419f53604d9fa3929989e6105789f1f255752820005ba586623296f3aa9c3a1e0d18cfec40b23a52a9d11f2021f327ce6da0087dc9819bd19e67cfd0fea8d8fbe5442d50eed5ce97cd3ebd56ed3813a2bac3668d05fda746ec2c8dad991471dec0b7d30a4344eb539bc700de052d2cfc0fcd47ca992d5b3f28688f45f2df15e9b293efdfe008b6336d342234a177f2c3dfb5c8b4781090f99490996532d658f64e0239b0010a2163e7cce3016932b30d8dbb0d8135b19b261c6a9359a58e8166a9f09616db506bc86d0184965e3640f533a4af4eb26bf6afbca890006844d63eb8e528c50412b92d87c4b8dbe49c94f7534f402c742ce548997c05a709b3a48312a636a0dd0e2c9a09849441506caa798c63e41a331866dbcaca449807d39c450debbc852d928fb7b2931255e53df4496bbc52d064618ecb642bd55e54d8f9b8e817559476febe42ee9ff65c6e9d98d778b01972a94e7534f6c5fca8913e3cfe3af718364353252d4148d9838ae6f69e5c59cbe5e05614bc6960b30142baefe9e76490199decc46eca160ad85b9d96ddf20b2ca546018e00d9a80c5d86045da7bc7f6349e6c388f738040f907fc0c4697294acdb7f7c01411bfc02f72dd236d99225cbf2a4344a6fa2d11d46a2866a54add624335c0a060c8d57c167a0fa373493c2d5a95fb2ba3d4ba5e6dff79050e502bba74c0c75543d146d9f80be2ffe9de44f4a2a2969951fd806aea6aaeb9ef0278de9cfb6c22be36b18ac5da8691ae05213bb062eaa43b0100adff51dfc0e712bfa07fc59f6e30f50756ee209413cef7604e1d815911c5ab5383ecceab74a7911a0d1df35b4d386411101f8a9e7b13853144f45cc23758aa943bb1d3db453d9fcd34bb609a1f028e1b00e50eea562ab613ebb6dc9cfb22bafc859d60ad6c836dc93ed17347ade25dcbdd394b1c0a46f1e9615f2d6ae234b53eb9304d626a298faf80f5e79f72af4b873526ebdc672be9a55dd7b4b7275febdc40edb307c1c719c73722d95d5d01941f8581d3e4de14c31232c2cdcfc152f6dc6152a5f27dd6944bef446d59dd462323796803af2a4331ecfb43a30b468a80f5059f31267c1687cbe50315059c6c106f4b0bbf01916ea0978cbe1501e7068e438526a7bfd0dc444565a0b00971547f83d9c8ffdbe773c2f21f7c68c877efcba7ed7c5e9af8af86e63bb95e547be5a2ae3b88c88c4154725ff9e3b51f91a2d77b756bcb9fb10979cee83d2866e18afce6e67e689e6eef9ae92a82d748f16a7012a3eb99ff7cf457997c07babea4b06f520a5d3e9e0d37f5fe96a25b3103e3cd6fd5623b86f09e4fb58976b61284b1d823d54e3449af933fc86fc52d71f7b293c5b416a1826ab595044adb356e11e9e77f2ff4bbc5f957e580c1670f4cf59c388e778d06c7c74079d609f2ba8f0ae6ef4474057cd3f0c7b568b4621cc411e2257d151fbdc19ad887ba65bacb586a4327edcf3c3a2181767192886f59f45b50857c027c9a709b663041231a650d48a9783ff339656951573833990e9c64b03c67733c2173dc7fc98b39cd1a2b4ccd49351f54d424c79a11cd146fd870e115b8949d9d486ac043be6306aeeda1ff3a87c66c8e133a5c7073b5333fc07b8f50974cae166c04004967b7f93d73d4bf9928342aba412142dcfefd1385731df822b6939a8ca894c313860a6c66d8c3ff85d7eecc88b7c84d1e15e3276865312d4ff3f86161ca4745a66485701a1c4d26c7aaa788de313f27c1c3118bddb14d8c3e8a873c284247339b7821f9b707fedc6cd76e1061b38f5b11c9c047a46dad36c8a5d3a877d0a161ec7048e09944f680b992af4aa220310ac2e5a7a0c78f7936e11448d01677f5973b508318466609177d6f2a22ba3354e6184b1404317a94419c53597316386dab74214eadabf9cced945a763d45333e5cb702d057bb6d9e07846d6a9c6755c6fc5713533ed4013829c4da717fad942af0c5039294113e9d9202545a10232e7f4efa3aff8bda4d67eb7bbe2fa1c1121eba58454e8bb99c4e7808d805363fb0a3bf2f69d4eab86eaea93de9588155512075ddb21aad4530512334cee73ffb5ef1f3d7bea2203f83f8eaa958064861d2fa0cce2f95a8cebfab6dc187e30f6331bd585b75729fc3d9a6182f46270915b7a55350177aa8e4a6386742235f028b2cf467ceb5b81efad3ae35e146ee72ade5c4b1d9fa3c9345c7df0dfb88272a4cb944b74951d16d95c2a088ec789f41f8f0f9bd9d744be0aa1855fc8b9e13f822ff1470c64d7a544df9eca5bb89126376c96a3197e23438eb8ed0d5e0e0d7e2d3ea15ca07ef61de8ca80a2900162b6a99790a5d0dd8d8a0d2efde3c6e30cf3a86923de2199d2ee34c5f7592d4975bf95abf6603fdd84c591ef716c03738e0ef4ff6f89ad2913ae440fa6c5a161fef60c6b23494f70ff006ca6ea78708767b3bca64700c2171347d50075fd89565116114231c523ca46eefa74771ca433a53085b4d7007c330062ee39d1f468f9d35afb391eeebaec2e768c81111561bcb82640117a92d00fb2262336b80b963c7bf2a0277eabcc58f8d7e1d6b33929329736233699ab8dcddbe9af8b16f048619962d7845259344ebedea84a097694f6c3057520aa6fb860b5624ecf687e9cb33bf9d96212ca054641d4cdaeffb3c6f74c8f67874475ccaf35ebe44a7fd664a55e207f22232b69409d6e3789e0aef5b5fc5459feb08a03875ca6f55d75a5255a62256512082bb2ee07488430975eaa8a86cb5d0e1d54088f97cb57a02767037c8ce217f0b9ddacded90528d1292dae5287270b9e1ddb8753006c350193d2ebb8fe1c2f7b9a103fecba7a8164c0220537a4345b88a6e6909c7c50ef8d7e1694d1ff484474e6c3a0e6a58d5c60de81dc8bf780bbc5f033602c1673db46de0a299955009937b5ce686db9273fd4bbd77c3c95406a0d2b90b45e2ba7b17f3d32742a301684d6c7b94689041dc96199dd7789d98c001a5a968dd15381b5b9676981195931c812d5a7a150313e78047d81e9989a0e95512d00c21e26e1d4c0064c9fd14d33bbaa8615d23049543f9dca4cb43d067cad208ac485ec121e305938077f0d9602f09b4cd9e39c824fe014233d91a5faa7fa3440b8a446ddfa5714c0157a979ad2fba1056c41b4da7a81634648c3cfb158ca10490a25e260b96d3f9c8c857e7220e781f2cb4201b76ef0c172691e25b70df7c79b811c2125d6e4aaa0189d980f34d8b8de673aa3e838d513da3f934ff85bb14b7e49f9ed4fa06a2f39a3cb959cba50a9a16ce8361c1339b4b501f063f218d30b0f27cca2ac2b66ae53dd7b972c6d7142d2be0923aa0e527cdb3de253657ea56ed44a0a20663d632e6d6c7633ac2ed80015bb4ffd931c9390da9a87c3a60f334f9cf7b6534b6a9f80b30da450e156857b6f45f2edd7832c29e60e60cb7040c6f863145da5912deb606ca1c76216a89fcc485233b7c4dbd6f8315524c6f7d2ac7d6a0bb395457f12a791f571a9b4b15e3afddbb661e21b5cf65fb0bf37e91fb768c8bcf98cb72aa1b0bd21fd8cbd0df7934a9886052a99e8d9eb9f68c31300edfed291905facd2e6b4c5d8a2297a6f654480034c3bde90815556d4b38af883ad7799d0adcbce05ee0164aa09e1635c3870aaec5f612858f33d913515b0dab5ae95d58410ae03c04cadd73d736b12ef65b21b828cefb41b59d9ef2f838ddc951885dff8453fe24894b8135d154ca63ceb3a1e9a2bedfcbc50f9fc220dbc76024ed5bda18cf088e2d2092faee12be84aad64207e7539d78eba2a89a1feffd794642b05b72c81f3a494524b3dd018b3a8ae1514a9792da5b13b8cb3167dfd946dca2262b313354776dfa2d2fd64829cf8df4c020c79f0885cd2c5cd4f20fe91f2aed6b44d09b9a6f6b7470961cfd11653fee84a65d86188a97a757a90f33892aeba46d02d9f0bd5d4658ecd8a1e2d3a8aa1a073af2cfd8887bfb2932dabd1d51d07f94f62da9d2fd0d2f1a207adacd8b4cd3279f0337b2f0ebfb3cb0bcba0c688ad7a8df98810c16b59377dfe8e4ff2b1004723a433baeba1686b2d750748ce8c9b3c94ffb07144524c698d3c90f09200776326b403fcabdddbc353870c4e5e83e8551d62ec632e1965e425970367b0de8bfe17f06d418f68717431b757397fa3a83fa5452866a1c0d8dae2095661bced14e135b0524b4a3b5516cee1b9e6da608f00ce9d37eff2806cae77c9a86b31a6663338842b2f038210417a18621fba875409a57eb1cf19266af46e69c69240c0a47a7cbbdddba49509a2cb2e6cda628825997e221c8e10249082dfb30e8742b893b0701a33ef5a2d45169e2d3c3e1c29206cbbd105e37d2877728d582257bcefdbab2e9bf39d811f3e9e4298a5810c59084c240a6083a924ca76805a39e5b2c7944bf7c812d5b9ef7a4d16bf71deb1fdccc5583ba07e5d8d81d6021b8930d82f666e93de8cb82b2b1ed1c9807acd408a5e868a80c32eea6882d7bbb2f07360f487d51d88cb334b576d7a826c667bf10092d3297c6f0254042686fbc61813e9524a55d67a850a9721573c0ea24022ee75d344fd2ff7212c9e98222c4e87c1f21e8f3fc0552da8cf5631e40ead704017f10984a3533ff019be0929c6e7fde15ae9a1c427b3b54e983cac16f6192370c5952492ceb081f20127d6869a58107c31d6fe55982064b6eb37a57043ef03c976ab2fa8e43c5887494b61585eb9d461690cfc9db84716d764575b254bc3559b7f53f24d695893e14f3223b96d9245f1ff27f95568b028406e490702314c5029a579a745c505a51493af908642f1c38aa151b37806ad1d1caa8ed16e05d21c1ef8a30369112f4d72028548e4e62af311445f4d39ddd29c2d783d89e3cbe8b04151b219d6a5bd494a1e19cfe214696ebff6385f26d2b898d1042c8267bef2df70e720729070907df01ba6c0dd0650e77f239745945da9b0274d912a0cbdc0066ec0d968fd165152b48a6cb36a6cb1c0e5d2605617918948f34593ea62edb5297b91b7c7cb0fc4b903459281bba6c05d065ae860e72e9202c2f6fa4c99a81d1651b802e732d37d60c967ff149534d491620690240972d0d5de658ba4c4a6179efb33374d97232749973b1d265155c4f9265479a688b2eab90ba2e93b8dbc9bfcb56b2e83297327750baac82a7ceb592265a2359e44fbaac425ad16512a7a2cb1c695a932e5b2e4597b9922e5fa3194ee2e68eb963e4da9142cae7fa8282466ee31177d95c4b5c3917eaba091204b644a08b04d7e99a09cac911ddc6dc670555ca47e69039604bb43741d0c941ad56b025866ee34c0bb228b035f664677878608b8f1656aa54dff40d6c89da6d9c61281f3b3a395040015ba23563b5c0b2b16aac532a751b63a92f00ad543c78c0961c247c3b3ab106b6dcc6b59eea0cea4db5a9354fdc802d51154510d04a06ae3a4df0f97656604bbc56b0455e01b2c863a71b601b408101cb2d6079cb088de76dd3b5922cf23986853b583e9b30bc46f242e6da8930e40b8cc9b3bbedb56a1ab3ebe68ac0f557f15e2b181c2f7fede41a707cc666b0ec28e10e1096360cc1c564098e6a2f30a60780216c0243d8936f808981e1b33659828bcf145b400cc2091f44f8f1e3c78f1f3f7efcf8f1e3870f1f3e7cf8f8beeffbbeeffbbeeff3e1c3870f1f353798c11ceedf628283edb948d28d1ff359436882b0ada6e10969c0f7228cd957428f428f7ed2493d3c9508c2d276673bdb032eca1738464b09ee64078a61be4123765d631c1ac0d1e2fc02cfd749bb786a6f081168024db935bd0e5d7bdbe158b6b4ad03ce17982e89c81cde4697b8d77c96e348a47b265913a34ba1cb969356cb5e58a66d21114e34777036425292c284a462c5094a0a0b955ffbe3ac85b6ed98e1026f3adaa32b714593286b39ae7280cb5127f6e84c064de6c69464a1e76e54c51e71472787035cce4ea72ee568938c4e9693e5d45aab0caf9586caf25a6badde6b85a97fadb55695d76aaadd6badb5ded75aaa28afb5d67af25a6fa82c5e6bad35e5b5be54d26badb59abc561bea8ad75a6b55f15a0550495e6bad75e4b5d65053bcd65a6bc96b75a9a3d75a6bc55e2b8cfac8a3561d01a8b5d65a5b6a9dafa257eeb5d65a5fd45a6bf5a14bd9ebeb3d00d45aeb4aada1d7babdd67a924d87dac2c50c30a6d20d2f3608a0061718016879010019566458a1a184c59b4106172b2d46aef25177575fa9ac4428dac9f7f3a17c271fc7228507e5448464f2d00a1524936eb591d891efa7fbbe4f4b6195a078483a5436aad809a79e4e586c82a3ab5bd8dcd999dfcf57bff9619de8e2386ed6cc364eedb8db38b356c89abdd5c6a1104f88be6e3b361d9b8dcc9527c94273608c9c386d92722621278f1e785bf9f679049499342ccfb30578fbdc0163bc6f9f336d9aa7d33c9d66cd69da40d1a519c00065264ee959862108c6a80869d344a17e504fa086a4bac482095066f2dcf02c9b1004c65c9d36cdefdbf9be4ffae0ed924797feed12075066febc3c4b1de0ed3207c69c7cbbd4d1a6b9da81b35dd67469c5b7cb1140194a63c3b32401de2e73c09814a036d1d329e824674ef2f4449750ae0065288e009e1b0b2b186302a44d14850a821282faf9ba94a2092843796a786e1f3c304605aa4df4fb723e9d8df4eded0228437f5c9e1b06787bdfc098916fd4e6c0dbaa75ecc09b2506285369603cc728a0803125aa36d5d36975023a0509e9128913a04cc509c0737c02deeab7c71e6daa2854e441014105c19bfcf6a80494a93c11066d798e4be0ed91078c197d7bb46953fdbe78f3a136d15f3c4713e0edb10450a6fe14d1a66aa1a0c10078865ac0db2900652c9a0863bb05ba847dfb0d186357aaed40b4c93a49164ac3333402de3e03ca583811063de4e162bce0ed2fda64a17ce8d2f5ed3260ccfc76af4ba1cbf03c03dede3d4bbcdd0594b17856604c7fbb6d93f54916faedb34bdcb7472863fd7cbb0c9b0edb0e9ea7162717279c28932551c2414953769a28148a27ca64a81b783e69c256ab6ff5ad3e4c3f7fa24c46f3f28329f67d73f5cdd53757345106fbb181e6244d180a75429d50279c2883f108000753ec8442a178a20c8653030fa6d76af5adbed51765301a17fa83e9e98aae3ebaa28932d70f0c9a93345d28d40975429d70a2ccc513001c4c2f7b42a178a2cc85d3c283a95dadbed5b7fa307dfd8932174dbc5ed41f4cedf7d5d557575f5dd14419fb03001a4c2d0a75429d50279c28637968c0c1f67442a12c9e286371a20c3c985aabd5677dd697f1f889329626c2985d971b67eb075fae2e5767e972d34b4f6486a893840c9d8b6ea56bd175591298de854a88c50945bf72b7af321a95158bd52aa3c1f42d4eb415dfcfc9b7e2fb7e307d9792a160289e130cb5024361281e4c7f4db014d809c331c14e29b0d3869d301c4c7f15176985d198ac52ac56180da65719b1d6f733f26d9ff5fd607a162516c985e219b950db85b23a140fa64fa9555e17ce75ba4ed70907d3a38ca8c8ae2e9acc6795b3b2ab8b06d39ff070136799b2df8ff57ddf0f97d59cd88d07a63cda43f1585c87e2c1f4d9b562d20dd51ec5f684f3933dd993d5e1609a850231da6443b258873c4041d88a33d83afdc098e06c934a20b0c5babcf28b025773abda09688ab77e152a4422f996eef28d15acdb661a59a7e53eb7cdc0de583744d6451bdb451d1d6b624dd4116d32dbd6c62036a409a659fa3bd64795822ad56575a0036f33b6776744dcc13ef4defaf6866e11116fdd04b61bedbec0967e76b19b6fc01d63bbd96e8e48e064989b9883a2b3b2633db3b49ee992f53ec9b0f560dfafd9ba5457abb2975d7985b89876ad1e9c04223feb76e36108ee76e3a1bb21b24e88f6ac171131d64dc044069c8d0908d1a5e8935f703fc3aecdd109d88a41e28d34bd344b3f86e5e180902c2137d87af4919a6d14d2ca5fe0bef5aca46197777e746d30dfd708eb224dfdd32cd62d6bc84e4381add360cbb2fad68998fd6359d83643765c7bd6bbd36ec4b64b3327eb22749430a3f0f141c26725cf1a3c63ecc7c7f70e4e585a4a70d99c87db0e14dbcb1ed2c6690fb396c0f5658f36c52021a4201c10a9239780312c904a4099de11614ccba3832c063010b1e70edab61fb6502773ba3423be56195fb427bb196fc50e4293cc812cf33ad70e9ef2c33d44bf6fba46c1ee8e72800bd291375dc26953a84b79eee0fa7a88e77ba7757a7409fbcc9a80311a0e91adcbddf6437c8ec7b619f12d25503fd1411d64491550ecd852a51203973b08ab6e0a5d86aefc691699832346816710ca91a650079ba525c74992fc3d38c7c00dd1aaf6a690f672a7264d9772a7f09c271803779ef8864081e74d505cee54af525d6a215d82aa860d5bc75a8e6b1d1210c9237bc81eedb9c092477b51feb437f3a4c1f33d69da9b52055be6bfc00d215f4407b58e9c72a64b43740735145da28131d6e7a507600cf6ec58867556bf57db8cee271ae8085cee1c3ce76ff07caf807ac89d2c798067779287fca9ff0a8ad4308f9e52c8574828dcb45ae3ccf78d0e6dddce770e8f2ecdcfd71b79a28e58735da92373240fd832658fee1d51462a0161cc4f29e4414840381e3ce712b0653e370bf07c6682032e4b15ee529657c11827604c0f21571787087edd7ee8c7f8eed651b57cc59a9e5148975ec81c393fbd93b879a9923fddb16716eaee6e1cb7383379a0d8b6370dd034b85d7ee89770d4e7d05e8443386b081cb2abddffac7914a45bae9bed8180a3a79c9527c198c6f53160ed645c1f6474e984763beca0017aa794d1257815d05e16584343b8c10ece39e19c73ce3967ad4ce480a6be5e46a5af27496b390ede138b33e9c1cdf88cc1073cf042b7e544977d092184f15167c88e95b8c967d0cacb43634b83198673ca19addd80c1b20230788878d865ecda332983e419a6e0afd78031f5a378513c172ff2106489df4e62a1a65d5eeca32bbaf9783b77332974b3c51b4c691d090506c3ee2e1ef40217430063620d8d3c30cd2e323694127e621879d00944d32507b447bd9f448a2fe0327c7c7c84d90fe4222597e0e81261e0a80361d0e7961a1b8ed7604cc3e078d2fd0d50ae81a8d35e0f1875268c3a325acb71d366ef12416de7b5474fd25472ea537dac77692870bdac1008ae9f9b0e55db76685cebb3185beb2a65ec3206b0ac157613a8bd7acf72a43961cb3400fd4998c0c109670f43af460aa6e03de9431867da83926b11901a20c1cd39e79c93d269436bad95564a29a5147e949e524a29ad95aa000743267276c0883bbf4b9f36270843267280706f11420cc7118e2b5c622ec8323fe77c77f0b3b065dea241bfacc0ccbb38007694214abb296d80f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f400c9ac9431429608c4850cce47ccc75a61c8c40d54386b8d240448863cd71064acb65ad5e080e15f60604c18a2801eed006429c1520438cacd87214140ed01c124245d9e283c6970d068d465a9c29f1554299f1e98e3ba2c6df090cd470b2b552a1442f9d8d1c949026b5a97fb84535f005aa97e3086c51dd852451104b4b256a7093edf4e854130b571c12e52c366b8150ccbe70cc3934c191b61c838ef34024402f4e25c829553d5052c9f5027cffc70bcc4709b3b4740134c039e670c18f03c6db080e7a90410a3f72518a0c9068de7b901053ccf10fcf03c4be0c34798004df1d4c3b38442029e6515663ccb2cc8680e07d014737878963cd8e1590a418767f9030117bd2f47004d317580677902033ccb23f0b38c410e1dba0234f54c019e7b0b04786e300ce0596e20c6459a80a646c93c774fcc73330187e78602cc73fff0c018edfd760134b58fe9b991283d370e6e786e1ebcf4260668ea201b9edb030278ee11d4f0dc2770c1de8f4e8026792359e4613c472702f01cafd0f2a233ef390661798e3d343cc72600f01c7f80fb510968929f64912bcf31272281a30b66e8c712409304b2efab45f4c07d8662805dc07d0a4089f20c5729d0092afd19d034776e9c3c439e01a878be01770beefc9267157d17d034579245ce4d87b60de8b26540b7800e08187cedd0e8b2554097b91fa0ca872eab5c363d74d926a0cbdc8cd36583e5657459c502f1d065bb4397391d7280b03c02baac226d3b9f0fed6ad8692308893961b3ecdaacb52a7b596bb32d1b69c7b0918665f24aefb2f63a66eb653dcff33cefba6ce3393327acb51666d676766636b5dd387301ecd608c206041e90799c344dc0e7dbf1bc1497e24e574d8e9e91f2937293df83808131f5f238c4a01bbde473f6ba659d11d1a45df2d895d85b7139d96da3d1244509c948a494dae852dcf12060600cf6f81823912496c414d124921e633cc9244509c948a457a494d2107df6ac3ddba016ca4ee98e68a3fac00d6083e972ca3a4bbb89edb0b63362e2ec38447076b9d50bab188661180c8661188661db85d50dc3b04b4a29a594524a29a594526627ac8b39b49a1aa9542a95aa1976c22a8ce6799ee7795a289465a16c544324954aa572d484b20ec0960d4018a71bc9826acff2ced9ec9476f124a23d7ba6a56accc0180c5bef0dc01888d3275823b59ab12727300ccbb0437b5dddc4326ba7d6c59a9803cb518361588d542a95b298a66118766d685d10da765fac86590dbb2c76e7afbaf5704cedc4ae2e882e5523081b36c36c86d979e5373fd2337d83757b8b88b887637a3d1f6f0726da931917d343ad2f2024832b39de44d263afb41767ede03cf4893ba28cbc36c200620291603817201c0063a0e4481d6187b20630a55dbc199259cf6c972ccaa1caad55b1c7ac8a29024908749a49793cf98aab28916ef2148f7f974a1e49461effa24ba3c7f8972e718f87d91e8f00195dca1eef03100eb88cbdd1b0d6c6682f0249538b182d204d2dba58d3d9db41c962b1f8098b9f28b1c2240c9950c20767534bb92a97d7fef77ede19fcbaf5d9bdaeddecdbd51ebadb456ee81cf7d11591dc91975c92a7b82537b9294eba265771495f7155bcef8a9fdc3eca8558e539744e8af57be39066b1541e73e46fc9a7749964a158275db696ca235e711dc1d9a758cf320618c57a0765293762162747f9dc68b0f8c9258b9f3c6b2da507163f790e9d7223224e790be9d59093e7d02a19d5fac6212744cc7921502e8b9b726d7b29976294ab83fdc98d43acafb0aee2f64c7bd649d64d6e9f6ee768cf7ac9eddb23b76d7ac76deeb6c86d5427d139cda375ba477bd6ebed9de669effb6d20dd4122d075a933ad3671cffebc4e9fcd0b2d767543cccb524a435ae0668431cd914cc17acc5ae504b6de42a8dc68d077a75a48ab22909496dc51d1253599f54c063491248bf50904d1a6d1a1655905c0317280088025ea2259ac0f00ca742731c345f60cd6c6c1d837ec1af690146c74b68b707d19b787ea7ccff7b447e1ebdbf5eb211b6c2f2fafbdfa006543821596c19badcaadcaad9a9112c8443d95e557234f2f565aa552759d5d71d1aacc86b63203cb9c59e8f9dad6d2479a52dc9241327329ba92ee094bd2c166d93aad6b96ac9bb1cf16cbb6ed1d3ac6611816c22e8285a00a23611876180cc3300cc330ccc54603d3300c13c1ae699bd675d857361ad8d665fb0b371a7dabc93b9f5d8add88e5f5d83fd8b5e235553d730ac1fdd643cb0bad5ec9d3d6658e4ebdf20808c33abd1247deb4b743daf44faf5a80ad2774e418a292d207c6487cc94b7e125fbf1ea18cfc220cebd7153a0e914cbbb61818661cf0b67ddb3691eddc26925d1198f281dff6185dcabec9e0ed38c0ed303046bbe7728ff46ddbb64de4dd4663eb607b22dbb6b974c91279e62e227255b6191c16d130ee6a91aebbbbbbbbbbbb5342d7467b960e68300d1832918314ce5ab4783b93b4a9f53c716f34647753a8ea99fe71d15cb4a883a4b79d0d956d46ec8c88987642c05553c1894c23653568b3f4d39ed52a284c9ace6e9176f4d4317360eb520cd0ba8402c66837459f28bad4565bb7a4902c83586bc283cba15beb3108d7656b83457fdb61081b889831481c82adf7e190f62c083b1bb00ba38f4ff4b9aeec17766529bf3e8cbd9f95b478e5f7cfbb8a8a25cf62a331df3265eb61765325a38f4fcf705cf4893e5d06a3a5485428abf822085bcf2f189aa28f9c575fd7652df60bb3f75cb2174d08b6feb2cd70816390f62c6b092e7bd1ea8da31b67eea44414c16109c016eb118030ac693d955bd52a14d263176b4cb619b28b36514737848932d0a5bd58b128134497e64fea95ca62b6555907fb67955d66d41ce8609386d58f2e3480bc124fab69170cce3848297de4d7dc0b0c8c81a579fad1b3cb084989c9e57180323258dee4caaf59aca7b8b0594a2e6c920b7be4c21e5dd82cdca562a371c5909fc875f91c7a969f756dbb4cb1cd087546442cd2e5d0b55f276d34ae6f9d1111b7aa3d2bb7cac72406b6bbae4bed57b7dd8889ed718860fbaa49ec570f38c9c3cf859082c4b02e3d977b24abad1da9bd64a3213b4de2589171a386472a4271c3d3ab1c3941768c361dea49361ab6db6c6ee24dbc91cff57286a6a63deba26d460dc168527a3f89c4719f25052e7b1651da7344028f361af67dd325edd6234e44894272e338ef461dedd968f2fb3e7bedb9af75b166eb42db8cecf65976a3cd8d3a7aa667604c69de3a690122917638e6b929e7a49384a38f1236742805d59d404a02f74308384013cc0c8973066aa6d63e307d76b1d65b891c0c03432678a8accdd1deb3c3c7183924395c717872b87288725862f1bee99b1982ae6f64b56cbda299a35a3bba744d9c899a497409eb24dae322ce24da25911c834421983ec71fbcf21c57f189c6e924308d36f7b4bb557145ef6e6e244456b5f1275661cea8523e7424c479f42ada703673c6763626279d745b985c9cbe7934bd1ee2f91a4897308847bfd1502439283a7167d47d4e9479d24499f07e965a7c9ea44bdde7495d52f17994afccbfe812f77997897dce92f679047469e4f332ba44f2791fbab4e2f34038a04b2b9fafd1a594cf07d126179f9f4097fe493add688ce69c47b98bdb379265e5a2fce4ae7cc53d39c95df1919b5dec8a70dcaf1bba752f15b7bebb2adee27617dd16f65e17b7719a4508c9423fa238854597544e9f437777062eaee2ce40089bd52b83acb7b82a1ebad776b963d8b32b62efe823575b71497eaffdc95df1957b7217570249160a9349dc2fba2acee2aa3ce5b2f8bda2a3dc94af5c94b7b8d2c595439a858e60a4498866996fd1cd775de6e66f9749f3a37b27d0debccab5d141b4379f726bb4378f721dd0defcc905e2fad0de3cc99531721190c38dd1debcc885797179e1adbc51a68aab01491337451f4f1d8dea086e8d433249115372faa882d88215c0924d5c22de803e8ae668ce91ada3519d236b91eec9e8f5a39bdc93d1e7ad94404672c75ef2c098d1e96513d0d43b5db21d841f1d28e4482634aa07d3873e0a7d34bae501e2eb99cd9c9934d30313671e314f30029b955c1c16c0f674fb81085ab719a387224ee8a3c78d86b5a16b1482315ccc28b31787080efdba9cfd68746b3f7a0ecd5d888d88f8ea1ae8e606c3a8eb212636e08c98184704c297090eb83c6720aef31479ba04371ad1761f7dee2871237a157dea60085ec190091e3438b35a8a518f2028a163034c1f03227088e0eb382c8031ee196747b73a8c469d06032e8eb67376bbe5b66e05c71770a3d7a7b8111731f175c933fa1c8d4613c83ebb720361fad9c99921d636472f57dedc80db04044cdf40f4063800d8c44834ad393367a28dece4a88b36cfd146b37e3888730301d11e688a3002893b1ad327308d558850c0f4f3393201539ba63551d432bb7ce37326e21c6d60ccc583c437b26ffae6ba6ee8badb75b5eb66d7c5ae7b5dd75ed7ba6ebd2ebdae1bd72874082113303ceca9d5ba015eb4ed908d6823231954a1accc344e7b4fed98e4ce8bd5381228fae8341bdd24301de54662768d73a3c365995b0b5a8031dce9255097229e3ada444a82ce991c35330450e625c2a01739dd4eb592081a08e8068823917e201e3ed8c390091e289cc18630ced011dc04327ba469ceccdc703ea99d3933fafc8430064a5384a259e8696c0e4e87dc893b3ca0af4839dae468836393e078907a600ac48369a748712021daa3a28b6edc717782341085c21bf227483f9c909dcff37e126d208a455db4a90227da5a747bc814b8dc374098be6fba84d32818133a7d230163383041004df2a603b0341365640f9d16e4a000d3a3482072b1f9a15e54459648645d23963522b2aeeb44746bf42c13dd21989e083a0a8928004d339c5e881b304674fa95145c82335c6d38c355dc015be84777862e1e0159e86528a971b1e11c6d4e3225d4e56983e90a965d9e2dc0cfa3879ec52b70248f30e0222582bb240fdd88136d88a038471b922edab44757f0c8c5f1024e74eb3006e21691a88889b9df105df4f96beb41f429127dce9987107911119ff4b082b76fc7acec314f6f208ce981e92b77fb92d061eaade53812a9c2e03c03ce3eafe8f6078bba1b2b98c3dc15c171ee802df62298bba1a010e6ee1664c3dcd57234ccdd4ce6c83077b1d5bd782ecc5ddb371673d782c2c2dcada98ab94b7950ccdd196b26e6aebc214362ae5b812df633e22c721762d8cd86812dfd0d77cf8c03ee935e36dca7248fb322b85f309d2b5634c1c13a7dde1110c21080cceebfd088fd44f7909ea4f91f1d04c190091acc701832810410b6e8ed4a083961d6227bc5180288a7064e28bd6181198bc065172cb21e4370823149c412e01953806774c194f2320a314528edd1f9789a9576b08a48edd1e03873a5542a2a701cb78df87c3b9e6731ef9299d466965dcbbe3d24a576911136356a33fa8dd26bd8e586655996456e6256669ee7799ea7b2d65a6bb5edca306dbb32ecc2b0aec636312b33cff3bccdd33c9589c546484a52602636458946b28d60bf346dcbb22ccbb22ccbb2cc66d961961d26cbb22ccbb22cdbb22dcbb26dd3b46f5d8d2ceb82d06c6033ce283f1feb99e7799ee75d33ceb85149e72595df7a9897b74364b782b021e9dcaeecd92581b075f9433eb18d7011b332f37c3ccff354d65a6baddd6e31acc5c030e380354d44fb4813496987ad3d87d61ea34bd73519ac1d07a86dd7344dd3344dd3b491a669da88d34635469c66336b6d66a386bc9d613e1e36e9a4129bd84c494cea20b167d793a69a74a8b4eb584a93a0543403000000025316000030100c864442a1440ac354740f1400116f8e4a6858349647d324c84218468c618410000000000000000466ac060050c945002ef2b4dbd0cd57278556bd877d212ab2ced019d3f0c979469a2c9e100492e1a2b8bab158122f36d3231d534d0d9ecabf491ffafab4c3be4dab3f20e7f8e9652f19ee87067ae7664a8acf7780141890481526769befd8187e677d4cee8e4a847fb8d99ee226010566c061283b1acdaaf26c6cff183aadd804d8c2fb6de6884901cb5314500f3060555055675abeb630836a8804f574f994a3021b652b078a0f0381c39e26260fb5a527f9b85daabd603ddba00b8f391120cd542b0dab4b8e062fb98342581b460a5f4d2a7fc64478eb02b23098b3dd4f1ac4e0a1325823e2b151838f78a8d4504a3c626b305d15b70b3c647193e649ff2598e3acadd3e63a237c5bd509f7c1cbe729b853511d19d9c12c3c1b3bfccf26d9fdbceb3cfd2f282dea29c879d55210a0967fd97286e40026d8d97f7402aafee1285da2e2df079b6bfdfa1162e52b603465bc8241bd5276ad48e0b366309547302bff3d1dd30b7526fe3b0cf961a96409101507ec251169c0f50ce70771c90d19374e32a5d311ff34769d39af53147e8023fb02703603d075c245ef3cd532038785458ddf27a16f9eaac7f3f53493ce382b33f40ef2c859e792139435425807d4d04506246076f9c8305d6b9d906c0440f1ea3e9c44905b44871227dbc6460d9a9d7238957e1581c25dd69b48267ea733aad9caf397111e7bd9214c7a72209efaa3fc96a34cadb4b56733a601aed33a493b1bc8d1d348f4af7af9029c146b9c1221e66e2822748a997d95baebb7d61633ca918612c82710f737de3e641a6559b1f07965cce1ba00f4d9348d04d2fcc7ddf051ce83fee2555f3fdcdacfede2d64e3859b36e69a2a19d528089219954ed5f51f7ebeca54aee690d9a23484054a5490a807d07c73645cbd82a9c6126ffe80a614f7d76905f8f32360e7bea4e31c2c2a1a689f6b7341a0001e1f423b2358552ad464618b7b7b04eb8c8604489413c4b7b593fc3204aee60f88b88d9c0e5ca9c7d882210fbdfc688919f88840cf4b0e9a0ccb269b2ab373aea790a522deaf601bb99c0e5346e72d382708daeb6ea9f67c0776b0951e9d9b031c91a07a47162dde11fc1526656a46e31e380911be86269a61b0adf654c44a0c3f1810ae7fb1b93fe829bd56dcbd3bf46d91d3ce7853505309a8bf040111429bcb89c9718f851172687bf72a8c8efd77ee65966d47d8a93930533154c6072484100ea6a080b68a0bc4c50bb0828e83d5fd0515ff4c10eb6713f2089f8af6c67ee2e98f3ea6e39f6a1603eff3c55fe923b9859cdc89f3515be379566d58b778f151c9b02c4ac87598956ef20244d55712b9611ac5003545519ec99b0b4ce211f742d3b531fb97476cdc272ce1a592f4017f07d90ea4834df0d28d8ca4ff38fa688d9c053a112e31df5a45bf721d19da7305cbfd518ebadbd5d746e43166486e9f02a03d46db966e73219e0c198be1e0d13082529ebfd9e5c444a2bc7681d8a24cc1a38d82999c3cdd1c80a548ae77c5dc16847f804692be1816cf4ba9272e1eddd560934e6c903686201d88cf1bbedc55965c1b58879786bd6cdedf1c51534cc5b36e363434154ad4e16a0a8cef2adf4b0bb93c2f9de7a36e079111eb6b2eda4a160f5c56969218328fa2c86e0b377b392a03b02a07351bb12db022d0b640134282201ee4481d133a66137c4e0e0c2b1a53f203e506c7080f99f78154fc5e00540f5987c6cd282253f9790698c08109dbc64820feef17b3080355da3e380ac79c00ec09b53a645303af0e6aa4d38e9cdc4e78cfc1d0c15a0639067ba240c73cc7b0e61d1d920f6956a9eefb6715f6231ea5edb9b712a11215ce725c2a727963c375ac7dc381fe297b8185712530c5b3b86053d2f7fee26ac89662ac7955068b55cee479be234e6269c726dd402011615a99d78cae783ea17391264e054ef743f7def448a1a341b8aa3879b719f5b90bc91154b00333b7a8a6ef7ce8702203ffbcd35e63de10bdd30fec07f00374a92d8b220c4d99b2c62778eafa817db25e429dcc717ca4fcfdff4ad35f2554e918f03e6888228bf6c2173c9e10057113a985e8748959baa9a2387fec120582e7731a2e14bdc5cc561fcf0ca21275a7b00b21092c7971d328a2f5151c033a49b06c6a66e235c48817e44568c4b20191ac8c6969b277826c791a1073c239873d05f10b0446dc8bd82cd18d5b93c14b55180774f5cab78aff520c2c8e2020bb52247756ba9ffbea9a245edf35e0d8fa513ed22909191aae3f659ca236595e96b4bbe3c7faa3987fdfa22ddba713c45a3b6b4329e5bfc5a8f30b7db392b60c697588cb7c88a280c39c68699154babb7a71bf33f291502d26ab8cc1dd45ad3a4c7034c25b68c6c63f2639ca7bf020a7c756876d393cb84b16ba31b56f66884be36c151fe5988de1589843bec0f76ac7967b691004eb74cb78a0033797b72050a620a433c7b005f82059680f29806dc82ef2d11627ce2092dd5f88a3271e93f62ddf75174db036f788ff2bfbfc7bb7ed07bd1944492a9a3293e4138523f1df9d978a9a9c1f10f142fa37b57ef30962c4b7309fa96a6737ad88d1866919ba671746fd858d1c9e03f5f694ac3ec1f645ab06d4150cb7d64f4368a2e700a6228451550952a9e75097a6db5c0ad1ae2bd961674423c6ac71e072660f9461d44160c023dfa112a99e06f1380209c9541386d3742c8748142a4e83b8630ed1087b0e9204434d1398930da618a30e9648b68d16118e16671ded608e20638825810d52ed50b12f38ac4c0365055ef3ddaf4656accd6336a1325a16fdec0c54f1011789c94dd8693eb59c5a511b77dcff33d22783642fdab1078e93cdcb34424019780feeef7d77e2d2f7335855644cdba82a612e8af58a5c932b140a6aa7b9616f028018d576e65b8055a42fb0efc01500cc2d2c653d9c6fa1ef6e1f1014a891e1863d6fed3e2489a4aa7ad6dc7b2a9a74b74ae03aa97d1568f7335370cb8dc714bd697e3a32ee360cb5fcda054bfa682c110f89c0a6776aa616fe33e882b9267cd27370d446b443a5d3d102d4c185d4e557a03fd50891bc9477411bccf4ba2deb76a9d46deeeae780d47d476db25a7e1cc85a9442404c284ea03b6255254358fc785c9cbb01ef6b99795e28130cb06a877cfd4d3fd3647eee0bfbfbb1e7c637a6059e870aeaf030d0dca998c6566ecfb113dd113ebbe3dd2ff0c0caaa1f3d9b8c7dc9311cf93d9767150661c6f4d859dbf10dd7e5c207e2f00b1b458337f55ff64305dad5c4fa3bb5b45e6a28cd026dc7e0401290339c6467496f3abf45d53e0a384b1ab04f18c4ba65d6ed62e738878383404e4f53af709449220ee59b676cbcad81344178c5ad1cd88a46536f6f344bf52a8ebf1d5cd337ae85beed1edabcb1523c9f8d666dbe3186cf19dd5d4bfd9577c418bab34d21ead94c8abe5d41817fb15c369ef932c0481538ab882885e0c220123833fc1a7d9f48b69d5ad26f05608ae902e902bbbb1e6a28829419d63e46df176198b8b2bc29bcbd9db838f8fc2907a5be2cfc67b6ae32d5331dbe255956523a5d652df993444f383696d92c62b91ed686d817d24fd7cff605bb12d818fb3357add6d3fe42f59be4884dca07199ee0382736daed2cd994bc65fb8bad410f4f1278cdfc791010c5d6b0cebfea01ff687712be401465ed1dba1160236cc9cee6455546335b080a49a59ea5a52ad064bc07577a875d521e2d4238e0b331f0509ab6be71b1e3c3983a41bb12cd8216049a3b915f0d48a5caa5ba6d96206e6be56be722cd5a1cc1bf4d042ba58b93929c0e439d1406713d2e8ec24529ef0273c12b81012743c9c47d363c391f0edd8e2cd01a1b71c98c5abb2ea25878ceccb9f8e3cbe05688839da081a3be9511cb627420fc89133d08beb38ff9aeb684480e1e98c141439e2c1afaf814f9a4e5ef1fc35567c08b89e4ff38173fe962b4c43b8b04c99c7661fe4c5488b98a842475e260cdceca8a1aa9b4666b5db8fec58342f694b653c0e143d9a20bc487665654ee946d3596a435e7aede421a16ea210a29d68b6323af0713b76b22edf6e0dbd4e7961777a18837862465a0e827afee1b49a3d91d742e62570f4db741aeac9c20140d1eb68fe67848d4b6ed7a89bafb5936c49719430dc38d9188d04f9c8beb2eaff8a69f9ccc88bd3a8aee7d45be05533e9e98469dc371c97dae7d841dcf81b0d36074574536d64ec80d914ba825a3180f8170f4fe240fe5a25b52145d36f8d56abf64af0a2e7c265fbdde051bc69043a78d5c428433a656d564892ec56297b92fdf6419ed775f2ca7d7a1db71f4c982edc7e7bd183de58dd789fce106d88424155855dd284b21bca1375a743b77a9915a74688fa0c4753cda8a14f837a0ee8e8f95aad8c4eca7f27d57e8a58cbb6e7472db764ba3e29b4bf7001360cae51bc1af5f297d3dccf42e993b21e76d0a0a515ce7e56831d23dc944c25b0f96612db61c2854919529e25cac7c65c5ba8d9099ebe613ae912e92cdac266d22798bf09d89e3ede74b17c9f3ca76f7292d8020dbefc53149641ec4148f2502733e3e164fb50b4ac2c0ccdf09910cf2b69f8f252196001ba33ccc8a4091388c88da41f4a7da30a4a64e46feb65c963681e83010ca541bb4164b11f8e376bf82c31aceb48aff84995a2a2ba97af667398e616aa58c254ae997265fee00c41ca69828e57a8a7722db7d6e9c527205d4a9e4a380ee5fde078be9d2cf83302e6a5c7f81401470f88ec343c878bc560c1349e4826fedb95ffd5f39b7b94b9e2cbe7107c73de795086348bb20b357c61f4bca1f783ee4717b7893aa68d7f5f8c6a39de900b98989644f813af1f521271ac52d4f28fbc771862b8844b4f8232be28cbba3bd656a0142d482e2f9b60061e2ccd9704b8e44554c8f681484a5410041b2e99e9f8f62ecb824b1c09002938c5be07eb630b2fe2854be29315bc243369943e552d4c60349bc59b15512969482bcd6967ddbfdaad06a926e6becc9b1226343f0ff4803fd64be71317c36412b94856490f4c1a1cffb3509a821172cd04025570e7141015d02290e498b992236b8b0aea8f4a0c49fc50c4814b500b0180fb032b5247eec7663e2046b3782772dd311aa59d22e9efa75371c847cd255f91311a5a4f1a94df6e4edaa62ef8bcfac8178b6079c751a98419c67dda38efe94e44a6460f578110ced8c0aa28da1cdc2bcba3caa51c513ce7128ecd8f0db0bed1b71efb6e4c9509e88bd712e394a6a2234b9e3a2d09ffd282ee4b80c5085cc1543c1ec35f83f6c4fb82db4ae2d419b82d177920ac3a4d2cf9a9789206630f589351b06d31bd034666cf4081c42cf937454fa3510cbf15e603d5dec78c5dfa351391d5f5e565b42b34c131553007c489961c0f514240b08855e2540cd3aaa84475733ae56d2a81dd45719c9661dd41d4ac5e8e250e23a2423e62d208b8ef0fa990876076bd1ac986401c604e0236636788804a60cce845612022f677382b8bb9ee9ad397e1633e15e7f2aa6984dfafa0a11b232c38e986a3e844e1d28af19216b6250ea2a7e8bf7216bbd30ae0de0ecb4fb76d761d85b35b92a4616ba1cb3a46b54c741408dad82d54c812f33e7205153242168b4278cf9780e155027d7267afb80a293db15186cecbedec06b7e8bb3b46314c11380fa55548b1571aa8c802462d270c55a17d45bdfdf70ede4a986b0e3b286393a02b906085805ccd3699dff8fe3e19e39d0799202529bfcd6aaa1599415c7d41b12036790d8f4db41759a0dced6916b04238220665277773428217e737ac90bf30a3de9e2fb9e145d721c6be484f22d69299195a0fef0c2436f924ffd5022d54d67f694e3b8d690e251040b8dea35e7c8bfb0752e218dc39c037687373187dfa037e3a3723ff64836afc6a64ac1e9447a50cf4be5fa77899494fd29d76d5d0ff4991687c14055be7de433beff35af77b4f6b345deaffb1ec3e2b71ea30c747e4c8a76cf79e48ee27ca40993a7e7a9c7b4618cb4f933e4502d52305cb741cb4983b55ea56d72a33b11a498bca3ada7e49a91281245c339407cff76eb6b31c80149fa4a0d6515b150f17dc7cc395aa2c53c598b9639459886456d522c8dd2104ddded6a79692aa1045397ee1b5c8c13b7e94cc26c92630cac79b4515eba514b18fb0ceab23ca25dc080b4d65be810086633207c4e1936507b8b120a2bdb2e05e7dae6acc4554d9a23343df972494576611af114c08c2e28a62bf70fad5b5ebb85e76409d9cc3b6ab940f8103fa524e342e0be2f863c0ede86055b8c3ce7244731fa7b3f259543f0b48362baf705c9ad20c74498da55ffbc7268ee8a2c552074bad62737cf244e6242d3fe6f5a5394dc932c430861d81c78ddc17f89cd8301cb343b670b132834f327d6a1843278ebd518a95b4dbc26b63140a8e44a528b52f2a5bc181d0143b3ba74dcdf88b702f1c4c6ea2f1cd2ae772e1ac649053b964d6b1ae75d6c4be05f35a25b137b81b0a36f52f8d344c0389be313b12439069ddbc659216dbd540447df5b47c16991c00e37432ca241975cd6474e7016facf182b8906b4c5575a5fac5654d4dcfccb1cfad6261496ececf85004e2ccb442876ed3851b2918d480ec1212df4da0c69b0d6be0e0e36f02dd3d59a3ea92b6c9399231a4e59f4003c94f58d0f834dc5911e000e196a6d070a9a8b6a0fa483c6237888b33abfeed7194ed6c72adbee45b0168d25ad34c41659e79586c94a919a356e8bf8e89aafb06d1f2a3976e7755fe985a0f3fada55cec614d3f89bbc0b56cc89bb4d234faf3b4bce22aaf2939118db0cda9f1fb569bc5a7e22cabb6fb86e4eae2322372eae1d612e7ed4a051261d20ac93458db259518bba5b7e3385c216472e96fc8d31b7e34d84c0062be3eb69d49ea8fd11443e1a4ef0b78064e2a3ed71d2384e9c7f2660935ae8b70eafd69275d81c2da7c676e75a4c3f3550200b860cc1b0ecf65be808d0aaa2833706443e78dc38d3ef39f9b6d569c318db5cedc7626058ab5f1e1a513c41857568020504c5c42b49e10e08c4807df04db86e8be7e79da6df68de55cbf68153ddd68d9e8790382b319e8eeee4499d98383fa049629ab44200fbb5732388b92994a7716bc68f44c0074c28884618039ba292c32231e713de0969ccc33b173408f8eec9f058484cfe067cc54bd7809c567870b2425b40ad01c14e4060d8107566d1be3eb4c581387e6257061a4038a3c5c8af54c39293cb02d212617089a71b5d90b212c61cf7e73227e1f7c4532e2c82aec214070eb7c6069e08275cf479104c582b6c956e32ca327a29a87af780e8a6176a3700a0a68479bc948b5bc0843a81ea54a28bf6e351cf5399dc928a78a02d2117390491bcdb3cc9fbdfd81268bd7fbd56f2e6d5ecc85184c3381798b304afa04f8d69f38a638391e0c236f59aa8e88f292b9fcde2413cbaebce32ca70091c61252c2cd7ce4eb56bab295dc609a2740532ba24fa166d907ade1eb6006cdd5368f004b519fe5607f0a8e7fbafab70cd7a3e8021580f8b96b4ee6dd9c70f2f54b57efcb3a2d86ee58934810fdd460abc8f34979ad6515bea9ab2243c534d5c8a9ddbfe36b421b28a0e520bcb1211ded602478d1ad02eef3d2c2ad97d8f5050b34f60a12a79136e40b4e6612cc19538d0cac91e1917197d9cb4c2baca2474fa28100c15b234e80692f84f2d6ee590d8421f871cf82126da4d9192c0c5285c2da85fed32732a7c010199c180eeaa0bcd8aefeab325558fc5a343cf4980922bbc68b157b870a595e3e9faffef2d486189e94491d7b32c2e6d363f190084aa84cb0bc861fa80ce3a284a20659e446357c744a6e268d074eee28b0a7f06e009baab61e85e5407bfb8a143d10e48b6ad21768b583a6f08838095c66c09d8c8cd812a2edaa549e8fbe833cf1c5bca6cb2887df5aced6959eb69d8e4a7449e2c427625cc5e7c888184a92e7cdd215bbe1002739205fe137c5218396f45c8451f189babdbf771f35ac8cd2f62b38f8b61183a7814b417f40bc6ab89026ccbb4131d93cc7140497e7dee4d0f5628fb71cccf3e8e0b80988719b8ef617032a66af195173c7fdcf98aaf1927860bee8d3039794b5b5431984e65df1ac67bd6b08cac73a1ecd04b704243941f0be8f346354197c0851f909348a084d7d7e1aea909b67ddb4f7161b4436e92ed94b94c5a3e25a996536451b219dbcc44938fdd7b7ab4ea44fbc96b7c2aa5182d5371f3d3f72ff4311741fd78690962f908e145d877c75b615765c0477bc7f77dbbc9aad83dd0890a2e235d1c8c046927ded1d0e963dbb845159076a4462b043dd84a62a1fc0086d99987a51b6c47553f375cb9a51f12f24504b4f8788d35c3db92a51aeedd8238130698c33e0eea000fd1f2b4f0306e7276ec97a4559ecb565591caa258b49db4415a88425673f8b082fea3e255dee8e6f59c57e318d9d565cbd5a65a6879d68214e4cc56b8f967ec4672d1449cb37582afa5efef77a18989c0f66e212127e5a2b568d36b417560bda09df5d970825dd8596bd19f69c55997371d75e2bf547bff0b0f619a81fe6e84054767bcb5bf06e86093f67260e7c4877767e80b558bd7244490a7e18e2ace38c76aacc9c78c8e5012faa68eafe7fabb2325633936997607fd2532ad7639326237fbdf9174c2a7ba91e0f500cd14381e8c3577bcda97c01daeda43c0b4ff336cf831c7465d110e1cd9ed9384240eb0e0c98c8c286e932878931259ee7e92b2ea47a4c2710f27d611bb0302ba181f13f0370d584bb8f1596299c73328927ee2c86f507e5832c40219dd0fc4ce26263202d56726c3dfc85345129a6287e4e503f968d46d3d10e92498c83dd6eda20752943b1869f20b0443b0ed316221b27812f37c5ae0d242e1fbd53705f2447dc0df559fba87401798e76852684f40f71ee4900e57d81ed6096ed44106d20bc428ff7ec509be0fca633d5ccd3104daa5571076ca12700a75ba00e1a0db0a05e80939b191a015d06db848aadd65b9cd7d5fc19374c490b24154e3805689efb36aa706ff398036ec9766f2874a8b37d27dcf494192d531bc6bde8bb59d52d942944dea9c3a0881d832fa9b0724ab36278da5c6ce54cc7aa6676f53353afe59c9113a9315af139a7d81a5d8132302e3794ef922b09feba73702c3c21e0417c56adbc53ab0cc5b07fdbeca1a83f3547e44434bc3fe9832c76334d0cbb042ba98a3dce1d4c528178643c4d9cf80f030d2872231d3f3a046c35fa1bfb0b4703c5c3680550abd7e93e49f0dd7bad0128375c110d9a746e3048e4166845963531b236adebb950abf05cc9d5c289c2697890a4d1ee81d00ce73617a627b53e85e6d56566315a9c3ba7e661f6c19a73352aa0a5eca9852062447089a5fe23d2e13e888e7fa4b60d9b5563965a51a9cc7edf45b743cd29ecba4e3e4734999b4ef89f34e8d21cd6fe4a26f682b533a055cba38714096c308a18fbb4c4f8a81dcd8a2e35f433c009091039001da6abce7701e99d81a2a635c1a290e612188fa03331dc52b2dfdc40b3754f2cc0782abcdb9893623851e24886e99bdc150a5e0656046c35e05ad3197f9e567c8bc2441824bf5fd5ccb012291a03632aa0f18e4b76e339d60ba6f46aee480c4c97ae0b509f286d18a67268c02d956720364c52171315b081ad20120a394e7134a83abd557c4a8f31c81f1581fef31b62617b4cce47535ace3f784e2edadd4951f55f207688e29c4414199875760de003f27da4cf03d2d0ca85b2fd22050e8e086c8061ac51005b18bdb4634cf7aedb0222a08fd42152ee9d722e2c62ff466dbc06d233170c962bb275c0418fdb23fa79bb0c0a51dff7f50f95a38c380ca4d181ea58eb20711331e079d4c76c5e72c521c3e7283fbf86db6ecc6dfdaf9d37cb15b2d43e8469334b46f9f9f6dd58456e0c3d19921779e830133d8072d53a63c0f90a90bd369322ca7d15a43871a585be1e3d6448d2346d2cd6d3f371ad16cc04ea71521773c9aa7ab03b270b7bd65f612882fb33ed0da6cd696b2416e52e0de6ee04dcfd2fd124a5b9c4197799fbc2b44e91c1e96b3cb783156316fad335db38e0f0cd0d93712297666d6fb4e6f37318d3da610f60bd84059002ee49372d95a13cf1415e1b5a503ce7efca82a6e481e54be36c53f621a614b4c9d01cfd506ec189daaea575cafc88481c3f531c65ffd539d98e66d29669034ab660cabdca0c6f679e843da0da8339a91d84683f181f371fc48dc2670327d0f9d2e89dec7f2e44635c7385539596a49c5cbb27195ace48d0ae82a719b75a5c7edf7706c4cc602f519e9d1a158666caab9b5d4f37092a8134b270127618a452034587ca3ba7281df4c36068c527673106b4195681e59c01e2b03981574b03c8655398a06736291926d2add1ae1a2ce675c7a782cd6cd578a9827a016a4fc30d6c03c0a60ef17a4573676242c11e957f5aaf16242b5f88bc28639bc6d2d3aca1b0cb507d82dbad86ca049b27b218617c4d40569be2063194caeae07de424acf236cfb2bec32a5d0f45386b61d0ad19801241662bb9f9f964681ec420ef9607a2060fe0cd46a2d30e56d5cb6f87e107dae01b7112490a2bfc0c71591b3cffb6425adb1a783ea319f6e497f4727440b42b9776b8a3672f45dba1556eac63bf120ce60df5e29d448591e4f8c243e83e5efa7b87b0a320706d62ae08cea3f0d481f9e24ad8228e1523b4a1a1e6e02c50a17879df3c76b0ffdebead0efa521029dad262fedee0c28d384119bc1e136804fc24bbc5afdbcd3633c6732ca0baf68c515c6de24c6c5b5b75169ceb2611c3d29234e8a9767d1e7dec2c27f214470372ce390998d276f847348da60f07a31d5df5459437d6a79cfa5035ff780cd41fd1a6f26de444c001b64fee29e9d70486b058774f27b19ee820c7e153255d3375893de3c234572201c080d9511a553a77981bf61e6317e8fa487834a00fb7b56aa2f1b989a49f3f1ce6b9f9bcdd0265be2fcdd918317662d2a5f123f22217e602e5c9cf2f699fcffc82159f519f7d5e21e50ce405c7f2d13c508741f52d90859a3ad1f3855814bcac826ee0781ba64372ec0accc995d6000d5acf38109f08054b244de8296ddc76831256767e19054321ce9fae319edeccce1e7e282ec2616bbf162ea7317b3fc91dbc4631f86cfdda50b46e7657f5bb72ae946eea868b30c7be9f662fc405cf24796c958cb9f91ca2515875937b4b8c07b749b879adc06ae7824e16416f422ba8982a2a053ecb343967698d521a1abcf02a002a22e45ea01b4c9bfc1c9e0a84568d8017615def0a084c048e82601920c254914a836817226b8b72ba4dd577bbf80ef56e7bd257d42c3851a407bbcc4e1d0beee03d0a80806caa7ff9c211a568ea6daa9adfe8ea19761c384d24078b1206b08044b35f0baeef2160ca56530264f780dcc9f93e68df056628a34dcd02f4f62e2667f09b696081cc36605391838896cac176536cdd640533f28c526eed4390a50f504360bd9611fc58dc01dc13c8080f3bf914fb12dc140fa1cf692c1e90c628af5dfc6312e016c23902a06d22658f5116b1d40f3ee1dda6a4edb1c56546143ca3a55b3c436a6b9e24be80629e04d730ec3294e39cac01043e6d8a8f8a15a72125cccbb8f3521e5b129b0d06ed81ec4f2745d88fe77d1b39c6527288325bf3406c460c8e36d034a4ef104e92fc420fc25c9c071ffaea6fd6b6ff22eaffdee5bbd1d5239e2312d460d4c25b4a1ce12b032136417e951ee6da885bcdad3a3cc843019fd6c6ff8bf5d73afc5959e6dac68769718c2a97b7d0b6ed8fae37f4464ce2a4d562ff4a1de910b7687da968af45e658a2be267a0e7aabd314e5ae74a4c64a1c36c7564814744646f68f4ec6758a161bfbcf072041c36e81a2898a5cf6a6c0ae3214a20a88f6be38b9edcb39cb7ae2ed53cac1c176028044f8240d47ead17d0cf132a9f85410293c71f4e8e75e99c948f506293f54ccb78509c66856846e685e31098ef24bf7b0a627938f394635e32727e1cb49960866991351f1b1f07733291be289e790973e11eb244b1cb80e3df41024feeb63abb0cd89b7532afca1c0512de4f6d91d4dc23c8c9ebf118f343fc45afcc462f8049f370a225af8a13fafc5a4ddca9fdca2bf751a71245cb24994ef83c533956f4486657b210eba2533c90043b2653a4d99afe8b34808bc325a42571679a56a38d9f605d10cfe72351cbf2d7c76302884194e662c59a63ec002a6e7560799c29455d69b5030fd9d172a26a90f22841d8ab716ce21d8a84db4354d137e59caa969ec068af2d3037d8e677bc65a5c51c610e8a3f1543298686cf669786f733809a341b94ea4f2d33e70680573111800248b4eac4f939d19c49a1e4e65c8e256d23fb222287c1a4c5f99dca865d2f650752704f2810332009d35970647d59ae020debd1665ae028df540abf9ae85d903e5ccbf202d9643b09a206bd56359c5e14eb35e565fe258e86279a0809de5427b4c1309bcc5ee0391e087a08d12b448f3789cf4d46080b6e2a6727f4e404ef0e11a3b124a483b2afaa5fee84a09c36b99bed8b495e31ca4cacb91ca6bf231fbf95134fc2222782f2e94ae344dd862bf18e7a380de823db7790fbe7d814d8208d1043af735c412733a12d1a5f373cd6feb1ad30662a8f76628c389a50ab80611cf868b23c33e35a4ee4f5f2567cae712dd3492a831b38cc651db2f2282238f3baaa71085ee3e5f1bc9e8707f44b226cd3cbe0ed9aa31c2047a68159bf7b0db3109c66dfe1bea86ff1345e8d68059f55664b7d65a71198721006470b10c3d1f284793414776467bf4ef8602f51e7048b2b91c5d96f6333f8625cc33cabba63d202a50c9097d0adc4d352bedfe6ae01b4c42394923fedc1af71d9e715b4bc9e6a220c1b0548eff0ac5209da2c81498a86e8cc658693701e8827bb1b351ad7c4d7949c0b2965bf85e270cc2e985ac5c11ffb413536a136c22427838e1982975c0642e7428751645675a64514a9726cb6f4236a78c14c7dacb49f30d999a1adae4898a19908497e0546f0b61815975198287482ee58e68fae240260dd82709e0c3d56e6704e56984f55d50f93b47eede8af250dcdc06efe12fb2abc56cbf6fa5facb8861c90998c6c3574b8fc656cdb1d4d9aa6d11fc092acea762bf37068fb5f5258f890131f111a28b42b74abff690474a8c30d8dc7afd5869d17b9f08dd0dbba487a99ddf5a1a60275719b835c6032917eaffdf3e10ce1dd2213abc490d560f73ee1c2fe61e7ce0d561b1c5f60005a72c484c8edc807213d4815befc6cc3efa1d4418bf6d0e90f3027a1113a1d499c0ae8c2cfa7f424eb4ca1125e48c2213ec151a490873ec9fb13fe16caa633243633ce8fd3ee62c4d11ba48fc4724d79651b09650ac3fd48e2bbfbdadf4dd0381fd375fb406c96f6986c06b65e1a62f9f66e67ca903dba265e90898448c8a4d3f77b63cf1b73a14744502e11812cdf7628820e66f79f1cf4fcac6df9ba7fc6fac68748c8c12aa3160e3585675837d86208e88d47fabdc21df80f0031696b0fbfa76de1061633b7d94e6a825c4681bbed0bd22cce2f404b2f53037dec6900059f4374d2f3be690c91aed9fe5681987f277c4de22f3ac46d9145df13c0faee65e79cb9503597c4bb9d346c7ff5b2286a6ed9b23eb12e7cd948a4a4c619ae86739d540a13c4bee0d608fc61dab0793f1b59e9e2ef2b5aae37bc092ca755bca6e7e8fe78599dce4f8ef011d7ea733c9fb0be8ac714b1acecd436544eeaf783431c74212c04275ce450251d71a793bbc852401e84b94029ab7cfb874cde3e9d6ccd5efee20eb5b2cd99bc39471c7b1a18a84e98f058a70722b7af6ca6708af116ce5e267658e5d09a396e6ca71a018a601b4682e603d8c93b425641f577fce9266c9faf1b33c30bbbfcbe7846ca2abc4401636235123b0a9cb380dc81a8a05b0f9fef238b297f1c74411b5a21aa2ace48c1781138a5de5435ebb611aee293a85ae9693296aac42ff962defdb4237c855cd5518d54c9624c0a38ab44cf310828a82f6ff5f27eafc493b64c15c8c733f210ea87f066f571442a7ffe1ab9937e1a0ea558fe91e3db047dfa10e2727f6cb79d54f6eb1c27f5e0197cf80b48d2457034dc025466b8829a86f31afd1b08518f9ed0bcc50a4b2a4577577b1e5850aa042151739d3843047f9fa459bd0b48f258452de69f5a14db4ed0f80234ef803fd35a669d445d1695c898ad2a9e11303e2398f5829ce966ddd9a0b45ce1f132f38f1299eb4bb9c3deb7a60ed07ee29ecc8c22d795ac389f0d9bb477e807b4b2c58d5b9f44c55da828d317c2f7bf75b898c584ff4617e98a40a20ea44862c4e6738c8ed8098d858d07f1d8b7726980002dcc7781bc7074573afd598d51204a673b91289f24748ee3de369aa099d43d3b004c62254ab60e3f779d80e876220d9b4a3aa4810c2f0e3b6ac4c48b882dcf02a94ee814b430f47477bbe2414f9add5e0116db4bcfdea397d9b8c994df1953e4bff15308469eefeb5df61e0efa9206da41d35bfe5dc02f83af08872ef4adf6c4d60f49ed556c5377a629dcd04390df554d1d7ee6f85e93705fd1684c0dd8251af5e33e9f9e76945452214071dd52eb63cf266aed9ede57b2fc8fc106fd7bd37063cd5e109558f179f380c7b1f84f86ceca8b2fdeff17fc155e4a2242f2aff6113a76e364d92cac7f395b5bef28e06aec3f50c4afc29e5717a44c3c11e177dd94a0bef8f8481595354f151900ab8a7225f5c495802695e20a68eee06d877129f2a3fcb6947a59d194f4cf49a74ea39ba9f3f871a270e67a67aa39ea084016c4276cecfd3fd1ff463fd107dabbe0f88f606ba6142b48b5d831c392accc2950862d984508523c8491d06c05f0312b1ba8dca6c123c8d4426de4a6dbe329d295ad5a68fad4ea436d34427cd36ad2660d90be70d887bc0ab2d06fd6324cb8f4a64e6052f324150b0524471a31b624089691991e36b256137c4114fe861e5cc02328c4e2ea23870e5b853c01edef21e1688119a0661d8b000cd842c20e777d5c46416312f3b2fd57bc61a79d03f5218179703ce69e2c422676301b94d7662e73b5b72e95e27fc0c1555e3f959011c8e840c82d143bba66aafb462b6fe91a3721a78de2daefa68a5736d9cab73b34a11174d14470a57193b48b654da7d0a720801421dda01d9dc82f063f1f7363565705d88732408a16adb4dce493d9f95da3343cfd9ca8b466d0fcd60e37138622f590fb7142bdc7b713fd377dea045d83e62b73860378cc9c7132902268928e7db82093ff8ee9713a626a8b3d244f88df2436f45d6903acf783cda90ff700e03a8fdc663249e28047106dc540a9410a4b9f525f52caa9ef20c075428848bf2b1ce5fd3e6de92eada9db861a35f259c595d455b51a890bd11841ec5fa558156d2e09867909b667ff69ecbc9c1834c919e267dc88920340bdd1194fbeff55767d34cee04f639976e3ffc96271a645ee4c1fc690021c75c3f47e59d28a8dcf78ad3fe188a128a10a9ee07a1431b31c32141c40f61d4890c46843762fc4ccf9aa5320b0f00a7c65237fb19dbc515078aea0e47358483e0f616b2f8716f4b91353dd04ef0a45f9d163f3cfc883c21353c5be2c599d6bc3bd01c90e04b47386482ca6844559ee5ff7d1368426da28889640325b2ef62a3e02db28966f4541bca264a4127c04a1368e80d05ca9d90ad61f7155dcd54cae416ca88fba68031c0d42f880288034645612af2e65a851d80bb07a9ba13804675e3123a7826421ddda4b908994ddd69968b0d810015ef73038e30f612beafa4b05224a08fc68bb5ee1b46884197ec463c3f75b713f50afb9fe1e5b05481ffb04bc61c403d0639f806f7031407aec07c01b2e06901efe016bbfbdaefc25f7e757ec2efd3faf627fe9fdf115bf4bff0fab985fa2fef0ee7b216a3fd2b778292b02ee9e12daa154f0ba513b49213fe7a86d0585be20b59080eece3f5aab1f0b52cdee4a2305c10d3f2f8114050dc6ef77fec1dbc8d73e4beab74734fa82fe3b90cc7c403e741ead1d88864427e03f67a7f78ab2769fc2744554df95b6aae03d159d316e6915516ba9d44d83f62bc87b8e54c9834b6d1f2b9db496f6c3ab6e702d1dc0552acf093da15bb5e52959cb9de3790294dd0c738a2d2c8f6867ba80e5d43d36196c9c0f83b176c33ec388ec4ba2d36ea62b70be61a475ca19bb156e3cd04e90f852c8fbfcefffbad46cf0e940d1464b2162e97f8d93a55a5fbaa1067658294f4bc1ea88d13bfff07f556a4afc38e03423a562b17f77922f70159233d803fe08ac423c29c579382a88dafbfffe674daa84f86c60a9252542b49be01d43ce0fff2f494d8937e0fcce2718c748b11fc4af091df845bb248f83980edca5c88ef9a83108fb84bd24fe66e66af1b32552fae428d32d928bd97f4c460d0e516cba582c2d8aa540adbf0a3157f984990c9826b3046a570b8cf1495827cb01780f28b58b1254482f238dfeebbdb9cb47ec42e25de6d43fe91e8dadd216295e688fa897a52241096d60baa56b439dad702aa1adbfb8da1999b0159f6e248e1dadf3825a9fd0a4c488248c5fe31ca5cde945c2f20a99565aa501f928ab75b1722c3c6e56c4f0a0ee031c5968142dee5a0886ed0bd8cfe9b7a06195dbe2d9690c9dd9e764dd427ab9687b1022e66f606f5869882b032f0aeff4273b1180bd077a687ecffc6906bf00493016ce91b7b306e243bc79fa49b41d8614ff84393d34a9f0032451420cf6648c2be2a17d891a78595d7eea974ab08421390addc272a43e914f8e299cb54896c4a091d100b0a1566748db8972a5c874385a52a2cf2c0703e628c59f6d91130b441b4edbe03df9c0797d218316232594b27475f80631ed421b706386ea4b5aeacbd4ad1e0a6c982d8bd7518e33cc3a72e77e5056533ce8a50371c697c1c6014a353a7777768f03d832128017b539d346d9b6da7babf483ad69e87a5e78ae6da95ac75c7b2b701473e8d554c7feda17b8fe12a2bc1d482bcb873ceeea10a378b668b2c90d800c2684fb7265ce8c3558093f14cd9fb3bbdbe1ba24ce02a08010c05e9da2d7bb05eb17b667a1e71b12f9fa4c41fb1702c01f8f12985d88ca2282969bdc7743c48d8f861feab2f0672d00977c57fd3b6dbde1c0917540d3c3dbdfbd5d50e1bbf72e269e49377661e453fca1ff2ea54458ef69ddb7b7d912e9157e02bbab0b67e0208b486621f20dab9250c3892067937fea8ffdb01763cbb2666e39da0683b052159b0dec5b38c23aa74ef523fd6fcedad56e95eff0a3f07c0e14e60ccfa19941003423cbb5516059fca68cd0cab7f69e281b4baeb2504afeb2b6bbf1d6cf0c2a17245a06365847efdf9cbc3f14c675060db1a9aa79ade99b1d5aa0b360bc351b9220aee030059493dcdd897521290450e735a74332bbc2f2ed71cffa01f29c6e1027f04afd873c6f901557c7db48250da50538d7ca42edba7ab64292d6a4b00d5fc32a8a6e01d5099d32fb7eab1c3e535ced91780c8d401a9273da3ec746eb785bc9265f093ed8ce53aa53003542afc666836d732d9d76ab406ac81e03fdbe06c9a2c44ca99b0d4a938d0ac3b7e62799dafed8885f85dc4350f0db0c27b9b478c09885b2814ff8563962911fd21acdb48837efac463691b84fbd52969fcbdf67eac13eb1378905cebf0a9e648df5a2dbfa28580424bda078aaa5a8c9ce7260015aa0f6b65095c642982397b2546fbdf9b0d8109915da64a02cf534f9fa6dfc04fae5e98b182fbfd8062b7ae9717850b3e9fe637a0268fa44471a3d47b7b4a0972d3b83b4d305080ed6dfb923964b6c5691b4560e7aedba7cdcd01570502eab53357d7f8f8b60fa4d50853fc419f3e9a666d195154d3801b743945773d4fc6dba093188591730b6b86a071891e883669b93de2c6d5a0854ab31e5d5f935cd0a4824d624cf401c2d5f347da58e6bafb414094b8fcc5b65c8361388505ddcf39fec695487da29ee52323513cc4211804348e6ceda8de2042d2bcd6be68559bf324b342ce9881f855df33fa0ce49d194dcc94a91124399949c0bab0e553a616d90365b2349ab91a0285be54abad37ef24100511302844a2c150b9a1f879867129d22dbe2761a5651e0c611bd70153f80757331b62036324681988818053191630a6344c64e8c35500fbd7a17d513580fc67a1fdfb7ce58ffea457affc7e5fd2bf692eeffb878ff8b5fd2c97563712fbcbd58daeb878c8f9542056010fe715a9dc1e28c8187e851df68af1a5973953f05661d77912dc61370d817294837d6dcb85b5aa5f6b9635e83aad1fc87bea5c01cb4329003f6bbeea0737865a21a032a737f181eec784cc7a702d8d43050a15fda4cad6da50961c3e44506ae216f52f2839019bcea4074dc585c337ca8c1db2f3ceccccecc8f1fa1aef4c9d87f7023ba829799a0467cb5c9ec219a9e4d34a0a5733290a43337d07fb47a5fe9df3270a0d0c31169fd840429293ee725353b51bac92c1a138e98cb0c5569036f21e0f8fdaaa196df6c8994983a07820ad1e021d615bea13d03f7692db4fbf18bd5b2406a0f02d57caf722d40defc4eef8cd83549d54c9e18a82907120b8ed96899cd73319aea921a0f67f829d659df21aa266bab8a88008bd4221812bbe347960903e1c3836a6106a41b6f692031cdf026d951489d62c58bfcf4c8161af066ca393785a11fb3786604357a6b118c16c00cb553c2ebb0ea3a42834306cee5be3d2a89501ddd99b2d8fb0803c08012d8efa791d32e4754d5f10b35d0308a9c724f6251a609acb1d2732c402f08008ae5712d43e0552fa262886357c1a1cb1e74a1a2baee29eb8c63497a1ed775aadbd88f42794f194bba4893758cfae2414790e2aeff8a360d18432ba8d8b88856ecd35b000e62cfed1db1a950178bcefa0b1c1afbb01549a0f5317b66fe4a88743722b719ed852bf4d85bf4bc109f720e10fc4803dec737a0fdfd05dadb5fa0fd7d4880dadacf5e2791170ef20d685f9f80f7f00b607fbf01e11e631f99089c9dbcf7029a507e66e328e9e1d61263bdcf1ec8ca5ebd479f8861fd70983a70b59bbee56df93b436c329cdca998ae80015c78fbbfb3c77222d1f8f47a5d0e7b8df841a9fdd9271d6e872a5cc5eacc4673ab12b6a2a1a343c48a678304ddc72623e585b0de3141e7cd74c0ac390bf552d3d1143bdcdb5ef4b62db42fae34c3c3f1bbfedbba3d40bb7dc735c707281fb8f2bfa6c97c03f2357ac9af6870de026d254df22b34dc37415b4297fc154d8f1bd02ed0257f4d93f906e46bf4925fd1e0bc05da4a9ae45768b86f82b6842ef92b9a1e37a05da04bfe9a26f30d085fa84cfafba84be62b2a0f3319210af7ee7eec70d8846d08a318cd47a25fd5e8dcb59af5070b08a2a6e37e36a15eb93485ca6fca82cf3d3aa373ac8d536129c7e8c3df062d15fcd74edeb73293de5b57d8a5f6c72ade2eb13f56717689fd6915b34bec4fab989df90344e5e545976b8218336d781fca5e87905c13cad1b4c8c2f89919f2a72c6b189ddca241027dcad4f4870e02b1f8863892d0c13fec42841d369b204ee01b17ca9aac68e3b669e6fb525ee4c76c79bc8ff5898cf495b0b9e8b4a1ac4c09feb17338e5584c94049c6b95aea7ec4c87ac1694f0516537245a3632ee316d88a6ea16523ba44f4087723731c3d2e329f726612e2e27d1448d303a8486542b191ccec7137b03f892c7cfd5b145a023b0a3a9cf18c87e7bca263cc5a7ad8a80c84d03cd671767ac1803c7980eafcf4cd8585ee24906cd6e84d64fa5615e8aa87893e980b2330d12fc9a4c01755f96934d1108b9c182e23d2907e25b430e31b7341aa13b3a34369209f25e347191d7443328c15e00667f74e6c6ce18f0cf2df3684236da85a447789b2d579a08d1113f42be06a2bfba1cb73660d681213d160635b16653bac25d878eb0d700b0888e337f455a94e82cd375cb268684f057d3df01f3803017ddcc75d00dac19b7d43f942887f3235e0b21f455c62e63b1e7a55c60b43774df4957f25d015374549e2548081d4fd9b50603672b08b4eb224bce720e2493aeab7a21fef6c2222f78b5f7efde672cb7158ed7c96a3615595dec7279f167e5395e36d9e6f73f56dc3305df28165ddcc5367d4a08fda71f9db077be4256b56107deb3cef674b4ce6693c9c9fceab7c98f1f3b2fbce978239bbd75d287fc3cbded797c1101ce6ea71f19c865d7802876a7bdaa88d8f652119dd5baa9a2002e30f6a8981fb90158b8b2f4fb02b5f48fbb1f20ff84a3b95e9061f4c706078b62ff7c612a788f2685baf0717c799e7827d25063479862c72d069fe0509ed8833f8832ee79f8856cd16c850e9671a65c62c4cd31ac63a4f8aef77c2e75bddeb97adbd6863f33ee49f45ab4c63ba6d284aa9dde4546ce90a026dfe331243a382def27812b632c33c9cf1c1bcdebdf13a713004ced5d75a66ce25510f1cee0009f1ef5433b6a5bdf6a2258f897276db1b739192185ffeecde4a3742e0fa0ea8099690996ac31ed15b3ef6f11f1bc2cebc5908e08b05ed9472cb47e25555a91ecca046abf30a705ec5d7f091adc956c612820a338b826da1e001c9145df079aaa6f6dfddd21770b52d1b26f8da72f170e10269c3d66d9fddd054fb57174b37cdde234594acc1c8592f09f4492e43928632337265083bdf79799690d5d9fe7c2a74fd9d3f318c818aeb5a9e4994346d24394a3253381458e8079ebf347356501130c5a28915e4d1d7ef543279c9be0be9e48df59475d26b09dce01ab656bec5e7f408181616f5407e366bf3abed893b1548ed080c7d8fff10657f144674a855961a772c2a57d49e9afb582d3e8e53ef5f221549f2b35a074acda3c6d48690a2600611f15102c2577ba0210d7510f9984129bb94a4ee13677bd9ee54f308139b371118c4859e0b3be7a7c398e55e96c96fbbe2af42117f68c99e3ba94715e07f7c0a9cd278a61f8352a4e644c8ce0ebdac615553912331de6d36af941e6323c88479a09db56c9ed27d9a365fc71118b11502ad3a2c5a825acd4d791af8371c930635633434bf8a4ddf2abec0d8610a36cc0ebbd990d4f31a537aa5af05fd7f138822559acd942c842f7db6938efc87e201f033668dd13018e6886c9e92b2413af2d82dfb335c8ae4993c57cf0465d4746134d04d5d94e7ab694c12de03dc37f81cb0c4a030881ca1af17a962247e1d62aed1c63a56cb6aa7daf353d822411742d2964dd7fb4847a35312e60e4611240e9e38b0ae7679a8341531683df767537c8ef6ef68c32a79111fa83589daebb30df42e19c0a53114b3471db27016aab76326681475cec6016ea96e522ce3f149326b74b0f0104e502ca08ee665b40d6554d079930d6741a0c486f6c9f63f75cd30faed5dfa40bb69c023e260baee07a6b9880e8e0de1f226cf9c642e3c35081774749772ee0d7c71dd016844ba3e21939fc9dc5f113d55e07b7b666d3c8a41bd97b6fb9b79429a51438067806590637aea8fc8c15a1f2878b45c5321e98fcf8f479f543107e508289124af86ffedb672e93039abde997a4a3868dea39f424c25c7ed973a41a3ccb3cf3f72cdc2199238c7df0aa9bac7cb84fa8ee3c7686ebe693ee0d5570d134d1e5a2edf7b5db77030ab55f48e92efff6ddd0e0f6f26bd7d7400d7a8e0fe4f8c092cfbd19b8cdfc48dad01e69ea5436147db8243bd329d91952e949a4e7bcb0f4851c75baad51674d911577bcaf26ff62637893db77b41d51d4837ed447ae8a3d3d1915b4a7532d57ad7cdc724add59879dd81375a2ce919322a326aafc2c3a34eac49dc83ab2b2a4552bdfbfb890077193250d02895ce468635807cca4c3f6dea98d443bc33d7fec6267ba25d1b085db7bcfe6f1c05f333779999306d9bd02e91afad1174e0556c597c3f010101104957f391a51d9a68985e17fe21545188b2a33e148b167877acfabf2f34b219d0abda772142a226f78db7a3a8504f326ee6a909d49655fe2a4fda853d9ff0bca859ec2ae2e69b9d1bfa05cd89b34904bfe6c08fb80af77bdd8c81a658f6d9b6318f6d2b7edb96e9f0efedbb771111b75914e6dcd5c7ae6ec370d32db3418fd6d6a18abefb6beedb699c43e1e1bb3df12c3acfd3fb2ca83d7ff9719e1931adde3506634d8bd3f17756a7b7e36e223be51e3b9cd647a1cbd79d9779e0d3334b8e1006a96657cf3b35b31c778d67ef906cae90b9f05f5dbf6295f0c2f000bb33dcadb9e6501757b189e92bad108778aba3da9571dd36f70930f63b3018627bff4bd6ccc16c4caf7e003cdca4b6f6ecf5b6fdb17fac05af9651b56be95df3cec5bf1dc1f876f10589a950f9906207fe6019175c59b7585d0aafed1fb9538d28753cf38c1165c6cb105175b6cb105174b58021296a8ca8ddca56d1f1b23b948dc2eede3e8fd3c2e7729e4405dd5a6527e1f8755a95851e5873562765d01248e64fafd6e67509c39efa6c715c56b92e735c6e8eea677d3bbc9e4421e9465414366a0f8281f3293ba916a307d6c750ae581766665307dd4818bdf4ae824ec0dea425aa5d243495edbcc8d25520d5c4a8a0a4aeb686736e274aaf4ed6d25f1306be9771063163bc3037523ec0da73b53a2a6e71e8543c970404b1d173235ecd7174f287516f0a196fe9b1536ab592bfe7297ff3a8af398091793289e682209879a1ed76635cbab974a26520da577194aa592d7ce631f262f878879a9c59162609f82a564de6a390a4a8b7e212ba1caefd287adc9bf66f5e04c6f3918d17dbde52d8f383dcf42e9705e0df7fe91a5d8982896860d4c6f7a2e762a1e0ff1549437c5ca5244b13496b410ca054995eff25c76031af26647dc91e988368b25091a7aebc52e57abd5da18f932bacee39ae2b98f7bf4220d23dfc80e8f9b6069c82f799eb331de424328a85c58314495fec3175d22e59095f4f56bb9155ba59df1ead2158548a2ceb21892a60f9b8b6afa52483598de5f516865307df14dd3e5f22fe41c16114a08e771ed7268707a5c51a68c7cc6e121a47cc93925cf2b97f5ec52d881ca7d2db4312f25b47cbf6251b41abaeb6b8c1aba2bccde3f5e18d3a77ca6277d47dc7714361255964c261e6235fd0ea66afa7e9fe4c51a4935a07cd124a5e97393bbc9d43cadd5d4a12c54cfb74c2cd6f624afabc96b16cfc6c856dba0d56a75500b610a94922a7f073974f097077deeea140704e5ddc47513a6af79b8c52d6e71ab59dcd74054c6556e848561d124cc2ea81755ba15a2102b5c1eb431f2252907e9596040a50ed247e2ca4ef8c8f4b9abc17518eedd036222915c8b2a513e0f6a50724f105a4ddfac22553e8b75040aaa7c3741952e57e5d030f2bb69e472b2af23b9d2cebb224b3d1a94df75e5243bb37d39b42f08cbf8459f52c7c0e2f625fe56f71cdff1b02f661d71aa6c81057769911103c50263e5a49282424d2552c76dda7c6e6eac05cf859f5e6bde91ffcdd39ef33617afe5dd7379163ceff8c66f6eda1bc755fff23b87d4c5e9b3f3e7dca3bb772c782ee848f6a2728b59f076a80047aa81858fbfb1f01163e123f6bce342c7233a3565781bbbc4eda5ec31c982c73b2e1ef3708fc748d88705c68ac7400dca3f79dcc463578341424344dc796cc447eca46dbc16d230f2a7b3ce10f59f8dd3476d94437f83dd9dd7ed99cd99615a966933c37808ebb0241355a7533a9d5ade61d6ceac0cf38bb371e4fcee9f3db339334ccb326d6698dbb4340c255b20610b246c117baf9b4368285f3a501d0d84c88c65856df343f9e84764fabe6efb3a9d7923a4869247eac81d998412214b0bd6616404a0734f2586b704049646c6d4825850b3692d27278765357966cf44327d603a18757e9395e3aa9944cb899f9683ddc823cc460e79f2a50d69af1b5749a22e729556e4309a4da7b42bb42036a5052d288de62ca21e5792004a3004e80840aa918fedd0192f74d3eb564676bc8ed560f3d8a0ea170d692e205709add40c3502a9b9503d901b564d1e6f0c3769ee85cebd96cad1e8dc935137ef88ca4bef880c19df046a06d018557a47543e7eb3009d7b2c95cb32ac26a548839d01a010b302c51e87ffc058292bcd9582a34e695b57a373ef545f42a62e86142b24928e59b54f8b31050d5372725c858272346de80d2a0547be34970ba9a1e6120263090d53723056c5be70ca1e15a95249598191806e124143390445c23e96957ccdb5335d0c232396154b8c2296957c49a156a960da2a48478845d463e4d312d2802611cb4a126939aeea763a1e6dd521d172ba241aab5ba2e5744d349f2e486b75421a5026a3d399590ba926fb345736a7ec368d3b4057da3a89a02e24ec4bc9e96a90692e2da8552a3add4eab5856cdb2e2a148505d926e49abf6735fd835a9cd02d405b1b83a214d68e5aa1351c3f49f8c744e4ea8909e21b5595647b0b4568a00d51523b53f6471d54e3192d20229074bc5bed3508c213001d358aa8a9752a461fa5d20d5685f4a4e0fa8f6d8632f2bf751a9655b023af74a557a475a3eb6bc6cd22a18dfdfe2b1ace6cb9b2b1f231b32f2255f289eda3bb57f55c38fe1c922154f1e799dcbeb5e0e235ff235d4016d4cfff4ba9cae48b7f23a2355d8d46e774cd66ddce889503628d7d1563ced75f2b421520e54edbe4e47e53b1aa4e4744375eb8c3a269ca0f6f7775cec0d2d8769f4b3186995caf7b3ac543c0d00a41af969aeee0af3fb3ba2aea853b2537167785ad5ed344c7f50909010119191937e174839566a5c7d5be6abcacfc9a75eb7e5b44ae5cfe94052cd7c90a42356ed0540d2b152b9afd31901953943b59f03493174a6c9dff86584a89cdaaf496f7a19cbaab9ca2c373af7340574ee4d6e019d7b59adddee8c0b35955264bc4003066f46912980010e5003012eabba00e880e6034a5b40098efbf0a56e78d2342c6af2b34e88a7e9fee3b86ec68c7a24d12053b5dfedbb4e7a2cbb26c92053e367dacba891dfc6b20588cf7930b600f131efc434226bbf7d5d83fbd1e8b3621106cc1d5b3c3d4eb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccb32ec67d6cf39a118866118d771dc478f7bcc0b5f2a462b36491f768dbb375e9846062a86a13c9755816e832942305269737b29e539e55b0ce4c87e3ef8c2371c00a2a8e92b7d5dc317520e07dd5194fac62e851da83b788ddf8e1cd0f8e1b61adc0e8703e18afd78699181d6ec69cdbefd62838e1581a98464df12d8af12eabc3e6a28ff07aa4aace321e0682a04c7719b227f914c0ed5f5e6102ab118638c7348763abde6eca68e8bcbd01cc2ed10dadd1b61a211f573080db11dca5fe8a2c385a270f3bbc0104208539802d68486eb9273528a42fdcff678b334fac39800842c547ef5c4b02cfbedf8366c78c4de194547d00eb640e4641bcbcbcb524a29a594d279654bacd41203e6b1a8fc1d60d4205c8fdc4c1aedc369c3f638ba46a77880ff2814c5c1e36f39efe683e02734dab711113be591bca0d355429600c2fbfdedc664bfdecc6cfc9381567f2fec804d0de2853f5eaa7bd863fb88c716c3324a33897dd6e0c68dcf34fb73a598a2faf02c7971fbb21f7f69f877b8aa65bf9607c8c73e02fef1e3407c7fece3c01237c477ec39e02fbf965d9a28d0f02b93eafe48e1277aee717713c1a11a942e279b17ac7685b0ce0494865581bb8346953f43837207015665e300557e47040db7b5c355281411344455f9d8d71243f74defbc49aae91a945cf78e19862aa9cac740a784b48a85d50d9dda1f23aeba4243429865c48b1a6ed1ea6735855cc6421b5562445655d6ae3a828648346044985483f6d873ddcf39b0df1e8763ff35d31efbe6927468df919ba7e1be16ec976646c3c86fc19e2bf6810dca9543560aba3f37c8a9d807c16a3f33ce148212ba659687a4edc36122f3c70b139fa170425005126bdc2635bebca1c19823e6b031b107173494a9c00f1de253606fb8300dff6476c67b5da2b750e34b1c8c88162f40e2a946c59ee9c660157cba580e1b83f5c08286b462df3a605f015761ff83027b0307a681cdc7501846310cc39e9b1ee378e1c0010b6a178831c4686393557fb934fc675733393fc8ac7263fcb150033566cf4357ed8b1bb30127e5883546d94e38be60983f86f5b27364676f991d33b8bb7b16831ad217308e94cc8dd3a0fbca48b764ff35be6bf916f94bc3f5ca55ddf6b5c4cf590da2eafe183d31bd8dfec5154ee8ec668cba3f5f0051a3f378ce6ad07ffb81b2a620a446ed0af4695063bc01659cc67112999939c618a30ee3304e17abfb7025e0dc334c468f913a814dd153f7678950ed77a1eecf922475bbbb518beaba066b4c2f88f95a8cf3b7f6e003cd9cdffce8f9174e0ed8d4fee9612f5f24b69772355831de61561320ac544cb33f37e061244574761ac43e09f69890ac688a16ab533054ecb9e52aa6c19e5d9d5a9590e9b3c4a8aa60d8304fa7f607084215a3c1de3b7a4fa7425f39924ef113aaaf5ce53798e3c419602f21a34ef563f1b196f87593daae6faf811ac4686caed8cf14ad0a43f58e1dd44150ec33ece325d40a1af6cb7558a71fa712a02e144d60edb46a694e95073ab19342a8fc1a0dc69ab830f15d6a9c4103ca2829d74f9817bbb8717b59c7617abbb918dda5afaf73ffd21d28b1315237c9158ad4702527c9158670e2c889a155f518c1d875ca874e0474c3d93518a46b40b119b7533ec45fd2d66ab01fc9c6cdb5c5df6952c4438e1b6b10c95babf6c72fd3d1866843b42143e690690433b38eadfedcb14586afc6af5f7624d504e9ed9a9777b99f4f757ba8f15bfad0ebbb8b3297b1e0410e0f6e769a40518b70a67d7107abf4a21c405d120d5b95df6e4c24751d0c9322d73048d774356cf54152f7a70a271555f7a70aa1caa418b2274fc28e9f3bb987f9101d55337d880d720dd993274f9e48964ef6c4798c526258d631efee3233efeeb2a671dbe6eeee5d477277f752a9c499ba6904dd654adddd1d05254545e574621ec0ce224837a03e9b4f830cbe9c60aae3d0f54150921afeab53c2413040311b3301e08d0de4211fb6918009862dbf06bdc120a04e42d5399446750738d842096ca36e8b638cdfb28c6871a32a563aa8a288e3806e757faa3062abb801014b9541c3807256c8a1a626acfc986841e4d4580821082651b40c9834e10465a9fbc3a405486042821e2640b810b4abfb0324851350aeee0f1013420084458c4041a8511569368a62940f01f4442b0124834e0288045d033aebfe0011e9163d7de143a02422f701256511040a238a3602153cbd032a8ec4f054978a20b2ba3f5490808a225a0d320cc33e1a838ec04a50a495e00b207c2e812243d5fd5912832548286989400bff0abab9099beee6eef61370fbd212811e78092c1aece50bc1344b48207bf94cb35fcb0b45343dbc5044b3ad80bed7fdf1e2c7695d13133dae9e56dd9f9e9e98ba3f3d20a8146565c89808ba3f3d40d4f8eb30dc32fd025536c331fe0468fce623d112c3be25a494d2a3cbe718a38cedddcd930323ccdc1d021aa3a4f244390c9b736a9a46aa89cf6ddbc671cc35dd735dc7dff177a6e748a41ad273a512f65b439f3375d144bb8d349f43e92611ba1e374562d9d4b694dddde5985432519418258d2bc7751e574e6ee56467f2b8d26e12a1fc1c0a69078e07af2735c83ed725c9e083195999237e080a13429d482319bf2f873ac5ad7648c7553dd4e3aa18bfef3eae52f97dcf7115ea97e5bb0a0bf617b1a93e1ae2429cd8ec3751abdcc6f7dbd541fd6aa11e729d8defaa953f3d90c3b4e977fbf516c60aa9eb52ba53373bf752aaf48eb490a814da91af940f278a4c6bb371184dd3865c5c8cdd3af736468769eeb1e631d675ee754a91941c4d4697795cddf3ad498a0b35060b865c451d861f5574d40d9d3c1929b1ced4b9176b96916a66a6699aabdb3d59515e07e4721819dfc269f0889cae48178591f695e7ecdcd09597c308354ccb5736b96d9abef67671df644dbaaafc534ba19d7b5c2d7927a25391d191139c99e29392e3303dac9591949da982d24deff43a099d884e4527a386e93fc2735258293a2939614a4e57f734a482dab83a5795ce3dd264b50c08fea350527ee1e491c16cb01bf9924345a8d7c6745dd775425a2cd8df48826a83328e8a5e42444374a0eacca66469416d8ddb8282fc0bdbc82855dabe44aae9bec4cd215cc3cdc73c2e05635901636def7244e5b97659e1ba3be3e29ea9ba564674e4153c8f72ae85165ae828ad5ecd86611206741ffb3af7502ad739b1e15d07d6507369da1cd25c9a6bbea64e833b2c9e1ef99a5a4c24f2258f64917cb5265f2c46fa6bb47f928e203f8ee65048c0a24059829c8c18dd22c3a507a0121367d5fd16777769911103c50263e5e452fa8e08e175c67c409b3ffb8176f7d749e6cf2ceecf6fe3675f0ce2753fc61823dd985d26fc3829399df6c6c6f88e318d1bfda1ec2ae51799c67e7cd73666b7e38cfc4dc9ad458cb13fc8fca1f1f7475799638cb1ab43e0ba9bc147f5ecee6e1b0d6ec7eeaed1df5e70bba9de95372422a47797aaa0fccbfbdddd6d450bccdc464d5499f9bb894d037d9db75d0fb5ebe40d15b5c77fb8c97a9c642ca34c87285b096539dddd5a90707a9ce8e4947ca2777777777777c7e6ee80346541609b29b87dd9ce5b9f27ed09d44683fd32cf63675cfc7967e47344980a4b546e870d33c48086322d1836a61f2b426536186a3800869dd1b135fb7eceebc10307ad0ab4e3e1aa24346caf6b100712d01db2d7d11b0efdaafdb7b50ddbb88e808a5a433e2f1b9f9b568ecbe75be0e603e3f0674ffbcddbc1852012abd887a220a021dd3e4079e030b4403f3eaf568f4ed197cf5105c2c10b6ac832861d7b41436c59c2babe9056a07463b335e9063f97450852770a5d5a46a8fed1a360fde003d57f80457da188a69b084faa851623ea08092dc6183da6c5aafd1d63f4e2c7638c31468f9d7a690d8944a8d7fd690227072f58829452ca8e316ed749e02496852ea97046c5917d3d1ca67f9e424aeb17ce9a1edd6b638c182986af3a48198b9430186576b22502174c56455afc3044118d1b55ff5fa12494a0a8fdabe40ab5bf9bd41fd5a9f722a4e862ca957500b57f955851fbb549bb1590c48d0b6a1084050f129a8ec29107babb87a0dd898a1abe24b1a9fe717a9255f5244ea8aec409b0c609238a28c1149290850a180a545822b351c3ee0b2a7e50475e9024c300010a202880a8ddeeee6e3483ea5d757777f7169e10aadd4eaa1b5d517dabeeeefe037555a4e1aac485daa627420c515f602302215cd0430222ac1620518ddcfc3cd1447581cb6128cac7073935a4af1d1189c0c1086480831434c007383f3d48d2440f6aacfbd3039f1afe1594a06cc38e067b8fc0feda0fee4cfc7e9855ed6857026a6751fbbb520a68fc91818de9dfe12a0d304c7f179105086a3f03c1c9f855c0478393091aceca8b82e24e34d0ce90ba2ba580cabaef3894ba38f2562fa9fe19b36c4c5576dbd424ddea250f581aecebc18355daefbfb04afbd849c3788abf21fecbaaf9792905d4eb51e5b131febb43c83929b56123b264cb39bbd9c6c6a6f2fc07842b8f8d61cdc962230d3a6b63fc995818ff28504fd026fc3522ca3abc6a70b268c82c1b95d5ad11b5ff6482fadb585f5f20315069c38cce475e2769d0417fffe8ceefde409c92d945b61365b22ccac85a50fef07fa4f0b1c18e4c1032bbcc1c82b983b3003b0df7a4505e0d462201f5b1332cb5bf023be3b5bb3bdc27d49640b6e53112ee69d5f5e130fdcd1d5a8a738498019477447bca81eb79fbbdecf73e8aee17ce0ffcfefd08e61dd1fed42aed5b7bf94d16d0e58f25e0f6654b5dd0fefd9091547e46d263a7327ff4a6b7df23077e1f9d32557ec6e11cd68f1c185566de1a6f2749dd1aa296664b82f6472712ece343e0b865d6fe7607f3a70b9a5bb045cb3fe7949e8f0667f021bf1ed2f321df47b78f0673e891838fde1e3e6cd8d160dfa03101ce49515bd403ee39a45dca971f60e597da1fc19a190c36d8ccccccfcd2a04b6587e9de8cc821bae97cdb0ae8760eab0a3205336806cd293119df012da339e14d7ceaa3f8f3af4f8df3b2645f42a486d493e05afcf7b4a86fba80cef93e3078e9acb3dd7f99193d63468907dd6446679d4d1910b461430a2fc2c9235ffe72ce89cd29e363534e89c9084efefe25424cdf82395a652ca10bd437b1f9631bccc3300cc3f886bb6d84dc604ed3cf37ed836d3ad5feaace2ddf20f18d9d61d999583d8aea7e45757ea2eb82c6e71e540e9dca9c48b8949b5403447ef61c8661518822222caee49e9e4e21e9d4fee4c0497553f5e721366a158300879320d9a94e440df955dd470748d490895ad57fbd396fee1296a4ce2ffc9a838f1f0dbaf628d73c94c3f86f49d0f8d18904a52f2b3426801cb0e365078e1d3e3b58b2dc1d381ce083c3013b70ec001fc70c3244384286f9893f3bf3fa6783dc97527ecc92254b7e1eccfb36744afab7ab988617eca136748a39b4e13c5fb1883935920566a79a144394fedad2e882548969dac603a669df9cdf8239668d75871e6a5c71fbc201a1f1c349833f7922039ad8a8d42d1646410a118d000000009314000028100a078462d168240d1459f40314800d809c4472549b4bc324c9519032c818030c000000000000204034180e008e7550c1213828a81ce8d819bbddb2257e300bde7bfac3c0964cf2ca1a8f42b0bdbd68e5835e62df8ca06b8701ee45c21d1cfe7f1abbc9c1145a18563e79210411346bc7414f3f40592eca68bf5af840f21435c7ed337ce952b4bb2667084a29359287a4f3fbe567d631e234af15dc2b79a240f9b64c9d225e0c3cc532f23edf8600c308ab788ecaae496471831f67b92bc5dcdfaed32120800f93f2076a9671f59b6bd96ac1207635bfaecb0e623f08cf3959a2f22548b82f3362df8fd7df631490ab2da57dbde1f621b5ec7a468ca648e36a635848333b06278f6341b24c80a672cd649ad63da5c934d1707ada02c41e221223447af3fb4ee15efde710e9f779f0cb222f7d9e4c858b615eb6776596aa0bc4773eaa655fd3dfc0af72cf3e9487b1014926c2e12278a96230a03f05229a6129006d37e3685524fdbbc5af702a58b5341cdf6a262523985a80f2785ea9597b816ecce51b08173eb13ff3c0183ecf5d3cd5c681d1d55130633bcac44464b4ba7238d2e2c754efb6534cf3db5915573c07623285854f8a05ed893e8c73e20347332a4a6f6de09f276685715a9aecf0edc642edfc1bd90e841790fd49f478733284d04d05790285011ef1e88c04cf68888fdd07795d403f3c2153069ac84ba39792968ad721429af5bfec9610caebd4009d6255f09bc909387ce04f95a254197acfe183a8c2c2071464bb65a34b9c197b846145c698e1e301c9885c69844f1ebaec647c21eee2ce6610f7d21278e7cd0258018e1ef62550e7cc020a1a333ab4bf9c196314208b361635cac7670ad1ebde6d9172e98c7c73ce54b09a5bf414278b6665e5d53c8739c71a1750d1129b1853e7c49d652d4117d06624ffb60d1e10e98824fb4ae13314771a3d3ad6f5486c978ff39ce9829fe12aa8a5171a25c9af3c95bfadde035b932923c2f01257a27abe1c17c417c664b373a65d4c0c07a233c72e93f64d9c391f0ca4ef9186700805c4eacc764a96b43358a9c9635aab614cfe57d6309a9e3a33b0bfd00ed1cd0e228f7bbb828665cea1e807164e3c872d7f0569c1ee870386f77dd31eb97529c1b97294bb0ea4620e17fc7776276b58914ad65a44a31fb9e105eaefee0db2aa243096de309b6fc63267df7f3d3907a562bec040a7853d0731384564c89e88b1943a77d121568dce8a6e2ed46887840d0997f01b5b8056664084dfac2ffe0a97585e92931a1cde7c2e26e931bc147c17748fb06e059e4c0fa29153aac39b8afc36da2171b04ec71f70d999effcebf2a8717661b5a3fd1cf54ae1f2043ca4ff22d39c2ed85ed604759c946d880896b092276ab84b7d0c787e701c7940535a810bb562c13c553c7511b5be76214ded605aea0b8a472279569f419b7ce4b127320eea4e0b214248d1bdc823c5a69f2259fbd0609d8a31f374e1d1a622b633fdfe924f5fe76840b47ac0323f298e5caecc864aa0e188bee449588652699a560895eb5435f0473307b73be57044c3d3dbe49b06229c0b330bfe958ddc670e4ade679ba444e34a0521e953c3e5148644ce26dea1345d2f6656659ce340da165e9d70eb25f7e1d88088f32703ea25489cf5467b8c37668827109514d178cbe58d4b84b79c88672ecb3dd861cf8318691cd570349d643b29c3aa7cacd610b257c85ff8cf5de0fa5a031d85107aa9aa768c61cc0f19ccb2a9667da856e65f20d07275411d3496a5bb0700a29fdb53023014c5b1b7a826b0b748d6640cc6eb2df8c14e27e01e979d85d210bc235040ba3bde75ed081f0689c01df587e346827d66f0d80c9184a85d90203671e4a0ef2047a523285820be748301442f0dbd73d7378040a09b350322c24bcbb8d84d1724d5fad0dcf8f61a4592bd0235a422128a914aa54e512b7a2c641535e4459c0dcc166f2df0809a3d0f5bc3d60b5d2f3a782b713a2e569f2cc2ad673ec34cc61ad0d95c2dfabf23ef46785ab9a9986af267c90abc21b75b6543731ce6bcbaa74aae850a6bfa2f03256acd507215d7e58178c6718a1009300c5f008a3af1dd7faa0362edef2bb77e2c09c8ece14bcfbd7ca2a96286f65d54a1eaac33fa675054a994844746dfc497d2e71ce34b92c531828170c0c4f2999069991de8f36c0920ff516c7d538769e0f67cbacb62863d340f27ab228270c526753c97303a774e3c95b7ed8ff2d765679fc1fde9122377325a273001cb32725eaa32ddb138bc455aa1040dcc260bc3ce26f73868bc6fd90f24eb77c06b761d1451288a978c43fbd42cb6fa33f64cb54e2fcef43f11c39d6bebcf02905f03d0075666331ef4dd196eea38dc6a4fbf14ac8d5f3d4dae7eb14e6f170c4aa5a574733bea90ba300846fb8f77652a0f78282080d1da544284b27b0fd7cbaddfd00f9ba8fe12877213a02dd70051b068a1f1e554082b8cfdb3c45533aa3c191a2bad7b54c1ae2c0a77af7cb1a359bdb25792684d18d68fa21e141993859ef3d851dec88a7c88f477abe3fbcc8e0857c01734dd27e83b0c5a0f325c0112e18061f2ac53cd2ae14b50e433e8cc6df0c01aa6ae37326866cc2aaade568b2efc62709807786464af494e531a61293702fc78ecf495bdd0a3bb6802b77009f8b850134040a3ace5b4541b5458011b84d6c8e5a029d98848c3ddd058bb8c256bdc46fc8c8c1eaaa68c5c2bd333ea28d2c4633067d33e41fc0f2272d230fd3a27acf3da5dc8bd1e824eb2b296407b94c63ce1253eb82e45271db8e8419c61068f1fd4cac657330cfa294988e5a5781d44f635aa165f89b114a1bde67fb8c1842428086164a29d980219880deabed9ac57f3265180886ac3b5a6b44fafc6c75ecc9313b2b1d506196232aa78d59b683d141012f1fa9113b3380a2d2c1d56bc75722a2e2599dfab1511d5dcf429fbc8b49dbd6f9306cc1581a509866946afec263b8c22e0e087422726e84d3708e3c86ebfd8aac802d7179bd6caa7d86086e6abc4649a882a3e78a3d94964a6cc8562830911136ad1d5c89bf75784932d824976f83c222cd8a9d2e82259dc3fc9c6a22447be0505bc96cd41b735c27899e55a93697109b3eadb23a7a5e8ab5ce1419aa101a7bf884197a918fdb74b069fd7631d55abfcba2df4d64c8f8dd8369d76c49743ac06c9496dd1f47b962e95a4b6366c82623d96eb81053cb24afdd06f0bfc091b33b8d6436d44630162602e60578eb7b9c00e48c1c6180f5cbd6c870dad1efe85a8192551ba653c2d39885e3eba06a46d4d3085d34a9aa7809e685c7a7203381689ae895c93ebacffe1af3ce3586e391861b7ff6a5955c2d65fd37c15ae3cec9fd3ca19be764562e3c5e40a676bf1909ac567e71812be714fc2533943145e7d84b411d4e6af598e490a92312aed362e32253690b34167386103c304bf45a3a3e80e26d02d9c776c3e231dc35db685d79cdf0315d4843ae9a18fe88a4669b61c882c484b28b65f23a45d73af79c9518476e3886ddf492e7943b7ded0e7c134a5296e630134b1e0492f3bf837eac02298bde0f400378185e33cfc9a2887ba63dd6018d92c7eab7c5ffac4f4a08778a3dfa5613c12ed7954fec3aaa8d29ea49ac835c8b1dad456711dcf96ff2a4823db9449eaf5d47a2a44a030a2845bf4332b14bb78824bb4551e1b8ffbea249f503954235ffca5b209f3898ff226099ce585187704680d986e9841f23fcfbc5d788314ac5628ee714154a3536647fcd3120c87e3df4d709bb8755aa33bac549de404d582f4844be36a15bb34f532a861c91c24efd220a654b4821600f314fc3834bbe1d94f873f78297daeb4818653a38df5c334df2e49ed8ffa8ea180dc4e5b39c1ad49e5d3e4bfaef386a703b581a7c0265bf28b3c0536f6517ebe5483c8aceade15c0407c2e626f519c9ce160a4d7e7bea9f8b73d347dc2a1d4ee7290044c261ff73381255a9c8ab86c76bfa1a5335697e09046a024600c0c5be72d08fd324b1df323f34a0b3213286093c6c3af4ff1e16b3e65e033e8ef780c3510cb1df98c3f184dc0e9189eddb6ba19a4f52db58e827afe788de6e8a4ced51c427698fe33e43ca08d00ab90d9549ab5c0a4a1dcd9b2faf214c2cbb30b0170f1de8d535d4f14401eff118a47fb083117f7089ccd7c1ae555259e2725dbad1aef30722c4c12ff61e56f956a4ba970fcfcada26e19ef0f01d66458b41bd757589dd0674e4537a14b603c42dc635330a09a9497a5181272145142b5075f7842137c2abad0c20b674d9e75ad8c9fee3264ea131ab893e8110faa1053eaa53a0ea381444490a682bb19808f0c92d7b7e5dd1ba2d1b83a466482a0062f8d82a177b0d9c1d9e8c54b15c14284c54200586aef61b07a42521872fe42d366df264125323464579610c9fef5af34d22c45e3132fa2f9a7b000a2e61ef884d47d94f035e3c458be62c70b17042dc762b24a72bd0382abb1a5a615df1a1510087185ecc07c8e24714029df9358870b73fca1379f1fe4e171c47bde3a7302bcabe5afbb0480f36dc53483b24d70b76d262d79a49fc5d6bb100ac16f7ef77453334ce0a84f319382e80f9c4b0b321e539ec12e92e2792de6ae3fc4471e8ba0c07914dda789f34f011ed4e8d6fd4dea5e6f05070f798101a7237d09f0d4002698f507a942714491c20227883a943e08e1c0a5bf897c478ba38f5ee9b38cc8f2d20102e2bb49b10e1e481afc3fe94e1c1883a27af45c6cadae6338fd74633c89bef49c768f281b07585b762b49462c45c4342c163939b3665542255b26bde78faac7825d5ac0db5015126966b9dc0b67a2d74eed66191e647a201ae69d83f16ba4b503527a5a901614528a4db50260829aba72d40e3c41d36c49078494b0171603670580d881e3d6d2ca1059df8f8020ba9ef80b6764ec6a1f74f0126b21ece5b537a4472bf5d022b8a758e9d59c244666b1f049f1e24b906b15234997c1a36690548aa432528f2b50200295047c8f223afc4697228e73dff7bd2842c41788ce498b3cf3e2e6726ccb6cb4d96a4d8436deccf02757071c5a162dbb707b26e7a10e02b0628a37cb776e40439e233238b640a5e43d3483285b1376398fc990e7f83994b3d7d663c8661b22534e0b40f3bf8906d1f473c792bb1009ebf17bfe59a08007de648b650e2690b4abce39ad0b6ff86e637a30428a68e91d8447eec0f53f6411b251f2763b05040f87f9c30cd630e83976cfdceb9d90af9de680881e26403c142f0efd941f9bced930eedae7688c8399de6be8a8384f36f63473e6354b61ca38ffa8747d6ca2a9525f4a4341afeff79d6e1188ac8b79f91d075aed7c5b4ec8e21d042353672c5e120b309ade504fbb83029b3e58877a924346ef312d22dc661f62d157e25561ade5357e0e3f334d50ba0817a14711447f83d11f1810f87ca0e0c5b6233f98c8b3e4e3cbc47128a65c54bb1bde1432b4ce76c95f9b2444c637a521291735a135061f86ca48e7c466a17bdd0f7ff63b6bb7fd74aa0b2ecc5950dc0db0cbb0d34612d251b052e68708e466ba31736de461d1da9b8364bc69a0caba6d6491cbfc835d898ff6fe6ba558810a7d134b47b13f1d36072772eddf3e94e230b502707a9e65ab70cff17a553247a5010d8ce0f33b9208f167e9adbe42d1fdc7e09835098e837c6655343e3b3f2c99294cf8048bf587c52d14d4861f9641d88cec39c10b21a42a6de8af12826d5f71a8df0e3ca12b658cbc0fb579b1052461b153f14148a339759fa403ebd2428120ba7280cc8bd960c3ac7767bb8987182c619d688c51a8d995e2343cd26fd10a30fd282bc98cf788a296fa98e702669c9d130f239bb46111681ad5481853a8243f289d15e6582ccca09eadf96ac62cf4e13d55310a008fdb2d1674f3584e73219488bbd89bf1722e3c3342ae374c2461c3d2037ba56fe80ec68ca78362448ec625dc1123fcea9982450435b3a1103f77eb858c86965ed76ad69f8a5c5f1d6bdb0263fb3f4a5f9174aa3272aad2f8d82958c0351102d12045d0601b2b8c68df1cff5ad3ea5295200554b65b82c4454f4ba706d16a102502a91e45786f236d2f04b5280b828eb5ea454dee3350c7629932fcd609e2d3eb13441b4e9708d9ccfc5e4f4021e5bba6f9951f6d66a20de992e7eb8230124bcddec3acd3b53cd8ddbb67d3262aa09a488fc154f511baa126bfdb01dcadc1f80c665208b2949b145daf8857c64ac075f08c8c12db71ed7646d0ccff92564ad7363df5e8c9f1f8ea9b444d1ae77ce38a9811d4f182c57b2885f40e05cccac93a01824bb01e303d80c631a4b37509d9f03fe1b9c24205d4b8a777750475b23b45187ef10b050e6405f175933d0c0aa9e2c8d1acb2a48c65cc901f900507e06e2249804b593b415b3f419901d79dfef3c6d2422f30b7634b0e36602719203a76ddfed0ec728156ba349cb2dd5d3621736a27e0efb599550c188e72395601cd899391c6be909e3700da902b942d8381627e560ba8abdd466d8c0f9e3ab5d6ee29db10fef38ce091d999958e203be91b441ebd4d0688b358743e18b78251700ae39ba034c26fabd13764c08a4bdb2ff449e483f1ebdd38c9bd0fd7bb21736831e218f65e28818c4f126b1f1451f133cf22a2efb121f38416eaa6d8f50071064d142bc300042031aa2818d979a68c092d62f32c42892383068ce685de5f43730a9cbe33513684b6a2cdc52ed702769f4eb4402509f98e2ef847a896e38a167d29f2b6b85c189c101d87121da5fe5a325ca9873bd0ad6801cbec09db8d8ecc6d1a8f1761de52df6eefd98d8af58a2715fb4ecf8d45d0cef5199c937d3d154acad1ac100ff41f459f3a8615566f840288597a9f2e96004e79d776c7a2485141d92bbce0471c2ce8fc77be40b46f594d3eb446d5ee2ae23cebf7655a603b129374e00d2cb87aaf756df33c02d3817867010d9bc92191f25a8deb612737a195951c115a596b2cc2b8052f5cb3b7706e9eb0c6ebc5f8636c513d88107409ac388f3a24628f5e396b4691e18140766012145c98a22221d53d238d7da30da84699a544e98db704517c66eea54eebac5943563f20756390ece448a20dcd61c420e9ae42116e1463c856f86610ee547ce99c72a227aa9168f3268cded6653efc86618fb4135dd0299d7afb8a890e00644655860f3724134269150f55d3a967f332196254414f856bb5c06635a25bcce443d920aeca1d1775ca68e57ed63ca48a09602d6941b1a4f4b7dc5a89fd4f46889d33bcd8353dc8e9464078268d47750acb3a826f092919d70ed97c8968038486c9e2c734264c0da9ffe1b83015ae67fcdefe38f9150a21d577cb23c4c3d40bf692b3ed65009350965b6aa8dad51fff51bfba4533f7569837b737614b263501a02897a4968cbb441da9e6bd3df7563671dc238ce493e089b48417cfc2a16e4314ad2d8a237ede199dfd5698900f7b64103cd0e8d3400a34fd3c4fd9c48ad053316f131a2fbba339ae39f3174c51c0c098a5851579b698513ca6db497f86966b4eab53870122ec8cec2c9d351121aa3fcb3c5147d589c4c94e5cc7f3a381c346120acbf9dcaa2992d03938bd0d9d2694bf781ca122564c6b1e00cff8e6b510144d6f470912a7724f7f2d421b2d31720c0554641413c2465d1ac034425c93ab52e72d8850feef83c5d428310e72507390e3f6382e2d481389e232f90de72c219cf778c117d2c97996e1bc966b83247321449e13821023fcd44015a5f8716652a9612115d8592ba010a7ff62e6ca091dbcf1210e652f7907399d4bb1a9ee5d46361e2ce4dc6bc8a0d7cea6390d14c0ba6c32adeeb228109d3011fc605296f0a93c6b04c6ec7c6b8066c5016ad70e26e599d0c6745c295fc6c2cfe2869c29ea9c6a035474140b400061ef2bf88d98dca4733178f72e426001ba4bf761894f6b997d1979dabddfa89fe359c9c7d9a95293c747586868fdd6e3984860b0beec5ee4aa85b9be002f3a46dd1a7ce69ed25fecc09b735943a835fa22972eaa801b139131bab0fe6824296378ebcd6fbd99fa36adebc4d513b704fd263a08a3f00e2a4aa75355ceec6387b07f431e915e4eab4522e04d68537b94154053e03560e1cecea4305a6ced2c8782db9eacc98c7f07ef4a702906fb8457429c2b071ad8d598963c369cf655225ba2e7a17b87afd01c10e6e67cb6150d3a67764d1dd8fdf207b0f6dc8666bb610a376fc17a7884767480d63f28699d2406c01866d0604489fa6b2f188c783fcf98a6c9382b158dd2c6877daa9690bf85d00e71d50d65f31216c9d4c6640cf9250f96f6dc43647e90ab33eb4bad8005c7965822572724d5b6f94d680177f9e597ea9df3d0e893c645fa6f907b027c80c2574967fe29545c193da01c8a0a3bff8ab13d3ebd0cda9e9e5d58f8d29dada931fad47ef1fc47839824634afc1644a345f03c51010732df28109e5852e7f8282152f2709c6f7de5b5cb465490acb91c08fd1596259c743c56719e73511773ec1a63e0023aab8d60d7db98ed2d15940d9f98b171ce576e9ba9c52bdcf98ac405bb6cd1f8d108f3ebc53674818970c50a8df35d2d312fcc6bbca0ecb8cd4b3d8e485f78043c7add26dd25097270e7ea0d55c81fdbd2798621080d6068d851afea264c81c259504b04a66b7ec0ddb4801523cda96865acf5c51b97343f37f826afe5f5cc9130d30fca0eb867c040f7a0e48af804c449881720089fa00614f655a2978d04327d9a5e97880522c7a9fe1f44ec0ad50b1f3d600e54498c9d2b6573dfe403be1e2c230782a1fd7ecbf008aa57c6b3c36c1f8ed37448ffad11260fd102c12c014723ae6fa2881220cc4183d3ebcb8e2d6fa11d515b2832dd248c4c79de156c21ba18793a34bc795e19beaf506383455e9f6a43ba92dface4a73441eb0434e38a756ddfc60ec572f8d6e57165f68377193dd7c40e1457d751c0a43fc12431f4b001a1575395c76a095f4880f54149aa5d2bf33589245831ef1efc61a9afa04ec072a65150e7dc1675935ffc7e3d19cd0a88b92fd198e2c3f4f7166e63ba490275db3e0fc446f237b7d23e010ec8801eb003839158a2657543471ff9bd20252a31572c50a4370e6e5ec63d44898d6253e1fa10ff92f380889b01e7f73eaacfca9f44238f36b98cac286f8cc837241b87a69bfd477c804cc9424b349e432150ce3d5d0815e7cd0e82768672d3e2b52820bf6cc79bd96736f97195e0152bd2dbae8110ce9decf52566d87baa06dd23f639dbe7988383fdfde71c782df0d8699c044302b8274683d30d11a2e4462ea138fc49f326b4a0f1f340110ade96a347370fc4fb0ecd420cd0811dba5a1f29ffe89842c1c4f602668ca7164ac2e83a7eba80ced458f6bf2c571c9148df042c2ba9ef46f9840d7e48f34a5413f24b9f3aa3f02bc3f2d4ba39b0edf19bc50893755e7facd7fb1aa2c882c9afc89cf333a711030fb73682ba9ad4f2a08cb700c1f6315045d68b8d023fa200c0efd62f9d33fb0fc738f06b0c1d80960479e3e00f0a556a4183fc57cd4636f61f08b67d335dc5cd64fbfa28b2c985131b8c8d548378ea0bf6c0b47d0fb8fe9a69ebe4f4f0eb970d923f497209c68a6c639268a496d60a5c3a172466be82a46374b90ee2929abf8e779adbd73446ccfa5fd3f9c6f18fb1fb9f05295dcaf706779e1622712c273e35d0b1cdb7082eb63a3ab88211afd51e1286a463ab1125b33330f5407d64464bb9580acdce7e8ca58b59cf2917afc35a8be8829934a9188e6dc3cb4561f2e769a132409d7f921340268a24c19a5338a7554504153b022e71ddc946af4dfff63e4b0d72636488e6f91198d6f7f3ee00bd5525d2817eee231442489e89f2936972a69dbac6d89ba1d8ade84d44b167b130059178d59d53cde754c73a0c1d2785910c90ad1c4ffcb618ea33e4b778cb6ec3d7cba68babd1b45326323623e267f2c5a405f23b09cd09d156b79f6181a7ef3014b69cf1705f2fb12a5c9c6cd92a8010b84effdd52789deee373cba101960a507f0d36c9b8d0e7216d940d64438d919315fa3312fa2d5b963241207876986dccda3cefdc8c191eb07b8fed24f3bd7d7b0f5b7a7d373ae394bd20400611211aea3c4752265ec31a0603546ca65ae32cd5fdb600c0ecd5c056cd919563f0547439123797ca797816cfeed5a019f9297dbc08284cb41aa35ec3a299c0ca5c2156ba427067b7d9f147bbd14aeca49a90c078add2e69acd3ac46076e0e1d0165073c4f92a74f6f27755a15f53af33e72fea9815112031df1bcef4aa978c4b6edc5bc1536d5ceba58feb74147942b7138d96aca4f0525516f85afe6f155c39b824f0e00ae4055e409b430f2bcc6fc455dccf776182f2803ecca64390377629f76dd7ce2acfa815ba458afbfebb8822c84dd783ff7bd31aa50cce27e4c1d32817f73658e500455645c136bb054cb23c4d9f94a002808b6612d2f35afcf4e6091101f06b1b8ce6f6dc06089bf0abb97349697baec6b784598cf9a4a40dff3ae7dabab8ffc853c1a7b0d6da9efbceeb0c1fd85be611fe4dc315269c3d338f39710f67cf994a18d3e429386c7b8a3e1d911a2536ed049f9369342b2f798a4b255f811452ad3b558491e5f40d2cb6e9c4b026f8a946da49bd0bd5c06874c508034616a4007c31e1aef56398292887d716aaa1af550acd321653559fd86836288598af17486f560da16dc821f4d995ade621f566b0e0ebed8094d53608533b6068787d8b62c9777eddd6c976fe24a53ea48987220951558c7da4e5f9c8c9d0794c217cd5e8c991ecd5c72eea4b29a2773ad0a8ebf047a903ee35c20c4c1ae309ea65c91c4bb6fc8818a220332cc57bc6a6908bfa29b5c22f7e1599fe7894c09c5142efdde1010fceca628620338eb29b388ce44f8eefc6eccf04f6561aea6bf56033c5e39dc2e31bb129d31e4e69fa7e8ab45473a15b86efb71b806cee62d0cdd42a1279f027285312f9ef453dda1c06e8866939a89dc56566ebdc5fe3084723554e89afea903e4d6b79c016514d780d9b0f0b8d1d51edd406802f51176b3fbca1c2f0e9dd0dcc84e75a52f562913d0a8b63939a7a756b146a449bf17b78963bd0ee3fa3aed62470abd8fb211bfd4369d487b9059eb9aebbf20c61564142ab091395da951ac3784b57aa52ecc1197cf25f2e1c1b2e49ded0a46236b631b3e1edeeb09d70b94e46993a2cf79d0753105c45c5df1900278705c1a063f3fe6c0a016d9e7c5bcd09ba684711166e764c9a43c136ecc90f9af10d241afbf3f7408b0eb6f8e3b5b51c647a3171bb24108fdfb6238dea13bac759c8df2233f4c8a8222ef2afc5e49444dee67eaa0efd7eae862904475ea4558588ed0486752d98402992b128c0fdcdb535cfbece150f7bc570123e9f84f20380d69ad2b34de0d55d0a2c059700d2c0173112c9a03a7c91bcb0031a6841ef0231e88dc04bc6ffeafa7a0e8b9871613230cc420583aa37094b987ac4cf3eeb0490287e1f8f708165aa7e8c8d4cbf9c195980181bb50c42e39b21937131285fb6545ee161014b38a9f224d9053fae3de53d75a44fbb418d8d65ea08567b7acccaa63c179ce71f561b36febb4f3499b3106e97fa79c444ef3e92d064c31b63b479a963b228be266c066faaa65ea512228f53e0735568ccaea0773e565439dd8fcb49841d543ec7f90192e7d34ac24e4708b6ba56f0f5ab2c11abd88db8b176e6fbb2742dd8bad191fd8383753b0298abb53252877b6d2d2ead57ad352777de67a24a3b3edd23b908a567e3d43c2c56cccdaae32f558f884a01d5e7886af99fe64fc834c844cbd8ce74ef716997cc531235e08e8c3471953e90073e8954616feae6c92d44946e3000131fe74b0bec96b6c6d08678285f882074a6281abd7195dcdc16bcdfb96637908e8ee4b4d7e1c171bf83e9833820b7d1ba8b917a89dbe313115d04a6f0e9d0f1fff85804fad979d836856cfe731f5e085ddc4b5b57b93b15cbeac8a5380e2ae9df6470b1a98c11b1159d63c6dc7aa61598f6afb1a9cfd9086578ec1adeb2d1f2d43dc3862ba511bc7a5459cb2392b1fca9d471e983bd28e2cec9e1b8240f63491ff609c57f7c25c0cca3e5d9d065352759c03bde531e9e8530364a14078f526e724b98caa67fd32f89cad7f6644291076e148da0d59067fdf0d59f1a0a08d94704a61502fdaf16a9cad2627f02ea3bd5cd3cdd9a3ce8e94151f36319e96500a2325c88d5300241d908909623bd2346984a97cc905c2cfde79a6cbe4a3873193885e7ae618d82f31b50fa72135c8f1f61407fc3fea34c082589052ebe54908c63da09b4d1e2e674f038e3b2c53a563d5501a9090d71b5d323f1e61289ad4e0e30aff5b423e6909ef9e687fc110886c1e118389a1f0432f1bc8db82c7183f3e49c5873d1aa721bf9e1ddd61c306b8de40594c325089864f128b5f029db1055986b4bd9de4a7f4834a5d3630a497901817dbfac889b69e934b8d08ad39843c07cadb68a577890e53c605b90fdeef549501b0d16bc5e6d3c0b3d1edcdb4c78ae4a746e7e84a1ad1f892b7996767b4375ba17d8c29a680f846d626e5f322a70fa02c3fecd79f72233ca4f7184e5f890f54a49d056656b2fa9f20c1a706e01cc7c507667e379fdcc23edccd735dd41d7f88e51ffa51d3dd6983dcfef1e76847b67ac620d6eb727b03af048fa53e0146d4c93831c4ba83390907b07384d46ad53568356b565380484b98b925198e220cfd662a3c3a4ae826c3ed9bc66cb50a543cf96eae21d609d34dbaed10b71e6ac10ed43511840ba07cea6ae951cc11252fd038138134bc8172093f9c0da8966c30ae810d1b14c92222bdefc357e76084896b563639248d1f6fd2493f7131c5adce13f1e56040b37579df6da5e1a3243d9224b47c3a08126b94e4c79f015885b288f1fd81e41a519d7f2dd97c526d44614a3962ca0869a501c830a7c8e043e00ad50fa1d820721b3793b5f9d33818de2be08a6f8c9ed0ca3da3c4d6eaabdc873501cc49639e77545ba6eee7ee337315ee840ad9109fa883032988a822291a5f3cc48249b563898e11a89cc6c388571b50a337f19cf6ad2faa02eab6a5482f0ce772bbf1ffc2a57456c045cf5206b11ef416d08aefd7c3b70b1aee21c52e9c1218327cf18009f255acdd0eb077910e2bced328b9425174cdc9a81f169733f7ad8d4460302a28637ebaf2ca663c0ba734c7c428859609c784e9355b17959f30245c72e124c9d71062d67d118fec5f7fedda7dd2547ba83c0ba0bb88d80a6494432cb5021f7d07019984e4141dcb7ed7ce400cfede431cb9931419d93a1f0d606efde99d929db314728685642e761477ae863eacb915e894f2a3f6d7607644b17200975817af4b23fd1b20d9923df7430371c9979f87a82feac8794eb131222c166f4737998a867166ec765d0fe77eb4703ed1b6202722590f02dfd4412e7ca3301be029d42054385bc7a7eb84ac049f4e125165ba537f0b5f9c4064958bba579b0a75068251bc52625dca42fa6044bf32ebcf68344b22b1e6a8af933ddcc593cdcb4b94b774d3fdac6521dc565af2b94ede2744cab848bb3f02278f9c77ff0a609ea98e970302d42a482441e12c7cbe33ba1f2c2a4e2a4e016d80a2c3e1940f109e0b6dd1bfed61927d655a1aff83ee4285563db7c104f7c8191c4721d5cc8490c6fb77b6eb26775dba189ff8730a60909500447278a35efeb97f6185a4da739baf166e134de5a6140d478b034c38016520311edac89d10fdd13f77e6f7f3b72e513d21dbdbea242dd015e3b08fdfece6ede32346a00b5ae3811237073c838d8b21a080c502b65233cb547e8c99f58376e05bf1f42c997d9fd904725f0dac325a69fae5ca4ac70b215ed64d4bc706dc29b0ae8e498280e4a2b4d09c7cc88afeae8685244864c6523f4d98e94ae241ebe81e427071e519a0513de945790231162a8f0bfd2acbb0bb9a83669a493676439e82cea6af08e1d153db8ad6c94a2ff639cb71d85ceaa12b1a079ce6040d5e21778bc5925f6e36d391319da0b33396185832a29a2c6dcd94b08c32bd141c801007f33310c296c969c4ec8c46b153e74a06c93ea1dd201652188e7407b5a8040c7b371808e3210ac10f05f86bca2f4dd8b065099e4291c950437a0d8dde5920e4765a6144e4dde602a95d82a8dd017dd54994312845ed5e689e9f6bd190a1f76dc7cc468254ff64976c0ba6d01f4b9f113f57fb5cd48c713d6be7c5f945b00ccd6adae184066e040926f2cb0e504bf0985702b4177629d2e45493e040939470dcaec27b2cf15203bc79f3902ed405675d5c6a7524900c10293f9fba92f24dbaa8e99e83c2ef23ccaeefb2bbdb5f231a5cfa8f640597da255322ca53ae57fd00fe85b188e5a508e00916f50ec7afe930b6c5eae6e18fa2cfb98db3e02ea0f5432e051bb4eab3a91ce3f87fc98aca4ae023822ecbad8bccc9b2eec2701490dfad96f1b6fb1d361ff1a7ed6022e6830123605affcaac8cee828379bfee511e36cee0cdb003ac553c4d10b3bbe23bc2f95fd89f3f85bf9d80572ed53569da93f6e76d81bf2ae4952b21bf1b65ae88aa621383734f30e23365e577446a5d20055832949230f8b3302a088888e94a92bc2e1bac4de2b1938fbc4fe78c6f5f0228c08e367532a698f2e6237393b096058275bbaa5605940a2346ed824fada9a68daed565dbbc59d1509869bdbe2bf6a3e1b4b8529892aeb042cb99c7b3f4589cad0aa36fac5617ad43943cd68b55b8d77421c92ad06588c0d4492d64569d019d85eb8b7cf6f74a38bb93f882dceb5fe63871df50cb1cad480a8c8860d87c0bb2ca32e689b118151f544df225be5353aa1de14d24c96536194076924e7218934183900a80627fbe9d9fe7f499718bfc4bbcc2bba843431f2c0de6c2eb13bff6e8e0cb7f6bdec7c38fcf4ca0667691c29435928d3e0b6b5c1332d79680abbdf832698a67a1b23fd74a1216842db6bc44429c928ec71ee2dc7929ea4246622574c43ae8b4ee0168a819b3e62ac7e15f974c97a7ad09be45d7465f43289e032e0304b64076dc3e4414b472da59768af9a83dee48635d19f00ccd44766b7a3f1807b7782bf9f3b60d43ae61c55ad7e82d01e93c7b96b32587ceb71141fa7c0752fcc424b391b8e7f678771be300691026bebc513c47b26ff9218d994780f401d21dc038d1efafdff810a4e627c2e976bd403baa342706083340d13046edccfcb85b41dcaab01c706e95e7c835abb75305dd387451c1ce258a3a1be1b59ad287b5c9e444f1f365a85260e98693fec4bfaa95d230f0b6130a01f9929bd5cdbfa0326ba426cdd0e10c96ddf88dee8eede5d1cc5243ab0aa98b15eefa4d28b45ea51ccf28d12fdc30c536e9225458cfa2cb8a4d8fa937029b1c587e4aec5ca27c52dc4949f9abb42ec67e54cbcd6fec467fd263ad677c26f7d133feb3381b5f61396d51ecedc3ed4d19c14eef6277b8b7d4bc99fe1addc17b0ca13dfd6f39e1d6db58fd761af7e315f1b62c97a20d9a003de94c84e4dbe86cdf784f841e6c46304142444104085723ec08f0d6be06c0ba03f0fd22d06549c817b6cdf8eed05bd0610840aee09e464526e2f858ecbf7138706558cf0698432d9235e2d51013eb31f9ad51171111de0eb557ff09d8968690b2331fa5b98f883790ff70d2d1fcd410617e9693754629d5662b99bec04bcc472bea59950ac8da1efa16f07d845572145615fb21f5a2a5483020db3df268aaae8368e2ec9f6b4aa3cb8ad7144c0c67d31ac7debd521864164097237faea396533e2244ade3acedb39ce19c2a0f682c42e687aac79d9ff4e30071835390065c3518b4293970045880441530377f352faa36d25077b4650530a4b1bd453d8001d93b3927af095c30448899782f6ab87c3ed572cdc22d6097f00c9b134db28acdc61927a79fcd2137f3f25f4b403216768e27d24dbe77e1036a9d744b81bd06172c76ab8492de38c1568901d7852857c410c479e0332d15cf4bc366f1c7e1b66e337b0d91bd854193951002e19b2bbdb97178adf807f30521be07da1b1ac415979978c4d10b9711f6faf8ec85a2c055ada88a198e161829ca6d4edd362edbe8c50225a53c24bbb88aa677dccd400acc8b4d0b7e9a44c118bda93b0a81de468d03478ec0f2149f6a859317bd4fe770ed7a86765b4c688acc82988f3d767de3701e976975766c044015354efcd5342188b6488691d6dd1681631ec761c3ce9374861666518908b106acc3ff1300952d0b416522bf275d6fcdb12cc8b486bcd7ff4f1fee0f368a22cb013f91ad70eebb5a89cf82fee015c2c1b7facc1e86bf8eee2d516529ae67a7e4f0b2452a092b441d9a9ceff83dd168a649fc1a5459c59bc168009405d06f18538ffdc2918b0ef406cd8e1e1a63060c72e406acc44044e5580d409d944f5808dfb69806c87a7a90fd800c3145bfd0cc5fc144e4aca07ec8a83d675d05f1df84f409d09acbe4e6a1b20a88fec91d1070a3ebe1bb3700fd41dda0476476c1c24e0d147aec3428b467c89127e1f35119b185680179b93152b2703228bc135345519fcba11a7abe099325348a8173e1c91ffc20c19eef901692dd166adb9013b6d8128d8a6a341927c49065b6d86c876054770a2f55467e91df664421576a81702e1b9a6ffae545110acbb8808b73c262e3b03d2c41c3b1014611e032ccad58d3562747468ffdd054bdca0833e180df214e283086806d1a2715850061a7e320a6109b8a4f853935930be8a4eefeacc2a4c7ff0fa5cdf9752884e7fc3164aa6719920c66e5034db3ed678a57a91d355538a838d00194fac617818e051ddaa179867e528cdda73285e616235f7f727814c06b37ade05391a9f1ae3c5cebb6c21c8550e2eb9582e43706c4d49c482a82bbb22244525609e2ffb4bd00f0423c01bd709f9233e70114c3f922db37a5957db64d6763d2d281280ddf0c5882c54849f361129bc8f429e64b318b4407c3c810dbec7426ede59a2b2b63dd4b7e945860bdccb85fc0980aa214e9ceb69a62cbf143483dea9c81afc2b33e4a6a9c53b6232440406b055c8d1ba2be47a1acf3f7c15720faa78782b51cb4baa90378c16bb784e08f4a8a4b07155adf3badf411baca9cdbfa7fac1fff7b74a9e623f89824d39189c3306c3703b73e3a7ff3ab7b44649013fef3ed2bb229ca010e93c34ab8ba722c178301ae01a2560c5d573f573927a2e33bb57d7031722fdc2335d4ee7a032dadd9cc206b6e6ed293c699b2261fd85d961f60c60c74a7c6cb31644c6432a80c9fa92c7870da145708d165792e77d9f50793992f8ce8dc635ad62a37ef91fef8e655a376d5c3047ba89eea57d9773ccd446b2a3c3544a65998cadb9b8c2e207ea8a78d047d65e6efb17a89d1aea5deba05261b1159149e273968fd12862ef7b25efb43509d43a1801984cd10284e50a43da82a660b8d2804b1bfab92515924677771d03d70bbf1439f643dbde489f5bc11431d9751e46bf0abdd54870c63e965b2aafbcb2ce9a14ccf2cd703c7d8d9a9aeb64c22289a0c4b1ca4db8276c5918d4fa83c9de5014a6b9b812605e9d05a2aa9c19286e37a041412af2e244c58368e411cea200b8f8f1086590e5e56e5634dc207c6e9d4baa0ac6a2af362c72c7f0bb2d8bcb5e37a8e3176fd46594e67494e93c7aed4844be381316edff3d2e57cd884385a165bc771597f95e79ad5ccd1bf28c310181ea9b9a7339ea541ca42a3fd191fc2f10dd2d4feb1c40bbc7d64ee5a6770edee30268e8acb6c91b137bc631769ebf38c89b81fc5dd29c4200f209603f0bd53e317101e51fce820d671363a55d8c112d82c68f590c83c8e2bb717425390fcec42e26580d9028ec4561008cc34cd4b130fce25e6fa923d7533cf3548407cb2489d514f610c8076f40a429fadfde5ad95f3cd3832df15302d47328a71fc40f0832f459b53d6da8ea94b8407b6039984f45ebf6c015ac4be68c454d93c801b3585a00b241a5fd68ce9c7db9c7d2dd395e97e24d169d9d2a4af86734298a06d62bce107737512070c7f0776c5266225ac852474f684a8819755d940cf8cb62da4644c4f43da286f7c4a2d401ce332c9016d07dd4c1f56ef58456594b016ef817385570368398a44edcfb3101ee6b5c27bf5ecb5904de5fd80ef0e46b3da4aabf5959882b74f0387627abb72232e94db24545725a6cbc50dd948b82da26ba628598d55c822863ffe50ea7882aa9e1b21231415c0e5fe261cbeba62aa918081659a022eaacb63614c7fd754577c75320e092614af74d892c5f44480541e712415490bdb99730ef54a2168921446e35085ecfa037a083806e1d2674e02b02f8f2e88daedee537f0abf051e3c3c007a596b81981e6c11d94169d8527c1ebc2ddec9f58c037725ad93542d8d473cb92d635adc42927ed6d5dfa9cd1a04dc758e93cb091318a21eca19b635e7b9017336c614a09ee815f9a741e90d713b090446ab54da34b0e0a3599d2604644a396c4adac5f5f860dbb6c958953966d30ccdd4f009bba3a10b308f5a68c85d7ca1efb94416f7c83629761ebb6df3d943ff4c1ade00df0186665bd7ac9fe2c53d7f08c38b154ec562ca892b521622aaa9384a9d175fb320ffb6945665f66635e3c84db562ee0a2f458bb1fb651ca8b924c5902f16ce29c67cd6a85e5e98e96960bcbfdda2367bb96d3afb5b1da08f22e9b7cf2e47f46776f902e6150b394afaad82d93a31ed6518938942f1587776f3a01dd99eb8f3832afecbba4c4d2f357cc7aa80e351f95632f9ac559d3a441e8bbcc51955cff475a3892bf55f0af9524672e6dec163e48b429425d988d3765ac0f524deb6ccf06a18fe7ac44225c49e2850e3856a7c79d7975998ec807d229f831c773009d959200a8d0b59d77ce90e241dd4b7420deb01287f1a5c2a68f84dfbcdb888fedae194b3a6efb9fe3240dc6581ab27c3caf2b6880704202eafad6735d1e499229f901a1af1ac30109edaa625dc05f237c6a85bec67551d1e550241603fea4e3f9dec855a4489525dec3a3753841b77fbf9f24e7dddaec1ddf8670639ce0e7f4c8c655cc7a736ee0c2323fa6406a0b86423a76ed365875f2b5fbbb681b43d193b8d0fb704959a46669f6b80550e393f76bbd7fddc937c5fd5a61ad2dc6cecf5aeae6a039312c5ce7ea87da34a77401a9026cd139691956ab7682cac8c1212bd37a9b070433a46ef3b62e6af9769a0e0ff3edbc216459ff9ef5ba677f2986b171cddf1d3a22185952383c68d0bbc7591025591d8531780527b585c7d1f541145cef6e2ea009999a3f58653bc2b598baf14338a2e9dda00a03af7512cad177b358433b1b758df6e41f3550df490d9be1fe791411114bc8fab979907ee31c70b3e6897abee9287ed393f3627c87005a4c8dd4c09e4be359a4722f736f18f92276e94155e87b4890460b31d75570e0a10b1b712fa5118715ced2773c6fab63718f89244360e3c9d0bdacd0e89155ab95a8604f56ea48a67f2feec26c2dade7e6f8f68b8b5b6d9b9f538042634b9c068bab9e9824047e61f0a7c65ff894fc88f4e00382bd6a8a1d0163e336604b9e73939a4a2f793aabd51f5f678f3508fc05a6c9110bcb495926b350dd31e1fd2ad740cb8ddc5160f05c548d45656abc0d5ed8a0a8443c1b22073df34046d935f9e040d11abe4a0d4c803b04d19a1d7916e7178fc8f0f27dd8a3c4dc37da8128dbdd9294f27dd9e147ae62f83527fc58cbd65572734a97716fd8932640032c7fd5c1abf2dd493aeca87346d162ecc2a121b486f5124f74eea1175f2f11e6e3d9051d72d76761826467df20a302be8cea2adc87244127569e87fe509b6d86625ea0f42579e30ebc613366c23fc5b86582855cef1f29fad2226fece119f025c2a709420bd3802b8428b95dca6a79b7670672dc31fd1b2ee007e96514d7cfd0f74d74ef85f4aaa1e00b6694958a22e717f153e9420178a50f8c635a8a2fd00718dbbd14b86de38833ea7f6857a840f75ed89e8c3fc179cec76935ca97af64573898c09f109fa38174388b8bafb66a02117bbe8d327afb217c9dcd7217ddc4237f822485474d00dfbb5debb7614a050bfb63cb123e1e9fa4e0344b85ec28766316516cbdf82fc1d483c4f07b6c9c7e20c4f7eff77400caeb25d06646e3de0f157646cbf0268f0e22a2fda1bd5763f1315e99d8345201fcecf50d45676b7aa4b459c58a71671aae2c1ede3b8eb395c3b1c09fc8b335cf8f7591d7d9e7d2de75fb783681cfed77b04cf793311911e08c9a21554dda07a60a482797eabce4ad38456d1e11557a6961dbdbfff3e8a841e143e502dcd6bfd24a4d7fe97192d9993a3df5fdfc6e35c460379523e9bf2b98fc5047b93cda22671461a19e3ffd0d5b5678b34d4b59149ce2a59b440b1d89b7c111675ddf68e702f31f6e731457d81f079921e4cffc9bb660b565a92de5dcb79973143f1583ec7a50187203c2a06f02f93d915d362df25c0b475162c451dfaf29b8967fb12005ae7dabc411a05b937d442e5b1ec1b6509e404783120a086222a71260a4d8eff8d20b25f0a901bed2f45a59f8e0ea3db0c0df10f87d3cf738eac916f562f23fd25a98e76384926796fed339af542ddc27a8013da47f88dea6277251d52a803065794746c41f15d213e59828d3abff3265f745e6451e4c03bafe3a023834a1a12c46776f3504d2056f0abbba64a6568512bd95e57e1cadfe67b4dfcd6c91bbbb7a2f508bd0ca98b39809361e3ba918551e2b2aa6f18d41c57867c4dd98653c1c48f83e1e6bce26882b9684d2ddc00e19abedb90a7347a8c9e9d5f76cdb454e49aa9ca06b7837a02f53c7d10cfa311aa356d1882a25df5415e4b860bae1029de75a56ccc9e4d0fd17b503387620624f15d229b9f4c6c7df828e53c799831297a099fbc3a779bcb16c7aec6ef79fc019a0dc167bca67909be1e031c4106f2824ead828237740e860aacd0dda66bac833550c009236c69b2d82663376ed366460c75287d12396ccb59b58ecac4ea172f0c0d43c47b7ae1d08f31a9ba8979fa8fb7f17fa6074909f0cb75650ca1fe9ef7d308132711fd7da0dd06e31599ad46f2782fec9426908154e47b8e66567978bb92b96c38339ce8547584b4237e46f69da2e091a42277319863e4379b7ebf931e9a9b31942a0e2d19050f8b80953135c1f1ce15170360a6345caa806d5fd22e49f88211c5ff4d9afaf8330035a0865657c8d8b2e42626bacf87bd7ed8b9a351dbeb391930407c25b00ec79cd8d1c8eed10cd55e0874708aa874f8bad03788abd25e0a4628703d88bd56896d4a0eff3f3f8672ab305975c121e94ac25fc3ec7a82573ea826734134d80df9895a9fb89087b29c40be02e8958b6e88e2a4691989b8ce92087044969e7a34667a1a8db1f58dd2aa69ab6a2be720e9163a179c61dde0e940fc47745372e6c6c255f4149d5f4dddb8008de70779da9e0a1d5789dd97ddb825e8107d5c8bcaa29e62a1bacda0a147637401fdf21fd769fbda8411afcb46f7124162376c0dac575e3e2211a860ee3e977f778f26b3e89450ec85d6b07b21f2925bd594e9eebe86838b19de987faf25ce601bf1dede291a5ec882c5f6b063c4bebc32216c13ff341e9ec1ee425e3561916178e3100d597a46b98aced87481141800c368c24c6bd16098bc50652dae3c0a31285a9037858ffc0ff634bf2e914c8b4c532568189050f868481b4acc01b54bf4ba62a82c6d5bc6a8c1c0f79575334b1e25ba7edcd4e50a24db520b85caaa59958595b5b8598553c3ff6bcdc416d2489141e26a120e37adf91babd5921b5210c83a102d888676b7b3a6df2f1aee4903212dc13cfce8c0c7aca2805ced29ae968432d5a26c0076930e04bae3279146729699f2c908b31824ecc07199020e02d8ea4f325f1e8523614e88b8a6ab4c6e6ff79c7f40a8078b19e543af1db1dadc9fea51ea3a7ff62447f2bbd6b9b374395862d8e19f719861a99d09df3ab1e157ffead90bf6584f36a7ce6d4450ff72b5a9a4ebb851fa07be437c4c7f0be23582981979efe085b7186bc46feb42fba1984d0dd1df198d213afec93a8537c86beb89e8686427135beb289aef8711d086009a89b2c066814909c0858aac9797a9a1ecf6000241b984392491209585f8fa3a929c948dd12b92672b19bd496ee6783ddc034f09cf3c98f6ff3e0dccd8955eee51d6bd623151e2066f983d7448a895f105c6e1fbc74f586d178ff27d466a1df33f92c1d37b22a869182110a7852025978739bcd18c23ee36cedde897ab34be020cece7985b7ecb088873684241f66499bf213729aea9c4d02187cf35f6252eda976d90daf7841576c1ff94bca93c5395f25edf73a04a30e8788a6bb2cc819dbd88b8dd6b6f2cf62d2b692c338e75c817113f49b849c3502c87d7198dff100826d5adc0cf57407780dcec17841d6e91d8fba455d438cedc20f4e92be9fa88cba175d2c3b58b20bd7c4cb2e4e98cfc164c974cd7e6b68164ae4c400882d484544ff419321343822e4aa68bb11d647de8fb44ec5f4cdcd75e06acc5475a409da2271c69aa06cdc8b4b340b4809494fb5881f39641a45a590ef4e939a048d8f002b7300b17ea914427e9a2c02e78cec2d043ff5dcc5c26256e71dfd4123d918f9ffb451bb67afb6b46367827c51eb53e25d994cd3a59c6929e167e4f93f2685b48ca55679c375c505e9df0d563673c818c8935650213ec2273a62792e1c4146d862618e1a42c08d10119082feff8ace3101475b3e32b23717ebfa51afc38cc0737264eee55f4f1417ba76a2672ae1525065e47e3732f5f4cdea775c9fea615c6cc2c847a18458d4df84c0ce6502fda61f11a72f9332c0e6c428cf43b92260fee29d20c0522027a81f6ac82799642587e0bf834ef510e157a8294d73bf861f332001f295fc1ba4407fa0836250f36179079c1e34dbbb67072cd80ba5129722fcf86411dd87dd71d63e18969c4a372bbb1925f8abe9288ff593e069607291166958192a91a44f918dcc6fe7f61b567cf888873b8dcb0e79d3ed354f1a6b0ae94bf9547f7039877b2cc11f73fb84cde5a4da43e75f98850a2c7021965ea3db29902d6b91b459ba251f8f0c3b990761d22396b9014cf231cf60688623de622e253a5119387bf688b49fd10e7e8f26afeb062e526e65162d66c7b7ac62670c7732fb0504ca3cd95017d2dd1c2429b53adbb7e321aa426e25ab706efab1aa9a3da705c804d15b1dd1ece9176a0e99fff7631b87dc860ae56426a1bd23c1661f8bf220233147deb50b3e144014608c58549c5b66e076edda5e1d52d92f3edcc1ffff39d630f570f3d82ad2f361871d95fefa3af278a529321568479ed21989533c372b908cf50da2564eec91a99d1148e90318c4acaaabacfd500b00ef1beaf57eda26665bf9115acacb247264576a03dd60c481ce93a943bf1f07806803db0bd42cd3d3cf597eab12272e6b1e84e5f3e810455a4b03a451879ee765e0bd3e350c5727518503a7c0b92b7579d568112f7ff106cd8409802b1c1c28da751a602569a8748f388d054d38b8d9370528efb88121199199d9df4fb6c6dbb9b7d70734a852bd4f639c236980dcdae34fd6c25d9519ea133b45b664e2f9f341757fd2033bb7dee0c186230d9d17195b857fe3754afbd3f9dcaa0738b105731f4f1f2dac82d28d013ae0d9720a89c1ebad44345f40d6140527e3885b5986913a73f424e668fba7929fa7924da2e91a266d266cae4f432d167e9f701d40f2c00f6c821f82057e448e46a5d50dc555db631afcd135a860488e97bd50fcc7d7b256183f14c2fd179427ede00e878138887fbbf8391b34e8671fa77cddb76de0f3d97300ba21bc5aa441152fe4b76370e0d5ed682f64a31ffd7916b669ca392e1fc023fd4512f16930aaf2c04d779ef5fcc3840a146d8668d032cc91e07d5862fed95cb6d6e1e856159cc35054a376a620e392107a116f6caf2853d26d23909bab2a6e72a3bee9836793d736b17f0e53f34400e1357e48418e3f268f301101d98067ed3a79b67389b5897408c7ed397909b7600b66b2dd0a0cc33ce172cf7f0f946bc455bcfdd5e772f51eda76ff6572afc2bbdf1a7c8d210154d302fae935625820d8594d07d5c7c64798dc6c085988df646cc030e94022de03595b2935ebfafa18b7777e1e8da7890042407a06b2bec70dd7879ec020c228af3abc836d1842f8986b01716d22dacd131e2d13db5aacb5dd6dcb2da54c29a56d06f105fb052ec593649cd080214a5945464a8ca902c34a8a150b3a8d244823c96924052006f7a418a0b392202bc959493839d13909534420ca2863151ec2c1ba27e6414012c7e8037477cf21c9915ea4a29430aac42a306862ac42435363938a31134386cce4828c191fa58c58668e5230bc286515273352a24c159a9a17dcbb9022e3c426c68d7b1752649cbc70e36e45c6c98c57c1e05d48f12419272a0f0697e249324e68c010a5ac222325c654816125c58a059d4612a491e434920210837b520cd059499095e4ac249c1c8f4f44185552be059c9c1aad2ea4581180006ab45c8a5ba9d18a12baac029d868b08a34a4b062b32cc6065061aacd0e0edb98083bf3d1c77116241b71bb53ddb438f52916c996c83c964332f526d04a3897a49c7b0e8180c9a1e6a180d4d8d4daa8d0809d5bc8831d344fa154386cc3216bea2c45764ccd8607fb4c1ae584ada82f277b21658136429190c4f366bd204d6c95233485ec44734352fb8c4b89962d6b2248b47474746543c71f482ec6683c106db5ab0ae9e6d42c866dc475a3c713463f62a188e7cb6c1a6345942a6249369813d21537930b88c8a254a4ba6d113473464307432a221192a8e6231a72236c2c20886d5d106bb028a6cc5da98c8eb654488c689610188210810a52b31446629f1a094f48375f2a1b48493e347474f74f8ec02bcba97c2d96039355a4753cc36d89428d6d5b2964991c964530b2db096f5122d565a96ba253a590e9d4c00271c45b265a946ab09199375b52c754e1c4d232a28bba4d7507ab6c136d876c46de051aa216b4597ad1e8b97b92b1e4519d213e80e8c5351abd592a16d52291966e0981968d8edc806eb64b26e8976c529473be2110daf17b0bc9a48bf8e38c22606005c68d08d48e2100c0683c160b383a5dc2509b05ce38b46b54d431c63c0aeeec5a6dab533e2040c602d5857bf5a88ca1d91664f1ef17201b72eb439bbdbb35e7560aa6ab6a77ba41528774f4ff30d3dbc2407ac41ce1e581da89080eb6c184a5c0d6a50a869ea0f1599136e6f7a65c4e19c45a9cd59878ab191a9a1a1344935388a18e9cad2524d77c4339ed9d8c490918a316366460737229140f8d582ca20c0c4a4c7326765c1b2d8cc1434372f6c742a6222268275afd493d49217a7228ec56c6200c045c68c8e87a200a09b28a034e61473b6ac9e51acab5f526a77af7ef202eb48fde250bb114c68f60bc9d0d09317ba9bee04ab0b610c83a5aa96847a328dd00e888f5d7ae145fc6205a0f3a17e71887bcde0b5510420864d071d473bec40eab13af180d3e57470fef4ca676bd8d9b1814796430c271ce42ebdd438c44a68ad682616281ba1353a2336757d98db43d615855090ead75c42cdbad7ec84634249426598a1f3a17b2dabbb21eb9a331454a1a428733694850cddbc02fdbad70c73b5ddcb352bc469734ac08c1a89b0a0fc5f1c7a2f4aa566a0a169b0c13606d0cda0f6d0b2faa310ebea5edbbd6a50fb9505e5ffba57ede7066013c306e53e43464b4c85457733c1b9bb57c0bdf60af797bbbbbbb31494db9978c17ed8509ad5dddded4501637b438694f1a5831ac498b3bbfb0792dcdd734882dd04ae06a51d4abd04e61474eb861615faedb2d1faf16e76d4175402262d85564adeaca480fd80765d2650a8a0ae5eaa6ea0783d61a5a378e8eeeeeedd0968fb0d34bdde31eeeeee3539aa7bdf05eaecd552e80319757f53ce9a2b77d948004d75aff5036f0e4d9d6153d7d5c18042bf14bb707ab56346f46698c4134eacf374d7c18f0834a0070240ee1648724740121cd232012a3a5091b177c04c2bed8ec900edaf87da058edbe1a43555f7ebd7929daae52c67f99c526082fda71450c7c24f45a9b9ab6e571048f58f1edb7bd0d1238e8d2fa5d7ffab1154c8a3390bb03927b2e0022184eedd4738259c229d49a060437a84202443865832040c882526b818426c23ba493cd87a278d1e9cbca4b5b305260802c968498a2dc4aedc98a240bfd4471953087f606104265b3c010b4330610b1acc9db488391858010418b000ca910d8ed0027c1b1042788214f356f80f7f0561c798a040db79fa87b0bbbbbbbbbb7b647979797979779777779777779789134eb8fbbcc1134eb4bedeb43fbb774241f47ee61bcdfcad2b400821430821840c216466f8b0a350b34bb34b61384cc117bb52c6194d4a778fd96597f91208b375528b28b5174d4aa3c9995c3aae839168e6a70e35a3a8137577874628a3baa84e0e65819ab9c316e9cef1eecb06e35968db3a1fe4cd912f56cea498b039eeee2f9c42e8ee1d4011721028fe07786c4f9fc7668aa6f8f34ddb4398ed4d9b07c475dda7ba9749bda8e89bbe53d1dfcaaf4a3df826d3b7a83e9fcea4a47bd39f4e3822ac31aa8f13105f3e3727a570ca3ffdb7fa405085bf3d10f71f900abd10c0a8bc410f88fb6f6edccfdf1eaa268f43f68a7ea0799a8781a1f1661e0606fc175f24f54564e46f457deab9df9ea7e59f64ea85aac88c0c4af5f9d493d7274e35b91855ca59addaf8260e76a71cd35d41886c17b2f4c0fc1021ad67bd6fbe69fbef138ecdcb211f9e1a207368156a1ddcbc182268cd02666d4d2d4ae8fd0c72696a04a5bc5af9d4c5a9fe40f13f20ec85004685aed2344dd3340f487ef4a013517706e2eaad0714ffe3f930beeafb76277b40d22b9a1fbd77d776d7acfd5e8f46387e1e403ce66ffd82ea57d4831225dbcf96257499109a55a9fd313ecc6eb61ad09d55c6523ff6138ef81f70f9409a7b218051b9fff8a5d4fef3d34bedfda5fbc93d20ce2bfae1f4a7d75e326065e03ffd9e7c5a52ceea166f57866f9ff014d4a7fa5377a14edee95127faa86f39a13c9ebebd160f75c261eb2ece17df832a6c1d095dddd398942ac6b3e91511b46601f2f9e5ac3b83dbb30a6efb8d66fe1714ab5f8f9d559cbada036dff01a90cb4596a91ccaf5a8707fc150a8542a1501ecd2603ba40d073969603cec71e841f3fac309e0764faed35c701555fd7fde93be66316705369c37c90a01e18f8dce6c47779d4cbbb3c8752a1fe45858a15a55aa9705c54d46b51c947edce2a0fa0edbfd3c3fcd6e903e3c17c91a01e18afc8ccc77840dbc377a8327d976553cdc87842307a60bc1f601e265635ef03806a0867e951021fa6a3f7a4f2c378ebac5542e5e72968bf7b1f0303f331cb5f0466534562be084c8ce7a55cba43e2d65d6c738343635a7665a84b6b4caa2e8ccfa77640a6ffe687c06b11fcaddb10ff20413dfe502502ffb89fef271c3e26e01eed351f12a4872c495c71852db6c0852c3dfe45827adc2b225ff33c20d39b543745f1a5aa07ee19b2597a8460f444ef077fe8feb0887b414c3320e20741b8200927887ae017f12fe2a5620fb1e310f007f845228cefacb9a2f007ed8b48cd934afaa1f7ddd4651776e91af60a22f52f16486aff36df3005a9575b619037ac82fb21f2b55df95be5774bf9ab829edc95d261c7ac05ee624c693a05e38c115206fa1277f91267b1c37cc889d6e8a881a852ca6c3772d651eb3810bb92b23a7e6457b208faf991ca0f8b4104410411f5063780410451fb397720a0030144651f7297d450f2371391f4b82bb208ead2251b492367f14f2218e54c36912d8919c92322a3d812996c2267f2487a942ea58cf2793aba8c2e647281940ec1902811ac68088634a9514c794bfe38359513450d463804b5083dd46604eb8cf606fb33bf8c42bbe4911cda1b4842fdbab28425a9f64b2479e42e0e0b1189d419914947e4121279a508ed9544c861b2082affdb8cb82bbdea6d28cad49da92f6abf2ca2f2459d43ee3275423ee42c36cd17985ec1ee7a45a5e953271cf15f70646952a554331d6dd76614a511f4a34ff4a273186c887ed461ccf4cbbf1939ab7d93aa22ee4daa213e5eafcdc85d0e33525198f7cd108d8c2a55b4887e3646357ed7e87d17a8d073554ddd541346d3306c97c386aa2ca20eeb6201a802378b817971a12d2d54dddf60407bd63aa70d42817c057f28ffd40f9bbb87e41b40ce6671e7dc9a1c827e29df1bacea1a4293cc08932c76b78c45294410bb1ab87b90d97aec9d7dc0ad3e45a516bfd32b9df8ee6ec39b2a151608fd216fce50ca067ebfb637ae80041249922041b22d45f898403112677c0dcc9011c3a6860646eac58c4c0ccc8b0b6d419d3aceb44ded055c732edb98d0272db26e13494ca99bc34204d086ac4008380802109260c216881c890110b32b8a72807402ee420926a01862b2c0dbdd1d42f686bbbb703ac3dd8df0c5b9922bb9922bb9922b29790c52815420154805528154626419b7e9040edae056ab861dbff17f9c55924d8cfe039eadb98431c25de9bb59f4ec20dcddeacab8b989632a5c8732d2b58ec974ea8cf4f4f0a094f4c387d2924c3a3aa2825d9d4c76f4c4c98d11bae8e225c593649ca83c180241827a52ce822d674108df5538380bca2a3cbd807e7ba46347eb7c313ac4f8df406fc269bffdf31fc0af7942b6e79f9e10253f4236f5cef2efd4ef7057cdfee4a1d90ba264bd1ffee905d99ee707e16faf66837ae6a605855efc9ff995a7e10be99f2f4489f47eb4e71732bf7f53d5ac57133d07f4cfffe99fde0fbff64234afe55b16b4bf051b5ac1adbba02bc1316be4d7e67014da1cfed813c43d787309b8bdf9342217cfc7313e72f1128f75f7734d68ab22ac573cc4441c0326ea23d08f634d5a8747c6440ee0898206ceb339dc13e8c731d9a49bc562b126d08f63da9176b1114d888f20a92e24b1b4eb47b31c0b916e1673648394e4384bd5c6950f56a8117547e05cd64819bbbbbbbbbb5bc69deeba3c71f4f4017742d09a8e95bf8623662abb5c605362df42d95962326556bf458a444ca250a9df56d1b921ca141d1b959f752a3fbf8d8d1b9c9d6d5299b64e0bbf8490524619977291a6498189289254187599880256b996ada657ad5c737373ffa4ccbfa7c95b15bad3ea150ec87422a1ee15d5fcb464c992254b4f540929417cf941b4975ecd03e4cf9f9e10cda3aea4a6874f3e719db54596faa5bc091c87b355abd134f93c36ccaabf8f20ed725915ee38b40eadfef05505929f88ac78554dda689df6a1ba09ea5743ed56edae387a37bdf22f9aff6eb34447043993f9482e824cca5a099944472c5db492c4dee0cd611eb81462ae55b338491112493cf281324241bf9d1981dd08b92bbea649d56a6733199d40bf9d7d521693baa51b2199bbe2fbca2394314a70bbb45030c018c0a2f667605dd089fab98060599bd35444a12e1375995081a4fa68423f6ed2849fb40ef3151fbd6a2a8e54c845c834b9a3025bc3df35cf070aa6ea1efb6c4e13f463a179848c67ced4b73896e288d9152ddc348b7142c00480dacb6dbaf0b8abb523e351795c835faa3a0a31b94412b58e2ca28f48a2bdbf0e77c9f707e22e7ae555adb2999352a97d8b52f7943b9704fab110914cd23af05d1a710ba50c95034eab1f4435a1b33a0e73ee8d75ad364d9563737058b94b01ccf277277c07a0a2fafb32e16b5d41a27e7497aa9fe05bfabbf6ef54556e3e6d53a070ad142905c1031e18e1421276d0458e50c4ca90c9acba4ca66c1105090b553195c6c04076777718bf7aeb2ea51110f290a990476cf76d4a804a94a66d631429e5461ed563bb7b40294a1991f03b7b30b6bb4bb75a376294bc3760125a1209898ed1cd07ad459458fdde0a1aeb3289928329a2dc8088fa7d94213a26518eb83cc252bb252548e11f1cca5ac1074f02660448c435238eaa7c973a4aaa317ecc3fbbd211158e9c50bf6f25c1cd284c2944915a025b6922184dba478a0d71a4c4155982682241ac520c80a04270a823747f356e617597184256d9fbe1753787570677776fe725b8bb3bbf3b4729b0ad707777776e247777776778857323addcdddd9d1b29e6a6e5eeeeceedeeeccdeeeeceefcedd2e05f614778682af40981257ac20a221618111b1425219a50658c3944532498183262c522c66458471135420126156ac561d7f74159d145d157bc42d6108437b64854916a1f4d87929c2490b7aec4cb9b999f2c3bd8a98d6f9015706abe0254803207ee0252b5ad36b0e191c4891833a25157ba4a6fc881c7fc4283236a3155b113d62aa7fd78e313c85ebd30edcbb6bdd3e9f3c772d4895f45adea492cb2dc79da6fa3e9887f029945fcbbf3ce71d8dcbc7007d406acbcbd75a5e9337705ea557adab26f32be3c5f8f0635e7e54a11ee2f02c2f0f04e57ced5f3e46f5c1783dfc5fe07f8007275fa40704ffd36666e06bfff2f2b5f87226fe4bf480a65734f37046b5372efd2defa2fa7af87f20a8b67ca6d73c7942a97278fd82aaff49f54120155090ea6f52f1f00faa5b13549b99f1d659dac7e9e5802f1b005f7b97daf3f44b6b51b88f3ed2254f41fd3f9fda114618bb7f9d7a2967adc7ceed52b8a58107bf5c9a27743e67a99ff65b0e0d88877f0ef99af705d54f7a45a622a1ef31793d2881afa46b725458638c310419f8822a07b4fac381d889e0e0c3d93a3cfcb5a7a8a72f2f2f2f2f2f2613cd525d9e630a5d9e83757395d7d927efe3364ed5c36753f9d43e2580b3d48d337d9f43ebf84b87d0a507217487be64e505dfd3cf75c7b3037358e849af4883373b6e034d5d265a48692b3ca3b806ff67aafbbb3da08e6202d02095dbdf87930bada5fac318213325aab223b2a880a7949cc9a857497ac5a69851aff8a5d44c466e8ab5ce6a71685b87ebdc7e40bf0920205157759bf8811295f3ce34b41f54d7fbf88b42714846dd9a10f989010b858f7291eb534a097cc29182826ab0cde1d71e72b1db7e6f8851370fca3687ff5b55647a9349654a42a7c9e83319558e4695e3504bac083f41827e8204b11397524619dda7e64408f2ff89ee0fbd20f083f8079d604e4a53a9ffd56aeeea47d2eb4524868411242f2122a323664d845eafd7eb63abd729091448901e3ce8384adaa1f5d39a7571aa418fd69994a6be551b090af187dedce86d0f37f79b86a0cdfdc4a7125405832afc7e541efb3dba0a7fb9c627abf6cb353e18ff7b7426219a026e6f705aa766015ce35fb99842ed5abc84db9b9ddcaa8fcecde199334654f6d33add8cfba7753ce0f1349deedaeee91ded3273b73b84a621facd6e85b3daa9847e36db667a13c731d7cd3699a0c9e46d62d3cea0f81fe9062a901c81ee5a2142fd5a66755b64753d1a24d016598de20fe3642d6a1ca3f6f139c272ac142a7b33fa983e93f0a37f66b0a1225a3c2cd9a18a0134ed7b2d499783e802babf312882a51a7fa78c461894a9cb640b47fc30c96aee335380fbca526a9aa64108fda18c30080b5b53903ba49452d334a9ade70158a3f7231661c5fddddcdcdc7fd35bc8ea47f917ba803233ffc321fab5765a367ab7d70a16b6c03b7577377a1fbff45e6440f9e70721845e842c30e122c47fe58e317aff37beaf5af5ea791aa7b2c73dcb4d98025a12a93dac31c68efda359dc4dd8a8aa4387e79c83281dd1d33416026ee01967bf2646c8cccccccccc112ef316498fdaf48af7278c0732054468de4fb3fa7bb0604e4a53a9ffd58af7f5eaf956350544f4f75beba331915e09091959b2c49122846046312416691ec18ee94cd14f09b1100bcd28f4e319cff8194aebb417a4573c5cf921dbf13ca8dfce568624a5c4769fb5acf63edd302b1090eabfde38b4600234825d3b92b829e7d4a626b7d61deef2e1010a23f48a36dfbc9d97ba4cb2f0aa500b06b82875777777777777777777f70edddd3b9a87d3cd5f89b8803e5a3822bf7f7b624d8c707777777777f723f4dddfdd5dd6acedd9d0ab95727fb7865eedee7631c5e49814dcc6d7f2f97919d1415645873be5211bdc7be5ef01faedf88e57a47d7b385eea86c61071c1bd8326af9e6dcf47fbede1ebd5b343af985f4c2486041b596224424446fc32421f409afc98ccfc6d120f3d5aa73d1d7ae5aee9fdbc0d4aa833680458802e82a8df7305b42447707bd339c026adf22aa5dc0186a4c76cb1f020dba775be950ea39f6ede953f07315c477591f63cee72e6baa71a264e1728e0580b5c444cb0d3335f68f6cc0208ad7ae67fa71a84767ae67f2d740d00dd3bea2ce8156dcff9c95fcaf6ee9e7336aa486b69ab56f1a86e7018a2373791082d954ac99f968d9d1652abb5b384845464f27197c99b379c6aea61acab029b4aed8d13fd91bf0325543f945055e9f0416a355c24d82ba4cd93de97aa744e4a53a97ff9f5c0018da7056854a8517a3b36870b0a63e5a6ea6b49d5e753a54af3668f568d1e9d75ce84f473ef2a214a7efa394f883fc7390b71a821ca4539234c457715b7e7e938638c73ced89c0741891099af3d11d36fbf271f0eead8e12cf89b6aaa92e09b6e40df4bf50afe8401f56fef08856b9ee0ff70d1c78f24411808f350654dc61dbc640786aaad53a916097dcff47e348b1d40bb5ef1f3b7475ed16c6f7a3b367cf42bd32738ad5bae80c6a07e8bb433cd2b724d2f35577be354fb71e20f20bdea8f9e8f9d6d5bd0f9db330d4d1374559dcdaa1fd50495f55bf9540d87ffe7537bb42a4ca5229456e158c9b172fcca2b5ba9b667aa967ba6ca359b2eb647017d7b38ee504354bef6205857ccb2f87700ad4e7cf8db431b2e54f8316c97ae03b6673e777201adc0ee781d7b034685ace56253bdb360a38ab6e7e9cd0b9c08a8148d5a6952c9680602001401f315000018100a874342a15818a6999eec011400106f88406c54389606034190e4280aa2288a10638c010600430c41868a864a00cf0f5a0a3349fbbcdb4d5a6e806b8ed81a4ef68b40c89b55bf3749ec8288431a22d3ef808ecdbd238f992f973f1972bfdf31d531d1655bae4d8e8d574dfbeb4540f69a3f76bb130570dae5b097f0fd4392517fef156f176e0d6388886ae47b375b0208175479754de717d81783f8a6e0be701737ab92642e1c183319e6f0199649a6e5b30ad025e2974ad03500e122ccd5a67c8a298c31df1ff41ef6ee14d9abd2a9a99822fa8b84886330e961e26b51e740b1e292a24b4af35995912bb81e58a70acb32b5e1d378f683fd0ea27c1cfdad7834c041605e269a5b84b6d3ae9cf2b6bd0e18dcf13b0913c315913ec7b309b70dffda05034db9ab9ab5d9fa7b822841de2e7699b94e3b3ca76ae6a352405b427e9fcc33b7fe5dcd3c69e6f7974d3407c66b3994cfa89a2dffe73595d3b544333eba540ce9276384eb50165148162f0f569ea6ab249ee0cd5f3da01c8aa7039833d1f25f65672e11a69908b0f52c86553c706595247f68066dfbccc4070d217c558c485a4e973b55db003e3cf8737e7142cf81007d3402b1183b54b2a38c948f0ca07541c161bf411f50f7a865184966c8108f32eb5a227fcd333e1d68f76fcf1824290e91fb8c1efa50d21f5ce15d10e55f081299d7115632ca04753d8a724964c5ae73934ecb92008e1d9794c6318577ade4334040d21101e0046a41c0610140a7cc6e5dcb5769650ac36512f5ba87163c1e7f49b7fbbace045f668bfb2616db24566d37d92b166505b0f9572c1e0a919e6b54e104cb049b879e9f6d84e0daaa178d0aa05eba4a590ecbc7e7e7a81c0e929401788066fb797869fdd20fe77070adcc8d3118c8ad7645249cf874c54f9eead36b69d7a301cbf0a2b43db634a1df54aec4b44e0831e0e7d57aca92c49b2490e9982298a4c9389b38bb47e5bbc90541306c82165f5a9880d46fd839ea3aedaeba8ae879064320de18d5ac2f451514ef003e29919cd010888fbd1297defac5b312c600919dcfd540d928e597ede4e8e18544776deb34586f274f64d476b2c95527df18c882e76ab550a7c1374feeba824030eaf5fc4bfb5dc4ca6680532b76c0162073c297c74bef58c3f2264f262d3b900f29f0005eecc114b7035267fb2c3c4fcb509bfab4fd1b0ac3650bc0d776f7e0dcc9bb6bf79370042f9b3c5777d1023f78b817edef469904cf81959f9073c7bbb02c04225ea6a1e37522e12a0d2a21269e3538da01629dc3ba7de5e62fd358b1720504cc5469f81c9f9879143c05ac6df49c9175483b3527be22458079d79049d8232dce29b973e382540e903eba5a462ad9e5a21749c691fde857780225a3bbfaf2ca406d685c64f64dd706daecafa0a98dba44d416a3182eca3d4ca546ce90587e93e8aaf01e4353cf49ebe9297647dc8063f36506b6895ccf664d178010999c1382346967e7a8f2d61b15fc8ec4e39e5d83a596c54ac9e947628099e79818ee4abd45032c7c5caf31cec046f278c94ad8189af8b2b3659403f13716950ff3516f5e91783070b088b808fdb9a6e6fa4ed992d080b77aac478827a172202ce53e2e5313d5dd21f2a78edf7f9c904099338c6fefdd1ceea242e8241b27d1bb5f33a04a684650203da28550a6537307ed596f2449f1de326754bf74ae4ee386809a3e5954720ddadcbf652850bd3af307d41a162dc18c67fc0762bb4c89fff53729145810f119c3b2ad520836a14eaeec6e2a1f44f72483bb0b48f5e4f478029cdb6e7a069894ecb4a30e79d3c0b3bc9f83b1f80673a17762b935e4b60cb9b421e3f1f6e8ce1adb5c49debe47e306e211412a0a57371854ecfd9ef440d5c570ae016aa037dc2bfc0c81c459df5855265e044c812c02f444f4ec0676c3d4806cc763d668eccc87447b487bc3615ee64d3e0571c1b367d07ce4431fca71e21eea00d496d4ba3a3fb0d3048665a8272b40d7c3ca6006d192470efe20c7d8a07328f79d650052cbe9510a347b0aac1ff3e7b22e1ef82ee37e996a31bf78e502913dffd05a10ee03c6d49d88271e8df601b9fcdc25e85be025772b1eafdbc5367010c011f2214c425145f976a2fbbf2d0aadcddd0609fc77eecb9ed130e6eecc6391be29686b359892c36d6196f33ae7f3c7c64db05d25a9ec4e419712ddfe606da2fbe135af8946840cbaf71cdfe9b2facef8bf667aaef924da95f9bb975212094559a8844b37c1782bb431501aba15f013298b58193434ab62f9ca0e26aa43429d1285d57fb027b25dd06c573526d886251038bdcd1d14cb872e75228028d767915a897ffe127a330e95f6e4506ff590ac894b56392464035c31d8f1cb74c51b6076ab4f0346f3759fa1d0fd9426209a1887ff6b25f415517364db1284fcf42482d06d30334a0662c490b84e22223e5efe6941d457226892559094e40fcbe6458e27074460761e2684d63016fc8ee6efbc3a3c70feef45fe16ff9a1cd16b1e656be0e2b90cd58e605e50cd61368bf44af7e6aab62e84e16d583d2493cecebff470e05a91e8acb35fc867ca9ea8addf2c77ee3bcf3812a1e0c3a3863c0e2991a6abf7f9ffeffa63bdb79658f4a77c315e908777bd1612248124d708899e989106fb0464b9480a318a8144dee1697f8b9c2ff24320298e1687b22da357079b02628ba030ef0c7564e37682b93f8be32499d9f6d05a117764bbcc8d45077ff07cffe37449b060ff2ffb632e80230e60e7ea075acb7fcc4808d9e0ecd5de0d622a10e7e063cbb572c21a4aae71eacef55b56dbaeda7fc18567200997c720c30c005ffe62d04ae9ab37134e9d54fe9e8a632499172c9bd5131486770932d38f5b1004e9ee1ef52a456b446b23d82e709fa6db51a2f116c88b8eac61f7ae09884459a50982ee05c27d6dac0d5a5d3a4a566e2122cfc41acb876c3226ed2a151a8d46101f79f958506975ad393f4854be9bd7a900c647de668fcb6e848f76dc9304ab19f0ab4b685f76feee97e4f55612b276fe2a9ace8da7b3447aaaf5b0f223392814b13720a1ad8bf51e3466a0628d62c7e915ccf57bf650866eb56c59da4758a3c56c451cda6d2c4285e17b16934a5988808730de4462c6700f51696f1ecf34756944e18107382457092f8e35f0d6ca0e54c554be5d9bba35b879b413e96639b818e506fda61cb260aa357504f421a156732c1872cf683c430cbd5c4ebf7815bf1b51d5becf274e09d83d9f0f70f27eb44a1bd3d82597ebe18b45ae861bf54e64d54c2c1e4c06f756640a1b0087987661af99a31e54fabf19fe4d1a2946e018c7f73d0f3f3e1e8a9d47234842d84b916cbd2126364d23b5d0ab9909e1530c252dcf8d6f2acb2b317777d0efbe70b5bd642e7e1a6d8ffc65164bc6202f4113ea56c8b55b785f4fce64755ae94a48c87b5747e4c704085d92a6e36643ea6de8efd2ae5dde9431a047724ebca938ecb803306467204754072e945b8b020131ade5fcca80a3aaef8929d0bdde0010d02c267f155d6c282424e790d66f85fbbc72194c7b862def1acc433b84831a619b1846de879c1d2105c4d17202a8d6dc371e908095fe4266289c8328b64b0c78f2cebb231d4fae3b635e78a365d596604d928bd8be465c464d86f8210fd0fed88bdff010943002e25c150184c39572c7e4e7bbfdaeba068b81a2ddedd5e111ce1482ac4dc17b49d6eba5c3bba736c1d88a104ffc840abf75a0d195740b44166687c6e35a8d5688be3b6170b8a0102fed2b34ec2110dcff710812a4fd5e7333a28130e46ad56ba596de6f4bb149720a373e93c04af9c758b991a10180dd7818f5aa91f81504fa67328ab07e67c8f9e5aeaabc2f8fb982f5e862ed46a87a7b0dc4fb1bde476c5dab3da1a15f95b0eafcede8c49ba62b1735051647f4d0d794ce4c8c45b2272f778ab2461bb472465da4e0413f0fda432ffe9f09e5e88fc4bca070332cdc14e2104dadf2b3d948d28f08a21930bf90c4d4d8d2501b674b352b2f114ebc9b733319d4b9fc348ff6c8335340ad11d75e5024c8d141fe59d0f0c0040fcb4aa9e2ba2eb456691cbcd6d3e2cd3b3f9080e8b3d9774f4da708fdddb94d7b48707d43e5321c2f631d4d1eb7ceb5472c98215405addc30c06de03c6af91279825b11176b2d269a2ed0b8676fe5d2950349b85444343d52d23f8adc62b0aa301fb815b62786082842c92584f8ce1d8a140ffb63a24b523368a1a5ed05dd648ac351300bd928290cb641d2c5c7f886f04090bec8ade68aab4886407de4116f03657ef5b4ce53a54b90209aa739abf41dc1af062b130a263e300e88fc1924e67ceb15709e1dd0773927a3842967c5df8e2db77094182742c4b06ab945693c8172e1b555711080f5fd54de7d2ec45d35379daecbfa2cc8e060ac11b740ec437a0ca317a271835acb645958f25b076db4d2d05772e0702b0b26cac5836453dada2630cedf507b8d0b6ef03af30b20b6cb626b505b55fda9d1b07001984b0a923645ac94724b714fc4562c0fbe559cb41d429d10196d3ca5a58822d8fae543113f0a99a6ba2a608172a9e9f6df1bf061aa5b29c50ac52629e75be433a670c4dbce751df2567700767f414f2e08172eb8731192e8ec070095495ca1503b72a0ad42c9cb91c38e44bd48c8730a1dae4d869d40da02008d39524eecad427069624e09d5cf06e551a9510feeade400cd21006acc0d900594031c759d09855fb9e43664f64ac4c0ae6e89d088e962c15fb59b950c4f2711023afd1e0fd206b0ab2672c223c33dd554e28c474411c62f4a6b557b918c3be3abbd8f9b9e2dd4834709224f0c97f00b092721bd4e87ed2034bac741a89a22aeda76592cd670beefb52b0cb8bd1631f058055d900a34ff11c6d4b805ee8e1f50197473c7cab13ecf72e897413170759de17b834fa752a4c9a248f001ad7728138fa1f77b4129d6550c961221341ca1ebd2ba59959b8dde342436a69a454bf56be1c92f5bb10784093ff490ee293ea7a9673a88f87408dffbd72d70ca97bc17f4db839a05a783d8a916fc49b7ff8512b14f33d47b5bace085ccc51bd44d4d2dca0bebf1cec0c7e8205e53de74350c4c00d5068388aae9820c4c25cb2ec093699a6cf3dfc7a75d18a31c3324edc285b10050d3b643ba8958f2533204255b10a3ceaa5fc2c22e28783f787bc6306113866737000340903a144d0c10264edc861330444a32fb11238b18c29227ae6a0930824e56c0646aa028771e3ea3e51e075c31865c927935d335fdbe9509d3693db805713285cbb158dca6e417e8f47bdd82b590456aee4af56ae12fca1df6bcb9e94d34a26733cee62227e3f1970305777aca9d8407d4b6938e4c49c97c4d3f773e9237542164a84221adb7fdfd2882fa40ea3baf755e54ecff56beee29f2f7e97914059e7123b1a31fbb8ea191918c9fbf9a960e662b8b318ae7ac7a4281d4861d8580d6fbb2b9eef538b9e63d407682f5546c7221434313db71d9b6f60f07f2e199aa8f0765381958efe22a031fef2c04c81990740a028a24d600e8af37e89281fa5490b3fe3763378702cce9ed66ccd6d38ff1d5011086d18ecabd24a0af80d063a86c8dbb7cd27f6124c2640d016944831100d6815c24300e44ff7909417408d260cd434a14e9a6ff604b74a00279f9a94b04682ab701814701fb3484b008d0fb967788e2975a5334038c87e5d8dd56cc71d48e40e9082b289f01b234df53f48540b8304c44cd51ee6ee2b08c3f7740cee833ac98892d629821ba959c07fde5323082a9aee250973cbba19b0f08148ac0a66cc6de3c320d7cf4665331797c5bc9c00f0a256d7d1e2cb5681aad34c278349f72b3eb70d462759566edf444029cfc403f07fd302b6dfacf871fe9acb68148e926dc02a4da435628f84a369c0990dcf622dee34446965b7d89c9911321dd74fa57eff101d81015913d1d4c4f8eda1068ad305b6e100ed5e64ba734c5921c03a5f809b50a9b8647e7e264733f1f0b1aaec4f6e93f7bbc731c990a168edb31f1ada8d030583246f929ba1569067e8adc6b00cc7edc90a3accbd8731f16d920af8e373132c786c4a9e180bf36504a938ee4c06b973625678d260a3dcf2dc3c60f5bd9add4ffa16256858c118b3de9d8e2a2c348226c71dd03c0427ad794e3e564d6ffceae91a069c7dc825041ee292f50f7eabb0de2c33d5ce06969528bc0622037b729f8c60959474cd932d83d74b09c1b8d132efabbf319f4606ad4810f3bd43e80e7cb919eaf6566518bcc805a2ee2c2d0a0474b402a25e1922f3bd6fa910dc6ca2776e809a278676aad846cf4c90e08ca6da96ab1dd11927382216ceb8a50612e0a58cc28aba17aca514b71e63080047bdf5c05b1f4c08d90a9ab6d58f6cb6298b90d3b85f67163957376d9cba13d9d0e7b5ea16b1a2981dcf54c6596316e128aaf10fe0041d0ca023e98a22013b3b8dda1febffb902fe46e65f8ac52eacb0b051a20d7cb1657308f49ec6b2128f914332e257e8ede2e4f36c4e42f974480fe0434dad9da99403a25da99d1bf679d26c29f6a05a5f963b6e4c2a21672d8b240c47c787642e296dbefe8458a06552047c3da15331cb9ba1c6ad32871b0791254b6cfef44e4272598ce41ea5254197ba926f6d91508cd84612347596a7422a0ff2b61a54fbcc6e0bc22ca561d8a66e1267a48195cc065f8a14fa76c11c96e64c58a3587bce015d70d6ec2911a7c12a2173bcced0d629a065d77055a5fb24e67ce04b671741fa61e95f1f26797f63bb156da0fa3e1169a7d04b2df9c184bda28f52683d4da2323b0a1f3e9e05ca2ab4dcf29323f3567ff7ed5ceb0ab0e250c59b24202b38e808235ac095786dbfefbb62e97a5203e62cb55a404065e0e2a02164aaebd73d7b2e95ba1ab42c97e433031e600c71daefba372bd0d88879d89e82f83b27d2387645539114cf95e681d4e737a6ccb511f0735365e5cdc97bff394cbc978e915526f4730939b049637881018e91d20a1d96e9bb11f778a0a2b7762a7f4d9552f5af1a9508a10a777ad089407f0a6a8d730a1aca5fd9f5c9039875b4b8e7fc2b9ca403b88489db8d56bc0a4484285a7d013feeceae253a0d6998c3499ba4040263b0051ef0b977c3130cfbc243770423e95032b09591c08f290d325d51f3959b813a79b8dbf6cbe8056a54551fee1aa00d46b7e5502699f60872f612207f9bde167b7724516e56e78d927d60f4416cf0d10238a64fa9130343c97dba8483bc956a726e23487b261ca60a3475d17be3f59b01b31ca5912acf670f7acf45a59531db81fff114b32685899322eddd9827d5b4128f96d858e39dc8af1751e6daf473cf8a0d687e5a18f4f886eb3d7788e2ce4e0879e3341e7eccd0a3d5d83537309bf75b71a7a43d7ecece3a344d86db7620870f4cc563162f2061533b536c6952931dbf2de7a3ecee66a501ed50c2af8069c692d3bbf8599a3bbcc9d06c0e3e3c598796cc464445c476c96287c571ef649ae6c83fb02d0fcc93eeddd4fa7adb5ba169ce6380762be2f2b8d9376921d56c563ed701c4191613e15afc4c2e96cba17f572bc8037bf061dc05b9ad27b1330d77c5815c8f081cf97d60d4ad969b279430ffe62a3abb979cb214a55a3724329fb57dea95de5a3ae334cbb57220106de715e596af8667c6daa2da280c5bb35b32d35b676273833215e142c77751b14aa124e063cede84a32ae012563a3ee9743008bb2a4a9fc1750e19b22d83b37809edb437b32b9dd8ef8f30834df3cbb702b8d198bee3b482b60f7fa23b8c497832c66dccb67263831c8ad21b91da3cdeb9660b560a29c35c62c6d37abe8b12877ec48b8c77f266c140d66c535bd5c1ed6a5b7798c26b427d445090462b207ad0a52e0ebc17b5ce2f84ca58334d1743c226a401b33257553122c58c7f37779a7736a412bbf5d6857d0faa2bd95f13f459f979bd6560f6e4f8338d278212cd1e92e5f2ce179471463665a69b82197286299553ee8ed459a2a2172ff0741c1e46c01ffe2be13d17b12670c43f5c7cd6bd15c8e89d36efe8d6983aa65604afb8738d6e45d12000faf187b3cde0ad78af0e81deeda0703d4b2848895bc4dd26797c09b14bcc6f1c800b66a1a55fbd4ac49005bc914f9612667b43e6efb8714cbc47ef9144196c1d50624ec7b1d583573e8dc3a3f840429b8564a4e4e9fff6a612d8fd4ce3b8b91b117707b53f389d48b0d45830e833b58d2357925b0b00b4d42473ce131949abec5af0d2f3a11b51f6dd41025c3e517eaaf7047c12ecd74c7319e3c2e0c67d5a122e607050f2359aa43911ebeb146ad92f00f0999eac56b1362853cdd5920b4c707d7f08ebd2aaa287f7749c3acd24aed11692ebd2bf4702630d41a88f12f0293e43dd2ccee952aed194e054835f3fb1dc7e38af261f105ffbb65a9cfedcbc04f1c9edb79933a297b625e0589fd689ba01dba39c731245b89f9b01d3f433def367bd692ca3aebf6a5732c7485891a7de1f88975286f9383ff130c85f72ac5052e001a20b05de7cb6dbcaab2ee8433b0235dcf5e18609580cde21f63969785542507b6a720eb7d56116bd2a84440bba4f9520b4dab63053a67188332487a9fb0030c902ec507798cb483c380eb9b9e919290b2d14ae90cff513aa90271591957f992f3c4c618d3402c5ba78689706034422ce257e1b8bd31903f3569064786965f8a413512bd1f76feb79589846aca191a09e2df7c34835dd9ef4f1e81c02b747ba5d8c09f914b1d0a3645407007155a13b0838482ea88c23dd1ea49c239105400a3ca0c84a77840a8d792ee14f0f73345f9877c00728a800c79373630d15a17d117035d49209f1177a8848d9bb2166bde31a75639ee81872312dedde395b1dbf5ea88f7850842c0931bc0d668363f7dba8c2f40ad3b19eab23bf6cfe9ff115edada72aea1481ef5ed61e45907237bf8e92949372a04c4e660bbd086eba98ac3613274d378f9568e6673442ea28ee43e3c3c2d029ccd6ff04896ddb1ac1bf0b6913a1a77ba28d4a7a2b864fbc00e5eb2a04313f2abda442b3f2b61c94d4a197a975b9618f3eb4db65e14db42663d7cc892f0c20085449c152a15b7440f4ae3c0504112dfb0fb46f8fb99953d83180762e4af95a7e53a46b839d48369892daef7d442b072adba070ef18b9a2b65f558778c7e5923dd030cee0df36add1688517f8185ed0badbc6b2b7ea09db340a698494ba1519775bc61739e3376af65a57251e833ddfc583c2fae6d28d7a2c9947afa28f4dc5bece456c8ea0c32603846aa7a900f87475c3d4af588a2c3f4597db71495b55d623fe6c9c3cbcac4e10500dde3f9fd50d9bea63ac8ca50f95f0a65efbb494e17c3154c3add2a86fe3e73755dc32cb41de767ddca298598bebc2698dfe3c0844f1164a8b78c5483f7c35e971357ee45bc2894ab337914e28eec454b0f7ebe6c2d5ba9954278aed4a499bd283f0fc3a90a993c15cb64d01ad3b0ff55142e31c06f0ba122f185c6bb469f7c9b7d205d7154a56372a5b0c81e2a16feb611cf473fcacb9427a87672ea34a1a8f351c3298147e45d8027e961d5f248385c4da7bcea504b7b146b53fffeb30e5a4ca264c618b11b2d7395df641845c458a3e8f9411718e46c267e2bcc48904389f3a5ead8401a2ff2574c5d4418c218273348c6c342a9e7ff00390b8cf20d39c51c9c267f422accea9b68df70506f885d41c8480fbf3fce016e3d52a1fac5e1bf3f9313411fcda8461f6b08096eda12a55f6daf45fa518011691004463666a73c9404f53f261d49cc8ae3464f8e592020f602d338ae14d74fd9520f444e50fa25e00941386645c7a65fe8cc5dbaccde24ffce416115b792f6ede38018f62661de1f540c596e9c73b9117b7bb30e77dbad97cb7d0a9fd87f85da3a5815fea321dd24e7877274dee1f1bd70a163156af9987b088e066316151c3eb8360062030a7c54b4eb5419e368b922946e149698da2dc3f4f4d8cb31170cb9b849932a36cf728b5c2333d0e065755d80509de6c196863d861fffc405593931eb9876d043ab931af176c9b21a31cc9855c09d88694f001e91dd8f72df74f4da4e1d730be5606f67d042c0e50c3e42dcab438c0eccd65647da9fb9f8e6330cf7341bb8cee46fef0fe0dc74bc57eabd15bd67e2e18644603da7475500f3270237b1cd8c7adbaf0070bfff0f00e443efe6abc11fe89bc1700d2a89391af57de418a4b00fb42db743816f75fbbf3059ff92bc7db76cf6aad1640100fd4ea75830b830a33725f9bd7497a24ae0c90391b3bef76c4d44cd63febf61a23ab142c62a06601e5faef1fff5cd9fe0052bb0d6a0e5d7b4023322f937d5881b3e57401e1203c698322cc4a33cc15facd3fc3f54db360cfa8b81477d9d2b58788f562819df8e0511c937e2b2c0772bdffc627d47249677e6e9b5d3fec3adb826be353ea0e1f1dcaf9bdde3121641dbebee1906f59e03f621442454be46bb41d98d9bfa68563a6b5b472c806360c97170e5998e2bd5298efe600918fbb34e3304f88819abd233e5113361202c6b0991167ff54e7582d3368d0f4c522cb9606dbfaba86efd9a0493af6c11d6260aa7ae4b639e55f001bae3961b153665131f17ab142be927104b0f8708045841fe167305c47d24fdf89540624cb5748d09be51e96a932d78f9810d075fbcd474ec4e95800f640dab3a21c2102a6e9f5e82d8da2bad983971ae4a49f1f5e8e678156dd804cafd34decdd50a432086f534ed88fb109a9680bf5b8a56184f00a11729b3aa56ba8910aa018346a11bb199fad4372f741aac45c3f6d90c4554953cd174b74fd76beddba222a4a070fc122d745350c22d760c6b81fa4a56941507b16543db68f866a6031333bdb96b1f6d6019228ac9212981df4c298ab717b126b5324df038593291345ccaa7033190c1caabe02b0e34f70af91bae219135fd74a5c295591783d246ac366b85613f5cf7f362167c7341832627ed0c354e7ee0bd4065e48c5a3a9c50598feabd22952860e4348162168d0e97c3f5fa0e4da0d19d13f95be195d32562eb4fef6bcb6ff374ea745f7e3b81a3f1743cb6abb8fcc795bcb47ac04d308c136c677ffb80fc356968f6b764ea910b3962511753be3983f5c15302930d888add42b00bcd35c80eec6f1b8955ba51f53acf9ce0e711800a02405c579ce34bd6a9849c26cfb66c3eb768d0f6a54e0531c39f4b77e9dc1341cad988204e4b5ac981f67d25e73e55eef6ffc83d69a05f65d2c7c226ad370ad9acecab629dda60b01bdaf085465da07d68e1e8635cba5ea9d871824b3cedb40dd50969f69bb86ad6c762aa340ffb9662eb6a10775a55e1c30020d029a6d60f8684c7befb439f8c4a6590d9e20d25132de64ab8c819995ab01442d18cbdcc3284dc8684401816b1158251997e6b021f45386edbdb7ca3454ee339a339322517112b3fb0357d083c16f7d33d86e571524c8e72c9cccb8a586ec9f5471b5ae43121accec89e9b7dca9fc433ae853b16f0b7b39f485eb0b5c465bf960699a30821c16f35ad86352460dd52048388609a795a9c9d3d1fd9c946c874ec48866c93a38d5fc91e8fe0ada95f71cc49bcc235c49cc279b4967e333d3ea9b7d8bebff3b887ed4f856137bdc4f4dd81ff25bc669426e44899c85d170fc7448b8970d74863f10d89286f724cf5dc28d33bd6ea049e133ab06c567759583cd7846542697eb404bd5e9de71d1b0eb5186986a2cd44c34ab1d85c9752327aacea7a62d3b37568dd1b960a5aa895a709f11f3fcf60833339e66920d6cc0188bf0f62db6789e7e2d097ce29e7c094208e13aaf459cbecb9e364010b137c8f71154f560600459154db8f71358ef384ef18b1805132886300109b812028ea007487b841d470b29a9d8c4184ada0f9b474d5aa1f91a03ed0b63d9357555629a9d962e4bdc1ff70358acf3826ad913038f348a7d9286b4edb2565eccf48eee2575fca5c0fcd9832adde3d14a0ef928df6c0f2e5694f706ec8d9eff4ecfd78ed90edddf95b6d9b8add16c95540c37012b9261929e3ce4bd2b4f7ad69e08e60909657781de90dd004230f026d19dd3e646245604086e92380e7f7255f253c79639087f4cc1c2e33a8327c690f83d4e30f0c5f038ef9c73bfc4366a6a90f1e0b52653983c52f6582c74a066ddb6f8f23fee42d541f5b151ba11b6ae3b5cabf144bd99635609d290d77682f71712bc7d810851a7a1c3a1a70c13cff7c9c0b8e75475455316e9d3975e81af45d31f402ae1dca41e5ef7c58ba5429483cc11403e998221186a271572d721eb7640543351354aaa44c790e7739a8ed47fd57e34f0192afe0f7ce688a4b3c4e69ca8d88b6ad66b5d64a603a7f8ff3342d0a4345d249e882f83ebd518cfad362784dd7b0ea4240c0a55654b461cb61ef1a89cfbce01bf5c98860aa66432294ea8421f10920c03606f3df059c7a2b95c1793ccce386c620e0d8c72828933d5602cdd352a8e309c00252e76ee00e8453358a74f488b94ac57675198a8e15788b18d71b68553e09b5d3206e7a7c66debe5b4ee4a4b786833ccfa78c9d5f2d869ca3c1c85a127c24273f7080f2b7f70b116071deb1ca93ccee456e627314b50ae73d37b408841a2f7ecb89989eafb0a70255f86f20ade281e984ef75757f94c3a15232f7d93eee2588192be6e6f04efaad2743c902015dae76390edc91a4338ba8f5a23815ef3a16aae8e01d9055848aa3a95a68945b86cdaee8b5629c346e37c7eb60b0241422fc080deb99d7a2a8ceb8ec9f637d843f6193b8459939e0be853825e68e60147103eedfa50fb2e4c65c8c260aef282c90cf83954727b9a74144079c00d93e07b0e495b78eb686ffefee68eb8c45eb1b9030c464482c0df93d4d7e30ac474fba9c31b1f14302777af59a3163c57377602b33f94ba326b5bcb9f38f42f1eaf582f9c45058ff1b31bbf18965e9061ee504352d289ecd63398d861a4f484acad5291617718f2954e6ed9af85884e997315a094be03fa7861410c70b2364faac81b8fc72f42f016e6ff4ce8d11cd7cfdb9ad5e1d42b47f2aee5d979b70159f69daec4385452f92c3245e4db9947beed4c655744ea796dd60405f7cf1df9e6e17d901e5ae289ef74bb54ab054aeec54e45c9d7418c76a40911e1851fa025289c4f099a3d9ef71a72356d081fd94d8bf21f6f8b40cd3696af790d1ed537f02da9a8401a792a168cd7f508f4c2e1a50d55290dd97deb7e32be895bfbdba998a90e5baec8b9892f80dc84a7db6a84e3ee8658315a783c9a2e97837a30b290950ebb7b289f3c53a6234f7516d0ad7e244e6608e7097871653c21a085378888d479fd39002463061574352dcc8d550b42adbb1546d813405ef9df1a2877ca6ada4d613afbedb72e6d755eb5b870bbe67c0eb92bcddc05b735ff061a3e3f3d239ddb5d17878b7c9a9ea8a618172042eabbb08034f4c1d6b94326c198f401232d05f4f5e8c5326534c829b56c02cde3c3aa5f4aed10c1c519195b3a6a98a236d18b01b690baa8849c48f9b8c4fae9c2178415e39a1b5e3f83f25434f90c791f57a1bb4a6477fe28014e8e010457b192816d2a26196c4a72b161615e99cc22acf7cd8829a7bec1121975f06c569c6a1200cab156c3fab6e991aeedf4f962fd5fe2e51c75850b655693179c8c6c7d8393eded6876e397bcf9dfd020b7ba423acaa906e7eaeaa07571644b131faf3b3d9fe6fbf20993af02ae786e720305f2f84e6f819be91ab38ea5ddf1d5e14f689d2bb81848a862d955b1c17c2f4b4658d9899f079ec12191d67fb3fb63f4c5880e99f9969ad8fff3853802d4b432f4a48acd36fe43949ef78510c4c09f1b5ca8dfd35ff0561d0f41fba433f41d4d6948fd718d724424e9553336215f604c10d113a443bde645a9292ad10bb4f251f2ce9d791f87a324cba1686835299fb5b0593527d2b40725b98f8ff418fcb084d24de94db4f2d53f062e348733f492ee9e40447a0036e24fa6c38fca7b5124e5a5052259e92409527e71e4e0ffb895ee8a6b95ccf328b0c885f2ddf0f97ebbe9da528f41bc75fe904622b76c2ca90121c18cf5bd18cc66a97d0e7a9f29f2c2b572afea0c1409153e38d27aaf7766c2c2daa4de4a735e49351c6eac21c913ba3baf5053b1dc8ad2679d7d58ce6ffc5cbded787d10e4507a8cd38e7a95f9c16bae26c68edaecc1870b83b77f4c98bae4336f1513ab4733dd28c053fed640dd8d8fce3a4e58552456f3129357dc8fcd5714f2e280b301a4030f1e5860f4ee2cc9778267f25d8ff8bf4d00e3c6710548e8fc2408c537a6826f5a59a1071b73b7a686c441afa858dc54c0b851e5a3efeb8d046d73c63a67564f53d3f8c9d140c79173046fe6b924907642706164ce20cef5c3e78b002852fd33b681b8cded5054031651916d6f884d669854f8f2d279b1219c237c8d4926e85b1324bdde962e6725753da57b96307f433028d9d297edba3c8c1a79ca343b1ccb8e99902746ba78b437374c6a2765ec5519ea24ba373923b59c09b4bd574ef8a4b1ffa3e3d985725ae79b5ce7da099b54a09cd7e6c90e7a106e66e1a42750cb84cc68f41754b6460db6ee3703165bb6c0c839b54b64eaf8c19db5b21d9c1268c8ab28e09e9614b3b0af73613e29bb4849ad221ca3a244cc76c3452dfeb3efc812f49c8ea17a516481528ac5ab2cf0294cbea407159be401c1f7acc0241fb443707d716333dde56f1e62c434b3916b62c88c6f7b31dcedc5c925f26331eb4d1e7373179faaaba4cf9d8a3da5dc9078a82bc18e34970aa887ee3e4cc01882f69867942e5c67b8025b4f1b65d5fc1c82cdc552c0c4da173242252742c8e4185f15b8beee2d4c484724fcd70c8a261dc84704962d66d5e3c2d28c2c284c156eb865dce48c209bd6b863fcc43359fe4a465d55498250a3175ffae567e690bc5a8107514e2c5d780f8f962f3acd3968c0256fd2603d3fc44b28fedd8e5ccafc8cb02e35915828dd3801d63860530b7d2ec4baec44a38f7235c77f3a061f26e356b0378c066ea1a313f052bb09a36b11183fba1a2d1a97b278c0317b01cbb170f5c0f76c041709731fb94d239d2e0132909aa11e10b71a029df398ab85231ab9226421f4970e906ae5cbcd186ea2693e2f03713a4a3d1a6f8dbe4f23ebbbab8af03cfdb60b3444a31f7e201360dc351cd8bdc7cbaa7e226c0888ee6ae716f2a4ef7147507e101adbc6cabe28754ac702b11c9bc64cb80d00295af731686da20eb222c06c32f7b85db74985bc0fb441a9fd73b9d5e513ea70764e05995a72c49992b0038abedfc3dd08b4c8151b8b8318e1e0c28004685aa0d50557c03bd15769fd14983cc016ac9c27ea2523c6c388be5e99152b06d7e59df9bfdee8b92b83fc14ded25a6b8e7d83254773849831c3b7fe283f35966ccf6f9ce55e19ef89b960106a7e6c75c28952626b1fcb87a4fb01a5cd6d139967089bcb7a297c7b9ee2952588b9f734b28b4a185244913c59dfa82c7e7ee7f30f955fda8e661819a25686ce829fc2885db5730eef27a127a1085d534a1dce4e415940c42840ede0bebca366c8ebff4303b20c094daee45fc247e3db565d6f7120e87c5e25ec0fbe3c97dfad2097f1457ecea6331c9aa2ea883b476d4bd809332948ed9bc22b35a9aadd73e5a1661d090a22b8525a951e813ab4604e6f4cf2ecc534bd500cffe27d064c565309b05e02e7cefc5cc0ced7ed968c43f47c0095c9a1bedb7ac0352ff3878c993f8343fa011533ad2deafd5e33b1a3070b05f05ba7ec4d4e5fe1d0ff6aca173708da0c4e254cec1d38b7622946aa8ad2bfb732042d6b11e285a9ef044b56616a10f1597aef3123edbf60405e29eb7c9ebc227c8406b9fb084c70fc881613c7c261646d40ed847ad52433c7e632fb67c1cab67aa48620355168301bcf6dd7c5858e0440bbd5427513360cbc62f10161b4468c7ec7a10ab4d44c396e784019ff305a025cab167701d447fd71c7a94e908073dbfae86a39ee35df73dbe6ee7581cde64e939a2a3fb3f6064f41ab6ed6ccb77a23abee4f1727cccaaf885d27dc6c3c2a0e7cfda4b915986b4366aa97bfa879fe1311944c85d3047afeaf5662b390dea8e6149167dac81a0f106def27ed4682e9b6150895b4451103bc0b06aa32fee61a76715bd9818a61835dd910033d62915e3e7ad424da79c9d3215416ccc116227f975727578f2e28aeb55a60621d80d981611f2527a8cb0d9c0010380ae348b1f77e6d3b11e3e5cf9311be4edef7ea787caefae4e6d2a63938aa16a5e2deae608646e0c85e832af45e1940deb9070fcec6b95fa8e1f0b1d76e4519b927e178f7164ff91ac2c98e0904dcad3be303626f6a2f08bd58d32e624b0448aa921280d8ec2db0bbe05799c48545b2ccf34f5c2d8257be3e28d446363bfb1155d6c7f52b896e1a74c32545ba1edbc055659c8d7d772bd0dd66ec6613d34c0b38a44f954ff6a929d58d2bcdfbc878ea72355d824e0b0f1923b1ed2a2054095022b572e3972942357ee73e79823a7dc73e79c630e6ee69deec8915b6ee40cf9b07e4c70e7deda13b1828b12faa97698c471bf2e12c1bce388bdf6377086337ae46cd09c48ff42851723f852a0c857d518b56a67d2e212a5e7d0a658af934b6a4ad077974eee3469fd35223b2703743ab993e4813f019d410ebc93b8b11a524af0957d3654f311c0b83c40c7d5a487a5281364919936fc2090a6ef19249048f1323efe223dc02ac074ef5f1183cef6c712f4d129492877a5ab4751c1d2a88075c40bec85cfec691dffde9eaf820d8c2f5e7ea5a5b5384447e348f005b485fdc49b0d890607b7ebf4326c0e0f6bf3ebea610558e3fc314eb62d247b5bbd81d24b51c1958e2bc63168643298149e78f005d92a17a8e517e09af22e1946ecc500913a4b5b1f896ee8c91221dd8edff76ed9c36bf06e007e8ea32b7f9880b6a0cbb8010568e662465058bda374f7a3b4132081df35d2d0ab236c5c42a18e8bc41369529d380ce6d4ca8afd7c5dcdcb57bed59564b53064b5a953dd77a441558df2a3f2557a0fff538d5168ecc90d359901b1e9c416013e2ce2a6c0dff71bd16b1903030e29b5253b30c80508da290185f7f4a1e46002ce30da4aaf1fca9d66e9bb0752df0d6316b6057c19f90c232b282b34a6f88dfb2fc1c6b83066e95696d593b42c29764588706bfa9de36c5e34f8a38c3d5d365a37f5a72b0ea3ad3a99fcf24683e259e2c3aefcbd59b0dc5f5d28131198da5239b1c605d8b10b64b57492630690ab0fbf82c552c258a6b0411e57cfae3fd5653455d1abee15b126894b3a801792ed570fbf23bbb19142b9c7de367b885723e6120d985a0e09580f9d761bae61f9fa3a0c706b2ee19e4534c3ded16162ac793baff020c7412a9517fcd4adc95b2863e530d9c4b6f081a22df46b49844cee6bf1c14c7d8c6093962d45046b6e759aadb19ba2c26620ca31c03378149f13a16dd7039506ee20116854793885887b2a3de8695de6f6eb3fd09e05ce2b6cef27f519700fdf249a8f061edf035c52947f33e40c637581e343cf9c09773b6b50f78575411773d6192b9fafbba342fae2bd75e6365803a8ff5b1d2e1807adf56b0a8f75b5fba2ae8e7c5fc44da2be4eeba2da6bdf2bd0621ac94f1dfe0b88618c08d2a341c3fe37910b22273731346a6c441bf7e530c26c2ce671e761c22d61d7e9dd0bb08e99039a6b825997d716747d13a5322158841d7ba92628f1997f6f0e814560bf450142c37982eb41070ed3f5d85f5c49617e992558b2907ee84b6ce44c336dc92a37d4694051f9899e152bbc774aa401b7d19e1986f2bb4f11040e72acbf6b380e0ef9d6b6d2a6d13103cb699eac51f5f1d5e3f809b4fa2f76513bcf3bc67fcf63dd076ff36667353a22b8375dcee5e18444339ef372d3a3289003105256eb2f32de9700a14510ef8da904e510310acad8490e24dd07fb139768db7d0191726b1f98ff8997f396d3d6df34f821e4bf0c18525b529a8f4414fed31740f81ae086e3800d5f1ea0e73f1b0b11839f6c5fda54e5e1803d106b2a28c638e503e338f937a9915b92a3ff8e6457a21fc1ba3d401eebbbd05b7e673b644fae69d1d38b96fe9f16e47048402cca33b1608ca8f875a88362d847b066def004b848c0a94b7956a00e83bad40ef9af355009083a714d8dcf435d4c5358a65bdcd880302b4ea8022f892c607b8b586de79c2ee589a02770193963c475a431c06e18ceb1639467c9c948ce1e699307b72c7a5a4106877652b3f85fdf9e3b4c0ef96b7329e54137a3f27a2949c12db9a79c64060bdfc1995bd2f7eb735e7b0638fd501e4e340527773f4728819b545bdaa01cbcdeff94684e3d6f3d0057cae33aa83fa9c291fc2ef6f2777b78f80a6f75230a2e9ca82ff981f288c4f48718def9b3d0a4f5cca0100b97c8845861929e6d79ee0242bafdbd343198a93044f6920708b92a953fcc6cf86461378637dcf7865aac198f2d71127b791b7094750ce0d0653cf336685635a50a4e6df3afb06c01f9b409fba1220ffaf675164f3c65c158a05e8e178f6a4f038e9a9bccf4698874c95a435118733b0d95fdb6c376a4527734208e199c15aee8dda2629750a0d1b806520b32a698c99e5f9f0b55ddc26ecf97aedc2c8461d8a2911ebf82dc44223a147c0075739398e6c2f69cd57c2e2c8512e7fc4f1e1987894483388e630a947bb8aeeaaa3a9ba687cd4349ac86238c97b58a05212481d1be5931cc5b55b1aa54efb7429e8483a3b18152ba60c937971c607f180be110d5ed7bb4786fd83648083e3d69708ddd52bee389e27e80686347e3e445ccf884d87d1ee5b0fee4afd2614320061cb748aea9f7bce0eaee2e55581dd1843f44ef260e3f1afe2b5f59e826b7cbcea976559218ad1feec3ae260059c68a988078cb917d9a040971e1d22573265b52bbcb69a2076bba2ff793316645e817f29d9729a9ddac72e59a59ca006b2e633a09908b157b0ef906962d56a8d01bc7108d09ae13c8ae64da03a42c19418ac187104fe3e0f135bf14b3f2ad91f2f7a5f53a377a6b63798922716c270ac428b33cdc95a7b1f19f53a536a45c9d65986058aa55f8fbf717e7c0d7d8b19e3b2dc317455621ce7d7774f256a671a3d27ee8da5d20e307e764695c8817c6728fee0f1948d6fa0b2c4e9f916e8a544fa1fe9f47bfbd8b05f742fa2d3a30fdd682a318950c51770c32a5c727d8a7079cbe0421781f109c1171b698787f0c054a7e60990d554f468841e277b1cc6d7910846105976d88b1d75f0506a733a2a86f5f8111f38cf21a04d19a41e28e7bb2640e61cdde210c41ce2fb698cb16116747c31d0fc5a359f77bc526dc0a51a0cddaa3ffacd38d506e955484e844ecc3ffe0f43c2e1613ef2d0cdf6e7d3b48754561ee855ae3818435575702d3509735d950cb2889063dfed12b35c025c1e4360f93d019a3e78fcc2e58614611fd8de2f138cb446a3cf7e8bc3d7663493f01a3677cef8e75c8596d330fa0ad38babc0d8564c21cf9c0edf1844eb3f181070bd7d3a3e7e7fb09a50359f0e245e493f57bf2bbc925cb3caf7fddd76acc5e52594194f31edb4bc2e7e07ba050308fe9282d5a114a5f1b9d6191e652883da23fefe8600924f98f389328c548d893f45c8dabc2659c473bbc128ca3a97cdb0271556c0c1ade8f92bd0c4411ac76e2296b5842112e46112df9b9737d1bc8427829f1d89958f32f1efd5f478708091638c26f99a5526b338e6750d08a1997688ca82f17202f4875f9a78ea729cf81a7d2dc9697e9c4448a503dd7783c68121e17a453bf8c802fd29d49af0d3f6d175af892a253b9477363378f18acc498f3e3b19c348e9944de61f1ff8a2f9df4c0881c636963f01ea66e9e8324acde33c9e6bba8daae4b7d8f65cc3c84703bba1e40c00d2005ced5653f11c1c4403b8d77ce2d1185010a88bd461ce3be815fa0458891b79773d915ce250c90ab254f0b84aada52ee70bcbe9828ed202bb499a1c06968e8a2ce5659b1a375f87f2d038431b09a8168aa28900125a0811e115317101723f796e801a5080f4460e54fa53faf1734ac78592f1d3d20b72c52d4e0372b0587396ec9e920d59d7a666a40144b189f4f018d7605aebf6232856aeb88e8ac593b0ca2cab38f325c0391cd14e0f4762050642779eaa0100bb2a88a72e6f6f9e89f805095b06f5951297670b1af0a52dd6abdf0aa70664d883f3fef35bda1a3977b353eaf10583fc767f041c952e42b1475d7e852f91e5ffdeda1467dfe848d598a7bd377c147cf517e3f4dfb4703847c4028d89068db95ba620c024a55362c8dcd2d38672e9bbd8d27b78c9b9cfed8baaba35255f0227c732960c0802be6356e8003fcc5c552ffc71009e71be2a441100f75cb5b14f6933b5c759f631423ce871a9997697c29f25786f00351b525e7518a29e1968d006287bce3c87f86e4f53b313db48201c701bb585120277ec6308b1853c601e07cad4941bc438c35bc284a6f8a3981949cf0bcfe2667fe52bbd3144eff6d2f42336c872cc92eef36bc91ac18891105eb3a12ed2ea735d8907998669a72999a957308e04ae7c6d7a36386398687a623096606826105064106aba628d6725c19c0d87a09c2b0d85ffee61832ac5b3e8723baf46a412c818b2b7c338bd1380a684c89ee66010af47d1141ba51c11f0300d1374652bde91f06898ad8b0535f586cf29061bcebea49d50588b51cb0b1c88de8e78338410b7827c4200365341dea7890d4e9a13474b178551fe2c48b1413832c0f6850a94f4ba260e5e06075f7a3a815c51df7fb9e526c054d1b96e184cce92d4bb68e588b6ec8fb6d9703b66b2efd36a9e1bc66abecf13af6941c37c0f578dd2d42785bee86b0295661cbd25456765ae48f78a44d5f5145092da7f084f093596f389711882cf6f57d2e492c8c88228b69c3e1ccf016a69ced5b9efa61024af97a1adef68553d2b0113d1849ab04f421708792d1f162f14dd4970518f79405df1a4e51d7b2c7873c3800dc65fb752c2211203b3465755f4629a6a3c4866bbaefd673936ff49069000b4054d8f524a9fe17cefc17f4a779762885da7a3e30a7dec2f2ce4cfd5593f3dda9f2e92191a1874d08d99e1d4d8b70e68360d7f823d494eac4c6f0d245990960d1e302e182a53ab9c6f7be5bd41cce58113a55ff02588f7a51a4f1c6eb9bd9ad7e8a5256a4f15ff0162af4d0a5961b3e1a93478327cd11eb0f15d548de1d6b084da4342fced9c60af77c51ea85af07f55401385559149e99555ede2f321c74ace7d02205fd449d20230a13e93f8e57e1c22243a4285f12ccf964070000b862b42027138b0d6fcec83258d8fe7fd42043b44fee7ba04a7910b5b27fd686c52966474024e42d725f250490620a49bc49e4103e19d558fbcdcc630700bc57edb0472a69ed21f225e4420ce73dd29309b61efd515056354ae6539f0f5e9062c5a7cead44f5c7ae556820eb972048b3463b381973c9609918e39af2e5796ca7ed9e7cd6846c6d558e05eb02093ae48e3d01015238f63088655d6e82e93b49af27eb1c6979c3b81470b32caa3066c628e9476f508c77f2c81a5df0fa8699a6cd3205b0d4b376f02083c10ca02c07632dbdaf72ef1e6ce7b3cf421321b4319332fdecca32899993d5ad4f853471d32565cee8e4a0e192a6c6e8fd0f064a0539d0a3d382b20594799c2ff8120067964ccefab9d96f2fb16716e3d017c8fe9915a3440987b73a6bd07a916f0437c92afa5b7e8eeec35cff3075842bd094b129dc32605da838e89b27bde3829794ebbb188292a1915a1f13bdf629f64181444c10720b87dedcd328c3dd2793ec188a0692bb4d116e791f9e75c1a104a6e0a432b37a5a6b562fd378281c86bc8b30aa13c446a262e22d6fe1ef4392f69d4741a48448b5e92ca9653be408c341698b46a63811912ee8ccbfb22c7fa8a6ae452e565f133d02844809de47b8a696ac8d338954639c3ed3f2ccf99116b96048e66c9c9406b2648209676ac0c64a3d083da645b7c240cf39d2c4bb40af39f91d7a72b6da58b98ebe14faaae842d2ea9a9cd23f154a41221b0e6ede667f1976f5ec4adff870352cf8eb056f87dcd0a0b7e2b10942c3644a934b5da8699d342052627868f273dd634c4e002fd268e9a7cc432c446280135310d1a0822c709bde391254e75ce6c380951beee6273f448692c20b5222389a3867e8e4bd9ba44a654054133099ec036d08959babe91fa74aea85569caf9a454053a664ce25bc37b1339c041e00034f905211744e4cd56e3e5fa8ff44fe96b891081c5b67d2d4aaed4a165d4f58bf867f2094b69bf7dbd508a49041aae9f77e0dd556d80b99c78e4a8e14d673733b1385dba6dad4a4ee2a311cbef06f4961530661f78f31f129fb1cb5c0a72f33cbcb1b4c97dc1dbfb6b459a59ca30c43f0b3a4d5bd5f78c228a4f813ca23e6184c99465c47fe4e9c373d997125d21e0317013090105d69795b07b64c8dff6265f3010daccff529e6fc3805049882296ce66d73cdcdac6b584f22622bc752cc50317927d2d98d2a66c62bd2975d2fc402a2632e63c705090c917758d52cd2bae47f402c6df85d42b4b004181f2f067f228dc92b573454ea1ab519366bf93ffaee56b9a6b3d6028d4ef5d7209ca709f232c09d666509ee3368617bfdfbf5eb6a92c58e9fe4705d8992b2acc4b572b9cc147eb8bb422521c90173874c6d7f86ee530b039dc375decb8a19a3e3233d985cc10ac5431cc60c88fd535176899409d7e11f01ec1832e212f0f9f6dfd8166112d4d07e43c32e6aab14d82987bf089eef3c0f435c5a7d62084d8d89d8365218f129546c04592af4d206ca76d0a1c6122894eab8a048e9a89baab0affa8c7d15905494b55872a6dcec42652a680fa85985f53c8f8d58ae3fdcb56f05d0cbc6651236c7f00bad0b66382b57965574ba327902cf6c15ccecad2c7c9064b570cf26b77fb66e0e80e7d42a30b6b00c83f7216804866c6536883ac4dbf43cc2a1376f1cd62f0b0ecec3e96da3c4cf4500086445b6b29e4edcae1c2d5eee8f39f46c6502963dcf617477406a651c2ef7efade3677ee5178cbc95fdc8120b0841ab228a077249fb9a0f0c59c45bf365b242c8fdba564351e25ffb52c0804b004aece92ecd7fd4bdfab3645d8666df5deac7724b905ee3b9ae6ad17e77e378f9db54737eb70430e4de1db247668930377f0c61228e8b6ebbf2c876b99948fb25a394e4c24e1786c63fca54062bb717a03a31add7c0dc84e102894614078462316a4f946ac241cd755b13841772137e2345b3213e4fc9e717f238509c8ab319fb54034328a21d6536b444d2302ee072848b95401699bbe64f614b862a1c9212b5cd3c07876032476336c2ce0bc71cc22baa0a142c59fd0c190a9aaa7c230b3c10c5a9e79233849ebadba80075e07181294f037188f42239e2a1454bca0e3a29bb89138a03b49505ed2bc9df88c87787c12f6031498911cf0891ce884b430de953d7bd8b96702f7311f37067338e4714a32c2632904b58ff65378836d2e3517b2003a27957cd571f1d9ab3a4870f9954bf8690380b12ee0039a2f926c793f3269b7664c97f5a0e6f3e33480203af0ca92580e7ad987b60a767e419c2cfc1646048407744ff64499763a36be4889f025740b103eadeee56bb5a49902805172f44ae143414d25d0915ce55f41e1cc9fcc7dbd81a116d7ff4344e7902440a04fa0173995b3054b24a070d97901918a7b0b5ff4a36add26cf4dc50c3f676d34439ca428c6f92796e6e31446352d3c17c7448c5a85de725563008c230e81c470f46ea18d58347e8a388e6d15ce37b65ac0cf1e83cfa9290bdf7de724b296592297c09ae096e0948bc6412c30b2d36d8135f30418170b16cc9a19381083502127046a79f1eb61ea30e091db41e0e06386435206d453d96861ead8b293dae1a7abaa0d2c3ab8b2c7c70d910d4c5161e5c312c79a1c30e32347971821d5c4884bc1022816b06212f64e0e392c147c5852a2606aa4e02152b20a2e2092ca8c001153c48a9906c60c4469d7ffa7d2ea2a2868fde91076d0c6d0c6d0ced47fbd1a098b3f3417d7a7b43e84eed6fc583bf7d87bf3f23f4eb1752f7801ff99cfef6d4eb2df57c30103e53f10e7fc7b3d36966d229c237acdbc0083066308431314a01dffca04ed805fcc4d3c0a7b7e13cc2db09c65bef4225045f1f38079e5bdafa6cea56fcaa24c1e01dacc46a792bc65bd78cee456976c69bf96464dc25e3ad80549771998f87a32cb9eab7923ee31209f35640647856f29340bbaa633ef3c923c9b22ef3f1441a6638e208170f0c97069c1752b89c647ec4b54d2eba7898063734b102170f0ca723979393c350c33882cb4976e3099790bcf931f4447232491fd4928b738f87ae62236b1deba17ffa45930dc5c536ee437f86e286add47de81ebb66a7f36305e3d5b14f1a4996f5ce874b87e88fb4d4888802bda54154e8adcf1904bec1fc7bebd34ab7ae5b17b73eaf300e75950f95f4f596e667176fb16f22c57ca1457dea0b511fca264f2af10d7905b3ac5ba62cde6a01f34922c9b2ddf70f379c48561245e11b1b49c438515545f785578ab751bc75a54c8cfb03e58789f9e44e85ea336ca589c474613c6c21d994427df30b559806c58d5d04501ebeb80d6f0536689dbf07ea63416a35b83df4d65b086ca106ad773f79eb272617e5f2eddcaf83bcedb7c939e3b4b3dbb9f4b60a66659dc43e1e274030af5e3f1eec892f9878598f2e25e8e562d70c3209497039b1284ffbd8c5a39fb74b0d5a9faf06ada33ed9d4a0b58e25b1f92159d6512f5e289b8afc90d6adcb175a946516f56ce96d33bde59c7134af7924cdb21eda905b9a65c7601cd6087cc37a088013934b3ff4f9a19f98dcf8ad7913896fc826c9b2ae525d6bede973a141eb451a8c6058b72ea44e9372dbb9ad739fdcd2a095dd4e675d2bbaa16c7aeb13495a7bef447aebad6423c0573eb30db6fd86a45ea7a601832dc618fd86630ad5e7a4990d26931b9dede7af79e669be4908c4afcf9d038ebc538d8dd09f4d36e7bb644e07fb41ef084e8e987b8320e6353d7d7afbfd090466f137004b12b3f8b1ea326d23a3d84ca1d2648a04e2623438ba2f2d003aa20b26485880a0810450b0d8e0032c2f2e9ab8e881b275cbee8eb65b76b77cbe5127a573b6eceeaa83e876774b29e527a59452deefeee62159dc3da7f76c654b296decbea9d4e32725fbcffbdddddddd9beac9c5be8b92524e8f7c83a5942d41d97c34278da00e2d19106a4d819d76da89d569b14a95ecb493469fd32ad9692756e917d362952a558ad95929f605ad95624ad356aa64a79d5f7c31ad929d7662957e312d56a9d2849901b3dd72d6cc358fb3229ff5b89f4d7985a4556236ce6931a7b26212b39b56e92c82553ae5151cadd56612b39b4667ddb42c93d259afb0189df20a4c6276d33aaee3b24ec77a26b36c5a168bc92bac8e752b334d6276d32a9d9b96c562954e7985ed172dccf2c86318666ba599dba8a20caf2d7b808f0d84b7c7fd21f53594d1185b34c608f4c7cf31cc2dad2f4dd3366e02bd8a2c09d1aa6bdd4ebff58deb4ef207528703b061c3e21d7109c838d65f3f2b34f95131a02515a83ddad7cf17462adf1d5f3f5c73be79a7d3a9897b8e0e1dde31959adb30f6ec97f28ef88a38ae65226a104a83b1a8591d774418308e76fb4d71826ff4c7a10c8b1b375a3b2a619d5232efb436ec1cdd46bfd14647950f99c828c8921629d8628c3dcf5b96b0784c8ae59e2ae0e9120ab210026d1900012f9db350826ffa627156b99128fe45d9a32c7a583fa7b8d1bd2646f12127841d08f0530832f879e5ebf57afdccee3e52830d6c6852c30b867082c8d5d3c2bebbbbb924d74619533f6b6cc41a3ecc71c2cfa2293498d343bec258ba0f598b8d0f790b8d19c6243fe7929f45247d1893f8199f1c4d2a3ffda7dbab72f08a2a7eba8e1c1e3fb010c24f5f21c80f3f5d4811a09feec2154e5e4040a2c70a1f2cb0f8e1c11110108c8296fcf428d42d9672458c9f4188f244634471e79c5789876fef396710c290d245b737005660f916b2451a86613fd88204580f98b21f8c81434502b25620c130cca7edc19064517973ad3001d2911545f050c58f154cf44085911551f8500592153fd0818a2615175bf47432d0a1075034961e50f1a1c3a0075828d103303ef42a9066983520e9f06003b6d0e2890d9b2aa6d04208cb76ea3ce438f40c73cda3b66dd8e6393d396e7693f39c3e751e4beee339e2f2094ad69cb3d21e6e90152a30b523b1e596ca6d98cd6a1016b835bdd65a6b9d1608c279ad2b6855dbaa56533a240fc9aa1d1037aed0adea15e64548905a6b759817c6991e7b26b1714de8e2f3d5b7db2dea533639f9d63b54ef2179237dce23be3693af5d82af4456b22ae79dbb6455efbc56ae3bfd5c945fef7ca08163e016f57a7dd60a74fa91236f8a84aaebb5faad8ef2aa771492aceac5a1223fe44d5ca2c264b52fb4d967bf2569edbd3f4e9ed35be7c3cdc2383f55c6a5ea724a16eae339e28a2fc9aa3f92559d7a3c0d56efbc082459b50be28671e9abb7472cddaa610d2ddd0a794b5ce2e1e9d2a757b7351887ba8b4fa6835cc0e6ccbdb59cd35b96f9fc6631599574cf1b36ae3901ddee5612a82e5d05eaabe8ad24207d93bead5468dfbc3d6e95427c16562c7c3fffca25bd958bf356ae4d5a2c277a3f2c66310c6326166cddb79200e6989fbe179c00e9be950bf31756f15bfd38f904d875f2ce4fdf0b3c4e54e8be17303ff9e95b45cffc88eb052027ef3c7af7f138891f90ceb38f67f3ce79383ff91117bbd8659d5d5bec745a60c147fce9136057e62de854ff91454739bbacb78a8e39bb2890153057e1e4d8f78213209877fec22abae6d64fae42e7a8ef05ec5b494073ebabf8a9a0b95da99039e69963de39955be6d948164b9695ecea3c766598952c2924b4b3a7135b04a58cddf1ca738705d1932db2440bc410e470da31767781c94708a1d0dddddddddddddd16eb36e211bf135c0798036cb9902c82a6a419191db115cda85b47dd0a35246d8a4605886f213e837c831e71438d4823d28aa4a6a46427e5aa37e76767e053a3026dac80811c4d4536b2d2f9eae18948723a296ec84c458cd0a8ac55a952d3e706534ee92ce53c41f64c010171bd81748b63b0bd9d59f22687593da9e5c9608745389e8f730bf0c12837b4a04dc8481e7a9359d4338f8653ccc5ae87ea432329e4b0518409e49962c82903396851850e33f8f6ab72d0a6d311f9c70c316270832a682084510d29d09205e5c36d61fefcb9212b492993a618c0873670b0a200497c927091430c6c985eaf970d1a1360b400063f2cb15403972c420c2295c648ab0f53df3435df36541fe6e821f2c10884281a011837f8dc80a5080728be7574778f2124a3bbbb2d4331c64bc7ba5bf5ddddddadc3862856f28fae2243119c646185122b3881ab51f0ddad447f3788e57ab8212b09b941bad51e5df1722f532ec8f1d26d910d4f5ec55c184b48493d7a90549c5fc84bb2842a6a90b4db167c77110d527c17d5a082977ea518482f635e4a292513171fd2d444b9e26d910c44df4533087dbb172131c177dba8c3e86a2f2a49b0279032a51dea5585f753aa219b250975c9a0072b7a1d4188e953830842baa210d12735740c885c31306a167f686f134a88988a62c8410f335071d1096da9a265de9094040749423491e48207b7505939bad263e5db6792f933977cfb11acd03c4bd9620424bc9ea56081799672042c5fd43454d424544465cb1445efcf453b60e233a508f491c6c82939e5945386a93934e79c5f123f9f0435d83f3434568056aba319339464c81852a988666698646484626296522924189824a39797211717a57b9b50a8a3d309a8eb84386e69db82348d28cb8cac65c2f23b55907ea70a9567fee18616899188888a8ca6141124370ea554c90f2ba2c18ed895aa446da84a15a9a752a9538e72a8460d56a25ab46db1bee416231c118e6ef9c68cba15b1a16e51a66fc7863028dda274099b821d3d96a5061bc3f2ed25380dafe1cd50c33dc61a5ec36bad51c3a327bf1ab1060daf4183c6952fe1c3901a6c1d1a1f6645c90d2d145528bd253a2a0a3bc8e8a85ba145a2a2e5db2d52b7421a64a55bdd0ab1a1bf1277f0b76356baf5c3382c34c44f851887b125d8d0946fc7a06045f4cd7461455812b548cb37c55287bea17cfb8e1525dd6a229e9fc6dbb1a2c4ca8f951f2b4bbad54c9e7fe5ed58596205c80ad0946e35d0f3cff07692a61c1d59e9569fe0f965783b495694949e74ab87787e95b793f46468084ab75a88e79ff17692a010112561e9562f797e196f27094b125312535212dd6a133c7f8cb793944492509250d2956e7510cf9ff27692ae242d252d2551e95697e0f961bc9d242a494849484945ddea9fe77ff176928a928c928c9e74ab81787e176fa7ca93a1212bddea1f9eff7a3b55ac282969e956fbf0fc286fa78a96a6a629dd6a25cf7ff276aa4c393a5ad2adeee1f93b6fa7ca1220a024bad53c3c3fe7ed54494248e84ab77a87af726569a9886eb5cff36bde4e95228282a074ab49f0fc99b753050a115151b75a87e7b7de4e952223232cddea1c9e1ff376aa606162daa942a55b9de4ab5069907fa70a12e3743b5590f8067f4e1721c1f4215db24cb3e93b88524a29ad186318f530afdd4bfaa7a720ddf985d1e8e7e270c3d9337b64101292781ad42d96828422e8d0abe86f3c17bd943ca54d5d0a91e7a38d13e001f4f287b60d378c3fdd43bf0ef21e7953c3dbf9bbf1af16d1b349ded4f8ea8f643512245fcfa5413fa7115c6c08e3e9c20d6243742a49d2e3d48b1bce9ed9236f6eb37ebac53d9ed168062021514ccc3e817863f947dcd135a8b6f8761e8ca3fab0f8768e5ce5914817cc561c2e383b1d2ae58e19c303d808c574c4349a9347b7ba0692be612b40a87c4b26275bac4c4c0ec1dc5af67ec06c10f330629f571f7293d63a7fab9de8d37ea1740fc4233f9d53350d5e3b5b1097b8ec714ea6926e61f61107f3fa16298d9c9c4c29a54e25ddb266323b1c78c6198d603955bc327afc6e836dfdde066ff3bc74cb5dcbdd4fd2f0329bd6441cd19be6e36456bddf6ee5c7ad97ef266237bde5e46a1867737621455c9037dc45856c64820dcdaf87f23852e0e41ce7d1c59d38afc1ba2217c0d51d90e93a7d35cc807271de2ec62af7311720ab35ca6b3e831844893d9888870e1d363620e85e6520ad6fb323cbd3566b041dc322c6284472132824f6cca086e31772d177748e5f0bf1e5c720ccda1a7779138986e21787ac0872a2e10450c7511830ecc0c112442e27d2a97757c594938b2c555eae96134a103f2f177729f4cfcf86db7256e98e355bf45142346549123f11ab54e9227131157da2c72931c69f2b6e187ba66d92799622060faf448b603baf915bb66ddaa6653176de4db18a6918949e79ce1c4f06a5d39048f7c702cfcf2627cf9137a7cfc686688c227ca8b242f486f68d712eca4f528c60f4283f1961e8c36b04218fdb699ee6e9f485457e1a5dfff07e27efee695928c2b47e6191477d61911fd25eb98fbb14dac3225fc3fba72fec0ee767643ee72afac5a1bbead17235bd67294400e34fb1cec9825c8186eb6fe5f455e00689930d555d3ca77dab35e45c88707ff2ce67f53a77f190584a518e6128df22d773c8c9519ed32ede0c2ebe613d79f0f767b7ed6be272aa365c7f203f36d9f9405d37c2797b9b9f7c4ce7be21dc60e7a37dfb647c94578f08f728a7def4563e866c4e9dbfbd558fe9dfca471dc279751d94cbb76a67179066c5d58f186298d0d468566e752f265d30b26830a6f8fe98f80da308524a29b169a9ad169357d6847cc44208420e3aecc00a1a38410587307eb049b7965a8bd9b6a08d0e1fec2f6de101082fb23802881bc078bdb49460cb603a0a52d25001a5c9161d4cb1431397ec11bc94524a29852ecd54758bdf8b0083085124114a1c81084c9040841f3629e5ec3e819bc66bf0cc21a59c577677730d4a29634a4a668ee299c5d9f3ecef2f6ce15d98e69c73e69832c66843a9dca49492ea9073e698363d3b4a29419a06995b35c6a89a924e19a594f7e308c68d744e2bd9450925a5943230a7a0d24ae79c53c32a9d99d56854aa99759cad744ba269de69ce59edd3dc6a1f379859ebd8f466e658866db7729ad69daec4b2a9a14e95a24e49b44f93e2466dba90691e332dfb429ec77c62d68b3d1fadd52b9d33beecac5485a5e9a72a88684cbb1ca7666264a68d3ed9a7c59e7f7539903d299a54a752bdb8c0c850c998416356cb836b401baf30b28bfb42bb619fd552302fa997eede53879a81612b9a1266d52c76eae4a9d341d3c18dbed588e495032c439d3a9dfa5dd965a0dbe205d9a37f08cd741a1a536644c80c60b3f6403dd9d823c720ec212b451a2a967191b5ac4e0633dfb6d97281331e8e46a5da380ef5c51dd231dfb41b94b3f390372767192e35a00dd4c95fa12afb620cf29c474ecb3ee330aec35258776fe534286eedf8c471874c71cea813873afd882f0d0737faa6510633e7ec035f9dc18c33117cf568b58ff94696d958396bdf512de934f44e272a7d7c35939e395fa83ec2755703d5b5c902c4c64aafd7ab0657749b200c81a82342cf690838d8c15738f594074fdd52bf59c4c84204f34d9412f4ea964754f3d2c6173678e9577ec1c54ba6327d44855aa14964da4fb742baf4ad842e11e21b34dd0a291038d9ba4d8e13b8ab51c9dd701f05a2d34e6ec7b64c7b5377e5233cf2dab7da78d3aa7b0de6980dd7e2cd90b0da96b9b66d5a87016404942dd340afb1516444cf6fae6158a743bdad8bcafa10cd370f35e77cfb3888eb74953900492b1931858b8c98f232dffe230806fa060977940226df4ea46f588b50932499469bcab7cfc9c98e866f443f61dbbe269c6b5a6b396ce40df7d18e8ce56856db1951aee6d4b9351d39a634c8cfa98f1edabc2c10d105469a525111413f9842454520a11577c4778115cb24e7c79139468ecc95525a63addc54e9ca9bf87ac55783ed42ee6b42c1b88a6ac36b3021825092850b1d6481454fe104144ee4807e446cbed65a6b6d0209eca24eed77db0918e8e0290ec20d6a7cb045134db53a41433b61c30e423720c2c50bacd892841c4e1045efa048a80917d473911012bf3d170901318e7c1fa117d36f1967c30688e5398554515c8e02ba2a7ea8af007c3395505f18fff34e68302acd9869c2149237ed03bafb08a1bc7af5f6e9167b2ad4b493522aa594df74cf693e75b7bbb7bba7fa82f2e8f55b2f8c3e4e3f7ba07ea6fac317fa573de453971f7f93534e22361a179af0b67daced9bf66956bb75eb73da185ceb34f57293f2e993e96da6654c803e0af15c7402a5df64b7337f36189be73cad7ac8103ccaadcf2b5ab4b838aa73949647f9756289f56945e796ca5b475d611d55340495bf7f7d837149c5b8a04ea71a1b28cffe8c93cb8ff9d69da6b380ea1ce59dbcf828eb931fe54d6714ea73eb75d6b9ae07caca9e514249b7c2eb2fdede3fdd1a72ddc5dbdba777601c14ca5ffc7a305efcae7b00ca5d5c1c857217fffbe285d74feee20db98ef2adf3d139cab5aec7fd50dfa6e2c6f8cd515e2ff15a49b3da5fbcf629c28d1f4e2520a179a55b4b8c63bda716286f7f80ca519e8c4fa95ba81ed355346e43949fbc7d06756b08caad77d6f988500871e5bbce6dd703e5765aa1eeadc758eb26b8ece5669cdceb98db26c2fdf5d048a33cfbb4f381faeb9b8b57ff0447cf5c3c170d71e5b71537c3821bc6a7e166567031a76124fe10ac047ac2fe14bef02edff52a46532574e412e6693668bdfea90b697cd83ee17da40f53e18f0f89c47c7c69afde8d275c9287a388c1096870c180f54471fd8d275cf5cba94535882104170c18163e7051af1f0f1b61290a820b062c490817fdb81110dad89aab9863475c2e592a50c79cd6950ad631b75f75186a18477051c7beca5d6bafa451f18df6ea5d20d44a1e9e810eae98c205037db9a81f7135d808681f6eec294487c32bda3be78c36d84e4e708372c62a36db2deeee96cd8fc51665b3654eb24de6c9b38bae74767377335b619c50c686a231aa60a3b2093f1ac236270ca4bcc186c3ad01cc1bb905669e952c6e174c06c6f26ab5d54ecccb98557d002ea0ad32eac4e817f946c3a085dbcb26ad469431046d01d2f283c5e775a4c4b78d418a97870561f9e9117ab57c81c65be9b9e28305d3f2bde5d542f4c38e6ad4d0aa0d9b6c25b7dd62a500fe69e8466f90c592d2b7bc78d2d90d0589887843a76f73763a4d6a9a25dd752e17ba8c33dadc29a59473e9b28777092168cdaf4fc6feb21f5cf690bee69cda4b878d5f1fbd3fb64f2196e263636dbbb5defa255991718ebe97a15ff2067b4956741bdaabc25e1f1dfb42f0c37e452564f8188314ddcbe382b0fcf4c453e7832ab197bce1a8342bba959e2b3e1f63048a31ca8f3ba2f2fae893e544bd7a36be1ca79a65b3b8ec3c6ccfb3c936a8822dfa16652c0a6209cb7c9682b4f421419ddd669c4b8ff34dca107cc96599cb53e69ccea9095ca17cba8cd389821bb20e665c306a327ad67351104b7e93e1118c893e13b96341f5d10569edbd5bcc8c2a6646f5d2b1bab84419e38556f544282472c2b7c79537c3b330b82be9f2fbe18264518f2fc9a2f70b89a4fe445d5bc1cc07aabcc1eb2acf3c95bbf070431074717171661777d9e1662ee3ad665cc6631ce5ad661ce5f137ce935eede18660538e4fc1387fa111fa391aa46ee35be4409a823981496ee6d263083eed317281070957a592f0c85b2fc6a537447aad6e6de79d6fbed36d7ee4392f9ccfb9f4c2201f1be46438773b443e942e8fbcf488c8f80c107154e7a211557961ea339ff15ad041b90f198ff97264ca83f1fec50b794a0bf34a4751d5142179033ee91b76511d09c535dfbe0db4b6288824cf549e8b4a30f45b731dd86d94524a29a59452efb66ec529944e14dc301a45242222510e1b118971520d52aa7d4d6638fde2930685e4cd8c2f0249a158d414978437cb0d23d253af513cf520dd923e836e086e94e37ce3baaddbbe958fcd35dfd93ace6bdfbc762967d0056dd89c90c3a35bf65b619f524ccb6c0154a94f8fd23967a45c270bec73b9a80441fc2b4ca7b188bcb997e98b5c04d25c3a085c9031bc744addd9525a99d8b343dc15f5cdf9e8f572ade8f78373cd79b02246ba655dba0bddf2a65d41886449e9da0aead7f9705d609cc938aad6f4ed4ae77ba5944e575966a594524a29a5949e596c856ec9fb530159443aa041e99a265d4a14748437f40bc471e65b0d786ff5f9d5b51c3736926593a36f4e526ef42d9bb2a6bdc1b6f996d916f9d9cc1f3e195de9f4830889d2a7f7f385ebdd3a414266aa2ebdfe6e5badc52c56c1db9d4ee41b92ea74e639f226fb6c6ccf3f65a1a4645fb1c64aa7d7a8744a1b504a29a59c734e29a59452365766c64eda133ce79cccd8ac93ce9e93e39c45dce81fb83c65fedce85c0f37fa9c178816b4606e410b2322369dc8cd52ea2cd56089383966ac324d8c8a6fa29173d2873148d12842616431a024d8896118162520810ac2b0e1aa9e8b7e7e50e5bae0e0670913b48335d8074ae991ade5ca782efa2941fd89e1c7fdc8c1a61a9b9a83cac61bef74b7d11175ccf86407a8167777774751714cbdfc21cb4b209c78e9352aeeee2628dfdddd0d80a21fa4bc94fed9205a7ee8eef67ce8820a6ffed19cc5371192be677c7777b3d251d7e8749a001f724a967c90c14b2fe112010c8fc6094a92e8618a974e731b0c2631453dd8b0b21d8510034977e76065003354178a1b9ae841075a88e1248bab8f284209babb3d707f3e16c3b78c4ea75bc05255d1cd803ce0f0d2653a1da99221a6d3992903bcdc6187215e7aaad391aa18e4c8085a60c50c5f2c8183121d828a00c545c195825d3e537600d3e9b4df306a38a9e8bcf6536195be5c7913b9140d098650c0b7db4b82a46f57f93cf976179750f8a8e00634e0808719909a8c51041725cee7ea40c506a82149fcd870c316465c616484183cc8d0a826162aa9e2be533435367204cddd8a1e696430d8ce47da97c3c4e55f6a0eb090b8839660086f80db7e212dc208dfbe35c732ca53f59c7ecee1e186bc64bdb125219977467da812fac3379600416930beac1038279c13cec9e6c42634c3dd6adb84a46fb21715cbb464b758a46a8d64d01318cb0b88f1d05ef9948736c8da7b552a19f7d4e703c67ced03f3d27113bad17364d5002bfd90e849da4da05d312e939249c9c8f88c8c8ccf78ca5b015179ca55a919991f669441d6deab52b983a0cd698823405f1d882a9d71ba2d877d21fb60c438deb7db29dd92dc0a084cca61fc88ebc55b0179f1188ff97862b694179bbc7e4956ca65bed8b4b29e72198ff15640663cc667be8ef956d665be060a92ac5ed94f02ed8af198af7dbe06e286d6c872192ae67a7bd6e9b83877cbe54379fc31de745d8f8b4939caf380fd6cf35006598f6b3026282828a80523d733c611dd066dbed9a0cd066dd16362529d806fef3cfe8409885ec84a16c663d78bc7ae93d7d59fe851181912a1a71d2e9669de16d3320cd3b40c3bf9dcd01a3d52b7aa5ba46fb747dd6ac188b546d252c1a84f83d3653d0bf3e298e701fb5606d90661bc76c9a020a38c8b6e8d64832ab79f85f1f84d603e1e185c2f9f9135aa35cedcaec164e39a90127d4776131e48df6435cddd3c05fcae1ca3330eab3d8e9bacb5d6ea1e7764cf2d8359a096e58654683e198a9f8a6f0871ebd7c4faf45075dae186aaef7e1a449388aa6e35467de8cf120a242991115b9e9d61a8c4ba9b11e552b73bd4ef379b25fdf64dbcd13c7a93cc69f6cd66d5764aa373bd0eda7ab64f39a56bba3ebd4844a5d323910c4f78fe620cdab8a613e34eeadab8c63dd249b471cdc6be35d7314ef41955c90ded4fcd33ab79b7c1a9ddf036386dfce95745e335e046975c50874a7b1aef96e693bbe537ecca68bc92cd8872ede6a14af3bc50738ab9f59ce6cfbc236f3d2337441c94ba4acef68e6f4426ca62c3386c3366a73144a7317cd481121b31d1019e5d4701425577f2f0e4ec8c691ae639dd792817cc394b80639e02187489f2eded39e28eecc38938daaf14a82f8a3e816fb487ad6f8f26b815d858e33e166212548c5377e88838dcea88a1cc361d475fbdb8e4c5eb883b5060220ae360149890c237f8439c6f9f5ae6f633fbcde9759dd5df50315a6de6e387439d39abf1b2037c23cb6498e086366c6cec3254376b1b6fd8b5833f0c4009ae506687f4f04381092206f9e3870213458c833f94ab1e7642d930e79ab0c6d157dfb8ab029936a5b1091598cad4e4c9246a92c5c92708071afb4a6a490b0b0b50fa4e35d1a6349a20b484c68e149881a40222593834a50677240ce6f6b19d48534d345400458922befd88680692d1dbe8b23e264689e48de676f3ed9b81640444fb661c495675eb748b1c0560bd5000af5983a806918c79f10dcc635e8f45d64ea1075e23e21b9846f49853fb7ad9f046acd594b42b0d5a6a2d66958e60b2184d35cd486db19e6ab29a9276a55b3d03694bea4a6aa95bf1f314966ef537847aa396525abac59f031aac393aa267d3a33d8b611c0591c56a65c00bab184619fb563e680ea24ae714c08b4e296b104dd91df39258b7a3d2e29af098d3cd470c35a28f9f4d7f391aac9b86c43843a2b77ba92d7e542ddd708636e3e8555c5c546c39a9d71eca876f54cf91d1e34729314eeaaba396ae10e36c5ffd3e49f930ce8cb6c445f9308e0c1f694a5f7dc33819427ca33afde2861469674bc184c73eb6c79e8d06ab47cfa6bd1c0d7233c7181f2590706c1b363a788a0d9b1c3a723a1ac45da540e3f9ad5283338e1aac33a834f8012171d418f7bdb0c2d7a9b0b9f6bda0f9f6e5344ac98b797d8d79c52009faea313d31d563a0f40d658a49d22d2e22a227e605f4b58f5cf0614cd05721226cf061cc93afae30c6e7ab6716d39494ba15ce5862ea568852faea3546e9c187f40a151f522c5f79f021cd8714e9abe649d794661ccda0d22d9452835e6b1c112009afce926f6aa41e06a065d3a0d7ba0083d265702b88ea02dc5a31285dd5e04fc491e3a534e1a547a348a56fb257113d47615cd22daec1cbe7e550c75483970b3e8c5382c2f8e4a55bac763dfa2be6c22b6ef960503a8f7679f3e3747a69e5630c7c43faf4e28b6f48dfa2dc62a4d4fef4b28f4d381adcae1e4351e5890f1b791365882c10302864012fa537c982c89b7649dfbc7609d1fc48e7c375eb921e8384b2bbb9267fc41fc902e2be08e45a5c1235155c1d3629b8db8b715c30c10de3cf07758b31979d2a5a1ae48f11094f3f97262ecc330d92f0f3394d7d1a6ca2da5d120dc1cb34f600397517e44de637d6e9d015a261fcc93c7ad6378eccf2d4a43da75dd16357e6d9e8902c5af3360dd2fec02ee9b60b5149cc272fd96816051ba4366cc006e910463022bd00cca90b29426dd8481665e622f2460a611ce7ad5229a7575d7a4434a21c0d521b361ab469ba11b4d1374438210d522b6ec8484ebd027d737d322a36aeb92ebed9ad5d3c7655eda5b399cdac96699bdbcd374a3b9d262fbe9d32d73223f37f7e73fb829edf7450e091a3e34fe8d610ebdbe648ae352207e59a53476173946fce7d61111e97ebf15cbf924563c64037f3950a7dbddd611ce67bc1c52333cec91da539ca5bf9d03ef3ec1b72fab4e7b721f71999bfad329f9fa1f0e2adb28f5d9305d77e390d1a712bbbaec72eee22807d1cddba6e71857ed270b691c618ad8d98b5297a82324f98935aebb1c058ecb9d1c71a7161fc07cc66a5f5422314bb8f6598d30c87cd3604f3ea1bbf78dbbc710f2df5f98546e6ab3c1e39495c150a3c1a6ce2ce1ded7cf078a2ab06560328e8743a9d3c36a901e3eed5353f9f1e81e40d007c7a0c92379ecf1a9f2a55781f8542c9c8f098989899989998984e4746860c196fbe8c167a604bafc30dce95d7b80a34eef90a48096e829bf0f16c603011b94af023ae6c8b2ef6c497644df73c17246bf6308effcc5cf376310e3323e35386ab9c7a2aaaa294ca90e1aa192a95ab64784e5316588673a723e3e3a1fa723a9d998cca7826e3dc3de065c69b2fe3ad7c64435e3cf3123c9e127c051e1a1e44b27e705e0874631cc601f0ad5490345c3abbbe6fa542bbe7def74209de9e719ee3c2c34d31bbec7063fcb3cda20ee31784f9e687798e7cb19f440b330efd14badeed52a838f8c6f41a9bc75b0e0a3cbac52eb3bcad390d4eb734bceb81f9f61b827dbf9de086387e7a68f393c653ad3c3fc2d590dcd0e6a7e3601c7ea1edc84cc730a93e96c88ad0521191911293962d538e86ba15d61ea12750823eb4437ca386c886b317d471020a291551518ab344445388b8cb596bab8f0e1b1353a090fa50a318a51aa8e42c3835410b159a190c0000011315002028100a06c522913828a049b2a61f14000b819c447c52194bc328877118a40c328610420821840011111a1ada0800eabf0b587452a3d57fcd761f90d5581ca5c09b2f05b9feff04410a527db580f3519dbf20b4811e14a5f946b6b2815998787627714b4045ce4595e497d1711099dc36750c2d83f99558238e25f303848df0cda5200864258c30c845c3182377545621175d1a1031cacef25331cd9c525b0eec4692a29f64db29f6fd5e1264c10b108b752a19a2743e19b2bb79c2040ae6fb9f037139bec034dcb1cab191f7abbbcb310cbcabe055eac84de9c7d9aeb8cce12703adeacbd216852dfe0b5a928f653cd69f95c93e193d7d6ae8800f143aaa3ffe16e2c67a5302a517d1d77950f2b7d8ab43811ac8e40d608d0cebc5a9dc07e8f3f10986bcc6bdc2a563fd58c20195533a12efeb4f383727ea1069528566f4daef93727ea2313f2919f47482fcfd3c2c9460ca1999e7d3d779409e2c667bce53d91fd374f0b10daa798dbd583f2bba41c8dde42ba077212b5d978e4e8fb6b53c0cbd0dbd6aa2a98295988dd57bae458a36bd18467b366d62de3d832b497d9b4b123b80bece93d2d071731e6c54b2c22c86990c0203e4c77509fa752f9c9aaeb9ddf3df88a5661822edc100c46a97993e6c9c812bbdaeb7d5b3fe59d0b66bc9fbece54992c50fbd14f3f38453a2aa2b51ae6d452920b032039b193487e97716201616f300a1018755c872d3f434fc95042284eb806970be26943372b5140cfd37223dfa342c50847ceccd0bdbde336f5906bf91ca5c14343cf3fb0213ad26853e607a6483fdcc2195135912904566f371dbdb11049e07441cb4195005f5477aadf5e878ab020d86a1d3f9f77e365e5386a25354f9ee13f7dca94c2b87a60b3bb800cc0597a42607f0cebfce000d9cbc05bec6975e8e29a3f9fb2aad7b687f9e223389960ba20ef1b57bfe41a77ce512866590541d207484bf7f36f443e5113b984c069f32b4eb23409d705290507b5e05e9633000ea75e5735116403d081cdfcba25cfe152a35a0f80f1fb00e700083d02c7dce3349c9200cf831ed4773da647ee7d9b3ec36a068f4092007256b20e2db469a7b26feca3582474a429c6930064baa506505d797f337ef04610e8b5df62d04e770b79385ae227b10bd8e82fdc7176e10437142592090ca2aaa70311148e9a34715b2c4c830355687a0215402fc366a955970451e43f5b2d19c8e6e908d1c316caa522c5a7cb441abc6b271aa37ea84cc6777200484d721d2b3d536eab3d894a36819ac8c950125169c4103ec08d5d8d65d8c04dba0ad38a7b8c88ed7850da9a48153233f9d9aa57228d895e9e7a4b8b82e270487a30d92f3ab5f3c1f50bb00b45e45b637c3c64e08c9015e7d62d3b34271f438c42bc31d56973f7ae209e10fa5e138f31836022bd3ce756d40c683713801390eee37ac2a70ed391d4d56764202fcfec1e3f78656fc795b92a04117b405b5fcafb27c1d14b704cc1eadde4385d741a5d4d308f66f880bae207321f61aaafbb310fbf234a9b3569be529386e5a5d19e40d332aaa783c8c6b5436d2af424a1cd55500fff77a549ad190c79511402a1535961070115462496547225ee0946ae0bf0b9cbd22a43d76628d60e6f16338d668a3a708e7fc2be874147a160960aafb6c87792b3ba0da0058c3bc272475777995c11006b2fa82c6369e34b8f77a17ad2a6f774f0a1b58014154cfc2acfdbb1acb17f0ff451a7b8a112f91228175fd94b1698ca0e9b08ec2212e4e62278b5548f57be3dfe296e306e8beb7c9081d7e61ad3559f88261c7000f4a10c36238636bc830d28c425583d0eb8c6cb17968313a373fc8cf3435ba2a912c62518b74c7020dd505734d0d86060a8201a0aec8be566dcb5276faa8d7181ce14f05352ce07f823a21c49392c6015c7d720a4ccde1601ee3010308195566b6eb5fef84668b9985e9f2859625434f5f20a2092f8653351a8ebe5e8964e633e723e5f2da71a583e3a1db4167bdd00489710948517c647a13a54b926944831386d016219038001707385b5561a9d576b378fb3bc2a0884fcd7409a80af7dc78c7eddd95071ff5e5869be0ba91821a6fe5f7d7547187c368a71d230f5bf202541e271724d68372e6d3a635e2a4ef79bbcc869fbd1a30934cc86736437d356a9fe33e17420342eea30a5b60303c029c524529ff88fb65a2893e3523ade0a137f7e85460010fc6510e9cc118a5d86e86729a7bd6d44ca1fcf732015b95167c0fe30bf4ebaf086aae32e58043a6b5b6a4558fcbe2ccc3c44690c52be7b0852a5827c8f7660961d4bee0d83dd1d85e2c1afcb044136f09d0652d42fb2efa1ebbbfa743fc1132ecbeaabd9fa877551ce25e6450c04debe32d4eb46b397ba105ca6f2dbca0fd76cb2848160196e53b6aa8ff408440aa2b7249959e14bf4e2531c779d61acbd286feb5a2008539953fc9248a7b5b02881f18340b7612c01440cca668ed525cd7ba241c83fa3b58f64305690e1fe88561ab9ff5186a2f9812d9fb38c53bda9a357a4a0112670d48ae6bf5fc35e082e9ea6582dbe8451626db16d55c9b1d00ecf912c885238a5212e4fc5e3b5389c536f015c92090d43f0166ac1e28742a69487f6a53ffc2f0b1f94abf235254878b65b80ccba00c1d9c87bea0a6ca6a62f464ec618f52096b0e165abae874a5c0c2fc18b9c62dd498ca42101462c6c9ed5fa945a2721489182c9b0555f7ca6d521dcad16372d8e67e91efb443696d311d6dd4dc430f139f10294d483325a96952dc0c17311cd6819274543e46198d0afa2cb8896080a15651329889175f8a23dc4c14c4b67a2dd76565461e8dc5f1c4c659acddc4ca538ed5227f16ba045864206a1b7ec158e5357567e3263a5bd616a6950e3a3d6d8905c4460ce80ca1d18e017b39630f27c0ccb36799c476c854ed3c226f56ca6c0f9d27f8251080fd6ee801d6dd1492c767aafdc9579b0999dc3cbf2e493c0c3693561f0a1e2d60778a05e8021df17f3cd6c51c89b7edf70fbf8eda409b942bf96449ecec91d4d4e2d2da0fa3039653dec035a11b3b80208ddf4143942157f0cc93dd1b7e6b4bd938eee5e7fa959fe5a7cc32356ff2e32fc4c658c0f90f7a1233873bfd346518dc520f03614a32c69059429acc1805f758e4b4818aad5cb88ff02e53e90de17522b1481861b36f2943d22e5789480676b63fcf8d1d20fdb9fe3c98e405e82001cced257103c62acb20e5e68e2b51052d1b8e8a64a8e81a78007521e16d198d24b109e392c47e384ba415549aa3f9a6cb69146cf304e79052f4c7edd778b6808e2bd4c95baa358a775ace79c341d34c30449b3896943da7b1a7b46f52df8684def96f97422267d20119a38198f21c3eefd689980f73a5fc1f6d7c211c343bc3c6ec1dea7343c9d7ea6d25c60c4518287e4e02b5323dc8e9ef930c80d47fb8b8ec880e22fef4ac9fddbe38a7789d392fb94e95cc111e19995e6872432c731a28398fe54ba8f40d570e40710f45fd9771acf92f4491129da92a0f1dd24c4f486da3e4df2f5cf912c74712264772889aff811576c3765501ca52b98378bf562267e9d5ba907b2f67f78fe2c09d687d95e7226a3f845656191ab47c744f1329b3d9cc88ba4a96e408c8974f1ba1c0f91490be674af280f0f1b3ce622527cd5475285ef25a1c0544fa57a4bc96a792eb97e91c4843dd5b825283772efc0915c102103113d05562e051e3cc96cc4eccee050315f0291b5a72739a684f44cf85eeb246709c36882fc5385c7caa3ab57164deb832e7b98c864b6618d11d7795a926f1eb4ddd670bd4d7bab5d1bf887cf490e03b691346409f44fe1174ab16570330a1491ae793937b57887f2face18d43e9bdda605d208c6e0beec3bfb62f4cd3cc510636364d0ba58e11e8671fd4bc4010050d8442aaaa4f577851445df73a0289d5a7618f4a830fbb9b1ab9d94df48c96469a9e65126bea514e04aba6b6ea89e556184c849921ce4dbd1a2708e15390126d064befc757dd01b3d0c3976ad903cb9bc8b00f31c3d9606fe6b73a8dd92a679add1559809b1a5c9c99ff3e1de25a844afc8f2dc4ad730a5ba098b019b19c248af532da2ec7cc3c6a5bea65d500ab81cfce22a06a4bc14e4f47e4a2725053617e5995c37e37b7f4f3d367a3bbc73e5bc62952a5022cbc48c369d8dcbe4285e28877c1f9f746f3f159fbda00a9982b3fa86761cc20d95bde85a032853fb1bc933fa15014ab0e7e4d6f4bccf8f764ebbaf971a723f8508d56aabce587df0fc51d29646193b7b1d5b49dd8366014d34a00db349b8f5fdafb8f185e28e55542afc165e07bc70206a407f878e0e8ec158cf26700cefdf52af1947ad2b1aa4da55a627ef8a9b1427f6c138082488cca8b8f19fefd6edc1d420b3a0c1e16967a359e990be07e742c5be599be63ab653a644545405357bdb4989b1196f1c2dedf242edae4e57d535ecdea26d681955a344f47cc2cf68942e8adfba522184a4b8efcf3099b4f47934d9b45b85c9b82123782b2ad0a34eee3341854b507c38e279370d8449550282f961d36d1def9c49e3b7060d9eeb54e44372dbcd10df3afa9c2b25b8f661e92ab6dbd3025ea9b2cec4b50dc0488ab703857988814e0d80297d168e3ad3c055380061378d55ea5991dc00d4aab8f244555f9e4c1d2e54c4e5c14760f13b5c84b41aa77cc78903381a690fbbb70bfbede1538206824e3440bd0bf5bdcb245823d67314ab226915f70efc91c74433509a49c343f35bc96bae4ef3ac83d8fa97346401b51219ea0013bf5ac9d713fa240d86cb85e89f4babe84a3150c500e085ed8f4d90173cb4f95480dc06f8bd14cd3809318fa6b9e8b0462079e0f68d0ecda62170cd500b1fa68271abf4db9524916434cb917f63571d2ab234fde50b111f6de6bdb7a169dd4689220903a2a7912189aa8b43c36fbf2e2f01a94c1ec8a735b464c684da87e68ecc87141965179da8d9d50bdb56f9a8a90cb6ede44e23899d7cb205f6b2e55dc6b280399b8fab952419c54d0135bbde287ac5ba2cdfd3402bda3c59a2a44625a6af2c4354f1d1eeb6ff5a04796bf12167cc2eccf90b648197e3c94c9003d8e228078cd422b9bee09890a3a73da6ad494943890080ed27954f24f82d18128e5e05d1317378e71a27e79cf42a6f8cd1b2188fa379b5065185bc6d4657ff4d665046fd77280d327742be1b52c5e8a19e53c0124e5ac1926e2910f19cde993a56c6505d62c1826c0443ef1e3f409f0d417ca8364ea32df80b3e086fec9f8f42d4884635b70cb294b6147cc6a3fa58f66ea00972da86ea5738c0df3c317bf673b51b52fd0935a5fa916af67bc2e2b931a929323649f8c21ef4abe9fcb664ca5605aa362cc60155d8ca9d050ce7599d07c3f944608812be581e04385bc30be5926320a1daa6bca7f2c47021378774f2f8e35e69d16d222336a5a442bffb896b1385c39fc9d300f6f3caeda473e7551a3fe78b47f6149f88b0b4fb816566cfae6212e148b12c63479d14fa4433b851ddd9994df2388c359c694f2ade3e84fffd7e1a64db030ab46ebd0b109dc32d3e19b823ebe22433933ff28475e4045939f13b88a90825228e11d45cbd8038e6f3ae285d7bab8146d7dcabb8a47c16b0ef53514aa2b434ec1a9715e3eeb2aa259bdbfe4ecdf9efc5b2e84987dc34db9f13eee16edfecb3bbbc92b5fe0656be8dd81e3ba24aad097eef5ba64b81be026c0749ad35ea94b9879179dc5a30b484f93573eec541d5e22d79571c4d217b5873673781e1d53cbb5c4028d761b6eda7bf362595e3512ecf1d7f705c42b1c4dafbefd5d27cf63e95eb4f9efbf46134a1535cf2501493152ec2d9a9062e1460243a0cfe9b7dddcde5993f7f4da74ecdf553a650d381ae4ec123b9ec788caf6512636efc8fa2de368e89ead916e947c9eda3836d7c9a10a673e9eeeac488e22861374f09fd479ab7cd789fcfbc3334f24ccb6c0d18f664f70e142ad6f4796b77bf8c8999c11969c5e9122c73c72b15efff2277d2bef2cd61dd448b0536c7cb555205411ffdabbe395c75097dc448ceb84963c6a8706f4709ae7a8173d62df09ad5fef1a30d413f560f416f88a658c8226b6f0ada16b040d82d8054ecf2126f85071e122c3f21a41aeef670f4479b03c0aff28aa280d61c2b84e8cf363e8f7f2c224c801257277452a3dd807c0ebcfc21fa74953aa3baaa9150a8f7124efb1867e6cd3226327eeb5a09a9733401cf556cc065140b40a2add563398f3208cae539e43bf1f590c0d2bb90d02164762451a60a66d4fe506263c47f4bcb0542b1cedb7e43c37fe87afb744b599103669373ae6bd7e9174e8347ac2d833567efa4660236afc4a9f6f3bf555173cc340fc6e98afcfe3ad2ce573a7db6abb8794227b1e368e7cf7c57068b80ebc3c3454c01215337c5ecc1cdef42ee3e15e96d4d3ad151b03f85d3435f01e2c32bce3a336e0530dc1c42b5e56545719e4e54a8e175bb54a01650a91d6822c45c3175f81b5c233e3635abd8ced4766ff1f77eea1efcb250c8da07928e3a094181b9b18654fc28dd7432d52e161ecb6e256b8f39e42d21dbc1fc3235c99251916323fff01623e480fe1063d364242f5925250145424cb85fe8bc9e1c0d445b1faca854eff9ca0401190898d1bb11737d873ef4346fc2d9009719075ebbb23e564238962ce091ef4ddbeb12f325c8f47be10804caf2e89f292bd7b88a5b3b3bbcb91aaeebd4e712bc9be5ca40c8905aee23ba58fa9971db33b7b456d6d97903751789c67f7f13cb0e5499a6bf20b3b56ac12cc76e5f7f904f324e78fef53f86d8dde88328199cd367073eec7f4a134cab178dfe0a7073aa5186e18b747557095678a20b265efc18aedaecf92192feaa680ec2ddef445276f1ab739ad2f969076cb8991e2130aa95dd54a086551834fe0ae028471871e8a80b7098809f4d2ace59b9127a3229ac1ec47367ab86f6077b73825621407afa38654088ec96e094e5c4d23f75230acf286801d16b714e22e236d74a5eab811018ed5fa4946e3b2eac30599ba49b9054f02782311379d59924930a0b1847a3bb7f5d400e699260287382048db9e2fe8d86dc1edae15b6702202dd7abdee883c0b8a5ebbf4b0c8236a6f47992f3f4a69ebc6091c09df7f2c92208ddac22a4747a5f827c182d23db07a09612393d70009fb119a7058c60787521f6582b7a4bd3460cc7d9f81e066450c03dda60f9ec7c60c8744b4e9611e9d250f01b2d200627c99404615f8e4426d756d55571f8f4bda3b849b1d3cb96bddb8f9de753cf00071f5039a0b60d4161d3f3fe63cd4319c63895a91ae372cc0f88a03e1a16f3ecf56804e92aef51bf611a48ffff1a437a55fb4ca510e5ab28121992c45ef09a92352b49559728f4219e334e8093d98a0a55b9d05c565cc276e54260ea9256c925529693d02706911e040f318c63bca08d93b7a795433bc913ad424838cf7b08c5080e3df0dbcba1fe3be538b3cbb3216a80e2f44a12f45ccb8981d6f1043b5b67f977a984e22388c23ecbac6e8d5d90e214422802158d6d97e320e24cb5ca6c3f848f1a0548a9e4a41dbb8d6717f734215728a2f49b896b8d25c8fab468dfe3f0bd9031f1b9a2312c8735f02750fdb0d72f390e0a8adc36a7ff07113b09a67878395f0033e45a56da2c843ccc9229523748421ba4d1abfd541b82daa5f732137c2b56eb45d835ce813b43ea5710c9c2b65ae0effbc8ca2f9cc63575f1e7eec0d53b87e4e7004758c86c023faec99e833185f7abe5fb6c5e2b8f5fd200800c31bcfed8d3dfdea68bf0975c5dc71d0f816eea1429cbf1e43130636a76c02e3d0768defb0a6a6c39952015e897cfd016f70b02bad2fa0fdad4177ae74866ac4b5497fdba4d28b1a25818ab3c536ad419a279e6d942babf89a548e7a81b2b135e3f1cb9a7da4d977828dbdca5db846e028080bc657ef434d674d69dee6f513994f5f8a3ed3bb885e8d06e9f8821e2f8833ed900471600e25d461f0cdf510adb5695114878284a3269b004e2500520ef5a878d6dfccd0416cebc7448ce56275b04fbfbbba8df264f4ec3e8cf40a4aba367c566f4ca6ace2adc35790a9aa6cd938d6b6509f5ea16a3ce7624393327d314e304a444a70e6314a13f2c9b528187735956e40f0051ab3731efd97567a351216312bd70f50e4a37fcad875dae9d79dd426cc86ae9dce92c4fe9039622673d61c91b81a048e4544c5e60e140986a523cc52e912697ed930c1e6e17140f45da2c22fca5115f814bc2a773b81aa13697797c3e5983b63af7426d2b04b4fdcfff6bd4037caf5b911f13eec5dcc6601d5d9aeeb7a3ce8dd9570a40f1a5ffde184808e0851109894c02b74229e0593d2bfcf287c095455e17b96e90d1d028f062b8008a7816b76c8cf9e67a65d888059b289e2540d7be3d413c9c9958c919e0204e16bdd162363f417b69729124f9e68bdbdc6d7ff7114a53aeaa6fb2af43e1429f760df0418158ec072d21c25af4f3460a58a04c668d065fd31a4b813885573444057c49d14f6f6c3979d99cd9a442d49b49b264ab9b2acbb1f80afde5bf6de2743f6638c43a36b62e5cc25e2e37f7cc40885f1a85b2f7d9208ee121575ca20ed5326666fa877e7eaa793bda6a25beac4c07695d2462422761da23148bcf3749d3dcadcf1c5fe583c790550bc10169979e722f0563d61aedc1f36ae845a2f7547c44859676709f3ca9223c0399e8fc6a9fb6dbf3d4166ca9f7165e1ea9f11e3b99d48828f8f07336de822eb85b7de65e384b1b9c6742565cbc851afc8812b7143efa2be5b6aa0e52140e7486958e0339496176d6561bf65535744fa85ed5375de3178299ced7e2caa7d56435aa9941ae661ae58a3645d7a50f4ba5497d2ce7a43e636a473a17ad88e275ccc52bd1eab4355b52449c37040a82a3b9ea63ae76f0748607352ea112ed9ab923d8278ccf691f5662b3b62d2c4423ba8e7afa5cf6010623064b79864d93e84406d4c0665162d3646e1dfb3a83f51304819d1896498a0712bbbc05375c9e7f62c159c4fe42c5c7b4fb781103a0430807a82022c2b3657cd78b93bec851df9787c1e117e27cb735cf490ea4bdfcd943344b5a9a8bc03bdecd3cda1666d8156bb3cce8557b21df9992bdb28f951affcb2baa7b38371207fc802c0ed5d2bc628ed1df37a3d8ee75444ff7f5b042dfa26cbcca5997c89389e380ec7ae06cdc61d1e168d0084056b2e595293ac269a31f2da7450e0fb4ffa02bf64e0357b740d0e30aeb24da51d1368d3f2e37e2cdde6b53666694716c3ae6d0d9ffc5fd9f7086c86d02cb4353c83192bed43162ecdbe02515733e87fb3186cdc2840ff231eedf680bdcd9eaf48f12b1471f8d3a9cf61c9d59fa223f1253d69f9272bf37d4c74e52ac781e27e598855b721cf0a821763bfc59f7f3758295ede640a750523192472ce6a7bcbe564bd9a9be8e021c45cb7744d709ec1173d2394e180dc5bd72ea61ded6196da612781c460715c45eaa63a690430aea5521410c65ae9219944019f95a42119b4e419d3bc6306c6d82ffd91d1471a472e8e0a59bd8c55d1cb71c210ffd3bee7374ae5390567ff784eca88646655fee648b2a29854b457958c6278076ca61729dec3cdeb70f7adfa8d8cb24a6c469cbc611778a89dd6fcb24be3723bf4850b5a50178824fb3e1ecfea3a6d4b2f28bec0142074aa3ebfc39a87d3a6f2a384b56371fafc15ae071e353f652dd3a35e6fa0518ae132399eb1d00f702423e58f6ad957e8eb57318dfcbf8b6806d44efcacb73c4ebf49f313420251db831d20cbcb8b943f7ef56f40ce13a183ba9ac4db0ac2adcafbc09d653cf58c1a607a65cf8a741abdfc241c0e515bde89ec5823321cbc58d889ea83567cd841d1ca8e802d3a48a0aa3dd5c7febd284db99338bb28aae62bad9c299fca9aa2a3b606d0b3b8d1259e43121632461b6d49159fa3c36442f0ef109e3d1a2062b0c2e87d9248409334af6c008736c075594827760e4011779fb4bb6f7500263bf3ab632947a334a96600765e04a706e7e42c50c211c71427f599764df815acadee008045baafb546f26758a73261ac088a0658a977042bd74658bf5170223e9836b1d6bcf92fdad9f68ac7a7b06ca9350c1a06bcc30ea4c0de023ef073f03e8ba75739ed3363eb62dd1b12beac06969b5e3c8ce60a1622362b6002f4cb228b6848d4287f2b89a5e22826b2ce21d7ffac047be89ef1f4ae2ba988fb71a991f04562542f0c4ae5adf53b27cbda99ef81b56cb1b83a86376638b461fda113db65374e0e018dcad699a6afc1e1f4327ed17b4f0fd98dede331d4090f21defe0fdc8f25615a63a8d8c0de204ae871e37c575ab3d49ffe0cda64f5df1b589ffc3dc2231deca60bd5f8db666ebb637b0d1a02524c23fe6e7071524569fd04e04fc0bbe42a24fe4f78d1b89d8321df91fcd6e3d42a42b2648ab1a48d9e0f5d6e1baae9a0b85c75f744b1a92f521b630b3422fa7136ac4d113ace750b4d25ae1bb7b973651ccffa7756a4db08fe6d3411aee4a6d74442d9048e4d65f3bf033b171a846b466caa986a139e246f425a797c98218971f04c2ca0feaf16b5f3174934b39c98d3aa10ba155701ffa7082619756ef69065261828b6058b2130ba874e5574c1d44977b3be283364e3cb50bc66f58851868e100365ad39295e7dffe7a6d1b35eb688158ed1d42e71ba3c95ab93ead02486d50d3371d9ce91eb423668f739ab05a94f0a3dd75b55e51758c9c6b620c3800a641b73f9badd32985ce39716d8c7c0cb0607da069fc115848e503a2f02ab537f04b28c169bc302c3fa6db524d27270fdfa68263ac610d464a6543c9dec3f52f059d6bfb043bd00193455a0d1e555f6bf4b3149d02e6689cad68061d9ff39456f121dcf2bfb41d8bd6dff4c028f7847646b4bc2b0bdfea39b3f543a9b879f46e9609085b8668ed73d128be70e6708adf051fdbb6fa8e78a31441d12760055ff64b76f471542e05831d240fc378eb76c251669cfba85b3d52ec43df85f44daeb76cd360e539e184af50e55fcf245a888a252fe5ddb14643d49b04b09c022e23c5e9fbcbbc5c090e0bfe7d347bb806d1624d4ddf6a437d29b6a00214e7e4b862ad3a53b53738bbeee12e9779950e9b46054493f435711eb48e1ee6cba6d6bfcce0f526418a1e28c567e63e49f48e534fff132556528677d8c2139205c0e29d458a27181ebe8ffdb56691e06af54e3af93904263d4e799517d503ef06c32d62175c827aa5be33fc2b80b2486e439ec6659378ae16a55001a868fb5bdcb4b3331b9f1e015dbd4c184f9a0943a957de45ddbff1b2d63f55497f2383904be571d05bcdc7c446ad609d652885babee3785165259a25a0db1a1bd002946c4dc5f44017011ffa514eea41265441674d0895ed0cd5047b46f10f20c3a6008d1f1539d94174f57a3c9fac627c662dec54b2014f9bfa8f5e4a724812cecc60052b79638323bd19c1ecc03e931e3404bc2ff9bf0ff109c1b0199817faef621e9a95f32c6d4ac069d15a693c3065f2e1d08bfa7e9b2f1138b82ea07bc3e83e6b3964191396070218d53202e22ec11edcd3170f6e0ad75a4e7a126c5e419975d49d3d1270de8630a0a7b22dabbff7b44d6388658e589c91d877e8793f5c322dc3086ce66ac7cba958eef065bad090e032eee47b1e06c2b7f421e4772ae3c1386506a0cb032ebc5a8a84c6b63d2a5b5a4fd491641e7217d785d4c7d1f9de55576025443ba96b25054e7d94c38f1c82bb09005b3b6861a31014133ebeebcbf6e7cd5daed9260e8c07e4587af02df58186c40596a8d36377b159df7c1efd89a14b07f836ae485088b170301575a7869848d734ff9cc5b448a6baf7188f0344ab44a38f396f88bec47efec20d30441f1e20fd5ef66b703ba8127f5bfe15397be80b399c908bb1b53eb347546d351f69d0ef4b61da9019bd4d7c79983d8215bbba6e2b0a4f483636b98be600c525e63b3f2c739ee4010f8a0d9fc27b39dcfffb5c8f20ac453fe8bac101487ddd13544bd2b970a7ae34a9115a8d1cb2aa6dfbee5bbc85ea37decfb583c3ddb1d8a02169ce5af2de814e182431e502c0d9978dcd6a39da7748927a46ca2b85cb383929f2438fe4d440a211ecf35bb86823c42d46e8617e4a3d6c9c1111811c48e17925deb6e4f595a89c809d881f9b632e225a9654dd8bbc8fc64e03a96f96e3961b856351f724240a7c9f269ea04f4c1ee7531d32f5ffb5c16fb8bb55972d37e3debd3f6c09d2fdfb670391cd1a46e8884648e04842e27624ad09798200bc17c266d7457230cc865a4685e60f752225dd32ce14408fb422cf1770b3632ba118ba9a8383352134f45dab40baf5cd1191368064a74fba05e432ad262a96832825a6c7d8bd0c395e41e45df1e5237d25d8d1992ec18f105953f7670dcc33aa207a3bd08f6f42f82164d78d259791a694d2effa2b80e83d45f9e140f720a05b882606f6045306e7692879b35a92529b79a5dde8c75f078e746432ffd679eec0f3af8761e7e4396ed809832a8ba90ab5aedcae22337135bbb09ee26d073a28c644b1a0854ff9f73164f2df7b2709eac14220f19d3a9aa525a81686e712e219baa3481d3154e70a0dfa2c7c6a455a3eebc6702bdcdfa6b32317409fe5c8ffb44effbbd325b21ebf67f2ee148dd8ce1b74e431a5da696e73cf69def288cfb62417a5bbdd25b9e269fab1eca7737344a4e06a46bcb6a164646025148b3eef6478b34dc887c41baf81d024d5d0fab6e61bae0ca7cacc729a028c1961819d1fe3775dbd1ddb94f0778bb00e82e46c5c4f8c29229f44ed8c5f8e88b48022cb6b2edd127dc4e6e7c82ec233abd7065fdc882338ea78302d1b98b5b4dd138f668af65a1038ca486819a488adfbdb67ce0677b3a3d173626daab9b9191bbda2b03f60397a2bec0826c0a4a44369676abd3ace106e02b0d9f3b1a2047faa13d5b2fe0963c58218da8ad039051bfce685b9bed8ec49940744975ac36fade312283da2747957e160e9777df430db7781cf85b65a707d1c4a195397cc5a1c1de00e17d51baaa471e6700203b8ee6749b810f8d41761f87ea385fd885ad8c5f48db5d76cbdb26ab5912639b11fadf686063c66479bc1188d324079c8f79d8db79bc07a51afbb5148779330961ac72a86a1601f4c8815d85eed50e8863059969b3c0746af3f03709c2de2d8d729857205cb3f6a7c54df5f6f781355ff45661452ba36c8a04675101e2d466afd880a86ddde2d53cab53cb51dc354fe54eced39eec7ec03fcdf3320fc7e11fbf4d283476c50fb1f79f8495ce8b803bb10ace06d454b61d0e140da6b34eaf55f6550d6bc096a8555793ba1420759021c4e65c3d80768e80bbdfd492ef15181229176fc4c961be62f200a58faac3c596b04163a74bc278b7fbcc409d921228ca40c05309cad2e613a8020f66616e9db076637bf6c5c5929289b9fe2699ab86f0b740efced391d52b0a7d6e40318b1d423b6c2cca08e6bce5f574982d8ec0a6fac045f884c4ff5e2ecd083f1e1955c4994eddf19b1167749f70b15911a69835fb039872f047aa0c9afd52984f541f015fd51680f51265202b47a10f7c895ad600c00b17c5b6a067ab55e07476e7c6b55c8a146f3b80fe216b410bcf68c70acf27e03b0c23bcd5e523b1e962397667e4325dcadf0cd18c3b7e339fe55e8a6d8157b8796134774679fa539aa3da053009b211cddddca966611ed418ca98db20e9ac51936985ed8f23dc5551e3139a03fe87ede910370be43d79642ad34cdbc7cfd93aaccc73a710cd1dcafeaa3f3b3688311049699f0ff901f5f04d22474accbb90421107b38d36765d4e86a849cdc97982ad5449ee60d57718befdc8f1904682568d1c05551a1c9a79d8067ec42cf55a6214c70834c500daea62109a247005d65bcfa86cb91b65d33b4432fe182367ec331fb6d10755eea7b548164bc6d6b2b4260afdd56b75856963f4f7a1d593a5e2ef9580b5c4cf00d82cffd80c311fa1342f9ea1779a466994dbd0f4efad96d2ce204d0838ddbce533b94041c3992c4676969c2d2c06716ae93880c2b7258742e33792a67e7d75494f9f69b399cdf5ab1fc485b57d05c07438315d1501d393ba5fa0bf071f533e480698aa54b7a209a672b4b1806dfdfd30188f431849a2ee84bdd1ad892b761b30719b25098e5379e4316bfdbd127a6da0e471fed7f1c002be44722c5b9489b7512838c1d5af0597b3ed33f4d614a7588de6364b0d634b262e40ab1f4504ca927ef9708041e62f5119690b5512749b0982c16c46ffa2a9903854f3b8aa561e6e86aafa52b95989dd95e6ed5390860439c16177be46ab5a9b8ce948b137e25bd8c92201add408dae29b19bed69eee967bbbe26b8df6d814cfbfab38d072bf510f05b7a707819c900e523f4f8eacd45edecada9b3dc9d423bf59fbaafb90a1874effce389677c2c5e6880ae579eb82aff8040cfb68609755dc7668a82ac114c9d646e673027b8755f7dd87a4aa507c40a7d4ad81da522360c77de0dcc5c252a98c7aacc654f1452fc75b9363909fea03c8bdfe542ff6f89aa4714d67c5565115e08e91f9b0a6f9c03ddbba50a79a8b0d0ca1b75b737e25a88fb78b29f2dc8f73c6000f8b71daa5a6aabf8907b37b85cbe2d1533424de57ea49b1fc475d06215907280da0605713200f79031293b05739d88aa401c3c8db13796814449f05f00b20d93a7df3e6e8b725627d7c6d342a617f08c899a2ab538ff5a0f88126da426041fe9d569c2fccf6cd272e87d2543a43932e868a8dfffae7415383d303ecd4475f0295413de1d9a0ccd7ec590a9d52dbfdcc6a3fa50e0cae8dddb6fcd05139aeafc88f4f1751301d0359fa2ec2b7ae0a6ad99ca6562e338b1d247a46c2e206a637f852a37ced4dc8681485ab30068895023181fe482804bd53080e9cc1df158409adbbeb0143c58dd413c5be40b873f76e0d3769c4bf920d008e77c3b37d1df31f7161228387336923cc83cc9f0c3f7cf6fe9f8c9f0d376980b2521c4789153bf97e39e3beb9a54923e022a196fdddfce6f0d6960d14411df82c2215004dafbd349623f11c4530a373dc5a3403629e96b6ed7bb6aca9a011ab51706b5d458f3333929eb36b52b819e3f6be565ed648a3bb0dbab8000a860a0459f8631512f2d1c21fe36ed4c356aa2ba7aa3726d95964ab3a2fc645143488bf8781c9e6a65ccf006450127ae8bedcff4bb1556fa0d73ed05d8fdb6fcabf8e6dc75f53615e6134fd6cbb197a0c158285e2c5a6bc626c798baa4440bff858f0b33879f996f62cd809197031748e817bdae0efc9ff65f48709f6856312c32086d8c5d51b6d3a5c15302f2cc7db83ff22d836563f5219a38676e8ad831c1f0a463f8655fb30db1129edaabba831fe30da2ec6864dcced13c8a2ebbb282ce23e536a35eb49431a7d7a4ce1d374f6ac6afe3a9a2ef5aa75e404c3f2b85afc3933e27520d9e29d727335fc00fa69a66c6e16190f96d58c29383e9f7326cbdb50064680018f17324a1bd3ce5204212ffc06aab9ca7258a5458c929f3ec3299f22bd262722827560c83f79931044729b612d4b30f150ad884a15fcad5db4a6791de12543757fb94b6395d34e76ce469a4a420428f9dad67a0ba34a396d99c50dac50a12a0d1cc63a20db3217e6166aa214ae6dd6190dcc9ac390523b2b9c444031784c8a3a05c5658fbfbd3b8c4fcf12be4e2d4a515bcce508ba340009e09bde6c041fb5b62d5bca54fb7baa8a22b78b10dc4134a0968a0dc012ac14ecb8c3cd121a43d95bb0d8c5e545785ceb212a92bf374760c6e4ed82e4f6e3a61cb0a802e4f963fd14bc56587c317ba0058a608b088654417cfe8ddafca2f683f75d9d441aa46cae0688be57a4db40dbfd3bfaa4b5c99b3b92cc0c79230a1820674e500fc6bee11af3505c27ea5e76a0e8e37dfed1db7f0b53e75ba4962550fdb6a6ccf5ca6f7ed68edde40c0453e3a9ef04d3fe71c8679d709ebf55b0013b53f5b3214dcbb3432133338e928ed5a0fc89cd3a2440f491b108365bf5c91cec753c413ed10663b60fc8a76a85d14467f1f9e7b321d62ddf80e1aa58411bdabaaaf63f28e2749f6a8d7f68698ba10586fb4ef4600f575457d7f4d310be52e9f52330d262a7bb697ace18f376876bd4271bce1f661c62ea4cd465318ed7679c30182698575fc844e63f827218288eb474018cdf3f790300762bef4b32c84fc315acd8fd7d107c60eedb5c0383c6d81a9a40f15d2aebf06dc7e64cb79f63d4197d88b797f156733ff785f71bb9f34b70abf35ec3c5aef3ff463b422cd37a670ecb5f52dd9a980123d11f9e53668522a4c0b725455fde377f10112db02e2842728372a214b10986bd684e05c222bbffb4b67857e0dc20c9ee84eb65d3edc3cdbb2e30419017b338c4c970ebd27e7001d52b2106151d864d8e864106b155fc0491aebd5a6e3da4209f2b68b21e9adc3487ff637e44ec0fd8e0088c1d144d144beadfc5564f149bf882d5d7394ac777979f7bbb367f1bfc8d4d59b19278eccd378b06be2b8dda941585bcba1477f10fb91517b129d7669811f75bc6b37811c8450113369b29288a9a338f3c2f1aa85d3c149d8fb4e123f95e339c4fa6988779da05ecda08543679c4ca55705066fbcd4bfb96f5f80440f89b6c707edd16f6d200a6a3b66e3228b26ac67fc7704b0583aa4ed80662b6e283345f37c59cc26a01d6218e7be1794327d2ccd59a0ce8c22ca3e54471f0f525598829680ad9bd73862ccdd53a1a1213eba6c92bc79e438eaf30b40a1d6841e42f2e36f57693b2016109f58ca3532af3ec0079cc5c9326b935dba6a31d18d93d804cd2048bad922beae0d1caf0ed13124ba6cf1de6c68b3b4fbdc070bbbb10f798f6c35873184848cc441cd1611187153c512dc6c6b1bccd46358c7716a0bcfbf614a162e8f30ae037fc593e627914a24cf0a94eec067f2028901fd7434ee0ee24113cec32c46ef462653079059329446fcfc9188446889bd5e47f201ffe136cdad7309322868a9aa7227ae5e737a8b7b6c54e03aa96d5a7655e154b7d8dcfc5d8b5804e00be474ffe933412f84bcd1a5abbf0a24cfc79a3b4a39692b3e3851d88409fd1427a12f6bd1b590dade66de57685fa4f9f391b60ac92cfedbeaec15f7ba8f15bc8afbe031b8bc40328157a77f2c122ee41583cc0492bb698e3018e9df7c6272e5da0064db4fe8692495eb30448357d6d32f9e86b9a31657b481a124ef3d31d92b38b353daf193f2b13ddb537cba8867f7eedf9c37bc1980ef80e9bc21c4d1e6460c4969660f1276a95e1fbaf6e3e3596b288b8460bac474ee9e4c120887599166e509d5d7ab3618df62b1da2c0c2020e2a540c68aae11d65e2b6b58319427655ac40cf3dfcaba0dfced0e697e4dc3f63282c98eea629823fd731a218f21d8975423109ef7965c80275567746bd6b6a4900620efd54796041c8ebedf797f155459e9c4cdd0e5fee53bc25641fe15b4afacbbfadd53f189ce2f2abe1a6249f505cd0fe61e312b7ff881c78f429e52240e10fcc35493ebab9e8e687cf492cbf29bae1f20bd34d0bbe4c1de3e293d6258ffe855d93e603b44b4d7ebdddb5f80fbb23f49a27cc609c2a0fe84826c406f8d5f55f96ded9fe80df6c4fa21bad6af5faddefb98263f3e15c270db5c9298252c93074d2c92507e10028a25fc6c43034061509f06aa3ac308891c82557f5c4f70a458c3fb1c62e720dadb7abf5562b2855137ce7115d66717399da992f29c4909370b5701a407b461a452b436d6aa3ef3891b25dd83f11e8c3030bdc4c50021ddaaaa4410b90d305afc1b2a514333d0ba9eaf7edc9e3f04a118599015c3620129b2f7a918a66d073afa7b5d81bc2c3b2c2d0493f5ce6432ab9fc9c0f2fcc4fa9522e2b2f8353de4198d73212f9c8e5a40a0f3cd5de071cff7736b69b564f499ee5d7a25523790a75f9424fd0f586f49eee472523f901ebe1eb8c662bb084ba5b46f2e967889fcc2c22d500988a80e12c826cb5cf295448de4ec1a6f8c5e9804a5d30c8093513e36891dbace0d4a788faa451d1bab870cb77c2073ee9d058316ffccb1e93ae75c66167acb8adacf0c9e824f9f1dff3a25e7d3a4580aee5237bc111d495985bbd12338a0cea12a8c2bf179ca9b1a5bfb9d4a935e57ec29a351a696f6da791ae98e6ed9c34f0eda635f1fdc035f672768dba787ccdf97fb1b641795aebd369266ca6fdbd95c62b953414a43f35c22d0c79f1b190e18045807112211a41c473753842151fb571d78db93065f742857e4c1354b02871e390fdc680db7a73d054e9bba17d4565a7d270eba8222c2de371a0d929e8cdadd5dff11a2f696300edfa37ec3f957c85d31d7d2baa68a9cf0f886b20407797c49b496ed409d9cb8b41e8e34238418f6f6e171c97c733795bf0516a095491c8d604806711f081e7b5a4adf285cb373cdc56319d659863108fe6d0d6625905c061fcf47889b9164b45797ea2c4ddc8348a99ac896dbce3f8d8742bb459cb150c4b8f9e6fa309f931103800ad713da4f36685377c5e8ba2dd24d09f1bcb459b350e1c2b391b9b0e04df2544429b4752120a09f35b22286882a9e095ecd791ba5ecedf7ee0e435e20f0230b4eddc0217f6a7aa915df805821559ce60347d90ba253cdf803046d3703d3b7a2ce2f94773fcac0129514f31b7d7e6666a264fdf543884128dc372c2778bbe3336c0a7e3615d9a79c16833858ef2d71ad85b412b123d5180eecfcbc5da2804600e58d065e0d2daa886258cedb6b84a02c3222ace1356ee779144fed50062f0bfc55a307b42d61442c2c61f79c94ceffc32ad5c3e680d1b99a29809cae08b17d06523aab6dc5b939aaf6eda28f68723eb5e947b416b35e7d574fc91cba08c2e173bf89c16874203c1877a0d7f2456c86687c8fe3bb9592902e9f583e351fc2e27932d126d9355c94b445110a35576b53aedfafc0378588a3996e11b071edbb59fb55bdc7ca5ca80e60d339024168b4971145f69d4cac6b7308c39d8c71c23c95332fdaec9bdafe3a2aa9aa832c86e6b0ac6588ee067ff5d8da62d983ff319fd0f05efeb5932135e35406807ca74c4e4db400596955824c430704f711099a0819270955a262274408dd039bf630c94c04ca2bcddf507343292fbbaa769f4a4592d3e66fcb8c83f5c7224be7f251b272ac7b045eb5b067a05f146e57581567f3e863c3676b00b0a84d5ed8c83374dd7d3c22467c8fee560307588cf0a19dfc02df208385b49cfe24d66063230adf0721d28978d61badd300e3f6ab2e7a44bb273b658fb8bc7abe7a2e04fa780de8512e6e4ab9457c3bc3339323a4d76415fc81ebb28f366ad3c759a70ba1f05ec8df644a61916dc099506e815470b6dc8c42e3c7f05fb4c167e2b40ca965e8768a90769cd66c4fe8553b1a6f58dc5e1b666236fc538a7dd282b63b18e352a8c395282c4b6b8f9f12624945b35ba825a97de9e12578219e5a22b646b5db6c9c18ed849ac431d584b91721eac271698648327e118ef0124595b5b1f5ed91003d34c1c8401a9b6ad73aac58d87e741059a334a916eec54e15ea05fbfab3879ffc529ac33a3abda9cc6bba77f4d03def872a14771549aab4b7ef346bc3302cdeb9dd07c1b8e9f1820c0bde866d8358e2fd44b34e30cf04858e45b40d0d58c498e22aa3155e358533a67fc3407eb3e2c0b9d4cf0c2482f0964d6d5a4b666d09f91e8b1ced82e597611c9cac0a74865c9101e770fcc3d317870b514066940fbb87b89c3658074208aa19538e117e8a0f8c4c2cf341ce832cca0bda49f338cb7b7aaa456d86243f9125b7b23e5970a80cd76f0c69d8e64789a36daef18d9929f94fd73e0a02912308359a2f71f3924135064bc3ed4a90e3f0b1437bd2602069c387933590726a62348fe7d2cd077c7eba0e89db33188aefecedfb14897dadd31f394e0c291f80ec16a3933f9578448a345f50696b3e1c4d5078e25130cff6e06eede00c4cc6035b3a0f8b8452f600421c19c4e1a597e825a12994780710b272298aff2674aa787c9a3e7702a1241cc2f4df0a3742f76f123d019630e131efaf6a7304c5ac987569e40fecdf2cc1719b997ac8d757212f6180ab1444be8aef45f73f8105fe71f663e056038056cdb6d1084dc05fcebfaa468cb598a72f0b46af82c8d11213133353c7bb2c5c6c49622559706c75d7dd291754c1ef10a6abe18d00c693bf47306bf2cc29b3bf253d0c2bb57e5476ec16072333f136e1ea2a4dce6e3d1d53ba45dfe5f8f4a33c0062e71449677a75435e0adb8aef2d60b8f5ea54798a596f6853dfb9910764c39825d4b10df599b7dbd19166f3627c5fe6f0504ac94f4ff1c94fbbd536ee3879506c9b327c34d8d60d10c4754651c0bb410f9ebd20710f2d53161f88e95e468c6e75e08fd2e1f0e78ba1d92e103225d25bc6e565871e0b63878cce283770b5b1be3a7949b4ef42d64ea126907786abecd25c644a6b93629d6e52fbeb2fed01c9de7a298ab3de73128e322326a0ecaf53c0c3b6f26786b547022e70516059c503288ce5f48c52404dc78a5b1c9e828ba328e54310438111e77e4855e7e0ce61034c8294d95ad43f5d4909c39176e00e896c5eab5e65bf71e212715c8380b0113202e47313972c7d0155c9b7166ad5ce02591c3c8f426fd25e1d1fcb8ac9dd690f935ce528d14b069b26f0ceedafa1f19b50aa350719f08f4037b07745212cfebe5e23fd874041acb60ac0b6b8496e217ce501fa9346c2ee917f59196a8cff9479866fd58964a771ad0d8303654dd306c588e42201aadd70cb5f8114b32b3d9626044284aaddf442021bd20fa9aa64437b663408a21a27bc22f581eab803c492ea0911748dc90afcbaca42a1466b556c5e6ad19d631829d6b7dfb1064c750c613891fc30fe68d20cd17f811716978ae7c1f8dae4568804be26bcfd499fb887256731db232148b569c80557fbe1806028c8993cae0980cb340345b971aae40b8972c104378a17bd86738ad2145f7579cdeeb148fd2b76ade974a81fed0340253ee0af9c7ae94b305bc105b182a8a45ddb35a860a29266ae14b3c876935c339f6f51b6cd112497381f1874e96c26aff5e00314b8925815a13d3a3a536d0f615d7919abce0b5b188a48fda38cc9169c4d8dd527346d4982987c04426ab6ca83ab931ad724cc43e63e6e0eb8582c313c63118d1e661b532fbede58e5fe54977f5a4a5ba5ab7b0c81a8c3561da45bb6d8e5bf983744ee548f5d4b8a3b0bdf1cda68e5bff2de79da05491bf6551a3ccba1aab65c024f4328e6fdd8e0219be3c364ba4bf33d34b38afd8ce5738770f69d85d332912ff23bb4a6407489dd25d61bb0af56a13f856f4bbbf62df3166f3b997f402d959d7e082d6af83a250521f42a3c00db6c3596cb71eec09ff15677ede9783c132b2f1b2672d8e3c199ff768bd4a8466e1c262801aa1b71e0bafba80469e13c05e46b0dba2d1ca5f6f9bb5e46321763a73f787b95c5e16e9e26ed66a1237079c215d0b38bf5b7ce68a8b45b40d926d4dcbe7891c2e0e4f1eb778ebfba570083f5ffe4a5858239c150d674aeaea992b4163a6c093aab11c4eadca9681c036b2511c160b5543675ef34e99606c8b3562b023656a30e195a5cf343ff9b54a19526b28516ab305eed9992cadf5c3e776e603904f4c3206d38eb2ee82f8f4c1c0535d5e9c5ec56b55299dfbfecf5952aab932cd98b5d38ec2f1ccc3d37aeef2a25590035d9394c1b0f1082b7c0f2bae8ce57386e2976648142d1355cabf4f66deeebcf8bed225c1b8f071b8b715c71bd1472f87c6e0cbc0686b6604bb6efe7ebd4b75494c919eee9ab7946e374da6472a5f08a8734078c77526ac1c9dee6813612709b307149d1813e521cbafde2600d0bb07dc6d489eeeb491c56e5568d2cd9f3fb73dc6e13a2d7e73922efe340e84335dce0879e0c9ea6460e19912793affccde4bb388de55e801f9185900a3b725af4b446ddc9128c0578bc83c6ad08d1a1a3b2446ff4b4d6d5fecd171d106967a472b23c24f3ffd63f191731697a55bd9b820a159c292c379214de372c2198c99e9764acbd2bfbcafb150c1716aa8c5764e464dce703c574b96090a44b7063130a34862f21527fc26d093352890222a8ecde9fed88aa680cffec791712a6a3b69e1618387e029d2e8c185808cd76276e91c7c064c6c92e252b505e6680d39498fdae5527ae2e53b25297719352280de387a834f84d2bd233d79bd678da94f60c113d6c41083a782f24983086deb5a3f8ecb12705e2ca03e053d61ebe8e5df7b428253e27ce40ee4df9b922ece307b5039b496ebb79dba99528d8ce366b538f212cd7653b785a8db2983829c3087b90a5bfb30ec4ee572eab7a10b4b8d9a2a77f371847b28f24a7729c3f19442649bb1f10943b698d329b95136149f417c2d8b493c7b1b6554f0c4c288acaa8b6be29bf17ed7e6ceca01593c6af8c6bf1dc343f1496b386aac519ac1515ca1a1e49fa59d4b02ed46eb333c75a35e6e50b73d7d0803c6e35d8360ff24d46fb36b46b15dd20b7621c6c075a7e604f6fd2296af8d743b1ac15028c75451c8fb781d3467864064d98480d4703693bacbaab2cae8a0419170c32125b8f92a048f8f5d7c4236d69e0555f4869524131f20be7f9f7026aebe24f4a559246c4b8bdc0199ed5b7c58149f2ae8724efbb8323981740bd9cf13f0d68aeb914e4379022d1c118ef9060e4dbc0f4400649be069d219065e7ff542ec0080eb3e94e60efb98e74afdf2fbf962caced8cbe505e4abc6338c93629bb55691727ba1b27065b91e04a3a46fa5ca040ea266b729db5a5bb4483c76755e7e3080b1234ba3021f7fdc34284604be0769abbf975b79df9e16f340827f407a12fad8c0d0ceaa4b2b04d0cdc8b2a47bb6ea76f2144679516f34017f43529bb4c6cea6f7c3136923b9c8a2d7096da7249ad27372f2195e528daf1e6e606fb635a35f3811af4a60795957d2ee5562af03abe4f983492eaa9e0ebdc1acd69517bd10d002eec4e75319856a59f38be4181f53564dcceb9904b6218c5aa5d39ee1f77eff24a1795eb2dee47656355612456813b05ccaa67d54e4231792498c15a5a943997ee3a4831658aef995d3f032dac5011439562cc0b3d227f4007616b65043f09064bdd58ffe84982b6d9792048eab7be72223ff5c250c50ee8e7a1a611178716a41b1646b0a707bc4d8e53352ea4d9b0f74808c64a0672ab4ceca241efe325058fc027a3e4e789f109d7cb24612338ff5cbe81d8e9ce2b55387b616c98c3a01feff00946318468601fd0fca49c0b0cb6b409d8b23acb29c05d4238e29160718d738de7ca062f5241b61b83e3cfac58a01e2c895516c3b75defaa4834502e735645d8e7583d0c0619c8f554f38dd29b094ce14040cbb7dfa372ba6f00670be7d4a130e9c716e6c44965d7c1b0f59dd7bec47ab97e13b22acd9f1f8dd3b3e3e80163333dac1b1b66f9c859f996af76d2beeb3d36147739c169691afe2efab9f26f1373793b1b60f83d59f2aa956a460599ad7225afd18c9a6424390eb36c48a7afbaee433ad21323365828ce38e1ecfea6af40081ead7a113cfdca5bf6e8025a3a282288111ad6c4b511bc41ef6d5efcbb330c819a0e4130238aa5bd531899ab9ba3a3d5e05a144b74fabeb1183be2f64977e4977b11b1faf8ada4a52383e2170a8478751306768005abee38678225859fe2b6dfb79751821e0a5f0f8337ed8cfe43020563a9ba1ccc004f950657422cb319f65f185258f6a44fe68f2a5d0ec9e82776e5527f5f9f7e29f73136e088843e3c1d4dda39f6060ac1ce619731c763e504d63d3bb2bd0bc6432df1267efd12d3d4836c3fd63dbce77a8f14c1df4efea36550539cf5d1888b0d97aa1bc3f5a3e8430250ddf909c8daf293023e8c3c777c31845dcd97629fc8818b33947c7d24b39ac152293ed631a8db999573e97b7740ae8b0d1afa2ae489bcc13f68af1bfb3ca14c149512c3d0e5bef51f55b70137ab3d89b4ed424865ec999c8fd52084ef0e8fe67ebeab87e4e1c12c08dc35c95014586aa5e8bf2733fca21b59ba2616b94e6a849eeff7f433ae01542811c4165a73eb9a9417b2d74ce466ee357fb7491fc9f29d846a78d1b207e1753e9a098b9cdc88594631710d05c9bbe4948c147120fb6b69e0395218c72fd0d8eef5f77977678b6262fa667e2e5b8c6d954e748a25c9aa0407d14c3c2595da7d292a427390af61ef80a64f8a7b8fb3567ffcc72780daf30e7abb71392ae796711daf8a5f6362d01acfa66583091041132e883c0d08389a1709c93cd3bebe0b8b5fc007bb13303c0611f7b0c16d928cbaf4ec4f944af148a1e670c96ee4ebe9d6e4ef80aca6c1605d34fef1730918dc03652c5d1cfef6f6dbd77dd25f9e2c9aa21e2c03594960a439885c175c4c5b52795e4648b9d5464eb79a7b74502da9ee72078c5cf957ff4a93483378b4c184e655ec7d1758c88616286c8066d7501b602caf3e9d8183aebffc4fa8bdded092a0b73c194c551ec857dd54068073813e591d58860f721b186b3240c035804f351a26913c2f52c841dca06c1214085e088df7f3981e7ce5ecd85bd56d6ab0ae0aa60b83a4c8672cca8c172309702331a713661dd8fdcb470fa6247eedce22927b88248f4fe4f2f07eefa16b80b89075ff7528bd0c03d984c94aa08a0a495cfbc487266407f7be0cef224a05ac45f3be95fbf9337e03f1571096c56166995ff9c057f4fdc32dcadcff388aea4a5b0a97675ec65e97295a84a25575389a78c5ffa0ca858d380aac25dd2dc6c32de63e38a6e78fc5fe8d1b997d3e4ee67ba93124d6d91d33c5955793fa89df4b539e7160c57631e294ad8730e250773ce47c9bc4205e5ba548db1c29a42737c32c1a678b065e7d5c272df9533573ea5b9d6cc5ac9596eb53d150d887add26b8ce8841a4966fc90a0cb3b9efd05e7e71f119297e401b825eb81f24b1a7c454e88f0d13fd60be7f10c04a4dab0077ed6dc1ed0512f8ba46731589aba5ed87b7689cda1b64f22a95c593c4fd5f29bffecfe4a3c18d4c5f96692b0b7c52c1b82ff448cbe786d8277da359b5c4e3d5b0731f19bb493f737547f9db486640efd324193bbed1d0d32b139c10cac857ed70c6f97d8ef940eab31d26e9f9bc04ae29eb7cdc3998fc2020df2568c3aba7f74bd78be00a6839cd34d766c9344c34b65794d3580bd52169239c6f84c62c817a25c13bc278f033a524f09f0c8f87b452d9f9e6e88c1c8f9e22fa7fdc035fefc1be5c5b0989583cadd38ef1f93dec1506c834d9f4e77db070b142ed1b01404d40ccc7a404bd9d8e4f10f2226ed65f764987994d89d9b31943a44f22f0b6e37340f21e0869b03ae6c51ae1c5a7ee8d4815ac64392fd7aad6fc2e269ffb7d9c50c7bb04433f2434d71f886fcaa737632b64d09b288e09d5c38a570c1e88adcd161b558628f35269365f11719a402d8888f7dfaad7cc5c07a6708cacf8d8fada086710a4d53df9cff01e345ca2d375ec6670d4e445858b6b3bfe2d7ebca772ebf89431a2430a771648f50bd12dec350e96e60e4dbadbc92ef6406f10c1fff51197e3206c7fd0433e099330cf4b5b5abbd4e1e5329fa535ba857b6475266d3802ee6962ac984db894eb4f60b343f2412562fe13040ca9efab20097e1d2fc447bc282b0a859c1900d76dacdd88cd1564456b74b89cdf49f4f01156619711d35c6f4047a983f97098b1ef3231897fcc7d28fc9e585f7891f8ccb335ff1bb8d5b79bcb65cf256e54308d42b725d9564b74ac3e61a2f54dfb34abe37037ab37f9e55e8d46ac00b528c45109de3f4de2c8808276dafac3b95afb1af5ad5499f1068d918eb3bf0f4f145d273c7cce4cddfe8f8f14433d41fde85a3ff4cc8e043da96051640d9fa39eebda24f7b831024166c7c51eab9c341b94bb6bc29247045d07b8a25fa997032bd75b5d0cac8727521f87d74d1df622544c5c130bee2d455cf6b072d10b3a0d74f0510b3a42b7ad7fffd85f1df22b9a9f4af15703f3d79e89a4a188de1d8381e74ed4da1d03a6b94674d55debccfbe6dd10a0cfa85b59b9e8eb5038133d4360d66836a12f5dc98412d13ff5d9b85ef918a94aca2ba6882b3b652b831a88e839ca69e4ff5312aa7a4af0296d3f879e83aa6a9bb8674290393eca2be1868e5321663843d539c5a1422d9ace02863849eae87d15972ad25c4ee81709db3b6aff97aaefa25023244236b3e44f8b5943923a6e914ffbcb37a500f762efa4c430bd844331ff56b3290f7405885024149c9c7e26a74687ef679e983975ee21386b2878c7387f88825b6005d1a1c5cf11d593be54dbd98e12da1d82a5f03ffdceeaafbd9da3d51475662571d00eee63d25f60c9b5965271787b833847bb939f13ec4d68ac985fdab81d991f53223fc4c5b7ebf824070505b7b8826874cfa767402729454b0ab8f8b2ab01ef6d910480d50172228ccbd13420ae4758f85db6f70d767635d56e97f1d2df52a836b4c4340bc34eddc43ee0e8090d89e67e720fa54ca15e869b0502aeb8e38862dff39ef021f237a6433daf15cdbfec4f3a4319a8926569df569e6b23b37e504602f6d5a6ad0c4afa66f73adfa24d5d6e6358b617d6e94b6d8d11f184e564627a7523369106a629c0fbe4b3d8074dba3276267d5124468cb75d5a3b29016a9924c0166ae2a97b89dbb154a542f7ab1c97a00f9641d37555ef4acf90de41f8fcf2edc0a97394d4e9cc2034610f664d3736dfce8365f6ff42ec1b1f0cd0bcd7451464dc862f98a5029f9fce2c0658a42832e7d9090e565fffb6f1ae0f7773d4392d7eabc24a5610917d2dd625f05e49f6391fb98245c066f20e0ad1091742ba8d577f0541623e847ce8d91ed1079a18986278aafa3683b33956c2cf2f338a29cb57489a691bf31ff5da5d73f3163ec280f5711d065e47dbe146fc356a7b8d544eff691c7cd9a4e2992d4627b89565161a873bc38df493ff5c656063533787b7f7acb67b0e2b0d7f6fdbf05aa5563d33220ee65a2de7f495c642d0af6c2f49dffbb863946b558269503673031339629da8aa4fd8015a20a7e8486203fdf7e3c4101309eef29cafdbcb3609cf3454ba4db3ea5032d05e92d9ce86349275cc7aa8365cde0f818e85fefb722b78fde51fdb1788e853a45297f79cb467a279178ad7b2684b4b675b296481accb5a7d45afa076c3735d3149843aa20fed727386779319687ef5c0e7ac03266de24362474b749fca7b58dcf5a67e0ee547128d827f37d8a2b0da6aa3745a8e08b94ad0ba0fe97ce4b6283816c19f7052b8cf8c61274bd0d16f2c8d9b98026f1f72ed301ec4b0b0880fd2b49881f4d0589b7208354a45a7ea855b3776efde566a9b6e4ce3ff4ff93263d69d0efe82320a3aaff68d0e87fed8169f4b2cfa07d6537af033ffff14f3ca96e364a536c92eb282ba8838a4ecbf41fae63def518964087ed08748cd33ef1269d37b0050bab7501ec79ebe8843045ee25780a729874b22be0811691d592e3006e55844a0cd3d9e8ab09666cc0214516d946c23e9c1c1eee11bbe1fbcf194406e20ad1e902fb9097be5f22eaf85820243c12912c6fb13f051b03e19edc769d3d1eb109195a00194ac8dbc78a459fcc92b98e471463f44dc27c154f062b1203a516beae406498a62e86686ac6cb0e09472c40b47aebe130835652633ace407a78e40f9ddeda0acec90a566d9292e470e321557ddbe141222e352e7c8c237880aab56f401899f002234d395c64a3656d244b2efd491caddffa4cb610c739981c98a3092b3e93402d79d40fcc3023c53abfaf85d9fdf4091f59073e94b50b6023b19acc9617f0949bccd4f2d5fbfe510ce684a37fde6b648716fcfda42c0338c9ffb57cdcf0c7d681d286a22e6a295b981a6ece788d1406c4f511294e4c8ac9a48c9d9bc1fd10c260df89fb94eb0ed9f97ade17ac013beb8073d992eba0d51b50e4c13cc4dfa935969a781c29435c22741133276aa99786c23067b1a442bf9f6e7bd11ad954ea869687912e8341743cf7447dbbaa656a069c06df660950f5e3ae84dd1925fd2b5bdace3be5d729a79d10a281bbb07ad3cbdacb2ae5ea6c217383a96ba208b2881eff177f6d7de5b232a9be07cbdefc2edc53451a8ec36bb33f8ccb342af674f8aac31952c4778447b0ff20d904540813d246d9aae2feb86fb6fefb963f17fd086c5ef0703dffcfbff49ca9c00f441bbf13a329e0d8857faeb093ef1711b4947443b3d7a1604fb4fbae77b233afc7bf1404b0ebbfdb9705369ab42658c40b8dab198859d8cb5583f228d4e1debf2a6ec3de8a5f8b13ffb211edfa2cfdeb7f9a0c00d3955ffd199164f102081c4cbe39943f165361d9bee70156381cd9032ecbcbc375e9ba5094a7d3ad265fa6038b4aca17b35fa0ffdcee4ee84be2096c9b1e76b6fa15f9b3155866086ca05ebdad0178ce567a508be61a57d8e9096d818c0d7df238c3edffec17f3726451cdee5a78b53cb700e3100484003dcc2b03e045103b652c4cfef56170b3f92951d161bb8b9a09dd048cede9a00fd163966eea01053c7a75177353aa7a56415e854ecaaae130fed91e192642180c4898fd1c4b02559e242496c02a7cd0f152e1e2e4de3adb47238a1d190d4aa4a4400d5f2852a228ee2bdaaa0ba2a9751a2bc464d18bbfab9f333088d3e40e3fb481442cdaf2f6204723d440d84d9713ecc46a4b8d9d8f26c0c22e4cf0f880c7f427f881b86adf9f927c973b2d0aa492892f4c3e73de21b3010c14b0f16ea3e934e8071e16f1fc6fef27dff3fcc4f996db26833c4d6c6889eed3416a194b266cd2e464c00aa7e8196805eb4850380e3a81c14f592c0bf41596ecf779edc489351537e2a353ded297495708d069443e80adfe459acaa10691bc506072efd750944f9b25c95f1020c67218f3134a638419e645bdd81aa352030e53c81ab7555410ff4b1871ee7ee0aa98c1e505e25340b911a69b0c9fa76a0e83b94b6276ff09ed69449f16c45381d202e08a33a6dcd8d2f697656fe482b41a330c45056540826b5a4b7bfbe50f8dde105df9dc11c4b06ecd90ce1581051d4d203a9b0589e5680f490ba418443f1c4cd51c8316479777d324c913296bba29834cede72ab58fcbbb7631a6c5f714524ee587e8a4de7067517a03ead865987351397fd109b412c91cdf782af92cd08087476f4cb365fae619ed04319c5ae5bc2f7ed7d6332f324a58d2e9c83d784067fc44f2981cedd1a807099a9571ff965768dc75a586ebc0184a68c9bab8f685a446d8fa92b29df3c23e60cbd98fcec92c7e94a81ae72257a3facc639725d88c55f401d33445712cd82b247660d6c6fb2550cbc64906711405a69cf81a753b45e5ed9095380428ee722428c4bb084a88d82b43fba75c3449e299a731fc13e1fdd17e3b222843bc108c6b8c0432fa09563915aee2ef32de87116ebdbc4abef52c52c458f5db464eab0ca40c3c523eafeebce9236fd821e62037ee2b76e3e246b52541a54ad738f1cf994db57b26acba503c8234b04ce31e040877313c01e002d73fc198f5ffa4c7947442da53bb9419cf0d93e73333c3ca9144f52fd1a1d49067e2682a820a81240af713354ce5def651a0239c2b6da9a1a4a6bd70678d121f9ecfeeb0a52237f8e122a14a6234c5782802d83b45fdd7991e965c5adecee8ed94dfe4922a9e8dce094d832546ac791ffce8288b501d631447fe30dd795f18e372ffb4c3b94bfbe3604529f81c7e0b68814793338b386d1834e1f561a2b2ddcc0f4124a9fb95b96d7e7592d6a0fa402a4fa6b3e5acd20ccba203d274a29ffeb4a1a9f5a02e3437a7e991fe20bca1a40021ddd78fd716e5f54a923a16858dfcce93805a9dd801fd03f81c5552d2ff6a78ba3bc81f4cb2bb431e85434c5891e556aac7d3858058000de49d59b957dc44a03b06b4797b2b0e8e9c1ccfccc6304250c55c258b2f29b1c79a5e5863f8e1047818e9dd052f55cc232bb32649351cc4b3a940b39d7d5c16094a313aabc9050673771f2508b9c2a0718b9155671d0d5c48587d0e6c3c31f02de52e34a18736d540697a2184d85d92814e7d4af2187235176129702daa945e5eab8059631e1da280264d0e8dcc47bf0d2452ed255ee0a1da4844b3f7649bd737541fc419179474acf083328406a96b00e99131617b69b3ff0f88ac497c35d81c42ab362eabd90f20417c6a5d00db18a71f09676dbb85cdd6da93aeb7fe7b31212d1db0bacdc46576245d67194bbdfc4bb195440978bc7da33421d8a95c558ad41f0b81f6e284d7fc0ee14a8dadc56a546f98493954d16a86abfa0348e8d3ba0c157f357dda99108769825e510007202fcb0b9df282af8f3be08886158ee7db6f5f7be1c5d7c32eda9f61bcdc8063a95b4d13893b8a1430d659137438116cd5ec7e57270b066e87f462052186b7e00651523f0ca99783807401c92ddefa0ad640cacd08cd4e01e1a86fbe4a0c1ea2beb75ccb774cab18fa462691401323e3cc610ac3399b8ecfe5f297f13ae391752ce272170d6b14c03d630bbb88823789d896f09892e2f103b358d0850712139e237d829f6d151948abb14261d4dc2c959f533b0dc4abc84756873825e27daca7036743210bd2c8c748cfaa555ab5651ab26687b4cea0df1d37821cced95d9e46f06537241a555a42689b50672f70439b191eaa0418b1fd0402944bee190605c2859a13d401550f14aaf56c7b19b46098f5dbd17bff7ac43b41512fc99892f0aa025d124672a611013d8accfb941dbd08d44c9048ee0c7a1942b2220249ae7b2d9f0632e0e3083744f116f94157d1e9b789b9941327d351298b77ea9b59fad9adc19d88e889017864a67031a75073843f9e4ecf9e75a4e08ba4bb1293e708f2bce6b42edc5ef8407df8391723468bc68bbaf81ab45396bea12f906e732ba075d6417f24056c7ceaeb968deb60f9e116e5ad1c9b314af6464ef5c72c1ca2a5d16ed4cb9d7e638f0098b77b16fc7763bcf6f798407c3ef77ac7f9a14c1cf18e5e6d8aaf6313b94e876ec0aeb28853c94441f727a09c2da4a035b42e3ac4b881a278d3d30b831969b320d72bb3111cf3c9171b166a437c85409671c34f960f7283a70c73a8b49d4f14359613618cdd514219bf296a578ccbdebc7425ef8a52566057bd2b58dcd877c6dfe533d31a2ab6317e023386d8d400d02153c08605632c138255e1ef6c3b3ed7fb11e1612040c9acd3ba3542100830a37436f49d962c3b59c384d0d32acceb5f0948637accfe218d4636e2de5932f1c50ade5647f218cb53167b7afa6843615043684e5c4a8554e2ca0990111afdf81e21a0d285961ae150f2c04a3ca7abad9ac89d57715e853a90c1df2c10187c142682448e0d8eee80eecc42c165fdc7be344138ee2c45b99da42c3f9049cd05c2eeab2c114ad9c2530f27415f9b2e2f89cef24ac0028aa6cd0231c65a1bc3960d2306cc47d6ef43744c16ad3ebd0006738f43361977c8a135dcf7c629f3ff4de5f41f5db0089bd7e6ca978439764841c117530369026cdec8cfd82190caf0b9a5443cfc7c0f12badae400a232fcd45465c3724643b41855e2f14dbe0de6e2dfca80f9a50416358e5b2e609fcb1ec0572b44c36e2b64f330dd5b03a46bc858cc427c83c39ad8011a1c5d790302ed600438648c6406e190989ad02b9cd01df9ab90ceefe46e9884a3a336d25236b926188dfb3397417d38c66ff7df39b6fde1119a8dc14b885658b45f7cc209ed51d3189484c70984caf48aae0f87b783f7f326ee8efe5a0302415914b2b0aab619f30a59b8f60902b023101724f0e2e128abb24930fff2aa0048060fa71d899119eb138d2bd0b21c103258eb81cb2a2f852b60fd76eaec1bbd59b104c6ffcd196278726c6381395122f31d8225ed07825fa9d82b2fcb245b5b138709d9263031d5af6439ebfcb4da09fa3c73b432df1f023699536cdd26253cf91566ff68ac084ffe79023c44005073a6c0df35da09b094b269ae26ced50c5b6cdc22d07166fb1a7938389605abec7d7d131ed15420a85a1f2adcf90bbe72605a86beb102f423db1df38877b3fd0ba93f4474dec7ec905640bf32d6112a384fbd663c80231cbd89ae227f0de4814473b8cf7770adc2d089b109696454720d39136cc254c821b98b5d6784278c576619cc87fd4cf6fe13b5b46623ebdb8952e417deceed0daa75d39c36ef9fc17d926b61ed052eeb50850501ac524255d8950456e427adece1d9445c65230ac24aceef2a5284ac4c95a66adf79451a881ff6b7789630c2e6f5e6862d8a942d73c115b8342159942c751df95b14cb75b8ffbb86038467c0051396d83ec2c2110bde9175c66331248ea0e9f1ef61cd92c3ab11171c5de1d8813881b3ae6e54dae37c1b507938c3e4c33b002dfe9c37abdecda665d7c774411982b6c6d2210750953e7c410dc54ae527730d3c93ba2c160f90a488e94b8e6930a1e03a64108bf0b889619aa55cd612b7b7f5860d615231e69341f39f054c85e15e256b90c7a90b3311f2bc349b08fb177c7a4e43dbea0c7c9ff3edde4590a6261fe84327aa0e580879b81a294405a8e0b1d3657f4ee680e710f1e5858bbd54b85705ba1afb6454fe469d6e63780f51dac2b1c663e69bc5b1d34fd4210c1688d07cd0997fae63fdfd62d021d065df371894983f0d96e79b4781f0e1531ee7c4bb14c26ed1050f91baec395b05d0a546e1fd5bb6dec37801663d5cde64234f561405e27e5a7618925f48803da6b527a5a301a12a703d9c9f89d8902d64dbdf259336dd6ff05b9ccc9cb1f6545a4e2d405a5fc3c770dbcab7f2b3dd682e3892f03b030da02eeb8d15f20456380d2498c27ca1cb2ebbe2686bda89f05fabf9a46216d6fb9b7dc524a99520aa00794078b074a8250225280d2c5312df4dd9d508286eec6b66eef93fc0534128f6372e097276a50403b21bb1f2dcff1d1d7a6eb61f789bc6f4112ed5afabb73375da1e3fa8e6e8abdea1c7ef1c6825dfc45221494cee9951b991d0efd12726e72cf69aab09f9b18d0029f6ffc183c33ccb89f9f669030366061b297078d02d8c53fa777ee8bbf9bae938f6a7c04dde426298fa0e0d47862c73c72ba96c8b2968fbca2aa1575a6da5cffec49adb5320f0f0f0f0f8fe46942a9b522d1bfce164bae7cd970eec06692074a1e2912595b5bae7f959931e223f90dad0b889b8d71f2bba77b9ec30b466ccd7a2c206b8d616915f6933cd8fbb5695fe55baed9c505f63e209ae35edd06fa7e92e78bb10316015cc3ec3a406de0180e7e959f0d871cf734e79c57d6e39ee4812e27b05fd662552b3ee17e2e57871f40180a1cc6173fa08b67adec0c263167ad5ac4f54ac4f52ac4f57707c852f75bdb0d2152023d0fcfb216bdb80f2ca2798d2ad0ccd69c40f8c82f0c6d45cf0c39dd9826109456d7dca70044d02542f95404493a7cf13c02a01d901ecc2f935b2000a20577881014e111942dd94528b31958e697d9bd0eece21f0614608018f11b30938f26b780f0d1bde41177e1171b24f40a08a184946e485814d17577b9ce5dfffe6c776f4d41409838b2a564c92da594b293e058c8b9db30b75d4f62879bc0fa431971268e8886c5eac14e489c6034636026aca685cdb0583b3b3b3b3b3bbee33b2b2abf42c493e83cc179606056fe7396af288b3546f7cf399f07ec9e5fbfa7eff88eef787cef99e7e2d8af7f6a80792eb5901484e8878ca04889e5559ee5fd61a03f5d798e495e05efb84e33ad371ff559f445dc9020564a9428897e721f658da172e36f7443585ec5015ebaf13c7c05c7e3e886e0f8952f52aa2c9ccb705c4b909667f996ce655ab267f996c7c1b50471e171bc0b9d9b70742dd9b7748ec2c93a1dbc74e36fb0749e44467b6e4cdfb9f151855250549aa6d2549aaac68d1b2c362bb01f65b14e2c2f81bd787c94bdaf6afc0ff47a131f856cd8e07b838ba5508d1b2c9fc27580de1adad7e028a7b97783f3126541d24541a114948ba569174bbb58dac5aa71e3060b666333baf5c8be22362b1c9754382ea1705ffd400cd05842c9da7cb88dfbfc7aed3d4c85e3d20ac725eebbba4f11d6495c61b1583d2b2b2aacadd5ea6141d28a935e595159e1bce43b9044593b2c16aba75756549ac512d122216f49713353a6fddf3152ca4c5f52c952ced92d386cd73aa52e9fb02f739aa3d7ff63987b3648ae31709899ee60e2cd4045222c58d10d110098c42d2f6cdb9d03b84eb98ef412d92cc1e9c10ec330c3ec10c2830d33ecb018292630304fc6c041164f70b0c4c9ad529372eb9f811533b84172ba1f0c121ac96d7773800c2381a744bba3fbd3ef4e8b34c81002f494ae873260723f982ac4d0b9b9b9ce2e822e6e9bb0af63feb792b89e11f6f3606e4a07060646ee605ba8215fcaf7804820061d5ec0c886ff10c2caec637312f60c4a4112d651483bcad5aac4c277bf32b60587ebf66377a3dd8152ee3961bf974ef048e6784b25fe5a5cffb8c331f1670aae3fb4e198f9cf31325be29e121e655a708603a9453522059fb64516d7bff6674b322d321c5423ae7a3f1a840c07d7613502daf0cba76d71f9a58b3b204fe3cedf405f508a63e4c3bf32fecf79e454235549401f459fce3927b333f30e9844a3eeb9dcc1c3b7cf17295d3be68e1d1f17ae13e03ae8fd3b0792b68f5b0fba84f5b78973ce39e5fd78e5dd3e29b114ba6ce0c29efed74ceac103ecf9675f390ff0c8bf074892ece2af030befc7abeb735e3fdd6bd90dc4eb5dd3a76e934c1bf1ef1b9038c6f512fca204cb70e297ecc6522496a14bfc1d7600f129afabe6436339b6bbbbbbbbbb7f6c668622482924516aad48f45f79ec208463a04621c94b308e4619a54f3484cd484249154a4430259628cdfbd1543bc124205a38268ab0b0555c8fa2c669f0af52cacf0eacf3d8e1514bf08bffc74cb8ae048781c376bb6bcc0cfb71eb54d336404012e6d408fbf50905fbe4521eb1a97a44da4829a9dd91809067834872b5c23dce94b8ac13c592cb0c616f4de5473ae7c9463a2114ea8a943e980303035310a7f35b67cfeb9a1dc59298de1cbab2ae5b8fec6bbca08728a779cfdb7a6436b89620367ee5576c7c9152886b0912fa955fe986ac7c6845e545d7abbce857b896202cbff22c2b5dcbf5a26be557545670d558414959a961e7e7f3f9cc1595aff141993538be2b5c2ca1ccb9b2a23279401b1c9742d5e6f2c03c9f0df9d069d015545d9707a830c4a52c4e1b73da08cd396dcc39e79c73dab0119a6da3258d8d396d84e69c36e69c73ce396dd808cdee59c3bf0c6e6186e12e00470846e765dbed36871d61ff7eb2478ed1e3fd2915b02e9b7139958232fc083b8644b9fdf73c18187b5da2ae6c0496faed22ec676fb4d61e39d140e1c1ec30430cdc64476c7618237347991bfa879f637ef896ee70f0db4f822e49e1c36f77fc41c27ede75e8799ed3a0015b2094343e7218f89230991a7944e2481d690365134892342ca5a49134d9fd248e94524a87524a0ef6902ddb492e1e2e6920894b9fc4999142766685bb7886e35e8fcc0a29cf882fb31cf7fc71dc732af8c5339c2fa322cacfa8a01a0f2c74e1c62869248da49934474e59aa22a114033df8088646f2030f6d72ca3d29a51e0dd38a39336de669de4c539c1ee3148249f49dbb9263a677b2055dfc5b929a5a25d8aea3c0c2d69d2dd992adebb261c3a4f2ac73d65a6badb5d65a67ad7563e11bb2ff52668309a694fdf7c29d5f4feee25f6d6a927ae767725386eb521a520bd75f9ec134f8d72578c4dc0493e61462d224b9dea5e6927c3ee34cb4f4f9cc4b1ad712a4bef65afd22a55a39a992aa96fefada7fb84f2777a08bffd6b5f46b5deb76f65927796a2759d3de50ece15fd775595a91549b7a9a2725982451cdf3344ff364bf7a3a31b9fe7549d750e3a4ed3fadde542b5a86b875320c4df298248f29933c26c9534f1635ab8d8f36d0ef43a7514f9084c447d76358c6c512e57cf0a559f65e9a2748aa749e4eb09eeaa99e6857bf6f92f78188cca558f7d97aaa27b638d46d164db0b29e6b55d98a655c4b426566ee71884256a391e5892184f2b31f9d733e9c964372761042a8b9477fce39218450328c46bc40031dd4b233202f403d2016e8096805120376b7483ea79818e0b24eea74bd0035a1b96e2fe4da89899a4a70881b62e3459fc20d51f915cdc63d24ee6da8ede64ae18648f95028e5634c49f9e66497c241787dca757529130d9775b4d8b9f3d6c40dc99dddd644f5d9f978719d5738eac46a37ee692c96e43e3bee89ac15acb6f2950aae4026100f9af4b1812efef5fd415d704cf651102dc182015d8470fd9becb807f262c77e8e9e1c3dd71f540304b2a00d4bf92f74bf8f6abec0a2bcf65141978f34c1eedb71b31418c15e3efa349b8fca8254ffdea7fb3c900ae682543beef75181ecca7e5acb069240d8c7e67a0a880907f201bffca05dfc1d44052788920032818ad0906b957b48ecf7515dff8feac3c46f307d2905d41d880948e55e12c4b89f0652810511c12f5aa4bacb3a5ad4e00046162dad9585ea6a2d2d8c689124e5415ef8a83fe5e3cbcb3a4ad8dc9ac2818cb84b4aec40a62df4881d6807b4d2b901eab24e16ac172eebdcc074412a4802994caae80d3ff13d762022f845bb2013bff817f60648051a03646a992009d4a94c57278b1c9d2c66404c9cc42523d4dc0fa462e2a42e710e8a30036a729da337c47509727e9ba91699b0a015880552cd23d308cdf539334d53a6a6dc73a9731b4208391093d68e809a80b493110925fc28638c90e6ba0909fbd527d75fe59e5726d7e58c853fffb5162469ad562b9381d55ad75f6bf98f37ee6947bc465b41926682daaa3e99b936905455d0c57f87ae2c8f88755db3a93daaeb2d90ea03a9402a1afb815420d5f507a9402a087b6ebf4083e2010002d618c6187777addf578581f1bc7fd1d57da25496839d3b71f8c4cdc373fde78e8fa617b3654862fa52fd8943b7898303ea688b5d5a3d509effa317f4d92ca5206b3f22d1f6af799e6337d4ce32acd6d8a06e7026e61a0aa0df40df9f9963eceeb842e1535e895a841d0f7ea132b0dd276b58f723c4803c2204952777e9cfc1b122670965c10d19c952b66c6606c2751799f2dc73c92eae8363cfdfbf2cbbfe2d9918d1479186371aeb5f2133b3e45c321d254f68be9ae92c99c9644a67c90bee57b32f93bd29c07b63c0c5baec1e94524a2965a4d8a494d249299dd8d7eece32ecc2e691d30d990f13a1943cd9a8bc40929239928944f9f39c73cee99b4d953547aecb23ed29b0b725cab31b1fc9d3e9c8a926943201b6c2b01d7cd47d0109703363b5497d1d4ed2fec361a1baaa9d04dcabec39fd50507843c2024c129d34f7cea0b9363fa04b10dae74113c3300c03fd4703fd470369bf3d04b4df3a087c1ed4fdc8980802f41bca5bf973f3e11912219014841441eca37c10db8382b08ff22dfd4140bf7d1094b7df5b4b773a807e7b08803a862e1040b1dd8e4f6b871cfbb1ea8a56da97764012a76d2d4086481144fbcf0f017541866c1d63536218a519670d3f178bae78071f6518bd6a6cdc5b92ca7c7301f38a397eb6ca784c473231649a642d23192b7372fd39ae563a622a5beddc2f63b5628c31c69dd42ae5ad82e0c17017bcc501bc55f6c5f52e5f5486854216c6f54abf368675438894e8f3f06c95ad2eeec36e539989747053da2dbbfb60fa3b8a217aefbd9e955f184c62b84c93961b617177b7e8e0a58d57ab5ef5aa573816ca2a3b4abf2b260df1273de32e1f38230459b8b5cf70232b48da5e7bafefdf3ddde218ece77f6e120272c6b1b6711842f8c5ffe27e586d9c979ac77b4a1a7789808a234a44a44c498af9454a5bc743e37e00812eee2bb84c7ac88363fa3a7f01c35dac9a348f19167eaf787cc47d6786fcaa3599092c44112220562d968fe8183eba56abd5ecf930a1b9a0d96386cf1e61201703bfb80d201a68bb146007ec3c6f14dfc39c60a1e74939635059c767993b27c572a2b3a457ce743a61a31376fe89637c62c03d1e3866cba1dd0339a6bbfeadc3312890947d4bc46a9e9b7325612390ebe384a58dc4491250826bd081655882631ec02ffece8313d6b213ecf2e603d60b8463aefe1c7e692f5c871c1b6c98618618782787777ae7049052110e2cb70cde653a76becc819970e5fba600bfdc32746745df394cfc86ec9de6744ee76018cd6a6c90a06e783e2d50651f60749d8d4c030527c6e8261f390caee347dc88a37c899f1cc9f58f2a56b18a55aa1f3f20a929b55624faaf32cd041a2e789670a1049d5b65db5c3f20c94b3030ded50d6918d4787153228209218912ed86c032c52301d7d6e3fa3e1b6ed370fbe5360cb75db86d83493c421ce3dd3c20a9916097f9f3e327d0c03c2fbc8201eb6877f5117e99df32dacc7c1c4ee2d27c3b5f04495cd2516f6e73f3e3e40d762a33d23e42a3db5d877b3ef2ccbd935b048a94b2efe4ec74a4a698b9f27b903eeaf94fe5e8e54b393b20fc22cfb03b2d93855879702fe2b40a079232c02ef1634e8cf10b306c7c6e1c1a4aad1589fe3d9c2b845dfa59b4638b46489ce1466c091ba56c9eab89ca3abe0a2f8c91631aa760e17b9cc147ac73c5e9c60712756e5c318f7351d1d0e971ae150ddbdddd10429713c6aeeb6e06f7206cd9f83c169092a287dd8b0b9d7bf7e0ca08acfff7910727f909bacc30890774914f8dd823352f1259bbf32a1184301402e15308997be61817dc57ec78c5972df179eec07e9dd3393eaa4b52b5b5d5f6f25554b67e6f9a9396a675bdc45de7cacfb20e53d981fdb42529f7a47bf275a0051ed68116565d92ef28347afce6ca18bb3e7263f41a277149e3013fe6497dcc934a09812ef229b55624faf73c1e3fedc033fc44a9b522d1bf17bbcfb3e2c9ade1b2ce0c742ecb3d89b1c0faf716bd9cd5eacb819142384608bfe8c082d5d1f341526577bf108ee9db1dbc5ee386d07eebd69e37edaf4bd3beb9a9d53ab5ca61afd18bc1a796a5a29a15d5978fe3dff3116b0c1ff574ab9fc8d03fd5f4d78b875fa7915128a9c9e47bafe3a79229aa94524a2550d0580221dcefef55840541177ee7620c23720d32d535c8ae795a865e02bfc48f567ead2103858536fc1265f7318f8dd87b53ef3e6aadece29b6e9449b0fe95c6bd23eec5ebbae6452f7ad1ebbae4d5411af7e24f78da6a2c8cb1141fc616be5fdf1863a492068623945272c7d07eb6041365bf08c35f7b6c0bbbf7ce9b77d40596089a2be2542887ca3a362358fe4a863f19d0392e826d81000c42b640c07f870876a908035d82c0210f8b948a94bc0392b5c0b6fb10127642b80d552d830938a6bbe601bff85b99560c8a5f6414ece29f53825bc5f5efbbd9d8cf5b2d488a3db1a7157bfc4d903469ba062e38a6bf87c02ea9ae0176bdd332f87b96c1c00c60000000404bcbfda42925a555487a70ee274222f65c6fe950c65b9715ac7fc31d2291e7b5ca552ac8e32d95dda1a93c83b582185578028aeed021742ccbbe665996c5d8c1f8007d4716b1fb9d95d9d8cf59246d7bed8b94405fa454bb96cfd72f52b25fa4d4ef2ccbfdb01b475776abb11f8cc689b621ec27ba0d4dee359cf9686165babddbdc05142919409172fbfd7df0bdb1854db92df0533280e2f2e623e57601c5f531bcc79d38cbbd1ec27ecebafd1b1396871d3b3a00b90639cade6df7f110da81869da1a3ef0311999bfdbc36f083bd72ebe1575f2839b803735259476ba121eeb5bbbbbb7b841452482184437c804666a6504d91eaef084f1cc54793191de440e7caae057365a6685161c5fdb87573fb87742dc302d163b3c02ffd7e06cbd0580a2ceb4861e47ede72726f904023540a26f7f316eb48a173fbfd0934d566f66e6b7d307b7ee3dfd8c2c6f711e18df179b80fee58050616769f7fee43dca3efc447aef5f8886e48ecc72dc6507c1c61a6c75ebfb9c0c65a297c72a10ccf85dd27dfa906ba753f22a6ff88982ec4e173bd926131960eb084753dddea81fbe10848dc631c99eb2daa4345ebf60f7152979ab68898b8ab81e87bfb5edce48a5cf975cd859ddb27ee35247da0bb1b087ee9e7e150a6f3967b4d6bec57e47a439a1417c0ad0737aca2bf6562a33607c892b4c9b1a13905b02e9c0bf78b3934078b2c270bc2f5ac8bebd916d79fafafdd4de9f56117b4136b7c05f6631609acbfcc8fedc61a63a49094015663600696538e0129278eb703216441b1e0b0ac58c460b18265e7fab3dcb0a8589ab0e4b0e85c7f1855502a2815940a4a05d5590a8a8630c2aaa42ab1f1a10a8a637c8650a19b09050ac73d19dbd2dfb7058779bb53b9b935eea782524101600b00a400a0d39571fdbb1e6e8bebcfa5726c415339965c77010ad7df0516c7f4b36071fd597258a26092a4614125719de508b9840a4a22b15fa835a3b05f0895230a1e816a3c070ad4448e9b0b7ac28515c7600faa028e2838267b1427ae3fc74826ae7f8a63fab3295c0fa142371c238f84a4e09144823da721d4d5491a49c382fae815b20135c1a3d0132114e889500b5405151427e8876c7c2485602fbe7fe8891954fc2fd4fa5422763f1514fd2f501747142d1c287e711615140b0aeb5cb85ed234165f7234c61a4c7c1cc614321a7ef1235911ecf9635b5cffaf061557d2f08b63a91afbb1a072e4e458e223c9826241b1a0bc9d942d2aebf840b2a5642066f8c94afea093f3db5efa018463a40bd12c28aa198e5ef8a267958c2ad58f23a7277a6aad5cf9ab7badb556c6be08e3fa4bd6766b27579fd30de0b310008fe2ab1ec2c8b1afb4010e18d38247574db95cdfda35d3b49a61354bf825a5c3e35e0fd693ba4cd765a2c9d13962a451bda44f175fd7755d317a9b03bc847114ba986c703c099d3613898fe427c98440d2e7a9b500bbf86f50a05a19293e6313c23c271f5d357e03663299289548dca5ffaab199a9cbb324def3606070e69cd309f69336d406096a4e99d34d30b314e9a0343b62a37bb0b71e734a16334b9631e8a845a60ff0c679713ec0189f40e83d0b6a2bba8f60081aec7162ada8bef5882df28f6e3da27b7193f3a2358b356adb16adad01218c8cb2a56c31c618a37b9e0e1c90b3b1f5f85ea557567a05be5f98a2a28556341b9bc88648240aa5d4108950ac482402893e9b4824124096ca52b7b31e540bbbdd67378410c62827ac812768d3afc44a39e3a4518b3d42212be2b194526da270e0103d4b74ab92fe5a9558fad57debd1b63fab5a55623f7ab56e0821ecaaa4bb21841042081b7655d2dd10420821840dbb1b42082184b06177378410420861c3ee86104208216cd8dd10420821840dbbb93b7e1ed0b9c8d52f5ca1c6e76e88145f92f810682ad0800732a5f8b123323f0822f2e35f1ddfe0c2726976527432b163e822c1b05c82e1a4845ea2fae0eb43a7717770039b7a790737387285cad2044bcdf59d7dd7eeac3208846114c0a8b30bfca6ce9e7ca75956c6d535fb9557cdae325cb853249215b8304e243088e640d26052081e19803d7ff8f300d294ea418eca3d9f2a601777c972543e9a26f77ac0a37902f672727220297b026764ec40f81fa863ce7620eca6c9f6705b01d644fbe9ed69f211c7db1d6f4f153089ce24ae3fbdc8a08e51b8b17bcdfe69201c609a5cb8d3344dd354811b1f0a91ed4cd096f93577b029a48963bacb549c0dc1c8e597369094a524113cca76dcf38c0c76f1a71916b21574d9f151c6726f083ccaa490ad522b4892406069049973bd6aa72d46593e9239ee6d356c6cbc7d333298747d8685eb7fd51e2d7632c2b9f50032436de4e6bd3676afd93f7136e7b0f8456bc2f65799d9244a66e62889b8ccffc5182111ecf147e8d349cf0f6c27b093267e611f313337c4010303568199638c0d6334b1fc1861c7182f2122c708bb2ca7bb1b3e844a884c8852b2a47442b21a65b37202153b086186e2008a05851659784df8835484cdf57f876c142c8ee743bff8c3cd8706220787d5448e8c3178384dca96e4f8c88902285544e51c2d6344b5bbdb37da00bfb0637823c7fd682db0de0ce347762e61c4214281a849d98dbb78668345b50f2846bb9620342be21f016e13c1b66381054d9029dd7043d7d057cc41a78c3aa926f7eaa68cd00798461a37c7ed152984215322c0edd4e573ce276ce8b28e1218e8e014875042821b1b60a189b597756cf0841d1b10c1afb0db651d1ba86c90c2626709b3a38410bae88a0f4531c6f81042c810724b90ab74bddf245737240893a5a4c810429b054312f69cc44e8146e8dd256f4193b6a2c96501828e1e5cf831033338a30a268a6002ce1360584108d82765fb955cffd8d41a19c30917480cd14413967cd1f2c146412dabc16043854aa6d4efd50075fd7acb32e21588386275451a2598e208191761a193b32367a4b0352eeb3c2145ff7b09c851e9d4e08cbff1b24e0dccf028c829a5ec5a360cc9ee6ed8ddddedd121102e2cc22d077867d67d22d9bd108c6379f560c129e667d95f61c0581f7b2f061c71cb21040c61867d9d0dc85ebedc72a8c0bd3ec344586f0db8e65f9ccfce3a9c004cb4a98f43148a4b80e98196f2826788398b30024b113d2cdb8899142e8c484208492a22c40cb400238d2790c0440c5f95c145114f4c1d0c68bdc20c862c27221824dc95cb3a57e8208b5a8dd8fe2f74ad467954c4db792aeb6887516a53d3584788f28b09a4166d0f1c9597c39a4a7dd40db3e33d26c98f9141d0653767f749662e1289b8bb18a3fee6a2471689ac6d66666e2fa3720c4b8be04a8c8a7c7ac14e8666ca5583a2603603d58fb66ddaa782328ba1d01a57ca0c491b51057a5f166611ddf87843af627c7103c6a8458ee58aeecaa59c686e49accab5712947b7242c63fb3dc618638c3146ca7129c61855b41863f4b02d078983dc72d87208c18d9f53a98f6ef00d967b57e6a6005aaf8b93ecb271806e0aa0900ba5dc8a6990ab716b666fd5eae773eba78234c869b7a26890cb6e4dd12eecd6140d72f4d690664383dcbc75a5ae68220d72f056968aa3e5c607ca1b4370fd3b46e80e935023157887c9027c0413bf3661bf173efa02c7708f0fa24768717828c6181f09995b411e22597e1be218be0c755c771daec3232565d87baef513d77aaeae4687db3cb99fbd99639ddf706e938a294f452b2e99b8235950e3c3af1ca394524687e1b68c7b40b8071be607f760ad5ce4fa57951ea95205fb35cf630cafebe1d6e39a576d1df760a7dc834fc6d553f28d1c48e9fe9a0a15ec7f9dbaa27bbdc43d98c3c3254739f7321cf78eb01ff78c804930f0f3a0ad623f384908ec198ef187f27bf0511c01bbc0ffe141ddd7376c84adfbfa0517ee745fb7e04215d67d8dc4854f3b46013fb974a687f8c4c6cf82edb9feac7373d3e21dbdda87bcdb550bcccccccc5f4fcf694358d6b9e2e6815c3a7c74fdf53baebffe7a181fc5eb8be15edf0cf712c29fe85e7f5defcf2fd7d7336c3f43261ca1c9734c8f7eee15843c99f6cabb1585104208e19d2d486a93a9656ab5e437165dd0340ebf20210956aeba45a9b5d0141be5a37e39ebe5438b5fe4efd0e44a6c8939414358eef6fd28a68218dc9307b8f2257771a50b8f100cf070819671722590203b1ef520c90250a05e27a49ec13a64ddda09b627dcb81929e093e04bec347c6d643e0f872608218470c3a16f3c42067672080b9fc70fc8fd8073fe70ee070ff7e6633db001a184a8b42dd73535858a46020050000315000020100a86032291603c2689b2a03b14000e788846764e9d0be45192c3288a420801638c2186102003040332a351100086c98a52ad7590d61740d101ab93e124865426838aa47e156ac470a030dc7af9e68c612ba9c5e9ed7ba8101d24be14235d3199ad4d825fb395ecca0aae9c9f214f8f020a8ad0ae8519aa3b2b165527c987de57a815fda3dd844cbf56267811d499197889ce63a002cb2655e53e5037030d59d22933e70e049c804c27b5fe295c39134054e6aee86a9e9b6d06d0703a87088f96b2f1c4bdc7eddb3dbac0184708683fb329060b110f0859bd6ca42032f56df06d41d5e6592430f4bbc940150145e24d4c18ef9803aa487026fc49d9364cf0b4e377127b5536fa49d83dbff450df23df07b7aa3087557bfd522e7bc07fbc0218f15dcf441bfbff464daf2bd8eea76d23c97fdfb90180573970848217ce32f3cda0486d9903f2d4331eb7742c768ad9318bc978ef11645794fbc8a6df23db8c894b56dc9967b9480895b44a2c8a66cccac67f748487a5b4d3221339ff33906c33e817f8a48190e0fa7f1a265fd7287a9ecd05a8511106aea2ad847687f73c8de62673a4f37a4a54be923b786d32eef49091b9754b2e83d515c6ed612575b3f49bc64cf2d44a9e6338e14386b6a139ec4f80dc444518fe08c8a2ef8f4eafc187133675036bc31bafe5785e184b77079b384cefd46c46d21a2a0895e3703c4a6e3b3712dcbfd2c7edc1a4488ab7bbb8a7d35b42d888c58d73e1c78431694a61e8ec9121346273e35c31d7301212ebf4122218c1ce61c86eea21c01124a2d35b42d4a8c98d71c550c30848a8db4b446c84d5c173dda4618849d4c153406444e386778d0383b0eecb29c6506ba172a4bd63058513ba26375230e4f6034fb5eb9f33ba201fcb401f571365b6cd176956b16287be2fd1f8411d9bb129d07d2908d07c9edc0187087ec3ce9b3a1e38c128cf5ceccd3e1839e2f9c622d0748b192e372504c99d518217324a8954cc10271dd395b0fef6917d88a844d419d3a359f554d52e5f605522f43c444562b21f462c8aed6b64a2a790c588c6658839d54068e3d66f33dc61fd5a7c7e08eb702dc31d6ee4436d18a2d64a8c91403d0b72f3c8ec22415925212f7c3b74aa099f13798542a4c093382a284485df541d6867aa2a2bed0bccc72b6ab40225cc071ef36bb21d79e9badfe2161a8a3da9bc48aad2771c14f736612cccef5673447cc5ba074583f788c426ba80964f7f103304c2aea872310cc6fa2ab4b8611ede124f9cee19f4dc5cf1e84d78e51f92388bd15c7958b32a5a894b12faada39ebbbee08a2ca8a0490d1457875aae395fe031bf6bb1123046fd7e2ee6066e7d8c230678df0794c9135b85666596614dd5292e73d8ccfa02a4db633f47580f9bcf122669b29d6d9eff8ea6d7d7b284a8647755d8296fc91cf5360726c38479fda01bc9856cb8d1dcc4e9ef24024341ff33046a219e97c971a3fcf614824c7f7548c3d36ade2e43a8db811b903d2095e9fd826b6496bf848b0e29c2b10548d3ce0221a6f6100c40a14c20f6ec9bde602a35247d9d00f2f9c7587754714e9c82f01049866350d1fde6d28353eb843340255a8dc9cc1d7ae933bb66a743e0b1978df9ac3ed71115e18de894e09448e0fe91b49931511f8f894ebc19a61a750744019a1206a8cc27928706c7e56662d6ba3e1ef65f163e5ba0fda7c4e6c2811dceaeb653de1b612db97ce8452dca1d38f2555b2c14162e5bee8d283d93658da3479b42eb7a59ce4c6759c94de8ea508ddc0f1775efff53135a94e7d36e4f883c09050fd4fb58839450d9e74a8259e20a157f6d7f88d1afa956fd7a0611563bbfb040f541ca65e5bf7b8520df72dc3e5ce6cda85a30a01934d68008549cd6d8c9590fe425ab4747c0285380b23ec8b75552d2ecfc7c531501259c86304812ac778b7de70d1a25d2eeeb07c6dadf35f87f8fe46b7714959c30a85b34f9aaf55ca672c296133ed7e83443d243b76a6d65203b7dae3350380735425cbc7767dbc30cdd65edf6fa4ceda1d2d3e8304a65ac09ef73353d0b4dd87b591bc9fad9ed0ea25ab71f200dd6283395d4a955832a340730687edabc9f6baac6721fdde17f22e5cd40396eaa6d0f80221d8c49871fd379243c6a11e6bcaa833f369c6f282d42dcd71101e0a08befc11218385c4a60396c3a643499b4bfc3d7d8b56e87544b73a1d9925c17862f852176563a027aefaa13017b906a936a4793f25a8c2e135d6f918ce003048e63642e2ad7fb325d634582c27ff12cdbd10d7f2e81af15c3ad65c4e92ae701048c832ec2f54e94e36aeaf3add007f188381ff9a3abb29882b1a6b0d9372fa566892dd6a85d0d27a17e7cc0b0cb1546125812a82b31d1c60368d58a66080c57affa674d9fc7920923868e1dae6940f9bfefd2776ba64a7cbbeb22a5582feada52dd7f79af28f1c9d85a6b235a9d7b1b62eea25df7d70bd63d3266563b90a5032093570bc87fffb3f10fe12f43a6d8bbef4e8c39b64ad854128445b1439a29ee8b088be8929624e8865c309edb706de0460b5de32a2621c632bda4b9fba2c1b2872bd4db8b330602ebe539f7e0294fd30a6a7f02b1dd6eec77f6dfba35d1f2db869f0bb8204441dff59a2ab68f6e9fe9791bef1af128f09c48c04d505a93c95881e455ec577acdc92a044ffc777a6112c726a83226b3e7ff94775d6a8cab983ba6105c4ab8f8ccf7b7efd566de330b2f4aaa12116f6b727920baa9c22a29fe0c10c2794b7a0e004692fc1269eb6206fd8f720069b4fb97e1db8a58664fff13f5a212410b72479fc72ec0927c69627deb5f943b34bef718d8877ad3381abb491b638fba1cb5eeb38d2a69d06f3d1fc1ffd2823f1dfde39d898c20699f5bccf07a41a807b159368d7e9431bf6cda516db7069a7e9d41662760dd226d695c0b695200bca0ad931215e43382bbfe2c896278a014481bfd7ce410cbae8d51220c33dbfcd187a948761f2a3c96a91cead0b17ad5576d8d15dfe3b4be82d61838ece372d127309cf742896cfa84d684bb020f15de50abb3e55621bc2002d0d593d88b1cd2a5e416e9ff0ce34faca564e300732c16b9d4774d35226c7ce40fa45e0b5cd419613a4f97f972e994bc7717d15eef4acd9979267c274a430ee0a02e98b18e6becc2536cf617a442b74d877664e4f06d838edcf5ce9039e45c15043fb7105cba6494dcc889a9601b11977b20b40dd20acbe2a4d820f4ebb7093742d24a5b612230029f4be81d35d7619bc584590b2e44b85cf253b529436cd8d6746d5a612035dcc5c3c3bd43a5086690490b8b569969fd6e3a209f78dfdf6a3f2bb3862606a5e651263bc97c0f143450ce91bee8b09a083c2f92921963d776356eeecc22930a926bbfbdaef581b70a7e7d9ac2dcd12d88df4b7ff48afdc7a0488f280bd94ed965bc797f612a30eb19149d9a11f00590c1496b6a70339ee29b04c9431412431914c2abb0c962f7589930099431ca2b024e6e0c15bf0c916178f107dd2643e4af5695ec94fc027e5f930512e61a4a7341e7aca4a64945508bbe7da3f47ab43147821d1c7bd9eef3f795e57a06147e3b8eb494d06af6b96bade9b57dce80b6fb32e5c89a534b6891e2f7a2fb1db70502df1f8578c576aacdde53f654bb1e9ce6f5145b69e1ef1848da4015cd18ba821eb435825c003d4310982374b43f09aa373862aea26ac035aef2312d4b4f4247460481c68ffe6f41be02b619ba376111f410b4aab47bc2c59379925c2407f5db658acfcb6364e7d2e896125ab9a8e55e11fbd1df91ccff5f0339c4971a54559212a0ca04ff7762f48be97191bca465220f511b127ff65bc7999395a5641523c8272e4826a069bf0ba90b30175a79ccbb2b298f395b7e72a4941cc0293824fb5881b8b3266efdfa8fcd2516f8818c4e00950036eb877a7f4b945649de30758f0a965e227abe25c1b8507d8f0419f9e41318ac1b17dc0bd40966546fdd3622908db3cd04d4ff14ae7cc28493ee26121456b859a1e2666afeaddeedb9bee03c21ff45e6fbf5f51cadf3d40a30a85071e9a340550f40e68bf5e11fbfdba9e95025a873b385000a5832d8070822035b864436e8664862a19a9cb134d404191135d4de595471c4debf11f4e09849a426d1b35426210930b45e99a411bec73fbad19420092b3d474d355c321ebb272a2e085e396c30afa78a1d512aab65ea3e08c4ae15ef0009f4212c0cce4efe977da0056ac3be0c7430b099d8a708f2015500a65c9e47c2d070986b1f422b3009e551bb8fa315dd0b4a797541e12e017b9a5066a4c419734bcdfcdb3e464ef97500535ea2ea69eb8bcc3ce7048dc1f8304bab049271d9e4216ced0d64204860ecdc1ccc79761c78cc3a2eef55091e016ea035c97fc251da9c294b82ce3c8a9e52bb38279a187eebeb5c1ddb8b3404cd1757c570abdb6548d1332881af652b0777d85ad6f11c0387509cad6ea03f24d657c7eeb844c2966adfc1408c8af952f408418edfb8789c96b4568412dafd62cfcd81df661195170f59918ce12323fe2fed0824e6a833a869c367a307341b3823c8ce230306aeddf8ef9bb3eb5673798b707af8c8e06e195c0fd40c638e2b580e7487b680418a06e423a699d61c1b158d7e786c86d03ee3d275ca9558878a98cd6e21eee309dc154a603d097928a79f7ac980a5ddc9b1da676dd6e3f1bd17e5a286434592f9f864a75ab261bfeb84611608192c9badfcc43616429dbcd45281b5f1cc889da7004589ed7bc6398e1cc43b3456f0ecc26a79529abfac02052dba3b2b791bec356840131378008622aaae594bc253156a975853ead7901236321ab6371187f5ac1c6f57746d53c2ee483c499486a1d2a5628f563307aad8b4c0e28681c0f81106f6737cdbe259394e8301886147e998eb7ff0e733ae3310f3628ed81712c6436e9e48bad735af8bf4c9e2d2cd30ee49bd64f5812f501b7f33a2a547b23989501bfdf78e677d5c1ea0d79b3a175536baef9957aa352e930e0bb220aa7eb482ec70b6b668000f34fd733600a6c8eb46153c8b915ceddc6d22866de7e3edc15b5c87386ef820ece1d6ed6a808fb6e047c04cc86d2b850c445be16cb9dd8fef7d34d0fe506db688b058dc22f681406bcd5babe0e1cdbdc48ee40059e78c33b6f54e18c91df1dec5e674018647233d5d779cfe8e3155fbb07720520d82d0143e22575412d872504812118761a233bb5fbb777c9e016342bd81a76a04b08c00220442c7baafadf68dd02346989eb87d591118e312290b6ab364014e3d38d61ae087ed7a95cc3237c5c87ae755f6cf1a4b978095a61b16dc928d5ad7c1ef9532811106a6977a3c1a8e5013b99386fd0a6e2324c65e5480ccf2467016edf2314df6ce545356ff662c8582555ff1b16a1404ef1204ffb99428e52c3f49d55ea6e13584094c3b7bdf604fb279cba0cff41df044ae0b0ec217bb72d7c65385eae96c2c9a4781d86cfdb197595770ede227aee4be50839ea8ae9b2bc61870f866135c0cc0d98a8d823f154ea2492fead74c32b91192562959f4ad47d2e5f17dba75ef41c2d7891b3c7adf7dcc1b20174ed74c129b6d0587c591a436db0a0a9b2349ecb61114867392ed6c133c2ca724dbda2e48180e49b6b14df00c219f5bf87da5ca504096f2fdd41aa01bcf10da3e19a1fdf17abc0ae186ff4504c3b52eb5f17c7abc599e25aeb9170500185bad96d926c234620e84634bba03eb318c41ebeda0e5ec77217b8fcfd55ec92fca8eef74d6f743c2390b7c6a793ea48f3d39e91638606d8f32538ff25919be4d0cb2eb07d3285a61b1fe992f085929dc914893a0aaa640abd0add90f76d098a1164cf63960dff8ff5c2cb045cce1d089700a44431c245d96b62e2ec9d8b69e3070fcd6e8ad70787591d5eac121254ec1ae959385bd8e4988a7fcc2980f74a29c1b0b05eff793885b36c9647e3464c9b2b26c9a2e9c8386d772a2035beabb01f333fd4160481f9d6b4528b70c23c0f9c65a5e1e9cc0666540b1d7ed33a1d19b95f9f6ea3ee0f4df4549d9f94c32b6741cb5eccb8ae2408ec57560adcf1131d192da3d0fc12a0ef5fb3f018c7e81f4a9606e47bd38b0da5bcf99df4b4460603231739d0c1c38513a18efa341f75845e38b4750f2b1a05e9c8fc7e2e597f2068ee116b3df57b16916ed1129add1e583d2b78dac4f017a6e69f9855d5cf33bbf6e29ee7584d6a839f9fc900dd0e16692350745c158a5381018b2ef02cb6f029714a4878581bc19de8b93b63064dd38989e9187408b2e58664b950329109428c5a2ee1aa972ed4892f05b590f5605d4a6947752748fbf67f08b0ae8a6afc23cb4ce1f44e8ef012a7fec36bbca5ec02f847d16efb43680875d4154764a5851df27d75d6a24a19efe5f21c4f9af255b826bbacb2b706c4c732b4d5aa55b6da1fb4ad0ccd9b7078b0524b427a43d1d10e881fdfbf8163f428501055305255aebd32873a7849bb8e52a68e4f0226e3dcd3c2b616720c2717d86d873090d44624a0168fda4c014ae83df811195bb1939d99ab3ab5541416f60eff5f84142f38312b23d6849eda542abd48565e90aaf8bfbb2723459d41c3c13635b15d006b85834bfc88d81c30286f038ac8ea734b82ad5c1a2d528d88b307999de771be5030107bfc6eaa3df4f65dea1d9d1d30ae11a903d983f49919f6e2c895bd0d11bd909345dd801c8a04f61a06dec0c4f9ca61b5eed455c2092d985ffeb02a5bcd03c896931ea4491335b37d661d7fb43dadc0b48de9a53aceeb83a4414041a1affdba914d46c7dd2b096f9d1a9be76b67d0424422627c2cec28c0e53c29a8791d0461a32d4be2b8a2d3750b501e1c03e3b30649a9e7330f8399d2182e84371b9ba87548c8688904f5cc0d35e40f5c4e8e19610e0230184db2af45b4bd7c9b4ace4cc6e046e65b15556397086e4a954dd40a29e168218ff896f81bd93fe732d1646e67a5d9b81c2992075cd534578eebbcc3918dfb172e77e9b2b1c33fb1dd99458fd912ec4390cef662b2feed8e0753c62f9e29ee5d8347d967bac50957b994eb49383e9034fd8d4f6b0da4a8e6e53fc42a83e91443640936e58eca35d29fdd9f6a4e78cf10380a765a2403d8d841d3d55002a7b55a45b930360c933149227096b3ac7c42f52dd11cacb286642745433b75668c7e7cc28230922ca27c939e4881bf39d8feab1347d8a06377911a9fd74a99adaed3f116ab56b5bb99255769336f9bd9428b6b650d97a04e63b831d92fb299223933f2d07e0c23e1c7c4522c34489f4f2f603bb6eaa7665c4de1f2221c03a86e30663275ae60f20bc3c06d9b1c369b13585e0940d53694f903730f3d3679bd821735a0471faeadf6fc7803561a9f3dbc012ab494c2f8c56cea0faff16b6fb5722698480da8d2006cbd630324172d05c333e1872bd6d77012d6e568db6fa7a977a7abdf4f253204c7da9a9e43cb0d2c14b37d2aee79a85c1e10305757a804b6f6e4a60b7c909030acf7b522b9dc09d1f08d739e141eb68c88d5d3f85d16176dd06b6e011d50ddd1a0e88766352c3526ade19592f249b5195d16a018da5b11ae71eb49664d6aeba92b201ee603bb8310be2aa7a5946c1803c540c64b8d24637ea851d9a32b0f786c0c89ac504eeab1d5b18f61b30f1abf5ebf98d13b32be939bc7b2b53e26b4ded8e4b764c375537b376b0ebefd9801cebe10e272126c0707a92453e65ec7b3d7bc1954fcb19e81e47b3635ca54d7291873d93c0364c840cd5900589efa1aa76cbb50bf73581f7cc8e8985d426d264af5a8cc98b1905ffd93588c51ca60f3d90992f3439aafad074ef575f512426790ff65ee053704744ec1510b58514e686c5fda458853cdadd3a9a7046b250607e5b11291e789b1415a0d9064cebd2182fbb17e12edad582b7ee157573baea0a608e7112aa2bbbad7f80938541e8a202570bdb6ad130d571ae0dc6aa5dbc2dea1a963cf133ef6eda617febba9f89ac19dedc16deb0bb96f511fca7a451e17bf7c4c3cd1c27c8469527881c8dcf0570889dda247375bd35cb29da4df8193205cdf0d33c8264a2284f4a534670f5196a25fe19ed304e4bea3763c9d26e60477001e739b5558455ed7172984f62f7714ef06861929f64fd257b2bb1e8f83199311d4dba936256e4b0054786b9e57af92f06a3778514b0fadc6ba2ceda26c80a5e67a0c7e0da2bdf5a8fd1a7b5eda312eb777697ebc33a381fa69862c1342386078b4e35e8a7ffcdce6aea3f58ef08008029a60a0e4a1ce7ae9fab255eaacba3dfc8afa2345649f4861a2aa4f22934bc9f37e3295e650bf5aff9057345d3e53fa3122825f67332648ef4388195813912f68e02fcf7e0d3c15376c817a8b742539fbc7dc518145a4c71b842b38c6f924c364b3b9add2a885b905a9bbad3133b1136607c37013cb742abf1c95d697b39c2d05be243976df232a810f7afa4661c369dc699e2a3cf8e3e7be4346a90f5fec93fdcd747b5878b14b2067d5af989e033c6d694a626fe9b7c93900fac67837744ade206e7eeb99b3c402d3792b669ee1763d0cd438d34341463fd04813a32bec9309d0d0de1361f67aa8006de2b9dc0610ef8bad1ad18e457418d3d821ee2e4f1729a49dc2605a85461a79bc681d5941200541a86e51d98ce95275ab6861fe932a85a9057a7371d2137456efbe1503e1122e722f7c34255ab9c667e49314ec3801d281301c82fa225417c4edbb9b8988b8dde0d6ece7545764d18e16ea898fdbea77775f63701524856842f8a28b19b0daea5df5993ffe6e750248af1e6027ced7c2e64ae2355effe62c9c84535baa90780c13d91a4562f03f3daadb1b781f0e30d8da5e0c44950c321bb9ab70becde82e3d1cfe64d1969bc02966bae80afc30300f1d9afee04f850015fe3015088640866411ba6714493b3f637dd6636d6856043f2a365ef654ff002848dda37e45d2a895005f4d23deb509d4ccf868e1ebde73435c89c060e48dc3d1c1eeaac5db455ec38d1d4cd2128745d2bae68adcee8ab221eebcc8fe4e858eca4d6521dbf9bf1dbee7cd0783443fb1af8e027f115790d38a23c7f3425f79beb1a4eb7e75090caa879d37001e4cc5348b08d4abb21fd30eea30bcea6d12aee54d6b835f5088d76ca64f97e2c1861fe159f3f0eeec0b7c0a5eb18774e23ae1ca3a354f74939fc3b10203f2bf9945a460c96e3442021fe03a9613d72698755df7ba8e86b8437de899e5391f098fbf06321d6b9ba7cf605976938f8e0d955de6abc137e837cc713c324e384b843b7c247bebafccd0059042a3d8766a0b5f0840cda63b2dece7eb260ab246589789916ab259546b04250ee54050bbb6a014bb5a5c3b9278b6c693fd8dafe064f43f4eb89fb8adf36bb4ec6ccf689dee315f423e8b528a30ced6b3bb35827941010013a4a750d60726e2721eda70492dd3f694a1c43b4aafc434328cb1abcba0d7ae3945727e96c976adbb0204b8c565b800b3dc8e7fd91738ce88b38830b7fb728426976e335426f07894593245ac8b72619e5e9d9329225217f32147d307012266916eaa61907bd219cd16d366bb690d625bd67a12c2a574715b2c716786fd2528d7b6ff009c410b713048300c48e31e93aae908e16e938aeabeaadefb38ce216450f844bcc4f3f70da3d077c6e3f831814de3014494983038800639dd6c060b45664f343ac673160d043b2f1bb23d605b0f051340507e71e4cef4e218c4fdf1aff3a4b51aa64e6ff30c612bfff2cf02a8faa82b58812ff48469787a3fa3bf1744289f325954190e33a16fbdcf3c69c4681a5b1ac2fe32c064923c561bb80c1687c82528992ba94e200c4e8dd99a32d4f2ac3660fd619c506731eace307b8e3d14bdec14a2dc869dfb7cf02b6452316b3ecd26e2cb06f961d378c5ca12f9dd13677a0d1b46b24f508f02b67f9082b948a848f2da0d6804c6e8a28a31742229d774bba89c3c092eec95f121f5c4cd7749587d37ade9658ff94cc5270ca0455fd5758e924a8e0f5779c10a86ff6ad955812569e319a323c9b532d00a0d853cec4f59d7ad436555e82838aa7b2d5d89fc5842980417d08fcb533aa708865072c9f0e4395927ac1b51c5039dd051b7c4057f4c2e2a14491e4ccb4b2d920d3f7545ce8913f26546bdcbcecb827d1b0a36d7993f3f86f1b7ee628e008e95017deacd64c51519bdd1184a01431a008381b4beb900833e269dce59bc754206db69136c4b4dec9a94deb568b57a803b91cd017860d3e5b23188674f5453f16a15058b9a325092c9b4ec73f284973d451a785d1c545920f0d01d8d162c8af0a7522b1708763471f435fe442cfd0c39bbb27245e23c6310604bd0631fa29e95c0e39a5f439d9941678811385cc3aa8640926172aad3aa2aab81c12fbc2a8d7f1dd0b55144e10652cb583dfde1a55a31d20c8696b6127eca11d3d3de39f8648dd648fba62b4199a97f7fe2012d75201e0fbe1f38aba4e0f4c0575c9f8a4c4c24d7bed166d0f5a7a4764321510717912677fa66a2d0defc5855415dd4226078d55cd7b5033ef5218aea57ece2db65ffe27e3669e3bddb637d4cfee3cbd2914cb76ad0c5899c9ee1c9914cae6a60db707984f42dcd502a60f1c38d0bab076618cd08a5790085835f78d4e0982bc609977bef4f0c48d392fc2c975486197d96f540301d4cde45c170d691dfed5156b40b2c976e577afa1dffb00dd2ca1f5351a9e46bca558c6eaa0f3011ab325f820bcbfb78ec8f0858f6e0320fa2341d27269f3b3ba062fd8311d36bc792e3912f813d53897e22ea5b5a02ac37075f678007e7af2294167153614b116484550b826ccf663214f3c0e2190016c80bae11991a432cb393f7f6ece7f10b657c31a8a8c6db600785dd467554f0ce7f35ed33839a0018f5670ff400fa8ddbcdce55f91c8bc8f9217e8840faf9065f6529dc214c0637d4a5295f9ca6c2f62b5968e2c37d52c8b5d3aceb8ae3c85c7507b0a5ed7bde7967cc629ad437a884e6a3d8a4208d211a1ca48f8ace5fc3cee39342a25fead3174403c548aba9a45ce2392e12d27ce930e0bc8a83568eab69edf043ac7e26c489d834da3400b63079c56a13f71e08449842102f3d48cd8d926ef33c96e33c29d71ec2e483e2bc6ce74487360a2a2bbfcb9bef0234bdc5d4247900e9b54f6c66d2b5313bcf555136c3fe9c151b541d2f3c56963fe5bfbe413554e32491fba5658923de875677e1a69540cda2119e8ca5481cb073a551e73fa60923e1cff071cfabcd16ed8c6b7ae83b889a3b079a38ff4542f90a1888c7613c5bfccbee71c6552ffae8c338f1341ec204fa70050765a1fb7ac92a51ea5a42c7ae0097bea5047a94bd471ea6384515ceabcee6502d06e399af7d963adf942679a798e5e20149e417d3833a72a6de6d782e109f5218676cdf13ee9ed9ab46c2e83fa13e861a946e9b3545372b4705b3673d71352e9b301e98b0f7efd9daa0b4e7b2ca324824f6c2eb4c610b796b957ce06422a0cafd357f1e033c402d7dcee5b226348cae0ee765848087c1efaaaa6c542de8cc4796c05b49c65d0b731c16cbf4e456c0f674712f1b48f7318d52847247267fb3cfc8c5219a6736d1ffa4a1d9c0356dc059f2526be31ab2895428c51a58437142930738810bf9e8ab81c71f9d018da3310d652e53c4bcad9498d5bd4f705699039e4f288c154c823b20a0fd29c6a92150e604127e616103f197896f79d7856e96209bda79740b7fb6c47715c857135a443fc6ce195d76c3f7953d88076b1077d1c267b989df22b69c6868096e7392e4c392211092f0539811462570143633e51d3415a3ecf2a94f6ff746b8d9cfa06ad3326350861ccabc009471a8bd13019a3e3c216dada0cef4a22e1f7cb919ab0c7ccd1e7d5558e0256eca5459825f532962459bd75789e10c8edcf0b2f8b0b67c82b4c302c6370c3a1161691660209c5349b11c5df13c56aac22a6477a7fef42066a79ed56e55097b9adf1f055458f57c32c1b1f3a355a3f52f6426c9a6eb4706065d573270542954e5d335ef946e411c8b6e6ed3a641986c9ea37826be159beee181c843adc0583460acfb76c630e813d5290a1ed35bccb14e578fc6d078b54e22386669b280532d02a87a000453ccf50ebd2dac608632487a72825e41326143e94f0dcb37863426d258f137f05b17f9a0f7a0ae96b6b420b7ae20444d4c54a2b424d9932386702aaded5de2bba5969d50f6724f35c6359f214067ac4fe339a0f4cb8ab974b086a84b0bb45a050b9f95ea834d055abd576bec6d3d9b02846c129b84c9f9a1191c6a5d0364a64b3845d67fdd485f1dc1f7c10931689d667fdb245d3689d02bd01c537fdb300d926b1504b6d0ee126917c0f16cd7bea5d9d2c3809ec470b091c1fa669644222d1901a87a7cb327b80def462cfdc2894dfb6658a88e952cb81cac8d62ef26bb881af118c8626cd08b2125e3c758ee5c87e308b1321b1288cdaae075b0529c1b7e721780de9af2992e144e2ddb604afe8618a643d1e436295c2c2e0873e81fc282999b56220c978096b1b33d96043b9fd7a134c131de9e7aff8c88fc91099fb89cfdc52448c7ae9d0ff97375c068911c9962d368e9c145e73d10ed49bdb2f0ac3a3dfe57b9d0602fa551ad43b15b47a53e2f4d1546d5e70ea6a8f9be0498df6a86f1548f68b396a50accc553fd75a526e672c6203b10c73b747f0f7ace03ab0bc4610604024a20b1cf702e2f00e5526f55dcb374716fedad70f171eb280768ab2fab0b9dc39861da170084651f29cbf0e3df3c0aa50279947b34c1b00e9123496b1ac7b12fd9f773b717f8025aa65b6238ce07331611cb5f13fa44875699b8f7838f736651db0ce950197e813ea8233b3f14f185c47257f0593e1abc0a353f18776f3a1019c5592749eb6b5bfb58b46da6d280ce140c7cdeff81e4bb532939e85a629d22e74d6509ac4873d242673cda20272ddab3b11750027a9c268e5213149d84508c70afe5c2ff4e523dd916228327feaf6c01709382a3e74d016a51f1a7f7e849022242df29bb6321bcbaf1199c659d55a71c32f9092f960277b34a571ae2aee67645ea566f6251c24c6d7b7582f84c48650157cb04774311a009bef87dfac611944313182e86a9b45e6c0cb3cf7d82298eddab1a369f415da7dc42d9561bc448755dc43edc29f0b005bb05bf6b646c01576e7708750f6465a9a30136448fc75545dd562cd2f3c881c276d8ba43746834d45651e6e859ea9baa42d6b43f07a0d308431e11ed8a0561a39ab11b78d6f5f2ca6a7fde2ca3eb26db0b3935a03677e1ba2a82fa519cca34660f7b0ced7f381d09ba218e6ad6de3474c981b3b2255e9f1a5a68dd630d0655325b55309d7b9a36939108d8330c58f8e386fe9b520337aae30d9e37be3273d9df3c2072dbad73f179a990d5ab586699c802d74dcb4aaec270d1d5eedd276289448c8f719ccb3901a9239f10d83430a33057fac6e2c5f1d138ff5a54b9a9a6b7f3c64253234b242c4674753e47610b23e551e83a48493fd61a4a0df8c5eb1c21e595494b0f2c01bd839701ba631174bff374f8e107ed0490ffc8b27a674a65a77ac66bb828469d376e582a7836e79fbb9dc7aa1b2465b3c40d7cb82730f39266fceba6de48148139a43ac5888845171fa5a557426e43584c3c7b9a2b5c6baf06e7223cbea0042f633871462315d052e7ca7c52782c492fc7075ea6cf0fa9d0d2f58b8fbffb554be871e2c0663ed873df6cb105ca78e0a0f2e28fccbe7abb7214cd8b3f2990bbfff7e534014d11bb1c84192038b872b94c310eb95a2893a175b599aec252fbbcb8ebdb7324b19f06139f00c39cd8dd5a19bd92912e2224c72ec981a549886240b38b3b32015c3b40bb3e8f3bc6b30297b11dd8bc0c010bcc85771bbf22d8f69cdadf9be79d014261ed59148fb78a0ff05e64f7b0981ea9e93cd154af2105cc1f7efad6ffd9a80842ef464d3b7489b994629edc34e3b92f2d46cf14968dc7371261c75e2fd29fee804f430ae85a14f51621d949ddc2052e8ac32c6c4b606527aa2ca7906d14892752da6f8a94db2d305b396393c722ddf178f58ac851d2bbd272f464c4e2b6765e0af282f3947a20691239b314f5a750de59a52439d8b83d314c52b42bbd84760212f9e38488764a1f4385182242abde44f6ab5f041c0a6f59f62c2cd5efa37816332f4ec4d707e63d9a0c184bf358b61d3b17312b299602463ebca45de9ca2a1e5c91d84b595e1142c627b530fb0bd67570665402c41cd36ef9d3a4ec01b9fedc23db678c33c4dc24a22082756510c2f40a59495c42716c2dd15c1ce35f8579fe0785d70a1e4c0392470c73a5ca8b50a58554b0ca131ae0e39362cfe0c047ad06167cfa5aae6de065d7ca2829e4cae39035a2498068c256fe5a55f2bcd40c6a217e8fa8095ce7195d585385af557e0c75572f43ccd81cf6cf1574f1570b990a808bc533fa78a179f21628ebf68f6ac0d7ed911e39d037a26397cf9b9fa360cc10c3eca748bdfbc0839575bed0a746233f1578b38b99e365f2ee3028a14778b27e96f196835995749163fa37937913a4f004bb3f7ea06fdcd599c89e1f3d6e71a9816312a99e6e2e815a61008344f1600af942fc7c06605be2bf3d29530371ae46b2c7545a01bdb4723c6a037212148059a14226256145a80b62e4eaa01d6e9617353e170629a15ed44d33de3fcc2820ee289052887707544729287d780503b56899458b05c6fcae5304e757a20d78d150c9a041b16bcf05729117c70cbd2644a75af2b7874ba8b73bfa2534805f33a2af1300abd634d46a0e2c85402bff089f4cbf3ab14b5c092297217968ee6514e3f1edca20462db4ce22dcc98c76d4164312920e8d6c4b97a6176bb8c874cd88156ee098bef5a63346ed384c7e5d96b1d28b6a7dde8bbc4e10799c20cc55aa510654e4c0147920fc86430f4ac4e16c7292b77366380ea67b1e56e58f2dccbc54d9147904a4fb173a22142b6429089426a6b1e0ee3b182e15821fd3ee7e6b6d89d57fa7c75cdec8fced6e2950c1a48ff737a6231ec685792c882415164e12506336678c4351e05929483483f13a5c0180baaa460f4e6f60e044f9f46861a1a7615b04cc5bf0cb3507342b61364ae538766f42e47e6a8e9ead65a5966a808cb6b5cf5ec1853aacc4240018ed7a3cf6b6ea056874f1f6a0d655d52c703e6fa27be61f3b38383567cea03533d857d695c8e986af2d8f392946a978c8165d6d6914e78bd64f9698ca9935bef30c1dfca938ace49c5f53360ad2dceba1a7b13f1b1cd2ef63a7a52712f3baa3efc3bd21db6b0622d667d2c7067d3cb824569032436dfc90031a094f621807d4f6881280d28122c62746c0b4e81b5a796af88d177295ca83edaf0fc4e19b939b83febe694f31840b97a508161bd36c6f74d64f9fd55bdee4270fc5bdc16de3816e2cccd5a148e2e065ad72a096242ab8b9809924e0fc1489a53a13bd35c833369e1da8cc408f3ecd65b4b7903726f5215326d32650d688788f33b5e5c9a2c1a89e2fd11d751b2e3d5a0300eac5bc696e0d31864d88bc045197731792357188c6b130ccb02f1f934221c116b68e0c39106eecc89d9312c91b051adaa6278311abf9a0f23899cf3639d088c6d2beff4d414b3042f630b03baff9d227a80692a83b1338760965470f51d8dd558df76d856535791d711a82a7ebb260312fc096cb7b15d557b34806b269f7cf86486f261039898a777362f0a3fa66a0d1bfec254254e508a0e18fc2200511b92aae5629dfd4cb4cce5828ab0140f739d02de4208ed07aada48164c7d2039ac7e1e2a161e39a1d0038a151efd79f99160b6c2f963d2c2d0c7dc095af6dad3e2482491a944d7f70c37ac14eff19d2ca41c348d8e92f668af536a4cf7bacead5b76175d92f4b507c88fde40d2bde3735a24ab0c04aea020f224c404be780834945ca577e1575d1baa86865306581df4e5d090bce7f6a62e1516a6ae8cd44c2ccb1dbc168011b2a7fc923dbe98fd1aedfd4f67e3b5e1e8f16215b087ae91a67023546a488fa0da401a5b681cdc0f9334f43a2317162cafa9ae20272a261ed6a8dbc3066c812bcd7b825a4359cb1672cb5820153a99eb1647faf2429b850c210141feaeb84695b9515495fa32cfb09c805cd0640eeb4144ea3f802208cb4f56041accdb4cee41cbdf7eb77533332d52d3a454e4f7cdd0b954c8f53ad66d34d9d9686573c17f3f21d8cba79b68ad530351f130c5ff3490de7d96495db9383747810e74feb3f513e04d421be1327f32830b7244c7f143e8bec0285b652fd2c15c0e594f5ec3f50855170663879ea7be890647d79439734dd4358e0c811e5f7c8527bffc6212b3e6f694493d973592c005752484e1fccc0a115645e7eb17e9978fbc948878589c6c8284254d219405b80d7ab12d28782e0ffa6885146504ec3a36c1f2d08b5c2702705d85adc9708a8e59397c62d118c9bca08b920047505c47d6af5cf3c88d7ee09e098401196d4268da785cd8d4bd1e216dd2cc9f142cf42c3ee5cb42552f75d71c3e7ab30fa73dd6299630447e9f047e9b8a0cbb157f82ff28f76524543070eb2f53720642f4e0efc41e319fd813e3887d2366c48475f54d300ae63c2d1baa8c6f82d4e47ae2c192b9837a4cff191fb7e83fa3116621275b0732a390ecadcb2e8295faf343f326aef6e974d6654386ab4c613d55e5b8fdef2c3240fecb216d03c0297ae5ef4202c81eacd458b576124d44f18ef57fcb05f5af3b8973b832bbf7e0b45fa4fbbe311895c9acaf61225c615719f6445c59aff35bff4684e1ac69884c15a987c3809871c2da04b2b9e380aa357687208c5902c1f7c8a5baf6ed69fb5b044c82afbca3a7db8a1189ac501cc64cfc08f9f4936aae81af4e70d9f0105373d57ad1581308dab505b29bceea8a1168636dc606a690e3cb54e8770819ed489ece9e8419c088723e054397f08b96dbbacee468844bf436dfc3dd734130abb39611fcb136ed2b8368409f66aaa4b4d3f5f0ce1cbe5b19fbc6c9f2231ceaade6c76bb7f64347892225597e9c2fcd1484e54115e775fe43b3f4fb635aff1964f9398967e97c4240f0653c84385856ef852a2fb9d40a106731a908c5ffa6b1ad4e113852c9fe09f1827a4b4b62dc5a222b91b05a2653c8c2539f07df3180e61f8ffa515d473778058afafd39c3406566b81bc2e648fa9a28014b7a09cb7107b5acae83eff2874e0118e1c2b00768268146ce7ebb7b79ac2032eb70a2469a5f68207a5d06a7af8ee5e5d0380eea4b81e7b29a8dc0a9b13800d9c53d0e911ee8f5ab038bc87f74c696a08058382829149844735677002c945d0f7c5994d091969f40c1979f217a315eb46153c2423acb8418fac0c10123b8e2a771402525451b1daac2984ad83c0d20e859c9cf22bc8d009321fb3ac2912fb95939f9d7e2db376b3f567cebe0fd1581e4f61e3f4414d14fc08c53604ed44ebecad10d8fc773e5f9be86dda09df7a709d80eda5ed90ce5dd08fc90ec218077c39188fede931cfe628f1ad4ae2ec8688a18c5641f8a924cc824cc73fd7b994d28117e056d94830298b24d350a1f8608355df163331a4b339745922d358412d321be1774920594515e2f44614826d7a01d4ef5976d0d3f141a66c533fe185c3b662828a2eb5707314c444f809928a4f4767c1a2140afe5dacbe6190d86e7ede005723cddb0535f165a880c15cc4b3c5c9083e6274044356a59a7959a879acbff86b03747fa4566a4f0f6d319cbe60f355b51e683b4676592cca0fb1dfff3b1530991af334f028d11880cfcca445d29f3154e43a4e287222758cb3bce55160f56fcdd8e9291c3d9a8c3a13824e7807431dba8af74fcf4d26dcd507fb63abfdae8476564fdd2f8c4021de22c63460c736a0b4fed2a5d4e8563b28bbdb1670edaa5a3d05258c8f4ce2ce5a17d9ee58631c28c891bc4a973738e107b9a0120cd94c41aeb30535f168791cec0488cc3a120db779ac1eee293a10581bc45146196bd6693bd0526b1c91a2e58da0607e320b5885d4793710f39e1fae8e5dba61b7b26148fef355f2021492eae56e494f526c10b2d87eff59fdac5e13f4e1b500ce94170903ab2e1124721cf20d1cc508835f552d4f3eb13a623282cd35f427ccd9d5640413b8238913fcb85f285b37f624683e9474dad01e75b7a5d5db2f04c41c8eddb96c11a2ea377593304160458e65da77ab80a3cc24dbe6a036ec36ef4ce291dc28872c0d61ebf59bb0ebb10fb7670d7b22a4b4de60dadd2821adb233c3b0ce1bc414d5c4e028b6f950f32ed0640dc269c6a2cc16c4c7e6a1d65cbaf963301c91849b0d647064c1c51eaa8c07191e897ac693f37e86776b8bcf2989cb5758c7d73c39e9704425fde2fe9eab4c7c6c64c89c26b935d1b443587c60203e57e00f59bf18164e195e326b1fd262a765f8601f40e573d05d7efeb208346ab649f6c7838b5315788ffb6a5ff85026c96bc54296d1215c7d63122f8da9b17e1b0da92f4a30cd60c1b71cce694ca2d755f1e0769b7fa93b635c1756122ce293bc588c42c10987b3e4ffce6a56c5cf33f024eb51394b952a2f63dde516677e6fead4efecdf732b2f2618744b9d17f9f11daa7653c344aa515315f3090901a5337ad5fd84c8d10525f486b18cd22bf17ee57591ef03f5047bd663a0d1f8eda33068d548593ac027e8ae0ac931ea9a2e84814bd689ee75f5b6bd0c648313026391278909abea1403bce29b09ed58ce54b06b68a91d44c7304120722a6ca3c98ece2751f86b8575517dfbe8ae72b1a738bac2dde677184663bb1ceef07ac5aa5aec2c427968ea87a84dab1c3dd31358453a905ca4a145c9c07bdc35d205a0270bd2f18bf5cbbc71dda89a4a58a5324cd21f92cc659a69131a26bb19c29115107b804324d410c947b72f29ef2d212b8d596d39b6ce639e527dede45648bd51a66adaf2ac93dcd5aabe53ed8985513695c32bd5136a22925ad777aa86a96a2c16e44b9504e64eba186e8198aac8ab20c06c7734e2238c11cc7dbd795f901b261a7be8352cd72dbe2a1f77c995fa19113b66bee2d2e098d2a5812cc7ba3d027e91a8a821c5a1c24dae8784cfa9636fe5497d9d460c20e6607702f98f6c4d70a19cc33c8fd5abcfd9732c9994031ee30f16d354fb8964c7d8de58d15369b7c263518ff58321f168b05b679ff053916c757ef39c1df8d4df841694e4eb948afdf2d764756d77f139baeeaa8280b8ce858ee83659cdc1ed4a3dfe5b89c44237bc0e585ec5155cda0959621c84f01b8c1da63b861aab0f25bb465e483d8ee200196451269d45fe494c3f16f2a20d04e8dd52c7545522e1f4d9a20b03c79a9ec798036bb722f4747a387327ae4696fc5298d589fe5047a9ff8a666484ca84614df52934d396635a27202cda90e48f73d4aa8c61d212ad92b845a5487eadbd11d13fea57dcb06a5882b5b6a54f6db5e3170ea438f12d492bcf33c2d2d37069e0ffe83a41f4ad25f6380a33ab039183e22a04c3e43bc98b9e4243b1f22f1a52a5d65d5e7b83fcbeefa8c5d9b66743ee9010220995cdeea9331e7153c155f176b9fbaf54b9bf13678827a8fc605f2a9ad28ed0b592d7c81f14e5a23eb0c87b709d8c8a2780795a2e4a6a6a4c8e706db4b6b60834edd5a4e43423964e8c15ad63c62c984aa1501dea14a2acfdd6b1c08db703325866ec87e999796435e79c3f4f4b78def12c38dc3e2a22e44971feca5a5113ea1156f787d4309032f097210f42055383590910c50a864c2969c3f29b5bd52a28b47263797334455a06c632445a852fb1d80c62f90d3486ca053f9686f15f42942e567f8cf44c695f0da64d9336a3bde59ce0b4ddca8af1a6026cb2dbb032905141282e3720744fc38c4dc8857ad2de8c591a7a9dc855576f49971ce450888b2a6b8a77113ab13358c1c7b3e2443f4e60a6d4160dadb59314973932b11f8e111bab5726a2e0788677a291b1d82e59bb8e63ff8312fa163c55390d156c9b37f8cbbfd7376ae6ce56a703d358f9d42581041b7bf545e5f63cc56d824d3e25e8a2185a303597a7fe2b309447e8f9583d46669d713abdfb304957336dca8174536c08c224e445d9d963e35b069e0b044e430526a9e1527ea0e5437556a7ece458e6178710c79380de0687abf99a0e6f96833a6459e64720838856b39fa6f230445161fd363a9d8e6304c1f68bba87ef132f7ed29274393ca280edc6de0f1345955f036cc41fed0a04fa24161206e743dcb752cd52087a045e713f6235eda7995d9a7bab0a1a0414c642e6772acd7845153243a59b0895425215b45c9cf1a844f2a23f964947583488011559f81e540a5d454d2db0bdb8c48582f57386f009e39833834c24c4048e53289660c066377dbe5cc1391ef1c5e05a41d6651af4968323d3a10b8afb1f8e53885649d7d32196bfe8782647f52d14d837bdad09fc3f51934a84a0564aa4ec2abd52b5d07d286e02212507457b60e51a2c0244ac2bdb42541fe050cdda4cfdca203a6a6bb8c766620a9c1ba9bd7e88e7329e6b9ff8fe6104d1d2f97f2b8148edd6d0797dadf1ace8bbd3ec81151838cee54ab14e9c0a453afc78374b8daf300d7a2b96bf63fc41e00feee6e099d183229fb5646c13273ef30d9dfad2f43450247d66d94e32ec532b176edd265685d27bfd407cfd7cc7a1689bff8fe8f4a75de8609551d27f3882d2138912e476ba091e2d05af8abb55c8f5c2c03dbdeb4da82fd62ed647f0d917a142e5282db624ea5d1477259db2f82b2d48b6cba253592ee3a66229f68e9ce2803655baf83a78bc9d59f005d68e5aea92d5a3401901b723b80c155b8fbdee55861bfb9e9ee15b31290a3faa56bb0e1597c57c633b479fd3bcb415f35cee68de0750ba803f6d7d51acaf18044b55b12dcbd8528f26f381933551106ec2373d6f6d295304a740db7cb345f474b59a1737f0783f84020dd95deae1e724c6acbd34bef7474f8e014ca1deb43e3dd146099b694ffd78524ec8a34c9317e1a6e7970617fbf9b5496cf5e78ccc6e675f3df26d6c91555053bf06a1ad05d8bd6ad02ff61700f4b92939dfe0c34f637e2d1602adcd103a10c2cb6d25c09579342c197ada43053a0f2d8c4316ca0515f6055ce632a88f325c4761d8150788c3bf4757333188740c298f0aeb0cdd995bf70c32d288b8e7402a7226ae6e213bac10d7f42916026676901845a64800f73b31ced7e189d0b3ac66abc21e36e3c99e19eb66b06ba7e320a99ed45fad25b95341fce741093f7c3100700781d90f64bf21de64760678dc957a5d0a86b89e28304746cece8f405ba81b61b98278005a0c9badf50c26c4a9bd1d19913c60da7a4fd4088cc4c74804e42ae20a42cf9bf9afebed3422f5406a69a483af51576405353ffea1247754e614d0a29a243cd2db41f80974dc436e813a1d9bdcf055aea6210041206a802097023bcdbbae0c6d06634f3998bb6d9b6fe08cc106479b2fb8d4a58e30cd9802fe17c54f947379a5e170a1529ddda64aaa3c234948bada990f11ace3fcf8f515205648a462c884af163c677a8b226da3a6d7ee354e5c3228f7710da44a80d162f759c8a4271f943977f37970da23544a0055e05d2e44b486daa7fa59b07203cd8f1e17dcfa96b10bb7043204f6d0b68b8d59a02989dda625c471c26733d7e311b31635243dd2cd8a38b656fd2548d8deb78f5d5b348bfc27eca81158cb44b65a7d43eebaaacb21d8c32060d22a49fb5c75d495a30f282c88f59087f47ac1ebeda1f0a1e522be0341206398ed5cf64bb848a48d72c4a63d5a4d80454732983004845c980cd724335d8b2d526c19f830199954c4d0c677d53494ed021039e8ba0198a5960553581c1b63ccc447ab74aadfd5c24a10dbd8b7e1688e820de8a558a6c95edeb374d62556c6fa5efb884ee39e5ba40098a9626420184940d91078bb2f916e8271f72c894d5a23a31cefb74e0d6464ca83282ac1c76275af9b56fe349999274ab8597052760c1560df2903e6ba018683de2d65cd960713037def9ef01021d19fcd573f57808a38949f464590ebf95bf319cacedcbce47fb12424bc57ca7ddd33d7a465c9c193c0d5b8f9d595401b00a17e8026eb845c8c7bab5bde26863e13037beaf60ac94bc2c53697fbbd7fa8ac82dc07d65f15070f16faa0563e51b31c144fece966d7474d5eec561c8b565d0dd4e496d0469ca94953a5ebc2695491f42c72ccdca6612872771a2d79390c00366e62e8689f49cf85628dc5e7cb004a905b846b38ba1d3f40c4a9130c1fbaf80c8d7295a161103d82c74293ed8d46178615b8e3ed4f006c1b0caed7b55234bcac82948123e6c5b0a76cef2b4e6f89bfda3651208e3f4ac9faa62921fe9b0ac5c15993f1c8c1e24b5eabbfeac2cc1651b1f98ffa1aaa26564d61f4be4aeedea81e9f5385f3d2cee30e639367b3a827948b9704e807d008aac422d925f4b7619747bd0c793492505f243267c008de7194931c74f0e163796129747820730e9c63bbb19195f40e2573d695979968c4cb2541a4e9237f93d2de6aab22653126339c5346324848e0c83273803011fd8c0f1ff302a30eb385939fd0659cde704b5155312eba59b08e059bf0a65437a75cd153bf25664e1fa67f88ac61be1821859baddea5d31aafd8a8046342fe38f75efe157b91fcd194632a754b16764a273ea2a930f3983c453d5dc3990be807f6acb0884b84514bb8cd2cb279bdf0023dd13ba641d7d753d7ddecc04602e99574b427426a97fb9434ad1bf1ea213ff9c9a3fefe199f13add95c8d5dbb51bd5617b7fa9c07439c9003d2cf20dd5ee15397288499b87a468dc6eb7a2658b0a5d1e2644b4b825ab08e496416449a7fc9d8f8b42442839b0aa956e71529700301aff5958acd077b087c7a58594eac27a27df849ee7ba8130daced8311b2ca821b056199dd01279715508bcb96e243213874cf72e3e3a9f595af5e2360c728ee9e0df376d2648c4616f2582174acc91d951c31ffcea253636b18449c2c35c3cce56c5cba8f034384407ee1272b5814802c65670037b11552302d712f12d94da8637d914048c081b9ef4123a4395da07719b1c79e00d9417dadf50d863741c7315dc8d8a31c9d217646d009ef2b7048169932111c65dadeec61f0fc690c26e70d1d208a140f4300abbf2febc19d35af05360a771e9844d60dbf391dbc5949008105ee2fe443a0884b833474da65180cfeeff7ad50363c37916f384809bf8385c84618e0e331d6eb2a61adedd969a73ad0356a7961c6b9574bc88a5734db22213eb6db2a7f1b2b1f64e7e7ccceec503fc2fe405db87a6ec4cb2ecb2975b2bd3b4c5a9ce50081145ed2e2b0a880e29960c750f514a9ae68e7dd8685d7c524e02ef2f4d16c81bfe6a395ba03e286b7e15366db1bbd619db322b0a8e671d6985b512c00fc65def7ed2429f140accdf08cba3c0c837e8a5c354e7e99b2ce532c9d3ac723b470290468274e7f09e66e93bfa1ef17d0604086fe39f3c9bedb99c371fe72e8dee91c37e5246757b2acbcd71edd8fe792e1c43f8a4a7d3838423cc809725602913108a738afe61e13cfe27bea8c5472404cac6c8fa6b95a5c42025733c898993498e324a1c74ac498cd74293c39a1c4b5608e43611de1e9796152703372bacc5a88dc084e96f9fcd1bb87e1e8b10fb1e52169987ad431f111c405b8d61d57a2a4779d986eade81812dea400ec4b4c9a7b6965be8259a8b11679089549f4a3d4c694cda89020846c3a6a24792623eab060a8ab7efc880ac2552ee124d9efc252dac64564e11946920e5c63317d1060ee1b50f7173f4e6b5653cd097542a6a5361960c67add63d5a6f34652eeb1dab642b4c6e71ddd6511263989b97194a1e229c7d9210219bf77389d637559cc4dd071a427d091a9b2cc350413b9988db78d103f0ce553ac89afb10cfc5bb26136106e6db53ec04ab8302493f93605036fe148b7609b4af88d58d1ee2fbcd982af4183a500aebbc814b184987df89e406b614e7bc32a8ebbf4e39340fb9b20ce8a75828d6502747342b99b58022086348a251212a9348c07a79aa4bbb3c454c2e4f5dc51fa73517dfc5f538895c9db8186ff1c24f4f98e947d843283925ee5c7167ea87cf5dc0fb58bacb2914748f4cd385f1279ff224b106a00ab673737d1e69ca7f125f5711e600e98caf7c9f1057df44d55fad9d90fc81d287e779d9b834397ef8dd2882a37e720b864c3042e3e62de911365409b57f3d85b9219474ac736e8315dc55fc74ec83c555e235c01d918b8de8197cb79a9d7a7156ce7b535772fb432e8116ae893155e8a73e628a8d196d42f599fc62d7571f2f23bca3cb7cc170305d42f5b0ac432d8ee63cdc8730e1a0da6e82f0bd74173716a23828069ffee23ba99b3a2a8eea24cb38db1a2b382c9032bda0e28e1441ade704106ec7258b66f9428830eae6c5be71702c2d3593bd8fa590e0e159e6b1bee40f40b9a9d7c18ea598848db22c1b534863d2145b9658e37c6bcb6274a80d407632850dc539a93eef18a5c1517f110330d5155036b1f9f3d89baca20d11fd8e6b26aa1fcde13e1041da0bda871040559f00c2693d4c634c3188a3173ae6c94b748dfb6a0c6fea2ca483b4a0aea6252dcc74865c58c4125f1a27624ae8c90a760002b5c3ef3db75d94079f4d227ee5399e10d8acc531092187aac8d52121d28e655f96d4b4355c933180a8987e7c8cb948bca6934d71ebbe0dae765bccae0758736621c52ca092b918e45451651d22557e770cccb324303fb81d0421a9d78a4ea07c8b5f1a2c0271c0fd54d221cbbd3dc1b0efac601d913cea0281e1f2d13867645ec6322eca2a9e081b3d0dc6850765b9d7c715c64d551c65594d8ee0792ff9e08f9a9c090cebfca2706e743ecf3b88e26cbc283d9f6c77dbdf4822bda1f25eade989aafd721db91bb84de96fe748379ed45437dca8bb03ae3f60b62c3166a9cb7b25ca62b740b5fa44183e5a24fb7891422db1c62a9cac403a65fed67602e511deb0b06eda7113708344e7df8435db0a6722b6722501131e51a144ef3d4b29e79be0e3799111984eef20be5da8c3a08671e7cbb16dd543211398da1a3f7c877eec80b71c3330aa4da1bbeb30b4a9fd8f058262e506c25df2e5eb65712648af65af04d0777424147bf5e2d83dbe785db1f978581d9a50a02a99ee1ac8af4810a224a56d159618ccc18bcff17382e90ce264dae68c7a341938f5393da2a74a634f52b533c3a6e87e9336ebcf9b9b0c154c6b8e04f0fc318eb000d54effb8d70dd59f9ec97f76f0fc6dfaff11950c6945783f7dd1948376f245e7666fca320476471ca6dc8645caccaa07a14491eb4199036ad25e0e2faf5ec5fa1f0915ca2bf3f22ee331792561ccd19f2aaf3b9bf415537ebdc8ed72d7acf9b05c3705346ac34257649d3b239d569be8fe083a2154e5726c33b162b855528846ee19e01e0118461d60ce446595ea9f2982b1c793cd53b9430b2d4a02883713e35006b9f3088135cdda02a216e06e986503d8303dd64ad9cf77e063427fec1e2b721162eb2cd00e6ab031a7b07c1e9169912a26cc2efdc72272a09890e8e09b68e6d3d85941ce8edf257780bf1d91c7d453de03bc58dacfef0c2f228729614c7779f1e90367aaec27cd61b14867233f06f65ecd2e9f5bc10c4a3ffe83d6911d5d9ec65a7e2204e8dbdc5362ecb4b84c8b2cbd66d1193a2f27b4601d386518bc7a97fd0e0b7940c337b192207089fe5b82cd35154b408e8c966d26bf18e245c7f53c2c5db7330b1f70e41bdeba616d09c73ad5246dd0ada2d4494144743762789e729d04b7ab3160cfe410a0ab383ae2367abc2306e58229d4288f884ed8b8556941725eaff33b5aeacb1611c0f67741321db0f1086da2cb18f5081076ac1861c924210b618ac91a897e53e285ac4f4c88a5d52085a62d425647388c516ffe3d18e9a9d6ea0df849afc931e95924de035bb80256c711ebede43786b1c64b98ae18f85d57b0a2cc03b2e6c213029394921489fe292fcea5e7a8c24015456e723cd358ca4535604ab0f7986519a14504c9ee2b647cfe8b816dbc2f6119a02fcb8be92d699756c226cb965ace4e15a49a5fc5401925c1bddab523afe82609242f0ead49cf157b9748afb68ec769d40a2a6f193b737e21a2fc875b18eb809ebd136f076f415d2a8d1ecb24f026409ddecdcd6fbd51f96ff66cf16e42c87b4aa40eb26f672f3af9b485ba501ccbc64c2ee009ea2d787b5c4483af0df950b2645e57e3482287867c0af37cf06ca69b5c4da0c71aef10fd6d82771c4edb388ae5b3514b6f69a708832cadde038b0e26104622da9fad57b36c16055223db8d92132eda392c6363556bbc998b5c7541a54daa49cee764821ca502a2c18bc9b1bd1c73437bc57bf67a9a64b21808c80c69e193d02ee9c209f86820025da19f3ac47421a78fb0b6faa21c3e42dc6cdd8dc0d8188de934269ccca70735c4d0cb447e6d8848f324ee20ee243764261c51bf946f352275f2309f1c0635672d442382deac9732c92a88ad506cda54ca468a7203c048f74ee42aab20c7de69ea1eb7e75d449f5cf9512798d17d3022810966946a6591d8684feef57542616bedc8347249c06fd71fb50a12e57c453d6e7956b0d236acbc8a38c6fb9b328a8e9f29b24b64ed0ac5e5896308f5b8b961e1e0ecae400bf0a7643600f91d99a19e360257dd1430bb5d6de366ad4a72ccf8cfb8052a3e10ad829d215445b4c4629bc32968de7ba7f625cf142f2ad057155827158e73f35994548e95d4acce234fdcbd7206918a619286ebf0623d3ae41d6ba523d52b8ce4f8591613425434ea9815df916b6f185dc73b30df034a06bda8b8665baac3936f8b7100aa87d98d0393c71f292448895528a4389908f6e8b7a2d4209132f9d4540feb5c7d74917b4307f7198a6539fefd91ab7ee182b3395f30a828ca0f856d454664269ae037f1712acf0e760ef43e70db98139a218577d2956e7de18d09a691784b9c42c40276c8e0d208fec096116c6662d86f07db1f7adeb11a182cdd90427e34df6301a9379ae3543e31586a26f72f64219f716993f88f25829abd98d38c67f65a8fa219e975075445d56df264510a1ab286ffcf883e0acfb29640196af2bd68eb424884583cc2a595430de5ca15f63faeb083991ab41f4a88cd7259261f1058c718f16958493c190d5d713693dc01cfba7d48b8a695ff75e9423f2301256bc9a665325bd40a1a706b705f72462d1a11bc6e9625fd01123a87438eb53fb983f2fab4bcd06dc5588ac9fb1525bbfe4c119415335ac8458d1c7a204edebd94a9b7bc191dc43733fa99fb2b80d06e58e45a2ae99a6fb60227994554213304a6d2a32f433a02f555dcb59d3b904426a7a6f8cfc86b86323bf5563deb409c2ca3db1d9d28e84848eb5a960bbc5a9ab473b8655f7350481b9b949c181587ea3c4733ef52462714043af9352919d93de8a29294f267cf55858bca6b2b3d46c94a8682167a0aa4ad7d7683708fa5676714cb9b6a0087524b2b20e94f110251580ebe28ef8f5e249d7c8007bff93702d2f14446ba32373f65c5fa405d9af85e6f836ac2f8aa98ddbc240f84f6c1846d6e37757a32466293e7318467d00a7fdf63d0b1f624d28edc67403511d23d1e5b10cd0f87af5fe8813be8437f8feefaa3970c6f0e136d215cb4b39862b716421b1c344a744c73d962ad35ff52314c490435717e0aeb2e01684f7f763d3e1336675fe880e0d986a989f24256561b55c5ad8e1ffe4ecb444bcaba5dd7821d3fe316a567d2d10519a1c554e17adf59766f5897aca5b3f5f9ef988ec88684d9c8aa769cf412c2c89b62ffaa87cda7fcfc59cce80a38bb55aee0aed728e28bae0df21ef26b7420d60e2a64b2f21b04fb31c79ffe61cdc5d7f83f56fec31d4baa159f40958e3dc165fdd1387705edca99766982cffe97112baa751ba28536f889252f7343c2deb2e51a9af053970f02e2deeb34ce9dc9442d241fa681598eb4969b4fb2aa81d67090c660354d1605447668954f814c7f34ac106a73ba5161046f8414948636913c95db28e5493dd6f811b93227b5857699651af14ed41feaee114e9d6e5c4309e392d95cef0ee40c7b134addc5ef2ced4d4b4a748a9ef68dad0ac5f5c0eb10950b7eeb3488e117f7730b6c4b1591a6f7c24b6026e76f6ed193b93402caf847b56f9485dfa2f6fb01ff0f9ae58313100822b9dc289feda11c79f5b086c11076945dc7d53e926277a09901c01bb0ca01e313d3f82ddcd69dbb91c996d7486c6ea784333f2f06e8c6d945c8172f6d97c8567316493a6c691783a8210d38623d3b7863c5f9e888749a7a88d782c6c057239425a6c7afc0c6448896ba1534f26bd0dd77745e1a1fb7f2b85870e187e10437d14e9fdb2fb25dbecf624bc25bdf12f99d0d063ad0568f0147bf8284c1673e793a171316bd985c8496a08b21b598fb436f4e771a11bf5871ef2ad3e824d989a7de1ab47e992ad63a3e9d1cf41115f61a1391281c345c8d1abb1b96b1c39c9127ac9bc18d3e3e6cde3d26aa87e82835856b4b21a6e160dc9144797f6c965a1de122cc30bb5c1cae9a167198325fa1266c2b3a0d4b6262c0a0d3aac40f4ad94072a1e39fdd6ab35b38c2d9cdce21cf5b7cf1d330f7d58e362c997703ca870555c7f66b7f97af68357e05e186e1c358c1f487163a3b53802e42beb208cfb5089a62588af56b786dcddcf4fc3f01180890e71a5faff141e5a89e38a6f347302b75141ee6e1115c0b967d546022d82240905416c1288df2cf325666c0ee86413749713906e088e910aa2d69c6414c98c88f3bdbd191ba2edc8f0336556ea6f30dc4caa24882ece37ba5f16e55b80a23f816f1b0854bb74616e5e96e4cf9477698000941c09117a7d140011dff9cfd1e59f5990a12c6c1854a0489f5e04cb5ae71a81255821b52698fe49ef533b86389042dec887cd5d0bd84fc63d0cb04ab3cf471db0f183f6f70f5b099b9d32818dd37a6f12820c8214c99a8515b7d203632e9c8ea1642c21a8c706186fb59c3a23c56447e7135c0dbe7f411d394591e7fac78eace8fd7e96888286f3a47fdb5fea3d167cfcc5cf2157c7be1f657a3a646c03dcb38124baeab7be102217da9ed1f46e82bbbea0c9cf4a2df1cfbd16ad54f3324266f3246bf1cdef4b72d1d6d21c7495523972e936bf92ed38267228a228e91702da96813d8840f8c0b4dfbce8082849547791cea0b901039ebe986ab674cc31312204d3cc1144e2e5e3cc6ec4068e8479c7d2b596a4ba5a287be65a818e8c2e7c542af851830fc1b42d3fa0a62c5304e682390c806c09f5c0e15d171b00808455272835111459e6122058a19ae5267860bb8274ec9cfe423831f1d21644af1d8001f2bbedd331ee9d63bb6817d6f55f518994ffb2b4ee846425a48251b4c908ac9fe1932af3dd84cfed4e70dc38397c44c43a599ca18859aeab5b618629d2c8f00ce4964d3c1cad500f474db044a8c8301c3afa20481e0f3dcd193105ea93a6e64435e01560635cd9b7c4d42cb6cc0515b6f7660f19fda8b34726b69e9e9667c580afb9bea93affcf37e123cc7e08e14901b4b26fdbc40445915ede5ee061d0f946ddc545af3d18c9fdc28170534ad36c22fee9d03614d1aa6d8bf5cdb6f1a2e696a1808e5e6a27b6b8056f8508f3a6543789155031d28218e9335d8b15a9699591ac85a503fb824853db4320b295729270b12f721d8cd0d441e2431bc6d02aac0a15e6040925d51075460911d9fdd909ff9bad9b9a16318621ed8146c29c06fdb8be59a17a8c704ec455070f17566343adc7e47245c4e90be617f638e5d3346a866f18a8d31e134461ac643f4b987b1867bb9bf8edfb87e100efd2d9bec26524a29a50c6f05e005d3057f6b259148d5dc61d6fbfabe7154a95a600bc6fb55249148fad6eb225d7cf1c5d8eeb0e9bbc6b0c685f775ad38836f2bce487afc913ed72799df5f6ceeb0a90f8217fc3eebc83b6c3ae9f37777ee47c0472765f333334adf37f38e8f7ecf08f8e8f7496200f6fbb83d6cd7a123eb95f3c1ff401da4b367db2fd761fcfcb49dc32aae562e182fcf673a6d169647b13c8a7c948b944ef26a63dc590abfc6afb566f1d4a352a97f21c94f81e05b1d12bd42e955a7e3e9218a176dac7c8f16afad19f234cd967f41a19e2517ca88392c0b0b4bbc817a967a5bfa4915dc561c9b7a55eac995ea532bd37619927cd4872c78ad3ad7fc67c5c4ac46adbfa4b5d6e68b4ab4b1f2e38729f855a9c671ef57eddf7bd7f7cb76aeef4fbd2cd380a8383c6c51e7a9c401e0d7bb1d745fbc544bcbcbb7fcd6dd978c65a3b9fb1273d8eea2bfd78f326b77116fb090a894e5d530accef8c6fd2c26d1c6eda40c46f5a4ea65fa57af437faae294bf3fb7507150bf3f44a17ef51af5a569bb490c00ea53a947a1509f7a9d5bea53f53c58baaaa35e65bead38d6a64e30b2f4d2a76e18659996fa196579d6511fdad030d3e982e8f8557fc51bf8556f451be3577147874ee9d5297b499d3a5e3ef5fb5952bf22de78499d28d45ff106eac95f99b5a71e654ac0f6d4ca297bf9958e7a2deee8487d0fdbc97fd93b759eb21490fb224f1da9277fff0af9a27823458ac06dc5b1a163e57bd88e8f6cd82452368c327b947bf290fbd2611ffcfda298e37bf0b978c39ee1c5b6867aa5de1679a2ce527feddf59abcb19d33f54ff441c9697f1aec59d0fe6754bed27d364ca3ed194f11e56ebdc7d6491d8353dca54fbb4f5ac8f2a4dfe5dc3305da5baf2b7d0b30a3def1f999f345b1e725d393c73914cbbad7c2d6fffe5c997a7e7efb678f5fc66d40ad3ed583a09d06dba06b708823b6cfaae3b55ddd308131580fafe32c77e8cbf073f0c2fb7d69459994d62c726d1c193d407b0ff33593ae9c43b2cd607c9da15acb85b8b3b6e4bff0928dcdce011622caf73f7197e78cd72c5c3f83563961fa1bef0ebd3cb3e58cd59795b7b7d6d8dd7f20f4659ed75147adc177ebde33ce1b6748fdbd23c6cadb3fd251d2cfb6e6e52b0660fdd12ab8c32bbb3da1231e6a0cd7f9081e6a2066dee4b97c2955debb66cc6bdb3c2eef0ca3dedcda6ef7749b7d5ed0ebbec0e3c31bead2eb33bddaded168bad7818531d7f156fa4b4cf6dd56423ae118df965b68631c618e354afba25b99e3f7c19093dc3e899a667133dc7f46c6b2ee1e6aa11c616ae0a5653352bac562b661d043181a16576b7dbed2b5469f463d3ee808c3a37ba253674fd07d0a9cd7dd50c6b79fddfcd39bd6cc6f43217acff06c35abed3ab4caaf1a66bfd46a3fe4b4381e0cbf6adad2bfab5f5b620ac33faacf7de7bfff5dd16ce3152e8f1a49ea6043efb3d6c0af6cb7a5bf7eacf9f1b65dfdbdfbfa2e27c3c2ef0332d57c529fd7e9a8a03fefe9bfb3a79d8ee63b6c392227dffd8830d7dff8ccdc6a16f1e8efafebcf7cab8d2efaff4fb323dc43c344bf06bd7f195e09923a7df4f4127a7dfcfe9f77d744ccaeda004de5bdfd65a6b3d4b7fbfcfde6b499fb3cd36db9c3329ff259150b8af12f8d59d75b63b1b745bbcdbdac180131c90f6eecb16c970276081fb12bff2afe1d7529112edbec2da51b8af7befabf6d25fb3f61ef7257ee927705ffcc55289546badd5dab18ba6edc16d6113bce0efb047e0b5f75e7b2f6873510846592db2c045e14ec0a642b6775bb8c76de19ed10127dc594908d7da7e5a6b8deb59e6d7d91a85b9667cd68b2b10d6195958bbbbfb52dd046921f13d90d283ae4eeb203ea1518aaa07486c2041fa0d4242aadb53ef5e68b05fa8382dd418b6d6d8213bd549260632db4586dc57de67589bc1cb0ae31dcd950b467deb55c4b77eed022c3ec336f2668252b61fd34f269375ab3435ec724977e878ca56401de4e7d03e7158b22729da46dcd723c365c458697fb9c313dc252cbec0a39023b001a2e50d4459b7da0265963de20cf8e445a753b6d2891c30913d20aff95c182e8cb2530d75bbaffcaaafc447dbffc3f06e9a62ccbe29eee49eb16932cd5795a6da89e7b6ee690553910908752703cee34522119126d6c4196aebbe6833cff2765ba00ba5c7a626fdfe69051e9cc3913d640d0823398293f327a3cca983e68fcc976440b414ea5d69324b9e4ad353062955289974d9ca5c9dcc15aed2dcd7a1a4df550eb5753ff7261963923716094375cdf49693ec69a1bc95f66965465289324b9426388b3b1943530c4fd15682872136cb1e5e4eaebef307758ea0f9833abfbd752e9540319f6ca71adf3ddb66920b6eedc983d4c30f6bf8b774d0fc818179940904f5e79bffbf39ef6621d417b7416de95979c3ae0be340a8ae6b2aba2dfda4be4c3cd0b359aa47f79ca678a4b6b86f9ae209aa8bfb6f8a26a830ee97a628638a2da6988f1079a8aefba419a853b4d516f75f80904a4824a40d7d2463a838f749186a8c138fada938e1f794331b14e9f755c2505be50f1a4ba9425ade306c3544750181d7a154d77dad9ad496890740fdfeea28d565e58d4a791b2a6f3bb287acdd968fed86cba1d8c5eafa5ca12f1a1865a2ed1b43102dd22d98dad0edb79c3e2f74fba65376ea40bfcf32310ebbecc798e18b1727115cbc7801438ce1b7b6e2d8ecc4f4f15ca13fe4ab8c40614c8ed616a622ec32d5442215761222d230ecc4c3799c972a32994ca6242f60bc5e98cbc0d7bfc4d80ff9af6c139ea79a941e0c136922b9bb2f53ef7219d497a988da2ac2305e845db593900ae351c4da7d9d7aae38437d9d62a8adfb2da622967e2aea5706a64653cd5443996569963516737564a6d0633415510e31f5eeab6ca1b6781186adaa5457c9c393287ff4fbbc68c55ba1ab5ca5b90fa218b602a2baa2ecfafd5593ea8a61a5eba79efb5af1b002a30cddd510f8a8cb48948c8184a1d6dcff4cb28849d65626797b31491c99c3aefb2fb28736b280dc67cd820cc14082208181f400896e65e54d2848bf305d56defafdf2765f484a1c4c8c7d6779bb296fc45889e4b6ca23e5ad3c924939fffdf248c549f5efd422ed8a3dd8045d98f9057ff1d96c86ad34f6495395510f9a3fff329af49923496f179538c367c4986843093156de445b792b6f3cbdd642a142450a16fcc4428c9d7c6eeb3e8d18135f5230cac89e5abf4fdaee4b26dafaed2942d6489ffb92edc0b7fba24d9b664c5802df3c4b90e062e5567cb4dc1e20f0e168874dca39c7e0090b6e13143cb17580868827353cf4e403444f7880c6955e754e829002274774d98f509c10d1022740e0189c387192e485199d9319b0cd0991203809721b5d8eee9429489a0c31a381cf08be40ebe0427951d0a4065d931f2c82b1d4abae8908c6ad6bf24207524068c233845639f5894a61c1e5ee30f214ab601465d0c3382e3982da807d50197e40830c31f25e75e8ec3a19c35e754c7c5085494fc7e40639e79cb10a4c9ee898e0744c64c0328c5faf3a26448e6092011b8ce20f8c0c5d2346b2579d0f32c0271851bdea7c6841097cb8a1b7b2ce0712fc8cce87187ca081a5a7daa3ec82a05e753ef0b840a8dbe0173301f47fa5c11f9660fc64a3fe2e90eb57c90570fdfe0578fa8e9b16209f17c6c6b0b97b44cdeaa07f2a766d60b47f8dee8ca38e4f5087b1f66aa11805d1656350ff6e1704240ced10d5996a13019b9e08c28bdfc70e389ba5fe1474aa18d3b5ebc098f5ac7e9f25235799fedd97d65a63d326f1e3cefa8ddd8a57340f9b442d71896baed79a44bff7deaa57be10e82ff7e7fdfd28f16a63582ef2158cf63fb174471999fe9d3c64fa8a8db1f3b045fde361d3fe3dbe2b5bb304407fe9b1097ec9044b56ccff9932baec76bc23a37f270f19fdb3f9e2bc1281db25b0fb77e638bf710b1156bbefc53967ad3f10ac522a95c270efbdb79857becdc2328e4748a84c7befbd4f18638c31c658b770eda2512892b4a48b0beaded7c1f9fe034ab9aee39ef6f4b1ade84358ad8ea113c21b76fc2acd8cfb558ce1fe27085d18ad90d1d63cc6b5b2c098d3f45af18a2ec31863ac02e314db45aab562dc0c2ddcf7d55a316e0614388c7309e499e433dad727c6194c8433b5f212bbc29066b03ebb6d636b33d6e6ed9b36da377d97618c7148c3acafe58431c62e18e358fd0ae352d68ae2010f56e3e6c14b4a67958a7ff7556badab17b284c10a635cbad40ac34521b9316686168d31deda26c332bdcc383ecb69628c734d9f5c5ca13e2781eee9b504aff55c3e139ae0b59e005170fc6d2323238e31aee76cdc1963153c8518ab5f33d62ab8ce39e7153c74e186ef360ff0aeb99005cdad618131c63618e31a6b53c38266858a14ae168a1326664a9ce6cbb06260ca954d0c1a680e838b31eea1a8e653e371cee37c0553b25e62c214c849a45017ea70a1f9f3f2a2b53e426f8bbf1ce1d01c2e575b280975a12ed4c98835718693ed5403892377302531ddc020420e9af64433e54e474eb630084577393497dba5380c876979596aecb5f20794c32e1c76dd7a90dc00c3aa97aeaa08f5216aeb64227b298a1ea5282ec61c7130e6498742a18e72682e26347f606e3037e46040f42887e65ed290bb84e58f7256e5a8a8b7e3a5401ce1d01497569a1d76b91c1581440f79a919e6251487a2b894f394737e82bbb4a242ee40420179686ab2d2da021567221134047741170689a2397497e36968fec8c8d86ac8913852877c2292e680f7c499f823d66e38f0de4cc4996ea5d075dd322d619eab4167bbaf92872a4564512f457727222809258d09cd9f9818908775cf58e670a8921d95a29e9421b2a89762170f6d826e9017d33bc2a1b89734c74f1117863825298ae3a528d02e28cde5783814681784d35541733823a38c44733c1c0ab40bc2715668feac56ff32cf2271a40eb9f444e444e33d5e442edda1b6604175719f658a395418f75f4c3127a23b7126e2a0e060204f8a501040bb274d6a0cd30dad381c257500ea24eebeca26b555de90cbe5902b69e52cc5b0b285ea22725fab2abc08244a5b5a8e202dd3d4eca868b5bbad201e769129891ee1501ce715f1782614f4fb30e58b139aa2486e699aa669aa244d857a42692a14054d795150a05d5014cee3fca84c51ceab2d4e34ec32e5b0eba7c24e47aa0bc34e36969449cc996e27194c3fe472240e4d5124b7344dd3345592a6423da134158a82a6bc2828d02e280ae7f1f3944373288689b55a7a5f279e1cd4d76985130dc3c49929876120ef74a4c24c494e360c33dd6ef775c2e1505f271dc413ade5443be54c395eaee77018c67b240e2d77b9d2765aa1e4419c615869029c28e4067156f21c15f130ac54c194a49c996e18b6aaa2430f70f7b5a252d68e2861e0952df08e724f2a4d935a53d4c32ea01d76913c32edf7d11445724bd3344d5325692ad4134a53a12868ca8b8202ed82a2d46c3ce43cfceeac67b376d2ac334a409e8e302c65c3ae9bbab5cc8a48b4df0773ba14cdf15214681794e2704a5214c74b51a05d509acbe970688e8743817641b89c0e87e6783814681784cbe970688e87438176413816f7d1722910853b61d16eeb0eb9ad2bd2fa7d7b41b4c46fad5f2a4b457afd120cf5a5baad1a86c17cfd524fc5317d3541283a40a05e1f6c525f2780bb8a337e7d10ad38a7afb5a8bec6e9dc7f9569135458ce42c847b77585e859152a15a667a8af2ff3f5b5ade2b47c7dcd938b8ef4c62180805261ba07a677407bfdcc4385699c7e9295f4fa3987fad2e86ded72aee2885f3fe3c0d2e65f3f935fff312cf5f55b3618f6a2529148248a3b192dfe294b21140df5dc56188662eca7144f3554adb6b0e1bab0796d5d31459af802e7f128624d9ca157441108c43f0c3937ada9c8543b0939f1e0d376e120c9cd98aec21f69023981fd0dfc0cd2e7c2b8b755d3ed49d66e0b87530dc370bfbd98ad94c8c222c67e582bbe12633f2c6cea16d3cb526389bb30ee7fadfc6d1eec9aad7a407eac86aaab86bb35c9e5505d48fa0db595f6fb2620a0e0faeda9d96e2be54db4c99823cb3c85a385095128d417c3553f2c9610dd738475aacd4a1bb238778253b02e2928278c8fe6c81eb2460644108165e8e0ad3315bd332e22436748a7dfa0cfd0386748e70ce19c211a35866a68dc87741fc27d286603372141044242b9cfc8d80867237d06d10c1a42d0a881b30e11d621ca3a44311bd612d9c0990611a641946910ed94909fd87cf4d65b6fbdb5ce804ea96c1e5a7b5e2053a1810a0d5468a04283b544dca004b5a1adb3ce434319078dc31ed27a0fe98dc30c3890019d8e05238cd07a53d15b87031ca4341419da9a082a7a17d99a082a7a17c979ebacd3bbc8d64450d1bb488e18d39f8365e8e0ad3315bd332e22436748a7dfa0cfd0386748e70ce19c211a35866a68dc87741fc27d28660303b100aaa0371154f4d669bda9e8addb29014706300b9845108d113770e870e4d0e5304167c20c32c619679c711e4da71617149952bdac625819ffc0d9250a4be68dde3c416cb3378bb3670915b5c48cd18bcf8c09a3171f13278c5e7c4ea0307af141d1b256e8450815095aae11b852a820529131e9fb8888be1460524ec18a68c50a3186693226c22b31965340c30208163518a8b1f961d362490b119688e0e285077eca0b185360c01063f895b11136c5585ef282ddece066841d8c8013238a099f1824183141f402468e0c9c858c7036f282c9d0c159c8086723373762ec1b41a77fa48d83969d5afb63b4ffdd700d3bcd467062f419380b19e16c4447478ce1d7c97d46c646381be9338866d01082460d9c7588b00e51d6218ad9b096c806ce3488300da24c8368a784fc021b0fd4642a367670e4c858c80873da6d2db971438c611c191be1bce4060e137e640f641b5ecd941c262c3121004b02208025027021421039c841686d2a6b83418c2ab6c70446fbb7db23c23a2333f129a38cd3ecc53967adf5de3b3f49dcf9c052c8c51596d1746ab1e12a4ee3442a6ca7fc87cb70b209c112c2828765b342fcca45939bcf79ad382aac35cf146709578999d68c8924286e3c2913274e0ce1b4b4eef455adb7e9f5a663db2cf57de3a852fd6fd146a95b920c2750d41f769c5669484650ccb45c3f256a45b84a1ae76f93c01db775428fdb42c1765b49be170b4ce028450a15664db593a8b04946f0396d458585d582f64885711a4da6cbacadd27648c27b6e2b5481868510160f0f2be4615113d3438d0d4c0f362d44e0a1c53f07f8302c2440092e5cbc5061182f52072f184a07b09b1192b4dc504ec32e216ea46eea29c108383fa71aa7715aad564204172400c0f402060072c6d74b8c911e96632383c5be36f89c765b4cf7fbef46da38b819815b15825498edb14376aa79ea9b6a0cbb015b73adcd666d7603b59c1c31963fe765d8e88c405c62ecd4d6dc0fbbb64868371b521bc39aa0d6d45069360ebab5f19a0c9d1f5eabf122743ab7b6d99159a5f519e00b9b1c9c43a3460d975e9f89d9e02a0ce35fff398dbb6061d666e33424a6bd61170b31084d8dd80d1e04e6f6d0384d079c962b1ac27b6e8bb623c6f2e7cc2bb2e166eb61a7045e2b8e0d8e507cdea3e2b57e5bd666793cf666e3b46f1c59dc68407303c7c591c3e630e148bfb6eabab6860ae3b44ac3a15f5a0f26709b1636d594032f093c489122258acf267d197f770ae94ed977cac54264d3d61b835bcc7e4b6a61ad11e3d8fa215ad4d20ddf2b43af575f158400a2010c35a0a700a21ebd3e94b536221bf12cd824d2943d05e3b746e8bdcdaf4a19ebf7d0ebf562bd58af4744449400a204106d52ce3ff3950496b215632e22f8c1bcb899196a610d84f5e67c6b480051028848fb3201c25a0810e5152590944919d7eae067adb53b442570b310ebc57a37861f30c6d1cb2bb45e01c61847a057b54f682fb7f8f211a730e68aeb05410d0b1ddc7566305a7b314d35c0e832e2bc22eb609709b7841cc696aed9295ed8a8603574764daa33d0f219420c5860e10668507ac20a74f8c1c9141e6ab0c28d820e01029d0f3d35ffe3a852b1e0a1b1d6aea83855a7d82e520b05ae832766363637372513bb195ea206d3dfc25caecb7ea759ab3f8e322c9e53d8c25d509c7c49a978542f378612d07dc976e44abafbfaf02a3f3f327ebf375ed9ef4bc1dafc247d9e25b6f576d2361bcb24338ecf42aba1493b7b682578ad9e40d122ed227a28c3079a610afd2b78b5a9391bf30331cd6561513397a28b71c5b6628c6b0d5abdbecd1587b4d1fed5d9c5d62f043d64f960fbe3d8f5610e569a989aa8b40b9d0a62e86824004001f3160000200c08064462a13048133deff914000e637e4a646044998743419283200a821806620c328618428c41062134374500f8f80f105bc0485cff8d348eb05f17bb668cdb489e06625bdc81fd40c9f068738ff4bb2f63acd1c8c344db7313df7f5862207fe8886738f67d92fe688c7fe0d88b0bc0eddcb0e96b933ee5940fedc5ad0709f74ca855535b0911fe167053dd71a622805348d9f8e15108cc9e36717b7c29a176374669bd6a02467037e99f3ac7ddb4cb48064f050c05cd176ce33f26d3101fb50b6d20d55e4ebffed44dcbc1405bcc6a0bf27046c5ba15a8d11a0b3ad1462f0d7da680bbc741faa4812b36236e4fbd607edc520f585157e63af47fac1f21ad7abb6a59ba6c24ad93a9bc39a0289995c9b7a0bbc17d745b94f4b607b54e4cf56680a23656c7950e6f1b07e99286f11f1da54ecb8cb5440c3af280dea633a35502b312bfc2f012d6fad237cfb10711a38e3cd06d4ade78a71c6b33422b1c10532782b9a0ae74971bb5491e78c86ddd81e505a5e191f69ee4e37f66ac81290f8b1bf726bef3b3641840f67b16d43d3d5e66e3a95e8010e11ccdd4a89d1e3608baaa5a1add277ef090529984dc40cebe0cf817087d628221ba199abefc9f07fac0522abcddd83d63e9e323b30ab9446acd3c2339b158df921a7afb2177d9e31a43b829dac4c4344c1c1db18f2e4130e9581e64880eac01108fc432faf629654a16895ef73eb3d1eec58f02492ae967ebe2693bfb1ddb51c49563c2962766aaab5f22a765652e07043bf3692a29ef09875952b6279e4641f9127bea85794e86623bc965cbcc97dd9648bd363d093b9a0a68388b26ef2f32dbf8ca130b034361cf5966fbeb57cbd9655b801e880814769abe03b18c33e07f48c825e2a2c38e9876c14b582558dc28e5a72366976d017570e14489d14f99ba83a06bbf5ca4e56336c10a7441a507052a89e99cf42113146c56dc4c0928d9640e7829f9596b7e0ab7f15bcd8dc3bfd3aa66a6811a797562ab6c9188fc9cdca1b6f039d2be8c1cb6af7aa4d48401cd8a1b5300a599c8097f2a97920cba61cc252b72ba0f3371eb0d08572695ab28868453a604cc53e539c8110028a41f4c38e808624a287d36b8c10491ff4a4b9371689fcc0ac58aef1dd45d076d1cd85bbca37a09e34f9f474a6283b1ab022ea287b083d96b6e93e0a35256ec88d9ef9c2831fa2957f48c2d16417de3bd084c66b908b04e3d2ed929ff7e238ff11d2336e7bc7b3198bf0822b543143afe5dc76772cb8bd2fc1dfac20a19a59bdf8f1c45c4e4f40ea323ff59c6b7d87f33a40b6fb10d082ef974392c4c15bd4069c7d39f3fa2ac85f60ff51e076ed30c9cf12f19de1232c1909785f9ba5f213a9f29e8b7d2d57f952f6f75b7bfcbcf0fcf531f47845e10969516b80dd7c5fcb0ccb152bb0a05369ef276781207cc99722079eb28d97d0e070a49ecb8021bd0a313ab23427e6259d5cbd3a6cf8180de3869c9f1a69d2c2ab1c4b8354ca21af1f03b5c17614d8229f53a29662c9a289426a0b55b90a20fab8d98d499f27eb24598b321bc3c4740b698d42b0a29b589502aa75fa060a20a1c6bb1bb74aaed7d7198cd8aa551faf1ee2115294ca80b8a09f1826c2608c28dda9ce492d1a499d13056419a542f33c2acdee9de717b2e0b496e56b0bbb579dfae7c1abdf113385cd52f8d83c686082a32dc415d70caee0d981675e9fe66ccf470f076226c0f3116521eee0b64fb6099646a468928752f88002af9550aba321ef4515499c581e83c066f80200377c8d6d4a49c42477b7172e15cd760dfcbaa0c6a6d97541bdfb6f2de0cbdc2e9d135295d209c614bde80a31a3657a096173d8f98d221b2f87c4ab16c845cc72edcb59f58814bcb47c740fe4de940eebcd61d7e2ae097dc2efb9a2efa92ee87c4d184fa96bcc4976402551a93508af0c0d36f39f4090623cdc62736bc665066c91654bc8014921043e0fc68a03b2eca5cdf2bc18ddc403b4d7c2894a34d56d60a2c8556d250437878c0041226dbf03eac267d209698f648110a4b3f2fcacfd7ee5a9902a41ae78467bcab64069088fac64320e21f421a2dd6003129561c350821668a8673ea284bfbd6523b3e60bd18b56d9607eff44f03a1016ce2e5fa1093288c203c2f4e43865edebc3506866ad300327dd58a63b75d4911d7300b2c88232c1be447a9c791a600abcd6272b43cf779e4b1096c685aa083d8db37b0949f79c49bebaf689ba99963d8dadb3f64a7b888cbbf3b3f0a8da4795f8488f1d353656a08fd13fbcc0e303f7f34f448e4238c99a542b399d41816e4676168b5664696031cecf83fc1b9486c198763f57f544331f86fe7447525c5b8553659794624f1c345f3937d0c179d9b6a8cb25f503488f2378ec2b68e3fd019a1a43be1149e47d7fe2b8d7cda1e735bf970c872c66317f1aee113d2207d6e45977af745804637bd85634d05e33130064a27196973b32e84f5301adbd49a709cb3bedf0da2ed3899baa2f10a2e41b33a817ab9448337615b494aac25b3da5f101b0c86ff82618c8120d9e3df273cb298e75696fc493a363d313220d583102226a6afb6c70e04b86f75e544c20ef855641f0b4cc5a348e9d9fb9f6296ca20425160ffda06623ab603efd60241693631ef8541c4dacfaf0cf79523339d0c251a509cd024a9d3ec115c3b54f2e0e3b13858ecb0502ce95077588a03e01ea9954172f4e74c8f0cc7a6d8a595ebd9f0fa917679797ca4c18c29a8fd93e4214c2e99ad74bb3fd5b87207c60d5f475c7e520328ea417255ab3c47290eef8e0468b4cda975135ee9d03a0f10902faed3084de46e1f4f9a97c41bb11a5e628a1dec2fcd54d78cabd2241df47ea95f4e328a2206209c0560b35b523f521b23b0e971e076d00492adbab4911bf306a98838e8043a6d072f0a7a3d796291b01f44b2be62885796215d344875cfdeede03983030fbc80bbb7c0ec3f21460d914c424fc6e011e53ddbd2c8b15081c63f35f357aa48dc34e9e04fc9d0487b413e56d40f029a4e41fa982786dc691331741716196964b00d52e10ac4bf301cf36a6f494b15b4ad6911bdc6cefb94bc8bfdf1b43bbbd5938b58accf845ba0d492984eab87c2eff5ee74c304957c2ed4c98f5feb6c4ecd79b04d9418c8da223adf82809bf98c6c04109cebaf0686a3c3e481deef5d0387a0c6bd0c78a98448baee74e2c7ae23800a22ce528619b292d8a538f04998c32cab18686062b093b271c0d9aa243c32dddfe7e24a571f4652631dc466ec560f23ead2f8f77536a28a72d62af70700e4e06458f3efaa83fad4555b351c385e2405c96ee29bbb89118a245db1b1991a81e984e3e381a2bce6367a9be690fdf03ef49513503e329ce112308711eadf283480fb7406a90ce9840fa74c57de846bd89760fecb9e1dbe583b4ee4e06e9101c11cc61fa16efc943604bf763b7348ac076c42405e39a437a4be6635a45c2959c17d48b90279e9ce866480dd3f7648a39416d6a445f037d204a59de12c642fee59c1b02f1c564bc5c3e497169cb722585b46218765d6900c6f2d1a9f156f8177feaee5ca15d8d2e2b8690ea99d6d3d243e3ae083140445ce2f7ac7edc4acb75e2a7a5c15e529a30c46203017f67556bfc286e4f448ffedb831252b7228a465c61f95e6069455c8f1909619376573c56e39e2319df6107c7163dc0611775324249f72c6f905ee0199130dd7e7e073c841eba7036539d2416f75bbf6afdaf612eb90b3400ce32411b8aac3644bbe38a199f76e8986d9759df682713382e4ed570d7b031f332daaac77232c3d9acff6bbc46561507b1d7fcfb541ded68ca9159c01661ab06ab97747695bdc366f6a86d62c3b5e589320fbb1d46bbc438e0ee687b76d05030ea04c895718ec43d174e27f81e38b29f8b259809c43455ed6552cf408b8e7417ae89cb000844ea2646ed203104d72678d1168838d6723da5419ed7b49b9e66231eb9a64951e68bd96e734467bf6738886c4436231959220811eecf6c44437624b0f19dd8875fdd4cf4cd329de74f75d638fe446379935765660a67d4234b2aa703b1518978804e5e5359e679082dc6391a4d766f0c039d6551b4a6c6866d2124538e3bc86d6249b75e468c5ab995433677e332ca7d966a3bfe53fd49e51364950005a1eb1587187ea9b3020cf241f8acdfa877df80469b0d6a937ab6e2cd24065d1c59a109f1cb200b03d84cf208c40c10c175410385fde0e6b367df854f26a876d0bd7a89a845e6f2858667c084e21fe3bff1708fba3eb9695fb87eac858e18d9a3871695258371cf931dbdeafc93fbe2d9ce01894a11a1481cb1b83da29629eccaff2f59132bed56c2bddb2897a44fd8fa665050e81a89e45f73f0e0dd526e62b2790ddb275e7ba89c106df928c6973c5ee559c2d3d2134489c5e73a7c92ac0b3978e7da1d1d976be40b9089f7fffa87960339d8a9774fcf600bcb0555166c13d05f7b634b7c4374fb8aaa9f1c804622ed228facc4e4bf574929c28d2b47efa513921fc2c318d27c633e972b0738b77c91d9ea5ea0dd38e81b83c90e3f2b1e93c9406f161a93857c13ccf89b9313c9a1acb2677234d4960f4cd2d267e7d728e9caaf4a949f45b29bb6628cc97f6a48e0e16d1844a80a83ca254430f3939aa3a50e6d8700d078847b036f6f772c4d9adccd53884dcf5c6cc388ec0022f32589a0ef85806887e15d4c06c5e8d1effdb71489fb89911ce5fa0b271a9902d277cd578abde1e90740c96088689837608c9ca23cad4d6674af16e3d28590ec814ccc75d43d1b561088c5814546e98f5dbc210900d8b4afee40f019766034de42c6eb158615a0850f03edfb3a531d3de41a1dded6f967ee42962353f26012ca4f45ae0c38f5b24c650047655b76bb3e4973a5f569b6849205d0c06fac13ebbc89f4bdc3403b6755461e7fed21bd81085693e04c265956175c8902afbdafda6e0d22767f2dedc88cd5623d2d550bf4921449c9f64356192dba4bdb8b4efd21fb694ab2f2128999fac6f956aedccb547a5ee0ca57375a6a226a8f12c904aa05626c6628788fe7cf30154204f2bc14961a916c86fb711e838967a62745154cdb4f18f2a84687b2595a75c0d20e9162a566fe11dce9b5788a97cbc8515f699e2f25b97c87f437146127b5084185ed772c8cb0f332994fd44dedcfb0d7886e33c868e3f4f5051cca506621e3087cda579cf395ca2685ea2cf6fa240048956f435596851600b37053535cb15f51b3a6cf304e668e86f1c7f4519d1c571e78824d39535b2627c9f11784a14b176f1daa8316d4d3dca0777b758e3fbf12d3973009f9eed90ce4c24ac560a8548193ab79249455a857b18985f55086c8fd90b6829bb06c36176602236ddbbc694b1f31484c0147d741121a7b355043a95d5101fcefa24843e3a547a826eb63298b8b7bfed9fbf8afea3cdf5f88d0c1ba62da3b113d86dd1a27592c7f92bbc864e9f6d8a2b4a265f69148efd985cd6ba25620a3fa33b5f1bb23fb5afbe97b01456ebc013d9765afd7ed9a79691cfa3500d8a0c09f8d5aacebad6f824d1d9c70228a7d02c2c1f4c3034dead81cbbf33bc0c54421ce7f139c49dc1ca07d72b6e6f510a03469d9e57c4f3ae49b871483eb73198ac9dd5cf677876c3ff3507394b75f72ee628c98314885f9ee5477645e2946d3e071f460f85285e4150bc2ae532d1d9c786cb8a2532243115a1835caa2e0c6f92dc02c613d6f74c2fa06360507af9165c722a2f83fc16a9213bacc483381a976b1d7bdd9c8ed8a13245d874e9a603bf157357261f37bef996fd749e87802c6131ed8e8a93a5b0e2139314b7e6d17aa26609707ae7f2afe5368fd061cb7804696e02c97c4225d5481f1ac6f4011a9918b9d075158b1d7bc82c83fc377001e75317b3e161a34d4fe5d7d4406dcd692c413ce6a1014ead6d96d665d67f3c143ed028e37192724a015298d6c2c89ed86eb3f6224cdeb3b6762e3050fc63e032095215352e3666c54b31958933af68773e13e1b70da5b773185604bcbe2db1e89aa4533c0a0e8cbfd3bebbda6b33428ecc6fd863d1d519fa9b442e4119c111b3b4a01e2c14ca4298266013bfbfd6c556c26c8b90cbf5c0e18702513662ebf47a7d7348e3c5589a996ff5a881057beab29dbe4ea619ee2cbf812d2f5035ee908ece448f0afb2a3804596d6a47160d86a4e9fa66d1a3e4553ce6e24ebbec8df43525f5e6be129574890cc5febb2b859db21e25930c0ecd469965964059c01889f26aeb9285cf02509652935ad6880fbfe1f29fa9f82fed0a39515e5916f5710d474ad73e80acdd03301c01d4dbb1471ce61db577013ca438850b92194c86bb20b14e51999f531c5f6b6c8ff4e9bb436c9e46e898dd709a6d37347fceda92410ede8a85df41df90c3b524188f84ed97edbb32a4da1710f1a2c8bb41c86623cb8ad8f3b69328302e0d09f1669e5032bf9e9037d211b887f37389c21ba47807a30069ccab0d8ae51d1c075fc789eaaea87b5a4a239a30355ce6dde3069bbe244d7adb2561878258ee32c66d57526f8dd5a881e9a2b21b8c947f748d47dbad8bd4bb90adce9fe13ce7d114682496481e4560e11f249f806751420ac8579f5f4c0544dd4ffa6dd0e7d94cbc0786721c7a7bd96e1b04de0a2489e984023737ee42fad189580a71d0633926771caeed215cf9d778f2a2cca39c84da17b9e917a40747316a68060627e11c941830f4ae8aa214e0ba38b9ce1fd0bbdcabfbd7b7a18855526590cdfc35a20db4ae1cb43e4f9d5be718d0156f4fde0dba1218e8a7d0b31b17cae3d320694d0dfed81e71777ac4f3797b445235710b90a535e45d30fe46a7ccdbc72581414e7a0875cdf817cd3477a9566dbc4bbb36b9af83c95868af3b3bb2ba198baeceade7181711c847d9b1e146b9b384188e559c8e3311675fc67183c9f8c025432f6ca2a5810f5dc6e9da87d77a493c5af48ae1459240ef74d89f7eee66a7b68713241c320d6b1da0323aad6d966f8c7ca85a2246a82b02aa47eea71da14491f827d7c034400433529f7abb13875b30d44f1a992697ee270e4eaf84757fde610cd01bbff93811f10d732b4942991a8d54aa9c6ec1a715acf6e17062483f6a7c0d18325f131c092da5ea48a2dad734625555d93b8534e502635550f59097ab5aac2aa16bb7aa1b4994ea0f51c51938e304ff7b729e2c11ab6679834d3be2efb76572f6300e5361f63f0878c354ae492eb6c56f40c1f8b855af548224ef1d5820e5134918298670ff31990703a6b2dde943150ecb8a0ca89e52288d88a3357f542d7d3e5523227fc402384efa097c543683d9f50df2c4befb68b9da0e66f91871740006d11647334356465fce3892d2ec538ff11008e6343cd42fca02a0866b247687f33efc9b8e090c1166cba0ae6021267a4520a050770e40c5e04d4d5f534412b953482129834f78a57d10fc18abea59a922da12cd311e8118082953428564a391c9608b8d10166658b39b109ab5495f810e2c7284425b4bcaa56ce11d1b129931c66848732bb5829c1311acfb8db72f103e28b841aa97b6d77b791a59f6ad69a68129d361482673fc82ba0f80dba7970e5a7000d408fd4814305053edfb49adcb72657f60dcc411d7eb0535dfe9861c590eadb868693fbd93faa9f6f0e6545975076200345f5299d2dcd3bed38af468874bca1d28e497106ff130a85095cfe21f3fe8b8d8da787b9e2e50430b6bcbe17b53e6c77cfe1c9321e517bfa8a02c3723bad14bbbe5ba4aa6bb3be6f96d17e5ce069f51dcae3ffc811a9a75943031e2e1b436bef1e7dc34aa4d8ecb345a15bc0845f2afc341603d1faf1ad5f2b585cd21515651d4bd5770346a85bd6e0eb51f3f303744083e95a2a86f31be20489cea921a64a247ca14238a822cccef74e0542f8a5a29dc1cb0da8049d7a1d6f7a5d84f9b564714f55fc7b56171cdfd6d40e04ae1b80df83d3480b4bf82ff5f64267c483f10350aea7cf4c09a75552932d5ca525389dc22f327d69422bb1362327400a2208d0b1cbbedd81e3110059df51cae6b2ca15e1b62f7103bbbd384c2bb956ddf4e2b1a8802af484699bb70ebec72206add27fecdef247f8c6dad40b202513f30e05317cb4ed7ae8763a1631b6c0228e76213a890707b3cba6ee2047e624a7e58a855db8d28ff195a013881355d04ca6aa57428675b822b175640915876dd9c992cf26f19231a58d68872195fc14aa6bb8a2238be23458a0d0ba832c2a73c23c23f36f48170a3848d1d61f6a582df450232463ea1cc009dc5d6aa31526674867cca3f03c1e8ad952d3499e1691e40219fac7836aae0925f80590953e48033e23c4ad1c8ed4c3ee9461b7006f4e905fb364438680672ffb1fa0eb7b097db0f3e1538de47b7e181173feb35afd8cb229f5c79971044444a20883dfd23a1386dfc80c07bfb980985dcc713ee4bab8204e3e739be951b0458f798c71377e33a4c48fe01b3116e5caa5e626203c21bf10d3c09ad74027199496f0a0bf777b830e5a0004ba097242d6cc2aa8daa9e107177c20c0e92e99d1415afd3e669f601b67d199a0237ef8168633fea7a0d75d13bdf8589c9ea85e2600844df0d5efc9d0006d29d25e2f1c879b7a814fac2bb71663d3f8c22ed6433a2bf9b2e342090eaad6e87a32950839b4f3c8135669e7c8a0f88a79dec26e2de9aa080b9429871a5d3fc36d4cf6d044e02cbbd719a4dc974c7ca3693f2efc20bcfb270158d1336a6fc84e4ae80a0a64d62f1e6716a02a9344e9c3ba4f5cddc550aba2ad36ae0ba333720ccadb671cab77834fb80928c7fdd9200f5fe242302e4b235f11fd76e2f79b26a15ecebbfac1f1f98d0b45062e0caa8f19510f3f2a33f6faa4245a452711dd4c71332a833ac0618ff2063862cdd839913d27da50ecc3e416f2b9fd39e09b0063cb226124d6b95222e6d6f6eba7467325766c78c070a960c90c32b82f381fc35b943ee1e3dc6ee7e212d5849a02d597b3cf3ac78ce4c8045a3bdf4f3256ec11c969b5733f9b47e1aa1154108fedbf3077b549c21ac6eb98e512f4ab7d4b18954c5ba1f0032757c5573c97a5ccc358723abcc8f05e814d6071b33d018c3966fe0c011ed562b8e684c91bf2d4e35c78458d766990f62c187c9c1f8a9af551ace74c9195e1e8425019d86affa3576a40e8c16e537f182d85af57a987e836d84fa3b3073dd1e05253b0dc481c970e2766ca1d2253b416dfface19ce0aacdad97bb6e7f6d4dd8cab07f002938e5d91a9152063fb082a87449ecf7da933a93708c977095674bac55e426d3469f74e4977fd599bb42ba45e41b1b33d018838d4e233b404196ae5256438bb13d28ea70f28713ae17ad4de0af614bd9cd4cd46d1fb44b058127445ad19b7efdcb1ae5dacd991fe8e9d0e75bf489f8228b0a272d616ea272c1d6b0003e42ba0a79339828e13cf83540c1b053fac5c6042bbb61cf20b133f85f2002f07b59517881c6af3012b80e592fe2c5304af9f340de75c1dadca066e115f926710d7b853b9c2fb45795e2328fbbe98f7040e64006dcbd05c6214d42bab6f8d187f717a98210ce151712a72ca7a18e8d484a2e69952a28c71bfdff6491432e8c35ecd8bd6d539d7a91db74f32508057db4ce05a375f47f21324b18df2af38713b02597ef8717bdfa71b1b11f62a4b7ccefeccf867d9b0543ae7d6f2d08b5912f1d3b33f9229a0e9b528eac81054748e9e5e50e5c433db07228e86c0f94e62ac0ab6c8664c0fe7f5dd538cc84f6fe59dba9ef08c20ec2e752141c6cc3d847437dd8c76c7f25c6f0b155f8c12e7d1c085a75c41cab1e99f03f811e363d7238c7b0bad0b77ee4ffc2d3c6ae0401956785b81772285be4240dd2f63026a31b1e83f47d1d578a4dd81dbcd08f7540a98bbd2b2d8aa752db2c98d12b1f6f4e57ddb045e56d598a694a875a51bbac3dd8d25150eab04af30eafa646cce150a3fd0bc0762f48f3ea05d54273b4769780a34d6335e2091642dede3b369fac362dc17b5f4d099beebec8f0a2ee302050166f55864038d7277036350c04740bc787e7b558dc0224fe2ba0330e4701287a43cf13ba6f2b006bf19d12eee42f1bbcd19be708a7bc5608327a80c3bc7ca02b0e6ad24462f51fef23a3f4d6fef819d47e7412befaee97f97a1e26ce4fa7971b718e60eb4d61ee34b03b14234dc13607b92a8b39f2aeb1c15a3567810156d87b049496ac203c4a5f53b0e761a60518d6251c947cb0679a32a4eae6c8b2fab420264fa2c5841d447e5e222cf58362bfcb8017c0f41008b1c885605ebeb93f0ab468198b48d00d59448e1e76e5a7dea8a36406a034ea7bb76e2ce4158089b2640cc1c5cec843b27c72f82aa5ddbe24f30a73ae3029780fa9848eec56b48ff27011ebe658a0d84d7f6e8e9ec0f639d90d880fa0e59c609a7d97448b1b97ef37aa7c64e9ee5a4a861a9912d51b04541161fc6ffcf953a14b8d05e6dc97bd055912f81cffde617460b99245c5c80f86373bc58bf0c15f0b409ec917e2d897964c3e4afaa68c49174c698d229f1ffd8f719af7d3de28eb7e39f86258b5b95f95327232998f07142ae8e5b7dcd42621df2386e26b271bf196892799cd45da19a06175bfa1442800592895442aa31c4949614b26c6c0224b17ae0bdb9e5ceb4851aa39cae1542a4f64895bd4d28157a5cddf8b63f931d7c9b766cc56032db563c4655a2c664fb0fe59c021dbd02b299ac952115619d30ab3e10f39d97fdc2ee0f156b06e83ebc496a7f2470afaf0ac6058794aa879739040cc18ce16e9f84a2cc5fb5f3fb0aff563e6ed098cfab0256baa923d753ced25cfd696ab555836842bc614a7e70078a8864b7ca92bb75c4c7e15a9ba4f3c6300f6c4e52bb3f6839b1ce286669b0eac4dd37311d1ccfc1b1ebe111fcde4ebc3ef26113adb5acd2ca554ea751b71923c778bdfee5d57c652d08049c4ec0aed51622050e5e1fa79c9fe3f5cf6c2d3dc1cc6cdeee2866f508247b766b817c7d6963e03bf11f9298622ab7a4349b120fbd5d1203f584b3082f0a5c7100835fcd45f8fa4b1f8df2c434c35162bb89f7792c25fb14f00f0c3087cdcf32e8e2d7559f79974c288c6f1ccccf78c6c6194cd24825aa752ea6d730c5710f4b210d86d6b8e17986b668da8395ea9ff6f6da9eeb9bfae3db95c8e171a8fac981d7b757687656333575fb5d94532695d3145836085f8b3dea7d5ec2066b70e81fdb49be32f15c43e24ef125d2d924d1ac0ddf6f55d9513baec9f7de1edf62d88f8f066cfae48231c964879be613d4dce31f5fa64e1f04f8fae902659d281669927cae167e27cb9e0c29ed4f5670af4a4cc143c0a1825cfe992c56f44b57dc1a942af4efa61a0e7a5a8ebc54e659fb3e8c890d4a0481c8a965b37c4bc751492680fc3ec48141e33707cffc2fbabb080a779f384ae8ea21e270b3cdd61885a4dd26c13ca3d203adb41c2c567fc8f4704463214a66c48a7075af227a2e17b3a49e29726c484e19853d5ffa735daf2094263b089144c3716bacd295c8f1e023b36093df315e3745acc4ca47055e28390a5e79e6598509af584f96c8c1db97ef1c02ea48e889345c9a49d4419093bfc3207cb60471c600471b43a32394e2509f403a81b5a95afb7eb9970e68a07b648bcb237226dd015240eb80cdb288a11e9ff3eb92a350adb887d01970e2d7b1413be3f811a5a4c2911484d926994574edc324e0aa4d6579fcec6b18afc3531903f8b42238d295fe267e75545c02a43ae84ca0e1241f80e7fd71fd3cb33f3528778cd6d9caf4a7638b029c0d07efc6cf93b7fb03e402b8968c61f935be9987e76ac05fc4e88afcc658262a94335253b161ebccbd2ae3bd0f7c17977e7d257be6c80e03422735c113bc82d38f503a7a3ea1e59f23238d362b5d9dafbb12bbdb0bd514d0a87050333d097d608dcbe830f39d97f132a4d36653da1865984d99e36184c994d57f3f4ad0d2944a89d0c01230a4da8e55ffdba8df1b46e58e50db514f85473535ad275e1ebc0026db55bec7ba03a6488226d9f0b55022030b05a1373da74d78c967474a16b1bd05b88ff013e876619274d1ee80cf3b98c2e07f1c610690143826f5f20a7fb9f8f75ebe64b4012324f405c8a08222464a9002b34ef2eb9672739aaf77a78a53b58bc9250b80f3d716b53552e9a48023373a64eb224534a8673a6513a5bab49b2b7aec2186dfd8e9013428a4b7496e2c9e862896f6dc3a8b3287333951fb8675eed43fac568961af0779c962c4089eb6ce4d2e5dbb73355ddb105c4f9539550b0ff8f085d19bbfb9c3a43abdc8dfb361e6bfe318cc4633f292d7df276bf2506f7ae12367f8907e0c5af7029bad9537b6a00a6c1d4601815cd91ae77b4eb24cab40f499183016dd65a761f316bf49b5570e2071077f562e42d6f896a4b9b3c8ee4e247235b5aa6a858e64619496d52e67c56d94144c513ed37e1ff41de0889642d4a85c13a4c503705013ca96df60c15cfcb6b8a2a04a8e18b1f4564de0863127cab57f149a8eca235c9ff883e53bd2af47a5576561602994958de810dc67389ec9fec5af9bbd714955dca6e32a52dcdd85e2fd477cd14498b3dd171fb12890b455eba70b3c9ac6706cfc5ae630d37d56b14eb7024fdad0242c66a12420b0d66463a55b262f3a09b488d16899999652bb3250dd9710330bd5ff4106ba2d7e1ff9e50ba0bbd3b94ef64ccec5256ecca1bb435be8aeb81640730a6b69b3cc3a0bd66a9f849e7020521675cadac13256da3f84ef7f8bab7d30866110d99da021542c3ca0edfa789365f2cfaca3d074efc3cad57b9200a24fdf816713efd9c23e0a5a8130f51d355b49e8a14c54f698ea809240b2e0577dd90a7892edd56920c29b38223d25acb2841b01aa090e485aeb17a590d71812c234508e3f7c960b4a556624e0e3e0a7c574d63ecbd0fcd58026559a84065900270be75e519ec767b9586a1412100ed826447a4715d1301606337394dea67c1fbcf774eb7c89a24406b52f0e1419e3f4b11c24d6757d36bcd7d948b806e00019b60bf645a1b8b28cc4d4c80a69bbdd1a0edd2a9c7e7340d925f2c6b916675bbea6930201d6db3d28bbe5e0984ef89f1bffed575ea90f765e9e3e83f30c1a7658f0e7cb08335ae23ed44743064faf9c044fd33566eacbc8de42d9929d7fdc2832725cdd1690e296454674b49c2ffcebf8f12ce11114b2f4917394c2d39634fa423a744549d8878c030810451f3f0ed0023d39f67d5e3043145780e2e6439c6a3775c82864069432319e799e8c050b6541d6ce820bc620b8b15dc48fe13cd963a18d0c9ca687d3a981788d9460520714a13ef4374cddfbf55587a2139354f3183dd1369e0966322a46e0e4ea828a9624b545e91ad282dcd85223ddb5307c04178b92dd825e0ec0737bacb267e5b7855e5c994d7f03224d2b53aa0153c559aa17926491fecebb041a6a9317212eda8ce1709454c1268a7a1edf4d2c877d5c0195e49bfea05af44c302a8fecabd3e8d7828fd3147f057d741086c83537413cd0141a6c3ea109763bc30efc714cee5e03e5a4b83cf22c51ece55a969ea8586261dc8096a86c5da2f2a4d0e519c8f9efbff07b4d1282898cb14d27248b0bc62ab611ea5afd6b55fff6f6355017fe77afb1e45442e5153a50e5718ca1051b4bab8501108991d2a954c9a8fa571435c1993fc2f75ac2f44a92e63040405808c31867fde8a660771d055bade036fa79016210caf559292388c0b18908f55d98d7c098063c0c4ce598e28eb62056b23933d6e4109b93e8a72fbee152bef5549376d16742c6d31a5f9519237c169375ea4183723d65350ada54f2335d859e2c7237638be007b9aacb91478a77749f70bf1b83ea763070126226eec23482c63aeed72337dbee1b86f77785881a4d51c8f3ed8f117b9980eeba6d93c28c10e2fa68b476824094e2c8b0ecec083e1d5b96d29e6726f79ca3b45e72695b9be8a2dd95cd737cb6fead48ff0a1881008020327e1b6265f84cd5acd2f06e3961594d33fc2972860a4fe771758685dccbc9417b6821707b590c377cf71da2c651ba944b59fa85696fd42731785ee9043ad6261d3f2abb1ce80d258fd7439b08f5c6ad0f3bab012c54020de83d2cd2cada1b7f4fa63359095dd2a8f5951282cd7ee2a9831aca0532cfe3e8a80da08f8e6bed50b6f437707f06193ebe86f0df6859ad6f4e6b193dfe6aa3286748066a619e09065580761c9f3a4f432844644ae02bba36c501440413e07fafca340acbab4657f7922e65480cd112d011f1e946fd44427a618b381f2688019849a20e913837b57a55931e1ab8ad4a0d0435c0da39fe4008afa08621c3799d64692d86853ecccd2d1f02eae4b1bb1b875b75fef7e92308415351fc06d221130bcb21a637bc79c320b49fbd67f324377224b761fc9a46441a974b4da0098a962c734ec1b53c09350850c43749f57307f1fc96b6ed9b8591b7b073cb0dc87c0e28c38ebf61033cd7546225bda65247284ceda8cb8e2527f68eee4bb52fb8e7689c6cdfcd8c0970d2e466d1d459e1a040a714441cb5a99280ab69b85bf04a95960eb46c3957533df7c66006c24dc6b35ae3130b7787b18dd8ba9ad456c88d64fc8573aafc114bdac06027303be48bc82aadac491f3b2fde8510b06d31914717ef6aca3ef0325bcac344b22134595d8124c7a98ab3bca4568042cd7386030846341f36021ff9fbccac4ddd4155f88284fa22f85ac836a32700c84afb672e2120b2a87ac097528565cd97439de6e44cd42b072bf7505c2cd68b3d6c20745e765c550ee2e462928437cf757638b9d2c9246acc824c59a5ab7f541aac0333146f1508bac6abe12bbbc25b6fd6fb5b78dfdb401656ac47289b940346131410174bc508b648ee05948db8481eb145dd1251e8a98d40cc838e41b1a0613674753e4ef934be6adecdd88b1d1cc5c0e3af2026b8d4bb764de0aab8763410a8d32727e71ff4a6ebe0c0bdc3b199892e8d3744f76b04823d8bfea6db7630f56174218db6516b27f9828a9a2f6e6c89139b6407bad21687f800ad7aa1cfc1d1b6b553bb57698101e092a10d37adac9a0a862c3312e4de675f99f97585608bff01c7a1e921204af9a7cfc301ded3dbd63e7954246ee2d2b229e1e27a52f718eb3abaf381934a698ca16b2d34293279a14e5acda666f5979456e21fb61bc33a32a794f16865ba656c75856f87605165753a5b5960b81e46ccc7912a77dcf828f4854bb2c1beaa16a307a4117340d417b3da993a2f27e19345c2b0d36abac8a60dfdbd5ce5e53fd91b5ca442e459f6abfe15202268e8dbf8791d631b027853d10cd159092f66d08ba137a5135357420c880a988c439b4c354a4d91c3e7fae52c046bfcfc5e27234963ba148868bb6172ebf5b6216025b89a275ea9645481d6fd29dfde29f0851be2e79a703ed7ffd7ef6aaa55710542d9663bb6fba52e1153f15f3525ab3f931bb29df48dba3152b2e699d358e476bb6beeb75f86ebf038cfe04b0a00a6e3e24aea26636ec3d14c53357cdac991adeea8a0a3e57a5a68d3032ce47355c8e03446b92426af4531635402d46870558b37d1a107b6c7a7dd61e6e0269b58c269ecefc01cfc54e832e7033b28292e0125dc49722377afffba28cca065cc64b8708e7c259f2c63c4ea9277cd2f116b53a1aeafbb886c332ec6b801f948d61d0cb41d28a9f4f9bbc8d34264ad769f5ffc371585df338cff57b504b909965aeb175b10697ce097a43c819a081d55d63b4b1ba17f13b9a92f178a01a7bd5cc9f5d91d726a44ed463b095f5964511b3d97ed35be15a3b5c161de687c046c6ad72b965c2d12d15408740845423e566b96dc1b88116164fde6988bb0f2f546c09b799298938c97ad98f6c738534f499c0e9b25c6aac1491a59504414a8e3329e8cf81fdfec02b22d10b53265a7e03e9ff95edc2371d59635e873a499ffa2a6ed7b477e548bd4a639233bc9959aa66447a6821fd5c4167d27e0e36f3592ede66b9a2e5cafa613cfa74220b45baf1fd89d7ce337ce2e2d823728d2dd4234a5bbe1bdb77babd9c6c89d4a6fbfa9336418e42aa1fb584d3c598818ce72a32682fba29b0061bbc04df50d840299e3da0b56c51f561a8eb12db00a369a4900b63ba6395068ccb45ffd2981a5f0fb0472612ac18b8f800493586f49664ca7d8a7ceca1d34e6f8850b14ba8fd3dbbd98c70ba382d592c7fcba3a094319f7279f9541948bf1c2c0c3c9dbab0a119c8d500a51f38155e485a2ee192af871c568d784de826269417918938256c73d41c2b99564a28786c209fa37f9320bacc6a8a26a2469ec44684c8a67fe4886ba81a34dea990549ec79b9a93a67a8198615c7f3f008be1d92ecea419a3d70f8e080aa09b9a75de7a76e248c1dd8d365d0ec09d904d6f5f7aab67e8aac6c9739712156a92e78ad0962c932eb92431f61e850edca88b59f7b824b5f68f905a81dca02a444473c071d36cb79e1f4830ec9a12489315c77113ca55a204f5eee1a3d00398b68c5fc026214526ea7fc2b9b9604dba4497d56eacb9a0215875ad966910365ebdf4182c4130c663e87cd4be62309c9d8c47f7958f8696970bfd3ee9fa942d397980850d75994e41c4a56f783fa4b3062f9e54e64bf1504afe8e99cc7684244833dbb4c427b7521eb36ddce0a7fabeab1ad9285894a9a774945893f1f561bb971efa73a98ff472f683d3f8d453101a48d9c2abc72f9d24c10211875997a5db45f72a4248a66be83e5bc5cd9d0e42eade453eabb9591fb269ed9463839a834ae4ed3298448e6a4f1966bf4276fcde7cdfffb2ff3def79294f9ca086740a5078c839e354fcce7b20725db3e56ab8b0fa880c82171ef80d2b1c2bbc90ead375e1894bb1f21d6a9f1fe71c5ae44a3b686ed4e2c72b8414941a0dca5de69c80d134d368284a67214ac923446ffa858b547fec85328712ee147e7dbda19e6d25ebbc2bf07951a6a017c5e948b174a315d0486defb42c7cc99e26216c1ac4859830f695c102f7b96ceea3866ac72335b7b16644bcaa0c86861ed949f3850764a2391eb83c9958cb330e5a424dc000a990a26340e46176bbb61db6022657dfdc369e14c398a4ac511c656421be5eee429912caacfe4926956bf9e8913e4f8eb74393a487f1091a32b17009650963bc79150c954ed16bb2e0b86e06c418f068143bf7abcb4393461f4c05787453b018db1b7584d53033f24f675f6f8e0282dbf52701d1f4b8042160f487b817a35916603ef943212bacb7d30ee3361f1bf44691e85b79eba51f2198df7a154d2e9e985fb8c1ded1e41ee61b2804dd92e04ac6bce5020c71d187be1b2a298074e3dcc97fbbc89e6a0b41d617af12fd28309a597fa6386bffac8de210d60fa6943fa5b6cb122285061db773f50958c38d858a04e56794e644441ea933f7d2a1fc6ab1f0dc582283be698e47ca1ddf692fc93d72a96a23823fd41690fd2d716aeef604e30e5ff19923a61c8473d9b4e480617919d14eaec9febb05870ac29974901fe2ef0255307787070ce7732a048f66ca4a354e2c296f85aa7b4d8d2359f7d5f04e0a05772bb24c3a3793af39770f792222c4bd22a7c7ddfcca5764849763897ac6541d1aa703fb574c41737fa6725181da64569240a875bd406af9eee52125c63165773a6bf17f4fc32d7e8ac68b2acd87bf184b9cd44145afa5b7eaf5631c456614901fa6a542ae11608bd6302bd9abc5c57f99b4ad43bafa8fa1c8da3d362be12d0e853d213e7ff4d326b8642acb9a1e6fa8c7035b6291425455b51497d3b4a4385104d22ddc86da1b0af5808476682ca13754db2dc4ddc9b397df504c8f13a6a094ac66168ba8e435c97f8bd9a49b45994455da17020c42c5730e2347394b479af01ab034b41f456966c3197a3060e6a26ee5adc94ff9502deee63a0aca5c510453c999be177ec1d71bf4c62cbff6d7e032dc5522b40ca6f15dc365b0bc1984f988bea6df41f2a45f38ea4df526702469c383562ff72a93979e0876a81222ed4599d9f6661c4d5932249b52b56983e60ba96e67a515b48dd26ba6bf8afc46f2326eda3478fe3aa7c9d6d2c0eaf5c6889dfdfa10091e732c642025a1121bd2e19c5cf4828a6735556d610f0af42fab9324bfbf242128ccccd0d02771f31c1d3b978d62471e48f2ce23a3faeff5321782d4d55070d51d6b5564228f16a32c2116a73862f0c83484f6a17f2408fd739ddddfebb42f54f707531742d5c1ae6429215d95f98445e474265c0a04ca869db67b73b020815ca01f76c51070a1182cda36953cc80b16c7df2d7527697366d0a5405f383c31a22b194a3cc86a9e5422a7c94447ceadc59c39265b1b23a00b4e94be39bbac2120632ba61cc8341cbf1f60a9982f2d9a911f98c2737bf55c4a1765daa74bd42db5b4bb4e76060896b909aacc3632df1e984d6bb8feace550ebe05a88ba17c3a116fd56b9171b8afc108e226f7f79169fc3d98e3491d0a731834ed5eaeb3605da6af25868b1f1ba753de85e8089fce4d2117a1ac0d5ff08148a69734c7fcd14e8d0334b7fcd4549ec14a515cdb2a89ee22283d5163b90e382a445191e37da3797db2de419a8f2795f1f369546f49816495abc32f7fc84ce6892749f6432678df0dbbfe5c214836aa47a33a57ea31b8f918c8f1ce7a70a8298cb86e24987a1d017d98cd1df7fee3365f60d18ec8513fbbd89622ea53ce5cf4fc5fce53ff633da247e4782d74fcc45d0b368960f20ec3dbd5f453239ad13a4367e9a7ee26c990ff4f058d59b58b5844eefe92846eed984f481790e7e3e5b1e9ffc5cfeb2dce64c0a161f8ba94ceb48ebaa22ee2da5c788471fe1109d18087c3b035213c9f81f5fb8cfcc0220504142c034888b3a63180b8c3e7328f84642b97303760c2e2eeaef850351034edfd6ee10399fe4630d10091ee6ac5185af498f867a168d244b5d7047d1d2abd74ed0ec2437093d8c5afaadaf9c7c48352ce221b988e5050c322c30920fc4f1b18ba85d53eeb6daef09235794ca786816118d081f74f3fc25d651aa4e4ef1dbcf1b4420b26030c741617cc768d9b913af34b28c38bd558ca2b9233278d38b4905127806d482ef153d350d823d81aab9e2b2141e342185e6a2f009e712136bcbcb8cd02b56ce93fea5e29bf4b0a5c6cd1212c393fed6ca3f7ec173cabb4ccda7a4da9d73187b0412ac85f861101761699297cd2f61e7d280043602404a1b84888301fad120a978bb3b230d91c2e10fb12f019708b3802b159e07f904d8464e2064a367ae2a401210b130fa4357d6414da4b078401c6f0737b321d7a40f99eec0b466f7ee2ea469cdfcfde68824e03813b5f6f9fba57b7bba7245dc2a53588e492c203dfda1c5ec3dfca9c4c3ac048d6f5f11a61ae92d8daff4a38d5d871ec505bd5becfcc9e98d656836515692dc56e6bef7e471d55883722b11d414b71d83146b66d607dfb29bb4a8ed3c02a1fac3af0bd4ef033af6aa9a5c30922a6e0e728fcce49ed49718e2bb8182024a1433b08b0d072736def2682e08ee336c8dc9754276dd25ed14bbab7a41488400105044c48a840a645a1213d8de05fefa1e91fbde89e011668c5f047d63fbb7b4d1d2d226524a99a40cfb097c097a094fe61ce14a1cd3b7943960395ed3e7a04a96df48ce7b9687c17b96ee859c4a6a535e692a85ace092964a1d1dedfd0fff48647dd994265931706ed24a43b28f64b09548f57e7d19459716946924b97ff1c06721bf3791a34791e1d3f087a36e052bc7d5db6d8fc3fdf6f4b7edbb328794737a8eab1b57bda75cf7306cef95424a7f04a724443fc7d58daba86b80166e09c4a2f469652b915e0375a34a9d4eeb72f4526b4fbf2e73ba1f8e8398fee348d46f24cb9f485de2b8f105ee518fc33d4a3ff75ee26ccf52e6947ea3ac8fabac700ca24ba58e4ef7db0a254b1249595bf7859c078eae8fba80a1405321f449a2c5b6cfae9fc3c7554e62e266fd1005fa146b110f362d4931578d2b58dfb5b22a49b6eb6c937e366d439fdcaea4a15d49b41cb01488db470f4fd9ff4630bded1aeeaea1254e7eaecc19e5e8df3617ca24a73f1a9aae26e7edbb52c8ca6f2bbf6d9fb30b65b10c52fa1fee2d50212a64009b6bb8a721512155d9f649558004b12b97b73d3436456b432c7f9a285bb3bf1732bf0b497a91ecbe85e41ee5fd890cdf448277e57fb889c6aeeaab870648492a2211b5507a2f913a3adde7d7e19ef4e32d836cbf528ebefd11ff9ceef37b8943e29e1402a14b2465bd4083509b6ddbff805d8dde522940a88dcbb6bf91606c5b5b3d2a0aeedaf685edf3e36c9f7589939f54e68cca1a06d1091ffcbe7b4e67fbfcd7069940066a6bebc2eaca4068748b6588f51008d1ae8ee09a7758316f5f2f2a74eaf14f2a04f3279db9bc7c0bcd167190dcc790ddc390a81f49967701ff25fc96d18ba4a7e1ff701c2465c5b04692b24492b25a5e76f5019bb22f9bcb5afed7d7eb7bcab25f7bec6aa4e5f802f7dec3d0fd570af9be7baf147204e7fbae1ca910ef39ca75a4e6381a9a202d6f53029db12b2f9b7a2b2b01d4142d81ced85cd27046e8fa1514edeac80228abe53d5349ff69e5e9d7b086d1ffa361f4a73bff5d0065b5943a3adca35ea77b16ee88ae5fbf8e5e06f1e8cee5578e5e8e2f70ef3d0ef75e997364fb1c1487d3b19477088b3c1244ff897b53f72be4789fb2bc0550962e757448af13becef7ddeb8c5e077c1def79dc246b80c4200349b29445537bdcb47f39215e2d43b07f473e1a90e476a069057a7ceed5dd471dfecf5f3a14e8b3126d4b54a9f88af4f66b155785ef51bbb2dbc7be0b926c7863c3fb20e9c3efbe7e4f7d45fa36b0bd330309a0db2bebabf3d1678d9db565bfce561219be9b95c461f439435823af9667903d7a2a8e465f496ee4fea3117771f9323c8ad0b6f45667c347654eac837a85bbcf0062afb1810f376d757206b186c93d69ec3ec12e78a2a666036db5950a9940ec3f15a2b5096d2b1d9d4336753901778219669c7106655d569e5281efe2bc711dd7c1883c665fb50b7471deb88d831179ccbe6a17e72d6f30228fd9d7c519671891c72ebe184674ed85f97684aeefee9472955362bdba05bdc3e0a533f437bc8119ef8f03b70ee43cb0fb400f04bf7005fa8ddc9d764dcea6ded65a6bbd32e7b66d9b05396b3577b23eee77c0f79166fad6a7a58fca7076f575bf3d063d9c1ceef31016d5b4197821c5091eb49480a1c66c270aa787d027078b1169c3ce623af070f13c68d2b4343efa34d7f8c1445510d121dab9b02a882801c5062bb2c17c80a470c1554dccc4ae30b275404e1451aadd99123068f6a5240c29604b89183738d183174506080acc49f88a95208d20acd090b8b4684688c0e8e2abd160b606e744b528a064a0287cb0831088d4aa228a1fdbaa428a151055f1049231ba5dcdd031b8eaeefa10a0b2eb4fc055a84d5762ad02aea2b22ea66c2aae438d3d39c13eeb0eb54e02e2aa5a61d7c7229c5df9d32ac5ce0febaba0934358961cc2fa7c8918d4589f7d811134d6779928f2c3faf00d2ed6978b2031c472219e10b13e8e480f11abfae00735d6e78196ac501429627d1f68c92a851242ac0fac5310d1c21300c12c5942510f5cac8a8330dca0b13e8d46108b2ac9420744ac6fa5893266accf14e4c30feb3b351154637d2c53e0f0c3fa50b017ab3ec1021f17eb13e90d5ea0436ff0021d6fb176725083568df5d522caa0c16897b1c5fa60bc529812b47c3802637d2f48a6d862e8e504d3627d315e694c55228327dea8b1beb116b5f1430fccae77c4b1ff1d195ba051762dc7164bd586911ac0585fa557280184a1d3b56465c20d1704b16a0fa4bc581f0ed09215c90888585f0ed092988a0f11eb7b87620b1c5c9614411dc10a88a8b1a80fe0042d595ac11b33d61702684911788b8c1e19d09222a03220604163d11072e08809c1ebb82d871042083a9ca4ac4e0a6b2bcc79cae132305f26c1c9ccc9cf36d7792280a9d01c611c943126819e496b68ecb5951e6cbb2d4f532604508b987cb142675378839f14ba306467989b49756fe4e5603032e7156dede5b88ac211c5a64151c488302e2f238c1883039583e53e8931c63f2fef617b3ff06c6af1cfeb87fa0ee4e512c43f9805d80806c246300b8230d0f55e1e0f36724bfc037e5c082519ada3de6d0300d8a34ba7fb5be9f4e2a9f42277e24abded083beb3bdb6e57dfde23b18fde2e7962137cbd525f4b8400f098192100e10d16217461c8ae58d4bef2bc97f8583bbeee2ac17bf580729847cdc62ff0f66073449ba4f95eda1c61e3975d712faf355c98999d7be0b145d8d8479f30b801fb96a9dd919c00dc848a7df479772561f30184c1048d0ce446063262caac62ecc31699507702e42426725b7c601b9dad5940a1da452944289e2439d174c9912a4b8e106dbae4486d9fdc9223b44d971c11dae7dd7e648a5dda74c99112049f88a4babd386f5ce77d6038a2a595d20a8f8b13dd5c096bad2b26d9c7844974f314de7b4f2c59c058502c2826b20f08540baa2517b5882de21ba3364417d125e3c07d68b8bcb8bc3421c2a4c6bd8c2f2392263f4d7a9af4208220088e304d685c3541412291483138381c3970e4204921d37ac17f454ef7c5b5f0a6b22645393ec76bc1a345912b9a4c26d393b47b2a62616161214b2d863e335a5a5a5aca1038700c171717971064bc18c77194d1d135a958c000003b00b0630b18e7e2b4123bc01c3972e4d8617237093365a666708d4881d5dba29b21841042082204000b970e1d3a74048087d025b151c3293323cc8c904551165382980ccd38b0360209239030a405165cd805093424d0dc2859a6aba02981a6846d08a64b10400902986db1461a68682101982000136e149836a18709263cc932d14d12482081841e3d9a0c71259450420903184013245f0d5635ab55d7031259c9a2e6849a9a56b7a96cd67382cd0927804b80b2590ab8d6cc071b146c421a6a102a499f86989297cecca8ccce98d16642b3293627040a3e5040a189d03e412a6b22bb51de470a3e7c14d92748655bbc9165578d2d561d2a49ad00da618b29a410dee04b6798f0ec6d53991324368d6d81c4f3a171b2e344e7855485a6b22d5e7b53d916aeed0f5a295b240088020a28a0400002a0ba482185145228400158625080f0a6000528c08f1fe10df9a245d11515f0c40344e85386479f662843c5cd21579df77de87bd287bce6352f7222372b8a47fcd104124fd58692549a5da9905d89e2ec8cdd29d91d49f7bbeabc2f3eccbbeafef703a218ebfc2dda2d6587bd6d7fbfb5738ec5bcd8229468faf41a9108e32bb3d56add106bb558f52fc9d99513556e28886dffbaaa47d8829a4d63a6a14f27aaed7a8a4ee439c0b63535e174a5b39aabe90d92a871c30d6108a960056eb4b1c3bd2f2595edefc2896bfc8855c441193bdcb8bef78a6c14c152515de8e08b9a0332687073557077d72db8c00b35d0d0810837d6607915ff1eeeee9b0dbea2e3c238d9a7cc09fbe4d1c3471797321963897dffdee7dad8f7b5880314ecfb8f8334f67d930cd9be4f436564b8b16f14590e8ed8f74be1cdec16f1c0bbf7de7b6347180387ed4ff28212b55a2d12b0ea9fa7adeab14f18992c0ab0cf1efbdac00b73dfe7b40dded8f7452bf6fdbf3760435693edfba3f0e6d6dc7bef901508218312c82007378ed07120a8c173efbda89d7b6d40848fed0f8251833760f6fd2fbcb9dc1a41c8b706496860c6be5beccb7101650900f6fdad0d2874a6b335b63ff668570c1a94fb5eeea342c6888e204612dbfd7e8dad008f1b4110f9a20c2790b06e1bfbde6ddf7bef55a2cf0fc38ced7f5d65535f9468cd81a1b37982c078f15004060a7ed83eb8c03062db4ee20f2f4fd11eee0798a7e83eb5b80511453b88960c0c293c00d1b381806931263303f6460f644e66588c51860637953999728393222ab8c0c10b2e88b04ab850011074de54c60590193d53b478a2c39419ecf369d4a04b76aa6ccbf2e7e12a17417fcdc60d342a9bca6851eaf3d854460bfa669bfba1db8ba6fe18e568bab6f21f9baa2b8e1684ae708c665740dcac513607c5cdcad54a8ee6a60482b0b71bf6f6fe9466575febbf168d0531a8e4931bf25ae4b83dfdb12b0e0c9aaa3fc696b2eb7bcc7fec8ab28076f51847fb536f1cd35ef2c8f298f3d772954efdcff501b92a89afeacfebdbf9622604b2ceff7e76edc13a75dddc4810a018904c200a19a4a830a86bdc27bb7ec53cecfaf5dca6ecfaf5e4924882daf8bb1a148ad0144aa5c73ea990ce0e4fd15e639fb58837e3689c10f7b3eb6f535c45b411edfa98873c846318769fb88a76d7a036580c3d52373d075d9318a1cf1a8301b571dfc61c65675214a5a036f8eb7f98c400256363c00ed1c463e3f6746fe4cb7c14d42663e05a8ee62a5a8510af5d9f83526b88804d01dedab6c400067239d69d4b1a65e7df3e9718a051f6f6dbdb72b43f3ccac6248db22fc9c374d31c697af858e3a366d7f1870a6e568ee6e5a939daaef69b9daa7c54e62c6ddde2a332a329b4fd3dfa532163dbf2ab62d426a3296470552d47ce4d1f7a6d831091dac3f62f360d65c104fa5f6cdf623b0abb0ab2026efa5b3c836cfb67a0ca66322f90549db3c6bce862fb50ebef515c8ded3fd8a78f4d87b6d33244005d51ae00dbe9924c6d58a0bb0691cedc2fd9d566ebc6d9943dfdacb54add8e349da967750d8d5dc98ddc06ecb63f5a6a53dc756e8acf56777b31293c439f1cc8f170b3737777f7ea6eada524afd65a6b996fa01ca7eb905d771661549a772dfd8a5110dad65a29b509c31beff32808ed07a05820b1411a8ef5f39b36feeefdf7f67d76f4376ce1eef04d1e397bf4768f4a1e8e00df0b185204900d690471c5111adc8045698af423529724f2bce70676f838bc09bf1b9167ce1ebdff4afb5ed9630690862606dae4017adff3e8de7a08b0fb7b1e39bb7bfba6e93c7ab8b9953435983452b4ad29696ad027d374d3c288507646352761c328a2e9a992fa5e8ebbf7de3c82fb578fa6c0443e2ae37d2830840132fec08a5aaaabbe566048ef4712fc17d2f42ee4e95b449695d2ff701892b258603f35343531545aa5854fbff07bcfa3811e8d466371008df60007c4c0f21e2afc42965247c7f4def7e1b0fc1ec7fbef7424c88a4a8bd582e118e4fbc20f83360cc3d0c4f2e18765cee9597e08cb23bf0749961ad27080baf3d7308887c9188afcb8696b68e80c0be1a6f1cf7b1858401762700501d2bd4e1e838cfee0e8e0e3780f8a5e6a9bda3efc212c4cdecd6ddf71e07b8f03be877ad0fbb0cc09df2bc3075f08ca83017c965248089e564a1d9dd27fdfc30347fa0b492592776915687352103e2a736aa29a9aa4ca36576776d5f2f67456216fd5a23c545621cea5d4baf41e459e449bb24255a8c67da0aba788f5aa423556838208d081a3277d0ee81854859ff42633469f50059f8ef461f01e2c8508398203be578e54c847ab67bd562caa5015aa33a8585421a151f7b9e02b910688c7c07d7e1ad27059c8f075bc3f7d0df7f3b3909455635732780d2d1ab932c8578e172cc7fb3d4e773f272cbd9c53194309c4a66c0db25f89ac2c4c6a6afa9b484a4f9415a4fb1feea4cea84d915d816fab942d649df3fe5561b6cadcfc098bd06715aa4c5ce5aab3cab6905799ab9c05e47b6b1fa4449505c4ae286b46ab15b97ed28f3e04fff3be7b17eaacd62ac90e1555a12040aa9026ca7eeae2dbbe7eddb9307fefbd579b2e3531e4f73024f8238912c911bb90232e91236e2147ecf7efbdf7deedde7bef353d65ddaf3ddfaf3c0ce09bc05fa1424cff95237d90d4f75e7c6f69bbf7debb79499b9b857234d58431eabfd7393d884da6adfbdef438df9b50ffbd973860cee9c17cc4ff03c9911c73f939dfeff1daf6fd09cce02b548cca8a70010931f361e25e990f8fab48fb05d37f8f63facf2b7358de548e389738dd8365ceca774e06293d8a147244084b39fa9b1e7cf04fa49095727cc1f4e08f5ee298ca11affcf723ceca7fef23e6216b80904819c0dabd17863d7472459b3a927be0afffd527f60388f8125db496138d51225a44fab3b6b61749ef5bc8ee5124f72792c54472926857d5f57af17159636245c15da2f8db77cfad68da6d37160b627abc6331d6c6e58fd8d5ef7a45877b0f9738dbebcde376893c1284f49f05453a83ff14c717b6d70f83f7a5c7a4ef1a0659f11f255d4313d331fdca7b38bea0bf7b1cfd5d9973247f8ee9f5e712a7f45c99b3f225fd1c59f24813c779d9ee92264930406290e103b31a51eb877dd390eb60edc5a4235570ada377b67dbd5359e2dbd7a53fc5a7f15c48961749d3b790a82f91e0af9cbc8fd44fc3119756be1f7655613f8462d02edda2e956c5306d770dd707fafeb7f9409f2fda947507d0680fa0b1a103e84c0c96e3b41645d3a4a1a9a9b9610d23f6babf5f431afc6b701a1640593a3aa867791df04defe588cb20ded36dbb72f423414a6f9f86e5bfc761f9efb9d3d4a6b73521109a02f627406db86dad6729a56d15a88dbffd1bba72003dc3bd42b8bd8cc14372fa95dfbefb1cef515d99d33df87d2d012c2c27f285661fb3a912e828153bc6f7c3d74b2e57d9fbb4bb712c9bee5477f7fc4f70bea8223137856433540f7495693465ff6ebbed2c065d5d9a7232bc9b97b939a2b613fafcd80ba1c0f14567ece3169da9ae011662b697ae172afefce92cc0860b303dc516578c317698d1e90153998bdcac2b981a60c1dc218a87d6928ffc51db6bf5d0431686ec244c7f4b7007f5b22b5369513da391178b81ae431f33954ae1cd37c54d53d3341a4345a46d5f1755f1bf44d4e6bee832b10cc9f42026431436f172d5ccb60ff2f80ac583f2f1f193e94fa68c83fe8a8aec2ad36c91e94f7f2aeb503904a5566cc2dcc7f2108e5ddcf7dddc3cb021bbba4e227da2e8720a6fc0ee002b5f62413fe96bf842851e7dc7c2e8fbedaf93b492b042523a73a2760d5b4e71fb0ab43cfdef0ce276d4cbcd50a63bf2f43223181e2ad19010de4241a90efdb8465825d9f63fb7e0eb654ba00fb5a974c6bf5ba214c5ae54ecca82fa637e4b58c54bac4574115d5c5eacb516861b7be80c92fb43352528930d9e3ab0d83a665b070d5462c87a39e43d233892a44d9fa3f8ab8783977dcc55e3e72a03fc59c2bf0e8527eaf542e48be47115f7f66588a84d8bc784ee197281e505cab75582890195688f711cd8085ddfdd9d1c2f0e7c025ddf749f52a16f7d166d53e26c579c03cc1fde64286eea1a42783302ff05c9d8436d30a5dd534ae9bdbf9d393e22fb44bdc8f3a3d9f0c6cb5ccb3437a1b85984aeaff3bbca3ff6b19779ca3ef5d2098d7ad9154b89e2f194fdd3a9747f99af584a54cfea9998ca9f277ba4027d66dae973cdae506f5b5a50e50b7dccf484a699062ea1391349926519de50374b1a9db1af6f0002813fba8c967dea28f40fb5f1b68589b0419775d0755657c905ba844a17a360187cfb2824aeda8292a8362126a827ae1aefa502aa60045472a672cb5c72957a4a3f2557095f7c296bca0bac0c633a84f006fca133d66563fad301ea086f341437ede700089f7ea9f07ff8278208e14df8df4c787359f4bf1146086f2e091bc67704fd3ffc2381049ad2d38437fac32392e38cf186378c3dfb5be779dee6791daac74d5411377f502f3765a043f08660290449e4f9d1ce194aa5255f54d97489174fb6099b2ef9e28aeda17e4ca009268437e1833564c17b2fcf17247aa480af368548e3b798d4813f9844c2a6d91a43a40e833fae3a350dc85520125779199dab3a1d42d406bfcd016e75c80b57d8362eb16bc8baffe7cff983fe1b79e6a843a70e2cca5324d29e69a511346247b05cc137a846eb514076e52cab63676fc87ca51302d1a08812d10f8840b7ff4c5ce565945c993692e9b3e4ba1b77c3715b783f9397a46e8631d07900f8075dfff42c7ffe0a31fb6ed3c7ecc7c64b93697645a389fbf44fb329fbb317b2a91148c39c1fef381076fcb39aabb68f811f7315dd2f137af234907c999b4c5ee89fb849fb58f83fbc92df67720630bcb91f86fe21393a79c15545a3ae71d6945c74660a0dfee02f34cafbfefc1c25c4b6def6af74857a51d40ff4862e3c681ab539a16ad4e68bf212b35f08667b7bbce340eed9f30d0c289328989b16f50a512f144f0faa88abc2b78ffa0949140fcac74d8bea411541fd84a857929f0103699aae8d57d37c058630d05f8f5d8d30a0848c8e7aca32955f4f1d61300919bd4c427cd3b34ee5109697e707dbd524512da448a25e3e00f005f6ecfaf83f6653f76b6bdfb2856ac3f6f28576dd231d7d7eec635fe238ad45f1af69965ca813184aa19daa505f02772ac803ee8864e9e503b0df42529b6229c1b62db9a4e8b188abf04ad32cca69ae8b6cfbf6f4a6127543184c8f2a512f20f4595d44fb2cf990236c2ce2a67d4db3ab92cb53f6692597a6955c2f60164b897a1dd1f8cf8fd178a02fb5f11fbbfa271ff394fd9d1aa943ab32a3223425cab61f7b987d56d70bf96c8bf2214255a81ea8b94355281ed4ab6ea14ff027d3fc47177f2ac9b96a5c21669b9b7e25c75beeef0490d215cb53f00574c552964e1a8a6dcb924b06db3e2abc2985510c651ab5f1605e914dd56f71ae5dedcb0604eb144fd992cbdcb7ac4361903e336dec19617675fad981ee5af1c7f6891c7bbe1442284ee46822eb0e3fd5f5b3edbee5d86344e73f512f236e965caeb23ae8b3e42ab9dcb42f97097d965cdbfefd13f53a4b46c621ce1168db2fb95c75775eaeea71d5f529c14a3faeb25f32e2aa0d0889ab92b86a2bc54a325731f9d9fe27cf847cd90b7d2c6461db3a84e88cfd972774dd27ea157b651440d3470a043053220480c7cc0824d0942000137a0c807c558e55cd0936386250f09102012ece5ce77d254d837aa15eaec2db3e8ac7c8b68fea7195b8eda3622826beb299a17c5c45653d28b22dca0890927da23e191a5aec132543c1b6fd8c6f4ce62a7bc3b6570791f67a248b8fcaec38c6ee60e54cba39abcbfaf2d2843eb90dd4fd9db8e4dc9cb2aba3b1611706a236a7dcca3a5d8ddab4ec2136a53db8d28bd1194bc5cf8e1458db83e3201ce47285f613ec544422c2ffc55c582065db53d1e7f24367ec934e44a4221dd3b2138cdab400bdb45cf0519973078e0dc4decb73c9e16d29c5ae2e0aef8ea688629f249e6ded2f319aa28588ce1831c5784c2e576887d95fd9a233f65dacd022163b7079de25442cb6b53b5c74c6e640fb9f31b36dff2c69db7ecc2c86860386a348d9a2362d1e13da14dbf62b19b377d4dc65077d725b733cec831ac65481722f2a188163c71c26c1fcf72505dab710faac7667dbb798c762fb83811e23c13b8e49eeb4edb7ef253d2674ecbe61b7bb6db537638c31a56fa9c532601d88d4de6bb1bdce6d6b3187b105efa5df0f374397de7b33b4c2d002866e866e8668bd19da74f8bc861a776aef575baa606bf08b2b2005670648c95b0d5236ae06299c5dd5db793548f1b85b731aa4988f1aa72aeef36f406e4640feedbd8df4ab42d9e36968eccd3f340fd3bc186340cb3cce57dc81b8d908b80a0c0f600fe0818e13faf183ebc08e03c316382236e79cc419515471861128dadb5476860ac43384d839e79c83802da1499bcace70c1c08ca2fd26918c9019253a439f4b4229a5a55b6bad5b6bafbbbba5ee94523ad2d1f56d3d4523943a116d531a545bb51e740fba9e711d665bf4a310d5a229b17d7a6bfb3e5d67fbfbce769eedde23d6764512b32b0a258d14c4808b22663041c3867d562130b67b6dbbd316314eb0851a32f009028de5ad7dd69e1d00ed5ac4633625630ad9e003126478d1840d5610f65923a5b57fc794e00910489ccc76682c7f63fbeb196c772d6060f629b3839a083cd08107b42945b82dda95cb7610b4bfef7378f3f9b8d5a6ba40678020d13543df9ff7bd46734bafb959392fe24a1f8a122c4089e226dd9de778e5e0e1bad46c73a959979a71a9d9cce4363c84a1298bb2f0df3f3d187d0fc8729cd6d48365d8ce97a49c4d656ee7c75578767e9ccb182e52656720243b67bdb3cd4445f2d7925569223fb755a0fc1e1257599d9ddfb338ecd34be2c976b6af1ba336a89dff85626f86c34765cedaa24baa38a2c5faba32677b5c6b60832116fe212cf0878c38d7e3fe9623cecd7f7f080b24e918babed39ab811f1dc14bade2c7e783588d56e88bbe561499525547665555abd1e348dabe8aa7e0d2d9f86c69ce8c17e7d13b66949a3532ad0a7deb4d2d22381ae5e1874e6179f77c4f11e7cf05eb034ae4065409832c2603fb014e2bd3f659d1bf09df3e31a72650b2b630ba58dbfb4f10fbf40f798fb4c96630bf8b9c7cf951d701910a6947626a90c083f1b931928e9ec5ec54765561c101060487c97ded8ae4fe3c3571b8c8da05d716d965b6cbcb1cf1ebb3eb54e6d6a05da0e992fea4a85a894d21e74c6d2d03f65f6c3dc7bb913dc20c7e54cbfeef0d6778a7d10451fb4c796a12b6d5322cc9783afece1a97b2fad01b23b51864d53cb4586d1e449098cc3d5a23e69aa6b59073bb480ab42850555d05a6541ad48573b7244ce39e7daac23826b606c351d6ecd04417c10279519b14f4aa350645476d8d6be4843aab2392a1c11cedd1b1ea0d2a05aaf7eab01e82e2f404307ec4ec2eb481cbacf191282ee3fe7dedf820fda8eec3e8721acaecce17bd04b1aeafbef207b2bbb9248f75e5776efd51c72e8bccf81e640cb1cba52ac7fb3751fd873d057dddddd9d5ab7d6ba3b9d711ae0bb3db523eb760fc9d581f8a8cc496bd6e24cc399ff353434406cca7fc41084ce6ab588ab195f8c61b6c0186329d2c062d7d7565cdd45492349b7a92c8d265ab0a4b361f6d910cb54f45c6143b5360d9fad3795a5b1c3aa4f4b21f42bfd5a8eb75e13ff773dd0f54f707253436798e8df67cde82f835d8d9723a9d76c775bb3ebd34fc14791c0f83ea6b4a4ab8ecb5b477ae94f80f77e3ddb92787f5e2df53b72c1d48a338c6c4b76bb8637a20e349ddd2c3e5a560ec4bc181294fad30d7bd53fcecdd29a2014dabf7e767f647edf1dc97120e6c590f062b8c74d0b82d999ddd0375bec835f6e5a0cc345f04f137de2d72de2668f5de11f0c7313893e31106cf5fde37deb0715d927773d55ff929b1251144929277810448436a304ed9048281c95faa3e7c2c3810facfa618e251f0d003ab156ab3e8823069d0c3e118a0d8a9ffa5e4b13d7881d58f53b94910d0a1e3896224a6aecfa7a0856fdede4e5a00756fdfc0561258bfad85b834b52ffda1d844fb8a0bef531ba274e50df2b17a420b45a2860d5af1ef3bcab1369ecfabad6d515a1a042d7a7d5d23dc4569c5049a82454122a0995844a4225a1925049a82454426b0dd1d0d68668684c6b42d8100db7d6525ae25cd9c0f8c18dfbe158876768eaa62dc3d80782ed342d2738e2a75dab69d7b13a39d6ea64cbaee2aeeed5c9955d2b39de7bdad8496fd78aff23bd30a133ccae32605344a86a026e5a17b579d915f736ff6c9b77b6cd3ddbd6964dc97081bbb564702217b01cb7790d915d8d75ac5b29641b5d48e7ee5557e5aa0e9dc981ced87732dcf5921b0a5db79f3466c3a6ab7ac310341f9c541db0f0e1a6b9d1fcd7b4745c40497cf5f2daa912f381fd20b95e7da8c0a4c64706fab0c0bf596badb5d6879bd8bad4d019cc819fdf7b1937f1e314fe8e3479e49c7326471bdb9c4bd14dfc18cbdcc4d65a1c7313e3188ed9c7b806cf6e150fd6a09d9c3bdc615c815c45ffde0ae4aa0a44bfbf5f836e45e2fab4ed572440e03e2b103eed4c02b979fdebeffb953c6d17ecaf824ab6698b2c7a36bd620638d8951c7149c2566d1df483961c360d568cc2677f18ac41bb5ad1a2ed5a6ec0370ddbd6c06d8283fd6d6025c1ed24bda20995fd716025575afbeb4027b5f061dbafe468ffb4b7ff3cb092de46627f1fe8a4fd4a6eff69f05f98d033bbaa2f9b8a2288dae0bf9f637615de23a879ffcc49f6cd42fb56a0fae3e611545595a0e6e57e94a81fb4415c4b15ccfbf4e4b1ef8f3c1cd140b26445e2e6fded0a2d8076ad64b8bd2774cd000d4444442e2cf1025d55266aea3e9088cbb32a29d5f2ac52ecfb67b7ef5981f4c901ddaf482ecbbe5f6b758aaf605e354992ca64b62f6ddfbb652cfb406b03b7cabe1793f55500e20249caf785314d4d4af3514a29fd21b56ae0a3326709b04deb77efbdf7de7bedb5f65a6bb99577bfd2ebd10e76dcbdf7f280edfc27c8c3c7cd4cda5fedba128f21682ae4d1135ea1cf98564c2b46e7635c76e57dfe98570c8fafbecf1fe3e3aa181f32c623635c36957f2363606e16719323716c70877bb4a9ab625c6e669297312f37f3b762beb28ce26639e4662e6b6e5aa1cb5a1965c7ebdefb3576f5e312853bdfab2d4862974dbd2e8db233153be3d7ce38f6b6c24647c54868e71ebb32cdb469b6f39f5cfe6f3b57d8d8f9c527a619f7678b1b3bff4692407426c7b49ec4b85ca16f00627426bf8b153aa6b5e3d53d8d10b5f1efcaf32e4164e7b3aced4c234467f2fd73078f9e9d7fc76b47cf8eda8e28018871e4172410b5e13eb72e50cca632b9bc4009b010061f95e1ba4d7f490e1e68ab417635d6727c01e3cf5f6b99cbb16e9f4359b87278880e713eb0400b7475d694fd5a1bdb521f6c6b8fd03464adfe32cc9081da23026d408d27dbeaf859af57990b54556398e8fbf08e3e6536c53a68fad4cdd447654e1d44dbdaf08603c3f073f7ead262689a0ad9822007860f565c5d5a0c4ddb7ec4be0d0cb3abe4e2c11018b3e946e341c935b4e52a99966999865fe3cfb65532945ccb43794a26ca4555b6d6a6b3edb80adc5e1bcfe6b3652e04c2a12b832fd0748376062ff6559790beef272e67f0a8cb0e1ffb308841af0b7187434c4b2eef45051ff33c8fc749da955cfeb58ff24353bab00bc32fed947636d277c965571f2bb9ccdd8ec33be8f031115d92c14dfb6ddbc602dbaa8e9b1474b2e4f27411e83ab812b9cb5fdee33e5ec457a85aa5a2c6cfb65f8bc0eb5f912eaa3b1e22e0a25eba08d330985dd86522a92d2b1082a36d695cc77dcfbd7d0d45d34097a38ad8f66dc884067f7eb67002e106663083411b4ce266fe0959d8f6c52e3af3a259d80e2e7b87d0a097b5b502ddf2903cc17d823f25239808ccf1f58bcb24586e12a78c3d3b762f93302171133412e3bacf44a24747e8d39bfef47e4ce508034a080b0b905d8d38a65339c27012c232d53006d39f9e8630b0941faafc7a4e240c08e7a0987f451f958fca57252896331b1500db37b32bd3a35ef6d3015b60ebc5f57c2c01a36ba8d46c9666410c95a21100000000e314002028140c084462e1783409b360593b14800b7e9e487656194ad3208761180619640c208618450c1001909299d92000a07107faafbb51a20718060a452660dbe5806892b4a1496bdb1862281a782837682f0561f25741146fef711ce104eba12b33ddfbf8fbbddf8f84a24e64920ec0f0d4e46c357b4b8816180372bea0c14f745fc50758933538c432cddc8287b5c209f581723f822984a92ee7a1ec8cf6213f7808e3d9e855ac5cfee75e17c78830b2530614093085c52ad47f083379be4e40392149c4f187cb8d763bbd98c3dfc70e98f943724ca44607c7b0a5c3dcf434fe7ba850bc1c9d879f9e4291e4b2edb3a2bcd5ad3ea613422b11e0ed8a5bd425dcdcc3e68a1fbe94ce169296142d6d3cdc0e8263758baa5bb7c558f4be819f25ea365164f156286f8a89da1ed3fc24c5d8f78e1707db8d6ed38477d705807daa315910d315007c83c9a08e2ece2f7d5956a87d21989c239c3e287bfff65446488fd1aa690b516aadda0ac8ef1a42cc70e6d9d435af783e8e95f7d2bbef7fc2776e75d03e9b12b0d7370fa81232222240a9eef4a97a35de7ae6079683a48579ca00a004ae8d6f25162044c8d51da4af3db33a843a113de9ac44ae72a0c6569691a92211a0888204731871f5052280727d271b503c62e4a7bfee90e6483c27ca6a05b7466dce935e6d63b5a0c186ab4601b0a0c99769cc73389090b9379484d346b7e85104b1f4333d2318551c2665948375c828a61cfc9caf1c14e76cc5c3c96bb5a2f994e63f93629d2a3e111af812247288d45189169a0886747d8988bbc9af65abe634381b5d9111499ea98e2e991c01b749e93d44ce87a2439ffd1ac6942063898e3d054570fdc3fa37d918cd17aa1e1848c682650395481bd01ac74650c55f5e0f3b098b2e0435309b1395a2696207536a4c50d22e3ecc1deb3cb7e7dce3bbd123a7ac6e9b043c5b84b7e971cb9f6bd97d681f96bb554ac3529e71dbfe690daa4f2267bfdd5f31b7730e31bbd66ac4377f1e53a75000bd77691347a7aef9cc000cc5b6ebfa260b7aeca25a333b087e0d0f576434ca7cb53980bd935237b050ae106bb7b80b837eea883dd7557455d05b67113b20e241d8bf67b54157a671b338f06774de732ffcc462a6c2ddb6fe3ab7f4f6dd86a611ae433b0b38a50329c567838e949e440a20b92de70f298d8b745643806d76bb6610ad85de34e0180cb09caf17cbdaa34d5b2d0a8a960cf4c1ed9aafeedaeaccabbb9cb6ae91e2e7af12ba109c81b7478bcdf54a558f6b44fe0791ac454b1e6e0c3ad2d059b9634d659deda9f46f9efa6ffebf4f3a8108d96d24e32e7d7dd5b7332808a639f544a4e0dcb89c541391b1547359da5ad2d40f5697952c62c8f81c1b7d50728212ec2659cffcd471c738a16afa1fca14e408f1eaa1e82a88754aca7251162ceeafe291401d62f57c03b7cfb3ece705dc7e82bc42718447f761551d627ff3943f46680cbbf2efd0a139df8387e236ccb3c87319d88e67cb49cf1205c5fd3dfdca192a73a450177baae1de004155567c7ec4f3b1ce94b8eab15dcdb76ccc4d63a74ea4f6cfb96a4db55847e1f29310b13b5f629943fff6042c9e12cce6c9543a398a699d47362c130198ce4439c5079d8450fcea6d1c1d005f9338ce0227532e54592582e9cac45048d4aa75c8b010dd97fa8f28a063627d591e7f3b94f6fbebc40ae8931422c134b9a9679199fccbd092de966b86b5daf0ad191852126106bc070ee22edfa2a39feddf3600bee5d2273a2527d8123f9995bb4e17650a9129bf76cf55dc8991dc621da8f9a60b3c4f0d2dfbf2b782a45977e06af0159f39ae1f9d185827a1a9836db10437bddd17418cd518fe9a3c109593172b0615d666412afc28a462183e783d96932b4fd42d2a8c45fe7541a538feea3c48ac7fd7f3f0ac135f64c7db9a3aa17a5141f9eb78ccf7fec4a261cbf6c9b1568ae33b6f084de43db81cad77ab0c5683fa6e49e022e5e28c8b7fc4d5c813c1930e05ae77684666b7da6b2c981fa54ed53d67acff8333eca10b9eab7f5f83d38fb0cacdecf193b225a134f95e013a837dbb2762d92a5c550ec4fc814e59e542f2923a2b129c5298f75901543e2bcb31cfd84d000bbb06ea1cb92244768305525a62d89d6224fd3c4bd2e2c9334ab819bf5f4f7170ebb416420140d512503dbae5f297678378b9237eea1212acfdd9ab43c0ff99a3eb47d71609598d15fa79f44a1dea842ee8d259430c880d68799b0e0d24ecbdc40a7bfc00b32be7db66f9056e1d22439ef0b7b8a65bc520a28bb481d2135efbdc1266ad330e3780a461d84b5ba5eb7f2499063ab24aca95747db81efe1c9bc9d5976f03c0a9b94b13e108c47236271fc36a4fac734236dd7a78dbee9a5d0ea0876ee33de1827765427461e609d3fdb8294878edfe8878acd7320ab8a3bfe2caca13beee1aa4d0477b20ef84d20a3c0a1decfdc0911e408e4b5db47da7a2db2d357ced5bb5bd1fb23ba3571e7ef4fccd920ee04595af5c4abfe63ab77807746c6a1353bf0d340611da4b1ff3e0ffcfc0a6d55e6c1f860f5137888d295f09517526c75c67309e9f92efb12b4c2c8aadc57ece98201010ecb6c54e1befbd90d2294d5e343b17177a326e604b85fe639bd3ce3b71f00ec935bc2039fc04db68f7e5ad6caf96c62790fd67769549c9ddb88a794e8ec81a29f48b5b0d81a41cbf9cd510ea2b88a823f934a27c6f648ba21beac28b191440a8f9ccd79e79f5efc9a36460a71f6544951d02a3e6aed5ab2d939477e91f5fb79409abcf77108b134aa84571107656faa724372647925ae206113d73adb5394835ed12ec9062a986f99ad93abfaa971c996d610e42d4064bec2bc3ca4db33e0199271a13e7a1deae2c7c481394ed3fc2809ed9ae2a3f8cefdb820b07b84221b0332d59a254bb21bf270efac3cf75e0b6d86f56491c1489692819dcd25b8f9645a3e7414417ce74b4f7e3c3388d1018ab19a03f16971721c523c36ae4cb1fd00a94643f88429022c77692d2cbdab98cbe4bce0b16232fcf85f93148971a8a82a98458cbeecfd8942af4e06640eaeb51bb48ed7d91d4d63f2281fc167ba436cda7b071183a1b24eff85fa1e39192d5153496bdae0b508ff551a97256c6fe1f840767195f70d8ab0c6848a9db527224fc89fe5db603ee7f96ac0603a804ab59fec8d888158470eb04cfe2b627a8f309a82f00bc3a91c011c9b0e24beb6ad77be9868ae77b0226a2bd813b793901766dbba9e264b5468b6d7f06daf547e804b1b62cf1a1105c9ba25def2cbe8b1d21af75ed04e37cf8914d8e3450382c06773c55fc3975e5183515298371556da3249f3756421bd576345e9038d931ec6e12a659965cebacceb5fa5abd2b9ad0154c8a5296d41d287a9f50343383076bdd47379e51cdccb1ffbd6f7afc828ec663f3edf6fa3230a3836bdf6e8745a882ae7e76b79adc334982c87d231341da206dae899c42b28a6fb829b012ae6dc1638e7e07dce96854e97b61a2a9db84138fc087e88ed851da1acec28104f76d66a253ba007fefe541bf83263abe64a1f5017dabae5a5ab1842eb56f7a6ffd763e38d02aba6f5fb0bd3803aa816578dfda558942b2fc706da34edd9e244792ae9d809d74faaddafbfac2bed81675348d7e771c6664715f592bd2ebee8924c3aed2563debf21765b49775db609e138cc5aa173ce39700bc3ab07f7e27e72ec489cb48905b1de74a3182fe871a51b537063f923e041f99daef4466d2b6b9a12f58bcda8f2594d8a55aaf5d283a2b164d221c1622aba3f48906091705f063c2f286bf90fa075f642481d86f4c0020905337486a3ca0fd53a00d6e05eff417838f42da31d7bd2ce123b9c1d5408a34468d487c293aa3a535805e57dc30f0768bfb168e1973ded568bb9ca1c3cc95b6ae873ade98828f1c60e11e24e159bf6e689c72612d600d420691ebc7165a462e5e8857ebfdb02501ba1139c816052cf04e6a1c49004ecca521c8dc220b4875572089b4ef68a9ae21c6fb42099b3f2cfd59ad0507094a78e3554511ed633d25c789763278c53bf1eb8b28e40eb7d36f876055bce1b6dc29ad0f473d5ad6ccb46c87eb2e3c800e247b55f4db0ae6fed880dc747ea7321c73e869bdc78949aff0cb4a4a36d1e2944455943e7ae346007893d3b336e244bbb364e0d8bc728f38215b6d73508b418a13f285d551df4a869e68f5f83ac60959ad63d88aa8937a14aa14fc74966b674b7f94cbda1ea3f3e3084f3475425accd8185327881f56cb90f321b4b64913a2d313806bba20735df21c5337e249676207fc82209ae680062cdee290cdcc638978135f87f4000215b4900cc8e41fb9506f68c40335689d3a696a25a33fb95ce40f8fdf642a97a44d397b30fa93239982de94b2eb7d9d05717d30b8bdac886832b5c24563282baf5c25381934204024756556f0f93f53db9006f0813d11203814929edf61b3e28900818896156fec0082c52bcbe3e9b435b90a86dd2a9d4f6b52701da4a30c9a08283fa9d74980f77965e2d415caa868944754d74b7d24ae3091d106bcc13b3ed1e79f0b62d1723f61d92abe89ceab6659476651ec2dbc0dca6105465c57fe9c4a7ea891459b0dfc4b3fbbf11532598728c6a16e7ad5892331f1501a89bb3a39f724ce0a1f3bc54cbb02a72abd82e95ff799b7da6cbe84e7585d0ac9f02a3c74bea7d4bdb1c317d954b5d184d193401c60646397a4a0d3e2abe9b07463874b0a48c7abe7388f7a98bcb7cc290c74fc0888066c7220c7f6a2f671f5dbf474319c82e2a766adebf8ef3a3d31ea923e1e108ea289bd63dbc5dbe9fac426beb29e0b19fb4b65aad29c13817b7d3937d7b9eac8720d9334f76e2934b3ac5782bf7aa0d1b3f9cd57d7933ff9c4da1c25a4d93e26281981af6f3e681a55b9368068d4dcf007859f9869f4f28f218290a5b930a4d02e77589730bb81ddd53a83391180717ad8b5d298b16aec9fb65e695c22833b734f752510f9a85be046d6936b0117e9159c3254b0f9905764d63d81e637618fe3cb069341b79174d373b3e4be643276174d2a99f0fda0cf0371a96393410f054b3c1d82e85c5c4e848886cd9703b932909912399e1fe7cc3a0b741be24654f76de304fc26e4356d70386870b9d106a387a3bbead9f5a48d8ffd449d8f74c65b01ede93c1ed437f311000e2f0236319a67d22e4797ee212bb8565b1807e42780c758dae3e6bd8a162eab703d77b35cba1f4f74394985ac603c03111662a4c78c925ae64622d06b8821a08039f8ce30d030d9aa6700b34fef5ff67a055563646b7d083180788c1bee39fde5d7cf878d4f49e613a20df30f356d93879db1aab94192fd94fbb3919813e1ff85499b0776c1d3c671b05627ecc40eb07134e70fb1c6546825acf8089d0ee104bcafa6e3b2eb5c86641f04910d1bb07b44311b74a4dfe48855f6394bddd0057d941a9c2ec51503bfecc13f57adfecf719dd865cfde6190d041f5e4020627a894e83dafd63025a2f00b0c3f189863fb45081ed151153bd293682e7a88023acf84c21d5b0d6e0127201327d01e03a82b374e35939c7b304202a8e65190a0ee85e17636045b01c4aa0a809d980f52fa525ca010942cfb007ed65ad48117889146b4bd80e3209e7272d02437adb255fdb97db4d36199fad5e681b36acfd6291051803a41b82ee2209ba2e62f988134f95d6861e687bb16e869c8513dc29d3a1f7fd7815eb0a03ec03e7c6d1ca08b15149d3b7ad2fea0ee3dbb09b83ba01c16c404c2700382aa842358e53b6db07b7eae3c55c2b02489106256b3c7e6fea11425066528d566c19ad078d826fc20a5c6aedb66bb435483b96bec24e6f8b6d4494aa2dbdf10c4150040c09484d9cb58e02ec4a61709e1351371348f319f89bc9b94683026e88ba5ab8d52351332ccff93137ade416f8b3ca1fd21c7922fd485616513d494c8470282babab25e628fe0e2a7a6318f6a970e7c80cdd20d490dca967022291e580e366a7f521c3275b15f5b257dc8a3534492d572a43f33ef3c8b9cbf95f9091a288c60676beb157e77d5c5a34879dcee4aba3d19fc6231dbf9e0156f5f978271d1d740ac69158f91310c572090b5016a32779318257392e5093a8ef599819b6e77812bb1d9bbccba2162934239d9d22efbfa97adc89f47890aa7edd3d116a6831a87a6885881fec843c25ad6c896dc59f63fd26cf3919cc3b75f2135a30ba8dccc2e537a1434acc745601db0e4325baa7a0ba1d8fa785ce750152402114b1c440f3d744ec85a033d6d8e6fb3d0c56789a0f95eaf6789e02e4c70b9958375963e9f654851f748c182c94fb8fb720ce70b65d1a19d3381366d1a3d3674bff1aa4af6cff51fb6dfb81e90adce3104580e1e3e361d3322d9c2f3923716c6250602648b1fa9746a7ced6cebf7d57a558f1aeae7d610cbae023fdbae59b5a4cfed18406b79552e697df49247ccbf0bf460d5fa6497b6333fa1516e7054ff7c3bd58984302ee8b436163da4849f003de3d7668ef82dcf654564a88451ba9c22489474dc7798f228c9b376c45d9b4e61eb327477a92e07900475abbea7f07dd0d2f4d403da0209bfb3c0024e11f9d5dedddaac637940578c53f3463033045f8883cb7c1e4dcf91d75e41ec200118c438bfa61bd3777e475e1ef73b9cbf18c481a0175f327917776e9bc1c7d7bc43b77aef5fdb3e38cc14e4e858bae5471aa2665edb38d2d07f42c88b270c294f78ea97a7f6815ce0f9809b33092371e130e3906bab30f12a1d3c4bc7c49b42e8a93426721fac41afd13977e738f133821dd471f672204dfb58bbc1aaa1f9c9e27c2ce724702a02ec22be74766714762c35980fc00268f89aa9026a2c716308b184da4a493e05e8332fb28623a934197aa99a22c12f912e42f42a854846322ad2f1c8343dec1922b57e64fa983f3d683dee112f37ba20e57d28a0dff720fcd5aaa594cee974807ffead1a7cf29790de8704bdc32513de0403638fcbbdeba92ff8e6e1cef6f3e158325fefc7727c8c003db3f4e49a4031b08b446bdb9846780525d61cc0a5ea4985be789f035c7110bc02c4e1033243b9a3c4d8b6e4cf012619b6edb7f3309072768fdf1d5cb313633fd8c6316635c99ccde712dbf2a2ae4cdf145fe000761f213b27c6fc991b74fd88ec205327e80bb04b066fef20de58b87ba013a5b33fcadb437ebd4ccfa6693ca1adee51d4a2f8300219bb5f4fd753563aa55060bc976a6443f9c8b8b704e8f18deef4385199ba5cc6763fe9fb6630f77aefeefd317bbfcfb5a7361eeede111ac48d11793b0dccfab1f63802078b6d0e4feda5d932259bd849ef78b6c35d9c1a6475e896bfd236d83cfa483657b83e8c26a6a20eff03c7240d7956d16857e0b90da737c2ddf858eed4b398c4ad962987ba53b89af590c45d6dbb0244a362a1d59f378b29e1af28ffdef7e53b9fc5f11d8baa4547d79d9b632b242877b7d6c63716dc07308903228f6c7f90efc427ef872b5cd17293f2613e21750b1cb78b888832ece340454291a0a7631901fa5c3a128f80e65d0bc2dcedb969212a9d63d9eac03b0f47664b006c97ee651d440c5acee33d8be1a969c99606182a0ae377476088b95119a726ba54cb850ac9c0b8c42d62a40f1e77ca102042c6dfd8969ba93d9a76b21b1c1763f43ad3d98e9ce012e9cd20ada8154351443f82cbe6e7d418507ceaf8678da49939fd2d3863bffc9186fc1b262dd0aa746203b22d427e693d87398950c40c673192e21c525e2280672ffd1d08f28534edb30c400205864692a5a6ce411f37a82c118182b605aa2ed336ea7974bbc91da464d7bc7a3bda171843019db2279bbcca6f7d2f97536ad0765ecdb66be8029e8df03bca7e626a02a3bf0f22eda40398e710ecae4eb3566cd1e055c30bf2091401ab8f635244c3fd20ba2263c745db44854a44b1467f0b16be1301f1ba977647c763f96debb206799dcc2da8b214a9f7b32b5466edae933ed4ea1b2668ce4c9488f884a75821ed67aa9aee44c2a34358038d20ba6d814991b237c32f6c9e1988e76b13cb3884b259aa4c31c77a1d69ff8664444362c80fbd51b26b579f397ed997fdebc08ba9b38585b46b3fc49a4ad935ddf2f8f48f8eeafa4aa293fda64ed0ef073b8f1a7729988fb8c2c858b34faee2b76d79deb1ddd6fe048195ea6804cdec3a5ec0913bb4e0101fa712c4e0f0503b9859c3a30f14de1f66b0407b7ece9bd403d3009685326487782e7457f1c36522021353f899bdc3f315f5b6b0ce6d51fbe955f83e427ee78f746c12ea948cb1ad891fa845dda42d3d8195d30a89819bc78ad352b77ff390d1b75206cd9451988fabd5d5fae338b944bb9b8182fef8800e973951af53d9992fad364e73953d837cf8c08f0c2e8215dd1b0ec13e8b01692025b0fde16d6c92f28b6da9e4e7d1af6d514383c1020bae95de9dde4d7a11e77b83ab71eb773eeb63492981b1c672542933b8c905ce9d32dea120ea6d6bd92839ead942bccf64af43533970019c98c98c2ae4642aef0d6a7ca160ad0d59894d10623742464fbe8cb0fb2d47ca88338af21589323fce9ac0fa2c7623c6f8138532da333ea17808117fd6d4c0b9e6c7e9e50dcce2706675bdbdaf8ffeac6253567df6aa86c82db2cb1396e58a93cb599c8d660e83ea23d70b9146d8c4c3441c0de896e561491c7c10363fbe66e5d6bb2e2738aacb30e8a35b4ea888c181a0fc4343c973f047b4aafed4aa1d12a27422069462b552955edd16eb9dbd5f627b02fe21008f05357a157f8590ec233b9e54bb16b9b4ddbd98e54b01a9793a98f1e21578f599bdb87e7adea68e4848e6fe078db0c2a5aac961be21e7e39339608c08b5fd7ce04848240e9a12f28f327c8468d960776e414c7ac1f83db1ac20263efea20e3197221088e4e95c8126bb44c474951387cdda6a4a5316a1efd7ae835a2d285663f37aef86f0af1892c471d690009a6da1d5241e70cf711e943a5afc5e5e707f880b407ca25665a06156c4fc1beeed3ee507aa063ce7416d068a24d110cf95bdade6a289ce58681b1919822d1706164244632055c252320aa1b3908d28a9c3c6c00f453aad86337b16197d8daf08a533f771e491d7127ef67d2807125e7a8e49030d88342ee69a1b02cca8d0b8c9dd5463be803eaa8e4b7f668c633cc61f48fa510981120fa80a7499a8dc4999b9f3f29c9e3b1a653e19a4e25f04d69d63e10be19f4136f77e39bc1262c30d853e59b4f0559eb1edbc1eb36a5099bc1984590b1dbbd8ed822de8fe2c494d686e25dcd36e31adaffebe03405c96676428e6c2f5e544be0219a3836f80ea7c41a697a0fe6150a788521b7a4debcdf1955f063442e1a8a26feaf3d5d1c304d791dca7d3b603662e60cacb75de951f494c8050d6f63735e122b4fce75a0710bfc055540a6929d8dc0136a431fa5ffbf0c8206b9221465703abcabe9739cf8d5f2f162201d461ac34762199c3d927d51c72133bb3ce729557c50a65d960b568c3c02626a8198a847b67432b2df49b11e9266e0ae9fc13d7a680e951bd6b2ee57eafde2717544f44ce00e1707064bde10a3860de184ce424982a555fa468a8088b21f246108959554cb36a04caa75c5c465355c10359d9c6232dea836be834b0c79a5e7d120da449dcc8f77d0f8e93ea08de8099523f19f94f26bdf5c9d44b0c30ca5e81036267e060989af780d56c2988076b73081a8cbceb3c9969396ba243b359b6ced763a1d71f0648600b9e0de1871068a375dfcdd72b97327e4dcfbac6ddcf1b5967ebfb64e1ca23c983b4d93fa9b3b59922825737203b5c5bfbb733ae16dfda02c9c103ebc1c5ee6ca0cbd9706d6269157746a69a0d28a7c00ea51b00734d0248b98fda3b0c3a381b1941b0a8c34ca050acf63d5f63947e529d5b45b9fdff60ae99b8b4bd484f8fb545ea9af9e39fa1c2afe3837b276aadd3297f482a9065d0f8ef0f3088d26eb5855442f1a6470c793a7e45207f5278216e8c2dde5e521f84798468a1853905f16b0065dd0d1b6e5ee6774bc1c13b581903bc2b18a8ce1654ece81ae0436b8a41f3330914a76bf232b6b4a13c4249fa6aa1cb8a2c54145031244ebdacc73de1839e9267747988599a3d9b71bf2faa25f6498756725a798cd3864e140ae262e9cfe78802558a572cceb4d3f09fc30dde859cd98e169b3e868c55dca3b0e3602ff867bbc0471f8139ce74796ed41a4fe3b975166efa8b3476c223de9f343028f953cd9b4dceb584a2fb1f44427e5cb1353c2e575df5e565ddddc4d8c34d28743b1ceb967d0093df5a834e0ce820e86bcad97c6fd02c177295b5664cb3628107d3681ed4baf7998d24b123d5b70a82d90951214c3fe2d92cf1f7a0c2b6ba67789931bacb13bf3c1ba10104f40ce1aeee11858a85f01fbbeaf4fa9125aa38fa6184cb9d72a1c5f02b7d0a73c3824b3a89eab4f9372a6bffb709c444028d4284598e531741c9a50f45ac2929826f11595fa6b6ad80651880679a0ec7ef710cc9109ef19dfbc3bd5e1fc15c9caa8fc8f5b17f21674c10286d704f5a9770b323aef1743e106a803a13efefd9cbe2f4296ebf8b5011cc681d0eedf748f4da1af2bb24c27e01f892f591c309f91cf6e86b243fb485b4658d3892669efda1d4e20e148aefca635db68e066d5ffb34d3dc76b2fc4eff75c988cb2599d3e8d1ced5b498a1d746832d93cf3b8c66114930d28bd1c2afe4a47cf26fb545e681d5c71dacbc07bd71946cc229f0101268dc0d59f7351ad2e491852523056cb3a43e8a5933fd6d311b5c15cb387fabf42cf3c9a3dcbba76b0a3fee02754a338980267621ed23e7eb79730d3b4087a97eefffabded58e9f40f6fcff5dba9c75a8c74456295d00e2e69f615e8a0bf77929e23fb45fe43643710763fa6f54c3bc9a1edb9f482e9f547b59c3117fc66456047c1d17f403f7ba9ae3646a40e7ba48200070451c99262162992310f112f08ba7b05a01565edde2ba90a2dd28fc00aca262132353e561cb303a40afb51c6dab9e849ad8e08324b0e3bf58395a2268aea116e7d5cff8e4d9d058b72852f4bf9fedc8aead7093460cf396053aba1fceba7f6b90f1df6ae34c84f9a4e29558431c19fb513fa80c20d35b56cd3f4ae19f5f2996bc1332ae1ba21a5d960dc8c8c9f008e1506c48d526841afbb045883b0800bc1fdc44c87efcc973936a7d937c6878dd9cd566fb2a0ff0ddad447db89eb3a7fa4d3a25632a2da5c5b99c21bd0c33adb12e56dbd0e7e38bf31a307b9ff859b944811b245fadcee0b37634bca98dd50f56aa79916476d26cab8b2d6541b87c15cd3007d959b8d1839baeeed649cabc9b298e55ef9cdf3ba6e282355f4f3d4bf4cc75ae5492769e4b4d3bda89a397a902cd1a0d184bd17d7719af38c32134c12962f33731569ff4b4eda13ad40ab5dd28db7d3e40d8a7aa71715a3db8d8c35df8f3290090307f4ea3ab6f060f8aac9be86a6d771d197f0a61e187380f659110dbb664b3c09bd70381a9f14a4755a1aff025e5c1cdae88ca8ae3b7435d763faf79670c42c874f2685f304472e994b4b4f6b3aea3dab925314dad08e95cf82295c6755512af26868e34dc6a8804aa6a583223426b386c529e7cc72fb7f07580a61c2f1c55bb8c6e94a755b5e628136bd86380c60c18342231425b62b063a1dbd777c6c997e817f6818a501b75e9c6f1e3786aebd4172509b277e36b6cb79e47bf26640441d35bb35004467cbe896b52d3e50696fda5c708a586fee70946547560d75b2c7a88b4c770ecf6c8abcd5868ced6e7c423091155fb631a8bec082f288b7755119170eed89c424d04ce1e368f151405c4e16f7cc6f20c8f79648aac8372b23dce5fd311fc8e9c24f75174963a830927c14eefdb117a32499a4b8dda161f13e0e98ceec846786943692434e4cfb36865158b83bcb3d541c8740ff1387ab3e6d8419c47098445b1f8ca2d1cae88e9cd6304b3b5743c4df25eb182a010ab41502b840446320d0302843dbfd98ed12cab359370b8051cffb9b63e8f402992ced8f8ba8eb0f552f20461e723baab79f6dbc52b529fb2c1a75e3f6c026a92b74b7e206714e430d026f53ceb3bd8528e573a5739caa487c298c84343bc5add90b1778c9f9a98691e8e6825d1e026bb155947eeddac9b034a05d795e04d26476c879004bbd9aa5439f91c3a01cfc908115dd8254e5db45301b487fab877d74255b5ccb448c5d574352daef05a292cba1468eb832255d3cba8ca8cf77bdebbcbfe7b7cc44686d848173c554d3ff4b55bbb4c36c04fe69506c50eedcbce1f11d216410c5545e90eb2df47c7c12b98eef1ff0f3bb4d1cb323e319d4bee20a4039b63a4bed8fccb10790ad41cdab05146b67d5f1faaf41e349d824a43fdf47e9c5eb5e7d2240b37da4b5a625c8393705762485ed8c2380959be879c032c78c7c7a34b0185023baf160b14b30478a2878b7a777347d01e0688228197f94d2ba5b9d2efd30976402f69142c26d7c11ad60afdf5529344f4e5a8dd436ae4b298f3edd7942370e37f6af389522cf4189d5854b8326155e9a5c64566c6b6312b2db17708c79aaadbf7eed53370231dd9430e55bc0c604b7b572c4b364a513182c0dda2689472bb32cea6bd0a7353eb625a5b6ae7681c8a52595d43c282a6c54c84cfb01f0a0247c71304bd1b2872794d677a19c924f44cd5a6ee432fcb00bb16e64a8dcd90c3accef224dcbbed9d6b09ea2f3ea74b0f8d7e4ae3aeb9a8b319b2ff8170b8c2756225fe9e7fbb179fbe77a8593a6ecba5c5a05464e418c8b7c83cee375a35bb58f18d8bd5ea40c612ce02a0945c26d268ddf756be594f2ac5b0d00c9fd8774926a7ed9c363eb0feb29750c85090ffec54299193833624f5e9dd2ebd1d818e78319e97ca9ce30480c950efac67a350b9bc18114c00184a2c34579f4fea3550bcff1e74074a2d6f94eec18579e92692518ecb824b74e76259527038c2d072b0d9e80553378d9de310ea396a4d112d12c734b302735956a358b0d26d986e7f56aec75327f575efe82c65ec87cdb8cca468fa6215ba33a58e71d99380dac0bed4f7cb19e103991993cae761b1357c633e4d0310d0486c4e883c36ddd3d12ea5d6c8a06da2a2d834cf56826945d5d80290d4513eacaa0eb9adb02fbea0f4f3b54afc918d437cf9726de0d89dc0568e1c4fee08415493f88ba6ee0327e492ee5ee932aa1a89d02b4120272a7671ad730af934c48bcfbda251a64ce17af0d17a180f89fc387af53bbbd27155812f34db7d9325d2f4b0b40e3492fdebb83d8e67dc6fc351131f3d749fd122ccd34c6344a68462be2b664fc7af53743c0f12ad208b4850bf67fdc0ef8bbd0f6578b37f7155789943b54f1302e8f147546b75b156094d24b3b4256e3962d9f8b951950a2a158db81a6b6e8f54b16174d8835967cd9e3e537a0f1381c0777ade8a54a4c58e79e2d000964b357148ab2e5847cd8f05cc02ac1384d658afb7708e94831fabc023a0a5750b28b76a249770d18ed02284c425143cef057cc5eb6d0ced2fe3161896aaae3679760c5896158a29dc1e32922be179cdfe834d7e01394f23eaf86dcb59ddeaf8ab644f59534c0ef07a62bf2f6d9549f6f73739cf0e4a8ef89f900e2e891e1a8915e172ec53eb5ed7e270a87b63251bec43ba50b6b5c5ab78e3431b21b1ca9a6b75fd84acf9fcbf44e07516d0e08d62b9afdac3ab7271d462d3ba113263c0e44ac7699d1acc68e831024d214c80842f2f9a2c8edb785d9e34886b5584b2530dd6556ed89900b4bc25c758ff08824c96fa2645f57f5953cd87415b16cc931399bb90f5ed37f29524f9a51b8ac3c8b209d4509bacb0f290e93396e9fe0021596a4e6681b55ff956be0178be56e57f67b61babfb65074a02ce6e9e19934cc878fe59ceb8c034264d844fbeb1fd7ac8091bbd2cd524cb312b2c0a5011fafcfb09e77ffbb1abab2e4e40de689f3bdb0fba03d063867cc7f758fd9a1297d48a94a726ecd3f8eaa219aef4636116eae34252cf09dfc2d2726be6d95f85ef0c200a542d8eae0b92bb03ae058627fc8a530a714df7cf1e8109f38a712826e2c2a23fcea8aaa4ad45a2285b8a8334860f577e86c1e5f7cd47c20c37e681a042abaa160e7233063a3b0225ba33e4c7b884fe62f6c61f6b11ad9da6c9bb9cb34bc069da93f6674fd95f4ca8b11d96b27ef2440cfe8d180924ec99efccf1d0ae2f1bbfbb9a1cfead6ab99b1e9c1a934895f2d7263402fa4755553e0537b0860b916497665cdc2f19301b4b4f5bd3640a96304ae47039b3701fabaa7c8a11f89795fda4b8463984686de735be69382d0d6995d3596e13fd9936812c43acc802cd5384f20038b292b994a641534071efe5d3376b0ce37d68a3d1bd37eb6d248bb544acf80339efb55fc4b4d021012e2fac471c0a33f45eb3a2a2f9e93f9e666c8902e9a463bf5c407cbce538fbf6f48f55409fbee611cce3b5261172b556eb859e02fa51f21b0a3fbc58b9c8210531c0e5c081cb459f72c59be74062303b8b967b4bfbf069f9a881fb4eeb8ffc57feb5777b2d346da2f7afe11874110bf66cac5f236d6badf7365b9578627d4c94072d2795800d371fddacac02b32ad8aac2e5a83f1c47e0a9a686070ec295244df6e3718e8aa46436295340340aa60c9f302a653e00b31e9f530669c0a78f64fb126db87f8d564d1b9007cce3856d3bf377287f070c6d6dafc352b5510f45fe8407375198e79b127b0bbbb89affb9dfb103d3827552d57179b727dc967b5a899ed3f5ae2779a0e0a59b695ad86de008b60728d84ebc38b5453aa7a03cdef3f29072673c4d546c561a9d0a28a1423a30c90801cfd55dac431bdcd2c4cfc0e0526d2b30c889d530fb6b584cedee94f282210cb3db887e01758de8a1a8b0019514518cac62ea53e40349295c26e791ce6870194f5cd7fcf04646a10086cdff3c393631c7492ddb5830a21772db5729976d61d5312b2ae80f2c4298d00ac23d5613941bcbc1aac2c91a5611a358a31a15f55fde6a92eabb6a4de1c181c77ff0ab3946299d9f2a79dc091865c04c22c2dc3a361547ca451a969528d55630f765f1a73215f913ca0c42e8da55b1a210fc130daac48386a341e0190c95106eee6df82e5c969308ffce0381d3323234e01618cae8782b0799115b6e748e91ced1e78e0528a6425cbdcecca4720691a2767d9985b821c2f36f82fa2d787a3fa446a000e2a65d0eb0cc4c4575f57d278f1b16e6ca673ef80ed08a41a3e882cad1070aa17fa02adeb677225be5bfb02a2e6eaab8623988bd8a1bbe6e0afdc3dba07f97249867aeed3c8ec31a04ed6e730d15744b20c52274416ae9477b328c0328403e21f7666fba9087339bcd84bc7fc565f20400f688b7d22153606744b462add602ee6f345ac8ed69f58dfb1920d112f922fc26979a1d4e7d3adf10ca0c783efc6b078304f1254fdf521a39f00d73dd63768b07b269bf5fcc1c9820969314ed571e40f40c929a0f3bac2127514c73865d1c03669b7b5ea0f45e060d152e5b40034155b470f46b520a7a8cd753504ce6f89ac59eb02bca134765004dbcb588df712a5b55d0f4bfdc0cded76c5c376ccf0384a14c57c7401967b47d716764fa01dcf77bc421eb854668f1e4fda797b67b80aff3a8f0407d7c7f2ee9ab806a0151e8566b12402cc8772077b5e4d3e00574a81698350eb10a206bd52fcf2925f3b1b9dcc3394150410c009c0bc2c8830312e5e5bf50d0d7f9ae61d13ab690b336ac4e56bdce29ceb9ef7fe2f217c0d66f992d7fe6ba98dfccf3e0078069656dce97129210b4e3c0eb99223041f1a4ac55fe502aba921119d79aa897a39a6d90d95a10da404569197284d665e96831870491b1352a447f6883e33152d4050b59c1d53558ff4951a5fdd34b21f0e1434a961767f2f2c527548a8ed0abb59848eccc43a02bb4988ac111d67426adf025b829e5eae96d6d80894d3c8468dcc5fa155c59623be629bda8dfb17412c271fb85e5f4168401aeab31c4ba039d8954102f743adfb47575a720b25f067c1a441b6ee217718a1e89c420ce543e5f6ae8fdc92d5669e93c8e4c0d67d863c3c3ce2f5341a00e8ef15ad3bf83a3d449c99bf214035e269c6b5f023f7218f3eb8e98160b669c43c613d50f65eab0fb4b55a43d2867c179a63e1edc6040d79de88067444192d30c89786ec4c19914b1e944785c8ac846604dca3263fbbb82b10ef63496e482ecc85e672240338afe2261aa1d72bf8b909c813e77634e25ae6a14f773b48389498fd038bc230f5c24589fd597692654dcd15c8dfeec3ed7c30d2915bd62f5a93a5e77dbc509554d9818dbf43a2f70979065ba0d995b9e2384a495011cdf6c9bb2f7a4add9f7b45b6f5a7c41f30e59822238f0b02a47587675915ea045eed95f7b62e8f5a485d5d61a91c86e88ad9109f20a9032c39a8eb25b6f08bbecea8fd8706d492a8836324237808048d86d69273f1f3d765d6fcb64b7eb829c754ce212f6ab2866433ea4eb7247293ad4770c0028f48ea1354378558bf94432ed5155b3a454ce7df15ac303f9828e92dad9eff0591644fc578c20b686ed1ed5aaa71484c5ec147726094c978df07d2ae5cca247404902893645352cbc326cf061a29be57aef37457ba3a3d521be2c5bc94d2866f57c5555c5563f1004315f6de1d6ac0a3b0f26834bb2028b2b428887ff24525f5e43b744399d667fab988686b5fedf3506739dafc407159a6ee8f5f17aee2dc4661a10e8abcdb416d9025d4de7f00ba926bab7e35e34985810604e57a4b1bee43d0f697f46dbaaca0b745901878e7bf64d602610d225d176023f965403cb58554237df4292168741c3e6051acf1f05836467af3c0d70365bfdfbf0e84fe240c1d0863a26253c17f48859f9158a0f86f00456ead65bba1f7425d4b3c18310f407f56c515fecd945969c2fa619834f4dcef4248210ee81b818ba580cd64e95aa030588e8dca6314a6d246cac25bae188ab418624d8ab013daca87b3d590c380eec6f079aa83c91f01d71e3e0a10fe89ed41a3e33ba75e2c64653835a5dca6082cc7353dedbfbb2953883c742189a856b2bb32c4b05c3c54427e89e1cd4fc7f60b07e688bd3ce2245223b9f602d70a21334ca7ac9260cc487aa50447f6b9425ac7f39fe9b74420e097262946363264e332264771f90d4c5b0cf6ec35f5e85f17d5bd3494d0aed2f356bfe54fa8a68000d20682fffc8076d6a213fb108ef7c665b82fb04f84f4a479096c632704c53caf131db33a2ec8326a17f0137c542b2f902602a6308526c0f80bdeaf554f07f3002d1524be038341d92c02d866f9357323164acd510e3c1e667962803bba06dd768691a5870434c4827e7d4c498e647136fe5f757dde27a9b53f02adf2e6f83c0c6f09ec4eb716a8b2a74eb1b532c156ccb4b0ed77ff9386ac8cf4bbc6eb68fefcd8bc9fdcd3d1e17fb67f2ec8b43fa08b7a813c6e7a6414552a230fe40c2152728869416732d108fc39bd22dd42dab61b640455ce8c5a88fa935346dd6dcdc9cc212727b682e0d768605f1b43480370221197cdffc2dc8d482fd849b50228025232d0ab1eab1c17bc23580b7ecaa13c0d9ec741d5713ba86ba3f2182027536cfcf62d772bcc9e40a800fcf1193be0dbba24a96bc0bdcc69b98ca40758fe38670624d155c423dc3b36164e8631ac3cc5368db0bd7f7187730de12c2e649e3b3a32f7f3de0bdc184a02e39fd9125d954586b11ae6bb7587f839910bc978ecdf8c6b62265a0c02fe0689aed47bde2ed92a97d2688f48f3fd0870c2d75ede5093f6998991d8bdcc524521a90bfb1f8fc07a16a38786d3e81afa1beb70d71c9ccdb555ecca0804832b80ddeb3eada4a2d90ea7fe722de55b6868bc4f82bcebc0ea7fcb27515d0e7bc3bcf6b0f56ae6f3b9a844276bd2ad7a0a15f2bbe45fd82d576ab2ecf7850983a29ea91a65709f7b63e57070a8ebd9832b7459f13a58b67bc4ca32f1060a50de40a79aa85aba3ae69a1e4faeaea5d077051199c2c0059b01ba71593284565ccd6bad0685f18be9ca6a0d223144c5145ed822520930bc290ac0a2242ba3644c895afe4391ca00f9cae517a8cfb3417767c4cd8d52ed30aa4fbbf7e22098e7c67593f635a8f8c2c00bcfcf8d72ad64816907d2c2061f390a504f997752606ad0eff936476099bac06d36c5da8da462fa4221f4679a778c95024a5743061219a47361bbfe9896c960b7ad5de34ff52214475f4700e0f9f22f4a4ca7df4cc4ef66b80fbe11fae6e6925bc43930b2a0a9d37d3f7dcfac069d801372d01273360af47841370eae9d913b79020fb614764e59328d8b37eb8e62bc47d97ae459d06df9e5f7225be79ab53ed2e5034b3aad6e53480b6fbe201a00b85a5bbe6b3b0e6d3cf411694b95b8d635ef20ada1c0d30c96d3db0c27f042e0db46ada79404acd8a9489bbf82872195b624376ccd971cba3ebf99b6eb34739800334698a1662dc19d163fa8c9070a75f59c9ad9c8ae11a8d186bc35904cce628d949de0b9ed92db55aca0d19aaf2eafe118bcd698d9a01d583550d1b925db547567ed8f1f8f39e2b1e1c762d7071f60b23e28976663c16716c87ad463816d4f551d8298ae944c2c60ed4b4c939378bfc8bd37f16dfa0856f468cd455aab260b976af4548b607ae4debe229ce623673fd56b9a62ee8eb70d9d6c85f054bdf55d8b650c4ec836ffdd36addfa0ab1f3f81161050509277757c00acd1afa39e689c56a522a451e980bba1db5fd2067de420f02dbd1d945a1753d8c4b7006fc746afea81da08dcc66703c3498d3e2cfbfab948fb463b6f4704db240bf7f7e91fb3f5434ee7fb591b6c9fb237c336c2ca77795e39f44e812530c5032cf53d4477c8516e95b7a94e6f40b9e9cc8e2c50a808be8b6986cd390d688e73844ebc7f58803e39b53f4cd2a44602efe74ee900da7dac4ca26980de4aae14603ceff658b19a3f7c45e2f35b6dd649777a2f187114312cbfb7f1507f661c4a0df439466c67220aabac7cd6d942745c1799236cc6ad48ba47cf8dd22414df871f8262187ffc27d373ce1101fed335c1be23b4149fc9365e2e9b2da820eca29f6e9e3f34199e965074e397f423eea95f84351ae4bbecacffcb9ea1af3beff1ee4ff192d1606410646679b8c53e4dbd3fca24f185e6ff971407fb9063c8e0a56fd768049d220e403883d33dcb038a55fe39084e16205c15983536c7ca0334b12240869e0fd040d02b0c3f8803d0b886f843383438f8f612c07e2eb3b1ed39e9f623e6611839086d1d4823e665799ec7c613cf11cdceb237b4fbd12bd7b1ac6feafa65f58d20734287ce8f594a235d1b3ea0ec3221f05d0440238aedc2b2a04feeb6579a4b7319d156a2520c53fad231ac089a9aced7dc89075254e17767299c00fe57525ec1afd049b2091509d4c7664dc8f74f15e9259ed25bd932ed9faafe983c41cebdbadb771903d2d1ed25c4499a6ea1f04a6952256f82f45f64508672d46c3030f5006f3f4f42cc3f56691562a4fc3b05d9d38ad71d8a499516711bc8761f421cdc9ad7118814ec0f1c59f7cd52359200f5387d669870cbd80284f2bc6ebade16f132636af5b43ddb1434d02567e55181cf6cc82fe6cc081b862ff62b6ff13bf6b4d3e785ec79a69da0ec09cb4b10f0108d1dc528b4f599735e31a8642d44c3279443147e80bc61514b44c1f537a9530a553f4e86c5211bd69879e41a89df950d78ec65ad8786c8085ba3603995b279bc417bec3347b03420e7c89b6bd2c10b515c86d883f52a1efe5b8cf49fd299c001dc888832d556b0a01f59971241e0a7dcbe79120f3bad11a23c9aba30b7a7603ee524ee48ba8b5d5450798f03e999489662cfd659a9293a1d7e230181f6a9b150459fc6453e5a1e9667aa1467091a15be5548ddc56d0454e300fb8cd55e746a788c349fb35e5198f78840229d9b6a1e4e6d180969596221f4516f2da8d6f7af14700aa3662e2cc042a572af333936dcfb10c9ca08b98dc31ff3bc6361fe23ee271d291cb3a423622d32a3168cac89664ef90093b09fdb3aa494b245d16123532e8d5291ccb7b38f1dd7483eaa45abd99b0a324fbc0da4c59922f4a9b1381e674671e9433a8d3e136c4c357b9c441b01bfd0fdeb02f234f3783e873b84144413dace4446d9f628959266db737e3d2a11096fe4a497f9f9876f97e209053d0ab90e1b12a7ec2b3e4617ab6ce7ea6662a668745ad596e149cb52f07ff69858aa7835665987f04f1ab65ba4cd96c80d629486ea2cef9cf2f73b0c60dbc77aca5eec515f71677a3c1539e9817d6538a50ac45ddf97152ad41c62bef2d9c5037a59a3bd5bd6ac9a05853ce9a38125f27705a91fa6dc081d7fa33dd283db67ede4b8dcd88b22e282a8c880d6747a564e48c7e89a9b1d77ce06522d3053a903053cd581d5c6ae294c71ab82dcdf65154f4020b787597a170988433a1ce6822e15edaf3d761c28c3523d37f72bd7e07ae4ae02b22c4cc1384bdd15aef94b74b86801fe6d7a564eb9fca26226ace92b64cc08ce2cd1f7ee6f6066a6637de99a04187651a1fe49dcb8456bc6ca47c518b32d963382e10f33c86ca01536fb66b0bf22d1589e7d62eba44052dbfda485e8de7147dc3e3dfe04e18cc19b92382fac70385f6f519ba936f496073f12b266f2290d75c4281fb6eab3403bb62f39b5cc1ea279657ea055800de05e06ae610a5209ed6611bf31420877012980c8f3c40397dcdf8543936ff4a02ce82582d208865684135ae36a5d9d44b07e8d69d0c0c36e77f00ff950e76cdb8ebf18cac2431578538ac692eac392e8099a770d26a92f36e77b9f3bd5ab6cfeddac925e8b44e7d9eab522d535451e5cba67e409910e1918e2c45a1e115d7574b0e51d44829487359a8a032eb9690009e8741236e1e5615aa49d96f1263c4cdb5a0efcd32435aaceeaa12d36049623e961927e1ff1a4397caa7c41c0f0dd773881bfc8b4f8234c6c8bd68bdcde30e6560f9af8f8a129d8689eac6d3b8084c06489742a25e334a692e6b122060290ba9bdb86ebde5d58e011ee16b1d0d54563e307a2caf1823d8f7dd108dd644f759b18ff3f40b33406cf0c94360a061f0e5b6f9655a148c917d13504814f566f580107ab554f6410e8479d3bcd58b614224199c44f75ee832e8e3edd6a9a38a37faa74ebfd3f82ad3f1f98ed91a15bc2ae1e589c70f85bace122f47d9bde1f1fa60cddef678ba1250a0f23a410bce85612bfd3b31a0fea26827c2b529e5507168a6ec8bf61c1814c3134d46121386a5ebb5557b62eca1b59e33dfe253a1bd90eefc068f2a38c4ac2d6e2f51eeebef3219cdf7934b179f74ef677da8ae6eae984654307ea81672d03dddf5a8d4d9e023cf1cf3fcf199a51dc2abcefebbb6bf65f329d60ee9ca149f37573c80ce90dc8b4d7bf2290063343408c2e5b36e5e7911ccde412ba700fbcfd3def04ed98bb560c3f95843532a81b1260aa3609d303e71c4f3c8948d1ad9ea719fa881ecf9b61cbfd89a0e346fc45d1c7126a47c78d8045ee6b9d3bfc9da844bcaec311c4d4f04342327815ec410879adf886779c0fc3b7e5cb928ddb0d8cff1e8f8c3427840e187f081e21132338945a2ec16de1209c31c6ada63d1c605704ce9bc0c6b915b3d1f225e86427ed7ca385372112602343a080589125c56665a4576f3ff1873f832885c45a2434f8368e35606d1a9604f0a7c8bfb769675d81c9490c103f27c0696ad3fde38db000af696d6b8a485232e799fa19d87b38e528348a49874fe1389234078e63c34b553685ba339a6546124c96f32d674ef45ac1d6f0634e8c2c6ee7cab171bb499b54df5707df4ebd1ffa2436fa16e15efe01f49903f22ad54925c88472b156a5dccc903adb49730c16f6ca133edca7935715d0ac3dda1465fe17f57571f5c757170d2695058bff68a937d1cd9ccd0d2d7e4c6a1fbedf815ef6605d2d4ee12b72a589296495f1f21d8a433a73b3642686b31b5755b0fa22fb9b8e61d779547eef72204490a5d09590849c5559098a0950820d08584275b6fab8f43cf25484f82e0c8062e4f2bc54f86e9d39bc3335b98b7f54a056fb6186d092c3bcfbb60eb07c19e5d3fa980f2462d4118ca2a1d882987f5435566c9ebeeed31f56f39563379937efe131c7bdc502339bd30ef338efc8b260fd092e2892a8809c8e3bd075277e7cb6ad1e579a507ede79358feb1464452b492554a030a0c48d705975a444b56bf43071f03e277d25a373d34cec731fe07242e65af7ea8e691246f37b8030e1e2779e592ca7baee088e35eae5dce7e841034aabd4db49cc3936b249acee2f4aa75ae19102e20591071e6cc37fbf6bd86f049ad4a40e9170c92b1a70641e1f34773c2a3e7f325400570ea9130b210c16a15c0c1dbb7b6901805cb3e3f7bec3c0571593b2cbab45a44ae9c6cb78a1a4274b4dafc7a26b36b73d9970167fc40ead80e32e1511ca1a0e7a13e2f5fbab741cc56f4318504721b17f8cca709fcdc84b4b2181953187dd7e02dc75a2fac83d0f5bb5800bbf3f742d06250c883a6a6353c71d5aef5aeee66e410d27d127ca5ba4b36ece8ab8631506fe0583f22141902b729a9d98395206249409bbf3557dc4ae17052860bbf0e0dd303b6d2bc751d2170185ec161b65319d53c936ac2be9a84dcfa24284d1069ea499b32ec56cf9b2193f4a51122c2ada09acd52a7966748d830b3524cd592a9565d5b290912f4648bb446a2ce7b69e845a351935081e2b8a55502139ef5b0505e9deaa05f598e1deff3499558961609376d9bc017e705da1e44a8bee28abde20847005a060394374d206c2de9a410bfc42063159b752e116542e3668ab2ea6b0d038de825bc0658ebefaf36cf15a4d8cba5e7938b1e1daa4334dea7f2f6e45860ae309082f034d5c5d5aceab3ff3133692dca2273206f53774d9aeb1eaf96ccd943e5964f509fbe20cc7b0332066567bb1e07d9f74bd667482fbe6c25a05a39fac8557091078a2a361272b181f00ae86c6301c6a17eecdeae5ce34a17e7d2e26ffb08bc7e104744338d3454aa655d28a28a2b6d88fb72c32b48911c9329d47f906b70a19027ce263490604d44286a35fe78fee642e20e5723f90a5074511ba1295af7beade863680507989859b30bdbac1cf638095806bc72ec73559ac306d0f4f1f11a4be2970d3e145f9a9fec35d3d4c417c358e8f73d0ca4c7282168c6ad9b3012782b7679f48254d37ca0b23916be3edbe4bd4e82a10e66c8d590766644e4ebbf37666440b47cfdb74faeba3a7d8e519b1c63dc395d7f33c88a3f714f173ca63b2d01368e8432ad73e5685c8ae7f9b6257603a993770ec316643c5e78208951fd06a3ea603b906a2fbaecd95c93c955db72ea35b58924de2ea793e1d184e424400575a751942e6e479391105e3ee7d16b00c2297a73bfbc7a775c338b02d90cf80c25088702e3cdf746710cd54d6f45c2cd825111d9ef8f8585ef79d6b997ac66339a913859bebdd15248c178aba41abbd9110fa3ef399520d4141ad5947d06a7fdc89610db252dfd25d2971770b65a84f09886906eba84885bbdaa378aabca8d1b12f19c91838082e328ec18f79271a264211a568f73e687c15a9f0ebe32d70761d6e6f3f60c7ce859c160590cec8ce473d4b86014b0b2d04605feab9534074319f75af33847f7295afb773b7919dc55a749c3c6766c43fd00ca31053a724455323b136c8f782eb35c88ed1e056a806f8b1f8862907191b6f9d81a52487f536e64a02fce373631d2c65087794e35432cd2788e1605918a9acdee4a0ea40a66a77c8c8173275c5b430c5c87b04f9b11a821dad381b4bc6f618ffce193d4b4a0bd8ca81697891bb704e291b339bcc85582c577289b3a5454bf5403700a67a4f823e6b720df93c3d54e48762d940a6cde771d96fed82a094e9de7f1d3c2ad59dbc0007172e5957ccc9b07abf7f1aee439778f58111fb42b0564628587baca00d17d9c3ae1bab4f2ff553ae6af6dfd267e1be5d6e95684d2ead41d1eec1666f449c1800ba16f8fba8f5ed6c8ab9672c0d85b66ff47aff42778e67c5022c7a01cd0b2584e0a204755ee05b9bd39fdeee8bfa94303ce636bb075a6e362c806080b4b1ba643f81cb25d42031b3435a19c00ab0f71aa6b56c513961a4c3595b2eb8f78a806b2114c528c4a2c83a113b23ab1437c58b6031d1a4a87a26ba24dd910894e1fec1bcf07de38dd5adcac8ea4c627ec3e78aad94b2532f397bef4e57431342c500efc16bff458b7c83d0f40e5fe054b4138e235f27f34a6f2bc3da0501d35b8ca41ff27e9c110f373bf636af7bcc135a3014bb9c39ec05af20d3a4e1d514daf651e72f335e5302301178ca5b7f34fdf13084dd36fb460d4112d4c416ce797757cfa44e530d3bff7a4db06c985004cb60394ed896e6f8fae67eedf148d5975a57e7a9df4f5382c5a6b6b1a65052c599a5cc67246b83b22507e22f69c33ab325d81d3496454768324a19208d0308fb3008549a6f4cdaf1698de61898d3facd71c7a059cedf890975c881e2354641d5cd4450789be5e73105f91dbde73a72ef58820126f03318ff674ffeb2a71b907e100c2109a252801a5e726f94f3f98cbce3d99d6e4eebbb66722cbfe1e29daf220ba53f843bb12f4f0890484400ac770ceb85c7cc230f3399bc527503cc4530032c4c31b12ff53a5db816c834eff1e27ef412c03da306e48c6713be6299396c650443db6ed82536000de83b91da121762ba3366543881a08ebad79b6fcd2af9ea2be352c41a910e1c25285737c28ea568125a835580d6401ba9141eab90be92b90fed1f367f11cce0011729e4315985d7fac7e3a0596e4967b8f0400296b975ec8b8641f1c5c72ac770c81c40fd44d06af78c78241eb577fa0ae3ff493a418a508ed9f8d8ee63887877c9712eca057b8d59d3e233274effeed25fd05843e0b0a033f92a82932cba304332253ddfa059e28734d4cd18ad78678db7b4a4c0686a65eead17b9e9d751800332674d3c29e2d410bd55ed7446aa6abf6dc8d49604b8645d220ec67b23f0e5a27d36dda196c564fcfbe8ed9327ad277b046f539cbe665c34e27c4a6ea563e660555a91011774c6ba70a002116b95e5233d28f9ceb015ee2fa9cc28a2313f8d5e4c9872c7eee0e725ef8c4f6bee3de62a7a17cfaacc93203664ff45779976bbfc72a6488e12ae9a582baa72cc26ae7bcec6acfc7c7b7f2f0c775ee1f72ca89cd178e8c559ec0631b9fd75f18867f87b15aeacffc5697fc955be58b4a226eb93ffee1781f12d9b61cdbc22df78873b57836afa636cb21dae713f8b63cf8c0d328e7e12bff9bb1d35f3164106b62533ed89ebce4e93a2b5a18e4337258565ab9a48968ac3e6e0808628f723bd207012ca475e11702f5f3647244694fa5b7e63818fdd6ef295f65a848cf8207990eb3bfa5c2162d86c93e3746f7f323ae2128aa48721f5dfed4d6c80f02a7f56af2f03fdbcdd90ca3ef41db3b92d598177e9a48736113173e672b44a3161ede5082a8f4152aa514437c78a50687a38aa5235e68d126ecdf35574a93eedc5339bf487538bdf94a94228ec27ff513559ab06b34860d6118caed6851c5ed1df3826fb852235e375d10da023a14e9dfd038cb0aca4e8a63d3e1be9f138aad633ac2ac48bc3d41d6e6d097d5849523bfca7f15bec107a2980631e44dafa3e91404d13a26319dfe2a309be762d14d6320c3dea11209a324b6a20e4547049134bfe104aa5753709d5270994c7d251242cae0844ec76841a76d49e39963cf913cf3be4b1c72938c1de2998aca201dd51629c6a5f2d5b8cdcc63a26e2338abc92b9223230dabe8ab5e3ecf5f434b58051971f4839b4060269b5b6a07d70bbbef7acfa5ccd574e6e36a40cfd72c45b11b446a4cfc4cc454a5ad7f4e7254486251a809afc156446e5c41e16adcfc0dcf8830ba0b2b6f59b46c17b2bffe68449864be410916d56a530ee23e4150b5248810e0b46587f76ad13221f5e152fbcf0978746c287090016a8a2028d7131223402607cde01c383c344acfadcd0c26c2ae963213116d9b5e62d292ee982e041c44866ea979d6f233471c6ca951602524738c2f9ddaa00984124addfd66c05e9a6532276be740d4b14c475ae3c8be5de7c92333bba47a027902201fb366fd59d093e9431faad585baf52403a3d54054050db441a8463007517882ac7c636df1d839f5bd3ae7623edff9e887fe5ce23e4cd6b443d4abe3eee68d188e4979bf7616953debd002317143fe98c7883926518ab5ddc30c28486477257cbac6f8d6862cdc11bccdced1f39f2e26ae1a0efa29b139bc3ecbf6f2b139ae424567c23c5d07050d17185c2372486165f6ba74c6d9bc95caf6d6a3c1442b28bde51338c7c5bc7247bea741018dfd9df1506b63973d1b5dedfa0503c7b8bc81638a484cb0454cf593bf039fd52e62884d4c4051f869b9fee61263853b8550c057825727f67e761d8f1421ba9bbdcd236da5952266370eb4c0b69e0292efa2e2b4f020c48b189c30e91f60a2b8859a449d1e520b1891c99d44d395a5c89c0ebe3741388427099ea4ce13bb4d7139341cc58db11b3666b21a17086f56c1e3ed1418f247babb299a5eadefd70804999b9a85de46c2bac1e49a902f2a5b4237c80c5aefacb5f5a91313d8f0ff82ddd8eaf71ddc50771fba161e2d07c94e77551cabb026cdf05c40d1f383269717c70b7bc3126ca206108e36c898eb29335f13e64acc6a0a2d25a53b1cdea0ce706a11afa1d7b689ddfc3e31e4da11b3baa09ca897ec92c04588eab7560baf14b88331166b1d7a539a7921c19a8a6575236912aa05ee236b49db058f0e66681a5c111441966f46688a42ca5459baa4ab484b703c4512824fcc2bea0125bf9adbc8065fd776bd00cd8071d7877e6d377a5ef0025168a02c1e1341d285a9df04dcd4f551a38b85b23de7424b7495c5e14cb4176716ae8d513b23c572fec96b5c0453be90bea3860c9434f58e9d16ae34d47d2f8a64788d5976cf7c6c4ac421b975a68906817ff409c5a12513427c8869e71449848ddf24978e9820acabb718faaa2f6f57eabdce964f8ebdafa9060393abc04cf40eba50dec06abd028132dc30f7d605f75c5a5fe2dd71fc7db1aa78f5ab3bbea14c7ac3932ee2f57fc4e8dddde5ee9083f5b36cff1ea0f791fc54517d9fd98ec920c1a2d71a8f851c0dfda81b7e6959d6ef9571d755531185926cb98a10cdd590ab81dd1e9ec07371f7689ce1913c4c4c02ba210eae2400b88b05f03e0ad4433fb81236204440d8788691b6b08c2585108498387c6ddfdf54c5b609d41bf641a555961481ecf8deac2b1e85d4c431acd77fa14a19543f8d0b8e8f306ce9372335b77fc70ae8274f8005e2d2aaafdb9fa8162bfd4110912c0121dafca7e2f3fd548ad3a0c2f7a51d3f71ff8fef159fe02553c0ca97fa53ff26818d047ce24cf730ba51984c432ded086999fe353e82427e1a55f72d6a04c2b77f040d14fda5a975a9d4a79f8aed8806a20e85f3ac90539c80f2e96e888001fe4c2bb1ff82405c4b6c8915d5e662b49594e63e14c523b1153646d2323b2162cac32533f72508ad53fe067a3d98aa2e211dfa7eab5260bfc25dcc7ce5b8519439c8649ec83752f21cc0b1f56390849592ad01855ce298024c4c00387a26a8ef7eed7d61de446f3404c16ea0df8eaa7177ead9f3ab6e23fcfd6f85159915febf7d60ea37b30dd236d028dc7ab6c8b0a05ef15ba497db74085c0f02ba9711d29e51cb718ae341fe5179ac36fdba73e7fb6cfa6a3f06b0b874266dc1703992c8ee110699a4ddc47f19bfd4227e21c9a68913406b7f00222336c0fc5f8f14d6417c0cfdf755489f8ac17e0e0c5e27481e5a0ac495c5d961ade2f1c9dbb9b3c5a0abe6572a86a0fe6a925b3bdcd7d15f992e01b4514b6f68e9114629a1720016e005fe95af03b8ef669ebab23edaa97fdcbeb6ff940f23b42fed287ee307cf3e546a32fc2da048722058719cdd637eaac6267b7e25c16218424050cc340e04ce9a5eb342b03ef8cd4e4c78c4cfce08a5b217615f5cf0af69814bd303fc9d5803b0948084e8516148809644007ac47ceaad522948028e4e01a937b4d55a42f39b04404670050991d28c10cf206d85c7b44c8f65e180683b3919a80b05cc81b300c43324d65cad04dda956c243eab0ae5453d93a47da6bf32b765cfa54f726fb94517b4dc17e55f32c38b2cac09fb74616cec0953fdb1bf439c6b743665410f77c20a6222036cd604849865398f6b60017a23ff19c964677d7746b4c5bd3325e370b3da48487e09cabfad6c34ba3174cf534f9d625828b56e7d4ab38b8baa7a7a90dfdc7db150842b2810932329ce2deba204d5626a7a67895049e374d44825492451fdd37e0b74eba809f318b326a6d0683b8b8a243caa1287caffc17ec426d0ef8d6bd915b3c4330597207895357b0dba86bba8819fa393471c8cb3ddddff8a3e6726d820fb2e51e4b12d14fbdc039e4383b8d029c36fa064d7da704a571b5f0e6dab81deaff3d9fea0f279b831e015549ac4a1f460d18abfab04696e4b605cc18850c515cd08b96c5a2df5001b848c1d6fd0a4cad1d2834a3a585768460571d7fe0b135aad4a312f611eae87bfb5670950d7becb151676c99bf619783ca8eecc16eea9e9e3cacf87e60987684088a33c09239d9655a16b46cc836b24291ccfd43e5a1cf6d932dc12a5887992cf2f62959559c5c8876b3652cc27d4ab8b198fe54ff93b21ca871b3fd333eb2d443d7fda1ea021db462fbd9f7a480b9acb80a2754fdb77c16ed2124cfbf56ac4a5974d808cec9f2111b599c19c29ee8ffb45dec24c4dab16153ae008996a529b0c7c8613e8a8936f10fe1a1c3c8c8ff3a908c595d91fd036458415d92891c38d9a256b23a2c12f3ac4c43ad90943d7defe10b3ddaaff2bdf013b34757581a1db778a31e4400f8e1d50f6be5f5f008273375069cbc9b41febdb76485684b2d2a712432225414c6466c7c227b94e8223bb2f23de51b76b1daf7acc07561f130be14d630366f6a78ddd555a8e8716ca2a0aa45a9737b356e61e6b4212aa1fd8947a0946949a1bd3fd10130f0c9935d9d027d0c0bf21d273c0cbbf6929faae06b6f6569833a3df4f6bf81489751c5b9f9b7f1db67cb30cbf905b615e01ea4955066de4196e99442aba99bfff76c8b52058d41f87a2a26d705ac49244e30d6278bd99259c47bbb986d45163ea734aabb373952394f714f45e049dabb6ea2345331f753eb5aa69c4247439b27c4c44ff7abb19960e4f3697e864d45fef467809d189cdcf4f7a8b99b877c887202b015e6465085b28fa82503b43de1cb2ee50c1b16eaba8241f8968a2891abfdb3ced80885cc8bd3341c032ae8c190f4e427b744744333ee18193a58b1f2b4cdbda9cf092bb19b0a42527b68733834ac183136587298cd430ca833924d6304a2659222e0a5f6660e027d62491a851cc41a3d7b535cdb17e3b3b70200c0b8f75e7934a1cb86619fafea705d2a3e0734b55cb8911f16385fd077a125d8e043aab70c268c5dd4d65d0d2980820b928f8ea489c35eef4de23ee31a430c573b69fbad09b856405dc3d2dae448068e187538e350199773ea2d41676fa4514cbda59f587bb17eef0347ed177a8ac5f0163511140448d27352cb04c483bd552405ba7ffc7128fdfea3d76d17ba8ad824ac9843f65d711534b8720cebf400a3d5471de4b48f136098527b65351c7c749a697732d57136570ba3437017f26fe2984d947c9cb3d5aee0aa2888863ecb60732671d87e8c1b416f3ccaf7fb0e6c9bfd07bff0cd7989d94d2f89fc1af297dcfe9c8cdbf18b70b6943b890924b965a638f50f90b2e2496d9216f13d630d3b3ef729803d80b651be4f0547ddb220889e99507bf513d40f4825c2a91ff27e4cd6b8817ee47fec079fb9c68ccac6ef6521fd8c8ad0da303ca5898274df8e330eb8e31237ee71c30967dce080abc0253e02017297a2a7244eda01ecc5b19b6f01ceb9ded9beb21c81754765b5016df71b8dec9d6f4ee776ea6bdc88464cdc903d74dce023a8cf377bbf6deb2c2da7db05778098a0d9eedb9495bcef20b6982142c01b2e0bd13545b205d6950edece490dcf10f151e7dc45457225341b506195fdfa0cebddfaa26a54894706da25c9f071b617f6630127911e582deecf2427faab7a9a2ec0854a0b7f00f563fb8b187b8f32c39fb18d11e789305002e4b543b4ea8c8517b11a01229013cb077ed299aaf78e18dfa3e4a4809b783a755abb549a8218eff418beb5aacc8e8835197bf8d5e8fc9dd66c9602387da42d039efc6d6707bcaa5fe3f56bcabc56df5e4714b89b99e54bd92f09ce9a28a72929be8c173821627e4ac699bf84be595f1e356ac6ebdfe2f2ccbc471490d453adb6c45d91346d72823aed28e2a95ed2bfdbec83b5fe8aa75082946aaa537e6db683a7cc2eea64f9d82876a6c6f2ad653f2401978dd9ddc939cbc30f0a0c9fafa58f40141610ac1b89e66d6317ac544e4bad910750e63a275654b53144d95843f95a4b2e8a34479720062f33adfc64a414e56aa3a54567f07b6f7a7c7e5abcf90d10ec39974ef8283827fb65380150f71781cbe677d879d1c0010469d035e22797ab34a8cecee31a2090fcdd6e3fe0f2158c29a60b9d94623d6092ffb5e5e2db9201e82f85806520dea93ee46601397e60e43f7c5d2e85d000b8ebccf490670718535da82bf839420fca705856e0eb86b6fe7e31a36e364b469b34a85e8cf26643b5ea502c01d6bdcd8b313eb942b8323ff97fae24f5de86170341b1e73a2c509eefc63ef4536e0e4ddd8b0f8d161abae5128bae5be15947015ac29ea4c2c3a3490da1b060d52edbd76c7a2c7be0adede3f9998f723cdfbc43a96cf3732e2013d9397aea678180f619a90211767fe3841f86dbc4e9cccbc72e6da9a0f24d8de73f8dd29b3387cab1f51020f3b89b32ceefa10523a4a6071dfb4728c48d92edd5ddd3e90e0e8da93e8880dc58dc44e1bfa57e2c0ab000ed46b60fc4dcfcf3716ac4f7c34f4afd5814c0704141f6eeb7aab8f4337be7a22ef7c86ab6dc40926962991073414143d79f1123fcc4f772768a32c3f7e1d27a71a0a860c72244b60bc4018f8b4eb83e8be4376af141201f50415f61a67a6f85407301e711a92a99e21c13010cf1e950b8a006b82fc3eb56328d7657ec0c508df2060c449cb013eb90561d1089a22e4252869a53067a5bab71e376d663cf6234a618f91cc1f872694c3a97cc97ec9b2702646af618bc0524e1f66216c00d0169d53597a21aee1d91eaa9da4a4d6c27f5bc063ea9b0fca6a1f1acc22c2ede8b2ad6cf343b4faeae116088583434f9c244aab6812ce180eca0f7c3848cb972e13606be1016cc2df79530eaf78a5a6a9cf197f0034497577ae6c3be4596ed176a07fc2950b9b004f4fb1ebd04ce4664f85f640754fd029a37e6705d40d6554d079930b6aa64da01ef2fd1fb10e80389af4e50f9a3cb95dc197031eb9fcd6ed245d2901fe16d41582b2e430ebcb83bec15771665e5434fddca47d09895132429119ed1306ed15e9e6f8d65a48db45023bbdb965b4a99a44c0123070307e60645a688e245cf45a620f2aa0d3cf3c0e0070976e9330f0c5c1f55cc323273b2a7aa33cde69a5763599af5cdf32183a5d154fd6c68ce7fe3b26cadf41362995ff38acc1b74cb30f7074e6f4f03cccd2f5c802a428e54c58dce256e0ba248102e78140c1999c81e5b0fb2cbf0a3a801918767e738d945afc6b2aa53ef866cb17678301543c479faf507ee70e3b22a483d1543e8e97701d2cf4f4875aee2611ee4f1dc8aadef552381431981e7f5fad87a9751ca2938761979f493679e71e2d16df00c138f268f1e673ca3e4d165f476f18cebd13bc633481e69bd79e95a5cc24bb7b28997be01f1d2436d458a0a5e7e41b4084351898837f508da10d9440f407026dec94d9e89735cc93339c77557f24c2ef24aced16ee44d924769914a443d8236c4f660a5d87246de8c50b4c79b6f974d7c7b03f1ed6dc5b74f157c9f380d59db3d185fe4db53d6c14ac4b78bbc928fbc94cdc17a846f1f792f406dc8b76fddc843710eda1ebeddc445e7a095e2db471e8ac8c12de7db397bf24c3c1bfc12dde4451c7e895ef2e28c5fa25f4f86fc129de4b58b5fa28fbc8ef14b0423c851e47c4c024a276a3cd966269103c2cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd76e2c30a4b8e4a0e8c9c544e4ace8b1c548e8b1c16f77250392e7250724e724e392639de97639263ca29e5dc1c52ced79243ca19e58872ba9c16979c2e87cb09e5b8ac9013cad97256602167cb61a1859c16541d274f8684a2ec49ab66b710d78946a45b32999c4e505ca05ea4a460c4705aa99417281754658505060e85c5504e4e26a6128ba770da55baa491c8bd94e8aa33198a3aaece5e7ac8fb5eb8b47016d2c2976ebf16d4b3a77cae972eadabc5c5c5c77e7bc56a9cfcf6d270b617caa7f05cae71f2bcc249c86adb48c6131a8e04bbf299c81480f8e83ca2d39b522aa9a49246a7913aa595524a29a594524a69a5d44394d293a7d4435a70ec02c680bd758e73903d925f3922553e3f3e31d8ca135265e4ed0f225265bd890fdfae60abd9db951da962fe959195cfca6b75e4ad5d19c2cdd1a4938406a6239f303b5232719f0a8caaf8bcf599cd39eaa56e503bbdd48d7969082e68f2719db7eea2a614bbd6f999c8ecf5f441161768f2c159c1648cf4e1adaf746a5e66b2585c350fae7e4e0fae602bafcf41030c1d5466bdb20ec39935bd140d2995a05e594f39b34445aee629e9d4352f255df31e3c58d3595c2d9392bec262d33229f9a51c305dc5a5abac7c3ba8d72f25a5f4509e7b7605b35acf5ba72a61ca900bae565e6f9dc5056b808ef82b3d3b6f5788bc75b1e117eb2324aecaebadafb4e697a2a1b2b4959a1d2aaef2e9c012d1a07d2bad5e59af9fca8ce2cc94149edbe1b0420a4c0b1d93cf044db2183d36381fa0a1a2d66c8e830eeb5c49873a0f96bda1695f09a757967aa59e5ed9e9954253cb2b2d912a6ba2e1a467aa31fd70499589c7b9f4da44535a626a99685a3246fae944f221e9489d2b3d130c27c429e9987a7a657d7e259d1aa12d0546a86416daa48fb738b8e04ad05b134cc6706edda4734522e762c74999c44ac673e5c3d1cee7878a6656466ad5346bb72d14da821bc0921902b4b80104759d48341a918c9044332b1f233fab232b19c7f8c5fecc5cd10bf3573efc220a6fc94ba299950c003d0030994433ab2352653310d224ee7643285cc5a4ca7e2b9954b1c9a9338542be6ddbb681f757486e50fde6ab990be74e1d8a6866a5c4437114d1cc0a8954d9cde56f1f08815fc9a4ca9ea0a0b8e8564644332b18bf58ef6999f9997a4ce13485bdb2ce8345bf1dd4b54f46afacb3e886e6f3db315dfb443c5c700543a5bc709312544a0a2a8c00c0d94979818a11ea1091312553cc2413cdd8308d82b8a615f556b15e59e73ac6e6d208e4c08758d363560c1d19c3e3ad0c31745a2686ab57d66d2886ce1643a786ea63b84470c118aeb7ae62a3822363c0183a6fddae603174640c18238c614d3a5265bdf3158ca56673965628fced93cd4213b4b244c684dc3a8b4947c6a84a5c3429913127ae09385d9049ebc70ab126b4deba49d63293653d76107e5ca11d7eb1be322263ba878f8c39f989c998d191954cc69cdcfa0a898c91542c0007a9b2d65d78e00ac95b47f1c0d5ecad9f786009e7ad9f3cb014be75130f2cc1de7ae7e58822cfa493637e690523796089662bc14c356d0a1296964819cbb2cebd7806bff5928fabe7ad8966f481a5d75b9cb72e622d43a31424634c406eac65986565771674675766f29147666f41ce6744829b72182ebd7330b63a0f871c8864a193026b934fad71cd6c640cc8b1fac356206feb119da883917291010719d3b9751d3246e4d6739031d2add7d032d5ad751ad6de1bd2403de52ca2613a8c8f668990f4563e5265b76d8b906f4252cec2f30ae655570562f3d65bc1bc9511a9b29ef2563ed200b6a657b6d6bc75938f6d49950d997cde7a2af4d5901f32f95837fd5837c5ac9bd458370162dd74c4b2b894bc3505bd3569bd35f9f1d6247beb212f178cad576dd5a7df123742ed2129db062965cada483dd2508f3534467982b0794a2975abd519a8db60908d50e9b4beac8f1f3e3f2900b20af20410b2203f822811e249c2c863c0fe05481f5de787cbae905fa47b247e696faa840ce5dba98f368b611e1f7ca80d25427b623c3e50e1410a0b797e38e241fa33a3bc7fc4cd8334c837a991f021486cd9bdaace762ed6eab536951f0e59a7b7d3cf07777a7bc421bd1f47bfc7e85bd40c391284d2e25c3e70d14a95acf73bd1342d478d98d65d5bf5b3213657b956a83aa76975ab5554b99aee6d0b7d34a8378f2f6413b2dd7b05d359cb6c32240f724c8bd11ada835eda6f32f19c2bb4048e9d5db83979fe7041baf34c70e419d35f51f0c025635a7ae48da34794c7fc81a58fcccc5432afd8bd170e8d8d66a3d968369a8d66a3d968369a8d66a3d96876a294524a9188f103e9101f43916015c561efe4a77777778e1a33dddd9b4f9c892ed2e282a3d8c8881b5fc091cf4b8f1e685f10b2b9102b9abe05e1a54fe728b5a23947b1cde7bb40ac42dcbe0dd6379a15f2f84242df8e1d58f287abf9e6d2a74771241d826346b29112a42771e2a56fb06df6d23758cb98587b37d80693492548263e3a384af2729ba13ca594520a820749a149125e4997a04912364912b6491293242d2685dfc2832649f8e4e2538d6499c0acbdd704c6a20bcc0809f98d6685766a0c10e7073be15c22224061362200c3160686092ee41c0a2e75aede55bf321220652c0e8f8f2055100fc27cfdc00a1e3cc0579e0fb49edb429cc7fc9281f043d143a9183e140a9b27d319239522ceed73b00fb914bd103f24bb11d8018fbec957abced0c7ebce218fc4133fc11c5aadd6eb407d64ad3d8aa66b9a735a7f38dae5f36bd4bd7ef4c3d1deb2a7fb68560f1a6b090ccc8f2e5b61abd50252d3030bb4b65bc0dcdd33c65a6957d1021342fc182244c18f2ada0431a835f0517df880fa80f130052776c0b29bc851d8a20822a270c1112784b0fa882876504b206b7c24317dac00885a6bad3e6ab89a1e50a8a14e7d8860f3d1aaf17104f591d343d6d480e364f0ed2754f7ccd36305cf3df3f438c10fc72e31b2dd6e6976770c75006555cb2faed20fb81c2f708e17e48b62740065c5396d9531555a8fbae2c7bd434bd904ad9a5bafaae84651bdeabe3266523ef2f3c3d133ced994db663ddc383bde38451f8163d68d50e863cd439fed558b78b8d6439e768373fbed50f5aa6f845cfb76b8143d8059282150d3ca40bd7e38e6c791c54d3ba3849130ae439e0db9fd76a04212e07cfb7670425ce991c5a2054caf1f0e3aa78c492880c58c8c36a513469086f2e221812c86103f0a49508507f9899774b6e4e961072fa577ffc28fccab1f0c899a2896401d65dd360860b1005a816f9f9eb5ddd1b5ae9b0dd85ada6ec9b567ca49234a068bc1c880611d38b870a70d148a613030303035c8e6a44e58bee1a9b75b29af0a6edf70fae81393d99096ad7529e5b417a66b13ae7556ddeeba053bf11cceee8e91c3b736caf842043053afcde30639f8e944d46a0c1c465e55910c2d030f1c3c75e2278d33886319037617396619629e1b9552ca2965adcc1ab59359c42af6d92e597aa07d66d168eb81a7c70d019e7968b278d3334f0f43be0ab1f51ca993311a00619e71e855f4a01a64367c248d5ec5703ac0023d6c50822480a0c8107860cd0fa65745c094e04194110faa8a785006091e641f221e64d9c7117c0b529ca008cd12542ca105ab817cf4e97185152d08c10f588480c55268d10326f4c84006533c410052fcd4207644881556b0a2d368191e47001591c288278c98410e8b034718294209456040050a58d16b68191215aa18e24606419af8002b4201044a8e5042084978410f58b1f534e40e9147cbe984208ce821c8338f0786bc0f9e797890bdbba85c1f1d053112bfc8ee59c460fc0ffc7044efe7a7dedf9d1e2ae2883e1f47f453bcf143491516172451c17125f697b889b6b8d1394ef4832b5d7ae414c04fbde2b8003b18b7dec18303d641ed032d37adb5de8307cb7e3d42ce7decd19b5588f590fd7cb0be59eb5b0f6bbdc7f6dd5eb1f7e00f656f73cf2c3876e1783bc1c5a16558ee9031f1ad565de5ed551c18109feb67633be2821c4ea7d13db559677518a962f61a5b4a9844ec130760bea2208721a6c6506f196b3feda3dc8cf65aadb34ea7a19d73ce6ddad0329b4f8f413c630b96913892071fe4103f6538fb4d8633c4e946d91a9e7ad844a4aa7bbec306f8cf6fbe186708179caf8f73bee6901d1913ed4b8a1caab0f301782652851f9e2381ad437e9dde1f8eeab67e38a64ba7df277a41477c194535e61783dc761df2dba37ce9f1a5fca20442fb4f4a69b7b5dd5ed75a6bb3802ebd59a71fc8ae7dddf5b3cccc2c550ef69c48ba89922aee584d434a41cad813e09807d80fc83cad20e6e121c8cb4f87fc0ca05e072a6a55a042eba3f3883107278dfc286284e6b9c8144a1eb42fa7903d1799c2e7c119bc6a9bc3097d6e85163aeb316ba5528dfa9b33b4bbc22afd4df6a4a85b6d10b66a760b719d6844ba2593c989f28a8a30707282e202f5222505436585c5bdafc56505165a58b5d032b24a359adfe417ea1d98f1fa822b6568acb3a3246de1398d85e7ec0acf6dddf45cde432dcf71df739df79cc89f1bb13c475a79eeaa3c5782f19c29f59c49ca73a717cf9da0b878ce05aa071c6e6cddd3732926cfa54ccfc1283da7729f5b61193de7a2e7bceeb98f7bae25f49ccbf6dc0af63916b4e75aa8cfa9e873abf91c00fab900c8e704d06d1eb3e68b8a4e184d89c6c38dfecc2e4c1973e8982fa495a221b2a84716fd6a3a16f5547bfc540ca46f277d7f208f17c201fad95e7177b71338760167943b9206dd135d905fcf22017ac033e2d74de097ea1c4d7ebd73eb3c6df805c7ab5b7b2f0ab523dbd1bac7e4337da34f242a7df7eb9eee99754ff77cf5d6281597fa9435b2a6439ed1f9c9abb7131c338b6055f5ea72a7654e5fcfdc413b9ad9b8b016e5de1314eadbf9da7dd3668994b54cb417e53545c3c9c94f9c59954f3c1d3c70e228be0305c5513e1d50769c388a14d938e1c14ba46ccf7ac637ea449da81375a24ed4893a39040505050505c1c071cb548d7b50f6a250aeaa8e12c405dba66741b3356ba66bdab870e219fcf2f98252f6d5656d8353bd75aaf7ab7aef74871367244d92503d47aab5d66aadb52350c2125103452541cc410208b50902cfb431ca90a8e93e7a1be1c4e8a34b69ad943c36fa45d558f1d6da1b54f5639e1b9f7ef3036f7ff203dd646d1cf58083e13062c789fad97de4a6d7df9de92458eae8481da92375a4cecba73de4d33b081c337d60554dcb84be8ef54ab39b0004f060bf44d676f7722854d7fc1c72b5da35d105edebfe8167d4af8dc02fdfaca154dc9e6eedbd2894bbf4f919147b624fb48936d126da441b1bec762d4a934da732ec762d4aab322c7851f5533d4a1031d92c68b6664dbf78b0a677d8d3321c4e6f58cbf8f08cf85d921855d185fe62f86400c04b1e24c1e2037c8ceee4d27d31f0dc3eab841b5d8552cdd62155aa28608250841c3e1ca48a1fe4d90c0197c3a97330b48c64d15a3f0a84fb34a4e635846ce09c06bb857ce32aad1e7b7673c2a59e669d86ac31bf78821e20dcf8214f46afd87e9d05c72e9c0becf3d9615a464a5474417e30440254af9ec233e2a7007ea90ed37121192d43722679226bbb7b39142ae4ae523d88fafae5d02b134c6a44f455295cead3550e60907dbed62b55f5f28e4b43c2105d42ac842a339e81025bc27446267440ee99092085b8d4e3339da167e21201915983d9b7732b3db214e31101cdd3075b6232065ce9d99131a09dbd30f2608b92174dc810448becdb5b565660df1ee5494709128e3c41c866d402d707aec0462cb8d2551cdbbe43363b241ccd6bf1e9954a129519bf8475a5a7a5c52f0daef4acf4f4aa5b622d45e09618cf882d5bb424f96eb9e27bfb5a2c0a555b622e9d6f074938dfaa2142362db1938ecac52f412ed812fb7e11f6782f5efcd274a5e77ba567e58915d84a100b8d94a1382b464410d4125b39b2225b99ad2c59f1f9763a634b2c94c918f0c5abe5480b92ef172fab9ab5e490fcf0819d6062477605cbd022bc92f18c085479a8620b0a4592ef2933109d73d48fbafccb119fdaf04bbb8dcd11383d2f5a4186d0910dd9099fd091cd9028710111e2b6f3334ae8524204088c90d8e3276393907ce49f8f3123368830ec0032040023e3a30b7b5e64a992208f973eb9f6bca3fc8e00022524d08607b73a32b128c7f56d2359128a112ec9bd067550877cd247721d4ffa484e499674658cf5ee034b4efadc7e336251fd7652c6e4f65a92df80faeb96c745f3bce49927089f8f22d2c7d18e44bfe45d6b9d8a1a50df3a67f2684ceec359a66f09eb29d747ce894433a36e34baa3eb37a08c087ae62902f630cf3c459ce0b9adbbf76b510c95e4d61b7929eb3165bf8e65bb1e97a5cabb8ee4c5bff77a9bdd26920bda07477e43f7d66dbd4e1a4d3e3ddbaf932aae21b85cf5ee7ac8d60a9e38af0e43c6909cbbcedd2f0503fff517f8ef972a398e2fc5899b8ae1baf56bbde421e7f19b8f4825ef8a9c452392c7e347de0ddd8b381ab24371293cdb36adfd6a273b275a4ecb35681a47394e7a9d885251b7715a48dbac26655c82631794265cbf3da5cf4ee4f520f251d789462291c8bbce455d27124d9a9edd53360f8e5166b36be019fc94d26dce6d9b5e68ce90e65d48004f9d86a42e4f3fd2cf8f8bd0c49e453190beaf18a5e082f7b921b0cdf8ec955da6aad7761aacf7a7c31237a4b7eb60290dad83f54d7ef6ea20bfd48d76d91f5bfb5956d4e8f494a6d539e784e19a41c07ece39e7d42a3d4d24686aa666fb0de9dd2e3f10f57187f4d0773986ee673b6f06b9e23a96abd333fd3167052390a79b8cb11affb7686a5aad19a48abaa516bc3f51293308ccdc3c4fd7e471f43c75cfea041fd23637a398d9479c733681d9b6eff84d8828a5d69486524a29a594bba2fb4134698d31e6b8a26a9bfbe419d143ddb6bba71b4e27d2a68568ed64d442335ad7dd36dad04aa2fac1f003cfe6ba18afe8443d5c9d23d26c1aca90d1838c1aa19f5beb963a5327a3279411b98803cf76e888c0049070df042210c307060b189309d775dccc8467f0e9c4e564bb8b62229201c7e9642a9d8872cc4cb7281cedc9d103783466da44d48d5044396642aeb98831461bda1650ddeb974fa777b74fc60f4a7f2472818a8caa756405079e9eaf5451e9317e1ca314f59c9d566560a00fc3e6018ed3bced5ffbfadcec34cd9bdf09a011d2ea8814d25c6b11c79d330cbdfa96364a5e3ec8b21c6ae28f4863834c46b2e492edbb41aea40d3332990cbb75a12d0b8fce2117dbddd30d278edb66a36e8e99766a6f536babd7cf45fe3a830da9921f0c40c8c8738eaa572b6344d1356a0161364d47d93cba75d2b2155d40435b689b81b5d6daea3dbd356babf7f4d66ab756abf7f4d6b62d0bfac5a6da87b62c7a508b8052ad66b518f44e7b4fc35e76bd96dade912a9109c77b47d3667446abcdea0f6030f2c1ed96d9ba6bd76e9c96a9ed03c7d45aa1f0d26b28bdcaa4aa4ec13155093e61168c83afb296e91dee1ab08ca6d9e8e0a54b73bdf469998682bb0a4da6c9b4ded17aa7ca344d56655556b380424d62e7a7eda0fd6665f74ead816247c3f9e9eeeeeeeeee596da81bb178cf9fd93fb37f66ffccfe99fd33fb67f6cf0bae1b5dd3c9bd9fd93fb37f66ffccfe99fd33fba7643aa1a0dcebf933fb67f6cfec9fd93fb37f505cbc48b9f733fb67f6cfec9fd93f292915f77afeccfe99fd33fb4765c57f66ffccb63f2cdef367b6fd71efc76b1e4b7a561bea462cde136836d06ca0d940b3816603cd069a0df482eb46d774720f6836d06ca0d940b3816603cd062a994e2828f77a02cd069a0d341b6836d06c2014172f52ee01cd069a0d341b6836504a4ac5bd9e40b3816603cd06525971a0d940b32d108bf7049a6d81dc03f216008518c32662e4a54f1825a24d4d6b19b5b09bce202fbd4e1c6d4e20dbdcb696719bae5a63f6c84cf6d2b923ddecba96b18b8542af6e0891972e0a47a42177dedb32de1749345392405e88d2a4393e9927272de3097fdd7a75cc150ee18273f682563bba5e4be2489dd78eec99853d309f58bf5a12d66ab55a2de91393cdb4d7ebf57abd5aad56abd512ddce744239cd82644bd6b8c21e984f2c0cc3300c5d2e97cbe5ead84be2bc5eafd74be725772a9dcd66b359188661e872b95caed7ebf57abd4c5050292661ec89b0e81373856118862e97cbe572756c16245bb246ba6418866118ba5c2e97cbd5b18e75ac6331548b29baac0d4ed479d51086611886aed0e572b95cb127c2a24f6c7618866118ba5c2e97cb05e36b29d5c0b2d882097be552a9dc51a87ba34dc4893af115650cc3300c592e8c958133ab41a57247a1eeb5d6caee8cfaacd239eb399b73361ac2958ed330d22527e325873d30e9dc32b4fb404b3f1c0a83a93e24aa217a0a2302859db48c5af42322b488b6ad65ac5c6480106e141bc560408e455738933830ab81301c8bae50e2d0aa552dbac2d9a495d6982b86934e1a5d3d5d4a29619e256914bbd1594a297906911bc873ffa82dbb7b76a4b15ded34648fa468249cd735b4475234d3dfd1a3289a5f70f1f493b019290a725c415b31c618233572518a40758c31c618e36c28eecf586b8cb1866e0105b08831c61863a4536815a5522d5eb0888a1e551126ca881ea3a8868b6f25417a8e502d711c58c529f1cbcde1461af483cb518e50783cad41351b6fd8c0691c191344ca549d1b55677bd19cd8512a868f1f88818f0e932af627702877c6a2a0746c1de97befbdf1933120a0cc3967bb58b0c1ba8667189132f6b623f956c925dfde2e9e7eb20291517fc0a896f8c807176c5777b541792bebc18df52bb8039581c9181709902b1aed7ae9aa47549b19aacdb31c31bf6c384484491c11421389a049822609254e52a064043d29782205b1951100212283273c139141159e9d6b6cafbd27e524828b2e418f46dcee8fb26c09c4c8cb94979204a343803441890421e56c96e084f18c9397dec9d34b182fe90c0693992d333333333333333333cb1a729c16524a39839c9d001a324a10d80fdcdcb78d6d4754a4d1d4d341493bd288cb1edd36333793947826e94855fc00c7524a296527a72c3299b6536fc741bb7b5a66772d6efb0c30485502d8a3e0f9b3dfca54abcd39e79c936b5a882c3033b34b0bfdaaa7b965d956422a1c8c2e254a19bd60ee98992f33a35819dadd26a793c98909a5e4e2a2482f4629a25407835309ad6c2cd635af7eb465baf40a9285d842c7cc2db0a01a9d1041b31ddfaef02ebf69f687fd389d78a8c46c190b8292a19901000040005316002028140c88440271204722494ae30314000a6e8e426c4c4a16c7025914a5380cc218c3084080180008010a1499a92902014a448f118c931dc7cf7e8c1c85b66d77dbbbf324c8131646ca8dc51166d409c43bf800de9b5219030961805ec0716904860c23648428f99105bce3eead663f43433b3b167214ff08595fff49d00867aaac74b4da0728ca2253f7c0e035aecf6142ad3143b35c7b20b0be6ff98ea0487e891a01502746998f6cd52ecb8ac891b6d9d91f3bdd7cc8397af52232a090b44b69f6cb526fa7c4a76e77fa0b6e618d4d074a6ea27c3599c3fd85350de27ec4d2d5ea86c430e85feedc7685bfb5b8b6cded93a5c2bb264ed4da70d3217d7f4212652139bf9f022f576f1ed7c205b93d48fc3accf411d92cef04fe34c6f7f7809badb6e3fd80ff4807011678fd7e56b9221c3d4df03e6fba772ef80930f108b6eacae6d0cfc965ac4d80d715d8688500e3f89f9231120c3e59361970bd8416a53775017798d08977362c3c8d390da7973b5f11a8e645b8eadf7dc71f86d9028259fe1f9c413237b60f11940c90957205eab98ef4450984cc1e9498494990c0bd99639348da18a18b9e959ed9ec852b067c7b4445979abf6da0b14e62205bf69b82435051a315de042995fc4ec09f872077555096e76d3ade58362cb3b626fadaea823600ddda6d7eeb968124e33308be51b51cb72a9d30e037372503b9f7e849b06e57a4fe8773f255035c42bf79670cf931b077140438e100bc3bc05efce681ff116bd79933c087c233a1b29e006ae881880a23263da69902e970a74743d92abf2cdb260c1d8b7a7ecdd8de911ce8d7a02c5ff4f5818049d6c36d73c13f5eb8017cb62c9e1e3433b964741907ed86f30d362b3ac0cb0df1b71ab1461b7340fb3fc7a341a9a44f087aa92d4505cfc8fa82935e574f7a800c2b426b8c63058a910fa2d4a8e4b2fecf488531fdb49eb334df85edbc8fbce2a5db36c40eb76dc9c36e023f6e7ee038a84002afce0c2b3726a99e2be882125e6bfdb214d4f366258218e2487b4758939fe1b6e2664ff2a455e3d8acfef1c62f7a7c03d3ff021a7428de133331c082b91a8a70847b2bc7b6482516c36830055b32df65f6b8df65b4b10f3202148e26746fdb8d3714138859f1592754772fe910a5948b74c2cf880f7561e52e427f46bb5714b1869aa2c9c704c49094468fd847b6bb08b94b0a4b22b4178e1adec61634a1a4e2ca48396ae66cfb38165fc30be52cc201d6ffeb094142534372bf44ec36326fa508218513d226420347ebe95bd77b264745e8b1ccc952df331a07264f883d5a61e9f54056b11177e2cde32a57ad6c4000630cdb8491e0c3c22bd944b73572388a859059805a057eb68392dde65174fed4c028b1d3d4ad72028dfaf2894697f4dbde797dc1be6efff575e6f5754bea75b1a3f75492b81b4fbbd097a8351d4fdbababd754dff07748cdb8b84dbde1fe68db44a50c452101bd3fe87ff1f71d39a30613b31ac898aa1ab4a3178e39d5a248342f79b363bd0097c585af434e90cc5fbd5c8f06c80b595e46118c757ed8188cc7a72799fe394e22bcb339311aa570739a62a2f48218e9047168884cc3dbc4853bdce320a27b785c29499d9dcb0ab4ca805d8c1f0b0d8d99f3a4d6e02225ab44817ca683a120ec58197bfd208797831830d406cd5569c15c0e0e6d824a863ecb91d054c2e3864ab6a16e2976124f068b6ef3ed0ed10fee4ad2225b55e3c6cae4729ec3a44628f6310a815c42d6c45832a11e2f2f6ce6e5a83d26e5dd0bf9fa7bfa23ead775408c6e1dc96d6f48a0f95e4ced6978686b84bc5b7fc0eb139a3dae2a349cf191202d6d22924233d6b0a5e73f9363241ee2762d01c63d91246c98334a9100b6d8f9a8e382dc92603b1253e1dc22134916c81715c41519ac5fd381de4cc0f7f087c37643d5da1eeecbbaf3f456dd0780e6751f50c876797efdfcb537e38d3d02160ae5dd870ae1052358ddc97e7fe836564a34a1985b564dad9a735eb8341eaa1bb710496ad8d10aea42b38aba1eca4dc0a951edd75f4c851371f5242939ee8702a186b980277831c218a36090fe52376de6ece30e194e280ee94d4db95c9cc9af254af37be2f67d0d7857b5db7709452a467432e1ac9b320298c4589af05cdb0a421e4caa45913228fa2e2b8fa3932d3888fba0e6e1fb0ebb6bac339a312ff5e33296e232f255975a1aaa45934fb37352c8abc051daf82c45ce9c2318d0a634b77c4f38691e11f051bbf20d3f01c254901c4b724bb316e3f2ec41e8483c6b5971380508e4552fa84591e06400cba7910c5be600a50a1183a363531051c02378fadf76cb7d78eec12808d3a1634fff4b687a31c8a7ff35c0240d140c128138bfc4e613031dc7b550af807748fa9fbcf693e12a6f319d65c7d9ca196abc3006e16f51ffd33bfe6500a5f8cd45264be924d311820a406d3bf667e38e68ddad952af704065f294a04dca84a196e68252d6e8c52d0378828858033503db5a2c4418371c7b9e11be80d84f7200485e2598b63323c6305a54dad8fdfb30c3a0e36b53e7ecf32e838c01aa2f267717f4e586d44e1adcc90cc18743bc4647dfb3363d0ed1093f5edcf8c41b7231d8d27072c597ce1a5ca00cf00620d85999dcb049c79154a4cf61f3f33667a1c706b32dc1061232de35b1910cf32e838d8d4faf83dcba0e3803502c60f20e8461f8c3c0388351466762e1370e65528589b7936823bdfca80e86b468cc52686e3470aa0624d0ea1795f9ab6a386902b0ba70892efe7f208272daad19ae0fbcccb217343fd30017e63ee4387413df1a20f7f5872f73f4fcc5206c6eb20a24ed999cd39299cb992524df6d7af33265d0735d95fbfce98741d882a59e9bbbabe37542da2f176a610674cba3a68b2bffa9d31e9eaa0c9feea77c6a4ab83af46c70b2aaebea2a5648877204295e2cc957312ae7125a526d7afdf9946ba0ebc6a1cafa0b8512de2ed4c88ce98741dd4647ffd3a63d275205581a31714f4440f66de8108558a3357ce49b8c69514ae9abe1b85336f6742d42b33e6a246d3d10707d0b14a86d8be9e6dab434bc18971ee92991934d9f6deead312f245911bf9ae64399d1b8b430bf13fe421f2d7dd17c28d311834fdedada92c75c2c7f1d205c4e81a2099f8dbe025edbbe70488ef14d91338f0bd33491456e8c4108af407046e96eca0c55f4886c00414b7c506819dd633d33c2dc8ca81089a2d868884442a5bb0e0365735ee0c63bfb75acd8b6b50fd61f68857a69a0423acdd13c09cd68f98e59612dce25aae91f45c556e7fd034e5764d9954ace6b56a8d437c93aa1f06ccff14ed09d0c3b2672f136c4843f3cbe278ded656697ada86892bbf0edf79bbb609187049e3dfecc2bfbcb43f60ffeafd06e9a81242b4b6c3fa375d9749319e679e1c743c30d86fec70f63a351cfbb5ee03c496e7e8a0423be8441f5d36c9fd93ba2a633110b27b88bdca48b0461b349517b8e37c6522406b2d0b0482e4cec24a093d510e412280f82b95e5f94b0b1c230b8c29108ce3b486a952a9373e7faa5b0da79eebec85859d01a083607b79fdbf104a779a777d7d2f7518ed29187bc37e6358ae86b028fb0ad31f7e2fbc78050b9401566fa4a5fdcf6122b37f1bf6497daca650c51ed9011a5bfa437a15c0e8366a93a5522a63b3a15c8e94cad86cf3d865e4f2b01c5a731316e9151ade287d95776c28e64008134d803ac4cc9c98e8b2d6bbb56a0334564e0979ef558ab44c71cdb28fa59d26da2377aaca6fff4128bc69def5eeb7c471745c1aaa3de9effbc88706d836821db5df2192c9aa1f63b8befe4b3b894614ecec3094d6b5caa2d66c852bd1ff7243003089148b2aa885bededbca96f60d1b01d7b8ce68cf7b4eaed836812aafa6a29c068340e24a64e36a2c4bf5ec055319bd03585e311989ce7cf8d9fc7794b9ea543cc7ac247f63cf6e5a99d33750fdbf09115623525d57df4b1c4741a96bff8152bcd39465db448a4c6138cbd783ff8eb38cd6b93388b5ec68495ec209479d7a09e7ac519767ead99962661b382f46606e0a581681d5875ad0ddbe252f5eb59ff25eee317f6909202f41630757d57af634fab602d4e695d8012611d753861e1df2c882841920b6bfe6e02e54bff28dfa19ae8b4d08ebdf49e67b756d3f908aee9a7f7dfa2c713c2a5372db6198db820c473758cb9df134f25e0c25f41b48ea71771657c86dff9609ce7111490ba5b827d73112a2a9202544ef35ef6b1e9d177188d5a93954337ffdcca79ffbdba0e847d0c3264eebabe668ad6f6e33b54e08403750748bf72c5463163e105bff4efd64cf325207b951c7e76925591a2b4762d2798cf4f4ebd9fa2de904a2910db6535da4de0a68786f03e387ea5c22b25d8b11bfd5ae00df5fc54626b11341730212a34599ec15c949a9f3de18a037d4feaa3ef1aeb143b235586780c09ed312e95070d380f4419c15ba289b7e9e293488c6bb01870ab1ccba38ce0e87aa2b78ffb2f92d23783ea9ded109d8e973e3018b4cadfddfac0f4e9a96ef3809b5dc5ad51182726c71dbfdf46a1b0a766684edc63704f21bae6e312d62e4aa648acbd73363a093e6dcd5ff0d02ddcc313b49a866c72f6a27075ffb514badea06120f63edf6b10a4fa30feefd4acaa313d7b4af86108dd6df36a5fac1e20a82837d05a2c9c0be640bb22ff959118c9e64ecdd73786d041e60c9f821363dded59d7dbdfae7456e97a11fc5f92473cce19d6e903fbce13652752f30cb4fb6daecade13e006dee9c825afdda628e6901c126abb0702c24079980b4fba1cc50e876d67bdef7d0c192277cbb234adc321cf70153c5ac0589aef661c5e9ffecc2ee4aa9c5b65e43cdfbc7bcca81b9edcc50c033534416531f76f631f1a786d86b7f41eb7f00abdb6fbdb4bc4d31532a892acc80b3cdc161300b3750c58c277028f3f71ca6f368b00bacea4568e3a702336bb671b8d6495044909e5ac53c44e488ad0c072631a6e23ec34bac9c7f4fb506d91ba2b4b7a09b7cc00be7e7d1abd8ae6d11d31c2b939e6fc521354f3a90a3021742c54f65bc7d66aae3daefaa704186d3a602cb0cffa8fb30a1c0b5d50347d391580b7ac9c2d04bb635d2153804768c99142ff68a9a20909345656cd9a1cb74039d754593796dfcb08c5941c77923f3bb43ac1960c78a75d8574eb734d901d2eb9898f78fd193a1db89c0a17a2fa0c9ec98ea0d280b7b1c6818b48de4fac851aa04c91867e309fd6143ff378c390c48ee3f6db1d029335282d98027ca21b224e5c5204618dc466058df6e03aac97644a54104fd8671a3ce4a4a6f383339b2a32fd5b689350cf81ec1c2184d8ad0822cb3c83402d33061816a49a689b047deee2d236dbf15364438507abee0e5082a9f15f9d026206f605cdb548dc54dd5121c0677bbbfab4f661b75123e526facc77654f5415b5ab46a709f8bf21105788afc0d86e907014c90fc0ecea730d560af8e59e905497468a2db4d1b68bbcaceba8bd5ce298f3071afd20cf1001ee10e1024b40110a6b7301d5821e8d1f18198896fd81c0dcea804b3cd6fd034e3792c198c46ccaac79915f9545a615747baafc2c6860aac73963f5cdc9b888705a20bec737b802e366005e5fed1ac8318ed535377e1607bdbd79ad8358d03d82925489adeaac336153d1168d97e17118ee2825897089cc8897ed7965591f7a3772561280acb75aa71a39d24fd5233a81725f14b41815eb686e0d8887823bfc85f99aea4088fa579daffe943e8b7ba1cc4d3e0f3f578b0d4748029879d8b394b04c88ddb27bc2aa462387242d516e40c3a8d726b749dd26a08a0937edff11020fe0a66e16536fe06119d186aa41eb5adfd25f54c18fa3b31b1adc4b744e0d251d6efceab144e55d779d0f25ae94fc412220a66c102c52bc065be9db60dd5bb2d8a2c32679003734293a7a7a7d141748a7bfaad96ee3921807ac0bca67b956461c723de6dac9d12282752b9dec2c0bc1618600f600359ffd82236f4bf2477249ba376c124ea29a20f2c0128469f0691e6a104d807f2c009fded0311d3d05544edc93088b92875ed9030b029020cd4f272d958f2043719bf2b9ec3e6b01a677c4b9596956ed4fdb5cb3262b301b0f4f0b864f84962b2f504ffaa8985d04eeb96a2fbd6fc5b8cad7e812d31c7a94984bc37906db42487c4a494af9c411c51ca6824b1965c099ba6418c4be46947f0f69604042efa42b530f7fedadb7f35a2f7b856759cb054f4c02f2a9df0d4c439c1b22db18479ea7b8b80966dce11ef010c03ddcd0bd6704904b3f4a508323b3081577819b9468a5828fa413e2ed8d09536804049115580dd888944084613e9bb12a51d29d24678c7fd050157242174b48cb8bac3ce437347c85c895ea53d050a8f8d5df60a996582959b2284feb37e48afeb83c285a0816f2bb31bdcaa2fe25f33c804bd1edc6cb1571344b8469051d07758e8d3a5de8e0bd1a983d5c1d4e671a15ca12da010735157ff5f59879f04ed2c2c1ec191f593eeb435d824c26d52d679580606972ab5ade0b156a78e2d1770f032b69063ccf0b2c2510667dedf5f45393999590e7ebdc3e955f80d38e736d3c13fc720f9f7274fbe0a02a360a603da14df73ebf1a5c3c973eb5cc805f3f454ee21c5fd417695ce933b8ef10b0aee14df28c0f085b468cd7bae3044d19f589ea51746e475bf50a82e03d07e0e3f8e9d3802c763c410fb147dabe8649dbfd7dd24c46182b50f130c6e640d6c46a77c925488ed27a37c66322062120820c0255e5b3054a2526212590ff5bf63daa2d3f65141190cd025edc051ac3553cdfa5029a5b6efb6f5f8a619d249b84e6a7704b833b238a13fd302539d8a6f8bd8371f6365392d49a65c5539db8353be24f02ecf13d0a211d1aeb381eb372670543451147221c3e00e60ed1806d47868483231cf98048a9a6add3d45c8c2e409e64ed4e6d7e0358dc3e9134c36032977a24fe3c7a6b0d022d38291489876d233a872b574ba921d40d7c73c3c446fc4fc4a6336b63a8be85e9db0dd53f4a7956225f5b493e95c8c5e22a9c9886c25fca8e0f822e86ae8da334ac60efda312c068588765fc74806111c6d84c9e3ebe3c300b2d78feb9864617695f761c53b997d1f67e71ead4d15029ec0d25eaa2a12576afea879ec7ca40311efd24924eb27b2d31bfa4cb608f8201ddaa430a1b51aac578ceb64d8240a44ead66b78a9779dfd0cfe0afe1d7c0cafa35ea1b5b29b542c41c1d4f3085328a565c970679fd8d2c58dcc3df414b7388ef4c4fd2aa82c5199ff65feb9604032d20a4515fd3ec7ca6935f3533a3ed1082d5da5ffbfc3a78dac78916241660067d125963bbe050ae8cae3c6d83a78cb68405a58b54d4c1f92112b44f4e8498d221ed57b204c99ad0effc47efce413a82cb9068dc5308c01bb48202c44a13103258ad98b384aa2aa19f6c11ea40a2e10c72a016fd518748347cca12f86b0945d3b3ac41bf955034fdcb1af04b89a1200817199dee950d7ae0366bad8050cc80e3e4c23dea10133dc47534e59b993560298739e183c2f625df4010046e8af325ea7a0e5c36e82b888bc6a75c83be83a8483cca36e83b888bc4a36c03be82b0483cca36e02b088bc4a36c03be82b0483caa6c09820763c70ba41b3fc2825231bbb101962aabc28f940fd65d3f9742c02fb7e825381c445553c5edddda4a3bd312ef20342c540c3909751c9c96f80c38c405acd991a7f9171ea68553d5c8b084a0aa5477c27122a2f27a001afd7474f3bbbe3aae5a313a294413bc19bd46272757a53266aece009d6a030405ad1adede116ca32637fddb5be1023986ef98521f8a1e85c2b4742f00ea86450c52e9f3e006e9df9501f0eedc26d6fe9d7dd7c0dbabb1db26862d16cb44097460e1fa953765ef06f6ba5be22c76247bff33aa338d2e1ad5b9a0b229735029499c4755de837cdcea7f8f13d430163f8c2a79b3f3c0f5b8ca8675f67945fb15cdfecc231c6cb12abd0c3da0aabbb6bcadaa2c5d5128ab0e75c7d9986e39406b073cbd6a8c80820fe123684c5a7aa7389daebf50e35b01a72bcbc0d76b52a141422c000ae1f0c2f1a7bee38564ea483086e2d37baffb484d814b5dc9e86a31beb704967e32dc5e66321ad82fb9b9712f12a2fd62ce5b06628e91101806d78035a7d393df7e924b0f7b82a45a8d6f3c007e93c115627b2b89a78dd94b692666fe62f776ef0f7a88eb204423c9a6e3503909d819a8bfaffb0baac1712d2b427ec9c88abe32342bd0458790cac4e02cc1da3ff022ab2b37e959817dc31ffe62b3caba40b49108816f6fb29075602f37af2a164ff2b0f0dba109738305843fdc3e1f60f3e5a5a913e6a4240f839ba883264b318005b3948ad900d9ccecfca4160f9c322e7033456f63dc9a2fec3af6cf8d4f0b47d884d661ae517376ced9746fae7be832477fe72ad10136983bd04d455f800163d2d39085340d0bbebf9bc0c7e61a6b7aa0119c24fcb5f59c3406577a70f01e9fdf9fe3becf69db73d1790e53e7eca930614a8cb9c3ca8f173acca084e3a243f265fc380aa485781af9f46f1fdae74d9f295487050468943a64e4454bf0364ed24bfc71e252f33cdfaa4843c58722c39120c1cdb6152ec9753f08d97c31de248a867345d53599b862d6423c22d0325068062197bbff3b29297ab95f5046ec923fcdbe10307d4440a467ad09adfa83a480a06bedea1855be448f672e6d70938345eb2f598e5a42e4c7ef694396badfb337e695c7affcdf59afef75ae0f8756a237f3ae4da0d6a8d06e27f0eabd1f28a8afa3f01e28aedf765e32db1086e827487d773c99d0ee5bbaa2c858dc10b8dab2558d22d2ed160d5bc9d621026aada2c3ec04ce7224644c653c49f433788b04ab651f3b8b58823357de67d3f3d614f691b19cc4d1220fed2196e686ab664ba3222400a934c87be74c62559225812b7a2876f15620e4ca149000bd2c66729609130e51b7c285ab65318feaa2fc530f1aa80032fc7078cc695beebbd8576213088c4e118b84cfc30748ca750ce82c0620c51457356b7c5d17a2a949658d6a87889598345dffabc4533bac8d8e2b6711a55678649b4253175ca44cbc1a9286177373a6f0e6cd78363df3c2fea28932c1c7e7250e7c75f24b12e48113468d11e1143168069593ae6fab39fc03472c7a9e8782467925fd2e939c70ea600d47e2850802409751ee26ed9504a79770c1e7f7868117bcb044ca3f3c3b8584d90d6434de5eabe4fee90dda210e30cf2660704d4d781517e1876db350ba78f34bf8686810c07eea5bd148e9f414f979208107b2f1bdc438aaa4a2f25aa5792605c3d24263ac7b412e0c7ab9233b602c10562c341387cfaba96adc6a60210ed4673b30d1ef80f32f46d7bbfe0541eded86919f17f8b032947f5329dfe017c100e0fcb6fcb2632a8295f9d60629524194e619d1df24a0e8e2a0052a38c7090861b901a48e4f3ddb89d368fb03f1f494f773cf4e671f8123042bd6fd836e210d3b7d4687c853ae5ba812656adda2a0c713d2a4e29054b6c3079e5661e63d4d2d2f232d8f69fe665f33e1541da8c47148b090119f0a416803c648e93d7246ea2acc89910c77f3d5a391dbcb612ecbf82993ac2484f6a667d323764553b0d509e73e3cb9a1a122822f23668582fada1ae5f78de31eb2b4ae53560d948886bbb601581ed54c332c520de4b0936a96dd461acb02d7fe245bb038e72231b59c9df74967748787fb72aab6a09fc3ded95492e7af891ea922acea134a5e9b3931713ea7ffa1c12a4118d3e2602f44cc5837679492bd4aab2e5d0db5c6a0d28c85801e0ccfd09eed839d8855b8ceca5ba0b5e450b31263e8e667927750f3ef8a24a5d9eaf0a4e2b07c01f42e84c8a40f2c2d33011c9683464570a0c89fe6f49ded43fb2c7224e75c91666ae24d78f1e1fff92451f57588e9dc68c6f370b255aa72fc51c0b6a6bf4013a4287648a12a818df144e7ecbff957a8ca04b2074042fe85fb4f374aa14c263078746334b001980e412e4f695598c2122d800f391ac0455d1b208eb7909430e0a06b2906144ae38c9e8f00d6707ff8d98a11b12800c001acc2ed8d5cf2ee552c3ab3f166de6687f448fbac4946e20650225e26a34f461537255c022462b99abc7773f2d27b683e3495b1ced299c0176493f3f5d8f5e81304451407dc60ddb5c4504176c4b415534d6905e1ea4c771a521276b780bd2daf1791d7803afb5b822697d1c212a093349b0f780416a956085285b7f3b4a422b204cdd29dd9ccee0cd09da036830b10e5be1f5f674143afc4738fa3078b90963c31d541276d06a6840297a58958c263ce4633bff1406aff4f0bea3507f34d1fe9af8f53172a90a0f8a2b14dc1817019026ceb4baf32129fdf97517cf5a712d0857d222cef930dbaf774df78f1daf8b2505d2bc3e0385eb8a62cd665f0c19e41a04673dc9b3bc70f29bbdd9867764455f258da4cdf0fe82a616c910435da234a0c410339b278387a9781ad60d40eebb029acfeb97a26e5bef9f3acde8feb001dcb6788f046cbd4364c9138b52a9791fdd55afee151a37474d5e05532614aa52e950db39434731de48f9e853eded2cbc30963ed58e83dcb47c39c61a20ecd643cb3297e2633432ce6431f4599c1d0d1be1e3779f3c13f78535ea07514892eb0eb9f34196f90a164387ca4891209ebcce202381a903db261032603ef3040ed40a811128042bda7a62d9f812f971a852a3870737f062daf717c5c457bf003b20321a6a67187d9ea58489c07b85d01d6d4689c189b1d3d3130bdc2e159e6ed1e02410794dbe6e119f9a8107d6b0a2d3c6e6cf1af85b3427661bd00a1b99cbd680dbeefb09a1f8a1b45e824883c5de2e08a5bd143454accd975453a51678b0705ec838f8cbd87aa098ccf7872b887074330877ed59a67a683e5e44919e8ce7ab73dd94d6337f29f5680c2c0865a95318372488f8f9e5a1e2d2efb572153b28c928d7fc1791a40f780341f6dbaae3da667e16ffe6451bc5d0a5c0bad3097671b893aa8b00d1aac7dd2ec7c82c8efee1630b7c9b721871896b1fa302e9e1666c95a56b30c3568016efa5f766810c9461cc0448596f4774607658e702cade6437271cf236dee0afdaea952d5ee39d22ba6109b359f4366701f25801fc834b52394b20916c37465401e8b3b126204d8b3706aa995019230684f00c2e28eaf06c4968b584c57da11a050923bbf6fee016e22a813a9fe3368172c28ed9cbc990b394a3753b52206557a7004aaa613d5a7600f85505a40456275a119915518e6816fe30f59ba6b358455bd84db3ef86417157360ac62454b3c96cf8c333e4d0a7a7cdcf434d058a97885be16ab178e318dda22a7b388b4b8941016c768d5a2a233389de362918d59666068320f32bbc10a5105e00b504cb1daebb680e87a2e9d418c6d4ac514a86147736289a9c77c775526e02f27173958695d65f731e6b683955847261dc54d4a47d0c408f825da72cc4fb92eaf2fc6c3bc5d1ba31ecffec89d78da8c41b63a1a76d9ac298c707c85bba7980b933761e3a391ae9114592faa99bd84a2a25c529a3856c71e23f4164126b9e1872e3ea81da8993e72ca5d1a586e0637f61cb23f5dc74323c656f7129d107ba87964b5dd8280f510adc8812eccf6cfd7364c392f7e77597b0d21fda29f423f11787d6bd3625159498fa0cd0fd0f881ecc052fa8357853857902e8453b6d5a363a37441c54623ccc5e169a27a76d4518b8d8e949549c74176235ad840a134ccdcdb71170c67c7d3f9e156d050935f23fddbc7b9cbb89b91f81cc4f73e2e58e866fc615d3281b41de513b6f2136fbf427d0ab76f9c5dac93d8ea1d2f0c57582d65826dc578b64b5dd3aef83047a51b57c7ef2cc9b167e23b2eac7854f37b9d4313693e559f43d409968bdd6b5b633bd54cacad5b34fbaaf1a739747ecdbc860c454082694d5ebac4bd4b0aa0cf0f8af90e2dd4fc09201247b92a56f9ebc4d67254cf92aa4756e3fdb89c305b75cea2c65d19302d597001e029e14a10cedc26d44f8eabdb9b02d97058b77b5f55acd1a468981851ab72608e3d76334745196a9715b92aeb44d19fb87c8749e7ddf824a0db72ae09ffeb601f9c0e3d24122bd3ade8cd1333d09b4f714773bd51dbbd11f2e83d2d7f8a9e0b9769628b0ae27fe5f8043e361b1321b816028fb743dbd1d8122e55df9edd2582a01c4ab3476ae952d2ae332ffb30295dc01930520111c717c9af4864e409aa08ee873b16ed3e815e8d90dbffc85d0b96352e2baeda7c217bd89829a5a45e7d73f83e2368656bbfd13b80ceeddbddc4c08611bb28f34e07540b92c4f9821d36523f146152c1985eb2e69497aeef03ff2e38e553abdb2be1ce7db1f611b58d93ac55671cf715854e6eda85469d93e19a78d4710caeeb7529f25c57627000f9e8b266164ff44343f6c51bf081d75e3047efd6f267ffa68dba400c7e7a590ae8bfd2ff147957149f86ee3b0edabdd6ab236b80ede9b0f15a6e0fb1ca3534ae41b0a26d6d861c6b065ce40d52fd87b01099ea707866053fedcfc12ab8d765be84c10cfe80bf4370131a2454ffe6d2df2861cb1eb6829c4d70beb3527736df7509cf89a04afea7d08f9788d7495a240cabfd57712db9e4e529c68a505149602b91291e31c8c08435f0fa10cdd1442db9067960f285edfc9f026bbf3f071988cb31b510194b741eae841c43c97f6895c4ce1b670953b6361d16158d5be531e354165aceb46c9c7bb635f23bf36e58228efaa909937c38dd1affa6cff51d8beffe4de49654120c5a54e7e300b4eef46966252ad1e0b0700033b01d05988523885df9ca68682b7c911ae70cdc6a0db0ecac9768245218f654e24aae480635fe31fe25a056cb2d91fa147fe07e82ae305a6c172ac2fd7e472f92d51bd41082501b2eb43e37d4adc18fc46c20fd298876b7c47d7551ffe9b4b1e8aa733e58f77bbb144bae2026ccfe7f453630fa1103f6600da090aebe453307192fe70a4f4634b11b5d17563c8fb906f2cc325d18934a2769f18b922205f056d0bd10b06483cf6f708b32f635b7c17197e7cd6f4fd19fae5e4ef2a3dd724fbdff66091c89bb9171cfa00b75274aec2918a04b6786cde71069e179a9591acecd0b7fd5bfdccbd4029028e2f85fa4ce8a2c70345f2705925701fc022ca1471a511b4504752ec1876083f3c4d411255914cc92b88f21cbc692715fa3f477c1a9f83a8950a4237d96a87b2b8c779604ee3ebd48d97bc82539a011ff127736ab01de4b85c948bc5b44c50dc84f7eb6ab3d4079efa56a572577f06247d084935dc294df5c5514f662e4a8e1b8e06e8e6f4a90dde3cb2ab7a6a8414d080715c796fbed7f41f631b081894f5b765a2e297480f09e79b17f9fd5b76ae530a3bca72a8b7163e79aef41476b0cbe36cce6c80bb29dd8482f86f255c79320ba1fda1e1bcceee26e3dbce66d807b50374e2adb58305ee8a183848035831fb21aaa400be5303808041e0707a60d520ae859821cb03dbd4749db095e20250dd7476b25b0c1e5b616a3769a7caf6cb83c0b53aac5a28a9b4ca530fd110e078ab45f3bae1608661d7a0b3398781d4f5a6e4ae30e1da694ab36748bd960a2fdeee5a148e0af12c7d6574bdd8a01492b9353b130dde3ebe608504b04246c8e4d2a0a9867c40aa7dce92ee9436fb76a1151d734640d34f877fb183e96dac0651aa518193293edd707bcf92b5cdea2cec32c6c94a312cdfaadf36773e8a6ae4280d50748557456ff17f31e4fac4299b8fa3550138af425c780b616e6dab3c5917f76fbe5819ea74bac3c77c9590ea4623848ace973b04f4d4a5e01b3cfc890166df3fb35745cd0031425283da6c53be8db7ad972dd8e20015f988ca7d03b90fa16fb67b684257c7f815436b64e57853c6f9d7e90caaf7c3f93fb657c17996ab5b72491fb63845684a67864349542cb0f4b89095645ccd5399553f050cfd19b910e0759ad4bc520ee2e90087891e2befe8815b0350ec931bb1c9c7b4fd4fd01a3dd61869f9ccb95a861e1421bb5767960f24345861ec8509b5becfe63e3c829e0ab2b7fb55847337e168b23d0faae27239c55b8b7491d3ccef322f1e6e9e064a707ac7e84bbd391f633ae8cff2c5d152078d673e330448f6e01bd54c6d8e1aa8f16adc8cfc7f584962e60375bf6eb919e62d21d6d56bd23b48e36509d76a58a1d0d7d54464de2e8493f043a9b9549a9b55c56a29165da519b8c71ef78ed531aa1a2e90be9a05512c499b880afd5c7ec4b695d8c7cf147cb86a683528d5b2e293061a4235bc1220ad2ec987ad72ebd214b751b48a62d7107648133b8c2f575f63f8d96e8522f8ab459bd2b62403dbf25d0c3b3311dfc55952274901d0759b862dc1f0090f1eafb6ef07db6aaa2c34abded1c00a0f39e609e86ef0500cad57a77681ec0063d999ce11206f9e500ecbf2241eb8335cf4a440368865df3ea6c92316e67e1cb3fa6121904301a49549d09017859b950f4f298acaa8fa781be556bd285c089a5cd01964118910291d0a38df8012885600d70ba414b0a898c42c0b4eefeacba7cc44f84a12dd60e109267c32ed040c6782a40ed02e345376823d7851e0076031a8ffa0088d92b41002632b4b91b2f699db78fc6565773b6b569db11e1161873cea38bd9a9ea416248ff9c7571c45dbd8b9cb4b55a69864934051ac100b55b791f9270256da3a593e4ba21745f7e43882dbce6144ef5f7cad15c254b5849c1348d8e16cd02c07ff38f60df18f86910fc1126a5ea0ed12d6e3f4311a6c5fa3ca2fee3df50f27f625ae254f2bd3f5490dc73615853c9be8bb092f0d0f888962d59a7e2e939980eb4b2ef4459042c4fbed1d43401e2baa7f95f2a5f5a08ede72f70da5d305c7455e984eca872e74ba0120d7e670be92db15d6a62841abcf842993e3e0630617d7c4e0fc016e81952eed3203083809ee962df03ca64b75e41da5a332e907e39b5262b177bf64faac97e008cce740fb29c9d12444cb349c1fac97f6a1443175109f0d03534542ef35ca693dcf739d103e6093c87277cf94cf017fb6822ff021c7a6910149653c2647b7e9b68ba75642ef415169683196890370e32529c31a5f6d7536118e516a12edea07f1a8f6bdca9bb25cf40220d64cdca211d812faa907115800994c5b04dd72449d3bb526a1b860524aefb439b8088a1530681be6dece61e32179bb393b14dabdedeae6ae15e3475241b7dae1a9479d94f87aabd7fcbf1dc3d9ea0469f7c704e67ca5a5f6659663e3778355f7185e2cc50f859925f93734a9c9f5f701e72cc6210a2bab5119ac52bab387c5b6d67862d07000c9b2cf3346cdbef8d2503f281cd1e061dc46164878222a8a705d46ba91426f90b2ff467aa1a748b949b4613d0b7c6c79063dca1f7aaef99139492e974018cc2b4deab0db3e0d5e469dc6bf2689759df79a46d28d727a5c54a9c95207f6c88d29896e0ecef80ca1a091f9054dea1b352f05b6286b22a49a8c84cb19247476cbda53e6d25c598d39ebd29279cdb3dbd5a5528c5fba44825c47057a5e085138c7953997e61a3a4b8fdbb177b116badd75da520a717b2049069f913983f3e4c32cd4e9dd059ab1c97b410e184364ed665ef3d842a20cd3dbd7dbd3edfbae6d5902a31c574ac355f402312182d45c877fa1fe995d640e5e888b9a4e3cd467818c628f9cca81e0dc8d7fed0ec4e860ddfc190121b21d9c3ea1ed7bf1d1adb79ec2652e2daa19f954470ed21cde7aa815078e548aba6c9f68c2fc31f5d7cfcf152c053bb1d3769d2970ddaa6ca46e4467e4d0c7112bbcea0f45e299c61d90172827273cb8df348f0f442e0702251c7d4fab65e1dc5b6d1badb30a47f05b6046a2b1b09495dd579754caaca3e1d33616d55c306993a84ee20e868a3dc3cadf3bbc93488ce9e8b7201a7d11c8beb19dd97d507f8b4e4c6c7fb88d9388db9df92b2ffcfdc99457e0dec5224c792261e40cbb04238e906c009426ab11767fd46229ca0b5e7971f4b92e63707ee0a64507af23e856b93a6400b39e41fde3b909cd864b899801092131191c11130497aa2169335d570ecdeacc1c169794cd11862048b6a8c0563d4014010a623da50037a61501a123f5804d296ff087b98554b5b7f697a6e5491d19e2b690bd1ce05519861a499e2296df5687a466d39b140baa43a02111c000625defce31b858a4b8caa57a0e1cc103e74e0568d92636ef31a8f05a2b0af54a1650520bc56a3b006a6e2e788f79d61d98e05b3b98fa406a8eec35a7d981c853ea68bd1b84c2fa55c38c510dcfa8ad4d7945244d008acf829bb99f03709ca6a1ded6080841464cdce15ebbf563b458ab028b4f473eb4e7c424ac97540bfb456634414fd5e73706ce22db2c10ace789c032d036ebb88b79cf62ba55be71050d6878a6a3b354ab270dd6c724ab3f0565ada4443f51d204d89b18816733b057ae07182681229785b88ca6bfead6e8133b144c6e8af36c467eb7f090a29b6d9d36d6314ef43d540e0dfebbc18a46df248ad57a9d752a6ef84ab34e32aa7732d93849c5eb73a0f9e52cc56c7338b0255f10ed8dd2953edb1ade6e2731091313b47bfa87728c8dcd50508773234e072d09df6b69dfcdd58eb964486cee74da14e5cb59c07c1c9cdc146d78278bdce16d6268f17e7c376a7122e5c321fea1b3779501d1d14cdf96fc9135bdb5611d761da5c324285a21a74092287629391baa46a616b1eb81a831412a1062bc28d28ea22e428b7d168cf2f3fbaff089c205e92d840c5d16faa5cbb590860d389d08b8614207bd5e742456740b81819a27ef706c9a31438dfe1a618618dbc68120e4fa9c168ec0917093a780e9bb4a423c209c80d5a35045c8a5f155a01dbc8b8d695218114f9387ad5075ee6bbd69e45fc09047846442064f5c11d6b474a5c2fd5a3a8f96d73df19a5f7bedefe8ee2150395565bec52a897b8aaf43a9cd397dd8d442d1ed0f66d7a09d8d95b322e24271a43882a748c7c8b86ea1f926809554c8b3c961d92bf2c918132720baf2ebaccb244ba753938f46af3730cacca7a64f229c0ea189d2defb52f054e6a6a1f6a8d281db4c7dd037692968d5120d694f2c39ca36235841395a458f57b83ea88bf27e248c730c731f0a859b31610ff3255152946ba56e0907cad883d0142b9078481e289fe6a524d5abe63507402203e7b33e48fdeb3473919a5cc810958c4141a560412e017ee91988271412b530c3471daa5547db54b60e7e22140fc45fc27c75c9b61ee4fce6ff6a1d7c28d55ba833dc2e5c0f456cdc82d87ec8ba2df09dcb13f9b08dcdc850e1fe45515b3d7125b94d61952625ce34beeb335362550075e978d5b3eca89c9c28f0d7a6b0c2b804ab0816d8b3946532b80371611c40a5b4fcb554de9656dadfb2c316958c20f1d6956957461795f7a6b232727cf14b73fe5871cad521261fefdac5ce5fb68f0ce0631fda0c225f2849013e9097e1600ee0b2c1bb2fb0c6562c2c0d9144100d50a03adff1e77bbb62904c8dc072d1a5e30357eeba21a5572b736929589a790f954dd02a314450333429a199696e23b2d4ef4ef15c3614fa6e53ef2c94f7b9555c50f33483b483c503b02898c37ebbb96687921d24172d6482c97d85a287464a84c39788f14af642c456e27325cf1186007674f8328c1170987e73749763e3a91775ebd46e15caac9c9979edc6db0dd8e1f0a08c7295f3394e7ee822641cc12edccfbe6e451a8ffa3c90fe118df231b0c4b4dfdf30902432a2b52582610c29b47c9ebb396c0518f02ae9fd7c8a9f9e9f51423d07b893d4e0e5df8d42d2aa93477b918ac00ac36339fe0d3e932aaa925eda4b772971291f04ac20cc908569c12aea4a6e7e14ce597044f4c56aa0ae857a9ba68b7db87d9f1acf100bf3fe4c94d4991d3b1bf2f7876d4d36ee09c94fa2fdffadc99ca4bc3ac08d28b5c93ec7fc23aa35323498b57f43d039053b9e41d3004044f7898ae0caf78a3ce45ce337d00d220b8479089fd950d22666f6c0a94b168f8085d4614e892a429e79df9d1174942be367d4a9c3a0342c880a510ba8ceaa4e054e6bec3e92d8021cd0a5a5e7b3c1056861358442e645f1416fb46dfc7e416942802445f90fa3e060a1d89c67875764a15f383bfa400ea8893d0d6f8f81fea7492181390e27f296329c9ce513c3089530cf5aa0a93dc205431717bcc477b77556732a74f089b49f878c4408bb0b32e8f9308963be02b0178540c89cb9e4f5e22de3ea7aa9071a27ebaf2fdb539ac3c5d952c10ac9bb36cf1dca2b66b91a38132228d59af4fc371e3533185f179b27920db439ef1a9a7f681c55febf818cdbf864ece05daaeea3874188c576fd225b6c651fff25c2745ab92b0019967b12ed7a190eb1a4e19c355120dbf1f666f7baac2cf504c5f88327cdfe628f27d5f7103a3c327ebb09fa3039ad2beef8773259a0837088421c59625059474dce5d56f2839a7cd5a2e37d8008e089519165d3a94df3efeb215100ec46533eda1c79827e3ce2363b6b3d5424bb264ff84a3de20c465a82dcc69f97a3c3e52927f1d47d583c2481e814dfc0405e8b35d9838a3279e7c79403ba5fd001cee91a6147a28fbd7ab0cf92bfbb23702cd7e66cd8f0605612d32e941ce84f5e3d3fcca56bfd225d1d35cd86e125d2bb7ca8c072615563abf8afceb42465ef381518d6230b0c614134157f69534d62e335d1127c492b12af7a095cd3d4a540bf3e69ef3ed7309c4435e7ddc87314c7d6098128799de872a2d43280e02f40bcb393855dec06a3d685a0805b78967dc21c3ec81d63149a9deb9b1a1ba49d1d03a2faa7eec9f067be68065486330ae750098f23e4a5e89b592d7031d25bb6207133d284b6e6247decb618519390a304412113678a2317c6bf1b31f1b764246ba8a2c0fe76a1c890c2944ad34ebc43512b03e6d59b65e997c80fcceee6160a678dc7e916eaa915806fb732432e556c5044c9f8b24c8521756409348429925858e3f1572bf491945aeb45b0e44b81203933da948b54c9f1f4425b5097c20b5b454a3e3361b88444ec2c59b2912e3809b3c92fb652ac599a6b60124f2db42208d0606c64e4a9df37499d58fde3c463c4415c52a4bd5024cc994e34394e41f2243802bce5463c407a5e3798f940c7ae58d1893543a20bca6fdd78c082bf61877ea383d651b6a87af4e447c54b6787ad132488534a6bf1e1feb9299eacad7259dbdf0c499de451fdf198c4ea840a3811bed596f41a1a8b38d6b2879124eea26c0ad9f858f1e64e4fb2aad1882f8154e1e20cc382bf0592c6147b82c750914b496ea950f16ef394ed4ddc62d37c86187d281bea40b2258b1b83f725f19750fb1024ca9d1133816c92910251329ad85bdbb67fe01798688bdf0f1f9799cfdd60131944efb80e368965dfb9b348d9ea0da1551c62d5f2caa518729bb5f46b8efda829478e548e2f7049428d5e064508809605ec0c056fd411789278b59324e08104411598602aef2f1a4e44107fc01f01f67bc26d915e1b8f0da6fb217140c8f1690073a6458eef99dbabcee89147585d422c69912803a78c21c3a8f2f1ed0b13ff2295ffaf15f33f08b1623f8f12567b30387dc6b301ca7504cc407b2e89cef38691a9df160118e966bf4f31256643b5e2c3044d0b49ada4e3a5cbde61f8bfcc34a9c806cf11d1094264da88a4da6693baf6e019a813468f83b92aed56c00a846d84d3ebdc36d23e82de5985177479f946a0f55860e6a973c91fb2d0fb1500fdd3d31eda45970c508995dbe568c6a13c938b2d3613346a78f1ec8bf8d14b4b59342ded99472b57a588ec13af0d0913316cbd0ec391e3620ff6d1bbcf46b9da657b01c02817e6c3e3e9600562a852e4b4951d86371e4efdfeea5c171b9af2d395cbe4a7a3540a6739f08173e19ea64642850733356c250d087125a7fdb7270f8e40d15889ca1445c8ea72be173c9aa3cf8163a594c95b17368de4aa4e2181ec5feba79e20f6d85aaa42c14ae4058decbbb3056926815498f5f53ef1a72448afb7c0bde0c40b7084d8aefa22b146394d6c058fdda718dcb8355c54a5ba043ca70076c2b0ab4db15854b3715c4a3044af8654b316d46d8183fc75a50d4f250d0e76aaf99764a939faf56326840c62c180d4e9c24e9eb24188a978a1ea951ceebe49829a97a9c80f9e93d2f2dde0fbf659c97304548456e2b90bbbc259833e6034ff47a164ab502157cc118438f6a29443611244c5811c5f78c140e784d41f90abe6e9d84644967a32bc0409b4f4e02a98930ef65037945741838cf46b2c014a5fc7d423ea7d2268aa62ae2e756428c581877600a3db45fb9bb80a19823c1a000daa456435d90ee56dec1f681db209441593cc50f63bfa45e96f53a81807c4f319151989449708f35f00cb50add2d582c07df8b83fe08950e4ebcd28bfd7b64339dea6887c888f8fce9016d95201da405448e30e25b4c9c74e360510227be4b0b819d614b2da249432cb22e143c83222c4bbc08dc3669820afa60e8a6f7707b254e1f7e931913a2e2054dd2b761272d8c9ae52d3a1d1e500633e2ec8cd1135bd03ca77e65395c04b470d73edbb8ec49cc25bcb873123017919b25480327b9824811b32a37917aa09411937a60b9951bf60af2883b54a8eb623e0af8da87ff5029a0dd67c142c5c01f86faeaddc88b72c0af774e947358c53c1675df40d8aea9ef7563835590edcfc602c090cdfbe2b10004642bfea3da6e0d67716a78be49b0fda4e03d6a73b6166cf2dba45136283fc2e794c221029f745abf5724cdcc1c072add6460a9f8a8044caf1422244e918b0ea75bdf6771194030eef3ba5feaed7ec1dfbafd9fc2b69a2cef8c9fa732a73e11638b3a4b35aac044fd9cdb10d609ab29d9213401c432790e9b15fa3ed801c32426d7ead00558f0dd906db151951c34f3bbb157efb11501d214da9712cf7e2826ffe01f0375538b16f07f693a3f3719609a97bb6bdafb600b1ba518b00cf8751abb518fde78906f47245e09e0ae52318f5a83e724eb1073867209fb456bf67e436a948efbd4e01c58cc43cf86ca148671bd3da5d54933d44b6fa9478c3174d210b8a69d26d9b970eb1bda6787aab038c7622c71382e4243c42245b6718b84c09cfbc8bca6da5dfcb909dacb14080870e611b3d51c4ec9513351bf71b03b907efdb35867b78f21bcbd671f830acbd1cf95470c2822b05b78dce4dc530ab692973738e384e3b8e184f3b87a6eabf3baeaabf7baea3f7a7fafbdf67cbf3d067d974d265997c956937999648cd59749464077dc21d011d551ff3fec96186d5b0dd133f326579c5ffc01b34a15bd34e86cd1a5a75b83ce161d5a3a354892e38db327809b4037006f02b8097403f0f43849ec09e026d00dc09b006e021dde93961b5aa834a06a41a105015163ac1a74b6e8d09208be60490037810eef896385160444776ad455a784f062e84b9f2dc1ed4db4aebfe3a840ebbe3452008c0dc1fd3ea18667b8c158c9b59d68a8659b4e3c54be9c599f033bd2ef06e5378e44155683dbdefc9cf2fad9d10d62af6afb83ea5dd7d71f772b06eec61cce7cd1527b61d173c078d013d28f27c0dfcb8821ba4d8079edbffef66119d17bd957efe7bc6f9992a1506942c142eaa0a7e5e973b305720f5bf8e07c5f27a90bb6ce0de8035db10042f4c671cd7c4dd7e6dbfd91790747bd24d6917c5b5d52d03eda3506622b8a574e0ebae63d3b790c12f68d02b79ff487635f383ad68e6305dda8639ee1ca58be4ad07f3bbafed16401794b20924d5cc6097ba7496519fdba50d584df6211b6dd62eebfa88e931fa869b629e7d04f1c9ab6b2af284585094bf6eb7eee65d5dbcbf965bb0c622a50c6b693166a613422b08351a79844019cd372facc47237c451da004bb766f86019551800dbcf986eec20b1858ba44ba7828ff3156025cb77a5f3aca42707e5dd1085f8dad9c5cf8526e0897cf57e2c085d7d074e9d8110b9717def99def106fd0e87befb62b6c8bb1ad75e310098592db0e67c91791c6da0b60448c1d5946f88564d072bad507b458907b3b1e79ca092720cc79178447d0c45ee985fc2442a72d40de649731a5541e14304cb3ae11656e10c95bfaef77df7505d35d6324b7c7b030e737f8d593882da94cb9f8615c5d3b23e81be5c9da5d91d461a0b3017db158779f3a7035596fb2182024b6e95a8bd0793f2e887459e324e4a5eb424c7ff8d1025990d9a47e9f1f744fd9be1ef69fe4339a0c672ce58490958a24f65d81e6b6f8b642de18af57aa0a4aebb067ac36e19800e35f29515162aa08b4590fcf7a6715f314d2d082577671c72b10d74684934dfa9738c948f90a2fe834c82b2bfe564f90d56449849730aea810af3ce9ac88ff8f7281d7f440d754441cab1e4dfd400b0fa28c2985fedbf87e305e07dd7b2382cec708817450529f63cb817ab5eb1dc8cfacb31583ca9fcedf5a79abc5e21f749b578c57445e889122ce06bd6ca45c56dfd21135c54faa587b976c27091b3586fc00a28d6676c36b63cc55782556749c8a053831aa532272d0d33707f146468c72ea51302a17dd6ac2e9d1dc73063a95e47a1b83069917dd0e71d7375573a601512b0c0623d3bd491caf91308a31b548118cee262770c523c140132e96b9a51d81ac138680b5a1b7931053b7451dbc1fd14f1f949bb28d9f5948fd4dda13568d850321daf4a7f6370b068ed13d0b4a62a2b4a2c2a6d7725b83bf3d73934d954145af84054b9edc3a1620191e993ede8e1a7d82d56671690d19b5852b22dab4dc0bdc437ca614914d38803c2b24ff453605c1f0d73c13bdb70b8fe1c6d96cef5dbbef897cf3a8fc7ad253c3fcd68942ae26a9992ea43dc039c74c8ce9620b0eb68caf78163a793af94dfb36a87028aa098147106082091d791f2ecaefdcac2a1807ffb66d9357722332497551f5896dca3339f6b6e452c4cb37167f84145ccad9b8bc0e18a06b1669fff82d36c45178c3c0f93509c71e80a6695d616529c2ced73aa0366549ae91ac08ef77ffeb8a2cd9499da771b241ad6e222e199fd75d46381d6d027c9542747202e1c704b4a9e2d06e7efe06599e8acba04515fe48209fb7188e4a143e79a2642794dc654a4055b9559028285b1b390493fdbea089d08730cfeceb233a571650d4e1df5b7fbc8f2d60133f5d82f7d6f9657d9397976c1acc56327e8b9d0a05ca637522cf0c7429aa3e9a054d942c24661ec4e39ce4f44c76c40e4c1f742df42d40e4b6c1ea7c8493a1c90d3a2181265e6216c8fad38808b6dc686b696e5661a38b20522fc3db10436e84873a978280ee02a455881978a5dc14e713453c0c24e0c379050336f0a71c8333a091a3379038c83331b008c2d7986313838e558681fab7ce596b85250038484de4860128b1fd1e99f88e9f98df3add125dfe7341069dda263624d9812fa752aa3c042760edf1db4e0fcdc24a0ee402cb2935d05cec8f67db8b4e070efd637dd71a4d9f47823d7e1b74e3df6dbe1905e84b2ef99c2ba748fcf9157bc65d56776b1878c7dfd0c6ccbbe98a6ecc37a2bcaa74b33c27a1e52c1673ec7872294193782be5cc7f69f56ee3b4074cb1d1ac8a2f741c3ef0c27e2b3ef3d08b9a836392056a63bd9c76c5bd2034576a61727696271c126a998696ce9808ff023fe75726008842d9317660e4214138fee532048f2681507ae13e9fd758f99e78783efd8b8800d7a9d0679f794dea7acbcc4432492d63d6317108a0cf7984995d8e132f7a30bc36a1242a19bc48613ba1992cb2b9260ebab2129e7f0d51cf066445625a636a9a8c528a428335f7f9b572ecad3c656918c59367d8fd383b859c77210ec944b92fb9b79bb8e7139320ae67f2f997fa70813830bc3b42d0b5fce703546e002ca5eccc75e9032bea7bc87b1cf12ee1ac04b90a2c0642a2420ec8a4b78cd253c10050c4649165361b8f7310b7114a000ad2cdf702038fccc5edaf111c468c9d75760871bc9fb982e0a088d93239152f1626d4be89fa5e712856dadb7b9d1cecc499fced291a6f1e6d361b58a3803ecc720463e0182dc22eb54dd8c872cd9a21d1dc97d8f8dc0b6e1844ac23957d7279b784e274035448bca713feea6dc66a934d4a9a64d608e3493309e422d1028a2edeefe8e202233c9edea8b27a1d0efada19c946b3ab1b8cd6849d3111f0e1d7511db19acd1cfee31ce20019e372f69e8c0316b5c73030bbcea98ca0a4c9c4d49bc6301010d3834fe069c3358bf519c63000d877ef7c42a00f8ce7031af78e975a3050c24a077a9a28730b5fd0d3ef9e8c9374edec4ef2f437117a8f7852c2d9dfdf1ba47cc56fa6e8400f204d56837ad87ce4a7234a1de41af580eddf17f5b2b0130b420b7c92cdc9cb0b3d86d6362209d95bee2df79652269902e708250928095e358ebb1ebcf42aaf296fe59c92fd18051fbb8d7f436e3e0581b09afb51ccb90e08f495d7ee878dafee97721be72ec826f386b01f2fddfcd494077f048cb5f853cf9f7eca7e4a954a39ed8252d4e67ed4aeee67b10ccb289675254cd7b8db8373fb369e795fe62a958d63abfb0df9954de75957424dc79ff2be94b3af3ca1d4b540a0673fd17a436e74b2cb83f38e310cc3bcafbdfa8d27d4de79ec8070de79edb81c261673a1761bffda6b3c3aa71cf31ab75979fe2a0c5379ec825429cf9fe3aa070d8c56254c4f71b7521ced9e94b34795d894a72eedbcf61b20ed9da73caaf3a3f39577bef2baf26aee57f43529ef0bb2f195f7d95c1ecc3954ce9c23e52bff8929af7a8d677d05b995ce0f95739e722e7533ee7adb0d744c0539168479824313252c63407d019eb19cc9f23840e90e84ec3a59e248d3af80f4bc848bca7f50e9a1eb78c692668c875d108e18cb2f7970b2b01447098b790d157e62dd86b27ac3a29063caf250ea9bb6b9b65df8a45b5070b2b0fcf331bbc392f48283ebf97543197e3dbf6e40fa1b9cdca0e4f965c399ef189e5f3588f9ca5d104e18b63d09e78c6d2aa5b49aa659b7b15e6335d949bbf26963646ba357736dbce8d5d8d87835de47dfaefca76bd5624de4ecfdd829bfe60dd9796ceb3cbae645af9a16234bd3be21b5c6b973f6a0e3f0783a4f88a7812120f08854300277ea190b5f4b17d5f4960494524a5944c509a321841ba59af3e6cda9694e3dec6a5e9661d1b538a184b16127551c3170c0b0bcb5511b497b73d1b451b7d871c058ee3bbba1c32b95651392092b6b3ffdecb81940b04e2befbcb6d24bcde4b512c4ce44da56f8db49aabb298ff763556e95d17865729541df360f3ebdadc439a67b1769ec7cf0775787bad0e69a4b875d50e749e7bc158dad28d672fbb452168dcec0aa26a7c12ced44b3ada445b11672a7a857aa919941304ab77e1aaa7bf8a1ba353bff892b8f53791fd402ff6b25a8aad5116acb5a086997dd31ecd74a23746bca9a1a67e72e88465af3d35817a439a669f7488903d55cee1bd4b973237c3f68f4b335b36435ba65a40ae91ece2eabba900a39ceaecf0042a8d4add992fc135bd5fb18ea339f3e8210233eb0497f21fc7cd824fab452132b73b6527cd23d7d61137e1c24ac93cbfc9d0767d83cee619332306fa5e973cee05006be317dbb1f9d3dba09f6747345c519a3a6062529d3d8e852465792a9fc863fba93d9ccb32ecb325597659e659e659e652acfb22ccbb2cc3bcfc3f9c2b6ab344a69f58d53a9acf35be7387badabbcee7ef4556ebd54ca7fa2caebece6b6db385ae9a6d16c87aaf1677de5ececec296fa75b9aaf3cef96e634fad4dc56bca1b9c6ad603f1d994b771dddf3b142d07abed608ddf3dd90d03d9ffbe89e956bdedaf19bee69d79ca5b94ae29859d578486adc66b5aab1a9a9a9f1d5ca6b56ab9a9a26a4c9c5886552ce6c520e9b3eee4fb73c150a6c7b7675f0742b6231a201148610655eab5b31ebb193d96e61de90ea3167b138ffac14918fc52c8b23f808a2516dbb3a5aabd5ad961012c8775a359bd9f4c13f6f9c24489f9dff4479647bb22c1ba17ba6673dd3339decca6e452a95ac4b9b010e49524a99c4ca18638c2d77640ea474cc43529d63aece5f7dce5a9d3d783fca0d2114549a4d73c299713865ac13274e9c4c27599c387102b32c5951e2e11dfd1dbc7089a5a59a74a844b32e08629ccb46ff6096cd61162ddd339da017319b27bd8e6b8ac5ac29bd1f950db3b0aa95d262f749b7a46a054bbbd51a76e5c74e3fef0795fc3784a1a437c12cdd928e838475e8a45bcd9d10ce9193c4b6975171a90169ce285b4a393bce39e79c53cee973ce39e74c63a54f395bfc2461a82c97b0b25b9086d03e1c8d97d51c7aa669da3de29c6c5b17d4b40bd232582bec82361f12b439dde2165df334e0a1d02d29a40ceeb6e85a1714bd6a518ba9ce07ff7675a20b41cfa89fa07916e882a8ec96d411a47b388846fd27526aad0e24f6b3990f61bd16bb20cd6b9665da3d52e240dce516840e420d4aa4063b78e10cec6769d5004e12f6d301fd7f6e08dd929e79527a1936fafdf86e50542df6b3cf55a7dd93eac14a1c2fece6d12375cded4dc35a99a7c468ad1ba5d5d3ee47378d73cc398cca4c62534a21c4783d2ce7885e7360db610f7e6954a127219cde102c92104e51b97da475524dae6f4c678f1d25c34a97b20b2bd3a824842ca514434a29a58ff18273c81b63531655c71823b5b66b25021520a5f44f470e6c74c938ba25a57361a34b17a8ca3aab58e52b67cd6b7938a2cfeaf25caa699aa669d6e35bcd3f762128744f3be638d03c53ff76fee3a7a7ad254fc93c65334fa9ff684e35aad133af51e7c1d1aad13d3bdd3371b4b09cb7751c2facbd4cebb66d9d73295f7948565e1374bf213c352b4fa5562bd73cd55d79d6aa56d6e37cc571ddf56e6ddcfd767ebb4de38a8dedd1e915824db215549658acce1612c46c1132668b095a4c6c4e0c07585e80d23205992f110716382962813cd9fdd4f36b05aeaff6b8b2797094093bf1705c075532a854eb2c61081763f783bdaf107b7f986b9387e210ee2ae7d0657739e934682c618770ce1f778708b1f343cea173f0b72aaf10bb94fed31cc7dd6fc8d7be69f71bc2fde6d43feb7ef4436a3de6eec771ded7ce95c0ce7975ebd23dc694ad2e39c7daa1d78e79df10a2e721dc37ed1bf40ab197d0ce57a83f9a7278394f7a9cf4ceab1ee69cf7710e2f51bf746d7a959e5075feca5d8fea9b4befb31cf71cf752e5dc3d5d773fef3ceaf27fe2e609bde67df40e21faf6a2a1f8f20e89ddd5d791f7473b3b77410ca532556e28dee16be56c62f4d1612b61341fe1193265ce403d6d717ad292c5ca52968f541a263d79e63b65cf77c3754bde89614d5cff714d1e2ef96e824991b9cccebc7250f298cffb8222e6f9b953352819ec1101379eb70a639ccc9c795fec46d7e6755efaec0f345a628e1c79b69cf2a2a1096bc9571c7b96733cfd57e3a582a6ff583558bc03c26fc1c5020cca478c1909fb6877c83583990042d774f80ed5b8db01f6620c17e642018bfd74f8d031671933dd8a337adddc022774ab5e12da157db6ab23de8851d3e1fae8639689503026a91830b34cc5c0428f5f4829274b4ad95db424da112a6fb218638c319ae11a5e7b852a2a6c3b642e6ed01e9bbd60592bd53c0f07f03183518acaaa302a1bd806e2f965a5866f1c9e5f44a0f9d6f38b88283f88909479fe42200396af2a950d6c4ce2f9b56483874ccf2f2474781ccfaf239a805d8fed89a71f12f2ec3db63237fc500952ff115df18585c37f444838d42bfe2332c115f3bf14a8a85242018a68fa2f05a5a667ea723d739a677ef64e411d82df4c4defbdf7ded7e6a6135b7e7679e87572f77bbdd03cfc8a7480cc2e42f12b32030e719a34694af08014bd5764069a87ed5d1e7a44ed403ca1f6d2fcd5f9013d7a0fe8f112d5673af344fd45e0472ff23e7ade37517df6a209a30bf0c2afb09d3d2221614603cb2f219c3ced81f9e6dff4cc39af294f27e5fc99f775df21d517e1549e4ecae15baf926baffdd5e5c7af3f98c9e5b29e79296f2f722a4f3218aff222e7e0550d7966124b719e794cc6ab78c296a9cee3775e9ef3daada79a2c9439f548421112d4d9a1ff68e6011d7af62373aaf3233ee7f1b9fb155971b9daab5e5554d8ea29affa91af5e23175fe50dd8cca7907d917e0e10815f5d76412a275bbdca8e077b991142d9105200a4aa33b956f894c7f375f3ba764e644884da39d75f7ccd39cd89b0e79a08d7b5739a0fc134dc91c038347686d86a5edb2d79efc7cbea560a6662ba8ee3baaeebba8e773a326addb65a37d7bcd65ac3d0344a354dd334cd29efd09c77b42b646117dcdd9d753796650e3d159365b2d235de1144798798ca2a2b56d58377b018b11839462c73cce33847e651a584e5d714343f5d7e34c33c6b17d41efc43304d6536c1438f73a838cea1f2f6544ad89477ce7975951276739512167395ca55def10e7e95b70a4c55fdc822cf5537f5e8588c14d38ac0ff6011f894c6e8f1fad32b441f40a1471a63a4fe13878c386dad69d376a8f274a2439de8ede32773e875a5448838100879ea947b64de475d285e22435cc6e57aa29adf3c4622ee3707c16b448644f8e61cd189b06f22d48930201878cd3f1812e121e7188269becb8c2376c7633aa51ef40cca9b69a9d3ebf476a09a7985cccccede90918743f1a1b30fd53892e68bd0fed863ee826611fb43a4ebc87f43199a23199a2369be08fd34be9fe5beee3b44a44876839aa87f736cbb4310cdcbabf3a3bb20ff8959f48a3436fd7e43461e6646babb878cb0c3148a9ebd339ef2a3c73b644483189a6e69a08caaba623bc5af294a3403f60af74b5f04eb529e7caecc0f655fa4a6e352453015ef20025d3f24c2436f97753d84ae17a342af2a7e9ed78436e71c3ccf8efda04e9dfa4f6f75e3a139845f83a0e6c9ad08849aacb1618c297887e2ebf0880f1d5ee71cecf0a9a75d21ead56537441ff37ae7ca61a78ac246bfda850fb7d8907140ff1c5084c433e380aef94f1c32f2b15d2b21fe50fc08858dde588ec7bc6feac03bc4e4727d011efb014e1fc07f338a950a976c807710e1f923f622b6814367bed83562210710e64a6c80a0cb9b974e838616fb0d799e30418c30c7623fb824cc4b37c26ee30d309e0c81c310494f2e1710e610087a2ef9430c2d58410723808c58c801045d890d10bb110b0d94b992060041c73c250d003222c504e8468218916242261d73788d70182d30711445031fc04c01c4405c94022d46dc70c315a7295f003110fbc76382bb5c40102ee99e0134913954e61d1f8f6f3fe5fd00435d2c5ede8965d2b3fb01ec7e980f894194f9793fc050c41b3d090593c7ee11ad25f80ffa377d48d193c73ec000a3a5fba9f0f1030cc5085e62f7030cf5f336211d71802e49c83b05e96b3cbfa6bc706484bd04aa3469d23c01d25c385f824032c6e50282472e1b30f030031422018002441617110818ea8f5c07e89284ab08038c96547031144d80d8bf11fc74667e2525f144f08f56602820edba180a88af11f6127ce0861ca83882c665e47201b17f467ede8f5d7ad1bb93c001ba5c49238115982f2e2803499a3440ec3f1dfb881ae57408333aa79d13eb24fd4a92e1591efcaea2b2c7c8e2f156c43cba8639c5a247568c3e1b86c65c473afc7e1dc924c324e7882d79c704a15b3309c9f3c48faaae508f3e9b4f6f459fe93a7887730eead3ab67fb06f5cda37d83e6d0e8c3ea1b0cf51f083f3da776fc4a723db6e23c3a104d5fa35b5427f3f8fd3ad9e557520bcfafa424af49cec14b51881aa5b7104ed4e5900a462b1c71fdd027821c9091e6314fa1e8b19bc274efe90da1462b1cf92198e653e123107a3f15ee07e1639ece8fe8d2a3cb2f7e2b5133ef9c79078fa2ff38a72e449d9f5f40a0f9e9b577f06bd534df3c86fec1e7fb6995e3e07be5fca7b97ad4e392b09c57dfb82ba46940da35ef9ca717230d95554a56f2e8e099cedaf20d3443f869e73c52992133dc40656cc5754b768b6f7c8910fff196979e6119cd74647e42f7f00b88a4cfdc02193b6531d0c135baa7bd8c093ac17ae2b3ac67278b4154561961f93585cc7ff47b313d7dc721b2b5439fbe81a4079a6311fe23b28d3650582eca43113885435bc6af46976226027d2ce2db59bdc37544bc191d84700aa30a0a64d802883d585d9514db7ac1936fc71102a704efeb054b1e46576555119c002aaba6d8762e85c34bca0c4539f0a0823160725842071a0045d92548c656b25b44f13767d54cd3b42cfa4d855d8f38c46f9e11c5d7fcabc7bf79d673c181b86f7cf26b3cbc1fe610621e3fd1e43ac6561dcf15d72df71f82f1d9a1657d74456ff18eb8f31387e8aa2816aaa44c294ba24c55140bbd53a8dcb53257146970854e8509490b0c24179dbebd863f7dfbceb7d758e5db8a17e2e5d9683689f2046329276c00a4d877f095d19fa5e40381faf5039567d8e5871dfe6b7af9e03ad221e61142797f408f0d9378f9f0e4e7f3ab07a6e71a24282f0d4155dd60bba723e4ce01452f659012c7113280e424b60bf11d2ac1b37fedd0881e909e5f3d28f9023cbf90bc7c94185667b79cf68c3ad8e541bbe53b9286aabac146f945a7b104e41e910439b17629c4d84fab5c60650f4acfceaf7a32548297ae81ca1da38c32461939f6ea0b89ca7f962784ee892e40dae1a3df4417fc078250bb942b6e1f0682ce41f93adaa1fb091d8c9e5f2a282380e7570e4ebeaa301f52e686e594484a6a873084b0bb7bc6c842ba0599c5f82001ba947402a0d704613fc8d4b365613fe8a20121d337944f96e9a547043e3bbf909a3e7afc3adae1b983de84cd50312ba0af1c8ad2af3ce5d4bb23129439e7b5a69c6574fa1aefaa70284e9ef30e4a96b7f10e94528cdeac7e4e2ef35853622f987265816ed1cc310c9b1ac5b0396915d9831f9352c6d5099bac73ba84104e6821c424cd3cca59cad66647e29c73d25526a5b794734a492d853286899177a6b3cc6e3ad822314fc2392794b03d1aa5c31861c490e42a478c92fe796a15a3c7c85212f54b4e72bce162943246c9bca23ce0476e1ab0582c966461538c97335ec45481268a7d7e7d79f255909158cc32cf6846e991c51e80f1cba29f2e8b38d86197a8e5c32f4b9e5f5fb6b09e5f5fac3cec7ebcbd31826174627da5cc6cd0a921912452f4e924a9147d4e487292484e12c94922d1e8241beeeed5fa60bf4e724f8a8d4eb261c3868d4eeab1213bc9494a29351b3eaddbf0b2fc6451698be03346ba355d05c73cba74e203f9860d2b363ac94612c67de01d04fb30dff0c067f71311573cf0af9968a876b2e15f7bf9c0860d1b1ed8b061c33ba95b54acd8cd31b73157b65b4b7e7ee03fdd1e559893c572efde520e530e31aee106756af80914e01dd2a757807b3677ffa8e79ffd1aff585fe3cc3e19df805ee39b17b9051df3a8e7e54097fd10daf068bc284786e5a7ae613cbc520e763da8432dca968484d449ddd44e6da5b5f496c9f43348158a82214924a42064ba94ea03ff20d5b0ad2c31759207b45b9b639ed0074e04be0d0f4202155e9eaa9e74cb4e7642c5ee746b76e0d1917c3c9f2e97b2744f073e5d3651e99e8ec93fa92535adfcc454124922c9283209476e39fe75127529e50dd2ad4942b7e607369628818a62a28fbb8dcbeea13e5d2a893e0d65bbd33d4fbaba1d9c2024c827d249f4692850a493545369a51d9ccde56ff723c163b18c7bd14cc6d44b49f1c6f4e042a1e17df0693876239a1f2c741de7ba35c3bf4eeaa4ded24edda3e3d3dbcbcd8dab6ebc866764625d27456aa35392ce55a15bd359de817f7c8608984a79273595564a714fc3e3efc0637939de913b8e37c3f388401befe332afc623929db0baf6b293fb883e7eb3586badb5563e0de00a9a570dc8d822ba8e2d11f645051a235e546879393dbd9cb4581fa0951a78f91a6c7996e2b98bd3337b8fa9bc03674c927129296298ed827fb0143a41272779b9c22708063a39498e4f3c540b03abbd9cacc40d6e2d6d3ef10a130566b147d8891834b5a08ba4294530018a4d1f010b443b064d309b402d46d826223de2e0f942f0d93c02f1af4eeb03b6fbd5881d8bd559b644cad12395ca65b6f4f47ef0e9f4187bf86f2ee57675369f97db2ea5de796cf222269a712d71b24392952c5b9ec8c833fd465238293b2098cbfbddaf290f7e7331f39c6b1d90c8d4ad9b1bb378fc5a67a5b4ec8288f4e0dfbc47bfd6057597f9005f05d24048f0d56396eee1803410ec46a64a3dc805eadb61f700d5c398254ac139e21d8231cb64c870ce94948e79714bb7e23725d92f367df4b8149962130a04161bac74812e2c474e207c4146b7cab93bb7e6ce6701ac860be13c560d0d7cbc61160a1f2ddf68cccc15c62a51cb7faca75560f8e2a2428321a08e6a6825a474777bc57eaa976e65e41d3c1996653609fbf96799a53b2d6c6238e0b1a4a5e7642cd6deb0a4276515feb29f7dc992734e2460b7b0202b85fd588fd5f09dee91903308338835d18cca0cf34c28cbb2ed4e4a29a54e29a5946a9ac603839eb3c6b44bd8cf1dd27861180f165e9e00cfaf2d494e6c81220333cf4f30613f90dc8404b4f4052acb26fbd99fb0a32441b78dc27eaa6f2800507bf04378b358e88c801a8f9840e5ce3259f9d3254c41e5779e5f5268c1dab31f725ea199dd7965b7b09fb648d825a878b23f546c8b1d3ef952064fb4b0fc9a424c9ce2c98eb1fc9201d4ff4b065ea4d0f2d26b740ff7803e9da384505e615e5072fe80649b45b04aac126b03a397ce03c44beec1bf90f90a1b97be65df90f60ae84d44c53608e196dab61464f9e69a0f869cf705f9aa524995b45e21c7712abb79f12984db267d1b1244f3823c6b1bb76d9c4315c771dcb65aad562b95f377f67eaa2b9de3dcfb823cc7f987d1c738cadd92db8d672445286edbfd8a5e4a74cda3a1c56e0ed3fca779a5d463f763bb47361ebb23250e64734bc00324457a7777df786b585029a5d652e95cf77c5028738a51acd218638c180d6b64a3331dcae8cd2ebd4313524a29bc47d0e72d9a50ae207912b5aa0c6e6110c3aece8ff65ba45f5ed9577210820c81462faa1c4ca2ae82060d2d1ddb930e3b19c2af9430e9f0d07f1a22f1b0ac9d3d383ce7095b051379b398bda8f49849399ddaa49f4f146182213c1eafef743afce73c9386ca3b18f3134b7ef5fcd202e5b93323a58c52ba7df2f2e5eb091f5e4a29ef1755377835bdf0dbf3abc9d5f48aa209143ba8c2b0fc8aa2cc2b0a28af28c4bca088e244fd47987327011180b0cbd2cb4b4b93567da1f222429e2f2a2f688c6168318210420821e438473b61e6e50417af52c2b6cbe797135afc47790763cf2f27a09e35465545692f83027b23f1473c8f0ae6f38ba98c6a8c9403f80f7afb2c9a25789eec519f9e91973e63106580e87531144d7e22e42805188a26400378de890e6d8882838827cff9f4f65280dfda1582ae3511c839a613d11fe2343c38dfb6af3704accb9fc75648e78858f29c6b5eebd49873b473f74373ce7fba47565df3388f1d10ea10f6859c03bae69532069b0b4884955e80978eb9d296c73c0b72c210ae08c4a383b9efb484a0a0d46402196165e2683133538f943b4148f77cac1ff8af21acfc7410787ede940082cfbcd989b09dee9944da89302018e8ce014538f8763cb48e842224b00dfb60d163421ff623bb1f091e7e7b7bec6e6f77e89dc1c0e9316fde1cf98f3abfa258b1dd738339f58f04697ef491a75eb95df47e45471e96a166aaaadb2a752efacdeb9c7a455f6bad3ad435efaa9c79e91d18ac4aafb508729ae60d19198a5f5d555d480748e6d3b35406244b65dae6fcda767950d75ccba2f45268bac639f5e06bdbb65da1e99f748d2b417297bb98ca8bcd023302209091ca59604600e610e827625e74d5909197d11b8a40b42bd4b9f4aef38855c7eed779bd3ad5339f40a47757a75e20d431a78e6d9e09519a01a119d5ee8779e55c47c33c1dedf29830407a29b479bd1ffc0f738e730c3ee79347fd512f730eed0ec134f57e9b635ee163f0e1c39fddd3fe8110c2b3f302fac8b3a778746ccda5a0ca522c738595a748e5c917559365666666662e52f3ccccdc41d4f6aa0af274e6848c793ad3e1678eada40fe0a367de58638d65ec8dd1ebe519f39f3803fed3d123d22fbbe113757f7713f5b7081c5bd8228516e02049115450896208208e7a75e1e5c545172b1350c0c8c9131d62f8d2022c64562c6cc1c511ffb53e72614407b8e0028a1ca2fce0c4f4e2a24a94550b9c2606298ccac8e1484c0c5a8040cb1351395cb14213a8311058255925e12923aa051a2ccc1bcc20c382e4e9c59261418b4522a594b21e918a4125e3c38a4c0c90a89e5f5cb8a0b55006940dc99c733b41b501c99593cc918e4c0c467c05cc1520ac70d2c59530c49881610b2dea8b2bcaf02e98ac10020b0a565044165b0461b7b8e2c39c734e2569c22862081ea278c10b1b6c01656ec1c312bac50cd8162c60c18e31e3f915f5c5864e0a38790b232d5640868c526671014a97364a295f51585e4a69cf74f0fc8a92f2dcf32b2a87ffacbfc2ec48c11463609161cbd10b3c3c39a0946767070752ee145121f34392a72ea6f00225068f1862f088b103c7681103c68c8c52460b86b5cf2f2d5a98f2a5c50a2fe54b2b7d87c6f36b8c98c79e5f63aef8cf79ce580c724d31ec7e1ebd81c51c5e2a31ec35c60b0bd60b283b3b5f48b963cbececd832354d9a9c9ec494796a8a3eee4ddee44ddeb4e3218080c3ddda2ce48f00bc7cead666b4d178b5265b85fdb426df5c659aa05236a478484949554959f9f6d4936e8cd491940b2919521d97ae8a2e4c17d599f9f66e4b1744474477a563a26bfaf62ea983a14b416743c74317e5dbbb25dc18ce0b6e8cee48a7847b714f705cb82a38262e07ae072e0822b82532d8676564c42531e26030e252c03d414305fbac8e8ec01c8d39f2e28c5315f65935d184114dbc9a78a26ea932541a6a0eb587da648bdac0d8c8a849ea12324c6c526c546c60c464e1815d8a5731c237a66fdf76d88e6c2eded150583458197e73c192b19f3f5189c61acd1996b4a6a6a7a6a7a6a7a6a7a6a7a5e8239f9e969e969e969e96a09ed09821f3f4c4627953d316344df6c97e5ad3e6722d91e99ecfcb343d4189e91eee1e36827d526452645e29324fa4c8704991f16245d2c03e2a264c640e4c7a601204132760b08f6aca1432a6c82453240c53e40c66a4601f15172e547001c3650c97324d52d847754675a68aea8c11aa332fd5192d51a20bec636ba821ca5043a4a18698430d4ac2b08f3de288a823c038828c23a0aeb08f0563c13061c14861c15061c13c2db50decb33232e2c1488a5115a36fef27aba3a33e72d42e1cb50c4767b8b0cfaa8926aa68224c13514d98d91204fbaca2565144aca2aeaca2985845f10e18d827b5945a8229482d411b524b3ca496a274807db426adc98b31e0110d8520f6d9e813964b152378ec239ff846f77ff289a5008b80ef1b4f4f4f4f4f4f9bd1e6da5c9b6b43a2643bb2b92c179bebe9096a49479fcd935848168a536a2d8be5beb99eda1b877f6c512b76deb8b936d7661425a66a9a1800693ef919e6920c4ad2fbc52528da14256da24dd187c61bac489b689384dd126deac27ef0a9e99b6e81ed2f3320a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a26c948d2243268c97305ac2587952ab94d4834bba2587b2c63aabd3e3657800cca5379540296f065bc9cbeb0a32cf2f305e5e609ab0d06be6b0a33ad8854d5109695fb0ad6e592465b2d40c9c37b4de4ec43b54deec93e31df520d107e736dfa08eddcf3ecd79eaf27e395258694afa3a6717c471f1461074d81dc2f34243d2bf8893e321c971234540398ee38d20c757355ee33939399ea40828e726b1f19a2b3dae3c7ee9b97794e3aa9cee46efe8c66d6eae0b389ea4a60607c76b38094e8d27c1f11b4f6293e3496e6c1c04d127e7da505a632d8b3ffac7f335e352469d771e8d2b96f3e99c778b398f2e392e0bab451f08a402b6e4270e652f69b7dabf9d4f0791d9337a4717723c094e0e4e8de7b80b379ec4e6c6c6c6735c98e1496e66dcdc780ecb93cc60e5f80c1ccfb92eb08092e078ce8c1716674078c6c24c8e87e3cdf06e3c59e34dcce19572ce39e574f9024366ce2597eba58c506caf9c54eeaad31e1949e6468a8032a7de08b26fdede7cf39fceb22cbb4934dfd87b462dbb2e644eb3cc69463d49129a710c55fa8013360d1a2ffbf0f6b55858e95a9c40592bac0ff68bfd627db03e582bec9717165b2c17d05b6274e352b60747a8da62392bd058d1c543b71c851076c47922a59413cb9942b92ccb32aae13051b96ddbb6ca6d56a4b8aeebba940a1bb3e2acb5765553f3fc7aeae286b3b1b1b1b999913a8283838393c3924c68701d74d0410734745628b0c1d5e882600daf51a3eb016d7443304d64ef69c97fdc4d0796f502b3c3b32227a56e1a97b2c9810dc4844163a74ca1d261ce09676d628a13a42b49c250a1420c149ba483941e9db220a303312a7821cd1493c51397051919d224e0f96545118ff3fcb262078c69623df8b17b5380294f5c3b548912e306ac8516576c68c10a9498a10646f2a70e8ffe383d1efd71c28f9e0e84b74db0d9a53df86fe0b59f0e107e7c9c0042f7448f5c9ce8220397142c9ef0299aa1e94b9613c0408822a6006a77f629aae18631cad8c2c20a3ddc00d4de629f08bc104594255f6a50040e80daa39744f7cf0829bb82359c77d00564ce0e00de814daf617324e0790021fcc41b2d03c03e36a6aca6b98dfbf0b1aaf1e363041fabae71b95bed919ff3a14263f955cead5cebb694cb2ec836b7e326f50cab4dc763753ff92baff10efcd3f191e51f023ede789c20313ac305d4f00ffbd843c33fee3df0cfbee41d371eef3724848fced32d1d2e7b7550b151c31b013c40bb0e0d0fbaa051df6096dec1fd3e60dd8fd53917e7ceb870899dc18d47875b6ebc1a24ac0843e8d004040e82b8020306b8be904114292c50ea02b472ce7fe2db78307c7b8d47d42f8356d2a1261d4eed990ae76813a89456a5694a98594245185b3475f1c29f4c10c3122d30bc50a52f4ce2920414a45b3cb0098f15176c40854b18170bb46034415899c2f5430c4d4aec850aa2c080091214173670962852b8d0fc10852b8909dd6acdabc72c59bb4434ff215ff3e072bc512153b77aa95b2704814b678c2c59824f9df4c3c20dc4a0a14c0d68ae80518482133871240b5713942413988041e6061dac68010e1ac0a4cb174834d4e08b2b959b7396e0d207f90ccc029bba7c432adde21dd97b10a9c79c830f101df322e7588ade35bacc30c183e6ae6b8eb01f37c1a56f874fdf3d917d8a9a70c1e4053d3009c1051640ed300bfb70513110a30b1ac6d8e10ba076d8c43e45365ca1c59525474694f104503b74629f0ddcd0022e4b34f9410a2480ba46d7f8a2620e67779cf366cd1d04386389e3a5774b3601f142f80c7c884587b11f3f09895e44bd990178b6f13c837ba8b6395c80a4dc92ae791cb7a47ce9900f30e3fbc0cac892caef839f5e19f356f409c2b524a5f79bf171de1bce61359ab56e5e5e13301e2a43d937a41175c9d18f30044ccf3c162890cdcfd54fef3801d3ed0a56766b666ca334a005d80d46e5ae448041e259605edc81ca8d695e390e7edd34cad9176a9a248d38b0e69473e6683863dc22c6cca3531a36c326c6942d6522ca444f6b14bab579536f48b3ba4d2935ac0a08214c017e8466ba3b42304c96b22ced29c7400823ec55840dbbc418e3740ce36e4d9e2d1f4a26e2c92dab90114a06a2d0a8148d9675392d19a2110100000000e314002020140c070402a150389ae7badc7d14800b979a42664a1649b3288771140619630c52800002c6800c88080d4914315ef03187de03a03f2f0d9748d6e01cd21bc8d4afe3a64f285197da1c8dd41cdefdba9f2a90dcfed402ae82298f85ee4b3648d1c27664b8f15e9a58f2ff066edc9e4a774424a4e09ea0192b37367654f081f0d4146c66b7bae67c4463dde96b90f4620b9ec4b0410bde2b3fbd6344eeab2010ab2db942730517712fe346573fc56e87f2612b9eaaca194303c278a59935c1b8df14d310e95cbae022f5b6976e8dfa9e31f28d0c56d53013b3be29636f408c18f2cadc74f39065f1ff7254f418d70bd71e2bc91e848c0a77fc5e6092bdbdf3316f57c83bf094d7bdec33854497e1f30d92d9e1a48b111e992a6902097018a598bcda5468e5e4497124618cfdbe3278c26e4ddd4e190d015ff0837a5cacbb93c0d0f9d17ae7b40a379a094417e05fd1d33ca9d6cf7b2b8aa83f23d12c76f3cc2beb0e7aabfa2035f1c848e5a9ad9d88fc572dd29974c8c3ce980f90a73b97a8886a54313a396e950894d12f751ad31247417adf14494f15ef26bac0a27cced7e68460bbaf8404b791712872a4e5d945e58d77971c92b64de0be7b15395f5454460c6a8d875386188329b360482eb71a5dcb5744e17c32d84bc8df8c3251fc5d7d3066a4fdcd7500d024fdfc02ef3cc568acff810fa568829f71106a7c7960bf9bd8705a1a3ae0634e130b9110f98240be85ffbaf784d30478c732a0e0e0c78ddba4d5dbcd6007a6ccefb0de5688e0114f51fd0383fbcebc96a6788ab9a9936b86f3724b67cf2bfd14b6edc61c06cbfa41b018af34b7de414e3fd9538e729be080de4b50b4174330bc5915e811c327e4f06faa6ca635749c658d94ed58f1715f2b5ae693935688697b25549bebe16f3f0faae633502e9d69bbff000ca0a0ba0592381a9a60677876c1a0d2a51dbff118532cbff7a898cb237c84dd0571960c7989e44151b16c05e02501baf00bbf25f001b4b176a825cedfb2a329108b444160372d6e62683dc1e4badd76007bf6db6e13741b161182e9077498e040fca7f8241a89eacd283060add615457cda93ac7b3f586e75e8207875dede6357c2473f3efc4a10671f1c93f2e7cdc6e849644dfc36f9a38a9ceacd9efc7f5b5d2a2f7b39844db9bfb05bdc548c37120a9a028cd82f647609de3a51be5eb9b58295bf9ed298e174d32154e8efd4dc3ab2b32a375338bab2c939bdfb1519f8e176f68c63e37c3548b516d4443758921531abe1ddfac7d6d0aa498fe0bff939c69ce2b950c7437012da82b70e059e6387b6cb132f301103ff8eb939fbd311ddb7cebdf3b7792bba7072b3343c1bed0bb8b767c9b6c391ef018fa9e1cf2ca72ccaef3177e7dfe681a37aa751be458e9929cdbeb243403813227c78bafbd7af88861cc80f3b52dd7de13f3ac79ecd093a6330f2f466a96a2223b551c1e65f99f06a88c8570c4553397295d481cf1c85179e6989bf315734b1b927a55c88b5daf770e1419fa3ffd5b03361f8760e1ec619c137916dceab6bae348705962838044f8d996b8d349e5827c283923e2444fe59791fd54c938f0c4d8b324192e5a7131fd8701135743787ea1c4400d8813cdf677000d0666107598a7ccec1fd909750b40b882ffb261cfabd344dfe8d62742f72685a342efc835594a30f3d342ee5a7d3174a4b7ea2135f1cd8f2ea795186407143b57d09d2a8e5a763e962a4e7caa8a348a1e38128982c52c7d5330aad4915d6ff40bda3016c4bd9847f76c6340b1cf0da26b13a27b3658a25ecfeb43ce9ea0d99410090ef36387a3384607908cbe184876893f2ae9672abfcf01c1aa05d4870d4833c9cc4f8fef869ca34a90045c6eb2ea886e3cafeae3bf2cad680dbd02678ea322624cfef0fc31b7af0568dcbc4a68dfb25e2fb3d6758e1c94130e0f38c0262c0f27e009fdd9ebde5bd579156ab2cf7e054ec5b13ea8ecbafbfeef8e05a4d6537f48255a5683bb7e6c1b49f0ac5dbf7a16ac4992f9128ec449ed7c494057e2c7d5576112c1c049cfb1e3d0f1a55d512f390f0626f2f739cb93578d83f0d7b93eb68271b165c946737e18b1c74d67ae87432b56963e658c74076a59f43f768f74dd2bda12045e5d415d455984ea84186ccfdf7b7d9aad2b7c952e13633a3650f242e8cc23200a2b0a0fd461b419cb92f26c637c94f812d1f1943c1813de5d50c873b0e21fa4a45acd616160bdd8e73cdb19e7a8d8f128ec58ff6ab491ad043c7696f521b8fe4a5e40443aa293454e94789ed5473a7b3fb3ce530dde4f00b623a74b6ce8da6448053034b20678dc0c18351c74458d2eff47731c1b8ba5774743de3472a7c45e71c38a95a8880fe6baa578a24a485ee12692513ff9189f7b937e817dca49ba456d60753b54692370b95f6b61b8e328d46f15e18f34b6f1014de2a286816d8baebc776084124f20c11ae70384e4a97451a0e32f8cf21ecd5693071bd61dc3b91845959c46b21dc77a982a6e8905e73fe2e934fcbba40c6b994735fafe99432387b2bb8f93845a749434f4415a5cb8ffa91fea03e920ffa63f1517cac1ff547f2a37ea03faa0fe44331fd93f9587fee9ff9b57eee3ff3b37edc3ff3637db87b666fbd725f8df79960ecc6637380090aec9d01bc3b907704fefe00df19f0bb02bd7b00ef09f0dd01bedf027adf0be83d0fb7f3feb60e1fb7862a88bdaf0344b75694fb500d5aa7d49cbde240c1a69ef71ea9268645b0b1ecb6c662f2c3d83ac39512b6bcad69403dc8119f1eac1b0e79b6ac2be2b54d9b82001e8545d86dc4f765ece76afb76328f68f52aad8969cc0725cff105d27c9f2001617ddc1559ce0ddf8be86dff074ca9cf630cb10fd15eaf5ce7b9ea989a560a642f586cd743c1a713e9312e0c2bd6f6cf43c4052a86f841e2ab2e12a2e53554d758498d39c112b2295b12ad22dc9d467ff34399306c7e67f054c5a6fda5f3125d9786b6c5a42cbbad46bacb2d9c9f275daca663d7d8793d5cebf10ee12b5366a3aac1d2646e29956d210fdd1ee481fd94b6dc36c818c447b5ec9735254ea22cc80778d4af6f3d98bc8049134852a5c85322eff41db985e58583e90a8f44eff84ef29ba471a30d9862630b25f4a3f2b841152eca1d3c6fe108d7ed15dbeedeae198517c946bdcaaa2cce402c2774f497f50237c1fcc4fa4be40e860e47094148bfe3794c4064ba6106b803e970fe17c140c944956d29575933cffce5ac7b554f757bc115c25cfa1b5556bac847bbb988953ec66ec25e71d94f5000feacc496348f825402a5a9a51a1fd94e2645aba5456faea7bb1973b0c7f70da6f7e9cd77184428869b03333059f8a67704cec26f9f93ffb2a3686bc45828936d79b177ab204a650053c7c2faca6609011c4b0455285df2ea7ffde6bcd3e06b388d09923b846f07cd1d18375de12b4288658179513607fdd24c579a4540ddc54d28be2c6d691bbf953bc60ef879dd9db11535a438c0ddf9be4e3835fd563429ecc8c430de54557d7b13b437d1d164dea5301bd8e3ba25be9e4c5ce0d2a8f3c576ec79eeaa44d451e00716ae7a2320450afcd80d90aa1481d7a4b1e932354948347bc2df2bddaa942d83580822a4a72aa91fc99383ae9685a1f13c6e088023a7f6b7e63f7bf7469a1744ef1d5df09052b1f62e013bc81957b347528054d9d24bf6d612cbe5c09923f5cc09bafa8154398e3b82999d1fddb3354220b640aa74c909ceb6d28ad7292c0e6299af3b68805449d6c08e45e8333e06a75000221491c7a7b01badd3f6bdebbba2c8fb3e864d846f6579bdf5e5a4fe9fd9335b9b8973ff838d7641de178b44b6d52f72b5d357accd54f07b814664b98f01ba13d0e8172f3208b0b67c064c973385d1669aa49c69b29f8ff7b10eedbac7332d63cf6a053ea7c97f81aeb23f9235d7ef3a07f79a479b6710d367c35c0d8a7ed4b1959cc117019d60c4ec454f37d05c64479d2c1c8a7d928c00c2f0e2c3850ddc29cbe69c4c6e43531b001c7a53e0ff0d0e66abbd1c73a776aa7fa48bfbeeb87bc710b02ff2d1fd40673e2b7d22698ca69683e6f83a6fd61b81917abdb4cc724fb1f54af10d9b4c082ad1d507198f83e3f9d0f11e7cbc0e8df321c6e3f0b83e749c078fab03e37c9871383cce7930384e1574c4d333fb3b20623e5988067e77a0de0bfc5d02793fe0f70cfcfe80bd17f03b02f26ec0ef7b019ef7037e17c2e9bf57b146c1ac584c51667a4da92405d6c41e9a38067dfbf156a0c70b1a2b87f6da556335f246d5e81bd1466ef41b9d379a63f21cb01e087b8f770dfd153d5a3ad8056de7503db3f479f60e167ff5955ce21c6429de10c51281345a44107b578af4d54919bc4c766c9b0619faf2fee25349e92543fe4e7967fd74a6ecd63c5f53c65f79ba50be6c98df2eef2d9ede94d831e7ef9637bf028f3284bc1789085f9dec09e0d5b1b818c8ed95fb6b9e16caafcde6fbcbbdb57cca42286927dfc30120eadd255a8b13f836cdcf992ce5a98a2882c7aa279177363a9aa685ceec2fd8f9b22219e02e6d7e674546eb82ed76b8b395b9fbb0ecc51c7727ff8f78f1477aca26fe7eb6397573ca0a7efa7684c048a121dcd6cec412b4618286ea80aaf2c7dc7b08457b218f67bc0ebdd3d0db96498822f77d51d514463bb37865bf87cb015937a6918bde51f2efa30bef9e52630a2de695a81c0f627f81c202abf9576227fe52289f0b621251028729375fc22a44cfb313dd93bb83693cd5f6bd927389014cdb0f58f462d61bba8e65c622a7bb63a0538d05a0776fa6ebbe12697f0d4f2ca1b14bc06ae44870a828f75ee017434290b89486ed1320da55299265ed44ab90effd212bf0f384cbc886fd0861d6f37a668833171e705c43fd9a583b35ef54540d368d4ba42b8a8c1f6f0de64fa98eb0e3790cc873b9de3b1650641799b5900a8f4420d1bb4197f1c054ca07311214a551b4f1dd9fa1c057fe0621070d280cc6f56dbff7d68751a335b730c4d4c7b78cafb911ffccef4949f10a1098899159767254c1842a857f2d7f4a84b27a8f2024577b7c9fba41cde0a049cc74a5f98e6fd322377a70859503dd3a937c07aa146791a335b8e9139c7b918bc9528de503542a27d6a010ee47d9153756de8df6fba80276d41c25c042268073bec40baa6fd1d735c8589a4aaf54fddadc60d5c7dd495283dcf86340922cbdfdb5f6e3c3e98ebca6075c2fc08dc47d5c9d612a68bf04daa20276608adbc8cbe02ce3c332f4fd9fd8a161d2656e05ca9198b45304a29d8ecb972653411b602322bc1c91cfdc0d6b3ac72b5ee50be33e627c3c0cbe3cd80b3d385e9bc07a666c8e0055b84ff8c03dd081db370c08031ac1729287e5ea609c699c583279e1db07835a2f9e6a0d512ec290a3b3f7636331d2368e001ce512c8a3570d4ea6a959cccd8a54f3b054590a35190e649a5096673ddc6ee0bce0382fa8eb5255829f38136dc4398840c2371653630e6257d206ca475e9c2f53178e5d6240df5d07a806a7b2e724a7bc9a0e538436d4f91affe8a764a06db313b068e9a0b88a823534f6b5e7a6e2ae660300bf7b4e0717c11bdc46e0b04747b867fafd985baa86181b1a32796c364d2e550539568d4c9a7fc3968ce78efc2cf293842f52be96a9a05b7f2a4fc9b02776591a1fa67f0fa3ccab8ef8b1f17efa64944543a5c48f560ecdb2c74ae613112db5f916ca0039d8e056a8dcc4bce1804b7607534e8b42100a0c5121c3fbb933977561799d1f9a547df29908c812bf08935016c4349e0b279e7148a850458dee61142e4dfcb24725f815e711a7007305e7fb8a6f3f7d15e9c31cb88049d496af9485854670c2457d0db2673d1ebb6943baa6186b6136cd59b4e9aa0d9aaa9ed18f77627095a3f0456ba6c9ae4cde38f20977e692db69ab5839f8b4140533074fc51ed8fc9aac5e238adef59fcc88d16216512dcd77f5aaacd501218e4a8196b8b70851a20b2ba9237c5db2ec7e4c8370ec2fef494f9dbc40a8cfc7a7ae4f97c743c29d0e0868c843022f0453a628d280828097d4fc6afba0f9f1b1607d38ffcc8920e05dd61c8b1033f1154f3bc43347ad66e90811f28730a7b51d1c57b748e3a3b013160dad7c6d7d0a2cfdfa6b1e07aa410264025dffa50889ff8bde342f614a746648a4512408f7eb0d14320f1c8087a8ba1c91da7e931936ce2c382c93bb5f23594f156440eedfe35e32a9664be83674952e00159dd568e522eaa538b1fff116ba69eed753c003f6bbf5a3a551f1a07ffb6609c05b6998a019afa5b1404d204e84ff830f4c4037c1183abfcf8c5b169c4af3fbcba4811472722817cff4fd38e5c99de54d523d92ca71f19f2c3afdf70b49c75107fcbad1a1944f86c30cc59e562d9a2ac385ff8e1eec37e1e3f87a15cf11a914e28b87603b9294e56f07f23833eb0d3339f84d836e488852ce84dbc0c539a03a505f3d5ad42ca5280da682adb67566b546d77569640e8e339b598035edd52d3c7f800f51e0b8e4473c2ecda320ada0a17e044420ccf7211b7af396ceb29fa17bc7a06726791a201c175a4a81f578875a52db03892258133688901531c144f99a25949a2f8bf08115816c874f303855a729544e22e39c940c5590110d0ba3a3ad6a9bb9c21e8c8599b71108ebd53e7b027bda9ca359350f206480a144eb0998e2392cc3d10f5c2663f02e1383b4133b37d075ce8b3d79c355116815cb311a8cac8dbc9e8ca836e9492c67109dd6884a7b67dee440e68af65cfef06ab57617593da1c539082e5f26c37cb5cfaf2536a17c688c9c3dbc07e66c378e1ffcb1af68c835cc537db193a52010e5f56099f41fbae0e02a592ae077ea7c922a3b075f9efaead6cb065ec17c5f793f4ce7f613ac4d5bceef8d03be06155341f286659092374cda6cf41a1f8eb90f224dfcca6057ed0fb667a71fd6d88347f0fa0582ab90cf8f32ec427b2fdf4170b11c2de8bf7ef7f604ffc02c1aec7069116480afb5b09016f45298232852cd88602ff2859ddaee98fbdbcf900d4bb9ae4439457e4252cbc6f4ffdab3c8c6d68ff58e772082fc44ff63dec85a1841ed9d567abc30b26d6842085bd253deb26a8d43b33ac25b4b3d4a3c3d9b2c5c75a256b87347748437b14982c3e83a5ba00a4ccb681c427fbba5911043bab22724466bdbef6ce3b306d0c0fa228d16057b04d5725f51941d2a253193ec3d8a6866cf348751f6f7ec60f0991c09c37bae8805408b2d4175efd41adae991e8fc30c230c47ebd2c4587f1160368d95ea8236e6484fe1e54b51f8618e74a1c1c58e4d075aa3e42763bf7452cb9ee194ec069697ecff6af3e4ef9e46e9b97a0c86a40b9091ea8461d74ecf9a83ab2af13cdbbb80184d87fcc3168cfc1deb264be55ec042bb17856d233a048aefffc094a4b2555b41c0428fe6caf9379b66b32c0bd65180599818ab148db5e0da1b4b4fb74ef9086fc2930805ade4de348d0058a9c8c12404460976e4cc998a778cdb8682dbf2cdcbbba9595ee25aa709841dd5c38693374cda9bf2db2c69d7bda2beea10b96eb62140d36c56d36e4de5aa8f0d4d5f445425b5475342192c7d94f54c94aa9300f70279da85077062a64ed0bc1b289e689f42e1e057d7c9e2b10069e5537d9973e14ae14599600b9c6cc5d34ad06069cbd38a263852c69a21949e8095f10a5b9d12aad776e8a383c0315705d860424e227e1bb111ebad3e21c6673135264a63fe9911be20241fcae88ce6b180720de05bf23a6598478ec4ec14b531521059df0fc80d4e2c04a8f76d480352b939bdb8a2950e50fe3571a21c25e33bf4f52aa24382df68d85b6d83eb1b45134673b0cd39a191b9a436d152c75c05926171377999b25de16ae4318d3d41d830f27e2e697eff908fe3d8b7d54e85e33d9471254d3ed4ab78b61a679501eb69008d474fa97a75f4873163ddedc73d54f2e27177287603a964f5340b281f15a5629973cca437a9a4590d5be4de84945277afeb87f7a06bc8362b6e33bbbc25c88f9c001e928d489cc5e5c4f8d4ae7ee099099701eb24b165e1095c70b0504ba81325d4e9513c2d618129e912670a232bff153655cc89eaa6c8b94dcf624f934b4c14912346bed8a34cd644a0528b9d07866146b8d5e953df197775ecff88486ee8cac7ee44d35f6797c7ddd73ab937e5fff1bde55caba7886a3df134455b034dc09725cc744b6badcc0fad6a932b818c01bd727665e2bfa233dadfad57a63117c00e72465b15a356e554547708234242ef234ced36c45e5dc5cc484ad26168673e294ed5529d3040cd07cf827efefe2f60c74cb5e7d6292e633f28d16787bb7ae3ae108db60f9888b92a24096bede894dda1e71ad689e6c0541e07d1ae98a777a4e2030e4fff6be7fafe49eb8d1f7f65198449e0334866af679e381c407d8f973a788c4fa4038a613189f8bc798d2507d2108225966db0dfe126890dc1e129cdf340042948da38cd66b083fc96d8bf6313da5ebde8ccce83c1ca6fa09017cabb6445ee9c38466e2097514590e83c312b23624e29b95a648b0d3f5a09baa56223cc6d5f7d02350404286819994a858248fe767917c48e050ad1397983a198e742cbd74eeaf98f83dec20548b008c085f8b8004fce189dc1d904585b2977489f41efa5b1968676c463950967413b908aa0f2d92958d968b400f2dba1c97a3a8cf9b2802040b1d421485926f8ec02d5707e2abee4d1a8fad3756aaa218e7e0edf5bd4187993387dc548b3f5f409005a9e89c5dd82a304e8916c9d03a332695384a4d734f2e0b36961859a1e9c9d9ef3a30ff53efb80c811eddfe0cb52158193ad93e337eda20d29b57fca98e399adce51a24001bc91221319f8ab5d80bb523a00ccaa1ae00a60dea0c19ad5a32cba5c7b21f9aa75c947ac39143c5e481daaefc80fb652638944a4786da14887da38af56435b7488b96c07f4b7d9fed3dc2ca5d94feb4f8b2111f80c0f4064d854595422339a608db78436b680de27f32169dca44ca2329885a9cd206cf7920b18598bebc7ca8ec65574f3c7de932eda1dd89fecc4ba88efc731febebd311f78ead2ad51c4a4f37fb8abb351d60e93b96e8f9864581ca5db64a6f2ddeeca41240531c6d204ad6c9297dc31f16de826231e5d6f835da03153885f15cc26821498a89435bfa50e3e43f9f8a3fa7553f4def3931c8ff9968412e2cf1afec8e681d81e0c59a9d73122e40ba350256fc0d082943aa42003f1d4052843a2870a241200b5cc4d4e896b9586395926034006a8284e0d34890cd751c11cc58451740f544eb61e5ad54738cf17b46b2b22cab8b08db32debde28cc211408f9dcda8a19a016fc55805eac2568f0d42218ee12ce6f2388428c89ee562b2c78a24cf6e003bc6185734a30ecf8034786444d0f36604a9b4bf2ed02ff3de2b06df28f5ce53735044be7615e95d63ecf0ba9d8f06ebeeec7310993621d1538c9c6aa2df161f96c8d2668eed2d332d6d9d34b7b0ba7a82d37301b5c55f66d231b427c51eeaeefe131c391af39f1d8c42885c439a077fb1e447d9e185ec2d8967b7e8db9786afe3ecfc1ea94c3025ab8204b628a0c685856e641af3db0434beaecd4ffc4cb2d667c78dcec7dd16e91147ee656ca5230cb0813f70a39b6ebd521be11163adc648173d80705bd8a2588a8392e4707bb257f5355163b6a1f829ca8a43fcdb04fae2b5278073bdfeb745d46a075533621afb9644654dfc3e49a1082664c82d957f9bd025d5f4b3be30029dacd52444c90a0a339c5b348982422713fef0a74304d960394769a9c600698113dff8ab4b107859c08a9de9ba4492f56f131e57071526b65feadfd55620699016b328f19dc68b913b0fa86cdd6df0df26e27153cfebcbaebd4d8b43939ea66684873ca138c78735b9fd0931c0335bc75d8ee213c5b1315cc11037b653a23b0bbe505ddecd13812fc36a0599cf24a3e232c3fa16ea3f8b6e727d90913f61be6bef4164ec9dc316f602847ebd049645d70cdfde9dd564dc5793630ec9b866aef7ed8d279549a7f9285dbe2984381538d9a3bbbd90758bd99a7f9bd0f653c7a9e4a7f6a554f2e07e942837bfa2083df6168b4b1e1871f63433fb844fe4ef25c6a86a2a5b080bf3be7e313de39287d8328b530a85790a7cf53631a480e00067bcd325d06e68989ca4092808929db872f5b9bd017210cd60e3673e48dfc910ca7704a01d739ad10cb80691c19eb0951bdb7e9e546159dc547fc23479ba25abdab0f0c724db54c390342522ac456e4253934460a57cde8e9f2350e89efbc52684d990bd45de281d70bbd1f4a15eb237934fa16d155a8e521187e448827c9a58af212f6bf2c234b9d0081972851c3381ee7fdaf3d12feed6e82d0815bc7142b1ebf9d6770668d03a43a22130823a67b09a4b1bf00238f469e5d8c4fdd31e31b9d221fce4492bf105d39e8b0e1e58f0de036de3a892fff0d81f0884898399f9b75501899edc4e7a0b3f3f9b55f580a06d31e099dea27b22d0bf55e17bd5ea82f895310e76e2f4f8ca42d432db81d3b62233e772cdd0e06a923153a3b748fdcdb53e3827c291201f1a42e2c8d390fe095aed57ebfd7d747a370492322a17143fa191de877113dd233fead29a1d431a814b12e8da25a2dcc4dd9d6d4b8d38f6f518d30dd251051105f73ebb980f571ca837493b6496001051e3e37a411cb1bf1631399357a49a3f40aa146fe2b05ecfc7734bb83bb79cfd23220140a74ec8b47f424070a094b0620219e1ecd1583d8331a18acc3523262ef8fe3cd52246eba2b650f99a1a77d73f738d1592977667dfd84ff911fe313678fa9524cb5e93d69ffe8c0e3b23cd74dfc29f629f6ed6480d75d88535ec112a74d53ea1a607f3121e9dd1bef5ed3745ecea01e33d4b66779eee423f027ba438a774d6dca9d87c87f5aacfd8fbedfebe16df02c857e0f96a8b2ce7d7d44813d1fb25d55b410732a9a5a0838c963dadfe5ee586b46e6f426bc4b1a0c356300f4c54a77ef46cd38bf7ac234c43dc9c56e857c137715adabad5af331eb156a022e7c80fd3026ea32c0880c2924698030f0cf43999df4e0760b13d6af1a4ce46b3ee79336f3f97fef0f0cde22d6dc2871f5aea2c71487edcd50e160d9a5bb3c8a8bcbb7da77c9dfbd0efaaf0978e8465b15a135408a9b713f32f8b4b1bebbc598381c007630f477d4e492db7fed87b0156b3d02f91e173b1f7b0d52cdc76aa16e8c8809bf98ad3cec59ac5e1ed0bb0808c358b8897ac26afe5d5b75c1a31347aac5938e056bba1ceac59189cf204735cc1e1a2257ca9bb8103351d5d91fdadddb178592ff171914a92e422f34136648a7b430daa8465f9fc396e7de3f70873769b3f6338730dda2a5825656e5093f4f379ac20fbe5cf4e17baf139061a3b33851687fed2e93222d3900c4e7b3eac3438e8c12389abeacbbd5e7b6f8c017631ede583854496a01cd990005c19374c12244e52abf1ffb532cca88106700004d9d25a02e6ce931e0c10d90478063398bdaa895160d9573810136b24c6c46910c6621d75edc0c39452b91cfda227677359fedd083cb98b0627137620e302c9e942efd24e2881f5bf7cd58b3738200781631298175ed6e904d47b06651ea77c4cba8b623ee61cc7e00dff38f64dde731ba2aee064dec1e74f132ea1979bab1417a4fc0f4a8a88fc064e22d5d1c3952c80a45ddb4744c73a0746e6481b661f68d16e8dd469baa34e1ce0e6801d95ab23249081f88e57d64eec1c208e8340e27171dc7477fec8cb8596cdc560632860725d0ca13f35c2482ee00cf87d33a126fd938f852d6404b5a5a4864d1033463c00884af044a1078497b64fec0521efb08fe67d58c659f374a495973c74386747e59243857c79df5e8126502c034f5eecf0ab6344fd9eb3341f895f293e558c905a39f6a3cee988ccff326a9f7297c813a1d2900548a26267493a5dade8a916a350eb217f8194c41a7a6b186fb0c59310b0469d59890ef3ee6952bcaaaab755a74433d87cfdf327b5772d8e85738b5b02fd5a43db28159c98f66b35892bfae33cb0532735c5ea749ea638ad1a32f61f32b6925a0507361e6d80fed02c870346a695c8ea2e687e8f421139f043a0025d34063e8c538ef980c0778c50ca72be47d5e103903ec79735a9a2ce7a710b1ca08afad52bea618310251688a1c4c210f56b83ea6018be699db604d74f810dcf5b36fb92336757ada61519990d2fadc31daf8cfe062476bff31cbb628946f0868035c1449ea73b4583b064f1ff6ad5cf4052d1fb0e7a4a79621a844645b40ee6a0867656016f7f80042fbd399b2673980c54d92bb404e823e349fa5dcead8676d9d32e162c0790ae29f5f5978f4845b54efadd4a687a8c91adf504e6909e857069f4069f7fecb1b779acca44e8ca0e3c0a62b73e7724e0e7cbffd9daff2288c694f5220cf66c12b5e5ce32707d8abc56876e7edddbfa070fb869485d458217e8036c844c33f58d5c3c8b687ec1f67151ac0c5144fa2e788f3ce4c1a879a2857587930864f50afd90087ff30cb654d5c3118605e837a4754f736b61b1b3d4327412d830e764b97f5f248a25acd9c14380c512ee160e6189c482ff21ef206a55772657f8aa89602d6cbcae6ac4ec66478b02d739a7359b608a5280311cfe0bd50a7270714bab5ee2563fd6bb4974688713b9dfb19b5add3c3c94d303a6946548ad86ab4f50c3e3734a42316096da87793ad44855371a405aaa526756b111446ebe58a953b810cb9ae411b9e26b2d96488f46a3812fd0d7c2cc54f4d253cb90a7cf57ac7a3b114809613e0e41444f3d86cece1fe3e4ac4626251d8508a1ca32df9e7a2f45c04960433479844ac4c673a062e50189025a24275ba16ee423001c0da587c75b41049eac5a4657f1b5da474081932839f05f830b4c4252c198d31c76a8de13e1ea92c9607fd068d357e98faba2b8eb6dd6c851cccfea49e3e82e2404d01ab62ed2910dc0dd42f7469df3ef950f46e816c41ca2b257590cfa68689f0e02a64cf89baf5b65c10714287d00030018a7b079cda7e549f773be083de93126e2159b8b1db9d3c22c8dfbc92dfaed99ca9018ce9a97d93c02f2ecf3fb757569b5d1214c3bd408ef38385df5e9c070f2e80c7822e22d22844ff03da7d6acfc70e2c7ac9842761b4e9035734e556c68943a7ce9ae23a9284cbf3f6d817aa1b2dca4cf077ab404a600acdb1160eac12d1d3de94b70652e105e5bac0a1f1beb31a6b2dd04203ea08730d6386062d76adc4b9995b6a450e088d45a4e59baa9d2145583d71bb362d43c89914f89dd49a9ffc73de8b256c0259263a1c27c8b0f2a633c0eba74ebcb953bbf013f143055e477c9be83cbdcdd70f815f11b499ebe55ccfd491dd7d9a1276772ef4b23a5e383d951915bbd2f7af89b4111c05e3dd87c6d1e3c497aca5a2007ada7727ef6fe9e606e92768462712430c663c50f05cdada42a3c0237ef3a180ab8d3cdb9729c7cb1d4481b4c70d8a794c8a8393a8f753011215c65d3cf23f34ed2f2f7de42eaa415b8d1064e20e7a6f1790fce533d10346fc359140dd80aa949d3c7249d8631edc66aa2743845108a14d4ffeb0c3d1b613375f988e7c5cf5caf0fca6666d9421ef45aa83d373d27d4c50b943ce6f2d8e0d4f64b65e1c6f4d4949825235dea5df7220e724c815c015f91d2bb76f1095e1b4fd0879f195fd1bbf80cb7d4bb5278ce10da36d404f1038592dde6ab815fc3b53b576572955e8e8cac234bbd1bc5b0208d439e30c2aa7b840ee6709c90b00f49bd1b2b29074d60bf34877b5f7b03fefe1be83e717c03977a57a41d03bc7ac0a318f4b1dcb40581677246461e7a2b3b09dd102c489c4c4aea8315fc80c7bc80936c18145f1a79d3d0ad863e91582f44be413874de717d04039276c7db09ae17501b74bc6a88872f3da77af507fc7ecf718b600e8d7985efcbb71bc8e5efe6daef6f9ebf93f7b90b5a851f668b681501e7136f19f7fc1d4dfbbd2ac60ff7b4e95646368cfc2a98214b874bd3e29285a6a353a1e3f4775d0d3d786583a18d5726eb8c4f880458b1f477821cfc425fd9df2d771070c6c49d32db286cc25ac29b028062e476d327ef6462bba0e8310ac46e58a8dd85fd59898562a6cd77c00a3b15f38050c44df31ed6b379df85b63bb53ac04b823c35fdbb5c084324c2f8d30b22c1f8a09b1bc390e4a253472c58e076bd84933d75a34a04dfebb4a75b2aa0128969f8e7d17014181872bb3213292fe14bdde58245f0866e21736e4c857cba9c8b12ee4758bd1ebaac1094a31989795fa9fed309552edd9e5dfa27ee65f533a4c4be5480ebc0fe50f09fee442febc1e7c3286317c15a9f2b68ec3a64939c665664d7deaa0c3535eeb6e4e8c7fe47e1284245f06d34b7600dcde5f043c533d4525eb62d5987d5b9ef7ceb664cf3bb6ad98a3d158c33b2ec335f3fdac9c827b027dc78e9badea484cdaddbc485ff44fe2db8c8930950528d5f4092976275afe4db2d4dedc8dbc33a410bfaf9e509268e4552b92b412a5987b65d314af04b162a0058fc4707290c522a968c194cec858e551b8d930fc2dae932e576ed84c576006f99e8c3ab1a2bf9019eef78c175c4afedc17b34d9086f2debdd9989ec2bc1e20cbc6ee9eb745de611f779a93d83bf620c87a55045944309f78dd9d7dc9a627eb3df7817b14ca05de036eaccc79a7dd91eb4a40efa15d0bfc48156be6790f48d6a591b11d8aaa05b3455f7460bcb03efeceb7f8fa2bebf329f2bb9b01bdde5e1142bbda514209c562cf2f9cbcdaee96de54c4c6da9070ad7f4b770b5c2f25d73357a1fb17fe6708bbe978823cbcad0cd53e800f8d622eaf0c4fd669b0d53f3e861dacffb0c0adabf57db64d76c56a8fb167d36336220955b5776d55119b33489492b12700952d179a5f2c964548aee133826e15267cb5f2d828075b6c068403c048773046fa790499ff49a3bc6ea255267a4f602619cb8056763560dec9418b87267034f2029e40638887cf3e9933bdf6b6c51fc000cf80e1ea9248a2f8ae10800e1c4f18615bd30afb7e4eea14d9fcdee6f4704f98db08238beb6002c120246d86446c1037f97b80d78d694fcb77dfc90c54d664f5653b939859ea1d7a8b20ed7638172ece1fb75e32d365b417f03c503be98d864e4c91681129b6a3c0d211cfac47a5d200c78ac386c4b1c8c78c90681536257ffbc6c25fc9bd2a63723e070e697555757268743ad4d375e6224ff10bca46201a8f6cbcc7a84714fe78ad10babccc163851a94fe8d3713419d68934595c322c11afe2787d8cdd4f35847c0f3a1768f489b94a9487102f74c8506262ec3d445929d90742af5598acbdcf11e0595f6a91d8c5e77659d472708725822e5f51762e784be27606211075b10d164a278891df41813c79f5bfcd38ae93d74fa28870b71245a0a02931a5072e9a751b252e714d8f43e5c7cfc234bda6fc430320312fb644f83e32089ecf550430e0e88d0e0e7c361e35fec0248516fc30ffc64377e93b501bdf878942e2f58c76af7bde27630189f69b4c8d97c1b5431592cc5d9ab4af4b6d79ff115e3ebf43f54319321db98209d180c3833c0558a389ff244794f58f3b76a73386c1e708378bf0cf1a43c909647e556994264a50e2ff0fee7606229a70ab61bd5bb981e4563de7b95cc14c1ef3cc4d22fcb4bad2e506e73713f6bc5e4a44d84e68e843911c0adcd5d84e4ba50b2ba30981e4e530a2f73b2d9ca06362ea046cf7413fd43cfba291474fd943da72b4787336c16ada2a52b77ac0afa25eb11fe6bd5563cb91288608ac341b76f33bfb3bc31d27ab1bdbfb7a1661638b9a4775e3156f34c19653d3b51fd23c31ab8d2eabe252f1d8be6f8d819b4b5176571038549e5bf9db20c35a1f188aa7291ef5843c2125b2dd5510cb2a48a987b4c9ec50d0dccdffe9e89dbdeb4b3a20bf26820d24cdda5d1d2aa2e94ca1ee17ad6d1ec690d533a154c401abf79dca74c9a4ac4030a6ea0cced1ba560bf8567e8b3308c45350c2b3e2d377c14e2508933fd0ffebf03a5c6f768ca9315903a0ab45236951fcde83f367ad91adf88d8844a0c72aa76870b9802115e3e4278158610e4e53263044f4eb7dd93c2639c632907cf6f40e2cd25b2fad47d6373cd6d5ef2df94016fb9a2f3571ea869d81fcb8cb9ac17fc5f36d4919f133ed41ad4311475f2ef5c16d2614e516d9d6903e7e5f2dbfe60f7e59b3e8a3d12ec3e26b271cf02f411cfef6a4b5d3fe5450e82242eb7285fd343fe1429da42830033c41b860875549276e381fdf77c5b9e73a780983994101a3039024d01791d2002bd4d107fadb6838004198ffd61f4abad359d5633b8415c1517c199b43b3831b6152c0bfbbf4b1716523dfaa14cf8f5043f219cdfa5ce0c148c7680b8e345fbccc46865fc281fe53dbf72dbda2d14bc015d4d4c5bd3cf084f597f0e3663c3ad528d3dbb39cd940e7cde15f521ed431906b002d28cda1fc2d863df1b9372410b5b455b2ace9f825f071e45247769de663b7914efa27de7fb3334920bca24fdfe286bbf3a4005ee90f8c70960107e719421415fb95c8d6a6f19e53676b2e7f81b2e90c98cc2aa937bd0d81a35790bd9a5e8652fa945e529a083208c546cdbf5bc8847bd51a7c3aa9bf38bf7a9429db61d080bcfdcbbebba1d48fd5657ccf0a748a7c6f69611caf2aad63d10b09cbda7ccb1f6f7bd5e9048ad611635532edf6e0b3b4bb3c714057874ba0880317e0739ed480308fcd3a877f8f821de631e13535d5675f8388f1febc0f5a86469770a155989899338c70687f30de572f685d3b403b3d8ceedb8d93f96e131f4398aa95720df68e32d81aae428a03145fa47c43aa09103ee6daaf18934d2a8bfd8d92de8c729269406e4f252700b59c7181f81333acac025ee1f55be0c0e1a4d0c8c100828230e427ac3bc7301c7e38ba9ea79232fecbe1a34fc6dd2070c71fbe9bdbc43683fec001bf6812d51bccc2aaf9a1737ff5d658b90383881c4e2e6a37cb70a2266d1d8f2aa051bee25136d7a193075ff2192c5280f32d58457e983a6475e1a5ca1cf7da414ae5aa44005000e6f6969497556e12b0b56729d7362b96cb0711218da66b3d1f39b6113d1b1497c8ce4b6b69f5be59a4ddbc7392af3034f19dbbaa6ded1c09e8322f88a4640ab84ac8545f987af5352db44476a4bc04d3706936b40aeb72b668b96d50bed8fdb22c0bc1168191ef40817f192bbc46ff859ed6475e60cf1d3f65ec3248215cf90fdbcb2216225fda91d4a5f76ba7cdf72e05bc6f4f885da194c7db121c01e166052f6978099ef837ea4a012bccf94f9ac81ffc0cc723e9735347ee061fbb38900268019513e4078a24ca66f8f37dcefe30071b1c608ec704f8d58b5d18387866a62316296eab87cb29a06d849009f2d47ffcde45fb2d491e78024e1d634b2071a606f82fd77feb9cf5ecdee37f1b9c50c5d66d615e412bc4f43a3ebcf95bf7eb95cdb8e5bd24a4e2d438560e0966f4742185bc7557524e8b98c49315f5e1c11f4ca5f7720f3a346e7635405b871d9a24a483a8a130c560be62bf2aa1c041429082a79a7350abcd92beaa875f9debedddb6defbd04e8b638b4fcd4169e2036b0f0b89300534a4dc236c80e1895c9b14bcda46cc2c8a031cc5aaccbfe5c3a2deff7d9183ea906f12a930b74c6ccd95022b36ee7cd09645209476f2898462a0441220e3a53300c93c7219aee931ebb68f821149ad0734cb6ceeda88569f0d75061c5dadca662d991d9c783845e7419f4d5a14e82b97b548fc3907bcdad78b229c293450bd2cabb3ffc537c21b59430b073b71cc05993f8f6525e3ea8a670443932c2d662b9b8f497a5478464288fbd5cb8958134e659988028e3d6b630857cf3de93a46dfb3296b20b22ecd9a6a790a1add08d38e8f16d8cb5cb3c1fa69a979c75f730eaeeac315adcbd2c361ad41228640d7973649812eaa9fa4540a53343ca4d153e23b56917df58ee4fb832e4c80f309ddd5d973bf4228093a7d24840100221a203b49c4695ea11d4cea187c2e49eed1834a21252f2d447e9c6d47906082951b1c1d2f54abdda558211d3852f26a08f153f4c1ad2066f3ad7094e978cb183a8447616232ae9e73c9bfe96bfd51e4b269352acedb224469d98b205004deb7617717ec14c8a02d35370c2a89676759b8b6b03356795fc99486ed87e7d40dfcba901b546f980a8dfdc020839356284b086f9400b66d174701e5df10982a92a1cb73e561bdb9572e1c7b88555bf0d9161f149b31c01e09c5774e54c1d6aa49a0b8c9bb89e5e18a71c9b22a21c94f6e9ca1a1a594f74323459c252ca0858cae22ff9b33a7e5285e013de49e0a5814be0af54229ce32ae11ca93b6450d1345cce86b0da0564b9425d308fc83911c859a6e6240f3a61246738dfe38e550d0893961b91d2205877c606726337ff1af072dabc2389e3a916edc1c82a17203c12856b6815f99530545a1f944dffbb31ee6c7a0130984cff3b5ba27fa9a945de34ac627ff5f2ab833e82c2ef7f2e4ca75e2f4654a32ab194de8b75d4e94e44e8b8d4119ef76356f96a643d509799238c3ff08418d68a0913dae525358436b17eb3f1f277af9a81301d681ba2de134180af6dbc270155f4923c9c786ab08514817869f15c6c8d86aaa42becf53855e86b581d3d2e3ea94fa9e168e04bb71752af5c468720b6b6d7a623d896023951f423224586916a88d17f65c7d6ec1d3351f49961c3579f8453143481c4748a7b8238d621723039b89aee8eb4bd90bcdd6302aac59662711811037e4c161c14c804df328a7bdeeebfb0710d2062491ef1fa6a24a790e16b56791112147b217150e855b9cfdee7fe93e9bb2531ec3c726b58963e21fa2be2f514ad9f416f8b89b7d5b808bdc9a6e639c874b42fb499109f8ed4ef4aaf17008f3f01377f2247aac386da1f85a7b641989c62145b725a9a28732b5bb085a529922fbf5f98957d10911020edb9c247ef8ec1e8f4bb60a223054c658f2e05bce077ddb22a99ffc02af330dbdd7cbf942f2afedae80e17533059d59821527f5e0aa515b3cdb60c2244306cbefdff37495649360f9ac2204970bd56526f394476379fba68881016bfa5056a043c78dd849aad292764518397479571ee773b108cca1e5002bce05fa4d8229db1b72e2c1270be26ba2da001d121905e597381c089736928bf5d1931bfdaa949ba5c006ca5b897e72a45746a96438ad632e955a951bc661be1b54d71223809d2cdcd22bc766b143dc364046e3c20a3e30c4195e053b5056a61e2812b397ebe4a36197b5cfa824bc88f016d8cfaaf1122df4d3eb9de36c63ca147cbba0cdae56917110f82735efd3209a27dbda2710c1a0a35b84aaf2021ab5c85506c6773e045552715cb4efdcd1601eff097df21aba258127514310e47647d073d84113a583e65f3ac0c0571b3b06d6cde898e8981003c2cfb3789fd9aa82c1777e5d6de517b82c9a2653c4dc518ff8c85ebb4d590aa61889a0b037664fc7f64219dfd46f78ccfc60cf382bace7e5e04c58dc8f29fe84e8a3f9af43b8858bf24ab47a8c4b4c2660368064c3561d3abb1e604abd5885a048c1ce8b7fbe47bab87c3c192a19252ba65f72e584337471e41e87c3a4048a64fc5b3250919c879797a752584ddca1f2b8c410cb94f8672ffdca56f14e6f2aec649f6d96c9d3226cfcf342e5729f796c80043ed08229ea01895b9587135cc2aee1aa2e7f52283ec683a4abcdc4765b9ae8e29e42ce0de3c32cbb1bc512a342c075cac52d318ae17066bbb6d48a6b4fb259a54c910bf63252d7e2e80dacfba0ed6bf652719eaf6c4e24ab85ff69e549ad9bbba69c20799dfb9147adf9452c5c84f2a517bed8ab7cfc1170f07a124c264bdb90986ec81dc0245c0b2de2d18c3ee0d2d81a5f76eba659348e2ec1b47071edc103a5569bcfa5fbe7dce6403b56b113f074618c691b8866e77b4515b4b0d8eb1a1b110957e6f3baf4ae33d255dad6a5911998f8aa0da00bb522e7f1b70807758876d88d5e7ce584f0a23a900357c31d069dd625bd800b1ef2bfe83d681bf8d9d4e284fa58faec4ef9db3ed5434eea20d920d0b4e9439f5c112f06d0b36bc9fdb768eee45090d79443980ce172a522a4c817d77d4d0f37a867ea754de4b352950839a7a03ef82c22681c1f92b891c43cc3d95723dd181594fd27789587810b79fac780e82661ef9f0167f63e9bffad8e3b5748e76e90b0904d64be24076f29c0923af534f98bd4dea18f7048d3299e404d8b530d9be2747e9f7d5c8b5fa4ad41b7386df8c657642649b8d938b50b47e6f45a5097e3be3fa1b6a79807fa085c7141409bd5ca24da8d853eb35779010f0f06917fe7bd334e08b405f398771812382e6faabf13c690a7f17b1d090e121d1a853a005f1210acca8021ea28965b48bcb1d2a002352f7136c679295516403ff9c49616b101c0f93b28093339f3d0bd2768b3c8b1587d6af4493ff00bf2fb09dd32965690e38057365b3afa758037fab58ddbe37507d8d22e4f00e0740b1e9d1e1d3459398982bb9bf427bcc2d94f700ed30de927c38cccffe6963180339a693b641ea56ca71a0b1b4f5ee599fcd665f4cd6f8b3f4e7243e547031dbfdd7264b352ce1bef3bd0f939a55c611eeb8ce5c292f464e2a01da83b6744b0ab5982e7e5c04e4964747a3df8d5b7b9386aa8a96e7e47bc26605ddd274d3b2bea0e154950499068329d508632bea806d53d9d74cb0a7db2b6e85e80eb68a42c9a14aca8f10c94801c7feaa7073ceff753d61c9332c07aa14dd1268477484e4192857681a1fd23a4929fd68685104861acceecde826124842814bfe4d7ade5095c110043df02341008638b76177ca41d37da66fa33bff23f7bdc5d4af8d2ec110542c7681a4f8b97071d1b960bd4ae9ede4af2e6c6ac6abaa58428129882af7c2d0e0fdd05ec54a983c4555371e9016be4a03fcd3b101aef2e6d72c4b730c46256e8e3a6148bc1a366536f5e67860f622a895b1d0a1b7b88542945d9fe1d3dc7a8bd3c5e2291ac4c1750736abe283d472b1849d5980c2aacc4289a8302b240535ea75d78a6c4659a8645424f9398530c8f55cca49aebec08b401be6cac4b92cf2090e3c20da7bf8c1ce4d608dd96e442a0d93d749f1c8fd469f1cc1ca439236ca8939d13f0221130f48ae605e42bb4a6ada107293600e7ef87d20cef2553778a4304f3050e73d48ab7df927832938af76a9130fe4522ed5fca7f00ddb6dbda678716cf44b2105e6ac99e463c295e96f1d84bd599e30bcad94a4058017009eb0fad67717b34d8f7c793bdb7bd601d00ce91223ba8f628422b8befa8bef93a330440e7d4a5fd328121aa72dabd3a51cf688b502c82e7975668e8f1a8cd3fcb92597097709e153dbc5cf47c26e4874470a70b3d8c823ca00c5437774cc28da19760dbafda2ee83477bb9faf22c0f3eb969d2ec0eb4e34d375d5384f3e5a3f4289c82e984f18f942c3ed56f7b743071f6dd8e898dfa9192ac2c6f1068e422814672e656d71d189ca8d481b7df591e1fc82229fd8cdc78f208af4e038a42f64d829f5ffe853939fbdc15b4a641708df3e5a2af6ccdaacd3a16103d15b88dd407943c7446b1cc7357ddebd6c686b70752e6b4d651fab50983ccd796c3bcc07a2b36bb4deeab022479a81a16955ed61945f6e708edb5de3d9ef471e4df594288181f7fe38f0fe3afcb05c2c9584b241df60e520066b422df223eb1560aef315d7777b1cf164f7cc34a4084c8ed6a45902f10a032d7307851ab3c56ed819b97507bd9b5b1b117c31ed428dcbc0a1be779826db062863d727629803d6f1c7e08c8762f600f067818694696c09d87fdf12cc664cb48be2146690a1d801cf797f42dc5b709562854b1328f8d581f86a4a5b95d73163b8da0716a90257a48030d4267b6a89631960443a3f5502523a5c4eaa693d5a5c714b44ea734851a16dcccc981cfffada716f9f82fe025425d3089075b551eadacf0ef7c19a581cd85c3321d248db5f14ae9ca63b3b35f4c689992033d460392b85709281fd4fd92982c5e9dea7b20e4622782f8824146f637389256be2c340424ede8769c42a810c9be8e115d06cd4cb2485124038227f61da659ca30892b2bd8dd555af1318ada4702957d0aa679c84b5c4504edd050f423bc81de047c0f168cd7e1338c2abd6fda10ab3922d56638734d7c933b6a500e52ea5ed333802e8374a33bb8caab844a78d9b805647c14e3f4da98339fe18baaf23ae02d57390dd93e8dd7ceb2cb899bee516f627cd5258b296ab98145aaad9b09336d804252e0b7802150e8c168f299abe79ca8f7aa019728b7c6e57baf9c89412586c8036a3480819e2cbe9654d22dc93ac971f11fd29e8e4ab1526e59c7b31008d75dc78a49e9d3aea1dbec2a1a9f4df43c58b8f029b33511417d4fd13769411dd0da9d043bb4745ccc86c1ca0dbbb33dcc2ad8fa4d1047fc6e50178890d50c066393bd83bc78d9155dbf7a466280f0e6821aaab6abbd17841405cbd05bde1bf57e1c623b9cc3ce99792e321332a634c1ba0dd6da091e69917a6ecdfac90c9648342781e2bae99da535e6dc3db2574fe03ebff83f990d03e75c6bb1f60e85b404ae9547aa946ef07d2cbe99948058065969df03e235ec6f2afcadafa3ec9a421a4ad11b69b70d6452556ee81f11bd4708b9a4732c1ccbace6c7d31af613c6f2673411201edc1b5ecf50cae083c5f38b1ce9f97b3ff742dd6a3828d5e49836c8c0cab3272ce29a98c43612d0944400ba85d80d09a83b1ece8c4234e4d69613be9a42597b7d1530b1e057210dc55a5121463bf51d312c2b79571264814576f458bb567be00d223f9b47592928fd2d41647fee9a7606160d746353c71629967cce235b44a06b442e6588f92b920ff5129f739ae5f3259aec35c41abdbf9836031717e9ea10aee08f3af0a78aaf08e7843cad1d229ac9c15bae0e6004af8e215ec0ad929706c3412036a99c544bbb8f82c0cf823ede1aa5310da1b0c44d983311f58e879a02047fb78cf5f4cf5cb92d0c8283733321d65c9eca657fb2b113ec6900d7fb87328a7a3e24114250103f6b829372871727a7e1c3d54beebce544a80c3d87ed872ee2f0d99e1d1f04c4321e0dd77421c29658f14c64525b54de3dce2c848e4b2010ea06fa8919336d7b8dbc75466ed42f7cdad42fa2596ec59f55b57ba27359df56cfde9748d4ed2697972c15693c9589334f930ad1323505964c18a9963102f35842dabc2a64db9cda072a770cd565e446e2f1bdc2f4e4427d0d8c28884c66a04829c5293dd546f223c4c5436246a434a8d528b89bfd8dcad0eeffc4f56ae000e3100164ff9c4979b1f78a6b26f0ab7f6f895d261e0c80e44e3eb94600dfcbc7b19befd067da6ad5d384da106bbe24855e77dd44b9dd83fca49d7bba228bf5d7b7cd37dc799799df8b19686911934aafe4409980012f202fa47e0c0c68f747b44b25e7de7d023449ed1acf59d7821e9342249cf82ffc56b0250a1d2d3ee8989d0a5261cf4a9e368caf9ec79410ce17c96e48b11b10c078477458c7d78963b764b2fbf844fb05ae50c52cea60aa97b16939df28aba27f6b03a8761e5754ff12453d9f6d114eead388896e133ae20369df962a56d3c0955451b303a00b764a5c10e1c8fbd549c487a445bdd14f8794305289854dda7ec95613af0a0bd3a8a147319c40589afa89ff8fcc1f6651ecfe9a47093e476955e48d095b23e2ebcbc9f0c9e0662136209f87ee5e5dce9d97e88e4ba1bc2bacfba7e34c4a31fc13cd0d4d3e503f5bb25449e6b55050e6467357711cbefafc68beb21c0f50ed6f71cbc89c658f607ea6534413caf68eba549ff32338a5034072f4805a8c0992dd3a2938372a1e29bda41c623f843648b524a96cf6ba1b7733db7038dd865830d59e349842415a737c5ae7aa7a6fac46049e14a7af0077d7b28c51cb772250e4e4e2ca3201874dddcfb035e4863c854becfd793be737ab405c2115231a402a6547f572f2e0ae0a1d479b26b31f2a58d92b398c08b39443a591cc13182abc63a2c97b94f51d5a15106a192eda2ed4eeccfae4f58b09de6d30f5eb21ec95ae5edce5db01ca4d19a4b5a3a7031ca01300f23599273dc8865d248ebb00354190327b99a7ad2d8ecd69f2b5b12f99ff7a48bb947d88a388524f2b6f1a0c7e33234b9be45c2190f1fa6766ff8d25d20470ad9a51fa38306e874135ab133c6e5d4dde613a468cb666cfba71904c15e7b15eef85721953284e6327c536cecf42e5d328843500b3c8b60ecc807f46d8605c549fd303bd82be9e8a6b3d0a0416b8471a1e0ec46b7784c5aa69e7bb36e1ee438a574e0e08b85021d98282505039dd6af843a0d8244c9adbf86306869f90de022ff3cc11dfdb8a6497e4571663952e27dc082abad66e94b012399fd78e4d574f0dad7caff54405c23e4b17ec9ec8d303dca812c009e1ee9b7a035dbcce517f6af7e726fa32a06404c0cf03975373dbfa83a9980a2d11a04afda62fa6b5e961b23ae1ffa9c9c680fea1320050c60418c63cedb7dc74f78af680762080a4c8c7e102a93f4e94cf89d493850060324cd65e63effe2020df1be11e0474db9e98af98c9a63117a09aed8227eb7b6f5e6795a69eb8aac0024e4bbc86649169a8885db418a69d28741011327f46332472dfca66c0862fa428139db539b18e970957b40786ea415aaabe99e3b4b675b45630bb013bd6be3f78e089117b45ae965cb1b58b405f3e0377e4aafb82b5fc81bb43e5a5e9ea5664dc29ee1303a688e733fd3a79a541dcfcebb29031a455962f047f983658ea195c52317e156201f89d4dd6f5f5ae721a298647ec6634d7be5d6c30f772cea8dd435efd606af39ce8c4807c89e89d080209b38252d089eb6f8051b9e0dff2f794ee9cb7c1961107a6def2d77a0ff186bd859d8e041e08b10c32aa6e3942da1044391c3482d2810fbf5bf35ad9b6cbd83aecdab570399b6f37f6de629bb6ee70cb2e6011779602d312225f400a6344be0b3c5c1969ab369154580ab493e2b7ce4db896fba6d972a015133e8e3061e1a1190d79d2e13c858d2515098bc9db4f431d0f8c03d888c1a67c4525f79ce9bbf127c5dbfc1a49163c4778e758417f56fad4245dc1fee27b8a1acbc4f79316d6518c405cb8ab3f21590cd9af6044dfcdd66382d8794b1914114e77ef01d31db701a49ab6e9df627e5f9c509f713b5493d542e20abb19b8ec9a014bec8e7ef71aa5700db404be165de1571f187771b983bfacf5b9d2539049eb8f6862bc914a2bd78ca3a00c3ab88d91c4de99225aaa48e8d8d58cd19d0b17159b55281355021b5c631d9e91ca0e86dd76cdcdf4ac66469a0b6a4417a2d9f4458632ee5fd33bea858323f2544ae2f6783ed980115e270b6c2ba26f709428ff864d4d44b553ae83506281b8959698746fb496d0484fa5773fd89a54cd4c98a862c078ca76f27daa0c7e5b7f6ebd68a42b778642b42111e8669cef9e8631bdd4e59acaa464f9ef29c772098ded8ca88d95c6a3bd36e3f3c538f201aad72daeb5eddfc16f3cbba204a78861b3f1c31a0d6d9d0b6c53acbec84166ed41601cfc8e80684fe1e7b50079e8f090f973238c66c23fbef087899cbe2b0512b1a65c16606f77ce0be2df227434900e5fba81673aa42ec2cf0a2bd24c89fa97bfacb6a6a445f05d1cc4503a3aed72637f732aaa1aa687bad0dcfd92dae3f0f816a4ef9cd6f453be9dda3ba1d6a33d0c2f6716314a2050fe058f5c1f27a9a7e303e8eb5e06aae5297916f47af2e51021b2abe4d1f33b1543d5e0a7a32973162ec8ef6d31d5e4367342fbd8b74a3dda0e599756157951d2bec7c122c3b99c20967f80970a935f3c0b3d8cbad9bdf152b946254f46a59d3bc24bac6064efdf385c646f466d6876c326bb09fecb3e94000bd6b8b803d5a54690e65070f04de124871076fe12c71962bf707a984018b07e87e99bf9804ccb8bbc14ce58e476135c39e641ce5e66a3c819877c97a24eba1b2c61e4ff0afb97a08d98cdd9969959c72c260363ee4c571f63c477a2d564b3d0317e2e8b718925ae0eb3126a0097184fd1e2cf3b4b2b7fa22265f3329a671fe6cbf792d045a366ca70594d2d49685c63223d7125b117f5388e0572e26e05bd796dd45189d43470d8341ae7761336ecbf035a588885d450158b74d66d7797fb0702f0f740a03913cf83112d2dad1520375b5a8a35e30375434e56c6398a200d9757d88546831e2c6851e57769c8a74c0f41afcc2c9e3f208b34086aa0ea4760d365e036e8f294df0bc448deee5ec5bfcf144104bae6f2213584d47ad382438519c9497891aedddab64d68ae010ca78651173a1c69c3a2463b319682a07142c9785c79ae928fc7e3b5aa08ea94a6ba011cf043d323e8794331ab220ef411110424543cc610c10dd26dfef937c9a7639a2645bca4a83813bb208a8eb6159a4fa73129e58cf8e6f6bae91322f4018e1645631c6b8b67d24bcf1d4020d38cf55cff7831ba142f35abcfc7faaa569b71a8d98a6bab086846e662333d2266c048bcf2658e9b3803821760a219d0f989971614070dcd80d07d5af3468188799447ace1b927f196d24c60e1970da5cf18a18bc2ec3a986b46882f0cb40ef4e0c98b4dfaed411b7be2b287b1b19d74d6e5c66001c0de253d40d976a08eb75b83aac695dba02136c4408e9e7ada2f6a9c131b859b91191a072a11e5d36b619db6d667d3b05d1633240d8869d1f276341c38b622e3df5748ae263d187918a90a91bf2f2a33a15985285042c700ada824760cf4c8340d26254f683ad2795a74b685e22951043b9a7c2547ac0ea0c75dd8a5ae1704a63fa82f2403f1a4188640e0506a45fb8b87229cf147a245580b771b5089e663a58e942cd70e016c875fa2047fbc13a9afccd46bb192434b1870814a13ab966e7a1b0b152a4230e13dee9f30d01ddff47f9f9a074405e8b20987c695b4c6a66518cd02180e061163de852b1819f58f354d9f5afbda7b4551895ec093653f876a7ffa3a47aaec9cc36815320092bcabf678bb061c7608094f750a2c3c0dab50c617b42e1e7e43b29a86b3610d6b72c1aa0b5d918c6548c0022852b1db8b541c516e9539887f4d661ac808064026426e08473bf1e5a79640c07bcdac4ffdb8438a67480930d028d776ad98d965433fd93e94ef1061036f62d6a1ab0155620812ba66b6031568f5023f467b7e486f1236c33ca04c9eedd51111ae7e389c2d1bf38783d23347087f80718e9daf046418ef4e177fe00d232712de35efe9ddc20e28c821eacf8b30d678022f463536e042d503acb1724ccb7e0e3a75ab11244ba3277df610ff008a5448cccb835a4688623ab05d3aee5f0c4e7fd594ecaa3a00dd363b6bd42edc605891901ee8788ed438d308183a300d05e4e0531b08ab610d361ace6d45cb0549bfa4aa15e3020f656e29cdba604b03f669c62fa1580a0fdddfd26cf3a1bbc051895e45461725b653191e5ab6c0b4cdf92db3c0b13e8e56a1068c80d36969e9d6e4162a2f3fc45475c654803b808f6a1420f20506d74bc07ade80cb929575de44339181a31fa703812f8bdbae8da6a1190f388e47018880e00b79c4304209b2f04e71f633cbd9977431d7cca55a2757bd6eea04dcf314a79eea4ec7b82faec2931ec63a039b4e0fcabc5442c357cd79d26749da3e8b192363190a1181763f87ae2c0fd17d57cc5dc138fb9e6b6bf253e41514a8aa29ef2b7b7723d53224a6eab1d27c66087c617071b39485bd0dce86141f531353e44b99f69a466c19f52646cecd9faa30a6f0b7f772aaf763d09c58bbdf9c8f2eb76b1e40cc6c5f298b4176b3da9542edb89573517e83283312a682173415649aa99eef3e1eebd60a00ae08e84206744a256833a009944c04aef95da56203e73961d9d36bdd44157a3563d578541a4578c9d42b8f2fad36e7618abf010c283be459280278d826a176a63408978cb300d2003947fabc095ea582a1dd28939122d999d0fdc9a87effea2bb811ccd600edf29fb87ba0c3bea4cfacb9eae1001b6128a7e5996261e6e34b1860b5f4a5d471de08bfc66ef5691ce41b360b673569d81c52bc70b8a27e90f140954cbef785d709b7dab37ea540799639749563b9a5f68fdb18862add0269ac12594d1e83fb3b5370f64d4d2aa65469357da3e1244297c1aa9127fdf18cb5cd9caef1afc0d1f18685a0c630c00f71679968b6600c9ac5a3c5d15d38566b915224a3198aae319ccb328bc34bbc6141808e21603a7c0c14737b129b1f90356ef45a47a1f1e6c4dc1be891d65d9211997ea8300161d17bbc4839e87080bfcdb0ede996d642b6f9b43503a50690527142419060d9e32dfed10e5d19c54ba82e1d9411f3207613b42945dfa877dff9f0e7153602714278cc4f04769d73a7dd41eb5b686d4cb26b8010836755eaaa5de361e7d841f01884090798bdc1d071e6fb6535f69b94672ef447bedef566c41034c11e3bc703c3251f41e22dc5ff457cd762117b6b5b3047ae8543e8e71bdea4d515008956d099612bd321f2528dec9a380f097d27ff767240c04829af45b718e6813fe3ecc2f2f5b9d5df7e239b6768dc00c2c91484dd5364864d3a5a6c91fdc2b0db938c6f9f1c37949cfcef4f89a80b03417bd7b917c3f37dd0e5c4f80061581860e01e6853bc2801e033f68ba0a4f8c45d2a8186869f9e4e25c84fdd852e6a8892aabcfb3fc8444fb731f2c2827e6644386364999a489908a5aa2ef7b2e780f756f2c391b06c8dd1597612f38c86da9f1c8b48cae3dce436d3c909a4a5e03d45437e3b06a703432d5c404a50591fc6de86131bd2d4e5ef72907c16321975d5eb507513fe3d9a830a12ed50c1e3be6abc7cbc62d837485a9413284cbd01baf31fde0a58e265f0783b00b5c230dfddc131d4e1d3a9a68628ff5e1358fb326f8080023f5ed455d30ca724fa50132f8de26fd97acedd606f5d8cef75dbd14eba6e89541573342b131bc52118e2edfce86057f5bc0b1362c508b6bc31139bc7817d891b93debd36e5543fe312b4cd55f07c5906379c39265e017570771d75758a69c50673ba8eb29af674d11fed3a0ad965a2521882f427928070faed159d350e18377e34cdb1804a4d4afc5cd5a6003155c98fe22a145b6b56efeb7098d217d9e3c199ded251aa871c57bbfdc3c6a5dcfc108c53aa2eca6870a820a069ec8a15f1ee5e11f6e6a08908fd8e447d727de91eecb05442aa036a420b19f6733c2e07a6c5d982e7fba8d735188c5612037d143b258ffcde265b5a07dce98ea2f2b9cc189c65cecb42f88e3d9b927a0aa0376ba7e788703ca101c7983ed987a833f563ab625da07dc155967a2534831ba7fe1357eca588e663e38893e10b5641203a3d43e191898815fad32f24b66a1f089acd5a9263f7f6d7ddd7028067fed99e4ab40730c40afd80e1b76c700103047e477a41200b30102d9ad286fd7ed12e88a6370fb061251dad661782e353b2df4f01842a1d1713c84b777d653ec3a99e0da59dc3fe66705b0e42ee870fdc67fa1467191dce9e161766a5d13ce15ebdb2b893917cd6773889e10e1d054d87e427d742060e8c9befdde8927323849fe651ab4a1f372abfa2687f80c97e0ef8943693dd34145f0216a8692078d5f3913fb8f43fb691c7626fd8f47a832501d0ef4bb0de500a7a0b46e11bb237ec09c4c6bccd2f84c0566fee19c6c63f1248f953e9d1fed6d4f075652d2fb147067bae636179e953bba075390c817fa803f99dc513d916f780a218684ee5cd1b7c5e1c4367a5592f3ee2dd1ec11b10cd2b10a07b9a10352c98b6d42d256c76c65d6ed11c9cc6b7becff1671dd923935f59016d6731444a5072c94a8818b8d4b9c80a630cf44e8c8819e0c61f9ec42d94d4cefd0eb3b33b3f443fea84c832c1d1108238c8aa4028ced2674e57afb094fdc4ae40849af56acd688fd41818f988418e9e52e781bc5990bcdf84edcbf1581fa1848dd98c24323e0e351052977efb85c4e1f222da17173d06da60325f095234241f8f599784b74d3a782d417812666d1a0e3dad05897080380940c56e6b9bb0a28f15c1bafe1a51d4874f94dbb1f9e710cd3df67d8faf8688e1aade3980432b03894a484c68b6509ea5251e22079a6f1175eda4267194ae59cadc9799a48667558661228825fca8667a799a5fb794ae9904ce28697a1e9e7f84761ae03de591e9a601d08b9d92d144d61308a5fe2501d71b514a0e633ca5cac0317a21bdc8447abf7cf3117f81e921b5189b86d227d310647a15904ae601c8737c44dcd8f68cff63a93936f7ff3fe9de098d479dedcaf202abdb5268cf6cfc619ba64a69950291565a209a9b141984c270472fee4ec4d352a3da13176e33dba7df7c11931fbc756e3f11d8b59ef4433d70a56d238a7f8301dd2d95f1f7b9164f63c8e1837fff508bd31ebada211036fd0180b9789e9d4c44546af24f15e9f9a4423a6c01033cd108f413b28c67a4551220226e864a2c8127249aa573227648f0f3c63d11e42188622fd5295d91a04fb801915a65a5a4d0fa6292674b519c9e1605dc4bf1238d4c610c9844ea0d2853184b412f78409416dbbce02c7d7367042377bec31cca4376fe2e245136f9d004080d1e06886a85ef6965d2fa41f6e094028a2e2a74d50de4247a5dc825460ba767ac35efdae13ddace13718be8deae1d7ab9531ce229db67b5c3a000d4b97604856e36d7e6fe1ffee72dc1f6289de36f8e4ef9453f937e6f1ec38fab9098261e74d11898af14d917af563b567e9787ead8aaa0404a69029f51c5dc85862cb34ecb96ff07c93f633c053ddf949d04c2ecd29cc521a1205a6111b2bc096d0c9289e01f307a551a68495a81b6b5f7926e71cf05240bdd2cd83cae762b7fa0257738aaa9a7e856f96841c871a9e92a1529482238742218e4a35175a8514b0f126d426ba5109db2b4af27ccfa6152a6e6cb80a6b05e819d63646001bbc41a3238c739da046908c7498449b1964b5ff1e0156072c73295908246013685b559745184f3607a9378817100755134787ac3166b9b8032505402496d89312278ad888be802287451359738e504bbd9302ab4a263d98963584bd6358101151a21890945f3f8fcb4655cc2c5749fc1c627ac8218981ab7053353688298e3efd58c023c5a198180505d9f4d940b8a22f23f5712753c44f11683c626002e83920876f85f14588e2f1ea1c70fe9c92e8e2f658212f8e4717e48c74e1637490c169c06d67ea358bd4aa22881dec2bb7de24312eb548979e59ffdfd3adcab481fcce63b4435f0b87cf29238412043a843eb583b4b9fd0e14810a4bf517c6a702c1a39ddc403bfed489896e224106550095c0e032a0ea6695b30ce424a070a8297257e65b50af8a407ecadd36105c916d561852fb6ac1e1c85acd187dab45a91ac3d50a0047558db2b00054018c63a00b21691b1293715a2dafee424915dd0459c5c6d7d4c6c24641349c8de9b1029a59449ca149f06c4061f0650a4aef8fe150411223043313049528317322aa882498f0c23cbbf4664f9ada005c9d7cafd11c12167b93f223348135c2f26e538c6735032b089422f8e8302151286a61953048da012102415c53c47fd1cb04776ef38f465772382b42f7b2c007bea4ff915a7405f4e2125fbf28552a05fdfd6f9f15d1ab89034495e9492e127dd88e0e54604f9f443803d9d9c4331d61b32555286aefad407f141fde923d79b8f90fd1bc2f6d9671805ceb39ed53bde2139bb822fc764f8b5c967bcb479b9aadc6ff6b3edb32dc337f14f5e1c073e7713e1a7706c128de0cf20f3b7cc3ef71c4661f5f6bb67e3ea73df3dd947bc23b69eb5fad6f7e653df081629b9a13fd4d3fa6c7641e2fba8fef4fe417c509f7a7f134410ca5e7bd58b20b4fddd7c563ef5b90781c83ea7bd7d0edfc8b7490281e3c05f75ed3833309556b74486cfea6e2896a50c7f5e97e304390166134c081242086f42109f1b1150af7a1546217b54fc203e3722a850d8b88f78c77cf9abaf9fadbe379f8d8badba9bf8433df633a91221f3d95ef5d2c7e7e2c637fe29dc8ed3bdcd50dd8d63103a6a70c2616cd71e87e0a7708766b450641d330b7c2b187d2a3c597d5995e023cac106a6167c44357c44485be837c48b0e2b264a579f0c5cb8708971798df182a231b4201a406ea63148308695dfbadbe163281923c98baca33b54006cc0144c6170891900e6b8170174752500489498881183441163c4608c17ec18474473ce39d17481030ac8605a92c406ff624d9ab9660c2340c8356528d39a33445640fcbfd4b0a0082a5d4a17e342bcaed695fe4491268850355aa8b8acbec9708d18355dacaca8c16105354d86ac82500325cbdc4c6a76b002c62406115318659098c4a8e2673c1ac1345ec2a8020619309aa694524a29a594144bf970e21ff97ec25096f651b4b68e4a5b079dad63b68ed838e8f7a8d4849a51f361afaa5cd4f70f54447da456fad6c33ec49e853fb447be96584c086b63afd71052be5e37f1e1fb13545e54babb276e4927f662797bedb1b73d7ca0582621967fb447bdf434ecc5b2f6ae6771901371b2ec05e3f6d773701fdfc579da57eff3b6614feb3c10f24f7d7ba3b421ebd72a078a573c5cfb5e8f892d06f6e5bbd4e6e2c51c3911677eb5f65e97eb1fc790726ce188b3e44a747eadb5d65a2b5025a1c3e4da61605127a5b3693ab27fd97cabbebf67b4bedff58ec2df4199f1acd6b5f918ffbae273accea6fb088bb07fcf3163f5f17b43d988537fd5dd584e84d54f751388b0fa5be741f701088d6327e2d48728dc1156232bce1eb2fade79f0a636ee8afb36d5c1b4fab07e561fdb08abd8bbb0c69ab4d1070863749772cece7bed58dd701baf70b88d3d4b573ddcfe996abb45cd33899aa7f6efee6e1cbbbd3d1064e9a82f62b02515d2286b4ca1bc5a22757cb524dea823bc6ca0d0fadf883057e3e82fe12605c996666bad926648524a4f8b2f78b06a72e1775bb865b5c4cb40870b7f28cbaab964b9f2e1c25f2d01da4922fb53e4691d5bea3d58ce20e6d0ea8cf6ed08ae7751efae98c7978f10808902c62803c53e88b0d4751cb89d60de76767854a7da8aad9594ebc15059672225fb44be47f5ce7323c3de679403edf8102ac1d1132a19a8c3e413ea8455cd05ee4418fcf642afd8a53c3d58f6c071e68ee370605cf95c0c2ec7c5f5a012a824cedaa462287e13f1f5a6db11d6c45d71e77be0b3fae16a60031d105242f4e263afbff8b683e22059450325dc153746575e295daf9b4a088a3a9e4d22527a12753ca01d1e88819a4b863ca080cc980cd463a806b6676660e1523dc2d33838d819e1e504e895e7cc81bd96bc9437b21514e83d6917d28bfe16d2e841327a9173ceee7e971f757dcfddbd760c36e75c2dc964756fc19933bfc81a7e002184b0fc01502c43f885a7c364b8d361e24e8fe931123a113b39feb4f63be75b4193e28e1fa5843d5351ee5838a5c862cd25c71132fc160af257ce8e1d189d2f63c7d85cb01b713cdfa394d29ffddebe5ab29a72e15b91c9397b7effb417e479be941a5831b9f0e5ccd3218470554392975186bb7becd88d3bc2908a98bc6882094d1a26341f13185c9862806595443a31862906494c5f34317db1c4f48512a62fbcdcc80aa385bbe088cd10de4516b984f4a552917911a57a71e48590ecdd975ca43c23c585db3ac345f6ee7fab2254b8904352131fbcac69eaa2897566880f938a2776104306055300c1c4b9e002c686c8431738acba9882449a694aa3eaa285244c67983833c497638ced124e68bf6db41fed4b7b5d52c7bee7ef31c279436679447ce949f9235747ae94508b253c30715186852423883035c960668b2898cc6c81b0bb1b0617ffccd7fe64066ec0612f96e75d8ab13140394039310d56a04e0dfefc53e779f6ebd32f41d2904df7ba3c3d05cac9da7b4039f9beeabd58aedafded3d99ebaf3ad7d681f63f177bb06e3fb4ac3d5cf21c35a084df65a09c7c7a15f66299fe26cdc00db4d367589a69caa8ae27cdd3f6c872c5d20c5400852ef85222acc9059c68a28958d21250c4980086a430455da0146599fb831226620f4a2c45727ccd3fa6f97a40e3ea5890524af93dbf7ba253c0e565155d9752ce3f61c2333d6491bdcb4399ecdf8a685ef31b4b396128f7d04981a11cfd67d7ed3817c7ff04f8f15945b77bbac7bbd9bb47e947fe09127f4000193e7c8f2d64b05128fb8f3ae11fd49f3094dbbec7e9ee1f5da22aa5734ae91e516f1f66d457cf4af9bdfdc8d991e0ed84cd1de1d2dd796022bb5fe1727f3c60c9de7d120439819a29565012c5902b7ae60b575817c0309f48817a6282d3132df70995d493271a2bf7c7030f2716b82c4f6070159973cea9c5cd13158a70c13b3479ede0020d3433a40a6ce4cb2edc101db66c9f0e59e694ce6171fae40b1e60d0c85c21c361e998c5ee873fc4eecabcfb917fe5cfadc784f827bee31efe43792843bfe9111f7af7c37ffc7fe47b7c19dfbb15c9d0418a932ddc115c124e8c707285bb42c689152754382dd7fbec9eeb5f1f731d7bb57b23cc65d7248b9326d9eb1cbee4f81300414c8e5fb8ef7a3d467660033c2fb9222ea51889ebfdc776f88ab0c82171e3c7288378bd8890f26584152b56ac5881dc14215a6092e4c381480997246ff0426e1912bb60fa7248fa702882a3225df872c0d202e74300727f3740714313b01d42d83129b7b50c5bce0ae7434ee976b76333b118f783b5b1d78b8b22e56b882db82162bc32c6418971505ef3ca778314ce09e7c4d61ef4bd03215a67663ab23b6e10bba3edee28866c1c9186ac5556dca8433de9c39f7e8feb7137a8743a468f113edc20160ea3437777e9442474242489048f7477777777775397dd4d47907147dc1177c41d7147dc1177c41dc949ab3d592f72d26aeb52536c2227ad141a2d35c949e7929c121a49f77a4cfc18e35a80fdd17af96a20f3c2edcf86a2ecb9d24c2bdf92344b60e05cb8fdd510e6aba1e8abc1cbb704e9643924b59b4ee9dd6dadad30c769773ff549466f5d7921d13d6548742d47742b4774294774274774658644d73344e2886ecc9c0cb99f23ba9023ba9da18cced13069d53824dc0c969b417aee1cd207f28d22811d3821f453b284915519dc928eed9c92db0f6310990adc921bbfb364c9f22591c2d9c0d5c025e168e090704c38261c124480122c49bae4de864897d2b923d73ae18caee3f02f2ef7978448a6b9bf244ab2f7b11844c615b9fd1d61108a1923a60c193163c4c018dda59c517329e7a4b45a69ad4768a53629add5da53b5f67442a132ab9d50a82cd3b46dee78a669db964aa976342d95ca72a5e418d7ac8930c4a23551c89a345eba8809d3c54b9725a09424c8042a899ea64c990e781c44d930467729278cee52ce49e5a4b4566b4fd59e4e285496699bdc368f7043659ab66da9946a4ba954f7ae561c4bb2581e218b63b55a3366d8d8d0704997cb237479c6b1bc1b2e9751660f1361f125160e863b2347230590f1006e0532c820e345462c167385713df79764489a1b737f4954807d4984d050468cd210c60b3224191d51a59a185c2df747c3162b3068c0e24661c48b1ca7ffaf1625f161ff826191f2e7a4814a9ef35b3388716fee8f8626301a94b857244b9020512fbea8b57a377eadb5d6a326f32869ce537763abd65a8d64548e86c8b5e29672fe112fb840e305748224c31c6199474718a974d29929a52b2f2ea53c90d29c4e9405244228122231a089e2cc99339f9190efc8d1aac988153ea3205c5899f98c94649bfb3332e2628b2d60e852648c4bc7ff0530b8a8dcdf91a2cce388bb4dee2f86158c8c91bd8f51b994b6e052fa25e274e661c44816997e46ba806145260b1768f1d222a605fd8a50f95ee072451543b09882088baf481443b0f88a28916beeafc812122b58c1eb958594af17aae4069355fd8ab63f17c4c01cf667db1bf9469c7eef95e7742d71234ec48938d1bd78846672cbac236d30f3c6ed5a1e585af383184bce2435492167d42cf1ebbaad7bbd8c21da102b66b8d726f7d7c208b277dfc3985f5cbacb26315c973752767777775f317153b9bf1688889167ee8fc8172dc83c28120b4941a95fe90708a83f6212327c1e998d3a314208218410769089875aacc00401853659a1070e9411c50a4c404cb9820227e32382e62352c547c489584c096b63afd71252bec084e04c1127c860c11447486a7a380d99e264c80da72b880c9901f5114182099821456c0cdf1cb2c2494a39a4c2932754b0040c3151a270315ab0a189e10b9bea4a95942ad99d6094d1c62115741508c124155b53be9459d24f7536986eeab5574af5bda554291ce4794edc38e06b56e669bffa03bd684725067af9b881a50b2c3c05bd05d65a6b6db5d6fec96df6a7afdda9d657a5f3344fa713a55e6c761973565447c26b7624bcf24f7ddaa355713bc226be2fb85c5358ebbadf94a45c737f4010f1019104c45234024249f65cd948f60f88a2ec53ce8f9133733d17911244faa884c9fd4d29931990fb9b5244b62f1b2137e6c2af76622fc827982bbfe95e1080f8c00d609e58b27c2a32aade666ffff4f6df03403e65b09c412c27bbb277f3ac3625552a77f7aed27c9a79ab9175f46dd853f6bd59fa277bbaa175debdd6c57ceab40ebe40bb5dcb0583ebddc8fefe5c992b1f45bf5a7b0af25c2355a2d6d367bd59b97da4df4e6d84d15684a1f08db079b21d902bd32869bf3c8b918925ce8aebf5121e788eebd58349d7e096ca54dfbf5aad56abd5bd57bbf75e6c236cf5da6ad5a55ed57940afbcfa5476efea5330954aad520fe14fcd6608c3dd67177b37ba56bf86bdfbdaea765e4ebe9f454deb3ac2b6ce1bcadbfbb6635b69aae789dd59d505c59cd29ec733cd058d727c14f66299ebe2f6630f30acd8bbd7f5d9832bb85128c21b7fd538343477292b92cdffa620e5fa59477c02cc6e82fc0a3bc0417aa0829800adc8f33d667f6f6ec9368672c8f379b41579625b3df8d65ffb8c4637dfa6f38eb544ae7fe3c3bf7e8daf3b5c3fbbfed67cffd30f4b26d74f294ccede77b8debb193fbb54378ed3c7ed87cd7eeba03eeb6dc7fa55f793fdea55cf7537aeef6cf3f2beec6e5c4fe33ba39e27d6785477e323fb1a9f7d0d7ce3c23c8632f7373e68fc7d1a7fff7e6f200c813d45dd0bf0e6d3b7f1d63e8d8e7b9b8efb199db7bdfd56f7b3face70fb5159d8cbde72ddebc7fec5aaceb3dffd6c58c371e351df6239fdd494ed07d17cfa20a71f704c768cf23f75d5e04681a12d19d8af5b05e4d76e3301661e12cbf7548e2a8b294f32fcfe9c750643f9bd839e63e909651efd9927c66e58fff401fd514acc2f03dddd5db624f660f56fd95936d9ee831b619e33681c1184fbc4ed805b1bc990e988d3efc5a453118549fedc5fd21818722cf7e70315790a91529a0c977cacf55a8c0f54f6feb975507ffa74f6366adbbddeca1b1116612d145cf831ebb59811b284deb55a4dd6afe865ae5afdfd3b9fd33047c5f57a27cfa0995b6ff3f37d8070347e6acfe9708fea5c9c1457fbce3fb49f6183ed8da833036b11c67db99d35ac3d8daea306ab4efbdb69afd23ef559b39dd5b0977d76b136b92859b837578882f00a8428d4671095bd77267486511d09b1ec81907f50281484afc51c37c70ab6ea6ee7eab82b6efc93f75a6731a2b20c6f518ec0dddd1dba15ae03808912852b7250c8a069bd0a0e0a87fe428408099a0228a38c32285cca523772bbd6d50c624f52e903dfa23e850c3bcf33fdecadf571c7d766f82773f9f4277bd4f6d0379e08bb8be55b9b5189fa299fc2f7a14cb2373f2866e8b252ea13752644f2fc23e5f6c38bd00866ef9d9e52ec41239ae1a0982b0e8ade0953eaf9b0123ef51b1f580437904fb1b7faf9a9ad03ead4ca15be964a6debc08399f559ca59d67596524ac71216655a7f72bfcd5775d40706450b2d0aff54dcca2fc00dc478411166f8473e7df870c64cded4df7e3e7c016e607fa2366c83e9067986ef0579ce7efee9b98e6616fa48232973a5380538948ab7083459cbf067931fb2640d727f3f10e52fca972f8a942f4a1639cb5a137cb58e55ac5c8b83771c994275f1e3fbdcd8705dcf32ed743a9d7e506d4f274daba13d0aba97599c612f66ed79a243afc764eeee1bf680724e1e500e508ebfe79ae7d893990e09a530a187c2946bb2473f28fed87c0ad93bcfb3e7d36c89267b1ecc27fce3ffe3f4adfaf4332f28be4db669ca144a31e64ef1c48c12627607629a6dea7b403915fed2db3c4f84152e798ebf99eadb736c8faa814f18b573833d1a36b077371ad806f798efb20cdcc01fe293db60f26c34e5fa36afda7e6879feac35b00a6fb8c6d370612387efc2aaf9a9ad03f83f27bcfd06e7fc0cd7c0d3df4503ab20f6366ddb519be44c9b547377b7794f9699befa56577fa61ea2fe761e8da63b46f03d1a59ca57ebc87ec7739400778ca0914be8c5b2c8a7f9f014ad63470638436b711493c18a188e9c032d535690440f4110b12099f848004613231d8a66acb999a1e6c83d3ef411790c65c923c6f8fe73f39101dca3cb3ff2e39c3dde6560956195915d8cdddd79da74970b76ad8b95820b83cc00b7655680eb8a10464c800b1d90bd6e4b2a298b8a3b803b3fc0b2addc2e4dc603e6bf02b82d030080ecc625528299ca4b1255728c33cb1b11a60d71bd9be9a414c23259bf721075d4c0e18473ce39ad7cf8ac2de8a413021591ddd8b8fd4dddddddff068c75e5c6bf60352e5493b9680861f39a115dae16908c7573727f5bd4e40640d66d571d88a91261bd054d8699e504abcbf55e8b451df81c441da9434e8645a27bcc713deb56461dc73765726719871c8e0021acf5371f2290b0635c92c147e24bee6fe94bcec9fd2ddd907beb4131779b275bdd6f4b97dcdf1964577553774e9ff7fd1d4389d92d4e5d22a5faa7b7a7fab075e4572225182bc5371e91c8b64ba424e7e3ac2304a44a62ed7a0a104a20eb97b41166352a6e76eb13294dfa9e45f56bde8830d6951b1f4ed8058152bacb78bab1c842c603667bd36911561f621bc4f56c9e1ebb2030cf9f58ca3cbd5e22a5d3b797d6a17fbaa88e48c967fe78828c5e22a548a4d44fe45dd9bc2da5b57e89945c51036f55b93109870a48e249ee2f09a404645884f9b3ccdcd91143f992c09263d71f12594089b7878c07ccf076cd78c0dcd77f86b3848041ea3249ca1e88c9f14750eacf86a51c3f272a6914bbec2bc9f5097f7ee2dbd09d4e133c845bdcf6e08b20c32c9bcef97537713dfb232b9dd2e3b7254b96475a584068d14205c5dd529453b93f2d6932fc8b638c2ebf2d4abe2d49bd45d6316b5712160cd165c81114302748a2a585d409f2a90a25b47c56b450e9268e60e08485121ce9e1090d478a6eee4f4b122d50583a34118bd5606decf55a22e54b22e111030e77f0da9425181009243740118394263c44c182448b90164e2d50e2083259d4b09e201d9186a5244b982c4e2489257925c9f2c4882b2c24324b9521ac19b21891e50a13d2d151dfd022c410c1855106546022c69721964441869ca188324762f88c3032e28531b1d8116b63468cc45eaf16a47cc5622c2231160c4454898188248a8860c20516d196fb2362055995fb23028a21d00c51c42ad22cb04244c46201cb523ee5feb094a93283dfa8ac551f3b2125205a96c5cffe8481a4deb110fcb791c4a5f73a4e7df928ec9f451a6f33e369fc8c175202d282f0e503812f3110970b8380859480d83cc44231c7a96ff334b04d7d88637d54976d9d8685944e2fa43dea4f1888ea535848f5f021d6b050098ef3424a110b41218e533fc346f121168a580862210d384e7ded85fec6562c4e08ebbba772df3db03e8fabbaeeb11dab135202923d8785604ff6aa5f75b7434109888651d0de46121852719c5adfc677310a424a2174cf7cfadd83c228ccef1e0f52c95a7c68254dae91fbbb62946f40a01f42f7d01701f6744fbf2afe81aa218f35ca8b3524c61af292afaf0a99ecc9afca98dc5f9530d915615f9534d248d6315371617bba474a4359ca0207d9dc208375d27bd596eba3853f3be951f2c428a5f4f8509a10811861d73534954d7936e9a7cda5b9b249862ccb7a831d3b9f0883f2c37cece677076fe243a30c97324fccda876e3b409027359a734a23298da6d194b20c29647ee8e20579403965729466be2a4b7c4264914db2e95bad0883306b272e8a7b7a4fcb3638155c0981a2ef8910880f8d3298b5ed4388bfe1a1ce83a79ff5ed5046751d263b6d7de4a23bc2e84395fbdddb3f3e14b5ea40f99dc4ef82348a91157b5ab61038fdcfd3a9b38ec3b9e07a9f1f4258bd72545c1efb1378797aff0ca24b8a0bbfe73bb60eb1065eaa102f4d0e85b23f97820b73075aa65d2bc22614f2b984a098e346e9dd0d17b7c5f53e4cd4e1711ccd2d0ac2f71e429e30b784088baffd4ed676c0f6e272b9bcf0407b4fd873b9fe274e1303c10ef7a404473b318784488d233e87c56d7d61adcb45a5a84fe9b40f696fb452987f24b65a0b4248c9f255b17e8fd60133fc0a27c0d33a60eb805efda93a9207fe7cfa19abb31b7723ead02679fe8d0ffbf45b3fb9a79d67dfa39faab69333deb34f8358caf36b105472f6967bdbddbf1175288638acc5de90f65ad98d7b966dfd8ccea3ef2d7cc3fd8d0fd6f69b7d7f9b6775abe73a1e4379856ff7a3c29d4f58c394bed63a4e8079be46bf5afb755a5b6d09d956ab816c6d954f3f3b6d1ef0bcd638e68e1e8d037e0a70a815ed9053a675f0ab943248f6928c40062353fc785f55b70ce5eed8ab3f5ff5aefafb1d9ccca864ee3575b1648a6804002080025315000018100a07040281582496e7f2607b14000b8192446e4c984b23518ec328888118864188010411638c310620a214446523001eb7b4fdf10f17f478cccd66d1d77385536c88af37c2501c714f2b79a5707a39275acdd837d656f15c4d258dfb8ed2215ecfe7e237cecc421f8a4cba2d897a9b2db36d29530c9c3e96f4c6c6759ff9676f7ee5ca9c77aefc8f85f29087dd4be576d52b062bc9d6c608f4b65341d88f80db18fc277daa0d6f5bfd148b6c04a222265b2a08a32563365034909a7f03ace71063e5170229b0c4337f100a20b0192a35b4bdde92bf251c3d4dd345dd854d290f5e80a7554ccd8cc96cf6e025989cb86aedf5844037b8df3ee5b15343f8157a5698afd32b158d1e149fcb8c4e510fc4036d82e8799ba0b23957b62caeb1e7a47575c208b76a84644f54c292a479a736b618d173d599a96e08956b9e065dc24e3c610600bf69dc01b6cb53fd1a008ee649fcf292833da048795af2e441a852e0cc37e11b79135535bf4446fa5ec54a8ecaaa237944af28c25e2d1b0ff3345674b4c60df55a3b9f23aa021a3a643b5f6fa971b10f001e3b975b50b5cf69e470af54a13f9655075fc510a5918a3f9a3defdd49783e01d0ea37cac8aef28e8fd9ea79a1d96362737e5b861186fe0f93f4b1e89f756755d900a4f4e38502c1b26d47b34efb26bbb7011eded0c41a0bc802a81f0880ea65c2a5c02b5a96b1c4259ee760f3a26f9a8b0372cc70c9ad77ff445971b588bd6588cbc01af06d08a0f60b7368a7a9190e36c19353cde6b33263ca11f81ae380e91b3f1122556a7a463207a494e8512fd0572dcd8ee0fb695c2f8e26302ab27055a36fa3a84846e3c9e2d6bad9565693a6552753400c628d2a05fa18fa86c7f38e2ab26b7ea8f883a8515136c28593931a440be56730e2a32f5f4d16944fa7617d6a32b5e139c617d013c6d11f22cb50fd202e818093bc621d95f7e3c57e7d34751f592ed44c1d2213399120eed5e872c165be09b223e63737d83fe9b97c7d54467d6979b0d34105ec040ac5118bc9bf97fd8fee5d25b2f433b4a1877ad34f3e502094e27db5e16a003534d1edbe0be84bfe660c2b65640eb468c73a5e48069d602e867e13593045258401a5aa9d63e563a9b6aac38bf6282539961362d222a78390ff60325a3712232f82f3018a883a01fa6a9553eedfbd3f4a166589724bc7b4486ecda478258543a45500efc6d2c73b21fa6c7cac925da1b2f83754d6604454d62eabf73bc4a1d752c4e2d30b02ff6fb57da51e9c3b8e839e98b0fa5630e0525e5b793def8d8ba3469dd32c9e364a805a3ad29ccd426bfbff3e3c6ef711472fb1e342d9431a0df7fee6617ae041f86f1b1322267fad2631d3e983757022c3e042710ba99a6b12b6e939a9e85580e171eac5002f185faf71b7d40a77582d2e7c6de181e330659349b96fe0e5d01c47641ac50177a5bb9e1c8ab767853291e22d9916bf535da50be44ac862b5a8e8a99323ea770fd431d6a05ef0d69ffda15c8be9a5021a1186f535dd2e3408dcce4750734919682b9aaaedb52cb1b0649885d1b6691c883b1c7dfb7da59ff731721f06bee9a21e90bd2f6e0c021f87fcb97d623232652e83e74ed87f4d7e6d99ef1d2da2f51331064b4438a3d4246a01d34f28d4fe4a50e2c932d3a92c9574327fd0e2f6566f3c3a42000d179d8e9c3ac091c9362440de12d4d1f12579c091e9d993efcbe205f4d7f434fc33b5a88966d330ed5c999e80bc6c4983caa08e83aaee7b768345712aabb39b04d211b74345790a2b1d369c59cf12e5117834502630e4e9c1cf5dbd5b8bebe1bd7027777cd1011d3e4e07b2cfddaee4e71406de19ab6e3c9894702c4dcacf020b361d85c125215df490e11584f25aa570d374cdbfc7596322e4c0adb73798ce352bf7b0eb4c47a9a80618dee70bbeeaf87d16c5687c1e80eee4f0c24f8be334f36ea8c0477da89f75fac14bdfe640cf7fb4ff3411e1a76aac885fa72060c485e2a37280a336bccbb02e37d9717a5aba8dc4d6d757fe299ccc4ffced1fae26426d4b97e554cd33222c113606f54ed47f059ae6ea2c5ff536940edce31a462f33bf00423acbfae1d0439d2da97ccaecfb7623ad914a5fc2e48af7fa913a79a9881b1c9f2869d0bbc1b52161a7da7ace6928f6f0baa9a7b882703e863776b71b4af33328593450b668b730cdda1c52772baf000fa2e433002ab0f1252ac730122352e30cbd62a04628c91506b13ca2725141eddd1825ebd31af5d78438bfb75b8554335613d661ecb548fff197b3dc3f47f608575356ec524c0172f3e1e7390aac0509de8b0ce35292b5ae67c396a2ffa47051198723f3d48c89e7212604e93419f43de798183b003b2a7c3647d3b392c0ec108f6028ffb3e56cb4d881ccf4ccaedf264e2a84636f819f9a18ae1c7e54ff3474c7092a9375369fa0b5e9ffde8fb04cd77269adb5cb21cbe80c670c5a268075165c6c3140fde65dc9b80de1776d959f44eb89618387f9689d5b1a4cdab631e7cf46b665abdf0a6c300a9ef535d6ee6ede5569370e27d9f289ad376d4f665479e598594e4720c130c9530ba6b48467258d626027006322d207340c07931d51d4bc0b6bb18e55ac1858990b30e4ebab75ffce2e9680fa4bf1a92de2e1801449c3b9e6fc1b7f44f5bcaa7b73bd45a688cafce864a2063a5f34ca5e092a343694f1f7cbdda6fcee90f630de251091b9f361716ee51e7f03d5153322927115088a27f5647a0f5a39cde58983b2ed889eb82f57ab96fe496a353c2f32113466dd16704d6852826eb9141eb7c57a8ab7c854493e92dbf504c3a612ca7a8cbb5dec3297bec7c4b62a7c82454a1610b40442c4a95cc5996361bdad4326d25dc5c01dc2b49dbaa13938823330f3ac189986dbabf42734b7ad713afe720533f506ed51672c59d425737ba1b5c8843ac2085848057373f7a8525eb0dbc06051ef468fc82468cf8793fc724991a17716094b0dee47eb6fb08711441f7454101a1522652e6d0393233eff8ff7ddc8af43fc336e5c6e8e92636a00088c15d8d07afa8d6b15c39c439afa7f7c5dcb660ffea279d1da1fe0fc214988d9fd3b1677d00f4469af312bc075f9ad261dda59df60ce6fce10c3381982a26bb9ec8968697b084dbd580b0323bf063e30f41977f6c6c938015c481375a641b91ae4eab1e54b6006433c0b661ea2cc4edfd00ed856da5fe3b45efb18014c29082397c3cb833ada80fb5efedb55102b38ca449f0bcc7ccc85500c69673893241a4ca20a8c760fee6017acc22e776c2fc288c8c812ac154fdc23b8b4d5192649ae18d1ff228ae047a965e2ccf6e96ac152fabd67562c3ccbcc2a98433fe7a620e02ec5265a97174fe72890576e6ad12be4b7f85763f909c3c678882082e0ccdde6424cf865084a4b9205710fae0e79290d11122b9f2451bbab2b63fd645176ea887ba3f830ee1ed93d1f9b23f423846919851809d50f05b1c35fc20ecee2219721f350394d9c47f28e916b29c8bfc8e04d57235da84aeef03f11fc363c241d942d87276f3628c6122b2a601922e24b93f47249b3721b5eed5142d1a8df3cd8081c74997012e90b9fed577089dc6058b2899b542d824bbda0034f04dabfa1c48d0094a6ac7775e8c03bb6fbbace6f09c3b59e6e98f64c4a787839ce0cff82f6f8d2b397396f19bbb5ea857a25fe6371d10f8bd6ff011282fe82b26171dd1d80a6df81b6b01cd7130dc6a96b28829ec0c4c80db60bed90f312efb946d9eeacee0d3569cc25718b0026dcc55ae581a929aeddde62a7a5d90737a0ab69dd5ebeeb1137e3ca808b000e4e5fca055ec9500372d38208c16f559053fe4bab4959f1dbfb7da905114c2cecc59aca8d51852b1f51975972d1c48f2673308617300adfc29105440f471744958e5007f45f5f0c38ff062a6c7815269bd887c883d921762959feec521827c04b53715069b104b49375f8fb927cf49139dc977a82547f4036d8a6938df3ef0084cb9c92bc1b0d95c0e6332f998b59966cdad2a5605069ea6588ea521da2aeb0ec194a6453b9de710ce6514f6f1fee8453b5b5d2c4c852881beee816afcf23c07edbf2691dc5127145cb8ce0ee8e3a31f697a1315d0e8b0c1dbbcb54d556d1426cfb09a46befc4bb26aa76baef0346e009797bc8f3354fdeb2769523f795f8c604ce6f4c447a7bd964ae83561e0c70bd3d9619a3e2f82cd6055c784325b1b1046faf68248d7f9b1be5dd4d78a519c1b8378960966e118c42a932799b2737b5c9294f30132319891602353aee839a85096b3902ab9ea908d0a01a571295053ff4321e2be415dc8b8bcfc476a9153560adbe1de8fc7fd0212d7a19a77534ac415e588f949186b7b19eda915cfd33af144972069560005ee318983119246b9be893a0bfff711a9b22c1c458ee0a99ed9fa594de56bcc1592e422a7ad39f111d302b1b1b3c7e4fca715f17ffe00fda73b9e42ef0c7d31c2e648a9f28c1928b7a926a6bd47087057e09aaa1a398083058efe2c929f822a1f53c2818f658c4399f2400b9dc348e143992309acfc484fd9bd733a828a3227392cc176d81b9adeddb82a13fe4973fb4a5037c9c2a1e0008042bb69a3ca6fea1544ee92e41e6e5bc305e3526a438b77c8345e61bac5ad9064c2fbf23cc71dc7c7c121906296cfb7c101c67ecbc010fd824f4c2182f3c8a2dc3155531a886d7018f926e5bd2d1faf30cb6e06d6fcb589e4ad379f7229ea996ed6fb08e7aa31bf6e6ce35559ca0a1cb11c73917d6e4d8f195633c1c9b3cf68fc55432f58273941fcd23ae34f6236c23896402b464b4cc6c79d61157404b487a83e2947c5eb70b031b20db0cd1be5d9c3ec074e4cec262901bb5b7ba84482c3c16776efaca3d0bc4d53e6cd28be0eb66215a2bf6e47d020fefea1b1c42ba59e505704f3d2c9e77258c86ca30d66d14c1ceddf5d77a3f562fb94db0cb8e216345f7e7811d12232ef2a44bb3603fbacb3251c7d6546d1820382922ddca2e9cc030a6eff13041f88d4fe81a814fd50b637f01000ac97deeb5f2164ea9480d29f2b082c37ef8c206543c8dbe66af1133285d0b937902d8027a041703aad19b025518271cb6bbf3161fe5aa7693be142c21adc3c3bf47e731b2116f34b9d7752e2e883bddb7db0ce6418bcd771cb4a092b304ac2b356791f9d2343d9b36c7013ac3d9151b041effac6833ec9c28a3bc7a70905310399c2d5ac4304657ffcd8048ba88e45d1be20d42936632d9e56de3d7c6d9c9e2bffd0dc4454d1c89633f3035399b3432822811de43eeb062fce263f6203f949d7c223edbab60b330e17e590288470abbb888ddef908e14c2c6e80cd40b71869ac5e0d1ad79c96eba4d98f69e62c856cb3a110270f61100ea8d2353c027acae44c10917b5427b622ec7e59f85c42947a22345339e93981122db7cac0b71048e124cca3dd4132dcae4230b735b9723d9fd87838d5c60814e83387882bcad496e4d1cdf28a364e5cdf607e256868c8fc9444d78b30d0f70062a749b0b3823605560d3adfa3d36c5af29693be2f8a2baf8c64648fbe7ac6b105dcf71599cfa10d22883b7b3859e19011016990d294e69247561d506c12a800bb5c929c223922cd423ae27db4832114e49dda0c3865b701c2329bef343d348aa1cc601389b50014af20838de9afe2895dc43c3c3ca21df4488d1a65c90d4048f6358f3eff6840df7dabc8f19e47f77e68f24fe11be4828b59906514efddf3badbaf57fa1f915c145fadef1f57a0b2ee72e31bc0956210418b15bb80b020de82cf504470f21171a264ca5708b39f4468c699efbff25f8aa4ba2a186112b701bc35bd989b6327c93c7b34c69a3810a59e29b5748682b4998a7d9f24be4e6205221a1cffd4a92c2be4e85423f186ec7626850a42d7961ac5c6b5425360ab765a0fff7dce98f19f5e29871e8137e245db07402f73591482dd2b568ae3c1812cac635631bb34d6c7e2d11219567277f815e0733d944749b08d58dc768d1f69a21b2cc16aff35a5f5ae011511d1c806afa805a6dc80356d48292626d119e7ad19e37089b7fbd87b16ce51023c66a9116a8a2252903b6686e00856a4a0f1da9acca5a2eefe4526e0770ff37d2d6eb120ad46179644aa9be339bd57e1c2748d56374d95f7abb3b3d9b5eb13fca4e53b33462990b7abacda716ff1a153c80bc67798a12ce244345b26908e93c15327eb414c955fc35bf6d2285bfd3dce578b4c08cf3190b7778a6b4a75562bd9b6529452c320b62f2590d5b08d46d515540aa5c4eca01eb1f96cba4f1274391c96c3ee958b4fba579e8ef1eddeb367b14bbe7997d8e763f6612887a8c0572a88e4327d2c42a2c04ec1c52466093455b22593a5f5ee23ec1a0bcde7510189e298110598dffcbb811a53e7528cbae093b9730df0536099e2d09f3ec4ba130c995fd7bec8c451db2d0ee4eb0f7bbd0ecc4bebca48de138bf38eee38d705a867a0468f5704b2a3afe5a46bbcec832147c8e7b298abacb757635d1478aa8cace81d55f08a312a2620b3d5303ef942193535380bb86a2cd2e007cd9c4ae024aa32c0b4ccd6e36c089535289c7650bf1e5ac6dcb079f0edd9e618e4e56c388631a80819e5d6fae619ca0c0ca430d99f4d49e02fa6ed071c121edfaf21167addc9c92ae6305260a1defbe839920b6071d1e819db7d376d620296aa1be6b58c980bec1587455c26f4f61e0ae60e52ac187bda3c511066366a351bc0f7ca3561e00198f5b5c820977b574552a527798142cf35ce9eb3e9cfc20f197a64a77d0ed7d2d5ca74998cb683d16d5ac0dbaef5363016fc9eda3aeb78aa9e99aa1a168a9b51a8cc3790276ffb091b428ea746faffdec6c04512125d5594f3964477108cbcba2291630180b5cffc8ad7192b42e1ef07fc4c5220e733110b8de5553c2a6dd41a18cc9de133218d1f935f3da8e4a4a310b9d9aa4e031680c189a14aab5b49efcc9635df73908e96cf622f49fcc8c5599546b8b5bb60a63396cd812b90aeb7691a80c1481f8c803cf4504f66491d2668d71a8f53e48a4ba66006931adb4e15c4e487c28acbaffdc428a7904b0b08e32aa2ba7e884a13391070506800ff22df0805bd357d1033db4cbff052f0bfc0481c3a1023ca810ad12618213432894a78479af027441be164db6680fb30637ca16e34cd98f71490e1935ed77605ce58f925027b9fa80d384ef190960b4940e3a4a423fd1b4892e9ce1284f208c855283567f7458929d505e0688ac9b87c408fed0b14e516d1fab0a00b686fa55d14b6f863489b2de3ef9daf90dd1d192a1e04e9cced34a7a4488c934873e608f097dffe8880070520748a217fca337699709f4d21deabd304bd20165adaed44da961709f8d44604369d86211a51dcd29a01ced7ef697c50e89464e342db8ceae111881b467cd4c9781e563df10c1dc432001f137f7a2fd3797adc1d0b655e20ce52cf122d394df623cc24b0c896247edf4af3cac6d7c9aa301c5a0c5422d94e23416d92587c57c67bf654364f4e06a89f518a4d14c8c37ec712be2e47dcf258c2e6600e2d0392c8671cfacec1f3be1e2b2c190c7a7248fc2a65a99b565a44095fa01a820c16237cac4a0b2341f1db3b8258149616a93846a5ca8adc442c99db58fe714734f8dc94df8c9ae89191847142507ddcacb0959fb16dc9c20f9859970d868d0dac5df48df230361f27726b515a07bac04f32c73994261040aa2e617cb55eb1e0a3257cbfad8004022b4656d056f6882d0ab98a030b115c4453ebbaa841d591db6a34fc267c75d2bacd1beec28a1028e49e6108b5aa8a376b42951eeb584cd8b4195bb6d88b23b6fca19745aca1c3a4725cbf9462adc93f30720b939845ab822a4dfe117a44c879c523eb7cc6ba2938c76cb52d8c6f29a7b2ed2ff61aaee040e088f96fad9614409cbb5e115f19356bb89a8785e3716b6e858dff00c15e4d250bbed912151363028f3a207c7d8beb2a30ee5a949546b1770bc4321ef81466791c753fa439d841e52c5ab0aaa2ff7f7b89a363b472a7f092c81b590d75e42e744a9242d474540eaa259082177829cae2b7622476a9cbb08222d730340a01527beaf4c32d84fb02f040500ffc07dd0360a442187d28cd4bb81b9707bc94ad9e934851d6fa143dbc6d07ce3f68851b807074992637d5aff3db1690372b8daab42e1b69202e4323551a4b94ca7af828eceb93cb457694fdd1a5d71ce5ebba1434c094d54eae815b54c7cff8c06701690f8cf35ff9440607a11f1a5edf23511b39b77a168356310e54278c8cf0b87b4a4bce59ea3355682518ee90c7428a3b2d240b588885980dc050e0c9e8017de26e76c5d4a696ce7d08c6edceb1c91f270316494a0e70dd4495049c8e89a1470c44c92115e8b566aafe00535c4ed1640469d55e9c110665e0583880ecb99644829b474059dd5bf243a0083be9b065394d831269bc2deb701af865c4b34ec69b540717223183bc78653cd479afc612ee9464f2aeb84bcfece4914e553ae556358c05de6cc0837f4740ec1d5ba6133dabb9973366a68a1d80daa19f6b9b382b24892aa326a8fa4176a00d37489a6b9019670eb200ce735d60ad902f225b6bc05ff8d5045e142c165c63b793f02023647028a59d263e7e8c9058911e400e51684912d02fd8e20f7d356086e5a0fa641b8b1d72b738ef7b24c48aebd9be865fb050ae37b6f6ed68b47a1905d7c87f4f62fefaf2c1daf9d2ac3215e6bc762b33cc1801a9428a3a0741ea45a368d3e5782c641723e1be7f2d5da02e966080b4d52c2abc42db5a50d75746a9b7e55839d859404be0c0bc4234fa3daa69834c6308c8368ebe7d992f82834aef36ea0262f56c11f010c103844e55f79f7ed8cdd49ba411a8b801c1bfc46c4c1d3d541c62c946468367b7c35d625a04df8e75bd263905c29310db08f2d443d6e7ca6113ab381367880871c603e02001a36db03c9eec3b8884626e3aa8f0ca455800dcf0b16ec0ff850bb3d88f735c89d3c5fe7dce2bac7aebb9c451cc7bc2babf15c0ad5a50d33a982f5e84b7392e6e920d883e6c6b401bf468982f5765f168f8196bbb8256bd5b44948011128ca91a5495025f031131b46c59c91c5ed12b098efbc5300d57de7e3e89b36ed07e478cc744ab30bfa2367bab7a1e2a24d6a360598f0fc4e25d4d5c8c9590c8d0885f113257f08cb3c66b434d383c8090a059ea4e59dbcfffa3036ffa8beedf7ea6cbaa4c9b65504a4de2d1fea10cfc206d1a843fe258949ff2210bb89e789a648f4cfe6f7206433047448cc135f9fe567ab54f459c8475a7c4ae2872a28ae8f0e34e1424cf3890bad75000565f91ee3387a4369c472253dba4a7fb3b69533ffcd89c2fdd938bbc0f18dfc5b2749fafd1d1e76cf2d91128dbaa9acbef69e01096fc8f8193cd9e095b1082c00ae66b9453a3b60d159b7ddb00f380fea9190eeddb4abd62cb565537147720dd7ea613069f787f02945de554c05825066f16968631858b0520e1b4e4698081e200200bd63992611f01aaf43ab115b1a377c089ec6a2f980f01ef838ae104845f16c180f9fc5037b9e31efa06e04ee822780d5b150798c4d0c6d15bd5141fb33ed00030d63195d2bc84f53f9c010a3c5fdcb2820c04b1077f09538089ede109727b2c731b9470559ef473f951b6caca0a9d1f1113c981985cf26c03df03bdc8c8aee835d658c4e056e7ccd64f0d39e94c7124f6c0f6b3822396c4c32ecf1a0d39733ffeb0b9a266d4cae33337825b30e8a7ceb317ff197baaafb68a51d5a13f50538a180a33979d55d47ce54509a1c510bf29d85e55206149b98298f449dcaf6a7365b61bcf57bf7a2bf7696ce75af165f3195ef1e6544b15ee27c0144f5fb8824febcd3b6abd3adbdc04587973c2e49e102a88d4ca4217fe1ced35d79c2a4a9d3ed207057f8328fa819c67e9f71804795062e18a217c472e8aec54fd9ca90adebd141a976c09e2a6327b906325b6c52dccafd47116cac022521888c3c2ac4121c2ebe53bceb7b15aae00823e782cd0d25b22298afba887bbff9c1de1482690b3b48af2b81dfe246a634253cd3bab738a6e8e0773e31ca1ee62db750191deff453bb4edece9f03a0b410a4df4329a4f06ffff6a4f973146be103fd41b09cb9ef2a0a60be72975e11181b2e8a1b4948975d4e65c1f443589aea17d43f2df92761e17d09b46db8c0d9ef6a00a0a464f64abfa2c526f6f0b90f920bf000e215ccf3a408e84264aef6944ace26a2798c9251a4997d5429df41bf51cf7b4c540c02992ac73ce1e3ebe8253e1fc491caf6176241c6dbba75bbcf0e884dc1ea35e2446912e2325a7a1fd28a88bfa5784bceabced2d0933a48196280adff07710d03a0bd66d2fb6bfbe6c3042365fd088937874f9bb52ff3fb47f7d86c5541a728d92337442464dbc51a87fe312a85ea8b7bf9c75fd52b87084e7f344e5f0e40bdd4b4d19d1f6dfa89add84f3601243c2797ea3ba60caa86da05bcfacf9e4e3e841b7bdf8992eae7666b88af89fc9fea357ed94d2d5cb75714430b79cbbb26b25b45f33ceeb712110456faa3f1bf65d0c98a37821c9c59f9936f3d85cfa8df2d57726efe929941033f9c9c9abadb693c3bd8f28c8eced178d750543fb8e47979cf5fb2a7b45a701b48ee7ab7d701488ab0e57ffd9018badc42e41632dffeba598c3aac501166390c1bd6f44f0e72e309625b01eec2601944ecddb6336cabfc8b6d6bbe49221088340535811ac9e4d97edec5f1035f05ebd989ca34efa7776be714c109d500a6211499e345b897142a5f32990b1d2d6f0cb6f751011123e3d1c310f20582d19c3054f325073f3374649c05a3125670e01646c996124192e1ab7bcb55d2522e182aa4046d90fe7d5e771dd9111e554982a2466a8013aa4e17529690a84618d67ba5e140ac2dea0a8112122c1da728a9686394a9c4d0909acbaae4bb6c64f9e729901c93a8beb27923b19483e38ce5cad7a5e90f530024e89b54a83459d80d019968b3d6f08cbf1480cd9a0148622daa1bb82b2e4e8717a424d33fa9f86eaec98d09df4f3b21c184261e59a71ae0022b1907e438f1261248cfd90ec18e5950f0855dc6236b5c2d948e0cb56cfbd0a7b3462a262d6650104c1af3402b95a9c657096e5c9a89fb32ca555ff079f8ac2f39c1f8ef12451af36defbaa43ed25d5a02cd9ad16b4b80a1d66b3623a4483eda09e06e71ef38be76f98f1b1c944b0457d120474136d0f89be972a9f290b915849cf20433b5ee89a65cd38c386753c570f17f8578dcad4629d20bda3c65392e98b34db8320bed93451ade9fca016088fedec33406dcdcb1ed1843266f3382ef322092c16a5f4077ee20afc07a57921661db866fcc73ddc3089f74f57284cde257998ffffab8e6e2decd8114bc8cf7c2fe5cb2af2dbb766fa55e09e90bfc9c2a5de75c3b83e99543c6fa5f14f4f97235feab494196005b1a7215279470206af03992793e5030031609e4351baf936820cfd6d952d0c023ceb3a1b857ee19b5256f34267058d26e13f03d0a8876dfcf5d5122eef2e8aa12a52923dadb0f6244c100d8222c503cc02bd007f0c4529ac681aeb128bcd38aeab2b0c4065e2372fde7661aab56ef4bbb7cf57a42ab5aedaff855e3b00385b1e8dfd740039491918aa4977c3e0cbe7fae532db6371b0f95544aac09cb8709f40bbfe9fd357ede0c3d26bfae4d4439acfb38ab5183803deb3874720f33677f97168bbc80b69b6891e12fb6014e9daf7cb3a65b916acf00272d205deef1433cd8d20f1ff25ab0e0d67d1666b269c433cf0e363103e8e7af2e57a23507d06990d8e1d668c50be6c11f892487a7143cd0bc20d400e386961063c17db6dca202f68ec54930cac181920f33c4883353817d4c4bfce2d006b941002cdcb56a1c0e3f5697813ea6b40db1686336ddb9daee3b1708af78c3196708b9a3d5c0ce270f0f6fd45c538907a9016660b79eeb02713092909fe8f29df977ea1f6e4014201616489eae8d3eac174317740b05228b3f5c854ac3cc17f046568b890b285423d17e70391cccc1c24da85562cf8b31122918edb3e34281e764facdf607c539f58411d42fc0fb2c4a8f2b953f0987d0ef0be9a7b06d672782a16122ed810c8512b2817a603e7c708333827426b341cdb11571fac88c80a08e17579449040f1dffcba483c2189096260fd27e42608f74505773ca99dff4b9a08701ae02f64587e3bed68360ca6e504fe71f4bc352728437e97b25b719ff066745bd792b814f0ad87586f1c0fac7a81dabb27455770717cee978dbd8ed8dd4b520bc0d30844ece819c7aed23c0d56ae1aa3f27729811c8415369aee4386a86e657c5858baf69d286a8a704386208588ff20d054e5a3568350f76cc844bcc6482ec218231b6e0fd232a0e6a970943fb0719ab62bccdfa8dbe25e335c8b94d429a1b697cedd8c2a623c79eaaacafa61d0fd3eec1b53838715dc0483831be8e8760d8404c447b25ad6c04a57104920eb3b5081547c7e6d593bccc241756595914a3384653cb5c87664b8892e842a5d7f9c0de4e7fd521075069c36d9bdd55a2f8fd1c62eb8c23ee10a3045a9387a780d7e3374dfd123f1bddf1c5016dba472664d644db754d18be4e2f006c27dc86a243cd03f8572e27e2c6e99dc7a1b3630d728b89df6da9a6401fcf6271543f9e5f501b3a295553b1d939927be0d0ac4fcece064fd38526bed74c3d70a92dadac006a6e4c3e73f8c872cc868a3f719f9601360a8d09a24c0788565b82eadc9fd5213ebe6c92bfe9a680002112e0a3439bb252ab99ed2f9e57e8f7ab6df05d899e06e3c651e9348e7873c29e951e14c56b98627e906e9103dc3a8d90dffdcdcd4964279e1a65514fbf4f13ae264bd4afdf2b6b7ca298e2c3ee567d53f7c1dc4f3d5624f321a94bdd277547bf81322a30b3a1ec861949985fe13d8441d5496796da0c675d12670c1bce26489bc8cdb96c0c1cd9c28abfcf4cd8aa311a3daa9e084aca46000c29fde05943de9edddd20441db9e3e814fa97ebd1bdf9d73cb1e85dab5e50b3e81786cae9e9fa557b0b6e140a914e76859b2c230dd2b81169db8e1990c917be95c644be82852e567b57ffcc6d2966a3227f4d09e2e877c6b3b9c0a29612b34de89f2757946f9240e185859b37929e0a1508f582c70f848c56063cba09e371b9630cd4390617c30c38c76519e19255a8f668d97ba1b7ea1398c59dcdcb4cb720ea4d9cd53706fe70f17a21840e7fffa4f2cc3d6410d20ef5688c6113c666a56f1823ddb3a0bedfc4182384a399c4b627cae96763b80b53c41583e515736b3209abe76fd5981752a05111df6ce500645a045b04f54f1e305d3f10d8df063c7934564aebed847d203671b736ad4a90fcabe18ee14707e70890366bb9ecf04801b1399fe21449a66209f0a9ada7603d5cec07804532399a86075639d3adc9d7d08897b9fb5e963b99b1b0e00620ddccb4057fc498197037823e5cdfb6182d562a0125803df038e43e53b8b0141ce600a2ea796a7bc6511f77befbb91e779e0bff3a01b6507a4a0bda23788eb16cdde7e72e5770d9501fdb5363c5d31300976460aa23cb90aa968a642b6284506adab426459cb86d04df4ad28b20c344a451cbe79c4b0bbc8a44122dc139d41e81b284d23f35c5da1c1d02c1632d0520f849d39969bbb2bfe85601033e2f261f59a75a0e3e59b5bb83abba915c0b398f529f48d1b3bd81ac1a17f99b8846fa8321a19d0c06645c72d230b9849d148851b6ce38f2a46b23a8af93bf14e8b34d7c1e5051596be381849a6dcea0b34a3d118f1005e4880f14f43c2daa53e872dc483a8f36f633cc6461c054bc434ac65ff232f5c86138898d477ec2d825ee37aa83d4a89273c1b5a015840f2ba25ae5f94409a2ab023537a8a924d54ed34f29a8562a3f679f71eb71c162bd0d3aed4a85b2189222875caa9397b32c2144ed4ffbbaa09b5011490eab38509ea833e661eb89eb6c7852fb6c191874d2a9719166f417c074fda13a569f02d9381ca10df18f003fb8c84c29b6b8be792af9cb912679e3e7fb19ab5d556fa4395126616ebedb367fa4f7b96ebbc0cf777747754836dc35cd4a5d8815f4547a9c7b3854d839f444d988c16a30c590d8786a3b1396f639c0fb52885e88c84448742502429454de3697632f427c08988262007ce6e4aa770797c57f87e606bddd4c99f88e689a58eb8759bc49d32cbc77478f2f7480070bbf56660ce25a07f9de3bccc8eb98d0dbe25adb73fed9f468e316aa10e253ded70911ada6862db57831c4eddaa01b1ed41ccf2d5155c5999a156423955ccd6b618e3af828f9495f6c537d4b2a97ac978ddb8d8f8efc2e7bf4dcb08b069b9eb3cc60eaad94a3776684d5a8c646bdbfc0102fb3d9aa1df0535e65015e18a395b296d9f7bc87d34a9c1164e9786ba2bd66baad2482baec7da2074439ff660f510603bb3b51ff72d8b8880e6f1c1afc385f7693b8b86b6dec407f187a0d27133df27d3406a8142fae7dc79f66dc7b1dec89d86e81d4d38b8b76f877dfbcb9794195890974c68daf52ca96b1038b813d442546131183972cc2f6f0a8ee5e090c2e350edf60618db89e9810e67c1be712e0170510e365e7ee7e05140e6d51d233be91b539f3d8b95b63a0d5778a943b34f75ef9289f97a003e22c37fd00a714be58746ee0f433b19a9ad19eaaf0cfd261fa72b1f49989dd83b4812e08ce4d602912ce75b976f7d0b6033b4da796697b9a83cf709baaf8e4c853ecdc3acda523167ff09c19e7174b8c7c51612c7a02e1b9760a4c35c79c2d822cf90e748070a8d2e0ce714a1f291b7400c9b53ae02e9585c51a4d641a9b149a57529dbd6cf5690148e12538a6c0adef1c2fcadb0502ddcf8e0d7713119b0db5be82c292cbeb591313c50490af70cc163d4c31451fbf732fa5c517ec5c1f360449d24acaaa463b4269c4542e57b396d1d37f1b4044324959cf068994e937b41b126633b46d1ab4820350496f3a09ef82e70a55957149069899c2d39cbe18e12b3bc6871394b4a6b1a6b805d1f301143501d268c7dbcf29dc44184775aa602227305f0e27ccf48a76d7e1f660b071d8c9cd5cc91ac48a6e62acf530400c92302a0b53d3c819fb6f618cde9f9ea65556d3c016076780a415018e9e964489408dd29a6686933dadab06dc2da429a39667d3b193103804c9677cd8d4db71c8ab040a45a9592b224f5c7db1f95f05b62ba92c04e0d06fd44bdc82b20d0c3b660a8da4af4e13decc11620ce435091d236ada6dbada8ca9fd46a014543228b5186a16a7c508f30a69aa8aa74e680fe4e5d5961a75e93c0bf22611e46e77bcdd7b0a9ea7785ceac37b1ea644f89204b6992400e6778a60110bb53ff4e447881c703b1b778dda5a284ad595ab967a8e3f3a0c215d4aecbf4c04a4479e97838d3e00a493fe3406863a45cd2ae52ff0d7e4584392ad1cc34c7179490b52b5ff3a97a81f6096005573ecc737208b24d0967d4e53008d9839e33949f09fe156f9af95f4f10b482d314a1f5960174807a130143d8feaaafad1694b1078cdfa5e2ed19e0afe01b35e275788909d0ac86cda8c630222b0e7c1ab720bd7cfd2ccd404ce8e629a5e632603ea5c18f7af14d6021fa5912e66966b361f1451ac5b169d49cba3719642b0586f6dab5a4281b92d264bd14aed2af9272631ce4d4c7657f91d2a16034bb349029c084596d40e670638152f3fd8ac1caea3c83d03bcb76a9468a9300db01ab4055364ca8d944afc3aca3d5d6fde863b2a723f367a113f96d9066ab8569103631e684c7763c9d86c45664e7e0632a341b22b151fed9f9b9b7f721b9ed03a32c5352f8b7c748e00dee1548bcc7cfb03df3510bea546a98e683639f972c08b2f87da90555a0fd55ad53cc5a6da2e0d36ae94317bce291b6003681b9f2d64ef0507c3413517df68078a1c03f23594c0df86fda4888a66de3b5aa89e49cb667aebbde1c603ca3f5631e00e73b21ca448f74d9d969abe25f8dae06cfe829266f9da7dbe508e71eae556462465af2692cd245cd9fba5b3ab43ad11536acf070a53f72cedbf1f61ef77704a8ea39c2506f498187ae7dbdf24031a7917ce24b4242e1bf573459d4db43cecd679017bf5aa8aba71ef343a3961ca2f490d6cd2018cca5527880d2d9b1ca6106b4edc597cb0b4908fb9b37ccae99b8fbed114c9f7c72ea7809a668861ca94c10ff56d7065ac10818e9fdbede3f903db77fc151c4cb22be0de970abfa4e30854be2145cf37f1e0b3fe8acd6f34d166cf5d54561f690f011efe942526f597632e9ac117ee64671169b30a3539fe01419556cdd27eb7a7785b579d34cbff4b1d235fbcf590ddc76956505f78719af004929c8512c72a416f95a417811b76658b45f67600cc981200cae7df7adc3e92fd65ee20491ac3a338cfed5a5c51ad7ff130309f0951f576edc403acf1196788fb0ad3040e65536ac13ec5b0055f4361833601b4738de5b8eeb067e663e33bbfb1754d88df4a49184a8367fd04ab9624cfbb45fd6341436248129362a340e4788b83c5e4daa17543e048fb1c45a0aeacb78232fa60f87aa18f9c43b1610f90f269ae0c64eeb9989281c89947ef536cce1ee7c97ff86cdbebea0628de870718d6f6f00c6fed9608012a554e3068e1d3db9e39800f8044534df53f88d56a9cb5f81a93dbf81a19e832f32a8c0f656cf095780321241fe794c3869ba9bec81e8b048d4b8833e3044697e65e8d1a6779358f1d184b2837d4ffc8fedbc0337080d8a2ffb2860cea7c8c23a99536b75a2f7b99fed6a40b9b755dda54bcf30b6abded0fe3e3701823772d00eb2e368e53157273f3e5fe4612f5f47c300bcc3c4a3fd8fa76a5b038d5a2a6fd7b5e47f476bbf3ccdbdbdcfdb82bd84339152c78704e77ad78ffa0b7f6ea09eee96f2e1af42f989e47c5612831e47b9382dee5586685bd2057d86983df97a665f9b0a48192991e88b81d80f8af9e83cd771e96a891faf321ec2f7d499055623aec2816c3eeea0c5f2d57fa126aa6fa68f0f20355d74e03eab17fcd62fb33e8d64ace0b607f3001983d1f7780894b7b875a33cfb5542856f902d353f4d29000afbe4c03102316aff62306d82d30671a74827b93fd16275f411f32275c0b1a8759994b736caf7245ecef0e0401180852cef09165cff6b5acf5df69c1b071a731ac2fe2e0950ec3f004725c7ce81efb5cfaa464acb1dd7a7e73230ee0b6326d66dd701358d6b7fda2249738679669ef1cbc6cd67f099960c59c25c7855edd7512096a0486b6bed41e4819fb3f28cd2c9872e293ab7db91609a9c5994e8fd09e8118ff3728cdae4c32c22e1a7d1420bfb71fe730791e8810fa924e73348ae3e5d42b168c3878c87b38fd5d066d9322cebe5fd86aec0220c7f4cdbe5f220e56cc688eba8acffbb1add6a2a20191b87fbd605555e5d7ebf60081788d8be5ae4fdf84f1bdd790ed3e123b94703c4690e37df4b730c1bbb87fb810f3438f7b6e3d82f8d7359e78efa73772cc892b386e0742c715065af308a3fff8c47ca699fc75d91b9d7dfa66fa87801e9df4851d889dbd8e25e822597a47da00ed9de1a86fda2d26fe1f0257c49b74cce5fbd9bc8e8e792964617c5447adfb3ec1b78bd3879af008ac104b786724b97c86c965e617107dc00f13c9950c204ff67882da0cf3403c0a496662b18cacfa0d57d2fa9b3b869fc215b6da336cc1b5c3973986afa808ab2dad036050f9f6ef2cd92e322456191d87d486ee149abb2d9a8cc3286a23d6328708b0e266fdec3ccae277f9a2cc9f565192710809780c707755d5df1335638d9c75fcb201532a45c88381c27a3bc657fb20dc220d68b702b641a7412d447ee983b89841586865b60c9bcf4a745f353dd11dd319d634cc0e7261f1b09c1dafae14909ce3614b7f6f8dd0e330b6ee836b990dab0978c501932b0b3c64e4d8579a839b460990511e392abce9a59d8a75acb7aac9a09b08c4b44c0cd2898e4ddd86a72aea8fc75377b99c9a184863a5cf51867939e12d586deb120f9a7b31fbd317ed8d71f91b8889f8afa84c733693f394e2e522b50d0c46aa8738197e0499642e923b3c3e3117dc278cf9da63a0c0c6d6a3de78c98d4a9d4321cc20efbc9e775775ace77611fdda94210d46cc89715e46e3d66151c32b878105f28c52789717b40476d8d64691b506e5a7bd9f13daeab24236ced6f99428581db3fbbbc121d8d1a378e4814e64d94fdb99461e74862785f4ed01897a85b8260e2065fde76773fe975c7745dd4e1eccaf19cd28e672bb291e563deb3656fbc18e7f0c84b6b4be6224052ee8de132ca4bc30414cd799e8ce41e4f77f765bdb5af1104493fb8538e5cd2cd4ba241ec80fbd059908649392c771460c3ef708743a7a7949e8afaae83cb45b7beb22ca665168588e3ae931e002a84477ae24d0dfd4bf520b7a07473dc3669f4dcb6229631cc610ad2cf1913b1a218034cde4fb888f085099efdf1e620a5db64a0c73e0621957b773100046c2a7a6f5e2e8ad8a9ed171ac251180b496027a9f995596993d196320270e317e1afd5e2bda80a75803d9f7c0e88e238343c8ace8cff5084d7fc338b5f5c0ea53dcc7da4861e7ea75322f0fc8afbbd7cc3114246a9c4bc82b25998a1e340da440c9813d707c7d1d39f6a29b05b9cc29e0256cd6b53633662daeb25b5cf5f0f8f3a4f107bb21b58e0ef6922c601d5e1267c65d1841cabd5108c0c1fa150523c802f1972ad4a3a97a9c130450cc39039b8bea591828aecb9d5db1a9bb39042f62a181d72e29a977d5ab29cfc485986f0bbbf74d24ffa3f50850492483ea5b82552200685b76cc0c37fa1e7e9bba90dcb1994140ce851c6c93d0b64eb9894c82819d773bd21889761aeb001fe0dc11349c89d2e88a722fcfdee45db3226b48da62cc691b69cb30d2a70284247d614592179de4d8d2a28bbab4162c211a2ecd1224519d61ae21186a7804ae002c405fcd7d94cc27db36e100d167a9994394dd691bfa06a33db733e75a4a060aa5d8823bbd355e394bb41877459106ca76ed32e2da2b70fc050b167cab6fd7e86b298fc0e39e3f243321da576496566d3032fda6e3aff998bf26e6179d8b48753dd175475db02bffccfea3a72d48db18236a119476d0825a1c875d67161a933e97b42b983fe68f60a6bd9813b34ca21c2824722e13607f8d048889ff5c43d99c64453c580dcfdc7aa96ab32f9e8a5ddc4687e3dd673c0a55cc5a76504f86e9e45dc0070e4daa5d790f0836e8b64969dfb2bd402a59758cfeca5900529ac764778b72412fdc663b8a56a59385ec136667e5a3e29aae6091884e2db3f99c2cb93c15a9328b824705b1f7376116013300fcfb05387bb201c1291011c6d86f41853d556e7bffacaa2b1ad4fc3550d4257f87901a1435fc82a53ab784a5e6f7db125be4c796d8f8b584f8baffdb5ca5f305046ea64908b176e216c054e1f64808248de0f68d1a7e5f5e9341a7f7c42dcba8a058c8a37c09b58eed50350a018a0b04f9b6139278d6d52f48e60491cb5f07e7d8a1d587f71b42fc8bdf680c1e84ed605f77a111747d372554a7cf6e5e0f113b7b10d22117130b8ad3455f242038749155d0f462dbbd67fcbf229040c7689c094169f53e935e7f4808dab0a24bd206b168f2ccdc945b0c40549e75ddcb75e163788953cb166a1beee73e1e5f4aabace38ae7faafc92f193709045b637cacb1e466e76440053ed5bed4a890ac0784ffa4e0fd3494bec8af112684e489f8ee587ab83352b9952077bb897a35d238556dfb77f0019ff40f3bfe8ce95b72f0098e35d1f5457766aaa4cccf969d3e9442e1c45e79f02e15b3a0c0015b9c3da62803da322eda45856f19b7f2fba20690b1fd5a8ee025b45624087ced6614feb80fcbfbf7e64bedbad0227ada704a4e2ab67b59fad642d3a9f6cc6b830d2ea1f05de1b3e1870294f4de79b01ef1e729d7a130e4174a6d2f01878e936445bafe3a89e53be4d7b36a89a9fea471ff66801b5eb993e2dae2fcd7fba27dd42b055cd358b94ee4df5126e330b74897023fa977c4c309270748eabe0e96ab9271619cb20f2ad3eabe048bfd116245db8d5836dbc8714dabbf793bf1aede20cf2f60218dd39d122e734b682c0773104bee02569bd09819e0d694e6bd073bf46a2a06a875ae8f6262c9b5c1684284675cc0ae534c77c36269b1b0069637c0db4208961489640b2f8908eed155212f46edb0646e1a80ab85249af0170502024199f1cd81307d1f6d7577afd4fc06736eb7f840ef919b593d9561e43710ba56dc74eaf97a7294136c4b5578b036f27e870c41d80e662fb5dc32bae25b142aa2a43575c5442cdb5226f2cb82aa960b4be06520c52bad382e0af7cb1f9eea9ba2c2abb582a6f8e8fc936d728ee9118421d73485084689949d9f27960d079b1218012037ffe6d3e968b853853fd33c1c7d0c7c99ecdda6dc8f871b8d38a223e2fd382edd7b729f9b6fcaf7f362e9fcb1c3e7996e9d3c291739efd6ed71ad8b3c5de4a2e0e7f4db373c2582b08b0ad061836e35f21430a484a7fbe3eaa1a9f5519a4ce22291e0ddfb4d7b1562696ecca5366f9a60c6f8cb73e018ca6fa6d7219d9c8cfa2b62c349b7a0e98a56d436974cb395b31da73bf878ab1d55c8dc1f4cc43f53fd33c99deffd1c6e7c3444eb87fb6999d657aaa7bce67175ec5ff7a34efa7e1fe1b12c9c4601a679717b7a7c6cc5cec583915d1d465224a4014d5a42fd7803f3c2eaf318c788187dbf67403e358d22f48f0095c35adc244502274421dfb0b5c14f8f64769aa40eb8404f88173ba6d11d090af3e2af878cf1be9a556b669b0da037bf06f692666f11f450d42db6bf5fee726b4606bddafd44a5a80ee5b88a3790303d834024577500482f97af1e482b1c18058d20e3873c27ca05c72426f85e49533f9b78b69df2671d69c97797fa953dd10974e8bb85601ed8b57eb72cfdfa28f8186cbd84ded913e7af02df87ec0ee400d1e7cdec2194b5d31b5a07233907b38e8b957d884e38b3dcd2a8e06e2bfbde7a8dac98a868d673e804946be66b27b1e0974c098f113d3eb139455e5c63ea7372f17f71d7873b512cdc9297f7ffbaee403c30e4ca3d2ce2b253f598eb98d72a3a33d4b245b007d5c8551bcf7b13e38ed8e3c193a4f7e9b7ceac0227a9799d160e05dbbda87b9f2c95cb102060ea7b2c51b065e490c01cd15f370a108c40927968d63c1fb9cd4c2924a86e9cc7e7eec05d3aea9b2897dcd7f7ddeedab904131b20a3435c9782a648fe1bc8bdac8a54cba06a880e98aa087040e9099460e9c2c9584b8f9ba95779b61f124889a274e5e1982b481fcd2c17549519d2ee384c573cf5354618a695495e21459f677dd3331b89869c677c40d05efe06f63dd745880b7791d586fdc6249b1c162dd07905c538f6ba8c2900b06aec036221e360e3c6e555326551613a84702521171db49086c6f7d0fa196a8062af6488d03d0727b3f58232a50ff1dda4c412dc8238dac687cfcb795238774d05f74095ee79eab4effea914c8285bdda9feb77309a43ebd51d654bc80fc8dbf11069910a0a68b7196c631cbb5eca6fa667c39070134640e624484345970f956fdbd1a3a97d7f79db667905055ed2448ecec4af507132eb52d8b44e0e96cd987a20ae18488b882147274e03701420d00e2ac90bd7a5161660daa4230a7143eaef71038b32a78c249e72e2fd0ebd1dd6200f4833bfeeb252a67a220daafe6d9df2a97a7b56c0ec1ba33f9db62cce57406d3c879d1efd5030edba00598980cc0cae3f1dbecbbc03ea2caf6061ad4f5a030c2331340d090371beaed5c03ce7cf9091a04770951c1115503f16c7bfca3499262be1b94dd7e834af03845640993627434bc5d7c2d8360c2777e751df7308ea01b123117a8b5d4df378b50fdf80e701000fd8a44ef4044cd16d0309db7669dbbc62c1225fe1ae646932db76d0a0031d6595018ca1c0d8261731e1ab511ae7d5971ed812c1e37aea4eb9751a46df5a5038f73aa3a0adb3806e2ff39c883dcaa3e51dbb695bd4812b0e478fc5e10ceb5a2ab10db2d3e19305be0489175922d268f74bb38c0e4446e14fd73581b5f2d21c3c2c35f453c0a9916f376567f92c8ce9d525cde2faa672330c9da6d8145bf2023fe5e9445206659880509b804f9409a9098ba0aa3d335183daf408bee638b91688f3873238d7e75330f52a964f1b8629caf4ce718be0b16c3b6f81bb02977ec6a2304d6ba725d472be80c8d0be614325f09e13431028463f4d289e1a71b1ae5660b96d9e7cae01448074d7690cc9b3c129759639ad71e02b042da0c71feb30e29ca57a5346b7f80e26b5eb528f5a594748095d74a0c697d0910bd9da2563caba40ed10daaaa97a945ad1e487468db796e312ca9a903e18f3e4e370b84a2421ed9dd6929ce0e19696d1416074bec84a2baf668d0782026c514c088816b9714995250a0950cea181121bd1b34488ea0df886b5166d68b02d21ac256c83cfb9e27f10b56ac36d0ac1921de7730a562f23880cc73533c02e22a433c3ccf75c9ab0c606c8543f878b3dd0e8f43109dbdc522758ea891552facc632578ae7e792860a1d18da6cc7c8ec920e8147561d7870a0f831db345a66c80f13e10cc96c636445a44bda7b8f6c1a983d8302bda659df951591cd8f92283bf084cac8dc8b666774d18c7827544c2e69564427df23318cc22325199328468e1468fb8d0de1a3e0b010b2fd53c0053fa40cb7032300922766ce3efabeeed2fbc354d14ebe27cf8a2a71c42b0d3eedbd50e28f6aef360d015b52e66640703f1080c0062e0de48991822a74679832441860d916ff356c132a159a2727dbeed1d967cbb2c311fb5e0b4c7b289c7ade54554385507778515181938b83672d41b316d3b9b668b3be8e85e383f95f1f1f0bf6e772ce4bca8be15fc464b5f13c5806fa8da348d4f63cab6eb1734e3b44115275e6194bcb65e1a79235c83a98b8a7ce1e9c627185103ad28319c6aec66726e70170f179a92f0a33db99991bfa44b53212f84d09197d4e5c7276bd77a72eb1959706855741746e0253a48db1e4f932aab575dc5b862bbad7d80fb27190edbf8b2d03145482c02412cb4f5b76191e309f834401408f9aa6366e0d24fa49f3d1bfbc92e31d80848f483e437c017301f711a4eb14f737ce1219442388e5998d52f3131c1bf72a08c7f7f455ffc29982f07eb00cb9170e39b49f3ed68947b62ee572381938b2695708a4541b9faeb95ffb1129c4cc73fb8a6589c304accbdf2d7ee4d65a5c8e8863fc90bc13556ab797ef02454c221e4d84e1dc1466e591b9a0e09d615f0a802f96d0fb1938b5d0a1cfc08bf615c6d68473d1c0dc3977480a3424659bfd24e244be6885e3d97a342b396cfbc326959f0be2afa464c40f23ad976afbb4820b882661e01552976c12154fa7d40cb97b07163a1d2338ab383fd9f6d468394b35ad963af90469075cab96810b20e4d46d47fbfa6b846b1f0a199b1e09b3f676a8a0a1d8c2ed7baf0b670c1e30e893632944aa692a0b0a8c5d1ac18e4b1b2b5e8c81767a28fb29ae10fcc1e6219ec57c33a7ddc140b399b86860b494d0fb09644b21645765f656993ea8e361a1a8ff3c76fc6c5bfbb12a87563188052bf741f4b181b47f05709621d6c01474a3511c416c8548215bd5421203313ea52807a8ea63256bbc968b00bf03d923040868562c48e07588718493c4959364ca93412f2c8790b3f072a353bebd1021a66a92b9c9f243387fa51f6b4bb55036dd2af7ad948b1a8cae2add5be3a3c5391f656e3de99014b6e4b25ff811ec968ae458bf03224c9d719fea59b7b34d2d5ea08ce44ccb806148f201b94cb1b2d415b2e40666b7a98d4cb1458f105e5a992b79ee2eff5d6025c72ba8a37948db1e5f30225349f9cd8cfa07c81cf4a78d126f22b03c43778570b99d99217fb9fe0923e697c32a74443d19fd776624d08165b4daa85a297ad8c7d372addb2b285ff3da3862ee3d1bef4642fb126fa6d47ec44a2d64d47694650304c5f852605ad1f4a0cac8049383e6d71a45dabf60fbae8c3cec04b84890809863c622b2b742afe41bce005debaed3bd303ef7f056528beeb975fc1a6dfb92ae71507e8ef57f8bf3c108e0264ac89278e07f66c365ca3359d469cb272bc0f2bef7ad833af334a2af87830a60086cbf3bfe17fb7d06ea8daa89c68fda9e2f109d09c05d19387e886c9201561fec1b003667a0009e932b478ccefeaeb8fdecfc29ba6fb6e65e2de7a18df8a3e5360b2c552cd2fec8d768c6462b35dc63260e9850bc171d6c4a10e85c4441310dc7072cb671b39966248b6ee0f8db3ab37fff702297164d41b5d3c82ab24cb42cd966ebed2581e070abfed136b27993a4c05d291b6d97a26eb5246878a305725a6f67ce4960135a130098fec7ee53172b164cfdb016829d2507c14f5a22d59df26ce7c0ceafd4d5a1a93cf5c9951ae0eef487a6409f7fd7948177a4cce249468eff2ddb7318ab94438f5fb1178b26027f3aa7c6016174cd139e49cf592318e56ecd97d651d78f64d4a65ef8ffbb9339024c434fb5087a9aa44a1d34bf995cfd9d1c66c84193bde076719f2b355e969f2844a803e09f152ee98a8e5ad752559cc2dd9a12bbc48b5a1bcfd3ab546e7fb2d90485e9dc720379f2870a5bb23ff0dcc5712836c4742f48301f986082642f74171bfffcfe54184c923559cb01e9bf5b679c152406a2c8ad7fcf6ebf3074aaa8c49095022219dcaab4925c8c89441b82bdd7b1b8c6cdca0ec24200cae2429d750623acdd9469fc900465737125fb9464e58199b4f1f580f7508697b725adbdc4c7db1ecca0754a4197b9d8020db95f9dffa187842c60c8db31957436589dc88cd61ef06b3aade51aea0c8a8f0785da179a09316c7aa3c7d94133f73b6512433bd038ecca8cb5c2f3325090b7077ddb5d52253826441b164f979412a6b7136d226d2c71dbdacf5569384048eac0f69c50d0c33a2e640cb8e5a24676b9978a0ed35e36f59ee2b420ed4c733fd1d8af0093c004ed1d08802e02158f6c3fa9b5a85ebc133a38e11e50adb1ac0c94bfbb27b51ce0cbff2502167845e6e14a4e7ba12c7461de40d075e852c6f598944c874fd2f0d40578809949f12ef8fa1fc0967a478229a852a511349c0b776d2f520cf84808cb234cf026b9506175ceb009b83a7308b9192381b602e66d707be8282f31c9f130cf0bba79e4f4cd270038158674826026d3a1cb5008bed2570e70cab4b67f42e94c3cbab586574c04b01544ad0992d3fc644cdd702bb39f8a246c439ed47c0928a2cdb66d6a67b5a5d666d49237cf306fa50236b33e7824888a8a55a6fdbe243d18c2c5c209418a652f1271fd8d59270a486c011aa51eaa1ca7c34c3bd687521309bd165c73079635d816ba605f992a8f9890e0271aea9363882118a1544b4fe43e9a7230ba9414867ef0eb48b949c02160b39ce9a26068d68643d11e06102a4d560ba46a582a6cbb7aa345a6131c6331c667d98952145cb1c39d7ca06cfc68c764dc053a61840a430663316c01b3acbb7d8c237d4f184e6a2ed6d4e1a08e1591b14e0a4637e97a3054259dc703891d833475694afab24a02af94c80b2b00ddb05459bb6145370286795b0e0689dc45495fab8d8e01659a2b30b745308687b35ad3161785190730078f9db67b1e479d28daa05c410cb87f82d74c743dd56b4e145ccf01fa3985425f508c69491b5242a366f2695d45820f8e86f39d5fbe3649d8caf9b7fc76cb6fb7fcdfe6df23483db6c75aef28e6140003e895f860010000c021140000ff5660883180204d78b280cf25e42840973489f8c680086947d92d2591c84d24b27b07a1042e04a5031f118cef86273d1e0f4f587858cc2899fac440cdb0d284294b92f742528468fcf1c5d0f1ad80438a8da3199e1218272cf57c5f9658784966bc9ea92228292b4e983e189286204143b4e247121d61707841363ea619636078a3939e4f8a13162c98699199d2014a8895ef05d317425218249e0944b21f2d313a3c291c21d8509ae121c1f87e28f55051626183191aa670407d4d565a60829114433203d1961f1e0e3a3ec0f17d6003cc0c0f0a0c0f84263d203461f12131f3d530d5420365c5ca6783e927a909490c4422fc204147101c326cccf0aec018ea5181e32e674c58ec382383988f872e2cb0783e38fd3cf98e242de9620e0d249e535251177372729270e8f56dad3934c7006890926c484e42d090a2c02c92165815035be2c16b898b165c97b325310c6433e2d2a38dc8f0742b5c70de0e7cf77c44f8078537c5b6f028aa473b1a23b31c6c81e15243027281e4020c89070867ecee72a60448f7b21be68cb8747aba8cc81cada8b556abfdec9e6ddb2edec105713ae79cb9ee28c951113f6aea20c599aea3a8a331abd56ac5796c7b791968ba5ce820c5f136069ee77d160907241e5d939191164646b033d688c946461222adc8c886c6358d084a23925af199c139a0c68986d89460abb5d5f3e15a973325529f4ccb4782922a4a96baaacb9992232e74927646468c8cba249b93285a6648629678b0c44595cea6c6cca8471702ea22fee97266f49a19a9502226773cb35101821f1af04bd3c4e8c709345ea02075819cd20116d1ccc70e1f43663e8ecc88ecb0b65299c0def780ee7ebfeaf7ab5e8292e27013b2e3c80450956bdf5c1037377f41d8cf2ed9412a42dcd1e28efe7eb0a1ce166a985624ca29c0b9e9149c1139336f40283d483769276f26090bc2087b012b0b9ff371c5b999bd86720333221fc82ece0a80157c7ead3c3a497f460488c68c88500b3975de48f9ca80375f196fc738015914e9c402b289c687233339253497c8305358c6a551322133ca26917c5232f2180d2023618c1a2520db6124808c02b28b05b624e49514430c4a4b56f0a430c19c2132264086e607d9c33c4146dd3053904b1f8c288c13d411322fa35c624200a28c2869aa81e5c61024d80ba0224d23d128a2935d19279459e4623c808c49529931328da0ac8a0c36e2c846983c60d99cc9a2f9457221334ea8a451cb180199d13866fc64dc9610c6ad871599546231f28c56a6430628bca074e5842d5fbc1ccdb011c37824cb204d212e78d488725ac10806a0d9e501b299464e1965c030649c35708c0ea040b6c9a49039831329227288149026b33348c898669c1e344026bdc826931032d96536c92f36c628a34b5664e432ca2750462d1b1a6d642f7a186541948c625a5b40c8260b2f60f1a1c98f518771c640804cee70644c9243f0a30890315582f0802929023302c9211b5434397232f3342231d27365dc2b590d3e9e860c635c182d905541fa41693c3386b23063969125bb318a29804c4ad132566000321a70f8a13202311a6799ad0592f1efbdf7ed0e482df2f3ed26e997684836c4cab8c2c80095ccd3c16553d6c278436201325909f40330a49a809490030b47488a82c4806a642b8c8c20e420939e8c0aa84000322733320b983107d408009908495a4c290196f535a148fb7d5628521ae3e1e5febe6833b8219d18a82372aa05b5cb272c854d12767beddadbc4ea6da8571bb7af7118b074b5d1a1de711cc7e110afa74b7b956bfb1295ceefaca63e938486334171e2a943fe8539d582fafb651de185da823af6b9bf21e642ea8373ea88acc51d50b4dcebe830738f016d3bf59924b850cc186c34d627f5992158515e77bee80bebabb5e699afdc4dcce9ae7dc6fa869a87fbad06d19fcb69cddda03b5f9b47f3701ca7613ddf7bafe649c19a00f8e0a7ebce7aaac5494b501632598eb4bc766c08888ad82fefff8de4b4fd9b824a5fb5a6e372ce9c4b07cb2e678e9b593fe5a86ac7fad4348dc39a166a9a96431deef16b5a285a4a358d6ae2a641f377d0355a35fa77c7c8db07ef589fe29c99c6e873c6fa36e7a418533234d4b8cf61acfeb44256584fd0d7366c92d07e8a3bb663e2ecfbf936c17a4d9c9dde5aebd7ef7b2f1471d5e88b36de8b96bece0cc5b9a94d15aa220ec51dd056ba7deebd7ba8771cc77139dc3e1bd627bd938bfddc04d9af3ff687863f79e2a7e1dc7be7df3eda762f9d3b60e726b7b51339dc3e33c41429501512bab7ef57bd4861fd827deed77893e9fb572e4b717628a2b83dbf2a1429acef1771df3e93c4dc3e3bb67d6c6b4e500402274c31149992a327058b8568a95ba2a6175796a49d73ce39e79c737a1a9c9483dbeb4f7d2bbe34e350e2c8abababf62e67578a7ac7e9bc4dd45ebfe3e4a4d5aa6ab84dd904713bf114f55ceab0c454abf6e74b718645aee090516bad28708d05af06b72a7865aec840e1ca8b5e4197b3a7304f5b4cb0c9818003c49ae380d9d3925ebb9c3d19759f19df01e49bda41038e990a9e920ca0a7d8f7c2530b1f3f5011e34589f284ac4041f99e20e530e29d09f219a921068397e5c63765c637325971e1b960458527c3986f4b974fe88a27a48948d257e3480d423c1b3dbc2232b4c2b0d02a53c3838ae175a9d2f3d95065450e65bc16529f162c9f0a293a9a783a24f1be107d41377c5c66e011e41941c14b8184cf0a1511be28543e689931e3158131d2f295e0e41139d1a2240622de0f3800d1f15d79e17391c2989f27a717539c427081468530de0a504caa1c3d0172f49d50c443928397038faf4a8e8f8c0daf04133c16a6c83e0fa6bcbaa4f16ee8e11b810bcf532b0dd3d762c9920e3d86c8d8102386272bcca0e1c100c38b92c2d39292e2811119cf8c97243c7c4ba2bc98783f90f418f2cd7c7c3d42de8d16bc17277c4e237c334481794ba2b0688df1e1837d1921cb97295e15a5d6d40ead33453a7e784368f864b8f0e100d4f25242cb87261fa026103c9e33df0e539f095b6054c42c79478cbc1e664c807c4d762ce1f056a80046060ca61816a616df8d1f92c47839a2be282b9f17282a90b8184913c49baac1f302c387e306d28cd60fe3970214175f0b5054781e8cf19c7469f570e50bc273d313cf491e0d241f0f221f3f58e8100187f7828d1e66045d284e8e0b4514b78a7c06d51135c4b71ee912805a9b46abb56368ad16acb569b45a1bd66ab5768cc2be45610fd6f05064b54074feacc7ac1a0b6e9fedb37d2caec1a5a84f5997b328a1ae022a7f872cbe9ff3fdfc47a783bee7365dfbeefcfb3e0ada31df32b7697affe62c1667b1f87e978e8ad7b058cff98aff6ab3585f82d6a89eb356abbdbd38572bd687e2aca9596dbbfdf397b42614f96585e20852d4d4f0b77cffca727f5fb5434b715c3a83ae73a1b87dae803e0ef5a69101e27cfb70ce7fc338e71bc639df310ae30fae549b83c0abed81db67fb6c9fed739f7451d10dd0e58c0b935c6badf5ed77d0e70e356df57ab5b168fbd43c5cddabd55ead4ad4cdbd4ba7dbaad5eaf7d6fb35b70a39a87df525a8ca2576d07534e87e7f094a010545f87ecdad42ad0a75785fa55a8522ef75c40cb10e75fdcea57966081c8a3704c330767700e9977ee91ffdd2310dd39afe069aafbd75eb376bebd6d674be340fc86b2896aa5dad99d6a7b43ea52f7b095aeb055274fc9d9d9fe7e73c3feb682ffbe472b6f56b9f367fde5edc504b9d015dcea06e4401e5a81854969c517c7e71075c65fa9affaae6ed36a1434371725a15d668d5d65a6b4a29ada9a9a135afaa59a9e8d65d88e2768e823c0301d230fdd2300d031271068ae1f95201c562986b97e62a55d67abeb4d63c9a47f3681e204e371f3a792356212b5df5b769a9c6f8374c878312681dbf146d4741c5597fcb8dde802e675aa4a0626c89ea5ddd784b532f4097b32d3bb4cb5be1fd2a1575c4fcf91c6a4af9d3cbfadbfafc9ed7b3f7f83f5df39e4bd2d0829a7007ec3cb4228adb3117a2b8fd769f4391c2542eb0dfce849842a70bed735c9d38d4997f7f0b33e8ba568538bd457234961b6c6a72afbc544940456cee7f296f00f29a73ced5a583a5ceb9d69b75a85355596992c87ff17baf0a454ab5ab699a168a3b57bb5acdf969d239b9cf4c2689f95c6eba943ef79bf67703da679a97fa76efcbcb71e2bddcfd0de68e3eeaba17f106d5027a7f86e2a5f40b8558a108f639676672f3d2c6b1382a5447d0234947d09a9676dfe6d2fbd4c9e60b8fc41d3db312c771dcab77b5d69a9566082d33e97797a82aee3b7924eabea5d406603da24214bc42dc35f14775aaa465edb3121502416ba994a62336a04e23ae7c924f5a73d7ebdbfecac529cefe0d4271473e3951a76e3f2b65a5bc94956a055756947b1aeba27ef93878ce3975f077d0adbc967b4aa7cb6adb6b34d6ad7d3c279edc4d9754bf7c2cb55cd990c3f6317e6a1fd3abc29852acba3533d325da4dd32f2dc571596a01559220a7311a738ac164c2483061db516692976cd02f8d6a580ddd94524a29a59422acadb4a3a07d92a0f3699f22985dae249d134d3746680c50bf3f1b13ebf7b9312aeee34ed336069cd3c7fa722ff16313770b75f009ee6fc89f0211c4bf691d9c408ac87fabbe2edb410adedc412901fc7a6e0dcc2d1475b819991e1d3ff76482bacabd88e736819fd33aced2764c458880f68ea504a40cb7bfdb73ac13a60ee5ac9c9344a6bdee0ca4b64d708fc30a4ecc4c7b7702d3dee10bccce7da741c7e1b94f4c152a3a1eeadc09fc38b436b888bb0e39209da473baac942116d1d91ce158e6e460f0364a38fd50cad0025b6bad683a49c3f4e8723655d4bb9c4de5e84f292d51e96673c4e94b16200882a01429556a35b489c245dca776518a317fbaa33ba59362e9249d8131d2e50c4c8f19989ed9148d1998335a6bad35a9f52a18e0aac11215e7ec9276639073785fe7d75ce7423945ac7b76dd281c0702200513d56bba9c8159ea94fae054b5a422f2dcf6056c98b6a9fbf6f8020c6a703f7f775ddb634e7e766ddbf69ce26ca14784cf503f7e9a7db93193c2f2ea79292f65265989a8e35ee5c28965cf39e3218e4768fa9c75d19f7be2c75d88b5edda08e1f5efc6699b215e2d19290d64606b4076edf16f5352955629555d2f39665e6e502084e3df4c688fbfbb745255bd5457e96afd9a628a28fa964bd412f48a9a8e16eee86e2b974ed2fbd6447e1ded338a7c678abeb92cd6dd86aeda242f65259c3fe737217bcef9ed6b2e5177ad5f2e45bfae1ddd379a629bb34c273ba9e9dcbaabbe53b94cc8ae7afd7273c0da5785b653a9de84ecaa50f59beab757859fa297a073bbb8143dbb76c08e29a53645376999a11f1a403fdaddb16b6d1deaf92fb6da8ffd1f155db761db6747687303a72fb7cf0d439b0fa13e2db5e1bc1a46716e15aa6f6dd5ae0bdb50c4dd0c612bcf0c6183e80d8a537ffed8f8e0b4a7a82508a5c6d3810f4e7f80b0ade1f44323d47886a12223498e982cd9d4c0ebd0101fe2435cc7fdb97575a92ed5a61e9c7b2088bfc1b199216b3bd683730f04f137383af8ecdc0341fc0dcef6d93186f811f77ea8880f6d1f3ef4d3453a344487ba6e08e440be7d9c7e1cf519a3cf307fd7513df70c3dce69d0df4d3d436dc30383dd6607d7c9af75b3070e73888a28a222b624f3888ae8eed7af46aa919ae476f36dcff34bd46de6089a423348888ac0538886ac6dcf414d93c6c6068e5f7611dcc16717c10ee2b52ece2e6a1e1debdb6781cda04a458833a8cfb27cd0eb83a0384ebdfecc51e50c4b967901cf0c21ea97a68106f680897a06d51ebd6e45029261a8848c19345257b3010a0203170000280c0a0604633910a5209a6eea0114000a6fa43a644020a1cbe2300aa22006621006811806011806011000401806210444ef050076f6bcde1ab1a698bdd6f28294d8a1cd98d860ac9fa2cc794631b4df3e536b1a811f7b93ec8a81df3cbacd87cb18140b77f2fdfcbbd04fe416226186df23d0afea4bea4a196c2fd03a06809a055ef677b7d259c262a714f810229dc0dde4a891391c1d3d6171dd69e1a28118fbd73ea7611095465c751dc06645a66dc5e2835dc6726b14ad7e6bab613ba7ea5d29989e88ad296222ca381fe9ad86fd62d26e0c921e14701e75e76b234b53110ba03d86afbd6680e776cdf7a6b40ce3fbab43ed043bde65324b953fb27506593b82e6110cfca8170410ce2b9373529055fa388e7bcc00f7a86530567de6ab0b6ff30aed9dc2b3356d64bb0c6114917d22122339b8b0ccb4aa25626505f972b015afcd2bf12bd441ec16e6c58d1ca443ba720dd711c711b286644e2b1e05610cf65b082862cd9ebcbceb323c13c03d2e382a1425e4afc32a649916e7eb449851d2a1c3d7e4755021b6bb1e54c51717fb6b7065a5b3b5215d7a7d698e688e835b8009221311fccc01132f966f7f551c8ddb35a8d0cb8bacf7a4b73b5af3750a3aa6bbd4044d596a1eaadb8acf359be3f28c2d81d94aa69301cc95152c053c4c91fba5ded712f0af1bbe6b47797f319ae87d877b020e259022bb7f75cafdcfb71c3957c8a3dbb5e0fd7ad059d55d4801339d02e22993054c972605c50afbdda70053ffa5e909e77809e27e2a66cf601aaa75c70843b6e045e8585de3ee2c5c790574c54e0db22a48310ccd94b49cc4b8f9ab75270302c0cc4aed9f754a41828f88e676fd4c65345d3c6a38cb1b1655174d178214e00faf2a20ac6116c544ca60e018d5574554cce0d6cefe82e418c21b9dbfd4bd54d972dcd6e9e884e0851df1e55d9c0936f20d5b8b13097fa72d2b20a028ec851bfc07d028f1b7ba4d93dbd71a1e8bbd385c6ebb0a925b44051799f8e64aa42dff32b89c641b5ad418aff2c76e54452e4030784128e575ab5d5eb5ab4db4e84db04bf101c3fbaa4926eba16d81d3cb11e92d03cf77fd56b17dfd5143bf32ae2f4397999535f6816dde48dc56e0f6a6ec3014be1fc579c3b2dba7985da80a4380fcecbf6a10cece87cd4f848dfce797482640056ccb208834aa9a4849c281d7fd67f7103e923f30d9b19f2025c281477b12390a7f800eae9f7b0c634723bcd5261cf54383119f7dba5ea61746b94125dba2838850e3b0d37fa727241ad290fb8f4f9e32fe5f027490103f8ca24a3290d9aef53dbf128b4b80ecbaf291e0217b5e0f7410b9107d59624a60590d7b972266b72cfd2b1ae2014978261c32b78e784410049313fb9e4e332dac79f62689fb8b7ebb1ec8a8755f3377a9d91b7ee7a64e04d56a9796230b1162bfc6f28cccd8080e697ea81b4d3c17feca30c9bcdfc74f9f65d71f9639a88b29a5a0e21cd749e395c0ffb351197da6b5d76984fbf214ba4c48627ed8d80c0e81a5a42c5c5451575d8b4d1e876ed3880542ceb869afb71c949e385dc55000fe2e648258709ca41c67fb067f66e5ef136113ae8bae2a12d7aa95471bddfe3229758b939b62cb0ba4a4aa84a70a24d2150e1e3f17a4de89d9b479c85f270ea38c6338d81cbb3d33bbd687cad2afdb5a4b34a9fd61ba53c970af0cc977ffbc8ffe0b8c2dde8eb52d18fbb30aac6e21aaa6f6decb984399059a4b96ce305c382fe14e77c810f5f47226049b874edc7ac4d794e9c65e709af7c7cdf5d4e996acef9ff1497792f98cbf0f9d17aaf172c866c8cd00be14bef492a91ccf09a32868e14421b1ee695149c4db294e69c4521ac14db3d72ed943e1745799768e29752d33ae046a10e872a00ff4712f49552f4d3c10035d1721a1d4b6c066480cffe31a9467ea0f68328f1d77dbefc986815326c15aa2e1bf584e00e7915c0a235d5cf5988f33c77064141e4efc6ffd110d18e2592d8bf562eed1db15a42d02994a369548d19b60d506aefbed16059082f7aa0233f30aa02f5afcea0d0a870e10ccc64f7621fc105b487321dedf8e3a30f97add612ddcfa4b6d32c2af658b929f04059dc283cfd7c40aa0668d340b1fe8b455974a9de48c2090356d78374615605ce5909c2ea472cf5c336013cb58a102cc4463a05085960281daefd633a100a55fbfff4ed76016dc5fab64be227c4642eb4a61280d9e5053ac0b97151141cef7692fc6c4665b19f585e35a1e6383e7f3653df3cf14c0257d0312c849052330682dd3ab2259bb8fd27544ff0142c5b3e1d52600b5205e0710711be267d83b35945bc0e127b0d4d767cba0e94ee7376ef4626d178567e941caee3145c9ecf07558b5d43af2865310ebfad746aa96bf502dbb2467747442eb7bef6828a58f52cc74104ce869ea9abd8c2f3f2eb1820580a2f7f89a3c66ebb4d96e3dac6393f7fdef15e9de3794e10c355630081f2213aa7c14af63c21d7b2954329b546ace0cd438ffdfbc685b4a14682e227af8566aa352a001ed1e7a82f2c20fac9f8cdcce15f7d0008fd1ccafc3ad65dae5e0b0318213a0909a30ccc50b3c9d8935422143c054630f81f16f0dd163ff53a9ae8522ddb679b4349b8cc9d561cc3abcdd3d730cb34a3341cfb99ce100170eb170e02e5ec724f80d445b67e9bfe438527b987cc6f3dd72084e19e4156517f4c400546ba32cd5e59a1ee7dd31f7c3f6ded704cbb2cbb56d0334bc0fabe33223e6fb70f68c4d0b254be2fea51174f891f6d79d850f4450da97182b62a09a376243b830264ab8b1bc06770e3fb5a9641bb4f7c352f3d8c0a9d8fa575f7a7a0f70afb5901cf197eff191b64e1e02c1f5707e8c1d58d78d12afe51a7dff10d052067a11f4fa6e3cb8f402c479f6bdcdcc47b453bcbf1d9d221361b33d89493aad049248562dd97796ce8a40f406c9874f18f96f9ca604ab61f20f77611af9956f0e95a564202732c52f12c6b443e44472b3b5be58f892e7b0249478ddbac84165bf021bbdc1d16623515d0096173091104ae511b3c31f93e4e654fb5750176901a62ae1bc854b88a1d99b47debf4f3c0f8ae2eb8365b08603499cab214731631232d97f35616cb5922e97b5839f0b983cc9c4c1d8afe1c53c728c34186dc1fced42d94d08476443a979b0f71fa20c1ccfa3fb0c265b6919c36f9e83128ba8ba070856c2307a156d56015dff63811adcdb9b538442c99fae15988ff33a252a82ea3d11a9339972b2351208be7b614c3eb216ba36b7fba82c52c12b589cdabbf88eca975364394dca808e4ecfa484ad1897bd600b20d9241554bec72daa81106cdd1db053e3b3f38803c06823fd9dd0789b20b9f1cee8dd69a9af4e13ea218767f10a1d976353b5161f8c17933cd7cc1a2224589b98b510c8599c90c2ce3938184bee62ef48faf8e53a472e589c676f25cbe0f7882b454df2be88c119d07cb8935c69803cf84b3dad80046160c468e67999a07267c1dab9b7616802ae3146150a5ecf5e802980fa472a8319bb591b448e068d530c463ec08723bdbd7846e0d76974e76df6f6116205643d1432061c3901d6c9b879319c7741353ac3d0a3433ecc28eb1ce60108c4f518d6f49a859cf1e68d89133884a3dbec2f1b86bedfd01f34b1092788baa0cb46253457220544f7e0607c4fadcdc31c016632a495d288c86900c229bbf3d4049475d852eed77bef89ea80e4e263573108a03a900bf826c8e94fd102e48a9cb66b427cd8f49ff6aa2742cd708ea0677ba05e00243cd821151c61cc4c987ca406439d7fcd9d8e39dc1a9295eb7863f33d24bc130e4433e53244087367caafa4b6104bb6f98ec24e3c40763a8f1234aafa2a7e5584eb4246fd289e3ebe9e65c832c64c1422ebddf7b0992a548d289067916bdb36242f8cf0f19ea2a46260f5ec6200f7eb097d8de953adda22754e8aed724372d48f86d5e960e89489f07126161892889c3fa990ac0d94778c48d14aedb898b387d792412dc2b68e853832661a43e7264c56e9f7477bc1e7e9b93050ec1c423527885023b0e422dcd8d9f2b276008dfbb980d0999a43041642c04cf6f779bb57d7d7158ca10f417b1119994ee8d133512623a1304015c9a141475b83f273f0b150e8bb0ad6c35d1fecdc160ae0b71bfeb295c36926f6c0e599320fe4c2fab06d79f710e3be118876b88dc15b21f279ed33c71e11b89613cf0387b78da1a25a057fed8526ab09ebc465ecf28ab18c789a6746c004d3ec3c0a3e36cf436f162c92a55c2f98c42ce67ff4ee36c15a63ed16bc91880428f0f3d9860ec064ab80c8836db345a83174c0c44711cce0e34a788de84b7b0d71fbc1dfb7ce13f8d4f0340de9a2ccb4448a359bb9a16f7c08daf5158ff558dfc504da5d47bac81c932f04db8b79393fb5cc371c74591531244c4833af71e64f286d9f2766f0790624e5274a3dd1ef4e780b411905da1a2101d3e915879f75dd227399636996b25205a123ec20b2189552502f236b2f0b5e105ea3ecadc8d66200cfc5b65671cda49800df883f01ae246ed6abfe9927b30bfaf9cd284bdf4b3fc1d2430c4a0e597d198805a198d7b327c1dd73ac994aa2d0c0ae1c2dc548aac29ca0ce6e1b7040527c921b72ff6d9263441e29180e7eac8b592df498ba78c3ccce6c5163f2bbad0b16d400e49c3fda8a5c7415cb7be2a1e9330cf4f462a7dc7ff40f81ddd8b25a200ca39b666d1c3b922b95d67b082a025cb8d2fc646cd3cba86ca41814814fafa5a6538b8edb1089f3e36e5bc20ac0c74b0fb0a4f95b4900948c8ce1a21105fdf8bdbe9cfe7fce13f522a215f685144827d81bdff9e3059bbfd45b58d9155c60e83c1d26ff684f0f5ed4c016256ec682e9e30e4bfcf98de6a9462b6e75cea60b06f4c78914596f11af00a850244804b9d19bbc57ea49781ac6b06bb90d7ddd6b5e862f18df1da43de390d41fb79978095be1e376aacaec808470b678065f17b64d84c59165d82674b57004197e27b89bd85c48b43b400f81bc0e7b8f303aba7fb8d391af8b6f3522638d6025fc12856052c8fe3ac7642203683cd96a2fe1fd108bd7c52f413f972f8d98a579b2912e79e686eab222a40dfa75d920dab3dd593e8b245029080d057d7d8d52443c307b1aa26855d2d7237b8344bec6667b074d51c6567207b2f88589354be540cae607f897b653213cbfcbe8a4f7176a2373b492cd20dc4d717da111a437ecb9db6bff57c543db334456f6171faac7d09a8d4577330003ba6c3c6cf2ae587e386c238af3f2ff05abb23cde317858a68123f7e662089780b8248042ff558ef9fb6e8b7cf42d5835c68fd13da52b73392a6d967ecf0d5e34ef165e21e4e5bddcd4e7d6db35f2a82555b3438a43a6be6283f3c8411afec2e3851c94bbd30e441944e9c2fb4eb30175ff2976f21214bb5680cc1db9d76befa8ae1879df0a30df2123d8b5a2851dd1ddaa53b5d80a92b91ce01ede192b3e8bf0f0178459059f286156143138e19ed1049490ddf20cc70b78eb3b4b776118a85455f31d9be7f9698abd469e7416ab8a790638bbf0e7733a5dba6cf571b6519ba62cb59eee56486b181af093fbf4b63562c0616345fee7068139410802f35bda24f6085e03d828a33c173acd644e51457744d2527f22f462614b3d9e1f71e31ab94a44880445b6de925a2ae4eaf04da5cf23ebe85264854248e3af040a453f00dfcd56cc2f25a3fff4f8f064d2ba4c3c0a861c2345d16454138b4d0c9a246d52e91b6dd21dad2418a228f693b61054a497308e986ad4a8bd2142422a4647c4252e7a6289d2c3ca789f5bc7d020998d09d265fe13b758cf493765b3f5dcee6a0673152edd6c85a894500a23b87b406763b51226a31870525b20f4f93ef03eb7b011d8db27c0517f94f2c1f5bed695f8cc58e4ec0c8bd9c2c5063bdaf6ccb32eaea8cd961d5b917f0313fd85557cc0d81a56aebd14c9081e2bbdde13ee80949f420ee34b24b81ac5bbe519982e88d2e9b99babae503d0901e1cf3e7a8ab890b0bc8965fdde6e6e9e61f243f06db23703e8976220d4736df92300ad4b6b32c16a26fb3090d4e5efc3d2cb2b06466312ea3018c8337a6ee4a3df7d0c753521fa7f475694df7a0d833795a45b94b942945b339168bc8859a2af27f482ee2480bd046f9e9d4a98620224dc50b14b081596ea23d5fcecae74f29bf70df259e848046d3cfcde99634870053d4542a7b7c245b4a80727a2b29d8025b074eb59842e4ba82db3ae72723590b306407a1b84249686d1b9e51236daa413429718c4a6457b5044fccb0e8a037e7a079c1adc8cf1f3ecdf310c9f7729936b2e9324c745159ff56d547f08a77dcd80c77f7b110b6fe99b3394b9373ae622a692f919beef581163292842528ee03fe6e4d8b137fc264792f7903a9624cb2fc8ac45f4d52a28a07322581451229149acd1c580ee592f6cca5945dc889c98609e3c23b0ae1101a73ee2a5b003995ae607b0442876fc4b43914934c61540778032006923e4696c616cf87f8b3bc15186b2c5f37137305d91e396d4dcb602d0cff05f86b0402a02c1bd92029c1d884e13069d42e44bde512535dc46bd218f76431b21e3e3c20f6db90a1206f9d2686c3a1cb0e1e024f68224d2f92164c33975440d66c7c721b7b89fb9d587a203d83b15a43ffe125e6575419369a635c68a6ca17635262473ed002939a63c07e2dd0c944afa082d0982f97c756e4dfb9c43841b2fea04a5699d38eeb7d463863a401d8c25e44ffeef74853de8a6ce8da5f03fb85832ca8f412637ce8894069eed36d21aa699501507735bda3538f55d81b447b1b4f20eef00b40c892b9cca7dfb01ff3789fbdaed916bde36e73d558b9d2b1b042900b6b57e07395d97008c0961c243aff0c305d81ee91dba4a738c87cb44443a2908029be1e1d4850c90b89f74b2d905c866f672df498084884af07d16e18b10f7c5fa8f7d4daec1a1acdb550708b790e7188456eb5bc063ca721f2cb38fcf24e6e723c802a9c494f24c2b9a1d120b827773dc3b1954f7ebfa1c77fda26135ed997d6b0e301c3fe40b4244207ae792079a5c85e4276e12453538f056a4e46f1f676d3841239c5b742c0b3b053fbe7d9ff238739c86d735aa69a412f318146d0c686d3ffb0971dbbe0da44238c40a39d70ad2dd20a47c2a8efe43be2eb87f4c296d138579841ced4bd9294e0bfe47bf0bc86b3a690442698b8ee1f8d0a1e72941d17ade2a193e710a1af7583f8a772d12c8440efffcc3065a4681003e8adddca26d4186e91fb429edb968dc231224eaf355501e6eaa783d7dd4d01429c5b295a249acbc8543f1bf5d27731d0713d9a9029471036acd92d971fedbae7fa8b9c995b207578f7f665062a576c17d3111e4e9ec759c6aa1a9be52b217e1b3e92c6cc8ef6b2ef4b6e235e58544a3c92a55ab2a3a9f244ef926c7394453cfd9077399f885c7f5f9b132d147786e032a878598bddbf3ceacadb0455d016089063da30dbf8fc00b76c12bf943013279954cd705691067dab2bad94c20544cf7ac3b10947330e8101d9fdb3f98df6afde8104d60e2d9db0e331524c4fa40849fb87a43c9b9059c4d7d4fe03e0f51a6401843b4b8a99b3b1859e56826eef759085074836024d3fece4fe3e4302dd9b84889f42bf182f4ba77d9b8e808d13c33a5ecc8ab6904520bb6733ae848bd2284af1f157ed5a351a7218d7d9ef71c76411ae551861489bd06ed60e8ac9469dda50a686253fd4054910b191097fd80c27858b01ead1bced12dcd816cee1cfd975b19f6625902a52c9968621178dff1f44f64bf33df8832ab2088d3d910684eeb180e6ebe822d79d097b563a5003554ddfdfd868075171956b325d802de2ac3a2412a6ba82b266f71044f5c40ad6f0a818903fce81b1a0e507cd75af19e09f904884a8677a80f358ee7bd33bda29baa12ba8b2610516ef633c44636a4a0ca0bf867d5be90c062fc841a7c32900af838c23c0e3d8e331d5a5150449d3541ee862a874fbf5ab6b786bcfa4307e2ec29ad7f366081ab70b3b09389e32748c23c9a312742b871d7b0b1bab8fa1b3a012b45f94b4b924322095879c82ff937bdaf2941c37357074ced6aea44799fdf7863fe2f5dfdc9c2f28a9f2c05de6e1b7c7b063074aa82a0e2dbff4b29d9c37b6b595e7157c44069173c30481f36e4f552e2b8a492afb7bd58712bf4efdbe73021a33f5901ab18a4500d2c806bb2a040efae58449aa71c497f24aeff88627ea86978026aa198a7b191a06992c8b05fec19e256bf59000ad5ab8cc3516a4716495941a24fe7ddf11365b2eed62a5922178e63b3ac250d7c5b975251cf702e6e4c075846b4eb85fb972254b3c45771236512ab4ffd7171beee13e97091d8c27659c97e178ca3e3b92c37e10dff37de782b067b0ebea21ff84b7e6eb7dcd2f2744fc8d700e1d09b0c79d82de6ce5aad6c3c0a6970004af40c90600119a38d1355e9a04d21081c916ca572d0726ae8e2d87e56608835969d8405642a5f258622c9a90a3b70a7f1a1f39f670d1a0bde7aa90216a30c7903d2a0f25d03edec1651628dfc9ee07bc1ba116b0e251af8296cb42cc4c6b25a640bb89183527c6ca973ce8a6f4a71f7fdab4fade4a9a402c1f5aab869a32b10a706d394c2170fc8e62262faf50742247667b0f334a5cf6daaa914d95fc50648e12bddc81244bc1eef85be6b4eb2dc372fd27d057d6990a99e8065660af151bd1a5b450bd66f60001a586eda04962b4a004c98183a2cc79b870d8c65f81ab3493b49f4e6a2e2242f50d820b4f5d0ef842483c0b92533917257b5e66efaeec05e28ec4174b3522c97db9e8933fcda211e1ccbefef5daeda86f1517c5137c7012c0673f54f6425f6ebf40a7f7f57f0c19b2df3b678d40abde6348eb4377521592f19b61a6ae4bf731611180608eb3f13c4d17dc689a538dd373b0a3f3c93c7343a8a35f170e73e350e33ba9d4d1e4b9cc38a0174cc2ecb07c5ee397b1e7724d994b1f72af460f1e7e90893ffa7feaf63b3aa2c263917144fe03ac6601dcf7158a1ba9066ad08acdc5f02588e865fc95e79a84326a05029cd40cf22f6987daa8bcb3bbd32ce0ed65cc6cca8c3fd4ab509ad8f1839860e462e297b850324917bc14b25a9c6c6ae1a4bf1a4cd2c6e662bc419f29accde6d0b4ef61a74238aa4f0777fe51eede0a8001c60eb7cdca21cd2e07ceeb0e69d8f4c78db5f28cf2540f49116be40bbcc7acf4d27e33c8a40e1eefd6252c10efb84f85bb0c3e843470c3f2672d6dc921b24883c6ab4a7d155d4f85ae849833e1da9addf2669b5a663d09b5611e7ea508809f08e69197b2e200a820e31a5ec9fb7dacd37001780f046e10e583992d00e2479c5239a0cec7ff04d8e6814183d3e44e82c44059899d33b0b0a79877d8b1c3b4d65a0236d9443a6a54a2e178c33c40f5ba42af020250dff35b0fbde46f370d6dc12d5b3d4238c156cc7a47f7870157888d587281fb8ae7463da61df22cc4941ad05f6f0020f33294934e03a5e0a08c5e1384bff0ed9456c01573d5b37ad089b591dd2717c82857555c588b5c290756a415ab59635bc31e75125bca54cbbffef48c82753a56cd02e5eceb8b82b18f9d17304f790c2f19bad57aa61d28823aa2f4bb79471a8341b813d68ed7f2f66ee4da283bf1cbe2195a74404b15db83f1a34b7fdf31527c214a682a03ce2d22388d9c7cf5cf8c38babd81b3403f398a7a5789ef2983baa0f257464f47f4b55b35d44f5813c6cbe83422ebfec8139c033e57eda4186b28e59450b7429118cfae03422df8b408099c200f5cbd857caa2dcc8f122253f8d345119cf3164ad30a518ea77b30d628519f74dc2b1bd9b65411583b065b5a5cfa3d590493cecc85aca413d5352fb587b741802c0da73caf0f088b5816155ad0b644267f6e222c124b7dc3fc48fa7434885661f14bab507d8fb2eea4ffd7ff600bba62dbb20d8d13a2b3fbd883a6d57538205d87b9254a23089cf091ca822ea9d9d1cbccd7b8c017a0958b07eb7fbf771f472e1084fea01ff5cf4c6a541aa99fe82e5eeed94a78ecfc3ada368bd134ab2c55ba845cb02d15c666c65c075633d95b3cd44b01f05bf39818e150a9afc294e606b82d0b91844ce8b752d3c85287669e50e4430a79f5aefc9f2333ca0d036e334cb7765c03091a50042f5c6bb8df479cd52201048895233837d6e9a3ba8df650d199ea64eb8372889e938db2109225144f64388e7ad03db63cffe91204e5a077f314178d25420503407412422415d19e9268a4298570db6c2180f5b20ceec312e021f7ab0f920cf1b70b7e732b4be730018845088c7d333da45b2243119e56b2dcad369bff713a1ee9e2e24dcf1bf9bd061b75c47be430136a323421cf0fb757de81b5b2033aa1ddcc655502c0f3e8a63aa15ef50ccb9c66d80901e582bd22262a29715b76a195c6c31606c9f412f2d2db93bb759d63cb09c01b9e8c5f1c385dccbe558365bd648f13424f86508a2676d78155964bea1ab7a4799a46c66aabc2517579c4c86382fcaced225a15d0eb34611cc79a7db55b8c71cdbbe8d33833c886091ee3d77ba3fdff05c65a0ac3670e8ad556c2fdcf97dccf5866198c52f8dea88daeb4157ed6677e16c87628c4351301360d90f4b688b96da891c18b0bb8b0db0fb3ad819cf3ab6ff57078c0d6600267525831bc633fe345aa8b3b9413a25c927e0300aa4e64a64f66298898f627f364ab4efcc6853936e44fb12d401e2427a73e3681c04da51b97337687230680f63c7294c78a09b9144bde246cfcce1c5bbb80acf097de3567049f0c72470e9ee2c3463c864d30fd6b69128b6e4b4dd1fae3021e11dadcae35f4142138b748975444f1d565bec4c1a9e5a16ee40f92321875988801ffaf4fee7eb8da605a711076f4e53ed9cab6fd01c69dcbd95ed0071c0fb0a37e79c01c934ab76f61c127264cca3f9dd64f1415274b1516e7ece2f42c09a861011638f6ccc8ab253202c03123aaa7dfaf6a68dca6ad35ae9beac41a3666a55d1227137921f739b1ff451c4b271e44bce637ac39251e66628df8e1ab8607bbc6efdc561f7dd4214186bc30d7f8764d716d6dd669e4fe816f30f401f9d742a315e28192f660febf689460ddfd05cf17052112dc5c412b4a7a4a7461773d29af74adc8810bb395b5f1b73c62ed49f0cd0495687cd6abc618955a5906935fd85fe18576574766dcc930833ba86a7d3fb897903392d9d1589fc2adcd3d8d6ecace5b8fe39d84b44c3729bfd4fb1838fec26665dfe6dc202d53781cc2bf4bf515a59a981843ff9caa19e935c357b1ec36fa31892343f4d24d69baf5eda8fd4958d687b602e774b896c9a747c9d581068f0f7991976f4351a2901ce579c5703e06afa4245abb446535d1abe62969c1dbabf5931cc682d9cf5eaff84563238db6496d1b36b315eaaf17dd91a18f3163aac87b589fbec689142b6ba7586df0736048cbcd99931de177e020c02a75b86b385a72450b6cd5f6e7f05beb97a90ab27898b107fb296df4a3fb4b7f06be88ae9b999b9abb37c690061b598ac7b741318070e79afef81d3152a6aecd664fc342195a520779caa39e87a94db72db2a9c38d475810bb18932791010bf8ee4a0bd75ea3a516fd5f5e7fabdeb9e49db5ddc4f2118b6f20a52a3a87180f5295c517128756b78393521f49b555476b4b7e38fbf5d71e83a2e9618d55114f6662a6ca8106655b43e0cf692326c485490662db1a3927c25eab0e6a77d768d41d088a7d6661fb618978261c78e83667018d711bee1625c8a86adef0ab9088890495387ea220c30d6bec32c5c0e28377f4637629d07343ab00338071a99265e57c30690033fbead8c541970306fe5c8b1f198af0da656dc17e806ba03031207b2ae3e76310a834cac6ed1c82e87b8cdc232ee716b865cbf7f2a1e2345ab8efd2712411a62200dea92275d391a473f9d453856d861035d90460735a5705922f641dc3075c9fc79da412e8d9686396a4f0bc8cb032328ea82e473827a19b87bc075ba940c9fb265c783b48d69095a0a8bb2be8aec8e06d19e62f8c2d94e0a54a0214f3a4118f4f46db3919d3c47de22dd4665667a5772308d2db3ddae232e0d72c6a3bced4838f26623feeaaca57b35f25591f2afade68fa3ba01fcb69ec52a615da93b8cb83d0b0e3f1810d7257d394a65378a37e2610815b2e69c5da93efa5dfbaee796efb310b32c1aad4666fb0a984e8a5671abb45d39bd970464b25343fe8a8bb44f0d92df151d94f8f315e7b7a3c4492da36bd6fe9e23b0c4525a8ceeaf5aaa02c4a610c5dd3edc331588a56af9098e7e40217ae51d2ea46144fca6df98184df6db0da418348284ce282e8628a689124b9d867c025c9a08549153982cda3a4a30d15725351d4c3c1da0e0ee1a27e105662d3005942fe79fcc7e356829137ec9457ea41d92b76347f70d73631600e37003570f75bb4b08375c482e85ad31755884586afca571e9cb6fb1c1165b65744184af20c1e3a20fb7d78dfd60f5c0efc96015d931aa90cdc3fd9b7d6836277db8b2b9f38d0e14e4cca4b2991f43591213f665a99dd0982843be73f8a8451a051194c3209991be0d85d71c507b9b2867d47df4d42bc69ba618404f41f5ea5572fa82455d0d28acf5784216acbe510e9f9deaf5eeadb5b2a73afa02497d9c6d026d85ad0152a98db1b47882086303d5237d75814d9f606e782bc79c5045cf121f1cb2c7fde513c633babe3b764c22bd1a13186034fb2d5bce2304b7100394eb02f40fa74325df9185acd66dac0ba441a21629037870b00547b5e6e63938e3e519c771293d2dd07688f545ffa008568c03538f628b4440bf1c773c64ee936c69fa68188cd44a16660046e9be5f87da45252f1beb694797984be54f049ecea6acd0e27d752a72b4b407beed62776ad06e09da22d8151138c02a628a74e1f6969ac36a13c0ca61ad1abfdc87b60e88842ff9f8690987dc07833e87fc7d45eb7ec303b5d0441f173e4e8cfbfc553f0fc8a30faea80ac08b911537f963250d3964244f2285f3901a5f5fde34774593998a69219ed4a84e8ae20e96d4fd1b83ec78d8679e96342407afcaa682cb7fbb19bdc74b15ba5b583a4ecb0abcea9f19ea7da650d4f39d7802e828278acc756380b31880d6a461e050911f9240ce830881210339bc56db7fffc34b7c8d047ab5725361236c4495bd564cce051aaf9364e7950e12517ed93c9f9d41f1feb6482980c72b7b0aae984d9934999847cfe3540d31de804dccfc9b29ed5bdd1f23e3c5ed11390ae8a4a43c78afea9e1ced2bb4f6cf3f6aa2b4e3baa09eea59ae685c0053d6b5b647f8e21364700fed39b59dff7a072bdf1706d7c06175bb2b6be9e16cb340f7dc9cc3875ac3e8838a631e27ad0bd102a18040fd900001e5c3db876e08d8415c487944e5a4107b826cf987f0e9efa16ae7ce9d077343ff4070212e2c9ec09c8ac13ce268165d4faabb8bbd87b24e058a47edcd221dc783623c3ce4c0907ac8bb59b878b6df9a3678b62de24fb7f0a9f519dc8a35bd6153cb843817420a5d4f3b350b8267d04142fc7dd0ea61c1031aa2f803b40fe80e7191eb41d24161ed496eb587ab7bb080f20cdf5d6bb3675bc343881e62f8d07d29787c0f13d9bc85aa5b03888b040f3eaee72b4fafc9c68305972748a7a78ba754a3ff20b41052407988d72c983c1b27f783ee202e523c4971518c3c0ad62cfe3c0e27b920ece02c0fb3ce278a87da9a85c153e5443fbcd883597f8f8ab6f7c1f207d40f57047101e5e9db220302141c1e219d8a178f90358bba2705ee22a2873a1d99b81ea9b414f71e6c4b81381c84ca170f5cc36028e1f473dd9fb553f710969a05cf992605880ba30d15d2026fdc180c0f69360b801f76cf2ea876397c78604514721e05c07dda37a2ae84e06a3785d14375621e8885f03db4c2a5a854441554d312a04418d49b0d0f3e153cdedaab0f2f105c081d844a85b82078be377f85b8f3dda369f887d4f95874b3431c55a2e7049acf48cfd3d6fd611b6211020571c267850f9b0bc45f1f0b6f3be41edcef3d674d16a0dec7b41ba7102ba07aa8e77c323c5adbe23fa8d879ceb6287c1a9f026ee95b233d8e5b701ea460f7606be81ee07c100bc4c5ac270f4e858e0755cd62d793587791f2d0bd93e2e0a1d2d6180214e23df268165ccfa8389f3b4f649b059ae7eee20871a1c0238f63dcc593c76513a27b5c4fb2bb3eb84060d6830a9f879aa687588640411420101ac48a9767b4ce67be2759f3f54145ab2746030621be011a3ba0c2ade12147b17cee534f871a8de9a3523b8628404041b841e842e8208e0a3185a2e7eb5c40b821221782367a1e73fbc28345adc7ebbc40bc3c7020f41029104884302bda533dcd42c3a37539103b084b435c1078f6e354bc7a86a759303cbb7517713c48381557cf96348b340f864e0a089e0e97ee830a160f0ccd68883cf19e642d6b0f1635cfa77b8570412407c44f9de7ec1440943eb66469b1a9bdf9c36313609bd7f8100ccf21a98bfb45778d4c13306e9b577a582f5a2a99a40e481ba90597f49159128f368fbf2e7c50d56f4845952a913075c4d65fc6ec26f1acb2fac44956333ab1883121955b6a09878657bf9b47de9baa8aac0b644a9e3c8702ebb6957cde170af6ddfb6eb7a08e4b823d727077ea78560d7b0f292e3da6560871fa830ad11e1eed992020ccf14434cb87b03e58e8dcff92882fa67be1d63f8fb3eb3eb04e73dd67f1391dff14bcd92c323d5af71c889f7b0fb32b82a8f710501017fff66c34fc83e81f2cd03c55670421d603fe21566c7930eed3204281f774a959d07a864e0484cf47ed743fc4a2c1273d92c80194d202cad8a1615f400ec29a0ebadce5abc1c2162cf391c8ceef966dc54cfe9a87a6e7f894fc7700cabf9a7fa97f2651d245a1ed5fe7af98f0b1f9f192828b7fc2e284dd8b194637a37bc050809657214078939ad84bdc18741466bfad6db9f796524a29a594019505c5053f06385bec378e7db6e6bafca20b4ea316986f5625d2ce2a93ca6cd2fba3b19c4396755c3ddfbfb6be46f0c538b8c1e94006962f7d7ade407ad079c55456c7a2ccf2f7af12176ca5a03a755debbdf7deda719bd69bde4974b535c4474663cca236ceb9e71ec518fbaad6eae5bc71a95ddd365de9c4195b1c167412d642c1771d3bce5733d822f3cd8ff5bafb63d988fed6c6eeed9ee76570db7256b9f4b64db53defbbbb0dd66d9e70bd4fd4d61177049452caf33226696c3ec6f2b1bdd6d26aadad96521abeefe5e8c3f4d565ec8904123f532d147cde3ae293b55ee7e0258e0cdd2f0d72efbd97d24d2935e1f3fd6d974f37dd74fbdc74ef4df7bd346ce7fc7a520655a954aaec2a95675fb9def9ed1cb75279db03797e771c28c61ecfa24cb1486991bad2022d2faf4c75793b85e5250c5fa94dc82eab8b393f1a9bd3032d6f58535d8e706fd59286affafc48d049fa0d51a60b76fab14010680cc704469873ceecdde69536e06e5a6f3ad42d1dbe4b63c3b785a2ff65bd5a3a707023a306855143af4f9fc264c2acacebd092fababc790d10280c8c3d6f34e473de6d39875b7b076e9e33083c8ff3b6ddbbddbb75f8c44fc370ecb01a2cadacbb2e6126a801c2a6f596630347d0d2250b965d85e6d4d4252d1915e5a0d94fcf4e093946c03181127ca2c472aff6768eeb77a3415febb5d6ce79e7b45145b3e929161c5ba22808391bb73537a7d699e1081b54f2bc82d57368afd6593b1cd505d55ad7aa6bf8511773e7e0e6d460adb376f9268eba410d9a333d476b9dbd82e24efe1c34467d041c3446a5d7985715d250fc48b02009f6716c899a29d3dd32587e6e79798589da77b4e5438e17083568cc897a65fa8c8ee66ce687c6a8cc8412748e0b4c00078dd1eadc03c4ea98d21caf5f000f9f8863039f7019d4d66a55aaeb5665c2abb655a97cefbd555446cdd0250ed480c6a8eaaa6a10d586e2086f954e7805ed0eaa9eb5ab5a6fbdf57a8e979773eb475dd4fd52a94251bf0ab4dbbb71256d71f9aacba8210939d573ae771564bd684c6fd7cbe96a68c89f61cdca75acfbcaf3ceecf9bdf25c7ad7dbc4dd814a27dc82d5cbd97034a01b9c0817405d502d83049fa86bada9a195de8d0674167c8122d4131ed8562d203e29a794d2efdcb6b96996d6534abd4d97d8cb9933b457662d379f33eba9a79c726acff17a49a9d6a1a654674da9de24d8eaf289faa5beb9939f94ad315f07342683c6ae069b5e31b6b9e8393548b0df9ae1db240e0eeb69b2678e031c0d7c6edf7969497dd6bdd32006e6b7b87cd7c59d17b3cb8957aef32a67a7d73db0b5c477bd9356cbfdf75e7f713cdd6ab5721af25761cde73a2bcfbe0ab37fbe39cfefa8fc03579e0ae4796fdbe738ec5aebbba7458209a395c62d203e2cc51dcff17a4c252861ecab3f4031783f7b21e0c7184f3cf174ec132433bd1962eff20eb1df592b8a52ea432beab575794e86a7d4f88993e8abb7bc7c380c59c02f3aa3b37c4250d04f6fea9c75ce39671c35259539735a29a594d9aff4acf30efa5de5a567e9d5cb718983c66ad40e34c089d9bc686cc67cea955ebd7939257c9e39e72977de4119cbea760be28b17a62b2888ba02c6e8ca973063a05a3d601e8e649e077e32ed79e10ed22ba34e26c327aeea6b95f7b66d9ee7390df99ee7d7f3ebde7595e39def54deee78be03a90e8f2c11da832faf086144e5d44a9d6350e61e74f4290f177ab39c0be48beaee044e26eaa2fa96446346b3a8ca275eb0e9057a862fa4d5209a56139fa89f54a794f582c56ec4edb9e91e28bee6af7c821f4843fee7d4ab51ab7f61f54f855d85dd797e0576be55afef369fa08cca6d61c61f0ba7f2f0d1b498f8c49818fbcbb29d5b4ac3ce419577d7afca5720d65aefbd7758e3b9cef6ecdef6ec3b9434b6aff33c05c5fd74c7033b2ec7a6a08caab2d405758e56249a56998f7eacd7cc51da3ec1f9d6721ce734baebdd75aeeebce672e5790de6d89f032f5fdea024ece8c8d577e8c8bfaf77e37a9d557b2158a7ddb52e5f4caf56b2e3d574eb7af255d7b9ee92f24d196373db6190f30dd4b17aecd373a8ed1473e4e5abd72c557e3a76a697cf23f52c5e8e469e7e677ef5e9da3b3df1e4bc9c396706b76b2975dedcbae73bf637c69d97833196f285e719e430ecb3d69e6b6fc6f4ca6dd6c33ba77611dfc08eb1581d679d29ceebd9981857e7c9996e67dcdcb89e7c3a563fe50bd72b90f9ce459edfc2bcfc2e8520222f595e3e5195e77c4bc1e8bb1b0a435479f76d960aec3870bbd7795bc25e056e5eceb68978f53bec6fdfb17f5fdbe675ef6a87e2e69e6f2af740adbd1b9c7721377fa56790a0e3028f3b57cd895d85e70daf73afa39dabba8e7652bed8de71607615a85de579a1e4dc7a3736efbce340dd8572c3d786373426b92022615e3ecfcb1798babc73d5ddf0fc0ce9bca15287facc5647c400cfbbce74ea34bc21a29331bc7cf8722442e577d8d7b17aebd6b77927d6be4dc7a0f64d8712f6371406e6e9ec9cb3f620b2f4315e8e43c2bc112723477f73138384e9327bc652c6d8b13f5d746de09b2fab63bba59437f285a43a0811e2af4b1ad9ed046799c7a038c519b30cb5217d3a0d19d6ecb09ccfb0f2bcf542b8d86bb8a3ce1a1ddac83a58a75214300ed2e5adcb8d52ebd5a8384e45abf701f61d7ab322d155afe08c9df9d95d4b3eea798897cfce09c1f2d6edf60137ed8c1acf7758edae63f532d4316f70e18e49bd10accb70470d674cade907b07d43633b1346c1747225c3129d5f650cf992ca18778af52a44f6d6ab8e9631aed7d5d31bd56da516dc71e78cd255211e7b96a1cb5f9f58bebaf581ca53df8aba95761a1be7353ae64bdf617fba8e15f642c09eab0cc55a57e275126c7c8f01ea9be7cda97c215fd0cfd777e6e635d4b13a9b065e82e2e67273eadd068a539caf3d1dabc780942fc4ea8550436b77cc1df36b72a88343ab437d67fed5315f73d33ae9ace72062aceb71267bedd8ee5aabc4c1f91ee75bfc0c35a071d1f0e1dc74a9f7da201ee0abdb9baff3abbd32049a6ba96783863be60c75b06397d7b391430cee98154f8c4327290c1dd3e5f489d6f51864c7fc1aea086cd1c10ef1f0ab97e39014122d8c434ca3100d2e2423e773bfcb82a12a7a1c7af2711d49f172145ae1f1cb5188688ccbc8a8c80a882880021123584196440bc0ac20a887fa720cea3202a132fec8e22a22c5a30105eb0ef31bd4020a1f155e0092c3931f3d7e10c2837b04111b6404280868890d66468c0984b06c23101d845c44eeb031088757bd1c83682f3a4e8783ee664d0508e410a4e664fc410535a8200522f6a9db6a02222e21174b6078e243440bb63831820a37ca3c20640452f2fbe508a4c2285b1a816478b9846c112ea0ea7a042afad708346b0263ac4377bd3e847cd2ad4bd7d0675dfa66e94dc6d06edd9331b2678c5d015f935dbe0e768acbbcf45870f91879681979d446a09eb147cdf583560784c1e9f13ae4e0ea212ba56e3da449e826a40bf9e2ea69fca840ba908f5d3f9feba5057ebab4daf5d389cbc775c2277e7407dcfaf26587c5e8a5db977376adf5361f9691b49a58b1f98342f140290dc2160beb4587e8100da24374964198c3e69cb018944f94b4e9326cf89a3ee9a4202cea1aa19b962a330eaff701f753faa665da8dcbd685c2985e41134aa0314aed52387ba27ce25ca24b53266d97afe0ab09dd62e213bd0490e6064aa5a4f2023b32c6f41b114058ebe91327d4f4523bf992e1a6b128235a4fc61fa817c0cbd1c7cad3d8cd7e654f907d8c85b02f6fc8ad37e4cde49c472fea26a64f9c5193ca9c3eb1482c93caace234263565d1a0990d8d49ef817a57cfcbd1a7cacb2fdf75f9a26f206bd7593028ad2263f269f8d42063a0914fd0cb1105326fc3cb11052a746a56994d62648c29e6e5675f36dc22c8185304f9a2ee5a6db5b5561912c91893e8659d75d49738909f8c6aab7c51d2883881d6ad689d5e4b88a497de3ac137bd935131b34663738ac6669e455ec64f7bcbcb37dbe11382f64889540c0d436b13cc3767512c2d978b42d12e348ace17757aea2a9a68ec7a34e6df249b6b6353e9b4d1aa1a1b2f573fe79c3ae3bbe98ced105b7354ab7d5fabe1ae569baad56ab5dac57aaf58b12b38f35a6bad354d7f95c39baed5a66ab55aad46a33dd168341a4d6fddbea082277edbb66ddbbc68a9a7b3eced5a9baad56a5cadb6d1684f341a8d76b7b79a4101a2f81a8de3388ee370e84f7c6dbd6b6daab66bb556abd19e689b5669341ad84545494545454545cd9cd8ad170d06f708078af5619e6eba56abd56ab4271a8d46c3333b9bcdec2c2a4a2a2a2a2a2aaaa9c9a9a9a9a9a9c9b55f43be178d0d0b0f5b6c1c1c1c1c9c188ea85ad46c369bcd68331a8d46a3d528a5b336c39ad6dff77a6d7a646331f7d78bd29557db749366eed1778f56f748758f3c2e6a9baad56ab5bbd519cd3ead2c4d65699ea5554bbbb9d194666796c8ce6c602edee4598ba230b0941755a3b8a82d4a53bc9be651e7c4b9b8b7a6a626176fbaf04291606b4ffda1a1b837cb06d673f3e285f266787fc30b4563d4c74fc43d5098c5c599c5a6f21e8a0241488848c2a90ef391439804f198c35c080f20c7b14a38fd58dfeb637d9f9529eba124044d80080144982c97081166c2e8084942a9a0061584d060e4089621419ac08024881844f081a23142806a92234349a03819c6392779fa9c7d3eaf5a8aa030937c88f989e242a40927772684e43aa2870b78081912907944856cb3880f2b0208808ae8000a98442972837891612022408801420a0e3e2d0c0dfd20b1f0011f40f840035107522094a404410c21a5862b4066089225c13d92943065c9d21312fc60e508c89ccdd0848712b324c6250ff08f21ba4711631329212e438c5c1f1eb057643c286c39fa213b81c90e526414a94a8f8b6573cc9c65e9f9e125c90f30290021b132040490a41f84cc232af331a58ee60a53407ae041c49324c6dc1e48822a122641603530d154a0d24344131e4a50243c80b0bd3f4994b0474bc872121660a422286cc918fbc7c3636739f141aa39470cf5341103f5a5caf50152876442b6540984921382b8502d4f0b2fa8208821424680822e178526425480249939671eb987181f0a8404eb71248948821252f493744fc0014802445b587074a586a916dc9e9c0408215ca62d8354f4336bb6b4e0042d6431e2c70eb60924314247b5077a9338308484840a9029c184200426f82202a220424c20191dd9243f62929c50bff8d025a1168e404529e269884c121f44485428091eb24f66658694188250c24a96142c91b4822047488ee8a173ce328f39ccb920ec12524047588644c720f9f87caf8ff57d3e3f1831348352830f30789095f8ecdf109f8f6a3ebeeff3ba03121142492616f3180999c7475f7c5260998f0b5843b979661de65ba0dcf0c4e485224045d824ae12158911690b90e7f0669c73ce39e79c5f477c396fd761ee32eb300f1de33cf479443284ec55b3f66e3774b6b34e2e10fdbcf4ec82969f2e5dc85beed091df46be905bc8727560be5318d46154b401f39d8e2b2866c7fb467639e504eb8ef5fbd66f87bd1ba195129cdff50962d8dff7bc10aab3280ce995e2278ef38de37c9b9aa265995a5e3acda6f3dd3ea836b6d0d66cbe67d07fea7d604367fd83f64cc3397f0e696ef864f6796d769d431bd6e49c4cfffe705d9fe0bad672448bd409aae79fcfaeb3ebeaf73a468137bcb1506c284ed86f66a130ea4b6f793326edb3b6dae98919ada3fdfacce7d9d0ba86e3c219f4b377f465d42c7efb05c3e9a08608387294f033335a9a4eaeebed23527bd3af2da9eb68cf2eb230de338bf7c11c5b20e2f4a7b30d1c5a3b65bd2adaaa288c919797a3510f0b5afe823a4cc865ca94997a4a372069d25317797e3a0b4f4f7db2e0f4d43be9d10fa44fd7919ffa8e8efc92c6acdf985eafffbc819dd2cbc343a9f439c724bdfc159c3a8d3747e50bed17dc3406fb0a727ec14d06756bb75ce7cb17d5afcf0b8adbcbab6b68ab584570740305a33614a7b3e056bb39b157306b9f200eecb1eee025a684ba010e5ce50beaa26b4af50e9e8a381787c668ec463e8e098c40fd023246751943feb5d7ce68e824c5775a3d1a99bd1c8b2c8d2990794d611411bdbf1c8d4c7d6777f5eebe5d6680fc0b8276f1c6c0fb4eea565f877d8d0dfad4775440e479193404ec3414b70e76eb2d602f61d50e75d6b1b41bec2f282d9873285e71cf10ed0c6a1d7bb61a7b96b0182c952215646ffdaab01453352c4f5aa09e9e68b368261d4da24934675288a9af6e6b564a0a733003d7ebd198d8e7e3506a70e3b88edb9beb3c956aa5da1fb79a397102c589cde250a468b55cadfd52c1a95051e954e15241435343b36d56702b56543a57d4ac60c1e20216db410e042b9da086b568914106db820088d958acd2190bb77b332c88c187c1b620acc360b7f068cccfa0cb20834a6706daba09d65b68558d8dc7a18881c74ea1de86e274e933476d22c0934ed2a0110a19f972844286ae20a3183d8942abb55a1bc5cb8e12c68b524668b58d7c5b92198ee904860185aa0aab03c1d8b405c5cbb1c9d544e625535184c562b152a490c254b3abd8a8b0acd81394c2658252be5c2065cab91e167bc58a152b58b0d87e84ad240c52c400dbf3851c5abcf0438b0d83c1601e0db0450b2fa7d2bc40f4420d001e8fd86a888b0d2900295e8e539a08604f704a0d2a5e8e5342f07a394e919a4266003346ba172d8a91100044794224832834a016268812250c110ca294190a857e8046823c898f0b987eb080a1c78a2a4336200052b38588a66908222a9ac804bda4c8865c456cebadb5d63e7df6e528654995201616145c6627a47c199a913215f4f5fc58fdf0a14a2ae2c590c2ce6148f7c20f41b8176a296c5378084d1912c45a6b6d0da720f9c0539aa470a7d41064a78440853a45aa884e2123349d7cc8be8fe554e4efcbd149c88b9f03601ca1848122f57284a2050a969723142a23142950949676b27c5088f8e85e8e508c9e90811234a110594a12438f7befbd639238d149a6dc1b846ada614f988e6cf982f8ba271f1fd4d7f33d39fa49c2a2999c9892f69c93522628a6276bedbd4e987254ce596b26314c60388eebbaf1c9f8e4c9d1f645ee70140565054d50606cf0c0dea3b7492c04f95820f8c27c4e6a4047d824828aba000ce027856173bedee1eb1d9694d296aa4e70c77e7a34687edb69e7a6305cbca4c0d7b0d2aad4492a65cf17a11b9cf830e7a4d4491527445827357ba4a321ebc8443432f140820417b058615343a3e2e56aa5c847a48fe0c34dc84cd71dbcfc2926b380b0a9d758808c0ea4b3aabc68630373c2f4a20694078a1333df4ae5ed8edbf4f81434e488223e57884f52904fd2099d75bb44122680eef5a9e9d10997e75e8e4eb2bce838db50b5d5d5c427e66342e423a7e0e38e28f1f4eaf181f978f8ca7c51df6d92836de2d2e193fab87ca2dff02d6d80873b4cbf1c976278d171aa93add62e5942b6f90c692140b948868f805c273e6c75b2d65a6b5d427cae1e3ea5304758a51a10522b8102b259253d00d1ae213e590f3c7489802ceb63a147f5af8e4b9064f425fb92f8eccccb71490afe871edd2649d8d16f9dbee84440d7d92d658c6a4125efe581074a6900ed1ddede4c07e2cc0150578172ba1013f014c67441bd003336634a1c9e3a0d0d4d964f47bbbb8883c1d7210766dfecf6c01e2f0f9e546f86fd5b55d733e041a7953cdf4015b7efea3568e50b95ea75cef58e4a39a9555dee37c8a22e6c7ef372bc7ba56755a18afb0a7abf415d5d6ca07c95acb5a3d5aab04fdf15ecde823bf4dfd0ae74f6f9f9c44b18e5a86eea249d7309251f214a454a474e949c72ce5a2bcdc0711cd76d252f4a5abc3dc151298c50f73a322a2131676654d62a81bc4c23d56aa56989c9bfc6a50de42fdd8b850e4a490f4628f972b10c0ffd6bcf4cc4c2b80489abd24b2197c8f04ba28c4b98680a63dbb68deb9674c920e85e2a4ca7d62e6959f24066f2d3f34bb517f592d46642f4af9109ed5756b0d2c8e488b4d6de0bf59473ce5ad791491393a8dda4a8128d4c8cf0948879713781616cb2b4f54f1d52be602dc1f2e2fe71a988b1c90f9331ffb1523491e15f34363dcff354aa51e9696c7285ce58e95e46544479fd4c7161d980150ebc803ae0b24106d797195efc3c480d2ffa0b858fbe1c95d860e5c76e2f4725e3cf11940b522aa0c8314e1cd8725444541198f90349178d24cac7bd16890e7fefaba6e4c87b2f4725330ca5856e20a5c24c9179e9148ac248d24cd4a9ca134e96974e8fa6e80638c8d01f1a4489a8518dc2d89ee8067336cb32d332f332939a499fb44933a2cd24da64a239d1aabcd461be29324138280cec5e5ccb2b4b072f6f1c6643e911ce0614aaba98b4ceeca5e2f444a3e294b3de681c15271a935e4eb7f7dedbab53b5d5376367662a9d33444947a22d22fabe9913288a2cd1265a2c4faf212850b09eac16a896eb4e4db5bdf6de4ae7ed52ec145d4bbc3f4fddd5f3da54b4629eba0a3b456369682a9d34ad9c13a854ae1745ad64342400001316000020100a090442c15016874128ac0714000b6f86466848301b8623812488711004611c85180308400618038831ca40a4361e528cfd6aa99fd217454345f7a61077befa60686f34bc82dc35d6fae1d9ec30b1f14b31487f5631acc598eca70b5cbc10c780823572d193626c28c7c3e0fcf342e09daee2e725d75ad7cdae55c244e82c445de77d63d380f3e7c2a26f28970441db7a13cd120431250422705bf05a0715649903100aef42718e24eda45d9fe8c7457e49bf59068ad9238968a65dae2d0d09fc8be83691fe800ba8cd5b039f27dffe0ba24abeba8392675c33a1c65b16a667b33d0d69fd501dec0bb5466fa89cdf7fc850f607de5686c035008fde30211cb9727fc151407cf3ab4db14f47f127bd503834f6308e56c58a6cca83752d7e094a4ae4bc49e263bc58f01283149b77b0f351e4ee3d2106fbadf55ce75cda0226e711bc654b1ebad70d5342d27276350c2ad03d7ddc82913dcd6843c55f88263e5e3667517fedb651f58e407179e9bc3b875e01e9cb610c9ea2b1666223d4890424408da0a30af10f2a2f1308a50bcc0039b1280424b9b171d027d9144f245832cc8f5986f72d9e6ea09967ffb0c54bec737dbf6abc60adde06f11cdfaca3e714293c7a0e9363a21f8aab379a1ca9d4a7beef726529be6cfc25b35560416c783dcf993f8b07514a258989f9d5a6769baba160acd7bb8cd178f7f6d7aac69d54413b09d4eea92460d6319b4a3c0ecb81ccb507a22521739c7ed5ea7293c9300e73b69eaa7918df6ee7989e0ece346483013ade2e630a32ed15e29cefd88522019044301a1793a71ed8e6462258d22ab668fe75a3a909e8acd9c441b5f0c4cf8b1e784fc3384186b3aeb21f0d0ad2b368aac702008d51c41088b20a3bc65f6c8876a76ff20e5c6024e2fb83715f2d3c48a7c8346d2a83266b6df812ae9ec3e6bcc36289d63e95b6c1e60091085655368efb9848909af06c4abf8f11f1eddd98b0ed4a666dca762a0fec362b056153b33ee3e9f46e4871f724b336dd66680ed06d8f6879a2d60e0788a9afa83679eac94c226d4f9406fad59f714295d5400f3a8782d19cc839c4df1edb48a30490558e6d8c9403bc2907b02bd9dd18f1cb9381c9db97c05ab41b533ee886530fc2a8347431ca3e3db3e102061ee3e593c1952e175151fea04e15edefc85863e1713149ec1e758b2217f8469b320853c9de258680b17ca4844a0ee9cc66cac924f92a5b8ce6f1169aefb953bbd59c3759c6e60227477acbe4647134346f4c78142a3e15da2efa91b20aa8c0e913baa47d38d0fa0c98a864969e66996eb9841bb3595621b0ac8c4a472af43c14dec4db320810bdaf947cfe5cc4fd491b9c45b89b8192c1d887299e919c89b4f2509861d806b9f804a5543436af5567eda826b1b11035012018a8827b6fb8c15ef3250d31711dacb5805b054e63a3e68e603b5bc5f7cb97783f31c6768e2371953a165790f1ff25f80c7c6f589544b6f23f1d2887ef73dc5a8656caf88a6200ddaee42d6ac640e4147a5dd9eccc8ecf2105c23f948477c04d4677c97d6ac40237ac6da1e3defc2b9a64c1d19a988bb5d88ac2bdb07c82a4313912d0b4f6c83b407d619566b4812cd34f814f837fb3229c2afc66140f1da48251a6eb51c55bac53f6d94b45cd7e4d6492da6708ddb084591e2fc670d8c7839e8d487d98bf4f39fcb45804d44f15f5a125891f8e02a2e021443c49c56e988a2c54f151d4a9bfae5ab105905a54a86cc182a008a3b18b4b19e80e52b46cc7606ead51862b2abe9e54afffa90d4101b4e4f859004f1cdd810844d58b9c7429e6ff35850251b0b0708f93cd3d7d83ff8b02765cd8c001f1aad94f13707d67c145f8026143ba82f82f533af7054d78a273e970e4fb2772b547b1e94a77978f26cc11b4b594549d611fa5c27791af59f39c9a12d934c5d903df800cfda854568058fdc62765c90b3d500a7039d8672342acd5d86affb1861243f118fda941a84a960fe82fb32e29badb0f64cbbb5e76b85d2f17e2424a0787cb28fc3ae9bdf7dbecb697c935fb96f1636dad9039a1de4ae8e3a7653b7b6adb8cfbd708f777f6e756a8af879d7ae293a88f531d0126c22279cb8ba23de1349eaa79958ecab16d929aa9700cf78be22785e8a2613a6da0e862b10ff20979996033a63e38a0284637b34528db29f6be407159446b1a3b3a084ad09e185452e3157dbc66cc13ad96c8289384aa0f578cf58c4ad9c139c11c351b4d12606c3fdc17363c3dc655433188f8e58cc4edce22d567de5ecd22e8d1e0a4e7264444d4406b5484a82424f5d138db9463dd01b5195d5c441709a791a2476b159f5de40b35d2103434217df48e794a4109862060c0679921de266e3f9af8d1a5b5929bedf0cc971db7ef117390564b349259c2159219672a61cd6dd816e3af5ff44a2468dd4e18d7d3351dc1731e2050a75d1c7493a89625d1c3fe1af7d3f9147bdd144c5739c6ec5b861c9199ff7ae82ae53a932945fa5364c40ebd4489378fddbc104729a3df581ca1700b2fd913d2bbd64088172c29399101777302434cfe4c314b5ae00461a4488da8c2027e3b4d71161f10b07c36d5e1c8f7a0f4a27acf1b6ebd29bf7682883eb6092a117193111554cbacde73b0d81d19ab433f5dd17ce5332f7b2316444b4bf8b3bfa75476588d8fda373c0bbf5e68bf047b3d43040ff7f5842c3ce4a7d281c4cd7f45845d00b2976d6ca5fcf3b9d9f541f64a4365310c6f8a2f580c3977b31e7d8659872227644f488ca212331bf9b1d5686fc83e4221d7b8c7a7591086a72cef04e74cd515580dc87532bc9fcc0266244a90ae73a3528fdb674e15843598fa0c322d25a9d3361960895b3a93a5d177c684cae51e956f3293e5281aba63b9da126d86d45163c6b4f365d14f6e876a22cc1c24291ea628e7e32d8d0c4a1c147426fac0b58642666821031c5964f93836ce75f3f8b56d0095186d60361a24aecf301bdd8589d1c2e739e81451bbc3524d2b6e0fc4e7dff0085a4b0b6ef533e6876d8dc62e310670ae02b598d7b703cb27851dc9802109fe3838c1b84f709374e76851957b458c12c318abfc1e53451a21c225eb875d9468b8745f919358260b55e9c3e161a4da3a54359f97afedbc07a1304f8bf16c1e0168bafa08d377c66489cff478b6d790115931ef806efb0522273b10f69a02941a30098c519385a83501005c0448a35b44f4607d9256780c53e7b5adf1e0fd5b54fea9560f560ad7d57da45581ceeac7fbb65238436a343e32fcb4a186fee51d47536e5d1380873f73f24db7b08689fa3207902b6e0b916375850b5a1b080832d5502361232ec4f8b33571ae38055e037a570896f7c3a5d6abfc81d3bb0ec83501074500c36b16893f5773c0d82834c1a8adc20848717c8ba6848cdf197ed3636a93998c9c143ead009ed26601e025607731ddfb5d085fd242d899838bfa933321606441a9007e169d3bf58fa8bef533329b5679ca7fb6bfbd9faf87dd1ea471a2d062b60256dc027b099c45d0289cc1d64fa3850cd7355e1570c45ff873ff4f3dad21131918b61671325db0fef012a41e6162acf9281e624424f176dc93376e0c81d64e788aaa3e0c86739d8c187109f43a1b285e54cf091359c28d00fb8d5e9a81134037a34fbaa153a4d51164f3746e57be5607f25ed535537912ded33dca38409e8f91364148bf604b7b503faf108ec2056f3918e8d877ffe35897cf23a0c556669ab8a78b1ab2852bfa9f458ba9a0fc9cff4b0dc952cf394b22391e4b9f4c857c9bafe93c50c17fb78d1f188e5df0609cdf4e20d361a8462a766e25879fe61e100ef38a21bcdbf63dc83a5225abc20256f61b6eb7d2cbad34349447548387d8d563676e579b02049394f586f4f108ef3b7eba042b849e894c8a0405d6e017f74963aaf05239986a9f307a30c1b0946c5a12b60014bbd1fcf28e6919454095cb09fcf17adadc0c649af2dbcac6eff8b4a6df734ee4687d63fc7e2f0cf0b99d3537dbe31d72b7071c00c42fad710dd84a7d8c69855e33f27b4803c547db3f66db22eef6e284e999bbd4c932769de9fa964f007ca023cebd02883be5a1540b64df4eb07ae38b548916a966065aac5b0f7637fbc6dba2f623a2ba8a7629c170d7f2fc1196b64f4a35136b368aef403433970ab8a08000f0dbeb097cf94a1ca389a8b4615bd80489932adadf4210322c92278b517980acf471192089713a75b3591d16bc921dde14a7cc9d554b3ae727ae8b913d9f63ab349198ef7fb071be83686ad5523b5ca710c97579713a8fd5b0362b451bb74610b99df05140b89cded80bd3d4799acd535b55f6f35084d9130bc7b9ba4917a64941f448bacc635b4e837b7de109349cff37bd8dfa6691e91f45f7552a5dba81795f7e53b0311295e80cbc7419a5f3a175b2fd3a3191625e5755ef566f9600c97b3e54eb0823bd995849c83c2213a4dcae57152fb516177bd4c9a5caa5e06575a99847b567b5c6a2604c1f0ba4e8a5c9ad844929830a2a24995664761690487c0d9956fc1c694496b776a616520cad36f001644a58ec93a00ba849aed2cc5ac56377811f5e09a06ea3c8518030c3bf9abfb023158dc7f895ddfe8cbbb5ce258eea886bcfcc0689276435f72780b346e2ff441e3b7f3743cf1e4acd224c40942d95629430c6a952ca67753830c7ab7c5a15884e8527abb815e17680919fb4295ec8579cce9df8dc9e41b8be371e4edd4256d258df6d80f2f14b003f434aee60053e4f06dbc3eaaec9089e4726f1005bff4a87e0e4efd4a322379d052bce25ddcaf90750015fe143acd8cf94f721f4c685d3c20b50e5a0ccea373e236204c841a4af0536a9c3b10368a28125dc518d5226602b8f05ce437ff4680e823c5fe03c7c3daf77addda9a4dedc701c58fc2eca1ec77e186fdef9de97d50f6cb349c68f9f87665eae01485309902a1967f2089acaa89283dfecf26f9432a9e8f1e3bbb022221834d57f5714fb956eb03a47f58cfd31f3c4820e7cde63e692ae8f419f059742f74165fbdf800afa395a75379257353ff41bb630d70d6a3576053351948bef81f64235f38e1b7edc96d7ba91c938775720de14664a1754460f3bcc8fb0e5e140e950c1ba078f7f8e72be966c57d0b070c605cf9218dc90c79e39ed8dc16f3a7a7c69c9a2c3163bd3ef2f7d048e35276038fb0afce75073c453caa5fc3794833efbe7de924f2116eb8c207bb7752003e947238fda57367444916879a6edef33afc13262550a43fb9a51a6f1707f43ff60228144433e1d4bfdf5d8444b8c4aa307828a2ff033d55897b3e47ffaef0f65c2157742c56075e29c6e15c5859fb2d1b5cebc2bd060884d42a6e4da102829bea98ed27e56d2614b3b9dce02ccd2c8893fe47681e7f92f09f028b49807b26c158cb610a339dff3798333b93b2b7bb53ff90d61db4b4bf03f50bb1df8d660b0aa90d46d9a043224c072accc1375c174506dcacf5fc03857923372c951f83bbf1509d792fad96d2d184525021826ca0acadafc5879fcf7679c995cda1d3a3154453812a0861d5b2c070be138990940f4993bc8fab968bf136a3031a5b1f5a35dd553f90dd5d9f9a4f2c507a7abeba3ab42441f7946147779522b6e3bf47c2c94f1245078deefb207a6264486f9bc6906b21dc476bce7c5bbf37e91babdc380f9a093a5bbb2848de50fd820a391f5a6152ca9b8c7c919fc624c6b5f2c23460086a323630c1f72893f65f008a844b01129a2e45e7bbd99c4d62b6786a62fa0d1585a626129902e41b3ef8557de8e07b2d4dbbc640a5f0efb94af51e658fdbfd645694ed8d03a830b5a7c88138edcb41957bc5ee10380139742403733b8c6f8be5965abcdf806bdb53a9927bf6659857b7016587e4f3412505cdbc5aaf2b60348c4f0a545d2c02678ce58b0a20bf34e74df0a2afaa5c57616289f88bdbb75c1eaebdb5267ee4eaec414ea06170b1c21762c6b83cc7fce1ce580afe437ed525db2a1593ed404c5b981a526942ca0b4ee4557c4f9a66c2bbf7a9c30fa31123012731468c03f3f1cda5e23d0712951221dbbbc01fd20a3c5653480211c224d062951917088db08b5a453beb331ff08f583777fae24f1fc6ce58c1c840bcbd4e66a56bcd9672780a331be404d8abb6d83b4e745efde92677ea803b7fa8ddbf6c68dfede19b63896d47dd6184ba1f56cb0d44f4813f5877b862d870039a06019d80baa1ee00f0eb2e942e501be47f42a9914f0c169787aa4c0d44d55597f73fe0d7ae14bb121620909c72345213094169ae38fa11e940db1b3ba8c2ce3cb851536586161a6c96111a362e9a2154dd5a1714bc3ee3fcdd782fd879f60276f0906bf5b4e4744141191d3ac5d3ebe1b8484e5b00df14e8f0f995fa48bf027be83d4c35e3e78ee6d555763b71fe4ae88f8864b131acd1e3883e9807232e4a26a55c72e7f5ed20cc815dab9e63031c3438379d3d28a9684f0736d5aa2c8726e63ded177a1eb0cfbb9837db76d50c81b77f1fa9293955074d77e17ec5ca2b7df2b6c995fa0ea5e2b4f5bd34a43fb1739cc8c11cfbb33b002a4fdf3a25d1bdaafd000000790194ae75e466203a672e841482569d78d2df3eb72e24aa2404c01f12e2c8279de0b38c01cc1dd2d1d69d972e7d27cdd77a7326586b67e46903a0159ead99f16274f76a03ed10641149068e121c17e1d474f3d97de88bbaf236eb7f14026fdf7b4e0d76db10e7f9b83c1d201308c3c902aae0c456c672870eba6cbafc9be69aecb3d6e9b85d13ff12c3cdb1cd6544abf6da4d149b394c6a0a19194a5e7a4a8e7f24b4a163d1c7d876eef754dc00b728d104ebebdcfdd76e8e62927213b21298e920caf3d9f3e4da8802bddfe8873e005d35bb2929ee5c931e8ad1ab7073878687704d8a3f08bfb0dd5df3e38f5c34f2a47d7350d3b3f6610add3806749f0ec042304849dded8c306a0ab3b4fe2e7b3f8d3b94e7d730c5dd03ef658b311d20346e0f5372bdbdcf50366fcc0477a1135d586013a3d2842eb511ef5347747b53eb62231076508135b67544a9feaf719d2b9e2e0b249b378068bf61f74b6c884a108e61d8e07ad147a87f853d65201a2c63850748061b1ef62421d222c4e0293b66479032710de3ad1fb3a2e11a49540e1a6aa4ea299471dc13e614999c173c472c22ae0c94893b7cdd1678cd0a29696c707b2d7d3ae73c40cee4edf1921b08702b7106003e0c64ce8cbd960f09f5128b5ce62e3b534f8d8a9453942df0565aa5abccb91d5a96c829215a2b826575d27c47b78ab693e5694f0a1a270d03151a05ad018b9ddd7dc9da55515a35b43781bf91da97335d10b6138dae0a82414ea8f743daac762e86860194d2c5c3786847edc4d43af33f13add627f590d1353d1a2c1ec101c1eafaed9c7af5552d25a65009f28d08fca2ba103837bc320a95f69f4a1a06998467d334630165e0c2643ebefa6c4df12d333f48542816a9ac15fdf3eb6379808ce444a5a7bc69755a533341080e05ca91d98fdd31eca5c0e36b76630aa08045f51d77e160dae66372780d3750760e51aae3323f58bfedd190158deb458fa01c6b72e6456940c6a54acaf93f37b3871565dff2d1f1f62e5fccec1b04e8267da34a49c93acb13cbc63ac69f72e29a7f477cf2a24130c842c9febb3b65d5cf6bb36094a11a558bb927414e08108095bfc38a621c484d78d16d76b1106cc3ba865c1d10b3fdb35df729a4603bfd6c40aaf8c59f902f7ec4d8c07b21aab67513349bf671d318352b05d1cd449a09c78c72e35cd47338f1ad4e6f56e4418c523f09a171bcee26b6c85167e5d46f5e643b970308872ac3639df9de69e7810e57c733420731007b0527f27e514f7a3106e89e51bfdd8b725a59a4e359de40822f91f61f67eee372d75ab6d07949135dc29c5e3f7b9f242a3d1a97d29b7e4f009bc6b9529bc7037b6ac03a521a9ae4ed46a8b52f68f6dfe194f3ba92ba7b66faea43c762c2742c766ce44b9fc31c945c730dc03ceb02dd68fb1eb0d88db2e7d5ef6fe5941b5127713113d2a040feb5a2b32a8e0c6bce93bb9a1ea1faad901ddd2a2ac6d3f66ec930ef182ab712ad608e29b15b34c95e91b13e1e8ed19f5406b7a8fd87e7c3e6b6f48d8626951d9d8cc665cb806e2e39358191325d81bed88bcd84dd92e7fe26ad56861c7dcfa30db67c4985cf191bcbc016293252eb89407411d95c7dc7def42fb49a73198dc604c455dec21c0ef526030514bed1803e6e80afa091cfeb64e8be990d82f4524251a70a66ddf28ad1fef55b7e68ce01d3efcbca6e98798cc8ec49a6f0de06f11fd5c25d0a5ffd34af3d1f50df7ead54b97fde83a7c0e34627eb0877237214083eec694d49a3b625c00f498067d333630faef93ac2eb0a44d2e34070bda35a541890f1b2c8ee25fb856fca6997bdc8982539ab96f8b199581f3ba7352b9963930a1f1f6c37ad9582bf583fb6d2925b6a70ee5b7fa041ab6db75541fb8d863f0e06287804cb0120088de8d53af1d098ee84a96b291324af0b7733214c1a11839876bc625c703080a7de3bec592c297f1b3c988a2a63ed05ab2d2efc74508114e1143423f6ec146864e8f9d0e5afba68725e37c5b106ba7f7dd6245ff540ece8f5a8775af9373a1ce11411d956330f5fa5a4724169e1b66426bcea851e1d23018f4cbb0c908fa331d4b73d557749301f76f0d11076b17f71971c9449dbb5b6044046e5a749cb61d15350cae0b626e29c3e9ffc5d083045a87022daee95bfe538390f51d67c3c4a7150a0563605e58fdc798240fa7c280d6c400e6df0e93208bf79266c031deb71d87816691d76f1996d4b56dc5207cbddb361411abde05f125db8c2b56bc71038e286226b5e68c1a2b5c1a06a37e999b4cafbfc5003639d13cf72bebb876ce71ec92fccd36207610647a080e807ab730bc2036ea5204019341dfcf066995f0f4d0127bd11a19da4b0c810babc81784404ba9338fce1e9c9e5fca4d5bf5eb6e938b8bae8c938124a6b4246d29285eee02dbd5fee7b4fc1399a300c638a2174795d9f7ea8d987287b17020c68d599d13749b5321d0e618012d0dc6b1e1d56a03c345ccb48c384941b62288233e541fc70360b5c5bff33d3244eb747493b5a00867c098292ae5c1a86e0a55b4da41418ee43c41eca67cc1831af82dc858748c49148706b6de0899dc78dc6cfb4b88e3f588b356bb94a851508b0cabaaf8ed11e09c7cc193a15d46add879b945272e964cb17287c81d8068080c627dc16c91935790ce9391d5d78e16ea10adacfa4b8214fd23c2f4a0e91b8b5535b2ac83fa3ed6422e1a286d5b8cae20ae6745b27a7e5c9e3a46204dc863cd0a533d62ce2d6bd278308e844aebdc1a6215f90937ece0390827c886c68e0396a73d13ffab755337b393b9f60cee868bef37f650b796a6ab3167c42698ad0e5fc83e078e98fcf44081a64a425df752fec698c16f48da9f088828c2bfd6da7ce73301cff10b8b1d49ac79a9fca4fef59359af8327bf49fb188a199519ab842abebcf4699063eb428ba74771682735da1cbceaed76c6969fc8e8c7502d72fa8332fd903205b56c160b6a65a1dd1d120663d21512a627940a5bc75b492c65b1ac9c07900255fcd295f1321eeb40b3d8d2c337d79652bf8a9ac6eaaac7d1ca5c0c15d0900f87b8d317b854f94f228b6fdc1d1534cd1f5939bad4773dde95b1a41278687924224a6195d334909ef39e5e86a7d875740457074885e77b94e547e18ffefc9c71a3b1d9c08a1b8e74590c095b1ad9ca3a46b412079be044141085b86ec8030d8e7e317263d892d78e9d36e0f5a34c44bf30ad2895e426ba01c0b189ef0f933bdc2335f44e687cd47c3cfa3bec36e30dc44234796003a7619621ebcc6c07c318b75b5054558f80d123ac2c2a249b9daed5488db6337079e0fba030eff6ede67bd7db8174f57b6bd798ef38845f8e05601573e72499200515c251099477851bf33685afbac87d4718fb59f7e1d9fc88f8e8016b6afe846ee1bf39054fd27838a3a926e168b3879c6843012f4f678f97f14ac96b5a582ee9670f041975e39b96584a43710a4f3f44585e8a894fee9dcb116ed7af9690315742d7c85ac30454dbba90459646546b0935f5553eba66bc6ebbb49e1c924c524d1d378888aefec7024fc6ab170908e756099b861067ec3ade20fd2f8e7ecbc688028979b51f20312d51984d07b5014643d4db532c4ca850938466c144ac60e44ec6591a7f5d51220a29cba9e8966ac4fc7e23949516a78681b546a3adb91ce5e227539304c4016c992ca867d22dc22181c6a65df9019fd25f6b08751a0899c0de3f82d1a2172f71731476f716ae1dbd1b9b4c3cba18ce8698488fc2e8d640416b401ba6dd5c26dd75fba2dc767674d97848e24fe02464ab9b507caa37924741d369c00cbd4a1457e71c95da7a5b4f559871552242fbc8f895e84d5be0cc0aa2933e9e56b4047d2b4edb3f762ec10a0194632c6c1280fdc29cb1331cb663cabf871f647a055d4df32010f18a000b8aecab570592c2225a283ddd19ad1efd151b0ba8574bd711e2eaf436e04999f71068234ed344e3179a38e1b1af0c7633bab09169cd061691340304ee9e2880fb46f30e490c9896bec8a3ddee1938bcdd43eceb16d3bfeb87d86948deaba0fedd15de2f8c8ecebb2447214000e1e0040714b4b9b198642e6163cdb763dea2e31d02b74825b6c2770d1c433efa528a06d787c7f780f0510943a890de60f6124e82db8997c0f1349e3cb521db580cd13454dfb792eda4572bdea0829bedab107494198f410cb283393d50264f5947a5aecd79dbcc0f677994e71392815fc9071ace95b85473b14894583eddc0e492e19b47736793352652d6d8cc27fe49dba966d4a1baeeb93d11ab6e1f1e512b180768ec4259230bd857eff1da0dd983a495011fc4052a45a882a5f1029533def3354e144fb29a57a7159238d250ccf6e3d96c81641007013195a835f221724660ef80c80769eb6a73549a78032b67e5771f497c694c64b7ebe45ea19a155f54fdf1b3a6866982b3f2fd2c31e18428c2a6baef708d1bdc3107edad3b48195ba50f7697f351a71c15cd0eb3f0c5668a1fa2d464a4f9ff4e35f19cb69cd20f795945403085868dcc23651d1d600d08d1a403554059c9e179d3420e3b2c8a5351619d88de0ddeb345e833f4897d5ce352bf2c0d46a7bb203396448fe48e8830f976290605846a0fc43f60ef2857d7b325e9cd4357d97a11f6fe23a692b9e581bf1a1df6919bb556cb45101dbc0af03043a11a4fc4a545dd47702369a0e390b49b5a75865b9cbf342b24243bf61d26c211b30334edcb5fb9d0dac4a530bcf21a178f75e9ac8e6c45aa4ff78a095c1548211d9d0265ee1322000230c6918913884588edc05025c823b26cc5c0456a1ba89ab9cd7d0975b916949ec1f326e4d7b8a2aef59ccff6030a33b7f5fcb5653498ed18d30439fd07d9f7bf577c9f867ddf83865e709f42dd2d2814b4c41983a6ff3fabee0c375fe55bbb9b556fb62abb30e589a99756332e8075846afc00ba72a8ffe1e8321eed5589d7b8019e4facfeded3c24568a054b869ec6be0596e9639ac69c029584a39291f301e2a50e4840d0dcb2c5721bc0bfece89c318ca28c0129845c2261f7387f141364fb9520414012fd8822f5f865fc80db6bc623c6012abe49ecdb0bdba6f83bd463c54d03264035c9fb1474fd52688444947d536c3f5a697f3058116c33096fe5755ea6d6b2da7d9bcaf8ae59e954a989bcbfd433a846726df6aa1d2cfafc03d644dc37b6f6cd330ba532923c4e1d421c45bc7a6e2fa6a3e38ce87a8aaade1767c1869ecce9d669eae309598acaa146ec6c2b838fb994c2070797c6633d228589a7f5ae9a79eca5e96ffc46fb3a48f9e8ff875c85c81e23420f64328ae5f81e526b9ebc70b5c6bf2b843085616bfe52574cef2a92766d04fa87a1733d8f457130a654cb7d0a815c0a31af4d7f50fcbaa393d41aa48891f7deb4cfca9c0934fe487c13dab9ad65309dec604ef4c2a1511223903566826a7c4bb3019fbbbe712024fe68114c5c4dd1fa4683690ba9875554249c2232c615050fde4333e87a46bee1f585640f09e1a98f93c1fa081d13c7e472e302a4cd6284858f2267bece7c6241fd02cb762c3bd1916138901a8e1ab9f9f43aeeba70a98abcf3d970e02d545a72d75ba222f9523591d98d8876fcb07478849ec0f224b87bc400ec94a93e8c69e5d2a2ee1480addb19472d9ed064b91c0bc0935faccd47586ffc047a4a4328e1663f05755934c2f38795cc25618e43ca8bb8696b48d74e3d13732eb1d8f0e8d9c49014375cba1c2da94aaf0d8d9a7e073e567a524703d87a0f44f7145081879d4501e6c53820beb732f9a2e989f7033c4b67b0d141f7be4d5865cc8354fa4eb4c6faa0b52b0b77c062849be28ddc45113e74ba655bc50d95fdd53afb8e9288759a2ce77632f53f1cdaa0693d84e605b79b442cf482666b7d02aaa8620e5b19651f4a201e8cdb41c0274e9d4ab1991e7c704e8e406022114a80073444f9a1b5c60b51960b17a89f999db57b91652055c47eac7c3879ad8c08624b48ab52d6447f6036eb0bad12bcc641112b2183b74dea3aee4d151bd33ae578fa1c6a3b8216a76d4da1c46312362a29b884fe28f7c36ed9fefe8d396e4d0a6f9b6773191a278b67c8603244dbc4f4fb083a6940b56a9e341b4f830eb9554511f6f6cc9d9c8f8da1c9fcff85db0ea16a329ad329d2958b03808b0b76e92f367db0dd9590dd08e2420c4505264946a2e1ab0dd4031c1e8bc18c343085532927381a78ccec04a144e2ed74dafa8365a7d6d9dcc2a23fc23a42ae4b47372ded1521580784dfccbd61ac29b1ef59733fc4791f2c79d165308d58a9e7c639b1b462990f40184f6ce620e71235294d5f050ae248f43ba58beab5415845415d365f2a09fa78119d9c8a6a669c472d187a905962d6e7863121f3d17a63b9316e71708cdb2f847e2b49ace25bdf8fd7910cacfc6ab43fe85af63aa47d6949e10dd4b9cd04a62797a79b84d3fc86705f6c74765f0fb4772223e433adbdc3df68fdd5cc1683aa5049ce9362d8469787627db5cd43259609bed0bfaa386614578cf80e841c42d3a87484847c50bc1e3c08681fa2a9a37bd6b78e5b8c779550e48b77997ceb379911bc26494781e213d6a04ec451c7e5c5606f2c38ee595f61c447f5b713a5b4afe0c915ed71f394cade69e202e987568f86f54c293569749c95dc07f80be55c09689c1dbdbb61f59597b83dc46d43f72e42b1bda86a5041966b67329f64648bc9567947cf26e6004a13ad7025b76990ccc769162a6e1a4e007a145921c0bb5b91e9bb9063cefa60eee689f567d5f38d56cd29e0d82cfbf2eeecdee866c1eb53277c12204617cf985234ba5240f1450bb5b6c2819436166bbc1c2b870b95011babe15d1ff3796a38ff52f6f084f1352b3758194462379ef2ed0ca39546e5f1aabefe2a558300ec7cda776adc588b26915376a2234dabc37dd3b2da4852ccfc968cd173531094b19c0c2ad44d17fe3d5c99cb9fe7ca9115190a7a552a46e86f5d8a7c4f855cc2e59baa506276e733ae998932040993131a8b8420f7475d636c8885ca8fac1dccf72180cd44851ed63b4d73512210abbdf36086faab160a7f63bfcb29910f52d28a4e702679ae4ec44d786975f42f21ba5516402a23e890ee3a6e9a156b8590acf4ee7d2d43a4fc6ae2a1ee5e8ba41807af6e396cc9386a7464e37cd40598285a9abad57bf2a0093354ef95de095e125b5ffbc9904574867dbf2aa6b537352bdde4784b23f93515acd4c6b9a20e809e098df95f799d94a706a1d7744e2d9871402d6b72ceecf04393a8df578a1d64fac2d9488ff0ca281e4d2bdcf82fa14fd5cd371e84d8810185101e2acbf1949f2f2b68b0747786675e59d4fccbd2c1d8c5b234c71ded3d346370c73bce3892884b2b71e305be386f0a1e124ffe8d99f8cd5a2b0678c230a4f0f3e316e167fa20c2cc23bbc6f0542a889d5b6d9547e55e712cc6f188af4f81c140955608aca8203f9842ffac84b55813f183bbacfe1f71f14053b9ad0b9ea3c9df349af64e2b6599baf05962e0091938da776a831f16a9640d71ed17ef26806cf1254581650b9126b636c949a1744e13a24ca26ff303e59b235b1c235df1a4a4e69c1705839d32e30b4217e9892754b5f1ac90cefb86239fe4a84db63aec8710819234920eaeab89835166602f28f937a4aa7c17804d081478381cd81d188f4517b4981914e8d184267405f254e70a68f3ff79295121f8db614a9e77dfd28b16c172176f19242a465f021d39fda0d95e941b45f9227f33f142808271e5e1709a5923416d12c906f20ca4e3ad660e91a965ccaa9febc3cdf2cb0ed4d4aa898e176c9de1f9f45304c62d04be7729aef71bc4f12a986a8db3e271b8256628757124e0fce717e19b3a057802eea680436e1343ad05294215fcd249424cec0a923ceed9b815ef4fade225c6bbd06ea815876512da4a902ba283977ed7db771dca03a550b5a84ea5d4da8d4f5721f8da5f091995dc1a920ef3a396d1e7dc054d11d5a1a1281c38f9c88ee9c83f08a43aab37e0e20fb374e7c66cbea3bf4fe1384643adaa17678105526548e740db78a508f04a20abf215195ff94f42f52d3fafee855a5a4dafa8d7aa5a8a4b3a1d7a7aae7f822b600b13681387f3695cd5fbbae117ee91b65fc8fc23368eb909b4008fc104abec76b6a9b30497346b5d46b9fec5defb40fac10c61cfa0c1408f97aa03f0c627f49b040d2165d72465c3e93696b376f5d6c6e7f6d2ec6f886e156bb202a9c65915ae90739dfc9403d5887fdcb4c3d0a551ed8396322077598842f96b7710b3e233cd6e3377e59b8a9a703a899c69852277e4a644b18373acde63c8febe3ad1a942bc64dacf2680f428a15a868851dd50930d5ca51be6badea2a19273756a4350f122fc79d2eaec5e86ae55c71ba85d628cfcf1598709ce033c8f263b0f06b31e6d8adfa2ec05fe8087021f0a20bf5e489a1636d633484711722a4c5f5e8826c80392cac2d7e9f816e83d5cdd9dc3aa608993e26700f2ed2e59089a217fe185857b9e7788e3595faaa0d23f5a3519afe3810cab25449397c75ea3b675eccd49205266e65c604250e68bee353db9a61ee446248c20b9a4877df8429555fade7922e9e4ab9b6ca3bf14c44f865e614d27ae5d5c8f2c14cc0ea09e18348316eb15efeeb2802d865fad19005cd1bbfe92667a76a47bbeccdee9c4e2281f3e0eec2ee890c6a7769f5be5adf953af78de19cfdfdd96c4c6ce2fc3c1b83189385c10dc18204728e418f578f76995235d0449a0df543e637741949efe754bfca8c4f60260a0beed9b4241ff2c241ef2439997c058afb4efbea0c0b9c71ec399d12a167beb443be29e963c3f0b29a92bb20a01b8018ab62070d3daefc32d27e2b0cee9c1a6447fa60c849a4ae9932ec3e8ee183bd9e7c7db452e294428e318aee9b62be154eeeb1ef592d379c28c5d11ac47f9d4a3a06623ee3d154330eae94d8db51bfd6c4c5a747e4da6eb58d651b25302c0c25c0cc622cc37f2d95613a26c162c6911e24895a865a80c1ae69e41d9922d5a5d3c6b4eba04cc467c994fb248b1e01b126b306d1b1e12fe1b1a434d63416c7bced28aafcb8d08b9ee49875dc380381746798c13e9988f8c6be8177954ab71c5eb981794d129af369d08a5a956e2837e594a990510e8afaf1a582ea6771aacca963a4b764cdd0455afd60d347805ed41bf33a80f84996b1462a830267975f060bf51bca236884b27b48b86151d2ab5981db2b1648d4c399aee66d9f7a13a587928521daf6cb897c4a030494fc0d5343e287fcc22d8ebd0a414693f4edd48f86d22e255e890fa4c27e72426895362b4873c1cb83319f294248676bc91c6227c7d8b5d09f5ffd10255d773854da815d3f9e0a86f22bb7467609536d02739217f1be00dbb517d37a34929e9496f43ce72ac9d47500d5f3efa00e18f3270286832de79b1e2ef45ffd20ddd590f139e336626e4b284832652790527848c953a448131de4ce4f821e2ed861a3710bed093632dae491b09ad9a009b6b17d0ec3e5cf6bb7c1598fb806f50e2be494eea513c39984e026c8fe077085c347c73eb24efd151a3828b9f4d627f7f005200efe2d10409733a03a3590e9e07841d15e9c68f55489ba6d7d843e49c4f6b6bc937f1a6ab31b2bfa789349d46ef63dd047289ae63a388df8097b1bfe9cc93b3234190c4a4e5e8167ae9019fb602fcc440444c31c11c1d97cbb69ee224a694d6bacde90b2766a84ee88919b6b210c33ab8169c47a3e2ade7890a82b6716468d007fc274645e13bbad028ef16fa31d287435a995460b82734005e9cbed62896f5f9831db7d7fc40ab4ae373190ab60d301daa5670041cae64f73a30e66e3685bf57b44308fe2dd60518f88b5949ae5bd380ec364db9c6386b6be9a65d7008b793a5f0ac7cbb128f130a7383a617f2896f8041b13ee2ac8d71034f94231e5dfa820311a00efe33ed7a3e8456c6c5b29763b0d2d949aa1a4187e811628fbd36f64a50b087d1693f2e4d0f31c6b85a27868847aed522fc15d4b3d6ff1f82029d2aac78066d67025a6ab225da0fdc547a77810e0ae6f0eb3e67c71685242612cdbd4cbcaee91144a4201f1d1786487c89511b9f1950235ba392f0c81ab13e6bf51c9851466a4dc7bcd25884d5fd8850329b84e856634e4042bd6296754ac99259959ad0907fee597778b44eb3ffea596df3865dbb68dd8349ca59452588161c2a73f806b1317e8acc3d141b1db5c9c54aa634b3838eae0be69a184ad0e1f9f996e35bf6128e1e2f8eabdc6dece2fc584e0d8a53c527f608650fcb285d775621280439c5081bdbe5c0922012e86e139f99040a2b85466ddfb3f3c107425c82350f007c80f6e814f3d57993828065a4308ac153ea98a2d024de2f7cb895446fef3a3ea0983fbfbd037e907d53ea975a150a219bd39d271cd040c9b391de9b375921b37dd249a8dfbe85fe0ed25c19cd2ac4956ffc3f00a525628d605f9f17e42d4800623896752c207147ba505f9b68e151363ab4571b8d41a316ddffc8d58fc7dafe4c5c04444adec440ca1be3d773e84c584d28fd5a43f7f889aab35d26e609bc1faacb37006ab6d9c573a36bfa1a4a3b39ad05c0f6615ca069751b0f2121330a5611ba71d04241c56151abacc89089bdd6cfbd11d440405dffbede4efc835847e26239b7f768c01772774bc8806693a81d8ac84e397146f6b837c551b9029cc77516e4b817922f6887eccf349416019df3e56498e4189d8c637e6dfa9bf78b63e1cc21aef3d3af94d62a679046ed5a60df7f53f2bd576a874fa255316997060e92315d51c108d651a06cf6fd1e188624d6fad6b46d6c89e9270c2158054ef4a75e646999d2c9b4fbf845074f381daf5d3978927b2db9f08a409d88b92320133cd9a15bb711a03ea4678bdb9397871034892d9867cfdb59ca5ec54156c0b5f0454658a7f00ecf75b19b41432606cfc2576877be59906c1a2f58b86ddca9b40c52b7031620ee07325890774bc11aa3353c46b25c33ac7cf6923e4718c6b03abb1fda59279b64ff67d1479cd788c60dd9dad32f4ca29ed8a21623f4988f96262e911a05a89383cbacf39c135d30192eca1b7a61ecb39015cfbc93403fed87d87ff90e4d5a5660fe73d0429ad2a36c75a948f7b23c5f7d3300bc686d8cf01d4136f8efc47693fd7b3f01673689353ccea8118d8df55386a4b3f46f51e8e25df6553a97c37f3aa1c3209cf8615df7916fc713b5da6a16f9a1ab7997385c34406c80a8145b9e68cfef20e1c1b85ab9bba5bdc3c8b60efaeb363a542520ac35a769884f26bc1e37341eeb4bd10e05f610e69985824684ba2b4f1383eaba9f9d06f425ed56127dc6f9a377dd1b1a4996a72c4a6793faddc84102a2e9efb47ab35e21037c3d7f123b10001f65f35d01e93086be6cd006928a363dfeca6f8984ff2da448f1ed971b38ebeaf65582195c28584381ce0a0cdb089b42d7ef1a66f6c86bb93d2451487b543512f9872aa14d28823fcfec04d83218909baeaebdbe68c7fc0031ef5510c6af13ac26c9cd1a611a9964e0ca700e483fd34b1ff5d3ef724cf4cf2da1da90939314e12a074777ca5d5dea7d7f2ca95705bb46eb295268433c0e7b2cf1d67a9bbc41471502925e01ff9d6882db9af31b4f513b0caa56c9e384a97aef25491b110c2ef2893c73c698634a9c4eb7a6f629110201ff70c75a642a70eb5d6bb734ee2367fb5971a5c453680df312ca8c4c600fc6c87aa26a3b4a6c694b0205d4fa5490ab1416dd0dfed45b98f3864fe9d1ea8c109bfb64ac476dd6cf15dd6fab1207b2349c94cf876849fb8f1e10924dd629bcd594d7568ed86e00fcc57cfe203cd86c2c8acb7a2ea2cc538c80157866aa64d08fd60dcf435d04d3a5d5b421d7115721a517bd9b7ee8641ddbc16bb9f83d0853cf0ade687f3193b961eccf950903dc41561df7160bd2eff2b7fd5f62fef07d736a0a8258c671d10f3c1d22226babdc74df79161d13c37cd03f5489eed0d18ffd55aa6e90c363743d2475330e1571662d88baeb6c412640bb662942f864a0f3c9ce1bd004f2ca6ce309a92fe330fba591bf54ae189d7551a17a6c888c2a9d548c8fbba86de3e0bb35ff451c5e0d8b1a06f546e8817939dd16beae7acbf03cbf2c93680a911f731fffe7ba1be431278a2159b9d8357208d8c9d00849768dfdc337503ba297d925715c9c90646e9e2c2c357fbf41c418edf35e75e320c376d6ece636854dad5c13c6918eca1e09c72d6aea20dbd0a5703c0ea0c1bcf9f525e5ff42f74aa9c02b2b707741db6a15682da894e03e72c72bc11ae525b914fcce2a03718197ef758461fa89f54fa677a5561bcaf7c1613f47e22f4d9445fe3d4e02b09fe429fa61da68d10d4dfc0524991597620cb62fc01d7abf78c187b3b0ab0f65f7d54735e31907588b9702de88615e82885e4725ff5222a093456b77110e58655100b7a9dcd8cc35d0f719cefb34392d9e874683974c3825fe414d731c85c5b64633dbd43c0c2d1055dff43431ed75e1efa873f0bfc1472175c45edb36725d6901d93253e7cae05bf80b73e638d8acd4f296d3f6de458377522d7e774d2e8705f9e9caf5a861865012edee8d945cbacfadd24a08267f669d62b7bb5ea816a0482d9725c184f4811ed412afa002b853e3cab0b37c968df28cee391d6ae1b6355653fac0b37845a3bd089c0483ed9cf284b16aa3b51cb012cd21a10e701479030037de790d5e05f942a7992a76add67653478a9914c02b4421d8ac68492a819b930cc25120779639825bc707061fc7fa83ce726879f71cc80e4b7d394d87adc3b594accc298ccb3894c9cc6aa9a42bd9bc38a7b549b936f126f0923b37970c5c6965b10706f74459de19eea035a52e5d0d6c41db6fdedefe78dc3994aa390b2a790fa26513e4686257e2650be75a54b03c61b25a17c1fef834f8f25d94e76cf8a15cfe99791dba86b02730730a6ce58467ecd0810fab78841a3944a35cc1defb2a59cf0368d96c2c4a0ddc64cf74dc0804b6f11257fe4cbc47c3527a01dc82d6216af9222a1a903543692ef554b22be5709cc74dff32dd117c720d03bbc1f8109728959e4d9708c3423abdd0cf010a0805c11ddcd27d6ff3051161a6306da0c5ed660d0688a51a716e90f4a365f6a6945670165e2d998459ac1e0a628bdbd45d1867330246a2c423d42998d1c88dc64abf1732ffbfd807f3a7b48a105669ff8913b6356177f70dd761eac826a9365c4eb969eb5dc4c8ac6cb0d9b02911c02ba049399d45ef55c36da0e4c1f0e75456296ad27aa1eca053f033c0386a8d197d830656fe15267db3b6f5a56cb17d247b1b7f097794903bb601393ec047cb4db05cb12e37ca58bc18f010139d4d422dbe17c7ffe647f053f461982882099e61bb474d01dd4140830a53019e31393414892901b33382d8fe9cf5ebb0894d4b0d54fe14b5275e1ab6f62295e0aa81330351aa4f00d331c9084165b4f24d8e2240607333d10734381227f2419200d723b569218abc96d0edb5dc176f1c83f5c510b671c7823eda68291525741fbf5d216231273a29dbacb63a13ac78aa9c151019fd2bbc94066a1e19298e46a95d50a82ef365277c55b2f0757e10eb5fe7f39f1b88ecaab94dee666aaabfa954fcf11e6db1b02ba4fd900f81eafaf8388b4b54ffe54318c2794454e1d4cbcb97230fbdfde05a34c6cbe6c8658240eb272f523dbf92094141c0b6a12647dc2b203424cab59e47608304a6119a16777b6f8789045b032c4c61e5df4cf81b0cc22593c47f5facf27143491223cee5db0f18a09660e199d824ae1f524df54b5fcb777aec926606d68b4c6a7c20ba004337a201a2cf7c7e24c43d8b7c0c8961c348dab913f782a16854872066388cf45df4b700b0e6c8f620cc980761b349b66def0f332f39b4d128c2712f48b4dc246f7df4bf19b462f2c24bf91ce78ed1e22766899d2231c180e958702e680f40bf1242d0e6f38cf058c6f260cacdf0574219a2496f37b93ad165eb0d348bd9b27e0a11746292acdd2cd94351eb403fd819308ed0fbdc2c2c3589d0a2b824c31b138cf94591234d34a7dd285ffe62567cd437b59403506990e1a51119ca37ce63fdb6b490eca6b3acc47843887e09f496ad069a605b3849c19b1c2c51604c1cdbe14349030b476606d0d84561a09b0b6c57d43243c0f81a0b50bb6a3c3854defe0365e53ecea2ff44d16e29053facccfda0b9db61b255ca304b279ff325e8b1407c443eabb8dbc40b61ba168a80f4466cf5e2312039c6e1d68670289cb027db37f25a9128f2dbd890087235867bcfd65f5c0b45f09279217ce4100d04ecd5c944034340a11c27b42f7c316b775009dc445629b086447565ac89f546a7df403cdbd3e9c3acff1954f867ca39dc01a115a99f7c9a37066de5a9649a9bec9a20bfa081977facb8e70f45a06336bbbdddf7dce18ce0863b7d726e8304ec6c223739a2f875bcad98463d94dce7f6d8217f095eabc4e56a1326c69a72538f8fb84b127302725b87643485a2811727c8315ad4ce5cbf8aa9961697a11f4e6b8cbf1c7bb8d02d289d9e00d1072ee0a9d86147fe91f29ac65881e213bd763a73a12c52e0123a1b4524482148c3415857df4d68dd0c44486d0b676f5f057282339e2dd2fb5db998cda810b9953722304bc55a23dbb0ce5186a1f761ccdac95ec1bf1bc7979f350a2bf6d8b0569e947b55439eb9c08e683a125df633dcf7a13e4fc60fc1d7265928531214d33995f3f534ba3cdae407dc4fc62fc0c47d5bfcc00a7ac014c85277bacb55eae30a3b59640c29b5e62fc5c7d223b38106415f015cef2a05fdfe294563b1412a3df7261bc1a915538113da584da571e1bf0d25500d9e541fa27c6c01d81374eb78b476a4d61ed850db12ed4ed0f7b052fac911f12cc9b3ef5767c2790f589d3e69a1cc49fb4710283d2f8b3e3b5f5781a8db0b5e77e8848bf5bbf0bff77d96473158a41023726ac12ac29a288608039dd8d4f2a3904dbbbc83eb0be779d988dd3a26a8cba4d26d3dd26445d379d7058b8e01612e8d45dab0abf6b2b606032f3ceabb049ca0044742509ba8a5eee2160e79fbe3848dc562302d4e855741ed715b1c478bbf7e1a7c4218909585db324856ac1d9b46d8a3b7bd0364d3c92cd0b47501e37d61362f9817961520e491dbf14f10cb7175b0d4106c5b5d4a76fb5def20b4edf63cbbb83718b02077a140eede0ece7af8d25e836aa22a3ffabc5d93126882d251e599d82dc944b6a74a6548ae71c9146d8d35e96c2a0f712a4fec878ed25ba75b9d686e40478ffc8f4d849e90201c88748bd0a2af040d3f989033f9628fe51db025b76f9c705cc12630557e92383df030ba6df27a3fb8dfb02bdeecb0f7fde9cd9db9e8bd4533c88653d96af97046f04700f2826c8280437bc628f8ba38febb117340ecc0e849940a98fa17ff433fbf8d9eac681ea7bf0bb5d93f562edf4af2a32f8bb9b4f71ccbe4a98c3aa6b6b9408d2eb8132b9403fb8e257c75921ea7209e1c0c3050ada755459a4a37a5febfa8905bf2ff909819e604d5a4d4fdc07dc78aaccc6de8f183f55710b113196a40a69a3a50860b81d32271cc2bd593556531e57981737277617b0a13a2546eb5cfe2ff81bb82210084d74f2cf9a6b278d525eff999128283b168ca2ac4d48bf207e1f51e59bf74e71c3a85a5abbbb9ddc2606771c57e1b8da1096ba38b59d455ea6face08f70bfedb9bc8f6bfabdd0548fb2325cb5245c228773372505708ffab3102742168ab39839a33717a6a45b8abedbbc8212956e8e265104df45f1ac6f1f9936b6e6b9e76677e9dddce692ec841bb6cbd30b380e5f81bb267a99d501ea6c984b0d589dc4cb8acebf9ba6fe13462292b66825dedf0bc3e87da7a182780986bfdacd330bd9b20f6ca27355e0f4fd1d92bb024f58102dc966a2678c434d694ea087d35d9048ee7c6f08a0277a503e70153a4173b6612b9f3a453412569ba6ead284c0b41195c2cb83a082b836ce4cc85ada1d870c703da09e743aba41716860eee64c997218095a8d2b830723828d1ffed69dff08a09f8a90a1a5fe009ff79d9b8848d20c13dd56d8bfd44df2b6913c3f2d1ccc84c5f135d3501fefc5f1e6f62cd18253e5efdca8243b12864df5945b77a4ff27d41d8dc3d6e84aef205a93aa14d23784c285ad2d262f98629c8545754693cd9a9769e79c28dc5ebef13ad0fdfbc33783acfa76430abf40ec3aabb1d453f2fbafa90f56efb050b53bf7a2286fbac4ba526e5969a121d2f572f721f07824131a18b8fb0a2868ed6367f5b140783706f35453e014225d8e0d28f511ee1ae8a907f3d4c7145b2cf26f97e38af39ce71be9879db67b374849a1e7812aa8a52d2f0963dc44808741e759849d9a68b5a25f0fb2b466f74451f15359de8b61ea623b2577ccf91196cfd2d1d9252e1ab79a95ded3ba13ab3db60f57b4439dea410bacf5ba35972335b7385fcdd6ec557a2d567ee07b7b2db31a2f4d660a132d6294c9a057deb65c1cf1028cc0f6bf5908f90159f54c6d7b914140b48ca895893319fa14bd174b01ea2d41092407d46edaa5e2e45ae342f0c0ae8eab592ad89871244afabe53ae2752b1dfdfac57ed3d16c2cfbb9691332e4c9c2435686a06d6c80b875c4559037e1c69cce6867c10c767e827648306e9b5d6eaf56c576594319ac3944fd18cfb29ae9887b2763b648f99f6a662731eb36ea43221e6a603620baf58c2a273b30afd084d85ff1b043fd65a69ab24d7ef3483b9e458ab3c25374c95a15465ab01ac7da12d6b8126b574629827708f01208c8bfa2e24520462240c22302f31d30d49d4e7f3884686068baa5167633904696e421d56724052fdfe70eb3a70319f2134b30909647605bc92718480e932e27f3ead0e07f6d8f3b0635073559ce69085d240d8936559b547403a12cc4b1e3ff1f2cebf5dc5806b08334e2f36f0858308110f210307d208dc8d4d95b6d9f24c26435c1f86a4c91c51283714db627f28c24d58f31a9172014652c23f567b89c3e149cf2e33d7f886329a595e386d84f5f2327e1f052ae213f92764d280cce4b525a7ca6c789ab04cd878d0e2d1138ce6bab76c0696d89b3519695da23c868e8c5c6126bca8afc215f39dd9708891d9d520e0854451173057cae02faccad5b5d5098d9a40d0da5d0b14827b57edeed9eda9a20a83b1be1a1a0664680c01b22ba61f8641b9972e5b652f1d7cad11f4cab288f131122fc2d9f00b9f1fa35f43b40ccb1a13f57f41dbe35e8269ad5fe6e6bbbcdfe2684882412d9bdb97207ec057205a00599c3d729467cc2277cc2a7683bbf37db6eda4e7eb64b390cd9e19c88783b29cf61c4d494928dc99337d1dba9a6af896a425513141585833aa188a0a0484d299d4a31ae977742a5587271a932d0c64a2028551c64253578e1391d6183d00f214ce42739896ce4888e91248c7849c06420c15de193e0a63a9484ec0e4934c624f0eb624a7a26ce513135407b9eb879925166dc0754a8747ac6d1d0025bd59d1907825fc95a86d18c0bc156334e04da665c0e0068ec22be8e18e70e14f9b3beed38e6d3a72125e4faa124e4f938c258cd70eb5b1163248c8b6688fb94b657114ccc0a162a640b5f58a655f787edafc2e62815b6f92cb64f9e62c566b1cd5fb181567262f68a6d7ecce6c2d203cc667962fbcf7f61794294fd25da420fd332c4deda8b70f742bf7bb3981a9fcb0ebdb8803e14b4f21cdd617d70c6599e8b5609ce84a0c81cee5a2cee5a585636ce5a62fbe74dcba2e0e412e7a1e226a41feeb40fcab8b8c3dd6745c439a025f8f3e4a80e959a9bcb760a2bd435a0e944d8f1e5b662ffae97dc60b6dc443bb45f360c7d2cb52c552d52252823a6c6a6d847fd986481b970f9477fc73ec1192f7d24d0d64aa12364eef3f9a00cecfd31b65118ca029382e9e08c83ba1d257330a06e7b8b2eb5fd3f2528833e685f1bdc58b36052302de040dcdce7dbfe96b34adc1c02444b2d52a6151e63502e61dc453e4329a7ae5d36d4f004da709e3e0c25868f21841002f122c60c161c0001273c50e6e993af3b638c52d660be883183050738e1417d7237270626a516b8c00ef462bcb85a4e864c6c4065736f010c50e002a7fb22c60c165c10c0009f6344056efae4eb563e087d6c20bd15a18fd5839090d48a10e6595144ec56683cc850c7880a886c8c65f0e5026e23232ad82e64a08c1f41193a468a50001a39523d4cb1f480434f886ad0a16ef821546c6eb4637486f0e81441059431c6b86520d283109223031c1f421f126407a86780e5e3d01a6e1d31aef032858776b84888971e9d213bf888624e9ac3901c7486f0f0863c81480e38cc3943a11a88f040e4053d1029824811224d88f0108942c40944a660848d113c181103238e18f1c4882018e10423aa14d1a1880f292832040f458e28028422521829192181111b5113548818009d279850418504456062841c7c9e90302c74510e53cab816f1203bac353a84b54208bf0d219c3f44fac204228c6c2e0781088f128164bb6ca853048badb6cb1ae0c89ff31d904696e4c83f9ea8e0f4b8b47119fff4dc586cda033551144a5ea05d9ff64051144551d4463aa4a1268a9235401aebc3dac891bf35b98cffbd39dbb8c4369286ee80d407a4f11d70647269dd9a386be2acdd68b604bb4161a60be50303b26d240dc6031cf5bc9450946c5993e53af398905756344dd334cd344f97a21cc64a1429e30fe546c95242fe54469ba3a8ed9af5b6bf5c09f59039cdb47d8821320fcab0ef8fb339b7d99cc5c31545622628c3e7731890ed54be2724454ace921f2dd58d87f31da19d1cbfaa2063f48cc59473083d093d093d093d093d093d093d093d093d093d093d994ad03099a8e785940829914a795e48897b578043498492c85afcc9134935578ea45401968fe55683b50cb324cffafe827f3e2b56e4fcd913ce296383362b46ba4238c8dc079b11ab89329bf056197dacc6759412e2b94ae071c3af10c4fd20aae7c0089b9bb531bac590a3b4af8d6d3ca01744f538da20e6d5f9a3009bbbc255551b7b84ee19bc3a06979e5226fe0ce93aa6c6efea7f575026be75593898aadad876ab2d0697867e7745ad0a61d41e438eaacd37ae70056f957139f6ad1bdb62b84cf48d31bc64c6e5d815d67f11c3e1cdf0feca04a5a21b78b42221990bd92dff881442926c213a211f423e213f1072042908e9d121a2b404227420020544cc8008179c80ea201341080ca8c842d80d75840c0102fb69c797b5cea96d30948ee2d9fe93674f892383c8ce5a6badb5d65ac793d66aed35b75bebc548556559d7b46e48d7c4fc336d6a9acba85d99a65dd33fe79dedbfa2e1bc829158664bcb353f2c38db1f7f827c846c7fd0694f1964fbe397d035b11a19442445a2e95134a5a747f2e8b90290060070243f3f84343ffab6f4cfc6816eb6fc968d6bb1ebb36c5c68d75fd9403d7c6b9ad39ce034cefab414a8dbf2ad8da3e1db30d0d3b6dec1b72f1f0050daaff4889aa08c7d177ab3edbba6365306d9dffd210cf4b43dc99224a0d34762249eda4019f331cb57b6a4381b3eed20fd01692cda032220bee6c00c99fad8f03593c3c83445b98cd44cf4319ed785b7c3f8e10ad5fdeb821b6ab731f9cd8e05e0bc07e56105156374bbb1d814cac8bfd732cdff3d79d832f334d34a140943f2aca0a8441965d44c26209aaee4d560f4e0cc7c11931cab6c07caf09f5912f326663b70667ec8085972d68dd60d21be7821dde768246f54d79d24aded5635abca6ff89450de6cbe94f7c219f89f2d3241e6aeb8756c88d19035a8d6f2a59e70a62586c4c90d49f4e7cb1a744e8cb452fda558cc0bd5dfbf712d7d2946ca3aea08672a46d26e2531162c8cc91bb66636aa1b958ee1312a6c424c7ec41a00f7acf08b1712b351fd9540a5a15b38e79c1323cd7761ca40b2f67c9215ab48b95d388369a41a514f5d59b65a175a197df954db0e54d91fa68fe906e7cd50d31e3d30cd381d8fd59836e00a3c6cc0fe7a1bb09817b0bffe06a66f60d3864faa7b3e49d6bab1186215527c18a5dcd7ddf79d73dea794d27dbfd65aabc54875d3cd5a6badb5fbfe3ccd130a954a69110e15d6c2fd19b2566dff6aacc57d6b549a96b40c352cb6fd1a169b6a16556efeb4a6ee1862953da90d9cd9980a953a6e29298bed0087414bb4f4392dbdfb73d4f58dd5c92a512f593be0bbe18434d74240e4400cb10a8cf329b6b9aade6e31e428d96a3daeb5da2c060b0b102be7815980db9f04b76b9825ae47a38891626edcb76f43c79618c9ee499a8fd558560cfdfa31fe9a646d92b565ac62d61ba3cf28403042c5480f901f47803812c4b22c8c8f1c39c25335018b4a486c8e547124e76643140645311a895224c628251227488e902e040c934827fbda5027c969c7cf31465194f2134ac293240a8410421821fcc4239bbbb89b8409548a4973c02129e824e1b1b9a993a48424b52592258460950a10a1891f80d081411150ac40856cea3bf8f01cca9f9c29a51487d46dd950e748129014c15da0424d7017c2944170116a828b920d0f20a6920d0f5a8a4484d01cead113254285d093c4d87403244867ba0162dac9a95e4d514a2bad1b74c804b47ed86e82322e7ce9c99c180594511f7a0f2dd8f063e74f2cb1e13b00cac02fab4951d5d2d4a550d02872446b4c37406a90da5553bda940aa094e5c531d4e1021a70e2748775dd7755dd7757d57f56e4ee5d9f2abfad59d9a2347b27ad6f2b0a59aaa536a4f4d5d2caf0e278890538713a4bb30c61863ca59fc71637a3b2b88902d1f9f3a9c2072545dd7755dd7755d18da2f6270ce8927d6d7b2ec77d9285b3e6651996dc2f2c891eda4907bea70827417e65182535f7c53188f2d3f2b6977caedb9291268578fa1ac78aacaab76aa1c3992159c4f447bb9e06a3f406e10ab9323cb0439ebc602627d2c53b45016ca4259280b65a12c94c932d1cacbd93259a6699962756fcea1d0bfe59b48e6846a2a958ab4f22acf61dcee565ee5551e8ea69b5497c2499d524452dff77d5fdc62cbe51bcc26b2b7ab3775530ec3de9c43a1ff4aaf4bb1e536faed6e17635211b4affdacb5a6bddded1cc6f57df96a2e87e6ede2edac6abbcec65b694db94c76cde590d55c2856de8d31fab4dff77d5fcaaed8d06e718310b42debfbac3dd9cf7ef3fbbe2fa6dcfab4aacf7a55dede965ad767bd29ea954e7cadbfed6c674261d0854f9009d40f5b5aa629b6f4523d6c79bb27b6fc86f0982be20de22d6e7d3112687b8679acd6f55ddff565d7875ddf757d9a93ddf56df9f4de7b31bfaeb634cb34adbc1976596d55b5deabfeadda6237b525add7d51cecb6fc88bdea8b2bd6f4b2df9695be58109414ab60583f66fd02aed7de2d8d3db6790b2b3f3f6f1c0d1f03b0771da3bdbff5738bd11eff8cd1748df5f8f15b9f1f5b333c6f1cfeca425cd196c671bda671b83c0c74e3a6d6d3a585f82e1a82f40cbe59fea3678b9ec177e642dcb81cdbf14fe99605b6f615ab3119c0618f9f9bc177a63911ec1abeb1c6f4fc19dc92db67f0edee84ecee79db05abfae93038e79afc11abc1f4e74dd35ed3dacff0bcf2da361fdbae1972253f86619f315d31206eac71546fd5a8b415ab8d3dbe75c4695befd79c5cdeb09f3f3d907dc51a87b710dfb29e866faffc8ade346ce29f1bf679d3b44d6e6ce3326d2dce7a1974ecf978e3227edf381a3ed10dd99fa3a7ed58c5c1404fd8c6e5a8c19acbb1ad877fbdf53364a5818deb40e75356318229ece81e883b5631822a7604edf8de8600d0018a9a0fa258a2c4922596fc60890b4224c89a0c78902b91243c8ef08ae04db1e486253a2c31c192147825f052e0e178427843bc233c1c783c9e135e10944871832b81828ddc81b7c3bba106afc7e6f2f7408957832b41422a71628a4aa0dc10c5542245c9134bb07b15124a9c28816243cc7bce871042b8c130f22dd3b860b4d6332ec7a603d82dee14a45065cf303fee2c6540b57a9d19fd8ad50c60abb0eb06eb5fac6600bb05cc1eede9779b52467af55afdc66c1fa2909b90f3863a4a4e4a6c94f088314aa9a4537203e10c10aa29439173c849a4a8a126a1a29b744eda52830e983041921e382c810817a4a072f99b4481ea909b1c61a154e103c98d4d14337fb40d7590d06073f99d096d2243c9144977e3845c45f672fdf13284ec449e4778e6bf8b2341d0e2d4e4bd733e494e7f69c2f3b106e7c45a8c52926a447df5ddf26510292729a6c69c9e034faccd49636e540ae311d54eea964b1e5aadc3f837ba9d9756d5c213639711d3aa5a16dfcbe27b55989555989565ac5d195bc958ae95f82c41608cb2674acf949e54ce4e0ecf97b393e34520f1264a8751282047069071d2e8fa058cd2a54f4a27adf55ef656d8c2d785d5c49d65179669352b2b2e18a9e52584914097c885e55ac16ae0d68291e2ce2d584ddca089a10bc8c5c56574a1217f6e5e4aa3671c8eed5a7edb84d0f19c4eddb19a976d311ad7aaacb5d6b2765a6badadae9d5756cac1e02e4c37d1f8c02505b78423e999dadf412b28d01d1ff48dc5b6761c4636c565e46b365bfe0e97a5b2544b0ba0b0e5dd59ca65644b97daf25d72a48b2745ba44912e50a40bcf963c3b3ee7e2844a4ad2d01e4933a7481aafd4ce5d6d96132923ad9d1d39b29cd02f4bed6cf95a49d2a47aa664543e2803ee975d5d52483074c1b96c398bd81cfc81a396c8b8b1d896c961645ee699b2ec3e9779b53e9779358a2d3ff358522d5e06c4c52469bcc56bf15abc16afc56bf1b6fc96969c961d49537d23b96cd72e5e0f3cdf69880fa37bb5efd5216a27ba294b6253ad933b4c12be51fd7d1b118b1143665acc0bf6eb5badafcb64299fe43a468a91564427a84032375b7ac89f8b69510dd975156505af9539497660ee00634d6a8e9e36ada99bc8e6a84d957d43ae2fe1aec13e6252629bbb6373ce893da6d7b5514a29c56aadb5564ca443b6de5626d4f5dc94b25dea8b1d57eda5453ae4fa12635f3d09bbfeee0b7fa5636aec4ac7ae717df5a4eb04e18c8e7de998ebb18fa95ec7c6b40c97ae61b1b18670a6d2352c66ace6e869c22baf581d21f221c777910f221fdcbbae9a4c221f443e887c902e754d4d0d8b2db5150243171cc8c60803464d4d0ee3e523ed0169fec78e4fbb1863c4347cdbfa93cb484f8e2445a2da19d11384a35a773818e8694b91e7bfb86c385ed49334ff14891e70245fb301ea0165e46b4e4099fada6b180d07f0b0c1e56d00991ed3287d4210e8e1cb16e31f7a1d2bb86c31ae635e70f997bfe1f22fefffa2431084eb1b2f1fd22110fdcb8720f42eaf6305d10632b98cfcd016311aa21f993e48c710ab806c5ae2b3acc40d9b2f5f43398c9797d0af87013409954a131d76931234414193aec90f4d806832c4bf8b2645a0c41863b48132a65b512c29568f4505f3c03f806c292d94936bdaf21d6ff13af499c14e08ec3e6d585a5f97919f4fced43dd2c71a69eaa9835a5fbd453f6a9825fe533b7d2722a9562755ea4e5f3e89be7c1db5ce27b9ae70c0b4feb516636badb59aabf5afe8cbdcdd2e4f728cf638b2c7af69982539d318ca51f638dbb4e8526aeeaefd9c736a4f29a554abb5d65ab5c7f6ca36510ff2f5d5273bdaa552de34a1ecdb4c8b7a90ef5becb1855f7bfc242dfbbb33cdc9b0b1c75a866dbd8e5d237bfca44c4338c3d5137e88653a267bed63f0ebd89a9621d335a08dd5d2b68f750d68cbef347f86572e04df86c14df8041ae6f0e2846192dd66cf09abff78ce6f248c6a7299d9c9d194302a21a0cc347592a6e2d417409a4a03389af331ed60d000ceaf38f3135071e6e3481ab711a2e2ec49df07d49cdbe8f9be03bccf69527e148a94990f054a942852a4f4f4ec39e7744d9b1039c95cc5b1d9128b9870538cffb9080799bb187da73129a59e474da65a6bf53c6badb5976f34eebdf7fa265a027257b404e4ee4ea53c2f9aa2898328eec55e22c31a773ac94b36980c3520d984a499ff4189dcbdf7deebb2a7969f45054b1b587e3eb1eefa317e3e3eabc3193873777d1b625ec06ffd0d6c55fa56a2267e40c23e49d7ae8fb59c433fb8335e68ada63b7077777777778f718f0fa3bbbbb5d65a1cf5e55b29dde79c94525a6badd55a6badfd3ed9c92e95f23c1d5c5e030291ac757bf1806b88262447f25d80325226060b2dc0510cca824b16a40b108600a08c843b356a9b7b5b2b4435493901b6fcfb73036d181826786234aac6e19aa331df692a0a2748d13305154f9802852848814a1553a0554a3b4650030f1b6ec0c1a6470e3e7e9000ce481a51571de08c7c1ab1ee0067e4539a82344573a48c7c27972714458a24404af6c8d1144dbd1e722aa6804027a57302478098c2880d4a180204cdf9e13bf8a033da90ba4d7474769882a10bee96b67c0c034f3a6042761677c21ce85b96239b1e73ce39994cd94bc030c9b4148222e3eb253c4d0cd38ad918b98cbc2c6623cb2846c23ec326f6246b67315c663eaed6de4a6196e40f762366436a8fbd86fd0c59357de10cbdecb55785cdb75f61a47b5916267de408fe8591a2b4e62547f3317d61a4f9148ee0438c845918694e38832b0c9b36e65b2fe40b5ed7755d51de0cfb0b67e663168c9695699f358433f3351d37a6b90eec4c637f3776e95012320e2c5fc0a731c42a9a96accf0222b55d87c9910d757254a09303c4eeb6f5694b58eb087907a893ffc958da4dfbe08c530aea224c951da5865bbb73d3ac2899cbd6e7833266aef2b594c78e537374c786b2b4b9fa312d581cf76d0b777376db875b8352750a184ae80e9940c104b535242413279838d9215adaf8e5856a041b3f3f374720c618638c31c618638c31c618638c31c618638c31c618638cef51661c8e2db50e190b60840e12504443444344434443444344434443444344435c702fa52d6908899c013f6d1cf1ab1199a31ec8dbf5af49d2b86cf99956e5caaa705555d96353e4b8339c354b573a6ee7280ec491a33c5c0ce4ed197286bc97ae6eb6bc296fb1e3732db2ee86be6ec111f5c85ccbd76df92ddf35c991f4d36e91c14ba99242f3aae99cb5cf9e90e3d6b42d6ec973af2a7e9579ceec24467ad911cabe2fbb1d453bc89cd569385046a48fd1bfe8638b7e15758b90a5394d06558e166d9039e9b613a98c741075909002830b17212ae67411ea61014e1224f044c1c41072a04a1e90001a2801a409131d9e20024e21270c72f003063840184191b863dbb01e63a7301c0ddf76cd4d8cc3d2e67cd77a831bdbdedae23bc5f00019ea2051dafe2c29dc42dcbf813d836f1cd9831e3280e55ddeafffbc6bae45dfc761618fad8d0e21bef5a86dbdcb11dff667a991df3507837f9a9fa8f42ed426b57468660000822001a31500002818100a8442912007234551cb07148009738840625a389709845992e4308c7206194308308400180230325252040263446b7bc2ed81ef52aab368456ac8a3a46a91b9f3b8a1385244ea4fa2601c7a3c8624a4e0e627a250404c392500f6e6c015463cb3afc64ff2f36d6488e3d984e692793c348e8e89bf60c78babfe9b95d62dae8104f93ca418e11a8a2af859f6f0581417ef5bd863b20c2d70c3bdf61389965f0dd6fb93f4f6e43756e5db4e130bbd7ad36ba8ddabb4597ed0d5bc28289fbed7ada8c78ce78f6e119f9b77a35398dd8e120f219d6bf62350855914a43674d8d6432f40864b3c4555b27eeda820661ee531a413727d7abca02a86788b09d42794b188540c56a860fcbf1fd7185b61c05e489642edd686b300c43e1e54980b80a8a381260b5897fef0d419ca5ef8e03d0c73af6f62acf6fe6344107c143ceaab163c9c5ee92bf9a7686b13847f963802f93afadf72118152fd246016e00d48202911e74d94869bdd873db2a860fd45333d1741d5110d1ea8b21fce54b708a23202c1bccbcf22ba14ef5f33f3994393dc8a1b7e4a6a5feb3197ebc0ca4286f2d9ca8773cc22dd7fa2f48b539983f62ac550fb0e6c29d92b52cd61a8eeb9eba3f1f23a18e1673a88f91e81412a605fa2bac6b8ad0443c50d244d002499a66faebc051cbb2581cb44a361a5de1e65a50bce17114f44b9022d435a07fb1d1d6bcbb418864277b936379948b43ba01b5460c09a9db53346db0d20e7362e07349b1a9020c92d44a0784d22323afeb12ae3d65a3c71b1e592d136a0aa00b67b59846f43c4a38c8ed4a6ca74bf9d5b40f4ec9fdb65b425c5ec88878bc8e2823afcbc2b229119fd7667b293c88a88d4ad5b2773a3f3e8b1ba3f3d0dd1c8ddcf0848091537edb97b2341726181d86f03b385c9fe894448a669e1225e335cb8a9216e7788fd132ba99ca781efd0daa103aec97bbb3b552a00dd8cac8f0330a205c108e36a348d45c9bd1483c2d80f2f951b8df3a3fd1b384c760a41982b8c9df92647ba6b1fc5c0a3070c924605f8ec607fa8d9a216170136250ad9c8695b2ab394c3db70d755108b9636d0a4dda76eb00f5736998db816d7b603b453be23d48a157a0d8549af2364c14c8a59427d5ee952c04d97fcf7f131d28fdef04e0531c28e9dd50b09d5653078f42299fa2095d37c18d4ad43395821db515a240a3dcbd8c162eb019fde0caedd659ed2e71b84738dd6faaeb9521b60dd9b1c0ac4123e26a25ce848a9b4f8ba8b55f52d203835d2f072a75c905a7f11173572bbd25ecd37f96f82b798eefa886685c895b7d0820d86df6c69652dd2d5e0774fef4b2e7296332fd724df2ee9265a7aee10ec657645329e3d8eb6a95efe6e2af749763dfb20d48c45d6a73b64db73b2fcf782458608ef0c87700113c0aae2f6bb4688e373aad4f3a319ec18b5bd457dbc17d48aca48cd77161a37b7fe6567d7f28eb32573bbd91e7461447ec144bb5e23ce3c79811aa768c6f8d059950226c9ba001c1299551ac57ce158122ebb15f68b3a374466c808e9a8dbb36783cab710d9ab8698a6479925733248ba42c3e00cfbcc655c04c834010e3142ab49c60e1595c9ecbf33fff23098d92355c6c223ec990d09069956b6291e8e45f4178033846d5c2f96913525d205d26fa02e4ec012100f977c12d9cac163a3cb040d92a41c286f2a53cc63e93320cfb52b1cfd3aecb57c7dbe77a0ea85f05e9f583fe4103d7c0b93124a9ff1e4bd1f9d6760ae43404ab5f96bd600550a29968beb60e94d85198d6b683bae01ee710ddb9b4e523885a47d9da24b5a9c2f26e92e3e4032350abd81c63e9bca6dafa5c3a85928a3fc9e9010efb982d5b48d974aa76b2069be5c73370c21efbb3274d5a9301025fe3fbbdb2d71fa78e5b64c88ae2b1666b68fda1fb7ee135e77d854a86d2df35b7713d9788ed1d26e39419f192cc4bf3cff244265cdd5d838775153f420a6b0cb535f6fcce2190adc6dba360750d6c4b8d95c98b4fba3a9b2caef3f0d96601f5b69617f983365b767ed31bd3447ee0186f0aa3845fa0092af58db654d3a6899f58ada6b406fcd39353a18e02a37311be01a6a2bc2911ea457c17e4575e75b93fb096f47663040293734473c1c6ce1008577c20510ee6267c77735b6cb1440e1aa2a2fa520c70c5c0f3e0eccb40a5ea3c41978ee82a4deedbfb329f8d34627e794726430585c5bed91b552d4412edec053a4bbafa793f751fc1b09158ef9817fc708a5ace43b130446bc601e00ed163c5d78102a5ce0cf2f8164f0ae092f87a8388134bb16dbe01a4f9540ce87ab0296ef22f41294786650efc4154c50004e3ddf1bbc6646f2de1c9c8a7be4ade083131ffb724251572757f29b1528bf6313e120393d84a7d3858309c68bf2d8b3f096614bb41ffbc0b3376d59840bc35f6ca2f1772cced1418b7bf1d73c3d0fca885a2dec26a7e6eeab0ddf13f4545a801c62317549b3399a4407cdf086eb7e0d826b7d5c0292bbb1d4db464ea36f1781e2c3bedda778cef8306031d47f35feb60cfad20d3e09c65d62058819cde0dfd7853caa70caefe94bbaf8a759888c246844b73b1ea5cd60e90f4913e5c35da6a513cdedc2fe4ccbbb5ae9105e92919e681b4d5bed3ade015dac5617877691a51ed74148a9dfc30fc64b6f15ec8370bbe8870fa53c091ba3e2a4dab6493e95a83b5bc7a02352287456e2e5436a7a892e5b494a801486490460bb9b66807bda244cb5c2a72a3e518e1b3278e8b0c3830e1d387cd0e121071677f0c0a1c30e0e3a74e8f00107879ca1a99df3b7e8c48f00eacfb25a5bd57c4919d284234869726a5ee810b86610e6ed0bd5b95d2a28c763c12394ecb27a69975dd313e870bb642da8dfe20b0f4dbb2cad4927e425f3e5d847873daceaeb610092c91dd9d0a28a16e988b3ce9b2a070070559a5d88ecbf08a28bd22369c076e3d8fbbc681cc3dd57347a726acd9000284422479439a6f9b2a886f0eb50c9e54e56079220fbe367f3b854a813691bef89bc5070cfa7fd7dd1dc50f96dd93ca852cab28e3f7012fd23d00585ad474385d16d0d69e64f78e8625ccf51ede420223b6fa1e305b898af458c19c8a404af27a2dcfa6ef35aa4652b1117386f4730a071a1faec4acd3dd36e4a3f038bf2b4f1b956637311043eaa172f8d19501b5073a5cc416dc4dfe7e6a89b7dfe28871173eaab28ea46a66dcd047562dcf8926b83fe09f8c453eefcebea889bc9a4f073d1d263ea903a66049ba6ab904aca391a055ce97ac1a018734d3b1c80c632eafac0f19717e0c25d39baee2946a241ff63b917a2157acd50dd12731240b4d020f37180d86f14fc3b9cef71dea78a564eea08d57ceb4d0a035bed1afc0da3c51e7f1ecc0534a40f9f4ba2eee1696ff9672c182678168713d19a44fc60aca829ea03c61174ab95e0aa3b8b9a84e9dfdc9c24650a82c1efae6594fdc82c3dd83d263636da6616c6cd4b4d078078b0443d652ec4c250c75a952da92182ff809cbd9fb2b0ea16e6d3cfc5423be84de0f635f1b85e9ab8b5954bfba18ff9f8f8908cfa8aa0420b612ac52d771fedc47ac0dfc69ddf55a41f8fdfb0ccbe69b90ac9e9ebd5562fe4e285fe63d6b6be0a5cf37787f99fd8dafbab48e505b0e8398893c9c3526424326369caaba5f667991212ccb48ffbd6b63ebd4580cc9dc14258446024ccd58355fc3137c0c6992da37ff553d26300163eedf74b3206c8902c77ee0f8d23f458873046f1152622d731e2c347cdb89c6fed535ce76118308817081eeca0b447ffbe80232974be44c34dd57e14bee1120be30a1f01bea68a623660daed143c768e8f1f01eab95ce138f0b6129f1111a6435448a70626f7203266c68dee4d32afcc70de2ee8d44ca461cc88f6f69c4a306f1048165ce9b62e80a31f35591439761e2c452e1a17bab2748d7b8ea1194aa90f1ab06597abf609b48665e26e870a10f7c201f1756fb19775ccab78977aee11baec5a63891278a81e44415e86249a05e0407c93c480e2e26ad22f6071a5e8222beac58fc442a833f7abe68f3190204594e38762d0c82d10e825793d08a08dc43f5cd5b2e3351b08e0011b26c58fdda5a65833a08cee7530a84cfdfec22c3310747421acc5fa04577d4d50d37381a78a56965fbae93529a178349dfe671e8e03acc413b706fd46d06e420ce6d6d0cd63b4d08bcc84c14775563bdc8ac9075db735ce11a61122ba4d09a1baa261ddd61848e75a1a75b686595a5768588735c79471350dba5ad34459576958c79a970da31519cf2adfbae2923790a218f27f759bd8b0cf3a79dcac475b6f3e03784c585446fc803ca1353f3508bdc2179c6c09af17ac5fcc4941172740a4a940cdcae7f8ba0f954e5752a0d5e9abe2379fcfa11358a2b85a8f96d3ce1ae931db379778e2f684662ee621377bd2356b2063cd1fd87905feb95f13c6600f2ff367ef641d048b058ad840e4f92331017a06449f5de52c86be953d2ef209cb28df0530634141ae797170763ff00f0af2a262bae85b873db5e31d01cff3efb3aa3c6892b3f68b9d89b00140b8531c13c1d93d4d34066298ceaf4c02db564070efeb1b4d6994e3600e80468ee127cf0fcd692005125a118df4a0ebbe04ac3be42cc6c792139c7791035149300280dbb87f9fb1e2bfdf731b981e112088baf735c448b705a5f68e04a83260e1bf1981e50cc7245b16105050cec00306fb8341cb69eebd703b489fcb4ecc7030eedfd9d654f8aaf6261c6e8069c604566e0099f909f3268096752f57aed998ffaed8d4bc7e3610578add0c1508d33ed748c1bb4a54760a6815e19e08b9ed7f825f2e8cde3aa6c9a900974d802e0f2fba9455f1993135d0032192d50ba8f133821ea58d0d7f41a0425db47c14d88bd1b3f90268fc91678e74cf24c348323d647f0f0d7e7c4580289e626ab096a04079b26f10e10feca702708a0da080818a1b8013ed0a3845313b113d1830ce8070b4953d365df9b220d01b5a6089814de60a1c88ba2c4a8f4a26cd87e67c45163046575114ff55beb61552a0ed644b5a08872c4f4521e37fb3cbaffe3f0987ad66d0510ce257f70fe78c42fd5cede884c459c0d67e81465744606f78d50ba994b815c2def4df2e69f5358c57f74efd0fd6494e9e1b4c2a74adef810202ce03a48a54d12912bfd2e4de4bb92c0d7751e12ffa1ce39e683ba3a6b7680b2cb2ba1962bb2951ff48762612dba764c6aab983164fb6e84225c0f8e310f758e7697005c542cae9dc02a49a11e9aed6b4746edd4445e6725306aaf7ff9d016ab532b413f4afb5f56b78145521ae975473a22e72d3f284c0d38b4e7e3fdee6776626ba5cad596e2a0e7dee4db58a8c36e8a8c2a11c5f7a39302e0a133ca1a4500ec4c30470b29c6719dd0895ab8b4e521ed0c24f5412b9acda048772924b291272f41f2f1913fbba096b69a0008dd23970c8214f7175d3fd3ecdd540ca587e4c576cbafc734e589ca17f8201d8feeb272cb048c7ff7b76cd70807b6930e81a14e38f94b0fa175e7a9aaca8c893fdc29327aadfb7888d77682cc413208d41b183e1dc911af8c99a96b95204a611c2e8912cf807c7773f821db4dce62fcf3e2947acdd09592bcea0b0ad2827c25fe8e56d987698365f0132bb5e6dbae4626eb3a215edfb8f2c1348511ee7c13486412e78ba52207fe64291eb0e58f2c53da9fa60aecc6ecb20b91c745310d548dba49d303b9fd758ba822716a4c050931bf89783da0a999c2c17bfbe40e67a81b0ce5b367b9114044be911832b3ac044e7aadff01e308995ad04acf45d1f5fe7d8295e4ee5a283b2988591dd1372e117357c317f52fe4501133ae95cad7e7d4e901d7c06f29e5a0b1d3bf1d27ab0e34e712fc58c7aa1f37acf432893a02da898c3328b2f5c5ca1e3694c76ad78014c4dcc7b5222b5db9175e63fa06bf3801ee0402f53ccd91012955b1491e66f0480cbd91c3d013815610cb048cab1e4c9eabc245382bbef6f5b02bb18dee076fae3ec78d5893a0783e5beaa7581a0a49434bd2d50fa606ef5bf19c5740c45104fe4d75941f63228c823632a9ad7700be4b0ca3909d080aa31292bf749870b3bda8711a13f412f92217e1f69568688da55f31d2af9dfa435fc5832e599549fa546b66afdfd175934861541ef320e8961d4df44ecfc3a12b477bb692e8864b290ca2433720662f51f7951b64588cccd8d5ed4b69ab2dd4a9aad0efd5d069356aba96001c56759810964e4bad956d51c1d512abfdee2370aea6676a737569ac7318d34d8226f8395c73ec74ba4bcb53a45c37ebe841b6a27b891d82899255c4808608e15ac466f450a34bbad3b270720b9190d6e2e566c2f08911e2395f812ee1c3b1e73dd78e75eedc6c78db59b1ff76a37989f7838fd9484b5ecb6d849358b56e2eebdf8b7bdcef1ae999995fe49919e7b2621796a95241c22f65c07523e6cacf657bd9df15319697d64a4e3eeba191814db3acc841e4a0dea9b2cf5e451d0858d5c4323fcc5324eb184f3ac108a9267536720516c6e82506c38a0b472acd6dabfc3d05975ad176281a84a663cda7e80d040f3a88717abec8f62616c06fb0d2f26dd3c693f37e288c2e576ac67722636ba96c7ac92a09b50f32e40bffa5a106e0d1602158af439cf4cd9e2d439556c7bdc6b239240d5eeb8e44a7e0c087bc245ec2deb95172e95a206ea0bff799b5d5515d2213372125d45b14ad2ce9c3e4634ef0aa7b4962cd6e787316f399faebf4e49b2f9f7e07a858d00f79cb4360df68db35617117903a147431dff8391cbcc3c8421d15451f7f3c688d9614d564acbeab9c24782138e16ac7e81fd415b6b957d839393efd409f98c4107c86e50382f70d91e0b4e6bab5cd15bd83f326c870697e2e4f402c489b0c4b8b214124c3da8eccd7f8d0b987f33563d15ca5ef17cf5e28ec899c2ead9ee92f72356a564438bfbc134671f6fa071937394d8be1103b6b610762ff535ff8edee6cb390a7cfbbb0579624583da60e8761f176b942d839f8fb8271dcb861641ce4725b8632a190d39cc212951bdadb700b2c8723a7c6e91eb48f8c1ab481b14cbda0efd628ff035ba7c33f5fde8516be70e14059b91d769cf9a0e71d92f64aa943ad52517d92d54525d08e2501271e0a6e8ade644756341a455e5f85915a3bea5a9acd1a627005662c2ab4e96166bab06b2516f03af9cee8ecc95b2b68bdfef98196756a2da801fdee63b0a5426a89584396b32bfd5130c5f7a6b93b8cf590a144fee3d7ec362cb0ddfff7c75c1e20a7da047118aeb5a6069e76dcbb18a6de3540ee0285af793db04b33e86a06403d9872bdca753fd6b7ce8d10311f9dd00c2a41f51af7c1aaf548ca8912aadc1ee5a3d45b8eaaf35fcb70c1ec61e91ac5556e4119ef6a1966043826691f610ff55f0575eee89844a038aff97643e98405d6d428560e151e3ffa40cf7db881b4bb8f50c4541adda2095766892144065c3c35812674a8c440735170ecab6b1a6c41466d6c9a8c4605bcc25b784a673db4d45425106aa27fd3e8f43c8424593c3b4e61edc5a77a12ba29e477dd240b286ed8d0012063d087bfc498cd7870052df9aa4ca9be4cbd28fdd0f11cda884a46ff5bbd8246ebb481e079e10612a80e399ce3d339133606b861b844516027dc02a5a528c5035b68ba8d01bff8ab2bd6812683d93e4b9d4012725ba613b26137455667eb4a905e09a3485cb0c07e41289d1bc0eae4653a78e18ce61ad142a04ec8d7128a6cf3bf990b4ff0105e8e6e74faa1e1386b0f0974d9f39f1b724a94a606206dd793547975560dc8c355926ed7215b4f1a0550635df83390164b2f8fd270f89502d1cbfe888fb6453b8175d026790e5787c802c096c8c90c59e2365bf9488cdee29bb1380ccaa3a652076a383b5d5be06eb27d6805a00ac2df625d88ec0e4905a551d050b5b599b28424024d6d9d4f150e8a0bff443c80454c7d6c13fb0bff493e8c2a6fc449205d90cad5cc0ae139819b2bd8680b01bc46a48f4bf66bfa7ab5e120ea90534272ad8176b06d235c031dd856e5230d04cd0485b5aab827426bf905182c5014ef9915222af6b47c84ca99a75abd1c85531dd081d3b0fa2a816652c5782d8b2b49cd23d8bee83f403117cb4081be13de6138f4a6e9bcfdaf83b72ad182f23a2ad2a38ccc55425b9160b861ac61fb564f220b4448a7ae84544993ca73d68265218fcbb68157b49dc2b08e88e014e248f674590674580623304da80e25a920f3539ae8528fef78262dbd92c3048bdb7138d572e459435824dfecde24bc21a0747158229153f2bae1511c292126f63799d77c3ac20d8d781526d3a9f0693dcd3a0eb191e883a1a3d4800cce5196842011e467c26c214380acf1be9bbe8c984ebc920891c7ee12e9298dede650576ac37739680859e7a9a16b5b5990c8c3b007b905f8ca0dee3ac7982748804fcfcef16741e7e83f24f53c4b3804eb59e0c8ffbacac9799ae7163a837e8f68bcc8c550b562d474c52eedd8d4c97b18f02ea853afeab50fd6efd111b30b882385cc3d55c96ea6c997516086aa7f7ec86f73734541742777114b13aa7d3c87caab2780d176819c9a6e76308b4ef908875e5269b6da53a20b6a0a0629aa573f5d2f7b619057fb50aec2a1624db27005dbcd8e52b777b9229b4d12aa4ca22287131d0eb481376b3570894f108dcaa86f7b649ce29328d401c7a8843fca0acc699d7e8174d8163b0777d627e2d72e7e165772877fe3f9fa44f66900a5125b88f6f4e89abf9269afd4cdf34ea050b6960ce0d233a3799d51b56a1176418263b058fba7dba51233684c94bd7aedcc35d879fe3fa60116388453cd4f91f99bf56d94e8332acb1d6d2e04d1cc60a858b5f72eb72e9d1c91f61ae9221a75551ad87f72a7936f0b59070924d54ae8eeb476411d3b593fd69a88cb8de027d98b984544b9279d2ce9f3004fccacc0f851abb0edae707d4782507aea48df075999ed5d744af0053557f3a9ed37abf0dc15e0be3ae0401da30ff6fa962dcf45bacf19ba65d6fd6b0e62a3f9f3a3f68b614f2a017e0b136b579345c45c7e16d84ffac6df5e17aacc90ad26effe26148c75a597d6bb875a98cbbabbcb469996b00584591ff394c6a34acae3eb83484cd72f107034de13d71685ace5d90651e6e8a8aca13da5f1e9cbf24240d4f108cb249b3f915609a160f8bdb53c610d1ab9e94c64eb6e14896f6a52be6a3d6c461e88cbd70723c8f59fa95df88528d1adc77d2babe720830dfbbe293862c54b8d8d588b956461fe23936ca16f3b0773b03f3448006c4defcf47bf8047dbbfa23a29e2bf5500b7847bb693103fc5b6e2c53d7ab686c0e0ab1c4b03f717d19f27b3c5c3c2830df2d723c16d1dfc7b020facf03a54e587a5c86df58a59d7c9e820471921850d436d8444311c7f5afa974c9f3c22bc4a397ca81ba906349c1d82f0a6ce15ad9932e81970191dc218cf71bd4bea174a24478a38e098fe77982aa8c87fd9f41bd5f09fc49867f5cc0fdfb4a13f2bb29c0977b4c46173b7a1c27d25cbfd15cef58cd7050237d6a606770c45203a69316a8c1421b04815502ef07e8e242f2ce667402e7894332352f44826c2c81f36c3fa68c9d0b116491987395c07fd7284e10c75b41e72670f6cac79041bc2cc2050aa6f39a5502d774c263c5e2a2aeee0c742f8331aac445ca7a4ee9ea587bb8aeca89e0ca8298959d27a01b63eab62c7d1c7c4281a3b0e2319d2c54f3833687e75ef2a277d9b2431682b7665ac180fca2e90380a1c203886b447d9c8a9d6c14e1766518748ad5e9bb265e0a2a2823b42ec210fd91204b0ef4d04c9cc77ee3447c4756860440f293c2c01f390238404f0a4d650f2e9ff014ae51be91ccc5f0a4f0301044dd66edf49047e52785937b3c2998a5284e0a9db1bbd2ba72cee91cb9f56797d4fec002e5bbb00b7398149ef9e896543a09119abf2789cf117471f9f7f116b04a1c6021e828ddac4a916a44a14250c6958f6da081f12876eec779d9f9e64e7d307485d019714fabace9daabc22e8feb2f64543e29e17c6ce20ef8ec84c8fbbd1486f99c3226fe670790d383d5654c8890d866a9c1be8066db211977b0cad47edd9767734ebf596268b7c46c57cc598aa9379e13a9064b64470e6cc67cf338bdb9a1059964fd4b78918de971ab82f7edf524e7b265dcab0a140f978f8688f88de488c91e76e6ba5876b3fcb5fc692ca4072fbc1eeb6ed22193831509e67114a262a3f55073c955801f2b01e35d895cf6384887000257dc6e329ee4b0c5fcb4055e1a3edadbe7f59b9846b89ec071b57263c1edb6641ab07d9aac17f588b8bc3de670a7f082b222afc5c27bec266a557ae3091be7794e0803444ecd4542f3ed98afc98ce4f0ed998320f9e8fdd16e0ffde9e8bdc0b92859deea633eab8a204782a4717312cda55c92b8d5b4c4dc6f7979e6889fe0f2f25ece6b6f0c265bfde02e6dc2629dff78f66242658b646e3156a293727bda6721aa430ba4beb3f8e3956b89f9e27c38e7d18d53507b0ceddac0e3b6b404bb75dd9f85976c478cc8dcb956c7cc6b0bc06911ed5564f2de702aed0e6c3ec9469c0b6d5c7b252f974b2e29fea3a696aed8cb62d2dd529c4d4457bdc3706cbf03d43749019eccdeb9992b063fafc4dc2ed17384d5ac549e438659d1a353a0d7346d585389ea635bb70e75a4ae605c25809ec561434a49c22ffa7829ba5539800b7280af4de8d176eb2044e9bbf964163e30a151421523e6db057d33c0a62123dc0bbb61748219cc0e2d8fa8e3189e8858ded0bcd2d1e2c026cee941a2e15a78be5b832b51e3839197298698ee8013d42f5f9618e4c82eaf14ec97f5a0a9817e267d6d693ad678415044a3ada1ea59e4eeaad1cade5dc11ca617578aa05c4a70b5af5e225f4835f0c9d438b58fdd1b4f140e6cd252bb1ec34dad9a521057433c3f17c8a6f4b3abdf049f9eafc3f127ec264801365dc0ed2b4021ca45adc7071646e0c9052c5589647e31a26d01e4958a2c5a4266bdc1b4dfee7f5a751e0928205ad079d675616c8c5b7c84184321240bf944388d41b2b82b8e0965add04032b8c7b0273246fd47e6428be979221799174ec92ca0a7b710f3342c785b82920eb283257fada9613b3b40f3d3296ce62c1e7290756bad2c78dc1318f50d6abcfa291db93e70b7a29ace7c4e2888f5711fd6764b7c1f9f1e433c104b47c1dd64911014eaf3b73f793c09d504919b68a45d06b6e67c45b743cdc92cd3e57ff0f1a097b6b632011bd0649b685d5d34ffe48a397561cea569d1cf86778bd012e7a680078c6baf1ebc526fc71dd9824fb08eef264c803a2368061a03b3cc0d1708273450cec8bb9b2b0ecef0d3d53d4ef343df42c2f64084ac6a0d840e6c1b335aae6a3f887585d17de3972afcf1b4457139d75a550a9006700a9bc9327d22296fec50843d5f1fadeaf9a9adaeeadb79da5b8a55e99487661bef050f58e92eacf66791b3bd068d1f6d2476daf7e3f584d988a66356f6d69ac5443dfb65fad60a3717bc800b825d8924764fa2a6ce7540e45b5b980859b687e86ab666e24fcc1d591c67e2c616f2f8af15b2ecbab795dccda53a0290ccbc46b5c14a93012d0ac0371536829013e52711d282ae2e7d5f0628278abaee4f1924a1454f1688202665d254ba2a89f31490ead41e8a3aa8c8b599f47f05e20960a9c5c75af0552b27414fcbd272a1069063770db4c55888f9c3b4732f6d996ec89f786165472d60338586d1c7b6d9582ebcbb22a9f8b8418826644e08e5999bac7ba9153e052748baeb03e008d2a239fb70410409bba55c22588544e6ecb8469c54eb81748031f323efbcee3ca2e6c141e645a407d75bf126373a22ca42b3958e50698e10d80361ae3cee047a106d710945291d40a4fdab5e7e1417a05043ecc0c04d1cf6bab68f673fee9804496750f03e3abe44d4e03510d1063876e08c9faa16b5b5214a2083aef8a7739e5ef0eb355bc6828034ca78162daa822452f6fc7bf132096a331844cabc816d5f30a6f16c2659e8266190c5a44d48f6f903eb702ab610db02c77a079ddfdf1ed75ce815849ca3b341c2306d17bef28a2be28db83d5edc8dea3eef064c7111d742ae6cd2a7b1fdf21085b84588af485c7cb5347ba53cb6ae6c540796128283a24ffe95de8e4b112c2ad0f9db01894a5ff2e24151d81957e8e0225b474eafcdc8bd37a1bb7da6facedea0fa2366779b7ed601668d3734c6e31996168fcc8a23b590087866c9c4768b2c4c928ca30373a3ae8cce7d373da2d3923c2ca4b087c6cbc5ee6edf2b4f700207ad3dc7c51e15d86aa6cb16c39d90282602ad8408bc8f75e6872da535e0d05f25579fb2747ca34c9f945d2aa745ab534a378d5732e1c85c9d20e839fd98e5843d468cbaf9c8c8b37a696f2e397a6724429f9c8f6a758100759c06a77d4044bb9541e360253341bd8de1f78deaf5e1583cc74fabdb5089df915fd838990470902571d9b489da403612c227a457b8430986781144fd0beebfcd1e38fe6b505d1ec092fecb4ecdc82e630daa9c81ed9e568b55dbc5dd60ecaefaa38b49dec98b3ad57cac2b19f08cba7f9a128ed766f568ace0f16d5cf3ea3b5dd757e50e9bbc69409228d7558202ecde771d437cc2130be7d5993164436646e5e1303ca1b892e09b66ed4ce1441b51031e16c5b9f72235985463450372451d3e1ee8bf287bb56c92211f3946bb95483141d53e4b863b2ebdb85acc84018b836cc8166bb17ed5d45948771c854f0e8cb4454165707d2cf7c684e2c0cbd04029eaad903fd88f428dd39d4d1e3cebdb4a03d333682e63d388104a01c7d1e00f112030d1a3541f2d5d201a08e9f7e184da87e1c6bc69c03c162ea5ee7bf2f7b6a80b09204af5ab73fb5bf67387295f4ec5a1ba4cab7caf23f2491a33a2c9f14100cf9b86e6b524f8ca3de1750141426fc6c5d8fcfe13b62ee2666925eb6a22aede60eca86ad36ad281c841b3908db388e67a9b2578956089b82f6e30b44b5bba2e9a6357754fdd835b2d1b579105ce378c91f035776f4e1c8edd780ec4b67299724d41a073849dd4f8177c0809e508d5920e98e708370aea43af73b658bdf14f9c5add751de97543d3ce039df9e8d743cc6c96d76540ec6e600c1db2028c307c89b30c3a0f46b01f08180c2902d381adacf91ebbf7f78836a4169d8dc5df937626fbd7947cd3fa5f198a743fbc547109d482a8e4035a3d0309ce2b953dd25d8b92eafdd2e07a9127b5a326f4222f68d253d14c063afffd0739137992c724ebc83e9a4eaaf65245708524dc52e9c06250be4e213a828285c63aa9e016dec964e7a744a81f4f9c74b068bf4561569ea05d039bb3001fe14b3465f97fb32d7bf93f8a326c7a57c8e40006a130f90b21887d079380e5c27fb82eb834d5804d2e1c7d235b142a50eb07a649f50ded1b61dfc341bee97fab36aa50f4e51f6ad00f9d3f3a5d4c90dc3fbe543e32145f26a391a9d38c2f2bf1d5e09cce4d8f67d2227e09aebc1e3044191ff4fd339dc44a94f1e262ada20640e872044ee687172b0b4f444af6b59b65bad264caa85b2c830c485202e6abe788abc52d21a5ee8f7ab3c66def4e93da77b88f2216a7a662add96c7e4d8ac97d284f13a4b8604d9340cca14595b6b3b23875978eb429cc02c400ba682cf0063e58ca1fc88a8c8ce85dc86c2c865c2a8dfe083a17c3c5d1c10513af85cfb6ef52f8b807bc0c3bea35f0fedf05f1e3d184ed1f5e5a780db8861fc5d2b4c9876ccf3574c831c6d282467a43cc8c627010956c93bf0a9206cee6716d22d1e378d63ce9fac4f439f460720916c061852010a45bf083c8f5f9ce201148b070173f4518c7b57d03dc074301315c4786f207bc555fbb6e0db05b3c4bdbe700b087d4d527c570600c821e2d2cc88005f2eaef422ed0fce0a2651864ef5c5df10de9348739aca682dd9c1448ebe53dbdf91d549884d0a743c61b6000412384c1d1485d6d77e21d47f56dede6aba705c355674c33ebc7b09752a997df2d3197488cca0ba5a389898014a29717b629ee33652835a490895f8de5baabb90b54d4fa628cfb081daadbf3a5ad18b83d8d9a94776ee94eb3658e2f3fc653f638bc8a8e7ebd074aa37df72fe8ba982e9646171e5dcbafefdebbc0b93d503153fdbf5195cf1f3cda4b6b0509b4a12d511cf5a2c6f050b641e0b35673cab7c11b1fb208159893415045b5db3ec7595ca7d305c5545e1d91db8ff538b799d1b32d5e0ec27fbb892aadbe51282c02d3e70ae6a8aabf0a0dd814619a69177c6a6248f5ef743b7b329eee6117b4e951b7d301a822cc527891a79f120c48a0d6816afcf168c056b5c4c45871f333047412154b981fc4110d6185b86cff3add9c4b62ba02fa97a8d17e34641b5f1dda9b3b713ab15b9aea8810da9822b2be5a0d9d71146edc1957b26fa134fcc419ac3bf3506cdc9d12883efe69e5df93932347f0963efd8a641c8a080469784645ffc9c15fc6264f6612690579bdffb878c918d17c8ee69b0495d8fa2b0067b7dabf7a05fedcf4b5d89849ec950202dbb06cc65ec19689aab70d593c037edd4bbadc070b4c3a23797f79f6af1cced8a0d5e3b977741c609fe70c687401a1cbcffbd4bd2bf11663ab4301f806d737497174a3effc1120e3844328ceaf5f624618e87a51baa841c656d70dc59d04004e3aeb0035ec073c8581295c48afeb018ed086c85f47ab1fd2a6b904374ba79628c7d454a765b920c88e42f3a873a4760de05c53746e214bf822468ceb3a3929f5495ba66bc6b7a8afaaa933763d552376895803fe0749ff4e5cc3af41fc515af13794835773ae7fddef49a7ad332cf0527cfa47bf84d81b168e08b7ebcb3ba4fe49f310c316225a97ad6bbdbffa8155f74b0c3c9fbe99fd0562a558a9bbd55794e69f8e78a20a0dc9298814ef2ada454058a23e4818d7623ba529d0251fbddee248eb37175d7b44ead23e6ca20fd68ada775e8006a781c9470e407a22c18716b3cb98d04afb7c80ba34e14e33034d7dc1520fad9c73d28ba084bc4f48a9d07c07e8d4f85f8bd4b451bdf337466431e37512e1d706d6a07ad4d1510d33183073353643987d49baba573a8fc72de0d3356fc67b53f78f3d896f47192be049e14816ca04bef447bdda3caedfdf703ea446e1c77b5a5b2acf725dc5faf30925da1179474bc4a4fd58c49496162674e599556531ca53e69622a0c5cd9ef3f178fb30f8086952bdabbb4733aa5e9e45d5fb4d930874de894a951d332939f2a5f662befad984a076e7843da1c61d7c1769fb5224ee2862375c4bfce7bb5532bd622449bd39bd2074f9541ad318a6439b718bce5d8f4528f44f7ee88690332a9c33e5aacf615c551d287c7eb7da258b986fbdc330f21223e23562fc926d396234bad9cac9f6486a96dd09ba8124d7d14dbf8c326dd1b2b477490ed5eab4263d8db4cc7b7f45d438ce332c49838bb833449b264923a1c08ff66889301b8cd9b3114ff6f3222102bd976a1b9af08db4bf40f628639cf87ef9ca25116aa6189cbf456690be8784c6992994e9befb6b244842eef3f52c7f1d5734efdd48231159ebd4ebd34bd761700fc04b2807f05c5696cfc637cd97e9dff78efaa7305eef41aa56ba996c3d79cd7c312c48fbc2d99a17404e28fa091d5fb10ac582ed23cb9047fbd9062be9ee3560b9620da9792b5bc757e363a06baac81aeb28b9bc3da1f3da99d876e857f3860d112c1374458b537b10cfe00c8c278e3ccb8738a2414351d8d46d16eeb5bc24929c4099ab8d95c233353a96e28b9ec3bbb4b1910d312b44ba5919db71a9acfcd1b8f3b47b3951f9366b149fde3d729f682e2598186451830030e30a011f3a1551e371a0f5f22e37dd725a62867a8e67f0befaad0aee00b419507b1c667ceb3494a35776e3463dfa7eaecc1c1382efd355da3651c454ad1802d22ca56b9c440de5a24c070ef0f7c3150a23b7387c20470448a2574240a43175b6c6aeb149f77f4f0488263bbb983424eef5b7c4ccd1917bc7da9e2846db92cf6d4f5ccfdff2facc7c073d1666c6df9553bbdc5936dd8e17ce014947a5e3a21a2b32fd3d422b4cf96336cf3fc3df4112ad785ec0f49d684c5a3dd21346e69db040a0d82ab336fbb350c1a6a99fe18afa62dd638af60cf8b3f422c49e18395e325653bae4417d538a468b2d1efec0d9f5caf11707218c004b4442925749c7e736b9291c37c270eb9a4af2920162bfdaa9b239eb002545484b27467d187f218b8d120c883f84445143d8b731cfc1214c53c598c6cf9cdbbb3a02f1d65b8291d725d06c98cc84910923d9a4018a57265c522c86a40d09d8231d017c58e748b3307cfe0566c4cb01b0c00c929ff7984c90feab4be4fdee68131a2e602fb43a6d401344099f9a4d26994fd8895c5285ac054011722ea11d53870ccbc066b153b90b8c4173ed502cd1f84dbaae348314c7406e39bb2d20f1414bc9091b605c07599212f42af0c974120d019c536ba1f5d75726b72b28d4903d2496d29483b486aa9b2de6a4b9d4ae085a83a2f9ce82755d9208464a9c22b8ade6bd3cebf3a0cb633b70af268d792d357503f267febf40ede1f7ca8484b0a2f023705dd42672dd39ce1b82a27174c02e585fedd1499c93774481ebb513dc57c4345cfba44722ef7bd3ed21237b61324609372256a26060a2cefb8c37dad6fd227b6f889f816bee07326dd13282c8c83208b6b89b3a83d54427589bcf9984cb86244116d21f3426bbda99c911d54c4e2eef6049238dfec3e19f44ce3393c94945a491940815a9d25ed64a7b3b991a81987080d2acecfa8fc815161c6f0366a624093c93449e241c0648d9d48f34bd64c3f863b47b29624fe73114f9103aec8d226a3b45b56e366f2fb751e318d5378205606743c36dc21bbaa08334c1566ad8ba64708e8155f73c7a1b7498c8ed36245eed33f20dda1e1ce24cfa885a4379dd42922f301a42b23f6a8f12a0c647b445a35d1fd60bbcc093a2ddc2aeed73024ef9184711d1e83343541a8d148467cb3e69aa92a701000f743388b71e6fc06d22ce5388e03710ff3354a64d95d41b978e3ed061d51631572677f6a195f2d789d69113bae1655b161a82b598d3581caa9ee9d2e29945e760219ea4a10419b05360fb5f732bcc21d1e2c6d890501efd9889e6e78f12aedd3efd1663a7080ae6158afa21490cb12be1b10f0306233b0d4217f5152e0df0487b9b039c3c25eac230132c55c8af726f550d9dc6c176f30ada2f2d4c7ea422ca753e047e4471f5b349f080d414997bc1fc5fb6beba177b6fedf02d1498b0df161e23ee24434fcb81b3b7c545e7d8bcca3fcdd2b3c8d0ce7e83c1812218321182ae0e429d0094cee1a5417626e5fce3c26d71d56412301e5b34137ad39b74c0f1bd810484084c337296902981d8bc4fdd87b0474023ea4a58d693b8197d4e54fe994967bebe91c6425206f721b049dcf3ea9390aacdd403809b6a4f4f2153c34c03fa8d9ad0be2f873d5d93755b5f0b60281a7828225fe5e427d75ae364c3b7944bbfb904be16568853fb93d6f866f142e1ebf20982c81ffbfc90648e1fb1d9449395e13bf34fb4101accad474ba5388bc73a209129c9b67bcd19a66e66f89be6b981df6b9f34afbff70f0ffd7539e0be4a7884f72110d63e0b45914a4eb1dd6af453b07f7c49234c8104a49d27f5d29fd2a74f33cf13b6e757c865337e34ee3a8aaf3bfabb50572062c1885cda891039b4a024c5f6dc671cd29c07ac057d12d03569846670008b11489c68e3d278850d38f75eaf690c17402a141aa0ac35dac10f0e515968e730f3eac93d04ef8f845749d6dd08ca07e21c0e130a1d1977effd608f3e4778d297cf8d017ad64ef752098bfa3206821a25717a38de00229e41648c1659e18f464ab8382e029c634957918d075238dc126a31053748db028d8da6c46bf4a67a4926afce06dfe856d441ec8ed7b83ed6163f7b4c3136055bc65f9bfb395ab94b133dc94f6115419a20443b0e02573cca12f769a7e6602db0a98bfda8566493f0730262ffd9c3e29f5964f3282a0ff396c95edf43b4ee9470dfe0b529e91dcbbf933bbc580a99028d104e0d7d5664dbf06f57a1729cdd3ad51278906d74ae98868f8aa7d442c6220c189bd13993f889c139698edac8799e61db68bac89eba8ee00579dea4f90472bf2c47dba3a2701a54ff1ea979af7d851c1b35f0017ae0c9fc03a227a0553c5113919a3414b39426bb06d7b71d896e0300a51d69a497e0f693e3389cc37b070dd86cb9093a995a412e59e5828f3cd464f526a963bdaa9977431184eac711b44753dbccef70d752ccaf9c3fb41947a94c35cd5411df03b94289869411eae446c32663d56ec5600f59c6e7861791bb51b8c552c5ab6494352aa43003d182c0e9a52ff0f31e7a3c8208fbcde1b93810d30f0b597c14ea352835a3619991864bfcf93903a7f18bc89bad3f9f4b546adc1d0a020a507393d477f277574440d94651d515ed5e3b1671a050bb9a230a4fedbb0fc9429158c8780b90686696e9d91e9b49ce2b1ca16a67f2f8888c1ad740d0499d26a2af3e077e21348b7ea8eb4f03fb33dd06a248f93ea36a1747bccdfc45b7660262647f449fcad621f79acf35e5a289e2a1afe21213e3958768b988496c9b461ca56a064e8a37e391e4e87412a9e6b2c0bd8ea880d03e6592473b199bbe97c7cb371e646fbfffbb62a6452a0258f9180fe0ae57152d947a29a97c2724fcd243a899949a81285bda242bc8b7e8b9a9f878db0681d5ef04e6cc344662d523fa04ddb3ff1a76f4571e5ef2612607049fa4fc1ab6915669e6049582d3028cccf7aa053a3e8d75828fa7cbf7a032b9d04790dd19271c619c9f5655a033fda16bf076758da265e86a5acf0fa1cbd60800c746c636ef6d3f31f4144347f6487ec40e2bd8c2a6b3d938bf6ab350b3bfea27a296ec3bea14052d18fbf9177d06ec61a9bf247ab57daf7ab0dec2900c09614da22144580f2aa33afe530b705919eb5af3db6777e2de428422bdab0b96adcdec2d9579dd21f0868b9eb438edc69c2a6f4ad13c68e8bc2b46200fed3c0db27079f1917ad12c27d89f4fdbca64bce0d155476a1ac84e2a9c68a7be39c0c186268e49589c19a49403dedd7af6efc58f4dfd4d49bd98983cddde8d1d7a61ed46efbc29382280496a8900045de7372ac5f0dc226d3e5c1797c9a22b99fead30c9c9c1ca86e8ffa4c257fa88fd9f9b46cfa4260c501d05b0500243ae76a7e6424cc08ab57ad08946910103847d100d762e10aae14d1ff4264479e081395bc2bcb8b7787ad73120f5629a28f8281e63cce522bc7e2e6099f3b98a1c842e22c7a1e66933b689ac9c50cfcbf2d8f2093d1ba9cfc3340a29e715a27e1e9c294e1eeadf1f463969e926df4d50ab8e3cc59a06c4ede4b2a9028fbbe221203b595ac742ae2b7d91359c49ab39988d3dfddd0428267a884f2891644a252786eb703962d0600b041c233f6ae6ade28f5bde10d31c66d7e13bf4379d15b00f7252b26b216f44ba1262dea41b37b04b46ff4a04053b2f16d23636c45f494ee17ffd01258d556fd2eaf900c1d7be6f390ce3ffa86a883258f0413f6319d382cf794be8d847f80a9d166a5cd71d954326dc9edbbd105d9f5b0603c811f5ba35d937d7c9899eb238f474defcf08224d803a1af43ec6dcf002611703113710a68e58ce26631a7445207c7e87dc150af025b4fe53e5d46ad98d585e036e82a27fc7c0abd067d6e962893e2a4bf565431375abc3df7fd62fa35ad28044076a2bca7efeff93abd401acbf1e4663b27cbf10167f8205369a2941afd1fbd6b747d74d5e8ffe855a3efa3a346c78fce1a7d1f1d35fa7df4d6e83299797b4cadf8ad525b71c00db630332a5c3c843fbf9ca42959391026153b799296fef4eb9db1bbbecbb1d9142894964418fed539ee089f27a9841b2d22c43ce14794ac074a4781a1c41d504a54af5f367575fe4f89b7382efce635032e8147680fdaef168b1f4513087b4d48400f5ec95e3f48603906a96efb608e374dbef69db5cbf1dae0ad00fb801d02132c537952c7f068479134d8f2804fe64cea9d57ab6e708da759eb3aa28702cd8df69604208d8c34cf97e4a19a11ebce7ae401937eb151d19ea2c320c37e3626430ec4b788203a87a61512578880bee8296dc934569bebe72ef6773e491b91d84497d8ac0e02dcf801465f2dc7803b133271ce2c1020272fb1cb1e9fc75286a41bb56d939c5e5814f7701e4017f9038a4d1d25de66ea445ea5f8d540a1d4357b08ea7a2d8597c07d4728d2051bd144de4549ee408a8fa9c5c4879570468757d3aaad604062514371483a48c4f3ab0ec649d1c8bed386461e48cfad96a531aedd46701985964a37cf2346589adfeadb6126056fbc3bf951436e800d399af7270d45886aff3e70080d05361b4574158f51e90fcbff04a922e31ee2994d716064d51c859078f250bac2b70cb79a936fc011ad7bd359ca5e2829e93085dbe32173a984ee4dc4231d3af71e46d3ef234727e49de22d98fe0f912d5af0c8b0f6c31eb29c993c50464a4b9dd287945852aeabf73e1aee7da4275dedd0d2965eec542d6b6d5933f53a2454a66f57f7ad38a55df2162eb0177056bd2de8d7e8c466de0acfcd40172c2cc6ebb756a110e6d489f4d6a829f56455c7204a2fcc943e457908b7658ef1ec38b8834befef10d93e9ede47c78cc4c722c803581562a17ccb7e4b1b133a8a16001c771a3da77961840d4c0ba70c009dd5529b42791c0c5d583acb0bc3855618d583d8424021cc39ab4a4b78b0c17c11e3febc6375569886ce9aad8cf7c6233acc871be9e29fcdeca79e41ce2f09824fef13ddaaf659cc36fc7ee190985156b85cda4fc7273d321db0f3df8095aa4b7fd0c46323d92d54ae69ac71ac30295f80144f2287a67051b842194426ad82b80790a34cb2ebd253411bb16e514457f1f9d81540911beec49760811240d855929204ba6e82bfff12813cf918dcbc40cca0596b39290622a61c06efc288ce1c5e873b73c82cc1493deb10e716f3b5ae981cb4041c33e61358cd4dbcdd5041948ddd1a30c1bf7bf09c25c3c3cf779445e47574298dfb8bebe18a3abc3a38917c6fcd6da25775bc2a7034119ba5702fae8e4b690bd9a832e3575ae19ca0ac08a02d6dff6ce77562d4c00b3ae5dbfdbe22d817aac4d9a413619fc7afbd5f50520088adc851084135faecb99ba468d81c0b122557efafd08edd1074b78d6433dc4c381558c35bbfcde82efa4b91108c4562041396b856a1e3a8c313977b2d95c5d014c7ed9d3746bc39ceb838c53279ff0202e7fe315a9b20602e701054eb1e2a57889ed87698e7ca86e9bd65d2ae1a042248b6bbcc868cfcb671424108d7645b6114b842cb29aa94c284ef9e75d9ffcadd038fa93f554b973939f3b66ad7fe8fb680083d20c899e13168ff17c10b2219a3656bca2965cac5c79b42a4d054defab0dc3db91f85458c7ec53e7c14ce38a2d6ff0e88f024f4dd9fb817944aef58871dadf76d1b47db06eb7f6f8d473bad310b57a67d9996fb30b060ccaaed0a054ba70a808c2e9e7274e6506b47cf24d50553d4e4e5c1e4243a4d7fd860bdf524c062f3a36409efb13411ac47468fdb5d4930dd25b94ffd3e79b221d3a366457f8462583caed0cf47dbf0877d66bc64c88bff067939b856e2bd7971831733b623a45c163611428d2c18a1d57c6dac886fe0ea9ccbe4508af51f4cbf8999de6bbf10b16eeb258f3861309988dcbd38738ce68caac16c490129d3d1e13842c44ab69004f6fcf804a970074a5690805a954722cfcf2ff17d4919cddd20cac7cd6b6d067512cb69a558209615fe48de363e79ce1962c3535150e7f3e2a9b91dcc2d0fad2aed96d62e2d6bde73ce65d63758d8ff0bee939b67a6b872565648cccd421e0ce1a0c9c1e18211fbcd39eb85050d4a9c8d27ea8bd6ac217cd4f36962e365c83acb8671c0cb060264d208de43a9f898d655930ec90c400ac77cb1092f42ed989df704894db0a385041f0c4fe7761b0534a990db9138fcbf6b63f036433fdefa67bb12fde19238716ee464f342fb9101d22b3223123fa59fc241012b7062629b9c1024858b8b4b677489c8e523c9c354386d64b785879465f208dd7b410857e304076469b4647040d7547bfd2b922065a4010a6baece49063612e00b28bd78893220edba50f5b0a9167b7d818d597680f12bc0aa2808106ea294c9fecff83c6390ff2195752cb532704bc363f11c4cdeb234c85a3f6ab9a3e56e180152376800582f2a0178131b03d0cb534cda57f6cafafe1741a7f4d44004a63fbbe3ea2e540172abee6e43f2ed34d4858dd6a58eec0f241889f501d66d7ee06eb3ca1b3301d4992a71e4f0810a21006fc88e4debf6f403e7d79209486891de8221a0bad1b2b0d2d1148a6e730a96945727841a4bc36242213ae042b1cd4b44e33032b15d0b6ccd1ceed74a2aad8acbb4022fc67565ca918ac4b3ad9f5fd483116687df0bf4346c12e72c6311beb5510687e386551d7b6f32c0741f1a60d2c12e1abdda8f65380f38310fba8105815858c069a9e3c00baf2bbab79ca31318698a0a072a504c4fe3c19614a61746c3638a9532b81e79770bde4ebcdc048e3b043d0e5920d619710ec593efe925097c0d2ffab81f5ed8147d5c4b312eb66c9dbe1dbc258e3cd48dcbde070ca88968af49463436beecaedcfb6890e86a1e1299350cd3a2bd54de70fba04cfa8a3cd2c40b5be5291bdffdf6d3d2929d02c90e5c0e5f0d611592244ddf8fa6ef0bab9876a50fd40249b2a03c81db3858643a82290b93134c431ff8c9e0fcdebd05ac2a9c08f118472b9316262ade6a3cb5306d717e54a850da44211315d0c67402f7293370f022831654396d254bacc2891006bc93f7a3d704d80ed6244c8267724219b2666cf8bcef6fe4e0a1441243976e4789b4f290e424f01302e931cca0e85c9d1e6506559ca4772a5dbad1748d4f60a450da5227083ae81ac168519e6ca2ce441275a3f95541c6134229fe9a31540594202bb62855204a01972045dd67a65c3ad7ee744171e95cbb9f02b966e1a8f0c1f0039fc08260411fb882eda0e44047f4d96ca69cb61d9e2e252edd0e86b078c24927d2b52381aa89d17b200ca311f805c15022729a0f06120c0a1a5911d4a4b4894e46a08cd009540e503940e500d5d7c4f84d38e104145070e0f446cf7b7177437a27d2bdf0631941d46732c350243f91d403044f121ccbd168249144f1244ba39c9177e32855034ad390d3801b2805e1f41e02a54d1c3abd2f3de9fc6ebc1f7d2212c81728e4f8409224714ae2f4e20e94219f873b8b45a27e7097294f22ca3c99313cc677100441f14f26cb9f4ea7d3897c6739bdb81a45a1f3749ec8d1389248f3b4225f14021d3439481a8942a08db804f926f24be493c81fa1c813193e698a431fcb7bd22ce2893a7f8d5633c6ef45b18a510ba4f64e15139e8a890f049d3809c3501445711cc7715431315231a162820a1515133b480e108b3e191f0b0aa54d86adf4d7e8fc5e94f2d5782f62717eef4138c51d62b80ab35082efa9aa28bf178b9e40c23cb1dbc2952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57aec4f0a7130f516533228b33346da2a37a942ff690a5288a1f9aa68d3cadfc6409224de1bf083f5593faf04d5b8c27f978f11f7ee852922f3eb91a49f25d08ff45cb8725d9c3bbc212b2908ffaf241d264f93174f1e2b7ac6c4664e183e54333a6fcf0c9175731e59f5e8c294d1ee49ffef4e4b7fc6965332207d8b2b29d7e44a2de85a9837ad2ec417d69f6b8f0e6bb90e382e931cc0d9e2f5e7cd2b4b9d860981b3c532ffe0b736543e20c4f273224cb90e54f4fa6c2177decdfe0b943308ca20cdf460ac937995e343da9b28941674bcb9193e5c36f29cb2fcdf245e874f1e54a7c9615aae5595ed583e55b4c9b1874b2984e668fe949936923c390243f1457b61771c5f2e207f97867cb8f4e24694416a78b776186e58a453cbdb862f9965559aebe9365654b7da7d38a245f1f31220b182d9461c862b2ad629016ca131974a2502b136ee8956244162508328184249c5e10c8041290200af900d4c1087410850e98e820498ad41e69c25449c1545145a1450eb448a5c21065a250abd487e50e982a6518a6727004982a3baac05441a23a800a892a012a04883be49b3e092ffc3e92e795a1e7851efef83d4253d499a2cef33e2ba015d04a6825b4125a11ad8856442ba295d1ca6865b4325a19ad8cac8cac8cac8cac8cac8cac90ac90ac90ac90ac90ac90ac90ac882b182be5f7a01553f83d48e691f34389664c0ee9c5ef413245d18c217de963c43f72964c4d32799845bc2b1e0a0bdf19825800cf300cb1109ea1288a5810cf701cc771248d46a3d1080b3d4667088385f27bb0a8880a152c943139a4537c9269eb39c70fcd1e2f9ce30b67680b856ca510ac80832a670da74791020b82ed4c408629982b8061288aa2388ee3381a8d4623982b141551a1e239f19cc05ca1f4dec1f07bf1c39c0f7cd11cc53004c36f44e5fbbcf3f3d2ca260a91a755cbb37c1265cc0f2dcff23b2da667f99dd2f4a927bd30fc441238963dfc3cfd08c5839f2796f1737ce29f7250a616a5c9b495fe7bd0f439c0d514754e03824b9ce023111e317d6011a80879e117c28284848484604c603b5893236451f4b1442a4254caef45d109511443972bfc52188e46a169db6168da742e252e9dcb14c593d3e4c4b433059d224c14445d1474a24ec95723928444299042422318123202a984d22612913a1d11a92322420259c3e4ab199f209d7c3524f9847c424a01dbc19ac0765b54219154d98244c204a22a445748c1624a108a48245f8dcd8331424984053181a80ad11552b0981284222410115d21058b2941288235813d41eaaa1091415588ae98b205a9239510913a581322212121225813528884427a0ca2f8c4c86379d4bf94e5114c26938904934539447262129dc024a1ec29bd48fe90a90a131493155fcd68bae2ab19c929538240d2b9969826293ed6938f25647a62928234097d3523cf24f4d5981e7c9823785f72b96096508ede4f9be8e449124a8ff4354f4429be9af06b865c4b5c4ca2cc408ad3e4c444f4d5d84c4f4427519ce08b51806f32459981ee04df243a310db9c4772d31df7b969583323b5499366df39cb896988a4e0b181fc60865cfe8c5731cfd389ab0a0138c510cc7119ce37b5ee98808db8dfe4153476c1224ae4ade6834f2480fdbc1983481058d56be22498fca29da4c54ced10b45936422721a5d39bea9824109be1133fcf0c522e0293a21696134428de368348e469ee789cfc2a2e3adc6f1b4428d3ccf1bb94be75222be6b277a63381a892971742da162248abf4a4139bd4da4e2b48d3ad209fe5723e3c8298a4e3e1669e5fd875229a0b491866c21151e69c85f309c2c59f88bf4e09f562a1894ae84d3fbd2ca24b41a6d6210688a4f3ed60c9228c5c71a721af0534424d3d0098a4f4023a628bef8e3388ea3189ebe9308cad1b56b6971e95c4b5cbbf247abd2b41d712d71e95c4a5c3bd712d0e6858b31f5245315a50c8542d71292032e5d0c548ea082a292a222524d71ed5456a8ae5061a182e25a0245797a1514e17baaa4a245e7d9480e9c317648622862f1dee672821874bb33fc17ab1944a04c8822df5652010315a70955507467f8aa5d19836d86141b99e40c9f8432634a0c4b2451c2e48928aa8002c5b5732d0972f2446828062aa72bfed5c8e08af34f8f4284e4fc3eef88b7e3238d9e942a5b5c8c745cb494a9d07b1889d424e8ab21bd970304513b587eb46221ed20396c0763e2e7f8b020d2cac56f0592a313e91bb1c450f1cc182aa00d5904ca844f2ac9a2182ab619a71de3f89e0c52cebfe284393d8a14a193f44e3046287b482f9e3290841f53e5ab2199b62332745fcd687e66f8315a7c35e31632921c89a1a2ba40797ad5054a1b197486ef2d3b8ff48d5a865c3c5904dac480f24216d94e3a17a60c4f9c26fcd28cd2b4bd942c31a0d8626471868f5a7d15a709bf650786333ed3f6e22dbbf7ccdd19c6b40c9de1ab969464158f85337c530c9533fcd2ca260307cef0c92a3e9215e415671806e10cb128026dbe9bf049d2889903f411ac8959043cc52130f4c2d00b5f0629e50fca108542a1c211850a4b8f4a892d61880a6151b4b848a550df92fa9622a08bb025d5821ad946214bea5342b026b026b026b026425ab8c1114eaf89d3a3d8404a99427d2a954aa13e95427daa4ca546a58b494a3ca11ee5e2532b5b79c488972acbd4e70053a85ff5b0bc9f5eaa259542bd8bd4bb28cb54e9c2856973ed6c5cb43c09b481f12de6a84cc170f12f5cb4a04661c992fa54cae572b9c2d4375ac2eefc40100453224a7c946b490a8572e950ef5282723d913ab19c4e27265e11900595fa94694bb1b43c4bea53a66d873653743a9d4aa7732d712d712d712dd98d3210458a932837d062044110641147a228fe778205c182604d3c1aa6379d4e26ef64f24e26ef64f2728027d3b39c4e27d3b39c9ec5f491e49f3e9693c9627a950a0623f03b3d6a75fa1ed604d604d604d644141a4f701a4197cea5c4a564340ac3914e67235974fb4492247932575187429dc894c9dce1c8b5e4a524ed4070044720088e8e1819c1763026235814a5d108c604f6c468341a6b50e5bce1f42835b0c20650463610b2810e7582b12295489369da8e8c46b0262f659195dd49ba762490e4da995cbb2f4ba4493e482299369ba216f324ea4e16963255dae1393a9548731575e7c8147ea904be6b896b896b896987fa4626a6a2f0830579e589f499e0277e1f2ca8040b3ac1b7e2c4e1f42857ec6a30821a28394910f5fd16e70ca747b9028bef3dd409c6c712856ca328ab286432a960508ecc152c81b026b026a0a9052827f824eac3f0c51188e18b5584fee308232261412769228da328e31b4718938f7cef7b91f49d327e149fbc40718ee3bb8fe32843868ff0657c8ecf5b913b463fae44a118305c941f8a8728f49936128b67da5ece50143a62e483ed604c425814678fc9657c1f8cf49e843df1c990016ba20a6364c498b6ef246141e758862e4218618cf0c525623e344193d783693463c813cbbf3c0c6c0763e2c1c21fc31016040b2265bc6924b9e0f202e65b48e3d763fc9e4fe7748e5fee60dec1977790e5148e604432727ce1f862cc0af5aa15f9de8f56a48759bdac563bd8ee6389a622520cd34672316198b6f285d962ce38c193a813a1c09a88a3e89936ef4cfd87ea319a8a409bd2f6320324752952e8ec09cd50c74b9931a3275fdc81362c50067c12092c4da6ed8575ce008774a30a0625f93da3cee9249f0582ee51c072e8041fd6c483915f7ad8eeab81059da4711c4758138f86e8a2f25ca0c2d0793a5d3c942b909c02383d0a0d88ce2834088a32032a5168f0c4b53b6138111283be1ad38f2f3e213a11a3109fc0f851dc8da655e94def8dc42540d4112348b8742e920bb5ea3991522b6f7c14e9515fcab5c4837d3ff6a0fee49d50efda9de37b9e39fef7bdcd1b3def337b507f1ac7d11123a411c9f5c4691b7d8fc439ae50e1397ad3bb94b8989c23926bc90845229936d7ee1cfdfe48a4279146e19340128964bead072d7f325da8f756b61fcd9893b8c438ea783f9a9ef42e251e6c3c3fd7ceb53b4d5f2a8d66cff89f6924bd0b13e9c5ca411724d3e6a1486f4b3941228de39b4e504e12b5f2d3881a51abf11c3f979293f423aa8737fee94de10ac6bb4b676ae214c5275f4df930a49c303521bee795de666393c5f979a812ea6d2ef0cbd1a6e81ccd916d87a6f73cd37bdff824af0729274e517cd70ec313f5a9b7d94c394fa60a06e5fa30766833e51c9d422a4e140b4a674b5139c5772df16027d345be4bf7d5b86b779ac6d2388ee3f8ee5ae2d11899309cb07c2e5b50892203178a10a50651763036218a08ce284351525025065288c11651a208a209145801054a6085139ec0208a132f49c4400a5b4449e2841fbc341183229c012e4669b839dfda1a2eb66334b8fce6b7480c37dadc1d062f471fdcfdf47224dd7de4e518ba4cf66cab6a37fb7ce6c16ebbf56f36bbee8bbef67999ec5915d7501a56e75b32f969d8351ef546c3d750b5f6c37abd62d6cd9b555f6717af684eff1b301405271228829b7dda5846551f37bf6806cab11b0a94b219a75f8d6bddf4f6eaeca66b5bd3d9aded1c46731adba8ea6e9dddd84f6cc56faafaa829abc680f02d86bba140b1bc718a7bb5db9aa9eb0d05a2a169a4abface68bc5e371428b6f3ba625c4cbfeb7b7bd1edb638dcab69f20dbbb4d72bdfd4cdbe6e6885bbbfdbd25c1ef5f62dfb493c5184cde65b0e03c19ac5ee4ee671710de7337d3eb87bcccbb006df9847f5c1f95db1cfcb32dbfe903d7eb67d990c0b87dd1ff67dbdd856dd381dd9a7795d31eacd6cf824bed9b7455f071ccfe635b669798da56b0b4ad1c4c320462cb64e5f071d5e86c5e6b585ba7a010aa8f134b435ebd74187df351e35d75a9927cd46b83b115e7e395cbbad9cb62c8d9cdd3da3a1d956dd685ed716a55133cbb499eb869c830d3538a439e01b6cb801b501e334b5b1a10646b10dd70d3619871c6c6c70d140b77e5d1a04d8c9c139819c387fe38152f55f695e554cd39864c3c54bafc8b7bae2f4cb3696c5f0d29b7177175e7a23705fb14f7bcbaebba3dcc50c7838eeee79e9ddb8bb0b5e7adadd6178e9c5dc7500ca29abba59b3aa765b697ba381661f99d72aebd9bcfe8dcfb34fd7b7ade99771f792fb97bafb8b975ea8ddd6bed13e775bd7cdcfe24f33ebbe3bbbcfb6eac69bcdb7bce26eea6f15bbfb7958756f7c735bdae36f7477195e3a90bbb778e94cdcfda75d696ef6693fb75514e330aadd169a7d623fd8a581ba9a06daae2ba69173b13b53577717c1d0ddbf1d92ec800424e85172018a143226908111204258c10eed06392ce1b4ee60ad926043ca8b1f52cb4a90137eac4b4451b261ca58a0869417304cb4409cd611c30e365d121820e960e48329a4434182e474702404dda7d325d185a612aa19f4881f9a3d901e7edff75f0886611886a1e7793dde87ef9945482336ef077064fcd088cff7e2065ffcf1738022281a19c091933432c3558f6816317296cc9e51fcd0046ddf7ba3550f290c41100cc1300c43107c0fd5430af4de450e90fe3df8ad8a80a2e780ee0e7dbe1f5f0c57455ece9ecfdce039be9f9e59c4080fde497acf2c62e41c993de338ae7afc9de47d2a20553220b98a48f5821b24d0867cd4eac6bb411d81c4f72413c9f7deca6f4ea72f8d4ce19bbe709524fcd37bab234aef7d25d4e7f86e4eab23a595123bdc806f5a25d17937e02bb1c34d183eea77c0d3932bbf215728d49bc8d77937a624a724a747bdb73ac2f49ee9bd3f82fcefc6b42a63783894b367646e20f7fd686e2007fe0e24d4ca6f747f637ad22a09ea95f81bd37b281309f8de7b6692239000df64220193e8fe06f5206a08f051ab2390009f349180fffdb003fef799563aefc6f4a595cebb293db94aa2c40e37a6d77937e493a707513b627e081ff543807f7ad22a494988233728f3883fc2f44790374a4c5164071594b2885f3947b36703b9ef37900b3ffcef77c0f75e4401f99eb40212bea380800f7ee30948126863c40812df838f84f7e11b99c24812dddf88afc4df4cb1537af19120bde9dd34a2c4df88a61124c63799babf01bf64224132757f83c4e8bd6882ef8fc4e8b1a48a06e5e729e12991443745911dce1ef0fdf45e89d09ca2c80e27f89e2704b923613b18130f1db6833581058956ac442820d1c7aaa208a54d2c3a3def4529a08d28e40d4d71f05b89558c80dc8155f001d1942a4ef15dbad2bb4aa5cf358ea68be4ae25ae5dc9fb46a3197eac50842142f9bde7e2106823ea3e197f7f27d94c016dbcf7cf4df13d91c9a7e405308a5c8aa03047230d94de098e454d4626424e240a7945218ca21324858aa0307d66aae849692b8988c620a2f34b11c144d484071727a46cd838738ce24824892511481453365419b07103a81c7995d1abf828c528340a11b1983677028954962f4e64e38638924621cf89370a8542a3d1c370143abfa20b7c65161b286d2dbba2f3fb184123c9f4eea40d0f3c9c4c93e94424d3144ddb8c7337c56bd99145668c20a721edce6f864422914827265419505d809402ca784f8e50401b7f4fc87b4f04a4f740cf8928e5fb183e9637f4bd6d8412830a0a55938fa4620a9a22c5940950618a9294b77b520986f7a2e5bf07e2e26d2ea52c49b6f205c9858b8be822ba88a6cbea7481d256ee4aa1d557eebe9a6f7531d38f05bead8ce2049f9c2058ee764ebe1aa1afc6dd3b59a0fcfef4b17860c5b8c3c53ced482ec62a942d6f2351016dbc1b710bd1c51457b0a08f2516199da4161f0b24ab7c2cd0411692ca69e7f223959332fc582d302f24e999503b484f7a65e9c244edf06ca417abf2e5492a3b5c9e44edf844f1133ff17b406923a98c289dd1dbd62760560eca88397c2cf0012595afe67bf04f48442daa9c929c74a75d38fa703147d23df15f1e2686f702f32fbf03f32f2f0f03f330a61198727706f9eb036d604ea7f7142af5a817987f7189c225c8e50917275f8d0b0f8e50c080e2afefc72ae5eeab6979f04b265f8dcb835f06954f3801c5099254aa9ca0f830a219f3c3cbc3fccecbc39846a610df08ccbfeca8fee55f4c232faf125d3e284e03926f23a994bb55c9a40c7ae263811ecc2ae6fb9755cc0f9fb903f3aadf89f9978ff9971fc1ac5e563018b5b4c45889efa8161717179795edfbd1bb188f9c9f8b21a049e463816215a7011f663522712a6550b9fb58e0c350a1fc769f597e2cef5fde4682795b79960ec6ac542d2defc2e55dfc8bd508b5e3c593a0a983d1a214bf65347a171797158c7781e1e2472e3e07f8c2454b8b49b289ba14cb124ec8d50e460b56710828038eccd0bf2f64113fc7378ab61391cfe59ba1f3afc6bff792387dea93403dcb115390fe88d3a77e443dcb8fa9df397dcadc413d8be9a0cc48faf083a1a240693b914c1b8c16a5e9bf27917e0cbfb43a729246e18f21ea145e81f4186c314517d82bee638531a0c490124328f4cf466513f3fe65cceaf4c9a860f8e7322546cbd0c8e6555a865a865a865a865a86c829315ca6b84c7109824b914b162e4e70a1e2520574a2185b0c141e41a587dae1f67072caca46f29ce6f39ce61b5735a1ef93c5b02206d119a6e38e92346da4ea635e3c55ccab7e27e655aa8f9111f332c40f060c17de069e2eef31de259cf130c458f1d5d8bc28662826068a8b5715b50cc5108a3182184331aa7099428433ac327ecc1fb9f94633e607d5c7fc8eea638ccc7895b9a3fa988f318dc0f02af3c8cd68da6ca6802edee632e5c5dbbc4a0ca1182358c518fa58e19b5631aaf85821e8014932e3617852558121aa7fe187c4bc8c23a6d881e165fc1133cc98f15f78d5bff047c060c680e60f2fbcea634673e7055315b3f3312fc32c7da9745a8defa8130882ff7d0965f2d3842ac9c0d4236356244881b2e549217f0d8136311f8e761ec3057024c9101ca176a074305a94e3dbc627a7115558fef4e0eac8f9b1944ee494927f2c3623ce4fb54abd0b2b1b78c6306de212239795500c215be962655311e10cbf654d8dba8fb51a93ac46241f928f1526d19dc065c26fa209279c80e2fb4c2741f8de8804b409c393ee54458c211433e4aff1c12fb90d39059409ff1b9f9053584c1b899c827a316d33a69c603463862050dabc0a901124baaf060cc7074fe00a0614362f523d51aa3ee66db58f15fe8e59c50c8132e1ab560ecac44039435591d334296de494337c5b0ca1337c72ca57f305a1e8abc9c2095f0d15b20a487adb679aa4f7cf43d22a74f7bc90651ccdd3993a4825a628c6f742d805397150f5812e56e28ef40fb50385ea61fa317437912f7ea7c57450e685c9f23b2e4c7107cab084236a07ca2ce25d81d1a2fc5e7c6f6533a2cae9b178a70f57474e2f757a9695cd86e83c917fea118a42e290284485f2fb91549260bc58792551772a8b4a554aa11594e49f4add57a3a4dc954c524248be1a12797af2774e4f927f1a9d1e651eb91981abd17b93694b519112729a9269237724123209a923957c2c128914720a68e3de67821f89447a1be9d9bc0757a277e4043f07482239bf2f854a9f7805e931d89ccaf93991cd894a9b13799e4a022a274a6f159ebe111565481a99313f944a0eca94764a6f7a9369a4641eb911df513b5442303ed6a762f222834969fb21351e7ce0018807c1c1308667e5707ea215be1316dc5f48409b274a62dc348d4ce16f84f425d3a6f4260f7c710525e94b2c55401bbff93e9584c589894a498b52952db0e0391999361628ceef6d21169c38cd579eb6129512959216a52a1f6955a6c20b90e27bde970241300cc3501445511cc7711cc7a222d514aa297a80017e8f517cf07b88a038c281ca032a0fa83ca0f280ca032a0fa83ca0f280ca032a0fa83cf0810f48d101107cc03f18aa27ca51351a8b9c064c71e0ccc25fe183485e2ce104c1d4d088c47c9185d380424327e8815e28c569c0771d082509a4c760533939bd2755aa099cceef4d432928a621d39069c834447a982aa08da80365bcdfed82825442244c0cca1e2f9c2c59c0a05c024c0925b584d3834105cae9c138711acf0483cae9d94c4361a948e5243441100c4240852015064451850121c076b01d2c88247d7c10fcc071e5d27d2c974e14ff1bb94471248aa24b145dae9d8f28102a91c8d02c4924d1d349a556df8736535c4b50b6d2b39c4e27a934a552a66d872a52494a99a994e8240af18993169b29e1f726d28f503b5c4b3c1adf9756e589441aad3cf3e4a474ed3cd43803d247b44515a70da7479181121e8c60148e503ae4e9792b0fa5138aa2777a1f493a392a875cfdc9c4f2dedb5691c5b47923aa07d38942edf04428a2151f4b24f2ff3efcbe3442ed083d4f6581121624456c020b8a9ca2070c2692741ad0945a893b506674823f7aeff34893df40019348f57013163485d236a36886bf1c5c8d270c15c41109ee372ad50aca10c957634a62d27d354a4a4ffcf5fd690b118998e4e67bf0fb4c26d3b4ed901c57a537adc8ff50a6adc481d213a7119d9c27d326ea482b3149690cb2a7c171e301d0ca698b66213bb2c6352059e31a0ec7ce0d3407a15115d76ebcb10ebc719a51b665b59b6faf665b546f36aba84aa3bd9a96836817bb3b5eaf1d1c36de1b680e0228a7ec0d381461c30d0fb3f112e1de82f266c75dbbad1a2d1c5a37d0b43456a5c92b4635fe8d81e8bc5e3502b881871b3a24c7c68be34472e6e04510e161d51cc63d11445a32b21b3a2465b310d9cbe64d6b592c76f3cfeb9c79e460420e262d8d6b3dbccc41c30e58b8bbdeea2dd7b6caaa676bab9f66b765dbda8f7e35aef1f07287ecf27287191c41c091c48b20f233337b7db59aae6f8b4307070d1da6b46c2cf7e02d7b1e56edc13bc53a94e0062f75488283e82043a76cbee1831b49bcb5ae18ad6d15dfb8e1de826d016603181254ddf8d6ee17b369aeedc07080b1bc865ee90c504e6752f58920d292c904f999348725cbeebb7d70edd997f6c264eb8a71648fd9d7a7bdb1d89505d7065c408a2082e2ff99d225c38613dc8b203253d3b8f64410c16177b3f8a6e21515626304368868fd6a5cbbf36e6f7bebfc16c96e16a2b45163e3e44510f97c6bd1fde21f5abba3b4b981cd90bb1741646646e39fd346dbc05043e4adfdb69fbaedcfacb8377dac6ef567581e56c5f80705d4d4bc0822335fd6b888f152005710c00504e0837b114466d816f77e9a379a67edfeacd916f73358e736158068c3cb1c6a9043922288ccb83f239359b79db17eab7a873d81f0128723b8bb9b5537bf457048000e46709041073724e0061b6a04a108229faa3f43049156cbf3b9758667ad8b7badb2d9c7cd9bc5ac9b7d5a9ef7f1ad34e7d699aa75abdfd6cd3c2c4e65f6dbe69bbadbfd29ce2eab956637df729a5bf5dbaa3ed9c53d8a57dce7cfb59d661f35a3d9cd7a47590303357c6abc1741e475e47ccecd6f919f218248cb07ce10f76dbfdd6dfb69d6f8077f8a6b676943161965b39b69364069d980d32fcea538bb2bfead9636d868e91eb45df76b5cd3c14b1a54d8b7a5e18dd36f713abb6e8b7e3eddfd8697349eb8d9875565b219bca401e42d37ef55a5f9e0258d775b9a4a53379b53f5d9d14b1aa39690bbd3dacfe19f6fd9199c5df67d8d7f3ed7765aba968d968c0f9c21a9ce2e0e486df1b432ab86973455dc4c735b1a9bf3ecb30faee5587cfbb6dda191d2da6cd640bca4016ab16daad59fcfc9ac2b663dfbd3fe6e5937b33f343958f5e6e69dd3cf333d83bbfbf072260b77d73594c534e50c13cf2e4eb6333364c6dddd4ca3bd3314e3f4d3daef41f1fa58e370cdcd4058f565785875bfaddba6dfee566ea9accfafd66a9bdd5cdba9e189bb9bf5fbebaa6efdd9c579f669de2dcb62b4076d57f6fd5cdba90189a76cd6ea6bf56ba8c1dd5b3be7dbef9675db8dd5ada62ac6a5eece0da016078ed70b87ce09798d7fe7068e1b3870c8b06edcd0213774881037e0f06e9d531c3ee038d37c03a8bdd1322f5849d8b97b2baf33ac7958757d312da7b31cbec99ea625c3feb46c0ffbe2328ae2cd6634bbbf757b7b1f38435834ac85b0543fbc9ce18a9656330fcbe24f59dcee1e7dce20c40cab7206173240f196feadf3c6b11b0a247b9a564e9f8755f3ecb54a6bdd947d6fb7765ddb0db4a39481e6ee3a5ecae04200b65006000aee1ec4cb003cd1caaeaa73aa7de00cc933d545f5ecd59f5bf34fbbbf6d83f0b0b886b22ee6c9eeebf7733435f3b0edfa2d8b3e76d5b7480ee2ee3878190096184410430562e001004f00801100b0cbc14b001071f796fab4f669c8b756d300635b75e735b7a61affe468d82d4b8356d797a6fffcd78e1d9d1fad9ce21bdbb66c0fde37fcb7f7a602e15bae6dadf3fa5a65dbfc7aab331910bec9da1faddcba6275bb18e7b69f5bf3ce6b8abe8c47df643fcfc3aa5bd52d2ea7afd57ff66cfd4c9a67568cbf346fb87b8f972b1c94ab28563ee8f072456ae5b08fcfa1b9b6f1b3b907ef75c5336966dfb7b63f4d559fd6c569f575ceb4d6765b5c5ef38ebbffe0e5cbf033665ce1ee2c5ece58c18c22ca193adc7de6250c45804189bba35ec220f3c210ca177a50be7080f2051977dff152c60e4a193b286508b9bb102f6514e1adac710d755f9c0f9c213339163f4dfd99a7c9bbbd6597a6a573a6fd2d6fb5ddac4ad3ca9996d3169b5f34ad1b7048734ed9b3f8ddcc661e5afbe7bf643917aba84acb6c9ec99ea6c5aa3144f66efb33321999568bf5339bcd2e06c2ba6188ecf30c5571b9fdebaa0af12dbd81b28e7fc9b6cea9ec695a3e7086a42cfec16e4a6b7118f5f12f592b7b9a568f56dddf38cf3e876febaafe7cfbb9b6d3ac55b7bdd1da976df5a6aeb11caef1bc2d9bbfdd8f7b7f4676cb5b8dc572a6c99ed6bedb6e34fbbc4ccb728a5355ffe7cca3e50367c8a32a4ddda98b7fdc96c6aa5be7f4f1d3da47f1b33c6a76b34fab578cb6abdef9d6ea77336d5d314eaab641b8795d314e101e55bf403986dd176357eb188a672d8d5563381de351756eababba81d0714387e0dcd02140807660f73db1fb9e5988db6ebcae2d0e4ead69b7adedf7d41965f18a6f5a1a9b83bbe1adf34ddd0172cb5be784b83b7697b917c0dd8b088288bb133184bb136088bb7b262f616e780c1a7077ef85973032cc541d5a2918e1014c7077f0c9053800e4450a886cdcdddbc10144e8ec96a04015eeee2da00933645cf18607dcfdf361c70e4858c00c0bb882bb832e0d9002850804559103771f2500812a1e16af2de47077ef085568c2c8161130828dbb8713908d9ca8d1c0360477f7b098dd0003220c282204778fcdde5a4ce7720f6cab6a9d857c58b8fb0e2f5f9eb8ef36c53d6b8ba399bd359acc93aaee8c86a6a1b1ebee4204e14e6b5b77b7abfe1c5eb38bb3fbbb6571429cf026bce1a18d9046b872f70178e9c210aaae1a4c82e371188dfd64d613807b3cdc5d082f5daab8bb0daebb43f6ec5e5f9d83d070f7168dbbcf3871f71adc9d0667b90c5ec690c2dd0310c389c7400280bb9befee33bc8c41a48c01c4fd85930d2d1b6ab46ad0a0d9675df14dd3c0e1061b6876cd5297eb861a14cd35686e2dda9abdb5adf2e4dcad559eec7acecadd7970f1f11c7bbd6e28509ad3166577e848550c24671e2dad71ea4631eea6e668ea8abbe1fcf3fb9dfd8c4cd67e9a359e3deef6ce1effce3cb94d675a21df7a194eddedfe56aff87556571c0ebf9bd55cd3efe79fcf28abeaddfe78994cf630991a1ee666d547ce3c9e86afe173a6c5d856d5acd7e171ea8eedbcc26470ea66a12b46633afcefbcba2d8fa741e3b3dbb23ceaccd6af2b93c9bef5b9b67958357d5794553f37fb19199cbabf65bfb6d51fd61ba16a9adceae255bdb1af4bb3d9d6a5bd6cc537f745578ce2f5e5c92e9bd916a7eec7eb6bf537aee13d6bbfdd2fcb99165b31abd2649f6b7bc5a97b7d6fafd597c9de5575dbcebedd6fe2d4fd2b7eb7abfa989ff78bbbb5e8b7fbb56cc519a7235357dc56d7f7f639d3fefc299e9b7dfe76ffc6ddf2de7806f7af07eeae7a3952c1dddd73bc2c81dc5ba8aa59d5dd40b9d9e7d9b318dd2c565deca359156fb6c559578c930a61776c360bf181bba143f00dbe5955cc43eb8ca2af9096f6813384559f87556fad4bfb34bf56ffdd5cdbb926c4b77276699fd7195e55ec837f036516bfceebec6dd36ff57a7e4b264bdd16cdeebbd927bf9edd5e56267bacfa7c9a597ccbe5dafe55ddecfb387cd36a0e6ffd3af3a4efecff81f0edd39ce68c026554bd613697eab57537dba22faad9f35b6cf651791e3fab6e36ebcfb36f55fc835fab9f5df5f3ebeed7eaaf6d3b637954fdb9adbaadeae2686a3c6aedf1a76cd699cd1aa3cfaa9f661f37ebecbe56bf75b3110fcb6cfb1b3fabf2e4d9eb15dfdc967db7a5b5f42d6ff5058083000450f32caeed77f3c6d9e5f996fd9fd6e5799d6fafd6f8b310df92e9c85ed6a323c3fabd7d76731b77d37963547d36d7f6cfacf82d923fbbf87546d59455bffdd939dfda6ffb5be3756b57a5a52cfe9916cdb3a7b5efe6d46d9f559f866dd9cfb59d6ff5a0ed3aa391e66017037937e33eb3ede7d9e756b67d16a3bff3c63cd9e5e1c139dfd26b66595c431f880f9c213356d5efc65bc8a76c16d2eeb02a8feaeadcd02129be01ca299ba393e29badde541fdceca32384bbb7bc2487b87f6ef669d62f467f06f7ed7e1eee2ee3fe81a074077d727010a7720779c0b8833b4c53dcfd5f3e7086d000f18133e4795855eb8cb62e10770f80fb374499e6220f4b734dbfb8dffab5bdc63f9fff27b38f1f96dbb85bfe3cfb3d038b51777fc11d3c428d9726186ff1b02a0ed7bae9e7d6cde655d5df7a56fdcc83b5ceb7cf46a8fad5e347ce8f20a710da6da5af57eaeed8cbd2107e83cfb7fb738a5d1edccbc3aaee9b7ec6e5f6f3a834b6c5c96f7e7ff8bc6af6e6b63437e39ecdb59f4ff346330e28b32f0edfd29ce68dd7ecba79b36f8b93baf887fd6975a4794710696681e091aa2bf66173dcbde6258901b959a95432a5796ff5969f88cfb59d52a964da6cf6d9e1ee372f492ca552c9d4d26a6d3fad2d954a26191a9a466f36fb641a1a6d531a56c5371aadda6a69b44d69d07869dcde355611ba866e8cd36a4ac4dfdaad5f9c52a964da715bd7dd01e429778fc7dd63f0729cc2bd258b6df475b7665b54f6edfe34a729fe3d03abf1cfc6b5fd9ac5f9f6b975c5af7e5fabb59d5fb1ea7faeed947d5bdae71b66bffdf18ac57ee8e40809b22388d88e1e67109d1d21b1d88b86060d1bd46636b35183468d1bb00d3638a039a438e090830d1bb20d4dded8dd7af66a1a7abf6d0f9a6b288dadf2d0687902ecfafab039679a73b63fd2bcdb1fad772878a62a4e05d1dd572fa988029b7b503c63d51a8a6f3479e3ad69e8eca36ef5a6ba387717bda4420654387107c06ffcff93591e56c52f980115a20b75a0a5b77a5371722cf6d1b63b78f6ea1c6e4ddb9b87e00330dcbd09081c0002a07fe9ac6ef59970252e0110c4e0be81320d765f0c8292fb6ab5e2ac1f0779cf5769b19d75cab6b3580edd59e3d866f366d558103de0b08f9cdd9d1b9a298af02f36ff4b8a17c4345e571cd33816ab6df5e7860ec1f13337dc96c7ba629c15e3bc5ea6546d8378bd5eaf588ccd69aad6622a0ec770faf5a2ad59e378bd70a0ea3a7b81e07067bbf37ac5f01a3f76dff306765f8c43e6676ec0e165b9ad0de7b4c5c9b31cf6b159fcb3559b9bd39c1f3d6efbb3339b6f981dc0ce3c2edef986d9585edfb4bda5acda13735b56bdc5f2c62e1a63d55b4b63736ee81037f7e0c0b1ae1867e71e54dd5bb7b7d8c6b11810bee99c691a08df54b5878ccbed988fca93aab16c84aa6340f876438170b0ad9a7303cd41e0e073e3860e79bd6ef061555cc3b9bd6c2c162b724b2fb06b5d60887beb7df6bc800d505069a150ecf0a750b8ed0cd340f1e284c8dd719f57b5f6f3a71320272faeb73a536bad8bb30014f7d7d56dcd02bbf6870580b8b7d2dcaab63f2c50a30245cebeeeb75bfdd1eaf3b878fd59bbce70afae0006dc0875c7c53f3820d216c51beba8408a025128f0000a14a1c08a029e9e49cf8d53f7133578e2a7256b6b3fb2cfcd6672a6cdc84e207c4bd976f6440e32ac57571e2f27208209ec4ca0746fe5f04fcbba9927cdbff1d9caeecbc3a3d6340fabb2eceb6a55ef96657d4e550964e1de9abd04641278c109226fc9340eabfa90a99fb2ed671f9cd7acc389d60956d014f79696c9bedd6c7b934371f2ec6566acec836b3298d5d2b158cab6b3548d05e1dcdd838004d9e0aed520f79d733a723e0259b83b101120f29d080865f5e666201140e25e8b80ccf3c6a99ab2187dfcbb652360e3ceaeaf0f9bf32cd640fc64b6c90d9a3071f7d4cb2636c8b69a6fb716cdeee7f06d63f44db30b011a40800a77cf5e42c00777999b6bdb7d69b8d64d370d33c9019328dc7dbf2d8d561026350fa8c1038cb87b4bb6f6e0dbd7785afbe7b7d896a77571efe6ad31cdcd3fedfa67ab86629c7ec0cb033e77a779e98027dc65edfe746d774a6b1d4043d9840d9a48e2de92e5d6ada2ea8a03ca9fe6f0ade599611fad7c7b35bee558bcc3c2147642bbd88eb4f31ab082062cd1000234c086cebf642d7c933dcde7d61b3aa485c3b77fc9644ff3d2addc83b7ec69f412202c59c192b58537d621cbaefa9359d9d304c1b55b7ffea7b54b6a60800f5a321cd96b8d717a86191f3843b49034ebd76d5d37e7f09a836c1cdb6cd6386a1af350d3b8c68021ad99aa3f080fcf9e0cb0c1806700beb92d4dc9939612243dedfbc019a22487bb2b61b92b29bd856f1640c5dd5b29be5900912fc000ee9e379034e7f542b3cfeb956e1dc3e9589af51be361d5342755634c486162d76222877b2b65f11255f4123adf5942085fe2c57fe08d75a438f390e25ce361b7ad1b8b6d36bb1817cb46a83ae6d3e26240f8a663d2f2813344574497c35b9d7bebdd6cbeb53e5eaf9d9f9655c00e0aa0a1440f945880124128c123092b24d18224d6248468b5643beb989bd794c5b5cf31b6957deec1fbf502225575c89ed6b2be06dbaa3232991a33d9ce42581d19eb659bcd6eaeb139b2b455dd0ce4f6de5456f521cbcd7e56cb1ad77046a88faa2cc6e5bc9b7169ee697d5835dfd4cdc3aa3cac5ad3988775c53849d836df5a9d442809123f9300717f7992905af64c8090bbfba6a9e99f0990c1de3601a5b772f827f7331affb43f1020c55b08d8fdb4ebcf0e026cb8ab5a0701246f6999ecb637d6e7588ce3e5018666bf6760b7fa309dd5032039000f3f99768097d6c61b23a1e22db7fd1b769094606b75ddc181e3f5dac191e620a104244e80c46a2407463060a40823260344c1005418c088017230c01bb104239818812357254745ce488e059403201800f900d5f073e5a7053fabbb7e1abe865777a6a9ebebade2cf6fde78bfb7af212384a75d593a32d66f37d7501767fd3917b32a9b571aa03dc410329975c55fc30b61e9c864b219b755653d3a59ab3f6eae6d9d6fc96ac8b2faf8f58c2c966559bfdfeeb7cdb140e45b2b44ab39bfae1965ddf635cab639df92b9ed46310faddf15f733aa2c6b7c23fb57cbadf1344f6b314dfdad558c7d86f091e153be507873f052f166e0f57903b0798081724b60f3ec1c3d05dd03ad007d83f65c29dc3d655f5a0ef233453c113ff34af1bf843c4dabc6bf7468e43c4d2bb33ab45686cf2b6e71ad8b9b910901c23e64381c465b2f1352dbedec6766b4c63897866d81789a564de35a4de35a6cc5acdfb2a761312a7b9a16dbe6d893866d7f868755d78cb218c755b9a5224c281245119f223b4560e060802bb2ae18e7f5bb02799accb63ffe75a3e369703e65f1105fc30fc1d269edf55db18ffa16c9afd56f6d8c535d8c6b6b3f2fe3665656dd36e6e6dafebcf2b0aa7e4c83d37cbbe5b82d8e1308fbf8991b680ee246afd807470fdaae373736abb6b87c5377d85cfbc9d9a5dd5a97a663ed6e8364dafdb63ced8bbbb7b46e5777bfac8e1dbfdfd98f6e6b3fec94964cda6ed607b1449c7d718382cbedbc6256e5d1625b34bfc63f426e402d19b7557d702dcfb47abb0169dbaccf9b7b4b46e39fb56875e22bce6df5e5e53ac457d60f8d9e2a4e935ddc8dbbd7e0650f140d847de834df30fba30789e7f54d730dd53e7ff60071576b41f4c8d0c67e329bb34b8bfd64b6adfdac6d3b7bbd7670ecdca0e9e0de9eb6f5419d81ca01d555636a56d49aa8f5e0d182a7083c58f0e878501e9216039a046841d05c72917beb76a3e35b36e7b6b77c7b56d5799a7f16fff4b8edcfc76429fbae78eb57879b797854770789fd6436c6b6afd74ffec1eafcafab4acbb357d3df4ff3dfca6d15e8f13bcbe19f15c7588cc6644ff3ff0ad27a1f88cdad69c6394fd3ca427ebf38567533ae9d5931aa6ed5457fb7acde6cbebd3c2ed6f1342db795c966667065a9fa1651d72c4546e2ad1d1d9d2038ad8cce1e03913f9d426a8474d74adbdace3700acb75d6bb5feb559fc936fea0e80cbd5cab59e2264447cae95a815540ad4083486190e66069809990160f602bb00f7e0173215c88c00e0bfb5b5abea19dcacdf1467f7b77e07f0df92c9afbb598fcbb9e7f366b18bdf198df3fa1bef9c4cd62ba6b134aee9947d69bfaeb275c5319cd7b6a569d1549c8ab65ae8ce3fa367b49b732ccecd302ebbb8b7cdcda83d8fb73b2323cbafbb65d9475d710c97738f8cf53af7c4f23ac3b1c7e86665a99894d802623b14a04a01b0f0966cb7ad2b7badcac832cab63f583fb36275b3796b1528ffb4abfb93d3525d5cebe270f86564392bdeed8e2caf78b7ebaab6d29c5d1e325c80240a7043015845eca095c3ab9b7d5a354d3116f2342dd47d5bbd713332d96b8c817604d16cab71767bd0d60754ab37361bd1bab458ceb49c5d9a9b7382a46a1142b8e3d0405eaf9d1b40ed4d4ce39a1a2f9a83006a6fd615a3447c202200222f108941c411bc25c3d238f67ab53436e7f5daf91a64d947ddd84775732ac4d3b4646e747c66759ea6a5539cdda769c9d460e93c4d4b67227820821cc20943040d9183005120001402f4d87849801cbc1593cd5e1d4b339eb9a1060d406435621acb681a36b7e2709a6dd5df2cfef9f4df3697036a5d9cec37fab6399a1cfb6a36bf6dee6939df6add726c9bbe59e33ecd39181285bbf7e0e510020c61792bb6db3648ecf34cabb95cdb5bb32a7e215a217258554c43f16c5ddbb5adfddcda8d832822002f83b8b167605b2dcb3deaca0201441340e058c20e057678c8e1e50e49480d840009a121880e826c20884e86f3eb9ae25bbbe29f91e5d4d08d6f64b9b671af8b59fc33edceb7b6bebda8aba2ac8a2383c3d2e1a1f1cdebf57ac9302e377badd5da0eeb7958956dddd72a2da72583374ef1ceb76755562ccdb27f6d167ffeddb2b2a76901e51ceba3456b678f83d8706fddd4d7336cf55bfd33d9475db3fe5cee214899cb3d417e28d291f3ed8f1fa0b41ea7d6f40f3aadaa68ebe26f7f0059029016005102880c880c9d2c74a0d0a9b9cf3cadd5fba75dd7b325d3b9dcf32306e58f0afc407fbc7c14c1870a7ca83e5cf8a0021f18e003112e7333fba393cb3dc8fe95aa9fcb3d2f9db7ea0a31d3f134b21999cee51e3650fe21fb19194d27cd09e2f5da91fd4ba7380799e9789a569a81541a4ba76a2c977b5e2f9dcb3dbc5e3bb89c9edfd2199763d597c9d4c0799a564de3ad3fb76e34bbaa8c9bd7b575f166bd9ba6f8f50cac8a6b3a72b0daa27996856c34d36879cfe06a562ef7bc0eb2e29cdb6e9cb2f8b6e3b6ae9b5b1a9ba3c3cd299b75fa7aedd434e6e1f5daa9695c23f21e9c78c6e170ed599d1e90e0f0cfd9c31077f435fe397b60b9bb9f3d905eb2013cc91a6717cde94fbbae034832801cf967e7199a71fa860790f384c77d716ca6615bf6c6cb9c1e605ee694eede0ac26ddd1647f63cacbaae185577b4368add0d9477f09207226fdd5a94866dd95445d557480e352f8efcae38885cee21a72d8a23977bc8e59e920720ee5bbde51e56e80145d903891e3670daf4f7dbf638390f09f0f08107c9dd5bd87d51d4cd29fbbecee59ed9abdfddb641dccf423c0d34d040430b48a56517a7b78bb7cee59ec7ebaaf65084c3cb1d4cdc7138d75ecfb0d97c635b57f561f3e7d6d92d6b7dceb2109907e376cc76f0e02e93a9d1ea71f12dbbb907fb7077d24b1d3fd021850e02e8d0d1b143a903061d2d385070368e0de70777a771e301b0ae2fedb19add2dc4b7726ef649d9dcca3c6a2a934173daa2accf5b757f6a3c4d4b26fba89a7dadfeeb856af5f67ab56a0ca765afd715a3ac97c90861e9c8fe55e369623beb188b51d9d380644264b29cb6686df3b0797d198eece7653242be86c761e904a76da8144faea74d4f3aa568460001000063130020301c128b064432a15490c3d0e30314000783b25a78509b08e32c08620a19a308210300220000001049c20400d9e9a42895a86d337f5a41d6a43b8c64caec4987fdc0d452c45570227eaadb371722c2bedeb4135736c4feab66d5f34525551218d6eed6478efce9c98fc7ab8fffa6324fdb57bd7367c3de1126f75178eae9a36a980bb60e63f2d6802a9f2823c65487b8664b4f8ee7a0dc88a14af2ffb880209bbfffa13e42ddf2d609975aa1ec75f19aecb17e3edce83287d6de7b1490111419f15d56fbfa8405cbd4e3e082c440587c2450361328278d6c7b5b4c1dcaedaf641c07b06d28c9a12a88cf066fe0818d46be6eccc4b36146028b145e79b9041b96226955c798b20e3814c5303192fc5903a9186f155f2f59ad9d4910f367a2b767fdeb26e32276bc99a0c114722be212b4e748ddfe28e38f22a98773988a36df09dcff69fb23800a9a85f22f484a8392898d2b8bfe6e70401bf08785a1a6fa50bcfc28110f43c022c3909dab627ebd18cc5dc4490f40a675f1daa73e304c91b31ed1c38f13b0dcbe639715e5bd27e127a1bb34869a35a26bd54f00ad7203b0c230adf1affdd07a8c98e64a8dfe68616a9e52b4d305dbd76b082e705d663b968ea53bbdc041b0501ca2d1afd82516c976c5f146e9a5866135a68f5c0d0478ec5694271754a01fc5c623d30159d1ac49d803ad375991d22783660b9de62a1ab8247cacb8b519224a272cc73b8c099092a388aaf87731b4ba6af3107eef298cdecbfc8110017d33df388c58f1cd20e0e963d31f89e93fc4516481d0f34795477041cfff534e96a6cc77ff74ad8b1401d2e2951073008e61b4f03f422b5e3076aca0cec7e94add0bc4c3b3ee2e698c721b6dcf621936a438756c00236c2069cbc3b8bb8330a6eb64cbe056cbfe87f29ab4ef45915f38ca8b630d1fa1bef84a47f141bb7686cee0666fffe49df7e01fbe1b26d25449dda9e6623299a406d77e0872087b029c03ac3fc882d0f8a7f4c741876242e22c7b9fb6fd493e0305fd0a4ae7f43a46de745f32037c3a2e88c2df36268b7015771b1df2bd2467602bbd8bb1b371557aa95270dc5aa14a98a5ff22623af3ed6c412ee93d7dd136f3f43e0383502c2505a9ac13d6167668e302ee6306d3f800d6f24e4f1ed93ea44f3a6dc135d3285d68fae3ea893bbd31f3a6e9b5878e1dbb09e0568adf08d2d2c2ae395b512256b40e56e5d0aefc3a324d35106abe38cbe55b81ec667d88de5542e0e7fb55fc3da48ef072d645ecb58819bdeb2ea7c6d1a6d17afcdf61cf46ceb2f99406df5db8acfa592749a6225cfb49cad436bdd06335bf78a5538c1014d0b827b74822349fba0438ddcb0d8a34b14e9664d6da6b103b1deb35ef1c54906f03c623fba2c6c974f54039804692ff8457a57bbd46bcc8f5995fb0ca260f75fc19846b2eaace17fd727ab99e89406c63dd2e293861e2a1c01a4264bc266a66b48e40c7806e675a52fb666e57de634e721f046661eba6d2668fe99f3df01dfaaeb3d5d1aef506d3a3b1b0b7bba698331f618c7996c20606bd7cf13a677642a42fa72803c90c3204c83ad20ec608a88040bdc48377a3732d7ef7c454eae6a6d2c76f3e25a0d4edd44f3971f4c9e0a3ab581d74a6d58a2cbef14d2380fed09c0c92d38727f0a35af2ede738820b98cd743b44aa39b86a1584d637ba8048a74e6fd5843ba5a46d867171a6ef437f5d6f7a4fb84d08888f9181f5d97455ff84e89e69e23d7b0f425156dc91479f29fea51d3accb3dcccd6c8ea592db23f2860eeba6612ce39a55732a7cb27488f20e6a99d62f9151001515da404dbc45b6cd3b46fd85e4ddf24db5cdcf89e1a9746db35fa7f9379c82cf766c1a78fe485454fd7c99cce7b3926e3a7846a279024dcb4dba8933153784980c1a6210e38611553b36ddb6585c8b5bc7e554cf6e7d37ede42305636208cd3a82fe876b828b36368993e59a522176a4a97d104fadc920e4683035cdf6910f25e6e7dd608a628482b3d5339efb947260a1e9e75673030dc8de461bee41729a5987946c4a458351c4a85073ec3e4c2d78295136a18570f89051d3246f025734f6e53927fe44565edf4ff8783583dce0451918b64111e643c6d50ce32992321993248da0b8f6f6e82fa37a9272316627cbbdd6768c318f724cfae772b61ce077b7430fe29749b2b48ad40cc47b613991d4290310f20f1efc0fc1b8a38eb10416d98e3cacc423e8003e5aed8bfc438360326710f5e3ffd294870e9f4680607644046b3b7361edb1e9bbe00d26168e0a423191986c7048e07b1a6d10c390254f6b8e33cf9cfca2746982e5523458e1cb308bfe0d09ff7a2ba0589d6ca8e754e02ec14a15d1f8e2d5eff1c1f1ec3be1d1f9131d41e1b582dc50ff79d721b2b62053100ee621a57c44ce5e4a2825dce908198315c389d815789c66a84fef7c6c24dda39dbb011a36b78be7f9f092aa4311f94941ab85a009961cca9bac01c7c0d13216e356083db14bf04f1cb106720df82ea4b7ef09d84bb11b3ffbd142f388e8f718654d79ed23049610c1d3f17f917bd4f3f2c33bb9e5c567bfb7402f02366d229f9d20ff5855faebf72d7053cef8576958149e1d4105f9bd6d77ab62b8f533afb0aa6e1736a6aada7e470a11710045355126c10d1b6865264602e6f04054c1ea2ec2892038972b88ad2e68b12440349a75923178ecc31d884ec9f20cbc6f140c69431728ca9c42b7d3f13bf7024021951a375f5b57f48c851af62dd0b66462a5b61cf0ebb8c1dc44e0b378eba5a90e5965580665f83b83400e4591e5d0a464bdb672f6188fe8193aabff2ae5beff8ae091c244f9b3320be4f303a902d15ee53cca2915e50e733fcdfe7c74d5f18126649fbff61b274aade3731a0c8cfc5f449a85d1e74f341e16ee2d7a289924f6915acae02392c659c5353249e9b94ab147c35f8d19a9fcbf4ccf4176e47f2ab9fa37459ac81d81f29d0080faf8ccee983eeae1b8abeaeb3cf2ee1859c7d1037619fc4ef95ccbfd963067917eb6563da1c8200a5e012d92a0c2a78e4717bead9cda1c434c06e0e603daf0d30e8784c9cd2b1ce4ac14c72729e00b512e902e910494ac7f54a5ba0f9d2e50c000a5ece98534eee5db161045a8fbee6e0bcd2cb8b381d4a79541d02a7bb6b1af11bcaddc1643fe6879a53ca5f117ea977b5d049818c070ce739fe162e77e175b7296d9fd27ed8b6e170832bfc106888634847f1969d7c0a0e388c7b56f9a22f0f64475517a0dfab12519483efb113c4e8be78b5b8b0d671adc685bedac5b606ba24e879ff0f0d6e45638cbd8f07fb204ddacbf1a896cf0644c5af38517209ed04f6a30f699cff352ea838178dd443f04fdd1e57b0c7768db65fbc8f87174290b88704138c91f325590a0e619bf4063c6b8a662660060b4ed4fbd22afcad301f04626e9fe5f81698bd6e65ffbae1593bbe40e7b0f8e86da0300d01f1d7022c27efef87cf41de675f8ad88bf2320a1656b8beb04137cfc98f2c3e80dc2b02c5f09316ee2a23cb1c44a2428757e8ee979ef19c9eb985bd62c5e633adcf85219fca78db2c41ae945ac4125c818ac5e494c1c78992b129471ce6ec2b7529ce35c749e6c68484900e99ae27f65df823c95905d72bb51cf1509d5fce3bb875ba043d3210afd3a9deb077d12f1d55d79d596cd7553334c0215049d2615d8add592f4a5736918f65b6b4f13b8bdbb39da76c169740e39f49a27bde4340253d9288fa6a7a05fd1abb041961384c761fa3f287b6a591ea95a4eaadcf516dd85bffd4e0cadd69d5e1d1571e62a95f3fdbb79a3d6b9972e15ce8a68d76bbdcefef840d7682d1114e6a70dfc507f8b785974b3bf89fd1fc0cb02f6af4d67d79ac367d388aa66279004c1f222d43efb323ba6e88d237f3f7e63ea347eac5f99c24c46ac690131848de30f6b6a6e44d02dab81a1f9a8ad006944b51fc485f32f4bf93f62a197b745959810239580032011ebf7ad58b68a49be9dfcbcf01b83257575293d31ee5abab115bdb2c970a9ff32d0c95a1a5d359eb25c5aed617f0122896c18695ab2ce03af7972b56a7aa10d004636656e9e41c3a03fb839fffe2101f88f7294b775d9f7880958ec81d94a55bd019b1e1037729d369d5e54c021275c170b0fe97015c6a09c4127a218f90f7181bafd77e2de48f9145cf9a92ebb3e22dfa7e979d69b15a7d758a46bc0f40fd0b989b32f20303af19e64da5ddf4300316bd982e4280247ac383ec1b055e64f67d80b393ec73cc4dbd392f45165c599c8c3be6c77c908a5f59bd2d5e5b12a7ee021d90a0cf4aec0aa63633c27763666aa61ce4e0725374e699174cf688e836c8277d17db69d9b25b9386b408361bdb53eccb242545b987031e4d165b21f131c048ff047ae427f05c028d7df102886b05195a646c9e21237847c8d1377f8a8608627946146b474fa2b7d91db0c72c830d370b03eccdadaa7e3ce4b384649cf256d117dc4418a65fb91ce8e3e5a434c12278537d114f6094b95656abdca0967793fbaa24e3d0c175bbc097c32ad31c8b9166e0ae9d95876921364d4de0cb1034daa69add013e650d1f93407bbaade5637dac52278850b5a09a256dba037135432a260456d97b7ce361aea857e6b3e983ff2a2e6fc62160d9ad83c71ab8a8b94c298cfae9e6c90024d86c985e6f3c2fb7eb5282978e92f0a3829c1a39f74b17daab311b756302f8267d44bed325441c826451baa920d08c24d8844afcd2506222e56c9820edc6beb6b6965bc816363ea78c45d1ac21aa272360fefabf53a06944bde8e7065b690bafa01c718f9dad8cb06a6a31290a5d1f1d4a8637577c15fa61f0ed1bedbf98ff41fb3a8a7f2bc63b023c15c14eeebc77b16899e50c851f66f34150edbef36a775f08da3f0cba5e50587ad923840fa879136beb8ef00e3e05812424eda7c18cf93310400ec1d9f25d65aa0244a901aca2917c567674ad69796a4fdd5ca7495a7fc225cb823d1420a456bb3ec8705014319a3a5a6fd36cd93c6f2e9bbb128c2e0bd99dc731a37a2ee2e57a80dc1867fa4ae46ece2f9759e1da3fba19499176b5e849a5aab67fe82b0a679777189e6841d09aaa6b4db530bc7219b053ac88a567f0059ea9e37985ec0972f039ca35014fd70a73e5b179072368560f8f553d6ccc8c52cb55061324cd591817b338283f131e4d2f5873931878b40a9d917c4b7f5c9ad7361632e27e726f37e397497b4d9b6203240bb8acefc890e9bed00374b5ee49ac0f3d55fcf3bfd0f5277f40e17bfc9be5a13900b92f30e80745095bb5c0273a1c7b705a6386fc7aef7bb69ef72df6e1c22d8280bd4791be6d98eb219a638e2b8d8b784354f6153ace317e873e113f595a24db1970837e42e851ed25ab1a2aaf2aec1505d8a755f3c8c18fe931b54ae03d0b32e159264d09fb831eb58b1ec13054565e278009cab7bac51bf3d85cd653b21e7bf462d1fbecea211e513a39bb4ce19fabdf6f51a863051bff0aaa60990583b23f4c452817b1849049554b62281b96fe4515d2b6a078c4a2737148f212f0e810a1755b17e34a21159935e8689ecfcd37ef79a7c86218cba05e9ff814bdde0fcedf798139d908ed5322e37c5336eef197b014577c589674e4e295746b96b988bd24da9c16f20221f916e1d83482fc0e1521f236d02b791f3d0f7f8a192930e65171292f028128e91f947ae828d6d7a70c2f07fb2dbfe7eee6363415f96d9a6e1f713f5ca72711fa061ba5df221cfd6706761d0cd1308c2f15ed0b80454fa2fc90d940e322c7c710dbb1fd0b0b2a94a0d3cee637e0b86032660256aca9298462af3ad0f28292b63401ec19bf7e0b8180ab330ed4716486c8a70d4c05cf9ee5a5e9d6a31d7cf4f74a96ec83de1ce1031c76d6a2d19d53cb324b6031996985f3111e0c5db92bd061d09c9c9e3a707f4d55ca8b766683f27068ae8d0786f366bcd55ff7c8d901cae11b70e0f8721d66a580df6be739d951f5bda05e4ff17859de2e74c0a48fdcaf12f69fc3c23d38e8cd636b76e49fb7e2ba41bd236c4f9017931917027e68c5ef88e973db3b4a711e4e5983de3946b2e1f1f9d150b773e0ba682dd8bc1ca8dc8101c7558dbc1b7f5f8ea7bfbd72711fcdc8d7bbdc16856fac334c41e3b6bdde7be625555ce5d45072edadbc4dd151f177680bf355917c92ca035a80ab1b17d1e02a00132c30c29703478d60160add36c8d4890ed40fcb256a915e530e0c11dd372a06396ce98b591537b0dc884c2a5bd2a4bfe3f91fd609eaf51612144283f38e5ad8a61ecd81932d298ffe153a9b0ba786b7ac506a34bf69616a32633ac0605c574f70292ef227031a2f1c2caf95762cb9a327b17326f3267dd0f521f5a4882922150f4484e4810a60dd970719d46c66e30a27c73a6f9a0cc17844c8213b2d2cefc094b5ef753645bdd24130fee850b8084019d249053804b0a36f9087f6f34a93d670595dccecb6db9d45f2852cdbdeafca88eadbb7cc5e8d9ecb646ad6f3e4f326be977c868a3c516b6efb21ebe0d612e5fb92e4eab27108c610ae55968b4fba63a22f3dfcb71925011dea76eb101e00ab4dd4bf743e35046d72e5bec49790cf2ffede7ae1f3c5346e8e2bd3827ca172c0cb9084d10efe081fcffcf00e301e8cffa7bf7d4d172a92cf41ea7e9f475abd9e85293e95b45ff7992b6b76409892742d26aaeea08700c821f2e1f98097a05543b1371e9061993cb75364a638e7a7410c7b0269f340e48cd2853925bc2bd13ca0a2556c52d1136a8e6658b8c3cc2e3acbcaa91cbe60d7cd218573a82ae072666f0b5e94b485e073dbd5a9804dabb1485d38a2e7af1e1cd6fd832e096de2009ba4de697ac35d6f4ab6b387f0bf56b54fc91a26944d5c5c80511249daac2388085c46811295e7049a1ce4867e39570c7eef9c53386621771bab8665dd51a512863873fa4d904063e7adc8c6c6b8d286c5b549c066eccb5dfc7cafbd3cbe02f2ae433f574e8468c22954ac635f97d2db417f4731ecaddbcc62f84e8b424f19c806641028c84473c2e5c38455bdcb46fff4c26db1c1bbe1064e776e4818b99ffcefa3b4b78cf7c7028d12e21e2589c03a2a34cfdb4ab2a28c8b05b4827e0064f2978b97f2fa76e84b226fa2795626f444e73b6a24c18d7378fe3cdef915160e7d650734b41f70edc132eb0de844832d6ab2e2a3c041dc364f90dea829b360b55486e66d8a7dc02bf743a2f1d82f0e8512a24168d00945f011097cbc62c30224e2f755123848a43f9aeccf0c5bc108b4adca3588007aa430fcafe4734e41a6048b9355ec154e47b00825de303422e727be3dd43a21b0be7b82743c1864eeb65c0cefc53631e25d0cf3286ad8cae05ec0d0afe588e700920bff7456ae22c3598065b99535fd0273bc2dd11e87c87ea33f88f9de077ffb6dc4925dddfa5c406543914ff67cc7e7a7da7dec4f3dbcfc91344b1246f7b5a43c80b8bf79e652c9f7552bff8fc12aa56df8d8a533bbf80717803ecbcb1ea988f27a4eb4f146ac200b04a38e86dff8d7648327aa1aef02d36ba58d7a9738a275ed0cc1b3e6b295d202e664ef29f39820b438475ce68586c6624e88f2884d4b2c3e77c348a9d10c6c189393ce6774334b510518e51f4270b2cadc2aed2d76fe7dbab0770f54adacb1d65ae6a3afb0ec4768ca0a2e9f446f3185f549b5f70970a8fe5a1de2cb008f5d372db39cf108bf7aada4abba6b66d26ced2081416a155cc08524c70fc4cf2b8906e3d8fdc6b1869bb92284f7b98814fc9dc5463edb2c2d2a77abb3f1e2af39e9835cf97def6fd871b53dd770ef75f348d2124c4957d4b23cb4b35865301015bf681cf99919fe3f0ea6941e5fa158f9da2a6faefcce9f563ee227e8b31ef5edc9fc1e8da564930d6b02495c17c3e7b8826cfe71cb7302ae83fe23d6b66f9d708d531d77b1595754702dd4f86af06f55786dbbabcf83f74ec9bb5f56e9e40d291a6f0d33318426234fd7817946d8dcc884f48a39502a0edefdd35c41b81c385b6c0be4fd7505197fa18e14b21c9cfaff74c82afc84900fbe21d65dfc04bed6fc42a3dc0ec67921952cecca01aca3f9e32b6f0448dfd5059452a5c7011d8e8c65b9247e537c305fe83e8c95de1006a9dec5e3c70548e0cd1ffa5921321ae4a108a9c594cbdcb90df4e2852baa83b00b5015c5f6a10e30f92accf511d896a12d76649d0f9545624a204dce1de4183b18879477e43309c69f29deb3bfe42dc6c09780890472faf83e595d58566443b679602ba8d061839d5dc086967bf28b93e1351d0f681ad2eb6dfc879327e945162d35d5ec33829509e163bd26a4cc529d849d137a3e692207e02ca42631a00d84ad7b981687252ddebba9eaca148df397b91e37ffec930b0e6c43e6a407ceefb40bafca3d80c2f595c927c23621d5a762702d519e88158e81f2538a89a7110e2b1b489deb2b6d82d0f558245a7619e80de47303f06f2e235414f62e260aaf7033390be4e8c5e8352c8c8716d75974660d7338c26e450edbf3f1d07794027687b5e131798564966d996bd9c7da95a01cf91c9887451708ce22126df72785eea47643689dad02c2aa5caa83455e67de6031558e311a1ffe4f330c820b91f921b12bcde8cfac0e4330f2c01b459cb7b530437896a0303266b45c49f1fdbabea0858b0c228a05754244a5bbc9c9e296789b72c8127461bb89c43b3d7bf06b07e09703686e1eea53deef9f94f9431f13dee73cc3c1084d41a7301afbed1294beb7a80695e72e4c01fd43ee4cd430f3a0c3c31c42ebbe1d8e7b74489e8f16c7b9bf48afe0b0579aabd149defde684193623c5c0232347081c48b9baa3f2f1e5c490a712bb0a7371bc1ebc9b89108cfa863aa3a4e9905e7447a413238c3bcdd0717d4dbb577ca5bc446a1163f9a3b5b5cfdb6ebb8a6b7269af03cc8ee6ca8f5c24c37e9d0e543d843f79df8e13422a6272f16e9a05f778d672a9ba66784f6ebe74264d4d97a0a0dc091e3bcddf96a28699af17d9251552b0565aed5e0bed10171404584fe37478f82b4b6c7eb53346af83fb3a6802ec10a153f63a89c39c37567b40bda5807677c76d411a1629031dc76e1fc0a3f060e5ed8adf70486766a246a7e3db4f252978d56e70bac5210639d223925acd7e1d52e5ae996e0e746b478047a3782efcf439838fc6c84d847d3106c4a7801f544f51d1aaaac9158b4bc54d09707d90a57caaa6d6e0f2b70000bc179e1ec550dffa34ee5bb83b3238ee680ae339907b059a18d73a7883e4ca9d44fbba6f725bd154ab8beda6a20d08a70d8470df97c1d195720b7437a7a1c62b7691bf31d5c0a85d2832a26758192011b26336f95b26025d4fd2e4e3f38c48fbd2c0029bbe4fa6598ae5dd295e7c84c08614395b1a10213bc608810fa2db5de7d0704e38eef1a413bf366b94563e83ef63247412bbe8962f3a69bf8c6181bc38fbc3e7173ec5c64e3b3f5d0980703f931a573150bc883103739e70802b70d1873f508a82427aecbe0140303eff9b20f8e2b9b08e16b6925014210d8840f4b988107be3069230aebcd6f5c0ba96f7df77f7b50e469a15836d2d7dbea5aeeb36f24a119eaddf79040654e488722ff2badc7d5e4dd5e15623fd3a57555d806713e801095d17386c7b099cf82dfa297b5c0b8c551bf7c53e0eedee6a4fd8068a5dd6993ec320dc270d48c7aeeb916cedb3d5e4c7199f609a1ae87276e910542084eecdde5eab33a1fb456c1e60370cca505969efdf0356ab969549483cdd4213fa1add40f96ea381d14c109858f2badfde1abe53f51ec76102d689bbd4ff17e1ee6d0b582e0c48bfee508c6707e79edf7dfbaa50f4f82e8a0d92c97df26cbd3b5e0801ce439cff41fdffc79260d87669445ea62543ab2a33af525ed520dc993af52d7ca1f49e166d82f5d4e08181e084ecb2359ab0f801777ce2860d557c4b86abc1dbdca010c9e95bfc854688077a1dbbe5bc077099cf5ee1b3c49d36c8714eaeca37cdbaf25906824163d69918060bc79e6881302e41c5d50156da453ea213f564e8e3a329949db33a319311d7f87813baeb0bbb0114d92e87bf61fe7ec6583df290b746104f6f76fc98b6b94a7c15fa02cff111efba69dc73783aa8b85ad3e753a1ad133bef583981c5a3ab7b23e325329ce81066840751389c053f99acd4116169edd8021a04ffe86140ff583f7bdd6dfeebda7dfaff17a2b39b6c9b87505585b59d408278b42f44f557bed71c0bf45bb6b304547b26001bf19c19c6af58535ae15d82ca566b5eb029f62207b147283bfade0f8dd1536840dde6b8007d3e707d1ee57f34ab4ad3cbf867a399a1327927ea04c27ecdf774a57680c5aabf1010083eb354a30fd0b5e3829eaf6e1a005f16d5fcaca13481631d52d87901cafb043c4062718a306797c883e5c99e597ca0599f083502e021700334d7d55a1a71d9724d1f92dd41a88940419b1697785b44a17341c2956563d6caa167096799026fc01e5059d1e4f5a3e4ffeaf3189882bb08a5300993fd0e5b0ebc54ee22b6a98591d73de1eb0a32a22d23ac851628991f9eef009105e1cf747896ae6cd48117604ef49d26cab7d5bd63044fab2de728d9b78407b0259bbd9268d63ee1907f009cffa07ff9e30f32cf56d25fc0a3410096daf9c2f8990e8386740cacaf272dfbdc185be2726484cd3eff6ebd7fcee7f8eb15ed1a952d34bf88144f02f07bd127218539b74afde3f73a051a5d240085a91c9c6806cd5cf3090a16fb4a02418e77881b952dbd0fd0a0c3c8e81306e38e0ec654d97e2ddb17f4c5165d343e40033784f0668252592e4d1cd95fdc4af16f1ce16b06ad0749e8a315492b11692467e4901a837a443f05c36b106bebbb1d35a83558b76c4c16ded2cb4e80be746c40300d5a5d2500140409833f74557963a37e0888d854105d32d324063d2431edb2d2a6f62a538749dd8b32d83057d551d53df79fbdc4c92fe34883a806ab6910b7c0b4b8495f5fe77fbba14d071c28136c0d45eb02c80de180c846b61ae7ff583d4ffa4c58c0ac0815e9922d68426d5264f7d8061c59ec70d963e6c1f08861fb71ca3e7c6edea3c74b179ef6a04c909502234a0c2493958f464e2af923d39156d61472fc0ac764a3ed9a7d64b0a1a4ef283d2411c22c40d2e7de982fdcddec2023d7e413b27c11c9c9bea9648bec30445e66c71d9b4617241b6a6d82be42380a3abdd35329adf41a1cd72e68ef857c1a9b205859e3c149bf1ef6b8f39ca5c33bfbd8c8e3ad49f617050068765a8f9597f0154b989aa6534c5a0bdd8f060103c8fdd717586b655e92485c3f445c79b3be59ab21d0f641096a566e99385700f8c3d44b3320f9056932420a680b0d8b2614b907709951c8ca6b67cd134a3c3a35f65102c1762260d694d522e0b4973d395a17fa90827470c2f61ce36bce0dc9d2d618da66a7fa5fed6725f9b9f5bef7eabac06f3ba89e9337bfac6660c5e953bd6f41a9a1fbca5ac67579b88e2d5628a68a77a2df4fb508d593db7bf05500da15aba17e98d749a9492a00870642a3881e1d966658f1ffbd78e0ce1edf48adc719336da0794462c1802d1bb0d4f76b24c7e7568534b5e1cb159ae6bec0017ad710a192130daa1d8b3394bfbeccabc04d8a739cd624a50d652fb06d911061ea498c936e4e8801412242acf790e4bf3b43ec1721fa82fa35de30afa5f06b8e3ff34c11922a4c6b2ced320e80e7625793f3717a5c741a2239b1a3eefa045e7dd9c50d87992f9d1c3ce7a0bd5968bc9c77c9be1194f7e2ce169e54876ebffcd7f8ff131456cf00daa3a8a2e4fb0df48c619e1a07106a10c91634e7e1e9ad7bea7efbdaff80b9a1a774e23230493cefe2ca6885eb499c18f87b723760e40607feabfb38707279b095dd009095e1fa505391596db0896732fdd9d3edf8a881d95ab6723025fe3b0d3806002ecab633d0bf87c665551adb9135f8f2389638891d88a065b7f387fc55a5c9f3cc8bbbdd56bade2bfce143356b96d55fc646bfaa83a447f57985981db1368e99c1813e039773593f9c2559a9203f3d0e5ab4d5ac99326a62e7e66c364e6f0582bcae817912ec7e3efa5f3789bd08e8a089a9cf13f0fed1674d59c16dcb72d5c92c7bab0794a1fb5aefd8cb8b03d87e1ab4735fa1219acb01ac5ec9c1839ee735ea769fea4def6dc24898ec612417a8c0276b6d933c080d11604da0dad26365f2d182f6c13ff0655a00a45bf9e080f8af2b9d9e7d0b613f432048d7d806573de19bad791bc27cb1156d4d04b29483ee8dbcad033c0e98d115afc39d87b7b09e20ad75f8df3db5ab3f7cb0e0bcfca6e0e034d2a771cf918583ac631340a52e5e05401aa5b01857843eaaed797ff1e47489eda2732f60a7c06695769b6ae7e48237f51c4b0bdfd9a878ce57ae215610102275db86515e9a9ce76fbe5db30c839e4c2c6d12d5d79e8e078992b3961e333d6ddc75015c2d53c80b3886f052c6708e34dbe7af3eda1de08e0bbaa0420a9acdc0b59694ffab4e032f642dc7db064a1b8ea613b1bb9d59201bb065dfd9609b19901cd6a504a0dd813caecbc167e500e9dfd7623c5e6ca2c0bb878b27f2cd6bb8faf47b96a486b7a909d606c487641614a14a018b2e526a204ce45a563118b121c96a8a52e035fd8dc0f427195664885eb8734dddf531c84726ffcbfb5787844361e98a2ca9043e076652030709cf2c7e2dff38bae3ff9b0f0300a732cf4aff8df65ae8e6033ca8fd74843ae6c211bda28652218210911d41d25b34a431009bd85a46b04b46455c63a1e9de2fdb40ed439116c846ebb3cedcda99fcc6359ba7295b436ef1eea80b7d8442e076c2364f354b88253e9ee7e758415dccb351340016bfef0c479fd11db8df76658916bb895c1750b85f71ce8c600ae89ae791166ab72d161441a6d70f012c56208d16eb57d201cd3fb162c07fae1f331eb27bb81f463efc2f07f72f0a913429a3a0fd21df6fdddec4720b85c33ffef9701050aecfae2b6196c40d91358cc0a41da18cfb23e19c0506cc067dec9a9f281e4e9c21cbdbabc70fbd13baf6465e38e44cfc31a667bc3531c2ba1d238f1fde43dfa7cd8bb8ac643ce15e99d9cb6c8c06f9c5e6722979b9b2612baad733f2276b7d3bda7f0b03a65671e6fd17f56eebf78fc0fec27d493f6b1690d99bba1b9b8420bc9771bd4fcdce3fd19d124e616793b48506d21f53550d1c5cc58a1570ed68fc30bc6837d33f7f4c7e489c780e077333a2429a27ffc5cfba8cc409442242cbaf36d15bc53dc6463ddd85e8268afe20cb0c7f9f7babe1668e60fc9fa95badac268e74d05268a7d7a1a8bc59593d8affd9d82fdc2ce536d49ba4533414b20ecc952261377e2dba83d10ff817706d2e677ad96a5cd36ff800262a58e9595daa8ce293b643088a885c82f50dfb8682a14b6d4a54d540f5ae7e8730ff942f815aa88179fe3b20fa79a615021efe5992b2c6c5d4126b4afb541238112b37854aaee188a293d046bb8cda4a03f02b190e98f79e912afd42ec0ae986f9731e1b46c7b3eaf666131a8e3fff610abbee483f47761ba20a9112f001032124e81cb58fabbd49ff1d7ab99750ec7773f907970b1cdc84e8d2dfaad4744c24e39c223562df169bfb769b91a8821bd631a247a26565541343e173a1c7ec826539994b5ce0d78244af211d67fd51b34c9d4c87358fb2b100cea907e758a85264e9401f13367bded0111524afa8d809326098eafe1ef36774b6e18cf84252d14f906c7e990d3a4cf19c9e3530f543ebb02ee59c75d8a86782cdcd4b02c2658cd9f4c0c2507e7a0c6b26cd3177702e72c11ea1f281baad46e9ee94bdee62232dffb157bbf4a6f0f35274c54e6f587e4c2a3fa91266a0d9a93568bb4bdb0908d2852d99cd5f4cf572d89bffc819dc1fd4b2c1e7af7e78ad5ec46c97a259948dbeb1f6a37f6d598942465f89717f5aa9c86e6b31898a85466f914af9642bc6b8fbb87b73fa245d46f5012001128841afbefa1875cd03a2d80f1728c28eff7137a0677de865c2ee25ce450efe308bfbafb0a73f0b29ad8d0da1e8f864d42a368ec0639adaaad4096ccfe94a64a960be2906372246d74fda3fe7e4cfcad024b20e67fd27be5e591df451708a02476784aa6ce0b5c18acbc602a3ce235c51ced28a7d3782387207511f092785430162ecd37ff7736466f6f77e1a12dc727eaaa975602c4f3fe39eb8d3933e67858cce032323ae705a871d597b2905834fefdc2befbb6982a8bf693702dce9b0af3e024270da9238e74c7890b8a6ac698fa3870d5615bf01a3bf889cc25178d3bf2efb58f975f46f8dfc73f793c53415c3a0da650abffbaf53b1fe8868eb51f5c5cced1bcb7bbbdfe6d17f55f83d887fce542aa46345dfce0377363b4c98a891c90ce6cc9aa2e4794f757999275fd38f4837dd82090c76425774d4d2dbc218c9d968fe62044b1fdf61df76db0205489c5d60e9dcede83eaa61669157de35711cf8fd01f90cd2f145a4df4dc9909325e902aaad9a4e3261411920bb7afaf262f33238270eb68a909f03d495c0fb5b424465a0360684b5a2611a1502f2611837f048dc5227333139929eea58fde39686f0ead48435bf7fd804c935b2f2749daa0d73a329c06b277766267d8c57e7b05c79d9a38ccd4e20231dad12b19368457f06547c751874b10fac5071322a99690512c7ae4774fad306972be80cbac3dcbd3ac59ecc012ea791669d83d291a84976d2ce806942bbc79c356b57e19d137f09c6bba3f2df4a22ed2ddc8686a5ce4664641b977b28999d88107dff203c9571e591014809357e77e86d39d312262d17cc7696793fd0c0d48a308f58c646339a4b64493f26675c3eb5e7e509aa0e7c75ad0797917eebdf12413885f11a368e10b6f7799ed6f4d29c8b79d57e42c0d0feabab48f3a38e7856ead2e99dd94d46194a778f1d42526bcb9d2d5b038dc2153d23ab3c7631df13e2ade1864a12f17cbf66a86c2b6d579284808ffb6832456d558d2ef628a1ef4d5052df5352648f7a7720627c14cf729a390f78f86b9dcd15a7d729ba984edab5134ece13fd022415a9e4e5078514222e517c5bbd675786cecd427ce872bb9bf92999e8d2867857650fe2ce5d5cb78743bea07a3eaedca848bf78812a32c25b4f30c0ec4742c9cdd20647251e5bef123a76ee4139ba3f0f01285e18f5280c1b7b7e8c3a457ce0d5c547f1a7d5cb6df94f9853f9f1a82df23a28498525ecf21efbc714ba817700b3135082c08f9e8ea50e0b7bb422026ae969dce97ea135fafd46c1a55202068df4efe9adbdbdd8411309a20e1bc147dad80db0d469d1fba2a704aa916226fe62cc6ea1075f6218cc2d6eae3b01edd5cfb445053e9c3d7cb30467c337f0fd13f4fc58889d71d44ba385f9b0a5f60ee63969c50303215da59e060947e91324d1233a3363043ba2d3cfefe220c6041b872fdfe0007490563033396085b788f44d5871e6657fd635ace405835f248c33f82f042bdad0cd092497d09bab066e8d3c89af73098d6e3ca6a7cca820895131bad96d20af776d42a6f2f2f6df66e7792795fc130dff9d86eb8b8059cb1c49df41c4cb030df723c92d2706db94415137a495eca46f937ba6da9446eb3d73dcfa59338747665b3ce6a23f7ebfd181b59d9bf7fb6d2c2655d8a11410ed662535b5b5561359cf4f74fa0196d1fbcc4abad771637905f341d17311d6a15cc836341cf79d6f5c2cdbabb33b03d9e8b4facebd59aed1c8a8a342385e65da02a79b48a07700c77e1221b2fe23aac9b794b21eb82ca6b5814466a7acc7add1646716b60cd76ac52898ec0b5d4aa952c6a08203944f0b59d8d1c9632c3e5cff0172ecff2f95768216922cdff8bb2a699442fa04d6e4d2d7ec1825cefa9a63b470ca26ee08c32f4aa48da5d7762fc7087920c060d62f90f6f1e96e5e3e0b6f8e4edbea8780751cdeeac844ea7c7c038972363455d6b68677ab590c08d0f8bcbe5a9a2148da4d0c4a1604ab13bb91cffbcc67bfd0dc9ea641d7cd8025367d306f62556441624b0f308af1f50f63a37c71db7454c6bcd4f41e0baee5f1ab156c7e0534daf0fb61ba9c0313a2e7e2426ac049082a47384159f4b5caa36584c3e8a26c16258e3e22eab4a3dc1a127348bae37e0a254b33206be3c9e548bdfc5422e7eb1ee83524211107b1e1509b9ffc6988d291411cbf40e1335c93695fbc020ee868ee15c88dd3e4dde2cae9c409dc0de562bae4170325c8a58bd3a938c2c1e31507797040081200f3103d35ca91ddbdcdaba8fdfe5a57eca3151fd8260d983eb3669ab2a681276abf7579ce46ebf10d953634f1e96ef05172b677300dcef2068962a2844788e26f6f456ef04e9807f100a5b8b1492258dc24b3a96d1fc07de8f8a52b90daa685baf1492ec905dd4574da5591992b9d4ab4054b97fe5e69a9d1734fa4fdbabb9f05d04cf7161a631ed8a7f706c3484ff6a79e2b0c5308c5f8645f20b374f8f862c3c2ffbb9defcfb186ad91812ab9a6919a3354abcb67171d896827f650d9588b094c5513bf44494976934acc284d68ea96ecc519d2afa6cb5a4dd5a00ba100646cac79f269690ecf70bfe697f31cb56167feb65acdedc16f29f67d84c57350b202eb6054d3e54ee5187bcacbb7cc3f3b6b3ca254197802916cec088933600efca7cb3ad01d75f99ad074b933fad36515fdf2fe1ea2cb333b30d8745951cf81711f80d779d4d1300ae191d8ea5fd6e69f57baacdf9a50fb107edc384264ac6b495590916bb6c12444f21892e79ecefe9d0c8537227403d059faef237d067c1b6b3bc56a15211604a88b6eee8c402f2a5bb26e70382ea3ce4f8cbe7e8ac5bbe9b808ca62d8b3953b4caf6a4785ee2ff5dc9b5e88fdb984fd43b16fcfe1306923e560ffdbe26cec8064580f9875579977d990b7600c109d67c0bc0110235ebcd1370db082900499500812b1f826c64c6a53a30ee3b2bd19f997324dd1adcea36c4d9e4c181f98a761f79b96eb150b49166922620146b94d328b3f6087bb7793194335f0c05e106b0e29ed1fa98a7b0484cd3d912fb19a7b9885777d67baa248c7c0e3ddc45618dac273d5075fb42d0069de73335bff4f1e59c8b79266d93826dbe891039071c3adbdc914211b4189975391b9e04d73c2ea887e87d5c808724ff27b3d2349b2ecbda231e6de70f42e89f569a283b3b2c30f1486778a17aded0cc3fc181a30048e33f3cecc71295d08abe32972de20a568f1666f867d5524769de2b43b349d4fcd1fca061e49117436be8c3c604d7738905083413f773303e38600eab54ee279c013498d5040828575bcc329dc68b751f0ff79d9f62109ac27967ef1d44716026ddf84608ed90b3d7037592fa254274ec3f48480281060ce2d36f290640824bf740372aa92ee7e138cfc932b5ce6799a83bb56e4399c916451e2e1f70ca05232e23d2b1f7b45d949532a841af5cb320f7e47368e05279e94dc0da7a3f97ac7195a3793d1cf9e66bf8b27f39293e74af5f582e47c4f4345abc9342f117444cc7a53df0ac7f5e498a7e91fa302234888e8a6578c200830c13635c3b6f54ac3ca6ade66c4d756a2331535d358f8efa831acbd107fd7acc5eb13b3b8a8c514f312939cc9dee0b61a507c11e89bf815b50f35031e2fb6f9a48425aa594d82180913c3d6c21095f5dc34777f6e37e122522f8573af20afa6e8d7ac349f6555ae987ae192b747d416aa986594f64b207f3f9e6bbc87cb9b828d39ddaa5cf6b9ed0f7510914059c4c4cb26265e844e8a6708bd78f92c878a279a080dadf30ef11968a1460089a4e1e9444fafc25d161f16de29ba7bb711ba059ae9bad9e426a222b56ab20c27f6709a71d4d68f2917d37930f0b98f5cc52df1282325cf7d3aac6e6824ce8a49536010c9ef907d418c5c5f033f3b8c1aa06a1ab06023f4885b36ab8a092082e10c5ed33d3523c30f7cf7797245f76e6d17bce95b216a305fcb90ae9c82f39aa355760be218ec2ecb930279afe8bf772dce359c5e978a1505d1e8e0eae6af119c2223a002650654fdf971ec7d0b8c39231b909d5745e1358c6581006025240951b1b12b11f849b02bdc5fdd0bf159daf3a3c1f9d64a63522bc7e54e15414c6810111fcbf1169e21b009b07d4260ae31b54bcacac0c42046018840b7ef476a63e862130c48b4c7e27d71863a8f2a93150ecc02c998f272cbe6727976be1dd5277a15643a2a440eb3c02846f93696fbb492d7c77f2fa2f70f0e69313a6e8b3c1bc6aa4a282195bb4b6ae0a06c701ba284bed8343617eeb917073e13d1c46171745d4de700e5801a213a657db024122ba74e3bfe9c6c5b7a87e44b2296bceb6857451ffae40626521040168e325018710ceb849c485251d7022e7e44d354031311ec08c65cb2b0f3767ca3d663f8d4db88cbf65850359b6a77df8025c31d1a1a48e480ca0cbfb656a3b00623f3593004eebc69ca859e6d839948be8b834e188093a946aa4b2cf70a824157393b009e08e3f0062a813d31074cdadb209547c1881f5896d88c0ce5dca6b7435f563b9c8094d4c2e85def757e136aa103bab4c8788706a9a6e5c366a000bc13d975050d6c90168150673fabe259076d842fc509a581cfb9e517cfe6b9fe5b84d79812143c7d4ec4fda796b50bfe55eb477c0264e4251a4b7839198b6310797234b66d4b3d20d057ad5d44faaa0e746b861d2637679908b4faa5c7a5f3a175715cbcaabca25db9aa0d9d55dbf73454b4ba19f24231cac317c530286da5f310b0c61388e0c27c8453cd6742d1262828e43542a96ff5788219d081c49536e0bf53c498c0f3580b7ce2553bca4d7fea613e369120e1387364021a1ecce8af1c7dca41ad87ba763b8771c6fbf6b622496a2b857f960bf340570af7c1c8355dff115a2666b82d99d1bd400d0707f5e3a3fc4df6f79b40fc2a2b79c38a4b448ba7d45ab8e6ed9735623d922e71e3ec899be3689a619ad308905ec9a8d317bddc97b9a41fe99f7e74720f3a830d3afd9dfe73b31298dbc1ebaa6eb75b5de00384d199842a6ca9d863bc73f723f4c5873d3377d8964c93f5172facd0c944d54055e755c66ad332df801922a57058ff370b4cacf75fe519f1b5324c9ad26674a59681ad8e93abdafb14d4420184be58e93c0b08aa23f2e08d1446a331a22320e873a6dd672d13c4d611dee84ee02939721b81f25869d3ea9eae9f23d1b7a9d23ebb0ea4d248e4b9c86b9b2a51067cc67b047650977a310f9f589694b6daeaf6a7591dd783145022812813b88988ca33c4972a9a46187b39c021c1a94dba19642cc524429e4c0287f4bfd81a2b21d5e8b4ab8def524bec3643d5aa49c633ed47292214e3ca53b077d7a9002256c14361e4464253db6f037f3f6dc14da8fd3a8e2a21adc1642a272726b9c3c91d6ee374559d303f844b1b131b9a9c18fbf01b549466523168ef339d8ba176270aad4ce4cd4d17c0446f89ef4fcf714c22c1220bcaa1072749ae2c1a2e8a66ed5763e8308046f42ed5e138d26645a4ffd4af3aba5a6899516ca1c9b76064b2a0337c69a594b68481eca72deab56a8c4386c6ff3e84163122349731614d1ad81f042173176e3028e6d8999c308e9af29c0e7279e5053ab74023f28029ec112afc0db8dc7ccc2a8a09eeeee6c27bf7af4286bc44bc931ece25604e7067e71d6ed0b1441305b113e2f690361045d3871eaa07e771e8768a609e9432f22191e13f9a10db0207a99bcd72a7a91a6655e239faf9037021a4271b34650ab6f5ee64fb0417e67e7639a474f67ebdef12b2b87a4d1c432989c7cac25d6ec412ca083cb9ebc937f4335dfb3545962735b6e283261d7785fcef7dfbd02608148cc5a48b691feaaf6fcafd1c472ea294725cae41634ab45af0d12ce6603e1664c0d5a78422383f540c888ce041cb0bb07b667d3ccc5f6b2f305c1e707e091c3f25a36942247e748d7e6789f41df141aa4d0958c15d5fde6e7b79dd7c996531895110efd1f0bd7f06eda44536b961cc0d22d35b31f69a00b696837337d61f1e06305b60de6c51325656f1c207375d12810be8ec485bca9d25a6b9be38f478c47e593685609b4955f9e04e190caf5b9027f63dd1864d8543c7e7053fa7011f1b09400fae271145b489cc91113af4455a2d7e1ea43ceea8c8654c1ff28c505f1a98171edc5420510c6cc9c4f3963ff3fb02dc0473d0ca38af9a4648c5c6766ba01f6e975dae0e8967ecce2a838c40c71c04771e6a5e484afffaddd0504ad2b05978852aab4fb56d93463eb0f0b73047f3b7be75df5f6247f165c580dbc92f0b225438fbd85b7041ec4df50d1f6acda14461461a05c903666c29bfbada809a437f7280d8e7e49a5fc82826dc97646934dc6073b534c0ad71a864f5ed03d3ef300ba4d1aea9d79c686f5b5c30d16027dbe26b2bb1a39d4770b2c5116423f38c4e3c707eb159c729c91bf78e5e15bd65a3b66a7f652e765cd7acb0d0cfe1a026d63e738c680294799cee3eb2d04c57c08d841a39e967a33ad6a07442eee8f2933191216e48d1f7ea48967b7d7907bec1d8ee35b587a7f20ae0486fafec3ed67a0d2f02a7138fb31c9ee2a882a6b9ab3b5cd82a0813298059c349ec25cbe42deb42288588d0a4eca9a8407c988e3692d33f06c8f68a71f0dc9d1f4d38768c6d0d18dde9e938edb28301d5ad56c02672417d004e8a98c74b1960f37ed501ec1bfa8a0babe72c192e7baeef00f3a33673c2ee582ad318a34adbf48d4e2899980635052efda0cbc56b67fb0885611f47713bd520bafe179d8c453d61ace1706465ff052d0132890b462aec70f53f1737b9c2bb5f27f61581f4bf55cdc3d9be7d6a63c928de938a55b12abdae04459f30588f435d1148e7e5026e9d251e97ac425bc1cdd48e7e2a6f789477264c802f10733e5820a8d3381df2371d553363fe6a2a88a89ed8076a580605e0ad9f1726b43b4bbd3c2b03ab9108d26f6b2a66867202f4982658109d10bdae8864b87b8423fd8ab85c0ba69f498baca5b05a027eb86c902cee194be8c13c60c5134e8546e624bbc48ae47cc5cc5fd7e954f15ddf0a9129148bd4e3439d857f721616386e8a5351ecae585439f85452f1c2e8bce4844fbd4d25ce84f2e81230b94ad022b0455a8d0555f0540c914a001ac1814744108217765d53e46972092869fd4bfb2aeeeaee5551b0f2795ce56ad6eb6620d41c5caaa1ad98f500e01fd7c5879388784aba07adc3c2824c2d284416580c51c564417a1ec620aca86058ce42e62bffa27767d202527cf08e614efc38c84e7283f80c5fa0950e74886fe4fc106c18b5df830294425fa8289e6819a0bba8a5012912bbc70e226a31915b6a3b93a1cc8850ebd0c19418b3c55177210146373e15ae84f80b015f481ec04a2af3568637223fcdcc5a2eaae08e7c134652e63f74befffed0e7c93382fe26d8bd34bd4f0da3c0511b61a9ce8a188129a7018116e07f881532642e6646d12e51a070a93e67411b2e92c286e4087485d23067522d7ae981a00e1e88a919c702e4396a5cb6a9f9184d0e30d9d541753509fcd6422fbd02c358d3d7a6871a5b23bde2a3f85f15fb0361d6bd3c704f417f3b9601caa757ef5e37b8792251ee362095c1d2a2f62b61b8dc9e50d5fbfbe1617882921b08ece2a6281fa05fc286585f245a009d8dc209cd8350600d0685e1641117125b8d7f1ef114bfd1c397ad18c0d62e60a40048d1a61a49abd13cf56521239e7bd02bcfeed2ee8360c6c68b0e8eb67e3308ec44713139955efd2888c414d5ffd9477d807ea3e063a7fad80cf7f7824b8fbcb84cc7ba5317913f175a262eecc8a6472290613c2679e6a6952c08644d66660ecdbcb3f9285850ce845d8bd1be311c38d4dfa3a844bdef17c0046fdea98ddd8eab02a63d305a78c0e925b8f1e58c7909fbadcd85941acbd076885dc7b6ea6e78fd09cb0cf690e9b0a8e51f38dd9bfa5001cad537300e82e6e563a3a3b7f089863f5d8c0b0127114e4f4de8d1540ad39b187bddcd0bf45269f4284413fe6b6c1fa89fc844acdb24de947ca4c5766129dda61ef071b6ee4b79bb392c7baef59daca5571fb2f033039a7b5639c42213632c2fcd49095fe307b914a303236dfff08289419bba894c6cc572c8ebb4fde4da3ff74c78c59083410a19022f2b78198afd57d4e9b8c2522cc985a973387e14778c8aa9c53790a9f138cc40afbccbae036e53f319efeb26605d259bbdca6e3524c484a7995975d294224f8bedbb3874ab6e144188b5fe921d0eada71e3b1cf35385e254cac6ad5718af7f3ad7718fe744cf5504c80b99c65f41f551db229074e6163ec7c44f485062802eb18b175838b658e8c57cc96779c710a5e02598513774653b6e20eb40a17e0d2198959e77d9661d192c068c0e40464850de4280b4c83a6cc11765e857c45a519669158b44debbb0223791d6f8507efbc945360f5640a2d89659b026bc396d7f46f5847215ade6b6974ec2050c38e07f4248500b3e5a960a212cf37a4e1ab0653e501c0de8c80bb38ee2593701d781318d1f75dd71d3f40ef2e49dfd15360a109b261fccc75bb11285812104c557026e0832d5ff4983d8f868aa017f3369be4902496912cc033814575c686d03bfb0f448b253bc0a5e0f8862158946338e77911c3dd87ca6ce4c53813f119c4e5a061c43880e883ba4ed4d8cf856c89e4400bab45073f1cc46f3ce9d0455f38fd7785338262e194a2f7b255221d985721d4fc95ad3af74f242476033e50ad0972a69c2d49a5a07c4c7a491fd150cbb139e907e950fbdc8d570322c2390f4eeee6d97b41a19b5d1bd7fef5025c3f9467335f2f2409b566ebba7bdec2a06206d495ce73faad1757f4f1c5b2c3d4800dc198dbfa3bf073b51dfe042489d571c9518f87eb971f72189d96938f49335b29a90b9e9e31f3a61c0c08b9c19600cbb262a946b3e2f740f3d6fe8142e0e57c790cbdd6200196d4938dee289316e0d81ed4a80e79ca3fe6168fb5b3367103b54255317e0691006ce338bf642222276da74aa7303f030e4d997e687f2bc9e5885d92c9fd2c8846413b1f8081912f2a7cd8a2705ce11011aca8680713d6cbad1ed46d9a000223e734dfaf54b8555c4f025dc9e84d2370ede7c7468c1cb857b582e8872ee8a602821e3f5f5d809dcd68044d9085c11e8fb9879c7e3d7f8043b4d0a73606b7cf7fe30829c4c87822cbe2b1b74bc082140f7d1147106268bf6534b3261b2f8fe100be66d22f1ac5ed58c0c922aa8c6a9356442a5f74402d3ee4a2806c7cb64e217bb208ab1f789e7a4096aaf59b6adb29e78a3e9619655588f4c60520337b8f9e0eda793bb96ed7ba796b9e876f9d289669acc326384063f07c5e9f4bd7a8a63ac5234188b9ac87b8deafdd111b3919a5897b7b794b6f5e8712ac6f5d206164b07421e8ad8e6d6e40899124bee6f8e24220bb3d625214ad5e1c7dd8c243caa58fe81abd072bfa2674b41d2bb042fd497c898bb5795797f953bedd8c0ed9b0818b84ade120a2f0dbccdc4ad35f4242e8412d862b4cee6535e14270fc93dc5970f02d04c5b8a46af871c20c7d918ecf5642a98846f4768fb35f0434d3701a1573ab24e8bd0efa976780dc2b23e5989bd5ad00f7ec314225f81178fc48bbb34c85b0fc48842c4faf62c8df32e180c01a2ef0355305ecb0bbda34d4b4887f1813f54ccb60b9ffaf5a01408e4d237029b71dddb4cef3d0a31a3f604371ac4ae7d36a5f4ebc05bf210577897442ac3f15280a7a495862b4340ec20c4ea7663a233346ab03b2320bd2c5c580935e82091001f7580c8a3064c095bca15f110efcf5179b2a12e7cc74b21d04b3905bc87fe2d0ed8774df4fa5f12d7646ec774629cbee9e5d42e05008a57c1edb820075de2bf1da795aadc0afea8cc177f698da6aefce217ca697cf0f2043170c5db0cc13777a2e84a37709414345aa64c723dfb3948712c875c01023329f356251a65a883ff3dc21f7ab5033239632de19523911c47614333ccc9ebfaff2c89a54a10393a4fbfacd91707bdcb4810707564f364875e51670c15ed551fbfc0151d9fc3985cbe8165f38c453cd8cf8602b46c9e72ff4e2463064d7dfd99a805e41a25c7d63bb31116456bc478ed745466bc04550557ada44708bf1728aa82f11f97a52b2df2055972332c8848c25c83cfdf3c650378953709c8355541e457febafde846557b9290cfaa669ff74dad3a0523efd8702b3f4ede5e85ddd6de9e2d2cbf5bdbca4000b04cdf42a9432454ac49012ddcd1bfb8cc667fbd471348889361edc8fa20fa1ab5a73f31dfa3b1a862295aa9b3fcc87d1a1ca4c1622ddb3c41e36e7e9447422c7d3f32323abf6aa350b9ce407904e1b9b0cb23a7776004e8fcee371fe76007fa1715a589ffef4f44ca35904edadd07f455f0a0436f6c29eb83b07b32f8e56f9845f3cf687bbf67cfd6dda1f664a040cf9890bead0eeb65817d7b5fef11100f1ed9d9d227f97987011a04c2576ec8214912888668efb84273b36e0e196a2b34857d8e40d585afbf52630b91a8211bf675ab6021418aac668e044309ec53c86ff044088e9bfac155e70c376023e7d7ad5fb88cbc00bc9d1a4e525c74d1af3871f28f61d3dd0b17aac772bbebf035bfd3b8fac5c6ae2ee2554844a10c5e5b25c9e25698863cf33d0349e833952cd008dd5376e08b7d28f0d8935b7cfced08bf0c3b7dcefca629d855aa0f0561c06fab1998c302136e464cc4d98645f7c229d641c165370773591a848d2832e2a8e0769f83b9353b806d3a3631481a61b2995377335205ad13a111068bb32e221166373e2a5c85c0aec2815bac681c53b14d1c62726f31a8b579afc55cc26bcb2504d66d0a78b60de9a668cbdb252b333adb0d1800769d78a9386e2bb3e6972222c3b3380179a35227c22c9377365977de8fcf32ec984cb2812ea501af44be316f5185f1415b3fae2c2acaf18d821d9f297fbc037a1fb46d78d5da975042f0e8909acb8efd6f9f525271f97a467e4dc36d1e3d47e40f4b6254f15f7ff41e6e023331f0c5cbab6d8c695e3b284a04f4ce2ccdc8ea1957fd56e190449252eb0c6227d1d387e4ef89e757e5486de5f615d11bbf5d847aff212006421efaca47f19de00199b9cbf95eb89abc619375ed8c41265f95c91929959427475521886838c5870c9c9d3ad0bbe4e1fc2bacd349b0511b83c73ab56941ef70050c6325aa2c413fe7a797abb3c9a578d92f10c0754ed7d1e90172649ebecd1a2d9cbdfd4e962c7c20d6031a2db4503fd5355b89235ba762fdac5ac52fdc84f5a65eb9ec46cfa276105cb7e66a7770e50426e276d1f687a734308ce6ac45247af37c8b87c3b0a90ca047a927aa45bbe8dba0bb0524b9016b0cef337dae39d9574516ba89c060b006d4844349f9b2513abbaa78a0b2ee55ee76057c860076660c647597a7ee3d2bc4242c87f93192efce45eaa387cabc8840fd176158fb89b7184e3db5c1374a610422588ac82e8bbe8c1ea74848889c49532ca9b0f21eb134cca8d17079d1756a404e4bff65a381dadc95851275cadb33ad213f6abd8366f80e40fb30e57f966204a951fb4fa8c70633e63fcba2b6440d3b66f84f778388db3f8d2262052374893be79fe2b0f46127ff2484202ef58b4de69bd7d9fe1cb744d9b6d89f84842945a9d865be9923a3c3fc596cb54bd94efe14240b7b99e8519ab2611a19429e7a238abd9f62198ceb7e96cfcf6b3e46b8fd44bfebcae6995b65c877254b7129b396dd6239f11ff426fc3154fa799bf5e3a7b276b38e06d24fba423d0ab4a4f45c2af2fce497b67b667cf3f396fb5871ae42801fc38721efcb6532551e513e804734c5dfa2fafca3d29653aab6473a9d5cc9cf18623451d9f949039265693204773c36de4b0756dc7d71ce48554964978bf114ec191c887a426a2ec1ad887112a4ef2ce0d904454e5614fc7811147b31746a21559723b0cc7fc5a0d7b8ef2f0804b7bde403e3de5ec2c66bd210f0ebd683e9ac91c59b663083540da2e4ec6cdfd08d9f4fb77685fc98bfd63d921f877708ff1efc00c7f0db031ce20047e583031ce2500f70005f1cea410e7180c33d0c7f0e70b88738c4e11cac03674d18050bfe8b479e523046db048a8eeda1081c2bbdcc35ebafdbdf620708cc544bbaacd1509637f2c1f8c67b3f506b50b180f4e032d13e124ea62d90c6c4cb440bca91edb2274c7eba337b89d5bbe502e463c5cb70c6da860b6d2e1f2f736dc8b01161d6262103f21f208dab86de38afcf44a81acf1c4000bbc5c5e19478191ef964d20db15e457efec4cbc436853fee1f580e714374e85632bfc9f91055bddca699055ab8ec9b3a5e4624716731f985372ce4e490daf1327166701c781977b8b7bc0f2f8fc0634114ea73751979b71f0af9003185b2bba13b0521d28c60af921c7081092ef91f2f5326a7c0419766d13a2f9ef595ceb955739eb62ff61b986830c71b46b23cfcba4054ec872785c1512cd27e5bbc4c883bf5c569ab2d32347506f1198a501c355291bef070ee8be0a3f132112cdd209968292f77044fc4a3dd212c5544105e654a6a85b6cd451143c06f24b0ae0a14437e5df66d00387de7c1b9cb6812c29ff84a792c1692c8065d1f498c8aa05c4a199f164aa119744db04dc9e52e5322442e050ffe6abd4f7f91954761904622593343340d88e67feebe74971180d0940e15c6c2da3aa33878e6ee32d11b3094cfaa1a84e4c479d85d864fa5b1185337ba660455c432e34231f1ff56cc1d7122182c5f2447692cde5d268a6e333e771941cec7b3e85ec5d192d8f87352e2205f2aae40a391fbab21ad372e169133e3fe9b0fcb072c7c1e5ec1a87ec37d9eb8ece5ce25da15c4785ec475ad78b731dd8e01a990f48d0b3ea6caa773bdacbb35a87a638bb7311cc6eabbcb28c42694f46c7d73a779b9ddc25f5bc9f6da579f10c9d59bc3dd411500a01f2a84e852c6462b6030a16de9c28be12c5614c343a1d563c58127e64b56dc128a8f35fa721bc400a6f11a0d35ccc35759564ad3b21297ea6f9371db9b15eb9b15ba0e21ddbb6cf255fb9f1555b5f837c53d5a29feba1220c0cb52fd76fd8d9b5fa79522085320d4b0f8aab1ad3afcd63b06645fbd552babc7d3b5729da05192ad203711d956eec53f0634a4e63da45fd11e857bfc575a6c0f4ebad8ab3b68f124ed1db242adc3055de43098cd62ed4bb85423b918465f8de68edcc5407d90162739192883ed96ca237d7bc3f9d23739068e8a854b3d8ae4335a9d6d4da6b84ba9fd2e453ce01ee2abf0d638ad86c1b1204a05b2173ce62e18657887275070ae8e41180a4d0441c75f187508e52682a0c75b8c2a8472530260149a2201835d11020c868a1064312830c06834fdbcb1182f4498c9a018a57bc5df0bb1795f0e3050070c0c8ca68408435bc23bd35c35c1c343576b52027b5c378ce0eb33259515302ccd2f6a1092f87c1c459142609c2de43ab5158bc2778015ea1f2215fdc5408ed1a58920f9181ec68540381f0c60c1355d5069a0df0cc5ea9259b91fef94cf608466a8189b3c901f6ad066413c2cca0c75ef93f3f7830ef03d06fbb7ba06df2461a433343f20c6ef3534373629824e6e62e1755f35a86ba7d7a0218c196efa8cec8e7ca90f8abe09276cf6c29c6434fc9263a3bd7363f9f04490a234067415bfddbe2d380459ec75a3e61059bfe9be03f1b7adf4771b5658d36f913083a3018865e0b062ea372c4d1df1d4df452570cae92524dd80f353f2b5b7f28f3cc1a1806d1264ebde106d47007ea5852d7d3f8477200f11dda120ba7099bc1e5cf2b8dd2cdc657fb08b2139ab7b4c549b70e2ada9472ee78c0baa774b8551c5d6a8de72d07039a814827a216296327f0ee39951d013de455be53007fa4859f5be0d4ea7960dda80063582af7a6275debd5d902ab62998404f405564b6a743c0ff73b867fe5243ad9ea1508552f7f07028a10b139e6bfb282112ad3d0386ae2ef61523626c7ee2d48bf557b14a77afa30e7732e9846cc23539f34241bda2464315b141fbc5de5b809eab4786cab71900f684f5f6dcd8dddf0e4cece5a45725065485bbb82c4ef9f05536c2b6980cc916e6b96ded06bc4dd7d4f478bf12af960678e96d18a1f1510668b3e72b492b128bee6cd88c6f05374ad7217c4d98750b3226dd6d1691027da32314264247f4a7f5ab4ebad5eb09cb0f4528e12b91a1156e623db7383059f4b63ef1de85b82eda5cf09731b3b62124689b24ed900830a4ba5bdb3be8baab0bd86a54f5ff07baf532cee5b54264c913e1843ea810c60d59069921035d1edd78a5ffc31986f493585e6f8b0f61177cd36926605e3835369c4c3d88a039f4ad78c5ec66f79c93d0d08035ff1ce790f035070e41af5b7b98378174950b8f623d6352269647859143d770e40732f92e8975bb4aa3e77fc9c36611807234c175c21cbadcc2f1c4feffc4dc704b621116f3469cd1866fcee88e47c62476d4c5b9792f262dca0be4e01a25c19f5d7dfbf016bef99a509925108fdb549ac4efec632df0c47e3ffa086cb2acba5f49a3e2831df1d4cd24a3bfe5cc5b66588e7c168de6ffbb1c042c4b605ded0b6cf069780f786d9b5d050d78c24bf800144c85658955c9ebff22d2839cef567ddc1012158b33c6ed67942aa2050c85656908067255f828381635431c933fe9a9eaaadb128d6a53fe4617bf90c12e3aee7c7995d8b996a11d899b511a456f67d100a3ca8ec4861e1e1e45146fd691dfeb9bfd2909fb88a784a282aa2541456c300740d84d0a032b02d8b92f4fc901f3cf8bd3b51d7274bc7e07406cd5f8ccd81d94316cf569d19415e8844d54bc614a22a7617a00507d08bc39ec62300b577748be7c5d69d2b8a9db484ad0a13ad6dec6e2242029521dd741c762987457c82130fdf51b5d674f8d9e19885b917908fbdae45c2a257b740b4d7f2de1732a996101078524776983777151a08c59c1a86bc92946cb74d33f83d0afe6402ff97714ffc006c7e42021238536cf49b1b5a46562ad254b7017e0559fbee1508c8c00e5b0f6bf687a9acb06b8e8cda725d2aa4365204ed4352563fe848fa154be2c19d692d2b27191bc7fb584360034fe24ebdb57d622a7e6cad09effcfd016d61292aee859da0c12cba1ae996948f42509606b4d2f48fc9965ba538225049142a84a0c3320028183278518a4a10a6970a0d94711a009faf504f0ded19208415b894badc1ffdf27d0372a82061b1246eb83a118f6f1a8ae6849c2484b2541420b5b72fc373cd1db379d3704d11279c195a39c8a8fa445b0e7664be4ef2b473c0546bb0664be0e7c7cdf49265c2a0d17003a6c3503a911b8839201a9819437b31656abf30fbe2dd1bf3ed04f9f14b00ac4f40e47a9c57c9aaf1fdda895aa66889cae169a1be70a95f1afab1a2da6cd3f0b741151afb98a1dda6ce817185133cefe84b55020cca2ad1536cfe341aa3d0c9b62ff0f97c5af27c5d510cbe86b02df80c923cbd15cf2764b9d15d2b74c8b15674a84a3100b737db4be52c3c30462c2f0176119225c535037211f8026ea06ad0a042854591d355db7fbf539f3c5c2430ea15d360b27f725dc18603e8ccf9251ae69384c0378d3f63d907206dae394e4fa0ee161440ecf247960fb21c15ed3cd3f4b1fc3c006d3386ee3b9cd49d73d0109881bbaaae1db3f408a70f08bed945e3c80e6b2b7fa1b077ae8d5632813cd9abab09fa9512c53a2a95c03341f103d5c5b2e06d4f346e54c6fff319b946685799f3502042d21c16bda0404663041cd11f7ba563c7ba3c602d20b1f7efbbfa273491661b85348028da2e1a56c96e5a4964b009e907b7788691c07757858471b0cc9dc6bd0025e022f0621160b8e804dd46f6977053fb7846ba7b568d20341806c1145771201001c852fe3ad203cf6406d3babab0f8ca47c86c9ba1f39cd6f42c8ab48616a0b52189dc3c571bca576525e8b96b1a07d23427d7b9029e0a8f85d61e7516cd7bee8d5d9b5cc6c1eda847cfadb2707c64a4900778e53a394baaedcb301e654d3ae328d3d113544173b918eaf6e44486868683162557dcb2c4a07de9e0b367fa05f159f906bc2391c4aad631aab3b67b6f7eb68368065076c02f77d1c0a3a721cd4dcf9b975fd57a1878719ad15edebeed330c6ed4d87dcc84fe87efb9e2a8384be93ec41fc4a89b7d61dc1294d3c4b51c0ba1611cb3931a92c463013199a151d53fb9574d1b6b08afaee982179b51542882e7dbc0b2bf2f113cff08b5214a5d151037ef74b2ac4776258ac4a4922d9ee6d8b8e26c4745743c3605a911fabccb9e82d5ee28259f321b9b5664d1d17a171522b6e4c134b28054845d2ad7b8b5b637a16653b0914d18d306bf39994ea54313451e95c3efe6f1e42bd256e6cc84c2c39dedda57645c4780b44792f55eb20eaa338e11b3f78c72cf6f0025a06978fef1097d3e761d97a94ff091c5f389e476afd46054d94bd71819bc2d12fc1f7ba06ce2274e9985d1f84511d15738558dc7ada7df6efdfb7f7e242eae94fd17bf963fb7f49d96dd91efb01800319807a460049ac541bdbee67bb28ea9bbe7aec30f00abf5e6be12655180aded2fc793e07b3539ee9ee7eb56c97d25f531d1b60703e0558d5de05ed6349693d664098afa11b984053531f1eacbafafa85e5cf6e3e4397afd442860418a409cb25e085cfc68a82f9332273588a3c168d98d31d101be8758ce230d4a4b65212707347792f26bc17d899c8a6c36f4c195852ed65c6fbc02313977c490ac6635824b5166af2a2d2d29ebeaba06234738c1abe238bc6ea8547f0c23f1e81ccb4284dc66f30b8e25160c917c3e69a4aa409dcff9a59328b9978414ab6bcb8811501f1c901e219661799fd594575457b004a7f3f644e177a9f2277a0ac30c6f744d6eb0dd8f4987d03e4a52ca5fb0087ab43c97a0f48f6bd25912d44ad511fb7186441c6417e8bea89a73f63fc951870d75318d85ff2b283b93e2e5dc2d4355edea26dd8af0e4060fbd07f896d0c0817205542bfc87b8fa67659f7d46e43615aa67d7331c27724ccb33d96534e550f17c380a26dd6429de0e72caac6ed15a8c31d40a8a1f599c5ae894ea7a8bc9852b3df8670476dd4d1098d38fc48ba8bf4036ebc0c0b7d7470d7903f0facb33debebf82521eb606526aa9a2542a1f0db6623443408d7a7c556f46266703629cc8f8e1ee0202c2b0fb74e97aa4784efb1d35e95c21c065c708e29f08d0c98687a33c720d108cc6b9f8d5c93539eb6bd57a15c1c7b5fa0338380400af1db411db73dced5bc706435bcdead0317272df15055ff92d245cc65d3e103b1b530e2c435a4eeb0b3e3c2996b122890344ee7391223e3b8eff0145dcfdd899640c0bccc914742b3fb191ca0933defbc205c8a5f753e8eabad9bc3613417b404e3a9d1503cbfbf3fb3d2ccf5c5000c0d52dc55605691ce62e5ff4e513934c390b2f8dcf1fcf6485ca6997d22a67a970e4db833e44289577850ee37a233110616f7300072aa847eca751ab30b6ebdc0a4e7b5405450d5d247402c96024bd0e517427a79387418aef3b4b593b3c428e3b340d08251105e26ac39c6c1f3d07d994ea34839c0832a33c0dfba564466443ccfa60079b6b0625d9fec8f2d8267d584ec5870f1de7b171dd09d18d6f6913a845ed684418f598d2902828352d01aa875d54271c4c725071a55e6dcbed569c863fcdcad6b34fc96ccb2d52fdf0f6e56a7d25bdb64b2277fc9850a572e59402d05f78d1734e751fc5ac0b5b6ad31a79b0783b50e36c87b233ff8a0f7f1d9a3f416f072f89a4553efbc8fea515edc249d6d289880df0612d07a7ef532de583e24e4c6463b9e7620b140db87aa04f8cef261f39ef60517d32585bb1529145757f5170ac5fb20eb10642c56993453da240fbb0b4f762f412458345b883e034ab2e2b3fe3f1260d92edecfe6e80f4810408abfdaef63dea0b581eb980fe8919252ae829908b7da3ffbe163f6e10cadf444f5795dbd70fc0d1698e2a570f0b213ffa0311e12c883598565602db6119137f4cf26b68aed6354fbebb6a71410f967034d690522ecf47dec0dc8a50b6e5c7d98b4e56594938b158055fda5389e82218b95f90fb95c31dc6891a500069435a118c98325e0e5bd6a72c31e3d1c8aa223492d6adceab315b491368e2f00ae84ee3b0339f4059d6268edf7031600cd89eaa4a623ca61a192ca173faccb21c0f4fb7d7f7eb81fced078aff8e1ef81d7570f0230504d711ebb5b0f1825cc6194c7e0498f98fbfcce8e7e76dce8987cf513c5ef4a8fb2d4e6c2e095219a9e3d5cee89d09f91be43ad44b1c4c90f8315bdb23b952bd52a0d33cbdf461894674752dee25290b94d03dede4bb0ec0f8ccedf5b5ff1d24ad6a35021fcc89a598797faa17116e3a625bd1e7efed86b4191b7f477e228440e1f6beb00d70e31a8160200ea8459416a88000e6448780937a511af9ef26201b5d265026515bc0b6a08a06d70af60521295546290bb5d6b172f2f809ad8071a4c1edea2962fb8766497f825b337453256785c0886c347eea28d430bed12d744b11318098240b2085435aa9bbdf040edb3b00fca3165e0f78896d5b4b2d47aa5d3ed64715b2501a44ce101ac14e03ae10f432d4b300d1fd04a75e5fbdb2216d5da7de0a41e790c1771638e0f034f8453e00f491e793d08d2369dd1d5de803fbccfd92b227458a60a007f949f34b5542db52f0ae330eb30055660c810c5932616f63c9f72f57db108095cd8d7d9864a68fc70bae6b8fef8c3ff6c761110140b28ea54eed5ca2794f845a038215da53ee31e928bc5d9598119c3a45e1c63b2a8cd2b98e7ccc6e1a0cd5a064ce58b997a172025234922edab0deb64b13d63edf546ae30353ac7b4776e191a2bfdab7b307815d8d7702bee1d312aad9b8a10056940497c98891f6ee37f85c686893ab3fbd63e6ca4253cd12cbf9e84904a85cac54507970311d6a0d3eb1116e2b2d3cd00077f1f71ba5ab39559f150ed947cef4c07134e0cb3b5f92c840e189e05243ff331471e8aecb2800cb9e7f7e02a8e5930be8b05647eaf6d21bb6a2e2dee825a1cc28b8d733304751d8230ccb52b2049a29d0ec78fd615bc02b7c0761a5aed6d6b7914d2b3a7ca85b5483ad83e9c8c27f3453cfcf7401535a39a42524d133c445187b4ddb1f443289b03fbc14fdc18f7cecd7720237d15bdcbeab7bd306d30713f1049e3451141f34e9669b73cc3bcb3dad408a0c2476a0096680311aff4f8614a96f2be719c9fba01e147a8c31c30425d236b086445d5df0a9933b8d86d331e7ff5447d0b90d478c3524f0212abe7e258d6ab60cf3f0ba1b7514187d5f2b3723dac2c20cb9a86cf61d1eab86f19a7dae080bccd059b215e41ce482c1db6d9251b7b03583a24b459033094da0be16005e4998464629e30391788a68c200502b1811597a48522778d9c32a0f9b214c44a614f6f20f7a53edb517274fbaa7849d8b107ab8d67f290588e8f3eee40bf86268f3ec4c764307479f34f98886cd871d8f5477037415895dcd110ec126b570ac68536a8e8ca9509be0d5d41ee6c604fcad0da320a52631310162ae0b1addf8a7600840dac64845eaf2179805b9788505f8096336c6a7e153fa3eba92d98c47d6d194982f85c9e6560e6593fb42abe298717021bd5e93d5d237659c2f2ca87ab7c1b3cce60c4104eb2e419240c2c7d85f7e3e5efe43ee00f6bd4564598bd0e21623d9da0636cb0cb851c5357f6c8804b8d2e92b80a4b60374125b002eae0ced5478d975ed86502fcaa6e9304d605ef56a6e0b5863432a86443e9eb37aa62a7968348f9cf5b92af06c7fd04620c41740ca6d5233a6e9f47d2cd9c6d111bc21d702d4e09723307b04514af9d8ba5d506b099bf05de5a92cf706a41ddc2bba7f7a90f60696c3fcff9a03233c908044505f6f9668ad07c13827e1e3be2e767efc2f5bf5a32b2cec0546881cce7055ab0a0fc7a9f0532ed189136b6dd3d0e907c3ab2d8958fe9ccff5abc6e0833d22de8357d1c7f255bd920c31e3c13e53812915a7ef47750761469980c27de04ba042a63dd448eb1d86a1cc3f9802e045e2afe7203dc346d5d636305c72fe59357eded6c511d3194e116a2292babf76a9d5fa5e28e5beb8ecf27286fc49a548de16edaadafb8abddd3fec25e2a1b123c68dbccc8bd3d328b1e24eee190721729ecc79a15c781a80d3b4b860cb06b74b053b7b1b24640e1cc6b7ac48b66a98e1497f7dac429146cbde66c220e995838dfb857e65d721adacbf4ae312184ff1794d75afba0e9985016d7bd5f39b624310cf73d4f94a84ded87c0fc5622e897d4f490eb6576c719511e4e97d73f1bcb8c1c4010e9c2504337a1145b09ae26162fab079525c753a7d584c29d246c138812348e63725403d2d19497b52487f187949d0058d7a874cb24abee1a596f082bab2286fe179bfe6db4903edcfaf451e4ed415f8d64fa6262436177ccaf8aa6e13484bb65917b912d4f8170a48f74ad451fb14cfc4d14fe8f6e1264aa025599359a224be6040680ad7b251fdf48a8188fc8a3058e62d2ad2952d74ecb19e31bc141ab8f09c7237d3232b6d9ce9bc6a97a2ef31a1a1d709225af0e005e5fef75cc3caefd7ebc4b8ac4ca1918700708f9d12b57e0091a01da0a8fb89a22e4fb8143d101ac79e00e4666c0c53e6ba12d9bb413e2fb01c11e023f657fd8f1646569c44e08436949c5b0593e1cd0fb3f3046e3fdc804b2f5becc2b77abf1e1345a24c1712ec126c99f2149da8186ca7c7b14459dba329e67795aab7b615cc4fa5679434a94fea8203c5c48e99af4e2f1dfec1ea832d167a57857886727c5fdb853e7a5e6d60b653e426a1d53e10b23f8eef3228e436ad0e720d2519284a82c94fd8798dda2c5d580dc71e50065783557e7048fbcfad7a4f5ba7a180d574854d8bac4fea3b089b3e4b9160e27b4561e2a9d7f56ec1aa9d9e1025436ca5eb0b58b7337d1e61f08d1683d5ecda1a1176fa51436cf32d94b7284d2c483c40e263d8b46e705a05e3f0ff183ba74e683566f8124fe5baa7e561749294102b98021daf4c66aa6466cb0dc307e836ddb8da84d1f3f3641ccc143392ba7703fb37430520029864e3b225b153d1844ec87c6a52030ebddcc05f5018edb111617102aecf2156f290d744ea028b45f0052b8c4b317453e7f156d02d2c266c8d5ab09382e3ffdd2860bfbac23d40def7303b425e56cc3c55d1c52e4e0f6ead94347228af0d73c03fe848b75065eae7040f7a47c7c8bb295d653acc64c23e97cdf36f043356469744ff411daa5c88744103a19d493df5afc3b13840b8374c2731c37b313d65d594b8cab0482abc01ea42c1eec9c1e4032b6075b7005234f7ad050d01294dcddc96c9e74f20d5d053dcabfcbea36ec405c678d84ce7a7e8c2ba8ef021163b62a7cbfe7fd0363575627ec44386dd821582a0956ea5ba58c3699624194086045ad6712d6a272c7d53fdba586e859a429b33d1bb642ea2b110435d2ebef1b13694b740f5a6c5c294765537bddeb1d9f8c030d7ae0b0f537162caa535f51253b4869b152dd5e6404d14e65036f0c6d044e3145f110501068ab26070077250ff0a79348c2bfc2b61b81c0cd19096e93ec2b496bc30c1dc97e33b237a147d4999999b2e28808ab3c9cc7266a6f8b29af2622222222293a4c5c5d8faba7ba6a4442cdccacdd2d0337127d137a0f35414cf06a8294f16a82b8e0bdd742109ad00b7c10e0d5f0b18057c38716af860f10bc1a3ece78357cbce0d5f021c7abe1e38e57c307115e0d1f5778355270e1d548a187572305f86aa440844c0ccc8b55bdf7de7b2fd400c30c7b0ce0d5ec11f46af6a0e2d5ec818157b3c717af668f14bc9a3de278357bf040a6063d12f06af478c0abd18302af460f0ebc1a3dce78efc58043e8868a17bac1e2856e36f042372778a19b3a5ee8c608efbd1821425c00d2420c0c41725ecd1a4d5ecd1a545ecd1a4bbc9a35b457b30614af660d04bc9a3520f06ad6e0c0ab59a304af668d345ecd1a6dbc9a3566f06ad6e8c1ab594309af660d27bc1a3680bc1a367478356cd8bc1a368c584198b2021e6e1e062a27325c69f2aa0084a4b071a30816e9346d5381a582344ed001313c507d21f29c66e217972e05745d284d335df90144e437cdf9ebea74931f404e278deb7f99b496260250bd285576218623d8008a1edc26eab8782fb4aed3324c49f7285469eb389c13a7b72079ef8df1deeb5ee8883e8e70c011464247e07184099e88f3dbe5511ae7aeac34caa2fd962cda5f79af92e140f5ba38428617236e208df802014664efbd911145424600c0089a1bdff98d679acece1d5074c9ca0e17afe7bdf7c64e0d4fa4f02408dc26326246f7848a27677f82c4e3e1726278228388cb3c4a2be98d8909d248c17bef47971772e2c36da2ceff0092693dcbb4a02bcb6912c66b624513d2bb706e521b0787abf2563085aa0858159956e2464ce86042c67b174ecf4a59b8d4e651a91e2ee76dc184c97bcf0a42e78ef79e91d18973c1c1c9b4d349e3234ea788f71e958b66c90cb0be69dc53d17ee6b3f9cd3f31cab46c13857238ed6f7ef358de7b2f3c265e2887c97bcf878b274a5cce172c78a12ff478a10ef8f0deabe1f5108057430e7901f3425ee4f0425ee817f222032fe4451a2fe485105ee88b202ff485102ff445ce0b7d417aa12fba78213086bc1018392f040617302cf0421d78e3853ab084170283e6ce10c47b0f87f77888083868801022e2e6bd272f21ba494369fede0b29b982db44534b92245c38ef555648e0bdca011178af824075c5032a2bae78afb2e2bdaa01ef3ded859288de7bdc26925a7070502f84e48913a1235378eff9d0afcde7c81defbd27f34247c63802822356dc5c3847fa7bef0894d011fc2e1c8db4e5ba3932c37befea52da48083876749ab4e5ba19659a5f2084c34574e1f8906925bf048774e1e024c1910f0aeb338da7d3342a7d8ba6c271daa4e3a72c0046b19cf850be79170e152954a860970f3ef860c30b6122e021603942f8056ff32323174ef79b116e74330a612eae244992bc57194008026028efbdf7aaecd211ba2db861bcaed4fde8c4b9702e978aeb44e8fed0cd79ef11190db92e9c9b0b877465a5ab7b2a4754f15dd3b173846c077aac9429b8f6f46c9ed35aa76d7d6dd1b22c9cf6542e11f728eed2a6ee8726b872dc0f7ec3b5a72703ba444138b9361391e69cee74ff1a89d34f3a6e2ba536d4d571be9bb421a72b0a144ec4e17001b848a82bd34aa41fbf693feb880cb93c67d24d2ed18f9ca99f9f1f7fd2d98fa8e33493df5aa6715e4265bff443e466c88f2771fe6bfe73a54c93b83fe9adbb4a9bd7e24d25132fd291804a265e42e520f1da6f43ae4b47b97e94f820f93969bf7dad4897d22e0de8eab48c8bb6e41215c94a977ea2c45d56b4293f2b5d5dcf529768f33797e8c925faf9e9b94444b82038943e0db92e11a7a30069ddd5a550264d242b0db92e11931d7fd23cdca37a76341fae7bcfc3351f1d2699c6a36d1e4ba6f1741f434548081e1840e23449e3912334440ac4f040688809848650c0105d42436c19620ff133c4e83d9476110162c88563e42202c475dd0071e1a0b4eb06886bc875e1dc7017134a848680a1216878170e91211a87db449bef50baebd185f38c8488dcf1de7b0f206285d35bb8fe4532cdca08c571a32ea5f9ae796e643295b28cb26cfad4d180db4c26cd2b274cbacbf416afa50484e2bcff5c95f7aaaa972a2d3bbd5799fc4967ef55efbd2acb00d8a84aef55a4f72aa0aefaefbd181e0b7cd5dfabb87eafda5a974c39bc84d27c8fef5a14cefb269deff1a6ad7da7f154c9c23528dda69934b7792da5accaa6bd4967d3b60ddb524b66a544a7ffe57da608fd6045045610046e3ba25dfb94daf8c5a55023adcb4aa3aee53d274e7070baa944e238ef554dbc5731f1dea379d5125a423ed0c76da2900fcf97b68e9fb4df3aee92e3bd0b2774a15ec7692895161505b0c8b452018e78a11ef0cbd19c701a4fc5e5d280aaec5d5122c48315ef8578100093f79e9217da6105594903e98bcbb2e91389677e5f596abb8ef85c4a2e2efac44547f11d97d2242e5848073c423a5409e55085f7de7b43784c00f0423018e03d9e27520b0e4ea544b5840eefbda017c2c18a97798ef3a3912f6d9df542e8863e1ee781bafff9b9b6cc2074c312ef71265d52822468db61431242369011646a231432226403c977a9ae74250bd73acd440a3208d5f082f79ebeae2a8e500d5810a1062496a84107d12e6ddd9569250b4b88863c7c68c8c08f100d37cf6b29856668c21375eecd10826c8b961d119a81149a61894a89196a5059152c881792c18df77a494f31792d1e0a4af341694fc209c9408077e134e1b84d6444db341fc304dec309c5b0dfd5692e3e0bc5904331d8f02e9cabd3446e827c9621ef65042118ba782f04031021186642213742a1351eb7898cf08d2b72e25c363f3a712edcb643355278efb9f042354608d5e0e0bd77c30bd5b071e1f0d1cd85c36d37174ea9fb4dc767d13e55165fa0518223a7d2c5e92da4aed4b5932e6dddd72e94d65d9de6e22b07f82053b6e9cb6bd1f68eef1acf1226beb4f95c3d3be1e0ec536ad3a9a208b93005add39bef4a32581982068f2666fc3842119800812b45bcf75ee80c213ff0017162842a1eb78938573a19e1b8bc500b58704648dc7757a73713ea3ad2fdf7fdd247b0e3bd4a008f05d5944a88055c49925c5b8abf18416448166dc4954444b88b004446d70d37240004b86eb821413ecb28688f46222e2b19e932dfd337cdb912939c269956eada9370707e94f8f9b9bec6af9c4be433ed864957d29ba6fd2d5b3a1f5465e3b688782eaeb46d9a5f5cf75a3477f54c6bcdb4b58bd35bf476913894ceb86b6bae64d21d7773b35d9b2b69d4d5759e2b91ae2e88ac44e2a5cd9f3c09e545a5d375f21d133f3f4a7025ae6f5ab673894c1c4abbb29c4b746da5adeb3c133f5c89dbfc941f257e89c4b5bfbee677919413a5ebc2b934bec5675c4c292630265274b28c4c26bf45092694d872dd98baf6245d4403e2bc961250a669dcc5e55ca26ef2a5af77aa48095ad2fd14a0d2124df3d19d6692d3693cbdd378349e9e55d9c1cf4f25e5bd8aa782f25e75c47b9511ef553bef554fdeab9c54d87b1593f72a9df7aa255511ef5544bc572979af4af25e85e4bdeac87b15ce7b557eafc2ef55f7bdca56f4bd6abe57c9f7aaf85e05dfab8cbc5789deab8abc57ddbc570df1de83a984786feb03c9137d9dde47cd23717ad4b557220b59bc2cd4e003113fa351e781fcd73d419bd7a271aec4440a2cc0c2e9bde743d056da7d87d350320f85339972b8207f04eab43de938edc9a635d97c964d9f36dfe92ba8d3f6c4673b725699d27b4e4ec7c5f37426266f4295361fcda70365a52ed35abcc953e19e4cf15dd3d9e239ee4414274e4c3a4e43d19d66e2bba6d3f99e5e62a2f17053aa749c86e23bddf558e1986c7e0acf525a96e5f85eda3c909ed2bd49678be711c9790165a5de378f12c919e4b37441fbfa2142e466c890af0d71d19f8b2b993c69d3feb5699fd33bf328ad7b1e8d67f37d93f2a5742929d94e4fa7f10065da76658b0645d37cb8e828ef55329510cfd4d33b8df2543adfd3711a948e4b31e97e8bd6332c0a5744a10528a060c764d23a5c749453a9e3fcd5af4ee3c9b4eb6ba79447695ac77389b21bddc371fa120599328dfbf9e1523f9bfeb9b8ff35dff5565a72897e7e525a1205b82e254a74a7995c377dbb6e7a909c4aa41e948e92e4f29bd6f578541014d77569d9cfcf0f7601e0d23a0e75d25c7ca6b5943aae7dd71dd7a5b4eb6b22ae2b65291f2a50b21dafa564ca41797f440f5056d29e09b7898c90384dca5238384b2063095cbc77e1fc5c9dd6744e4b102da146097528010edde93e1a759e1b8d7ae6b991d653dca8fb274a5c67de024938c27b03c84adc496f1a75e78c252e88d3dda6458152ce2d9a4adfe1e27ba64f5a8fcf341e9f24d0c0994c7dbcf75e1172700428d58b55550f0b4190600412f4d1a54e6abc5705752a69930e17544ee77b9ef81e2e65426da99ea0d412a0acd44dda13bfc305a39279ce7926da9b7480b212a79974baef509ef31cd4697b927994149d2d9e0775da9ef8eeaf482d3838d38ab472e25c4e1c0922284104fc7eaecd934184191d1c9c2f86d0719bc8c8c86f1a1f6d4f507af3e1bae734141fdd69262612a79f701e484f117157a6dde82d95736d5a93cbb44b5ce6b94b97b26c1a97e232ef398dc4af2da5257189b84da350fa4a756d435d4208a1b7f8259788431151627289c600021c4f03c21640c0de13fdf41d8f0af209f247fcf82c9afbc9b49f4d7b13bfb8ce036db9348ebb3a94cfc2bd16d3d6416c5ac7795277dd7057aeee535d89e4f70594957ca9e3a5939669dc9b7cb84bc4f9af69db94207f4467c205f923341e9e1a3da0bcf73a6d1bf20050837e353d30e3bdc76d26cdb5f752200023020ee88190474551148b98b4171ae0017d3b78c2d3beef20c9dbb2d2b545337d5e02d2a014c943029e1bc2bb428d0ee87b2f0befbd0a0b0fa274c79d4a9d91ce734c78efeda1042bb3f48b0a449cefbcc9f71d19308228227345049469db96cb9fb49e4bc4ed147769d995e96d890c1625548a73edfadd7329192578788121a6c76000460b283c81c89011571205f92c23a0ace4c34b1f0fa6ca83c16e12de7b48a099811294e9aebdf78ef0de334211de7b44f841086e40df7bbe6b99dee2793660832964259315346cc085688957e5bcf786f0de13c27b0fe60725a86a70849a1aa05e50a635d7bdcf3493e74a974807edcb6fcd9b78d6142f4bd7e9deb5ecf2a91f9fea3edb22c5778de7c76f3a08ef3d20fc400545e0c1e499f0a879ef074bdca1c58973d1a78cdb7c89e3383ea2411eef65a59e2d403ea29f4e337133e822d232a01dbda5f40c8c98c190f780b252a77996dabaeba6cac0083f9d66ead1f9e14a5a4a7df3bda2b123ca7b5c89f39977c280299a90c1e3b4cd3f61eada9b2eadbb7e89c45da983dae181f71e9c4dc8d336456f76c000d5a105b789bad469778d4b9114cd22dc778d1709ea4a9b46bdbc57bd07430714de1bdd408de7fd1f69dd880e2ede7b9ca9a43bdf47de7f3aac784ffb191ddd7b8f0e24e8c0ef3d2ec86719f94ed371bdcd67d9b42da3ff353a6092f0b8d11c763cae660e33e6e0e2cd81c51c5ce6f819cd31e5cd81e4ad214710e490e3bdd7479d66e26ae428438e0c5c5ad7f512003c17de7b971c327023a0acb419f129277c1f71af25a68e1890b1f9ae6464e7bd8742fdcc34010332b84dc48d368fe2a5ce9f70800757e24a9de63aad6d5c9fae233f5cf4c9e6427211e1a24f36469c18622a797e19b99cf851c00be678efddc0067854a99a38bc78dc260adabacc1b41e9531c3ad4e0bd47830792ab974e5511e0203d5257dab4110ea56d1aafb2bc3185c76d2223538b11be713d3c52767c7478aa1831422227ca4864459bb2792d97d67593e6b9d216eef25baecc3f5132755d69db74e92271cdb56cbee79aa2b78e0bd693334ae1e0f0d2e6330f344261dd6755b847715cba0e07878be2052068c386f3dcf602d37bef3dee513d59b8e7e293857b92ceb66159a46028bd6d71011e170e4a6f5b2eadd3e1f414cefb2659152abaeb1180a9a49b44f1e9d1d97c329f45fb786ef33da87b9ea0aeab7499efc961811058d05f960a1af9ae679e6383882a7e4b994aba49cf7c4ff7deb4755665a7d378823ad409f35474b8ae97f4683c3d5b34285c16ae41e9e93a1fc537e9594a6bd2693c59b806c57355b29d13e732ea99e7d6a0618d9a0ba7e37c9f61e43b2d53a34811d9ffbf191ac15e6a4f7ded577e3c212d924602d220a511441ad7ab78788f0a687c81d2a730d6a860aa207888de7b4f38f1de167998c1c5195378a2cc775cfca5f194008e2a4a8565435d57d0beaa2cac9757d9e0bdc7c4ab3943e6719b88fbae653ddc6b19e1e0f84de32314b7843d92bcf776f05e1eefbd245e4d193bd8dd97b68e4a112cb27b115fdabaf728f0d028438915bcf75470450ad8502305dd6fd1b64ddbefbd34d038c38cf7ca48c1d37eb6d37b0ecf16bfc5f3a0e0840226efaada40011926dd95b8d7925d287d1a89b270bd7f7e2e2e6b72893aeeb74de398f8e1a2a3fc28e1b7ef224e43b94437415d294b9d4e1a1f72c36df14d34cda7d378b85910579920d503110a9883c9a3611292038ecaa202c5821c362e88017e9d0b1bd040063260c57b0a50c002a840000236255d0bef95a210a1b3d275445e405c99375df04ae2c39579530dc131052d39554e158242123e4820821f34b0c402584c795688d0e10dce9bf62e655dfb8dda941b75482d239c118a73030a374e6e2c41e4c2b96eaed1f7db109f2d9a0e8753dc5be14aa81cae84d2409909752ab5c144958217e4f19c287941cf538284f35dcb5c20c71b713e9def79ef4579ef15e1821fa1162480054b7817a840d501a0ac5405154ef84d0b1b4caa2fb2a07c9795b8ce5fddc7a3a4683c95176d3ac867b9366dbbf9f1e3c70f20995e12d46da554ce0a42a001152421a40614ba08a9c1bd0704146abcf76c2a04d29061d4850050a0417a4f779c358037ceb843a6f41e1732838cf71e243d1b3368dee352861aef6965d494717a5c7ac66d229a2d3e8ba952806c899b9b244a925c44b8f4d290ee7b2838543629ddf750aeebbab225a0b8b8f4d2c803753f7a820b5a1033c61449900c7165de348a32833198f07cd7b231d4088df19e49fb1ebf4de97af37ac36aadb5d64a29a594524ae99c73ce39e79c524a29a59452c618638c31c60825945042092594504209259439e79c73ce39638c31c618637cefbdf7de7bafb5d65a6badb5b5d65a6badb5524a29a594523ae79c73ce39a794524a29a59431c618638c104208218410c69c73ce39e79c31c618638c31bef7de7befbdd75a6badb5d6da5a6badb5d65a29a594524a299d73ce39e79c534a29a59452ca18638c31c60863c6d7563a6534e96ed3a29c769278ef0de085c4c0416fde8811be711a8f2f31e9a69476658b66f24b74fc13dad6e43debcae6495da76559d74bdeb33e158d87f3ef3dabbf67f14c2b55f1548234946de9f7ac24ac1fcd758e6140a54d87db341eae43a53c15ed4b7d6b2ec5f52cd5a4fb6c8b46711d57f29b0fd2a6cba4b3d49569225b673b7e4b75a9bfa5ba7d5da46e2bed4b934499be4c294e5f5b9b44dd77fa085089e3c015deb39a78cf62e23d6b8917e2c01d4abc67d22927ac2490f099c6f39e75c59fb49ef72c2bef5955deb37c7a98c0b0ecf48c98604ca4e8f060232a52a850c14618942a4ca44419219113050727f359341f53aa6b51f0c9773b409aa9eff8ac0494613a5d542132e4bd57c998b62a0c2e3ab78982f688e3348a084b4997e9ac742a6d9c2bf5eb94cafc89d35b2eed095056ea366de75c227f6d1b4882b5830eef71ef59395838dcf01e93ee4dbad34d34d7b9dfba6782564b3560452f6956b40e15b471aed34c5ca7997aa84dc13142a1340ece08c5e558abdcb82ddecba9a26d1e4bd0922c674b71ae6539252d252658c62a345b602004efe1e08c505c066e9082011a6e1375a58d651c719b47993c09cb98ba8005a4e8bc67c1107acfb46d18d74ca61c0b10216481295ad4f17a4a51a8086941ca228c77f92caea0514682ba1acb056ef31d97a2720179ee22751a75994c393838ef592fb8f01e0036181db200800f315ac45811aa00170a4861025d24a0045be59317eb92402781ee3d2e30011180c2ebb292861a454006ef4d915a7070949038fd04091017a44dbe6fd1ba49d3f868238d4ea90c0b3b1e16501e90c7035af0e44c3de088f77ab6665ad231df699e693a38383a1c083900bf670171851defbd2bceb8428bf7de9504c975e1fcfc5c1da7515ababe3803a6b8a2c68a095851a5013bb068ac991347c287cbe9fee4bb9d93ef76b8ae74850124782106fce430a026b400369e48932e9d135a4015ef3d11b70023ba9ca905b45085194f6432f92d9cbe6e762e5110e79754c123ad6439d18aa7a2002fde0b29c086047c20014b7820a01477dd709ac4d30493298773a528de3741401519fcdea3f2425454f1def35baad3fe5f3f5c961a69c99279dd65fe54da8a04f92c378aa8081601d24c168c65bd10153f5685650a286cd1db14c9288245b22ddab6499c2685a6b0e37aa1295ea0fd6c27c88442e5784e93a6f87038386448415fe93af233dab4d10f892b65a57f2de13611d7954e5878ef555778405969eb7a7070b8ef1a9733a584e3b469b47914177d42c2459f3ca7b712395348b8e89349fb7441c1e3369149e31c00044f241205d17953a7fd06c499bc962b3826afc59b46389c261921719a640028bcd76d1a89bb34adc3f1dce6b5f8adfbad49e6b3685d35052e484ff1fe8fb8208de2386de206b0b49fed44316929417a0ae793d078420438428800450811e08ef7f35e058527bcf75a783e2f44801f6e13f5235030e13d6e1365a3cd77a5d1c9a33823dc6b09417147080a1e8484f746244e3f51a20489497799f64469d3484a463838beb47523143702e24ebad39d47ced4962e2653aa89c603545a42eaa4e84e33619245ca153953da343269da1e71262544ae1b9fed70a921ef759b574224e7bae93b48b8b74244ce1477e23472e2d4392e5c0b40f8810ff4a87ac083d0167282004ebcb7836a07efe570a5289da675eda9046d5d869974d79e4aa7997afc13a56c0775da9ee860a8d3f6e4bd2a8f4a0739786fe47b94d08118f2c083080e18410871848103244acc2073001a140009a1a00e085c693c61654f48810e0800821940bc80002816f0018b162405b620838c224eb0a10236d08187184c0c30031f0624e1818c0d4259159990d0a9a6c2a39a4175c77b150d6610caa24708de7b220beabd2c36bcf77ce0aa3adeabe898233400d37b4baa24da76f9adf150a14446144a5c322874ed6f422426749ec34224dd692621a030424037a19f8451f7dce63d909e929580423fbe57c50006af8a23032a99b47fa2c475292d484321e23d2674f97933a79907f36092546f868baac784aa99f742154343e542452361ee7b99000c0f33160d4d0ccc4b55bd1a2cd1b35e25001822aa377324e6bd2053bdaaaa6262a815c47a5555bd584faa6aa6b2aaea45e609abb2aa198b062a552553cd3cab6a41f462c9c80c017255309605834505535516902a0a56f5e3c55430d68bafaa01585565d154b172b02a4b06c6aa906055958c5509a0aaa1aa5e2c1a17c4bcccb850d150555565656b069a976a8bcaaa64acaab25e46950503e407b584544a68aa189b9724d58c65c1c4172096551179c15650c0c4204d5ea6580fe6591da8605e86c0c458d5cb8ba140f583ea59afa6a6e655af82a9ac6a09158d254455593196f55255b33252d154422ccbb26474aa202c0bc6aae08b28c80d3401a85a8001072b8b2ac6baa182a95eaa674db12e2015ccb34a32effaa9ae78793eb8a07a45b861bd543215cc4cd542f5a28565d1e0bc54f8a5b22c98cb12f26348155355331026f6002b0b880c8d555555355355389565e9e045a6fa61c1bc68a97eb05255f552a4fa11c4aa68662aab088b078b076b8797f7f2aa172a19cbaa5a80a97981b16eb02cab92a9607ef5c3a60a12635531950b37076b6726c80fabda344266ac4a00154d55bd58154cf5a4dac1ca960e56106bc68aa95e2aabb22a9c6a072b88350353bdc4bc54d5ad5eaa21d58f4a485555472a1e2c202f33150d4c6555154e55c9d060c950c158550c4c95ad20d58bc543f5f2625930164c952dabc2c10252fda86860acaaaa70aa1d2c20332f150c0d4c5555f7aa6c108206c9cb1031d54bf5a382b1a1faf10327881239f0500100a6b22c196bc6573533c0204faacaaaacaaaa8abc99877a580e5031218925bc2b892e8a6047123e04210957f40f4650c5077a3c1f1f72f07aba9081efd1753c2a5da8b105151f342902e862004c98a2691150bae0e1094fb40e3077618391ac5d00c1f5410b36d7072095f5418505fbd38706ec958527fab1020f457ec2b06ef40043bbb9a010437071b3470f3f97901eae1a60785cc4c0c4fb8981c0bb60a678151cef5dd943b84d244305102062d065e6c7cc0f181768eccc8f971d84f844c1f303cd101920341846c80b158c109911cc9697165e42303798e2025d645cb0667ec0dcb4b0031e411720568474981b17a2b0680e3155602a19242de892040a93d014160c10182844a4d065085208614714550c4ea88722a2b06070782982aa7c501233041e5d64647a9842c50c2f2c41c08b932814d0e5861f5784c8204486279acc80a2e180f0d10549f7c3c94f046a667ebcb4109305660156444103e382cc0ed50b330a2270e0871035a082660a59b860058929223493618ef04a94408a1862860069022400324bc0083193a538a30b27527ce00134d4402a5ae05018f0822e41521f0353b4205fa8ace8f07264e6061b0590992c0384c68597bbe3e46507204df8e8026466a7851e9a2739604d80fc7822a4a72339a34b0d303716880c4e0c2dc8000982fdd004185d80d03ce16137a04bcc4b4d4c25230019203147648450b22448ea4710344f6480ccdcd002931f36303c3f6a90418700e040831034431c4125005100a111cdcc16e6dd99322304660687189c17fb43084c105711333f6680c018893902061751c5e4f0e2430c0df0070d7fc9d8111b6880d0f0e346a1c31384d20c81b181b191f94017215c80611233440c0f3f6c60747821beec2045179191eae5bf1481798981e2872624b0022d23c108ec60a30424f8c0170c384001b87059bee73f4d2c8105092b557aa64031e2090e9e43020004002e1837dae8638f241081082540fc80c30d335ccc218707c010004604ce0e33080922f30235d01041181ef8c28b2eb8d8a2ca90208c883070019f9e3eae00858d658f25ac31d242117840e92b390264260c0860717fe0e006628481936d0d3204014233a3430e65a46009dfa5f018b1d304d3800316a00018f4a82a20c1083e70802b56aeb541061819d8f1042b4a92d81f33322648001a27e0400524d0002836a0010d3c400a8f92234108a9acf052056b0a304cb8966015018608960f62f4a87260d9c0aac10f3c84dc61c9c0aac352c332c10b09ac2c3003a86caa1e687688d1a1851bac1aac192a194231c4c06085aa1a1817ac203140ac1f3434d6cc4c8c0553bd5495cc6be185971c5e56d005e68a2e30506484b8aa992844510346979818213301c84114305d44981a847c01021906748181f28306203ad83045971f49c06079e12148272384a6090d9601f272c406203131e842634617199688e2c77dd9c209427ad025a68f2e314270a8411721dd0f2be8f2c30617ac99233146622650c50c416ec8420a182bbabce0c30b3ebc140919a1b121d487143143d0e019242f2fbc20a1f9a2cb4b94684406884c08babc0491c101e626487ca96084c0dc00691233c44c123238c800911980101984c8f0c3861f34cc24f182052964707829811431707401620030a76b04c40e3038425e9009c1542f455e7460a608a941c69ab93293c30c4fcc0c2e5432415e626084bcbcbc582f332f342f3f80e800f3325365068617a60009cdc8cc542f333014c6084c4573c34b0e51fce82106045d5c0841142119981c68984801d303297e185daf8f2c1001073790811d71c09102ea810016d81222925c2ddb63094682a879816646092c5278faa0e38e19f4f000a84516455ca00736a8e38d35ca2081078c8802508154f7006e8b42139890071e77b481820318a08925b0202185c749931e78a8810635d2380009466080028c76d041cb7a70a1073c70e2d4a58f2c48818f2594a88186900dde7083056b949102133cc0010b183591c415293c3b75d0e1c61c2ad0e2890e7250c71b6dacb10230be680002a66802136c80c71a2b50e3045474f17d070bb5c0042104a10771b491061a648801812b7c1f35b184125776b0233844422dd441471c5b60000254f8de84113b4db023382eb400f38410843ae880811b69a0418609c4888003a860c2889d2447702e8d446008c1bc3e8410041ec0200e37da48030d138811010838e00a2a7e30626209228c88ae60052847bce0c20e74c0c28a0620710572e08a06047111c18f3e5eb2606121c60a5615684000f3014b0ccb0395b4e20bac44418abc0cf172d1d083a54395c30c0e2f375436c0d450d1f02306186078a9817941880b352de020e486203a0009fd98a19199b1646462625eaa870390257a9795369411df355eca52334be025802c612991c7cf35e4ca4a17570adaf4a649fcd24a7c40093094d0e2bd2b09926b481224971224259878efe7fadad5056d26442291123b4f64707831477e880902cb0d36df751a6564eb42582880a5cb4504cbc602e55d9deef4c585b0dc5c5c7cf749542189225c9bf637521266709b6823f193ff21c50f28def3a9ad7baf4a830d23494c79d51bef556ebc57b5c146258497e3a5e4dab6141722679c6fb6b9669a679639669833c6f8628b2ba67862892386385f7cefb5b75e7ae795375e78b3c5f65a6baba5765a69a38536575c6fb5b5565a679535565833c5f4524b2ba57452492385344f3cefb4b34e3ae794334e38b3c4f24a2baba4724a29a38432471c6fb4b1461a679431461833c4f0420b2ba47042092384900bf448c890ca8c74a7cf8412406e8600195280ab001714d77503e4060814d7755dd77bd50bdeab5cf05ed50236aed871e184e02701579eb842ba22e5e7e7c20172f3f373e174df9bae0bc80f91abfbde34e4274992243e542c60e3ca0d576cb86e8208220b13dec3b132871511bc8b2bf954942555bc2712655680ac2079442e2448ae38e4b202df7b3fd8bc97d9f0de26e4bdceca7b0f2e4173c77b5c967855c8a8c2c67b6f892a64bcf7c3fe40a80a12556eb264a58dc45d5ab7857ce278af22e3bd6a8cf7aa13bc44e1850895094a5091e0bd6a04ef552278af0ac17b1508deab3e9081f75e9517ea21a3a7043e3fb811b789a62816b99220b9deabc478af0ae3bdca034264783e2ff47e5ee839f142af002ff42ef0428f8c177a68bcd0a3838618840079afe6046dbc9a13e8e0d59cc009af668c985733c60daf660c205ecd18f5d58c41c4ab19a3c9ab19c30a0c428260f16a826ce005374269e3e30428d354bef650eac45d55034cd72d7ff4f37aee3d176d8948d43d176d5b8c0736f1ad1a5acae3ec5b8a442291d442eb1db4421af5d7f2ffe9a984dd738dea09f247886ea43ba8683029adb063096d8f5ec34bbad193b8d6f1a5cdc7a4b90645244a8944dc6b09f2479038fd44c7c656a96df1f159b469c912265144a2dd47363e506cb025beb4f98844a25ae7cb06aa1960bbdf8fb3a451d77ba5fc32c0fad5145bfc23cedf665827506a7b264da8d8d881c138eb95545e9eb9c63d4a2980aa0e0ce67eeba7d86ece2dae9e0e6cd27d3997f96b9ee3b57c0e0c428aa3a5f77e0f6dd7726095c30eb5c73efbad2fd631c026e5f45edc63cf387e7a61806139f9b6515eac779431c63830a9bda657dabd31a4397238301a6fbf90d6a8f7ee79ee37301e63955777ecf9e49d639148c651bcd38dca0d4c728e25fed35ffd239d93c634aa363039ad8415df1ca5ce5656aeabf2572fc0badd144e2c37f6995fcd99a85c80612def96f5d35e2de6d2926e8409a85a80d1fc79afb36efde18d5cc6383aa3620136e5ef16fb7d73d7f1fb6a46c50676f1fdb7c22a29be5d53bc0696abacd8ce2871873befbb02ec761eadf637dea8b78c28a85480c5ece3cd5afad877cfb2db5897a8d4c03ebd9d6e1833e658cfbe4937a681c50e6de5d9c77f65f6fe926e8cd122a04203d39e564839c5996f39e926dd08e52612c54947750696259c79d76831ac7c8b4453c2519981d57a319eb8e73e3d509581f5c8e3fdf3e6df6fd49bd75232f97e6d7c9c4c2d15c61460d7ea8f6bfe71637d65d4a41b475a37f2379e32953c58463c150a304fb3e610465afbfe127bd28d344ad0d66598482412894422518c58a8c8c0668df1f3e961e533eafcab31b09bfdd7fd4b5fada47fea29149f00f377da5b21ee764e6ebd370106a9ad3e7e9df1e55ac609a9d8e8d84001d84c8162734da85369e44da85437b225c072a6f64ace6f9f1cda0e3109b0ba63ac36578b2be572ffbc816a0458bc16428c7dc4564b6cb78511049508b01f35edf866be37f4d657d28d9d8e8d4824122161a36313a5c746e7d471a901f41cef9b740f9b5085009b5c6e386dd43252aead25dd88a38d8f131060dfc3b9b1ce725a1867a49706d50730efffc597dfbea7a43677d28dded44ba34cbb3bf0ca518981d9fd39fd90ebd937d43b926e18989efc5ebea9975e66593de9725c74141b1d9b4c8a8d8e4dcf4a47d8e8d8d8e8d804f9236c746c364fe2f4131b1d1b1b1f283618a3f469d47d8cf54e0e541ec062fc34fb1ab3cf594b0b45508121e9dc137f3e63df3062d28d262d1245cba5ea0026fdec937bc8a9a43d7349bab1dae8d8e8d8e8884422112f8944f803d51718cd534e4f73d476cb4e3de9c6a0ad8bf146cc83655444e505a6f78f9bea2da3965ada93ef7644221b1f273639363e506c442293499f7a44a239c1a8388059f96fe499c6dc65be18936e1c8da4346d9d551189a81c41d505463fb6d9ee79fb8cf85749ba116b5171816dbe7bee146e68bd8579926ee434d4d440b501ac678d3e76a879dfd15ed28d5bf436f2fe8fec179506b058afdf3b766ca99d9277d28d7e43496c8b6a0b8ce6cb2fa6dcd27f79bc957463a6612922119745d34822d18d5e5419c0a2b75663cefbde10fa2949374e99a345a2c200c452de6c63d674cf5c798ca31883ea0257560de3f714fa6da7a5169079569d6bccd35a79a7d7225a1aabfcd36eb8b9cc346717545968eabf8f3cd7f87594174718ad7ca3aac0d6146f9a7da41f629c6397792d33e398828a02f5decdbdef95eb3e2fdd22914874e25cf228d278e25c6609aa09402feba6d6ff696bfe516fdab66110c651b455b6514940d25bb59c10724a7bf759c7460747a08a00b5feea3bb385735b0f01bb2b847a42182ffcd04b2c62941ffb3c399f5c73efa750b15962a363936333050a7540f5002cebacb8da8b67c4964e48b3e8a4c5641261ff5f5839cd77cefc6d8d1e15d4f5ba695ffb9948643913ea54aa232b2a07547aa7c553fe5a35e9c651e781aef6b39dce3b118944221f27229128c37881ea0acc6addb1d69ff7cf2fa4db0a4c6eb9ad9eff478ef5e59674a3f75b378ad1a3827c248d78540dc0aaed5c424f31e4daeeeb1980e94eb9e7dc6a6ee3f4372f0093506bbb2b9415cf4e39ae02c395fe7ae1b514c6ceb9cc624aed6ce3e3c4a4b34d0aea54bad1567c540ac06eff596a4c65d79eebdb138079c82fe6bc46bfa5ed1723009bd4765ce5c5bb63893315d8fdd17aaebd87b75a0e2de946a0acc46d29eeb751f4401db3f17162f3b587a26363c546c7e6081b1d9b2e154524da7c964d9fbea7e2bbc6231279bf755b24d24ca627304adfb58cd618ad0c5453607176c9e7e6b4ca5b69df36bda66c786cf64cd9f8d8ec9ab2b19707cb48aba4c0b4ed91cadb69ddd147b84d9ab631962a0a8c7badf79d57d7ecbbc69edaaa0ba6bbd4727f6c33a6d95b395337890360f46e0ba5ef51f6aae3bd06c024cd9f663cb5cf52cb5a0b804dee23b5d37bfee3e65c24128990a89507cb6844008c635daff4736b0ff7e5180a2c4fcdebde3ae6febbff9674a3d62d7902e35aee88edf7b84bcabd24dd38a3751284cd0ce5c775df0e65ceb8926ef45dd0ce5d0a95edd41c2e18a433feea6ded765a48e7166c7e1db5f557cf9be5f65a36d28259db31b617d21daf97f1a7300c79c532cedfad9cdafa0edb5bfff929c6904a1babe7b0ec69d652577fa1ed77fa0dbbf8e3df319491d61fa17702ebd55a2d75bfdc420ea14761f6539bebe472770df3b66e4dfdbd527baa73cfb06bf39ed4de1d7396dff613f6f1d7f7574ca9e59ace6ec226d4bc56db3995134fcbb3607d7348fd9cddee01603df6f9ab8d755acfa5dd258cc24ba58db7d3cf7f949b84616ba58419c28a7bde5b0361b3c7e8eb867163182bd51feb9dc2c9a39c9be6fea5f6d89679cf5ea9b41e7f1a75c7e695b8cf8eb397fa4ea83946bf9cbdc2c97ffd52febcb16c739cb5ffa9fdc490678d55c939acd2ca0c2bf43bff605eceb8b7a7d3fabb23cd23ac76be6fdd98e3cfb3d6b809aceaaba3ed7aceda6dd498094c53cfe7f73e66ece3fc7709acc28cb5ac95c7cf3bde5709ccfb9a77f6d45f0927b7170b4625d5126fff7f9ebf779b04b66584d0461e31125896b5f67c6b9dff7e7a05fbb052c861e5f9f22ea5b5825d3d6bce9757fdb9beb60af6a5bc57ef29a9bcf6471fcceb5efdd635726b7985b507bbb1d67ea5a47e7a7d37a582d9fa67fe5f4b2ba3e55f0098e479c26fe3d514c7dca760ba7229eb85fb6f29f39e52b05939a537f7c8a1f7b27b1eacd77c61dc5ecb9c25de51b06e25b67fe39baf8fdf42c128f55cde09f7f730fa23b049e7bc795a0bf7ad164e23b0df7f9dffe3dd7196f0ef60b3ce0beb855f5a58777f82796931dd934e4ce1bc5a3ac17ac61fef1f67e4d56edf04eb9677ab35ed98e35a31ec463929855676282f132c5a1be58d5ddf9eaddc3a988c394bb86d87b4daa89760b8deddb3cc3defbf35cec13aa67a564a798451c61b8bc02c84345f29739416774e0456e3e7bd76cb238eb16b2598f65cc2bf23eebd7779936031c77ef9de507eefb545827d6bfb8438dfde218f12926eccbc69c4bd96518e7534c29107cba8c9114cdf9db9bc796e9a25dff07f2d43c1c1f6f5324b7b6f94d1fa3a3356a7cef842ba61aed0e64fba7134a3b5917b2d3b18dbd5d2ee2bf7b0e71d7f26dd3892d176a73fed3d69da08681b8d682c7671dcba6fbb6fdd5cdb4cbab1db701115fb15d2dba1e7d9ff093727dd38ba986216c76c2fad7be28f3bfca41b71bc13cbfcd7e8e3fd314a3d6f26ddb845db80a2945894155efc2bad9e573e2de9c6ade322267daf7de3bce78d17fa49bab13bfd5c056294c7ba29e734e77af5fda41b7ba6475a8ff2266104b3b46ee8f9bf3bc32d6925dd48e252a8d1a6fd91cdb1d1b1f1b1f18162c3bd952d9a4a8eb7f26019411161b6f238bfb494cecb73ada41b374de223e8bbd2764524ea4e5f24f29bc6af74a9d308561e2ca32b45b0acf7bed2ffbe23943073d2c5299b26546c6c7ca0d88cb2d2955b879a7ed338e5c1324a7283f1fb33d638723da7bdff926edc7c3604467d8e74f62e65f570634bba91ebde73a3ce03d568e3e384d33650a66c3cdf525a0f15916874d27aa63791b6f1816233a29907cba8aa42881197da46231c888c6c95420cd974174410370400072084b0c101003cfc70830f3a5c437af881871c76d041071e72d8b44ee3f0c30dbf4bd910479e34d2a1066a77a0818bb6a5e361065ba50c58c691f459b4698f80b21289d3a42b062efad4030c71a49946405909084833dd10ba6a7e78614217b8205a909da609e9da6f4382dc00e93c50103f2227048d843323223241c44800c0c411102ff2a4f191df46a398c55689e29ebbd6902a8e8246a351c7c503e0e140470d6758a0f2279dc1d470461d4282bc37f2d023c78d9d274e9a604c7496e4149104c9119c8cafad74ca088d888adc0c21049121410400081b00f8605d560f3cbcf7deb3e185a830bd101579bc5411e4bd81831be4bc2400cd1183f75ed50024f4f71e50d6696e64d2dc26e2e478efd1c4e00837e8e2084e2c185871bc3182e38df736cd0836d8848aa00021d404218ff72e9c50102e1daeef488a6ddc9a6989e582d00f98c8400b2c16b0e1032c5e480f217041598e3c71243cd095b2d25f81a974c564cae959582ae85e8ac994f39ea506f79e954696faef5968f452181dcf79cf3ac39b760988a7fbacf47ddf420b6ac6c365d818a4b70aa4e03d3983f4b6e570ef59639c40a2f4e6d3f39e65020b84f1ac0a94e07151c8c111a49513e732ad643ba6bf7559159329d5c4b475a7f17493f6c43f51ea61f29e35826ed350da96553995b449c76b3e9cf74d341e4ca3004a6f3efea479b86026ed99683c59b80645e3e93eabe24d5b6b3c5d8ce7359e2c5c773d1cf69e25822c42f09e0582f79e55810fe89c38123eabd2fd7b96181605ac304ca614cf7b9607deb3c0b03aa0fd6c87fbe23dcb0bac7b1fed73c0caa28b142a0b1e3f782c11c2e3ca7b72f69d12b5d606827c96f72c0d4019e48fd84277babf676520c81f6172d24d25928e85816ed3a8f7ac0bf4d296324d79cfb280496fcde4c4f3926685dbfc3ef9285b938ed31e4a973325d3241fbf6951fa4e498bcd6729655a94f7ac2c3093e6a58cc4bd8f892b017928265de2a59e32c273992f95b2d2a9e7046d294efbcd6700414bdeb32af0b26c5a93a025faa4b9d4113df31de7af50d1b8c6b52bef591498c07ba714e6378dc4699daca4f1aeb484f39b7f129190484c24281215098bc44502238183c3c9a90507476ae1de8a12ed673b48b8b7b26959e9e44f3ad39dee4a4a2312a7499bdf7d070767f3a81477d232df4f5ac6715c3795ae2841c2bd951250966a92a57edfe13b4cd888bb4d4f09eada926ed3a8be13d4b5254a94c88944ce2a1d97693ad70d4e21c132a6702ac867a136d54b72a6ea88c29267802a5a7807a8c3e6554aa89650e5a052a352011d0480c9c102e8a8792f4cc0fa9e5dd7b86bdf03fb50d66db79758dada695f0216f19fb7c24a6db5d9d2ae04ac6a4fe5beb942afa39f3d0998b57c726ca5d433e2ea3912b0ede3bf1d77ff6ddebcf3236011c25c638e92637b67e746c06eec7adfeb39ee3572cd8b8071c863ee9347ce8980cd9923f4d0634fb9e7970f01d3bf43dbbbd49147092d1702f631fd1fc29e31ae3b531e04ac620d69bfda7b08399f1c0818c5be46fa379439c73df90f30986f879efece65df78721f60b97a1ebff637facfe7e47a6090e6dd69cdb76b1a7fe43dc07ac45c4e5cb1b5136ac87980ed0f618411cef961b790ef00e39067ec29affc4719fdce03db985fec25a5df62e8f9d601c66facd352087df531ee9d038cdf6daba5d3f359ebc61b0718fef67b0fbddcbe4a8af70db0cfa7b6bb524979bdf56e1b605a7eae39879a4748b7dd35c0b6d5b15e593ddd78605c4bcab7e41e4b4937dd77609b53f977845ef70c2bdd34c0a895d9c65af7873beab96780ddabbd955e5b3b39a773cb00c33e46def1e5d4ef3fe7b603ab3366eff997905f29e7ae03a31b469bf3af927218e7a603eb9bd65cebb5375acabd9e0383f4622ce7cc56d799bd9603b31efbf8b79edd6b38bd8e01966bfc1c5accef8df66f0d034ceb3d3dfd38ce8c7fbf3a0eec5b4877bf927a8f65bf1a0e8c773aa1c77ddf5927bdfa0d8cde596dc450e2af7bb4da0d0c7b6d7be6d4f79d75a4ba0dacd2dde5e57ae28cef9dfa0518e4b24f8bfdbc5cf339b50b309dedd41b5f8bf39737ea16601d4f29ad9d395629b9cf2cc0a4be71cb4ef18fb9629fd9c03a8e9f62cae5d613ee9dd7c066ce9e5fa8b5ae95ce9d57805129299656460e7dbc3aab0083f3768af9a59beeff715603bb5ce329a9ecfd5aa9714e038b9556eff7bffcef9c6f46039bb76f2a33b63d426a6f3e03db9ecb8fbbdfb656bf6b36038bb74f4eede7b2efd9672e03cb7c4fcdf5f5b1777a674e01866d8c5be27eb3f697c78c028ce27b3b97df6b4867ff980c2c7f3fe18d7d671af7fe780cccc6fe3dbfb4fa6fe7f4f80458843ace9eabe726c0649511fb8871cef9668e4b80d15fe9ff79c258e5bd1c93008b927aafefadd1e2fe371e01766387706ada37c6166f2c02ac7f5fb1bf1f421c6fbd3804d89df76b0979a471ca5e3108309eab9f3bf6b9bff696e20f60d55bde318c3a770b73c462609a6bbde58e98624e39c46160b7471de9dd7f5f5e21c41ec0b0967f522f27f45aff0e06d667e67c471c21c6dff70e605fdb7ea1e55d5e5e3fff029bd75e1f3dafddf2bdb917d8a69d6edb75cdf2fbca3980c19a6b86f5f37dbbc078e4785f7835b479cf7db9c07ead59cffbbdc5f3c37d3780698c6ba73573d8e1acf96a00c3374ea9e5c574771ef3dd028bbddeec79f41be2bcf1cd000679a7d55bbdb5c773de8b014ccf693fd497565c35b5f70218b67f67cebdee93f24faf0530f9b3bd30fbcee1e49e5e2dbeae384738f3ce02eb126f1aaf87b357396705b06ae5e41f5f7d3be7555200c33dd2b865cf13fe8c278071f8f5aef143fd2f95510298acdcf64a27b5f2620b6f0430df73f5b54f1a67fcf94300cb5d721c2bccdc6bfcb1c074ac376a5bf9d7d5fb076013e719f1a7b6578c6f7700c6bbf539f76ba18498ee2b30cc6d96725fcee3a7d30a6cce9aabc4f3df8eb3d40dc0a69c93663df7adb86e0660d0d26c71a573dba9e55d0016f5c55f632d2f9653d72ab03ee9ac73c3a871a75f01d896154bce7fed5a634d1380f9adadbe5366f8fde408c03ae4bfd7bd6bd7dd6e2a30aa2fad934a3de7cf704e81e51fb1a57df23e6bcf520aec5a2833ce3deefa1205a6f1963e7a69b3fe3ffffad205bb1e5f9e739ef94f187ded03a3d1d60f2ba5f3ff0f7dcd02866da43a4e6d23e575f68a050c5208bd84365f2f6be7f50a98ecd243583f8f5746cdab15308af3dff4ea4921f755d72a60b0df5baba4d4dae9efad54c0b4ae17ea7bb5add5ca5ba780c53bf9bffa775ba5804d0e27fe1ce28c23ecb4f281c50cf5de33c3e8e5beb44601ab57631fb9bd18db7a678502163da7f5778d63ced5cbfa04accb683bc7bad66eb796d509d8a63ffed8e7fc9e56db9b807578379e55f79c75a79c0998de7e73182fff3277c8f7c068ddf04a8a6da5df52bd04ec7e0ea39d14e6b8bdce4ac076f6f3ebaebbd776db4c9380f5993b8579572a6fdf972201f336d7bb63bed4e27a2f3d02d665bcb55b9a75deb2526a04ecf6f9f78f73def86f9db40898adfe76e8ffcc90470c2911b0d861e674d7af79a717d221603ff68d7ba5f673edfd17022637ac7a5779799574fb2060ffcbbd73be9def9d71070296f7deb2630b6da532f31f609a6a9e3b8f7a7e7cf5f601f6e3d73fe798e9cd926e3db06cfde799f32a718d52f700fbfaff3a29c6f466ea330fb069f18d5d7fcfa58f36ef00c3d5ca8efbded3de1d711ed8ad90d638efc553eb78758049da29b57ae2a9618c76e600bbfce60829ecb9cf8bebc4013635f45d430b21b772cf7903ac5f3e23ce70e248a59dd30698ef3ac66da9def7d62f670db0a867ce3dff6c2b9c5d4e3cb099318f7f7338fda53fce3bb01bb3c5bfe6fd250db02dfdf7dce70e339cd0cb19607bc7ede3d7bfc6f96d9732c0fc8519fbd93d87f5d32eedc062c5d1523ca3e6905a2eebc0fcc4395b6c3dc73ce32de9c0f0affa4e8973fe5fda2be7c072a5f8f3bcb91cd8b430fea93da459e36b638049d93dee385fba33ee30c0a0b7f26e7cb5b61fe71a07d6eff5bc72acfbfe394e38b09c3b8ef5ee5f27d65cbe81f9cc63febd663d3bfe6e60d65738e3fe13ee086d1b18f63ee3cea1de926f185f8045ed779c556fbe73f450ba0093766abdfded5cc3af7f0bb0afbff6b6cbdcb7e7beb3008b16ef0c398f16c659391b98cd766e8e69df31ebabd7c028a67fc399fdf57756bc02ecce08398739e74a3d5501d6a3c73b6fb82bb77b5e3530fa6d8456faa9abbd3a0d0ceefb3f9ed472fa371a58ec397fea31b630c27906d6f5a47b57c8adc7175633307b67cff5f3d9b1dc909681e5df3bd474c27fbf9d29c030ec50d6496dd731428902ecd33d7bf4fdf28bb7250393374a89aba7d8cf1b631c03cb114a5bb38eb6675a4f80699da38d78cabced8ede04d89c9cd37effa7945bd84b80dddce5afbaf70e6f979b04d8cc72de3cab8e534fad47804908e5f5b4ef187ff55904d89f18e38da98d7a628f4380412e61cc90724e71b620c0fed673cb69e5ec5bd7fa014cfec927fd9eea4fb1a66260f17eef7d9473ff2e7d1858c676df5e7bfff3723e3d8079ad2bdddbf27d37ec606074d69a79e592e7c9a3ec0096f1fc7452daa9e63c4648ba514b132b3732b1bec066b61e660929af7f777dad952526eebb4884e2b064c3f202cbdcf65f3396d27200a3d1dbcc27f4964a1867ed02cbd9739fa1e57be30dbbe502eb9b53fdefdd7cdbaaf5df000661ff36fb6e7bf739ceab01ac73cbff9cd5dfeb31cf520c6b0b2cd2ecedbff5570ee7863f0358c4d2664ea59d3ac6587dd6808501acee2bb99df5ca48a1a43604d60530ae21debce61f21b6806501ccc62b27dc51d79a31c5947423be98a50526a98e9dcfad31b4585adead2c30df318f93fabeb785d56ed28d38f360191dc0aa00366dd5534398ade634661a23605100b39bdee8e1b5bcc34fb19d0016b5cc96d31cefff506b0960f65afdebd736c72df7a511c0b09ddfe68f27bfb0d63e2180518bf3cd77fb383fae3a6281cd8bfdd71967dd29a5fea4336ae3e364c204580fc036ed35e65aa5cc53fa8d25062c0760ddea5fefd59fcfdffbbd364ac0ba82da68edaf7b667dadafd464ca816505f6e7b59073ee37d739fea0adab15b01a80496f7bbdfd43bcabcebf936e3c69dba7363e4e4edad64424929207cbc892c262c0e497f7af79bed7578f171025dddf5e2ff584be8eb08cc3aa02fbb66bdbffd7fc634db55600d63fa692fe6ff5cc515348ba1146085809c07efd37d3bc398eb84aa97746de090f9611170b01588fdce3afb5f550e32ae9161615989430feae6ff477c29fabe7a24e4724d2b1d1b109daac441189aa64a92722d1e6bbf6242e471a79b08c8294614d81d97b75e5f3e779a1cc9d86614911454f585104595db04871c55debab7fbcdc62ba75a83e2ca617ced96b977266d28d7e4b719a898b4426931ef5aebb92de7c44a21ca775852a0b9763b9a5c6d4735f611789301cb70e5539a1c2c284b94ffca3ce1d661efb1538d4706beca9b5187eb9ad00739cba5f7dfbcddaf22af45935b791767a3dff74926eb4e93765732a913891169b7d53369e671aa49e6752b226960a13efc8f3af32fafd35ee5251b226954a35050ae5c416ce4ca9ad12c29863cc97728cb1ae74cb4ab525dd6832694eb326127328ed884a0a18c533d3faa3e5d577d9291f5885d95b6b75fd7c67fb2b8c51c078b75bdecde3adfed7b9f3285e0905ec7aceebae14c7a8afcdfc09989459cf5ebfefdffb38af13b0bfbda71d579a37a674da26dc9f71ec7753b99980d1fc67df7c53afbb9cb2ee81ed1d6d87d8eb2e65ec7f0958cd3bee9fe5de996e8e9580f5592fe79d774cabb7976adcc8036dfe046335522501fb38fe9de1ff3473dee114894e5ff7882212b0da29c53e634f6d8c7ed723601077defddc1e5f2f35c7bb6432e99f95e04d6504ecc37a7dbe92dfc97385927463973a8d68154555044cd2cef5cd75f711a761e47270012a226030ebfa79e659ffbf698543c074b59a675ffbb5bbe693bf5b2a216014579eeb9c31f32d61a741c072d41bf6a8718d3e623d49574b0504ece6eb3bd5f64ec92fec3415e50758957b638871b5907e3b3fe946ec030ce6ffaddd9ef6be6bc59c7463e781a68f8d8ecd93254c489c7e42e234e9898d8ecd1226560f4c732bebef1ffa486794506f9848a4373f310f961157f500f339f20f65bdf1da8dfbe601d6afef3077ccbddef7df1d60716b5969b554775dfdcc79609d5e3db7f75fff48ab8dd2563ac078fc92e389a5ff76e3ac7380d1dfbfedba4f3e7786d1926ed49dc9f70a2b1c60b4e78aabc59d5e382f9ca41b475a27e3d7b46d8a8c335e1e2c2323aa1b607d726efbd4ffd6fbef8e9a446d7c9cd89038fd8407cba889ca0698a75bd74c2bd7f36faf35299cf6a8d48f4ad6a11ae4300a190000a01ecd000000b312003048241a8c458301a1683cd809148002539076b63e984984c12c46511085200c02400c430020c418420c312ad5d8003bc24126f89a4c0ae59310028a1ca25b2a149264a202024f895b45b18068874a96c40ad9269502023b9459622a149b240bc8e950cc12ac50691259406107f49fe4f5ef91a22d20a443314bb442a5496201d90e952c8115ca263105143b24b3e4542836091650e91099a5ac90d224b380b2434896628568934a01891db2592a15029b9405c47428664956c8d344730c5ba12f46bb12344589f7296949ad906f523220b4439d25cab26afe74ef59a657db0faf6ec944839afc81fe3ead2db10af5264907e43ad4b3045d286bead0f7b29e655a5aece979ab7e934ac687563a35d58e7e75a6cda15eeba549bd5b55a79e39ebd7aa34f1764bd7c832d97b4feab45328a79569866d075d283c8923a0fa90b0258f42f524c481facfd7ef64039260924640ed43604b1c65d5fe84dff348afde0fb85a83105b5118228d4f6e4be1421853d5ec11fb6bbca74ecf78bf467d6873e1f738d2abf713aee641a856040c51e313db52b8901c13a2e73a6250903a26b9030a1fc2b05417223c6963368ce4134c0a8c71bc59a727bc9f476db541e0371bc9d86885d3d3d8cf5d5fd81cc66b759ac4bb35ea50cdab719a8dfdd0b5854d72bc56271446c923cd7a3fe0fa1ae6d8ef85d3d3d8cd5d67d81cc66b759ac4bb35ea946d3a856235cd6c9c572d897d3e8d7beda1ea0ab6f753621494d493f1cebbc27004ac22ee301b5ef45f1d0aa8aa6313f2cce12cb95a6bc708da1d27eb413024b07479692f7161c47433c7bf2016e48a1b04637a3f0ccc1a7971ee6c21345e1c7505ba4c67be0babc22197af62f78d19904b5956e08d764832231f1874f13a03371e6a300057c3fc775d35eac5b6a5e5329005e84c02d9ec2c0959e44ae5bc5316d11ca6061a29089e8392ea0c3a0a532a88cac691a2324f684c6b776964b704616a08dcfeca3a97a417c53487e9e0e3688aa2ed66013db9e291812012da846ee35531c9969ea9dc47252b4b6d98269c44a0ff315927c242d1092d707b2e3d87e6425fdd4322cc2393cad59009fdcbe52104264a6014915f2bf147c5e531613d16f4c58970ef9d0e1ce2a77e47ec7c1654a8d58f0ae633e0da2c604dacc1471c4ba21affdb5996532887d6de7b2066249899d5d72ed5c672e2bcbeaa7d5610a334e195b30e9d3d45c862dbab6167b6533a4169bdf9818e9e7e8a8758b13f9ced590c69ed775b09c0a06db9bfa36b56f4a8299e3879f8c65d83850ee3ccc180043f6b7640c47a5b6289644a64b3d62ea344e251e9c8e7ed432fec9b24776a76925a03a743b1a14719a24e1af1bddf26b33804594abd4578806483ec3385479037b821319230af2f0fcbf94b3598c3692f3efb53b3918d8325de986dbea7c9eb6213c86a14862b3b8ca1963fc1716fd5eb6283fc6588b26308612e1c8c268b5a6c924d3f421b0b375ac35ac59441e661b3ae26824d53d8d3bce6eb7a3f33654d1812d117d6c85a76a37f8ce33a4aa7fd66d74697d91e43b8c955305f937c10dc251b701cb6a0fdc7e28d87163b7db733785a641f52cfe3494db8889016f6aca15e8c9093a310d2b01cf4715ea8e92526d0f834533e6e5c4c50fbbd7fbee02fd02533ebcd3d5aa258ec9afc7332d278948235a41ea8d146423b062b153dd63f1518bfa12d16a6be13f3aaf8d5c1dfdc3033e088147323035f0d3903b6a0bb8650b5746df066184ff01eb87ff8a6dedf857914691caba6351b9d211d7adece1411532be99c6988cf1b73f23654adae67ecf9e8b7e891e9511994901de86fb649fb1a534ca3ebaeae06a7726be8b8188fdeb04ce0f2323d53d5810e849d519fd703dfa8d6712945341118c7463f266c9ec8b0a16e21c2808fbfd9d4a0035408763a88b83453282b3eec46a6447d0d718f4fa3470c174972bfe6c2e87156d88265d92385b46b03e6c7cea98e2509485fa959b428708b2d9f17ff82d78170c5b7d82bb85575109d47ff7b03710d0f6f1691216fd8ab0f574130df2c1be0af5c52ade6ddc2fc0e993334003184549cc1e2458a38e148aa4a752277797a74a965e92ce1d0520c2f196959f56c8a8a01c86a9163d62c0442526f71a20f0cc26fc1af8b15cf3ce45d230791c7581e11a5746fe559f19bfed35b5a77fc593e362749f74650ce112b07d02bfbd9c501f740e9d7caf868feb52f4488d14165790e68b342a06beb0648dce6ab5758a1cf02bd5b60132f012ff9b6e6ea36b8c6b685d90a7f738a37434f6e03dd2a02d927c524c270f4964cd3b85478b52df63942672fdb73c706b568353b65fbc347ec466736691997576cdef35870705182fd3794816fc859177faae033a74081859ce114fa0b7659355b29a532700e4e5e128fcb45756e6ff2d2cc43db9fe4cbb921edbf2844aa0e404d379f7f869fc2f6d6d83981f1dbffc0f3818334a026ddb732a39d72025bf3907b71b87cf132da70621fd839492f9d296267a79c137c92fcb6c529c2ca24adea3ac8614c4592db69ee518e579c3612ef99ea89cdffa6e311e40e9b29d95632e9cc2ca3957fd47e956ae60906604d1f9d087ac408f42a497a4484e82991946904c855b685747002f1223682b2101826836f160ef00a1f0ed4b0f7a835b1db3869250f8647d1fc202d32be11b2d1d8224164337edbcd27a8b43ef63c0015bacfcb2dc275aca7c025b22021e7509cb13ef1c43352c73c562370b4f78bc42f8bc9b866485bf115da959b769e5c85008a13f5fb9d4675ef71821b945e4700196285036e21efccc259fe1684d163a4d03b49bcd0f495dd1db16667c46c18257eb93fde3cf6407093d467f26bbf58b71a7c4cdfa13a1e6d7a739dbfc7e141696433a8f2245017ed48112d8d2b86aca96656b73a3474cfc2e3883fb8c0472f7002c2ca73d1acc905a08cdd0577e83d199d9e8747148a267c4adcbbc4ad273b26702ed500cda1eda32100e7c14b557bac4a242ab81946458e3599575016b6ee69dd0343b45a4ad0439b1380e9572c2de92f40f900e46923df85193b3300065a0e9e410fe632d65b2b728e8bf62dee5b99e208589366e8cd2b6025557c7cc0a61dcff7164b1cdf13eb4197ed2a509086c5795f515e57d4ff1a9434dea5a2f1034c21d7809789a0195e36154aa3d43477d0f4121de0c2f5b2b4f890a75cd559b0b64765f29204a9185e0f081093a16a84b648524e122d3574fece9f3bd50bc424063de6407c1cb2809185d171ae12d948914b4823ad677c101b419a91a96050620819e717504316a2f2106a0844ea8141fe0cbea40487b3523549beb322c11b36215690da033a8c13b25cbe7d5d836b50a34d59ffb200f82640f978972df9da5034834817fa3aa450b34e85f6257ba0e0a79b7750f68bc1a301f83b2c4492e405ec64568ec302a33c1cecfb5169983623686299fde4385245a11809801029eb39a4a490a56db26e88d356ba97f88f525de2676e7b6e1bfb7ba07c4b2fb3645dfda5e24c3af9080df95e98044baaadc89080523f7acb5bebd73579606f6e7db349c0adb41cb0593152282422815be214ec51c801fe57225c6b5b278551ea3f846964bb4bc9d452b20b0fdf4368b89454a2198538a49ba5a23541a6301ed2113536b7242f60ed1844c1433b2db55a53518884197e75e0fb30dc6a87eddf6cbdb67b93a14f3acf84c638512c6b265f6fcb75d000ca654805a7c987c5120e38e367cc05d07fb0d91d9db24f06306556d56ef621d03ccba938ff1f23ab28c15deab90e2efe25272af2886f71f635ebc83e51ad552b0d798994b3a9c8bc7ec4f06b58dc18b9f5afba2ad6b4100ab7f7830e0599b587b1fcc919ea33b85607860803733eabc3e72bab40d9e84f31c80210cebef9931624ebe29a1e669db5c95686a2b0694c072f3d2292b17010079001805f6e6a88f5ef30463f34acbda4df9df9f411c31a882ab3a45bf6e76e7cf2984507b31d2848d8f082acc0d94558da748ce68ac181646f50aa0d728292c70d0861d55ae27ef519e5c477216f85ccd232993cc395b7dbde81577c4c5264c411c499b7070cf63728886dc85466aec5e5f7c625ff9797b09dc975bbd283eef22726cf7c85ecc5d0dde765329b2bb28458c52a92ae3c58c1ad6c0dbd43b24e1459ef1c6eb66a2b1af3cf225344d95072485124a2dd0e8980d4439830e08843c4831a5bc7a5ffc9dbe702e776c90ac059d5cda0d086f309e469780f0311ba556a396343b112b944ca3910def1eb2d9097fefaf6eb671b2bf82f65e965caae7794fb204baf9fbf92d4f8dfa8d74534ad3da524913dae09e8828d2e671888754a9c7616e44f5cc0fcebcc30729ea9fda53e0045775d6ffbb299ecaf3cd4f35d0bbc6e2e0217568872d9f9bd22c8df0840742eede1e912cabdb9c95258a781c64635789a726a4a5e488b7e946a632b3887c230d1382fa15436bb02c0717e944c8e4ff6bf5b70479b444ae819252790afb839fe251b7a3f80ba8dde2f93a85f6fc62f0a6304bed0f9d161f5477724f0abb320e11acb4d68f8a43e78e79d80db1a52b1d8345a60a56392d9d6d872bb4fa34d21eb7d5b5a53ad743bdd476d3218dbb79e356431b6695d6092c7dcac75c520a7d502e31d4b5a532be69b960c0ced58672382edd053c8e7d5bab9ca27de8be96f2ceb7a26a55f747deb59076db27a912f691a3d559a7e1bd3e2a176ecd52935df559a7a7b5a57ac88c3ab336d92f566bcb4b848ba181a050017047ed7d392526cfe3769c40eae04e0b1fd57e0430bf062473818fed82e4470e68b8cd7cf9d359bdbdcb1018b23c672281e9e645d1e1a6cbd4aba5884158ae0386f28fee5b42870b746776c2f10aded28742d8e4a4a402fd4c64af0aa030be4fbeee9957431021065f7f2483f6fbaa65c3a63415c0f0e8e8fd96914907df2acfe4b51eb26daf38e8b9a7b2a98f7efe9832c7aad986b1c9dde15735b2854af78d71430861ac881f49e6b0546d4c8dddc892af43188fb31c470ab59652e609d0ee67d142a5841791f284098bca5ce4f10e9e0d320524710e79a8fd07f4265c7505b9284f3952bf4328c222f1acd1b52ed7c4677069392304229fd1332bd01cebe40cc4b1e31189d98c9e08d757bc321b24d86188d53388e1376be7738fbc7780c93a90eced54e340f1b1ff276280ae06d48969d6b051e1ea5c03800996a4087a428e4ea8afde1cc511674a50a34a4c79553bf40115c57eaccddf04ec164868b5e1fd507899263da0b8620ffab7673da4ad792e1c2cc26b41ac6286ba4f0b9d4ecee64d25c51be7a2f8170f35ae1d9b9d3c085ac07bc6a65b3b4eca698aecb945b00b1c1d5539a6bc89453090a4b55f572cf0ca90533953102dbdc889b36b64ca7cfb745c008e19ab0d17dd4a443fc85ae9d0219c388067a76b5b1ed9bb35d48bf0cb40c8e69099cfb615559c44a7714805d47db24696d205c15cda6048b057832acea44bcaa25eac2c18f3cc56049199bdf531ef994b0f18f48d7579eb21e172d40002b171f6c5e32d6a1147dcba27cad0b80d573410b30eb789cb58c03a98b428980c37d80dfa38165ffdbb73fc7790b76de1acb87637cfc1c043e52bcf1752b2fe5424a3df2135d4136574fdbae04a4f3b60ade4fe864a2061bdf8ee85966e570f6218f456756c2b9f8958a651b40737e64cb2bf545de9eb0ee0b8ae4b44b992c83d9ede8ed75083d017115b5415fd1117a0a2ce1b610641dc3f71e774bd7e8561f5ff4d01a89a0c21d5a1a07f21fe4f04a8b190f67eca5abb047f4d1ef21a9151428a8f4d770f02923a1fff1e3871a801fca7f8e77bc47bbd6c74659cb0f07675e00af1e988c92cfd7294b5e80ae49ec6f78d67b9b613158f6cc0b75a6a16135d034ac9bc8e0cb0ede9bbc7c227f8710e940d762d5b7acc2a85c7aacb72fc90798645e066ca14cc1518f10c5fdc6768a24c931aa10688c16707c72d2e4fdafb2de632ba16dba2c2c87c293ac430e3e90fb692004abb091857e2c981f877d430c77c2430f88b371b703222b7ecd5df4043eee788a7b0e9763ab93f1200eba85459d157d757b4cbb5c207205dc19eda5747523a65ed895ed2aa29ddcdcf278d25412636730b6906c03a335dc9ab3b72d829ab8f4f5cf23fc8438d59e3fd7efd50b9b48666d8391c42f55d8cf1a24d12bd1dd4e7551298e360770510f52e08a4e87a0e19ae852e2e346d5487443e4b78ce0bc352a3088c1b522de776befbe9a791a32dc7f18459da9920bd6f19385de9482d134919f921f2f244f8302b38ad0a1834240bdac220fdbd80a22139b5866a78a6d4abbf3b68b52b09dfc982131d4f6e555d6f4066a431eba37dceb42e83a11e77c20b188ef278ab71647c0cda04d090431b029670b64a3b8266846fb307051d4835942b5b1c5e22000d91e679a3b39a1d7cd2017a346e3bb481788e1df262ae5d1435eee24b77a9a3bb443892deb68f67fa5b4db836b69d3f398f4e3715e8233657138e3e51c489f22628bfc7304d1062aaca27bf37a9affb38bc4dfd23106f7b4305c7663740c9171c539c9b1af60d074a52879a09d087c480e601346570024cc056ea9838572e7855841fd512d13cbd0784d47e630f0688e798affd20c5ba2be52df7c3ab5f629406a147f48520c3547889c390ba077cfb76657ae4a2dd453af77ef470d3ecfa6a20b8cf3c3830d16cd7c051400d138a83c3ced17b146acbe097bb506fb14b6a5eec4b2d9c5fb8bc369f29e8bdc1c13a51c30f38d517b1fae439a974599bc706dccbfdcabdf63433b10a8129b8c942fba380ace6506259433bd577b6cbc3fca2fe649c9629e3b0704ecd89a7b91e8eb298b881995b387a270578626eb48f825e5171c2a12ff483acf737ff80b1725abded5e8b72e507624e00ca7281f1ed3abb2960c46d627b5f3dafe3fb75253817aa5235a989537a119d031075d3b02245566df7b56d001dc6202232a37469a9754bb7fb2c1dc4ade05f346232d7738f02fec538b295017d6c273ab45e9c7124360633bc1f9d8dc88deee2e69c94bc58b0a5a1bde487ac22ca851382dd55551dafd073e4b4ebe5fb55f33087dd4629778a58119551660a28a9f9742e1672e2cf1ba8b3f5cc303fd0bc38d2c99734c500f94664ac7ac43e7b74144ec68c9ca59592779c314721fed02e13125f6404eeea1634f5046476dfa8f02524537c682059461946bfdadd8a334f22c9bfa254ac9ed0d0eb06530fefcc9d43f7ed50f1e487fdf1459c611cf574b58cf946ecc90e5eb53ba3ffa25eb3c39b2842ec37e769817db8eebe828b17340dc346665d96fc71762ab459558b0c85d1d6970dbe43c46fc3431e8f78c7fbd56c49c0ea84b9abf68fcd788d364f725a3ba993e6c79eb87b00a6d7041f57bf85dbdc97f9c3cdb9792cd6839d71e8c4f3017bcd16efa8d9454e62298f29845d0e7e6887c2dc9ce1c0a63d190b79a8fd64a1f973ce9bedf81530729187382a92f378c3ba1781a7125315bf81e901efb6e36a9751d1bdc287cdf4b80b9d7394b3b1e1e51f8153f0f9ab5e756d5c7e087df7bcbd2a5e08195d32e4f265e4c0ffc4e9309cc5e29d3fdb5592bdc92c2932737097e89b53b55c4b4c329f4ff67dd1f1d643bbef1ca4bedb775727ea9e6cc19471f51b9f963422e425c1fd0cf3125885c797e502e62c397d6e027f783718cf51736e234ad3ec8f508504eed2c734d8c0e4113de47327322dcb0356640dfb617dc25ca421d5eaefc26496e1eb6d9499aed079349529755f1adda69832a17af8b1f0ca656cbd08e8900c2b099cf11a64123cc7f310041f52f7e92b5be42a01e016877eaa4e92dd9ad79b0ca1e9eafc9773a94520b9cf6b73025cd928c311476dfde0ff97cf08bf56c69f54cd8b726c1f40963d694650d6a4fd02ce9896bcee3541af2954444ae081bfe4645b3d762a82876c810281603428ab186ba0719cbb4af6f63dadeb3dafe660473d040296441931558a3a0e3fa68eceaacfc9f5a2ad077f19f09ba9e6a81bc3159b99ba225f53863e89f15a5ba350145f3727066b2102eda00fc9a3c8d8f212dc5ef3ff7c8a42399483c8f7fd9772cefc9d9f2f8675361aa7fe3be64359de33f79fca9960a22a56ed66728e833b6bb2136d35a91ad679c0e2b0b06f01e5b193b9ba39889fc019930e50847ef17fc8e872d7eb3b3a11d61a910a02709f6000843c0b0277fbdefec4a741e6acfc9d7dc9b46b07837dbf1938fc5cbad981a79e8fc6d6dda3e85aeda6e64cfbe3d4a43abfb539edfb429a7f9ee9829010a759e44b74b20d10cb31b05f4774387ffa952af513c4681cc28adf0d203fe888782313e341700711fd0996f61a1eaf7baa219c2ccd77eb7ae67c6bcd215a9ab997a532ed64ab82c84cfbed806ca1c685bdf6e509dad7271b2e51980f95c498011226ef4c6eb79cba2567b76f131a713b7ce56c8e40489f33e14613e85ba2b4b224ed0d0afa82b1aa653d479371768ed871c5b30802cae6e2b893f34b1b79dfdf0dbffd4ddcc7ded0c23182f4e12a3bbfbd5c2fcc68da5dbf416a0a9bbffe0b40633b12ab12c533311bb70a1aa99e8c4a2fc703fe7a38dede21d617766cd9d2ee92140395581d13daaec4534a61963e2ca9f74afd14940220bead20fbb45cbf35b6d285943f6d3d137d76358683be3cce76a4a76e98e059e5519fe52783396123616abbfe53a32978d21ae433c7e8c01d0974d5504730f60b503d7ab589470a7b1ee2fef142c3364b102f3a76a4f3b3de6c621286ef2566b7a44bec89a40f85463560d95141a86252833e8a4bb4a2abda109c07bc72fddfdd213563f4bd4a7cf881b2e4a2cb5c36f6041458c35c20cfbb502ec9733a17f003fce2bd461da07ea10f7097d8578837c219dc60e60074947c85f802be01dd335ea827692ba047d037025a6a644b7bdf1a09b100ec8f266e0e6b932daf65a582ddda69c572636839ba163d382d7d06a64fb65b1b2bc993a5b4dd8066d438e270b2fc395d1b6d7c26ae936e5bc32b119dc0c1d9b16bc865623db2f8b95e5cdd4d96ac236681b723c611d6f978c6b09895be36d12694391ad6e6ce95dfbb5c6ac6ab0a8d56d329ba8e42b1334823380109b2a780d4a098afd655155c9a6543294899ac199208d4116ba0ca784c4cebab0aa6c23a5390a84ada06d906225085e855643b265455c59b6956256150266b06668b148052cc32acc2467c9b4884528454f5f67dce6960cb545520617f757f6948ee536fc5c6552d9adca3fa0ff0c662ee9951bf7f226760587f1b9ae9bf4ae307f1143cf75766def210010a9f0d6a33db386d677b0f0a7e0da4342d13da6a8c6c8a503a40537791ff51459ba299819c6625c3dbde7b9c83c2ec1d80fe1da41305f07a5083e59389a43048852f4bc371a6d84c53074a333e4b2ca5184d5c6d58735e645c0195d605700012882e360e52b433e369529a657cf071a85c87095b3c1e0769eff6bb43cb87488d171a800da0db6c72e36093069a149b68f5b4f8627bce56798e785a94e6f06dde554cf489dd7d3a60a1beb783c1f2047a3e30771a821145428c10d317ce9abb96d855a41babba66df1ca598a6f721735145a8664da061eabfb7a548c1b19b6f39b99137d9f247df9674389814c0a68faa506ce5d8864341ea33ea6d80cdd1172144bb9b93e5d0e87cb177b9aa408a63fee4608a5cff3b9788deb4141488ce2547b3e932086f266682b8ce7e9036026ae372dedb1d30787a4a0892aee1eea9abc763157b0637872e8219bd3d525c3d09938e3bbe70d193b3402e2f73e29dd12c47bda7c5f5de5786fd3adfe9a932d6884385133de1e9f6869f50faa22bf107641a2cdc1062966483682ef0fcb40c06eaaf27508d204c2089205ca7592d48b4028e818a2fda219b0d48a36728798ee09629226f6a987ac07e9edc83870ef7e30e6f7913f77cb80bb56438bce624e9fbd545cce9cbaaa0bba46c2a5accb9facf174b84fa26bce0f3e34b9374c144096535348ce02877004832b3e96548919685e3658023e3134c4caeba337dc98e55e84976581328e29fa574778c46d126497b0620d7212d1730886f1b65ed42e5a81e4280629484a24a1a8f3a04ece4e7fa12aa97dc5b14f27dea526600cbacd78f0331d46a2e6a0ec63402328bd10454a6294b85d96a8accf85a596706247348760e17ebc305358171a1510552dd571c6453e8f76f1269cf86d5c95a0bbfc51766a691761f2345890651729ae091a45d85c7b7d47b32fc2c749cdad4be1147727198a3ba75c045990cac2b5e079b995d19c2b187b588c5e3e3138033ddf8ff2ea3ec2e91f1f2c90db5e9db3dc2cab917662ac68dbc52d75761a138688f7d748b43aeca1ecf3055e3ca9d2abc64c7d16831a291ed6a6fe68e0315655c4fc13f243e7dcf07c63bfc00db4b9fde19d12720838d59fb4b94582b716e40771be4ee49957be5ec7e2363d6d618061c0df03ae0b45ffa37e9a891404eab72cdb02b562fa248baf56d998de8ded9b13e01da86826670026dc2a8c6ff47f6af707d60b2a8d3abc3cf797bfde9c3a4f8533e58bbef9069c60d3fb6fab97d20d85fbe78a43791e3c47d02ce35e85cb1c8e71e7492f66f62f954e2e987a7a1d1aa81815c77d3c272690e576dbddfc706f46a0c99403787f73bf85484ffafb0939b413cbc745d34968546620b8a76c083975151224f09ce89380f298340ff9340f404c0493d872cd77e50d6a48aa5bca9dbe245e47e924ef1a404fb6046a60af3924d683a734b6190bd4d23e4d3d13f4feeee65cf584c6a58f2d1f1c01a00da571094e018d93f2cc17121d22cca3a63a6acf01df11dd459c2b1c3dd2951f54e0db8ce33a44a7648f3b9f3e2b23e7bb74e37df4e6ea03962288580d0c4e2ad317f07b5d706a69d7c6e709064933168f0caf519b244d729d433e827529e0a57c279bdfdd098b029df11e6dcdb97427e9b9cdbaac9ab80fa7fd83390783161aa13eb44b6b29411e4879861352f9affc5791707af336bd9a8e25d32eaf269e1e37133003f4cf5a099a6ca55d1adad6b896b5688e3bd38b86df2b0a961739936b0c762e82a73ed211448c0b7e9ed3cfa272a7754d9ba94831869a626b56936313cb9b0f7dd35ca3307a068ef176ac2084cbf09e574f0b6c6ac245d8770dff5feb96046f3afd070a64cd82b6a149f16da47d586619d2e6370a60923f67fcf65a0a64351ed8f435232c25bb00a967a1bcc3d598001507c2861ec623833d3cf7ed5199051933e603a86a026382d09931211d8ee82d9fe99f1e6edb8c4199517581f057161b01e5ca462057d867291a0a62f33b7e46451d970ebcbd15e354cbb7336135fa74c5d1ef91211eb45b9b2a66d844b9b6a76a8a6368a0af5d6985c07c81f7c252af58aae4c4959f5f837413fbd4e4a67a378c3d846c60c3aba302516ad0cb464a9f61ffaf4b5194f44f128f2a8d12a4f12b1d1d155496fcc629aa2a35a311d11983c590b2a47b57a1fff243af85ca8b0b0e967ce5fe7a28456f8f8a4be00b00493abb640d17c808c27fdf3af1a20238afce053595b9da6d733109b9c8076cb488f7f58521d39afe2ee50604a88318ca43dff1d5758eeb14c6ef004a4b675777d669a48b780d4ec9a657167d409d00d36e12edd6afe9810e0fdad518c4adfcbc79246828aef0ce3dc6c8c04a137555ff9ba701e3b69514c30312c14aa4bc5324927fab8041cedc71800fc59092a1655ecd8498713f6378b0638b97c3f9ffdf95d4d9e0c043b6397ce56482b3d6bdf6f048af7a978361ab566bc8ad3323b255ddd7c689bcc0a5005e94dca7406c6f5dbdcd2f7b54760f2286dc05e88a17d878d4318e49c4b253bea679c606b98389204ded649a9bd8b8719b00b9c62ab7a9a9336d34082f8024e4dbc1f0e213d51085e6f8f6a61db258de2d3c81aea5ab1478cc0e7273fc35d0ad81e7b33814531207cdf5c2aed92097008ab18ded4c54a8272502664c527b64d6522d4086009cebd8364a6587faedec011447257d6503dd382ad51bdad7376212a33707ce8e7713c1ee57995cf8909d5ff4e0d423e7f33c86f6c8478386051e8ef13cdf8944b590df81196a00eb1ddc3dcde0e71d0d571af8d679e7febe9619d73ba5270625ca57a552fdac4d86fe606e6d55ca74b0e9147f8b73d6782be036d14dfbd4a14003ac9506e4bdb8b4e10313880a54da908ce64d15c5d06ffbf3efa89a310f18a5ff6efb1d8a34c4b45a553a4b79fc098d5c93ecd7a153beeba93edeced9e566bdb2fa0951ef8763bc3f3c78c3d6dde71722d596def26f0510578006745ec247ae192ea5454c0278bdad6f2f1b170345a8cbc2a601920db6da6e87bf81eed2de96fc7d4b432ee08823425b5d525a2f531f42edb454df4c5702c3b99c13e962818002788c7d78022af70238509ee0d2a7b4f1b05937672200259f21c512d07b94090b2aac8a74d69d68ca73a81ed4ee7a7e5bbbbd44b9afa82d122f2373d38e059b0acb99fc1df2442222eb7b94eb80c18d36b63cc6b0aa33ca3a7bb4cecd2054fe486ddcd290cf15a2c567ea285850ff416348b36ffebeafa63b84a3c08779c341cc470cb8b5b8bf8929300f786b3ee839de2c690d55f1660e30d1ff576182839c6ae66e30c9097d41a471da0398ce0dde7c70f19025c0a158a9c99636b8eaaea71bc5c8e7c8988e73084b93a8e54aa82cedc3863260d54a71b27a6d95a5e9c03dcd4ccae5abb1b2b1c6417adafc7b56630fc0f2a3086efc7288706cbb04748caec40f68a045fe8c154cdb85200f20b3165047859ee333cba61dd7ecfc4189791d774c8c808f1cf7d70be91ff14f903f1f71ceaa510b7ae72afeec561c3159013732e63c09932ac37ab430668d5cb2854f4b02039a98fd08f7d2dd927df435f70e758e690462bd9a593d55e6024d031ea4611fd9894e021b482bb504ec725e71afaab65b275a6f2c65b9d151bc3f62c8c29ed42c4cd6c1abdacfb1819dc45638e721ef887018dad4fe83f274305f38201dde67a16adcbe3daf076bc1853944560eb41e060916dea784fac3a3d253b1fd29bfe43edabe9c967ee368244454b94fd7211e4b4cbb6eaeeca87b1bc9cfa3df9d3620e0525b62eb0659fd6a981a2cecc3a7a590cb1a2656f3307746ef6220763de50ef85ac5e3c444044c2a46ba6670c4260fcaaae5e8dbbfa0409989dc234bb92259c83464492b61e2c927f3ae7c569233043bba1f6e4907e2f14a2cacaffc1e118226f0111beba9e72ee2e07ae9650b67605378b8da4d5819eed7bade09ad0fd60de6f65dc641f7ff31b06fbd2c69bd808c3717eb6c258a7c1198785a9a67d6ece67b5c3a3936b95018fd4290c6e973c2edcf50ea41b0c9c87750e0737c4c62ca0c07fa163f450c3baf038ec7b27f14be00ed57a2f6d0786632be7d7e69802ea79c026ed096d3ea0f146075487fd2259befd0a902c37dc02980a59407a52a07544439cb3b75e3448cd36f78813fd1576f62a1c8a2a88b0abbed47a0bb4147a1ad20fbe7976454a22e2319a7c0becf7d73f41be4281940b95ff585800425d9bb4fd57b333be81674ca5d32317800e6cef6fd5f9c4176c46007877c7aa7b68a562ba045e5c912dc3023690cebf452d94322852738e313d3394df2695f87fbf54dabc5cef4fbe24c04885f32ceb3073042347c9bf3f40322cfe3fdf0d77ac2526cbd9c7f280242ed2d3e4ee91be17d8ebb2f207e7337426fdbc0d3aa3a9ab5a66ed7cc8de15700c2f9d1c0e4a946fc82e8a121bcb5260430e153191437918fd86818be65ae4f695f5f07dd8ea2ebcc5994bcf9fcf79ec35cfbaa3c57edc83e5926b175d6f339113ba482b8af376e94c5eef8aff7fd435f7fc29fb60e34a33ba98763c6557a5bbd98c7971f9d9eebb30134bd3f6c68bc563035329a1c75ea5fd5d8532f3d17971b132726aafa8e1232d4d99ab6162d2776fb802a927fe60268065eeac0bc15ec4a745b3148d65fb3e8170659a3f2b87bea24cdeea4e1a39e7391738501fd7d3b17f7ac878db21ef7c487f7449b4211843d91729e59935f19dbea5da7fb005dd069f8d3d37c91ff29eb91e6c16650de5eef90f9512d04fe4b2fcb5b7769dad8d569eb51a18cca351943ef2c09dac9dc6772176c98bf50603166616cc777c45c414ca63cc708afada8573fb77df95fdb929f9f9e3af75fa1f10c3792210fce1912d88e030e551f7f91f312a7ecbe596d7323d10ef18c63321938692ecadd94e837281eeb3ba328d6b4cda3bec5603cb828922f2c4e92cd1fb6b4063473af0184d97f0513e4b4252e23e69cc332f01bed3f8a888fb1e67e3069dc93b35085ba0af865175db4903d1fb99f712384f6df2ad3dc7a0b87773a30623d48783de0216ed2456730a22c3e32979e15cb91e6b1b5ea79540efefe99abd27c13e0c902e801f714cdcc2aa90c7a958080e8482b1483b0029b05598477d4ee2cc47de77548e6aacec8dd109b91a2fd7c21395b3ba09cce102b24d9bfd6ba344f593d407056787319e909e7e8a9755c36f46a51a9130550739cce318dfce8ec2ec09a786c8a3a9996c5e7c08db919c49cee7b3ceecfd09744135a70ed56a046cfee75d479e83e0898a7a1892746f0d6d12efa672e08bee6ce64d87b8ee6bf8f2c68c66e7319ab7f2b7d72bb6bd4397b8a49005d0f93e1432c00f5cd628f05e9564116b5c85ed5edd7ed4b784c87b5654775f98c63e319229e52abd41cd7f90bec9bebbb7f4268fe1ace55e7b164d5ef5f73122b41e78abd901dafc1d068f96bd073cbb14e766acf235252188708823917f7496d0957e472b58a538c7f40773feb90073c1213702d3cf2be3aa177a8f244b0aa657553c81499a77f2d92df31d0137ef8b6351527eaf0e299427b560a8d4226a9bed18f3de2c88bb6011baadb2ff7d27d1df779866e230875900536385409f2a5f271307071a27fef0a284ba1385bfdf2b8ee235aba570fc66f1b2ddc2f996335ada3557e8d04f8945c062143e40ecaa6595a02d920ad70852a49ccf801dc5db17957c46eddde2abe765a10c6f60fd0ac0d05f05ea5c1a29fd0eed613839b12f15c11e17b2f80d01cedf03e3b7a35638f190df3047c7e377135e3546ffb4dda9e6d6fd727dbdc8876d4edfaf7b6d987b5d820d1ae5cf49496b11e91f8bcc6021ee3761a94bb545e67660eef5c4a04ebc4c2c149749641058705b44cb6931fdabd4a7c29d59627a657d3406757bd586f6dc954b834640c14688d7bd7686e21176b35bd01a0eabdce3c738b67427b6ce71f5e36a5d708a16614c534c77fc9a74cba3fad3e60286bb80fcb7b0cd948f37093bc33cd025eab029ee7d2324b9c0756abb6dbb044cd66f8a9479f8f5f13ff089c2fff0f5eee0a323eabd92fe51ec9be25ec4fa2d90115e777cfd2d850578111cdf55b2f835c725dc854a084b75de0cf5566d5c5b70f60010323b08f777b74143c380adc6b20fcbf7b5a4975de8e7d8182b39ac2eea36c2dce7f41f4330d3702a6cf732806375962fa040a4f25798448f3d8a3c6bc1c3271b9312f61de102f625746a0d5ef9fae4db65c1b6a1fe0131b1c8a5d7080706a12d6f1b1a1a9d05c6e471dccb8bc49e473f7a7d5fd4fa4362a46767d3e22d1f3ff81abb91f7fde7c8cf3c78ae6ecd360b297b487681f5e400856a756f95f716e82739d629dbde29cbf3e030066344b2a5069c2b62d5ec651e0842e9fcabd93be392be30693167a14931135c663975025adce5a8d902eba161b4ea745070ea0f7739de3d262e4c47c9aa9abb66845bb40f84bff0eebe6c56a1f7380695067846f3fee5b6265b1f8a803760fc196fca7c80c097e4b206f5701e92b5a5cf4f088dd595aca0485d759de95193cb2d8e2b0174ab7496f5b5679a59268cca75437bb53f295b9a8576c3b94f43fe28453484c4ab53ef6b7b8817a7752c51b40ad0e6a924bca3640f52516d1be856de98884fb3423fc76b0e09a32a67cb5776e363b8179ff7b18b4cd9b2eeeae0fba8ffc7db3393e3abc9c3a205f400de5aee9e9244072522815fe290147f82f5920fc044cb8ba83ac6a5b70cd97497f77bfe2ad1cb21c0d592cb6e0c31b2b3efae41e9ae0ff54ea2565c6a354d2a6ffd27b440c31b10a064b2b09a4a7376973828d5ff8659cabe9865b820930c192613efa98ea44275238ff9e4d6412bd379bbb22fef3559b149de67e1e368929ba510f3759d708ef8f3e5ba890aed6a61e831b0b64d49560ea0bc56d9c523d5c2c5db6d2b0dcb409c50df0bb814d3c0467731e308834cea6c894bde75086e819e55363bb249116169d80a72014059984d2a4b4f19da8858196cbea2daf3caa112d6abb8baa2902a335609212274d4b907645a255fa51c888e87b414b2ff5d55f0762c73431d987e46dcb225080e7b64d3c0a7e54cd618a12c7e4980aa8394a0f63a7b9a440320a875cc99cfefff0a90a210fc33efc3b16fde5b5c006418e68bdbc78c9d946c18b17a70201065367a26a75352bd817d625d62a6ad7234e65706557e3967e19256f7bd0c3f81a6f3b233566130285c8dcb1a784662be71c29fcefccd520a3f81da2b78e30aebdf42cad6c9347f49db4434950ddec83f41df7255a1b48c85fa22803441f019fcfac86bb72642e3d84215292a6ee39ffcb384b58de1e06b2cac7bc2af89084370df25072d27ccabfc0c100f2a8319d32c07e384060d0b34d1c71606e9fde16a9151ec5aacc71029339448cd8e28f0778f588bfc020130c4a6c103d76b7fb227563f39609d4898a070c76ed567e9b20350441f166eeb76096d0f086b8c0c9bb30ee191edd7b7ff400d404509827fae07d7d3c79578ad6d599c725dbd8584ec8f853dcf4eb4f95f70930bfc73c6b4e746a43051c334785129b7dfe080a4b2b91afc88268498c2cfc76ba5cd32a04ef913a58316e37775de75f36454e3606857df3cf8b74f5a8662de4951fe4e04901c6354a4ff5aa364a02a7aded3f470c6e6a05f158843882a95d2317c81945b1ba1e465e0b9aab88bd210175fc9aa90e9902c5ecc27f4435ed4a24c39d1883506c06aa5d2ed71e54a95b8138067f987311f448ef10794035c59be1b7aa10fe219afc24c79094c04fae743a4a9c73ad1b0a8cbd9446ad49aa22f99431f21d586c6ca4dad5e280883bd1e4366a62b21f37e2a42d3419d53837ca684074c7ab1b83c1a47ba6e886ce3ba5d953f310fa6376e6d08579e70d24f59998fb92708b76ec3bcc3128cbbf7246ac340a06b984ed57f789582b529ac153da2d61b8470f822e58ec238a1d555a95ccfd8e5be5950858cedf188759f78c5f224b4f261b49265a581a033af366e029783cf87746df08f07c15b0cd8dc5e6973fcbcdaf7f647382cbc8a3d82d2cc9f89ff877532f44eb07659e6d6d7353e57fecb49da19699c12c489892aa4c343572cf930864ee1a37da4d7d18bdcdef573d693a5bef82bba52ea6e07f46b88227ea0ce7e5880c3bb2245a5743ebd0541ef457395fa30b53124ca08dfc455fbc0add1e261f2e781a151b20c49871d9ae8f0227e00c61123dc8f2805063c9595eda40e9d6c0ff26ad221f14bf52fc63a620c253c7ee24ef0cc3013f1342313c099fab1ce99265d71da8b8639f810f74070595fac36a1fdf72839b9f15edab30700f06dd5e9dc59cafc97283639d0cf12bb8222998b71e907b31c19ee6af314b400c07a447979f07ebf2baafd0e1d3d6c7547096d869e0fc1858664ade6f08075f60a5b91caf398da5110a38b98d402f727b082618fbc09ef4317ca122aff27f87108d821c534352d29925c7ff41228d3d44fc324be71be7a714c1b1b5432d5e203ab383fb37b5e9433561a95c098e1a44f22daf3c03faf72899a17d89ebf47d8774898ebbb3beb5cd45e33e46673e9c84a9ce95276ee93d6d8c85f147519b0424e67e8ae27a11ccd5cacf01227f98d2a54c8fa7bb71ca3ea2ba7eb0907b559a197c7755008207a17d2088ca62910152302fad599b8fe1ac45bf77e9b84ffd0f03f27fb03ee83fe618e657af7e534043a7d134c44c54d64b546ff4aa9773ad3834397761efb8a5b0cc1f736f4760be44c15343424348bebaec5b70430bcaf49e70392c0a84950c8a27f28cd9b4e17db9dd86301f0507c3c325a8d93d5e7e35b4a0835619b31e2e6fbb680c38a876a00aff4e744951743c6c98c8eab6d5557984e07b56cbb24d82f3e8e01e231483b27e8bb08f1f3054eac19aecea9601bc0606bf6ce08845972baa517713555595957601c27dcf07488908afa480c321b7aac83f814e8cbd82ef05afa8f3996eb1bd5a047d7c4e030bd86be4d8f2a1b244a1c45fb6a5b307ec504fad776f5caca7d380f9c380a1209d4162958697493e6a34cdf2fe46836d87ddca6d46d2d1120da1f9f0f843fd988a32335c6f40a2d9a56caeb542c099f6bffad560205a4b51680932d564d4fc91e8cd1b900fda1d1a67e5c83bcd9e404d1fa8a4c03a724e418a104364e68d6261f0f3a20bd20b2f38f5e6a1ab20fcc403b299b3721b72a40aed7f76ba8e6dea8026ba5278b9a93fc306d4a083c3a0fa432b747a3ad1eff4d86d508d4de215b855d15b570735619680a28a2e543c11ac95aaf58da89cad6eff4f66e516dc483ed309ec747e16a39edd3ffba67e60317516318c233c3f2fc5f8d72d22ef4d9e3d4abfa6cb3b54f9cf65b092cd2f6923f2382e7b736134eb23a0c86668b1caffa3dd32366c21cf08249e8b895639c0f9bfe945645a386e62779b5fefea005ed79c97d169d2c4ae4ee30f4848cb63f530e22f70cc8a90c08c4faf05468c23c5641304ec6eb43c547533b8ac784978912864c14f9976d3fab8b56be2d73fdf8b4ffddaf7313fd20131696791f11ef2f902ae461588eb85ab1a9fcfc7de50e6eb77d8ac2f605c73e263570a9cb2c39bd8aa585d7e6b31acbe817b121b45dbf87404b5746a2b7028f9e0b0a17e31fdd590fd63929b6401e81a82f82efbc487657b90158bacdeb083683f78f2f56e6dc4711aec0721920e59931ae7e0deda7ce8da5dee0e38691ee8d9aa461c8148c7b2aaf5812cdc4622a4d997a5e6e01a84026a7a2264de1bfba5f325effe6067d11fd74d6c023e1bf507544169f655e945cb933ea317aba41952324806d340a48906bdb91d00e83df5df73ac039bbd681e6a1d1d63304da72d9a3574e4075991dc4f5ab796643e7fb0189a553d46a89c00a770926560d3d812fa3722c9b6c2ca973c292c0b76e6560728a167fd4327b3153b4f6a1bb1a3e19055e4f3be603ffe591752436824f77bd29ff0ee863458f3d044e2e50b56e26925c39c02715b7dc2cb7f078617d5a0d457b2f8de9f2a4a36c83645eada028c3aadc382773419580ca46497bdf44c0fa39a47f951220a8d4ae72fead5e6003e3cb79a1b10fe3c20f3fdc940056863a36fb3eaaa786cb990da4bf2bf634730f92dc124309e95f1f1400cf63f562d3f1a47d6648236f47eab105e96124a55ce8cfe6121237c2942ac7f73e37efc321c2ddfe2e3feb466500fea417d00d5b3ed76e7c5589f27fc68150578897cb5bd0cae856b904cd6f5704ea19f2c4dbcacd29630edb554128fffc3051de8629d0a4853d929d25336cfb2f334ef021161cfcb8577f40b74ee71b96ce08ebebe79971a4a5fe36f48a87d70d40962042a002973fbb9153f9f35e46e7702d5cfe49cfa8ba15a816de1f532fa126a42d630125108e94d2c037668657ea6a1b90c6a1c52e76fb23b703c2351216bd2cc92bb888468aaafb4ed48a23a313b906d1c66ee0e4aff22335021fd4e097554b0ceb8bb41eee65e70ba1fd34c1e760f9cf1dcfb4a4d66e2911ed5d10d716877ce23606457a92f99e0f66a8966a055a331e2976f1c89f5574aade59582787432398302f5bd6e2385ef51bf9c796e70fe8d21fb64ec626a7f38fc8b62968d399413e7bbcf32bdfef6b33d46714bfde7079689af4539c0955e63e5e5d2fdcc4366f5ed78a182e11922b570933755d255e7932dd8edd6c2481e0a8317a79cb7ec0754303fa83dfcc4a678c2ce3a035ac8747917754fe601ab036b4104f6f242178de8506b3ab0113505599cd450d5b762be5dfd2585f6121261ee10bbdbd2488cc1909528279ff3f0d18d7250a85428599391d3547562051d094a78f7f8dc562faf304dea81f9663093be37b5d0018d4d952469fc633cec3fce3f75f0687ddddf7223ecc4d9b29b97a9328ef96bb07e319d499736a24e60765767a07fa7ad8d0253c04abd943f4e4c7c99e2247cb32d442edd2f6518dd09508eb18da97db6ad0955e8545e0923c993392963698f9aeb1f812d84791fbec4da22eb3e479c7d2cf4e737b5686573c0e58ba07a4d3b9f87ffacef300089653e9a68e4578a29c8850ff80204413c26100ae7f95f3c2c0584675bc6a9ac70758bc22097f580e3c72de81c80a7cc0ad098e60cd183c74416157edf9d0914d2daa2c64e60857e788ae26e489d6c0799d9e573dd5adae444af6873201fe5bb8646c5a6078e354368deb82c05bb2935f8db26c38506326b821e34aeed817c453e6cef6827dbf89c1d12c2e9a3a8939d8732cdc17695cdb64ea568c4685bad00e6a5163d1fb36f46e00be93af50e96ede19d96c7ef79cc60568e523eaf051733ed7fe859460c77c36fee1785d57ca25e7439da6bd588d87556874512c463b6b2beec437182bb86ed440e2b5ca0d1797150b354b241dbb17b76d95abad4a422b0f332ad6fda31ea8d4974b1bfa650cbafc526e40d5df74f08bebdeda14b74f9d3c36bc474ac13fb9a8c40295343ec4056d7981614f84cb5b713f4b5abc7bddb9b401324bafa6a44d8787ccf64bac1eb1575f0767980145cb41b592b64d043924cba3032740499d6b285a5a8786fb59e93635ba67c8b8f242c8537d0d9cc3369dc2bb834d3c5643a3646686151bde0be0ddaa2814703d985ddd761530ab15ace456a3d909aabb48dd87554307786179d536043c4049a521e06a82b9716eb28a4c943b2665e67a46ebe0ffb81d2df5333f8cd58adcbbe07cb35ee8ca739058cca257ca68bd34c4488d729d4d3ca313d74257f3ada5be9af527df90206e23cefa1ab05c93ab4c144833fed3b82777155208283e10c6f1e6d3c07052a570617745467d8ee91052bd65f8be2629b66f6663923b0b0b1d3111a43c46d18214bb88b2e286aaa3889abb8a039f14559e2bf0a8ed5fe66cd794eaa037c82cddbb8d337d36917c576933d93e8ea0e102baebb4bb6919123b0257e54694a7eab73e377a0f7600344221570d0bb4963d5b2737586e552615377ca62f5238660d1f30b23ae64a588f01bdab52668aa2e0e89777bb6d3ba63d4056858d03f88c5d192e60c78ebf9533a1158475c1f5e971a51610d52c44f6b15bc030b4fccdc320077ecbaec50a0aa471a82ab93f8dfd1634cc68d853f519d54683fe0dbe9ef3b76043a610581c495431de2251166c586064f555382fe170d8514409c99315a4e3875ca43b6ce32e06d69f296bc1942eb5357c587ad274d501264c3650e49dacecfc759367778636e6ade4053b379f436cc9682cb833f0fb75d794838132c032bde85b1f0ae483f6d3d1da28c140ddbabd7c28976a4e4ab9ea0bb6d3af3cc4bc278b5d78a9e1541ba82fe5ab4af18122bc4d4848ba5a1e10926364c4a6d0460bf1e2e1044752e7400e84090474648f4c2a37d7cba2ce213fc8d37b5a83dad30060013892d6300190412017e07317334859c9eeaf50da6cc5cb4d5531b029eee9ecbb64104ed15ab5810221abd57f635bc7a4faab9adf0a1ca1cdb83878de1882035e436bd4dc300bede11cf9c73f32929a070619868175a4281b3901267b03603b0d258fabeca9a7e6ceb770b73099ed2939dfd0a1c3540902c9ac189717e92d7550358a3afe4eec5a18eb83966256d560d798cc6c15202e0bbd062af62a46c8da12f1258a5065824009f706a48395e3f22fffd404a5786aa4e21e35f1972edbd50b73a3f4f4830a2726100ef640f1fb8acaa4e7e2d2399d75597fad1291d569f782651ba960617a978e124938dca0c98081d743aaba47ebbda41112adab58c4bb94c142be34ca879258d3eef840d05e43a5ce714b874025173f2a491b48ad66ef41727b043404dc8500a880582c8ac780aa59aaf090c035553401166c614d2142658aafa8d0cc849060d47d082b3ac1dab2940295d4e951f427b0660a971f0d29164f3e9a69a0f0c59e888ef352be25c389a2594f4f261d9899e9735831d98f90f7c6c14a8af42b3e64c80d085f14809bc4368480f68f1614f1781ce329655c922837669f2d3424fe7d5a1ab5ac88890fe999fa65ec1939e89fc84f490e32fbbf26677d99b275144ccd9b52d1af3f3b7916784fdab320284e93a2f547d90cd017a74d0b1ad70188f6593b236f4a320a6195f54573732cf52cb27570405091cbef9ac601c86cd313432e744a1f380a1e121415542a83282952079cf046ee4200f848468462a9b9047b1e04d7c252f3150de672cd0979fffe387032dbcdf9eccf674df1cf00b68f2b95049035eaa13c82f96d3488791e8738b390a3ea0e841b07d8b350aad9a0267396345b6d01bd8823f9640ee9ef6cc434aa55ccf9cd5dd48d033ee3216d3839a2cfd18c6e5fbff500536146e070ba65cb83cc3d0b5fde8730abdc18d64768a70198254b4868bed17cf727baf11c23ec5971309150fdab0636ba96cb44552a368b85a64933a68c5761857473decc99106331544b26c8488a442bdac1dbbd70af0d29c870a886622be3c0e6557c4bd57a9b2eb34e27a25aadde95be0ecda004b94e99786f9cc418d687b14fc6b5d6b02572aba529a084139e770ff238e396ac99f8ad477a6c798faacedbbc46c5d0110bdb8f9dcfc5f40772f7a3d52a41c14e121b19b638754a15d4d38d7fec13cb43786d8a9a86992f4da5287a808152ed3561135ebe03abddfa03fa1699ebb2323f81466b41e15e11c20c1c08dd0b7229a3484c8f942e0cc059540c315681f861e759b2dea8b66f6494e75e2305544986c50d6436c162450c808b97d1a03219b91f61ff85255b49f57403813b4d074cdc1f0865969800ad265fe3243fae199aec7039dbe61a3547d87e9c4cffabdd83eb210f2ef07a261d27b7a3a5ba9c82d3d0fd4972351f809397b5a4918db895f979d796ea63e197dee40f24f9bbb4ed832b63dd8d4a6bc49376178ea86765bf160d5fc6da5f8562c1b58f01302d4bb3f522512ef77f6a58d94e8bbc2ca69ffc1e83e705f84d540474be44f1d8f309ed3a46fded70094135ae1eab2e7da0d8652df4e704e82cf4ed72eea220d1c7b0f1d4d6aa94b4b7ef7383355c707aba6c091ecdc1930d4dfacdadf70374fdae9f127510ba0e564384e9653908be365ffe39cef6915af290c14fa4587e62d13fcf521e3fb04d3da01064b4e2cac88426df55860f203d55b402453b08426cd5891ecc8bdefee98fed8091f6415989a1540b9f5d34eaa84490d0cc4bc8971bc933ce3ff5cba1406b8c3f7a7a93f83bea3ed6f66d2a2e6ab79a530a7517f7f912788d91224f7a79c03de25f4ff1c89f91d68630632580e2dc6a3c3c0fd49e6c8249eaa371a5c157eeed12dd089fa0027983ce0cccb66d30e4a7d7eae9d68d0d8841c39a27f02a66b598fd97a44339009179b884b2a50178c78e13579234ed3f489ae5b6f3ded8ea967c1ba83c49a283304e7c4ee22320214646ebcd7e95f442cb3817ad3af3957fa7ada2f96dd6ed09f2118b96524d90951c978c273df21dc2f9cce22e33e6b3f3d49bed412474849f48bfc8633252ba1d4a087e00b3bd2c16253c5a146567cd7430be585eaaaeb62807d76c52917faeae82ce5b87cefc22edb2b6b74a0cbdefb0569758cabbe48b996018dbb87226404d36aa79c69a07079a0cc4a969f3abc11d1eec169a15790d476b58ed1d170fb1b0df6c33f70eb68ec1a287fd4b87db466d060b096ffc2b75e7fefac8ffba6d1486c505437805f422ff7968360ca61d1c1b89a9a7cfc077197e35f55fe085affa4649640e20c920ca38c7fb1947fba79c22571e73b0c127109a1b38338ca4bd41dd457b74e32049e9350b926524201b9c535e0fd893ac31ca635b9e37a9f0d921ffc9e7e0106866d909ba8867405606a1c6231f2e1a74150ed6504476467922c67544e1f9ffdff68958db680c246c1bbeefe2e355a82d9490db8886c3a1ea0b149f305d9f632ad3ab40be4d7e8966b314b083f85c4bc9598a6196b304990f33818b2252a2a63929f4e2fe38813efb2ffb99b031639e5e46a96091718ef628a4bddc3b61d3bd1c27af734a42cbfd888e1136e73150a1e3ae4acc2c9e36eafd3f92718ffaadb28f36d982fef4fd856c5935afb782684227d267ae678c79823c4109c72f62a4abe99dd3c79f29ca194f6105e4bc962397abf726567818534c11ad0d0727c9b7b4c840f271364f749cfe29cf5edcc8fe923c2b22241fcec88ce54c26de6735c59260e49e695a85b3a7fc06ff75c15656474836171bdea1862e7d23e8027be2e877d7aa260cb69eaf8d514a4aa41a91125c9c172d11e1f578f54f741950ebf63e564fe01ac807559fb84076e4f6087466b8d6e50ff1aaa42c7a1b9dcd375e4539b922f4ddbcabc136b8cdb57a03b0eb7af6894939655c6b359ee1853e6efb104de95ab89259079a17f33722ed69a7de3ab42c34dcda1cd80438be4b4157b7f76aff8ce0fde8aa5c8e382240b04dd04c508cdba167126ca6c472359a8a10561d49aca99479d43a6972e955aa81a5a222b8e3fe2d8e6a2fe7165dc5e9fe85469ea8c751d851f2d489d71e2c598146190499fc1917bde4f3fd0b1fde754e9b6963e54b14c2fe998bcddf6a4494aa4578236bfcd91e3da804f5723ffc256e9babfab8a8bf6098bd109dbff1c71b38f16e8e3b281426fca1a089cdbe0f035797b0ae50710e50bf4946f0fcb6cf7e0e8d5119263f76fa59301f895cdf272d16f625aa227ba5cd7789e7aaa70997ed642a472f7f35d8b96c77df82efa4570476319f287d639dcae7d4e1f973a13eb7ab9c8d791b459c9ff0467c060c7546e1facb7b7b9e39624ecd7417ff2cc05e87949b48e454c06f7c333dba1b669922f7e0a44bb87be81efec93fda3d0e6ddd51a96798b81343f39535ab696c7903174e22157a8d0327f61e1da52c6d80c67af50341e4761a1b3f104f15f54ff3690e4e037396005a0f53bdb95b3371a065eb733c345ac38965f4c71189af19744a33c8b95a9cb9e877ed3c52f2a08c728178ce244e76e640dc91c1d3fee2a7f23d920753bd1961ddcd5082b8b1fe1a465449bc3c04f5c61ffb64e235da2fc0d39a2a8ba9e098d3568e02260e6675ae053b1886e2b289587b21fbf7f6f32c5e4d085f306a49d91e6a2563644ae1a7573a0ace3277c2c1a4c50acc99aa58ebc56927cfc7f1c5464c5e0f5df3b47a0899f6e3602f74d53a561197347c07bfa35c46d7ecc7cef14bde4423c505ea3d53e3d290ced952552692ae2ba5a5ed85fbeff514341af446c12994bce1350586eaf2f716ea32e7d9b65f6c57164bf0caf8891a1ddc534388fad3c145bb1167a23788eaadaa40de7f5fef3582f59f10c4e917406b9b84252e13bcde617eebe907f769485b17d59733a564249296c0f4f133c2b54e80fe5650f0e244c413578f0e6cca34f076a74cc912c436ef4e0630dc54cef04073d63e0991f2ab5541813ecb80e27169d3aa490b8c1293f3623673928fea85069fe01e85547917a0d8a93e9afc7cd7566c687b7b47a07c37ac1e99e39879ce4240ae4583db772b35ac580dd5f20f19322b63bcdc597e9b2065743942c780108262ba62d2f3ebef4d7ef5f34c5f5529421e74df11c1d16fece6f65da3c7e463ef9495eccabf882237c7f7c3725673ff444b026035bc22171f592ad1e1b3468d4bc9042ec832ae4ebc1633f135b8ef29f321fdf58ad55b4214006e6e423078f8040f2fff5b5900762e9b57343979807c8cab31d46735095f18a046e4df4f515b5a16c86cc8e789b501b57aad68de0c15baec5e4b79d35066c36cb5245fcbdffdbe8510e10bdedb0315a0d46f90535a2c7c736e35c5ed5a8a17cd4325b26088edeafa9ed53382f97257c8683e5e5fc65b8810463c1b96b949da87b508046979fb94e599cc17bd37ed858791a2408f320fcf4ab01d245c7a0a626f34cbbc2cff1a3d7e41581899c6c8b7fbaf8458c3a1d30856e8986b33c84d1a5e8e520d194254221edbd517dff04a60508ad3a69c63d6092e4e2519d905d4f1356b6b8c3201e73705cacdd90e7a1c60f3d4408e3f371ef137352763fea7314989959871ba0ef3cdd6e6de6f5f1c207febfe4186bc5734e1a91f9b74722671c0e6e2ab97ed5c5202b4dfdb790ef5b554e9a2f4d3e33b44102d2868bfa6d9c05ff34a75af59d96b9fe929abd07807de6fbc80106a7ca5a6f50fef7ba2299118dd2cd672ab5ac00bc40abfd8cf727c10efb2b76693248bc45a9bc39b7dd48fb2ca98be27ae9f0a87d7b55df7b651a0a96dde93b31b9b8089119abcc8654fa1bd077bf1fabffa5b32bb7cb1d0569594a673b69fac456a27ac0c3c47048069e3fe56815049d8ec33460b098cd2a5705a44c049b4602c1698efad5e74798d68e415c3267224bf974f84e60e2641590dd25c71b0264d9026ef144dd0c3740b0a6d0013c0c3c0c3c0c3c0cbcc6f0f7e66e6d6649482949a299b0e0cbb097049629a594644a5eefffb3fd57e340cd7e676d6dcde881ff0cf30ca70c663f0dfd0a343c919436978e97ff62d68bb911343a9120e3bde8855b0d3a6947d67247185fa820687022c95dcebab2ac9b388b0282c626926406b75423f33aac9a480e1f5e7eca523b359d8944bbbe4a173ffe69aec444b269461ff1f9f3f0e5901f9e2e9120d63e55ca7639bc7b236bc5c618c30712e221d8320ed0b044527ef71873ff694ce156225143e4cb7992ab795b1a9448ca73ae7e6a3fb4f26564cd0cc8901f3ec2481e84043c78f41a684ca25319faa269c47b40da0e0734249138f25da5b366542b9d051a91d0eb3ecee406d7533b0d1289e16e4bbeedc39a5d5eec28c10e2f767060c81923033c78fcf02143ce18cf834719341e91203e6b3c99621a8e4890f994a7bab47a182b824623122ea83beda672d023e21e7634189120a3626a693e5c1891590f532ba3ec8c1034169114dbf9f2a5ec8511cb0205df40431149a14608a9fa79233b968c614611682422f943736bac2e866e1e110917b469d6d497b6367f88a4b5d3b3b7d1d2524d86485026b498d65688c4ed8d770f623608552244e2a68af9afcb2fba6910c91636e7cdeb1e5c7490209274fd87509bcb2a320722f9e7ef92b9af29d10191183cbc57badacce9db3f24efc9f1a0846b9ecb7e48ce18f47aaa9c731ef521d192a93042a4da858bf22141853cb9d6e173252ff79058eaf26bbe7f4c83500f4915d3438970fd7455c9436214cdb9d45bf8db1e0fc9c1c5d2cd8ffb8bd01d12d36586f2b218762bb343f286eb571279d52161f4a6247efe1fed5274480a968332519dae84eccc21c14f531c1dec5b1ed09043a2c9381b63a756309dd238248b4c3e3ee31b96991b593b0b72849c80070f0e020d38249eda58ecbbae20530a5b81c61b924d264f517683d27d7b1568b821f1e7324b665021c4c6db9078224a5d280d93c1563624e7177d496590bd7c7173028d3524654cea213f98f6f0e2faa0a186c40e334a59929bb917ae1468a421c12dfecd28cbdd9a311a9264a3e8da11179692679640e30c4959f971c77cc3db9366482e25839d900fcb90d8315f92172e8bcc54661268902159f46656c9cea43dfe48a03106affecd6643a7ed9866d01043b256e6badb6d50e1411a61484e67b2335f4e5155b291354e34c09014a2c94e098fa946c8740634be90d41b3fb749bb6e0795193884861712347436255df3ca6c7c64edc75d17126633fb2991f3153a32120acaa0c18564cff6df51e12e074873fea0b185a45051beaf8414a13c3fb29662a0a185c4d252df7342744d66481928e4c240230b09627f373ff7b9f499ab5848f4f8ae418dca5021fb91b5e3c1e3c040e30a09fa9b97fe37a48dec053f7c7019685821e1e2875b764f19660c39434850f4d0a842e259cf980c1d94d8ce70d9000d2ad0984292d8253d4afe8be6cf23ab0986183d4e40430a88788666cbd8e65ea94c2134a290b4fe59252f42c64d062e83648ce363481032121862f44034a090a027d6638b9c1373ffc8da0f204f48f80b1342e83855ab8c32820011624646aa41d1704292d0a363076defb19cb3051a4d4876f553a5ad9b47b948830949b13d67860c7bef234281c612126d65af36e93919c2574262770e6baacfe246e9494812baf74fff5f76ac1212122d9af65122ee72597884e4926139065fd50849f515849ed1b7f049a508896baa7995d7a33de6899034ff155d63ca68a7ba2124e9f2503e16bfabafd4031a424810dd59e46bd79cf02025d008024aa48bdc131f32da913533cae8918ae50f206378c18387ff0032463264a00104477c7e3a95d7cf4ae7434818f6041a3f48aa0ca1a9ab1e4b29df0749b5a22b56d566d7d11e24a7d99f85d549830749392a6c8a97cd4d511c59eb1e860822bb48121654b84f32c31f88e822c9c6c5b363c80f5d25ca45527cfd20474fec3de58cacc5c0bd8c1e3f7c64488fc34582a6889acd1633a60ba281ff38d30b81c82d926da3e6b93219645d1d59eb2104480f1a1c211d10b14562277dc22d77f47ca61a59334bd35a246777e55c1ccf7d0809031d20428ba4bb144b32c5a4dffdf1314c0e44669128671efcda4e8cac4916896e67dd1e47a5fc098dac0119d263a40c3382602c123e6ddc5032bfe56e0de487c122d1f3cfe92426a217ea91b51ec60b21437e244230a0af485277a9fccb2109af6c5d919cacc3f59ae893e28f334610b31d6168a00c0f445a91acfa79e22db57376bec719428694954b81082b92ab62ea8b73e72a92356553b57c325524c59c6affc2fed846cbc8da107f01ef084303ee4348186088d1830c915424f5a92d1d2e7e9e65b71be265941188a022492da58e9d8be990b31822a7b07a4f43c67b0a2173051153249c6ebb99a8a56c0c444a91541784e5b01747f6160622a4f0724c55efbf4df14f20320adc7b45caa7ca67e1913533815a1b4444919464eccd2974fc7f51f1e05104915074252c95de7461df110145824e6fc972da5cb79813f9449252f92674accc2065630a114f24973e69753afe06cbf0e081d6c3ea6c14229d482ca536c65530f30b9641c611724260031f64f818120404683dd00c14229c480edd7eb5a2540e61d15207914d24481bb70d62a4d7c93c1d443491a44b5ccb36c753bad42299488e15d964a3a4a85a1507114c246e8ce5379e83169dac4b24bde5136bf23a6d456c89045d1ff22a63eabaa966bb9548be207dfd6bd48da78a12099fb297e45f0ca7746e12c99b15e37b6cfc3a289941441289e1848c05e5c1e6ba8e44a27c0a4fd3659f9409412229c5a376c8b8a75d7acf0007f4114916638e6b5d7ad54fc711091eb6f3586c4f315976644d2920d288a472ef98dae182cca9674462d48d22449b7f98af44169118c307213bbfcfe80af26247816087173b0a8c1d5eeca80fecf062477db1c38b1d9507114524a9dfa84da5d444247a483dbdbf4b71d335b2a63bc2d080ae8121460f20228848fc9f2bf50c912b8b2d25440e917025f38ab69797577064cd87fc3817868821927743a9b61421456949c89d08440a9160c236985ad2ed255e337ebf102144f2da25bd4963efdcc88caca90744069198baac2efde7735db69b880822512e2f5b1479418a5aaf98916498f1a30c21e357201288e4ce5096cc4eac65108dacd1c07f98bde0fc381f506384082092fe63a8baa6af0ca2aa1142e40f892e1e436be98e7cd1bedc8e3034f00304250041185fecb0c01989078f4b3b84881f92ff7bbec2d9c92ecbaa20d287c49855a2f3e78e1744f89024b692eededc3f32d67b48b8d8d15295696d75480f279287e42d21478ab8a6209ab205113c2477f8df14544f7a588d8982c81d92d53c5cea33b1340d324241c40e4917725ea696527e50cbbe300602913a24598f5ad6a6d78a51a14382e9c91c434bb78d8c043c44e69090952145abce236bc57684f1c50e1e1cb83188c821c993bc4cd5cd1f2a07d5201287c48c31c4799e4def988643821af16aa6bdf486c42444f556ef67a6d3ba217153d76fc99315bad486e4fd6cdbd94f84d420b221f95be76cab838c96be35249ada6fbfcd5d21eb125143b2e76f112a689a14dbbe209286e43d95839f32ed6a258486c43caddaae9d352769e9899c21b9e37de7b31c2b998a8b9821316bc3f3ac88cc0cb2b1824819129496d16b6a1dbfb64286e414dd23c4f55eea519571867b600c091a4b07b558a75abe1643929fcecec12e655c8a5c4710094352386d3b61514d33c52c41040cc941ce78e6af5533a17d21e945878bd1be74ba3579214926d1f42946d4473f5d4838fd614e6eadd39c9a0b09ca3bc4b87a251d947a0bc9b639ecb8e5243b458b16922e6e0ccba42afdcb998504f9d050196f63180d0232e40707b090603a5ff3edfbc3c694107cb1438b895c21d1348e7fcc5d418a4a2141c40a093296f87855a743b4f2211cc01a82481550b554abd4f20aa3e12d2b6ee69c47f79a791506112a24862e9f91d9548c963485c4987274baf499e7d5238584afa4e6b9a3a6888847d6820011d2418008c1000f1e3cca080224c8f940904386481492845afacae6a523b434b2667684a101328008c940183c780cf132eab020028524b11baf430575eb9534b236a406cee38b1d617cb1e30cf7c00530801a7599c813124683cc172c468dfc2fe284a4b03f31231e6e377f9126249da5bc95e692d21f7a112624f6a825ade6e9d59a17594252860e7af45797eefb224a48caa3a3a2a7242eaafb22494812f2b3a794d29d17be081292d3648cb98d19262b2f7284a4d3a473a5ad3d6ff52246484ed194c996107f5abd481112d483c8aca46674ff2e4284844f7284250d625ee32e3284a474f17a2b7ba585dd458490145757c23d99ac64729120245b12a75ba49de80d721120248b8ffef8d147798b5ce407a66ffe7b0b12f141c2f5a65349454d6e3a223d48da94d9d47b8b1ad911e14192a6148b41ae6babecbb480ea6f53a3497461b5d1749b55b7a32093d9a44cf4572c93f935961cb34745c24f66fc6c85397317c7e8b049faba42b95874bcf6d91bc6964decc994fc8ce6b915cf98469c7bdef5a4e8bc4ed7ead386699d79f4582a9958c8d1c192b2e8b8451a1b39bad5ad98e4572503236fe08f9164ab048964db2bb67d36f4dfd8a24d9f0b77165d5fad3ae480c33a5e3bca626cd742b92cbd243668b49cfb43fcedf5faa60215545e2a9ec68aaa91cb22dee43481838c4462a1245b6490bb1a62b9d0e2a1246c814d54f9f8e41c8180c317afcb0718a246df982d0cf31e9bc2992d2935e47933f6bed8eac9522296d4aca375b8acb79ba0d5224ca9c8e1afd93faabcb2892948a18d978a23d992f8aa4d297f3ed7207153b038890216578ef85223975a87928cff31ead063ede8022b96d5375ce21f489444d252fa68dddc85a7ae22af3ce596384963a9118ddb348b320a33adc9c48cedd59bb63390539901e6b6c6ca2deca3799727a1817d8d044c28db060e14bf5648c8dac0529e3870f10d8c844df69377e8467cd31061329ef4eda2e7aa3c6236b9748ce94febd624c2a89e8466c58e2fa98ae44c531157f54893c684daf273b74654b362891203307e1afc1944ef54f224197ba7d3a5bafda5d128923547c839a7ad2a68e44f2ee6b9241a6886f918dac95c12cb00189c4b67cd9afa8192b9a47248878b3cd1ffdf9962392e4c650ef58a2d9616e44b2c9ce519b3994f68911c9317eda672a333f4b5944d297a8463f15b4fbc7ce5011091ac2b5db2ca66f8a2622d952fe9ca6b631aa644424e7a89bdf52fa5c4fac3b44c2ff854a775ee942bc91b53444f2abc595eba7531e2d85488ad7196233ab377f468884cd78413fe73237c34124a5649fe167838c234741248a857d545f4d667f0622b1b293c6a7526a1b8048f8701735717e6a7e21407af80f1f63fcf0811bb0f18704953fc5cd412f3f25cb59f14382c8d4b87f734a94b646d6bcb0d18784f1301564da9cbb6f980c1b7c48d27673f3e1c347c3de4392a9cce9d154a38e86fa001943ed0336f490ac1f3f7c4b4ff6b2e78c0336f290a027a34ea98f711a2a2fb0818704f394b5e42e9bb8cf38639861ccc78f13c444c0c61d92c3aabe6e1875cb1919f2a34cc0861d92f24533a9a229a71c2a6356213ec40766c0461d92525ecfca962b6f203f78f0d0830d3a24a7dd338f1d19c3726864d360630e49413d77bf3d97ac9acae4905ca637ef594f27bd66998a43e27886e93fb3f43a42704810f5a5d944eb865bfc8604f99c2a8c25936fbf0d37246cf21f3da1c36d4c4a23eb3e8484a118071b6d480ad7ec96c4b66ed02c1b927ac42e98e51591d790e4797c4cd5680c63393d7c240531a3470c800019634f043bbc30a633b0a186e4947e63e2efb55942316ca4c16ff7647153b05e9fd1909259793d7f9530bfe80d6c9ce14e42a8a0aa524c6a064696696dd752a2eb3f633300f0818d32247aa5b47c6b1feb37371b6448b44baef143e88d991f4362b64c221b762b6e6e6d88217184744fd661e51d0c43c2c5d992f15da752ae9b60030cc9a35383288d8d41f6e947c2041b5f484e16349c560fc2539d5e4838b9f1edb1b4b878b60b49e1c4fa5daed85f137221e1e5322b5fe5aedeec9460630b091b2b4ec520d4d3970a6b21f15232b74a49cba93d0bc9a16b34574c8879b260214193b44e0d252f566a0786183d02a0041b5748165d9a64a78fd571638eb06185c4f41ecc6414d3549bd440d8a882ea9fefc47929cb6d532171dc63bcadafb975680a899a69aac4a8f2d05f4921496f29cf974e7cd0452151cbb362b0132696e45048d23aea4efde5f34e7e422a9784b8f49adb2ae7041b4d480a8fa6dbd94ab996aa70b0c184a40fbdd934ca5d872b066708bac1c612f4cf5af952ea77aeac12da91bf4c4a26dd3309c6d4f1a2c8243d844791909cee633cdb5bfd4cd236d83802fa6b44f67826a56484b4dca9aca26347cfad088917d66ddbffe737e844d8536c31f1ffeacd8eac1912d81842d29f8ee371d172fe7a3f7c1c217d76676778d91d6c08212d551936fcf8090b0a02cae7e7c4a8ade867780c7af0a925c10610b67011d36c29c86c251555593f99d19f31341a380fecf06287f91828c821a34c089021c72cc2c60f92c285e747fbf5b41c3c4348182018418fe163c40b1e57b0e183e4fc94e1732aa17c34b541d8e84192de27ab52398c78311d2106860d1e2407738d5155e5f449518ffee1e36d64881916e81f3e32c083c71162357691bc7327566f69c4923cb236e4878f911e6e031f659829d4d04552d4dc9a4567ce3b27e591664ea8918b84dbdc5e59bd2f9f84b848d4dbb81f3c8d765dcd0a356e91e4d9359af3325b25750f333bd4b045721e55aae2458b91ae153ed4a845b2865ca7f3b16991bc26ef2b9c124f56a759246d52f374716cace7934592e68bcb95a64908bf4c146ac42239b3988c5d9a84909ac924d48045c2bd7c8a1f33cb65505f91b82932275b398b913222a1862b1253d6674fb2936ed1502b92be928fea7fd9f1fc6145f2a5e47d35ab19eef1d92a92927f2653396232545615492dd67bf22e6ddc13a622514345ec462d9cd60e151509d6c94f9c128d1befe3427047181a3845e25cc68cf6ccde77b6291235638ed1b4b01409b61746db74e86cfd4891704a76ea4c7165f36d5ef0e031249d2064588d5100f1e1c5036a8822143540d1801a9fe8e123c8026a78c2d30f203f7c04b180a71f401250a3130aa8c18932cef01830a0c62668e02388054e000206d4d0c40b5e70c278408d4c60a28c05d4b8c4016a58a207026a5462003528e1c300352641801a9210408d4894e13e0a5003123d7c0431408d47249ea99f4df1bc94991c91746dd6959b41c853bf11c91d6356d0e13a277a674492f0f0d0e77976eac28b48b0944fb78c6ac5265511499fd3e6a02a6e63ca2422c1defe7d6d946bca8848caac19e46e4a1e2269546f6ff29121924e583c912d4dd61f2c44f2be257f0b3fe252120991bc232bafe893315c89834810fb167117d399752888b552ad5ceee50291dce1e4a924d37eb56c80481ebb245ff152ca49e90f09f26a639acf9131ac7e48ca1c37768753e9999509428d3e24afbe099997f7b6e33143a8c187e40fdf20d3ba474d9b1ba1c61e12dfb654104a63b83a5f0fc939274bdafa275d2cce43525b859efed0af381a0f1e39a881876435f9cb9bba648607dd2129dffa9b0c66733947ed9020664c5fa6d6e6fbbd98371030906bd4214945e54d177f45f54cff4103203d800c492bb3400d3a24e81c95d3e6ec27e4fe3924dc58881d7fff1b4fcb21d176c3a7ab364b4da73824dac9af519f794be70c1c12d353dab07b2763dc242f1862f4f851e30dc916e446a5d1a5b2999d6ab821a94627ab74f7667b1b92f4a652796e37e64e3b1b92b2ad2fcd7b7eb1d45943e266ddab54322de98c5143924ee1d927a6e9dad9342477a8143dd6c8fb949435d0905c169ffbaba566d3c42ea8718664f7fdd254eb78a7773324754a95b62b64d2664a6548b4d92c1762f1744e860c494254cacbf1e1923c8d2141a54b3188ccce69db1443d2bcfca68bdaa520bf302489f6cffbdae0f2160343629e884d6eff49cbd2913d35be90343ac6b72b157fc7c291b51e638c71766448106fad410d2f24edd5c514722d3498a70bc936523fbb9e7ff04bb990a0f9738cc1dd3ad564a95b48da523b566e9e21e2d742721022438c0559fe199485a40ea53e650e7d42f48b85c4cc2d1dd90a5ba374850465c2bd9394199b8b1592daf407df68615464578504a157dd3b6c36bd7ba0a1061592c2767fe6d4761af78eacfdf07186b81085408d292486178d41880eda83facc2a50430a09426e7e93579d6452711412b32d5727bd2514b4d33a8dd538e19b213f4e3a26e0336a3c21a992a67879c3251bb58fac09015276778690213f3c831c325a50c309499fab25ea1d5a3b8c359a90a0db72b8a0d498fe52332149d8b505ed4926213b2f215944e78605dd62f59511a38612122df7d6e252daa6f49390ec7b6db131efa3490d12924545d5d8501f21e1d328bf249328fb0a1a21693658cc6c4a152129cdadc52c4a4de5132242e206d11bc53d262df31942c2cff679568eb695540889a2449875b8e4c1728290bca77c84341545c58882ec510308499f2a598ee6a2a2dbc8670809030c317a9ca0c60f92a48987c5ddcb0f1f580220437e702004357c90e09a42c9a41f9392cb21cfa0460f8a0d6af02041534a297f9478edde9895018d5d24bd56daeece86574e1927850c09424317af7ecc7a1baec534bd5ce8c1346dc5d3f549b5233ba48c1d1918c10e3e1ab8485a3729dad2be870dee18346e51521a3d69750c47d6d436c083c78e30bee0c1e307101f43aa982d1c1d4c5816319d52d2701468d422e92f5ea9a8942e46899a062d922be3e66421934aa942236b6a25a81be2e3878f1f66f47074c621e38c0c27c304346691983c8ebc2044d345b1659178fe232c5aaa943d796291b4398797de20f37f33b048d097b3c635a1ba7ccc572407154ac61b55273f225724852c792d9ef5bc62ae15c941e81e3bad4c39268d15c9d12a09bd55dd41837e64cdac58b132832323d5a0ac2239b9584c4fd994b4a039430e067a181b68a82251bc2f26b959177533e5c010a38718345291f4264b9e5cdacc7fce0c3123c8103340808ac4d49a729a53a11d93e71489a682a99adbc8ec569a2261b54307177d2353542840a3144921a45f9ec999679c49919474e98abd316ec91f45e226213cbb76d80e21d4020d5124288f262b8bea1854a74391a4fb74b6503a64280b2892639a5e26a931c8b4f413096395935a0289674ae74e9f3985a7700e1e24497dab0eb2fe54e565170973e321f36a5ccee5eb22e1bf52862dd351acce45d288d1104be64954e7709134f241e9fa54e1377fb748acdcff49fcbdbe682b71d822b182e8bb312563ecb947d68a80a316093aaef36d7d9e1689f615bd2c1d010fbb001c01c72c924e6b76f98d3601872c1274aafe9495aa47476d642d1649e1de92c6b8ddf4393bc2d040ba19639c19240f70c0a2d64b59ef9bab0b03c72b9254d62d63aab679f028c30c872b1244a6f42563377fed6664ad87cf600c20cc65280a70b422b933ac09d9a73f08cb46d65eed033c78bce0878f1e657080078f1e3c78a801072b92ac74a36cf6201cab48102ee2cbf6363d86f80bd070a82261541211c23eac9c0c9732e0484592a896b7d36b962984a8484a3a0615562a44f69b7b384e9178e2daf2f85a4ca9c311c0618a24a53eff66ac8e0c384a913c7aa365f7a4c5119b0b38489154f9b3cda7f4ee622930e0184572df6e59cb07f9ea6c64adc776018728124fa5d64ab2c55385b204aea14834eb8dc994fa3d2c05810314aeaffed897d8944de0f8c477a192f29049fcfcc61309d7efc1721c2d8e4ea8d1dd445b4b369acc8c095d97a61f3c838a58308183138941e6f8bf398b97d1ac81f78fb31e7656071c9b484c522b5fda9c9f7da389c44cd9f228b5ef75e56622b97425f9676f6a2e8489041fd5f92cec69f56c5e2241f6fb5ad675e6a46489c458a1ea34fa27fd901507014725929458d75325549690274a245cae3f25747812c9bef23e763aac55e54822714e5c08bd74bf504d249283d4102db79ced164322d9e405152fa6e4d6461f919c7f2af73e77db748a2392554bcf3b3798ce1e3722b9736adce071d532891189ea9b5e5937966650c1b18824a1576bbc7b53b056d707381491f4296839e5714da95c4301472292ac541ab3b18cf9c48488e4eed1783ace07933f3a44620a9b69b9c28629e53144b259d0d299ad16453385481695291ba6553f8c961049ff797469394f11251d447230797742af2988e40c2adebdafb22911062261f3694fc9b56425b10022d9926b05fd249e79fe213974d4f08b7ada72eefc909cf73da427193ee4a70f09166f9b627a8e955f3e247dd29b426e470ddf590a70ec21e983284b33b2b62ad743626ada67881cf1aa7c1e929330b59753a624a2773c240921c74726cfa7e2a9ef907427433747a8f514b643c2ace6ffac17d52141e97cf397ef438704d5db7ce2e1994372a8b5fa94bbabd63772488c9bad56e4760e9e9b3824c694f752f80f0d3d5238248b363dcd15d44bbafa8604f9d1e5f1849f2635dd90a8b137566b93a50ec23624ff577b7cdae6fe0ad990e8c9a4c6ed4a9a7459d690a44c5ec7eea0d7727e6a48d4f5f01763ee3e7b2f0d8962d94a3ce6332e7b68485c35f94173362c577786e454a2357dcacd90dcf6b12cf5fabf598624dfa02956995a4386644fbf29986daa5b660cc91d843ebb8d4bd94ac3218644b5b2eb360b269b2c3d7cc8b130a0b11acb2cc9bc8bbcc7f6ed6ccc73972aa81ec00186e450aa3cdab8b97c0947d67ae4179263c4e612321eadf284010e2f246bcce9bf7b42adce3fb2d6037ffce0c01d0d8e900fe0e84272283b93f94ee5e8412e24285d7237f57c25c821030c1c5b48da3cdf54cfd551a3e442d0ec6870847c81430b099eb2e56026bbeab3d9011c5948d01fb56a45c568d9a59135be20878c62c010a30707706021b93ba88fc6dbbe20b3241829e36ce00a492745c5f454a95deb61d0e08c80070f1a1c213c78182b2487d8c5baa8c7aed96c159272b9ada7ce59ae67c110a3c70b7050c178241c5348d0e93477a7cba758f2c6218504b92636261590213f38e0051862f4781c5148ea50f31ddf628f5b2a060e28248ff8fc79f4daeddfa9078e2724ed55e5ab960d8713124d3b7b143d7273c8dd84a40a1a7e2553e9a4fb6142623875595a99d483079790a0417d5cd0ae1ff47a894309497925a6a9fa373b880c1c49401c48c0cf2f5bde136d3a236b27c0718424153407993eac88c6130e2324560895e526b45ec9f966507080a308c9314c4b9cda65bc6888902035d529e9bdf67ac2212497a95cf14f59fb524f07388490204fa73ff9526139087380230889c9d38605370fe24c0d8424119195f67468da577f90a02d6c674f517ff45e70f820e964caa41bc344d5a5dc00470f123f9a481326b3d94ca9063878902494d4506b294ba8faec227994bebe788d8c3b75919c47ec3366d505f5331709b22a329c5a0e17c5d7b74b56aafb2d123bae8d75e5d916c97562d945da09cbe1ae4582a8912d42c654d1afa545b2ff874ef56bcd2c9273faec68795a5924658cbc658619f5518d45e2268f2e7341e94ad1844582121ae396f09877536c6453c89020375e91ac71edc445a6600e6eb82241651d110d5131ff6d8c831bad484a19697232588c9da921c20d5624db47d750d7faf9cebf1bab48ce9b1e6b66779492bf0d6ea82241e47b2d9cc789bbdc8d5424e9246e33273956953b40b8818ac41969b952888c6df62992622d2c854d415dafa607374c91749a2e3e446fee9a6c7c70a314097b6976d26b4627719322594b08dfa04e671449493c6acc15e5ba1a333bb8218aa4b829fb4a5cf4e5380a45e2ae8f8e85a8eb741a0f6e80a2dc7aeff48c31e6a470e313894f412799ebb745ee6137837bc20d4f2406cb71f3eceec7547d2712f4ea080d73318a26b9126e70223973fa3e3d3af5797e1349722efaee4b773ef49a483211a1e1a62374d59389e45cdeefee22fd336e3091a4ee438368c7ed797989a4cc568d17d294d0413bc20d4b2465514af996542d3d3f196e5422c12e75f27819a744827cdc796a8e9bd1927b78b831890415311f6274fe52b64b2251acb6c5add5674f1389e495f534172ae5ca17128922723534fc5c8ac17d4452d2bda92e8c08f1204724e91352338ed5a720d34624e6eca8999e8316338f1109aa7359846d85f1942d22c9acaa720e1b8d6a2aa38a1b8a481add7afa92098da1831291a4bf595f4f745df418056e2022692f08ab4bef187f458748cc0a931da5a53f3644924e17fee45aaf05bd0b91d87126c49685d31d674224b5e8d89ad3cd2beceb613788c4d09cd36e88a5d5d80a22595547f7d37cd21c36d7861b81483adfb424dc825e1c151009baa3cc2c8dda5fb2b8e1c61f9276e73c744e29c585cd0f89b132424c3786d5bd6ef421f137b7bdc187c494793695529e2f9a74630fc6430f89d1475f7e4a15b1a35c8bc48d3c24c757c6785183c5d85770030f89bf239fe4a5dd3cdfddc1bc1e3b6cf6b452e1861d12eded5258b48f0d7212e2461d92f57b6d4f9376ca327be1061d92ef54a8cb20cec4767c0b37e69014d62eb5522cf1b811c10d39245efca84b9fac54b8e8461c12674b8ed4a89be54ee6061c923e26f9fad29e4bd90348973724e5d4204f45fb0fe39f91b51e403a81dc70431fec2d2ca51ce3e76c43e267b88c712f42ff5dd890d8691fc2475b884b7d0d8916df212ed9a7243aab8644cd69ca82d6a034246a8fba86e5e9f833a321f94269aed88ba1cca26748cc318e1a2ddee599296648502abc749eebcb90a4792bd56dc66fca111992847b256d9b9292a3b34eb83186c7aef45ad29f6a6689c11c759f825fdcdaac85c1f4c12b66753ee9a3048636a55316ca3305cd17926d6e2b5f4dca077dbd50576c1619d9f69ec42e9c6e84097553195b3b17b4cbdf5bf3224e8bbd85e473d7ae91d94653b325dcd042c2cb065711eb8cacf53843c890d5c28d2ca4a6b2a8dbaa683e168e93fea57fa5738524292e322283d2d0ac9d19073964942adcb08299d7fd94bd88edfdab80b8cea482272917ddbc4185b5f33f5bc898cba3e5c61492b376ed58920dda3597425298132edf19ac4493ce3842849c24e34614923a955dc865f5e8cd504892965bccbd934fe871c309494196e97d1c8ba5ae35214136bb5356fa7eb1d2070d70cd6ce00613124e5acdad7b90f99b5f32120af2fec6126e2861557023093790603c5a70e30889d134af3daf2a2d08bf70c30849e284da8ad5b0b7495e84c4ab39fbb01d4f53b827841b4448eca4facdb5ff1d617cb183070f34c38d21245995978f92a7a56cc20d21249fdc269133426e1643c08307136e042179c5e25d8cb081905c9942e86841950aeb0f12d4e53ce71c261f245c7de568e1b94725a122dce84182bc78bf3f71964246e6c070830749a3d72d9d27b91cd3ddc52946cd2cd645c2c7d550c963c7134d73613c70613c6e917c69db7b6ba22d923f2635e13e1febf2ab453dee714f98e774591bb4480a9ec26ed4abb567701609171f67ecb4e7acf6ca2229f9e78cdbf62044bf36629198c4a89e3f71fa211a03c8db8045512e3663942f0db31a54c4e8d43fca74b42b0b72c82835b0f18ac4d223df2edf67363139f0020783070f327cf0e001041bae486a3519691a3e8d8c8666012f7654e2630431238c1d21f86287eec0462b92e653a5142e648530252b9232a9efdbd2b626f25b4582b8253cd420802524659e3ccbabb6f95317801292c62cdd46ed6a6c0c024842829e1759325d4cb5962400242468b7f61ff1bf594924802324b56c98cfdb1ad5a3a905011821793645e4729bf9e74d11923a877d4c95ad3cbc4a84c44ea65f328f7805010c21694d5ceac88ff4bb5a5700424892a1555e67fbc8da18020842d2a9f1204c87ddb8d3c07f943d160010cca6f32ca9c866b284f88f1f3e8c0d02f841520ab3ca7ae39d739946d67a001962ce10800f925ac393e9a8d98c0af720e976748bf230b5ea5901f020497ef0527f316b748df12ed21584127a7654a8b4c740af0a3a749174492995d36a10f3ed19592bb948acdc983e7e8fb8485cfbf428e26a1b3f213a6ee1031db6407cec0bbd7e326fbe2c4b9deaa84552fa35d1b97583e52c1ad964e73a689114b294e6304d7fa9fb99176a6b2bd0318b848ff14a745d2bc675b248f8b2d8de4906f911532c92af2cb53dc83211eb6091d872a22dc37d236baf48ae1d6919b2346f6ed1bea0c315c97d3a6ed9c88867ab74b4a2b07495a532648c011020233e46fbb803840e5624d7769ecc99ed91b504838e5524883ebdf09dcce7a4aa4810322ec674988e05931723437c9ca08c213ec6183bbcd8b1c38b1d3bbcd8e1c58e04cb7c063e3215c91ae316aaf45312d7da41072a9247884dab9e722f2c4dc72992324bd3a6b80211e243cc00c18e30be106246193f9211ecf062c7171878102448071da6483c3da2f14d9b1219c531c6385e646064888f1324ea284582b07496c236eb358814c96223bc423eeac7d48f2231aecf78290d27d78b2239e7dc34a9bd0961872239c7593169eac2ea0914c9179e933ad12a624fff44725c4faa3f9f4ae6a9f64492888cbf2ee297fa4e248ab090214be8689fe644d2e5465341b8ac9f50da4452a8609e745552561b4d2479061b95fb52a50e3391f0e76f72db435aaa204c24db55cf77782e91dc6b5fb2614b2458c753f293bde778a612896a7927a6a29accded14189e4f87cda6236f3bb958e4924a6797ca8593b219a91446245d5fc9ef924db1489c43e25e6a367864482798777b30fbe9af2239252ccb8fbd5d811c9adbaab394551b12b6e4492fb6e96cfa6addcc488a44badd91c2c558ca645248bbebc224e4611c979ed3106911b6bda4d4462a6c732f5722122e13d8e4ecffe39acb88748f474fa36d3869fc6d61049f35a23caf367ec7c210ebb797e722544c27c30fd39efe5b45b079160de2bb22a664ef7aa2092fd363dc8e86b26460d44629013dd3d2542545440245ff2b079a3c99efef30f49da62ef57d98cc83ffd901c2eda881b55e9ea937d485ad3a4dacb365ccc241f1273b6527aa1939cda710fc927cffe7a4c6d67473d24c798e35c65aef3d1310f49e9a583a72bd19436e241c71d9282671c8bcf1a539eec90285e9963deca7b845887c4b84d311ea262ae60a143829529b3f3360d9fe790f4d59b4665fee6bc72487e0fa192b97971481231177ac48443c25f295d2a8d8cb0cabd21b9d72f26f5a96efc77439269368fc973b849511b74b021398c9acd1c7329a1af21c1764cc9fa6067a3ac91352b26021d6a488afe7f721d45bc5c4b460f7c838e3424d648d32976e73d68660d3ad09018ac726c4b7ac1da534810c48c760c0431a3bdf70cc9494dc6ca5cfec81a9b4187199234c5d8b5d2515352e93224cd85b34c3a6a75273519922aee3d9836d1c9bf44061d6348aca4b47e9985d279471b08e38b1d49161d6248fe2017c56438df93513382981e41ca381d61481e13fda1af3ebdf30c86e494ca63f4d5ea8d6f1a597b1762fc85c4f47fdaa57365640d9dc759de18747821310529ffa74d87702d75742149c56aae7453613f2947d6ce1032c4b44007179266efaeacc7e44955a0630b09e26d3bd73236fdc8c67684a1010c1831e8d0425207adbc319dbbc728ca42825e6a48370da7b4a35848fada4ac945be42c2a80f77b2f6c35936cf0f10980e2b24e618dcff64dffba9bda0a30ac6ac216b4973a6572a8ddf519e973cecd9b8c38b4c3eb6113aa890bcfe312ba9f41ce742314840be80828e29247ec65f9259e3d4a9ca8e30bed851061d5248fab1684a8d9cbc105a22e88842a2e50771b1e9bb329396a0030a49e972953c9ee5e4bb3f21b1fbdc3f3ea3ecbe4e480ea2b4f6649df6be3421418ed01b663fa5941f624252d82fa5d6d4aae3659790d4b31f963d07cf41a84a48d2b725b64d6e36aa9984a4ea50e1f3c5fca68b84e4ac98f5f75ee2d4c319e8384252de4a1d845ce5dbe84648aecc558be17111124ffda5705a5a164a4a84e4f02c4bd1ac2b864d879058c1ebc2f6898ffba410ee94bb3796ac83906042fce8f0e71f44884048cef9a3c3757d5bf4941f246c363bb1abd4be312b3a7c90d4733a327d672d6b75f42071573de8b0e93f08197be8e041a265166521e4768ebde4d845623499cd55a3c80e95d645a2784cf28295862a55ca4572090bb2d253c84a318b8b64edb8aaddac5267d15b24988cae4dfd2036e6cf1699a316e5102322e4a65cba7f0992831649279a849865a664529f45523a3f2b253fa3e787649170d69d763a7755d24f8e58245f25ffb8d13a569505168917ad8312a3745a763bb2d6a39431e47845621293f1f75645865319593b2ce47045a29a1aeb6c1a6e46b676ad480c9afe7444a4261039589154963965bdf4638c0222c72a922a6bec3c32464cbe574562e54e557ee1e6d49e8ae4987b65d48ca69444db871ca848caa1bf9a7ac45d30ed144941acf4a99ca23d5a08e53045528ca54258ffcebad974c8518ac47cd2b4728b4c3234d8630e394891a0744fe8d2973527d78c2c8ee418456252a1d35bddbb938c552187281244dfcbebc7e3bf89c8118a4413baea43848a0a9bcc018aa49c63b4ce152b9dd142811c9f488c4bb7db204aa6b1bc271235352ceb560e5ebf7722f14d268b9e547d90f3e144a288d53c72b3b5a8673791204255fcbc6617b2d41070218726126459ce5a31a3287264c22463bb72aebef8ffc85a8f1e7800f8410e4c7c67163aad1f59eb31a40c20236c39c8718984cb989774f889dd1c8eac197b22872592e47a4e2754c6778e7125922da58b59dfc7ae662991545e296fc54bf35d7012496a2968ef9cb493a78d078fb293c82189e424949dde4f9f236ccd1189441b4b513a691f12c969b16ef45b5d1e91ecfd351e66fce4a9100c391c91dc97732cd9a7217dd34624e724c358db09cb6c3b231294299561274b4779691109bbdbbfa6e9c7c2da8a483c4f66a3b63e8d9a4e8e4424089d35676c88331dbc2ee44044a2b85bfc689f5590e310491b378e28a13e16ef4d218721924354b6eee8ee9aa5b31472142239354e55d968cd1cf32307218c478e41247e3e154b6e6386b2f8c85ab11d6168e042904310c9f1dfa363f8984bf734b2e63b468e40245aa64aef1b351e20122f5850223fc93f8fd1c85afbe8a1f9021f65cc20c71f924fe58ca1a26497cbe787440d9d3376a6d8235cdd32e4e84382654c7bb9a4191b6464c8c187a40ef5b2cf72b283eaf790a4e7d47bb80677ef911e123e5e692e95e1ede3250c39f2907ca5255af5734c554f8f1c7848caebc963ae4b6a2a868d0972dc2169358e99b08a192d34bc420e3b246e6a0c97368a55ea78b1428e3a24bf8679ab3efd9cff34b2864a8724ed96d94376fcdb741a599b438266b5f60d2f574a86450e392465691dd7cadaa33d3cb2667701f0418e3824096d9f3d64f3c9c9f020071c9283f74597cd7829f319591b03ed90e4412c1739de909493ce6e5a961c19946e48ce4a42830cdac43253da90e039dc7768ab5f758e0d891a9a74e915bff8e84b20c71a124d27f1d86cf92c5e5a0d495a7954799ccdb312a5212947dfafa0fe83501da2213993cad449ffda4ba99c21c94ef3821cd118d139332455891dd93d3716968a408e3224a885ec97a5aa12f5c9907029c9181dc352c592194362f897ceeba48a21497f59baac964d9d6463181de40843b2661999c2e51473b9074352dc5162bafad293e97c21e147275921542d335d2f24c71432eba5a07525c35d4812c25f4c93de20aea45c5873ee1819bb4f69f95b48964f4134f4e47567500bc931c7b855e24e4e8eb29094f762ec2e3367b3100b4942fe25f92a7f57dabb42626f87288b967332655648b4124d317a5c1321e22a181592b3b6659222d3b226cbc80d724cc1a073296d25fa2c972785e4dacd0edda62e6f2d67e4884262fcb5128bbb0bddb6970185049d82b6b990c12724c81f69bba24d98f6de094979ef2fc7189ff46eba09494a53e3786dce1f221392e42931aa328597f4e012924e5cef5a89c878ba2821d9f3a554ef996b20471212359aa67788cbc8ee909038b2cfd297bed0e89919418e9054d262c3a891119253f6fd24467aa6b57c1152d263ac1462d66522aced769e9f1ac2ee625659c94c5bce84e0fa5f6afb0f5959100e2ab4ac72aabfbc66c80184a4d5de3291715d3dc63f4850273fe5b82573176a0e1f30e252b693b9336e8e1e048e32a82470251351200e07c38030000c088488b5be01831308001834260d0663e19058e0f6001480054c382c4a3e2e1c281a12160b05e27128180c0402e2501010080283a06020148a4372a8e47dfb5b30c11637330b5815fb1cdc64b018861757ba7ad042a046c3fbac9e7b2c3ece4335bda879f05fb5b36a9b66b787eceb173e5f51ea627556602e20121790b184fad96e401a28dede294435cd3bc0182675f0ccf7a9bc2efd1007f02e47421660e59886a0fcfaf72bb925a450e063a1749823642402bd5a60fc92896305af9546c0c9fb63912116a97d23a95df3c9ee2a5c511d318955bd7014d91b9d85e415e873a89270f29694c43d97f19b31a877baefcb4931da2c1eab3cf54f0d00fec0a490487d1de573439e5e45746c69a3eb7670faa15dd0fd2f272a4a3512cfdf65acf24dfc859022e7bc03f28a7d9c207245f76fc254dfc1648425a4b36adf33e95f1801c386e903ef7c5ca953edc5736e0365c963cc0f240a40272b94a5afc8d93f3173bc6a728eeea35a4e6acc36193ff4369e15d62937646725f0ec135c72ed2b01a04d39bb705d7f5446e18d09d6b027499f97a4d2fa260781c19b848aea39dde297482a1c432adc8014a12dd142afff157dc03fe787d3f743856a0f85a13a8a59680bf0b70c71698490aa379abe7c9daa32b85c1ab67f41c5322b8d18918f934250ea9c222dadfc9c1a67aa05dd709704d8e54fe3c821d23ac734b09b14c910335ac88ba4ced5fa4ae5faef03401282b1afd57333abb84bb2e159a8286ef9c8faf52c6d518029fdee54f07332aa2d5359f63f8b9f20a265ed28044a44c1d62480cf793e5661320052f70bbc91856b66ec9b1aee513bcfe9ff81fa8b171d910f45573832b544249bc16e6b8621ff7d19a5ff124cc3308897c7c51e49f2f58f6413b98d6825fce934633ff675dbe4ec31006ef8f00bbd174c07eeb848790a1e6100257f7f0eca80b4b45f832e14f04de55763108cf1db40eafcaa1473e6522a4f71ace24985b062eac650469ed3f2a9cd0b2f29b13e544f3be1c0195657f6205f09b48af529144e24c2bae2ee81fe89e0af2b2480f79c83ec56dac7e28c93ef7f71895c353fa253ca99f273ddaf37e46f94c40ad9c901357ea51f04036b185c63110840cefdbfa7585c1e101bff0887cb1720c5318021cef12026c339ae461e72bd46ad5afc06078513720c55986fc2bb5d52a34360c34cec2e00509363213720ae8e1c4c6581a9a237e4c53a5625af7080ffc64e915c2d7819f1febf2ba5ca3bfe5ce554381865baff61d828287e2c4bf386339791054c4c23386c6420509f0ca75809bc758e5773c442a0b160bd3d78a206f2036d854bf7891aac98e160a106260b91d6e2b3498028ac5f3973db23ec6bb098d307173e858b3890e1237c949a52b89c2bbc936d7ba082966025d077a9ad499fd95ed0d96f870e868c86a86915695ce58cbc5c232efc67496153317518616bc1bc8776c7d9e2b6452495afad916f0bbb8ca3d7db408eb700ed38474c5b440a3e371d45eedc41b263ca22e0a2c880b7335c1a456767e1d4829223879eaf9f3252e5bc7279ab1b32213f6f4d58b9a28446dec492d6c2959d8515aee8bf6c4a76c110395d51b7d5302c56c622982813380c98f0fef60a9cad42cbf2594ecffd9d3a7e7da44b454561e304a6e7db2fd85f8494a26e88620a30af4e016976127649a529114eb2e29c707173c14ab96506e9fdb06212e55a6dfe70560b88ea180e0c22a2b888bcf99927c88522e42f598f902063c00bad93b02332519a9519cf780582455eec801d250fdc5e3703b162e9c82b5652ff4deba956ebe436b1ded8777411a247aaf769facc2a42aa664982954e5e18be80b1fa72aa3dd7b522359e317a50748027c8562b900e26cf94c5dfd7aab807464772afb489292c6c1444c821445cc4ab4972157eb5d185f3b1350e61fb71e2ad9c421a412021ddc2b66d874a5e93a85fd82f70bdf2d95bef0b16941c10a8c41e099c831a5cfba358e932dbade27ce930a9525d553f2897ae3adbb76e756477960e35f45fd0f4041aea164178c299efe8b42761528eabbb686340d380a6842802fccbcb55ba24514ed839ca3728407955ffcca70cca5ccb7442f846d0cd3e9668e4bd9e62b2a7ee16364f39d739f8309842f8ea6e472f33b42e5522cb1245406c1acb8a8944a93daf4707aebb5a0a7b5b3164b99f0b1faac75193f58e0327234a3de0f007aa5c4ca725483c26a9c5acb82fc2e5cbf95452fb7c791d96cd67fe8a71c4a4cc55155612f0298dbf65c53522cf3f02d99bf34375bccf30063dd300c4ed6b44b3b2e715417e4271aa31a0d374ab6736813a54214b6e4185973bb682a8c6fc8aa7141cd743be40b7deea4b20f1de1301ef21993ddbc579268a0501898740e09e62cdd06e8682d35bfd386d404e995ae8799cc43347513e660b2c0ef4b036e36befaacfcc01e93fee6c70c37d80f049f98b6dda7a06583e31463e00006de35203698ae37c7ae6c98e55b449082152289918a213eb8a0851d29930859ba738758eb030db07f475295fa7a39fbe8cd8e80a267460ce37bd5930ceb897f135461764f432e3ec0108b56e6d6989a78786542dd34c7f78a918647e9c5dfff37d752c3df56c95cfc3fab36ee1f1d13b37813a461541ff64f3a8efa84a919db548a95f1a724b90d0f12b4262a4bbadb405f939a811c16223aea13d480f0e42b8b9ab42411450160f221093bb027a45e484a22da07f524a08864426cf45d36c93ee49f33efe511ea48c7c1a180463d825749ec8139e3d00e6dc1843a75c67267369ae793ae36532af9eda91e1c7217d663aa2f8df6916747b61a7980e1a19b4ae3e8d01f7c9d064e153b981897e1bfa53089088c1ede82c31d30491095b24ab50cb78e44a12b42df2a9b476f00cdce0034614f425f385890d198a37d1e0242d24658815605aacdbd878480e68cc502cac84a961152e519dacf7c276a0c71120fe92d8e3b48362209c8028af85c2a23c3612aa36a63e8b51af40cf830d0db4844beff43035867b8644dcfdc79360246fc571134a5f9116be8069941e5708330589933d4275ce66eea30c6be96df40657dad5b59b8f833d75e7f5e05ff70887efc13694a84086093bec5e48592187529e5acbea9af015a0b4091c8b4c4542cac29c1c30044c1bb61a818375eee204c3805acfd95b3da64f3f2f72d94afb7f7d247b01f20740bb8a0aec2f2417e0bf0030e4166029b5d5d233ecbeca918a72ae0c0905dd6e574751073b45310227c85aad8d112e9bfda9cd3aa3d51c3bfd694f3a97469a490069ce49f8391708505c6f523accbc13a56315f8ec0c09f452c019b11651202087093b4713bc9bd28b4eb1db1048086d221b21d0a0090250e67ed8efc648f7cc5065c0a7b68113c5e4d0845164230a6b62cc17cc106e48ec849dbb13e2601920d198cd10cdd90afca4f2df86008e3f68c6660ba88a15481980b2be829250795db6eac188347800001dabe6608f8b57b801c47e798cc195a245613e858461fce8b0b8ce8f5696e5b268d69f86ff3ec4303cbbe43045c91d7f2fccc4f202988dd62301f60730b9938f2eee52787f2f4f6d6d39c605cae5f1ad60390166d8e6004a37689f4871a8c16182d7ffa35376a0f2a829b0480b2d267ce758c5e69d37ed8e67861b0683f8ea207465d8eda9e35bf40ae3914882a3f1d0e0016811f270d63aa530c5818d958cba4ed7fd06961110f10267a2827129fe27bec55df7580fd2ac412736e3f60d6cfdcb854f82a91084262c090c54185e5c473617325c9af8108b1c43e4fa780ed82ada575f69e30beec371822170c2a205d8d15fe4741e4630c717bd6955de3e5a74434f49a3dad065b1dc219ed6d0de229a4421d7942ac0932e7f10f42f8734cbfde5a056a466413f26a6911f1021dd7c947c40b72c96addd8c95bbd7356dec95a6d0e6651c3683ddcb271fd2231d35efc50ee0555f3f71b949af762021c3dd20b4e52a801e0ec9a112b101e651240275cda888325e8b7dc304ee0326eacd4bc0335beae5386d8daca84521cc7c25c3b21ea5eeced3d40ab86082646ddf2e1008d1be8cb40d0d01a0e929d4e393863095ff920da8465e300b1f67815cf542acdf96c4612b1afb2e645059a8dde01e21c8e20e912f48ce1c1d25605df2b0014f073ccea84df50b60f52cbbdf8fba49c74217bc476f54d0c60aabf8e70e88ef147cfadecb07f376e454bd8b3b686e5485cafda1f117403aa66dcafb4aaae62f2c53ad89aa621fb1c6dbaee91bfb82b396121e41d7ac7a9600efe239504502c6812fb1ec54442d670a83bc1b385f70799a43a8b20e7001811f4334417a5560bb72246f4437502f3f25aa82517a6795f17ecf4c2db3fabc384de7ff65ef1043bdbec3f29cac5fbc2ec2176f2e265e22c68bf280f7c86e4f81bf97ab288188ece0072b80e4db532b4029690787f8e5ccb7d52aff45feea9ffb0d2ed85a40e31ca5d23c9cba4e86bbbf03dcb18cbf435d293be2b0e3cd99d873074ae5c5849820f01b69e8251c6333327809158d6c59399fe45b0c419d0f49bac98cf7e5b10cc0fe572f39c9f3740ef18926235548244a396a8ecc23bf49624aeaa41f032aab67bb753c79c216144d62548b0bc66d9af91c820180f1d98539dffca0059c8a2d0b1f67de1a67822e2f098881973ddfd37afd1e157bc01c02ec296a8a3a714513dbf54b3ff53c235a0377f3678890fc2c26ac8da07d2836753a7a6eccbbaeb297b6926001e76ad0f808489501c62d8116f6ee1d0d79f2647af400df4db2e01b847940fb41078313d8777550a09e243069abfc015597d59b5adbe4fb4cc000f21bff925d392d3c3954270b547d032dda3e318f380178f93ca180df3c79382b09d8e830800256f92249f465d4b216fa91acd4051000814a86a7c90ab379fb11f5d084f933ab7bd5d2d8e742d703ac9b890fb9889e602a55770919f13521c1bbfdfbc7062c6b8af4d5d282a89ba047efc252a42fa3d510bf00b82ba903c035ad9998f069c94c2019fabb0d3ee812e8e89fde5e51f7402feb0729d45e2df49488ee6f7a142c39ef66314d8d7691a4846184100d8f1e4ecf4d670f8f318227335b011918000a656efa31840d9f9f88083d17023482600362911e31d2d9583444b0237ecac3272e27c83ae7ae08bad14916bd68b842c500ccb90ab0f4425dc7182e6d247ec53a1bd0ab9722b4679e74dd10e182f46a7e0620c5ae28d492b4d77066b1db8dc87800188e0600d17c66df80268bffbe41655ffbac42bff2cf5acbb8e4957a1a14e444a13d71ec09c81098b3b28f42e63ef9978e8943ad945ddc30ebb0973b10ad6215309f47501b980f00d8e0c0b27de3751ae37bce6ee115f7601e8a9c07fdaea49f9f27072f908908b38cd03a150160d1dc49dc0153431b1125161591313dd4e025b0155e91f56c775aa125293ff6000bcfe0baa3f42c05837a07196038691208b58381453a3537cdc8e7565b18113890690436962b9709c78585751b1c130c1ca08183202e124dcbf8f40af35af85b415713465f34f62efa3e9a224d262d81018b15813a74c377ee0e0f47cf19b84d16e6c2b0e698f22e9f316169f743212c1a53d8db36b274e272578190d5901fda404f81ad44a2a0d2e40245bfbc5451b2576166562a2a56ddd7da5584f759ef12c30b5add7f75eda65bafe538297f04a16083c89c9e5253945689947c84512324d8cb1f9493f0544806562eb29d12833cf21d4db4494f4a0e1c099cc1309e73f7b2f60ceb9f2311cc2bb147fc694b892a50af635a0e433e21a0a303ad61411cce290b3ac84d795f190e8bf404eaf4607662e4b359aef1c004ee32e5b4318b59eb9486b4d377d2005e33cac584a9c774889257551a4956282ffb0c8850c8c8df087370c53802f99791ccc06546390a69c833909c940a30d1827c94c274206bcd52edc5f035048d4f63e03862e9f7dff7e195ad869e81c3122a835cc5a4a10a784650b274f925e3f92e426d08677be27c89588c7e8d48c0648b30d48c6f58b471910d8844c5d79373ac760d6e71b59e2bc9a115510c764443ed942ce7e381424038d771c197f5642eb3f3c6b7f326c1b490751b1ca44b9b986b085eb5860b24fd364781cc48bcaf02868bfd2bd2cc56a02c818f10c808aa4b3890f00b9515a0480bd09f4046cf87f12daa2006ac80743f5dd6801b57027cefb66b7a675e75f7e00fe06c5dfafef581dacf251c5ccfaeab4bfc906ac95ad5e2ec402387a3b0bbde6137e0b065a896e068323be71b16eb43806c0e0d05512b36259e9082c71416ad704978436bc40a034d663324b667d11858c84b5833f786a7b34fc1d6f72110d514188d1fe7cf916fb47c25b47feedb1939a679fa34ac1778ea42f911631c3b9c103d3a5c2204bcb8eac9e104eff588583548e20fddc1c97d3ce2e4497f695042a20bf94b91561a0ea01d5f478e18c5e2a96d062d89defbb03261548ce104a0dcf77338ffc03e38bd91ff8d514886eac5fb53ffdb1ae1888e8d182e7b2cac33d39c310be6553d8e74879d94d6f6d8d2e15bb2561bc63b48423b3a5cd5913b5fd2aa4838458ee17f9dee4850de11fbbc1f876925ee287c4f22c789afb808d325c491ff49beaa865cc2cd87307b74aa0476416eac8b78cdd444e6841a4656a3ad224d1711a6824286a71896719e46997c7d6ae850b9872d3a62f27686700307b8350c9935168f07c5ffdd1d14cd7f48a64845c5efee90f284d43b5e3028d1974182862fb0513ae29fccb0d2bed0ea8b2b37443d838c0d8d94e8e83002f3231ba937216f6b2bd18b7638ebae5a18e43697ab712c5e422f6eb077059190b0618e2eb2073f1a0d6ca975726161889fe7f902413999e7f5676f370e16e011817f408f31dcc6688625eefa2ef82364515018d60c6aab2f1db03a09063bfb38b0e2dabcc87213260ddcd7718a56550a59696ae582c83a41168360fe6de2e7939e8d25d96810e36802142cb9038782961740db9320e7800c82bdd334ef96f12717631ed60c2b11cc76abc5ff7aefcb38103783c7128784be1daede0dd87d72b0949d59141e204cbb658b2552264e270424763b8e9512b943abe67a1d6efded5c95821a7a9017c7d80a298cecd01882e72e57b5c22b4ee39382905a9bb74cd1fe895be751d4e4d721aaf9341e5adfd61aae0672f52419ab1c0411a65c3761770d8c315d9f54ae4e077581707d32c38b406dc031cb38515e6267f994f8748487f12ed83a2b898c39adefb6e3d9dc92296d5d8fcd4d63cf7445e56f541f831c01f2c322d762d2501d1a21cd21a563cd261418e34f2cc90bab5a47820f7187c02a42b676048c68106840e9d3aaec24ef4f43e4901344f49616e8c72057ee92cc32421b920214ab49b6e7481ca438c2bb0e53e2205c288a4119699ff8a575a7b75984f1a5edf65a6a875022612e79963d866543b61795a4639a5212ddeae23a7236689925481cc65927c5c65ffc6209263257ca0e46f5c44feb6dc605d808af9adbc5f6ad02199b84ee5f9d9ce56feaa00124d3c3672d9004fce365214dc094053b4a2538151877aa0e420251ce60ed0149b0341aad326312cbede0dbd2b621a93079d090ae77c45398ba84dd548d487e1f7014649006c87d2b1064c357c74e52a7e9b41b397d9753c3200ed824a3c51d336c4bd3d51f9200933c7383194344d70599914ac6ebe280305c70b353d1ec2520f44f00cfde183dd3de2983eed47959be66dc191a7eb10dfd2b0d82fc622c3ca19edddb31edfdfc8a18ca87d5f6d2aac303929ea8f847a120320c2bdd2b4e011ba89b7629aa3b1d2ae143c0e2332178d134ab06e080b6076a7e1567e2b3885939724706b2b3cd2d5dc8abab483706c620f9214d5710505dd4d881bb1bd6db70000ffc69a50f4cd8441a8a64e8622314b70ba8e4ba14b5430c597b00264921357990a02eba055e6bd219f0187037e3a6925834492def0b2de6e70f5f6ea06e4eb425938f5ef597dfa6dfce0b4e9926dc045da87adbbd543fae8a52199858e04c7203f76c93e660e7106f2143adcab7f72e0a615ee5e2fcf347bfe2b7f59f1089445c793e984e9a95120b38d61d59f6040c1047fa825c06f730e5ba66b934dcfa77349617dd9286a6d22941bc6352174a8f68a2c4fff189ebfe6c6435134f4dac67d124401f0c6cda7ca35dbe8318068466ae8dddb68027907d1a2f30da11bf91ae68820623a0fffe0e77a4434473a2017094c42f9e33447fbb4cb661aac97ccd9ace7e9c3434dc43d4576518942c4ecc8ca4fe380338b9af041ffccd8926110ce3298bd3383c7b2a0c148b0ea34481fc970219500f220782f4b6a31768f40797405d7089a20397c4aa03815b12fa4516490f637f22ed65b39587bd931466785b4d4d9be47cd7cfe241ca5144cdaa2810bab6d445c0bffa700fcdb0f8ed26a2c57fdbad585c49ed43df753cb13e8e8bb92d43506240ca128c21eaf3b44ae2297f397c49afd4c432fc9ed904bd367ff797f8cd605713d0d1f07c81c259ba9307014053298288baa2b4515bae43a7794a9d41d9a8c3d57dc4ef008a5bc70d28e3e97a7a734459c60aa61bfee77c6ca1c4b99a80c0a737b6d863c755c53840495c70684a25b751922d29ebcd03249f754f8aecbc95f888f4c74600da1dac7e48bae64046b12f331d03177616e83f0b776c57547ea60b5d4c67e958042275e862e87d71ffe1a8d251a323152b15bb2aa75a37d603833fa0ec455e416d016e20e9e2dbcbf4e2852c8be67d8d435824985595d499ca0de668efd13e0305158fe1fad660876b18f6a33c8caefd4180829093089c58d52b0b4b66d4be9f56aaa79a71424092073b7a4edab542ddcfac37e6211b94177cac36b92d8f386ff56afa645f8168590b233bcca52a6884dd7168456d75220bd6ad03b3a6802e337216b1304029048d0a967410c8d458aa0d95e291428ba5a771fb595cdde8c3cafc461e67255cd9297bc5a1c3ebef2499991ce6b47ad1d7abc64d6a03ab0d3990903aa5476d55a3dbec1e60ca7f5de9ab61a3b71354d3a4db8f2e7af25192ae70c9366c5324f94c2a1afe2bc865926321499fe97d01c8248be998fa9e2f198d7074224badf231fcfc8964e0f1f2255d4af37452da4308e4f431e4dfb360fe73f39bc8dc9266f26e4932370ad146d83e6d3ac9a032ae24c37f5f7c346420d6fc673d09952496e40a56b4c6f7de4d0d47b991d6a6a0470ebcb2a588d49dc49a197b83beff3622c2c59f50a9c55b644645a8d6cbd661d2ed1f450b53b5a1f6d0f468e45365af16bb320a4e1f94ef310a2bf19d9c7e553d3a38ea1d4d7ef4c4bb4570c61ead4c1ade6b782a03469f07f52392652fea23a15891f1113abc958fd9db599f9754e3938ae789c91c3ebef58a5cdb1d176d19e359ff887af67def7f47d2104aa6bc0f2a00ff17a065536ba064288a8b33e48c3ea8604ba8a668251cd5519e8873b352db59a022f07b5480a8873b92e8384ed46fc1146f5aea1fa2db3ceb8e1b31b030f0f0c1c47482ad329f745ff63b0bbfdbe4f3bcf6213153e266cd73276969b8fc8a601b542e623e623e62f211b5f347a9494e9ef2362a7dc0ca27f50163e039c059046788cc01390ba0631eb095cdc63ff37730d0a78eaa54c78f0d58baf42371233a13356a932bbedaa80da4e1406f6ca3e5051ef969c764168d13b085590693b35f5af07f5a0ed429917df49a6f0387cdf4df386b4e56712290cd0c022f0313d2c467414d8b76ba6094bcb4d7c7c6779a314d4dc515a1bc8707ba55aef9a60b065d2746af6c91019da166bfbed684b302b894d00adad22537263265a41f1ef00889256702d0bb6928b6c7f439649ab54a2af850017c2392ba045288cca32fcb9dce1823e751a97c563d004c7908fafaa529c08b44aafa2bd44d694e9924b146b0ba59ad5990ab9a1e15768e505747d598ba0fc85ea6c41543ba69c808af6720b9644e3b7f8014e2bcccf02df6b4e4b2a6c2ceedb96000f817d546c09ef568eebdbdd0880e8de867a4d4e8b5cbd203141d58ba61bec705f328a286da93295bdb817e87c76a0f24ee9fdcf1c180f5b37b7a6111ac9e7472e4be6477156b9fefd2334878133d21dee73eb44e0fcf0dac181fc311ec880a279ccf37ec1e608e546868d042f19449cfad2529ad1490284b71b5b00f31049c8aeecf8a1e9d55205495f3c79168d5ed2015e0f75a3dbb2eb43f6a9f8795f5d8ac7796d44082fcea6b65ea6ce06a02fb4a9f369e8782a289f948c738ae35a50aafaeaa078ef50513efadd467b59ea63f4e9b966ba7525b23dc354a2ea3262a1aa82b7f4fa25351581df30a050266433fe499f91e0412c91ca1582988ac5172ac3e648256eacc940627b28b768e7a07ddfc6b17eb7b3a8d0baf55c91211c03e1b0cbdc261513bcf290c551618db453247b9c7090217f2101b41b9ef4a6754b8e525767074be4de3b304f410c1ef85d3d7f70d474a450516c66385e8a9c417cbb8efbe4f5fe96f24260b025cf2747a89b3071f226d5e496593697490ce161ed4ff08d47c2a5e05b7a7ea105734b607703648c982ae42146f58935ec93190302bc222428e3aa937944d711061556c2ccb4b2e1804cbb2a4e6fef022aafe323161204c173b9af5c0215ba272681caf2bcde3eda0cd9a3c8ad6617aac76ec95920d0dcd6970ab59b57011ecb8f3ce1af2235f142e815a3ab0e06c494915dfeadc948b8176fa7f348b7e43f7c3e3acca7e9d123e7a307927f709959f7602bac45db13d83061e3919d33923dfdeb443ea005ef30d38163c7ef10bac65627005259543fb2f7fc3bb7843c9923e410079d2610f113d2d22e1ef1b083038478241c564e3064decb7699e2defa303c2242bcb47e0fbaab3e2c08fa5c152890ef538020003140f5138ac5e1da2c89b71552b3f73bbd50e4b540119492e625a8f84f2791962f482d0f62003e5f844509b81097c75278aa18c84f3c36442206e2d1023b495d90a8ffd56a486146743ee8614e3d65c2431d5ce7b10c899bc0b0662e5499ecd7dfb76c0878886b782e83cfb0646a2c554a34b491265cd9d80f76f1b0da1441647c108a110cadbe071e7370497bc73202848fd4f3ee8c453c41704d88d9f8e411da2452f2caf91a7b44f54a157607ac53b84e5f4c46a7b83f9bc7566fca50db7867a1d222d1500a8f2376e1000b63cea646abdf305d14aaad9e829dcca0a5bc9284e4225953de93660b82344d2867a598d4213d94a003bb556405611784b4735f6023a1a0c1d1b0a7954e8c02f854fbf3d7198acc3a518341298ba6197c66867f2ac6e0c55915091cc870e0346ad7d548d8b1898b77c3f31796702d84f4833296003fe5d1e923d260caac6e1403d5fab06807024428841298475ca24c0ad3e62cc025aaa14f1019652124be00890275084dc056088995ca52139540bfbeb536452ab661429089569e9cc01a58dda2567672870c50f84fe6a1de1da11802edbaba82a973e923d1afd2d51c9662ed701327b3c3014e1440ac83eea644261a451937080b531e2f351a13d3b8b504775cfc9553abeecee931100a8620f4a97f509f88c2955cb33b5362c539023defdb331e8a2a216806536cbacf7c46a99553ec2dad3c52421cf69465e1444c80f5b0fad439c816440d00a7431215b429b7861096f9f4e151d2335f3795cf4d83d875839c0b8a65e616dc5c3cda616e45f0010b2e02a30b0c1f460b6330a75b445a94349a501390338ec2f3750b8bf3b01217ba3a445257cb818141d3d3426d6b39ce37737ec7600c88e5da7a2a74a9442305199be1751d4e6d3a8c3def453f7a94f0218f6e4990983dd7768a5a53ee63fb7bee12ee8a53ae4d4a3939500d2bcdea7bdeed47a5f1830939a157106383c58d26d5e1bd497b8b7514c0f6151054f14b83b39fc3f781ba28c1c599d97ffcbc1b05245aa3b93aaa80b186645513a30f741c370ab9e57523577433a207f73a1868c92b846b61f0dca036d9c861d4804e7d355b79e0879e1cd8f23556bfd07245273b80f9705cdc3a57c91c4d6b4284cd71dbe1d93d3f0d8818580f6ee3b8a21a5242beebab71bcf71b3e5a5f8bda8afe6ad80b3dc23caf8f8f2811e6fb1cebf6bdcb98fce8a79278edb47f9302808bc03764257c4a5cc941685c45519619e1f02b4bf710b877e42070b365cabad21a86d7369511e1302da76f1320e77218cd0f1eac489c8e18287bf92cd384c546986b954d3badbbec17f40dde31073465d525cbc2a19b57d438909199bc826b7d5513203dc64b55ebfd1c5b27c7a2b22dc536484c79487ee804e1645137a65fd896e636fa250d8866d0b5b2c1fc6bb5f323a3c3a0f42a25d5b49437e88af2f157ea2cd72f2b79cfb2d9b23a55e5fb1e8dec0f32fed75910072ac8bed850bd8a23dcf4bb6a11cb84192ddf33cd9d1a16a1f558d58f766668fa751c5d34d2971a01ad41950419d874d3853934fe10379651094e890a318a0ed92f33084ed2daa530e12846930c5dacced6b12e0e34abbd64e6419e23eac6e4c8cc96b8ab8a24bdbc0244d0961b1e8ead168ea512a932fc4697f45e6e9ea8852141ba0075e98dde5bbc0609608f83eee107951b4a099c4744b87c90bd426ee4a195c221afa86822f219b9e9e407f40bfd3bf782b6d652fe30b7271a4bd52f2d6bf6aeae9005c8b9725d8975818e72e1e862ce39da34b1d65b8a4f47ecd1708127fa01a537d369ec41fb8e1d343764b839cbbcec0aaf767733fe278456449e5303d8f98d69f7e9b240057ce7e4e37421d8938e76d051bc98d3a2c60702f6380b22dd069225acee50c1b26d1a8d9a29d8badb49845edcf148ea4f8d3f1320b929c307094826f4737d11f46e6d6d16e5117470ea3b0bb1617440522f391bd43c594e46c75c3b741a132f30536616d9031ba66f95e86cc0fd04e688e4cbc4f9ee00d8982ea60010059ab716020b89cce46e32fd1de6372fbe84cd125beb05b2890a5c151952a74911e226a941371ab7a571fa51e916d9797df48038408d7895bb479b789b2177c8ac3adee7d05318818fdd446a98d4f797ceb001754ae83e056312e9c7e97aa2dd7796bd78ce308695554b3ba77a2fad57b18d7c84b2e04d551c33f12eb8c83e48ce8b47a7c9539cc67c1adca8ff6b599de21debd208fac40e0f3d857fdc822d4ecc07af9efaa2116d0814c0f4cb435ce5ef223d55c49c24d6e56d4cf91b3071f7b72d020d1f7d4e53915d2d2408afaa9b7a0480cace484c58fd52028b7cbaede128a3bd16a5cf8e97f0503d1581fbe8670ea07407fcd6d2b23e6267fd6768adab5ff4eb760c8a400c8751cc88b008d83a3040a5c2d29239d10a75c07e1903cd55ab179028773340b5c38b4b87b5140a4e21e967695e5d3ab713c574009db2c45f9995097ac968cd9ddde82769b31ed3628cb9b4eec4b5d615367822c7162799da78c249c4759cd6480c3e4bd3b468cfb46eed0462890d1245d942b205f65c3546a8500cd9471e194223c6e00926e35634614af0ade33417bbc72e90e5df708f79f4f950263ba64906a803ca2d0c044a6901425b498ada950af1ba23696d821a2375f600a391492903677f9b4b4a1e81f8cf6efc2b3c5c9d417d319c9aa663a5b05d45216055be9401c1d7e643118e9c08a0e2eb6c4baadbc41cfe05f378d6ab0f65bfae75297286bf48a766f2aa432e4e004f6b6722425e6047f56e08d81b604e64aa0e15282c2958d6ab86b3df50858e222a68febae14f9a0396d1fd4be46d468d09b40c7630408ad22c19b1e2f44cf7a80d29ab8018820f69147eef8453efe3dda459065071a6b1c39622e8aba59bac376108c7a76e174c89f60ac906515f19663f08b98f8116c39db9759c44e18b1ddbf74b7d1bf682f1cb9c63f7c0f942b13b106469214d12109b6daa6a325dfd52dd310223cb14ea45c9cc9805a469a1ea70288d8d78c0bb13a9c8eadc9066519361863b7de910d37f02b6d702abe43465385a8f2c0c03ec8069d9efa307c9449543c13218b2533f7cfbcb2a377f97eb1dffeac203d525d6bce105f9770efb3eb12849109592915ed0c0e71c41691c78086c4935fc92dd528a018c8dd8a16d01e05b9dfa0303bdf05c6de85e5edf64c91b6470f8d94e47662bc203c6e8df95391a9b6903125f6f5cf8e3c2f00aad5cfb466fd8417e831e5b61265640193e4c3496653eb9c05e0b9fe805b1ae07f2c6a962f34f43fd59ff6c7f171641c9a8c4d23e3d038368e4dc6a6f1383c8e8fe326a7c9082f4c48d03ae51639461f240689417a400e92a35706b9063f073f07cd01ca38354e8e82b11d955428034e7d85230e3850b2a4d001c33f3f3f3f3f3f3f3f8b50b66d0bb65910da824c3295f77b48c800b5524a29c99492d073a761b7000000c2d65a23840580386e560e430eef0db6676da5cca4006183e945e828e717456c675080acc1ec6e72cbc54a3a85fdfa13206a30a90e6fc1d62411564ad2600ad53d57a7acc3529813206830d9e959afaf33132eec005b02e40c06f5d25126fe3afa491721d840179500318331ff43fea9c58eb8d08b320e185f40ca60124648b5f477aa11e0bd00840c6617bf4bf1a28e748461653d06e358d0bb4f52ea2d2d370740c4608e9aa1c35b581bf1f3580d8084c11ca654909ddaa963e21de7c1700483e1ef6309cf3a26df5338d6b007205f3007ffec54faedb42f8963cdcca0a901f182f9835877af2fd14304e9823154caf515b3aad08e2ebc300408178c1df6bccbfd4c12ac5b03c8168cef7fa6a9fd96cbf3fa06102d984a74d11f3cbeefeea588e42040b26030531f94d84b2fef130b06a12d4e922efaac29b14b03c8158c79e2f7de5a6405f35bcfcd27f5275bb20a3600a182299eb65928f9925f786720009982413b4f2ed5b2ca262b102998926a3159163f96fc4919e828438ca7c08e1088f138425086184f01111111119028184eac36497f5e57bfb49501040ac612f46228eb2b417c65878e917300c813ccc94b9d78d23dba4c32041be8c208204e309818b1a5d7ba1755006982694d5a951c36dbae752c204c300525a53e5dfe124ca9b33f27a8e8d91e3174886107a20453121eb2fd579420d5840712830c1d13b82c8024c113cb2e4c54eb7712efc1438c1c782048e0c52e59d7678bd75a665676738491030c0e74e10509ba08c106ba40349023183bed495207cbe2b13c4630d87f09fad6cb73be2e82b974e9ed92e24451e91a1440886092525f12b9ed2565131b8249f2925da7d504536b44e100220493e01ef377a3d272091204b395aa5a124a5f04102018c77fc45a763019262e04901f98830aa2e71f96458d8a08203e30c559f1e4957b4ee6640709901e98b3c7845a08f160ba40175e7461812ebc305d78d10505bce02380f0c0e49665c2c6d6203b30c949b8493193f1d0370c203a30baa62953f36b2e8c1f3fa59b32f5254738820c7161921542ee8c9a9c993f8e35345246323232068f09cce06f61b20a66c9e52425f63b0844443e6c619ebd3456dabf1a7cd4c218ab3617c7a46961ce9dabe48c3d414c8a7fccc224a8f168caf7fb9085293ea724f62cab84507dc4c27463398589d71337b30f589846a55a07b7db3f2022e23b3e5e818afda39af2ab1a5a81c153c07f04769de3c31506d9dede33f2d30ae3fa27ab9ca197275a58612af33dd1924ad6927315c651ff0baabc947bfe4315fb918a0bc1072af2b47893baf554cc71ac88081860bc6f3985f13dca899ea4c81406cb495c55d8ac56eaa530964af1d35f9d90c268e2d37c08f18cc2a0652e262c498bc21c7746e8caa97f27bda130453337e94c1a51aa2d288c35d6c9c3d3d394ac9f30c9766366abaa27cc734a4b3cd98fa7bcd2095309756f97a3e8af1739611c37e5f22944f667f5b10993d2d1ca611ec1c1838c31ca78b4268c239f2db7a5cd84d9f349b94488131326cf925fa2d97d12b92e6172ef5c1745cbefe2690993526ea7c3b89f94f657c2b02689e8ecfcd8fd286152e92cbe33e499ef098e7db330bc045f10f8988459636546fc4d340a1f92309d852c559a9ed2848f481845c517fdfb4cd51289f00109730c115dcfc5e038f0f108835fd015659da4493e7f38c268e7a604b136a6a7a47c34c29cde4294a043d6afa800f1c10883faa8a07e4e7c0ff3da1f3e166152622b85a51c2fbc8e1f8a3095a79cf5c46c9e8712da88d5e12311e62e0b272bdc8bda0b9330c8f8e20311e66dd36372380f42299df37108b34593e4b0d19e3aeb640d1f8630fedceb09e2728e7b298968f82884490a3f53a27ac4578f67f82084794cfe9fd3b2272fc5ce0b1f8330b87cb433d9baf02108a3fb87a74e75e9849304c78a408c0e9c3506c25c164c8b29f9d6fa791e1f8030a79d894952e76757f33efe50eb6ac5d6f93a921839b28b1058a00b09a899995959f36a164cfce2042302e8c1871f0c6a9472f10fca8f3e98087ff0c1443ef670a6874c0c4b724ae2c944a804e0071f79b80c7ce0c1205a4f8f92e40ed5967b1ec57cdcc1a4d653883c39a950a9c2b1865650f061079394f44513d1958298201c6b6544f8a883498cb9495d26753dfca0833995fcb49f64b93ed90b7cccc11cbf5ea1b22e849e11c71afa2ebce8c27b78293ee4604e6f4fb2aed85fa717c7be7b60035d78d1050f11912ebcf0428c1c0787172222950398c2471c4c72166d216d4e48b345f00107e37e49f14e927369794cc8e051cc031f6f3025e1939d906ac1b13652c68e1ef7c5871b4c2725fbf0a7e338d66030a2a3471b4c9d4f9b6cf9a757a2c2b1f63bca36f0c106e3a57977969e4a27d7153ed660ee73df92cd8356b7560d26ef1827aedaffa1240d06e1e9a293d68a9fcc42850f3498dd3346bb44d6bf25394379e2f88e28a184d70e1f6630be8773bbaaaf242c49198c59d944c7719125bea7860f3298abb265d12dc26275b0041f6330874aa79e1eb24e84d9810f31183cf674274166bb848f3018456f67e7529524259bb0123ec0603041589724f47592f4f505b3a8f59342ebf66edc820f2f9864fb4b6a2688e80ae947178ced49448e7aeaeacbe358e3516e061f5cb88f2d18f4847f0f26b6b3ccf13d74887117830f2d986d2fc74b2657dfe794051f593089ce978a9652b8f160c1a49f4ef21711d65b5270ac9d5dc124eeefc4855750258a70ac95b9e0c30ae6583d3a6b84e8af98aa601879fbfc71a944ef11154c42ad8b2ae1edd32939533029c1922749b68e14ccfad1c4bb5f9ae4f246c1944eaf899793ee4ab20205e3baeeb4dc2b5dc659344bfade39b4be93568c8fc127123e9e60ae64325694bd580ea3138ca22e2bc7c9fa4137f3a20b8401f423e502a0868f2698d49cf04b7e63b19324490f11111e3d728ce18309e6a0e25b844a5a3d5d8d634d078f4444a4021aa82c7c2cc1b81f54b02b29ac8a526fe14309a6d322a6fa5f725f9a48e12309e6dbcdf6e4b1dbd6939060dc2e0fb99021efc63f8249c8adbc114a76ef958888348f277c18c1dce6f9a747fd08134b78347e14c1609f65a1e3d22f3f5c468f1c7cf8208239866a8c92d3d5d56828878848193d72d4d1e163082625bfa492acd4e2422d049338bb63a5aecb04fd06c1a094146ae4c44eda712e0e3e80605029c6754e4dc9f8f88141fc7fac3749f6991cfee2042318f8f081f14f4d524b92a0e922287cf4c0202a29697259b7d2c6f7830f1e98a45f105925a4f5c9691c6b24e8f11600e36307467bf9ce2ab16f42c9f68b138ca40f1d18cf4411972b9fa79a8a692e8c39737264ba68ad24c6857974d5e7afefccec740bd375bc123effe5c6a21d98618b4a634cbb5e64aedb5e359c510ba3dd79e7e8e023a49c7a062d8ca271173ca8986ca2691606ef0aee25a90d5d9220599862c467a598183195c7c2fc5ff1926687dfa5092cccfb9533dcbcef2d3eaf3049dae693a0739cc8b5ae30cc49777ac209de1ecf5698fa63878f1f4ae98d9e1526257f36d524a982d025ab30c996a37d16ed518561743e693daf3849855361362de5a1629bd2af242a4c043330e314863d93bbba60d2f9a97408334c614e3ac9cc6d0d77352985f9cfe6e477ed143df7a430470fbd9d5739633b5c3d98310af3a8c5754b26adb42b0a63c5897dcfab18d143610e25f6cf7c8c91bf3e280c97e25b2971923277f313a60c4fe3ea57ea42c913863365bb7b82d0ba6e270ceb1eeff5973cc917f20c4e18e49a9b14cbb61ded944d98538a23a24e5e76fa90264c1fd3e7b7e3a7f18e67c29c24c1f2cad99914e629983049bbd0179eec2b2fe912864b520e6516b43e6b640983a753429c10fa299b67831995307eeccf9b992dbf4b29614a714fce1d2d754cd59330872e498fd0a173b82f49c2f8e796467888b0fd58240c6a46c8cdf0689fca04120653954e69b5fcb1d777c6234cfe73b16bf5eac56c9ce108a3a524d2535ed98f091b6110d5a1be742c71267b3298c108538cb03d6b1121968478e880198b3076b4f13c278dd6250d6728c274d2729a3b51e3bcb74418c5a42fa1647523469881086396086982c83951a19a71088399fa5fa86cda3e4962885bc18c4298acf259f59810163484636d0621ccf9b5de4fe8d4660cc2b0f6ebd5e76282684f10e624c80993e59360692ac6e06604c270eac4a7a4c4f0d02903610620cc97b48e1253c993247738d67e6d064644a467fcc16c72a268be8af6b8257e30fee7e5248fd0e983490e3a49dab4b429e11f1fcc67a955d7ad3a65b47b30770ebad5cf249df91e8dc10c3d9873ea92e48d0b5b25863d66e4c1dcbddb5d7a5a4a251319e8f0424444063a76ecc083f93e97d0be6ad9faa26e60c61d0c7a62def3e33b577e9d618773f0943e5a3c657ef2827f1e6633ea604a6f95fbdef39b6c39eb1974308ece2899a63560c61c4c7bfa8366a957339131430ec6929f99ad96add49130ceefe801822f4e300283197130973a9d67e2c92bd1477030a75c876d93fd2d999c196f307cf5ee276157dde72e419e60861b0ceba7d549cea5a7bfd206534949855bd28c91aecd608349dd79f09ce470f9adcc5843921233e67ea5cceb5643299bee389ef2899a0ad3b0999f071df72776c5c10c34e88c33cc30c38c3218b764a8eab59a6c41fbaf808e10a4086690c1a4fd490e3d32941acf8fc1d41b16abbd3ca8f9470c26496665fb1cb3d4877646184cb32e669f46ca8fc7c1602a79a226bf49520e6b7fc1944ae4b745adbef7d00933bc603615e3f3f2243116bd8cc28c2e98f54bb6a4269a124ed533b8603e0f4ae824f49b28eade82398730396bbcce4b526ac1a4b7828df4287adfe62c1844ffa8d4b3b8bda261c164655ba3b47b5ded5dc28c2b18e64b4bd025991ceaa478f038650593e65cfcf5ff23985105937bd5d758480f1a3f150cd23f568a9fef5d93c561c6144c4199924b9efa7b1b1d0e33a460f2384a4a9bedf639c56d98110553f818dac2f89c5c6bcd808249ede3f485ab9c67c61ec38c27985c4fa9eafe94448c8a186638c194c5fd627578dbf9681d6634c1e4395f2698dbc3849ccf152f8f7e7298b104b3b855588f1f943c135282b92fe8f98b575f0428f94eaa3ea952c91026513d9ff09c3f673985309f3463fae6eb945c9d10e64acdbd8ba7b17e1a84399d5c32695f7be56d419804cf3edd9fdad7e281308517557e926c77c70b08a3a9cb9da41369b29bf20f86f54e956a2da74e92f8c1a46bba4fc4d8f7d87d3009f27972f3c35cddc207837d4aeacf6584af8c7b309e1079f62e6be2ae07536aa5894be6c1a0c3559267436a676b34f06096f7173d6b29df529cc61dcca16bab4e47b1243f1a76309a97f89ecb4fa30e06bbb0399d4b39f42969d0c1f8717bd4fa7534e660aeb2ef58728f70ac8988f4f81688888888e85681861ccce92f272b1542b68d270ea61c64ab93b64c030ee62da182b48fa53767a4f106b366659392fa13c4e48ed17083d1c47d3ba91926798a6d305a658df0945f1a6c308985f31273b249630d0679a2e3055d72dcf095861a8c71d9c2de499f461ab2b4a9265a9f26737d514d7a516581061a4c37ca6c762d7b0663c5bc24e531d972b2140d3398b637be3bf7da650ea0510693387f322a5fcdb708d1208339e9126b4c84d29593308d319853559d2428416230a7d4dd965b64857653184ce7e124494e69d4ffee6048bcb0344127517fc16c1b7ea6b73afeda74061a5e30975daaf57e49327725834617cce67633aa6fb222632e982ccb497d55f94d88121e0c686cc1282688b338255bb604f10634b460ce41558979fa932c2266c1e8f6f97ab43b2fc78f05c3eb283979ab8a629e2b984d879277a4e5248a9970ac8101468e17345ac12427e5b0d4d11e0d6854c1a44adfa6bf5a14b58c0715cc594527699671e256740a26dbcb3d71ef9ca468a56050cb0d2fd1b24966d256068d2898d3e8d3a9a273583125d68006140c424982724d53a1ae840a6740e309c64aee697f3f5a97d8e9a0e104f387edf6f04bb993f09a60922227eee97430e1da3c1e349860d44ba2e5a80aa692092fc1248feced951f71ac29c1582765d39b0f2526093b0c1a49309ade9244b5094a2a756901124ca572bd62c557c58fab0b681cc1e8e129c5bb3c514bdbafbd8086114c23d5e489f459b99c1e078ddc0e1a45308713e2df427a9c9c3b3ba04104b37e2569decf56d7771a43e0c25e3d2ba805efaab75799bf74332a7dae280f6808c128aa4d88b8a97049586904c1a8a7a4b974de97d3ab348060d253915d928ed2f881c946743c8b9e9a4a6a1f18458512422eade4e237722601cb008d1e30efb5dbe1c215a0c103d399e888eb18bffd221a3b30557d92b55296ea34260d1d98735d7c1175b15c98acae93246239b4fd850b930a17dc474b505b59bf85d93c5df69ed9cca75c882db80ab577d9d27ab9944d3ca9f4229438c282492d4cdee94c4dc5cb8325a710420b73fa7eb693940c85905998d79430bb24b6b2306cd8874813a790589824d90ef97a2f2caeb1dc9aa2de76ef6aadada2bce436915ed1905798c73bbda9aca23384b8c268bde54195ea1b8b72482b4ca92ae604bb3d8415ad9d88a79b6dd67d6dd649d73cbd0642566150769fb6e65249d16755984f6d564cbf754b135241482a924453963aaf8b9eb4a0e21245d4528b8a27768a2fde8d650a53d0d6b4ab307e495e4b616c53a365495889fed34248714cd9369b3de1582bbaa330cd86a58511e7563acc3966f017d8f132d0b181138549ceee8fef8d550b550422223a763c0dc4d02186884818648811120a838957c90aa3a7567609018539959492cee7d9c72aeb4f98e4e2aec579edec62daf120d8d1030466628cb13b7af0404f98bb45995c79c14b2eb13046c47830d6c6d0e1f9219d30968ee7af6ab324eb9d5e8470c2a0bdc42cf9c363fcef473b745c044236611e69aa4bba7d35611243dc89e6ff2588c997098464c26c8267a8ec8bb330cb4863c2e496de2b174c90a67b311e8c914b0a845cc2689dddf2533a25299d821708b1844912259550ea1f55cf3d38bc12c63451cb84faf2f2748e93d476f4e0410993e81a93a4d39556b384634778e438eb49982b68d1e69f4aef74098e4567470bd2cef677e8f00c8448c29c24d90ec2cfd34db71e3c2261521d9f622739897fde2724cc16efcc84871e1d2a9647984fe8ba9dcffff89fd011a624454b19a17209f7d53d186390d1231b61f094edcad762fa95c48311067de5498915d6ee8323237a8b30c54fbb60964f9950da315024441126b152ca677de3f1f5bd904418664c70b1bf4d7555072a963b7af04044989457d6924ffa94f5a14318e676564eda29c410a620942a8bb3a104a552218530f505f5bbfd59d273871006ffb46ad769dfca93483008d3a853627245ef942567470bfe8c7116c60e1d15e81e6124e410417492ca7f59114bf28a638dcfc818e91146620b8404e22dcb39ff4ffb251c6b45c918791e3bce18c5c220430cfc220410a99bf04f164548f7eb0f261933391751961f4cb152d4eb4b25d9963d9c8c1d3d40d0023292a78019f70823a10342fa60309de344cb132b6f9a468af1c124079d152ca77dee85e878404484c78e6f41c81e4c52af7ac74bb1fda544eb0106193c7e871e8c5f9b7b8229a994f8b004be38c1480942f2d0972e615dc7103c9893fc3d6977266d0d08b943b2f7734ea9dbe4d381103b18d49b926fa92a0525e2111e5c07834eca77941c0da183f9d4087d75f275ae9470aca50242e660bc924fd4aeebfde8500e86f8d2692e5bfee479481ccc3d72b3e43fa1a2e83746183930098183b94e4449d9a1357459de60da30f5d9a47c5e52aa1037183d9e9b20544a3ab6589e438ce3011191fde2042329a40de6b82a95d2c830ddb7078f1136184be893eff298fe134bd0740dc6ec6c71cf4d7d5ff05210a206835ca9b9faa81c747fbe38c1880942d260f4f4b39c434d1244fc1543022222658871f08b138c98103498c34af6d8ef96950f73ec9041f608232120e40c18620653ac183129a9d2ad58421810d98142cac05b57b8f43aad8f8d1bed64c1d4c8984e517b0e3078a0cf31c6e718438757e0035dd88e1e637421840ca6202b8995dd94eefe8f012163300725c749764952fa0f680bc8481e658f30128e11220693f6d2f1faff93b42aa6111d3d46100321613096c9d1f5d8bcd66f878ee41c20040ca6581779b14d271393f405c308e5dd664ae99bbd6052e2f3c5aa5a1284fe74c16dd94d4ff5313f87908efe40081736295c90771f25a4630b499da3bafde45cf727423ab4a049b1cb913f52ab522008c9822947cd4ef6a89139fa1d07070fde102c343a3fbb33ab27f6772208b98249b87addec39a5734f64a0030c300e0e1e6b1a6285ae54955b8e9e945847183a768c611782902a18d6932cfd3615fddc5a8550c1245f7e7b4f498dd2278a63cd3f06233a7aa04dc19c97fc53ca1fc3b136e2397a9c1e3cce2c440a66d5ce4105a1ea4e9e404814fcbc157496655c7a90a1a38c0386884808142cd72c8bad70369edd154369195df5255e8ee1d320078f0b7902488813cc5adfda5f4159c93ec78e1e23650b08698231bd8470eb94e49ce5c2b156831026982adbb7744b1274f2c7c821835246c812cce9d744d129dcfffc83636d87e1134294607e0f2aab9628ea53bce058634248124c6b4abab026e6cb892a210409a635f10493730473c9e3c1eb62049394626ee6a9a49d8e2721a4084693927671d19f6d2c49045369ab1c4f25715f56bd3342c8100c5e6265bfa0c51ecf4308e6bb58e6a684675afeeb88101204c3965c6ad35310a662d743080182714b7adcbb966cdb2623608091e3053f3029c194fc7a99a42dfa3e3079ac689b192797cc0ec79a0e3146eefa8b138c74480fcc3ab7e356a288fd9e6c10c20383c7bcbc17c4b7038334cff494764a29b18510a203c3b6db491de369299d0bd3c7a5a814cee3885d38d64070611a5925d89c708ba33b8e5b18ef6ee7fc4c12748a1a8fe203105b18fc93605ab155dd64c6a316c6d1695afe2ef6e43071acf5e091038cef9103870c467a7c0b6861eabd91f1dc59ee4d3f0b7368cf71d293b230aa957c4a43277913672c4c23fea4511e7b3a3c1e80c0c260529be0e94ac8bda8e800e415a633599674474bd2eb892b0c26c45ecf7f90b2dab6c2349784abf1a042c7c4405861acf34e49475395ee470ab28a035185f15269efa98e1e94ac0e3078ec90c0998b51068fc20090549863a77efb9a4f1f55840a63a998d021f424b1ce013985c93b8eb89bf8f8e12710539884103ae98f2799cecc387664478f314ac70e052905082932712bedb97a54df71ac29c8284cda7375c5cf935b4b9228cc265809627c2e2b769540074261fefc4f1a57957a4d0e020a53102fa2f6a43c66baff8449cc74271952f78469f652c34c8ef0103648278c1644ad728c30f1c40a454038610afbeae2c1b4209b28c78fdd0a3a328068c258714675ca55c984313ebca95241c684e93d9eb5472d41eb209730c927f78a2cabee402c610e4ae75c260715b409a33b904a98720eb293aa5421548477209430665dcb693dfda37d1d4ec2203a2e97bc3815aa7449983ec9933ac32f69af4e248c9d7316b2592a5eb294134020614e52ac3f29499dae217c84f14aab44c595a0ef7b4718ec2459cb62b316449e0248230cebdfa13efdcba7357be4ac00c20873f495af915372ecacdd812cc2f0ed39a724499f57e9bd035184a63652dd46be8930e969e7de561322cc49b0a0e43cb73f997808739f1c3a7f756e3e3a8630ccba976e8f9fe7952d3b7a8c0152087385092aaccacad3fa3b104298e49c274fe94cc92729772083309a14c5db4ef83d49f98c8b00118471bd04115ab505c22467cd89f4be193d933f8000c2245ea94982ad09f778fb00f207838ed61243a55c89ca8e1cc703360b103f184cf46407ed265814a53e9845893b1f4cdb9deadd55f7352c207b30092609224f4aa146e818881e4ca9821e25453e7930d7de9f94dde9cb528907e3c75d11b32d1fc3c63b984a12ded1ee73b585cf0e4637ff244bd4bc852d0d01a40ee6fd8e7f92e42164c9613a984ed949c1c4bb73309a6de559ff93d262052207c3f85ba80c65aab3ad2071306753bacac4e88ecf4938d6e06052b71f4e1a25ed84ac099037982479e729974a8e23103798a40c93d3d327f9244a38968c3698c6f7c4025d49298c5e92b4f6a7561ba4305e272988f08ff9f18a8d51e0ba27fede2b51984fa82c3988ca2626e3e8713c202282a3c7b1110a935431cfe74b440618bf638c651ba0309fe7b8784ba974ff07478fe38182a3c719a394d1e38a8d4f982b892e493ecb86278c95a13f89681f9d7a2f828d4e98f37fc59b4aab8e7b8d8c71c2d80bd8e084498cf214f7d944da48cbe88156c60ee64d983b09a677c207e1581be9c1838c1d233c72b0f10023470f321e604313e695b9cbda2556ac14ca84a9ead2bcc2ab5cf3b6810983f2a4b3e92e173bf162e02e61d29fd3f89c9f58c224ebae9a149772d025ab8431745d48b93d75a67f4a986dc7e3a85392749f3b933028757ea61e2e9a90ab244cf2cde73cc92dfd9a251226555236713b5792eb4a9030f666ea8ece71b9f547184ce8899572d8ec27930d47a8e631676e97c2c5b29c3357322ea693798e8d309bcd99182a4f4698c544dbbd9362c72c676311c6f8af517f3b1539491b8a30d6af4956259deace211b89306f29254fdefdca2b44844907f125c9254b87308fbe88f877dd5242c9109cb7b755acdc8867aa9ae512ed64edea92fe42649e26a90925da11e39146084c2ba75bb070975e5e36fd45c830bff5330dc2682a84e893ca54d23d128449ac1dcbdab1e44cd347caf51023870e0fa8d9888d40184ec977da121e7c2eae35041b8030cf0875418f49133abbae828d3f98bdc7cc6328e1bfa4df56b0e10753b4ecd43986862eb574c1461f4c3aa59c88151372cec30793868cbd0f8f6300edc1b0ff1675e73e7b2c7a30c70ba34b6f437930c7ca75825d875151a4783045b97eff5ce927687b07835d4aa72d9dd2b7faec6030b9354dea4aaa83c9547ad3b26923ae6a3a9844fea3dacd3907d39cde975436928329e8af3775f6353ae7e2b0959bdd58f0d2f0f9d0ea13b327354ce060122d8472fb70798369943e7923649a363d93c1861b8c9efd74e53459a4fdc9461bcc5626be2de7e4613596d96083c1cc7bc5ed242965371b6b30e64965629b9cc3869aa8c1b8ee57278cb2f8f3370dc6109553ff4915d4cdb78106538919ea04cbb9bd3a66e30c26cb2c25feb6554dbe6d9861b1fe932d8379ffa4977a8768a9d82083514f8a1ba5647b13deb63106f38968ebebd777494b0c9657ba4a15adce84b85ec758cf9eda088339b6eea2c5561fdfda06183e1345282df94c36be60ee0ea343e5fc1f76e436bc60f26c7b7ab65f4608a98d2e18ae4be9cd9bc8535ab4c10563a566959cf2ac6c09da82f9cce4b5785af9314b74f0d841861736b450c7a59a4d116d2f910f6560230be6f324f4945905b99e62c14ad7ba6e8bf22aee5a512ef6d3a7bdec25465730a7d4f30a7ab9b5d91d8fd8e1c086158ce921174dbef40d6c54c120fc3494ec698f8bcf0615cafb24a92a8f73136c4cc1586f31f73b093fbfd0166c48c15ce9f77bcb4636a260acd3db4bb93d237d041b50304925766c7d12591ae3130cdafee97f174708d1d97082b9e6e3457b36a975afb3d104d3767507cf498ac8047312dac389d9fda1dbb7b104d3e568b2434cdf24715382495beed265f2565e5b36926038d5aee3a7dd46e9910d24985fdcb254f49344d1d8c6118ca21e3bfcec67c8f8368c608eb2bfdf27df16b0510463a7f4add75f2a69fb88600cd52688b25cf2894ad918026b495c6ec4e552d7547e0f4a1b423068ef0fd9ea211b41309914849233bdd2930a8ed8008241e9e87f0f1edfe36cc0c60f0c627e1e54c59096c432011b3e3057be24e8d5d2ff91131b3d3025492ceb24289f07660b19f59453b664e5367660b46025cd770a7e27ee1bb0a10393a0b355d0a6c49cdc7a2eceb832f11af54eebacd93fc174ddc38531e5f357ccbacab3a41ab7306d293f49baec6c72d66c61ca3989189331792aad8561dc646ffe52ce94125a18c4ed7596124a3eb1eb5918c3f24249c9446561beb51cfc46fc9b074b2c4ce24ef7a7609672c3c2dc71727eccbcf519ed15c6efd03929b58a7a2fb9c2fce1dda2637b5ebeba1558a6ac566e37bb9226a5c5cf41e7c9b2c27c927251395a92146aacc2282a6a3b4a75aeec5e15c6d14eaf1dd33ac7cea5c258525b0e2f17a302b970332e97565b43a4496652874a76965398e43a2d53984f30417d5673bf4f580a83752871428b986de9a430688f1e94bcbf52265b46617aed1c4d4f6e51984fcad151d27ed2fd9650a4556d1b6f6b276b17f4b40932f6bcb5ab041446134bd962c9b7b6757650e313469fd1b9d53244bbee0993af97ef8fd04955a83bc1cdab66da5710cf4e31cbd924f9d7928436e1c30993dc9a32e93b6b688b6dc224bf92b85f982531c9911c270639768c3132f2c50946446a68c26c72f62b49b2d31db723038c9419a89109d3a8929275fcebda5c70acb54007185803130691b21d74aeb0d42e71acad8e0d5ce230cb15e4d6e2c5c53b669920fba4b4a0053a3630868e2f44445aa0030cdcd1638c1a9630f9ba99a8562722d4a884e9c39ebbe76d33b97447ac8c1a94c84a3cc1c29c609011068a8888881cfee204233b6a4cc21c2633426f8752aa8448504312a6fb24464c3249bfc43b12063359c2bcb2579076d58084494cbccf19d294c7f88f309565c95b727f76cedd11863fe9753fc5aeaf2835c21454b81613849b9ee5cc841a8c309c27257aca6d1c3516618ee3f329459aec972e351461ec24769f5cbb9c936cc231814e84c9531cd13539282989fb4c0f1159abb99ca564d55dd944a77d7d8f1267cbc4b126c24344e410a6b41571532a6e0883b62b4189093ea693ac1086cfe14b8858e8e4ff13c26872aca8d369ac31089312afd610844994b096d11a5ec2f9350261f6512b2223644c4a926a00c25c63b2bce435499063a9f187d45ac3aedd662cb4beabccaf24a984f1fc60b6203ba75812e45bf69d478e304a1f8cedf92bfdc97af12509831a7c30575c32a51b62aa4f4c0d0235f660f691969dbc8435375f0fe66c2d8b553a79308a554af24355ea49610d3c18ae94dc95db42fc841a7730c8efe9dffe24ecc8100f1e070c2fa050c30ea61377d7501a4aa5243d47a85107f327f943892777ac9c950e591a8b696dd9d5abe53d73e7cb73fadfb16accc1a04ac7537147949cec6bc8c194397bf29efa134f97e2601491fea7739244e6e4e1605c8fda59c4e4de60ac9467fc73ef07cddd60aa586da5f32a25d1736d30760525b96e7ebb497a3618de743e3bafd43fe56bd05d4e342b4eadcd6c6caf24194a3afb507f0d3518ee7292a2b2278f932e35d260dacc9acf6277edd9a3c124e6ad2709759b16eb3318de4d9652aa3783c97476759127d766b635ca60f6e829435f830c26bd9fc49667dc78d08f5146089650630c664d3d53e2abcf6cdf0fe3ec381ef831ca08419d180c424c989f53d2160693a454f8e5360fb750030c2693aac5b3946cc2a41cc7da18d663870e0f94b1830735be60f88b8f3da215bab62c36022f6a78c19c93a685b78aa13d45ab0b860f4a5f0825286b70c1f09a1d3eab6a5ee8160c164ffa87af12c74aa7580c44448ac5008bd5d082e145d62961f4c9e126ad9105d3c92a9d2b26c5a7b863c1bc23adedd34db8d73304a8c6154ca225f541050b4a556811189fa30222223c940b35ac60ac1291a1fa556a4c1611111129a347193d0e0c35aa6036edf94b87fc932aca5430070fbdac7042df4eb0c614cc66e2976052c5fc93f2480d2998dd4c84f7290f172f55230aa65fadd08aa7e33cc470a80105e3883137cbe997e65736d4788239598f5c874b0e359c6052ad255ada5911213b333bd46882713f5a9db0f9d60e31c17cdf9fd3aad4623cc902359660761d755d4afefadbf8c5a1a186128ca334fbfe93defbeed448825945a868d1d35e03090611ef624aed4879d43882712b27a955634bf5eb358c60aad2714fbb67358a7049f59e939c938808e6bcad1ed76e8760ca3d9693206ad61082b143c88776d3cd16cb04358260aea46b72324185ab076b00e1b81433d42a2c8ab8dc0551a29399249552a97d8d1f984d8b56b9ec8993278557a8e103535a9b8eae257b37e52fd4e88159fe54bc3251e228dd77176af0c054655212b45c8ea2c4b90a357660aecb41dbade9562929156ae8c0ec2fb626a77acba83417a63a93d159f726674fc185495b363b55797953c75b18b6f52d4f126267e2b7854992e2e38492dc249de46b61da2c71c2e4f0bf2047b43095e898dd3ae29f4d3e0bb3a7af97deb0cb9eaa2cb62ff9aa97f718d194cb0cff112d37f2d6d758983e4b2e891f2aec85889f400316a62057c57c5dd42f582840e31506cd2c61a927748539e8e832ff68263d7ead307750f31d2e8849c29dd06085b1626a8b49274cd8b88a4a442c058d7313b9e4a9654a7d2e5d5285c9a4dc135d52a575b469a4c29c7b92d6d1d79d63e868a0c244c4a0710ae3e9f0bd6c72aa18217f8186294c96bf334a95a814e65457b12f7a92e70f29cc96dbe6846813c4098d51dcdab1596d95dbb3725766774e7b3964e7474314c61babf4ba8d7b1119258c3030a0d7081aa130daef99eca26b94924409a0010a83ee943e477bd16b717281a443c70e0f9082c62718fd2827e5496ea5fda5e1897225f10a9e69736ec92ba688142d1f3a343a612cab1a2da59495bf7881d2061a9c30ea7e29bdb9563672b209938e517313ed0e2db7266864c23452774f3ee5d1c084d124958408b52694d20b8d4b183bea89a2a584eaa4a338a0610983c94eaff7b1e4c7e98cd8256854c214cd3abf9e5ea724323174e430fc010d4a182b889cd4de1eff91111d2de04998d489bcac354aee73342461504a968a7f13644f2ca9c3412312c6d2d7395b6ceb8a2e818429afa249ad79162dd5f50873e724faa7cfa9021fe82277f4184305341c61dad5ec3b13bc4db449238c6fe349845279d9d1630c1a8c30f98c3e396585e54afa45987784567dffec52ea2bc27472aad026428930ca899d3584d433c10411c613ccce82fe52f92d3a84c90ea58d7d0ce6d131b99ebfa453178331d43e5cc949dcb03b0ce6ce7fda2c96121a623018f6f6ad57b577c4fc05a38667a5ed9e9cedf582d994ac1b66214f50d92e98cbe43ce2e48e2723e582494a9ec47e1243883db760becc933abf3c5a30c7198f9d334e8e9672b260d61e19f723c3941c1e2c98a4e774cb39bc82b1fa0437394f50a63b2b98ee490a4af96f55309c9cbea4b04a3a4aec50c1a8a52459eb3c9e5775a6600e33a6e4cab625ea5230493af89b641e6b3f51309d0e5f927842985c262898d38952edd1975aa6271864fb4f2c37f7a4bd130c9f9e6fff479714e44d309c7fb8b9d7fda99d09c6da927d7e76dfd1b30473ec8bdd211e2598c4934f1246defbed4930b997f02aa722c1302b7729777a049324eb884b7ffb4ba9114c9ee197cd46adc6590493d23947f688a9b19208e67c5f4afcb786604a4a89a14f905626772d844a5a4be6a6b420986d4c7de7ecd549be1a08a6989d7f75744f0e57ffc0f4b6f7497e75137bf28129c9edad2408f5c0e89d742ced3d99ef06e081e13d073542895795730cb003d30735e1a7fd94a43d06d081b1ce4d2a373fffb773612c95c4649c50212d8c0b939457413f2b4c32f71626b12a7755fac753ad2d0c16949949a7933441ad85d1c452525dfe9ba0246961389df3293a09cfc25c2a999c6a45ee7e6459184cadefcf6468bd90d1d0bae51eda6358982aa98e176b665275fc0a73f2934eac10d54969ec0ac3a5a4742859ab152e6e8561cf6249692c668541c9392959b7db7315afc2e0964ed21fc444f6af0a63a5b8a763f57f50a154183b85fe977b4b9d765498f78279c7abb658fc14263b25cf94ae2eb724a630f9f86aedcee849e25218442e5be9e7d51c31294c52fcf2d013fbedea284c77793ea814aca2294561365d9e2be72f58284361126f3a7e157b1b27288c25bf6be8ac7cc2b4b67e2dae15ba454f9883d88ae7c1e3f3a913c676937d494a61ef72c2a0e2e83823dd8471e5c38cbc6e35613c41df7bfcda4c9843ed9724a65abc9c840983924a6c334bba84d1664669b38d1365b784b963f9af8b8ea2049d4a98f7458ce55f7a36694a98f29994444971d47a3c09f38ec936fa490ed6b1244ca2b59a4efa499ac69130c8be3b3929d95bd9a29030e65ca792e3cbcb84fa0873d026b9e5b78cca9b3ac2a44596faea901b61ca69ae47d5ac2dce087349277c92e4d637cf228c1d64fdae8692e27e45986e564dab2849844984665e7c10617eb79adb2b93c5720e61de37d99125de49721bc27852bedd854fa5212e84614bec92ad0417b92c21cc714e0af13987748f0ec274769593d20561ce490e2ae6399dd52510e6dcb145c392546a41409852ed5ec9dfec8fee0fe65b7baf302d294e7e30a59c1d1643d594ccfa60165d1fd2fb3a7c306cc7f10ba7b407933071d2cc9cf460dab279fb364bed7c1e92753bc28329f324fdafa6f47e0773579d68b9ce04b3123b982cbbca24d926d33a18e6522a19cd4b62c274307c2ee93a4997448fe660306d7df3a3dc84891c4c793fe8939f963898f4babfa453163818c4290f791f5765cdf2065385f4b5a073bc1bb3b8c16c6f620853e165d652da60f4f08af739e3be95c206b39b892fcaa41725e8ca1a8c21bf3c49d94cdcbb8a1a8c6772906196948d29a5c1f84905d55919259c8e0653c9f5a994fecbbaf6194c494961e664a7744a6c06b389153b3f85abe42d96c11c4f599b583aa17e22194ca62e6752aaecba0b8ec1a08425ede6ea9fe68262308b30f5ceaafadc1e86c1f4ef614f76070663a67accfa49922831fc82e924714f8e6a3a3a95bc604e13ecabbdd287ce77c19c479b9c097565a273c154b2e89c67cb948d922d18735bf694e79c44eb68c1e4f5bdd57766c12c5a436eed58309a8e2e215bd1a3e70ae6ac0e72ac3f8897db0ae691efb89466ba2bae82d154afe9cba24b4a4205b3e8ea14ad7f3f340553972cfbac2d2ac7560ac6dbda17a976c288340a0693548be93e15ef040a66d1eda1734e2b25c62798f4e4f6be13474b122798e624b992922595a3774d383f7fce6bc2c4048390bb3afbf92598fc82eb7588fc355f09c65ebf32c90495294249307a091f265fe34f8d90f0dc69b5bee908e69096b6334bdc2e31824197923a3c9ef0962e82c9ebe499579d08c62c49fe0e4ac7f29c0fc1a0669f443f4230691142e7f85e97eb098249764b15353f9bb0190826e16d3fc668f14ba23f30ef6ee7d82bfe39547c6056cf77f28979d22ef6c078ea7dbae6f425b9e381a9de5456801d98a4e9133c649790632a800e4ce993f8b0a52e495dca8529c941efb6a7d125f4b830658c3ea1e32b7ff66f611495b49f2897440b215b98d4c5ce9df6d7c2989e7b3e4dc80aa784162649501d4e4a9f59982a5fee34a7a15a1d5998fc52b5582c11e3e1589842ed7d8c530b972f2c8c76a9b4b49e9612e92b4c6bf5a684570f3a565798f5ec4df4ec582cb5c25ce5254bc7ac30285946ad5d0773731506b3551db1ee245bac6ea8c2f8329761fa47fc5c375261924acb838dccd4ce5e06375061183da32c644d580ada1ba73055123743a7cee12fe41ba63009268fb6c8d751e9d78d52988457d349bc9366bc1c3b7a145298e49284c8872c3f39ba6ba330878cf77ca5633c4461ec78a51d2b542835d95018c4e4cabfdd31d7b9ea4061d29f5d2243658652aa4f18d63c8f993e314fddf284f946bbe57677f10d3b61ec5c0f93f3c70963a8a8559f4bc89b302751a2598df6937aad268ca7948b9fbb97c921ce84b13f9f294f3ae81cbc574c9c24955b77e42c9c87fbc625ae5461b6dde5ed533d4e0f6cc06f58c2e09d93a05f33aea2c602c6186160a08c09f0e0713c1002112cdca8843996a77095f1a673d439521a310c54a00222222351b8410983e59c6fc546bde961e8244cdf95d2892d318eb5ff1da9b4244c953c9465257946c294474e7a9812fe4952c1b10609a39c5072e193a4196ac5b1d617b8f108d399799262c8ea33417fc311a6117a54e720eb64cbb1c5c08d4698e4f06149caff29c69c811b8c305b9abfb019a204354238d6346f11a6bc565a516c64f6b25544183a7410e0462290183964200619356e20e250cb3e49cc0f110f307e64878e91314e186679e310dcab9ae5aaf612aff6d2d2a25a4ee3fdb2e771b47b84916e18c2b0ab7552c4f61f00038c1c1a1011d19163648c429842e54af7b80961924f0ccb14ef70acb93108f3bc09a3834739704310c64faa7122dfa13c3dc53a702310a6edd9eb3839f1fd18202cabd0128f3f9834d35e7d4ce40763ebc993e2754384b8f4c164529266d536574a94cc0773acd87e4f2628a94df6609c1197a753a718a91ecc569da4e812f432c7240fa6efa017f27a2c3daeb4c383515b3d7d4aeaa526e838d6380437ee60d01e21a6afd3df73c80e06a5f5db2985ff532a098e35ad8329aa85d077177f564174830e061d3c9596517b920a4a1c6b3d07e3bac54f218409ea2bc6038c31c2c83132a2a723c7c8183cf28b138c78e0861c4c96e49f30f3b938984d1825bf87d072c265389852d74f75923d37de608ab677d12a454b5ee21b6e30e957132ba80a6e928edf688331457c08c71a8f3074ec4846811b6c30fc5ada4f49eb57fe6f0d0665a1717184ce31b4450d2625f9e7a4844e920693a8917aa27c43833662b152c999b55cd7659669c71f79517fde1b6730b97f8a255f7622b86106a305e56e266726a3021fe8e24619cc27cd052b49924f4723ba01094ca0031bb080de2083d92c49bdaf71b3bfd28ed8e181fc330737c6609e190f934fe34e509288c1b05fe7979377bf430737c26092a27ba31fc777dc1711d9115b3018459bcef3f0125bcc1b5f30ebacfd87a5d2297e7bc13096a4b9986775c178d104f10d2e987385e84e616125d8680ba6abb43c694ae37392168ca5a24b123725bdae9c055312840e65594e97ef78030ba614a49724ed72ec8b3c878e118c581837ae60eeace8f1ab244195d0ef0e6e58c1f4a24edc73f8b8979e8e1e6394b1c3f577e8f01edca882c173d7ae6bf65430e55ce9cc92494fc1a0820eb758495e0aaa6cd5db88855c8e8b6692a022439bd2bd200ddc8882d147c46559896e9dcb1e3ac000818808fbe006144cde41490d4f571b3f3dc1a015c4967e497182e1c6c29eef5d9aa058b57b850baba92587e95df5b49cfac30493c9ab5936429897a5780e3012323c20222222222262b667071967240d3796609257e4ce2adee8bcf90d2598f7a44eaa74ca3e13db8d24183f25657e4a2c1546ea379050ac17116fd92e1575f31c2709fa3eaf590ca123183bc4b5fd2f8a18fd19c17ce6bb278e943d55ed46114c2a2f458b78b5d42797c00f6e10c1f83defe142c9616723004ce1c610ccb51d2b489318e4404881e6b32e5fdc1082c993fe0e3929cbdff4378260f67b952f49506dd7496e00c124668e971cdfd2d7fd8d1f984cd0aee4f1e24bbcf3c195ecbe4ebd6c5bd3e2c3fad2647a6c6903377a60523d3d61ddc28e123a5eace0060f8c9fbdb49d28d7e2c9ba11dcd88149525fa3de54bc93a31b3a307d4e69b493d225a7b7f4183672616ecf3e71e93b2e4cb1b52d4feaf4ceb215bd85b14d9c753dadd2f17f5b9884381d4b85d7ed59cb0b6cd4c2b42725f96413e4884f1bbac0062d4cc1f2c7cffd493c95100c1d3a12306cccc2a09360724ea2a76cc8c27c3baaca3c9a24c9c1140b93989c7489564a9592f20e6cc0c2b827e6e6e9b5e492546cbcc2a0adb5a43cdeae5efa0e1d2362ec780caced78fec2862b8c62493e3e75ce92dba41506396ba2844be12cc8c80a930aa1b69ecfa277d8e929f0639411825598ef248fa6fac367d5481566cfe9e3a98f492a0c4aec9cdf17272ebd44c595b4e452bc82596e8fff947ff2a90b9f47f6400e30c600c18e1e3cfa14e6fb539522dde4050b99c2a4939ff292e27b0f8f6ba864efe5d268280e8703a260281008040cefab0023130000000c1c90c5a2d1704026edfa1e148004593626423830222420148e4603a148180e86018160280c0602828150280602395888745e0f07f740bc92de1787fab5e38e3b6c61d8898dbe50487fa9af90673ba5b947c15db706850a1645464c6db1c3f4e85571413f2fae7717138bec9b43f0141685a492fc6754b5d73e0cdcc15fc8097b08af9aba08a4d5859861a83e7eca5245df6688966ba416391ed82930e791217004453d786b8e3ed7ecdd7818d46107fa72c558c44458556ba98d22348c3a513e96e7ed52b98193de2f561ed18eea15ec4d3dec5cb5b7e121f4cab8c16e1fdb6e8b25f77bdca8c4122d95e631ac18b254ee0954ef6f2bc2d7fc75c485ea966cb4db1701fd263f621e6bc7e975f62e1940ea46f3527dccfd0a25a7d412ab963eb4291505ef2382b562072e7696388827a427e37afd40e15a576a9c8c5c79d103e2ba6e7f24ce698abeff4e1a4b49f1efa31cbf08b42ccbb13ebc1bfd4f6d29bf224be39dc6fcaa4633fcb663c041e4a222e73ea42b60cd110f167746a96d324c65135742a4f6d6e947c735dc4d1947aa467788844a7bd137ec41f704e3a51a395f5e6b57e979b04da97b03f5baab8720b87d0f9dcd965e71ac2e68f01be7b263d6668696107a564a11ee5a378bf7611f93e7a04ed743ed15352c00806ca5e04111743272e5fe8bed665da32f3c9c1fe2722cd7c575ee9a9ceb5ec298b2e73114dbdde29b4a5ff4deb1f48873d8c52203ae1d98fa003ba39f9d13ab752a1e496f8c83fd7a61238791d7b0bd62c72d4665a0d458db1ebf2e44724cf0df06fddd309766e85526700292e03952e82bf224e3734ed45905671c1a2fd5e935b95b7422a2bb8b6af3a7e8e09d617a4bf762a4b9218ee842b5ce442828a925179a78d166e5349d293c6c4470305e1302176a1b3a62b15cb9a4d441101d13a55e995c7277384571466ad06c9b9fd048804222c738230351b5810ce3c27549dc46bc02f89ebeda7aa7bef3854200be8293b7ec1258bedd99655a072fa69290820bbec70b88fad5fddd7fc59bd4adaf8dc0c324ed04f9e2ee951e7a5fd8b7119fb84819c5b8d79effb430690dd71055ff28d370d0e1a06259211f50cc3712163a20854214653e40b9489bba3cdacc71a02ff88548f53555ca02887d0422fa3fd730d6fdd7d9f0ed4967c754e5d82c04420e8a6d2f05b90fbf7c7a48642e00b281bee9a72843f2203e4485531d1a79061edd1ce48e0a254cb4be48cecbf05dc10be05bbb41788620d48a3408ba5e9049310adf3a21f850c689a6202b17dde6f409d22fc301c2f63ac7a202dc9b866a8fd037fc4dfdeabcbd25dca99d5416805af2654717b0c55536e097a10713dba43dd02655260f8c04840f07d6b07591158827a02fbf90613087e7bd9e179084833659757e30d874c0ab231052b8fc8e65da72218b5bb6c4fd83b4c94eb5a006a40928b1d36ac3890dfe5d759252de4a7bc0ad5bb248328f3dab484f58a278e85be8416d6e2fd6d1d13413c092ed641b9d32e8f64bb7f004d84c06e27d41d1c55137b1f11026889f0c860b24266ea3b0d70131b941aab2d0888f6d6e2fefbc16f40d54490cb751f2f00964a1778ea5ee8f166fee89608e8261489b536bab6b7ed0dd15bfc6b37b1a2328dee3873620db4a110f7eb81496c05364201d0d5599e17d9c4900a619b5d5be9039d9bd8486dbd9212f61b825e49c7266aa56706b4f9662b2c865b3f0ae6b584e9748e96fc515cf6770722c06729d4ec0cc27e8e0804c295efc03a76d030fc9da39ff360dec3d655aad24bd12ab852afdab46c69c828082234c201cd7ceb44046aee52392a52768c7f64d0d3452d490bce32e1144463acb7fdd40a9bee04129b8185c15de4897281e225ece4a0df243ecc35933ccabd70ca586bb147216efc0b0eb0011cf0ca07009c64f53a94c412e4035490a1052138fdf44e737b4524e0ac48ae150db0e7acce4e4c7aaa59d470eed83bfb76cc99c4d694b7e0e6b1af39ba9bb9f7bf6096d8260843bb92205f956ca63cf697399faa680be838f9019d8565f13299c8a2168f6ba17a6f44dba8f2be0b76445ea8d190d6c34748a865ec9591a95fb98f5dbdc947e35ac12403c83a71aa6a6f558d7efdfdd060022b4269722b67975fc45243ec1b972c22c1ff7c30b7d6136785a56f7ed6e931255f29cde070dc64a11c6a5220166c44c6c31547474e7b241533a9f68f7e2188a8b8d9e9a1c42fd801667343dde54d44abd1c02eab4f97637decfe0d0e6d6cdcef93d42e69f83dc4a99e226e42ceaf66a00d342203af9d8e48d54b844f592abd77f5cfbdfd824552cb270c8f5f6c836d5ba318eb82ad371179fd5d2f66bbb68833edc52d6d0364a5d396325fc0ebd058398441466e275e03a4275d18f3629a35fe6c27930321e2e7aa031ca09ce1999580fa44713e378e9e8caec94ad1917cd5fd0729ce192a0221df15b78952208b698b1db162f23baed325e0d1b85f36e09f0a7598a6fd786c68868c9a9597c6b193a6d27469d73f2c1885a94971a90208d0ab57332dc20a23adae08d071e6f17ffee108bc15003ca8b35fcf9b5302c71d4e9a85237851ed9da88ea0742d4b85abd799c3678d025779b89358d4d4e90cce8694c78f5a42bc2006583fe3a7ccaa07c6e47314319865b7a5b3907768b1fbf6367c38751d6a6ece8b686f8fd0f5fa010a70f015f9b01bdf4be0371c98fdb8f05d66008242fc1b9a62bc7684ce72aea3143735d15c49400bcc614829722377858783d6db6215745ca0069cca9b072ccd1df8c30d43029060c61b1158ac4ca92626051d40ce2f8c44da6a0978c30d09225bcad0b650a0c9dc69eb379ee151b0f0ad87da583db8048e952d67367d629bd2655a7b58cc70720f236d4f7b4bbcad172998b45197862262a99aca439e22c6427a28b48f7213d57958e5a12c1f5c37f8e0f0ed0a20d8769f8b0e14528d3c480f91646a0b70a3714d07d91f89f64c8e56278b290e00040a80d340ea66b88e72f82a40e37aecbb4e88a2ad4bac04ba116c111855e1f5f21e6c808bb5232109a9da5a50a5b81e8a263bb5de7d0c643e53f4e82131624e2055dd665a20a99a83af69ed0fae63db41896fd0d047fbf12cfb94ca2266163e9df02be69e140440bda82a15408a28895677da224e92198dd30e6a98bc988fae40db589c8e594c34ab961ca8cbbb0548c001855aa154a5877e8ad0fda9bec92d5526b19790b0d3336c8d2a0ef21ef2b69f889e66e909121a8ae957ae966a593b000b86776c02543c594a7566e327130cd3fc1e784c464bb9c9e0ba68a1f1747066e69f26a6870684af4731293de40a4633aecd87d4f4132f168e5900d8598682072352493b92111aea8e10f09733bbca0a13b58f01a1b7520b6c5f4d7eb845be6cf69a2723d1a3d75e8b6ccab9aeeb93331a0b3f0da85d37a934b0499eedb60a2c4fcd90cb5253d467058e03402653f53660c64d0e0a48030d2db300995ee86433b573828130e1df662044749e5132e23f40a410c324751c32659891e7fdf23afcb66e0dab28055e550bf7d974096417922adbf12a9e8aae4ebe49890c425f72890392889212328ef77820a13051d4ef72093be55fa025bfb7606b9a6002731613f6fcfb8bc12e5859f20a685a8d3dab2c5d97572fc01eae327f7839098ca355196541210ecaa5865aa460e31219605de7c62a630908fd3e5c330437f0101c179033068fcd0978c61ba4a516c8dc2024af4da5efec2d61e65326c62d85576e2ba4be659d45a702fa0a1ccdd348d34a265b0d5f2c3c2259d5c815602805a1235ae72a54df006ddbf854ff6afeeaec02dbfe2218c978b59bf0974e9a4a5878124079ac0cbca1c2d41f448e1d710e121d7214d40b7138dc55b2c6516672d2f7e13ba9ce8b9278c2a485ed195011b238fbf7a7a07b76b0a13b1c58043d92af696b7a64228e835c350d47b83b00d0d62f209e26ee89c7b91745f7bffa210e91f81a15a124f291e530d0071baf9a679378d4c8f0a036cc76343ad5d3cd59154aba45a42376e6fa60d3eb4c47d15b62a506602d7b64e2db0997283f45bee9de80a3850f5cb9a0fb8505ca9aabc0b48f5e2bfd19debf82904199c8a6cbbceb7362d21296b4335989acb64bc4842ea94d8fc95100b1ce605108cae56e2a8f73e74fcbe0a318a0aaf91fb1c9e2c3822257a280bc4c09d69a389b83870c3155ab1a7faf05768ccb0441c23207a89b153e4656d6c8eb31c62b24ea0db649fa7ce8514107d4a54a17c86971b732c3276a2c0e11b17f6a2a97308abe0fd1aa886b72b1a2780f05c0989f69d8b8b3d71ed94a8365197580b812e870b9a12b8b6273b0b3af22b90ad142ba732d2266d4b1caab256e0b048172cebdd13bd2d4b0cfe7528b2847ecb696686f810d9b82d7928bb2369a2f1a4f92f13ecd22a78f7ef0716d1b32503d32607df515b4d0320df2f07804580ac8544ee0a304305c55824d879b07f17c78890b00139a706575f922ad738ca99406743357b6a02fa716645f966eb6a3c574f95114fe330d2695c587e752300207287f189aabc5941c6403b12d56e8cd0c6f73e0e0d6f295966bcb8595dcb896e16daa8d1d3eee3da7014941b3146802cf2425c278c01b884a98e9b8535a7451df41bc4e79ca69be91c866c2632ca41aec791888257327ae082328c62f28d35bc4364d05e219fc862498b8cbb57ec9e30e0a38d12acf2d18b90d6b2cb3610b26a3f5535b9e497b87c7a4e47ea6279229d647312040799e95fc176e7409255d3b373ec24e67126a43cc4d73887f8fff6481b9f7d4cad96b21d2de773451704294d8f1e8b53f8d38654554a46faf1e975b8bd7808f7c1476cfc3505bb3b1d15ff6f060e959adfdc537201e0cb4b81bc851c87b9b2bf2455cc3218d3a0cc1be3269eef01d27d1440ad0254098210a6093f7e1d1029976410530902648e93ee6370d3a62b2bb09a4c9be383b746e04a849752f306ac8315a5e32e8286bea0e486dfdbc6c584392e29d72f085e6cf9a86139eb312e2b92e12123dc6447fab35af71e8f91e8c8c877fcdbfa02bef4c2016ff38d99c56995680c754823083da63f041c3cdd3a51331c9a97528eca29a96ceaf45510f8319af33f89425278935eaf3acd87611f9a831dd343fe8f43b4fc4c196f037784ca5586a13d6b9ef438ce86bc404ef55f5de3de194ae97aef54175e66995f8631843a1e4c77dc85623011a6b2244d8d83a2f14a451b283ffc11595b114f73c392fd8856502c4abe9ec0268865f0eaf6b8cb06330786ef8ea0c162b7bf67eef6a574e981344105542e7928e719504c12200790671efc0ceb9043f4d605b89cdfaa9971f4fe7a6248c63f89ea41d5b765b8811f48b96652a33b36663d97b2e091ae8e6699a2d46451eca1e5c891134672395e857fa3b65eca21a256ba468f29d2b8e549a4624a25d26f79362016e2cff01bb2f81e12c0bb3f2d9e5d69104acf6b1dde806c40a56850549837e8876423a22a2d0bb8073a87c7dd7bff2e00ad08d52977da42586b0a05f6d9c337312d5cc66905e2e47ba782fae388e7f2935b0ce890ebc4036845839155b196a3e69ad3fb9f06f3a8d1f6a1635da5b25a2169f0f9549ada4430590a3ed9577fb0fef34d2f07c8d19deea8950b0933b25dcd408d81aab8bf01fbb1bec9442705054145840183f59cf7bfb34ec0e15f0d0b4485f78ea9ab6f331c92621cdf0bccc3b552af5fe44df324a46e24537e3e58eba17fffa13a79dc5c50496dca020bc0c4f74b6f23a6fd601038ba7bf10599427bba10e60b4d1ea55f377476da9a1bbd62049c9e67eab2508fa744d8c6de866c3dd245e1f04aae98387587395c7f7bd833ba41c347530689c28771a89103fb8abd6813b9e3c822d1aef70e397ce54a9b7b8788d34d43e82e5172ddae87ad945ba4e596a6deb2ad3769d60354c0bb87c7411a3d7e8890ba5e845078280918224b1950a7929c436908795d9748106d0a4fbad543491971f07a76ff5afd0280a16b3eb89f342ede065a71d72cb5d94020754f065d5d631c372c1b474b3d57bf9b2ea76bceb3e81088534aa09ba1e8c7595f6cc155096dd28c7b0eb44edae38a106bd50560f395719c1003a5066d321c7ab5522e2a9ea220c4116b065f89ddb43f3cc93459c340cb1acdc2c9f9d56521211c39dcb8409908129ef8029f141734dc1a1b1f7928db6e793ab1d7c148003bc23c969479c1acefe14315d6af451b031286d7a87ed7e913817a53c5bbe7a8e27c9b837084616ca5ea9441a415d3f8f90fe747ec6d4508818f5c9e74738e3b399694821f2ebec1b19cec2d6f138154345a0560ac98420ff3b89724e0a924199a18ef9ff9f2dd5f462fc3114f139a020ae7f3450c03273646bd48842546e12ec946cead388915db31b13b306f2a84b3643af45799f49f68b2ae8f2e30d4f7324edf3f5b747c803ceeed0158e029b286e081dd26bdffc398581ba819a1e135fcde141ec482cc0b8084af5f84b2e2e968490caf9007dcd5f0bce1cf5d75785a505c6a78c87140cbbdaea6d5964e0152b9287c84b0a40980ea62485169852e4d623d613775a325960ed78a068f3ac4fe6d4519612113cba13733bd2c112e9a7abaf11641f0ca7cd73505cbede87664adcb8941341aaefcbfcbd92c04bbc48a5590cffbc3c1ad89814b1288e24293073a4ecd9952baf84c242da82ee0a5bd291ab6a02b33252b6a151d1a861e75c768578e8ea04af5942148cf52b1c41058cfc8c36a0f7c352fb6dd7b003aca6de4349df1b7c4e3388ceca7054e75001dda1670c6df98053ca122bd4a2e3e90fb2f3f22e52d2517ff413205c2002f44534d82e8a7a1e836b01ef8528b23ec3db307cb1dcab66013d1624809bcdbd1c961c730ef6a7f9306c9735adc94ffefb6c322960607804ff10beac4c1ecceedcfd18a03af372cc3f6cb34980e935d25137cd07c616603be0f4b2a07ef4eeef1e5eaed3f51ae8d09a84d1deeef6af7e3699ec109279870a2a996e9e5c270b383649669577d634f5731735826a6da888f2771a338da994fa19db03482cf63c7f4d858986c89d73a61f16483ac471bd5943914db782574664ca56a1318368f43aa2f053c153277374b889b50106cea887746cd5e9e02aac46deafe20f4764d7857ad46394a242e5645c8bd5ec773218b2873583d20fc5b4774ba28184cfe694e1fee6e4ee3ae3a9b9af1b61e2777f68a38c1f72f6266d892240891b4183a407fb87b9feceb35d5cb0293349227adaed99a40f15a038ff3778692c02baab4d27266e2c7d5ba014664887a5fe2feb2f116f50122669a6a75ae4b8cd15cc58c7b8145fc2bda1de8322aecfd147918167abc5be6559478c018373c21ccd187521a5f440c26554f05816b3739aedb41485ca35185268c62f87cca39812baf86aae5c21d6985dc8c2473ab5e4db1f96a153ef05f4525804ac8c7ccd8692d10ecd6af44af3ceff9f22a28f684c718134e588ed8139ca63eaa1676103d7594fa5d1ef0534ec9adc38879049cbe26e66d552fbe35b1bc6b26a176bf3b834986d120b823e99f9acad1561b02250f2965633d6b142783f664d1c380c029a94db6efc0b3ea82b8dbd8a4d393072bbeeada6b172560feee9d87a146f9a6058406b30e16ae1d34c3e5203ed9537a11b70a61c63c3699e246e6dfec7f871088e4e896818cda1aedac26163aa7a9269aff9b8606f807544230a1a7cfd465904ac3a727ef7939123596ae683807db4c88713506ddf80c729205209b1be0f0605ad131256eb677d6effe4902c6ccbcffdb6d4a1be14a816b271509e3bb414d7dcb58a744909edcade6d0ee86a8a755ea69da0473325b2f345ebb53a0424899cd7222a660a3b3cdc76da02986e9764d9ee7781b7eb292d374c938e103e623374f45d860f55701b37e769dedc632108cbded1a188fce19f3e7124159c8e8194c311cd6752c6b60bea4327ed18c309085ebdf4610adbcfafa4e26b525cf32d4fe03f1aaa72969550e097b4c8e01db0c1f8cc34b276bec17860dbd883f8e211cd5dd0b7bd9f43b210a03c934a500edd4029215229896fcca6882ff41ef68bba25e8694c0bc06b5deb0a092a0b283b20bbcee99c2fa676532e92325f30d3889a57bd43a008a8d9deb567a0793b7d0e54a8806d1fbc2f470135ac9342496b140ee76cc343c156717c80d9a96e33c0440977054253678907ffc47128f0f0fc4b02c202d55b0543061518eb029239dda72cd5a4c553ff78df827a0569fc41a055e5db4f0e99daf4906ad32664f01ad9cd287e93460e97d20478024b7c2dc04dd5aa1bab89b8fe23b15ed82dc0b13b3b5f69646d0312d803681a2e599639667168e271239b59b7c969f7c000a36d14950b2610b9823e2c4d0618430d2391de33a34a934b8c36ccd273a397a9ba33b2028391ef17155fac62765a106c8ca4466c21fdc08b4830e3ad701cb09043d8c8653876073976c44f90905c17d03158d47f35ae81a337f27e670a17ad8ad148731d346490f05ce8a0c9db1347be4d3d4e0cad632cf3c5efbfbcf2cac3a1649741129c65a6a18be716d2d711057b66b449ea80d36da878bcf492abb6bc8f8a18b29fa90bd234de11baa044c48c2fb2cfd950ef0ebf632d004484c988c2aae95f42edbd6fca9454868ebbf88fb3232b0760e3f74366a94bfad844ce93d01e3688570c0d36073a5b102a4c5b62ee4c0b1c41f5072ff692d16297d03f4a7982e0b99ca08d16e29fd0041afdecd6a110eeb6e1df2815f83107f3b88ba95e0e7d59f704a38f05050e8cbab2c32911161f97698bd3bcdf88c51c5f43222897c611d95a4568ec9a4d041b00e4d97715aa87f64d248e2e7f6b44a228287b4beaf8714398e802f7c6264208e97bffd92843a5440b7a676432bb1248f1fda1cdfbb098abcd1b3bf6d5c02738d829f230889c9fccaa7cbf7a497e5ba6eadb72ebef2bd9cf1860a6121b20beeced5d7f51b43321775c523180c99614270c49dac48e9712360a808aac6d19c3797b506979c473464326e4ac9cf53c5a5a6d80652c61e82924ac9ace02db6b2c990115af357cd739752d83139b4aa01e1d4a041b73f4568273e9025fa12ab87f4be1fb2851e31813c2cb7804509e4f60868c5bab629457a51a3fcecf6b08c21306b13f0cfaa11e04d82c13a5a79772db16d86aafe16568024f3a6316b0a25d94d63d89cf08cfd3b7e6273dc69e1f56a52f762b1b929e9c8c895216dbcbc718de22fe4e2318b6e5d51c8779d9245cedc28bf1e7d3bd299b06cf916d054167a76973a6c8121d58ed5054a27ba87e2f5a85126302596195aee584881d3121e4ce707e3fd6b30d68dbf776f949631d9178ac393910ee48edd5b64b67f8cabfee0d80123782965fc013dbad71200596b36c95b42483f6c74c1387f6c8e0b5d2a8bbfae5f0e2686123c4270c78852cdcf11c2f24c6ba44c0c7ee2fa17525d4b4caace17531b98a1d5051cc77115128d041b9cf5802c22ad88abf0d9c37279431e955c2dd3de8d079164100fd43d30cff0e61cef50c2bbb004dca57dca001c430cf8ecfb6d6bb893c859454d44808f665845d7f96f28edf12915168d807a43913b177928f6f83dea71307a1455be59c059da1462b1aa1a100b9f33c6ed9196895142be130af6cd9bcaa3707612ea7a83f3e90c7f2a61c222d36935dc4588047932a308cb0613bdfdc1b5104dcda3c765b022b083f0ae4835bd1af2fb389027d567a29cdd90f708f6c9a752af695024771addd52013410560e71d59b4abc1c7f687dec5d55b4ea00915a5191cff1f98814175f997b9c81dd80469c847fb3dae8102a464c8a47a3a7bb54ab501e63764736eba0026a436d90bff10e735b119b464d526fd793c0084a10a2564a468dd18eeb7263408ee3c3938ad16585c0149f8f30f1f9e0b34bdb7c5d5c736c5c113b2bc3677b329c918c40730cfc84fa9b4092fb91911c926eb564ffff602d92c1d28741f4eb4b678cd5295e420c12ed8ff24a213397cea93886548531e7af2cb1c82531c411bf6074f9b3a8e46f1852fbf07ec4f16bd96fc1d4bd31867ac61f98f64c186aa0dd6bf0d2fbb9fa206165ab802905f6b46f60a52b8bf9a6d606e1b6ca4afb6d8fdae3d54dd6905deb43075e60ec128214089a6afff90d7d266331bd5128e51bb33497c4482877e96cc893c880521e511a11c38f0b988488c97316b82f9522e387022c0d0186954b86c897a080806c331f825286e760b50dd5234bed3a59be9124cf3245e354e5b330c018872eaa986e1e74dc0fa03ec7169c8b648d4ff134dacc7ded08c219809e2830922c1cb3994f08a9ddd99656561ee7ca6a4f929175d4b2d33e31026cc5cfe760710a1d39ec6c21a7b5ec25789d765acd4acc912688d6292a451aabb32719508e294d38c8999b7023d9bd17cc651395261c49d716c4e7eda87dc294a930d930834a0e148e799e9b9a0832030157b434decbb93c9b654e44c7231a1d31a4f9ea7505fae4dd0140e00ab389980ddad63ac0d0ad5b399aa00de446d38f1a68aadcb0ac780ac1079c249a5f1a110e5ba097653569155b51d5e4074b788e75fbb985f897861e22d51f2c8dac14bca38bae25836bec1e2b74d43d64c2c71968dff3f173c528cbbf43ae691bdb6cec8976369161fdbfb155038b33d018cbbb50ccddd48964cd38dda02ce73ff7faac9d04a565d2623faa3da43da90efe0aa49b273857b82c9c28d98de45a4056768b53cdd7d6206987c1ab2d8242bb132147d004d18a5acbf727bdf74224ca28c5d9c55046fa1ab180e829fe1e39f6e606538ce00a7f3d7fb664d810ab071d35dc679a36aae3c14f5c8aad0cd92403de892e30e884a74d6197eeef58e002f88da2eaf1aec2e305ac31d867fb1a58a29921fb5ed543313243e0d13bb61ea083551a8445b26251375979d4dfa7c27e196d18ab6615f36672a7da7514180f2c75a4f2148541402ae7e904d3325bc5dd3b41ff866cf95a5009759d24defbd9f1a401b4d538aec3fb54840dc5446004f49aafd0379c76cbaffbf7c53c3af474af07231dd515b288d40baad6e2150112e9b6511ab557301e0962b16f3e1e7cddf7dbcc4d15b732c58813b1bc501d7564e6532f57cbcc36c88b8f82caee9684899822d3e406e8c5541544a9610c25e79a7f94b8185f5eb9770ba7ab57f9f1bf270d33b517503f88966f0ad2cfe249458564382009058d3ff73b38daf8e6d3ae5d1a251cde53643a96903b65a83dacda7d82ebcac221da482a8f470bd74b5b4a26723d33182958bef42859ac342b8fab0b697ab8511b5a5c411b5974d64e768e1587adef59a73a937a1d3434d699add8770b2aff1b03d6505a2ad850882706b0e2fadffd1dfbcd5c36116b6461cd00cf0dfaaa97c4c79885dcff960fb0626f528048a5f1bd23fb1bff25f1a1c4cb37f1299ed8a3d850cca57fea84e8de504711f551511eaee45bee3bcc7eb71e0a1c9193693a4617388f50ddac106ec9ca9caed71d200a83b02c11b673c81d1f567d2e41a8c7823177aab3bec86dedd7ebda4a89c6455a25627e6800d2e34930f87dc1a0cc8de9071626c0ee83c3138409c010c08f0a6a0ea87b7fdb348cc60b64ce4cfea57fee07d16f0479f44cf8fc0eb7f5e2889fa99887eac5f975144fdb3be82ac50e8dc52dd3acbd989b3c1a9ef74241b1bb0455aea85655dc6335f8a83c4d2255a5856b7b0bfef37bdfbe3a5675ef5ccf6e1277016ae4def51343468c2967c6c95b9c21af668068f4127b53d7bae34db806809b5c2bd03d0b158da8069cae3cd8cedbe4c00b571732849ef372146e82768bf3c5e7cd1a5d7d7b241c786b4d9ede613a1f4f800b7acf8c4f3d7e7334fe1ef0ef90360390811143891f91de1f6f7d77b8822062e3c2f10097ae8709782e3f0aff3e0171de43732eff6bd158e7d4b1f1e8799df358b84451019b66cc2e8ae271fc26b383c99358ae3f99075a0220d126eaad31e75263e9f4fe10c898544db94de0c7bb1dc1671138e851ef2ce116c4eef93bb217cd922eba6f4ee0b4538ba54699e3ac3d4831ca91a61f7f69945213e96fe5a8dda63f5afe317c32244e8afa474dd056d7d47f2d46f762eff50605abd3fb2966349e897a61087bf5cef9ba33072f542a1848ca49c6f4f0271cec3aa2e1d844c6f50a8665648cae5f710420f63b0e4843ec4fe32c6b887ff83b01a76e5220d4118f884dbbc3a0e1c9b6b20a44b8318bd07d859d2fb21c05a721c485dae4b9727bd465bd8528e2299d05b5f9624683a272cfa1d26e7dcc05dd395cfa92ee96e1627d538ad3028762c740194d5593f48e184366ed1407edfb78907bf42e9b72b4ed67321ab83345edde00dc797dc0a887a40b9d7e6c04e796fb1f9f7725c2c95ab88fc7ed353df82cc26d7668bacb5ffa2c056cac7897f99e9010cc300999d184b4fe8624d5cb0e280bbe1cea31a0b26c67366f578945f8b9de8f615d74f822c598971f5a4da798414c352500045012ddce4e1584e1d94d092af69041c4eb49b8dcfb5d26e4ab340c89ea1026f54c1ca6e23c7415f69db89145c690f764a42b25d5cc714173cee86846c1e9355793446cc9e25c2a61dec6da39242435ac2ecc6e52fc5c31c891d878575e4224d95a285c08234402a7156a4c12503104cc183e660aae38c59e20ce22f9ea2b79709cc32263b34c6e6dfc8c278a5645dcca9782d4441d078118c376ee310b6eba3dc8ce872a17c6d98267aab5ae29c2809a9b484f8c8452ebe55a038ec1a29c31deb96e56b1789f4088d37cd7c84ee30f383ea19e1ca94fef1b3ad7e6f8f42fbf57870436b8f721a259165d06c76281907f51a08c6b968021cc4596226854ae0f162ec61a6bf9658bab34c553ceb544169343c2cda0c9b502e523110898d59232a28f0f90ac81a098199b6a2f7cfae5cf7728d6713a76918bd33d5907f1f3070afa7c7e53d23bd75125487cd71a01760b36b293d139cf8b4915c3ab8b2ad4c43b2a802a53001256fd7476dbd65c6dc629d437619852553ea3f0a884e88bfe9db4028af1299535150b3205288b4723ad1730293e3a4bf5fbf09de32209bb94aea1e19321009810d1d0f64748b4a18ed298e50b92b23728507558483440d2885af9f2f8e809f26596a477c90cb750095f12c0915af1df29aa46cb880041168c3e5b57ba348b8ebba411e14dcf4f5fe163b9921a3cd03ad24c6bbf50d3580a66f811ac89c453d139b5ec933d1605853d2094930d4891579caf79339ad0476ab9490de2b5885ba05bc4738a971d0eb9a9a0b60b17bf2efffa65e728c6cd18184638521f42bab6752f33608bb196800108d87f2634eb308738049f047a1dab01dbbbe6528af7da4d4519c8d038852047159141ee39c9fb336eb80719cd0845c4c8388323e16c2eb3549f5f31debe0dbf1c37b197b1c108094b3092283a3141aa3de914e7e4777fa24446bf08e6120130d33f4c961a612a585a894b3dd649587996ef1be70325ff061b0ad195e9b366b6dce5a90d6ad504060358b269b0292b8c33a4da65af9f468ee01998ea4542fa29441469093db72249cc59314077de6902dddaaf9580e83c6b89c1f231526a20c45682bafc24dc2b4cafabf6c39d9dcc93f042d03ef307398d06924826b24870e043420d9c40c122f7ba7b75af5d5e512473d889664f241a48119e26ec6bac9914bc56bd38fc650726e04c5111da122c3db54be965988e4c100ab11c6c120349db4870352623ec341c448056d4b9acae1568e78350b47fb5d2a9095995f1173b4248200979b7459b02d84f7c46f0a28331dece0c933138d813e51e1c296fb83143d1cbce9e882b495d04cc84aec4dd80e1892ee5beb5e394a24d58cc182b7c618a7201c1ee88e4a74aa89c426be06f8700f650b32099ba444ff0e7111100e166699627e4b89edb8b2b860b397d59c8389a31fef2b4fe4a6f3876039e6ebaa0f7be923f52e1f6b28cd5092fcf681f5e2e3e6f5c247b2a8181907f18aadb62883a137cdc2c92a26813308869a7e058c472b1f37d0a7db811a9d9702f804877a5bcfda6966460f423486683f3290f0f7fc56a113cc11cfcb1f114d09f349131cc7867159ac69217333dd8f682bd6149602b1fea51570ed72c6b6fc22ef7e4bdaf4d2268a21c465186ddbd428e9120f29f5d82be3906948692ccf196558681d648a1412781deea871e776cd61ddf505af5dabcc5d4608c1cd3d38adb723fbc198b8cc197e2f1f16f5efc6e4e0fdae6e4d675d4f8b8a8c80a21038230e324f1934db31512f04cbbe3cfd348b716515d7d8810571666a00f3a7e3ad44de69401b9501f53bb2fd6405071d2242bc8080063163c9c33e2457f7c7ea4194d3a7ba0a86ca101c5e3aca405da48e64e7dfabe7defa89dfc56b71ccba3ee8b145092d7a2821fa2a6cec31c26b4170f14fc1ad6e7bbaf4e024cca988e62c2b8fd4807697b653a2a14d82fb83e51ab44ed50f814d80fb9e92c70fcd6f84fd1463ad1e415b813d27c2b7cea6d92a2070429f1fccb1714e60ce33535e4d2147f01601587c5cbe6723b14caff056b2c2a136d00d6b402431bacf30bd7ddcaa3d7f2dcc53c341296985a1383a1fd54752fbfee4afb1ab511ad00f18b46fabd05e7085152e359fadddf563e577951ae71e7376d471fa4551b4da7a414ab5a97ee548f8a9017718cd2469f6b0ecc190530a778fb700377957dee1fac42a5c85a7f18fdb7142de099a35472a40a047810930540bdb9869daf2c4f3e4b45c591c7ed0f3c3fa1cc156445c57bcf816e09ed864544e9edb014c1848c23c32382b5bb3200899f53cd62027a6c3c33d037a3bb85a42a917251856f16d27a4d0ad0a03bd0ac981799756d0e3887fc9e4d6c39a82913c08a026bc120022e8a314df0e2850c074207335dc211a503e586e3e05615b451d8d9414bb88d223df1a1d7beffabcc7ebcd01141496cb6d0ab2c2816c5b110c3d4f70a30d7890550cecd9da5d349646132fc0559a1a335d4b33ac15018c356de79072973f5d0055e8b2e05e1f2c576a31a8d8cf0efe288ee59b99b6a8f4c7e5603034bc26350582c842174cc211a3adf896b414135c073b1ea019ad10dc087bc0905ae85e10b40549c2cd50bf3487b507fbcd06652bd8d2c3bfc38c18e10c6bb2729652e80c3cb176d1feb466df525585a6cf87e62f67245583b44aaa84ef1c1e9c5923fc05807f6d50fa5b42bc17e081bb5561122fe545d77063ccdfb296948fb437a08f1047465a5b35c509b808ba449c9fc05d36f55add2110d71f9f85e93ab7bd1b64b16a7e87ef567b9a34806c96a055b2caae3ac0f5ef60b3543cb128b8c99639860b86460705ace9ca4fcb7e794dc101147e29f438fb05040e1ee73309a3404ef1c866c3a42286b429db28100682e36e0fba46572b305992a20dfaeec350eafd98da68f6ad0fed891ac9ea904005906ca386c578ac1e14cef7e005981522198ccf808b978607360a8d55b7930bd80b4755a74ed251b59f71182d32aee5a20910fbcd08851afc63e35a88c80785fd739fcc3c239c30609ec827c2cfece8a96d84e45f0ccb43ca9396db76c6469c21c0389c1723ab2979982fd9cf0feac19fbcfe453f3fea7c17f3ae0e060315a4b5fa82ed93779147f8b020a883d286f8dca83e60e0a21b6c48ac665840febf42ea51eb08e41f4e274d2d145c3435159280f762600c6a9677fac47a02283e45630040fc143733b6a64153dd762b54c88b47d6818120d1bff3a0a3dd1f37758f273c6d81f504a4e3cfa7390fe7988cf81b2a9170faa5b8f18710a432408389a5aaa8b44e20e613f2552ca6b4a6683490765e498460e6dc673a90a7386948c8be5f213f5437f15a4d3e5c294279a57add3c48148290def8490a0dd8f97b748f408b49eb2e085f572c03d181d2dcabcdba6772500916d4bf854719bed7c3da1a840008003a241b758f219ff76bc5514e0deca70441fdaa885737b5f3dcb24a2ca95bbc9b578c6297744216746977195e3306fd6235c64a419481aac91fd7d501a873f3095b76d8c5a7017a04a37b3550b024e9f3ffffffffffffffffff47e15b56d96f83cada2f7792241aa37d0b8b0a524a29a59412c31684803cce35d256c8c3bb8e089e078c07890709326336fdaf438972b69a4c5ae49e0e15ee143c26516e93eb8f137a4e8a5b1225d57c2353de4f64be638c2047b2e3034ef08844495b88c7b7dda5ae7523b161a71ef08044419986b633ddb9e4ffccc0e3112517f90fdbd76e6f18c98e1a337470c3e020b93123871888e6885b5cde4d532ffbbac4d693939abf6f3c1a51561125645c67e7850c6d470e12dc800723b4aeb38b4dcd130d22942427a16af2a8da6311c57c9f9d99e4f45044f1c4b7cf6665db4109135130e9b42e444b88289b9f9c326a8e3944595f4b6c3fc619f99b87218a257a2749d5991e8528df6b4c82690ff22044e92f7333ae5d3bff6ec3b0e028e13188e2268f6bf7d97ab5291a6c3a66182f3c04511e997d5d63796d6a1c38c6084449b48afa2464bcd8ba3372243810c3c65d8243072a80c006d8e00188524813cdd9c4a43149e27f286652faf42b33f99fac871fcaa3a967dfc4d0a6f6f3e84331a387ede8d314f5123e94477f8ea1bea26adea006bd9bf0d843c9da53db7aa710d1be1e8aa74d67d92c4276d00d6a302399c4c68c0cc135c2230fe5ecb99452c275748b060fe530e184763001e313bd3b14457b2a9943c90ea5b5d2e0392669aa4b9206db0c306ed4a80102234712865d1dca9a94d9c8991c5f34a543c1a48e25262549dfa0421a6c9b3ce65012af477fc442fc6395434147a3aa6997121b336c9864878e1935b031c65103e3460dbfe4c5b891712885ea98a4e1397028955242beabe720aa9b379447997acd4c5a3714466acc5b99243fc79c471b4a92a0e56f6b8270f3cb830de5fceb3c237b33428f56f05843613b7cb787d9b841c98d6183c48c6183e2a186a2696e49edef79a4a178e2246bcfa6ad316934d816058e869292df234c3c1327a9920e8f33143e368c5dc7353ccc50ea8cafd161ad3b951e77e05186a277fdc7ace8128392d4030f3214c6d574329563f2d25a12bc60060c3cc650f8d495399c4a0ffbd6430c05ad53b3124d06a162943cf00843316a9754923c4160b080c717cae19327af2a9bdf0a794193321ad3b89c32647874a19cceab37bd2d73b7c38592bcaec992ad2d94e4b64fdec42cd66e69a1589a846bf2af0c1d9e2c94e6c2b7543d59ebc73db0508c9a61f49a92951ff7b8424966107d92581d2b14d3d99aeeb7af4e237a54a1d899af32ddf31e54289ece26a612aace0f784ca114a234e4b5979c44939142f1dca4863a119f2dd3289424d9acf17d835028c724be8ad5c8f0d4d7134a4a66934f8ccc5251cdc30945937df32b161e359b24376a9c6d42c12c36f48d07934f763c98508acdf8b5bf138f251477631cf17184095a251e4a288b868e26a63081e1918456c7cdb65c67ddaeaa3de96c828e09dff9ae1c0918608861e33c9090bdad5eccac7dfbdee8f4eaea0da1043d8e501a53b725e892b5e3598e1d3ac6f03042926cd958eb5852b75704b5738f2e75e3a262313c8890f252dbc0630868a7eab686ccb7e8f5364f0b99c4e8790f2194d368683f2f411e4128c65e13e31fd46db29207100a264e640951e2efc9ffa254baa94f29e5f9a224c88f9bfb35fe9ab01ad08b92078f252f4a22324d373fdd805d946545281b616e757a6e802e9acfdc8d8d97b5f77c393f2ddbcefc373f8aa001b9287f9693acea64cd7dc245c1747b3acd27b728e8a0bbd4eac6f8e1c4162525faa235ec93babf16e5ba5056923c19cd8468511253f847116237899f5994c39b30e1419fd2392e8b729e9cc345c61033ea5814df94ecf9456cbed7b02829efded3127e45d1abfffc3727a1c4a82b0aaae34c781953035a51d2a004d127de6efa2f35801586fd9af67a2eada2b026e24ff7d4c8315145491293d6eb6f4c733e152539d7a3ca859566102aca213ac8ce289be4fd14c530f2f65d1d5394ee94fd8b124f4a514eb25e9396b558c6135214f5c4dcc97773d0cc26a32826e1ffe7f33496af8928caa622d3feeb9e92e492509484cbc6780f8a720a8d6625fb53f5ff44498a13c4c491393b833c51ea70254699cdfa7e27ca273f4288ecd21571a27025dddec56993d7d94441c8ea24972e4967d568a2649a5da3b6e9cbc433513c3bcf9bf194f427268a9f49c47fee1c4cd7972896f8e1da33dc4ccc96287d69b4cb3c6eb556a270e922f39f4f89926a9e9855f99328496221dce3d8660d5f1205f59d1fb4fa9b6df79128cac63d25c674ff690f8992583af595a78aaef58f287fdeeaf850fa7fab7744f1ed4c67d950df736a44f9ef63878769df51c2886258134b45958e4983165192a774f439318a285a083141d497b6a6135138b9ce5478f6294988287ce7745a3fe5bb7f88a29b2c729228a5cd3444c15635087da16c645c88f2ecfe69874e9e494b88e29aea34269e50b11944b9faa4e9646903045130ad8eb9ec5426cb0604c21c47768c1d44401445b46a45c96126bd3f14659492ca6d6333637e2867eb51aea6a64f69a80fc5ac9f34df667c289c5cf29d923d678bf650d630294b57c96659480f25e16272d096bd934d79d83aba67f0a4040fe57993bd46fc3b943dc7c75cdd4e6a47762849fe32abc9c43acda943d94c9031a8d734e51d3a14646d5a061572cd63e6506c35139360b2e9f45d0e7d9615d91ff58943c9f3dd97b02af6561f3894fed7e4f8382a23c3e70dc5bdbe9263f21765b2e386c288128349cb9b35b1d386727faacfd9222709da6143d163c5786776d650d820543f09631b6a5243c963a84feae301c5d8274f63ff7b0e3ec3a2f831a6df983d4a5bcbaf286752ed1f4f8adeabec8a92d4d1deea9e67a3645b51ca93414ef23c2b8a2745cb5ae8f25acf2acafea7be2a4df62aa9a2145ad673522a62e55494343c85ca52621e6554145409d2cb774748554f514c62ba18e5dd9572ad298a9d459aa8763b529394a25ca1849414c5f42749654aba47513a490eeac48a1dddb28aa2203d97eafc9a1d4dd45014bce73787eeffab4e4151ca0ea24bc917ef9cff4449a892d9224599afee89624993a3b99e3a5114dd63fee2a7f35a4e944528a1da26c8d6526ea25c194b29fb182337999a40767c9ef09acc44c1c424defdbb6b662d31515093f29b7e7bafe41265f112319f339628b8bf6909bb57a258a5abae846977d12951cea2ab4e6d492f3ac749143c83ac2bbd126a334aa294fa9fd91d4a5776188992fcc936d77f48144ec69c3256c8b0ed3ca2981d5b25ad4893543d471494984ebc26f51a51f6d7f4fdad49ed99c788b28c7a74f7d7f11e6f110531d91c36bf274f27459493c9e1257627a2b439cfafd498ac6f1b224a629fdce4f7df6dd90e51fcf09b57add33f313344393e79966caa41a9668528677f87d5a0448882e9f212547827b90fa2b8a2e413b1db9bbd4410c57893e4a4ea04a97307a2a0e49c04d75052c7c4f50188d2496f63657566f3d6c71fcaa2f2234583b823d5a0a1c375e01063467df8a12489f327b39c383145bd616c9820793148d0f8d187e29af8def25311a7278de34371bbe489e2d71b6f9a8f3d2417aeddb5258710ea1ef4a18772fea4475baa7ba7cadc2041810c19374872e4a1183baeccbd6bcc7c3ff050d8a47fbd3c7b6885bbb801138800021d400104d424f171074c34ee4b2e6cd63c3c3d49a3aceb4bfed2fcb04339f507216b27e44afa7cd4a114eae126a928b9a69be1830e4599d15837df7fe2836e74e0860c193a1294630c31747ccca11c4b36c838a34a12711ccaa1a04564b6c344cfb8350d361c33d26e7cc4a1203c97ad5e7929df60f201879224a7cce79cf119e9d8a1c3d8301a7cbca1207b4bf6a472fd254a38f07cb8a16032474d76d33ed332517203ff684341cbcb47ddbdea103234d8708481f073948085f0c1867287d8f2cee0a24db434d86c901c4a58a0868f3594d7376990262875a8a1285f9e94f60a258d8f349463dc35937e3526798e64478d1965627ca0a118f4096b6e265b9d60698d8f33143cd55b36e9ec59fd84393ecc507e93dd3c4bb4ef2bbc6172cc50dbf151867c634e4afbe5448c1d8e6ad848010964c848b3c4c639356e7c90a19cb4ecc931cce7071f632889e9393e457362285ce71699ac65bdbdfb0843a994fd7807a941be082de1030ca97bcb9abeca9e768e0afd3e42796b38ed1b3ebe503055be6fa5ae17caa31bb3bf34cc33d72ea85b1d9a976b2a339ee1d9bf262217f2b2452e14c4e68a79f2a4e7c47b081f5b28a7b19cddf0f3b6cce0d042d19438f310f2d49e9cfbc8424963d220ea39a5a712f38185e2be26316d5b0951de5ea1204a0e62a6448fa527b742f1e3c6c713834cb70caa42b1f395b9c8395921845458cbdaedb3763ee6dc33641053e2cc53288a785efb3dd13dad4fe1430a65d30c9b04b7758d7df21185a2094dfb7cd254f628d1c207140aa67774cc1c749cf03934d892496c188e8f2794bddd8369fbdc1baffa40008ef0e18462fbac4956b2a5d64a6df868427154ca67bfca3ca74f3e9850f6d09b4415d1417fb4747c2ca158e27dda34bdfaa783945092db4e6aaf4e3a4a4e7d24a198cc6390bf259bafa60f2414eb4388fddc9ba9178f60cdcdd8db7c8a7ecd969c3508e9a231f76184921c377f9ad71844bdfd499d18e9c6077c031f45287f165f553d39a7f5244458ebbcde354edb4d6c56cb9449b2c7ce3f2d750805b9f953dc0f21186ee9f5a56939df619a252831c23d548a093f82503875776992d6ef1c93f2fa03082599c413636dcc2f26bfbf2899d0d3252e3ffd4be88b92cadcb1fc73e9d18b628cc99b4dfa308718c98bb2992e93c6a3ef98977651eebcba4c42ce06fda9cac04317859131b6481d3f1705d5f5394b26a5bd6da6c19623d97123c145497673bbce69e477b66f51fe13e3cfc949d2a934e83d6c51924fe447354943f694b52809b393b9c46422647efa78d0a25862e4b8073d42b384b3287a9a51fbf74930c946e3218b72f80c22329eaeb933e90c8f5894e4ccb726316aef15c2a224cec426496f62e0f18a92b6d21aad4bcbfb9f68b0b9e2548d75adb1b157f7b4301974f6390a1ead286eec5c52751a3555db8315255b2d35b11d7c6309cb902143860c1945048f5514deb7f4b58386cf7c55519236bc97c63ed3a4e74868e0c06c0f1ea9d0c45c767fd26e29a1e21319262a4eb5e991ed14e55a931f7f737868ada628de9a3831785c0bcf4acfa314a99795edc855abb5958bea524a2eb7b649514eca2f4f14f5f7fd7514c513e369121f6563f4125114f7d724d7edb825761e0aabf6ed62ed2dd5c3957bd42ecdf9ebf6004549449f6e35adee95a94f14f4b68fc87bd913a53ec164c7f89b96f67974a298e3499e24a94cdd34f5e0843396a2b3b5d69db57b9ec37c10a6b2e4cde3193c3651147bd1eaac9ef5f1d34441999b38c946092e5f65a2f02a4a9d89a63df58a305150e24d9924caf2b4dd4b1457d6fc474f65818725ca49d2f944375147e80755a2141f06d9b5885d28e8f0b1c4f6b5225c604b950eea6e4447886ca1a0efc4524d89aa4965f809112d943a89126763b532c82046b2501ea545097af47cf0f8d10816f244ae503a31ae535547b906cd0a451b916fd949fe9cddaa4241281373f6a75cecc9a911a1423163d041f8e59b0c8d8dc814ca9dead5836f4c2a661f8e01810d1c46a450924a1c5daa63c86eef2f128592149f7b9f49e72250409da8fcbc1b039127144ec8efb43f53268bef358838a11c54376cadb22dfce4fb74d80a224d28c5f96dd257ad8930a12ca345f98a9ecbfc526219224b2855e56d9992f57137a44309e53b39dfbbebeec6e4632409a539cb8d95ed4a031124142dc6c6c4a4439a645ee408c5e49efc36f909a17519327084113142513f29d9ba4f877142a408e5ce36596e4afc44e6d400e3c6181d8810a174ade549098d7d8e12586408099ac924b1e4a858ad368808a1dca2e4df0ed2ebeb04458250d8cd75626536b398520408a54d6a5a6a1ee38c877e51f23897496f98cd49dcf8e2d24177923fab78da8bd2cb7878503df2a220c642f9d7a89a279177c175b7cdedaec7beca96c8b8f76f62367a66d34549923e66b11f5bcab55c14f38abebf7faa04105c947ed342e994d32d4ad7417d9a3a912d4a6a359af8a9a3a8f65e8b922094e8d12e1d1ef305428b5269d31351a23dc724348b623c1117bfd8e8263db228efe8941ae4db633035482c4abdf9e42c395ac9998345e52aabf57a351b9fc4986d1b5a73405e51d6fb1c5d7d733d2abaa254a6f337ba4168ff415a51b02c19db73c7b2dc130d36dd00082b5651dca0e4c47ac59688f61444152549eac9964174b693af1bd44845d9ad2417934c677a59396a24bb00082acae673823879fd7a3c3e62d80063c62994556bb34cebeecc35fd4d626267f6099ba2209b1bb489af69d3a468b0cda8811900294549c9498c1a17277cd0291a6c3b6ad8c0a103841465fd309a7ba356d505194561bde412b4f4c9a6af041145494cadc9c464110de285a22ce3a153af887f960e08288a1a7af2981c74e9f4f0139c6c6c9549ed7ba2a439dacc44f7d9ce9e4e9443adffe37cc5688f9c288e140d79f2d926cad164c5edc3b7fa9966180d14e428818d4403a600d144394b74ea7e0c8f5a4a32511621437b57734cba339828491f37c6f1de412e513eb99893c496246e9eee2c51769fcfee2d1b25084f258a994796f84dc24600a14439c96b2589141bedf124f6fc693b8ae5c7242092288b0825c42449982a71041289b289932d5b6594608040e211887d401c91d49e84ce9f411ac18852a6d2feaf729b4fa617518c19f724fe3c9cc6cd8128e24012b1b8e5c98ac97ee8cd76d75757e7078288d2499fda35a90bef1025e939ea6f860f5a259d23d9512319c410a89724b65d49d55d218ad5e96daa3f67dca5ea031042e096162f1a27977ad5a1d677377e9a990119048820ca7183525267bd4014ff4f8a88ce897e080288d276c969adae735e6e7f2828f121ae240b291a4f40fc501665aed53188ecf534481f8a6f1fa34e6d26dd8d83f0a17cf23753a60b597dd2c63a40f6507e734d9984d1a0ca4e18440f0593336796fdf49e54d401481e8a71f59946f99ca41a8303040fe55099e584fa78ed5b83dca16c96a14b122794d02446090b700c103bb8a943c9dc24ddbc01481dca551ea3c412cf47931e840ec564e235e2312e536b38009943a219c2934c3ae7d861cba114ba64fef02ffbb7a6381494bcf2a125f5084b131c0a7a54bbe8d1fe1b4a26e575c918e5deca7743593eab898e6e6b19426d309c1a99eff13be687d88086c9d778d588b99dfdc93179afdb33039035944eff7cda64c2ae3ea38692dd9f32699f84d6b9d3500a0f93c43e51afc56634144f9a2cb17f65994f3d43b9beb4c89cd46986f296ee97d954198afb692b3d579a24c21c206428e8e85a13f77792727d0cc54e1354cfb8d7206228ec55a5dee7141aff6f1040c25010f7bf9e6745580719228080a13c425e8c67d0f2a0c49c827c81f3d8a449c69bdcad05205e28f9c9606fe9d17736783000e9c2e1ed177e174af41c71a1143a9b3c3ddaf7848fefc8614ca0831743035ba8d6f44cc6f2d2b34c3e4965d2fe27a57d338816cafb5b9fd735a83200c9424998e8a5c94491b14e582889b12439e9870a7285b209d5cf491e9196ba8158a1a0266cfca609bd929f278054a12c42373ce898646c939d020815ca9f493d5509f3b08c755001640a25f9dce542072285922454097db5894259cfa4a5c858073d2728943e4db2ec689e4f9c3ca1e8a193b8716e449fde09a53f39fbc973d813d6a40925d1a4fd4f993c134a2a830e793f5a4241bd6ff436a8896795509225c9a7337a4935de27a1d4497d8e329edb4c1609a51913368329d16f74e80805cbd818d99e4666c70885d91c74c7247fb7668a5038f7faccfe5a26732294539d5a37193f43289fc818fcca1742f1c43cc9ec21f48e1c84725fe61032e4281da3204028a78f0a9522daa399bf2869b5fcee10f3ced017a54ddbd7224bf374ac17c5b21bdf924c8bd8bc28c8fa9cfcb2ccc72e526b73725d14b3aabc539c9bd0bbe7a2b849b0fbded01062745c94a4099e454c8931e7a96f51ea4ca6aab22ef5d7b645f994c92342a45d8bf2ae8612444c6fe5dab42846cb727953a799c69e45b94c6ef68e673207af65510c9b9448fb208312278e4512289b80d504f0ea1ee0c709269747e001266357863900edd031468e0204400767020a00c00e1d63a080000148c030638071c3d840800074e448d0182f460e1c09180100020000000020002258000874d4c061141080220040878e23830002303bcccb284000cc0ef362e4907100000ce0230139921a20b343c78c190b004000187000acb123070d1d361ab123d1c188929e7bfd54a121b4892ea2247bac367df40c225344d9049333c99df5949f86061b6f48224ab5bba3428fd23fbf69b0e900471849181a8288e4066284114612c601420e813576dca0c61b4207380a813576bc18618c316346024208518c4943995d29a124394783fb6c8cb330921c336e50e3677cb2831a6e3b6ed4401d376aecb051638c3323c70942068133662020441038c240612461182024105863870d1a3acc8c1909080144f104a59b4e6ddcd0edff508c9b3e7f5a277e4d1de287c269933ddac836e144a90f4591e639d477e6b7cff0a1147bb229a5491cb287c2fe750e6d1a4f875186e8a16082f69f66f542f250900d253f89c737df6b84811c8287a26ef668f2e5e8b89f3174ccf804032177408b0657dfb6157769b09d85d8a1246c9e929386b2ceab94032175287987f02493700542e85092499e8ca67459878fed0642e650181374295dfa674a189510220754ea86730f9ba49e43e2c0831038dc1b4c8618216eb8361c1b780da7066cbb4ebe523b34ef34b43adcc43e4b9698d4c0a860068e903414fb041d6d46941c652634943a97b42721e40cc5e4496f0e2aea56653243b9c4fffb2d790d29434976948def797acbaa1032ace9b1f3b1aabba76bed31296935cb69af4310328662be86099f21a457c78488a19cd6e1448c9019c4630f4248189693ff7027f5243d18cecf0ad3123337fb70550ddd151e9a902f1466b7d34c0eb28495db0b052573eab4576a7c947048178a1f729bccbba4d3308570a128a7d53655eb65d0d6168aa1327aae124f3cf6d742317d503b256859c98742b250b6133eff29e1cd7b5367582869b6d19a49facca7432157286cb052267b948458a1781dfba4b813bc66ec9d424815caa757712bfe5d1d46278450a1a4abdd2b1feec3ca1732059402cab8188444a1f8d194282e1e4ba89ea070c7b77edbbdb7e95b6b37087942f1bd3ff786adefa0cb4172433f9023d9f181048c1cc908f072243b6ac020c409c5dc9fecc3e8fc1983be09258f694ef0fd60196ac710269c17a333a7ea1ebb6174a5f679fd9574c81236440905fbcadcacd9bd5f67124a6abdc5367dda933e464308123c2f5b2fcfba6ab12a3165c99c0d8ae308031da1a8eea7be1bcc102394c418dadacee4fc26fb2214837658cbe7f4ef688710c164dc08194279b3daa6f9fb13975d88104c4648104c460d428070bf3819be88f4a22074b6cecc379f3b877851922588dc126ebc4f54bb3019ab0bc55c14d3f7c64c26de37944e041726e316262306115b14e47fee32c8275974915a742aaba26ab1b3dd23676aaef44e125a943e7d121a7544b734159945d962744d3ead0e3b7b4416e5d13de136fa936a9323b12879cedbd29f35115894ea4f4af55892899d0423af28955092f4deda7bfab5882b8a31526489a650da49b345a41505cf132684758615c58e514d461d39921d35ce089155943af97d12ab63d6ac9e2a8ada5572aa33a988a9a465c7fc6ab2115494b39f3c5ef2e3be7d34728a92bafa93e5459d74f59ba2185ea465da128d94a2dc6252fe97af59074d8414c590593637897f25498a8ca2e01befc6347bc8be58140539d7b735d1d34eac48288ab1f9611e9e93ecc6dc81a26cb29fe9e768b24667779f2829d1691b44c9bf7325779e286510d9142143acaaa813e5743b27e54ac8067ddf71a22027fe89aed8ef3651d0ed1f3575c9969b4a779a2809f93f4a6913ec4b27351325792eea6390d726785249f08219278860c264b8207289721a2145f67ccc1f4309cf12c59349375789c2ac78b07fffbc19d651a224d29324c83dbd22d3c59b444950bdaa21a6ba233a9e244cc645a2a444cf3cf1437589fad060d351430f1225192f83d4d89cf435748f28ac8d923fb9bbb4ec7b8e289aa66bfdbb11dea7c36b44412849ccf3efb04f1bc7638497de32f6eea5f9156a36c7e9e41b3d34d87a8cc822ca2f1ebf46bca71d19bb8b28a2a43232b79ffcc810494431b5cf6d9a701d340611238828df98778e31a14314edfecb4be486065b0d1d5d22862848dd7a4d6182bf9d28c981e3401029440b22842889d1f1c38ca9b69f3b887250c2996027c7fcfd494114ed3b735ef778b7a51488f2f9c7137f1def3a880051be7e91175d3a62fb8bfca1642faa2dfbb67ea4891f8a9f4de99252cc9318eb4369e3a5c6660bf1a1b0714a6c7151259ee42141640f2549ddebabf45dc93ea2076c4eccec5364bcca4a2fff838527d1e06642240fe5f560ef193e09ddd7f1803250e40ee5d5641d847aea9e5a237628e78fce2fbe89d4a118db4a088da374d77a113a9c32b7a3d6aadebade5ecea124263b9356747837799243c14cce617b7473d7e8c4a1a0640eedb9b5c13466e15038539f416daaf45afd0de57d137ddd4eda9c94541b226e28ac092583dce497614a6d28a9aa559e1cb5725a6743f146ec9bf8a05b43797c83ac7e9383ba5045d45030cba0a26aefd44da740240de5102bf53166b0cd49923b1d113414445e6b06f1ebe8da9ea1ba3bf59de48c7c113314536578fb9cac27a3d91b913294d47cbd2cdefc4c8f6690a198b995e974692f328692a8e739ef89416e438d88a1704ad60f5e240ce52c73f6159b3a2961eb0818ca56d523d6424730225f28c838fb590d197f9fb3112f14938f018790a8c3a65924485110044110c4300c0dfb241da313482010401e8c4523c1903c52977d1300818ae2e07828108c43c170381c464108c4300883300c032108c3300cc3109e54d901531cd68e49b2bbfccf151fb3dbd65197a84067fd4d31e6d913d993917fecb3bcf68d29bc9a06ec28cb6e727cc7a6731abf4d1b44b0432ca71da2f9362a51810d083a3b85db60241cf1bcf734d744b6deb9e4035a9b47dbaacb0eca583cf0d0ff8932daf14fbeb33e4f21a578facd2eb19c52bdc8b667358e972b4c7cf35d6aa03edac1d50f32579f2942a04ed4b986293f82f987cf8a55324c3d8f44f8ec4a41f477f759c661a6e1dbdf20fc750f902f48e58a8292b308ff13dcd74d0157b785c0f310c86f2bea808ad7ee7b2aa6a1cd697202c0f8949fba32b6452b568b08a06cdb4fe375e85b0df4bd53558e7a1434a8b9ce81559a905e74994592c4e9633db3d36e368fad313e8118be18f453f62285b9aa0aebd465284160c0e5fbef14225473ffba0295b10990ef0ad1228b7d3ca96b04fb74cc8fe3a6c21062d75130a7531399e6e1a5711b65fe17729c2e775fce9f66c4d1a6aa4ed86592aba897e309536530a388f062e26bc4c8fce41f0a7bc342e252f64b770d5b6cd0a5f28405d139c30fd688f378d647f67a707029fbc16167421c3d3f40e751a83d4b8f08a7103c4ff3a67c537dd9e296d85733cdcc3c4dee018ad003711b1d9f2c380a495e661f5cf56133ab59fea9760def8875fd7f62aa8afa68c8c1525bf0827ac187ef114f7a98abcfa667562c670ccb6361ec722a54187dc96aef32fc6ca8e5870d9fddcb8981a504fdf06bf7ee8c9bafcb67d2f1301d984a45cb8defb30403d9080c6f6ade89f8e0b56f3e8669e671ce6d7896d32ed20e59290d1d50e11d4fddda302fd1095324f1ede2acae0bd58ee5312c614c2a5d324ce46fcec023092202b8e3225fa125669d11da495cdd8a6bf051b20d5719300ed0ff2f7b2ff7731f9e8751033a564e6c71bdaf743025d0e1c8768ca601b440473161efd1ac1229e5aa2a782050d9be05d67274a531a6847afcc76e8b00b62d5328c63aea5487d3c3b9d4fa3927e56f88a4e9fe19c1ad1fee52157ee86593a62b2491efaab8656406b9035ddc21dfdd3dd9dc13c7ba257721684b2dc13372062d570d7934f506532b19bee1c9853a740b3aceafcc138c653c13b2a815be209c2781fbc8636c29244351d7c579d4fc90cc7d73ae8fbf9f1a012d72df0424106be49f4b421c5a11b672b86fce220b23e9ae02af2d5d02b8c416972b7fab25e4c3d83b67efc9ac88c0919b712150b922e412acfd2d8b5eaec9ae88b4b71a516a8879c8849010fc6da58e646f2acfe78f1f275cc221184480c8d4cffcd7b8b3b3d4852416a13cc98cf85a90c12a5b9a172cb1f220df1dccdbde35e0bcc41b3c6cd312fd08c9d217e2ab6441c8c4bdfcec03ff968483d32c156c29a6fcf08568e020ed3071c49730bcc4a4b02e22cf295a9e8a42014642345959bd38b4e601db843e4b19e65b851021b57a59e83d8d7224d1aa5317c44424da7d4e7d51b3cedc546629b6af1bf0744bea07b9353f689fa5f5655bac480cfda5a1f8c5780b48f21d50524794892927283c82ef4abef66ee7b010b9398c052b84b19836800cf883526ac091ac27cd84ee81320816098193d10e48098f28fbf21aa1223962ee0c2304f1282ba43efa01f1f09b375becfa1f105fd53a5bcc650ce89dc211845d3efc872afdb3ec0ad7273f83e20397588b8fc89081358b8333e65e3b200f7b84d24077643d91a086ac68291e37a7f1fca779be41f7e30088be9c8ef22018aeb3bd0fafcda89d6082c60c9b967356d1b4e95b330d63e0d084bb22f7fe84d1939fbf03c35416386bef204a3af3f645bd5aba9ce105b211f3319943cd37cf79f358f6151a639f9703c8266eecee8ed636d61074bfd048d86a56253b98565ddb246952de3f400d44b2cc870fdf8e389645266aca2d200f5e57b35ab3f3e26029468adec36da1f4d615366089852f764c43d4e99fe3d172ed6b6883043aea58934502464afb5fcc8b611ed1fc2b771ced8c66916673b98d5c7690bc5ee2f9f477ec14c889c3a14d72ef518971105796763a78a7c6cc5fe41d58a9c442322f9bd4e08a52091bebe1b1b365b02633c4065b406524963749df700585a1bd09bc9cbf74646a5c8e52e57709892f503df039a1b59d84ac4de3a3fdebf37c8d6a7600fcaa256f4772ae5d193937721fca565583d97f9c145e74074778582a23cb73a59b37db0f20b7a74c507eca2cf44d1596f19c28539c612d9a1d1fc11b04865d4dd731a18f1a3201473d3a09018e9a579db94ec868347fcd482fa8952272410dfd967b9c55409792e2784a68dfd43b84a4fae5b4437b37ae404f92536ba7bf3931080f9dc08ce2433aff4864277136763314fd509aa8dea8d871634e3f6607648e98d8a52a42653cd377ca069618e7e72c92b7b44fbd753cdb5d95baed0aa34127bbe193ead62016950f33f93d9c94d4cf69b388f89dbe54d04c82fd371e45239e15a22dcf9b604ca7e0a130a5095d384afa3c227a877a5172969a3484a6bb58b43cb3229ff939532962a0c53e504ddda01ac09f941602a882e6391852b5746e48e512263048092533820ac71cdee994f68816cee7a0a9243b04c7c98fd0ea1293013f977a081a1a0e2ef4d1f980405ee31af6a08e8732bde6558d70ae25dbd7b97e5ab9b1b09e63a2313e972a342580d06933e0c63670ef06ae7c6e33ec6ae2d9ba66405071f92e28c514f9439931f55a01d039ad620566eb16fc0241859c844c31970189200fe90b66fb58079be224d10c40080e02fa68c5ffdedc4e7aa6ad1b3bc3bbefe1b5aa46dc640c24915c8a75a52511453a21793e49cf7970077a9c756106f3c2450cc18ab2d8de43b609e6b411fd4daabd294d4ac9278d99a30a290523674901563b34998c3d55a43f12380d081a1540e51fd26631962ff6428aa4327d88ebf1153b59e4c7a185cb4482e218ddd447aa8508c691b5560a95bdb1937684ca1c41fb43928bceaf854af2e8300fc63a3a7c58bf43d5dfbe8a16773453b7c23066221b1dfeccb83647352cf210eb50b75b1851ad6f297666e00f62200de83e2d12adf5b65d1423fb11b646525d976b6bbe67ec4a7f39a37d7c2be2b9ea244645d264d686096f6cea565718d578fae49cec69938bdbbf5df535f8c54c5597e839ec780ab73fe35a71ab34d0f31162845e16eddc128e127728e3722c9e7e78fa11bd68406a52629f63494aa39e08deff566c73fa0f6424cc839f974be5efd8b420f41f672d3c2c6204c05346b44d9854bf4281e6daf6f9bf70250c0266573298f25a9395a0b09ff1ac63ff5c59d877475ecac6c80a2258e064e7a6359f1760c8d0e3d35233788ea421d10438282e5c32d2e0820aaf6adda2445708c8f390e5e49633298376dc134818f4187aa32ae4c09d55fd3e13e874728a62e268f5f9a2f3d8c35ba6e6c9274640b6021f5977897c11298964c1c6e28fa2c14a344cdfd2cdc354fca5996b8ec46fd292660dd920303cf0780274e129e56c53f9a411cdd27904cc5128965ea07ba4845d144041966d66b49785f5ba5fd34d5e8ae745b01211ea835a2628879d90a510a4be77faa5f2b728b8a24db94b04e6f4d96cfa60baa1da8460c19fb2edcf2022a6a24983e2e3e3fc7b9e4e031699d91780e5a5262fbd362e4b1af4a58f76e2b1bcce111597a6a488d301d252f005d8947baaeabf7c261bc7c11134067ab13908b7d91c0eddf1298c24b96856baadc794bd394de3f40d80ba99c5c9ab1886b6f591775364e34de5b48c92b92adf384339480bdcc47a09ea61b6d5afb0b64613740c2a5b854330212456b149a4203f50a09411025a80c7752b5ed841d422ee42ad5a0dff7c6b5fa91e6a6e8d67e5b5f435efd09dc864cf8097305e15d38acaf96df4b7031a4b1be54746c7b2d7b54de35db6639336851f7a774e6a1020e60f21953a15b07add0dd3834656894c6188c4c7193364d6223c2875934fe605e6370e205094544477389547fa7201e908b7052b79a01833e6a18c1e2b23bcb532ed4fa416fe76886ad88ece9cc09588072891887d13023069f5b856c6dd287773ca34e2c45e165b4d4397c564c936b921e2361f2edd1aeeb2093318ed283ee4d262b8669cfe661edbc1a1f6a5d39bb9308aefdc9135fc0615670c8e8f23b750cc82fe7560e056f2124479f8e6474fb7310d18fc4d29ae61a2cde39dfdc8ef29b6c9bf4c1a866da7ecaf616a2104a3c3b824e3861f773230a521d2bee9af980d3a4630c554bf2bb4309052206be2049cdaf15aed6c8feed9ea56a55550368f9adb4a53ae6c3379a8085b1ed17450dc3127487d5fb9cbcc1200155ad94cb37e5030cd928108921c944520b4450a4b82aafcc677a5a490f8c84099144c1a044ebb9b76fcc159a263ef9c75860532d713314cb57853aebcd25bd2074f8946addabbdb15d1903ff52dcf8e1dd8076e711cd9237f7c3673c2de210cf4672d914ea2e2efc57a5cb199edfc192ad36dda00caa7c426ac8b131d2b7e0a2c2ee8a3095b97591231b55bb974667af3b9225a36d191354541fa98badd787686338539b6a6880dd7992310ffc90c4dd5be5f5bd2c3c1c3ba0db02e22494a446df93780ce45550f6119bf6e6a33d7b833ecb3b8211311748c733024e289145f0dec880b0ebfa1573a1c6526277683d0d86d7928c373f1f97665d916d317511c6ef8db27a99a958293aa5c47600dc003861fbff5a1b97cf76ff922781f3b74fa0fe677e1ef128a2027dc3da69686f7225107d274c7dcdca3dd580c79f773b6839a751247f01feba42dacb05cd07960f713976aee5ca18bdb05085d2a03a9e9cb9e7476e5b9ebb5a93d38c6fe07b26e34af1d81ecce38ccd9f1a4a811b359b14252796275f12321682b20549dc939e3e156293499c41c2c2e3557c42e46eb4a1daacd8f4c1b7ce9d50a56faac86fdaadae12d44a8f138b71efd23bc3e04671e2f68220083b2106308c8b2dab80cb4a6b913a2af0e39bdeabecc7764016f34508114e4abe4a86c9a6f1f46602ff100a26a0097862de080b0420fccea6c2dc1b50a3494cc1abeb3f8fd1d6346c9318ec1c5e168c0ba45b5d67928bde571bafee3b9c1ae72c79513cb39d24425d8be2f6ea43ed1c202237de76bac3a40f28adaa60f9f75e625408f3b3d61a2aae695c5f4c24d276f33b84c1a454d812c350e7244ed058f103559150b1cc226c26136477569a22029139d031734f609fb2ba049bf0da2b838945a92862aff9e98dca628db37907111473c662e0f09f2290a705ae242143408ce3cfab191243cd5c0882fe0671758f4942401b44afdb7b11a1a070264bcca0c8b151a31f82354580ae2a8a1b31b02049c3dba14f72eba401ce4c1163ff0e4a683c8185fee78221cbcefa001c8415a96792b86a9e4e03923b818d353d440c639de2961ea847fe7a3d10ad74e475631f2c60cba805416ec599415a8c7c8dc883792ad06514a2a6b6fd97e6ac7d8512ac2ca6ea1a2ff95fbeedff0377ac8f327da4253e02226d260015fc2c061735435944a53b11dc5e8388733fea4ebcd43aaf55c9c1441c1119aeb1a0963676325d8a01af5835b8397c68333402d8d64e916ac2b1dc8060c4a22e2daebdea594fc95907918bb68108db9cec9d428ed285e95415dbcea30f915622427b2e461ced76768871bbf41a95075c309a15591807f2f365c04a3914c70587986e8863321d7d8d8333f710e329c4f28c3b9aeb8bd511dd2caf47b0f7c123376a7505fb93a41132f792fdf08251e8ea7ad4802af0e84c8f4f80e90670d07647fc600443b1a16ab464761c073ace92630ee7e01c7325b35fa99677d15b883a33cbeb4a7b275589d8d00488e1fa5e86594a27abc608b9079493855c729c5715c83a41b00e08c254afb34740b91fc6b0dcd977f53121806ab8439a8d69159930966a51297f1989904f258fbeda8bca88ccaf3db83fa7f77b3309bc450b3fab8db79eb2df3c7ac3415e8760b34fed16b73406da3858cb4003dab3388222b230ead36a44e5600e88ef374b934f09374acfa451451a573753827e20d9cc33adf20e291ebdb7001228c8b1d72ddd087fb3e9a96084b515acd2c0130801502f5ad3435c9f744c5ecb001623939cd1cc0f0ebd8683c203a1ee2defb15be1cd9caa104d853691d85649804711b41d121d0bc4b2c743dd986225f2810a15e79f6b0834b56fe8578d248c2796ce4a7f968df709401d10e98b637254e1a829109c03091a090443cb0c80f58eaa4636da7aab125368b83e5c33f0fab78433f5b3936bc1b61dac97efbf9f17430bf4bc756fbf69f4565331f3561b96afe5144836791f4022c9972c255780e547c2d93479569ac6b58a2942bc793725ea337b4e3e784040da50280443462fde0d31a8e54b0236413865190d5b855a99f60881285004c46ac2de2d3305337f988a905947073cc58339942b8ec9439667a5defb0b1338eb83e9a920b58bd432d310f4004c6006d0a6f52c654aaa83f99ef5912d30b5557bf1c381d2c8ef4628e1909276fcfe2933a074de21fa97798a50bb6b60a9d0fcab6fde2f632d92b42532e27e1c659fdf1393e5fa3f37f2072bb70c82e1fca566317a124c6aaae3ce6bbeabb175f455fdea6002edcf4eec85b16594f3205d778f1089d92a8c643a5350872cf38822cf1852c4b67e2681d9bf2a273c244482f8e9fe4c4635f98877aa549a8744d805f10441e021cd8cc2cdbfbb6ab040a064ae6a967a0d356cdd8e0f2dcd63180133616cc6026c19f58f22597306c40a6419c151a90176483f8e901d306d4333d04ea242526828da1f990a0e78b69dd475bb86e5818d15db1f11fc4c248dd57a86e2aa47b4a27867a717edb98718efd9afd8058d2c020277adb43d28e83ad8a13187754c4beda84cbed5880044bfee0b057e2e10febb58d45533f60f9c12010db025bb83708d3758efbca7145740ad146b2112f0002b9a05820aee3f57e81f68cff66173cce337f87b1faa4e23ff21a1f2a9a8adb4203e0ccc100c31334e0cd25213513621ba5d9be66ee1d51c77313b54e42059bf17d1a47a202d131b1c84b2e17b897447c448e1b45bc9e823971b4939952b4784a3637e1562859109eab2925e92e9e822fa81444a1cc6cf0f91c61c200b4e8e8a340bbea4fb46c12fb8b42ba142e4bcd7c064f1b3dfde712bb79adeb962239b98dc782a06796054a28bc510187d6159bba04678497a704119b7807fc4ef74fca1e76fa59951adc9b753f997538eec81c15a6acac8d20671c2a4f1bef1440bcba0addfdabb871c1675455e8f4753400be43f3a5567f7dcfd4a3953ff129e3534018f9e0d44e601daf6ef514b9bf1eac47873e3007bf8b9a67558c0c8b5f623429b141990018f5c825113b95072845528663bac065b887507be1368b3c7854ae8050a6a455712a8e4509c8d516feb32535a2f216d184b6cfaec76d88d46aca1bda70be770b9cf5204a3382ff728a63a8baa942b4b04982610dc87ea146e7cdf8c19a51617df128aeaf64a2f304e845903ee1ee54b1c1027e056ef630fddd27bb695106da302b2f3f2b6a46928cff3aeea9c3d0a1c7fdc2d549cea6ce71d3e7da0e4afd8548f8d85d6557e16c3d9a77cda9ca45d0724162de0796a604cd9747d0109200a3581b2f2517ffe0b0e545e5d0505c1c3f33d356bc108774487c6420665e571f8e4c11a1b2b003607bc59299cd05b9fc2646d2bbcf4c1da0e2ab4e6c400212945b0f8d1e6226eed4420dd4b21a3b07c756db8e0ff940ad730cac56ac89d5a495a36fdb31952b00c0719ff05760674c00cc2b79c036bfe9c38555476233c3774b9629ff0ff299ca6bdd614ebe186eff8571f92eb013c55af3cbe929391151870a499b188020ded2b55a2b17b98695211e", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x106c97f53e386c97a7217d23e3412bd98a37ebbd0574c2ae95de296548523235144217f1177620148602f0ce7e4787643f6da946b7c9390422b5b16e8f1745e8799046c7d25f9bc688e9523897ebd59fa7f3b0d44198a0bc6c88a580aa9b3ce67d324ff4d0173ef7f6e75e06b0151998924c1c7b8704f80f7afc3262018a195b4d", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x106c97f53e386c97a7217d23e3412bd98a37ebbd0574c2ae95de296548523235144217f1177620148602f0ce7e4787643f6da946b7c9390422b5b16e8f1745e8799046c7d25f9bc688e9523897ebd59fa7f3b0d44198a0bc6c88a580aa9b3ce67d324ff4d0173ef7f6e75e06b0151998924c1c7b8704f80f7afc3262018a195b4d", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30035be32a48e566fd2a621a4e8851a00566daeb02c845da19f19f208f52ec456d4e77600fc41c314": "0x324ff4d0173ef7f6e75e06b0151998924c1c7b8704f80f7afc3262018a195b4d", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb305dd030831957b6e5ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2e": "0x6c97f53e386c97a7217d23e3412bd98a37ebbd0574c2ae95de29654852323514", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35fb54620ff2e833eccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d": "0x4217f1177620148602f0ce7e4787643f6da946b7c9390422b5b16e8f1745e879", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e08a79b5611284ca28d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e656": "0x9046c7d25f9bc688e9523897ebd59fa7f3b0d44198a0bc6c88a580aa9b3ce67d", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195063ec922e7fd49f5961757261806c97f53e386c97a7217d23e3412bd98a37ebbd0574c2ae95de29654852323514": "0x5ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195093fb92453bc0e8a161757261804217f1177620148602f0ce7e4787643f6da946b7c9390422b5b16e8f1745e879": "0xccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195098d10965f202a3d561757261809046c7d25f9bc688e9523897ebd59fa7f3b0d44198a0bc6c88a580aa9b3ce67d": "0x28d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e656", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f0305c7924a3f8796175726180324ff4d0173ef7f6e75e06b0151998924c1c7b8704f80f7afc3262018a195b4d": "0xd2a621a4e8851a00566daeb02c845da19f19f208f52ec456d4e77600fc41c314", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x105ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2eccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d28d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e656d2a621a4e8851a00566daeb02c845da19f19f208f52ec456d4e77600fc41c314", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x105ae18c05a78be70e49f4495fdfca8389f99173d7f1b4019e077e24e15abd6e2e6c97f53e386c97a7217d23e3412bd98a37ebbd0574c2ae95de29654852323514ccc1177642b30456ecd401c75684a9c1cc1c529879d65cc65c32766fcd6b8a3d4217f1177620148602f0ce7e4787643f6da946b7c9390422b5b16e8f1745e87928d22cb1ad64189d654e3a0270dfcfac27fdbacb78fd65a11584bcce1f01e6569046c7d25f9bc688e9523897ebd59fa7f3b0d44198a0bc6c88a580aa9b3ce67dd2a621a4e8851a00566daeb02c845da19f19f208f52ec456d4e77600fc41c314324ff4d0173ef7f6e75e06b0151998924c1c7b8704f80f7afc3262018a195b4d", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/bridge-hub-rococo.json b/cumulus/parachains/chain-specs/bridge-hub-rococo.json deleted file mode 100644 index ff20d8fb4825..000000000000 --- a/cumulus/parachains/chain-specs/bridge-hub-rococo.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "Rococo BridgeHub", - "id": "bridge-hub-rococo", - "chainType": "Live", - "bootNodes": [ - "/dns/rococo-bridge-hub-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWJCFBJmFF65xz5xHeZQRSCf35BxfSEB3RHQFoLza28LWU", - "/dns/rococo-bridge-hub-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWJzLd8skcAgA24EcJey7aJAhYctfUxWGjSP5Usk9wbpPZ", - "/dns/rococo-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPZLWbbDJzEXAHPuAcVssPrjQLyZK4nvvmV2ez6gy2FQ3", - "/dns/rococo-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKWMENpCNH7wBVQoHLwQoWUs6acAEmfdV694v9jCuJwYc" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 42, - "tokenDecimals": 12, - "tokenSymbol": "ROC" - }, - "relay_chain": "rococo", - "para_id": 1013, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xf5030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x0a000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9050f9ffb4503e7865bae8a399c89a5da52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95c7acbba5f59ca99cd7b8256f6342aa094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9867d04f5fd090d96ed68a6355487eb8a741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9aba72baede0a06ab63b4b66340fe145acc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9c3e60052e92d2d3cfad167f41164dd110676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x04446272696467652d6875622d726f636f636f", - "0x365c9cdbf82b9bda69e4bbdf1b38a7834e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058147c04de43c5471053205adaa403e5359022427e9a8f1ce9335b4e6262a8de34023299aa8ef49b82d21f60f545eb8f587da904aaf9ea6b0c0229d4198f28423ff92884fff66c3446ebe5b5dc02ccb76d844842f6967bcb2da59429c9fc11ed0edc0fde2876969bfbd61ea0fae894337f29deb1fcd428f7963b2ddaebdf76f6c9729d86fefce6fc953eb96f672729516f4e4ea36ec5a151d7f4965bfea351d12dcfa151577a74cbdd230d39034bf45bdf727763d91eb7627e59d081010c60c0cddaef0defdc01eddc1c76aeebf2ce9d03e2de3964777ec2a15373c73975232baa5ba1808927bd5b51c1e29df65ca71550d92b4da3a2b39b1a259d7d47a36ece5f696b9fe246737591444001b44c725e7a959b49faad4368fac42e2d87ee5ecab2f5e1b04b7bf9a3dff9dc86195dc25481891758018c1de9b351d84baf28b0e2a5d3348abe44410e5efa8e4eb9151010900a76a4df74caed487b99e47cb4ae4fd08354575f6a425bfbc4de1b4de3b097aaa8687cf66e858228fc0dffb00afeb08ae1430305486852d627d7a7bbe3d947ef5654b4bca94fec6e07fc4e391010d00976aebfa66fd50eceb0a28c2d4e2ce1053476e6b7d797da21a38931b4c4e00a3560b0d34e9d8f3adfdf69edafd339a0963ba731c420c4db9ae47ccff3ac4fecf465ae5177a6dcc3998dba964f6fe9d02f939c9f7e399ddbec53fbb5e5502d77df1e5da7af6d7efb9c9b7bd67800829f2ddb24e7a5ed811eb367779a0ed0ba3e3debfa34b9ad5077e31c907ed7852858b0842e84c1450facb0e3bc36ca7ae73a9d823bcecb3b2f6d51d92f0eefdcbdd4dc619f2fc540404040557638e79d9f3a05779cbb1bb63d35ca7bef3df6f7b8bb1d42014874c824e767dc7cde13a9a16209553c3bdc98e4c0678790f909fc9ed3b7b1d3d8753a467ffe68676fb3da59636fed35f316a8049179d27ee7bfe7eff97bcfcbbff71e74370f044344e18d6a6f3f35eac2eff69b46f1f71057526fa76fe8bf3bbeddb53fc9197151ddea044cbc5b09e1c6dfd3b71be0dd4a88d53b4d48d5e95aebb777f4774ee3e6fe6dfcd4f9a8fcf2657193ce9a9027dd690f50bda4ac11892eed8d1e9db646a47e74a7c13e41a7307b1b3f7d99dca2b3e6fa74699e9d52a7497b552ffd6d77467f6fbbf0a5eb347ddb6dc03fa74eb3ec0de22d7fdb75ab7f1eb7ebfa14c4931f9060e09f5fd7a76be49fdfb8c33fd77971736f6d505e993265c87cf4b7dd1c1e3ae5ec6dd0e3e6de693c582f3728d6477bf99f85c265ca9429f357f5cfe1e6fac416f6893de75d0d2ac97008ea6660507a0146dd488bea564208fd9def56426c79e759a778c7b9a9516e0544e69def78e7eec6e95087436577ee2e4a5da31c3fbb733a728d72b051edce295398b946b9bff31d93869c61459fdc3fe8cfdb9f26a4ad73a4216768d127f7ec6f73d0b22664f6e9b9d376709a90769de62250f7ddceddd6a9981f40d9791b6da92b20307fe1b74ff639dd4bb9c6b9f5d96f7dc8ecc3e3d7fc5ca7f9bdf71efb7bdcedf3dbda146987deec6d6ffb6be621ea6eae7f3b7506a8d4f9a8ce9f3b4d8873d67408020808488877d6f5e9ce6fa79db946b137caf5a95da7df06fbd45e800addd428f7b551ed348d7ade6e6a140b797003828697a29acf3e9fad4d1176e8ecd0faf03feb34216c2f3ffb4ddb1e7f5783ea311f81ba7737b77e3b9d8dba31e82853d96ff64d80cace037b8febd385cfdbfbcc0189c2601e884c4439e30d7e36e6a1580f4449cb44230804f4ec1c10f6fb7c36eaf2d3b74d1ef5b973a70d817d72feecec93739da69df1d69fad1e08a939205118e8a12ce0d9db59e3a1023d7bd628f7ed4e23c240cfaed36ebb69db53dfd5a06a6e33a86bcaee1a759db3757d72ee5cc55c43dd0a48cb3b4b87191cb4450a4c471074704147157480a1e3083a8ca003093a98d00103131a3a92304161fa420e31a628987460ca81a90d5317a62d4c3cc891851c5730f9c07486890939c098a4c881051317a6274c4c984e60ca92638c09c8348429099312262f98b8985c90438d1c6b98d830ad91838c494c0e2e98b0e4d8428e34729091c30939a290430b39dac8e1460e367298615a82090639d0303991a30a39a890e30c1d4b98ca301d614ac314035390494b8e3098ba6042c2d40213174c533099617a820905a62698be9864a0038b8e2c3a5c606ac2442607108e37705001c71938ac80a30a38c6c041060e28e0e002070c7064c1d1829a326acea8a9428d981a2ad47ca959420d1a3559a869420d19354fa881428d136a9250335483841a26d418a1668c1a356ad628a1512346cd156acca819535a8344859924665c308365a6053348cc1c311334c3829915cc403113c58c0a66aecca460c6ca8c11335566b498b9c18c0d66b298119ac162a6063357cc583153c50c15333498d93253c40c11332898a13233c4cc09669c9869622606334ccc4c31338319296670500243c90ba53094de289129a9514aa3748512154a6694c294a6503aa354841218a52da52b4a5494685052a294a554850406921ba42690be90c220f980d403120f485dd444819405090b520d4854907240e282b405e9095214a418909a2041419201294b6da3a251b950cfa86cd434ea98aa85ba856a468d422d83d4850aa664a532a102a17ea95dea1335a8fea04e516750aba852d42d3509b509d589ba443d4235423d6254859115465e4642187d310ac2a8cba88b110d46528cca184d3162c26806231d8c6c30121a61318a62248391969113a33346488c9a18c560c4c40806a325464a8c9218b9608465748449059717ae30949450b3006500a1c811c6940292136f09a630b109738c1c639888985098c0c027e815504b0e2bcc28e820c254055315dd048c024a319f30c9203191e38d8ec1fca243091314727ce17ae3022627b098eb0bd3096c851c5f74bcc084831e229892113422b4176830d096d098d0b2684d6831985e3c29b4222e2e9490601b8cda18b1310af33a960e24a0814846768412174a6c60403e91a900c70e70e800470cb226c030644b68321388c5682e605dae22a815b214e01043d242ba822444da41b442a442a741ad983f184d817ec1d6886a907420c1606cc433221a918d0cc434a01351cc43c233c23b82c5059c018d82b5a050684a68496030c05e80b5812181b5003b02c3820561593025b031d815485c2075b1cab40f2e2eae1d4c2bcc2a4424c4a1eb065307970d2697b91a5151eac2b5858e2de400c385c575459c42acc2b5859211b508389e30a18029e1624174422c238e3189d037c88c508a0295a2a68d9216a514583bd041657291a38c8983b6c11bd338c8a6c88ec894c892c86690c120ab4176456645b625a322ab22a341b64416830c4bf6043d23d3922191c92093227b4106459685aa41d1a0695031990b3226b216644d6451502d5406d48909842984ca82ba82aa827aa5a6a05aa946d42ab5884a444541a55287a827a84254a051995118466018bd31fac2c80ba32ed4b0510aa242748a3944e988984416d439b082404a43caa0060b39ca908050bac1d5851a2ed490916048a00886188658a68221a9c828bc21ba856641679069210343c6850c4c3685cc8d2c0cd916b23232333236b22c646df41bed056b8b55854583e78297e5257109411ac2758299c45c622ac14de02fef090c0b2c0798d065c4d5c4a5e58a01a58256416d60e1a04ec1dae2816171298d7191994d804d30165c83c6d22dc878c057d430318c6883782562118d8835882a8847ec5c6078597858802d786ebc2e442664499066d4a4419fa0341000cea88a3705090d1218a5301a08950af14b5ca375705531b77000dfc0d22286894be02c680d4c42e818c22485d945264492a22454dd2091e9d5f441673179d044bc351a05cdc5eaf2d4b8b2b884e217a616ad4546a5855e1bd91073073307f18de885de224a2142a18b6823a219f1092c4481fe417b51aa01c5628a317bc05f70170ee3b16129612171958951b07210c5288d99802442a98dd10e2250c2820722a51694b24840c906a52d2c6044851e37e40c6094456483f23ba6605cfd78a424e9c0912749787e387284f2f3a109cf9123d80c43f48a70017f44703ef848e1e9c091254f7e043e3a3851e244899309f81b8292234e3cd0840813264e18e0a384870913270c18c0f3e2a4305992c487c787233c3c1e08c0138273e281264b8e8c200a4f08a01c59f2e47d9af0806004498cf8fbc2f12869e2a4c9912447963c791e254d9c44c0a749089c2851f232bc20f8e044098f0f34bc2e4eca08787a8e489132029e224d9c2c9122858702db038213c192271f85a7278a930bf0b0bd1f381e9f243e2c61920488233c21e00981047af081e7031f48d2c3009e174e4a8f129e1f94ac9c149f263c51787e68b2c49f0f9a2cf180cdeb8153b2444a9325517c82e0393202264f9e24391285c707264b42b0d3a3c409939d1d8f070e044792f824f121890f0f0448af0b122c61926489cf92264b6a1e17ae478913261d38c2e31302253c41f094de0e5c14270cc89e0e9c149e253e4ba238f9c1270449661e17d7c4c9129f245142e0c3111f274ca41c59f2e4934409c1d738e661d281243e4d42e081233e4a78a22cf1a1c99223477498a2189610d2107aa7a26e0504f4ac7a3a646c23b6c14fd882fd80eeee2ef2802ed2458a38073cf8628c90488c2f5e177c44aeebbae2bbf8ba628c175fef45be2ebef8f18bf18a7cc1c7fca2bc5e64f8e083ce5deddc74ceb1bc607c13f275750dd735e77c31c2775df0718dfc1e33cf092184ef35bfc8f1bab81f062346dfbbb019dff562e42b0200c638291ccd292bc4e47b96b4a66318e38b1c9977780fce182fe678ddf07b93df53408c175fef001132bff7ae2bc6d8579c9323641823e478315f115e1cf9c5ed31e4eb62d8f0e218239c932f7eaea17bf0c10b5ed7f5dabd0b4e1a79609127e466eec8178c91e3638e70c22a27a4a38961d87b33c6eb41fade833087ab01734ee77a880e421ad00006740dd775f5752d60e75fd7007b5e577d2fc6f7ae4bebebe22b620f4248e183f0f105636ca8a3a3a3331ac537e79ccc373773c618218c317b19c705708c7c29c0547a2f26c026e3f7de7b345e91193ac733f29c1256d1837046f83ac6f9e0285ef1697c5d598ccc30d640b318e373d8151983cee510c48a310241c0cd8d0d31c686ddcccd1ce37bf1c118df631b62b4815f06bbce39e984901fc3031ce047ea00117580c7b061c337616417bb06f8e27c2fe27019a0e6c5181fd4205fda9cccac65314677c5f71e5f1733337c36f08bf14118e373570dbd62bc1ec308b58c7d3c2ec093cc1c737a3c86910004e0eb7afc2e1b183233bf78457e31be17af2bbed8313ed80f42082965e638e79cf34d0863adb0560823a531be37279c70cef7e09cf1ba9c73b4d2ca19648b99f98a6c03338691de63e6680347e6c8968b3630c7c7f4d5c073ce095f8c93461e3346e72e1a775d2e464c745dd7753d1be28b2fbe1b3872cda4939b420ae183d78bcc7c0de0451640c4e119b22cf28cf1bdf74e91497cc5c801883102200200002fc678c5eb8afc6cb8ae8bafeb8aef45e6ebbaa27331c699f81e8c30c6c8cc51cbe6e39b37e38cefc5c910c21923adc1728ceebd075f8c103e1863840f42f8b68b2f8e9099afc8fc2264aef1bd08f9ba38f28b30be1863c422ecebc58b9dd361868e30cf7de089c2e3431427475007f0c1b3248a8f000250d2a1c5d0a324490798307122001a629861861974c880f9284922a54992283e477c968000044e4e3a2cc9a6d484e7c9932433b8028060894f931044b1240ff88440069e1f8ef8345912e5c9112552968060070e2819827022029f195007f021832bc00f1f0538e283a72709930e1cf94093253f4849f2831b80c9929e9c1d01b0713e7c9c3839c5e00a9084278a0e9e9e233e41f034b941c7070260720590e2236549103c02c8e17c04b1c4033c519ee494783e90248a131f29477c60b2e40725477c9884208907787cc0c17ca224f19112001f35e0f0491285a709cf07a248b1a1c6f9f081478a149e284f40e044c991283c403851c213e54812293e28e13952801ed4017c3c51c2232565fda0c42749078efc20654993251e38d18cc0034ba2f0007104010538c0017cf8c073c489cf931144515283c58407081e2647824802021a663ee084c9910f3459f2810f3861a2c3816006e6e189e28123519cf82451e2840993243b4a3e3c521c88263c8fe40a70a489932552a2f00071244a121e264a8e04c1e3439325479a2c49f283120f78c0c9119f20782c104d785ec9f508a23801010f0824104d789e00b41f3454b18644c52ab654a31f88c4613faaf87e543f51a58a2af9e3543f3f2a5554a97e5492fea8e0cfcfcfcf0fffa8542a0c8953fd3412e790b89f9f9f9f87e4877f18898a7f1889fbf9f979aa9f9f1f88e447c53f3f8de4877f7e7e1e1215ffa81ac98f8a55aa87c4fdfc3412f7c3489cca42e2541389bb90fcb08a91fcf08f4a2271ae91385544a2628744c5ad82489c8a552ad543e2548c44c52a46020128869d730c0229495c42eae620b665fe523b1a87fd796dd49bf2d2e336adceb3e2c6650bee113dbad479f2aa5eba9c1f56d158ba8115cf47bc5b1d910552cbdd5feebc6a9aa65975ebb9d2a7ff484dabf5726b5ea6d92e19338de434b5d2d44ae33a8f4673d2d623a219d5ea3434241a2769a45a5da7472417899ca6926834796be04c69546355928b68485ee10c2c4152b52388b9e5222ddb32ad087dcc5ee997dbb44f2bb9878cec96109010f30278b742a28ba7a396a2ade75a0efd275a2492c7a845d748d6bcf02304584aee8139f6444ed23492a6915ce79130176d3d94a4694e2289482ec29c2644b350de6baed3d9767fbe47e4d449aed39afbf48b18bb3ed139662e899c92ace6ecaeabbdf37b646ffd1659cc33fb9c6e927b60d736ed7d125b433cfadeb322cbe21759ee5ea71f94f796759a0eaa9f4ea1b5ddfaaa29ec224bc42eb25ce759db6d377aa2bb674b64afea456e6d4c2da7ad86c84279cf1010b973276a3141abf7f16e1574e5882aa220324143221175aa39f52b72a80de9b1ece50cf36b12892e0cbbae4b24125d4edaea36da32ec325538e1e4823674db739f7e76ca1b75da1076dbad9dcdc78e5f6e3d50a6fc74f74e23f2f8a77477e1fb65ebec6d31ff9c0557de005f58f0060bc478fa34cb59d0e503f06ec502269e7626352196b396f5c9b9b5d1f4c959b7bec8afe92d7b33bfac3f9cb623eb1e0eb5eee158fe5222ef915b5e2d7b9d549d52eb5eaa44f2e9a5cd399c696ffde99a9336e770eae61cce689b2eda9cc3d1ec9d6fb93e5d9b8e3235b33ef1adcba136e4aa7a30ebfc6c0fbbe5b208756825f7f889aaac65104a5917d915a8e53250103426c6c2591a85f9b5e3af4d73cdad4d3e0fe279c9e923517a7577f74c47bbafabaf2cb3c2419a4691c74c945d792bc668af77fb8dd1c6d8b6e7f2e931c62c66318b5996f69f8f1d639605c5d8d995eccaaebcf469396c94c82db7fc5a96c51c94b9b482b02266c5f052413c9ce73183efbd2a342f468f31ab62756757b22b8fb9a6b58f4ad87b334ef3620d8da8e49af52ccbd6bc2c8fc65ef83cb352b299154c0896753167c74cd379a26de4d9569d6e986b9bb6b9871ec44bbd2a4ce64d8dea77ce4c342a0ee91f417f555eea657938b0ca4367276d3cdb6f57f9b69a3635bfd9d3ceb268fd159db14b8bae396b44d8a36bdb856f4bd0437f591ebc2f8b65bde622bf5ce531cdb3a959ea9623f377bee6f76d79e875737dd27cb4c13e69f6fa586fb9c83a2dcb2ca736b38209c1b22b7f5996656556b887845a720c31e22eaed01dd772d7524a19dda77b3a9332caacad0dfe45a3dfc957a46bd997e5666da6a799526e961ba9a6743b5769ce3221ed86704e0efa2b7b7a569bc209490e2bc9de1ed93b67f7f4cc6166d9ca8439d531081d4297ce5564375f89975bd6a83d1b5d985728bdca9163d29fac98652bd77571174f6736e7ccdab21569c92d3add2ed7792c9dc28cadec60925dd012f9f3971259d7dc350ada76087ba04fb7a0335b8197c7975967ccadcc1f93ec395bc12c5bb9ae8bafbc642b6ef5aa16661a0b87793a72377487370a73a9b5b58d9cb791bb97aa24cfde755dd7db7a26bdaef72e6a85835c6e959e4f6a6ffff4e761de72d7a99c9eed9789ede7d3fbba69547587a9a658d2e2317fa5635bcff52cab31768cc5b4d5d35cc22c7b39cc4b7f6ed9cb24bb96f52cbfafe15b59fb856dbc592fe7a55ce6d49d4b4dcbd97bbb3ecfaa2fe5222711616f76cc2de72a1ca4ddeaeeebd397c33ce6a34da40d99f1b63ded976b33dbe567cb56b807465dd496d7584e9359334e2d87568dbd90a67d06d38460589ebecd7df77b5bc37f5bf7ec2a6f8d5c6e5dda308f9be67eb459a38e0e335b5f2a5a672b224b8295a75ff897dffa97bda6ed691ff965e5a651edae719e3fcb24fbab1d832e15df5fb6a7dd72cceacb5ebee252d12fb6e2d7767ddeb75fbe321dcb612b4cb267bf4c32f898c7f01e5f79cce5c85e8e392387237b99647fb9c8e15c9fc7575e3a5be1204c2d5bc1308cc3bcd5ddddcd567a8b9bbb81f38755d60fab38ce44e1bd2e0fcba5b93beecd0d3959fbdbdae9755d17dd7a46f3ba28b5b9e6f4c1412e1dd44773441f162439b82e33daebd78decb687fac8a35f3834aa26272727e769b968cecb42af4b87e5d2e91d3d2c2fbd218490edeba7ec77647dfadf83fc600ecf1787e7cbbada2279299761d35da36218591f71bb36f6b2173e5b9b918b6672aeebda3c2c6f79f7e5837b5834a51a9f0cd7c6eef00b9ff7b08dd30733884119ecc561c7b3b13e5e97a77434dadc534a4797f591d3316c9aebe076530e1cd67d7090abc6ce589215c16b527b71f8cb6d4ff491533b7de080430eae8b03839d2dbda8bdf0251d591f74bb3e0d21843ee8c8457e7178cb63a02338a22387233882237b45f6e2005ddb5c9f321f3e1e161f0c1403e7b80193a1d14b6b79e8d4b5c94f3932f8fdb1c3af5bd9b874e7336b94e59037ea6fa3ee9c86195ce432f80eb7b9ba9bfdda7a34acfbbab875fad9ed46cca3bdfd9a63f6f65faed371bbd14b8fc9ec76f935a77edba38df672cda3df1aac53981969540ceea2adaf9a125f8c62fc956e6d3dd67f3ebe6666f8d12d871ce4b97523187f655b7fa84db6cbeb452f2fdda73fb2c8899cc8d95eebc1071f9ccf2fa79c991e5025d363ecb55c3a841046b7d6dfc6dbb57885653e72e7dcd1e066700e02da8bdb6d6baf469aa9c171ca9163faa183c8f3e8f179b462c7cd7d47bfd18bf41bbdbce574136943d8a3ed896e9ff326b987e5aea9346bf051666fbd712cdac0f675d698539d5a721b68bc811e74f76eec9d23fbeced5883e58891797a45f9dae6fe8a51b3cfa96fd2b7cd724f37f6b9d1a8e3f6ce8734d85b1fce60afc965b0f7f47087bd3936f6fe78e83a2fc540d4af1874d8fb43b3f787c9de9c9c1cf69efef20987bddef67a8dbd269a195b82b6c20bf33bbdfd6ade9748241261d445f64e17f9d5ecf59f96762639887423cfa3bd2d668ef9d8643e3a7c401fed954efd8a9c2feb13bf27bae5ecf7b29cc6ce44229128bac8592342ade41e9747176d77fe656da65b2e9d815e8a570f07fac8ef8f9b73d2fcfa3589fc56a087ceab976aa087037d64ef8fccde9c1374cd5e17f1eab2abcba55f918f2c6a7de253bf22eb135fe499dff9964b6d08bd1cf3a8f1903d75e723db4050b33ef12fcf64033da4976356720fa809b1a2976b8b3faf4dfedcdcc718af2dc29f5684b6a7b558f629d8f965c1e0b798e7f4669abbc9cc718431479f3362b6c78dbc3ddbe0cbcdbd6b94487210e971b6988feed30f1f3f7e3ca753cee6ac95a18ffcf28f7ce29dd996fd34f9e91dd77ebc61de1be68e5447d066aa29d0e774087db61b9f6d3d96ff3c74a239e176e1c3cc210769cfacce83db6d3532e729b23d995b33deaed392834c51431ab79cc6de6e31cf247be7acf6d63ab2d7f4ef39b456e616745a11cb4aeec1de56a7212379299dea2592d30bda4b04ba831c04ea3c9d863acab498e9d16f8b79e998a60d6187b607fac83396dc43ced86b225548a2d5b192bd93da5b2dc95e96a1d74b13225f96a7308370839f6d105a1b7f6b44e88f207cf6a90d69c73c6ed0798b2e6ac94122cc61e9ec937686f9bcf5df730d42ea96bda6cb317b2be6f341482d3bdd693c6456720fcda1cfd7ac8de5d2e37313b5d774d95b1fb3d3239639f53b5f62de935d58e62f7bd9cba8bdf3e373c941b0cba53b295bcc33b4accd3d8410424b5ac93d227c25a6c9c10a803efb92b7971578f903bc5bad20e8a91bdda0ba950ac0fce9dd4a055c9ebad118d5ad5430e6e933ccf20cf4d1a97bcefda5aa8fdc794ea330778ec38f4689dc790e8da2ee9e734ab14de4da36bd3791f366d5d0949e1023d5296d7be176eb63ed184bc7da31769dc73e0db79ecc7fbed9dd85d9ab7acc79bbcc42ec506297d569a7f17039bb4ef3161c0473d933deee341e2e7bfb339fb1b71fba4ef776619697de6db1edf26757caee6eccf640cf1c734a5fe6b421efafb417f676ebb7a59af2f3d2d9365f13fcb7ebbcde2e8ce2afe53edd83f9cfcbedbe6f6f8dc87bc8f6aa9ebd5d6e17bee5b37d5ad727e93a4f6e1732f1d782f2feb24eb7c6c3edc75cb3faa15f9ffe76667b6196b7dca1b3b55ee417f94586ec979d8b48c72e3fe6bdc1396bed871321904987de1b744c5a9bcca75b335e4353b2d7048176692f9176e9d259e3a15d3a0b356a3a3b6bc141a433e63aefb17e797dfad92dbf30cb4f176d551b5272697ba4633e2a6d97bf67c969ec35d1788dadf1192bddf2d97edbefcc9c226d487b0f6b1a0fd9b72361afb13496ed4cc9b6f49979790aa3fc6c730fa553cee4061f6ed29dc643cc30c73d2e6bf1ec521bd22e726b93aef3b42df3dedcf366b968c3fcda46feb6ea943391b42ce40f27baf43bdb6f9d7e4d6ec7b94ea34813703bd5fda57444cea669afa9edad7f7db2c697f39c736ab647bae8b2976967bc0507b9dc28e824772ff59c64297c2addc2dc8a210621aa4f7c6a7ba44fc79c3a656666771a04a663f6326f94763667add7f4b37d4a9fce1a1111bbf4b95de6f26c6d2ecfdc729d9742f270a29b4cb53e9c3baf5b4db73cdb207c915b4e7de2b35f9ff822d7fc3297a75e37f770321f6db34f99bd3ef0a75b3eb521ec3d227bf9a7676e693c64cf8e44e473d617f9adee995e64af4ffce99abdcce52dbfa6bf0ecc47e72d3808db2b45f5d333a7ce42d4a52684c22c8f6dae4feee716296773937f6deee57647f0d2a9e36ed12dc1cbb9118973837f6dfc4e23427f5ade827b5876de44dbc340f18755f4e9c8628b0863b48e1d1a91823bd1dd01e1e82e6e333ab37ba93b3fc628f431460bc0d2bb959526de63821516f0ad5f4d5feca0cb173af852c20184377fa16572733d7b687ab8b262c443874dc40e749a46c187f632b9b100c4ca3c8e33de122a7003fb89ece072853037aa1b10714613426cb9c1099ca8495c113dc10722161431c3a8f24695202351c62863fc68c4958f313e60c7bb95113978f96e654416af7b60c4131050e9c0064f088d41260b59b06224050a2a40a10321b8c0024804a5489121d48bcd1486105599c1156e4c81822e37d08aa042c465be5b55a97206116150d085216e1534c6102d78c21a3b784256c41257114f5469c04f186c78a10432c23481099408376a8a3022a801dabb55115ff8fa6e55441a71e46eae5bbde5d46942a0eb943f1ccb9d3be837c6f6e8d7df8a7ed3272be644772e95e3702c8ff64af73e59d2af17197d8f3c354ada5b5fbae5cea59cc3b9f3ef4c55876339db2bfdd427cb79f33e591eb79b3e592ea4d6777ffd2da7ac15197df49bd8766db38aeadec608957676d2f3db449f9239e6d3a79d42fd72d5ced38418a14205f3ccae9ecae5d4ea3c1ccbaf0ddb726ca25357edfcb089d64602985fde03e69747bfec942ba2ede1726aa7b88773d9fa702c9f623966ddc351eda8762867d8e676aecded384d8891f9702cb7f39aa8d3f1887e391ed11f4e1ce27e66988eb001145b38c28b326290a023084b6071653a530cef565038e14d4474992e40598050a68a9ca7a3fbe351d0e315a425650e2e4d5041852b4284a1821d697ad905480c22221bd39350c2dfd3c306507105115e90420b84286327471249789863c3bb55125624d1c4ab82d2e4000710413002195b44f1052fd4a8d922d3421857f82214060aa2586387e6db2b176d8b2d9a17665c19217c41074f7cc1811156250a0c418526a0f0051486cc303d1df1cb1d20613344ad54e8a0c277ab2d33f8620b136e0b125672b81945476c29620a32f3a74843053456a89914445f6a1686985a81a0415173bc5b4d6185363485135f98e28a288a9abd5b4d0144a5522d9ca06a6266008514601fa3356953a8a5226854d4192e5a97aac3099116ea7cb79a81125ea834ef563318620755db82288baa9de1838a230c0d8c5af36e25450f9e5d0b2345160fffd27c0cc478084dafd33a6dbd5b49e1c4d3772b2966c0ef02833abfed93db32003ebfd0297410429215aaf30c3274370d043a6adf84d030830c3b6c62d061ca81a38666a644aa23919651ec9a968cf0b5e3e1dc69ec784cf15ca79f750ee78755dd0d05db0577dece73d6ead83d15b309de7bce9db3bdcea343bfcf79f4e7bc27bef7de7b8fdd60081d240d4183893eb9870e420821842e1fa0aa62628c3146813a7b2bcaf965777d82f0b9c8fb1e9ed1af742a37d21a955d7a7b8fb4b0af356afbcdfe79d628b6cfe3f5e130628c1c638c9165943c885018a28a1899983eca18e3c90d687a5d9031b2e4286315b20a7690baec6942e6b4dc8c72ab945a597bdc3a46ff087da08ccdd64968696050d9db69840064ce818c31c6d8128d880de179818e4838b21a9a9912c5449a55d1c8a14e63ef297b92390ed248a459cbfebcf11604687892b3d08f1f7f598886856684dcb930247b554cd4983907bd140b056936b377036f0909090949cba2e10b0a90462c76216ee08a579c0223bc8147c418a5452dcbb2229417658cb1e59718e10fa8344566961ca5acd6754d97d1a55b9b8e32d5ca78801eb767c9689d8c02d484b4c74a63e2e2bd1a7dbe146592c3464637ec9a394f6a4e0d154ba022a755b31f1a51c32e2b9352ca2cc78218986f794e8c393127e6408748a28c70e86a18063fe7676196216a60597e39205726860a11393bd319203a95e944f80e86619b740688f3a7ffb2d1f188f223e4180f10a740192d695931ca18e1eb0295103ecbb24e6e534a8a5d11c94b8f598c6e410b2d4b7abbb44044cb7ff1cbc2150e838cf249eba03f971b6b3c3c8f1bfca8ede01edaa815e167a1bc76c84c067d51c6274f10e573e20443f018b94128b9bb9bdbd91d3b37c70dcaeb7663ac29ba315ac8aa1806ead3632a3da8ec9781fecdacb61bf31089288600dd98313289d84988cf0bd2c5b893cc5e4ec1913388c924cb6a8fb19c34598e8cc92491b84fa4a14c99320c44b402b61aefdc706f7c741fc8108394030ef7861d1f69b2d413a682464e4d0e4d4ec95e3fbd7492bda79c1f3f9ed4919d19c598ca4717e6a3ce4f77a7e8ad1171ab9f7e33a5642a169837580099ca0c5b4f3808ed0e9363e64bf352d2c7ce39e8cd346ef465f14191733cda755a3ee950b75ece2e55cf987334fa5be3477b723c9e5f639c1c9cdc4d13bf20a57c334a29e5137266d5a5c14fc627af886058b18ae2e963ce47bf3f7ce45b2ec3e0864e257b73fed61f3f30eaa2cb5eff5b359b994cd45ef39a975fd35f3eadfb482983a0ca7ab10ce8c06000c2fa736372fa5abdc213177ef4e9b9297a5f3dad1ca0a8ecf7c73f787a07c606b1d278a4eccfb04617239c9dba3cc678851ae315a3cfe8d1278cee1ec218618c568c31c2087de0476fadc802ca9429f3113e7cd931896c8cbc529f4ba12f482c767cb4724545aee44a0a6919da2285b2316d46850e88f468afcf73a348bfb4d0f190120a913eef65993265ca00f11edada57a0816d3a3d3343e9dd34df6deb06e5c18f424cd701896ed19c214dace5f4e9b9096ae63767f6e97db4d0f18025b02c861f9fc6004b80510548f33072b4a22628042b6cf5d0a5950a1d5b5d129088adc080f980001f2d36e4783c6f2c2afbc586f82f3684ad5c194020025bd504b580ba9b8b8df9e73e3b831b7cd1f21bb73c8c3270718978c4438f46b8548d557e08b531e7bc34bc74abc62a7fe30f1dac8f16f3e2783c7f67c41536040767e41e78d18338067231e598216def13faf6f8aefc0b7a8b887c28d6b3758ec77d55a00e353ff4d0de66f2841ebabc34623cf41eb26ecc135a838c8f7e697ae8ef5be980e3a595417d7a3eada8ecf7adfeb5187fdf6a66f50935165a20319f901c03c3fcf0d22113d34b7fd3cd7969b287d56409514f58a8ecf71405fe3d39384d025802154b80261b58f5e3a90cb6b9c3895eaf294f1f83980fddc5930e30aa7083f94e8ba71cabdf9709817eaa3cbb4441bd9c85cc43089de301dd6912e81df770ae13f3d036132633ed935badd704fd8797b21c5ad6c264b69055ae22e66f57d1f2cf9f2681b763d91e1346577163fe76957f13321918f4832a4ce6619f1c046a7803899160cca5b2883ac33bc7e342a1de98c4a0bea47f7e61160f1d0a3920d1a1bd4c62d04377d30b153a9c5278e99724f4376a1943c3477b0d7d51d96fd4f22f8bbf518b833306b110ac30c48c419810e4f785143267ad7dd2fcfe78588087380fb7bf340f75b894c9e480583eeb1bf5399d97c2c0c3413977ba347c74cd5e1afe9a328a5d5f5ad3a1793cc7862abbdc9c3b41876e8d7f3eb3da9cc34367ad08a94a97277278d827a60cd9883971078d3bd8a91abb5063c52c0bc94377b2bc3522fed0e15bf02d19ad182d939b973bb85c610a2f2d79f3d0c29cf7058e6a9f68faf4e0c6d0f430de2cdadea0bc5a4da6e9b04f2631153e6bead383d02d67e8d2aa52a1bb8f6e6942a24b18a16b44a0cd2cd42e2854ae34b1b51ddc4bdb5a11b7042a9640c5c308ad0d9186b649f62f36a482c542ffdc817cf4f151009a5fcf62b5d4ef8692d3ef0372797476411ec03d98b82e6fb9b3a41ad5f26724e7a59e3c8083f015eef1bc563724b2a63aa6ff3a3036cce506dd29fa93979a0e27fa73bec2419ceb31dd4d63c600718ec7edbf7ce59f1b79290e7a38cfe7ac752848bac914f4ee07aa1ef8634ea3e31651bb391ed12d662f071e3a6f1f8f3c8d88bf64778af1a3db5b82d78844762dbaac733c62a3a010f81c4eda9a10b9837bcb3261adc8a8082094f1d186487bf4f6689bb82e0f2d64a17735a8443c9500533f15080848889d2bbaa79dfd39dca2851e430c556abb7b08bddb89b4b375aac7bc0326512848962059826409822548509024728065f50378b76a41144f47eefa3464923976d828e8ec3388970eb7c9a54fd0faf98efdace31ed2e116b57828246ec13da07d5665717b21a5dcc1fdf421eea78dc14af57fae7a6bbbfe96e50d3daa3e6e5215999740a9cb7a737d6ae78dbbcc4fa74ed3817f5a9b22d0a70f81aa9fdb7dde439e4b9db636d53f9ffe687d708f5645e62f43ff9cce591db707d162fa64b5983e5957e6a34db4b9e790bab32e77f6fa437b7d220fd23aeed10e3766c93d60977fdece8b4e9f9eb54cedcfafbfeaef9487ce9b8d927b40f8f3f2aa6e6df79b53a3a0dba17735fc3c15d63209d4dd5c0efa37efcd3b772e657a38cf0161e99476c6dab434b57620730cdb32e8f465ad4dde7ca8f7c7bf1f2ff5c3c3793e6715a33925b5477ac47e68d4e5cf993cf109620a03350ae32a5c85af40cc3aee318bc097563e9e76031b06362418d800924659dca8cc9f7760ba8cf6aa329efbe38b92ca3f1a05fd790e3a0d6814f5e8cf1fd028eacf8d346a12c9fef25fc93d66abf1ec57dcc040a3ee8f465df7e5871aff3c871d1af57c038d22fdf31f1ae5565786fe39934ef1cea3a1f9ebc448ee212d3f85f2ca9431bdd48f91e935d347be3f1cfb61d969e18f7f1ca431a50284500b844c409805422c10064168f94a4b871e430c42c09e7e5d8e790ef427724e71a8bdf0a96b9b730d664fed6533d72c6639fccbf664ce2f27bdb52297652b6d7b2ccb5e90e97bef59308ba68fd0da2084d9430b5a4db2ef8136daac4f8f5551ba057d6e390fe749cb43ce4b595bb4ac2b8db23cc62e2e97dbc5562ceb8ab322740f9daff0664108535996f352134218ad5b44a8cfdfbba6291f1d6e56e7c1ed0a74e851e74189f28755f1899a10c6ca4c182ba5e825cb43a954c54a98192f6d3356c254b112c60a7c69c52926b718c94037de9856438af958455a0ed3a758f2abe432a6342761eea8cf68526b120ec95ef8247bb327b994e6241f6dcee19024c949d9a6a34cc56ce67cde639743eb3398edb9307725773e53f2197bf90ac9f6941cc3485e2249cedc6942e874e971933b4e1f2f139a9f2e679f6476695ec64dbecbe7d684e67ba45f4e5f866d975b9b7bd2668dfc39a556db464eda2c92e63a0db5095417cdd196358e749d47aadb68ab0f67c8e5d3350b736b9b7dc2681ecb1ebb1cc3aa3b38b31d7de2c6e13056c258812aecd51f50eab2991996616666cecc903c8783d438c96b3cba0f0e526379a8b157f5354eda48a439493efd6942a60c5eb3c940721f1cc43dc95913429a21e54c1f0f4ba32669ceccf8a8b33473b838448884a654ddc79c999e038729c62d308aa7a599e08f2f27da8705cbe1ec118747bf98477b1f961d6e13830e7b49357eab6baef3523bac4d0c76a5c39adce5cea51c497493bd0e0c93b334878f764eaf99351edd5fc966f39a24eb137fa6642f0e5acd31ad364976e672bfecc50187d5fc62568b99ed21f98c33d7644eb23d735a1f59f4c13d62b446aed3ecac0db1f8dd85b93ec94df36c88e63285646666ce9b45efcd4b47f252b071a46793e6e58e97dc9a0eda90fe6cb48936b8cdac9a1a873de7f9f4fcdcfae01fa8c2f1665c40a9cbfa0a96f7772b2b5e9ed2cea6482649c92c5913c273c667f45269c6f22086cb8b794a5d06352133f6aa7ec6e726a794d3a53f4d88d4794f1342f2998d349db7985c9eba4631741f9db9344a0a89627e6e323e6a6517de9c9f1707de4248a4d47d6d94b4b66bfa7b4e47ee8652956c0196d7f16e850499a72f8b60402faf4baff8a7ede2a5161cc4fdb4cca54ff26a6ef9cc7cfa6d9f1e351d58e47ca9cf38c7bcfa74679ff6fef8e9ae53d5d9de9c9f249fa5cdf5e9b217fe2df96c9ccb47d6f509fa9d331b93ec67a0bd396ff9c8317b35c69cb5213decf0676c0fb533d447f6e6bcccac4fdfc6ec85f1e58c5bde5a9119ab647dfa499753dbc31eff693cc4e76bdab945cd9d2624c36674f6b9f1e43967dca21567e46821674ed3413ae6f465a2adbadc464ea9cb8dba68ab6e6dd71422d769ead3e53669a4bf948fb73e4161286e8a2abe23729d7eda90e9237f9a90cbc23e499f5bdd66e348a7dbad2fafadf6e979dd5c1b82b9747d9a2eda5ce3b0eb349d1bf56b837da22eb75b9f3a75d674c09c3a75dee6762b147ef9e4163ffbc46e5d51b1772b2c437fdd4f299d26b63c1cf7d16f5cb082877f3d6708ea6eee5b7d63ef72d0e953fb7342bd3fc8340ada1fed3a2d64ba4e77d6d716dde9a94f4d390adec2434c065bf183bbe0157b6131be757620f32307d7c58141865550fdf9b53da709998fd2ab6e97891be3341d2eb79ab831df73b9456b755a4775544775347a23ea5c6ac61daa9170a919eb1c4ee6a8679d3bddfa44c9f60bbefd0763c8781fef7ec0841b3ced0c0b42859f05a1c20c0b42e5cf9cc60c0b42b53e734ab3ecda32f2f7de7bef3daf244ada2867a4edc21f39d5322c08f5bd1b3db7198da037997ec3cbb73fa0b7458b4e6d40ed8f4aa39c174810ea97e55b08097f9f96ef6ce5c5101a7f9f15dfafcab78fe06b2e43ab46dd0e6aa146392f8656dfde5afced2efc6f77f9f60e6a945b2de1c6b7379646b10ab8bb47feb64bf323879a10283cb21c45b4a24f7dafd7f1cfb77fce2ed55f1e4e3fec9fcdf98205a1cacf9cb2f6dc6923672d74b4b97fdba54f133212e21c8f3772a7091955c7cea8b787bebd871a7555ad15a9d6a6ba632d5dd4cb5abe9db465759bfd65528749a823cd590b47815df32fe86f837dba5ce749176dd7a46d77664de6db697ff9766c13f2fcdaa4cf0dbe9c1ce780b8b7f7f4b61c356af47bfabea14ffdb6e870b3795e04fb6873fad4a71d6f330955ff3070e99b3eb5bff624d4eb6f555b861c50b783a59e5e6a3e1cf639eb893beba14f2cad84524a282574d041079d73fee6334969ad94485e8af9b5e521c77950ef098aa9d162a04fd6c80fea75432f85e370d80bf0ecb722809d177f723ca01ad5ff3a30ab32513c237140c2e0e59708f36eb584180e08ef564b34a1bad51240ff1c3aed2c43d227e61ffac48ee4efe959d5c57382845b8f847e1d986737d228e9bcc3fe837ce7c509befcfdf18cbdf302cb187f4f3c64af8b8f0e5d178d07e7cef1905b3b745dfe3d5b6d50efd4d8a06ec7c1f618f45297b7c72cb63a87f3a04c990f258887af2d304022b4181de69d3f302dc617313a73304a6bc2395ff374d29a97ccdcbc309ac12c7bcdd9cc9cc368a675114191e8358b5658e65ce634378a399948a4c53b1f0945f1ce6bcddc767bcb3b27751425582abde6526be99373326e34950672838c1b63bc741163a88b972e2b8e420b63e1a076e39dbf312f8c98771ec320c1a1afeb82c30f1c3e87bbdf83304a28e56b96dcef4118a3b4a065bd660b46292d6bce0b8318f69a316b5e1786519a6950d35eb386d12cd33491685461adafb9b228e3d128e35a332691322ecdc09999d73c53ca9cdbee74353599c3812373394cd0647acd26122dcdcc64bcd1549a8c6bb421fcedb426e30d8736841fba1c30478ed79c638a6c885ccfcedfd659b2668a6c885c29df437d724e803522986cfe35995eaa9350afe91ff4e278c42e518c3aebcc6a9db336ca452d514b9d599fdecc669d598d5fa297b88a43d734f471e89fc7a146ddf9a55137822146a36e8d6434ea463022188d72fea296a82582895f7881e4821a2f84e189366a94c0324208257cd07330b001666666f6550eccc959b143e182bff56bde79e10225808961609f3ebddacef6c916841bc3eed3a7c7ce39e7d78d714134ca55575d75d505f1c4e74910ef9a4f1ac58e2dc9ecd85522b0c532053437397d7a39edd3887a737270e814cd8ed3e9defce4c54b313398c6dc5189a42167883105b5f3e154306a037a78165b06dab88ae56d794f3b53b14f729546b17decec70a65f5536a6d2a777bd6b7e3fcb6260071d237d6a1f86a8f40f48c6ec780662a03155984aa3ae23f30f0c1824bec36a59842ffaaffb42070e2204981b1c30ccfd38794e9f8c74f1d2a58b97f621e7a587465df69977ab27c8b8de79e10222fe79c441a3ba37e74e708b1b5ad4c86275a18108377794847ae79019be697857e5a5a64fc8c501698f1eab382096478f48401dc4328cf8e84d46a7aca057a5bf344a5a5c1e15a137b6b8712d2d6a0475188784bf222f90f888c55fed883234b97179634b9619bead6865054bfa0c6f05bd5416a671a2ab91c50d2dd91b5b3e6a54843e6a57b87cc4ac950e352f6d0606a846bf5810c9f1e0d2b3c726af09912daa8e07fb75a2438d4e61bb0d84cc331ffd47033a55c7d068f9d8425bbe3862cbc77ba25f1cc1c5df1c3e9a3e7e1144e6efcd4787dc4e1332248d51d06b6b083b1c107e3783777714f8066666e6666e679e73f2646666ce396143a8edd7ad74e6bff71e143bf837b446c4a101edd6b539e9edce7b7ab65fd635ec93eb76ec6158c5acf51ca3175684866fc71abb90a5dda14fcfd9fee8d3cbe9e10998666f7f62de608b016ba44fa4a1aa440513c4904fa3ae13f3ef3e23af02453143ed9746e7e1b4cbf0ce774ce88f99fd861d2c6fcb62b7ac1d1a65d99eb34e87d36ed91bb71dfad42e379d06f4a9dd32a2fa3b2428e98de287eecf36e7a444bd27d4fdb143a32e0e0d68d475ab0734eaf65f1cbefdfef8761c1ac54ef36e05c50ce83b2f5cc082bff387a440dd0dad09a35e0672ce347028afc19da2e770067aa9d3c3e12d24916c1f8143cd3e45a73718f1e107268dc23cfa9346518fee13840362553fd590c3de1bfe3290e3b0d76bec358d9cc6de5ab2364a7b4ddff6fa0f09a18e6118f6309d76de9c53a690ce39a7bb0dca833addcd134cbd4e8ccb402707a4834077deefdc080781968126e080b0e513007190164287f9cef1905140bab1968d99e853f4ab3ab6e2a3330d80788be3117d4cb5596077fe709885fa8755fcd32acbba5840e988b521fc53486b423a1be204596566ef7669a5b6632bd82728afd48670c49ac4a2b2bdd0564e426d372d99c12863942693d5433b5c420821bb9e3fac1c2093ccc1ecc75bdd9063694378e49e4eb76deee6e66ec80ea105e1a591cc2fb6bb795d1896f5766f18d27f723cb24cd3b2deee1cd2d445d1553d7b868d2e31cee90e7d7260d0987ac2599d1b3a41bd39bc73eaa6d39a1f743c68d6ddddf035ec0d6e50de489359d4b637138d2aa996b8344557f5b34fa32cd38674661a75957a6f78e75cbbd7fc4457f536f096e0d94ec7c345694dedd2300a9fd62c1241e1326f4364d4febeed1dc13b57594c802ad4dddc19f4d029b34fa7852d65a35eb7126a302f8539f416f35219d551807b385a66d57140b087ded0e7acd564726378e8a578cbc3815ee7d004a024a3de161a9245a8d7addee93820eca6316a1286b0f15b635e6aeb07f33cf4b0090e07ba14a6152ae4320fa14fcbde79f5a0520ed2ee2ef6ce9f7090b62d14c501b96cdb80721020e65f7eaf77cea70372b9f3a7e930a550af13e3d99f3664be11c7831ddb7ae7b21408f5b9733c28ccb8092ea5c35278c85678c86d3c642e3ce432d69887031d665b8bd95aa864efc9351f896ad54ca6cc7d8c047a07b30de6e140a76bd4e7cd7ead315a841ece59abc974f9f5cbde13746b0c5bd618698df968fde1b0cfa09f184744507773e3eae1740ea119f5c74b5929e936bc736b93db0caa740b0140929043049c1f683f1c0f48f3e3071728a6fef89183ce0f3e9d2a0d35208b498c2f609c1a5e4c8dbad51b756976dc549ab87a5743c31fb8d9a8d9d97c292ad70e11be73055fc17c5ddd578c31bae6cb61a21e1c0fe815703ce024e3a1d3a7a38d1ac7c4311c4aa74f5f1c9076e811cc8d64500c7027e83792f150fa8d621e0e1979383a8ddaa119e05045dc093a8c961ad9a18d28c20e195aec92dbda2ad49bf3d0735e0a033f34238d5551f98724e07840874e72a909300e74e8ce3899f1f03a273cf4abc388e301ddfaa2667d826eb14b66f638043d0241a61c19ba4d8cfdd07b808e8146d53c4cd140df800c560fab1a541ec6e66d88982e5030a3813b1eceac51edd065abfa5d47a0eee6cad5e5ae729687139d52985db962595452d90366448d4e831ad5df4e732d97a3e02d1fdda5184be344bfd9ac34ef9c36c48667db458dfeb4a0ac4f7de2a2c68fce75b391eebe18a30aefbe1843e87bb391160a9779cb7b3ceaeb13dec871e5e963f72c3741f1b4b3a6019997cedb8a8a2c2fad4f3f14eba5c0b7b612174f61d65b6684a731ebad34c65399f166f3dc7d41461a36cf697e3ab5b2de3032ca3c9d196fcf7b9b4eb54c471b350afce852e8a59e3c9c251c8a81fa94c501618f2eb5482e3c843b45bf92898f72cb478fe1c94b711057e9d3100ec529e8e89483b45469235210afbcf418b7bcf4cb59b0a0671bab381ed2de502d8b4210a38cd7f1b762d7b464848f362682327a1b63e953f4b971963e45ef4d7bdedc175030e259d3017b69312a6ace1b91801b724337e438207c84e3113d7a015c8a91609ce8d15e1d7f39c8c4f6f2131ffd92fee67c641c692ff6f7fa9bc341d617f5d4a7e8d81683ae9825891a81821c10fee871e580e0f828a3d37498e1a190e321e576d3a7e853dacc693907350a4ba3dcca892c8daa59350a8ce8564f005db642e8e373420b7f99cb474d8b1624fe72978f3b97b57cf46949238dba3727248d8ade43a376a06cfeba3010803a2d37f6e8a746b547bfa151cfa3cb55abe0ab408c050a66d0769a8a249a3ed95c796823ad0e5f38f1c6476fdfc184f5ed3bf4d0291c426ea5c4151cbe77ee0f2a7028092ba888c000010101ed5ce1564a40f1d781d13bf734248d2ddb10315cb62162bae85367e1f21dc3f70f49c38a3e6d3f4515df797647e3345b539fda9fd48e427560ca90e24a14644431e6bf784114efbec822c68379f7c5123ff85e39205cc5f1902e5df6db18c9543bce77f4cdc90161930d74a73e45f3e913703ba687237dda29f5e148d7ac7b38aedaf19c87e32f7d7af509b89df970a45779ebc86f4edc713b2297bcd94037f270649409b89d1dec149dccaa769c0ebdf41880aadb999e5920cd339ff68a263b366d6d34309d7a0f57b553ae68dbc3746aa7f0cebc6ef5d2a126245a1b22305a9b22fcd1f9a33fcd88666d32a7d6c602bc6339ef584ee146d9397e22120e6aaf8080bea9308405d0671b073d1ce9ad49a07758cbc3914eb2a29279a90643174140d2dfd04b2179635ede27e6e503f3f2be2f2fbd572f551a52228c971eea2f2da6c7bc14e60618b8004693017a295725e8a59c962d2f25fa42094408127a29de91feb8bcd44b82184ae802b423fdad5e2a88116cb0da91febcbc94db29d9eb247b4d2d77a0740aab50af49835ce5e14817719697c25c3a6b79a9cca5b315070488fa6da7a82e9d53e052548838ed685ec5b4535d56514015530b72a8f26347f3cb4abc748a6dbc936dede5f5aa4ff2f2a979f5f6db2b2354a8642e722ad4475e371be8d5553bdaa6690e5dab76cac8369987239dfa14d1037ae999ab7628ddb24d8c0d74cd553b636ca0b59140e6d47bc89c3a84b607ea9afdd25e1e8ef429605e7ad6432fb35e3d1c895d8e07f4cb5ad63d1cb87ae9ee46da1e08f483a9f851336814285ce69dfbcc3b1adada7903623e14ab4c1880be75508dbcd43c39203a3e7ace4b61a9e9f19a60dc97d347bfcecb47285ce6dbf61a3573cd25b536cfdabc77d9ebc43c17d929481e4efbd64fe966e35c3464e35ce4aa9d2f1f1df51e30a7ee9cda295738db0375919d92f370a24ff112e9e9e144f621eea354c7a3fd723c18f3a7651bc5369b1ea8634e2d66e7c36977da0478e7fe78e75775382e3a37ddc3716e6daedf6913e81d69731e8e1bfd3c15c378c572dabde3dc719006aa7d39bbf31f2f85b9733a37de09a437a8940a17aa73410d42a6d0ccc84800042443150030401c120a06244251d5c40f1400128cb0525c4c17e85192e32885103186104244040000040066363000843ea9b3b4c0f9742ec3511fdb715dcc66180c446a5daf8e8ed2d831a959a78e7623109b1c3496acb55a95d6dffe3422db64c335ca28445414a3bc66fc9c9271bde153f8f589d9eeaac46cde79503efcef2146fddfd306b88f63b6b1126e3fc79091674f8c2d09ca93f06372e48e907d528199e1f5a3d1e9752c11ed95a43f79c3a2edd95601f21dfd9a5a46f5848851e4dc6052b7ec738e30ef7d0b32395e8073d76d3826eef7d9a98d4331df07a0c9cef6904340035e680d9a687347c336bc6e0048e3e42aac9a42dd77042fc774370e0372ad6c625c3228f7eb5ebed0f472d482ccfcedc738c463dd7eb66d18bdb2cfeaa672d084bd7596d924e823aa2e1cbe7bf56cd5d97b00d0e9a1c1c7f30e2f9f868945ac991be9d0bdd31ca53fb5b0bf456231f4c9e4cad08aba09e4be07192e45fb7796cf1a89ea07268a59e354413e3231665b636443b173d1a2b3731d170dbc22ddcc8ca3a168fd26b02d7e778cd31592e01057aac1e901e34244181c79823caf1cef5a6786da1abf226f7fa3e51419eda81d584508824219a50ea80eef1114d590e9009c0794feace502baf3659c8f5ce28f972b73327f1b34ca47291aa07055085bbdd05843a09ff853e9336457bd385b4ad530914bc963d3d93da9bcb8b6320683c3906d20ee0ced6de4675d86766609289a9e2c1a02bde051bedeb90363a8970cc903d1681fc7ea52d653192e8f6438fa4f818375d449640e90bb84fc9927aa25e57238365f3a94e12b293482934313a50fda0a87ef5a15a690390113ded3e4c38de3cd4965d0dc3a07f693222135fa7fa263d21bc87aebb4de63770dc6a27114dc50f81da62583206ec2c5c23c09b17ed6c8ce844e639757b47c14bda9d85909a684361068945c162a335d3ad24c59257f799f4c6c44b2c6a6bcdfc0ada6dcd4477b52451533f8747fbf32a3d2c956990195b9f79d134725a6c10daa3fee05fb368f6c47d62a1fec60ee7e6ee503b652834bb58e73695028992402a4fab66bfc5b38ba2e5e339f74943db20a728261ba9c035f19737c1beeffec8ea2a0d0a9503a1d61012c40b659361c4cbd9621c55af4b5e42a6a596c9a9765542c88119e39e17a3c64fd3b5cdde8fe227ba273a46e74501489acb57277c45367d974d1f46953749cf5bf3717d3c8583e9b784408c78e102cf717c6e77d7e9308c4d3b14746841e3a77171b4e2c754d8073124f76876c8fbb90d58e72dbc57237219874e7c2d7341c8e1c9a1e4c4435abefb32c4aa97809d6cb2cf956b61a93846308327a023a9dd5b158ef263f16ea5a1c4fb8947bcd05e1e67104e9af95f9a101da722dfb4d0bfa5187cf6b060e686ef6dd6952887b2e64258c8afbb47cc319611288b749bb313843944c8ff7246a0ec4c3b21fd24abd8d480eb3de08801b2bc32459f079a2c316645b49e7a80b8dbf48d27a0993642c47f0a4c1d2670b4a2f4e0cfc3de58a92aeb225f471166c39010d5d8a795004e1827118513f25ec9c635c38c4833a118c4734f57164aa70e080c007db5dfaf9ca7282ce966f05ea49d6b35bfdf81b870646ecd8f73bad856fbd1613c74995f54d4910a784ff9041947eea28c4cee9e40afce921de638d691f09dd1a58126562ed4a13a8d7114fab016a25030ba29ff3881ccee114928de1a3c563695092c14902af1b8908b21a4023d93c0cf34bc3449c7741996a89a8d287aadf59958d2357274855e0dd938b1cd86976547097f761d6df342b1ba574af0da9664391e424f083b89c8e8240e8afb9a1fa38338165bc3133d54b9427eeccbfc6d19237f67d684e314a62b797cb1e346f12675529d1c4deee1e9af5b926db2b47bcdc7c9bded00edaeb8ab4d02ac204e8fbbf441bd1e8d0cdb7e5e5b0b063ba98a20aea40703228ba2f0397d80b33b35b9623637080c773d3e17dc442dec1a81d8a50a7224780db8d57517df6231b12872acf57eee27f839ca3581c520a4d8509feb301306a52981ddc3fe19c19a26a06536f444fd7fa63135cd1778b1406af7b2b138039a6c7e7513776e763c7edb1f8f16945ec8471849baf59a78913a90d87751a4a858dd456d08f34620a2b4b9a1912e815927cdb49532d2f3dc5347c3b16924259538a448a3d048ebac9f037d4a5adbd08e0bb97f3ef14ab5dbf10e06b97e76fa86b5b73e9c0b7defcfb6d4dcd33ba21df9b72f8ea06a160e18fd1b0ea59c152e308209cd62a15b0b90e98324e109acd76d7c3ad5f7ed755bcd7ccf18bfbe64351c14aad9188bd57d595ca7e9d89e2141b157b0c438eb56489495b0de8672a769754c499a2d68c0bf1d8170b2f8c226e318ef8b9f4911d510190c0c209216e00a07724da27a9d9f061c32f966866ae980f4039885bf3e1e75e966a0992e2d29b9077939240f581fa8fcb2572fedcec9e11b0575bd2cab7e2f9a58e8f54609f95dae2b7228810f9077e06cba1943ed1749b6e39d2fa3f509243ebd36f52f9762fa68545d8b3cddbfcb0dc1982db87dfc8be03a66353b812687ef552676c75a79d6ecbf54ab10ac4059615ce673c8f00e8b4e388a2e233e2526dc132614543126a10107655d1cb2a3f0bb7bda43333ed46b14f5468e089d0d4caa52832ee3680536831283c6d9724e5289f6d5bdb6c1ab92956d2c8664070ae281a644a6e1575d6668b2f1c17149eb64b9345f09b8ced121d32408d38087603d7897f79c03bc80b7d1dfd283fb740e38ed73cd8050d3204a12124c1a9a45f0c04f6261ee150860ffa6f466096bc0902ea0f2ee4bf1158ee9b67825d3fec1f3b0e9cd2ba3a56f624bfcbf6e323ccda3e9940335042d9dc2f3a0f06764352c69a0dd4b7f0eddb16ce69a900f55cd9648bdca513289e557c9a2b9e31698e929b1798e87d0d161d6b817665dee02dad475310dfb0e86e64393987c11260fe99d5f376857f2d54c6bc949baf27f14d0ff282da2e8df5c9394f62ca2f1baf494eff71431637775c58bd32118b6f2478ac744b5e00a2aae669236d456369e4c0d699a4ef90259b6264a2e84f5265cac051351886ae9be6f3e418fa9032935c5ceb5ad3a6505c97bece411cda04341c51afcbe6da36bc7121566204dda0439c95c9450f49d0b468da80abfe5b31a49aec97e4e2a54b6beb98ad432772bc14b782f87a0d979cf340610daab40b91ad2435635f4e724cd021639aa273edcbf69a8dfb397c538fe5c93869f085e1aeb0419175d11be8ac820f7be162d78bce9615a2a1752c098e1fb858a138a1ee06a353b192d429ab676098c60de596cba4d1e0a05c2ad310f2660a605b6692486acde45b309631fcaf4dacf9949b3349afb64d3c7c06f4ab4c86ebbb376870a384e55e355d3fe6a3c8cb04b358c278784d515b6ec2c42fc4da1a63f1e05ce49607dea86ef5968b9431cddb8d117454782f0ac31e05f91c025da880d8f598b01a0001d885b1093ba83df35abb380a2cfeb1c3406d7df8479e2cecb8d669415f381250d74c12abe5c3152fe79487292daeae92cb2f14cf15c00b9f1574d7ee78063efafbfe9887f2725eb3b4d63b62ab3e3d6fbf96c1bbf60813d02d4806dc2f646ca86b59c22c482b84851be29af9fad8e37a6c6759968c76a667e829a0ee13d3f12db6690a51cba9f790bb442ed285bf8ee8d2e9e4e22442e50f1953c008bdc01e556946125a821cf8010c94e9bec17610d8fb0231f0a7d160db82dfb9ff3b3a9f5e9b59c04b79a60afd5036ade448c166eec523e81c83502f78076ed41effc97be045207b143109bc03febaeb0107e42c31f54e1341d65f67b53b07981bd8722099d3f6f1368be4ec6f1c3016ea6ac2fcce0ecdcf466af316abf290c7dfa05acef6b8c58456aebb5236acba7d6338554bbcda07d42063ea0451212f3ddb75090ed2a956167eefc44043102d43084d148855abfbf7528290e3236297b9e99eb38b02bc280e0a33d8a24a88a4b4065e6c4696e0e91687180f0ed0703842211455b72af9b2b3a14074681f67ce585970f90ff049d9a4105db6d6eeb243ab936e9ec582a2e6e246f453bc9deb3f542fafd743093065fb7a5e9d4bc9df531679cfd15370c86381ee8b28358105f54553218ef519a43950eec8a3b9c0c59048019a3aff8b87c9fb65085633630535990d92658aac6e30a57e7382494217da16f11965dd44d4aef3174c7d3c9cc2197714541abd4651323783d2f1d6082bb4fc25235c9fd55613691b27e17d56671a2212fdb2488056d108b95ecfc2f568e7c1ad163205da12e969fa7c9e25bb98f9f9ec4ac19606a5805010c0682564e2103bbd8b442392a9c46f0c0c00b73ff488d91d1edd69797674d56bbfac29e099f3649177fe90ef9bbc87784ee8c0cbe454af6909c2853640dc0b7771078809b35dd3169f905b827a9d4bc52c6f527d42d529211b232f1c5e2038629ed3eca1b30d28b1af80d3cc0fd4d2619c68cb704e1771d27afcd311eda8114db528766895ad2e89db3b7993df4e6d8ca7d8ada7e91918b310b9a192db90e8ac969ab3146dd255164ecbe75e522afd2dea377106cfda698e95c5e2c8ff17f3ae8b9eacfa021ff1befcf6f05418a465a8715c5e5344e7ecfac2820297b79e761acd74862b26a07ca63cc8311825e09df5b8c30edb531a9eeacce05e9178032365c4104abafadac85f17f0ccb17f8a4b07577ecd191401051bbd11b888fdc9912020c0eb0fc9dda7bdb120a8d4e1dd7eb5d707f10bcd0bf781be280ec089a6d33c193dd9df5e787f1ae87cd778a52692a502d0bb645a90b9f2fad39e7ca281a9a0b29aac4396a84ba9ae452938de1597c8339271a6c69135d77be8b1f01859e69eca8cfd1bc62007991d0e40b9867bf7cbcdd5c2a2e85f0bfda16e1fe31aed38329faa7bead8fb939f2225de4135269178e3c8d61693bc9ef23c33daa6c58ef70cd2ed7c32a343a4b96046bd9a5a4a1f6ba9bfe3ee0aff2a1a6eb524fc1476c4c54ff580197e65a49e849b927828ce7b07fed46d93e1481cd1bbe6a44bd8933914b3a3bfea43452e4004d6c3ef7eeacf2b5ffb68ee0b809bc79b7cbd81b176060fc0154686638842e4121d35b02e3f1c352a2b72ef908a0615df5ba0d0e1e981920a2003ca7ace5931c3288fcf31b629c05d60f51d44bffb7f41679b1d07e218f0fca03c964192712a01a86fa7ad16b06e375bcbc12a876dcc560f23cffb969c7bc7535d67e4616cf745003be1d086a01be2153e55fc5169543c97f99259abd1a2c4b0b87183e5bc4dcad61b6860db581fbd5c66ec5bf2d455681817d8e46e195c0758606ccb628109e49b702937c4de7945ca31cc2e7392027cc955c87454b3f6d6a8ceda85999908e47a36959135382b1f878eecd82802f982aa4d683c2ecb31686197ee4540452524eaece00d6a441fcc0ebc781ed292191e05c15c4489c62b56432ffb60a1da74e29967ba29ad255911075da9864e5df4aa4ec21d9f0cff51dc3c843195c286364c23497da4a8e3119880dddd9e2b334ac4c61628710951f972d4163335afd6bd63177b1d13139597301299f6ac8669f331a6193c884c9d6de2c423406b859e6de43925c1357054cd9303721be504581158168ede5ab76a2408cf06d5852fe5fedee6c3d468b30a7362515df5486a5cb9cd22882eb8e702ea3dcd36e6fd85430e466fb70f94c4d651c43f1fb332bf1ceb49d3311338204d26efe605d164e0f5c2c0967d0ce73a7b5d48affa0ba1bd22ca25f15a0a2022ec7e0156622c409b9f3202f5ae1e0392e048401901a595dd13a16ce15d63ca6ba919c26a087524540426c9a872531120da0cb16351a8f5bdeb3278400306ed9d06126c9f00d00def57c497dd24f20f8e8c67bb3ff900bbb02885c173ef315e1dff018ca929438c674e9b8ac8194e24934e2b0ce4d84fbf031c2bdc6f8467aa763e3dd79e78427d69f03f42ef2d0d675a678870fbf722ebad4a67d370ea60659b7ff6faff16a00e4860a4b6d03f9156a19161e51363c16ed7e583074b1f738fa3a28e03c1958309e6cb812ec215a01f7c44c11f16dc3f61337bb39bf9c446a9ea7e6c855e525ed13e85666f32af7fae3c53e452e8f6d4af4195845da2af5e9d4805f172d199625510ed6f20e16c219d8e88d7cff84d9b9fd1e02c43ed56a36c46c18a0a518cb8e64c331a81952f83468780f2ce44166240fa4e36eed48d483536aebb5869973b5bf05329aa82a38a05f05b06bee89057e9d48ee74b20c8b70a5075abd1069eacf7e661a8c55690a0c7111acae5fc023456ed28f52ee21a17af675e614321ed6f1ca132d59570583dc387aa8f602c588dc064124a3b5d4048a7eeff3ecce876e9f9289845130a8c899b3dcc90416d789715527629c3902e2363578396999d4bd9997bcd72ea195c81a80d58b99ac2f431ee549039e4d62c64148a06f18e69884dfea190e084017f6f83d2611b3e88c6d049f09c6a3a3704a009e1187fb848b52acfccbdb4e9a6890a65837e4b89ed671420338c66180e6669ce0a7ba19128a84282c0564f7610341e6dc824118d9c70936ce500d8bd4142a2f26463cb87829733598747dfca60680ee6b796788c11098fea8db0c507c4846dee060279a6baf8b8d91327e046db6ab8ad28e9dc422f265ce0505319c86cda289840a7bc233236e7a9d015350ebc80dacca853c1eeab3b372596153afbbe872d22d6ef838b419dfae1ff6b84d51a181ac53fd16c7cdda05f991c98ce91b789f3b1298f7c6b5229a301e858f9a87ab2f5516288a559687a63186dbbdf23fa37ce95aab5547914584067a7fce882e20fca2531d44eaca81785b1600e3a2a4012ce374e1cc6b55a1dd35105654c0ba755ccbd04657a8fe733aafdbdee17a9d88118fe26c080fe23d1a16374cb749e4df55a62e4acd80833b659d694d2d424ad6478fecef84b8f213f1bffdb6e87f7c923bdf669f1d425d7e5865067bee2503e23da2522e3e1a455565a06197e39c5fd5326862e26144d114522718cfaaf8d7836f953a214d894af82c89748732238d6f23d89f08dcc7ea8df4e3ad189a6844f065231206dd2d14650f713b6a9590e675dd817285027e38d1a1ed51710a3807c10311782619e46dc7b3ad1cde08bd84e3a71ed651931137f67ba0f64cce1019a42a384265112a6c90f8f0182c4cae05b905b96437409f8e396f4f1c31b4488ec4c192f306d6cf868bb255639d08e69a651d1efa2940fe72a8a92971b07f885054881ac3f012f162e4f7a09bf04cdcf999a3ba322bcdde74b1c68a4fcad442a3ade9b94ad088289507a2023c4461e67f8da363c9a9bd35114f62f6c95beab24a47474f432e05914c512ca15a630931a9828ea0a8cc76101908c37591b9438082a9b0d3b9bf52bbdd571e9cc82654011fc059244e0b34feac770c0c4cd64f12e57be500e2c4173587d9f156bd4d20015502e0ca1a90c225ee5e6464fdbcdda503c6d2bfd38a5220fae1d6a4867457e79b69cadef36ba59ec382c5b8f15d20f3ee95ad670f88a2061c5c333fc65cd163cc3ff89d08dd4f6782f6b248a50d7937192517ab6444e1de2e0a6a83a88ee62d0aaa0784f1e436350821debfed622c61435572b16fca12bd9c817b67cd9886c4f7763b97077a840e8c6583f4da3a3d06d339d30e8ca662426124c14a094769954b2a0887d3bc3c60dd0d973b54d81b657c6d03872226f8052589c57646199478b43cb0d859447458458d4db0615f415e570e145d975cda06ad4b6689a83ce7a9497b3ea94457c22275586dad09a7b3f54d7c556e90ea374f70a21fdbacbb2399db4ec048a9b186cc8e7368977fbb8ada4d0db4d891e74a339216b21a2b15e47592e656aabfb2f102b7bb4253cb3cfab64d2cfa0a349db843fd98dd908c2719bd9351e1478702a96b6e8da99f13f0855b24f31128f6008ed6100ae60ad43e2a10e6fc915a4f3244427fef996823b94181319581f202e83aafce3ce44e27c918c0f7b16e58770e1cb4c6a8893155ed48857924ce667b93d7c7eba0b11d63db166ae73cb62aad0ec0e439cf91c984d9ff7cb91114b935d9b8b0c5f366322a8b50092f6aa09ab558c5468a086d676db61f3625f10214336dc22cae43a07d7ce399d84817ce0a292a0e95a95783067a34eb4ce51f3ccfb0ddf8d880197f340b8383da0a2148bb72f8cff5f7d49a58148626d7494caa227a4f7f7f608c08f822d8184fc5f804238fcc587d11bf4a14646bcf6528bb7d1168a78fc8fc14f9a57093c14cf71cb983bec8a1c7703a252ebac13f864c3898dad88f454c75803155fc18a4a50f4970321059871b1fcbc37c842a67cdf88a1b7590f6227f3816ae3da0a43b65b5712f0a4eb7b20b8c69368d52257ebc33b4edfe0b0a80147ff3cc6a151e13cf082db30d0521a0ab20bd241bd03acfb0bb7a0987490a349ae9fbde5676e4b77117ab613793b2bfd6e85cf74f77c97aefee93fe155f526a548da145a362a970d30aa10319d1b0281738b305b88f546277c6b30c260d81f8cadf1495233a9140e6a1c8044618b25055fb124975b69b9dc452f8e25b8e80b024b0b4de2303b9c97389bf96e4838b5f564fe36599900a885e2ac39d61b19d4750b15806508aec1dc5af3160e5acf7412bbfa93aa22a3e070de87f4048b9fb1d4cbaf3e6adf8f6e0c50e6af8dc136ff6aefd14ef463f32ca35f9a48f257b99317ebed25d7ee7648e5257f89afb788a043fd66c5e8adddc3d61b28cd149b4478450effeb204de8f3dbf0a6d911388411ac5b65b621ea6d4a904d9da11782ba12749b3a2a81281dc7b0832f2ddeb5c11b797af091e24fb325e4c41f83b8e54cc748c19f41ff5a93e8c461911d69639bd0aeff6739dd627be2c7d3c15de41a9221aed853e84e717c853eae03f92a66b99788c24eb86aa035b9923d90f9f6a6eca8ad043240108e116682af562a245c7405e583eabf6273dee3c038ce4411ef0c080c7ecbd005c5ec181e9b14862810877d35d0d36e7a9d2bf8dafc485e2d3d261012f5c83778acb8b03f80731d4e549e2d066b77f820cf392ed14c4dca2a9a0ab9fdab89c2a1065cbddd35cb7269fc4704702e6a593adf6b21f5592400e224621aec4cf607ed5508f5a6da5e5ec47faeb17840d628ad97b78973d42e4c656be4d36c5096942a733dc8a21eb26fb29fca2eb8f8a9d5396ebc3cfd4ab92397bf37ed28ddef722e91e8107dda018afa4169f92674a110d40a998ff7de4597186067baee0d30aa18e8635ec7c369a540637295263c34f25634ec52b3483e5091432963baf4bc22d42200a9c4eda58694bd8b6e24d22238a1bcaa8e89eb524a53496bdc5baa6036be60d55253e932603903711e4b1a974a1a2d01ed82f3dbb2c967985c4340208c191402cbc096daecbb627cbd6b0d0c7125966c527ab82ce6633a1f45047f248a018d2035855028a3ed3a780dff8b4521adf19be8b18c99197fb04d0c0903134fd1525aa7b7a3ac78430ee792b066e903219016053bc918e16021e6cd623df3ca02b99f4fe3de7046a78a792daeb363e4cd59696ef866383cb380af2db2efa0bc3943265ff369d09b1b7f9fdfcb01bdc0d1295b7dbdff34ceff9436f000ffc88047cf38e0c6f04d52eb3de60d682f362490fe15cbb0a9d4eaaf8390fd3c8e917d4f37a7f3515c31717280244cd582039b8e663d08fde037f507bfd19303135f456cd443b1e999ac22e7341d8c701d14fa8c5fa28f3330af3ccf3af17d0e527e03da213dd38e494d16cf3bdc31c3091e00ef52dd9157fe57bd553d880d98200690ffb9b24c2fe2ef5c213de6f5b0fd9f5757643ace8d1b84e1fd3e05c62cd41536fafd375c21ad861dbe56fbb77b32b22d3c985f2268d9e5fdd112f73f3aed3456d894369f51e47e1d794bd6b39df162e534079e3beee1e9066815b85baa09c5285634a23fdcf794781ccab03e99cf8161206d8ef51464ec6e867f8841828e6cadc64166fe3d7205c361e79e58778e4f0224d702b596b33e5b4827cee9d798b82354970e41836856dcfaa146932bf0a5ca6c6b351bf9c79a79da7a5c7299f4c711095f245be4c8c2f5ac7035dc6690ab2dc9bbbb187e6db7e684909663e92c3796ef97bb321343d790f3fa13c34fe524043d2ffc33235cd42e30535a0c2304ccbb32a75ebd2e21d8bcce4a56bb324f0e4ba1faaa082ef552515c400d878f8fb0e110b0e85c139a2f7af7c2b7aa8b49b065e4e23d0cdc136699af6a63363d4473d97d1a145640fb9b17d112b76088bab1e758a62f3ce6055ef34a2f0a807860fc8930516ef805dc13a8c62dac18a1d6f48b72449fe0cdffe181e132b979ccf0ae2250ba608aed691d332809247f69841fe0a1639202b4d7f415ce7eddf9094944927f57c9b143cc35f4dc5821d30de54205d844ff9664a69ee4843d82048bc4c0a92b3b261e873fa037713926b5e5d829f1038379f1c73ac01d48dc7004017a6b22b2814ea906e91e0d0dcd3671e0522ad82bade187c758c249a3976acafcee4403841966880ae9402e753e93504b1e744969badc2d23927d4d8933001de4e8fe23103620559a53839854682e5652dfa6b30b1a5c8e775e8d4f48401d22cfece588bb610fd1e5f4401c702fc803f751d0dc9e8e568384d0edb9154c22a15a5cb647440bd90931405871054ca2abd512c78d3a9abb480423e5b046a409588843118a1aa5ee45dbfd4cd8c80bb34c2991856ca1f33f83d265e0b9499880fff299af2fbb8c968fa4956ab9d3e02e7733c9b71608cf723ee6d50b2d545d4c1bcfdb657fb039d4c4b5bbba4d8f66801b742a3146436489360b0152e40414f0044b8fb80dff2876a9d12bfa8cb8dfc1e4a0f9eb9b3d54eea29935473324807e8e7b8d604c8500cbee8d04d8624d7cfc140ffac6b64c24d93aed18ff54038e463e281a1a2b1530054d5992a4a128ec26392a9ce00ecee235283c913181b1e73643e2d457cfed09f3cb95635408f34e4f2df4a87174712493af61d830eafb7cf2a3f9655b22f2a36e3cff908bab1d63d5fd306090e0111c510b94d8fb044e103ca0a1ba3f4c5142c0fd3fc51a5449f541e60f60c994b192ed80a42f52b6026f1a1130257b318be17fca00f93de8e057c3265c0bfd0bb858304705cb4d4881a54a93f5d58918501d000152717e1445cf9846a8f74a5325fda4a6a90ad04d98887488035d1994f3798daead6a6381d3c69ea3c6446169005da6559fa6daaf99cd229047711988944f7e56b4b41e50003b199bfd04457dcc1726c0f8033e8307ee00706d31027c6c048bf45f43abfa9b70667f28c5d9de225641bded41a8d98ef813544f3f7db91adde1a1285a21e40d4f7c4984b00648ddb2b31130db09569b36ef9d173122e128943b1f3a489a60cc17b1ed652a78e9e80b7b98b512568e66d94204916c268f7e5e5f83b7bca713955df836400ba5599714a0aa8a64932d7be6e6a95566629686ab1d8185f72077c8c4e5f84b3aa44ccabc181abd5cdd1afb085952caa817c1552b3df6af11bbe2cb3e6eb275fc639b8d9e7a339bd811e2f23b2442da68204c03fd297a22c9ec910e6583ffe256f0f3a036c1fb874ecb678c167176d44d223fc8f2f997daeeed3a63373978f3e93b740a8a23bfbbc41d4ac6c40b14012635ae4fd2ce3502469a5d055baaaf2ac4659b4f036ddccefae1e96fc44bae55bb175007facd9ee7ae13d5e3881642577f5057dee6b25c5f2708efad8e5954cedfb5c27b5a581864c788fd102ce6cd5346c37ee54e25fd696b07a2ee428c7c084dfa22ffab92102c135ec1a0949e7b3bb319cdea7f445eeba0a3b60921da011d143ae3c144ccb8c27d20560377f5b8ac2cf6cc2d745354548f1c1df88af27aba7924a7df88df3690977bd36b1e53ef0f20bff181af92dfc5f11aaa8bc37121c6944447749951587171dbe4c4769794e76363241089635981cdc7874b8d970f144864f99986b571fd4e49ca3331fcbadcc0be602d21a92db2a4165b2a49275d71900006f63e043a5a5537170d9900b4e9c690f785ed6ad359a69dced5c7a4bbd7869ab2146ab5456cd2f238d9b5b5277b6f2f807140bc1ff0f81ad732b40f4aed55708a75417556204e0ab3a297281135c4872a3dfbddbe776d5402536d564ee71cbe684f71c4d486c008f16d315c6a64d846e6f0cdcd4aed83dee419bad143e6cf8f42c6654cdb485c43e9ffe670ca1a77caf2d83f98b510e61acdba00cf823bd62d7aa05be8b633ba752e4012ccf8017e0347fe1030c2f8882231a51afd3f0bafce79afc802904b1854c2ebd3d7053bd08340597efbd32151e971a29ba6020a6fe5468b18b0ed92f34a2c5908ac2a5082292d3fc780751e8380b8bf04e06990a6b2ef974c72c7d72b878d7087d37c23b88caf1c02c04d6a01441a4582cb7343502d7980873783b726b2ef76ca239f35e20cbe4be1230ae3ffbeb6165121d58c15965955ba5d00f055e8c92e57719a5680ae9f23c8173c340dd59c9a1be3ea76767516168bb60d8a635c00bb95b4dc57640edaae56c8bf803ec6b0138d19aa852fca1bc170624cd3444d2edb867965b2604dfe163ca174cb164195d3506e4624a9e3314b8b21b639badeb56b34f173bd18e5f23a266bead096daa91792c2c2bc8b3c8b7ab78fd21ea2cb51171b2d3821a5f987ab1f769c13a1badf277b605c5d3633f366450f5e2a6d82a77cab7aed948af5bd76424d985517515a836614e919e94a40d68496d900077dcdecb913138be10923795415c8893004db4990ef8248f613cf0fdc34aae60b903bfe3d8ed0d653d008464635d2b0ae8c41a1c0dc4c5d85507e72d39d9aa72fccee4d9f24967c1fdc893b0644a742e6f9940992f2182770713d207ae9ac71b9f5938c2a8f6e381cce64986ac0d7d4f4b7f8541018eb53fca9b6438161e9ebad82703355bf5a01dbd758a5713f85d311c5f0a904a79ee20fab17b12aa54398bf65813ae3e80b839f8adb2595b1d1d3c8319df12f26d5f366f6bf5b3494109b1471040723ec2ad9e662e745163243929e3f7db6480da4bdc83b241c9db00b5bac9c542f15f93880a1ea9406cf8ace8ad9f18fee4f755a160dfdbf6e9b869082c8942249d6ea4fd88cbf93b5f69ae3e2599a1a551702a7a36d28654e952d6818a424e0a8394d6f7385f6422e55736e5cb8f0e9962c80566ca18fd520178bd73dc1c9408bb651d8e0227ea397f8a810fb6cec4ca98b183f4acfea913f362e6a82697d3c180fc7d360c638facf29f828c1a3931bf760c9bfbdaa49cd1e5768645e164b8d58213163c2392e2b725d4e4b6642c6ef616a5fa7c175dbbaf1e132ea1e92aba292d75b1dc9401f22aa6f651dc52fda7e03ac95705eefbd17b41ed733201323aca4638a76a18a62377300f255e96d839a499c399dbe7cfd967b69a2b9d8e59f4bb45936836ed8a0e8be1050609abf40a9ccc5ede1795ce460c150556076db2c0a622a6d38714f91df04dbdc8176ba9a39548d83d5d76127981e2ed85e2532a5938a21d96b81448e01a9d0810370831dcd1138404d5e693985910143a40a03597ed2e2fb0be3cd2336fffd39a8143a69d0e8e40d5a7bda326207c8fcf72317b061d26fc272acba75bc89071dfc3b0ba47217adf521bf7cb16ebd9ee787290e842368a702630593c01506bdb26f55add3031c10dc6fe7e0ced9074010844f09c3ae4ce4b4214f37552941083223e74aca24ba31b892b8b48998668343bcb3ec1424a9e34922515c79b68e21cfde887973e33111372a494348e900e5faf65b9ad38f213840810c3ac18f2954c103c3849d02b638a958858e8f3500c0e027e04b931b922253c2e3c4682949fff97d5b984179341b1690e8c69df08f5510a2f230e97dcb890274108c4878ffbd9789010a2035f5c0d3cad93b3ec5b6fd2b86ceb2b11e248fc0a1f5efd4ed3c8f462b19f02f6d501405bee512866197d87fc1c941e0f60e09a0b91118a2deb60d3d26046d91e0430f2fde75d1f6b99a6ff06786e44d25b6833452112df3f9ab6e70d7c64a5a91d39662471e1a9b9853193ff5db30f3dfe4c76c3d6474a2209aacec77c945930520a8d3142c0fd061e91f1b96e708fbe58d3ad3fcf7da669939e80bb2e8adb5b4b678acff67826bd625a3e24db5ad0e479dafc8110c68eb7a54f834968b58aad5e42893f83a7a196bc829147364ef9c9762572e0b50756257f4dc0fc3ce6771e0e95f52cc7db7abfc4a4f176febe250a3cca89ddaf931f825af13b12c7f255d9ad4c6335d5eb08917d2e5c706099c5b08c407cd82c0969016cbae79f111d15ab5885eca0bc2db9bc8de52b549c30ff1f0d3715b6c188f50ed2432bb28ae5e65e793cf03484662f8471ad3fb011b7114efe31066a89830831deb3a352fd39c64bdbdf663f4c166a854ea9f867ac9ae22fc36732baf8fc0a399e3d6aae2eb2cfabbe97bfb2676baca561146ceaa00cfb5319d182bc924c5f87ab27bbd33e1559b5ec4caf640273dae2a16b464782e3953b6c8b4de1a9e42f82f001851681548c4d9e8d7a44cf02a68b56353057e2f12d348c615194a1214582ca72bbfc28536ca84c4a808b1588380ab2f3f2bb064625f8ed89d03b2681db8d9fe0fbe496f39c82e1f4e4518e983a76079ce5c1f75d2aaa83cc0eedaac518e542775453b80726db5a88376202c622e02cf8591f3258a943a85dee0948aa8c4af8058162555aa88c3b84ed112f7b2aa1a4284923dc2a611334d7ccc6f0609042bff50fa9112a43a2be8cd163c7a21987db5ce78cbd4a59d2c7396335bd228fb24df91b18a2e65082f005c1d072d0a07689a8b739246893c13a2ef2d6d7625aece84942c811998556f7e88319b765484543af4777f84ccca93d61195f66fab0f0ee61092c91e7f8b9098fdae7bccbb47f78610fe5d630fcd982a523829bb3458eac2fddc72d439859225e34aa458d5a08cf4108b80020eaf71dd3808d574110de082a88b9d871bfc34d0ba8ac217a039531b12872b704802dbfef4f8594e90f86c0e4cc0c6183b6ab4e3ffeed0aab87681f85b98d14a51072f890619780b57f65a3635832527592bf9193aeea76697c58c1c014d90010f0bff32672894fcbe0092b59245f22c2aef6b995805713e0d6d2497c85a83ac9247e91ebdc830175d8e47541e0fbd3efcebc107be151dba137db4b48f6e508ef272056a14ddb1eaa62a711179aa7b9a349ad250fa9e7d3738944e8bc4bafff6d81737d8f62dc577aab7c1e5f75a592a9a6b97512e22194078bf863119cda277351fcc3d681f95a8c304005a8a6bdc88f950ac10a2eae738a661e46d66f9d5d9c466cfcc91ce3db1112cb4fc63f237d306b7e4e7aae2c44ad13649a00de70eebb16b013184790a2b84bdc1fd17062c1a8ab6cd166c0156a900d0ecf2b1d7b17a3ce8535d6e86bdb25b2cb842c86743cb1baaa66e61467a93adb64a5394228371829b057bfb89b95ef88f0e7b344472087ff7f00d87e2337ea508ce5f4a47a3fdeff6750f2ad694de40672e54c82048dd66b2bdaafcd60dbe473f3fe6e6dee4bebdb9d6e3935326e7f5e7f0916ceb99f3342a5b02704255dbccfedf8d4b0c0cbbceaaa9d2d1f739670d861335d98346d52f14c9ce884f81a661f3d81c728f2b61077434e06e6ff89d5c7df84e8deac6dd0e60799e7ab7ee58b2a98ab9c051477da623576848a5a487a17268d7dcc2121d3f2542ff4155124523a1c039263a0817851566c13d28397aecb5e89c8a3115121b0b265c39aba7c4b35ae1f7a477b5b31f0b6858870faa76b9a303204e179739baf32e61b2f5ec87cd320a2d54295a34fd6d686b238e1d4e4d0e1a12aa744c26aa9169be4cfa8e4bfe125e5f0067a81c535b87cc05ead182d158bb25f24c4431e6c216f74e3ec475dd826b745367231944a27345cd819863a20fd4d1b1d7c66c654112fc740190fec8901f6da6023e48d0f1178ba3604629dd4e7610e241428a42217cc539953bda3202948c0c686ee7731c36a56f1517b4c7eb1836c1003a1654969b04844f9598b9b4f5eb6730d434b2032fa78ab8df5c9cefa8f82d41bc41eeeb5e49721a208b4c7911478d828998f4641f4f1354534815cdea8148857977a82f1b8d0c3a9cac2c18566e41bb4ed44dddfad41c7547c9270558274db9eb34ee1ebc3088cd4fe9d7eb92d8294c7c313a0d9782cc4e38f9264cb69cb733e5131afa477fa809648d8a6e95099719200bfb81a6ff9add671ae113100faa14692fc8f0eb533d87b585a4bae90fb2a733c6b00413fe050d3dfa9f22c424431e8bd9cc24c9849a0948d4398bc1f332b4915213c9e63e899c0110790eb082010a9c2cf20aac3c1d7922476e12c595a6592c58ce972de6af0a869cfff56b3ed053a10f238e157e1e0b6e52ab10e7215889809c507eb924d9a4f6f20ae329a78901950057b1e0cc801c7f5aa6a3437717e075dce3aeb8feb54d4862f6721255c4132279bd34e986e00a555272d0a4411ef37e7c44da42c234e14f7b6b13741e1fc482eb55c730e944a4c9dedd2bbb4424aebbfe74a05ac70227f06af33e18d35f0805b78ae65579945d4ca6b941adca8fe80765ea594f6fd72f4ec51eb8d8bb3640d8527c069df25f2b0217cde775f3eb3f572b0331f23f78af4510314f0153da6e055a375011d8973291f7b3345b8c147685f839b82d4cddb17ee834490c2fd33fb6eb995b20bd93bf0198308353875c1b01d016f8a35f6b49417689794d608019d1dc0ae76b092155d32ccdb2cc0b61fae1368f4b8e4520fca4e6c371c4d19c4a1c299670d2f23f82bf820bd4fe4a59f31ac3c81b742f99f47bdc8806e77a52f3158de569f7b661db0fef0c90c15b2cae36c6041e0b8f5785bbdcbdc3c43310c0b840015ee22f97c1916d9c53a822bd0e382fa43aa1bb415608006e372110b8ec2f9a2e25c23f4e7798f24311464b5f2400533d7fb5074c5d48b78e8471c7fd87cdaff7dc5d88f6ed48eef2c441fabee0a8b20e04a4ed150121b785a97c801903af99491ded17e86f8a104c4076094bb0d97ef0af6f145bd3f98ccbcb286812898abfcfa351022c0790e4d99758c49722d4a514f1128aa1fd3822a0ff03e5f17d947700491bd750aabc8e5f82b0aba5da9a80f61b3202d29aca715be5411225bcca00d2f51bec0d92cd803d1915b90186d1b80f58840c1fc8343df45faa4bc6bbd4858ef732477154b31eb01d57f23f3e0d83a9f580fa2d2904c46cf2a81a73b8700b81488222d141ae920cffd5997d2d6c1083733882d73de6146dc9d78010f3e75546405d0c10d77a52ac8e78b0410b0a997671a896a590fdcfb0f9bb2005f53cec630e83163497f9782159638d0bc9d270cb32ea16b2b400950b706efb804d6bf28ca1f58ce71be637419e1cb1019d2e0bac75566bbc67de2ac9b20851d77189b6f178190fd1285cc18ca6e9a48a129e41f1a0bec37e522aa6ded9faa7ba70297536d0b3f9f10f1e579a58635def3990dc5ba0571a12797c167154455282f02ba1b5b19d3f585a45ba7547ecbea2dd85a5a8588e7fe32fe7b8ffa12348320cd241bbf13971fd6e252efb9d0d6277eb0c103a7b3c305e02cd489ab5f7b79745d91ce9dc94f5173b314552275086ba9a501c1cc298bc0a92352b70412e951264ce162dc4d55dd1c38c374852b4b54dbd10fe48fd3ff8be9039d6a155e5abffab3869b8c4a1700bf700cc859186b6f7d16a5dc21efe6113ad42cdfd7d73999f27994f40f17c7d818bd26b190eb94a1ddd0c6c291425c266886108ee48f31f1180fb28544dfd2141650da16453d6860335cb1bc96395cceedc9f02e0ee68b8dbccb0f5a8ca73193651615039e585006544858d34f5efa600a910055997d2cc4cf9fe05a9705dda8a9e3d940c10fd1484ba152e5f115cdadbfdb7435f411d0bacf82b187a2ee042e2600a5988af4075ab98893b80d5808adf4a05e26070607dbcfbfb8cbbd9cccb03ee55c41d60f879cdb161ed640b1a8a126649eb80484a5054657cebf96884d2f8af4de64452de38f5ef7d4a288ece2ad224de008d8b7f4939c4114239aaa23a720e5b0e22fd68bb6d25da6f57090c4a9c62e3ed457682036fbea67381b2a152ac60ca5ad1c20dab371443986c75950897185d932d4de893d2c1cc35b11516c051b22663ca875d0d81d48460e1d8cfdabbdde8cc8f9f286c88087a31c41b1241df85c617a0e2216664379ce1f77aed1ee8c2ed4a97e26cccc199dc9f3e0a356821ed2a3cccc102c4f93efb6c4fcaff2e5b9fb552af0b2c64c70901e2cbff2131e9cd2a98185e6529e6e3880e5304dc6a6de93835f7d21143dd13e7cc0f0c3c395f58e166fa5f309fa3a32466140362ed3f07c936e90ca3a0abaf08c75f6658b244546d5cf4877b4695c4d897f1ac5f64a69903b12e58541fcfd94b70c6713cb83bfa22df549f5a6c141423ee473ba2a80a524afa2e86aa09664ce95702e00a0a0b574bcb640962a87e4b1f4e254720f83f6600d640eab3ec5d1462ed198210a760bf608979124ba99259561da74baabb530bb6979c33960d5e0937b174970f905d0fc7223fa768cad0838a26039755911d1f43d4b2dc79e43f41025954278a837b0d948cf92b2e6e0a2132eba20284ba0ac1bdd3e913d1010ae704182d293acd28761c8051bcd2f0aedad8bb6953141bc07eaaff72e67e3feda79a1e3352cb471e33e967be29f10d86ab31cc01f0d6807cbfa2b1f0041fa0a8a6244be124c8e77839796127b044ce63382573ea92237d263437f262c300d905f66cca8199d85dd980da3f2c3293246e1f518e93dc7a4bcfade82fd9bf2ca2bb78b3f85adcb8b707a61956d343f1fedf1e47b44204e43f1284c098630cbf650cf869e5f7f5fdce6e0e30bc1868992cf02ba71f90121d1c33238354898027680e2ed57cd4c696508be88d2edc03e6aae7ddeb75a76812c9c0164380653500bb07efafce604e7f903fd7599b07a21b881d462f7d642208c8987fb2fcc2bfa22df2e50132f23acc62ae6f5a1e09cbf27b19d9f9fcbcdf5253155a72a395e58c9ad186b5bba60bfb336a0d2ff909b09e7f7e29cbff2b879fca23dd8b07a8f6e849d2ef6299c156ad71fba3ab5a6b4cb7090c0a4bc949da8ce6c22852530fd668b3afdb001c34875e569118107408b7b3f7339b4f150b8434ad46dadc9b6b41d92ea1ef8af30e4e725ad467026ddbd332c424f224d425e86762fc9421f90d79664b245e7137c37b11797d92a9aeb45b30e3fd6b03d6d07add5103074c468469e204398f9b9c9448fb7c52c1201d88d737d444bc1b761e7bd72a054f8e9ab0d437f5cbff856863459d00fbeecc38fc246d92980bae4e04c123e09c15c8a9d98348988a969f05e78865ab68f3ee0acc25384aa96c9a6942dea0a658b596c9a285c0237fe6c4b4a40564b08293fec315af5e26205e9a7ceddefbffda6c6c6627c0dc546f710e782e0002a8d1eb0835676508845ff16e2ae16fc7e66e44a4b880feacaba929f3f88d6a6ee43c3b64414402f1da820ca8a8258d2ccbe2a8b9470163cc0ace89909bce0cf4e3a7745e7869269e72a8b4216e3dfb3857e2eb0c8070ddc183a0a16ed18d064ad7be311f97262cb9e2b2403135eb4f4a3ce663270f33ec524d858e57b1435834157e768dd7130f1eac85b038a40040936eb43fde00428144ed177f2153729cf738043fd16adfe4f7cdccf89927cd97f9b56b8c055414aa1f9c66558d42538512e1c629f8deb900d4fd60c5c6745524fb4af301bd2caac08e1f9696f5754088ebc6f9bfb48a1072f7333c65e13f6bcf7f15f14754641c4ce80827356b1a5ba56d5ca86376e7b4c9268b757ec81010ad7346eef48f258e320a26de31cc015b5d3c7eaee06ad7fa92035bbebd83f3e11999d9933b64becc51483cc45bc7cc56869c0e9dbcc047027a53bab6159a519e2e0c99d44625824e20954d2477b4483761283f6c1e2c843f055eb07327e474a2bcc1b69a5475e1301025c6f0c1ad0fc722909a62182c3dd8f8699ffec82b8bcf08a47dc66306e4b268b064669999c9f68f1d9a99ff78b218f2ffa46095227fb5fbc270a88f8cf5dabe7f25487de01b6506afbb7320eada206d4855acd1b2ae4c44d60911329906866f6dbd6b5e79a30826ef90feaa35860406fdeb013820d1278f43e5048199c83ffaf4e61fe8a0a1ff609d7da26302dda66121c782575f89b49d292767ace1c5d6a6536f49089e6053cd0caed9808e642e4873d21f5c8f6b585651c2a2005c0cf5e1b0dbb034bd3bb8fef4d9ef713622f3e87f1fdb06a3459183ad7b017249655dc8281675cb09c0399496fb64f3db44d17651b79349377f6e660617503756be00483d52dd4ce0417cc14a44a7b1ca8d7179cb012494e84e62b518129a25a6ff1c8dc2a7f291205322108a34deaba758aab1aac8bc0ab4f22151a900a62ae3a65d9a946f0318957190a810a3a856e226989650491613c77924becfb51d26ff9d36601f50c57a19c299c1306b836dbf44b49eb3748a540e01ebd62d032838b688189326ce0ab5087f669f185b3de079785a1b9bcc5d31568347d07579cc7b73636dd4a530acab98b5137188b4eb484f2338fe0f50af40f2a788384e77adff37ce480fd0abea25d952d068d11f07887dfa30fe1adbd1dd21c98f47b77240515924fc120704ef4a1acf9ac09623109b15041130b3c9589148b61c46a0071e7c66d8d1a7e858e74f6ccddf1c3420b3ec5b77557828b3ba5bfb274f40040804454d3fd6f43d3ed2b56ff4f57d2299475052e3dc0b998fea8fa04d1d415fb788c5963fba42af5b7bb3eadacc0cfbb0c37685f11d162e9dda7e647b5cb8ff24d67a71e2389d380c46cb5c7d2cbe1e5ade9a89902390ffec95610c1c227c1e9f8e754d00f6a2cb7d138442ae10dc58ad833691634285ce56c762da1f7b33aed3a2178d64a86ea81b0ed33c7f2a119e97cb38cb41d880c327de6b6e1c66ec48b936339ba5091c23e7581e299f7d31ff7b2a5718f613a14231147827616d78b5d50175e6a432c78d28e9e8e5f6cc62410a11267ad7a97c85751cd8b537d0a82b42346296a86be965cce4ca08128462271ba140853ac91ad3d28e98dd95194a55bd6dd89ddc244e3c66ff0fc20a9849ec30fde58c9be37ae8cb5db1950cc48e5776f6e07172f02c5b8d001813595b9c36a4fc351b16cac187b57b5a7cc55241d767316b87686d487722c0ebb797874e0e21f69da655a219cdbc3d2b52e212491d5f2248d1047c9d82bfb0c5a0be81b6d4a364f2b2258fa6261bd7c911c96b322421c4c843a1e94db6c3be68c81449b15724373baca1b703b9f3e647fa2903b2c8f973e111231bf5d0179d9e4c8902087edee899f0d86fd81eb7a79b8ebe61da0098c996d5c716ca56f3b52aa30316f0d88fe9557b653bd77401a016122565cacecbca41e6892c345bff3fa41ff8bf1b95568e2666cefe88596602f655b8e1d07800a7031627094c6ec84afbfafb810843969273f42700ae0ea28ed0f900783f0417d8450f73db002196ffa6318e130f6ec9ba31a7fa90fe4605054cca744c63ab8676d537f836fc0895721930828ea6da82f1552e2311a5f6128f58112b4841bfdd33e61bc759c3a504053bdb0c05d349a0fb4a935b86a923679b6e4ffaef779e703a91095b92333a4e0736ca19fd4fff07372eec3b186ec6dbbc19b154dc3ea9f2a8c301ce0d42194e06d63828fab9f2aba25896382f30a6a90c9897a3daf727ffd1a04f1190d168d211fe24718c29a6261c2ef53b203d8514fdb93ce4836c2cf77257e5639535845d06391e1add9af8cbc2374447b97fbde30f0b87cb9ecbd5411edcd1976adbe7484f02935b41e9584dfeba82527f59e6bd87962a0fe39e415b876c9b848e1aa21c22509042f50a213092dc5d737e6525a960a1ec8ce4d16a14886fd72cb256028f118b003d5802c8e6d0303fe641c0e61734a01b5e2c78f8d802008d5da5b90e3dbb76e79ba405362040e25ec315b223ce09005055935aae6aca47423cb03950082163631c878dab211f36b73aa878bfe46b470b0e92899182a59872bb6f4022fddcc2231e13ba3aa30e18bcff5828928d0e709b94e91fdd411895c995508caa377f4501c72f0ab93a491736ebbae5b55a7e83ba990650308c2768dc70843c37f8cd0fec9776390fe0298b834c088919964d36ce42cc54f80671074660be02f2bd9456a79a2e57e23e02b66bd2624cb183b841703e0d8c6ef2ede6266f882f750672fb93f4b9c69a1cfdf2ea665a1595de011c8275daf0a30f134cbf37285815755c840f35417940d3564778ce080472720858efeadbcd29118b41c7ba96b7cfa88984f8e335e95507870f00271f4047299544008eb3b82f45914c8720eeec2e22a49a7a939dbc2b1f516133e779a55dce473c0767ef280b36813a3648b932c3b5e4dd23a198271aaf1401559882f889cbd7077ae10a3c65f24c8ea53786f65757af19bc926fddfe7f9b29b72d8d8547e237d68efc27733289fb258afff9258dfa60c2c15562bbe8a84de53a6e311b63863ccce9d36d8b1ee83b10338efac283d0dac4991c4df028908ca6a8818cf958d74425a23f3bec858357699f15d6b6d5685ef983c5ca3e23ab5e1a1b1b1f5bb0ab9caf6385b365ff0ef51f7f2eebed8cdd48f9e9b9a45e16177f3bc2f82886b50815477e3d712d8b876f93586d5f15f4a79d59ebb3c59526aa0a6cc625ce4940f7d540e79fba9a9fa07dea01a8630c795c8bcec0ffde6e75f35435bc03b150e2fe2833ab8e4d338ae2e33e3fe1f2e206869cbe8931a083b3d60852ce78e577ff7565772448076c0a6c7499335efb470f3ece08cd1de703039d04e2b9ece715e4fc83b85ee6808b42abbf9ba792828105f82f657c47ba8ce4fc73c332b5b94ee8781d9e4ef65f70a8590a2e2a6a143f3e72423d6b4a37814737a9d54d387f0ceb464acb0ec53810092aeb0f9185af6ac114c095cfd8e4de107190bcd00c4f1b53be23d8868fbd16973752160db0c4021c500cc6485b58c5718c3ff58e3f7ad61a7cd3d1054aa3e1616f8329c672640b6c21aeec5c04208445f7be58e11ad8cd4b33c77a4fe8fd51122bde0801c8bb40806e5481d0cd73c41c11d71ab4aa7b690b8210525f1b1509a5a01efb297334a6c3995380d29715d17540675f288117064a644a7336e37f302246c1e8c536e00e1346a06c532a1bed3d29351aa2bcc7d8e62f1ef6a2bc7423e1c99ca48eb88acb555c38d273e20f7944a8e4e41a3f8a1abcb392015f751514397a50cce2b3a9097c60d971eec269a033c97ea2606ab2fc3ab299b5fafb2aba72c533fa87a89e5148c6572996ea39229da3b9312fb83517da3b06384c0525b2a1ad46a122d9cd9fa0568e1e2eec75d2c35263e2857e43fc3d712681879584c6350dd0cf503bd0f347078c8fac05856646b6059f058e741316f7edbb171be65ace011e30c297848a262c30f62e5a2da016c99ec101e878760fdda497dd9b16907222dd97e4fddd2c7d3a2a5575da949b5063365d0085cadd25209a07e574ca8b790ad2ab1445ae8578aead028924b19e40b98df893a615ca6a0721ad3df00335e44bad441e2ec87b2c2119a4ee2d555c4d7c4e6500e9990d514c9daa1cee1594dccf8a78e72b954899eaf46ea2ebcc0992832ee01ddc9ccae964313b57787c74b484740f5722b27a4bd0df560be3bd9b745d08e5f25745744fbd9ee2bb658168688e283c4e365301bb529f0513f064676d321debe991b069cfd82667a56746fa1bbf90f3f3b184fcd119672be6f5472c3a7622bdbdb59b3412e223278b1fa5d44219ee9812106807c6fa5d92a4a5ebc828530b87525c2772aca84370a140386484f8ce112ebd650a9dab52c78f231d758e6e836c3ed5b4271710ecc5d5fd55ce2291bcc0e6151dbd003aa8d308810dce7b46668692dc845a7e03c491bf3fb5c94a6de939981e86baa15b3bc23e5ca6e2080539c3b9fd7450a6bd33ce23995313fc7418453c8f3a95c277387dd2a1b1358c90392a9d056e10f18cd59f74dfce3a8873370796079ea1aeee201633e3bea90e6ddaf92623b9c1602fdf6568d8dc15624778e2efb0ab939609d6e7065489d2a64b9cb51a1e260ae9c0e82704250a26377477697428f276466474448a6fa8e98b061b758d31f02136c18ceea5cc26b5822d406ac1a10dfee111455a25823541a40e2f9ad91dee9612a10d08665d6a61e72b6e6a1dc2ba542e7f2cef6bd11a7a817b9608ef0c82100615291cc87149102f875645e26e5664bb9875a3add62373da9a741f0f874b337979e3046aeb97a89fc84caadabb2648919e6664983ee28c19029e70560c971aa133502549272316f4135295acd0ea43a5783a4b50a22328aa99212c330f48958a651c8cd0597b521dbfcbc1d157aa490f35ae1333f14ad62a0f9d67b52e312225092f39bb84643b6bd3fb8dc6534a94260a07879cb585dea8edbb7a8dd9adf76d9dc05cb532ab8118abd01e1fc4a015963e61b5cd99c05fdb60973e947fb50c9708f3f86e69c36a1973fe650214f1c32e815a72de0e939b47065d4585466b772be5cc9708cb55d31ef2aba2a7aff123fa059ce7f6e06a0ebc38fbd657f82a9505615d2c6b2f8286cffb29b7446b7cd840be21418005544b863756eb5e76ad412b4e5c2b579b2bf9beb293346bdff79325ab47b2ce0315cb8f788208ee22852c137c715ba92271cd0341505e716a41bbb3f8cc94e60a6192984339acf97eec9bd6f37ee54f1c4c01fbc8cd97cab12603ef679aadecfa99864f71933e867c006f4fd791a04473a157c5ec8fec0e59cb88cb96a4fd2d5698d3a349b635ec9a1c8cc394fde30a6aa5638b857a2fb6c8b47b123c1d4579644862c7832235d87bf68d0233f1cfc89d957783a22c4fe3f1d429db9cc6acec798d7b957fc6b1526b64c7a64ade1b07a89e608eb5ddd8fd504574bc81bc4e6d84e390b6b7ed8599ca155ad3c689ceb880aa16aa09a87e26e3f6e846f800178d1f001845f532970d36fad421cc7994e0b305800c2d6d161dd3f4a9d40f146e823ef21d12f7186c03cdf24da36ddd15d12923f7d42fd8e4591131cacdfbdb3628e748d9abc6c1a771c054fe2d225b41ad2af1b85b62761e238a919da3a7122ab21388fbbde85d626c72d13848bec526acda98c4d336b2672419688387a25a89eaecfa7296abf9595edec91588ecf975d2607ac83090ddc7a0b1677002e1c53c05e93537d0851dd5077980ca104c3e6a18e247b2338d280d8bcc3140b32e08dc6b75231cf32d29a481c8a5f53cac027215d003ea19a824befd0441215eb577cd374a6c3b0bf381d416fa3a06c0d7d0f978a3acc5b358cc32f917098820079383ad4065c74fcd400ed64a6f810e2e83a5ea1270f8c60754ce2f1989900a94cc418be5ed2398ddf079387580d71a54854dc57113ae033a6340db212e2976bf2dcd5e4c0d086f9f1560991b2a39a600569cb692b34c0f950c1be5d0e8d403987098cfd9ef13325492af6600f845bcf6568a8a111e0e75a937c0c0ff3ffb174b3d0d7629cb242a39a0d14018058682d1c284f611f82fb8235e5d20b478774fe0f04db0861520ec2b4f0c12ba3d1933b1f6b2173fede38afa8cdd5ce2e3570c9365f75f10f665d0bfb8adb7ab7924e217d262e949345dd88aa539751fdf4afef12f610eff0f3533726c37f8cd1b0011596388569f4b11d59e22d766d09e79e004ddc2813097f89817003094d2fa069c1958d06bdb0614c80fa78e297df0986e83cfccc02354109eef2243bdb6211044fda787a8cc8b5e07a00e81ba3cfe26930b9a8f792ea4dfb861f1987a35370eb4fa91fb0653264c01dd10efbd37cc47cded57fb003105eaee7fd7289f2f8269b2ede0422f2344e8dcfe31ad83101972037d04a0c730b1da0138287b9f590dbb51a3718ad0d7e36f38f7a087305461f14d7908e91faf9dd82186da6326ca19d4293e3dca2766b4cc87f4d8511609f545a6504742ed9581c7e7e937f11822a548f93a51b9294d7a816baf542fa4774737f6dae9599c4fafd60d7dbcb3d74e4fc18aa9ce7764f17cdf36d6d1ef980ae540303b79e04df084e9caf1a5b1f41f6df25b868041babcc4bbddcdfca1e0c4421cb91c238ea4d550a53b66062e53cfb7329c9c3bd1be94cd933bc2482dd710bb198019cac0807f9edef0011c4776ae1cd559fd6656ca35bc8b3f3f2b12b6af27a9dae08e3dd2fe3062ee89e21196cc057de5b23155e681f8869e45e5d4bd459bb2636f3e1f78867ff5d49ce11944f1e271e7c4a8365600be125490f499974dbf70c0cc22014dff9194a3b79a460a38f6bfc7f5e9bdc1a6fee9598b6d9082bde2f9fe1637e57b33a76dee2f4e274bafbac5a8a758746819bd902eefd8dfd2695a9ac25700c4b4e4b59ae75326e6ee5c33658ce338c53932d243eb2cd3900335f1c21f71b17d639e033cefaafc23c6c0497675da3722d0157df4f005019eb0f0b4dee336b518b5d86544dd6c847daafe1eb07cd11e7ea08bdfb9b493cb75a756ead99eb14412e4b2078fed5dc3db0ad40f0b8907abdb7b9384ff0518e7fb5eb1c35d1d49af345be4a04ccc6e38049abf81fd3e6b7def674361869539318ebd122294fc074007463adfe131c4fedab51fa724dd8b58d39f098f03862c7ab32c2a1138edd48f548de2cbdbfc2d508c1cd8985ee32c80aabf16ec4b395a740cf4a9f68ff4422e582fb8118466d5b3b17b4f2d4ffca758c3beaa148c302f4e38f5ad6fce62090f43c0dc35bc49bc47b148d2fd4af41a97f3cf1aa103b6d2373dfca033c9003e2a719264835643ea59e065f679a92c1b0de900ec111cd47ac82b9f38d0d4ac1e0e37bd94adf171f7affc85e4cc5d6c616cdd5b41943ce7fcd5c241336af736cb8ee3c08d8f110c48fe3bd7fa754ae8e653b4e9fc84b48cd009bcb3cc10c921b5230f6521a1e1d5d0097d90378aa65955a1a8940960e48527701c14f632c312237de687cecf81db43be1146bd325a296e68199e3beab4542c77fb2d8268fa5c16cf5c112fa72d12bd9d69c1b49e46a2923964a04ff065311ad6d663224c578e5bf84e9b0a57309d9ae2318b9820afe66b2155c40935945947b8fc95d03dbc6c7976a3e13e7a8f6d73914527cf25aa558fc187d2fbe215a7494228737dc052517a92276d8a15297dd01b6e1ab70fea69f4b179afd287e60d92518aebbd9cc467322d0a0dd5f456c8ac3bf8d16d49581115660018b37e4f42bc949b1aa7bc59174b175ee42021495b14f8a915bf6c5e997ecb812717772ffb01edb586d407497981cd0332ea2ff3af7880b000c6531fe792d3e26f1b8ff087aab3bfd5a015f696dcdb177369d9d8dde6f77c11f97f733addb567067a1de3ae95ea7b3f9d1b50f80a33c65e206ad204e3518424254f57224d61fd356fb35e977543afd34fc0dfd1b714d6dffd91caea6a58b164aef4429d4d0ca23d1d6726ba636367170402bb00bd166b23dade742be010913f7ab1dc2d4d9d6f0db97ccb57619f2f51122110da974d037bf62e72f9a566fd1b5383a0fe29200de30c82f16b24b62f9d49a70d8a09cc3ad0672f3a6e8ef1c5648fd944e70804991c988d70ceace4f5eb0f5370f87b8c90eb0fee0b04584394d75224a41df6ef369b00d14d17d56b74ff5d979a9e68ca5904e22a661d18f0a4c11f6dded4587af58f9049a624d67e8b75891322446cd3dd8b4cb104476a1b44ec15521a9c5496fff9d6bcea8e4d04dfa16f966bcdcedc1c99b711b81df04943d9a4534d9c9c3ec76442147bca90b291c389191da5baf1270dc88772d63038bd841b52bb4b813566901533f74b539b49eaf2e683c8b6b10c1041f90b0e6f856adeb083a5f0166b3fc9302ca0839c79b04a62d4ba84c4136d4e8b82f3b83cf1e0fe329d1416f5db339a386d0f2173b4a03811953191266c63a61ef9650686bcfe30ac2614a77d4d2176a018cb095420c57caad5ab7b42c348212cd9dc8021f9e5802763751cc5eacd039cbdeb46702c8c12530e1a6f1228c811bcec2a5a5519884d17844d3951659c3ee8c0768d3c2d75238048ae45bd4d531006e094365201b09b5205f57b78d5b5255d67c66dbbb9c7705029cc9749d412a3d5ed0aea8bb24dfb90d68e6b632361c71d234f1084d2715c853142cb0b35fcb56a27375d5a8b6652f56c23caba78e812fae48059f5cd836c920b6ca5a202121edfcfca1137dbd973d41953849a071dabe01053128e5ee6cf0708b0a967f3ec69b5a64f9577e701e268a0b77cfd034cf7025ad75a8e58309c1137074d3937cd5e412def3d6e9aa391c1ae12e4e2bef951ad5247c984f214f813ba0afd819d7406173808669801100030901c88917b72b84dad3533774078d2bee39192295bf1dbda68c9cade22bbbb764b99a49401dc088508a908a4f939dc0bc4550076e8314944683bd8f8341300874a6a019334bf7487d06ad8909bea47c9435869f6fcd0db514e69aa31d2cae11fbfc2404a53f45266874414991ba4d0d541b7eb3460f95a0d2bafc02876c89e335eaa27f6fc99443455981384e6890d9baac2f884b161559334dfc665b9b298a4f052f170c396c09e6c12d174a9427b820db3c31aa3c3b33bab499a5f91b854aa1d73a9341eac1c03dfb02437591fdf9eac8c7de6f2d28d3db9a9c67869fe45754c88b7c9d54163571932c4ecf935bf97e697dc19ece6460fb307014801f8602b14329a6a4c2ccdaf3188267bf252586db04faad39eaff96063cc31daf1b5918c1157a3b1e00637743c31d40291175e985cb884ba7b8c315a62d44f470c96f8eeee31c68879213d55c3c0f10171c58d7829becafc302faad5f13a964573695967354bab4c8dd7520e6f17bbbb539a8dc6dd8a492205965faf3b672d77eb5e93d03a9bc5e86158920bc49274e8653d316747cc0b1951e2537710085456cdf6976ec0f2ddaa61891f43b47ee8ee5e659e7aad4960f94e3f4694d051987a0da5218b7921cd8079513fc618c30b934c4aa6c8e4b2c48feeee2377175d96f8d1472293110e2e38020912a868f277fdfe1205f892538ea05ad5aa37744526a1c5135a3fae64515c992b581738ce19578e084213b5eca86344919aee78e54988e3bb9ceeb5beaceeeeeed1dda92b21a9a44db8cf233724a5218954e3e4b223eb838b486714e2531a5d6a41c6af3b4cb6bfcaac79a6503da30e81a8767c9ac32b07587e7cd0524aa9534a69a49ba865531d5a60bbbe26b5824a9f9366492b13538768e323f2e46fdcf8619aec25830b891a649c31fd435e9a4ff2d2fc909b7e20800e93edfa46166694738fb6db58c2040e43fe35e6934010af9922a2517d4a7ac305175c70c10517ee5c540702fd41deb841001c7ee2ff3548243c0a856a4552adea3596ac93c6182396e40a638cd1a5eb4b4629638cb1b34dba921289a4922271e95058d2c149c258d68faf7529ec1f774cc53cb1e7be71c3daf37f0899e6caac7a34433e425c5c9dabe31e536e831db69002092dc4d82c7183924cc3174ec801155e5061095291309cf01d53377862d349011254c1450fdca002021774d8f40a5d8851240c2920426a0839d8a005dda68f83524a3dc620e808f69cb389ed083936584314aa26080100364002dc1a1785a08f8352fad84d09684209495480842a0c09c30afdd04c39d9f49f3e69a67c36fd1b3385fe0f33e5db94524aad26702806918d60fb9e130a2d723fc0b18a2ab4305362155518d9fe35c934c99912ab6802915dc1d8fef526e6a03411c5dfbf23b31d403f7b91f5f535edeb674f3f48114bf7906f351020417c1031810b884ae526aa7a686fbdd7fed23d2c7e8bb3b52cb2b22cb2b4c801d96b0f01f9561b615fbe16594688acece38af7372e0652a4c7f69ef7b8bf692017c7df9e61f9971639407bfb10d0de6a238af4c06fdf08efb587803502bffdb812de90c0fded2f2f7762ee5ecbdc7f1f6465ca1af0e4d140a40caa46e624515fae375dae38faa6e6d8d3fc50a2b4c8fa202b1f192db2341142405ff24156422f6bbe970fa4480ffbde0329d2437bfbda5fde03ffa781c81ede630d447a1ac8cdf6945469294d6525fe50e2cc2c8baccf2207d08700fd2982407d292fcbcd1644c05083cce9b4c2fdf7457a749f7d963df73db22b93e991fda781cc934f999a7d384fd944c9f8e906c74f3713a724877205e54f8e5eea6837f6e38afdd04f9e9f0fa4488fecbb0752a407f8d903f18739c0caf79c0652a407f71e0dc4f3dc771a48911edd731a8847cf2ed34026a895902b9f4ed51befe38af7e1acf1b4e8fa202bf526853fae602dba341142a2976a90958a33afc071450401b992bd5cc9defbee8bf4e01e8b1c80dffb1ef83d0da488f54050db1fd7f4c0df69208e72afe1b4bfcd7ee3257f2ddfc415ed434769da88227125741923ac16f5f8edfef6570329222242fb07c4154d43c0ca71e20b19c8e0c8e9b4e24060e6cafd23ec6f5ad423fb0fbd66fb97bc01c7159597dc8d7002204c610a494ea795b872b51147587dba3845ae408422a04ea795ecb30f5db5fd3d26700184a47684c20e3d539a2e70262282aabce47f635f9ba6bce44f0487f58666fb77622c1c37d19397fcbd83dade81d9de396db772b67fbd59559c9ae3a608838a917153a489a9232ab76cfcad1b7f6be5a6b8e24f4f6eaa375e5ac17448652e7aeae890a2b67fa427c7c95e0a705cc956e40e1da723b3230e47e020f4881944529016708d266bd2e93292aa087c477bb949c652fd8879007cab5327adf6f23a63bd7579d0d2f400a69d1d5fab568c28925624ba54144e34938e1331f4888b288d1ff21ff9ff4cf16cff217a4c1387f23f21f2038eed4ea368b44370bb4cf59f5193ae1b38e2abcc5a6bb5ae4c2fddc961b4ac6ad5aa3540f70f6bcba77e043a2fdbb900874e4835664ae82fb13ff66b92a6bfbf8bd4d8be539c0264fb5f165f16bb76125894fe9cc0ae1ff3f5968e92caa7343a5a03741e21fe15638e121972508c393ef9dad7f697dbc59f622fc5bf640e4f05adafe35d1d86334edbecbd76d3b80c63dde5753e0bac1efa71d09431cb5d62dd4b42269b6b49ac1053fd0aa0b15da60eafaa434c75188aee34a6cc0fdd6795130acd46c1d4e1ae9962b263c9d6dc7a0e6d9055ade7cff6ec4eaeb1743770dd968ef50c6eedb29ebfad61d6b3b7b5cc7aeeb6a659cf786bd67ae6b6b66d5bdbace7bb35ce7ab65bc3d6b3b6b5ce7aceb6f6d94e8e2b9eb1ad7dd6f3b535d07aee6ccd633d5b756b20eb996e2d643dfbd64aace7b9b511e8e3013fafc3dc76ad9661b14464b2b9082abd2c4e5d8740f6d447c820753a1777fc18e4053860c31b9c1843129070041cde70c44acac31342f67c27c0f6526344119dfebc2c74d39952b2e7177bbe1482889843c6945f6109445082913288210a2eac68ff1f668ab55d872fd1f3f505f61f6d2993ecf954655a24f878610c8646d8655d17384948c05859385d2668a2aa3a321842b5b0a418e2f1a2970d4e05020ae6beae0b0c652186c625a0aeebba2e1b1abfae1854615f2b58b91efc98239ee0b8432c8416472c1c82a2ee989a418d65875cb27ea40287fe4f4835e6ff09a9c64c095f4e02ba640c5c35d62ede6fda05c49e053108ba5f1f7f3cdffd3efbf835fc598c37fbf8b378c3f1bae2456bcd59859929ded7af4366caf75573b83ea7c3cde36836f85bee1e733aaca88d61864c12fe7879781a67311bebf0a5a26a57abad15e770db1ee7ed316ae35aedf6f8a5a26cb5366f8f7318029ccdbe5494d55b85d9e14b4571c086033721c07126a6005351cec4144a503d122fb16911a41cde9c7d15e7b697d13d1d76dc83cf3dd521b839bdd91cbe80db653f1eec29f9ebf35463d05fd8c371dcdf4f47b9df74f8026a9ab6bdf65d0e6dc769df732fda7359d4bdf53c51a7b5b76f5ffb8d7b2d872f9b5a8dfb8fd32fe0d634ed82ef73af326d7e0137f7026ecc5dfaf9fa1c057db4e7aca659eec2d85ed8f2c8decbe1cbf6aefd7d9ca69097b810dcb59eecaa3b93257097bddff205fffbedf368fc7d3a0441cb795c9669dacbdebea6e02fc749da3610fceff31ef4f0779edbdf7f3a7c01b7dcd91cbeecba79b99bdbe610eb4bd3386eabcf71dc5b2e7c01ad66b204be76f802ee0ddcf723cb953bcb9e864244e065d395e8051fbc600a2fe0ee80f4820f5e2085cebd2834fb5f0e7fecafc3efefdd6ffe63bb0eb7f75ec5b3e7b8ef3e3449dc6ff9b32f2ff798cb3edbaede34f79ddd9cb65f8edbcbe18bb5754efaeeaff97b30ffe9797f1d964ced7d7edef187de75087ebc3c5c7bb8d768aedbf61f7f2d7bbf3cb6a736b49be3ac167defd2bdfd4fdbefac73f6b31c76f8bf77abb9af5cf61f0ce0deb5e87b7ffa5b167d6f7f0bafdd655af4e921e216dd77c9fefb9bfdf799bee224599bc31fdebd65b71c52aa1dbfd52ef83fedf2f9ed5566975fecdede7348f58bdd58739f8f8e25fa876fede96f3a8c21a87ff8f63cd53c1ee75ee332e75ce7f6b7e73cfe147bf74e87d4b9e94f759cfed367f6987d2e63bff965c15efb9ece14cf7fdf6b5f0eade8fbbe0b71588716ece877f4fda9be1fcadb7bdf7f0908b245debbb87ff7b8a376536db50bf61996bd8a6f5cc67dbc5c963d17dabd3dcde18f4d414ff5b76d0fda3c4f7308be65b50bf759f6d9101fec69ee1e7bdedbbaa7df3d7d4cdbff6497eed3e18be53e3ea7ef6fd97b4fc6796e2f87a0eee4ecb569b91c666fb5781b10b7e8fbfbdfdbec3dcddb7799cbe18fcdfd97b7f7b4fd9b5d364e47f7b8cb91cbe1f5388747ec4cb4bd0b7dee376db20416b5d0e75edb179b7d941bd3328d6159bee7b8af1c167181f0c7fc8bc5690eac90832bb87eb1bb0352e6c00a39b082c7bf1d68f7b51cfad81a47e98659ea631dd6ef786cff9384bf66cde5bea4183f47f1638c2709bb96e3eeae5499f5e96b1147169b3e888a4d1f7c8d25939bbe0bf8f4ab0e4d3e5e06809edaa7df9768d0657bfcdbd7d7b66c69211fff60e3b7af452e0838a6a68842d3aa8db7c57bcaf1c0bff1d0fefed68938ddb2fdd5f1e9d7fb5e0eb5057cdfbde31c6e7f75c91878fbfa352bc07b2c2f03ea532dea9efe7d9c45dd6be1b5392dea744b9ca4fb9abe3af4b1e96fa1f69d21e4fe5e65e21ce2f734ddf7e95b7fb5cbf79d76b18f690e37fd83ee4f57fdf8e56db13a9ae81fbe415f1febb044d390fee11bfc0ad2a1dc2098c32336dd5e568b2bb035df9101e1fdedb1a69314fef00dead0884dadbd2cd9531ebee9a6e924e1bf5ad361fd1fbeb10e7f38a594524ab7d03efb26764bb6efe39c75af85767b4fa7e9df7bcdcb21deb4857baaf1a6b75771ee7f92e86fb9fb9aed5fcff43ebc3efa9e4c67897ebc3cb878b54bf6da675af883460660fb7e96f1c78b392d22b7058ea929846ced31de3ef6f6719a3eef7d9c268fa7c3eb93e32cd5ed6ba976406eefb71c66dfb9da05bff6da6be06ff97b30b77cf137efbb1cfac0fa7ecddd7b997b1557995c9ebbcb61a67fd0adddac69bf8120bb5e96eeb77c1fe7d0c7c6dfe596abb7fa1cce21f65c0e8f68d9f4d5e1115bfbf8836efb51ee4cd3d9abcc2ccbc77248c48e7fe570023e765c61b13e5e2a4fa7d369cb8f19f0b17ff88ed2b3e5cf209ee32be4e440ca5a02fbd3fc92a5b0479439834e683453fce9872f56cd969d98235e9ee98d3268716a48c0251a07053cb7fcb869bec2bec03b5a110530386b472ba420644b182de405961fad8ccf111740b2fae103098eb5b2b1c98234d954ca260a118506549cf69ca914864aa5accea4993253661a99355dcc9a92193351136562221a85e6101818199f29649e2669fe3cc998e18943b01443e6c81c0c9512c25723712c2d576b5871a8295229ab93521d9147666e6cbab099b1c1828ac3e1706ce818333629cc05180a6341344d9597b018a45472da4cd21533362a1b1586d2c291a94a51914292e25033a9948d118c20316293ba68666c529d8f362565623cb286a60b1a1b0cd5c529854921a7931c022361240ac80790e4d44e0526105f2e8064f5c307121ccbc6068a0810a100dfae6544a9f388d065a118ca060b2a0ca5052ca269a6b648a552b20d1c6aa626151c181c0e8763a9b0a905d8d410f1888dcb3263713856a498104d1c0e8703059b8b868ec1e170604c93a567165385a19a7021545256a7a63a99f45d7cca4dd5a6a66c523765c0386e7471e3460f73140af5200009621c53a2096b0243d9146acfb7294bc534552d541b19549b0b9fe83c11124618383bac313135688116a3c37830a04579058eaf7171d228a34fdf42973d55f3a469510b5dca5aa59452ea90fefcedf247fbaa5266a1c59390abd9136692865498e9f452cd13b63a970acb347b370e77de077a3e36be060ae19597e66b2533f2e666cf1c1c9c3d5f2bb126f69236526562221a854420191f19333c920d336c9c48e0f052b9114f09e1ab9147bc3465ca658e4cd57c2e22a112ab3d8bc66324cd9d91325e9a2f6550a1dd59dde063c47367648dac3111e1d08d64d85861622a1238d879c22717162e55fc0b8b689aa76b8b3ded699e68587905feac43137b9e685016e69aa72762623655d6364a9f12850a5d37c8c1ca2b74b01e634f1ff0e1990fde1979923a904ab0c31aa39da038c53a02922d614544c0a60213b879990130dca7b3f1414dd7759dd705cf8acfca871f800062c4c48889111316c7e6c807c202715966b207e2eea0dbc68e9fc3c5b4b782020e3f399f1c37dd7953573553bc9b79b188295e1722a95bb9095b1971d385712c4453d74554b9a9b3f152cd4cb13893e4839862d11049f341a01d762bad5bedabe33c9e116e7b46bcd567e5a64bf37d567bbee6e591954539381165becd3faead811fd8eb0218decd4c1199015bb94974452ccdd7624f6cb5853db1d55e6163885411653ece222311653e974534114526a2ccbf306e120d2196baa8e96cdc24922296d0208ac2e2cc14110d2269fe141d71c19e2225ec09b3e7698720994f1b22cafc9a3f61441ee66f1974f3478c499a9f65d0c94b13040342ed09c4d541b7d49f1c29e01949926cf9f367dccc146c48132e6488182e040c31c400c6961fce24e10c31ec49c50e473b1ca1f6fc116afe2866a6d42c8f9a98a5f92997e5ea11ca34325d96511393344f23d4895e7a4f3147dc13b4b179836f4a7e788f78c604603d5f9a0fd86581b0d6da5a96212fc9c7ae3c03f32bd677f28ca5b57f1a97c64d7896e4cf4ba39d5c9b93cb72b580c36519a1aecd083542792b920e3bec10006fe5896192e6a35c966b1351e687ce80c34fce6acf07c1cc94f0fe27e72306e804123253eadb502dcad032ecb3c62188d29471946d1a3218d53a30050dde70c5a033ca5aeb0d431876a7e666891a297cd98c813529b8200583b71d53353dd8605033736b50330327d4a8e08b9a11bcb58332b000072760700b29604b8513d6a8c0620848d841911d3e2ec30e6aa005c6764cede0053bfcdf41095620fa02c66b4083143a0003d64117b5d6ba81a1832cb620606ec7940e9a60691d1841017842f242074484a0833074c0c4450206e5b801df2fb6256c76f84028120525606dc7541125dc14f94111299ef427a4222e2822e48b2d05f8ea821218a4c211f05dc20e1fff80081076889f0944a0d8e19381c8123bc4d70753b86193a620c39f4cf18529ceb0c3bfc199c07eb6852f61fd8a5f36dd26aed966dbe6f605f4742e0b16f268a04ff75a97add770aef7b7af79f3cb23538c5fa3f4b7fa5d0ec14db78efecd61f7f1a5a48f9fd2d7a2a896ab0ac87e7b2e6f4f73f8c280aefb10ef2edfdf6e97b77875d8adfbced33b44e6547bfa5d7e01434f53ad85823e1e4c71f7dcb75d168ceb36cc6af2b67419c3977bda7dcd74eae0b69abdc7597b8c1fac1f8ffb3a766e0b96c5af5df7f176af32b52ebbd8cfbeab1ec6184facc3eda30eb98fafe22fe00bb8bbbfb90372dbf72ecb5c97b71d5c6ce9defb78efe3cc7dcd9f0e5f62dec1cddb8259bd7dd6cd5db3bfba8f93747157352176acf4298883eb5e0fca6296619f957c16faccf319989960261e0fa85d2eff12509661210f8685de3fe4f18072d84449c8ba2c5768c62c799f2e6314fabed3be5c5f9b9a46ad96b7ff767ce0dedcb588d33abed77ec37f7f07ce326cf23bb0f758ebd644b760ef79cca339f58f7701e0739d6feffea0120560df7dbd0cd83cdf65917ff69de7895cebf0bca7c397ed596bf1c5d645347e87e84dbecf3dffd1d02da2377991e74db20dd0ee1dc8dee1d1e1cbd6321dbeecceeb1d42624fbb1cd2c774c918d85fe301be6b17f039ed027a7f2f872fe0cea0cf2879fa2e63142a799519ca9ce69a6b3a742fcbf5ee9b7665d8bc3cb29dfd2cf9f0db9eef621056f230dfe3793a5342eff96ba698bce7ed4c01bde771cc01bee7ed7bf2bdef3a7cd9f7b5a9695aa4bda8a57bee7774cf05d19efb1dda73d1cbdd157de87d13bd6b5ad4920139c606df358e285487f4b5774df50b1864db3cb7cab43208fad3f3fe26394ed25762f7f4d0dc451ebefff607eeefbfd742994ed2f7a06c338e28df534a5ffb1d54c788a2b7b6fdfd1d9bbe3ac8f6ace5d0bffb90f7f1722a33f43de7e916d0fb83be77fd512d6a01df7f03ae6344094ff6f7a0c6f8fd7760d7e0247df3ba2d2aae5d565e1e970e1f7b6c675a96b51dd9e3f7ebb99d47b7648f3fc3f772d7a5edf62a8e617f6994ebe2245dfac92ade79cd33ed723d865d8fe9f088ee8b5abeef7ec7d7e91851f007b9dffd8efb5d77f1376ff637cb3176bc9ed765bae53efdab75578b5ae8dfdfc0d538a2743a6a570b42e565b9b47d2e6befc9ddd3bc69e0c67e871c63b3705ac4fd0e4fc788e2fdd531a27c1f64735ad4c2fdfd1ddcdf0fb2690e2f2e7fd9cbd62f7eed8ab06eb9af717a039cc611457baa7144b91f64c7cbe91ddbb53a3c62631f351dbe8041e4be28a6af2bcb970850c7d8113208e8d90a456ced350a8218d393bd5d172e62fb6e8849aabfd14a2badb47ef864573a4b272f272f271ee8d4ef63ed66cbb395fb7a7974affd7d9ac3934d37bad18d6e74ebb446b7ff7278c1d7de37fc94e6fa15c1e12ce2be7b7c5d18dfed763a2c222c62d7bb811fa86917efe69793bd7d3dd9a0e7e9922d04f2783cf8b7d7360fde366df3e04ddb8a18d97df23ded6afc40804d879824fadde7fd9f7aaa0e4f3e9f3e99a497135cc4c9efed771ded3ada1b18fa726857cfe7e3f91edc3e9cf7797ecbe07b720ba8bf223e4fbf9c14f172725f4e823411c4481138ccd085232738ccd0052b3ef7b8e0c11cfad8a0e7711cf79bf62ef83d2e83214c297eef823fe8b59f8fc882ba37b93ef8b50ab2dad35b759801bc3b20da1b089243bcb1e75d2d02dfc5fbfba0beef61af7bf062ece5d0c7f65e5e06e0a75a04be08fcfbdc7ba01e226a0f6a0fbea6c1fbf7e6d0070dbdaefe57bbbfdaa57b50bb803cae7618c48144f6eb73269e8ffd7cb80fe7711fcee33cefaf690a75efe1efebb4c912f8b9dfb60fe5ea794fc15ab91ce2d0c72ef9ed2bf82539ce12a8c36b73dc8754dcfb7ccda107947dcdde779fff38efeb7b5fc1bf0fca2ea0deb6e7f2f79f2f871eefaf07fef6e0dffc7dcddc7bdcd74fc7dfb20ba7bdefbc4ec4bd4b7dfc5c7dfc55e3ab7fd0f7f827a3c5134dc34fbba72d610870365cb34675586b5771add66ef7fb4017f4fee3f9f0d7c7e0a55d7dcc637bedf1db4eb76c5aa38f9fe28c9ff37e7bc7da5aeeab7daa45dbd3c75fb368eb449b6ed15e0b01cea6df69d87b95c9051f3f248fecf85d0c4256217998396cdc245772256df6942b5945288fe4b0392e0bfd1c7707ddfe391cc714fa118b417464240ff3a3b6ab901d4a3054383232080986c8c3fcf9850e3b35702d577e130401a0b03131330704b051805a821dcad5a90c275fa90a6000ac07113187e738800d151f4285767eb8410b204401ae4a6adb58912bb922d5b833bf83cab62c76c80ee5aa2323863d6d54aa283a32ddc5039b85b599241502107059a810f48a36a674de8ae101cd520c9354e3b2b8962b271020840eeb6df6b4377bca150e1adb8a8182ca4df2ba3096ab1a5787b5e50a8ad50e770663161d3a76a876d818429641aee417d16455518586ad7262086b83071bdec9a238606e6e56339b21eb4bf9f51473f8cbbca7a42faf18c2d81598ea0b587e586532191a1a1c4e0090830e31d403168c8006224802091224489020298185fdc98c1faf8c5e96eb02b1ab339aa419fa21df38e122934e02ede427a5b54a974a4fe69ce2073f901209cbb24a20234aa5524e190324961a54f49a5292dc84030709470fb06faea7d3288560d0ad8a6f8c485e9a38bc349fe4262166697e146e0060bb56b994c001806d59a3d01370487213014280635f57b43a96caba41cdc21347aa2002121b648142811380e1850c1641a02255638a2431a2d4d8618c3146771dbabbef20778c31003b7477a7a51a6374235e908c5c568cd18d78a18391ab63c48b1c8cb8538ce6d2001053da1bb07c3fc1618731c66869ad1a4b926404fe8e275ef30edddd65622c4a5121a5d4eb6f16bb820637638731c6e81d96e175a1bbfb07965c5ea834f401c5187a82257efc943c1172f71230461359533156f7e2f324d5b2648cba1932b08c28947b1aee4e6536991dbdf0618c317a16b3e37b925b63dcc38af202ccb6daba17703801400e3a58b4c4815446139fe45ea825eb5ea8b4521a008b4901cb77f9d58ad1ba81a3c60e13a5d6903650dcdd064a8d1d025022e99003004e70d0f969cc906163003fa8dd0e3008a1743e81fde54f77a7fac5e512a6c728e394d137eaee33029306a41d5fd24827293a7605963faf1a82ea5ed41a96f82eabadd4ba56906d014b18e07a992c1bbdb4038b28f2710e37652bb34849e8e30199709d4f6479ddad19364d428a6c4f1f4f3c9a2960a733f3fd9667b8b73eceeb6ac69f1cfbddced7e95c33260f9a701706fa7840136bada73f62ccd2d43ad85ace7218e8b395b4af6379b762a00fde3a11673b5fe7fb3a35cb33dc6f79c68433e1f2270767908c563b9f9565d93d978733f9449806fa74ac9c79ddad977b368bb1925ab5ebbd889685366dd3ec07037d2c6722ca3c255fc7c2bceed68fbdf0a681a45a37d07e409c89c86e60367a2d6b40bef6342bf12ba111683f20ce4464658c64bc280b11fdd3f819986f3654f2f1809ec60cce44e475d7b1cd6a19a36a7d1d6badb6619d4eb5ac9a595054cbaa56ad49585f2d28aa6555cf66b33c13fa2dcf943c16fa4e16d2a139091fa7d3e9b45272cd9031fa441dcff6b18e812cafbb170e6925a0219354378f750cf4e136ed566b6da007cc33a1121b0a6ddaadd6da387b61a08f07fc3a9666dff2ba5bad8537ee566b715bb5b56ab75acb6698b519a66579a6f358271ea9c127e326908d9726e866cf0f3f1a9c4f8e8c285eaa9655ab65d56a59b55a56ad9655b1207406e91c21a7f60122d3091a323775a9b82969a7135803c3ed6564c7cf6a44d9133b7ef6829812ca64dcf4f9f8198d9b4c3e7e161373801ff315db058bc28e8f3921a65c0053c51cdfc7c78ec41c9e7864c7af46dc14fa08aad991e2245187ecf8d50431a59ec0104d15c60c3b8c1dffb4e357548d7193f7f1ab8c9b4a3ec617c2cd8e548b1d9f5e114dd58a589a1f522544534da5d4901a61c7a7438829f5e92ae6e83e3e55c51cf8e3d354cc6124e6a01f710829d279257ea5c81592b6c76cdc5ffb68af297b693b9d8f07bb97255e9a4b64c6fbea7d4de20a2db6b0fae44cd249bb2c331ea745341185885fcf2af6a08559f23c65ccac962508a4c2a26241e5d5783ee868b3ab9fbd3c36ba3c637b76ccc6da567f724061782b9fd25be56c99f4b1db96e32ec1bee4b2cc80be7636dd169fd5e70bcd338a9940ccbf247b69decb229c95976e22cafc6e8b243345b485540c4a0a9917c4d2fc26541049f36d4057ece9e101ea93e325fde1928c41d9e36ccc724b9167cdb26a8c75813a790604fa0a230490b73a79d963bc243519a18e3f46e3351e5cc045c6cb9f1cd0e969d0f0809906ea350d1d8268478722225b73c2a743108d6357bd367875d9c46c9a9022f695f895cce25834dcd46542edbae86c3031ccd27c8d86a57159bc2cac9d4e604d35495e16933404879e6acf9c2f8bfd8c69cc535d4cd081ad46286c4503157b98ef834b5f28408d6917328100c184563544051c7a2b4f68cb4b25351a3468d8c0fbed7f6762f2366b40befdd04cf15493e4611149f3bbd5055c62cae70bcfc83ddd242269fe85b934d78a9b52617161ae0d6633424dd25cc2e2581c0f0b95278b64a2f8e47846b0d7b29d2ec09e3d91e84bb29092192fe347d8cab5abe6d1499493453836a290b462872229f6fc30eff99fc7e5021167cf9f913f63c41ee6cbc81f37441fe68ff2278c08c47c5006c56410ca4ba04f4e8c396c3ca0ae94e84f4eec610a2314b6726c758962668488e06ad178497a0c4a9bc8d072b0d309fc17d3d7465b4df32cda1a00ac67139bb177f28ca52fcbaa54cb32ecdecbe289a17a38933457d69a812500ab811f2fcb2775063a1b7bcd4627cf7c3e6f6521d62b71ad0851e25784288157462f7a93afa799f2594d521231e5f34524cd1fa1bc5469dcd4adbc54ad88262f09b1a62ecdac58c4943b4524cdefd411aac690db61a5a934a37cbb883dcc17e58b24fa30df245f2d2210f3bd7c6ff25dd9501c375d1cb7d9d786e2ecf9f23aa0b362e96b137b981f5282095b796982dfcfffb4c1f3f33f61c4203a1bc943cc813de8893d3f4e50137b8286ec9c8832fff38518ab99220a2392e6dba46a22cafc11ca4d222d6249a4842444235bc4833853445244d29d82c89ebf85110a0c3823948a73c28a46267f72bc34df66d06992404260bc04427d72686caa4534a125e0f0da5c5f960f46146cf5c496a1ab60cb1f6427225bbe6b8f62cbbfb4b3a0cbc29e1fca6ec44bf24139b5e56b3ef8e0f520001f7cf8c1e2fc70592c1843706871f6fc6bdb98b13f7de599ec434456a36c57b187f9f73453bc9a494a22a6783e88a4f9ddca33e256449387855802dd9b58a8844a1a4b8316754cd18c400200006316000020100c8945e3e1445002dd07140011739c565846964ae38120884114c6400c638c3186106208328a285353430400d02b866debfa0f231168d8db4d8b8531c165fd36c6785b90349962c9f67f2e3aef7fddfff3c9aab03f2db33978ba689278db7c0ce518bc9c02b2acc313861f6b50b408932419fe023ee62c8ffbd46931fd8241a018f6b546f398302fa77701d9048549e68cfc51281a752705699a2b7839ba5e8fe7cbf6ba01c52a63ebf9c22fffe27f04986d20699d2568ac23b170fd9107704026e9814192b16d4ef2696067462d1a8181aebc4476d33a0e8dea9a59bcc5745275dc1a13c724e37066c2ee793c11e2bc4d792474bed7db019b5a82bb33b2b4ebc5f85c82c1640609c7780eb48e9df8d53f66e8756cda879f030bac679dfb00cf707ea2d41e8803c00727c03673b94dd2e413fccc82f892547a98ea9951df9c8e4901aed55e47b9687408385dfa8a0d2d0ef4a9e7ff09e8d9f580a7cce2029abc9823736a16f91cf2858d990f80f41457929f8ddddfd6e94daada357615bf4b66541e5bd03c7de0a421954b7667165ab3850ed90a42cd54ab0e0108d6fbb4b911a7b748104c721f4b87a5553abd3f997f32e970818b3dd84cdaa611f0377f3c879d02de04d38521f6a6ea1d8010786a800c97c6d8c9d92140ac7e4b7f4821b051d4c038028c8b1c6ef5a80e5a1c17d4dee852d178b55bd79bcfdff4b6b4b2f6f42fd2573aa645d026897d8ff1cfd00c709529b1a4bb7d3dd2c13006c52e1b93265923f7b0574c241c48a4df99b23134a3770f78bf6a88d7e0980926e5de01319e61a267c4500e38cbf4fc6b073b26bd91c2b249aab0d8d92feca4c046809cf37ba81bec1661fa1ab12bd3c0cdb9d2606e0601b8719c3e9b12cd7b054edc148884a99fb34922c6c46e4a59e161fb044c6f77413eecec15d7c61b231dfe38b3161745f6268740baa0501cbeac29b69f09a8850696a52d021d3c99e37ce245df64755ba2a8d8063062d4643664863a62b81d00654339753184676bae3b463de480f1592b3d743ed56eb14f82e53d07726eaa751079bc7a8d117519bae6b44067d60242c41eb574c6b9c7911677cfd2d2fb05f2ebc1e0801e0207d2e4bc2bdf6eb43d9376f2416399dc71b6338d6fe6375158f10a19fed6cd49277120b6c8eeaa2315d626642d21a014ba9f0ea3d0b23a1a616174c812843ed5a749682565d0c97e7a5955498550dcacb4f2b5c458ef16a741ede1de0d046d79daf6e1de799cbea3964ae1d7a70a54c6ca98b4e57095f479b6a6e333d033a6dbdd4e45b216d461d60ca5e59f74e3a7daec5b4048271f8008ffd9b4549e9ca68d3dd679ee1b6422ae53591300c94897947550e4eec1f6ba7928b1c90fb97b1adff01b812ff1fd244d94b43b974faad5db75ed7b292caaa106550fde9ebb73ecd9d95043d9cd2c1aa0f732cdc327e99c7a0c64808c216f754e397e9af04e5f979d82bafb433c42b9d0e80218e8e7e39334b6f7219486e24b99a728a797f149a0ef263562bcee152ab78b6c7260bf9ad982e50913c6d1a870b25f85fc2eb9303998acf4ca8491ef08ee4caab2c1b7174e7f643f08b173150d6a22f1dca6127dfda7213e4e79e783e07f3b19c41e30a18501eebdc39a639718e84933b48d0c54754dd0c286195a0fce6862379da34dc2f64a820b9407e7d9c2ceecd4611417bace016805c3d31ee807b7624af57a3828408ac4768987c8815f48b3e0a16a3c2ece64880a43c8d0968fc56307fb5914003ab05a233647c506c84fb85dfea8803c83775e0a94b7483c180e8cd8a54352839b60c66c2aecc0315fd3041575048e0aaecd28576e916d92e0d02d570b10184b8b4ad00f32d581b48310310ab83d33c21d0c77902c5c97c70b1d917d9c70f2c8c8e7e0d9fda24710125daa7461a0ea432b398e2af9c755c0a62f74c591af50b06542d1a7910ea84729b011a537ca1855380fb66337592381f2fe3f0390fef08dc20dd15c635690820b2225f3fa2de346bb3e9a60af20344df92db77dfbc72f524de2bb3f2c1f91a7962724eceed83bb9c1a20993d5b42b5fa166002c546be1b74c1e2ebb88605c7d1a3f4bbcddd9c7b58f174b206315b68a778bc88cc049c28014cb46140ba1b728117034b9277bee29eb12c4e6387d450508c0a9856515c286658163729d9d90acc93426e20ed8d3f195c604bdc9681560c6d3b061a3b5bfce8f90d3941800a1681cb2d6137fc0532dd9f8fe096a268fe91cff5c6e7d11c2906382e92ff822737eeb419a3f2c1a93163b36d800e923638101c8b42eaee35c95e4707500d69ec57befd82625527252a551087bafc0d4f58741873c262d376b35d87b5831f8ad1c6259fd1c48145bf153cce12e2fc2d01e5ae19c20ff1d79ff933ac4b23c1eaf6ee60128d11eb269ba0c68586391dba6a28cf86a809d857b1a82175866240b80982b150196e8cff86a0f6b3d675c4519d6cdd8a023f7ff8c149c0872605519247bdf0b40a0a8dfcf4d50178678ac300e066754452be32ab007c5ac4ed5691060f224e375dc2cd3ec05f67fa16d77875593cc69c7ac770794629c9dca60c53bd4cb5ba968aa42e5788ab4f1502e886fd1fb536845a966adedcbf5d9192838b91c8605713bcbfb39fa21f2aa4273429010b07bc48a83325247514c27fd1dbf12683e57fafa0f97f099a6aab49c6c85d9469e4971a9a34ea83dc55444adc9bca073e6081cf5b2e36e901ad49310957d37eb494c71bee5c0f060e1af6172032855de0f9bb1d3919420da69269ccf2a6025738232cca540598a88fc1abf6c0f295550a2b8b1308bcbe11e2b1561eb349a974f11bb18e608ec859b9ea447993f4f9409b5ac5139cf942bb9a8ecc60b12bfa69d32da8884d53a18d9c7f17b2425c29f66f922e15fec5d638e62fa9b293b59464e6c32d252ce1bd9189840c38b76e3de5d2eef8b4d7fb5870f27496e9a2ce859cf7683b21c9298c85b44a936e7a1b12ba5f625150b52d3e54961ee8e6aee7852611e8d0cff047fc1f0934372bb4219d976a44e7466e14722e5103ef758be00acf6f951d7e31ab87d508506ae51821d7cf508c1721f057bed55dbc12d622b55e847ed6fde7562c3cebdddc83bd15d01b2250479a3601003239cde28c51998f07841ef1cc86475cb18fc678796804118750c40a20113e389d888789a4551e4e1a59da6f506e755cc67631d3019ce4a956d202581b00bc62a383d8bea96aba697c120607ab620c3861635ac2c24516a45034351099f52fbcae550414b21d1127dc45a2eba98d5984ed069b906c6780e4585298142974577e94a9f924cd074545ad44d14093038e9a239630c086085f9b4647ce28950226a031ed5002a3cd71c922c196452a853b328b116c5f70c72e207b8ca63f9dd20fdd9b96344f42674c695511605a2842b7640e332c8b4a805e1e18a498067c3112850bb544a9450c0050b755c01c6e03e28a1f4bf052f6e0cd25a1bc5bc36de95014474506733c9925ec1f52c2844d2959d496b69a087d958bfc6810aa2702ebd58bdd4412bb93c8b042e7e49ae620c4d81299e4f0901c144b70281e1cafd271b07ad9baa23791daf9507373ea68beda016920be44960a53fbe9883f127d3e28245ef26280a13200cde3600cc3d251288821960132fb0223802f84fb5f2d7b8aee10ae936235697e216d0cf208c272859f0a07540c822f41a158359314f6701c1fdda42c79392f8b0500031ef408c6bacf111ff53a7a71720e47c74e2e6f3843ca0f47a36833eba2bf5901291b9a12780c20dae8351f7ad13a118c84dd3a8d4397cbb52f4bb384c7ad192165a2a5e1ac1403950094480c10780f3111de8c48a97e3a129ea0545d339b4b0e9a5d087428bfb97af475cf0ca7dba1f071068868d906873551fa197464ff5e799f0b1117e8f7699e016e36767a2a54d1f6eb106604f067bc764094e703392614eac1a807142ac328003a7964ec77901055ec5634972844e1eb5ababcb78be42cd2a688ef8d795ad1bb19d80615bdabae0558515668bcf769ab243d9d704bb19bbdfb12201e76d66dab9c715ab1486e1aae81536ca5df48da6d0fd7f59c1821b6b3f11b140bb435d4c8b10162ad2690ac511f22532bcea148cb968f9a01ab84bfc158ae46c0fbe43d31f991c95e0c8b493e5688418c74d64814709496d4deed75f1c6adc5797296ce1bf40b82d40120a69775359acfe06026bc3a0e1cb46ac34d93a133d71b01c0efcae921a7eed709905d37689cc3972078d6c6780eb7800518025fb7bef0a11f4ffc5107486687ce04a83fc8d476e909251d26dd2a514bd8f0660cd003868ff18e1725c002476876741818d8dcf1b1130912b36d29889ba9f35f3bb4f113c59b8ddbd4f94a8c577cfa048d3f75415c20c094860ac20b9d4589bbd8405fac27e9d5c1ef09fddedcf849f7ed109fe8491651487253e331c925539292e49794738d2f4a453f49b96467ed687fd7d8a8ef1f613baed1bd78f798bab90414967517c104c783e82edb2c67b44760c8fa50ae69463a01256595d3c39120869f57668c7344cfa43288be82cb72fcf75cfb3c21de0ab5fe9d8834e6b7907eb2bba9c8c66ef1ddd40976196bf678e932b0425f74044264cc35b8a95fcaa8b94548f4134dc03d2d5f0616f828bdd002d29d74e6907cf32e528b60f7be16455083ff859420aae5d55346ac9b25b1541cc433549f26b7ef1d94697288d3466912b8ebc02268db2237738ec2ec90667ea5c57880f2572859ea21cc714f344dddd6252fd62993f7ef295f2599796955dac92a7b66c5592fad8bbc8e2ca438a1231c4486d0957ff3e9435c342a059d840dad29c632ad1f838a9fe8f66e50798cc329fdb75fa932517bb88b50bbd48c19939dc2f8ec0563e513f95e93f544e2b691b433865dae146447a50bc90aa46d0c7dc6af6c9a1d964cb889744025fa9cb932f518c25e04f2cb15b10db9df672c33f6235ae02b2eb4be06f7880ee4c13912822a6f32118c6b99fad217223028a5bd5ee994baead0375863a520cf20c41ee02857a083c0f06fe86a058d153f0ab504b4da0e43885eb443ab69575bb97998a59d4d3cc87503d5ddfdc53c3817cacd91656a63aa598ffdd459393cdb2564d70760220554fbf17c5794391e758149b93a7523b91d6a6996495a6b414f289e9812a8955b624b44c92fd473a81edef67228a698e1aa3a91218ca84e800c876d02694d7040d190ac4e43f400c5e856aabef4c8972a0682b78af1c71821225450d3637028083424fafd95c1f3534ff380b2327320f6319c263b116bdf94980e4177d1506675a8607242075f70516560b969308cdf413d4235956cd3d65029dd5178f7071257f4a7bbd748c9bbbff3944bad0a14b627ab7a235e39e15eeb6e56e82ae5b30a29711d37f41cf792be471baed7ba2bb9b8b5424a0eca25d12b6e0df781d2d472491f0d80162519f62743a2faca646c77f899641d114e255b7193f0e544b1e108505f196aa1f7a734572f426187c1a4c8d0af58c877d36a357b61364a50cec11057556a4a93063a76fe21ceb983eda4a14add6cff562c52df57ed60ef3b49949ca2d9351ae483e893aadd2e4099a44f144ac3b25a7d231b356ff11ff9c08a527e6b42a22f9f57db7028ff35621758845f7c4275f3bd816ff468d0f6f5cd8161fa853ba0148989f17991922ea782367f0325361ce1298a908a80581aef162110b3e3702ac690c86a61f2cc267175ca9a7a341b3cc243b98de1a121463392d2a5d275b0e59d06e58b7f09b85d90f43919b9aec020d3878f31bbe640cf6b902563769cd7803a99e52ca879efdaa5cf8077cf569e38a9ba9f09429099a010eddaaaea663e23c05e02583034ddc0e10d349b05da3767980d15beb33a22f74e8532de71456e2d582bcf259db1c1b6fead0248ab2ac7139aab17c547b121ce2a591b6ec01d0a6e30e164e739b2d9ee6adcbbf7c3bf64878bd93204e95a2d7fab074455334bb907a9f2502986fca04dba434ee742e5f1812727daa90e689168ed2eb2d647e6f0dfc551f7ec0e6d3e096cb8164bd25ff11c7ea92a07de5a50efde429ed8a0bf340d2e78105183f833d67ca4e6437d146ce5c84e0b28a1f07a0180b7c0a61e6088e5af3f70c41bdb23e34fbb4c746a4d05e0a211b96b8ab1984fa0722262db030a7f92d66779ff1ca499932a820793736a0d81c64e27fcfdef2be7fd8f07923ae57008592c82b7005b84477030c1666649564ea1c5263d92eb449bd15d222d16457bed9f96db2ef5327a214a2380b17e98f02271465a630630441dae554a1aea6bec959f680f4656ca79aee431ed584f08637fd5b687394b054a34b3c489da0564ef4a23b70425b400c8277371a2d1406e202a5dd2c48b6508a733655bbce974de5cb2ca7e5ee9c23fdb2bb6c8933d097d1a532d1aea8fe987d778421ba1424e6131a08633f1dcda65ca17cb39ab5d3d69a8f3a1009945ea168c3aaeff3c91305415fd14b7378e32bddeb13c79f44025ae9b6eb75c62aca40e86ff13fe0bf5214c9a14345f117f252cc9695617adcf3a030e478a50c5ff5ecb47a36f1c2e91a52c4d8efc1a6fee05ca718f41b6e20713f9578c5bee0c6d3870f16139a95958100e2e562f7c47c4dcf4955fac8b106b42029df69a69c567981e7a789a671b7524494542316a497b9dad6480420b7411c7052e02fb56059025ebf9182952d9c1671ef9dd6bfcbb64380dfd2028a89d9648fe6894d63bffbfcbcfe690f5ba4e7cf3a47371d7215734f42d41a4f81108b2534b0182be3d2b48cc1ba9bc47e2f6e0098a258457bf1020aac878844a1419316e6803ec6fa9f61d3710b3bd5451ae1c85994d5414949334e97271a74638730df3060ec84edd1da26452c7da44490297ad0d6bf0a65378083e2d180cf22c2ee78a2304d95aaff1f76a5540ec65f7aa5f2ad17a1390931875911d4ee3ac65661183b15092473f59621d6c7e16b7b49c064cd67ff68152509c3c3957bf1a3897559b81364c6c3e78f83a6cedcb77f339bf3d9d1c05a4f3ea2f6a800adbd308a9e876f51578dafe65a27cc0655fbdc97b54f937e84403d1f3e33e8636aec71bd2c21f7315c8c74729ac58d9bea3629cd699af74a592b144c0ddd1aeb152f9d0da3d34487824e782b27f904cc51fbfd494475f1a1e5bbbb0b281fbf9b7780ea7916199e5d13f9b0ff7a2f4432e3e40f28d427134d5a1d4bc7e09d3d05f86f01c9c1bb8c0791a92cec58171506f649195f5912fcef75ee4f92e2532cdcca95971a63c393503bf5f7a39f0cf547427823259d719bf81d46636481a6744fcb3e6387ae5859e545879de8b45c8007966380d92316ffe102f417bab38f5670caab668ab536e681b47f5f2cdde62df673f72a90ffbde3bd9b3e90e9f486b1f936e4acc906181197f00f70618735bef00de47b43c4c1963e372e2216fccde485e3d308dff786a0275449744d7e8368f6d4308612a2ba6b3d2b514d03d7e368c3dcbfd0e378217dd61b8c2ae6b17831ae2506caf25f9589d9906cedb2745653cdc43e52e775a248fcb9896f0b37b55750699db4d57cd8e74a143ac28ac783866761ca44f3df9eab0421e635f22fff00018acbedacf5f6f69c42fa5ec55d9986eb01b301d3fa763e12f0df3db596e57259b5c09f4a0235207a939e68b121032264984418b7fc516c62b517732efc16c9b9316fe3dc6068051285eea71345f09d97fe15d3616f73855adb7a9236179ad41b9bf6e0c2ab770022407c594058ed9abb5924eaec5c9b25c18d1a720ba3bb731e3b525827b616e20fcbebb43f28e3ec8072c2e4c070d184dcce6219f9c41384dcb4e5819612b1950cc13bb692d2c6f517ee5a0bd884ef168a6c72ac0221bc08c6eabdf1bd042b0f8b60ebe832111246b5ea86f0152d30fdd7ca4166fb7cf5de82f1f8389cf5e7dbd0fc966b8b597c9b8086cd5ad1e5cb01f884f88d4c5d06c0e89a039d4f765fde7dd77491bee58a585bbbb216eb0c71202727b6279ca48abb861b1290eb38ed352aa25bf2a355f25024043259be6b4cb1d67ae9498bb7c277633ba2993a4ebc5de60370551c916b368ba79d3cd046a72ffb4d3d5836683cdba751eb682d0a3a486ca8cd8c3e92dd5a2552bf440370655ce95bf217fc2d45d324114e141d3409922c25e5261e626aed2f7181a42f07c1364fe60c3795a421ba02bb7c9188f34207a1e309b9c9984b1c7f0d78dbc03bd5524be6c9ff08b43a8a619cce556c631818f3f28faca9d9bdfdbaa219ce1011941c87712f535a3ef2d65e73268812a54b3b6fe1b3c574dc3fe4419ac8ad0e04633ac31cb51c01f67f04b5f761875b0d43c88189baf1ff954bffe77b1b6500d452797d151e656964cd6f07d94671407663daa79dcdbe12d85ea7692b00914c702f81de16f8fed07bac793fd1f958236fe943f348e8061f20c712393e9f9e1ca94bb3d8802c9f4cae7102b41924b6c979af6d3404b73f552cec8589a346b1c4f5aae4a7b04999109f404fbc6b2320e006ad389e49bf2702dd6a1f35d03721cf2fffb7d9f9e551335142945bfd07029c995cd580e694d2cc5b588b1b22355938b2dd3449369554041bb25b5b57e103f819488ee3d8d0d30c208f2b63f3117dca78655560cd735f4f17a3d3c32b97d8096253a7f1a188a96a465d7a7c607b511032748c57e0a3b653070d916ee3fec3832104360c558f4a63c69aa64983ed4b7ad6a32761bb341014477eeadf81779192296bc1d8fad4e9336b8f90ab9372ed02dbe167395ec89e7179c4198bd1520cae884e22733a509acf584edb54ccd04071dead1a54275100a532f51b97e455640503bf73a979829fd408128b97c656354b9af8d23dedc78a58c61553e5dabb4b1147d4923ee7af42f5d7f06d99ede0c2a561a2ebbc06d5e132dc9c55cae4926457b78ee7eaf70f1cc1b01e60103c66f274445386981cb146ad991d7d10cc4f639f8caa429e62bd55c907a51a50804ed225f7ba6fa9b109028619754b595d959a13278a16bf2d5f0734b9049c3b809fa28d32bc1b1503c88f21b3beb6206c51b74cd2ba0479d0e4f0a45790ed0cab5ebae09a684a3448bf0a523f03e21f054b728c63b6d5d7f0f206161325a4546c0ee7d6f4cd28f749ced9e20dfac9f889eeb5b6b85b025af1aa9f3f1862a54c1580681349d7a67457bf7c354bbe4e253c0612f650b9a9275280acb58011362e87880f8605bc2c8c6d8ed62634c3395e236f4f2070b1453a8d7fb6bcdf0c43b817f0f46733b9aee7161e2c0861323b47b9cb1849d0f559731679c78092e6b0da01b4124a99d88346341d50bc415dc004df2d9e32bb4f2f60163623a0a4e02235288e2f5c256088c6849cede9394d2747890f343db1a12d56ce1d0d26f58c3cfe999e4d8aa8282f20837cdfa18ac4099b64f2bb66594f8d200fb52e81601638e6e77ec0f7bd35a1d156462009bf0d598280ffcb9987dd66f5832fcdfb3a961d3398caefacd728b43811b3ef94a5df7a06f8efff6c5f5cd4ce3fc07200ec2afb895b2b2b67e31156324e0d4873df30949c15933da6e52e09f3ec07c8647ccb8cff8e12795c5f8fd1e361654336825ed24b4e5164175d82ae68f63ee416c9e0e4c49426fc476a7a6ac81242ba88fdf912d74a94d9b95c583f959bb894216a1391a96f94f44dd18602723a9c65e7badbebe60ad3cda9339c42cf2144fb594dbf4613c74bd39dbc0dbb3b0cea603a80c7ad1d79fb9244912b2dd24ee7b1dbe013f2f4f7ff3d6ff9db09059e30fac193a984eeb98b356ec5b94558713273a8614d21d1fd26a957dcb09e0f9dae1daa88188ef144acc4207c2d3132dd2087fb9acebfb5d13e470cc956ee26172d48cc31c2fa9cc7027aa38072dd1e99e543ef6b8d86821d511e15383c87224a7b6be07c2ebf46f2d1e7dc951adf913886e5c02c288e79927331d199838b9991ef54b348f3c597d476cbb5dd79b2c915500d525629d0b928ea0900699019fa0c2d06230b88836e0f65cb8838784be2f70245592fc26e87eb44c0a61837c918179b50ee767f13e4946a49b82414b0c50de7dbd12d1a39996401f404668cdf60b67125b976a0787fd11db1acbaa9b2acc06013c9b69875dbe980dbaebbc7030ed5e4087a5924abab8fab2f4ccd8e6d44b844289b8871dc777d5ea50a1e758dff8e0bee1c52cf5bf366f02b3d12e6a2ca9ca13d309a149d139fc69107eae75629263663c583154cfcd96dd70175d75233dc1909babe510836cc79d73c930ba67a42759e758e7475d7f049417a6aefd868420b962cdb1e365a4b0252d4fd331d6f6063c78be230feb88ffa1f7fdddd9bfc8527046434240e3430ffd39559d156375be11b884c6a7cd498d883b6790bacc1b9cdae34b2fa35f2b9d204e1866c042ae1349b859d8d1b461b04b1ab87dc3189b988a4e497453e97d37eb1020e6f41487424fcbfd2f9e048535eebd6423d99c4b8b2bac39aae7822cbc345a3d252708bf28a183140ac73a1f63293c672281c8859a921122e4431ca21a27ce479adcbf55b7514feb95aa4273b416d2836e4513455af34b5f1ad792aa5d61261075d1c1f54924e0bb39be8174b41f6bf1f3a360e1ea6a94920b29211f013a2a381ef7b7ab4723b40d185ef888225aab360a4d8612b822527197e006b8be5b4fde7be7dde5e0ccb6f7dd6c508097e99d4a28a5eb04f01007314128a3610f1d12d0768abc50fd31d2c9383e699107679e4af3f2056c6395f2ce35c8a8756a288f78255637f6a575d4c24209880cf6e15634559490d7616b8e222d225dc49ac803be8f5dfc1f238bf056df82e03a952a9d5d05a12bc0bb26c4f59e5a23d32515847ed70e6cca4a3b707d09c3f3b3f61bf75e799d8b7e067aa7531b5671dc1756bed93717f205b79f85f469038892b7843aa351c596b61e06dc3010383a609ae19e1f7a01b32b31a68b61d8a5b354312b0c60b4f45c6021b3efff3150a6b99d44eead0ac2bc01e5168cf1334e3dcdce78c306ae2cea81900fa72868b9540fa7f5a367b6ee84813396d08ce50b24b050ab06a5436b96ee68872688020fd0534af7ea112ddefa24745922d89933c15c2854c1e1bba0180ad0ad9d9a74a2e52a967712c06f3af7d30199d203ba545d2bf5e5bcb869182bfe6742120bfb15805e106c987d2877ff972216cd0c49417732edf79f2081b0213b91ae330f56a41409fdaaac98626823ee798dc1ce6c4137f8a7f0b81153da1191436d80c0ba7c7c30c8e9fa536490adb33ecdc5f107a2629969b9672264235c2e4fb84c1c872d99da7f00980348ae450b1ab2992d1c6ce0262dbfa25d70abd4728efa106b1beaa4e6706b7ac0a510580078539d6b39ec8420da3eb2d2e91272d89fd03655ca88856c5c8d0a51c64909b760d127789aa43937895ad02b6a490856d915fd79903cbd6644702248cf5d6cb7cb513bd703c3dfbb76f33fb7ded519cdd9a8a886fcfe8664b53b24469b375645153b38420cd1676fc237ad9df8e9289cbb2755cc9452a69ca4a590ff9e2a9333349e15612f9d324dfea2112006d09e954c6842b5e4988ae5e93e3be3fddfd566ebc9a6b1684accd289cd4471499207b454172d56867054057bc51a75742a21455e5faeb1773fb29640fc9444ef9ba01bd5c609c7435f68c9728c2d11c36966866d08981579aa6328cbae372602852dadf2af4f1b64195db85b3489951921fff6213427294649e243133ed0d96791e6d92afc86032f6447eb286ec899a675cf74bfde423011b219a796fae6aa82e539170be887d72b81663bdd128f214124655ce638c61d3c4db2b3694c61603e050d204a68965c20352a2ae14d068e6f2c05495ee9b21a4d2640c1e5c9a7489286f6826d7d44db0e4ea5d94e481b522e82653e0e092e4d2b53392bd14f6bfd9c2312716d190507eb4386b66efda5c9ed498c14e6945f728b38b5995a7445d06e73270b81f0ea4d2515a733a75e8d6d702a85b98b81821bbe377db96bc5656e9eaf4bb5c8caed453fa6b0312837225f2dea4748904ad6ae57d2b8995ba9ff0b6c54eb0799801107d1129545e312bbba83f11e014d324461fd9fecb5dfdc3413619665220c2a4b7a9c6a5d383394f20355e39431e64e7bcd3f791680323f24a2d201baea94c5cfabba30f0abbd73750306e0381385f258461129096c95a50174cd23fc826e6405b8756e5da815c4509df0169b635c92b0a8a2631eb87ecd47122f9409acdb14bc12609e49a364dc294ba9f1195d23a662ca62e0cb4dd25626fed14eabaee9f24311972db6bf6fab8820942406dd69824eee5fac160e8341eeb7353c2898863ea287b1191cf80a176f751799dd78de3a1fd890acb427a0639d1521d097e7ecb4fd6bc152562f016f05c49d98f2571f4826ff9d08bd9302db0c3726b6b805cce5b34a99e38d786e0955f510d249eef1d1b1b4ecb903a15cf1457fa2764c404c962f346d17a24cae39d487a21d6550fc08d2805a444e93533e829dbbd3c223658a33cedaded4db4ef702d7226cd2aacd4f8b7808236e52c48b42cfe7d40e945aa21fe57f3f18bdd9e780c2474111c8a13a33b1bbf42c726dbd3c90cb6753f4b7bd28b549f8961ff0391ef8b800312c8de6455ee481b74ad090353213eedc40f522f32961deda57eba5d9914952f8069d1f39734c4e7bda0ce40a6d2a09770f4e35e44df0543b10edb8be0ed3b64acd4fd117da00049e1a895925c795c2cfe1d19460006f7bad750f33fb0f56762fb67ba06a68a57ef84d4f6672bce98b7709b2d4f20e2eaf98e8c1c01274175db56e421e76310cc508b4bef72f85c84f1210d29d12526b90123689ed2d02a73a6e77387a14e5fd2000fb7a31b0f91019c0f6b1c1b3a501af2d95250031cf00fe5bb40023c5701d47e109ed228e059a43466007839ff9b1859bc76b286817052c7993e3a7af0abf09799835186b8c18dbd5fe5d308e8cc4d9fd2c9d96b780b6da5f6b74e815c41eed0beae01aa8d8e441506a5f1ebbd0d28a7c00ea26fb0f0e95e11b2db730b186f6dcc05cd569897850b639ecd48a1d7502a4d96b2bf6b6fca9eca8ba20385d3cb2adc56a08b494ede393c5d6a944044618530c342ce51eb55454462def1dbc12884d202bfa020842d4baef71c3def27a064758c2c1ebf2b86285c672fcd7dda37f481baff566d5773d800d5854aae014294bbc84116e1f426f0440b4be368a7308a890a78a0c828c8412f1ea542853e16635187f0084fcc6fefe278adf671402c4017f3283d330edaa690f8359a448f8d8a4b29ae5a620fc7c6f20494185cda48b159ec7e6682dce1ba2606abc404ef7c5a643a72af4fe3802385e7c49bbf42e9c60a839b4757972987aa7961879c55e8be3c2a0721e8fe3007282612c194bfa7606a628b9497d22c213319335932b98eb025cb5485083de7c5496bd852cf37ba8783533bb51bc8427b555f799a28404852d149486cf44e12aa8c11eef71fd91a9c053c9bbe40b718790d48250696307827519c12457be0184c8afd51ffcca85320307c454834b55f288679f6926987032179a37c9421c13170d2d59ba0a4aef36d0348ad5e9cfdc34ea8754b9cda8305bb9dccb105f4a351d8ca179f95bee1bb53dc810bc1bf3852a1c894bbe9273a00d2b80c4a807a1d241c3acb11100c8d792dc2b4bf4650df14158e12c1e9daccb131958092ba2d77ffb2aaaff5a7eeb3e6f8f5a915889a3da403874418ac066dd422a80fb40a6523d8ac3875e23be60c624279eea2246eefb03c19b0399df0536b82253ab1c5946043c98fa1a8bbaee95849d003b0705035366543d6ae451ac3980f9e9d4455d9a34edf850f128d42032f1a605a92583a43987961f319843aa8ba799f83480e3c0c393b266e075df884be75811c87753e05974118d3d5653fa296c3c724e0498a7361905b05405a139793d359609c5d69a8c10a6f698a0725807906bcac1d6e7917f2612ff5a7316ffdc131eaf9fa4e06bceb13fa41aa84dd65d1750e84a4a85d30541a83b263f38d12d1e0856446b6be08c83d3445d075ce4107b1f25c9ecf4f422e75108f8d29cb4bf8d6c253653a5a9d9d2d073671756d2fda200d512a09f04fb71a872e01557cffd105eb86fc3c32fca07527235dd17f8dd874ad55eb1618cd2c49baf99534bba8a2248d5e252c499203101888479ae04685200563b2ca9bd72d5b06652de62588eaf57344b77a2187a7d680e98b6829944d1a4f263268aab7f2e7a877a08c0c4ffd12226fc53e43a1650891c051869f88aa8baeec1c076f3238f4cc80f4a41ad81451ed0f88166add166ecde03d92b21def265c8535b818c4af122602b02ad7053822d2a8705dd574e56161a21c97d50e48d04c3d8c036cac8a5e2448829730ab42f3fa016029929733abb2745bd800c11dc0369585374962ab78b0df032ba61d1c89848ee5915995a873f26a811e3dfd35b2925591228c076f596e745665c04947666dd986326e64632310d1364773a01ae89a9d3158155d749370edcfaa28feb3c46e3cd38111a5b0638677fa52f491e4ebbcf488c1645508dac239e24acb83c1eac058ba0a03c540bac708cb40a92934461e697aa687c956c54c10fc1c4ed0a25133a541641792e6ff6c524e2186de421482c4c2c284c422e401cbead0406b17269308288caaa8b556a5ae73e8353d9940f558e0ab0ea16d4a8a989cebf8b69b766e20e4d3bd53d10fb3e04a3282731172646da2bc275f61fa76e7eef189d4e2bb68fbf85e8ee52e5903955d58deeb94b7c1ae9006866d336e97382baff4db97adaf037a1a5cfe26116241b2855802f3306e8d5a8f72db3b346b310e16a8085e6418e2e9b470d23f2a39220c81216ffd5b011506509573b11de91a6bc418340bcfc67aaf4f31e26acf9b0933817e1c97381841dc4343e15f4041025ae38c9d877a57a3128a5125953f122a33574209efd16e46d10e795c263401d0e68831bb2018d30440a7c338f8371482815538f855219b7903fb725567a5562584348da2f258f4234ea8b019b20b973c9f47d59999385e3814cb5d42c07afc8f72a318c4867999b3d078f8dbf0b32901b2089c348e7428de73174e22d2a9ff95c5ff1d699ba6be0ad44eed4bd10c05173f63a65e32e80cd61c91405077b2ac02bef8234537971a98bd1b663f94188f7887fe59e34bca22693449a02cc26020d421c862a0d542108eeb3fd1c5060af3593d5b8c39080dd6759a08c08349be29669b56bba98ac1a27648c6fb5e98611c65bd3edaa577c99ff071caaadd384258b23131587d41600afcc3d1d4569d635a8f30c73a3983871a8f097ce9f2577bef0f4e7d1b8e4c039e13a0c211d0748ccfcf344d25d829f1e90fcaadd37a1d16f5199d4c63c0c464c7f2fba9cfe850950b490e7738a44f4d4604863281b66037047247c4046c965e06c535bbfd1eba56c02fdc8095f9f440153acb76946d2b8866e78f82ff835e2cc57504c97830f4788d30e8fa41d03c5e00badc8ee3749c16fee5469ca5f2e47a70501b1da115de3bf33baa572dc01583466e0de62c6df6c2e54e1124cdd6268164a73b1e322605c169cf71a2eb39a2d32d6de76a3abb7beb8e44339b1b224905f574e8456e4ea9737b85b7b488c60445add8b5971984fc160bf86aef94aada5168f56cc06b249005058fe002e318c365fc81820275df77336f8487e553722fa1aa2d962826730fb0c5fbb61638fd19f49dac6ceeaa33a91f559338e2f6a5484ba71b8a1af68dde94ce3f58b4ef00d513018e1f190081681a1be228a028906c54621317e08815fd621dfbd4b41166c0d8e63f18fce645f5b76c505f84b3f0b46ba11343e53df37452536bb1f8aa993de1a4ef5c610cde701d6dc65f7105fa01b3698617e55fe20dd5d2b8620bb66c488b4c1fe23e987b69019974a66762215b2542db98b3c6c3492c459a7bcff64875a9e44f0fd4fee05f53b243ff7787d6324e88b6dc858a55ba2e9f8a5388f3b22949a8f3fed3ae3dd25622117cc8cf70684f829aaf2f2eab3b56a3825dfffe013dbe263f794b3f0aec674ba816e028845a8e2283c9274b0329f1d7ad9fe3387b7157ca02d5ddcc80d881e0aa4c0d16fdd76f60357f2de6418d5ef53c491302cb93150608bb3b23c48311c84c3bbb4636b7260c9c8b0952628b3572fcb00707dbbef39a8840f46a1c908ac58dcd8158e3bc2c9353a72355211aa08a083902c64597ac4328b44009211070b530f788f7c9d53701371dd38f2c0a943f426f494e75c8e8c7cb16d44529b6d11a5a62912003516b1e236537d50bcb2cead68884be03b4bbc0218c7655d9ca28e500f41fc7d6390f749cac75619abffeb7bc0af8a6a4a7789f0b9c8d23edff268170d52736da8c300c957805e1ef5037348566c4172fb67841b239bb562915b88bd5ba6b7a7de18c6f2256ee2380500f7b8acb675f83b63275ad68154baf85fc918ea505835e765607612ad8091202ef368a4811850a9f82f9c197f1824f9de9fcbf84d14c804722e1d2a0adb43e853eeb1e260d80ddc2e1324460fdf2f05f735cb3cae420c496c0f2878ecc93c7d3d6e8348e8da81238e55da79848ffa81c058ec78c227f4262428ef81f5462dce5a796ef1a7a32d81c8bee91bad33b12e8f434c0cfe68371f8341abdcd6126b56dc8abe81801d4ad91fa793532c8294fe5524abdd6ab72ee5d7cc12ce0dafa683a10af2a7822f30ae03d9bea1252b46756baa51f5dbe47a84de1add9beb9a09acd603e48ae0304ce9dd0a75c6e4cca35733ea87ee110613b02528140c1d6520212722a88996d81c3044fd00cad381f2f5ca22550c204f4f3261ce7fb70e407bb54cb4396cbbac66208007e801236e9a653c81e4ba1d7ecb936697d7d9912d59321d0f97258737339252b1e71e179f1a2d591750b5f94da8f7d992cf149b46d66330bf992bebd99e59df7176646cecdf7fca96d597a93d0e072f16f5879752ca83039bc8c8f0878fa8a37763519bc98716b617738271d243e387a269090783713464fb4a34a65b712a9febb5c99bc66a741ca9c81a7c33ef8627c49e53c80040af0e87249335121e557bb13dcd6f82730a04c8a66b044322ca0f59b08ca342a9cd636cc6dcb43fd72e1c05308bafafac6ccf524c2af85bdd239aa351f804ec73887bfc564ad2c2ac0ecec13e23aaec956b100564468411017871af1d534b9f11178bb063311e4db9e837574bd4caffbfeaed66aad6cf14f482c15f68735ad1f1adaffe87385a6cf9133044e69f261fe3161c11037af8e564b91b910bd09cd84987320b4193e27f96872ef00a1c9a3d3eeae11eb24301dfc3f175e0c0c8aac8588e992771a50dc739ea73ae5280871e4491c0cf36c059c2ec91157eafbb68183443cda40cde54ced727aaf05f56ecac9a9224af00de1b889489249cee42688b2c83b993666c128a5f200f4265b852c9f2370b315dd4aa679a5f6870180331a905a47837a774c4e0e0b771802e8b8bd5c04c5e013253b097032d441e6a2ed768b0fb25691386fa09cd62a22b7371ce7422370c80bb29b7ad6542c20f414d1dbbc85549b1ff509bbcb993ec85e5aea381e0659eecebd1180bb9cadbc08a0324db42327517f2121d41cad25c8979ca389c1f0ece5abce353b53ebd7a8dabd06087e788dc0c4bfb2dc023d0b191e568104ae29394d337f51ef37f4ac91b76db60943f48454c948c292d60293a1de1ee98d0155afbc57aa483f1b169ad3dd25e8b88aa32b5852f622611f161f8e76c50671ed0b47486a76a014f098457ebcca50894b22071f4a641f5b4cfdf21ec15931cedb00fac23ff8c38f661b95d196a332814ee9702fbf9bae9d17ebd88850b04d7d6c8d2e099855a86a301bbdcf275b555f3c8166f660dc036d45a84424b2a0f81095b7de1909b3f054ea618da1c2826ce5523a989724ccd5f69683fd1c5d1a866fd181b98e620e880ce9154313e62d155742edee3c3d52e3b46129b78f1c11e1436f2fc5c43e666eafb32e389aee5d9efe75ae53abe10fd401aee0ef37def93dbe57ec8a54b22f7572cb202133ccdada5db44cefd75a68f6a23930a1f5b9aaea42909efaf5c6120d1106fe0ee63f6b3753e69d58d16b854deb9c4c39ed2c04b6aed80aa2094890bde2ecc5191ff8ada0392ca0ddcd8a7bb680dbff0df5689e21c253021c2595473045f0beb9becd238fef0568ad4ebb1658183a8ea03fabd3ceef37fcb9c41e9857223a82d6686956b6ce01f35483825cc09e0012aaacae3d5eb2da729481dc1263c0a26c44d95b960c483189642a29b15be392a9af31cb81539cc51802a4a0a313f5c709957747c7c62fc54e661b93c8a02bd0573db09c55ad8c82732437e42644c042f4879c1221f00847058c51d9e42b98bc7de4ff56d4a5cc64e93089cce94887c1f9653e0ea1ae561f2a0de0121892e92367e757c33076aee7289a1e8eba25554052b8473c8db397b590f09763130d9669849b51ccf09ebbd600fe9152f6afbcf44154b3de795c8318d9f60141a194f4d2b8fd20d486715478c90647cf8d7b81ba29b19ebc6fe9bbbc28360cf47b52d76b653098234f80f85794b52c17f798f1240f37fb50d9886739d78280ec4e9144003b678961472d129f2c707ba01613a8d435c9479c17e38ec2c1de484608171c503e75ed0c6a5480f94b574887d92c0a89253f980b32f726226ef27632629d676ee06e75e06412a0edfe14142e5684ef64c4b9804ca0533170124325323942d82f0b73c495cdc379bb801b3180fc6dd55558afd3b9f88fee51077e54291b63fab97601350d6817f525890c4baec25f97373c9a8ff6a00de4b57494c56247bac712d2ea552d6470aa40b6405c37017c77183329b1b5cf07f22b003331a4550fc65518a90ad9332f1aea067a0391bb5411014e0c9edf636795f5235616a08b264a83f457480fea61d238b69589d9ec07516a0b61a52141f4a75da8fda82b3a58cbfca8cd09841c5ca3fcd8c254c3584d6e938a05fbfd24919bf1a9bd9930839e1eabb93f21759a5f10ecab6ede78300688c2bfabe07cc0863be2363eb429bf68db4055661e8fe0676483b579ac24fabbc9ba9d2ab0e7103cfae23dcfdb43839d3f94bd37b5f0e223b4e0d235e84d2a65b3976476ad3dcdb403522e526a056861bb270ce47e7cf7625dd499692d42e669bc5fe885d3110e08c3f0e529bab8e7fa9dee3f232a560a8327ea6725b29ead01954e222101826ce9848a870616f9db171a920bd064476983b44ce51bbc05b8e522ae9defc6355166d2eb740cee24860f55ba7d9c415d1a441d5d8ef6acbee9c73d48472182110f67f7ade4489548afea25e712375680f87763c0eccf6d603356b4403bec97ef6cd12d14e756d313d17df8bc7a22e22f15bf52b29be6a5ca9f982eeb3ee4ea2042b3cbebdcd1ee8bcfe854a980e7bba5f48db4c5fbf1e759cb3277e518ebf372e693c3dd13dceddc34aa150618a49339e31a7a22e3570e694ce8d454f62f68d10c4743c421b0d7e0caa0c9c60102623f4761324dc2426418b8cc15b8237f3b434d72c871ed4572aa7887696a2f4405c1b81c996843490e12b1ed890be79444f994e41207ca5c7f0a34b6bbc688c15a2539dbc1577e531e8690a62497f40b87fa6e5e3b3f172e20070c37833fb4dc3c0103fcd8e0c5c65d9267f4d07d9855fbf51974a6fcaf2d4911845c100551afcf1464cb7722ef374b40d6ff44af19cbdecf6a3131e316ca18ef78a4d65b5e18fc9364fa2edb4093ed6132c2e3b9cd43617978757914ad4da7e6433dd33ff2b1cb84b29021f5e5909daaa5c28e3826760ba7905ed36ded55f4f14d3152ab859379a025019c35c1d8943e101e61fe30634c89ccef3733a9e189abe072a6bebc196a893c17a800148cd8ef53f382190abe7d5217b789903b5b529b8e32641375fe247578496f6cd780aad924248f71f838843e4e18c1a3d9819205eac73592044ae5ace285393d33b36e7fefbf2da532d159c2d47e7226a584853bc8744045edeb7100efcf70a113470ae48b1068f9056b6d90c36f56eb60fae0e7b6b3499f83639bfa0fd8206d00f34c1dbf46945734e55e374dca4ed56a4713ab1b16b06b6e7ee64f1b8ffcb494329a37b2f562940409753896282b63846126ab3a69938d19e62eebdad257feef948300ef765933aca0313cce200f300ce2ca42e2a339b0cdaa8aa3c43b8c94edc17b8e5844628752dd934bb26d1bcd7d64a2fa2a74e677a77ba331d8528700dc1a2d01436ca7d6aa422a7f9c9d106e9c7337a78847a9d58c9dc7d048c16b097861cb518a996dcbf6eec5bb9a5b931b229287ced614b1372cfadc0260aa4bbb90cf807ef4b69531bee45018c3ae976e48a89692dc09d31f6e685cd28cb4f7c1d24414a5f197a4f4f993ab0fd47d0dcbd9db21a032f5fb126e36c39cb43d4659b0ae271c14c18cdcf8929f6c30c645a91d49a49d7c7a2409b72c867375741284ef8bc3640db5fd21c58fcbef6e0ca3ee19d8259dfe24dec97993f54ae291c42f095f521e493cc9f124f392c493845f129fa43c497892f348e69584272118af21c55d04742076614c6881a1ce9af60ed34e515c9c3d0eff7b57c5362b5cd7be6b21a62e9c2f9b8c77ca0c373183a7b7628ab0ec747685e2829b524bb450c3bb8aab4e4063b610d2e4872e98df075f876d0e51fdb80e5dee508959cf8d99c55f8e62cd4af1e2e3872fb959f53fa8b21ec909f43ea7cfa192119637b16fd0918e58a078305e80ddf8dc62ff2043e7c4bce9131f9fcdcef2d19c7e47f69ca56a044d20bcbb47d5b3f1b7c2f97dc817a7a5cc7167803aeccfb25bac19ad3a00203a516ba966ac57330cc5886316b5e042318964c8536f67d9b286fc69e2494712c5b5ad4bda15cc63e6ed0ec393ca94164a1315977a1513e80113969238018fd767540bf540db74d45fab842baef30cf1e122d0853581ab80650607be695f0b54e6c7ecf7e349a29efbac1b4db3ad975722157a91c94fd75cc20f2008ba639d894ebb1b60bec7c3d9181e9982a11c9f03b99e9d1ccfd620ddd3259ced33a034e27d0f54b57a4c408f9501bbca420c7bfaf45104b7c94ef49a254b0ae196f369ea637af3738453539a7fe151a832748511e57f024fd79b01c0c810ae4f762ee3dde1bdc22d8b9b0c06c6a3a5108b10336ee9a40f281909bfee74b456e0cc116843a3285a4fd54bc91c4f8616ccdfa0fdfef9148f8ebe9d520be7be1b5ac4d0ff38af6c4e2b991631c95341b40824724c5cf980c0ccdbbb255dd82324f28df007a1959c0a6cfc629c8548ec1b58f472184bf0f38fe8b08c52f30dd70439ad43946e84baf56f8d2e93ab487f85ae425fd12967965ab03d186247433c8113b1e9dace4017d6cdeb23e2b07d6a1ec52b7ce5ba046c0c039ac6de8f5920165a4d073d4b8d73f98fd08ad5bdc4a8f2f67aff3c004389db73fe4f6dadda1fb1c5b5c56db83f6b8de6eaeb823e8280a0001e789614aa9faf158526e5efe9f3a05b5cd4f1f6a5e21a8d940b3c4cba91dd6dcbbda59429c95109a208e8083fbadaadeef2eee93f39a1e6d41256aa4020ccc9a91af627d25b0a00db0221da9e48a2e67b31765d60ff663745cdef9b5a725703e96ab7816cb7a35d9690283b7d632229750e7590876e2e4740588a293504ff309c60ffce3b5a8cbd504ac35d8ac961d308981a4216a930b0774dd87f4e77b50b741775d70401ceaa996a16632f61c097ffff6a552b7c0903c607aa66f2ae6ce0fc12068409c24e03e79730686097bdd022a52fb4171a6e5401a64c3e4411e9213abd90283b5d203220933209e6f4533b8166d044e22cb413785e1ab63043bed51424618be16c062dc04c002d41654603256c83e16c0640d8e6214e7650c32d60e864074d780a24b4253587e50ec2fdd99d8ac37a8a1f97f5e778250ace5e05f7cf685084690e83b3192ce1fe48c5e3122d5ec17d4aa2e6989d466b9f0652c2ed34b8b90001638abb20ce3efc43ae49cd7589c3e025dabedfa35171576bc008fef6b186849a230d07a11db0028c1e60085db9fd210c538c750ae0abbf89a62770143e16e71e02b222480b21dcdd05ee219863829a7b6808f2404bb4fd6c24de410e934ec55fb0835ac861505ea7c928ea6c8b0e9a6e59d44c71c7597cf5e7068ab31893b348835a7076da18187e8e3449a34a78b0956787d1ee038fb5289d20a796b9fd6027beb77137a8ab98fcfc155ff1db427751cc1da166388bb1eff83e628cc679617cb98ccb41cd70a6e331269fc22e958de0a576af0b6f3e6c4d7baa52bd66757c570e87c1590c9af00c0c3f8708788c1ef9f8f8082183cfc361702603244f721013c835c9600b9c61958e0e1f7e8538183e7c9c76a131fcafd52ef8432bb09560d47f0208f7cd3b18661786ee440444c0a638848e8f8fcf10337076e9e868a1a4c30998f8fce00b2a3e579220129a206403a4114031c20c64d00640f4800b0f18c9a0e8064180ad8e420a2a8c70c413b526239064b00614f0a62e92d0c12b5882b79f50868070f771524a2921ed5efef4bcee8b373ec771fdd1a3a89ecdeb2c111e503478a820f3370840594113540d16023778bb39b8cbfb12696c81c6f1f68fbbe27b9c2bb96bc6126af6a52b0ecbf44fefef4c0ef3f725c8e3bdbff700f26c4f44b5fde9a9f56c638aa26153715121942121dcfd6621de9e4803d93ee22e6b81c6f47690aa65f0bd197db694787b89b7eb5486a8190673393000f2441b362094f2392b24f6307b9838c35ac4f14aba45edf7a6d31143280179a210e867c9945b5347083b9409b7cedcb88fc6616068664e97e3d4b9e0968190a75f2857ca068e9c499ba4b8dfab1f7cbc13741a9237af74de25e3e5fed76ddb5e06aa47a650339c28fd6d4b6d8d7f9b73a637548f54cd09651286320a7994440385a2150d6ba6cec4185da15063464d960f63e16c068f8a82dce52724906018e4479c9080488e703f37b4dda0393453309540ef143495cc14e09e47b3889e824e48a6127ae790176d5c5af5a669d7e17c53e84bb9c0ace8772e30bf8271f9d509e6746bd74f6da0e657fad17163d9e15e79c32853dde3afbb14e6606a3dd7171481e0098774987497f4cf5d30d7ede1afa67db9b8593d760a82a7a0159d41f1e51b13ee334867d61914633488b330be686ce17ecf718339bb5998ad89da83c499fabc5e0adf465433cc8461217a4bc8c29692d753c15768e931ba15d52c31ccf1de5238c2db9830c21340525a106078e154cd2a74120568ce0fe055ec281ef4995c3dc1836f55532a84d2a4099426533084d2a409ce144a1326184269a2046709a50909b00b86509a00e1f67b81f628e7c6d1eee47da8aaaa5378609c9650eeee22e389225a93f122e3e58924ef8a179817980d0b6a06130313338f90428a991133635b82473483c60c1a4f38e1092ab443018d158d952c424a02fb7f484790365057dfe9743aad6490a6d07e31c2cc8742a150332c981db06858342a17b456f09e10cc0b7ee8c4708684e5cb8206051a145e00e409c92778e52e17171717146a4cf1a278797979a95153857e4631313131354f83060d1a6fdb8922aecdb579a17509361f8bc562d9b47ea84442eba67563248570f3b517385f4d4d4d0d8e0d6bad7541264ca4aa068d4a7add78dda0f229253d51e509bd81e306cac3b1115579c10c288e1c38706c44397272e4e0b4d41c1d393a9e78c21531c4161d3b74e89043b5b64367c70e2657743e1c3870e0d0d141aa4253f872727272524801a988a298b4d7c40a3c5658a12bda544002194978b0c0834787e10c06452cc05860e173f2d52728521618a8406608b0180ce5c5beb62e614e0c7e60f0041830c1a07685531fc4766231a426387f70869424319c31c9f23059ecb4b0b3f38410ce1f9cc1e00358360c674c8824152d7c4d445bc7b006528ae80b5b6801d533610ecc7941152e063ba7253a31482206486850e18cc90fc570f68231204f7cff0979e08ae78bc562311e9e194ab4d0420b2db8e0820ba81e175c70a1478f17604139c1833288e1f90b68300108c450c0c02b546358032947f0ca5d282212439803733c3e8696486fc10e73fc67545354383bd2223bc80331e459b9cb95b0c4125b9229bf907309a429bf9053ce0d69caed8b268230ad4c2b56baad4c2bd30a5785b6c3c494534e39e544e2e8462db7d907c06e243090c0400203098cee258220c4184dc8b9cdcd8a958dc96422adcc299b989209c77151ac489284a3d40bce0b8ef3624e8934651222228e526e09607cd1849c4b204df9859c4b204df9c5b6c9b92599f20b3997409af20b39e5dc90a6dcbe682208d3cab462a5dbcab432ad58e194e0bc50c2944b204d99644e893465128e5a41bd18e2bc489224c99c327645899219d6216b2dcdd46074eca3d19aa90a2d8ad7eedfddddd1ed1017ee4ff648d972f6171e6c65193e4b6afe68ed514a39e7dcb68de3388f7627ef43a554d545c6cb0c08728066be1c3a70a05c64309cf62110e4b18e1bb7bb6bd4bc6adef5d686bd50e01c01cd240c63aecd4d53191a726e08724391c927861ba2b4d6d5ea1fbb300cea87879bc987c946470b728173334148fb6830c773820d8e12574808e7e3a23cd1ceeb25ee6a544fd74545cda48f3aaf99dc8574a2d1a4936cd870bdd00c1d10c6a60bee6a8cb004ecdf5bb0df8f8683bf9abbba29af1b20a8010454d349b98103051c396872b0728274e800021a1212d2a16387cf0f5a76ecd059a1a093820a33545881e64cd0569850bc1cf1a0c311875d6a426001a6840ca1a08fb6246475ecd869c14527851678aa0a2aa07aba157854b861f4e1d386750fff6b98f71fed851baac1719f4edfef9d1a0be554c083051774f4685a5bd15360ac6b4d851b0a36c7f7b02ef0d8165ca6c2ef581d1fb3391e6659e061570022ca54b83f4629dcebe3aed6b9f7c75dfd3bac8e4b84e3736c8e4b04f4321cf702c557ff0dfbffb235efb235de8645e171ecff8dadf996adf1361685bff6dfda9a57d91aef1685aff6af5daab9f64a8d6b9950b8168bbbfa696cf72c4b7fc6762f63e97bb6bbb6895eab25befa61ec09afecd6851051b2601a969302a403243cc3461208a154041c63b70e3869fa0186a820708661aeadc517abe3ae7e1916e21d174bc4bfb6b4401cabbe9bb2f95b3a8df8fbef73c5a9ef330c4e7d1cfefefb88fc80e367239f8518658970383e0f87c5efd77158eafb5596486fc1a9f752f6433d447d288f0fbff830beadf5dba518a3df6f9962acfb7edb1463a7efb75a62ccfbfe7b8170fb60883d3b73b2334b33d4ced0946a9ea1e11a2d35b59a255bc3145ffdd20a2935bf8c41cd3535dc4ff002e71a26dc35b51d9c9156063a950169049501193f0304792e46ed879c07655042f9c9126778fae079d18b9107772d3da4b49ea488400ecb435678fbf8f3e38f2fb9fb92fb120f9bf5fa73540fb4b2e9871fdcf5392dfee0b04d29be86ac707c1ea2fd41881a7d70d7fc787fa8527fba7c5e6df576152aee9aef42049aba99a6fe74f36a7695eff9ad14634edb5850732bcdb8418df3b9cfbed44c30677e17c5582bdd5c4fb32ae7c79b610dc7eff9be7485c961dfcff726cf82faf9d1c743d96e3b59ba7557ba8bca3723ed9aea4f8fd363f491b2f93f386c42a9b9e21967a71f5c99d9804a0d6a18caf0602b6f4138be078dd87a0967b8043f77f2a5d43c99a61098204f7bb109c18518386611068edddd904b650c602235b8f3a187ed4e292494c49012158fd15852520325262649b329454c4d58b26c4133044660f8d0a3745284f3ca7301c21d7e7b682ceafcfe3091de82b70a73e24f0bd356461014a52985075bb92553abd154a3c96113cf9efce0171cbf66a86689c7564b35c6a8228b4c128e9f6b8e04e1f82409ce3542b32750e05ca3a4c607c797ed32490ecb32359999c332956922f34406ef8a1a4d1ef7c9d4fcfb11711827a16e9a41324b45a8fe364390a73ffecc523fdc6a30c5d7aa07ab2598131fe668fb2c53ab1104736a9b95a9c557acd154230c18eb3e7e8da61a2370ac1102c71a62e0f8324931d6dd1a74b5e2aa4cd27665925427211cdf260538c61aaa211cfbda0c41a9b946138e0de304cc893f656a383e6b4e999a4c1599a519a019241e9b3e3257a08c51a349268b8c96199f9923324c38fe945da3e9488bc3328c1335b2d418a3adc31ce1f8304e401efff8b4e513fd5bd284458d0fa76c06c19cf810358339d1ddaa604efca2b92409c79f470e9b8161cc645284e3c3274a382e61818fa8c082f3ac3293da851c96eb90c3b22a0987c12b709c82f35482a354411e6f8a23f07a38bd072dc4f20baefff49e9f7e7e3afa3ff18388cf6d97059ffb18939705e90be92e0bfef65448bcac1bb6a7cf8257c8f69425643ef7f33923b2938cb350e6c54f02a1a20ad032eea175ec350bbe0f8d59df0b89df3dea1b53cb821f8491f741741f3f0823d415229f7e10f1bbe72c0b5ed6776fe83ebe90eee365c187f17512425f7e10f2b2e05db9ebf41f5fa78732faa7262acb7beea18ce55dd60ddd738f43f7dc0dc248487cfa41c8ef1e07fadc733788f8f4a10c72efc34f4f638cfee961eb7477d081e2b590161ee26b89b6135fae6e8bdadf1968f7a495ceaa4eeeda96bb9074db1da283398ee32007e4fd6fd6f5ad8f313aef67ca715f4f8039cc3d410112981342c67dcb87e8fccf8e0a0d38c1e2a48a9c5b781d853934e66ec433d0de533ca7542986f8a235af3094c950e342ddd5839bbf7d0c3334c1fe3f380cc6229c358109f687572a76269f2938a8095830b7cd159482fd63804af1f2684b24ef67899707b53fca265a47c4142d1993331f1f1f25b2d5ca5b1842188e9284f796b4183cd8ca3dc30ddbbfbf9b386c761f41d69c108840bf0e0e53e1243cd64866fd43a6a882db077723c1dd700cdc3f9b40888dcc30f5923e8a4f64b2a8faadd7afe899c79a4781c63528c68f800e9d94bbc9caf634f6a2a83a409e19d89f07c813b14331b0b710d8bf8d80616067f51bc1b307a8b4ea26eeb2102b61a8838c7e458535c8bfd802b66860438791534e39a57c193b507f7097d7da27527afb879ae06b39c2fe9e2f5525ecef4b3ea76b45335dd86fdeb6f93107761adc71db7ce352d55d9ea230c74f4a38504f45a7215ae1e7d349e8742499b2cc21a812140fa812252e0bad055dff3a3a3a5186d011117f1084da290b0f047086bf5de2f72c3e9c6118239c617973c5dd10ce8e2a0c6752809c88608ad804112abdd0b7a0b48da03a71c7e5c809121fe04c6bc0832850e05cb113245974904c8f33334015d230c4b0887ae6b8b96ddf403eeef1e39cef538725ec0dd4479c7490127329e698f07d78d7755bd7c9e7b66ed2c96d734a1b7210e23006ecc458bfbf92c72578b095eb128e14b60ba776e184e17b5154c83303f2481cbfadc0b1b5c0b1bbc031b7131ca5caefa455041c463f1b19c201dab851f41dd5d303c77172081f2a9c84f3939de4df490e6b720547158edf4c0ecbe2b12662a89f380cce9c20c95dc3b16748389a620bce8d05c756c2f1616e2a387acfe8ed29ee4904ac0e7688bbe2fc955d155579eb1575c9e396c3a9531a650a9c57998621bb63cb8edd1da3c718390c67529ce05c91209131b80113a648185b9c11efc3dd9de3e836a9a49c84f05f2787e7c09e632685c899107fe035ed0395fbad0789336ce2c1870c5a5515f5ad4eb4af0e5f136aeea3a10c9b329c454a7be8e5fd797018cc771e53bd8c77f969612c0fee7ab93ec031b07fed1fec8fbab97eb78fac705e7517fa0bdedc48f04b2354cea354f899cad834e73ad985e7efb94501f1188786640f9039513ddb1614b4a1807038bea78a2da859caa39ea5250c63500cf299cf9a9a5a50fb21c5447a0b9d1b4753d988430c513fe4bdac2019cb2398137b2b02cc5c419c4337cf236073053f18fe1402c2e610cc02be3cea19b8bbbbdb513d31fee88931ce1903714277c518856494d1354004638470b5c2102a718ee3525b445102e74fc9a0cac07016c503a91344f1d1f22d2b80707e1d0ee99dc6177cca4122961097f9bbcc2f1041c8607c45153ca4b5c2ac68e28fcc0a9f09a12042e948159ef7b09577f858287b77350f77f57f370fc15f2af59fdd61080cb6f4037507d5dbaf436081b22dcfbff79bf3902158f5a9ffbe513d2af8dd9cfa1a5376080cfede3e44fdb0ff7db59efd141038f59f55f9f00af167af0a15f51f0edbb37080b2530df5ee8c81ebdb2ab8bebd020b8618622feeecb8cb7ef6c1717d1d77ed34d5fa5907088f1ff5ee60f8ddd3f75a852312b5b1c39c2a83ca02e13d7dbf799b9b9b8de09bcf14e33cce6d54cfcdf57757fb701c190b71bd35b51b2c8ee0fa37efc56f7ed536ee2662806a54b666c95daaafaaefdfbe46d5bb29a1962584fecccf5c206282de88aca6067968300ed6f7d734c5d88cdbd42cb9abafcc50f1a933de45657d9ea1f9db7cbdb9f9fec7310644cb5897a57a28633dcbd629f59dfc9800f390d9526f5ef53bdee3503d3b5c503318a101b6c3369e2819eadf5c960cf56ffee6ee00bbf521f6fcbb3935dddcbc4f8cfdc420189c4d116a19dc5fa325c65a168339986131e5e6d474cae230880506328425311603344343e570fa996f140ef2676e4c50c76e2853d901380608490d82fee95da5c5c64bd40fc72a2d4c35d63efd2abb0d456a71e882f0befb3aa4c46110f7a6c45db5a7de9a1a924ae3ae95959ab7211f7143f5d4a716ca8844acfa4d89c3eaeddf861c86f3fddecd43544f4d151ccbaadfb8be8c65d53b4393cd50f157bfaca2d6dcdc9a9abbfaa1549beb9f6b6a12e6d46b3305d7b716ca1a657373eb55f7ed1548ae3862e1001f88edf43e341fc4e9e1c387281b683a7b4239ea06f85fad8b08051aabde4565218eede43ca5b5e6bccae6a1c36c6ab5b1b9f9c3f5a9cdab6c6e36826f8ba9c5e4309bef6f61f117805ed63da402f7bbbe15f4fa9a5a8cd1effb3ed40d5356538b2fda6a358b6255d9d8a85436360f512ad5b5799b21545bb66cd922937988c2c1653217880cc8a88d25eaaef8c1f5ed7bed53b2e0faa8f7e407a938d1666833588e666833545e70ff4cd38c967e960feba79f7564a64affccd291c3724d2dc961792a3169e2303885861820dcd916537c35a4a2498067d12c9a453784a1d2129b9a6c7c3edd9a5a11aae33c43bbf1353e9047f5313f43833c15a6208c9d8ea615386f43b8ff741463275a7cf5d3239b7b849bba3e9f9a5a4130e7f559a5a5a656b30473be6f9cfbfdcdb5b99b946af399465d05c557ffea6768335a409efafd3341d1e6661a3837d79b209b4c8316633347797583f399de8899398a3837d39b9babcdcc116ed5adf181393d438352677c3e35e1a6f159a505f79f68f729adf57e5ee17ca2d91895954982398d638a982ef55936aa199a857117cbe6fe706c53bfa6d65f53658696f7e97fa03fd2ff35fd354cd146556768403587e598223095fe992a2d93047968e07e95a581638020cf87fbabfd70cc1187f9f7cf00419ec6fd3145401e25c8e377080cb6ff35d46b518fb210dbb0995edb43d3b0d9ce8801c2fd2bdb83c7d86c6fd82c9ff86cee5e36bf10b8df6573eb08dc9fcab13df48ecd3666b37c8287cd15d358205a363fa21400ebddb150e6a55e8695c143fcd4bffcf7281f1ccbf89777d48ff832ded660be3f651dc3fcffb09e50fb737a223306cd7763382cdb260ecb59b4d0f8b092baa75a1c96893cebe3b04c74fa54d2cc7fd736d999c33291cca7aed552532bc0f7d754b9e1fb6b966cf8fe9a2b357c7f0dd38defafc1f2fafe9a26d7f7d764b1f1fd0fe4b09cc2fff8fe3fe2b0acf33ddfff410ecb30fc05721712876501fc3de2ae16224012340ccda04486a2ba0475f431497dff2b392ce3977dff4f71580ec0fbf8fea7bdf0fd4f0500dfffb5017cff5709f2fdbf14c3f7ff1520dfff4cf7fb1f8bfdfe6f527dff677120876517bec71187e5169e27680749ecfbad90c372ccf7db241c96677cbf1d7258a6f1fd5689c3f2eafb6d91c3f23fcef7db250ecb357ff3fdf6c861b9c6b7bedf32715846e16dbedf2a392cb3f0b0efb7531c9657781edf6f690ecb3a7ec7f75b2a0ecb393e07082953e1fbb1075130371bc130efb2371af09fad0b7895bd09f896c5b1453804fccb3eebf50260fdb845a8ab00df0d377facfbbaf98677b17eb004d0ba0c50b1de46035e34f7c728e37ccf2d42f37d1860b0e166570d3660b845eaff18b96eeee16eb8b98687e116a13f6e8681b27ef4bc8be572dd7ce36db05c36fec7a8869b8958ff8306869b0540038300fec7a8e766d7db70e3661b5fc3bf184073294d4b55ff06cdf7af5be4a3b9f122a2f91603540cf8d1f33f46f5e61b5f80efe6d7dff0288ba200c8ad97dd2294deff312200a5e166d47fb47e3894007f290068b85f1580bab9fe473fb50054777f8cb2ec7ddc2234e3fc0b2f7c8f922195f2f12fdc22b5fb1fa3ef66d9a76e11ee4bcdf02fdc22940037bf40a90cb2ffe8f7d12ff53f4633dc4c445f86ee05fa00b845ea0b00f87e86d4cbf02805a87cdc2c7b1a3a1cdaf968ddaedeac7a545751ff6324bb99a87b1f0ac0e9bea500998fff31ba37d72780ea66d4d3f0d6dad3fd31ca06c8b1ef718bd013ceff180d20c8cdf6aa7a9c62370b799c532c08cedf1ceccdf755a7f70458effe18e5013ccf2d42330fed11c3cdaab740dc7bdcdce37778fec748753310ce00bf738b502137efd0530c405e7552a9fca4f2ff3132c0cd44a78fc1db397dccdb89fd8f11909b551f833f90b7390ce083783da817c4bb37b7de7ad7fe8fd1006e26f23e480e3dbce7c9a107cfff18e1dc7c7f0037db0ff2373864726e114a0d00bb69c9e0b40e00bb45aa0c0e06c0b945387c33ceb764dec616e13011026e66ee8f51169279fc8e5b84c276dcac6c6c603c6e86fd8e5ba4cef068dd4c833bc0af64721e875b84caac687c4ba6d5b29169d9fc8fd1016e2692f91d333932bf9ad991f33f46346e6e3d0d9b5ffdcd2dc261221c3384504c3403a3330688f919333837cff89b5be4c377033f463837ff6324e466a29937000ed8cd3c6e918a37f06304e3f13f463137e37ccc8c9b6f7ec6fb8805b8c1861a0840c30c320c20480c407ed814bec7ea3c0c56c70bc0e67899c53e6c005aa6c2bf60753c000229a425237c319c4981648822a9c2fd5504788563cc69fd2b9a0f0700c0b99573641e3d70c438c3293638432ab84a0ccef00ac49202ce300b8e708cf87d04c7d849a4706e255d0ce1f8323eed4209387e5de940081cff754005c777ede0081c5f67075770fc1d1f4c70fc18aa5481e3db80031c3f0708380cceaa28c14a07707c1e1c066756b2c0f17ff001fac1f19b07351c675e3881239c2d155184ea69312a142ca3c69108b418c1111b50a18407448831ae562b0f9a5281244f5871628a069430c2ca96262e1e93320ab13f85311f4e61a4f20da1814fcaba8a4539a858823c5d0473b8e79ecb3b3116f3f05f3e3f66cd372293f1f3daf053dfe58dc8541fc3c5bc7f4c6c21185be38bfb17ebd68be28beba6f8e23e29beb89fd6dfc5cab0de54adfcc2c8470665469c0df1c5a9fc55fe9c8ff8e274e28b53f905e29ff387b2caa920105fdccb1fd4acb23c58ee3721d8c412a27a7fd5eda3f8e27e165fdcbb2ce1b897b129c6da87934098fb6e963e988b5a30f7bec4bd337993030915cd68b1c67d5ce23e32c5189471be145fdc737fbab98730b78a947b2887a8a3a4f0604b892abb5b87f86affed8dc8b60bc4e9e703d1e50aff643b4b2dcb597e5937d09f2f84fefc2e3e5dc5577c1454eebac8a06cbb14cabc5e411e1db61d5479730be17e186544f23ce9ee34ab6dca888567595fd061e1eebea2107687456d08698a1504fbcd0bc01d0a3ce8b0ecd8a3cdb93be536773965f794127b52ca0d42987c77e9eeee6e1bbb7b6329a5a41ca518c258fceceeeefeb09d6659e275453a4abb221cdda64a4a9751a5aa31d6c1977ce83201ecdf12250387a32c1284e2f8dda98db87cc28fa078a2ca5802095585e1ac368227d505c3596d03a929b5c370c6c518292db8388214556238e3a20854b808820401addfb4abd48bd4575390c64512ec8fa29d931f13a83e548fb45409394802fb7b1546151060c0049328b25851852c56c1f1c4e3ea744930cc3034d897e004fbd32d92724004f6ef7e85859415f8f4608a23407022dbc1961f789122b1796048d6afb3136330cacc8b201f59bf8fa801597f0c5490b0d700fb53548faf7a157f15a3d052735e978e6c2a1c7061ffad7f80831de0f8b1d6f8bee4e3e34384bbbbcf40fbc209134830010646c85c07d85d0676777797a81ecf1f4ca67982738b8a27e0f8323ea56d81e3d72670fc95165be0ec065be038c3010970ec2bd55593707c59abcbb5a40545243802100f8a64b18b21b070a1d1d6af66972b474724f08d0cd26438c1614105044a58f820045b68582481881e1f1f2c9a70640b5316451cd972145f106f5b5d75462e8c571245846a319c41514331018518a9a34a430448242d518120a90a29ea0ac35952edeb46f3f1f1d9c096d484b78dfb6ddb3e7f6bbbae229ef80b4ea1546a9515e68ab8f29c0b3fe4a2f8c1dc4b11c8b88769cc711cc731f90b36f90be21e24b4f80be25c535844e1ea42c86289e1ac6605ceafc3d1c083ad3cc307cff7a2a81c0920ec070c7049e0f99b1830d643f1353f7347e00939233821200f0dd714372d9087fe7c0ce44d0a3c7f4b82aef973abc5d7fc55dfbcba3dd4dbb5814a97c30d8ed26eb5b9f2ae0df1359fb337985ad50deeec4fcb523085f95faf309f3a0bf3b7da129e31b86b2ea950263f6f459d85b22d29c67ed88a624c072679ead38956a1d9212a469014b75a8d4b38733e272a46608413ed99c332645272586ea1260e8357d470fe3017386f53f09c34c84303cf0fcf6f25db90fcf93fc4980bbee653ee66ba5d2daed57c1d86fca4b4d6183df89adfd917f89a4f2d0be6ccdfacc59cb581a3eda1f1a9367fabe1ed5b89bfe6f790bb5a89bbe6b66d43d4f89b1d722a72d7eca12498337fabe1f91bd376a5fbad8abfd0d5b624c803ada4fe8aef6db5adf6db92c364f07c0ec861483c06a51c6d57b06c59f07c98391f3c7fd382e7c3cc1dd998f07cca6d5b92c3f2968495380ce68086789252e3673ac3474a95141e6d723a53874218af5dd0b6dcf5dec7984e7cf94b1dbbf33c1c063d3e7cd7c787afb3b3e32ecf3a3bd212d16ff953cbc35ffe2e5945ddee8abb5507be0fce14cff972630a02e7f91b9c367f79fef0e13efcc3f15219d4adc8f377316aa5cf59ca711e4a85e26c86c128cea25e6589c447ad50967e47d40a83214d13953ef73338ecdd15bfa1d415ecf4f161f0382698fbfadfab5e421e0f65b354d44377a1ee576f7679eaae5b6b90cfbd1791a81053ff5ac63b2ac87ceecae096503ddd4ba6ba7218ed1ac614f73e9cbb2cee2166fd68ccbd9fba9c136737954aa5ba99aa6c55a9208fd7c371af7a94dd817bd57bf5250a48455d960ca8a70f04755d32f71668aa823885fa2caa7baf83dd31c53d772da598c70f2baa949a29ae4da59022846d307412a5087b2ad8f2e1f4487d9cff094cbccc527798dfbffdbc7987f8fd7d77e032cd437cd83e75877cd8f3bc9bbbadc7d9ee1db07764d9c3dc3c88bbee3bb0fdb410f5b5d6ef3f067f978fb741883f033cd644e408c2fe3a3dfceb970ae214d2fce1effbec1646fdbe0ff5db43dc9685ba3f30c4196ea7d4b6f9882877d77d77411fee4cd57b291b2543eaa2fe6459a96f9c7aefe4acd4ad32594575dd7797b752edf73e3f0ddb0966e5aed8315593a85eae9d95bd63fe66b7de316744fda03f6df7b10335437ab99e1b9653764719d42654442541feb427e5c805e6486056e8819626922ce184c9165b4821eabcca90c0164d28c1114a58820b9c504942f439e18a129e0439a184832b70200548b58940ba5085184e504212b4f869e206528698ad04bbcc21e4f11a0576500c2c2c68011012ac18f2428b219c56ee729812c0b40cda8bc203d46aa2c05f9490a81e96ffdf149dbbd33aaf4c7ed3f830a9832881842474c164041216c8244d461428a8bb0f47d214cb30b24489147ca1812704a140053299451427e8082aed76c2a30e83f05db5c298bfbc2dbfa55b77ef8007614cc6f78a5d857770b8d37103ddcd85471d5621840e1b4a8c1dccf6f29eb4a8f1b3ecbaaebbd45d316e360fe981bb9731765d8cb1fb2ca5fcd87537d31be526e14b0969e04158e3fc38637cc1e6807c08e14738699c4f638c787e0c9a47a844ebd7ca9a20778a211208001000007315003028180e09066391204ce338f10314800f80a050624e1588a35114a3208a3186004388210a184088314499211ada005b780be41022418fb4b7ba488332ad5329b004c070512eb92c3ff55b1e07e1ecbc8a92505d822be8405c80e6964f85e0e9bbedf78c3978113584dcfb1b651a73905d916d3bf3e176349a02f5dbbfc1e9001f0cd8e57a11e65b8e0d6da8e397af58b4930155448fbbc44d4a074306a89b5f0e0da8e513b3461a2edb71f54d617723c345bf9ccc48c61c726109f7b19749bf5ce817115112addf500b8f00022628c5c0a160a230235c21ec853e3671ea068953c43255fbbe5f7a0d378156c6487ee9e46241967cb95b85f9596675482fa9891d862ae5a6ccccc462bc8e713e3f5c270ffabcc89c2f7d3198d7015d0ef4f361ddae7bdda3e46b8b8a9881174d8bd7923ede7bd5d85eb3689e03e124e12719f816c24e0bb309352dc5b0be711bae95b0914289db1e17c9359eead6692b57c5d05d017793f63be75d41498c0e0452c1ca8490fb0498046f9a0f8dcc2426ba92b89817c5bc51b72a50ff06ee1c6d6d315e3891f9cf7e6ecae1621743b7c5df78fd98ace2c26ba345685db52a8645b885be48848c5f5a3a90858218c3d13d53c453318de9223e6e3a3355645370d128eb0859c88305267358727f5ec0992f8241f135a40c513cbbf2033c6e72443890e9194e98e08e7ba98055d529c3829799d05c2050d9060695911bba4c8647a88930f9c2c164881e4b8c75e105fc0fe3260d3908c32e5eb133bc53f7f16539ad191e8374ada51973728d28059485cabcabf06e51d45ec92f488e0688379afdc0871cf3101c9ed89328655b51c11bcc3c16bc550cf72dc092c7e073c11b52e3eb06cce00d0770cd9a5b576cc36e34c4dc57ee16a2e751abf0c8075c9de3d5f869363744cbc58599fb663efe1f2cc82ad093474876419d73824ff288638ec57567f3a0ac27b0c0ed743a24f07df288715adf25ba955d3138e645dd4ab66d8042da58a267c66e29b76a1e6862de526319910fcb8421b5ca0a08f35e6344e0c9e13232aa4559d53c8cd225e0f347a77059c3ebf780970e0af080c7b2594a707738eba4e09ee1b62539d295a207a9463fa07fde00d6c325814877a8d8ef39aeb76b1c0b6a27d830ca24697bffa5cd70a2115feffb541518682a121fa2b249a2bbd90bdba1fbf0c16fcb29aa7b3b24f2f011393a777d1ac7f6d80eb1fe3aa2919ee8bc8ac1ede6072f9c1b200abf50523f0e93871e957a8e66f7eb8eb5b01628c68e0c1f3f9f2442e8507edf8f75156eb3f4e98af8e33e3383980b84c489fec055475f041e65124d205a93099a89e8606df195074733b6315bde2f8805f4b73b4db3d975ed612ba524358c3fb6849f90f1be54e0b66652d30857f09940fc0346ee3cbce22962d9063496ae2e088042a547a40d47279509a02e1e53009c727b12eb4061bc304247817cfef9968819d8f7f780818b112121bda7893ee3740cf138a6c2695acd1011f142c857e5e48d6e583f580363e72bab2208c00c0fc0abb936d146e10f6941c7e669d8a304d3f40630ae3288f75ec3f423f7011b858fc91904e6e702ab8824d33067c88c55e84198922d164abb5ace4a03f4d35ed5190d485e7eadd6652b94f614d9aaeb97f2b64d3a2a07d4fc60f2fa8d1dad0c54ee8a9e05f2b9acb2490420597833d10dba8fb7de2d47cbc1f2e5ec1f2400857e2254e8573521ef05b7c40ff67880283045db55fad8236e06471be4da9956d77870d804fd85dfafc63afd1e19c4083e6dd017fe4759ea59806fd9c067aaa89801c26c3fd8a3c1c1f583325a4fe1e6af35f4b5bcf4bcfb061c07e4ff1b7e5e207b7d2dbb2656bc8a89cb603696dd034e08039f2808e5eccf1b62d1c9b36056b010e75b3e176e3d9a3d43fa5693552ecba2d5b56837810010a298a0c1c7d4c8f7b9b1f88dfecdca837de5b1c4f362523be0debfd416fb8329eca371e7dd550719afa824b6729181e7407ff21528c6108783e39ddec6f27e07bebcb741c2c15f906b7be026bb7bfc1be56f70f8a4ace07bb399b8d51b1c5843685bb1fa00b54622a41111c0373805ecb83b2691bb1c289f3909a75eb61edd639796715cd9185168c08845b4a84611b29818b280989f7568ed22ab3fc553a1b4439cfd1a84b5da38094a337ed9107bcd496db82cd3387f08b82fb50b08850489da8fe061e1d51073c980c8a0ac1ed627a1102efc9e5c2ac0a10e5a487da7149aa3e4e1b1b13900e9c0fab0ba577f4bfd1eea22dca69f97ef925899dfc988a278e47c832c7e5b0688dd006ff21568b159d3db0788c0960a3b4369e01b22e3eea413b7a94e969d73d4c2b88273e6992e8967714e42f308cf852ea83a73f32e7947cd84d5d5ed3db40fc9ce0290c2e1ffe865daf2d1a4b7826c19f743d5960d83c55ac321003cf420dc312cd6df99ad7c9b72a055a94937c89971581ff4716094c5b2b064b587a305fe551e9573d9c07fe754b5a07e0a8fb2ca441c2578c718ebc344eff589d6b2046f13261966cb77e1976576c3ec8af8394c34fbc97e6e84a1bc261ee92482fa059dddadfef284c25bd637e800e39ec351afdcbbdfc062d7520119b43466267df3779319f7976ecb730aed01aa04cb4406f492fd138c5095a0276ef9a06212516f3d7a6e827755017159a125c757d8fae1b7195ce8999c89d41bac18df822fdca6fb1130d963edafe8ace3e802e838ab4aaeaf366fd46a602826ca0a8543b2eaeafa10ba291d70b7f9c2fecafdbdff70ed6733fe8a9f9e3105b293593ee77871248871f397d8bcb2d1cde16cb18135c66f95dcae3122b654d43ee0aa36e3b5db41182fbfe908423305dff2164b4569bd942afeb6071c29993bf0d7cea626180deb155c6b9f70a6a1560cfc72e3a21fd4372fc2ab14946e011fee8dfca39bc6035adfadd604096427f16d1374ffe15c7a39cb9d4e8be7f5ddd97739b77d87846b5e832c22e2361d1b82a7ec878a47afaa3de964481fb76d57e18696b72c52405523dbfab50600d9a67677022daad3875e17f68120f4951ff4d1607b8a0386e512ed0c7c44239a12499cc9a997122f3ebbea3ec6d67ac5550f8a8399b57e3c5314cf696b8bf25daf9444694218a51d707075ac56d4f8306ad0d70150ef93668a956ce2002a75014fa5d30a318322efc803f01c26005b9e4dde339f30ccbab09f29e9ecc0a521096d5dffc645a3200ad85404ea3d919f0b65af8efb45ac225ae9e8933e566d8bd10cd2f1fef4f642984dcfa63524276125708334569b4e7352d74beb07e65c503c0107240487e59eba768ee73ceaa0dd12fb1a4a24bc98a460152ab8527780378162ca2d9f7fb882b10a01e3483ff85116653ed79726dfd524bf0478b45cf1c1dc926fe97a34676de2d3c366ff700d28758a251ed68cea30febd1cca44c4473788c4f80fc31bf2fe54ddbcd4a964a32ba5a1e59a271a0a65b956baf82996a48c50a90ece5accb5cd6611baa7f579ceb9663c3b8b6ad762128775372889cbe95801c748bdb3c1fc5367aea0546b612110edc0c3a2d595c8efeb1b4b480c125e554db7f8bffa1a72611810fe28c84f06dab703a0c51c9335ca92c567010047130fe260207c30884009b236e9f520180fd202ba0db9973059feae66659026619af8e2c0f7014876b37c3f92f642fbf7bb7ddb7872926fdbdfeb8f624cc133e82a86010a0c397c6818f8c0ce269cd33936ad4b77855691e88556bcf4a4b7f00abd5c48352faf0e92af0142840c7c444a1669d05759401c1a5852f276a58d77060929c7eef955e56fdee3e84fda3d51115bcf8bb604087d719b66a02c2bf1101dbbc7a7602d2aaaf8b6413b9e5d5c59f76c40f371140024f2570038541caf67349a3c3835b9a657b2f97639a67aeddc7e22cfa262f62f8a028e700deedc99009aebaf2568ce302aa47b5547d45e10d27eebd0dcb550c707f989063a88fc2a3a42b21c708329561f698d0967887a22471cc9caaad15117e5b38754cd71fad72c16a16d8b50481c375cb8ece8a570ec5732a3585e9e64e952fb7d65bbb2c25c2e3000b835d4815dc76eb4e00d5a490d32fbd45c7250cd7010eaf033fbd705057cd6ea2de701a38eb75e90fa20ec48a788507ab319672a8194e5b096a758981d1766382f3a0ac49cec8e26891daea550162b69d4d76d55f61be861c83691dba7ce8b50eafa13fc395b37aae5bb6b8597b417b1c3df776d0d8452f4262cbe56c6568d1c8e1e832a49a3dfb1f471f548d05545f3eeaefed8de0384e7e69dfd6f0d0fbc573d41d3e5cce54cad8e14192ce6c036ba7742e598dcbcbb30a0b61a4a9176fa32f1c810ab6e46666909547b688200445b7be8751020bda8050eb00bf6b2638d23ecf537c1878fc635b9a0985c91d842ce2b0bf715c1794a17a9ec30bb9a4baed9cf3568e9bc4a1d993a4515c1d7b3ac95bc8ca9a3846bcc1e5b6c0124e1a877e6cf9503caa3c5798ec70456145290384e7eda6d3005d0219093f3f31672543f8f388917e064e776f7a448f250d6113dd0c28fe0f4aec92a5cbeb1bd05cb4c544001f12c4d5d633d6ef3a63c6bb2963384372ae6a1380dd3cd911e5af90fb42fb32f2d66b42e47dcc761eb236258e23483b2c7e90e9cbbd813c23926123c5965d1871d88dc42019844b321e3051e6ac17896cfd791c9c91081e6881117db27db82426e28552df53624af9beda800d527935612c7b25fa9f54626c950c3c3fff54ee7ac1a06c4c9dd90a69c9ef2c9902d32e80aff4494303b29f01e127b06084480412c1d2e800a5777d343aa0114f48140e902b7da13ca2cd0f11699aaa0a4338b3a9e6a2aa16b8ec6e400132a6c3c149dd505e5cef0250d354e6cdb21e66ae286d17a40d47fb962061c78422671b0703fb01212894802d499cee857aa1c2f9143039f2d7de913cc47a415df2ea8e57f2640a6cb503c38def9cbeab4ed9b7c43a900bc3f32c4ef8e88cc18d72a08df21bc4370aca42c342ad3e30321ac2ffb6985d083cc101867598093ad0471918d03f979362bac3dfc22422030704e5158dc8088cd47f826fd70f8adea846bb386b80346d62086ec1a61221f44094ae2436d7d5ebc6813f0d805122f8bb233599a6a0d8b5a750d90f39ba3c4dcf097e1e2500298025f6007c1572222e3906464f410be4b68e55b958b0f76f3c40a99ed62cb4a849f85b1b3cfc661cebd2b03bb6cc914727145143525e83b6f8661ae17ad469db7a2c05ca2a665986f5d88501f2cd0edba2332d3d756cc8861aea62d72e255581af74b121f571772e7906087dcfe070fee069d417f4c9f8ba14b657f448453721b5306841d8e93eceac9c9d0c578f11729f2e70ad01387a6719c95723b1ff89f3a1dc048da4c785a906ca491d1ca970532937f5d0ee0f171fd14e51793db0ce096cb2549f58aa4bffcfccf7c99a5beaa29ebb9c8e933dff470a514b720f51dc72a4a533884cb5165575e9a853906b7fb7f81bc8f5d25bdae73590f44f453e746469bb6d20c9d2bb8f7b79c74e6493f102a4930e73625a77198f53e9929cb8c93f587aeccfcd313220e2e6ef62b3e344b29f56b47e7fb89a5b46dbe8213c20f16e1a5a6c4b80e4d1fc622631169fd0ad1cbb4eac441e81d62ed27baa431c4b61d93bc08e87054bf46f5615b6a72713d2a8545d6828f6b5caa5b45d9d826f6c8361e9f6e93be759b2bf23846a96ef9fc792c2f632b7963c2c1cc8f6a7aa359a66ebf186e4962ea169f625415336581e766e1b56d18a5c440b86b66369c6756ae5198ad97b63293d1af486d0b9c87124a80d646cae3472c99bbb6e24a5f84f87a49f979d6b43a97df7115c191a0660a137ee70e4d79ea0a6c58432947f42592b2cdc3d59071b4d3f32a38c2d03f765e2a6d635a749d4317fae3374ccc91c1b5ddbb51862ccde262b75ef27463ee36ac081cc37ee664d185da70ac597a47ac45290e187388fedc0decec8c17595135d769b9d091ba457fd8e5edefa0714733deb209cafa7711e8efad7ea480b72f3411b45b1184d76515da52d20a2bdbfa52b97c0dad8fad03fe8e36dd93bfc6ca62ce354275637482550c85b916d78c1d5e97d690d2dbe671d85e790e1de30bcf608eba62615920874a179207a1bf0713ade2154a8eef9dc75e3f735b7b1c7b9f39512068ecb5451306230db4939935385282307f1b29b5a01467d733881487f39f978d0d84d208440f158ce3a47e52c805b34f12cece122717e5ca3f7925fd62cd6d9b454435a6c67da91caf88a0846118e182038ee879801668b21a74cd9116a1bdb73e7f2310b88d5ca1571f7c6fcbbdbc91724f8d70f0c2c2ead649c3c7f5faedda358cf8edb6c05a0be98419d19ac65f3bace7af57b4974b7edf4f7b21ac15394572571733f73e4c8564c98c18aae3443b9389bc9db399585ed8e08eb60d0bbffb45efb548efb0268db2a8057c063a4c498d71a2b7b8ec3bd5a433b84e4fdfb4b25e38e1de1a9bd705192cd94dc966f50964d2b74d1c0eacff550a43581c0dd3a261ab9ee73f4c9b51863ad53fe0d8a88434b2cbc0d91735d6c24cff2b12599a5f19fb8531ffeb5cb1ad38ff783ecfebe388098841c5f6afee7c1c07fe13fe3d3479c58eea0bca668469452fbb86623380c137ef62ffdd696b06dc44a844d806c1d09da090260be1aeff1fa3f5c555e242948b274551b0fa3619cd588615b0238ac77a6f6c05328b067043ac30dd5d0a9ce3cd150f535b9c5599c7b0a43b83fbbdf2610b4fc9bfd6ba0d3a2d310e6e9ce056603db95561670ec639361e94cb0a26992ef803bd07ecbb5d77e6e664aadbfe18c2498e53eb8589f3015decb51dcdf51ebce704245dfe6f21bc2b06bc608d5640d707282246d975b307b64b6ae80eac2262a0a4a2c60c57a62b56b30794a8f19fafd385ab5c00953b61bae2bd0473f94919dbde731d03adc95476a8a766a1935136c6084e4559ebe3a2d288dc99e8629c4c7a510fb4f630d0d56266808891718d1fa43d718fda7ed8da0010c3c1e500b1d4a9343ebc0b1656d7873b8a40aa7cd562a90b57dda623dbf31a9cee71f0fbf1a31a81b2fdbc86eb1c0699802c37b73f08f18435f75c9231324bad39b52e9672064828c626644dca71f0cf56a8067675731291debae6adc623f928a2c5cd978f29dc9aeacaf3cc7d49f760a3aca00ee20a25e993b8bc7bd166a4a09bafca84ea8562e717120e4e54c6ecb9960761ed5a008d56865b82284d4fc2aebb9ffe169d57f4905cad938b647df1111707924c42658655e8d14577e28de4df21a2400f025a273623848da4ffb287b8411dc596f04eddb5051936e88c7128bcfee9e7913b0a0a55bbadb8b480ca6638471c1190d44a545b07730b61f6936597d10a76d4a8a50573c2862103e7b2179a7f95d5ea560b6d3cc276bbbfca02d26bf5d1558e444910a98f47b7802f2d1606af1d623a600b8e139c9b09e664b50a5eadcdf4d1974e04ce5777b51423d8773d3aa93099fc46d9142f56b30a262f0db99dacd770c6469c892efc177ae094885db975ad7255b77128765428c294a0d74b1e4269076ce68fdbf0d9c5217f21ccdf98f7eeab798549ac3e5d88c10c61f1efb1f5fbdb7597d4053ac20a931d88137494229573342123e1d09c3e7aaf9f4de60e96748aa84ff679f9ed58eefd2bc608f681a662fb7f687bdb6d27abadaa94b3fced00f6b1845feaa631f31b6088aa18445b2fdbdf007078ca4f2ce8e9d68f88e34c7d20d2056b1507a40639ef34c02b09cbaeda189aad71fe319ca33c16f3c7a4990df80c35c3693816c698720bd923a5a0f94c80f208a2dfbd9782c6a743fff00b047122ef1419d69e35cd30120196ab9d687ddf1954856f588dd091ddf9eb65f5df4fc432c0738d84ef37c56d509de3d369d6016549c10c993e89eb05f156e7f702484ed273c86d81f86ed175f7c73c680fb613e440ff69f782b0df235a623cc87d43fde1b1185da7de4c70783d53655a8a5e6497c1ce334d42974a0522cbb20ed9ae67c9258bec3a05cecca37af9d6eb548d619a5f5cf79230691eaa705dc87063cca1c9b27f759d62a4a5e5671adb38c26b5e80e44024f8e26d01107ab38ea01642500041b10c0e4858244f496e016b5ca6b2f8aa0d1f7a9c612866a6824c4a0d43d8e2ff27043e459e255a8c894759d3f4c1df005c5e2c9f90a23db9d041082453c8172e0a5eed7a9335a1400faf0291b193ed00f33676a8bf2427bd58c32ac006350594c80ac6a569d7268c1581655ab41b902da3375ca1e810da06519774c57400236d19eab72448408ddc6f013c40cd2ff70470e913e42d7a604c9f88173815b18e35e1cd0ce2688eda394c66c2c7f285ddb5fba13bda56ae06432c07b49d3b684cee104a417119f0cd8d65517b642b5d57edb4d55e6a23924d2ba35964338b74c037a1e9d6d6587db774b58b4858e1e8ceab71b40584f45704c5a25496217c2587c55257068bc224d443c030a1ad69518b228381f727212f1c46dc17adcd024386779e4c22c4c66713c1abc80ddb5b4b434fe97b6c656890493ece0a63cd567dd885327062ec5202999f7b148d8b5d1f27a0df485495d234a886c5406e6adac905ebc6750c31bcd512651715baef964dcab4739046cf837cf2192abf3df9f21dc3ea8de08693cc025ce6d7db8a8f2c8e5bd8a8f1ccbf6642faae2e53d270d9d9cb485ce4fb32146c987b0595c67b30831389184ea7c238750aee78fe2b350330eb83225a79baa4b24b2e2cb5ba064709f74249861228ed4a98a25687b4f2ac7ef205415c2e25c23acae032d43659a2a6c130ae9cf5039248a57999a630cdf0b43df6f8476f9b0c8f1b171a9439eccc6eef2c2e9a77f5f4bdf00a7a2fd4d0787c266550f431e9e59879a5201795995f28f362333d66a9cb3bcfd7a94bd7212aeefba15ce66f86b58b0874e7e382782882c886ec25c6fb1009adc8cc0cae8dcfd852e6a1f3e74e1c30732738b912a384bbb047f8bfe55c8b6016394cc6b6f2ff1f0a333e29de9e36510fb9f8ccec94b40b33eb4c8355709eb759aa0dcea8d2d0a48f7c235be26a590babedbb1182f3a0869cc3da7e6a752311a1abd002db0ce4fb6e769d8047f8f359454ad896083c8fb232debcddb63084f95dff3eac5fd8d5b544e9ffdda06d317fb341dc2c80701cf18ddd34f9b7c5c79e8818785d0ace65061b45136e33cfb6a08868a5743fbae15b6f0c384c9a8d6e9031c2e77614f90dabc44b2c8d0a8bba4bfd26b4cf45784ca8011d8ab534166d8e4e537486cb70eee74e6ca31ae02f7d1b00c1242b6d9fa4011c98d6964c3ac9aeacc072c6acf24b5cdb0addeb1d37e4c59902a2fb3806ac4ecb555531ca008fe6643baf99dbbf1abfdb1426040df0a9dbc1d3455f8a6aacb425233588480bf0614be3aae8c6588e80519323c2bef74bbf4d6b06ec202644e3e890ca4a3401df9f0f9ad36cedac81cf0c07d6a074847099343cd99413b9cb2fc5e1b68db3e65201dd9a66c0742f2e8882b2fd34e13f59d19010a4ad45e26005145305438af0a8baccfb2c8ec3a7d1372eb5d1f08db7bb569edecc14f069d1690db969e04123f0948a778e8860a0a8a470d34e3bf0b86a1571e1915009dac6312fd1047c7f27e839595a7c85b21f9c818f5812698a1ca6eca316c3878e5c856b115cd05dd82c97fca4e244e7324ae82f6862f01f545412d2694f2581788d963fc4d08b0331686f1ee27bbd2af208744d85b1bd07e8ff846a7257f21b78b67dfca29f4bf81698f841f5a558963fad1464e4cfa630a467256bd9d97d3885165a826707bc834c932093ac9ba6a12aee7dc82fdbb1a49d6094f6440e4afd19ca476fbe2279a73bde77fedcf5966686dfa765c9d3c5a96cc3f64bc488a98e5c518ced45900cfd535a11942308115dae529eb01b2162097c08d6277bdb34fc89c690262ca9e72b195a7af490004f6ef6895d7b790604c015e1da584388fe720d07e6f97f1a69bf0964eafc0198d909a45d3c47bf6b845f54ff3c8a94e1fe18c8e84278a0f79d43b6dd37c578856ad72974933862119fe8601c4a6fb45b96c605b962cf3abfc6aebf68c6186fef335388fa5b032a5c90d0edd6f8b75566234bb426a553e1e4f68adeccd7070af4bd2dd6863c858a24cd691e7ae416ae932038bb70f33f60ff10bf927e11db112c391624654a44a3ba6f3c9c9d4ea0459c44bcdd335cb8a1ce04b6728408876d0eeeb131cc8956b4ccf4d0507dc44cb40afd8a41d4f53e87fc1243386df36cee4e8398581e743b048b9ebda0d27b4e13993dac37d5f95ff364dc4d4da8db034236d73e79b3130ca19ddeb3ff962d719e189b224693c44120d0129998c3e5a18df1d716e81dc0e11e1238999c7ddd90d5c6678dc7b7adbf698d27b4b1e77362e676ae6b9f351db43119ac9f578f1538d12bad620da1b24edf94a948efb976b4c6b1d03b94ce948e4294edd8aa9a8bed6617a86fe44ff9af354e5e85ae8068aafd5e8b625bb331f0f5e18724eb571ce9ac8dcd10ef97ba88964b188830bd005bc25faaa5b725bf6f8c68fadf333f3db643493a692c22e60c1fe11db7a12549dc4f496002582a697c6097500261f192cbf4b30aff5a3fd8ab641005839108934a145c06b56c399e0ef5f7033b38ddb2a06bc25c585307faca39aeb9523653302a7dfc9e5144504c9b11df4c12231d4494606c68d01fa7166a18fb8d7c0d3ff5a540098ae75beb8c23e7174abf27fbb395bc6fd9b7a761a039860de3b81f2a76c387eb0156f76a12f66742154d0a8f02b23730e9a0c1c3a83f7c796a38e8d4b4e02b0e2ccd6ac10f858f69385270139c29c15da00a8a272a35c796fb3b7b1a099900ef5dc1d85711e452675beaf2a52f83008da97481e1bd8bde9d8482a3332f79819e18357015d8c3cf1e097ed57a1e552ee5952a21c3670e2a6919599ed554d4eede8b8f5159b3f1de8a5b31e92483e9a6dcc82a7dc491ee94ead0782ca6c1d7b78f55978429ecb85487015203024563fb87246f83f92c9d905ad0e1cc3aa21521d3da92d57602017f47a869426449b46e6b3469e7c2d0b8f0608a8051a922778faf053b18d696a0539360eec039c8bca3f46e0845420fe515ab29294ff288e04096f682059715a895b4bb95cceffe56d673dd617c6214bbca0778fb6a41a8610de019c22364394df1f4095fc10bed89abb41cfe8be40720306c6b2fcd9f9ba6f9411bf70e9e3db1a559a1a5faeaa915a27734eb0f325b9d4b77829c944df0d4e5de535544d9bf67d5bd6c07e6dd022463265213c12c5d099ac94093a86e779916f97b6011e1a2c25e823cd798a5df5f52d6dd5e7985c55450816a35b52c739a7f6a0fe171c91aed866ca93c9a3061bdac9b9f935704c4ec3ec749c584b59af4fa74dbb999aabfe63784fbd69da844c9b2d23d052d8f0e9ca4e5b3b049a0cbc58efa0f7915512ae7c6d4796158ea284a928d80bc86a5ddc51bdbcb6df320e9672a8ed67fb96002ecc8b5e35d766a4bf1c595f14e324cc8dfcc56d995527a82fb45c2a6e9c1f1b433733ae57f77696bba5e82042b819152a207ee3b4d2938b0e27dddf6cce6424c4209dd46d2e81eb8ac526be64921804c8faa4b830776bd16733e8b503d550589fe927bee2823a914d61b5cd3f7ed57f2c4f497b3963da6a7efe4ea35dc91ab127622a918692bf102d134ea2f92420ebe2aae0e74dc46d092aec60996d0c14d70651a34686528d41cdb5918bc93ec9803a4c68089fa157445223f49ca974fa0f6e184bc97f2ce4f0f096284ec379919df51bd65cc41f7c9616e14e7dba4531afac7363304acba8c7833baa0cd1dc0f195ca277ce62edf44b0232391970a44dd9151a1e778b68e389406812a4ccb6d06d8e090cc8c591b5262603e21c268bd4dbe451c1a19f567e910ee9b5e900b305a88cb4a4734ea2418454aed810d4b2cac181f90575ea60133aac13502fa3c46f93efc2eead81fbfd3cc07f1c117f71666aebceffcf2485901fd251f60ad3747e1c6bf9e8ff1d85bdb4abd56c37379e535482f6bd1f27397c4f404a86355cc642caeafa518dde1e34d50d9d5682bc264c29ca8e4b18eda129a064f983374437cff0fe323d2071cb6796e22fce388c64b8f20a089456e07b6b7298a25effb43d8058f30e4adfe0062baac483511b551f0c2d0f2c2583547b958e4e72ff2f571c5db95136f027d518adb63de600bf84fb9133f0ca73bbf71045143f1dac12672fd590a4d7c24e7772d2b6dca2c489bf899d8d9166eae47d6d94b8cd63554bd9b152dddcd58ae2730210dea686092adc4910d583e73394c1ac40300e30147f288b55de394e6ce8b496be8041c890a4d90bcae46ef704a5c07d2e1a76c9a67f32f322bee8df1ef69f4708336e172c2d1ea3e7e236db4b7b80dd5c0dadfd4d2d88324962edb35792675c384efed08900feb7aadcb4a31b80d746bcfa43c446c8ef2247a11d64d7a86a2033066f65cba4c5745871b891144dcb3479d6a37b4980936b5e8d33d25e5106e121dac0dce265f631b06d0bb8e6dac142c102da138f909303346d7dbec20d0a59d9d4201ff7bd4c909dce32131e2a9a033c928749902310f1dbfa08d6047568134bfce0c346779733d170c380d9a845724fe59e3c56b0b32d36ee74632d2303fb593e376bec658e952c09907d8a5803b5a78b4455656d6a775cd28b628eb5a90a4a6988929686b08fd9ca881025cacb0c8d9e68872403548e8c2ca1ece97db456cc75d03ad9eae7a285127631b7e8a03a42da75bbee057dbe2d523bc5974a85b7f7e7e8e300d94d54f22581ff28588b14dfaf64eed36666401dac14cd30fe2817b03eac45ed05b11b5299d02dfcdfefc7765fa7d8a011609cf0e19a5f8f45aa2147dafd6dbf90a7d1090b5c40a5031fbb6e8e7f2b0749585189c0dba2faee2de6ab9c4b657501ce6a40d6a4b7ad09c0ad5e48ea23e6fea3b0b19512c9e7f504d47698af7e592fa3089aae3865862e42522f8a03d5592f0b3d4ce128acbfd264959b8c09603daeeee74a5877fa590cd78a5072d4e605dee43033af4be1f3845584abd4bd962fceaea103dba75972db9dafcd879995d966f00dee388fb2d89fac64939cbc772326dc5a4ed6e7060a0a9585a5378a99afdd0196b4e23dbf6cce16be74eebde880df270a3496020c503154137e7a792493653a2e9b114f4a740f1a0a4f43ade515e6bcf13bc69affad26de9ab37d1b31611cb6fb5ab60a007265bf5dcd07e0f03f82bcfda00e195efd76ed71649e156b993ebcfcd3b06bd17b445856255e8dcfd9292e36341b477dd675b3a56761d39fe8acec33d682dfac3289fb03b0464ebf07a1b4d4b7a7e998c7ce8edadaa04e21c574b86e26758e8fc9761acdec80ac30f3a66ec501c4a8e9c10d2c1fc13ae9db6dcc97695b18b35728953a14dac8067750a8b8c4e1b68a98f9fd4b9bbcc1634d6833c5b0b9b7cc110cf48fff5584e5fbd6b17fe4bb78144a744d332102ec40459f896bf8bd0f2588a909aa07dad2c3812ef126c5a5d6c4874fbf941adbf9b507d008fd9d0beaee23ce2df19394643b5fbe0c8846fabf3f9468f578110390f63d1490e278efb76912ba073f382fef1b5fc966f32d4c8d64ed7256324dbdd7edec47f9bb9d7d083560ee158f5701df432e6a21b726e97b0661ea998873fb61c9d05111712162133f721d32d0384f42811008af5fc9d37d5b2a86f3a0a09828febccce239ef191fabc2a29c6d62f94b8146df5e64ccbbcd1c7e3850eedfccd078d5848b62741e4b67c39b40f935359264571686905849f181e75bb259692c9e9f0ecefe256e92e2414a91fea8f15d49b30393d5dd5bdc2e9f8842fecf92621c320f44b93935e50262cec943e8a969a535ff8096e564ca3c4b4c310b077c9bf033151de81abf486e16fabd07eb2f7d1de5c508c52ef23e6feb1527f8a03644c852c1463d2461fb310794e49bdd448c6acbf75cea59971543ad3a4b76c423a256bfa3b0f2c809bf0aaaf396216481616c90006efc66ce663984d3e269c8548ed21e98a6bc2abde9ae38f7b161e1a2c9cd76c29fafab33128686ca65bd2256e807a87303eca2bdcbbe9c3fee03d4f50d77939a5e6e5d6d8cb3c0466188e15ed1128259eeac72ae041e4844ee03002d30e3fb1a20e8bc60a3cacf6a8625bff54d26dc4c8e0174fbe228a03272c92fd48c00d82c0ae38d2bd40557288fb1e743822dad16e96d7f80625e590ca0494d82ed79bc42976671c664056a4d3913337788aac5f4dd3e1b11359ebc67836e2ff3f22ab6130630324cf6bba701f20e903711106f1bd8fc84c63a8fce709533f568041d2e1bc20ca5f5b4874fdc1ffad43c0bae10a1f9ee2ee1d248001189982438bec302444d9d6a86ff858ced0dfc082ce9fc1eafd6dd5589ac10adc7186510f1fb4950c661aa3672dc36c9d9b44fafe73c6eaeba471cc9c03a0fb112612d07c1b48b3f63bb3fc7586a68f24b424d1b84efe5c9ba175a74c60d286d38522627f604f8ce15473efdc184e2e1d90393387e84b3c7f322cd813046af8fe91527e450a16193c7a6f6f372f9d9e1421a37758091adcf96d63bc31989a6164fb1c56e21251fcdf22c36989e376d238958d839e42acc45d1b09cdf77e225c55057fdb9a1f76eee40933252e44737c1a563e96bd01b66253710d2bef1dfa781ad6151b7fdadeec2116ff8146b42a7744a562dfdee4c586d5bec43a9f4b5ec0699fbd410bc864e2e4d60083324d7008e3909aaf698c06685235298c0196c29416047292d82a65be2e1d444320f41fa59e9094f7ea28cd13014b9e0f0d6b62d13cf4958be2aaf35a4875fe7cd2051d1c554fbf7c6a89b2a35b639beef2e4999569c09322dd8b93832c5196aaada1d617bd82413b7a7288ae0be5115102ac2bfe48319b9962e4508b6e143d4040b567062c8cafca1753a7ab4fa974c40b7dd494249cb52ef6f0b418cd1c63714eaa3118aeed91454cf6457c58b445ac916edc2b79360eaaad9dea4541e08a65085101af95c64ff862f2c87d81537e0fefd492267cf0cb64a1d4506231371d0025a3ec26f49fae564e90bb0deb05cff0cbf938ad5960a579d4c722ceee12b94e398a810dcdd42dab642851df4e768bfa60257fdb42fc8397055d213b5c1d4fb8ae7b4c41d041735180ebf9b8e03b4a7d4f0bb8dd2cf855f8360fb0f6785c59abc7e5382f48d2ab7e5bb2de5658f21c4cd6f2e46f4ad81bf39d8ac3035c6a5aea5cd8b087553511098734ac6b140fd29900e642eed42eb008ba199880e73363896a51a9a9b21dd769e636bc59628232f512d545a77aee4f338b30b8558dca44d7f6d21f6cfdbe1413a475c27f7be47ef44f28f38812166a0df805953bb0d53325038f2a5f93c1ffa9a1e6f966d13fc0e7f42f1117d71f2b15fecdec3a4eba3e63e4ef9208d6e189ab860463c61201262a1a3b20ac60386e874feb2c00f28f966835b369ba616b6fc361c89087935cfd2bb8e4cd7bef1788f8e48367b0043d589e5f1f6b37737e0e68b24aac0017d292329073b57573c7761310acef2673883a4257ed2190c9fbab357c1cbe8f513aee7ec689503f5025f61406121a0629070b9e511165db23c12ba529d79d91fe11e3a6e3fa695584146310d744560dd4256b231c389688c75aac8ffac40aecda382afdb7e2a80dc0c12c5e4f825a1d6bf2d9976bca68a85cd3c4fc4156129c530b2b22be887b7dd98f1e874e0eb975ee091b2f96a08dc7b64b098e4f7c2a602c93653c7fb351929c351e394b438503389f50341a80f45ae81a65579a3839ba28175e99de063e43511bf632e472a74ff5abe7c1d6c571e826d582f9efd3e0131a9b3cb8636f1b88bded6d8b2280200ad515bd993cff008fa1bee5aff9dbf9672498f35718a583069fdb221b23e483ab9ca6b95a7aef103218667bdd887b4567f28bff2c80b71290c2c5cad47eb1b3b4d81c8c0c4ede8fd1898e25d085a7891de7b0673a194e36cde3efc8a97e6f35d5b5b89789ed9264e992228182d7e1ea2bed529006a4f2a4813b124c81927ce2e2194b1e44510ed5e967fabfd0932d3456c258fcdead7d44701afdc293a20c1d6f2f31ff5e73f9e346155835ff5998ef86cbe6af1c4447068603730c5cd1e7b8cb2135e8580fd30c2622c43b0f10ecd4bdd54ecc38c7ba2ec74d5f2d6cda9bc5bd0a85b757014dcdce761a5ef9f6f206a55752f24b57e57bff1b0d328841d52a0f1c92cc6841b92ef1064e19ccff5d48c27074e04f7a186ea930e46ed367012baf39b5a19aaf2131311620ebf0a0da2464c5b839f9900a63abfb88110113fafe8182d5b13ef1c8b4f7ca6252188d6c3556471499ce375b0c9cb43a85654918d31621c1b56a1cb8b782d527ab81409e3d8dbe230be0392a283766738d42d059f2c9125c4cc07c359957f4ef7e7e12468e1bb880a009b65d2c92056c0370cb0c692ebb9d03cff7a4e8f37811debae3164871b6249619a087e2fece9d2bf9240239a806611be27a2036554accbf1e200fc5f6dbfc3a175b042f0829d8fe3095f905148779113044f1e613456dc64e143fa333a468fce4ac867f7000027f5a402a847561195fc6488395bbe444977b48b0d7f55dcff66424269be59b70e8fb8f0c07795166091932cbe5145833a5510b5da769baa9563fef88c484277b885141f022b100fa57989998d6f53968cf6c516aaebd821709922249a7b96268d962251bad8518e1552b4c6e27a5c3be85995ee6597410b891379dcf32d91f1dfe788e15e43dd75d3bfaa8cb82e77d76fe6fa5d22cff9796dfa7b81b3d2b06c5b56bcde3ffae6195cce7e7f2acb02172ccf2d707f8b6c1c1c9f51b1a419cfe56e88f9104acf05d9d20700dc70c5f49ae31e3eea3ef1feeecbf6154cc29f34a2cf865a947887523087fda533c50cadc7ad363f2955705b8ebad7095b878128cbfc50ee7b77c573ad8c06509705d8ff3f5ba952173aeb7611e81846959c1835912355eb9bd88c2953a1fd62c038b691184009059da454881d67fb3a8a2761419ffa95078a000001132ba1985f022b5d088f9ab3206ca8fc5f3b50495f857582e479b74ea1e82b8400b8f6703ba46e95e7cd570be9672ce4e9f72fc92642f4c8418f67d02cd73f0ceeaf3c5ea622e596f14d918ebd57a611d7f6df0787d6da909270c3a41c327cc9c160154c46b441cc6b48432722cd304d8780f90fb016061f4812d781748236775dbc0439d977fd0a652f310f0ed045652d3070006fd9a61eb22a85544fe604648d8aa570b5d32bf043cc05e583d8469e52e1ee4798343b2c6d2051a59e62af499a2ef648a81ba8f93d84fe761de66f700ebda4e5cef57d672f85fcb131d4c684f0f7aeea50e655693d31a7dd5d99b61a870b45b8b363190537531565bacaab88de8c8aea80632c92e268bcfdebfdaedb924492efee02edb37ba33c45e67acc39a680992a059fe70c9e9f12949a69f9f1b20cb388c59fd6623a5ed22a6aff2c53b7585a98507d7bec657caa535ae1d9f868669d515a9169d9873f90455777e5c0403c457de5c01ccd5771084e0f0e7892a59a2b62a097aaa1ae12125e2f54625f8938578f4e2f88c67b5578dc66f1c628d02dce4d8271f84d493e766764a97cb1b97de76ce8d2f1aeb821aa25d169779f60059ada4795ced5403fa1bfa8ec39a8997fd8a9a38643f9916e8f9a79eae3193f2816606c7ab53161412b817dbe29e31577f554812a0e5dda955380c75b60a30175e3d3760645cecfd134dc9157703dac0c26e7411d360697b2116f530aa3aa182fe64f3b1e4dca08762555e3bd24b951f8df3fe17ad227bad487873f0b945abf505ac964574afa7165cadcc65bac46acb209e72952adb369e1fcf3e17b737552f623a827fd7a7b6777036e5944df0cf2aa26cbad25d7048bc4eff5f7daa3026614b19466d4dbc8147df40db15cf67d88e8ccf68e22504161fdd8ab30bfa78f4836775ad798932aa3e8ece402559c7461b6b03c9cf4ce2480dff4c0d3638ecc863081f459e25f8f22c6863baa96eebb7f43722d8458129cbbc9cff903cd9874fb7e6c80de0ea3767729cc1d162fc03581863204d0de470b68a50d09071ddf85408ad88c3ca486e007b34308875355db8cb79af14cee4dcb69f88a750f5eadd2d16b9aba3979a65519820a6c9473b3d9b0035930795158de001235319142879d526dfba3abea5637c8ec58e546be3675dfaaf9f513664272ba93c69b5f5720d9c9db224e3fcc381d83d8658336fa782f5bf2a686695dbd73a751043234b7e4e240feb5a6baae21370adde07cb6e31ccd6ea63a4ea14464684268a5afd713266f56c06a06558856ed25c5033449cf6692156287ed9193c951c6cc61e6e6a1cafec6b56a802424b318a38d6d1f93274988ee9a4347dcac6410437336ad05a44cc9b91c38a3908750d83991e869be8627838b5df9a086a37acb5a4d2e9deccb2c631fbbc0f699db361567c4602bf11ff2cd7a235258538420dd6a42ca8fb9b54ddee0e28c37b7d0880be406e1f60c8cf3de964570bfb1fecee6b44602803757da4b245b5b059b58578ff010bd1730ca8dbdbe36cb7543d4081e2dc4f5442d15a895b4a9da02dc0cfb1e1a94f2a982320cb80c0fbfa675d123d71d972987c2c9215be8b9f93fe6723cd2630518a16511a0ae06e50f6853fea81e29c5ee1e7636aebb72bbc51e17445d547ba97cf1e4ac76e470600816e70aba38d049120ecc35665bfd0bcd0bbfe0e2ae2e0e3723cf6f20f7c301adcc2bbddac4f1adceb70d033f9ed58aa26c21829c986acc6067900e507426157ad881ea9974cfd67bea55b7b1a6f63d7c2ce1388f15269e919eac2a7b535c93697551ed92a24d4f39e8ae402bd265f3f6fe43ec7ee65d5386a63fae8d836fcddc59fd72be63c95f0e082e3b11ae81050f3f925dc68cdbbe2cc70dd4379e89d04a8916fe306657e7f78009af173c5678aa06a3ed143213224c40e19be0b51cb8346af9be18570b4205146565362f377e87afb4a4f9bee0fe6cddcb42ca7554f9dc7a5b0693af366e5652ea8cea09ba6c77d9a343a22d7badd94ee4c1f2b59d239da6a4e11897a7e2328ab7252378058045c4c80e5d2a8a2325e150d9682f678f67205e4cfb7ffd910dbfc9ef2d1bbb7001d6e7d268da013071a02cfe89b7d25611bf3a28f1d1849371240b5f85a3a8e9100d9ccf8bbee80226d90bf9a42bcc7303725bac635d448234d34d7a4210d9ad73c34268070fb3eac19b16ced2fe1a3ee88e8ab8136f5a1065d7c91cfa93c6786e77efa7e49c461ccb07e6d54d71a364a4d40110f2fe7ff77671ca1b54a83953317a26b74df2def890e07ebd687925e8e63b8eef58b4439c93122754ee36f0ba7ace488209c5f737b85232f7944724a735ef3f6a2f02e8928dec8b7ed99b39dff2761f8070a61d4bcfd02811208566d81ac4fd92b640cf0a45c5fcfd400c8bc38593cbdcf1ff0fc2f2891b260fb8c525ec70b4a50760bfac22827dcf81b93cf4581890e092a6dfc3a4fed3eaf885c1ae0c7a0ec9b4860804082e9c66709166026c147bf0ad1ef05d0a70c5332a27cd29dcfbfa769923d5b4392091b66ee8832006440a8d9f40ae77fb1aead67eff00496347ac1f373411f52908bcf2906cce3574cdf59808fbf4a804a975583c40b377dc6fbb6e019346b119087381303e8921f98e5e16310c43221b2fdab0b5658105052a9e75071c2df5f4641402422dcc3239cef0bbb90208d46f8f7ecbee0ebed8a8869d1a806e912b85e4c615b47956818b15a4f10352890933a8fff27384595fd47da97ff3eee8e8320c271859e3e302a8b3aa7b19728afc87d8d44a6a68813994d10253795007fc5a6cdc43cbeb66042f9f3ec699432543f8e0407a1e1baf485ee5fd1dd0ea3cb4f06f13a4ac44c143d1bac2ff64af3b656d581fddf1ef5ee7eaf289f0f7d8a363c99873795d8288fd8ba1e373406f97f1b00e2f6527fb73721f7e781155d1203c77f2899d65876690334209fe4ff2f98e7d2b63123e5275c938cfbe79eee9699d96d051a56c7446989b2a6cfcf6cd0ea79db9e69b15bdc9ab2c736f788f723be3253e3195a0d2f5e313cc6f9162fd94f3d18889880220dc56c7499b067d71f80525b5ac5c52703a7843f964ab3f704bba5717b721d860f39d7718bdc47d35f75f73dbed4907603589f48bf9de0a9c62d7f83dc5c93b3e38693c3260ec9879a3aa9295e2a3390f10661e1727092c9b9d1a131e3fead8e91dd1b52d77cb39c15c81e6d57c9023daf160fe2aef5ebb25e28272b6542253c14e03543abc7ac0e13a1208cf59382e20e6231c5ce02bc21cca140f0652298e22a9416d5c3adc2fc05ba3ee13ba1081e63f04cdb4fa2655cad9cb679a800a025bd39f30d298aac8eccb04d025257dd2ad73e8135d5e6583075c56696aff3efe2b16cd530466079ab718076ef7ace616074afc0c29bc84e6c988491bf6124169c95aaaa571ab2900cf1a9b044c00aa1622b816f256159a846e2290cbe62c5387cf2c09ae94e0557b1298fcdc4333b64cdaf6c21934040261cfbae0b76f46569853cdb35b073bc68d17bdb7b2a302f9f9caef63da4d6a7741f1d0a2f9a901fb7527d384339aedf306e8eb3c2effad6e4b732d0336266cfa5ae93d3ea428725d295a8bdc3fbd74372a000a03b6005bf2d6b3585fffe1b4a274d2b015906b816014f83a394b8a79a760044e96bbfdfbb81a441b567d59baa4bb817f378be323298479da6bcbabccec8653e95abed7731ed9be82839ed1eee7008c4f9afd0a94cd0edea03572c33c06df5716e1e37ca299996e981b1546e36f5061e103fa7feb58c639b1f61eb1f0444d64792d56c4f66012147e54f13e036ac18bb4103887fbc58b31405046b10bd8ea8a4793bd9d68aa11b2724c76115fa64006e5e17e3a36c44b74c564376230c8fd281ee322e0d9d8dcc29a03f981cea26fbe5b2b9b7624167c8cd1e4a57f7ceea828e7d642bd1fadef7ec86ee008120f7c08a7f29d5764afff133b80e0d6a8167938feac0bc83b55ad3242a4d94bcbb228145f47004f2adadc8087cf023117bbae808b826761f561ac50d4fee5cea116a7b844935802f1d38f42e433d392d707b750849f58fe906cfcc34fdc2d0eb2cfc095b9fe898b1969cba6f72a7fa1194289eb1a70d10df44093398b38dc46451542e06038f340b47d3a04c0de0819e131f8c0810881409d07b94fffc211665901ecafc27f2106a23bb6e1a6e0c6a6779b6921a31f6f6baf5f72ebf1fbd681505374fe0f795ffe3344b62bd85569a0c7c3bfa961d5dd1a890fe269f56651610c23920cee7a7bd64e23c905d7301c94e2d5f00a8445f4744df193e98d8aa1de2e820579a522835ea55a45aac10b63c02a8b388b9240d4b0501d937961c473d8b1fe6946d4dfbd3b754b35fdaf30789a6127263b58776062827d21b10e78820fb959f8eb796b219134c3f331474b66764add3310b099d9629a7631ab1cf077b595f9450dc7e67a36ed5291102c679c31fd34c69f404c0a420e0b49ad5dba73720f8426f6d378ce9825f7365717b290251235f39e333ce6c4ebfa33a681ad0ce7d62cb48105c84de060723252ca3ef943f9f7c08d9c481c4126dd66b464ed770173a39413257d7ac3b2edb1da8f37ebb1ed086df293f76bca98bbb1dbfb632d0dfa052c0b23f65c9c0b9f5e4e0893c8b2ce8d873196f41ee244b060cbdbea0a80dd76f1a41d356a63c2c148e921ca207579d9fa5845608787118ea18984281a43660e6b62ecb7f922c6a3e3f944d3a1873774294ce3eeab933d3e7111f402983bbe2e80074a7a3f3829a02bc3b0e04cb77a9f7314d9e19d4e47bdccdfe54f6b6d5192ad5d60360730ab6438dc10cff3c9efd0bba654e5268f06cae6f3724c17a67bf85f801c7365a40e4578e493e3ab0fd29261aab0f17ad1637d6a0545570ff388ec57fdfad6fa1c52670345c561a0eb6b5971f5b69704473216a22e5e9e028ed8323aac64b16b20f1234030af75f3a8f3ce6eb4462871ee8bc87794076ac42f8b6091656bfac7ce926680e3ad05bbfc6b31bc7811cbb9de0edd93c5830c6d9f96fcfb19de7c1ab1c34311830dc4b20ca06ebb9b6b26db3f2f904c508aea04b3d68c351c59325ee897b35a2f5bb6636a38cfadce10c9ca68e1d8ee0864f03a133730b03218d7254be0cd3cc43b338b6c9a8d037acf8a4c638e70a7c02044a57b7a457309c15a7034d5aa769b02687f9604938105f510ea829a23b1d045a7eadde2b79cecf24fa4d14fcc9426471723ecdb319e09612aaacc1307e2d8faf70b4336e6785bdd6c65e4a7820ee23121112d2f6eeb6e5de52a69452780a220a130afc21eb2060a67ea0ab41ba2a7fec1439b3cd2b0aac9f2bf57adac95c130c6388028b1ada40c136f9420d77670c466ab8502a039a30050bc8b0c3640d5090893d63a0c16656600417e8c00c4fe438b182999b1e482107ac2468a1470b99f83c3cb548f082e5c41623c0620d44608175576280220627c858031a7557629841a558e4e0a46e59f8b91b8633d40880baab3044f171c26b589d988ee925af4b8698505977a54517a1295af86c5a6c81468da41adad0c20bb5869a1654a8f14d5d8c4ed502095a4cc1842fc414a13db49ffa6c34750b34ec7d78795337e3a4db52764928e1506848b32434dc960f910d083c3b476451c404b288acbad33cf0d0d0703a0d283fe1d9f12533a091070b5ba3e38e4f1c9e5a19195fe230cd5fe83e3bcb137596ec4e0f22582d88a91107c704c316b3439390d698539bdf3fcadf4aa8f79d135d06340627e6a6411b8789436808823462ce1323788a6052fb27d0b32b7e947b3ca440c3e5298287a7eef8ca8fa33d05a255f468b08f4f4d2f97e5aff76369f3d05df3d0cf37c8c840430ad250da3cf4d71f105983c4eab4c1ee1aecdfa2eb08c408820149eda7b1c50de9346154bc0d30d480347c10d13cf132f363c0e6a1ff2a4281e4b85e3a15552a95ea46a6bfeb3a3a4187f111f6cb3bc4d0a4c1ad49e26b0e811999b81ca5c795bdad924b62a2d130fdd716ceb0abbddca1176a8ad20b1b60e16323b678d8f0c14994f2e5e4f9d26ba7799a877e0de4048f8086bd5319ec1d06dd8086b1d53993c6968dcef15494426d2cd4fefd72ba90f353c3ded1d91abe04b4061ac6c4ec206ddca712cfc969141653a05a18c91426da991aa7ea344e2f611cd4d6ee25fbf53392063ba779c04103bde16f9c063be75b094bb1357270703ae7ba82869ee3399e629b3e62435b891168386be3d4feb95d55d83852fb7de021c442b95aeefccbccccdfbe7ce7d1c30aca9f0f0df66b387c28010d57e788caa351ddb5631a14a247a38a00174aa59165818620183f1a5d04aaa2a696e4826ab150d5fe2568e4bbbbbbbb63d835e76b139bd8c4268639e61ef66d97120df22c42c3b935a0e1b48969d068e4fb4ff3d01fbda86a1efab316d0b055a019d08fac16232dadf29a58d3a8b055ada2f11fff22126922b55ff329d0d08d348d6a6b74843185f2b6aaaab6ff2cc065e217594e051ad29fda4f4d9b6c2d81d6a5a6d3d679241f1aae0e8f464571594143ea84204a303333336fdcdd0d4d75f70b129700c980261144892564124198e665dd9df9e28b2f7e9943b544129e12413023d09059ac4685b367e3d6dc81c6327b021da1611ba9c1a9fd4c64b60c178e1c81f6b7aa866cc473e1dfef29e0b061e30b36b5df876d127f4fe089371b389a877e1014687f680349c3ac92390565d23579270db3a9ba82270db33b57682b5242978a9e5525405d2aac50d139bfa0aafd5bf742c32485ff132f233f49e4a1dfb5405dfc5766eb2804e6a1fd5e839e9eb0fba2f6bfec15506a7fec1a9a6a73a186271a56f95bc192718e5f49a37c94d4205d3d102b36da1186260d6abda451bb842744ead61d3e4c1ab54ba042ab6e0ded18034ea35cfcb9fa57fb0812bbd3bb0308d749ed9797979797162f9cc999c981f12112bb33933393439f3ef6dacb103b80961e36d07f990e236df884d801b43cfd381450f92ebf9e7a79797979317543483f44e5e5779e5279928b177e6df942247607861722b13b333971d2b8adfc8dd424475e2000f5cffa00352f831d00fbf568a4c8fc9993cf8df2c12f5bb6d450d0f394da5c0e8d391ea02f9c3fb20fe7970463428af852b40b1035d6ebba2e9990ab100d8433b503580de235fe4c75336852fb11ced430091352cc97427b5e0e8b957560ef31c618a3bf0804fa1fdc27044665f9b01ff4200ec47d7c104bbfe987a8fc1092ff720fe2b1fe30bcb0476525542a551375368a43cfe2853d2acbb717b6b4b4b47cd8b57cf8b55bbe7e8da7d4ee35d017c60a72cef31abbc6ae3d3f8efb402ffaaed15f087a96ef01f27ad4e574f0940ae29a8b35e217f66b7fa3b5ff817da8440d7d426054eebbfa037b0ff8007de87d80be7f9746d8df0fecc3f8347e3fb0f6c2d91f41df2e4c087a0df4fde0be2450b8bc0b75f9a0e86486949e7e504c99212b3f849aba21bb30309ef44360bc4a8b172211536178a1df3afae576b0aaeed6e8be30f4f56bcfe269bfe2a978266f48e95b0244831a00e1052c38421537324c2c0f8e94214f7aaab006296496863daaf6dfd2d2049d3f5f9bbf9e5a8266a71c810b65e8420d52d6304586be132c5383c90c9991a1df3a8c17828098dfafb102e6c7770e08cc6be417a5b6f9216fa30dcadfbcce61e4833e5383720681c6770902f4fda0fe59638470cd3e172066c51e09ac0af13ab16faf50e2059d2a7febae8b99e049a1a0f147cf89f832fec6678ef1d7f3d8edfdf14a73e9ade19f258176eabaaeeb923246795dd7755dd7755d4d2eecafebfaebbaaeebbaaeebbaae0bbb2e24687b8a713618632aeff6e3e8e57dde4c7ba3e7a4b4ebfe41302626b4d1fc654a886fda1bf2e3afcaa61cb030f18786891f7df081071e6ad49831a3461b6c681d5de547048e06e36754508e72a753345238fb5cbfadbdf65561d76c5e38e2e183a713f6fddeda1b5c2f107bdf6253bbb148a376ba17b489304251afa78179e0cc89bf398c87b5bd4e0d234dbd3ef4ce622eaa5a1e76feb9601f1fccbe2c4ac35c7f7d51afdfaae8f31610aef1093a3ffb6c535d73f54dbd3ef4eaf5856de4fa2effc954d5230c6fb967ee6d0d5ed7778da7bce530d7771da535157c3a372cceede27238733966e4aecfde63e25f97b7dc0c7bc3ff7a3fc3a2b6bfdebbd814f797a886ded23e64b9a1ce0f6fa89c872dccfccdf305e7679ee6cd0779f3dd9b1e392166aa67de9c07630acd7e4a4e88999a7d733abe661cb1effa7cc89dba32a2e45aa079814837b706e767cf0346e7034c8dcc9fcb9c1b6d18a3e5e4d66017a38c0e852cbe60c19e76a8ee230913313252bcf49c903f5fdb2f4422a6fa10e2354908e46fe5256664e4f7909ffcf5fa632f1481aa72ffe368276654ab1b9b1a9a1134a192193223d35ea451fd553075076080bae15251f759c52c1f0374610058a80bb36c230436c2542c8cab549e32c28df0813f7ff21382f3cdd6f05fd18e1fbf9552a05b7715849d789dc0c9aa0b50eaae583b359c35b28e10b39882fe70e2f8213eedee8aa911ac31be78214e32f79b171b9cb36a32cbb2ec4f358c3315c35cae8fd6d054f9143f1fbbe349d0fa35910e6e1d3be272fbf66d0deef37b3a624c4c64d62433e830fca0c3b8c7cf7768d51760c361f86d38ccbe262f9376711ab631b700e676b0d46afc1c1ed8a155f9edd06afca60ede1afcdc8366081d326196314e07d78cd3d135be065aee503853630471f135510e06acc3703b963b143f7e73590385e4ebb8befd405ce38ce4b9844d81ab8e5490c80aba487801910afaaf201008040245ad7b1a6c8e0ffab0d37adaa7593da0dfad46c5977ba3c6e75c6ec75710e8a7068119990ce45e92ec419ea66dbe2d4adbdd3efee472441008b48540221008040281e67561cde330eda4615a51b41f506b6f6c5b681b08a48148aec29c2381d3605b9b516983eb5fd823a632332311b34f58820e6a7cce3997f66fea53608c0d1cabc82de6fd108436374f0bca078b88de2f28574e0088f8efb2096d366a977654a6a2bbff6eb73716da8a02fbf1b7b8ed6f441a1573ec118efc7c01ca2bc3cf4bfc198795342a6737e41aaefd31eea756c699c8760d6ec7c08b29aaff574d14f9b7b28c807af4c6e974687f18db933975399739d5025dd4d42e54b5a5aeca8053576613a06d770fab9f34cf93961ce585397733333333333bf3b5f1cc401a3348dbb866de381671333773b337b3733733333333b333b3f347f989d234ad8af213a5d544a7c9939d263a4d565c44b20d377333377bb311dccccddceccd31dda6289ddb3d46292f795d18366736b30c04d2b4adb5adb7e6b8ad4322ae45a2ad698f465b93d8a4b2b2b2318b7373333773b337b333f3a7039129ec46a93b4e94e0c49a48d3c35a31f1236ee427ca939d1c254da46b7c7a9aacf8868f7cf113ee93ba430c3fef179b4466d10e315b43b411a1b13b662342f9738daff5c664c805888bbf90891a5b0d8e7cb4dd2f8c37f1c8173f3c4fa6c8711b2792858f4e13247dd3aa2fa0f02c99828bb04d0b8975c2c3d140b7c193a381465ef610ff3ae6ee4e5b731b01eda6e9658701632a4179e33287791ce692601096e0d4ece38d4ecd62ab51b38e2a67d5c53f5659f906fb7802ca3ab0ea483c670acf6954f69bc9461aa9cde32989442aa9fdd9276f1a7c82f2e74b1ef37c8a06db6f3a77cf69b05ffef5a1e7e0ec0dae3fb855776b84520735fb88a1e2ded820b28fef655edc1ac4bed9a087a93029687e065e9d218b0c0402edc0d0a9d987a3cc86c3643207dbf08e5fb361636f74cd7e024734ca3f7b03644fa9c87e77a590695986a3dba3d160f619d86016ce10acd9dbc8b29fd9f68593bfb0ab3eb567cec1ce093153417cca3e1fcb84291d122c74501e467453b7358e40970955e8d47033c1a01d13aa60c268d0f61466add0f3ef6b2ade4addbda1527a7ebee1e7167ff3bb8db3e446a1f65f33a8fd1893a1f6cf6652fbb3286a3fc8b3507550fbfbd92413360a2d98c1f505260336453371220aade4999ee4955ed3461e69e4919ef346af4915cff4228ff3e8cb0b9b1948dbb02de4c5e78d42f5e719547f2643f56f26d5dfa3a8fe9e85ea1f75501d475f1fc69feadf5bc8b301fb5032a1fabfcc0faf16547fce1b7dc873c93ebcbe50fdaf2de4b5803ec4a6a8fed916f260681f4e27aaffb6953cd387bc6efb704ea1fa735bc863a9dc87590daaab78bb5b83bfe4f5d81afc246fe4716b6bf053af576eb335f8439eb3b6066b5eb852a85c83ca9f79216f519b8a2e6425d6aa803d33335fcfda87224dd3be2a2b00aa718d54e57307aa3f835a48f567502f289f4350fd197405f6b1f685cd04865d815d5d47a95be02f30c4cb6712b4bd81cd0fa591ca4375022cd8d7fb1be0fd03ad405580403a0d66de85828569904ea3ae1a50158bbaa2585082962cf114080ca0325c35a01df70f455f3827a5decc4c930082d64c252207c4ac6946c1a6e6e582da3f2f2fc82b14bfc8338917287f8706b86a34e9c5a8578d771da597056a04e2454dd46ed04e4ded6f912a04edf0d6b8fe7a8f32243fd1ced5d90ea4489122458a142952a4489122458a142952a4489122458a142952a4489122458a142952a448912245050a55edd7b83dca0b9b1948dbb890888e482593ca0a4b07a3c5e5c5864dc5ba51c51c9716181dcb8a8a0d316eb0e146eeb056544c2592dca9fda31bfee5c66d465414eae7de73b1b95abde236edf2be161b6cd50265d8270306ff7ecb6753fb7bdac8387575b26a3859b51fe374acd44cfb22cb61a930a6d09db1c59cbdb1a252a1d1e485cd6cee0edfb47ae536ac98232f6c62f3a6d52bb761c90bbbbac3dde19b56afdc465ef2ba69f54a72f7eef04d2bfa4d6b226d0d947bf24cc2ccec7299bfdddd28a158983931df8fd1b1e0953162b12b3f59a375dd9ceeec585076a9da1aeeee3a3225d363cc7a28c7ba314af9bd94921d8b18a5dcadb1d1a526a5ec1823c71863dc114143aeebba24cb2fe6741319a3157c45b4c2fd0af9f1d690cc0cc28981155090aadabb9d13df7de01f8c2934c61ca9ba42b475dcd5256f8d239dd371430d7581c66d57de48249d022901e1840084e35b3b77cc0903eb485d2cd4a5820b49a89aa85d88e8f7f76f091dae8004954cff8ccc01eafed7036c7c051a4e1017e87231644201d47d22a60f63d4bd023d2d0ab43d495e665e66e9ebd2a54b77f7df5d291ffb9d31468f490451a2976055a740bf202f48c3f0970490cc0b9244095a978c8e1581355b6611e3738bfcfefd7cf493de5dfe612eb43d611feeee2e7f478fbb7bdaa1fb1913babf55ffc57eb1d8ef31b62fc188effe7e6f90bbbbde4f6451a0fcb17977dddd67d3eefaf3ea76f32e8adb8bbd06da9ec2c9aafe9a741fee417e7209ebe0efef62d81bfcc9216c0d9faa9d15b51153b706e41a876923b8e5ceea3aea8e061adf7d3aea84ee533d469dea8fe144effa71187face5294cf59d63eedf0224d6106be1f814a85cc23d605bac0e43d81bd819b686bfb7b646196888b5aafff5e3a9754abbf7b97eaabf91eacf66a86ad8d4b6302dee8197cfb0dcc5a2e47babbac9099f02fdc57eb78644420d4f75b2b22168d8ef296c9b2194bef6578d753d22f6091ace1a87506d65652e87567a9216482affd45d8da10a5593da100ae3b527288e0968aa866d98d755727b8d76884109d860fc3f5597cf3c1c7ee3a1e1b77c7c7ec23b9b027fe5775339acac4c2f076fbf3056976f8e88ec71c87eb27cdcb78161e673b37621ad1d4bf72caf895e3ea4b5fbe50ec4e1ffd75339fc0d311ef472f070f07661bed734de6478dba0f632fee48533f5f41897e3f41a6fbf6dbf63ebf66d1fb2112ffcb979a108567567fc723e53a71744d619dfc53ac8f8f5c2d6a9321e879f3c1c5c0e19df0f9f37df7b21f6e3f768d4fcf8edd3a017052288f041438e428daf52e128ec8dcfdbca01eafd7e423418fff3b67aef793de42f8ccb6fd5c5545dfe86efa5ba7c8c4f64c317d2976f1b74791c8d81bc88892bbf205010fbf335cfc76a5bd5b4dfb155fb40efdb17ee0be1aabd69f49a37227921d354970779e1f654978fa4a394792bd3e26de7855d59bcb0573c150f483479a46d8798c2b1c414f70b5b406aa0e1eef00ee88786bc848d74f3a9129e2ac261e24f4a3f9ef81813ba8fc3415e88c4b6eafcfd8199746a65e2f4bcc1bd78c753cf1332abc69db6d198e0197a512b5cd8156d6045bc4800ca6722aa3fc7ebbaae223019a712d5bf1877b0fdb6356aaf1853a762380a1a9788221a8c7198f6982e0606f4178c8e7d8ca7baee318f727af4c84401457840821e9c0006355c08c30e76e80e5851a4129004305471e353051b23c8603e3b18c3b5832daec0031dd9822738b15488428d31eaaec6e0836aaabb1a830cacc0fc53a50fcec840f7e3461720a24a256baccb01c12a55f3d628fe667741fb4336d2c59c349ee21f99fea94ee3d985659763f25d82881b6f805d99cf89a1c1af6f0bd2af2bfcfcd018b718e90ffda15d74d10500b038c2532e23fb88fd24bcd7d7460b7ae022ac436fceede8eaaf499f027509c29f9f3f1f71415ca840b80261d0c73a5d989336ab08f7c04d5887fe6ed232dadc8e30e2a95edde8e02ca9cd4f583beca4419d26dc0337a18a2574ec5012ec977b00cb609de3305cd0ef99549ce52cef71fee62fc4fe7d609fa94119df3678faef0bc2d59f7c2b59d0288d92f132870f7725a30efb7c7ffac2293f07cf99348c7c1c3cd799e1b91352e4745cbf92050d69953eba06e507e16afa3024522bc9974da4c7d3c77afa421154ef7d498312a7aa7cb8ab26d2355ed334287fbe2f9c35e37460d5fbbc4983128bc112bd97ff162fe4da827d7285dd74377c31be70d6f804e57fd1b4df5eae644fa37c1af5f2f265168d62182185f1bb3070b40d9eb3e73e0dcabf385e79eaa95cbd7cce6a503ef7e187ce6a02ff8adf79259b481dc905913d7b42e6bbb8785b5bbcad303c20dc7940228b179a563c2051be0aff54f9262fdc4a5ed8c9277940b0f754b730fca32f9c222a431c356dc4565fef7882912228b0398521d62ac626bde384e7090b4af5cca7b67fab4cc7537352dad1e8ae9bd35ffaa7a3e57f3d030d922feab50131a3469e069d0b1a663f2d1a0cba2efb81b2aa9cfd1c59817a6a94ec68518c30d95834384eb856a8c8de68e7e24393d21459c99aaae330fd3a3a3a3aa1253e27a55d6849680994182566117b767c959127f250975fa4feb9c8bf7eabfc7474dd06afadab1a769333277b238a7f994e8be6021a66d9cf4fa3c2d0929ee8d3a830d3a98d0a37284e2a4ba7f3c1081a1c27dc2ab2a4a1a890e8781636718abdd13526461e87e99f93d2aecbbe68b077baec470d0500a906b03d645eac0e5ff663021a230f149a466dab73181e4f653f0ed3ff38dd0d35d2cd4969d7fd673f61e4a9fdda4ba77661ba1dba8f9e767c754f4d1af9f9a6692b67a02e4262c5fe87a862d98f02e2639f10aefef9f097dffc82708ddfcf1720248ddad86a547b0cb15672b8166aee789c3b7367b23cb532dd9d7fe183476a2c72b1a4f1d517953f46e9942f892d79a4fa124f714d1aa63f7e51c3b9e34b685c87480de78eefd4229d45051259b3fac7ade6ce0968c8ace9fc84d5d32966b964cd1d96a7e693278dc26a3f81527bfa3777be65de7c2bb630fecbfecbe5e0f83572ad79850ca5943e64c82cafbf3e1f52621293f2bb65acf192dddd933d8cdb0b672ad79e4b109f8febfbb743c698c3ebb1bf385e97fc5c80f0295336623e586d63d2973c5289542a9548a352694422954aa32f954aa5d1974a4f1a75a5d288542a954a255289442a914a17b743be7fa9542a953ed652a9542a954aa3128934c46844229146251269442a914aa49f4f323da9341a955ee5fd8728a9a88c462aa51fbda6321aa98c4ca55189542a955edb4aa552a9f4cce528955ee4855d45a4af9f8abceea3477fb9d2e36813cb6885a4d269246fab4af7cca974a4d748a352a9342a9548a592cac7aa627a92c79565a53422b189f4269591ca275b0dfa8f489f8f12e947aff156227de186c3eb6772962a3c0835f1da6baf2b5ebed245ecef671fc2a3e7d8153d215c57ce4099a7a50cede3000ba1974baa7c4ea77ebdf64673bf41845e72957b0df384ccfac3d7a0e2b22f2ca266df1e90feeb312f08574cbb3cece7c7f0af9f0af0eaf5a251950ffa75f9da9cf3eb9cbff37ae7f5d056ae22cfeb2a126015bdc6ed6dd5b40f6d1f86425050ed43bf3e425a880c1ffab06b0494e3f66a6619bd9b00510a5a919253dd95195635e707a78809e868282b5a50ff90f213a1381ae5d2df95bffacbc7e6b7d7559b9777cdc71e838272ed764e47e8e747ee71747605ba1f3ef7c035821af485b10a619f3245c3766e5ebfe67d5d2e478b7c803e8817861efbcbf311faf95a261f9373be94f37174e6ed0faea08f201ffa5db0aaff29468b2faabf0907cb84bbc2b1f54bcfc7f541b8ca3f352acc7ebe8fece53b8d1a7be3c7fccce386c05ecac7b05f0e08ec658db3c1d928ce21b5f59ebcf263959fc98916a56ee5999d0a9eb787b6611dfafd97a144f6691bee81e9d6681b268032abe5246c2a364c7f153bbaca6f95d090572b6ec23a5cafcfb48382e156afd8d1b97dd8550b97e8817b58077fed0b4150e5874af0caa93fb66d4fe580c03e3eafdc9f7b40efd3bba75d007e95cd9b6a9b85f11bb34ad92bc87ec6a0baf6b1cfd65042dbe6bada4663b90d621f20b186ecc37fc96d10093008518d1ff334c81bbf1679dd432113feb1fa178a805fc419b6d209168e9046a3202821bdc80c37756e53fe6caaab268a3c19a541cf116b28a9a7419d0e061dedcc16aca3974e3805883ef944eaac70417d04e1ea511a5ce182fa187d10aea25f89e23f1ea5418f423dd377a3f711a6a2a358021a7eabd93d8a5e04553269d027a703abeca441d11722c1ad2a7adaa0ffe47288beee0554fa7c92d5a03ff7603e7b6334f2b86261f01f6244228d4618ab51a4f70f914623d24808d7d127041454f4a164d556dd1ba39ff205b4f4a30f656bbe8cd228d1fbcb9fbd417a7f8de471955e889ebeff1023ea7d55b6380e08d1935ea31e4883f47d837e914a9e84d2a0bfe813a241dffa491eb9856c6d8d1aba32834ddde67288e266f2c2aef4259446f94ed19b3c954ff248268d2abdbf5c499d6c55deff7a011d7d88b5f64657bfe186aea36d643116d6d3a811e9b591b7d5e4459667cec4f22101d2aa91b6291291442c1a895aae3973bbcb900b10b19a3e967ee4715df1dcc7615c53f1da88caa6c2e5d0462ff2464eaa686724622855247a86d220338b3f92f76347fe30aa6854455915899e37b532a2c7b81ca296a7da8891d9716b245b3bb05afabca7417f1627e8e84befad4699400fe27eeb691456fddb88a730d3275b18cbdf3bf4248c55fde31374f4f910fde84b5f287ad2631c10a21fbd26f27470ddad41128d9ecb41f2443ff2443aa2e87dabc8cb11f280444eb642530ddd0312411e909879a17402842b265b40a410b4c35a25675903838dba64fb10358853832f53761dd85dfcd48e31562e155ad5f0a5625be5def1f5fa8ed7e772fdfcb6063fb0c129e487a8f26b9ab76d8df18107114620a1048dcd119c29564e781ad5d3a8f668a4d030fe6ad5e610a7064d1f0885865f5d3e901d5be7efe01abb6edeae0e21887f8cd41ea28310014a7b075ddfa9417fd0170ae11a72bd7e6ab4b8c5214458631e3880ade11ce67b83eb7e7b3bcb5014418df18bb102fd53a3fa5deb2cc9a5aa7c84a7785bfc9fc4a95ea441b7d91ade3f0ee35fab1af458d36a554df56f55d3744da358c5053326af787de1aea28c91db71758c4d04f3fea5bfaec1e56f3bd1d0868d2f9c1b9bb8043b5888bb2343ee096365225572099c4bc03d45eaf4bec18e270bd800c1c8f199c8a668c3ec47df6928e8c8dfd37e9665d7fe4ea7c3ab39bff0e2204c11846824f37ec011d3833fd0619c47832e0123bc87e45595cf4be4cb9f5b65fc811b691fee6e1fcc33d19e00ede129cacb937d6e33173f1886c595b25bd3a7a3f3bbbe2bc64bea609e291641011ab20d8b6dd826094f51ef37226c9f1abd7315fde9d6feb60f5d98cb39e77ae24dbc486b7e0cf790fd0cbd48aca16ce203f6853b4802700f99fb4700ece5fbc73813c08becf46cecd060bffb50011aeeceaac7cececefedc617f09c03d708d45aa7bb4954384a6c6d45d45f1a4b698d400d45d9521a73aabb2c45e4a6c1f4ae58f7f6dd817fec50501aaf17a2c363a04ab7b3207adbde689983fedb75e9a139aa6c52ae5471ed05529a562faeefb7908d12897efefb1375a9e65db14fded7f61b86f8e63a9dcf317b2d4f0358f629b73b2f4cde548a2327a1af3f9bf51a51f7de1a97202b64e1afc637e387a215e93d0df4afa70a91702d1cb17cefaf2a38f5c8e1e4fb0cccaaf88de892598982223fa213332a26f08cbaf7cdf8ff9fc301e87bf78bbefe225117d8b97a4e6657a54181f7b49ba67f1987062a7c8d4c090e93e28e87f2bfb4386d0951f42bffb212c1f75987dd10fe9bece61f6591e07cbb70e435af9e83c358d06279743fe72a5ef9b34fac21e55f4dbd1d7449e463d27b45f6246467342f44bccc8885e5bae87e8133d7ba02f9c1748fb131059b77ecd1be279e661bf3ba2dfb23bda1ae42f363863831349a35cf8e747569d53a5aa3bc680a4c1ad271a5ecc0e9189381399e819678267328c2b41bd2e55dd7f5357b3cf3eccb26c6adfccb22c7b9017cee49892cb9129806bf6da6b99877dfcba3dd6ddf669980cd65c0eac2e07c47c66ec72e9d1a3461c7a84110d5efd04da1f2e4bbe60341ba4d16ec307ff2382f8fff08456e7a9eefed82563505b45f5976199f598ba44346a5bb0ff17a63f6661fa712c8f9f0b76dc3089ba5529abfc7e2c51f93749a40ee30dfa779c820684575e10fbd877f5aaf1fe2c1fe9d44422bf084f75524a9e6e799607e329344c22e9ce534628997476f43bf063c07079626cd4b0ab52ca4c30c6862cc261e412ce6950caef27f04a5a2103308002490ac400e5075690b9cad0240a12d4a841065d1a7e2aa8eeca8b2635a4df53b42e8a2e80589d0960d05c5ec0a6d09840f7171b52130a8542a150284402111d91e4d6e0f6248f36b86d5c88db482cc09ef941fdb27fb920b0ef993ded04c40bc2d5fdb59f1fbb63e69c1f76a2fee4fed0e1757e736bc8974f50ecb98631a830e6880dec8d1b66f6318da22f5fbe8d46c9d7a837f268835c6c900bfdf4adafea1710aea29955eedb366febb54363147f63eda39ffbb147f5271ff3e2465e0f5d8fa399977f474041ec2d377713ecd171ec0dafd9c4e2cc26e663ca6d269bd99c9f3de6f998df1f67f6c39cd87287c2997a7dbb2d124d8c31c618638c0ed2b0719a1b28022b66a06de7041afea9533bc44c192c9723c66b596bb670ba6fcd97d60cb96da7647c38ab0c4fc66b1b112ac39362c6ef378367cca859b6458d5b09e843d9eacb48e3ccd938ad647ef41a67fecc9eb397335ebedc6253495c4d7c3ec36b250d768efc4fca2f8caa48a3fa6bd2bdb135c50bf3bddcef43f9c5f7a1a9bf0f2f22f2ea5e6e717ad937a70fa517559ee4e9c30b8a8aa4cacbc875e4e272749f7933bcef35f65cb24fc77cc9f1d8fa7da7063fc6bedf66783fb225a314a1a0bfa46c7ddf36f7b287be6b7ff93d766854455554451528140acd0cd4fa6c78e672c4f81e0c68c0a23e1938ccef9a38c8f84093d2aed5389e922cd65f39e683bc10f4df6b5aa4d9624d5445d55573d95c46e4171791abc8a5ba6878342afc9e0777c30c9a2faaa26ac61755cde3f3b82a11d1d149c6894e1e3f7c71a92e9a566bc68cff3c1f27ec79fc405bc96ba44de2e0f816f4a541f9377ccbbbbcfff7291c5e7e34126f3ae2106914f7f148cb87114995d1a6ca6fa491a22aaaf646acb961ce9873bef7a16ccd393f1e3f9cbe953d48301c4fc930cd8f3f8d624fb591eb71f0fc4774c3ae1a87c70fada4713cd54696fbe7a5c11b667cac33be5004f57b1c7d92e179160dd362b2a4a76850360ecef7799406a5fca86ad494acecca6c78cfc3f1f2323fd992acbf24cb861b5eb6ae22979146d9f0f2af233d6ef8ba185ea4893593b66cf8a2aae543d972f930aabce0a2fc8442ad4671517e42db835ebcad2e5e4babd5caa2aa715a2d39a2df948f237aebc96c5e734ade891161509053afd7b6511b472ffaf8ccd2b66bd350fa317df69a73ff74f8d3a79f3f7bd8631813eec2a6a8c35cdf8581b7602feaf58b450c7b91b7232f5ed775619a171b4cc2532a7f6da6d754fc4d98c74c3cae9a5cd2a871ba278d7630e2bbba591d9c9c7a3d6814d320f6a02ddc8f68f0d2d8e6f2a7af611848c61e1d27f14984d223d269b20a8598521b9b23f82f6d4e4ddb481e3369f0fa18bffebb8e4615502cfbf961d7b4125a7dae2ffdf55da48f340a49a3b0fffa4cfaeb7acfaeff6283d7973c8c590e73bdf619017ddc35ba5e5b9084b13cb58b3d8d0f9116763de58498a94fc22826f2913be98d207d213ffd683488bd0ffe8e68f0fa30d0e0f51cf6a12dd66bfe7585b077d6dea06914c6fd2ef7bb9c7bfe4d40d4dcbc4291974061d20a77a749917afd9504cb51a2bf1e879b80f0f5d727e1dbb5dae5464ca051fed7675eecc17f7d9dc3750c26a79055abf146e95c50f63cf64657ed915002884d750ea3bda6fdaea6699a36b52855c3d1cb5c10a99b45dd55949baa3137e587b149e5d5fc6262f3b5d7353fd6f9854c54ec8b2d6d9b235383d7ef2a0a911adaa8da4b1b8d0aa90f8dd2b4e7b17d3875b46dd2f96944b46fe6d1a036f9f713a251d7179f07f69af67bd2ae2260cbe5b0e135970b8b9efaee418e570befa25c3e6cefc3ab2ea86ea8ee4a8be6302f597edd653c8cc70b33e250b2aa945c8e15172fc6cb532779244bf668adb1344143fec130fee12f1a943f2efce9e0999595e71ffea2512ccf71441bfc72c8c1cbe13516cfe5b5f562ec4ebb0d1f76b54d56679dec8eefa065d91631110481e4c63e38157b97d7b64d4a9dd8834d2771273e893c114a64c59ea9d364c57111c35cb077f98430b6b10ffb34d8a837525ddefb0b73ccc5dbf5629c3a1931076f97875016895e12f073f06a5e067c6d234271306311e5f2f2a51216e57d8c0f65134e1fca27741fca2a54b9c2825a6179f92e9eaaf2c738c9f06c8a601927c44c5df99567f17eeaca17a5f2c756a8913855971f5c63bc90585dfe87a8ba78ff0dca7779ef13c235c617c6c73e1a0d820dcaefd4a0dcb69516e534508ddb38c61cf1a372aff8b1c69317723d456cb7fb5d965de93e7ab4c1f8d106e5dc3952f95d75b14452fec16ed8a747a34e38fa646af0fbce03c2d5c77fe4b37cf2577e647c2f9d556f5c3c5e107bcf8b0bf2c7f0e682fc276f5b90bff3e882fc323cd382fc3978dac57b7968eba7f1f688361825490e2ca6b4ebfe41f0f39859bb22d6791f9f764aae1c467e8cf1f1b797672e870dffdc83f7f2bfbdc1315ece4aa23748bf4bfa189eb7ab437ccc03bd1cbc18c3833165bd0806ba2e17a6e32bff8f7f8cf82e5ee8f2def3e9bf7e5167fc572d2457fcc33f72159f7f62b4a951c577f72bf8c7530e0667f994b6f12ebac6cbd02af74253b12967398c7c9f26b4a450e563a146a952fac82cb0ef1a157adf35487df4782ccfe3aa8454f21dcff33ccff37ce7e453f04ea7f764c82835975e3ad969547ce279cee4e4f9eada4e7f7acff321e38170fdbe6bd49b565c1c29993c700483e20f65dd7796a7603eeca6ebc0cf59397c373d60475807f961575f10076c6170c0e1e5121c70c0013bb2e3eb0c57c382f2b11b4ff194c58e700ffcc33ac8972e40411ab686fc109b41955de5479a68e35d5855186ab6a8d2a6ca58a4e230e3c3480487a41ca864acb6854dcf32442323000008d314002030140c070443b158309195c10f14000d8dac466c4e9b49b3240821858c31c610420810002200042303690300a424b5129e27f026d35b80ccb2359ab35245c67cbdfbef362d2a4e0b363573b93eb04fc5fdad2ae8ef57205706adeb73a1927fe04b2dc1a21d2c8a0346bb2c79755bca8ed952177b92908c7e6bab2f0424dc3a66778803f8440cc6ab4a8c3ab028b88d7f8a863323435af88d56dbcb87b717e18596d1e1d25a50591898508d7571aa22e816da829561425beb4d5899b4e24f8aaf00218740a583d20cff0250fecec50d4ac9bc109071ba492f8c074775661941dbeaec62fed12ebceb2ada734349c7827f08f91d50fce3979c95a3b443a3667622322203ab6d5a4ff88fa45788b2829fd5aa48ce3aff0fa8d45e8857a98b78d4f9245d86dc2fd6aab0175a4496b18b520ee8cd64c999493f44d7a9b380c10fbe10ce207733cf1863dd91c9ff8dc86fa097fc7a5318b24063c62e2f9b44148b71d0968e9238a5bb901f31939f91d8b254fd4c01060d7eb12ef7be5b2a146aa271cc45ff278cdf7fb83862b338c850d62fd7e02dbc1d240dfb98f51ce2b460b30886000cc4505c1bed79533a936d4b2a75176b94a3a38fbe53fe8c9fa23920db29c34e5dce19121e98b3ac6f43240ed17cdd45b8d72cf897660f6dac55511e1fed43c87d4ed0f032f0a65de432d561992c5da02294e842675146a344db845e6ba2ddba310d85424c939be6fa45911570e9645249387b8bdc2f317d03a536d2db57c435a43ea2b191829b916e4dece00311abd262fd55827a23f2cec656d85433b0d11ac9d4829213a22315c4d131e23184979672acb63ec9a109f2310c2006af9ec14fee5a270f038754ce0a3574a4117df802c7ae27e382eb903a17c02264d45f962273563e81ac4df69ef9ad9b4c2b0e7e8c692b2514981f06b958409ce47bd919edb9dc6a6bdece468569c986e73b536fb71559fefd5d34a1ca0e75fdc7488aa95b71af12fffcc9443f386df67d4aab3dbefaaddc52d286c03dc0c85bcd64cd53d205c399ac7c8c516c3a9335b597255a144d964bd3b3c6b8078f7c45dc799b424b08acc9724d6ab22eaf92442a61283f2ecabaeba5eb8eabf8e10259f1d6e8a3bbbb42e5fdbe93787d34eb07e7997fcf952628e90a58c16a044e8432306423a42c3702307e111c786b345f0371a04c4b565c6118a76e9b0022f92945226502550436700b2aae424f7f9db13d374e9951f0a5c8a96c14a44481be5465c464e5dcddd2900d50dd8c782cfd90ccde8451010e9a853dcf9144d5b309e69ca4c8126bd389c20421908ab61f3b3a15a9a5d9ceb28a8eb3dd39e3b7ed41805d37d0ca513101b4ed8bf611490a85f7014450a99492562ee07a4331202c2b51dc29f53113df5c53a10dcb554c950a84961019766c913224365273a5b5ac97ed3933566da56446caa134c36d59aacab915f4231e3a72a9ba79a174abeffe3f9b529d8c4d027ac4d5ec050cca1c807a1d395d1874191d3252dd9584bc213b44f98ef332c8f4804866faa4ba75dc822b5963d51ad7ab9b481f13da8c98df8454ef232c3f60e9a784c809cdf2db214c56bbdb91044aa9745215c6b4fa59f335565fbfb2ad14ee122bf18f9a4d885f42a411235608dc3f915b9f7b4144fb1ce22d2a2875a9cfed081e9d4068e40993c069c554918a845fbd510ae0d40ee1c82e2a660a7b7080f83943e62238e4dc2f8b8b35a999384a23100551710921f7459215c9f4bdf403ef38faef6310460282006d71dda8b7f91da59833624a9b538a25cdc4e6bb6840f623a438d5ef7745258c507791ee9c989b7d03d58373d1e244747857027f4014632af079fc41b9083537e48d3ce6ce41168f375993422f921f87ceb28c38bfe6489ca64576e9641369e31264d74e639cca2e024032fdf04ac6411cd1f1b4fafb819696e4d19ccc44df20d7532b3c6054b2e2869cc5ced781f142a7fbf7acf1275631c6cbbce3f09d45be86d5e857d435e42de27389c8012be76f7d792167ca1e3259f18b5f716746d051059ff90a4b94f42529a96f2c80af123050f41c9b2f60de826e83aa6338102a0f9facef43d388f7e54acfe90463dd6bcd5a2063108c389402d26f751f6bd6b0b5a538eaae4004aed13eea57d2c3d407ee46ab39a6e930f69d968072d1ba53d846c41d06746dcc43d38e6330eaf3ba16521ecd0c1a78d54c782b3e58adcd40cda869619337c90db82e132760f0de0cb4eb40a687da551df3a05d4fd588dab136d263f736b66606eb572914ee9bb53ff7df62ff635505f2c624289a64a317a78d5b6a71e8e02be6ca715e17c7228b484fbcb4d5c5cb77a7fb9697a7f4c2e11b32539e75b10f9770cceabb989640392b54cd69f1eea74caeb28bc5aaaf4465b4b9dda9b6b61e50b539cd51978e00c16f8c72ec4753ce640468f31821b23da7e47f4063798397ee5c512856dfd901defea43a6fa03865aa96881a6646605917e7600245a42fd163a2180f1b0d0e4fb5b7ef418610158db728285941bc9e4bd7ce7048702daca6cdff55ec05536dfdc25206a66b18e6f6c1d9c987fc09173baec42dd81d549b8af0c15af89067a00a3cab54168f4f0628c5a26e8e43268e815ce2c61131a196d7b5c2cf43f5e9b5c5d5ad9f2c0f39320a89783b042b3d785fe56e3b40e351ab89d1f6749ac75b2dbcfb5a6ab896692422a92584ce6f94b1df21153dd681106cb9b6e3d25085c2968888fb2e51f05b710fde4f786c43a376fbda4c76e312c4ff1ea151a8b30113cfa39582bbd9f2ac34dfea0d6022b62955d8c3f0006fc4e1c93edbf4b28d89757c3a68540efef7045bd48a22667e7cf9424682a9f5f581c900868c6954fb516bcd7b776f402f92e7666bf44b52ce7bc68a08616b7686bd41ad482a8d9eea248adc1266ae6282cf621c5aa35dabe346431b3dae45aa919cc8e9bf0bedb281969bb51c8b66be8657757c619420da4c520ae373d9f27d21f8e71ed9edea409d60ec85bbc5b3cabec10a7fae32460e4c61923a828a2dfdb30ca5c08758b67948bf16c4368224bf2577fef61b049e88c2734de36c5ba33c339066e75015cf4f577751a77c0acdf3b1d25d41078373bf01d7cfc81c4adbbf59b6f9ede4f7c16a583d4049a44f7671d135f1e49f3c39baa1d0dd2ca4cec688cbd074592fa5272e91207fc7384e473613d540a321c4d837be631234e452d9bf43939fcd21a07c64f048b75503742df27d37f82cf0d09c17363a8fd900d868df6a106793963942a0069a8e43ab7682dc38e45c4013194500182541f10a3466b8bd82c67331d25136626382e07b794656362100256a68c520c4bc2cb6c18c11089e32cf8ec6b230ee80b98ad8fe0f540e04e2d8fcf3c95e608551e0e149e1150854afaf0904dd30f11dfeeff1e2e827698eff3c47ddd27c4e0be0b4e45e1fe848cbf34a6e7554c55abdfc2c9ad5364dce563e336388eab57d8c9e44c9c6ee627d7fa23ffd3c4627d682a226012a2674198e36deaa2bc7ab2d0551f1700103cc4bdf38530513c2ed9776386804aa6510112405aedd515671ab7ec81f5f064b1fddc7479117b2107db75455c497017dae22983f186d4064fbf183a1d3aff43345554e3734955cf86069114c562df432d02d858702ac464c252511e2fee4bce751431fa1307bf15332dffee013b6d7e98d3f8ac22b68d3520305fb20daf73d80bb90c4a1d605fcbf90b0ff3f28cad1e6a99d3e46780febff866a854623d00bca328e910482b611deaf1663fd3d8e607129df0372cc5f4a7981863b4ed633c20e8a2ae9855341598d047bda6984a91de3c402aeb158bcf067161dec965283de967f2e784d0eb6fc0c6c157b7aaad0a0954b8030c4f2060b758d86cfd3ec0286048704eecdf7b038221b8cf4566663a7b468784bfc298115e0ab78047a7d9f45c1f64e33dcf7d78c7ee90f2c0dcf76694210a6216bbd4a28ea8840b08594a209b9910523271ac6a206ceda9472d35658f246cf2a7192d722d2455a94a69ed7050127b44d8edfe3ac4b2b693d85ad2e15a9809a9865369874212ddd846f5f7002756e8e32c0beb7d387444f812e592921e1504e8bcc9cbe5cf3ad2208573b03cdd35b063426332960cde9d86ffaa19090d92c5b9348727a2db30011b85297a7b4b0eeeee990af335117cbae0797506698d4027678659799e27d7172baea02ccd25d5998220ce6114c0321910be3202640c8f0d82456c2f4f1e0b22e48b72a8a59e6d404e7204af2008a62f94d7ff34f2e5e70491e39e9f0184bdd8347f5188d368ad382335981289c42ec7f9ef13516a5ef7cbd20a02d142f326d714ef36336ee6f0f0ee4ec52c66cc42e882d5c3277f1efaf9b97240073199c178c0c25fdb6195b66b83a20efdbcbc9e38aae76fd5fdc48cd4583b386888ae22807eead60f44bcf4352afa69d6ce6ae33d8d9d149deab2a22edd011afa81bdd2e11c262118d074daf1fc0c17d09b59dcecbe6b6ed4afc669ea20317d35b1c871d5ec8f532b25d0f773336a5043f2dfa84bf026130d5f2609deb6a4050a4ad4662b202328384694e26f7b04c57d0836673b745b4fa69c4c9738069a9454b56e4ac20c3fc67d46fd0c0bbb882e3529feff5580a13c043ca2064f3af84fde6df634331aede6cba960d665a0764bb9fb4dc2d5b186320db1a3dbb33dade3aecb1e92c3c59a4884be4af0e75b02ab4c90dc5004d6d982be33aa4653f05e4c4f69045ae316e9cd6a607f3eea4bdfc909b538bfd338cb8029939731fd377ca10868737743403c59cbcc7de6e80d9616d6ca45a78f707cf5ec0afcc88da93055957adf9402aca4460c016ac9ff9c7c20a097fabf0c9fc99b3ea203a4bdcc1d58a59107858f759456068d438e860bc5ec07b2180755fd71223a34c1fb0e295915594385a10ab246b97a331c70fe283a64c7a74053eae1aa453edc7aa9d679f810ca88ecfc4380d6698b88ba5817d52ea34ebf8c02124986572169a2f85e3e0ee8bc33c1ed187b2662583eb84ae9a5b7503675f7751ec7ecdb7c4b143b8602a8e9ddefb174e9475d91120eb87a33f466c33bab8449ae197187e69de91bb4184a51445974a11c0818d4b318f4fe3b230d4fd453cfc81f4b76f1493c70d11f07362fe8598803111a4420aa1999b175a568383d449d55f6bcc814a5c5072668b2f14072b970f31c1515ba409f8f4962214404ee66b3b94e40340d7cee37f91492d47e169f383fec8699736b7c1b575133278a713aaa17934a65c03c7b4e7f7f88206b488f5280828307696ea92edec7021064f72e328dc2fc7fe95f7b5dd4f0e0d48a542db8f4998c00e5df6d63af79cb9c66d96e610347d95fbb8dfcd1b85b285431d59435523e316e41c6319512287ed96c709a2e46f2ef689fb4cda4b51974c8ffc15c857008879536b58b4296143ca22d2c27bb1ddb0c41d4735a268dbb84daa412804c24f9785f7e8c80c2a707d41aec62bff39ea0441dba5e584dd0c3181781b862439e0badbac3574d25f2e00da6223e2eab7ee3e02284de2bbcb731b0335e88f8fccabeb2351a8da7b5e7e212cdaf47609f28d3882d974274efb69172da71924532c46d638b3f0cf1e4a1a9cf73bcb5322c7d2793c7885c90647fd41973d7680a0510f6a346dabed2bcc6ec91783136e31aba0a19c09ef5c59abc128a6a54ff59855a3daaafeae0299bd54dfab4cbba6b28baac8978041f98431a15ea28a420d30d69c45a6721537d4c32cc21119405dfa1f2d21fb775f15f3954721533c126d1d70a446fb52429097229047a57064f6c55e4f4d7ff69fc0600f145e6b876e19323ced2f69ead2088a68278622b874e586800907568b76424e6b2489f656fdd2e414842550ef1d5f1f7f9d61ce4fb452b4e7c98d2306d9ec2f6e2b30b5184bb1ca1f3674a44e7b860f0081a802cd785449cf3d44d0f07d3239ab81e66ace03433fb3c1f73997faf4d7507f5e7364a3cbc58a14106ab2464a631c8999fb9a957e6b8fd6f0b84f303a56bc651057aa500661fa3fa11fc72236de696d0503be02e656aa75a3c571423dadc3f295a58b760b7ba584108e895c4adddee30d7f8ade29391b5616a2d436aab01cce43b15229550090305b79d44d123dbf54a523919451f1555ca4a9284f70b54f13695c4b2dc678566605372ca9d212bcdb930e9e6215ed20070ecceece0c1480a9faa2cf4d2e45dfb18f90d48630b28e0cd05388088a6dee79a8670e2bfef9a79b8e9b2070e6b47d9faa7bab79438646ae689838fcf4ee7b50ca8c348a04d0ecfdc8352ae32e9b624404b685aa348450144a042797c74e21cb8dcec82a12f3c170e70a232b5ca29d00b4b20d14a12a93054ef7e1a09515f214e9aa6c9cd6f24fcd134551d3bb279d8f3317e9b63a24e3a803844eaf6eed8981326d8a32c23f3534742a24ae10b959130f25597677eb475c2d1c6aa667d849d64914a6fa2a860715b339c0e4480294af27ffd9d1c4ea5c8328ad813ad0cf3aa9074e52a0b8a4384a94fa6cbc9e4ec630a572bf20c8efaa146e59b62c461f159d7337b1c82722d6d732e82f4b672fa3fe92beeca3bbb0e4243b8faa76127d791097bfbc31753fef709a79c952940ea277fb04c193934e0029b2331adef95e2203c5a6ec58098631084d6e4c9388b4a54b2cf0905064ce84398087889d6e2ad9b9d298e7148617f84642393d735c7bf206f08cbd1a8c36f124c38b05546b050357294627b294b4a746fc0b0eeaaf2be6709ad319180fc3cae3fdcddd2ab054fbe31b2bce514ea46e4167d80421fb030d2f2077d0c1b2b9859f6c417dc55adb0aac9403b321d7ea12cc6fcf06984fec75c30de323daad62aa6e3c4fbe63da8e2b664347a5801d2d822c2cd71a22aba24d311071d05fc76dfdd0a15917fa145b6b4901e9812cb2bf03174a20f71f8f4f1d64b86f07e5f4fe0bd4b2049af547fb97074ba5497aea7557b5433a6fdbc0bf10e301394b0ab712cc7a3f4b3bea74cad40eafa5577cf2c2aeb50f3fd2a0a6eb2e31c853b53765205c551362e935fd9c4f2dc832329cd9fda99c445270a0c037f65e4ec2ba18c2bb6c832ab15474e7d717b512b81e06ba258ff6255505316ad6100a5ac36d6a693171d403e63727b5c4ddd3c5b0a848e13aaf144ab8ec750d717adb8b6d090f4d30c04db3279b8e1277478e3941915f73ca6e363b4ab34398c4148ec2b74041895debf885d8c075337f45fe99c9b32b6937e6f7882d00d3dac5ef81eb5cce3d66e3ad9008c57a86c48a45918425b08ef040c148cf3a42bcc357319e25af507d76c598144f20ba224d0db51994e22b09105d4470660c196f0b8487d7d3ab19d81839e6574cfabec50271b80ed6eae0e2214717e0f31b81730dc2dcfb56ed2252bfd79c9ccbe8529ca6eb690a9f0f0ccd43370c8c7052b02848ca5557e33f7c1619561344957bd37b60f9779ccdeb066d4d268ba855819bd04fd1d7af7673042f31269dc0e8d352983ed8d95c02839e1c17c8b69be125ca46fb5eaa1575bdb0164d8365c575e5f303485da6766cee91ca24823f044ae10d6dc2ff1a1ef417893286eb70246c03c9d584a17c25dcab7d88f9722776203fc062d697040ad77e78109b402090969ec179320b98dcaa0df64bf19d250f0a625c59817f3914815593c844f3e4bf7439702761365ad7c0cd3625b8245602ccaf3bc7b0ea1c40976865dadd750c40a9dd54297600cfd3d5d7eafcc4fdde386f5bd6885e4da31bbcd675ff64bc3d47ffcf6c015a13d26562f1e103483fc4959015dc949a3592829e2e00cd2684c2ae2a07ccb617dae3d6db7ff1641670d32d862dcb49f028254d29e44138f9ac89ea95ae858652b96f8ed0d55118f7feeae646fec99b65a950070793832144957214cfd793473b9c440268613eff1f4433b5500a819810833d76be6c2ce7b1c48cad136c476f19782329080ad979807a4c5e13c64364c0933b8e8622549363db8674fa8b13df4e6f35f168260c32a32c83773c1b098f824a5c6a9db0d7426ea8fa4446dd588da5715acb8d3ca3993a98747d06735e719d58ee9126a2b9096bc8f4d37b02f95e0049f8f57a71a26bb749c9d69862e6211e2fd5b7b01960c6235a4cdceb068a69e1955344f2de7f01227cbbbdebba217069abbc039c636515466cd1ba2e44a0c5e63af7e4899ba6fbbf7f1f6df8bd74ecd71a9a4ff7f432696038ad86eac4781a06243f8d34e170add7d5e8ef05b6c0bfd36b845b18eeb64691acb5f3953f55df15199e5d7ccd49af9a0962bce97c84a74fe231807ffd58d67eaec1c3da33f741f4fcc8ca3449182dfe81fab41f0c55f2c9e3ea29b35bd3ce6c7ba3b9643f0e8557c9173d2de6f70a820804b1ac20b1a968edc84f64fe94f31a057adffabc4c0a2edbcb3e93d51f5ff32511a441ef7c4de0f3491341234d23ca7cf524efee0212efbcad8696fc5ac24986182cd93efa2a1a1e3480362e1b7da2f20e3290b8bb38a40813762390c2b2c8b73cf8f050d7755a27d58994e041233e45e027a985b38fcd4c484426dbecdf428c5dea16367333b1fc23fa5ab3c27c3eae465c43cdb6ac292e55e1454421fd7818aa36bbd4084844b8f4665f816679ddf424d1187cc2235f62f52a5009903d731146459c457114aa76f33e1ed04821551ee82dc6a9a230bbfaa841ed14f152e15f7a9827aed975a22de41773f278ce8f31ace8bb9d05843e52ef1496f806824a97db5aee901107da08af0c428299f6988db19fdf7580e49883a137b9040e76824b447cbbb735d008787aa1e864ad7327540e7517e27bd536f746508df50f8f40ca70a0eaffd093a8cc6216e82e4146f29ccb7397c1fc0e0263575cad57202693a045036baee446b691be036d8f42cc936a308815171f094a3fa03febc29d317e0a573daff44c152820ac064a58753b0df4cf093a19a3c8725703469631fc6b7cd1b96bb1cc668a6c51504da9b6a0d6336616a2cd02983264408d686e62de6d2cea5652a7bbb0c5a4c71bfed3aaafb9d2c09112e9f23467b48b145861ccf4a32395fe50abea2e9b8d6b375c571ff581aa9d8fc96f761d632e104282e1c226096456094f57df9c504da1274b34d3cac7455991c510f887581ea51832963f30b9be39fe138d7706999fba1ecc830235e720e326567ff9cf62973d5071421d243ef42ffb92d4ae723d871faa8750bdde16cb6838f6c893148dd3e5640b606c34253db671ff0124236b8a43d030a09e5bde2abfd7c13e091cdaf6b27d4799c5bc25184ac4b6447e135a619d12907acd51a72c3f77fd3d82f9afce0f5e8cfa4847ac4228b358b9be0146c88f8e06a3517c3cede472e925641602417a2b2127a9aa63fa06fa61e425a855766938a7847ec4ea5f49785d566c205fc7c7848352a2f238e6e97ddb365476632afabb360a591f1bc2ac85d899d604d91f556620d70f53cb114d3872ed56a65fe15838c404d7f90532e58780a1e87580e6057b92cdfd5e8239bf29a6d95c2cc10208f46e2292d5cfc94e6703b4416c93f05b68bef6b7d3618528fe8011683ef8925acf1ec029919d939febbcd6c6735172061e011d73d18ec9f5c4b559270a0e88c78f2e1a7cfc576743b541f21fd30053951ecf2fd9fbb90b9bbc710121b8441cbdb3d69d4bd2d856b44cb7aa3d0b43193f1a07dd2e070faf2476aea8f55f26e74138c49a828fd14a7c39b4e126268eb55378043443f3d4c98391ad401ab62c8ba8555d962e6c530de5003c8939c1080b1bc2623aca48c9e1079da33683e4a8b4d2b16aa3d2533ae88c687b794f04d8b008d042e863916389541b092f0b4a9486c2983e0c267208a3f06c286f36b2ed445dc20870aa12e2632179b61cd1ab78efc07ac8b172c801549293ec23ccc9a89279cfeae66dc835ecb78a70b5b5d2fdae68ace37f457544e122c7c2a4c560efec20595f2d367eece94b84064c747e3c442340d3f52c816ef3efb5206f3024d736bdb31237b6bd96d679affb315f8adb30552c87cce26f31fa5df552d20282d7966725e3af0e9d04a3ecb2e260e2f65f10b9718c6725c06f4bf5446573c32034cf1eb2ddc65f7c8d3e1bc1b3d2a10505a45806bb48d905e687b633075389bd232ad833d78f340e009467696850cbbd034f9a6b20d152cf38bcc80dcd70a7ed4cd3990a8c6435c6450f902fc6a9445086d875922b83779486d151b3ccf0107dd98616db824b8034957cd972c6b9545495fe6c2c040ec343b472d44f2d79da9a6725b1041b71e59f071f009046bc8eab891e93387d14437c37d63438d55b48134c96a19b518f761f8dbd55007e2ba20e86a9390bdbe15ea1e30d104a0f4ea76e2e76979bd107fa0d84a158c479432b4b7b5c5ecf7588140a66756615fc10859d183f425c34492647e48310be26ea262a62aedaefa1f126900ab2c6f2005148bc2993684265ccab22aaa4920d5cf62aa7853469d628526f2d0d9d88e3b9a230c0c99aa8a6273a5169a56476889ff2cacf2075549d8a1b1daea59108759d5446a951b911ea9987a5ea32ef4231b3eb4f5053c8933791447a1bcdacd3e498a72c9738feee32f1f61ab3f976d9d1d99cc7dc4393758fd90d1b727604c0b81c38b5604f9be4347e3554df3a42f96475dd5a4b31e156c1376453bc3c46545ae80c153439788fe1a4ae8e14ac7070b91d57aa89039aabd09a7c6a4c7e3c9402aad81f5494085e268526a39c4b843b45d5b6eb54aa611dddaee37466406da0a1731cd20e50586cf8399169ccce58aca7ab56757b2dc499e9657d75b9c9fcdf5af654e3a501f233e13173911a00a304ff7ccd5a55e0ee8dd22c5cedb9a613f7ccd3efeebd000a30f0885f996995080ae989879fb7acb79eaf527385ead8ec6e9052163ab2d5f7ba11009a7315d312f962656f83ec769012d5fb59c7b7308f37c062141ccb938ec73941dfcaa24614307a95712c4426ac26a84049d0f933c524c2a4ac89fec3d09e25e5f58fbf046c2325f754a36174d4fd549d945b8d8b5478b84325c0bc44796b23e1514197536265ca24f451d919d17cde8cd6d4d861fcac630ad03aba4662e13945e50530ac1985435399c668a7af67f4e3a9851f9deb67e6867344a43eaf88f7c66ab9a2b81ce9c40da880ca9c58d6a3adcc3bec1b2dae40bdd3c3b471d21e8c8fe99e039942d1183acaa388b1bb0916e97076cf03cfb5ee1769019862fe1dcbaa23ffe4e91711663911e271aa76fcdbaa16e5b0b6bb8a21216cb4fd8a12741c660cf64fac3fc1c09e4d6ea6aec1b2996e4a0981b0d4fd830795acf1cdc18d60749eb9ea3906dc48558a0dcecb94818c52faee674c607631b39ebce6612ea5297a9fd083943168735f7680c6439723abf8d7715fd549b16d73c35ac684779bcc3dbcb20ae6a61d4fe54d24597ed5e161c3764a22cb4b8f1c551d837a2eebe5354961b4e46d3b876dff07a5ae89bab3272c1eb91cc435013810c408a83588ff103cd2a64fc4b47a1d2db3111e0214deca084c4a7190c42e22721692a8842f4d52829626c64293935fa68345b698d4e8792c6b88cc30940002686d2fdc4cf7514e039d116cfc12b03eb1029da3aad4b5f74bf40108ddcdc455b9d0f692647446a0f3e8f1ea98252526429c2e918c516fc0381d964bb0162bf3c71c5bd90e7462280f1f88994083c9ea3ca94264bb1213e4842cd9c01eb960c80626c04dbc805791011509da8cee34e72d11ebd4f56303b88212f24b0ff369e67b9d221edf80012287d3337acb5d99d35397403937438f3a6333e12e796cfa899202060cba9e5a2c2b464491a722732c535750dee07cee5eb641e15d13602e9f116e54fa11f9aff736dc368200a59e77ff1411abbce6e05ab7d73ebe680bf9c548177d2f7b691406897317363ba09729b608416dc0db4e4b41eebd90ebb98c915d1c1fb12886b2585591d76c3a78e054521408aea5638678edcd7817915732dc829824115e284a3b7d0a82b0d83925d95262196a9550d03af25361c6af26ca1c63b462858e98e621b7a14a67e441016e85b177fc6f172bc9eecac07eacf9018f0efe2c86760da9593e8971150c7f883108658346934002471f154d63df32ec733ea900b09146c590145297d17bca0b73215961876d2ea9716beede08727e10be5595c99436524df874138aae49de7adaebb4f4a3fa486e1e782d758be3c3e3b3460a101b5b4ce6073bc5e281d63a8df89acd941ca14a38c52dcb0caf181f97f72e8857e0d336d1c51c632d800db9376458d71b26fac4ca1ae36b27455b8c117eec50b5271147deac8cec90ed235ce18fae505856d9c2b3fd085882f8f7ccd584c86581a8e8759c14fec06c552611333153c0ff07ed09c7ee8f56986aaa3418633266952cb8c05863be8add548ef9ce8718c5f1650506fbbc91913d83cb90388b72099016a0848b4300672cfd9bf4a900f2c05020415bbcde880f875087d2126f679e709f2166499437285d0cacab5ee1e7b680968169dba9e25873e5c5ecb941ad8a16ce88b3b6380eb3258ac7d5e11409282249697c7d459f65766aa3a230adbd968a82934822983bb45fa4325c35ea936cde5764d335ad6017c0511689be6d1eb8cbe974ac32e49fd7365839e954b3c151fb21579b46b0c98e45cf86ab9f9302a88c4c0938e0911ecac9ff7d888037fe46cba506fc4fde1bad3f101f583ec0e2b552831efa77fc8b03680b2f838e878065920c833accdbc76d1bd8a52892666281c895f9025d85ff49099c6d64237291cc7ed659a616d2e159519f7fe1f41a821847031c1a72f9ef712a7dfb39e2a491a934b8548024260b06e0d3536e49bf2ec8751a589492a2bfc55bbd53b56afdf9396589d3c282297dce350788a6c09e33839591642c44fb942d18cdce0e2b1218a0e49636861375178862c5bc8cdf50bdfa3193e772080430ef15c0f87997fd8e9330d2fa2d3b33eafa0bfdba21ba22a61401dc70a1ad93f56179a8c4143a9e568b388ac3fa84553915e2710db1b55d3f2c1dfbae010bd73319c0941168840496b96e4914012837a8f027001531a61adc923ec7a28a3c78e2fe1c3dac0f09e6f4d94dab0b6ebe983b8706954f91c5a30601e88a920d3cce1145b8f91daae115e1254936acdbe3b703943f9060ef76f40f4e52418935173da29922f555949783dcf93d5073ac66d113b68510a59d0edb2945633c27fa60d4a34d42ff28c2082d44fd07ce8c678ab2645a678092567869d241aff70ecff8c42174c668ac9bc091e41f5e532d035602caae6942617cf2404d9d868b7225ccc985d8e1a673647095e3f89ab3a8399961f50e4314db832cd80673efd35a6a284fa628b3652401b87690ec0c540b561427632cfaf649242f327ee50682cf75f24729dfd6989d2d6b9ce406691a2a5461a302f9b017ffce29e1e9bf3f58a4bb388d47d65ec35df58a63f39f102fd6f5a963990343d100906cd6a62cbc623d0ce7fefa0179b00318ab723a7787abf4bfff4c475ff9dabb62e7cace4c1eb6c3a681cbfe5cd55809aa793129c1abee9a525078e9d97ea6c9c3c53fd45381eca9a84b997a8e2f29ac24fcd613561cc23eb97df03d5d15b32e901d1685ee27fff29498838645c8d9adc90975901dddaaab25b3c308e20d927ccc6db3b9fc8860723e9cc07b4135cf21f270c3256ccbf908e23d79cfedac289b1aeee9541b58cf5af601c3536a255a006d8613e93029ee081bf577d6f71016d5b57b75389332f4bcc69872dd33475a3e7edd07718dbe5d923bbe22da4ccea1e1b020c9b90dd211410fa6602d0abb30b0ce9d0262b548473bdddb8a2f88ff9e0a4dd69575ff055fedd0a234716f93c6e9fd1820710e0898253681378879c18221c1174d9a4c7649a6fb1dfbcb88f4dfb19b00a833b6e70f6e1287b9a494d0ecc8e3ea60d7bf7d2c9eb8ef6256e5a56ad9b363e413e33d76cdc6e036028701c103c7de7d2700bf5c5cc309ce8b6d63923281f21223cb90f245db6526a87aaf8d8a3986f937d253db32cbac113abf1ab857a2aa5cdc4aeb72e046a599b79aba6c588af62fc8e8c28689add02bc17d5eeb79404706307d98d0f17a6afe22e0e19a27d8724782947881f3f231ec87e917cd7b9243f0b39aad9d837ec60b3cb2f683cea40660c19802ba0105e6f7b9847c95e99b5898679c884b52a96a4c78b96af04e62c87768d0aa392e389588562a14914670c53f14d4daa2ed968299d41aa2e532a1de852d12bfc6fd29e203e550420f7a652c71ed9def45a8fa29db08e4ddcd06d633950db9a0a3801f32d6d0696e52c2acca794b37fd1fa36b43e4d24554422454ecb618a074e4096e3049b690c97ff665bad420b91dd1a11e00a4a86bf72188af80ca3d429c289ef992c4e3444d725e9f4382bc721a9ff373802e35c16e22f82f425035fab08ac9f7410604288a567f5f55c3263035756da5ad722e2210366d7bd7d3e263a9fb61decc591a6d1f696599bf4888455d10b7fa635b3f81a813253d601df9837e46ef34cce6364ad68e4118352001f47ee20e407ca90979de3e52da61dfd3c3d06690068cd183b08140435ceb137b57094b3d8d66ab6f2eb89c0e66c1b41447053bdba25300c9cefecc91bb25fd7495f62c92ada365179335016e1b0e0b50c983bdd91a61accd0bae9687ec0659a795839ddd4191ffe3bc676cec322f86008cfb1788168ee31d12f4317b3db4154ab239d6674a40172ee6ca86ead5b150fed9d68b6cc3efdd0ece2d885c63dfdde7f68eabde4dbd68f320292d99e1905dadc9750ab308cc3b546b69afa14492a004d56e5d796a0816bb6b07476ad90742c0263ea492f38ac273d283f2b660ed8a666c5272c76d2c56c0403a49ef79036d3160063d040c83160813ca007d06dff6186421b0e9b27ee6ed353a377fa1bd5efab51e8624e08130936b6557f714b85883b72184cf7402cfb99dfcda65a9a15342cae2f591e43c361bd8e5c8103cdba6b98028c162359437dcc9d049a8c8cb55da055c8cbc84ddc29f406e632f50be86a7e742f3506342f267c1fb2be749bb13a4a32c13ea85492859ae24b5660fecf74b7834dc951881a14be23acd3dd9a4e21819ff81dbe13c62b76e4162f627e1339ca70425386e23223260549d004b0d029659f7039e8d7c0beb8d77fe3a9b4f12414c48b7536ea8bdef7f286a96f6cd285003ee4045db374de5c9bb8f39d094b1a65d7deb812e8e886be4b90d63a66e0ace1b6fc04951aabbc4d8563ca9e354e8d84c14ec2344d18d2aa700845592e3501395ffd2388b6a236d728bc480e40911877a0833e0d30549af968e233195c10a3eb00a0054e8a51293178a84e443c5672f66a447f67127cb88be7ac890869dbef04b93a2958150e80522d4b36d587335b4b3acd85a4ad51445bba920c45be9056ac6b422f5296d5b2875d6d01233581318da02ce46f268c123945b6bd53d86a8e14996ac3694103374ed7fd84e1ca221cb782bbed0a41b29514d6f5d3f59b2592fcb239d3c65d3309f2077531205ab2697d02ba79e0e84008718661b09af42f0cb444404b1aea82f2387ec725efcd25a700e75dfb8eccf9dc4514bbcfb8ae2af08cd7eede6363fb2da5f5c10251af27619a865941a79c40dcee8e83f9d143951a4c6ebca6596c4b55f2caafea644d4f589b5ccdfe5452704e41d45895e903ef3aca3ef8917b72d0149912b79a015112f350a10f8f50fb663db625067a2bc715872cbdb6250d1bdeb2f1d4f53cbda202315644fc9861911c79e6317c2b2b15fafb82e5681e631edb5679ab2381ef7a922526fe6869efde3f4266ae001ef0bea3608f8a4a7bf4bc7e03f19a4f14870c31e3e5a24874976d48fa90d08dd45be82d623e99acd4c80aae67f20780ce52b2265af27dcc61bb7aeb97e4c54ee184d9d78b99aea820b6dcd3b126355fa81da38d430cd8e3e8c6debc75417edcd717bf0f737f4d35821bdd4bad28461ca1b5254091de0a69bf8f3c280f649ba70f60a4a9d0964f0ef4797aa4d5ccf7f66964c33e8d0ed0ae9d340159de9af5038ff35860c9c053f4dc5b8e19b06c052e8c754d9d70b605abe0c0c20c563ffafd049b9baa2aa055cc73fa8ef70036ff36c6598f924fee562d6a3254e6e1b53cd33aed76864261d3a7c851e6de36ba80c1c651a05abc23edaf307324848cc54881af296c2f286e08f49c3c929d05e3d930aff36dab643da5484c0a861700fa52126982a502786a6f1c3008ffd91b330370540f266b9f6e1e061496c5468a9a931df07f56302dc64cc7a395ccc93c02ba184f2f7dbe2725627a244aa910b468864e864abeca5148dad1b271afe05a6eac704b447991ac6cef31c570242e91ce378694c440976c3b4114b43b6fecc495988103ae61dd01f9bdcb14042559b83d20825d3dde90af7d20b1d43abf1b8556bb6195859582ea14873c4e880a0e300ef3f112b741d30f43f30fd4762001d0700fd07087a0fb8fe9ad843e70042cf01a0bf1073e8eb03078819e8abeabe18c5bf552305a68702d4cb3cc0f115403a431a325785e9a0f10c60997d1467bcc3857b48bea74fcb04713790c3781fcbea7251fcecf4640430cd023be2dfead06943046d857f30028db41f364d04495c89c32b3ee674995588b3aeea21dad95ea6b6455de104c613c6f11e13c2ed89c3cd89e1ded0f37b4c10374c043726f6fb0fbab83771dc3c91c30dfe432bd67b9918bcff1efaf5f2f4aaa06ead0204ceeb262bbf5c0038d9f191791eb6fddc57f78eeb6e8e510ce5bb3c714e735b227f63c329ce13e65cb0cfc65a2818a3b9887607304f266803e7c65949d05009ff6241347288a0ced956bc617ec39697a0c3446aeddf6d6ec2e683ed30a9aa021ef4b4eafb721b8c51ef78eab8594cfafc6f81eecc669b9a291dc754baa63a0962d9c62d9e76a1885a133896cdfc3b6b45168f9c3346a38149b3accc6156facaf767ba4348e601a5e862464df92b3c97cf4a5464a4419a8e127c4de1eefb0071585414d51d96ed3f3430c26265ded77c672ba38b1d63bd7af60498d39c39ebbc6f39e707ee905c79765df8134415447550b95936204a14adf32275a86b090c0034437ae5e63bc91b4b0e1e3d880cf6073208116e3e8fa4fdfc3f3f4d1d68de025c62a2238180977e00adf4f6908440909b21e8c647b57dfd9bf60daaf887466f4d60d13b40143e7be4467c55fb2110433951e892c92f919bc776b92c975f39df28da5e7314fce871603fe522655af3491a9c43c84d6126415821f639abf28af350de0a56c2c44af7f0fbf3de24870bc50bfd2f11d902f61edbc8baad63c40bc95490a1cdf17f28cf40b2aba350c437dfd11be6c68fc2fad17619d721c6d10aa713042303b74200d5fe204ce02bd4f463cac922c2182c75ffcb8afe0994cd5d2053b72f5208baf8355c6b1cde57c7347aaabdeb6b4b11d59ccfe9e00f112fec3bd440e818284fbe4de32edc2875eb161d3ddf283cad25b57105c844a2ac6418e5a439fcadabbad699237fab6d90dd91b6cbfa3b07227ec2914c2fb82b339c03b4f127234a1649f37769ed71bcfdbb46fc0b4d4f64df0cef6f3001c27f4ac97bd83c4a18f4496b2ff7c0259c04f0b6d244ff9db11518ff55d7c66de4992f7b6b182b1aff92d669d48138607d6bda9ff40e836683645ac573d73e194e41c5ec5c87d7139015f2270484436c3102c910a5c9430534e32ba6fdcbb50476bfc848dda0aec032ebee68e7fb435df2fb943e46a2396053dd3734d26e6dad060e2739f08e0846d7150501a145a3b1f3e2f189e3546771e1e4184dd7f3396f00521d21c2ee267bea30e526e94cea65d99cffbb0572630968279c5fb5274fe139482c180b4b8fd1525c72df68d11be142224a288f4661f7a451ecd7a9dcb47a4af2e0f11e513303a4faa307dbc66fa97a46643862fb18df7e04fcd1a8d3ca900aa7e7a1315cfe9e1e2c8b0535de5a3d930b4c0d0329fbdfefc5fd11e2b2cfd1d12fff54a22c4592450bb56ebc5148437fa3f2d2bc4c2dfe7fdeafe8ad7483f3c8b6c75b23c89c7482b68ab4870af9c12e875020dcb90c47ead66b9609b4afbdc349634df2966a8160bbd1d64f2c0b424846425eb66efcb7ae4d8dc0a80889a22337881ef6e914f98df903e350da4e9a11976e8d2265a0c61accb4e7da5c2a25ac8743429038bb19f0be7d8c21914598a4748443620d96694c80cef729519677f8e4c590390eec4a62f9a8c6ff5b11dd395061253f42e942f982d692b51f81a93f63cebe4676d17722404928c9053f2cb9df963bef601d5422f010b322014d50f62489f2458a7784038162387910479f3f966f108d864ff73aa5c174923ac71ee1ae0fa5f310ea6b7e694b52c1e4cffd33095c85a0db25b858eb1e448d4e01a252dbb0d45c906aa454c626d67092caa1c675329ebfac57e2924cbbb86bc859b8853bc591f548f0cd0488795a6e35141a0c328a2fd3d481de9e9610ff30a9f6e158c24d2f2a8273e3ecd938f65a215bf2c684ae692b9641e71badf4f7c4e7c26c01edac42f65b1f1ecfd4c54ade832edbb8d36237ae8080c825d664e707374e80d14f432521d520d857f4e84e94d891755461cfadb991bc37f84dd8a415bbaa4d319299f35ce30d833fbe2ccdafc9a41496cdb1f1d5bdc07f2ce9ef2b59edf6a28c577135879087b9e526f4920ce8e775d4701fd8c2c8f5d0e23fde21810ef4728fba6e2c264ddc279570f2b358730dbf90f8924741d7864070db879f840e295d858409ca7ed29c0a79b766fa2c36dcad13a145a5868192f4e1ffb4ec06b03cfc6715aec99cb5732dd35ae9e9f94cb71a57338d55b8fde879a6b32ad732dd4ac63d655aab704da68cee33cd6ab91937cff5cc8658b5326c85a3b40f07a0b2e2d34bfe31510ce8bddc91e75a060ca8bdcab4388b1fad0218c37cd09740fedc12c418cc827f1dc14462ce8e8a85d4c861050cd37e9d2865ea9b04d176b19f717ba65bcdb98fbfac555424f5c7acd417a443672ef17df662d00d67d0d7d7ecb00219ff1fcf5da62deb9cb9b9e0e7d362f998e9ba0094d7dca69b72445771355e31b11271072b33d1579290e3fb02966f4ef5e28c4e33da181002b9ebf988b825a932ef41175fdc2b53de10bd89b4ef30ada9acea7c33b1f529faf21f2d7a06f7b5af174d18dec5b0fcf5adcecab5e16928593d9f486b7915107f2598d8521006daa3743cb29f9dab8365c0b82c1d8f4304d8b72f5ccc9f0fd74c96286261b8faf91951ca69ba8d5670498aef27956cd6ba1c5cfacc66556bbd05faedecd68aec3b93cdf8765bcc002e647ac00eac5accc389bc23c3e4e0b7440d94720be5b3e673213a92d87a8c19a7c145511cbd039293f3f6070b10a3d920716170666616d5fd49f8278080d0dd0423b3e23ae10232cb8fa02cf9485fd229f2164dce45a0465aa6e848c2d36f55ff8d0667d72e87825a653034f81e49050a41199b90718345ce5954b2cc3f236daebba6a2ae3ec39992f6e9d4efe7c6404f89770243d0809b2409bb144c137387b94e8dc5c8166b43ef1891ec9e9383c03567956407c889d5d7adaf58049d98bd9b4bd1c8ae85ba1e77c65c6bdc3e389045da1259de1c34e186c8e21724f68da6c01ea5bca737cfca373f99dfe013c99ac5a8ec16c19526e20a91ba815f88c905dda53858f4c0ab9e4a883e979f8a91674c28841beee88ed0676708724193f5c2245a46c4ad27b30e58f84c87839843f581f87e625e007da91ba8f55e0e43a07a01811ecb2cebac0a7fd1b26b1ff24812628cd2afcce7f64e1ca8fd696e8840ed8c40ca088213006cb3fdad26301d43abee6bf16433ef4d4cea83c61de2a988f5b48f908970a262fe1cfe15dcf668524d0533629d6a3980c0a2684159454144c226686ce958b80748f1e00b31dda9f43692c2db69c18fddb099877e29aef0363a73489a50c883f4889753a38509bd023e282be4f2f62f85af28b511f43aa617496f6c59799a939b8e124d006aa347f42bc1042583552b4247509a2a89ded797b142075d096263a73b8da828c4910d50b46163a7f78b256a2eeed80602f403bf86344fb2a92b3adc3352fd2ee94bf9bbb64385d020c5a175986a6671d1559a37aa927f7866c484d71a3d00f5ec1efd122e1d123528a91b2122781c79600f9dde6dcfaba84774d01238a54641c70d114885715b3ce13e3a472e7006fc4471d3bd37949e52d402a80d3d060ffc8256e1a0ec2a8dfb8e7f7c8e8f0e796811c4bd409cf808ddac825fe28b3009296cbaca0b0b3d28a030723e2a7a2e9e9acb44f4a83078ee0d2af906a92f552e4b0eaa7cd0438781a2b03202c3ea1d72799680e12959cfd1bbd8f419528cb96225ca15c646b2ad69906f5371d30ef721cbd588d45913b62e22fc314168f82fba0018cdd1d384a2a0c6efea87dc123091b14e9e379784b7decdfdfaa51dec3586500f1d180330657395ab7a3581fe244c043d4b3e319df79cd98a2a0be7885101f74fb59ea3f8bcbb19f92b96de201fc2dd1ca984ddc15eac5823fed8c08f09ad97e62c754b5cd291ce39882bc9f425c69538fdc02aa7d5bd51aecbd436852e602b0af8a411f99dd8347501d44ea31e5beffcd0d61c2ab5b1ab39ea9f419e64e6fa739bd130f1e7e3de7e816a45f0fe439fc8bf82b4f2dbe8c76d2ea8318d56d51849b943b161cf6861608d6a389ef9f5ffe357eccfbb52f9ac926f12148dec9e470cf5aad2deafcadf237e7d0800211ce01d66fc3c098024d3ee4bdd221e5e0f9d3d3e189323c0409e344b19de226d6ae996da8b6035249b7549764d8fe4ec198b26fca428d53461ca80510179390a2450c49e4a382bfe27b88c6d2552b1f752d9bf92825650aaaaea70bbe89530a9954ec0cdbc52a87c89bb174472b5974c9096d9c678d52c6ab09fb73ce3afa5a20b80b8fe80458f2c0658067335c0cdc28e3dc4c4513f7ee3b4266be448cbc33b8132c9d01e1ef46c79503f11abb4889fd59005ea97028673af67792124a341ae1055943c9341fa7edddf4ebb925cb249fc4bf8082d10b8582ba5332de5b996bbfeb04b2cca25877330d84de5fbc40776cf91666bf640a73a5e2fa0ffa473211da5c45d755364d3e0df84d1b4911d3f179c59e54d9fd5bac2028ece6323418708d766f0641cb0bee073fa05cf529ad1e1e15e473d71024061ae4527734349b6df1ec9219c1da43040ae06fe5112d48a6cb47d0221b0839297df8ad7c4ff9054d19e888cdac5df01535de82e9731c677de11314c2f835e403f5a20a9e3027520bc5c12815048c6a01223fb724682a4225af0562d7ac46482047c9ce8cfb94f98694cad76de3866e9140c917387234eb827723219030ece416d3d41b53ce196265510ca91e3cb1ef755c77e13795b433714c28b5f2b9165c90bd3d760d2d54526c9598821a6fe5a6be38d67ed42d9d12d80e2bb2f801bdf4bb3137ef5d72708b93a9e231c348dec68f1ffcd442c4ec9016ecb8408f46874890441d311bac0915e339c1ede80569ea9243734d555476231dc0a78c6078369940001f8a51ad57ef088a62767a8f7b59a556fa95d81259c100b494161368cfaf3696050f475190ba49ca9e7ef01192178664a09ac02030147c0dc0ff0683ecd4a2a5006668aecdf1be80a7fc4470f9023d129f6e4b4f40b196882ce38838b118f0c00a5d74da54f60db970a82d57ef0bb9124188e3f8388a47377beb4691e66bd33023318023856538faec5f0a35409739b37780572a805e5184c323ad7ebc9615d5e1bcc56aec9ea3a794df227515e27f0101bd7c696e3bd8ed7a5eb1ed456e5b1faddebc6f226bd195d049cf94c4c8cb64dfb48e7a279d3b0a550781240463f9853afa2b2351223d05e1d00cd4693f1c4f832247ca6b1479ec76959a5eb06211096b2cd86602cc42e77d03d2a5c85d394a65c08051dd5e2220396e055af99fb6d5819ca7e93079061185cb26258618619e425458793637e5c84a9ca43d4274d3c4c575a9c772fe7b896fba78dc900a329dcccd3587232e51d33440a5615b968ad9a3b27b32256f9cf7f2ea44beb68a0ecfc97e21d800178ebad991a840436fd0862cf972b873a05ee08a1a3ff73d6ff96bc9629732926617508d4b0d7d989d6846e8c51a4d14d7ab32a4a4a93eac202f923c9539f261be0cfa1a03d56c74b12069935853b5eac5c474f7af668d47942444c396932761ad98ee0cc2f66e7e7f9c5bf8d53ce229f4e2e6a258f5c9adc633c8651c0153487e1096b31c478a0cd77ba8d235a27135e422fad05dd21f02425e58d85208ed6781116d39cdfd4347abb71ee00f7d704398583e73d88b7de800bf54cb350b233d587b5e11e5f67fbec3cccad569e1438724b92c732f31b755c9599ee5e9ebf61cbd3ea464c16d3d0520e938c0635dd66b08aadecf63ee2b585ae881e710602ea97350cfbf3eb132096ae3d382ffcb3f91d8b39180cf17639330d76effaa784269c54f3de6d86a02e51f4858c5ff7f46c060e13d9a48a76b00e098ea24e6b806d4bb3de9d604c842557bc6f74b999ced6a0140eb83d9d858177fa4f490fb21e3f9ceb90db95e91580a74596d1143fa6cb65af109074d3ecd5372386fd2412c6562245627ce3df48615daa903b362c3d1c926de9c95ab676fe7068944f352909154689cc143b66e92a47c80dc8ce997f417ebf9f021bdd9187e173f00f7eb8839339f172b5a5ffbed1e00a5a9e1931ee23274ddcb3276c3f24594e02b5170b674a9cbd928608d8a3e005073bdf2902f22118220d6b687a60b6ce16f1387f9186c220abf9a6f7612f1b22a12ffa6d3a8c11f49f7b5ebfaa02cc5db8f179787a6ceb1be5ffdbb1f1e9639a2908d1cfa79617820d4af3efa0fbc9cda0b2affe7d31b5775214c9c75810dfd0402ef14db44c41e8b01331e51c09ca8fd8082468aa2c759c481601928d7a37745c7e60064212250b997665beaf491a062809c98bac6484be44b21dd7f9ab4d4d24a0c6f8cdb18c8fd12f2600f0718dd14541d782317393b05251155772965d4e3957ce74af3d80ecf752fbd5b13e87a56295009eb698fcf551671ffad552e5edb8d81730fab8c7bc08c9171d02f7ea5348295e003d2c7bd9e1f0fa6bf47c0f10acf5d67c0de22cb0d019d6ff60235d6d30482e5f74caac8d0c3ae7323873168cd3fd28f7209f57eaa56fa20a6c254b69312ea7d8a1d56ea92c92a584e030843d052a040335bb5e9928b4b5e8c852d66ec38219c2034be3f103a1aa66c4c1fa932c1908b62831d26628485f2b379f80992cd574cb443b861ab3760efbb994a9031e21502373036b42408839799913979037ddfac7f940177cce7161415fa6c6c2318a5d4534888aaa2e8475b11527f7ae60e98d19d80d19f9aafd336200ced2748ab637e8a880266d36ff7eb1a94ca9c99e43209fbeb9a11382d090992646886390d248f7a25db2ea586e8826c13c187760ffdefe16ad7a5c17acae3720c826f63e57304605b912c9de81179bb23a7be412b1c87293911e664998ee368a6c44676d49e426bd42c8e8410ab9092020a9b93be556a7b493dfd63f3dea8cb6d1c4656029ce258d1feacbd8111289dd02ca47e239599937f6f6d926b63d30444d7aa41a9db584ab04cac840c3211f4ce1075e19d48c62862c4f31b1038de297f4127b2639ac952cc76d07680d8c5b5e95a0c23a443831512ea6d3b1abf51baa1bbdd056e0fb8eb8869d368d570ea292dbf0fd3b08008d862bde0723a52f122d69f16b74f3671d900901804ee2b28d0d604a75d0f07c6d334be387c16b746acd6269af2cf282675e06ca2e0be5d38769512c73daacd31f456c8538fa294dde331a61fbbd33c40c1123e70b1592091aeb018075b311f5cd5e010e1fb156f080d98ee6dd03a00cd3bb93c7898814be4447915ad844dd1211c26b6882361a8038fb2ac5af7a20382680ad3e63d1c4141fb62025909b822f13ec26bcc9bcfe8a26bfdc16301152f66c2e4a72617a6e92908e94aa6cb315f9626c35912b69ff27b228893cde4e9c246906e1276f45878042d568abdf0612b96b1245f6ca9103a9458a1639b9ea26d8e647d443227b1a291e2d35a1482201732337d91f334b031af8662fea68782227acee1c70340099ea03fba8c38318fd244d2425bd8f818a01f57595953924b1e010334daf666682e86cbc19b5998297db68652b9c051ef3ea7c9a4a488492e773375c1fb2d41f9ad03f47053da69170db9108d57adee3900a0d89ae184819f7b6a15a66a48600de58cbef68bee1cb99a155de799281d17ee1d16c6ded950f6a220730346377fef58053e8a7de60aaa2b0c44a79b31b82649cffa24c6b6f69c893cb0ddf1cc891eaeffc8b0563547aa8f4ea9feaa470c10e6f8de2e1cf99026bf44423c4eadd2eee199b02d229d0224b971351631de0eb6079ef64035066ef094cf083a8c608e80cf89f5beca7617a57ab4387c36b524ed63c22472a38dba3a91e301a2b662b894d0d6291b32ca094d3f0e3ee3b2d2b72420d965bb4de7b2ab5a5f92aae17691d8cdf5240d96cc5312ae84b08c3710561432ef7c0d9d989a52e7228f2f9b018a70df5226d8042e8fc082e612ef1250446aba032684fad65430546ef3ae4b52c07e29019819b3aaba5ce0de9222b6ffb0db235fcda1bf8190c35f6e697400e088800e95f97ef32359c42188b81598cb0d0564725d6a18889fc0073750deb44c25da2524ef7056a96d691164d7f8511f46a48732e4206044015c29340fb231aa5076d4057a16e12ccd476026e8aa9365094f1871d4bc1dbf9e1dec5bd7c1bd6934a269b497d77c0995043c4c16ffd0106d2e3c62f576bbcbe89592bf00d27d512b1a833684d069825f89afe8262a7f25d9014d6fc902af6c1951eb38f2738e5b076a220305d1822399924441f3aea97f1d23a834d876ff9a47a2f34a033b020403db2d828dd5138798b4334a3a918918518c538c08d4de152b8822462f7d088a3e9bf34bf5ec3e257e4cc6f608c6a69c98ae664e4d95109831eea31edccf91b9eb67b0ac060940dd330b410ed79000bcee9e43d1a2a01d66ebd99397aeed9166458ec779f8796688d6d2f9e7905b3127e1488cb555324684fb54e0c9fc36b705d6f7f0b840093652f69fabb9be16554f4c3f185eb407f01e8a7badf200a46d1cfa30e99c57228277a378712346e21a260460b0820e99408ef8026eac678368e691ecef199723218a4338eda31b4869b710a60daf40b73c76c0767b108f8887a4175e1637a370d86cee1a49de8ae18ebc546e9e1018b97a7dfb18e2e2581161312aa2728ab1ec1da38fe4feac9bd00ab788e4beaccb0c6de3b7df510b3ba271ce20d826ea37edeb54408d5d6bdfe8e0804664d58c987c23072199bc5142c57ce032cea44080aea6a2402ce0df9a9d965b0e20bafb3b0488c62a06afc4c88ad9c4dc2b36c82f2b9dfb4231bcfaab7cbdb691a4f4d36e5b9a4407b9b3a7c953bbe74f4586f336ad33674f9abc0b1a5cce448c783d6c4b90537b0e41bcb39eeb51ee85935bc1d041e1d9bf862922c3fc38b4c75abfa6db527b160a6332efc559f1b23235d839b3dbaa562630831951cef9f3da0b05549dfa13f03b26989ea477c9aa47e1b145029c47744df1c909ed38b31aec423d55f18fb69686e8fbdde5e474f4c319d381c6611591537e7164fa7e777482442609873a3a5eb5c54cec97667b6b8ba02b998ed12176d8fa5907a1ff11a950d50e786f6d2794c53e8e9395cea1230e3432d0037ddad2dc9d511dda871e1154b05ca20c9b9c776d4075079020dfa36363f46f2db625c3c08b4a3a723debbb93d7c4c0bd5bc587470dcf2b7bbd1457dbb5518534c472b173345a232dcc262a91b27e57c29abf3f8565565e41a599a7061bbe7503681c54814319298b93a8b356de5877df3f5899e8218ad80858a6fb2797ae7b1cb9ac27a054db6997ab33ab23071310f00b2502ceab5d12d8686286ad874c584d786bb51f3e98c6631f6638be0c53894b333486e5471d01307a9059fe8c1427a052d040f085fe78f32643217e2de06ef9572f07d1eced3b472abfd1fc1d099e9a83dcc4b1fb5a96983ca420c340e7bca328fca823e19e04db8327399f7a595cbe0331242a0bf967944c1a605b1ff97d93576e6357438e20a72ba80e170080bb9d4ac1c704efa9cbaeec871122a285656df18aa2a0c02bb48b05f8365faf610035099717462fbf80ddf0723f985152a80d055201c9365f993f17a4428d73180cc5d17070d8553e4404d06d1abc25cf8176afe3b250b6ad83b75d20351c6a59a2c4fac5dd8e70ed05803e507ef0835494c01f8c01e3ef39133eaac4b600e717f6aae357cff00d66104235f88642396d41d52cd582e777007fcb7383958f279cb5f14c7f1907bc3f139cb68d41a5da0f9f1b88dbda1dfbd3f15f3800f560ec93f37d4baf4c122eea412169c4bf4b9671ac08ea17091cf0873fa289c4ddfdb7520144847375970179771938dbc7dea7fab2667c558b26d60d18e8303cf845235a6d411a3bdf81acee37c993f1b786051bf2605ae67f497a41f80a6d7232c9fe68ce46bb1be42384a8d36dff893093466e275368057adfdbc4f102556ccd070a55c657b03e6dbc40cad63f77ba1bb12b42827de64b45faec4f1d86bfdf0db8b5569a945a07d8d28009f173c4ec8dd88c5ef760a8c2ed1f4848881e4834eeab89e80cfd84f5897c662b8b93b7038e2420037c2c65d0c4b7ad9942310871296a68cd9b400dbad48311091fc4d3bd5507db26b02ddca73cddc4df51b7ed139b6349e76d9119690267bc39bb0624baf3b38d7dea087fee9a6b3223d88b4c81e65e22531d6ed43cd75d208ea66be516deae3490260e1076adc0ed688ffe1d5b3123aed5645ae6c4fcaee4fb458787d1207bf29235ffdc76db755232c551880f9cc5c40e398940b94cee5a8c22ad80611d665d9c7559517b42fd3d2f35da9066533cb869c006b28930d7aa2ea430c010491a7a0ca260f1418c970ca958ccee72948b62e61bcebc2124f010090320845e49ff9e55c583ce72f20b12d3fe0b2f8a77ab841f3616025f862725fce22fdffa0017cc9047ffa69909cafc5803af333247c15d8c8a3da6f5654bbd7b7276d5b4375f269b9d22dd6a7d1e1e10bd35f5ae18e5540c8eba9a9ead0a67e78fc2a05eed579c39bad001269f8fa8d6d99d7cc2b5c66c7f8e6702e04572151e2578ee2978f9e46041fa574124ab30500795b568171c32e152e92fe8995bde148270113d6e5200024a67afd47c09d3e40a236cc01a5f404f18fc6110d6a9bc187484b33b04909c03afeac753e8b4558a2128c4369d1ccafba7b35c07eedde6f6917296b11a1ef7cd3d1b3dc5613c615a81b5a5da58d4f9d786db184f67aee35105abb618649c500006f4b3431612a405922682a72c5b2d75b3db2fe638ee4c3aae6712d9ef04430fdf74580c9c551764ff43895a45fbda967d07464453052d48d41ea3e8f1254704b15f9deb792beb70689fd6e75fa81d9e97446ec9eb63f6a9fa2506a532038c60a3eb159397f8635d9240bf92eb95c4c65b389009bee28b7a9b41d9f7d5b61a490260c8a2c101da5946c344fad8654acb19260e720314248040065762218916ccf715b1cc391caa61e89cfd974cf559e7644922521b766edf4d22f6a0602e95d8e5f3432b0df8fc96e95efe178680095e6730a6a42d0ab5c79d6f4c9fa34b54625671192232c7813598ce112d3eddb1c91771869e0924a1bb7d02ca361c1cb7fabbb1c932639ef266c2c03a44e562dedc5e1f24118f8a4ff2e096a905a9f5a23d00832928e61da53fa93ce240aa0ee8cccefd94080b57afbbc836a9d452758660c7b96af7f78ab4b22c0c6d59b0f987a969ae41c116893c03a6826fb4a3fdd5e9d4cec308ea8487aff7f8c3d9928b715d2146ef3d4f1fb8b9e2c111386f487b095dfd7bfd20c66a313384e077b161b06f44a8980b31224dfd209d34cd06f11667329a71751fe10a49cd29da2fd01365e60d786c0470bfabff4257c8bcf6e5eb5ef1a12c1d7f68f1fa4b40480f4de1c58934637bf722f574c5d63b40855a1f456851cc41f547eb0f8bf133ad12a0b6a8c7c7f87e8845fc458099282688e3b4563576f2c147e2992fb39591541bc51696c873d5ce28a2fbc38be7abbf2dfd939f02db162db213d7e3f32b795ef549cd6d6f1403faa6067778da67dc79f8868406f1f194aacab5363198b6b42f781e3cd216b582021ecdbbb1afe1e0681c592a879ec4ea7982c5792c2150cab016618270054a34118092950dc5fc762f08d9d8656233f2fc9e155af4c7e01f1f925c658e22bf4f708352925f23a4229abab2343fdb858d0471494097f9201baf156fc1fa115bcd7499de66d6f394711d7dc6373403c891b6e4b61438cadafa8cbf24389d1fec9965ebd380abd72c719fc11c21dc51327846da506542b520cc6a868399516f1a3fc4e688d8dbf66d2a33f75af0322024b13831783caf952db8eab2cab3330c88a274bff297f835d89bf9414af1723fd96148f4e0f94ce69eb2f8e628f208cca05c096210507d00bb0ade72b0439225aec3cbc5ad0f42612b63863f5a58e0b276227b39886b24903138d6bef27652eeb459dd80a8959aa732b1d118e987669227f7d59c5e169c1c37e204c6c65ef97613198277c694e00060533e4a1ec5bd276f36952f1bee2a2a743cd68a9dd9419b1de68f095ceab6b4dc706aa64f060f76f90c8985c3704883d3cc7b270873a40d04829166cde98eea5f9a1d5396d02614c88d31b2b61d863bb967f70c0d9a857def98f2bf60f22b1f39e2e651b8b353991bbd4b58898a942ce7c7ea1771dc3775f303e9a3ad9b3efca922541e0928519cf7aa03d708ead630718044469a67517f52b8406e18f1ad0832af35ab05d912774ea78e816802081292b0703439bd50614903934aa12b7de45dad26f3493dd910ad1a9ea42dd1d8abda99534aca171ba67a7a7f92082e964d39e01e49a82cb3b39c84ff7438aa21281d31b7d0e5554249700ca0d4b8db02876538745558d7259aada8b9999b72b558baf8464be257142b9aed2af3690affc267039ce89df77c5b427805992f4834cfa5bc89cb8088c4569069d7379289fe7cbc869278258409b2cdb85a87474dbfe6d1adf424a6674e7a5512c461f29635f36775b1b65ed613c3df3905263e93098ec9357023e095043f3ae6c6842b1703ae815faa07e5e7fc34e5194efb98f77198982c066dda21002179206b702d70ba9bbbce920ef27947033e18e915ea2a5761a97b67e5522ef22ade98165aacbdebc171f9d4db008ce160e518f3b510ec7c778e600f846f0010ea0accf4a9d67458818f2f39e09f00c6d87467e358d23ae63efa22174104499e79b6d2c9cef570ea04b7a90a93c23d2de8e106cce594d4d67f1abb2cddfb237fda18a077427b5c83d11d4050ea5e92cddf745516cdfd6837b090ac4148d5651be992bf37c7ee1fa902930e9404fda44282a007a8e408e39b1f09c84524bc0c20614f77c8a215eba5ce3664a59f5bea02cbba01007a4f66fd94f1a9a9ea8bd54443545e12ed42633598acd35efc5bd6c4a9d71353c9c2016e15a77a4eab86a2e0f39389152101317c020c95e1637a9da23ea1f80175fcfaf50a6d0f3696cec745296a4fe257326cd63b64a24cf20aad80800f18a800e57f10374e96ca830ed7589a8a858d30d6f1c8a2d40ac5d8ebc28a2d976e6a36f329b473f5550019d7db0d986ca8003b5744fcc8fca88f88da5ee33c410738357d8043ecb571fcd1668c228b11859214c85cc9665fc51fc928423da2a23c80d03b8c23d6919c27ebd4f09acfa66406403fc91eeec8c1da3463a2d02cbcb91323fe7749855d91f740405abcbafaaff55afc4bb38fa51d129dc53db4b2bb68a38571540647483026804281ee245bd3258f7d0859a8100747d0194e5605cb1b6d9a3cb596fad243ad6a3e0f98a8d1d6cac5aba392457f3e5081f9e415789c09ca4f2695c396777d716987d8865586e45bc24aa5709e76160d3a6485b5a1704311b4c27dd8a0bef970644691958cb1208d97dd842d1111103f5c0452ee5faf0dd801780cba12c1d467e2865dbb59af6b994251728c1721ca90bde927abfa9029836738b42c5b83b3e186d5615dfac49f0eb8c012690ba1d4e60391c4c1998878e5aee5f24adca24b54b9f2005f0bd680a15bdea2dfd8e6da1c5c7cabaf864a070688275a09d6012d80993f0583d49780df3637149a457105851682da097cfc04a63490b16e55a718aa75d294fd05acbfb5d198b1d3f3af320067e72f6c0b33b1a47782faa9bcbf5366b5c8dbb8be0b74b89f56b01a7aae23d524c85ec91b0c96b068daddfac4120dd7404e6e2e92b868e401c804ed9922ebace3b7c064a308e17f2acc5a00f33c6d42991bd93bea82f706ea5e8035419ec0663cb5dbe722940fdec54004112f8d8aaa8a8bbc63fd41f87ede3b7d5bef940f60b3094537b84e8990d3800581b94c90f86641e6f3c02c7bc8cf481893feb6a0ffe989173c920cacc3344d45e40199fe2de8119252006c74eba4786ead2a0fbef2d6bd44001c3bab16dd22b818cc7c40800d4fa703a8d5b361bc70839640a19375b026f577f1186285c189241c101e6fc86f2dd716dc059c412ae401de2750d1d9eaaf4e2c9811dc7e0fc5122932c52ac590e037ed1c7a913841973984cba9e2e05e95183e7f4220d25cca4ae4bcd3c252647e9b4a9df858e85d082913308b4ef328884c40d56ff0abc768c18c60af0bef835e09d331b7f03d13d0c6c38e32d108919d89cb0e3a127c05d4b4306e7eacd9877aab0ca4cf302a5b695de67178f36d6ece4a9afc7a8136b6680e285ac8ed6a9bbb339199cab10ee04dc93d5b2d7df1bf82330f6aa4d13685cd034ec28a552425356c4c1638e744d138e3fa1219ced84061c62f267f8389e2716c5c4d0b73cd501886ba2f569d12c020723b85be2ec39636d4cb82ceb26101747746b4cbe66f9c602eb13852dd58f4b497916a18944953994c6982a6364a90e70cb97b733c6c6b9bc8c09631ee084b8363280a1e28149a55fd46afbebe3a0127d54b9830712ac8279990b1b6f8271dc014b6409055c31ecf50e4c7bb089df186316fc28d33a8564cde037ecb27943a6869a680d25a6bb182f9f37fad730cbe208be24039dd6fdafba4220395e13552759978106c981a369230a7731eb5b3e06798463cd8cb61037bca50dc6017edca659e066c96be0d7e553a6a0b45b26c380215bd3ccc18c317fb1d131c5af73c6ef41835a938c75ef7c1ebcf42546843acd87697e3c349f2f9e526900518bc6d73fee0ca10248b408007a7a24df9ab664f0b40f99717bba90a93541fc13cd3c9297475e68eeaf1ca067158ca99f384cd6012b4840fe0c7f7741c7629b99816e286806a9cdd40cf6db68f145012d43c49bfab595e7d40798b1cee2f7320884de6dc33c6aec9e023a03b2655a30d819a703d9ce3cceeedb0d726afde298d614231a296b16b2fd14330eae4e6a19b9662028c30c8995c9191573b91e4320fce38a83e051475d5c8405071f914f0cebc3d47de1f96deee69501678d78d43612b2bbc92da54c29a5140629065306b5db1193a1455737e6830ba25123ee201a25c4cace1904c46dcc7e0daf34d2f1d79a2468504201f3937d577f5b7242f7798a4fd987b20883e8be9c42b781fadbe76e7708a34728a326a7088a44de2c8a9a9c9a686e9a686e226e1b89b86dc49156a29460a9e4cd25d2caaad47193d213badff9d07de1a2fb309ad0a5d24cd05d51691595a15894294051625160dc845b8c847718091fa1593495a1cd228b95ed4b47141d514769449a1ea5a6cd29126d1ce4386fe6a668db386e34227123126965a554ea5ec0172fbcf9c54aa9eb5ebc800123060b6461f16696173062c460619121a38545464bcb8c1926130d76a1e102f35203c6468d1b0fffbdf94d2e2e3c98be8cf854473c60467caa41e2c1d406b461c39b6dcc1adb1f89c76c19b5ccf864145dfd62fa5b3e99483ac89eaeb2f0890649073e9960fae5855fe24a476266e65ca626a38b0b7471f176619795b142d281349ddd17aed42194a451f66aa5fd82ff692dbd4a413cb088c245b75f4b4174917002ada518ddd28bee4b75030be4102dc351c6a8454dfe0780b8a34729659527a4912863d42247af4e4df3aafc288144d632814a2f4e000bc8050eae2875fff7f77d5f7fa33ac539cc5aecfe172349b052e0ae57bf2ffefca9bdcb448f774522afc69f5e8ce6c197a7daf5b723e956e8a7fce3d334ed2384f063a08c70bb09bb1ff33d5f6046e36fb02e9e8044960c1e7493a7dc9ec914f7ddfbfd98fe3e2191aeeffe8eae3374ff4be20a0cfbe63e4f06e4b8bbbbbbbbbb7b9c394d84dd97c021319d94495c2182599895f19f2796d1cab8efcf6edfb4d48719b40aa19009a20d781274a41122a08c082047788400cda809d1a8fa4310e14ee8ea02296069b0e8eaca8a80096954dd21100144019aa669483ca1b5734929e49a436c2fdb460410e611c23a4530ff266d46d35344c88830d2fd2c9f17071cd2df46683f44edf17ef27ff40081585fd97e476f9afc219a1eef173140e1736bbd38e0100adbe377cfa9c9f67e38a051d0736f07a9477f5c4d363aa86c415ddadcc19c42b80c4f13d4a2a67d2c84cf095465098ed00a9c44166ea069e1cfeeeeeeeeeeeeeeeeeecf46dcf93f67f67e677eef7776f698c0f79f69547b30b3b2c038c511d59034d21126354d7e4e9b72cefbc14a84e1fa4a478f897b43512d995c80008a1248689e73cec830944710d62114c2f6ffae7b985174262c122d805c54c1ab247cf0f5d772470331e98c8efe2a30abc0314bcbf0afd76e3bf8a4e3571755d0dad56f8e02b614412777a454c265134a74b44cdba800093bfda928a5c6900ee109a1f97e9a05e63be57cc49cc348e3fbe288cf03744dfba87946682f64525f9af830c691a649af9726be6700aee42136edd128f9dcbc1a5ce9d8237a4c1c7a2f94223d2cafe082f0f3680adf9b6a32f2d2f843ee85a26ac2080aa28cdb9ff946cccccccccccc39d6dba5f198eff85f157de7e34b8c5a7777777777f7474de6b0b1b191a41f3eee01aa541f7f7ffced5ae4cfdf73d4c71f8edf859d2860aa1cad07275fa48cbbbbbbbbbbbb2f230c623767653a87fe96bd9addfddd25b560790708bbdfc3b5a8695293f1e39ac423c8100aa1970393fe1d353abe1925aa50271c011c05d98820650abeefd3722842c81145c47656c41141312633353dd337138f2822b641d1cde98244175f7bd1699ebeefa33e68f4aa8f1aca3b5c3bf94b1f1448cd9b4caa2805ca5f3ae19cdad4e0a9658cfe04b7315c6a92e4e7d01fc769ff32a71043acdc013f788832f3cfa8f9685410fccba4b1686f889661214ad049a640cb6fd20ff07971c087fe1c4f14681ac4ab50a1524583b811f2854cca4bd31a88241fa4172b06a8938080543ee7cdee2bda07712a230f8d821e937efe1e8d724f878da7dafbbeb94f9977a4135c675a6982aed6c4baf000ad3b63b2f9f0d4e6f5464d46e8e4d3d85403b66e503599f666a3fd636545ebca8aba102d84ae6ed00fb8aeeea15723bd285dba740652d345a1f341bb82a9f47e2c4d936e1d467aaa2779aa3ea8d43c79025243a3d745d1d5495b3563dc12ba67ba508c70b1008edd997778da28d8fb82ffa9ffe674c70ed9a7e036a6b7ebeef3aa0fbabf7486c2ff20f2eb11d4a3000d08f09c73cee905d15c061dadbf241884a9b7eb05915fd93ffa3a7b41348f897fdbeb044e5c319082fbe6beb9efe74af2b918742c5bb6ec8f65c78f5274f5a372765e35d1edc4bd356bdc146d92062a9f39668e398e024c396fa68707bb65a8931109ee9b938edf7fceaedbd42e0dda6285ced5d5efe7ec34f7f922a6bf29d2be666fb6d7b8af3450ed23e907ffedb9d883fff6358a7bedb49d6af421866ede6e333dfaf3d8a95b863aa9c527dc2e8cecf10ab828b5299aa2c97af54ec76614338a198556b341cc7acd7a0746a9494db2f835835146195fb1bb6b8298e51bd43551ccc0ddddddddbda7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7073e95d6e9677efd48a1fd3016613ffdf5cb3df64bb8a3c123d0487f0d5952064d212d68bf6826a3fd1c8947076d9b6be4e487f6935e2b241eec43fb4b4efaebd28b7e18acfeda0848632c8b8e0c28438637cb58cf552e0f62bd74ba0a672d331ccad1ca0d97dee956bbdaa75f0d9b0da956ac3ef282c58082dca5ea984aa552a91a28483673b95c2e974ba552a9542aae83c1c2321b6ad5aa59fc62580c28e8f57abd5e2f168bc562b13cc8d53b2e97cbd572b5cf4b46e89ebb5cee7297bbdcf582a5c514e3c5308e315090ecf57abd5e2c168bc56279d06ca855dd1f5fafd7ebf562b1582c16cb833cc8833ca865c688c6cb09066b1ed969b1ebc7947533d3ebf57abd5eac178bc562b118c631a0209fcd66b3d9ecf57abd5e2f168bc562b15c5e4635467f7af183db2156c1199cb15eafd7ebc53bdc6297f7ebf57abd6a7435d3a67b9960b31fdff76f32c13965ddac59c5afc19984b308e1cc67d4e9be44776abed8d3e605f3548c69a41d4834c6a088b19539f72351284822a9fae10adcc654ef58a364505595ce3bc644a8a8b2c44a1674362229e0c1c1cf098020c5932c76d6451531a6f791efdc3f871ebda858c1f594737a55737f4290fd2a82bf7e52c27f08911c7f78ba804faf4e0e8e7a73f72f4224c7bd22f137cf0bb2dfd30713ffe8de12fe4520747fc85fc48bf817f18aecca78260d3011a80127c21016e146ddcd94b93db845e7ee5e757494ef2a55d0174b78b1121c77f3467fad105d5217393002039f22e79b60b6d1361a71236ee39553b72c6bda0f3e7782d90ffe76fa1ded073f088174a37e2141045a4d7387835bf03261d5db5d80f314cb4c0e5aa363c8d08a99f0f961233c2c6617e5a9495ee7e79f9a279f936f62e2a1cce2e958a523a4881f413320365488215ae842512981dac4a2152e67cfc9935bd5cd392195f3db882965d4a694519b734a29238cd10a50d3b4a9cda951fe388fd0a2bc80164515d0e684110310c626b8bbbbbbbbbbbb7b77c7ecd73134c890ba23e85ba8627e4697eeeeeeeeeeee326a3a5ac68b3172945fb43846334623e20b9954b434fc5fbfcfe889f6e3ff7cc61845222f88d3e8cda561510568c3fdfc0839b33004dcc6744d8e1f4074702b8a4d0c4888fa6b32b6b8c98c56de619e98468d5cfe247efb6e8440d862dffc668470408e0d46fd6b7c6a12b645711350239846efd39ee8b6d7f6e3708bbd387f886335a86952934c17babb13bbfdcff164753dbfdad0ee5f19f9f3c4721aad8cfcc8a41e3a5a850ca1517bd73c26f0e57311c6f818c2e1928f1bbd89b3c238f8eb466794ad304ef74368dd8f5df7e36ec1bdf8e09c9e6b8252e406b49a20eb60e3cb4f40bf7b19c840ff82609e3687fb29e7d4a626b97b557942a118a182d6d9c51557ccccf876010565afc2d01d7193977d7f2239f1fb8388ddefde9096ef3f247a2ffb9b13bf9f48ce694286fd017fa2fbaa83b68e4675071187c08f1e919cce2112ba7e78727e82cbceff049fab422804f6eb886a3c34ad8e643c011951086bd031213a75733b2d6a9ad464fcb657b4528f982c05ada66ec5df9c78da1c79da1c9126124dd1d472744eb7390e65070f9e9a4f24676a4588e44022392f06d07e7e10da4f6d06013f7a43a0f7e2deec5ce608b583620407b47e97604e1c3aeea1146151eef7279c736e10ef95ac11d581423edce6ef6956584714c2efa751a59bf2c43d3c897e3be93cfc254dc84d2f7210d8edb908e72f69a7154f58f1021e96ae0764e4c35af184154f502943d0bd1254a806999b231fe04f0f02fbedc3fcc827ef531542818c280b15794be7fcf6d67bf1614260fba37b5aeabdccdf1cd832fc321f5219749a37aa11b9a807dcc6709f023e04297bd3824fa7200cf682c16031278df2a4581c2884faea3170ed4d8d2fbd1be91494c91c898ca7092dbdb31a05f3a5f7261627eadcf0d541404bef4ceccd8d59a7e26a35b472d5ca575934ca06168b1379727ced27c8f68646944ec5564b4a6b4a4b08d628d3148b137f6cf8da54fceccd4bab53110673c17c4a2e5ffa56b23851a886afcd025afaded91b195ffad6e954943513b236d24868e95bd528ad8bc5913a347ce52a54f6664650a7e46a255bcd5643531ad54284c5913c355fb908b4f40cb437f24bb2d5e29f5694927fe959068b237f1847c4f19567404bcf4ef686e54bcf473a256130de81b5602e5a7a36d2a8183fc3571e012d3d876071a490904e492a4c509aaf2b055afa082c8ea6c3acbde12f951ec8de4c5917547a1f9dd2562e1367be6e0f68e97b581c8d8771c4df9f968e9a83967ea6535aab47a3b62f3d0f7b03bff45fa3baffbec2404bdf9962be3a2dbd0b8ba3fdc4ec4d7fa9f4a5e7c5d1841847fcd297fe05920ea517852b4fb10b2b18563c8cc335b1e169798a5bb55aad1fc6e15aa91f98a736990c2683c9841887d34141211a1fca3cb5c160500683321894e930ce267483ceca535babb56aad5a2b1ec6d97e72f0d0b86ab55a3f8cb3f1d8f003f394482683c9603218e36c3a3544214f8960b0288345192cca741847244483ceca53a2566bd55ab5563c8c23faa9e169794ab45ab55aad1fc611f1e0f881796aca6430194c06a3f1a510e3887466904274c260520693329894e930ce14a2d159796ab65aabd6aab5e2619cf933c343e76ad55ab5b41fc6993cfcfdd0f81acc539a4c068369301aff8513e7448871a60e3b8cf184e85793cb5c2683573bbec75092619f269f0783f7820b5e8c57f2b82634be0ba7955fb59e6bd1f8312d903c19a77392bd4cc6e9d0f82dd418c1c0846ac0606030211adfbbc1d9d85a3f35b616ccd6da5a3f34fe89c666da561b0f8d6d65da56a56db5f1d0f8ff2272916d3a3464265949b6e9d0f837644c0d26240356826930211adfc60cad45d4fa91216a9544add60f8d5f434a178978442bd14ab4e2a1f16158628c2913e97031996cca443a34fe0b920ed2ea401326a4c16030211a9fe35e26939cd0e8a4bfd68fd6b57e687c6e738191746a3a573c73355773a5793c94721dc7a2d1d1ab24249a4c87713618e388ef5593a993d1a9434948609c38273ebec11887936271c48f5cccc4b962b0347183d1f826d20e4d5f7831051df41489e532f165b4811a157d8a9f3a56a3b6272121ed9078b86fe4abfab9fb6ab543538e739d38271cb7f21417a5e37e68fc158d9c6b69e2378d29e8469b6c936d596cb346cddf5dee49ac0e80cb8cbcc5b938178b73b168f456abd5a22f4ebeda1ac1b471f4732e4f712bd39c0d688c31493c9ece53e9446225d1cdef8f4f6235aae4c56fc1425799887efbedd93302928c346a494768946114258905db492c19a037cb105756bc971e205d794857bc9a811e6a2a2dc3793eecc34f9a7f18d65f8ca41d4fed92589e621f9fd91ecb3d9fa104e7a453de7219ce45e37b4bd3699446e3b38fa74846484868941e89c4a2716536a301d6786584fd9951284bd1b17163159dcb8e1ce4ec3c4e93f06b342939fa6babc209460fbfd670dfbf3b9c3beda0022d5a66a99fea02eda0022afdb50475753a644f08531de00bf4209dfd2d31fa22dc88d37eb484e88b4cd19c3f5a62fb22a24d24fad112a42fb29146bf71230e8af8dbefff42692256b3509a8842ab0eba3f3a71a7e932f0b793e8344fda299ee4af17618c3142f8f1618410bac7d6a4e0fab9920e2e1dd898982f0857e1fe3c12e7dceb94483307018a0f54d40453f24a04babbc36d09dd7eed66330cb855515e7553ee5e47827653a1dd5a74162d3485f6b794f66faf57b53595cbf0cfaed354aaaaa928bfd62aca2e6e458a24282341f96b040249751ab5b238b2e2952ba40daaa93c359ab212625166662a2dca2acaecde28a6eaf6eba662b85ed274b8ed28c7beec2916afeb6f5342b72f026e281b6842bb79e0b625c0710bfb8b89f107705c894733747b85b9071768c9493c8022f74a8ea51931d1f1d0b1c34e91dc2b4cdac1297b364bb39f03c29565a7e203b333f12e890044883873073cd0f573ddde103add657729a2073a7e8e3726b1448b6e0ee8425909512e7aa073d7e469997e484547c75dec79073a77cd9dfe589dab51fcfddb8ea7e48fbce53251a8179b523ab5b966ac5170c6dc355d9b8bdd893f819ebbb6ba2b4b962c59b264c992254b962c59c2b3d37946056e37b622e8160a0790d085c2012394eb91694a27a5e28c586430cfc281ee0d1755f68b4aac8c8ce801ca4eeaa1c5d0acbf289485c5abb045a10e1d8201c3ab1e4461570401c59ed0aef3aa1fa15a906252900501adac78b563b445c5cbc7d5848e465eed1505bac24c162444b78d91502da8cad04c36a7cf1062b0975c29b486d66caa2e463483d9a8b38c70a6c819f6607fb01f4321ec0cb202f522b48430862f2736658380af70c901be42280cf015cac047c3f87edf62533f80f80a9128c057b8c40f5f61087a7c0c2b36c52b1fbeba1108f0d599d0c35787020fdf49b12976f1f8ea34d8e1ab43d1e1abef20877ff1fddec4a61868005f9d04395fdd09fad597ece8152c36d52a017ced2904e06b6f0180af8e848e2f4db1a96ee17ced2a6ebeb615387c6d23d87c6da19fbd197d7f2bd954c7525fdb05a8af2dc50d5f9b06399ad4c5a67ac886af5da486afdd040d5f9b0435bd7d3f136153bee332fe38be721266f8ca58d0cc34f77d6529325fb98a18bef214327c651bd07e96c1a61ce6321ed3ec02daac04867e0ec1a67c36bf452d3417d92e68af15687f0436058fb88cc37c5d598dee1e36055f4078d81bed5fbeee0f006ea061a141fb8588f6bbb029182323e9d0363e11e0d57900cf003636a217105e9d05f06af783d76383569e121df1c1ab93005eed7a58898e507f1ebc7ac3e78c8757e70e5eed7470cda87f0e5ebd41276c005e9d395eed2803f9eff0ea0d9f3b02f0ea0c80573b0078d53477a8bf0e55cb53da108e57e78d573b1c5a43d4dfc6ab37fc3be6292d96f2ea4479b5bba16331ea9fc3ab377ac8535acb06afce1abcdad1d043353d44fd7dc7539a0a8757e70c5eed687666bc7ac3619e9240d2e532fe327875c6e0d54ec6ab260944fd3f874d18bc3a3b177c16e3d51bf088a7e4ca655e2d78f586c9f3aaa93b79b5f3ff23f386576767c3ab5d0d0fc6ab373cfab848e6fe2f5ebd6172f1aaa9a3e1d5ce04e70cafceaec5ab9d0c8fc5ab37280703863775100944b234fc4202500c363414e3d41486e8c80c5c2dd18e14294bc3331108442b916ac8e55a1aee4e4db915d81541403167c299589ab983031f574b265b1a6eba726aca8d86a609266baea6eae767696252900501f54eef2c0d37e5b616152f1f17152a4bc39a4a4ba21dd158da0a08e8d47403bac24c16e4c48948bae40f244cbea40fb398b5344da55c492672471e91ac2c806841558666321e96a6a9f419420cf6aa31346669e249245b1ac76265fc7d5b45b121d1da82fa14220b76699ac253530e8eb65322998ef9b3a217f5af29ba3f628189a9c111bd18877fbd81eee7d81bcacd0abb59c81f360908e8358f56d0f5f349e42f7a6d6c53c186a8ef6b46dd06ca5f4539a869e9a28ba31c7bd30f809da20abaf586962e3afe0a0dc0432821890a942851a2448912254a9428519224499224497676767676767676767676769224499224c9cf069cd08ef676febd4b93826efbf3e1eeeebd036fd6eef6e84d3150d8f0631cf0f739f6d5f68b7fc36778e963284d34a1fc3d99f9bdf207ba971d6205b240707b412a113a699da1f025fce5557f2898f99c5db76e82dfdd4eea48d2a1a53b771bc9612344a770f8fd1f8d82f12cd8ec3a93e9bf94b37434aaf37618a536451b3722ad94ba172fcac56091d132c344c3e505a6868d1b7f9aff946b61d402a9071728c948a36246de9ab3eb4c26a7d2f193e65e18e1706218270ee227cc2f1f1795ae72ab55a398e8140e1f7df6c69d73712e29a5fc5eca1929c34b29a58ce1a5c491de4b29a53cbd943732e6a59452b6f052da481b2fa594b2c64b9992ff524a296fbc9428e9f2524a2969bc9437489897524af9f252e6902d2fa59452c64b698334bd9452ca192f650d92e5a59452722f250df2d98994526a2f6ba494524a1c925912c64b29a59c414a29658f46915ebefc8f464a295f90b27b291f4af92c241da40b30c8e0dcd8a45037e4b0a1061a6a70cc40f3bdf0bd3023438618643e185e70218677fa8711d382cc939d642f6c8c6a6c36b61adbd63d7763db361b5b8d56c965a3b1e291ab5f817971a1416a7142866c9131323931e3a7a5c5b1486ec52357ab8d9de8a24cdbe08bc6174c88f3628860c080012569b6065bc2985a1735d825d9adfcacc02409899123389c7ce532d1b537cea329e9214fa75c266b2273e2b227b4f4b0f4d089c5813a327c854968e92192bd89e14b0f559d82ab155cad206b058f506994cc168b03796cbe3a17437b739ad229d86a09b5b2686901d4a8b76271e04fea6b9a76a8c4acd94982dc114900000293160000281010870322812ccaf350b70714000f6988406c5a349607a391284b71208410430400000001001000630064ec08009c97f867bd67fcb8afcf2ff66afd322deebe4f25f6bdde44dc7eaf67d465339db6b2040345e26573d436295ce1416a1b131287a426f3ed3f9b752b1eea6752d6933374976730fada0fa724ee278a7ecaffe7d6bc6911cfd53afd623a141d9432eff927cf212678b91e58399f5ec73a15de704b4744ad98cdfde47ea55954568db5fcf85a8d048ea6aa983d9a8d3893a1fccf29baf956312a5f1471e1bf2bcc608b0085e980730aa150737261ba9e95539167dd746b758a821c96fdb3e8f4ae58a9493e8e743ae5bbdd4a4d41c35b24be148d8fbff5b72e051c296a6076a3a540b1f5cfff244bdd4c76ec0e5075a51898a5e8a4a1bbf8a1bfab5240a2da81be3b526a88fd63434340e232fcb0b206943ca9a17b2c297746177eebef9a143052edc06c4b0ad4701496abc6ebfffb5f920a70ca002de88ecc3946aa7f80ffdfd019d036bbd727ecf8200aed87667cd421b1c9ad7eb29f1b665c577689cb6b72945672854662eb62a59133ea96a06a2950cc4ca7cb846551fae94541c384feab08a7d3e4d5565d95bcf590adaf089876f741bffb90a4f365362b9fca2b1ba79ac91d37e0cc8d5eb204eb344d6261e4c778bfd0867a32d24d9099f42752adb54804208401e71a5ed2044c1ab40553ce7a24194e0a24778be5a60a197130a6eb6d4b113b106d8541915f31a6d3316d561e7e3c7c149305b64ceba5bf40ea690de4c79f16de39cf6db304ffe725a64fa101de82eea21407f0f3f9b7a0085d085a991bb215c16c02a9792be5c53d884d6479719d13277daa649af298ea2f98391897e7fd273f00e2798f30e8bf450cfdfccf95f301e384e2d4dc606284736380de836ed7786cd5c7a5ea05c8cd30b3a7cbb052dc32e6f21b2c26635c6f80cf14637da411150346cf30017d0a8c09d4e6a473c6b8bab9e8f7d48c63f97763eb98e0d202bbd1af9fb9a8040df0630beb78f74a0be167727ed79cdeef7f3ac43bccd99de9ad17d004baf375a32161ad00ada99c094b97158aefe52a033a2077ffdbd873fd470d57e3ebc996845732eb35009f36e69299b25ded7dc26cb9e8654d0fa9ae4bd4b682c901da084a1ace9d8be8b8b1e6a8e2704dc0fab0dcf12d40a65720f6e6c8f21b88baefc05be4dc81a3c5831bceae53d7c06fb91bf76f803fc08e143c6ea3bb71f6907a873fd3901cb55728c405ced6f29428a40562c951286228b3a81faa54e6263c11c4792bad16ddfd4dc941add16a222719bc1a761a64837599d863edb2d83a46eec7da60de8d57a6a199c38877df5b6480f7e60ccfd5906a0782c6763b597ab376946b8506e09ef803d82d2201c8de4ee280bc63d080357840f00ba72438fdc8ef75d0e1239ebbc4d0c4569f0fcac5ed4ee490b898a2c9bf77d8f746480923a6058e19b83487efc067fd6dac1dd856d308aefd473444dfc6c2c7e0e5b6c8a927bb6c810dabfb48c1a4981b753277a8e805e7f5f69684ec2901f4e11241681cbd42759ebe3e6bf72cc2ff691f7528dac7bf91ac7f644371af8c0dcf06499aa51b4447b0dc1f4501f281f30aa379bf980f64f2b8038612451cef80c99a7243499ff3673e0dfa8bd0fc460f490b6a581acc28780b451bb19800abe6f15fcce1d8c298b8d5e7047332684a12d4ab8d51d66ed1c8c4378707b45ace6a4814136791d910d50f767adb029be359dc6292f3f7f8f1d1cef1644d9cda2c801ec675deb9c8bb285127f8b40a21bd1005fdbd8163192e200aa549ecc862420892ec0cd0df4fd9a4dc8126df90904f21eb7105b7361d99119a5d9225605781b099132fff5006890e39bd3ee3199bbf8343d25c7612fcec1853d1dda967ee927dedd5d1360434ae515798d0fc4276b4b9ac06399be057c43b551a9095b5ed3a02e92e31533d6832759e479f9d075c0f4dd683fba193d95bbe8c45f7520b46d4985e06119b89dda5a9a40efa2f78b7d4ca1281eec480ee6e14e5be5032b909543090e911ae4ad40fed928d4c4bacd365a49769114887f4b862b83692d4db9b8f0e2d8d3d3571c480fd02dd7b08d1e3deeaf334a46158d12f855c8584530b3d2d6e9beed98eb8235308c2e99c2838e446e755ac7d5fde8e85546679e638aa11c9302fc2d8bb3d88593582402632ccc643e711e118c9b4c13f43e61671533a44fdc099b6115d219ec124a9ae4840713570499ea21192a5beb2319f9dc25847dec0d57c000cfc65b9606c4469416ca45241ccc872416ce4f28958036ef5f65c546fa05b46bd3a7ef11d25ffd705ddff7b41e7fb5ed27f3f2ee8bfcf255a39748b6ff0f45aaeb70f38bf2d8f0a41c4fc38d17dc2e21379a1968f2ac6e3430089aa5a32c1a0a03f9b3a4a1778158f69240e58935893828059139f3738a61b1afbe360c3e6eb52160f3c75d82583fd1027d0376b46733116d31ab3bf2610f61701e6bc0803e100274b2633bbf238b3e607b8e93748a771f3267e13754478ecfc711c5b926ab8150716041ccd854242e1f8d971f3841e3fbb838f75942d6af7013acaa54d272d95632800f792d2105d09639d1f2b6483e9b01acce9cd040d3b3640a9313d023d43a2b0fa679bf4599ed8685efd7e2d91ca668e96794f390350c8dd02419b66d56b719fc6425eded7ecd1fdf6ec5910fd2c706817da51fd547bc3be2274f97b2662e36101714fed1213b88c606551a0a8acd90a053ccce480819a5884f5fb8a9d3888da4c88e0f73e8c7a0301e2c90196e5b3a843e7a572bb47c12ff269aa50e9a9e5ad9c8a4b63a5f29ec909038336104898a084a56914179b090e2d6d32e7a7587c62a9b778234cd40c27b5ea43024208e526e89864cd656f20297ac5a02da12bd6163ae4ece23aa9e3b91f8965d7dd1ca534168641d0ca721136d13ad1f9891390a1dae45d5f097054b3479a5bfc4a427a08ab6bfd7540129d6d9ada7daaef0b2d4d451d2772442abb81ff216864f080db0911199750c3016b82feec575aa18bbf8cd873c99293f21e43c2641a56cda561696a3a1666a561ad26b54b1a45eda1ea4a056dac89f4ac9a4bc392699aac40138774f9b3c8fa2e8db8cc6d107faeaff4c6e557278c71175dc0568df33405450fa9950f879b0377d2d86017a21b38e4fa8da50a88732e9c951cad7c5c986efd1df649a0a7d4c66df56dbd3e69337ef4d3918e32844bbfcc7b48a13cb014cfb60c7401732e9631c33aa79abd05b2874608830f309b4b3bdca92efa0e2d749d57da48ef8f7688f718d80eb4c883e96d4dd06d61d93ce7989959b7689ce3574bbc2f84b30d5be486f764a5125d6119fce71c9b4cdbe5c0f5a316ce0732a98d2dcc81796943b3cca16cfc3355cc6cd376c0f9570bfa5304dc8d59e7c0fd6ca38f1d95a922a9e1997ce775989b8802c673a6a0e050b9c7f8e70ea715f71af28cce67461acd009edce42a5059dbba58c2c9b88985b095742204b278b38d1221a37254627811cc20b0c30a07fa58e2768b95c9e2b6bf567196d5cab471b13eb6b8656dcfbca0bfa9a8ec34348304ac53f6ebd150c6e4bc6b4728ebe5404a5af3eec99db2637474dae173e7c729dfc521ba0e3a2f37c44a6897071a10a138cfa625fef30843f9a52fa68127f2255f22462924b655715be64f261c31e0e6014c2fc02f37677671a35d71fd401c65432ac7c03d33a062a3de6190476f43e44b5848b2c17a050d650d8119bfaeccf40e6d0a3ee5481c58718fd51cf4c30b28a11c42f66fc79c6c0d7ac5e8cecd0a2e83a15ef69d8fcd77344054275e93509687aa3c030f2eedc05d2648595eb7f0f90b18a1b36196c5bc0b30e1260f0b3900826eb56b323deb5e704ea63baebb0115ee1ea59fcc80b73844d094f0cf7047ab4f0332f56e8e208065afe7fe632eae2dc8d90b52c685f8cd82cc51378f1af483c4772ab3e9bdc600ff5cd05391d96827923e316b223abf67ad856feb5a2e68d7f0270d0da7947c21954c53cf36b15708ef587deb3e1961aec099b840d7d760dcd1feb6d06d2566d6ae8e5dba50e675964597055a95d05d22ddc3318fa6dd7111a7e646f5e8e52483b360ffece77fc9c0b39ff3beef538f6f00839ae3cf6d9a6cb2be6d0b934bb8a26bfec45cd7bbad6374915658cd9f98eb7ab775dc2828d2005b819fc613213b55dc37c0e457fd52859514af1d3586026e81dfa513c56ae4e1efd0c12df0bb74a2582d280e59b02b996e530fb874eac52339bc32844f82e3c652dfb297e782ddaf80b30dd243ea353a1a70a51f181f96d59664949ae819f28a01ee9d03c57d2ada5cd91fdb80eb404e8297f38196ddebfce5cd969b66b810ef864188b83d8841c108070e5e26bed94a0be52bcfa55f47ed9ec7be9ec9947b14712f7f78570786c2e8e935e7906dfe6715fa08b0d022dcbcddeb0239cfb4a766cf5279884a8c8f3c2e68a63672c57f14faa4401b01bf5f3a11aadc5f9208826e86d5f716ca828330e4e9c778b8eda852f2a9f09441727355ee084246933f7bf7efb8da572fdfc2d5201d6992212a616ec498649f08267690bfb6d4e79eee80ae5ff9a50d3a6a06b20fba31a1d5025ce28e6313ba86591830df661cf0d4a407d4ecd314cf070c206361f304f66dff2ac25b40e380f0f57d4e86934f66743c2187d60dc34a93b07ec93e1dea1070032681aaa13a28bedba481b4448911a69af418ba5baa089983b5e80c1bf822b5b6d92050a2e8f46f8d1acf96e3c46c36ba638d866e42f3517b72a027c45a4a30d21aa1ef79fbc228c20ebab413f3b89ef1793f97a5ca85ce9945832bccb8eaebf28ef0ce8f28075e5e7f93156e8d9e95f6f2e584f67feefb02a0aaa7c39d6be586581fb7114cb04f37d31e78c521504cd08bd02fcf7e7349cbbade47e34e4e92039e1d037a24c1f96c663d64cbd0d98d6526c2035895cff0386ee19cc65f740f02b4d9ae0e86458f8a6b06ea41aebddcd8643485bc8a7da64f406ebfd61816ae6b9c065f4a7d2d53d918cad7037a3645c3179565a833bebdba4c7f303b8b144c5888ce313c85c07d965b0bfc56375138074187a2bbc0291f40fe714265b3006d21f79aee0f251d790b7d54bec15233e544a6233943baca15656e15716ae0f1f38d89a4957d35b37dba06dad94684ef0f2af3ac1f4ec6123d83db48256fac6010ea8836b69d5b022357e8056c8c213ac4a759e8cf9cc7680731de0824dfb1b2846b5be1dd573bbca0b31a8403d475f7fcb4939ef1c48bf9a33f78895d92bba15bd82b954bd5b153ccac7da81d0d91c7fcd8766f98da96e50d3605b3f64eb3f75b8efedc2f5fcdd7d905e00c51132066a2a8f4fd8b5b3a73b49349504586cc8089ac17baa5b4761d923f58a51b20a3f10af2064b6a354d45a8e88a13c3851b6c0b7f3ca3879aa56a9c4e2fdffcb7188b6910b0666a3c01c85ac960bebffc66916e5a34df83e171a46063541a9db0e5521ab076c0e48b60ad16a13b90934fa9c718990d37c889b83bdd8c1a3fe39d03688bb62f5a875d1356fd6ec96f7e83181b4c0dcee9d75b8f2c0db0df167bffdec765aa382d38b87465a9b66717593aa2325c77a7957a10818348284162be0cac4a5573a7a320b129e290e82b8c84b83901920d704979651999fde1d851704f83590813cad334ac9f6e6cf1d1b33a9dc6bdfbc46013031a31cd65611602c4577ffe254d278606fde836e30904b6ea76f4de1f4b4286c5c44ef39eb0cc4c2cb0f76bc05a6ba1f1c2d4d434951b186252d3b43a687c87c413b4a5082f24ff9d4899fef667fcb90162dcff68aa3bbb713963e2fb62fd3b9c642ccddf374cb5279a5d27cb5c84658f3a8ca662d60de8a68d01c961f18829bdf89acd14c16c273e09e0cf9b43cc64933dba0c6289886e815cae26c3eda7da8b17dd8dff73040c108e2928ecfaa49471f5d36f7d92a7c2af6c12c371dce54ecb39111f1c377f0f2cc3c2d1d90dc0ccf291ec091a8ecb2232abc29888f798864542befa41a7ba7038ba28360274cd360dd2228a8f063b8a1a9e6ec625344901715e2c45edc22f89708e443e04b6be2370149a1705bc3eec20a592ca25d39ddefe1e88fb926444ece00024952240d789e8c5a448e3ec30120aac783dee1dedf5834bea898f82e3b8e58cf48cc9ed354394ec90082efbb1fc3f174f57591b2a9a1bbe8a12bf97ee13c5b7e9a63c3e0a9db2d7991b5698c5bc93293e1c9ed68488341f6daef684b38b549483891cf391feb36a5bdca467adf90a115ef1d8dd7738f573db0d93c1556930afebf197b6ed6974b5100c165de4dd9f966b4c5e9e31cbced41b6bba188757e01e0c354f42a9b23e31aa5222722fcea7ba5ecd6a63b05fbe026cbd8c201ab3bf009d18d7c9ab4e758d050b87109c8c4c2ff6f2885e243470717b7ed3e52121ddaec10c1f7a5a611cad184185838fe3e3a896a8011d7c6438946a899a83530b9babcb9c29638582aeb53f1b743d709fde074666b3b391a75f7eb6a2aa47517f3c59f0b3428faae673ff693bbe2ae9cedb98d1ffb6d954dd1a7240d510b03a0df7e4853dfb9833c77fba4c238b9855276da04977582e679ae2d8f07ccb5f7453e2cb1919bca2823d05a6967fb22e67505e5031eaffe8f81b97e2c8e19ed657aa233cc20cc6d9310b5dc47dcea5b7102d1595a516c02a52518f04f2548d82f451d6f1ca4dcf472859dea19b93473a1a8b851bd7771f9e808075ed5046218c2dd72b549ef5a0243a31f77f44eb34b4544e6e14a1ee29f5658be13be37062e3462b97e38cbcf72781de228ce52f8509d9ed60e26ec9e3d4ac1085c367ab8eb4c049c26e2a07011087c73310c3bf27479e1ee2d9fc9a4447ad8b9c4a45895eab8ae7f8f19040e2cde2751d9fc92830ce57c34a92f74540017491659ca8930f92f145b748cb6f6d94f5748d4e97ff3b44620b4b8f4aee410922dc326799f4e63d9df983671b65e3a0ce431480d35e400456814262bf61cf99007cc1b9868ca00354a0da2e9e81469f7d2ba2d55d843a670a7ba7b49e73472d875373d9b972e94cbb030e2f54aa35ad649f8f283df9fd6f23e294bc0174290baa09c02925fe46d01380d7288134890f23ae9525346bfa7fa6f99866444809c38301733841df5896959678de1ae3f44d47004d320994727ef045070f3c044424e35d4a2fd7b849f66794c1dee9ce04655a82f8c24ef4ec4ab62c08cc6925c80badf2eeac2ceb45f06ef983a18d8034ba1dc724672c7af4587e75545337023881ca735585861dec978d219d695b75c271bcc402691b9b4824936eb5d35f7a0b87b3c67bf92a8cd1dbe63e23930b30359f1b6c7bf468105cb9d83bda0f066bdf4f8df39bd8789e03a0c9d720ec28892c7effb828d11ca08516c2dac8fc85f821bce32c6d5418fec0d54a835bebbcc02e6bf589d39bf801ace6d461e46ff203a574f3a85ef475b6e15232fab39f9ba3d20d3d4b78af4abba7c180b8d3b39c4ff3283363e060ecdc16a4f130795d3c39295157ef315ed0a04a1d0b4882be861cd9d00eb8f6df74cd8078d5e41ce5994ea7604a6c0105392b9d780cc91a197a605317041caa1e0a2fd062402c9d0b478107aed0e737f3b817b64842662e2c1fe5f3d39b8d425a84d4009c9caf3f4ecb3d179e2d06d121f1cf7e71bf5e3c40e7d70fb9d8a634b35a6cad820d3355ed779f4b19d7b7376cbf68ad628b2163770de20617c7f0b1691894b4be79e8c7c379fbddb6b9a910e8f742d74d8b7d1b21117506821176f0389111a9fe595537fd826228607002b362c0c2575b1129fdca3b20d416765812839a1e1aed5844e2c5ad6240b09feb9e7eb3221f8b7b5708d39229070f7f5f0d452f5b6a12e753a3145ab4f508c1f41039c4173c18b39cd831348499a2d30567347810f05653522514bc8f757a35038ff67164f1dc962ebf141589515e4831f663d628f22536edd56e4f122ec880e3a2613728a7ed7f01de21283626bae357f8f8b4a415ba8f6345a788c3bd7842da5dc53639d3acea5501a989d89dfcc09eac952aa4c7b995d5f3fe2fb1762cd207884f4b1a14ca6cfc8d2cc40ea3fbd9d5d143d29a082886dee2c30c39c785b2e08500f31be99232009226e02b88112c28f417d7b0c2e17d0a81f3e2ebf13d1ab451b2fdf2c322bac41b6388bc822f4c83ac4572e67dd770dce56bbf7e2c3ac5c1570699a039eef63ceb31bfe0deffe5679af4741b39e4433c261545d6c940e8c21412baa0f86a7f4d86fb7593e81ebea99d4516c49b9bc6e47d7d91cd126abd5ee4276bd813c402d20c07e5e5d68674afc9ae8e79865787a97bb93668614fc4e4211b8b734fd6a99cdff659e612f29f370208dd01607e7de760c5dceadeb8d00d0d1b86420111d78884c03fcee9ce8f09797da8674ce504e1f9bdea79b65647e4fa3a6ffe4600351db14b426b40ad1a17d483e1ab35be02d23ab58eec7f1aa6f47bdc90de2bb9d0f9f316fdf676800d2a077f6c8cbe6129f02710797ec9e90eb73bac7ba2792d8142d40174f362fe6a8b7e72884e2f60ad01ae627f9340809695d250eae4fc6fb0e2518a5165899983f0f234483317fe8d5abfc361d18ba83b064d89261e5a9f85d88f16bda043a2d8ac7402330a4cc0652f95a6bd2580e12aa1d225aa421005cbadd6938f935a0f282077e2db8cc133a2ea00fe31e530d4cc0731d3497b18dc0a05b26221e53c66e984ce1687c8d820505ad309a698d82a0bbae923067a3958d2970710fa39c00dc9ab94cc1f20f4f32f089de90b4b2f6ce74f5c10b4191708facc7541dfb7e7554aa70f50bae99785dea5cccfb820e833a70afaef6f2a74a72f2abda6fa2f0bc8ea355795d541753387e761f5cbb0fa076ff08bdd08c183ae6ebdd749733b46cb600383b4f51defa5a1b7f0cd65d57d9d526c0c2fbe9ad2c6d2f8bdba3b521f7e2097f678d44515ceb0518447e71363047477b12ba1a7fd1edb9cf05878273a88829e6eec1aa2b085f8464015721179ec4ec348d0831673a33d995a9e375b772b857379e6a5ecf71d6a21527c0e6eb0752ccc1e81e08ad0da2ae1ab8d4c608746ee9b6615dd204617be852391359eddcf627625d68974abd896f7afa1bb7224025684dd0d1482917207bdddc855ce4e5eac9601145684f12824924157f309583d0ea060fdfe0edbeea111684d9ddfc6d97b54f4587b9a57d52389a9a04a579242ba6a426560a92851de30cefc6926ae2047963ed1de0e01f0673b9f9dc140364307daa2774c7f5508d2b94005d5475b0cde542c00a6ad7a4fab12c6bd1c02c149f0a739f23c66725f2ff6b2e9f486526c4439249c414174dabd807ec8cecb16c83e4307c1c72e6e1db82c15853151e1ce7defd62563a8da59f2ec333f4fa7970a0bbad05c98a6b3b401f0aaa6db83c58bf933a880ccffb554817e5aa8467889b7ae598fea232e81a9169954c1ad79ccb2e820886c6a6cf4fcf305c1658ddac6379f80b68a87e5c3432a993b2072afd54651ca44ead745af6383e6479a68b7b24f83784ae013f13d874e6b77c5549b3841d026cb1d78af20fdefade6d8f43c9edcb53bf2ca70b6f6358fea531769aed84f1b95696d708e9a59b509d25ad9792ea8b073fea762aaac6dc1c1ff72d4506f0de41aa16a185ceda5f48d19424b94896eaf6fae11adfc39e7159c688141edc6864f6cc537c76daf8e602eba54152f9b048f041ff486a1587392ab97c0b37030d8abf0d4ceb7fe6fc0dc6bdcd8b8dff3ce7564a873dc7671584311f1f775c6423524658f264acb64bb73ba12ec1c09441d3f309cb9d832663c1de50b7022a4a3483f94d52db2804a423596fdfb604dcb64853bc917c237fa62e70d0a5818c07a4ff4449c5edaf8cf8a26e1f885422109990c20be23a1fa895c38258758805f7928725d3c4d69f7bc5b3f65a2669de1da996b01ad28716f8ff7eacaa4d673e320fe3626ddbe9bb5a086476043a730301521591dbc19c96e8f91f88a3c92467058be4479bc3050d89f30e89ea4aa7911dd0bd4e720f2d38543be2e1c823c14e6d317d832db1496ea43b58efac1194901efb914a662a873614b61db8c28fc397a13a4e948fc0b2ed64a45662cc689197a3b33474eaaab6efffbf5838cc8b879c914536f6c50aa42c01805a20bcf0fb9e9ac96f7d21b8a38b64098b874fb7db93a3a05501601ab4cb6b072fb62c8d5c317cb435eca0c00cfba1c6bd4b92ad31e051d71acb8d664146362a10063fd3f3e68b79357a3cfc67e4da78e995c38d91205aecc33a8796982394311be1fee38a97380b0a21f4d583d600962ce244fa83693bca154a89c6ba61031dab65104c1c01c891c7db96e7b77488edf703d1ae241aa8c1817777326c83e6be99629bc1df8235d881a3f1088855640add9df7550005aa94e57470c36ed749e92873fed8b75d9cff309dfe2e82a3f196cb69c9d128ec95f4dc225e8c467150ac12c5fac8b5b0a13fec98f28146cddd7a3a8a3412da8a81dbe600571d2870b90059b90cdec9ee13d1ec93d382d22c839cc2ce30755a4abbdeb90da50e8b9624f6fde99e33143e4795c59de84bc41b7eeb1bb26b1ad06761cab308e06976c00da1ad157ea9c58efc3e1737f98a0ba1ebcba7b266c61bf7428b44294349d2e73544f14b4ff478a681a50263db81c476ad9f045aa016ba62b569ba8dec23e56e03e39d6e555a8a6aa1ad218aed8ececebc98ac47ec1176d6299491028d1b1618c141d41f6d049e4e667d8a9a943b409652dc237e2d6bd01bc67648ec1a5c89d3aad225b34578bc00694b05ba839f9f82ac69dc64987bfc34ee16545e9283e69cf1ecdd52a7b505bfbd8ad85bc6b5956839065c8f90094020112cfc017cc577e7506748b8a389f1f1ef77082028f1d4082b00fd8808c398c553a6f7868e3e069c4a923c8d3e3c62aa894b5bc3d2dc93d2057e0417f4f83d7329806caf74e3178afff69105d2da188b7ae7753fdd6f538e84831616501b843f8160ad909438ba2fcc1f3250719222635788065939ab4db64ede759c9c082a1f2d63b11355df7f0f515466a45d2083428959f05a8fc83327f43fe60b8c2f2d3d9c8e59cbf9c4b30ed923f6e73fc72d72d4965cf57f745f9ea613a1e894eb788660367c00a6e83ae313165d37704ddffe83c64d5329a09384ba24fb96861106af0c780a18f9c619188d2c00b6f5c61ff7f71554f6e97624dc72301e5e2830a22d08298ad280cf278d3902ddb668c71b1dd4b659e418a59aab1a1209f62193730fa7c287531a9ef6a2c91b3c75630144efc14f69d579e397128a8a6e8c934c10015feeab555e6096466f4143f1a2f0a1db1e798e054ac1797a7369772d65516f622fe8b10a1bcfc0ab92a766ffc094337fd50d08406513e7cbeb9f7a6fe3713500636a4206fd10cf1121cd26d0354007752cb6994a0dbb9b78ca5afd6ab6aeae62a8ce245c398f44badd4bc00212f1f5afa3a91d441f287a5077d2b8defdb3a72fc7d182911827e49271bef95fcccf20d0deaec1ea691fa2a4b8bdebab10c2488b9190628552f34a0966c3066493923fdb18d53742502d0dbcf4cf768dc173065651bf96a777c1de86f9a0a46d86a61c2e5ceb10375d5315474a0283e60aac633cc6948b98a6781caa0cdd94256a2a95e1a0a2af1bcedc878ce15637fd37795acc81b476016b635aa4574475b70c5068799f077b9f4092e7776cd319753462ec248656c24bca34fe75056b54d9b78655086e4b9bf0ce8ffd04aa27972ab7145398a6dd399a2ff3451a94bdaed499d3999055ad5e814355887a1aa884abbdb9f6256e3758ced1caf1df3e777c1e773cad34c0870fbd4c8a7b8cc0df65d14268cbf960c462a38a81339bff1c63934eac839762aef34022c8772f67268d457e631e6f380039b1255edde957635506cb90f305c999a00f81cbba61eafcdbbd355ea313e187e436768436ddf8000d6b583ee22be3fd5c8a9070b488939242a9b1dd8c829151904103d3a45701810558f8d7696c1beebf2f62105eda85a47ea1ea41ee38d14112e0456fccf961985d8ba7f9a5c4123ac30bdba889a034287a804a7dd0dd078671bc1cb40662a4a646798dd467380799cdfbf4b03a78aefee23d434a1dfa62315f12cba5d1dfe9e3bd5cd84f3789a3a2267345b300c3d9f0c0568a7e5f74f28f90c15ce8e23b7eaddf4a0ae22d306605dea7f01b5a05dd82d08d69d24af43d63c89480737138e83756ddfa949e795aead86fc02ebac52439d86c366d4a261bed684c0f94ff4c7edf6f7c715348e768e51e81987bdb3e6398a694f61569063c0e5d4b403385aaea1f12be45a65ea41ca12597c6e4976db33d04c49e4e5f089ca1c94258b1c4cc0ea26614099ac0b186eeefa2e8c220977e55f1a5f5813828fc245377d1eb91372720bf08e5e73569fc3254a3e60de0ca493a82cd2187b7fd6c180eba493e5bf8a42e236248679f8fcfe95162e2b303e0ed0b33e9d5fb3650741bf7817f167c6e20cb74274b820bf251a77b74254f5d95f6ea120e72915a2a72b83d5d8a442fc4d214b2d46bd429ec0993626887d41440b1e3f54abd67d5efb47ecc0f41ef14494d5fa73017e3fb568bd534c4bfebed50a3c4a8b1b2fbd8da97602150296b60b1b497acae81a5b74ccf8047c72ab236d8e1c1348e255a1cc02dda55eaea10ae7048b46d8c558170d59a995e5f87a38b71efdced21f510b6ed87d90fdf0f840632e029352d2d94f5bc4aa90e14c813ad480d9eefc4486008511c816036eecab2fd6a769f988dbd97735a07dc439df40decc1648e228c7fdb9b3daafe4bb739bacddef19934f1e568ad258665a021017446d4e3399890d60a988b60ce46ed94e62c450730598aac47f15d52be3ce77b3749c34ce021342ef81273a1955c41acd5a5443131a18492fd1ff0762739a2ea3dce9d632445a79257de2b23904c8d448098d22c2b50369822d443a938c57cbb170419f63699950a739a6c4e345d148c12da9d59ffd08dde072b9d11ddf2385ffa522ad7aac68900503b55681010b9b19c23e2b98313b38e91b382f8c421439919cec059653dc85aa4259ee9cdcc50d0b43854e8a27b2ab343fd1578f91da6b7c7bcfc87712026d18f4e14470ecf6daabc5e49364504dc9768d7762fb72100784736ccb9181cf66d29fc9605fae0ddee7277bf972ccfac1741ac4e97b5a554b9de3ca3028ff1e753aa3602046ebea01c3163dcef92a27ff8753c6f3f862964e342c349a4976c4731ec595be7d03ed20addbba14b4f5ceff96371af400dfac4d8549a50001c9466b9edce8cd11a668f83019c1b6613363f031c1c15641f35055be4067840873d555c92db878374492c0b041f0ef5cbf1024407a394c19cc341c2be32b38ea605933addde716aaa4e4ff4540b76258085bba20db151ce11aa5a9414c2e5db70c4861ec8aaaf28924564a1c195bb48d5fb4440d591463a9a6a085a951287e5279f7282dc9d5d578d9a87ec0b4efb6bda45e55f42c4cf4e4a2be6c81cceea7a272db3615a0a2b6eade96f6a763472f74138ee226ae66b526f994680f1c122bf3314b8290e19c95be58e92b370d951f944503c69e31c0cfa713c51d6092b983fc705f2761d99759e16d95f6ae92445d8915390184e703b4aa36156e2b16f40572670f7a79a8f8948408fff1f86d5d212fb72534c315cb9e1612c0afd9df9d0146f612a9ac01f9d725e46121b4df22342bdf7a2a60795c0851d7e0636a951568805d87e02847cec77a1bb4f17f7137b5415b6edd91d84bab4db260a6596403afb6cf44c24f7e7ff1f7f6f8793aa8b7ccbde7fd4b9c7dece32b9877116243d8a3fec6e7023f29efc278f8c200687c09fbb6d8ba8f92954435847e1d83d722b8c711e3d57d66b460730ac5e4ccfec33a44ee185840e03d4cc338032ad9694d5b443249049980987640ecab768e47de92cace4830d186edc19d951701977eedee56fb610b85efc6f6a578d822e863a3309a84874b2e5f6ba74a8b14ac6f642cab6ca985367b3f7ff44633ccf6a1fd9f934e5c8e933b3dbdfe069d57b614de0548ce8573f571454d08202c58b532c2016fc8ed2992d58f58138947b87004a9de4af61284bfce5ed25a69c02802ca7f42280ebc7df8861eca3567a0366e1f08dd5c4add8cddf0cb298d631023ec6fe28234b035411054038747277ede7a8fc6d3d183e20d20c42d8a0e27eab284b81a0f7c7ec49e80166434d39b42ba9f35f61ffb02cda2bca3b96c38197b722acdbc8ff9507269ccaec507f1441150fe27e7000047c51e1db7985b29806bf256fdd5c2c5d05e8f6019516e3e8370c4715b1cb9e998206c5a5efe29193d4bb3e14a5385315ad880664b47a18d5428388a1df7ac8c69a58ffe1f5bba9feec831784eab9d0af80c42d944f7af308bdc08890e9f2566c76b7d77dda4f603007002f403993a1bb1bb9f1047338bed713459881f3fef5e46542617a27b8b4d0bd0356288286386570c3ab2aacf120ff754f8dd5700b52125a70bcd2ea454b63a8601af863b4e4b16f9494a13b3db36b19f14afb4f48c3a654b94d6b8cb794c99ea6d7aaa7ecc362135352e85704dd06d6605c12f746e0b0ed4d33c72024f93f56360058dd31c691ef3970923bcbfd0d4a7febcaf5553057e342fe8009430b4cea4980b3ccb09da5e28244360cbc50db8924475ffa5907b84ec80d8f59cb6f5d886d6106d758ae3f1e1075f2f8a01a3d3c7475019d91260583b678d0b7e82c994dd1c3b10dce7e2e8c5a57aabdb1c447404233efc8823635f2230603bc2507a6215894b0fedc7ef596d4eb9bf91d8f75601ced35a05118a2e074c33e47cac11255c27f2bd1894a8bd48ff77ccf7b0f3794bd62d4dee8ac5ffe419d03a26085f2842b77d743bada68885811cbe52387f4ee5cf8bc9abd084c3d0d47aaec68b196641f4ae212b8cfe4740c6f89411fdd39f28cd9383a16e1159f75447bd54e39a9db6244e380ed4956b281861fe6f1e276ea9022efdc84ed14f82392dd1def735a33cdcf399042e2c64e6e60b3b457e12ccfc0ad103b1ec1faff715331b64984c756abf5c60fa794b323a5a7a2a60ac9df679db751a6b695ecabf4344f79a3a54d1db16e6c29eb340113cf066bf82965dd1635b47784f96b7ad4d701c92755a523b3c449f1fb7e818f2653a6d30b5a5d10a7b5cab347bcb1c7765c8069f85bc8ffac285069a47f00b0228c3878da3819df1b0f80f912eb6c83fac4eb35a5ee7dbb10eb706b4c233d39a12f9a4e5eb90fab295df58149e0cff777708f1a73a355d1d77008f25f5cf2e7aa078fd2e0bb98db028b140b588af6db58cb82facd01653becf4dc1a2345508894b63af99b20817b1624757c2d5cac86638bc62ba4f2e5ac7dc83796b2e01859f815dadca7609798d3903028f40c7dd0679db2c033e235a61aed3bc6516a08aaa795a4535c44592bbe613d06c108160257715e5cc6902ccc148a32c6c3091f71109e7ca12023ff20a3ba31027c235681960294d02e76591d3262067a38056d74a91a6dd2dd421750ce91a8a7d284e0b87bf8f4b347a998888e28613ff8c4e2b68c9728812924ee805c3ae095b4502b0ed6f4d823cb0377f1f56a8814f1070fa2fb36455560eca1a24429e58fb6e6b8920cb90dd14668cdca2cf6744a156d37d7cb397d6cc0eabd98fa51028afe4d4885a80d5da24aec3c86d4e47479ce6d3543be6981ca152db87ca01693ce6dcddfab9e7cc3276ebc933f0df6dd6cc11cb501548e8a803cd444eba28cc98824472314336bf4164cfe5b924acf3787e848d5ce4b20b6fef831dab2fed39cafd7bd06a8742ea682ea469320793cfd82831991902d49054437d536ee383cd7d596039d68d3be29b977f0b42f040ce878dfa621b10d5c4a794c2f9b8907ce4b298abc78174311d2855c974c05ebcd4bb72b15c4c229cb5e1169394b8d95e92d2508f46d8dac8dc792b9430866bd9406fd53b8615c694ed038ec503462fe6b3f35bc99cc67ed19d6e6f847116cf8ac8255378dc84d10660ca7ac08a8ce29239a478075fc95406fb567a6d50c3a05eb3299e68db9b79c99e5d0896b7c2fbd39e714f69669d3d11b5706830df1ea84467e7a7c56ea606633e7336cde7a8a0df5f51470cecb464b468d379922b9b3bf20804010f0eb16c057c34274daf0bb11e61d90354ed8b53ec52ffeef134338b4d620da4f8fc8a4c9aeff23eb4e94145884c89a040ffc8ad941b32fc9afc04d185a0211b82d1698199ebfca75c91f8efacf55a2a31e8109444204db9dc95955646949675223b958347f77187d2110f5936d6801c3fd8b0fb383658f5fdd3b086af3ca9aa3eab83e3c128ba071c6be808987d9ee320c62c4d6a1e30e7e5c0fee0461115922916dc27c1ee785b201e2f768c6ae7a416f27ab9abda7f6ce09a2de588d192e33f524e1e6c34d31f6b989bb0ca25924615699e2930be9a36f46813cf6f631e9419e83f314e426324eca98e827a9cc43cb516e67971325aed79214223c39bb66de1ecb42c45967305931db255ead6b1e8c9611d652b978b71039c1a97831cc96d0e06d6d58da26afaf85564809d02b60cb3860facfb0dd046a1ed382c182fb4803e6074b544d684caa389006093d54c1838836f74b6194b05c23cc3a3309ec3d2ab2051b2d28ecf7df2c5f44ae8d989b458c662545ee4859c52447cda30bb0e335da72174510fd18114615cfe7d91eb009c164a5797519583284270a130b2bd71920ad14d55c391fe137297cf0e9ab58e8441fc1686f676aa891c0d3f155d59b7be77e5e99575fec8630c22d9e01da811522226b69fa5b95950899cc3aeb7623b69c98b98f895dd45577f1adfb4189afb9638dab7111b336436ad93382a4324146f5965a7329497a8c7a63d0468d86edf178222b1d187583903da2f0ca0177dde995ac82d921565496b886bd862aa413cf065ee5b0c20e9330237f57589b07f8d1ec2d7199a6b9eeea188dd5c00af3fb3882b900bebabf2d74ce7dfb82dfa69b3aceb024266b3d9e455154fb93851a7f2441a9cec5b7f248ddaa7f5c833a40edd9135aa7be5b4094a77122b344a4c8ff00fbe940724f4ea856d53ec1c840f00fd260f651e51f6324e01aa48cc449a6a086dbdde41d23bd22615cae0d76331cdb0171f130aefa380cab27d68934379648d1f3c99dee7f5db1ca947429ba2856b92b90d46aa4c52f3c2fb8e62ea762f5ef1204ceb1e7783dd1d112100a7faa9416c0df9b6dbe88f9ba2fd66529cdbfaf79aafdfa0f18a0a0e10d6ba657c078e93696e0f07562ea4e834f6098e99cef93845ac54ebdc5f6a6d07f1221e64c133ccc81d5ce740e6b480e9600eabac753c09d0093a6ba9e4cdf1f087b383e14784dacb27add7319b13a81239af43ea53f7e42e4d4944e40a0141d03759bfd3b1b9baf102cfa040d88728268b888cd146f753a874ca94816c9c9ad20c2a11dac66a7c0132e124b2af3e855089ea6420d2de00da5391f4b623654e1ea4568026f1ef1e2350d53f3e166135effcc3bcf11a59d097f326365e503925c8ce1058fd5f4202a2e8274f105434d15d92c2a13e743daa466240a5826e0cab3d2a26fd085571c87fd7224748ef04886d18733f4df0a49c0cb2a622d997553a60dff58d9614ec4518ae083cb891603c1b788e26bf9537ef583ff94c85690d9e13e95a762e908e603f6b5c877062291c758bda01d886231204923f493408da7cc48de8e24764fb7aa60aaf616254db821050feb4a6f1fef787fff250eb0cc2b47ab559f18bd8b687b208c8dd253c2fad06d5db38220ea825c08f9c601ee4bbdbdc7920157629e9adfb744d3a83342ce804a65a5be8aac45811b08870a4af964b690fb14aa72a36d819ec843c2f6201a78b25810b36458ce8f920b22653764a440f5c1af70bfe0f056e7e2e5966ede202cc7d675b6be4e181694ebaa7d7ca46513c48a99e77766fc14f103e9a05c6a5f515fbb39ac28846b810bdc9a1235cee71402c4007f65098aed376700f1f2f6fcc9291b8a9ac47e3e2a856912432002de121fb14cc8347a27cf580f83ea30ed2e212aea2090af6db7c92220fbcb59f4450ef39e1a816df2d2081bd90f38868e28c11fe57ded45d6f653a2313bce8682c574ff72da1683875c2940b6bae314f542e18167e350bb0227d2841ee9a60c8e364da4e4d375240caf7d9fbec4dc56d993fd0636285a64d326f378c3e9a78b902ee887be62f1c6840d987b492621ae633022aa2b446a62d5a47fac5cbf4956a4ab2b68d18f5057f227a8e5ea8b06eb36f5325677e1256169da05dbdd0120ee42f52571b15eaedfb0ce6dcaf1a0b4a85ad7ee920e35b0ba63816454bec83738d33aac9d15ee31cbbc68c56767e2f02879a2dbdfc2247d027833384743497b472c875a559087b48310d1cf13afbb7c435b61ed95c8298e47d10213d028ee49d5bdc0ff8466ce650cbba7c4b58014f5dab61bd782b24021954b5ca4da358c5c14f37fc9b9b5be7f5b2b46553bd0855e3748514de235d61bbd49b65a3786271cc6cb7b80002c15c0551f3527e2ab35cec7f6cb4d6a26a99ae6cecff94580a62efdf80de205ce007dadcde721b4bb2022687c00ba72edfcb6cb47d5ecb3a11a77634a2cece0f5ca2b82763f30d122170341b18c576743ca0dad2e43ed81c1d1b49f1895a5968fc931e50af98443e759069b5ade4ba11a1a15910c9b426225769d7ea93e613ffa5bab753ddd5abb1ab670b345088ae0bb525b972f146e800c19f5e221466f61e8309bfee0e35280289153fb5bc3a1bc8e34d3da58495347f41e302aaa9427c2cd0affcc5c95891b4a5e4b613c985983d882ae619507622da5891eb00c60ba6a36b51c481a69262a20004742cd3562f71d91b8f4eefee9d03b8f00200fd2aa9520c08b5d3121bdf66b60b4c5524c325612ba33899c3f537d5c4c638474c3961d4ddc8f5ace87707be898b19cadf709e79b33a80524be1aa4bd46a762060470856c39ab04ce10454f10b9f38fdb64f97a4c8941245c9f79f3f8ba716a084f3bca51c0f15df12813f1450ad9ab7a2d24c5cb6737c6b78dd0f5ace88639a17033d6a39f4d7840e107041b9eaa1c59622995a66b545f2281e28afcac6e4f82ab671bcf79786c4df00b88d2721effb1ee03b785ec839771e11f763b40daa3cd034f3c3f60b0a8f5d3eba6347be4cd750f012a9562bc34ca7032320d91bd439e0f0b89373ed2fcd8402e0687380952d038f879d90d38c31e97028309d3eaa5bba256550912c70a342eb6bbb050d6f23f0904139f8329cd82b490ec44f5fc863d1f72bce93c75d00b9ff8df53e3b79d4e19a80b54d52d2325b18feedc98cfd422ec312afe2a20e7c5aeaffdbe265f68b4cb3ac08119eaff434d9c42c5b165f3af8ccbff0edc592a4416a9aceb81a7386a20f4b9125e4ba6012167e2ca2b71ba3a7b8431d7b84ea1bd4928eb5a8ee177a58e21ed24f6c8a9c0804d7e78d66b8aaa72e53d5576924fea007e83e15821e83817a27f61b261ce853fde807c658afab9b1fc2bbbc885726ad6bf25aad8b9638d0328849c617906ebff428cd994fb1d28a44040a2847c6fb5aafae8aab84456f15210fbc96ac5483612b2d8a367504b7ffd93cb787623ba8a2b78596187cc79bc30b34606242079c7819e8a733afac8ec028b7780a49fb10430bd1484844fcd5320ec86938ee8cd53b89042b0b9cbb05388dea19b7fc0ffbf9a1e0c0c603d90bb365c0ede03122767b064c6d450b4f797f4b2b82da4c26eb826b6fe88ff7c86fe43738ee413dadc9a2c98aa419051718d64a92dd97c18340a6808ae603629ab95e66c47fea265f40515754176bc98b82f0d44c27ad55673ac9a46e861fa15ab2207733be81fc7b494185e09028bbb13cefdeb0ae750d86822f50218b5e5e87e18236790ae8aca2081220d5604d8d48df2df2cd0a6c2658c40083bb6fb6fcc756c1c39eead90d817015e5959f63cbca48b3cb7cdbec34e8383e754ffea5bb1c3d791c7b59c526e01d035ac567902626313207a90e11384bb29364de9ff9392eed8d5cb46ad13ac57d600e0821cd2a4d352960f44b144dace12877890f9d378c931104c5506363ebae3a95a34793feab55d61bb99ae6254476ed12b5c45c44251cf7a9dccee5aac7b8de00569f5693247a13a90cf9ff566a9fcf24f074a727bb5ff5e256566fe740bf8ca0cb08ff66a70152d5ab9b5cd1ec314ca959a58d3f9347aa7bb390aacfa34ecedfa98a62ecafb74622846af1c5d2a108c14b6011e5afc9c92856ff80b72aec824d664315a2f2dd64f4a83f90e8b0eb2ce16e4003034cc0de2fb08c94eb03f742ef5cec00050dd07b4af3e84cc65fa5c5fa6db6bf250b0e1aa28de36b0b5d5e4e5f5a860a6daca8d1c6950d79a3697fe728f1fda33861dca898af6faa6bff703b392ef789c9fc902816ecaa5f5baf11c925bdff19875d2ea98045b20b7fcc95d7cf04ed638899aa3e66bfb00d038624abc86e1041f18b966f6f0168f51b1aa54963cab6bdc28543d0cd599d3e8798be4cc2d5c82e4cf3729d51886e97ea55c5dfc30e054253b69abd8b42c9912fcae4aa619db7fbd80445e9fad62545d5690aa6d9d092d939a0e477c90878e6f64982d17a6b940d2e734766a8d0dba5b3755e04f53adb0dd2b29f53f6cd0dbd9bedcb68adfe111fe862d22fce3a81a875ba5d994c3b4052d1688d6ba6bce8be531f0a01cc4e66f5dd4132d2a46579aa8cd501e0405e0e068fef473b87cbf3e2a53f996821e5e7121207c05f476143f7ef9b605b6fbe3b71f6753bb120498003bc8fa8c8aceba8af22e92317fee09677d12b044d2ef44aec8c234ffd8856c1f0c870c4e2d2018cc9c6103529a41617e93b7ba696f956cd253a9c01523ac580fccd673deed538b0c7eac591f12b5e78379e11d8eac8fbfefc3c63b2b6f7b1ca7be71286219aa5e1b83e27894dda6164a9523c2672bf9deb5e030da866a1486e596850acd10907dadb08a177cd722d7afec48b9837dfa27e73b01aef8a83cd9305f1b94871ccae7701ec15c67b9dc6c5ab670164bb0e6935e8cb8e7afbe07c4dde68d1157152020cdd021a45d66e5c505819251d25defdb3bcde7ec1edf6ff33b4be03d4a1ea994f996e31b60dc41a89d43f865acd288b34b56e83507965911e0ae9c34d14e1de8f9e24ebbebccc67547fa6c7c6661e9bc99227862dff116a8d344208696413b2b7947207c406b506fb06d94677a60291fe406bb0673500c2586700acc18a5c9b6ca0587238c5ed70df6e694c6831bae3996e54779ff4e96f3cd3a8ff10638347bac78d4c9cea2fd63ea1cd90dd9dbafe61ef6e09936abd22c5c0ba1d4b44937afd73cc945dfd0fed8a9adb26bb85f5b361a59435b8b435ec59a5fdf11f62a0cce7f1a6cc94a2f2957f2313a6d1f736c016b0b6a8fb116d14bf58374121bfac50c82a1432e48c427ee1569ed066482965e7020592c7fec546627ddb8ead6831b46ec75650f78146da0cf9addbb1757e7fb0677da35bc3290ffc061bc48f53d657a4c0b1353bd9c5cfd6fc9853fb8e58b1e70055ecbd75fffc43ab28709f1c965cc92889f5b90b36ad8d47ba37f339646b5affe47c3edb55b4199f988f0b2ee5f88458184b92611da0cc89c8ce3eb139c24c7adc24e99ef843a4e1d0184dd1667cbaedd1edd8aa9d6cd6a6ff7dde333c425a8c4ff7816232afad7b28943c82fbd6a6d2110457450f1da33956c841ff760655a4cdc0ce365c02011112d26460e77f38ba398e4b591e0add1e27ca1d8030d6439437006bb02e29d3b0673da36cd32fd637ca4250281426bba5e1ba4d8bc11d764ca37bda1e32051c0d0863f10cf6a12ca45ae70d401908e4639a6ac55bf22ed844c3b2604fb5762666250adcb734f110cac8460261ac376d940eb8ea9c6202342db4fe132742a1d66070fd3077d877c4cacf01aadc1dce6ffd667771c756acfbf8abc5f8fcd3e1d0ba3d6d0f5e9a1e5c3a611ffe7c36098d36c5f00b3f675acc2cd8e30f0850558ba19dbb1d5b3f6f0d86c6ff50100d62abc654b3d9280b8c7e06a8ec42b3f9760640626cf686056773d6ca3e34fefa666d249526e338267b5687e3ea6ab0673d88ad58f7037bd63f7087c60f5cfadcd29914a39f3d42b536c9dab48905bff05dcc231c9251924325abd3a6c816c7e24243e57f9e75ac9445daa8f88c67d800d6270d62ab0cba83e6d83aefb58997f08b75ab878e05dbfa07739c54eb5f4cb5b8c90a17b86fffe974445e62c1fad1626c67a18841abb4fe35ece86249192b40041afc98c10c6866104f35ea60c88ffd698ad4be1c018739814f78d40804bfc4430dc63c940c04831f58038edf45d8b4354a464938248dc3a5ebf17d049471411b015bf08fad214e22dc93b2308001ebfcfde04099d6341ef69b16635fc1bec9b4185b5159bbea6045037bdd45de014253dfc097f8c6a9f1df151b559986c3c1679b8e8540fe0be62eae80eb691b2e016153c6a52fe6d4eab1e21cc629c2a5cf23f6785602ca68dfaeedb7755ac7c36a1ffaed3f5a8c3d77f37093c8b5539b8ab186fbb8a7a6b0be8145647fc17dd3a6ac9b93e346a3ab80fb3a95622f3e88adac84bdf88f77220f2e7dbc5363a48132303ea709cac9931abf4205eee31d66b2c32556c225982ac29071da04999971eed248fa481729c2de8ac8c736461e359e230ff662a7204c7c0f0e473f88659c36b50de3d4f89ee1120e7e0f3fe1128f1e02ca7c8efdf379453facfbd6e233136ec25e3cf314c17d7c53e36d6a3c33e126cc5384bd78a69db3831ab96b22bda4ef3262c99a08c76e257719b1a47006249e6d78d66f4f7c43844b718fd0f5b1a78b360ef74d138130b108f38f6dd146c01a5ac9938c9070476a8c474098f88f5d50e3b1152d705fa72a97980065184733e157ef4ae381bf7b66c93eaaef8ad8ea88158b1c1746b9ed49099762a7bc7f34e2b818974019c8bccccc90eb6a3b134f39c83ad99337308fca241ef87da4367df179c2593872e070514118fee369f677469f1c0de4e42537fba3bbe0d231131ba874d881ea2051c80e8614a2cad83a70099e8014bed46a0033ded26007638c30c6c71863ac95112270ea0751d575e052f5eaa39eb3fad60407b819a8f38553099827174ae1127c734308e12e4e09745c625ced6aaa65108b1da92e1031b527105371ec61f761d78ee9a0f20feefc731a50a63aca5eb4a2ee437b0e045552e8dc0c857e33d4ed22fabd8eea36ebd6e9d8fac11dad1bb10011536177f624c93b7150860828b3272e7d4ba4cacb8a7da45a1deb868f152e1119797870c907f6e4d2d08c46198aa3e1125c789e15293e95baff485b435d1c5883fc074343abbb1994e198ba1fd15f81e5728bc03ea48bd3ef6e717a6968e2fb7b5d1ed521afce634fd2b4695e320dd3d0bc54af6248247e52ab77059154990683ab0c01571ddbe58cabee7d7755c12ef2b057dd8b32ca18ad0861e247974f314253a47e1e4763e5ca45c18733ecc1735f0b0981e603524a296555c9154429a58c32c6c7186394315e7a808b31c618a394b166a742231fd0a912f26b8c34432a344203a4b2b61066e5bf4f5d515d18ea42990bbec84b0951f250b2708921f94003ca40c8db5bf5150009122448902041820409122448902041820409122448909d435c1a60b92501a7c86834aa3e3b3a2812e96a12b673b36fda766ea5b7832ae6f9ebdb751d34dfda9c73f628eb6b27894422914838d7755dd7b569d9dcb46c66737635b42cc6acaf9d2412292369a48d849372cd4f488432532e14d116d23ed9fc372b966d9b765dd7755dd7755dd7a5699ab6d5c86c6c59f7cddf9812a35b49bbdb28d262bb1ac658f5198daabe76927648241209e7baaeebca7e5ddaafa965d7766dd7766dd9b66ddbb66ddbb76de3b6af6c5c46b99ded90b7bfe02dfbb66ddab76ddbb66ddbb66d65dbb66dc5c4b65263c5c4765dd775a3c6529e4dea96b263cb96a9d88b43cbd9d5b8b6bb6123f60eae4cbbae0be7caaeebd256b6cfb9d27db3c6fc36e7d2265d57f60bbbb25fd8d2ae2412894422611776cd1d5cd775cd896130ae8ecbe695aae8d2ec4cd7b07103020f98a4519b80d8d1419148a9516a74c26a7cf08c91586f8b1f263633ac326558f50f853770d798539c9a76c5401958bb45b70e96c5bcf874a8458dd229adf2eebe4a0a8a28f4e92bebabbbb9ebfd0ff4d6ba9b204efb759174624e1c7b56975d6fed57f701e1b2bdd23a2c6bacbbbbbbbbbbbb5bcb1ad3ba3babaaaaaaaaaaaaaaaaaaaaaaaae66976eb63aba9914aa552296c56a70a8b219148241269669a36a736413552296f7db057a34deedebca6757bdab2cf6319dd9af591aa0161ac43586ba4787a7686e63aed60ce39af2cebb2c9615c867538b2ae5b1fbca71397a68f9a39678d542a959adb36e7a437b6cec6a665d9b5cd6b9bd985b10c9a8c797e955dbf7ed9b8c1d8d460e5b29975376c742b4db81a366e5cf39a17f60fb5419c24921394ceced7afbad91d97b1674dd932881c44e8ad4b5d17f616b669c6110fb878f8ef2806f6e003948932d24f889de9c9a599e27076ff9c9fffccdf60d3f6f4b4b07cf70bc3898f4c7c45e52947f98abe5ce2409bf6bd0e5ccabedf814bd76534613dcf734e17ec2d4f9b62d8a5409b62e8f6d475b05f68c7cd4ec559549ca588087ed451854644c0a362316ba17fd3475a0476d14aa3d937aa71dc4534944251ae4253be42556e82ae7c444dfc041d1d067ae228280c678ae22c949f024655ff173c394ad709bf588f1a0cabfe7bd3d8ad7e4bf78dac14164bf74d16fa6f953ce0b6c5fac748d414fff874f251ad632d74ab0a96a778d466a838cb5bc5598e71d6a2e22c7fc12d2c74c7d696af13eb168f6a31e9c1f2177c161d31fe06ec494155d0163ad96ba1b2a6a038ccb3d075621d857518289fb03ea26c82720fca2a947d5046a1fc833dcb863d8eb2901bca4470b8087bd62bca39ecf1114621e117eb4d39c9f21871edcc5bf1338b951faf7f5b2385f3737538e235e5599ee5b907f7cd6a3da6f480fb788707e31413aa75562267c833ef28e1129421e5c217bed5b3735434b042c4a832834197633a4013d7b0046fe3073665873a2c5034ec40407501653e877f011300ad5f7d00d822568c8754eb0ce48a55b553b16bd8b783bafbda3914fe276a07cd5731c6eecf3125557e9397d790d4cffbf3ed1f1de008c1ce2ee891c1e3d44efd38f5716aa61b4914f235caa2c18525853dadfb3c0beb3ece6505a7aecf3ffea7a3b1b96033bc7cdf3436f1ee899f67ffbcef2aff462b1f13ddeca64a07f945eb523ebf34ed7c8cc3300c849dc34030858d30ec31ec91ee61d864138661d80a6d06b6611886e2b67fa06f9af6adeb5cb41958a775dfe7146a33f85ed65b1ba5d3046b1aa9d57175d8db78866988a8549b11df33cc8369aec9d03e1cd883d87a7dce39e7fce7fd50a3e5d6282873dde28ad1af79aaf55ea29b700986866ca37dc4e2da7adfe0740b1a48dbf40f08637dd2ae618fc90baad5c4470f27a9ae251d28d375f69ca8ae737e618b466d0dd6e767b72356d07380b08dc27a75537351e16743d5b46b9ac66947b928b7a31db2f6176c82ec824bd7b51655bb0d507b0c94d9ae699aa669d7b46b1a87f24e9ba1719aa6a1708a4b16f70fe51c47556831502a772dd5a8e598eb6ab8e8000494e14a04ca30333333730a0d0706511aec5920c0a900a8d008087a540c6652e8e96095630c6b33f8c3cccb4b4859e4d28774511cfab339f2346055a1c58835607313ac3313aead6746dc00b2c84bd8b3386544a3220fb6ae8f7e703eac7717b05bef275066bb6975be50ad378a4b6c2d4f93d112ebeb24dcad4fed9f7fa07fac6f92c99ef5162d06a8dbb195eb3efee7daa106034701326cd749b5ced0097b16845d012e0a57675e735effccea4aa1c5a8e693fa391f2b654dbbce39ba28ac57a1c2b22ceeeee05bb419f19c429311bbc8bd3a3a3a3a3a7372dca87966755607c24cae31c6643b29291626d5fae75297a75a256bea749c3ce7849f39ef5967a1c5585137097bd63179e230160142b834bb28844bf206ca68326617279fa40d4f6b4eabba2ceb9a56d5332b2b3048a2481245e4ca8ee3528ef82f768c59d360041c1f5b6884d48f301a02b70434628316a3eba7812331a3b1882aff91a675f86b49ada142233d7ccc09e4077b3206a21ca61ca6386c399ce150c56189c238e3c230d8d329ce449b3833e31262203c846f9808e37011cee1233dd89348705b3f8e935c02614850feadceb749527cab6406157b72b95cc1f26fb2d0d057d02f12c1353c3cb33bcfde740c383a23d4bf5532fab74980e1288e62fe6097900c2695cbea079028240e8125d16b329b14212c3791459d8ac7a8221e455431335d1e9f71297419be82e5f12c77e1d2f5edf13470897b3c89458c8b1709e012ca531ebf0397523cbe071fb834c3e36970e98fff814d2a8fb7c1a5181e4597da8c288a317ea418545c85c6997e9981aa780b9de12968cb53688aa3d0946714e518cd0ea2d83f9f73dc2fbadda2170badbe82b25c06bae2212ac3a42e2a34f2e01779ae9117c91a67b8f44b7ad92df35ff00a5a84ca59544ea71456d1ee61ef17b52e0365f946af73dc3f543b887e328a7d52d151689682a6dc85ceb7d0149f81b65c85364fbf9056ec29868728cb29ed7e4aef42435741ff19a88acb405b85b6137e913758866e45e7d27da378118d81daa8c13f501aecc5aba02db407f6e253d01dd88b4fa13ab0178f4213c02f5cb0170fa2312c483478ec72964859387e89a1cee923a1288a51342b91a88aa2c903050c276446975f136c0af604b014da1b6c11fb822a43df5014c5289a95485445d1b4505014a257171d068a42f4f8d98d44d439f37d04ca882edf4ac0cee1d28c2f585293845311a010aafc76d17691e8536627680e27aee11fdc022ec246b00d82cccc43999188071d3286e8dbfe586dc69c5bb727a85da2effa56c32a80226c5e949b1789389bf3a2330f7b1f6fa14a76b282056e47ac3996a75e5fd10277aa7e6933b603c20d726aa84220dc6048153df670526115a2f648127a157a0c8190ea52a19110e0546c6627f60489bcc0063541e2695ba02307a85ecf4181faf9273a778c9b90009ce81007d1a1a88bd9129ce82f189bda27a7b9d40cc5895efd04dd2aa2b08e6810b15eef23a2471922910842988b79e6b1eb7b52e563d733b163275afca49345dbc824954d3ea8f2cc230d004d7b824a8842d1e29a0af7d4dd76a2ee9ba17e7bc2b44c22c1c1fa310f8f54e20894097dc989246c11aa8cf2dbd38d9010ccf579aed97a6dd641599ce938735d74bba876d1eca2d8453f17bd2e3a2f6a5db4da91d705c4351fb762a2ed50c98b30124275800a2dcb3200e490060343c950503098aa591eec7d67c4399dc38267c6a5c8d0459828f6a8321251659c59f102f7354f3be1d2c755a80294e12edf3c539e87b089932e44aa3c03f95cd2b035482e812ecf3f32015429794e51f771a3d14c0f1ed5abd0480894540c32841b371e707166a68643e9e4c419c94ea852f408a10caceb845fe4f7c9e4c1f5c8e1f1983c35faf6f4ede9c704c20d1911b95c596152833d791b9d8384674a275e932f19294952654e8ee7fda3d18947d650b7271f70a17fa4ca3cec39e901b7326e978f44409915bc805900b9665b74119c236e6e50b98850c8e3a17aa80a59ff160bd117170a0e175677a1089d8a8e612126f23aa4366345158560e82f3802d064e2f2356c4099d0a54b8a957f2a2affb41aa2eb03c2c88be89e4c748b02f8f2a9d46f4f5a8afaedc9a5bb8f8f38843228ffb4172cc1ad0eee28c73a24531ea2df9ea44c71a928340705aae8198a0bdd3a4c686b88c2da367480736932428f211e428f317e38400f622b0a192e55bbf6cfec22dbc2a6851489dce755b41cb6937a4e8e1b8daa6f868a3dd2d0e757831197d45007844b8d95a3a0baf107849907558e6e3d5be5a89644ab1ccd6eb2ca51ac7b6095a31f269fcad1ebc855393ad966568e5a4faccad16aa7aa1c954464e568dc13471b080833ff8275e8ab7381301c5d8ec20abb180361f89352bf586da87c8e06adf2e5c8e326a8f23fb911c2f0b1135bf5f669a0721a6821b87640145c0084b9f9927bc6f2366176c24f6a8c8480a6422343f0a4aafc6472233291a1792d11b056510a8142d200c15e7c4529903133c780fb4815ca90f525022ecd0e29418d110655bfe1d2747723865896498d5f9ab883263b788546ecf1d8996b07832ed711e2a64e08ade7d87f15e0ba1cf00bb588ebdfbc758f4b38b87bec411a0a8542a150777804b71542ee50e3688e9ddcec72ec3fcedacf737fd193eb72605fae565d48f46c5b00bc41422d07d1b763285484828222429174a31cfd405de8ace1101f7be80e468efd421542e59e63bf800392ca69177d3bd47240b9760c856e26a29fac2294eeec7122fa9deb70e4d87f2158e77be8eef3b8e76e71143b88c2bad1cf005a472aa2bf9fab13e2a65a1dd82fdc6003f91bfdc2af3a2535fa0526a1f23512701f4cbd5f7808ae032e3a620a7b550fee63512b16ec7110a67ae492f78aa351d5a8d6c7d6e0a0409b5ef44bf5ea404800b6f8616b8032f3d5b91136e9be48fdb02d8e50f73d5b21a1ee3fa8845a592b1f6bf5b5d9c0e792ff581fa2b2aaea9ff921ac695d1fec434cecf3797daefee7d73f9f6bd1661abbe6eeee438d9b992d21224b2468d082216430c410fdac9fbd7a36bb25a83f65dbe0aaab6e4c9bd173f6ecfe0799f0c0dd991bfcc2deae0d27c1aceeacbf51d8f95083e599200e8eb4e589a998ea7ce8ba6e9f753eb0975d76bcd3b10e7b31d526182e78d2751661771759c0e1481097e61773b4235026a4049411a15c24ba463f1451178584a210088a3743e82ba8b7b055665d4fd6c38dee09e170b8846a13d6ed2e8e78c3de0e612f0ae99e9def79c2e3a4ee57a8c045217148bc290243c226aceb25ad649320c97a707daca98eb8fd64cf3d10667154fb88c3a52231874b201cd99b4b30368953803221d143d94387f41375df36ce564ce321bbf6656f9c18d98ea5af93ea58109d4f68e71479953ab87eddb30528b375df5c58534c2d130e441098603441dd99549be20ee0cbde486a89ba3c75878069f2035c1fd6bde4c1a5af71eac6253f24cd667fc159e370a948d549faeb21d47dc226c8ddc3a5f9bb8c58b8946cdf4850ede42ecb9c25611d0d87cef6639b26b245e8f6c8f152dfdd45d93010245c824ee6ab2cebaaaa2ee7ab8ca290b1357b3feb36eb82d83abf3ceb04ca402e413a5bf6ec6d1af67667d88b9d9dc45e579d553dff6dade80b099a1d0e17b36940983eff2e3460fb7da1297c463b44037ba17fcbc3b34eb6675bb0c828371fa23db007afd11dd89b215331319afb4cb42ba3ee9b26ba8fe3aed27da30ab785ca3fd757e80af8925d050aa1664fa14ad4ecdc016af6cd00d9d9a64ddcb1a374365bb6d9b317ac2dda01eb580f3bba166101ebb0360684b8c1b22cad73813059873da35587d1a6df05666aff4567b45200bcc17ad3e4a0ee2d5ad16fd6d88fd4a5c2cb4a0b4014220d28b3dffaa85605bf3318f0e1b3033c426251e1f621401b687adc16fa105c8803c17ed90edaf8ad6b2b402854782670a41086e2976a31c618638c11872cc3c1ea52b8ca90bb99b1b584247e9044123f482289247e00042014c9a9f2186f906f401899418e9037f8170cbb8e19a8909323094ba2c3ff004d282c3e981529541ade85064d2438332813ea438c336cd20d51d668d718e3b66d6fd01bf406817a492b5914a7564786feed10ea479b017a442d122ee940192803f4780c0716cf4f6027c0165cf360138a06e3a6cdc0442294500f9481f1c4a5ed4c61d528d7a63b66dd8ec472dc96006576709d04d8a22f17c5298132db47ddc38d38d0b108ba3c715b060552fd38b5052b6c1946732c0e7686f0f1cdc7377c83a9348a74131a617471b03384258ceca0071ba9f00ddf74ed6d036933b6b78c6ddbba66746f4018692356bda1308d7ba83b21eaac0ed58d752114d77dfb842acf5b574150773738270a318dc69a452e815662376c54a3dac436f184f39b9110ce46c3017bd3b841d825600d46800e3a163314ba4c50100653020926357450ac1b040823bf4bc01a90f09291124870912acf82491270dfa2a0d5b33d3d1cdfac5481db9913e5a15010461e862ceb9ceef8fe41a455006b90df68d74098e6254c5850a16084dec01678d360c8aa759c82725131f6384199aebd1379fcc9c80977139647309150a8a04ea4cd00bd535c82e7255006a88b07cd9d3977bafbb6c6c74d93110f8c6ecde85610b5c1dea45b4312802ff27b3202113abb01d416a015b606c2c8ae98c593b74f0315eb78098449e570fbf823c050ef4099eda17f3f51bfb6f9acf7f6802eea7a40c7ba1e4ec106026ddde1351a6bd46684bad89f314087816382ba7ec1a0063508d48b6ad3da4c21dccd08e78b02dd78d7285710e51b221046a2d808140ac54ab80842182951e591c0d1a956d2f54e2be19b10c618ef00d43191452d6a518bc23adec938529b3a09f085b91bce09730a5c16aa7c177818a1775a890643fb4a134ee6a075dad67dd203ea7a873dd82fd89bea00bd33ad9910ea5a0905d120b80a3adfdcf8604195ef55c14e9b6cf08b4c4dad779eecf4a852857ba18adcb8ee1128f3e9605c5d10db3167e31837b176b73cb63cf6105a75d1e2a8a2a553b0a080e1c4c8c48a4a0a8a28c481362dc3bea7b1950afa4fcaff50fa8b16f13986b150144f4159de34c55b68674bd372d2d0b00f7e916f3eb5e9a36571f6d6693deb63ddb1bbb3167ac98393b4ce372d340705306d46cbe33f2d8f55cbe30e1f6c9212489543ced10797260c16852d735beecd7a255be80e699a822e91c5d9229bb3474674517491d0d5d924bb4357097b4b986c93e55927dbf3846728f3e0971eec19e1faf3db13977ad8c96db07783277bcc194f6b4eabba2ceb9a56b5343d56c88dc4410d9a52a854cc37a5492d191a9101000000d314000030140805c482c1782c103475f70114800f89a2446e4c9989d32488711443c4100208010000000200020023c4010ca5ce948237621cf234610124c9e0434aa5c92fb34939a1634dd914c621da727feb1c58672b225d6846824bae6784e0620ab08f9b49d2ffba41a8357ff25a200e9643816014c5cff63bb3164c90aa27c8cf8739e1e45073e8f81d7058ccc6e065ab6d3f0fa9ee0dd0e541558928331628cea1b5155c6021bd936fcd597b22a6c9d90eb30fbc6a76f036bb060ef7fb24c1cc85ddf0ca8b1ed5e9ec1b725a526622f315adf4ac98942dc8e860b4aa08ca1da9d04b3500b8f05c462995d1a6ed79955b1171a9269870ada718fe4771ab7159e044333685cef24b86af1b73ee6f863031bc0ecdbebf19823b1f43efaaae197986e7ff40f18f336d3fe3dffe668c0580d6d013c834a478ebf143a1c7e8bb725bb8707f123e26a6e66db667576064009275e7c06408017f3b32000c00be669ca382d63f2680259aca67889e4ad776aebf19bb249d295dd96a10883ce20ed0195f11c6934f0f31bd97dfe0b7e2878cf7fa171f5ef11e979cee77992fee1edeedbb0a9612f759127e546adf1e817776872776213d297a9f45096939239831ed2bcc03351001cf78656d95649e2cf1c1ce8617255129544f6d2610a6c3e6dcbe6b10070844eb8c9a45954c813e3f97c3315efb43a40e7e17b7cc2675d2632ee355794f33e00b553c6511f8a83aa5375bd0f792b0b48b65009d71004f1fa6b6e9ae9061eb25e50140f8d0ac7e559fc5f3ac4e987042eacb99e22d8700e2f0b8e121e24971573002f7febe3a274a5a94c1628c0d35ed2ab4e62b151b3b2f985a0915e18c04dc38b1d71367d149412b115adb3196fe3742c42befcdc35992b6be65d84c943da8159a9525fab920dd0e01d5066998663f6c9db73f34909ee2052c4b3f9995a74ddcb46a2ea6f8adce277596a619c5efe0a4850a5196263df402858d6c63f92f04c746fd2bacc3cf5e3ab23c9ec4af81a8d939a242a6cae699242792ca83e9e713bb953e5d1c70db028813a5aecee4819e1aee864d2908da91a711af03998cf156c1b6c67ac12a04e1605538711ffe954c54bb2f7409a76129e09a9085b300c01549da4c32236ba8a68a2c31a05163761e4a6acd76f07613b0e13e1595baa6acca38fc62b01b04dc3cc4647e3c85a6372106f238aec7e586086f4c56bc7438c0e43216847e1fe95011907918a14ba45bfe62aef4c44810c90e176d6e3935fa6326b4f090b49b0fbb073e9953b7e7a09d7aa23c5176b8e0d9288a567d3a3cbce6fa9b3778fbe0418577ee59491ab1705a665e165613b036188913d98cf7e6fda3eaac8e69ac2c37ef7bca41ac3e9ff5809f36089d7b9b952d1947e9f42757eb99d8dcc05962e28d2f58ab73749a7aaecca965b541193a4425c72ee118648ac36830d356308813a43036c0bc0bf3ef53f9d009b209494f9eae1a4b7f78169e8556c9d448d0cb97aef4c29db1eab9b9f1eac67905a98f40eb2fdea24c4328d36cff987a7bc871ac4b306342bf1d02053846aa2690e214dd37a72ff105e81a35b4b05401aa7eb6d8d5c10d2a21c8cf136baa929e57d52734ff686dd468ede029cf4a935f3cd896855221808c7164690be105560596f653392d3f3470fcf64aff107642a49b50f0e6226356f15fe169ec2a246871a8f591711f50a6e875f0ae55680b4706e317cea93c0a7581e51a76df04cc58849a006ab8bcf05283b3d6a8dd92569bd17b6d893f8f96b2b596cb6a84e9d7c530860232ebe9290f4a540b24cb65a65e46d2c7bc54108a9e907e89ae393a9664ee4c63fe5d8e8542866bf4b40e46f3d0d066af230cfb91e81941bb28f01c1ae2cd065351a88e4d422021167818be946a7700989b9a2cb2598627a3a1ce8d00d24e91ddf4404351024352a665ae80a294ded7ac62ea9b79fbb7be184298e02e29a6d07b8ec6c9aa5bb698eb919c06f34e7c26a99003b7a902a61f62456357441f4e2ae4a8d0028ea862a488f37d8392a961656eb9394a5614bc595185c23724c0574539f04f0d8b79a70e672e150d5173454788b552530dddb01a9472b9e5f6cc34f6086608bf5d526b940d80a7917f9159333e12b5e20fce768616672d181a71529a9b0dc7e6bfd7820db2124537282cfe2defb94ec9793dec645e972833957aa75bdfdb695a3e6d5a24ad62f0ed9cb568a2d91a4aa2279b3e3058f6f4fc0cd3d23df28a7e2592a7a66b92a119c8e738d953742898ddadba1f6b177c08e092784691e7d3e45d37042c6862830fd02f8847d88b0322f67f5f4ac916b6b55c77f82122013dc136966c49eb5cc413baea30832023f1a926948a881f959fcf9e8202246363496203dc29aebd2eeadc0351370123c266add3544a24cf34c7b837048c723a248ddf758500b6d7a9e99559ff7fa41c1a5fffc68f2d8873af0c657de9c599dc38e739e1f20bfd26edb432967a326531df43932418e16814d89206c99eecdc4b758f6e4473c892bc6748955f9627397ca2b4013f3bee5affcc85624355840ad27b692fc4b3f22f740866a0d08ea177d6425f4643d7d4432add2efa7c39624646a9689bcc0837a8ea2fc81865333d556b3bc6cd27d4208a83dc528f7ca64b155e6f3943ed9a82ddc5645fba873e52ab1d42a53e15852fb68844d28dbd316753e341df38c074413a4bd603bc7af93c7910a4ab735ec485ea618dd477598180c01f909532d26540c78e3e70629dd0f310d0135e9d3b2a1220b77281413523e74a9b3e95a869686dfe637c12104ff60e7422c024355279d9936b2e35e05dd0d2a91c04bc009cd3a6acde61165e4f8d616513cd2d6c34d7d8cd8084c15e55758abf2fdce8a49452ba6a1370224a24cc089faa1b8bc5530209084a268ce423f5364fb962ebf77fc5a4a0a6647ea9b1c53a0f465ea8f1255df42117e55d8f98299696bfb4efd6854b7c0ba56137646364df7fab54500c9114a3f626c682fbbdfb26293d4e99c37cc75c4358b846b1180ec69f4316a916cb83596e556c787ceb4549fcd51cbf74bd55163f5cc21716f13724fe7b7b1767bd6c552f4eec5742d19f6ca93a82af0eb3c75c0fa57a9b3abca744e1dbc42f732097a87cb61a314b884ecd6c12127e85614da55bdd3cddd811f2f517f62b03744f507bd78d3b17121afe480d2326e091377d6c1410f9ee27b261986d0dfff8598c7d84a0dfe89bcad1a29f7d618af601d3695fffe38f07fc361a2299f8d040036948438a9c0d18247640de8d5672ed3902d2be8b3e3917dd1e377167d3d048d15ebf65375c5d6057c92d6dd2831655a1fde4e9a6140350c8b23509e6a89def3fdaff2a0467bc3d3e64b1515b5659f2ff5ce436ffa48fbcfbc4c1405fe26d4d7f22eff610b827947392332113c8356af24fea71d3ca1dc567a2d9cf14720e03cc667a382573fef1f11a2d94a81cb64ed95863873c9dae2d419ef5b82a2167c9849d7813381d047bbb9c05bda979e0b62e7a7b49d8267aff27f0f36f241f4027da3f274eaff253657d8e760f8ab88f9415042e0062126ad83f51103c0496bf312acf017021546a56b1364685ff4b581977827925e1bc75dc02e7e9542e4e86c2a0509ae45a844208802b5fa2a06ec75a14d10b1c8105bcceb6edfb0866f0c45d73fd92d295c845988b104370b2cbfd8a1f046ae78520f7b4c75ed1e1a0c17adb923cd7446a0aad12379275edf4bd00dee7cd49add85487d09a828a8e54072df82ab3998f35f633c19c74f7d5d483a222d8717e41e00c8a7f4f704308c8c3ef12b5866f6457d407ee79aab0d4fdae099beb8f037de25651382fd81b05d1dcd0d7e768892b294350fcc2f185a252fd44ddad5bbabcad9aac5c697f5948860382bce14e35beab53b316d155124d4bd848df05238051c65d514543a4a8113bb35b6d5b13e02b42b58f2c5eb8de84fc56db501f451952346a56fd1a34d8173eb5d3c0fdea6047ad19c8789d447401d6de3498c74ebbaac492f658ad325a447bc74ec6688c2a6bc7e14581c0349353f91f0f6fb84c6507fbbdd96dab63ea8c9647aea530675aeaf34a3d4b7c814b4ea2e4bc41ce81cb98a9e266148b00639c937ed7b39f606bbefcc34b4520ba193458bbc2767843a27c1cdc2931a039663ae8f6fe7f8485ec6833511fa496f89c4890b065055e48185732db2396e3524986e60bdd72d749c0f29e2e2a9a1529b139b5924cae52a5c9b89001b89cbd627754b71386c4cf091d75ae772d9f23e540b1e4018dd07d0c19ce46b0b9db4bed068b1572f134525cfba5cea40d7ac7cb149008a31d23375801166ef9c65a041f8a996b9f2570c0c1fd4e9a662aa86410b06819a181e20dbe91f6d0d592aa8c2a32504e5e73ffbcb3f5e4225ece9181580341a88478b3266d13d04819ad623562ff32895fde2bab65615d4f090c0b8651b73816ee673b6b442997d02fd92aa228cdaddcfc8d2749d945270365d94e177e0400484f56bb853b86ab9e67f6f6e433d2d3184b0c37e9386e7b91ed1be8e0a173d7693d86fd65e027c2365483853415cb710863c0f427a4c9a53513041ae53d53f251b76c208c5dc4fbce93556a9854ca82174fb7f891056d25393593f852be25a0beb809aca9db49958ebc556f70a436acdf83f382435dd309ec34525d02e519fadc691acaeec941c03c446d40b40dc9211712d35ff6b3ad57b291eba39d8161c8f4df4adb1cf68710ae3d1a6f1f188533b617d5a57b0ed5bf70af0b15714e552ce3e684dab355b321ebb8ccbda95d5043a6d286f6ea7996700c6798aa4971873215841ab363c55a9748a0e771d1ed56d9d676dcbb076bd837c3bfc11ad39c813f1724c0cae134fd02b882fd98f89780f79210d1c63d729f42e537206db0650b9bbbd035060fd61c62bdfba5fd1b4dd1425df1aff3400139bcb7d5708aa204c67c09e34859ebfc0c48d4e056c6aee61da55c5522f4d13b1048bccdafa50de4d0d4dd5d98b42d0f691d540443d7df6bc6ad350e499ded00641b7f01814a57ce768971c43a3a42554f4f480a8668ade05d8e932a27031d21d6e9d8675003ef29d0e1c7ab2b10b4ec9eeed6a7d68024508167a112e43798ac4133217c20ef61b76d30741270c2f1a1c65600b7e0b0474e4b0eb03d97742c473257261e826c4cc6fac2ddb5e9a27d0b9343e26cd2409510bf8a17650d13eeb4d33799238f94f3d8e2a45b501d5e4ad4b7972c77886b6b1225dd1a84a7defe80d99634081a96425f774917e817f381582896346733fc6bf4300c542d0d1e9a32b6881a74b6f80b3756bec00892f891642f90f1cecc78194965c486c8e83b2605111b07f52f5f407b0590d8378ad13764901536c4a8b5071d1e8bffbebefb6de9689e19d9e358528f7e48c16267a71bf6708875c04a8f008632e8b661a76d891040294e4453f0699b31c902b75fb0102e06ddf7cdf9b0e90788d0724097d34485eeac2fa7c5a95da37450e1aabed206008b659a4406f843ef00d66aba13b37a17884d518838d44d35494676a467c11722e317819d7da065d4ef4349c4813193647233d9e2c353c683d22c3f36924282c03c173409cbe5d94885887190afe58555417c159e637a16c06af224fa7f6c2c015b059080edfe25dbdd9572498551421d70ee55f141cafb075fffcbd967636f7643a0ec8d70c595f186d73ed359efbbddfc68fc5cbd954c5684f061880c033c24e273b19c86bea831f1f4198c516bafeee949f9561cbac8eaa3809a046c456b829ea4816a290208e87f9732312724b68ab76d1a6f5d8998055e10d858f6ff0a6910fafee1818be434f91f5a632875c75e9fecaa0530634c1a5ed20c3dbb84affaeeca0f4b0b470b735c92aab622e98925b9ea0d835134cc31adc4400c76487f8280786a7da7f65adf86c4d2d34c23c2d6601adec06311b46920c2660488583fd4cb96abafd1d1736ac516303dfc315d01fb305eb0b75decf24fda10b6bb49a4e2cb6029a3163ec2b80986400421703634d952823c3ca4c40bd70304a5fd8a00f2b29788228d9d561352ffc205689adc10e3d441d3b502dfbb58c98b4f6acc6311cd94add32e39a6a68ef589e8fd0bc02009892c5f2f3a93f7a2e78fb673608fe3180f43199ea90c7677f274b59f1816f1370d63d360d92c498dc013715fc08adbf6784ce73b3deea579dc12db273cc7b0ea073334042d6e7b8ab3a394a1a8df1ddc49ede9af3f3307b9f0ba2a9c8a5c74893aa93957c7b58e442f3a8b68ba9aa1814c219f601d0acc8b4b97a7a5cc96d858471cf6e06adb7bcc3974e257197c64538490070e0d0111d0a9ec914e1c942e7261745f4f02dcb3752b90238940842678ea6b2e6281b4c830a42a64681023eaf7fb67001822842f40ee92f226cfa343c4a147f187c682ae5febd833173b132ae1e93a7cc8954e0673e053fe778a3811155fed6cebc420cbf869e66ecef20f33da3356d1cab696b0f212d896cf5aa7cff44c13dbe34d6bd5e164551de89b6f2f6e17a2857f569d59ec7326b82fc222f3b0dc57e03a9bcfbd81f12b19f2a625829a9c11f99bfb4b8743c04fb0df4319df3b30bc87059b305fb338568cd8e182de8294af828c09cff143082b265c10440847fb081d0b32a1207679bca6ad95cc819a01548f5374b384d93e64be4483741a37651e4a424ab2e7fdf662e85aaf47a28d892f02ad5939fb3de4ea6ce026178d8519a24ed5f2f1ea50fd113e50d303f8c0d2e8424db471e41874515f1a9202a8e91bc603a1a1c7c46156774a3a1f7c6094e7056835a4804b2285d126095a1f91d8e8dbd0ffae31224b4a76051e32a8ac24c9a822938629a5e65652111eae9d41f9df3a798a5d8a56ca962d0d438f2504ec0d1232ace601bc76db96ac00b67462dc274a9e6fd92fca54d207e3ab0effb893354a771ed823271249f6510cb518cbe229c65eeb2934e88887811e706cfa8191da6639e81d058a911aa57c60951ca077145725f07aa3dab130b7a1403755d08bbcf09fd28c18fc7dccabc58222a588eac1002fc73bb398605a339554f66029e3db0aa37281b03fee8b02fada47739083107cc8ce6454d6d9d56a8483013092a7da1600f0ebcff996caaf145021df0646629700dc9a91408e22dec75d88ca7c04f77db2cc9aaaac82e864b0b6749a6237db021c5baf90dbadb182adc2025b8f95f63e1d5dca3daf3ec6fc0b336a8e6e9195030b80c9ae4be53fa68bb39e25f16dfca09f83dba9bd1f9eb11219cb2ae8ea77e9f73f207f247f94cdb2121dfd7d61e4e6cc265e7a61f2885230008c943114be49f8b3156e8cf967c761e6a06077af11294ac0b9db04e1619f64ab247d4330bf806eb0702659cf01cbd4331e47c1b0fe5eb64dbf5dbdec1da74e67aae046ec32ff4c93558503e8fa87652761d092ade2947ea6a9cc0b5efc574cc0adf37e437d9031d03711e8167f7a22cf7319906f6bdbe53acb324619d012e3ecc28b9fb2ea1df6fb3eb3595665c76a753deab1cefa56788137488f48c3950e4563be64ae77d7d07eeaa76398a8fdcb03a0296ca68d44e2db9edd41603f935b26b09a15a49ab8fcf040351a5128e5c07cdee9ea2c20982c9f1e3100532ae896d54662bef9b202ca4d5fa9689d95d864f68bb4a9480e3c5780e2455c595b891eb1768778e2af53f8be69fb9342e37814d48ea5d1c981065387633683a633010f890909af11a4caecfce2d5d6352db2a408cef7aff505b241e5a2dc92e8d2fd45ae34b6804bd20d6bfe3bd0c1cfa9f78d46838b9ec88a60af65b3a20835e50b09dd26686512f9f9f303424156bf6f872c20b7f7ef7fd629d210493857772798a8b5775bd9b88055e0eebe0ba8830049e2e5b9843bdc80e83b7da4609b476bc557fbbc4f89bc765bf8f42012477408d0cc435bb0a27048ffd8dc8c23f03b98a8ff3e51a135adf2401f99466b359eff05c5de21c16c47466428098a0f38520fa11df1890929a3c84d7ff3e0fdc6d2e699b88f8f50271dc51d7b0b72fdb1c78494c39699c27c143aa627f32cf3c3a33bc9db536531acf8bc90ad506d7add57fb1e7e23514cd3bbff14ebf7779a639dba32b7014a8012f0a02b0cbd9722b141108a104b4663fa1030121f58447c8259fe7afce114bc80126009b02a296ba03450a130bf48e17ad948c23201d62a354b8736d2f683cbb2020ed1d3e6d3119331596c82cd0d15b18bc4aff84f2c5892d8427ac3815bf3773436d910609c4508b43a266f57d18705b2e440ed57723621dcdef76fb737b2d227ec8a9ce954306012b76f0fd6e306b1e5aab628212f07dfceb5207bcd4b9cd3f2d9d9b11673ccce35b7082eef3e37d0969c1d5f4e63a32584c27f9a583753bbddc4e3e32a5b3668e4e73108d704bfa35fa8988a5942c569556145650d7d2f33d14487e6ce4535ae80a20cc5faf9b483878ad56345c10931d0e0e6cbfae55e797a7a76d43ccd621d62f2e3d9dcd124bc542676cad10e4506fd53a04ce4a537f812589a6c0c29af280b63f3af1426e392325ba9af1f96076ccb55165ac7752005a9fded260f3246553276c916821684bfa0f6f36d7ccdaeec8fdd55db396a9b1de3006a19581ba0cf8df7a14c2280e042991b1a26edbc108207d1d32945b69750ecf7dd4f67cfd5fca22e0a0941b62e1a047a0788433699480e09b156bdc128f1f1ae776f28f67e507d8a838b68b40b1c9a6f3926b306a3a12586cc2e6a3e9119b110bf149fc0b669d546cf9d5c4816c29377543226a8dd4771def0d1327aa747a435f69701c771bd49eea45d47a30777a02dd102885cf77168c3cc65c2869ed8549c551e4d30ccb0bf2e23b3ed59a3cbdcb6eab2d2fcce1156e1c872ada196dccf4b93a59324b0f25984c6ad3a0f22f0f865269eca5d5e17e11a11883f49fa9233f8451d2a9a95fb5af6250cde99b0ec980e2b93e7c4a0f91814e17105c3243e30cd4d1d2c4aa05ce90414b79598a2449ca657e07535f12ba7fdaeac3516b9844dd0e9da42afb91a372b8ed6d7b48871457630529d2745fb747f279831bc5084caf1676f8780dcbbaa951a84da68eaf4c422cbc8a855a6b3b0ffbf8d5214f2de6e96a110d87f3a14e4e1e3bd2836082972596a904c619262afb1e15aa0401c8d4bfd83bcd9edc3294dc41a24b71250d2079c2357de341fba8bb12ead05fd00f04568dcd5b487f40b1f800d5a1f941f113f3812057f18423c00216a6d8178dd238228d00306a178741082a168781ba2ed023dc11002f57208a87ba81620e397444871220569a481f5c5cf80e3a670371dc10e0d4b84c0f29d6a43f3fa501e15a026658c56eed6145eac6ff48358035040403298fbc900d877ff4036209eb21b907a73a3e85841ae3b1504d86fb5a864ec174e0c4f4b5dd71f0bb2db01702b5feaa215c570a6f813347dd76cac6c8dbfaa2ce9524cffb25c1f5ddb5a2802a8d95cc465b21f0daa175235e62f471e0829bd19d507526f771b16e0a805fb0eb0c3c623ee2cba1378e7830659fc26efb6141fbd93b1dc2944f6ef7ed5dda89ff6f9d918d8da5bf1aadd8ab4fd5b31f9e865d0de0f51a3b68ff00f37a829b1d83407ef86dc95b816cf2ea7f68964da82c40211fd4acf1ae2ab393d4e255827d64595a3d9319e6533205dba67daf1e63423623a0eb5a0bbe8d376cc9bf2dd37483bf14ab756411e3f4e2a0713bf9f83c8552447d204789478e1d8c3909c754c19457f6b683d64627d69c330182976e8be9a6beed7c821f309ae07f6ec3fa37ccb05002da385cd38242373179f06b6eb00864462d93a53f2e8adc318a805af22bccc8bc51ad7573be328881c50436ef5d11ea83490ea46a30061b28dad2a0de7be8653612bd43a7cd56edcec72dc96f4f687361b032c9513cd3d131720e2d98eda6130e3d4502c0212987482c5cfbf8c10ca2cf4a1d8e74339deb897f696b1db28f92028fe56bb8320c195de14c78c644cef4c6c502d1cb30dd8549fa1101be19686144d2a81e2335a1b9ccb42430314ceb341a25daaca1afccd89d09dfad70894fd2eb26582e2ddb3b24d91c5597db9f407fd08e8c9e678b209dca9663fbcd66664d4f27c79bceb6eb3d8c920c6f075e9dde11000d052bf636a1a46ce3a771704929134b16329e5c429e50305776a51ba467b644ca059f7a5a2f0457b31019d252d4ad0ca05186b8b5a9869bfce687899018446f6679acbe5f675b94aabd54b844567dfd9c8c6b79411e09967c4d75b40f4c00e2dad76e12515f7d31188bbbaf7694596301dc98edd711cef36a32ea72bed71581540695f1cd7b809bb14b16b1c108387c1af8c05d9d6d16d276aaafabc383fc5a98e0f5ad37316145052e5f5029b636ff566ed8053d9532a1293478c22f0b47097456ca1aa0f926e82b3b7ed22a924cefc5c331409aefbb405700224b53aff3913f1cee847ed19f5b372887174c2eae6abec5b2c9abe5568d294f3a180bc02708482d6458c99576540d5beebc936e0ee9c12a0b8cd6e422da4d93698238a6e60e49ea0e6d4dc4e8713289b3ac85607ee16e65c214ee03e43cf5b5682184d3c8c4ec8c9bf075c3e685f2fbfca9c520898ae6d445e310135fd0f2a909006ed8d0e2903e405dacd3ee3397b270145a49a615bf41f9ee872667400cdcc50fd83477514ad10ba9a5dbb8a365330bfef0f583cc071c21ebfcce2c1df8a25f824ac0b41fb0096b3d021f3804476c9a33d9a5c433e126299e3eaa2fe67d7e94f6c7ab0361646bd01b89fddfd39916294114910ad3808102130046e1a6173a29145b5c364f0659021464708c709281353f4de404d79eb9c7df5c2383429e608bb8245f10e2a6e62621024ed7a4a3a0a2b788e2bb99aaa1a052fbccfc58241adc855e4fbf7a6877a6175937d3d8ddab317f566b9dfc62046a934d63ff6793efc9414cac733175311a6b59cb8ca98101d015b61ab873c6d197beb225df3fe640924ab61ab75d3784c0b99898b022713be41bdf39204c485f3321f677d13125ace169b02a0e626e69b7593c618178f5b88ac49df23338f0e4181b86c40c65d293a76fc6b49ea63ccf1d344cf9d0ef7aedb5b7dc16225d8bc6922b820afeda772834849dd5bbb8cbef33337a0f9a65d1deb908139a2af68337bfe1457811d77bbd7788ccdae93e752b5ea42753cc906540c2a298420100481419ee1f302801c4181482a32ec4924d88cf72374e99de4b266905c09c249b7aa0962485d9704c55773c89f66e38b06e28465f1ff0135515340c02155a9163cc4b3e864d987f184bb7feac54be2946edea5bde603b0872a93acbc5eb2124165062f39580ca6f9bca8c81375895b33d86cfb51fc5043ad124612fb52ee48016a5d2a2abfe3faca798977151669a1d3d171ff159e803ea28ebcec62f26fb85d5bebc2f081a7a908efa9657ca5b3335518ef94679a9e9d644f0c5d5a1810d90f0e9090fce36797dc35994d27082162826ac4f4616493e45fbfb137913c46176b48415026f9d7155c7fc969da5904611944ec9ac9f79073f6bc9ed68ba0588724b279088e6a8ee1dc4d343a32525bf9e225dd0449a84519c6c680c9e1192343550fb28a18c46d92703177a8a2bf315ba8f5aa6f0493d2b853eab3e221bab8e0091d1ce2d6c371a0344a5ca09efaa0c66dcd2e5172648821ca3deb733bb0887a6a57b7c988d4d2ab31f7b3062613d3200cfbc45e2429e2103e9549864875ce3f1134d998b4cd8dcb6e97f6917f5de30f304f2f24b226f9e76a306412e4ddacf6463f16625da2c0f44543d45ff9b6336de0e34749be125a49e6bb8acf0c481d367398be162b4fd6d090b54e44765821fecebef1e39cc5ee4ac8130e7cfc6924e9425b67c86a541bd23d484888a317058b93bf65b2fc50560d7746ca3485c5bbf63e74a3ec10857210869e37f41aa1376f38613ed8c57e0401680082f7a24c70a3c1e0484b9199993d5d349706f90471adfd1b382b03069d336b453c66f98e7f63954a888ced1b70af1c2b68f0f8c4026498d9844851b3d1c0a2fb3734b6b6eed4fa6ff0bac530ec96c44083066dfa4486ebdf686d0d4bbbc659217f130a63519b6c685c00fa13524225945c7907e2af76088c8f7d17a194e7b7f33f7efeef7f987efa9402c75f15003ee971f067ff170d34bf8169692e074d53017d185881034a82fd12fa285ddf2973c4b4dca53d1fa393f22ee3bfd157cdba0545f82b512051e1fbb5405c81e8dc46bc007e7f0c901043a6bcce59bba02a149c323de6d756943bfc463693be1b2f2654bccb97503415078eb2398013fc2391fe65c71ca3ad7a1a38b8137de73fa591924c5a68e2fd240e609e0d04d5262a039c5225e3a10b87dcda4bb91467037738b8c7f87dc179acadd4c59bb76c1d4c1c4a325582f59a35327965c042a9fd5df21e19971fdd88a09955a2776e5fe14ec78fe966bdc6f819485b0010d100032ac8b25c5bcd137965336afbb74380f14e588b0983896e49b5efcb0aa72cacd4c25d96f200df37774a3086c65f974514e2360c709d1003b26eac5edcba4e4a837d6ef206cf401a5c4d393390817983a74ab421802f7f7d3dd42b0bc540a4e21b42fdb7f396899dd0bc1d08686e32ffcd24fc8c873d6a3010761320335a86951b320c15c6a375d105c2e6d90563ab0eb5f94bd769eadf651af2cb7164ead7025232eb4648977c81a401fdc6f60b57a39be383085c200d50bf615c251669e0a758182f909ab9f5709bcf934e0862479df07d85e5414ae0e8a142ca153fc280d3a93274eb9f92954c890acc2558438c5ea1d68fa41ca27a027e74709d872cf7c2b1ade02abad0125fa0e0c0de3674f398bffbd6ddc610dcc8c34e9189a120718284a34c4a51ebc665e1e8a7485596a8ef2f48b6c04f5d92629bf7596a2094c3b29e8f4b665967fef934450a2b09f551ed975a9b346603138a8e9964a02220a7c230f2ff9356243c80345dc80beb269122dd10938da0779e8301d6cb9a60541fe388995af991bd0ffa089e6480de2122606ce9e63b987129a59970cc26771a21583f5361acebe40a4bd2f9252e261c5e50c068876fe0819a92f9b3134679421f0991dec44f8272b905de62aac9df852dca4df0af13b3b2c0b1ec05410a78b60bc80eb8b36a1a99e39bcb2408e9f13259ab00f9b8679f3339202228616c76162c433e5c851cd9eeeaba1dd9d8e76b92e5a6a111ae9548caad8975974d9eee1ddee5880ea880e03a9b70acd75809f1d867d9306e2c872094330252f2cee0a74ff608ccdc5d622fb83ee196212b35e062c79b07b8972d350c6558536a1b5a20606fa12189df5e8a3687cf1b6d20b071335de370904669e446d46889fe870f8e81bb04734ed1dd6940f6af844a5102f55cc22c3ca62100352ef847127800b7f347b572b36ca2f725163ab1a4f759e1c11f996f14fe9237a1dd235ed6131476891c7946e9893c79c1e9ff693fdfcb2b985b982b1cde4fd24b9359140c48524a091c51c9fd5e9bc257d4fe99899d94e84c668b932cb34e97b902411c18cec8a4bffbd5fd46f8c302ee06c38675f360294d037662c4f1ffc6b8ab2b3677ee80b03914dab72149e84db8effb0235373778a0e8f5c21ac08aa4ea84ad2765ea66d081d44ade9d23522a84ce64f4453aa1e7683e3800bfb718bc126de8a1ebd7116234fe5d0ea66a1862ff0252691e741ed0330b2a845844e7bc73accd757cec216bb8fbcb09784fb79b664180f78804b22e069038b45038b41d8104833dc6cbc80aa8894dc0c83afe91e2f42060f3a4b6d74a7c83fd23319638cae0882c069b48ccafd37f8339839f39335f075d0e33ffa34d9f444d5324538e86a56166ead79f9a4e7825b1b677248bc1434549e2bc53980a75d1d27f20064d319fefefd403384f922fbeefabaa78905c18d6f8980ae0f15671c956bb37c58a57dfc7c7f2810e0b7456e446d03ae51e35463780e0dd454b3f35dc1f4066d1dd05f241fb4856282640ce50d86629c08ae900231b3332625ed04c5d466aa6a7165f9cc5aea236e2619fde94812180cb6dd26f7f6513fd90dea50e0cc48cebb3c185925a932ccc9bbd9c25eea83ffd9d26dbd10f676eb9580b2ed047beb21b45483bb89f13e15a3a3d02651f389d2579fb55e4560dc6857aba1a5a54bc90f6a11386c4934f2a0083ae17d6cb7dd287a1a831afa6c00d041f49302c1f0c250ccb6c150c14cfabf3a4ca39cf67e66770589043254d4b7088f2c37aa98c9f681608e250b5c4e74aff00ce38d255263cd61480cbf7ca0cd87d8ac946816a7e5c34caf5bdb12df86eda77352519dad50904bf180ae2fd6d261784c74cb93336fd259270bcb61e0fec695837b3c6d91771518676fa039234ba35bc31d74bfad7dd8625debda5b7c1122df9e7acb17e4923a9fbf3be07883f891fbdb841dc3d9c7695459097a6864e3526f3303c7abbb853e220598a94c18755499ed5733a8b3e823b7d567bf560f0d5735fae890a3eafdd14639e7610593f47d491a815cd43a330c670504348201839cbc0d30336e8af35e00f2c3654507aaf9a50ad2f7a5e09ed49375996216b50e3718eb9dd5d2d7b20ceb0dff8962d8e496f775dc13faa089e97e1138c2939b9a18c041cfa8aff595cf892d37f38ba60f140c27a8043d02942ece898711b3da43d4b471dba9244bb7cc299c6308d4e870fdf2d91966fd53d01e32a18af5fdb9470c745ac90174010ffa6c782a066dea412d4464013c5359c46660a437078b88748bbb2326ae86761c4f7b37e7751ee594debecce4e8096e9cf93acb07b66e5f201adef44072a9ae5396daeda243d8eb7b6d361c36c397bb45d04a781b3e80655cb46fe90e6263d36e4f95e467ff41da8c8709b721e071f4ea8b52a58cb4bcfb4e46b4c092652e658f22868c5c18d71d8517a04e6e9e0a361396873d3101dd308247346842268709a59bebe20cf28a11f9289e4f7590893d76a75fff1ba5c0b021bf7c3fa9f7eaa0fc2c4ca4a3e3bfb7f8b97e3104eec261222e00c5b74584b9556a80c161e1e402afcd5d77ec8c1c31891dbc4dd0f2cbc141dfe91701157e62fa3835dced2b920423b150c24bc53ccc3c45d82ccb12b601e6be1e521ab5f1d6de7a721af629eb304518cfcc1e29ee88af28a1bde725cd28d6a446e51e1a93fa7c7a8637476b4bf20d0a250bb84a237c66db078901b84872d8a8c0aca8ced66270417510ca22f85a4688044f1eb81009406bffea5e12ba078145bbc2685a13a52e3436c73e1edc727d3c3bdda3520e157f3dbc119238c1b777fbb9122b40837f88628126f1a79c7f24e4b65e7a308d2e21c2602b3968226ccce8bc590568d0d8f888dacc0ca77f93975b36a7eaeb41540f8c98b1def664ae75824e5d678396e3699c472c9ead5c236913673e2af555c62780488ff4afae6c234b42acb71be5cfbfc7ba499d7e5568336f30ebe3016e9a50d306c591e4bb76710a6b99256098250779503fd8f4996c209edb51647c5005c092eb393785f66ff771b5d2b6bc62ba9453f092ba3c3d5a73f70b1907f61b1ed99fc776909ce03bce5e5bcd5bc8580657a574b0c344372d1f0f8686bd147e7b32f970f5de10dd413e6f7197c4dc32f3daa2c50f29919d5710a8821267e3a9310ddccb2d2ca0d530405e84534d92be5e302867d28a251609c34f0050519812c0e1705609ec94716589a3216e231b5e1118e056e7187f848550f8445bbc3f5e8ac2fd5784b6cabc4403f3a0e758b7605c0ebb25afd4be47714e17f6d3c01b0525549ac8c389179354c54d58c14e36af36a96feff32a74e34ab039906aca77d148bea1dd5c63ae963ab6ca4195b9c2030b437d28869fe0d43c5b85d7112d9b2eadc1b17b131bf7d334fd17d220748e4f0f60556ac1c018195f5d4fd0170a686bb48376cb8f91eadcff4f837903cba62daa49bfb1a212e5af584bbb903df4a726489002127e5642b7c5fa5baad017e639f3885a6ef35b8102d4a1ae7427654439282ec56fd25331f15f23e501cd7cfa0bb38d6e6bca2a0765d643978145c26f2cb36dcd86de1ced379e5a28380f808de7e328353f9e5aaa73c48f3b1a29182ce8dc840a258711a90a6bc7101e27f890b387870964616e6143ea027a59fd9880cef92e31cac2955a7c77342c0ebf629d29ebd12746705d6ec2fb3acdf66b9967172052b33599a23b34c03ad91ef32c913890c5dcfa14bdce08621631928541708a44822174712b4efc03562582c160312077f6a3ca72bb21737e6f5654507706d3ae5e1ca32ca7805da4c574fb0ce0979c100726ed833c149ca2596730a508fe2a8195930c48010684a9f828b7a537c46aaacf5380ec26ecde403e8acc4161c20a8394b801af0e3e83de5d34bebf73d68bf36841650c08ed887c6166964a399adab08064ab618dc2f3936786e5659807af5c940a4c2a2eb25853b01e0749021597400d44910ae424e810940245a766995cf1cdcdd930e5238b83ca19343185ca5dbbe12fbd41cb4b7072f1d63bdce38920714c2f99cffe8445c98b9b0e2893d83deac798dbe755fe2eb064958d7b8a00e7810f184f7ccdce7d54da7000da75e0efe9a2020a75c3e86930294bd100c6991d8c5b9068e5456475150f3a4543e7891a6bc254fc2c95a769b2798b61791eddf6dfadf3671d68047aa61a7a77901a57d65a2bde4cfde033675f9cf3919953e07ec3dc5590da785f5300bcbbb67f5d3e5b93837e3ac2325dfb31bdc62128154a84fa3146b9fe7f7e5de7e5118dfc030cdc9b99d0cb3c595153f57f8774288ffe5e13a1bc611c753d4e356dacb9b8feb72193fc1b68183da7686a501711ba50c3383828a96be3ec853c7ada60a27e24e87996de0662421b8d537d5eca78dbe37b1991251b562baef329dba439daead98fe70a03dda0a56f7f560423540c86a56042e6250f6bad920053d79c11d9682a0734526fa737628e9b67b1f071133235867144c6ec1eefaab320c24391f401ac1fc44d777f55de57508daf4f97ac224018ca7f0c8a5b924271a5325525bc0973ca538cb42b5cc01a64a2c125618f02be18a0b496ae455cb1f7d5cf546356e27bbc0646c267fa5c0b3de3888276ebe92d9ef749f2b3a683aa07be355206b9aef30af9b811541d2d81492d181915f5a07b98aecf5e90950b3532cb0324cc7d47337f3db9b1ee032e1d6d359d61565c8902d0d5dd0ac5669884e1afab9210f988fe5c9ca6c1ee180ce930e73d99a53ffa67077c656e8803b89d84b7dcb53c9b3271985972c868727c17d2f0c7dab97ccceb505cc5324bc274b5a6d0aee3367e397714ccdaa2fa61c8cea112788a50509644e80e9bd05c39a913981404592bc97e85d5117d5f86e91687c56a0d8c6c9e242f2cbbd6d585cb59b5b224648d1834e65e3a710e4830b0413608566d1159fc02c15fb85cd4d79121f9ad6af15a7a7c1b9b390d687fb331bf7ea54e9ab98479f116242bda788355120c4f2a787e24cc5c2868975dae588f4ff6107f5c8dad74bdfade9268283a2cfeb985f0842cfeba4f50179ec0fd1d52b68f55c398281ae1aa5fcc08a256038801002b2abea0a499891a6e5fbfb05fdb4d38995b2a08cd98f26f7889323b7c05bd4c17c738b88c488c29a210dc30769707572e9606358599c2fc0b3acbdfbcd97f50dc63d05bb240118a2db796ce84030d67bbe948b5a35442b7fd28bbfb155d0a11c459928aef4e4ef51716350364b7aeccc499c15fbcc82ac141f59cf8c56a9d4694ccf690bbdf6a67198fd905a205419ee0982f83e3f0d53134fc3df9387b19c26299b49c7eb12fb60eaaf1256c9ab9bc355711b9a8b870e571a1529654f8533787774fa3be51edb9e978a18eb14244df9ba9a065806cafbdf848a0e021d4fbbff1e0f9597e9b665ce47e54310dda74186b7a64b4e7cdd1bcbe73628715d633c1581e60625870a4087aa343e54b560fe10feb802641b70b14a88d04563014e151876d25b5db543e4e56ac5a38b05e42b63db694dfc96887a18607e2debe3ed46a0e6850acde04a225a04e84a48db245ad55138e1f64ae21f5203db2b3ebf1ccb81c28fb7cf563d71ab18987d3d474a2fb7ea89af80cf3adbdc35b2b4e02992584b05d33c8994bbe31523a517928f4d1ced7f44e5459f002a3661edb09c0b02bc98c0ace8d311a0b22b114042e11a0374cd4126e08d1934ef3948d9497f67dd652690fd559fc133168d8310796f7ad9859b7a4b292a450feb7da74f718c6eb77b0026d458390c97eb42fc9cc8be20a6ddde8f468ac36b41e4d059aa5870e4c9e377b4fc37ccf4400f3ac3b640fc8818733ed09538cc4039041274dc0d874ec97ec4960e6b858552a134a220be39147a84e38167b910f14149761542cd551f85050471f23711d566cd56eb5d22cd62b6da06c0cb1025e12585c412a76021ad3b252e4e4a15801714a65740986f8c4bccdc8d151012aede85849ab593dce2cdb162ba9621752a9096a24179a1cd8f9c6cd91400e6836a324665cf28c6577ea4a616fce201360082e06f75eb39e04bd0d5d8dcf12e1d93fa00a39f1a2be734f4239653d8376df0628d9fbdd4ac06ce1ecc9654a237f6199bc8c9d8a677ec55c84c37d8b9ecfbcc176beef2b0cd5c52b7e2d950bc6f364a9b07b12466dd1d9a457cfbd8d2663dcc6d027ad56703c2fcd491b8a9083187d212b0926e08caf54fad74a9bc857ca508b34a19ae9291f368ef57070d837d8db0c2b37e7e0497058debac08897e061c4813dbde35f021148b75c14ec8308b28a3220100f2aae0d23c4a1880e988f646a66c05531ecc0a14d59a3dda62599187b939e929b0729a4ff9812accdcbff7515e3043307dda9365d50afdb8b2e8711863b0aacc67a20c6ab48fe186e2935508c4ce5f86a2172b34935ef36538270d2b9f2f421447c9f4e206df2267acc16226fd158ee86c75cbea79f90799f84950bef8b53382410f7e6c7b00c0330a6e767f75b8cfadb6cd91a1e94b0b2e738bf9d516f3da011798f7a4a9e4f7fa8b8afe69750dd422d3c9edeffe624452a7d77f9e4846c3495941b4d36bb0bec509c2ea4b96afad4e12810ac6b772534a98808d52cfaa405ab7eabc659bc26dd1e642a3303549861f6953d246c6c6313926eff76d5cf01ec6e6736695a435686d13e5d9ef624af77a67d734a91a411bb3734030941ff15d60ebb07de4a048104bfdc8f601f5ae1f2250cae4fe4d01528e81e42eb4fc59a8de322752a6bfde882abbf3bd30e603e5f4f9ebd4e0de1dc7c6817e0ccef42c24780d9e309175be530821e4ff0d19a149705c4b009369b641451922a514a5b5eb8d4e568da34de7e424b004f1e18f2f0c1d652827da119ed702b6a227319595dca515f2045c161644dc9ef7ca26f86cf9ae67eb3dbff38588eb522565cba1f63097fa1e6193a7744a8b8b1b24d086d55ed9d7a915f01dfa08dc3465d789a6956c51e9c9197c8507014a7ed28398799559fb89a66bb8677415f624803e8799a6bf26b1a85753080b9cc9a2de940c1dea22090f225620a577476e09512c4ae470c78f8f53db375c2c4260a2a28e460f60cde98a3a50819a8370a07f194841d31598b5c1cbe97b5123f1d9ca7ba5624c787676ff3210ab918a1a24a3979ec583a037d97a73ddc89bc42f591724ed40fb4c1bc04434a86261db7710024ba3cf81c0fcf03b44872d53b145d627c0f4950114b7eb49f680c4c73c6a6cbe44e9aea3897b6b0f8bffebfee7fa43ffa9b2e5f12f1bef32236ff48265a3897d9c5ae173b6ae10f3ccb665105764e112dbe651c9ad4ea59c19a1640dea980948154f91d884e802257696197666a84024dbbf0db1ee396a0e335529967d98517b3a219af61566b501bff3389741dfd406caa50a038129467c81b6cf8981f1e1c6c13952d774b9862354559d4aa652488586e21b443c12f7c98b59da45c8b5158e284c61d15325ca81b53e28c83fb5c4773214a2f9fee4164c6f0ac14add4a69b8ad360c29e3be0323b7f81638ec9d323c2e483b26d8aada4c9f153e864bad0e9da21f95ac101a5ea103e21f1c917bcd8b215ffe30b887a712230226281773704e9e0c74b5110d7a43d3b3b05cecb4fd09ffe32545605ba9bfdf2290e17c8a57bfdf4237a2d312075015e37ffefd169cfc55e85bb060e5b2adde3cfb519f4477b3ed015dbcaa1757cb964f455ed7db91ea833eb7c9314e7694ef132c05686fbe7d7a40fe39fd1f977daa6345a0e6a7d0187f8db7c20445bce24ac3f36286ecbf0a1dcb22b395837026427953003601f4a45e15debe58ebe0084cfd3ad538b8c62ff65ea22dbe794c19834124a23942cb73cfd41968efc3f65baf453b0b66e8579296dcf1ed734803b44475500b7a65d0e8120a4141d0555502cee1aa49542c50515c1231a1d289becfddb5d482858e45010fc4db4131e99ab54b2d9dc036b060af0e348b4e8736ecf57273b72dad3464f2140bb1906688cd2285a1351df96d12c9c1924355b6b0c30fbb8baf308273439fa928f10d4147e655c5da79bca4b24c195b18eb12e8c0844718161d5afa58d83bfda926483267637d70a8d84ad4b7f0b50413cabc8bcef295ecd376d7e012a57b1e1ee7c50d78451421e437ba8ceeb5604f2ac527c855b9f975c16c9df82b252238d265244cd908124db9c991dc5ac27269d2afee838ed05fe6a2d0838828b0d156aee79b17e17c653c8d93f3b0271c72efb95185624b9ab65110122853ca8b0ea92a9e2856890cab741f77a49d61907b4fb737ecb5f200f2066ba6b8c9728212432ade9aafe46e81fbd914c959d5acaf74636dc3930c375986f6c02b93bb3faa486911744259558350a53d0ee8c285d65bce272bbfa252e5ab5401091e12aafb3da8269b897ada03631c0cd647aff46336074b3aa12855c0685b59b65a715cb95020801b5415f5d5cec83a06a1494027f9f72ef02627b6f4f2c27b2957765ee155ecf61166e95bf0c06ea6c0e28f4440661b0c762f50e4148a36a2348a521bbe5b08fcf60fdddcda98fd00346c63ab30697b8fbddd84c665e4762ace167a30d141690130a9ae50e8ed290c0b47e18eee8def1136f0968dc0268873f87b00b4c296c21f78dc1692a355f3d92f27cd276c9e4401b72a363ff24598da1adbb540c02f16f4e1bef041814a91fc7063ed24309563cc515652dac9f276f7cde48a4da8252e43527a5bd3bf4eac57e383d80b8077069e0cf5e541a49c6610d48c742505414ee600bccfd47ca2fa5010317f3553a1f74a3542021914a26a193b8852d6e6248baafca4f81ca6938a514af70120410c5d2f5a2880c4719867b1c955437d988372f3ef0a99465a6c7c4532199b8faaef4948eb4bf57bfd6792fb8f9a10ad98ca6251ea9bc4779ab8e659e080723397bf22e8d0ae12dc7164a0c8c983f06a9fdadb50c944cf0f65637be07c9b0725ce8d9321c519c19ba9e0f5875b783d16b817a38b798ce912be77d953f438c3b7e76168153ddd6553f0dd150d1d8f8253bbb7650041045de2856b280d2a599406faf274300e15bcd2805d14ca90bd34e845a54344d3cd8d48134bb3915ca66fdd73bd230cb148ff5449193f3a26bdf392f547da71ae5863a11282c7d8025d81b67e091e0eba89e05a7e7b148b84c4ec0805314bfb84d26c4a7fd3f086150fd82b06410ff10dec7df4e2ecc442fd381b33d7796e5aa1358363b4d394706dc43885319cdb93c94bbeb9cf7e7b484f5ab55155e9129f9344b8694d223dc85f444038233ed7123c3169e8c0065c0adf09baf5cd9454a3f24975b1725e83902c55b9ccecc69eb8ecb898a3ebb2a4010820715bd2a33e822de281f6155b3e6d591e1e88e0d454f8f10c2d714241648930819ced2a3ee4dcba7dc568c30d407895c9d3fb721872f582c56deccba25caa523a3d01cd4d1c59f78da054c631e5273505e11f685ce2146c42070c54421d74a8a2c9657bb9f3a8663f9a8499e247592f0ef243e96129c6a8008ab6d1c7a16d08b7628aaac320027ee33408924786f7abff2ad859509851b546e33638290b167b6da07eaec8614922ec2b60314e916bd093d0368cc03323c3d025715998149e683eb071213871cd1231d3ec40e81283e4f2a330fd262cc590944a20e454fef46330809d9e82ee3f16c3f916f4f787da0c270660fd68f5a6cc0ffac63bfccd0ded2d40788be649a07c55160ddfcaa3110e86678060acd526c84105f79f6e26bd9f12a2c9c11902f917aec45df262503aa6a5feed6f2e451ed09801929ab34bcc455bfbd4c5a310d45c205204ddff28de87ab1bfc4083a83bc9af0ff9f42dad1aaaebb350420cd02f0af7e36a3e7a053e6db6c9ebfa688d5953263166e7e58969d6a38cd7070d68c65a643d24dbf1d73ad6a39fd127c6583ce81598ace6f7de03208256e23cbd3c5d322dc08ef08efe616bb4fc8c24fe0318952b3da9b9330e16f54309c278968cd4700fe8ea72e34cb946cbd7ce3ecfaca9fd452bf450f0c5a1b67eff4200c20ebf43683958bc6f0062676168c4fcca02cf96c20fd89fd160c1ff8836f4ff50b784b62103769d5a20e8e753201ccc8498fca55682daa67f6464208a944e2d00362aa52a00412d1a99a75fd462fdd42e86f1067a5071c218c7c0d2156bf8f2ef55241881f6bd50b3b1ca2fa70952cbd0bdcd0c0fbb9bbb795a663d50093d43191010b7b0dbcd2fa44960dd97ded60cdb704194830e0cab7fd02bad8b92cea7124578b8d47ca2044d483d2cab2ea74cd5e9bc399314f4902f5ed361cb331678c9ef2f539a1df2ac3142254360cbdad389292df8770a1a631d5ef8bcd520d3d29216ecfb0b29492442998f76ca427571807ceaadfa6674c15fc02593409e3c555b31865bfc33f7e1f22e44959ef9ad8ba5a277ec2a08a9f03c413bce39cae4316eb6f3b1d6d568caeddb1ff35858f6b8595b391abd1f757a92b94086afa18f602822f8ce8de68f70d9e710aa732fa63f384cec846140678af8b3fa6ad59a19e82198224807875a51378ace0079c403819ddeba467bb36da59b3d406f5df71ee30e003d860ee01bdc8a006fb115806fe05700dcc0ae007003b312e0267e65d6f6eeeaee5b79778f567ee108547903aaa6d2895c3052b29a0e66f1684e3d4493f016222efe082056f36a834fe9959a8a7b01f479944b6203ea68d115bad16cbf50a18a87888af033f7d17dffbcf3ed0362e1f9d64f9517ed129555714dd45ef5ed6a9aeb61db8decbdb7dc52ca94920c6208f5074409ab1e24aef36a0e5df43ad6829166ae98f14c4848f1660824533c4d8f913e0bdb4c5ea8f8212121695cc416bfbef80152cc113f1487da2a4aa313253d2063b658c1f23bb1f4635aff27926825e6f9aebeb9fbca3a0e0e6ae977df75347c6c299d38565ec86d15c63c0c639e66695ad7e1d80e87edbaae9f8b449b7e221c382b269c848f3cc33c22df6523a35ab9a391d2e6441424b2284864247043b663eebb2ebc3adc90918f2d27598b6c7574bfeceda329671bb242b8880f0474667bd40e05dfe5628e09d2ef6678e9cc040358ae7f5f844cf0d21917c0725833d4377cb766c806e0659b338a37cd19d59a21db34f4421266330ca07f9c1b0ceb55b776020c17c813f9d8caee8d05df5ae258072fff4000e755ad859469edd6094e29903dc15bb5c8a7571eb2f063fbbbbb937c357a55351e5eb6d6ee46af7a73ce3b770d9c6110a7e7633b9b0b719ac542d462fa607ba303cdaaae7dfd316a3adcc694a3bd6cfdc067bbe2d425bebb4a7277770e9bc8ff78485baa4ee7acb2ca5abde5fd7474ecfc0a7c4c7bc8f7971f896a18b2342cd97e6fe6c8f64d798e63013807b001a356024b61b054de1a6b19433adc90edc1b53e7f36127d98fe9b91cfaac8ea9e0b81b9103acb395acb948a18c8c805187668f606b1ec8266697877eecace4a2bbd55a3dc4f30122de00076feb5b9ab0fe15ffef45d083476de173bff6eadd4cfd4cf84d786d53e84f0da307d3135156a1f6784b77e618c36a8f0149ac2191dce812e04b1f5ab46426b448c3a08731a17eba2eaf6d08e4babaf7d0af5b597af693f79ecb8b4075223431f29ccefea0cfd2e0402247e3504f22485fa5a08e4c96da27d0698073078e2e53a4190f0a5bd160639018e775f43b7d971d178d5d738a915d01a0d19bee8722c3af879b9e8877ce436ed217b116ffa5d1d05775c13dc71f14b1005e7179016dca67f05b7e99f210c6ed3efe302d1e5c205a2abfe05a28bcea894e34203714c0614dbc0fa13d43a0972e108d885e621930f20f56ba88517882e1e16d25afbe8aa1d5d1bc8ae09b22b9a72a2d5d13a3aa9599ed44317dbcf5e30035a888f90acab8348aac578583971227d1dcd6db5d6d7428ad3435c163e8697be46b5edb5908655d399b19183d0694f6ba745edb5e8d25b091373ce39e7e4f047f30c98f27c0e753c2bc32e12638c31c628a58c31c6253aa9b9bbd42878e94777d7a40c753c3b7534f8449d9f9d2fa59c2fe7f790e19471d28f3fa48dde61745d8c56f608360e590eeb141f9f292811ee6e779943a93643dd368eeb3acf33cdc0e0e974427d2f26f7efeefed13a2bdb355233a9544c0cc7cc130c4c4a2625232303334346e6e593919141c99c4c3232325c1733f874777777770fa13d42beafc8773f8fc23e4a84854e67c6f237c8337488cd185dec4ec62adbe5a49a0c3ee404493b81e24dfc8deba457fb8b3726695127d497fa66bed40c90167ea46aa0606052294ecdd3d7ab1930a89429272615131303332326e6e58b898941c59c4c31313101f09a745dd7df7ddc1dc38f8def1e29912f861af9aecb88cc496995409f468d7cb57a413394c8478d705da53d1fbf67ca89f186e31606ef477d3e0e9f12f93a540dd4a34c26d4f8be979719a69c1a5e4da32f7524c3cc8079f9605030303030273ab331bc3a74f6f2451799ddddd999d946f904cc65b6c889a4184ad145133a6cc0bc73ce1941a97943d1754768c124785d1040c800bab0f1c000a9a7cd6c2811a16e4364645512137762da94a894133f56b6eeeecec180cb41fc8e71ebc1dd6397e58b2894f5f096c07259f0774eb8db89b7b7b7370883b72c106dfcafbc40bbc423deb81629bd8a2e1d857ec59ecfbb2d9ffffcc1e71f65abba7ca8065d54bd9c956b205d4af7afcfae7de7ec6edae1a10ce59c524e29432f9461c496c7cc7432738c36f2dbc9fc267f65adbec6fc314763d69843e972ced07dc236d2d5a54fea7043d6c8a76934ec31bd47537e4193dcc716cfd70a88ad80566d1bede357d5ea86e9743279617df91ba83dcd91724a3965ad6df3f58a6a614dfd683dcca9218e5ec9b086445626544dabe075a105bbbd565df86c0d6f0b760b7b685f6958233f5e1254b24e51c20391a51d9a28c9a205b01790a8b8810b0da49012cb42e4056fc84e114fa60c49e1218a2bb09e0b38b1822a473c5952050c1e1ff18b29829003307e70d2451832bcc0021b9e2859e2411086cc3806244a5608c1c48c06214d0879e1013770c193256168c1831bf8e5238a17645c00834842490a66c8414f165d7c2851658b2a96387212e58b3204e042c4224a0d65ec60074d90901184174270610345aed0a0430f93299470994d86aca00533307c3005103c1c2c15c1049132863c41868fce85e843063dcc8498cc9210a2618c9d253f44312083e848169ea538c50b1d57940f194a2dff8cc5567d9e324bc5acada31692e5f0fe90b6c891234992cca0201b7fc2424bad8713166f38bc3a73666baf24e7f35d9565379960c3d250cee2cd0cafce84591956c9cdf61f6ef0b8bbbbbbfbfc68f299335d82399e05259ba5b7958e9fe5189fd7ea0ceb905aa082b75af03f406cc97777d3bbf74eb480113477ffcd7d07f52876099a40bba7d36ff3e76b9aa6853df427fff6dca989f61ed8843bae497d5ac322f27be694f2a7ec915fbf876adf53a9e6d4a74bfeb9c34e6be8a2aa8b2df878388b0f105bda772f7f4542b3507f7ac9fd5dc00852011cde10acfcae9b04f75e9e8497ef28a87a01ef53802da5da476b7a0e94817b203b2eee35d0041c78bfef5fdeeb578e03392eecd9bed2e726dc9f400a5e1ed6eb7eebc222daf7d4aa695fb5d87dcfc67d4f17cefc7b8b0bb75a6b18a38d8c1f9f861169eeb86b34e8a2aa19ac260944ebe5d400091c9c38b9f28cdb48668e36f2551852a2627d482ba5152b7fa6d02b293b7207e28d5c61e8bb3852461d113e101950830d1073d097331ee2c41c6edb67945f83a594314a031121049b96b29c119ed55a6bedc641bba9f49a1dfed2f690e18d10c772b8f2a93cf36051091538f03a2dfc206147d65083c9153860241ead563838b71a795af87c8c83f965e04ea6adfec9f39e4d5e17b24c6539f0a72736c370863f6b0881a185aa86101859f8b030c5773916fb596a9f8ec97e7a621587988dde6fe055d9edabbb7b78b7af324877d756ccb9c6adac576bcc7edb77ec42aab295039656146c58eda3263b9e3d0c711fdd9e7e6cbddbd4c95a6b0d25a76da0aa6dda54c32535d297da530d477329447add4be9ae79ee9ea6554d5a51e9d7ad7e57ab57b9964e48707ecbb881a9b631a10b2b5b7c2dac8de56359a5d534d7bcff6d203bd61f69f8381ec6d1382c242d596e9b1ca5cf1b9da1cfd80ac6211dd2eb10ce0d4d07af7ad5347cb7ea90e193d2325386f968d64386f17cb7d6dab18d352218fbb08c97d4da3f332c772d09184f4c820817dbdf5e4424b8cc9acb6ac85763c20a2754354993fc2fdc4c60cb626007f58afb8e7507c312c3502736c1a409364dd2f3193b3b56baed034c4b721b4d1b400d80b081e57737a130801a005183957b563e9ecfc3cbb0da499428f6f3fced41b3151cc9ca77bdfe6959af62316a39ec25bd6a253a06011c2b2829297d93b974ecb292872deb1fd8d77f3bf665a146969963e40284c709337c35f377ec8ef972090cbde29a08b895cf2af40a48af2270e391b7ec6fefef0e6b50903bb677f4ddb1f13bf68a7bc53e5f875765adca8722d504cdd2a078c3527cfc97812c175123fa847b7fa5150ebd3058cf437d3fc1e8ad1554b05e78bb5fd5f8ef58157ab5b224acf02fe187840a5f34213cbfbcc5456dd34f13de1ac28c97d7c7cc1e72c0147220c8fd65623cf44f3d9b787821178fecc551abc3589910a657cdda1e06e63b18eea3896b9c0ff216f7b70615cdf84ede735109ddaaff85f74385f70bef4c58e4e1e0c21b95a0efcda14ad5abd78fd9f587b41eea28811bf2757777bf04993bed1e135ad4d185a619ae27a97b1d3d63a9469f7e3abc7bab813ea4059f9f2ddd66ac6bda8e7fbd5e967e4f146cd4a0c042af66f8d1f8fbb3700f60fdda58bfa0f5779f71f722bff07c91614c8768643b14f7ce2de9b5868f2d77177e181f75f02d573ded376e55235b4155db747f1833d3bb0cf91daaa8f2689694b3fa0913e855bfec9c5f67c682ccec352c83df910adefa3ffaa33f3a61023cea7bcda2bf6ddbf32665d524eba0a09c949a7298b9c637373391da7d05672e100efc78ee97ea95f7ee8571cbd9b84da3ffd90eece12f2f7f29c97d74530e575fe35efb0da4e9f2755dbfabda34e56c7493d5abc034d245d5f6f304182cd7bf40b86fc288163672b1b1892249b6a3de900e1d367cdd8d2df48a7b189ec15e41a0577583a157b5fbc1a359bed5ed7566e456e946ab8c3c7ad53f6bd80ebc714bf743a059ccdc7bda735c34cd6df2d7ece00b8219db63be2967cebf513dd66c96dbbef2756678dab97df1ddaf89bf8efebce561eceefe3e1b8477d839161859e7b104c807198c7d988785188a0a4e67cda386af86fe8ea55466119566517ef5aa86797c7ae55fc33206ead52a855ef9734aa857fe3722592afcecdfeca6fcddfccd610d0a72d6b53fffe5598daa06871d81b43db884211cbd62662abf69370d6f0b56863d9ac1a6aaee4a9bca4a4117220e0b3a9c23e292855ef91748d6a9587efe7cd075d1ab60f7978b7c35f5776cb5818ba5b1912816b3353bea9bde145ed3d7dfb19da905f9f341207f46dbdd8e9d99eb9bbe73538efb9bc068b98fb68226446b7a1956a7afa3af09d1f6d0911f8240fe7c37e574fd8e8217f4f143da186fe84fb007ff7c25cb96ab20d9c861cd0ed95eb33c7aacda771cd8d603b98b8dcdba418458ee5767b7efc0ca81d172dceb687e1b46c0ad6fe0e6c51b7e0d34c59bd48c871e6b3d4044784b24c1c40d256cad499fb462c15b499f54352d31cb13732a9b37cc54db4b54afe68019474382ebc6f056e771347833e555538d3759e8ab599752591da388efc6a4246777945b19de12580a745a01a53d5e3f67c34789a04714cbc645dea2eff33d6e2fa95ead787605670c9c3fbd42da81b482065ce4f374389d603895ba18638c318620869163e4c8d1a54b97eeee6194dc4474e1f518a58c31c618b28ecf983fc618638c5d643645804dc0618a0033333333b33b33734d04a6fd1ed3a7ac9b38afa05b1aa63f7db799724e753b6d26eecd07cae3bee3d8a2bcce721d68faeac37b1782bcec697b0ef4f1e3ebaa29670b4da6186f0cb0855527e5d31390840a173aa9135321d86bad35e42427b9aa3dfd7e39b95ffe901bf715f37dc7c1ab82f50abedbc809f6fb943588dc91dd45b03b3337f7f80ade39b37506592098b88aacaf3ba621e49b305b5730914580b83a85b77a33ab7e0204b98d17deaeeacc191f413465cef808a223706c0400e752497fafeeca6a7e6b5857a5ac4b4d55a3eb7c7bf7299d2d074699a33dad60ffa4a1b20594ee9dce3d89dbe186443064b9214bd3e5e386da886fbe7c36e5b03f833adc90db1d314b1244b8a19825892175a80cde5e82b78497bf07b03ce3af8d65d0f2c9f45fcaf2a7c2ef5b829ddf7d20dbffbe2fbcf26bb4735e294d39db6bfef2d2e89440f905a6440f2e512d6d5862fd9dfed0d561e9e3c081b3d50daca026410afea052eef85eaf97f59fe00f6abd4b972ed6a3c9236d0f82635eb69301b7a75cc224c999c48c2c943412db2d830c08ce3ad8feeb6aa5e17c9749a97831e2c228de784954f39cdf374982ca1c5b33d2a09ac8ab0b23fd6b41bcea76f2241bc716bfa24d7f931528a389b10ccd2de8818b922d488c843e2b46eab2160c6ec33e006deebef96f95e3bee3366ee3366edb36df42f6a14a894bb5a9f82e03794b7b060282c15b5ae851afa6f839046206620602ea959cf2ddb89402db615cea983b8da2db2265777787f17578a9855e75eceed857474a29638c1ddee895571c1c375675e60b6328ab9854b424f1c590c1e5e3228b1426263e98293e3f40383849f1bd64610ae2e3ae9c78f8ea1413966ffbc12485a90ab903a5d4082ee8c6751db751d38b0baea30d67e70824a5d409a53407a69479666c64d516ade0b46e29d8d166fec6d9a9c5d5941b6c86fae4c8ccc3978242e3cdec2092074a2916520687ae255dbf729e724e09c5276d24c2c106225f0c1946be182990f868f8381b896ec80187cff4c487aae1d3b60cf1bd6461c2e29bd144cf77c37702e2a33612fdfcc86923110e3910e9ba291f3f09a6180620bd1e800d84d784605f2282fce9b257e17b28b324c67be83822b86d051c638cb14da70eefb5558bb74d6b3612e180e4c341a2902c8d59dec248144fecc015ffa5e76318d89d1e644044ca1231c8e84188eb4e2523150e9ec08a00a3090f1517438939240856b6873f3f7d35cb3f45bf53a167a8b30ae7928753696ee9157fd7836f1a4d2b31966717a82bb30b141614159415dba823259490126a085564fb512f6f6933d82286962351c490c53584bd281806b428d173830e8e2c8185eba25e602f0aacc28822234090c24a13d74509612f2ac8f65fd40c0525ca1851b8d83e2d0d7931b4c5e8746484649464fb4f40de7200106632a8e2055f1cc132b3f73404d00db00002133fd052e4baa720ec3de9c8c1480ea018c387480a5cf7e4027b4f45b6ff9e8c4e5666915392596489ed93cc76ece463fbf433814c4b13e8f49a402798ed370d790b034b32213cf0f0021b7a9ed86b2a321d518124890637d8c118ae6b7262af29c9f65f939269cb1553942b262903b0d724846472826482a26492299980944c4148dea26162840e96d05086901bb4c05e2f49470d3c80e227072d6334e1ba9e9205c25e6fe947281646d26c0a1610b9aee9f583bd2698146dfaf9c1bbf203161b7bbda319959915db1faf2764bd21e915dd40a282091851802146135790bd1ecc7bc1073bd020081e1f6465b8aed7c45e2fc8f65f6f66db83228f8c218f70f1628bedbfdd92947558b408122a72626f6704e3ba9d1530ba2460744b3a9feec776275be29696ba5707f356ecc11640b0e28a1d845062818b05f6724539969cf8810ec8486a22735dce6805f6724709d8e1a70788285a4c29c37539241fece59238256ecb152eca154e0ae78483f2f6724248dc1224ce878d0ba322208e7eac0c89c275b71eecdd543288a28913a4259eb8e2badc8b077b39580ef67231ce75b91fa2ed0ad18665a3b259b1bdf1df4d8aed4d09dbbfbdbcb553c3102ed062c30d7e800312137b37181099c111413082079e185c778b59207b37590ca6c8020528e8628726565c7703dac1de2d689bb53ad7dda030198309172fb688606f5d0aaa4741484140deda71b204831b40e145164764a8c0de0a43810f5690455010163dae5b75b0b70a2d01450d4f7ac0c209315cb70e2de9bfd5a85a712135890ba94baa8fed1fdb55e6b025dbb0fa7218ace8a8ff6a4ada962c5a942c9a14cd496b42491a5052d29206b35accb6f64344af10512c940ab5629b1e7511151ab2dd30b3295c8270a08288904b89bd74053374e9c2031d62a0822eae4b73b097ca70c4a0062330f0c1c91049b82e4d622fbd54b3973693d94ce6f4c276dfb914348f82909244a0a5c850161d6850c30c2e99bd33e8861b6421a30761041d99c275e72c05f6ce2a488c906038f4c0881bb8ee1cc2c1de59348d5eec9d565a485cb510cbd3c736cc6db861f3058b5978d0a2858a229cd0c007d70df6caa2230468e1c2ca961ad40053e2ba12e9a7af54e2ec955ba29051a2b07ca5d091747224a12449599204e24e5a6212f3a2082117844184eb3a127b7d49c29ab057c666d82b7f98f8152696fbc8761095202b422ed44231084664898152161624e1c485027b1d4601289e687142e8074478e0ba1e3b62afcba8e0011238d032c48b2958e0ba0e6463f67ad0148762bb488fc145da8b2db66dcc6d9282848a8cacbca0ed6d2c1ae824bd42fbd89f7eb5e036ac05c415ffe5287601526cef3059c10c4882e842890f535c36d8cb4547493ff096cb4ea05c16b21c143510596def6619652fc76ab097613b4fbcc0c10f428431c4165db82ebf68b0372e49208b94241b7818a38c305c372ab1cfce1143422cb842e449112870f504baf515bd08443811c61625b2173861e4051e64e15203911bac1cb966d819e224083e3e57b63801c5d5456c3f4eff8d2e06df9d4a7368e9bbd328079fc7e5f3c6f8bc2dbe2b6796dfd382df53fa52f05da7e2bb0eb3fcb58b6f93e1bb5d64f9abec9b5309fbd9f9aa55b770666acc05d8eb59bfa92543d8042cd9c2ba0e3b588f9115ad94f3ca771b66f99dc9e7401ff7828f13e29b924bb073fe3791b0f36fe09853e94e25cb5a585f6a96d266e4bbdb0cdfb6c367c5d755f1350ac9521286bc78ce39e79c33acf1a6a50c810471f5d079414c2021e820cbcb052448cd0cae27352874cd0e7eed6539ac69027b977f130f83f8cbe5fdd106612ca62c61e4f2f009fde1e970066f8d1d908b0392f0353bfab7dfc2bb63757873b15d01d5650b02cf76787f581d8f5a3941b61bc8802a2f187275ec351037c2451425179020d18a2e416688813453317794f1a6873069c1cbd520db9d2ac5c7b684307480b96a5270200de0197279b8e3ea2277c7ad46ca663b10727515d80c40b18a0dac0cb96c8002042457d79e83ad2a9c0cb980e0508248c81544220172c556409ca7bbd33a428725d796e5e39fc14ce8e58a5f9901ed2d221c802c8fe0c26039fce156c610838dbf09f1cd2eca15ee870d08f22707140e364832a488e1e28629303f3ff48621db4f171b5f461876f7ee6ee98ad1dd9dc9603066ac59fcb1bb590be699af1f11122eb685f40d1a4df3ebfccf08bb841053ec14c2355fd5ade89a32ac51121de1e208964f027551d5fd35b8193eff7a35011ede56c5f7fe35b135c3953b8d6f8caf8496df47a8d84874448a45808d444788d81376c41cfdfe5d83d156dba6c61192b9a009253090628bcb9f840d3499400aa0e40a520025578c29f0ebf57abd5c33040ba0e4ea09f4ca7bf541f1bd8d4b9021b32da168b5f6685bfd6dab5a8f1594baffa04fa8508c7c371ecd78c858c6b213e8f3d3b066c77c3a43e6e1170cbdeaa209b08c67b359429be67d77df0f2404e29966f5427ed50c441755f746ccd6ef50b2afdf45b0dbbb7ff4ef5e474f19e3739e17398e790de0653bf7c4f83853ce26c657b9a05ea99cf4aa7ed04c25532de955fd18638c9b189fb451b39b181f8ddf45f9ae2a49d5456cd1248d00b3750421b6bea8c0b0f569bef881ad345d6ca53488d8fa9b938f3efd4b937424146dea572fbcdf91b754416e53ff8f6cb591c51cdb7fb256f205adea53f0ab41b6aa829ae57d7d9513cff3549c1231b82e5764bde78cacf7623d95974aa552a919335057e62cb65245fef348e49f423e87388e431d4d596cbdfc8c35e680798e79d98e82eceaa4cc39411dd5507d37359969e2bb2a215b554252aa11118b65ee8a659b23cb1c123630cb5700572c0be0c8b23774c5328d598b26c96d82aa883f968f681ca1216499c690e5b731147398ae8d2296e9af0d2a96ffaa8e2cffa511b34c4366990690e59822969f1b8a3938cb1ff38a39602cc7c02c7f61ebc7962a29dad4e78f2a1dc4960d992a0c5b9f067d57251bc0cbd224794b95a43a6a960d99aa8ac8b2a164d2a892bc952ab2216b56eaa86d2889ac54157155297d1d3d53a492d9fa2fa0084b6e535345deb201739ba3668900464c55515345b626c51b3b2314416989cf862ce6f06c7d1b4b9a35e3eb03a028e608c1d6b7518a3960bece207b554936640380191157f555495625640386ad364bb64ed9ec6cc884ba88ca88f9f5a34f1b40b6bec0ccb006e6a39dcf30210af34dd2071f0af4e10277b14dbeff516d93171b5b2bbf50686b0a9bc0def5c1aa8be709ea37530ed378d136f539530e871d4d922987c68b5ea5b2ccf44095c5d6242f9a85fafa2aa566f1d7576d31a5b230cac409350b654464a13824ba23b67ee7798f42b93b777ee266c7dcf9cd6bb621c51cded7e784882c6f889bc51ca6af1f23cb4b22aeeadfc963e7cc864c489dc51cdcfb60db7160f7de507f7d2f89fe6a4366eace2689cc56017461eb5f1b320124c59baa4a655125c59bfaed8536334e3eee7d304d52ccc15fbd50c6b66d636bdd421164f1a6fea549b2f5aa926cfda8aa618f1bb1ea3686a091a156a9556a955aa556a9556a955aa556a9556a951166d669771cd7cc4829259552fac46e52ad8339e2630b8608a67f45b0f16930ebeb95d3c41cd25f226ba657fe1cccac577e8af5ca59272471e53050d800a95aab56359899b74e416ee3bfc57a8524b236247175b255820bc0116ffc3970e5368ec4ccfa77923bae65779ce974e2f68e32af7883ba340c907f6958aefbab3a6d627c5b4a4606999794936a496228d5ead6bd36e336bc799b189f67afcc6be3ba6db60135ebc6cc4e41272727a11828cd7ad97e4e411d83effeab6ada94c34e7cce2de99c9286703a799e46356d6a937a267a42790d6e96594a29a58c10991840191e199fb669666f13e3ab8980669279c51c9c1dc1b6a6e4ab1152f38a39ba86c7c2cce8d3bc628ef952d62bff9392b872984fdd2d3685c415bfff49c9e47121b1f9f23631be8e86103442685ef146e625f3a2318b37de5dec94effc0dfa2bde70b784a473d26ec67b49f2dd1182ac3f8d530b4e41feda7b0f906549a9467332f56b54d3a63629a51d839ceda27c57e6250333cde0a37f4f41f23f2d3e96c1b6dd12df95794d4d9bb27bf128189be8420b069b7839d8c69b7580b8421259317a2c222222d181edeaa27c324262eb14146d5e3240d6659258973962658a58ff5310b1957ab98d7f2dc27e53ac87a726bcb02685eebdf742202b0e64178e065330b7f1ef529eab599a603cf9303274a99494deeda7d4cbb539f9b8e7fe9e82bc1533abfce91059dbeb246bd669890c71e52fbb3484b0fe34663147bfcc260387efade8f2c7c1619965c0cc51f9e4cfb832633a27e56a6262644298c9614362fd6f8d2d1657fe97c6c6ef244bd9b2393237f76242175a84e069359a26f39281356b04eb2f339391d2ad8a24e32333ba3241acc8041220192024244bd82b03452666afcc12ebafcd104c3bdace78345e4723086ac29c9399d9fb447d4e50dac69f034f4efa04041bc0bfc1d30ff1c65f9a22c0590eb5241ff7edd25e72ddb6d8fc61de6cb326fbb829a5b4a3f1645e5d0d6f13e3e3a058622fcc4ce63504c50fbb22511298f53ffd34ebc5fac3d0c007eb0f038568079fd34906336bd6fd846232b1665d9899f5bfa7201828cdaa695624528116d65f86a75bedf2bf323f0ab017468a75ef680e2759ccd1bd341cbe4894c4c8de2d967acd388a39b43f05c51cf5fdb7986928e6e88f990961ef16f3c1bec9acfff6da78628e939378d31359a72771e52feb7f0a3a059d82a4c8bce6cbbc2615a9978cc2fa574fa3e9e94c393c6082e2017c46ccccba0fb6f74f41f1c6bfc31947ddc4774f41d6bf2656f3d3ac19b3fd917b31418bcccbfacbbc9a5586d5c217251f8c8d4ca02068c67afe44ee34c24c6b1f4332cb776312ac799c00a2c8c5cf42ccd1ac85fc9aeda39d9c8434c50793b246f1b1e0ad6620be6861ecd29e67c803be7e74c1d85513c39a0c38161d20e9e2d23e03f46b78822729d0e8ca800604480f3f5ebc5c5a5813431ef5b5fbe5e8f48a1906724c067d2d842cf4aaab7c38de626658b46119b27fd7a060c3c697618ff86fa3add9f1d6ffad873980c1910b965012c51546ae1b43153ae4216d0a348b2357ecc0c61823c7385d1323d6ceab95e8b2a3a366f07d7ce93424dfaf8cb417510a66405b74434429588a9d0d3674de834e6ef1c58f9abbbb3b4b2c52f4a355e05ce1eeeeeedc48eeeeceefce8de41c45f595bbbb3bcf5ce1eeeefceedc5578d3c3c2d99bdddd9ddf9ddbaf80626646f27044e98aea587e509e3fe8156ea87243564a902560a13320a31fe8ec8a58135cf0c4aed0514d1d15961f9377fcbcb2922b2c4b32864411cbafb4a1c0872794ae707eb915b2b1e098e1831338b0a49af543c62169c58f9e6dc59ccd194e0c0e169f7510509058fea8048a48123850221ed52e8a18c8e2d115cca321718931cf15a999c222b768db35f0de8a2e36cbdbe4dfb9f71d701f5899e21c9ef1a8a4ad3595490dd5108d040001c314000020140c8985429150349c077ae40714800c85964a78509a89c328075218328618430021040000000c0181a91251100050a0572069dc4f7d9725b0ef3f1d601dd6d4a87e8156b0a12c7a39082d264fa946e46caabf0cb6cb59dd061d0da17daf0f3f77715a2cd25a090804b7fcc8c7d8753bb8fab661b1f76baf35612f2b53456bd3ccb5d883eeaba397656a05fa0913781d6e0ab3dcf088a43305619ec38d2c0623044f7cc3aca43affd0358fa3531654954d916f53561d6cded927abf70e9c97fe9da186deb79273835073150f354662cd5c007ce962751ba4d3e3ffd92be86a6c8c17d2f3a963c2fbd30497cdc65bb19e8286468306d07c5dd23d74b6c00f85265a05dd94091f7474adcb4c0215a7f74f9b3841b660b3e39d22975f56ea698a2d5a4b5d85bb4a3e6dca60a50e65ceef02b94299d4c8252fe2eeac47729c622cbd313ecb9ebcf0ff84b1a2d171eea4113001a7d713e72600d41177c6af30ea9479cf835214f4ad3110d3d691bb4a457c569887a48368465e5aa281439a4c79c4c8840de9b7e7c0d86ef9cdf513eda9bb5098602ba661d5b82a4d7702071a7bc564e3fa5bafd966f6df45f0f797bd4256b86b66450c776591a07578617e5fe50390d6d90a09207e66817c9b231767a2d4836635f434d7a80f00b5d1261494fa4949ca1c02da9eb305a015c26e0ef9a0f06cc2daa4b95bcb85f842c92e5ba844dca5ce77d0be8f6804fa44313ffe5ae5d403a9ca5e8a374319cb2dec4dfb4c7ac3e0a2c7d2d39d178e17b6e95379dce00a7091a5be2d17ae3d298318e7825d4b3ec9f7c7b6d6c3dafa70a4220108e50591837a537041c77671dd6d5298974a969c378e9864099fa9c2ddbb3138e979e88a0c51922f3eeb13460362514427a4ab64e7aa53b21c39e99d3fa820c842c1ca1e26afacedf42a245b9a42d9ba13816dd4e819dd27db587835c56980068f8e87a24cc4cf0a2ce15f5818b5d9e41e3978af576e4ded11778c176ddb7272868c40f8485c06988f68a78775bc9201f8a8df442837c59af1f8bd8651c810225d612a9f36bbd31dbf41e475ccce050511197742d1ab5dc33e3a46f375922617e81370b691b3491ae689e3ea553ac734f95494b1b3c1c9d4f3c38b59031bbd5f1ef20ee727c335ec6a508479cbf111973e2bc4210e8113bc0c9f36528395cc77ad4d4b6ee0097534b097b573b1393fa15d79cc85899e9d94d7f893cf1f76c4051d19ffbf6f57e2fb1f5352cd2bc92919ba321ab5d60704557d361da636af1f7a32a8283491e79b171cf952e82a8a7c40957040eb8d6fb9aa329cb823645007ac6ecf86c8f4cf3b2f640e0d6761dd96782294ab7d680a79a1955f4cfed2b131cc43dbe8111be17be77dcadc61e82339838f16133d4ed7a92441e91ec06015072073c997bedea65e2ed232f0191969f0d70515c6456c3b70b7411f388b88b740608dc780101342c2a4e732a910e55ce7abeb279c02d728e917562175b35a29330eeb268b9c55d2ca1c0db7e6f20a709893d5129baba82c9975c5934f6b26044d9ab51baaeb1bc118e68e343e71c7e3cae3d5391a3d64f5a64ab5cf54e7e08bf3f51974800c9c8c49e27bfd26519f10be2122ddd11cd5393f650f19e3e0c2879b55160397c94f924a4956a423f6720b0d23fa30a8e59d281df4447413d6900858007e8cce43ddb986fd81872496767ee14e191d6bd1c5e125fbcbe3f553af498da25e2e9465f13f2b425b0ca4b02f28e5a8a3f6cb14ffc225afc11deb3757e808c596ebe075e7141b6685dd79cd59249de65275cb56db19c67bbf899fb3f67ba39c636e9fa795cca550723e4d1ecc7dbff6c81fa36d031f0e6a8074a458b71f6b2f8302a719a05aaa6765c442ca914ae8741b378b2b51f6b305862853d61f9df32d1f8b141ca1cf26568ebc828966908728e4e3abf390e2474d00124f711410b1674d3fc5d11ed3c18edf3b7d6a3e561eb1f42cd589c0f9a01494eded89a25edeee59d29380f9264a4785a8bb6763f1740766d7d12e34730621a61f25fbb3c1e4d14c53a75d7fe24efb9f95ca7bd8d957e3229fba005ef13440bb5b9fbdacea4201eda6ce1ee3998e11257c0439c505738ed5f9debca6317eb71032db51c93d3c122547bdf2421e699248a98e0c6b37942c45b914ea5f51a51001c8aab3ba0ac25f075894d82aa754b82b4354a776bc703c79f43771946934471a7b99d0408d973bceadaa9366e666c6050fed70b2fdb5b13837df524a0384419ee2c96a4f70874de42c1a7b0d6b7bc2b70ccbd52df2283d2adfafc8628185515d1a46b4ddb9e56ea8f1cc68533a020533bd4f02383a6140c0b6510bef4d032fd3b84cf32f3b9983471549fa4a07488a60b086b688008e1d75f1bc00cedada21434ed1d098c5f30af42f2d84dc0511303c40a55d99080dcf5921b3142af59545ebcffc3e53e1076e0649b64fdd08439b8e714cc29efbc079cb5fd7203f7b3c74983a5ff305cb0916114b06075ebf3c5ce2830f99e5b1694887d2d0d20798e51d677a36764c1ec80050676426726fc352dca6da73dc4677ffb9fa1afab089e6c7795299dca53b43c23baa91b979979530646538ef14589824137a90f6cea9fdb5a1c9a7022a01cb06d816cca66735fd2413b850c5565570ad191ba1a570ff4fd45bf47884d046d4bec68c63107b723da959cf0bfdfbd642641f3465801e9cd55157c4a693c483917c7ca4e9923c47e1b142745bcafb691f04cc19a90635894103f38cde9dc1c76108c608b607dfeb37ac8b18e1439bd8c41268598489e7a641159d4d958b2829b0b3baaaecfdd12f3218cbf8109eb2c39519d9a1c021c472494821e5e507d6e3352c1e63ca6bd5edffa1e6316657443740fb233a15af120cd94ceb9b6f11fa7f0ba18f77ace3325bed57c6844af2d7fc923ff2131938723e6039ec1787f70e87b5a04de4eeeb2a9e8982546f744d3bcb2adb8a839dc737dfb4d17bfc1a217cad9e9be9187504a92cc0051dce02e3c9e7d3dfedd6e96f5543f41ec6e6c46ca434734c580bf7bd967bd5d37c29a3da6162db02378acd8d76b9919a8defda78656e840bf43616ed5c6d3ee788ce6075a7ebb0ac05da46dd651cb8b4ccbb89e3c5dbde2acc9b083d9c178c50376928184478302c0cf61b11f3ce0723b88b4df0b6e7727d04cd1725a06caf2b12abb4e0119956f5dc15e4a1cc4528aa022cc88c4d572adc9a211f4ced5f824c12d0d28e2afeda42aedda96308c6df04a6c221c767508c665edefb75b6b4bf25610150f5c95132537e3d9bb840f509ec64877e6217f0f3c509ea9a490209efa73cf9ac2525fe8778702deff66e0cceac3e84a07c06c9ac03734956ef64ae9157b50157aafa05d05e3314c8137f651736649dc9ba5e7aaa5088e84f101686b5f1e29371070d8557dd0b71ce9d5e6bbe19f609e279692f87423298280e2aee3eed6ac0dcde3b1644da1bb329e230083a71e0ddcc0226002f5f3b87896b0ae674e218067453f7e1d4410e2389c265d0f6a2b1909cf73ee8f87ed752133a8701dd866cbbedab6d1292abcb0d0895272c3b365f2c8191e6fd782cd9e8c1dcad5c10e6820874c86bfd7cbdd937151d0596a78c4bb5fae0d85cfc173567e3d96d36c7256d94a1441a7266d040217b1526326f07b2b9223b70b9f924507486d0e57dc12893b39f08452f0ed1cce4cee5bccda48484de03ac109e3020c490e1d5afa2803231237f39486f452549e6abc4fc8cc5239e7cd0afb0fe40132e1898f753ae37232b78cc64b23a339d3677d8eafd00fdd6657f16e7906645c0e3c553b8dbf350a38ea5b71798d6cb92126a6f35039dd56f298b52598ea7d112393208bda962093a35c7d38486d72d244de91ea0a08e036a3a97df1639237fff0ac4586c0cf3007c6136ba255848d65a6ec17ffa2c46e390d8b198a660ca822522c8c44e53e7d17fc9862795473ee8e62ee728f491d4c6b9e13d8f057d69ba55a383d7566b0dd322cfee67dd180d0492189f361b462f0ad76fb3708ea3a5080b5633e84aded623aaa99a60c802a4e14542a65ce95e4e2f2f19835a6cbae25d9137e3e98b3829b3a976c15e3fc5cdf81a56113537449b28f211095e434e7c64055bea8f89a3d4dbf08f20ef92274720b3202e179adee540d439b16fea17ec817bd0ee7513da1746e996d99f9b1187a4191b71cb1130a7ac4246081c893dc64d391062747de20a5fb9e5fcfb9d08f1ab602b99c3ad301bac69fccd3f88f2a0bf081719974a91f58e17fa1ded400dabcad8ab65df227e0922511b3a2436d0bff3c9fe965bfa5584caf359a595dfdc07a2ff9c19c435b4be288d95b975ae089b29fca30e01cec0c256b958fe23f7c5390234fd7e168d80c793306e9081e604173800d6683f58111fcaf5e495e5980395eecf32f45ab2297225d39f3d404322a1138a4a8bd91402c8c015937f582d431a43ab535d683ff15d0363de94ecf8f48a234e03a06bc936110fbfef6b0830071a2c19dafeb355509bcd12640de70e1ffe0b6595ac12125c722dd12d4d9ed07df0f7d6c8999cde8a6dd7c382778ef9445fa3d33a0c9a1b8944463d2c2c16d850f027b6408de8516c90f7f251ade105964fe4aac2fd32e70085249f40b70196d2647e789a44fe002420b6f5b4efde6678e697a5725d2a09b40821f6aba657bef24c82570cea21f9a615dd6196831058441a6d39940f2f8cb4570a33e86ac24016bb20b858bf25ff904159259a216297154e5ecc727671638d96d5c798c9278d1854d67dcb81c4b84343958d8caa74bb869a925280c73941bbe042e8ee778156e50694d8d973fd448a5d64d3bac98fb5d67adcf890172e8212cc7ba9e0b51ace11ef9734f5137483f8fd29f2576938b86e24827ac33ed6fa61c75fe5037689651106151b34496117c11aa6f78701d8292ee056ba555b4b57089e6993db4a0abd8abf6bc54f6424a5df789a3d563ae071f307f617248d6970f10281499c7ff1afc81a9a5692f1c2084fc39954dd70c326f333cff4892eea490f343b5022a9f5a6b5a06d6103c0bff359a1e10738957a58a0383e2499ab9e8c9be8be36fe2981d5b44f7a365896ba6085c5ca78f28b5748b594a623c93d69c226ec5c29a18ba759add1bfba327c2a8517ae7059fd0fbd29d5b6d232a2ea0d0b1753cf4f41882a9c9883785cb2e64c2b10ff027524403d7294659a69b49b680cb33e408016b8d15bbc0a50076056a5b252385c31aa0b7e9aa6a78615574d939558c341e46fe39b53263eb8b84fc850918f0ddceb60a1a93595eb61be3084508b77283e2b004a2abfa0c930749b9c21dc49ad62b75d3826cd93ebf7fb45a5895850addcd9a9176292ea2901c25153ef81c7b719b44a7f5fad71ca12f819daa0c8f05e3cd1a5e8400c82603fa75917ddd0e3b6f711ed130c66e718c37ea0a207372c2aadd4ccb5c3aa937293b26ba4bebdb8b15eadeecf90fec5025914224ef7f95e5bc59cb5c15a168cd482cf8a6591e4e91152e99675eb9236cb0e52ddfcae09aabf31a92472a5371c137f4dd867fdacbcfaf2e75d38ac3da5bc72e119529f828b11737c4ae4c6ee13af8d8aa673494cb2f9a7fc411450d247e64081bdc9e495253ac281398264e416e3ddfda0795ee8fc2089e216083a4e876ae162f952414f5e2cc912e64272c33aa31413f8187d322a0b1fb991927ed5f4fc96decf10f813eb68d49a70d86d0ab11914caad2f99fcc3880f6c813e658dce0a5176f9758402022b019d64e590b5458fbb870289f094382a6b349e6ec174bf59ee70ddef4c54a0e4e55775872fe2d65affad68c05d1f55c7a4b1e58101e686eaafab181f2f289648d09e4803e222cc6a58c9d8dc4db40a68e0c0c87001a91985884ba23791a326916e1a1517e49ad714f6581c9fbd22fa0e94914172fc4b264092be11f77b127e21cdeee7f7ad88c9c9b128ceee58f08c8551315e2f3d12953f4ae64d29922fd48284ad4e204c9bb5896024ea662d3e66e9c4cccc092004fa3135fff36737064981ee96f96c8390844152889f873ee74240d7e1702a669114c801ac8946aa301689156d3d1e42d269fd9eeac6fc80fc66957ce3bc91473b3048b6ad069def7dc77b937f6ef4856f662349d4c7132e0fdf8490eddd56498e8809bcc2b6046536dd2cc110fe3d2ae526fda0fd2523703558fb181d9eea848196fb80dff40eefb2de93d74bc58c80583b2aaa38ecbc6e08b7c75f9d383b94b1a6a738c5a87572ebf490c3d534a1def59e2803cfd548cdc92aa8353857b41bc31650233d7ac22d1c44348ec789c301035f13694a976d09827198b4a34d21a471e30696718f71cb23dc9f07b68273f3467856ea6aa1d5a669080b613a6720f63bd468a08fcca093c1735f76ddd4840f211ff636e1bf6b64a925098e89dda8a4ef8320f338d48c80d88fe607e3755d3537ba92173079c70cba371c0beba7eb1cb0aed17f08ca31f8f2b2114d8228cc1fdcf606c623fc25a1a76675317a220530e3bbe2ae4c7784a58de502a75f834592772096fceac580a1941c836f2a342d13d5100ca9b8cade53e504c7d0879ce36afd845bc5296586abb857865db98404ce31a6c0fe1c08775d004e0528422d269002382d003408d5b49390e8a308c28ab7c0942cdeb651a0fb1e60e0a1684565db104a8b860676d34cda0394fdb19ef42f904c1168b05c43ee3e170eaf7fe3f56d1aa5af9957eba2a5b0aaa777a45ac82674bf08f08ee5a991e480a297180a9450fc197d64feee7d86d45d751eb920b80dd2016b38d5083dfcb361ba921ea24f44ebe908cb6dfcd0adcb0f090930cd5db5ee319778a04c7ad5942839a0205e00e5782e967a103b9015e4010ac7cdd9b43f0e2738eeb2eaeb069588108fe260e5b8c5f6ec65cd4219cd012a962d53bbfb84926986b83ffcfff49efc5c602f92319334f73d586934dcd660190be5e6e45f08707f03e25c48007f6af275f2a29955cb5dbb29cea9d2cb3ec74afbd8f862ae887e4076560ed0018cdb5d210103f25a591dc034bc591d9deebae674d663989bbd14d3dcd147c967f70a4a6dc17b107edaf6ae04bd64f221651bd5122f6a98864fcffbd89d694441032b58eae7cdc43577e620c95469545a7db127892b6747f21449cbf8fa00a38bc3fb93583940f427dc2c6d06e22a409a178c1ddcc8cbba5212b07d14edfaaac9a7f71ec4b0f12836d822b2c1b49b724a88c456d7b54dad36873922a597243a4e7c6f2f417e0421c513cc4ca83044a86b76b8273440e69c10aef7a14be0b4bfb4082b431f9bd84413b27730c2c70cd3fd35e92509a8e03c8bc088a3ec4e2f8c5bb4f4a72bee97dd031bad2fb9142d526649522b5c5d97946dab3c01309a61eb7a5ffb9c5f780f78ae5d6c2e2f88e06c626ca616501e5b55884829224003f11022ccf2d8d359fdf7cb2aa7d10b823d56a0f0e5bbb4366dc3325139bd6dd935716489232e4ebf7ce8eb57d55d0a2fa5911ef9d1126fee3cd4e4afcaf5082dc0eeaa98e7d42223d3e5eb1f77fee55066ec51b573bac3b846c1be58dcede8afc88a0970ad507befed3dd10e3954d394e565730dc6768759b4fb9f05850bc1e19d3ec68267dbfe10f210d6870ab04e91ccf74b5a91be62ab98be8eaeb12c5a8aa0dd10b3bd4f570e8d04a7ad5cfcc5bb71513736b2baf1225b66eab355bb0040473f4a6cd3be3d877f0d1f83f654262be687c21ebceb8887535f0c1b9ba064d36357ea26d2b2d10b203e0ad5b9fd0cd86dc915d5b55c5734e1009549fac94267ca4647f983b95577bca85f919f843c8cd146b0cc1c01d6688e7f3bbe42a6efc5bcb511f730fb2b4d1c0b4d37aeea09284f99d9ea6686dbbce5ecbbfa3234d0b6e16d331ae8f3bdf69d54c7731e8ca36c0d6815a22e7d30d26d43e9d5f3a9ceddc64b04b550615b5c33c85981af1c25d37b96939a093b6a6ac4972a911afd9be59ea41a5a032efb8bf92ba6344ae2de470bdc25423fe8809f46a406cf52842d65aaed34463d422bf310ad4b82e348ae0a09a1eb16d46f6eb591262fd9887923bccd9bd383bd65ddd8221213425f206ee40f09f59500124675d586418fbc464dce2b133d20614b906522a195656288061fa9bc5729e56ce2bfc128930ad6f2625f7963790b3dc434bf0dea7682edd725544f541b472a9663253fc42195b33882c2edb2eb9b4126ee9f7a89d22db067a11c632df0636de12497e8262751ae72bb1bc406917966d964a889d1f82f665825281a077458ec4f94c66adb67440a9ec6557fad10cdd18bdda12973cd7474b5564260a301ab1fce48c8f01ffc99b9b9e80addef01c4e57f4f980e0a024dfb681a8e1dacd1103171e08ac0ed340977cc5a564482e7d5a66354c0be2130fda9429bdeff566f0fd53865f48e6e8f9a5642c2d72a035f0d9f2d321c0a3e19b2e54eacaaedc719e2fea78ab3873ef560145d0706fcd40264153937f8a99e67507d741a047b1728b043261289e379a8969650cea768ec0e614728824c312e2c116ecebc9906e0ef18cc8e5ab7613a71837a6c1ef830f78c51d2ba3aa0a4cefbbbba93c2fe755d1b449d93c6c6cc8ba8eed44b4f6341841fdb431d32c819dd26220f3105432c29cd48eb7135d355d52cfbc34d172ffc1c6e5833a4531f76f54038868ea4ccc3b5ff01b42120e3007bc1ad1b6ff3500ed88471a9499c174716a2c71ab22158104ccf025460f5797d854524acfc125e455611fa54f9cbae95b7e41bd374831a4bcd78aa0ccf83c1205970d3b4e73345fddbc1a725cc2c73066644e786f7e180b6737f413a3a4183251145496779caa6b243757612b96fe2e84bc6994f2ef458ea59ff91f73a6b5f4c642a0aff8599a303b77a3cb1e502d6576274174b1a0ae66c658b9f508b5246e4134787d3ee7cc24c2be887825cb9db9e9f932b0f5f6f60777a2567d445e788f8fa106d91cd036a125c04e24941e4fdff1ea5b02c9cdeb4e3fedf6b6781f45f8caffadbe4c52e1e09fb565970e5991d1f7e040d4c2ee430a4a780bd5217a8cf2b5dc8671a64f7a6a657e452b381714f951eca32530abd0d8337a3d1cd740e88e3e09730522625b6d175448246deba0106542d59e0f0bdef7b9596a7057906f72ac5e3366a81f725af7cbda4746837ae2cd87af06cba177ea3a6094012cf37f15730c4649f4170a8cbe074edef876e24c50d531a659c35e0dd80c66adc0f73de7803ffffdccb7b1ee8f3208c36c975b89b35ba4dd736942a183a05646cc18443b5dadd16d833163870b65214a9149ab02305f7c7f0400028942598da05a4110cbd8a2d2a1790f3b21ebe626e2562786972704fd45f4f5987c53e170c8df9932e1778eb21c1cce53ef3ccf98ead104ea5460cb803ce45d7e3e3accfaa038bdfd6d31b67b58453457cb55a5c76f7a43dc1a112d38448997f6864481bb466718252cbc3bc7071c44a95d6e5930b22daccd40d2216cfa0cac28a53ad74bafc751b1c3b794b119bafb6b13e2c020632e16581a5911d7002432f539c4c949e2cd530004c020a6e449e05fd5938e3632ff2912b9d5d916f728bf1e1c40812609b6be36932e955d5a4349c22583ec6fa8769efde7afbac31e4bda1ab2f31fc0f160736901c0b5cc0bcf9303653410d140b0f5e094861cc41bdd31051bbfddc58d91be3f64e77a00d5b2acb3900a2ee3b6f16c5f7c2aee0741366893fe4a067b9ef68ab5a22feb9b58f9746aae74331d5efcf8c8927ce6e83c8fb4192aeea1ac220241f598b619ff72f4656a5193f9524949f31562ff22ed51944a8b0fdd42b8e70be9c386e9099d740bd62ed07fbe7844a33011e3b9e8b2159238122cb2661cc247e7c5a945aaa17f6e545f24ffd79746dadf7602615e72cd2e629ea6908ae26cbf043668f0aed9dbc496bcbdf3450c4fb5478211b7c0121aaf69c30bc61628582d82aa64fc45900fcf1224ae1e96b18131246371cc4ba19ffc707eda73575dcc937afda36aab89239eb13d386780eac45c6f5cd0122176b8d4dce84c8f61cf3762b5c323acf1e5634640abd099b1537b19d748be2067b088e680762d49096db1dcf9bad3584712193d7fe0f03f29abd4c8f7f3760725526e6b11eaab8b66b5f1febcdfad34f5a5901ab18acecc96392074cd56a56d002f04b8a376a42c9f125de92020beb0a687cc8cb508cfe1c18b39bcfbd9ef2d08e1ab60162e743661f34c9dc5cbae64eaf153ea6731992c59ee5a0cdd084276fb533f3bcd4491f5f8822e2f1b06f0ea6d3c0001e4ec13292900831701eba23fabd09fcd0869af4b380c1bf0f4bb2aaa0efcb1319c98c9a7e62b22c083721340d1a51136a4eaa1ab2b3effdc30cc74532815f540e4f5ebf1da1d5a2761474c9c0cb8646b98eca575b1611ea29340d5eca9208df3d2df869fee2089a7233da3291d91fb9d88b81154e1535c2a5973dee9c380d5766cc025a32582b655abb4a500132cd4de01b3b9fbff821ba07b0f5a8d8baeff3a15216223f247e22a489ec44f0882fe2caa4e3a432d78310c9e4859b92de2f2641edaafdbc28731bb3df5dfe3e34f869f417833236b29a734730d8184fd9760147b87f9cedc4ef05fa420df376460249fda113823ba11f974c7c152a03b9cb82fdd3e6d6e49d39ccb8e06ce471391c8b25ba24a68f0a7de5723ac293a197f4b50217db39c63730b48495a6f3a725d498ca0c4b6062e9eb3a84d04f06e69fa87301e933414e5a242c68fa88c055fc6daae6310d2e08ba26f646a8e120262606ac707f6204de0a888a8309c26be1844725c6e60996e28e4e8262a06960fe6221277b0574a5d687726f41cb00a30ad84e70a072c797aa6beebbc2dd09aa6cda4eccb102052ba37bc8df76babae21928d2b8e72bd10cb6c36a5da297d522b57c50ccd20722ff91b2f274c22538e4836bbf38764809a0cb0da05617b59d0095f5012d773e65b283bcd5a44e451b6e132fa014134d509b0e65d3ec13a2deea1d622e9f97ed494f29f7819642871417044285d84df877bb0a4877065593910e145a4474f69ca936d727ca38bee15b5e1cc73850671b12f1d846080bd231850dfdaf17a2650ff3e0627098e3f2e134e35203bc38e8d807a74dab008aad758c07c70b162a930815899ea51443a61b7b6c8a90c589a88a82799a014c30ae5b8be837d057466844076895be57dd71b021fc01aaf4d132bf2c4ac12f3415d73e68907cd1fc1fde0c5d09cdf775702d90ea871de94436d1fffe8121d056522776a2ed6d0822f06beec28f16e3dda60c6b2ba5dc76f2b7d56f834146b8b81044defec6c1b7daa684ecbab72583df0e4428edef708975ddd0b2d6b79d80a48c3498348aa63f4d57360d13f6e4b18a540a86f9952cae5f9a356a0647f658517a531095f698809b8028fb2b9229d3da16b380549d2f1e4b955c051192d8ea91bbd7a1f9f468e71a68e8d37e8fc56b3e093c75df0d6233559695a23188a3e1aa591ed5bda1869ff34f36ff9f480c2a182b9332da5b8ffd11a09cf015613556a95d8fb7fac7587dd04aae5b76a957c1d2240ab95999922c850921066e39fda024e8eea17767d57d3e0547b327b31ec8e4fc9f61d17821209fa304687e6d7a503e539c338af38647482023c4abab6a5a77e7f3878a1af8303f131faec56e59c168a8035b2d1e2c3ec6c4b1500b656ce493d8396c0410cd40e3b3498913b79d85b0677e25cd6f420d8010d33fd5cf081de12d65b5b135f7f34e5fe30f1cd02f8f0926a49f3998d534b00c6ad40271d7acc66b89d1dbd8db06bd3aa2dcd594d91f34af869bac855be635d110fa600e51b8b127c92db40a9ed128816ea0af36e2015a67ace0ffdaf9481d20099045fa5b0b219c6567b006c414fe132160a53e808c03525454a632a7dfca9808acf0c189d9208d7bc90692a4a47c83752a3400f0a16123f5ddcd80138ab7803de1c6c0769f8325ecd107ca3d00661f8a1d80adbb02540a8ac73302c4419d4988151e174359b6068f12df5dc1bffb11f9176e38eeda0bdd1789c574c06856d0217cbfb83f8fb46c149785f43e92801a7e9695ca2001a6841dd4918c745977025ccf545e26c38c6465292a3d0470784801264d67d6ce0af9880ac4aaf5a5ba2a37d1173f7a22448aa0309b8380a10519c2111f5cfa3140896e398d914d31d6d902894005422872741418bb4618793b4126fdc86915b4e959e6276636f25bfc754ea84c8bcfc16ab91081dd4aee3696a187aeca3e40811bb1aa39e1d9a6886b383c4cacb0b365acbb20521707ca1b7405a48658812e899237c24043adae4f8b8a9c70b7089c279df7d0c629a5cc36d32b123c8815724e3698f3e535e194b7b79c603cf9a5702dd8b80badef76f4b18844deebf95854b9e5d9f2d698e04afe0300bd02c065d1667312f29d4d36c1cbcc4e7150f78291354980add5a02b2fa98f028f275967333d320dc3427d804626170975765ff4ab9069251fcdef7f7317a8dde8a044b38b8a710f04d51f37560120ad2511cb573d1493510fde11816b10b2a34f85900f480b2ea563cdd909511c9853747b74f69d7a46550a5465f776249f832dbb4ae1b2c509d8fa4596aa675bcc46bef2e4d119de9994a69d05265a1fb315d49e4915fdcfd17958064dc4a7cc1d0cbe27043e34127dee9931ec56462c6937ee7178836378f147f1aefd41710f3cbd9c270758e916ca4c78d32eeebed854db0ed81f7c11ad06237513f451a53e41da9186ea6f34f99ea4a013efdf9caa7aad18aa3769a404982f0f5b82692e792f741584f20d2d8545b7b2cd40f3136f6fb3d08634301753103495ade273b88f6c04f9ecfa19e4baa4090cee229ec57b1c6d66147dd39f49e31db3514a95133a4d1fbd758f952061d1fdd6e396403cd62ac45aa40c5dc991321fc004e1819285e8ef466d64f63fa1057a7b97ec64bd19c0a56449aff7256096db42e91f26a9b49478202803a7ea93dd38c3257206e4a39113dd80bc81f0bb2759c1ef0c4030c62c83dcfee6db13a1b710f02efab73fe56e6fe488c0f1d48c90deae253871b0b30b5ba5440250ee83a81184f4dbc36d4da44d68556ed3d923563185e7bb6d22d7b2fb02bdeb6ee79255660d4bcf604ef97295318863db2a012427ba35c07539e7e7880be6410a236c7515530228caed8b8a8eb42799dcd492918ff6c6b21d14b8729c9cb3d4e4c22c038090b7f5a06746f403c336bdb5d564b0a8a095fe5de0adc99db3237ec540debc26d60bd69cfd12cbd217009ddfb8d5e46f1307294cb0a777f6c7145f73e3b6491181148e3f92949474321ab366b6fceb0f869bf9fba6da71181b0b6f0a77a5259da8868c605abf917697029893adc0933c331f59b5d02c10e3b2307766c03cd001afb6ea8d679ae8854ae871c7f0c117ec2fb5c13ba57d7ee4515cd1789da4fa2edef24cdff559574e6e2a05515d37eed793b0b9cc2a30ffba9d68f8d907e536ba560726e97d60de499b00e0677a6fcce38e524d596911faaf05f3b822813acc0f1c31fcd0eb1c7f49d951c4c2cb0e7813d63e54023e05c14ac6cbbd3248d33ef002c17459439e830a0346f831e1df73481e0720a3e4b721155df62ac87cf40b9bf4cc32caa0aa13cd1d2fd931053d6829d834b91a80eb922af49fadab96c3bed74c572bdfe6f4a318266746f0949dbc6e70b581d165558bf007e4b4cb6100d552be105fa6697cb867574623601394f7a6373347b0df8e74afd9896cdb9de25bedad1ba40fc4707d62de0137e89a76895c1b1855d10c8a2c46a83a768f8b2cb7f10f1a0226f56edf810bad04f7df1615b36f1fcdc9ae689a494f1ff4351064da241081520557b4aeb358a3cf8ace418b50d5bfa0bea99d57b4b53420b8261059e985027645eef32b1b2ab8da866dca26adeeb58056cdbcd73bc8c182c5c0c8310c35041ef8aa1d9e209a0f37e2d1ea5fb8e12381b2503914e8c53311a13ca8c310addda00d9abb3dbfca937e04a9cf508c53f6f6154c858359f724470330bf6768658244aa4ff6f154823a2a5a411594cfb7832c3d6d175c6ba5cedd98d785e5b361e635f89d74edda80ebc9164274631ffdc4a5cd0d6717c382677f16ebeb2132426b4ba4b2d5cb3afd791d171f59dcee488f553d7ad9e02a03b391b0e069ffc9394b9290a32d5708684f18b854ca286c543df329fe24a081b1be76d99bcad809f8c320342f86369ca098db82e5ffa58a9e43114f7c68028922e36e309343f833457f8a8e181d56284410bce656291fa17bdefa4158b2493cd3be20bd145cd8848041251aaa14d05f24bbab82ea9b9163aa75eb4b878c86935f6b29769f6e26cfea2cc4526e143075ba6cf5bf08e75b440910dfce978e6b63029f662e1253b8a19ca4c8dbaf3ece09fba849113a6700effb954ab5b26e655219f534f87d0822d7f26a5208e003fb4be11b132b26b3a288f5d8db3ec7c4c3f906d8e616666462136052899193734263d3033831b1af45317bbfa8d1c1bf18901e242b2eda4119927ec4c34f6ff58440faefa4da500b1aad1371c3cea0d7f57325b6568a60cb0dc787e8c3842670925a532115061dd90809cef9290f0a02729bf81fd0f4290c54afd59b8933aeb9448c8c84e2d02859dac61ec5f0c8240bb03ca639048a6780ccb08e8374404bf420672351b5fdc09e8ac3929038732516b14438c55857ab848df2e8909ad114e4879b654cdb99c8631025dfe68f5d20e7302bdee7d1add58c37631552821913cf71c4b7724e8bb127721ce0ba05e2dd8070b8d0bef4150f929a0735cb02a379a550f8246920ac9560d11c4c1106a980ef4f3a1f56bc067d78b2c784dbc919df48551094a91352297d01e8498940091f156f652326887c8e6029f07eb8de55f3a48208bbd1b06659586a910ba70d524ba730ff0dd3ccf19abe98d1979fe81ba03354a1155645d215519ef62644f24bef9603ea61cde5d2b34a7f3e79938485bfcdb0736995d104002de67b274cecbae46e3ad06d1d74b0f18fc608ff1aa08ff4ecb9fd013aa10e3ee898ed305feb56b7fa7cada755cee098f158c6d524c3e958ed511f761f894c8b8276f87afc7aff73ded42f740be346048dcd34c655cdf81109c3de542bcb8045d1b241a8596eb031ea1bf19cfc48db719c48d0adbac1c44718353fc22e5dab003e6076e281eae87b82a77ea4bb2ffbad8e6a7a71108e3e2b3483d189f830ded4bbbccb2d30aa8c47486f2c3284ff4008750cd869aa711aaa0f23f839c404331c7c232edb84a02b7c3d4cb5448a930203ab09b123eb6f0a4a63aa78aeb0ed9218d602014a336409ea629a06b5176fdbeda0540cfaac6d70589a82b39ff7700928044df254c6f301a3c15c97f2554b0b582af08114182d030ec911073cd4eed81bfcc5b11f25e45d9aad9cfe21bfa70182373a0ff8b62589aa5d64759b031becf3e247b66bc89f452a49b2bb2c4d153bd0a355fdba443a4fdabb54a84e71020084036f571352ba0e5d8c04ac33a9094490a6366ebf6659177661486921bf53e310459889549f9b417c296393e9a0d8f2c7cc1d97ca13712aa9137f85cc3d9114c990c121775d20adb3e0a3b0668a21711143133d8a7cfa8dd571e68b21f48c273bfe79a91df843a67148cba24875991e6af4097048d6ffbeb9269f916fc3b59aea984993a18e26c582b42530ce5474fcbda039e2f8c113b9c2ee0aece07436bebb27954df78b9a56c0dce872dc7ffeba927790ff18627da03dc6f9038e34a1321ecbd183fc6cdf67c26b1d9dc9024397e4912e84cdf7b5d6d3ac44ee20242539a56943d918c5c544c92ccca2d555422b45eda29d60bfb12a11cbdcbf2d3f7b6df41e28bb490d2a39f04528c4d3be5f1d69a63fa7050ee9b89a3a8709b40ab90efeafa0a11e8c769333f7dc8848ab78577c3685d4ce4d00de753f8a95e5971ba2a228a30d6a6e0555e7b2dabdf43ec59004f0bb20f8cf41f7f42efb1b31a4b65769da2177a727a61d18185f550a165534bdd83e68e4840ae8defbe239fb83b4fa64c07bc7d023820bedf8cc2556ec07a8923de99465a7f1961516cb205f85899a10aaf225ee2fe0446f73fc06b67e50d8d23a3f5f1e55c93b3cf7ad30722b95bf1e8c94c90304e5dfa0b095c8cfe6b5626c71d22ab1c27022ed48a6e4d5576cba988ecd557f9cb1e531bcfb40874b10523053418704f714aef0a66a9458889f797d1462780fd246e0f45cee0bcba109acc401961afe910514ba4199e8aa8ac33fa8ca1ec16f98766197d568a9bcc9abd0829ed640998b8a94af77c6ab4dc5a4c1b3c605621be29c812ae16e6abb99a75341bd7aa71893fd640e91cbb0cc159eaaa9f86192bbb5773c4c797988c6fd57028e9e842be3757d1ecc16ec1a116b603283456bb9b9fb6f2642076116b525cc0a7cddffa60a62232f2aee9fa899ca9f9087cab677aaf513038c9896f95649229a4ae736ca9642823a9a0b821e6f791858db44e2e4b1683ccd9e426d5833d3606a01f6e6a9376adc30d3d11b1b972fe9740a0d0455a6f0333ea98e6948235ce4046d00a8a863c5c36dc1e9eb845ed0cb164704067f99784a928daa3317b23c60e06f637cebdfb6ed9786416ac88a09ff636d2060da53540897c850d73eb9353b45e33e2055cce5d261634a076e914da9e59f1d78ab42bf5066beea7190d78297cbae8880a554c1c552ccde155e1222fb88d24dab2f8a180400ce58d3b37c1388e4b6c661126a91d1df966e07cb36b147925b17ae3882da923bfe745270f5f00886c282aeddcf097aba28adb8fa6ad586cac982e0d9484f6dd59beefc1969850edddb5a477a8f2841bcf7054c300787cc73b49dc635c6831d13f16236a152f68e6dcc15c31f3d4acbb9360c555793b307c703fb2656ad064ca85711ab90d78af5b70ba121f5cac6781b88ab800b996308d2a865348a139fffa7ccaeadf0022db3e3c7454010428476c22729a8c3e97925375c639fba9024f883a371c27b88dac91809fa3e3dd44c1c2a201ea7c4a655da4de43edc6114acfab9d503ebf2c2ad1880daa8d0f0e54be8b496100839ead693be880b01a6a12ace7afd06d2672430b0134b323d5dcf02c1c3458ba15650ede4cad77c0cd14a7ae364ab369a9b13410f5dce320af5ddaf0893ac57686259456ebf684d4cb78957d30ec007840ae8160fc3ec2a82faf769957d294687497fbe9eec46b6a99605c850b8ad207b82c3c56bd3150f12b8f77822d2b9ed0e1f6b402e7fb2d144e18175f18483839d14f8f8861706e5f05c4dbaa352e712503081e992a3016ea391709615603868a559ade6dd508abd79517559f2c43dca21b4da6a354091823fac33e09cd4fc0b22cb0287dfa728d509e2e05baa25a3fed32a08b070f9371ffd7240777abc0f694f541b080ccad628bfa59f05039b8d523d8c1f3edc6a75ced16e25a819bedb841a14806d62ec00b754d137d8fbd57dff0e7bbda60680024cd0a081b280fa43f44caefadec44f1bd8cabb60a86b9837e2231e43de5a46d80e14d41894fd43669d988432a4a959ea0c33dd8fe00762d31ac8ea5f9449f638dfab341c6a8cc439dc5f003d3a9820035a81b4b63bbe84b8474a9d3e17c4321e9b43491cc383234f0f2dbd6a5ed9febc24b59f0a6e01eca29514c61d13f26e867bf8a370c8b65ba98a70f49a335a3142d99c253b278c8fb3759ebf6a38e2a8dc2cef2a952be94f68630f80910cbf1ba04d2a3c13d04fd34d1ee43ce5e46c34115b58cf4099ab7182e28d89b900a82efacb1c3bcf7a7c36840dc69dd74e0f1aa2f7b010f3ba1a20b0e3fb7102247c08a900627eb10107c3e48fd7a355f8467a05f4808d12384cd8144e155f32a5b3326d6d996dfaa1198463e928eaa0e40ba8237b883bc16c6915fccda993d2d0b9795682b5f3cf7e4557b55fc50f7c09d00b39a54d08b277b8c4a4fa2c45d08200b4a73608d1addc361f49c00ab9c229fbd914e9a0d98bc3af0ed7905d6666bd78dfb345037c0099770624a06ded38bc19542b647c3f79748051a601ce416da49423c38bec9e380320ae16155d8064d456b209044eb7ab43c80faa34297de5da4e693c3cf23371b80b717ac5805551082b97aa056dced93c2f594ffad03df54644437e06b4234a08432b4dfd0be71d6f6310b847b025e80ed35b83b62b0fd758cdfdf81bb841d534ee16a44b2e99968a895d5b9550bfe23c24a180bede87b8a4741a687477b323ecf1c507a28de7223fa14e6eb01009d82a5dc685abe1d65857c7f1ad8cd500e80577b8c340fb8c208e273c07a4662788b6a6ab3dcbbbc5f87723f23630bec0b47e9e5ccf4917fa810a7f5f99c9c20656cacc519d27ffcee57864377db457ead9261c653679c09ce09984e96cdf2ec85385f9c5491c712e848dc529f12fc8228d7dc96957f05c739407d7e7772b8452b97d0f3e5a2befb764b3e32bab10b1ef2ea0b4d5d4222ffc6e69615638cedf1d735981f99e71420ad7df22fcd9de8270f401e61038675ef7247afe3558c0a991892560752e83e149b2f2ebbb0dbed1bc1e0e35febe5b175dffc0cd1d45fb2b430585b53b485104eee0a939e4a92b8d817774d1dd9a4d01e792ef6d68733c6626c0d16b7cbccaa235a65844256bf28ef140399abb18831c526881536352092738da265b36bbaccf21158a2abbcc0c90c99e00283d0063231730053fe6783330e27b10e9492ef4f046a6c186eab92c858ec61707b37b5f6986a5285fd3b9c7daf70b058c125c0afefc6c84e3d334a3292d6aee62e9569c1dbae6de590453303d28894d08eb3f34a890e39e25352fd0f6bedcd8c3c9346b307390fc40c8d5503093782e2aaac3f7add60be6c69e8f0c9d40f459a4b6e73d8c893b091e84d3b1a693e94d63d3a9ace9e3c4a14f4011a223eb4311f738bbb239f1ede163d44cae21492cdc7c2882e3d34c22aa5a122c712d46143a4e7c474fce4e8c3d931295d91c3a9899aa6a3e96a50427eca8e7f342da41f34abc4c04c280f90f6b2c3a4ea182bbc55322a23228a3a184100728324782e1f80d19e23070b01cbe0cc4c61297cad7d46f88670edd9c0062984b1bcc11e1bee3f9b49e718566d8c7a2fa920d5b25c2b9b9eeca9338a30e326081594ba5b81331452966100b551209fc52917068270a4227fc66df5e6ff4f75a0846165b5f2c31a620e24283ef1d4d3b44c002300c26dac51562f4e9800b8a8e863326c5ba4ef9a6c7bf140c6ce1cf6980902206518d0018dc343949d03c9794da0dc98096dbcc040a49117010542bf1048927871de3ea23a2df9b54f7df0a51e39148b856af9e1a74340b9c941429edddd4bcca475492f70f63b824bd3378611e82fb3c88959bb1810724899a07f66654cf4660eeb4edbf180194304540c8aad1a4bf3e82b7aa2b4219d6604f1d27326ab1504ea2af00bf6c05a510f2459e09fbf714590fc8b28bfd652c094088c0aaf65332358de8a8acbe08058fb9bb791dfd70684b0ee5fab6641bec6e5ac376718bc887e089d72be006cd97701e6d6057759279068346f79ec12eb31d913ebbd441cb3d2679741235144790ee6e5cd6cd04784bdb2e7f01f1f0b73354d8d8b07b5734b91851b49f88fc5651e9e4d3672e9c18d07a0f18be2c91bb3d3cf3aa2e06f90bb2dcbd0cf9eefcbc509aaea80206797d072cf3ff76cf65d80c5c666063407ceeed21273db9f69320f483683805f2fd90d7f6289ef6e53ad3cd080f927d7dffaa33aa9273ab540fb4b0147cfbd3a9a60c8ef79dd597348e6c896e70239b8618052281521dee749ecf45337117b3d3ac9941186f8464ae96952262da9fc5685697ea46fe20eb5697c64a733dfb2c233e81c0952ec80aa7502ac6005017d4dc0425a2c502b632e7e7f15f495e417c2ebd81dd10eec3dd03f826a98babe2f6a3405a063e2b0cb61d12b195a60aec98362492811ba0180bdb8686f3bc4335ecf60d409eeae9c03901d54771ecc5f225051aa9e0ab1fdf9f26425ec11c2fb44befc0622747f29b8857430f0f9586aa2b8ef0002f86aaaa96fe3e0182910701c90d6b1081700a2df07fee8ea010472575afb508807fe22aa1feafd43e1673300ff4830457926b6ec552e8416165ea3f4f2925bbd3e43556be05f602d3fe2f155c16513cac37f99fab5ddacc2b5b722506abfb11b8f4f2c0423b65245ce97f5d9ecb2154a4a6dbe8089d7e58086ccf1b81ed4cc29c0eee34d541924fc8fb80f3beb30f34a389de3d3e1ce75755d59f01b189bab497519f2e005e3277a2fd8a4fbfd21c1fc4476d46760b9be285d0b1d20e0a7fd55ada5a19603f4810b56ce3af6a69982567d4766e3893ec2cbce19be921af9afb9edbe724d8c096f620cce3745aea6f554569a3a8f4b8ae6551b25e763a9020774fe8d2e1c8440c51aeaece52e6f6855e6dae4f8ab199d6565ef878c8f17aac09f443b1d7bd4582c4fd4f9e74301418b1ca34414d79fd712fef6f8e4a2ab2279b4a8e6c7c1138b10d12938fef0f1435c86cc2b4f79acf861b676fbbe0057b631fe9d6d5efaa0aa5bc30321b5bd1682f619f506eff7d55e00c6e187a0dfcc53f52d787d51646fb07a45f19e9cd49f3eb6b987e9cf4a9be86607e142f3ea67c9db4597eaaea54872594c340728bbddd853510aa95af19b3d95c8e30c366de4718c373ec930d2c212c892b1650a0e48c0c50bc07298b063a5d4c97a998cf13ca60fb733e374555130680e23e6561b1d127f5cf0ac8979c3562bcd5b2d28693c3c01d61288c89a7bf40369f5032b749734ed35fd83f41585bd8c87d5a925e8a49b66962e460238b234acfb52c9f16d4df3410a432dfe240619a782b44d00ba56459c7053e48528508258f4005133f12b2b64e745f954752dd3dcdfd4c2c84d01892c841393300912952e339c5e8e4a1065e8f4b3e4d69acb2ebd957fd915875df7c463557b7b03a0cffb16531813390dc289d2dbba97542cedff929e08bbb7a6e2855769244c1698f6091c536c7d6c178097baf9671dde41c18c1632c5f654c3bfb6daca1032c84f22e8d4f9f69f000cbe7e0aa164740017748790f0f21e977e389986361379d43b7a7404e0d067ee75e7d1a27c52b1cd94f37df486b8fd8964b3ebf518efd8a3ba23c27f5a312113904de8c85caaa301c271c44e853abdd172076173393a89ca275176dccab40ffbe31e133af2a37d156ad9c695c200af7889d487a8dba091cfe474ab33941f1921d9060462f1aadf4763018b25b83cc75365a3b8399ec35202ec6b1e5d8a8532e19448e6dba316163f7b44d0ed7b87019c9bdd114bcba96e05c0eb02ab8946e8915cd9165ba1f8b95ddbd1c9cced53366a81164dd79a6da7d35c3a8c131c72ff4e3cf292aa4b36a81594fe900859ed1221203e4203ee37f62ba1ce9cc724bf3e38d9dae3d5caaaa1981a909fa3503a57fa58bb7e340f61e1815d4a0999ddf61c7113cd7244a18831df4942aad2949ec3081a4589155e271aa225dcc8fed86bce6da5827faf2921c8ceb65621511bd042515954fb0971f5802ba121bd7eff50af1b159771bcdd01e8caa6987cfa77f61533e015b178bbcaaaa76863868de92c00eb06b8e44a5c9a5eaaf0a078f17cf518f2a5e4eb5d6dc71cbf27d7d6f8f80c77ce62189d3f59801be976f09f8117ddad5a48228613d0c812f8d08def88a03fe3e03f306be0e10a513dda0cefc5368a7f8940d6ae808844d408aacdc2cba4175b3ec2a19dd9d20de35e70d8d0cbab44280c570ceaf9c0c58f988e22b6a4de2e4d56a80532fc36a564ef1277d486edbc7b4f3c0103b686b8e19e827ede7a5f6fa59d5a85059f222861259c410d19340c80291c5277683275c4becebe2eead3aac86aae3588d202399299e1be192f2a97777088b6b9161d77a8a894a8b22bcf390f7273c031f86fec3f65b2feafe4c1ed1a36beb32e53c3d20435fbdb354396c99a8a169903263ce5e034ddbded0ffdddc214d4acd7224609a6c56fa7a8910aeac920906006a8d52a3fefb661f5afb14a553d48f64769e7622793ffa248037d9442020ec14692e6d1b2980f48588b059a80965cccd3b98d13e96c4f9ab8042c73ff2c9dde5803a2decba8a4415676402617a4a899c5f928733cd945e3be7ffcf032a508184b0e83f528fd0228b921c1377f298367acf26c48193c3d08a6528c177e5d5aa435fa91fa7c029496ec0bbb0840387af0422f75a340610791b528af5fe0abba6ad87e52643827279310c51894bd771d94dcbaa66534ff044e5ffac4dfd0f859245e383def16d59ed6fe2eacab562cdf2bca3959482087c15219c632b27e678f6c36611cdec02a52a4118fbb3ec26a0eba813705eba8ae8c88765591e7090a0863857a589846b7fecfac4bd98b53cc47b556fe52308ef63322892435f6f9509248f90ac9a072da95dd2f53100d179266237bfcaad2324e6b02b03c6e61d808650b3d8acb8f73bfafb3d3b20b0036ab2481068483bca0f0578908507e9ebc910e97a50c22cbff3377d378956defe7bc0e564f00388d9704079d7169dab1c5c336b19641cf031d97be7fd90892b846a00c846000fa0dfe8a65a4860519681d0e81fcfe7c3e89f0fe3a49506d076b12df610257580bbd78bb0b9baa5a142822a0b135ae9da204c54e558d1e4de0c102baf77d0a61792120bf51bff1f5e595275c05fbcb34dacd017f34674c8959d14cff04183ba05a479ae02d56cb316307a630f61d890e801e7861a140746d8fa6c483a98db70f0714f19a89721c3024ae9c6f8f10c59c53d74b955c206e157d0d7d3942abadf08bc8dc8ab445398fd3bae5550cab979fbf68f71828d5828417c344ce7be199cefd25197f03154831e305a106e54c6549b36534f6f2cd26c287efb720a86d588e028cdbd4a973883a04db1bffdd34f9fe64013d04be9dca9ee30394ecfe396e782de78f54d809d76466357e8f0ac580f026d838dea83a416a690d99f901879098ac5d207aa1ce6c351129a6efaeb34a3cbd318a4b1b2417c70f8e101494a2c8ff625ff3efa4d032d81eac30a0bed9c45abc6eb068c4e469a899e1d58e79ff5b05808b67d46bfcebe208fa0e2614849e874aa3fe1d191f7b6f2cdbfcf21031e1cea1d5fc9061fcdaf6a5c7ea8fa640ea2b2fc998939157962618c035de1f733a4589853fcc8ab6ec950d9fb3eaa7506ca8f38d3d37b02a371390cfb687aa745d6ec40fd597fdf868bf0dd810d22ffa389fd6ac1a379ec60557139e75e1266440b27c3b3a80e5859134980d38753b3f0279efdd19d26048239cef6d6728392796660f1852859c2ee87f1c91574eb07113cf1786cb7b0f3abc9c5ef3f220539e9acc789afb4f9198e08490c477e92199c890333cd43a0d88383b6d8f39b85d4d5937b0afcee40232f42daae264332143dd762fbfa747c608acbb46328a2651c63ea0ca691a7db13a290441c55f9beee7b034971818feeaa3e493ff6f938579487c67d5aa75fc58785fb8dfaef3f565eaf4b43c4bde4d9196de194299328b1a89fad5d0fd2d76e7bc569a97712f8700358226808c3760010891e6ea7ad89d41596acfbebebc4f94b1b6fc389dd585d809f4ba57a4ef46ad3db434c81c24843a0d377345648a3be486ada1cfbe283dd0f74b7507fb1907e86f46d306912614bdb1890280ff881eb6531e5d65449c383286a2baff768eb0c3d7dbbf23ae66453b86b09219f0b9f185255ddd7d971fd8575152cb1866dabe842058562dd3a9206203acaff7cf87cd680454c05e91d496355cc19183272f1e0ae4e61f93ce09c316c9aa933e958a9832564fa9125e39f58be29bff1f4f6ce2147c348cf03717c20e813c43a20d70f4b3c88d057492ba0dcead8fa1427803046f4dfb24fb50205af1d3e7298ac378223f96b2534943bf7c7def096ff46df5c172cdcc9823a150cbe5f04b468c2dfeb13ca87ec49bc29094a61702e3dc4f467c0f536713f031495798b118110d13015116368d2f1ba57c4bd2824abbebfb54ed08970edea2782a70124075d2199974677399c8686f148fbd9512c992a8110f848acf6fc2242e52cfd4fbc4106227ead6a465ea735b71e5997efa0c1f38f20d5871de70264f3d629ed8f953039253ea2359a9167b8ef33c71e23ec39089b02e984bcdd7b5ba192aa09a91adb611599fd83a64dcabe5195c721a865ffc8d846a1899a26cae4e147553cf88fe0605f930598ac7d7a9dbbdb66e531712e01b3d83c581ebcad76e95cb40b475dfc6e6cfa63085c2af59401056f79cc0bc3a6a739e27e4aeb8dacdc4a999e7aaf989cedef03a8c195ebadbe25069d08594ae265570b1de449b86c2a7119655595af8be1e977d5c4fc3f2e80e5eee9d99f879ea0c1519bf594d922d51133a2f61160407d9c5f718f5c59842ff201b2e74d1f9bbe701ca09ef3c55ab6b7f9ac49644a65232cd36156246aca6dc672650637d90e7a1b7ab7e152387d7aa2954087b8c214ee07c8c89a8bf45f8543cad7d1bf893e9111ce93830ecff05858e906cec06864d0793d2a01595792488e08d9aceba3aa0c4a75f6d3b630788a80a5dc43946a00138aa9469d148b2c59d8a945cc0dd9cb37d27217f852bac3a3f48619c56b3476a86b6b371664f3ee0cfca2d1d353242ca5cbe4c16b6d846042d59b06b461dd21cc3f06162c43e545e29154a864fa20d8d587706183378e7e53be9d736ce904c6a387fff8e6669d92745c35ca470fe850d07d308f438331696091bce44049ceaf38b66a0062f3ed1a0ef72575da1057c9bf74b093f430035dfe75d0d334f03f93f43aeee341039b474c8b78b13a935a447f1d4552779524f6bc3d6aae4a23cd1d0c42b54f1abac61abc98415b2942fee70fdfd42b81406260a9a3b6a1ae2416d3805e4a690f6273c556e173ef5633565dc947be62d26b8f8635adaa8642cabeb87dac9331cb637bd1d2a12bf5f447de1ca27d08536270b0af49122274e75aa34015c7b18318537a22e4a36446ee47332df2878390357cf0f05e041c33b99d5aaf218f362857fac3e1e7cafedfdf5c2de26eff28c570efdccc808ed1ca94ca14edafca67b00942de760687e41c52ab13e98035fec13eabdef12394bac30fbf025b7e0d53f50dc5a235aeca5baf97713ba340d5f6ca2fc1f78ff228cdb369e38f6603af50bbfca93c8dd5c705bd2b8e61b6e3dfbc61441d7a1822321e88526ad0887315e4af7cae1aad49e6dd6268299415429c42d69ed99a5ed1814401a061eaa3f210188336eead95aeeed364fb2e4996ef66c146ee9a1463932598e544809352715cd0f38e63e8f6b871110ab6a3c5b7c7fe9c6ee2a8f6688cd708ea8bd53504263d8b8f02cf5218384c115b8c053a090fc08859fc7b6674f4169ee256af88d9f011b2c8d6f61b4fa825db575050a1f78d654c9a0b7d9963a28859a76af13873e27bbe95ff39a9d99da8dde88c3716e7270cedf5eb0b2d14d33594849b652e668a65825d04d5b0205eac26be60e44b739c7bd1ec3826934318912e50443f1ace79351dab8c7842f204a738aafd682b90acf592438ba62d6b57a1b963a8f8cf6d2c633f3fc23869a46c739d22e9bf669347615da4ffe2c85614b2dc0d854b3fa3873fe2b28faeef44578009ac5e1b871e641327293435936d84940549bcb1216e8822f236f0e95fc7881398e788fe75af8a99065383eb206e4cf8f5771c432bbc51e9e2cfa16ddedb28bb203270075638c281d5b0bed55e8f36007e31d6ac5289da03aca8da0df4c573a4876609524e1473f7a83028548b23f46b6259598a27c8e3124595abe8320a0d43a8e8d1a5ecef51547bb0332948c1a7653514c6f5838ac4186eab660e9974fb035aecc026d68db9052aa9816ef55ad873712c9d6015b3d0630c785d48423747636c7255a227044e381540f196bf782dcc56e22c6e04ac77bcead34d4a381d5ef66b7ef48d68b9e46a4647df0c7b9260ff41f46e30248173cbd21375916b3c56a501d467679464aa4885dee20510860a72e56d1c597280303512857410400e393f8285fa5293f9030ce2fdb742da6ad996e66477b88d3431408e4b0e41110030ee1d52a395d3169aed651f04e22fdce79e7b5a2106be578fe4867157697dc3c87df6b0526e04827d0d8a4529d7b6629ca9f88ec772a06fd1b663475c5baffa55d2deb82fadda56bb64c87cc81094e88460948fabf404587071b7a89d65e4bf81181556a13a384e3c72510ffa21965bf4db1c21821bd6dc5a84a01a4cefcfe1f3e25a414842ea661f3d644a080f4bddfae69c17843c22b673af955ef691b072a773d8feeb02a6f909bdf90c55ecedff36e63f8ffd9f2fa8a33557694d10a4a9afca37856075da0cef5dae559d2641ac824f4fec7c749434c518758ffabeb874d558ac1ef5ad1910f60a12a5fe5d8f3a7ec3768074d12ec5838514be58be3b68fc3d4dcc887e7616c586c06b258d8e62218f47a1a190a0e2a26f44f25408693a73cfcf28f4ff988ef681777e228fea8c5485224852fbaa6f80e2770c9d6bc53516c91bd0287561ee5aea989cd5e4eaf99e73094fbbf4a506acae519a458f230a7381049c29d34e3f17562a119ab4b4e5ff4a16510d0ceed9a5296a05d7e26f4dbc991f6bae01a0f5df0eb60c5d5c21a1f9d6423eb6bf164ae20610e37a6d7c3c26df7d708f766b9de717a05cb1d04c35dda5149f70bd1a8d4a0c75847522ec7f8208536be9aa2aea80ad9733d448f34b36cb769821fad0c603582c404ccd2901340ee5a43d2165edc69574466b2aa2fffbba5492c339d0a36b52d4b1a1871fdfd241aba32c364e7dfa9c1bfec858b6141f6260d9d1562b658f5010ad869335fc2f84341ff0d69cf9342a5c620ab830889081063c2d6a2f7fc1b27cb7e41bc7ce280c5ba195b2652786bfecf8bb8a37ff98a02e232b1e616e7a431fd7f17a241c61e15943f7d557b876b3ec822f83c565c1e2374c29238ec14353d25d58874acd1df864c8b3bd301b3e98da03d241906c11d5e35095139f06fea149dd2a6a450aa48aa4d953c4ce79b454d61b52a8cc7d51ff1794564e8be2d5ad47f2a3aa6494c864f9a4bc683ba43647b7e7322801516a778024b69efd97182af68c2b1e9ed17766b50f9720d734c77db80bd8449753b37974b3701b90cd9b39118c482e9c140635cd6e0ed968c26b4dede60e38ef3c1ede1ed6187e7acf9df84c08d44ccc385885e45f061e0cdeb855ba67e4efdfae914d6f4548f2261d6e9147bffb8c2d6cf7777c22923a95c9df4f03c68d40d15eecdef2d187a207f48d2ef249e2df8dfbdfea8941149e9b400a4726aef7e08b543d0d5f48cf471e1221e6a333333d29ab51492735857252a151f107e596bde55f5219432a4fc7baa4ea875f5291b933f7b2237101f3d730f680b8a4a56b2ce096b316850d560aa6e0bfd2b677c943d0255406df3ef5b75bea6fa9e16e937d3035c804704d17b7313c4bc3913354366122e77235b591457ecf3c6ad9096ab479754e5cba9a73a30c307c26589a1f324ac4a9b08cd29db5b631bdcd6fe245ae1b8586726c22922fc62cbf8ecb4376507efb8355083e188cb4500a460be1ee7c3f35e0e6b42d9d8d091b43a1b54c8df00af805cec2a9a7a241b851fa2c25e440ac340de93ae3533ae31ff382e29d828a7f2353b5f49142d6d4ea950bea90c929f73a913b8bc13f65301f610047a7e016df013a477d4fd5e021e9720b3a0bd23958fcc478201aeeb5a9971dd8c43903aa47de735a305616a70379046b04f348e22250465a2b2adbe309134971085291caf7cf4330932b30f7f161a1fb84302dd023abbf36350665e63e8d61b8acd760135dc5b2f017e00de435a6fdbe997d3a3759c447b2dbde7b6fb9a59432a51453073407f906916a2a3d3bb32a7525c6151b542381bc6cb0c81ec2d4589a8b43c07c5690527e3c7d88b2a5b2d242b4d102cb76396157f0e4ec99b302db72bed458f09c933dbb05e9a45008f59737a40fb1347572fa947304087811c4713e22eace9ccfc1b2326c7452f4542e4e8610c235cad9c685320fd3ecf5b18461374e1947a18d2be0a6fa71146c3f9d5565a5ae6c362e962b9b7eb33a29caf931c6cf381ff135ce874c6259903ce77c27c5f7c8f988fed919da8a8d156ec4cb0927b10b3e7daac0f6c46eb8d05ceb30717ce220c176117b23d332c6b1394772724253b0dee59e1c9b8e08cb82143834cc386243977b90f82441424515486af08565b9dc8384051c14dbc21a2128d81590d099c072627446588e25c60ca2b8c10c68f033831610610644381c587bb9e7481a438e48094561b9cb3d478a10852341c0e24893908ec52ef71ce139b263648584a5b314cff7dea6e2c83d4b39692ab99ee96446668d8ffc8b541c7b399626cab3b3c64b2aaccfdea8b0547cdc5dee2693e0243ac6ee5261a8c9f50fad78667e07a4c4f5dfa4784905874bf14ccb4952655584a7668723a29a725d25674b4385957538d7e34aca4e4e53a982134bfec447fe61e4445149d9b9ce737d8a8afc9c159d7960d326c64ed9f992a3c12515e220102f0f3dd4eb0c431fa34060220e026bf750cf89ed30cc7ccc8a79fd04baf3a54a8575e7ec704e3cc3ea5677ce0e278d1d29aad9e5dcf9a5a2308285ba5669ece434b6737538b17445c991a24a63e79a72dd895c9f59eafae573b251b2f48e2c382b6554fbd6b2783858a8b4d69c12d8e059c1899a152e522c511ca12206cb06152ab03eac9525baa8e9bc085259828c23422d5b979052c38191d32d1184820d4ac88824342d6cb8162091b1785da0bab0d96c1347605b683a26a84f70b2284c709d301c2b92a05ff0549c272598b2861174712c592829d900282dda8383460a6203c0f89943a0bc014f58120924ba6e71b385112b040b9058f9881b1006cb477cc37aa9f58cf048cb22832b6e689fba3021fda2d745892003555763755cee91010a4257d8bfdcd3041a37d6e5724f135be034c183501956e5724f1334b8e1db274d34d1d9d8162ef734814490ed2ef73031c50b1bf4e06502a88789232d30830926a6dc81470a65aeccfc04fc98f3bdf938e6ac756bf18ccbedf6ef4e40f7f8641c9cfc32b963f750807fbe1e2ee3a0f4907f2d53ab9bcaca7cde85ed21bfca0844c04159e7f4e7efe11e691c940e90328bc283bcd10ccb9f8c83f2631c9452be94ee2cdef559afc65607fbca7780bf54b9f5ebadd78f1e0ec8b12ea1b8bbbb4ff7c8b1d080e36acd1de7f4798538aa342d6a3df8603d2fda32ae9457573e6365ff1d77b39a36a30b92f3413fbff293481cbcd24b4c73ac8c3e9b69c82221034e36552168c48660646fd99d2d71ce47c67369c6e4d2250ed26cc741faa6cbb179c9c05e4dd8599ffe0e9b5892df82447e7dfb1ab5a217561cd17f5183673629f08cf62f2c3f007df1b9f4e5f7b28a23fa12b4ba34d4a16269d12058552cb5893e7335c8afdf4b501cd10f595a5e86ed9f960b8b61e8bb123674c171c171c9e199ede9bbd08067b4a7efa272c1b9345bf1ac1cfb6ce725283e26d27aec0e542ce950c551d08e930e158edd91d2a1f22e266c98eddc485d17255c6e224b2bf42191775018ecc2e88ce0a060a20e13f93b7f9c0fc3d0940d339f0ec530f4352f626872e9c7b08221a5c22697db05e0e119975b5db6aac5185994038861d5476b3384bdc92377e9bf4cc1c2fac7ab7911fa5f829a870fd9710a1a804d6d9714c3502fe887399a5cfa39563894b8f471dc486951d801a062a9ff049787be2f413c6375ec60f3c285e53ffce14b1077b1c0eed06b5cec7df8b38cc1a49715cb0fcf604fb160907ec812e5bab05070e9b3d8f04cfc70658c4b7fe58767424f5fc344ddcbca9f78c12253828d519fe844aa9b63e592e299eba97ce252150d2e17933e97fe25cab934d37ca3c1a51fbab02e55e3d20f595a02086298f025283583cb8ddf288761e87b3a36f4a10ed5a5f1b1aabaf443f4376e061d377e3ff4b7efd2d700706998f95cfad94edcb99eb9ecdb6186bed7f70c437f8678b10f49fd182d7d99229360779c5e821ca4ceb2fde14bd0a52f030e0e17686caac96a7aeb11b93583a61427499e424fbcbab9f1a9115c9a5cf0195c02e3a8c533da8d330a4f2e280ae8901ba71a17f4e192174e2e6e6471304660b69cd4521d8c9bcace8fa60bb0ed6cb51ccca26006d0fc26504bf2cfd60462b9d15b591ee48f9e41369cadd99a52aeebe3cf29f444514e6ab99e698d93a64d1127dd3869e238a97e7c6a44e72b0f938565059b35fae7abcbebbb9ae95ffc0ec6e79fe66996cffdd11d396535e03f3f5275c1e02564163f0c6c7777b7e636b6cb95c4b9e7a00d26b5b4bf308cfc162631ef60506e97df2e6263ec7e9634461ebc9f258dfd2ca947772751393fc9496c7cff907f6ef78b93988a2446aefc1eb1c42629597192d1f15439299caadb4bfae7aa7ff6cf54ffbce9b983aab96c72f952248f60e712c6546838430acf3777a6b0fdb1bfc972315ed4a8c171a3b7b74eeadf9e65dbe40d5f6edc5f4c4b0df0c8bf7e3cf4edfe6c70e94668e1848e22e9e0d67fc3ab1eea129bfc860170b9fedc3ce287f2bb50b418e4dbdf85420ac3c0b7391afa4aba04cda34b32aac042e7f6e94ba58e0a8b037f9f6ec8efef97abc062c9ed3b811e22e472a3aa493e1501f193493e8bc2206ed8f280c6b974c62f0c028835c9907ecb03b24bbf1dba3b3f24f2d98b1b734321b187f7a94f577664d8febedc0e7f23bb7c7ed19abb3d89111b5712229227c90e42a72460b4b3acd67bc0940cc3df1c0d2c221c0e3abb4b17543790e2924370d56709847e7174f9702f1b17db810123e0b95708786e0e198f3dddebd67a3a15717bc0be2f7310f02ef62f0e562055abbf8a9cab217bfa01412fed12c920c25a30cc0627cd3bff862797bbf31b55a2270e38897b68a0e44e99907d88386b8c1bf689c8864303285cac5e324e0a71f4983f411912e0a4962b6ec84ceeb40287bc44f2a9283e8e8ff2e34fc7899c0f347e0955706e7c6dfe088243eb60fe701c82a874c081492050d23044272c1a1030c902ad9a4e3331ecd53a784c0cdd45538fe9682c904413c1a3e8ffc20248187dd20ba0ff0f7f81491090e125068100937060568c4f51a77008a2d98e8950438f22edd37c9e4207757d8af19e02936200d23044223ea8bca4acb25ed775b17a0bd4162c4e318c8b6133da37f49c18b9d967ef54c3bc4d53d44a20e9beb7e8be1fba045d3871320581bdc047de295a37adf4679cc2314ea1d5e8a027304e02f3fa6b2eba8185b233c66a52aab5cdbd5ad44a20b18f431054276a539fb8daef877ee274fa3105b11d0164ea3eb43e844b1ded87ae040a6eb4221d80f801e26b5dc7514a3b8ebe15b1893e909b1bc1f833166098f861bf8007051886f8612b71e3f58f26890d3b286c954e07f909b41f75e8be28d85a051b76ab3a0b2ef5139ea782356beb5326868d3d657e73d737833fed2007e3fbbc7e4ac3861d248196f99c0f2b55ee75907f9d45fc336e7ce79ac530f1352b6cd8419352ad058f9916a039312839efee7694fdeea3b6b2e2bec2f9f49ecdf9703a3b91e6b50e7c63d0213e8dc7c0240bf49386217e7f2b5cbfe64edae14a9c88e378ca751ce545e89c73bac8351696f99d884d4e9ad34da71c5c559f9a15bf6f7c27f241a42072fd72cf0fa6382a3ef3ec8f5e574fdbdddd9d88adc84d166052911b3fb60b7a143fa2a0739a08ddc48d51d80ee219176e7c3f5d28af995fe87fbd8ac88a44f231ce47cddeafce5efad7c3bcd9530e023ad658638d9b659f8c10acc7f9e82086892dc5da40d35fd8b059cde299fa31f4dc3333f398af7df67c89fc678eeb56d489bc86d60b715c972b9b15f630af7c1a53e21911fc0198877f22a832c8acc0020b9c8f59c695ef713ee6778a0c1b76d0455d354eba3aa8836a9d45e49c2a389b2f60881564d4dc1b97ad1803e876d9e93a4074dd0d70bd6ff0c8bfbbdb63180fa5d81f3d1cd4de1382ad1f921620a127024208f9f37fa03fbf961a2610f4fb9c68a99bc9391af9d5386a1f34ec21789dc5b3d7a31ca2e3324f95ec5b36eca713d13783dfe9a364aae68e935860cd1f27459952bcc44e60cd253577c3b2a0eb46a68e93ba8adba3e373b7cfea5f9c8ff95c55bcfa3864bf7d98fdf6db4fff162c9b0fc61211ff71e2c6899beb6de24b64e3b1011a8cc68f13615c2c9baaa9c4491207c3f46fdbfced43a27d967926a78a2241bd49fbf9db257de435fbac5e779fe220b3dc3ef5550529e3f3c5eccf5cafee9f165fddf463f9717f3f5f17333365422911349e676d8c89898989449052ca8f730a8d5fa494d36bd91f7e1a2ed1c491bfb78a8991f918ae292b69e27b5eecf131c6af1cd9f24cd2610e21cbad2c0e7a7fdeeef90a4fb02cb77d7e5a34ee314ae9bd8ac1a2d02fac964ae1eb1062ac00075aa431c409aba6e2044378a3cb3daa9a1cd5698a31aa20458d2c7800051448b62a94c8b92e2354104f5218b122c51a9865e9b1014b8a267842a21802095e3ce18a1aac8ee8d1f9b9748e50c4755dd75584eb2c2189cb7afff2c50d3f667e512f7a5d9f65e1d15942e74811d37a96c5da4b47c77592a0c0f23cb1ba7248c20e8a30650d132cd1c424a57862072a1348038a2c8624210935a6b02c4fe43c01834642cc47610cd4095e2085227e4cd70f86144187988088ebbaae6b880abacf8c0ca8862f269cbea0a71f22b6d314ed0454d33eb85cc60d41a9f5e41481dea008aa1616501002105a26d972b9278749ce0f2a8fc63cf30280cf5df43a5c72e06871e186d7020bcc2bb8b3d85851b15d88dbb40cab179d327a3333ef08d91842bb72e039707777776707cbe015bc59a2dbd8b032cab91204db2f27b31485194e8c2ad376f2ca418839a2b818b35806f6c998da32edbdfaa1c5a62894095f2e57f9c5589d24b56cc3641062ac95af8eda389253c519a6a5bb20c618638da368ebb489239631c6187d05f61c162ab3d49593c6687379852d461642cc30330ac049198d955159c638eb46b7b0fd714a5294329a613bce2f7eb224a5c4cb2b3347b1fd5b9604db5fcdb01ca36f2c9594524ac9655eed9c18543b2cd4c92965e704daf38c6f4dd8f81a336749d8f0afa3625b8b8adde2199ef9ae7fa3c1a5ebfd1ba8d56a5c5fabbb61a3443ab46269071ef9db1047d9a53ab028f6b1e10c1ef9a3a146a77c488b0a2bb85d587f9946758b526fa9d810c18525e3db743b1d93ae48a7ea9674a9cec8f597b12f1bdd14456d04b5a143f8071bcf8272d06b38ae483f574543d4bfea73fd396bfd16c91aa3ac1c3922d79fb99aebdcc9c11b5428c422c26a60b7220eca8d1551180decc613630684d02ab41281bdf2e5d7745a77e324fbfe9d7f67c449a1f7ef72b49bf08b4421542eaa0e155a791f23134bf5596e1842d123f60ba1e2289413470f823131322befafad88422c076568a51272b225e1a2bafe2e2a279db6b81d72c2f2ec097645c437b47252b8a142a86aadca177ade7f870aa13a540815ba827580cb3d57a46e87e2196a04f340228af8ae8a5cf17343ab58ea8a7867e3a0bf5d598d7bb815b1b0c7607f4884839f2d6fcc92c1063b8afa6acd4dc0de30077b637ce618bfcfa6ab71d03b9483ae46d00db79f2d6ca809c35c81fa2ef75811e5865616083cdb8fcddd7e62a943a17eac7862851324f5fdbb224eda8ad4ef9f97a750811557aba290131fd5fe422b2aac8ffec22e753d0a14cfb470fd3b1b246ed8a5aa00badc53854ac7e59e2a58b743c5526815571d4aba879a308c6d625de8503af60adb53c5a987896a8ad5ce7de1f2144c9e5ccdb790132fb1c9ab5842d00d3b54154bc829b5a90a293937338d296502cdd68c32c3983f390e4e9d1863ac22365d223645ac65436dcaf5d7d2905146d93bb006e46097d3a1ba54877212d7d83829a545e96e3a1c4da529b9ae9d42db8d8ffc8d541dab040a76fbb9fe4eea2f22811b977b84c0b9bdb950a960c3ed8ad6cddd58b1a44df18d084b0bbafe5a1429576b5dff0d154bda4ee5b12b8fa5f9a87e76aeff9c4287ea504c6cd8a13ad4f54f75a80e15e30472616541b890290590848a9927cff6bc9eb3bf67c87ccb81656f4acf6714664b8cdc5f13b07594a159767665df702ed13f97e019ae4211a49452baec8f7d1ec1dd5c6394b2f2a7f2021b4b2dfd6c5200111ebffc9ca9704b7f6e6a13bf8c5ec44189c6a976ad5c5b413c2d13f16df75a6bad38586e30e8cf2fdd59d9d783611c04fe41fa0ba712b73fc024c95f388d4ce1fa6bceb163885e1ef937c942b3c286dcaa17d617eb14c3dce02c71b0eb1938b245ca6a651cc0b2f9cbf59757ede6e681b5dfecca2f26f7807e974fb061ad3775e3245a6bad1527e84463c3a9e606200c44847f284d33339077bcae2b7eb3e5e035e7a4cd021405ca27e57e9c449bc86d75fde594524a29e54f27d737263c1d224008204c294c319bd023ff70e6caf04cbf7359f4ac9a2040de50e61fc8fbc8c44195e541de077b47e7c6eba4507b7a7252c8fddc284e6a205cefd9b9a144c4b02137816414dbfe3e819460ebcf9683cead9260438e5b5d7fee27962aa7e27e3815f783029a52449c0a0836e454974763f9d09e38e85c14aef5713f9a0ff793868ffcb7ca328126502c693a3ef2f7adb2684e6cae6b395268394cb7b0fe2c954cbca14c8c310d8aa3e3251baa293bf809698d0d4d5123d74fd729a99b5c4ae78c33ce38e7fc24a5ddddd7c5d177a7f3a70b9bdd50c6390848542c4d201fb9fc163701e6f1c9d2fd59bbf14ca09346c4497302c54feac0fedc909e70cc2deccf8c428a2c1aef5448c47379d7e5bd93765c202f389c24e304bcb83d16dde012c7ee8ea51b0ece80cdc0865335e5dffe3c867962af0f49fce95df7eba9e779b5ced40d4e1cf15c36e880564cda71fd7d20022402dce2293e1c857bf5a3bb329b9a8afc6adeed5cb79b5a8bc286bcba2cdce919617b08ab71dd3dbc71556ec8abe791fffb5b617dc258ad7e74970c347e09a9eafaec1df5c773706f22d77f366bce1a5befc16b574050e5df7a5ac68565a04bc51054085185abc58d86679ce7e4caf1b310af796097bb570141fb963f2db6c418240726b785eb38707a7012f7e860c9f507e386e0ad3c3a088ab37b75ddb7229c78c6639858031b6e345ea2a7182f55d0529cd0f7531d1bca3b43343c9a1fc3a358b23c9acf7da1b77d277a9af102ba5354efbb16d6bfb96d07768a0b1ec47ba61c6cce4356685fbb2dba70849d8fd1d09ff451b45e6a53639b7fac224fb238383fe9a39f8cc3878b82e829dd0639d03896a88da52e88961ada34bf4df3436da6eb51d244643e11d5d46c00f91488345d1f114374a6f96e92bed1f9311b407eece8bd3363ea33470fe3c83c8408f313917962b81c0da0f261b42a92af2cdbac28949989b57bf6ee27e94c18af13f9c441198541f9a38a25d9924e9a871c836190aa2804fa7ca38c14fbbf98fcf9a40f4b3e91acde3e96645c963f5a8ded316258f52f6c6f2de15e22665df9d33c2e1467300c3c73a14802c3f00d2519d73fda2bb1af17abdf152392c1c1fe198568511b72b5ae662ddc360076e3d7c3951fc7707883670c406cd0a14f4da46bbcc44e60ddd0a6feee922b364e0aadcf0a6aa566a5486b2a6960a0be7f2d409c471070c0d3c3b5d6c25e27ef081b6f98bd68c533f23dd4fd701c6cad73a450b79f061d577ea215c3344539d838c819f44d95d8327328e98f73c6cfc1739303c7492cdcfe1c3bfd399cf4e778e22546238791fe1c3932f6c7cd395a93c388834f7f8a3e24a19752cb719323154ba18fe60607fb43a1279d1cec1c373eea38e583fd39701ccc71e360cfa01c2922531cec5fa1565b85e54c9b289c53c21ca92b6a72fbb52a9b63a88a4e99c98638ca91bafd2e2c979c58f2502eab76d9b9dd9f23154b2bac164439e1e4a862897956fd3958b1d43e3f395a39824ea8e862134b318b275a303999fa5d52b1d4ef82133d542ce5487939b73d9cdba9db36a6f8b149eed87e02f004e158cc0c3436b1e491223b72e9705104a594d22695270b79a48821503534e612973a4646caa794beac5c9a56ce4f06e1ee67fcc7af3c72931c0dd98d5f8fecd6356cdb9bdb2f63906b48143de089315ef1f23c8f7952403ca91ff80d3d1ff2358ed715af8f318bd70ef1bae663a23087d9c58ecadbbc56307e61439b5561e30d3d09643732b9a8c7f9a03f8976055d970fa71c25447ee894cef5cb070c73f717801747cc98174b1480f23f02c03e1a1fcc30d7d3cf3ee4a011f8d030e82148c0429814e7cc115551cc8e5866988b7e1843011ef98fc173460c4d10adf105d0f72b28c8875b470c63c4e6320064e501e683613668005584033770500d0e2f6d1ffa1bcc03fb161611d4ab7d37444f63b0ba0a83516c8043cfbde7b5cd0ae7c72602620b7d47310cc330ecb1ee435bf7a12df4ddf6dcd7b0d510faeefb21c900a27b4ee5edfb6bd7d34b9a01841340ecab3c10dc770f847d151f2dfd40bae71e88cadb6faea53f0a74cf7d0dddf735a87c1af84240413624d9deff87b689d824130a89b6e75a6842ff437743df0fdcb761746258cd38eb18ba9e7db0eae363839332ac5e37380e2ee1a14232e79850c2cc9327015e34ba43bc927e3b4429295d6349dbcb72c14518469082841e70a105175c68a145ed5ab97277c76dd24a6bf67e2bcd686dd556062ec0376880d170295fbd58ebd56ab5300c67498849adb506c95a5b23461ace08c341be4fa910ed0b88ef6f04a06b755d2b5690137902e4a435c5c7ffe2d5eaffffff63add6fe4b1064fd775d7f5daff1f51793e25fd7334f26514a6790c85ddba49c8ff9d5ba5a35e19a8585e28d719d015d5fb031f0681c2aa414fb8d73b1f42a088d06648c31344f4d7ef5d7e785dee87be5e3a42b0c27d1d5ea0607a88b814629a5dc3e31461feb37649694e981bd10d3fce8d7c2de3f08cfe8b8d5e4ef430e3a0471508738a20912473c5687200e7a0e12c85a302c8dcc0f6ed119e4ba3220fc30b37c129300f91f63dd7860678a47fd3855c56a19ffe7cf7ca2835a670c015edae39e1fdfd45ae911bef8e28b2f7cb8887d031533d7ea79b5664e58cf054f89161d31f585eb2297f5f27096a8281613e70a2b08f6d0b79f8836394183af6c085e5f0282208f14545ac7e218e618190de490001998c551789cc4c474cb09850f142c9673f3639fabebff77154bf5fbdbaefa4301804cd75725404a50d75f06efe19f17472e9dd8ef1922072fd83f0f15a2b821f3104042b121c8c486313c4e9a4c9c2463626228c59c00d25ed31ea4b981002f3c4f6234eeff6eedf935774dd334ed3528738c96f64d9ffe9def85f7010058004c92ab8f51b26c6d52a161b3074c928249973677341b379c3b7fb5ecffb76ddaf82ce2337583b384617898fc00614ee85431c6a8c2d547ae42bffeba9b6bbf9c8f54a79a4d87307b4e9edcb51b0c1bf28cbcfe977b5450dcfee6284d9d0105b8e37240865518b219646e90c811379401251845046018181ef927a0f6c80032f1037180588e8d0f8273325012c761e6ca35d65aadadb1241347fe20f8ef79d6665996653d64bab34cbb6ec8ac8bf2d76f51edbeae2bbbbefe5cce870d615dbbbb767315c3388cc3388ce3b82af3038aedcf6e07c5bb81a1f2e160e35be5fd2d8ee7c9bed61e3621b7e6b05d16517f2d0fe8df7eeb2abad8f5dd2cb5b3cc86a87e5d79242b2a9f13f1855c217706edbb8bb4cd37c54f415cd8ba7dadd817b91d7a06a9031b3f4d9fd86ee9607570c3e1385d64418c1337b3ece666d9ddccd99552ca1a4b1e68b5701d3bd9f02ff3c838275569fcc25c2f5b2b15b1bc3e944fa58c38e857a58d600031f3e4393fbba0d8e9c48993aab5dec7c82636ce39e79c72529d2e88b0c58e55d1164abbbbbbbbbb9b1b85eab6d6b31ee36d0a712fc444633814cfe0b804b8de35618baa9c93eb9f37e4d58ecb452cc7517c1e2eec4dc03ca3913ac0a0fff65a07b49f3cf28fe901868d37e48bd2eba94808cb83bc3d38e85de3a8edfad7a89645850cf483975a871e7c01a837655f23c13046300cfe97a8e712ac43b13f62620f540ad57d5da91beb925b020a13159b6ecd6e3590a7dc48a7e1368ef29b0e9acdcca846759e58a8444dd7453deb10d1000000000315000028100c08c462915838cf7349f20114000d768a4472523619c88324c761100319440c22c6000300318480216668c606018c54366a21e387d42368f0f5e04dbf425ab1238424b09b66b1a091249f8c17b7753dae116a81f10861636e36d1ee2709f6c8a009bb7e4619c9250f380dff6a1b8400ae9bc26ec4f24dfba108c9cb8a3b16af8b93ea89b7ed8fd077768b9e784ef0260cf6010edb5a777d4a05ddd02c8a2c0079ea9260d4e4567f31fe15ab1d2e0e5c07c126d2349bf5e2806c989d88a1df35e25e08dcc70469e20ae32df279946e08053a5a6344f901dea0445a7fc8cf1e2c410ff5c53042089423fe9230d0d61f8f77b801a624c839c3a4c066943d99944810777fc0ce1cfd9a3c2541b248eeb47061a164f1f42c2e71e73fa40ea047afeb87784d2bbe4174f3662f975b9bf72832b6d1d3e7291032134a13ec540259b1584c33b0fcae687787d2d6470092357f0479a3510f459761770f8e13b57e422572cc88d27242ddd7d33d5fecbc2834f40b7b8703957d25073ab3b5266fb29445d7aabaae1d3fc35313123e18c096242a614691066a8b4060993bdcc45d428f902fac4f5c52058cefd05cde4fa5cbdd5367d54cdd5de9ca4b394b32d6fc1a5d9ffdd0acbb5f1505241700795ee4c9de9e37884d8325b47ed470288a0da6d8b680b26227351c9a3bb678e909689d40592b43d2f942b434c56beede68c5842cf161825c90fb65034e2ac9a4750629233fcd3cb10e97d019cc46221b0b5ec2677b300beab6ae1bde62d632130a72e6ee678cc77ccb123421f398c42ac8cf33c5cb996ce5644c8107e5e3eefbd080297363cb7f02c7e9126324d3e96d3485e2e75433b02e28686022cf22be0747e55fc220af6988f65207df33a64826584d2661e1e8b88382756571452b1eb2afb869e7a57c893c1339157fcf42ae5b828d339c8b3c5d1e9a9b4836f1e35e9c382f372f9522b84546a353d9967d1274d19c6fef91cbeb9c3ecaaed33df078c705bcb1a25ca2facd19d7707fa90bcf66355c1c42d29d0991b11dcb069039e1b3fbd9b5ab6818fffc3753e41b9c7ca987ae2abcee62649cabf96f3dc63b8a37049e67948e8be66af73b95146864bd58e73e71644f4253378a52948eb5ba89bf5e3bdb6e88e3de7668df4a2547d8f10460449980a59fe46f5a82680addb7bd60f5a5081e4e395d27a9dc5948176b551c5c880f48c245c8d2d39e98dc9b53b8732d4ef8108cd5159165520f188313b30bdee538ae5da2af4fd359187219f8f9b72815b0de5a4d828488b1818ad357efaa2511519bc63731eb82e70592adabbc81e55da0da9f35c744040ccdbd218d65e800fe13a11a56b4949680415c48c8174e20949ce318b26bcf1fb7e70e688fa16f43896b5dd8db77a51d7395c05ea1391b468b306376fb3245a6e041b4e1f87d9621c17d1304fded4e05652fc1db518ab9df72ab1fc6319beefffb21bba84fb77cbd682911d0e840bb4651c1148ec2076a9727a516382d997f687fd4ce0dcfb4008ea24f72a2dbc30f6a98ebda0f959a34e8a1f0bbd980a24e0e33cc7d9c9a5c7e3c4c1b63a543e307a7feaf9b3806a6a2995dc30d310438bb36ef3f4255f6dff507fbf56e0cd9b7de4a9012640eb1bafdc7f1289cc7d72a89d1f20e48e0243d6cc5a9d70b088844107f11f2191bdf1201d2cfde3afa183999c3993831c314afb30585e9a16cc5d842c8700d158547919de060248d1ad62872dd6d22dad932e992fdd54e9e06e8045c250aa3759809617e89e21a4c9a017be77e7e8c124af35a8daf3e0c6dc1576abf5b31cf945e7c159cd6fc64728752acdfa9872bd8699559d10baa2dade5462dfd81785481cd729cbea861da52978b06d04c03709e0078b6078bbfb71d393e780b115a19b160435ec0449914ec0f3ec73c26e6dbe267cb32aa5bd12a28961437b05e0687e2b70b3c87d119079806c892abd1baac55d64411c1a4e11bd7764cd98ba01cd21b65ff9fe05063223c828de0a868488825c7ef84602336d439f148bd45ad6d0501059a7c20388e2a7c5a3724517fcc84a2b721542db0208d52a0a810ad60ff75506754a740133471a24d85e551f042993a6b70782ba1cf06ae3571254b5865e87c0db50b6c14c089e738c14f3dfbba92b14a9c6ae4f8720e2a8b89769940c5e00141848dd8e3b90d84c9a543d5ee58522901c4e594bda265a24bed2e8b5fc416e3f1b2573989cbd01498be8534b8f1be71b1d751df9c101e19b34498d183d1b8e8cc22ba6081b83968c987517e72d29328eefc27bf3897252056b222118e34c7121218fa4d19231bb9762378055cc831098046cc6da78feab68e5c006c53f8d44a70ffad2e6eeab0b01a700c09a8c9cff345f0a1a449bcec7131da76fda69b838aef20c2f94d97234b0c25e6dc6b13280361032c355b51ecea444080688048370affc064400fd52a1c0bc516879ef616ee062aef1db393aa5ea01047f65cfe18fc06489dfe3b08e3d8dccbd1f707e8be24f494d0c1771d9c5809e84ed28b590995bdd8e82474bb95bf5a85b8ae4def453719861dcc8e0bcda6184b9412b2980d3894b619e344bcb4c7fef2be17a7b4bf655fa235d6ba54c733714c5957e747e462dd326788eb4fb78cb28b7d45d8d826f4b03320e05e7f6fdce562dfc9393bd72f2bf62dd122ee86c6187b39cbaa3ccb991c0131b9b188337776a4a52d2bc71561ec5c9b224197771122bc6250c8ebccd8cc21cc58f3719c23c4bb5caa628de2aecff1778416ae610d2b0200b22771a3968abf995a920fa9145c4d681d4b0b754c8feb1fa623ace44e023fce6c8452327195b78d1548a765a4078b5e47f120d11f94d6821ffd01dfd318c57703fbbf5550f732c2026948ba790fa70bac2f41ee0338d2d0d485a6c9f110de7a7fbffadb20b2ca4b806b253751235b7a5d0833a4e07a08132a7afe4bc61d2ef4ce508ae81f4e5b18146d4161a9c4e1225d851c173c329fc00b2922d35cc3125da8338e99c1cd4ecade61f7af6a58d7365f3df3230608bdb61187b2788874157016ebad6083c636845aca21520bef60432af4042ee2d988df1e59760fb93efaf2fd096019921bf7baea206825d65a00beaabbb209505a7dfbb20160896995e22070c25aaf51eb94b2e2b03a37455f75178f4d448a581fdf8accba5bc9e54e18ed4865209156dec2edb2b6c412b83158d9791fdac03828bab1acfbd04a3f605de737ed8100e61ef9825617b298557604644b354145d8474a471e31120b2afa86c699ba913816ea507d5e18aab326298fa03ceb01dc175230b0726dfa5f35fa0d00e609f5c1af8a06de1d45021a7c5236d6be8cc29527f1180464d1129c8c42523d6ec456c071019256dc2d9e0cd34ac39f4f133648a3ca0024c83488c7415f86b137b5d35ff5cbfba30bc45b1908e0a3ca258b63664973c9e299927e95e33d88dbee3082ccdcc34822885173c10de385052ce8d5ae16316205e6f7626726e8f1c181d82c1b665ad3efc36b157c890c185d13041df59ca971298751f08a2c1aa2640688bd152ec63ed758ea0c863d1310c08a4d3dbf0a5c657f9770c9c48ba783c0ffcf123e7ef9b7fed30109c7dea352dc7311af9563f9b81afe8fd250a38f3c24fd79e7a323611b4a330d542d6a994bfbe97c83947de8b5b3f89082a6703a656056168d8a32cb6da8d8b95303e3499b3fa4c7859cb0eea8aad4305aa81e55f27ccdb12ff79194bc781e2342e65ab27d01a080c073e7c68fd6ccc9baa8504396f66acc0aa18bd23d7eccd544f9f986a39840b5d6842147176d47a5d967cd46c8af5195aaa0df9e92f1d7dd2dbe21cc24b4a4cb146a0be5ca743e5f4b3ce1a3a9bb40d8b669c290194956ce0020f9bd9f984eb40af3ef4d5c39f164d490d4181c1bfaced8973174c2032684ccde4287ac668261816c6c64b8214aeb445b14e12bd436edbec8b8bc64727cba6b18185443bd04613bf55c985adfbad00fabd34b8a4b5f3e1bf4d73a7ae58bd95b70ff11788dd8a721c0a5c5083f25b1a69c8a41110e9a0599830e4424240d6a1da2179e772d6bcd0f4377a253d5f7bb403f13022bc4a624fba85f39746c5d3f5097a19f477d333b86e1418be9f769860b502d6b4076de85e57d9f922e6e8bf65c3062216858d08c7604ab1500a208a5febc63f8a1e7a619aada69df74d4bf81de2cf5cec129f7cb3d7d66a2f5cdcf405d6f7bc8de234d6bf2935e50227a33007c3e7448d4bcb86c50665a8a3e7c5f4e682ff52b2d9e1288f7b29da0d5f22cf897f9e82fd48ae606a7976232ea571f44627ff2ba646c68cf0337619faf17ad1d7dfb55e77011b258471a6808ee87e29661225e08b610412bec9000e91aeabed6e7c5fafee86423885a710860fa0f14c5919ea35843d68196d8fa1ce2b5a949baaaadaae57aaa0b7865020ee02af82ba46b1bc7bc2d51d8e4edd5142cf961776dea67e5cc330eb1c56d8fc00882981d204cea1db7d1a9c3be416b76c6a2813c2c56244aad9014f9a4427e34f7badfd53d558c22f0969451d89c441481e9028b9c08723f10900e2e7060ff0279cb609728a68ad61d15fb7c0ed520aa444a2e37e0ddc4667141b02b8f41fe52691dd5f56eafa4c0f508806c96e46fab4521ce6d5879dee2e5769a955c2617dcd0af92d661bf0bbaf35fbbe537d28fa92409a81bc176b5e96d3caae37a881d42939f604edc811f1d2bcc8e28195650421c9be33a9e0ee2d4aff8976eac28101adc72b75f3b0b34ce2c61dc378f762c42adfc0076125c56f20aafb7034dbb4f24858f98061d5b3b5e19af6d60db17867fbb8c4717e1daab912d403bb93fe521afb37a002428491faf587284785425d82f9ae5aad44e9a5e1de78e30409ddc2ba1205adde9e684387eeb7d4373912aefa435cde97ee4a355699e2e3427fc2da06b4e153050da6c95b776405a50158dfb58076d752f11996c9ac0d297b113d364182ae92fef8ad5f1ad8849d17f6e7468cf73e887294d04f8636de7b59ec8beb724ce0a4ffa385ad4cd65918205accefaa9a7831ba3081312b65db9f3e89b9d37bfce590e10aa1fa0c92cd752f53c53e1c7671650915515c0f0e261d04358b11eae7573dff44685e77f3b6c6fe2d1e311948991bf00cab740088b543fa15ab1d2dfc0a94b040610944edc0dd6364fe2e25954b82fb973c333a27bf3ba4c8fb1d9128040e53a87fa65d9525f222bbe37ddb9d36e063b5663b3e58f6be97d4f76ed83bb89d059f6082cfdc5bc80bcf2944524084211accb60f58bcb49c10746823a941fabe9eaf8bd2cf637e343395a95941d834bfbeb0b1c1af75562b5089818266a9d731236980d5a6aaeace790d714fad068ef2aeb7cc4ee869465de9e7190db58afe3f24c6438859499b83dfa98908005409da4c2b50e37ab0b1e2b5861e61523983c2337a22d2f48d33ea471965f569eaac9fe6c88b174fa511ff148bf2b978b607e25468a634763496db0a3641b5d960dc2c19edd5a2f2365a04e460e286e4603d22a38745e82d4b383de89fa53350166bc35adf261cec3fb6eccf65d11ccfe423665307ae3a265c631f9ac01b1334b4d0b6f06cd6ed69edf07f11fa7d8e34c4253a2521a20fb71f9aedb623848d073d5c22122597f77b0ba9d3883d81ee2179dc1d9ee112951f5aa6d507a145b81a12e22033105f092635d2320e135def40a726e75f598158a83c9cb3c9b126b788d6b68a769c28beee8290cfebd9c270a66953622bda9c3b0feb1109e61350fa880414b8fd85d073760c75f48911195afd6a90ee23b75c72aab370d803bdcf046f607d72e3e89de788873b83d1b6632148aa2aa50ab9b7236768db38bc7643ca11e31ce60b8285dde727d5383205e84284308d0df5e6593e4522372b392f44c2e49ef287b3532e63f77b8f4d982574eb28b27d98b8b508ac025b0921da9404888fc3a5999ce6ef0ce09d98bbdb3e86b5b40ced6164ac5bd7632b957261c6dd558b933c1cb23620c6ac461e186206f9eb1ede941b027f0b1924b389a03534f5d88039ade865d7779872be2656b9e6156a3c5dd3a805c806f6222299282bf66a8cca53e8340fe2d30732530691886a2987679d40e31a25ae5cfb6165c8b52e30e8468dd25e44d2255c82ef19a3b91486b1040acba04e6fd8d4408b4ee7d994b628fbea533aa6d45160de345db241a3911908f18919412f90b94f26c143dd8baa938b3dee731d53333f01d5bcae0e07ad22610a5f6e50155ee9bf3e6bf387b2576909054a583465ed98e3c908691896878840b4b24fe659b81c2a1701c75b9143326e7f264c3efd3d99d3992ec16a21fa25ebdb196aefe5a367bafb2515e8f0d4ecf8ace60888f4673aa7e836d976f401cd52ea37095856596efb2a31f567f6ce79c7faef1a87894066589085ab47f70eac35e285fa621a41ab94c39d1241a063d69d65ac0233bee9ed35c6ba4ccf459fec4453d25d5cab636320db036bf46eb8700e4c975a9b4b143ed545137334f8fc214331f07968de2483554c08918dc1b53f606abe22c26942f42abba14e45b18e1a6324efa2f6afdc273ac68bb803810ce3102a538036b7b242d98669d2b92744024137a26c0de28a305c1a0159f085945a665fb8b78694ad4419bd4fa491444bc88e5554c7ae4337b197078f4be1ca4df7c6f008a1cc53f8823165f384c41dbe24d9956666467f572dee7c2b53852ea0d66b44349c6426a684220e0e91da619586ca80d685e586dbb6dcf77f1a3d0c3d232ea99415a656b53dd9fbc63d8f6ddc7e876eb1282732e0e174eb1fae365a16392c5d4107ea27d9a62ca8498538ae68146861752e0da51b6a4cb9de584e05ca555319cc8fe7fdeaf676e5b3d849109d7b3bb1161641067d17da02f7e7a49d27ea558a66bd3ec20275e48d0f49caf7457c2b866f056497fef1c85ed7423a806c8cb1aa437e59525a80b5b4980840a6a44cb7ef61253f9d78b516c607d0dfe44eefc7daf1daef8da8a2e37005d3d32677c3a3e1d75a825403010fe923f75535eb962e9851b8c02d16f69d81369dbc191209fb51a7be37180f80f12b8e7bd48911297a1f1bb9c49b71df59487dddad74aaa26858027f935b97e7f94250ffda47449403947f1f828b345cece9c5c9fd9e2504cd58f07946713071fb2a49ddcd4bf61c1ac043623f0d8e1a37a4618a30c3d4d8c21cc225694a01441e6a2606520f0489cf6192384be1e8ef89601404f71d207c49d6278901956836aab7c03b1d0fafeb68a2fc15891508629a786d7391e73e46a41a780e2b3655679ee6acf0781dd08a5d43bf84488d2241398f6f19ce59163dedae9a410db8dce4e3796d1c28eae0cc812aca28a2691bfd6541bbd681c31594a325421a2511e1348742f55bae789593109bdaa6f683ff7e028f97227e3ec77cffb8e37a07a63998b350e170c82932fe258dce45cbd80ff31770a195bed24e63c795873895794e509a0535fee5413450330cfc518344fef709492538040ceef32099a1f9bea14aabc8d0b6d95379390b5cd8f6c236f3c17b5fb0abbe02711ca03dee6276dd5a0f8afa08a55c28f2b4702206d0fc07f6ec15b3883536e8a6dc3338734124017694016624011d547ca20ae30ecca27193ff6559af077478a9a2e345c05b46a60fd91bcfc3fcee3580b33df90c860ed01daf01dcc07e524c0ca3df6dc55fe7e36819c031fd2c0a2e87447ed289d8ea268f6fd4ac0a00b6806f994ee3989654c7cbdd972ce5cde3643bed923b141b3287c0e0e9698afbb2fc84d1e69d92bed5b07c70d1be9c12155075936cb581e320847399c612c6eca434f1af32b31ed86b07a2b00a48a07e940aa44916404831c1a3f03650e905ad9c12b2f2f1a6f992aad570f52f698f018aa4c5e1af918c20ce338ee5d3e2e86f00d38c4558b879c50ec90716b8c676e0e4576832a2cec4210a5b4c47a8812991c808c95d90191948a51391c54ec7d1c639ac60661320ea1c6edf13b0d84c2c10c1642bc484eea9e70f4cf5658a3a0461910ee038e0f0e36f14871c7380060b4627b6f6b6b9f964aabbff06f4422298fc11a347bb54b421d2ee0e7a412454c9f05c043321e99a2a676c54764427979826c4c07aaf6fe87950e888c912ed0c6d3777542921eb411c1222b25cdb3af79fc99f99a872acfebfa5a18ab4e148c8b74e2607db484184e52019b5598690f043b8525ec0973a5dedf2eb9aaf844d79b12c22059897bc01c57216f427bd5b9619a516a58c01a8dd5a56f26444e96192acccb9e43c32bd3068fc33b39650d33a5479d480689fcdae48cb1e6d0b8bd13888b1c509ff6cf81f2a7626c7a0a167583e84560cb683700623a4f1094eb37c0912b0224e88d10387a4abd182c83d025f0b33126c940fda05f6ecfe14a6371c3a7ee877eac3218224e50087ec4854f7568ccb13d7d015bcb40128c09d6e556d019f50d0fbd2c985c7cfac6580f0e0276ad932d36e8f2607cd96b271d1f5dc6a09dccb8ccb2d87a7b244435fe48cf3043aef6fd2fadb08dd04f403148f9e8e9b7524474966bdb47af90db9604fb4f20874e475b12d7b97190a5231f52ad1dd6f00e078370f942748f698ef5c184920fc9faaae1a30720760b2c731c1edff0a22938d8b1ba8285387fc6d7cc827d147bf67c6b50f770ea1a4c96b2ed61bed0f1fd9039f875e798836b99085b049f2a2edf3b78791530ced18a6eb2a67260e8d4b80f5c9af0c1f5fafc42e0500c1bed72272bf3a195acae573c431fa7fa059748ff7d8c0ca13f636fb4cc1fe1f48e755efef38d0b24b3f4c5553ca86f68e6d7263f1223ec89170e43bfe5af6765970774386c8ba2b21070f411aa472b96eb150fce65bba89b9621860fcb7089f7dfb76bac2ccbabffd8821b25fc1b1b5ef8869e222b08ae129982477a5081c10063b98d19a1b9d1fda8b21ff87cc319d54b5255847095daef22b9fbd047485d888351fa55ea8224e324894288cf78d391199fc995d45d7e6893f81601be95722fc0576d3dbcf8edad4b416633563798913159e63a9dd9c3af36379aa5845abee73df8e7833327f95155e3385cb81815e0e42d440829b722e60995489dc65f97c4bcd81df8d5b33a9ba4114e59eddb4138e6e91a788388185e87e38d384b5c8e01501946ef5923365104022940fe02483284aaeaa57030bdc30440ab63b6196471553737e2fd5f88fb6ada1e5b63a6ed3fed66a1c7874c5a2fa721f9a25d04f1980726f4d46617f799d0474b454d49b331716dcfd8ae594a8eed1c5cf0ecf7823908ef8f62376ac51458def579da5a4a65ef64bcf43e751dfd6032fd33fa55644119c1a3881b1693631bc49660dc132d2f9323df0a613934920838b9ce2b9b59e5bffc265f6cb0c365b437550f1888a0b4c12b36b15e449191700d2305142eb799fa4d425eead2131209a9507a91be5e914f209b688f8a7c47bb9b394add49da78dec88a68d96c23ed6f3a170975d5ce26a5a3aaf7988b732a2d4c54e27297529ce2368fa30e19117a825571161d0f0a51d6a9fcae01a9ee255deecfa0de0f31a00f75a1aca0c25050649933907e8eeca62d107d6d25a5be77303628663980bb6d21875a7b00b7d98b280d14d003b2fb602714a123362c3521480387d1546cc0dfe86d4597620c8d0a68d94cf78f3224ed4d25f532c28014c00a39b36a2e5adffcd0039469cd23794f1102417877719fac5e4dea22d24e23546ae2786fad8ced4cb63fa2a4bf26239a8516c203ee70b9157e4ed9700af344f5042ef1738275b682ad31d063850ad35b83d5f00dc9301ea8bd2019e7818bafd77c32ccfe5e467011286e684336626e081ba3b68001ec86466872bdd6884a172515bd7b2abc388bb329ec40daebe65cf64de274f672e96af8823619989d3229901b093710225cc4a6f1c33eabd8b4273ea1bd8a6467182c00ab22be6e1986abf9b2034a2ba5aeca2a4e83d4818b78d8dc2846304230db225918610974f1a31afa9744505365897f7169d058edeb46835b64fbb83616edeb20bc46ae07beef96ab1490f556b5be58f4720e35e886924044e427248122baf22062a4c2955d59217a13fd63026e39ecf68bbb7a68c7825d748b1675ab18521727db119eb96020e1cdc87ee6fda5b6f93d49f25d6d5c041d0a0f914715a5d58298807fb9db081ef62b5b1bae7d779c9545b5bfc2ded27daf7cc84ac5a448a70a5831b20f591dcbf6a330de372371cc9a9e173237f6f3a802a231a795805c01b9c627dcc4bae234a4da36c8303327bd9493ad09c423f47273bc2fd868f2a3dd0e3f50755266c368ae168676cd1129f44e65779d1563141864b0dfd936ff2d0f56cdf7169699fbdf9166ba2054acb2da2c767fce08ae6b0b04810573c1e6e72ae1dec4206c9140bafd43477a0c3d83b97743f6d5611869139937f3ef81d04ec2920d14adf5df0992e19f8046c30366983d6a7f16a60059b8dcb45023297f07e1d48da81906fc080c21a6c5414b9205838a8b1cad42cf662799672666b0165adb909aaca45243cb75c2cf1da22e704f876c1c30b8b7eb3baa4fffc2f6a77d6b42852f84097deed43b9da02ce315a9612fcc2ca6c99d23db7e79ceb28157aad8fb856328e32dac20402d20eab633ea273317dbc7cc686150920294c001b53f7dd06420f9acdff66931e7a99311724d9c7de8517d2a488e7a78bd748cee6f9138f8183aafbc42f1ca35a61778757423232dac9093229672f9c2b851e4d7ee93ad1114977a2ced8a482b11685f0599426ad6a26b5a8ec20571ee617965e75d3202d9edd44e330edf4583b8c6c2334a41c626f97dd1b9fafe6ed18fffc9d0eabe4539b79c4d75ea2d952891f818f62338054d15b21939786d91d39267fff612d4a123bf945a58c705c40e33db1906c2679fbbdc823b031af09a2cf1a0e87c58d182063efd5a661357fb82d44061789b341f6cb42fd5892ab9369aba30ae692a3cf8e9a72b9c57eac1f4ec5f22d117e92bec90b5875946fd160b4ed0a6d5ee982f093d7a5e2832a023fb0fca305bac92bdf2f40299dc43b0f5ff89bc732e7d2837c4af54dffc02da84ebb7e0cf9998a2f9941d2d4b2a629607555060c9833c6633a31ef262ff531c115bd56515c821b03e7b948b16f3182b8e0458f885583ef5394388cec27a3e52f71a85dd01110c9150fff81887fc5196bb12181c566fb9189b06baeda18884e77055d413fc22375d82807d1e0f0cdf66127e8615f9e569229f8250187d5536b4845d9639813448eb92d1aedf7cca00c5a602de42132a292024a979415f77f1d2130a5096fb56cd1f541538eaae05024e5b95dc4e0a78edd93d1e0b8310a2863d14b09dd12f763c5f0faf5d11720ddcf9df890ca075c2b44b6ef41f0f79989113cc4cb8bd2d9417edeecc49436cd598ec02e9099b58847b9a8b0134267f4893102b6f0ed68a7d2d8913c922c1b685ebfdac222d404acd69c531e684c426585e5d168f7dd5a24e81b7c7cc3e6652c6fa0f04380e4bcb2e5402dc6bdbabb4893a139d424e75f0ded10d9bc78ddefd5df6f4d70420641bfe53a71d26af3226ff456706a0993caf7e3fd84a40ae42b32e00f025cd7250219d57aa809212132ad712d9169c777b8e139771aa3cb1afa01357c79a5fdfded3ca41196b7da0aa35cab171530dced840043d5c3ca906ecba2cb0ef5c361c2ca2be10825b25a7d3391800d91df2a4a6bc8aed63091bfa247a26b1efac74316030b1a6dc17e677d2519765b5d9ce8e19eded28397b17805b47de16daa1d0f6798fc4af51ed19d309d531c7c54b83d9ac05019c995c1323bdb1a39e1278bea1a072e896b12ff321b54236b2015c1a4530c8ac0d4a92484f867cef13426157be4751c52fa955339b76806571d4049f11afa1195e7598410fa28fe79e6cc8a57ba33231958e1e9c5728290ea046ca4760d69be01f1b7498c0142bd41fb4de8186f4a03bdbf0baad3aba7012847de9f1def7292c43998f189df46d1b54f6307a53791ab69179fc8c7506eacd3c43209dbf752b1a2f9d37c983f33533e28c0c215922a275a606e0374a9bd0908e35d2e95cf422628b7f1189031d4380f6597723390940e21907dd138de0a60e525e4448ea3200ac6d48d465f0c6d2203a0272e822ff2f1fc6c5f6facb77fdce86e69f9155119d5d4c030834758866389ec93f27e3fb353e7bcd18d4e630fcad789e5da3e6e898dd3d3c579016ee2ed7baf1b662b7a13274522adca9ab848c1254c9d13b0e7f12b7c96b001ffa5362693e33ed9309b26f5553f31dbd8a4be9a2d4ddd1a3310bcd18371a22ee9d1745b7eed14483d503f78494788fc84b6b8a379af9f6bbdd50015bfbc91c2af8bcacbc920fd442fed16b007e30d2b2feb18ae3d8d495c5323798ffb2bb00142eb124f2bf739d11dc0af65921eab11bb460f4dd3fa18ab72d3cd86b1d0ffd17d2f2a5c0f66965689d374047d87cd2915368eb2b9369dc2b4629a002a8e658fb01b3442813ce43864c67fca1ff15133c73e4e050368cd89f673805af140839c30c1356e78b6bacf76d86cd148acfdfcedadb4e1fab960ef32120f33b32bc2b8f5e1a9bfe032944c8852fba2e345c06149ef8d574f4971f068e5745912be54e6e43041f1a69d4676d501feec6a2da1b46b16c70b86316d6e05a7fd865cd754b3a145ff3fd0214bb46fd9af22616e650567491e847f6ce457d2e84445216beb8400901e07fdcbca6aa03068fbdafecaaa0cbcb8a937f07d0e5e7e4d80ef38bdca3ffcd6fa18859cae84f5b88f511509f5327f371f3a25293f247cfceb1fc9be3585a9661c1aa7922c0bce3cac9f4fb9221b0d94a7770fb472d125aabed031b0b212f9b597dfcbb482c2cf79db5a8fb3be1d9b2fa1ef8a24d8758a4fefe226306a01ada0ecd1168ef1d7221c47658fc8b741a9c926bbf9bac48ed8253e0467b1c736d5b2aec8d32301778f1fbd246c7b495dd7a7860d359d555225d8015eb8a23f27253385866f690b8b2eac9fd167562faa5579092ecaf4709a216ea412304d21ad9e6136a229efd097981fde403a60c4aee94fe7405d79511c4e73d57b34c278c6c46292164f9458e0317c2fea1e90e639e4de4004237a84b5e412b89f191e6ca2370816aabe3c05aaf2f6738e5a5ad9593f84d58be882a135e65f0c0494271e0bced7d654406ffd39f317b2ae656e1c1e15bf42e8745636bd75bafca231c5d9f9e9ea9a2e50a11c8e0ca483bc85cd3395ac8fa0a5dbeadba478668cf0ae60465c2d2a2e0b301993b3e8e7bf9aa12c19a1b447c2a322c7a760b7be7a5ccbbc9f32bb7e72220ad7856ea3f0293d15800fcae3117360fb8b4fffa5dc88625caf29e5705eca9d1efd0aa1cac24266aea4cedc84f19b1e71e81f3d48c8bc5ff7044cd6700d09124de375cc4d452d06c2af1a92985d560ddb56f21841ee9740b1e316801e5a2d763045693138a3a5ac197131d796c2ae337c7a957d79d14a4f301b63eb03b3f5e09885badf067ce718c8c3d7d95decfaa9ff0ba7ae4d80eb4aaf62d93121eb796b060aeb540b2d7e59955715fcd39b6cc108f88a9d0c45c76a01959fd23a8c7573b7a35513c624101bbbd3277e643e71751f0f16e63cac799fcac3b068b8801b49a27fbec48ee8d1de2319b99c88488d22046278cc60d1112c957b968b6d4d2f0ee99785058396eceebbad709800fd8bfaf4991cc87e5b2396fa28ad31c24436cbc8ccc8b42ec10fd809709eaf2da91035d5a745d08f1884a59a0ac231b3687e2d1a03392bdac458c1a34bf3eef0e79790b46f4e0cf82c9d575804ac78cd88a667ee61e99afc6b142329dc7399a9b0afe8ac8624a5fae60bc33eb8ed601d25a750de323d5e590d72a68f6932860b66478bfa1dd452300416bb1671145f16323226b5235248cf0d9074b8d1e9a1ea7093c8bf01d3f51238a00cac0ac732749b61f8b2c6a601926ada48428760a16b83aa478f22a5f36913178e3952b6318aa8c59904866982dad624bd6a95da5f322797346bbfc2e3e8c3d33ee86b9833202b12812e4965bdcefe3819feb71cc9330bfd3bd4488c4dac10c0b4bb6dc9085b621d2d4c5f556247d09f60c652b7194bc3e6fe1281ed7d8942bb4903bca16c1076215aff135c5f02d10dd9409bb93c3a1305bcc56fd107f7217b335f293e39326e5bf6137fab1472165c93646971093ed8425b99c015624d4d091e01d61e537a3b5d975d38a119ea97aefa3ead70c3cbd32250718668fa29b874d44299ca585600d37ce96f4d9d6f26c51584a612bf2432d5a8eba28a496b5e67a12ec3ac400c491e6d26c067615356a74ab8b13c46e9ecfcd72def60723eddfb4cac2929b6573ae3efd377c0808ea1cec89ce6628dcd40a637988a0bdb8f1b06d9a89b84af27bdf9068149fcabbb33f4b77e368cc0aacd771a3eeb6f303c324999ece3fa11007d3511ee673552d9fa3816fffd5767e5aa6170b47adfe01e3d8295b7c30edbbe26f561ebbdcc1ee3c3ee36bfa3c3a05b2792d641725a9632251fccad18ae2661e99e966a89535e47c4a919fe850c9a407e26abf9493cad0bb817c05a371a592d4b69015aaf1889ea57cb01cde10fb1d26edc0e26aff546ebb8e366a73700f51e72df2a0c3ce6ea02e361ed7571dd71bbde4f02384008c0b276929ed0584d63c97dd1a40ff67688928b84d067cfd6439e271cc8e1db12c3c871ad0e3987cced8c8de6ddab64648330eb6887c213dfa09b307eca70ab3592b47071e936276e2cd167695349db7c6f66eababd9a1a73732d702f29ca35d25d667354e2f7f111f0ad76b511e29dadf60e7c1bc4cc5160dad872dae4a2ad4f082a789f4dc213ccafd96ce269f2af1f970a019ef740b6c6e92f0a35da1837708092092581a8f7e27f86152ea39a53bf57750007aed4cd490a5cfb5e5cbe9c880d994a2949baaaaaa1053ad7bb88563aa0c2e0092e2b58b89ad012c0afacd13e708e1c13799ad142519ef2afe21b18d04c9e920bc2967bdbbcec7c22dee0c3ef6140a1c77050fdb8978930c9a05014ea4ed542710202ce84f166221e1b360738325b495853b23276875b7064267fc140347a7e865ba7a5247c63d2681814596e02cfa0d08ebf793196f0ed34e66b849a1202c4bc5c07df793c7fd4012726a74522739ff5600451d2f196372f3c604fa90043d2acf63d90b6ae54e6739789b88ee62ac564b962a5cb6aaf37e52cbb784f536c909f4a559f78e4c534363d5da267928e795ad2bbb4312d6b7d2ece7e48b7df9f945cd5179879ecfb35e080c7b9bcf4ab4187e3cc864e7a2abae244364dff50f7556ee5ca1e361ada770d5587cd0943a17e321160a1d6a7801c34985f55f6cf1e0dcc3a932e6d4b70ea598fb6af3ddc5968677efb560e63013250d540903c80468c41236720cde8e34fa342df5ea65ff0590f771df533747ecae255f17e2c0c10f7e7094769132aef8dda4378713ff2bba1e26c330e73dc0083ec9e0b118901c2f0d88233251de99724da97d26fcd332fb2798ab6d18bb8adb1ee99753b1c33dee5c3f4f0b141296714525b55c7de42549276fba5aed04780bf302daf4510b65262cd9562fbec3d294f0101417c020858880985d0288133568990947cad488d9817f05f8cf00e234f62082c89210044238d824dcf0b79a56edbab259cad7f0fcf412fca6ce993a5476702da107cd407d3b487ac7dff3f7a60bb21c49698dba70b68b62228f74a4517196868e7a7fbad82031cb02f6a9a21afc99d0031e014c572721c986a0fdb5fb3c2f92e8d19bcfd6aa3782687203915078af8fd4b513e30d585668799c3d7bf0b3afacb53c5839f92e056e51d34c6feb204e47982c22cb14e1fd9325a41839ce38ceeceda0b98d3d0fbbd4159648bad94f1fa171d236505df91c908826bdd127fe221413e35db3277d768e7efb56dc1f638c5e6f8e472639ab4a0dd0ffd702eaf9b20c9ed0303537b3cffc600c1d8db00a39ed3e37e3989ee0ac39ce922ac7e72e5534104e5460b987982bb186e67dbd33d49888f4958f671550f725f39b9861450762f5e73fde1c2a91de4cc38b3be3ab598cd4078b1e636b2230fbfdefc50c3088f7001faff14a908f6bac2d64587afe0697f5c2ab201b2f425012ec1e87910305782f51b2fd78a59dd97eb1aa229ee0d7324bb277047d8f9e24587398a39dbb70cbaf4f8e28b73748c7d9d333c72bf5e72d8fa036f82606d9709e04a82e02fe5fc36726996ae4c2d41f16d923550b6fe6f033243a8b3634b38c5b9719c38867d779c9787e4016a0b07c059a43921ee63331fb32ee1d70b9eb979d894f6228845bf2b06b12855c32a6a42e4014d7360119ef98802295f4508c85bd927569a3810352ccae0241046a98cecc813c51d6667893c7bfc9b6c890d49099acb2ef84221704045f2bacd2e3fa0dba1f2cbaa917922538989a3600e0f54140d1a13dc73da94fb8c655f215514c7308361cd06e1a55a2c4daca589296ec84ec07c690c3e16ce323cca0b3ee3ef3c0887f49ec5740df9dc1a91135b81d935811a9265845e0721b0394c419fe45b9228d88f22061c401f85b02a6a00b31f5453945d22f611186e76af3e8cb41c4f96bc5ebc228ec45a5b6476c01c24ad984695c277579fbae56b80bf4d84d441b583bacc70847a902c26ac8404dc1ae71c4930477b088f708d9fe4115d49dd6050e1e678419a7509fb487e9f3ff2c698aca274b0cd18c2f981b4a2c32caff438e48949430201f81bfebed03e0f4dbf3b995cd500330cc3e04a6596e2e5cc5d7769c44684071a6357711fff77d0a6fe95d4ae85ab17d0a66278b67c25e3f05029ca857fc29e5cdcc684f483ccfea54b54ee0765ca382434d802b00683ce089746f25e20655bc96a9ace791184cb62d023dfde9b7c7c47aa6063c1561156563ad475e6951c11767ae34c6b2104ec5da430682b1214debfe9f57b2105b92fd73de35806088780ff8420b639e41cb6715b4921476dee8a3afd4790aac02129981d8124cad1eadbc083433171f193da0e5dddc484581d1e46da282dc105e5b81494d13a92b331c13bf20de8f8d1a75985245b63d38cd91f0460711036058d60a3391a4574d695db2d76b702290778e4cf78962f0acef7b51be742660df27e5785e1a9d9d819f42fa69c3e22db230cdc2c9e20bdb2c468d6587c1b8328b14bc192a6311ce4489e5e4aa045da7170c77284ea423dff0df986482ad8d8a158d4150ab527bcb6d81248b3e3fe1ce8d8e6332972e51cbffad85b017f1b4f181b1cebce36477aae89a7e3598f8aeb6fb3bc3e76192468074ce4b2ebe2d232bd9d38da14cf662490467778ea4de7fd97c63e90117084b9373d075831e2c7892b90afbdd8c98ec863d0bf2e466266e77086a5179f0157862175c4e0558c266797d6a76e8c7e7871993e4520e4375770fcc3e1732b01029a25df824a582cd3d2a68420613de7e8660ea0c04b895407928eb1da8ee33fe5864146b708e71eb3912020b82522f9b949a8358e7276c986e91582606bd7b7cff7401ea15028e18e2de92305f8356bc39935aecc00b65d61e9a0bd8e7844696de14a254d39ed8068ff09fa15bdfe167b0b71624b255ad5d9cdcc96a6e1fd2316e87cae20599bf1b027ad4f68286d1a400df2794da43702091e47571fd4adf8815130896e4859e1fe9e1d40817ad03b6853a79041244070ae3ff174ee860849e054c2e132a883abbd2110dbbccaf8e037598e84648b9d1d3ac7cc23efb2bf3cd3f0712477efb66dd0cc0339c1d60bfc0a3afdf866e55d709465c990f17d6b75f737a49a98884d442899ea328143a45f9a14f8e16b781f84245a1184dab8cb5a1d70aabb5e987ed275c3fcf0e37d64936b3500b11e035d2ed7f3b883a68e0d0155d2657e2f995b43d8ccae714888895b6523b58914b5027d6078f0159a54fa500b987bcfc12b294e7c7b633ec29ef05667b243219fb536c3da3c12583c9987e8ccacd642eb76578baf0e3d17c300fd583fb797a6efb8384fdf6e1f65aa48fc34fd5f7874650392e5e86a20a418b28b1421f0be3c34faaf4252d5ea2e637d527a8ebe525eede490d9aff085910c67884a81cf682d8004bd5b60b7b3c8aab65f7c087ed757e29f5b984db7776ccda1cdb71fcedaf9f92d1eab6c362948593b4f198c8fa6a03ed7512e61a4c3a702833833a5bdad9f1495157c15ba5493115082f3f4cf4e37223360945676eac219affd028bc9ab2d013350901dc70e0b8e3878030e4b411c4cafd30d4e2cc27b88b32257e29c1d5de237ecd52dbff9417811b5c8290a81e4ca807627c7312aa40d966d343aa011612ec4309b509273a156d3dff6f50f762048112bc040496f63e7c6736cc982e6e79e631a2996950fdcc7a58d6cba70c5aa81cfca02f041ed05af69c48d5e2e2f1cd0db2d7b90c8fb10cfae380dc75d78502f2bd740abbe8bd9245490d5492b9be1b95cb4150588606be97de5e090d0495d5d1b18f4c54c9e5e5f3c027bb713df2332f4d2c61e67abc3903dc1439b14fab9ddec9cab735d6de84f24fe553dc133a07cfc4962980ac8f01399fa8caee1cfa46f968b76bfe9e00ce6c345b9657c669ea6b4124d629f829c47d995ec4fdc6d858d8973ebda50e29aaa011c82f4205aa82a49a0cf20a2b7d09e5907a1bee8f6071ac2ba5cfdc9d3c68fe7e7e455659d69a7660b5382b7cbced79bdb84f7d8fcb93a9aba8519f142110033c5ce6005d0c4f4ba33e9f419b9b8eb592b2d679bcabd14da795e7c049c8c2c691d8403bb58fb52569f679907dff77015466adb130ecfb42524a20fe798eb2d00378554e08ccb7fe7a73c714fdf4d9b17d025c61f6273997402b1888d174b206347133a07a390dd4ddb7cf5dfe0ff45de82783157936834db63e91780ad52ee8820349ee74f0d3bcf4be3eca135253f37c7516c1b18dcb88fb52db97a0c1f4e6960fcf06cf7bc0a976ed9c99e0763b0704ef962159ccf0fc4646598aac37ac723859a8896a8659f1d0a764474d87bba4195a04dd7a7aa1b2417144c4ba56840422c8021b187f5cf7580405e2919b9d2ffc92f97aa661d509bc9bf700ea43c0dba0f317094dad0c7df7a2b86439cfd1ea558229d16b4b4b82a059e9149fb73d2668e2a4f716057e95d5072ab3db79060603cbca668efdf65d07bf7e5813101fa10fc86e9031f4e38052999799b84a6a7f54f210f8fd19121a39c8301fda4824415f634e2b565b507ea193388f96a3f2822b61714252a8826946278b46fac403eb0ad539882cf51d5ee96f7c07affc1bdfd12bfd86eff0514a231bceb524afd4de4b5e191fe013bfc32bfb8deff0957fe3777ca5bff11dbdf26ff88eafe437bec307253d8d535d8e11fda074c997677931b3b2533a1b47a53ebb3be9bcbf0585cb503bfab7829a466b064054ac306e463d5627a07890fc75efae75540d7148962f386bca17c8bd8d9c30222b472acc42caf11c961f30622aed4741d842d9b2ca970c076225539a0e4c59a14d66b0f681b7a8ee8828abd19e8abce4952eaddd57db00c2e5af09d5dc70a4ad1b5684ffbab86df0b78db0b57b6d65fff9e9dae50925e9a216acbf401f9d146ff975357932ce6084e647a5aaee43b9a28ed1b9ee725348224ecbd9a855ab7f7708da5171d42d02b2ad1e757387cd246cab3fd0b2d26e0cb4c026110fa075f882ed07a1f6cbf08deb34cef06bbe3847167fc422eed8de2af69a4734e0fa0fb04a3428fdfd933af283f1caac1653099f48735d108b6d74ab63788c368440edd48da6cabd9b9c9fc7cec91c017ac13163e18f19ab6c9f5aed416e9cf89eae41ae3404bae8806be8fd32bda5426081fdec403d29f72dce39de152aa637a9a03d8b26dc385f7370a9adf8dd4b2ac4221c4fab03eaa0125485cf9b4cd45bf8fedf92a0078411c32a47cef0996ec963f481df61fce10db17dda1b785e50ce218b707596203ad9ce5542e18835cd9aa2d146606d73d1cc0fb242f940b9e5cde02b5bdf0f1810504c465666fe2c3de41b5477612e8b8dd80c17840cb7a8ba68416713cba16826e9c2a0c5d0492e5e7294614bcfb4a0aedb8f22fd3b9fbac65d79098a467be1b8d03aa29284f1f831958f33b14603ff2d57ae99a4e1339f7e01424c3336d36a19bdcd0126fdbcac769cb1d57a6d8cc042f1d9392f1935985585bd1db7e403b025bee7399b9c76441f22bc397b20bed5308d778f75d41969d8f98f14a66ab277fea6db72644af1f19dc2f3fd41710d7ac560254fafa0482bf0167c989e029b169984c6d91a2660f989544c3cf98275240a858eea10cf82fc159a7a41a65cbb91ec370fd2ca33b1948f991863ba3a7ddf6906cb825d364acb7c4ed9f41ab5bfb7c3a099c0eb71f7f79a293bd6999ac59ac2d267f0c7110b55505fcc6fecd82ab1b0a55c239b300c06045895a56abca914bcfa901387a3c879080a1c0671da48ddfc7e8366de8e0b079f20e7c37f190456a162cb785a94c9dfe7c3f9c81456895d0cab307f3ad7a1e2692f3822882e4600212cc2787d91a997ff6d811f604c5e7e6f6ea00ab0c12652fcefdc5e91d7e5f233d02fafa0588bbef7e4ea46bfc8e9970ea361f3a0eab0ca34ffd1d36d607c12e55855c6cd1c67cd5f887902fe09154f5fbf389f7651695b3ccae8f31cbd67b608f2f65b8938d2b065fb0039fecb5ceb805582a26d97f7efe449f29b7f21dd10be609e355f49a1e5e45bf56ae58d1e98113cb7334f6eb5cee6d4dddf0c8822957abcea5c08d690b9eac7c28e0fd1d11a493309b588e35c01b1c170ab02a676d563ecda286a5686b9263749040503a44008c4e4150cd5c9fcc80a78a68c52a85d1025b709786fdaa75b4b12a181f73e0a8e40f1fe56ff3bcec04599ca85797d664ce101de06eec1c2cc81287a748a3dea7a28a8e371bab6215038536fdc6ea61b29c68c0ac5995291c25022423cb5c8dc56f143e286405d050e74879fadbe43b8eefcd99e52b93861e1f348a527eed063152609169a38d22694e5c61ac097187dbf9322c931379e3ffe1d27bd9caa3381680a7c5a7ee7133bf4871d39b80b645e838f95a3678224035961f74cc616203e695a9587809070beafd020484a695c90288d6b9dfa3c162302226833e7b95d188e8a267d2ac29824edc408c9f6a029cf838ed41f45cbded7fb3935afdcfa3e4962dfa31595d34bdaa12bb67fdea638d0c236b3876bff6571f1b3a466309212c715830a2a4fad95390baa6b862f4c348f57157fc617400e1ca271ff325c4e90e6926c15c8f44e8a75579449d1185273060e759817f183f7def8f312d2e0e58cfde81fd6e946de5bba0e9dc3293454484550d0350c1d3ae2249d9dab18a36b0c5d1984d948a932cf3bd2bffd1f9dfa168fe82deb866e426404803005fd9587f9e07f9873c21bcc8199bedd19cb68994d1c81f81b40ebc05a5d1e3343352fa35afdca910d53f9d1567f1c4b8be3d045ea9d6edac8f99c12e80f6c0518e52c5b371500a0a39c0717018a6ca71a466f0dfef222865c8d2047322c84b7ed50a71cbc83deba432cbc6dc7a6a5239f49f09c5ac2a682f600ef98ead5b4dd00d0729ba5c21c471af8ec1214b6d2e5a8b40a0b359342f358343c8229696543f330763d24fc22e531e4a93bf5450b45e99e7ec3c7de866c9fd086d0aa8aaf17d08b2815a53f09f4e9045e138f513b9a31b91a9145ec9fa5615eb4f5610639ef3700ba8134a0132c78ea3e55db63c452df4af4a80f5efef6edbca5c1fe3fa1bfcbf14c4fdbcb719a1fa255aedf5d6e7e392a73f0bfb67b5c5449aded6e289f518277583d9a493a45c7fdfd41d4c257ada98d1acd30aad63fc97a9c23b0fbfc3ea1e179393311001adc3e79d4012834aeb8ebe96d1b2c4eaa27a44145e21ebb00fbba11316eac520ef5062e783a930bcc5e562e655e04e98706ac87ca8d2b6f267fd5db0151ae00d3e1ef4e85fae4c29c0c4b1495fccf93fb305399da6534a3baa4fadc4872155c7a9a847ac2b6708fa6afe1889f5a088c4bc062e788fefc22640990bceb94001d10fe50d8d5877b21a90b732140e20573737f37a524eec4ae883a8588d4575941bfcbd04ddc63425ba93b040180d672c10292e1d094fe9696f92311e539b6d84cd7856d075b5eed629ce47db5055f0e5c8bdc30595ebdaa649c6a4288e58c833fb8fb07bc9ab3a09053b278cbfc54ff01054dfa23e1a1e2525fdae9b90a92e07d9ff52057783777ba472938a9c44ca0750ef27c962968e0da96f1ab2977c44881d64ea50651132f2eddf6005dd23828e64880e666f1dbab84c6d592eddbc7b0d6409bcc4ee2437ac359c7593d5aa0f106d333e6c4c68c5356686a560165a9fe49efdaea9e634a2a3fbb439641c2d6eea45bbb835ba9979a69a5a7c99d901cea06af48b62a36c918fa8856cd7a43c18e5095500a498723032d6eb8caea5b3eaddcc33d83cf8308f4133657d3198c8543bcecaec5f6618e6b5fb07f6e94373214398d6dffecf75cd37ba20ca28981382792256ddb5c6bfd8d2eca105f3e9cb263205b7ce7fdcc49ba0db3fee0800fb5b372482b4e84a5d06a530d6dc01accd34d2ec56e0f8ecd1512451d909fae89ece8a84e505c793939fb009742e524022c0203568597e32280cedc7c655aff12a95251f6eea6b51ba6813021be79024db8f4fe0c4cb45d9cfd03f69477730cfb1d10c586aa0bb8db3e088306288ad364cd764b9b342c5af58f5bf72e04ae59a9ad08a596b6b252f7985672f9c5fb28a9d614e10b5a4082c9b280fb5c6a656c8d1bd7b9db9a12ff67bff71d5135b2296f8df4217004b9afb120cad29d6f701467a6dea1aa4028d10643e1796046c86b0ee5dadc49c82466199a3de64a3df87d2dc5bba585d5d5e8736d0c4819bc988d68dd82ffe76554cdaebca15a646eca36f5ea3c374337ee40cd559c7ad5e4db99eb0b61ee9717e473b3ef5ca6a3d58fb833f8f68c440e8f1502c519482b015636934fe73c1762c63f49bf88aad5dce4484aa2af0cf22991e2edad289dca97e37ccd3b6fa0569d9ab2adbd3a20df292d8f1a0cf5913b70cbdba135ccb4c82434eef32a266d588e8be0d0aa3a3f2e3674e69e18c369497942be4d545a64ca930253a4b8c3eaf8d505c3423cafbf58fdf73d741079a5ec62497f836cfcf2972d0df03f44435ab31ff75d45b05dfeeb77ac5733d253d294c8400f7751c6c32138bb950fec1c52bfc76303b71b8e64c21f1796cbcbcff9e630fef57258048789f40ea74abdc9a58b19ef305dce66781c2d1ef36cfdd91990bfb26f3096ed866b0bf3187c8d802f4e5c039db4cb480a8b5ddc4ee533135d4dca3bfd9d9c7cdf89104467c02757de71190274f9c828da3fdb2a83c82889d0a52b894dce48b5488a338b6258f5c7c2a758355a6c4740908e5565ad78e1d5ae6cf1dc74b2cb43efd9b695744c9a043fe4f6f12f5012bb37cc2c843ed81c2866e720939d9b7847088dd0b2e53c3d5f04ea9cda66a157c64ccbcc35204dff8e10582211dc8b30bfc27fc9d78d05c27e30e0a404e77caab41764ed3f0710b96398e878a3b4cd291e60c34bf7ed48585af192862f5fbed028a5fc008661ab6635f4e2ca60a3de235676dcdc12804dad9fcacf46be92491d1c0ab2a77c5c55f412abd66c4313f75869feac926edab0adf4d9c72287857b747430146889f9702f6636338f2e4d28d4064efc66204750148d449ce29c10660e72ee2ada1c3a82963055a3dd5cd1946a260fbb940378e2caf739976c92306415988e6f9ca4f3fbc1ab10f8c97a648ed7c515cf44efebc52d3ae6353e3df043d3ee71f62a281acb43af5306c9a91c2b3e7fa1face3cc617700719280289ce70176a6b11630ae14698a89283e497669cd2130a207363988336fb6290ac69131dc5e5995f0d0a7a2535e6103720adef656e3330aa5c0f00af4ffdaecd472e9e531d46b4842ac37143fff915c8907232bcc54475c6bbff3b0c82164511ba304e69e94f5822228cb5301563fa9be4863fb6d8d50637f91664238740987441969cdbd83b8dfb9e6acbe11229bcf443e26760c39141e3be16c91425da977bf2affdeaf67054718e93235abb1197ff701d1f5d530f375bc1ae000ea741a54d664bd104ccc41a9645f10cd0dda83f4be35923c36e985994086419377e08140c8f1d7deca312f3f459cdc0ab2210a53af3b523a641d574042ae8c25271fa80d026aa0d41b82797e76cbad46af60251354f055ad4b1cf085f307af14b070b9a0aa2467b860481fb8a8867be805023cdea52aa96d00c728223b74da3d11deab4eafe53d65434d94dc7cd64041dc327a2e232fff815abfd951476c343e050c64ef40fcf4ca825a255b6253ac74383fbfc2fb0128653b003d6e92f27e85ea9c579967c40cd38b72758fa7f17e499779ae7974e66149ae2b931b6f2541b432fcc998f020e92f823baa0ce3e3ae15cf00cf0406ee6da290e9b45c6c0272875d1497f9e56aed3e738fb41c2012239f81660051a83264712c94e82602cf52da82acfa04ebb5e7316755bab082f0296c25decf3a7683f8e90575a0deae4171404fb88a63d553215b51797134426204282c5d9e93cb61147ff0d6d47c5fa95c4c9b724859f5c5b63363963cc9feb8a1a6a7d8bcba953a3c73a9773a189e1995af72d990cca43a91f5d8faa95ea8c4843263db8b454d852263d2c462f0c61ac95c792141624e119813b289f1623a055f055d2466916668c930024e283c198e7e1c122b955317955d981f5706b575c4a5094d47172ab106d36be1623fde095ab4e5f06408692de700aa11584774e012a8dae47564a569a4a10338bc4c81891f5cca47fb6d9fb10baed281bdd79a06567908ea8f37c402b3e01483a099f19989b8eccce477878e230433224514b31996c14cf38e6c5b9e5849559be05ddc6d89a6c1cc23e42c1812f10f2dec532c492cd98a08787a174673fbddfc11cd5808d7beb0a4e2bc3401e377d0d71699fec4d0532c237e1cdfd47c03c8e2e03729bcb30781e3a11c2e8007556b544a5533e4a4ad190d5b2971e593b3c64e95df80d0f4668bf108f01064da6eb5da7bf8cb6fee1257e0768a205e1764184b595125046063e26345d600196cdf5d42fa06eab714b648377c2222d05a3e90c86f89d0144e6d59d18d0864351e59b5b723a24ddc6954408fdaff7be6ea8b8154fd6cac59e2511ce4e219bc2c5b6bab2903aad12ba021f61d7aa71eabe4e3de1a0b154a04abb27f46297e47d31f0927f941c74bbe41faad206d89a92d06f4abeac748d1a86f12e8af6f0152de914b6da9e9e51492f3ccc41c78b9ecca1f518cc2df868359fe55b703c4f9ec868f449b75ac3eb06f6874337e5a2bc1bccc87a108d17947a6c238adef603bdbe9600927f6aa92c2faf57f62cb1e93e323521b5f4d8dae5fadbaa4b7e43e25f2b850a74815397f195cb6402173faa51352cb4e8837c941e450bfdf7e43e3e4e527f152e7a693116fceec3c040c010fa0b031ceac4ff66285c1ae75863fb0b8846d52a4c9c4a5286df9d390b6302ba5f59640affef0cc4bc3c0505efd699d2bac6a1f0bdd69af833ce27e0b4b4bed0f71acb17e9ff8ee45c1a7eb6b4472194278ef480c9079661bd4a203709bd89570627fe18dec8a2e80d4e42980a5b8285944540b204ea2784cdf6a4ecdc39353449597da44ca54c6f8f4708908e46c3bb3aa51ff8db6f585c384ed92b903f11376983697a558af55c54ac88a73121be1574d194053eb73a87d474763130eafa5871719a30678282af96aac8f8c79c23bf39a00ffd17a311d29a16fc11f2ddeedf444cf090241bdbc78a287263032fcb16a135ad91d156b4057a86146b0abf92013bffa59f77f1fb4deb5d9480898336db476f54120225a7b9ee0f4fce82e783b83822ddc8999aa2acf39361f0024efc7c6a50d0dc0e00b2031ed451ae3aae291902649786459c006491a910be31a6b0921082ee15b527a0c0d6d22b1e5d7ce6221722d4cf342628c93d682d3b77fb86cd7f7a85703d2a6bef0fad3f08992ae03a0ede0553c7df8698d7bdddd37acd218a3b45cb0cb1ee499b8e805c0889e8fe1d10bff0105737df85157f3c3383fcdf6f566207b212f07a7821ae0e626aafc7f78987c5ef17d3e0adef6135b09b4b47920249ff1d0b8ba3f37ecd249a7020c365907fff65941e66839dda375210c43782b96c8473e59832f9ce3b97b890367ca6e66a4de642831d05c5120d62fd24fceaec804f45b72a813b9c3c369a01b6d006698f50f45ffcc3ff3fd14704e22a16a12ed20e6fb9fa3b279fe413da805adb2da0eb95d85527e425a9cce671677a30bb7726639d6b80fbe7fae235360875c88d373f8b52e80019fd4479c0cb195c254d45a537b9e47e27d2ef9b1c2b5992adecaa066e0efcc4e376cc9e8d99e09f7af1c76016fbdbe91710483f6e363660a62dcb2a2be1c79b2d9079210969a45b3ca36fc6501caf10a21cfa360aead1aa22be0e72a32b84f44f22e517c8e70056da007be6b9a07b9200addf6b72ed67006d2e932fb2f4d0b8bc93044d2809611f51421060fc877b3cb3edb1fa1cb6456ebfe30f9a704f47f0562c0bdbcf6ae93f482973b437cf6f90be90b9c012d7138e8df2d84b518503a3a9379cfe2e625f2d8ac4b4c2decc0ca54112cb952ca3ee835e8ad4e597912accf18d15bb391974af963596720d94c25e61030d6ecfc936518530bd462188be7a91e20ca69576357481b94934ff4403f38ebcec41016292bca874944e221806365f9f9e63aba1acbf653f36704ab23bfbf4a6f626967bea0d797681d7ae66cdba2ebebde6c3964b669ef51a300b144c048a0e039d5c3016564d0779e4928aab07936a76024295dddfec6f0249cc51aa8aab99149887b7ef0dba0ff494c87e994443015a15d5877a9f1e77e73e5f83baa0d509f282ea2b5e0da3cfa69fb83d7b118f98d070cab690b6775b937b4b29934c01a109c409cb09d569dada5089ca4e3369fa9134a548ba1621ae3c9d82c0281efa41ad2c79ba1490671e00c175a2e2d6671e0001877bb5ea4e54dc7eeee9819297ce26d4b41e8397637c7e54f550b1f33685ba47b8bc91e8e6a42ad098a17291d19262595149898182ba27d3e7752592e5b64a7ba4945341274fbe4a01fd4be184d1f70525105edeccc9626e4d3003f469c8939d3986038045cbbe42ca0e4c25d44aa3562aab2ab15675d11e003df750a1f30178eef149f237c631d3e7923b96667f639c97663c236d5879f034e31820a716c7945230b8405266b3d8dfd8486970b2c207397f6c851d5290ca38264663b2269758666ece592da5cc3c67cacf18bf63ce2e28f374574132b9f2524a5242fae9f2673802d156099556ba844a89e6dc39829495526abd9bc223a53aa1d24a852a7542a594d24aa95727ccb905651b74fc32f2ecfbbeafd2187145b5fbacb5218d3432599604ba12a952c94b9d57d97a3785474a672d17b7061c3878de7783ba77796eb4d68083e68b2b3f93473f12938ea896b35c0d4aa552a934a94f52a9b4f9a43e49dbe693fa246d9b4fa793c47147a85b9342ee2d770409833ab9213a99e9e299d784bd0c371f9ddfaee0156f3c33088bdbac57bd3581616078266ba34d98598bdb50afae60715bb23581a1f8b9c33307cce25e1c2c8aef176db2661543a489c546230d91864873873477ec108934f4e5b8db901d6ab17955bdb92f07fdad09ccda3627fe2991226d9c8986a4d003dc3659eeb87aa573b958731f983367e2cc3939f43967654aef3dd119e4993583308cb5dc0cc22ba6b32b6fdc385f359cae6ed2598598734ecaa59d0a4e17c7b077739c734e2a85b8d229e55aa7cf5a7bca90dab0fc64d7a2b6a49452ca1ab6d0ca4462baa494524a49a74e5d792ab74dca0da68254f54a697345aeac4cd9eaa020254ac66b34def1f6932bc316aa41504ae90aa5f31503522ce5e219a0be4129256eb462324396afa1922dc7068ecc76b37ae24c8c5e39bdea1cfd349472ba7edc60af95b74330b872e565b33c3b07d6d03034f3355f33a7599b900db6c1662da64252ac1aa1e3172ee4cb0fdce6daedc1312eb83309c442330a6e69bfb5642148f9d0c067c88fd77b6cc1438b209de7b9fb16ae15e6c1abc0942527d9ced96bc09122a37af1c9da615aebfc3a7ed0c1a3c70f4f483eca16a9fb6af5bcebbaceeb9cc11ed81bba4d5a6232813d78fcb8ded00ed6a5e3071e7a557778c21050c11d79a84910e0194ee9d5bdd665264bc74ab68e6b650eef1af2d09173bfd7274b25287df1c30e3ab8cdd9527b4b1e0e94069a1a70c8ac5256be9a347449a0842b49f09dacfd2dc073daa2178ef23f1228815eed10bbf74a8095ec90822b01d76ae5bddae18a2bb92366665aab5c512aa5f45a6bad5cd10c9d6ef9ded30636533a27a5ccec52b2a4a62aebc4ca3c5ecb3de665496511f7db6af79353088e10836b02faa848620485ec04048a98cc153725830494e4f9c147ade5edce60383284233adf5eaded80d450226bf1edf652918326bee7eb4a1f5f7a7280f3e0d58109414580a0081a1366f2074494ba97ee09568b18a040c209ac88820f0a4010849af9e3e493f2896fa72daef06dad670486821d233230c2080f4cb063849653336284e33272f432c2e709d7103760b3274a1082278e78596b2d0a6a1386ed134b1471c388a109c3f61e21e374e3b68d6382f61c4e0dc7711c97928aedc478623eb1598ce631a1d576278bb91e2694701c67690dc34276a861f8c77b2305b59449878930be266240c4122eeab9270649dcd4161d8b9225d729a7b4bc00f6519f254b666e2694254bcaedcccccccccccc2c5972e8524ad9d3594e72b5cccc3cb9390c194cf50a89ceb628a58c0d5f715c3856904f2c25b3da69c82c954ccbeea4d0522f4545259dce4d347dc97d6ba55bb753550d6db7cf9706ea2c731cbb0d593a17d2c9a38f79398697f04821414a0acfc0dd729331ccd05f7d47a532062671cc8ce41891d269044ae9e8e3a51581f792524a79dc21f8b63989542775dec12a4d2e8954e7141acac1d25a679d938e97299d3e9da31bad94d2f9842221a517d43633b34c8295cc3c4941b89bcb3a799ebd94041b5a599d74d2721386652d275b6ad1dc5699dbea6c1ace4d360ba6e86c8b35bc1a2fbfc287cf81d5fe067eb77913f4ef386f822a7c673b9237c119df95bc09aabeebbc09ba7ce7791394f1dde74db025f5ddc99b20cb771725064a8c149515969616192e2a1a34bc09daef54f026c87de7de04b7fa5de8adf0e2b5f0c2420dd30c7feac61c6e61b5331c2995b586b56e9b9c4d2927e9132920f0b6bd9241852cc33795620447dff22c85088e3a50f2391b500a5bb306881f35f3fa3851e4e5772387e9db0eee7d140ae5a890a26edcd092bc9b60e79d0c0ae4f297fc05cf5556bc395f0157a04f989490fb3a31e455cf3d4eb8be6b4f9642204a4ed3d50361eff9078e3ffe43397f13052574c1c18fe236fc28a18c21aea3f84b70f4fbf751eed1f48fbf608f973eea9bbc5eb5e72492d5a1944329f4094372ea16745a633dd01ba78435a70c19cc00bde14469d8c3e979e429fc38416e02f40f76e07aeed1c1d1cf9e7b740083efbcf3e93226438d7081f0806441500d866a9ad8dc03120a2120d1aa696207c9376fd781a66d741d68c32379e7a3be049c9ea8643685a3f492571ba47f9d4b1ff53bf7dcf3ce9bce9f9c9dec3a972fc3c30e4c2ead1e29b4212383903b324d478b72f290711d5acca1451ea21b8803a4a96106577a72ca4a2778805a0d725eb39e18cc6cade70857a553a645172aa8eca66438f2d00bcd5f6851929ae84cce2fe30b3c55dc7106eca60914cbc99d03b5fa0ac19d27967007e7fc9d0964274874d1eaa6c78514ac91823bce8085309ed95c12c12be92ace2caab8dc417718cf4cef7c829babb81ac8132153b5f5f3f35235047d78e6ad9f7e5201c7f929e158bd6f066ce440ed7970e08ee9f2597a0477bcb419b170066c86102cee0e3af44ae66082eb39e8b043e928e5ea5c2958e9a8f4a42b936b6216670147f92c2ec37c1a68e49c132cc57c70c719b019b01933746610e98cdc5007e533603c73fa9571062c059b016349149c942b853303a6e25271a9e0987cce39e5e98867aa4b2178c5b53c3fe95cda77c4332757e1594988db6a99e2e30d626b283ede202f63f8097418c734e8e39a01537181b6c631b254695568c20c19f54aba8ccc0b3cc373597cbc2c20ff0a38a648f0d255c071024901474a830f1c2b901828d303f228d007a9e252c1b1996ef21f351d07bb23cf7468378540744d6a3c35ed1df54e952272c7d2512ac81d7916c6c07082a10cf4e1189e3baab85e25470596d32ba902933c77fea8d2a519309ec98163a4cbeb4d50ceae298c4d985214dde71f38cafffca84eea2e271e2d8e282ea7d086fed30fad2922fc5c7d107eae7070cce4daec29a969fc31250d83738ea994abb587eadcdc408e3b45e52fa015baecec4b645a466e75dbea27843b9f7bb2d8a24816410dcba208b287da13904022e765c48911d20548a8a0c24812161c79d5c808810e31d9e087ac8a22a048e2e708503842411656300008532801089a841105a0139c5a1f0f6cd0e0e70450184901d0133534877612a2c36233bdb2b0c2b3f8416bdbc291c7cb8741d9cbe2e75344b290e24797a1a55688e8a15288420e270526242b900882a5688284265434d9d101cf4cb7206d280b17d36adf91bc176478c63a7d592a13725918006651a193cb3f854c43afa41075153be3ce1a1c439da6a96cb2fab5727fc94edc6d600a3c514b6bad73ced0853affe43cd377bf7bbf6bb24faddb8ef34cdffdeefdaea94594517e3798729c3ea57fec40bf4b8ef9d5e7cbef269d3fc1fa230f992f7935acdb97b55f5ceb15c5a97bcd8ae1d469ed4bb7e49576f45205cf3d58ec7c476533a526971c93037f72eb14e5a7cf4f4db4fee4f70644acd32c3eb7426ffd5404eba72110f9fbd7bb18a81415d4c9647a79e104da5ff9e2f273de7d26ea3d9c3e3f81a3947ffa164029753e9d420b7ed6bd2fc7c9ce5e7192d3e2781dc5db1b86e299146fef2278e604f6703a790a28ff9b22063b9d9cbf1c2747f1df1b5e37390adc71fde4dd77c3e7272f7d396e780abb9417c6777e025b48afda63808d22bbf2fad82ff9946801293f812da1508b394e604a1586340c31793bd56971c7c9ad37e9bb4112a9fdb780cfad5390df7e394e6ea96c5ab75ee3addb94b7f2c5bdcef90a93cba57ee4e1fdf5d1479f40fbf5bbe1f4df8385cef392e79e211cf9cec55b697247f92a6f85c9e57c86b7d2e4eed8419da3514ddc9bc60e3c2abcd6bbdeb89a42a325d3a0a6ed4de0f4c071c68ffd7a3dedc7149ac38f54e6a9abbcfc8a9a5e051223a4908288eb598a1808417996220643dca89e7b785cdfa3f3dc63835a8ce79e9e9cefe9e9e9418223bbf9f6ae48c7d32501fad1b6a270fdb0e493d8fb331228e43c0cce2fe3d7fa761d7ad5d45e1d38887fbc9b7a49bd8ea9878379d63080d6d504684781216b21b5eb3adad18e7694b690b9b31dd974887c6f45369d5e754c488b2bac40a44334a4c5306c81e09297fb900a2a14d568d058129b31a34848a582b9b82c71c9905174d4d24234944abd58587456568a5a2a2ab3941422a118318a6028283414aa762fd1d1e91413f23645aeb729ba799a260ddd9163f2cd0d71464fede586b8f65fdc986db5f852c2cf92b33916c6711c9192ac54a474a4242b1519653ca387511da394921bd4b6037a1ddd8ff42ec977a74324d6e2587a0d291529d5ba234f7ad5ad5eb14b90dd4b552ff54c7a224b1dc8c3231da1e08e8fe76e882b25389276be7924c9be3dc8f5bc13e2d6700fe876dedddc9550af5ac9b733d801c1000a0183c70083f3b3d3740c30c000030ccc30c0d00575b30e68058e9687f4e48ea517cf975e2d8e1d2ca7c5913bf2ed54e74b2f2e08d6e228f3425ae41e2441dfad717375321ae40cfcedde8b67d8f582c574accceecc928b6798c951271bf2a427cda2357d4312d285dc495e2349c707fa487e3ee6b9078990f780fec5c74ee6ddb82c4e8b2e78bb7db5f8420de74ec1f8782da73361da6b3837abf4b2332037c673e8153b0b2e99b6c5e0b640a46bdd18b7d12b8ea1e10517c0d26b363b00c23105138e77b55ac99517bad8f0f6593aa07168011c99870570b43fdf5e031c6d916f7f015b2d29e42bac571d13d2a24cc2f3af00da100989c58886b428bb78fe10b4211a42a443a453f4a445a9e4f941d0a6e849abb504a7458984e777d06609ce92d792979216e5119e5f05d0a648c9d05091518bd208cf4f03b429322aaa15d5960869510a3dff0cd066899025b125b1a2a0162517cfaf026d8a828a848a84725a945b3cbf0b68b32407065b72d3a2d4e2f96580364b6e96b896b88a98b428839ebf05b429625274547444a4a4455984e74f8136444a88868886705a9444787e16d0a608e7f52a1ad2a2cce2f957409ba2213a3a4f5a94b4e757016d889e14b58a5a3f2d4a2c9e3f05b421fa99cd88825a944378fe18a00d511091109150514e8b5208cf8f02da14e514c18a60402d4aa0e74781364440349a518bf28ae7bfa00d9151ad46c4a4451984e73f8136444c888e888e84b428ad787e136853242416b329ba6951ce9eff036d8a6c8a5c3c23bfc8c531fc348d0406b01fb9a1adb61d7dd776a64c3da61e4871a8abea0c69e2d6706c1f57c3266b1ed5d874c126ab93753258d7753b2d4a6fd9ed74a17575456cabdbe9640b0dd568b276320a16e191b37d665b2d8ed3b5e3dd2e1cbdb0dbe9d5aae784753b2d32754d9647a4991e4d96173b9aae6ff78834cb3e6998d86459797324c74e265f0d9bb67533b720e9982c2b0ee58016c7ded857af2c6ce75bf6edd4ead896b5ad27dcb193c95a2cf2b55e681cc0f8849aa94df2f2e74bb3038c2520929c73cacf66737a5377035d483870389c5b39c771a39d71cc3870a849b04853633c43924e6733891b55e54425ac4bf758a43f6af8e33a2f81a46ddb7c6c9fae4b3fdb6c6d1b89c4d6b33f6a5cb6eec785561f191d26123bfb6694721441b4beddd2482d124eb3a88ca300726454fb9611f1a33df25a5104b1821f4937b4d280825a3cc0f707d4a2cd12517a2780953c4d8a115e4a99a4e4f3d25384d84a4f79bd1c51845eb68fd04b9273e0e63409e823485d7b1f102b8ee8661cd376d63e5f8b637a7260f591d2ce3aeb930a722517d234d7ad6edbb4244b224d93e77194524a3fefbbc17d5fadb5525a2ba5b4565a41af57305536b160fd6998f693cff5f96ed49f5ef9704cbbf5f99e01595a900f075a9afae26e4d29e8d18942a1502d1955327d4215861ea8a085041b781965a8974ad970942ee50bdfedf6bb772ca53b68f78ede7ccee0430f720adfde523af521dde5bb41761c5cb62e7df3176468b1070f7cfb267fdb7c051363a3c5ee41be7512c9871fadb750fc0f66bf79aac52de53f42bff98b8c88facdb9f59bd36d335dd3b79bbe5d857729397f07ba94c21b0ef0d67da07952e892e300df7e806fca73339370a577872d1b9072c2dce91de0a8a1579db2915aa97c655f9092b9d209ee981a398e67f8bb0aae054d4c26a152d48552f0a74b5801787c14993c84909ccae661022dca2a5ee680c30d397886924fbfdfd998ac1af69835c8194a21053886e9a470477f0fcc621d3de6ec5007c7d0e04adf668f1c2e37d01d2e9df3979cd25ee510e2e8d51577641d5bb5d3daf072a1afa87c4dce041db3a59b8b63e8b1c6cb71864a5b4b22c9d076c702e44a17b8f966c3c6dc36ef0f07f9241b5a1bcd711cc7711ce794e3a95372edba39b802c6e5bc8795f7f14ab86ccdcc410839859ae9342d438b3b4c8e3776798d2c056166b136dfdcc53adfb86c4d7512579d0482c0460de538cec5863950e7d7e1d6042d2caef17c5aec805a5c29a55cca124033b9cba55228e7c0d16e8cea482892d712365d29d1d24aa9940a5740150ea8ba71a5b0a8801c6ccec9bc412177c66d0a21311bfad2a78666813250f6f728e503ca503354a51555b34c8e504f440ec585828392c3c92356cab8f07cb6bad5adb7962deee8f978346fc8f3f12aadf4bd066591962677e46035c6842b6b076b9f24497e60bef24dd57a79cfeb6213e86537a3b49bf54a76b49793a56ab9ba4fa657d3069251a6ab5d2be5602ba8b439588b9372de583ab25356c2c1a9b55537aa9b9aa48d5232a286bee552ddf4ca066505b33818c3f00c7dee693f9d4b01b3a8e7829fde9556dcafacbc13eea86aa95c3f5b5c7906e3ae30066c683c0d6d687c87ae1a5f033c7780e73c616c68a884e7ed4f5efafc6c94f0bcabb3d6cab5d62a6598460d3c6d6a636bbd9235306053e36d6a3c0d757ae511e9d50465a00c2c42dba98db9f1fc94992cef734aa5cc694099c854ad0e5d66b4d2dad98e340b05d45b7b9b08eea86a793b9ecfce6471b01dcfbd50ca444a294c75a36aa960f47494a06628da54b53c1d938d37f3f1e28ffcf4ae97b86327d4f9c04ea8ad522e06eb95fdb92307ab615cf923070be3f28f1cac619c10efa745978af23a239e41f1983b303a29bcf440f092092f7d093c13c3eb96c033fc29bec2b2c2c292b2a14bcdb9425bc2a5a0ce4fe7118cfdc4f9110c02be1e84fd4c809475185acf8763be0ae3b8c9da6ad83ab92dc393d1963b1795c7c1e04aefee065da88a86c72971a57b5e672f3df04e98a6ce1c53bdcea041e3bb7125087e374a6eafafd078a632f3c61c13d2cc0e1c55f8d429a463a7c3c538d80baef44b6334542dd54dd7f80e55ad265c935b5388026a98e91f4ac94f6f4e48b3be1045eb218f9a793f57c6f0e91c0354b5268ccb3d6e31c6b3b77c7199834d28dc1135b320cf77dd99302a78b6c955e1bb41c331d363bd9a43bec91db71d0ffc6ed41086df8d6ea4fff2f2dde8bc060b2c7c372ef538180c4d770000c077a3736ed105cf85ef46774291f1fc2da0fb5a6eabf35a6eab24b7dc56514e4dea00e0752eb8f0dd48f12ec6f398ef46ca57d40a0ecec655aed61a6ae8ba922d953acbd5ad73706525a19c2ead2494d3557112cae9ae8063a733f250f17c5452a64802cff3145d08f9013c4f910411bc14afcf139a3001f002f0ddb8b2a593759d4c0874f10c8acf51057b699dedb69d6baf7e026541ba9173126a465a99f14c6b3a49d6abb6462da6f4aa556aa8231634b969d6cdc7132b8137e361c1ccb68ba8faf9d5695a94b5d8deb282bb91c0913bf9e6dd77e374a25eb7db09c0b34cee006470b12bfdf35165030d56b56e385e55cb86cc84b9735eef55af5e812ad754e55c6fa39baaa58aa95aaa17ff55bd54392a98ea4685a372a95eaa1c154c7eaa9693dcf4dda07efafa92406a51ba189e94c9542d5944ca68523f17d5ce42c1b85dd78e8353c72adbe8c609e9d5f452104e086a86aa4dd40c25849a01d150422825a8a10ba2805041bd9a281a4aa8574a5043a8d913577a95d1f40a07bd292ed469268b36013cfbc5754d96cb1702e1f2800eb82811e373aef1c2ce05a26280a85913607642ddd04bafcec14017ea392490ef908bf56a965a77e4601c8c8bb5c89e8fe7e3befa15af14853b82af9f5d0b4a4617d4a29441bd92deac0930dd044ea79f03bac6f3b1c11d51b351d5da761ee0f956843b6e3baa96cad562d7160753e1348b837130556bf3eeaf01b5e60b51b326dc2a65edd3371e19a397da92344bd5ea2d1cbd47d18cb088b2623bc2220a8851b32177649e9676c2b03c6ed1c5061abf425f764755cb858636b03c66d6e7ec230e98f5855c6cc24c0f06c54fef6c78b248013c2fc077a34469839deba2bc0bc11da58c3d1f1a79e44a67da8ad0647d3bbc814ef06a82dc889ab93619a1679db8a3e7536b7744cd3a2f79e724ef7c7a0dd3695a6cc7e2a7977824b35033d415ccda7626cc4e11beed923b7230d46cb2a40c3543cd2805ab8b63da3ff0f50db3ed38311d94b5ebec5ce07a472db2fde11b650658af7e700f8e3fbe6b1e13940d5ddaaff3e37c3836ccf78c7a357d5a9c1d5a2feee8f9a0c0d133fae92770f46a3f83fc36a2664d9b864a98a812df567bebda1d2ae139fff423b248af4ca1aaa56a85dea5202936639d7047cf67ca2377e6b243b8f467d622ad451a24e40db167e4d53c26de9316edd7fa6e3e1cd54b95d3aba9c251dda85caad667c33de8fae2ca1f51b3d1763378dc620d0ee6c51d519e8a83956a13c6a7c5f67c7e769eaaf553c633346c68f0a8cc000740800b2fc4c0000098550b31b02013801a0218800c04105f566085360a3033034883010e8080ad52d26cc9a5cefb4c2b2a309850b39feeb26da8190ae8f5d351b416533f1da58582d32c02a0825ae41e24b87eaa5a46b59f9287891f51475d8f116ef023ca0daa52554b75d3620bf909f290aacc8902a7d6f664070942a9d7224b6ea975770de71325a1ef1a325abcb8638df12cc1628c245894c12b9d52ac249b2cea3e3188c8d8f9b6826756be6b3ee4773cbd1a8fbc74d9cb1cb866e3429708509ffe80eaa4b0034de8404b432f3d2c09bdf4126db23a4043171da89768355687742c17a14ae48656aa472a4ff5a940b416c7d22ca8c54ec1379d4dd66bb25c74a040ccd0e501b30394fa8f1ae9fced40c3ee157625a1f943d28a838e5f4619ad9faa67aebaaa8c678a90846a1066d5228e48e29947196c58e2e198520febb490c411ed0395e1775a82b89d124b39aa3ba75a89a8458767a4773c2d4b10fd51d772aaa51cfdf453edc42425c6332c3219ad11b420f4d3dbc2d2cb323bc948e9e5fae9d2a403233f9e725e3fdda4839f4e41961a25f23ed01f639c7262f0f46a7a4b10b77d8cc1a3fab005c84df5a005570c8b31a4a57a10d25a5a7071cc74256efb3863f6d3c790f6d367cc78c6fbe93380c216cfb0fc8cc1f393460b421406af09333728ee68adf4aeca57b2061cf8b9821e68990b2477acafae5d6d532e6cd9a2760bd01d2bce4f9f3507d6626c48d56951c6b548c56101e3569e5a577d7271817e505b3ca1352e84d859164690272164caa140a58b004ce480052808028b191648c0a06b5bc3ab20a2c512b4f841ca0043461c01b9820b9f9d3e82089deaa6b4a8810b95822ab105d184f4cd7e71e7edb8c794cfa65dfa9547e8b8c50c6cbf839d59e898e5cc334a8e087794912faa54a79edc51a6fafc34cb6b980ad4f345c94f3b6b6dc63afe4cce9fc9db5f9099df6a5cbdc93f93f5dc0496fc03bb0f2c914a5e57f2ba9257bd2b311d3de6a13ae8aab4de8daf296d79844b9dfd935ff76723bf6de055e71f48720f2ccdcf86d9f9b4547ab27a092435ad3e9bc052aa30b9e34d69d14bc94eb59832aabe67a883dab66db2d65ab7e97293b29581ebb5ac9538b2d52b97bc39e2bcc5e5de07fad35b4c955cca3ec89ff4bb41793669738b6bdf07bae2991c30cc52808499ec13cf3d39483ca77031e7a4205de205115a35b28f20016bd500410653497dab5ea9e42455d244e7632fdd47b3640dbda2b4bbe7ecd960113bbceb36a794524a9b148e3d7e47fb66c71ebf853e68e8833ee7f38719f6f051c475c9e13269afc0e79e1b267ed2a03b72cd87cc0f40b4387a634a8f5a38de9b4ab9af565c9391f9c10977e49a8f9acc913d9adc916bdfb51614dfa194a522f0900e9eb93b1c736ae79711557bc9f335a06bee6cc2484711b9af09231d46254bd7d1e387967c49988c491d29933bd247ce244d0ac92159bbafc9d23161a45fd9d599e178631c8e17f6d2532a498b500166dd1dd641019650300975dc1c30ebbef815c54bb727b874087787c9fa5ce6903e3d1c3aae29533a3b68e853b58268b2a0262fa0264f276f2288bdfc9edf023611c49e0154c61036b0972838fa7712c4d12bafef9186916ec31c7a255dc2bb63848f361d5c468244ecd988cb74c933d43d965c949cbdbb7379ee912177b4b1b3832376c7bbf3f2bedca58ffaa5fbcad941023878c6869ff66050070f1d5c1d93b55ad920eed8cffe77a7c519a6f0a0dd1e38b7e9975a5c9fe1c8475da95b2ddad1ace633c423c43359c6da49337b984ff212d803c947fd4d7ee849ee98fa1bdc8d6e5b7de93c602f2557e1e3f5f2eedc5c2125e85821f45ba577a7c531e5488b9dc4cb94165d2c955d7fc97d0f93ebb90655f280fc21e90a0f6a3ce40d5b9c9bf3e23c739f14cbd81f7ae3297597ba8725472547ab6f52dc51ee1ce1e97ee4ac455af5959cdbb9fc3c26479e171e914924ace40d92564e7077e4915ef1d42970683f05ceecabb790d669b1d68e863249af2aa5e1c83c3b3493256113a63a8ff5a9d6de9b4ab9cbc8346c16c66c5a7b6f2a4561341c574c663fc373cf1729f8a15e55a3af452e8dba149a34da28776cd89091b1f6f200f2c031db0bcea5ee2f376aa61e74958936299d07927fa0109f9b3e67d3e75df77d2e41fb719c75fe1cc0359fd3f44772a15a995ccadeadaef22123599347f2498b5dab45ebe2240c8c7921f78a0624d9b0863bfa558b38a9e78b117c58ac7e54fdac757185173b4e20811392f093990543ada65db608e45d8244295d81270a464853c6ec7c7b5b4b29e9a91393524a299db4c5975a0ecd1912021078523220791ea59452cafcdde0babbbbbb093c4d90354147caef069d220a17b46a6813573afdc1b5740797a6699a3a09ec46cb71359c0d946ee0c8e391dcd15698acb5d6d06f9095bba8b3ce1e5bcc309873af53fa059a09d3ce8536e5aa2e0f4239e88acacb8921b8d2473792c14f243f831885a085b735b438fd76d3b084cb054e046d51e4484dc7bea7c0c437ca7777b709aec72dcfb29f7316b1e0e71226fc5c3121051a182184114a5c422ce091c20e381b3f7a444b54f1ed96e8e8dbb7bb821037df8c8401c2b75ba2d6500dbe9dde96131e6d91c650ceb7f794410847d820044bb8a63041af0008255a239ba8f02d3d223708028302044cf8f040043c413062895a8f12889878d57a96e0d39a1bb76db4573d560061886ddb3697b6650a57b69e93b840669a59415b02cf4de9c9026654fbf1ba11ade44ac721071cbd6a3e02e28715cf506f8761568f01f86e2ee8338f0d704c3b8ec9e280642e8608a2a33fd0b00711e46877d0f1cbd8b3e79952e9885b9f5d023e389a3efdd3497ae5d33fbd9af268c2e8dc2de46107a6b1acb3bf48960de5938611250e4b16377d7ce1a7978eb8f37da0bf03c70cb5d4b9d5db47d96ac9aacf9e3da7ab57b25611d98eabd52b996c47eec031cc923bf441be8c63e6109d58af827047d99237d3a5abe58e94316df6f421c7cd81739a9647602769293b629ec952908e9d63244b1b44b8eca3ccebd0f117e432929c2121222e23c9d1f99c98eb321213187d3fb7c8484ca0a48b1feee2486ac8c8e665f45abf2ddc3e1b2f256388bbf967f3c3f6ea4738fae8a79ea40c48a5b8239c043df78061f4a305838ab7932565473f3f4a19f71c25e149320209eb554f700aa928f9d3e23875bebd6f382746081052d2ac9bae06c613168a8c7bc2983a2db64f222db60a94b0ce427abe26acc50de7471ff3a9cb9d2243b2e9d3a86bfd64b6a6ab45971976505fc93d4e8c1070e29749e7e4c95eaf36d29ca46d9b609dd469e6046b0539ac1949590fb594750b519ea6c924df4a38a607d7c7a649591b7517d47be8fb86a5f6c1b873e38d379e737a2dfed88cf8cb3177987b6e3e993233b3fc2943edc82b65f3e474ac577348c34c9791a1c5eaf4ab4b75aeb15ed885a5d085862debd51c533c521881ed550f901f9e3bbedc14d9164f8b804d6d704719a3348aeb330a5fc4a4b8a38cb9b66ddb9ad2cdebe629295395368ffc51690909489260f28c24c991244ca47c1746a779a9d7e20faf573248ce7a05d42b285cf6818e53c814329b38cd923c3e393f69f8d14a5a0bfdece94af2234dd15a6bb77a1bc8f4bb819bc214a62085a74ee59436e8198911b4fb8cc4089f24fc3c2381b552cf488c18faae29c83f28c7853efabb21fe0099011c0d29951dc1868d970cf69af2d52d251774471b3feb8bd2e642a7c5d1c64f972d35d06063daa8e28ef2e5c95ef2255f1cd01de58b49b3e4cdd094384f7eb6361d264a3cd99c9bcfec65a0d17eb4c1b54a24e85a4eaf378f725eddb82a4bdde77db24a2947efc6e9b3a16f39c63453f743f9b6cd6badb5d6bb52a54c30051c532adf8d5e59912bd5747b25533c94182b5ecac792c2c2c21203858505755958584e2ca68f85c5eb4a24cbb16c9505930cdb4b3cedd202259edfd16129084e9c3871e2c48913274e9c3871e2c48913274e9c3871e2c48975629d5827d6c90c37267436927a9ec7794204419a33e5ce392b4d6f3877d67abd3967cf79e724d9e0ce496bdd6aad5b8a9b79ddea56b75abb296783a38176db39e99c73ce3967b595d239e79c738226ae5dea3c1c3f73ce49eded9fd2b3a99006d9b1f7ddf85a4ed3f8a3eb3cefce39676d3ae70c47cf643a9dee977a2e7247cf2315e9393b069dce36b9dcad643a7ec1c1b91c8e2f4fd965eca977ccccecdc7372af46ef53b8b0be2835f9987c4c3f6ca33acf102222927ab660b5465ef4f3821a21f13c7d350c754a7dfcbc781a6366f2094325e3181a63966af58a7a4b10774a167838867a0b903b23880b3e3c233dc8b73043e8a90b3ed3c7f0f5d4c716604f3d7cf18cf7d4c31c1678e80662a192a55a4fe35f88d92ac0d30c22eec81d3942823b72300ed6e2458b55488cd3e188c85adce18eb4787992b4f8d3e20d7dc8bf31e380b8a0165dea46ad947d626b6b95ccb1bc52a29cb6d3367d43414141f182de5a69a5fc99ac1bd270bc2173551ae14ae7983755afa63d5271f64e71e688b82ade8f0aa2218f12cfab780a0aa8533e7744cd36293d9a07e4cd7af5e3c385aa459baa629e479b1ead5741bdea57c5542dd510950e119477249477240fa785a8a4ad95463dea14d100000020089314000028140a080462b1603098c8ca621f14000b81a24a7c549d0ab320c8711452c618448821000000222083d1840178ad17f679d544cf4eb7ec0d88bdd0103f4399c3f3e15e0666235c874b0d11da86a7ea0d393d0657096b69ab36f96e088b4160dc9268a73addb7e11d24cb50bebf8acbead84ebee13c8888b0be34ec60c66b8aa3e34ff05a6f50519f45ab05add721d7ad092dea2458d31f735adf24194da022ed0eb96e4cad5a702546c261fb47ce8e9633903e36dc1fe5b357381075fad13551fa169431f6161ac9a3d7ebaa2334e1284313cb26912bc0f129f1d509c444164d27579e41d5010404a8257d352ffd588209495fcec0782b6e83c4968b00f0c8a7ba40fafcb566e65f9d205d88a0d4eaa725317715e37f8bb2625c36dbe2a9e04deb22d131b83ad88a48ab3edb553f5e37e1494b21d9c92956b7d3ccd1059933a1d6667d765d086745aa5637dfc1223d1b0c77172021b43a7832da887c1a6f18580434fb6a20efe18559dbae6bb614c254ae107cc7c4e8eff59adfd270895c48b0efdcfdd9a87500f52456f697fabdf970f625b0a4a361cd3dbc4380f597df3974c0465a018f00c9d55c62512cc3abdbe1438ad59d71e0d55a103298a0622fa8d5d7548bcdaade66e63be5edb3bc59599d520cfc882ff8709bfb30848c34d600ecdb082eefbba42c22c3956c71c20db3acc13af979ae84a48a40ebee31a3aabb67bd48efac2f7fcb6c9333ee0da954806e68cbe50c6dea74dcf2778b89b960f8d80be66c6efd7bd310757d2a2974a640a498779162e51210a66152d38b6e951f62342604ce216fd92fbb653afedebe3f7746efff870282460b7cc960a28b49443a4124d6adbfe1d2d4a4b60e4f9214819117a152b7454d227d1cff198b046b6ffd7615bcdfe136d9088c6ef99b60327f10b87e9ad6f4cd1758faeb81d9d7a7e986e8de38a726a788f1a4c5d28f40f74fd376ec58b624b005e0687d20a18dd8c34441d697aa933a4da168c9bf2a2b31dee2780d43b551b5415ee38bc79f921669e46bae860edb04d9f7b0bd32cab72f524cfcb50279cb638aec5354c2011e2ccfb8af30e8b03df7dde177c53acd8d2881d07e4cfc79c446990b99b11a82d8b7a45002b8be984b01389f8af73c6b1be88af7ee70c909381147cdb5700b13ba8fc4db1a053a0121727bebdcc68a82c28d0e7f07905a8f83155c323f8d3e777cbb5495f528e146c4a46e302de798deb6a8d8d36474e787cb80d342d5245657e01c3b414f61a7908e2561f0ce012e999621d39eab63641f24dfefbb539ab1190c34f22998e65326c98f9e23c259b48b61cd634fed6a1796cfb181167267f87e6d0b2396a83bc8774dc3dba04e74aef1f09870b737f1a266c97d0246df14580110281e1941349abcede2b078d66e50a30d657e7380b04414637d6dc0a8fcc2adaaa1f00753b8a03a88db794b0b581fd2de190b69b2781ab29ed0a9f36356be47f2c2f8f15ba595509a9b06813cbbaa5c39029f637de6ef31abf0bf5d64328c4b337e06059dbc8282dbbbfd534fd564bb9a8746e268c10870b9c3c951db9520fca2b3829ebba265cb977d39c11803edcb0a9e39267539135f5bb8a39be959fbfd8b4c1e6c22e41f3b156b5cc3fb9c8aa337206278332cbbe779e88aa432a2cd947844339b598832bff797904395eda6590922a39dd78c07e879888d97aff2b661145752b9fd795c097ac24ec01c55242b81c1389f31d05d44c9310e1ebc90cf69c7a9c396a0ecd42c787fc0203216aaa7d86e5db188c777b8689a17d3d62b8f990c9565e94b7855f7059a6c514af9bd5eac8d60d6a5eafefd252e9052ec9e5a7db7a01be3051e5881db5e4fae3b6608f59997325bd48f4566846d022b085e75f2e4a65ec5421a02b9d9de54604288e3138b99d349280ebc1441d9c9d6b09ae257f5cc9294d30a834d4987656b6df4e99884df682b2fd219e198077011df25d0ba5d2d182e549de9103059763f6a665b096a1d4d379bc35c01ba0b0c7716ab6693fb75f6dd2352aa9a8bc9c6f69fcd3ddd0af5edc4e6ed62e988b3cd99ebc638261b49af1b661c82efad058f78bd69283a073cbac4d3abff0e265419121cbe08e0ca84fa00795b6fe86418a3cd72760faeddeb1d4dbb2c899e1b7da526d82f8a2090bc436f7a662b3423f002189e889da836002f0b810f2d23880d4efdc12965cf698785d351d5abc8fec8d383eee14c5c86499b0f32f7c7bfdb35fe955973a51d9ee10179fa29fa91d2c1113cce95d08a5590e748a96b90066d82a4c5213bdc9bd1a2f55417008ed1acd282adae584683f06102bd1a72870a0ef800e2d684de205040fc9227087437eb740773d1c311b7d0ac0e4039e64ad14152709040cb07ecb27a07c4bc97cc8a119b8e6d6d8916a04dba6eace45f06d427147acf678f5357a02cd54ae69500fcd51c5ced3a3594f0d2ec92a2b227f650bd303adcad15be5f4dc733c44ccf00d572b74806c7efaabd1e2f1dca2950c1a6b40e9b2e85c115f681fbe98b931049ed95767e20f28aa267332c5097576f8525f7e16088c11b74008f92c3397b48cb87a98041d3c13eb15775670c3b42aee5ce6c119c38eea753ee07db0beed80b8e6e3bbbb1e090550c244645367aad8802068f6e456a21e0f78334115a5ec8e1de51aabb62c9c012a3117c86b6cf95689a8388b47a939785147b79b05ea66531b3ff7655a36c079ee2cfcb12785770b68265417720f15ac20cf10ba76e0db996b866679de8da3ecac89c60f3120afef5d4b196a1810981a08d52dc2608d31845130706fc6ceed21d0cf391d1c94313bd2b6b5ab57527ada8eda3db7168e303210a1aaa8364c20242e2d17d4fc678b9cf902ec40f1ad131e93cafc401a56e88b4bf81ca7555ccbe615e6d554ebac127b7aa8eea31105d4922d189c9f4129295354a512d6a1e771f83b8f2e8328ca1dda46da2b785ca617f2aa0fe51d09be3ddba90c5a7d1ca67e7d8482837efd4bee1cb820512df2c8c470496e4c51c555995b67702a037bba154467b7936f92e2722a2066b79b8f474bfe1231408291eb4a5fd9f5d0a2e4ec54f0d5aa94f9527f76e4a0aa281f456364987a0865e81cedbab62bdbf225090c0c7788ea69f45c39067df717608feb4edde0166bfa9cd974d86f8cd9496955fac29f739d381958f5f32ed9aa3771ac7760c7b27d5b90c662e236558c66fd92ffbe6340c14ecdea93058589f7c43027af6b3def9c66556de6fe07126cbe44fae4d016bfd43eea10fff1a4ba91f6bd63628a1a07f0a185cba399f8948bd1bf90830fd4fbcb734e7801c759b018fa10850c9d7a944a6e4c080c35f8e4e52e09a6ddc013fbc0d69cfc990e4536d4fa2595ffb70d24f8f9a8986ae84f9ca2cdaf77e7d89e5486cd5fb4c8a90ac68310374fa57ce81180391577777a6274acce3cc199982bb1a14e11d776dbdefdd1d1f3822dade2849c5ef12d59100375738fbc623666a76917032d4b2c8bf28a58e85fd82354853b8dc02077c9a82b2bef5c5660b8117560777967de23951f2745b9be9a1f52576d6a6e0fac205026a13970a869fad198dca37372670e7cf1288ff671cc151a224ccbddc768d60ecbf39bca43a3e767950e842626a48ee200073787c449b9ec0fcaa7de6f288e91589b7ae51ae73a43b7b7a33068ac38f810ea3df692da29a7d5f7605530d3fe4256692c8bfac412d19a7ceac8d6a320eb308fd23f177cf4e95929423f1508f73914d2ce6ed9c56e4d06e729b8d4f1b5aa81a8e35bd4540d5ea6a45d6407dc968e3bbfc7853b8dabe2426b82f896fbd429e54c55ec40613f2c15d4545d2e06fbb11012648a596e96b457d250cebeb54e000bbeb338e64e74c30c889aa054fb49bac2401eabf1c95b0838e0f00d13d5d1325a92ee4b445ad538af376f2d0447799b9d81aaca29bbfddadec208f00b4a0f386b1d077b626905a159dd540fddb5b8472fafd4d3e90c94b980772810d1bea5df0d24141f9d8477c59519a21a35156bc77a2c4b3a6cf2ff2e510e3268d8feb93c4116bca40aa8c287e05a8da01a1d710dd8e4699ab686cb1b38518af7f8bcd8c263d6827066563620804114e0679e5a5f339fed84168440382583493613ed03dd132a0ef41aed641d03f512d00132d7773e85a1e592bf69fae9fe508c54454e885f8ed047649317850e13888dcc2cd4424a7660d2fca581a3f8606f1341433c9966595235abff52ddc2c3c7344757c25c1b39f4acec57d7c4ea00b40ffe9fec52f6e635752b1eb8237f2f4625ef443f65f6c73b33a3d3937f9021a4122fe272b39ec7eda4d1698014242595d48a72fe805d3206231d80db0e0b4ffded36f3e69b6c50b04df1b383ddcc69cb1b40ead616dfb873c1ca28768fc899648da9c42ab20d508e4b66dee11d3f8a3f52f3a904ca61ce0124efd7883b386872b3bfbe8fe6721ae7afe6ea64139deb54520825f1a1dcd6f576c21be27f427145e84c658449c31161064f5c88f4f00d2e2181b09f66e8dc2c92a5299201cc9ac2a9b191bbd1202d5d1d4172c66c6111f6c186b04dd64f9a4355dc564575b4c61e026841e8adad16b4c9c6ccb40a57b09a1653420b24a93ccd3d0c8ac38eb0034aea1432a8472ae2a55e304c94cbe0e984e3c037451c406e82f7782fafb0c8b6a95b7d94af6fb8c5124a39738988899132d0154cd2aa4b3892f648378117ef8a5370a98747a0911b4d5abf6d0a38336892978464062422f817f30a8deb9454a08985bd8f29e6a72e67a5d4c21f6d03c7f5fa281db0789d45d8adce08dd2171dde6d1a12767e041b6d455c9d3cd0f1516d2b2fd2c9df8aa850d8271fdc77bcb014cfd95b169facf326634d1c746f40ff3b45a3746ba481caaa6c84c9bf3059bfefd68e6d5c2ba2bea1dbda6ccd086c81025a2881d7307f26444b642af102fc8986077bc1a70474d0bdb507b3a2623b5e8901d05d83de460b70e04ccc06206c9185094f9de55080f664a48d64e54ef2a76ce71c14df9fb430226599d8fbcb5aeb53189070d22fd6094e2611b898f632fa8881b387316856c652a6ba350799388587b57e00b9e0f04808ca9640ccb9e7b428f03394f0c3f31b0ba6f09143bc8056e9f0a7f5cc7177a31155b673ec395c016d8c19662b060801a88afd262fef43f8d7c284b3270539a5eb216ba5315a58c54874be4ad37b642d5c1c2e7bdbd1be7ad0897c46b74770a4347c6b994a111b9db116cc4a47644a8e7ae2679eafa53186f1d94624c96d5205862216546d8f841cb76a47cb52b98e2c41a5cb3b1a146de83868c0f094b56bf93da1b7a2c20af9cb5f046c90f556c5bedc34b028331db298053da54c81646e9d427d8e9d23d88436cc49b50b97f33abb0e1e3ddc3a3a97d3aa74816c14494b3ef0a9cad41d59374c83dff6e3de8c60b8bf5c2a44a8b913feb891da34aa01a2c4d3f65d141e4781a22164140238530640ba2156225e93d7f288a3fc8fbcee2943fa61f966ccf6f3bb8ef4aabe97daad714511999638a599470b839013af4d92eca17f51b9ad537ddaa0c784a07842c7b19afc25048476eb5e164ee24d876023303b2e1c298037c042b2b3ada889217756b65460e37b1f8ca26fe90e13463a111cd86fff599ef06bc02bc56e6d4290b7818e29e43144f6dc8384de04be802969c1ec5dd05fbe670de464e468edad1d2cccb0ebc2fd1e1ded936dd7d31658842b680e57ee44029ac1b20663d752909ff026f61566be126eabad968a39a338904389c492c28a3e3a78581592b608a49db0c86bc1b712337511f27f6c1243aa7737e692d9fe991254bb9c713003fa1da42bffba000bb3af547fb21847a918944bac227848b41d190f3d056f0bafd41ae66257606817f24e5e0808c83b7ef224283ea77df811c4d9352819dddd7b6d34378f2236cf69cba63f11bf32fcf05ece7fed85fa11dc97a9d3e4c1feabed160926ab4a56189ed732b481b4aad3e6c0d49ed5f822e839535dadb2438832d62d71ab8f731a2154522909e92c63992f438d354750d8509e2a8c4526b991b76a2fa14eb025695f7a924bddaa17ad92fb4b53abf5a21544db3537caac9983beac915de665108310ef09dbe8027e11a6658d35dc5764ea2d073fc12eb9c3412b18cf660f60016c2da2a50228165acc250e8e48f1c82cc206be7d5a3793550847cf1bb7995fc5ec0c7eaef3249606a8e3dde8054f40d7f5b4a73aeb94451338c0691410e4e75fa3b0c15dcead90e4397500571b0dd8132128038a800795dd4194206ce4221b9a8ec7cc0615b0e69436ce5ec456b438bda959aa3cf49f82e9aa6a90fc1e1cea70ea32cf639184eaee871be1dec984caec6a50865d11da947521d42f6d2097e8aa71e217d5950f0f5535a335083b0d7f8141c32c17dbd08a1dada192083adba4f086c7fe7217f23a5a2faa8159af0a867eacdd44b99751a1b7f09f858e55ba8492b4aa8653b1c3c94ee3704e382634c6cab00e06c2850fb0c92eee28bf47ddba79a30b9cdb1b94fd64f0391453de27fa04c901566c743086911a9b0637b1f09d12b428b4801471be7bdac348bcc2f0a45570339a842516851d76f24b3e75a458c2472c873ca820911cd314e64fe8b2752b5e114a1b4339b2697479e3f4c1a719b3feb758dc1bb9d49e475f0f8a495e229994fafa27fe407f4bf421c3b731830c0b809583b594cdfa058ad599f5846ca239832c7765c582697aacd406d8659a20f6b89298784662e1848aea7d46617da4c0902e348e429e4d4b3302fca6011e637f1cb2b7e4756e2f5cea240f8e9887720ec295f39a0f81334f566717f2d7911f76c22e48964e3c643aa7dc046a9b133785d9046d1469e4dd9ba1f25249512c4afafc4ac8cce1d163b38271534575a66a3147150e73b714816d8c6f4e177e7d5e3247d0cccdf11ce842d0240531ce2db7dc7336d7ebb7bb0a34ad7e435e260d101dccc180375640c4dc69ca5bc19b681f7f3aa55ccb20a09cd101c0f1353ecb4a407cb7e68ba41e2ef15a3f63ec460d3d0324dd37b1dd885aeb9a55becca4794f2649672b16b6f813b7ed7c8cd1c92ab9b60304d18de12a5a48f5b97808294f0861aa7544df7514c4ab1cfa9ae982e24234d7ddac234f450ab862ae460e91638a654f214effaafb51c8241303599a693b25ea363d68c2800a74c86ed0c312257eb5c506d0fc0c4038da3b34c9aff29df5d24f8efd25e9a2918b6dbeeac70e8593491c73247e55f4f428c1b34911276ee8f891c511771367c12fd1f7e1b4941feb2acf584319b2cd0cf2263fe4e641166f19660d54784a31984aed605d4a3a9338d67b8df6853cccdcdbf74a38b2a2430b4b42a10a41553aaeef6d380dfdebbec683c7a95dc61f8201435623b724be9f4d8d5593e9503073827f51b248e80c0a470e2ad00dea9e41645a0828d462628d7d3032997d8c7ba050202fc8646411eb9e8d5d30ec14bd8c39741d9d2665475aef4bf5e80e69f85186338aeeb1b2fd4d99ad5ed96ad4ec3c74d21021d70c2b4caed70c4029040e413a1e6362c2f78342ea036a62a7907acb96759fdee18533cb82e640045b202b3d82ecafab1fc5a833f8f9d18ead445a5bb6f03f72ee7b5d5fd6668ea93ea8f40fd9890713e7c88165d265c0f8898680203d019ad9e77449ecd8bf9a39b855acb25f8253230294844beb9aedd7c80d9988bf33d9a8f0ef036164b4a07446c92b2733b5e2b8e5b00ab2c2f715b0b2131c97fd5576071c80e91d8690d3ca689a9980ac9a296853dc03f7f11098d8cbc6f2dc00711b53b3a0ded9d65394103c80f072ffb7c56bccd997c2e72acbfec749e1d7c05b448c2783a948c0987533c639674274ec354f0703f6a5e77f47a40f2c30b3bde7f705a235aa5d48def2e57601f33dc02f743f9b00e343f22aa1f930b0fc27809fe651460c76fabc6f8efa1ad822d8e3d219b693c07412c0430b7e73407505571431eaaea6a08a11431dd5751dc17205a2fdb4aa2033b8c737c57d19a0a772b4fd58ab2034bcbbc750442bff7ed7ada85cfcbbd5766bc35698a73afa14101205c67396a11849abfebf899fe4606f95408d4e4a8c75a59f1e7241d301e6ec2ba2e91500ff74ca96cc17a9d29f6af421372ae9c58c329c966e0ae05d4834f0462825ed1502a85ee5f803f1a887a5f644f942a4c2987bf9217b41b6e0eee3901266a48e760e55e0a1cc3f5fd6fbe839a4d0e4b3316429b737ff1754d97ca0d13bdbbc74a0e4c3d725e340c25b0db3acd67c1e9ded8912b32f86175c110c15062aac96ff7fbea60f36914f73dc651cf698f5a0f5e695f3db746e767d090121766460628cfa88f64ca82131a50c8f3afbbcf58235de418a4c75431b88e8e599c2f687a210ed81af1e684cd57f1128d62b0650bec680816f2a2b60f1d842e4fedd0706e3ff0b4f7b8633e37751fb170240a9decec116a379bef8ff8335343095362252e4bf76e6a0f1d349db48b6461556f3121fa7ca83a08b812b91a1c5de9a004c7e68830043540f3fb31ee197ee9707f1d466e929f6d9d6950a34764fe3baa151e5ee1a27fe3fa97cbd9b21e777632bb59f6c085a85a0333a3afc7fa3e387abe06e9c4956c8eef2ed67f81d5151be954c4250e4483aa27ed01bb8b83c6463ddebce3f2a0351c8bbb486c1d6621209d1309ee7399c7740331263e90aef9d9720a6f8a70320288f1101a7f2699b60e1185b662b51584df4924aedca49fd05e6ff1880a12378c948c4c153b08a319bc52bee806eecc032bf7fb4e1fe27c7676ebd0049a2841429fdb316deff8420f45f7b2c828885a0beecc5acd84945c7a25dd3ffa3954cb776db871ec6c62ca2f4ff9b9d10400ccb7e49ffdf8c4009b917f6dc13203aea5a9ed1b017827fa3289a9eb85e0a669647d1ffa7bf3f53f23e33c2f5d86f7c922b8f2b10b93889ada35f6992a1c2ab6abff8a9e3761d95e883b5608c9dd36e549275d6a9111f5459f5661579fbb1a462e7f3a8980cf9e875b2b75ae15d813477416d5caa320170c831ec5781ce206a08727365b73e10bbe719807a4b5df490e08cd802eaaefae1e0145544e85874905a96228c3661bcfc2049ee7768ad148413adb17a391c7df2b40f78697a5142131c8a7ca26befa1b743591f0a229777c994b56793fdb96a6170bce7b41ad3e43a4343760fe2027557a37c34aac18e0fbb7866859d108734eafae14001c0c3e03a98a82b993c4fec89c4138cd05a2ba65edb91c82f5332694b1fc2147bc4b5dfa83910aaa4a7b2d33aab3539ea79416b3a5f9f2bfe8447eaa1d2aa22d558867414b548cac2bc4428c7b0526563b386af5fc4c9b11ab22a1d499635d1bb6c281301ae7f4c48dd2be0d1926dcd17333e26def279dd87dc04036dfd0a3bd7e51da8276b1f13b5b5adc430570942a6c1c7944d89702a171b5362a44f90e9df989261362222952242ee7aab198369091ff5e7c51b2b354e03046f781ba52fd36d28bd68f0ac374c611c14bf3e1779dd77e33d75a7351438d8cf4e88ed2b1be13456ca6067784188e5ba6c0289e9398ca5c3fd44c70b81957153fd7f376999de130ef8e1c9b822dfb0019053c020b668464dcdafc1454ed9fe40487be267fa9510c36aed9ac8199866830b8480f62c3ccb352ba833f53ced6160c7a207568b707b90c0e2e6ff32a06a4b951e17291d6c1242dbb45b542a79592d21419122982ec4be58777f102774b9a8cb11db278644d0f7f594eff56a222ec79fe2a60de0d9e23f1549cae081942381e1d5215322aac40fed50a49f52ba4602e183cc4bdd2682f46adf02074706da25e5db811e3916443a39329069463b4107e35d56a3e8527cca025bfc12b0407f84057e54feb7f5e39f389deb59d7c1b0c9ee718202aeda7d083c69a8a75f151c834f17a1b27329a73eebdc52041b07c45d4b8f9fe91dd02312bbfb394ebb7fda3a7ec2d1017f1f1dd6060a41d41ded807edf340d56aef0484a1acf8a098d922c11dedde86de189c722253e440bed338a34718f271e2a4c14aeb27f567e73303dee3705fef3d3df02f1ce11facbb4951c6c905362a5bd2584ed8285cfa62e9f825c19e16f1fba17ada9ef4e9e0f4f20b6ebd2ad924bf80b9d28877df73502d1f32c03550c9c96e2157b02051d4d5350e96afac2b804b5f3f16c1ea4b53ca97d1f6052f3a8bb9f59bb4fe07b5e92ec35008cd7004c55009318d59ea45e02de7e3bc552875e677a00037c7cb4d6092a75b005b00137f0e85a9cb32a57d1404419dd138624b41f8b0e7022ea936090390fa672b6508babaa70ee6736c80fcbb28a8f3dba24af0bb6bc09a644bc4f0f9d90c91957b49a11f2afe22780d32747b81ebd0821f778d8d856d81cd8c8c88ed36489adf308c23419e270d0582f2d14996a4a76ab012c6f7a54b80c2aa4842ef7cebda9752e053221cd70d46af7f50e77b36dd98e9c9bd33486677bb407a1fe63da59e1f80d11a3e8930716cc40185bdf6d05e8ef7227ec65f488593774815a5d4c62b7754fe69c973196945e0f3e4d1869261d0fd8fbe5c65bc679b84c365df880531b7b65b44e638a77f8fd5de99c80302809df1dcaf011ffa431ecbedac43e6b85068252c57722e2cb50567be5c340a7586cde1dd37e3bdee1958aff20e4dd93a8fb41989d452e4e385dce2533a6a10dcdb2d01ed97b152ce673c405a642ac0d5b4f7fed29ce6783c86ae378ba450d48687f44abd23f96fb6cc3caa3a02629e8d9b4c1909424dba3b160a5e717c57440e24cc884fcc5a512c3874a66e897ac66458ef2d575a2269ade14e01e50c2d5b7b6b458eb783de29ecd1ff163f1bd626e6c3df18d18111ad88166a2b1b5bcb1b27053903e7608874fc031f0762f5cb4590fe796de762068bca72cb83d191328d16b468484221b83c2c79cb47dafa91c2ae1b280109150bbbc9fd7641dc5b568d8e4371f08b10eec8557de69304f4bd12336f48908b3fa83cc04d31d0a10878c9f5e04bccdf156bf8bfb653fa2dfcfc17d1fb38a4d69ae075319617843f25fb9d36303aa6c4a1136a490284c214aceffa34129951d100c3ae0f3b4fd342a1a48a953baf04279a4cf5f8aa54f3411ab3072163a7c4f9cd4e9e66f7e2b0907439b668f8279e540918b1cee30c86777e3bb5b7892378f26510f2234508b621ddaea246166935ffa5ee55fbe4b10c8635198f96f1acd47dbbc277923b5a39672a2c744e0346a641bc1d24f6d152747a8e65307648494f5c77e14a3404f586fa5b47951ad2974ab8c3a155a44ec3021747197a3942ee13a316c4db48e4f3eea5ed9548a3e425d4ced68a42911719a6e73a2f21eb2a4ed61968652c7b0990c9b80be78aaa3a12c110682496cc2b499f8792385f3a6f27749c96974066d04010605cfa44feab5e290cc00a72aa7ecdd5d7bb58125362b6a73a031f26643a1653a46f2ba45c54138330c0f00e1ca67bbb5e1b55b93e9479d0a1b80b5032e13817a153906cfc7349559d3417ec3762d4c27e34784ac930145018dd143164ac2983f1fa842be71bbef5b426dc01b51fbe263614829b6225410987d7d49fbf2815ad4b3e240a1da00ef040453795b9f8d94d9d991f6b44776652a077c21e04e4aa1867ffd38e381f2ea022b4fc8a6e3520bcae92437ae02236b0c3940b138cb3f4ebaa24a97802d3b0e648545e3a6d6f5daac50cedc1df3bdfbc5151faed7fb20c3cab4818a5a2c51c97dfec6e7ddb152984eaf611db17b0bcc57d932811f400f413fe82374403b3a4d1018d22f9e3923f427b26a36c7a0377ff88e07fc37c49b4dd6a0f4d3ef6f5a6b3906a802471e16dc6219b47cb8bf571d846024ab6903f983d0321e4f418b57ef9f6d74e9e1316119d836abe0cc6bba5469d4a6b54476dae52f174d5c1127b814d4e53ba92eb703b0ff7eb6eac80763fb033fd9e68dd4a1fc143b67052057510c95b42a2db16355a9925c70b9730291cd86b6ab7965894bc8a41eedf9ae70182641a1e80ec40b6df3a4124da140ae84c6c7c43c224dfc411b6601e64f8fdca97767ff3b4e39e103d8a3a87f17ee53ae041742bab3d669fededd85ebf470f74518f7e243bba985773b8a1e469a06bfffb294aea36e49e95a0546be139fe0c9aa2b841d10a49bab851e0bfe4ad11d62570c8fd6ab529e64c9382ba0e611e15f17380022210842347b8dd6798c1c8102b6434277bb87f36db85d64a2396312a430dc3b05cd4495d19c88b44e698d162786d09447d6773598a967d91af604a3cb0d5871f7d9727fc235c79a00f719179570ea130150d282a0103f0bc49a841d941f11587039b45e37e54e102242f583870518ed75e86b1e5367bcaac93945829697e2a2298b41c50500ee2769614faf671b762ce25e1b86ea4565623689c204dea05d8e24b8a0179e5b5e98038af4d0875afe8f86b30639c74a155f94b1c2dd89a703304ae078be867103ff287fa3b8cd1646e076c3430b03a99b58424c170749d06cd0b8e3aebec2d5186e9462ca5a3e89484fee959173f04e7e1d39e5a2660d73453ac8184970e3b98eb9d03b07fd4027782b071fc72e4c7856a790eaab8fb023011fd4c6566c03a202c0749a2c1e79cd6ae289e612ac3ecf7ac37a5779b2cbaa3bd64781db02426e73d9d4cd04822f23c2d3ef303ab704806f8c4875af9bc3c8b182722c8d6a68cc891a85f44f3cab7984ff5b6ad2a0b4fd91806f3c8bd9504e275ed8bbd0899bda43a6e56b4fbcfa835a2f1142d19c16df1b169a06743db8833c1c75c41e932e9de6bed8a222b2918b82f3f70022742de2d389642f50f760c7fc15dc5e3c1930e9eae8095720a1f5ef45dccac05353603231aac33cab1ed237a6325bffb4709da8dd9597e532e885f78e1791db2f349f9a95f12721ecd0475a7178e6dc9821a6e396ee622ed6cc5cfe3ac554b881b91f74ca7d273e9f9c4203204344e18c128447fdbc0fd370287c3876c012b641dcf1329ea21f8a8bca25612b12509400c49790f44bbf265103ce19b07bcc10ef45297d97addcc80dc69b437f2a912edf4460f7580631ea808f176cb7f100ebd799f0948694dad723fba881e345328808a27829195e2a03baa15bb182f5f27b4b552573108f6c12f2492728b5a6c8f278528fa816ca89dcce1001199bb34d207d340015010a5949a5deb7363c6994a467572cb17fd60524f13e928134bdb1e6067ac8658760926a3aebe0e942398040a2f9b0382c750da74fc69cf3656f034721b8ddc724aaeffafc267b20fd8ff6455e64e1992db85e0ccab6771a2bd568ef9707fdaf4c774a74da1f2e646cce8edb218ea6b615caac48e3955fa20f77507810a68b25079d16879ff220d65a95d82049fe60852253cebf2eb7d30ac0eb8c9876a589b4bbcb8bfc5557f7e8a02a21495ff2496c4afe30d4632900d2aa6c4307601ba618dd1901c4b8a4631b52fbba9c3559be3e285ade73e48fc4d9f32cd9191874d4632a521a935d0960e44252d176925ea04a77b63c8e7629e93f39a7997c970f0f3127a5fa94290bb390a611896b293d47cd5f475d8518e69ea3bc0e39c7a5b32b7e81c7652582a4a2d381b94b1017a075df836e0863c9b6a2e2f9a8e01ac351286a42b643a7438f23cf999106035f97d242db693600cb885a58db1c3f36335d479bc6f67c768ecb3d7b918196377037acccfce8a0667754bc614b3896f32e2a07cfc4c6fe526016bf4ff1db0579713fd782097422243f3f22f5115b802b09e0d0fd41195d8a4948a384e89e5c6246e82d4ad9202622053979a07001389f031c8d3bdd2286b8b417bd876154b8a7c9002cf9223567c3513efe4de2bc3f9458ec60b19f15514ab2e0197fd8848db096ed3ab1fcd75958ebad67bd4808a78030f5ae1a1e3275df6884b8cf41221a1b649920ea10f4413ee6ac5606c8f067ef1b33d447e116c7be02272fe4800a8a363c2119d4f24c66a4a34614d2562811d018da15f98a4e01af1c90e5a7294c2fc96ae0494f9de5fd19ef4536871e063ecfa3dd5d685eec8e035d026d0f94aa5d4b74d9160ae4750553f72f1170c3459c47473011d51f44e5ab26649ffbf8e26ed84207bab1b4ed38b10eba2b86897a8a5ba23c71c2db71e27b09cc20a370f6064532c8cae7363032ef36d03c3c923f7224bb51ba83b09e429ef9434047ca3ec8dee4e52442a79dc1c01cfaa4d962b8f03a379e9fe3c6bfe57dd006379476141bcad00f559a76b260f49cd0ce3f75da7a10813e0f7779544e5459eb088b44d82d00a2a5998763811a3a5c9419f425d38077df2de48de09e50ed17f0820e6f1b925ad2a6580c700f0995935e263eb25aee3a3b62c94b762ce167931b1dd0ac06c8bbb9a406eee11994c287939b06b3523f2a9305f7a80bf14319c267c64a8596640f8fe47838b51d210193c305afef9c481f6ea4031e5cb0919bbfeaa213f32b03901c4f806afb7ba66f392ece44a94ba460082dc9a88279dfc0cc80861419b7e083cffd3b193a4257444bc4015d59c4ba54f9152c0bccaaae488a361995c98305b577ee1bf988b4ce126b91d5378504b5885c09dc6d385f7c6b5d818e8adab047084d15ebf4d2efc12fce27353ccff8f6f07b8c67f50bfb253628a71c321d7c67586e04a9a49b491d8c756935dd62c24f0352d827ce5ef8fe52c7996cadcbaa70e5f0a9dab0c4bf60f587e7da251100f9d9b10c2e36ed68df806f88aacd630b97a013c8b5ed93a0de880987e80f012eedb1191bdbb869aa919d8eb197b6627b08548fafd83b8bf4b205ade8740a45bc48661a66949bb5f209d0519e7d119e9b5ad3a30ca599af31bef345492b2359c8611266226e49deec3f20ab5effc56cb489f39b419bc52a5975b029634ab1246dc54abf1372d66bd891e70e08097f2be4b4a254afd1776064424c2ce48fba278b4816f880e7f79587d2b92058083898c3f000b69375b92cb7a189581a8ea9261b58eca9d31474fb6e0e290e06d918dd4c862c578e83b6682c482ccdbf24d0fc285795953ab5f5470fce1a10c100932828b019c28cff3e848bfbc2b48c59c9687a85107d4958c102873aaa1131ad62f67d358f32556fb414a7a8ef6a8e615af1bfcd7ce60563be90cbd1df0eea2f04d86c9687992b7d7acdc5198825c246e099b4e4fff21fd25d7cfd4abe5217d8d3cac7b929379840202ef37c5229f2630c30a094980284912a62bf61a3382bb3ec3d665d1efc7cc02a4b1a7d78e199e00ab3d80bbdde9801462f74360ae24e430fe92ef4d2180ee421766458cc78a25b10e8d8a519a8284a7b9e72637bfd13bf082eeb2291bee2d50190b4722684734ba2e8a0cc66f56436ca8ebf4ab7a6e38ca9161c68f02515c738ab4bc6e3215f9beb4fcd85f7b7a1326974656b3992bd046b8b2c648524c7115515a7b4c136d1a24f45847628e7561613bbf04d7916b10aa744836ee790e2234511f7224e6398f50fbc06c603c116a46e1d5c9eb2c0108c0467a76554fbf73bcaa08b3e23111a68a773a00f87d6ec0a3c3bf0186268383c85aefe9edf8ddec8c2d46f269b1f543ed08b1bfc2642d3a0cf7fc5b171b899443a391ce2212296f3f28c9a5c5f3a6eb21e807c90f7cba441c553bb7cea68a5957d7ee14480a74df7ff7eae6e521d2d8ac6adf973a624972c8059080eeb7a855068bbc7a2153125a0b8162762825c0a1ae00fef73301a7c74d7bdbc43f53f0ca6200c4d18d0711af07d3fc679896e80c065e996ca03d9d2eebfdf51393a6d3fff7848fb6b740027757e917bf7e79e8a76b04fe5c561d160f7b9ec3a7e537e5e7743d497b5444c48571e97fac704d309223db6292d26864d4506f0905141d93473fdf03fa9456519c18e4b54ec5a5f48336ee56273f914939a6680bf928fbe716a3aeb5427e960f0c285a97752c6f4eb7d5eb815cb0fa78f65fc7dbcf0fd83f0def54d35782d21013f799330fc414ade8e47a35cd2d8cb210d5a2152978837769014309b7dd188038bce39bc6a5e1481a2528529beaa22a4e065609a6f3a19d1d62e7226b233fcc29193722ce60a499c94430f8bf5404f214ae89f784cec16d83bbe24b2ebeb27d22101c837caff997a257e26039c7486bafb44e09a24328d62af4729b7ba0f45f5b19e8fb4120c7428c41d03ca96c3c36fee60aa57d36406df8131b738e469af18a19a3bb521ea9f6c5719ef484ac81fe0125e3f37103ddd710143eb90fe8bd34957de031a83b1b1c67d4f98d1c320831dd25aa40143c050ac8dd6590e4844f08afad7625bf263967f58e9a5d0313a9ed9ab7f7f41474c5033129d004c8fa7a68271a83af9a06dc5470b27223587e9502f52fcf965f80a0609a41bfe875bf20bf1fc29d000a7c21211447dbb3dd7e7835b5f6a770253c4c7a6944f7473db7fee1621323b236862fc060c825ef6ced085f897ec74a229000339573226aa4ee86d27efc86487d00fd2fe45770af8ffc80c296409c921849bc4eb250203ad62b5eb8182049ca93a47186f7c235073b4a56fc6fad12ba0f121cd505d5216042d0a8c58234d2223f6a5d6a57ab735327f25675f4d57fe6f81c97d19bcf2bd9d37ac366aa02306df345a41b730071ce85d13b4da4c284bf0c5b7197fef9c667ffbb2d4035d47cb079f7d19a3c09301983122341fcb598bbc074b37c7e4b552922df06f62bfc79932c9d748e8540a4ebd06ade346ab024ce88026a8164d0437d5e3a76827f58b693bafa1b0da8f964050140fe98bea5458b4ad86c4be162beff3c53eecc3a1c55b9e5685ae1959e2d37b2139780acb06029fd2e12ea799946961614a072d3b7b967cc64c1be7a7f4dc1ebb537b1cba64b21c603855ff083b02e0c2d2e3c9933834b48afe061cdfa09f5b6239dd12c23c9391a22bf0a5c3559f68923627f2b4b4736531f938d60bcb7f79ff6d56ecb99f408970a50b8cb711584182366c97a04e2f04bffea3940391c38756576eca03d59c75c6e39ee2ea265ddfa5ef9f6c603ed6a8da54e0651de9aab5d6460ca269850e894dc4af9e1f41f84768b3d407f5343d0795c11dc9884261f1e33ead6b4238ce2d7c672cdbf0de94474f11dd6c048ea25a9b72e07fc29c0d10458c97d02aa2cebd149898709047fc3c438bb20f88c8189b9686f26d518bea1a8234ca35049d80a1cd8111042417e12f996f5af8686f8b677ea470a7b0fd6729ad89508b6450fd77524e9bd04d544ceb8c8a44d0e2b0e428ec1c4a7c2a3a1f3d0dc12c6fef8ecc4c955a250d03a88079d05f093bf8800adf6a81391e81639a671ce88c4ea64b04105e3c68d828cee628fa8dac7ef2bd166ab69e6f53dc1d73be60de24223cf1d2840dcd07c0427600406f0e8f448796a53f09898a78db7d9cae473b7d7fd44c4229b295ef20f5a44a71030f0a558575333b53f0ee9309f789f70f51c358c1be659ed87c52a346dcf68fad2bae4e56c752aeb74d304091bd66b7545a179bb0e6e5e2eb28014bc44232ea77ab57e8a649d04a3b84c0c90a289f2b9589db0647320edd60eab0052909e84383e826efd150018ecc04c58041b8914e70468592e523784d98e84901cf950fc8cf2e62ac05b6fd05076d44d94d7733ce31af5913626422c94556f9dfe1d4784babd3c621229e9c0ce24e129a3047d724e897951fce6d185ba2e08a5d95739b69ae2fd38fc8fc49da07b7e3776bbf2fb1be5f569e7537586210ba0ec08205a213549d4cb6f7e6763a971d08e37f212e08b9bc6f8d000f44989dd5bc17a1bfbf37837e4d27b9df379ae494459d48cfc700cfdc6be2361c20e56b4f61d3bc134a2634143bbd085a72ee010d123eed6ed3bc0671bc2756e17be4c27f90e92454827c23421adfc4652042361c00edc4661cb69fdd7fa775e48aa00605b2f07a0b2d5508c9353316467d1b933b0da4d7a953bf2e7e266107f3a8f2087433b235b632f4730579e1e4267484c94d6f11b405317f9f2326c0218715a262a85d71913f7a90da5593cc8fa59e10d64e983b47d70c1b161f760473d72112f4827640415ca8a7e4a2126bc3d4c5b8960308f96a5be5fef34358b6a510530dea6ade82ba94115b18ae685f842abd0e79e3824496bc33ee68e1563ef510172de0d1bec7229bef4c05b46b895dd5e13ae4a7d9d52e244c7058f93b4d53602fba19e4cce311e104d8d39fef559923fb7b66196c57fe88ab241812270f7c867cc0b2c450e11bf5413e55a10b1f1eb244db68013ae3b4486bc238cb2572d4da6b0f6522550d3e9c43519c54a49edbb32bab7acb0abf90c4c4dbde36584be96b2555f16c4fba3c77c06b61ba74d9eda2d25f4c43c777f5fd6883951726c7ce5733078325709c2a98f430008cba3e1bd63eeb9a7f4297c9ea50e97a9220113563a511e347ebf666c2ec172cc2bb33b2abbf6033eefa566e1c992c7b22516e9fa1b710926cd6ba39d06285aac70b31e5360703b2fdcdf54487719f8064fb35a1ee711a6a76f7b17b7a3d1f6ed2c37dc29063770f4d3298277445045faadaa9ac7befa78c67303d3e109a30e139d5063ed3640a449a087b0f4c7b46cfab85d6b7e20ba1f2f9e4327f514a134423710bf5b56d7ec2174159b3a979ad710cbc3690172d4e5963fcb182907c33f350e17c960bbfd943a285f392a11943c3afd30c6b98d5a681d93055d83e5826ab17d3f0bff08feb979072e4e53020bdc0947fb0598a9fc53da5817953392491c2fff2dc802eb38b8adb09352864371efce6ca330281a4ee3dda9c3a6a7ebd33c85302669542cd5da7db6d76ef6770540b1484865c0bc421483bb5b234216cdb9d19f8fa608798000b0eb50b696370bb133e119196ee71be897508b0e30b00a60864f3b9e2aa7276c46007e02bc97cf9d1776e0c92cb75857103a18f1fc7434a77be2700c22ecc5245909c2328d4d113194b3963838dcd4a045ada6a00db80e4388d135699d313a8bbb1d5dc5e11987386a09233259c42681c65ce05f73f0fa37b09b7897a4ba17f558fcc4ac0a9ccabffa897551ee94455ce8b63d0fa4840f478c832cd7664756dbd6082076f62e7463d31ef598b052df5223990b5ecc14c742a741a54a166328c8e24cbc2c09bb38bc85a615a993be80a98c768565455afe512fc983a63163a081f760b3481d8a99b30718fb7fef4d93cef105990740389383098a64bd6599ac81e728077d319062d613c6a18615ede88ef048a9a99de381cbcf93bd7d3c42ed2f9102240241975ce0da19a3a7f62ac79bb692aeca70ab99c2038e394e3c120fcb96a0d2f630bb51fcb37690cc518fd976791f49dc1b1f3120d22296fbc2fd0e1b17c0395a48c6a063f5cd9757ad1915e28ef24c40f41767b6a9eb574fe698a5d4115877fe8d2993d12bbefbf84727a125d87aca6cf0fe0290daf0963943c1f8308fd849190b0ba84aceb53336e29d9a1ee74a078e6c5c8b782b71a8b905891748e650d43df410900b1921645186fb4780255db16ca463fef686d88f3d3bf9b700bf20ee1189ebf0ca8342a8702138003c283c021bec728d1e1ff114b8c2e3908693d7828101bbf277452cb7770a70b0ba8dc482d27528722307a6297dcae60f971eb974e4b06c99d04e349ac31c2898fa8b0ecdaa0b4fc437507489ab58b8bfb40ca50e01117539b5000ecd12b65feab3d0ff9ffcb40381075052aa4df6cd2c766413b886c965dc3d19d9de459a3c2c2c43a49f719af5d51f3029f7f8ee05f52cc05af9b6e7a668921fbc564fac8bb36f7cedf21060edf8d4f3863e30bf86e2c79d2005ca55b526c04639932b0bd0623bc711aec4f5132c0aeb7ea7da4323781c1ed62cbfa13d7361e5afb452001545cdcbb4a2c30005d8927d62dfd393b982f6cb822be3a3ef15a260223d9d3d6b81fe40e1f3e6ffd27ab9b65fd157644141e92180846aa90481dcd65a9e4c41d460c1fe7ca1506561f1fb0581e82a388d3f57d6c50d117e622e8c7841b437fd5b2993027609a2a62b05f720f159dafdc8dc5e08589d71d310011f2c4dbb8efef0ad9e7585dffe708c59798308ca8028ed245fd680594fc5bd3762b528179260889e67e028c0387f65fd61cbf707b7fd0dbc733657c25146bff6e1c065ee7698eb03ba9a7082c51841dedddbba9a413a7744acb6bd39a2736ef13ef6a8522c0c7a28aed312a96d7f78c771d9eb0c7c2379145974489ae98dad90dad48f8ca71e4f974457b72b43e1bfb1269fc8ec00c65dbd81ca342e1481b57da64781f8d84fb958dc5bec4f145eea417996c09f6d2a557d55f5647ec056fa9485a0948fef715f060da268bb45936a0fecdb01c7e12bcbd67fa6516471977fa107b7baf04aa6a75d072647bc94e22f7d2856acd9e5d3140d49d4ef61b939b43d9e943b64a41976ac8e478cb52e683cab12df64176bcf5b585e5ec27b7624b3f6ab351bb65a3140383a63eeb3bbe820f9835d83dcdbc2cc5f9774b3267d611a234dd7e3171d539ef859b58a138313c5b8024451ef7fed40a98f1b4f3a8be72836312f9d81307f03cd2611a2025a0845029d838f7be2f405ea11c8636c63f9466c13e92ee810df5f1ee73f5133be9b7ec1f34fecd3d21a77d0bfcd3d8fd3fbea247fce9fc0bcc7fab4f4869df72ff3476ffc7afe8117faaff02f3dff813923fc57ff02c7dfdff01cd6703a4770cd80d48014d0f52a0a0d2d50d3444725a048d9dd97d0a22a84e5e1d625b5e8e0c03cde3ac008a2f9807cc866f0d44ee78ad451dacfdd245cc2f0f58ca47a5a3a2f3e512dfa90ea8b4ae1991434bec24c056a7597e08700cad653e1b5f7f7a2b5b51e0205c8147dbef3cd87f278685ebaf722c6f13c850732ece313342f164027bba318ceb3e335f70208bdefeccc5cd220482f39162e073ed1390a325a6b06a1e4fa83a7127dbd0d6862ef46f403ad3389a76890fcec15d02a25c7caf65e30b89eb20a9d7ce17e6bc507a9469cbfe83e230ec52370f3030cb7ece026deacb2a6079e0fee93e9c8aec0f08402b911af29212505aeaf1818115c81e14da5f62a5ce8fde3876a3653aaad07183fa135071646a018a593a6830a6f03c471d800da9530c6d391993a60a210ef5f73fa78c709aa1a9098b6fed0c6182d2fbda8d5960d39c015be944bcda09a28076cf2c3fb005a5b87918b94df20656763e914a0bf24204df792384d2f087a4158933287d544ae02d104354854ee51abd0a97a04a75033e9cc74279f056498ff88b6c6ebe0eda1d9d73c38a587ed03b62d2b87db772fe194a2601f353d422803da15508c7a3f0399678edece872d15a76004038587a41b4b0a770446e7de513d9cf271843475189a649ed6038a376cae103466631346028534a15c35fd8ca15cb06555debe9913e02879cea10bad14818b6979ff22d12b44b474db11312d8e36e205834cc3c6ed9ff0b7d1d721a3917f8468859fcdead20624913c1d6eb0ef1e8d4316a30c0124136124601f30e624f4d212d64f6e104c5e90e60bd5ba3021febb3ad657d5ebfe3b0300d18d2cbd2be0153953d4d4eec3f574ecbbb414a034b3289cd9de90231799bad29da409008b1d0265d3b06ee53023e4e03b83d343b5a72aea1a55d78014114a27d24de2af70454dbe2398991b5404c44c830f077d17c2415bc3f30f4abcc0165f220d04471d84e4369c10e9f0766f8be7a26ca0ac5d289e4237a6885f331f7b221ae561cfbd59730fd7105398c79e97ccebf0ca6732f57f07c05b1bff1921c8e7aa93c465e76f8ee8a8fbfafe0d6375ea2f26485f033fcb2989b7979d1db0a9efeb4c25c8cbf94ce6bad5047fc708ba14f1f75559ba15a684e08e5e9d6802f7bcf0ab5b33bd94b493437743eebf96772340c4bac8711dd5c5facb317a6666cf38eaf41f3df75aebf356a43d37eca76d2d7d71a8aaa75fe4ce8b9a44527c9c9660c1075280b7edf4e4129b13ee13baecc3a14edef91e9a41b8b154d02a1c10b706a51e7fdb24936c0b88f84bacf2e612deb5d7b37517682687df0015441b9ca4996d78933f650552722782a113b3ded85a50e10f1eba1541fef016a1096cd46af87e33d2d19cdd5316c382244bd520f336dca15cde44fae1e4e12e118c3dc8ad1e8539dc0fee53f329d73d85d062a86ab5b536363904bc8343a9b77efc23a12b1f3c65b29051c6c0869cbb5df3596bc24db3563b24e80b743de97aa09981849650d42837584358685768c779011f328df82225e497e23c88339b8cb78d62c2b6b0a793a225051b2246dc19727486a963578cd84c4d8c8871f8853c1049e7831ac637ea732fea0c55d1973de0f774ee154f0d38f5da47fadbc8bea08b090178e3541480de4919fd6a04a96dd1ec0ef57ea833372268628589dc060900ec0879fb1ab71eddd14c13d782f8433159dfffd47ae038b7b2a324bbd5a2f316271d2e61fab0ed3a0ddfe8d6b6c9494d5b03bf2df885ff761592209e555ac65735a3d6c3f98691087a458b08a1fd49edad606b9d29a4b1fc8f4786da975e4b651c05cb6becebdfb0ab28878c84a857418d417373b225e455d307cf5d2e2019f1cef94fe2a36c592a5425ae12ce9b058036c7fa200360428aeb9876bad2bf84f1e6b8d541d3b54638594aa1bd76edd061ca8662fdcb6f7d53da7afa30eccb2e8d0062114b939a982e5507b1cbe016fd5331ded6db8f055c70942611c64dc2cb1769d706687cad8f85d4aef2ccdce01a789ca7b591991473a8fa7ee6e118ca6e1fabd845a8d4680c80dabae347963a425e6e00359f6c4a4c6ec32304248929a2e7686f80439292da8c045c6478f7c283a27f6927cdbeeee192f7e574a22b339b1545472e9a559eb36212424fc012d89f4e1ea2138ff53133f56c892c11ad996e473d266e7e520bc20cdd06566a423572da17ba082434a8069d70d509ce4d8be7a44a0d83f99122b39f0c83540ab1369cb0228434a20c12696d4d7f3b75893f1b28573dc284f8e23a1f75feb10eedfa35542334849f99e01aeaa2df97c2ba99a0f72b661a70a1569decc9ed6daee61683754fb44d641586a63f5dabdba5efd64b04aa4ffd8c2352fa46ceb3014969130ea7112a4651f788dd0abe6c77cc555e3c8da148fcb0fa43eb321c774a2b9da03d56d3155ffdc1c09d880e1776cb01f25bd8f02225b9abd0b861fcb7ca2df6eb57573b9cfef8d6e8aa334bd457268492de2ac695178df0a63496d3fc4a3e65edd95d26459745c1102198e6149f4de88d0bb47fd66a2675bf8feeed115ae5051e712c5dac4a9d6a7b78703f77bd3ca92f1ba0d46bcbc88d66a154e3199450d8cefa8be5f9112034695901cf12b941fe27889826f9bc2d44d61e61cd5480b147d7fbd448840cbbae97ea53188208235369e8ebf094d58146423b8cf7b90436f0baa42a0b3502949d5bfa2bdc12641172d6ca2d6db8f3588ab9fb408b4e65a37141c1d86c27fbf5e5e6fdc1e683b15ff7e7b793d5274d186473324e16615683c41deb4e1590202b69a0a3c3297427cf8a836728d3592d09e0e14a3a587dd8626c6c93ce383cdc86aae99f31af49e02f4c44094120ab86de6c690b830151445373e701112c50842b1e16c9e784583bbff8b2c3e32537686a91b88b5dfd0420dcbf904f5b3005613dfe6a71e3b1b2bed13f47d156de47755e56cb39d3a28fd720772eb6887a75e37b930c42ab00801536f66920dd4246599d9db9121e05557f13e8b4662ebfc9eddf7b93fc0d1412bb164e1e1a82b00023743e890d8108248f1268af82f0b31c3a3359cf8ecdeb141a1ce5e8044865cf27719ddea796389537e737332a84ea42699fd1dbb0b327fca8ebea810008a27b3a249cad51e52abca3b93982f33a4b38f2af3fb9045440a9e1937f037ac596bd7e8cad8409d69e89a03907d64200ac5b66cbefd08a8f4aa48bec160db815c0d01ed76cd02955dd95b44b962f91225904149f32365f0bcf56d11f2323a66726b75ce08142e52735d10acdb383009e0d149119bcfe197d0e370974389968745ea644bad04a0b89baca342d570361ff714964ab493e0fe9abf90e20290644eaa498aa34cfeb5972a684f701dbce40b40948f850f1c5cb2b010193c9a786c92c1711ed33d255839231e818cb24050a7619e0f7f44abe59c78e0493deaa8e65ca9117d9c54041fbc6740d337b5a77af4e5a3250e05e58b870a73897448dd0fd2e409053ec306236c3a751cd1f1c86604e59808bc0dbf8748d7dfa326d137829dd0d5eea3f89be4d7a3e6f0e391f514fe7edaa0bbdfe3d3d91f75ee5cf46ec474fe56822067e5b9e404380a9b1ce193e512c7d4de1873a5f230530bb36522e79a18db229c1cb3e25a2a4574ffb258a3b8dd73cb992f24e3e5341824bfb608f9a4bf572b62e1130419b9c0c47865380ef60b8e9fc63f2868500cfe24208ce66b4225d2d5483ba378fac90001f415aa43d02c08d7d9b9fdb2d77986f3e1bd18ec8d8ae3c77059e66daae188206e91366490e07d262dba4d37c14b20cd4bd3c0a3280bdf8842378dcd7b844787cb4d43a2f70a7bbab5fc8cbccc546cc3eaf96e5964551625539b4677470100768f5bda46e0e712b11ae5a79affec080ebed579059c75627b43dfcb7c97bd78b91c4c0d7006af4988ba4faf1cd11363b39378b1b9c5cb931939533832ac51677860f18c531afaca64dccd1a9c7fe0f87a390c7b79e42af55737cbfc787730f8a101c8c43802749c7fb64830274d170b450331f050ec75e8a64067e82d8bcc388d5c5c955c52ec94bb8661349791e21d3ecb4c9628cd95ede8e7dc2ff9b6604d0850f747c67a23287bedd090e724b6d493038d4d1f924945a1009c947315a9981f2795457b7a3bd57a1db79ef5fb553a405be69c8eb868af1f8a1dd04b75a6ca690b5ee4638cb2d3abde1da96957c2c6b632ac879b684e135e0ca7fc6b782b859ac77fa68802cd2da65033c9041f03d4ce54df54a5632dac65a67017e3cd411adbc1fa5b3e5e494060485e427bfca1157338a10b358f18d13cabc75843ff19bab40ef37a964f268f38f7f37e0bb4c3b40d35e70629e0d6691a5782ba941e4501ba41f90d873305354ccfae8073a20998459a05c2599993a563f2761440c26abdbac74aea11b1d8be87de9008d847b9ac351fa890f89aecf0e87fcaa9f09e0a35c38c1c4f5982e620ddae5a7d49109f934691f6f33b4758b2d4e28ede6ad3a56603c5b5be0197ab5566a31d5c3646362405410ba9bc00f580a353ca1de5cd8e1922c043acd79494290ac873a18090265c9564bd891a2a26162208fb5afb8fc26b9f54087e1f493caf6cfd74b64193cdd5a37e7cf5bf39551685525ba137babe171bd34cd6eea591921093f8ccef0b9ae3439ad1365fb9c92b2cd7c660334d97af9885431d8ef88a41be2ec78c092601213b4e19f8dabe19f17f3dfd1fc979afe79ccfb96571aea4ef35d6119532d6daf273287789978658a0aba7d0550419737febf6bc2e76d416bc238bb348e36ad80d11602749bdb74caf22f3fc5a26d3c0a2b7f4eeb07e08abfe6bb3421487fecbb8e845fecacbf26361d5a348501c68a279e9283d281fde596e6af3f553cd3ac02087bfbddb4294fab3a0880e38f7127382e9eb0ffe7d24bd15d862f57264436b8c8430dfd5b3bcf86e65dd0bf91f09a19e9dc0a511d99ee2ec3952a307206ee00f212a300e257a60872242600f4c24b00e2162201f2256200e497ca00e238606e23829cebee3992200da3ee1189942b8c107d9a934bb2bfdb783843dea639f354612bc46fb2b55893362a4942a92323e513e7f7469f2c655237b38422739932cd11dc36c04319da21031e61958b45d4ac135414c90d598c698071dc83dfe00b962e32d876fd6616911caa3328bf4bf89edb4e29495ff6a3e51cfff32f37f5d9989834d2248a8425ab0bef21152d1bf9e51bcffe00deaef44d6a64a9b8369493b77942e00f2e7389e461eb4cc2bc0dd360539781060509ce49d8999dcbe958ca4ed7b60fd338d1daf3ce8f71128501c61c52960368c346b1a5779d1a3875a5189787cd40adc38c9c85c81a18a52ff53c62fe20d4943fe67b4dc725aa1788c97f3ebc0680af79614f5eaf43f488cf3f0315b5f2541a4a4106ee94ce70d9e6bb2700923552e6ae99aa3f460da2393cf9b0ec351d6d8c30e4c073469b3f5be2ebad2f87100758d58c4453eb729e3d1ca4a2a08dc15258db78754e299e32151374457cda9c409b0934e275db0c7ef3a32a9d2a4068f3c24a77b13e2b541bcc103a0e8d3d0905695f9315759c9889780b6a07a3c5268a5c23c9a2833ed27e23b5fbd1c0937e64277cc0cad346f0dc15a0a56da1e223130a212e54f73d9bef755997868f8f7275d9a8cda5c080a0b3a69e82794b2a8ca515a774823e967328c25a543a2b269dfc78c75deebc41a699fdc6b69b7547ac0e622d4310e9313a3957b4000167d95d460b5d29517853cd1cc733dfbb2e41110f4010f63d501f90739b7da562a26e4b34fe6a864e59f78aee18b40603dd5237a332c82f899133a5286e809389cec5f75c7d16b872a30d21f0ec923e9cd633838d1484be5ccf1a72db62e763e7c02402dc01ddb416a7100dae791ee5da1ae47b6ca5ef807b04a2284ad4f1cd4388e2d7bb4a64db2af312608ed2a52fe197beab029e6e44e1a14fe8a2e50e479660945259794623110d15403c8fd154fda72912da1901c266478b31fee04bdfc67d13ce401a70b01cda4c4adc0480ea1acd9149415a0797baa645e54d85da95e1e031c4c45ed2c8e1ad157219b90c5c07284245702482a16e4f4de784e4402b51d4425705c4d3eec34c44425d90c835f3114a81a06c66401f10d486aa2444c162059d990fa8382f25205d4bf29253d19677c21b142f01479a16ab4f131e93ea4df6e9b9aec083f0479336300b2d43068c75a4044db4b45e3a7426754351f1dd99e962b369dc837b3b9b315042b5a3446b089e0cad326c178500bce7c12ac39864f3155579c1643dbb4e2b8306176d1b5a54769cd291440d7524ce18b12c21dde597e3dfc8eb5118481661e4bf3df821ebe5e3b31952172cf305610448fd847c76ddd333c5d628954587c67d31390b0c5919c6db555951fae2b06224beacb6dc6904fc0f5ad6aeebecd136da0ae0683bd93c3b3aaa40af540a98137e1e01a7af2406ffadbfe76a5810ea43b66abde0f6bb3d0b5cfdbb61cca3245caae2b5f0159d992aaf73b3df71885a8bc48a9ce2c3dd0c0a51edcd30e1ec0dfe9b12cbd15e4e4a3985d60be85a5c8df14e33d37b969ca6ec355c70314a5c2e131396131965ba01f912c45cda112d1c1b13027293d76e9341e0d4c3c834a25d1c6ac9a267f17faf483e6f5c0fe5c3afecfbdbf7e6611cda1687257f3009c901aec1dab43fd40364af7a0b6090c3317cbcfc05b848b4677189a9035c1d6890d698e82911c80e3324833e980358632c24b9c57cc065c8e01d210431915429805402ccfbac550e60a83ca9d2b5e80d03be9207dadbe68dca582ea1f889bff455b5f54c7b5f438c42690fd06adfbd3fa0594f40bce21e951947ad022cb2cd078cd85324bfe327f40961746633b208121bc9cca2ab7ae8706f114bc514eccbbb900cae3e17f26b772368c214823d1bec4463be08db40a30f694e5d496bd142051b891e48e083e4250d809c7c6d00aaee1a05302a409a0b0f32c06ed8f1034eb42d5cec448099b1dd3bcfa7925b904541577e1f2329b658d68f4366e32ce9a381fa53e2bbf9c3f41563376b30cc2a174c1a71d5846447c0b6be1e4bb5cdc1b22c5912ce9b589957e01f031356f623478c7eea9279bbb4d073c51d816dc26de57290e27a0c125e65ba952ac514164664025caa6602416263c23a4112c4bc659e6efc6f3a3af10baf3eb19737228433ccd50f3309b418995999e264fa003e57899e59df81f1516b04e48cdbbf2c880de7b8453688f02d13b86002b3641251c6517b86912fe5afe4964e87d2661bbb4442e69750ace6b78847f0b4b5a577e060963c3609fecd088406d2087f6036b309de2c1c1a6e92c560f089ebea56c552edbfaceebcf148e427cecba6b3d8273cd6dc3b20f2551e47e9656af15b548cc63e27be85df2412647bd2995b62636613a1364e371758d80ba4a12e17f5045748ad4e94db8384f9d7fcd5e23f31084e62d1c006572f423455aca924841c3229146f544f3c0dbb63a9569a808e9c319acb0706e38e1ae20cf23ed2228f0acd5809ae6a6340a08b0d58f84bb34276e2c218a233edb791240f1f5b387250a7d1b6c9288eb588f178624aa08f80ffe6aac2e178a5cc88bedb5ba1cac1296b791b6e0bb68e04bc27a21a26124060a183a507c9c76d36816f1e1c10901b80b08c14051a714f35bac0506e8b31fb7f29c00313f01e4c561cd9ff7ca3972cf11a9c9e87ca344e9b776920734ff9087f888f7dabcc48d812dda3832c31c73cf0dda006842896444508cec8ffa302840191fddabfcd28a8ef37984d43b09f64ece1e9f142a220de401dad554752f07901b9046bf04c888e46ebec987d13a288389a1c066af348acf03aa33d730f1d85df1e2cc157535cca46393c70fa59214488a66a222cf21afd700dc6e10d56568bc4f15be63b481d3c444cdb41c24d99702ae4701241a68da5170b41070a6307c024dba87b73e5f442dd366d3c199e2e38d0de356976afcb88123e8558ccdd76cab15c8b07b75ecca1685f3d4b3fed27d9f4203914c02d04aabb6bd666b2b663a978d7b43c3b853696a5ebcf92720521372baff33d0624131f04eae10aac3a5c6b28767e79388d947f3379e582de7f9d6659baa1aae578a3f047cd0b9d54f0b184d3cb44b622e697d2d85aa9791d698fb16b34dbf236ddea44fc9ea5b21e133af42f8b6a782a4193b62063c7408816cb2d2f9c5b739003125d9ae719127f69285270e2616d129196ae38203b7c1f8be4ad2e04c1ce515a74771da03643bc2309cc714eaa7ff47c761e337812cbb253450780f2092b92d90fa9d35267cc31d6da9f0ded08135d052229d422d0d02837075b85417136799181bcaaf1e1644c023318d78d4212a227756ae64d8a24d4f244aa48e6084a4ab9796aa0884ad78d206cd850c4953ccec543d0be6d1318fd8a773a6c12ce627c27f4896ac6ea3445162181e45f0c8638928d275b4aed664f7aeaa2941f0de4d64140ddac132ca7d56da30b2f5858e6d3d38d17bd482ca5ee1b5a75e1a66a9108d5024d155af19b5f06f9108812ef6f58bc8aae75c74b3e49f372543231426e1095ae35cb3bf6708813a80390b6b9acca67b7daf1c5a84e6638ace927a1ad57c443849059950900004f670cc45ccd41376e92d40f34d56715afa72250f2afba15b2347fd47823bcd732f7203dedd17363cd33fd8991e726f1bbc781f1a140330ce405084661870025033a6dea791e7d03550c6d4293380a04d3acd41e2e86bdd88438f010e23e8aad67913e1fd9768552359ba4d75e636415da48bf3283156e0118b3e183907040f243d49fc455d7cac5f509288746b4980481a40ec3524892fcff3ad4d806818931fa3da16f8a0d9f00b070edd2f99f174deb6f453b181ebb52587bd1150a5bf7f5fd65c5bc2203f6cde06b0721bfdeff3d66ba08a2249700e70b2a81e27000d88d7f16487808d6d270dfde310807a1ed90d933038038e86a67c1720960a4c86f6aa4efc40f0f19928c69ba63555e343d71e905868a82cea00853252f1c5ef0b160f6962e62c92b20554c7131a3a43719484b7bfaed07c97bcaef9b86ae6b3f71e609d6a1fbfd6c526a14437812d6e772efe20847bf5722dc5d9a40799505659202f05240aced66930cfdf6e566f4c50cb050a7f2241decd22941a091a2010ec8b3db37c8d32bf8430f884cc7f169e225a3515a1ffced7306a933a30f1bb22a63cd758ebbb523e9e2bfc690df0781d0cc395f0d9325e8c02003acd7b4e14680d48d77f6fe00f4b65dfa1e9c2ae2e49609bd681ee3fa20980a46d7c009935653869dd9e6ba6635f38bdc31731ed34675cb2c41db12007f1fab33ee26991a169900133fa1027c872ed2a984ce25a691d6340cd277c569a2ceed53e28a8220949435f4d5b81522319e0234c885f82972433aebf089aa12f32b073319816c38022e8444dd7ee3619f6ebff134b10fc63b8ae6e2d8a9304ad9efa2ebc5f467db2419a731aa150f30f6442f15a14fc95ad4b2ff84c19cf358a0b5d0c9d244a641cffb485a00551280e27d35567d339691b94c451cbbb68a40a2ce6242a2f780c84876f46d2fc11a00b17422eae0e6a6316f558dc0e5cc01746b17bc96952701dc5009246626cefde182a1a54a5187dbddd4d79999fb0f291c10ef934bc50dcd3b93760b21e6d3ae0fbb51602aa567e76bc847cbf82b6d79aeb09ee38b1abefe3b7cc0cecce8e1dd8d7e9ab6fbc9bb65ed688c30bddf80b4c804c1d74937c62a0decfc87f08fddef3874a7768130185c5a3b1e360deb30eb272848da03f35a34fc30ed08f5fb4007400003d326ad30f643bea1b08a616076aab8e9f208803c4abbc713ec50b0a5e97f67553b9d0e759e046b6f12075e34e93ca4dc70feb6a2e029178a66d22863e49dea53af33a505e46c9753ef9c496d322c980323ef20a0136a10f51b9b02abce2d3af5280be7dd0dfe2337435fec5f3d2a1ef583211d286f5ff02a58fed9a36468fc69413112ca61d03bc2d3bd4fe2da1e2f4b8cacd277d6c678a848a87081abf86c1813beafef5d284f2daed8ff22406cc76eba73b4b0a25fc741dad9892f3c05344e8538bd7abf7f1dcfc8e17f7d1f55c64702d40982e132b256e0b2f22807251f1bd506bf4f462c78702cb349c5ed9e8b6b023cac9241eae851571a3f0bcb0357a7a815ef421ef5f43de874fae40605b54a6530c259509212d4cacce248cf8a0d175b589cf5da87b6cedc72b3efe19d39b9190b8b017c6008de1b4f1b07c4754ec5e24db4939e36ea4d7ed793c948dc931c5dbfbc0f36dd1201ac039d59ced8bb140e881609f94ac2fe9f25f24eea7eaf482322a1290ff54e2b799a5b213c9f3fece9425fd04d468d03f74635b448c18bcea6d90bb0ce3e2eecc42696b3bb691e09e29d9fedf1861bcdf1b31913d21de27a66a9c060c8c3c5a19abac084b53001edd6213fe12e0d0e38c38ae5f8332bb0ad065e12af43ca9d0a581fbc951a106ec43035568244306b47f989ad6dde94fbd30ea55524ad13d40b42197ef8a4909d20bb0803075af5d1069f5c62e6149112293f9561c593179301975ad21329a322282434dfce60f993c411c96961a207cfed60b6a133fd8058899f845953f7128142fa7edb0a51a079237ec09a2fb182f9b03eb272d0ecb6a0568c707383bee5fc44740fcc487fd29527f1f42307f74bdf1139ba6489ee2a76c0162e6e703d7866c239a32acd9ac2e24e06e6ad97430a33c1b295b4668f9798c3b2c187c65503c56fb1884e5b6eb7c9e886b05f12c8e83ba9b34bc538f398085817e93dbbecd89642883bc438f0ee0640a207bdf2b227fb625fc4e479b9b05114b1966d20cd0f50a26400d72a07a85b7f3128b01abde44b235edd47d5cca1fdc80bd769332cb1e23c6e75537ab9695a369c8b1181e6c3c4a90cc182b57b47399b80aa70c6b8e2954a69f36454aea43f8da8c52a6055943830bfd0f8fff31fafe3ca7059bb292bbea470affbf9e92b1bc631842f91dd7a9ea555d457c6a025dcc312e3a403174480b016190848680d6fac44ceab201a71d184587541349c8d67118ab1c6444d8a9cc8db61f02610eacc34763e81eac09e85a2e27c3a855250f1188b1203fd19a2f8327a7c0b2b366fcc84580b3f81316d4ce74dcb4f674373c8ac5a68d2b91332836d1522f5f349b17494601252831033c51e458ea6c097505cba3531de1d3a4ccce2913ce2e2a1c1193208202ed2e8c923970ffa480a96ea6073eaca753a866434cf183bf65fb87e7abae3b29fa08c5a46bc3eaade7a3659ef26acb6fcd3b86a1b79e4c9f468d6edc5d4a8aa6316631de934637c736c8fa84af58282e6b47aced42eb12793ac67a3af672af50a9ec7ea12b8c07b9c16840c559602f03e0e36b78070044d91be0a301238e01939a3379bd16241ef60dd5fb1aac2d18cb1d59206e919f6547209199ab0b6928f87c004552202a236242f0348e5810ff00e7dafe868fcab4fd0bbe4c2aea00aa0d32f2fcece779a1c95cdca59f3e68e463e5c7d7f8d2ad74f75f8299fa8bfb6c3ff24f1c7a6dd1cc9b936e45534261e3302a679897a88d84b50459aa357db39406d8ef3e1479155b05ee7f809ea986a59cae02b9c002ecb48b1892dcd4e052674f4fe0aac0ee8e47e77998046e0161713a1bf21fb60127f809a7bf66b9968e8915945bc2e2cf8ba444450685b970841ba08f3aa043f55517d78cc0b3c95569b67b1870c47e3489b306dcdad288d2890152cd45422d1e706273fb670516d35d568a5887225ceaf56ef365412f03673083ffcc4f02459eab3791ea2576dcd7e53b725d0c60ca8562aae8d721e3154d8a7233fe498f9af226e0d1475af31416836aa9360598d4471e39c69c437f5072318c68ea12c1659d78a5689cd9f9260b9950c83ef1db694a997d7e4e9ed7b5986929c53a400e3ea6c59be2cf98e23b9785d88b19ab09bf0f6223a1d131497a550779e690be41a09f9bbc2abfeda021bb0dec10d9a555704aa3625a08651ec0f29986670a56628f2c0df2e95b36dd29b459f9c65511df277e5298d3cb9520f0e4ad5fd9930421b2b1318a98758708de08e49cb0c030e0054a1d4e3aec0260c70f9cd758b37e8ee986dde1ec307f25cddb3897ecd65b7717b0e1c0601a53f4afe52be459984865fc9272d36a1ef928b8cec20e0c531952d6843d6fe159986fd7e028b5b1f78a0e597bc834655269afc75d225838ba27a324dd2bbf0ef38bd9ed56afd4a918cd775c9079ab2f8a5955013e805c15188619e3fbc5424b70ad4cf3fce65d7f61ce6fb7f2e69797b25d7f8ac264fd8e63acdbd429c74dd79871e8e013e6622eb7adbbfab01b61340a952555905841432fb1d21ef7fa3be178d8f6665bfc995f59e63083a2c2d0c4a4fe5db0c0bf5d4dc5e79cf04f4a87b99dc560d735ff32d55c27818608807865e753f6f0f9d643a1f15eb2e78f1ceebb19adf82b9a467b8c10526bd1ee3721274f03b3b94c83d51a6446874dc538995995fe3381190b95ca2f391dd294c7a66efb323edf8473f8e14d96dacac4ca67af61ecf2c18645a06d60150a43be0a83fc561e70e5cbf895fea23e3ce29c596bb5466d7b28c8d88e3ed83a349accb116230dca1ffd30e3877fcefc68ce349bc3c21f57ea9eee1abbe8252ffcb64445b3a869286c26838532018fe4f3fa79debdef722cb993d4d58ed4140af16d17e58354e0b311a447e83602249b479f52ccaa9f0b52b8fa2d91aed5cda8bb036d53546280f163f8e2da4458f91383bf1a9a62875038fbf34c0ccbb7e64a34d0954429095a829fa75609de3a5417628d086f3d4d96897845672a8d424f11b377f40aa3b53b155324feb54cbb8b589f69e254462bd3e6d126b1e523ce4efdaa280d5527157dd9ac23a6f9fc6823728392d516498688a4166bec09f762f5bb9b334000de7cf464bc5584ee51fd7431514587dfe03c6f04a952f68988d2c86b8fb77627f5e8ecb940b71de7dabe8fe752d5708fddffc09c5ff13c7289eb7bff93c05f9c6be8af20c2ea989eb7a30bbce8baa36d307415967688bf0ff5ed8636452b3bd83ef53c568a9f7d84cec0ae65b29a458241fa96d69764b6b4a5a87bba11cf4efce2cb0254b00d911673e117141ca119ed2210b5375cbcf63749c064f780fec56939bf04056121930941c86aff7ed30698fbb29129948715955524db298d36e6a676fcb141d6f217b73cb27b0ab6b0fedbefd714550555555bf4f13cd503ea7fca8eec3deecd810b0aaaf0d39da55c229051bc7cdfe72b9ddea7045cf1fbea7614cafbd8f16b121f1e935262610437586a4b946348ce8053e3c3471c788c513a259d1ee5dd110da4163ba21505df3e7952b7e60ef93f5500a246ebe3f922c1484a38c0b1aab12195f3a6ee46bc46d98170cf420e6297a3ba2a49cb6005d981f5350ec7088afefea860309d2624476e3ca6007a38621c67af3fcc6c42d243e7882767ac62f4aef00cc26c15c7626ce97b0270fb1cc89e7f682a6cc01181c7973ee227104b843e7b2253a9fe20cd18368ca8c72776e4a54a1caec958b8c5353b55206b5d33c9a518878cc741f28fa4cb7d84967eb56a04c6c8000504ee00b53727afc865a968515612ed7ba9f70a347ec64b9150a751eb62fcda8c9902cba54ce42c56248786272d153534455a44e546e8bada4094521134d59ce7a62cb35cf56357a260df03d496bf772fb978cc501729f43e875e789bd6413adb9bb2bfa8191c69eea8ae72fb560d5f3e6df4a9a8c790991fb4df07896ba4bb6dbb53e426f97788a8f2a90ee507bb7eb0c1ec2a6401c82cb64a9950f00db8dc1d317252367311f49411a994d08b6e1400432c81b92fdb295f5b29dfd66ec244deae3a20d85468d8e7cb82c8238f0420a64730f267a355ecae3a955fdef23e4650356fc3725f6b7f048fd28266c17d47d652c105e4bf4b87cbe4114d994bda4150df6e83b1b0b5dd24bf0f540218b442f302ae2da19d04d88149f557b6943fca0560e4cd1058471f86ad2976dbc79d36385d588352987217dc1ee8ac0a6f4ecfa85288ad8d664090454cd738e66b719cea765fbdec581ae8f85afab32e68c92bc38460a2ef30e61ae4a0dd6666c848ffe45889715ee87eaebe4675f37f1db3c248cd72199fb30aec396f358e5685b53317ce0e0d36abf55bbc1635650153778f47a08ab3432b16f691516b58b5c0bac89828ca2e53aacfead48f8c99c14ba43d26e59a251bba006f5ab800ef136d7b0f968c47c2fc20a17dce0399b9d20dd8653d212bb95b896a0bdf984a6a88b2a543d4f779402959cff68c829492ad2cce98940d00d463838e1f08351aa657d052ccfc8ee0980a66695538e707165e0858b4511723f67c2a605eb3456e2b482f2b94d89dc05847ddc3828d943f7a78e9cc19035185a4a7da2214f535dfc9a7bf57cc9c9b484ada63b151cbef387344a6f644613f228835e95bf5f2de35af63dcf501561d8d6fc9c668df4033e3bcd67ef22bfe9fa07c120d062fbfd3a4663b83fc3b107f433d4c14d8e13baac3aad9888daaf14e3f6b6f8dc95c32d45317dc2ffd8ec97662c0b2aabb379e6c1271aa80aa581212482113405fa6fc2bb60ae1c483d14a7cb6095d3ba83b8745fd5a5e4d93e636d9fbe540c186b8f9b637dee78738895d51c426f9f45513b1d45c1f2cd2f49ab5223d438ae01a638e87c13665e1a63c07b37a94f028d53441d713a0c6c9aa0eb07b6706dbb690b74ab58cffacb3961f1c36592d234a463de9d4979c47c41851d46fbb81a0f1da2792fb24da19a0f5cab64fcbd9e7662bdc1ba436bfa64aa70f58b1eb7a71874eff23fddfbfdc19c364402a66b2dc311aa1f23cf19047f496b2cdf02b06114379aff24840b79ca4037a9c42835830da19a50366a99251db25fa1dbab9ea24d515d77a96ce5ad355e8913b190ba1599ffc1bae86dea94290d91111dbc7980218fa0e0098693b088c0314abf0b7545e450ddf577be18b117863f74d5adb7b932db79432a594028e08c407fc075c141810651abb426d843df29e8606649588bfe82269059898e50480d9005b20fa433e2b93f2f8414cc6271eb000d39b6e07d147c7f406d273f9b8854f465a8c8e6e14ddc8c2a72f3e7a932658f874c55ff988030a9f224a15f9e30d213e5927a41b41272e1f4f491f6f58f13f62908e8c5600c615ed410c5237b70388736edce8f9e83f2cc7de663561f427e69391d0b402869387dfe1f8c10164c4394ca5ab31522b46481f1d0714ee667eca77a72d46dd8da04782e5bb1b421f6f28f170c3a751296c09a7a3935111a6d1e98809f477323a1db50ee48ebe9359bd92d1cb28cc4e667532ca56dfc1e841860000eb1a3480b67c74ed6c7c27b37aa94ee667c715a4a4eda36b07b770b1f11d3462199f47909b473133a951588c143ec5182831aa6b8b018aa912c42799cdf26b8b99c2391a0325464acc1422ce915965ab4645cf5c5927068937991e3e459f478f9b4733606dd5b08942958e416217c8b80f6689c9a8647a62905a670710d28c1a9a1d42336a6a66405901fc6879b2a9e83534337608714eb70368c715518ad99d8c54d01f27a36a54741e1b9e436ec9e9a85151c6a8f2c6bc742148c9ac3887e7e30ea0d6d9f1d3a8e83b7e3e7aef000ac0eff8419a3b7e4a42df9d8c6290f8f4e227a37dcb2deb9262b2fb686b0325cb9b63bf66b64e8607845e0617808f96cc94d8c48a162619904cd015374449d0f2d1657e5ae7a5dac2f1535aa90e7d8ee28873e61624cec1b89c924e61c496d91cb021793fb76e1e7d4cfae82f27995537b37cf418550c96ed91d43a0ad431505847a6a2cfa3c6a2cfa0982913e9a3cfa223a3efa09194aff1691d8ff9e19c182b3847e5cf4729354032ab98263e1f3b0cc8cac1bc820ce96e2b4858d5a831b2120527b0a9688b8d8a8ea2471e7c74b8e523e492f566a424c4bd0a790fe40953f81424ea408fee2d65973853a3a263cd6e6d926fa0d106b5c0233ec5980d4d769915e7a8960dc70f9fa2cceaa3cc2aba8c93e8323e9c837d741921cec1125de6493c194df92803f45126e8a3cc151f657e3ebae49311e774387e4e5aa285e387733a68641941a31d44af07f0031afe1c8b717686d0b1e8fa129d5fdc06c6db67b886e572c22cf160fad310699d20578a4ee0f3a8d7a124b63c6672e53a195e95e88c2b8daaea20d252ce89cdd0d4ccd0d4a84fdfa9d675a9c5cd6c9d34c960da3a2332fcbad2d8fa886923f9f466a39ec778f458e369b8b89da6d778dc6a7c5261769aa4e4bae09cc2b4a1f1193ee3309b0d8dc3f83ec6db6b31b44886cc3279716c33254fc68b91194fcf65e0530e9cf39c080570b0805b72c6e15604ba65b9948eada639e64034c79ce77178e859b6998c7c077d34cfc3cdc897b624f04d1c02f605cb39880320cd86e4078c0b99e133dc6b195b275fb6ce04b3e9c73cbf3a7d07f0c362763bff9c8f98dd5ef9e790c389dc29e83ddf270b94c417af595e8792e879d0196a9a10cc330782695c075d3d736cfb8c7366de20b8753c4bf8f454da2f4ada07b7f66303b3e44a1ee618068f581f31cbe7bab41f57928da5e4f912d536d915e758dc5ba2193c53843def4dcaee56e9104e99a4385283b4dc4c49d750a35d48e9fe524ace2425cc6e306da23f2712c4014392bc67a6f157aebc6fafd1940e663725520bacef9e11a6fceee15c3b27a93c5097ea10e064e2f18d806fef2ed5d14e4494034c6f3a252ab90d9bcb06eab489fe3eba4d744d592e6038ade34ea663a507c4378c628f384213661cce83a26484297f9f98ed90dde14699fe907b42b2fe9fc1ec8d5f7e67ea31b0d7cbcb7c6a1464200feb668ee12e3fd5177902b85d127629857eefbdf71ebff7de93fddedb32d72f2873dd04dd4e29cbdcf7de6b8657d857841863d4223001655f26db44435ebb990d3983df152fbe9bb1ba5790f8a482091f6cde170329719e94120c24a8685c869048a28819f33a840493262c21a59437a728825abbc2a4f13a7404d1d011413eee538c524700f9cd901142df394e3cc224a7e9999ec9e48bb323579a4e3829806166666666e66e668a6f138cf1ed0030654c888851ce002610e2db37291486110d17420960f0ed392e95183594078e35c010864a30826f57124cf9f61b9349149b0dedc793e1bb4c223541c1b7db4cfea18a19456cf18de5db6b4c28c27839a2889f02d090ccccfcc413244e8034822c3891622923380233b3f683b180aaf1018b467322c207df3e43fbd1466066e6991edfcd20608808274380f1ed32b2f8c206460c8d51052a4444b1623a61967c3075881517325bc8666c80a1806797b3a7896737f5243d7b8ceb90440f86661085131fbe78c2872e62a66a2184cfb3c360c1420d90c0a58b145d64e1041834dddd2f33366e0ad08510413cfb34f90927082acfaeeda81759b2e822850a90483a01947618babb33edc75b2f805080ef5c3800932c4340bc20881f98b4e0d9311c24954a25441737d0228314409145092952dd021298babb4b45365f78f1a6ef60904878f659c5b39b867ec8f23c3402a02126450cf9c0e4d9af1d66e61f7e683033b3542c6cf0ed1633034085831966667e3b2a20be1db292264cd0858b164e188105163cf3cb3333f3ebb26e068631a88c912446976f6f93ce2d5421468989a30b6c0bbc052c3cfb1423896731a2f04c53c48c55a4d7277c67e3e63b179eb3e0c4f3119e5d6a81c9b316b83cbb87718467034099a52e3ed60f287eae2e508c883f9c10925da6804756172b2a783fa448895d8c90827ec20876490a82674c51ae304aa3c8d9450c273fa25065e108247e3cb16a94a68c08d2b2c082090c132f9e2cc10b2a4df04207568ef00407d8ebf7ac1cea850d50a658b9c29430acb6dca5f680c727cea36a42da2d7f5b91dee47320466478c975ed3bf0fcced8f01b3e3d2a3c19407f8da383f7de5bf8e295bd26c1dbd65555f81eecec690ee0f90e7294553dc25cd9fc058f31f52d8ce6009eefae674eee10a60898a5114cf56e1f965453df7b3070192e67d3dc0c18f3bc5d29bcc8c9d7e56e1eb89c04cc3ec9fb78e8beb210c058d20315f6e71b40e092e5c9ab152eb8bc8e572b5c5cf138288f65ef7608211756bcd72e376bdb82caafcfffac139c4afa1227e315a66ef19d42e1028a62c7360ba80ec68189b9ef61cef372eba492d2866d358898f2a5ab15223cf11837cfefb6446cb74d3a250f3995424c78aa364cbc73bb3937c20302ce723fa86a43339994776642116cd69984d0ea1b86ca277629f535abea5e2f0ac6d07970d036ed487c3c741e86de8dc3713c3b0e06bc9767cdf118a6992adc319eb7ae071f58f5da2feacf9b379bde6c9a55e8951be3b1c7ccccaa3a640d2ec71eb4e4c539eb43f2bd3cad5590e32577240736c3fc238be47f648d5e7a8f850ff3c18a19bf6e7f4f6a33f4779a10e8aa3d4046ae93583be65213025d723eda068f6d452ed72f6d452ece267e6f5d33e0257784012fdd0763da3eeef7d201fe1d62474e08bc8480a9ea44292dd9281fcc3cc09473bc637e6a454e518059329839fa98b703f0de7b6f5555b5b9a90da1aaaafef09eb7bec7ccccaf396666ee02eb25ac2a0e2d6007b1832348054c00cf99570a3137000210801598439771e4c86184d17853cdd3689030be2089305af22a6599f6021313233333338326ebad9f1f336536356abc340755c7f3178267df043c113cfbd6b069e61e96a7df5b02d3577e1eb81b45c999c3f8e1e2b345cb32110c7cf881ca92b2c5a7e771575c1cffc5b315860a72567b7b33abe20830765665cb52ce988dc42a4c76cbf25d08db08ce43ab2deeee7f7c8aaaa31527086387aaed6fd37e5c6e793b06afe5de8ce06837e42fbea4bf22386f0447c80cb91de079ab63e727b7f7d8a19019fc98e76968ae03da03a2ef7e91852f9c5fbed756c4521d3998cfa15c3dc71842ee9132d365c038a7d34ca7a9719a9914a868da613b84d027f4e9188ecce4342693d7a8a971d375f97a0a56af3f781d52e2c96303706d06ec949d6e6ab86d9bf11a34343e85b01c9a909d138746038d4f57ed86e604bda600d92a8fe8bff19a9c86c96b6c68b8c966dbcf5153e334aa3e7873c771e3468d09a197208470a3c1edb00fe3266d06188f718c0019f7b4c9a43d1f637453f418893e463779f7565d288f238b44b410688744310be714d56842dae1cc0cd7ed77357cc6e315f10af4e8518873666842563e40eacf6834cc1a53fc699d2d7239a3efc76833f0d77436be33923d0dafa1e11d741b2f02ddf48cc06868dcc6218ddbd8f663b407d0b8c9e4348e31dc6868dce43ed806dc76d8e13d0d3f02f334bc934ff3344e8386b36306c85679bc902d4d1526cc979c060bb37b2b1a28cceea99ec6311c9a2d434a207d3b0d678d86761adc0e5b049aa00dd7d53071456ab8c9a3c398fc45a3a18669d3376d34ce1a0d345ee3369bbec969b61df64dceaa1a0e43e3500352c4e449f66bbc0647b36546134783eb4c8e79ace18a98bcc6a3bfd4b8a6d160aa4140b6ca638622309e64379a2db3dba419760c1a2acc6e939ecf0af35864fdf2e89a2644fae59946c372af62f045f954c36d93867b09c08d97335e16692fbdcb1ebe581936b3e9c3c82cc976b0cb47571f1c75c3883f307252e6069354c7f3f8d33ab08ba29e1bf16f887fd187a73d96f29c30ea61dc7bf2567c7a5c149d7b1e7fc139924f45902b9229191e623b4b435e3adc3a9c8757bcfc3282f3d1a16534b99f25b47c740cdbacc578e82ca1f4a70989de62a8beebc18787633cd6c3675cb75ec29c5b13c2d3638cf13e9a49f0a54de556c4e26c8444f7fddef6212781c06c69d904aa67559f33569efb866ff8074278629d17e70ee7b9dbf1176e1f3779f6c82159fc248cff612f6d0c85517c713c854ffc23c43fdc3d21cea9c2aa7f4492610a2e8f8d829a111df804bb9d9d8e4151f04506d7f9971c26c69febb39c323c06cd698732d25a808cef0fa326a318359f10980e4938a73533c2270893f009aa4ab9aee42f8ec192cc0e9295b1e5a043b650bb4c29e713b39f98cfb117b3213c5c2205428cc3e99d497e8c77ebc5438d715e14466514e34e1b0e9fa0c7a4e90287c327222803f322054a66a2464167a28cc3b8955205d67cbb6a34d4fc4ee1135c2848dedc80ecef0f14f3f9cbaea0d9dddddd329835af433e5c60bc93e15f02fee9b8f12ffbfd99798c59311ce015a597eaa63da1df9fd65925280a3acc22030cd72d160958211d1aec96082b71ccad16d501bdb7cbcaec761e3640877c8c1e3a91868f752e5f80f4eee6e14c3793e592d261e4e0121531a1af435e957a783cdb33965062565f5555e5d68d6cd2b2b2ea5abcbbabcfb974b9aebfd2b6449b854f457c3282430e1658e69ca345824d607a8361980e49942cc15c4b57a682dcf3b41fcc319355ed8f8a73569579fbf6ac132cee5e971bd9a4874f323333335fd7d3a74f1f3fbf984969e3e115fbac4a429424e19c247cea4c2ad26e7b6dabda9e45e2c2a75e261209b353241d9228e19cf51fac08adddadda00d3b7e964f2530e7c364ca62c6610ce698090c9a796df2be09cf7de7bae8fe3793cbd3b05c6dc42efd7457ef861a51566f74cba8276999dfce8f65ef58c7e0fc62c6a3fbabbbbdbc75a6f1f086394cfb264cfcc4c93d194329362c386c98f4cd714f39a624ac73863ed875c2f4d31b32cd37e5c53ec6e777777f7f65e53ec6e777777f7f6ee767777776fefee767777776fef6e777777f7f6ee767777776fefea72ea3e9a6f7c81294b2b4418a133430821fca1de03f33c66276064f92e7b0603cb2b166058f1d72b166000bd6201c6cf770f0b309478ed150b309afc7e00c8053f8f0701aaeef1d661950aed645b16c4542e66377f378c8979bae932fd3be655afbb0044bf061133e66ddaad1ca17ad580c4bc0386d810844f6f073308b3b11da6f680cece97f3cc33cfb8329933f16991483fd283ea4b1e370b4992f9d023c786fd338d5901d39bee21fdee8c8d66c8cc90b99f9472996c13284fa03082a24885412d7cb4650740b8e271bae9b38a228a2bf467ca5213134992f95d832af485f555ad4a799060ea901428bfde7152142b723466bc49d1f25d07e990942fbeaf3416d55dc97302513dc1acb51a44cc07a49ffb60551dedef0ab339c875cccb44fbc1bde21c4ee21cc9614498ddaaac18204ec88098d2b18784a9e2ec876973c3c543c92fd588f4d860dc922e719cc493bab8166aa2557510af5aa7f7677d553d3e52808284ae10191d2125b18a7b5a4753eb0dd452be7f987b47981d77319fd5edd20a10c20d6cd21789584367ecbbc4c4ecd9a3d6b98e9e3b757139348a7bb20e493617f87cb7aa2117ac268c5bb73df43cb9eddbb636e83c0f557567825a677d50d4fa10bf2b74a56b2295a907b3e35955c1547f485c33657ddb577dabfdd024e556df16ca1ea3de4b9a3cf955f144d25118342a27a03cbeb4e4606486082d24b0821f6ffbd80c9f5add27f7880079303b9c7f38fe9ebec7024c6f600f66b7f60230a8c47cf006a654df734d9a9dff73c532bb09bdfdc14704858b16415a10a90c3d41746a04568a4a07deafb3aa67042929a0f46cb37c8d3a240429cfbe5a77ece871eb1a3257849ddfdbad21e6f3ee2fd2cfedee721630bde9e26a91261b7cc33a378c6ac702178e4ed846139e61128636513fa3209d13a3b68a0a4dd98132e4c12b449f20435ae7798cd0e23cc29d2cbaaa3ae4dad4a828cc4e8b6092aa67c551a8759eb7c72b7b6ad446a2e519841e4e7aac7af8f438410f9f1e3edfe34a8f1537e115af9e857ab46821428b966727ab454b0c4d62e88961f53108c5d013c3eac995e512c255f4a59eab688336e8f748c9066d15a0e7f37cfe5d59209fe7f3446ba2adb412682b6df59a90b6d2562f5306eacd72de1eb7ee0b165f977559ddee831baa1a76bff760decb9a7c66c5fbe0c69821607537378fdc98028c57b7f458677c3df6320bc6c7ac2cc2c764665d992c655756c2b20cd366607f25ece55f118f93ea500821e41ade419745e4eb8c6410722c75a4d5a82ad48a5af97dddbdcbac422fe59c2693fbe9c480853e58fbb592f9f9c6dcf14155d8a96a6b7a526e666666b6a46a2755ad2f56485180045b3de233cd12db1e0f080ae0442b46abc811b03c21094b50e20b26a4a215af5828b1ba83a115f8e0cc19f93ab482d577d35fa07a1dfa71f25bbc0e3581c5b73f9f7fae43591cbd074cdf2951a9549fc494437b75ddda577bd67bcbb9ae6bd4e899cd1569e7d7b73c0e31b922edfd459e7372e84ad277607ac7de52907460f4a265bdac497777cc92580ffd7906b9de9ec36ee8580379924fadffb8d71a6c93ed59229a1cd13dde6eabbb7bf81779c5cb0e39dd17bae326bf25d836a80b79d51baf5e73aa47743a456f04f6c4b08aa1490c3d31942086550cab298ca896abe8ca7209e12aba8a6600bb2456d624ebc988c89a644da8108289d97befc1071f64d81e39dd179ef3d6551e52b12fb0c76e9e6ee96f0a4c759799999b9b85c0a413d365e8193e4561762675c146b9f77d8508db8d57f9093901fa02bc0a2101657db3616f27df57fcbe005ffba110321fb17a787f104000cfb6139e76c2a755b8faa3e3be2d1865c0c80d23a09dac7460a4aaaadaddaa3b0c43498889a3daa6ce462311b430839b636076369e3de7f90c15fab657c4d42b66e7ee021c26aed838b9d0e4e83b131345df49938d930b36ac4a5dce506e4c7a64eaba38e96f83eea3a50e1f2d2bee78d58428135eb92836d197a8500a04cf41005fce6be6a28d7243a0472e029a821c0ea4c1900a8a544044c4d42126825e875470f4ecfa434c000d2d516403ab52965b1dc5e2dee64576e85797f1aa0919c02b1705042fe735f71863b022d9571facddc080d6f78c30e51c758c5fab6a0e23e1d7ee24fccaed1d73127e7de5da0915e9ba994c619c51516b33ee8ae180dc9048c74adb2a0ac2f6a54196364d651995e832badc6c6ad03c73221a97399192d718621ed1a4cbf5e879523c297ea58d49c92793cc7babf1c33ca2499fa41fbaa6540f10bd9bfb3455da34856d9de91f763d444dc88e2f591f33a83d97a58dca0e1c1b76f7d35e2e6e078ef0756f0fcb231f5c02367445e893f4e78002d3d6a162f905ddda9040a7e17debe9bd8b5b453db95179ef5181da7b6f23d243e5c8ce1749d22ffdf43ca9cbb1233b46f46b63727910548eec7c923ec06a4078acd4dbf459888cd520d0df6eb5d66e5d1b951dd8ea6e095f24b70373163f285760d65a0b2d8ead17955b6b0c666f078e707180c9755effe59058fec266bcd1f0542ad5536b1058f2200d3c0881de4b64690d08cfb7f70e32b3b65fa46b0f781e6bbb082b40d0727294b6c95443c9792b0d2d01857b1d5aa2ca9f94077b3b4a63d63701501e2fde5ee3fd303b2522b2bc6d3610698ec8103e350c38446c380539ed9c5cc0f1dd4cee303030aedae3ba6dc2f3cc0e93693c5a0663e253c36c3616b3b2ebda27acfd0880ea68b7b409c4f8e5abbd70372c592700a5a65f1eb3d9483ef56c545b99f6000df36c83d17e64bb9c0d10fd759e7f5b275f4997fd8361988de7f9056bd229794c3ab641bff64709bbfbe81a3875396f56bc06e4fa3d92e337e8d9bb1e7a7e6793deb3c137db63e3c38840042eaf3b78b542042984dee606cd33d7389b282f6e00a4d4120320a534cfe425e5be689d1a299facd3ab95aca343a3d647eb6c128a8ace449990002c167d54a92c75a23aa2c7a99a269cd6d1d40d66f4bb457f51b52e35d95215bbcc377c825bd27e302c7189d38edc4d0fe11ce8d029c0366079e83a402d0f931efae01ce8d021844d78e816c70d511dd08356a5052397721a59a0f7805a47038a7afe829e9683ea782b3569462c90119094739a4c0eb47e2491669205b0986b147f90c5a83ed4a5a827a7cc76f60ee7dfce731c191806ced1211a60f9e743de2b1a2a55015384a94334b0a28ab9bbbbaded23eeebc7c120c57c1ec401399022e8db7168e87ce262b277defd7ac0304458d18229ab6841d3a2a20d4d9925b0508511df4d7f42154330314baf43416350010b3e4152e832add7a1a0a320a31920050163666e665ec9ccdcccdcaf3ae2839073703373dc9911767773ddddf39983344a9973a8beedf57177cb1caa13a12f17e19b9f83193355c1a42a37616077f3a95989deebde69e75ac25cefb29f42ca138cd1094b5a325ad2a515e1ab62494bbe9556154b5a32c297046945f8aac0172d095f4cc283f0c52ad282af8a252d99842448ab8a252d19e14b82b4227c555ae60a98de746bf42c99fb455545697e6daa288d53cd57fb79efc1dd9cb73f2c8410c268bd1f950e391ca922b43279f5101898afe80ae0020e4a7bec937d81dd72950f11a22130fe3cf9f9594be513b96eb3f8589c65dba99f5f1a10e611c5ddc7b5b3b3233520ac999e705e55ad579fda6355fb02fb8c225788fd0a5ed5f6d82af405768bc3b2529e6ba03af8bb5505c92028be35b25a0610f2ed4a5dd7e5fa94799c1d1bbcd42b587ef5888a9eef1449b95861fc4ea183b7722075becb1e2ae0e114413ccce2350701ffbc13f05dc5c9b7eaf4174f70428429f4abdb80f7fcf97b12b042910f64a004134bfc907a7c837fef74e2d376be3332e0819c5b9e3d06f16400e55f97e066b3f82e8b01957ffe3c065e489de64ebeddc96eba428c2da4408134050b53a4d8065b58b1e41153eeae16f52bddb8b0417c07830c7a85aa967f5bfe291717de7b50feed142dde5a3105e9df73394d7ec2b1c23fdff11164c80b7ef8e7447088c13fcf41072bfeb9122a59a85e80458f16fef94a21c63f5f9f9f17689102140484c43f5f181441e89f4aa549ce11c0142d9e8d3426128771ae98e067084534000b23305070e4822e4304fd704403b490e204892b3d5192684016464353ac284103ae98668033440552110ee34861c2bc0e3191f4a26566423c31652051345f5e879a78e2658889bd0e355145eb411338f8141547920a1f2a5080c3021afc7b1da20289ef1c07080cd3ec65c9b784bdf75efcbdf79e964dcd94714b78525eda4e3b4122249a1428f12c77149a79601ea8d8c05ee2786887df3d11460b96a005a1741f0c2d08a165b90fb624e4526f319930b13c3a936b48c9069f1e11b9e9d0a877d4a827653a67e213f360b2421e6e9803d56112c44ecaf21e99920be891294b013da7d44ecaf20ee617c08fe7be5214e958c3f7debb585ad6a61db9253ca953a39e8f46bde7b007f3e6c6341b261133cc92578c313e8f97c718637c31c6cc638c11f36e579c6d1e4b31fa6e33db4ea3a2cb2d8895458c51864c0e38c418a3cb90511ecf979f13ab8f8e4dce81aed3512e2336f20a94f828241b152d972e1d877db0322d66c9a7635500a13e680ef4383dc6cb7d70d4d1c1243bf973dba22d3a730b142396a3cdf2d16190a4d4b88c3b8a43ae2a760acac347359a7cd82e3f2f2f96b8253ca955352afa6c4b16c332bb3dda2dd16397830be7741ac61e2d51dfe7337a0ee5013da687c7b3ef52f1024aae5d966931db2dcce2954e3d71a90957e9daacd8d0079167fb01e182a02d565b00959e607a539232994b3635446fbf21daec6653433bd68ed9dcc09e397be698f396d9ccb036479e5fdf26d59bcd669b4d0a6b69f96894e5174ea32cdf6d886c9465b9b42c4562e617a8fe75a6c5841edd03aa33a3a8f5e74734e7f2175dfadbc2eab4be185645051487a73a857fabc794955fa248f7c1925bc2933235eae134eaf97bde5b90463d87db0f2611cec181023b84493b7bfbf3e7aaed1c448cb3a9013af48ce3818a0d18679382ce83cd723643328f80a632c73ce3785842e586fee2094e54298ce3017ae61967b36e394f8a87e836bb8e714ba82c6703e616b7e472cc97943c739e94a634155d53d86a3f901c11b2ff1cc90f181f62b90f4ec5cd26a5491b88d8d49039f41b32871c0f5478b0c9fc06cc5f381e20675383f4e836cbdd203ddadc6039c45cb3c0361bd53e1ad5254dc11c3a2979183e2bef8270ce94b098252a94a850a2820e30e06985b607e4d6685f78fe7c879447730b86ea780e65425f1ccc9e5e4cc8756a2484d33a979fd6a851cf253febb9b2aa51afe79fb74f96c98e3dcbb2a2252d6949cbb2a0c5f5aa7df8c485d1bf977ade3e36caa7fdf7fa073ef9e02a0baaaaaaca0c2154ee56755ed51d234ce5623e29562be541e40ba257cf8098ac4544a45f7e719a62578dc8c9c68625ce99248743a3b67568d4faaae80a4ea3d62defa00692b2f2f9911224b445bbf2c1691d5ee1e0ec987e77fe0c2f112c424a6732ed15587efdcd08c1d407425874a807473ae40327cf494ccf3cbb487a55dba3b9bdb22ffca03c965b2d548710cfd742255a8886aa460d61769c0455adf390927a16c60016a13a0b0445c152e9040000d8d8c890f1188c81f2e8e502687b2cb744fb027b04aeac0d667bf79080be337df4e2213d87c1276e15c7495f4c9b395f87880083675fa8ea9dd679dea7d3ab64e43a09a16ae11e75313b189474256966996b4581e98e7985c1ac521e41b660cdddcdfdae52a9d48f9b170684e9ffd6833c244c2c73cc79529af3a41607bde25d03fdf64f33fbb014060ad22b446cc4478cc4491da1a8a8a4ad5675410ad5cc0c80008000b314002020100a0885429138281ed446517714000c81984272589b4aa324c761140419638031c418628821c61091a9a1a10100eab99309c14ad6ae52005c6ee27b952c280b71e69151afdc6faf5ea5ae8e27413a8187ea551a7c6a9daf5362dbab1475035f1a3f3462bd0d6467e0c13a32fbd4cae855d25ffae7c32223dfa655a537f7a60b172aba00bab28ed29c616305aa8eb690aa38bed4b442d53d2ce1a443602556bec56cd35208be148b2370cafbdcb01116ecb48227c956ee598e21bdf5ce3147488133385046bb00e002781be439e4d1d22d3804673185140ef41631f09e5b6803db83ff9b6d48894dd048dde4d24e95d6d335c8c40cf6db330769b735babb06b7d1f4bb378155e0b9aee77040a1620da585182b62caee8ff474819804c370e0e082d6a4a2d4e888ecb16d1ba545106864596d0e5b9a53536b3ad5a5ae95f13529b6f6fa340443180ec42a6d60ea5a16d7a28505d7fc370b673aba537f3fa05af95c946b51b5939dfdfda4f4698d609bbbb5e1b7cc761b92c5ea18a0d5dca3dddde4f173a2bee0414ec0cfdc3cacabf4c14185260a5d38113b7842f83204382e234e748fb6f31411a38cc511c835423af9d24b7a5c261552b49028d9864777d9dd2acce96a65e3e79a426a6d8a2b82e255b1843ce70248748535b615f39e0ff899757cccdfac0f11d84f2de0a05b13d6c88ba2623787fccd7c3cce6a9ad52cc6880f2bb268e8f65d7299a7f8f6fc0a4796d53563d81a6af2b8927fbdc27804593f3c01617d3e0bdf116b0f7b07d7732918a84ed0cee73a19f5275c1624d6d3ab5550da0585b7853e3b3c0b2b787d15b885df2b35b799bffd99c2751589f726797873f4aeeba6f0833b832381f184da7af346eab4baffb18e7bbfdcc6e0da26d1203608c52c04e269c79cc23fb7e5406588d39a1f21a575403e3c20a901125e7b405a6d3cf625ab13657482a3bffee8bbdeeb0ccd36cf353a2a381258a7ab6dc1604bb4a694472b770dbb341b33c6729bd704efe11439443a496a2fc8771ff576d4f1ad4edc5039ea29d834ae7468a0f7dbb79f189bfb64b8df20cd2aaf5893292fee3fe13036d83bcdfdf42d56126bd4f745a17650ce1ed023412639a2151e42aab05bb61d912a0f92424534a5213556d107b258c0ac7a02a256e5b11bf9486dc95198c3dc0a6536bf71b59089c5e493820db508c5e4dd43847a66433f7e75621adddc6643fa8a10a12fa8fe656b4419eed36680246cb466db7e2f32c5537a034edc745fadf272b9c5a925ad1b6a537eb2efb3bebbefe9212f06eb7a36dfc9097d7cc4c21f41374d1f26d3e61f6aabcbc8c5aa78f9589b1e5c942909ce805299354780909ecb04ef8325072a3430bc0ed455742838e82dd173e0bf0efb0e88c9d5bce94715e2d5921a8e1cc211aaee706e969823cf4f69a956babea95c4f3518d3aa1d13cdb48d43451c8e3a9c41f43cab200dcf633c658dcde1388d2ab3e3ba72419ac826a84739081c980bdd5ec8d526801ff2d6aa718114191ea452abcc1ef032b5e570a908d7a2f2c28a265293507cf93f16ed60a97ae7c931e2d8cfba3a65b434a7a3c79377d95b49ef0e6894b9db2a9194cd6a482cc55b3dc9feb5bdd6065db3388ffbc5b7ba8dabaf8e8b655148bea122f9b0a12aa0640518444faec39ed1585eedf22a4d08935a31f9b9a61a7ef524c08581d06430ca1a4aae529ae55cd762470580eebfff9f09c49a7c405ea6bdd33b8b1786efaf35ea3f4bd82eba429daa27344bbacdd687354d6845ed1238754b66a46aabddc175ce94154ceeabaa8e5332cb433b832518decb380fc9ac0f3e69266427396b28526ad35b648071f622cc2b533a407e21731d69ce43133e040cf57861571eb5730d0b6601a6e723d4c57127de003717796bb8ea40fb1834b7d041788c0f253823f659a0cc50886284600dd0e9836e8498e1507c807f584113405327199745a0c2e0445fc6dc32ac65a19b16e32ac48a03e0178fa10b138ea54bebad9f3079d58355040672a9760028a6e88ed61328ebe3050aae628f1ca0451eeafbcce4db754f4d5f82804f45c018ce8f2c486c04e35c5a8cf707b49888d164a60eadd6148548dc99454def4d8931b2da7917a8e5df63af133968e70f2e8ef06853ea00138c6c6718685c0a0d47ef2d6ecc1c667cfddcc367f710fbff06c0545057d2babe065002b11800917bc4dc88567d19f6e70cfc796b1089e339dbf8434c3c41e434e03f6b564b3764951abc586c6198fee18436722e9a5eee746ec54ebec2d1f5ff50ff0d14fbeaec8f2142fd53c06292c5ba1051ccb419a12b6573dca71bc5bb3fccdfeb441bb4e8ab03b8dc76ce87e793737028de6e38678119dfc6607beb337b66ea1cc28332205c4e9de21971b05ee481038e183bb57cd49f7a8104c6f94867eee92a8557d18d9d6dcb7caf67164211d86522a5442ab710f8a0c03e4ed67b788b5f798c83fdbef5991cdf62567a1d8aaef18ae619a78381a672a63e31410a4fc455a856bbe2cf981044ed0e19518aae75dca7414c8d1c52dce041218e775a2c249cd68233730b70aab9d27bd0de0d651ec8437b99fbd800d931e0e09e5e06004ec6b9867304789bd0cea71e1de59f6d24b963b1b37a886355b0d4c7b53b7a15d886b0937c714e29f6cad574d1191241600f6b99e2284a97f6642ce77ee8a3db794b0e4884121dc88c7ac9c4ae6413adcdc7f7e20c39cbee7c4924c3950911299623580493917165b17825adf9da81a85407c8787888a118df35e8e6767717dfce70ec5ea981787648e550b9256be6c75669955ec45efc02f03dc1acd43de23e75763b3cc8725f02797cb77e8d129f97b3a686987d5bd8ba04e8db1ac81d9a041e1febb6ea3a37964ac8e8839a46c3e1bda9e72da84758e8595b9adeaead7b557640676b8ff6dd2325a6d6d32595e50a67a64b71562c702615216d410b6b65917e894cb9ed6274c6904351be2040d331f8fb9ead4964291555d2aca32413ddf6beb55b626873274c8cc95864b0ae41690bc865f3cf866d015d6b90e8921da8238233f7c874804bf2c8e8f41010bf46dc4806bb71cbf9753527ab97fb7aa73707deb8bfef43ad826b987e41d8f47942f8f3f866d42971fbc9954684b2073b517f69dd65c972d819e111f659f413c7ed6518340f22967265663e78a99e2a8a8707273017162840fb16bbeaa05b72039de0b7fb20c5aae043292e62cc8668244ee045caa02fd6e0cbfa6cc1891391a080ff124014ef6cf977bb2fc5de26a75750e780e7a11301af3011377526934f5809bfdad6ef34c1f76524e69765de21e4e01571646a10a403c1aa01e3346a4b4415e129c7ba29230fbe72ac2724e017427569d0000c4c79433eff1d36101b8b972b3ea356885b0a1ba4f358002c6d2d0b4211d6efac848af14ffeebc32ecd80dae667364de7481ef8aa8bef8f391e98699b7d51b782140fea2ccd537ad882f65bd13027acfca64a56f5d184838effdf7b11bd687edd07e758aef8950e3456faa14b3b714b47a7cee65ea21ca91df2f86d30116b8740f423930a17a6129a6cee8693e4e79c0df24f4667a6fa6e730e77c4c4a7dfed10229c66e4432f55a90f91654e4f66647afa6c830957c404d5cf6d0df39d8c8db62a945d45934fa9229e8a26260b0e45d6eaab81529b3aab02174e4296acbf1aa7ba706ae950bf02a3e7c7a21011359562a9e8e3911349834bc6f493660acb3e70634c6ab6295c9ae75ea8bf2d0cb62f88b60280c35a1f8ebf4d1fcc9bc822ddf7a38a8b3bb53b12a9083b8b33c8efbf1a7a8dabcda831b28bcfbb8eb1d4c07141b8751237107235385a754544e047cc2d7debb6653c978112b70fbcea1d362480db768d53210dfb4d80d7f5a422d95847cdd1f920e17805ce8066017813499c036d93fba60c9abca3ca43c5c66e8c37f420db7a5267a5df20c4e61c400699d9a247d67c5865f5ea8c3dd662cd6d62f0499f0067eef0fdcb1f38d8a0688f286e280463b28befec00c5cae8ac1f078123b90451dece4e75ad9a8c6a12e836269451792276567d5b213cd1971698075ec6d0ca68a1d162cafff9edb612622bad3497386623e96b2c04c0cc510601bed10e96f59c672b68aafe1ab7e15f420642ea9e32e3e19c813f73d7e36ede82086c64e54be214939ecc230eef64ae2ae4a5134f6051155077bdafeec6044bbaa2a04552cba84a9b5f9fe226e67817e89426f51d169a3a2ad1a9155dad25590f421148674eac1d45808171d15c0c816ab5aafe4d9ebd308e618d8cd997774da5195529c00a9ecfc9a9673484dc3d0b8417ec01c89ed1f05332cb1f4d9d1669ee30b76575b176e830637458d1568723f6224b55447cbaac3d1f1dab79afd3e1b4517d5c3923f95a96ffb2b0cdfb862a80096ddf89cd52ad7d38638dbe0a45b91531d2e435c71403b52c2b9388782964d90251786b1ca59aa4e6d0672204c75710e829adbaa7bd401fb7ccb0f8db7effbef258b0154bd4128de0beb0fa3aa2a1c66d54c54079e3a1a228bcffe35a6fc08eba885f9cc012639ac65fa15dfc004292d1793535aca623be7f7cf7fb8ba83493fc010096b851f944a6334f274ad2a3bda33bdbe236788b84a743b381a881b5a7871fbdb9753265aecaa00c60acfcdc469ed09a31a8f124d09bcadeadb8230fd782f3b792b59dfd973c39ba36e65f115dc7ea00dc5d8f71a99230d1583deeb4c3c64c1c3f55dbc6e558b715e297bb34a2bbfb582b3638764cf4020263502ca769cf8bcff73e789cb1e0b0442f34086825d346006b8686afe0c4f3bea0f92993b72a128b8ace4bf5a2553f8bf0565e8ea24f55a20054e8cad593761d9c3b6e9398acb51b10f87b7b6c7abb1f939367c73047ac7490594fde087ca2460256d9fbb113cdbb4e8a897b4b1331e110d7281856200898837b2c92f76b1d39276305318d7f602a9096283723148561ce94a4093399dff68aaffa57604dc186ea8e41057a2a3b6340d120958d028b7bbfae06d4b499fb252d430b78b3ef9cbce1a2a7873ba991291b7aa30f9f79e434c90c580e115d9e70ee8b73bbe3b6744b1e1d741facdbc7ea0dada5e3e1c473da0ee46956f4d784175c32726fa2f4f5290120021309cbe45f71af0abfc464687cd38410aeabef77d5933a9a11108c8d04cb1eed14fa11115b53d09b3be087953d66c19f80b4e6ac60e6a5222a7f657c75177311f21c95eb1177910c5565493f0a4122b6ab65747a3a33a943f0c7e43c83314d06fef8d70652b546dedc6ec40bd8c3b8264885b2838eeea5d86f2e5d6c30c038d74d1aa6a5c70332a90aa41388247a918f3ef30ea01d7ce978341de15b03af21d90194e5d8462bbc20503d671ddd6d74ed98d41cb69719c8a53033f2dc2b3dc0e945e2bf240696171773e995212b188f50a1a77837fef753001f4a04fde6f1ffc9b74a2fa44d856e668f95561acb45b2961f49193138830f8fac2d1909570aabed9aee7f92914b7093915e6b7176e6942a8c0d2ed3e9f53b8229c9de8b47eb950679c5b60aa32c3b3c6fd036e5ba1bba3caa8295ec10dfb71ff689fecd3492e2fd876712fbd82c6fcc4dce62b527efd1054e9538aceed5ff64a258278f78abff708a872f100f509a585e37cefac7bf085f8e2c516ff4fc16bb9595e412857417060a1e0912db047facf0a4eaec3bd6527a8de9006658704b3f4bb8c622633e0e08fd417597638b17509283a502f12c5e59692238d0fe84342f66495760ff2c83d249b80ac11efc1b9c28fd7197429341fc2696e8ba0bf501d48339df18ddb0d4a597734a0effc018bfb100164b4e44f368c2bacf81693c5202e9fe19fbe6761415e53c0eae8769a1b8196a57311cc54c20b45eafb3e8b31fa414d4e9173e0a46731db4025fb32e6a5abbdf4441f63b2eb84a62e3c14457a193b4ca23926c272413860a0d98b1e46e263a56fcbe93566647131fb54112faaa2528b695e918cf99dc8022fabeb8c8dc12de8c43ceb2fe448e30574d918e1580522d6aee35c65c4ad9c62098067cb32b15780b6b2bb895ac98138040ccec651c73f6448668974c0266917acd39ee7981737218dc3026a31aad248251e8957a542e4aa4cd4b08422f2e25eb2db9adb5318ede8bfbaac502b3091a1785e7428d9ba43d7407b849e09426d564b5ccbcc19f03f24829112b127ced9b34561ea363bfbfeaab3d91d09baf23794a992641b16e952bc5d50fa802eb438561917b88672177b4ac5c9081da2271889f6499182e142591e78d264d04e7b0622d912218574a1351503c25a56dc691955c537af02a4acdbbc7a543369c5c244f248522acab0a2d9328bc4a4eef2197d1b8450be51867519601923dc3882f7529b5ec9ee9aad867a609d58f07d072481063ba2dfb0dae6a4193ec5604309594dba0946b0bc6fe50fd5e1411b81197af84158ec4c79e01ce388c155cb50fe186fe21ee4744b5242204f8c1a041d3c5bde3ac29117d89f0bbfbc396d2cc3a7cc7ee2bd1928114162e78c6c0a748541baeb29d61c35454db4e8d29125d6a5f9d6e79f57f25235d26259825c1e67f6493d1762de696a94e43fa944242dcff4e6daa04138d5b8e12a96a0b6a6228bd42683ba275ab8eaa8ed3b1013aba38a94e15e517932f623a96f019ae8652c26af0beb0fe7689b419fcdac0fe17fed18cc958c51f1f33ea25356e95e4f2308dbc81637cab0bb3a55abe22593298b85adeb78bd1ec3d7ba4f46a02185fb8a453bcec424355e9a476dac0b1db3b7c180767f00112a44225e29a0032cfdbe13f2ead9d4c316ebb27ec0739539bfa9cdfb29bab9266bddf28ae4b2cecb58da4e0502145954e4994b49126d1ca3e7435babde5e131c2bfea18814aed62e7fa4689d2c940b10cd5ba132cadb07b2716fd124c4861e09b8c65c2b3e532077470a78c579a33c676b1294957646f225954f4d7527edf39e64fdcdefd20269635356e28ebaf81984a4ff10fab3c4373b206c79ba67ad04f5bc720f8d783d66b91a8322e00fda917810291776a5ea21c977217ef29eb124079348a126d955c6e921833711201c2b503341c21346c157923bdda3623856d6e61377b0dfa94f72e980db961f0c6c310cd5ad0f4584d90d529f33c4c0ac802cdfbc83c83ce734035b43ee62754dc30eb4ba2c6f7e3e782e631f6a5b41eb39a26e495479470480a96f66f456b2ca3c55b61f488031ab46dc569bb738eb8470d477dbfa20358b44190150cfe822e4205746be2e740e9c550aef5fdb963ed8e65db4a55b73f584b92b6284d2ddc046dee19b600615485e090ee0dfd156ae4704f600cd295d2e2d1b3963d17dd83166669a52ea7f2b27948dcf033c04fff8c37fc397f29b596eed82b1c189536a0bd67f145c9a2419469da5badec642277cca7c5855b411df15210cbdb0c79ece3cb473854bd2a042131b8898580b8ff8f3b4b893a7eb26c2be05550de2d3106d3a6ec8e2cd52f97fa41697ab15fdce770492351e6533a7129fcc81008520f26a8c6c9bc6eb828ce525d673c0e7895720f605c2f6f1d355ab7b6d0eedf65e30d4e5d237367e11ae4b35f7d5a0b333913f35eea81e706cbc79069a7601314b2ba5055ba1bfb0c755440360d95126e9630850df768355b41c5fc57f56f758d3869a8e4c0477ad54af742cd2542f3e08397c99a2bc8a8416f01580a7859268646c7ce54ac1fbac15cef7c6a6ee7c1d2e251a7b6f98b0863241e7e776d9edfadd5d83a84bc5c3a5b5ec2e4e43735e74640168465b97aedd19dc1913b292834a485653e20c7e7872517b13df1207acee064284f3729dc3c6e29b992e5d28e8ee679e7a5b8ae1a5badb829cc0c3a9890564a7036367c624d55cc1360e26286ff4874c6705a7d83897e5130ac7c4b2f0e34b3b338999de33ffa35930fe57ca7c027b4c3583549cc643dce1a6ac8e8ebd3fe9092cb0e62eb1d920708d45b0a4f02de28fdf402186dc3c40ff5525e2841cbe806a34916db678ccd03ea43bfc5303c33942e142551dae1b961da7468c7b323078a9b3b76b4209abe30ec7265f009babc3a5646a31d631d5ff3b0a6a14a5cc22422d3c9ae77231a83c7b4a18144051ee2ae8e5a0e3ca337c293e15fa7569c45c2b45f12c5150d732afa7fbbf9c323c68979742631b610358985124ac13bbd535cf445b380e2f0149cf99477af7b1f8c3d2854751c10281ed0a8654389e468106bea720cd8c00eb3a65fefde718979400cf788408fe740c02314533e3820e4ac011ee0f19bc8c5f18e2bd901f15e0c7807ffa1c296f93aaa93e48e81641a3024df63ed1b13d8896e7ce9c362424c6a8ad47ad0489c26a4b9ecd44db0cda80667349db3cdc6c4175ca48758392588d64db569bc4c524651bf4a083d6dee596ff1b1a383e28f0b11d7a623ae90640b5f98b47243babe0d59cd7d6a45b78521cc55bf1bafea2ccfa55cf829ca73204613c297e4b9ef2ae71d4ee49be48bc7ecb99b4691532328d1c7d8c6b770a4c78e49dbd91e46bee5d096cd97c272bda60a2b3f535a23509da09d22f92c252584aeb9a03acd1a12800b189a47543c558bf6a20bb672ad4312e34601532b401981b25732013b79b2359512152a065005de1931e52e4c7a1cd5c94294f98eee8d80dee920f4ca68505540f8e7b0456d76c9721fdef0af8c4e0cf0c52ae9ce188f07eb109bbc64e9d35f8e56592c09d1c1cce6e1b4ea7db47dd652a1a2dfde1ce79cbaec4ce7c22453c4ecc176d9e04ad6acb3559e874526bdb0de54e245aeef3e51e1d0e07d9b41db40a55e9b249505282bb05933e49769d4bac55347cc836d13f1bab7ae8df24dc37e8cbe9bbaee6349220b644a1e54c4a587fb7e6d0b00904b795d7f60fcc13c11fa919a5cdd534551e5417eeb98436332d10d8258eaa40826e18af6313eda646059a39d85edc146ce14dd1124569c62fa1267184b4f70b053f549df3f4316190840bb1f18ec647f395abebb8caa23e0b8b74fcbbaa7bcc07cc2760e184a4d4b1af1bbe77ffb0a4aa613c7cb44b175ec83d610aea1661a4e5ddf6cd99002714d71615ca05031a6d44baa6fdce48b3479c7bdf2ea51c27ac0d03559997b098c91cbfa8beb141b6f1a39e531456fef85eacdffd20107d859885de2e5925fba02a194a06b1253a935293687df92cf85028c546893191d284581d188d36860c3a362c97e9bed0e6c7cf84f29fc293eaed863045de0c57aba265b5914e47addc8d335d991c012561b407f1658cad733cd27b1c8dbc92c3b69c434fac51fb7e00f40eb3a5e9189d243ab4c329cdd65b822fa547ba4372708d23c6225516b15b82fd24fd9a9fbeb05ae04fca31c669b502970ef47064243418229f1639a8870e7c7990daf94fddaa0ca291ba2927ed4bf24784a500c477a224c934c4d69914e00ce13b80039e2d635995c6aca04f77fbeb13fd833677470473710895552dfc8513e1d5b4b6adbcd4ae0e60e583b42522de4275402db5f394f6e81c5c669d41b7642e10916453c4bd7bfc8a3526317b921320e3db4d80b97f2b692e59745ac6b602fcbc072889a06ca16b18b12d16d264a2127520d179546c51c61c0fb8ad8f8fc78e3881e5ba9f7d2b0140873072593c2bf0663e82c8615f4ac14a1442c776ef03c20f0e0435551acc92e9f2fa539431a38b0db2201b786c9f46a6e38409e197cdae830709b272cf7e4c6c810d36bf517b9577f52e12387484098c81b475a32ce689f561ec7bb7015428b4a84da33e4731bc5e06244d51f0a609c0c55d82ceeb85520308d2ed9ba8f6a1add3f92094c8c980f314e6996c4830d2d507b538aa40bd7a30dadfc26a7dec561ed817c882b58cb3d93dfeaf92f4f0469057633cde4774c3eec7c9c1ec844c44eff4b544648357bc393ceb8f78f1f4edf1fd36e3c0345aa7abd0a443f3a13e5703cfa795d700e13bf144e525618c2bed5304ddd7d262e5a32e3ef41565c673719c83958d4f86ee2f581a77c7584a3db8f6e8df273cbfd2687d5f7c7f413cb4031172bae869b79107b43ed6f7d8db342eb12544d321eac33d14761d9873e94d7b5cfa4717afe381d8c3a10a4b55646078d70d27ed78bb5e39e428cafeb0a5f65cfe8e30665a53bbbe57e138750f753666290cb00dc8495eaeeca4ff81393154f161368b61179521cf1073b10eb0a6bb78ff8d6e3e78890b64acb7d934beaf84bb5379906b2aa21cf1d80ac90ddde9573981c8217cc23f3479afcae50bd991e42c31ef8e1b9aefd2687d2f77b4e1c4fcb3efa8dda5dbd5b6f72cb9423f0e8e1f599a79c540f7df4643dc4bbd3044d30b6d87875ddb53df6d1cb2ef14cc415808f3de131c3edb802b06b81f464f11297517c809b89a70c080452ab51d34b178fe06f112214f2e8cda7d6b05309cf1f86aab586ec562580dc62ceab4c55fe13af1393499509e9a63820bcff85e9ef7d35e1a5b6f82edc3b2bf055a765229ad609cde0bf9764824068a270765241311c2ddac2b9380d310ff34ab85b4897d56dff1e1b1e5ee88cccfa3a92f2d520d36a2d0fd23d306943e9b5fec603fa8b963a30d2c30b412273ea30a4d49427f418f80ea55d2f413557d452dcfb49814f391115ba9c0d89af186e1a68cb16ae4239d9233020facd3581c357fc296d0f0c347794210769a2639926a6a305b20134cd361392c0fc1b64b6305e9265dd5f3b22b0680572604eb22f48cca022837df5ce34d692cf471f0332e7e73cb98875d3c1d53e8393f24da7e2dd9a1f7a2d6789d2e29ea08d6604aae2aad7c8a0cce22defd0d7eaf7abd57d8035442fa953ceab4f0b11ed7efb6333f5abefba766b43739b52aca80830a716009c644e9e674606ad2a9e12e1d80cd9604969be5f411ca9304176583242abb384b1d6f2189ef1a4e7547fef7527d539675db04224c4be9cc3656af9ac09bf3ca335458912122c6c1d5e5fa7f8e11efd7d25e352a19014d308614f19e02c153612437a1e7558b02339665158326bc94944df8537b38ad81ead2199af40340e4fd376b44d856bbabd30ccc5def1a2bb1e3e358f7719453c9752f3006301f0b528ab8956ec0609463a2e1ccb803dc5a09976949a8fbe9704996f339e15888d236e488b25705e15f0861ba4faa3860e7cd77840a2221cb80ae1154ff1c96c07128808f32fe6048bb25a68f6e0d60183a523def4d0c8e32bac37e704942c1549d50033c600cf6d101823c109e09a605ace977bf04c6a0d6914de6395b984c816a55ee80be60ab26ff601ee6646175ace5d418365dbe3329bc01b502c81292df0319070f6da1cf953378e67fd313d2c842d9588ec10ab7b8b153324cf71e0c137c6068389254b2d839edbe98840f9a781f9c620622430150cae63bdb1343ba2e9fed6583fc32203be93294c4fa60b5f260f59c381d9713387f6b70787030034b0e3dd9c47cc4a7ace071e5ce91f0225322b5a17d611edbd1ce270dd73ca596988a5a0b348cd3e6202c984078f62460e0bc4025699e45e171ce580cda1d9cefcaf0a23b0c33e86e8eea36c054e7d9c1b70ffc32ff5fe0c86893ce8290d4af44e14c8b33e156a889260e88b5a7474baca54d7e04a6509c00860791bbd5ab257b4dfe7c57927e6a0a34200a6c86f9a53eb496ef7e4126fa3d7213b14043beb9806322baabf652514cea09a3f74c2fc96c71230d597d5f77f4ae1e9be27ebc7549a4f56019eb57ba5415dfa880e10236575859c7282cc6b164a8e27af5a4e9b8445dd2db904b335e970b03e2101fded152bf946201c5836fd3fd14524bafb78587d32a8c1dee08a3a4aa462cce88b3e65ca3590c794f756dc24ecd73a5399d9891c7c0f955b44c05c9fb7cbd956928a4e7b91575b64899a2bb69871e9c7186256134db2158cd915bc2960da7121e486ff21afbefe1d3de06ffb8583b9f20b7af184aebab180b40964436fd5e3900ac235da8ccae0a1a0701e0cd7ed4bd6a098aa8fe2088156f0f1f15280eab971146a56b455c3419ac3ca3ae1e6ca2598949a19c7536e159917f8bd6d6d14266eb6b14132cebf98e093e1e7a56868f0d4b424ba3eca870aaa56b3205e36f9b6b671cd01178f249bf0ea7a5cebaa13a64a20930db89c024bfd8bd59141cc69a23d5b8151bbaab191d55c6720f4c6f65faba56bc4743c863edcbd48642660e44cd8b267de3b923608dce8292bc76bd0bbe33912dc283c10a3c3f5854767022267823d7ba6bd8f3441e0669e1292e3d2213de05751f6874da08768c6e6281d42a1420e6591d500e82f6f0ba0ea2d0c6dc606c7d06bb405c3e2c627e39acd933c7396e005929b4f39867ce295841f5604f8a868d91a2260c9214d4f998adc07764dc175c79b884586b72774043de6ba3b3f2f0e9199a94b2626cc171e99b8019726a63205d773e12a0eff5e67ff10c8751ada269d463f24dc80fad0b166804a214e8fcf5552b8fa28af11a0d4d3e8c92834ecb982961e6237fcd382ff65799c227aee5f125e0b4cf73fd83fdee34763936b8e5b1c9be5b9397579764794df3becfb55215d466a489021c10d8a674e0b701bfd391256f9da77f2de660ee23d31ce8d37dbfabcae38b1c373306108a3013f0129bf1f58a37d325bcbb5ac38fe0e23d04c6756965c5974a97230eb745f464e9a0aba4ed6fcf4736c6879f6f4f5c012f0ebcab21e277ab1e7b5402c2d5113917ec6fcda1ea9a094efcac95613608e3525f0a74c602113faaea5e872d781a561a4a8dd58f3d563648a72f30f6ec620bcf6862c3a42961b94d5230c06fcea5c5ac6f5e53dbb0a0e5c272d6cc9157b9fc707c9f4b044317498c93020b8501ea995528f138fa09f0b81e25dc254c1dac7d77a20b27156fe7f9aad929c0798839fd2af7dbc7be5405564301d74dba91d7551759c3887e313b2c37d2af0bb7072c7b6cdf2a904ff3fe590a9d81de1b5a0987d03255c0bfb5fe135ecead0ecdf54e098ba8cf8423219b2bdd42f56ce9b955f0547fa3b7400ea39c84e9bdd34d33ddea814780a3c1c800c980cfc6a6bc4bd72646998399beb76f1f34d947ccfdb4c55fab526762cb9aa04a119260a02b22ae6dc5eedaf38a34ac237aefda3c5c4276cbf2cf554c41c2c041ddb8b707023cde32ae0061e985a62dfc372d5d7a42a79dc96a2204194ecb418da905e5db662f4df27d2635bf1ad173a10670fafc731e35b459cc90c63406ad23102be96a33eb2382b01e0a417c372875f1dc098c3a1385fa81da37a8cc506482b8923e240b9bf2a2a60c569a779cef18a5fea058361e0755d534021971a6ca799421d5ee9e44a911f40cb680244461d248ab0a7a2f4800e4c8e30f2f41c167b4aad4c3e7c8e11273d1978250d2cd0ff6ca95dfe204e50b5b1d9609bf5e0163993a26d3ca033292c4c16a60c7976672cf1f0877b5188c9a8ef782dc034a39c043186cffd7de30ca1f89cd8ff20489aa59c93b22928de36f340937d5630091c02c1069062da0874c98a979f6cf38a2eca4d0906d4ba39690646ae6832797c87364812934ffa8c1123dd65eead0cb8138a6d31382c50d9c4c1a6594d599c62d91578f8df31f72103853e45a171b2750205e6fe57689c8eecd7706f1006292ab4af20868406e886757f13af5d399ff7270bf73a18a24586df54446a6794620e7f0b652e45be9a039bb36fc0589f539fc9612849115e5ca3ba9b21f6c44a8eaf64f91960b5fc62a7900817e8a28b3465ce50e8dcad9ed12932b8a5bd148be2ff5024b1ae5ef995aea4c060c520660ef75b972b61b58ffc0f5cb57073e021d136e5ffde884b4f1dcba02cc9a1642ec4a8f621b99c6751af0babd17baee9a429e9bf4d7aaae49301475c76d11d4a2f6e1b35a0f31fca2669984ed00e8e4c57b466e2d8908096fa1424a1b92718fdf9e81e1c84ee4a3b8e873a22fb83b4b93228b542c79d59f458a837613a9a85448f4541e11124b4861018cb7e53348f30547be35d4e1d35f182da664880d252985c56a1b944fb054c50ebfb5830d3feb290f9d963b9b02e1f4d098ac48b2c4ffd6e20dbf8b748a854ec8a9a1613709f905c23049f21774ddc7e8904b70bef2f853ab4b8f98f29657718170b5129c2f6a6fbe79b730871ceead378c7c129b7f0b9120b3ab0b69c2485f6c5a5e1b965a3f023bcdf942232e9e76c11dc2dec72a12134f81c3c1b4cb15c18e159b23a9bd88a9b96d49d484f5e6e5abcb80e4d29c25b149abfaf32cccb6d7fa0ed527486850e20cc0602efd5959482c43b9f3f52079edb75127b06a2929c95f71c4a492dff8c4c52cd294405a5088144a4192472f38fa4f8e348f0d2760e2949e4f50240c8953ff901821eb64c36639e21c20ab3cc8c00675861689e910338420b6a165a17e1c0e4c801de82555e93673542498ccf05cbfd06898a3257e605fa776e0e006cb7ea0b765c39a021ddb02faa7b76034151340016a13cf39a5530b7122ad37000cc128e7b67cef4d8fad63a72714f6082bbbfb4cb5ab28896920f38c78edf9890d1e6dc759ea5e629f91a3600190823446fa99be751dc2e0b5482824371fab2b5dfa17a936a5dbbcd81d275a64871fea0477ee56aaa69e385a0f30ab0e63f5ba3173f9a1e6de077788106e46cb607c1e3494461d92ad913781eb7e68ee6fca1927b7866a3dad09952f058fbf9868e38e91f3e09fb96d1ecb7b1668f33719c39c22884f86ad638a205b13a14ad2391bcc7ed2a284e955d762123c76eb5b67d6d3ef13d0ad5075c23e2f12ba08fe2d79805fe809e313388406ee7ceb3211dfe9f359f7bd2851521e1190c00f01abd0bf872e279568460ead9f91ff8e110146811a2b70ec5582af1582391d24a246417a4d87ec9fb44ea89b4872da62bb11329328a64394462348f305a71ece9d57f1c7cf17472f2bd2f492ad8d1a48a740ec9a56f41dee6397a6e198be262c580fc41d219fdb8833a6bf2952a4b7f9e04951c017b7ac17477b927e4ac6cf4ba519e4d10a255de7d907d9db39c04c16e0789ed02762b15d758c9dab52621c8a1d8dcb7154a158da0d8cc6cb68752a1922a87f1ddbda5b35e836d48bb3f065828452234e9135dfe70cb6f2d9fe549997af8789c32a9b1ec01fe2cfbdcd6eefda69c2d35dbedfc2d578c030838e31a0654197b66d5201d6ebec720fb9d58e9cd5a09343360a081f3922b945d79c44a53e2845e24a2c4c50df4ae39d9ef084f8ffa2218ac283522054d61924f76f0034ce89ebe5a593fc00b1cbcfa90a41e79f0e34e0f727170a5f18a05b336be3cc5f4b81ccc09aaea61d9413fa159f67df76337370aeca287e4ccc1d619be89887104a6ba454c503b7a9c7f9efb4d279dd95c5b2ccba78b621e40e682abd6e96d9bd273e240df1263921507c8e19837648923b605cda8f46904e30156543f4a8947329723757727e4325d267051986680124a6f90e496bd3b95c93e1c36a45412dad91504a17e96518c3047c88621682058755e99e50f21ef99c4ada380cb11a0a5de144a10daa065a25a3f0521515efc4fccb0863fa6c33f1720030a2b188ed6aea3defb38df2d72bcfa8bf397b0172664ced74563206cb720df65eb5620c651ea70480ba7f6a27d44469f4d3c8b90dd53304b4038cc0b368db4a699a3173f6976066782d913535464a7656b618a6fdc6e17a69031f99cdf98eccd5511ddc5e277e94984a8dd6fd5d17137751a0b20dc5c8c06ca052d9d7af7d862502873a20e6d9c0496a8261a86f35b51f008036e0de9911664b92fc9ceca21847c6a6117b2af4605dbd92f1e654d652c759bd0d41f1034fbcd09b782485332eb8617d56b5318b6126126de8a1f3f0306e102a60cec7f147d3c81e5856bc5769418ad8ca7bc90e86457abc75772b0a56ebae62e0ff22e8aaae9073b37e8dc5b10e56360c04e694377193438360428e9f0b642054aa62189edfa908402ba833dbbf58dd338070235b7bf546ab1b44fac003b1662374092d352110c93a2071dcca8cfe898c589bbe716951afc2c213a4f3819d3363f16796bad2980299718dd0cade97321c186be210de7284a7ff4401f0bfad8279de767e39cf6384090c89a1676c56610139015c0364ed35ed77a0740cce8c7259171f423dd1934511750ee3905680889219f23b91a63cd588fd2cade83fb1a3d2319b184df5cd1951c10239625c39213d049fb741859afd01ade918723270b749aecfeca5d028eb63436fd356ef3600d0ccf45493ff0409b0ae9314c6a74524da532ef09cd562d74ee8aa7e9fd8a39ac14c7e5f636cf4fcc61a529ee8dfd6f01fbe7e4adf520d8fcc169ea33c38e65899afe5a009961f261f03227089da8b6e43ab2362f2c773f42d689ab176e563e05b75cad668ba81c5845887800bdc281691c81fe993bb07fa8cdd51db84d2b897ebfde36ef2273371237c93206addc59c44f0f23c85bd207eaea9ed2c0d162a03541cf75a35dcd9996ea07193c4ed9d0b6aa1f0e99f5d671d8e8cde61f9c9198deb1e3533ed4bf2cecdf827d2a241afafa7825ba126ade9e8c1b80f473a6c432785283876da69e67add9693e061af17440a85458160fa1fbc9678f1c4dbb71f1683a32dc969091353c31108369c76d30dba6c05f4ef04c725239628d21d4505021f95bdb243c6ad5a3dc3db01752652dd98d113f0cc239002539117243bc65bc41027250d194c1580c62c7dda9de8507f4e6b55d3f64ca23034d0a5c5d4f091b672859bb44e8cc93fdf127ab00cb303d31f0f1febe7e8b95058d09e12f512585c58e92034ac711bc7a474748b93f65fe2e7460af3868983e4cbb20d97797a5fc938825a02fd9e73345db0823e49be25a3d65b8d5e1c361c5521c1dbe409c9891d89dc8dc139d01166c4f9685caca3279ced22176dd13cfc219c9a1ad037a85049c1c0c9ea80f4b86994b518ddf16e67c45beb2df5e67fc0d078c6473d4857487fbd218e0d48d298ad85de5aa79cae5619a8cd1e2fcb874f59373439b2b74d96516659dafc6aed43fa90f3ccb95a9e4476f8812610e37921d254feba6d583f23ee4b1e403cc51c92cd2d52e5dd395d9148abba6a76c8f521fdff8fa26b70be34dc7ea84d472b4f3dfdaa2d0ddd1695674b73cbbd4317390fa7aa7ded66978c5c15f84fdc699f1178272cebef50e1efa0735361241cd086b06092bd7507c40564ff05f452bcee89ef5148159c67fd91651ff7c63d784270861e70ad2d6e810ec8077802799970dbf4f87c28e4a4ffb05e5d435ce55be2455ff92b79a58c490985f1ca05645c044baad5aabc555e536ecbb92f5e8402cb32d88c0da1518f488dcb59412edf57ea529905a1b5723e23c373670f042804c7d35d097a931c44483a2bc8dbae9f8f1e2b4687abaa5b131063d0ef10f264f696ce6290ca41d2fa46a6590e485f0992cf092cdcec7ced119013eba13cb00f77abe1d9540be7ce12cbee4367b0b41c8ee8a02a721bb7dfa671ab9c3a6160bc4ff7e1af1cadebf8cc1ff4917b200d9c1608d42fcc3dc718b08f48c031a2d7921f48e037a53ad83207d30d917a256203c5a77a5b37793cdc2b683d5418a0f873bf4fdb83dce2ff11cfce040c9e5cdb3ce7680590d490a44866bf02e49f1f1a41b1f234faeec462243a05dbe45d98c6ed66346f5210d2ee7a7f763c7ec086b09e444298ca86526d544c4ccab0bc82738f6157ff02a8c29a4884e82439374301b6b4aedc03630fda3d828145ffbbafb5d930b7ce61f37c199c3d0aada0698b4e053199cc284c89dc89574931f1fb2bd8f9bbf840e1b34c5127236eac06440b3eeeec6c19f1032d1a89b249c827cbd880acfb8f2df93977dc00a512841f59b44556c56fb59b46e846d68ba380b066880ad4eb21de288a43a859f77608ba6a99b53879740fe248652e8763351aa552739187a3a4d8fc840ab6e8e0c2b48e7ff7aec2ca42d9ba5a9c23dead52809eb6ff812cc3e132705af0f515dcd79581c494744a1813524e33062a044586f18d0939a14617db474e59dd7711657a6a5cb9608627aae37f0be012fc5ab06ecb3a80abfca87c810d3bf51d309eef09e231d380962753ebf32a48b6695265e76a2d7d102a30047aed9aa83df569d85daf104168bd968a997db6100de2deb4906e166c106bc0de5c723cdcc65b55b884c04f1bd5c1c84c90893d0b25ca16b80ad0048e84076505a5847477191b9b485d749e6b13dd052e5925dd2e15e074034a11412418f0780f2469808cac91f4a36498895b4dbc29ca865db9476f7c2479ac7bce1e6354ba5df2a816e3f79fa05232092b3da7d4040bf7e6721539f9f318f21dae0f894a7305113474ea8d7c5769860b93e2ac659ce86f8518b41400611554021486ffe2d7141a57ef7157b9c955beb441392d4b62414cdd1716fac0ce24ee888fbb3dcbab18a286e3ffa5457eecfbbad78b93e6bea27ccc00da06720c7b6e3907eb47d16bf2bdadf3a455dd650688f1b12f61661dae47afb47f176a426ce330d9e49b4c5e62c7c08159b8ec965f959bc4eb0114471258ee7abe0f4356ff27e2d5d76717eadde03cafdd4b3e80a123093bcc25ea6a0c059339b7d0015056fc3cdf4b531101b28eaa74a45f8be19c0add7f5e56a6151698cf4d39795c38d83c614bce6ac0d5a59363f8a7e3e53eaf2cccb3d9c115c63cb4cc922ea801f30056a41b071b462efaf13375e78bb4020ab6c46c913da9ac0d1279ef146771ec21be2ab8027dca115d922500f56f3dd86b4d244ef9551c8b69040893f737d4b21d2e719eeb4d88d92e6f1f0dfdb415f2f0c97bbd1ce0aba4804d12461239000a535bc1c249853b0c02569e58123dddee84b5e03d4d46948dd443acb010ed536d6589859912374ef9beb815cd012b5e95866f718c0803100330656b7f200737912221244ce5bc3a372b2c5c05ea0efd5b3bdd983e3664bae67e6ce401d81c7c87485672b9ff449a8f403b4243024f2938a506e05cd03b8e2d2b7cefe7f4b3abe2f971a7c3bf48125ab0721c465634b8a5f249deaa90173f09a6b1d8df7e4a425fc78334a520a8837d42c07ee4ecc7a110efb80d76e464b686e8b26fda3e441c10c9441bcd57aaef7b24a5ed228d19a184fff2f6a7ae3f665e42e5d76ec32b2f73c7f45f36d55eef505cbd64faea021f5f7c2aeac64622ea05f555e25503c0b0e6b090d6ea62169aed9956fca5c0db00249accee70a16242bbc7c804dbeff615db23c9fb0d76acd30da7354214e7a02a5d56eb48788da370750a40127c9f2f77f01bc3bfd7b3771cfe05b49b834b6008678c60540756fc2b0f61395cd8b95ebe7d2cf06a05a00e0491b827825894e530681f7d347b54141c4308d5236cfac02e95639c24f508e733f531360c7dcde9c5dfb8fa13ac15f4fee0561df2e6ec0ef1f8840e4e572c82c16e184a3ca0f1b4e1d4d3f8e46ec988998b0010867f780f6f72b6aa984b5f516e4b0426b1a3447b8d6949457ca05f78ad2e9e5a21f63f309be36912cd32d00e66d864e70ffa20bc9689d21c287a7b3847a06aafa26432bedd5ed92be50828fd530de4d00a6a2e08bea1e00ecb93be9222d3532f69de5695eac2d5d985f3e50a1400d5e39ad995f87dbd096ef109fbf52607acc76af431d4a4fed7dc72c79681b390adf5b101e9cca1c7b8abd0ed1472e9c8d587a1452878036c8d4fc8f8cb19f4cc43dc5e388b24e61b74032ee5e9c057f35df5e42e178e1839f5775a7d65fcb6c9a38c34b4228dce6dc372f7399dbfdb67414b7c2a5290e9c8300fa1647cd4195da6d6bb273130901aed370f0e4abe5fae617fc1564c691b4d5d8b79a6757c6bf0d02b83348b7d9b7549261ff9a51ed73a223b56b3b61670786ff21a542a0b258da879bdfe7d0001e34e0af6c7736ffe82a5aa9d1ab5bf1fa001e12a2fc75fbacb72e7f72d67502b151fef4cd407bc355dd21c236b3d8202dd2e88e5f9c74c56474690ba5729b7eb9512566f1c75a33c7b45f35436604448704ec1d8679e621f9e54346dd6ef6044f2eaa6eceddf68cdc8da610156fff439404b180ebdbbe36d343090cfaf71152afcd59465c1ae7c28e3e4bea180349ca874fca4d990ec0440175878eb7b81dbc26c3649541ab60c935b767cd8a77fb86715a00cfa38f8f9b3cfc40641f46ae928159414d86b79c5f5592773184831489bcfc54bbed4266d9ce5ebc56d3fa05f742c57021b4470e798a754cf7e3f59b2b10a358645dbbf0c27dfe9bb5372dddf8c1f8efa8bc9f91b357100e4a9f3eefa93e674d25a02223aaf3b660e3f6b99132ce287cdde5f6285999b510a06a90a47aea07592d01e9af65b8ef801e2469c5e2e3f123edabd60e193c0808b90e1b0c1d7181735774c4985b473902cbea31ce80c119ef14c1d195a1bd5ad00f209f43c6520537d4a91b59fb120f906f45b6ca16f9862c09d7690cff94a130304ab3a2cb9c6cbc3e8e88c610011c6aa809bc6cdc8923fa9bbc3eff4c72a5e5f48b646eb48c70370745a4d0b3b4f8ea88b665d9b256791085d9a61bb288314521b8cd8a38b1c2f6afa9de35a44dccc2c342112a753e2863b5bec20db1b132039f312e4590769765e2eca23001866aa86fc72aab09a593c5718a7c555662b92bef3237ec3500b47c7e1de2dc16bc980b48931374cbd1aa9aa83e8566a89d16bcb212409f13f8d3738717a09717359e1027f11c680d9061219573cd9432e08db769c0617c4587d05320e5ee39646139366c7dd763f50399c5319c1914c839258ba034441191df26ffcd2038a509d57ec114eceeee9bfaec1bb6e5dcb3131064fe3c8cdc40bb5e72515aaca3cd2b597a18250840a43e99561d9447bc88d97ba91fd9b310fae581540c6de1928963c4fe294d4462d845048bb70d8e7e2abcac1c14077f22875bb24b68c6d683fd38e88f2f33d96d6851fb821aa097924765f86e5db77982c518fa86ac9ca55028d1b6af02c6aaa731aa076ce0679fe58981e109178087e82a99b67513bed750ebe8c105b6f5ec7b31c0e66f0053beeefa672ff4c4c282c4fdde31bcc458e744ac347115e3bf104e91ff507932c9ba406c52c006f204bccea7dd95ae9b9fe5f4ba3310a52b697d31fcb8a2ad4f1d711856e1fe874d6d3642045a6719d904d3d8d0be4c64e05b5101e3a5e52c3a08919718a90ecdbd1cbe1aa84e51d8bb22c992d2a6ad94990a7e4ad83e04f671919ea3780d402fbce630073b2da6ad19c1e2ffab5dba3ef5b4cfceff03d3230bb9c3d52ae56f0a9f5b0623490795e77242d495362626e9e61397a2bea18a09356b2d96d92f79c4a5678243e48f028a732563821eb636b9f186c4d954bf6750efdf33c8a6869f9c10f96cfa9a2bf3cccdc052b1bd9db7c2b060781bd736f6c6c1cdea9471f860454a56809edd10335e8457a9f38b27f0ab096012f755121eff6687a7a3c009ad034719f1db4f7a9d7ef6ec91eac5bc51363f080de07bffefc0f4722ba6e85145226960b437af88af09cfe9120790bb35000585ac5325f457c3b4050e603e1fa52c2b5956edb8a7acca366d9fa8bd2a6b1738888938af50d03ed84fffaf2535b3785dd24d40cbaf618d8be811796de5fdc1bc5c8d2b94c704ee28807c06334f2b6e14dee65412ef4dcd6098a77f0ad0260a9a8e0a8ad07f68648026ccf560dde3347d49118da838a2f1f20845ec5ebc6554a2e2a550baa7a916c232507d43701be5b3e12ccd2e12712161e3d2d12f26c3d2a3a6a65db93d32f2b1db17667cd9242e50155f97dccf25dbb4af8185ae25b4213e8b689f5b67a0a207f99c682b59cd3ce2f67a334e650ca793c60fb96ddd2f753e08cd82ab6efa3078db38f9a9158721118faf86f43441250b5d890c54f1206df28f69d73df67347a347187ab481e3e099e203034b872791b960b644107cde75405b3a805416a927a8adc295def739cc2ff691d71963752936c97e7fde517bf0abff0636cd2f32b83b0f31ec6b33e915614d1b6c5978e79d0b089b2cddf887ec0cbcb77847e6c6a6acf2b57d1e681e060e3c2bba32a58289cf4743296247e2389fa4266b1bb28c30d0accc6268d1010522acdddc156d7efd548afe6c0b1ee751ba32c7bdf059e1edb3c82bccf544a6a6e8914622ac742e31e7386749cc0e3828ce4f8031f5a88fad36894c062b1fa5d9ae2fdec7a9a831aeeb01221b6450cba47aaf8d589566a05473e042aeb62a2f81bc9f9bd6f9e551c885c4a2e770d0264bb20345e31e47c3439d38c3a6b64fadab0c9f94e68159fedec81001011e21775759a312b5a6ef0b10691dd4ff44a478c98b61d14ef3f25e2913a7580797253a238fa4549172975acd911e3f8224bac00ca4e965ef0f407cf2e5db5033723f2136b04d896de60075d7b3db046cbc8fc0280d8aa55af4959fb5dcb5eb3b884dcb342214dd5e321f7c00fbb6c695a857ad964250ef440b986f6aac15e5e55f0c8c505f048b4d471b62e8cfa9f40c6a5412f7b349864947d0660f0d3d925385a2a99e7e295e3dc2769e286a323ad55d6eb11d5dffa72b5cc5263cfb1a29373da4791b76a03868c7f746c97dc84ccd8d1fa80a55de5308094c29620252228209578afa0d6ba7ad68f2ef883747356bef240438bad51617ceba88f8ec690365cd28133e3ef7694f01f5fed8f30044e3296cbbe27db655fe3d5c2ae9c583701f0f3c09ea88a4c34063d7e1ea56e86797a96b40b26470d37f1944bdf140abe82cf71273707d688724f84c4d9c12a94d766fd7185ae40850ac5b92f99cd7cd3a035921dba9ba2a01c067932dd76c58b5ec0521d7e2cd067d85dc426120281bdeff8a318151223846b7837531d7a6fb0ae6839064adcc4b069f4c2f11dd4d02738a18819420204162124cb19caf91c19c2273106509c269fad03d4b123998296606a39460984e0fbda72423833945e620ca1284d3f4a1679da186275912000c8fb4113cee556cd70a0afac9fe2c43beb86164761c71495043fe8a411b651af3f003bbd236eecb2d8a28e91909b49c8430f96927444e597f4b35be510ca749da8dcb37392bdb6224814527cf28f98a11c04b73c7f11ebe32493ef4af5eaff59ff1cbb1008711010dff712b8071381c2d9c1345b227c058047ced497cf94ff4f520322c4f55b9ce830f19ab04b001e37a5244b572134ff45df431f6b177cdcd41db760e6745abfcff88921f768b8c1152691730deb66c8fb234a1e5d870b681b86d422738871ddf34f82ee0482bedc6b7b13d0b355f4b1b3166bfc4b93919bbe81ab2a9fce6ba8bc1bb7fedd8c3d0525490875a865272d23f6b8f65e47dc67c9856ddcfedb0dbcbbac32c75320d25f64f20595b165b406f85be55c61934f0bd0aa6684e86b5ae64177c3c3ffc61bc2cce5f015193b212d42599fc8597cd4cbc75ac64b1f58557b58645eaf72360ff6e6254404c4c2bbca16ccae8e707d949bdc0d98b4f387c6bb9d72f2b7f428bfd9afb9bfa59635f40a8df7545b1bcf8a5c9de0751b27a4179d1485e535e3d039a11d0818c76817025dc51f3093cb706f24640f34f6ce7e8c6e3c1af67b431c71c3b4d68d09965b98d9a3bbd8387a331377e8cd40544a9e4ead1140fb6d2856f30205acc073e10d9f2ac07a5d1d850f4d5e69d8f611ef357cde25fcce526803cf839b2e0245632898bb3fd71af6bfc4e40af828431f886d36e7460d57774674f76a7058ff9f228596b9439cb5da7f02ad160fb6a8f7ee971d0e06fe2a40313798f78b0197d3170c97035f446cf9d6aca99719949698d01226d906ef383226fc5907e2e985c568deba67f28b9ed2775c02e7531bc95ccc85256b2f2fda4d604243462679b5f10d9bec9bbf561c6cf04023444577063dbfc09ffa0f1e122e2eabf7e393f11b20845737e4096ac9096052d221cd5e7c2bda893604315959d25cad89b1575a5649bb2ce5dbee386f65f558156f1a43c1b5bb14e843ca777e7bb9c35e8b6b7a6d80454344735eb4bf5a8045a720e2754b00594ddb6ca295aab1fb37fa35fbce3edd6e6b32e3a7ec6c3cd5041af3afb9494a18aedb671c68b3a5d201a6745629f7e3401238b698aea7d0afbb81d8fa8bcb09299d02b98ff9dc86b78d1220fb8d773ee9a34d7b19c9461b7c0870d754933e137403c4ae5b7ad68e5645f00b1c8ed000c8c1499778b06033011636cc9be0c684a97aea7d82b20b42700509584ce3f0b0675dbebd15ed05907798402869a5d5d8f6150e5ea4619e72b3ed33c42bc40b2b272442958124730216e60cbe2b969d4e332811e7a54e8ae13dae3e2fe9a981a5150ae0087e71c0c59f8595ebd6c07c602211ac0bc4a657f00839c87ebc390f6da14cd57a46835fe8b6cabff078ebd56dc1291261ae8353957d0433036428df4763165e6437120ec51520c1783b5abb8ec9ed8b887c92c66ad1ed7c1b4ef9d0caaf2b6f7ae21101f1c06d5906513896d146aad4eac3db7d8f5dc7a3d970c8e0bb0562e8884a285a175de0abcaca5a901e4cc7a135c35682e841a23f300c894c90aac4b5df0a21f3b2446869a5298f3b2a63875ff8e87184ed9426d098c8134d26109ed280f0d095bd52b6cd34f4093926115f545e3fcf65ee250ab12c3aa69b88cdeea202600350685872db45cefab5a8d3be78d7d0139cb373cca17817611ec13f2406a675d9ba8863c8943614eca133aa2c4ab450b7170b5110720b58835a5de592c5acda7c352fd676468ad9a6906af139cee3b0f817115bb9e3aa006ad7e541c906149e852078fb6595097857e94d8eea63873031a65602dc930b25723924023378621f9e7247dfac5c6037b795092dd17c9dab80975322d2ad5b0c8e24e77f16e336645d2d3ce3db9416545e849ff8ae90cc4803dbd40a5ab4456a6ad9392c926f1e95d229e9053c9f0d8201b7f180c02c5d84bc3323271981d266a592f78462ed9980f90c548c1a8e1ee1f033c8b38d14ac5c703fa85c43e5ebc6cb4638cd721a9ec0c3b0f4119c4a409dc9d12df50001e5e26c85d7113777bf2341137f6cee2b2558ae9a24af54b032fb3372a93014f5b52422691089289c04a9c5b00e61c93a7cd66ef90dc6675f087b44216320990f0e52156e6f02d4a0bc987f0b4bb0a850c5eff431424b0720e204e2c268c9405315415da43c6578c20fe82f89c5977d6186bfbdd4160fe42033d8e5a40904f44c94bf4a209638e51971fd3e267727ca5bd23dd6924640df7fba6562892117b4e6cb422070b665cff41a987b690382130ad1142993077f6d68e67041e80734c6c747c01f8b3cb81daa61033f3f8bc35fddb339c5dc4c244ad77f9b15b02158ce0aa5c8923e82942e438b232e16cd86213d349949d8a21359d148b6f588eaaa120c118820cb888385645699c5d822f61b977c938d3e7309c1bdb139be297659e3e9b2b554a92e934ea8719ecc35f14ee02e9fef4461b04761611caa23d7d5d37736ec271dcea28b7624c6f3d892e44352e00d793648d6be1034f253cc485fc5e373e06599e2cb381a64f67957415226ae095ef0a0d8ef853dae90efb841845cdc62d9937a9fd7a213479c92070e171f2294476d26233e251d53b110b82424ddaf858f26a266d806c4c15d72bc770d98cbc29ee13c8570116b55129b3fbea39a0060c45058ac904466fde1830759d059f168c69760023c4983260a9a993bc3195b6173f56abd93fd7fa6949c3282468abe35ede0ba1f8587d7b8fe7a5edcb8781011e1c96d6b9ad56ae0a4f83d12a1c85ed3c85e9ec8900c6997fd16d42b0510565048946a49341685c3d663a3f100a430ebc5240dcec11a5acace3e8ddceec5362f1b5e8ef4c9d2ec231dc3c00d122c67fabbb870ae09500033e3465290c362b9ca550b5ea605bde75733747a9860f87a3c7cd4b0bd925255cc4952ede2b2c03d35794a49e6458f3ccd551fe162ee339ba595ce12445f3f91655586441d27e90a88d061b6ba72f8bf853c5a7a8840289255bafaac5f2b337e3abd9baaeb15bd29ff4bb8aed9b80baaf4886c4f68cfb90e5974fff43a4357af6778a042824480f18705f1684230c9e8335007618ee7b6bebffff3f017600670267cd2ac702ec50d0a33c3541a10bd5e2d6f2710c824f28c0cf077728dc2e03e99a0e27d5a88c3c64cfe085d3948ae7a47e0d7dc03946fe24f41a085843e2cfefcb06e0e33f9431b22bafc254baba0ff4bd93026a5b66ef76a8ade80083953124e7d32ddacd1f2f36de041e1d6bb78a38c2930c84ae2790fa513fed263675a3c1ddad992dc34668a0222a907e17e610f8cc0e47cf93a7813f2c6f0ede330d332f7d4351596ff6672bce72d044e390ce2e847a5f2f5104b96bae9994c29dadf9a18b938d4c9e923fc5875e19e96a64111786ca96f4f7147a61d437ac18953c74e6b829cd14296f3d0505d9cfb025132fe96e1eacf20bc9d13437fd55254bbcc88e8010f37db2dc4e3365bb1dc922c5179b65ea780fd68123caad95d24813d08404a832b82fdd3d8cdb5fc4bf2c6a80e1d60167674cd7e7ea262d47401c1552853930a1395ab4589784725b03c70c1305246f7f9a1dc69629fa3ca3e18191d9e3dd0ed6ae71bbc153fdc75c2f33b40a638fd895fe75a594ebd49bfb31791a96c4ca89f9ea9db0e7f16d30e3001a68eea65911383f69840f3d8b29b2a25588f8818386d4aa9d826e54a41173716be9e1e72a1084686bc8e81f6f982979e8a8ccdcc789e0946d7a5158274e98d400c88bf2e194d6f62c6c26a3b7d22faa625f3e0ae05d3b8ccf44dc384101bd97b08d1b2c911607610833a085449e8522f9a49769c5c028a161f4a670360f706f8691a80f7953c92c58b5fdfee8e14af2be479dafeac898ff70223ebaf883fcca409699b7e60ee4cd505d2b81b232310707850f3a32acc3ec44addf7221762cf9c638d43d151c77584749d75eb2e639bd3886c46511d30edb0a0796fb46cab4950c62547c6606fa510219e18e6c038d59564eb5bc044055f07563b9f75eb6b969167bc03a10de756c5307ee27d6ebd2673fe29623784de13817933c254213f10902a7113d248150b9439f8a474ec32c51f04b88a6a329c74fdaad342c3a2171d1342708da18fa4eca191a91fcfcdab3f76edb250222c193a64cac6802b7e071a4ee92510d576ca0eeaa4b4f2a02219b76732958a0b83dd4b53ac1108be6c11a51f8fc4a08bd156130e253bb8ac981415522e84a4944cec1bd7c6be018c14216ca6b6c9a1d5511d2a4ce78db4327e4f62e740e9dec39574647e09d651ed88208f3e13bb9121021e68fc5265e4e47c17820999e880f2c36b77578d4f7e1c3a2d793cf2af1de5b666cedce8007dd4d9bf0706592ebf42a6c7f845a86e50ae4ddb6a5abf22fc497711af70b82153a316f62b1d1e2623015c61c04a9bc7cad53f938e570ef090d1a728791c6f78e83745de0c9e08a63d72ef22ba23f85201c13381d5d36fbdc7a7b1e9c8eafa604409b77d7f489f8ebd9f99789c4ffb6e2d3fed7e924ea3e0c98bc4ad69b49c96a9c2e1afc72fe66ab18bdf783b471b04b3f67cbc942fd309c42bcb018b4c61ff0ff13a8282e11145b70d3aefdba15f772235699dbd5ff635ad1065999b90ab97e6c41dd0086a95186b5bbca2e3ae87cc0d81f371834ef145a78650980f0ac653f729b97d519a93dd47b6f68d65e13cb1d1bd52b40d71b9f094644b31d53c8ea37ea584ab0d59cea18a53246e77ecd6a5c41e2ba3fa6475d3815f66c2d7d866f0cc852911e4e4af8fc67fad4082561053743a78fb0479c58bca47c6bc0418f16faa0cf7ceeb6bf0bf34475207adad893f83e3848b4f377d3302939177ed8377027d4a3cf51c1558f75c7fdb88c0aec7f6ed71a8ecb153b6459192ec8d8507abad896cffb1b575893a1271a7f061917ba24427fd3c2409c4da84bd50fe8fdf75b42361fd7d8c5fb1e50f8d2d1115820fa9ec8342acc898ed687da22c778533f808bc0051c15067ec08d47148d413526b6de52cc3aa0b5f85bb55e983fafb5497229a0ccb2e451c42b3a9e1c97f592c0c7b33372891158bd92b8d2255ad28422c3b692e9cd1852d3c5208df6d5da97bfb864c1cc51f06c77abaed0111b47c86a1c0186b5cda2b63c3106c4bd7d149e5053905209607dbc311af53e4c1b3692b6de0569a11e6976f3d8193620c28043f27345f423a9d887f2436ccea9a1af24311f526b8ad4c90987afca3a054a36a276602ba7611444fadb588778e2a25f8e14c2eacf3dadb28f4777fd045c01fac6cad1453709fc10f643475be5152fc254221bde775680fa2fb50997623138a97c289415cac9c2be143c40c871e322fa4d631f401afb1f159f40f4c905413f18c8f9f7626459f46362b42bfcd1fb14ac5d0964fb25cb13a27638dbc68d026009edbc7295a9775051b316a27e363b3c90473570ab513eaea028b052e2f0b746c51c015cd4091afafd564ce1517e5df196387627f9a12384c3b97ffe27bb3c677a60922926c06620857dcb4fee7d644e443150244be8cda44032e3b143c2f04b2ab55f92ed67ca6bd1b8c067201fd5a03ea5f52f638c8d84f45275658905cb708525f48fb00a2c88567ed5bcce99bd51885c0c34ee08a0b05ac9bedb4af29e9f0739a04430e012211555d1f2947ed50d3a85a102b58b9d4d3f92fc7c4db121bfb86dcbbc2d4f4a404b4da2c2cee07866ebfcd0ddfe0cf5abfaaf57848e0dc3e0907dacc8ff8df58557be0c8f1044751f0d3dd8d99cc281223e060a0ca89bd867e65490f973397628729fc4af5df5f3a0413b3335ffd78474cadca0ebe3b2ea54932d56492a18ed5c27634fd1c335159319e4237a8cea2961f6c856e45b4ccae6c3a8cff9f2285c0b2df081c0abb2f5c5638d4383d21f883391f8665e11a4a90a05972d14f1a31c722928a22d8a96470ef2edaf2ba671cc8490ea5664a72f0c35915829f086cf92c26cb6bf900d2075efd04c1e84698bd02c06126a6e114b99b32b432dc2f25172380218610b3d48799f25ba38e82b918b603bf7bd261fcbb87ba735ecbc32ea7185063533a3d6e058b95fa4680d3a86fc525ffdbcaf94180d57bab3a4898d6daa77339e7d0c132e3aaf51af883c22bfb0f0a1946e116148e581bb26f2a89c83c197524a917d71a06aaf3ba5a802ec1f1d9ef1e7d2e6a2ce9ea65258b3f942847cba88f959c68ed859686407ac161c92d92e8d62e40231c90d8e405d7f43e0ab506777f7561fd28d506e1d4c3cb861e5d6dbbe5a4ffb92cfd2c04599ce955b2c7f0b8c201e6d490dbccea20bb0f8de42b7845bc022c03f255a618374fa427a0b8320e3ec2ad6f1a105d7c88a6766038c76a34538589dddd6b5ca6f932dbf537ac3480fe68e3968b8372970366701650741c70ff30c4fd24119909c1839b4524589af369a706f2bff6deca133aff407dfb1caa220f5e24567f91d2110eaa03fcb23fd3f9ea2019c4a77b25d2a9731120e2bf09eb3d1a3ea10300428d5e5724b4e9b602118710b06b95b12448e1302efcdc5e8aa7eebedbd0ebdec3cbbc3510a3c5a9a54e66aa660f43c54267f9bb5255235a90eb56c3f8f0b3bc5c325965e2707a37b25c9d01596259d19063383e9c7956955d2ecd3ccee9174c498b661da086005b30ba31682da6c9888232b97c0105f01edd3dde235097fd386b08d106ca5c3372d5a8a42e09a32818d48e9c5a2cf6c354c8c16564c8341055bb2b7b599e26af58c6747c00bbd2b02ccf1f06d9a49445a73c966f3243e17cdb110a2436ea82f6289b0b2c154a61fa9a82b337907dfc4716f9c6056f981bba63719472c21a38f22634312365313f06683d6c6fc35630f92f89505afe58acd33ecd35b09c309fa08eb9f4ccf623b9f53a72716cb9faee50db0d1ca4d2e5fcaa23b24b72b6b0b2c924c496508c1511eac1fcba0c4b14ae0290aa1739d23b9f132317619d7260f8b6a0d869ef84c40dd2f23be00dcd1fe12467ff79f5b7c46aa81827317a68af105b152d8afb2e536260701c3d349ba2b2bfe33a94d91918337de747a966586177236c46e7505a76e85d4b7ee69b84358b1388dab3ee41dcca2ba036e9e80d7b886ace8b9c0d7ee7c22751a29bdd6155cc22b4558ec942a69109efb64a514de11a2af2570248741442f35127d1ba31760173a1addc27aeae1c48c2a03bfd7834c453d547211124413ce798a730ed7225b018e1d15706dba4bc60105aa283f030f672999455432e4a897beb122c63b50184284912b849b2135151ee6eadc467c89047861321cdd0ca76992d51d42658aca67f950a2484749c2149bea7ea312e14d94f3b198f3bc72fb7e9b468897f30477f796ea2570229eb94b2a67864ce338f2d9c57d2001746203aa56fa775a3090b29a0e2c6a347f5696a778e89aebddf2389fad8d822bb83cabb6897897a8caf55a7f4a07706c6305ed124b80550fe1814a18c85260373549dc0da6a0bf77cfcdc409e77bb4611fdec066d16462d27ad392b6b79432a594021707de074c07a9ea79bf7db75a6d1ecfaa6395f7d18ead5eebfd6a95e2ea7da9df71a15095f278f80877d0cf7d38ce7c843de0671a4d52d993496afc9ec5938b2df51e65483795b7fa90478fdafabde17e198c1fd375726e28e985e0b5033d0874e538af842225308221063abce0491660cc766d1cc03dfd988f6b6db984a82a0b7c752c0552ca6dac538543bc2f7ac75deabb9fca3d3f8a03e3e79ad1f55a425b2ccde8b626e4628c11d544353e711b9bd3446e133fc658abf14154cdbf899c730fe552f5a7d2314faa1e6b7b53e4363ec2570946a358ab3edb88aed0301a71348a2c88478dc39c51c4a2dbdd5d17a230a216a02ed20be2a81dab5f86e190065500814c5085f81090601cc2b5259341fd993b0b20fe1d5106eadfaf92a92fa2ca24dbb68130d5abd0fd7c15b8e3088501e97e7e17bf48e52f54d52115f52914ea13a2aa9ccb472d75fcbc23d23ef6ad43f3aed727a50ce92c52e33744cab8dcdcbc4c8bfaddd4cb5fee564a81612fd56e26ff42dd1b679ba98fa98fa663b10623b8bd3a965453a9d483b03505a6be4845bdfcb8221c38b903f93bbec55d19690d22900e0377dfdd75ff5d775fdfdd3d5aee432925277f67aca190dddde52dbbcdc847364a894283eb9741ec7ac8f97c9f8e929cdca49453baab3a36e79ceeebcfdd080b64bf4115f6e7cf47c915b22a0f14a2aafb51f5bc2a30f2abbeeb381518724da122a8c2feaafefd53a8ef50a91490aeccadabc05015f6a746d857fd7aceb3e2bfaf40ea81aa9ffffc0da92b4455e93bd7361c0a546184fe0555f8426ea5fae2a78aef7daa8f8f12a2fa54e8fea7764f6b54a962acaaf77ef5711ff9bb6f6bddf1d4a7020b3f353e070a1952fb990517e2b57f6b7b5d85451048ff7effab86fbfd5e774f745d7ff3bdbddda7bb7bfbd73e9f93548eb2b5e7f1f8b70b3de706269992bbf945da749fce600423c79329250407ddb64c1a485144a92f9a266f780826c3319b7904597c5fe038989564614e92c59b76821a9865a02a5f21aa257ca1ba91cec9902c65f0e5c139c0d25e94dc913ab9eceeeeee4988408bbb6bc18259e66a1d37c8b26ce3f415ab30a0609e724e99a5a80aedba485488a8ae97d745a2124455d545a2b243ec22ebdeca5cf446a292a44a30a4dcee8c59d658deb0a2c88a24b662688a105592aa38c95439aa1ee02a0bac5a94a75a141f6ac7eaf7a00a12350fb8ee479e4a74777e34d5fd9e157e3a27a5b4485298ea32d590a4b051c36d4242d2a186eb255ca5e84c23171a7250ddda0a82ea54a24269d4ba5411aa220400781cd59a2c7921c06c8f721e4141654a0f42d49dd2c3931a4107a0ea563f105887d87fd99c555a6a4d942601385183135c6aff3f11852b294094258f550455afc2a8ba8d47f7e81e4115a2bb47f7f8a8c8d5aeb7daf9ac5d94b593b176d36bb7a1a218514a29254d8dbb2233f315ec7143d5cc9cf9928f02eadbf8b37d2f09ba3ab60295f911322fd8504d51ba42866ddb361c7458d9028639e79c9d1771c458a1a286feecc24b142b3f2819f122a5a1f822055fb420084c83fb284a7844c9217e4d1335a839ea2235b1a5862fdb86e8505650fed055a98a6b66ee586c266e8faef5d11be734cba34747e11fe9c6e4ca21d5bfa5bb37693826c77d8c4b388e9963f7c871fccd1923e74b98bfc8f6f28bcfb33246191de47cf4d81b8e51e6eeeebe354fd331f68d2027435555cdaf93d942f96598a837c3a8712aca6dc741130e9175fbf9fe28540a854ac9450077207f03973b40fd5c047007f3b74f4ad492ddead6f9c98dfbf25751afa911544281b8498afb7d1ab55317eceef7342f175571be1cb70bb3030dff6b988ceee67e8edded8d46175d069121f9691d7bcbb66262b8d28ec5999531c0134b2815050d394963e64d688ba9542a3048e6d0328c906b0f5a1f1d186e476fa4c07033f28202c3ada8cb461472bd0db5941c6ae3108627b437476f140dad6a31767777b7516d2fc9517fab9a2594d404162a94a8e8e2325a123b16e3cb15638c4cbaf81ba58c320888002ad33ae68294bb437eba6ee6093953a3213331132b3196c669cee3d9e6d631958ef96fad63ee04ed388e93cd3351501f726d8b1d637fd1a478f413345ca7ca463647e6ab67791d6a0810c767236b33a46d9c05866c44f52d3c30e421aa2b998099547f0e0cb906065a0109ea5a01483b06eb5fa4122cc11ae422f71edbee8d6e6bbadddddded524874919860fa20bcd534cef6dbeb6cdb6fb416f2a85b8fbaa1b0ebbb6dbf6ddbf7efcdf6a923fa75f3319430f9f5c1c3bedbee38427fe9a9c1a725ceddddddeb269f5e2f4a8378056b239f9790520ab924072a978aaa0cf9897b922fb73056d43828707b0e9c60b77d2db09cbf7dfc24a3a0aa1fe857b97250308f8e49a9002985fcf828a420e4024c935eaa0ce2a314f331639e6381b5911fa31205262123789d08ca3b3fdcbd0fe88903b9bbbbd39ea0ecf9ef3cd7e9bfd3e31e083f3a367bbebf9e1d1a6891ba3b3f368f67f34408c30f2a27e06683ca329bb3f3fc31fceb3bedd447351ed5206e13dfc98b9cb6c5e8149f9f68414344457ba4b4c4d44e9ee34115246ab3f8fde424ab3156638dff758d46ab1def320cc87c9f208c2b52a311fd58fbe254a51b6de954d188fed7a51748b22a958a3b0995cfb2ae99776f76b7bd79bd8daeabe9d87ad782e672b88db2a401e5ee6e17a26331d7cccee316c24ca23d26112577726e1e8fc720fc9d38375434bc54479893358dc3fd8a9c01782c53658f873ab6a463dc84077bc0386c074a7808719b0a6aeb10121252b239324fe2e5840651bb0455b6372ca0fca12c0ae5dcdd39599d4c158c2a24b437610845dfe2e0d862e2fb690183bad3cd01911674b9a0216ba956396852f9bf933ac6556841c3176c1986ba60ad71600ef0aefcac24cfe1198b4a655691141a7295d554798903a2167ab200aa9255a5dca0e6f34695cfe494c51235dc37aa94bfc5cf52a54c017df9a3713ee6dcc34c0089ec7b173f19c1a01fcc847d7f0789ccd83ba1049e356f8d2caa82d1e8662fee9e42ed6721afda5ec6d6621759c57354334932358eced66d62f04ceae9494aea494adaacd07093faf5448d8f5f0d9f41435992925c924cf2656ee33f5fe639e06ccb82f2330c88d7f8710475f7a65165742eea8a89ec32c68ddfd76566d0dd37ba4f22e4b30ad59fa36cf72c26e8a24b884b4af98291c9224b39b7e3142f4a5ffce290bef042a3dde0c465b94189972049026102d78b87a0b659a11f3c0cc517143d70e47eecf0f463884691b27071c376ac87283f7aa0d22f3598bedb818b123f70f124898b222e88644e560a14fc00451625a0b0b1c5174034861f4cbc64b1b2c5052598c10b23340611cc28c2862349868890d245d00bc6e48a23267aa8c10937b870b265e5848d1c362755a6932b46d41083ca16329af45046154b4600ad8cc8a1862d9c2c4d275a6648835be3c9d720ade1c31a499464db94f2fbcd092911890b90e4d0050d11d42139422131411092232492248c7c3bd1450f3c62fc97ec6bbab0a10b192297837be164a50bead54572a252c3a74e3831c181484e2a40d26d80b1264d2b29945517c989e88a93d0c79c82bec6e586510d5f2667582abd6ddb11572cf1700597185ce1658502dad1b4a03990b08c2801b1024329054f74d645523aeaa2f484cb0d198390b52c880732284aa886a586d51a54d645c21234059619ea0e57dc50b5aeac51e3bb5eb22b5c5ca952c3974527e3c52f3896685b6cd1460e54a62ed2165bbc3428d3164b5f13eb226d31430d5f06850f3c280c9c6f73db3624af8efda0a1b6548464c5862512d490be7434649367023258b1841116b8518515b3a9c59c92c362469441f67591b048515350488f61007591b250523b20742a63e1b2b183ba485c60a9adba48589e505ea2f5076255a1df93967b42a129c812ed22095e0db8c4800ca718cc008d590465de57aa2c8b1abeb0d43076a5863a58d47093acd4709794fa8aba14e5072941c0c164082eb3b6629594686222a2c112364c31eb7fcfc1401bb5a32672606389a45987610414146cf183510f4766fd3b9e83001f9210c1c60f6500b1c3acc80e5b808e58e20444280165a6e354c3185996c2a082c40c8c230533681943056d04316b9a54d2fd4d879a1fc1adf1948c6c10b272021d6e886e94c11935e18414c7162c648894a6c0e0430de90d2328dae8e246b536b6d4624811d5dc20c288982528a129b424b4146c4c5368533011828b4a444accb0d1942062d2c38603955f53a1d2c9c9caa6e4f465db948cc4a841bca90d79d950464e92c68059f20453ab2d7112b2c1a9c6a4082e524e00a03545a2251eadd6049428eabe0a08215e4a484034692724209850422ac11257f7db89090b2e28a62f48d47d55152c9a142c54685c1cc124e50a50dd8f1f6706f5ba4ff354b7eef7e4bc6a484a4e75b7adb851c3ad754658d850c3ada2e9eef08d0da231a563c5de802a09654288b94bc5a0a771b6c674be63fbfaa0f6d374acbd1c4d688fe621cbb13eb6c696a2062ea2b82656b957bfd6ddbd53715f0c4156a38e2f14e5f16c9b2742918afaae93a897ed85208bbfa17e878e2ff253284f842231c7dec4efbe99bde10e22ea1754750cc5a00ac51149971b6ae874e898744ce6779d0e207c35756e9476d835fe7850c31d84a0ce09d3fa8e09dd8eb54036bea8b4b97dd57a6e81bb37303fb80367c5a8740d6b1ce02274cc3f867aff1f2f4a534b8537f62a7ca1b2e035823d37d08e45550b5c85d4c042a0757b5ab789430c317451a6e83a6e8eb5cb1c79934d75df87e454d1b0b95c4cb4888666ffe543755745036dd5ab5e45030d69dda902ca208561c51627a5373f4de522925d47bce005cb51a12157819eb4c072bf7ffbfd38307cf71ce06008b4fad3fa02ad0ee184d4540f5188dd4a68a0e108dde72319e8962fbbdbdbdbbb63c7f6eed8b1bd3b766cef8e1dbbdd39a023715f4a29a594524a29a594524a29a594524a29a594524a292567443a89fbdb717f7683a190d79cdb9cdb942fe3149af193b28a36d24922a86324f2244a9284061ad8089954e5934c9249dd547d28ce6eea26a0de50c8abeec72e28c4a51eef21ebd83a601bec5f20f9a51788361872d006f150b73532c89a3628f49dfd999f83e1f7c2dfbc11baca2043714253303b1e531e07050a07c5f3589ffac25853ccf455df6a512893820c457a205086c21e6c65e9f170c72a1a9b3f9dd0f82f247932ca1143610194a32618281f1d1dc9284f15708d840a2715a5547195fa988209b9a6ba9af23c9e546af53b1ec3b8d3405420fd18c41ec0fc0ae651cf791ed8c18021735e080192eb6ab4f9818d7fd75bdd7416f47e68914e9253a6337f9bdfab639d04f33bdd4092921ee03a302bef97e585f546528f8e21a197cc263dc524edf8e4ebf856a997f950effa541ff3753bbe9dc5080df5b09e584e492c27204f4ad819cc37d8f30101712f1f68fbd5c322385bdc6afbd58c84adfabbd0e3cb05d37a4cd6ff509005fac80f02a4fa2ef528eeb7f9b247101456a02d353d05f5e8c892645d117e2155a4a3b76271ad1edca471f8e5364bb1758aa1c97f7ddce7f8b69ff9e6bb6462bc9d96f976e68a79790e0709fdeb7798fdf5add6aa56ab0589a9b5daaceed462cc8ac5b57ebf5b312010d07c6eb5a22d10d6a08ffcd53659df938591207ff526c85f758fd6b79382dbb8938eacb61d8b32a0986f7d7b301256bfbdcf0ae67f627ef530a00feb27f8d37ad6af7e7eac97dbb726071269d1f49c90820bb49de7a26a8c6e6b6068e8f3f7c0de5ff694838358c8a3f9e4c3beed777cabd7f1b13e47cbe372b4643ab21328c8ee3299ceb6fddcb62732b95d0ad27a4abbf5336663fa302d100868f5f28158bfc539e97c1ff973fb613de13ae62ffaaef26041e697b01ee7339f5bfdfc067d5aac6f7d91996c3dfd64658f8510b8c23c7b41e4772708c1451dd3a1a04c5665647be39f2aa2cd032361be7c135adbb70827b80d2d48833d331f6e12d0ba0dcc8b3d800581f5bafc067db81fea36aee7bec88c7eb1729e23dfe5fa1999ede5ff3ca1ff13f31bb84e411ff91cf8c3b9c0ed89c4c8ed5b20110e5c10163faf5b8f137464558cbc2bd293d297e73c593d7f0735edfb9002e04356e2e0698e36f8909b76c042fee4ff379f83eff500f858bfc127f3345f8e877daedfb1d3dfb7b3ff76c6c1b733007c3bdbe0db59d3829222c8421c14d40b901fbe28ea539fc5e6bcdbac8f57b5b238add4772e05fdeedd04f9dc4fee2791eda5378d5aa8f3d18ef84bec8d3313bc44f41d9b089df330bfdfd338addf3fc1735253a7a38ef700d758c2ce76804040f25f0f349ff531dba68393bfbd8ffced05ca97e00f0b0c02eeb88de7f866be15645cab6fabcc6340d6acf5d18d351f798e6b6dfaa8ce822cc1526aeb838fac48e12494fab8c86dbc0a0df928dc5a6d1c5fd5984ae3c4ef7a76b67fff1552aff2e7d98ee7ec2c49e989b5fa22b7b3f8a3e6364a4c4e9cc44bfe2a7ee2a39e1d3ee252ad27f8e5394f5c32cffff1693ea49bb4e3c355caf161ecf5e132853a341ff7b00ff53bbe98d7f1c17c8e0f265f1f4cae3e989cf960f2bd19ecdbd98e6f673956dfce3a16f21c176835be50940163e0d787ed531ef21cd8823012b867bd09a8a72091f9a86781449ef8cc47a19e087d0e84ed8c462d5482b220332f7380bd89b21a11c036f1c354dd03ec4d9401657b133de749093b9b791ad379cf99cf7a58ff56992f6167ab127636030201c53cf740308ffa8e7f3d5883416891d956197082b0a6efc33dfd8979ee1bf4413d7d0afec03cea89fc0ef52d03939171bdac4752dd6a7c148474ce8c510f51aa30baa2d694cc9071c5e7258db3833ef73ef439f0e749ff06feb49e8230d9a0cf7c14f8c3fa19f3117942a48522c2026124d0473dac411fca7aee613eace79e05936090150804e46dcf4b3a164f4801f5adcf646e1387b8ab10f50bab221d3da58ddc6e71507f117a7eecf8d2ab8a1fcd2ba02928ffea439aa4fad3248dc3b3d77b2d64221d1fd2d7cc87cf72599dace36bfdeba33ff3c9bcf771cffa6011e683c54fc5ef7e67db078baffa9dad07eb9dd6f1edecf5ed6ce6db99f7ed0ce6db19abdb71ff1d06e90aa4344a4b1551595b885eb409d1fe6e13a2e1af26b037deda91aa2d0ab08d7f980a653a3a13d81bff555f41f977f41894398ed2d72b1693c974745a707dccb3c7c2ea63c0f5587081b09ef2e3370e0b25ec0c0848e65b0fc43dfd15086b30c87c7f1a58ffcc17993d913f5bbfbd4febb7cf11c66aeb43aae3ae77aeba7c77b9bbdce56eb3fa2eaa7ef06cce04b64af5a6135245d0d6d3dfbd89799867bd8b7bf93ff365b8ed4bd8d9f6331f7f9ee4007de8cf803f1c088bbffdcee8ffc880b0d87ad7c7a95a6fc2fc1648e4890febe5138101d7e7ce4c904f41222c70dd66052e088b60100f0402523d50ea81b89f0fd43d10ea81b6973b1d230a2bb8cdc7426ee3dc938a874ee03ae61e8bf00ba822cdada8ec76376f64f62d38a0492922882f3c78510326244a336c48b49048bc98456080a3062f6b08a1435119b30d8c2fc25071d92c4da84832c41834fc60c42c6ae9c2888700a3736666f6e6715575de4890b32073823f2fccb84f8773ee7e45d70208db02085d5b30a167fdec5512e48ce79cf3f75b8f9f146af0e7851983fe82774771a3f5c14f7bc36a4145abf2bb3a0cf42b77ef1e3f31b82570739c092919585fbe7cf97282c37c54cf7a16f8b302b9067a20278126c4201dcc47f5a922b3f9edf9a85e05aedb70adbad27a24f0ac035f6e1363309ffd592f32ebe21746237f8a5fe8b59ae77450123fb590dbb8c72667258f4bd53d1af991d73cc9979cc99bdcc99f222d0ac5a148148ba2513c52f21c37024376e2265eaa1eb9fb1b84b91b45a7d99e926e6b4237aad1697de87830eb7e4c45f3095b651ddbb654b7ec4f0586dc4a95877a0ff52a549702bf635b4ddd3877ff886a7fd26dcd4c8df27b1efba3b7f2bc95e7795e8c1ed45c8c91a317d99927a27cd97d3274efc5b8d3de8742752147845655a94ef56ddf815c4d656d144a96ea7a4058d5d9d1e042435ad725d0ed6c63b7effeda1b2e27f26f5050a2d4dc50734b71286ec80a4cb677a7b727a8cf23ddab55afe565e665def70f77a707a453a9ed795da89b0b1deb0d1c02021a9d36ae30a463fda896563afe8ebbedc07fbd69156c21fe10aea2f6c69f0748a4d1501b634f7e3c5bfbfb406fed41c065b3affa17e4f6c6ffe381c91a79b68301c10ca02a9fbf8b31825268dd66524197d81c39248dac1449292a4b29a57a9751439bca8f627ed10d0c617677fd9342a8b5d9ff8c7414d5501249a6988673ec5b54c518e35c304c41cae0b52e6394ee93dbda25bb7331babba33aba4a87466989518bdc76a03c623139a70bb4e67f6e520b17b5b80b1c2ad52b68710777631c7fe28ad135ea031d9d96d47b3ad6dd4316e5d602e5119373fe406bbe9b9ba4e1a28b2e2aeed4b2a43a0ea132c81b9372048bdaa4ecee82edeedeee1eb7fbbbbb7d3b450b5f6d06e5ef2d8e5813f116a74daa213fa9d1440d9bd640df497a49ed1ea22d31130b8e80a25c496249921733d0a8212761a935642ccf45ddddc58bba6aae7b76f3e8028e1500f1a5cb16235d6ac8436838a92113b1107b461c4438e0a0469391a1599f51439d336a50dbb11051e1624350193228cdda8c335c50fb5d1bd2d45447c38beaee6918a99ec695ea6afc50773d2040ed9ef378bada343492a8a94ffde6f1a48a844802d4342b283b0bda666b94b6d9da46954b453d0f0a27f46f5ac738a881821ac783c20ea2719719ea6c3171d4737a92ac540254097344c36f5a738c46a3c550a37deb39f40c1c6a8cdd85869476ece5ae7e71af1ad2a6b9cd264d19b989aad7a6c3b4a0dbe2a0fbdddd227477774ff7ee8f8e71dfc0515ea5a813590b066d88d5c240356aff0e0eca4b87c7e359cc98a1368d3106000719ce71854b12b57f068518b729073698509a428c256698452e6fb4d1a2a8a1262db5b3a8fd324c44a3d18ea82a9023b498811a477a8083064d4d3a97c7d3311e8f0b20d258a9614d8d3c7a6c31428a1a9fdb22831a9fbe60d0438dff3048a3c68f4151e3cb16898ca71a91caa0a246a4261f6afc96c7139562802105e3f1b801c688a336c756daa03559c3c8952eb32ec38cd91d4357c5e951439a1a2a1850c31e3586612516461b62d4b07411c3cb1850d4f82b1dca4fd09ea60c169ec71363184c3ea81ddf606a83a6c6a399f2789c4989234d357e8ccf05510603690035765f9ce85c25366abf44e1557342892867d8e083123256d0b90c548b52edda1f3f8831c6a1951b400b10b53b4614628c31f220451833d8a043adcb2cc2a0c61863ecbea021ad4d3e9c3820c1175bea222925f1a88bf4c59124aa5cb4fd2b463f49875ba24cbe1464737acb92832f61403063497567027da963cc811feaf6405a62d40da67f9b889340689a48dfe4d09b22120db908b63d176bc31f46e50f9bc6a5f2af51f977466b215ffa8d6bd0977c697d3491116dc2e66ca2c68995bf85e0efa2c66155fe56e2209890bc58a2e96661d72af750cd26871f3449716a9c70912a4fa15109b70c21a0a122881a27642a458d13f2f3937fe15bbaf892bf01d4a386beb4a4865188ca63d4301ae1475e7376e2a4229ce641dd43d5888b7034b03e54545058904e52e29e8fdc8697a4506ce297419256f9a9f22fe84bcee44dee146931280ac5a148148be251acc5a4a8149722932f7d0b71fcdc9782db3435607d746fb0f95bb72d757e94ced687ecc08e513be03c54a95d83edd85e757d74e059f02f6f5421bb650a1255d49d62c4c45477ca0abca8bed4383b0589262abf7f31c54993aaa3ee142746953d086c3f7fbd119a561decc0e42f35821d98208ceb04774b9d1dd82d75fbed1d84f96ea9f2db2d357e35dfb1ffa07160311edcb21e4b4b1090443459baade9ae507f0e86a1ea0dd22b5b53689c05615cc77a8514d6c70c1739136d155e0c89b0236cce6b6d160c4e724258ec048de9d55debc2862838b06e316a87d10bee476077bda8fdde02dd1bf928d8366538c42b093d7350486e4ebae5e6e211d73cfad7ab0963bda914a796c531a3b86d4a146a65565d73f7c655f85319b4c2b448e54a451366b05fb07b03f5ba3295ba81f6739ddfb0473dd34caf2d95d4171aeed20915681cdae4a505cc71ddddbbfba31d6b2b688c31a680504ae8ff827b25b6442223593b602f1d31395c30b06f3ef7af6ffb1c5fea633ed4c37caa77ed748c2bb28a39b698e794ac972c22ab9f93e564d7ef74049294f400203daeb96a51c962cdc87c25eccc050201713f674010d6abf799bf9a727b291304e6bb19f32dd6b35cae18f087f572671dfd78266141562c1870f5811b69fd022dd271a544e4798cbb6ff0eeeea12c490793ce0b009ffc0dbef934df8c8e1d395e3bedeeee31eeeeb2218edb4022dbcfe7362eba7b74cf11e38e80ee3cc7ef73abdd6240d9deb88c3d16d68b5e8e99079aef8a1cb771ef2365fe6746c605c698d6f7243ecc473f58ac51a7e7841454ee8e0a9f33a8344e164545ca148d08000000f314000020100a07440291582098a7db661f14800b778c4476563818c6b220c76114c5188310228400030c21c618234435ab2000024e96d34835ab083a08923c5b152f05e88029fda1c00fb839c154ca57892de080791ddc7bbfd4e955b5707a88dded0d0c715efec74ba217eb6d7c934de876f42a065d28ec49d35eba0a574d2b7cfbbe83a3fb9877ba74684c49ed6326c2829ccd3368ccdb7b1ee85f6603dd47ce5cba8159c60fe4b43800b7280de94050aa8cdde407ac3100aa9ec8ec0c06905f9e68f376352097cd6eae66f5e213673cc9d2148d52549fc51b0a275083e2025ee3ad973f393241e4241389fc0d34d42dc90e01f48a38d650ba275922fe146c1bccd96a6dec4c8b0e0019e87b0407526ba3d44da888c59ebc87d6e41570867fd5ff858eaf708a92f873806a3284e4adc0c49d07b6987f27fae8c99004407a9844b4c1f61f86fd899cbf4ad5cbfe67d6b4ca195849983d4a309082bf7cbaa8dc6c7b91a5b6713fbffdd9f9274dbaae684daaab0c5c2b00f5d10fbd378f9489ad0a9644b89b91ff30a2d6455a6ffa55bd159ba273751f5927f8e5f3230d81d571f3bf040030ef4cb8d81cf17b47dd602527f9d0c8e1b8efaaabdaae3e9ef25849e91e0601fd480424dfc4fa099464a1eb90cd128c356191cabc777468c3062b0aa85c09b058712b1def0b0c073bf09e449f64d95836efa71bb00ec56ddd4bdd215d9ab25780f0d268d21766b92a56e742cf7ab069970fa85e231a00c771537a6b172b3a83b6ed5306e5beb7cb7c110a7d785676d7d0338a1ba9a1df139931223029196d024e9e2106f22a7ca6b4ece9cf2d0fd550dda0d312800c5e0aa1a3e42dbff08bda121fcaa7a7ba465920357f48ecccbaac3a579e63996a702207533b2402c21482ee7add7575db2ff15204a8c596a1981c4312d9dc785e935ee7a37b67aded854c9d97b965824f82b7dfb77a386b99d04061e8677a516209657f9798bcde75427b1dfda15524a5a649e81cf0d5c964920e0bf83c41127e07853413bc49b3c6f82d9478bbe9b5d555689fe94f266c94f0faac8749a020eed29883a448e4b52eb4a82862f3d337c2119020c8b220f34b1a1b0516afbcd9255568309472205db411949b5b3474db31fa2b086d9561084df5a6d4d8cca38636939cbe7cb1dc9aac8ddab454fa95566c9b31d6647b8058b07ad24a609830196cdf590fc93985b6e0bab9063b64326854261fe58e09c5bfde3be5f4fcf38199488f9ee03ab3172574d44396234dda0f29797a82a94b000f9ab886cd810af78fd628545e44c424e1e01e1982d7be914aa26661336fa08e5f781ae1023497acdb0d8f95d96e4032b66a5014775111d2e800af7bbc6dd4edd25279cefe56489bdef032229364f40833821b2dd96bf5f919e2184a958324684cc91b282c50b8505ff208abbd4d1d3e7be82c80320e82d1ed899aaf48ece60a93c04620106ae548559f4088cea6032791a7c9288e2a262b63804094557fb3bdbe01e46a2d45a1c3da0030e7a4f866179d9b415fb5a2cbaa147086a86602ca81f246e080dccfe3d688255b0793dad748906690537ea803859b8c1c2967fd90ed134353f6b475fe1705f3eb55463eea0cca48ce000f4cf48199846be311ef04dd0dbf9c4e9e0fbe6d2b706bb03802b43e95d98eb55e45c7108eba319547418c1899d43939cd1308bb9dc912117f2e4f9a25244633bc663d5963d6ed17cd891d21cac4c4da8ef601a8b0e70d683519f12c84b4caf833dbcc45a34cef0edc8aaef88d600a0da756ec820a5730f3d748d23de0db701c0ddcd97da4e553584534ed5238f72a45d832f0422da403e8a1f75825c57e531f48ca9ceff1de2253a2094839c3ae0967c2664b0242b827ee92c7175c17b6be18ff2342c4fcd3debd1d43272ad33b0233e4e3f9c4a8b5788e861a5ac8cdc5288994c47815763c150f02f7e0b2566ef7e38056026d7559b91c84fb0e14f07f8e350532d2ec9151355b8e960cdee6b105741eb7a6e19345e9970204f8c432041f31de1688e6393117390f6f8f3c229ddf210531b20ff907e798b35ea719854eee09944661d8eae3b447e9494776c9850ef6e6c77be62715ef432f16e4ed5fd3087da60d7d6c08cd89fdc1d3e77660a9c2dc1ee2988ec33ceed47fbc2e664a3d27897d0c8ab89b148fb427f7ad28f390009fb5d32aa3dff1fb91114924c34967ba753b2239ef9be16a41b5a85829890eaa96e7df2ca66ddf411060228a15a4ff0066500e440065582c0f480a453ee23a6c01d5c2b7c4079509742e4504e6b8ca65dfbe4e69cbd745811167770d2c8314d755eddc6bfa5e75f340431c24c6b92461b461ffed8c444158f206a8b895a71846de40a2683f689262e5edf73b64ebdfe0e18533b981925c19c27559deb8b57ee43151ef3202414bc48bd80ec91e86d9a2b06b353d9bddab7bd9388ac081e638803f201576c49ef1064c5ad336f658dabe84521bf00136faf28f639f31d2cb32e3122aca3652917578607be50b1794036f06cb8089bbf66ece029e0e89eefcb4363a0846496061c05aac440f62d292b343252b365786632cde428aa260c5eb488b583560004fb020b2bc270bf27c34f2347ef818199ecffef15c429e8fc559c00579deb36c4c2a05f23cfc016f90c844a5cbe6e2212c8f7d2dc2deffd36692219d964ac052a8fd39a2c61a5c6e0c1e24aa89820459d300da7865f34a903282fea9e4283448bfa92b563d6336d823180e281548763e05498000d58dac71c3f334c3827126217d126cda8d6f52d8e5654ff01066c5a81fe39db3802c1e6c8d1f444231d780be5297455a7d1c93209ab2038c2ae0a4aa875ade8cd1159b704c98a0a57cc832d57d5b748f163f40de9f729ad1e60397b96086fd4328702e97d0a339a145faa20c4052ef8466cda0dafbde33b913f7fd7d053501d822aa57e74cbaca8b1172806545e13e72812886a5b679bdd8d40b331760dbd73d63ef8520761004c6ab36a4445da9dec0ed6c150a8635eda6ac06d4f67c2357bbf9532f797e6634e9a1e6e82ad7e02e3e68e2cee30421595513c9445f34632c4e61d3e18519a68e15ca9408f4963ff6918b80032eb2707f5346f1a9e5d089d854d68e11e374dc7adf47da14fcff23f73310d8beed66f17b13f9e1291fb5d8d1abe9fdc801b02ecc2027844bdfaa0c3bf3cb40b0f9f5714d7b5be1ee3852df731691da354a95b83ba94171afeb4bf39785c4721f9e7b85b1151c6a6783be8d1c58a1bdffee6045754ad0d946c211631c109e0f3abcc948c08f1cdcb3be26ea467f0d1875a5b93f2dedb41023802264098c8b65ec43158ca6a99ded17ce2c812d3ad79faa7f4aed7a9c001331b1d1d8f6370b4c6140c5a061a2313d38cd9ef80929c44c64c75bcbdae59df36a6cb28fe19dc607b8b5611cd63074ea72109d25a027a2320c8dc6dc8f5cba989b2b541c4230808029d3dd3f949526698f51b04fe0a92d8a02865e47d2615cbcea0073e870e203402b991b9baf54c36557e4a45a0f271e04d848b80e1aeadc70edc29b912b0183a9cbce6d28e3b5d58930a84a400351e63454045a738eeb7d118b0101a97c1332d7ff171b41dbab2db96ac1c0bf56294b8ba90059020dbb9a28406d503b5af29765d233a9d2752aca417017c555ac3ba512d8c6e606fc6192a10a19eddf02e5d78b45bf8538f613ddef657478265d7f5fef5776e7ebb3bb118970d799fb2f6bba5f4663d3dbb49b4da24f6e24effed6127904ed2527a5a0bbb1c4753359063f616410b72b07d6cd0b9b13affd83aaccd2c120a407aa31b00f9efd04952877f8f6552f3064daed77f437acf524dacefec94ffda22b69778a2863fdc74530b61a107f690da111c8597b2e0e019d4376065a1fb7e8576bfcd33eacd3cd4db38ea1f6ebbfc5265fa9b227d4c7396c07771ae5bcb02fb434560d2c4b100f0858a1d22e94d3ebec5a820c62d9e36ee38f820799182f18db2d11f32e69f56c2eb3086dd3b5f526228caf8c6bae38d4a9de623b579aa47683436687c0df91dc9d1e2c75bb0c59ada332792f9e2be89dbbf5b72e3d479c8c0c719a327e08645f80062897a2e82885a9cdea4b7b9cc00675f320dbf312ffc4c9bcf3de1a89865418509f7fb9fb384def6e8b749bf4a2d83ecdb4a751f9a4813b1c280be2c39e7eb34b938b5e6b5d9a9d27d4c520d01fe29ebafc421ecd1652a477d18c9ede12900025c255a35885272bc0031e2ac5469842c491c34e218cd82d3a206fa8e67cde377fcd2f10fea917bc7d6c22674a1f1699af39226f9a3b2b6e32e0dfd33e1c03e7138fa2ed695e71186ddc66e011b3d680045237881a4eef907d4fff233fe31a44716a7f8525b657588bd14dc278b6437fcfcabc44451b8ec8656634f810bacb308060e75346d66d0f2b5aef52c3914c2bbe48514f06be6072871292b0332c14f9cf5a1404221b45aa637cbaa7462249ee0add36aa573751ff882c916c4704aedd1f0a3d4103f586762e7c0a183640a0d1fdacc3920b294f317274e64d44d06d302d6f80caf018565a7a0366abfa96ed4393273f7044fb16d746d17541da9969f70898298cae54626660ba7e81fbccfef92f8fc9014446b3ea009d429c13a19b1d53a7e39961523b1cbd4fb9364a3c6006e9c4b6a71aeeae9b3ee607352631c9c0f588585a0664309923aa75be521b50f3d2201eb76c0e38b36adeec3f51a001a7184073156f5931e73b9eb42b468e629b8f26cce07ea7a08bb445046f1dd0485b4aea68218f1e14f5b454052950444cbbca928b0c16822a867ddf3048c9efd7c65a9087100fccded140e45b1ce0ce7fb0598e8a11ca24ad6fbf6a9cbdf0edaa46244b96ef243db47439066a5aaea5e694b7493ea952cae9d91217509e1b5d2c65fe0584ec71905b69760230a8ac2e1ba9ada58df7abe45a6fe29f33e486cc72d6636eac2d743a061cf4b1fde1c2718081902932d30b647b5a662bbca57335bed668984e98f45a5d80261c6f4d8ab78faa8984b422618bdf595e705f344e14bea366b89f9b02aea78a836a7463bfffa5f7ce029d6fa7e13d0540f6c474146aa621254115f0988cbf6288f1a44ed02f44c0340d8547280b9860e10c62103a3e899b018052b98e6737af7296883658441c8c105ff04ed1e440e6bafcdf0fdee2c4eaae06db67e35ad728607a1d3451a2426e193631fabe6504738a752a7c6b73188f58cbd21b7ea39a511b61495bc8d7f357d9e3bb362157343812e7c53fc8feee020f6ab484c9b12b684ff1cdf9cfad89d50eb82539c55d7f53d7b8a88086db4812a36ab5fd723d27ea70fd71a1ff0bad58a01e8f8b85a304463adb512b4f3971950e74d192774ced8c7503041786016afd141b3e6535c2bd8d978c9151e59b48ab7b4d607c1918c19004937f617454d8dad7ed266bcaef72b52a00c6c6d38eaa74047931f93942d65b0a19c0b4e47fb482122933ed3dc81ec0902541010736184dc76644ae5d343e4707564ad975db78e7708d739f19ea7e4ac1bed733d9d1d4d6a42153859abb5d43e0ff1ec5836ba68af604153821e6b59f837fd95b30d0388bcd06f0c0ad11b1aa9302324ce0a2a8ffff36a037b4b13e19ab0158b6e42527fb9362cb195190c643d4e1f82a7d448539e481a679838ef9ec8660890c4fe28dfcd2805ed69354a891a8fea882ce2be5647501248fb5565255df570a88ca5f836bfdc0e1b3570b67a0c26130c96ea1733cf072d81e604ff21c033ae95fec5a0795920e2496a03c437c3223e27acc920843f409fd688516c1b9c0a8495051a9ae1a439097db2845083020dc336e0fd32ae7b1387d284f64a8eb5cc1f45eb825ffd2c6ac6896647f247eaccc92358393a14408264eb16efb10f23388699aed9b3fed8fa3e64d1b26fe20fe530c7c9c39156ef22de65991e7dd3bb6c52a337cdd922089810608392e63eae78b276ec14676787f632004762f4392941644ec2cf6587c9e92d2a27a3fd5f6e451b70b4c5cccb67f86d8bd9415a98904799ef8e5e774d3ccc49373e87c0fd51b57f1b84b60fa4b60e3b27856bb3c65bf56feae03c09d4b1d046944bd669a659aebfd54e2d5bf2c305522781cb4e8ba2a7623222f003eed302723bf37e204a82ffa6148dc23555087f9176e6e9956b0947a222fe5a555d60557bbe553e6ff108f226c90312cc0620f18f9e98de25c88dc40991556f3c1ed16807f7d368a3635611fff559326f8b8c5ccfc435c675cdfaa00a16b64850d81643ff98d1cfb69f180c8a05d6ca6d4fa2a3dfed4500a0b811135283d6210ecc3fe983712978d1e0f41777174aa162be7379b9b14cd0e12d00a522f272ae264f989d6ad487ce29fc85c79dd0d8e90bc5d3bfa3656cb88154726d4153370b04a61174d50c1a493d0b24ddb8b2e5675c6e0119e705dd48ae24a042bfe5636a23d0d6abc108a1f336ef063163f76b0fde44928db10f440820d1cc517e93328b652214b4bbb2b7de2de0cb0858ecd111294dba9d5a7b601ed631ddb8440a7f7de05b2c2089ff6c3d66c3710321e88e0df65a297e5c4ead8eaa3e54c50d9dc4343627d8729ed40ca75551827b25088264b081c5286580ab1e9268c6da03562883a6522a45fde5b10194d477ffaef0ae6fa17d2f49328be6b47d2a1f32232e99bea53fa75203db7de6b16281ce2876371073c9db6fa96efaa20436e402a8ab07e5471aa2c72a73f98924471ccb3af181ba37b269590b936032e5d1bd2eee88777f766ffca360e7596ede02760ad83bf68d3baff498f31282adc9f450e3bee06ac4e189543c68819d5f37665678ef2f560298a0ade895f8cf2225beee247fd206c297ce1215f43eb08c0b71cb66d08c7dbe7a2688d8dca3b6fc94cd6ffb1a6ec947fc15406f1a33b441cb5d65a1d6f8c94e895f63e2af0cc61bfc401dca9f7c2bf1fb7e1bee8df9be1513502ebcec60c2657c3dac96ed826d1cdad020450f6c383debc7250276ac1a32bfb39289c12885c640fafa71954275616813596990c4cc201b1a2585f05cc2d002ada4da4f042b1a085ae63471bbd47a970c221065d4c64d12f1237c25ad964ce1b87001126003b4fba6006ea090ed0a3904d824ab0ce3b0975fe9385247066f5425010cd369786b8805944b43e84566a10fc1eaf1f5db60dfd6447c7a039b984415ee21c42a1431c4e219ef350a87183a4c5bc80f40b5bedd6a70f9b038ba94a5a3cb6ce6c7865b556ae03bbb45adf667dff41156640ed3ec3af5e8311d2a370607be52ec88165a622b6c2d548ad40f7f89710196a663ffbfb0246c72e91e804239815ea76665c7e04e61133a27362986046a8c2795b2a071e77b4804a9b38a5b029487cb69424dc25e0a1fc568e10d9573ce60435f4961240e1d34d4183f3d202d9fb31caa4122184452a6669aa86616053a7adb2aee13da7b1649e74bfb638e9082fabab48cda0b33602846ba0fd32a3aac8dafdde20fc3c22d54d658940e20c3ccb3ae3752220c5dfb522d930f0fc5bc301e6c3e9bb046089d9a6c65594c4a55e095842d0f2a8c0f173dcb2d60ded5ca64fdd538acd785d415a69b276a9370fd95b90e6193a0e4d80b2ed80dab2c3521acdf129ee37f48ac5d5ef9d62692bf681d8e1b8b58dfaef0bac01ccb9e0ac940c816250d60bc31b2f709b78ebecdc252f8d21cb289e7894ef6a20eb30412c85e7555ea2b985e74568c052322d6bb9fa512deffd00a9ad9a87eb9ca74474eca7f81952c435ce2fb25e4dce1c7228856d663a82ab21443c7298e4d4e8fd7315ef449c68186468223dd63c57cf207a07135ff08d7a409c8ab6173b68a0dfc3f761bcea01ab147f93ad3dc48b6414345d3d952cdaff6b739de7d28c6137ba315397ebddaac77a4f38a7d59c5f42bb0d086eade67872ffb51c14040bff60f6b0fa28296078d839dd1c77c73326c78d05a014deceaf002b879613f4b0e77a2740e209af5cfbc4b29a608e95db1306de9ca07a4eba5bfcc436ea6f9bdcf90ed4862c4018e9c297a20bf5e82eedc0b5dcc2fac185659c7d850140d324606fa613a0e90481601bec93f7485da1277aa089892b2612ea80131647c89dab06dde0c4bc022628402bf834a88db4c60f584f28d110860185053c0acb4375ea8c0a95a64305174087a5b7b395a5c3552fde33935856dda4438485be90ec63e1e9279aa626f64ad6f1ec10df007b94fe3e7d52b0877f1205e67816e9ca5952380f8ec49cfd60a4cdc90a092556a25ee1f20d312b833e6611f7693c087c1e0c35d209377538c5f6bf0a065958776a5544f71e34862a5614705eb4027f72218a6bf2de4315efb0e8d87fa7e6508423ca616663bf71406ada8ea339b3ec774728f99748bea1d3773aaebeb5da901ccf0160b465643e7005f582bbe7a5a11fb6f6be8533670d74da448ebbff7a4ea7893adb69f848c3308c07275d2321f7a658a673b06a406f9d8ee315f8c14e4b58c19745ce209ca0ad7e1301bacd182bd14c4920c74b4a8e1aaa8f0d9b53ac57649b5e32b825057e2171f371237d1bb07d64d1c079a23f64e9b2523ae45020b322cb9312f7c21feb25ced51a09fc1ec1557942d21550d0249b496690d19e722554336ce3e2787be2ff04fc03cc6a7faa38f07a440c316650b6b478a6e283a9de8507897f3a724aaaaae19ea2e7722c669fa2103a3a45a86f6df0f5419445638fb8871f0dd007190a928016bab0a65ec50c555062e2693c3aebd14dac340d7f808ece24631312425de022afec3a074821f30ff19f3a5435501778c5b707d07efc830593e50f4ace158e2edd655afbd06c27e250b0df72899c2d80455c07c586139d106b26b2a9bfa996c3d65ca1ca5fcafe04243f1bfe02f080071654b6e8774f40096a892d95b6b43aa2bcc004c1dcc3c741fa49775b27b918314f0ed8edf557e267996a72e0be1de6b972e5a88e39cd0754ff958fd48d292313ae4df5d0b8934fa41fc60f7d16cd94c4e701c50e06e43ce88fd1054a75f8f7e04d076e5c6de51c4add013012c20a093bf8d25bb1d080058535964b659fc1074f7c432d7c36c98056fa98c1bc43ff8996b8cc7a014e79f825df1686af22902e5a020d60b8efcfb4f13e92787ce5ff1174b4c1ee87ace8b407b7344b3f8bef1e7ec5d45fa0efd9379b806cc69b0e38edf03d31d64805495dafa283aa415077eda63fe98d039089ab61031746d4ef6628fe98e25f9c3f9143391de0918c91b1886fddb6e64cd27a181005d52d62bd2db142599a66e0aa2ccd471a068071fdc13955e9cc95758a94b44a95f4b192862cd21337661f933f0586c0ef0dbf73776cdf2ef86f1c2a2860d51dab805385cb2359b2e08c811a302dbd342a84403b93f02640ede77368da2d249436ae37c73f3501b31db31f3030dadc78f44975d897a74362b3930e6e56d162c06a5860d554e000d807a208466d17879910cbe21c008917890dc9de80c04a33973ed8c4d0c76bf2743b5bdffa807d455a02c12497874823696523d2f1f33baa562d9f0e9f29a3da3b571d3b8042eebbbecfc39abc0733356bd5b0823a9f12a4ee8e0a7adf5f6daa204e77ab2394dc7662a610c9658d23e93193b5aa8add3a048440b339edd96cd9241032ffa6fa928c997985f05394896f46b137daa6640940ddf3157a70350f5b9fffd5debb1096857013c2c1e5659d628a9f24448196ecb3f31f1dee847f9fc563ae706d160b71a679e0d25fac334fda1b3db56bd0353c6a0a6ee35f43411184efe508cff4c09ff87773382080a0ca4d5cff15463350dbdbcf4e05a0af92203c315267868e8c44777607550e447fa02f64e5a633c00f83357f00ce160414ba8bac32874604142b50eedc906b35d6ee05923fc788f6c9221c2dbccfa35dc01ed847fbad53a62e45930276e5f6423b08a0c6cf024f76d5ea9425076f582a41a35a21656ac016ad474426f188d3ea73f3d022441a03c81c864f606210545a27f13497ea18133f8545540d22401b9d85b58c3c5480f938b86159b763eb023f34f944d958680c874ac5335d8cfc5df050d438dc6f454ea6d0998c6f34f21d69fbb07143cd3edf74067d8c0fc928adcedc69c3ef8975d983b9952051bad3ec8188491be151b25293b93d06f513e9ff3243cc557c7c48933ab192229651b00747cafb9cca0ee57341579949790f1879eef92274cfa56934a51898bbf0757628b01584443a73856e5216b605d532f8838ab77c9545e445bade2638b5d0178587d0683b926f53712ca840dcc0265ec7cdc14ff4ac3c1f5c3d2dc21369bb9a396b3d8d22a222c217c815402f9ad3c5057af02e89874ea10d861a179f2d6991227bed874ef76d0ef2bd1650aa3e6137783b937f986482afec61b0f3d08bf906ea0063f6514d6189eee0abf6f5b0308056d7ca17d28331889eb80b4a35da2680ff251f709c9ef84619d9fa6782e283659b5a9062804abe5c5919206c384850bf1714a627ced92bc7acf366284d94916bcfe8551878fea48ddeade1e07938daf3853a577e9a9c58fe7508e54467fdc2a74ac198bc62079b7bcc24c111f0e94773e5fb06387c94a0bd45191b74f364aed81c99d4d1298021e7eedf1151b64a03eb931b5a4ac6329c1f457dce06efcd0ccf2ca084a6bf7ae306cb474a9701958bb30b969f52b1e4a2c7bab874d5cbabc060b8dc3779a9c78d47d543c20862998d017e363edbc72e64ced2af291ebdcbb94735b0b832307ea5af2e0d6134236057ca0b1127346a9f547855c9219b32977538dd11930d074c385ae5c413f399dd34a0d99dbbe2024c677620b6dc1f7d5b0cf33578f1be8fc8cfeae641136db45527847dee4736a80d4a4b747f0c75185eb16b28a6f20ad0c0cb2e8131685618e252ca5f022dfd202ffdfc2ceabdf8c4967de5b5bd337ef169d2c404fd7b765f2cfd02cd512a31ab5f23962cbd7cff4c069cf30b855dbc2a4eaf1fede6efcb3cb8398957051c0ab7ba69d9e23c890e7a0941cf50e70c4c1a9efd21560e93dbdaaba5451c8e276c160ddde1a8d1bb9d0256a8b00ce4e1d0a9069aadd81cafd5b6f195fe8431dfb294353a532e960fdd200ffcb7ed7c8ebd60ca6dc75f23b750ca006324d78c3cdd5f8c1b993b8d44b1bdfa33f374314223f284d5e3f592dba428a995c5f04718a6913296cc10edda730f948fc8f8e3fcb7211ade30d9f0f9b6038e1d038c6359ce759e3b42391b5699f49244f3565b188544d7b9c63741bf3a7394d4e0fd148d43c83b05b2c3e285fa5763bbc9ce180e810b957261d1074fa642d3ac1d633519a6bbf758fd2e3a0b79a0131a36b9c7041a94115a5f632351de986ecc479ca094e43eed0fb9d6f29cea9fe5578f5ebd00daffd85dd196b0afe8a046889345e34b9de7c01c15f5ca8c62bb862229e051ca80c6ca11cdf3930c032b869e4b57381564dcfd36b037e59f2d5089fe32f5574ec11a3c558cd5511b14e6970d7e062a27913798d41407c3bc83b775f30e4730283dc94970bf8dae6272b9c296e2e7f06b2705a18b2cc8a1f8069a78f2dd1d5ba6012d9fccd426920a08a63a9febf1f535e7f371d5f9ee3b9f81e9ca626ca5f6dc2598b172668b274e979e94360cc88c4962f36501cca2f29ffbe7f7795779b47a886d3b7b7afe8619c531bc265484984c0d96286a8e42878a3e2d348b1cbfcc517938c11fc530f3b54d6d88b2e4c901221b8d58270862d96b157926cadbd04b932c5e0d661a6837319fd34282a8053c1b39674f46f9673899da66749051bf61b3d3bc0179612aac65dc091a7a6e7303bcdbea445393b3dab159bd00c68cca743bdf564580667cefc3ea197c93d4e2ed288755b6ca6f83fadd40262827f75eccaddfd97464a38d98e13a6b5251d05c4ad040f341cb193d5fdae97f8adfbfa57555d07c626387e67e37f7abd4c43e77360bbb12b4ce6689e5c798ea6b76b84e0c2a8277f14b74eac6d97fd60266b6cef33f8c699c1b8692ff82216980fc8aabd995863fc50c8fe73e0b8023285a4b4e5138a2476a1ae09128c3445511a61599151bded225810e2656808fc33370d32a3bb0dadc59b0ccf4b823d53abd5ca8e4515581342cfe997c8fd3f541104fdaeefdde9af33142625e1e95ce1cc9140c65b3102b9143d926a561653e6c4b0cc30d15055a1adb25128f1062a5d142f59645710c1556927534b6be14816707c039267fc44aeb89563ab7b2d948892b076786452f70313867c5927b980aaa050ea4857d7a924bbe4a278b9d268ecd18d1ccf36e1ddfb2ddd9bac6870e62d68fb295d6cbbffffb67e4a24fdab98349382b5e444176c21bc06b5c846545b28d646a634259f0823441f8838140e073845f03c80426e5141f98ab79c1707f82c70a978a0e2b151b599f4e44d2552905f1d1e88ddfe2e3db3254a2fb1bf216954e320b8a80e8591a2332ef3c554c003dd6602444d6e53ec2d847cb4ebbf2547f2b3b92dab29c3d50dfdd9a315f9945161a6fb1cdce8ef4d5974552ad750a9e95eb9fb9d925380cd9343a97f0d445bbf874e461f17b2d1590d1ad474851431678580464a1f22d9d94a9360f6f607de818bc78da4401a62ea364ff6b7034704780e9923534177b76b5c086634cd27f0ba46b8b8ebbcee6769dc7f4d3dbc5770da3acc47107948cb7f02502031ed82e9d69c735acfc76f016f8bc7a494d5a19206263fc866729357d4b42d4bafdfa568503780809f172825e92494fc77137ab32662b93a5e448139838fbbfd5f9bcc36e15aba0126fb764b92447db523aac391cbb915b5de041a9e1473672e56476c5c667e61f66398a5b80e546fde9b6b41819ba49b528e7b05e3dbffc85f78920d43ea8847bcdac3fc154115dacce2b21fb9e311ee8bfde35cfd692d80258b6cf40c008082ce8b1bdc3f405ebbb78b48e3236ee88fbc86b82c7c2fdac40f1eafc176e7a0ae3e6708e355e4e2458283766dd122520a843b3677c1e3b1510d6c0cbe3bb4792d00a7fc6ac4912bd9242e4126d59aac319ae7a574b71014d5380e035fb41e5e92c2eeb85c957f7271954961008f735882fb57c35891395dfc117d021f3d9341d5e2126356181e0d9417aba167ec9f0a0cbe5daae56cf2491b9f636f691ae18005fc621165d571a98a2b9c855b78effc1a5e8d0792fcd5faebb49258e68b9699e6d57cdb9bcec99118374e2b00d891da863210cea1deb0674540d8d0711ecb5832a28a13e9d543e83799e0e22aa568baba5416d78ea8817bcfb83045b97d4414454a46ca20516d066f6ae4cabeb7f4c2cad0c1f5293267e2a502c7946d43a0ca782404639c9461699a17e376099f3d6a05123e782ab9957478722699e8c5e4e301550281bcd823a0d8a752faddf7cf739202996a4f9f8c3322677ca6f514ff484a32854325a59e99f5a15366a6582b3f1ff7de0a34459ab555c482ec96c849dad34ce8b4e27aeacd9cd49ecfc4c91694f33d7d4d03dd45224bff23d245b8644aa5ee895236fafa63d55bc63d95485bc4f00da49713673623ba8a110e2228137448e99959a4e939b2a5cc34d5d6b2048636c47907f1257ced3979cf74037c12dd04824f7fbb653a0ee498b00917f4c4336382cbc5d1176a66a6368949d6db123d59b9921b5982fefc344884e8efee01d1ddaeee416e5a7f9b0849c2ddc57fe02480635603c38de6ba1ec88932415ae0da9a79c7c2b58ebd551524b13d51e0fec09513fb4d17c3fb608dbd581026478bd027b9e85fa378d8f27b549cd920aa6190c2acff50f2062d692b00816a8eb3dd4da3f6395115c9345a1ee194957aa686f17ef84187daf34c747803999349f52a37147eb4edf3276d3d48a3c9871d019fa2f3a4da74e0d3b1b0d50b411379c723d9f336870bc1d381e69c9f205c6b24290cac56758c6b47ad4413ab897928c249700e1986bb662a6e9281cd015f291f5ff08f39561c1aa7440c6395ac6a8a2a18ad55949931ef3392b7c3cc38f40cf9613a49d9441d9fb89195f230d03f14c9b25cacbe09190657f8def68a1d1131c12bef9636c4499bd7b526bf783dc112168474812b2023699c5e40a5ca90f549c224f5226150ecaaa438049a32dff4ffa508448ae6dc201e1b69d802aea263f2cbff08af3f070a37a0473a7b5b14e2f4b1304caa271c1f472a392efe636a412a8ac9f9ec1bf28f8c0d4674806b88b2cd7c1026112d3b37995887b5cecd0760336189e646e31c2255aa7da83fe8e27ba2690c5b464e64d2b1836f1cb47db4cf400d87e1400ad392685aff6422826399612133125b3201d028881e082d23325a1c2f797325f0343e1d849f1aba7e9c4ea2e2405344f6358dafe564d1aebd4392b0ddc29a663c10f7ed12accb1a06303e726591d2d46433bcbf1d0fff45951e465dccddcb6048a70445e20215dda28a31ba899ace7a48b64248dbce246c384c125a76cbb05509cbefdd2333c4df6a18bff0d75625930c2107b7937a75a8ac088c40cfe8c31081123cad03e814065fe0265b6df9bb84daf3f904ae2455a2b1c3fac61433efcd59964231e1f91b21313f8745e553d0068ea552ffc041076201d0c2582ef10bc2e4f0a10a588ca32feee6f29ad95c256fe748e32d48cef4f970c6612b31f70b4e2e4a925b301707ff226d52b2b09d24966f1ba2ba8ba94cc4c1e695c6c7e7bd9d2a96b1f45c7c15646db29b5d4116ee96ed4134dff9f0338d990adb44a30b68c9893b6b58292947db61a5e7fac701f9965e1a0f26684d6195624f230b55690a4e2a662dc4be8554f68b3c454bcff304063b780e4b2877de615c55482c126e19595157e34468c44627ab701a8ca0d18301ccc2fcc6639206864458885c092bc646c4950a896976f19fd550163a626558025bb2d24d97a25f6305dc312958948ee3e77eccb68e83d2376f80810655a86da9db843b9fad261dd3ec65482066dad0b861d99e458e22363a9b2c1804910405bcee94607faf9cc5a0a3db8254a873215b8aa1bd7091826c19718b227c3fdf6be235dacba4a34ad09239480b70644f61f14244ef64bb44365c3a3eb099e84a9d86b90740db7e8fa375194e399388c2288879e6682926332c6e04414e1333b2c10a5fafe323358f2b08dd187f2adf7e342976eb8446b4bb11c43e21fe3f6fbc0acb6ad4564a47c7732a22a6931eef1df280c825bad28c037f4f5bbcee6101beea325a14e91ab14600c5127e4a9f009f072b3ae6ffee1525c6c6e393a37a2ae3358477e09b33b982e96b9878851d94a1e6f0d7790bd0cf2530d141f6b2f83822a06932ae95c06a8a93558d00cfced4966d7f40f7d47959b182030dfd7e1ca9b01e0f418eaf5aed01ca99a7cc4d5d49bb59c8959230031d5cf51b541617653680f0a4a4369d2b5811c7cc0dc96cf2d5e1cc207c48381cc9023d4c620518bc8c1f75656448246acd0dd8fe6ad9218bf96183834dc9728849ce249633070b0d7e28bc95a6b0948fb2ca33728b5cb5f3e09fa3112e4d0a5053604ac7c7470e09d4ddde54db07253ca50630e2d92efffbddd58792febff184dbb3742ca640d72cfc6636da11118269a7bb8da90a3015cd5b52ed3c887eb5305827b77e6134761c99ee6e2143c1368fa5fe03ec45f5e9442c92a50449a41c161101ecf96fae2bdd68d6acfd88fdb19be9821bb93f2cb2356cc8c1cee62baedb86d198a2f834e83ccf743906db231a41ed9d624c5971e272135ea481f53f106e2e69ec381debc2e73324f1382b51d70c81013257361e29b164e93c8b247b952eee2453b241375795d770ec5f78c7c530e6a62d11b843fc59e4157a27c02f09cbff5568e594101a0afc7aeb4d19ca3c1408601cf5151bae7d56bc8b27c6db2df84d8205917e9c211a516b530761779fb823687c30bef17c513807569742868a4121e7e759922404aa3784ebaa40d2213e55605a253eea27018a970523bbb5d9060137dc216f300206c36176c519e1233a811bd24208fd9332aadc8ab25fd239bb56419c32817e9bac06b55bb51e51fafdfbec6afc92c71dd32d2b183a9c11405b14b2ef85b2a60cbb33bf6f3833508f1e0ca3665981966f953b1fcccae0410038afd588c2cd6e328dd95c0a480bf05040adb753dde7efedfecfdacbbf77ebf47462f2e8f0ebd7a5da99eb58a3639fda68f8c17497fe08614ca352f4088293f4637d995549f8eee9f5e9cc64da849e225a5cfd414262e6dcc4be194539968548a1138a266fd524b8fd8cf3a31dc4c7acef4b781a2dc8fbfd40db5d115afa7d4bbef2345968a64e26e2f00454fae0ec646b6eabed234f7cda503bf9355d282939f0a0b26cd15ea0ad460a7a5bdeabb9a2d0efc344abdaf105d7e34d3b4ac606a89ffbb65b3a6e34a95c374a293c6be73d472257377f81e7396023e757b2f5a67aa7766886f75bbb1a68eeda78b0b68d5d2b9d62cac863b861014bcad2622e87335e3ba2c5c987bca1c530d7b3ade2a0440677874572370f6a3310ae0734edbd7fba78c3b46d534bf733c526ff5929cc43be449e817971eb83f733dbcfde2b92f888497e4462d6601059f5abbdf9d8ecce04ab51feabfdf59c54773c08625caf6beb568f9743379187bcc92ad5127dcd2773f09ccce2e810f9fdf330f1332b24a328a8caf13c265e1dfdcbf4e173f74c31c30a8b31aceda9e6f021bc35fc1d7ee04f6f1a83a4b0c03ed957ca9474ca0c66192e4cb214b0856dfe544a0c133d10eba5480328e036d4dde97fed26fe54286b3f4e2860d724c51e711dcbb9f9bdcec7a9b638ad95c7c8be9622fa31259ce92740a19612ae4e511a3a9d89101ff3e1199c7c77ca9bf686a6b98f2d94119b038385814086a027eb1bef14a534bcdd18161457f6b24cc85d57810982401afb373d42114513cac3744766677e0bd8adef97ed43527a85ae270ec8b73478e1d1046ae187d42b2033308f612b940b24a9f1a024117668d5714d4fb15234d402c1893a70f7bb8923f914240cc1679ee93988f828114bcd2c74fcbbf608731c497b483e3df7b0b19914ecd352e12250967151ca0016ff1f71a6d603e7d40b35c970728788dd8e325a41f70cec8023a0c2fa48800dbe37c039910c2b64e26c0b9195b851477689ed3125f49d3846f81a4a50160a006ab9ccb85924c3c9bd2be20acb7931c1fad9b782b45720a8208e1f9ff0ebfb031f8f0ff1625d631d9eb370d4e9bec1c7e52f4c2427a1516d34b10ed57ccb2d8463207f0ad7ac811907a7f5158fbe5f78a10cbbf795f51b3f84def2e0a4bbffc5e9162f917ef2a6216bfeadd4511acc1df4d812213e457d5754cc482d2a163220a4a878e8948d03a38266241edc0311105a503c7580fd1a075b0f6df77546dc4a06c05311cca66d54d3530bd293cdcd2be30b5197baff87042440a3ac274ad4953714a04e2866efb137b10d8a025d0e4dafb551e64874089e89a7a094d7249884f6800833c8f876511e59c2550b8a403b610c75288b486f82dd61183986430b15a422b9bbf9e6700d97ba0f55877491885f753906ae18672987acc4310319c7319e581321231c974274edf430a2fe958292c34716bc12cb15f4c3fdb116fea9832c948bdf70753bc0b0bba2f02352d65330bb1821d4696c769c50ca6931dd4e914d3a096234779eeb3b459535f067675e8d34210de31a9818b7b183781de4082e77787e5bddd5e0f8d0ee19abae165a49e875ae59b7fe9fd753e195860d68ada678768b9811a4aa9162bf39ec27892e347961f5a3e0f85be4e6614f949f4bc9b4c1a235ed370be62dd99b96737d5e2bcba52589ccbe9743952620be7722cdde0038ebd43713b9907506273bc414ce5e30c7d0cd4db42e65e37c5ae3f22204b75703ec38b2b1b5f12d24c96880dee4fa3e033ab3bfafb311d5ccac047119b8c9abd0643e13b2b7a5af55f1bae372770eef21dddb88c411a3a360b522806d4897bb8cf65aea1273d3b58fdaa45e140112155a14349f82b90d3f832549933f17fe5300005acefcad1733c23227a826475a60359bd8ec65082445f076925c0ac239b2327c3eb62296e4414f6955fcc941f3ee2e9f81ddb8795ecd1747021669fab27025b208fb976cd62b288c1b4bec1b78acf8c7e81c14d04b4b8baf183cc3814c1a4b2b9aad974e55cf190164b734e00e20cfa449f0d0e4e5c557211da2dbb9e1a661dd0220beefdfeea5d75754b817af7c07b52c2e8ba48301c3f5aca08524f2ca8d3f528c12a35432ccb216a881988c71d26435f7b6c16dd76d076ca20a90f89abd79a1ccd29b153562999343c7aea37985e1a4d4bb1759c4f61f0ad3ceb8eaf0ce5f725c4e60677a92b86e919334a3492d4e064a355d7630cee58323f1f5ec912a5b7d6a6f438afe0168cba1196f7a0154e4557f3e6a4ec0be92c1d5cde65127ca13ce975a297d3abf1ab4d1a30a853b0b691c72b23b8ad83296308445fdd4ef3038d910f98b30f1c6dd59d488b0e4b64a4a3f4eae3c0ebf2330f60a0f4345e6097536feb8770d3db5aef84c6ca1d9bcaa8afb3c41b606801f85c71b2358ee80ddbe3e0100ca3cd7b0397097526784d05f8c22828ab3f0cb0904bc5771540e063a4629fae2635be35c6de7c51a4d7aa2ec3f7ef5bba7cd44f6c15fa25465344972fe2e8df17936de871bfa328baf245739870483de9d7e3bb41b5bf44dbadc79618f9d7d10f13aad22fd406c99a289e82cdb57110fdb658bb7a29628f8f79ed9358cc363698b6e18fd09f7324379bb0d99a03f2962d661c36c5920902b0287facef203ebb874e0e39e0408e83db3f65121123a8959fb0dd0a077a8a0da61c0b5541416582edef3137bb0edb1fd48174f304e42688d5b1a74c889a32c156ec3341c34be3343c24af01565c54478dcba52e686ef9f84782bb1229ac30963eebe4ba7470aa86769c34f03f1fc2c91b4fb1a2260905db9160b9c7bd722241b1e26974b57f839616914601cc2307022af9c25cc878df9e6c103b2f395b06d1528a0d83e29b50c082ba4871ab2da1c11469418ca996019c20ae3b91a0b48d1bde19110daa50ac4d2642e0fc3cfb6ccbba507ba86376f0a329d644b09b479180fa6ec863ea6721f9d6a2615f69dc04521d8fd89c8ce2a294e89003e1a96708143b00e63c8f447f0fe4478a2581b5ae7853d1105044ca83f0cfea8b63d11f5568065c3c71c0acfa044fb6424d4883ae0022d63ec2c8ccec3e98cc4923b95ebc0b29431ca446cd4b295bc39214bbe988b95ff414179098c767c43106db8ac6a5a8f809affec41483f5525fd8a717310e289df135a8b832f3534ccfb0b9d5b79a046126909504f5b72c26721a472c0bc49ac9dc260fb56bc3ef82317f20c4d7f0e6eb0bf578bcf45700566a8bcac134d765ac943e8d850b342d09d12daf629b65b13e1574913bc3dd13b36f06481fe3557688d4e62ba736eb2498afce79b121f62131cd6c15ff5c6b9f96b82e07f16c68c78f261f0bb3e25a68e2b0bc45d1f0d4cf4ef78b183d3f5c4ea2511423a2a7a048005d0c4a1ac4fa2d4115f2ac6997c94a003f90b9bdb0d29db92426c99c9ede87d0f72d0c969d1b5dd0fa0cd188f187d15b10add8bc850d0904cf01d14f0467aaae92e7b57d827e289515dad52ab233829862ed9126cd4b94b7c10bb5187cbaf2b9d647be23bf01a76c6bc73a91ec9d8c679f96cad338e963f15767d31ff4948217e2e5d814f0b2d17fdff285ef517ba36c99ce72b3d63a74892625b52ff969f680edb3d65c1593562e036b929badeb9998f5e293003cc281a89c30d050aafd6f214bde9cc0857dfe57b4e896941e1b04e45de3d6fad52e853ee2b48826d2b5cf81ac823f4fcdaab8d9222f51bc62df8fe1f4c375d676e0fd3d776c0b6c401f574455f9f0a55c8bc42ae14d41658c33afcc5d1ae56c8699770ddcb7fe948c26c0eee04d98f6075140324cea958904f850163ca70f5352b1b4534244d863cfdff9099bd1508978a3ca6bedc67492a09908a6556c0b3b1af3284e7a93159f8b199b8270708463f474b12acb8b86195da32d356b51e24934a320eca1c60caaf3b032548ba00f4652c49f51ce206af028dc7e35686b2af3850c82b69268a7f57f8a88045dcee095dd7644ece1dfeeea10ed4c3d176bf8c3b519b4f439b4c51a2183449dd33e31ae801877fbb252309cee927f120c42bba116e370130e84d9e0ac79db3998ca27d6a8d6dc449aa4acffef73a2d1b00df3fc06150303e8e05b7b31b972b33a2123ea1952879fce1d22887cb9fc0045c6138c92267e02d318439ecec9346d44f7a6a9733c1dc4c62534226e782237b927200fc3cb30370ec8ec005fa46315b9219fbd9f7587148bbdd81808dad694a21c14dc9d38343c430d2fd95add476273aa027773da0246e4c4ebbfb3183234944934dba84f10b6454796c3ab6c60b36fa378c3fe0026a0be15e4f4b901fa695aa0418c6bd461e38413302db071162451525cd914fd9edf86683d3aaf6789470e140d7183062db1c7237c27d5425c4835369797fa4339a935aefe1ff5797907c04a39a271bdcea7d57a735c4c907e9fc18871893725f8191f6b03fcf9232033c93469462c11450ab86475170d2b9ac3e455a3731847b273159a2c80d6e757178db790f4b4e83ff7089a2740698ff710ebb169ef82511766258a9a5228b5583169b5239f99e932e56b867a54862ef2e8d159f9248077a6c2aa27dbe5a6c510139308e82bd0b8a893c16f8e1fdec94660208d57bd05013bb2699b4cd7131c17f3503a8f95e1056ed745c11b422396b00219e57c89cf6dd779514fef182f2b995a2e2b64016c03b3d42485c71e87bf1204b6ae8bcf07bc7841e322bf1a88ff55496621905dd2f6fb9276f4e3f65c1a55985237287b563b374017cd24fe660fd03c9613874b6979955519e2ee5037e4d7983f16ec9b1f13ab2a451d13307767fb4bdedce44d38bedb7ad6bda4aa515817d01286cd81607ec6f8b7f43578492d2739a2917a1b5f6d7c021a6805546cad0b210428ae4046cd4e97cd2dc26e428f1b9bebb8de481e3c99e126e0cf632ee5c3c090cf3a492369de9108142138a59cccc0c7111272f13b015393d4470e418ba1934c1076819ce0a1b4fec92042def666580dd33b535fe44cf4135919bdd91e216aed6c57a511aa053cc88cdb34f802f8b4dad1e5e9c072cfa5bb3e59f1b8e1f96168eb85f65f6d4b26c22baefe7a5f06bd620820743e56fe84542c9959a96d135c157710a14da1c18f2cf72739f64c07d3b14225157673e9a40b96f410dc0b9b7225a380a9ea6444954caa4c8b3be7c873d16788c21fb0b65c69c98b17f6aa844e2387a2bdb2a0ba67cef2ab0543826e1779e30d8cf2fb9b7e9343e60c22dccdca1c5b281fbe0a67918bcbce23d0e3d5d3342f770a2b72290e4a321ec6018497c0ed58e2940612f2047eb4618da46b32b39cc5dbc59024d9bed1566e53232c6e2756eb00911ecd71b77d4fb65d6c52b0a4e77b9846519631dbce1b4bd1f3e25a2d5cb63d0630f1eaf06d688023769a60d7aaa0b01d269a8fbdba718509c53ce6cbd1660eba8ddd0b38ba7a14f19b9a1eba05d03d8b91744343a6056b02589f1af89335d76b6c2a0bec348083c4dbd6788b86a54ba502508ac110909d90143a5ac73ebd52bbc578cdecae31e08062153ada9df692de56f7f2df6c528581b96b7dceca072c1ec3d44beb5e74302998b0994a8c1a8d2a6e0314be2e5462318e80cbf5cd107f05b74de2173702db638f472357249e6a742e390a9fd071d3eaf445cb499d43b8d2ce75ee40f4884d1b1412ab870a54a37ec24c8044c334df6ec8c3c7ff3b7a6f6ed3141b4ed23775a0c878cc86e6375f567d91be968a2f145a29e9ea9a0f7ea7c567c2968f7aa8708e281109a8f0815b7da1e617a8330956e1f5ba9d7aa71da3a25af7c3b9efccf78f91e2d310ba7100998241e8270c00b5a75629a13324a29890df303ab6b9807ba9a13fae5cdb8848370e43277e64a8dee11d115db25d77497913abc2fd31d83a4f230906b1c10c71b549f539a267f0ca422f0e8ce34605652f5078184242eb53b7aca2b0a3fa9febaa9355d84f4d92f738dc621b80f49e91ad8080204aeb324594e7b6c9f188625cd9737de2a67bb99dcdc7b23ef988c43c02d463ed794ea5eb46b8796bfbc94a3182cf2e267a77f5a3582f3a218669ef5500105fb8ba64e51fda8667deace63ab081740c43f5bbeb445bd3e6a10e842318bd518da52a2c0ad2cea0d73db3286be6fe148f3262a93e6aba9a7a2b8575b0bff20a2ca6a70d67ec0cc1ed71b0a76ac74c71b1bfba4d2c1ca1b0e5f892e65c1bee4966e2557bf1946f5fcb53d30485685a8e0e57b79ce40f32bdaa27219ae3291e9098cd7638d38293650d70ff9d9118172f44d8dcf435bf3854ff09dba5817cc834398feb57fef51a1338014408ff9d890c08a3cd84960fa6f3fd814020d5d7cd52b6158d9bed225d2c891904519c9da1a2568eb19175c0184006bc995acb4821274acf7ade2870a1803e720a841ee4fab1aca61086726c23ef55a9e443fc0ea3b3a0e7cd4e570cf390302fc4a07621149dcc948914283acbeb97cbb92a8a0f3725843695ee6bc62e693f877e2ad8f00101e210a0d322cf66485d3f26c800020685cfde380f879395734d4ae13d801b25f86079c1474b2faf8717d7071333815314a09cf05d9e9dfab4034c8c576e8d2cc759c509fe31541a59433bff1b701b7aaf6c3b53f79fabc095bd4e1a71b3b47f457c80cb60b3b6e2b67f61312dc31a497eb5e8c2b44a1c412f15749f33ae0cc3a7a6decf16f57835178315791888e162cdd519f6c025e71f0ca511499c41c2f9f61fe56195cc1ab0a76b86a56b4202b7c99def22d1bd3ebd00c445310e79742017c5fdc7afeca213c18164efd7e52d3a636501951799f9a9459c943716c013c802683459c0c9c58fbce007c29559806ace0216961da9203e0b901597e6b1cc30842f7baf5dfc36c00424c6245bb638c4bb81b25ed36ef6f3a43aa28e8f602d1d4afe9d668e29b5538d39e56be25f2bc50051a80bf09500ec7936c977fc1638f60c5ff5dd1762f5acea6019ee7d66abc05ddaaf3d6e7d360b2163c3d9bc7edbe6f829464572efbe9385d9e3a981fe6bd649f84fa8376a384ec437e14a5b97ccfa4180bc28a6dbb2150faf12a2440c76d26a0a004e2a00b8e2ae4722cd8412d02d4ac0c53dbde0af3ca2fcbb1b68cd8078463a6d2e1fc42126a8bb42dec06b33c12776c09958e2b161c3d4477e833ff7b30f85221ab2102b0d434b04160dd170e2745d5ace26537bcfcf51dcbcb0b4dec2536b30765945bc32ea68d26719ea9c0567d7358b2977415e18f4f23212116d5e78a2f6a4971108e3b44351f986a9bc0f69fb891ac852e9a0eb7c996fb2c361780afd4a1889b8f319b84d260c43ac09ff1740b11d664187f5d9c8e84cff6066a588dea5736be54de41f325b948c7ef4b0e55250ae884b6f43d8324563b62f02ea3209db283b898ae067e700916764041db52093de326abc8d0e20256b4a5ee154f949610e5e0b4f444f108174168d1bb64e7aff334e9653a577bf9816017e58e2b90963bc13fcffb34e10f64453ca69fd2d202aa7b06f9ac4fa5af06b0705587282446288a6ae6ce90da024371d00ef03f14bafc8d0314899392f340ce520be2eff0737eb29417062532f5c0f2a7170a5c81ef5c09a4d02ab15450996d2abf3c7d381ae63efb768025e72f9f33528a3d969dc4962f22c85bce9dc05b21ca29ebc7a160588dff56e2b9bd558ee11de8a69ad4515e2ef3d80831f787203314b855666898b2ca4e5e0976356f3872efb75a9bf0535e397f781c93bde82c3b550920c1f730321a2bd4e33bfca09767ca5f7333493d92a419b6abce6300bd55001cbea51d9383bc3c7e7b826db458a1f56e6815c90e163f49271c94096cc1e298766926c4ea499305b497b62f20b1c95dbdfea047ae8556f7bfc957a7bafb1a97a2402ee2a2d96b9017daaeeb81cea24e87b26d9655d2bec4dc4829a75bbc883c5c05109f2dcea4e382d7f70b16953d674a66be495b0834f9a00d87bc91e0ea512cc118341867c501690b8589362dbb807399ca62292146ee220ec095ce13dc0fe50c37d642abd28ab2b33221ab8ca028537148fcd0370752b5f820075905778927fd42edc107437174ed1b8f632351119238c425bb6db81f67e50b8b28a39cf00612f9c56eec876e7333eb562fa9e7c82526ebe03e36b9bcbf182778f394668c0c52df25132252f1e354f77bedd7658490ed66cae5efbf42664ed75046ed15e5b5dcbe8fdd8f3cd70f8fbee248263e589f9183c67ec328678594bd20cdd92cf20648c6258853e254acc2a6715be9ce57514a61b3bf9e737c5ea75132d8aa8e36473e016eef632c5590f52e3ee6a011745533d46874b730339b73899001eabb13281c74d923f0c0d2ab93ec8d3d344a55fefb8beb35e0a893f9e423124048f4da1c93672c8f2f2bc09cbe1812614ea6679624593a9e46d1c1b2efbf158e7762d1ee873bb9112f52a1c5865945cebd7268ceaf49dad2d1a31436860a63cae79a9aaa18fc067d5473886337e53e9bc628e47ae204e08562ff829aa77be0de96e8776009f7c053d6c78683d32d964f2d4f1012b3602d4f5015f994219f53e958568386b4540c9f1290e1393e7cd9c3846a9d1bf10101e4b9491279f1e29cd9f6e201c9420a854c56207e4491a0b2f48595edb6fc765c03c6db08d4986f6141dc95d971f9edd2e8b0237b4468ff06e2a6034aae8d23c3567964227082cedf709f829a06a1632313c1dc3b7d683f2301744c8335b07204fc2dc395f42f0cb3df8db5c7c14601e48a2ad204e6ac1cf7f0a12c2ebed4560d1e348328b7eab8f2acbe5db6ccea12e809384dd35097f8e1f0d6349331429d712c76afce197514050f10b6da2f8bb419fde3920aa6766beb29a2c97a71530d76b4f81ad858add6635a374a7ec92ec2769b3fa3d3f98cc9e685d406cbed10d23b30aae70d113d4f8a4e56554e54fe3a2f70524fb0b0099293d4710a7baee2a6e23324e1e010ef1dea48e60a483e4bf8f1e1c04ec9774bd02025543b7d9ffc448254e094902e3692baebfecf918baaa0a2928ca6092d846a3dcf8b01dcb04d949c037d45693f5a51521627e5f3014f3f1441b0e61f4203c63a72e50673db0d29a3889fb6f4b46e298fd3b5cbc58f55168c2b996872d56ce6fc808533658c5093ae068d19400a66d0ce4ce4b6087aeb007bed9064cd35673d8b05c371e0081cd609b65cc118ce450c0c98078f26bebf2637cf4c83714b6e84159b1090a6aed9e70126997c5f7ba51353af2b40c82bc82d5a4fad3ce816af7eb2dc860d933377dab949e7638b89180ca94402543ceccac9d2fe5565fe146bb057f918e99e300bdffa1c75160a702e06024dc21d0ce45c9074b52f209229c407eb93a4390212c042e083ef149dc86ac3b3f47aa6220ab306ec36d9e8d04559d6266e0da30cad8bdd5e82e909dd84aa96f21dfe17f2c933e91d6b3ec58c5f2a8ec3dbb3cc95d24a5c6081eaf4300cbf676cd2ae3d52e8e1310296d4f1e790a9190792c7e20cf71d6668af8673bbca71eb90d265e14e9b1a9c2f951609d054df42052e504371d6e5b8bc63283e704f22095df010d670298c1c01838781f4b0bb6944d223af27c403ce2ff7118c8660c9c2a3850f236937b608c1981b1c28878e0209e239efb179ab7be135f6b3ff1ae55439474bb4bde91092474f6ad0b728867000a7af1c2d8d5461748384b496dea6c440a98b3a5e12137c9fa4d657fbfd5223df41b443a183efbfcca6ab2fe3d72820a609135690fef9addd8110c50d202c0e2a34197b2d8bf56a386ed35b2e5c485d9fbd2030d1c126dc1f44a733608ef1bd05cb516484ecfaa84c5360ec3a875ce4867930a2e1f9698ee8489a0025e794826b67785c4a8c0e7a74fb91ad25107ba2fabdfac02fa2d8eef335948835c0be7d657174024b6d49ee3d493f1a8d9eefa565d9400bc48db345f3ed7d45658dfb3af2861ef57de65b70c1796ea2d4fee8c174af9cc07fecbf5b21b77b85354946147f065f7996b0e6649bbd6936c44c5a384d7f59c120e96d578e8e90e9bd0c7f98143fc5ebd70eb343eb46be395bfccca3626300a293bd982b54db6b5142a4ab29577f861313400d585439624816023f27a1d5709278840f33c9cb9c252fee45782833b650396cab70ab6cd14f929c2aa2560a6352d658509cb51352896cb6ed844222c4e81a282131ae57d0409d9c80e6af7b9ab98314ef48001eef0c54b1458f3cdffb1862834b2b74cf857f0ba6012bda370601946dfe4543f2ed43b83517647e6809fb00d9df33bf2a03af76b1964f88eee8af6fa375cd7ab318c7142e7148cb8caa5d65d63db102f94bf0e36aa6fd75f4bc5473d43fdf55e90615001643aaa923a4da6a4427330a0e4f7916debaf4593c8a5804efc5981dd261e31a532583dd0435db27ba00b15237edc85f185aa503e64882e39f46b92511728859007b8b4089c52526292fcdc18a7c7d9d0f5c3436ff20b73b821d57786cc6dd8d9b1ff0c536efaae59903069c1d8f5530fc7f36647a7b5820c4c331721e650ec4986d7542b21794b40d849e916e0cce8ff0fc23f322de0969fd884c82cece76c328bf3da101ffdf79730db19c0547c8bfbdf7497e55b5099db26219d6d6f671b47e979169881102d0e030d2e2e2062ab33ccf1c593cc92a490626cb1fedf22b36f342828a34587078ced49c74ad0cec41ab662a3a8890a320d28003e0dab0eae58636556518360705234c5c5fbffd9613ed9cd429d45067d972df9896781c322e51ffb856867a0f7e3dc9b1f10b6de11a8448f649484d8d4a443d5d545b2a1e9d5b6c1404ff63405be2c3365c58e251192bd405d47e7b2c74acc50d0839be442908bea0729bcb2a914339117b9f6ccb4e7d9a4b88ffabd507cc3691129e0b84f282d5624d5f17140216d6e057253c1bd0b331e06f0ee5bdc9063f486f90c2ae638282540b056f57268c0ecfb29907a1bc18ae7d529ba7b16a58a31adf004fae271646ed66534059dbde14581e7d519d9c5f5514eb9e4711a79dd23de2f5e9e99c051a641b036e76531cdaab56c82e1adae1f0f41bc21dc14b107bc2bb1c6b94429a81757cbe2dfc81807a011983037d17ceef7c8437881b3f69206570ab052a7c67937d52fd722c1fda3357998f10ad993ac8ee22426734156a241ae713f307e9592061d9ccdeac31c4a66bedeeeb159784242c91552b9fd530a9adc3e00e07e1c1222f4a2511fc1c14449b13f579087aac60d9d4201cab7ca66005f00546d97472670bd78c6048f8b8e85390a3cb7ed4337875101e173a011e73f387bb360b4e4cda17409df40b926885ea1dbcbf8878b51f4549b5c09d7031cf4601231cb4230a2ef8b45aec1a6b514c471a2637960b6cc2ec17302b003c13d5c8605ed33164a2dfdbc546f439dd6e8051c652b5b0fa5be46993218fb797b7a014be685b5ea5869908472f8d0091c358bf23b43590a84ede081c75c5568c57d4be917173a9f46821bd9f5d161cad5a7712da7122b526b13eb809c4a8758ae6b77bcc2d1cabd852d9c0f9f185f64590aae2374ec1a4a313d1dee9958737ef60d0bc685ef090e771bb7bdcee560a57dd3228a86a3fd6960a6b5506e1f72ed1eaf91105df59030552b03cd56ef35dd56ba151511760b9a80962fdcf09e4d4952b3145acf5082ed44f4241cc741f4959e84338022354ffe079c9e840f73d341a1aa6811eaa618f80ec21f721511c91a0b0da730139972048b538f53ba47a6f85b57d4cd4db9994e5c4c2f2fc3c43a05bb2612fc149ec5a8beb1077cd47f844a2de5eb53ca311eca39c711aee60c78f89b34289412857e6435c323408e42578200418a4040799f8bb6e334f1f96eb8d0aed30353fd2076123c8637ef28412e90285a0c7bce494fcb693b1eb2bf179c65631489ce7f39d05a89ac98c66928f1485109ca5e25c6b506e4c652be54431e091f9c44d3eb278ff5695947f1d2e56a351dfc89b3ee3ef8ee9f116097465330b702d3576c3657447be696bce7a71dbed735c907c530ce2f5ec5e0a3b3e34d731cd0aaac46dfc2194418f6b4dd908da5907e07a9810b4faf6e1b43c5b12bbdafa22e5e28651521e114af088c1c899c20937ccb8201e9bb9943e848a2198b6468c8f58ecd06cbc34ae946e15dc50ecbb60e6796ed39fac6d4bf87d7b3eb7cce58771f0d92813c0e6aab765910859b2f9de342e30d5d0658514a88822581c86f2a221b96a871613e9b3b663020f5e80a7b9e3f71dc28052c6b037a5256745a30561aa5031ae1de55a22e936e9d989509cdb30497cd06e9dcc166189616a0be4128b36d01bcffdf19988881201f5186c7cd7db4c7d7a18e7d82806aa1b2b967c17b2254e37adbdc678d1138b3259f4842f6de7b4b29a54c49a60507fb0629072f3918a091d8ab68a748a9b56f158a8d5f238c30c2285fce3861e3c32f11429fd165f418e375c4f6c718638cbf8575c4ce7d88cb1297a58c01257559ca183adcacd4eeee5356d831c00babaf1ac036f1a1b052c4f71bd6111f6bc2ba17bdcbd15e8c3350ac87432d3d3f7f66e2abc47da5bff8e2bcf6ea9bb81cedd554975dd7755dd7fb35755f91cb01195a551f489056f5d71fd2aaf9396eada95bffaba995c1b895b9dcfa38d7d7ab5ef5aa9fcae1e1f89a8b9b61c26aedf9b7e967a25853866198467acb99c03ecc75d96718fb2492b57f71a5ce5e6f323d8e5f5cc99a38edadf6258df4ed618fd33517eb1b39586f873d940519b71836b64723861708617745b967c6e4b7f3ab9db3b3da67c2f56b0cfba11cc7e7f07a15610ad16e8d3b0f5f769b514021e3cea094b2a01cb9483963e7ce1566d7a58bcb976f069b9b846355211ad937e026e0da5c58069debde6d98b6ff253be7201cb8c3a313c4ee50765422e33282f042872563118730a802c4ea37c2a241fcf3276be1a8e5697c4c9afaf5d16872b9fb523558fe2cde20f5fdc563f92377ed60f99d83572c7f73570a82e08c5818ed84e1e5c227a171200fd954ab785573c3dda7e219290cc1ca17222e633ef087cf5d0a0ac1da78f1dc451b5878f5f0d00f598d20d40082941c0d0b9235134d0b700616674bdcc94522ed43e6f6fcbe3d646ebfccedc7f1ee05fafdded1f468ef44d0f785f92c458c9d3b9d153999eb1c4bd9e2e4363744e6f2d3008d741bc1fc24bb2a9da552a984b2512fcfc602332bf91080c35a92524a8eed59c7762108317875751aa7943352774c0095c686dcdf5aad45a1ba9b8a71c1d8ee31566a66d879a1bcd00c1b2f34c3fa856f866dc8e4f24b33a6bb3333fb0b007e2199618cb131a79b2865949717163a33333373bc89d1ddbf58086f0ad98df0621d25a1890d61216ab55aadaf9ccd959c056e8c23b8f05d3e7725b701391d8b1e2fddc2b7f04bb7f02de816be856f11b12d9801d1218410cb328c0ba8955a1e77c50889a972468a65724619322239a393e29455867af413f9a8d5fa69fdb47e5ab0d5f1c2b8669bf9dab591289d72be67f772dfe2069286ed51ca44a36e9da239e77c7f03dcda9808babb95d3c0f518639de1caca3c721c0012a4c86fe458f89101174ec0518187e44cb869af1ff32ea200c56a426408d7cc0099556e4a9a1d8b5b15253dd5990b46cbfe67a056bab81b5e6dcf41dca294d64a6badb4565ab51da45bb337d9b818e5360d044a29a5d7557b547ad5cda1d7547b32f88af4fdec436b57928dc60505753e413e413e4130080605157563f20d709d6be1669cb38d7c6debf1d73f0bc1fdee3aa781bb6d3dfed2cf48901bbb1f0df7ea9a75c8f719b61cfa59965d6e55ed4833256d06bbda86183c6bf75dcfd7754de8a5272520d4784b4c2e8425a0f6e00dd904a2c6c7d8a1da73f778b9aac0e3049c2a1fe4d1710f82d5705b906993b491362ee6165a0b8315c3300cc3306cd29f35bbae2e87065427e31a0d6ef1db83d4f00eecb3873c5010e072079fa1b7693559077da4b0f0af97f2c49d0c05ecd67ef8cd4d2ae579ff35ca9d1c8475cc3aeac31cedb5e7e4ea79c6f5c587baeeee343d4ad7bf74bda3f1018ddc2524884f24de253ab1b36ec3d7dd7ba7c4351ac38f7998b79ffd052113df40fec44687ea6a7433325d4cf7d54afaaced3e8beab0ee09f427de4426c5bacd6c205842774ed448f00ed8391744b004189d3bdfb9e01d5d3c3a3a3a3a3aaa3fdfe7fb0ce6cfce8966a992ec86a2b58b3cac63fe115d2d6ace49d302fdedb76e862da3dc0c36d0277d1152472a429fd46d3f68f783dd0636a199444e1424c3aef9f546cbb0596f9ca7da7a7957a607d6898adce828ea384f0931bc0309fb3596c6e23c468cb0dcc77fe63b901b91a728decd4a73ce396badb50a15a0a00ebd60c2aff02d10664cc12e7c690514404e22fc0ab51f58a142baf09b6bb5f539865f218441455fdc8aaa42bc4bbbd9511ed979f7a16ec3af59d50a495364381e87f5e8b0b36e44c635193750030135500335506379ece3bb0f581571608fc75758e744b45e3972dccf9d6cb56ad63a11cf75a22d964ee78125d0ce89200272e01db3732e58471779a47c4e7461add6a250ffb1b1dc78d46ab55aad560bfaf8401fe8037d82c448e5cd55e99437d5a23ecaf480a8c8e828ea380fef70f2c4574658f13da8e52b0e8aef43efb3352f1e2cc1bb1e3e0c70fb3f9e82fd67c2652da68b930785c2d67e59af13f17cd5836dfa3d5f312b75bb593a5a066eda3105590c4fa45ee6e1ab46e1e2b07f203588af683afb16e66759f633d06f8eabdbc89f5cdcc24ad4953fb0cf9a51b012ebb227363ebbcd8ddb30053a0291714d06bfb1dbdd4004cc9f8ff10ed8eda8af657fc3256e88dbcc6eab55b33643a1b0ffeef36a1704d6c066720922e04fa19009b1dbc4eb5e5d5c62653fea077dde7ed49fad3b6fee8448d8efe6ce9b56f584512299b5eb03f1024040be822c1b03bc9f04f234acdc4f125d47b10e96acf96e51d5c6b84158ad45792cf18e7e7f3a46367d00dff45d96b8a627c5904349cfd1ad5c98dfb0e8e2c3d57e93d265ca3dfd73d02d7d46e24c5fab80d194b0f2e1fdf84fcf309db6f9806ffa6ceb717a53f791fef4bce59c7e522aecc741319fbd3f4e46e2e03d617e4ce56f25d94b2291be6e39a47aeabe6a69a9e34bfbd2ba14b4df52b097d451eea35f22d2f7f4d3d47d42aee9b43ddd2600b33d8e939edfc4bd40ea84c45c1a371ff0e99f389290181adaa1a0fdf67cb13ae79cdcd79f7d0cf742fff6bef9d07efb6cd366b0d8f92ff49ffeeb8779373de9e7c3705b8ffed3df52a9547adf724adc5f53467a7e6e8fa4d556919e495cbd6249ef75e3fa637cf46f343db637fdf6a6cf4c9cfd8c3798ee337261480fb79cd39bb8efd4a1c0aca3f4cc3a486f82e1ec675033d98ea647e9b52f915e237554eb30aec28f816fa4fd645cf3f94fca6d68a034a454c0c310ab89cde6118650440302bc001db1b819f0691712f10e8f757405aa46b908603ce1c38a1cbc459a5c5fbf080dfef4af4e8706ff9453a0592626d67db81b12f5c32268c4d3d390c5404e7cc541ad216f2cfd4dd4df4544aceeaeb119003f638d2f9203768258fee3d8518d31c6c830c02f177ac7e442246628c12e4bb112e5e26a0954e80ccd2cac6d2f6ba6a287e59d11d6ccc2c68e52b21a4e11850f47603c898227cb3dc0e5286e08ba475e7a2381763d3d51f0f073398a244c6e2e47b1c3960bb79c991a58be313563030b677aec7c1c98737661690ffb5aeb67240655213bc9a6ae18887550497b3f3336b07ca7252228cb5196cb528ea8700e2e4b39dab9657029a38bcb52cab0d23b5c9642c6949bf1963333c5f667a5191dd8ae31467b5d97fd138cbde216adb47fe24c70fa18f7d373cce9ad3d75a7770ea63b710cf327f9270ee64d8fd39576170edb7dfcb5e6ce6cbbae2be612b231c374bebdc3e77274aa496820ed415804d620b1f046efba3602d39814183dc6189bc866a600815062d725e5c54d5aebac9c3f9d2e6184de70c65e229bc9c18c90656c67c74b7bbd9384edffa097db3b124291711fa1c9b0318bbddae99ac0cf362d2ec02e01f31bd7547ac80ad7ad6e1e5f35d0c683f1384f5369a0d2639d771f0a4683a194cbe896436360300d3e8651ad72f0ce6eb10ef9df9b674e9d561ab78ea6625fb19fd1362ebec6c13c6f996b1784626db7629e72a7cf201679c59c5016626920d3cbcb54e10f9456d5eee1517bf2617b1242690fa7b9b48a2f974d834157befc121703bc5d94e8cb2d07deb0f105de1c0a61d4b69cdac9c7f16c4b01de21d98d6b95056be1d39bd2469b56ae2f047529b6e5d05a2bed62ac652133911e05cf223d7fb139d5eb1252add775d58edb667b120348684f9241047d78a4c955ff833e5c39a4e6684f5e5c6cf69f97ddb447bb1417092bbcf9e9cac510ef7743ff1e690dfec8b754a4a4ad56418f4c20fc696f46075b1ffaf0dd384844e5e08f13b65bddf2d58ddbc8ffaa454922a8fc236e957fdd5cdac11fd6217f1a5d6e43493613050c193ec4f884f58fd19f875a5b2d25d1a71ba5d4be0aada2cfa355f6e97b351f83a2bf4161fbed556bc5b427712620bdc95ad2b389f49a4622bde536fb24fba5d2e3b8e5365289c39eb4615acd2a76550a94718d667a98d293b89af6ae87e1bebdebabaf6ce7b9cdf557874161ebd38f8f32e1527d5e8c0ad7f55ecdb78aefd57f5d8fa355dc8c141b614e303027181818989aab7b818798cc9797d38f94fbbc1ba3e4d1e1b4e7272861fb2fed6e52ed45618bb4eab3914853cea3ff94f3680a35f12d0ca53bbbffa80d1fefa4a8f6fc8456d52bab17d6d15c95be917b8d53da3e3e1b236324026f7cb9bd5f625815a527f0681595f4fd81b48a86564c0556c78c2331c62864a3bb7bc79a7846c635992c921a733307bbaf76c3ac8b113e7139242594549b79c2f2bd7c7c7c7ca44fcbc7a75b41509ea4b2e81bec6050507429af0e06b517ffc98d953a8441ad6238bb5414ebffc116467fa855f4e5f5f1b1da753aedca4cb79c6ea160ec9ff6a212e8a30d616b7b7dcdae8b0f5bedc59fd1c1ca06c23aa251e90a193b527aec18a37429a594524629a594524af9d81336be8c4c8424e31e036634f66a677b143c4b7be634fad09b2ed1b86cdb9693fdb6e574ad30cbe096835d5b0ef61786f99693fdc51191a1c836c409deb0efedf2eb371e7cb18ec6dfbb1b39d81a0466cba91d07da8bd7895b9081e078c6f1f0d57fd4b8ad6b02ffbab2ebbaaeebeab48ae335c8fde80b41ddab29a53ee4bdb48e6fe067423feca2b5861bec505cecf743a21191567112fb710bf250e1070bade2f63abe688c4e58ff2e138236b302fbd9ab659aa6759a1536c29f8962b3f747c5bfde5e0f35ad8b32c6581fe34c80fda669d8f3867dad18f61a777518975dd8356ba471cae8b1092bcfa5d059d6e18f3561fb3905f910a23a45b03f7878d18ddf58ec0799e8b4398ea25aa91685759b8bcb6274196364960e35d8edee32bafcd16a920c6a57e4c8118506f6878c6b8468972347e47a754e48173da52ccb60fb33f739f412ccc020b2f203f290093739600d735d7df6ccdfa117414eb0597f4ea11b822e7bb92c74821e6e9d4b60788bc17ee9719ad212c7b796669cd8d2d7fa2514e413e95b2a1111822a7d2d55dbaafa5aaf22ab769f10d4b56ffa4cbb97762fec868d2f5b8e256d3e32d35f68dcfad7576e89bd84a06ee94d3de6b59f9134b8ad40b16ec9e949a78e0614ab49fde6cd47fdd267a692bca6528e083a60e496ea9bb8afca5bbf245bd52b98af5f6d35bd10d4bdb61c539749adc45d6f2d57b3a999b8128742fd1d9847c1b360ba26f56fd8277db66d39248dc4a4ee0b825a62e7b2100d8edcd4652125b2dccc35dbf598a6af1c89a3a90f6f7d188ea6761a0ba73121fb554d2b71f05a4b2271f56d0501bc58174be47ef68568975432d96863be98cba40e0d5b5b85fd7ccd6275c6dc89ba31adc2d1aad26b4734adadb59f025fdbd198fe05fbf56d57dff4d81bb91747e23e229764e2ece6244e8876b70ca7515917db631b5f6c7dfad715abd6252e7a28d281c9099010610b162c6a43152c18172ea094522a191635cccb422740620446e5d2cc1c601be6a05aad45a1264f9eb3e67277f7ec3927ecbc6377dc41d3e0e5f20edcb9ecee947a7bc9aa3cb1eda0066951965a5a854a86450dd6c65c97854eb0733ffbb1283ecbafbebac0f58d752c5c45faafae56e78ccbd136f1adaf30ef7acce53f722483d25d051c54c0706020adeabe40381064480c2a07ca06971e49346f7c69e4abfe288f6e7c1eee3691d2500a243e07e20759dd10f2c35ea00f74cad82cb8f153fc917065cf1ed9d48a923be78125f29770bd5dfbb576015ea07558dce9c4e716e01796ec746247d3022b76459a54805933d0c05db0e2c38f9d0e77c1da5a80cf5d5c7884f885edcfe0f3f3439a1ef3e3cf4f42c965a1248edc035c169201d1adad4ac2e8fe65a124866e1633dfa42627179f4a806fa412e03b2bacffed60d983003ee6f7578e6b4e5e587333082f4d8fbefd22e88091cb17a727305f981f2777b3a8fd177f72fc78fdacb992e39f1cf691a3d431ee9390fbe2779cf523379f72cd85ac6952d817fc06567295bbb8d1cb914512388bf70356306aa2e88c2c2624a3555faa8bfd78a8a80e71e1c717f64ba54eb88131c49b4a55ebf5d017ec608c1e184d9c1b1770866e62628c71c61967c402f610a04fa0ebdc85d7a545b58cbdad8e75cde2025f72104208218410c61863ec48bbd968c8518b52613fa83395b4eabb891fb9f619349b14848c6b5859c6db05aeaf5d11ec0b411016c4427dac2b92d5de588aedff206c36913e1234571fc7e10af1196ea9ab59a9d63c44577ee6cc4393087ef6f2c868165d39b1649f316476d212c8a5dc467610bec79a3ebe7221faf0d0a9ffcd27f30994a12b7f164d2ebde27ee6942756aeb413cb9544d7480561dc6f8271e563579d3e3f2d20257232b972ea38e11d3357be0cbe822fdf055f55e6c95856f4a37fd69a8d94708747c7e789ce94567d42a693fb0ea51f409f044d1fdec13bf20676b67c550570e5cf205f390b8b749ff088e4b101ea449d9d5e4d286d23ffd3ee077562379fb4278bec37e713b9823a5f952172ed4a26bf7ec6ac2c6b6d6642412c71afd73e9b4b2ae933a644e2a573077a6342ab5ed0fefa7e2d85ecb5a79cf67d339d949baf5dd86b9ce48ac8b75b059855832cb7d74fd302cbe767be14eb88c47bfdac34f4e3a53f2b4bdb6279e0547f9616a99c41165f3e5766fecac1c0af4161bfd6ae4d29a544e4676f7dc9c1c029afbda649ec9020ed696137544c7b192629334ba6dd37e4a79ccf0bb0d5575af6a7d3e9f4339f9db8e7505bece93fd44da1abe9f9349f16812ced65f095f67db29425a4bd1e52e59105e282d6f54ddf3798ac7e197c05f35de3dbb76ddb1ed52a1b28af675ee64f9ccc49e6749ae13e22f1cefc0d99e72d476646e66f7030f0ccf39633d3bd4c87b2717aec847a0c75c58be2687c5c7ffa53f782fdab05ff1add8f22f1536ed39e0ccc7fde4cd16d55ccb77c69b758195357db86c670a797dc672b0c677a533743c4714bfa98713aa2707cbf6f13a05fbe7cd972eb44712288b7762fd04e6a5196b091066d24b61178d92c2065c2a46da09452aa5345c95584900ece0863072a5ca4e0e2355431e2aa9244121dd7b9df4d0db146a113d8904568e78b0e294f14b1451843280103567c1ed15e16da09e3962e0bed106d8912254a971b325d64bad43869a971d272d2420425acadd2c9c2b5a53feca473bc71fd5326f48a01415a1a508270bc47028c41adfa647fb98e5dde7cb457b7fed2c7db07c5eeee32a8c6e78afaea5d4aa743c798686966de6280d78775c08f60d80fba9075400ff5b0bb99dda1945d111a58b18b5bacb0a2c649cb494b1a3c3764bac8749146fc7dfd637e6e8deb8fb35a114941a3e793403f4c18a101c5fd78ca75094bd7df3b8debd865d29e03b5e7ef443a010ab20452720edc7cc0ef238a80a8b8709b80774d2cec640e2cbf07f1c31c65f3b017780486d151174456b010516941096a5d5f82880b819a6b863d31461382ba93f3e9e9d1b91fec81476ef75489eeeeec5ee3ccb263b7d39e2d1b5e3fa1617784dd9c8d11638c1e63843eff6366f6f8c5bf8a504dc8c0f58f1ccca2e62a82775c792c7cf73803e85dab9c54461a83163282408b186324c09518b8ee49f9304a9f3fd0bd1b3017660edfa774395512aeea73fb47ca36fd0d848d1c0934b50268adcdc08db1a1070d6d4975aa8d90b841160b80cb4248281103091b482cb03197858e308210ec8dcb424758d952d35e772fc9d259f70782bcc4a0cb0ac40032623992228870bbbbaff0a00833ae34a28925de9f165303032e574c21444495228ab83006163ebc10ca1d8e0a2aaaa882bb3cb7991f8e8e73b666c56acda01872c14fab66188f1f73c70a10eb1306085cf859e420273f46dd31ce239183d00808a9586f8e23f658ddba332e487b3c4fea7850d7ab5536c461cec9908775cc20edcdf93cb0f4dbe341e204f2f08ee71d0e8b8042dc097fb8f3b35510d0932865180279e011f864d5001de843ab58e8082278422877cef9d483783a37ee7c195a457f671eb91f73c131e14e0fd9db8c34033c847e94b8f3b5560de0cef73ccfbbd33ab9e0490856b48782a92e324ce5ca18589e5821c60d5e58adc30bc280b1a15bc0c510fc42a80540ed49e003806601f7ab19828969082786f8c1ed21c8f01a5e21c4157d95512b934e09117c64cb6db8faf45024840d498e5a42f0d083194210a1a40b8f10412af8a3a3994d791c48016589bdaad85c60672e0bd5c093aa0107524054534a5b5896e880095bba2ca4848934942cb1c1c25c1652f2431221253c4a7458c08396acb6ca56f718a37bb7a3628c54898f1f63aceeeeeeee3e49342c4c567fdf25dd159981c5590ab2daaadaddcdb015abeb7064e3c68f47b4dc58631955c4806268092b8a86c8618c2b6a3eb058dcbefd5d6b8c110d237e8c10c517317290032be260c446809f245a3aac569d8298229da8351281c3130fa2c90d764b9145d918fb530a8182a82a62108312d241e20a2baed891c2fb8c73ba900120ae8021170ae2c8f5677719bfffe1ab761e1ebfe1c278c5f6fb7bbeb238aed879f91d765508f6fb1b3f035ebbb0df5fcfe28a2bf88a6df98d5db1f0d2b8df98a0aa71e5076915af562b00e34aef02e49028b81f09b700bc23fe8d1d96e993935f79070eeb902fffe2d5651bf9f2c7ec6edca6eed8cfbb52074629326f2dfbc2c2e7a85561e1bb73ec28032fa49472034cdd3b960c1d42e8f013c2ccccec1cdda38c57c02df6b4e703ecb9a0b4ceed0a81e095573b541296b90538aca30b0b816efcc0f8ac60cf8ed9e31cb9bb52030f9b63ece92ea594524a29e5e46070da52d21e169ebbd7037da04e709430ead423dca49ee111d90e04820938058b9438aeacb9523e2f71a5943e185df9c31357fe27b9f23da9822030abaa4ecc752fc0fd725cf7afd608d71fe5423dc8e0ba0f365c4f4193ebcc2a226841c5d36de8d5f6011a44a754ca6b0f7aa9c8831337461eb4dcf81b0a260d2b196b56b36245cdedcf5123090f49bcb8fddfc3c4edf77848b24397db9f6d391dcfc022a71dc90e4528c0a2e1230355350660871b6eb47fe32bd46b415390d1dd7dfde03f7570e3c7d8699c51060e4058f1c312203f0110b1bb6d1c001218dcd82587189d05a1d144ab56b3aa2c03f88101aa0de3f6a37670fb5f480723dc163ad2ba3d83db36061595ca6aad4656bb2c84c3119f1e6a108a30fb314801b5281b836a5dd5891d26173e75074148222a445688b250941748621078260e62e0e03ef22d0e6724e9f7bec6db22dacfa107a805910be520840f660001c8e789bc2c04c494594a23d52922be3871c5972ac8f882e5c9172e22b0821e20a61002420a00dc7859c827e87e9fd2224a952c51a240d8d31efce9037d7a4e44d18afdfec2b6e197af6961218c3db047cef9df759fa5dd9c5eae5cf9b1abac8367bc028b962f82a0e50b2d53da6bd88241eda5523445698a84ae71bb770cb5108f97dbddd1e10f9cd22a38c50afe637f60a05feeeceb67e4cacc1777d31e17f64b41e69fcc83fdd4843f5460b4be4a40a75847472dd6bb20347c52970d57aefc3f951d5c396163f07851ab1a7aabd8bd449d8c65f6eeeeee3ded451f6eec9df64c9c094c0f03a1e9d9f4b59a3ad343ce3b138426533c7263ebb8cc6a77d55eb6acb2ca2aa594dfd815f6ba3cb31bc0ebeec48b7807c73bfa4614cadacd09cfcbf800865e50042404831a5c167ac1d18def4c20701d70a1b81b755e3485f59d96af7e003da1c3323db362cb6d224d0ba6877998ae88919f212f3a2c53075b9994a931332453a3868c17e0e705539c15bfc68ccc10162227565ae53b597c8508af7652ffb5a1e0b73b29ece745b7c80b0f173f6a95ccc7af9cef749e85732cedd1d4e8450e46bc71e3479ed81395c48f44f48a002ce4022e37362b7e75273b4f5aa5f29d1bdfa1b4ca4db04204e21d5e656add9d5b696f088cf6945837eabca8bda11b9f870dbae18b1eb2743b8faf623ec29c7c27a63be140c1c4d81a496fb92f66e3be88e4c69a0b9f7adb43a2de69157cf873996c60ff3d6cf9468b7e7ce54388620315e3113a847371a3f69cdc188152375ebdfb79512c2a7230629ff4a8e48d9754350b118d0000001000a314002028100a0704c270482c22d4a55dee14000d7e98427c54188cd324c9619842c8204200008010202020224034da06013ab6791649bdde8bc726ff07a33daf2d5f27f555b180c75706989bc85753fed3970b4b101563ee722ba8c5584b0b1af3be4ef429d3a785b73d046d8e419990e8997b1896290e4abcaa40b6f3425f370d9106d843f6291e1f33f95c353f1f1eac4b2622826c0492726f0d69539a728d80c86e629f440251aac0161d2fde3f20ee99104ef9bf1e219f077f22d1e48c8b3d816872e7543c5a7686d9e8f6008d3d402b1a9f0496934bdc9deef362d74d51985fae1e6ffc07936c703c8d58fe7b39e69298c7b32fb1ed13c3861c1060014cc722938d6c582a67799186b9be9e75ca031ada3a7da012492df292d1245ce35d0d45d7494ac2c294af6c3fdaaf452f011ff09f7b37053e1c8a075dc4cb802f7930c1a3bdc957e2a4ad2e228bb0b9d2e6eccdd6e76d1c14bf73bc7ad3092c4ccec19da2d5ca9f549b575b7b7174e4551d7dc30952da720a9d726a29472ab5fda0f48ce0be043c449d6e03158f278e74b63dd0ae1638972b10962be00450b17fa7d64eabe5a3d582f210594baa63951363f6a6b63d820d228196b7be0d0723a80e869ba6ff11022c41a56f50266bfe0bcbb195962d89b13ab6f9b7209a0ade4b51630b4af52f6a5569b11f0ea7e02f0f9ad24c0a4ab2c54dba51214e26f013807fd45748860e2eee5ec21542c3f1f55e5d2d67b0b343cfeeaf334515bf149455512a93c7b172300f3c3bd7725962778beae059b3e24db837e8123802aedb1371c45602abcefea6813de0fe0dd4dd74467822e519b9f79c515246edad8aa49ca1a4875daac6b53c8d15d3e282cd4233d74ab386b2987fa0ff4fa466fbc944681f0583938333b4900b1bb389b251b02867335b050f7f827d0592a73855b5bbec882fce3ff57ab822a344ce55a02ad72fb3f9ba67c3dfc944e25dfd67198f7eb49ae12d728107b425fe1e05dd93f55b29eb36a3c777ab23eaeda0e94c107d525d320868cc591ba7501779feacbba9bc1f810f17dde8387151ed9e3e221b536c9da11f99bd05d2577e03314fe9ed806fb9de8b8fe3244377d1943dc35526579c898a389b287eb65cf998a3862018c3c03871e2639547f514e7f0beb0919aa95e3a9ebadeded9c755809db32b7a4d12566adf8bf6b07fa3db07804d8133d8948409e8a86952b36ae61389f3620f41eec30fa105329b061840b6a5977ae8d785ba3bbd2c7ec7d4187c561af54aac02f1d56362ed113a03db7e3dd499058656f461f895735a705e8e09e76dccc78741255653fbe8adcedce281f70f50914b3f7b5f3b9a2053ad6be7266d7f8cfb10d2a4895983797bae1148ffbc199b5f9f680462b4a8136d8a5d406e7a7794092f75498b288ea223a271fe770b069a64c2a7bb9e8e85c69dced6cde3671ad07b0fdc5ff467425ba60691a9afdb4136984d3c985877c2da491a1e489109aaf84da9835b6037ac217947cf2228ebba954a33bd1102caecd07fac8ed8207e6f7dfa1af54263656ad10377880951b09e68291ad85892f86fafef063e3ccace2d6481ab1b745650b75a81a745e927ac2895006a8cf47bc602bfb0b3e3cc30c17a757db15e9f42e4fe94283c0900ca2e9acd5500e12b49a431fdcda3802908bb43269066b9ecbfeca6a70673d3a79e2138803799c2c33c6d71d79fcaa2cf2d6533c0f5ba1605279d14863506138eb8a2c5265e3d0cdeafc9a5ebf8bc82895e98f58316977f2646cb01d2a60ab9ac2637332951e0d75b9c42cfba9d73ecac829db5243481c31556540dacff1d090c138dfff58100b1ce0d04c6d2d4bcb61872db652151d52e7e6d77625828c1ddd1ace6ad61c6dabc77e06af56ad0c1c5f162d73126da77caf9c509af6cad45d0f305bd7bb432b876a0447b8c6787a0f02a27b8aa8398258c4c2e7822e043fa3bc81eb40a23f789039023ecda5984ca5a096468dda0c8f212c2638c63f1816c9ba8cda483cfe948a40869b902ec09b582e057167ee8df93bc0ce6fa7c3832806257c0716410655761a37b42d00dec68c4316bf507450aa32d1e00887571179ca381b20e6f077a6bc965b89c79467cc5c59d9ec75df1b39712080b41a3fb1c4ea1670ae3980df77656f8448a3c10c5c925fa5a5c7bacc48630a8f5b030f9a032022014279b00e679171015ce3ebb9d9793530ac39806cb9a53d0709f372056b9710117ae74d16a97f1256239c1f8986769562aaec48ebe4123c7fa03a5fd83009bd28c327384d507b6c0cda71dd8e308a3b7d007a8e083c4fcfe92383e5ad681118f6c69789fc29ab0b62efba636c7be9e30e38b57e85674775b25c46bc4da81a66ddc58f31675cba9f45c13e0b845e27cc1f370ac019b492a9fb49adc522cfaadf0a347f50f0bcfa6ee6ddd18277a1642475af6fb211bcca33158cf92023cd21e341a5137f4ab0c3273208c067d1953847568ebd74fae815c71e73bc7f491438d5577383b052e3ef78fb6df860b54038b65c88fda2b0e3df8875702045227d09bac1bfb28cecd6ce0bee1cb4d091ccffe36325c72c7ee2bef4882752358e940a47476387df813ded8749a0d02ad5ffd56b5faeb79fe1f94225d29746029a69742c152562e1712a8947c71dee4285fbdc1f1ad972c38b95c3aa3509e743ea5fd7fc0a0599f80ee77a06270be37c575b5faf8bd33a548e616952a70711ea633c518029d6d2dcff4d97b5dc2066b2769c90b29fe37feca9b16fd0c2f71f7a9232f880869bfa2022202897f5b117e477c6b4f6e6940a975ba6c205a55f2eb9b576042d66444adcef63478633481e9d5aa86585f4d2455c1ba06f813c7895d115d1df218011d9f2f8b859efebd0e77510f773584a45d7e4985778e035da8acadb5dd90380b551bfd81ec0a61f2d07d253cd9d0419067948aa0949727df434d657ae13a056da6fe398c011697b84a1aa922d3fa9878cb2c92321d04dccba9108311ee4a2755c5b4a45fc55ca627c287216428dd269df6188c0f2d7b8ce23c0200b37b22b997179ac3c757b96812f936ec84e05bc442c33808da84673debf33ed1b8a9c0e81260717763bc66d404806e9883b7d91df3b2f2fd07aae8525d566a1bd1c682a62e44e67248ca83336c446118013378ced6abfda6bf10b5d4f10794a75ab8b2d25243dff7c26a90e4b286944e61b1610d551e8d9dddf91eee9f2830baddf49e56b9ca37c67a93c402840fc52251c8c5c2f2386a075b6e644bbfafc1db393a59c9495ef8a66d963e6e84ec8294904c109762e1b374cbd354cd169280b16ced44565f05d5ddf42628506163da6c3002ff4f26bb45ad27227c825c997ad7f781956ba27c67c7359b92fb8e7cecb0db5663c2349eaf66b3a95114b0616509ecd9a66452e7c4bdb5defaa9ffd801230b3e205a57ef7b8cf888b6609e89963b38bd08ef4665b498f2efc91ec995f874597840184cda3e6db7caacfe88c52109a3c521332c6d021a0a2a3cc453e1114002d9541b1086b7905cdede7c7ad710af81e171dcc79d630095b3df055da546b95a06bd2fb5014424ccebd537717f2af723c38db06df884951117d01ee09e9285a7376cda24a1830ea92c26254da908b70146f712ec31342e08539a1b08fbbf8791df074a7efea292968652f4c7f7cec0c6a35a1fdb6a7bf50bf051498df3ed3d70b581751f07c0d9441077c0cf3850ef046d4b6941618d6054d3deedbad2fc4da5e020cd0017b6a10eaeb12145a5045f5aa4fd9fe0be3fcaf3d64a814b2bce9101f3a9c671ed1fded4729c6dea56a95c01057ab74550c8cc6c1adc9bc8f096f6c35320b098141f9f09edea33dd1992419e85c02f0a39d0bcba2b130bfe71b8d0d4e0c5c4936622bf7629ca1694ee483f94235bef543a20357833c7420ebb4a2b3c00678fddce9cd8012e2788c8018a1e6706272329173554a8a3982397b8111c98f3a8f03dfbb6cb9de9687831768ab3030370aad13a45253efa38f846215173e7ab39fd4f7a803b272511ea4806acbcb209320f117aa06ae36fc255d6ce7219981765186473e2a19b97643a10c84e0b0077e5d838d82089d6caa59f88dab7cb26b82e4ac7c6bb022c99059f9ce5dff41b9df8a5904ede4cd2ac89605cf350e9ac51fb53935aba9225c045a14c319d2c2210605a3e503618802ceddff33417e0769a09848dccf92007da94a85125be1fb1d09b4130f129ad6ccbb681e0baa3e287eeae6d292337b3bd42d29844c2967daa4d49a3a9ac544e84927cc9d2611c0a4da00d7ac7397b10bc2488ff30ce35324b5b8980f42206a44bd10fff5d21dad828f78048afb59d5b93ca8e4ae2613608b8d651d662c6a5a60b5564bf8e0650df4a3b1e2d77c9f6d9a6163afc729bb19de981c0f76e1e69199cd78aee47e55413c0c049d05d73aa50a85b748fad7607523eed95b25e67abc00e1efae080d13298a17cffe7952691996c9f4af7d3e0b4c68c4bb40e9aa6a904e6b5873b4d8f7108a620832f4fef14c80e87c9184b472a3ad4b680bb3575570f8d03b3360d2a9c2bc7ebf27f008e22f8ccfbce786c30bbaa2b5eeeafe153366d37188103bb513097287a97c8c75897010cb48d95e490d436c87af890f3d93e46f13f6b8a00d0a08f026d8bc2088deb27cf0cabe4c042284c32aeb58800dd51a8e386c5d202305c4c59c9b80c05a26f927139f677afd1e5f7f20cc88c3372124a5417e372d95e7329dac7f8549ad05abc7dd033da42674b97c67e0c9fcc1550cbe420843d4feb2dca1e74068d1b9d00c487549f8fa5133e2eb32217035dff815bd904b07e70c9fc8b15e38ed452a927a94ce05450dca799112bf819f566727605d167c794139e4bcaf6f35a6a564fdd481d067cb4c481b5d1a28732062097bd751e0003fed8b6162bcc5d12231d0aa88cb096d5e8af52784ea692ad8114ca97bd30ba9675ccdec2afcd136ed684233ada28d63d233fe9cd658dc502d97d4ae5255529ec253a2e9e13eaaffabb21cf174bf57eac1158a7765ba94bd762e93bd8b513afe9dafd16a40aac94abdcab9a7bd80c9b91ac4c6097d4dcbabbd2b67a93b85bd19b69625f74d8ffe44ad1a7c33afc58eadbcd9bb13ed27c0e69559a0a4520f2ca09bdfc4449dc2b447162c9c06bbd3fb5ce00cfb8adae365d77c5d1f0457ebf7f4409ba1595311ef18415570f00ff6af7c190db85f68da0bace1951c2ed3c831529e6cedbea969da2a61d1fd6ed391d7f89afb2bef1a5a266aa0de32739e07cd6f83d0b575016c857c9d18686245929373ec44a570097cd47c858fa2ce1da8ab876578f032d1ffc715f8d64e32a4bed5bd87553d23d832e705cfc5e3065eece938a15252d39831ddde80e19a47b899d6979fba14bec1ae39870773ed2da65b5750467bea248fddc405b64275811d9be39d112c862025d8da5453db4944c806bd426e23cbc22786b92ac8fbf8233f9e869067a5df02d1a2c33e0787d5659d132911dd1ff0064d72aa68d5f01aeed8272de85052a12535b854bbba8ac076a67e633c72b82636ae09389d4d28447fc0ee8968781e91bea30ea531d0e68fd6ddd65672a58e61d2afcc35077c6fb3472faf9224c890119ed31cf54bc0e1dd62244b66c79c4bbba0b37037533d2b48a1fd1002de1b6421d02ad7ad4bd34a897e9e12475bb8a68fc929e95bf42335e32e51df8286a610101d4f69278fe22b50506aefb11ebb675c933c14d83d8e6e040fa96398b56113e3d6175f329f1191f97dce2e8edc08bb5a174675eb06af4e5b2c04693259c4fc2f9ee9bf22200287728a71e41ffeafbba2f64bcd8de028bf510e6fe0a300904c3b4e89ac4c783c5a052f64586e6c34c6fc8dc608b1c797ef067ad46736a3faba12aafc0b82b7a932e51d3b49fb290e4d8ef3e074675f4372db0a4840c3ea09cf6b3ddb52c7c60206eca25bcccc8c344022eb157b6f612a4e9c30256b220a7902323641441b2c0a0c8ddefe8adee0c3013fd908ba0b80bbb694c05c212a23100e4408151979af39a878c6dbcb56ca66a4ab18e84f062acf2dba65eaafef117a7e90fe2c700ad90e75cbd21a8859929e06721cc14dfb532909bf12927b926cf5921c696e9797a1f12af24bce9e94d1d4b3d241095384d6d29043c7dd5b01c642ff588d541ad139081f2504a6ed474e23fe31b05e0a4de9865a92de16d7d34d23b623a2bf21f55b52c8b6c4531057ea4daccdcd04dfd3c4dcc26da6e8f03408b8c457494465b9f13400323b3a2b3637919ce9cefa5bb5ad683fed9ca565bc1b3f098c3446354ccba054b4967c922ed28a282c70e3cf0e51fa14808796022c0b691fc821efc350763ceeb3a018b3dae5cc51e93eaaf1664e3e0695f171f7ad4fd383fa73e6803eb8e65008b4c7aea11d00bab10f96758d9e4a42050c0483d54c19fd51241fa7b8e7722ee58708d8385f2497a9a9381b6d82d4928e8ecbf5cda08bbb846c5bc2c091a82a772fd91b44368d0f38ada0df7091a0a251bb5816b0ff0531537e9a83835f1a92575f3646a1e801114de589ff31468de968f42f17d4edb3e7cca422589c386892fc0064252a0ede23e240f8d1f6fc1233dc2ddcf075289fe61badee4f6d29b6f8fb4596c8646e3c0d89c4161d888516c7a66aae2e5852cc8a25836e2e13d7f0df2383c95ab8e51d9adcd2c951a8fa0dae1e592da472924c7d454f46f6776701b8dddbcd4b9ba4319190276e8ecfd27820e10dcd50ff508cebe89ea80793bc625a4a9d3fac1c686d6f0d4f9573bd8fc56843408432ebe5ceba3ba0f4b7404040a7aa288d55e5a3a057235129c04ddbcd0e5b6e0a7fffd98aafdd290c9973e74996522736e043e0607709be0b4c806036070dc2ac9c87ee56f631d09f76fabe979edfa66fa9c69f41fd40ed06cb2771115af9ed4424ce7c423c2f2f593dddaba6f8dc24abccaa6bd9afb3ba18d6ed9b44eb0c833a39d653c023492fbdb8001adb25405c75cb4b17eab0242722c297a3bf33abfb9dfb025b2bc0d2162be1d30859759500a3589c1b4847da1e50e91e8360c457d893549e120d6e42182db3e96b9107fcdcafbebf8073b5d6a276616836ea3d0e69f06eddbd511a155ccf1fda2f64cfc680d05bb231cad91e054690806ae417c00cde35fa0a99811b3f1ebdfdf5f87a98caa21e84416d0947f250a72482719276106c967d7e51958dc9e4e22bc100dfea214ce8ed13b1b7e225b6ffabf7798fdafe3e79af53ccfa1ab38024b332926b47e5e26b178d1263ab26829a0f1116c25538be48996bf35d290483386e40ff56965e73ac50583f077fee3b56e366d3e65ef8e696e015e651ec9682edd97f6d05dc361b6cd5114ef230e00f52952ff55abf60e6286023fdcbaacb7358dd93078fd0ba42af6da5c57dbe48b4f585fed7f0fcda34a496e02572581843cafaed265b578dccb48531ee8d99feb0f228f6e68fd61d3e3d3041e7122d73eec1a7a4f87f9e1c6001fdcf56f9f6bd79b19a20b54029ef2d6b73204f08910aa9e6b4e0768a989481180738df24e368b30f8ac15cf42c183b1a3a453a0e466333400fbc5135cad5d68d02c40b59ea1579d6b072c330524fdce5095a4364f1f64ad0fb8add2b29ea93b80381de27503fa8f701a42f0bf06915175a8680df4d33e35c234e78c0dd37e74f5ae72524490f697ff5df4d69ef3594613065d37cb50f11baaeaf36709a7d023983b5881daf4638f6efe2cef283e40ea9cdef35c50a94212c680e8d9deb36b3d87135dac5678439a92dd222288b33771486467e8dbc7364221dafd939978fe9ab720daac1c152563a43d71e76970e718dbb26e4e24170e9547824d7a6c491da30816d1cf3a63f106d083ae2db1e65db8326b4b78101c0ca616695c7cf37e6ac7c25719ceb605f6a57ac6c733d7171bf1ed5e1fc417e320241439c3341e43faf58342201b5885c6ae49425b4ac4c7afcee4aa0e8b56a54b2da91d9e25c9359ef61010c754ff0b9368298c46525c887f24ffa8ca7e2c8665fb600e6840caf3d019adfab82f66612c6b94ffcdb509a4deb4753254f244e4ffcba10b0a804fa14de31fe4f788ee1c9bd293a786cd2adcef9ac88aa59636a6c2abecdded71909d388aa5d54febdeb835a1436016f16ce2dc9d818cb9610266b65984dce35ce45c113bdb2072b9e2be75344ee52304927102c4bb860168c014c11d4e68e63b2a7edd7947a28e2ecc843ccf40e9214a42501690114b0a494c77190b5f20620bbdd08faf48a0773f4f051352eb645c5ebb09480b7dd3b2040970b7e4f62ea6ea8da1efb6fafe437486802a4023c35ad1c01527e528b9519878bc0f03f2088d7a7e98ec85d1ba10a2c38a92e0e4bc02d34ae5fd8469cbdb299c1f5ef8c48ae14ede6792a45079010eb5164cb9e5c22cd742339b2cdca8d50f8209cd7b2b57f6d6aea31844084da50cda92d0fbbfd5248d78d2bf366d85ec238e4307b8e901d210934612e90135cb59f0b109996823519051e0b87d99f46aa421c8ba2900ef8bf65141d99eec9c70db869e244a022b8890d0c404506de82ba778b9a811bbf4954ee6d41a96800b15182be3080e3914fa85e62b56d7e67faf0ed56fa44a6aefcaf41a5cf11e3716e74491857f8e2b06b8601b5713570c618566e7f8b4e390597962cca4e224c92ff412b71c129630573005b99d1139c5f4c652905b5b21c19ba1b7cbfca4077152195abdc116f66f20dfeb50ee6022932ff361166d6ed4a0efb46cac887b3283baf85a08294747119dabe98e5fcd4047da1be01b8283af2da57952aec2082c1cac7380fcebd3f1625417498b6bb3258e7f6c1d95bb8c7a9c130d69506aee2f5d4577ff2476e38c4b27700052ddfda4d761a767ec3fec366a6e6b5ee2ba3be78b682741d3cde6a7125ffb435221da98a7985e00733858445acc90e7b2a97be3713af75f6e1f5efedee8fcbb248813a37f86253e49245bfb6aa3c4fe495d58fe9b69b9f743339572d25a1007ee820442f20d4a7aa01c608bbaca321b9b202120a910af7e87406bc3705b4a0190b6028fb52c5c8cf8bb76b5a5ac00411ed1603fda16321f6bab11440cd291d3d542a86eea4e9af49301b736f0e654d465d7a3b425742dfcd0b3fd2fc67689ef0569a66f2e7756b8b32e3ae82d590008833e007aae178b93b3a68efbc96f95238d276bed03521625b628180ac8862beca86d99b336e4ceca48697fb2a08eb421365a80958f676dcc013ded75aa113d4e1e9a7be7204bc591c5a705db36cd9954d12ce6dbaa90203d5da1cbab0f4c57eb1efcb8a755d088646378720eb6e6f506bfa65169556d18bc4afba6a706f2abef8f3997ab5a6ea96b44cfd0400ffc6b3703c4d067f08a7e240f9d011244da30848a03ba7a21dd917805b95645af0d48011ce73e3e8497b685a6da1f9a9dd796dae3e4224fa30053adb81111e17ee13003470e0fcf38061f9457179fc537bf4d0936e48c1154fcc05d7395923dd94308950ca2a850095f8941b66283ba9aafdf0a2992d1dbc5ffadbfb5e4c1251173927b850c8984dbc802ce5e107fa4a01ffa4e7a8dea900380b6267ef1ce0f874d9ceb6b2036dbb52d6dea651ada54ca8a4be570e513e5bcd6f5abf149e9c8a02d81bcd7f26cf0e815eab230fe96b1524ff94db8617d639e0deecbdf1c5e7d1668e5d0ced3172d1f61e0ecda901699ee04b154ee2a37347fe071bcf075f7c8f73a9594376c960aab28988be2da4f6687021472ad29bad8f9a36eb5effdc55117706ff1af67b1cedf8bfb52094634a1b237c81e8ffaa9c1a8411e634c564f91c7e2c754467538ae87aae17a7bb40d6ef9e30ae6103a1f31783f8b8c6f275d4ba3ffccf7a5ddb090f593032b61aec37ce05bf009a752ecc4dd233c27929fead2c38698c21819ab248e9f9acf33e38863532bfc0008d5d19e343a6aff808eda83de88e3029a91d2e1b8ba0c73fc126da1dc3b9d4ca32713a9abd976b650fc3bb84ba35b0003eb193c5bc691e8817f250bec9eb6aebbd5d8efae06035f7f5e3940010023b34abf71430fe147e788bdc2ba3d128bca473a813e4485eb4a3ace3681ce88a9991e89e57ca1e6009a977024f3f9ee9ba0e24735a5d6fd7ddcf5a09e62fd7e57d34bce33f0efb41b04682d2cb81c91bc1ba41d4d9d0da0c41cc966f5b3ab1fa9ea086f328488ba3700d4b2419727a6a389f3fb3f809f31a76758d0d6c3a7bef47234414820db43b63a1e0fedee2c8a38fef348574527d6f7a7b061f3f205ddf5753324518a11284f8ecd50ca99bd811070538ab5a5ff7f5764d81d209f78b3246a0df39aa74b39ed727fea0f6f4c753e950a73863b65793a6c6c35596752bf6def3484c51728293ed947741852470c95280c456ea27001ae74e0c568d047e4d4c72e1226b68940b36836b6cfeb6a7e58bb3594bbb59dc45bc31e8ce7ad11999cebebd57d90febf6d04bdad52dc1e03406b3b347512e94c30033c2fe7b4c26a13b5490bf0fcb057b2da6a80fabebc0ddc04ab1bdd9a9277ac0942d6a68c6371ba22f2a2e5acdca1e074f42a440268cea8c562ef0248672e7109c3661db5c52fa97d3176b4d9639ee2a8a37d245b8b4bb5481b7c4419f17e05c0e5476bf8ff30389ff5eb144c3666621023ef24120a1733243bedaf6dc77cf66123eade2b7cbc02183a59708aa83e5523f6cb4a02508164f9eb507286d2159a97c1b28545eedfa7e2e7d45ad3a2da7cd4c3a6585ac96c5f99c26ed9319173c855e9c59ea680a13d578efc2a30b04978f7f50008c60d92d810790e4aed8fb4e0c4ccfebc2e7fe03a860b9795c694a2450837169ace5dc8845ea6253a8ef0d02846348102e2fa187044d768de9a3df74adf7e2d38030af794b892a9ffee00596ad09edf3f45fb7e699eb91d35a46d5e1cdd0151ffa60e988122f75c326a963e041f4b9a19f7c07126b743975974c1b96c92106325de129b14848d71efea425f3776d70099e06bee8b49ea50dbf263dcd5215f67698bb9fa69da70963b7d42a352126f04254db9490299a8572008896608dbbd5833fb233879dfac8e856cd60ca158da5b90ff60cb1886e73626561e73d60cf77c7ce6e8b9929f0bb3eb89965026c4001de32ada8ecd1c31d952bb9482037a9b7643f28de1d1cbf574f7c92f550c167bce818c25a64658e5b598c1b11657fa22fcca90f50f732fe537e55655aecb9d95785b4f4097b52e3d8c8544e643c75611559e500327fa7d86518c093054847a6f23b2784ec13de143f4f97b274e708bd306432281702a3fee283fbc455f7781a97e958a89b67f209538b00a5faca7468112e2505ebd5f3074878d3eeed71b861d7dd67e8c121ca8564aa047293bfa648c6e49935677786ccb3bd95a56f920448ff79bd0cb7cc3b3f55e69b6b7abb3ef134db49738257120444a5f9520e4529a94514f0cb37299f949046f24db8f76cc7521226ef309769fe5381b2b45847124814c98132b47889513a851be48da4226148c839b3d2f96fe48e90843458df75de794cf2ee0601ba417e32cfab23b124004a942d1e439c207777eea81587bd279bf45c89b2e08a5a252aa6142a96544d338eccb0b443f37b5b9be0f38d80459c29335c66423af70efdd6dd5a0a39a64a51f474d879173a97b312e26e4900802bafec8ace3d01eab73aa065801b211e21f0d37de258f8493f1517ae9113c08acb3c504e46af1368377b50d5012ddd4c292b7e522743acab80f3ff1a4eb9bb8a396bae4a9dc3ca1751895fe3ea9ab610c16d0d36475f16bba1aac9cd09edab6359f541ba0710cc6a2ea4d6b51e46a9daed95819fd20567e0360dcf4d9f6e287dd755c4cb0f4eae7906eaad3272b88cfe965a17a92ddf08b09f8bf6ab8bb70ecbfe5a3e2a451888039237367911ac4616f1bc591d803957b6907fb56c59e7674eef22bbcadd018466b49a0969a648622bbf9a3622b7d0cfec9d4ccb9093f61de42770359f788deb94f7d905cf9f5e59167eb6e0b36e25c278dc85a79cb0fcd9d75e0cb90d0fd0e2047b67bbdcae0191f014c3ef95c5e91624a64031554d3db8158ca90a9b9a0ac17b5b544fe55e05be92b891e7db1644646c8de6c95c68d971f51a9f282d00fe192efdbd752a93b06f5c7569c62ce33291ffcedfc7c36c62d92e1f53dcbe48d99113ad7a6408743c0ad0234457714ee9c313d53a8f3c6f069039f158083f82ab42ae467c30d98927ff26e633ee515b62bef16c32e723113118ef0a8eeda5410680a1dc72f8255c9a0e2723bb42fba82b50622888a3345a7dae2ad2e69008b7cd059eb1c3465ec4cd11f8899c87a460ac3af82872a35ec9e5ff72812f65947decbdfe5420a9dd712de46411463fcbcc1fda5d8cc389a44df1802ba73f07bb54c48083ff5a6f056d2494e703ddd64f8e854b527c42066f62ba05deae21ee9602665e9c3bfe6eb4ac526339ee7e6a797decd3d3ac0877a9a88ced614758f3e46f20c34286a313a9bb06500f261bcc66d87cca11000b41068b8cc68f4827a25abb9abfb5f1f50dacdd4d2f0bacfc06571db7ade81488aa3e961827587525f279eec90aeb88dab42b348a6d5c222a16f7d480a16e15a61c6f4b9c24df138af618b28e0c01f197024b2e0b2b8fc04d0d61006f3872640b6e8364c987cd230014a719868a6c842ded8800754b4c35f85749453b47625ee5cb465b2cb61b320ba486e2f475a7b96b71fe4da18b46412ba292a2c705228d10e84b2b83980f1314d97320b22145b44f6e4459714153a2c98b7a4c6f392ef0b95b2a796d41ddbf038cfcbe354ae01061475dcaf128a651fa1d992909e820293a18a58b7696011055b4c6a696437511dc11c46d8e9a5650409e5c8c820bb34c6ff50341940eb8ba2c9e1753316aa2bed6c04c6e90017a3ea4799e85446cd48e120857c47b9945c0e3f560fcc3ed984080a4b01fb6ba1b0e58e898a0d8a3c053b2a5aaf9fa2dcca7da8a5b1bb8b6e4680aa2a97e26248ffeda3f6efd25560ea70a15b58b75db07ea596ad5b7589f3000431d4a17c141a98aaedadd00da1570eab2a74473206bc291f30544cb4957832ac69fc114b2ba14a55789ed0a0f52f0cc9f8609b8f5183878344e0182528cbd58e968bc8b925a59a61b8e06ab4cd5dc2ce6e50dd31c4db0dcd29966ef545a2b4d5462b25008e6c88eac0a2d1040408bab78a4146dbadfc28df9dd71cf2819fb24878347bfca9a34c8f9b4d1ab1e205a698a50d1c987482dcc67813c8bd728e435c968313363e490648def1b5727517ce30ff6d7308d39e37ae93b7e61127538678e82919884082e2825048725b0aa98b03bf75a42fffba16bdf80da6c94c0b0a408cca3400e599fb4b6ca6bb46ccc3d7b3cd0175fee20a1b98a808618d0df504583ec655ee7420a9c0893d20bacbd8d30ae829ebe8b321099469dd872686bd3b965ff8ed9ce411c41d0780171bbaf4f5e87a880688cf0f1e221c967b01707e45cf3b3850e27fe8b5aadc210d400dfd63435709488166112f0057a45a40156a94485a3c55332cb4dd9c74860e59e6aea0f03a412f0fb84c40cae1cb0f99860061d22b4708bbbe85c705cc7fe68208043625e157e95f79f76eb9181b2b3a983f4cf5739429284220205470f8f341373c298fd9b1f6fc24089b57cfaa6ef589f24c8baeac475c8ea51e09fe7c5e84093e0ac5ce7adc9cb37ddf92c4682f77bf5f41f8013ba63f901b2d5a3a8156c0dfaffb366add40569b590e85d29bc2f449bb7d94ac2c786c2b35f2a759bcc586ec8973e77389fd8a358fdc4adc8e9fa67cd172fc01e5509eb94b40e218b569deaa0f78871230bd20856a391c1044b79ca2b227bdfaa2dbf5f18bf93ef7304f49ba552b9588d962c7d0855dd3f3dfc36c2e2b550a60dc94c156e848f4c06c5f1e590072b73cdb27b8c6e838acf153a5425133c4de47c6398a5c5702695a251b994a7eb2d81df018e941970909b5a5f4854d153b2587fdbffb25209a6c1aa9ea225a39acc23d679f83bd03ea5dfbc6edcc7bfe924dc90cba30c038ab6de0ef2d325a0823148e3c15492730835e1830ee518d3b26d2947dbd405a03fd21423c2c1204244808a00615a1b6860af80f7a573b1259a313240c4fe460177422f1b61eb6e4b25175af62ca444f94888b3ee21f0f6b417e4e46e64a44dffda1c7cc090158c21ff1ace1428a3082397f6b200d6f63518fee5fbfc52527b0d9ee3324acb976d3756c68fc246c0e4aedc61b6133a7ef105fe1b96539b0074c809867acdc6524d26d6b556b4e6d027d1f373772b5031785fd24e82fa5cf0cf278ef964bc1445bb0f327fd8d017d39ad5e59793845955c28b6aa81da58a86008bed86eb3b4e4135aec04b404e7d29a2178ea162217ea703a039770c78b947ebe2d55951e4c3b7be46d18bd3ad349f33a43fc6d0da63992151599d3dd141a6bd8f79db528cbc0db0551a84a782b6c301cdd7b54730e06339611b837a2d6a7ab8b8f7fd139ef9ace625ee2fb6bfd712e58389b6e280a296307d5d89e2a9a4dbc314e052798e5617d52bff509dc1deab4944665434cb097a887d817109bc3b32e2bce2777421eb3b53d19356734387968eb19e9f76b032805cc47e3bc7290f7679d5714de63bd83e1468ff63fb500ad1b466e0d807678d502b42e8cecd200d41fbfd457f3d4cc80e88a92c20fdffc45b3c2fc2a4472a5d39acb9215f24653b05f0bfd06e1edfdf764828326ca3663376a4670e9a133185c6d8c85518c9b1fc6345ac0f391991a5d032cc1471dcc143e71ad106353bba13364ac86813927d1913e042e29946f267ad93efcf973352bb5b7e0eaa2f0b0d21e8d2891e231016296d5bb5ae00a1847bf96ed416d3221245a0034d6ffc162bc1439cce2a876fdda03a46bfa5aeac799e252248c599080f60f5c56cb1a5d0a7d7437b9713805a095ec7e9bc3fbd78a5beb20510d515449946d73d6c55a0bea506b387f5cbce62cb3a79188e34b3cca2a37b5368f9b5306fd21c6466897e29cc41ba42a41173edc33aa95e55f8fe8fe1b4f2a9a17655c2ea1421f60348e418c67a10f4f2e27b88481c5dc4c6f14b99d743bd0c5b93839b77e5ff327d3f919a7548c8bae054e2c81f9f13d7a455613e68dc70489fb7c6145f652729ff89e181c94fa3d30bb30e7192b1ce006e504b97b1e99648f0df068d0e0275c97a4e7e55dd5a9a255a0bfa9a3ee64a9b9f54ce7915fc5ff2b0c0a6a76a168ee5c5d2de8c1cbf56400175b7991b402edb4b8a88374564e00effe04940cfbb710796e14cf29f6c7e20318263099464342cc536b77bb80c7e3f95d538d5d599e03859ff453de2ec62a3009ae64f3a048c7079918158aa2e2281a8829d04955972ce4216dd58fc19b7c738ac6e3d14627809c5e14b3eb382840e20c0b039d786ba8f0b17ecd13f3090dde3762d74f16a4f29c9cb9accb1afdc189b54e2902399aa88968b994a82c16f4010ceae8dc49372a0094bf0ad1362244a2744f013cf7889917a660a4a5a0747376cb4911f55c01d453050cfbe69b4f6900b1dfc3598e175fb4834ab9b82542695bf2e01582d38cc160834dc4ed233e8e040dbfbb6d3bd4cf41fcc02e5b0bc33ba0fda101ecb1e4d5af6f1371f17e2736815fa6b79a75288b98280483d1a222b8ca5d150abf7d4f7d4229fde1052980a17ead2544d46a8d76ac47624c99ffe521b97e2a1caeee2668fcf3167d0088ea6d469352d896ee60e84966ac00f3d390ad07a9f7eee19c0a9ac549f53e610603256a13cdeeced84341314ea230171bb8ab12593bdc18f7efc6964718e83c16a87a9803ff679f67f6ff5ae66fb58adff01d9d3ab1164c965ea6456faecdf9eb1196a6b9ad19d89f6715df3dc2e81e26dcba565e1fa138c08cf078e1114638489d29731e23be1e6107975bff15684ac67f92a5892627ec413571d2dccc1cd2c95646b9508d042a8869bfb7e4b61dcd5cf49aad55e389ed13477b4c787374d5d2952aab9612fdeae2ece7749fb2e3d1776dddf1b84efb167249ccd5afea9b29dbc13034df5a80e7499900be0490cffe63afb8430823152eea27622b34fc9f4b658dd1ef02ff04235317988868fc07138b134f3f6cc1b2739f1dbdb17180c18077f80d98f346170cba49580247e8948432f9c37c52f18f61a46492c18d6c3d508ccabd5a7c7a67d4d9d069b5259d96587031f39708b9da1bb0becb38e50497cdf6b73e29dc90d191dd8883c1dd7f90e03777890e858e2dd12f5679eabcae3b2134305483331cf2fb24b64fca002eddb887d775ba315a58381b8276e704427b040c86fb7d73615432845e679e67d2f96912d6dccca280e484a7e3008c76c0109572d0d22623ea2bad2affb41711a193870a07e2a47387dda05ceaddf30792e627cb8bd8d4f9f9e2c4a23cf3ba909f8cb7c444ff7eba8e83cc98a2b69e16bb0c681e2b807052e3fb2f0fb82ba04b2b35578eb729115cfe050f720190ecb3b17eb2c778422050fe1774515eda701b9b19ba496fdaebcb81be816834c037ec14443a599a366fe6fa4e1b5b0ff99b2d0433d8189bb5ceeb07f017e7ff99110d77e1e7e0af88f7b706f5c16da2b2b0952e360d4e686b86b209e4db2983518a4336755eb56b400786b7e97ac8849daadadbdda9d9926e586c19c2bad409e87633cb87f30a0554d5c8d00c051446fc1216c67c4a9879a78e0b2ff21260b3016126db64039c7102948543463c3b26e6f8397f4f5a058d611675f012bdc51827be7d54801235fd5da478b16567f8306c7dbb1ba3062be161d7f5e762a010747498f1208880f3a1669bbc18d77f7c16c2ac74d4d16106208db986ee317598b6599dfd89f9d8ae5e88613f6f2eb74c268f0037fc6792033491a6313b0b50c9c31c95be1a24cb9412f013b5c62717a9409daf64358ca8c455e7bf0053204756e0cf4c1c054b1cc3a595863d711406a70702b0e71e6ba5db06c36733f9dffe9586abf70158c6ac2224ff4d6e78b7ae15976eaebc2533f3595f42a7ed075d5078520db8d1e28fac1bfc50c5fb08995e3faa7d5227c4148e12117ec43022ec5f2f986809674d4f185555c8865f23593d1c3082291aaa0f3885527673271fc8547f17a7c1f49f451e0a3c6cff3143e73a813915777bae1f6d5db449872a01122ab5a402689606c7b496e35c4e16d6501153d93a450e27b768e8c769a693d6550eae129c796c8a65d3da562e0a59945f036cded1bd8e8a00df2408af6dc384d29b93b788123668d12fd825fb3e688d81be9f3f6cc4ab5426ae782a534cd3270fa966b35119d2966792a7f71e96c5aef30fcdc14619d1b1664ba702c7a6cd8034bb9b167e99461fc268189b25b8cc2703910a78327cea604680a1715955482e2e7ab5761fcdff435e904882c85774d9f65dbb518720114c3aea9274f98c685155e3c5af6d1f551d9729c7337a38b8d1940f4a62fc54060b8045fa6095a7656120df3e536f70fda29511ce727b1d5265c8e30728784c2a36337a2f385845bd9575fd6574a5b6fedde179e74074d23ac090cf93a1f4b5b48d436c4e5855276645e21433d151d76c727e6d735328eb95b61386619fa2bfde03d1846112727558018f5831259c7f5481751cb117b7057f90823e83f09bbca1ce3797f626a4838e5d15003263545ffed59ad0831a65fd9a30732d65a809c3866a6f11a2a82dadb7abb2986282e0668a9b395fe26a99a3f71516bce49fc352a1aa31c070aa0d583e0da60327653c03451772fa04fe6d107bcf62f94947351a9853e346fed9b5586235da5714e2e2961e3160a39922d779ae40bb5dee1f1d539584ad48fa5d0ba8b618fb6ccbc8fcaeaad6baddbfda1a3970591eea44c99a6976d7a39a998e666cfe63d0b2236387b919ac2a5512a02b75f33ddc9e52ff42c5a40ded24ed4bb47c247cea7c2d103a09f3670d7db7fbc0829486ec5c73aeb5f8592c3fb0df7e9c843ecd2d215e424793745f76cfcff95d3a5937145a968be6f5bde8b713db1c88c782376195d0047e04cf9b54d39111361496ea6f8bdf05c00af829e7f890e9f5857207c6671c584fad2a540daf27c90dab9390fb5b5dd70aa5e90de410706d89f972668fdb08da5bd93e47b9cdfc24adfcd3e67f368d8518262a3d4d835f28af8c829479663efec89cef9c67962836a02820e8d2ab2d7ace5816a1b4881c11d7d307c3c35fbdc0efe7309f13e2e5eed0a4e409f9078270515e0172f0c7ebd3e94895503728eba5e480ca3b3d2eee24dd1b16eac0eb60a861e424c1acf2f07ae7a102d99fbf005e9cd1fd19d08ee789e0bebe195162e9085c4d45604e4b0ad1faecbf123b731ef23e059dbc5c9229b0f4ce54517ea35bd223f4311cdd8abc90d0b5a5eb110d26c3be3cf9b4fc614ed8afc9d18b20d4e862bb03fe0aae22ea58386520c3ff88efbafa7b477eac12a6e8b49faa9cf1d7412c64b900ee83fe8793aedc8d5e5c3b0714667767d32aff850f7147750113c34eb5d5165fbd90bdce76100d97ebb6ec115380b58013fa68dca2aacda6e04bfd87f2c1bfdf2de4c14eacac90c252abfdb00481b2430274c76faacd80b96bb3e32a06c71636b7c1201a69b0489365b4c6a1e8e0d2d8a154253c90676452cdb78d95a17f5464a0cc494e3fb5a3a9c740919fbd3eb9e3da7ba5cf81f576f81fe84e1526b2b30cbc65fd43181f90caf34bd97b6066ed194471b8e8eae46836b211bb2431b2c377d5181c9c281d37802f7df9a87488241dda882e88f2006076d0c8c0d30cf3a296586d70d9cc4b67e6b3cff00b77946788daaf344e12eb9bba7249c6074ab0a2dd652d2127e85519d9b03d539fafff3bf513b8273492dcd6936815ccc05787e92cbde9109945b93c9e14aa21b62282e2f859ffd59eb686ebd26d629f27311c6fa08c24b8d1cb9f056f5d57a253f053c0e70ce81254ba394f3a1924262ee7c13d29d9a4d2e69163ca0eb16720df0dfb7d407afb5df7f14ed444663463a8ca41dbfb5877f2784d2bc64cadc5be5fbab3955ce8122f48fbd5ba65368deefff2bc79215fc894d570b929b5c9050013c1cd9a424cd7656739a3a504e23ac40698336ad1d8265840a8f45b51057b0c737f0e5c25bb5cc7bb2804be5ec891d237f52196ce51ec045eff2b401748e7cf4c4031634d97781cea3f7ed69bd0b7f1709331deca3cfa66699641f5452e7a25bed42deafd02864dd0898e93420fdd696045f1c2b729d3a4b7c8549c8000618a8cd41f6635ee99413d6847be3caaa2923a316462ea00b07d8040f66ef1ad71d83a2eb58268d2a85e539288e52d49e60612955241ae61a3af8b70b6e18f2a8aa49b628f0ac4b078c48988b5a3e54ed817a10d90d055c835fa0c39355d7680547f224d162414564ef764a60f864acbf4b5fb2684a491ca99f97829f6629235a5f9372bc36f14cdfa1d5e30c7169105962dd4accae08608402963f923a4ad60cd7d19d42c128a56e42f855b2d436404338a18c4b1fbbc4b6bc73611f2abf169e0eeeed31c721709608e2bbced3991eefb8ee0ff2f1bef81621635c9f87cd0a4da25b8e8b1879c5055526cc9046c60c5e44b68601e312337b8612cd82ec78752a2166ac690111509d4d7be9fea1b5b51ed3e85948353b05c9a62ef72d987995b984af0b5bf7fe3e536dd029482d5061efb117151f38750d04286702df1dac7c5aa2b29f8f9f3075d6c93d77e88c8f54848b010ec6fbc08282636fd8d1878b2a5540c0199004cc14a99ccd417e580cb898cb183b2ee643ae70abe608b1a8317b3305a667ea68972176b16d0b4a6c23ad7ec74feb8ea76eaa409a24cdacfe61f75bb6d6119f74d21899ca3b610d5dcf7094d133e74c53eabbda05d1a291d2f01157d6ba3ba011a50d9d05f6bc430f3950ce99e4b4f50125c3a9ca06e157d965a932eb23083661bba9c97360770992c2024934a8d2bd04b0d3633d81f2d49516b8c8410f1e1ebc487691629cdfad9588c484548a9dd65249e53f11775cc139b8d9c22d66914369ac3cfe18a04f183d76e62ce15c1ed6cecf7ba7d7ca0c2361228912e9c23abdd3694144d0d91725ca1c3e1f9cfcf53a8f6ffae6aff69aaf1549447dae4bbb0122c4521b8660bf164d45d962f39eed587448945fe7afd4425da513ca97ee5977146a56d0c5c5d94d2c657a0bfcf7a36807d3f90fe0c3df97d0e960f39491a2aac47920b3f15f2868fb9a5a65b871822a7b7ef6a48fe8472f9d8ad04861c5bb1ac78adfb182ef14afe30aa235dd44b7b2e00d1db06f1806b62ce53ff9b68fb98ff1510a12a53c155c26ed9c9e5fe517b8ec172a66ea8ac11d29b48f6802e622dc273012b0b306eada4b50f4d5aca6a0cce56cc8b325c1c318ce3b64c212644e62ccdd97c26a93b92480fb3b70cda3bc67160f65b6b39e2aeba6d2a2f40f62edcc5e3939589b71d82b1f21a4380c41a14cbf070da558dd9d6c38983e03c0b0aa45dfafa06087066f638b56b1eb9dd755f146c723490021dedc6185d84aadb4c6685521be0509f2ba17c548f0b0079b3dfbec999b59c5b465c0685a4a162573dc2c6b6e6e450b535afbff1a7614980fa3dfc9276cea299cc7e34a3f5f2b3e018e0a94ce93435e5d0f8832f229a80afd8586eaff97f77ad2e55dea3eab2a84e14a2354e42ca323458c46d495040dbf6f7fe17c67bccfa107378bcb25a7c3506a03ad7b48fe66c8dcd650076b166422b9df75b4ba875012fa365fc34de07376c9e885a6f0e8f7250c6c2a3d6d3ed14bc8da721861d3386753810fa681c4e74c177f229355f4c5c725f401205d3a977328839103e277da9b2e35c10d1276889a50c968bad4d736c8b930f8b0a26acc152944a89ae885f5e91a62d9d99d203841d50482290f4620a9423abf3bce2cc1ebaac280bc12fcf7e61aa70c811b52e3478202f8cdaa2706a78c848b409f811881d21071450eb569bcf2afb3c897bd41c2e476d21c8065f3c160982fd0e28a4ec9d5939a26005ecfc26ea848bf6d109be2b0c6db2cf4663e571b5de386d32501febaf652ab7d0d6e4b5d7953cd9640b7eb0b0a233b24fdd42992bf875a87607226597864104499c326c4ec3c4b901649554afdbeca8bd298e14395c3593518bfe9f8bc4f170543d0781819241ce2fdba67dc3ad023159dc08ec1d4b0cf04632fee2a4338d7c24b2bbb1b53746f8a675456ef81ac981357102d622d9ba400db309cea757ab2907f1706b2df9d4ba8e05b3381ba4164259b27e39bc99f66b87cc0a2e4c7a4921d5f46e0d892203fbdc104179c6e1108ae91117cb3a7ffa68af6b25b5694c4f0555b68954741db59b420d6aaf5da1494d4a7e8d53e8c7f88183d7f89ea9e393aad28792df8e272a765e012b60189b93339141fcaa8fb7aa9eddedda5999b4f0ba130e725db4f82a49a91c62d282657b9c91f81e46ea8b18a7ed161adfb98198a80c22e176c286c3379f4683d1e86046afa35488145759df70b840fb876146f0e01fa37631e800b08c876af3d254395359e6247ad9a2e4ed59ef6be0b1a98e16e8b62859417b9b38eb2022ad3612b8288746f90e54f7af520bbc077380caa6914c45c2d30ca40e4a3505bebcdc5299894e4fb25119a550540dd2296e6ee929b7eb0c6f31001087539f5fa3fe5ac79879fc22234dd5dfdc6cac91d1e3e7b33d0c37bbd237a44e3c94ace7f9ce18f0f7d8de0470ee3047921e1d9cb0761210f54ea757c3d39de480b6f83d54004308a3c8fc57904ea5311ef1fe84aed1ea8a179572b05194ab5471b19e2b04b3a07fae6d04edbf6decf3207d1d67b8fd2563b7e3d1c6d5999c2f828f30816574a13a06a0125247c6d4f80e17721eb10b5012997d8f1406e2321ea4e44087a57bbace6ec329f98f48759b0738000873810ee98303073b68f7890f671ed86abee0ad139dcb9217396fa676d844dee06392393ec39e08f28193f9207239a80d61d91800e04047738fa4afc983c047f6653880d39acb03311e4f47e029a363189c902557a8fa5cc00030f9739fbeef3197264c04003c24c48b7b90fe8f4b0b928c321c1926a15ed1ff8ffd022740b8324a21541c28188647e99a3678bed792a23d9ff00772fb931c92fc4a7482cb28fa61542b2f4929552353a5568c222266cc429658fe5ad6b6a4440a00b808ae6c1cc95b477a801dad23739dcd9b7805cfe5a6fe72be5795e9c96969c918692fb633b23d0d087f909cb84553e7f25ef9d1a3ebb04822ed8258d6f8308e38d051586259b101d070f69f82493eb16fd021bc7ac737f6a4de5618c6428e2718480a42eb512b009368ec61dad9198371bd130135f8cfbed182cbed89648022ea545e50227700b5f8a56788ae8a1832453cf7716743f184bcfd84a002faefdcaee2bd547fabc64093de2789c7b31c2a749a27cfb58f6ffc8e07364a259e5bdc0ea2b7f29141282705d20b78c216ec179086730cc89e551c9da02269e586600177a2dfe098a3ebfef70744391cf1ac5e1c7126581d4c93a61ced9334dd37b2f63a000352ec66a4f4c020d2f01da0cca789e0b75d8888cc7d22b31dd187c0ccb329d1f8f4b3234a8b0f59fc7cc44fe9266f1da8de1573b26151626f0a0856dc626828e4959a0c60192fa78acf57b24b6cfd73eb9f4461dcb412a09224a5bcb7d52754e1bdb56b472db6a7e6cd7225acd35da1c2b38f49d416a7d989a663f81c64d5d56405f416bb9c94cf27ad2543300111626365776efe402334ac476ac89b108365131ee44d26a07a68616d12287893518664402c47321fdb774a16cca8386b90892ce61d38202941dc1311000718564817bb5c0e787cfc951e22a459af66f3a707e6ac88d63bdf1dcfaa2d89cd168629979d47e55ed3d7403a01372f4d486c501dd7ab83bddb47c287027fc20b55a52afd40b6bc5c3f180e46c95e3ca4d0897d7398ad5deb40a6be340c14fd46ccfb6f01626d89af1751adf74bb89a40224f7701de168a500e883672823c31fb66f57792c6a8ec3fa0626b96f7880519893dc318086e3e830208fc935d681381b5c6fb817098684ce7186364aeee0c91f5c641b4037d43741ddc0d304dd3c634a6175301b301e155573ea3ff964378ba3ab1e3466108d871d12989424d5cf1f2c71e0c94d19d38937291696c3b93a3556e95281d60d011bf4baa84beb2e7aa5ecd957e448112d0cc49e31b9970f4c1aa2e395f3f2be53fb3e5bdaba799db65532f3c538fdd32642d96bb22b62a74ff6773b4e86629bfcb805cce57e25df63b88bf05d55ac859914b2d57844f4e3974dcbf21a6fb2f41f128f461d278319ae8099ba8107c0520357c0a509459bf32fc9836953274ee21e77d163e7a07facb80a5760c0fccd6601083dc3370335e82a1741b4f0d95ee81f8b0bd2d99bf3d3020aed0cc094715257ae54876c86857aa76fecd031265b733741a7dab05d231ad378c1edf620bcf4c40b71ce77dd1d64e76333f5bb75009f2eee39da9e650f7796abdcb6846e845e85e74131f342bf816ca6537d9c3026e3ffbf7d79dc591d4cf40d410642d08db0a406341d05c205a0b40eb02c8188a5c515270c202f7d3dade1e933f7be49475ecb46732bd81d1da199acb0326b629828afd3366669a41581e30db11697173647ff2e9a0f8c400ed4185a5e63456d831793121d561d3fdfa897e772d94e5f2f3a15c1a015572d581dccc13c61909e13cb0ca51f720a8695e76c02ef47d1f7de6b89ec5e968f21e14ee8156f3ca75d6d3e7d931c45aa0f8045b83ae350d17e0f05e22d84eeb3deda34ee2fecf993f1f07df41661c3314fd4e8b04a6e5d15178aea1cb60944a2f9f36f2fa820434eaf62b184360e2f22d149e78bef5329fa5a19da94829ef7203893a6e0fe2adc3d4544cb9c37bdb4821f52444668032efa602f7218c7e06ab853443eef8da52e6d22161857b362b8a0a451515c5d3a0bb6ecf80db93e6b9e6e46a8cfbd67c7e16b96c2a5f36793dd72b99f89a9911b1a0aa27e4de7d21ceac8ce0e4fe62ac4d65368f1d106970667d3b402c6b0b1fa4cab38c2ebebc6eef4d006f10d1a80edf182faca38007551a4c3552c2cce967a8b7b245a0718dbf8f2f965e607665fc69af9478ff875e19be031484ceae7ab6ae4defeedcdb25bcbf0d81e892f7dc5133786653a25611afa47a7b3cb5975c059152c1e9640c05777950c5133f76fc734a9228842a8640ab0994676de8efa6a883f491d7112351b8d81431fd46396f08d8493cefbcb43ea1a028ff49d052aa5387b3692a00e6c1c5db02cfcf904b0b8ab4df39322e1fe8123d60525c659c5e8502d400edb51b1fa76440d3effaa9740f1bcc5370e0da6fb6708d3b2858b531f742cf4a54a244bb3967cf1af5e469c38f14c97efafd35a7f97a1a1d371cd52b0d4b74d2d4cdd29ac553892dc2e1622ba3fcb408ca334965501850be38a902e4f14d422e65c7d10faf40fd98ff751ff63df6430aa29770f31e2d51f10d337af823315dfeffd8c77dc07d90c15ed932cd84765b9f479b570502ddc9c24393b5965b04d04f0ecd6e40da22b9594f5ace0863960f2559083ec9b4e6627d6ac0713a3624efa6ff931f90946cf8cc23a621769888b0eefad43f904dcd6ed3e6114184b9f854bcb434216998b8f200e2121dc575410a9786e08a0eb4b6c6f78e5a057f8f3e3fb4f6b8ba71cc0517aa7a9ab01387ac4e1644fa2397ad2c1329fae422a87e28aa8f95a37b76bab32340422cdeb88aebd4845e05fa6eda3b7ccefefdcdaeb3824020b3efa1a6437fa2052ab732d0c8634e37fa4d5e32c3eac743baf895caebd663fc5f3744240b9f2d5dec7ee4673c521efa532d92600d40abe769c566647e0f37aac86daf67d27cd393637e39a23a694c7377e8ba87dce197d653c0ef155cf7a575186cde1ef2dc93ad472212a2af05fdc82dcc64e4b07ed4da0871f971e19057f3c78f7372d0bc043f998acf0856389c84334a5fc672d823c6cc41db2ed47c8bd3cf20e8c519044eb07dfaef0dec2659e910dcc94a927a0005ab9ec89c5075329cd967702cb1d7b52e80e95042994e02af69bf408d623d4aabfa9a236e6dbebc0abd7d97d068129be05043204151918f6e5fc422b2a1a4ff780a1c39818a461a10e14626d8eb1ce54ba6bc35e5905b4abe8699d35180ed491aa75bffff75103d74f61d2a0883057947769d66553e1c899940670cdd4c4a63d08554cc4735cd5708899b66853dba5c57eb1a19be715d868259ec511bbfe4c8277391fe44545b97fbd2e4569a08f357fdfa6d0903526486ecaa0e25b665fab2c753a26e8b205f2646397be12039fcb7aafdccd6dc95d414579a5e3aec91c4c4be57777c35ddaaaed33fe2fc02ba05acabbf071a81dee6a235fcfdd911c379c57c44db6f1189ba7f3b3bc0ba7431eeda6d235965a165666ab20fb7acf114b069388ba48931497e8928d6369fe6a59d3fb3328f469dd063e034e5a2250b807fa5759326a713a98a2101eac4a0a5186b17b686d67b430fab3a1ba98e9479989d2a4c7d74a9bc85cc214a8d3d4d4d154d15bfd529321b29b81ac44f8763ef5cc91a0128080a8f776778926e4d5943f2849f6edeaa295753ca6b84ed77b814ec531edf676770ecfd70f67785a60380bca750c9406dac605dea8a63d8ee4b28e5b1addbf7674611a6c26bdee6271e47c5499d39de4e5e83f8c255f1aa833f07cef3fa04e5eb9933f6dc146f17c48ea380e8f7e6a632e161865c78f4f75d03fd85a660c3b347a8941853ad4ff4c9ae6123cddbfcf56c3f114010d74ae8d9aae7457b60654aa26386a8895f7c9d9c6bde865764ddd4044a18a181efdc328108341545abe93c5d3b9af7f61465d9306d7d12813ef75c40f05224f0e739909d5ef2dd5eadaa5b9c2a0798035269a353bac003d5b5c26a75b8a4754c2bd5b3c9212aa1d27275c56a93d97698f626e4540e935227448a07cafd9aee62e1c3a53bfb13781608605cbcfaee925ca03f1180ae16a3cd9bc923dff53b018eeb0826caf58bebd889653b54c86058268eb23ac96a0436882b09ba3c42a356699fe97e7c6e573827df18b91d26a4762323c8e0569ef622c8a36d35cdf9855143d0596871a3bfb8e707a56632d02ad25f84cb7bf7c470facb335a81da2fd14786005a180ce0f91bf490f4eb3e1425b5733ed232ca3f796e4a27895c52ee8e3974a4830e76662020f65a580ebbb035b654581183d131cb0c2b9b7df606e8ebe2ed35007f4ecda95a0772af1e4ad671e881bcc80f2f353f6af149e9c768280d9f2638a5c7a27e8f12cbe257a93062204c34a9f45049efb5088d12423d1e260b11f44d8d0399ae2e76b80d8e19b1a95ca75d188f666a91e5f244172040b10c2dbd2ec55e6b404c124a50129a415ec34af8f1554ad97c9384c638bdf69be9e609771894d30985e30eec57129c27557cd655938c1ad2852df9bd64143d78487b70040d1775957287933294a71673c3dbbcc4e21a67aedd8da6989e678624e6fab649aa6bd0e675cf179f48b555c7266a7aad821c4f031c5164a33bac8df677e3c7a0d825b77eec8c825b2280398936d183de8b63fb8820f5da0fc84ba0a49f277761bd3f79673cbeaa65a36551eff73780c884ca0c343743aef91f2aabd7015f0e96600b855735757212fbf41448048262a004e854efb886ba0c9cbeeb6f8903834d80d15aa3d7fe02d21de0a5fd6c1f9d78f81ee1a9a047b16d85c70ad1b5a3bbaeffb001ee92546ec1716779b157cc206dacc6e53c30b053d211059f3202a60e35bfda7e50c7e4f2ecb983a2b7708f7200d0770900d5d9d43c4b097368484a36624a3ee8b6a9d13e50a6df02c0c16e60637abc743d0f61603bb118a34c5d775fea4aa56eb273a585e2991321d911d0d666de2170d72fa37543a60e1f21bf07bfce5050145c41f38d324ce994f7f4fa29a27239ba8741a2285e809fe51efe3b13252a227e20df70f11887537eb8535a78673f1f5fbf9a9d845db7a79c5f36d4d2b756e380ad00d1ceef4465a84c4528a31ffc4677864bcd0d7def4b1545be845636dff8423146c0a9326d4e3e410cd3d478f3415069b879f17f8fe88c2a3859d4fc9ed231596bde568d47d51feb2c709d424d16a37de0a1e4cc6fd80bb71da1a1aaf989a647df2dca58cbc4ba77865403ba804159a62622adec67fd3c439e397f9248eb67d1ed30b46b841d2d7e64df76b615ed690526b829f5edc8f4a8c690e10481c1f4752cd7cdca7cf00f712997f3c37d0676c0464bcd652ff4dd7201129a0cfd67b1a6d22e47f60470f511315fd7533c6ee8c1a8c6bf2ec434ada2f0024001d868b1f070b866faef2f98a70104ca449282995fceb01ff72831fadc70666597c5fc4f4b1c903796dce1b23e6cb75d6a78446c5a30a17e6d0b952bee182a46787a782f7888bef1c9c00795930201af407978e37910314901bf911a314984901c71dd2f00416fef639d730af82c48f0113811d412278cf3e223ef01d556fd0bb8e0888b6e8a0742ab6335b3420d930f4a40d8e0807fef74e03bb8c0c31e767f5614a8ca77944ab7f1a806c8bcad9e3d95ea5093fcab8a197fb27c1eb426ad7572b3dde9b313075abdb10918a973d03dd92a9003182e2abb4ed071d0b6ce461a01303e0934ac469347fb8020726784e47747a5bbe1e92cd29faabe0a042edcf077329b7021802b17a2a905e1c08e06a08cb138ebc826ce46340748b8d128d947ca10fa91f7a5338aad8edf878532ee5491ebe69c28955b2c7aee1839832c648aa9d0b419fb1be4d546d7bd9995ab9e3a5e3d214a525749993d5fd340b59b9ae8469c71cc3478dc6875f4142adda372f847ba9d2c1c075c169f947f86185f79792a89be2826edf0633254e16bf87fbfde4437623974252823b5ac466a84d91860e4c39faf97f6d3cd09c89f7e8995760b48616b0230bbed383333d1362c92f91eb9774b766cc453c194fa36bb128134e547d271a8830c00868616bb9aecb374f390a01e657d2a40d16ce4809f259b00f53547b2d8248f454c83b87aa9e3e6d02e5114401ac370c63315fa3a34f6b4a0428495a23c61d50816324f60de5803438d0b068ff57f73f904c033e887f2418ee491dfe564bbe754176ec8809903f0e9333c18f9e672012315c0228dc20db5a65432796320f10fc79e2c8ae584a2748fbaea4b88f1514937e82d1595a6e6904cb376008a8ba6dcf164365aa4acf5701f43440b70895b3c7381a1ae0ea1a76eafa96f2e454a414f1104bc5b4917d882e1aab705ee0ef37ffedb19c3136885877c06dd4ca5e0a52bfd9846a9ac201248c1ad67ed6cea7cf43809a50ae4280c5d2354ea40d777f20e33a5dbddfb36cac35f490825f85913a20bdf403f8e0d51d00b028b9c584052140e464e194c5113b0c321104a218ead76bcec144cb1f58f1275b2cb4edd096e5d17668a1ae0d9cd0d285ad7aeab226e77128b0555f71abb4130ea8b350dafbe89b1b42146b0f18cb7b651492730fa13d2860ef12d4c459e255584dc11e2dde9b2d5a64a7532ba28b9c35d1740950db2dc35f54f307ca97f7558f63f8739dbc1135065ba77c89f9fdab83e1cf6d577f47a6471cb9ee3641acbca5d5ab3a94708460f065a27b027319d87975392ffdcdd90250046ed894fd28c3ece9cc8b139f7aca966dbead74ff7f6dfa80841686a8fad4c9695631d928618d262a6c854d586b6bb247f614ca1551fa583865d0ce2e1ed1aefb201142d33916430ce27b4b0f9957a37eb42c4399c1d259d47a1258a258761d48064d792143c5458aa9e4f0a0738fcebc90b051c45e0c921c2ce2e01d376e5302a949fa0aad91118955131ed4c682a9a91ade47f1edf317a1d9500f0bde6b790fd766c0cec49ebc4e49009741e826c78179add1fed36cb07b19e93d3b8e4117e7a680d9f47a50fbeb9b685a55ff876dd215d03581c78d220730ff1a1cd63e83e97c950da39b146d39bb4b4d3d408d929b26aef744fc33f31954930ea1c59722495570a8fbec402b95ac4a109229ad86fe9a5d135b76474f524fe9f764e1174c7e200bf72414ed49a507c30020aa7395a5a304ea99b0ecaf40a3c8f7104c0106c0d1c2ec4cac0a3207dfef6c0197805186723dbf01a507fd2c1c35d050632005c773a10d6932aa802c22040b7a49a48582e95f96eb678d011b4ef9b39b1bebcaf977a08d95b6e99e49652ca8d05f0056c053d2365c89c962e768c6d1b638cf1d40f2e47faa671b4360326d128f38bceac1ac836c6326843483768fdb5496559366571ceacac2ead0de2272eae91be691cade71716409e17a535b82054b6aa27638c11e35f15d6c698e862273a75e454af9a7edb9b80f46e0880ce18d26407d9634d8bdbd534ea2e20910d1d9dfa29f12aa34a2df08f2234a02e1ae8739ff33500d51b474d5ac7ab785d1255be682a25669efc68f4808850adc04069c8a885b2f6b6ccc09e2fa17531f2422686c80c93313dd6b400a1c614af4e1dd96c3885494a52ce88c1c3fe20fadce7fc4b79017dfaa671f4d4378e2ae501e2dd30c370da04a8ebc6f8e165513de9882ad2e3851d31d080c420d59b048e3e7dd3385ab751c306c7950d502aac983ad24fad140e72c0a00244828a56f6ac273c2377d0ce38d2d36fd158335764388636b051e454c3da12327e60c7182b5f6460944e5249f606895acad14292a1b01b8410e18103489493d57115629dddc0eeeeee5c64dab868e252c585a11d9ce3071322ea43a01f3ddd335d67bece809d193b53e6397cefbd370f651287adb085adc0186322bce55f48e190bbbb238d4065f807749634c3cbb9867c3ce65111a5717e4131407dd3385a8f715da47a06872ea97055430883c9ea66b841160c309e55561155a13482aa6ef6786828f92f4acc028961bfee60563741b3f2c80d345ec0f0c28e5b1cdbbb6cd9f8b9bb43153585eefe3840376e497cfaa671b4c6805819af183b987a356e3c1d6930c584f9aa0a7a7103900e6b03885051c6185f8c313ec3647573df1b8e6d8c872678e64b8fc180dddddd5310234c941896ac1043851a67ceb2c88a8aae2fe7eeee476355378fcac252f36e3cbda4cff1be2c560b594347b98c3187198221d908366641bd116d943cf780212c63ba84812aa56cd495a57befbdda8bf8a6bb4b6d77c718638c7d8e650bb30dd3ca615b39acabea727677332ec8e8e831609648355d1d6181fab1c5fe209a6384924081c2066a852d9606102dec73c1951f971d463d2aa819585660f0df0fa4a4d701bf4c1017a0e6c0aa14c41762b529e2d320a85dbba8c3cb2f0b97ad1a943cd9707f40aa8cb4d66fa1e09b679aa0aa9bbd50493fdd7054dd4c435575135f5c4ecd9d2015e34a500c45d610c92813d2a0cc8945ce39e73046931941babed0b8609dd21011d3288901822008fab442695eb849e3c50608823af57a8d33c74138e9d501e08e00264869fcac5ad00082d5c9c6a323e64927cd3327a79b21c0c7b971a06393c051a74e711c47912441bff54ab6621530cc17b468eaa5d142f8dfddf8b49146a38d22f64b6fd0c9c9e96688fba2a86387eae7af6f458cc3c1246707febbfc22297ead95c85f7f7c91ee4c9261fd9963d18c5301fa899397bde3838f73033bd8893f921c9c69f1c312e25b9e1147b748e619e61cb0d21014a4254548084a14f147f1a728fe8e8338d2eea53735929ad59cb8d3d9e248bb17577b352752fab46b86a02f3a597b544bd31eac60052b582d06bfdac794acbcf941fc2b453b2f5f3a3ec69da037b813a0f8167782d6c40fc72935277e4512ff9274abe6c41f49aab502d5b2a1bedd2cf1773a5bfccaab20c40a42fcdac3b1c5af4a55fcfa5441f88bf845310c4551b4392269a25ee12c41415a52761cec2c8e6f495a4f63ba6d8f71351b792302dd378f71b49f37249d527335211d662fb0d61bbbf1873724f51a29146dfbbf758a006e4cd2ae28fa6647bb6c607e8a3b41c377dab5a353327daab9f02b52f836fc1cbeaba0695768f5ed6f56f821fd7062f920db61183e15cb0949133509ab18e7d4cd1d0a45b71dfbe00bf92f20013f1b301bb0f32141ef4aee54000a856f5fe88642f6859c2cc16157909c3301f36b6d043a774012e8aeef03bea520e9c3ea707382170c68adb5f373ced65a1b6207a7b54e4f543d333331312f2f1b921d568f299bd6138cb3da5a959c5cede8dab6b905520a82015867468e0c5df96d8c5bec985aeeee3dca9404880d4d15686becab2c4b16334b8a6b63bcc19414a20c3606a7b2ea0df30b1552244c06d8565996bef9734105566df8ec18d2964ec68e29989998a011627afac6e30791bbbbbb3bc61863ec2b7a2280fd41f4b9cff91732b554bdf0967424b97283c8660dc155498ae6a885c516ce37e79c3fc4c939e7ac556af1b492b498b4a2b4a6aa6eba8e8c9b6fca9f8e6c6592ca3095892a33f54458672a60803c2bb6dcdd913c54fd983851d384a33988484d65ec18638c795637431e635614a950866912a5c90cac195b3d3ca3cbcd98afa6a9444c154acc27005fb24f4cee3d8aa95860491264c4fab67c5dbe2f1f986f8c727965ec18638cb77ca9ba294636628bd97d9e145108f7de7bc7808d191b53165686f1c292c298700828a8518388113434aab02c13b1273531ae1d62513631204c2d6090a46f1a47eb161af080e14a1ac41812b44307638c6b78dd1a5fb4989d356a10b1bbbbbbedd9344737e8908a41680cc715cf9178553791924224268d14757b1f32d3b9d9c3af32e7523a179e7349722e4cee38e79c7376c718638c7d3e1e638c45ac1aa836c6f94a11819924b08029f52002c2c28927c31483654cc4a28685bbbb0d44aa6e5a8db021cbc92879793bd55b41ec1905197bba3eb0a9f5a246162c4d5a886161976cdd177cf52a0a0cecd1cfd76f0d71fede7b57b0b2b2b2b2c23a2eae91520599608c31eec2abba99148ee8c2a46f47faa671b4f69dd5848c2210c618632948ac6e86b627ba40f20232418a2e13a6aa9b514ca63493aa1b13249f9b59565f805c31caaa42831217387871617dd448cb488ca864a74c652a28a1bbbb3b550ba07577d7a25475938496a7502fd1f285880bfb7577f72a4a55379f421c7a4415aadbbb635929dbee32da60bf1e667777b3a76c8663a2794199aeaa1708e12083d346cad01603d8c018e3a5295537b9422f4d62e9cbed718c20207dd3385a6f10e3c863b400aaf118638cb7beee1698f69e7e30485795c53f881a12e6447d427a403ea8617536768bb48ab68aba8abe8ac046a0c7186351c84a44cdd7875cfb91354c1b4015798b5966ccddbd68da4046036fa98d95b0aebf2164c3094775b050039903f02062a5e9a6884f2a09bbbbab505675b30c793ae9c6f451b9a9aa9b24925485d083969f94a19155aa774d4eea5e230f14c8afc88c2ad7e747628b15a074689ff3b9cff9f751104c076632000aa588a48c4ebcd0f891850b0b5b4a585802d34c49c395c62bcd97ef5112512803a822dbee41d58c560082b66c497991e48465adc85c602d614445b60124e11a41553df0e9480a0cb2740345e43e30d19382749c8889161d4a5668e1826507afb0b1951739a0367e1c102fda60b9a2424d95a6243fa08c5c46334c1256c0b6c66846faa671b4c63d34b34c878e9565898431c6582cdb13eb47b5312edb226a6602f46395064a688d911a244b2ab815199a848cd8dddd5dc691f75bc7dc3137ec86ddb07bc52c453483322d6de7b1a49554966511d5da332bcc96d606ba28b548d3bb02e382244c4c0e33f303e4e9f1e523e902398cabba03461908c38ca753795637c31e120661aec26885d90ad3858f9072009e8eb2784947786940de1aa6706909060c1830b63b908d9c1f223c7efce86a01c310216ba4ca05de07f735d5a2b11fa42d339aa86013830b4d11a3add1480b8bad7c256abb971b4b94c572a3e80a88182b9489c95163ea8ac82f8790cfc66760c20d3698311b6a12f365086d4bea880a349a3a9a91b3dfc897872acac792d0c79316e3907e4b7600da6309979a5102467468b11102c272460810164be30b215978e878d99732b132b2116566b7c72b3ee78e31c61813d1b01968b2c285191c33a4f90ae243065f53453a32030d474361e08c290c6654f5fefdd6d68055dd1cbb23d694dd1166e56359b162a46f1a474fedab208b6ae4cb08989131236547ca23bc1ca39cf3e7cfa0520e57d282939cfd54207372c6a20a0dde325bd2378da3f54f53d9ef890a265778541608b855caa0e2eeeee5aaeaa616092f5b41d2fc909208c9924189fd11f6956574860626173fab348e0f217dd0060ba96c48c891b2301f555f4a34bf6bc1f6ddfc4951b251d02db5627ed9c193f4999f8209346ac0a0c2ac0c2acb9df93b9fede4aefe08d2aefd5aeb0002b03039db993f6b1de0c0658b8e364067673bf345545bebf5acd18220c5e1bdfa5eaf7e7dfb5673d7631841bbbbe9f8dbcffea1dbb73700dc7a796a51e6e04ffd3b74008ffc2f765bc98cf3670e3843cc107433a0e6ee9f6d1dbb0b6d56ba3e0d731e541060cd857f3f8419e27fc4e9aa0b5fc48555170220b40eb8555df8f76f5f009821ec9ebf2866db71bfe72fca94ed41cd85e177c06f77dd1d30397f52805484eff9ce0f73eeab21e3ac20ac05bfbe0d8b9ebf2a5cdb5e60047b50085aa1a2dc3d3b16ac6173b6fd4ff8d94e9e70ffe24a088356a80077286c4b4248ee50b83c20d9e3b32bd6887f7cdadf0f71b59f338408e2ded13ebc3111fedcf317a56cdf891bc79c5fc44dfaf9336ec4d1682388fbc7175145d891d2c6df381634edc717eb2e93503ff7d0b33c3748a3b6097c1dbd25ca56ddb910a8a18a714e3a272dc13833075acd8135377178e063ecbf0b0183d885183f04f07ba08298bf28541b3f08bab0bd8fafe8938debbe41d918073f6de6606aabc66943a2e78f0ad8de853f19bc76ad6109e02dc76b5b6a5140b7ecfa736ad75a629c1938691ace9e407d3bed6b4b8179436e30520ada9cba1bed6b8dd99dbaed161a8d81ccc6902e1b8abc6811b6336b1c6c533f284c0ea87457af4d49da9e3f28bc4d6d394e5b115d435a01c669f3a1ebd36e648c7bfeb492c8aa70e9521ad172e66867d646fa965632acb5993958f16f15041e71ce98a671465a1bc16a2177b417693814b64e6a6fe61671bae68a7e6756dd0ecc79607f0228eea634afcdcca186ff411476cfa7e4b536675f1a6f93d2d436a577e1d5e23d417271b79aa336294dbf9e30ce1fdbc1fc3d99e2fa39a9029f52902c41df56dae4e7246adf3d7f3fad3d31a0a2e40ab4a5940789253102aa273b6725c39f2626d993c29ebfab4f290bbf1fd59ebf5f6f83b0e72feb6bdbd1af7fbd16f0efe0a493e19e3960d36873d226e8efec578aeb4005a573040b5eaf6fdf84fd2aa28aa8361b7ab4cd0aa2da9fd59e361b93b65fbf2785d07eb576e2c699938584b683400e021e6cd6d4b68f63a7ec1d03e68395f6c3a2daf369ad3e48822d8cb356ac2cecd741a1cc239479867206dac069888fa5710aac0a0c89be4969a254c4071594145596a58b30694fac2a4492ac0f5eb652257a11f342e6c5ecd605e429c3a2e451b605c66ac7a36c2f8ff09adc7b198489859185991df9ea994d1afbaa395c108d49b4ace8c754d6d44207064a8e646810a4288b08099392fe6acd40a03eaeaa94e17861f212e565ea627777f7230e5249d8afd3a99cc1f82d7b343538d450a921a2c64a4d163eca39e79cdd1d638c312ee2e351d47499906a9b28126da6b274c0e30d8dc05156c368c9b775058a568f4d150f638c87ae13b0aa9b63978493b29b55025fd0231ea7f2cb0ab598bdb22f44d644958d5122a20543ecc22843f42098d5cdd07b68b0143234635ab4b082cb90265762e60fc7540e14344d54b8aa8059da71fb643bf8c331b6c4018ac897f465289422b23c9d7befbd4b94aa6e3ee1a02232628915d6b19265e464e316a2b8b802b388f006102348df348ed65869b2e1b9bb0f6d4065fc56c821c6c37771c618638cf10c65604a303c304960983c7773ce3967c718638ca588b05f7777f75de5ac0544793a496559b6c813cb8a6963ccdb9f73f4b9cff9bf69fadce7fc039101444626e3d2c21813e99bc6d1da07c6ae996a5395411b2c1ec6180f8dcd6003d25041e43a3768bcaa6e7e4123a6d190dd9e36e1b9bbbb4b11417970a483c1e700cd48fadce7fcfbb05f7777cf2bc8b6bb2b61bfeeee9eb35e446df7af59be90c822a689f44de368ed1863a2b1aeaab22c8fecc49ac2d43504e5824ce59e954e5cfd91dab8747d7a2ded82b47bebdbfae3ad8930bd1ce76eeaa693d43567806d5b18a74d06db97ae40f6fc6189b12bd49e3faeb29ddbf3c735550205d0d89ebb15b47062b37d69db64cf9f962e9b66edf9cb42637bd8f30783135a1b41a4f2b57b44b0c768ec9e146ef60e45972d37a8bd4331053576d93b14475deede9d0043910c8090646bef4e40b2b56758967b9eedf97b7e5d1a7be8ae324cd9b88dfb81d9da17cba6e4eef755b6e9eea70309178b895d0a0d68ad650047c24f0a0dcaf6effa5836fd4d02cec4bdd6fe08f42d8962dc3f19c8368aba53d06dff07b72d0eb72b8a715b1e8e4d6de4b64febd3b74bc08aa3d8f6829ebf2a4a3b143fc4edc437913ffcfbf8ed8f37b80ebbfa1d4a88bb923db69d8266c375b879900696e51e1fdc768f75849bb7e1f463dccd579ca5d970e044b36d38bbd76c1baeee11ac745e0cfa0ded316eb2d9b67969056f6a6f778de6b569b8fa1a677b11d686bbd384057e96843f435b8296c01f76286137ededa691bb1fabb2dcb8f1475ab371e9f16f70e3abd8e38f96863d826626d93e01ef14759be004dde383351edb0bf4f8235813617a5d4b29580770337e56b962dfe074f63892b59ff38338d69e567776e7a7e547e15bc48db813b45aedf920bf983de4ff4933874b6e7b433158ad46a3d56ab55aad56fb995363338ea2388ee3388e36e41c8639e71cce10f935ad619cb5d68a6bad389c1ff0539c6d896d89063fcf103ce10c01364edb11db0873e7b8b56eadb5d6f13b8e363fe00f6d4af4fc5129dbf7f1d366087ffc35af3ac671e286f66d126db2466bf383ed45d489a3cd0fb6af389b127df3b5a7fdf836255afcfce1e3b729d16e6db6a7cd10f56d5fab362ea3fdd1e26c25f0e3c776560e5fc3b7efd6864eb70dad257f87a489f00221cd36b4d6862fc2f6f8d00f6bae610deb535ccdcdc775b0958ad8737ad8e1a7e1b7b8b9f1091434156c1154e0c703c6edc23761df92277ae658596e14186cf1ad4541db620654b0f3899e09ec3a3fd847e1357c144e420876fe0f7a2610e2c8393dd8fbd6e2b094f1fe7833075d7fe2a73b1f3ce79c8f5f84c53d3e9bf6d83d6bf37b3c5071b6534cb0e6668de7a6d0bb04b054b177f57bb0998ab39d22dc6513e0db90b6ab95ec3991c237fd14789ff0b329c933fdab53b30df6d82b5c0ac7b93fb9ebf1d9984e9f5a6bedf1994f4ff8d9f32b9ede63c16ddf923d3edbcd48d066b459e97a337f5488504a47a0ad683304ddb419e204bdaad95297a0e54e33d21f6d73832174769ee2d39f1f74c012212e0cc55114213fa57b9c359e99f38fbb9f4d330ebca5a07b9782ee9c414af6d8dd81fcf9613edd212e9326c21f1facf584db7fac1c680fdaa268fb2449ff678b54f4016da5d303fd5d057e96ec393dd0cf2fc2f6f86c9beddefdec1ebbadb541d1f6abfd0fdb71f729d9436756596e10b6f7b0f80db07798a4bd9a9bbb578219e284ce969aff33c13cfd39c94b060d7dd8b9cfcb60873e88b32b61d3de0c1a08ba36267a477b336cf07de66bab43f37404ea48d55759eedc12ecc1e2c60a1b2cec040d7dd8a1cfcb60677ed050ddf1e7496087fec5f124b0e3e38303f47d34e0e34384d581efa48f0f0edca7a4cf5b1d386d20822245260b0f2e2e7450eab9f3b33485051a3498740939b33377e6ef7438f065b9430d3043ec74ec8bdb41d284f9c5cb0649df85197c134272177e0936c8d87632fc1d68716015a41d92523785bda36ffd4bf879daa1091108badafe3b90dca1b0ad09b34ad2f6dfb56083a1935b534ac81dfd1f151cdb833d7f5486b694cffc146c6767674f3bb8dc604b10203125f8b40c802f8752d409142a985fb65489002c4dca141108ba42a19c5592766695d4a854ec5a6a52a8d0d48c00000001a3170000180c088603922c0ca3246a363e1400095b864a5e443025066391401448210c032100c2000cc2000882400c00811c4f43f604e2c9a22acd41d6e453e6111736f9dbc763de3087e9cc304ca15d4982b23872b0ee37c0b40adff7d1d9f7ba59703244d52a94d8b272d939964333ee35a9a9fde57ef955ca7f6b0424514e288a1babe80e0dc022124cd76934895faec09f4547c8276b99ed3a626f105ea62d766bed37b68e21fefa567d3c6de24da90fe9aff077f5d70dd37f960fb88e8f65d7a435e978a1d06ef5ccd2eace8f380710587a7461cdd1ec9458df291798dd4b268e39befa11c7b73d220a6eeea70a1e4cabb7f67de162fa019e2eaa50b144ae2abbe2c464f6630d5641df37f3e1f9da9bb733b450d72aa7d2f37e092e2407734b7a36d6a11762b562df6385edeebb9e3f40cc493179b3e407c6b6fcba58150a35c6acaca6eaa8a896ca7d2f43079d3be6cbb564c65072b19b9b907be78b6226c8cf61c90ef6d42b81735c9c4a00e2c5fc81ab1f4fc2a14ed0a6e61d5ad97b4762108c9ce532d379b4b55fb9c3d6fe38afa74eb17aef86316d0e54e2123ef3048ccf742794fee50a4a0ce2c6f6d9017dbbaf5fa25671fd8a6d6b053e369e2463bc2f05253e22d1a8a9a16656346998b8a28ec3e746066ff0a3c77db4b8eee80346472f7ae42eaf0da61a2b18a1ff82f4297ca10766acd47d69f9b998d1113e379e2048241a39cde64d079affb442a706430051536063e0bcf9c347f88939c9ff576edabf0fb8285072cf8b6a9f2965649053ae64a1637a916a842433075e03f78c214768a79acb5069a149fc166554b2ddcbb4b072ee320120dd9491b60258ba70c2227999f1d3f93e921c17f525b584605f99a8310443f0dfd5b4697226ba33e419853fb06bf6568515f023efa580052ab6bc2076064beac0b19082828b90e3b237063f212dc00846fa7c9588b34e847c92a0054db76d0743d8016aa7fde4e790202d7d780094e7b136b7ba824a847ce7509346c08f155647ccb99e984d9206b558f4dfb5357d65c6ff424b38cfa67ebb90ba8d74874c78dba91c63451ee240edc6d2390aae4b6de8ee555bf8c3cdf36e7d8fbe1b7026b81275ec9f45298225ff58429ae2cd2262b898f1efa7d3ed2c477285d85c9aa0cdadeed2314084b43fe6399feadb07a3d61cba6407165a7171e6bbed2ded4b22afe238c699fbd79ec044d3b97778458c9aa1edf8dde8f10270b0c3ab5f3409c94fb28d80f4529087a935d64f96d924207a59b38b97ae84bbd9c32412afce933145e891d521d205a6bb6ef4d3daaf94e3e7cba7c49ea8ab75ee9cfb0dbea953e160bc5f8b9a1c4d14afb72bdf48ddd44b45e76efb6f7d3f687663108a84582413156650bba1a6d0cc77c70865501cb3d0615726c429adb4a21344e7bd89fd3342f173786376d822bb1a3d30f756391b39f42dc04d4731b3e514c40a5b22f94b88cf1e0fc7952caf01fad6eba1e7a0091c43ba37ed873e617e8323f0f8fced5e9d126a66693d9e0906102845ee71f22071068cbce4a59b81bf117b86744625e6ec1300c4779995b7214fac6517db19fdb4344a08054e0815b492476527a6b0383102ddc1a0108cb16ff4c4ae2ea2dc9d8e5200f962a5a74be25667076c448723185bb993bd1bf52020dd6984a82992f1492a3396bb2cf9d69c9d7c8e3a0f1c32dafee66fcf9dc382a4a28b78d7a3d8bb0d6ae697c73698c642362140d0fb9e04fcfb7c372d2d1799b280fb6fe3617e85ffa8e105eb1cbadd68e0b2ed578ccafb574506e9bc0d43b47514f2bdffcf593ad938c4439dee5c3d7b18b1d2b4d6a12710545cb170fc63ce4f4fc404666c12471449ed72889df0c4fdb86b2982913e20efe53a6fad5acbd02db773316688862c75a9e77841454145f9b9d2f923b9cdf52c229985958e58f96f99ff41cc5ac5841a40447d118c86a3b5ce4abebc1c941faad568889a95c6225e98c8d6bc63cf8fd5c5a3d519d376101f1f6734ecfa3f135bfa71c6ea582419b66861dfc5581f31492395c94e6901a95cb79232c300c2bd780da9ef9b48573c1a5097f26a1c651b2a5291967fde73515c395bd9eaef8f17c174fcfa45c9726d99f0ac297555b7a68b09a043bec6fdb478780d975ada98d0f2fb8102419c21de644f85da9a5720af92c6887031dfede413eee95b693aec6171664fdbbb57e2a38cf75246deb3b33d7869eb605f9b3026301357b5b1a88f698ef9d251c6cf9ae95592b25fc72ff8fd3b1d6691b363956f15569fb00742f3a21c3f2c6553d7fcdc27ab944fdb83d8c230c485b4890b94fb38da32a898d227f2df20f20f3a79df65233e28bee05befddadadde77f3475565274656d601abc78885d34a40c0d45e530a25113e0bc1045a0f07229a67083528d365e947115d784fddcaba1b70f81ebfcd53a7cd8974d0415e649cb58b2ad675c8627447772394a4758e078a5d9790bf7c1be209af9f4c9f9e5b5385cd6a6da88f85c58d169ad2d09db3250a00a754f600a928224d58bf6eabaec8626b8a50acbbf9d807e768fdbf1cd607a922e78a7992887dee32daf9993a10b3aec133d46e1db1b8f364df56581b118cfab844e5fff74a02622c420c14b358b29edd8c35bd10e7f73c18d2502406720a3d9dfa374251701fa8104d8d8fd502d68dfaaa198612e1e00beded7394bf768a88428f97f1e888a6cbee61aa83e38b96cbd9574af744175b06958aaa26f2127f1e606e6ffd84a55af86b940b59e1351756c4af75fecb4b4ecc0c78c4298094b2592792c011327ca92658785eb614859c2706cee3f574dd0279de7d55f1bbf39b0157e01164b0b488c491632c022c0ca5e3220e9b0f306fdc0bed67e11f35fda5e4102a1cbca5bfa81965da758f9a721c84e98af8ddbaebedba3d8a3e5dd40153f25eda964670c79dc70d19f64a0281aff0e65168ee4ae5e60c60b5541e5c7c0817b7463dd0608148614595f367a53b04bb7b4aa1758ce3d87861de5703ef4aa7b389a92fea463b362e838bc2f47bab1e63915cc8bc3ecd93427a8bd14a93a8a4d2a1421e86258df83782a8b5fea9bc280f7389864f4e8d2c9d0b62cd1a748080716fe73c4a8d928ca8610ceb58715a033948947a3cf161ddaee44e3b8b5635e6a28fe2f0e619f69dadf68b2e54b2af13b3621863aaf68c50915b200b4a0f73167fee58ee1098c05890fd00758274aa3dbb9673dd324aa10549d64e4e376dbe8a8d686588fced65b75979f78529ea66103421c5ddebb76587de245e7a7df6d07ea684df6aeec2df2f9297ec56beb91b140eace33b2efa5de3168ddbb1f229bf57155a341927d4b580077dad2046773e1c09a1e8f0361122ec8395b575f6f0626912d92946568a9dfa8162cc0d671dde934fc99074c25d6c9ef818c395e5a89870095b1aed98899dac2fa39e2b0420723c564d2d862090fbd28ed5d658395de6a8366d472d558a4939161b89b8a6e51ffc59b56b2785d70185fbf529246034a423bbe36767799dbd6328ea4aaa2f5769f39badb12825d068ae780fe62ea4956003d1b2579413f4b323734be2c7e58b145c2001fb41e9c8eb7b8d4eaeba3e4789cd8743ffbed29b142ac66cda4a4e055dbcb351a8c1aefadbc385c278afbbbea5e41f4d8008fa972b8f2587137ced29ae8facb6e71f8c91c0bbaec459246ef14548d91d99badc50c3e39638fad89f912665e00c83b396c845396fa16e2929af792b874998b75c995de639a14cb5f56389be0ce52c95350a1df241a3cce0f179660082b72ae52bf5cd55829c140248857d6c49d33419610b3b3ba05d32842c41287451fdf6892b18d1ee0c8a2fa41f11056be04bf6917670afbf6924cf4c4dcb99842806632d7c2a01838924c254a934825537d35538137939f3ec6b8cea1ad1b8a1d719c970aae46a2767c00057e47bc322c6c9558045a3742413fdf8bc0b076f96525fbd06af5a37e0a0e0513a5b137b795f283e1dc51c54553f08e1212a314eeda7d35e995e5cb8364e2bba6d50679d12919b7ca9158f01a9e20ef4b8bcc34256ae0a30efc60f54aed6526666eb2477e572c9896261cc2bd1bd7de5725a5d652b86303a36a14535b1e6e3085f6c042162d9a2869b4835091a281a660b20fa68832778a1dacf0ed1fc2eedcbb866e462ca67d2d8322120fcac5137fc91611e2c77889b83b2f132680bf6213e41909a33d57e318f6e8ade0a45b8d52536e954280dca7197c9b8caa9bbbd03d5f6563e2700ace77f57389061baa46ece2f59939f9e02def0b7401aa98e117f61d340a2f9996f25f9bfa9a521fab2345ba0d95993e3a004b81635edf1d172d182d5ff0aed92f88127cf5ded867eeece4ad299f17cb16e192c0316ec07398207c634534ab974586ec136dd05ddeac6c0d5e594732f903e14d8cdf92dc3c32c0ee0c8c23fe6469a979ba321ad4b963dbc5ae3d61fb980e5a8329b701dba74fd3bd29f97e84c423161d2eaef620b0cdb3dc515a518305d4dfb9731fb114cf24951ac115251ffd4515dd1903445d7b9317ed033aaac88e8fa59a464f4026539b96c4bfba788e8b7b468c2f80c9abfade9d784e0d56acd694dd5a413812b0a17389b0a58786f9525ee196a8a444df3de928a47e97cf015d3e5552468e7f32de840f2c075d6c10adef04e0d2550a41e937ff84db567779fe49ff4dda836a25de819b6622a811366d6a716a2a621ec1b6bbf49385a90c4d6301bcea1a59fd2228ac854c62b6bc8955dba8ec29ba46f44a9dea523343d4405c8a9c6662697b96106e128d0cc9a5f77ca423b2c3cfa24406f31a1175b2dea81a5a11d29c36f13ff3a09e97d2a3c82fda68067f3f752644571df64fe8d3903f83a75737bfdb3826e18d86a3d8c502fd0799b3e6150ad5b6ba0e9f2bc32a6842c27dfee9d6b92842c5933f245a986f556029fde4ed2aa0e11138ddd075cb12c65a53f4d1600e214075513a5e9661789a2db156385c3dfd3e3c3840b249ba3fb40b9fc01499965c0cb31cd8456c03bb25cbc60940152051706e237a682a7329c37075933cb73b418d0c9717e2efd4b749dc5dab5260945660f33f99ed350a21157eafca1906d210816a72224b20047c3e9404b929022f15c44fd90349aeecc5ac0a5bc8d40fa20b80969ab29653d713abb33210aba282a309f285abd37cee63653464dfed9cae5938a05084814deb448082f72fd324849adc514dba0850c22d296673d105e059f4a900ae3dbb38a1d192e4011c68712af4a8521b895518f51a0e7a9cfe7e9bd5153b1d32be3180b99ec190edd6f5457f512989d0113359b05aacf22c47e19554ea11c4ce52ec6f098d0091e893ea364ac25e39ecfe2d91e1c49540eb81f48d3ef99bb9c13354fc67a6ab7a9a093b953fe4429063715ec7ac873d62093f496e6f108b5ba88329c238e559f7c6f286b0fa98f9486eb9aaa42440799659f12c489e633ef3f05db29f39c0341c1d02ba06a4bd84c1da41017782ec864156771172ac7c11329430c9822f271871c6eebcd50035a9d8902427a74f60660e8adf3bc80e7b7e0a770cf2504825e87413fdb494e5fa709a9b2c5139e0311615113b35da33d7a145272fef349129c79c43278f5de1a0b2eba21db274d32fcba6c367f3804781ce1eb97b9ce10e74d32d69cb43824a376aac7922e1a49525f8a2763024ec5826b6f63589b6d3a3e32a96a357682edb246bf6b320b3d9805e4af4dcc90ad2b0dab2e7c406c00ccd50062a2e4cd104854c0c2dc58d4bc332e2a269244af21e22f918cbd7889286e88feb3ab70e09155649c7752c29322976befd2c50ab95764e1be4640246404bc7f257f68fd03022e493b65d0b3201df08c4eae720592405b558950689ba259c261d1bbe8aace17e43eb1fd5ba5078c9796f135c1214de151dd85b91a2b6f584e8ea3635c0aa0210d6c130afd6a9e9576739a189948899099e27fbb05d82392cbe5181753510054d44d231be9cfcf6288b25d5e8d854549acf32cca2533ed0f9d7f30b926b2d2e80a276230adf4b38c13a4e3b522784d3c5ec8e9560a984ae6952d95a9d9018558e890e04247191c0b156570e41a4dd91f9a820f456e685880cce82e3837a4611894ff2ae8c3677181e1ca03eda9708ce2bd6ca74934e5afed4c2975ac792f4ad1fdd14e6ffb9454b8ac7e12eb70e5363c7fcf6fb095e761dfe70edb5bd386fb877fd259c5d49950b9f1cb359263c2761decada3c02153aa5d34a00063d7d0f0a38180f8a486fca5a93eca69d3fe77111a63bd5ee26291c5e6cc7370ccbbc8d61bf4e121acd2664769a6dbc8417f2d14bebc1bd511f4b0af919633510117620472a5ccc32996176131dbb1fe68d3d03e1d25602ecd205c62c1592a9b5de5fdb6fc1d46c16015cdce2c1004ab254c712e18446f8d7cadf67b23c7814d5a64948b1837d5d095c999f92e2929f9711646f8dcaa11d08cc7c8b7af882c472162cfe7ac865251ee260edc70191d2065d1a219f4c6624997afabf3881d81ce393300c4c1845d75f9c540117873ca82f05c5482e700d3228ed44a13b1f52b5df3c650d2edb48aec885cb56d26ae2b1626d80fb31105accc1605cbb9fca84278d4667a7a4ae20c62c424bad625f6e2df7ad9a42297ad8de6decc14546a891be0fd7d6b2b0546d7e6be760cb88de0fa6abb6f7946251796bc2a6407cecdb701090273c053257e5db182240b2fe603064afc3b7c0352a7b23066c74f991e4e4ded032c550bd4604813a7cadd974fc2097e222b94c2fb02c3a1aa4f9890fbcaef9816620da845e43a334d622df7b4f7c4185c1211b5c4ce4d00cbb60bc29ad817628b4c248a6e73a5a0f3e7ee1addd485abb2b01c3239ea141a3a8e5a061a9398061cf1f595cd8b0c2ec76b33c69c44a914d54c0faee18811019797e98a6735932f5574b78801ac1446aa165289bf41f5471f82b1fc3b35a8d88c5a8adf846cde454def34fb6b16e76edd7a65b536f4c7e389665043396e596adc90331db7b6a18f1f96757ef2e26db0945e543e15050d50702218dcc14e5250e56379d50966bdbcc5217660d2ffaea9687dea23624209e30fa0da85185ad0a612b3460b03e9cc413dd755076f9ca1fd78acbb440ca86ca825f8e433898e090c41f08e015d5d56ce3b8c40661d952d9c4d860aa6b611317686cb41e7f469e1365e2911ffdb04b58eb346f1fb4d6ff11039a09db63edaca309f490a5e4699fb99d3e8d15328d6fe91ab477139ea261f257e17bd8d0cc28ff056c395b205059fc8c116155484aa303ba4e3f8817be737d093aadd9da57f1a7f00e61b56127bb5fb798cf2da44307d7cc5654d6f33989449c30c1dab9d281d6a5138684914d225a0430df7a839d2d480c730a88ef9d85a24b712582f23bda8ddf940c0913c86afdd0fb935f887ed247385d7f02c069ebf2950cc4dab773db649e6e3bda5887430c984ecc23af480b03da869377b8e7e9c86bf4574cf9b24efb5a952d9a34061387450981b9db6227bf77b55828b8c727d40837abecc7f09a034058e10dd2cc709540f8eee321052c040481050e82a8efdec76a14a1135a08dc6f6521735d61799d8866719c9390b39946209eb9ba505667a5c715384dda5779ea0affdbdfedd662f62b7bea246df71893bd62d361a9963552df0440a963c630c8b5f895f0f1c97b591a0b7297bf25c80a90bf579f178489d2d2063ce94d7ee460547f144a0b0507bf445ea18feafffb90fb23c435e121a32ba28d294bf1bb0df7e8b376d3c0ea6276ac1cfd4371e4ab1ba27ec89c5a4d8aaf7ab1beaf48da0845f88fbc66bb7c40fa290203be6d2351fa24be44922617c17f46b5c945e3063c685ecfeac2dcc0a43926900c6bd225612c76d6635ac6c2782fafca645c1b906c22d52d55953689e1fd30ceb02da4b449b2151e31e99e3750df22095a993e59331f7c0f44c861e4de3441e7548b209b540e4cab86e085a214e35c4a2d8cc18c6dfc666a68d4cb2f7f475759b6b61b44a4aa4e8ec17b28be73e3b8867ed2b111fc75e6f12fbff9f2e51674d14190e427d835675457c6175b1598d85f2dbce1af37e993f908647551a1a3c228b34acadd5d76388e6e3559385f68ce21f0238b48a8e0a275ab11361bb12fded03a24c16c876a00682cefec4bf650bdbaf89ecac023f3d6daba1181d66915d295093cca80798603a816223d6852d5b7094e27e17e4888d828930689d9d6f1faacef51fb833b84b7dd450266a5ac5f63b9777c50b5745aa008b2e66da0a6bc9426fd5fcc64e13cb92dddbce352fb87c17e747a7ed036a5a98e015614d9fd744e08c8d949397462dc36aaa2009e96979d78b5574a0fb8d1676948f89637b699b56e1716a1970197463bc3727042edb80ddf12787142a7b92fb8f34185d010388e449cc7311c39dec25e6806c560e88b019eea58f7a02fea932edcf931a6ffe1ac7c0ccb59c93d50fc9c95dc444112e20a5db5c628d4e732af6f7a90e1db9e627a7380eb0d72d8ad69517fe9b15bf00b77e8a3a8609d8b60d664895d6df9c5b4b68eb06cc4dd4514c73e5e6778a105506a6f6e2294274b24e0e82c19cb3f0e44c716c6d8a4b6cf51e6b59b3543652946750a60ae479d026d5b3c8e39ef6282ed7ba2473d97a83c30f384a83f1860da720272fa55d6c577961c70e8514d09cb525c42a09d9d14dc99c27611ade68d89639b76cb25f216fa74dd5360c3c53464351dfb181c2150ff1f11d2ec26d35284ac391c0c6f573d3a35b26f8443416702693bf9aa9e767a2183e611a6743e0e45cb8afcfa42267b4439a75d4e7fc869c1a4444b30d4201454c110046fb8c99ed3b13aed64019038014cec8fba0c8c677fc617989854a63ab118f734ba50a5520ec5b1c9fc27c79985a65fd68bce015911e1fe9f4a635b289ef5c67cdef5294b7a21eb9a8643370b89ba0ce0db715af40566a295c3136c8984f0f1f51e7f1e25317708f1a2d7261f3fd397880433c8678b0832b6d022a72540662bf8322931ce3c2bb78713e06551abe6521d8261ef2ab8023a0b820897186e65a51f45d04feabeabf57085f0fcde994b4cc89d151196ceef688af8e5660045d94ea6f9f23463f778b765ff0a3380f94c1d6c024483a59858e0e4da9c0183ac0c46611e4080d2f7342210af5be49ff0f1093588884785de67df557de9a36fa9d26244d0aa8a04d8042865a715418072fb251533fa301c5b7bf18f4ee387708f5982f562e407bc6d930980f460b094f78a5afb086ea077a7427cb1b5d8e02860690fe7ac0c2631a10311452f3f904468e3a45dc35e478ba83a0da6e678e9727196dfc555431d3b4ae93067442a60c928aedfd1bdb57e6ab7db8266434a22d3294123aa616bcb7b877849a2618ae5ad68c1890746aed15221882d4cb7a26ca6db1c7b3aa6bcffc5aa99172ac0a57ad8ad1c350a6fc5799b2e135b1550a22d041420e92bed10f89dc77c9dda8ac04587d599094fa4238fca5f4e0f99665db88af8d20ab610ef4806ad8537f76c97b19ad8d9e283b03fe2f3e5635bf1cddd25a5d7a05fb4fb20289abb3f4a3d50814bd52c23a3099aed85c166064722a0d8a170510421fea99402f5a68560146d0253ef44ac807d2f1641628847b2727596a668fb6e46af0e8f6aa359b0ae9aa3bc9a1fcdb0ed72489bda7fd327ba88c0638dde2eb0a8ed4b6f12f762d7a4fd42646060a51c6a6361583179c9c2e39a073bd4b6f58041da8416c2cfc3419a3aa001a7be5bf4c3a69116ff8b18d12db12ef19dd8d58285f174c0c2386cfaba3e8debc87e620ee538b7df7f6f00074e9d55c3fc1b7af46ae5ca9147ab8dd48263445d00c885c9636884818185c789a0e2a2ba133a650a06c46bdeba4ff9d56eb44308e4d73e99e00452cfcac6fbd1162705a96633699e358ed80a94c69482209c7816b5f27455f2ab73c9a1d3fd18d3deb2ba6d681dc46627142b39780d535cf1f5afd7c61d7d6c9bf42641bb917cb60d8153a4f65dc4d6975ce7bd9d292d574d564f7d4e7f4e68d0c15af190412d5eda8075b43d3d030da01caee753dd6ad6ba3ee08c7599a3c696c5e6a9b414a7d590420210e1c7ad41c217eb8706cea47383d5dd9e0bb07ca57429c43b640ae68b45fe06d594797bc77a6f4d95e723771114d832075b00eb7047d8dbcf501610893bbba9d5049f1c9625c127809c5087ae689f1cdc64c70487ec62a92fd250f842edec54754a89ccb9f4b96820dc2335715cd766223f2f4b5500fb1cdec1c434442257acbaac1ac8a8708b513f338fdfb96cb73d453212c5fb1446b9a17b0a13fe4f13904efcde23de18ef237f10384e10e14d96b566ecd52b4aabcd03fbc7e25316a9b6d8809b8c272380d067afdd662eca537ed37a3a34c7ef2e4da8358c9536b93ab05dec6d218e96d33526d5cd98d0edd72f058ecb27bc02847a8d200619ebb03434b4abec4ab6d7f594e26ecac15998dd6a366dbd4bba230e761247a7f7fa09e0e7c0c2c4bb0a224725db5ff205c01768f03d3a67f0d9c25b059c522fedced944ff432459b148b1107d7f4d4be0a4c791901cd33b942f8982a5de3519b95d743aaa9a65042ff62c0b6b1556ceb4f08e2e60da449876634c9786e0bffe4bc2a2b3d8b356bcd1b5487c17edb057684fc52e9bc1fab237ee7b429457348a383ff665979e5f2cdb63f2cc1f0c79fc3b5ff5d810632c94c3057af05ae1b21522c8d7e117ef6269990f8f99bd6a8355a6a9965a636307cf1c9cf8ec4ebd881c3e80f251c81090698ac4b1b1c48d57aa5f10401b3df701c014ed3e5e333d16e88a8491d5b8c07ff92baff774c3ef59dcc948780aa2053e608e35173680a721aa42f5b84e2ca0d985b7ed470482c65e5beede00caf525732e73dae281c6bcf3220432eb895e067f2945b706893c74710d82f9f0304142418ce53b0eafe417cb2daa631bd4707f2d74c1eaf412a7a2b88e44411c77fa0f35fe5d1da9ff13a5add92a96b630cb1625700347a07c50d2b676d317c9399d55a0adc9b3e013ef09128e0e75d7a0dd3a152cb8a78a4dd1c6b04221e9a52f8ab6e4741fc7255474614c6701214b9dd74d3f8e395bf48530d8475f551955ba15e0f2d53a35199660e30f21bf671f79d640e973344b7d9e83f93e158fa286680a78940d07415bf7c0725d94634d308223ac345dc259ad367cc4d765ce6afdec0b5684aea1e790e94658327c2b419cc234aea14fc2c12d4488032b44cc396d6c9d2a87ac8077e3552ea60724b51f350bcced4b22a10046f61401d31a2ab443ec25d27b9ca3c57e3d845eb443cae2f6676964b960c1b9d92513adc26c970ce28ae400d94c5a01d0df68198d69a2fc63d26dc72786468d6d0c44e019fdbb8af3ecc839287f8da1e20a4a6904b5c60ca47c2b84f8325475f7e337d1f2462d532b4717a256c1b08d527e74d92e21f57cb59a440916cb82a33448671ed6b9069992f6dcb4cdd5332c7d044e77cb678403ac2a55e3944a47448e8dda33aa681e5b54330881794b52d66b57b673cdcff32d855f7746b165c0906554df50c012b85be5ca91a365005050e17940658bc68207534b603bca17e9db41a793bb4e0d688e140a688a52131e6e212f57ca6977cfcabf81be904d4b451d55d99767e66b94168dc3ee045696f099d1e15d76ac8cf8e58e6021af662f7f15338821988641138002d6ec08cd8a8ae08b7e6afd1e995d28aef6d21c862603564719f3605e53aea2d5119520e5d0f3e067011013e5b1e69def991ba61aa1c79b3bc661355069f4f241df568a62f371a4763d6f4e43403b8bfe32074e4eda4a08703f130c929deb74d36e398a30ead9760eb0cb429873b28c62c532dd44523b09a2d6c1bbc8d3dc7a8d7c834addc8ded571ca8b7bb203d1c2aa6521766b445e55c9e09dc12d1ee21509eb2dcd5bfaf3081a050fa39aebfc7c183a1c8931c0545edfa33086d84a1dde12f511fd22556227a2b2fe691fbbf0dd1b4c6dd50388d29dd3cfbf174c21b126603f59017c14dc2442c99b8a7305cffcd79103c26c46ae552c40f1bc272c81a2de41c68a64e9ea365a7ad427fab746a0f789e809cc10e88b6d50efaa996511fe0cdaacfdc94344fbcf0f55456803f93aef1ad0d9e59da9ca90db447a438cda4f7c258f867629f3dddcb5b81aabcad06982332d2f132e92651b428c52a0d6321a6898552244c2165cc732f2e6241cbd0dadc627a04ab60a3226fe6c233bfd6b03f9e14a5f0473ede0ec65abf00a1959e516d6b93d51d765558dd0e489a95bfce4308b053c5e737082b5feebeaeae3128d77be8ff9fe188c5ae5fe295bec1905080676ae08cc6c4edba5ba8c2192cf85cae8896f0e7e0d73843a215ed5dc449d30875d751f8424d79c6e96873f406e1031d01e0602295e063d5b0ff92db337089e765c42d833367d0dcd1d2c3666555a7cc6d3bfe739e1cfccf5cec4239ae4b3bc47ec71d8899ee6f8b976317f8e383da317df0cda59519ca95534c7e6d9ce0e11e95e36dfdf30e9b6444cc1b3b893d82892da9508ae17032e921d7e308d8523ff08a68c950bc2880c07074b5af29b5aff0452accbb7f0f4bcaf6572a5817f56edb5579511d164300e3001507036992b8189146db28b361167934cfc9d6d51e656782c602d0392ae3922ba98a886991b44635eda2a09b6077e9eb3f323b5892e3e96889ef5e3dde36917d38d9615549836680b93f16dd6e8cbd6f5656fcf6303c4ad70b220f23349ec8c8adc9374e2ed40bb6d3ffcda0d0e8f8fbae4cecc85b8c4c267b6ae3a703b434b43024dfbab4ff7db3bd261b0c01947498171cff505ac360351e7258b0cecfac810ab662b80cca1ff43d0a19ee59ea1e7d3914beaa1772bab908ace9e8a9e14017ae08cd33830283d302fe82d0a7c9065c64c66e6c50a1d9a124e82d7e2bcb577ba5abc41657edcf79d54caac68efd28fd190a1fccc530057a734d271a85d9a6a5ed4a2c399f5043e5b95559a148c9fd8423294b79a22eb178df180daeb101cdf66a36af245d73faa86df4b1935e6e71179989187e212993b22c2f687c4edd7c526eaae5195a6112d2c43a5429ac7d71bde0522a97176c3c905b5b7ec4afac0197965f64096fd3a0beb759187d9d34af79aa7e017fadc9f1d2bc34c8f7d0dcb3cdbec02a79a0ee33e9200d44b024c1523e90a5cbf62b76cf04604546d8671d1b9d17ba3449f85ed9c055ab6abeb4810c20c4a6fecac316ceedb171fcb44512538305271c926eac0e9481c7386ed71b717c8734a2041810e1e4db6ed2ce796a47019f4d88203d03e981b7bb39a06288b697a13aa5e3d636de3d015bdf72c86560bacbdf24b696bf247a58fc1712747a52c7fee02dde84beb25c84de381ac5eb55084d8b24da1890e825e0dffbfd4a569b5e8b92361e74c61d3143b43a10c600a02232450e75d145b1955a866815e8fe68ddba65743d91ba32f59d8218b4e3cfda428b83de0f239b0431dbf96509ab3de718f3aee5e44705f7006a1bcbf83c6bcc4916bc8dd8baa8f672db6187b978e5c9e5cba30693f5d99f4983e96e72165936e2464c2bfeb5ca12724c16be991ba9d2f2861557be143d3bc8f5b4a1a9c0823def944e7e364fee60212282bd6bfc53bc7d4df078a71cd1749394d09bde18ab226267b50962dccda8b6792693e1a031a97d2acf26f389bb33539ebab653c0b9c9258b3615901b90b744f65d2fd1563428bec53063821bd46c6c114706f04270a71cd914e3daf2dd8b1e4d17f638bd483bbdea237e26f1fcc34d9587968d7a4f365266769e3d22ac5a8f3ec48ea6009adb13c27752aee198357d8d4035076865fa28c820fa92853c25910a8137d1ef2421d33b89a3eb68c1c0633e860fd9ba38d114fb2c6dacdee8f58349fa0b83b7406bd9e21311274ab873c81be28dc4b2429b7c87ce7035000f735e74c8c02efb5eec3a3500593d3e9fcce34856ac903921d9143217b5de9ebbbc10583f18bf23eb21b3fd983209f883b631f08995623fa97fc4c4857634a98c68fbfb7479e8c277183a35e6ec7134d87a01f1f9690d2fd67808261588a57684e44614dad7216ce5e0dff5f492aa1638e8608178c578b7381dc469f2942f7172564027d37285df945c51a3f026d0472d314661a42cac068e1467f511252b417e648eba3867be710a2a02b22becb12881d597cfc1d740e905c9ea11ede5b5b4d7782de6e817fcd001931b230f1e22b89dfae595d103ac460e8a40c87dd01227ab25a68c18e8ee83469d9e11c1017636962621187db3e5a26ed3f2b7413cb614bbd218b1ffd63c4157ca1bff577c22612dab686c672155268881db6c814bbc9198973f842641311dd70a6631f929eea18a18a666ff9f838783ec292820584d2e04c69819cc21c5fb4c6475562763721ebaa46b66ac147794887ac0d2278be43759f31750c425b843e9a7b1f5aae183f78902a46689c183e33e964ad4e48f5578323f8031ceb38527991590c0b606f55bf0b6a75e3727d10172d7329106f0403db98d1e2e7d1910bf03d11866d6cd9fe01ab21424391365a439cdea2f8610dca35da984805499562ddc754360e00b0898305ced379935d0d2b4738c2a021e6a85dceee7c724426c2918c9646b68ca6426e7c763b33b8c2b889a1c3bbce5e15c20ef1168f93e17f1ec02d1a7911949c1430227298644a6ffd3fc8093c69b57c6550a44557f0d38f806a42d7c7f93d4035f45b49b1ccabb0bae4232f0ba214c499ae6c64a69558f7d948748d3373b903199a1183a9e6e4929751f8bced389f9555600d2350ce5c74a8be6c071c6f723808472bdf34bf43ea44d12da0b10ca4468be0c28ed05fa9124116759b3e234aa97f43789caeb14c19fc9ab3299da8f6924556118898b2ebddc16940fd59cc0e5811e88d9445c60f034a70c90118e9d7b6a7568fa8250daa37e8f7084e546843e2d5d3213c574043f873d4e6a050c4e08881201145b23caf16fa5d3d4c8e2ff5aeb23d450a7b50c466ce4f4ea155873b21cbb491a52204661e88c9acafc2123100494ce8b963aaf037b915d360ae65fefb43b01994293fad638ffa21e51996b02848b61272a8cb61a19d04d1140687ca61df999568ca6690123490b2751618b8e1c020a32084425b293d2f9f6a03fc4e18ca1c6d0ad1f80b396aa92d9c6f638a771095e850f8e4704dcd1fd285e18f32420b56be104e74fc05e105017c5287355711f3399965ea46024a99f7607d51aa224cb9b35ddb624bffb1d0ea2b29f02845a3ad3ac3faebb6c51bee21664a388d9e046b97ed163bc2944fdf3d43b6594622cb38c26eb204647c88ba750ec9db5b48cb34c20c88b2cbd5128d80d9503d2d9f0ade84eb5944676c1a226b5e202db4d383e686127e75db6e3c24af27892f09da937c01e2df6a36ab18fcb602754fd20b41ff7c6d435f082cd9ff655f0b3ccf601657014b21ac00b9453c11eeb87085211e2587f4c3d7f89100fabda9b87da0abfbf9f51daaf694effd136def48fcad14c83a3995daa7f70e3908e24a64b863542b122547e7a3e10bc94b869f191c9874f8b265e355c0d047c1e4025e1100da02e5cb406b9e77b02a7128481ad5541e1b055d55c985b2d2a3e74859a8bbc2d5b28ff8191c005baa283ac50b7cf828f9e890b5282a8133c5988cfe85ecc57c6027106f120cb84ccd9aa6f706dd05cc1aa64696e009752f62262edf622f36caf5217e510db6ea75c02594c76674ae34e386fcb94ccf9e2d9af1b4b8865763669553e10b6ffc19fc3ebb8c2f99b37cbc65e2aeaf44bc1c99abaeeace0b09cffa5986e95a1c266b62213a5ac590496120bc204bd3794851646b17a1fe7a1cf69f32bfa0240d0822611dffe4fea293643a5d238eb0e6753bf14b0674621ef04fe7ba414477680a550f242f96ea18bdc892b6fafd6a215bb12d34a8cbf77ff7b98cb7412a414d608650065616b04d200d20de550a6536ac34467d9a71863f823a1e12496f73dc27be7e326cf85615923ec9226ee874c8fbf095432d7abd533a62b00480cbe9810e606b5a699785595b341d5e557c20aa5072e67d68c8476f6a597526fd0110398d54549cafc9222fed693ffee4e1f6eaf82d6bd78d8761e248c93e7398eb2504f5599226568a97ab84104b756762f7bbf17eaea0494472d52cd0f62318fa0588d97e47313f490fff4258cd6ae070e969b369a6faeb9d1209967dc576ee6b6a3f8547338781ff8111e69d22bc0355f52b99e1ddf6172481c2227671d8148e74cab8d427a067e839de1d3ea1e4c6df5d73cf724f7a5169df12607f03a6f6457cd4ef29e1a9303b8b40c965267d83a99fadfc9c5801a3e9275f7cd34a682eaf475b9946c64efdadf5e847e792c2c8a0777c04c96a024ea770e499b79c25d56c8851960e0790b74217c690017a0ed0dc3f04ce9c54074640d37a28993d552be9f2b65b436a7e5788e2e095c63fe8de6652c0ae4a9e0e4e730d8a7f440ce0d5169582053dfa0a67d0c4f481280db045d67eb1b07a7ee412de1dacecb3e24a21dbf53d92911a6d8bedafb4bbd5ce1e6215c948c3ee29bb907ac56fee148557249e2ac265d02e1a1caf65d1c729e42a444f700574d0156c50870963877edc7d9fda68bc3e929f0d45a281744e45d94b66755d92df8dac9d9b218f51fb633d0421ab2680f9da9282c9e5fc0d0536c2b236b5fd23a95aa72b7431a3c282e43c9a4cfa89730e4ca4db92836757c31e7a2db8a5c237ac4799521bf14937ec31b907ce754b719a02543d0428ea312f32f1960d3b0779d72e516719b73981a8890a08ee2fd7498db40e31edc67e590246de536081dd228fc586e0c83c0bfbd356bbcbeeae0c1e10b6646299800c77ce5c649ccf6fb88b0fc2d7ee948b576d9d464639e2fa88206d0787b59b61c242416176855e47ac0e2770026bd10ff08ad6e6e6674d7e5000e6dd15f05eba9968649db466b9587e5d4fd45a94a352b0b18e0e1ab9db02da79db08bef9cb00b6bdfc42d68b3d41769356c3355c7bf4c18585ebba659b9659c14130876df767588d802eadfa20eec1b92eb7cd782730a2b9c6a6b1c40588a163c3f2a2c78609a466523ddf1a164a87c205f15fe55e369fd1d9ff6b96f94848ea8179184d9f5c450aaf86319f073d15f5872912b0fe0f763b5cf8d056cb6021ade49625b304eca4a07ba1b9f173133c0a6eddb6f673c2f2e74b0be8adca1c56d5bc303966a70d39adbefebdf9ff674deb02184c1a64e28802ad35045c46889ef1e8e081b6f9f7ba7c951d0180afb5c1c8bc7fc684b42f6de9bec2d659249a6c305b9059b064b393c2fda02c68fdfe59fa0e9e2fd9d6db4781785fc3f19fde29f2d9fdc8ffead7fb58fd0fc97cbe572b9441eaebfd116067b71be9fbf170fe962eb5b32461741e0cd6fbd87e1e83fffc674cff5f25b7fa383260c71dce60bd13e15c71777e4a79c7719fdf2ff298e3cd71f20aff4f70fccbbd409f1fec71090f75d08026f7cf1db6fef79de0f1902f2c421aadf4491c7bbc4a5ee5f7cb8e47d0bef693806dd96a8e2c4aeebbaaeebbaaeeb9efb212ad1ce1e7eef8770a28b84f9e389b0d9d3afdab6cdda9c50decbe2a0eb99f3aa8f839c7710d62f16072e4e600848f3d13dfd38a00d7bd0cb124940b35ab1144af7038a4991e453da876352185177e7ae0e519a03a4e3ee74fa83eeb80336ee805d4eec56bd4ad5fc77525f629162589489b95122068595d81926aba4ebbae3bed284fbdb1aecc8bafed6e79c2cb6315fab5ad56c09ecf857d3ac0c9efab4c2da3871a1cf27b0b6e572771723add8d15eb72d97534a7d90b5566b831d5db7ba769ea756d6a4d4647dda345fe2b4afaf89429aa6d16ddbb66ddbb66d53a91a9603a5b6c98eff3c2f09e38dad958a42b026ce20dd019ce921ea89a6cbcf586eb09eb30e217439d80b742e5a1ee8bb6ccb3ba1edec699bc58eacdb6c43e21080ae03be528a3e58f9ac813751306efc591358f720f084d2e5b91c339354b50b60bcb1a21015978c1e88da1d6cbfa4a1631e2eeda3bd1062bbc74bc66c221afdc3a1c089e3dfeeb7ce013b2eee74f899a9f9f5c225d673e192d103b1de431e28105d6d3e6db4feece02ff7eed7fd9b1375b8a7a2d71f276edb7f5ff8bd87f3296a96996a888e90a6345dd9f245cacff85451fb745854c573ff74d47771146fb70ae56d3347d77bd5a7636ae9574b5c5926f67e1cf4e8802ff7abb0efd7bdd471c296f6f17ebe278eada38a53cbb885b2056e6ebfe600c985d30bcf98af1279c8b9a55f2c295df97fe9d709d7af8bf38967b060c789054bfb68699f245e6f2670d6ac94a5c652fafcaa2dfbbae8330b1a34513e5a0c9a0d7c83afdba7b863830b1a6989723fc904735919afdac106816407ecd65aeb0d5b95f4bf2b9354460623efe2f37c976365dadcf161d4681b37b81c233375c1cb3132462e0b0a4aa9d33246ab322d1071d61333b4ad5819262e77395606ea8ef64a17827506471b619981cdc9320383912192524a29a5f478463b81c60933978502dbef97634e3871f93be684d47549361d6bc9958233b77fc7b501fe6ee2f6db66e28e5e0bf4726c89332bd6c0dd3f833bd6a18a8203b8895bd9436d44e1d68dc79c37a001a2221117916466703bc91f0532b8b3c174ac25195f90aef7f43b2c41de568942f255ddc3c7d67d7f38bce7b8db891e705d1fae2b45e67a0c398cbff7c5e87aaffaaea32ae619fde9f057bdf737ba03edbb9761f7aad0fbf9e9d85eca16e577e1d8dce643caf727c0f5af1f9b3dddfa5a90085edc4c20984efde7798db081d911055a81d41d5bb4fe8b296f3f7304d1d1f541cc08a74b9f46ff3810855dca5f5a5709ba7dbffc2040c2d5bef97dd4dbcfd33e3ce49b1efd3eaa0e0c5ced37ed9b359159068b3854df07433e54ae3eff8dd6bec38d85c6ea8126eae8e8d7be9fe57738bf93fdfc3dbf451dae9dcecb975b43da9240eeb87d2c054eb66b7d1d6c3f9ef0467e15c70672b7efb8896aedb9a9e956df33f3eff0f63c74b9f0fb2d1ceaba4e677bd57f4f6aaeff9744d1f55f42bb6e48aa54aaee3bd93d8f793bbeabee857474b8c6d274682c6dfb4ea5e2441cdbab5ea5c5ca7521fa2aefb7505ed5fc70701cc78942f447ff12866e0943d77ba1fafe72acef892a5ac3d1671361d6400215ad9e08b306f525d08dc9e3c7f570fe2a6420e73175a844a1effd67edbe8ae3f79da8d3dde84fd4e9441ddbd7dfbed6907b4d68db341d9bb6a9c4b17ee7bd8eaa863a2a1107fdee3bbe5ea65cffeebbf684b81feb7b9ed71f8ece83aefbf92a715475e2c87dfdeeabbcf2ca4b471a1bac6043d26be1e9ca3c13e584441724a8fe50875259431dfaf26aaf02fd33b8f32b7dd9b56b57edbb6e4401bd73448bf944b4593a35e1345d6981f68105893042fbb42fe19fa1245120a961062d2588a209a01f0f8a13582185133653d200f5cb27fe197ac284992c474b3d64410450bf84e21f0d40910226054968f0e283d28581821c9a73474dc73ceef5e5d6dd218be336e7147978a452166a46e01f66e629c27863e74b246aed6477c18e2c3502110fdd48e36270b905ffb00ded7d3615d7928c00e7fc3b6c41b945c7d7a573bbdabf3ed17b3d7541b4c59d7414ba2eb678c6b4fce2d77c55b8b1f36be2685d6f91c78f2510d0684b9db38daede3dfef2e3a0687b16bba31ad0d742660dc69c4b9fd9001f1f803ecb0aebfd62db825580d10355b18b9dffb27b4dc7dd1151672c376198031df7a454cadd9d524a67b4a4ee9342a19973d2af15ec97f31bea4e69a54c9999d97d0a31e5d6d6ca76cb9d610f79b5d7348e69f9b285df26c5d6faeed65ad75490529620ef645633e72dc2a7e6cedb56bd65b9d05a69ddbcfa0b53b556ad52d653d5344d6a539b1b534d73e972d61e761c8cabf69c5c41f76a75f59db5bb7bce5a679dd2322f7515746f3f43d5f706fac575fdbed55a35773a5d6efdf2a2e2ba4ee5ec9b37bbaed9e86b9ab669daacde9473d6ee6e4dab92ce3a9b74054e772ab9bba5942e178e24fab54e50847e693f7f735d605bb56aa1bbd74a9dbacb77714e3696c8325366596528e37a529ab25d82dcafee769f3dbbdf59b2649692d99d52eaf37bca6ea9654e6dc8356d03a97fbb2b31f7a7699abb6b73ce29a5bba6514debbaf9ac41a8737577d002fde2a8f69e47a94b4a29bb900bed94b5b26a73fe3c60f3358ba929a232ae27254a37073be0db4f7f52965f651f7d6b9d3125adee6c925c8eb1c17247179b26364497636c3cc6e649d2ea5b75093a15dd9170266772a6f9d34dee347f4468828272262867eaa6168bc5face86b1633755697553abd56a75934fcbbba9a1dcdd553e37f08f8d71a5f8add0a9f4cb9bb65cfa31dc9d890496fb35f5a35ff44d70a4d9c336f847724f8ca7acbad2317e6c758c1f9b4b3755efbf6f80f1b4b71d6c964b61fcd841dc3174eca84bff5b3160c48811e39dba296c2b542cf7f563d07fb18fda674e6a02b52e57bfaee4291827572f572e63bc94224804d4a74f01b6e14fbf02ecc3853fda9be3ba39dc233fe7b970f24b7e0db718577ef842c60861bcd9bc292cdfed55b5db3cf975b0bd5451e19a9898baa91baaaf3497fe42b5dca0a00e871095cac4b4a6e85bb134d6aa655fc1a2a59b3ef4ad5fdcd75048fb1ef2c6f8a00fd4a8595169e271b13cc93a9223d92996c7e54c4cf57f422c5b9edc4afb7c5a2efdd1b95cea4e975ea92ceb4cce44a589c7e59c3f0fd67511c68fddb4bd8b1f903882fa45ff837e69620c3f1a33cbcc1fd6d316efedb3cd9f568a41f4752eced891b73852d0079e8444a515975f4e1c4f9868fa45a75a4b63e9a6d9433f86d24e38cabbf3f5c3a1dd2a4e37fda2cf9ab2f23178af5f2fdef5ddc436240651a00b97eb6f3400c21f92a89be68f0850dd04d54d50267413144ff50e4eddd456dae9ee847c75c20b4218e112eb5d21f7ab7311f69077ecd16b8539610fed8e0c457140d1ce1f96b8c55a6badb52e05a2208738cfe08625312b8a2c09ec0cb1354b626ac6c4d24cc5d28cb161b4ef64eda10a35f7ab387359cd652ad45c6608f08c53ea6e2acd279d4d3eb13437cdd7d5de82b153fa356537f9490b35ab945c81848292621b3a5453aac6d0d9a5589a2f445461c5112333474ea4c8a206204e736d09bed47d87bfb1bc55d775abaeebbaaeeb3aeb596fbef8d5ea85b52fb68de3fa7a7f2f3f8edbb81bd3b3bf6d9cf801189bb52fb8ed5fbcd066bbb79dddbaeded26f2e0baaeebbaaeeb5ebc7df142ecb7d65a6b6dd759ebb158615115a1fa5fff579f0b2f30b2decb3777e47ef5df77619124fa7ee510e0fe13474f1cb7a5eef95b327aa04e44010654a5bfbbfb876e73df374685536c8a2f4c5b8e13a5189aa6cb31299c625230d92adc4cf6890d6393926c920d63c3d8273629360592fd52ed129618356adcd83e6efeb43ef0881d5fb7a8caf633c727b238feed72f0f5c41d352ef7f3d3f1230825539aee0e86ba9c6fac457ebf243f693bd067a81cb387d6983d1408eb8fa3c58e7c05a97dfa5bf4212f0749eda32969e252934e8b7cb5392d1a9c98a59f430410891d21031b2022a17fb4cfb8e375a509edd3f5abe8c3a5159e4167384a249c981d25d29de00a766434f449f0d13e4cf347a54ddcc15a7484200623ca48dd1d2c75e5ada15f6ff50f036d40d45e19973e6341627bb6f78ff2e906cfe00d6a5030c80e1e4ae3c523dddd773a50d23a85534aa933bf6b2ae139e7d418f6dab16d289553b6240dbae683a03b5f4a29c7d7fd6007ec06435db9a58694e2961a2cc5525768c8e5dc4146bf2cc0e3e3f2cee5b9cc3576240d77b096b0bb9fd26edb76f0b058c3555d75012f6fefa647f8566badcc3f7982496c1b308995bf44dd28fd29d9a7efd0e719236061e553eaf60a2b9dc90895fb976545a64892a97046b64219d951d45417d95191ec888bec6889ccc81899912b32236a8ec8e0a587a8231cdaa8c09150158aa091425684cc1ded37a51064a63004890b2fae2a8f4079d4124d939a8646b3c288945d5744765d2d59911a2ece655991a43bdaa7ce03a55b8ad856112359ced060a1c911511079620d99158c8e728c463003992d47a294a00265049b253f929ae2054a699d92020f600a433021e3465258c24a414a133202b82c3372c2c84b95e91b6fbd599714c7b9895b774f3aa703790f3e85dc4261e7749f4ea87047d7edde1125092cd42cc55085911d8688a658c144c50d4e78604111d99029d990237b2608304630443101991c6444b258324664435448232b8a2ae3e54916263f14e9a1c808a3127af6d0724592182574385a339582134e0c7101919a430b224294ac902622492ca5544890959028c0206f84b088d89418c309a9b5d65ab7a8a05b81103148ec33a288524a299526656650928510591009e2b442101b542e2ecb8a74d06430970cc8161991982562518a9019028923233543d6c8820c21811541d8c0c60629425c31841701194381b4e0c8522a2b10a82a03a204111bd5e2b2ac28ca91efb2ac88c91195f45d8e1ba55456a4c2a53609b7b6251332c5f52ecb84b0e08ef627544f989021275da2da2079c2224812503b5931410051049525c28c9165f1201609984582677e153076207774492946052b2841050954111b20f9522675dcccaed81b2ed608fb8235c242b15f96d0a3a231ee6eeeb83d4d2c73ccf6347d7b7adaa4e6936f4f2d9fc0d8514ac92fac292bbbd20f8d66c36c369bcd66b3d96c369bcd66b3d96c369bcd66b3d96c369bcd66b3d96c666776669fec93558a41a185896d629bc8f6ba71deca4ac9ea62bd2b925c21e4cab752ca9e2e9aa8e7ee4eeb0b99a6699bca85188ee33a8f4bb3f2beeffb56ac2bb0003d6bad05717084b4bc9c9c9c9c568b1593179e0b172e5cbc70b9940b3c183060c0b840075cc2c0dbf938903bbfb3f3752031f83a007893635728a92ec7dc38750c4f865e16af73aee8640652fed8d9e343802bb31883c5949552042bca1a8d763c24395541060816446e922c95286b785ef1860d0c19911215d6786fa2bc376544b0e60097636d8ab82e2ec7da38d52068077c658b003824114d3101145650c166cc647922a509104b9298451df378e75daa83a3efa5218ebe936a33d4c121afa4fc8160c59614adfd80c68d1c22d0689ff913cc1047cc88aa3441c4cfd0922725b628c9a1043c1801d4fffc33f4021436597c211264062840fd2ffe91800a5da81c2991040f6d80faa7961b0d60813812834e7a1f3202b6e70f00dbd0ea8c036c0013000b6c7d8e1c3818dcc8d1801c382da7e63706e2b3fee3fbf9e86b9f4585e56b1fe7b9f971b09a9c7f1c80b3c58aeb5a3870c4d12fcee77c8d1afdbaa0e7ce201800f8915e0c7eac77fee85d17531c776c70e7c3fa55238d156b482b00c02004812c40ff4ef84327c8ff02718cd12ed70bd185288f78467f8bd0049ed16f652df84b0b9c1416a04394271bdadc9025870410a59951a9e282d31140cd7d3717de689c156e7f0e8dc901f738fe7207b5c2331a84cd1db41c07849aa330553cf174c4142f65e4c81197155430c1b4229da48dd95162914d0e244218d42f5812d895224e5801c3022217ccb09b1bae184144c39127279ea2052a3920611a13c513de42c50b911b1aba100d01819b5ec8ec9cd803875f1e3f2ef71ef8e5684f89a55f220461f9e173246ff70d225458e104cd0b6eb2ac196241c91040c8103d2935818064cd1928519690d24601488e48c3e4248934593a96587cc617f67253532103dd515ae9d7a75dbe74898633749e315f62991f49805116ec027601bb805dc02e6014d8050c037601bb804a8062c024c024c02806802bb0fca05487dec433704892443685682cc2b294e00a6cff0c29515f019bb04c6c2d66069760afa012ee1414e3bd6d3cc13156beb4ee609495aa231d6884e5e77e4919251575a64c9454d474a7b456cd3d5aaba6aa9eb66d2a15c7752a8eeb3acffb66e779dfb75ab1bcd5eacaed673951b9dd6edcb4919b267233f5c4250a8acb13972d920a934c924a12a9dd4cf199331b183768e6326e504376cfe94e65cfe94e69755aaba66d9b8a738e9b2d396d53a938aeeb3caef3bcef5bad58df8ac5b216047170725aad162d5cb87831439c9c1c6f86e3ceed6f7d1dc81eeeedf34bb84e3c4305767471fba9114d52802c124084142c820c21454d9121645290906284103cfeaf2d96bb2c93b2e5e2908265f6f01605055176b8e3c3184c41121c5190a2287db228558e409998184f0c068312223fc0704464bb2c83a1080620427e50c2a2e807a536427e90293d71b5cb32a5315994be5c067359360237bd69f2677bfa32e4b663bb877fe4b994daeee99eeea94f2da3b8ec1d3788830c0a142d58725519191426eef8302b509e08a17a3273c2f4e4090dde131d586082c2e58ef667144edd290a8e58973b141caebb3b5802bbba2c8332c5bb2c838274e965191416da745bfb34b394dd01a952d2ad6a5d800803430a6bc2080102c893c480565e985201a9ff3cff465d4d0a5293806895fe4b284aaeeb899b6b2fcb9e9c01d38d4b2e12a15085bf8ad08e1dfc2d76403e8e199884bc002ea940a607cc642ecc906288c189932c544f5280618d6a07224f702e4c5104e6b24d6c472a122a4aa904b08c604a14588e44e18494e4c397c4e50853120daba41d989e870912b860e585322e60618552ea3268e062c60912388859018836b93489854b935a600232c95c28e27697652e0031443f48831da59374329ae2099268f6f45751270499a40b9a3f39186afed8d9d33f459d1066fdc940edff03051751a822f7014679e5ca9ff5ebf4afa24e0424904e08f5e957716bb1d14c2a5cac0b60bcb14cbf3f84d9f45bd409f27781405f27080bcc452adad9c3508c86a7e6f7e011823ffda0107442a02704d1af1b8fa04d7c9d209e3d3f5000e28f47083f5c943f9da8e3066580c9c0f331f394215991216949d3714f1616cb32254877f46e53ea8c654e59006980305c049581885b976d592b845b6b5bac18ee687f9ee926495a88016c81c615363770913139a3c4973441c1d64456546bad15092aca3c315183088aa2b0d0840a6d72c30ab4895213194025de651992932dd6baa8539aa4485b57cb52471a62a48a6f887c54b87f69320bd2048c101797654da2ae5f9635816ae189110b2d3829025908c06519932aee7759c6a40513eaf5245bb245b6444ac684c895ccf6e9aab10dadb28d4ad90675b6e1936dcc661bcd33d88607daa6d5ea9b507f0db55a29759fb3d986a4958756e7973074db5fe898c737df6c8d06b43cf949b11093d2674bc9ddab963a74dc45b22465926448a6802e68afee544c2cf70c01eee56b9c2654555225fff3407b298e425a28543547032e995e4011f080227066f6b949332fbbc289d9ffb655f89a3dfd5b7bda779ab6f54b6b8d16d63374cc33c2344dd3b4bfd15a0718ea0a69bf41692f19301a6ca37b9efbfc9ec571d1e2f99f0b9770be850bdbfafe9775f5e7b4085be1f7ab5f1a5ff07ffee03cf8bd758ff6606861fdd29e15d2e897f6abb001fdd2fe0b73f44b7b2ffc200ce219dab3f6da4b6e9396522a1d48544316412256f52344bdbe3c974d8bad3ff60f8d6db3b6abd40b36ca25b75b4bf36ff4b861993574cc53e9278e302871fc76c06e076057c87bce1347d8f55ecb693de33cb7c20d44ee9705c39f3d2c1ed7f776fe806fbf1f0c79f6c8d17b6dfcfbfd2a1cedfdc4d1f3780cba2c6ae21c624d7f2265f79cee9443f9b26f2c8b5d1696c571ab29587ebadabef666e71c65666667cacc5232338f26dcc9dc1a5867db68b23a0ceaef524aef1dcd023c6efceb66b1a0cfbcad48008b58f93e6a9aa6cdd989e0bd56a1cb0102b1f2997d905164e5bfae8042ac6c812a58f9b64d8d1faec7f50db6f1e3eb7acf2fa37f5e73878786f2b6ea8fec682d8cebbce6b9dcf7a7030460480026c9dd01fbf241377b2417cabb0a99b9a804cef734ad7466680400208000f3150000180c0a0804028148284ab34cdb7d14000c7488406c4c3497c6226120874114c3500c8531003106216290310629e510190587e00c5af7820665e283ba0c9bdaae8d1bf78003d2623a1580fb17ae79427f403d97177fa51e1a73ebc048262bec8ca7f78a168ba3edda8e3c8320408b2a0cd6f91876a0b7442f8bf82e08acd7aac7a2b330b474eff7ddf595de6c8c5fda55c1da0108082dfdde9f8aebed828df79caf14c7cfdbe2c208648ae3d532e37d14872c30db4d2bd2c26e1cb33aebae80d63e59d1d4f0156d0df40b7b626494435b3306da363904ef7b4a2943492e48f57054a5e498a58551cca0972a706214b0286c24e16915fadd36a5081bdc49b6c21630adf4ee22f0d0482cd392a1a12d92e8e92ac3f8c6679080e88ca9b559b10b9c38e9e087351f9a9880b9044fc2433d7764a55cb40559367ed872a135448052b668abae102d14090eeef78ec7f8abe1bdd81a11c52a99e79bf01d6c5a25b3c0a4101b8c5819a4c8a4c09166444dc6c1af4c8354b956b45570ff63778ccac00e3afbc92c64a5f56b3fac831ef012e6b604a906288c2ec6af60dc26d53aa7aeb0662ac9de7f4b07eeac92484e7acc1eac22b2f1ce60a38220565bf47951b36c9af65e5c77bc4971803c6bd2635f487fe596ca92a513f9c33a539410a0344a8d43747f521ed418b0d5daf96c16d1b9c0665d9e75a90315ce6ff41eadffa27b17f06252b520f37681a19eafcdb0aa80d7f0f7888bc9a8a99d4788b01b47b40ba340193eec5fbba7a96743e077bd3c2406111e34994fead472391731a8cd98c732b2e702e0faab0dbade0f530a48488f30ab432b209257ddc0072f41222e6f0490a743d3d1f70240cc90713404bdc42f7c320fb888df1febeb27f22b4c6cc3323d529f5e791d677f67fe93220199ff05b464f9e0c19447720e70ce3416e0573a86ee92320a109bef8202bcc4ca0e7a9c22af322c2c5f4a2c454d0817bac0433417e158c0dbc57bc668448c55e98803a1015a99af929be3424262097b1282b0e1941def76f0eb83bcd2d523c67a9dc31af7891b575f9926f2bd0f26db7836c67a172f6d3cb559f58700af6f11ad6cffb840f32d6a4ac0a6e81a6fe4c84645ce259f635c4be445d8769f3b78b88b0471ed2ab2e9bddc714063b8a55396820014c411dc762577340e904cd53f10debb8be419ed4d77987491ee47dd093952d4b6dde22ca29625713963fe634d8ee85c877acf10978dbd1bd4e77113c353c3f09d787f3b5aa3cc590bb78a5ae9cabc302535c0b3bf59fd11fbd723b17b7e248a429af2fb4164e8f2906c8ff04b88380fa0658fcddad664d5344605d688ffa76b5340642f0a653ac3b428c0c0675d8af48c55e53424461cca93c10146410ace2e5fb7a7bf816c9bc36209da4713ddc637771310384b8c3ea482d6cfeee0d8167c894429a9b10ae0bd1ec8b3c981b4f1a51a47659928ff66af49f0bd57e24c8da8282ebede576759250df3f85e7bf6a6c0a4f6ce223fd497bada73a975158e071a9a1fe2c0f5870a2ed80ef9f770e34f07586a729194ed26fd2d6cbe4a595ea140c34a219bdcfb2e6ac157a7fc510f72d08a4bd534bf5f793d1eec16d2120d85226f49471de6d19e873c2754adc448b9501d2c48892c73982f2b28636e8484cce74a098f5d6eb0c47435cffdfd8df3b541882606398de96a75ac319c49ba8c9fd3175a82a13405f87459bf3527e613f73af6684960105f16aaf313fbd504966ab2c30a1838960048e815dfdb08a09167fec55d9ff061ef7396d300a8d82088880333dea4bdc90884a6b67ee3f722d266af7abbf66f719b7a1e327c81390cb239f72f40f8c603d5a713c4bfc470e179b07e802f30dc09e3cfcc17083638dfdc84294d15873bb976da9cbb0d3486857ecb4bb9dc7e5be85f635bd8c4fd921d02c507b73e7830f1a6a9d548c1078b1524960d6331e3d470d09950919803157c10c0811b1a23e96a33c585a279cf81b1692b32fd4942e33d84d98702dc1c66fbfbb8b7dfd8c3510c4686d9fb41c3ce60c66fb7a51c4fd41a8b986a22937567f8aa0f68b7f989b7f7abe385b908e9c2c847f7686906c1c18d21dae43e80de0230ca9f99f82fe37699548330ccdea89686ef4a6429a1541b6208673807ebd34442cc59c9fd20fe8c8a0a24173ab2aea6413656c08f60566ca91609c5f27f6f4cdfc958500a077af6d5e9a138bb75f9d05f4693ce91cce636b105522af107650e4ec670f0acd6909724e52b515e0f28a7d3c8940692f6f912cf130b82a3da1e516f845017c3e78898a9296d1bc6bbffca6365b2763b8d7348e0de8347611eca610ba52c8aed2d6709c6ceb4064c9705a9fd4fdf67a945b118cf30199dc8cd3aa404ed244ed0360c3af5146ba2c4fc2d7da0e798cd4f7fa16c00e76b3221c412d1874a92e9ee94260e04b3eb9d3e3de775139f884a53526c8bcce1c406c98ca978d6b4d066032b337d902e3e5a2f48dd1d212ae540de489a9f495f304064c33a1dddc8c6b8bd2088492af091ab834177759cea7a4e0d371b1221b6cdca03d701d57e432d9e905ae36133423438af3ef53a7a9ff190b354aa4996be0e341f382c289d753e120ca36408a7dc60450d7718c76dc0a0954ab35190cd9072dab451246397dcfbb468182624bad9f63a02e0ed718d1de93643a1c2e433c008e1941df9fc8718ea2954853579e185c4e865d7534be9ac64e89472cff85e0c0fef7f6da688cefa84505316bc0a862953d68b4de3480c537702d7ca94442a0775179e03d98494be48486233e0cb3f3d0900fc85531d6df7995d363299e8e5595011f7c6c5767f582ac9c6e1995d383e9b254f0ba1b5e66a7b23c49a3cee42984d68f946253180e1e7e8cb26b93607f768dc3453d5524ff2e5090d322fe87a9e2bca65a7bd0c27961d4e5e93f0747b2f563443ba12637e63a23e9fc09c3cc2f0fce97c946eec8c229c89a97dec4d65208b2d1cae64b1f28e585303899c145226d2489f35f4f9b6fe465742eaf20bc4959178368426d9be00a27035f8f1471c817ee82563464b5dc096f3e049ae4055dd9a565dd693e75fe213b1e222697093e130e990cd750a0c143fdadb7c6a3a6b36895d371398de6a66e4e2d03a8e842cc5e71246cb13c7ab81aab0d2f1b23226a5275386da374ef90982dd543f882cab70be10fa472e77fc21d4204f8542360d9c494d715963d030b44f6765e7e541db31c4c2ab02336cc736a138e646cbc86077d894f2ae93a0adb96befde4f0f68ec56fa85207f5b0cb516fab8c52efc399f86956c95e78c7d62cac554447aca1de701c161fc8acb9a974d3e91d3707c71d952d824ddf22b76ccc9a0b2e0fbde470bcd014912406655df5e6af55b3feca01bf60bab2a4b1a47bfc3312694d7c82003fcf538b2eb6e9c5e88098ed10c351c71329395a11de509108e1632e526f84d9f072369844b94a0b8a62f953bd54fd9e67b4026c5c1577340c72d00869e5e318aa78036c8c790ae1943e6e561958b745abeaab5510e14d816790de13c14bbf309dddf80f3a0673aa69b6aa2a86ee30853518c12b5c81749557efbaca6a20bac0e147471ec39bc9cd11dd3d6fd3156d674933c1747e8c6355e3705381af4cc2f5fbf705a3d7b3a650af3040f195609115e41b051450a5a2735526a753d42d0533f30c108e0eb827dc054ff42710c261ffb8c6d19113e7633cfab2ff6ea917eab633a56c87bd5f85bccaab3be055b8e99083edc80cc2da7d87eb6479225c72c1842fb7a095642e0f0758f12164c279be0867b756c0d8321e36461b7caf3be7bafa742a074b4fa51f4e334e8a0bdb9290a7aeb7ff2b92c7d51207bee90119471d7ae31c16bf97467d9579acd5e59291de053bfe679cc6e2c979f1674675fc88deb21e19cb72e34c9080cfc68642f7db5e3cddedc8894d6e55c4b628be355bb3ebc95a4947598ad6a18b8b76918c87819b9c455e55e962dc677b6bc113b5b265c64b25a13e01087f892d8e5aefafb4100319ae4bd7a78adbb6f2c703e076c446a30e6e289856d1fd9ad21d651f79a9a6432f3076f3522158b54e95af489a2ff385b3943abfa05f2c7bb79b3f989701cf97cd845e64c30f4514a609156076bdae24f717a1de8009b529942df056948550cf4392c0db32f838fec6f8b118f5cbc1c92f3037eb2eff72467b643ccf88d4ac4176032c55ad09b64a0ebf4d6444facfeee43dc15fe0c80a1a9214a974b9811b1130e33c23eb205cb61bd4284e60451b5b9b3d4ecc07c195c62d8205bc38a61eb595013009707652fc7349ea8c0a436e186a210fe1d641cbaec188a2449c7636cf63e6746a9a30af41c5260d14aaa872ca4cadf09c4a2fa9bd0bcf0563341983f7d21899f037d61e2a07bd97c1ce21b1151b5aefc4bd5fee261c5ead08a5ab3951439a47c3a1aaceef06acd6abe62d1270918a2896d237e6ab582f1302eb31363d42f2b6cf538940162aa01076293a6372d735793f4550391211d02201e3ac241155c31a1a5a6630e6bcb53cdd017725a3d50fb708afdde3ce274354446f22831177e9ab10b1480f3586bb6c889e20ebfda7b94a845dbfacd77a29b6aa5220b3d9793022faab65a6bc50cd9a7f6abd61385f02084d659892d4a7dd676b66eb5d394b1ef81b7fad7db8fa0f20dce6b565c3c5a87f95006a372f5a5060a6f44d1428778daecd357e67b7b00c2cec0e86f5b21e56050bf21eb1d4baa66081e5c826c376527f238462810303424c323161fbeb95b496686c47ee368314943824291014137d814ce21b0f9cea0ecbc6b720a6a1140848c185637582cec9a3e6753320690098b4d83b29ef8af3959d501a7eb6e032b96c42a66bbaaac5b3f2ad0e84658205418b9762a7999588351781327929ff5eccfd34e69a76feceba3794cf78dc3fd22ec049f14f41ae740673000e238928669cd6f10f9478298665b83e1b0cf8657905e00cde5e20eed413148e7f87bddf2119da9f16e3afc5dcc3cb802870470e18dec875b580a9cf752b92d18d9feaab5bf0e4c66cbe66309e2b62bcaa510373bc2dcd811e2164738f79e933e9e94803e8ac128365d1b9122c197e214cd4f521e30870c217ab3c222471e2b9bd8cedaf285eef97661226e7a4fe102037efd7e3969f77c17aa854600003162003083436f1ac6f36ca52ccf00a23efef97c78e4f0ae3b74b3a00610b5a834b46c5cc96e425cf8a6a80b6624523f460833aa0f8aab0a32db41fbfec08fbfcd0ef5fc2e485eeff92beb1f520552c4d676fc360b2acb97d7164e13489f0b552057f74699fd19ebe633871e267a94b5b81ebf2396b38ed91c8edaa3955091e5483a6629a2d630bf57890564e4bab958501fd3dd476c9cf8bd910469b2c94d8fb286943c02f72b5a2267bc8a667030fbf5dec3c28488c205124ec059da43a55e0764fdb2d37ac995777c6c2baaf7c26cea5e01679537c3848c216280935a6640e9d6146b5456014f62e201cc28f25cc0cae1d0aad5d0346fbe02d97f1b214065aba974afbca2e6f4647168c442cce79408a84ad2ccde330d109cdd8f261f30b8c89cd6e1747de5171669a0cbc1f6f93575e5a46a7b0d952d93b331566e16c3ebac06f7c0d37ed9753184966470741d236690dc6c5bd1e87c8f5ca24b64ca48d675b56d1bbf414a1a2324469066b985a01e9658f2fcdf0f9dcec89a22a40c9ff29303fa797343a2b6a5fb01a954f50f8b0a8a422adc7ac87901e909d9dc59e6b4edef49deaabb1c295956fb062e64c7b349f749368acee0b6bdab598d91830e0578fde09dfdb479ad1eb2de43d9b212d56ccdd22822c9b99cf134c538536a802a97cd24471dcd022aba2996d4ad2e46cb3a0e6d251a96cab4f971582109e970f271cef9585678469b66961d0ada80f8e382c9989528e4bb4342fa5907d5380d3812461cdc9c04d421a738d345dbd21551671591fa80dcb3aa490f4da60c5361951b3c4bc6ea04460c27c03b647c42b30d9804957e24b54ee73bb307298279f66e3b07509e8f058c3e4c713fc36265266f566576c9ad43b54965a4a810f62ab9e1a358b6936345346a561abab9c40d1340def0ba2199272af3a585f3eca0bfa426ee4286c36e8d08602d796934348aa1f9e27e4ed0adaf09354ac2ad5d58702808a61a2df9e61bc5618c7da6898f784756c1b266e33118485f011fa7d078b2630a77fc4a6b7f165ab64100f70074a9f6b8ce05e5151f0ce9bfa991a3cc4c308d5b510cee9042d3040d7c55bce4d2111c8a523ba69bd23822bfba7ef3a0ba4000ea56498fdc298f630fce5f257cba29422e140fb6317214dd2b4765c0d5ba898940f306a8ceb403fcd5e8aba488ecd0ca76abc59c06528e66258366248fb9831f31a97b85970338e15a30a16525c7a4962c99bb44c89223709b4690b8e63bcb14adbffc0e71e733ecf00fb958c11b733b7661e5efe55a807ea89416630bc9d253e25a4838500dbfc5c4a825cbc489ae75517ea0829f9d5b540d576009e9ea97a4368e4c1ec5a9622360d90a2aa447be84585b9a224cd9411945f2d517c55942aed070b060378360e855ab23db3140d6be24d87f7bc6444f73a7cbb7b8c8cdeb311f72bf234aea080e7e9cefd81cfacceb3b8974ec22c7060a36932cfecdbeaf8c8d9f6c0c8f59c53000d5ddc51d08e75c04a7417819839663c0e0a221df8c19459bc2103b592e79b94e90756c6483cd7a21766c211a34d6b45f1a43c474c97d29230687892dfae712cd18b22f8c440a1aaa18cd3202c263172768f079a9297e1d8d58c911a861d887c9c5d2b96cae2839c9c60a89743d6bbd08610a02af95536aa6aa6b25192ea8c3292451d90d50269100ed7ec6930ad23f6e0c83efd0a89c0a638f0b199409838e3cc068a8e929ec6d8b5c19eb6dd1a7e90615c428e6dd1213c43d1772a8d5351932ea9f299b38ea005f93f445d46d7760d4eaf4a57e74ad11dc6c38e13a082329d91e19cbe8b4b7c4886807b6a6d2b0d4c86c67c1eca534082a738e854cf6b9824801de54970bee2cefe8e1f43d9ed4aa69e969b40a7dd8c6a5dca41d653a6ca3f39124429034efe6f6e3c345c87b3aa510565cb8805eeffb58046b3e22507a004ebbc7c5ee040e83567fe425822ce096567441c2b47a52deede566d753e4e3c92c288512747cc09ecddf9ce3c1948f6e497d4796b226a992147149258cfda593dd4840d8688c6ed590602585d290614a61bc46200458b4431e6df1c2af34cde372c5b47cc87f7becd9b2e86d3a54e98f210a6eb2c0837fa1946385609a9606ed440f72e2d642ad3a59086721884acd02245d559ab40ef1fe28e8d67bf647060864a211e8aedb6f959b4b181623a7f10b988ca7f5af208803440c34658f6cbfc5172628c9a3917e70671ec0b5e49e199811995e20caed545eedd065007d1166ba7c16f042fe308e0527067273ef3c7d752bf23731e6d88a9e4d9843b90a120b8bc2d2dc1fb4ada04be250fe2848bbb266434f5b4be51af92c3e4a7c0c6d266fe57c108ccf2430b6be0824944843f52fb1cb3461b3dc100382211501a2d93d5375f96e653e361598c4387da5e536dd2668f119bd7419a5b4b7ee37efe02fa1c248b996ae91d5783353f439abe0f2a2349729a2c3c9216265e4e4b7a1b045f15aca80030fb264db54caee1c027a2fd9a66bec633572eb2b60f140134a887a3930a29d2ab7687d52efe106808221f2dd7ec44dd6a6b3db5bf04ad9b61c5381c0909b660029d4840ec92001151d01269d5e1bcb5e03ad4038d6ad410a03d66c95526cd0e69133811d3438f81179661aeda485738c075e215f8a0a3989de24c63254a4a4217b18fa49382254d7e236917ab889af55f5ac2e74a7660e9d852ec86e2d5f694ef06282f67802155bca2d7aab2e74c8f43565d93318bdee5c45d84a95219fed69b962f01391f51fc140d6256e2d88cf5a3fad0c168bcff57f5400772eaa80c984f2805053d264b09b31d2fb8fcb7ec40151ad239279ad7566809747051682e2bb1250543ea3d1d0e4fb91fc4092ee3a75d2cf9a9a4eefbf83195fbc9f147e717ac81c403cd7bbc97dda66844d3962708a6565399ea3d256699951161cd13e726997c9ddc5494919b68f1684430934ab87eb9abb5d3aba47588d2c177186f662106b3faa11da92be528da6e6bcad941ea42f5293da34420002c25b513c603538fb0e90e223617e6620f2f1569647d6d272c0dca0f867584c3b3a6a5d0d411baa23a9bf63b001e88c8d7c36c2b956590a5c32922dde4f0aecff3864c89d08b39c155060937876d7f4af4255e901fe57aad8165063b24d69e35f58f1bc193868972a25dbd944ff277a17aed7a27656d385f95659b9399fcb0f550de0ee474df2e3f75a6ff06eed12226f51b48f959efb8544bdd507381480689058ba67924fac7a23cf4f648489fcdf48a9af2c1d46d0992db099806b18fb89dd16d4d04a9731bdece4d323332a7135b1d96303dada2c09dc474a7c6fd7c3b16ed951cb3c8115eb53bc08c18ebd498df483916054bf986421d2ec8c5e913af923a5504d85bab98855c395716f6b113da6b299e7eb9b4a8b824424cb9e6a18007d8378d4e16ac94875e17aa210b59648d34acf41c0dae24c004a6461761e40f5a8983b7986ace869647475d11e87b23d551e140d4160c125d1a48d528486d137866e06985ceb7c5d775fdab09402f531976c02c91dd10036f445b5bd7f8267ea119a2241c323969b571360a3b4beba8f2bc0cd32713625798e3928aaed9f2bb6b2eed90159c62d2c75e669461ef93d14f1302964acfb839d198ccb1dd2c7ccc016b6146782ceda38c6fa38c43fce217f82fd9e278effe76ace74d472b13845e2b80bab5b8469f079de330e793cf0618a1faa8b398e47585a927b2923268acffb222d27eede1b592a4816e135da8343cacfb72c04022c1b73d9cf1f27c06592dc474b026231103c1a6d3b039353e243e4b0f2eff1b053132793d7b589094a1b84408845fb3b27d08320f11c3173ec469a396211dbd07007ed707ccdea1608736aee175e4626682235b7b40f6d1068ca3537ba0f3dd5c9ad148f978bcfa96de9d01671488108ccc2a1ee14ef57c138af6af953b466bf21432720fa8b8ad82437ed415f2f0c7a43903ea28493c4d69d26c63d1cb400e6eb09a34ba885be20485c4a483e890c7a999ef62a82c81bb35228d69c044a424963280b503534f99629f4f9887a8042290cfbafa7f5501497abbb80ba2db4064ee08d1a2e1614b83d493dae58be92e01e55c3d7d594d2dde27937d066e9855264fff98d0eb3b508102f440909ec902d91e835ee61026ff524a4380a0a2c78512bb54dfab6dfa77f7b401c75b472c56442954c179024d136ff25cc6e63c63e09af1fc411e6cddb268d6433d7b479ede5698cad96a6d8b67bf47858302bb85cd3c5a996938d506ff4d612694757a2e11f10fcbed09bbe7b9f5df50a78d23aae21b88e77d367eb87353a48b44e9b0048e0d70021d8a132fb547eac8656eb787065e631f4185d500be16f1d8aeb9e5df3935ec1575d9eded1df3af49c044804e1526ff9b518da42be7962589c8c85fa2dade7da21e461901d63cbdca1e54fd3f518251af285e2731f1da7e334d37562357b6e78b29cb44ec4838fad250b5560e0948cae1e02b411252d2fad9e7787f28d97058caaa19d79dcc1a158a065b7ce9579f55d7cc522afce0f5f10c10bfdd34cf29e9e472cc8a304d238825370358ee294b8824b70356ec5d1388a53e00a2ec155bcfad36edaa5bdf49feed37ffa4f3b6997f6d27f3a4fb7e92b0dc4f5d859628c7ddcca8a604782b3319f536afb09318359eed2ed9ac02ca6734b6d6f42fcacc7444ea94ef84efa455686349d38d045d1ab1c3c753ca8ad28b6e12b121d99eb90cd9d320a67aeab9fe914abed15277dc5a59a5216e5529af2539af2500aa0cc013124409312a50b580f09f919d17d15b771b47dc9eba714888216f4b34f77664dfcfedf0d68ee5c0a426f872ddc090cc6f0ba3e353c97bf00f311ebbde213069aedb25593640e6bff584de0ae9d2cb5a4bcc7ba3b575394b700fe941ebeb2b380c1088526d877a977549ed5fa6aaadc65e51fab66141b201fb1ceab7c8af5d474d9a7b573409515422b11d6ff3d821d16cd600cc8d9102f1dea1ef72ba5e905de72660f318b8dd75a4f0572b81c10ef37a8415bfe949ba6a06f7db9be0f6b64bd9b825b37954fe82fa7e78fc5c2bc9884b9ddf2a5ccbe47515f282f795a9e07daeabf7c11d80e49c8bde395ff9b6e0c2f954b9e2c7acbc66b52c05d953ca83173fd5597b45330dc0d2f16bc9ffc8357144ae67bac72b68865c6b0b8fa1fca86de5cb7221e45c0848a3a333c2956638689ab5bd3d0094c6c17d73288e11bf6a9f17237e0dd7ab7d59213f3b90046916f1658b9e27399b88ead63919be378aafe33d41365f845b02ead3214764910ea43263e519f13af4e39dc9ad1cd7f8dd35134703283d8de16583cda62a260c3b85b8c18192a6583a1a316aa260320bcee784bd0c5db9ad310116065164db2cc3b277dda91c7c4e8be0c18daae1ea04b5e12f67efc9a0855e9432f1b2ee931d8cb12fa2358c64cd828ffe70fa7dcba5e11081717b11b57f20c2ff361a3a4a11fb7e46d8e0e6a077088e25a0452c216ad9fd00a342d75cb843a2e43156112e6c6e9c4a2cfb88b9936832ebc3d5e5b3949607232d947eed368c31e936ed8c40b1056d1dff37d33de25cfc53c75bedf6e932e16805e3bca256dc82cf36185b8d89feb5b0f9097f0623d7c3cb8c2d8a618a4688187a9dcb5a48f6213b0dd72e1c2e9c5c1aaa3ec1b3ab3eb4a0390c66737358913939dff2c2d840ced7a7f5ff557926ddf4a43d55b1d180cfd86d15bf004055709aa0c8418d8dad8bf1a62f3ab84854bf38862b114760f42371a233e0330c50bdf20dca385f121dc34fe09f32cb3b7baf15d888bc81ad2347bb137feceb54a75d2c83c5048ad8ba987e95c36e3181a90b2818787a3409215be73fa5d510aa41a521b8967fb9f1250a91bd4e3790adffa52be45fcb8db23d138087cd7a285d32ddb3acf1d3ad7e12e84322544f6661ede4d148b9756cb649a863a4d3e769fefa113e6d9ceaaf412be6052ce56e11b0d029903393d1d6a67120cd5df1aea75b8cfd1de413fb03a32225c6cfa0005d09bbbbb50128f08c38df78cdb79aaa545b72cd30d3df568067986900580d4da8c67901a1aa41e6374cd0d10793ef62c66d9d55a54a6adfef47dc49e49127ae90efbaa2a0e1836bd26b4a11e81c66aa30656b075ca2df347d199c12027c3c88ee88f0118a7015b149213a3c0871132fe7023283d9409db8fe6dfb47063a0db43d5ddcb273e787e41a08a4e7019fcebc7620bbf5e393d0e687b0715defa745ee65061c80aac090d4b036c53cfa8811d3c90e03df5ab6f3a3309c2a282373e1eb81a8147d0622dd437515ed660a16054315baac188370a6ffabdad8d183a3180901d23dc6b9a685a7c90185728f9bd911015af6de36925a7f9a64f9e75e32dc5d8d26f5a7cd364e94c6d53f3789a3e7b3b41be9f68e568d377d4ed290cf346b91207a8a55753b902420ab5f270736584b4922be8894445aaef0b9ae85cc19cad7db60641184957034793c78ba169f576325d867ba40168a048c2b8499834bc891ef868fb347e8ad4477707fc00cd8c57a59085b258c236445c08bd73b530c24c3da9a5c3115a77a18f9077da13a164cff1eae88c38923b425bc34bfe13ee3d5df612c5bbebe4f4e7d823ec0487161b702214defedd86faa0ace200f15710f6ef3809bb3783e49a1ad8112d4aa8e74d94e54ce08c5924e03c0728df669624f4bfb39fe996134bce6aa52b4ec4355854b1e6e1ed19583bf6dc6e2ddd3f4258485c2b5521476c17b80892234c406703ffa6548561d96d2a352bf68f243e7e307012d0460fdee631dd0ea396ec8467e85ea72dd84b7fd6e272dd4578b6bf7d7bf9c696338772690e3a25bf473ea61386a66fa721c8e7738f98f765c8d4ac419bd44b85427dc558332b0782c4797c14e89a3567861a8d36501b1090ccc89bd03fe235768c79db48c4682633fa3f6c4c775d24024025a59a181c70aef1da52be40f3d3196f62011da0971831d391070bd35a6048158c4a1bd8da3d6bd7a2ebe4cf66dbe38d087fa22077fc87f688b403d063790008a03d7fdd22bd269de54422a76475e87996534f8f193e8feea8fc571592bd2db36fc53a10b3e5db11357c762cf4548761ce4e58a4c3b606483d0d7f236f07c322f825536a9c48ebb757ca8f1423e8db6e408c35d48d431a8f65fd5fa7abc8bfb88bbc9c70380d35312ee17edbfbacee4b3c968100c26082ff01047d803621e99acbeb6622b43d1c8772740b1b77e47bd774b418d68f1aadc571d73efd52863a0d298f3fa28ec6826f656481a890173b80f9477bab446e79ba5bb5b1b0c9fcdaa19c1f1d4dbc5265966d49177de3f4fd92bde742374a009881b60adaa89fc264a39c921a2b880db7cdb96f1179fe5cb0cffa50ba1d200f11afc58c3f70688b0b95ad7deaedbeb07a23890023125887251fcbd2e0bc8a8a1916ed52d0c3e0e04aa72acd3846fbcad8e8c3a3a85e7934b1a968226ca64849b975228678fcc01e03a9f4da99a43c20e671325f8cfaa3812addd4684c7f3301ac709c565093571f43d33327153bf58efc79ffeb14bb895eef3e197032a72fc2775bd29ae63c1453b5dde165e62a1bda297888eee2d508af0362a9c0b8e35620ab18fc3b50da1b6a13a48e5b60a2b2a3bc0448cdc50bc03a65faa04a0d997d9769c360f225203b6b632540ea55c201c282c6f2c3f55f75b38295ec71479b39ef96d0e2a56cd95451062bc936909379b7a1b4db64646568150bb058464ffa40a4c55419169beccd088750fae55fb5a0ab5463bb63e33ab9ad78014cf4881b2784d55bf5b99a76c84a74576d41572aef944863694dee7c3d425d4aa68151f3340b2c30cf722d9ee08e38016ed5257d322a6201907476f045d0aa926de8e63639cf10603cca28dfa4e446093766247165d2f18ccf02f1b806e55d099e3002e7c9258697b5dde8f1d741fd8906c377ca11d6692bef9a028470acb52928e9b06fdfe4c1cf2bae09395e248e18673ffd613c8fd6b71235583719869d26435169174bc121d6a7ac387014a6de065a1e002a433c85eca9748e5c890e8353dea319a38ec64d114df369d0aca79d986300e05657eefab2533b9c39a3b8d4a5615c7ea69f27c1b7891482f7286ff8ea1b6105d4c2dc446a9bcfe18d714f0a2de9ed0f8a5bf833fc4d4aa2fd644648399f2bcd3d69fd7d090b4499262d39d3dd0519ad398bd4936cbc4145a4d3899e80b2c856bd3f618e4de0c09b1763faf317edea10d7e9892577fd0d6bb04068d1a460bbb89f010914a1b26f23003bf1585ef05e8ab0b8d53efb8942434a723fe9b847c15422e3934e120623ebf02a773f0068557451c6d79e99654a5376f671216cdf71ab78e5a13f2f0bdbd7b61dd66b692c6987917aa38e2ee9afae3ea3fbe519c1851705b82a73a6076990c55876bb03bc17fb18dd7d8691fda10b91bd4d6af0d92ce7c9c2028c7ebed828ed446c3e4fa25ab0bc2599f1b1338e79e57d573c0923bec71a18330e0b5df6346a053b9c8e8d4f6170dbe2ab52e466102a4631c8cad94be978cda178c85bac304776ed8d6a84a85c86703a46b78519668c0b36454deb56ed694dd5445cf314f8c2f3298a859c14c5617680f2568c6ec8f8d75906a4499a9415cc9fce6123bb327e68495ad9be9ee1469dc4729ca6c7f9c995fd35834181431bbc956e431e61d859e5f48aff16a3a1e6006424b901fa18a0ed487ad79852102e55e9b01d628ec0d2a37e0e43e8b2af16b76ae3a299f9d5c9ac80a21ceeec6e01a395c89135da1c6d535f99fe339c74207e4fb77ea86268f0f9a5376a41d4ac5e0f86f84d6b8ab33a8a145d3f84f2e0944d212b4136505250d84682448f4e7342bfbcbfd1b98729e68ca5d45d384e7d87df99dbc152facbe96e59342e2fc2887b9df1fead5329c0f721df094b92ce88218403ddf58eeafe48cd463d8890b8abd6edf4767a63b9cc9ea650e50f6cbd38d200ded555c4eaa705d50eb96cbf9596fe780a6afb6497c524aa2686dea33ec1b9ee8006ff2a955f78ec92943c0a3447f43896060d83049131d72683a29e9626b02870b3a28e75e0701eafe1b9a1ef11cb8009518256fefc705c72c930e9384a3a0c2d2b97f7b831f35b7f9815f2d13c17f271165ea65bd191e3a03ac56f780b0784d86e2148e07e3505d26be5e944486ff0eda5a4c3087c5206441b18ac43c28e82f1943589c3da14137455e5a057c629e5982030eddcda8d5fc2115ab003c6fa6f37469429c2d4628acf078c4e8111724f1987dde6e317efeb09239b3b0ed57ba7fd2d15169ea6c60c2314ff593c64b2d739c8b82ec2b502525bf970ae527c066f32563796c57909f0a1a1a692837c7106e35e2879ba07a3a49203c259eb039180af5881539e1fc478ce914be47110ca2212813c36299bc1896043eacf41a26398bb0c773dc8cdddfdce643e1f43a864b0b863c2a6e468a713fe5bfea3af4f301613d0beca370ae0916c055a880afefa3557b8fb2d8de55af3810b3917756ce16fefff33c7ca2cdf9f5b81397d54dfc0cd949bb61ef43404b653bc4669625af277d0513f9462ab03bc1b56eee189201d28b69c6eb8e25e8cd17b4464231d7ad4336348ae224fefec92312d0605033e74e92eaa83a6aa7875fc2a9cc9430f20c931c21cd12e177a4cd9e68ba3fda57b527d49d75256bef0ad336c39d7b7e83114e0a7ce24576deb0dce2540bd39747c10368fae40cb0a48672f4baf4df3ad7dafa387e5974b65575374b5edd9168e75192dfb542cc1e0dc635d261f044196d8718a23170c186ffdf76a8634f78d24b1a5bc012d774d632cc90d6e0e3297ed36446841acbcd3c26ad22578a39985024dbdd517b14f2f8b4a9a0e954301c37969cf31973690038a9db6cd51c14d24f83687f0f8d6f56878c3b4d1e6e5657c8464e58a18a56c85207bd2c67b4b4f677f3049075c0e79f788a65e6ae27eee5d0c14e59dc54400d5ac5d104941754da73d6ec47f5adb2821042a828efd41c096a948bd8f0f340f767b2b44705c6048c2aeed11004185c5b3179e6f2441294c356b437424836b70b5fa45c2da787aa1d8b81d32b5f99f5aea266803e7045591db012d453d1aa3cf1ad513d0ce32dccd80e7ef4ab41e368fa391f59a278a8efe94f40000b91d435e5a11f01cd47e963ae5359557c1920f481d5d909d8c09e4c8dafd382a5f108bd904220d2106fa6ae3237c131e83bda5f6ea4e8a905de45d45f00403cb36128f6df1e81892a264e66fe80c9effeac33e3325b02c027141e38d417e827780759d25d3c982c4721a6acc62b9a908d1edfb4969a0b77995c978e01635cc59a93ec6ba32d2a7054dbbc2951aa3e2f421f39f72dc75962b9e17673a17f8cf00b379f9b4af0bdf500bc7ee8b1178c9f4eb2c217834afc1aa6859d358233b3cfd764f7007b1ff15a12970221e4f7634b4d8e0c3d2f7a9d8088838aba2d9c1a7b71f95525350beb4e05fff6240f96074c0b44afc50a33b4ca941c0e50dd34000e97596e9af1c46b929738152b271111b63676f65a023b2d7591abf47141e6c4d84f224ea91a46e949fa5c0a1d4cadb914c24a2d89a8a79bdce424b8ec0b09d6e4377639fe3ae42b2a5b5935adfc328ffcd8403d6a238e2a7357d4aef73caa3e5a79337e062bad44ef213bd1348e4d39d9de6ebd7e3073f69d9c9cb1529c61064da5d6080cb91f8e93cf6ed7316f0dd6bc2881a471afb86070d7aeeea834c2ad7d0497215ee967a04288520f71dc097f98df3c11eddc6cca35eabd6b5aad759f08bc8bc1c8e53985d6fc95987b830aed7c8c11a865bf1059e378193e80b89acc703617cdcabfd0d7397d21b219fa704424b5123a4822ef2787a2239a22ea9c6c2c1d76513598a130129b9cb086f02c05f89a05b26705f3324161ea01ba2d9c88ee863ed370cd4c5cd7e4f015038fe17cf064cc9ce844d16c15195889f3f163840e410b5f9cd5ac2c68396633207910c1b558d56deb128e25b593826651263fc42255abaf680250ad69de319f27d5c028d8de03667cfe8942aa833e173fa83d39e52e9b67a1e9c851dc44ffa9a939925aeb7fcaa77322f3e329b4c573c1e447488d26ab771b306edd76530cef39da56f40c5c032be60e17be832533c1203b4ce77962b8a2e3ef33d7e549750a8190703e93b96bcc1509c4b243d9899dbec5765d5587969cfd81f19cf73beb3e89487ae7b83c3581a05eed4741a914f4014497f6ec869b727199ce7cf7796c84f369ec4e9ce182ab17f98421a92d566703ca5511426ac6ed7b5ccfb4f219ba656fad8977797bb3ef6a3c0b4003fe47281077480f01ccc6d97ed56a1bf5f75197161abd2a353f324b442136478235b199f0d4bad129bcf88809bde770e27b4d6326b0e86ce73f739f933b5f59633deca34cd9d6353f1186194b25c763832844ddba2f6f6b83f154709e793bb1cc8cc156c370826c8f5683707f90b147c6abb7e30d4ba633747ae1935edc282787d4719db72f4048a01fa4457554adc14fc3189f3d97fc4b82c0674cdc4b183f72ce4b99014876b96327e21cac0b2d7bde43d4bd7fda3156a2276612554a31d7a186da675e98040c2038afe497481b46bedc0dd4f7be8550fdd4ca2c8a8291d89771409d89bd6152cf08fd19bb1093ed9e66c36ede94c9b32f5a99f34de99c9f4fd5aed16eb20b7528a2b90c58869f6eec50d50a4b7fddd94f6e61028a414b4eb7a603e4b842c5d6b0e879c43cd63f90215358f68fbc485b868021b76ce40d159e44c686ae687f3a86d2ef8b98cb73598cf745f903224ef30707a3d0d2e5d323651d668c2f4e3d38e32313d95c30ad76d34b996e28ee7111fc38ddd0f5972330a9c0e340138253733345fdb98351b31ced9bf760cb34c6561a9451189a8a685dd0f48955a0847cf9e00498f0655827dc7058cf368d1f1a038d29f0af71ffe803c30a94cf666c1594504a555aa7dda8a5b789a0f086d64477b641c770ca8574b1a1ad4813e1962cdb6c2438fe97e8930677788b08513384bcbe4f09818c3099c5bd176f7505eec1c4b76edafc7722fba1799f4f95db3d1ad13388b329adab17c038928ab9effe63d6b20af31ccdda149c665fb5a64bb6daf7d5822ae80d671e58b853fb51e0f8e7039f15122b0f816b02f1e45ad07bb0bb7d1b4593331d12c1227102bc0ce9ca92962b6af4714cd03372518db8c1786c80a5fbb75ff771ec7d11ca21970a90c33cde804c714a9b5db351dd6595f1ccd212db1add0260d3cc7a1ead11c8aec26228dc531f1ca86221bfd0ca272fd58f7e8bf52a18af6facc3bc101996beac59be5cb88c4ffc79d62da40656045e5ad7fedb9a5af44d2034a70c3a339c40b90fc18fdb251e9b314d8bba54b766b2eae1e1da97948b875cb8e0e8a45253951b5e9e2921d5358ae9b31e81b7d5eebf3463faffcfbf9702d494301c1f06591a330a4176e399adeb173f94735d76a969e2da6651576295d3834f7e39aca2f3dfe939e2dc95b38746be21c3dd895bcef59cb74f5657665b144de92faf42db3a4f758a55170fb31bb2cad4bc4ef58c42008dc71f10122b843b10745fcae450c04d11d171d204277297e508d10bcbba01121b8e8c001058e99dfcf6092bb543b273c03935cd2b69bd059cc722ed5fe04676102e4f2a4b19fc0d9ea1e52de4d44c466a86099f9fe4a03b1280cb1a02919a657f6aeec563103177998dc82bccbd561e3022d6d23eff3071c00a2f9679e1718eaf820714252d1b0633df761acb1dbe21654fc5537aaafef073be1407f035fb728481c6c6bb0fc5c13e1e766d276fd2a5da07b08deecabc09312bcbfc3772b268076e8930edd9e4aabc2e721105f44421d22c1dbcb25fa1b84f06738dc273df20c50e1f257c49d51bea96d3b1d2c8856e1c5cbe6dde724bd901b3210ac2c916947ee2c91c5374edde1ba76a215305f9bd302289de492d0e5eed5d68cb68025aae4fc5295e1bc76b5ca334cdd090e96049561675b6040d022f3d4a26559576261049cf3e6bd8540dbf02ad1b60b07d08de447528bc7707c2abe838cc40052cb9c08df564d00b10e5c3f592201f2694eafbf6b3cc6ffda4262b03cb51a0297e1820b3dc95e061f9a08c3f23f210781e9354024a6f818c2b1f1630bf104443c6eeaa7f0d84e1917ae25c11a3d89583482cb4d02a9c26178e266cff1e489b1e38e85db595ec684f5cc4a919a53505b6eed3bffdfafde3b5cf6e89448d50dfb29f05c65c005f3a573536f3ec3e370a91fd1f91e2321f3d5fe7da92d7b7b1ac1c466e096be81b00dd4494995b78aa4c7ed9d21aab2b1405ea115a1996869ac1be8a35302ad08e41aeffda9fa7a61622cf77b3996e22b7f37f953bc55cc8ab8a838972c362b02fbc2e05811e515f7bb2919347f61cfef1c31273a799ed9a676dace67b807730d5b7d672e431c1c3c6a8a71bd786cc861e38b08530249eb791dc4721be0459f88a14417987af81a54cb3a6e0ffdd5a5a713312eb665b339ef05eceeb650df17420a771d4ec93de406065148afb87ea74d101c82731a392cc81d3713592fd0eb99342eb3d5495e723fb5b519de0d446ebb73e2529615eeac320c237869b36f37dfa5a8868a4bcb322508339d2ce7058cca5ac1e94b1e95ca4323233cb172d4c2b63fa758b535526d19c509ffdbd92ec2e69410318494d2593d33467207eb6e8e39b1fe716627da92c91c7b09195dc0770b689bca0a98587fc33cb40bd8661dbe3837763d7315b2d6f335f4d884470ff7d6129c18e74dee862a98283454f9e4d89007c2828c2d3884c3b52bf2e804baa17503d70223953b7861d0a0d72c1ebb9501c201420f340a78b1b68aeb66e539b58898621394738fd1018473c963bfe7825f1e913a44b55cf5465612a9d258d5cd29591484ba62422eea9f970f361cde3e649ab5090a1316917057dad594e0a57543821057ee1002f8d550c26e0e97f78dec1db91941d5d2013e381e682daa0335330616604cb6da4a15a2d77e744ad4414d7c5f037155b93a6a3306fd2c504a5c9e8d8f65bbe6aefd458a704a874cfc2cc1ab41d8a773e70b7fcd456c24c884d26dc55736f057a53bf5455dc51208d1fb15954b2e65a0d51d162aa34942d0766b3312b66041af55172c50af2171246069199604b9cf39e593d99eb988b246a855e587e0ca650c8bd2e30e6c7f783bb0cd0872a891edb8827a66206f15d19c451c242160d47cba635d9bd1d3d68a3440bd2b5adce050ff32493581b525d214520d4eb536db7eec01a270a335afb820114d7fa9f41b42dd941ba46ca71350d89fed39993268b20f85b8864c6c2c6fb0e05d2d5ce1075e5cae066f7ba8dcdb66a30b354e053d4519f6050ffc9e854c433870670201db90c0cd5b198f64868cefddb89902b86bafff3ed321d2d71b9857b92493c41d49a1ae52a4300832be89e7ac50dab724d85a81455a86f766f02c1e446296f9f38bed2e38245690a8238c43e03257439b0e28bd2fa83178e76846c650d8fffd4468b77494702168142379140de98e7bee33c761b31f534358e119344163ab680289da164d55e0e973e7e57e106b91b107795679c67d584c7d995f1c84ab1f7270dbea6e198dd67fcdeabbd543db4f60040697d8fdd964e72ee1504b64f12b73e6ea642d90eae2aa642a4bea8dd3fc8930c7c8cfc75eedeaf3aa7a5f39392f21feeade2eec35270d20fcabc09e942b12165587c0299052f0c58bec59e67e191246ff17a5d946a055725a823b2f74dc8513fc65f62da065d19287fbdacd73362a615d3231f8a75d3ae507b753400eccbdb295b92541c0ad0f51251bda24ff391c8ca0cc33b2c74be35d6335a7e5332d932668a1e5b9303787d9817035f5b5534745ecd05a98f0917366193eef3383c4d07d38f2414f685ea21675a67251589269839b1b41ba96b7d05ba2999e7c5ebae4fc1ee5d28b69b147d03ad615d21b306ceccfff6eb3dd453e63b34e47a18d5ebed058f499601a62986711a2ef179ccce6d88b1d8ec77af56a8124d9964911d866558c8b832fc9d1ca2665e4ea216b633b8e1b060d87d6ba1227a0d0414fd93ba375052d3b2f1bf83a41edcc9277134d12948704b80ddce24e3451c6f60fd02ab0b255b1c3d4105a213f567322236c0b86c1f18d8cf5a02a32d1a8ab4885831a2cc82c5e2252d3f33d9840e615463b28686ce94b35695641c0a68140df218d329db0f2ae5c99dc5cee30fa9f9c69fbf9149c40c5d04cb874c04428fa62798ad7395f11f6de676da3ef33a5510cd8882ff5e261aebe87bb09beeb55342de44f68669426c5836b99790a60cdb25e927469cd6071a9d7aa04d1b4f772734cd5ca952114feea23131a6cb998cb144ea96575653e294885e064be4a95ad38bf39a2fcc19f157cc0e075fa01f351a0bd3d2d3be22c08491b02f868481376e09c3d5446dd281634f06cd3fafd0a22b6486d6effafd3f2b8874fc852398897e7c5ed8c0810dfe6f77d87b5fba3bb73bd3afb49e9519b1e3f5375673b9b86e35e7be3b8ae96045e4ba13c0b5d04a3d4a93676f32f73e3f77ac17363a3ce21316aefe47aad10cbecea9ef326d0c2599fe91ad385a2bd2455dff29c91f0002658ac65f133dec72dac24f9eae4a924b13b0d18020641c22a906fc5a02d6cc3d4fded9da4981dc0b011ba8e6b2b70a0494372089dc0672c3aff983e55e3a887fc29c5efc1eba2118a1cfd1b47fedafc18da00b508ea8bbb67180c26eecf12817786327632856243bc7ee9f4696ae2af7288c1ec824f85db061a30dfc675bacd12ca2d8dd5ebac59c47c5fb2d2687d41320d399258936669733fd459c821e306ad5c6767fd9b760144597381a8c3b8b57bbc4b08c747b5da1a1f94ff31f342d0c3714827d108988122beadf9e732a0993bbc807ddc88ad3c70692567d756ec31ade8d0ac38ef713849525c099757ee88f64e9d74a8b79887f0b3cbd7a3841648afede9e10541db1836508bd94d3a98ca1a319db7369c96912d6fbc9615bc0ea377c748f5e34cc4385a852236ac81d0042716b798479120d0b55c9d85b63870662434f2bfb1cbc85b87a0476816e8875accf282e1b18d64eb83f8295fe78cf628c4859ac97b11b0944f3d16fc106da03ca0d2a60e4e67f2f098895b5afc58b8e246770d5586cff879578a11deb7317691b155bc068c448e55c53258a9734482142aaa44a7032e459a239109c3dea9c06cf617de7d422ecf726b028f7c153126ef09c287c4c407fa3d2f7138d00a59df7ea3d2a0612ba32354f532b10e248e54efee41078ecc345d227bbc459c43a9a478d8182954338bcd288b3749895901a51175535b4655f696b3322119080d4ad078b3b57c5c6ebd1d88fb190a4fcd49a97d0d413284bd9c449b132e925bb6defea7e346ec86ce2639ae6b5d328d7cd7880b7f483982ac5435a0d618413a04f38e7daee1400c0139ea8c597894a00aab0b742efa48bdbb5b1db73fac462caa1fb1dc20475eda08b51d3444b194a00d596a9baed4b23da65498ea693e19f2d4a3803759a2a2569640e7a50d1d3afd8ce264b2179946ed3df0a9dd820d4758a9c55649e59166df6fad48a56344e07ea9bbd91ac65bb22f21962100a85f358e5b0527b6360c06ec5ba3a1aa59243aeb2dc87220da11126d13e32102620e68cc13b0543ef7a5f7b9a2eeb3c0f1ebf4aa9de67129409b222c063bb0aa75f680570e2c6403396f3625e884d7729fa571c5c04e95161d6a4031a79362cede72fd6677b430b22421a4efda0e054bfd8ce67f6b70993c6c4a4d1e4a35bf6c686e57c997900aac56cbfd7090b02115c4f7ceea36f66b25e353dfb6abf84f2f58b3d8e84dfac5b6bafc15b3197652235bf77210a936d6b8e08700c170d99d378e6b4205420c6793201abda82cfe58cb18f14b986612c24c5224780fc7f444bbd737b3a4f3f7eda2a798ea48095f0ab4333279143838324cbb77ad4a0d795cc685104e5a771e0318145a738f720932913465f34b2e18a1963eb3b9a75d4b34e45780a723ac2befd5be07d050660af76c6b546399b6eb7a927059618d8b14a87b265c45473a6c3ae2362ad6e75aed99f7738234fd341c19ce26475e4829a583c0b93c659f4eb24ad0aec013eebb4333da52debddb36bdd51f0c8107ace1218231e59d8ae3d0fc4640c5966ef5a997390230f66b170781173cda9a26d651af7dc5703fbf7fd8a710cbc261d9b4a4e487a1aad7cbbb9a813d4ce857fd4dc50c90c0c329b37e06b3910452946e177451f1194360a6a8ebbba2e4bd47f22caa67a5e82e09d9ce904792378e023c1a022a6ead495c40cc424a07c393d125f631e9844dd5c1516d7348c7615b4485e33e146a9daf801b83446690df35367ee623b3025de4ac3bc07e9d7ba2ee8852bc583a84c9657eec4a4df698266653f26e60bfadb64f089184ecbdf7965b4a29654a0165045c0457042830466e59c3de9b1f527e9d43422264ff1ffe767b11b283a1cc951baa2f3d6539395ddc6fa7130ea3cf149e6fc3a0c8fdf6b4fbf1e3470d43f0907e5074c917214f309459e68cbef5b79ec435a7d7238c1d695cee43ed6bc5a117650e571c66b8d6b0caea1d6cf32b0e7d629eeded5320fff9f3ddebe1461cc7fc8a67a87a6a4faed9c34e154ed93a535dc5a173f32d47390e9ccf8133cf4dfa05d953ef4ff42f587f70efbed9ecaddb0dbbe6736fb39b8ac2619b9923dcd0df777646b8413273d835ad530f88f33048f2647f7a6a9f3af7db09eb34dd2099fdc32099b9a7afbd477fc3619bd9e1efe27a74d9df8f380ec7a1f63f2a0879d23c6706e272c57ec42fa043f456e11a03550bdd40ddf27b8c1bbd2a892a49eb61dc55d7681e1f9a4c114205430e3e201951b1d0c3142427b839c1ce155090e794285fab1571e8730a0a397e8f0c27393ee75feee14b0f5b3e12a4943247a55fe553797de40bf18faf42e24629e57c2153c6223d20e5f04a29e2bff4e0274286327d00f8d247fa10f9cc5721713da6232682a8523464488ece71e4a22f84620d5490fd9d0de7918b600ff9711274cd3b9f7af2a363577c8a792406726f8329250fd00f6509f6882ef9aef9d18b2f6fe2093ad59049e79c73424993e79c134a99c84413292c582933a0905529276c523aa0f1c0e6f230c58907321d142d76698725285aa88892be136aadb5f210030f0f3e9cc00516d3630546131c0acba1944619a222b283165e6c072622aa21505cc83ab96350a0e4f05bdd910a05282b4041a21a6176505480622487dfa22a12c24f7ecfb7665c7b67772778696f9bfd9fb8691bd82f6448475319a994760a199aafbd7f6fd8daededf6767b6bb7b74e3fdbecffc80d9c3348965df36916d21732344122921c71f1f324c78e3d9992a318550937eca50bfc7f274d15915b3588ac146ef81fe57f4b8f3d9115b32a851bff9b52541d686a6a6afa420dd771dbbac64f5a43cb9ea5c9f95c7b05d9e270660d6795469f149bebd9941737b671d254040b27685cc0c289d20b584c275728a593162112ad24bded1c987228610b4a295da2c3902229260a72c79cd0e0c4851cdea733224bd29416b74189c32efb9ceda913dcfed9dddded6bb2487de150c4efe8fa39e39a35ad3569ac9c5df477cfcf70312744624db8b8c2455ae5d7fa4399a35e07dee417c49fb1731c5cd659daa5a8b833879de748fb86fd08b2c2fa997cfad3e3014248f374d5a76067eb01cd6c5f4e97274a7110992dae1e507d797be0ba69501addb171c4eed81dbb6882fe8c354193e77c6eba07d4ef3b3a4dd3e3417fbef480e4cf28f1c51da5c716a4941ea5a42ea594524e59c27469c6cc34e3b39154dadd2dbbcd7477d39ededd3ed17093d6cc6ad68d9862922c5a9a5126ad99cd64d1d2a435abb268d24acbb411d394d1ddcb7477db2cdca435b39a05c35ef2a224a668a43469cd6c96c4148d26ad590dc35ef2a224a6492b4d9a747ad194ad5e8a1f630a097fabd45a8294c32f934989b91d5b4226b6644b0c87229490492d713bb6a4490c0732b1254631254b1f9e0d51eaf876034239c3a1fc0f6cd811945943f2ac71e394600c55951bbe1219c71d38b35c0eeeb35a1bf8c1e17e90a4818eee6de40eec5ac983cfdeef7b7aaf86c3effb6765daca1b883678a89470817992b620be8acbbd8959eef77ddf98d89536797ead9f3d50dff0ecf533d720fe9cfa86f70d0fb39734e68fb741106f9a4ebf3e77035a6f1523d2a868327d1e1ef6ebe33c5d7d0543fb61fd53f6f673dec8105ce4acabde06abb7e0fd18a8af2fed6b1fbd1eb407f71687435d8fe7e918caaa8fc17db53f41ef27c8b3fa9befbcfd4fc4f91c30ac2f7f037978708ff3dce3609ed5f3f0b879ef6fde7b2f8791ee0384f6e5a7740c6515b62e14fe13e8c21dae5ddf10e2997e67ade720de24352dfba09ab50c683d2c605fcb6c3639f8714f47fdf9f3e78c6e0bc253de0008252d09a83f7dbcc95ff8d36eb3fe09d469baa7efe609f5ed9d50f444e9897e5be0dfa9906e68c1de32b53d5956af609d529e5c56617f6a5c67b570cee99476d26c00e7d188d895fba8ccdba4941287994ed345bdf6d2db80f3ce43dd89c2419247a3da3a8d43289750586badb599fdcc5a0cf480dc6b9f815a4fce3ad3a8a669b5d68a6d90ce38b06ef3ed5310033dd995d59839bcdb72bb5c8f7c5f0dd67e3d3d4ae6ec9940a76eb395840c68c6c1c5ac7091b3dc312b59c4ac0c61a4632ce2ba67c6ac28d9a943cc4a92abb0dcf873ce568c5929ca1d1342494640ee58153699a33662b91d591e6633b2326c69b8f329b62a2b376c0f7cfc701c9ee9a3a0b83177ac0a539e1f252ac175ec8e1ee555c29ffbe19a0c8a45f6c70f0dbc31222bb26e3c70dbb69909fcf02312bc499226f8e10b1f927e48f343955c65290831997ef77069a49472e2569e3874ec99b7237bf9dd79ce3593c98210e040465b103db832dc0b588b66469ffeb0b5c422f34a36a63472c206901e0a85b74b29a5f418a350cdf059f9846a862019249f08a26ed43d13d7d33752dfff8341ee0c5e6ea70d8c1fff07cfce2739aed334ad035d5b5b4deb3a9d77cd6257677d931687314a504a29a587fdb5507e0864869438a375484852c7f38b1cd6075d392f4296602833fde801c9acd1a61fce3639ac41640fed6fb2af6150fca0283f27e730e5ea63966e1348f8f7960f5ad9431b9ebd67ee9ff39e246bfce56ccb1a9ec460a88335bcd928d2799e9def7b1838074ffa128740f4658f99c671c877ac4919ee7cfd7032e5cc253fe7515e8f2e539afd07f375300a7b18060eaffc7091fc76308afe49c3de7b4e2f7d0eeb602aff8381511e35ca5c47f3563b291f9452e6c899660795ff2371c0d4df80d90a3cbd83f582218ce945b3a76fd86c73106fcaa9b761a399421bde64aee9689187ad29b286b18b7ef7da8773ae711cf4267d5b3ee2ea386c6117fdecfdbb0e72e71fdacfbefe07de04c664ba776a5f81ccc8dd874066e4fba80f5b39eb3ef43e9c9fb7a37bd7c561a7d33efe33f4313e17c88cac3d0a87ad5ce71ac7d1e150089e6bea64ca5b86e71abfa0e2493f7f1dc4e42ed74f429281ca1499ca142a2850292273d99f0b5592cc9429a36529b60519d762050d0e2c24e102d3e4410b131226625b92e49a3bb64585314b2cd16a29b59c9a218a25652d772c96060b115fb22ca9c410b144e408234c30c20667f9cbd7dafb080a1df9d8342dbef62beca37b89859c8bf8de1d22f32d96cf7111c6e7e03c8cc779a1231f37ee3fdf87ff9cefbfc23ebe0f7b80858e7ce4bc63a196f4c93ee761e09cec1db7f4c169dd60db3d070a1df970fbdafbb0af61a1a3d50b6d6f7f857d78df61212f923ed97befef78c3421f489fece36b1a8e58c8355c14dfb150c44243848e7c6cef58c80242dce95149a716ea3b472fa59a29675e64858e7c687fb190e7d0de7b1418c216c2918f0dbb910c61fb9d211ed6b047913e3b44361c82d051043a07fdfa9dc3e6083d4adee27b11628a60ca2f01cf417378d236e43383a20aa30a93252987339605c9e68e658912cba23453e03a72283499f61788f1e7e9b94ebe7fdb6ac19b4a3510c8976bcc66ad7493f18be5de6a6fbffb3046fedc2de3bbdd6d4f13859252ca1398d5acd1ece97060fd9d4ce38262068a5ae4e14d4d4d4d313a5082df81317359d7811ec4bddd8d91a57c206ed8656935296316ab969c90c3614fe6be7ed9dacfb14fe9af70f899763f1aac5ef5ab70f5f46d743938b4da4d4e0e0ea21984a6a626a50ca495bbee069c7905769feafe825ff727b0b3a0ed2eee6417b7bd376fa7b2bd834a6296be87f3e65e6e1cde400cb472e841766defcade6e9bffad91625df0035546dc78a54ffcc8c5aeffb47d167ef9660e6f6e5b5e9c5038f9dc8e6ac9e540d6b832ab216bcace9b78cfa1be3f954aa552a97b6f77efbda9efdc5329f0f4a8d49fb8dbdd37f5273f9dbe53a7f7d4fbd30af67c0abc388c71f109d5f57738bcdfa5663823dfe762e781e190f7a9ee51ff13f38df984e71ace3f37125f35c4edc71c60c75b3eabbadc28147de247a2173e68d9c872db1624dde64ef8d145d97f544a2b9d5e3427753a6713d264cad44875e54e26a7af18105b62484f664ca69926c7b92696c52886a585c934992816a29cfdfcec2bd71cfce4c6426490ecb52015989b0716e8b01a7825efe4211a328d82fa0b19cab6a5a7c3df664f31f781f4618012bc1193b3e7e1213ffb9dcf36d0790af6e3b405af3dca26b5c9d9d3a42932f752e72598f3143c5599bd94f8d471de8eec6fde82379f025d5cc83dea55208fce7786f17d75fe933b3bcffd0ee6d1c13c3cbebffffdfd4bbffecadba17a18a0ea73c0d07bfb38a02bf59dddeb913dc521f75605f6802efb17a340edebc0ec2de609e24d9c2635a62cade64b59e220de245fb3f2014357ec675e07f3331df3b3976058b124c9fefddd3268386528c4a3a33fffc4d8cdea293f25372adccd4d18a432bada875dd676544cbac88048b9e85d87792410dffb08c4f7f0100786ae3dd5bec964596f22161ce7fdacb3d6ece6fb687d769c119c4134c7f719a401317ac7906594e2ffbcf6d4a281a538c3149c764a066c2f254737a9a2e2ae799c5a3655b11b44b3f69926c39fbefc6f81377e375cffae8f2d567de0760e45aa50f2441bdfc1e80bac09d659bc8078390f2d660b187c70218623d816580fce022a025e699a8061f01a418b2260ad170db07fa980c3eb0358c06a801901f35eab576ba9a0bb38033be173325c600d78b5f082a2c1b4790186044c0a58005e41c0dc03f5d54a2c0163c28a241805f7a58363e92d4ea44fe02c78970e810926d00a10040d599098c10a2052c8420929301896384111484dac9481ad81edc0b04105ec0212600778a981692f2925c051029813b021ba97cff09a8d2609987b51f4ea2e555e36446902760616451230a6540f309d97131815300164f06a2f8678b3214209356848a0a4e80c931ad86759966545322c7296c490d79cdff87fe830303530229883498225e009931bc694c0480a5dd67c4102031730196052c04eaf0294812941c3b918c0abd93c811d09f3056c890d6cc68b8ae7d04b5fc0fc0a7e351364605dc07a0b226028fbba0106be963408d4bc8ac8e0c551180196d6a29fe0e244a4d0567816aea5a3e82a5c8c1be9a65ee35e90c0fa882960ac570930ff01e668b2a11f9ab821071d40c084929a34598ec0629fc12245d1995811138eb82289a6a218b2c06ebc9c78f51550b852c7606370b8e0745955595561d226872d196dc68a8e3129caf1675891bb8a3f8b5ae1ca77f7f914a7d05cff785d521d6126aadb574382b82ee73711638c1d1d04dded0f4276d0da3c2b8d351823a5547e1febda6f65746954c311e0f6e40670bfe81eb100ae2b80ebb93debacab1a6e002e8500ee660371c12e381d9ebf82db9302007097e8c833e05050a49432066b8574bf18dfc3e2b926e07674624ca90dea4e9abd69c4897922ee4cb39b10698c1b59546e7873a5b456e969b8eea941d41103e9d269fd90524a57425c29a3ff4a882ba5940ea4cb5102f1f5c088b1bf2fc707877367e0dcb130557253c0750b11591d664af6bc8261f5c20ddf86cf2f79467614629491c60d6d9e33da4843e2589827b9f33c0d499f801359f6f487bebebb6719a59f45faf2ebd3768f79a87a8481d229e9b7a493cef8f2ad836df1cde5c9f0c7923e94decce8845b5da2a3491f731d1930515175a508ee0ee0acfd550d3775b3273aa2b77b7a228b7e8cc85a21ddf09b34e27b3b9801cf7332a9ff13a59c111549e074783ef11820774ca9a76636e68aadaae9b666d8c880a31533a1157b9727e28f257db25fd970ef4d27c51db88ebb3db7eed62ed111c5257c8e2f62207f82373fdc9845b66cd97ec114b9634a620c9077c42c23b2e4b3224bfe6a841bb26454ce2b183113af31252e72043ba6a424b74727b63736e17478ce6e679c0ecff54a9c1b534a923b7644923c23772ccc133908bdfdc3cd4b7424898e3c7e2c0c0a3928e6205916228393f1f677e5fc121dc52fe1731cc9ffb8be4447fd25fc6928c7a18c3d66c79347d43194e7cbf81e0f0a60907efcea6d705fa82b8122a531bab4a46c64753f572edcf82e4ee545771f604c0ccc171187fc459683a83017cc961c763982a192fd2f8e31ca190343260606cd778c014919253b8440071d56405a01f665842f6dbe1cd9c248962c88880163440e4854c01021d1e21341ae67dab06133c4c20c4aa8f0c408871c907c105304e5a50cca4be6925c08810f5f88c0982c71c414274e4eb246258b91942f5e8a723d82a58af602bba20612b82059a2a487335e46c8d245082e485421a5cb17234bb12e5974b9c2a76baaa8702f52cc240e7c63e1401451c4b834896da9a27a820b12112754b9635caee4993bc62592f7a8842dd765b5748a660400401000e314000018100c8784028140281cd05559f91400098594406a4498c923811c06410cc2300cc4300800200080000883000628a48cf71c212744258462107f880b3d2486901f88150b8f357765493dbfde86f151f1da094a12c3c3ec7cfab10dbe3a993b1a9e2bb4d91e1683f0435c865004f1839845888b054f7d75a5def0acb59907c41fdeadf9703a44615e139ac54b4fbefb5d0829e43c49d22c46781cae2284e7209285d6e35fcda2c9932aa7e76c4f9c9b4549cf97db0c410f813844f9202e163c6976c72af1d817d773d363eacd22eb49d316c589a7371bc6c3ee0f470421c51f4fb683fa70f5e1a04094b5eb8964b348ef1970afe363962c57411194879d13f1811fc42f215620f08497633cb3272ad77386e7a9c9f463815787268b8607d7dd85ace764a3290f2afa3dd96e4541fc7ce119e73820de02a22c22cfaf36cc0f16769e3347ca077f3e287b58cc07fe0f162db587971e4485e8404c7b28338c9a0761c26e18b28d5eae01711f4211c40fc405441687b8f0f3748b8322da736b453cf87f5adba42054b4f6846b1d88538650a1e8992fcd82e9b1aa2e4fac674f9b05898717c780a07bd0c28f14ede56290c1632be77396c7e4487bf89f524171926b8585b0605b5090c02bc1db8e4144dcf7696980b838dbe3a45584f0fcc72724f71f7c24cf278d2284e13f5244760aa888e8f170972108077151e3492f67d6664f95430c883c153dbd5cc3c3e9215428f6cc77b360f45895631ccbb36707c5694faf86e9a1741f8bcc4eed24521ede340608fa87c5bab93f54253de5c2d824b83c92db4db41779c286f8ed27ba03f8567715ba8e25107edcd83a1c2ca8963977e0bc40d6dd00091553956625db877ecc18843164819d51951c3e4fdd9eab562c1a8b746e613dcfdd24ca7ef84af4dea201c2e8ce6367f7164893a4ddc135dfd4e6b609af5bb1e1d915c778ac07cc5dcf538fbdb6141b9e6b4db2106521f678394d0f753e48b107157f8f769ba621ce6af580ef38105411424f82e737370c089ff73d666e16939e5e6ef30f3b1fa638c4c5bf279b2d520f2aae3de268da01b1e2d26366575629cf77ad9820f0bcf3346b28f560f1df036c4768544fd89ac5b827a8dbfcc3ee3eb1a629821c2e69aa7e962ab999cf2070d6d46d40060f7f0e94f9b0fa7753d845f8f015c21ea2280fff3d548220fee12f04650f88fef0efe1720f8a7bf8efe1b287c47bf0f770b907288658f1d7d3b2510a84cf164fc26f163b1e16572875c15208d618a18eea90c836988762c3bc75b0367b6846b54f5179e8ee68219fada7f9c57bb60f66e29b8a6769182fd435b5720bd2319f81117f7651ecf244ab5944f7dcdc1b7fcc12b4e3269be9b156c34020ee837f0fb2f017c6657c576356132f51b084b4ff95185f11c86f053d4c0d85adc42a0ae75f4ebaa1e2ee79de977a5703dcf070103f8a4124fb2efd3f5dddfedf4eda61d18ad7c6865ae005eb55b0636ea42be568a0bd793972044c6a42a050fec6214e238f20f8bf61601b17368807295f7311e1eae2ae67a354ba87b4436c9651d59b7a53dbdaafea74fd4eea1d2e69b5f06a65496280060589538e988d46a1b44887d44c6884515c32f48e2c6839796f08404b3a1aeaf5d951bf80eaa0e63b0ffb7e1f2442f81d5890024004faab2da27a31667aadee075354c938f2ab7a13d58e2c4ecee9542cf12444eb74d9c58ee4f72994d8c74979ad2dd74c310d176eba92d81164dd840819bc654f6fae47b82de618b86470165c2f08cbc066d199bb668f552d1d1f677c01b2be74fb2351a8b771a59d1c2f5d8434d30be140f39c8bbe74175d7e655ec0d40555a7e729dcf830612c4e7c6c0a93ce20d84fb187f5e5bceb871613b9882afd784cf819b84fa5134e6f53a44d1d437ce7c0238e6650adedb005a78fae806d490f5f2ebbb09263972c268351b15a0ca8134d13cedc938041d9320c488bf86955121b8f94efa6a9fce5ceb6dba5d082421a60a9f14ff668d0203ee3102f899a04a833f63b90d70e7a19b8076c3709bc576eebe5328906602b8494fb1c85f32aeba24b82a1ef1b6d4b19040b0e9b9042d1fa4499cd71041d5db91e31714d9864f696ed8276aa6c2a3a21ee8f46c50e08932ce156728a569c7a513df37e18beb26024e33f26e2681f78b0f2a740759ccf3d1c49151ae1857f306b3065ad0be7084c32efb9d05c380616b5b283855d84301a6b2849801340eccb71d66a53b7da0fc449d7bec2682cbd9e3d0db4a8b4b8b9de1ada57558c98af6a0acd2b839d6b339d9d572608477b12f642b8e4408fe972a83da9db1dbfd0c74b7fdcdae52db62735d80a392a21bd8231342f59f48dbd603e02f0876a3c218f23f9f20a20d886f82d1bd8c898b05145d1f289ce78568af2cd5e6b98a0144b4cb32a21fd499a8446259dd3c59bea94501b699fb97530c5c7f01921c473c69f4d8cb66768ac3824c3fcf6de699346864535996366c0a70258976272e81c2e8726db75b75f1126c34ec42c6c07b91cbbb8884c5de65517bc0f0d7122f273a410a9102bb0474080671ec3936260c3c800d9edd1c5f97c0a45e1249afc0a744a340125f1755129dad5dfcbbcfaf6d40b64406b9d4cf17a037b0cbf3c638b53345a2a0f68e256e050229e0247b1722813cfdc4cbd24cfa4804e367ee812ff2f297c0d4f71925bbd29834c5b862fd30d9f66cc73bb55bff099eec26107d6e538f9502aa3abecb5fb09b2b627068f8a366f65576434087fb209805f1dea862704edc7658a102d233555b747531249bf3f9bd4b80761a183fc217f5088712bddbd4f3136693900d0413edf98d628883161781c6e4f7fe7dfdc726888548d8a140eddce8004551e0688da28caf14ea9ffbf11efa3d0b29f05d9f95b14dfe23bb82d50a8932789ff359a8814b140276e5fd51240e87045f21912cca4dff67c55cfaa40b36b4ab1c88fa03008c39f06cc4cc83253ee14d4533b12e124876c736294ea57aaff4a782ea1cec160d682791fd4d97acf72b38ffd01a98140c1f925d3b87d20059815fdedb86a0a8d450ba15b0510f4a2d38fe814e010711c4082f7573a8b9c0493566303ff1cd8cd477a0cfa4610e2dcdbb419256fb1d5fefbdced9df5243037f72aba9d8a6270b00ac280e503f6f1c71074c62c6363fb61b423b2a97ffbf39c72df2ae9d4229ca3707c8d4c57509314fa050c9805a6a4365d51aac09d15f7944f5083bf955005b20790731ec7f8cd1d0331760afd757b1860411d1f4da115e36be6f91bce11737ca28680afa0f3cb9e14538883557019ed862d41577cf2769411c0e8c692c8aadde3bcbf72d2160f909c46ae0cb1c1b78cc9a1630fd88c3cd0191400cb62c0806b2fffca459dccedc109a44e47c9700b3706b0f1e24e1d05307a5677ccff93fe31dbfb91cd92f9648b75dd1395877422f19709cb7323a73e50e0aecec906837ed2522bf8161d7f3949fbfe1f9cd797255eabc885b8b4e5b79bc3b77bc5538831efc4e46dde615db53da515a7bd138fc684c7d11f4b80d101a5c883b639d7dd7fc95f0e37c9a618727648b5c999fe5dd3d7f3d29aa016ca3178a7bbc0816668b4d53c722f5d0517b442f981bea8a8550c97e2af464d297f0611247455d8549035e9ca5e143e3ec9e02bebb0a8d53490f08f92f2d5242cd6b3a930a85266b7e6e32a57fe9b58aab7ad082b831b74b4800ecb491bb9516cbb1c31beeb79eb32cf82730bc425be29af72aa5ddf8350ff53eae88bba283e5571ea23d297a46cf66b9ea65c05d4934d5337ede8e2b7c14f1525fb13fe388fff291a518274a3f4d38a02a126a9337fe12e7a60ae086344b943b2aed4f863a5f9414a35a13f710381c9edbb03f4ad4bc2607f512e45bb8161ef9e7037a2bee030684ef2091d28efb656abbfce618b755c254cc4431cc65d9c8b1d2bf9ff926e98800939ced13cae43e6c8e67ee5a3394fb5001678c3968c3c4bf202c76c283a1a8bb802fd883fa7b49a08c438f10de1c1a6f1e3fe944a742eaaced14241df45b2ba47f9981c1448c0fa3b53f6e4ed6afe5f090bc395063f4809d662a6bb22ec932cb6bde04cd57634fe3eb36b88fd4e74498d2683a2d2e051fdfa0b26929c62d570722ec70fec07ddc0539ef2aaae03b9100f5865da8c8856e7d6e975cc20280f394f8f9165bed4009f99d32398a34d888b18f5b3582a0a4b2f3e0b84ab43143a0a4d122a2dc8e5ccca6874e397a393d6356f144a9c837b3c361da9901e10a7863788e750ac1e86817432babe3f415024ff58c8c7eea60f8eae358cb42f1f68e7fe36d017e3cf4fa063a2e0bb9d54b2ef6b0b4b871202c85ca7484cb65d60856228656a2542f7e233e17c403aec6f68b00946dff33b3c979002114a8f9c8fecc88d5df232d766c335a8242b8c60c6fd7570a52d3021b8f1042d838239ee8a89e10eeaf88669b096a985b830ece88c5fec795c8a08dc4ffd7d7ab72feb68c8193e3e45a376c8e966ce9902c507cb19d80054ef99cc177fbf8f358a42d13f46028b9169b24f2934d1c1a82fa705513a3141e0b1a3bec26f2b8b9fdd1169c1adb1cf4f4f348dab94b4911c517a05eee64505e1a84c290b9a2ee03f48a9f50f94223c33cb18d7fa49642e6e09a764231a6678393bf27279cab9ae9d407766570b30466f80be8a26e8d3445dc6fac0c269e6ac056489dc53afdc74350217089564cb7560d1734554759f684296e1a96f53097762d7072a16f006ce6a663e15ddd3031752beccdd229a135992ce4d8feaf7c200e8fa45e21c6e8790a7c22a5374d465561ed53dd17454d3a836ce036e147ec676c011a1fb6d8edfa4e7e898e72a7d65d33bb8e66c455505a88106c61ef57a3f5b066141741a31ce1e9eacb81d364a159790f70d2b5663a6595519955e00c6048320c7cc3ad054b6c70b2c67eb7d42367694e06b7fc86cdad8db829f08e7c45a5d5269b220cab1cb379f44339c59ccad961a61d08c9036910b3afe34b5154e3affa6ae2084a08a7633479a929501f8278f70c19fe214bc0195798d2b985c73d0d8a018416bdc39f6e6d4fab45787f29c0015a619584c95c62fc2980a9c72382c6b0144081e9e6006c2edeeb16c45e7a4fc3fa191a0035171fafd2f493cc552b8d38a4d62e28f211ed2e941f5a13c83d0d73f6169245aa6d2c07b26ec2a54df07d17d0f644500042a808d1f92b6c6de21f6c7096f89a775f518127409e36b2b46bfa9dd1215417b6b65d4185a357037871d7a6645bf3e22507888c606325c04ad19fa21edfd24d6e5b01e2c4106bcdf9602e21aad27c8c91b225baa04772e24542594d14071c4226682917363c69817f861bc5fb4a0d41c3aef1acb5fd2d75c28405a72f2251654169ae9fd61a90cd989eaec6cfbd06af5ee3d2cee6d952b66c10c644b251bd8ea46bb596d8139d21cf2235ed7c0c09b543b21fa7743463e40bf0ed0c65bf10a66f725741dcc8cdd10492f6fbb958fc643825367c01538314199c1b88cd8b98a2adedd70990023800925a010dc59396582e877e85917898f454d344457b0eec548be6bfcd04820d070e5cc056498b30537553d9719a0a238615cac01bdc18f11959e33c806472670a8a8fb14bee2f0f3d65b78d63096555889feb9b9ab252db05249fc4147642b1e3ed896156cb218142a4c927c4b38a54f652f406db3426b76350ddc7a9bccd1f01abf5a67e91c3caddacc07d621c05a01839396beb951eee6f6a048342bc7f2db40535dcb1ccda87a87fabbe0c14ca238e85aa0b3425fd5bc9e915367167c858e4a4bda3dc83440e42f6307a5af776a0c6aed27db4401657ac27b4cb49355438474f0435e10dfac936c57c536bf4524d3f8e22e84c9883b33081c21a7e06b818db0214c26e69ff41b7ac58cd69de82f965fd391acfe1ab1b9fae741246ad9fc43576463f98b2846c50dc5059515e6494148a0299b4db34a47da0588e5a23036efb6c4d88616d8ee82451a0478d5e6b3e82a48743094271605bfeea0b6a1cd30b5b40f833680365f8c0cb125f34160285dfe042d8463ba92cf248add1c86203bf1556c45c9db5600a015dd605b48b76a532aa618a0acb0dfd8b25bc675f22fc592bf0683fce891765b9225cb148e5fbcd7b2f19750a4fc2f88b8d708c211559f205ddec161b8f8365c43616d1c5f1b79dd7cda873e5e0d4e214b7b6f72235ef93dda3318827dda633b7b4f47a2ab9985a1168cea7c608c9039d2236e01ffba221b784c4697291c4646ce7701c4e827b7e35fdc234f4d101d43dfa7bf54ce5d9db496d3db8815cfeee254bca13e2bb26f6d811fe062f05dafedd702a85d4dc194a22125a20996a7906ed7097c214671a513e6d88a258f0fadf4a6698399ec1898d4c20466eb3288675d36851e59bda2690dead20baa61bb74b15a0491fac669009b2e089e81a2da8469f4096cf698c1a397a8439b6bd5d0947fc4f5cc81630a51191a2f3877535f56494cfb6f0ebe24921f57a4f2c4a459f76a810b5b4ca5aef20c69714ab39e1d0d4443b217d5a701c117c75ce1ff07559a23ee7765534c84c2cd6992d28b04502fab15b00e354200369fd0af0f7c88c53c972d17349d9bff4c2bb975194d11ee107f58a968d7aa5eddce416d238f35b9b338a12334109941200ac8388b4a0c07d8b8de91ba9498b4bf0b9af5c754eb45b675df116ff98ca6d911a127c1478618cf9361395f8532d77d4f0b83b3f101a17aaa241c31941fdfcaf070ca57805901bf2cdecc970598d724f955fc4d062a5c0f4e0f680603acf22cbdd52af4894a2fb62df00b62931475fc2511c36bcc3a1db203a407420310c7960a201b6009a2f1a18a940d3321e862aded8f23ecff0452df00f6d4d66366696882fb354baef7da03aa2b3c579a98700adb66925792f16e6eb8656c18d220f2682b3da1c6dfeee0932137cdff9300cd03300b229994777361542c24dac5ab90c8def7de51e13336832468ac5df848a37f616050db561622a8e4c4cc1a2eab47a5a42d997656149c87eea587b540e79276844a8cd80d2c8386c5c8ef6214f5d46c49293e7b744f74f4a76aa562e35289604518214a219f353176ef2bb190709fb4a7900cab9a9ff55e6c2bc3eb40e5a98dc5c8393084a8ac01f1be9422c2fd24f6d02f144aad219d390f9a8913335d671f361e6de264fb30833b3f6b743f4d5c79a42cca13cd6712f3f03c5c47cae9def5c1989e298cd8d703b8ccaac03fa5251ae8edaf3dde847327de5d2a86e5bbc1976b8bcf949ce3fe25001cb15fd0591dbfc01af6e69bb1950d55331edb3da851d1115dc11a06eb8b6d388164f878cd2e194584137179a8620c8a1989a07d8faaee65fce999bc662c05615d44a14b20d37f9d09e098b5609457f24cfe0bf91c19a25d37564a9b5e2fa668eb388c1a35472106a5a235a6d0c1962cdaec041d34a5001b0586d4e2021c546cc7b199d18225f8d810d4a75db55259b9832db1abffbd8dcd17a656f2a7d402250f47b2eac647fcd3d4599c69d3c27324b28e690cc6239b3fe4aa051b08979c8d566c2107b5aff9a65239ccf9a49cd2d1f97560e38244054f8291a9593df875a7b218e51576ec5df2791c08ea06410cf5e882c6dc739d8d8d7b7442ca417452d12e8e0fa74a738855cc8c0be528bb95dc3a30641ac02754808d0148d5c3bf7abada96c4292cd24b41b9ab4c3383d2445628808b37b0a8bf1a99840233a733138d93d2a15d34e838853c1fe863b20c60eed89ded1f4d2c73eff8e2889ba705b9302ce21418ad0a981f52174e92a4dc2e621bbc6909649e2633729d83a02732bf73ca7021d458f877317189aaee95b40075df9cd6d155b495d2d5b1483fabccb82433c342fe745638afe71b890d36475a1111a29a80821f9032e3a42a2011a06801b9714452165f2413798962154f63c57fd811c6ffc7f23114561029972e0fb123a23bb5ca5a5a971b94c738379f52c831a30dc7c55502c01fc3bb75b1e99aadcaec7d46dd3ae28c684d00336599e9e999405202071377dc7acfedc41d52a940e8932761827cc47c2657448c1d36680e4c09fce546b89d33c3acdf68fbf14f4f4167e90a85dd79be6bc0f467217f04844093847012b3fb5639c031570f8a5d6904e0c9ca6a6d5a478032655e7996b34459a013b0bb0a153f8e84eb158d4c823b6cc686597f8c02db635ab5c34d09fddb6ce289054944f4d877c1f111f005752f448e575a00396d012ae908321dc75bb8b64770a71b5ef9da5334d44559315eb976287afeb8590bd6e755fcfa9db24562ec23a99e45a305bd0c34d102ea836d580c8a5b916dacf3d887a212375a8221a57e2922c96be982be3cd0af2495e0de0b7b1f2d5c81c1e96528cd1254902915b2185abc2d61e1c5e5047a93ba39f8975a31170f11ad4cadcd0c4643c5cc67cf75aaf6295fb344a12de4f2ee32c225242b70cdb75fffbe339ffe7b8a189b57edd2478cc8b1eb46a7b6555a72dabbf2d3feec19f08395e49e95aa8282dd38b7fbf097edadce1aabe371e2a054918831c5bc10ec2ed0e3588328e1924d8ff1480fef369567a52c11a7d02acfc19d2adfac3af39e07d517b04e5090fdcf0ce1a2c73a5d3c012ac6e02b8602b162c23eb4459580d9aa7574a9aed4157df359911c2918df430988e042ce86bf9476cfe98d193f971264a580531a1c21ce3f4c276dc02fe0750a669c67ce09e9882cf0814bca45834ead02d7df627fbbc02d0d56f55b80869cdd3202449ec93af0e27ea50f7e3469f0253b4b0c2c4126156b22af84fdf527462eacae850eb1d1adbd0ab61bb8e348c991ebf1797d566440578d0ba36c5da86a6ccef7d4e1e57ef2b09bdbe4d53b475e5c224d00df9dd99381e168a266eba28edb45b8824353010c845f8e370618c8b22027072c7e7f2fb0292163b2f1a814751d947cec9954465214564747c68e8af4cf290343ab814186722eedf9897b360de5cb70b675982be4b8fcd6d83cae5994f34f82857c843da381fb6793b9f80dc2b4077b29d8e4d4b98bbae98a504d85c1c365033b4e4ac97492788f7f2667fbe2a5b8bed2c5ac7d8019460c9f49f345d8a77a04fb7f8cdc2eb3b684ce800a7571bb1fc17d42571447f488ebfc63ad29112c86290b9f0372883ffed61078286d17719f7c7fb8f728299fff3b8ba3b63ad33f14f9478b2c38c18781bec62fb2218d589b1022ed69d70a183560ecc1e85a5e9ad38c82e58b49af1feb01e1bcc9d828af7402d3f88e7e213aded919c9a56618a226546556eb72e2bf5b01369192ec428a1ace4cd814a0d7ae2bd790ea831b5143f1909249124f72129e86a65e1229bdc211f5208e28debdce2a63c6c572bfdd2d717649e4ef574d30b0cd326df3d03502cbfe7f873384b1c70a0ef847582c257c0eec063383540be75b56de3af333e6c95ab576221209a2e8e2462f1766f86677474409be604a4121b8e749f5e8b9b91094727230d87b01ebecc5be86623399c11c3dd79fee4f52ede77911e41c19bac5ea75d8302d373450e1810ff752f97ea5d8497eb1fd24bf0b6e4980d60f41adb385b463894efcab6e3574d1a851f05d61f75c55add0e797fbae56f8c91b96ee9792925db623cd6afc30f6b0c27676019f3a19a4afbaa673e040f85f06df321b309f377c0b12cd12dc466002a836eaec499037be957e051259db2670888fde752920f3ea3c69d43bbe890e9f1f82f1238c677925a09edaadeabd60ac7c3d87a9e748b8176284eff7e5d270ffe421dba3dc6102bb989701497eb412e45830ebac40b7f5f16d5d55d8ec0be8b170343b215389fd80416966a4ad48f370cb024519b9eedc0874ee264960b77bc0d317d488cef517e46dcc6d87e43eaec57195c772fc4b282145a00240fe0e1cca127e43069eb15e4fd96d524c50af83cda354a3751b899d4f05809aa875608135401b4cf9927617ce9e1c21d2cb69a7c1751008dc307d1b2828842ceb53093b86029801c8dd4343d33612cc2483ff72f633f6576b58e36f1824448af342a37363929ef464eed6da5aa9e1e085ba0cd1042353b4ad558e328b54750a918b1398aacffcb45ef9435c63551218e155b1d6c5362bd87b79ef3b45a883133a4c8f592f71e91d25683850bf1f96f1d1dceab1b21b96c71e37f88fc43194b54e4721d6f18d80a26394cc038ddf6547a92511288eddb7629ce98fe4948e472c4f9a190c914a084289ab6c07aef43c43ae1c64b721b9677408bdb7f765ff6c3448be8c8ecedc7bd9b62d13fb1af9d5182d6c14ad72528b70b25b1240a8fedbec0d9b58a36d6f9f9ce552b1ddeb60bb41399dcdd2747a5a994d271c7b1ff923feec9a64a23a9dc4fd04b046873a86266a07cacd85b89485e9962570066e3ba5c6ca0191f52f38c07fb9c7fe79fe0b18ab95eeda403f0c0bc5d27d271396c29d409d66192e454e4239348b23bcd2e80868ad8c3989f3b79278edc93595b8fa22a1d9b49443f00b23e0f6e1751160072eac8b2f1052f68a4d0fd2eed9f938a085e49b225b98bc73685ca142b5e266b84ebaa9334e05a1a35943c00aa8210e5cd1e7c0ac53bc833f8c520f809e5cbc35c83321233b3cc540205cef01ca0726cd2015ba64a16858050944bf80420716d2a2bf182d1b07fd06fd40c346358ae3bfeec024a9db556f3e9c153d9e0ac7854e6dfb9ec96b067a305291c4765a8f7901e1046283870b3803cbd6b94f8c3eb4fbd869a56e8e8d1448ac1968aef2919c6e41f11c24cc4215c25584ee5b94d28662c4213e62837544cdb05bf50bdb1ad8e206a8fe712dc457df2769906650bcda251cb6f7b99a9b2a383e674b614aa2f3c12ccaaea1569a24132d9a8688ab3a7e271a6306fb5c1e48c5df372300d903919e22e2d8fbcb102b7d34dd79e25ac949cf8636e05af9a4702df0bb59aca53016e1602060e5a8aad22ecf9aac0abcba019b62ef154908bc38d2415f5cf12c1dddecac758e4a475738c700d0a2d89ddc078ecd2a6a9c7258da2d6e3899329b2e9611232472247ffe9d44b8cf1e0bc252ff495654181a02dfdb3bf2a38d669d3a30807bbd44d0d2062475f5a6353d7e8aa6db076324c7f0e1f1f64e289b431cbdb2e962d1881da9a3f60fbf82f051fb7def6a97c1e2d647bd4e68f8331990d40760845a09cc5256c5b767969059365248190ec80ecd33f384b19a54e456772c28c1e5173165e2e0f8c1c8ce695d7e8f554ee9f160b8fcba510113e945c834d1a5b35f9af27084130e59621fd75796c96266da1ee8630091f786547f4b397ccf3a4048686765a72d6aea5a54845b6daefb2f34494141bf12d304557dbbbdf9e41931739b961adf48a798a737b15d9f7bbae9ba9289586ad4b286cf9e51a995d7c6114eb8ef049eb8023102cb79a737db1568b105d0eb567d1df95f4e7e19991060a0f338296c7c327db872a531e2b129e3c6cdd31569fce299c1878a4bdb630c071e6f9c16937a9afb276cdb3a9767e01d3d14618afa6d2015736152101951c6b683e552b8cd5ad60e78b38dbf546971921640b41866fb4edb39348ef146805774db92dd5e89fe66d85fd34b312d3de9761875edce8354ffb9bf8be9135fd1f9da84502ef79cadf8150fde25837bdbb91d484018dae660a4f692a16a27ab48eb43f2a98ad9b58e034e1abf8cdda543567b70e438a8bb04bc2152379fe347349fc9b6989cc48c678d2be603782b8fd910b04ffe4472fd554fc4d326cc9a8c81fd7efe6b2d263aede53b9e4a141997e8567e763960e988edd83ec83beacf0a6f0abc94d213bc960575233420b8e74fa13dc8c3aa6fc62f197d689337b86289250a3efda944ae2c149607334517f7be599e7c83f956be75923a03b33d0de493b1580889d143474ef1d49b213e25fc63ee228a15ae26a8f894182d0536b47c1203fe5a33a6360c7accbbd141dcded70daae5d04c86af4d51307bdeca18c85b0189a21e793cd45e6016a0efd5a1b5320bb3dde4746a4bfae063b719605ce85fe408ddf67d51840044a6f719ee4ddc37a3810a8f40d53659ab911a500112139cc097ab18ec66d98964a9e016d41e149d486f2fc8496496d8d9cc33d8b85648c9a14960799378be7c9170b7b26389a5cb986bcad1be453ef889ddee0d6b22e21c54c4bad48a84ae20a38a9e5f38c25052964bed50464c9ecd30a45021677ab4014b90904227fecd9e745a928d328d6b5c7e8555f6e71bae86939fb79b64d7be161a26e7eb1355bb8d37cc593f51ee18ba70012a153804a548604ec406a8f827bb12cfbdb6aa65e9a76634c6763902d6be41a425626c2ea800a0382dd777dd3014c29402d56123b43071ca4560b76818bd2d934d5eddb4b5309489e9553b2c0fcf276137694f0b26343fb6d872005b4fd9d23438c4833892165219d40ba66c84bb354db6f419fb4995693fbdaab6bad0a1650e9f0fc57da41784a9b829c2f5635c5c8cef33a0bb40de35a2ba260f9c2f56760b4803283bb206ed235ef21f20d44b0befb2a9463741ada74214b2c363aed9ebd09bfc22fa38615c2f70423c17b9c08f2d70b0660a19ae5a2ae907706b9cc8fc03733876998b3a07510552e19d8c28aca7ce653d7077684f243491136f4327a089332b9eed888a19a7ed41c9282e7f9e37bdfa132325a467f9b221b88e1cbc2d1a55dc5d03bf53518c90eb98c7dc8a40189dd336cc1b6c475e9f82944e186c6b5666430f4a89c382991d28cfa03af2b4f51102e9898ce9ace1da25d907bca253c0ab9a0cb6f7464f78bb6b44bc51173a11311b296773d7b58120c04641cc24ef681c6de7e91c1c56d23d5bd0205c604dba1cb657b184aabfa252d038af82302894b4645bb1073fdb3ae10a37b42bf16c008dbcb5fc5d8ad39487e8b2d3ca50b435726d7a051201277e7b6eae3f35f131536f8e020db4444530ec7a5b3c0dd8759146f580dd18fb834fb72e28d90848b6181b3683ebf6ddcd7f0323262179eaa22a48c4b0a21209f49ea955c91b36b798b499069effa4eb3c9262c086108e01b4bd2348401aaf2bc9a7114ce6630702955a65e37267e7ad7c9476e2391afdb5ea633c78f6062274fb66bafd021f04f8015279d3da6e9fceab0cca078d60c53bc1da333e1952b62a54073075336952dfb9d717bc50255cd9af6557987dc760de0d86cd0b52cb916a9e4c5aa55c0c9f2288d7c6a1c440b6bfc70117634569ceea24334134ced79d4e4142b93de74260ea5d0fbd01e1df3dbd5e9d3e77c20bf08dc7171dcb39400a4ce53f7d10cc41299dbb7dc16c229f0475147b8481cb7e6c43e5de8a3ff9c63fd32b5e30b9114074dec13201fb5aa717106b5a7a7ac9b3451d2e52316a604aad9ab30cc69b21d878b6e6ddffe3371f7d481277bac9db899fe7dd629f298b727fe9e6d4f42884a167e92b0e870521e83d8032cd9d045f21b1882e362bee7a3df202826215861a712754cdf74841f282a0b5619600d64268a469dd84d3428ff118b94ab2976d625f9753df3e7c244c96e728ba2785545c863c5f3104837e9eaca8874cca13c3d9831a299b85eae4d851c4799228ce06077624ead3ecc625f0ba2c98078650903d2f88ee8984528577071a94c6dc0df24e4607326e8d7cba6e4103e6591b2777d04d234992d8a8de6ee143b29fa887f9afe3910e5acb85a6810c9d3c4d5e7ea7a02353c521888b18b8db54a3aa277df887208b327c08145263e15b8b2c142826960c2e33503232d703d2546ccd4d50647bc57d1f5cba014db5ff8bbeb6c591b0dff569362d8a2fa3acc29b4c8976f27fa0e215cb5b403a020a626f213eedd7df447e1ef78cf8449deddd1f11462a66025f6ad44bf449f8f7cc8f93840724420022e37cd44d83d017c96935f48896ca3ef0a75f84fc5ca86b2abb6180f56a22922eaeabf0df57c8ce53c237d46fec3c2591619724091331d99b9a095d4fce5b6181f31d3bc81bd6d35f25c99ec686adf9c83f9519b2a6bbd6395bf5d51bd04caf87cf3130cca099d29efbf45370eabb369ec826a2edea1660759a4ce2499fe05beaaff2f85c6a20a5dfabaff646415fe4695ae414f90ee4a3936b92c9979e31ae39b4c1cf050bdbf756132bb1a6d92bb27435d27475a950626f45962fbb86369c863c8da77d8a68cf788b1b00a8e557494f7c10002d0b529ebbcd80e7aa730242fd5d3cc590dffc9cfb8f81d22144e0c21557ea5be9c166062443072613e0da35b28fb04aa9f9c613f4e5694e5e94d1215c5b2b0bb8dd0be3c1f580afedba3ac065cbd06698879e0c82474fab5448862259fabd3fdb63ccda0c37c2bc5375cc1407e345b2becac34ef8c4affefa5f91da398e519d8184d069dbd119acb5b19b13f2d5251ed3da9a2e84a42c7b89310038c4617c05560ec8740148442fdf6c254020b9ecc03a305177694484b6feac01c3e7ebade4ec7500b0762c4828f3c205193d99d78ffded336eb69f7a8f60b859c18b2600e7879735b8b8bbfb36cd5eb0663e4a1100d47f741949da3451307841caab0bc6f09eec392b8e1107930ce4d5635bff25a697a2b8188b5ac7686c4eee89123b427d4a914bc1d0e297d168354cfc880f142122ee3e91597661ae1b2bfc903f085f8ae3e94dd61a896e3e3dae17acb7317cf1e2ea203b48ec3c2986100261eefbe792d2b959e087332115e449e55736cccd006b67dac9de3bee6914f2f9a99dba14609c66505e3e9e6214c19acf8ec65924f8ca523325efa26fd0af85a0cd79dc0861ea186d902978060a7bf14995c1d08e0d0d714277df565bf6640c12626197603b94b19e53e1bf5cf15f55fc5b6f78ef4a64d485a10b5badedb1da081035349fae41ec66f4e23a59d356276ae4f948b9348ff300616d314eb7c04f633a827e93fc22d1e90e1bf65765c505dd15c2cf4c275b20ecb9c0f59be5848b4b7d4602b4161c7a7398d958e2031ab4a2131a21514c96882177ae7642a79e9bae3a979324004898c48345f0b0c21f086f0ab42301384eb9467c0c2706b4bd1e32360f4d8819e3d9ddd68c8bc134c2497f189a00e85a8356946590b47c9c8130bd609b291b0d6c347061b55c276555e37130f1d808148ce08869e586ff6fdd02c35341833db6a044db551c9e2e0540133341c3e7d6e1305035c214f6402a645b570fc2d415123c90f6399a4fdb68fd5ab6e54871441828a22c8613735b8c4478d6e82a65916dd9cd536694374a95ba4ea6ac8c6bcbd9bd866cabd9756146fae6c79000a3d726098fd73454846e4d32090721db0a25a9933719161a6787018f0316b5b26c9dd64a81926af32b3c7f2e5bc12eb3bc5327cbdcca32059b8c2c789f7010b76255de17b4dc83f2070bd663e7ca3d17870ca7bcacbb6a02a86935a828b8091ae95cddc070206c386abeb60a3c53430e4de1d540da4e65ce14655c8c5bbce7fcdcb4a7cb6d53142aa96c874f379607b5d5268a7afeba277399508cb3e37a89ed5c07e109519822988d97f1bb7d7cd1186c3a6c298a42b431b0c6d89aa4b9f4a0f142e4fd7ad293147931ea24fad05a24fd01eafe2a9733024bc4ecd2b257db356c7549b6ff31551bbe06f7839a4c0a0aece989ad60aac5929ae98a93931272c274b3cdb0a1fda4e6b35c6f445e4fe81215baf946437ed1fad178deb928b50afd256c0d5711c8c853813c05025bac675cff9e214092df4f815cebd5206743f80e613b37b61357cd23b093bb3f10cecaeac2ded11c6d56acfa83949bbf1a48c97dc6b8768ba0d153d38dc9440255ff468fd97e09b9f4efe36f4506ab4b5340dd446feff25aca0fb4cc8a24b07714747f3ebc0afddde29eec9f83a60beaf4109b8598c5936dda641361a62ffb094fd75633509a731e0d296df5cafa99122bf10b2ccd505af8f2114560317e4aa28e1e772cda6992ebc11784ee1c2a0747b6dee3cc61bb46a19b070c32c8ab30d4a3ba22cf3975ff9b6faad8be261dad44574b9a29660a3d900fd88b783398e229ed50e98eb422dca7bc779b0af3075ef29fa83767a12f760245a71f598a342dc137e530270ba32d8faead789eb09736e452c702c6ed08bf1f2a59e8f7baca3cd90c8e8879254cb6096375b62bf797f642b7217221247e337543656b56b2ff26d759823b4f73d800cefc3d0551830f0393bb9e25856674af99f40f68e043f4af5b3fd623f28cd0ea8dfee6b33427732fdd7202ffda6b833d9e2bd608d05f46223e7a0648aa98e41ae408528cfa0f46858344bf79f54972e216a53f445d66a55263046b6f33d45da6c0300af12ed9377788aa1b1742f2b060511cf2228a7514cb0038ab8055dadca5b44677b7ebc7b93a5e0a8d7c71cd82f0896e0a30aa812284ec868ff52863d9c977c9651147a1a12a1219112d5345a99e8082b70a0a863866c8b74b626999a0c146c281c86c7ac40ee48c94ea9970ddf1cc83fd06de9a33f2d826cc0f30dc85c8bdfcbd12ace32e1d37983a21cba0e5d73fcc9fd61133b098d0309b112e4f26133694e9ce4623bd47f46a85f87ba0a762a68a661de0e2bb311f69718d48e84b9749eed899edb2fd21d2c806e92ef3b841808966f632d23308760b452e9f5addd40f5aa80bc7289566a86b2f4d54f0107127b6a4564d98bb8275c14e659b923d1337be47849046b59aceac372d74c81112a2af71e68a42e92bcc68515908b668f7c8e85dc7beb66edf88aed5df8fe63efabee3c812edddf3ac612159110b09293f9e2577a99239231dd84e2c4415d7267385fe0175182a3c9c03dc7b6fe5d469652ba23379f6f5f9c6c623fb6523ec5ff3da375729500a1d342ab6841c289b6fdfe8ae244f45228eb5c2b250446c3ef29d4870010bff16717e41266de1fb8055b454343e4266e9fc6dfdfb331930a9bcc8cdc8915adcf90597a1131ed310ad2a8492d5fd95f50ce01e0e7fac7ac6e340d252ad1f27a320c29d8389e71ec0e52e497df9d47a9e706f08a4c470f7a130b33fffbce0f5aecc8d33cdcd6c429c33a80b1b7a6ab2e669fb9da1ed910def009685e8b8581e25dbb4c134cde1a22f07a891ab792684a10bc3b211e0465dde6b8c9a3c36f98125f12169082d7272765e289964676a4edd1404e2907d12c780b8bdf3f5891f2b1db061afc4a9f37b6a9f1991f549008946b8d208484c87eff70536bd8bcae9e9f9a9b41cc45c3db57e98ff44e37e8f56d9d76d5c6f303f954649dddb98c635e9392371f746863bd0c94f65180b42de48699ebbb77a6cfc54b4aafe55d2878388f3c85782e68e0ed867f8a96e455c4a9a9b5ce5d7351fe74968de983d3bbfee7f25f6a66e02211babe3455d758425df9c0376bf025b1d64871bbc3c8b0c68e1b9627fd73f89a4bbe94e1568cfd6cddac5558d52db37943bad41725edfbb2cac90608a8accda402ec7e36ffa155ac65ba18c8be797ff666e94367037e7366dd70d651e59b121b7c45ce0f990fd995822bd6bdedc78fbfcd297cfefca822bd74433e301fa85bfe541b2e977cd8c4d2dca10fc3d000cd1002a9415ac492af40b89e13370df8ebc464704ddc131c99b2f9e3cff53f44b73fd03028346128e7a8f962994ee41f4dc867ec3b90c1d65ba146cbf3085168e0f11b5a1806f78f15afce7048a05c27c5e804427e0425bf1dff3ddf1c8f8245cab1b9bc17f17283c64037a43a6755c508a424a1b6cf8fab2d2d2e22e4b0868038fa282fd25fb97b4e23d2cd7a3772078df78fe50fb8390378ddf200e03cfee3717432904c762084148064c881b56b7bf529817db23b958671d6162f25b9badb1f677b7944422bbbb7bd30e2f08ca06d406d53b4866cb4f6df0bcecfa28ee29577bb3d4cfb89b05c3b0ebb46fadb5de2c11c70bcc4bd9686729a4fa42fadfe7d8993f4b0087b4cd9cf3efbd36bb37dfcce26cdacf81395436da3ee7e4babfdd9cdc9cf3723d937b3a679e1949cffd10f684d17dce9a89cc98735136daf4210f0aa8fa8544b653ffe0c22d4d951971582ecfed72f14805876eb8087f72dd0df8f327fc995d5ec17ccff4bb6c946ddcfc4ce5224f405d719d5ebdc675364ee8cfd250379f758a1595569cc6755247988b6aad79696718866197cb45d9b51d3ae6461f4419f1e8a5813c492988e451e9e8e84217744557ced9662efbac1b7bf81042081dcbba75b95c244117ab2045a50b5dbbb65af556b98fa2321779059e8bb2512e922a0fc014dcf9e08d3fb3b8ee601c1f752d6551574164e37df3308d96344ad09c41d394c6c7ce36f6d0686729fc196f72bb7b8fadee132352adb599f42794985beb6e1dcbd9f1edc40f37fcefb30cfb201042d8f2a14bc20e625b4ffd10b684369f65f0419757001f8344306bc3f5605fb5874f03c222afc0be6b5c073b088d54586d55e918a834e8726b21c637f686fe8ea692d05ff559b601bfc76f1ecb39f0831ca7e23a096f385804977686550cc3ea8d6c5b6cb351f769756ea77e542b7efe1765a4382c656bf7c8c7beda9c399cfaf4e7ef44197707fbb47c5a12031cb1dcb0c82bc0b8ce0341b0c81330798cb6c3a218420ccae20d97333f9c0181fb1429271c3192c4cad118250be68f3d5f1fed59049233519ab29723dddddddddddd0ba7b9705c698eb6c26b2df7b20db8630423663fa6334a7686e51a0fea74f8661b71c7cfb0e7304a547cd48c74eb1d864e8ff367e18c326e5d7c77fa3a03c488557539f3a384333c92ae58a3c76c9cfd98cc603103c40c1f77762890104e4081035a7a67023336ecb81f93991ab6110cbbdbd144604605cd0733445465cc00d15e30c34325e60a25325b7c59d9b065c583112b129a5644a65cf101951554385139519164840a1634325414d1a4505182f6840a1f5aa869810aad082856313ca97e38628582105a141f564fa48ca0cc130d4919197628d38212658e5468ca9870a4cc0fd59216ab13ceac74083343131a0f48a860c589978a07106857c8dca04d21d3040b9924426452d0602013642585cc90aa87352b2356a8ae904223c14b0a4aa8ac1451e5072d4b3d72501d3186869508c6bcb0aa610c92108c19a252620c910b63768c20cdd0181599279a2ca18100cbea0341682d884073d26155c2144a4b532c519d9962051510539c30c2142e16a6e8a1a18085e6a4cc0a08186d052eab2159564946e0838a9a1d8490c20695192962d04e9002a9072950583591a248e584142298c96255c48cea4b142c3031c649c8109a154c6578d06410034504314c8e10e38208628c0c8931d2961033c2eac7164d54a1fd2066d54397150e49ac9c104145154d490faa2170d0ce849941954418254c8439f2258c1015166148600a23a4ba82667534852a0827b41bb4105dd1820062454308b08862421435a88a88020620a25041852888a48902886614050f28aed06820a3fdf802822daa272354619ab42d53545b3ea0ca020a272b13a0485a2d81828519a028a222028a12342050f8582151a30a01154840b17a41df276d89be47a88cd057088d88be3e682f7da5a85efa3ed1c08061a2f2022689e603cc1115156086a8b28001a23d81e9a15a42cd2ac98c6a4a186d47972c9450497165052508d51453342c3bac889e18f1858996c297249a962f47564c5f86a884f802c4f5a5071735ab2066544d8471a18be64509ade98a1626081508a64cb18396e6892a8a2798a87c7822898acb134734229e18a2757902c8ca87277a08a9d18498d16a08a3a2d2050625341daeac6e0862cd144dcd0eaa2a9eac6460b245122847343443b41c9c00b282133d42a066c5c4cc52188d4797294a345d592105a1d262ca901d563c9e684930518d49a27ae2481543a2f00244b3e2a587c6849a559199550e6176e852448927ae681f0822c994d58e1db4204fc430594549a21d1d1962880a8a2e407a74e921851a266690b40da321a16d17cd062d2a30461c1142cbf2a2b2a412810e2b970dbbdbf91898683834a164773b6f07c6189b4012e3ce4e942121d7d903acc952e4450c094f550c01a1437ecc27232ef99e5e70c567e5f327274f3c0c3df93082d61ab61fd353d3eef45bd1a8686d04ddfdaea2a7d09111954940e693203267723a4a9a4a2d2440cdc509973f973222fc7fce124576f73b7688ccff496add3d002f6361dae203d316324c5bbc4829271d12e2729425659b271886655913a5c2450b172752a9544a6b2e69b8947998992d48236c59e2fa416e79b23bfdd189083244f85875a145d870c5842454d354114c3655e2b102c26acdc9981dddfad7992a26fd8356248295125df7635a6287fd3a9fb384938dda8f698924bbfb1d29d9834dfa316d311a4ab33b4b663fa6259e989640620921b6df6d5159bc303d89c986e810232f60274f3c3cf9d044b6fab2058969cb921743024cab20340f97134f8ae001c992056f8b2f53b29517edab27dd0d60bfc5f176640da1fd638437640f768f04d2111312489664a922f4e302b012425619381ccccf9f3910e4cf0fb2008703d4bf9cddcafebdb6f1b6ce8b01ddc61739f8bac8c9c9f9ebc2c5f6db823c1df6f61dfbfabf6aa25c8fe55e8d46402d412a49773a4808ed2e67c31613169777b6f566367ced16f490f97e3242bf82454a0d7df0eab5932373562f6d01469abe6856844060be6012122388137968ac20a2092942b408b9098213c487c878473821048d1021479e186244132b659048828a1c80a4e083101e63842c110223c8028238145a849011d2802050442942091568102282300608e2501010e469f1c404691a820b70fb762db2d78fa41f473f86767d4c8434f56d36a7d6b676988d4ab91e8b7ded5a96fedcad003c9efbf13db6600bee973378ad37c3625cab6fca753daf11944640da14fbce62bfed9bf178aedc16f27800b76ffb66bc877d0ef99e7b0517ee9833786bd6d8c0de723837fcc24df38db7e49fe5784b1be7e796dbf30d1712da6f69db1bf62d27a1a0cf613c640f42d6135d73e8cf8790d2cff4d65a5decfad6daeb184fccbd8c8582ee7676a28c7f16120dffb9874f6e2fc6e86bb2077b28edf7e22165eff7e2a1444a08610f74eb03336b050dfff568b55aad56932673b264d09dc55872d6e113917e85f7be762cedf7daa1f4da2102e54164ff7eaf1d677616f1cb53ee982797817d6aa116f6dfa516d71a4fb725181702b66006f8345f0071cc0de5dbeb736711423ab76ca2868d981543f45c43f260f8eff614a0b17f1887d5c7d8dc767bd876f77dadf915dbeaeff0b26df67bedb0b2b388594db40e052db85d3cbc4f8293e71a4ef305ac186846717d1f653c0b3aeb81c4b8ba51bab3a7004d9ffea342b473f82d112f21a4355df675ba586e962919c61c6ff6ed7b6d09dacac8e063d2b175fb53e3221dbfbefc1c9dbb69cc2ae1a53c2346830968f0f67c3bdf527f10352384a8ba45d2de0269cbc72d0988b47d6a63c2acde886ba45db218e3c7549077409bd6ae67723e78c78f5264a907ab900550a6acb56fe36dcbe1dcefe930d0f618b42dde927bd1084c749decfd7bdfc6dbf7de977f3919b4e7d6e13deda6ff720dda75f3c19b7237cb0ca2ee69b2ec61081da3b29ca1361b6fa31effcb1490f2519c7c14d765280e0783b7516fe36d1487837d0feae963a8a78fe23e686758d0be9b4f6b5b28b7a0cc619aa523244847b366a3ba3425fc59e30b39a1e48e84b22cbb7211943d1f724a5067fa116b04cf452348aa43e6124aae6217d4a9121c4919eb667167f1d0964f65945c540275e2fb11eb87865d507c10384cf443c38f4856aaf07484ed6a8b252a559aac607162f1d04b7a492fe91d4b4ec563169da253d4e2436bade5e27374565bdce9436bade5e273747668df5a6bb9f81c9d5c94892c692b5afb252a7a2917e9a5a3ddc125bd0497a20cb894654b2daca573d1930ed9cb7117e4914f643b773fd3b45eadc19ff957e730ab8747892fe2dbfc5842bae7fe8c0279b0af4e05f2d026b70279b2faf16395582536d54ceeeb7272de04ea24419de8494a90c7bad26acd9d970b6289a0edbfddb592b4efaeb56160226cb4e9a319f224c8d3b5d0e868d9f1bdc963b2c24b944de409e8f05095b415c51525caf02418c569ad18c675403529cab0f1e986a3157c82d10d1e3abab9c146f3e6e6e6f1d00d3ebab9d1373737d8e543fac687347e6d63c3ddd8fcb3c198081361224c24d32c6d0fb21f939a261207becf9c4ae7d73abfaeaaad27849d9de6ea5d26a29d4e9cb54aa5552afd34a2cebff5a0b48d4af55aa7f4a7b24af534a00deab52a95caf43b98ea5255f55ce73636a92ce78dfe07f54d55a1f4dfdce8973652e74f49eceba3b65cc4d1e948daad0a46a9c7294c944aa51e0fa552293c944aa5b0cb87523ea4f1fc8c42a5f48e323026c2449808131955285964b10fb01f5316567696ba34c618e363f9216c9f736a9d3d17e5224f00f658d43b0884ac757e1a3163bff56419a5f5e78cf363ec276edd85b07b3c47f6f969c0fffc18e3308a732c85cab273b1f3a7dee6fc289839cee22d17b57251454229bbb22b1369b56e94a04bdf6054c618e7c7290821bcb9b981372d983174e5a29696370431c6782186f1e110bc10caeb7fefe321ff8b8f7ae6bfed10835862a3dd45c721ef5f8a0596ad80fd98b0405283e4be1a17165eeeb5f7af0436afbfcb2fb38d1e88bd043842f939e35456dd3cea559b0de793da320ea86e8cbbf031514be768a940c22e3c845dd885c4d3d98b64647d088564646435deb046a12ec63e843126c244980813216948b178f1a94b886dcf0f08dbfedbb3931b08761e1f692f603fa634623616465780d959cc96e90aa76d80fd98ae50c25aaae647f9d15f0ebb50d782503fac375f35d5dfd7b47dadfd958de5f0df6c0fbeb0e13ab92fc77540755b8c03aabb667fb1ccf9b476fd4c3e86c56bb9ca6532721ad6976343d7297e0002e4c1fe6ffe2c4184aa9bef5a3ade7be3d6631fbe37c66b519fa5628faea134ae83b3ce39679d75ce88bdd7ead78bc377bf58bc027fec6aa9103ef6b4d6bff03a6d5afde829be80d5886295eb99b5ba0fb602b3ecc96e70b35c5f5a719d55c11bcedd2f967a9dea75dad8cdcde209c094a20c6805ca804f9355bf8364f453f5211f6c6543bf59300cc3867616638c374bcd34226a4b3ddeb0cf1b861b4419be547ffa1354822d7fbdb97d311b5a5c31be59bcecf8f3cebf59a0929590ccd3de403e7cb2f579795e722c2b42e84eb77410607b20681f21c55d567cc85d4b183b910fb9eb5d40095b38078b2420ac0f5d4f56d15ab0081641172c824675cbf99cd8bd25a97385eede923f0de9ade7d1e196537da2905d2cf17955a21960dbdf53ff8bc56f96eb0479fce306c207fe72a08e9016495846a42d9e6505a13f0a41f81e7c1d007a33fce34be0431c6c1b401dff1c5610ddb915c7f2d9f3c761a803a78842bbfe7ccf5a30b2958b7251364a6a82f40443290bffcea37815af1225fe6bd0e522270a59790da9f212b2031227b2f12b51e343cfb55f8e9c6ec12724b06e560a5abe8440d9ef899eff76f73fbf73b12194a7f3786c08c9e1e9bcddc5bd778808f1b1df2bc8991d82fd5e4194e09f71a5346f86a7d900f2500ede0cdff163e6e0c5a811a38c32c648e4cdf0ed44f67b37cae02351f0720dfcb4bfd68a323e0f6314254bc167dda07d77ae64bf67cda05d08a69964ce401daf7ee4a405ead86731d1464a7407c1f8110403c540328e83763fd2d9b93afe94e582d5f29ffc291f0b07edfb85275d8a4771258beb6ba8532ba7c99f94d64dbedde6a6d8450b49773a14c0d871000dfa36d27eef5fdf4b1fbc3fbef854ce9d666eac1c34fdaab5ec6b0dcb94cca494187fcef9de7b51f8278e19ceb06bedb5134d1659512ca510baf80c29a59f8a111573ad374b7cecda482b95ac1e76cc642f870545d3afbfa3e38370870584f63bb176b1df05e4f98c42a16c6c6cdec6db361ccecdf7d8fc7d1b0e686337dbd35bd0c6f2db2d9b18670e3f0c8bd7e219a7cc58208430684f3a2537a584514a1925842eadf77b0951b2238c43314d1662585034b6cfea41bf287fe771ff12ea789039e79c106208b7077540d08f350efeb7218618e2770c31c610cfe9d28ffd7cdba334a252df531f85fafaa9b7401b632988f1e68377d6e96cea47957e0667152d4d5a7c34edf7ea6165cb1e4b9b4e10ea3f4e431d10dc0206e0c47f2f468b6774691a1eaf640f6a265e455668ea3ded285960d9a067562f061a6c506badf6b34a1d5e0a20cfbbf7ce3927d613401e4db5568e0e7d7228a30fc48bd6b40650077bfa99dfef20037e6dbc8d7d76dd395c3f9371036cbbd65ecbd9cbd1160bbad3d100f2744f010c1cf8fe67b2d9646702973e2d0da00ec4004a94265007da2041226274e36308840f6c0732d041c6810534c080860496e86e27a6e294d7a57f94a9944ca5b24ca53ee79c53b0b35bf7d21879128d16962648e99992324ab92db992eb649c574a4d236e6077f37d5a9b467cf822e2562a67f933e628a37c41776f293e0d0f6ac4af319f06ec409816c3a6bbbb03ed29b4b3dede9ca898b70e6f4beecbed63ae21e37212802fa0a5d1c2d2bd9992cd7f39454bdb8dd8efe5f201593264314e1f1f2c50c79da00efca62a28294b5094b292242447d5c87db8107ed8c5a73e1bf06945ae830c24e9ee559913cbe6e4668d99711d8e8f450eba768c534ae93edde5d1864af0b1cd8fad138dbd7fec71ce97d88f5bc47cc418310c8b118b1dc4cc69f8c2310ee318717874160cdabf036bab7850c3bf06f65a0bea604075031db0889e6a440c208ffdcecedff1406ed84112fd1127725cd42497716c90c98d03ec3088c61b21960ddd6776f3806fd60b3abf0fde16857a9b3fdb6ce1b3aae8f9d9b3ff2436a79edfc252a9d4db783bc5e1e8ef497dfd14575ffffda00d847abdbd0d07edbcf9e08db1b71946dfda5a776499ec53eeefdddf7b3f9f5bebf6b973ef5f0d774eda9fcffa3677b6656f737f0ba1b58f7b10dacb59086db510da67fddfc682417776779562fea4863aded22ac7fa41cf5963020c653c1ba7dc2c22ddedec70327bace259b38cc328b83b3fedfbae334bc2452465f79394a5a42995af7befd3daf46d9472985544fb7e906e73d78dbee71c74d349dfa96f673c3bddded6713ef8d3884503109c7009160d2dea857582ee9cc88ecf62a229779d8e60d7c652207408659d3ef5dfe60fbe17e39c71ce38679c33c269dfabd5d65abb1036ec287d3fa5acd855e7dce88b2f2f1371eb7c5ad0a8eea8c22989e98c16262b8e98aa00434215560c4b47be2dc19e62dbd05b80fdd1cc322e1b4d024481d204be887f95401d247e4482ee08408037e35922cd2dc522297bdb8f09cdd1ce5219da9c39ec823af2c5886f911c6d6ee41a1ad25d6ac7db4acd393191e5de86248748c06ad29d9d01ebd4c38791390ed2ad9d1fa5371b6feb871983185f7351a3e8a3e86b4a0366f931ea69c4ddda19078b3c01f77da311b1cb49a863b1d66212ac1168095841e84e67be7cade5e23184f8e7e3d4f6e32d98e16e36dece1c0eea7bf2dbcff65170eb30d0ce5019fb97b3a09d6d37cbad12be30ba2f3cada5a11134e29249e902f24030995194306654c29752d248a90b7ad3c6fd54eea14b3a84bff7de7befbdf778a48cb00208b77be0dbdf0c0814d5a9dad0848d7a54e9ae68614c0890a0b2a3490b4a908c40223d289212920f3fa1c790932b7e3c39228811fb3938d17485928f16a660410908a924c450d00c351469a1e5881aa0a4594189ca0fea151021892f4b00b1660b215470124451acb5564a29a5949ed06384284d242845719a48aad45a6bad95524a29ad5cbd45e81210596bad544a4a876aad43bf33b93c2b421031c31153988005c811272634e1440dd10f289ce1f294c234b2c40846cc9480e4081dac50a109245f94ba1c39112a210577fae1882abce8c08406052744a21327267040049a1c76c861090a5a8a28ed804e4a1861ce135e4a3d86e050ad4eca0ce51065ab06d7ec3189bc6c2021be6a98a2478b069949201aa46cff47431324aefdbed2a065fb3f1a9ab67fe7fb7557c74fdd2e5e8ca7c3696b7c3fe4819f53a73ffdbae9adab4f318efacf9f6f11486ef9f36ef933a319072765dc7cd64de6ecb973cee11f5f833cef23150cfb8b617f857ca9e93eecbd041db677ebaeadf366106f5c4e625cc6b98f2f809bc20d7306376cb54ad8af4e65d7fadec405608dae0fa7ac6f6f544ee2d41a15ee682d12f1ab1246bbbead6fe34f15bdf46aaaabbae9a4f626c813f763e50b7c695bcb65f7c6c6f6d89f6fa3f30dcb49ce62dc057077f533b869c4ba3ddccad97100061c74e0f3810f23e850200f0066c6f8da16863df6b137419e9b337024cc6aeb372827a5bf38514ba92250a7610266bf1713d796e169cafdb2ccce6c88c1dbf006a50d5f062b1bbecbb0b4e1672fc3f70cdefbffd4fd62c007faa9fb411d19b471d4adbbbb7e741cf421e41e7def8e0594fd760c54324b3106b39f1bd6393b6ed8cfedc697f2d6e8fbbd1891ebe84f3ab738391b39f9e20832185672aa6814d0cebddba11f29d81c0075a07def7636b59b07b373402bcd07514607f1058c3f637b31e0777f45a4604307d0addb993a30deee763ac8c0066207de8c09de8cb7a79cd28887ecc1170c48fbbd5e88f27ac1f55aa2e4b5c4c70482586a6495a4a42d1f261d6df93329cac4ee2f7df300e8a76efb62f87f7c1d3f75e31763661cf0e5cc38e64b0eea70e9d1e61cf20b00bf002f86ff94fab43e952c333a7ecf7c345ada97efb2877ecde886fdbd5ce7cfbf5a6aa5a75112b3e3472d4d52f6db4167f600f67bc180650365d6a9bbd70dbfb5f57e7e20b931a559ae41297d31f2d70da339bb664f376bb92e5fe01fb1ab436e6ebadbefe8d79719077d4abbf8b4f6f8d3af5c976f38a5f12b7dcf17c070eefda4b6bf18fe3605d7cebe0bda378bfd76a6044912315af6db6f376decaf92263b8301793ad46799be97d36e866519e76cd4d6658ffdbdb78b3ca9ad436efc4072cf1676d19a3385b98bfabc599b71609f714196520f7e3a905f877c9a7dae817d8672a78ff28ce33ef659deb6ec73c63d1d6ee3668faa9165500dccde8b81519bcdd9d8f61e9533f7b0971907b6599c71ef4eeec1803a0f0392c4b5fda10b59ecb76996ca60c0ecd1d703ff6d9d6ffaf246017abace03411bbe6e723dfef02107234c266673fbbd5ca8b27dfb496df9737d3a7cfaf69f6ef6efcbd930200f9541998c2e44d933f67bb590050c546050da1ef8bf17837e57bfd2f76600c9eddfd1aa46fb7e54e297b361bc18ef8900e3f5a56fbe66c31fbff1dedfc6e3707e7c532e066d9973cc7f5ce47444c7b1dc8d1eda1321e441e90a60b6fc97c90ba1cc38280c43c19833a08f6dc0e0b2c733d90540beebb3c468ac05314e5bca9b01262fc0c9af43dac7d121f7cf4f6a3feec771e41cf21fa7c3237781dfed598b79a5d089eca5708802dda3ef07ed8333e693a12d3fca873326fdb9fda436d7f94b185f42c8b9d790c5349b7ec501cc9eef4e3bbe3ca2ca867fa3ecf89285a4947daefb9a6d5cec717e7cbfd721b7ff4f6a3b973dcd39e8e5bae89c0edf8f4b75f33db8a1b707e0dfaff7a1df5d3f6edd7ca0fb91eb913d3784fdb6eefe93f2caadf39d7f52db03efc5782f468ec8c93ba50ed7e11cce8dfaf12bd7232990eff9e3fbc737e6924926bf0e2121dfb270b4ed53f936cad8d9d9e13c90390ab09d9b400200f8d03b30044084eee68e713660c7973076dc51ce97c3f19490d3e17bbef40e4b2f807db875f4f38dfce33aa00e7fa242640ff2fcf80a3a7c47ce62c04b902634c0234c11290ca1a9e24b90157aec56dcefb582d08c422f24af2367585e5248e42778ccff9ca74caa07a8d9610831488cc0628405d46807d9c3083524c126d8a880d463fe54e1470964ee0bc91525b09af8cf79a960c546edf75201ccee7e273362a1091bbef61c2e3084096498bc9818d34311ab0b8b899db8858913865e43b63022e6880b2bcb0b05242f14948c5e4584aa08ac23dc4e20ac2dab2b3c786cc1c2840f204aa082bd8e8408f22a72c3c6fbbd8ac410c4eb08ca0b851f585ba68b85455b2981bc8a24bd8a20ed4eff8eece5c009610fc491664942bf97948b96ff267e33e6ff84b0a5959f650cfff13d803deb4760db7f77c3b15c0610d8b3be354c585786605dd9f919e173708cb5e2bd78bb4bd918f2e5bd789b7292080d80fd3607a006411b00db236412a12da8c4cdd646b16434030000019315000028100a078442a148142649b8093f14000c859c42764a150ea420865114c418838c31c400608801000460684aaa0b0051ff3f7645d252a6080ea2c8318a03635a145f9e1a1a4d82c964bc43b2feb51edad3ca5789b951bbf277f0799c680a5f3834e1dcd8c36e42aa1bd9c87ddf429440cdf3ff0e6462f2bdfa6d949628e743c7302c57e0e916b6366a49c023245a0a319399993433c2d57582df923eb3b84780391a35b9f2c3c10b2aa4485d5c882f1693ff13a063921c3c3350120b2e8e672bcd81c2cb9591a266179b33ea274ef3b558a968cbde2f36c9776400a0b4b962424055a7950d2957e8d6d0bd493e486469f6c27f7f867c95e074e44e8a2f946e0bb2c684130f3894fa365ae2b75556803c104dd41ac44a1c37215ba598e1f0c249f420629a02801e6a3a40a6a92d4f21631940a816ad26752f6b926de99307229109759e9a99cf22cb05812a65caf2ced5fc762a22f9f4c2d825ba9c082936c94b0e65d6231cc46990f9d291c8ef33d86fc8d2b4905e7a9396c295c6abdac3b1e016b4d5e396b19594947fc40b05f0ac726ff1ccdd568805310ca93b7a80a4b61a039ad6d705285f1ad3006244f029adaa21a6e5b271f91431c703152656c088420c68c2641c10bb0e51ed9ede798d36144cb161e31555376f23b35ad917e5ff5d80c3ffc37bb9b5f2b439260a9f958f66c992282cc2f800ff3cd6798cb7942214b83d87fad64afc30526ac42d0a838cf7f8a53374121e993b527a6a006a94a9797457ceeb35628cc0fa7198afe1f48f974b4be6be512db12541f0889ed12eb50bb63895309b7ddfa405363cfa70ea9843069d43c22b045819e88d93565d4c55655780742eea209aaa858942793f31222f91635cda9f3730a9aa44e34037b16c8a26acf96c4a802f2912e53f49733c647fd1311f900621ab722b82777fb23206942c6bdffd810eb03aa6a07da640711841334f65b03b94fff531711e151c01750b629b1111177060cabb2f50f6b9ee8011cb0c89caa65c8e02cf6077cc5be480b1e9fe64d31cd1c97704c68046982232f811724fc49f565b3d1f751f644e7d21b12f9e4d11938ce4e063bd53e84f2afb66a429e62b3e8e8ca778863f8e9cadca3bb8cd7e021412e9c8880ea4cf7e3245c4ca74021237f4ce5749083c837a32d0ed008dd1f8e803db7ebe58991988e0111fc738aa4f5ae60cc4b18483f6db60826418c6ac3aab1a76b5fef3aa6fe6f84960cadd74ebedf89aefd7127fd32b4273ca0818de9a4bbd67109e76684aa8c63760aeebb77ac5a5e902bd58579725a74a94b970e30415b06ce023c35db6bed7139b429c37f02c26f26e308c425111d76aedb9493459711cb555683722c4f12bbf306051e9b94a23bf317e7c65af25fc88fbe961b180cadbb02b855401edf828371b0201542e295112c08398458e118d7b91e623a011a1e83a2831e9eda48492101b38ecbe8b17152c99d4663bf1dfbaa35a2c496eb794a800b49406383158af4479f406d667eaa6c38f29669b3244a730b5c1ed225f1ca3b8331c20bf03c7e52334ded23cb2c830cc10e9b3b04c8da0da83561a29f1b10ac9ba1b9172a13a395882c9608b089cfdc51cf0d81c148c84f17aede0fc5afa6adb7a219d72cd2a887e76985a866a7b0ae3d9d11150d7940f975fe4a7f250bd7822400903772a6de3b05cb5eb689a1699a96d5bfca05381af463ce5cdab1f1caafc6b969443ad7676211362bbd7b93339fd36e51f873a9a551d291d5bc5d8666014ad7f47361a1508afa823c0e1b7b177b5583e9419949c6cc043c42ea264043165c0e0de0fa5758a5e736cc932b72b5feca2a952e520145ecce42e57f936ce0bf615e5d497e927e28b8051df6c6d21a8702ff921b6c66d74a6441c296d66f672cbd8ce06d478006c2399051475f36557eb728e6c3b811e46021cb9235adb46ffed593f9a1a517c8c8fa648874c0313d4f0fa11878841dbd8cdc8a337a4747943aa794488a923d81aa420856b3b34ae211318591d81534f7a60f51f532a29170a6732d08b712a8ad0e85205c3c42011824d115b7a7a8113541acc1fe51a44ad9d4e2d8bbe05f8e60ec71fea56797c1850b0ceac9e75b78212f678d09c4f6f13708aa496055ffd8688bfe4507914109441fbd40465b90a55f040ef2b748a0b81763f0013c268d95eadcd1d8ac7cae529bdbee1858793e37ea4d2d26d1d232339852a9ea074c26082bce0ecf78a4685dbc9a85b3f31d4e36a3a2ec9a1e865cf2438c566d4a3aae18c0aafb234c5ebb566a2d1c7988b92864c9f76028e78f590c08609419e29d60a16c5db56198c48a3b25cf2f5194885349b13796e1ab890920e8dc5760ff40ed228f97b24933a54e8fa596a731aa33c029849e5dc51a5444250caa89a7b8a412a61db5f73ecf41c8dfaf340ce3a597d3a4015d60669f1cf7370361cad1486cebf823321f7ed42fd8e6cd7d0aa3f17a3280a3cb3bbf0ff407fa81a2e2b184ab823416f03f9ec2ed1111fb543dd16a5243a2595e97d392dcbffde00d1dc8d9e46217bfcd01b5c64e2f444ad610bd0cbd328e680cde4a35c62322e3579c8b1a08518a6df0bc8bd83191e7dc3cc9f3b65b5599dff5ec2c40b6e8e066e1e60d24adfad98983d6fc9583f8ad5821bd212b413104713337227d74b428ae3728e0129750879797693910bdd875e9b9b99db2cce55682207baa392c382400d3341ef00e1bd5e446f7e5308daf7322cc749c6bc9a903d470c9b96ef3d5da83559fb8dd2303e4507720acadd5806e1baa52aa939e37cb685f3e2b37138274680edb0e23a3ed5d636c1ba9ee6ae6b570471c1cc020f197291d58673bb901dddfea32f21748f8a67ae7719dc412d3261b548791e3a5dfddf1adfd3f94418bd669929cb28c1b3a378e5ed068e6a340a4f477d8045794a3ef70e5b5875a3e7a55a2768c3f92fc971dc4fd43635797357665ecced6bc9f6781830ac8b4ce13369df8b19b76ddce54187200b6ab42b47d8a80cbd7aaf20061dca9db79b359bd0152fc8edb664d68e6ecb8ea107cea95b6133e909c43793b18e177f939ad3400ff6f81a1678fad67913d4b4709aa7f6e4a80d310b8dc235c69bc26d3c246c72b5eed599f3d3070ed40eaf6e3b0f842c14e74b4790e12301a38690eebb58e0752f1649d020c008a25bc4c890fd26c3db6623f6e814eaa3007268620eb73438334966ae3777aa9494313624110e4ab3e51767b8faa38dbc9cf59122dc9e1b32df275c5be472841aa5e94710b621e0788ed2a4e9ad96180289cefa634cf181cea0a70c8b15ae1400d6e9a81326c14a7f783004e174018077aba4d3b99016db122ee84242723227eab4133b9e5f10b8c654b2e4eb5b9283089307509400bb315b741b6bfaa67b9b68c82e22f6ddfcc199c37d8bae040cd96fb45f4ad687e94656ba0ab703b8609c0ac4a5631b5bf9d04fb6d3af4801a0ce0675bfddd6cfe1310e818285f6db15e3cd550fc71830c678e8ac6a54a49b939cead2c5de7e15e9f11a77d587bc50dbe3e0cd2bb0546d4076ea4a1417d31f6116846098b828f983bcfe3e7b4e19b4a38c57ea249cb181c8ff6e8a884e0b386c978238c3718ebc26dd00e305f4cd1ddd3c27f5757a534d5dfaf616f6cb36e956a1463fe841b35fc693b1cc08fae3a309d733f5492d5d0075ec867a290ebd61474588d2b1a8f51f1c8293d1b0895bc50e17728b393f4e9b60c278cd64bf47f8f6ade605201e259defe905fbb3559fe23fbfb7f2b72c49896c200ba1cb7c0a584d46117620445c93ab583208d2f3b6e279ecfa022dc2b3d0f0ad6ed2e838f2cdd6ec5de24ed9de166cee72289afa82da5ec14d73e40102a2879805be5f80313c902e4f3756e7590acaaa6687dee7dd0c4177098f9f44c0602ad0ce7d7f452f4e4ee6c919c9d3cc5aef08577b714d3793467970b47e5ddf482aef04f1499c86cde9ab61800573caae9d0fe071b2cc27bc25f3e593ff9e2f067358420f924b71ce2283977b51d4800496916508db7c0e830466c2d463a16701dd5bc740018eeb241ccc8ebc326db6e6468b70826320264437e88b73eaeaac521730c833b7c5133af9abfdd08cb7b7235cb4769fce7c80d5eb3d182526b5cb238f45aa24ac80514557d33cbf3b12a38489d50902cfcfa5a8da72ddd4195dbbb9232a2e24656a7b1c4c50024095cc8bcf86531e376646682d0f5eb9fa290294c47fde8439f06bdc08a3235d81951ca4adf2c2d90fa368e4144b0e7d8374c776386cbdc047449e3e9ac9569d0bc4d40fd21c9eea2bb296bb66db2486ef5d823acc7dcd9322c2e9bdb9cdd2e4671b1774565904fb7aa44c8ee3cbb98901b32fbbb853dc23d41812e0cd5224097b52e85b42054d028f52624f1f21004c14fb5c76de2186ff745fee5e4ce7705b3f56310bb24f70b2b2320ae476be1ffc0d482bda4edccb0bce0e5b3e1eda108fe04b8109004cc6c60f37906e8067ff1fcf0560996006add46e051045f18b77a25f9a4729a8931ac373acbee3d2d3f7279a15b12c2a55c88e857f63d40a08277c521d5ecc6b81324b58567f0c0f47dc2b110245dabba01ed231d47d7c59d4b4fbfe0f073599024bdde2d59b437ba84e24dc730b8c2f8c70b7188a6238363d233b097a8b725364234730bbc00cd36a34faad355dd71d700266c73209e062e2b66cd4914b6f0c3fce61136459bcadf887c37e80b1b9ab0224f58ab1e5d2d6313cbe594ce9be845b2f80e5fbeca50e45f30c70bfdad92b38fafd452c5f3ce854f2f501f1647cdf5bfb3849b6969cee681cd35444001b4113dba604566ce0eff2406ce3232bc2c950b3c8e4840af56200ee94a02822a421e2e31acd177813832722e259baaa1957882c93a3a14fdf013fe0d251cb740515d8b23f8d154d735129ea6fc3cb16e888fef4480cd1e6e05fb880d78e5b0273233435b99d10fb4df340ff5d4ba804912b289081f1ca8169c860ec58841c56e796b475bf79a768c7179114e72a50708d89879ad5d54e06ff94861e58f0c88b7d645330b4f383d70fdf2bc9983ca46ff73cae39b26674968a2373acd453082a5b609f0391c7b444abc7889871d16305667741ec59715ac3ed563b5ef520c1865327bd17ea66f44b9635b14474630202ef6a81a538dde972a1aea6cf53a6ab200c55b02a69a5b50d6429af5a3354066ec138a2e60c5606ed9b15b62e9c76c3206080917904022edab2675a356c49cd880bd84a29a8313f01e27f08ccc5ac1f5cab0f166aa759c3a2da583ead5d0f938756f5d07a84c1003d421501390b6b57dd44fd627a37d8c3e512d92e6624953b0e25c56db7b27090e6de4388061aa73510e639cddabc880050c753252908b7fea9b9b34cda8d229c9a08415d3cb4cbcafc7eedf155bbf1e23e9ca30eca6cf5bebab8daf14201ec1fd0c1ffb709c718ce51d62a97a062dbccdf0388064a176442714a6e219e8db8af6ccc902c64143c8b3af98be9af369a87602e457e5730f573560870c6edfd22c1ac38a4b2c21a5d6d1cad6778c1f8433cfb3c981fd9c74998952731016de1dc528095aea92ba346117128e0bf0e21f9525e1967a0d65c3a76bba9045acad3ea439ca1877dd99395e3ce8e818a6b17c0673311d215822872e61f8477963d2c33bfac5adda608084326b609c95f8c16ec145478f08c9d444f2a481e2873230d5c461e09afa05a55915c715101d567bb991d64209bd54b249885642d1c1339311cc43e0771329ca763c5ab832a85d9ed1454c77a82d34ca55488f44dcac4bc4b26b47700c6728b046222db0a6e31d4cb7abec1f7a849ef6f98bc7020d2761578fc6f9dde8432d1d0328bd6add34f1dfe7ff63bb1015abbfd6e2bcd8201a6b80d4d5b78ae465095f8e6f5fa32cc32dbe6b5e6a31243ecd3e603150c07653bb8f4ebe1e3bf1fc120e990ab44899e85914c18ed41935d149de3bd6a154d269c2c42163c23e3ef4b201ae49a0fc82c4ef29539d065ea755ea29a4b7a251537aa402f99ffc7fba3865cb1352bd57838327203232b5de0cab250b5dc12e0a26345429aa018b741719b73b63ce06e3112b90aaaab5d996486eceb87af30fcb2af8413b635e14e9bc006d61a4c565e5a0f6e0eff4a7044866754682c6bc42b32e9d4ef82681428b2abb5c99d00881038657fb0e399a9d533191972a4e19e116caaba872e2c652de30b11c41ce155e96423be7b3e43d9f0602c71cd9292eb0dc67410f4d05e776bf5da45aad4209a547ac6864a939a16ff6fdb83a3db188698d272a6193a10265cbce3418739053a5fb410cc12694fc47e3fc5dc0e681be710842ecdf7af6a548100a7879947c169a516ab7567121a6a61de5e123aafc94d1719da8b7b92492c8cb56428f710281a0be783d5432dd9497c963a10b6d8fae364b5009e7253d3cac79a6d4a9f8ab9dab781e486b34adc604238a40c7ba4fa52bcb19e4bdcba5427b1c5d2331d45108352e08afe626de6e351a663e8b8a234b3f68cd66879ad7a23460db41177b28b0d743d4367b41794c4b4646da327dc28867783aeb1046b4c3e6485f7579a3e79f1e0e04832ae8f94fd20ca54233d50b9cacf07e2e121a4df1f59addec26d4c41acf4967b269a0bdd9a51e4b8e1d2013422c188d35f9c9ebd1d8a3ec004967ed6c7963707ddd146d2cfa3a4d47fe154d05dd20adb5c4621a1b2d4152bfe9ab6bd41aba2ec6af41ef20431ca98ed4b040abf52d17b13c1c187193025a0901d55eecbda51e10ed736c97d856ff8feab8cd25654dfee47a64a69bec4c281e0d168f1e66c31121a9065eb127d7af4107aaea516109c4c23f5635233ae8fc9075f8964c45521454bda80c06180af85f834e0de9ed0238f43c4504cabc2db831f5d3a7a315dce8f0bb0e8aa3454584c525cf5a4c51074a0c8973d3eeadc14390e4a61b0ce8a38bfd24915889fb4aae4192498d74588f6a3ddc4308bd83f3e48b881ca4ff49ff51318f9da0b1843cdfcc221c69841fb906b4189af6a53ae66ec9ebdb883faf2174a66fad42ae30e21f15bff64047fde60fde0f4a2acbdc26625c0769e3ab9f565c0989483dcc9b6f929f2d576764e1f432b1cf9063e8cb3cc21a9ec9ed39ebe4fb179a4a5896130893dba35818d84961a8c704bd50be25d0afb25b7c3e531423f6303abdee669e425fc2f1138d1ec694b20684a76a6c8cf50df00733249aa51f23e1c8ed86dca0a520194cd5caef181a0cdc9c5d1b38308f977870fd80cc5e1c16fba1a7aaf171f765787d62f777cb4bf7bd632fefab042e1bc4abf405fc8d3e8b8bb04afa23596bbe6a040066837ac7ae6f429706be6518a16ac719fe62fbfedac59da0883b298ee68ac67d98f05b5c2ca7631af08b41558e9b2525f0de2b3b52adbe6c52248a25937680f4ee2cea50135302c66dd6cd360c95ea191057724f0a6dbbf7de2e4ecccb5799074df6fdc4d3dfe53d554b3f402baff6424ddd888c7fa1a74969fb4551e7cc3614ab428794bbe8acddd1879e45ee659eae1e91106bed729922f1770f780eb412039582a1ec36d3c33d4f61b884cfc5a30d4644fc8ead73c674796565b92c3c7f952f7c52ce948037993ae5fd51bbc9ba64f439ec5d9fd50b9f5b5aaec1f0cb4e3e6f1cecbf7366b09e398bed4dae763e63134d32aeb85717d0b519da8a9be9cbd33b2c8b37690cdcb61eebcd22e7b7e71dc5fa8cfede8892ba43e18301470a1eb2048bdac25f52916518f86fc6d25ed31052bfe13c286e91583abdd3f1c078606e6f6312926045c180f89115454c4565200a72684240c06e2a4954f5ad1f78a97d8289ff0c328007e9c7303503c45cac22470e9140bef40f1b15f00d95d122fe05fa9356d254e35a2c5cfebba34c1f4e51729709ff545355f752c0eed568bc6753c206eb82b8368c8fadc2b4efcc497180c3963b0cb6aa9d3c3b0535f6361a01bba5704e6ab29f3416fc5b0142d39f73a2dbe3d26dcc047bf9dd83f220d461171e9e62d316df327930c01d53bc7c9947fbd9528ac3600d656fd93e8ec87d6d56242fadf7c8d11c537eb47aac55272846e500e4ccb627c0f9c014f9eef8f3e65b72c22fd9899390657c5a4dbbd8714bcf8e0b77a4ccc38c76b5197f21de7f0f41008cd42ffab8e85cfde367ec6cedf19334659923be99561cff7d30d46b8395333637cb95ed8a3aa6d1469cf391b39dbe31f2128fc85538b33700cec1fcd8e0ce743b452dba202d4ba59a6055a6dfd856aae490a00ae262d20ed9edfdd259e2dd91f4ad44b1519f6f972eeca4febac511fa1bef32388a52082b661889b22fdd89d6ef704c257d49087e129fe34ab014c4d4a0caf538962f337a23b7d567865457f26eacffdcd11b14cdbda96417aa5138bd74cb2770ed35ce0f47129dd438c77e168f887146f1a50fbc05b5ab75c8c7128a983c2822a82c4be849f133b89e8f09611463bb0683492d0f085f299b40c97015ece53642307d46bc6011784b6d8b945fe0d3703f1af92f3be50f574ed262274b4281a2021dcf49630a6923d203853b60aac9e1cb8bb98577b9fa808317faa45c5f153639619434366f78b8268d32b4c5104eeb3f84f5e92ab7b545a11e762df825d0f348bb30330302a71f36251801eee14256b74c6faf099058a1d2d34ad598a2c32f13a414454a07fa171d156f7e0586738cec7b710a6723eb4c92d66c4921f1f7838f79fa61669cb0cf34099750eb14f1a5b3e06e1e796a7e12b7d3afd62dc7945d0818e57589df9bcfaa54bb08e21e60140068bec4c867b116f13968f0a8e3a5b61102ff733c34d605e2f29c90161a03406e207b1247b7a107ad88c5de197b358f20fa3dde397b00fa181ad85fb729f1179ab1ad30ba18158e451bf916ea551a1d1ef75c2e8cd8b6b213185190f94e27d1ba1c44ff8fedac8b7451535d1a4a1475ecb0c0661769a1ae7337b156fc413f6c7e369dc13875341484dbc057b9aace0168680aa5e4adb8216d5a4fa2487d1ac1cdea1152608693f04acb5d583252439430c89d7b31f09caf3134258f91f7e4760811016c12a6829c82cf095de06c6469a249f239803c9013b999f7a48a9d5c5cce12c99906c3f98c15cbc927ea2b5c738c0d4a40c6d312739801bcc57840edc4a96e05b7f0e554e8d4031c1c5a8549859880a2369ae437fc27e6ba753c75b123e5ab1c1fd7f4d62a5a1b03df327bb91f4e661fdb9fb726dbcb417104130a8d97035ae66f3b4f6745d0612551ed8f4fff91388bf1f4643a1783f011b32bc755428c47f47910e6052b061fd58486f4d51d5509730878d92c599793cf9d124f7c15700d3b4ecf9b876623ec4500637a2950ed82f9c9072923d6f52d6c4a134a4eca6927886163305abf70164df499f591fe875df1d8332e9c057f91d7ab09876a93ab0ccf8d15c30aeb603880ba3d44bb05f5cd4b511566676da11e4bab3db2faced4101ddc1a58b987602a059606570d64bfd4a47fdc1471b1ab0029d6e7626f63b32bb88169f6801365b355265b02fd64c489858edc84a94890b60af42c9c0630b26a8e117f8211f2020a8080c4ecb754b51ee9c15cf281eff20065ebac98c6fdcf88be1d28b3e2f092f49bb93969cf20281c853dc650907c97de20b08f9421c2c8232ecdd98f8a218ec9367bb6b25aefb3f23f45392c59b0b0a52f972e5ab8a93047bbf65de4182e4f134814acdea8b24300635b8ea8cb5052be2866c7f83fc587e7c002e01a24d42e3dd4b061d18b27875419ca3cb2eeffffdd2ae35cb29019715ef7a13fa2cc9c22de22adb5aa512086d0941247833b0401645c8a506f8a564170690af199aa3a95b77508f2ebad9926bfa5bdacc1a061eb9b2fedcd6cf9353f01e1907ab813d3dfde33780e95e871b81f4df817e64d0528114508761d414c8d3aa019e17bc6d00bc6f4dcbaf0b16aeb7cbed780e413c857c261079e0c87724300f81352e60c954a229e9c406ec6bf982b83e029a5158756480083edab51dd6aa68f933b57e5460f502a0351886852bc8308588af2586b9067445146b0143d33232b88f2a5111263b402dbdfac804340fe57a36181ed46f26927e036324beb53d5db159ef2c489187b933b8af41833ac91f964c74062f23348c33622a6cc58b5cac24f8e8958231ce00f98400d410ad3333a70c3db09117741bb4065e045a3fb80115c9f0cd12156819864c94ef4205fff7af11d469c6c4b999529e136074387f7f0bb10c253fd9c6eff80e26e53733294dc51ea8594e5341a9b067b0f9ae4c7e57db8a4bcc3c15c5290be7a91ca15ba82dfb094aa2973b77b110e10f4a30f4a6e2d820b864f34370b5b8807dca6151871a5e0d686683a0ceeb137879b2f60a505a239724132b1b0085ac88fed2b40c59a32e138c8b2e3220dc596bf07efd38688ecb222bb2de1540aaaab685aa4deec80c8e6b2a1f7d5cf71b996b514bac34582633277e8a04f251d98600b542ff3a6c744a2106520bc141da4ca679f45b889a7f5f96308cb57049a5d3bb0385ac437dd51e490d163a23f372611d1f457b07cbc608c27c5a0aa37cb0202f2d2238373f417528cdd5d6cf7034b8b4cd82c1a4228d6e1ef7075e2e029a43f1dbe91918b4a656c15a1c34d8b93a67fcd83a8ded92cf33da3951ea776923988c2ba98dbd75208ef85f9da2e7dc789de91b0f7298d24efc2f9ccde530707fe8ef3c0db67c4215445a49649b30548b140384e0d14ce3df43b20b5e5a2c6e47e72dac7eb2f930ef81a716e46279a4109a6d6ceb4ca39bab57a066ca8028464f96e7fdfa071d89b736b6d8866ecf07c67ef6ba602d5a24a5654f218b0efa285a7ea9ea9472d352a47e30a7333925696a0f067b5a1e78166d6fe7215438194694eb83ea30a63ddb9639362fb8388f390048b96be6806e9d5a728a3140678b521edfa293c1994cc1a0f50c2f552c3e37850048b85b739e93a1a3f0bb7a1601993b0602624cf3e53ce94fb68505f6cdb1af9e26fb057c9bc83d8e1eeb5950c503722f2d412ce73abc1c7e6d1d59e5608c69103b2edd0282b750a82790310cf4135133b34c9520abe9f8204ad9ca948cbdf155c2c5bdbd56419996c2e92376ed7f13c0d58f1aa9d4040b9ef835b736a99756955a1b7a759bd71a11b6fb4195289b24086025ef1a6039131a63288a080aef7aaf65ab9079fe7c40a8c8f8cc9c37d3660d40320d089143c1ff57479516a59f4e1c6b33b68d5a8e87043f479871dc5b8a43db14ca4b0395e4444331fdbca843317251b0a0889fc404f64a03fd4b6471bdbbded85f1b82f4ddf8039c1df372a53051d1bb20b0f933318e2e39a2446d161ecdff92c2e80b68888c0146602ad300a203923c559f3e11a0b6e9449623df62ef936e007c9db135663f745864a8491e4080e2cb5774a39c27c6398d9066894ee5cd66105f0f3b2f8312d3e8f6ea79cafda22780ba47fc7f76b2c80c3555a71736a633a6f7fde4353a45cda01ad62b9818fdde467bfebf8966531873a013d05ba0bda682639e1966fabe6bf46e6814bf7df6cb5414119600bef8d8892db823c948696ca258306e1c1d2b02407981efa5cdd5441ea1570efd86815d898d723ef94d88425134c2fa92bb87543765225d909e226f5786b5f105ba9de4081d8d72dcc955b703727822b0669cc2666793845e760f78798922d9a956f9e56aece7fcc3751e7ae681a5742831614e8651845e4346c1f563640c289e6e7d4180ad5f73acba0f79387055026b55c92807c089964edc16df95a527d3b1486d0f0d74af0b4380ec358c0879333a3e4508b84ca8982f533b82cbef3bddabd0e04585ee35f84ab0f57e33aa8ecc363095b60c03bae290313e35770e9ada90e041acc39b4c4a08882f8936af089a43b186860b01313d642df84f3710f7f8c5b183182df2075ada900e88782df9b2d8dd519ed9914c16d84c231a6b1130d308fa3c92842bbd99da2574e2bbfcf8e0aba0f06cb1bc0e0914518252559bfa2cc50b2b846825e9c90ae5c9d9f2f80821d80456e28e5e83302eacb58c626d5f93f469796eb9c8216b398ea7e151378f64aee24864485c9010256a8394c08cda9f1b4c26107a4bc4902a3ca8963808598104d2f6734a54b2a71cf0dfd893109d701cf0d61cb197b6dce6414e11d52a12299d006c9a899ca71a615cc865aaaf0584ba655e006e8879a6a2c6116986de9647863c0025918a309d27ec83430445496503a5cb4c520e134c65c9a6b8234f1cb2ff611dfda497f5e919f7733321af288009b1cf7ff565759623f2aa1b9c5ec091cb050f5c20b09204cef1c51c5a7ddac0a0959f65e072c1127bce32c8c40b5357408f7c233e261c9b258b8b156788f4f2b3905bead2b254948ebc66ea81f92df4d053555ef4c1e13b866e458a14cf4d7ff5cf827ce84d67e73b058517cd9d9b2b0d0cf0c03ffc1e260a26283a0de4065a63c5a063e948620601fb77de7a48a933d90443c7bdccb47471ba85aa4ae033d4eb68e50d185942cb487972e23af368efacc5a521924644954813e659871f33111ebd9bbf302d1afc8e7a91251c48b5a565c22e54a30e3af0b21476039c462c736196515386bb3685d9d26fb43fa15c6fd985ef725af13800ebec9c59ff97dd2563c86349b94199830f26abcb99ba3755569e4c8e91ee0b901dbf0422fb8233e5610442ac822bb714e42a833ef86266160dc0d5fa25faddd9ae1e3921dbc073ed35b77c099890503a223fdb2b2b9d3a0a9d334b3ab93c123c28c084fa2431c0ba988e57aa84456a73c36d97735268ae3b735d457de21b89866a54507a07a8d4cd4565674b315251a9cac0b67ba5ccc35a97c285ae5a8bcc89d7e4344f1d8ea25f4e0a2c93091fe5af83ddf5115f10fef054e52e3a0ddd0aab8dfac1efc923035f09cdac3757ee2da383dab819ea0b0ae22a4b11f30b26b51290f6af3fc2d27066e613c3da1c35b2ccc6a501b0df2f1fbe5f2468bd20bb33f23626ed864a614e8b77cc708b541e6b7feec67c02aac55754e1f09d53cba678578cbdc14a21bd14a0fbeff06c165773ce793063b0c28a6468a71629f50bb9570819110bba5ffd6698c4aa309022c0845cb92e77234b6351cc45a175e7b498c919983246b1bf4c16818f0a40878b1999287a0115189699f38b8b7ca3e5c976e245676ac57a12cfe724554fe39972b7b009e8894f69de4592f74f29412773c559970cfb085dc83c0f0338e00cb459399ede7081dd0afe50a5e72700bad7879262ba5665a31139cc77490ff8e55456630a38d6b26e7ca54866a4c6b07ee4203605531f4c76f784c72b8991b41b224b30aee175bfa2129305a309ead21271382942fbfd8b1d634e5d3c407248fde1f10fb21c7cf5962deced4a6be6ea90f53195ae9c8bd6b8cd70288671ca0377ea9cb92e3252d1f6036c14a73c13f1e9f09dd72095c2b7f18da46406e10181964224ae348064e3ef11e5c2efbd66a708990c0b08354f834c0c0db04b498d298de98ebf74957802f385720d980107013ecbac11fd8726db17c903ab6c79128602ffb471f3e34fde759c4bf26940ec451cbd40206ff462e4d62e8d72270deddcae4f3a534f36faca5b8df0801eb689beabf1e8c7176ed95237f9184a30bcd5513e6fdfe38a7cd9d6cc71270d63370cfccca04cfacd05f5f726ac41db24f0b4a3099bb4ef02ebdab9aede08bd1fa71c7fa53d09df1f26595648d7c1f2bc79b61bee67b9fabd4b03fac23febe146447b7b1004af3d41758869d1e013d6e47c2b176ac4ba8105ab60e7dbd2fd080372352ab202b51220484297019c3af7ee732ee1ef8aa215dcde6156a2935d29d4834c953e694beaa0a67b88606e3eedaa971ee2886b43612b127b1a181dbdbf79c0e2000f501ec8f3d6c9ae4de7a308cc4a2b826c90102a7dad7be6375f581511b6d24698d1d4acc367fe309fd01f2211ed6bd1630b691a1214c420861c84d0d0150d198e0f098099539e80551dd1d654c9623f9f455eb21e82a5d1603f452d1e1279c132d851e78238b37164faee2f162ed9ba359986468815eec665b69ca62056dc1315c20f544772e9c62beb82d24691a107346c5b3c56add2edefbfc86af8e9e891f3eb089af1cf5912c5723cdce4f01156acd2ae4c0eab14385bf40a6650d99e23b11d51b8c1000f273558f2e5692fc7b2ca0d3700a99f2e9f119ba4375113cc2c6ed0e00141376acf315190e6b3b4bdf4a8ff1852d901e287ae2e1a9c1115d295429a72b1f89be47f19839e9335bf4fef81df0743641f8881fc83f2f42c0f8cc3fc549a089d18e434649d25d181808ae6a2141ccf1f0d176394bb8fd14cb0fdc71cc3439b300e87b119302395accc6568e9e771a03e6acc8054f2c259fb5616e288ca34cfa394942b05a749d5b50f56a5db720a507bb95fecff271b99c59497b443d4eef7652724ac2c731d92c783183b22feabbfba51bf53b74fb5a39d48d50ca866d9da16157296972c87c994b8b5f9837065664bc6715a19b160de2c69dd10a7f809eb1872682e64b790ec31ae7a04670d2e3550c00d3457d8641c624b1068ff063ac2b86b8c57c63d5870454165ea6d77cc51c6ec244b86fc3db8eff6dd67d33467b3c53f5c60d116b3c0b5c5271fc8e08700478d1a4f63d26539f18dab2e461e1452a48fea340695957777d811b597f40775e0b543daf73acad085e9ecee3515728144b7926f8a45f14a1ac5810fb8d98e00b024e16a60d17be6465f6beb7331c96952d5b21d817e465f81ad9290a9571e503659061fb33aa6cab045df269baf34334c20ffcb1b6c870c9626a41d449bf7e8363d218329320b4033f0079f0795d40f3205835d456493c8354b6e73e0f7ee49739424df45db73363654f1ac1319cce184ea035939e5400b27ec3e79eaf34e73260ac6b67b811f4a0504993443369995fa73f03cb14b6824f5cc89d965ef85206311f25455149bceba308b837dcbd7c3af1b8ed4fea0f78ebe51d02fbcf408fec8478cb6772b3b05b67705e5eeebf83635a1bb2b75b56ed43621839afd7fdae5d3bb6b92a1b622805769464270336ed6ac4a1c97b2746502f5f0fece1653f9631aafbf6629fcaacf116720258c720e4ff9fd41f11cde52147da87478eea3fb137fdcb6efbe92005185eac505e2c1a34946d2e91b74eaa29444581fbdca93d86013157e8277839cd82cfb78f6a63c6abdc0834afddb216efdcfcde3d8653ed75ef8e245f113fe433cc08fb5a529e6533a5efad797d758536ec40500289c2ceb4b09b392e24a191261d6ff18f3baec651ee7810704929f84e99db8dc5d9629c8ad581e22623fcd2562989f9e2d4550cf5d53e89a29907917b18ff49a25de31eda6a60134040b46423069a963010ed33285fb15fd6d178a704fde614a45cf2f0d63e631bbc8cca39a28a01f9f8140081e3e96d17ab7e303aab8d3a48ffa48af490a2855ad3c9f54c10a2318a4fd1e3d82331c777531004e08979565914aeb0b0533968c756266a2b5dc2e4705021ec9fb02c38d178a5eb04268df31530345f3ce055a67c5473f49f0916619d429d8859ea2bb71179f15c63be8df80c723a09789c055a6258571f5578cb630854f83859f3821e5497ca519d224a4e8df97cb399136e9d970fab4cfeeef584a5d22c5ad06284232d19553a6af089af2a3caaa6753a05a0d3a50117c0666b3c42e59b9a1687353879d6c56c11b6e18605dae6191e63a3371694b26f7355142b8fa485733a7012e22c3e67a263cd0fa0e93a8e55674e7d2aee4e64848351274408cbc8b7e68560bbc6be5b0491327efdf47859a7ce6dc57caf35718e017b78e5b573db47e9a7b69483a83f430c4b86cbf1c9feeed17f412e86525d2f8a809931df10b5cd511c54d40f73fd4d4347849e390d7d3807f8fd4a8fb16811c0afe4f68b88950f7309fd9cce104e6940d967683b92491c13f5a5a6a773c5c8444d2a52c994968ef7eccb30dc4856a401a362c03f6b019b91deebe423e508a22b64d1332c0bcec831405edd500d33711c34e8fe1bbadbf7451e5db4de9468c42745daf4c137b8c6329b595d37d55a414654710b407475717a0d8d2a51eedb058cc39a26f55e8ffa200e3b2c87548c6e028cd82eb746de0de2d22b08c005b6df6b21822963eb7f3c335ab86db962350cac37f66d7e76d09e5adcb213a05d8352e49056c18e8b369ae9283891b61ae7d9bc0eac2e949ea833cfb7671a2ec329cca92cf2c338183ccef5a49645cce5ca21c9f743c8937b074640d2cf81076a6cb7e88d919f890d3be1ab251381bd43f6886567b1fdf32fd2028551347f3499a030ec24d0208774a74827b20bd657670ee4bc156e104b9aa56523b8415e811409ddf5a426ef9a39e70bc5a4919b7d941c9265e652a87f9244facdea5a16430f833f25d107f85c5bb585550681ca93ee91118d190e1015690f62ea6c75e534b584fbc583804e757551a24610c95ea5f90e5d4a3957eccf9dd10e6c412690ce21767038c73a9164b104e6c441d9fd12e7ccfe98fbb70d2805e264f4f0f61ead48d20d0f55f1b0ff5ca8cea4a87376cce319cc6b875cd773b3c9a0525623ae81de8a91805cb3a7dd3893130e40476e0ad53bd886f16570442e0d795dbad471f897060ba5f022c8f72d359198b8cbbf2be3a157b1c1016fbb3a6704cd64c5457423938457f6346348b792f6963f6b598661e252554a586e00abc624a0174d1e337e64092bfe32965be53619b080b4fc89b3489794f673afcbefc33858053c7921a052bb6b512210dec070d7af76c962f3a264b24f67010fbb2b135b02f75f8831b5e491079f8c76b8bd1923814d4a3d6ac6bec0f4a8d5d1f347daf9ee3480fdf709ec19b12607fb7219fa20f3150c82bba6486b1f83e2896d3673b4bec32b37c28c27dd9d413e7092d58cf80723a0013fdbd81a48550b29baf18333fe34941f9d116da3779cc93d506c4c24019384c5fdf3574c19c37cfcbb69fd4d7df28f629bed245b255c0036591a3a7400573d7c958ee07e3f4d418e8dbbed3daf007085390afb8efad3a008c4b5772f58fe3eb9e6fdef3c67ec13325bd783ebf88a94deecebffc15185e663af52065b47a4bf2fc56b0ae4c45002c5a9a2e129307006243d88138dec16990b7abfc0d138d2b0b29f5796a1aa4f176c183cb4c185c34a1803de1779129be91cc2a0ab639569efe27aa1c002101e000bb6716bf0785d99e25702ec1b1810f608943ab5466b3c9419ef21d40d86d4b22d7dbac9924af2ed075615b48326ddc52e50b8688feea26fb4cbaf6cf30597dad3679e75eff1aec280bcfab233541c861711dd5fc2ec1799d04a4a4eecaac2b55dba90f80e1b1e0f056b3dcef28877b693094799d724936737ad030907c7845c5da9c6772cb9cd3f16793a68fdc6e9364e059b0f27aad080a68d73939652e07dd49870293a8cffeaca40b5c56b4a3611e3525835d86d61f1e386a185b4a12a5013a8b649858de16279f9d86983e9115a314d488cc8cc6a735a702a689306d95447230be4a2b7ee1673bbcb0a3b8ff2713aa33fabd60b0b8505d2b39e7f5439ad3716f4d5cf6d6f944e74f2c26c87a8499d0453609ce3e4058b89ee240eca7a82a130eb5a36c8a2400958e5c622870b565730186fae7aa3da1830c04833795bdac7a389819403318e39de161c2244986cb9e2f049fd9c88c0acdc6dd87abc9ef69bec60299fad16ad1b4d388fe526c2e4716b2cf5d400f43c7a9c2cbff7068afbd36fe67b42aba82d850ee9f27c373ccda3f938d83ac171bad05e2a9c559f143d6f2b68d75ba5f847b880bf715730361ec2746810c834beb10004654c4076679757609949ce3ac2365412eab08048842385acc6a4fe099c6da1001245e2a5734d49d878a4cf2b2c0f5bbedcdb23e05c2cb10e12cd08514f7c16f0924da2256f9c14b8e038170fef7e9f3d2eebb96c03731600ec9e28312a48232d4bdc0063f40128d5945a2b0bf4c96dd479982647c92f4d982339f4d181c45e38f5c3dcadf2baf0fc3013c7707110fdf81d5d2cae02abe33636bc28d53aefa168524363d0aab514150eeb3c9571512834b2a90437132e1986ed4c693c35142fbb4539969900240d3e2e9b1dae5adf15ae0ca0d97c9fb102f8b2e387bd030b40d6c1117c7e58c74994b9e6e403770215adbae0c80532f48bd9aa2921d50a96270181a56d024a44c8c10f39b8a4a817a7266f123bf847cd593b41d6bb087b170983338d8024fcb762b2293e31bf39746434fc4ed803ea33004c2323c5df5dafbb8b47131137411057c7336b06eced3a8039d4bc77d930721cbe056f1b0763005dce71365c8a2a42ded545d668cb880abd50b4bcaa1945d7cec373207f0567c890806d93c7dbd964d38a734273f07df43ae5de34dfcaec1a70961b558679f43728594a92404bbe974bb55e0febafdf7ffdb2d08be2c509c49b59780a1637c912de98e368da19e4770619c9cda868beed4af3a5fe58be6d009bebff3731c0b44836a1852f1a23a82835231f674ccf2235b466b86b14a8518fa048aa6b081e587c18559ae6566cf34205e88ea766201cd2269033d626302d7ba4fa2ddb47a3c803cdbeb3eae3c87dd9b1a40c1b68ee6d9177e12788d23b9043c166f16f8e80a8a14b2ed83e9a35f301931b120dbbb6fc9f9b93b1ca09fab8c5098a6835cb900bd45fd2a9820748ed9e9da0150c9cfb3ed24d389b49285fa960c7eb027ef285f1ce8dafc8e69b8b3ef78f3bb3be1946e926eddf62525f93433cf32d02e4aa6e7e2b824842b5d14c21dc4c865598b2a33293386b1970b76d01fa117bc959bd1d784835eec16afe8dd2c6b71227620aa7802529c354b0e9b00389afa8477a51f93dc68b7bbb09ab4078dfbf3ba6f1ab0faba47e4cfb9b1221eab52f5a1b933e563dc3bbd4b7ea43e8ecc3dc8d04b9fe9f87744c7cfe5ef63959a365ec23379aa5d0cab9bb41ec3c030308680324d1fa778c5f15bd3b6182c71f5011ca8684a2a1319a31664175c56724d38c8ebe1e38e205284f70f60949dc0cc2cf839d509013799c50e33f182cc3a58526128f50220295ebf9cf5d1be8a07d95d318857a1ffa572ceac4c8db29c0eb565e84242b5b329415222cdc86d7df79afdc473e7d7ff74c6591dfdfd3a70d1df493fd0ab28535d8720b55e5c5c0274565e899d245062d392ce501a64345fe12696145f433c997e705b6566f881715181de66c4b82909df2330e8edd15ab37ca56aa8c09de4b2922b2a420b88d5163e1bffa1aedb0751b7af321dd59c42dff42548eff2b81d1e2291ed44316a3988f3332393e7ec0ea90ad7c629a0ec9f660f6ac177357abfc686ede2fda649ad19a3563c666344834cce935e409b0d6e8f2b1b0f890d4ca7e0f7a964c3dd0a1a5e2b618ff5f62cf8678c6b5645d86dc8a9c9857dc49a27d3770f2a10c37eedef9190822a20a5206142220551bafa3a8a885204b74e81625cdfb52308ec2b7026291cb71e37e3d930c98a9d4c01c928c3211e0f1b765c13ba10fb74e066263f72747f2b8f47d5daebe56581ee60ac42da8c99831e7df649ac3de9137e1352a935e5c53bdcb1d7793bfaf4d400cc7c068fe29395f815b967bfb36c93d1b2f0911576fe5e9909fa3c07cf5a09511536a4a90250f4e75f6d231b2b4b1ba12a5b5b126c2331cce245d862545c422352050edfd9c35e629867836b181df3334f64e53288965b487084f208209ba9d56005890cd9cf0a8bff9610d222f6ddad8c63be6183f77d791941ff89eab7519716da5fb43b473d1495a3b6cb0ae311b4e9ef7ab04065e2d3e3228ccef6380e784d7ab71204b9bc3da46735213e9e30264385c9ecd817870201511f62d4de2c79ab5e5a6a446118f1f4691e26ed5550d785330f49cf5fabd45c51b9df11dcc5afc94453008dafd1b10130b7651b8d24c77ff803629a21a9a4a7e9311cfd8d25c6d2eab8b3b1100b64080fc240e2f30b203b4c047a5c81d5f3b78dfae0a050e6efb38a4488141a9f9d0784fd05c4f1f11b3fc68b39990719f844b8f077cb0895a0db86c4b1f9aa69d6c1dc0282a1cb1692c1d9ad9a30e0d1b90e86bd4d8bd3046cec0e7a1dbe6f58a2fb206f8d4cbc30b9ac4bef49fe02989585cb57fcf30b31aadfc1b058227863ab49c64f1a02601695890de5e1f5abb79e91c397500de8682627bc4146410464045680c400d8eb9d31bcbcc20b3d2f72e075107eea31578a9bf09716605c000afd3ab8e35eb4f1295795c5175f3ff79d8c142d06b5740d5fe54760e0dc08fbbb40a46dbe8d97256c724fdba2b113bc1a1ad39879bda320e68a9f10b43f362adac3474d9df8ed84748a89698953ffe7ad43565e1cbae87f656e26b792d95e0951467629fbfe96374e566a6c4e48e2738054e36b22f11441b8c150075b0a9ee7a7d14941fdb33f05313723c5c2e097ccf02debb3957373c408efe670fc26e944529c7946ccb85d258fdddd99609d6738be5d14c67474afc6bcc310c97108287ce45b4fc219fcd1c0f0841e9f3465f61ad66bba9c5308b8c92f8e69d30650739796f3532d4b82ce871f565685e0d927eea4a844d7324c06515e1a4bf4731e018bc21edf039fb42e4cf04368c54832ee46321a1277cfc61fe2a7f40a32476baa664d7252cb65285eeb9db032c3a802b9cb6f6544076e08e8515fdcc8002aa4e134ee74a156b780984e8829a95450334b484660c3b1554c104a00c15b362dcc70d9f88e0cef59d68c26bf53e1827d5f0cea38f94b41021ac40d4eca1c17c65a751a60436d81407bc48b14918cfec70c8401a0a4924c452b61081f203933103d000d5ecfab2a3036e060ca438a6017184fbc333398fd94ef6b984620c5138f7c9364caf18ce6682c6d79e669cb8a44d7a8123b90f8537eecf7731a18100e260bb03e6fafaed940c0346334a13c26c2607b37175a6ec3a7ef1560648cbe1febce7e14c561a3869a072cb8404ac77065ad1c20fe394e2cbb7df6aeace1eab0a6dfc24116a4b1867600f3a0ea99ff2547f6eb3a3fca638ca7c937e0e54000c45fd737a60d18bcd6df3d77e843d53c6714f93f08fd9fa4dff1aad3c03752e2187b68d409f30fb4ea90c6b7a9bc60111f3f90b4d33fc0bec7e3cdcbc4cf23bc8a7f936a83e62a4489b651302c55b7180ec0591036319dcd56be9f9053fd196736c87d701a2ece699acf0d659a7f265a3eecef2697fdb4a269b158fc57f1be45675c0bf9fbb6d2a85c8260b0efd0aa605056783b7d4e19f343c8b0d090a973f7eefd148abdd513d86a117b3e6ac43996c02492384cc837abafb83bf46147f52387cef8d7e3b220321a8448a4fd2733288566c9aa7f552296210269137074ccf992bdea6f9fdbf60471b3b568baa5d6479710d443d681c553a8c7b724d4165f2bcdf48f6fb181b3afe6377f37d031fea8d0ffe5035c40acff231843253d00a5ffcfe24bf202bf62066c00799f81c72b34855f71ad582411c01b4438aa6f9146988b83959ad7313118e5c1c123180a10301a4226e62f738edb332cbcc09504c65d511e0041ba95d06caa40ce00dd21a600dc00a61a8d602c772a63cacca5428568b7d0fe40a061f556b2b8d8c5c38e7ce2296159da74a024f5f0c60f2c366a265933884ab197babada82324d5290a1fe7306c92d67f765a71aa4ae525d431a91a053bfee1162d9ed861d4748edde1385a0a5c9ab89d77320f5cbbed448ebcff91c6c4d5e7ad805fe56236769ebad6cd8abf5dcc405981971c0d9b6f9e6cb260f15468291ffaf441e4921d9dba47c9d795b1173ba29e6e40b0943460d14c8fedceebb696ec9058fead31ff96e7040d0839d7edff368dab16fadbb4208957b0c81a9b5181297836c53f4f48d1e339f87bc405c88dda9b0a2ac17c013518c3f4e924e440290885227e2eae114024abe58407cbae8fe7131d7d59ab88b89188715a39f28458ff866ba0ace140b3f150d8df350fe1eb150217cd51d56b21b2f248d7652cb2a3e0f0215846c438d098d7ab0b2f44a842ecb22d4cb26e7e7a00daf97b3949dbd38d76bf4044b01fc1be0865098a720a608dc12bdbb91f05f25d741ed50bfca1f8e6da2b6fe4e8056aafb86663550f9f7d3f0b6e8d2e4a6bed3e8906b693ff6f859eb72e6bc0d13de132f8eaeed6b6a3300b50249c8bd15e1f561007bcb1a097091207ec778603c1ec3f7a22b876c6ff088a254d71601334e3568765b69f0fd58df6b2925210670b97844a825e520387892cf19a098af0909c358d21745a6a431ae416a51bda403b9810272f787c0fb3e656ca6c1f4d4d66c5f23824bd117a5ec18fd37f7ae38046d0ab10d88ec754308473f3022de546ea2237567712125099fbf7cb6c0880c1c977c684ce54fd95b743bd488a7cf98696225411b14bdabad32bf9740e5190fe34756a8b57f025826be1033a9ce79076733b92a6d9d4c509cd63a8c7508e0be187edf7706655361167691033a178e50fa0ce314a5baea8d2018d94843cdd5b0f367e68048f0857417ac623308b5a3a5b9126741aacfe47e5037936139c253405bfe105a9e6e2a2b327913b361107e64723be70977faff21927d754c921483ffd3043d874c53dd4cd96164cf7aba9bf674f87198d6bdcd88f503c18643651a932e8a9a30045a906e23dfebdedea731c2bf22560fdd1f7ee6e8497560a5ef3c73b8c8d939ace1b3bdf0a2b32b9e2bd5c11072c230690d78a7c9d676d424fca12685704fa20f279410db55e0801658dc6717dcf13da36f021dcb73e1cc6093bc46c78d0404f90e94260b3386b966d77237136fed39447055a4c499dac9f1cc2f5229b72fdb66855203292d3da20331e2216adec7eed87f0372f93f00317a957bf6929f59a7f4b79c46d64424eced93450b89fb160328d467625c2b83bea3e908a4dd30cbe14bbf425a6a0b795ce807a1bbd5a40c08091bfb26221b5c54b244987215babd56206ff679cd97312a58939d58ec6d014c7f6e41c8624f788a5488c940c272a289c357b61ed9e2a8422ce74970257da8cf7d766d63157dd6b7203e8949de9947a21403d2e3a5ae3e18c4c34cdcec019befa4dd4a172c19d6f6672c4541ef8d019155c84ca7658f94f36118fa71907c7ab2dbcdb3c09a0938f95a8d9b661745e0e1f51e0f798a9c1585b29c1086205eaf3206785c7b8800cbf0228747c032ce0a7ad8365f9f4198db7ba45f92eee952c12ab53e820e9906b8231072012612df4a3ece7eed39b16547707177d48ea0e595fac7d3715c153f10071512dc75680ac07a47f0f5fd9c8510d00c4274cb7e38b60c1ebadc10b202ce270026874be2aaff3280964359331839eeb8d12a3838242ac5abce724ce1bc76087ef2d0de4333f09ce8466a45dc67c9fa56cbd6630db5030ae5b3efddd08c9f1a414ef8a4dd389d5bd8bf225c089476a383ef5f0ccd4045960dcd98d1a972f85e0c7952f52d09fba83c332251eadf2df5012f6ef7dd35c1c014b1a0dbe138900a5ffe65b41e6389aa6896d8c373f50f4527859adb76660d147b04d8bbdd48fc07053c3ad0106808f0571e216c58b02de7890c224b4776dc9443004fc6b8db7fd4ac40044860f4591217c0d1e32d18ad529e80e60ba4e2ab6fe6e21b94a70b55eacb970c6fab453e61ccd5641b3dc172e7be284c697eab2df18628491a930894900fcb9b10e6ea395a5b953f9cc03d873d9f3e8fc422892a7f0e186e37c073771979eaf59c94a1fc02df6002bd1366dccdef47c7703fbf0709263f57a3071125d63e7546e872a64aca4b0ffaa20449d8ec3337bdabd9150b1be0c1da9f59ba6aac66a6e0c26491b8e21587d10cacdc82a4e0b3d67f70b7bea2d659e2d84b8c1eb5e1e3bd53b1f453c110246ad428bc2347a5f3f2b040d44eea776384c701604ccf171029b1e0d00ff1ffaa7af5b5480ff284e9c834e0f9c18db21eb4f3232d2b8abb52ab049d28562248f652d7d3317c74cca34c1d3f76bada224828b7e967a0246cfcaa4cd6dcb070788b5d436a31606337e2bfb767aa6693505b5b431f6cf8a8debcd02f6c2b517fa6f7fbd09bd7dc2d8f0f1e2a648d5d2874c7f1562d913d4248fff7ac452822ce1678a2a348ca4ac2f463462cc6a1294f2b4f49f71e3c78721fcdc12d1ba4ea036d4b71668d7039c7ba00fa297434aa0731e6d9cb98f86d85fe355edc833730b5f5e6f27fd4f75c29bac4840ec173d8ff434e3d0d6820f67d00861ae129a707991fb0e6034e813e9d67806685a0dca0fc11a94838287a7830fea05a772aba9e71c036bf1a6d662c7858db834c616fa6219a54bc4b1629d93d100798259ed197ed6569e7fdd6f5c7e734576b8c7c2a2062e01632e7e0ca8668511d1aed973a8bb0603d8f983d39b50d93981c835b9033802bc53945f784e7e511d3e6860371e99e319eec25339bb5b9de9f29be556d4541dacd3e0c873361fd4415804acb405e8c40631494d05351b67822b3fd46a2ba08278763900c2dd8ebbb236e153299f7482e12176144b5427cb9f452c1c107b2b95081c25a12a80520aac2563815e92e1fb8e0dc3eebd9c59b3f9924b922a46b24fc5f1afe422826287d80174f4dd90098d4462e2443fed50c2e0f60bee41fba1293087937a681e423ffd002a2c27608fe422898f83839e32f444c30a12b3c2cf614c24c192b37e35660c22ef0f9b5fb8cf4d0d78765c04b0b04df16cc4d7284eed03aa402083f60df1fad198da56aa794224045f3dc773fac02c80a0c625e01029166340fa0f79c3514ed3dc8e3e582e344590704620a455fdf9ee276ada5938c215e8a81a00f7e6de9da612d7b8a1359f78cdc30be3ccac132d4cc9c6001b2ab008b2a6e8928dda5fd59f076ed88518a5998fc782eb0cef64c96d9d902524d93ef47bde7cd02a34d21e8c4848a57997cb1e01a5c4473896b0a61eed1945cfa8192799d9bd822543cf6903025b8422b32a5c8df30be8ddf5e69a8145394844cd88c7e6008b0f8db5053f4e0c3ecce503157114da2d70fd71df36865f32698589e75fd5717b32927673a20d81d1d80864c07cdbe81536d05521516030c2201eeedc33d068068f678882e06e5f7c3e03c1b64b3a426791894ab3dc18295be50cfd9aa3de2940a8f39d9e90c2dc716f8ff7e0001c2992de0fba2467853f1384103523b01d0c468a29e13006151828a067fec32987b9cff1830f6c0b57ded330fbb7b9438432682e5d862d8414820f4a462e72159fb1caf3041b0c04b64c23db9bf3f6eee007ca1bf54050645432f79ee1826c5ca80f360721fce30db909c0b3ed6f681e84b7fe844298f484cce4ae91c39c5fe857af0bf8bd7815f81223c540e41299c2620fff56621a495dc6f2ffc2e3709b1de843542672c40c2da3bf53e2fbdc1e35b794b228880eab61aa1ba0627c907250859d0dd52b8d1b6523680e303a603f77299459ccc40dbbb7d628e0748c659c41910b33293300a603e42165d6c3ddbff7810e377e6154a8b4498f6d4df434a7f0a31b243036759d655b84ebc5cbbff62afdad1d353283fd21ddc6c1b7e6e7a8dc9ea75fa3d0c03b1d45942f6aac8a511e41615f2f3f41719c7375e0662d4e86a54cb371fca58c2cb851bec16fcf27e862b13b2821ba87b5272b3be947b8369a1cd312b617698c75fd452af653f55f05d789da600f69ec5ffb2f1ccb4d1e5482ef2f7b569c9537b2e7782b1b13b267b099b457cd856bd2b47335eb3a379214f5fc881d213e53d6e93b0f169c15514553319859bec3b5b2cfb0805689a0de3e58824ebed64ad54aa5d546dedbd343a487cf8b891b8338f2cac0c9f4551c16721ebdd5aeb950829537a237640dc1899229b9b564044aa8713e054d8edd9775deaa72b2a96c68f08b7822b48b79a0b2068440e8f92a14373052fa3d3614a20dc283918404a9204f88a20641002240156c300449040e370299497b80c834601838479549c35fe1c078e4503c1c673b91adc5514123a9d3e4bd186e6e8336030a9400af22682325022ec00363ad52030147a6299d16228724a2a178c2f91118014cc30440e7f848d8e8ac6c42978be1c5e491ae22f8190204bb0323015700e839086c24be0b0a95990316d08260a1de3f1782562963c901781cfe0a0a248e16e0c26962c1d4fe9f10884207092acc682246390f3641912307e1cab240082834003a021184296a0ac20676013c1c5c02258149e89a3065773a779f29c10790724004749991474e03a500504ca89c0c9e962a0394e808c0702820cc182a070be493c3205956e1927097bc04b04e1802283341ea6fd002d62b41dae99400980794878cc418808a6453620700018000400a4a4240a02424207434f5985f43a5c741821046e3e942dc0c393f4c068f202558530a3c9a074ea085404661927097b1099c19f8ad7bb763713bb3dd8db8fe151f420b6983995dca46b6dd6df6eee2236edafcf2f70d33e0d8d31cbd4cf68a55d2fb79d4beefdf8fedc3dc6d3f3c04df3e5f5fabf3d0ed3e7ec0ae8247a87d60bff6eb77a3fbe7f8699afd2c863d83fceb592dfb4aecde8d773cc1c3e5680ab205e08d5b4b83df48578a6064b8b179735a48e82ff5b2f61ffb6bc553a06f46da65c70b10f12677388badd2d7fc487ee0f5bf3110582734d71346c1105200326009eb86b650ff0b274b32d42b95280f802ae02299b2fcedbd642513c7f60e9d3889c43fe9f5f8419a0d53444e000ce9096fc6403c90463144393a17398c203f7dc597ac30262076b918992e61b205361e9b67f1b29c8ffb627e6b7a1a18b26f6afe2babd5001c2d547d9b48994a130132c159c2657c46a0412a69c981e8ccf2947ceb557b650bdef86d06f4209282ef3517bc91666f0e971ceceda4b36d26d7d4ebf08f1b188d83cdf68b84d78832a233d8a8610d3bf8b1bda092696fde424d801cb6f75995340d59a941b9c608f2e3bdc4c82856a7695369218878b9c06242d6aa44e4cacae71566e031a901f4420744e492d5f354d4ce2bb58b2dacf2bde5b3f4d4fe9ea55e4d0509690820655406dbedd2fedb26a616ae1542abc5f2ca08e769db510ac49be3c19676f17f8263afc5728b2eae06bab7651b2ad3ca638aca7c3c007595e9d945b7e040551bddb45bca1776dd5f4d7e6b27ee5ac694ed9ddc5f8ec20aabb6ee5aebb635f227f53d373464f079bca5125fdead9470ac367dad614befd588c136b9b204dd521a8999e37e9bbdaba1abe423b9696925cced39a3d6497ff18b786c166bd0f6f14d8ebf0f2c04e91577a84fd26fd0a4ebe698b0c7a589428a3969834c5856d5ff6f2341959c97e0a411581a3f58f6dcf14a7003391a6804efa4c1788c52071487f8c1be4863b04e638534b7658b41e465973ef7d216a475f82ff6317c630c75a10acda9696bc66765169789215556579af079873915ad2a8e06d2546a5a869a844f57828a02afdd9cc3f1cfe56b6f867a6854326b909d01a84ea34999351a7ed7156f47a44942e5bbbf6610c926ab01a8bdb9fdb500b31f038c7b92cf42e4ed78656a0c6192483fe910c5c3b2dabeacfde1195304521f72927123209dcf407706a2984fd725489824297ddf30083087269e2835df97f39311cfc96d11304f1e06bbb99805a0fd726d40b41af6d9049cf609541afe7ad59f6979bdc2270f2f4fa35cb8ae448e9bdd8322cde41f064c33edbebb4ab554acab7ce1e8800257446ab210b823f814cf2bbf3de84a681c5bc18aa5e9adb7ced6b3476220158b18d9f6840f7bb155fed4288c80071f8fbd685884c866c4a9d2b70b505cb6810140af89011bcc64e625450985387720310aa2bef0019e08e1a23bd78fcacf73e4ec7fd88995255f4b77f6f74a5c24ad1a15f4585a5200e99aedc9ca6cea6f32d4cbd6e09ffa1c9f32de611ae3198f4759142631fd4ed005e7f0e27ab5fb8c4ab9fbb31964d8878a6d69b22e11256965ebae9f088d86cad73f2dc9fc035c348ed7ccee2154a6dcd4fa4bcea7dbde0400a72f4478e04b8e84d9f0bdaff7620fd4bcf059f7f2c96612ce8debfdd2d570c839697cf048bde2b52c81e6595fb2eed4ad02ecd1d351b42fb34f01c6d136cd8f67b281e5a9fb2052b934fa44051669439109a107f52a68a6f65dd966569a62ff193f0ffebd067d9ec7cf489f49102f3a3d76be7fbb15fead2ebf5df65188e7872bf8c08108490a2edb67d8a623ed62aa7667f0ea7d04eceef7652c4c015c4cc9f7b4c949af32bb5a7231ebaf7a106966ada4fe31d1e65ed4c4f66d6533f0b2915f467bc1ad4702d727b602544db84c97e84c7a655c1eb28d1f0a85d42398d35dc764fb494501d17ff03d5a432418ff344ab3cd337ab9fe8b42b1fae5e103de979a2dbc0eac7a2e95d0e22adf2a0bfb592077a43a817825e10520fc4057a3d87cef5bcdaf3e99bc52b3c8cbe457195077a9b151ed6eb433d105d8fc260c4641e7647957a70eb6069886fa3f7acf43a9826f729419a72f7b3b867baceae8428ab5e8fa6773dadf4a4f4cdc24a8fa66f2aacf4446f032b202ed2eb91746e5a567b365db3689507bde32b39cd47957e36c48aeb50f7054acecc412745259e6e1d251f6e0e97f2a0c21e4f773459fac1273d3cdc6896e2a1f482d82aefe1d1dd290de29eb5b246795496029ab8d15a6050ce5d4d1bc92b0c1007b77b5306626cbf2e13a3c96f1fd5fa90c1e6c186b217d81f0b336fd0bc9ee601fd4bf5c7dc9ded9638eb27255a8e7e0530bc1a488f7db9ecf6ba7efc018ae8606fa16c8e2144edf821f5fbf8649ba42412d9dd9b5b06d605cc0570055a7af0124e9391030e220e0a07c4edc0f1e08cfcd0419e5395c8e066704d3890f7e08ad420837314b9cb57111c3ac873e86bc816d6a551c3bed04383b5d65a2b330307723f702f22473c3feaedf245a4cacd01941ada941a99151c5948062f60a12666dc18b68746bde10c996b7d0d8981f53234702e8e3bb974f91a4283212de820c7750c9da9a63a28a4907be52a24a51b97a75e3d1e32be3d1e589d3c80e6daee195d0b1f9bffb653fbaeb5d6292b2ed9af6659b6b9c82e7d7b3c645c7bd9b35cdfbc9ab7e6c9162e34d72fe5fc5ad23d7ba7c7b1e9d5c576afdc6ae9e35a6c4f77ea957ade92eaafa5ab7b963ddee7eed5f340eef6abd884b90a15a6d31797de222d5fca5c2449111fb222588a5ce945aa74301bed5c440ba594d64a5f4332eebd17e3211e38b22ccb348d0e2519ea511a4aeae01e1a878c4c2e232fbc8cf0ac983132c573fa2a42c4506ca88a11197af7a91c93c9c47146707051a2659078f28ac143a17a4a3559b12f32b8424de018437ac21868cc69c91071886b0850e74e31af2136e4d701539aa6e9fd1a6234c48a9665ac8d689923e68b1193489697944a2236e85dbe888cb9872ef92992a377456ac02ed0322b98f335648bd534ee0bbd7b11a1a1d66a2dedf12202245f44885e4492bc881cbde541cba82047a6a807191d3f7490e34e7c7490734a7e7490e34400e920e77208e920c74d30440607eebb7c0915790919e1e11c45d6e54b484907798e0caf1f555e4060e9b0c4aef45cee0229a2df0e08211d42332eece85548242c495abae40f7b1da0dce3859210bd5197fc5b49afa284a9a5cbe789bd8df7791e5d6644af6286a15178145a0991a638451e1368f610ea3249971c03cf33162e49cb0c4b789dcbadf0a3ce68001c85cd7f8be23c97fc61763e0f0dab1d122212878430ce4244fd79266a43566eaef7de7b6f34a93f2fd1d144aff4e71cd2a75ed33e402db0fef8709c8b0f507ffed282f9a93e19588b8864a870601d614e311586aa4595c8cefcb9da6a2dfd69754c8c468196a73f975975fbc19aa5267dea5132329b7aa5feb0aff2b19fdd0bf5e7332e9a4db79d1ad49fd700491b6b63437fdae4528d08999c31f539e79c33b359c6b7d25a53b3bf358e23d7c7f1ea714c1ac7711cedcd274ee49c73ce62e6a876b33c8e49e3388ea3281289a2288a39d3db4bcfb22ccb322b19a97f88b531691c476d1c335124124551b47b33b9c078d483e9a3a8699aa6692564aedb79d33169dc231dc7512412b7484551d43c1d8b21c562b158cce5e584ea683ef860e758e90f3b759bd4df6ac9f2388ee3281289a228de300cc3580c29168bc5622e9790cbe572b964b60c15aea3b1b9e1dfc340d83939393939b655c22863611886a1188aa2288a351c7fce71ce71ce717e28d439feb75229cebb8ee32a8c7bca31ad2ecdc5b638db32d956c9b636abc5b2a4711c479bd150ac44a62a96aab855915651cb2fd6f0757c6a58c31ad6b086fd39c573bc485b8cc6b45816cb77bb66cbf53a5a48e3e0ce5c2ed7d6f56761205d519e57618f1ee7b9f6817b9f6c6c50a01840072d0ca4ab9dadf370e05d75d88dbdf8262b6d1796011bfaa7c4e1870e1a03c6580613338608c9010ed68401c6c760f9d0337594c0889048faa16514c48579635c2004820524204be410c502c91124e40a8e1aea0a51786890c47aede0c425a4e5c20cf9de7b2fc61863cc73341fbf83fed04163c871438324397cb45ce0821a4008514bc052800c19312021d6a0890f3e6654930d2ccc703febd121c80e262d5801e2c90c6c0f213e6eec3861460d361425f1c30537ec0f526ecc00430c164c0e6ac041941facd80e7cf891a5a7079f1d1f54a3861a170b8d19661096196262fcdc7befbdf7628c31c679462541081a3330d2821e7ec4c003126b862936f0b8e10711375cf9b143901c3e3b300c2c1e18631c43e27befbd77870b345ad06af1ec6802648b8c1d33084fbf3172d0c14585c6c7c48c1f0be442101d6efcc000e363e4a036088192a386cfa1860d63f4c8a10926433560101e81c38f257090247248e1b9ac1d3787cc8c9f1c6a5c8b79ce5522068f0f2f21af242f2aaf1714ad8a7e8a74280a52e4a3831c9f49811d4203312580984115a21a4133d0afd6d23abb2552493475f5796fad1feb8ffe913ae534d62be5f5a8d70f12723d10c618638c31c618535dedbd386735cbe8cfecdebca96a9669daae99f6a3aa7b2b6da26adad5e3b85d5d4c9a73d9542f94c3c0ec7a7ad9d5d327a09350a73cc6d5eb0375cab5cca6ea767da0999f99a974ce64497a9e5f25258d45444730222271fe4ca0d6f4993e611d2b12d25db17369f5eca69ad2c399a6696d6f4d6fa592a9b4396d9b5c5e5e605ef649838941a164ba196d6686fe9c99d9323334343534dbe68476e204fd79e2c4aed9764edcdc7870b3b9a7791efde965142080104208bb7a0048d5548afe4cd56ff36da77a1f6c2a5e3d14fa830dc2a69a7d86a0430881fe0ca13e08b954d3817ef9c3249f265057017c68f93d7c9056a80f2329295112273be8a1c3f2e3ca8ccc897ea8a717d18c5e82410739ee6304b507a02a32525e442cece00271d2c4cb490e3ac873aafcfc3939a09f73e0fb647f31678b29429c88781598cb57d533373890e32805abb5f4de6e94b47edd010627431de47470a2c4c9918eeaf2e584099528c0170b83e221284be763c0903abffa14e5419db228ce4ab2807d37ddeab0a18dc53ea65f6e75846f633616633d953a368b2175700d99a2af8371ce1c879f859f45c37a1d6b6905d227e5e993c290a99933a6986e3fb12ddcb11a9b4f67bdce9643e290aad81a0e351c6a38d470186a3d38171793c9643299c2eaca364655b8203d0ee556321287a54beab19429143b75897d8a72191470a029ec94d30c5112250bcce9e420656d39905e85fc2d942c68e5e0e6d3a9169ed461f907350d7fd77b185dc9147f045218bda3c1ddfc9cf425e45ad0b0d3b75a302fa2e8c2c54c1d8b9b1c568fa6b59beef9f3b9edff1d0e0ecc52d3396dd627971945cffb74aa99cbf5ee4c55642a25f73a35b3397d1ced38c7f54da9b641e0ab3aef8a55c844dcf4c19dc0c90d31703de02e5f4e8030f15162d4951061831223945c519274b48485244b6e0cb1a4c792224b8a96883c3e34478172d965ccbf6b93f4b42cbbdc19edd5fedeeedbe3f1a1b99ed6c76b9f5c002bb7c8b8d65d534a299d92e2d20973cbc5fbbdac6f2ffbdecbfd7a53a6b8dee454bb52ceefe2ae792b3ef538b4eb4c67326b2570857efbf656501cda4be00aef55aeb74ad31c0fff092bacfafdaacca56c76fbe94e5fd87a7768f9495e4a7abc94f4f81d4b8ae8fe9fd2253c6064ecfdb3654025cd87e916e14a4a5cb494971315983d61ba7c3139316922a60725838b8b8bcbcbcb926eff30532a42c33d999dc882137b7aa212359b868686a6a64664c203940fdfd3eb5e987c414cf966be6f734183e089e9f215440c45103700c1c44208590e00d0ec48b908e1cc3c0940678400f6f45e4d703000104acf01d11d8c2545e840b1040b8d0f7c586203193abc1f1b1ca8c7031f2ddc14997142c90d1b29356aa8f8d03089818e991793263a2bf6dc90116508adb5760857bb7c893cfc60e35404e649f842c40d1716d8e044255a30894cf4947c62d87c80613379414fc1a1051183210be2062e646b9bb0d0adb5d65a6b6d6d92a3a7c98e1dd65a6b9b08e5a84d9ecc409b18f1f34d70e0c2741283f5721276dbe5cb498d8ac2cad04b090f253e5dbe94f0ec2c576eac6b548252c8a1c98c1c84e42048842071a12621725138dde28143c20d7148b4f02459a920230991ace69cff487a20691d6121498231ce19c91112279aa6698d040b12a40d8996ec08fd5c76b9cd2f7f8ab3d6ee40075b7a0a94cf3eb707c45410fadc543458a678ded580c3fdf9e4265057a778733c5abeee9ae026dfdd969955a7054602ee1aa9022640247a14fbb9031a20b904f0d34f076d6c50b03a680019badbc109be6464cef97fe4071bd51ab44a1e1971c0d97a6f09268871430538ac6000a48565d2ad901c38643d8204571f86239c11229cedf275e475c488c68f7ae40437e45c5bb90d1a3184b01023079a86e536880dfaa5712f10478274adcbd7912023b3da3a6582e09e705c91dc22c0d3789602d72fc75cd72b6f917927ace0c5985b5a58aeefbdd87a95724b67e81a07c84eb94a76fabda8212173cc2790bf14c5a1385225a7aa6a5d63f9a7d25da5fbcf295afe9c93561b380650141e4984a21c4531d2344deb284851b4644ae86e89102ead43142c322629953d3a58bb2d5a1a71fda524f5dde54b4a953e3937a594a2c5c886a45c6e31724a41921224e5470a0c4631782f231a7af7a916747744081dc42de5cc9c516c2431e7fc17224988a7465c7bafcdc00d49d02043060e347a58227ca80c352e77efbd97c64b8817a4d430c2763e28a594d2f9fcff7f1a517f059d8f6dd57fc5e2f109572c1e39246489ac685d76c80a59d76b1dfef800b5c21f9fb088e88a779cd6da6baf27e9a612054874c9696cee90a34b4ec3798320bae42f3ed15c42b2b854c708bae4b3459398d2251f41b2d0fcebc576b4f64a47fa948dd96d27fcf1b940b715fef884b2ea3bb68280845cad20a016de7befbdf7deb07dc54c945dd82dba449f7a7153611ebcbae3cd7293eea87fb78280845cad20a0d6d65a5badf9ec1ac364cfb9a501695710d0a7b2bdf7de7befade5e4b34f0ce372abb5eaaa350cdb18a93fdf70ac848f3e8567105016caae5610506b6b9e95ac7aeb3c6e3cfd796965ca5972521e55a89e712db3ecb38c6659cd8a32a24f7db67747939878cbd08b4f19a83f8f697dea51a82850fbd17ce4a79db490e23c9f5a4c8b69312da6c5b49816d3422da4de8ccdc48ce3ba8e732dd442aed3c219cb34ead13c5177c7711ce76733311333311333311361631ef338bac6a1110683c160d39bd4ab99331de716cf631ea90acc715d97c7549fd766ab5b9c66bc33aacd166ea56cc6a942f58c31c618d38a732bb7b4dccab955732bb7b48bb9dce1a95d7b478a43b9fc811cfe66e66026e63967ae180683c16023f54ef424b0373d295518d339a776614c2b866118868d1aae1cd46eaef56e6ca956ebe560d6365f5bb586afbd614cc76ced922888eda085f30699f844a38edca249fcccd69aecda9337deec7953a13aada58dee79b50ddbb0d2866d1bb637eca31bd69f835aa6b44437baf3474d5a5831c6bcb46dfc510e66627f4eefe59f766d9abf2d8fd8de4deda75d43687a3fcdb3befa03e9c6b0fed9b76558c0817aaf24a5f9c1ee7eda95c22d4a718be216c52d8a5b1ff830dc1aa98a6f058dae716814c7a27166c92b2e14c5fefc8654c51467d10d27ec86b3ca0d6337bc62639307c55cb1a1d8e457f2c8c92c9d6bb2562bb2c81575ab2a7da250a8be0ac1aa045c4845a84a0d29b8610508478383714548afa2258aae9c98365f4369ea0cf85cbf2761ad39be188234562302aa5717585d3fbf047ee0e6da4a4b20083cd05a966b090c01b7255005af9341c59c606e0914c1c73db839615343834be00a1f7c1ac5e4b316d915a7924a2a471a1b67f5643a7d2ea595577e3ba84a91e893d3984cf1de896ed3dfabe978a67b5da7b194ebff3ec3c183b12677bbf16939df9eff1681be2d8c7ed32d87e19229b4150cd54dabef8238f004d36092c5c629d79b6777509b07d3330ed28c342d9922a6d577e0409ab1d53d68d18c9d72974c314f2b1a54df9eecdaa4d1d08ce004d356600582f2600c4fd06913a35f43290dad33d4767d660b57a94c971f962ec902e58269f95a72fd75ceb9018981a39c150c70c00814303ab2525d276ee73ae7fca752735630c0012310191dc54edcceb5d60d546b31a0812229aec8313101390636508206aae47dea409b0118801b751a9eb89db329dd29052fda74270dd659196d3a3d848d117d725e828df44c25e05e454431ad71f4de26977b73513f14a922a28e0287a78a9228e1756411d2f8a24377409feba9025c05e6131e3a669efca071ea5a4f883c29d2f144054f8e782283274c40e9812203941ca0f88042048a111424a0d8e0c5c24b8617502970264929a59452cea74f6db5376f9c33ade9bdb79d52692b99765c5e5c5e5ee8cf17d4a68291e93655cc9e41ed480f6653cdcec16c3ba71d53b544c5a050f4272a77945b3b6909e440a7dfc3bcc96bb5545b0fa49f562bb5946e3b32fd61d845d6328c31d630ae18638cb38ceb5bd004ea8a40a5a10e15d4d85fa69e4b6e5946bae4758845e63663c2c2d08afea663af34165115a52c14e7b989551a4b2385190113fd732f8d14e7615ae3d89fa3881e25bece45617914d2a3ac3ceaa8ff519f1c4419c168195fc726bd4ecdf23af4dacb3dca9229a666f438ff69459f2afad41b7dea2d4ca6f8d2685abd0e6879697c1d9b94a5a445a6df9a51a3a597094ab4443a2853d0435087757a375d0ba98a9228719ee7cc5d9e395812efe56049bc2f4b04d1bf24be8c306249eccf513ea8f075288c0823c28830228c0823f6e73030443045af732965a1c41e5d3905c1e472525a2aba98721eb849e9ef94a298605da6d6e3d0966b53957b02b3b4e24dcff1cc65e02fbbd84df5d29de04ee1c07a82713122373f93592b3daf51bde8b588d6a6ff40ebea74dbb97da883b473c25dfeb2d3b4c0f16dd2ff8d52bad55aeb66adb576bbf7de7bb74e0aa7719c85b12cd2707c11b746d86c49582785bbfcf5c633aeda36cf7dd788d0331136cfb86abba44c91d56cbef19a8cbfe8dbd781fdeddc681f98c5faf3ecdbb9e9f9fb40cb65afcf55e43db3269a1e71d3d46a551775535917370cbba3eea83b0241938b1dbb9229527059bf9d9bfe1ffe31e7dbcff6481d0e5a1b7d72dbfae69c1304b0beb98be2bcf8a9b74e64ca164999ba77034db0ae5e6b0784ab9a1713eab9adf83a9c5b273d32957a3e81981e89f3dc5484c4b9dce57297cdc5083c32322e2326a438763ead528633e065b8d4bc1aca3bfea245e6d5d0af460219d7380919d738a51f091aef3e1566b8c655e878c65fb4b045fdf98c17d3797373d145e1eced94cb7c27cc2d31acc963263fc178939bb8a98a6451f973538caad078894ba9f3814c3d7fe152ea700e4cc1fad3cfc6fcf4e731270fe603637a6877f9405311fd39e781a62bfdb909d460a631a605025837c1baac8bda96c4c1983fff00731bd431d71f983107533694389867f607e3ee051ce5f8939fa2944b19e3da56f817b8ea579d53565a6b9e432f21e6935bd6d65f93a9e793bbf4b7415d72db92d686b4a1ed910898fc432105ced6e8929b42aaa2f4d958b8b9e656d3b490e656ce5cb6d01acfb25e3fcacac29f3e0900d29e5ea34f6e73b8c4269f934fc9a7fca8fe7dd3adc4799eb316d65a739444538814d3929484050b1212680a4d3ea61ffc3d6cd29770857f716b66a2250ad0d4624916b8b390693f3604b35e250bca2ba78995a2d49f52914c5179c703f7a0f6d36bd8aba97584fe9ca773d25a6b2af59b6a4a15ddd19d7ef65bfd9c1c5aaa5c65bfef4cc0817bf6175d6e2ebe6f2acbed2682055ff4ffea57650aa93afdab5eec96b3dd542e22cc6f7e53a6b89b8aab51c9fe5fce5ec3176f2a53de48c8be151467f2fcadc8b62abf6c760b645fce94f34bbfa92a8f40ed804acf2dfdf997658a2953944caa2fdb54bb3fbe5a965ac9f2b7dfb7a56b1368593327b94a76a96d097cc137114e9813902d78646c7ccfad46021bdf9c846df2fdd3252741875d72d5ed95abf476c2dca292f329a5b9d65abbf5acb5b667aeefb6debdf75e8c31c618e39eababba62b171fc3aa26c7b404cc75c6bb904beb817f3fc5d6e4d19dd44c83ebb92a60eecdc74cc776ebafd6eeea4d7dbb9bfa5d7cfb26e5fa1bec8afb5fc07a4ff7ff56efa0854855d499ce7394bbb82f149c3e2384041ca414bbfec41e692295e5bf57fba5ad198150ecd3dd5029b54a8a4ee1606295433030000053317400020140c0a44b2280a922c0c6bfa14000b5a74446056369b09a4b16028c851104651186388310401600830c628a5941a1412c55f2a2938bd2c0095e157cd9d99f5f8cd26d01042117c474ec01be3cf525c0e59a0e698331a918f0fd059d597cf9544210906f2283db0afba2d1b94b2eb21b9649e9167b0edbc79692948479eafc81dde91970fc74b2b3ce0942d4349450f1b85345e6dc733ac8b5b6599f5c41d2462cd57c3599165e603f28aa74dcb55aee180e5036dc1c96114fbbcc9b84f546e5394986ec19ed51ca0cbd86b0e358b886dbb27eb30e6acce3ad4d4ae51a0f9fd0724fcca7801ae26c72f9cefa8920f2e4cd2ee73963dabcd75cf56cea1ab5f8198e66dc68971502ddad42bb46076a19fc942bb1a1f12c4a7122bc266f9d3430b635a69d1715f73f76632baa08e4e0d4d93dbb87d9f0993209694d6be560336f49297d73d93e6d5b49cd73056e96426b92dacc913e02dc841ec465894f7c22ca58ecf5797bf67503793e140a9edb126c79eff7e6f92ee0e7173b4e044ae308c3aad8e5934e3ac695734dadd1ce58b449619b9f8ae130027a49d98e03434142a28439797425bb5c4d6c4e36abd8ce32c40958b4cc67bcb2452b967de46242c173ae5ef9eb43c398662c18c0c9ea1525fec9674c18e0e83ef934584cd405ca3c4fca53821a112ceeebf05a03c0c94d6909fd7a12bd31b68e23203010ff66092a00a512aeb50e786607d024fc2c2b47dafc75782b41d7ada9caff8c95e7321c5ce5bebb496ded157049645bf084e507e38da46854f46330e99a48a01d2694ff4d88803f79f2ed3b6b10d4e3321dbf0aa34d94677335ab61df358675da1db0580378f98579bceb9ec88af5136147e3e1b955360af6c16ebe50ff0004bb09b12ac3a1eeb3e0a944973d46fa83c4740eb1bd00d8a96182ee2a641c1b81096db6b64b8092790dfd27b8ed33254160b516ac5796c102dcc574d84fcc969d8777ca658fa80178e2a7a2b750c51ee32c8cd6887f9a853aea317dbb913b703973c7d2986a89255c863caee202252131cda3a051b6d56e3e87c44ecf9101f6aebb3df22cd0ba6a5703ece480b1a96994bf7a569cda316bafb4ebcb686ebc0de3a70460240eceeb2923559cd16c9149ad67ae71947da030ba569f3a753dad02bac6cfc71953c1e217a0ba484c1ac27324150944979717bce024283fa6869f2ae9aca3810080e6d5ebb92577e0e30f280a1504ee2cf088e1fb155dbcafe9f11dc886a65076def03e9652d96485abee2192e3422b613ee9a08b406044609e4b03b28f430a9c7911f4c5f3e562b32bba177c5f57ceefd29f81d7803b61ea45392ad449007e601434a8b9492c312a0ef1e86403826d2bf314e84722638441ee13c02419191aa680f59ddcd59283d114e7be3e13412f4d46d83f0ab7808e5f4233c435f29f079f6a18e789badbd78491d9daa467a6d02548072e84652b47a0c371c405fbe0968391f3cf6cdf8eb95bc9a1d88ec854a85310a9a3d7b3f6828aa1466b615232e17f0ed046a172e7a23c1343241b1cc8714757db32f40d7639743cf90645571e02ddc511f8e99e0de5d783f68c50d310be65f1b80a10390f497609b0001813f0745903cc495d986add70e2d14ec93de344e2c94e25716435cf2587635b10d79d6bb7a58ebda630950136b08f9832b8feb5dc4231408e0c45a15ba24cb10d7e3d0be23eb0bdc89352ef25b526da6f4aeb61b64e23b41765e7ffe9238e9a63f2548027fb637367c9b451ccfa6277548fb6a5ce4ea6d4ced3db9aa533a003b08ac94cf2824d537289abb0a61154d9e2c6cf59f95fc8326b7bce034185529571cbfd4066a0c680f064c190563eb40f4260596f950cd56eb4ea1c1080ee90c16aff003cb38ae2877284024e038cfa40d3212500315d64aeadf0e33691f33148125686e7a2ec2998a14f197b5b46b0f84ba11040ce5346882eced42fb855aa8ebc520d108ea494e81a5623773413aa62e5ebe8c1309e1572d74cb4a690100af8f7d10f8649860ed28b32abf5fc50d2f2c3fe34de88fa3326e7ad6a6df9a021053f2ac93d3a65278f15b33c4818596a44581c005705ab713252a6c37de8959f958e2a56709dab8b6c3a99fcb97202ae397206673b794099ed028beeda64991f564a20b722ae95f4c84a59b168c8fbe03a4e019541855db14745e52e80a8ff199ad1f41d1a0fc36b0aea5868a7c32fa092411cee327b4869b1c97cd7615d8a194ba2ec533ebc81c3febf7a6a35b0d37fd6697a8a561d5534f8750fbde487f048f0b9bc0410981976df50f190d3a46ab3e7b56edca0b6b7c7b0cf349ac1758e23baa9eff2b0622db63db91b9fabb974853d417ae2b09d1c3e10f06c6e7840649287c708bb23048c3d6f80a6621b1f4e62d1ab4bb0644e3916210ebbd87ccdeca74800dcb798fa584687f178387e0ffc14041cd15b7e7dd6dbe7558aedd104ae0d7d0451cc83a76cd71ad50bbab2395ef3fde28247c3498208a6e0254936acb3a9491ee02ffe9438c8f89f8c990ca0dcc97ea61c4e5988de02ca8bf1c9a0e59d7859566470ba4d13bbc28a246f20a4a654aa63e745a99dba1713fcdeb624ba63c7ea81129f5ffa0cba2658d7017ae0c02197ba5f8d8d06815be568eb084aa004bcbe65aa02bc494376212bf7486558cfbda914a5121ebae06f1e37ab736708f1e96146a4b58e9a0a487b5d30cecd8ce013302abe7a0827a3d4bc4de17849df301993c530ce3e4667ea18d45e99f3a31fe084c7e0368dcf427faca08013329729c92114d2c3da66904f5316a44e28c24c9045dab54dae6c51d12ad721dd4c2303533539d6d28059edb63d62784dde428ca816ef8aa5a8662e4d05477caff7b5a0ef88db919d41bb6096b9413a4a20c26a4a251ea8cd10b812b0d8e1a3c40c150eb7d13ad69d2a3683842268a40609039e110502df2c38cedd3ed41a61d2a6e6a42a4273c005289ea25086bb56a68c19374670d8e0606c4aff22575bd7b0c3a71406c1cc904c83abef2d611f02fc95f9ec88827310281fec1d72012a73504a5331e826079477e58e0cecedfdb7cbf7a0902dcde2e094e3c4f7ff3698d5fa90ce4f081b48775d7c7b2afc4bc7fbf85014ed5f5d2fff6cbfa20b2b264a88acc1c9a78f84051641d3702032057fdaa663e3a8ad926e197093b7c610ad990e01bc7acfedf432b93dd6ab15cb954d63b256782c473b8ff515af5996cc0ae1967f7ac053089f45e775324391b898ae7fabfecf47725d84ba5bc386721ed66a8ad022b04c85696c10d1aaa1742535db4bf817ccb00d9f1189af53a383621559c5c30ce828660d7052e2fc57ac7c0d07d7e0991c621ab8568a43e57f0c9433e04a662aa5db4b8105ededc8b201e1dff31dfa389a33489875ef5140f9882f22a18de94de596454fda7542f05ff2d3ab6bbcc81b101563476b173b83d40dabce10a7f70ff729d436483e09c25e7a8671a2db7d4172ce4edb8121810e18985bc57a2ee19580be004fd84e923a29beb002ac6775c9b2f67e584f83b783090abf4b43996cd1ac590eaabda3d8c0bdd542faef1c6c4de5548199c0af8335c757dcac9eb757c7d00e2c6391926d8a232c73e2090a1108ae89e7e38d30666a0ff16947d72d8dd909979ffe257d69c3eaba551f4f3a85890fbcc296e3113174f091f152693f2791309b4c1ca3d44fb783a8e795791b5b9d3d1f26fbc223ae879d9fa0cb60134588776374248f2d555dc1102271e044bef1aafc3eeaae0d6427ce0214bc1671e741f825f6a58d50d15ac240c451e406760b16add1d406d3fa0f26a5493e2111e568517997b0ad10117af1357fc39baec8b956afe35de750db75811f70058b00d2c427adbdab6149e0e33d85ab1b5ea6e7db01c1faaf081688d2c04381d5a02c0643c09a63f6195f5c2adc57114df12b06802bfa4f9649ac9d04d76a47a0835ce5f03ad8a946a270d14641465a3710eed88f0b87903a4a43fc6899e324927c6ebae1ecbb3a2511e81010cf8c77dcfbedf81bfb1c9ae44a2fd618722694dd62d4db4612c37d06f8dd88cde9a6834de94e57345a643097639d1dd0bad1b5e8ae3eef79f1c9ae3fe3921e8cfcbf7446d10bac50d381e3fdf7351d93ff1e938828eada66d69758c44100d9036089f1e9c15293453d0bf96d7d8246699e942d1de069ce4e10caf9a9dfdad111206a39409b8b05c7a4c6017d6a58a65e76607daa7315656e59d15e7248c4ec1c9a214c2755c697907ea91448d88bab001388bfeaeabae3ebe559f63a44b166cbdb83d6c05deeed13ab46f290a0be4c644a5d19a5d990a980e5d598a085fc30e674c8770536d4276c1d7dc0d850b14637ef73e09306d43a125a56dd0cd212acf2c6f0ea7aefdedd1b2f3653e3b2d59a36e31b2f82e05b7a06ea766407717f6b877fd88aa5de103d14d36684f72327d3049e1b11a92aa65bb8b77c07ccb4ebdefd3928c5401ea5d252d88fcc566aa5545744981f9863da6671a815172bccab8281c5336b3a77a5d8fe958d4cb5f77ebb8da104e0c013bb49b13ecc876ff2cdae4beaba80090850668a449d334db3ae484a3a700c84b38b4e3bc2929d95e1e2f792e20d946cccb7eec278f6cf69a7f340f2635b80a6545a6ead70467b0651d915e517b5f3463617204550d8637d9b109f01331b50e30185efe75c7b7942b8c605e11583ab59a1b4d85b761433c09f2bf99e254144556f2250cba6628df586941e2a7ba225e45c42c8bf8e5570d49ed9f605331a3fc9658be7cc62e3f8072c29318ad916bd5c49f0e25b3fb25fe6acf7d8ca264ce4402ae05df9bf5060a876f429f5ecd408e3ece7e6bc5aa536b876a49d4a8e3bd08c89f108ed8a27530299f16ad38713d5993d238fd4a319b696e93cbcdc5ccd4670da8d12ae8d6e035bfe6e094c58486b997adfb0b3d82c24a2cc3b6d783f8f65f1e0fa8ba1950bb9f8deb27263701191d157ba7ceee78fca3ac1e4905c0a893c56c7991c055689f1c28d0df6ab9d6aa77b114f93161ef52624f4099035b8cb08a2f939af5f4c6fd90ad1222a330ea4f312fc44595ec9ead1347f9e6327bcd3283f01588a06635279680b67279edf6e597ec43b3265499699b71fad015016d562495fcb8b46b1407ca5c8c5b126552e6e45b40b16db7478ddd2907d4e5be9a9920ba941deb0fc501d552826f43a6e545efec29895d260d6ffc423cb4b08bb4eba758c4308f8c7e36ececb2d7b14ae64ce412722903d4bff0c10fe1f783b7c787edf2b25a8957fec0f2df071ef2d29395918c1fd362bc510d18438c2c8cd9377b8f1710a2e542c386992aecd93aa4ded47db49b70ff9686a164f56f64b5f61b41f6f27f80f3546d0cd47475f79af13c0ed086f86800a94554ef78df34a991a0d6d44a2d86973435ba5d7f8e8d070038afeeee9fb9af2e58ac252ae1cee7a8134d429001a31e5c386d12d0777a50ec440d6a63d7092755529b1c258a15d82ec7c60634af93def0288051febe4732dbcf9f79f10601f405d83afcf714bbdcc9ae907bbf1840997ed9bf9d3153d30257937d713848d10e0f5bfdbd9c3e1edbcb0aca3dd03e6b214c1bb52b372c6da66c872048d4aba03dc97b4322d5b41f47607197f58a8ac3ce1017624356ffe207ae2b72539e4ee6d57db883b2a597165aaa889fb7106da431043d0f7af807a6a81b8e8f2e6b69a9e2d29196f63e4b8af2b116681ad23bc8bf1199a6d108199a6d0726d96a6b21c00df7e4e988e6886ffd8f3429320f41dc52349a15a12eeac8e88ca55597c2e4607b0df35352c21413778767ff79fd9b70b244922d8de425bf1e6637208a8a6a3cfc03c50b7f3bc1e9ce511ab672c8dab98fcb90c3ca58b506e80248d323755eeec399d92187bbfc6840e08b2883ba3ff6c1622cc06ba811f80deb91712c29dcfcce64320b474e80feb9592254180d0a61a3fdd0b809086f4c921649063e62c83254030e0c6d32706bbab866ac953720e186b467b493b6bfeb5446cc27885d90f1a20349453ec9b23561c005f4f7714f340fa941485866ba53c209c6d24ce066abbe5b3c2300c5418bb69ee9b0c3e947712a42e3dead520bb94b414ea6429ad772468837278fe066846cd0a873cedab831c44a905a58cde7170a59a496429bd12ee5493d8f3be3b653c4342df06a58e0e0ec9f2d8240de6e85ca9b8ae799baaf93da9db3a23c0728ba15f51698a6a8e3d4f61ab3ab56f0248fe6eeebf6f3aeafc4e1a466e7f38f7a9b5aaf7cd1fa0e56b81c8004df9c10d709b7092784fc1f24be471cf618f156cfd99466f34d43b163b8c86099576f29c149f039e1983ba906eb4137980f6da615e570f8aad3b53109ba088c0aa86d80a93726c3b97cd2c5dd3bf8c89e70bc8e68f3a5fb7cbac986e3d8ab8500c89f5acba0b31efb135f51a53c4f78d8b8fb6b520d73bdacb07105eac9b0116a8413e495237fba71b22522fc85d78d8dd10fdc4eb34def5dd8fbce97ee57e739ea98b09b852cc832511eaace00719c25dc2d2f6e384e3e186189917141df6057994dfdddf7844055084a7a920033b7b6be00e239027d6e1df3808c38ef587609a718967131e5d9715493053989a1ab5c3642604a62668e2f0431a78c26c0694faddd9a51132479cd2ccc7778c238151f9eba06ec43890e26f8ce798b0db40582fbb84a1734265789b0b10d946e85270dac769ead36e0d454fbdc6b2e427f4d627320cf8a6696d1f943e8faab0b35ce996316b85ad86b0ef7c57a3019a079978525455f051a5d0c2800d8095de6e746b31ab7f6d6ca4b95b43da61b8eb05f936a3241d2a87244c4531ca062196bd03b4da10521fbb3908e0b4201ce07bc664597540de1e700c89698c9791c41ce99cea053c1139ef8154ce4a392810c32dfbd53d7659bc031e644e445d28a5baee3be0cf3446ceabae5a41896087a9aab81721b73c0363b42ba1c72bc56d74f304f93b95543e6f2974e25785737f9a640a945c3d3a5534bf9feb11b3cdd98fa83a76a3987e8a9d0b9bfffa4bf056cef686db3af7bd4af7c187b1e44f1645b09be899021ab6000f98595521ab0798232c020ddfa9e6e32e4d4070766e1c0a08554f7a0ac7c42d93f62cbf18325f1387773bafd1c08d513c02a24d5017470fc08e178da60392ba68ce8266019ed74fbc464ec9c6e69331c4cf1cdd99be079804bd3f39af7fd2841874b655c1be20df1cfd4d533dac26f16dd0bbcf5a36cbc6d7ca05924add2a280f6489ee92dc9158d49e895f4026dc6665ec688b78358109c67e40621ca234159200daf76e79a5d3643c69830cddeb3c6fb36e8612be4c3af4643d6bddc4c5533c52afcfda514c7ad562e44312030e06b80655058b1fd5cd240470f7dd0e42617f16fa4b8b694887d89eb9c449220b4bf6e3ef38229f498d77fda51e08233d55f1a6c9f82ea881c93826f8f69e07887c379fc0d1be7e9a173c3add6625169e37c2646b1aa49af1a39f9b27c8eaea69b7ca95d8f346c79be595a71746b1fdf6c4931bd7e901bde243c9bab1e9c3a4852daabe77988b8d28db83e9de5377c3e470b06daafa15c2b001caebcc2bad6ed552cafd84868ff6f910ddb43886a88d05a4578f8764cee21a21e084042cf9c29acb22f90a9394e79be7acae787b0877bafd228ad2cd8eaa54a684c2a4c1bd7da0b07207506e2a604fb1307d4eaded6f815eec1cba8ea84e2cf808ad1a12f9d7fa309715e09f1083d45c7f25897bf75ca4262f4ce47158ef2848cf1d3f541fabdb663ebe513e5d09a9158ae64119b8d334fae14608a3c918546766b7ae833b2a5827cbf4ac4367585cb94f491fbe9521044be011c0130f383b75ca285bcdf271f61ba03e5302d70a421d45871d47b8e530c4d534e8259a10e5742977928403c6b22da0c2874969f0a003cd1ec3cd0138e3b069ca21e194061b018f80583c0f011f1ff42e1df2382b8f3cbebdf748be80f0d752e92a9cd2eeb661da8f66ea3dc0a5b85266e8cf663846955f8ec59335ff6f1bdb92d640050d5088e4e4df3e18dd832ecaaaf7607f6fa77e6137e724df2d2f7df4b1916faa17584ec086c5692fff46ed3da88158edef84cfc8e3351a206479a4830cc07526749522bf307aebadfe0fbebc7981d0cce57b172fde596032af72a1864e02dbe2a8ca4a009f56d9f61de129bdbd3178daaccaee86cfcd2262589667be4c95e552abd5af8505a26b0cea2d6494781269353b592e13184f1f0de59222e4b3bbb17066e14da84002584aa33d57ea3ee86545a06c4727ef1e66b6521187caa5fcdafd524a5ae74f120c9a9dd8c89bf307fa46c2304a2a4c574b807705649cfa6894adb120ba1345a2faa77ea90fec54256d007636890dde4bb5a3c1eb18fa41f01931f4b30da5d52b011938b0832e96c9b7c8212c784cc9450c257f524e452120953758fd076e1d60e58b526e64dbb62b461a73eb6dd722f26747fa7f081b0436c0224d14861660a7633ea0a36a92e3fc1e79b37c5996fb180b6ddedb14a2c6f9b7b0b9935c407a44d5f22eb4b172c7fe5334c5ed67f297191f3f2781cac2f29d7252927b255e822d0aa48d3fb7ff7d13d4ccb822847dda1722a6c930c71a7d82a25c34761cca6fc15c038296db1c19e5293442e5a412617639cc365b547c3a9c63e4365e8238963b4797523a4ae0d158492eaa581750e0019365eca104a9814b9a188d1d77ff302f68520847daaa2d89c3c9fb980ee133e3329c059a5c7491bb563691ea5160637ca43227b2679e926f476a20e31d0924659d23c42456811bff796c48f9c4cfcde098a1fb1a2e9f634f6b5097e461a1c2405d4a0699bdd1192e00d1d24c5e7727dbaed724504124f8749f2867da4ea3c382c5863d8187394717b75aeba92149d48dcc94b46fd2c5579c969810b16b73e75524062b05ab8a9ae09821ba926023a6408a154491f68cc2a4ac39902cad9bf6a9f7dabe0b7cb2101b7d06ed2e94430b67706575469fd851a6ce57726388f53361f2785beffb70c554e0fa1ff42a948c519fda712a595d05320a384594d641264ec24b18fcf4672d38e55450a3f291e4d9575235cdf3720dc36a92c40555294cac2b588f2f39e0cf1d5830816fb394ebc295949ee283722a9e6d9dd3f5d933870d09f4231d3f539fcfd170514fe179f2308805d0ce3714b624f77dc5ec9688d612b035d87b1dfebee01dbd21bebd54c27b61d37a0e8235beffcc7bdad6e007603e4dcda1c2906ee30f80377240e98cabea6244ba20a887c3f374267bb7bcb58d668bedc918186755daf044d71b407fb4a008e76a5889d30b37c9858eb5a50cddfebc3b9704eae05613bc8f3289f352759ea018453d7bbdf2aaad276c9a446dcb66916b31952923ccdcacde350120ffa9dd7236a4439b4ccd4b11a52cb0423f431a3806c3b73d0d218b1554573d962c78292f84f6a29359a2eef909245c686b98ac5d5b4099a8bbab91cc0ef2fda6e3710547c9740f7ec9a42272896be889b66a3a8079e5fe9412bff48c4961636568dd7cf3d5639f4d8aa398a13d184ba56f6038ce59802a7dc808cac81a17d1732e9604cb245d75930ab1e6698548a65ccc66bf4a6be2f7867c0886754a898030de1a084c84951a5a9031f10d75f805e4f1260bc32319e9a56d0d404493968697c30f885e60f1714cd541f8c1ae0e4543c8062f90244b63c0d9f8cb1f858386e8ef65ffc16e28db6d6a8ef193633c50c79a42301c0346291ac6a0ffc752de26b71d013746c26e980931905d0341a4474aa11ba756326cb21a511da596efed9009a2cabe40628a95d16637a880cd34e39838190e396d3499c90fafae77d3cea0f0d69ccb072ee16ce172b2f8794ac09a04f2916ed4fa9312bcc0cd12627267a833b3610322b87ae32772bedb5948aad5045b5c7cd5ca24ab0520fcd2e4c12bd930bbde93795472d90ea1db9abcb37687efa878389b423d80783aa6d698747b3bd2031315db2b9e90552daab96e980f1a6d38a12dd6800268d4e18cb09509bc2ba63e154c080498255a01b13eff9a73d7a10dc27da21f9120f0b2603b0df1ed32d863af946f0e8028886e5410e50801321fca675fe0adbd3a260bf6baa588280291a75a1b100cda5d4f693f7b55843563c2293ece207200aca42b3fb5689b60334cc5c666fb8ab28e0cbd21dd41da4b9a3b2cf3ec9456b1fe653542590f20eee85bf72a3c5f2670b5075ee9fc628abff8ea1c969dba45964a06459b888a80d7bdc339d64dce1f7b3b32f98719f9155a9207e9664c4d8d0bf883bf6979cb374fe3d724bd6897803cd6d715749e900e2b4db15bf7bc3110fb1b16cc0b69795d248cdf3f325af315193cecaf5e7751d6a35c7e1f6e5aeff5e4f77be695497e9dea9ce1971d5b0a82c406b2231037f89f943c716da33ac2a57c09c3b520ff685a29de105c8cadab1a1dbef597483c86896fe236278207392ceecf723c0095e992910a2e83b9795411dc70c31bbb7f7c62e989fee431faa98fc3c78e1898b7550ca9a47812351fb3ca10af49193367094f82ffe01703428ba49296c2d2e83489b347631af4b7fabbbe5920fc5f0234976c27876f29615b8354892fe1114e995b3719699423ed1bcf7002e9abcd6ce59643c3b81c297bd511ddd4ce967785f9878e80c83d96a0b46c223275bf26c79e6ae62b62d855081078806c535c588ee5f9f8634ab2f5e748b64bfe4d720ec27732221ab7f17128947f1c0336df5bc777618b3b3ae63d467e2d9ac9d3d031f4a1bb556cddb8690dfa7898828f96a26bdb5f3d9ceffc3a132670348c00f571234b8b0739c536a0b7096f3afac51020d761bc12f1bc466825d6576342d52402ef875171a9f4e131a5f9eff28bf61d0a47d98db25dd8600f190ff79feee048905867b96c088eacd2c04c7d5a3798ffe0fa5147fd8b5a7a204738b4e37724dcebd2d872859d495e8c60742aa2dd14562f4ec3a0f952755e6ffaaaab49fc5faff97b15ae32b5b5bf87dd6b2fceb57a53eebaacf3f836addafccda6a402c66e11da0a19835976bc2b3ffdc176bec6975949436739425b6ac25ef8be147228af580904df4d8d518164b124671e48658d5a6263eb525d9adf75c6110efb34c46f2057010be22b823f622ecff11fefd867830320a3d27e31cc50f49d0f0a79edfe2ca3811993afa7d51b8477caa130abe0a22e91a385728260eb7b44d57905af7e2016fe10162cbf38f3765325e8f5f9dbcf91172c5009cc224d819f0db51c56ae829bbff6061ee1fc4c15dba5e6e2f891bbb01c5a266805ee804884d2daed44a39e99dddbab4ee2c2312ba7f4edeb6bb6f8e77dcee62f41994809ada27ba92d6fdec5e5f1fb51cdafaad5b6bbf161410c0a1acaf788c30580ff11260c76c5e98c8893170f04412429095b3c94c37e253da0d3601610519040fbb60ad700bbd34d6fbbcad06da37cc62a245f587cf1af193113d602549a6e232c8104218d71047ec9b6924dc5f7d23b03c46342cc5f3ac7e33b18cabe2a0d886cf180b63779c9eae63efb408e8d8071b877436a41e44f5095fe92175b9703ff9e45039a22c606f819f2eea38888b97da007eea9cbdc158595588f61e92d7e61b8722b5dfa6676240b27c8ed221d57c101c913d280925914583e9e0ad4d7881f62ff371c324a4c21a5f5828d4d1311b933a550ece0872bc3ad6e92f15f6b2a363e63628c32e637af1d7e81d5d8f0b86c9a71130c14f999c7c5fe34fcc7eafa3c08dc25ec478eb4872d106dbcd9690191561ad6c4fa6ccf8d518bdbcb0483a189a465562528657cb474fdf4ab952720c7924b49d1ecd7a7d0a123dac9885ce041a4f668bd23e3bc9b8a8e8d0085e48bea9b203826cfb0a81ba94788e21885768cc99ead59f71d5bc01e4821822a51ff75d367161af9abbc12f048353fafb86b6fafc089fc2d15c9c40941841ff4eb583e5768d018ee6fd9b1caa3dd9d06b84140a534bb78276b0dc819c60b16215987fcf6b03c7773033028741ad8f0de81491341b8e4896153ba01b4b711504ab3f5c8c15d2777e40f11f9409ad2ce25995517ec2f2b3c634953670f06a84374f9d5116dfb2b042dfcfb23dc00afa5d7789687bcad36cc16b7cec0d2bff493430ab5fb0393124ef91f863e00764c92ee4d6ee61df091468e72e4d8cbb211711481d5f96e1ff5d781cf235edd799a857824789ae5183a137fc9ab1bfe63d2e611b9f7d4d14e2f813c5fe7fde0a160d5613ff8782cbd864fc19b9045fde258390f652e620f93428b188e1d18aa8220457e965d18ba4689e79c3c45f3cc59bf5c47ef40c0f2b75f84ee1b181a96258697ac68d3d7dd40434f40eb705c49a56b5e9d356dbe3cffaf5c4163b15fd1f58964a5c4fc85a3d8850fa1c7dd430f96d0cc9c7217a72a23188b8fb7b233ed10d76aebdd79cf8805355a487ea19ee95b85079905a8e957f0185b8d5e438ebd07f014fd7626fb98d0789ae03249c167307df05a74f60f75f59db7b1ce45d8b84983a27f90f736ebf703461532acf63a26905123fde26d35cfca327bf0c325c15e6ca1658a8bf817629f89d0b98950011a7a5c2c5fd650ac131be447657d13ef9e23918b1aad3ed150d6bc7b0fe820531f27a14a8d229ebbe0b78c5aa4f936ce6dec4fadbe3df39ccef112fb94d516a67cfc06d72f48292fd68f6266a4a27cffc6558f0eb12bc39b9a54e69b120140c1f7b9e284e3ba7f2ea699c98d1af83cfcd61781d5a3d375190ecefd6552c5f9e7473ef83c06897448e6181d0d44c99c18113f54badba3966672e81b673e2a4bd282041b64ba0eafbc8464aeb981edf150366ab1792e7873632d54151d599d07ed0380e7af2865a7d644a1c219709535c68985b656e4358583067074a4002e5f3832fd4915be036a7ac56684c5ba5b0537a2005899faa63bc35376e90a5491d08fb9ca91ec7df981169b4a5ccf668a91d18dce8df3b48ad201d22f6ecc90cba5354fb45a10582589dadfe258d036acf98a5821c3735c85d9b8fea8c02d60366c8b7fe72442a603f6d2d92875bb1519eab859cac6e1670eb6da01e256e7a2e39ffe7043d117a3fcd7b1f60357e720923f467f0cfc1af59dba22d96e5f6703d33e57b299748709f3bf3f049068e4eeca820c4247a14f292feb922c8c99a240c9678b2a93800a01657cf4397453fe3a1a40e08194bd0e63160c3a66649c186f8071a7108da0e22506b93ce0f352141ecec0cfa47b439218e33c487cfb453289d8360f89f90b3007f7594147038737bf857a7df5fbefd763f80a6a45f59281af79377709f71522b29a9d0a70c857d6b0d373f47b4aea82afc153a290d9eabd04dd9adb43eff873ba9e41af8b8b950906f99f27c582ef4821b40c29db79856ac770ba9dca07c4e51ce95e4463964f8dc241475ccd1e2252e385b4a401cf59be8369c84d270214060c93583a707c17f9121dc3cb9b7e7e0191f3a125752d947fd84f6db22b9fd32c5c219dd5f84d19689b83e6c56f6fabfc98aaf12623b2368c9240fffa3931ad7ecfd8ac04e2d66d9c847dc86846df23bef33bb7654ef1f35ec72be83b81938d4043e30fb0b188b8a3845d52cb78bd5c0586fa34091d08826ea79c32e784be48eb8b9432a8cadc3662a50dfb6cd2664323c66d16e56c8485228d93e4e8506d34d00a4031619c0333b08cad4126b235401a7bc8b8b8b2294fe14c5e65966b1840a2b12b2ed8f022580d83fc81440a09039ed381f88ab5d235ca013abd3d8c08982e1117eae08363ce116e5be04a79e470799b20c0064d22640433807948ec3499ed34a5bd5b23f3d632b6d07215a5bf2f9a9867f1952ebc2748fca7b15b2793f10cf3e0fccc418486809daf2bbea6840813d2e0d32401eb7a6fe6b3f9604d4b348f93f9d9714e208d1d065e9d878a1308092bb16b939076161990dfd3dbdfe78ca260df94874daa085900b206fb3364cd000068641fdb4ed39906bad80cf4ae783a4ffd36d6dd7904bd64a6ff0e456dae9f8c2cf4a69e292857997b61305ccaa39b5357526c994532b010bcc3336c0e31dcd1b712da1f7f83e60060a767e5f6e281dfa5116961cba54bec65a00dbd1636aea0b1fdbf03a0d218ddfabc85354972263413c881ac10902c04b2f3c371930d2d90e82b83d052beafc52fef2d6f9e8bd88bc756964d20bfce9950887686a3bbb7e94f7fc3f05edb5be9568d31ef7a4f31a2186b6b0146f1edfdade402ca32ebe822d9e6f4f3eb5980267fa57068973f02b0d4e452487164987f3d9e578d135b5523431aad5d1c36fcd279d6e1f4fbbcaa95272e313382d011e23d83a4a0c2106da17d1af0d28f16394a843820dda2fcf115455c74a69fbf19e6c41d3099f97fe6326aea6106160ba16633554b9d870934e6e162717ea4d2e1f27d7a4d9c9a5473a42cb9d3f054b6662372414ce1738d69ae7c02b2679cc42a4f6a2acb0e82b4655d0686b3b051194f3b9a8728b5558f779e92b2703308179359f4951145a533997f4148b74144af2e504c45a6a6bb2dc8916230e5a7fa1843a8833cb1a21a6aa444468132c86426db06d84bcb38912f797583e38b23699293b0c722e33fd02cde55e724868bf0d1e781601be5ef64c6e48718e447cb7e2f13fe015643466a3c5c46079910128b08631620e6ddb988032ea1bac34e20033a7df68a20d80423338fe625f807cb4b434f901e2a26bd051a2afcab188641a9e5b0d6617a8c2d1c49554d01506983c3e033ac1b8385bae84d5b80faa71926b1180e57e94ba7df8ade2c2f13d5b8d2b8fa8f2cb4144c59d82b7f14ebfea0a4d1a926eff03c27e204b951193b2375e132a2294948aef79232f86625b5b41c7d74f9f0baf04022158f33d12587697cdaa261832de2e85f84130d33d0b040d909c25c5b7e6abc5a112a4e14b13642a37b129aee3541941c295b0ac91fc04f116e95edea9fb6c0f00300089956fc5a3a08f745d3357b520f40bfc0d9d1b03e2142fa49c60cc28c9affb200d808269ee085aee4608217c812833c06b52c06fb87729f4806596a0480a9fbebe8ca3370d80029246d292f629691ae8173ee3675807d63b76d0b11cb7c4a43e81fcfff6648dc664650e55d8289a72672aa4dccc3983c2eec68815ac8012076f4031bede0336041c307247d0ecc658116900e2dc56dd67f41ddd61fd9d7a6b5c6568a43d52c1b78ada5ead6a8979197fe649f6cdce16c8b3655d8ed376ed236b04085dca9f39740496074e22798941921308fe8962e18f190fec7e655ab869d2cffc63cc79c90d2a42131bd6e617a55e3bca9403e9c6744439e8fedc4e59242afdf99ef018b1ab004de178e008e1c02e9e6b030eafb2e0d4484e6b93df9253d44ad2f424b6f881778db99f03a59cdfb614d6c3b2adf4c1de0a37ae788829ea92ea19e3d9120ca2fabd528502676bc1fc2e2eb3ea34595d32eb1fd41d514e0b3f915e4fad1e41e00442daab145ddc5edc64be77755c8fb9adf248ecc92f54e5f25f999c231571b9294e586dc82bafae68ce7d70ea83199d8d64c4085d1bfe2e6dee3f9d498da0f0b15076ea39eaf21d9db82f47ce0ac4bdad90b591b34223138731c3597c280d53157a0ed580cd9791703ea75141471128bba941c3e2f148e11c31576d5a77aa60f6855d88454b3d0653dd89f47ea47ec27d41f5f48b21d06f4d70ef9bccd207ac45e82a11a90527b6b9ea1eb3b2f599b4a1e3b3e63cf12014fd7759fbc7b64f5d0b84e06c52d49452733768fb8cefe15fe0a0329d067fb0089a0063a3477c2c98923b64db960dab6ff6e2952b8d46b9517c9059e859e4ce4d8d9ae91a0a056044251410a65d4bc0ad0db0e7b351ac910806c0c56c00c72b8d0c4a4a0890dd8167c17e1c7f97195a949f836a9f312e031e6f32857c8134ed660b90730a0f41707e1d9e8580c7f61b47b40bb1aed00b259470118c076553b4a7e9382322f0054ed1bc873e29cde352cca6a24894b437566ef2d5016052e2326e1af71feb860398048d4dc4d8851443adc62445a894dc3d32ecc27911f7ea405707f2d801f470e29ed7043a0aa561310cebcd661597a940372d97d99f1631abbc023903d9204ecbdc931094d2d3bbfa8c5228b724ee82af4c3e4c1060103edb85d2410a9603edda8562ca9e49e5b6ab8ae7814fc58ea91e58b83ea36d04b62cfec44364ea1e82b61198ba74dd74e6687234d3b3caabe3b311999113af1269c44cea98e89282d4307ab08d54fdad99ce03794245d77ba301c7f64c438c7d0ea0588da20e272cf73c418064e1595bf6d0f7914b691c9aceae8646fe53c2e0b9fd2203215997582f4fee130ca67838096cec2f0f7f836cb26270620844e7d2c0bb248688cfd8f1bcdf10da8a0865f3b4610fbb06e0f4f38ccdf7096e36c6c05d0af1dc0c3ecd0e4259fd5822fe0d54b2364c915258257a2952313b61c14895cf09b746cabe52e47711e64f8ada0f19a2f0ac01ef3f6aa5d680cfc65a52d6803fe9d7427e31272f43c324fcfa97a5a76254b1a3d1772d3eb5385e6da432d24e7cbf85e77a859e6853957e140d14e9550af038e1ddbe9e285a40bc00f104b684560132efba8c62730501cf6e285e89cd0f9c54536bf608bc34d4f706ef9e86788c85549b1ed2d4896e2da595ab383f589bb58b58bca7998ac1dab2b10ef29981770689064ba4940d3186aa7cf40eb0c99b8689311a0336e13f7830044bea6931a21d5593a948a60e0dbded1ea980896e1024a08e632884e5f1295467ad21878e4c1bc8ea413c1d2fbee4c89c3020da02af2808af66c7f071e82e2f16ea3c42c9e11c83d194e53ec95a22ad0f8788916b5abb68e6721b55a5bca29de433445e1e9ff431dca8609efa1b4c63dc15328b3aa4949c9be7152bc1b646f25761847496ac1fe541e0c5327baac1d0f54f11d2494f37ac4160728b9895ab519aa5d5b0ddf965ac9546547408c37989b7f802dfd472a75a294c1b21d84c3930e309061626bbcf854d8cbdf8621fe7f221b1a64408a8d1a21b0480834b4d05c98181be5e4d236159a63e14fb60b4d116a452091bd378685a86320505363e3ff0e0c00835a8c57ee705e11e61803f1e6ae82908d0bad9b5d5602d49c2eca4a4ef7ba99acf88f349f86fe2f17ed1853db519cd1ae41b1c864e558c172ee8d80645aa47cef64c67bc08b30410950b40123f89a2dcac02fa4736b84fe2a36ee8a312a25040b60ae6ac2f0c70e336b072e3d7345652db55c0665f14c4121f00cda76130d8c61de3187a2a887635f2e533d0a2260808f5876cf1c2dbfdcdd0db076a5ff5190ed8cab31455485436754f1e46e018363a24aaca62effdf386468387a593cea54be56c4ada08f0b53aedba7f5f2162e9a93bc6c406625bed766ad336911e3665ad2f3f37f6973ce2185d17f3cbaa9f6d5197fd3f4f1c9da8594ad6722beca7092b794318b4dfdda4529f9c3c72f62a200b9dc52edac738f907c19c311ba7f6ee54756030af70741ca28255bca98789f1dc9329820908a646c5f4c9aeb8ca66cb0f4355171950af6441b33acf4b737fa0bbb0881d9b5f3938a13a26dd7d0166136d0054a12c62726570d7559395dd3ad00b13574008b97f2ced6821654ef2c04f7aea9f86460e0a4649b41ea5f2fd378e68e29cbcbd57779a0c46f90dbc78e333675bab1176d286336e26fccd34f9a418781b03a67d16b3931b0834acde04338b77e890cb7398d85803b25231591efe7cc9da98429c56ee45b5213fee00645b37facd7ed64e4ddad4b54d209c9ddb6f8dfe42197427df04d4a4905d54117a57ad2184f9ebf0e50bdf1fe9f4769c04d88e9582a77863cf1ea296cc0563798d8ca3204a5769e5decb5c9580fd1b11964e5fa78cccb80ca2947f520a68408464c31783a2e6249e0b4e09d85d713f6556d8932885f3f5ef96eb236a9a47d2e5e5d5b38d290db72b3fa06765d0c26ba0a08c83644b8cb340f430413888d94a87bdd2530ca0c4d10a07ba3ffb77c73f51caa67e1f0cab1ce07cfc985070a609189c0965a5e91af5800a16d723f53120a23c6bdc20dfb30ca608608178b3adfaa50817acfbe857a78d3c1a06541006d1e9745e6c2885bd24df3d2a8f47211c47727373fd3d609a46b22613dfc3e1007565443d56bed12b2b97d43e8d04b655bb18e14954a8025d44de5f01a73ae8b6a8d348901a18034a5e216253d0341280f5c7c71cab8e2d3bda19fc7c3196bf729751defab46a417c4c52ce1f63021f5f66d11f27b23bea2a9658f44e901f57e2ec14bd5d2aa16cfb75f2751d0b8493a81a17835b2170ae7f6395169084c441a6881682139f1924ea7a49315c80c159d2c38c2b3f7899d575a8cc07ef7e40e2a40dc84c43f63bca895c204b9821d96921f0dd5daa7a8edf197f3530e625d22be5af8251e779106d60694d3a70ec9393305bc9038d780f84ff58475d5b47f418303327647f8147157e806ab30f3cb869059b581340ca1bf4b07e9699d7dc50551b726926f016d8021540602b518c71f0254f640d741e3d47c2f7814e529d4f8024d57357b47b829dde7996040b18141ada484a3ff1de730b58323f7583ddff29956469ecb8002a239abf8edf617f524acf5551c4da6bb1e99baae4fbad1778a3f42f9d27e1ac3d96818e92eb54afe5589c50ca5cd0027bb52550b2a6b3622a9a252c30f00890292fede0f415f86ce8fc5cb265ebec99fbf0892007a21ae767233a427537bde892e33bb39479d531fa6c9ebf97ba98759f31cf5277eed09461eb083dff2c815fb4c141b82a7a9fc65119462c33df79e5b38892a6211fe0e3e46cfb9f79e446c0726634c810d08c666c210f6f28fac442cd3f2f7d60634a56319ba5565fdcaf5910c8da814ed046996ccbd414a0fbc86afa20f16b2700a2489c375202c8b367799ece97e0067c40852972aa130612ef35620e95e052c7ce9fcd69914e0ca1fef396e80592e5261e6928e73d71d320c90c98a2e951df3faf85484ce1400affdb1b821de51d7f0045487fccdfbe184faee93f01ab92219b612ad37a7f4f329362c6bc200dcb1d7ef522aa60d97c6b08cbefa405803f3c5d95da6892e9088801217393ca7d164eb1975bd610c122862995c25d7799f95f9d9e15e68dca8560023937b53322046aaebca33a68a11d8a781dfa26575ff00fa292e993c2f02b10eda362936cf892a6c1040402caeb0d39e55d2cf8da177b4cfa361cdd34e6b69036ff0c854777a533fe6699a26cd24ec075bdf8399c78b413a0eca2285ec639d8b962af426d823564fef19d647096ee66f237b334e7b80bc6d586b221dd3bcbb9ea322402a57b9cc6e51970202804846d1e6dab9ec291c9ad0ec93776d7aaf57ff2cb67758c836314b4eb6f6359294118acde546d112a5a21137843058771eda4d5b15d80f245622a87a18834037687eb1c565f94484fdea950eb5aacff3d92ebba427dec743c7b8ba8fdd695806eb605bda64b1d6b6d3e1922c9c254b427e74706a0fc323c1006c924de245e6992e2fd583bb4fed0d7b749a64c9eae6a31a09f172d08774905e0a278f109aeee0660a9be1be72ff5fd008f78ad8570473e848a656e1835b73bf87c8ef6e80950a8df3fc8a19d0bf51aeac655f3ff2f3a8087820c31fdfa4fd39ee0ff77c82d1b76cb85cfd01fcb6720724884199782ea3422b170de24318c5c41964613a03b4ece230492b86915b35ef31326b8f422814fe628f053688192770c08b3b10170302ed5f8aeb8b7903655420b42635e114e0f146a5d1dfa8719ec41ccc01e824cd88393851ddcbb48481b28c53b03c82d88e365dc839d2af422c4265837c4fcdb3ee48b30df29455af82bef64fc0dd0135c3c6803a93bbdbd251faec6dfe45afbff9c67470483c307139803230081072fa6202392883dad50768cb05b77adfecc499ef6c51f83bfa691c9dd184b20b4eefab5dc45be5dec35af4e1414d2101db8e5e089cd711a917400393fd57f4bc299d6a01d538608050907c2803b1d5785b5290b1079af0546d0c53758aa66ffd4e17cfa65d00e17b3097c970ec64e9f47a5d423c569f82b30fe3b033903551e60b0ddaa10013dc3b7a8a0cf5a6d3729125209d35685c396c6ff57c5f5e04d10edc90c598526226872d850f371fa75b9109f0675f468a72a3643820dd60ed255445c6ebe1a91fe3a6e4d75b25de9f54b549ff41d95c538bc44c5795270e0ea8e8927e0323b21d25e36981296789ac8164d5e852a1a50c7194904dde49580a54f895d64decbccf8c8c8407db7586c3225ab3343ade553b261bf5184121b5521007f279ff5879978ba519bb70a493eb5b66409311108a230a3176533c37d4a8aca86db855b88f7f9dacd0a8bde5e9ec79bc347a52e284975d3773a3634d55242b27dec7972440eb73c9aa0c885f20938124c789a18845d7e21fcd4b985f493ed4488234245f56a9069c79f7f21d5825fa55045479d8d3be5c996a8166671e6e2284ac4e63272211e9998ba44db91dce5060b1d18e8fa5a6c3e3ab6e8b96fd975d318936a683fbd8ac6409c4ce693752ae453c8eb883afa91406ab8c76f74cc95cee2c447033c4e563ea24c93a11f3803b7ee06acfaf46596c68e826772a80a765360ca153c5a1a71603969ad8949fa51a0ef8040beb923a553bb7332bdfe8c644efd9193e1f56724636a9f150af3a60f96c787c656ac9bfc98928d157cacadc68aaa7fdb2b6b96fae745de62a16766aabd8f2eb4e06c088bcedd5dd16878c89a663f0c4c18a80ad32784df596f3e7f4d1f5006d3479c5c40bfa878fed1d5a792c4ead334762873300a27d39b8f48e6349f24c0b8e8935f37f861e08e6854d6ad1a467b3d36cc58cab5a57d56d9d16779569f64051c3aa435cd84f8f2adb5a36a2a492c6e51f126989000b683120919ef807656706227afd020ab9d08b38eb231e018b8128f489ca98443fabb57d7c5620a41f1e6a7d96868828e755b1f5e7572784d15eba586a4320817094ac7c43bfc64a524452faaa526525606ee1cb3b8f3a88a3bed1d6b2e3f0bd57c32f1eae5d793a46e626b0e468f3f2318147f34988717582de73f3044ad58392c420bb2a4175facec730106a0afc6e926d63ca7dccc90b75f7ac2da57b470426b2fc1c1ac3d1e81e3f12e8758f53da11252e5f5db23f1c57ed4dbfdac0523e5d5922bb9508ecd6530698c290272d1cfa8b7ffa922e6f5820c219239e1474e62fcd1f7e759e5cb12c5dfb504da0dd60a42f2db1163d3a398bbb838bc730ac0ee656b3b5e50731b1727cb7d949716b3ee4a8ebb70d7a7eccb87cda1439638e31f7d26199b0c1b37b2b0c7e0983ed674c96bbf13059ec80c77331e7b566387a7e478345d3f742e0f59f553d94212d5d84581b50eb7e36798320baec8f0a5770e52837b2b23cd9959d95833fdda4d0f51dfecc7d3a5bb3096f9aa565ebc671d55b1c656de9b0c2bb9b2f6fb1692e4c68beaf01132700d4d2ff8c7cf4de8ff2891505dd82f36bd85005297fa6c28561f66dd35311cd786feb40a516b3b9678a70752a9859e10fdf96e47209a6edcabb4d60f9438cdadbc9f329d9234b06fffc721d2dbadb6fdfa54083f5edfb9b385fe330f1f8cab0fb1fde6aa5e0a74b2215fe62e3c4af7495a7edf4b83e53c58ecec66bd1acfa5588bb80a42703db5ac1d9781732cfd9c6d4065b5f6bea1fb7437b10d56d26936f9c0b8c0f89557db99eb5a16b78eee3e80e660ca08a5d51902e414036a2c366e5e5094554d1bb132d851ddf2a323270797f19382ca2fbe11dcaf3e85cdc8855e79c82e2d512bb90f27784b12aaa57f8d808e64285c4208210000208e186f27ccdbbfaed7d554f54a05f461a9f866404e13bf8743ed2684480aadeceeeede01e906ab06b80631f37f90f47befbd3785cf1d7f5078498e0fc87134825ad7d1485a5ee583793097d727b5901fff8c8caf7daf7c99b978fdbca9dc7023d07da4723393e583349bc1787d08b58e5be5a6befc78e77df6d2e85bbba994524a29a5945292a47cefab94525a6bada5a91fdfd618a59c73524a69adb5566badb5f6e727aaa2aad562b138193089c2edc3404199b1565a8c060e714baa248947e4ac28bc6e1af9ff62bea42dc895b00426286982139e300485284861891353a04fd8c0d0010fe088e1032038e59061061d217830fd05dcf5e6c1c47f01ab081e4c7c4a5b4f487c894fe41e515922491c406c45257168d322346df1d8020200a470c310477c5882831e4b5088b3c33582832333bc15fddaa8f8d09dde14f44084128e849f17686cf358e48f339bd9035ce4cbcb329acd609f61d9b78813db339967d90314205fe6e76a6da5f6c2a83df65ad5f67d3014b3d90cbc57be6416e75174798f4d3cb1e8321fdb5836339f3e9787e16c66ce0bcbd995619f310c5fd9032e1835ecef83998fed8b1fc4f1624dfbf760e66b1b726c6f951c340d56e1aa3f645c003eb1a90dfeb976b4b8e42122873f9e214e3c43a438fed986b0db4f8e86014515af56ada2ed284551c127388c8f6f3f0f46c237fa792ce66bd5a5555cfe90bb5318788c36bcd727ad60fffedd34bc9356a0b19bdb18e3a3b4ea145a54a46021ad702a28525046272622bd691996f1652bb5381f383111e94dcbb08caf6b2b9d374d10b10411483811447824220744e8501b7ee50b54c87a0fc20d2184104208218410420821841042082184104208218410c297306a9d86c75d1321018218526180ca9adddc52c5599ef43275f227dfe50c5c4443c2c0557c8f4bfe7b5492e27b4cb244f7d22605a2f83e397c71ef7e79d79262abd85cf7cf3da9c3a1838a4fd12259ac964ec5b3749573dc135ac59ffcbf8abf2a5ec566e9a86449191597392cdde42ddd8e57802e53292457d17129bac723ffee3d98130ef296ce05a777414aa162bb80b4add5b8141df72c2c9de5a4150e4537fa940e859fbc8aca68d441feb2d149d7e2b11e8b75bd4a275972d4c99eaea294e893c7df8da2aa3bf994ce842582a8944ebfa0946ee32a4ab4fe944ee32a4a34fc2eafd15f3edadd053efa942ee328f064bf3091a2aebf24a8f082502caccba8fa912cc9a2215775422969c8d50a91072023b895c51f0054a40887fc567414363cd257a9415340ae384d5671824661f1fa1715635278d4b64b5ff8cad7752940fb2c061a72ed27c57abb36e472f5d486fc9dd220a3e166dd7b5b2db7257b8ba64a712ae13ec919a2fbc98f8ac73ff9b928b962f17892030a9b8b092cbe5da9f5f65a0f1af20dfb1691765b07793c72c9e80bfea5f5d154cda0e01009bf5f5b0fb910e88e6b0efd8c3e463fd3c7f42fac822dfcc2bb6f395c42b61fdb030a49425744408043971ce8a0e1c2e5f38047c812d8a3020488e4e1c30e4e88a0c7138a38114495c09fb35cd97d661abccdf9726fbc7bcde30ec6fc14a01fcf0f0f2edfe4470797af7d5e0172f93516e03524a7d15ecedd51fe99bcc47ef472f793fb3438fb8c3b6a047cfc4b38fe141e2489a15fee4e83aee80c7c229319fe0660bfbdc43bfbac932b88dec60f0bd9cb4dda5e3efed991b6cf3f49db86813f7f7edc751bbaebf92b03a068cbc01e6f1aecb74d93d2c9aecfbd53fe7ddc0f65d790dce4e7e3dd477b9eec1a9277d8f517b8cc9fbb195d309600dfbe6631260b3dfbfcbd869c5fb31892e79d6dbbcfaf2171e4f2aa21b9942b2d2512245c06be7eca95ac350cbde5eb6df76dbf6c468b7eebe6671db692bdceae7f79d35c8f635c1bb370f12c1f3ee6c19cbacb7efed66940fbcaf3a6912b6431e4e3b7f1c3452fdadd96cdfcb3cb5e77dbd6b56d317e17ba2ebb6ea353c181969f5d34e82aebfa0b79f71738fe873d86fcea15686540c56dfcb888119de8c014e88a6b0072e844079ce01085c367a1c0cd08119d2447e68f478826cc2004921e089184bb40081d7ad01b1011e88a031de02852040942d8084183103508a1128205456450e406458a14f14191248a2c5144a8080a3e206b111b4ef1044572d8c103457ef0ae5f48ab7c1f0011210f4823e420a2045504c707789845761491811ec952e8320211254570c4905f1c815e81d6fcf110012242c407911e22acf76080c083ae4187401341810788a82006321082aa88205170021235b8a03ee0f4c70d22e8fa6f100513e81b84199af0c1c1821976c03a6dfcf1ecc048119dd23d3038e91868cb4387e6d13b681d2ca1ff2b7610039c5b9c91f7ce4d9a89537e44bd39f306618c3331e0befbee1e31ce19488a31a77c21cfcfdb9c72ceb949332a9df167648427a876528925a4f0ab950ffe853046296954493b2fbd2ace33671961a657c5365fecbdf7de7bf9f6c820bc32ac49d8c3c258de309d8934134c04df04beaec71c0e610ca2bf5266f4a2dd4df4f71af34da48928b3f3a44f2ba753e9a67453ba29ddcc2d5a267cf01c91d233cbb2ccce9a65735e9f6d14cb3e13fd36e7f626d4cc5ed4d168ff36936dcb5eb4bd689a6c53b489b2956ea7b6fdf67a9b6fc231e198704c3874e5449452ca8d66f4b3d2cd9665382bf1a0c9ff300dc3b0df4a59966dbfed5eea9b267a6dfbed45a7d369e5742add946e4a37a51b8ad2a265010f12423c480491524a8d52fa1133a54c29130e24007e8c611862186218626f42c51612c3af753419db300cbf86bd8663ce8f450ddb1a9611fbacc3e29b704c38261c130e5dd520b42a4ba7928e928e5e639e4efa947ddcbd86d4648278d6b4ac6d1af4b46d5ac6f0ae316de94645e379774859a59552da9a1bf0ad0965da614d3d2e6b4d3b4c3cacad3c48741c71b2488690fc64d8a85b8141d32b636bc251d1415140f15c425d794b285c42897e77fb57dea7fcd9932f77632fdadb63f4c4f5deb4ecaa31b9c5aebc69d013b778cf29034461e9a67453ba41f107805893674d05cd684a418dddb865a4319a529729c5e5ebe007e08fe707407c090f108e441e2008e101028f18e96a6505061a7485adfdfaf2da261c138edc4ea0643f9fae289018a34383d0f9be56534f36a578c6b756ca126b35eda8f9617cdaf5c859bed21c151b680db5d6c8c2c27c966f1161975fdca7ab949189a6abb8fbadbb6b9549573537a20965da114d3d724783210b84a6fca61dd0043f9b7844964d93594c382b93c442da3df26c4af1aaa7c91ccd94f93407e9e796b8c31570dda48c83304d8533a14c3b6a8ca6942995591e5f142827ff44f3e9df1aaf6ca63e4ddc1dcac0787d8de254346c5a530f4b8b38eb93baec57bafcf06d779feb54ba0eeb50265474c1412836ca1e6d1515d16ee11228678c9e28cb84432b5da16e1fb3999a3d0e9232baabe0a07c02ea79c569e6d315b7990cb86d92fdfcf45152c645bec8d7d8ee5ac585b7709d4ff4afcf3a7a7a30f969aa0c8ce77791393c5cdac0e252eb70f9261c68ca7fbd09254d297e6badd5840309405156200a26fcc086637cf4ac1ff4f004f0c7f30314e7312288c7081d1e235a25141fa956341563f0d7a73c628c8af6a03931c6e4ebd39394117dad5f71776dd7dfced21c32abb9f1c206f8fdd2a95483df52d6d16077aba99fddcff68bdb49e9069ae2579aec317882655f42f1fa10ee5e63c6f81d560869b2c7bed66a6b6edc7b4b3c78b7f15fe035bb77f25edac1ed2da170bf77f7128adbaf11efdfbff7bbbdf2de7be39f3cb64b1776fdeb26618fdf3ecdc1427d583ac518fcf74b3aa0a9c65a2aa1743633faba6946b8de1fe18b47777798ddef5b0df7d6fa1863f19c750fab599d3cebead778af13eca115fd2b9d300d34a7a5061a381582f0fa2e2323c423ccaeec7be9be7d932a13c4ebb6bdc6c40f37cd63086dac0fe1265db56f3570bab5846a4c9efdf65d0688639b7b42d37851a7bb275f6a4c19206e332cd3b253e9069ab0cf5f3ae5afd98b5c42715caf5a6b85fc95ee4895258a139d8c524aa952cd3925a594ca5a6bad125a6b2d9702192451121559ad1654492e055af6cee7dc30c2ee3d494a15961c1e7994913d487104288047950f3c3d28c2059cb4083c12e105d1a06204e7811a1cc9411047747064881c47783802e40810468e6064e8884a020dc99064861c3e49787033043d2a01effae70d64d0f908a9a123363ff820c708124400c2880c466e8c94c0080f233718c931a2c3ff0a233f240146187766e64508796429e703f0b5af7c89a391d6544a3b33f79c14fff578d327c1a79198d327c14cad32f2fa59ced44da59c1fbfa6d6f933726f1a2b08f25b1169fd6b6dced65a1b6f1781624c0a3783ee973f2e87266d4fa37dfe6dafc8a0b59db5cf5ab74119e326a5dc7ece39b7a79452ba7dae98d6d55a6baddb678b691d87d2d85f54d56ab1262aa84bab6d0ea5efdb6cfbfc339bf6976bbbbbc0635c9efff2bcbb0b1c7f0d8fa17dfe196daf6c7eedb727e5afe1db7641db305078566d60a0707cd9ef72d56ffc701a3297e0677c89af72024d83aee27e6f45cfac39edcf98e21307a983be97aa285351f225c78ba9aae8828a32b5f2f05ee68b2ac6d49c8ac38ba930782e3353150c5ecc7b35e7e72fa0e6cccf8931f2c443cda9da0cd7ee929fee9e2f45f064eacfef9be576d3ee4894a148e2cb7c24489658224912254af89c73ca4d81b893ee559e322bd648595590613cd9821c8d5858b47e31278cb9c16d621847c3cd26cc60c47761cc241905e1ff7020d0fdd2972f26a594c5a22854adb5b258d65a7befbd17931da7e3f5fb82d3f1fae5ad168b055110d555e0efbb0a98e4746431ee8b1519f4ccd6d1254a9b53e6020c140e9f6e182840317725f3c7fc38ff95ffe6b7597eaa1363b00c637ede34d3557c4a83d42534e8fa782c2c8f4fe991f848281784960f371705fdf1838ec05141767676767676767676767676767676767676767676767676767676767676767676767676f263188cbed26d08f1b93b7d6d463fa5c99a52fa73effe1ed75259e2f927f3b798ed53feb270f2337b949fbb8ffe6e9d9f7eee6ace8f62fe89e8a7ce33dad4f267af5fe6ad7d9d264f5fd4751b422c683f3749fffcfcb423e9c79e92f486911f7becf38bdee6ec4db68cecf3a6c95e6f1a14bf378a1828f64bd935243f79fa7977943d47bb86e4dbd33fd95d7f814f0ccb33eba93df6799b4f27965f9b79caf958093dbfdf991f633fbb0d21fc7945247a98c1d07ebe48ebd75babacb8c9eb8ebed665269de8356d467bd1ee34c5b58df167bc7b9e39ffa45da7294ebb0aedb494062017bdc5f2671b42dce44d76a741358a3dedb417755a77916b5ddf36d6e5fc2ed4741b42dc0cf49cdaec727f01c60c3496533ccb7287bf85c416d0c9c08f0d21fefe6a49a50c4320024d4919863004baf28154628912499028814409225b7601e6cdfdb0713f704a045122c8b6cddd6bf4ce769675dbcf395f703fe83937257c703fbce07ee07ed09ce038ae061c0d381b70a4c77e467efc31c0196f8450434869fd99b9e9a96e7a8230ca49299dd5d28ed3d1f1e5c5e9e0999bd13d73e926ddbf9e44bf865fdb85bb616c182ab885911088c8a70442f2392710934f4a291094cf5a6badd75a6b2d1033964f0e081d5f0605b55a40e83df75cadf4111c90201617007f3c49c8fd2001eacf8eeee0d3840222cf8df341ce4929a5b5d66aadb596f32128a8d5ba32ce0739a37cbaeb573aa79c516edbcab2aceb5897b54ef4f463d0a416444f7f8668cfd0d89c915e59b5c57e7eb6f7b7b7afc5d85e0f1adb3d7f7c99cde4acc39e065dc997b3eb340797ff42acb986b04ac11927fe12ea2aa12efbf3ef9cd7e9743a9574944ea59b1e392a8c922ff42d4e71bac36987d349076a156be6a44dc82b38a935a5ac69870965c2c14b60211c145d28a7035dd115bd35a478c0fc90a24e37689f412d6b81ee54a592325807eba8b08e0aeba87a64af838360161612632a26827f624c060484e46658e954ba299d7ce4e0558e0fbcca51e5a87ae4f85801d1c12bee868be6a872543d727cac80e8f450a97ae4f85801d129dd9476609d1c15eec951f558f9c03a38880aeb946e4a37d8ee7077ed957d3a9d54a51b1c642536c3ea29100ea18ad636e4cbb14077da934ff245febd3d1c0e9ae67a9a730c2aef88319547ce393927fbb828f82d64851b2fc1435db6c14331663eb58931165ed986b3e1a29c0b680f0e1ade8ff9a14762cc7c494d38261e3c404a78cf43a918d331ed49c2e553221428c6c8c74bf229c63c1e201db4279f4c38f47b56bb9b70f22ad3207336681afb9457fbdb949ad828c6d0b98a2e1508af0fe105218570beb5f6e596516371525476d7ee35efbe0965daf14ca969e98570b6f85cc12d5ee1a4fbe29e0753bf45e470a06bdddc139ab2387cb95bc8f953aaae14acdd6ab5b65a4b1f6a2d03dbb0ab757bacdb2c84d0ee5e3a554abf8482755a9bd5d2cd0f4be96f2cf922b1eff40797f5c4e5db70193198c590ffb05eaa8a2e92f6801f334e88ee374e9d3e7fc0abf358b4704de8b1b82f1f2b02877fe9c0e8f0afaceaf72d67d39ce8f2d447dc7a2ed6e112ded8b4d65a2b9d239b88fdd0aa29b569918989486fd08432e198522da4edb4dd6b4c3826d433e19852269409e746ab915aa49694c93707915abdc584634205e0c70652cb84c362431a623999522425a4252c38482d134e121a7b2e09dd738acf7f2214bcd18a744c3e0749991456d752a5b7f09e8352844e263b00390f663e4b8a766fd129ac2d8595c2faa107335f84ca3ff3dbdd5be2ee2abbeb0745283e492d1d3e9fd381eea4169f39c84381cfc7a4560072082284c811244778bf4141a694094787d5f30314801f5d44ce0f03f2410f8f11d6c4fba55b429d9cd82de305bc812da4cc5e98bced4cee7da5d397743c5ebf84baddab313297d9624fca8874bddbdfbd020366937328c1152d3e61123b38c71f0f12433c438cbb41d3dca7bcafb06450bef21363567a56a290152231e6480d6745593b0e098d3d87c4fcb7e91fa213ec39079e82d9ac08ea5e06a385c3eb3b4a102b4e0f66e2ef29283e5fd4b5f4c89799e5effa878ad683992ba2139fcff1e84e57587cbe109f9f75bde587671c7c7e66b500f19983cfcf38e2d59177641e3df708329fb26ab79f2da14a37fb02d2be94a42a3e21d5e1f357b4f8030026b129505d7363dbbeb49574064b27fd255ddab1416aa2b5fe5289874947a36da26dcbde647b9392d6dae44d762fc998fc9332271fa44e62c1e88186d90b0cccbc071363ed525635022942527af8944035f99cf3f578055ed763d26392a471a6a474c951fc53791453c5a720098931fd059174484148ac18d332fa95a0c7223ecaa7ac628cf6f35380a4e8a4048931d84f20257817e9d4c75fe32256157fed147fed1a177577192039fa8e0284f2fd0df1f95a97b24a01d2a5e8a404892e33622d123a00878a4ff199030204ae677908e02771408719299ef41c50b149f559fe7a160ea4d824b95b60f9eb4975cf60d977c6e327ed9cbbfa2fd3a49471c36ab02d4720bae4bc2510775e3d98f9b8cbf207bad79cd563a193b7b4ff543859b32cfba96d9dcd5e6cd889eb41d7ef3566adbdec6a78d4323d5ba765a0eb45addbe0317b8a92a2e7ba2eb9caee3487ad3934474a97d2753deafa8a127cfe4927aaa7e8322b8e6a63135d6610ef653e0d34d450830d36c4fd96301f561b29332776c2b824747f4314a6ac483a8f457df9f9df93d9fe3d19fdefc964a09a9381e4ebddefd53250b6b1dd55f8961b28083edf767593743670c3e614e3ebb06ed471487415207d3dfe3e81e8329fa4235f2689c5e74a106744f70cc4e7f714a018139104c518a12431a69587eef7b8ef7ef14dadcef7209c5aad5b0224fd42aca1f483e4a352aa975722f61d4575f9c5ec856846fb3a9f94d98c96492de0c77e06de33f2a628f962a245a2afd90bd168341a755c0f3a3e7dd8751b439a9b9cc41a0e3b1af4c44ff49b745da687ebed7577d1d7cdbda23a74f543c7af377fd7fc6658d7c50ece6b5f9835565e4ed0a718a343a3f40eecb755b6f9947540d5755d33b26cd7b8b8ae0b1fdb7dfbb1ad1e4cccbb6754c6115de2e32e9fb28ee8128dd03f190361a1d68e5fba26c61842f8f6efd7705bb30dd7ab4b7990b9242030010660d1a5bf1edd5f0f845c119c0f34ac58844ff00b097abecc7fbfc605be36a9057bf70d1dae3be386dd352ee811343784eeaf47856508084c80010d608003628c44f23ec6c4f82e0850009574285e2daad2a0f0e063619393a383f7abf572befc19f3e5bea1c3fb1bf2e7ee32413330decfc5dbd04a41cb9fda9094792ee26f38548f05fc07845b97926be85a0205a8da5d9b50d0540f4675b5ae5674b9aea1ab5f2d3e4351dddc54fc01e00508e76c41a60f61dca49473ce4969134d3451adb5d65adb44134d34d144134dac80227fa6ca1a0ee9cb9fa192da2138214e8813e28438214e8813e28438214e88133282119828421223aca838fcbcc21981f1b8b1b00ed6c13acf0d49197a922ff051a854aa8f5a4230682638d563215fb36ce0f0fbc60487a3168b434ef560e0a8c5e184f3922b2a20461c50df56a20ba4f3b9ecaf053d18f91c0c3a8713a1c7a27eb5b1bb9f30c1a5d4a93627420f46e2d5a623e7cf83a1b31bb1a2502a073d302115c40571414798502694291565ed4a27593395a5538cb55a4a29a525d4ab32f8b90fc20e66324c38549a703286b515ad66196509892eb4e7081ddf662f4c3810c223b4a9629032711521040757813f9e228ef02596582cc6dc1d8a44f752284324eae24f19a0d722966eaeeb35764d6a446ef2787b9148f4f955447f4df6156d9acd88de7e165115ed4173ea532a0334e3e3fb367b51ba8104887f751abb25db5d8c43a24b28987df5c96f85a6c34c0b85bb84da3aaa7596af80d85abaf76659bef6a3ac2bc736535b3cc26d4ac5bf31268707dd5bb096c7e2713f34acbc058790f3128d837838082f818570121c81781ce2e9e0d9c0250855ad6c8795e096ea3dec2a57125fe2c7d60fdde90ab7a40c0ee2bd00b50ca1a2036c83214e83a8a60dc5a1ebf75cac7052d0d306e3883127ace3ca792ce2ff1c8a314ba80dc531658230defb7adce58fd9ee570e57ce83a12a8eed4e4f38a20b8db5cf219bcdc02778ce39c61ebfe2182bac7308a3ae2897d4b7bfc2179850261c2274f0bdc01cf4fceec207a0428431ca185f655ed7857a5706c523f25b91c33bfe788cc0c133c474e98477a96e39dccad28cd1dc83c63a3de19bbb1a8eebc63f5109fd81c1fc792c5e27082b2544061a0a3f3247a6719f4eb4847a25e415ee89b81242cb94aac10f6a099b202ca10283868fed6025d2f09eb59f03453d16d7ae66b45d6a469e8173469e23bd33525e57a72b9a63e6baee75efbe007c62f532ae4757acf36022ddf434572b242b2274a73ab3a652267c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c2cb43fdf7e8e6f5de40765d47af4d5f36022cd2e909c11dda9100ebf734634942fab19b8003937040e89700894120e8172c22150523804ca0a87402987403904ca21500e8143b821ad163724de11bc0370c480c54051f2256730de7371c92dbcf792bda05aafc936b649302a7f29a57c491fcbb4d31efb8c611886e57f1af6b4ab9ceac4984e5795e70a54b18eea4417989fae709d6ea8f4edf46635ecd4d0000040004315000030140e078442813896c69aa0c91e14800b9194425c4c170aa36112e430083292306388214000400040666466040275e349c7a61204379926993c7d9fc9dbc544776fa0d341cfeb2dbcd9a8562c2e9ab686c00de70f51aa4a3c63622f188668a4044ec6bef81bcebbc5fb1da9bede04c045d6678de7dcfc17773db766f8aebe57336e4b08020c00526b014cfd4d84653ef2c8dc97c87777e14e733290efb1f9d11d11472001efa0612e48042704b99197582ad4d3409e715127ecfbd478e5c2c1dc2747880a3aecd61317a1a4fa494fead146712a2b8286b8e46e6de410cf57d1de184749627e8a64330706f3e32b2106387cbed573ab9b3e60ba3913aebdd43c05fdca96e703c5098137c80d77cb69778bedfe32d1269ffa6442445b33f0b949a8a9ecaf3505d06f7c2234672d06ab8eb15d7f14ae65471e33249cc4e6380d92ff97d39efd8ac4ab29f1bffdbf46246c488eb46aed0801496309c75768f57452fc442bcf72e2e1e6af227c0ef9880c6c11db27b7f9cf84f0a6cd0c69915058c2e6c0e24f1b77b5ff08ffa19b306a1a599dc1e6a30134d948f3bb5f27f88688aaea1f067de4a8485b833ef91f7d72c5e709745281b0c8eff654b6f624e94480fac4314c0df7dc13b75f098f6a7aa70ef8363eb9e5cfa4b6e473e2e0ccddaab8752ad08cb73961e22ed0d406392979e53f41ce8f2bc5934026c71bd215df00056b25fbef4f1321c85ef72e4abe4687dac2c1f84546909da21f66d152b57f009d699187daf335c0589c928e044ca0e37d75f9cdda1acb4e8bf647f9bbe09bbbba2909a1c2832757e580b01c1c6c813ad68221e5052a9a7e499f637134069d1225fcedcf00c06368bf4291d93ec531337d51abfc39b9a660bf9d0f4c4d63d15e2e39bacac38e2c12ca738f9b73c22559da16809ade299f1f3d5fb17a400d81aaacd1ccb1db560e9d3572f04edb818351549eed9221a71500705b9d40814275077c1fb2cb200e06e116c89a6023b7ce0947d9098cd79121776a8e46f4a98042193724f721fbc80a97e5daca689327a3a3c53884015dc4e51474030455ca1976cf2022f532aeb19406f49a0995083af11660ca74ceb7bb8de4ad8654a2bd9000189713dfb60d4a5a910946476371c81e34d72a54a58516595eea06e89135257869243736d8311497d6715c486f6a007468f0f86dae4e8a448df37f0d340b4080c161dcf574d27b869baf8bb092f98377e7359348974feb4fc57510862ca050d8b2ab7b3561bc9a2b37c832b1cb4bc12a6c9561f89dd51d822e68b9086c05646c3be116e99ff49d8a15110cc442d519b2b1659db17690ed37da466077570a7945d05566f20cc4bad23991dd0728712c0b49b85749c58e8241c5dd8bde2642f2dc8eb2589a477436839c917aeb24ebb20578472ab85a9ecebbeff5e218ec4c20d88d59b6d54d4c10ebc5af2318b68703c614e7746f2033c40ddafdfe0752ab0e4f568f72d89c48314a50fa3064ea6a78887369b08b23b189b0d52c537db28a04e384143e422c04e3b2520c204783402b6a63c4fbdd5c27432d2325737e24b89449c03e48fbf21488a6ac4453cbfc3228523882d298bf3dad0797d58ea6c6ce71ba01fbc70c4c11fee11cd35b33f63c78aa4601f155d22d59f838e6a87b92339be2826e91db8d2ef7a29d32bd8441847c131900ff27e25b3dd64a98a7112b9c6f0de2e05d14af2c11559ed11d2818a200a00fd91848848f6bbb2ce0d86ef2119075de433a3a6282a7d4dad795e4000bfd1929748deecfa7adec7d1f6f240ca369329233666560f6a3518a552f46154177897118bb34bfae6a4587dc94cd3b44a7a52ec5f189157c9f7275f697e37f396984b7865e2295b7ad299b1adddb9cbef288c3d8376047e96aef7fa4265f476140624158d07953b70bdd92f00a8282ef8b9a31985c78fbf45ca3d3ca3e528a78a0cffecc40b9833a95759c541084a0beab995d6997752e45abfa28c949ef95a85dc2bd546ef57720053e74760baceeadfa0e6b03ca7cfa363e40e14beba0e72d513c1c9a11f60a017231cb2736480955df81766cd4650fcd72872551ac3ba2c931aa07c580935a994d405e03329e7d1002c03c09a450cd84a5eed019337fc2578c3b12f03da7e9a7d4a32178db791f459f6f0db6d894c77b5d9821d50f004c3af09b1fdb02bf8d05aaf626f8772d19dcb3d17f0b2587dfcb5a728c5c0f346e7210d3a1b2a74fb96c1f43ade9c0c6ad9b8d138aaefaa00cf48906224ebd6888d17771c59d2b74773a2618d6dfd84e5a016aa997751bdecd287ab12fde2ca370108269e66fdd415531ae6f4f41ffa48b10f3f2fdb119dcd2081cf80d94b7c75b970e260b2ed8fb8435a5a1baf0c84eb43682de1e841bcfdcc354dcf977810d51af29ab04e0a1eb71e70e0025e668bd3c5703f91026c1c2ff1a9c3fc64c4c2804308a6d15fc54dff2be26803991f37b215b7a631064ce68bfe144d6f66cd4005979d714453e90d73ebb3ea577fa70d9aac030cc41c45fec1ae5d4501e33457e4800ecd8b1a0eb112c92e499e2717d6a4cd83d01db0fee4a2bbdb3927fe0a8791c799899db603c561895dcc378121a066f41ba4846213bb92aa446be3c7a6f1639aedc35f08061baca2bdd38eefce8890e948f1dc428bfed59d847a5c2288bf029860744516ecd2a7cc3ec8da20d6b318a1c3c1e806aeee613a1b51f5400e9860a1484c61ad485455ff0041a1d457924103f3a4c43db89b38e1c8a7bb382eab8aa38029510c177953d879c9c74dc29a78880e8078ab08448fb82fdb1989407878712a62d217fa9aab54ff9835f06071a784b4ef3090d79f7fb9458142687d05d9501a605e4edb037e1a8cbfa073d468b95eb0a873e9a3c0c85c4d1e3b18696caf129a32ff49bee5f031e9a597cc072d439c1269f235528eddfc1be1e8116ddfef54dafd95a2af86df4a8d8d5b71028b172621e01b1dff0815e5afc8a4068837dceea8cb8dccad20699c8c74a8923c31e6f9550af0e64fc15011bf3f69772008ef54ca66e0e02cc72df58ebfd5ab9bd3579e820e80befa8018db914edbd08e303a2f05a7c063a86a3b3464c6f243894e6756589db56aebdc7e04625f1723319d60963aa5c7e4e207408e26afcad55d18929280a23ec791c51c2829ee2b9d3b8f1f49c62823e7d0c3a8f5db74633807f525e9e2e8da63598c90ec74841ce8c7ac2ac21bfbab9be8db2fef22671c9636c37df41db822acbf0fa58420593b51b70acda7f3d2fb493ce1399799c9c6242fe4d1ddca8a3553f9bbf0ca2667caf15d684af35ecd1a93dd50f6bc12158ef5d31d9fbe1368fb65e8721ff947862f14f24ab4f285fbe94ed0f53a6194ec6c4b80b5d83180337ee2dad861a28155f6c1db006b722ade20d2a78590ed0d86fcf9ab84514f4496ccb694811cbc5467b9bda8be9edac7b9dafe4b0e7debb71b21ad97d127eda3e4dea0d1e8ae75023cc4707ffb9a071c04f48e67271870c249ad4fb35dbdbd801492fd42b5198cc821599c4602551379df5e840e3485e4ad61838ca3e6f41055777b6ad08265963237e031bd21a9f5035dd50ea16c3cfc681e491337354a251e3d33d4a1df0c2046d8b18607d5ffa40f1595a8490ba2ba40a96aa5dce19c098dca74bc1381b0183f416a3298837f842d024c331007a4442b6448184e9b8f59029a45f583257610e4c9723b6b5692b86af27cc069ffb03d2aa198ee163d9896d25fe5ed9de16628f4e20607d2b59d7ed3f9ac75c930381fedd804909b48212082fc501e7651742f95277adf524941c447c7a7e4fd877dd6eb5b37c24928c0ff2be21f346efc122b1d5bb84cc33645ec87d02fd414386dc642f8432ffe017e496f13f2bd906602e25a650bf3e60f632ed5a201c3de2648d2885d1ece25aba54ecc00c500d97e1c5d6ffa8a6b46f9225c2b29e20dd147d74fad377147f4f3bdd7f3e221e7f00d6f6773788b7368bddac3d591eb5425a687398a214faad09c73ef9ba080bd3d34f235d6766f141a72e06b9f2d1cebe737d32b04fbbae7fb6a5c88ce472e3987165eefc7c610515d9980d992698187732771cb0325eb98d2bd7c1318357c78e59fe9ecbb2f175f9b990af081454d37c4a0539882770d51265fabd8010b89c7d0219de173a80f22b6ecfbe6977e6996d888a06da270034c92073f1c0185920a4799e8ba5a798fb73e769979fe550d1240da34f463e749c5124f6afc1864eed79fea9c569fbbc1a2d194c79dec6e106073e3066b1fed3a98944d8928fae622683f18b28134627085da1d36c005f9c651f1314f2ae3910726d8cc7269f984a2106c831f2acbb407eb0ebc510a0254b1cd4e21865cda390ba99878b28ab53fdeae6d548678251ddf8846a32eccb587c67c1fb762d85bafe3dbb8a80c5b89b46b42ed03849480b58ec736741aebf5cda7ca8ba7b388277e1a9a6b49913cd3d849be1040430c350aa50406b5942576d27384d7c245eb47319d7c00c649af2aa249de727097408801c8301f58c4e58caa6d5dcb2f5c17dbd1303fd0e3251389e1bcf802de3dd345be803ff051efa36fb9776eb47483b79617031acc85bf37dcfc96ebe2e9ee4c51677788cbc210595f03fac5c85164f12274912ed708d52837ba9998f5499e7bd9e6d14eaf5597d8040084ef2d66c1e1088619b29bed642feb53747a95bcf8f8d84f0c995e712d7c64c1b44e5e72ebae40c25e5b615c81ab858c7cfdc1199a301050fe05d3c5894e13fd4a46d123aa4f24f8e30f5712b0d183e9f7865a2380a081362b6f27a4a3383cedd17ae81411bf68c07482d757df7899a1fc733dbc930a514992dfc8e496114c2784cc4eb63e877523e814be3b212f18b2ca436be9bdef198245082bc83a8ec90c3bcada4675912d30b489b741f7d64fc678c2db13fc65364bc546139a87f627253438066f3d3556e1b7f345eab928ff5e265c4ea1881c161f4a68a1a16d76065a8092492e07bc20a1f97271d5f4b57b12dd62a2403e91bcae3ae09b0f8f0fb18ce2a68545f8d62953e120c2219b8923be60a390a245641ea35a7e942fe28a27e42fd4ea390d06c9ec078c2e5096a8d340e460af580d3f0647e799866c1cf77a5f366082d5f5e4bd9d430a455db8e68acb6920a8b05336146e2cca3ca45f8405b41b9e1e2409b45c7a5644423e0c1ef423cb0bd1d60e8a0e3142bee102fc2b0e4f92635479b301f629b98155f4979d51763e6bfca5ac8d95500afefb80063de39147c3aa17baeb5134b3c9e4bad074c3818aba64fe9e901bcfa9873f138fc03084e729c3d513e596735af3880f1dff704b85250148266117668554eedc10b5433114600f9803d8cd5618bb8bef8ee561eec0229024bfb220a51c30198701cab7000e1c76d98382e49aa12477ded9b39597196fac08ec32254b7a4d1b0b70c56e1d34122d341627bdf698e57801e0093502cbf677782f23f6155c4505c9376ff2ace3e07c508a8b921d3a77f82cb3bc23ea82fe418c79ac6d9cd835a19dedfa663b9eb29b05613da6f470fd040d70978f403c6c0e5ae22191ba37b409fde095f4dae12e2d237663f7a18bcd5382cff71e3a20bb34b074653640fc7b91ccec6f6ebba04bb8db859a42bab0798a3aad00baa7d30910b5bced35f3dedaa4752a596afb332fdedcfc4605446851b5b794113d3ffbad7680c340a0985b6989c8a027351165d86037252f656b6d13769e251009a7b95080fc01e059e8377425d5f5fee7de28bcdcdd3bfba91cad07821f2b4513087154b6bd5bd2b272eae51e2a31c35a96ede1b052648620361fb4fbac108700489c1c828982efead0eb84154090d180281107fe8532b4e5c7f4146ff81035de19d305b9e96bfa0e5d9118efb3a3ffc4b6a7bcc32048e521f33b768f30bc237f55e346dcb05e1f7cfa30c1757d5975252a2beb51be6c18a56e4df97462030f2a97263ebb4cb4f5dbf00848ef4616eca54af80a9864395887573efcf7cc1c86a74cf70d09b97576681db47351f166e42b17dd95967f61dfb6c35680604c7efbfccc3a8e6765216a8eb49347f830e08d3fcacedd2eea4157c2615d140197434c6c02ec7df75dc0f8f9ca4bf799492270cdd60b134c6ffe79b96b6251641c234a9194a59fa336210932508264d74bf24524a93ee217ab03ce758a4118cdf4f17a60cc9163401f023acd9b7ba9f088056e67229d72f96b97cc9c5b297aebe72b5e4a5eb2f5cbd58eae22b97afbcbabac4e56b2faebe7059ae5d0539dc62c4f19be1a705c55fa44dc8fd11f3e907c09756c4588bfaaa8ba1778d459bde2dceabb21f8a88af8bb96cb9bc725006f8c14aa6c7429b616cc39602f73986808760ecda759bac4a7e297f580f831843aab3fa686bd78c5e5bdeeef9ca9cdb4cd52e523ecc7dc300bd8b049bc23d85a13c915593679f2a70313a9655cb8c8d04547844f43905edab11b17e6240f5bc969e4411e8061401249ade2de82989b78648bc0bc909c385b5670feef2d19757b71f024c28fe1570aaeeb1083ac7206b5cf50d5cd1c1b90357b538b3d3f840094e1b63c54c50a6a9a8fd7ae702ba576ca9f039ab32b4d0aa1ef2daa459d53070ed336ee692f1e7839841be7a5f703b854eac9ac181946f1a00680a37d3716632cd36f6f494c395de0f595055cd3e9f9d4057726471cd15b9f4d9dffa3e825f200f8f4f8fa5b52801a09d4ae0c3ed152eed7947c830d1ef92811ab3b3df95409f63f8c2b663670e02c64134f957ff333369047e393f8be9757efd4b87d0eea3975d8e3593663c6ca7028afa07e95ee362370896cd9c45246991e4b68bf33822d928b46ca9cfd242dd5cb173c9eaa7503d10f6fd2b5d5d8983186cc0a0ec48498f794020f01c1aaf81606fb89922e72bcc3483b9071557bdf6db0d991bb84771e110c5b25fa0b091e90981777d8a57cec89f5799046f5ee4406f4cf3c2c57f2c445ab0543b598528c2faa67f5fcaccb080970a1ac911d1172845105c24d1a957090283304bbe9e7b5d9b01da7207c42d722fa06ec267bc2dabe7510103149da60455db2e812cc286022d8a3e4b5424e5601b17efe41778c9427de0c12525afd81c3bf2bef443a83a37f6460eca01f10834b26a488ccaa234f8a96e3138384ac1c0b614bc7e5ff343f57c96b6e2110c4e48826c17e1b0dd54b840969fb1c2533dd0e4dfbd9587a1f3e57bba2be12d52de73ab3ae8ed9cf02fc924b51fa1cbbea2fcc28b922fb9bcb0d4f52bae2f2c71f98acb4b2f94bfe4ead52b972f297ff1cae54b2e5eddb5d82fc5efd9621e7f105ffe3d935885c1e1ca9bc0b815c4dad2e65238fcf656aad2f0acec90e9bfad99dd877fc7948e8a797d2f7519693927301a2b93d9e0b6879f8ce3cfa552567826772ef9bbd2e711463b8eb5a1f8080f3f78e917e73de3eac3cf80bc8a896800664d5d039bad398441f4f0e34a215263e26761c10f3f95347daae9bc9a2afe001f7e5e3c4f059fafc68102a853686bc6fefb37a414fa76ed0753e13b19d9dfc30f56823d17a9eea0516a18e9f50f3f1e3d6ffee36420a5d8caa1674a616daf0b14acd76a485cacdc117e16f690c36fcff31338f94c3bbb1fd0f5c378499d061d1f134395007cf801409fc89c3960d6ef712181dd19861f9426242c5d145890f525deb9de10071732ce9b436de48b121fc1456ee6a61e0c72431f7e74533c94e3879fe52704407a3fac956488fc37710961b30fda54378f2d6dda50dcd86b0065e4cf8f5df5eb71b4c72a974b869f3dc9b12e63a3d09c0fc8ab580f2d4822e1742290f411565b2c9cd018ca03861f090e85ed8103cd3594737f57072597ebe28c46ffc8bd0110a6a943bb0b13380c3fa81e20189b632ad794683be51c65f8b153b558f9e46c5ed0cb1cc0a7e383659cc0cf78809ca6d2d97ffb8fd9452eee46ecbced4e0d66961d0c3fffba16d35cafdb1d39dacb3307ce71626eb0b16d984086ac1254287e6975f58954e8e206e2a2b20f97a4c81b980590e72a3a113d806107c1973a2bd2e8427ef348789f6519903acca66f9a8444a00066b5fbdfdb068038a7f38b965a2b33fcb0ee8e0ac361b341d2844da4a6e132f9d4d48069db0eca36bda6fa73a505ad6560e688f4c72c62c0417a0c3fb0859b9bb4ed187dfedc8cf3514ba39b95bfeb41c32ff18cbc8b6685cb3cc6e4616cd38d44a71b3d4d7dc0b0b25837ac346bbcf71ed91a75650003bba197b6fc8876434752d9658713e56e35fcd393fbb6c352373bdf6eb093f0fd7723a62bafacdd8dc572fc6e8c8148b0f0663f356cbcb957594a11d3ca5be4f4030f888590f7dd0d8de0e8d3d23aec8293e0494dcaf47b427ab48c9452eb2954d228bb21d716c3b982cabb7d5de9b3ca67ae3106067152583b4a230b69ce0aced66bd2bc0fda912f85df07dd1ef3dfbe04019c09faebb51dcb7d2281f7eb8396c55cf725b4b791abb28e20c9d9423f2778bbd6eaf24994d247ab4523cfd7474a46eec28cab1d2127f0a0febb5e1b949090ea038ccca6d72df153fc64b04c245ed7b999a7733ccf9de757caa918207081b2267ed246fddbfda00ae91912939d502e9d9db60178943fe9dc55c09b61fec6390af146436faac0ac1cc2ff7ae9dce5e1f6a07174e804f5f4cebf9e7a4d032a9060fe40e9b64077b5e4bfd6c51fad23e1da6ff5a73c248223ab4ff4f40e7dbd866b50367a05f9fa82083ac618e002657ed75eb58c88924b75f7c00e77b57bff6c8a12cda34f027adf35f4bb2ea684f32be2a4beaf5a8a37ba08c2ace49c033132df5793d42b6c18d234bde4d1c0e77640871b0b0450ccbe93daac6f7e908e9f24eb0b52b218a34c6e89f443f6fa294002242a8e73228a90b2bb8844320c0941c03ea5f8c92f2f826538afe64795ca96bc1645fc3dc2e8fdb6442a871d6dcceef43a58e412f7f84ccd8adfffabc27aff088e6e780fea1e4b60467c0efe3010630c059dfe5c8c5073d1fb2ba61162ec635b137805f11ddcf12d6719e3766d471455dc0d21062ee94916e31bca8a246110d4fb2826a10bca90cfcd26a17b605abae6d293d02126599154476324c61abf9c482ad4104352c2444321be8814356208ed9450be8e12fd55ef41e970cab51178c3abd0b581fa7d176d3c708b5b091fdd4f75cfd8f8d22c5f7b78bed0a95b5b3e65f3e96af8ffdb80d74a981e85af75b048dc5b3edb0dced5bbbd4520775538de3dd04687a3e93a91f859d40817a028299690265c9caa0382fc051093750981abf5219414f61f9e2a9c60c4eaa1a8ff21339c7d5a74c6ccf886f4bcfc02f5cd698a6a52b1c93af8901d63e5464214602ee88f24d22f623db9c64602886a27665102dac2b708d80c9a89afb48c9a2ff727a71f4c33e72daf4f5ef4defde13d50036131761faf3c7621b280472586c1584be84bcffda4a1bb51f3990278b06b5b45e084b8fc1361156d4185c2116f5945df9febcb6b49000eca16132de1edae56f7ad418bffbafda9a93772fab8cfe1d106e36e73638b2d44809675fba3b10e20ebe3c4bce98c3434118606645384db3ec35bad56efc32825fb3bc3c0ed14a0b2526113b2d389c0299e401d2ccb14d1060d6cf14033b821912afa6c8f270fbdf1b236ac4b939344a962bcc33428f734a79e671b9441db4f1ba510c5053224fe29cea8981c0c2f1c888f7d881071887133bf504985e531324a9e51a1879803f48e0cc2520264fe5d51279c8a991170cbf685030d0f736209b8814b5031866dbc9d0e6cd20cb619dabe236365834147cb85a3d0ee9ddb881cc2ad70dd94d5342eca1310800e316d87f1fd51c012720a81dcc45394c0a7b02f0ce1ecdaa73b8fc4ef9232d9dff5b78fd3152c2456d00ca982a640aa83102e9116e1f81acce8285e563168a08742ea1e2394d4e1774eed8e3246a434291bc6e23171ec42fde19dd10409166c6641ddc30a947280e622450e8ccbcf623058fb0e84c1c8e63018c329328f6108c230d1413578b84a72bcc159cbc32b0c91b3ef361384a8480be0255a0bf9d78b02cf415fd375b828ef718935414c13734bc212d3f601565e3bae63b88d1a88e2d898f258796e08658fad25f1d8c76626fcf88c6a44b0d02582d18c61b2ca574851bccf02207c0621c3e17a797815a86785fb268b51dfaaaa725344945522160ea45fbd67ec789a0bb1c4c60e87b69a16444e34b6315334e0baa8b2a0915c4132e9fd4e4ef3f4d200e509840e7e087ee5c45f16ee190cd412d4f3c288b99a30dd92267e6de525a61c026302877bf2b9d076a0fb04ece82200bea82adce7b4052e0cc2dbb4faa5b552e5814dab3c243c64a31b8cd1336012dc41c6eecb2c479540898dc7a8d4225efe29e3c3670f2f56cb798068c4378249fb06a28800fcfa5ebcc9337a1b4ec25dfd4131b426559523d5da98dceda60766da4108535418f143028e7d3ca3dbb4c3506168626bef1b3616c923a81aa7ec298c97176fb8906834f98aa4cf2034ea29802bf903fe0816685903ac2c3e76605569528b2b32ff0e3444c7076e1e47770ed0cf8ae01b34520e2b0cae90d71615033249d90316bbd95e633d222362ad55d7ea077b81e5dab50e97be09cef2bb4a585a3750eb9ffdedb3087990847c3477a1e306cbfb30319994c1dc96b4b2c4b395418440cdbbce530999f7c8a129730f924c35e63c8e3c754650ea8129bdca7675705b3ca990e634364cf299277ec7d83e90982451236b3fafe7a5f9623e43826ab0fc39b125e5f6e09e2b19aa388898b41c931d32f9db075872214ba9a26d2b138b99433fcc3d67d8626dce7a045ec102e5ea17df35800425843aa7f7cc2da6e862f41f5603b77850caff99215f7664858d57632acd0c01a840f966ffde03f616654bb8f725c3bfc6c70fb489dc6fade43e7378a547e0755bb847aff4b81275c6f416a5a945b1ae2757b269b4f1c240cc029cb76230fae6eacfa335925c50f581508649455759771e6dd8a6765fa59eb662acee948e4e5ad4564c75113a76f276b1e0109f86470bfeb9f3b4fef03aaa2d94c77044127b74958cdd9983f8d9c3be8f7fc1f2c103822ed802abd683b507842aa6ad14016da52a6891e213a42c5016ef264681f9ca1958188f1e75cfef38aeb681ad0585b5b859a4cd3e3aa17e5f1fcab3b2cbb1f6535fe5cf231bd08b01ae0c5e400127b1a76e73beea4fb6176769350da36687721a2fff51b036c09fb907b4553e983d040cf3a0fe1698973fcde0e24e69ae4704dea97fdc83e9d5b97e5233e69c3bf00838a8846a67722a02927138d922916d0955706a33ccbccbc7757c6fad80045a9ab0574afc3e9c912d4f137c4bf3a43ebe45043cb3f176b37d87479c5b01c29285f1734fd6cd36fbf47081a4be9d50b5e10258b442cbce4b6f2a6a69155fbf4caad31caac4b7fb944ec99eedbaee06301772d8655b8f1e557e3c9ca3de3f87fb7f6f507f4820373793089cb922d7be0f1312c8a82b1c58862f38ec9c8a1b3d1bc5f300fe474cb6ba55b057e76c2dbc23d13595ed5288697cb9a09505c202e5c840fc89707fb3b8d2402a9a048d3350dcc70d60f0fea93f7909c24d7aedd95b144d978726f4e9be074fad51c24116507e49e1d33cd511f43b75c57653007df102f7e7dd79c59782be2765b2cb756051dc174f662377a60f37330a7d9fdc23a8e819e2e64c8b685f63b9044cdad35cadec784c4be37b65394ddd6abfa383b8bf10d746d8e03da9006d651c187ea86d07a0748705de20f21213aa1844f736d8ae579765c393de1b524b40f4a76b65c559e7e65643f4185802e8773b536e2a553eabc2800047df99ce9d6b5e9ab2a1d2097ce8de856e4f6551007eb4d08414dc3be5586a5fee57b4a9bfbf75319070b78f60a7a926b9cf9268cf2b8f092d66d975eacf5ac38b89a45dc1b8e4444127b26904f391d52ef8ab29e5faff5d74499aa305557cfc2b39603213609a250360407424c6329cf8279a6ae084397cea073c4f300080876dbf417de50b78e411247a94660665f1727ae042f7402b073dfbb9a65ccc847612435802b32dd104449ee03d2e86b66d2d2681253956ec12fb50bd5bce14877f56622ffbc8f20d6e8132d756b55f5983c968fe9e6fff8ce5b8f69cea062671c9d04f096cf88d9919b3839686a00df017837fbb02c20a763aae832ab14d4392e1f9eb3540c33e64b56c4132db3bba6750649c34615bea25dd8a09ea480fd72691c7ebc24ca0e82385761e543a7077edf9f8149645baabc14fd4f5fd47783bf10fae6666a0bb37a55094ad3f6995f096b441c130d00c6fc71bf5e44850b5197182069e217984a01d4d14f7f606d9e56475cbe658f339d035e0821a7c882e89a6046507303a927f13c09041b5fa1b6151803c688811530e192025714354edd695e3d49902703cc59cd3b306adfb1541c65298a1adc5821b310f6765164507a29952a7947e014fad969339f9fb71d4c5f7e495edf4b12a4542ff5b824ed8b56e2083512115b0921462eda40204993cbfa68cc0c2b6df52fcd389316b425d6f8587d8110f69b73735756e6279ad091c1601f2ee9f60fb35067762d1a9873f4aad833f2834efdc9039364273710acb6a3d0dc91a79bef05079b4f6c82099fc9649ef98b5dd3cba04e4f2ef72c33d49c2683cbb71c48b376620c7adf7fb888f753f23dfa174a2d741bc6d98d18511a5112fbc2805318ed4bafcc133294a11dbadd07d7b5cf65bcbbaa2f7fdcee4efa689524c7d0bb36cd2aa18d13df755c8ae807ce198a4a35fcf6ecec45606e0e8b1a01cee8b123f63b4d8f1c8eb106d36a6e94732680ced3e3fa114354d2d4c374e202848e35b603924a985a7efc892c66794f34524e500203a7ee168fdcfe3253a901a9d9d02cd31acc1ad79387dae418de32cfb5310de662352a61382cb607c905127227a71143beac4fe5332d5dae6284b0a51ce1f887c5134e8fb0a04b89d689f4e3006a2c941d1904e834378a79b95ab68506ed316e80d7a3a91fcaba68c9789f22400edf883c8970a1c80615eb53ff50aed91700460cd4204c0960935c60ea28523260605e20911d3d12f4925404df0329dc8f2c9711dc0fd54dbf5ffe4be2c2935b13bcb8cd38c09c3995d308023899d27e618d0679032f44473e7132dc3d4dfb75ec98c574f1f50229ff9507c9ca96d66a816665181c7fa7280e165da089e19db41301eaa31351711fd813111063f38fb5401d753c0d4e8f50c0a4d81264131eb41fec851e4a837d021dc896762f55f12e25119c269baea7eef5248c3f8b1ff90a6603fa2e2d49ad64159e12fc64a055b62f4dbdc72dbb09c8bc81a54e75c862acaaa83433db7c0a80dfb26906ab0952914ffb26be8bf76cd5203bf170240e54a80dc0e5c42a14d42cc74a92768cdf329e195c8171fb18f336a643a3dd12fe54ac36db7d865a5210d53b3536b80cae512b8edc786c6438f4842c8884d99c3613093bfcfa58b736f9663cb4af1dc8b81776d2ef9130469704f978acd47320978bdf4228800bda16d13e39c4710085c4a91ef63adf8d4e86dff50f779f615f16fb7805a2c0226f04009093da5143e9d700926102cccfcc5907fc2559b3003a595eb8ddabd189547c3f3e58edfdb0d741d19903b07148d838b3c6b37776ab674442c0cb6586e6e7c79cc2e83cb938ae2a0fd0492c185c80c7eeea49c6e46b77d0c98c72079aeff0b587db0df20f823788b0da80d2060633722dfa41ab4ab9e35bcf9e9c9d0c319c6c8b8566869253718910f455b12e001e35efbb5558e79b53d7e6b7b5ecb0ad21e3716e682d1856981c6d04f239facca1407dd764dac063fda6fcac89468d8130a4043585b740b09282bd6bf8de66267f93b6a42a189f18f758b051eb7c3ac73461803d850cf08457c6e0d4b281c1c9d500f01278f4a2882c60b52bc861a456d71b13a3c70b6ac426f930a029525672ba5236b6ebce27d948717596d8b1d0dccd96d4f5b573cb8ec2250967ac47ce0567c9b160aa96a66c5baea69142ba63259012b6a25f52546b9159cc928b67b8c250e89b387b4ba28c2f5a082186d07063630214c7377a0ded840d711025492880a7455df73ffb6636dd859d7073e87df7d08a433a5af304791e2f397e4b82ddda33a236025d02561330ba86e95afecea7a76c5e330540d7f4ac4680d3e14e7cd049487aa72bff612b3073193448885a18457420c20d47fcfe791c159fc3451fd04217743b5068a1dd82505c1d4697dcd1647ff3c22bb9bc860bbc7b5aab354094b88018cab0cfc280081eb77b6af23cad9cb0f94c06dd4c60fb51e9bcbf5058daebbefa9c6f1871e954780f602441f85f33f5a462909403213500fa8c42629f451f4731ea636273e1945c2096e73c6aa657a8e6a594965d79b90168a06980d9ff79f87480d63b096985385c22535b192294689a9e3203c7b473ca16154e6fcc40b09ef892ec6733b14b959d44ea7669c159c3810ee056571a410084b9100911ee9599329b533a0cfdc71e398a9507bf4d5e87f5f2fa72d00510894e23ffa94fcdc36bcf167ffc15f3fc8455f384e914ee0e05fb59709a9b38c64011053ea7ca74aa2d62ebeec17a65495c3e72a9ceab843cb7eaa410d9c72737d37945cb18acb9c4da9d1b23da8e21f1250d07219400ef3704af7f040c290115aef02a1770b8127066f5254f77e200f704986e753c9610d196fbaa686d5157b0c3ed01593f1e8b39a9a7855259c1bbb2d6d8084b360d93cc8ccf10b189beeb268bf6cf2f4eef8287cb145eb69c5346c1c8e57b923554f3077725835e26e8b507b9ba811c0789a0b1abba2e0169727ed7a256584a30e9a01da42a61d90afaaf80284c93686eef6b193b6f805b603e27316561c053b2011bb4b183cae0532d20526904fb565784cc831a8410fadde9df156952b72d78b28c75036ac98810daf33ca249c1a043938cda2c3a6efd4a9c17996a48544fcfea763fde8f957cc3ec800965dec85a47ba146087d64cdb14743713aa1441c1763057b7840a90beeb8da9e881a0bd4e389240086e80424ec7f077eaa5fb26b44d4aa6b214526a06c62f8126a4295929df20655b34fc2f9c30dad1f3393e7ed06b2dbeabf3f4e38aca8c53901d9dc1aaa8c8af323b065670d75051220830ccf81a08a6f127d121c54cf0dd08d85e8c8dfa0e67a12f90133a743efd6007fa3dee57f67a886a112ea2445dcc7915b604782b562eb6f16a0b333e2446db90cc760df76933d7fadbbfc8e385af7be08465b89ecee0f1bffd0dc62876fb0388774d8de30222abc4a91b8d083d4e7938038158d3b2138c4e116082cbc78d9c9e709495f0d1e7f557eadf63d1dcc1755b562e6f52aff8ea51171824bce63f340517514958bf491ccabd30bb6d602fa368ecb077e66c86c86959223a0898fd402c98ccd76b28a62bb4083b49f732f877a16f2e0a2d51ce846223cc891747ff8734b6d09b2008e2651798078cc4ca353021b7d7881aef9a0c56d2c1d40f89cc3ef0d7840295f3d62ccc9fd0751003d2191bcd318ed64e346363c84c264f9bd8ee0fcaa3ff40be0458db5068fbdda9457b369accce3c524d65d25c13ced5eca9e82ff9d01503e9509a7e04f1fe125ad52b933dcf1ee3d392a0c2bf4d43fd07802f27b7402dc76badf904b66478cfaaa094d8b83c4c661d40ab3423133093f5cb1c1b599c478957ec881860a63cd8078a4020cb003771481ec52e67f1f7f1fdf6ff26787ac55f19f128eed445205d21c07c69973bd0ed7fe5761af01e099dc963e3461906fe3f623c2a9f8a50f6bbe236aca2a62beb903ca88333c1a024db5344d2ade301b9531fc10abf15fb7723f8d93d06e226f3a1f11ec3d127e3fd3e9a535eab01ca1205ec3e9fc8d0314405c850d81281f419c5868e968e95c2aedf40d14c70bb1638c71553c15b1f0b72ade5d01c06ff671b7932280ca020114e472e47b0df75f4c96c3971a4b87c94e69702095005e1e0092a4b5c30299d973510463d97004f33834b9807238eddafa9901e94d8213287e084ac9dcbff7e59427c1355f035010131248aa8708502ef2c65f5a2057ef2379d45aca0eaec3d8b9bf3c69710c4b226f5735444d8fde87074cb8913a37d22ab6a49a20b97abf375df843671b2f3e54cd7c4604035a41c7b321b41af4dc6776c4f63ee61581af69cb245761febd75d095a1bc8d407c1dae329491924522227ef489d80249230e472b69e854133b26f82f6b8bf351c794160ec25cb7ae263dab1e10b07ce638681ece44a8552008e833eb9148c55f3d1a432024c56d8764cc4737a327c92d1ff3726b2d134262d90706e985ba4123c339873300211980ad8f52922a5ad4fcf2de576d4075a0eec4e705373c6396c8c668a33aecb53f5094abe317df679c4e915f103fd5fb385bc2ab7841b2b0d8fa1ba3296995c49644c86aa6d08de4526ef6cbaf72337b3a96506c65e2bc6c29ce08e2f01e62390b50c24c6e3fc457e836d73f22fc70a274a4f52723884f2fc6dfe3c0aa99967be46546c28b9ad4407713256d27ec495f4e76b1a4ca9c3586470308508101600d96c5cf917e0b8b4e7b7608d8abae584e08ede32c48e12407821cd05cbbf7862d8ea13daef452a63b0850a57826a8a4c47ceaa3951a87868a84613aa5edfa7cb558b0d10f58c1c298a5776ea1038b1d69096efb93494c970a8c902bcc46f50a0ca31b0aa582f23f4b43b8334804885470b9377554009fb70437611d8aa8b04648ef740b15b6c540b1f4ebaca3bac2a780e68bc2cfcd5348d63a3c29ad5337755457da14d07cb9f8dc6a0ac9aaacf92734ab4eebaa13ad905967b21a64f8b9c2ece5c252a8eb4b1806ef7863485d451e3ac93f82268d0aebe6ba0b624b9db433138c5058969cd0c77f2bdce9c368edac8e18e4d8021938dd342e96a08b16882c35963410aca4b0cd87baa248a1be4663b8a2178230644c30a3ec4c80959619407495b4d006027568d3c7b3e492b8cd4723a0242150e33cba4b891459f694951b468029dba9b16e4fa3ece5846322af691f3e7db2499196f121f6bb5f0861d911fbb0fb5f65bb0a095020859d4a45573412f3704a0cb5067b2bd6a877df203b915840958d10a69605d523544225d1ea1f8a955e50f3e63404a8615079083bf414e1c1e4f4107546d600dd5da8eef35545b05865a4e5eac67ef4379474a00a23bb97eeaf45a05f7db4405f93d8deb0d7b17115f4a0ec935497edc99e8743138b85da2372f9dc84b910250cd2748927dc0a67562be965f422ca887749af626e164b3cacdfaaa28964579106c808e142c52d26d0b610219ba2d43dc62c9c7e4869674d0384bf8756354e8d42e53be01c699b4d6d622520d8c3535838810f263f451a17c0a4d7c91d50cf8591207e7a1e1c5a4d3104312f9254a42bdedcb40ba326ac37cd305c748aea3c97bb36c7b3235986089f13a8a12e082a904e77e7900682f7379aed97967bbe30c42e67cfc6c0051ab1c4076d6651fcaa27da159970280cc3a5c22ea97c34b4903d8a5082a033d9b3ade7d31a3d8011f66ae6de8e261dccfefbda52e99f0337fac2bbce140d79f8b71f52bb036955d65c991c43540ae5624c847c68db5977094748141e3eb4bf1f6f96083a2be3ddcfb12eed6d1894e3f8054822505d75bd394434024dfc0402fb9c05626fd02dcbd586ac52fc3b8d5bdf8e6e114e3a6373a5dc0e80dcf12db132706c4dfcb74b463f54a427495ac0901e992aefa212d7163819300ab4d6bb5314e3765338dc6aff410ae050ed368aed8a9eed3bbcf8d2527b9b499fb9a016e6da4c51d7b3326c09634cd7ed6d1982ecfd914e441001d9e5530bbc392b5992f4ec3fde1acc28f2cda41e46a422c0cf51ee7fd1a4a035fead2f62b9d19155bae222560ce09a458c1b1caee8b26b282304085c93f26fa3632b3a74e90a169fc256702d5311a9a8a0a0d42d5d47cbc1759e434ec06b9716f22fde6fd1fa943762672d59b5b07dd0dcf28ce334f35bf5f48c0729e2689f846bb921a795b44668a423343d371c3c43a4aff6b52c9575dd6f412c14bb7f872269ea8392a26eae4de9c7998a60bfac0950f78c3fb3dc0eb6575913980b14e35a3b42dd16241c5fc771504a97373f1dea81133f3c21fe84bca4f347d3f9df691ed7d600e406ee0c1b1d7d35a05e179580cba320ceff67c519131150409c7b6ac2f1c4628c9c5c72c99421721a004acb25eb32618e6e598768354035efdd5342553123a0fe10faec6830050d1cff6056ebff7333e946f7cf32fe448593052014e1ca664d2f75b97c8183418a57a6bb2acabfeaf468643948aa371fa9feaff9a36bc88690defde47e5a3364b537d726d8066ded258ee9abd37d0fe481154726d3e4476d1b33da047299c88199ee5f61f19fe229bce6c5a3e392d93c70bc05416868d4866afd5be2fce11149749c713aa1574fcef59853587268f8c8f267c21c0f7334eb4739518db13b22422aca9b4f5d9a245bd5ab1a153a46bf3a3c0e3b1ac27654b0e97b91f838913a58f5bc5fc9d9043a3aa04771dcb9108d54745c9b7803d230ab965da20d38c183e3842a98eefd91047fc9ad307875f3eb8723ec5f773e5538b97289806ebeec47f4dbe5147709305605a41b5c5377292c9a8bcdb777b06e8bc80b8e7d4bd36527e0b97f8178cf47e4fdcacb48f57a141e49f28b2ae31adb096347835c015a04635b6faf9f09ada760da0572560fab42f9404a747ce33ee0a255c091d05c11b720e25cb9119eb10b6ff010c9ad753de4b161de4505c68797d242a7f7b44ffa1b86e522b1d1b9817d3d288a08050767eacafda7469ccc881e03c029a78a356ec3fdbd679137c0011a0471dbdf3133f44d9b9099c11f4e9dda229e0383dfd14f67e46de2d3b82cf16867337fe5a1d5353162073fc841cb737db709c9a19049449dc71530c90c5201bf15864ba7360d057195251ddd60d823f06fb48038eee428c027cc3e6a83f1d884f0480f3c1f524be91f9b6617e3a4f6928cc68397f6dae527c4274cc0d4a9df892545900d863f0460428b52b89ed70192e0585918113f77903f04511bbe430621fdd8be8bd55f516ea1373fd2ca4b3294572f4e958ec8dde15daf10d8c8cdfc476e0b91dc8209b37a827655f4ad4dc40141bb554cbf8baf25f70570ba66c0c658d2583340d5bee968ecc61ef7c7bd12cafc0690ea3f7fe18eaa11a5e9b1944902785b28fcadee9fee1838c5b8328017783bbdd84e673532fa0d57a9ab5ff10f2c4bcb3c26d1aac3c5d2d25ddfaa731f7becc6250aa37104eb3a8db95c9031817f86512d620572255ff8ca1055eb5d997eb090df5874e0563e2370cf6277193bbe3d3dab068ff9739e752a904b13fa13eac195c26dc1a64dc85c33e6a4cbdd8daaf65422984c85c06dc9f51a04f4845396886d93e46259dc8e72963124dfe4d3d20aa21790cab9acb897fc1882a17b248910e83abc38fce5975cfe2b3ff2a22005a06ca4712d11de8238a0ebe97573ab7b79c9d737855cd8939ab215bc03f3ad0fee49c883cad684cec9cb24abb072ca3da55815fa9148fb385c4fdef84fc90de33e3f09eaf31c126d475798eaad90f5721504349403e435e41b8d67d9f265e7ef12b59e0e4d8f538ece3a8042578d454e94a2c40263d43f340464548d9c565651bd947849551db36716e62297ffaa635f46ee644d4789de91f3fe9938355afb5598dccb00c94d467201b280677bcb5c70dc1e80a7665062adda8ce92a675192976a1aa168e0c2129ae2e08dac5afcae66498bfdb4f02c26516ad6e1cce2a73cadef1016fccf62442ebce5cab00c198a49dd3a53e61ed09623ae0b9810e49a69aefbede835b4123d7033abc19c9530d552547191a67b7f58613bc6c260a74a42af6f3c64e3811b3fd8e2c166265e41026fdb3ebee5115b0fdcfec026faa0aa6fd87a2af83bfcfdf66b0d7f23f7459336650e973667b3a23f7255530e39af1d8da0d2faa4f30e17f7af3197ab674c0c7dc612382494fd19fb2456db8e477bfa0c586971f1ae7b76ed0ff4b1d96f284adceaa6ca1d85750670b57ea0d8c19947013ec455d037834124e6544f86edc841ea8b545cf36804e822537a3bfc7853c21a7f050bd09f9906868812805bc00e3c2849159aeb81a107fe1abd85f4272b75e9107aab015f1057d5a052e2a6bce7ba6f136cec0356be6afa9ab8f56aa2a80751a4bb989e1994aef9556ee979324033580043c8b75dd9e33e030dbef7fbde98c057b3a8ec9c573021dd3e0fcd6b33d27b3ac2893ab722a82c8367d406f91b03f350051d202d9d558126c744516cff926f0e1f608689171cd6a1c81e49e3bd4526cdbd4e944df41550a9dc4a3dad4254b7146883326b81a2eae5da3288c56f2de2b7ae251e58cb52895b8a5cd09518324c7ca275eb6e5e4861746ad68be3291452745d825c8220bd233f1c74bb09e01e7fd8d13585beb8b4d9faca89b9462828e65baf3a8d3211106f2154b5de3a80cbc04b669312112ea0dd215de1fb2e168643946a6f4cada62efc184199d21b55a2d0e8eb7142e38c618babc65cc462379082be08e1a8c3244b04e2c9b7c5098c8e860d9a96b4a2de985e66329f9011df63eb4b93f21d2d14530fad0809a6b0aab1419bc2a629c8dde255db64fdfaae9616623658e697512ea76a592920ba406079971c032f13279127dba13a5bdcae549053e082c284b4e1088b04bf3e33e59f59803c0cd181f591ec604f635a7c71ab0fe27e40b82a10f95d2e954ce7101eabd1740816353e886ac85435e15574cbac2c3fb8c798e4c20a8df3fb2c8e11ee518c736a78f99438755fcc424244c511613ccaaff183acff9b07a13af0bd2b0b238e9a4158a825aaaa8807b424c04e093d4867382fcc6eeb8f18af0162deb5cb83ac785762157f0992bce844701703d4ce708b1a9dc189f6b43242a9ae192d47880aed5ef10e08601b31a6711067a73648fb45cabfa6aa2e9d76d2d141c5fb1ce71b0f9811ff53c7123746027c6d45ba6a75f84112e4501bf3be55bee599635e05a1e42456138eeaaeff8666b9f5eb82b1d2b651e57a2dbd3e98f17f768fe84063ea09c885e11ab5edb4aa58761fd41052fc1b24384e127373c919c8a6a7a88fa910ddec13b95961467a1698a491e5266960c96cba599990068b66a76189897497791eeda1b33b8e0a1370b10cc690df33ba19f84b3bfff3e5667f782ffdef59dcd25de0879925febec105f82c31213d4bcca5cb629374b06036fdaccc49c97c5dd07876c17297c102dcab82fd358533af38a59dca6d378b42151a67c180cb5ca544610ed31a76b22be7ce33ba6f1099c4f0d2ae70006daf2f29b072d81510c7ef73a0d5c0f0d8e1c8e4d180d78a3c094ed7e37eb2cbdaccd0d4769e46e80899853671477ca0578d4d68ff9189dc106bc586f6a31573d3a8608e4d4646cb2201be02e2bbb25538301eab4da651c1d971ac359b4605c67c61adc9b42a30f11babcd4c57a165378c79b630304eca4365e81b7dbf7da0d2922f73925f86c3f9663a1c227c9c56dc6788152d6a57deac1c895f948c8a5d427d4a6dd8cf7cb5747a1de4c6b45c5ca64249b72adbd2510d153cc5904ed90c62c1d5cb137d1c7ee6f986ac9cfc1b6f0ef2a8e38f7d7de61e6654b4170815866f900b57962a4f2f47ca42822c43f5d9be58f22a4040ddba5c53a76457e73738f0ab49a5ddad6704a3661c814789a533aa87066c38feb59d00587447c857029c4a69c248bee4d6ba6adc4c2d727a545514d7b41693c6c9cabda1b63c5b1c7c6763346b3c08464734b6e1ccd3d2e7bf600dd582e3fb0bf1d8b99e99cb6d9a87506df2ef4243d650d1470cdffcd9a06e1a8b59c71999ecd7a1f52733076e596f2d8e21812829be9ed9fc96ee2b0caa080c3cb82dd40de51d932ce5dce12844913035517517aac1d82a69a0134e6b35200da29f2b0f0eaa9e52f62b524d04ed5cecde385e530bd9cfa2c7f306f0edc1bffd329cc014d3f78ac21197407b791bc82829607f6f599b7f0dac788bccd943b375755c7d54ac04e8090ae44c141eff5daddb43e8787bc0327d60bc4432e9421ed0a4c3d56d2e0c566edfe2ef3a2432dce1fef302323e0404ccc7b73dee6b4e0f7d5854e02941906ae5d9731b1b6fff7623217c26de3258b1a57682f94c516602246f72db766670ce8bbcae992257ebbfcb0000a62cf0419eebb98de1f1df7131d3aa7ec33bc2ffcd36b40f7f41653af3ddd6b6ab53b26ea875349301956bb0ed9de214e0576567e0feac23fce2492131d79eeec0fdf476d090848184400210cbe7bbed3f8918368858f5f8eedaab92fad42b4067bb15dab587fcd01113e3a6a7229fc10b42afeac8c5b5f93ac5c3ea33ce34fbd091fc0ff07bdfaf3a9938f07ec2a8911ed6be80d7453a74b3cea2d4be81f20e527c6ea30d8940dabd9f304df3ff0095aa7a709138092a4c7700b3a4d0ea7b6713ac8e09b00a0865edb4b5487db4d09eb85ab9285004c09201df73fdfdf51faa03f603b22929b0b37c56fe26fb51af238fb0061093fcda1da3707b1defb20a60fd3be41311f4ef8e7fdb80de5e9c0e02066d879f5780df73967e9958d364b003e03d63d9687e420ddc190b52141e1710a4dd2de22e218fdddadd47a00311e30cf17f052c1ef5d0e41cb5ef968bef5341d74c38f45a231aabeb41f93e3bec43693c4c7f207295a25b55a3bf2d9769c886ce1e9b13d560441573f6f1bf6208bd84ad19ee0651f67787bf23d39db2e8db19fa9363dc5c0a5d991dc53662e6ccaaf351ba519a8df8511628046b7e7bf394cc3e952adcdbced1b8f357414d99f779a7d922a4d8a3e257b053f339e03a61ee4c4c1027496e27643512d0bd7ca967f4da3f3a13226286867e5781c73a979c8cd51102180a9d5e999f8dae026882fbf224f1896ceb660e8a82ec35420b89d2192af6182d3730005f02e6d59f833457214b17d2c1408f5ee3f4bbcaf294549c98e714e3d63e6f90cad5da68e9cf8245d42ff3adfa308f644fa6b77e8b0112d89d0370c8c40bd791a0aeb6f24e525e8559d8cf2d741ace90ee6877981e988c2e599c0fdae703da7259d06095fb498f4cff9107d69c476c2bf6ca779b544be307f09012ef963c88651940f7e6febd5b940e4e571bdd8d93f1e2f0e5f4433e185979a72251c972a43a48a2525febfe3f1c2a1dbe1a1e5b60d19d0202e977b64da59cedd691623db94a76a3bdb5f53aa826d05bc9a41cd0196b43a8324ccdc5c3057b4cd481f2b9e9ca1e5c31bd9eea3ae9b7089ba9f8097397d713916ef5462fa728330b9964db953851e720913ad2d1a094d2208e40c30aacc880fe1bf4c68a5f44ca92854f3a378f41aaa3c96685b5b42b5c2dce65eae094289bb2ba31e564928e49725e2d0e1ea5abf8bcc652956357064487ac1ed5a0f922b3acbd096633b10ad6ca2504638c9fa4cdf2342e0efcb8acfbf5d3ff29adb20543b0156e1adc3aee5edbcd48de8d3f15a39f591f04bf943fb63d7ec7c5d4be8e9fd62d82b66649b9102a354f0cf174541bc3c534126887134294d1ba00516bdf69809a7328afdcbd98d5aa1f4094f77ced21e799ce8d8e2aa9d904b54b18bc90c9cde616f5591d1c5398affc7917b1c9c1c3884ccd92c33674b668bf5a4ca76c910f91ca30f5806529edb4b2e6124b440a22ef8d2516bad65416b9603808ec5c8ffc41842d0e1f1a6f663cc5f710c8c444e6a8e53611a934d4a7080da09e67232d794f5e768f8a813d2f74997230d5425258dbe18ab8fb669d3a4ba62341465d59056bfdad7a8cb608d6c066456743faea2557c1a3192c7569cbd6c7b42618581aa0df3e5e4806698419d76b75af2ed574bb8e41beb45e944b7afae72454cc5e5a83b68fa2a026ddc2a292f89bfc32fe47565d0f8cdad92c4874f72b0febab4848433241a3cf42d6c8c6fab3e4b1f77169d3168d7df91c4c0188ba965ee52fd55db3062c38446efbc91a28f795a52acbc62132d0695345d24447399bb9e744bd1431e7d491a7eb2c2ed17db57f5a874b19661d0cc38efbdd4f3e7ba6edc837a3210e789391e330c2c47143dd51998e2d15cd09c9f2708468fa912b9f36b48a67a583b430379b250eaf9ddcac04ac283071a9e9e3608d6fc00e17637d81c2b20cc47a7fed9473ec9c78eadc78315a5bd2171349756cac4e79c23e80d2d5fb758deac4501d39234fbd4afd0808b6e0ba05c6aacb999dc6276225221cf8213f93e2682efca96a31b6fcf2a5bbc84a675cf3b0006d2b4533e0c4c9a18cd549a499e9d4b965c39f0b669202f0e9967a9ee18e4459d5a55541e8b38a8fdd581aa03ef48d0ba9591c87260d6ac836b216c3785f23a897b415b8593b7febc3b529bed275658a6f874dbbbd00921066ef72feef12be215d87886c4aa93525dfc52e7b77939afe5f7aaae8c517ffc69128889cdbe89c45d0eb3dae6ec3414ecdef62b90b3e337e40c29903a9556c30d0a5e007bf32c2d9827c9d89b4b5041cf228d1b996994cad9ed2bbdd3547c9491ca2b9a950063082a7449a0829d2b5e6220b0cf7051992eb109d764ed4ad0664a566bf449f9fb8df6db5b3cf67563902b7330c076df238a43b6500e54afb6295eac6c75dd40d7e807b9ad50986ce7e9fe29ba0c1a5e2a09058f87250f43f20d86b21f0ef726e4850d9a9a32e8ef41032389f2f1baf99873dc336832eb2836b5ba528186b2f045f053bd088a6090b2411c680ae96481251617c802b7b6c1ff9989efab8f85c3a7df66f8ef63344509ea7437a642aa97be80dd88897b871d21b8ca99ca9bbeecdee7a0c4277ee2a4d68d64a0c45e1699ffc1e8cb03f2733c8b4d3df6bac2a8e9a7d13dd0ab3c1b2d0d944a144968f142ada2fb0f55471f862d74c1e5b400fae19ebd6e2ba778cc52b2f7135947c63d27e99055d88dfd3c28798a015a97138bf84aaa9547db563af77b8175a58a57252e6686ae4b13ccfd74a75dabe89d459ee62dfe8b25ac42d1e5055989707c8c7e1a437c1140a061d63a07c634241bb2b538d678655b411177208e81851af4101d9d70f2135c257886caa12f56f3af030daa964103184007e7f2f4b10373abf8b424c0fb4884e59b5cdc41b77e38f6641e79e28784b2d5d8eca22ed8ce382442558693552eedb08c19be541a98f475dbd2d6400284565000a9854925ba8de95e1f70d72c301e2e45660abf7a5922690a6c92a1e719f9102197ef8a482460a0401346d6020ab29a1302ace04e122ade2483e4e42f8f37ce25c68812106bb37bb2f5bbbe76feb479f0d1529ede23b564d8196b38ec531447d3877310291750cec84d9d40a2338fd63ca1bbc0c90c4458dc763fe2b93b53c98c72f4fd3ea1a35bc98dba84cc4387eff7559fd9f856dfc29d8aaa6d1d874dd577036f41df97fe5bc7ccb9376dc70b8d819a987121949e0cb09d3949831e856adf199d05a611cd8d78a493e006988d55ea1d59497af59788fe80485e15877a4128f6c3e010ce2a6d0119b3e7438226bf32256613f9a1d62f6c9162b54a8f00df7a67fa890cff77da84c4b8e72df91528f706898ed44d22bd2723f934aa91f41a902885b5d2c155740c76d9581bbef60d60240b233c1f838f072d334d2da63de5197caf0f0e300b1e8e58d93de11b1062fa4ff52bf1600a18d72077496051e65c5f31155106857361d00bec4096c60a00bc7620d21e42d1810660436208c56c0baf883a1fa690d82b694ac5b64875cba91b4bb454f486cdb8e51dc1a69d99291cd358260c8cf26235b0f9de4e4481226eb681a4130a891bd538d115f10c111f49235b61ab5f974b13efefa78865ea98b8ea9fbf86a3d4fafb4f633c7d5afa57df9a50f0ee2db67ea3b393b3b3cf7f3fc5b735b1d676fcdf1df4a8ca77f11076532973d29c9a6ffcc332e6ffe177f9e21f5fab6ecad71964b1e7f48c54adde2f29183d6339e63c697d26a95de6cf8b317bda65a1bbf4ffecc7363b59f67ed6fad36dd411c3a75b17e9375ba8546c42914f56215a750a6372ae43e945291af470cddde22dd6607d2de043a35d3e91492941290544eca758313d290919a25a421235eab14e30fed5d6aaf4886ee94946e1b7ed060ad5292b457f4dc98eb8f143be895ba7f10d65f3c241d2531c18a60ec83f8194f2196568f307e0aad106cb484df86a791d2cc93a8689cb90f92a33ec986a7d1fd8a53ca7d102cde89ab384b243eae43f2bc5d0b8407025a5a5a5cc4cf99dede8ff8db9c5a5a5a5c727da8221eacaf062d422b645222b546ff3e946dfa6a8862a956e938a34dfd84ce058c9ec2aabb9ffa935142fda770ce2ab585f356f379666cab4c7f3215e86e578e78d4842f6863f1eb756dcc07ddaf1ce20b561bc66266f8625262a54f3309c32a9db62127fc7a613cc721a2fb4b0e81cf81102994bde4db702ece174358ecf619e7f0474314ddf76f25ae36f45aa56129fef54a5dfc3a24a4352ba4091aee4783117f7901fa00ed806f862eba3bea6be62de70c34e8ee98988cbf46451fe7639f4c25ac529a675b878e3e1986746ee6e263598dd2aa1d92e172863ff3eb35e4975f2e899132b0be18a6f0c5f0811836d02d9339947f6d5e9b31867299cc6baa928334ef38645b8dde70705b486db819c7f8ef1cc317dd95a8020a4f38e008f7a16cec430a75ff63b7304aac4fe21293f68ab712ff15476bc37f6d3937c3176339a437e3bfb1719695c6a2e62d46dec2a8d8e7299225b6b1c19feded6f0c9763792bc31d4bdddd4d749fde2f970c098de30c33b6b7589eb14bcb25b04a9f62b1a879fb20288edd624f491afebd2fd6c7d7d2dc9d34a4b4af3f1be78d46cd5bae13f750b47677d021d31b1d63f89fd6dd41f99f429a312e16356fddfd43a4b1dcfd72497703f978595aa5b17b6da5b14a6fd72a99b7d8e779c3bfcd1abb75f7cfdf66ed6e9feeeee1d9d1a934e39ca76b71f9ebfd32dfaf387bff29b46377c7905db14c957437ce8e1b1bb0bbf1a4232ca4a40d29699df237bd6891f03f90fc4d3fcee6679b34d6214fa11592af1d27be0f45eb105ce6999b9672f8645451bda5d038cea19c560da984544039ba553e3374ab6c5431dddd437f367c9a450554b3a850a25954bc4009cda2c246b3a8006a161544ba5b4777f774778c8d86a1bbbdbb866e19ddeddd4debafc692c617c41fd211c76a955e9b2f97bc180b1f0ac8457aa399c175c8cfe80df1ac6c226f748e435154ac4f92b0fc4df747b14ea36fc2e548deb249ac25ed99aaa5b90c3faa28570ad52a15476bf479d24ceb51ad4e5b1855c424d60ff11329ddf9e350ad526cc72118fe72c933d52795c6af75da86709f44deaed17d1aae96c4cf94bb5ffaf0e33b3d14fdf099c4277aa8fbf899f2630c2b52de8ceb910bea161a69a2bbedfd203c37f317291415dd66cfe4ed739edda3db5b4077dbfa6351a1868c89df84efd3fcb53b9d72349a6d52b514df2782c5f9b954c27f84bf36317e24f2161aa9475f7f2c207f65fca2e7d2b272747777abf4f75de183c2f749b1d95bfebad94bf396bfeed3709d37c73e29ba1b37af68cb14f741f998b4bfac0de7adfc18cfd88bf88235b730cae61646d9e4e04cd78d28dacc7ac2d99ccd7470c2998333c59f9afbb15b18753f93539cb15cf87addc2a8ee66e96f061633a274b7bff2b4e1bce5af4a6bf45aaf3416ab33ecee5b7f33765a5a5a5c404c6dd969b6a5a5c585c6a606e7fa506f83432bd6543a6f369682200ead6863f3c264ceb69924f888df6cc6e5504b4b8b4b771ff527438bee06438a2bbd392a37f39f799d619e24a662ae93de09e55fade34a67ae76681ce71028c3d92af3bf96f63397e1780e8e65fe779235e37c31d7f937c7d4e6e4e05338678e9d30cd8f7dfadfc7ddb7e5b71571f096a1d3ac3bf65cffce253a4ea87a94bf09e7ea44b2d60953fcf579b0d5a891b54ee28be518d6a39c38ff8eb01fc33a441c95c4ff302cb1e3dcc48dd3c791e2fc1df7d5a7d72ab5e192748b31cdba58a7b730f56aebd7fc3ee9e267f2c370d2ac674c477f5beeee1839889fefccd81fe775dab2fb5f7b735ba638274b17eb7bee5167e88ff35aa5b5bca4dfcfb4d9dd45dd9d14dd3da3bb7de08201f197b80f7f5bf64afd6fb3fa743c6dee0f4573383d771faae8451bbed8dd20e86ea8fe5e2ad0dd36f4f7d2eaee95fe5e206063135e6c831f8a667aa3977cc175378ffe5e9aba1b143f874fe2bf98ba3f6943ec95fab5397c28f7e934ebb65cab3f3639850f158b3dcdc7bd5eb3d70b874f447cb19656e8697e915cff969b4b13d7799dbe76a76d085f7046471b1b1e1f9d9cefd9b1c9993c3a37379336fbcf71e9e8d06a3ecf9bf1acc4363897f6297c5b689369edf522a90dc7f28fe324f3b52459e29abfcd4b7bbd5c8068bf96766bf4e6b6fa00207004fc6358cb587eecb97842ba3bd65fcb0d3acf1a859a5f8e13ca655f6d92cca757eb329a19725e5c2d5faf6a692695642efe38ceb09bb1e0beae860c5191b45a3f827e384d94486732ed85bc5ed956a34c5729d35e88bb7b452284478934f635f1634fe1bcd96d619eb729b8a0052b1038f91144fb51003f803cd7d2869e83d71f63d956a337268e36354513ad22a2b2838c45fff1c36966ea8f607831d28d07d1d0adcac10bfda918e9176df55c266fdfdd38f4a7c2a3db5f2fdad07f9c4d5b38ffd6d2c5bf9febfb6b9cf57eaed40004c0f11adaf8d87ffcf06cabd1b7815f133f88ee3ed2dfcad6f8822fda6af37ff3cc06574b73f8e368431b974b878633d3c971f1f8dce4d07278fe47a7e7469ce18e4ee8baa1ddcc8943bba1f57c6813665c5e9b1f9c8e86604bb02107f22891fa4bfc914e1a9edd3dcedbb5492f5aa45aa579de2795428aa7d0e7711afd8de65ade1839bbf6dea21f4bd1227d4da45748fc8a53a2597b97b038dfe8f5fa6bc358b6e27c1a2d192367621050f844827c4aa0f089b8724a554c5b5a3d9a772ee17927192367589c6fe4ca29aba599624bc63e5f4bde682c477db5e16924cecff8856219ffcc86a7d1bc73c986a72d26ceb7253d857614cacdf199eecf6e658d3d85769cc57273fc1bcb29974aa72d8cdd17e7db62e42c7f937894bf49a4b1fc38632a2407c34f33bdd696cbd98d82eefea13f6f87eec61714475ace6e4017e8aab1b44a6b7e9c21b6c971f984ff33137f7e5c3c61f83835371b82b3d296692d7733a6b5bf36b6766708dadc661073b4f99bb5d9885f6b14e3e9d956b7e5b914243e49d29bf1eb86270e68650636faeba674a623895d96a7ec467f5dabbb69f4d785a07b9c50f6f6b7bb6374afc26ee8eb84ba1b477f1deeee1afd75b1ee1f512f567a1f578a2f28da9b4df850348ee98cd71f1dc87fe6e2585a1b769aee6ee9f6c4eeced15fa7c217cc379a4a7777edf5b5f7bed7e9e2d75be6bf5e2dcd33d7bffd48dea8673a6ff65aa539cfdbb5349f9e4a77c7d05f477537abbf66a2bb7176a4dd87b29ecb349ce40cf105c3878ae1e6b5092fb609ed384e9bdc9d7746c7ee5ea554ddede9e084072210010f2d385630050d0962c06469082970a2dd4067093063d14c4c127ca4bc806301b3e0841749231251b4f8c8d04c0047ca0b3a0a00a6484cc44307254f065001161dac740181975e419326b04ead3481062f2f3010c07be23d71f2442573c411318a523dbcb4b724e5799e7baaee974aa55279d775dd53a784c53b7f7961a2a4f31e885071151328cf5739e52bdf21b54aad98f440048c65c553aa98a795cc1226b0169995130153e279b712f3c4a252a55229554aa552a952a9f64ed575de7e81974e79312f2fdd2b999ba13c57f1952a66490ed8932793612e324b98187530961619252aef5864963081adc8ac545454324b52b0a7f68679ced27956b074774477849327542cd1a1f3235432542cd10156d42b28f202c30058523d4c9804c0f39407a0739533a1828993272eb4726af1950780c55d64981ce1422b19260150711799169900b0c83c71a100a8c8ac6452de1e0095aebec0e0e44507173e95fbca3b2096548f4b8e2fd50313e3f94bd70979ae22d3a4855e5e9ce565a545e52d9e2ac649cc102cde792c304e044bcc113a08a5bc25c6c9934e28e547e820a452398c3ba55e626060bcc5c59f74422d4e5e589cc40cd1e25d8b773e848b7b1fcc0e20317ce529860c06729eafc8602097721d5460625ac825c6898b3f71a11657897102e347b8508b7730324d649c08604618618411c6100148798b4c939493272e04e3a91840a41c26668800a4dc45a689ab62f810c329e59eefe0b5c43ce9845a9c25e64927c4e22e314e8ed041a8c59f74422e318a76f8a072180722e52f45881072f1ce8768f198215cbc6ba1969823a858a2036cc53b21188cf8967418b01599270ce43cc7404ee52a4fedf041e59e3b2d79aeb2a4f28eb1945aad54ac980105d6f9cb8b0f283e98681658a752f980e2a3091f4eacae5881076595c5ca8a273e25ab299dafa4a47a5651ba2a60ed4a565ab0acbc98951521788192aa421707504213584b8bb7976a15d84affb474de8a8aaa8aae59e998c0e7f9aa8a5e55d1dede2c3d5aa47a3a6fafdb57de15ad9838800b6eaca0083ba8ac56562cab9655d46a35c347c7117c80a2be950643a5c17822072a53a84489a212250b1e19402b15169528291aef894e254a2a8a2a0acc9bf24411583c99af0b2ebe1b4ef42bc5e2e2dd2f5a1875322c322a322b1925344051d1a2f36e389103161498e7513005a83105f632a3c7a77d52322b2b3e48f83a588a072095566142a5b35061a2bd304ab1b07c5f8e1c1e0b5014996e8aaac614180c58807944909931658b4fc99745162a4e64015332c308308fc5091616161616161b5e7c91f379dd1351409082adc828a12bce92ea21619e121bcc731894043105e6c92849b9d1113e1516cff35858603aef1727bc8be2e29d7720e852dd132b2f4c8c68013362042646c98b141729b0979718c05ea6646124c4e351e960462ad0333cdd13de6a05c5091696186f45c55351716f46a55fb2905284cf731edecc8b142d609d1b49f5bc4c798941771578a101acf3eea50b58d7ada08a94cc4b165dd3793c7410e1ebdae50b1da8ac40e68b159706c020095fc02009454882141b291c375ebc26de8c124b4b8dee05967bbe038def53d921f57d346ac428f95e60a1e1a918452b1b365636563656366260be26df13311e6c15d3b0af89c7e321b1e14a3e26602927602923de4cea6bd204caf7446a081f1707e86084f079de3529b22103d3244abfe09deaa1d1a203041fcb53fef232e5a58b55674366b5b221b36425a6b778e9624a131b9ef216254bde4cca916881e3860c0f6fe685982f46c9474386f532c586bb4cf9628b2e3c1e2a783c60783c9ecc4a87944fe6f1789e7252b4e5a8ae894a05c946d72a192b7fb9e13860e86ee0f01bee84c36fdc701c381c870c131c5f13d8937e79a91e1c9e92e14a58603362ccf0183770f80d1b4c783c369ed838800d281ecf0e4fa92c5143a58baf89c7c3f2947f4e3c1e1b9ef2efc97700249680a55ea674014bad1cc74a66870f371c873bad9c090ebfe194c36ff80d1926373c87b71263c3bb183cd0e003246a44e99a942b7999f23589f99c7833295fc57c4f0ee0cd78303b525dcc0ecf71780ebf11b3c3071c9ec37778324e383cc70e271d7ec375f88d291f8e181d61acb0582bef182c1b366cd88851e2f98ad35059a9d0304ac908f16652bec211b3fa224593f21b313de57bf235f1c0a7a4a728f99ae8f08f05872bf97278a774c4348e984ed1dc50d25368d8701afe42cc4a8ca21754649ee8f8c0b772d6ca8adbb06123a6c62a8686dba841c35768f80ea91768b058322c4a564f9078028604cc17d3a486074616992c565432562a21292da2a888782135430cdaf36e002b9fe103506149f50c41858b0fb1f219cea2e23276f8b0f219eeb4f219323b78b883b9b8caebe91a40f85652a458a2b8a45c5c6494a854aa18312e2d2a6f51398bca93b2928597e6a164c79422e491f4665437a2dc90a2ba1145d55ecf47d352a3a7f48b0d2d6cac6072b0aa5851d260b0aa6055c1aa825505ab8a172d72d8d0c28616368460638a8d2e6c7861e30b1b60a47404780a39021421e82e05c591d7eb7b824977e340b9cda538e24abb4f964fb4fa27b083be131040778b197f9e2311bb64b3385a4b71d81f9733bd7756eab6708650f79bfc0709d448327241bd5e4188409e9d109820dd5d0f4f7477471d0d08b8a03ec61f1b9bc4cf93de3cc967aa43c4266c85645c12898fb3622d7a40151e503e40c751d444aa5113e946337e173ddb2407eb93d6c9ff27b7f906bc015d50e2df669283ff97566bcda66add47f255e4a494e4606eac16cb64b894d9ecb93b458a6bd58e532673dcc2349a7d71debfd9b0147250262bed0f43b8070501cd3c89bc7597bc1504f47ad1c66f02ba515b133991fc873f99cbeeee42b85f4b73ff9192371bda2a93c98abc0607afcd78246f33ea1d675a4bc7b94c455a2ea1f5e8a1e80823ff83d48814cd27d2e24380164e00b00024dd3ddd892c60c6866766e28b6ef03e941b81891080229d158189fc0326748870a0802bba1f8a7e0a78d20d8ad8eba1001dddbdb404d9dddd1975773c7445dd1d517f0980f225c04937d4dd09c13c9804e4e85696a0422c718efad8bce55c42d538280e2012849c48ffd749a873283caed8a183a0f8568eb35cf28fa1e83863e4ffd3381640000048e20b6cef07f1e3fcd16d769c290d298d566217bfc897c44e124edce400c095abd3f1dfeef4257cc11007748139353579d2fcab75ba010144dd9d8feeeed5ddfd74773e1d9880146c41e7f56173b53ebb9537f4e9f86db8246336571a13a15e3171a4b6f0d5ddf574773cddcdd2ed74773a5d8e0ba7bbe9409a197cc11c2803cc4cc07ffcf05b862919cdcc938d610ad260674213f3169eb98189b76672ff14cbcd62311063fcb75669518d02f8587b3f24b6d0dd4c29182466600bf3bc2d8977869812d19124614d409e60f1a408ac9656fa7ac98ef87f9383b2b19ca1c31cfc6a5b44ee6fafa5555a7b7f9c5827cdfaf46b6979da70a28f23cdd8ffcefb385f42623272904c7210878e5d7ca8895dac73da519cd9c7b988270ecf3bfebd596cc3e4acd867938e33e3796b91ad3b49cf8fa9cd738f8adf8a9ee938efdfde463e18fadbf2bdf4e654fc9c44263b22fb9b6d92d11616afc5d52307475c435aaf3007df1f574bef1771f0e9cdd7668c7b644ae6fcd893c830c5f7976447acdb6a0be73bcd7a4d6eac36cc33a4f9b193d85f0ebe0d1d53d186498a8894865eafd8383eee4812d98b367cc98ed0dbaab1b5d2f143d15ab5163b8639288e4f692dc73e8f1c2be584c4cf74466df62ed5a890b54eb06c93c41f4bf16d6153b6493649ac439810c10449cb644e19c02407f1f1eb355f2f0208c184041d180417dd313ac8706cfc9abf26f35aa5e33843f128a6822064318fff92fe336f4677e7facbf500c7c4cfcdf13e9495656b6f4c365dfc9f81f8b17bb5ad794b185803dfc1bfd15c1ffba44fd7e21c97b87e7d6c6da1dfd2fee020be9324a78bf6928e030e79e25ec8414cfa4d074af4379a41f0e1a4f44c8263a2fbf1cc766cc201000704facb63aa155f08d7f2172e050506540da07283b97fcac165e2d19339a7dc0791f9db72ff94fba7298b552bbbf3c7d071fe9ae723076de19d8f3d7767a5334c1d873d93ff143e94e8349bfb27dce32bbdddcf8f71ee9f447ced53dbcfbc56e9d34c3da4375b6df85eab34373a39e820d4e73e883892a54d4afa3093eecef6ced4d01d73bdc0779ca1ed1ebb9340e2ca70409c9ab1da4ba1ea57a094c0dfaffdc5a4c4c454e431313139fa5b3283253258126589146d8bb56cfc25feb5c1b171669bbd15fb9638f11f3f7e74774696dc74777777448e80d400092553f163b7308ab42412d207b245139b717fe5a86ff9cb6d5ea92711b3511608abc3d2e80665b16a659882f396f396b306a9341dd6f2666fd9fb41584ca1ee8b95cedbdf2e2829cb98154b1c133f081acefa0a188da0a452dc93938343710edf5bf4a454c4f437dbf4d52639750c88c20451bac55fe2639ccd5cde6ed4f1c479a69446457b1b27bdd969d44b4ba1fe924eb34edaec79baf899463dae4be2f338a3185bd27363c5b73bfda1ec6cfadbb2c5fe77fad18b364988e8e97572b1ced76b762bef5057c4a7040736cffb99e2796f3995b4bab9682d50279d4d77776077e7c61b72667ca319e7fe29f74fb1afdd92c4170c31bdd98498dea2faab6581bfc498dad8c2cfb94cef246d3ccfeb8fe78fa4fb10ff7ead466f7e288aebd35ef4599be2ab4dd1ed2f9c5aebab3df5e339fbeb5194e635fe35fe144e9bbf9488949c72998e34975f6d86bfc447ea36c2d16c1f4de7e9cdb7f937637f7af36bd1bdd03e3496ba5b092f30f83e48c7fa6674326866ba27b16c7cc1d12607ca26bcb82949e9c8692869480f312330247ac58f1511750cb8754c646c6d4a544b9904e92fec86591ebc5529cd6b4973c77d759bd4e1c4f9b6e9b6e6657753429ed9c8cca7bbbfb9859e5d8cee0ea6bb7be95aba3b96ee6ea5bb53e9ee565daabbf3babb2e8ceeee427773a1bbb7d0dd5ae8ee2c743716aed0dd56a08214ba3b0addfd457743c109dded457737a1bb99d0dd4be86e552b01ca65334f310615cb8f65dd46b22d1afc5bd62ab54343b22ada86279038df47c6a3f1056d669ea2a5d523287b7b26518425e11ef749dd1d902152be185077a5b3361d3fdd79b385f5675ecbeba5cdb90f270ff2a8798be568ff6e05ddcd437f429e747717e3c499d6ee1c7d2cf15febe4bcc568e0533867d773e3e749c5bfdda84ce6b84eff9b0ddde6db04e2600eff5e1b2691454da4d7eb8857fca3ffec45ea0e663c8538e84ee3ad5ca6b5bcdd6c38237e14a5790be31e88b54e1567eb531d426ff797b24dc2e2519e34b418c36c92f84cd9267d4862488cba3b7fce7377a3e03b12f51d39728408898eef4817dd31a2e7c6b1a41db1a2bbdd7337bbb53cc4be23ddfec2f7f3dfe69da4d72ac5d971b434d1ebff6ca9bbb15042370e8068d28dc74973fd72c963afffb8fc330f122dbdbf742b6fb4522420cf78fee8f98695de00882fdbdcf4f7831661b5e2acdaea18e9071e9e83dbfb41545bf105f3e3d8fd6ca17870c09b9a5a4d2eaffafb4186112eba06cfd3dd715ff1ed319e4fa11532f324baf5c5a3596ce649f48ac592948e9a988a88c48a788031293935c562af1efd19d1a17b697ca817425aa7af4d929c6f7bdd8acce0662f10914eb20ec1d97184e10b3e912d1ce3498a54ec6e9afe887c20f74f9efba7588efa4a040922b6f697e7e934addc3fcda41ad0dd627f43a2d0ddb1211fc09fc5587e2c563b8be5c2fc612cd7cf95c61e6afe882f88efd37be7cce989ee96d19f53029c8cf89c68e82d7f61eaad4cc5bf43ff349d6c781ae5321d67be1649a47309ff03b97548d3482710929cd709ffd3747a7c5fcc894f73e2ccf59bc4873121f9408398f8658de5b19cb417c36b691867b13e5eba80d338cea1217fcb914e2062fda69102f97136eb901f67f428db24a25c266f45d7dac23a9f29db5ae71016a7904d12715648b649f991b24dc2ff40b24dc243ea51b78a0b41c0502a4229b7581f2b11515a6addc035d70a71eaf657185513840341a004510a62344368875417562c9b98988a20651ab53511dd422343b7d0c85254d1bc256cde12f64dd70ec1f087758e53c8d2ea11799b19ff8d3a3559d1dd2730417797a0bbabc0f3cea5efa84677471d1439785105130c50c0457777385abe5c022159c041777b33fac34601090a60427777525020034b2f9c208b9eeeee7448c01125284844c08aeeee0cd0041a68ee0a6803dded0929d2810b03f430c015ba3b654309294f60801356e4a0bb551cb00030ba1dbcbab04377775b546109265b6000127aba5bf500d94a036c33505284eeee763073618104014b86d0ddb159698be1dc07694af130a2e96e128ca0bb69d65ed2df96b31db1fbfcbb92417727f5c7c314f733b5b93644000f4bdd45f0d01f102d309030babbbd3a532800f1e71f5f3c52b9408f1a952260adda8bcb7fb34d0ee25989dd16d6798554a050b20c43ebb498f8b8543932438a46afc4d5035ae50415a6403313c314ccfd53ac56694c2a8c21ad2aeac175abba97ac08c9a5cdd42df6d68bb68a9f71d9437797dd9d7177df253dc537d445b70debe33e69024353543a56ea3f2362826fc809bc9686a4830d752fe9dc7d281b624a741fe9161a79da6caa427717f52714a4e673584b5b2b2c08fab5b944deaed18f24bd4e389b447b2657ce10eb248a43e2389bf7eb5842d5235cab54acbf24fea5f889f050c6d6e8e9cedbfd3c8b90b76b84a7906cc7a6d00851add23aa17e7ca6cf3337bd68871e4fdbd2382d650aeb2c313e1a67b64ef5858c230c3f15ab15ca8539ea93f0b5e28fb3892911908c5f489c6f142e415a7223ca780a997912353511e1dc0711c5f946363c8d443b542d2582fb21f168884889722ded90cd53a4629d432fce5b238730653c85bc482f7923126d781a8df8823636363c6db57cbd7e48a0bb3d4f2fefb5434e353536f87e6dd679cb346ac34036f8b0daa41a9091c617cce5ad53752f3c086249045abe3f1f241f346830749bd4ddb55ba5244a4d77d70326b8a0bf97159dab9346a3a24f7fa86913ff6b2b77eded6f6e739d767c1b626acba5ffacce1000ad6e4f004f394ff131b5e169f3176d9db22fc749e4f57ab1168eddfd04d3dd4a50b0c30f13f88264f964edd84d001da80ea903e22fe9a2b5e5bf750cf0527d4377e783ee46d29fcf07ba451bc65eb495dedc5df9f504a1f1057337d7b721e7ad878951b514dbf034ba7d3ecadd5c8b7e0c6b23d1dd44fae3a941e30bd6e0253e8cc0905e2f1d9ed2df96ab8f638fc7392e6dd907fe1bcd9efbdbc49f2d947b9da1586de8a4b5e3dbb28f6c8984f533a651ffb9ce3bcb9a635ae3b63aa6ee4284c068d66fa592d72ba4349a71d9c324c53a2f0ff3e6a8a2bf659eb5469bf05f518495af5748c5af43c227712c2a3bd55e2f5c2dc5f573d4bf5e9748f8645394d353f8b6a1ee4e7577add2a9d12de65061b4612c478beec6239df9c5d83fcda5bf9c2bba2dade64cd1dd1f565b63134a0ed9dd38f74ff871ec8df4fda76b71311acde6007d9e393c1ae7b034cef5efdb2afd5c5f747f2e2d3a961b4972bab298798a33ffcd1525083aba9ce8ee773de96abbfba53f576eefbb1b00fdb954dd36b4a1bd35b3d25633b3c11f8e17dd2dc6b21df187e3031c2b669ea2e792acd4c529d4dd33dd0d04ce52e7802e1cf0a6a6e2ec9dd9f0b4e1b4b2dbf0348a92c513a02084ee2174b791fe6e32bee04c7c7ab38e0bbca99989354f6f0ebb7bd63d652d3ecede6b67229d4bff40aaa520c6240d2779a3343a92b7f938cfe5cc5b329975f1f19c39792b673e3d7fedadd8b24d0eca489a6d768bc7e9f8e94892d3efd3b7e1d21fe71f568a3fdb2497c964ee832607f7719f22fd03711c3c07ffa7c5aaa578c67f3849732cffe88386a479261c6718fbe19e7fbc1688dbd8f85f5b6bb495717965329983feb64cd22c966358a9e766dea22169765b673c088a6b72e39d23bdd5f2d6e46a2f6d9cb73b96e138c33996b5bff5ab2569f6298a739cb69967d66d76d93f2d36ce4a69b291a4792c6f8ea9cb647e29b676e636bb0c49b38fb3cc9742c9f8e792bcd9d06d762c1b67b5b2fb7424331dcb9bffd31ce62d24b1a916e5fa4db97e9378278e9c425368a41308c61f8665138891868c54eab54a5d7cc7d4f3ffa58d74424dcf515fa7e31f67a515dde211e6a04c265e1bfef5fb50ef5826f349a15c7ccf8de32cebbce5de967da4b9964ece5b6e66ecf86b6239738f9a37175ffc0fa31e87f4366b4ec4a3bdb9dad0cb10579883f5a168cda7579aeb63ff995b3a71d331f5bfd4bfbcd931f5d1da19f65ca6d706ad83160d4e211dc429a4c312af57f850af9798718cc4b1980e3382aae86e30084a502b48f5234a83b5fab61f4bd67f7c0dd61c280a0ea8493708b4046226a019e7017b6b2688c65be21150f8447c087961e1658157f8d2c9cd7e2693f9db68f386393b922f7aeb435a2393c968d69264e90465bda956a9f8b88c8947f4e7899fa56e104fd6cfc4d52af559818fadbb1bd31e2931e871d2f3430f13abe78507073c50f00cd16055f2970c97fe92c9bce685c17f9ab95afab2282b140b0a3af29613d07da0d7eb3e5962dcd79dbf95799c463bb21d169d0fe8cc747254eab42350ac3683e2b561387d12c9a1400e92eb0a2e20b05c4f5c372c1c2dc04996365727a633cfdbfddc18ce4bdeec13c4d9fa443d3fa6b33b3d57a7380b6b0ebbcd5308870038b73b37cb4d245026f3d70bc7c19b2fdae9064a93df88372a9b28dd4d238a778a75665c536dc5ff361b1274b2b9692a638162a53827f0896e10fce1e2681d8bf36d31284bc6a2e62d890fab268a0691868cd4b2268348434658353ed478d7b08098d592d2b97ed87aa2bb59ada8a62d23ddcd6add7483ac16cbeb15c37dcd2106363c8d8280eadf2cd2ebe584b3b5093804010701e0d083834723051a0ad0dc6872b068522028cb8f634ef34f33bf5e32a7d919c7b9d1fc4c96bfa92ac9665c96ebdfb7d523994c969bf96cdaea24dfc5a020f1c85b4dde32b2e1991494e42d2320b2493cb2f9662fedffd258333af4c0d88e9ecb96e77286c3d686eb5145370863f518afa550d3f6334c6f3d6ab8410a99cb2076d60d509a7503c9bae106a4b981c55a1b5600d2d83ce34d36900dd2e07f1a9e381b6e680dca612c1e5df0906276770ecde2413a8f1daccd3c3e9b1abae8b66e6dae8104dd357f492111f775b476f67a39fd5f5a0cf7955583901abc41272525a621f0c3d910191a315160c598208c81f11fb05c0907721c581e030d5268d8000d4d34c898e1083348608624ac1966bac19b1091dbea16573a2a794d9d38fc742dce6332b196e3ccb8246292c5705f63d5be5e55c9b1d7b883a2acce3026f31af71713587a541d670df84d4e33bd612e67b7b276670d78ad4cd6ea71c52a93210b960c0e60c96000197cc01ac65bb681a0bfc05c27ce4b9bb3e1e7077c9a498ef8db6298410c0760c5c0c30e2dec08c10e280dca1c531ad98ce3ec78ade38ec0dc48da4b92d36964329ac1ff0b44e6f7f38e1d9c0003126080d260a5e3146793d780b925c3d373630e6754114b4716744ca123081d3c72e0208710399a72d490e3051c2dc0f184e305d60d14dc60d25d833b98f1a5b8c77d7c9de6cb9b67dc6d6e6592e6f138693378da683e8e3326abf3476b6b40100cf37bab85ef43d919f9976cd1279f797472f0672d1ad99737cbbc3ed4fd8ffd389bfe97e6fafeb68cabc533c4f4f67f691f84bdb4d83f8dd231160b32028ab242a5bd41e251abc9a5e5add72b08287c2231fcd942d9c8d138a90618a093d4867b34ab46160d8a49359ec8fd538da56e9b710f283ae63ec80b1e7801891792582fccd0d88245230a8b0665d1b8e96e39cde2fc1894e1dc3f35b19260b168ac1c581eebd300eb1b00ebc3990184190360cd18c29a5143cb5ee20b7fa6b7c88cc86b642d99cc5b329a9278449d64fec2e27ca61991d780e247b92da43358a4b1dc3f0579bd9c600ee2277395ba8c0667c86b409a8c9de6c7d1de89cb19273a72fab3f069b4bf78c6699c363c6d96568f5832a090f32fd932965832bcbbbbc26280d13d7130560c29dddd558915e34983219e369186b46c62c510028a306038c13cd1b55bb2608658302cdd0dcaaebd76a8e8592f5bb05e9800731f2428f74fe34867f7975eb461d007010a9f880e4f89bf2643b35ebcbb592e5e7477a6b767b904e1d262b5dc320c71ee9f6625b6962957c471c001071cc03108ab250956cb0fabe5068b458a5b116c160b6ce5092b5bacec80b50202d6ca05582b43582b2d2c952f1afc9b8b3898bb0f454151463334a324c3f11a90e6a128ae8ea9ecf5b2344662d98ccb689a669464feb219c76b64b13a4399d3a2644d32996c4826a369f21c7c08f72a597c134ba5493748ceb739eee139d8ec8b34a9dcd0602c9566ad9220a3c1995192790df84f13e9f1b42d3d9e36b208cf3c451ce2798b5e2fa720f1c829268e96a5028346bdc43e72e2274172df8a253e82c4dfe6c45265d1dd479038f8642d8ca58280b5e1a2acd038ce30c80988a624443caaacd411ac9465a562ac144c83373737ad1b1ccf619ca10c8ade178b780d4833e33d617948ba3b48b33c16abbba2c1fb8e6bc09c2d675c65d95a26564759dd0fdd9da3591d8cd5bd58dd0dabb9c06a2cb09a0241405e032844e45f95bc06f41a90066746c96b8280bc063016f39f81b97fb2624923c37d95cdb89873ae6fcb252c97a40d4fa32027a0f08944bd5893dcb892b872dc874f79240c2b9a67c765740b8d28bd5e3e65d0511740d0855817589220f1161764c0050770414848f3bcd95cceca85d5166ab00527792c69be5e3b9bf14c6936d70adb024c0b5e34388e33b4657ab540012d0801f1b469e1862c6ca19320c9e5c4d1ec09b200812c3490feb0b004168c6081058c289d048987d35b792c33a660e0c0e8810a9d0489131db58e20016f69dde69bc513376db02b58e00a4a5bb0c21456f8c10a2af067b599bd647da8fbb9ce7a1fcad61cc941f173b8b4f76b758ab9b43693e2fc3b03e6c62a40008bf5ab70a40a3a508109546022091217a9b74aeb62eedaf2b5de127dd62a9d930a45a8b0432bd7875141c614a62441d23a820424e7cd4d53809a82638a338581b95a9bf878daa4a0032970400a46a4a06a45bd586534de128fbc25c350d3568a3e64e33887643ec5281c210a516614a2a2e0499078c6363c8204c4b8744cdae9c5174f741224ad49fa1124208dec161a11eb37c93ed3ec4c9df81fc8173d7c6103052040c149771224ad2348c06ac969f3c5b96b674b8aa0a004059b2768d1dd4990b444ea479080b6c6fe696699db329da23fa1c9dfae15e9249f60e4ce27e8e0842eba3b37716e6b0b4f9cf8d709517a38e109e80423272fbee8ee9abf9f1752745399ccbd30824b2ca43f2f724dc802acf3e6d6e62690ddf771297e137280d53aa638cfd18ce39cf18ab34cf8e263c213200dd29011f192514f67eadb9c9860c4614c98691033a1bbc16b69df12a6e8bfa4d312c825e4e806c3493e8573f489c969bbbfe460a6a9559a4b7bade8164fdcd78510fa671f024505058de31c7abd8270aec9f17427a0a0209a19a05b682408c8955366fc62a6372aa44850105094154a420a92408238379f308c8b237041002e2e17316cc1822d48b085f86d71d3dd200e7fb318071fd5d2fc636ec413f738645b71c0742c6930f0c579b3f569e6b7654cab7dc799ca6449606e1ce7b53f8a3f93d5f04d462b0c6c796b9c75fa238107ddadd41f128e400214127834f838cf8dd966c74843463c57e79db5bf8e4bcfddaf553bbaad4c4798c1082830021423f818e185292b98e3385be2e37f1a883464645e4b73b1ce293c7c536028c215dd0dfe389b78969b3799d78034a5633a73fdd0de66484346666813371561a9083014a12382143e223c016297790df822a632af01b3b54c484346ae2d8fa3cd5145dded437f43c0620829e8eea6fe86f034842042982204187c427821cc08c214419805018820a8803045773bf5070423403002841ad316de92441a3292abd36b40fc4f73cf4df2f6b906cc4d2407ff69af1ad09553a7fbcfa21ce62f99cc6bc0191c2332190d0d08ce786bc6654436ce9092b9ece3488b38e82f59c62fcabc06acd369969c2192bf6432af019f30bd9e67c55426cb4db2565ab2f496ecf699c6fe693297e117e7cd31fd0702fadfac8c1f406025a705994952862f8863f7499aff4631cd13df70dedc872c6ade783890d344cd1b0f9b253323fdd06d7c898c8820dcd7eea6bb9b460fe9af07adeeae01f716c9bc26e184133d98d2831d249144125d13dddd023a05f4d703285f0f9c7409e8ee9680f901716ac2871ac779c33e1d149f1f4da4532289ae0b1e20d932bdd3069376bed18f16cf9472588fc4f94614e999c4af4376f0c40e9ad8410076207320b77907383b681d2821053f82fc679ea75f4bc3e27c5b1e6b9562505623cb14cb6e5ee99228a3998991cd3b4999bf18ded2fe131d1d3f592b040748a444e94e724c1d07413870e140d5ed18cafd153e89b3942d5ed0dd529ab494212df6982f937d8dbf2cad5207f1ed6dd95aa68ccb698b2aaa411360d4d764b0821e6840051a7c410329edafbf13f7491ee336bbd3e0043470c269403483191c3991ff41ac13bdb9bed76923af759b739d19579bcb19dac2f2e678e646f246718de3cfb452da8bb776c9fb3f4e30ac4ad33159b6c671d22772d065b8da71da649e1b6b73a4f9ad14ffbe5eb970ded0de5e74f0413a83dd268f9ec3bf54f44b33f5bfd571daa683e374d81251128c8907eaa0789568b472e63007f1cfc87933cef69225aeef3657fba2638aa9adde926199e34c6d2e93613c2a89b630cf1ba648d95a269bbf46bb14248909c892ef8a1add1d23dafc820ba48098b495ce4be481138ca05b88e8cf0533ba5b5caab558acb3da9048ce2b6ce8a829c9e8ef520b6eba053558f045fbcb5bb15c397bbdf090e6800ac49d4f250537b7306a0541e8f617c65854c11562b14c6fb312dfafb8582c3ffe544044b32a90f114249182dca0db9bd76a93121f0a42802f78c313174edafd5c690d696ffda7996768f5033a1e6a1401d28d53a43f2bace8c1016f6ab2b577d60dc104051e0a4ef001217273b4fd2d92010f035d100d3eb663e851197f59f3222d2ee0df793d4f202d2e20cef476b3a1ed5a5aa5f938e984ea007043d7483f2f30c1075f096810f5b91ee9a4655b8b80d0450954dd36aa83cadd920e7777b7bb5bd2dd59b2bbb3dd46474220d103d338d220b84f125fb44324e88204582cf9ec34354dcf4ff3e636bf9d4dc7d9fa84e73339183e8973f93e692fe9323e3b18cb847324ffbacf4e53938b8f5f047b3c0f3e2302ffc942558a67342b7ec62f8e76e6e648429e423b8218bff00deea08df4b7c9fe665b9d469d66c61f8f13888332574e2993d527c969f3bfcd2acbd88efeb3ead886b4d2a88ca6f57a39cdc86cf8efe7a7d1ec0dd33a6de1dfbc56297ea81fe918d6645b8d8e8e71761c674833a6e308037a9a9d34363c8d5e2fa7bf331e52d2669f480e664c4797053901c96ee2fc5beddf2c5642b335b9b46e6b9e6d8db2420ed654ea93885da255ea8f29ae5ab1963627ec608bb4e169e4a04cd6e4e0cc69669ea2cdb80726e76dc61dc413a955b3d973498e93067fcecdbcd219776c9d1c243a0ae91cc792769b49e1934d47d6098bff49a175bad921a26a93c671ae64199061c3d3f6e52d6b94e62fda241d5081022a3840c51454384185013e2a9c7c540841c5122ac8ee26ed8cdb388d0ddeb2c15fa4f5960d33ee2f5baed51f3dc9918f8a231f15b06e7fd1cccc571193a5d5fbf78388555b67480145777fb5441866c5b229f741442a964d53ec4c01d3dd562c9b66cc8aa5154bbc8102745bb1c4325166c5b289095f500363fb2b776d9e629db7fbf781a836a9c88dcb95839b4ce251d48b755ab1c431298c6051c791d26224c6b9b42fdafc388ad2fe92b171a44fb1a73b6f7f61ac0d0ca1591bd842b3a6f8c1d44d43f70d8de387a5811acdd2400ecdd2c010cdd24015cdd2800f9ab581ae591be8d1ac0d0069d60692346b034e9ab50114c0d460e2447f4ca2e88f8908fa63c282fe9810a13f2660f4c7a40bfd0d41e3c60b302edd1f1227fa43c281fe9060d11f122dfa43e2457f48c0e82f094b7f4968f49744477f49685a585668c0f470eaaf47d85f8fb2bf1e42f4d78300dd0df3c20d1b28b18111fdd96089fe6c10457f36584177c3d080a1e58a03f4778513fd5db181feae40417f57cca0bf2bb8e8ef0a29f4778516fac3c2a53f2c64a801f3c528a2bf1848f4172302fdc5c8407f3144d05f8c16f4172307dd3d03070d1b0bc8a2bf05f8a0bf051ca1bf0560a1bf26bcfe9aa8d15f133dfa6b024805071e417f5805fd612cfac339e80f2fa1bb615e808103b93f0e34e98f034af4c7010af4c70115f4c7811f74f70a0646864b8cd58b14fd2951d19f5209fa5372417f4a3de84fe908fd2979d19f1218fd2db5f4b784a3bf2599fe965afd2dfdf4b704a4bf25a7fe967ee86f69497f4b02e86fc900fd2d35f1020dd63783c502b35b40608527b59712dc4d77370b18432b90428d293360a102336872de58905001ef6e97e3e0e40c63e268c919f6024c70644401227ae6107111113f07f8455b670004d60c823476cadfc492811332a08901ad1dd0442744add2274e96fc8562c1c08a2e8802909ff113ceefa2d3934a36a97bf0ce6b69ad96969616973a8572f9d22f1dc67a010f09b0b01059578c50b8a009dd3608e1029deee6b1b3440b0ed0b1264c8460c194ee9e194f24c487010b843ce9c6ac15dc74770d20000f1538e98e52814fb78dee24cd4ac10152b0848e122bbeac138cac13f8b04cc0a49b67c765714eff34472172c838bfe92ecdfbf316edecececececece8e8e8e8e8e8e8e8e8e8e4e4e4e4e4e4e4e4e4e4b85c2e97cbe572b95c3838383838383838383837ae1bd78debc675e3ba71ddb86e5c37ae1bd7cfcfcfcfcfcfcfcfcf8f8f8f8f8f8f8f8f8f8f4f4f4f4f4f4f4f4f4f4f0f0f0f0f0f0f0f0f0f0fcfcecececececececece8e8e8e8e8e8e8e8e8e8e4e4e4e4e4e4e4e4e4e4e8ecbe572b95c2e97cb85838383838383837373737373737373737383f3f3f3f3f3f3f3f3f3f3e3e3e3e3e3e3e3e3e3e3d3d3d3d3d3d3d3d3d3d3c3c3c3c3c3c3c3c3c3c3b3b3b3b3b3b3b3b3b3b3a3a3a3a3a3a3a3a3a3a393939393939393939393e372b95c2e97cbe572e1e0e0e0e0e0e0e0e0dce0fcf8f4f0ece8e4b870906e47fd4314273defdb847488bd0f444ec8263d2512c7d21641c2d9f185863e087b810ce9f686b86fcb4ade00986c1276d2dd9e00ba3d23987253884deaf68ae8f69a747b2511dd138b615191df217c6d5285dd320c6d8551284a349f8ab3899dea077181885f7193c43ece6e6f88af36c963e20591ebfeecb5a499cd7af4b7cc25ed9679e6b67ce9cca757b04e1f4b3c7f364718883fdb8a7dd428d6004cb717d5ede1ba3da86665600bafccdde32c97242902e2a829465444a434945414635262622a8a15091942a4841433024382d57fb24e3e65d0edf351cd8ee2d1575aab4543522ca09b66a6bbb1186f270506a2687cc1dc2c86f124655e2cd759e98dde1053d16f657d7cc313e7d6a85669be760673f031d0f27e0075e36ecf87f7fae96e22f1afbdb7689c7902b9c00e929caf57cc6632774357cec462f8e2ff4da2b3c3a313c511ec88b31d9b7478ca288474c74872be5e3112ffe0ececb82eaec0113e2e9c212c11a0c014dd15c8f17ac548dc6d9b0505129ace7c5c38317c9f1cdfe6ca297d5c3825144b9486babd1b9beef1dea2d08e23ec0916d4709f50a962604dc089989513ab034c004737757b602bc792c01311f8a29b26019d49dae4b257e3b53093d71ebb2dc35eaf0810018125b02050c40153da01483c3b2e2307b4fa024d8ed02cde802c1a904577d4cd11ac0608c117cc955a32d6009a201b9e4640359c9be38b1567c5d1da30f6d716bb95358a014eba7bc905f57a351145133a4de4d8b18029f00529396358f470e5940bc0d134b3a39058740b8d7c9e61b543afd70f5180c584aabb3d1b14f084029050800dc8fd259379c6938412272b0153580990352b01deedd9d01e8f1ada45a4c27088e03e89b584534349021427ba1bccf86bb5123f99cb78da926e62373117919bd84d0c87087ea67184859822fd0351f151428aeefe5be6f93497e15ac6a09e9ede9adc3ff5e0803ae04d4dcd8e32dd5e4cb7e7cd52a28947432bb1a4bb2dad1ee5469284d52abdb929879374e59441b1fb64d4bc0145cddbe3390b72e5944051f3364e270424717f091f40eca63e64b16b63321ba695d25c085f107b3bbabb83a1bbdbbb6183568f90727309ff0f36499c7f716e2efdd3623837498ce7181a80e7ff02c1f59f6c2e400ebee0385f48f86810047be41ff1f850aff1a17e7c757b2cefc317b4e169b3e1697b12d59dafb561b736bf1edf87ea9e2735f005451f2c0244d18d2f5863f7338ddd9ec436e14311e0c90708c0eaeefa65a5370f72b1be6dde3c2b31eb0802b006c02212246614140434ce5c6d50ecf57a7a738cc45fc3b799a7e8ca29938c8c8840133d29b972ca39f2e094a3b5b3181e83688078ab49fd201a1146e3ca29c325b7d8929bc822a224a285150024c4f94ce2d8f441d0a67a44deaed1501179bb46dd5d185d17b8d01d7bbd624d4eb0c00b42e0810e145802173190e20740476ca810c122021796086eb0849f2008af4e6104310c000955d8306300421a100325866b01110841086aa490a3891c36e0410688029003a702fc20824a16b2c062e22c21a2785610527458e8eec0e8aad05da1bbb34215583926f882232b67c48a12022baa8a2ea2766828b070594c294421c7c2dd4069d1dd31b8fba2bb83c21358504d5ab002f8144e7bfd6736e90656b9430d981f8fb328138068e6491413eb7f6d2eb130043a27d41a1de70741712e6d6e0ad1a1fb8b26b25eb9adb4aa553fba5e79a21357ac6ea56774ab1b9d8c8ec5a5eae91413aa19563c1696952ad5758dc303dbebce07950e5daff858f50c95aebbae5bad74bc17afbbae4b79465db7d2795d975209c2ebbc6ec5bbc1d4752add4a7b5d0c30e5a9a8ccb878a7f23c15944ed5759e4b5705af6be955a7f252df754abcaef35886783bbcce5351795d13bcae53f13a1f3a1c5d97f2585cb04aadc8e86e745dd7793f9e0d96541781ceeb54bcaef352b1ce53b9b4e878305d104bb7e291fad1ad789e0a27e5e2791dcd0c9e4e0815ce0b90d492d7aaf62cd0a95233aa95d7a57ab580ee085d7bfd7d5f77dda93aaf7b42c7e2e1d075decaf3525d97d3d9742c1d8ce7799eca50d7c3f3545e7793025f74b0dcd0c5a00183c7806ee5e9e8545daa6b6fc973974ed51e556997750848758c0bbadee1055eaa53e9542b5d8c2ee584e7b1bc529d4faaf33c957b302d33ddaaeb566e543834dc749e8b0a8bd7755db7d275afcef3829052e95a3c550aaa93f1caae4bd5742d2f5ec7b2d2793b783378337832a43ad5dd8c4ec5f3ba18aa2fa5f274789ed7a9742a5ad7c2a37b5979ddaa93d1d3755dd7edf08e565e5abc6ec602b3e2753e742c5d97f23a5567d4c9e0fd7831782fde8ab7ea529dd779ddab93c17bf156545d6a95eaba9e2ed5cd742d1d4cd7753eba193c97d44ac7a2eabcae7b759dca0daf46a7f2ba95aafbf15eba943743974a799eca53753f9ed7c1e0b9742d1d8bcaebbaeed5c9e0b9aca43a158baaebba1eef72e0c00294ca61d5a5ba964e95a36b6979bd1cd931435783aaf33c156fe5bbcfc6cd8b51d7799dd7755d4daf34d94010d17df1c313da7f80a20b293fc46ce1459179040e0c31c294768a0142374181836f9a37682628ac8800538c55f2010a255f2c4d9d1d844031c3148c660c373f50e4b0f9993236d06384183c7a625c3a1e23745ce0918521011eef4283322dcc502393c26b4db9806df90d0e393cd182020d3287a1c171d0e8275e48d2b2d512ed2a0174e745507717b151e00baa3871b161064d565a565a54325878565a5232c038159124c332a3e2c2e2a38299d1a96054622a5c2a468aa5d242000e68a222c35b6951b562c8e0c381262e446044554b46119ece8ed51055a702d482263f8410b104e0a95c544268aed0240946e020a5886ef562d1b043119e0a86540dd9c504ad72e0411315151a969cd898213480140f4510a0898e96223035606a0401c406c9825dacd00428b7f0204bc0b7d2928ab17a52217180225854325464e866e414a1040ab4e0d003272c60304086f7b2da81b5f2a30af247a218f1c26ac60588cb0d2a485438acfc18510228783042034adcf86e9cc4088514e08a262f25ed010288e19ad1118921e56345074f112e2b3f2a2e2c32523d473ca46470016285262e2b47319a588c761401716931826912814ad00487aac5e3a2f27a21868acb4b910c002ed0c485c5688699019aac52dfaa53f141c565e543058720a197b2a5078b918acb8a8e18442d3c54492d386ac470030c377060c92108d30d45b8b0802b3931727a8e965660542b30ac5e299e1618550fdf61a565c54565b30aa2f2d9a15bed48c5ac6edcb4b084a99f221f39585c6eb4f4143194f4a2c332a3e2a1e2a1a2812638c85011ad7258cdd0c24315c30c9c940c4634016dba142d55a34aad849001800252606b0738206505513aa081280a40c41051f889f6a10c00488030426448d392901e8c5e3e393337d85083ab5e80451850f042093a04d92003838e95276a40030c5cc087221d5e32d8807951b9c20a1350210506a2a800144f4460c84c0f1bf0010e706a0a630b549801018527a8206659095082d2827cb8ac48b104949e961f689101295e3f3c386abcb8b0acc4b083042340f2a252520f47408a2490041204a0316507051de08006882842a48727470d150ea44c8148d00f9e9615150f1c61820f50a00905184088094840024a282505f9e801d3692195050f0cd517fe04af0b95123c23aca67440f07ce0f5a08507303bf070e0ddc0b3c2f340aa03de934a49c7a3a3814586550c317478383c1b5d0dd60b2b1a1eabfb5432bc97958bd7c2c2e2adacac3c5597ea3a958e3123b5239582262a0434510951c1c1bb952a14f15da0c96a05b37203108a504181a3c20113c506540ad04425a4e5864b0c3904d0a4e5071510a9195eb20a0c0b10161f1597948f1c2eab193461a9a2490d2445b4f4a42220059822345985d1640503430f9ac06499143469c921c35bf1b1b25931f1c4c68b0e0618a13a40931931336252352c1b961cac308c58e5c0e2b302949a91026289a2490a09c746c545658a26a917151854ad179c54a78251b55c80ac7258f9410506151715253035606ab4e468b9b1f2438a0b46a8c0908a62c42a8b26362851dd3c66830caa17cc0c1596aa4bd5a486544b303854bc95222b3b5692563664742a2fa9950a26954a79a995144baac52506556a65c80a8d194b2eac1595952eb5a2d251d9a83a161da91d45b4d0b0da4013195314c15251ed602132425504236462de617441093fd0020752629045596b5a024a91900e3f7a6c85c2136c7a7c3358568e00a19414860d7690031a94b87182013b38a0083eb8010c5440820e60c006bca189322b816f15a2f0851078b0032c4440440000800408234a493c00a161061c37ac3801111de040008688c91083ad34c828021196dc9a84d1852b5801c9111c37583e80c10b58a002128cc0034a2481440c003f14514a3aba810d5e5003143861140420dc000658a820051788c20003104014bef0010f5490022b3ee0a4c98b4745ac185f70b145116280c5094c10820c2c81801763004072a4c851918f170d2bc60d6c1083083c6009272f02a0872320453e5e3262a89a8b2d6e600319bce00426088107329080249c24e9e1e8878f578f0e0e0d0d96aac3e0620b22c820062fc0e20426f0400612b04412087072845812243ad8805bd082902033640c21062807308091223714408001725154b48491ea82c7859516bc2cb06c40a5012f031e063a978793bae9c0979a540e29bf41831743b7630586948e2e870a4777a3e5051a34529f6a068c8c2f060c303a5e627061b5acb0a8ac782a2aab55aa6b185ce894aef492362fda90d672858640a559f4081a006a44e633ee2377e7b4853ee90d5486d6e896d111d3f80f209ff901e4b62d6c3fe8ceb9591210048f1c19a9c0d02b1f32ab1e36a7fb394fd2e6661babb6059a1a116a59b4e799a7e39a141ef5e2d7a06aa25f4bbbb69a0ebee0b585b7bfd9748b11dd2244f79737777745d8c2864683ee9ad02d41b5eaeeb8e81f1c0ff27bcb10879f1f9f9f9e1f9e9f9d1f9d9f9c1fd70fcecfcdcf8f8f8f4f8f0f8fcf8e8f8e4f8e8fcb07c7e7c6e7a7c7a7a7a787a767a747a727a7c7d583d373d3f3c3e3c3d3c3c3c3b3c3a3c393c3e3e2c1e1b9e1f9d9f1d9e9d9e1d9d9d9d1d9c9d971ede0ecdcecfce8f8e8f4e8f0e8ece8e8e8e4e8b87470746e747e727c727a7278727672747272725c39383937393f2e1f578f8bc7b5e3d271e5b85c2e1cd78deb07c707a7078707670747072707c78583837383f373e373d373c373b373a3739373e3bac1b9b9b989bae9fe8752569b7ca32539e2d29a719919c2877021dc5b2e2d1721dcddbd53427797842d5e88bf7e46f69e68852dc419c864fe7269c964fecab41fdd5d6434ee99f6e38cecc78f1f31f86d619eb7ee8e8b2d58e20298f0568f1e4fe2d8fd128f449a764cbf44126289aa6e1064854c08911056d1340e04e43833ae8110092bbc79aaf4da30ed3bab41777740e8ee7ed0dd6991aa424a099d0f7ac083ee6e07dd9d0ebabb1c74522030ad9855cc3e7fe118be204e8dff00f2eeee06dd9d0dbabb1a74b715cb2626a65b68a405742d1097d7ebf58ae11763f54591da62949c3112e3205710ce910b8ebd5eaf575048c759b9449230a7d78b87e3e9f39630a079cbb92488a6e5ca29677a108f922cad1ecd87a2b5fc4f21cdf89f7684a3e6ed1646899506793297634140e113714101dd4223af570e94f84b6e22111b8cc8cc489243ba00873c316487212cddddb359e32445e38c4927d2e9a61bcc8df4a8594d5a383595a0c9d61487a9cfec38239b72749797298beeae553a521bce614c0f68d02689369c791231adf8a0021f0cc0f281faa083b58405f06f362c5b222c8324cd4b582c5950666d3899e766ad7f9ab764ff34192c6adec46a674a539422a064d4a00c578a24c3592cab7522a518ba671eb2921ec04a024202a31bcc4ddcad89ef79c2c0bf65cd56a3b6f2624a3b0269709e719a459a00921124966e10cb646e73b54243b27146339b79a869a39933a010290de26b673c26563b13a9901023dd58c80e2fe46ba2230ff245102941a4e82051dd418c34ee696ead53901dba3b488ef63af110560f1760f5d0430f99867424a3dec59bad81b979cbd579c44437d8a365b40423278c603c74818718f020458332af196fa11172de642f99cc6b90868c601e7a000246cb4807c2049000b080e4e896d9ece26833ab4803b459453022596ec4719a85e149bb8fb3a3c3405b38494c6400a225d69017b2dbcdce5b9e33d3b014ff96430d18ea612886eea15c5a1b1069c808661222819003849ab0847674cbc0992791ece535e0dbf22d69a4bd22cde232cf58ae8f836c781ad9f0b45d7befc3aa8041b10e8b0261302fbdc276e802c45e613b48d1dd3b2c813bb0e4251dbee80ea9b5a85450eaf6b19e05994268464406000000531100204024188cc60362d980d04bc70d1480026dc270a24c9a49a32c4929648c31841000000000000002323310009ccc1df8388f8ce95cc9ced1e00c421a59ef3b3ac87fd1c1664a8b0b551e97e6b154de76308558c78b81b21cc3591f2193b7d19d21ab51581a20bb78b76b8ac79e080e52e373e312bb9e2614b438eb69e171412471612ab95f6b6fff4ded37549eda44bc55c825d0060f6a1e45f6fa5a8fcedcfce5c3a16b39bb68876ff16def1de1dab527a0cf59f27a3cce88c01240fd77b11f67ea8b6f005247faac5957f1ecb41a1c1209e5e08142b758d9e60a4cce756bdefd87e26b5e771f3031eb9a9053a5fd04647a522505148e6caccb44d3bf78e13dd068cd4ca91237562d165f5134f9b2a76465e13f9c607bf96384a0c641bd251f6d02c9a2eecce869728ccc8ce79f7a1f7fbcfc84eb4ac043637c2650987223a038c5b9f798fe2b8172298f25d09876c4ee51901c5290413a5eeb665b9cd0f48acd260f35fcf27f33ed1e07eb493fe8b1fa3e66bdf4ceca4c9649518dc91929a7e0dd9fcc5e7318c9dcbc16e2d0f8436350fb67cfde8c71bbd762b8e7a763881d188a4c8a55a850fb57273f9a6ee18c17b4dbbd2821ddeedc0866462e35a2dfc73f1c5d616d3549a7e26f1e510d81d541cc0dbcd1b98dea49ba988fa27e43495f2f6da303b533ff0ff0e1f5de1aaf2d39b7706b3027a01e666367bf639f72e6f9d413c3dae6d7d72b341146abed5a3279bdc436635b6681190d5c239e7e2ca5a4c96799371ab27ac44ba6250992584349df3628d62dcd76d1010f7fce09f4293bcce49c4cd226ecab72b0555a77be29bb5bedf4a8d6a95ae8bcbda7a9236cb30fc1b2dcb55a9b71f37296e316d0932419c228e8a2b6eee3cf4fa65ede34f8de854d03353a4265f7aff17bfb6e3cc750163f84d31504858c4d2952d60a73c495b5018255f02cbac7d16195a2ad3c01b0f7d7c8d512163b85d0d8d584c2a2361c06d5e1d8a80ac1565d00d6ea61b052098b9d4268ec6a42e18458fd5278baf161e07aa72d7302a0bdd31165652c3e10b4f3b551a503edbe05b5ebd3802512163d85d4d8e58402a3371d0cd5e1d8a80ac1565d00d6ea61b052098b9d4268ec6a4261511b0e83ea706c548560ab2e006bf53058a984c54e21347635a1b0a80d8741753836aa4262f7c265682dafe1566d1b216d2364c305dbc16b255ba3566d506a28d40963d94b80ba3b3b4381f16bba19a981774395106dd115c0b57a305e751916bb87a2795f0394176b87cb80ba386d5409c1b63a025aa71bd3ab1560bf6b60f4763446d9b236380cad09d7461590dab21390b57b63b64239b63b0e436377d330e926d5142900d5ee51caa942a31a53d1a2c550af4ce4eac340ad7f4dbf78b48f356f3d56ef96ddd48bb5bb414f3ebfdd407547d82d0a2ef0f8be30a9650a31a00028c9431f5eda0575c3b1a8319a297ed3ea6de19f4f1964445098eaef298189c4a3125c2dfaeb9e237eca7b6cf2d07199770dfd1a4665120c54ad235c6d6c8274e47ffe1b1acf47f8154598a7bc8bdaca3545400c37eb5658286effd531cf8f91c5b6b3d44cbe5a004b121cfe614bb2202e8d387740d162422091545db56b6597d1eaff65f55dc61be80a9506f93c5d0e8fa82258fa59bbeb9ca8e2c458d27c0a0d371980384d8dc0b97942e7d5d571bf427f68dbdf7b0b4f67a84c7acd449035a5d40600fac91e37e7b7171a9288f332990c107797f47b788d32dc215caa805b9ea57e25893cc92aa380892a8bf4f450a00be744b80b75f1f2c02112942ed70f32f18e030bbfc1acb3aa5f3a9f883395c6fdbe05cc03ddfc7b65580caf8d8d1bd8603727f554de3bfd93f588b7124262df8d4b1744105e9b8cc75da3d80fbfd15100125ae9ecd436b480281e60a581da58a06c188d0e9c6ddea881401af46cce1a5160682d014304cf18d1ebe1595d29a762d9074e608a7b40d5bf80c47753100e68a72189d55430a0c9447b8d2aa99368f7c90f245cedca76f38a987781ca093f92341ea91e396dc87854f5dfe721183275bd06e8e695a2637fdf120f344edc387eae4120f9c947afd0d0b92dc335d2ee675c4d7dbe2d28d9f3b8d926f6c4d787b883716a950654307c30ff38a087d7ed22a99fbccc4660a6fd648072d88814f42dcdc900b12d51545c4a2d500e1eecb0957ff4d7e993bb678361209cfc7e38176dc397652526423606ca6543d9d6fb0e479be6d384962dd70a7301f849c5a535e6ce90f8484da0d0e9c90591ddebd64d4a41c8d3e8ca1b2c9dcb7171f4c7a3a68290eb2ffba12f52b0c1c75b1763c59c775b697a4ed78e02796617f44bdbdc85f0795a0f8f6bdd048414f5798e6d567c1185c5f726cb00738a9993d29873d174fa41a0155006a3f98c9788f763bbd4b7e134a9abdbbbb8be57cb098192ff15964853104b281f90150e7cb6de9b29b118cf9d3c5c200c7b4a71fd8412464f1300359ca85b3b4795be25007f5bce6ab8712c13fb81bea1b934d09c84377a8477a57053efd4bd407f77e93e2268d8e3ae262253854c8be0b501979acbc9409734c8766b4df8df6fa17b1b31a8bca8cb0414b5099ab2275479ff59e1cbd484f7c6d15ebe6cc6e1252c8ee7bd93c7136873fde58683bd5df9e188afdd55fc05e51dca5358a7df7c031e022b2beae6f757837e5bdad93b71f847bd54db8ae18ebbf84807fb7e5395723d7d587a8f8bdba68654be6263a29abff4d4b6e9ab30425515a99bd8b7c59890e953aec2385994e4289aed3c3249f8586e436d402d5360662782804e5a395d6a61912e887750eca426b15e16422231fbdf44fdc2f1b2549c8fe4da4eed3c641a7a01ce9b2a9bd0e93305f39ff531b5e38ea23b155567731bfd3226fd06760d0e6eefe620eda361c8a590ff50a8ca6b083ebab3150c2a9ca46b1258556ae6c720e2ebc6108dc2704c83282acdb5e467f43cc44e28b95b92784058fb9e2197c22749a6b1d529b40388e9141f520cacecad3fab9cf1870985fa4aa2f72a485fe8f43990fcc0f168ce019b5ab91a71c8b1fbc0d3e0187c73a056f64df34b9da364967fe569fc8693169fe7f8e4fc5aa9a4d3ef2cac8f01d152c0571dc3d9872b558fcdd790a1f22b61351ee63b8cabe00bd5202415bc15bc2a1badefda4c87fcd7a0435901591d993a5d08fad765a68daf1eb21e5a54cbf0f6268c1cadf2beed56aef2b4f5e7fc7574f8c7c1d8f3b89933e4714bc15e09c6b0f52373ae4cdefc0d5aab24051e6bb2e5949acf42d78d313f50e8ddfb406b840b81d16f977dfccf45088d2e0ee4b2cc62fb1c92fc05b241ac7c2e307e29e18fbaacd0943555c32365b6b64153ded6ca4e88ac6437159869398556ed6a5ae11dd1a4cd5d7b132503c4cfb2edb0e1cbfa8f6e9a3e8866da914959fb4561441654d9917903c4daf826662e1d5db500baec674e10bf9ac549260e7c60326a1408efe0fe0b1e2b00ebaea3ab63e3073bb193f4feb897a33a34513e968e1e4cce249bc2a09a8b32203e4526c51aaaf0c5293b52a64e5d4e2b0c570a9b013509cd136ecd4fe09603f50635b5f493b59eb45e27527c72ef40e6a5435a59e7bc623a9cd92613d2ef58f1a023a03b093cbe67e5e85512203886d4da04c3c552dad3d3c696bc16e87eeeb93f49ef34dab2d7ebb5725bbd9b0793ec61b4c9a52b39bb53f82f89c048a3fc5d3459a32bfc2e863a5ac10a703567a7b5fd4a66f5d61f5f7c6231908ac657889d047a4ec097b54af175a1faaa5fbea3cd54041f9784d5caa26659a552e80df2fcd6ccb6ab7444c5ceaba90427aef83eb24972b59acba4cb737ee27213ac8e387195a457d2c8013e5591a9c974bfa3becd4d1cdd2553eb3d443990f2f0e265cc17aec664b2a6fbc0bdc49a7f1aae9c64b5d3e2d857c5a8bf150a0819d0462eddf0d7fb5f1f8b9f85fb8e406374a1e92da0419afd13d38a6ef44264f9ddb5ce84d55281c83eca3b27a63d2983df4a82e4871f200210ad09c3dc7a89907e8b0a70cb61beb7d93d79b01bf1e8fc680b0a60c6503d87f462b5644666b4b6fc7e111d8b309f15be87f02d064cd422c152ea03c402a273cd36af4eccc403901a5ea4a639c6391348bb2982833f35615a36cc2a6ca5d9fcabfd7ead37ac7fead5cd3d2c57ded7ce52346d9e60d487a1d5936a5638218112c0518b7d3ed4ea7a17784c238f9eb6bb8d284a0dea935f023c044568c824390700a2032b4a872e601dec331c1d1fc7b8f2a746a712ad3dbb6095e2ee2160ad7963f90ab489f25ebdbda0a51cf101845695eb0f5526127ff576ad4f59d750218b197d1ac9d89b3d7275de3e18e0b7802c7d5f9759be988a729a2047178024e04cad0a3595419433c514ffa2c46fff6f7c433bcb375408b7c67073f512f5b803fa2a56bb00e474c7765adad22d1762c50ca6c5a0013ebec1415dc49a4ca8f291c32f7111e1384d37fe584fb6cee3c720576a0cf8287172396b3e84a6fba3d008b67a5ee68b2350f985758feb9117d28ef34fe2258c8d761793a43df192110bcef6a361671a6f0b79821be965974e993ce440d1fbbaca5999edecbb28cd81dec8d16f347ad6569e770b5c790db555d2f27b66a8098aa7f9381abbac770b1046404683b80cae6c1b16851dd6c4170bba7747ad91498f5a01d0ab66a607fb2f7ac75e2ef47b9c00a2797a6210d6e11b477686a5853e9b1320138353b94910b5cb2f4d77646bab7894c09e632d7e568ce0c9d6e3fe3347d200a37aff69f181ab1be37efb4095461b66c77e5282696dffe4fd90981dd67ff2c46ac0c03fcfdbb92fd9d4c8316d4cd29a1bf98f476d4f19c5cb0fcdefd1692dc7f96167f404ab9ba3968303f606ae8e68fdd8e73ef6602ab6f98885610656e345a6a1d3307c578ebad8e0869399abde7f559f81f37479a3979da1c96d5846eb4b24f64d8eabbce3fb7844d6301735aec70fd8ed744e683a70c896b13c9c077f7f1ace9082816393f8bbb42701e0d61626e618e09e29864dce1f1510986c4f071faf5952ec924f1bff899b4f6a27a2a2bb070e8a118cce35cf34df0cda7b9ce2fdc85df7f078226870405c338a8915656a7c34d8826969fd12e67714f3ca72db2dcb09f22d32a9c59805ba5a18dbb23e7f82a5a71c4b8dcf7a9dbd6a8c4d72b9c6d56fa93c7cf91f5618fe5a9ffc8448af75c3e4be83c1fd3e4bfa32ec0edf7ec1ea912b29dad53cb5b3fd8dffb859c4697221e0fa8520c9ea73c2e9f3c5fa13e373e87988c2b951227ecf38e5f225fa0da6c0847597666cb4f8f1fec682f7cdd124ae498b75ef025cbf001663aa0c48fa6977876893e92796c95a15cf2b0e2ce566abdcb549bcb65c8a0d639df56f3142901760bc9e421361912a6be80bbfa0f3db4a78604ff44cc4e3f768dba303d966a4710ab80d78ec9b390f675b0e08ff6a6cb8fa2671b77cad452c78ca8af95b78441665cc9b2de96f65f01d66696da7ea6829edc958197cf310d3aa7c437ae3972e082979751efe21c9f16fcbbcafd525a03dd6838758c69ff2d6d7ce0bbdfa66906f0f903fc3597f20d986caf8b9fc5766eadcacf017caaf86b4f685e3a6f4ddf7e592779e3902f7f35b4040bed9ff9af7d38f721da3009eeaed0a9a47de6367bc41a04925d897b9ad11c512263e217aba2557bc0f7f066f9e68f919ba73dbd7230d36356ef61ac6955ff08797ee91d7371293a53ee909bbdaa6a20e25031c79f582c6645113c74c51cc33eab45ddb3265c56c4eb980e52fc1e1175ad4e715eb1763051ce881a33cbac09bfe00e1391829b2fe9caf1a31d420757549c154cf76c0059494f1be805af279d4bba61db5636061f28833ea1b4fe30769bf054b1bb2d769f049b2a9b8e9b35cc04ae790bea9eb4e26a1eeefabe2c12d9159edc5178270f3ea595903f57f72d0e16edfc92523a353d81701bfa752301e889957238f47c4f4e91379b878e5494d98a4c89fbeca04cb1032bbc512025cc0120ea21316e529f158f5e866f5155f4fba9480445c761b2dee2a9841e582678c19636e060b12a5829998681f8e992800936dc65f4758ac115e8bff45617ee899e156c4bf9ee0c7c68581ac29001aa468b9fa0d527587a8ed9941b4d338fae460842b1a0a4332b5b819a00b3a2937600d1e951c9ac214d16ec2fb414ce424c0b934152a702cc71ce10d92c02dcc2f5fc5fd873c1c37ccd97ea9346bfcc078c08f0aee0f77db32cd5eee319cfc8180932343e6f8fd816a4678002fa51861144f3c89c6539fa6717edc2b3efca94fe50f0914f451b0187b780a541435569a1edb1510ae73be6dc83d37300291b0f5e8d73c18b0a339e6984984b01ef3b87ceb34ca58e7a8e2cf81d4535e773c6da8c3639e280129aa92e36bb618b20e411303acac8d6bb5d9745190dd4ad8d6edb38423f30389932948aa530a6bfaac72c3d4f4e8f26a4f906f0286a6415a55c1e05d2dc7ee408af39e41f80ef858f0290cb08869c12a67748979661c10c112226d95e7e78e3b871f55646c82ba33cdaf8f424604f419982dd28f89cdfd34ffba5d866262006f00faf361b95cdb341d5320b695997ce962d04c9d796345da619856fef07a27dba830d888f5173ac75f3a81afa610c3f66b39fab7c655c32df4bfc107ca3d0e9a352583e1919d047756309897671845e7776494cc54500a0eb145f68be268fb5749e89798ca3023cb1de1532b3a66a6d3b90cba0124d0763174862067fab0d8b39c1df6a5288f94ba64d474aaab1b809363c96cb79787b7426a0d88c65e39a9e630512d329021bcd1b7feacb52cc9dc7fe542e0a9d3b9cca21678584688ec13521f9fd23f3166ea55f9f2e0e3bab23406fffaaf7810d556483db1ab8485b8e0dd0a6999ab3031593195177104bb4c608442e02ac6b30a8f494b57ff01f69323fb3fa4dcbcaa7ea8c386dfb35809787284a5ffc66cdfcc7d027e688ae02210c243c23ae94017d48849ac1a2085e8da22f06ca56c25e89d5cab4176089da3dd4ac477d5e6bd01381b3ae0815ffc0ffcb58ef01795b8b0ebcf6ee058bea54d2712e4567109564633c35e5e8230cfd087e86b745f25fe9eec89ea4d145dd82805c9378bc3ac8f362ff6a20b2a1bee0d94e1a5f164ee895af90b0bf8fba500a4b8e8b62612d5ad996ba8d54b7062acddb3e7ddab9114eb513fdb203233e0e5ba11de02cceae9f2a7adcfe391b7c06a06e22b9f54d5ed3fa0231efe200444a82d68d8630646df0a7cb802fa2a14c873c5e14ed3c04a192ca9ea40e81f2415493bd0f1cf027f270c16508e63bc2469022263089b64cdb8b9f8958fc0078bc1cb8011631e974aee99ef81ade18afc0b74e09bac3600f6abdcf11f177a143eb75a2432ea11a2ac87f8170cde15eec0258ea823603875cc66442879332f70beaccc07daeebc9f36b22d19514d3db0da03d99abaf34a39de2262766168ac602c9f5af657369807ca76c17652d17d37f8b583076eb4dd33d306fe2a3a4b1b2b41879d8da929140fe1f9101f75d47c71cd859f8ff1f6b1119a8f30724805eb11f6c59212648cb277a9ff53fc53a2aee05820a55f1d524409c99764401a6244d880e3b889098cde3995b20e971f7d58a08d6fcaeb424edd181df2d53b9f165d625768671c55f1396846415143e12dc77803fc2d7fa4e94ee81c2a7f9a7ddb7227a09e5676624cff11552d68e92aa2c36d8f2a598630b40e82b3283a9df5ec19a17f1257f42d54d879a5da1e41355081d9abe6b5ca240415deac12733fbbce26070190874d960008087d2fa10de14e3caae1dc431d7d1f6497d144ed25a49c9f6b5765cd1e6074e855b5496285d134fac99b1f272ae07e921672fb5fc7b640785e9d7e8dc79f3b7bfc3b08c00cf6fcfd98cc00c33f2a6a0edb3c6f98f31f4f0a80ef6bc64614d54064678345002089fef5e31dceb73b65d32b54f4b65ead03a1f91c85ec946e444532a743438c94b68904de3f6caa8e9f0fae041c38f9fbbd1a8d43afb5d13bb22212ae1920487b09573bbae0102acf8c78320b36a5e51a1ea80ed7d16bfa2ee15eccb95fea218aead26b1bcb18e1e2caf0756ee53e0ec06897c7df243947fb16b44ab598bc31212d3b523cdc4625db1144a496f2e9a853907eb7a8eab6c8d3531dba796f0a8425419def0df9861a1fe42781b84061fdae7e3324d22e2f4adb01592295c7ab4bd37e65df2df37185b9e7385c8b0079719a0cc74454361404484579507660600136fec1937384edf670797ff89b76fffeb8d07be9e1e3a2dcc45c4146e62d8c34902bdd2b2e548e3dab4420e76cc55d0c5a501eafc7f02d0c984cae1dd6707c39cf44b51256a3476b63cf91425c422892f655ed2f4cbc34b279aecc9cbc4636d4d147d284eb3d6f6f2915eeb85c44aea0dd9675e05b20a495694bc83abe0d56ae853a4882a05888d8a4ae6ce85d91781b2872c2ebbf47a45285ea8460aa7a1e06590bc4ab55799e19b316ad31ef29379405b7efb5fb9de3b9757e3d28b0441e2af33e618d59caeef62e8d9c7718e3621f6df3ab4d3842e094aeef657160475fd12cb35a3c32bb28e52f7b850f0c4f764c9de3b799e1452aaa3748dad12cdf3e2f4131961d4b7a031528b561edd905ca2ecaed09ae65809b6978892383623d1850d3b906fd96b54d0a32888b4fb7e853d75adcbe8b5e740f8388ba0f958521b5947a30d162f42740abae6df66b68e0594ac385479126be912cfef96c9f2104d1089111d23d42275bd5534db9d178c24f627443b2a439e25f8ef70bd1c8b600474b98812ce5eb772542d92111b1ea10f9e4635d703f3a32965611ec21b473032ae5efb0cc71007ef1b83a339e7ee67dbb44c8a821770edcd6541d13a29961af3504b8d04d40d98a4cf899e719ca77354176ebc3f2c269e3c87044f4b0458cfc8c023076ddf15fb59e5ad2ffce3fd0758f8624272e39b257f0020534c884e76c1f50c716721c013d1aa0ac4ed651898b9ec1d393aecca0bf8a3ea49752ded59bf31374dae97ee5c7df9f33ef9500ef0e7814b1dccae276889f076e636cdb38ad68ca0179ec803811074aaba1b2c4f357e9338847efc1043a80b27a894980836dd3078ef67e962d922cc3bc44c58c0e184feab1e6ecbbc0a467bae8405183d617d8b4b197bfa4e3a66cd9fcbaa3f3996c31d69c8bba77dd8d8626d24f61f6a2a1fc0e4ff6fe5a781fe4f4e2c5c8302fde532796e11aaa97a7273c9ba13b19a1f71da4d97619cfd4a9eefca5495e4e995b7e492ccb76b9a0d186827bad85c741f108813f113c1ea4d0f35405ff0a8071c13f1754b8b0d1811d353d554e64eccbf2f96ba49d40c24c3de35c56d085999c436569e51ed3b6b6f389663f7aafdf582111723680e48993b2e744b130c3d2e13e76101926f2404bb51ffa9d44e112ce7ca8ccdf4d247f1b377a6d9f223dfa8dff6104bb1f05083077a5ba004384b66f9202715e91434fc3271e8c7370bdcce48959c82d9da5b0d30b3c617cd4dbc865fadf064a546addcfd5b3fe161dfc3423f7bd478b427dedf17e7f7afcae0d986837b5ce3b57280292cf6b338e3c192cd7735d1933ab9741e11258b0c0f01e28d116333d1d18c1ec3f0102b25bcdb5d64df661d02f63e9e16183947b6e803fc426744f4d4b58e5581aa9a0172a3b2b94e9363eacd594b9fede5794fbc7c0de115c9923a4412a975f5cf7379fb534be90bf26c543918225b203b17fa90f4b4e5d6cbd9116ce9fa63af109707d8ea67786a6572a5e69270910e867c81d373db9d568ea86f3bc6571b086cc6935473df2bdf91ae2e26553acaf234e8e86073d8983bde473d377cc4c5dc9c8b409de72d43d60daa11afc0f95ca3f2aed49e4979c7a31a80b63db6d6dbe53b3c5b3869ef56e7df4a22a7d9cc487794d6be6b46bdda3ea59bab18804c5d9cc6161ccc7d048917f8b098a40841217603865f2f356292f5681ef0b243789454d01488afe484d518e405b6a0a8f2909d2631faa08a594c49e43258b431c3644399b3a95ab3235eef12f93c368fc4537900e152daf3b3eecaddffc67cc140492163a2b234ae0c034b254d1dbcabb996681d5f069d2a5cec0bc5da6d34a3a748c0386d0d9273e0e25cffb02017e497603aa518b56b18ae00782150ac46c407b504cc5742db08bb57f0784bfc9cc2f926361d1264b10e858ace5af252863888e6f8e6e04058b130c14e2f158e04f977025724dbd753c9680a315421deb8dc3e94106fe3096f7c43d100f83cfe613e7947eff42764f68bc9f8c76d1fcb2c94fea7f97f01a851ea089fae81c0fdb1c078f3b26a0c636381acf7f740f546fc6c0a1365fe6c6e5550f71474672c3337144867c326298885721cc721cf13819054c0e7fcb634c7132f14c9a932052a38853bb71d6ed838bf8bdd02240d42886412f77bd7ada5a3b4e1ca41f6321a0eb53c5502ac465626784fc598fc2355434a872d0d79762f962f4cbfcbe4c3c8c829a2a75adfccf47e3b62557ae4fdd1e6a4fd94e918287183a34d23225a5fb748348eb1cebde1847a5cb40070008bcae6a238c4f7d558fc3742c99a469e249a6f567fa7cea65323694e4c0280cddaf2df8daa1492ec1e6037a3ecd305d908d504959a0e0079d1686f511179f6dc9d926a52cdeeb60635c4ffbd9ebb874089fdb65613a35fba2c1f80c5e6c9c83017412bab94c66d33df3089ad062b3864bf870885cd39b0fcfd355945988f22807640d177b2904ea089f3dc172e0e5802f5e4b41eed4e945392444d6e180735643211a64c3bfb00142c0c24453be70085f9528ee4458df72dc76225d4c9b12136100cbfb9a1f5cb6b492d6e6aed008f0ddd5fdafeb1fd9a0e77ce08c370483156996c4a04572c917beb8bd004ea974388886dcd850da8ef4cf58b5b21b9801e01cbaba4f97814e642d31f79333f1430aa13c0cff97f3d9f22125f5407f918d3034769e7e21e59b2c9e6b3276b86da59be020701cdaeb4a7ee5dc82213c782923512f0e054922bc727df923ef07ff0b1d760a64a88e49e5082a0c9e2111c5d61b3f0e95a3aa19f2045e2087468ddde3b8ec0de3ed823696748f31ca5e15b6459eff9cd09730670a1fb340f6df9b70b0275b83d085f695001150fea4e36532c23c2faf817458bf10da7f3520fd5640199e8640bd5a10bfc8a079e78ed2662052de2e13a09dc44ae320436e56577d44d82edbe6a62e90c0021703642282fe10531613bb80ded8a189d88b14bf82034d6a35d79f8d3eecc0917e501dddfbe9a9bf329cdb06a219707c9631ea631667a5cee141a80d5de7dd24d3c0aa28af08024ce4c692d04686d4d03e78944256ce08cad7c58f49cbed73a1a3284a96dcde2b0e29818320054878f0fc5ce266fbe4228c265d7b241f72b93ce6977169e3afffe5b11ae7eae0aee3c5797be003fa6855c3f07d107952f85c307dfdb89e39600cb63b4de8c1736ca982d1c6c84d6ffe5f99418106a02bb5f7f878d95249d36716f6c80aba17251755bb30aeee7d61976636933d1e35dca746172fff28d9fa61bbe55939967ac5d719a17892f0963284a1a41030000cd78cd7fcce8a1ab36dd6b6dfb4baaf0cdf5d9b9d247535c1d50d62e6a20e74c5e50337044ef94836b8f6b214895300ae03666db80eb01a12260fda808b32d4d259d547be71923e6a331a0fd34baf34d037e7549347d4efcd37a84e78d4844ca574a52900fca06f394e2270db2f8958bc1dedc99da836510c15dc6e1ecb6ede06c78aad1b4b27269c45726d992f59988698c2f96b002366f9fa34ec53cfa3620a7b06153b01245e3ebbb7963ccddc2b423988f997b470da14c8dc5decf4916fa5960e660d75b6fbc341217f188baf6bb6fdebada72770e6c16fb25b7285b5924a783ad361f1d401376f17d2ca88c552a522ea8f9f004187ac430eb6d5163565cf065f909ba5b2223fdf6a1913e5ce74794dda7aa98b5ada8b94c34b94f31a98f55250463b46af937d1549ff5741e81ce31d61dcb760cc9e45b06066443caae518d329d8a27c9ff6020b76fd2ef79ccdbf8159b81c0316273de6c0c5c5b7b029ae5fd8fb9b226313e50ea9a37e0a5262ca9cb60cc84f3c12f2a282db000297b1301eb6656cdcdbbece2eca7dd989be8ab6057f4c6e325bfc8210c60b497a2d114ac6d492453c4fd9e0c246fe854e6ae7128c0ffe8e3c941bf82ffce7054065cd0a37d9a0deda01e1ebf45097c1c9916636d62fee87f022cfac2a7bf66434264cc1ec08e02c06f360593a390b691aa04beaa4c9a335c611d22a366984bf703e48d553550e7598440868b14facbe285c62d426c7ea9073da7265c2355d4ae021db46d12acdbac932c0429898663adb52fc25360a3a4d292589765a781f6d9c124600d0fe4a9995eeebc86deb371bf38ba27b733a71d4ccdb27c3e083748e89c296d35af0f679c2575e957f9da005cab534c1ae672f287a18bda37103f871fce91dde6eb15a8ee2708c0875b102c63342bd7ed0198484a648689d5222a4150337716c2c39f1d6af87673abd5614e79ee389e3c3a367f9c97c2c6a96b740114263760f0b77b1a43aff905a8816c7a1eb05fac6e585e8abb1e3f47432f883c48f514652fe6f8d18d0b5e1ae07f90ce7b421e6e6a1f57aee02714d6a8ef187f4bc267a0e8383962430e01aa2f6c4b48e86e5789e304cd4b00868c39453b062a4fd711e43059d588f1475facc9708d182e91bb0c94b9c34fbf35931f4561154c7c5131c0d38c69bf270a6094e43c81202bc66129e3b778c7d6b62cbdd39d5e1628ad758f298c2d7f8bffd755ff0b44f5b5e2862e6a8169fa61bf94fcd5ce4983baa78b2b9a8b69f98f8c2e84fb6cc090f66cfb1f1a7ad78306ebfdb329fc0e89a36d921367f2ad139d1361c0ae31bce44c60a8ed31be8753589bd099fd7c33e59bf4b9f6fd8dfa9bdf86d7310be66236140e1f837b387ea7882155b347caf16db01b218c3eff556f5c5ee9dd7cbed2b1d5f72b87d787667a93340bb3f579e9e638ae3af7bd222ab8d268f296e461a70665d0676aeafd760c00ee86c1a1701aeed393b842f0022523239002ab8219b04730ce76814de473cf0ee3e98927d36e031ae141fb74bec187125eb287d953d55767ed20a61b96c1822253ecad5c77c9bf0ec7386b5422107c8d2539e9fbfd084e99b1c202b26c285ce92328db0a8daa49c0961d9de31edc1dae026de93dd94e1bc4d63cdd1a036bac958b4146f992cbf9a18196a74439c8fca3d98ee68e73290d60f9a0ec155c59f311a7a4955287f080879e5d0b0171e1d0e625d8c110f89f07272957351ca80120048b9790a89977d8cfd1f3d0440e414fbc4d722a587aa991f24e4d7402bde93e0124a3723868d99cd1334608b223c8f71f27fe71c4fd6ce9bbf922fa631d2a08a7cc8a846679dfc023ae3902d53a21fa36b47a6721fb070ce1516b690971875d25837e2eb88ae39e464cbf5268b4247d06a2f19be313b50573f8efca8be4872a3302133e80b01c894865905c7eb919dcc38f531f0bb0fce63bc689d993ec5fc0020ea0377f9ab5ba116c60ca3454491863c9da34125f7d987c99fa1b58e0e5a823e3ccacc8350efd99dc24fc28f92acf5327b91068c0d29edf3d59803ea5d8a4c84b9e45fda2b3498792a49503dc0c5616124a6b42067d6234ffc34a1c2c3c5e00ead1e615c5be5197b399390f16353afcb6c73cbea870c482b4ef883d9bdfdc30c169b25b15a447a9b8006930de658767b2fe7323e7374e4fc1d4ed71257114a12dfa24abcadd21b54801239b7d4874acf0ecd9604485f59b41e94faf8bcc9fe4829fc48835b962032d37ef5ad7c411a25d19cd2fbe9a4e833500e21179d6635fb541f59bbb658507511d5d7f19bcda8c30ff465938975bcbe5ac63fbae2fbe9f90e63f99ac93d3c67e939e965170e0990aff6a5078de19c3143830eadf83f3405ad6d1be053e174cf7216d7a1865a218036ec7486310434314450020603635317c3396f2f42a60b6acc25f9f0a27620bd75acc772f4966f98aa016c5721903be0ab44a417455e5385c13004a311d41c7baeb35fe389b45bb2398180e46e0b649935383ae59d04654be016e83f892319c089bff2fc7ccf7ae07db45a3d0ecb649acb4e30dd93e7e1a6eec9c0b132287d287b44664fcffe0fccfd91f88c78e22ecf6a3b8898394a2d8278f4ad5c3130bd8ccaef904a619982237f0a6ae5dfdb3b3eade8e57a81c80d32ebdfae54b2347b4e65627bea658ce135a9e5567e76e81d38ee30528a39a418c2f431a555f68c1f80d8081319fab522955c8862eef978ceeab24ea09c3031c74d116aa669e58c13ddbba1812f8e1895cc298c2e798afc1f39bae23d807c6e5418e2c48f6c53eecd61f777a7f7315771e3712bcd14c5a06656cb3df6630b8732c0d9d1c775837000892627271c482d6930e0fc291743b43d85ccdc5f496e5ea258ea5f3aee05a10b6f81effd6ec66c158d1574e21a3498eb327b42ff8170a9a39f0c7f54a8dda3c6a09eaa245c45242ddada0bdb7b780989db847bc22b3c591a753acc5bc9fafd4dc1bb5a94db69eb53ed7d2c3a59afc76fceae4963c496f63f1093bdec3d43f5f2990eab7046ca2dda6e2efb32943df8b0db2ef02cad12d262df0d2cc8066c00361933c6c4bc0159b417aaca1cb893060580a99a072231175be3b3103adf3d1c7fa6ff61d4600e57c436dbfbf26a6c90bd754389484fe61e3ffcdc8f2f79eeb1d39b37b367f7d7f02b6c960a14029c86f307b214f6364d195058fffc09715453f5493973df7ccde6ff67995601dfe42d669c3421391a824e0d3617c4ad00fa4373feebc7a683cf13d191e7ffd3fa002beef5e457713f965704342f914ec5d0aa6d7e1457968aad4e06ca58ce6b5dd3624e596ecbe00fa231a246a04c44e44696582e63308ee2512ef6fd53a48b8ffbd23332c8516329e0b50b798c6f27c83d431ba7271300fa353fa9cf27d8812c642a1637941d1613df2efec20a7565a798dd5c438c9d226fdcf00c497d2450f326ecb56803f8dc446d246b10f0a99a25d53db96032f8d2391969e90363f4226a937a4e3cdbe89d8d67964ffac82c424810a2234e1e37ecb62797e2697655eaaf63ecdf8bf8b403dfffb4e91deab876c507e01bc21f3a5d4e30a570550ad94c4f91c16a763e988b6f3ad4fc2466ad53e96b3f51a297037dd0037f730a2601d1c538334aac80a31f19af2de9aec7d95caf615e958782f8bfb1d60ff06ed6298e8c0af84977e6d86c08ab60564d813866e54d32d87ae7306b01d3bad7535b6bbbeaeb3827c29302608b45aedf5ad5da2db8abc54fc96b4ce58b846da0bd417060461201b616beb91ad582ace4d456ed30173ec8ecc7a2b00c6503c9a3809fca2e52be36ce404b2a35419863739b25c7700cbe57065b7a622d61fa1f1587ed18a384862a989b12f91d8b000f06cc9fce8e41635377b8178262c5118c9e3b83cd5dc294b718b687aec3bd1ff4f584d5eae450dfecbaa3eaf70793734e49fef5b0ffc1d96ee7f5c3710fee4928ec58785e43f9699977167889da456dd676bf3e20e67ab8bb9a0f51959dc9eee8716d9c798faac183290387fb6462654046074327a976d772dd8f1dcd87025e5f4cd4c12908a099d9570108b63c3c237ee7825e1b5b7b7fd7cf7f928c978899cef815bef4111aa39b310fb71efb19fe9973dd380e7bc0ae013c7c1d9313c128a34f240232080e7db341d5cb74296decb5f278c22309e532b0bfee88720d69164dbf059acbfeb69af7d05a7476d161e1dcfb70f1e1c82598fcb4bc004e13bdf07053b7df4315c261a6ae279e2a5eab5a9b10dc1bde74605d42a085be97dccbbcef19bff052fbdfd9ba2067bcf81d284b4f6df71d5c31f5827fa334f36366c2f7fe0f9e82e72bce1b18a7ad8a68c8a22a676fd49426ae9b5a55b80ff547757bf27730ac5ddc63b36e4b37c09bd135bbca9a287c4e51bd32935d63c98263d712103f99e60fafc9f73d8981ea29f962d978da87e1ff345d8c508414f96cd5d024ca5f3613a0853df64a5abf761fa0380a260c0c851e2e3d4bbc7464ce6819b2061549e383c584714409cfe4cba4bf0544effff1a3fdbdbf2cdaa50e8ed6343eee7e8bafa8a5dd2c1a202ba1a49d2644691798d70c22a6c3a1b7790aeb606d7aa388e3f74fc9b3e3b581269b728325e3534dabd3a8f3e9f69aaa03118f1b3547beef2651f4eea1f126162a7e9ac7fde15b1b8fd86faa91b3625e2c9f5b84e99e0f97c4c7c9f9a0918dac8a3f39f04b8babac7c2b23370cb1138c2f18c44e9a6c7965fc509239c70ef989f1b96a2f063adedcbe7a48a08b0d09aa2a07d8700af07f62d02b7deeca6130ca72be5d2f74fe61b85bb29998c3eb3f1eade936f77d4eb790b5ba4fa0e9088510ff384f19b0e40e9d0601e60fb33fbb656878a207732ed1a586775650c9271f3dfe20d49e973616e27c84063f3d10abd4cd43927f1bdb5fb19a7475ccbfa16b88b38e90d06f52fd92928d4ac1b59e942d128c1c0d5453415f80f620d0427863963b7cf2d7b7fcd869eb7c19a9ffd7025922dfd7edfe87cc45cf56b7c12f244832b1f9e22478064741be81cd8336f2e425cd1a75464d293e2ad5f3538c20d9de3f98a50b0d46c3e04e789bd99a659bdc5507c5783b5e29e4033ab3df2ffbc4cd3b802f224a2c67163b0df9e321a5276af08c8e6e351d0bff5aa92599417804de73853d1a89483fe62c077fb936302a3386050fa55667cd6840554b2c3e80840bceb32dc4f3452bc43ddb0b947bbe60432d23206d03af083b9d58a29c9e1f8a65f7a9d11c9551038bec17ad939478fa75f0e62ec058642d34ef1d8b78b1602b3dee5f2a01197c8cbb4c7d110fe47361fa1d7d9712db773f520d13215f9dc4625f6865e7a1bd3d4713fd32dae261fccc6234293c8f2a778222ad0968d309039900b404a8394654d6fb32d77a16f70ab17608ac0ed1ee91d16736e1d7cdfe15bf8bd58f69264c8d0d15f38473bb3969e2900fcaa5456eb6527972a573805753f5c1fa820066fdb0ffafc5dd1b3bed1992ead5df50fca33e9306a90e3e92ceba17d01d016fef4e3f24de60e949b4a2b22b4bb05a99114adb2b86133aa07e09357815f8403add06d552792be914328e3926060944b78295d7b552f35a5cf8cca4411f95d09c0480c051bf04e41e624a569173320fe65c474b06e661b17a010e6bc39800df00d91c77133478219dcd9ada3f7656579749501fa56f9729d9f2c98fb5c01b620aec4d5ffbd812960ccff3479a6b80487b368472fdc8e5ebee2b5d3299170858e7d6afc1abf48245f76d93fd07032ee1c731974ffb11d6409f8a53885c0f70d9b1700ec2120038376fd903a3f6ffa3652eb090ce906e89426563c0ee095f36eb9a3fe8520dd18af1791410088d3c801b5b49c1fc3e9bd57f06999d44b8da96f55e553311bc5d2f30c44174032576b7a351e13c0e5b4355f40052bc386800d4db329f13384df2a0ef3792df5136d684707846168bb3ee0a212cad05af66ca26b7f39b65066338d0de59d8c3014e4e0cac86538d7328f40fd02ff28fb129e3d72758413ab78d57f75f074030a7c04e1cdb921e3e8618afef1fec37540617a7a222d16c3e0ab575ed30c0df2b54faef5afc7c270ac54b9f1d559a58ec2804be0bf12fd939232d9f84145e17f30efe2fd2d0a279387f7a26b96a53446e3d856e71014702c2253c53b969cac217584cdc36455f6da3ec77ab17566a564a58851bb61609805564fada662d2ca12f5508f1aaa348044ebd6897c999527c37fc77d5e85f660655a547b0d32fed6ef69f3f3804d304b129dcdb253726a6286c5954761db17f9b0778c3d4248a8a1834cfe8f59b42e4467cba83a8b6ef36083047ed01589ecc08cc48b0c0f2ba49229561b42b47968d23cd4f40d6097c8fb1dc0ac606b67033d544ac22c1eb0df7b020b2f01225151f66b95a7e16560cf3a6aaaf9494decc2d034016fa71831667aa3a4dc1528f8da03892234b63f5385d511aa9ed235b9880f1ef7fb148c8ac4d504ee59410421c827d28b7d47b0aef2114016b5154cbb44c42ac5d765b82234f88c34fd69b77a790c3a76e0a653219756db637af69d31fb7071c00a2fe1167b7b15ebb656d014c74c853010ddedc2f5cf88eb06630ad32e7e454b76dc95c84c62b9a4df2a3a1bc412026f9438f052a3f82bb48f41254146f36729bb134adbb59673ea26ca8a2bb6f6154fd2c04217c5f87f9b5562db2115f185a2c55f0431dbbdd47ef993e1d2bf1114dda064769c81461982195c07739f75d91f08b399fe7712f092d2e0fa9859ec42f1b23cabca214cabb7d167a24893f343c3b7cfe647dc13f80db8d07e90ae0a56f6104d127ff73cede364b7036feb58cf0bccdc629c122d674fd549e4dbf69103620be857c9d0a9eaa6f15ad0f20cc8b9c736971f77f0688a46f57f893eb27fc4761d7771f14ec227bcdbcf8a77c050f1c41741653cb3b2e5f0415a1f45b0029dd3441dc50c00a2f11a7296cfb870a00e266ec7f05eea091d1509015d87044243e78f254cfc7e8e4c459f0821cab30bb30bfeebb586537f7633a3d7f2eee8c10b5cb2855f4b3dceabe2b72307e995aa60807a1a1347a2c267fba3958e1c2facff4c02e3ba6618224fc14462e04556067d2c0ab7a6a6c80718325d8cdb0286317d86f0aab950bba649ab0c981e8a5917a3629e6abecab6a54fb29e2ca7a7fa9821c2f500eb18b370877e3e86030cb8ba1b9c4364b6df0c5e05884ecbe72ed0033fefdc9fd4c8e8462c71be43d7bd3782c58bd4fde7146fc9b57ff781a7478727032b9ac4bfe7d4f03fb48fd9723f06a15ff075f434687ef921ec22c3ce14fdd2c334c429297d30a060b5a52e8b628346a10089022d000a5eb4821cd63efb0a5c7c8ae575b5f6ebb21ab096728ecfe476c722e2cc8048788cbef459288f62b122293563def5a48159d8c2c7407a430fd500459858a268d606aae9948a670b2fc69fa5384644b7130d7d29680d85c3abd844d3c6eda7a61b0e7e36ff77981a71ca448d8042dca07269f75c03bd07b553ddc125766658ab5787b812557e9e92ab29fe739a92ce895008550e2eb4d542408286a38953d9e9640d100a4b9fbc7183f8ac69a13b82747671c8cfaa247be7d5eb9a6a8846b00876a30799938a3bbcd001312679a57aade60878209c7facd4d1b7c451aeec681be23ecd6ecbe6d718aae6e7b5b1359cbfefb5fe6611e32b743ee02d4fc83c0b972683b31e4a0a008e840efcf971deb3f6f4d3ee416d043b234e810bc790f06aac0f666091810fa5bad3b5cc26a12f69504cd2b0495a396655e2a0524c0c2a31a0ddca087b475156d334d1571ab9d148096772f9a825a10d12b39c91c345ec4e0e7a1246da6a5b3d7812876629f67d82232d985279b6786a49f440cf9f248d68ed7a3aa450cdaaf5081fe1c85ff6b34182727cad524d0b308ab42b3c82947ca5cb7dd5102c3f3e7d3d564978107acd69464efa2eec06432f1d1696acc018ebe3a998bfcc4c309a3b60519fe021477ab832d1a1ebf60f7115cefc0d5186031d8af3cf842679a6ecda8513ba796940d02e0aff7f0cb467394077b27afbe5cce62f89ee00d17d830707a73b5994f886e8201e6c4833475202825257834cddce7eb8a039bfcb5e7f4de675bafbbc8fe706ad96e799ba926169ab954ee56ffcf0cae727395eb8fa503d3494e06528ac4455bba0677103f9ad9b276f0c5e673060b5b2f57181daafe70363425d05198b27dacc94c05482bb36389a3d655f09fa898838f28a75b21d181175207fce18ccd230ded73c4c22eeb53873530a1bb9b823f52842b176defc63f947e8a9b1509a1bf97f7b43be59b3794de54df328cb8e18ddabab0dac7ae4e356624a5a76462854f852dca533f05c75ee6f1db67278e5fad81d3cf440e09d44e3008a2b1bb8eb17735487a283a092a7f1cd49b2759fd9301fbc22b14e1b5cbec39d42f7c979837ad92d4929ab30ba00972080a971220b43c29b451925939fcb0f800398f09b0685367a26eb35d16f430fe6ff56c1c08a1341ba8bd2a262fb538b2c0f835ca56573b4749a1bfe9c27cfb03e81845ad53b0cdd6e0b03b194496d56d85fd38b235733452646816bd85dd6f0348313712f02e63aa26b551a9156d4699d5f504acdea864159d92fbebcb5f4d394d6510ff7736fe3a0ff8ce839297abf773ae2e97ba5c309a1c590d19ae226eb04840c794a2f526c902e0fb384e68d2b58d3f9807b1ae707d642e8610e44ad5fecdc0c23fc67656032bdf4322e2c7fa60c68b37c741cabfdd1c615fa32da665169b89e6dd1fde7eba3cc1a43ec0dd9b1409aa372607ade22d10622b805290022e1ae103b5620888963058cf5f468506ae082daa5fa2619a5f88e2d463a4a0dd8f72c6bca8418a8e25b294e3177d379ee7bce327fc611bd92223db96a0d16926812f167593eb76ecff9e147cb4c72be9f62bc0d11aa5d6db5328a47debfc394424d68dfca9466807017586aed50d249245b82117204a9101599046aae04f61c41bec15fbb559f5b0531150069c6e0e9087624679164d752e991cc49c7ccf375747e9b5d125aa6092d263f59bb5a172397b6f2bc75c88b031401b584c9b3e9b9588380d8ad863963fe83369e81eac3c51cc8bdaf8bb549afbeb530ff6e30f43937f6f0f88b50484bba0aa45f76333ec9a67c5da54f4b5685ddf70b5587bbc060cfb6dffb8209280ff492bfdd0e4364c7cc17d35d5b0b30918f57ff3eb6063ec67c30b8415f2fc0a4e0a12b59db2e744623fd70133e2036520ad740c46317af99422eb751a345c0a15841c0bd81130b6e9e4f0502c51af180dd92f3def9e4efd809f37149b9dd965386e738187b26b507b4c75d8f0c89f6bbe6b63e597be1c6b545d9f699ac8239b9fa66f4316d23996a0f90bdf40acf282ebb50a5cd64a3fb09dcfe33d67ae1abd55ff0acd44061c9faf154c6dfb9a08a12525d60bd5e99d9729e29275af398a1c380e4b37153cb035260a1588fd287183dd99e5dd694b62ce3b73d6cb5145c9c38af4a2062015df40d41c931d18984b5e179d5e05b0ab7b792c8ccc56fcf8975d47fdb016865ddadeb73f0a78368525c3b5436dca73e34a16a7cfb08f7e3f9a58682204e2fe12d609edf654790a6d0508d52c8261708a6b20981fbad5688352e1fb941ced7b7752ab989abb8cac3c01ff13d4d85ff08d69c2ab7a265fffe4f68a28584b52c121aba4e438dc9182e957b22b2a01b0d4a515cd7b18524e4d362a19041c080a3f724a89ed099c7fcb4233b1252419eb543f905578caa7ba7109f72fc79fc97746e6b131ffae2fb7edec4e6f2f032a9f13f0ff03ce0fa4c554628e44d324dee0b8133f115ed67b53c91bd9441ac089681d2f82bbd933e1ebf79b7db3467554f501997f55545fad759b6a2e8675b826add5a7f3ebe08c582a5a6c179ea63fc0f1c4e04239e1c9a63a1a8eb8e2d174508e1a646dee15e88bd6c0dd47f8505118ee609d1622453d71ad28a355e90ea0cf77af5522e9d2270ebd2a57b2a9b5ee5129dfb0ed3d35568cb4016ec04a72749e2180cbf8088691c507409521f4b807fb5f668dd05baba3d7d0d55382b6a06529baad0217a20842eb0d3a21b9dd5d553163be4897b537fe1eb5fcc06652152bb868c5882ea69679585126b84cb80a5083a67485e9cd00fef54a1243d37889cd170a2c98d0153134d0ea1ca28991236273d98138e342b11630f5d3e69ab9d273a46477033b56e43fc12d0df810a6aa4388d9ec5180c2efecccc6a7f30baecc879abe77a6aa11662a3601b8be050ebed0c51cb997abeff28ed71b79f326f12d30b3af9e3c567fb20e670c57070da6e23871e6dd433e421f7e48f7011721fa499e2b26746afcd86c2b96955d04cfb7ef1e5c7a808ef7e4441d5cfdea9b8fe4f4d1057cced7bd7677ce7afe55484f596bfb769b1b1b1e8954f4485984aa8f216d4a32180e09edd9b5747c6ee6a0a2b3645488d0628bae1e85992b8b212aeb10ebf57a816881abba12326e20c73442c60f4ad11a87a30ad877ab6c9d49398b33b3f1a1f701f9a072ab80a8e644ac8093db60955c14c8588bb7c9f5531069f45852b80e488ba26865d8b9e81ff273eabbe96550ee19307e029e9916e1eae18e83efdc372ec02e1b068aef2d2db958703b34574f315671fa6fa131cf398e0d86658f63fe473e90264d015bc39c02930020188c4b43f38d50b3153520adc9c3ccc3748e70d85f6266f498737f64c5f260aa4fc96bdb2698a3963806987e7ad9f85e5531aa6784b33bbb9f5690d1229d2b8bfcd2cb6fc05f7038685e7cbfb2f65a425864c5e4c9b185ff2953e121581bfc75337b29018ffcf674f2b70cdac56b6dc59a997987dc97bb5cba804dcabceb50c9f39e56bfece38b96bc93ad1f7cfbb821bbf5d94c107039e3af266745c6378b527d40248391c9d057c9357b9550f5e27ead3329f752256d8eb66c64b5f55b2932ffdb3916fe64976e0680560f9979e8d9ba1cffe5018fd9e1eac0e92973ae2c0f9e65792ebdaf22eb60b6db01902f750d3f3e6db9f2a5b75ec7a7a6c6f19a39f72c66c6f8a7aace25a95b987ff32af68a7b9109fc61b4149c493e22df1b9a23f70bbd4327033eb71d4335cda23daca9ba53249021728a99b0a24e14846d27a52dff5a22c4995d407a15d4c197fc48f1b30e66688c33a2d503893388ccf9f4dee3eaf2f876833adc6517b671065cbdfffe34ae6e6d415796e0141b771128937f9747e57270d8f5f96d334bc0770223e8b4f01723f7b736323a19b958821055c0e45262df0c4e16fcda1205b239a593c31ae30f90b4bb89194241d670b1113b33fd256f9e80f87d47cb1e33613a9a4306894c1da69ccc967a2f31d24322228a9fce73e72610665e4601f743e8cb4f81ef9f12206354d165e072fbd0cefcccb3d02d865568e31c6db298379b83fb714712fb55944faf718356d03f2d07efe18b3cbf67567be0457c8c087898b6f7c48fa0bf4605517833cd33382720daa74ab94b6c916166f5c099f16595d8337fead929439df2eb9ff8ee420f7e8168746cd61f8ab912eaf7ca9f93af1f0db255c790812dd1515cb82c6abd90d9aaca145452279eb32b9697e85a431defcacd75905362b465839f31d01302b346087265a7822105457ac37cd13c6157885a8d06f372642ab9cf3574b8c452b6ffb1d791bfd8c300cbd4182803dcc621790c053b60e7ff39fc4cdeca3bc9fbc0204ac6eb66eb4076bdf52f3998b2d3ee20f198523853cf0c3d11677538003ab1cea678f611c4059b4110b7220a7c12ce416c3b847d3c21a934069beedb0cff584b6c8637b0bbf365e79c578ffc8bfb23b5d279046693d1bd5023c03d561b7ac47e240c42181088463080eefe60ceba0f43fe7a25d95ef98908941a26b71c9ca47c8ba735edc2b81766e083c8cc1a6f3755b325d8cd4b0e887103a45e39f8036ee5029d360a2e8769153a58012f367b3389834009d0d85e19c05604efc3ea927a7e0959055230266de66580f3e4036561993174ab666e476192280667b61b073ef5a4d548ea66ece1f45d7efc9c447e8a664ce7ae8ca4c0c14ba14385d5ff47e8b7535be8086cd20e79650bf1e05d89081f58df3dd9174ce2fb60210a88958318fdd155e458f00c98864b0b4d1b50a6cba8ac50d93e8fc286a5ff34d148c3517adc551a1a54d1c0178f1e1ce569886410e2795b5cf2d918b40779271d899132e8a82ec741fbc4c1a3b60cbe790d7a139681f7b61305f02b52115fa6686e519a5b0f9d09670df21ebdbd30f2beda06e97974fd6375727ef70b2f69823cfd3064d8fb032368007d5994174fb1aa78e1b2ecdf5a5811ade6c8002ad28e2ef66f1be49fcbbc2b4e8e7a3cf64341a36dc6a99e0337f64260a371b1fa4f461931aba48825f5ef6a4369e45b5d058874ebb56710a948b3abcc30b304657d335c19bc8b013dbef494b13e50bdef147cdaf086c66f5f194ef98663e1071a9f2105f3d33a3fa9b5bd172e212edfcd68c27b7f6a49bf79b3ee5d63bfa7a686964d29da62d94a2c072cbe5b9b9d14f3d795f47f013f191d0cf6f64710ce6f4f76f564362c4105247b250d14175e36c0103d702d827902591dda583c5a09bd47b1e82f4767b037a81e4b6dac215f8752143369c22e827a13bc3506f04d5e329a4c4c029227bb0c969bee0d9d4bb27893ff4c276e37209f3005bffcfdfd0117b341149bb3fd852293ae9c029fc2f34ba8b23f65a4053f721da178c9fa4d9301db33c820b1581c9f21427218898c288775f56a9ae30921c62d06852afe14192dcb4d16725ac2f5c93f05277b9dd11f024b1bfc4f9b3f7b72b49981a679173020de8fc462e2c0a1ddcfbcaaf8337ba94238990beed9bc3af1fd2cfbe85e39da20f51f2f93aaf9b1061315781c2792c06abbcc1824c7384fe9dc114a2a7fa27d602bd9330642536cf6abed90eab8097022cfcf777009f759894ae30de848c883dd0c767330a51933423437d4d0d9bad333a11119470dc2b5f75f4092847182387bf677365091d51781c1686887bc5f10a56ebe31b0e8f6710a7304428b7b4b24bc1d74289a12e46524be62b455d021478f41608974dd3ffa98dc70a78afaf766902df03b8672a9a744b030cc5baf48dc3ee8f13c11ddba49142876327f0d1a73cd612b84c9a920a6563b6880e2718f63776afba20e7ec00ef66ed0673025ad705dc8a447ff3bd4314024541e04bc732eca488790124131ccd941550259aca34b86d203027b91d66464c3a11d0bb6fead76c23c17a779680370b96898d830f7ae3316408e969821b6c834c08ef6583f7748bd01a570903d6357bbd46019b02c2c2dad5f84a2005020e0eca237bd5308bad6c5663b35a18cfe173edf1e6e6cd0d2c342be68c7b8f238e0eede3ac21df514681fa98c558b4ddd7d5c7346832d9a18bc2854d9546fc675f2cf08fa3989805353f781748155af3e9c03d4731207294d92507fe6ad10428381293a7ae29767272a24e8f091ad66d21b7a24f3332ad418a43ccf567b8012f5179307fe2fc529072f407eb565f216e535adb18d44b1edf09907aa11463069617639ce300e90be9985c5c529c4b10c56b788a78f416b08028f8464b08c6deb79495a7c2ebf598a9785be9f0e0635eced2cdc5b5f00a67060124393c530bb3c9b6160c395c6751d089f50f2b104db6f366f05f7754fe5c18cc62614dc17fb7edb63c272abbc0f27ea022f1bfc0a156273af92a5be388bfc1b0ed93191b4980aaa4f103837c5723ef42d15d7a64de71621dc0b2880455a22bf2c7c2d4472f6ab200295e64ae15879bcbdb0375f10221c428e1b328dfedb224c7ee6c6ad02865615b8d36ae949064c730dbc82303f3610419c1c4f7e9e6c6bd8a1ce5b384a39e594b4d79e3f31dbb0c20c513a9a3458d0f99aa76456e93da3d00a47783188f8a744da41362dce573783a7a58010baa92594a32779db3ed1d5a3e83b8ef50461d8a3c425ee6d55e32789d0e52ad7f5c2225307d7772ca9067667ef13f0b74d3d62e26404c71dcd37b748a97c4a341b9c3c7ab751536dab0cfaf99f2dbb2ecebce4235e3504f525d075e1ad253e789a502781db6301c200bdb0db819193bbe4e43652abbaa31df29b622c87a4091761a6b00bee7308895bd8788953e38f02f3703db93259ae179b348f32dfd426a1a4274de955c23c451aa8bfad4ddef21e37a028b2dfbe4d562f14ee05b3dc70d2b1f15bab5cbd97bfeee7c3380140e806011bd74c53ab3791eea4488ec382dbaf35da744d70c1ee8d1938d0b38561e258c19b11ad2932de8fd36631a6a8ac1553bc9461eaa914fe5b0d9b2521423d9c41a15004f59148ca90dbb9e31ed3a7463d0b2f5c44b07ab3abbe8f53e8ed028b521703c4f42654b7b9d09b867ddfef374574ffbf9b68a61e189417b0722e937d609a17eb0d59e0c1267124cc86e622d1aeb8a6c1476adc3d5cc060083513c73c042df5ed72de8122cd045733015b7a5afa5538f3f9f149b059cca1f31dbd6bf34c91584521fb47f03d8ee4569989b9046917445d4435b638c1d9a34353cdbff7ec032b983d27cf2a67faeae531ad696a3b81d9b3aa1dc7da339c3e3646e6b257e0596c51c38d7ef40f12f5c7f8df09455df0f697ae56079575e332dbf71a63156a65460aa7ed156e8a13a45c381063b4daa50f699dcf768362534926bf1bb28b7d2714eacc1078946a3a072b41a5464089f9427f251a09448ad4612e36a4e60ca9186330ee5e96abc5f3b5a8418458e74a92e5b466008d37270749661103a4c479071d136f152c78262d5d1857501586c9f662e6d94e889723361cb399d8090871204279487706c813d9dfd1c1321bcc7e250e08006e11dcd9390e67490e1f5bc38031b49bc81a7ebcb0f202912b390666c526e27bed9bee87c62ffe995127587738630187dd39a272f744947e8ebecb2956033d3eca86d02599db87c97ceee04aba3851c6f55dd972e138fcf24e4683b707845786898998f5897c25762f639762ebad138037c4c8dd339ab93d998770ff89e4019795871792178c14e62a55350edee6ac45b89919ee34125eb57c0c350a05b85b00ec651c260e836ef7e9f3a00ba5794ceffc01eb00442956f0811679433cf5e937a6b87668155c5de388182ced0578ec22b1f4d0c57e32c82f898ac9451e5d52bd69271685f6574ebcae20dd0043f895f5a43e3a77a81ed0387430670f368dfd57ba4c38896498e8da20413cae9b50aabfc3a2d0f8a2892b9a752c200249ec6cad44d6226dc21e955a16824b928a7440a682fb7003bb4c28cb0baf3bc6df2df392a9e331f18086d7c87c96bde962a0d668ea1e24259e5d2815708149872f8b901442a06de0613860942a5af508a78877fd0174bb3e0e0603dfeb9bac382970f0ff33dd40265559cd141a70bc1fa382279ec7a16fe1ea56f2e32f0b8266247c4464566e015f41a523fa732341b0f6071425053894aeb136fbd5df217b00b69f4c785c15083733b86e88820dddee5efde37c44f44db39fa0788766d34e5c272c08dc918fad14f6394601e57d30171ceaccdd724781caf6250a94788c5d6d432ae3a01dfa5a67b2b7bc8437fcabc4c83cc496cf23bfddb109356e780fb73719bb27c1c5c3b4b8f10a27890f8c573dd1d764c47454296527a905c1e3856105aed509d54350cdcd71927118ae4687c11de3b2fde872ed950f5db815878713b1f4a0db674f50bfabb9a1325dba7f45e2a9a62c8b2e546d14f29d2cb1ddbfb8a364a143ebdc83509f07e7fc6c46c750b481c8ba21c5ea0310f12cb745532c52c1ccb733f0d4b0ff58c3014a476fc21b10b1fea15501a45611ccd5b05d308b37ef56ad07ab16305ae328d8df11ff8d184f5b4b310e9916716f32cac001e9f4d5413801c286f048b6528acb06e5de9fb8ab2e0d04779c5e9afd1ece08e095bb83ddf185423f575358d2460cc106ad4fb4e9bc47ddd97a9ec912ce02d4e1840d0d2a7b9f4ff3932001aaf09fc6de749fffa5779155bc60677a8d27a4ee2cf826141db2b358a631cff50e4bd84adc57ec57bcc5c027c0277e5e790faabfa5c38f18bc061ad17018a647884b61274c6c3bd7a0ef710f20fa25eadfc667070945880666197c7a948da12806ad8eea530c78807c11985c59b6b40a27b347d95c5569dfe7eee1e0f6399bef954f8b19cd8b5222df9805f828abdfb58e14bbfbae754affafbfaa19347635c9b1090f8e1dfbd3b05e43c5ef7f8de1a0f090a6e4a4ad864dab445cb7fdffd60366b8e6020ec654018459315e598d9b44e88af40e0977721ded26e6362ae875e77a97679973396544823db685766189c9f4052b98811bb55c2b17f8aa9b689b83449f8852a312bef57ba2783ec913f07529d590467b8e2450087c3c04730d2a1716258823ddcd024f01e0fcd2823178029184f91403b4ce4fb1d95b4245559c19cd4260c823c02e2cac6ec880a29c126ba5d07912e70b2d5686b636edc77b033d3e1dbb0d18b6b39cf8ef840d45fe02d6ba07fe8e86b54dedf9be37ecdb90a284b2883b5c35a23f5fc148043065dcbf09f8717b1c2317e6f0b5b2453113e52adfbb922bc02442578c53e8af24355b58dd7950a2f90cbd576e05090d5e4d3186f613d7a9dd03c83534852cae045dcbea5dc8cfe202c06f06f895fba51dfc3498172d0534d058526c64b92d66de87a5238e686359863ad56e6125dacbded0455338c4fb0c52921036a45342fda74d325fe2c0f182323e2f52e979004ae52a6a16595c2712f1ee9021649929acda206de4b25247f5ee95f6434a37074a4cb9ee2f9b7322c05a9445503ffe6f4fffa67e39dc9ff5473e97daf9af331b7b3fdb3aba686fe830679d547c10d178da1931520f34acb1b8ba6c2385a92966c7b389897a774e430e06935b52790500cb426d82bba29c69ac759638d6b104959507046d26d1d0f984a83f752e9f623808d8010088f5c1bf46ce78178c921d29c3e3c573f4690ccd814ba4b49c16a57d0418e8767524ce298a09457cf339915d10903871b080ad4e965330d6383b19b2ffb0e892d553fd99d7a5f87913b3b49641323ca89a8a30a2e80ea75261ad86af7b938de44e91f3e2783b6d2c3ae46f57797825b8be1c7fc36fc61585200adcc937900862ed0b9335faecc1f89258c02d6ea0e0c0aac7216a066e19de199320b8e2cc522a00e0f2b956740353fb391d5c64b8514d1c76caa32a14c0ddf1d9bf263991b0534023f0740eb71ee123a36ff3fe2f93000f225217dd0763d715a86bd3cfc17fc87c83f441b7e112da9d5f1a53f541a3a3d6033c101fb709901625be708b2cfd2e3a68cce9522adac7fa22f927cc856e3097791ce84642b2a6b916291af4664839336c41337e5e67196fed8ce09ea8e4bb8a566ae3247521119886bf02de0295d937802c79675c3120c7cbe2f426ede71645a75471c4772e71e591c5965e4296062fabb18a607a4af4df2a577e0d9972e7e20c2456af18319a31be937b8ed6fe85aa0ef2fea8b6fe83a5f416c4ea56c0776120f3547c3ae923599605d439e83ddedcbca63712e871c87633897bc55fd42ad189177f2d2ea6c4ef10a52e5e5755b3009c0f7059482a0a926c76ee33e79436d93b4cecab9960c77fe8f395373ab45b69854afcd6b68a6a64d17f485e6da23fe99511ebcc0903f4f7d4e9f079cff3bf253a40dc0a89bdd6d13983203584f60370e09edb32aa353b4e396bec5a042fea3529048302c67742e1a398a097e5f68dd620cccc3db9d8c9a42e1dbff6f37a2e9834901b52e4ef8efd4737104d1417af0e640f0a295aa08026a872f33ab77cf0888df48f7fc905ebb301d626a31477ec38c98e655b5fb405d3fc387b20c4ada91868761af8e48213aec4ff83ec989b020f12d56bbbc5202f3a73f6b8d99485bf31e8c781da198caf6761b87f5b27ddedebd9af1a38f230be83170cb149cced79da73f043309fb5dd790f1a25bfc4ac8dd38c0f02dafbcd2a11362a162861d1d4bc0f2171c62e48af7365d840cfcef7b8e1610717fd2ed599db31b3838055b169adf668c1ed3056c5e55e16048cbf9ded4f7b84831b477140345e0715cb02ed9b521b5e4f13e702118f0914a50069dc8c7813f22366df9cc23c28c6ccfb70b166a46d11209f0752c949596e37944363bfaabcc27bf243c09571d3259839471823057aa87c214a05490c9678543ccab3eeda87c7f9c5d486e4340af90d1c38e5972c46aa542dac831b795d47047eccbae44902a23cf686c828ca72b08e2186ec28af41f97da6c0a756c5a5de2991805d557803d00d5aa98a32de1451abad76aac1bd295e6c669f90616967cbe193460df12248434cafc3f67b4d5821b1f2ed444d7d8b666e7dd98c8b9b16a411c31fc4fd2008b815a3168d2a1d1aae4a20bc09dd459222813864e9aee93063e17651551136cf2a49d7b922df88ba72c297f69125e4d68b25a87bff6580515b127db3fd303ff63b9e9488b6776c1967a0182099bfefc30e6e1a9bd1e7620f67c4bf4c914992ccc352d29fc8ad356e33681252a51253ba555fa79c379f82a4a279f915b9541a39ce26323064bb55ca755ea783de8488f3f0125d489e3176174d41ba7687c2cee5ee37733faa7b31186ed0f017d0cf030360184c6f0f22bc30e5f988533e76f2567b76f2210749aa7380c93ca7a705cf0d663e6c22c7f8505612062d271b6cf11a57cab03f0d0617f688be057b1e0175ac7bb31816b4201ed12e8a41508df193561addaac8e321b1382725a3b81bb5cef7edcec423dde2f4fa49df9de6bd3a20c05c698fccb5d593ef959e87d12dea81b6d35ddc6f50b5c66a1edab0ca024255b79264ec6e6be774fc2c3d998d4b2b6d7f4abeeac4896cde5c1eb4c6b78dc13f304307ed90cd17ba676d4f07870221dc723d1aeb3b64944153fea78364283fa01b144221980558f5ac93f81b855a3ae8736de0891a1faffcc141a4935b51cafba8af062155ccb275b22136e0224f4d196e59ec661e6a908aa14b393c06f5edf3a058614ccc148a903e27b636e6b9cd7598df62d478b06abc0c57feb17b88fb7bb257a5580c8e00296eb27c110954240dae9a961cfe2d5591b25e81e1b059330e21183e04d195a529a8dd95d73555dac82275da3f6546e116ffdf4d49f946f46dd225d5a84bc70435697416248afde844617c00c926a10aa08f72e43e2021a9e779b946a910db23e0912f35d61e3b6a5e3e996331da20763fd23ea4e1cfd3b0c975061e0af8f69dc4e58c022e4e23cd400b840feed6110b1ffdb46d2a36a6057ee1a6f1b32bb0d659307a6cbb9fddb27c105f6619d40fbbf788af08bcd16d37671e5787c1f5b33fdf0582f382066ee02bc6e4114d4bc35fd102543e03987773591ea0a36904b213786a12210381b543fa633473fbea445174dc75b88736dd823e371e70d20682907e7d493fc12c80468c63f3dd78faeaa6d0536770cb8dfd0bd392b80e77a9110604c6ed9d364786d730fe6b1c9eeac681f83c0663009e7360e57fa33231fd800723ebc46e1658c8d1c5a4bdb56b536fac702e00dd096773e8305683e0e2b1507cf40d183c6f4bec4afeb6e4857583030c3bd39db068d2d00f7649fc332e22428ba9e5e3af48b794b0d6b53ad824c4a6f511549c683b9062de18eb4998058d8732bc48bf6fd0ffb902daa290c190f89117f27f22f8bac3342fa6b5ae8b0f842c2fb69b8982466d570891e98fa3b297fbfbb168a8f24889b7f7a2f97bb4fe8046afa783b830a4bc9a783b6c9fb93c3bf09591cff5c8c0788d79f50a51f398007f5de9a5ad4e38ae06ee4bcf95e8c138e824d74b4949a05a3180738dd034f4245656828a2d5b17757ae1ed47439eacecb877f7275effe84b47a3eb393b934629e787d3dd03e86aceebf63055a69d58a0823bb2a9f061a127eb467169ea2353764f2026125cdcfafcdd35f47231bb4f434dc3dc9ed47867a5566342dc145c5d79064924c77ead3391336d373c673019c6fdc87dad185cb5b584c0163136e57e6060f9687a13f1e346102e4a2ca8db1c2e61c43db8f57a126f4366ba7e35037d3da17f19d21461b86dc46531c6086db798d86521b88346776408a2e63ed9e0d5ce89dbd050d5423677e3e025a2d39f441d305bcf4898ff56928dc625a1aeb7e1ee156f1d437859f9b78d59672718848343416e9f5c978a79b5a539bc9d73764eec96b7660989ecf8c7f07678d8bdee1031f4fb7a90174f8311a3e92d56ffb738d8f0ed5ba95e5110c114f1bb4c7e0e20fb9f2cbe0e52e4ccbaf864f9d818aa94f146ec018661f93ed1b0fd297abcc8990abc360eea2550d86e4642c972931f1c0a0b71698369c32f74a0803d409a9ed5c2fa262ab52a10854f26865391963a4ac4364177fca6bedbf0897f64b0406705114131a0c3ded606c829ec6b43b94b7a25e027150ea70ef10259a3377a4747e5942688550550cf202a83a3511e54cd8ab4c5061a623db5a229a26b1a2fc1cec2ce8e5be1a163df44afd78ddd672f185902fd4f2a145f93765df1d087ebf86129aed838219ca9d46dc5618bc0f829e40af67526f4be86278be9ca419fdf1de283de1eb141dade7f5c21bf8d1d830014bb5896dcf2833dcb258ef3768ac063329d860176865a28425c0aa2b8a8edc8bf0ce67a0ad80798747fd5f7c3607f767d14bfcebcbd50284fd5ed91e095cf5c67cdc96c3c8ba7fba875c1cc886769f7f71cdf6d7fd621f4c3c39b27d1133b9267a309f76b9fb89a160ba2ab0f1cd9831cacb16952b19501fe80351ded33b147693a26d5c6e27d3f25e651deae52120fec5dfe4841e6870853b8ae3496c8e41eb5f85a3fd2bc275ea6a8894fc14dd48e94f7cfc033f9ca4298ed37546ea0233a704e4402c739bbaa120a8b23cc30b6c00e50fa81e96f624ec6f19f5c76ffe530dec4c675ad346b69c10f907cc8f7db9055df87f6ff7c0868f8b61fa2d9709195fae77b109ced389054ce4dbe85aeebc4f6761a9d8a0a517cebd31bdeb1bdeb6a8bac761f99935ca3b425969750d45508a9ed1102778f151305575fe6499f9216102b41ff295d48febbb4b9304045685cc1bc0b97b895fd7b0461e0d839ff895c0865534e8eeecc178529d9dae3cb2ef087b8d4ae4e5ddfc03df0c428a5c9289448e416f2b5327711f39fd5b1b0551f9374f0b5cdf87fd639cf5c520397bede94fe8e30dba6b9f517e28850fdadad9c52794a60e9800ba265ea728a9c8f1b1ced6f3f25d162c896edd79ebd5f692e551dfaafb8c6f4124d9083791c5baa20b436489dc16000b9fd4b861f53ce4c923f9308dc672f0da6ed0ff419456800c290febd3cc1e2c7c529b9b7134372161bf859514bcc8afe28688a44c359076c1352077fe8377bfb46027ea67059148f09cf2b0388d5393284954cc96bd2f32bbb9bf58d6d81c221d49e722dd7e50fcf1681edf3824ab2ce41e8319a1f589fabe0a71bec4659a5257b2c2dd646af63fc55d3439847eeecc219ae0fb5313b433c7d30d4ea1fd99636cea1d1c23b0ee9651e1e988c4837655aaa6e37064bd229f36d2e2507c247b070acb51a2b6f5fd9586f7f3e103ac0247b9a77798b8bcebf9534a9869bcb3211a51c55440cc4e28538ad1835be73a18d0af898f567a049308f00ef103db4752d7bb8800fc491d6b1655e555151dfdc188dd4c3a344e8588eeaf2983a8a088811a1943a8e1db11d80bb634c4abba6523c7df35c75f83afe01cf8f928f544b4958329b092415b0b1e3b7fad137163cf0a48caf32e82a0862bd0167b2f323da671464d61ebd6f6d0ca639819c46d107331317f1ff0cebbc3e67f34f2927ffd8598fe297ab168011f367d62187e6fca4ada2758a6a7876f66bc4be81bcd8f11e92898c21fea1c7275ece679c1b72b2c8440d9556f79da2756db5f9378f77839dd1119539cf35c8950f3ceec7d6ee043013a82bb1ca91c7a441ff6de1d7e0acbcdf11375bb5ff64c096893337b5e59fb5995595f794e51b7007d1066ecb613de8c7d9244c644c7d48f9e221516f9f22f1e70b4b8656021d9ccf587a89ce83a8f2f973bc46260d10f793546b9439915dd70b854ca2116d8e618fba44c7e34776ab8cdb7e030b1dcefe30325cf2da7f4314b44877f19d902c8e6cadb70ee67e6c349f8d343468c4ab9968a96eee4eef352a4891ff27765efee215d49c5d29e48a0cb237e694b2d1f54f3ad5bfd973e2b0fb3e1f54de67e50348cfa278cfa0fb54fc82190af9d101ae226bd3abb3eaf4475e648c9ffcc612568c3722fb3fb85f0665f822b78ca1baf693cdfe4245ceaa56405785c0f8599233069a1acbf26c2b64c8c285a40de88b151117c05876112b1725335daf06b50b17d1bd312c46fb7c59c5d640760b2d1fa63d66084d42d280c568fb90e42bbd1c74239b9c82f8ee64dd1e00e01592beb63e948f91a10c02e6d20e71caaac91810233e2bdee611781475e70c57669d2763a7f56083f657e4ece0070e2110efbffdf8393d0ae03dc0137d6abe9641f6bfcfe9faaa7e364253fc545646c560a263e172b12a19b709a57e9c01edc09d1a62647bd8cec221a5ddefaa4782cb4a3f9a8940f3ee3e64e6d9c4786634d38af2b5e55d52001a9ee7d4ed63af7afcf6a9ca84fec5dc321e015e1ad62723c5c5fb9f55d4d039f46c36f1d0d37725be147f74b172c3b516999300b0d739c741463f4ede15a5864cf9dadde0cf5f1668fd5e415daf0ad32f4f1513286f1ebda8c461b0cffb1d55ec6c7dc772ccbb2f9e86a1e14bcfd16cbfdc5df2a58f17b33971a19dc1bcc8a3f921953c30a6e651ddcd02e997ad664f264c2a7b37f6d1a1b9a0b9cdc6c7bf07d0416f27a10f9ebc6499710181ff7df72229097155f7378a9ebe76b23b8dfea917f00702b14b2c02f491f6ae5660a4bf46b15051904675cf4bd6b156a40320d9ad3b07c82ab2269c510bb8542a9ce4e3ad2a973f02822fa081699e967b68cab88ca2c8f077e8d5f0efa29ab2184cc921a6113441808dfab4b1725b1f6956c80504dd9a291f945565f3c1393f518f2c260c57fc7eb2c87c6b63d126a60a177c5830a22d3911c18b955f253ac34e8b2ba4e995fd54a0209c261ee48b6f899d17c97fd0535c7abbb596ebccb99e5193690d09cd7e642264fc34190bf529201a12dd2e196dbacb1cbc1fc9e66bd56de55d905bae69a10fa46b075372508d9aa3d808f94497b8c2c94d40e04267a1444e8bd25cbadf502ed21186e676791c3cdc4c4599901851932820b4ec4af101ab51d0da12bfc3e7ab9dbc1ccae679447bc173fac657a78a5a397a2586af34ccb8fc116b744f964cf4530c1f02577d54a5dd9a71a8024cd058c256dff15589cec79e461cba30bd11a4d90ce1c11c5024918d01466d95c378ed0a2d2d16150fd0a8113d49d0776e3b1661cf19b51aa1539bf5e1b0dc943a75638b0a4f06840acb979b5704f4dce69ed59fe06d30d5f8f008901749b3752d4772959f0c4d068ae86ac71f1dc8bd800e500f499a353d57e190df10e091ecf8e45c2546def61284ffc2c8c58c329df43c0f31ea9cab50eb39168edba447289887ca7f8cc47e4a9a85281f2db877c0c7be1127728c366115ccdc5ca61ee69b355944f2714730c3c6bf40a8ad9de6fae5a2bb11a17092d16e9fbc6fb81ba7c6afd8a046aa3e8e0be58897e1b2abccc244d684255b1b5e4e48a745a38bc2937f4133f51cfbe0becd5cf30f4de8617393ab8c36f65900957f30f198396110332a56f9ad8f1ef55fd8c4fa4f69b0a21ffa39dd1e96d9acccaa6bc7147ba8d03ea029316df066d1d794e8b7c33a2e9d733d18b31506bab2cb4c66c7a43fd679305eb100ebae81e8072ef639103b5c6fd287c3c2894d406d0f1fb3351380d5f486ef64e634b7bc45704183e136e2788834eb26560cbd5c63f2d80475410e2662700f2c222ebb87bb6e2fff4923d6982461c57020fbfa365170566d8e6d396eb64eb04ba6cfeae124216811d55f108271ac4a559735b64f4ff30e78b5144798111104b7f1283950d51e4d85852f378632059ba7f5774d4fa9405917bd55ab5a48474dd8bbbc7999f53671b7292547a530694520c40dc4350fe3a40a3034c96e39b5934cd8b780ac836e6dc4160b4f38637c120a3c1275b143ded1859ac5e663256ed102f06c683c2511f5101b95a695a9ebba9ec59e3d8f215171fc0cebeceecac41953c7fbd4e25792a6b0781f80f990846019a74a130d3ec0b9a4790b74a8250295841ec45ec9beb8aa9a7b81fc6104bd2a5fd9cb63f42afd600851e85e08b48d1d1bf9d4aec9084ce371210592245645214d39bb4f9451620494db2ef0230935cc530c0ab06244cda46da1e4df30f4c155b306aa06ace5785d5f4d81169423b348788cf4bec5778cd669cc2f399e1877c93886df34716a8145621c883ab8b751b5d4916f1658e7b39cac128e148476f4af78497dd57be76ecf65e0015463e1e73c47c0045373225248fa571afa8cfb12c3819602f8aa5d63cb5e7ff8641419d1ff60f84de1b1a64cd87ef39863e8de5718a0a80281f227dd28cb1842841c165f1dd7ef25dfac307dfa178ae04c1f369c9354a652efee3d5c112f4e1a20b1c302f88a5bc75ea0a9052c3e29e041ed16d7f9801b22f85ce81ccb235e62bbcf55757ec9a9d32d62a7a39beff38fce1a247814146d8b77e0ac29195d84d14b33b3252e2b5dd514b9f0a096db12b4b16ab4011d68b41b2daeff6cd8fc56d38d858d38aba0f2fbb1b2eb0ea3a8854cd498a8c46b1a35e516dbb01b99443ab2e5d79839491e2c961228f701ebd5d7fb9e3ac8df52163a74f63586b06c3cba7ae58395f37e4a091543e7b3b1f42eee9fe21ca599fdc1c57c3a41c99554b7a52f74fdf2081d409aa368b5838a2bc24ce884af447abfc02665e2c48f28f60e2ce41e2098b341dfb78763012fcf0bbd6671d83a8d8577b48917d0b5dc98d5d09a22358a103ad0cd671f2e897e007abd98ea69dc9ba24b059ee23ad67f07d7abeab3ee2a5471dd486d60fd2110db8a46b49ca0662e70a054fde64749cf87cdca56b105395bdb2849662e801304b912e9c2a1172f4b614c20189616c59111e32cd377609f343f50b363959967ea89e28cf67c84fa73cccb817a0b4908ee02e516003b98c83f88e22e973fc95820d9ec8c5628ae7bb8ae3deb795f1f9075347c9f22394d104c6e2c7e9341bf7d0e977d3ca75c044817479c1c75e1f26a1f99e22e0225888af1e3ad7622b55a5180395d3b09da942e4df800907d72714a051d923400b6d7b449cf1e8361139e7484ce32e54e2258bc2715187157d4651cf4a63ff0fc2238d82ef3746dfc2b7d569c8a7de959b9e2762d5418de52b111746890800876a173ca2836af4bebe2dbd07a5ed888af485906d5f6a7490b3a7e5544efc90dcc20ca09433cee5f42f7742b2ec6eb4c6a572fc0eeddb7a669cbaaf2a7410758dcad6c65332cadc95d28a4325eb07b931f130533ba7033cbadb43f1e7d748f4afb7c8f1024daa39501cec519b1af712c3e20560757eaeec9f34956901a55679601a01d8aa25b1dbff1a2f335aa6e546432cb20af00c03bf0b72ca1045f24b88fa13c6ad18a38ef936d7e8df2cbf30c2a2adc26896be4a3548104b4685513a362c3e81b9824e076e80e047a1f5b80bbccd2f37a1462dbe9ea00612a30fd507029c35b1bc1205b1a22018e328219c0ca7577665dcc6ae80b92b45bcceef42aaf4c20b5e360c031c9c21f581d98cf768ae7252d35f8f4a5796982285e2876ef2e5a313eb5057934893529d4fee9a098852eddaa5b278a734163ad83d579eb579c9948884797f6417462df8511fa1ba74d1471ddbbcbab9dd0cdceaf488317036764543926084f5f5e9770e629fca70b1a899a52da8359abeaeeeb2d208f04b9c733934ebcc1138033eb685db8ff1d96ed06afb5291331544bbf760f92a7d913ae291311f361f53a819cea3ae2edec8f8323282cc271ff7c8a65fb88d9bec8e600436733d6667388866a6ec7717ec07501be69e576cc9df7f30b39f169d1167b03a139a80bc6c1ab480b31361b935b618ff0c7eee8856cf675c88b0ecfe6339e07b3b25f4284179933c67c6999a1a96400bb7f6c8c59a5b30e2e72eadccf6fc4217b7ae4535abfc35068d3222dca5f5e003f6d347801ae7e94eef307719994143b2925ab0e6e1c95311b31f3daccf483eb1628aae6844cb6177308b6a1abe3c547aeaf0ca5911e495cd82e0c7df79277040b2237e98e3e38b689722117a30f27c718b6a171a6a01d99a6fe436980c1aae104b0a6af4653340c7833a223054be833ac2e541fce5a390acb2b4eeab830bcddc57547b58bb227166a095f5001228c0768e6b53f343de6e4cb0f7966426d0fc7fe9be82ce3c4f96dfd2093ab68d8508fe22641a0bc001cc001b24dafc7ba30496742a2c137cc33499430628291fc4b539f58e4b3fd6a10538061198aca920aa1eaf9e2d2848c9da9282f05853e6b4251bd6db9e69260abeb892bc88db41c075458cc574084fafc381a2e258cc5141879c1e09af545f4c26e8de628d3951f2deeadb34c8eae42533275cbac76c31547da0972c98582e15a2dcc9b8ac95715b125e9adb761a798be5bd9e6970a1dcd0a4faab89bc48adf34c306e2be28b9b22ae6612bdeec52f1e9ba02a91d2ac3292397d818df08ebfb8d58c666fd3d37eaecad7ccaba8b84870c484a5b8de7a62028b76caaffe1dbd303c3b6b04d0479569565d1078e79f452f419b2f7cb359730b43fb8f1d928094196b79945d96b3d84768d874dc7db0025d5cac2ecd848ed36ea98be83b2425a52fbe64cb42daca694ce91c909640c2d4281a8217a4805a47ac0b9ad594079497661a584eba90fd2ca2082414c9708ac3a6c688b01d3e1f16953c5e720779634b00052c08f45d23a739912b154358ae15c4ed8ad950b543830eef422da7d134aee8e5d120ff04afbf29c1f4f2c2a1ed9ba9383e973936cb61dd8e3b18dd8c151967739043ba0f3b06409254d1bf0a90f732e0428802c40e93ad9a87e07ba0b9d0705d27742024d184d7bc3de74cab69c8fd831fb4c5134525e32bd7036d07403acc29a85f35767e6585808fc3b03ae6b85d00e3010c89b4207ffffffffffff0fab1841a3a91b791394524a321a97c52858a2efe6769249a6241341eecc08adad7f9346026710a20ed10d6869d151d34b3122af303aedd462b34ce7776130f8e4d15d69f9d5ff61609cad456bad2175de24fec2d17974361976e329f385c2a546d1f4d6d6928943472f9ecf99c3633595509d213a78b1c71cfb3689066d5ded42f17937b54a4b5d36d24562e7558f143a967c542edcf056264747e5a51045072ed0f77d2fe7ea3d4af516263db3cd32238476922d8c1e852cdd51e928d6ae053245eab55ba54a7c6e4565bdc075d0229b6f21377656faebbf8e59ec617a93ce6ab6d359599ce44de9cbcd2b1d45ac2316bc768e9767a65ad70f8b3b99f2fc79a59222ce1ce878c54146cf23b654ec6b76c5a3da2756e966967cad58c383d6319cea86e83491216d04d1a10a1dac5046c55f472553a995a12ccb8a1021409625c84a1b40e0002203206f045931e245569024e9419fe19e46fbb23042c72adaa442a652b65adb56216e048923a5053a98a04315eac9a4b764f6b47e93a42c42472a8cfae942591623434e14a10315492db62e93f24fa1d4ba4c3c29ed2e539ae2a85788cd1f648eafa65268a7e975cc5ac30a0f93222964ac1323737fceef083a46e19cfb98b89451cf951e3031006260d00122478a0c3971224792ac9c10418728d659264fcaf54c47f428cbb2868e502c3d5de924479c4a655249515151c111748042995feeef262d34f64f84c842c3083a3ec16c909bb66b4a46ea5196a58dac651122870e4fbc52867fd4a899ca64946581838e4e9c65566e69114244447a8810214ea4d730e282654122474a0aca1b4196850c3a387169873791bead62f44d34a75e87af10b2e4b99a48e679872ca1796384c4404726ce79b4defb50bebd2f4ca8a4ce27368f36ef4c5ec2b45a334c67c8798c96e0cbc64fcaf44187fc54424d4f8db9fc74a9112516e1c2f588d079cd9a8442e8e624fda4688c8622061d92386ae797c173f2332d83b22c2ec75a01838e481cb3caed13d912fb1b4898841cdf28f6f7326a8f38a97e5321f24dadce39c2e0191fa356ef4eba6f84f13676dc95a3293b464939599c8db8c0481acbb22c488ea4a80e46dc1a4abad0a2eab3948c0c592abd2c42900461b501c4880b80b491216c00016276e67036801c152041d0a06311674975ad42cab796af08b5d5f46b54425ea57a724447220ccf9f7d3e4735a26a94655916212b100207106303c86123c891d5c61e5945545256968e2ee840c47a55dd771269eea35941c72194a22683ba4c5b391f946511d2021d8638da86eaef4669ee1c448438915d4b6525082a004284c842034810349645c714741442a5a773b2b7fdacc746599647e82004ef652333abcf2dce44591621405680a8b40124c81973f0b204d101091d83388a7a5dea33c9dc394259966581438720b0172173bdaa0ddda9402c64c7c9d133b2aa3b28cb222408117400c290fe1ded6487ec6da12c4b1174fce17cdf2c777f347d372b485294a0c30f99f9c657b325aa1b4559165739b22c42548064991144471274f44139711eeaf4649b28757041071fccf5a7422b39da315419007923880e35e8d8839f753ff68b33cf4ed2839b5fe23eae884fe6c943ff4aa510d1d0c95b090fea509fd545bbde34c23ba442ae09d92e45477e3aec60c728f1f9df9a9336b58e3af42f4a79f699acf61e655952564e74e086192478030741d8d041074f93d4a23cf7df681dcab2a0a1630e4b659bc3bd6edae45972403547b573f1f03d651c2ed36154e698b46b14c1e1ba91194a55a45eed11a20233902c336a1084053ade808ecdb1e6366e96591615a0a1c30dd7471b29f54fd7b6b60d6d978ca9e64cf4a98c0d4bf9a073f7cb8a2cc5c8c91ab8d916ffc2479becd5708e615ffd5ba44e370d66774ca765fb99456858fba627f9cca5a36740ae8dfc50266e47f366b06cf5db5b067db39701e95a4773714f152a198c953f5ae87852bdf131d82a2e93072d5d3e6e31fc5b1a5add9c0cef86213b391f7d4cf5930886e3ece93fbd51b76ef80b86f8a8395ee8eb9c5e507d6cb614e5eaecd4054d4729f5780a0f912d17f4ced8b1d598defeac2da0a1b4fd3c8e87c95ab0be94f04f23bcefcdc22fd4bdee840caa552c986ccee4c43d3e2be915d6789d531957a7b556f8e42bfd3243dc87aa0adbca0deda29ae93145057537987a96cdec7b0aa7911d34cdedbd50a5e048a5f9c546f728cb28e8fe2e330bcd11a5935030c455ac0999ebf63fe1d4d37b725d654eb513d032eb2c536abbee6a021e62262f66d4f52a31c112e749a8a7a6f27809fde908e129a3ee9712fad23943535c89d126a1d73a8b8f1a29b57ca10e2438badfb4cc7acdb2e21174d73fcd26b5e3bbce089c79d0e8a9c657fb2d022a85d49c85ea7d9c08abcc4a071de3271fe1102e1ddac1f5f9bace4e08b7c99d8f26a4d4eee6b883cb0f557acb440b823f62349c76add9741010327d5b793a4d76a97f90329d3a9a4de44b2ac99faedea49672469667e520ca33a97efa5c2d12748852b98d715a982ae9d252f99690dfa1e4036352ae739fb2f9160dcab218712227ec3f3859165e4e4ece3872741d5dbf9072a5f638055bed16bb1bb19121cab22c8b902245d630c18311b316795af9cb106ad445524a735699ed83d03909e5c48fccf18620882cbb4ce555e7c79489b22c3f90031072b06a737337aaee2f13cab2fc408e935f4ee444881038d83091430f50615f1ecc6dfbf5432e9d9e9d268390d351d2da5d3e69a98c7c711ca6d8575b95f9742e144264195171810e527c525f74870b33539a85b22c1e477b3beeae4f5cf56bd01f455996388c0c9183e350f1223ce84dce7c860c36deb9a22c0b0e38d3a144b44be14afc44591622cb57909cc84124c92e8b103880b011e406bb88cf213cbfd6f6742f537607ad95d6234fcd03e4be1cd73267c40bf584ef8d5be9a222d59f76a06e569fb41c29e4cb5007af9bcea9bc5b88689603e63ebc8fd67c327c83b22c71181982442509bbca89c7d12a10f2cb5b00040e206c005949d2c6b2a8b81c2aabc8bba1c6b278a7185996653161020e10d3a27c3c4bc70721376ed07cc8d8184fae8e78e4b0811ef38c2eb1ca33b32a480b6a70876e7f11d265468fa5d020adf5ba65ffb59d141cb90c2d59feadb96234834c8e88c838527a9ed514deb8cc663b973cf35499e56a3441062b174a745eccd6064fc71262c08731d5545fafabfa0e1203187c723d87ce701fcfdb17ec3f762e364821e35e2e403e988796c8925fddb04d0ab1b2c25e46686d3c72c52959426470955b608c11e7324adde79eb2f19bd0a75fbbdafd158a8305af0b21262b6583d2a6654192b286996450525708f5c247946599c3e53859454e8da44a5fbdd9ebf639bf82de4ce677e6fb6c4a2b0da51052fa968837211a15ac8412fbb91a64997f29589c1ab35561fa5de468742f3e0a5fd5e432b3272928386730fd39a70bfd231b671cc2e3ae90cd2bb3125184c491643d05cb1244062740cee8d0f2944ca934ca032800724607e030c11a647c9b91e7b59f425916214284a4acac0c5959a3488a4a1aec4764b02c4174304188397a094d9fa9699b8372648e9565112224e58d9841e4489121419605c909978091731753424a1bf50ac2ab4cdd992a8410579d80047dce5d7a7bde45bf44b01cc694d29fe35d1fb5ff943314fdb72b36d7734c2d550955a1b931099dbc3328cb72b22c4384644a07fb20d5293de2d428cb72928aa4a49cc4a17272f203f7f8a993d6e1bfeccd1595121c5fdaf39acbd2d4ce5096e5e4d0752f5273da7de5ee41591664979fab961944a8bf0dcab2002145250e111c846d90cd778dbb5a83b22c2a2b480cfb19275637a60e13a12c23e084c99c15ba3a469983b22c276d649df80f547c59dc10414af6d9a9543af5730b65595090243972a292f2cb22e40c206f04618703082b06cbb22c270801e7b1d3fe777f8ef6a32c8bca42e1936511b22c2b459e0666ac2429b2812024006218f5ab5b2671215a465916212ac90682382f22474e8c0c591695150382b5fe96e193bd9629745096a5ddc807b48d79cfb93d471d2dcab220697724272b1ec7b2083103c992410c96a5484a1b592a282b08120fa49c24b40f744065ad7080030fd80004342007af254224e5031980000628708107584002660c295224a50315b800052230010948e00211f89524138040101ce544020fb8340107042105082b14684042338301cace89b91c8bc89ec46164080a928562c6029051000712602b292908e8e52a1d38001003c4c181021c241f208019800704c0810018060070a28132ac480a9fb8cac9c99123a11d6147923f507865ed49077c9c9c60a0471056910af0382729444ee23032248e3852883c808c2214d8a192b2b2246062868e73a2b29c089f9cac04c12f5002812920601653d0e14596113210300b2e94e8484101d24032e4c812808e32082000258f98051bce28198212c77bf3ae1de8200738b8810d6a40033866f0860c62008317b8c08d36d860c11a6aac200d15a4000d149c617202131308492507b802154a0e70056294ec8042004a1e010b329c51b28b39d882162525253aa6a00b3ac4616465213921b290a88800492df0505262420b5d9891865c5cc1641626b280c5492c605152820b1e64e000b7a0450d68918159a09cc8a20ab210428919cb196834925ec34ea5b3294450807e60b28a92121342a8e200b08884892a6001e400af404249091f50d18e640e2367b417596ed80f9645c5912451f123496450846be08853101942032244ce683f94949898a2dd0544889c515262520a13521849f2252526a3e8218ff01557e1334a4a4c44e14406f1870b458902453a732c953e7ca2a4c4d01c4b45e50c242525269cd8444949899968821099c0444989491f2c01884a9494983ca2123240627014e120205ff1152742e48dcc800891246938915d296e349114355c084382b0da40a2821494949850e2488a8a91191419b288a01184d50612f7345652dc50414aca1b4796ca1b5e64b961648d20a880c8f214a4b82107a7b4c0c80c3cc50d3e4cc20f922829318944494989491f2011045f31e183c923dec81a44882471a3a4c4c4112525268d28293161c4224a4a4c14d1fe46ca27c2c40f88c804251e410a429002100720c51e4a4a2e19620e97a3a4c4a410c6e670364c085152623288a5e26c10594113198282c61c448cb8a0a4c444102b2aeb48498949207a884a12222f282931010491b5294456e03c24050e6fc3484a1a2b4896b760e58c9423292a2f30b250de709594367a8d217f50713986184969a3a4c4c40f253fe0214650d8dff01f0c89c35b40640de1219d84053d9803052525267d2829292931e1c31ee4504949630e14ac220b491236da88af20711aa4700aa7d080871449a20257494141b2d0303224855786a00089abb81aa70656035483ab01d620d5206ba06ab02c480cfd6059ec07de293bc76a831d0e21296f648d20ec70a8a478916544888a6f911423de45528c204182a4890ca1819020ec700c89c34892348c24f94e47ada8ac17ccd12928585159477a8d393a05054284180a6268062b488ca4a0610610952488b293442599c3e5b894a487184a22e41345d8000a8c008501941cc11378d0510b1db6d0210a1d84d051084ffc2821231348e804194a8cccf1892d54c0044fe004277ea4e0009cd061128c2bc626f860084d40420b2504388319c840062a94943ca1e4095160c2194d10b232809292216d98c0c8103348606668c00c234ec40c6346092c608611278207c004144a4ace28d171868e03f0a204beb8431d2e60061484010b252f2881c30412b804194e6477889137809082c611242a093b1c48861c3903c990232b0e23448e141962091e25252b1052092225252584a0043128218592921223016a0441410ada083207197238b7ea79d8682eb5188540461c927a438be835cfd93145061c10dbe183d7fcb7dc8f11c878c34a8dec6f2b5d9eaa65840c64b861b94ae5a9ab690a4db7e1ec583ae6f8f277ad6203af414b8f31c91622af0129856c955a67274e359c7e534af5d1edeb496950a4ec2e5dbbff184734983e1ef75d2bc4d7e80c29ad4bebd7a8a5cbb03a1966483cf99af23432e75719da8d55a7545366869e0c8f72d14a8638cde3f518d2a6e3e6ec3f4d994528cbd22745c81043af4eae7e33d3be5983424618967db67a3a29d741072d18f20fb9af7d94cc7b5a5f685d2af9a9f255950a215932bca0cc2e956b14195d3076ceaeba366878f6c8e002bfe2dec5c488bfcd72838c2d28b52e29b585147a55dceb0c32b4c0ac10bbf51393754259b855caf4ce9c3273080bc609df559ed9b4faeb0a6815ba4984cca020195658ddcad0e91bf4f6836e04082927292bcb520232aad0ad8cda4d27132be76432a870d4d2c153848fc78da7609bb613aaa2d5e5caa4acb4800c299c42efc710ffaa9e2b9435c88882a16143ca92571135a22ccbb20841430e5e2b325081011950d0dcd52afb904208b5a22ccb0a2f329ea0d25b99a5f23bcfb55096c5c82272448d20ec9d828693e184a5e6b8d57962a4881c8508917582b272c49bc968c2f274b82bd3a763903b136ca9758bf29c5e02a62b362bc735e65742a24eb9b415217487340928b97beb1a756420e12cb959bf7c52dfa61d639dbdc4b674f73d37ad1859bce0786387313831a35e3de6a4b4a851961395143880b011645962b0a318b894b15fa8d4a13fcbc4d83fe824d3b58c367eda310c445f6bd44107394a845096658e4564598618c91dc2686347306cd99f9bf4a34ccd71b00318bf386fa6174ac6d8c9cfc10e5fa0850621a310ea42244407e99841022142129a1acb12040746d8d18b854b3d4ac4082553b678a1d08e6a4ae6b5d6f4b84a1224294478084358961347e1c547929c088101901604b1c18e5d1c74d8169d46c6a43683b22c4528429121284844f083210c418d1dba58a8fd8c350db649b323179f2813a7bd455cf5b870b78498af760e4aedb730a9ff2874b02da974942dd6624e5368fdf9934eaa054a7e27a94dc34b3c8616ead51e2ee342ad3c11cab29ca0204972645982ec988541ba6a258496ad31e7b2e093d2e93b53af562d130b3747cf22af3be9fb1c1629599fa56c2d56f9bf5eb1b6cf51d91ae5eebe488eb0c315aed0a06633e7bcd19c1276b482dfd66944b472a93750d8c18a463d69df5062f2f3b88ae4c38f474f1ba55cb12afcceba793e4d6a2e2d22ec484526d37dd4f1f4c6a465743461072a8e37aa4586d82095e918493985dea79bb38ee88e78501064adac146861872914ad4da933e798552dc52fcf6490fde175f29214c84e5a9592194f956ba358cea7eef8794d564563d8218ac59adef89da5cfa60ccab2c8c18e12c489ec3ac38e50e09f4748ed59ab2ba14459c10e50a46f85fa183ffe3f293fd1af92d246bfe73799f3861d9e68440915195d78ce9f74946147278c32d733a576914f9f13a6fa1291e94264f4bb094dfc9b3189e6f6f79a0d19766402adbf931e42d58bac4196450b3b30d14abd59c2a3e899c9f0b0e31246b5cab5c728741e5f0d3b2c71ea959f7b3de6cf32b522871d95d04b656cec987da5a78104b1c20e4ad0c08c1d93381972e48c3956ccd82189941fc29ef246d640030d10ec8804077640e264c81133763c62c891339c8da44c6087232ab0a31148e670392cb08311438e9c4103175860c7223c8e38d61b20d8a10824894062c60e444460c7214e24b0c31007d8518805ec200402760c42003b0491801d8138197264013b00b1b28f2d2946bbb631ffd06d6f6a3de5316af154d6913382a8b811236ba0b1c30f7d14af45acbdce9863ae72821d7d50c8e8b1c6e66f4fe64476bd61821d7cf83bea745a839cff970d5179c3063bf6809acc27daf7fbc24e946591c31dc9891147593979c10e3dfc7177b58ed1ca5ff3407023cb92c68e3cd8ad5135db5ee81815cab29ca8a49c00619d60071e9eedecf8301966738db22ccb22a40541961d77b053938fdefddcf13c0decb0c3dabc430a2d351b5a0be52465e5052ad85107a5bc8c193da7ce984b14212d08e24354de6863071ddcfc16ef59eb17abec1d73d074c5282594d0a45ab8430e7e690cbb39682126631c3be270b2030e2b97a1ec743b691b2d0b1122ce2bd8f1865bb4984e2beb1b5608e5c0d182203a90b0c30d6854e66183d67b2ed33bda90cca92b951a9dde5f5e62071b18a1756ef5bb2a850bcdb0630db8e7acf7c7c343ff97851d6a5066652e1ba4beeb2c2359c1c18e34bc62368a9faf139ed318ec40c38e33b031677c64d4bf668ab22c40582a2b3bccf02aad2b2a73ea3442435996651192b2a30c7b1c9d3b4d7d29bb92610719963df5735a688d61c71894fd3ab370ff1393ab18d63676765aca4fe72318768461bd19b6a3e9e87cd7828193f2ee2993fc6bd861b0e30ba693a37328f396bf9f2becf082f6a283697da9b9e4b9a30b2ad318c36ad5fe42be5096650717de91fec233c6ee2d31cab29cb411233bb690674fa14e9ce6dca884b22c76d8a105848abffbff8db22d85b22c2742e0b0230b7e089d29b36c4cf2732c9c2743dce998d57fbc57586af7509934bb4f675921ed7fbef19e7e3ad22ae8b16cc4261da7734c5261d3526aa30a5fa11e4e41d542b57754740c2624854784f818ad64507eb22820cfcc5d854ca36c282c478f485ba95f64fe09bcd0674ae8873b25e3881d4e3896e78eba49e79e461c7634c195c165d0ac7d395ac8844d7ef86b964c5b0f05d9b1045db878d99b75d6a62b61dd29e719349667cf9390ae6a4eea44b4eca97620019d5d7c7ceed5cb17819817e85082c931dcb4f11142763cba4c8c818f1ca94c6cb7ca6c520cd3ab0f3753b7b91b2786f23bbf889ed2aa3bfd81154c8681e6ddd89607e9d9998e24980823572e5c06791dcd6f46591621494c82618cdf7696e6249f64830930d458b3c274adcb5eb10c26bf3864eaa4b39b0ef62584e22b46561c2f30f1c5aa35fb760b173228ad93364c7ae18650abd6f39498495e0d135eac296550b3b72bae3d946559319224650526bb58c7838e79a3eca9d151960505cbb22c7e86892e52bfddf6f3eeda6d8e83492eeed87767af93ab4f73103c98e0a2d31df5b8bb6e7cf97be0901d2046054ee44892373a1044871a4c6e81d0db14b97174aef8820009b22c6e30b1c5e9b36ecb8c5a9dcb38cab2b8bf1117ccc00540de60528b5cd4358ad4de1bd366c184168b89ac0e795bd3a26382c92c4eb1265f76b73aebb4144c64d1b9a7f8d6cab0b162128b741a214be585897c102ccc246ff3ee9378f4d82bde0dabe149f7cae43aae38aac6bca6dfe7e55428adf8333c9bc7906a52b5acf04447f537cdd82945ab40deeea9baa6ff54be2ad21ca4fed00eb522c5a9d0e37fd20fd9b13a4a0d13547c7f427e7947e52e2a23989cc2d649bcdfd36b33c94da1b7d898846c1859ba548a5d7bbd6a11194b4a9114caf8ca3b73469945c646a18c715fc8cfebb7392f0a46953a213f9ef951188a3e7a8a8d1f4547994ca0d8e6652e9597f2efb53ec1af149b1984ac123b3d91b86b55a6d6f7d3c974c25badd5966a39cac5c809d546ad9f35871f1dda4d1c748e7a8eea2b22a326ce584ab6d6d53e6b8f63082699c0a38d9037733ff1594c1843938638f35c625294658982c925ee204dbb4c53f30f9125cc3a5cfd8f7cb8dd5809e53d85ceba730c4aed94b0937b9042dd54b4924d02d951329950befb1ee7c04412dbe72c35c6d8ac533d994365650e670388124c22a1101da16594e747fda32c8b0f7c5984f8400544d69095234518c9b2b8610209476b3e612a85c6382294655916152c8b0b4c1ef1cb98ef57283bb94287224448105f03c81b419660e288b5fd4e54ead89cfb41599639f6a4ddc80cb460d208a530cf3432eaf8245b946509a2e309268ce834958b19a9a350528d06901a982ce28e1df389f8283506bd8922d653bbd2354a3317ae4922d4519a767b33e2c4ca0411ad9891b27369e88f8e0edec0c11b268748c7f6afcfd2cfe525cab22c4b0b82cce16c2ccbb26c9ff8109595203d303104371fb37c6c6de3d92dc4b16bc3ebfb0fda95eec4841096fa684ed26c352a9d16980c22e922624a3e0a45881b492182c6b2b89114229c0213412c37aa53298452424bfd042681c0538febd2afd9e33940bcb64a8f78dba8caec8d33f9831f307ddd59d4e4691de63e989e3a23cde5ca49293e583f4a79fa8f61636bd430d9c3bb9a73148d423ddc26b4d4b26c5429efe421a1fe3d69d677f2dce0219975d6bd3ae8cef4fd1d4cb9326bcf2dfb45e47650c5ebbc42eb8e2af6ac436ad33ff39b189d2d462674f853f77ba77a99852ccde1d3b74d31e7cae154aa458ec98889d359161407fc4fe7f02342a4d4c1e174ae3f6485e7a035fe063c8bd32433a93f196a3778ab6742aa5f5de3526d50842afdf37a44e6c33761033ae56869dde69aefae612dca63120f5274dce23051c327735a5522f5c4a43ee57b6092865ca4d2b154fc85971c0d7b4715d9f6ac47cb243739c34a89de347ac7c58b68864da9e91c55cba032b71c9894c1f01cffe685d83a59f2810919102d7a455e4f6e1ea13198b1b473faa84db9be08c5440cb6cbf556dded9239c7240cbc4cb55a2999b93f9d60f88217d2bef94ad62aa93e6d284b9022292a69044931e9429eda5bcab0f5162ae5825acbafbf862fb1f9426db2056eb3a7ea98f67097167e9d84dc355362277e16ba951a5a7293269d4c5838a4f8d52f4dc84fba2b983c699e7cce25bf9d15ceec5ae45c363d7ea80afc68f43c67a3fc938c0a691db5c8dfa8a3993e294840603205d5cdc6dc9d7e17cfa22c4bca8a91212773a8ac2c8b1021330892b262648d3954de085202132924d4a7acd041b73a19435916216d984401fb986bbf7c453e1e8414142c4b7b1052f6c4040aaadbff6bd7a1a5aada031d08624c9ed09da99692b29a4ebc9cc0e9bf4fdb493beaf1bcb18120c6a409bf769261751a1df57226acab934c36ab5e421eea36a3de53baf93251c2aae4778c199bbda51c6559849824a12d55f227bfafef5128cb22c40409ac7493239fa3083d298a101dc750b896215ae49936df18d1610c6c4fb5ed5cc91cf62ec6b3aeab378b19b55efa40073190cdaf3b94df6c0a7b1801ca6e083d54a10e25e7a674b66729958a74d0ca76a369c6fc94083d509192bdd33e2d5e4945a1c729d6d0d5e0ae45bbfed7083d4c91cbf9f8d2d4573ceb283130418f521c6bd3c8693a33312d9465d91ea4b05588df1c3eee31ac1ec78aaf40a5c728f024cb4668514a99fda2d05be49bcae9a1c8cfd5b89cfaa4759c4191a8170d5a78f613cf663bcdd89a22a5cb13e65822a418fd5dd9ad4e2c345b2b3f5139b18e328dabb6764ebada84f3bd3a794919b919d4842edef67b72837a9d89b51662a399bd6bae8789d4c99e129fd3513b45969165117209b56bef955026858b14083d2cd1e6ea091d328892d2a3127da990f9e2e6e9a354c58910596844a107257e4fdd41b75e5922a62040583180448f49203fda7aab1cbf934d093d24a14e32fbb7127ae6834488100f2c403a000488100f7400c81c2a428204016228491039d851cae8458f489c8566fadfb8a3d37d4830a6c5b48ed51c35fa47e469374729fae7b5d48e70ed473cc617bbb9d38df0ef5bbdbdc67cba6546a46637c6b42a4f3dc68b50e67715616ff8ba97143ac9962722fd52b8d49b3486dc11a1e9b42afb44089dbf75887c43aa598d263768ca10ca8d10d721a63a9b853046ff7fd6774d7d3a42a42dc3f5dbcc7b98d120da302e4a85c912114d108c929abc47a699394f208cd1ac7db3fb8bdacd1adc0310e61242efeb870d115a637bfcc1b0e2e7745c116a6ad7f1841e7e384ba13ac6f49cc5adace244882c1df4e883235ec613979937789c0f9c89e657b5f67135dd83595a72bc5345337684bcd1430f8bcb94e6311ae4789c0737dbbf4c8a075cbd0619ebcf4b99d21d92f19c958c6e97fba11d34351a3c84d6b317b23a985234fee57489c774408891ad5e483137a69c8322fdb6cd3d9fed9ee490943968d4a345ea1f075dda8c6739ab35c8201c7c19af539da3528e6fe0e6a48c793b87af776ed84c0a2585fecc7f4ad4064e0b53b24d6dcca199347ab041a9ae36ec7fc7ad969ad0630ddebbd629a5f0a43d4d35f8eee2ea6dbae95428080a7aa4611d29758d27e52b234603da356a50275aa6cced19b8911fb3fea7339cca0c6c4e5ab9cecadac6b00c6786cb1b4fffbc5224648d27f4200332ca8e213ace766a1565c555c6f00a33ed782d1e410f31b49a73678676ad543e9465e91106d55eca6d2dae5fe32765e5c4d34879a3053dc080da34f3b1c4daddc6bf80460dcdf6beabdd84bce0072537a8d0da38ea93468f2eac27536fe84791a2792e70a35befc3c379bd7a0b9dad8f7e29d7357a0b8d1e5a386aa1a56a8c7855f96721cf32e74bed792ce032373f6e4b3dfbfb15521a466f5c0669aad33dacb0720f4a8dc778f32aeb5105d45b698e89d1b627438518f498425acee8ff72a5753bf6400754d0430ad766253708995d86d10c7a4421d5f8ebabfe33429b3da060c8f13462b326a5538ee2468f27f470420b7a34a15b9161bd5daaaaab081e7a30612d7bf1a3dad5d8ab28cb22647b2ce1f8a8b40c9b51f567ab460f253032749cdd6ce6151ecab20829c23550e991044eacfaf8861acf0cabd103099a7bfcf3ef5c993f1ec378f118d39df598d8a09cac2469c318674d7eaea4aabb52138f62289bde5187d09f4aa5c4c04367d6aa74ece76a18693b97df5dcf9626e4210c377b87359d5d46cb778e35018f60bcdefafa5dc9187d2e30320fabe495162d5e1b11220b0d1d50e0f18ba58bd856da564b66191ebe58a65fa9dbdd496dc947e0d18be33ee6ce576c54951777e617a9e247eb56e25d187e424913abccbe853c74f1cd78cb9331e4918b3c57546b36e7d84906a57b093c70a198d0726f948a9959d3003203206b0439b2da585944d2581623beb2b288bc0a8f5ba037bfa4fae04abaf7b640fbe7381bd234099dafc5253b5a4f4ca9c6ac69618bfa144fdf7965ceb358cc775032fdbf8dc8b248dee5e62465a811321b8bb63ba34ea34a675e2d582cd5658697acaf50e651a9e3c7c78ebe7285edae45881ba9725baa15e8a8b76f665d7f5cc98ae4f6c74eb6ef5ad769156b617342859a561a4caa685f4cca95a64f952ea5e2d127b44e1a75d42746549c74d23ea6fda447213c859eb3faf0c15345fc33c5a6638c4c3278ea9cae1467f9ef54a655a9f7881467bb8d2fdf633eb9d128786d7a5d859028f2f3f86995f810e35a28eee4e799d4eb8f9582a23f21b2d4eba447289d4ff0e55a346bccbcf9399ef84df737bb94f24e7b279659b5c820e2e489c97870e27361625e87ee58331c3c36719728f1503dbea57a14003923c8b22c0b12223c3471b453aa1b45c39ff45096057964825d93c27596cb18d7f51e034c9c5dae16eb2a4d47d7a32ccb1b3c2e71ceb83fdfb63ac36c097bec55ea0cee396e0865598ab80c7854827f19b3f8a8f2d4a6e7021e94588979f5fe733a5ac2491c2ee565d72753623b49ac4f56e7e8ac4f9aec2261a8fa8e969d4de6777c88ca1b90408896fa556a56d335a20849c10c783c02a149eb660f7af4aadd11ee8c4c23f4b484961945c8911495142ccb9114957e834723d06ff1155b19cc66445916462ccd55bcbeb3f75fb888731ecda8ca7536af064511abd3ca4ce84ea1237f367824c2979fd1d663524b9541c4ef2a94a6b78839ad0f715c35f18fe79b460b5196658e149515242df04e71c310abbb6a49d1de31a9390843be10269313ae4d95eaac6942744a785c3dea576f569465e13108d6958de7b67acd2c515c06ca43108adc97c95648913373200c25b596d39d37335b40a051c6f3dfb589a49cf0f84342dd8b2ed9dc4f7f51966565f9e12c0fa33f28d70f3551964525c5c8901315f0e803bb5a846ac78f2621e683e79ba921abadc9845096e50c1e7b689576d7d8e7c8d2526df0d08322d4a7d4f28dcf521e98f9d91c3acc73ce4127e081874e9d92496851fa5466efc0a7b666d7faf828842de06187b5b7db764c9b7d4a58875d774c294ca6350f1219f0a04366ae4226fde6ee4a3a87f74be79cda36b9af7258ebff6567162574fb386c32ff3467aacfa25438204eb7269da6f40637fc5ccaeb28434d25e0e106eec73608a1bd934c9d36e0fadc94b0fba0358ad9e04b9d4a3b9f30053cd680aba711fa6dd33b54946531010f35f8b232c34857676ab434982b6f1af245f7880d1aaef53237379bf9f5cff09b8e4ac74fee515d6a86433df6c8a84d75f553065c5737e964a69a5a5b830719f6d53a9854a23265ef2a292742788c6121b73ccb8cee0b530b788801bd9ebb9336a961a4fc8d18f008c399ca3b7690b2c15549d4083287b3818264a9a1c30f3cc07012ad56bef49b3c3d797c61f939d98f7a4ded9dce00f2460a787821ddf79ea6514961c2d585cbf4be69d763b2b4ca053d96dc4d9e6a1fbbc3630b3cb4c0230b27adf5d1f5adbecfb1c0030b8b87d8f84a0ad92e3342e07185834ef31a3e29994e71630e1e5648fd8e52aa3989789757411d6b4b67ab6e53d2e441057474b3cfabe62eb4018f29bca23366cd331efe83407c88ca1b5ee02185a5d0ef22a4a7068da628a883946d37f23d9e5c41c1d220525b09f559f59e70e8f8f9b23e7548f9dce0e18456669df4eb1c638a545792b4a1068f26fc753a7e90272e525c28cb22c47ec08309689e2b93ad1bad95e6093c9660eae9f30c1f44360b29c18c9fdc5de97e94f9e5910454be6de818fc93d626cab2e860020f241cbb74bc368546c631d8bcee6533ca75db468631d241444afd516e7c2a15c3a45cb9671f513a9d470cb4521fb2a5de86717a95f2b49fa60f6408e3dcaa4e8452a7fb534541b2d4506404c398d71c7342095121a32c8b1a417440810c6058a384f648297b95d87fd12ba13f3ebf5c53a67db1149b65cbac7ff2a9edc52bb43633faeacf152f6c7d6ae2446a176c6a948f51dac65546179e8eeafb7dfdb4695cc9c8052e56ed3beb371d3c5ca42bcd74d68d9b95e76f91c9e6bfacff742f755bbcb659783e93cd60732d3c95223f49a54de669b43856a7ff8696d538cd2cccb8f39aafa587d5ed040d3264a1ddca673ffdf8ea3c42462c54a231f75599e9fc7258e0b15c0be97183c894bf6225ebffa49a53a3e676052e1f52781c255b07652b5425fafcdfb592b156561c1ea49a6f2b57918f2791eb59eb185115e6f25add5b2d4bbb948a5dda681fe152b4f81015e97a71f2daa753182bcd53c3dbaaebdc14bb6b5db5a659a256a5e074bbf2333b57e921523c5a0811fef3d2dbf5a3503b4d8a13db5a49bd28d855da9afda3cd978a52848c5024a308a167dcb5fc674181c92c2db4e88df6aa1c647ce2ce8cef9d4bbbbc663d818e9e743f74dc634c3bf1bd8c523c7dc5895cb55e46a9b642283781aa5b9561f7b31a4c4d60e25c766a5dcd6eba4c9ce295dcecd661ea61622576948e59376488d025d2ffb9b5abfd7789cc120bdb8f2ef408338d9a24472a9129d552aa167953fd28a18c39b696881bf1aa9ec44193979e790dfb164b623966a76536f8a78e228186fb57ba64447387049ecca529df525ac71f619a6911b372443a09cdd8646ea2538dd063f252291ec2d7b418910c73afe58512f9e022be8d2552b392a9ed55459cf643274d0ffea226021d76576cd45d299b44c4eeffaf9f49b712ed0ff10a516d9daede3d848650f6538c7c8d29f5090b81dc12139949ebf797109fe9e6d5f18ef1f71bc49ee1ea3d6a2d3f464d10a692d392f1731bd30e84e223465be694678800a19a557a432829d563fbc3dff955d476b6d751e887e7831042a86d9029577dd8a4f9bec8985fd9cc876314ebe12d6c76847e0fb7ccad33eb8f49668fe901197a508969e7d4310afb90f3907c77ded8a63b956af0a0d29c51faae492b257e23c80fc8b8032f4ee753ee43d3e7ecb07299d133e7cad3fb7c40461d8c2fe7ab9b65d6f01b17a8112406cb220432e8700ce6b9636f3a0f1a4691011973489f794ca694da7cd3a32c4b0a12232968a4c106903428e30cee495b51264d6a90d932ccb0baeaf8d2c184fcec659461df8c59de8e122d4df9155f411dca2083a55ebbf4ea75b931668632c680fccef89e97e6bdbe18bed34a37f887864675187c939b3c869b3acf170ce64e71ea1e9356957f4135a633b9faee85b4863221df95b47b55195d68e65f8953e3a5738dcae002ae9f9f6dc2de02767a5dd829dfb44da12c8b1fcad0c2275adb830c694ae7a432b280fd97b0574f257352a12c8b1ecac0421957c895e89cd446ed6abbb7a10c2b983eb3c9b437215e7450f8a48c2a9c338f58f92d576f1f1424cb02471954d0b3796d2c979db5b6654c81b35d4d42bda5461952704ced93b2152242195130ac27f9ea32429a4ad55006149acdeb4147d6932acf0b653ce17e95da59b57ee11d6b42194eb04ee9f8517cba0996365b59a9fd75eb6530c1cd317ce69c3eaa69501a652c211ddd85ad9ecff3513447194a30ffa7789954eb9ce207a18c2424a3c2b784fa8ae9189465b9411948d0d54a99e49c07113151e448e91afc38463a4bb13a5cdd28cb728264c8b208e93582a84ce28731dee04983902d2e464264eb2f1d2ee22e458c84a9f928fd562baa0d63af55f273f546104e69c1b22c8b901fc2e883abb8b89812731e30fc08c6b5499d52512746cba9063f80f18b1fbef8d10b213f78d19c6e19f65986b88efcd845deda43ea5279c0b903408420012244d94902a4d738b2dad881881fba389b79ada7a9043f72716759dfa84f9da66bfcc0c5a2b3fad64ae4660fb6174982649320b9852aa436adf4d328cb92821fb6489bf618c4f347b17147599693395450f0a3168bba90eddfd272d4465916151f92b2420b557a90bdb2aee4e6ac4a11aec1097ecc22f78fa7b34611525facc20f59e0254ae7eba374bd1f347ec40299a5505ac67511233f6d64c82f8b9021692ccb0f58acd263308df2f1b4360d413971210c4122841faf486b566eafda6831dfb224f9e18afd3b66f3ec711db67fc28f5698b537a3988f6285f1672742650e655952b02cabe8948a08592157f34e3f5491d4a385c84ee12aa509440c3f52719690de39d4e7ef4d28498428e1072a56db6c3278dea05c57466600870a7e9c62f1aee5a14b480540de08b24224490f7e98e2de9849e64e7e29fc2da1a13e06b526c5a450e817f9ad49bf57a34691f6d2396a6a253cc84e14c8fab6ccd1fc76de09c5b239eee122a44cb641f9010aa55269da6ec59e6ddb6b04d141851f9ff8e18963542ae6f4c65df9d28f4e7082003f36f148e11abc34a98ce61bf9a10934881cb17272e369d37e6462959ed55b6d68d252633f30e1ce6bf169fe5fafd25078f0e31289add6ff399d6c8414cab22c8b9095941415191459aeb282e424073f2cf1a3128b97af716d54a7fe7c1a3f2871ec2acfe699a93da77e4c22f1fca78378b90edc3083046fe0608ea5a2b224a15426df7cdb3e0897a12c0b1224ce2a2bf723123f20818ee9ef42ea9ff620343f1ec10b13dba73b5f2ea38e60f4366fd2b9371dcf46e0c9cd4d7ad6d8b17442d230632549910d9c116425491b283f18f16311d76869a733aef643117ce7e72435f4e8c93c11898b96674c1e55bc8d883fbbdb289995ccfef910aa8e784d26ef3d9bd610b6877db80a51cf51ab1066ffe0feda836799518470664dddc67b6d3acd411c4e4c485933ba3b4441b03a2b54530be1d95e208cd3b06f274a40584acd2a19e7537cf60fc7f0ede9fa731c0d911ff4d1e25ff369fce6a70fbdad8c880d1bf21ff3830f48bde9d9466528cb727eecc1dc5fa6ef75ffbf96eaa1d9f991f7e6a74a7b08e541cff4d0e135ae47cd54f0030fc8d61dc46ca88b0df90ec750a9859061322b53dba18f2d6398cbec172d9ae3471df64dbe6e5acd33874f073d66bc4fab639427d98f39789b4988758d73ef23b31f7238ab9b191d657614ba99fd8843bb2a333e8756dd91d90f3874aa72d58f8cf2b56ef6e30df6fc87ef2095cc4fb5d90f37dc396eee7768d1e95e6dc0e3a5094d55eab15128cbd269fc60039adf59b22fa492316a083fd66066d549bdb554f714ab4111bdea943cf9ab639886b5d61d4b967b380d0d0dea96a9f5767e9c01a945ee447dd4c2836c8634e9d16a1fdcec3d68adac1420f951065cd98debb8dca7f7c8f0830caeccac59fd3e88d2ac1f633066e16abb75d6420881e18718349d39889eba4ddf7218fedffbfa0e73d1fc9fc0e00718fc9843cbea1c9aa3f857f8f105d46a909e94e7162eb7c20f2f1c757f95ddbf0cb571173299a5d70a2917d026fef4eabd3f1d5a5bd0b3f8fddd2074f4137f68c1add3625f935e6d329d85f563a8cef2ad5b8e180be88bd12a1aa245370fc38f2be45a35af6ed0b16ea21572ede1598d9fde9f470c3faaa0e70ea369e7a1517454e0d7cf8486b7d1274453589b90792e64d8342143e38714ba777975aeb47c6c5b093fa2700979a35bd45f5d2a8ff0030ae8158d51f37aada5fc04ee73affe4d93083f9cc06c07f72cecb3522f05c4b80088710388690388690110c346167e34c1fc41ae8ee9c363fc4d906539e30713dee4a1d34fbf6d6f6de8c712f8522e954e2a6d33caa0a0e18712548df9bba95fe76a4cc38f24fc31497942bdbc5d5d177e20c1d6e2a2193aa47fc98eb166ce957ac58a39ad35064a493f8fb99e4e5dc5604d84949a9a4aef470c4eddcba8566e2ae530d29cb378cdd90b23ede0ea958bfbf4b10f06f2656d14737260bcfffb52de9caed5f92f789df977da41460db92fd2d2f7ac498bb796772f92ee9d537bb5ccb779d1ad3829e5b8cca2e45dac23f5a372ad8fafc4ba38e8a0a13dbc5536e45c28b63c3dca965bdb312e8e79cfbdde5ecaa36ea18ffc743acb2cbeccb50522bf2393a9d5bea7ad8559ab9631f673d26e5a5aac4e6b54fe9984d24a6b166edae7fadb1c31de92856955566db7349dbdc6e2cc194c33287bd1718545e3a549a6e918e3597dc52b442bd75cd13a94942bd2ab8356336db90d552b9249cafc7611e6694f56381ff58dd8dda4643a57c19a674fcfad438c26559168bb1f65764a85b245efeb50afc7eb840a7c8548958f6ea3733ac5eab5d0a9f5b88f7a93293c1954cda48ed63ea5526cea1adff3b485d04152b4abbee74a8677cb6f1408f9a14565cefefc48149becd5a526468ff4d447287c173ae6d97da94b0b14e8a43f4915d33ae7863e8167a89731c794cf0ef28452e3c724f4bb4c25efc4625768add5ba4f549c38c3464db3873791aa0d526d73cc1f93a60974b974a9ba6582d71a653251b26b34860984bbbccf61a538d32fc17cda12295f3a1a3e96e875542f9559f687b912cf9c4ea2d657e48a28e1c7c86e5f9d691be3732c2244560b7c4c42f531fcd7be923ac6283880b021832349da53d07e24497b47c187247279e7aa44b9269da42281c8349e4b8b1d8f4a3df880446bb7e63283ea7c0dc1c72314fa46cef5862aa55994657957393947f0e10857e87d1975db394afda524498cacc047238e266aee497f7c9d71467cb71ec75bf6d5e61145881349928222836579828f45ecc265ccb6a3a4eb16d2820f45b4ae5d72c7fe4fd5690a3e12e108f1f3763a6ee83c197101903782e00311b86a708df15c63f07188b4efe6ecb75a86d8b47efbd369de46e7c0e0a310ca125d3122448470347bc53bff696c07071f83503b07d3984106b3570be258fadf6ef6695bcd81c064eb2cb167ae5486296f648d37f800c4ea6a5fc7e6943ae940f0f187d3a7e9df7f9dbb47f5e18774897ab833d124f202126489828f3ef4264b4dbbe65ba38458c1071f3aed71dc3bcb966d96c4c71e9657eabd5a67e5a25940f0a107577ff7caf3a454c5ef230f9847e17542c935dd7a117ce04111a7443c43478c7aefa0e2c30e7548f443c7fca5654ea312820f3a5c9ebfa4eabbe7b0e8fde98dc2cd56cc4892acac15194cc1871c72a59979cd4bb54bf9c0471c6efba0db856e90bee1233ee0705aad5736868d4a442aeb093ede903821aaa35e0a997fca0a121527f870c3223b6e681935e9cf2f4a91218b0833c1471bf4d56426728428cb22040d1f6cb8d6edc7a56999287900c8a524405412202a490758e0630d3ed470b77614193555d4d868f84803269fd947eb8e2263148a11172ccb899114341846c6ec28ab6e5c3314244894e0e30c78a6ce3a9bb8153fad357c98c14719ce7b9965aa06cf2af46a0451711cf82083e2c5e3976ccb9e7ea12ccb1c3f6425c5c8898f31e4b769b22967dd6587b22c487c88c15c9f731e22edc664509645080d7c8421063ec0808c597352262353f6cac7177c78a1dd686e3a5f936fd897e0a30bae9c2a19bad6c4eb14cab2f84a0a100f0cf1c105f53f9efa8fbf961ef5b105b765cec14c46394a33f3a185b7e37bb52b55b57e06c14716f6fce9c4aca63ba993d6f01f0c595971b81b45862c4b1c3eb0f06f887a0553e8146a5d46bcb3ca0abf898c10a767150e1b536bf9f9a38252d6fe67f528f44f340584aad7c7fca1453b24054d7b2699c4b7b6ed270a26a9f3d53b0d8565b46ae59e57dbbb9e6069f9af336af7ead87182d1572b3f539a65934d60bdcfb566d6395a4c483b8cd2a073169e21e3868f25b0425de6687a49b5bb0f25e81e764ce774be6a6d1f49d0c6e47bf7a54c2b621f48e057264d13afa2b4698f61cb77254be7181a45cb18a9d4acad57783625b48aa1301f539eafd48a4a8981ecde6437f2567d940e43dd286bf2a3224b4985a1d6632f475b4b1d4d05c3acdfb12d4546757b02e3d06c42e6287b1ad4f90bf4c379eb91f72fa5d2176f8c169e616f7b5af6e2f09db559ae68d39ce485e67273c7f9dcd118dcc5fa65f8749b75819442e74ea9ad8b9b0b844cf137fe59fee1e1c28eeaa5643035fd29740b6e4766c61875f23f992d0c62fe644ab59ff7d7621527bafab4f872d122b11a7b5beb562dec59e841cb9647172d559485d971426dd0d14bbf130b64cc955d4aa6072c1c216394baee197d1b5f5924e8f18a844c53a5746e447594087ab8e2ed7832c3da78d269a5010d80d08a446ec776cc3a3bdb8eb22ccba2b22c438eac131500e8a1072bd41dcec566ffd88a27c14184bd8dd16315b98eb1f38b95421a904ca86410a533611c0c8601613018000003229b460013130020302428128763d170286bb30f14800243483e664e28282e1e0bc6e1703014088542c15038140a83018170308cc14094c971aa9a0043a892e1bc45e81fb394811bf6c3188769cfe759085631e5c1f7b17b36a84abcbf245831da34d42c562b2986625b4d504001e6d2f1acbd9a401747d765fef17cc8b8209f04ee8b20f20a669b1fbe78044b3f02e7e737f7d8f2c94c08431f18af7b21b2381cac9de0fb21679881063c1529f43c857c43e270f1f5bf5c266f42ec874cf8cddcf30262701e44cdb3a09057f5d7852df4d73e162ca151599edc38ce338312f58c2a7255e4a0d14eb69a823ec4492a82c77f01c1fc95b240909c3050488c31584ee8239b04148eaf39220d89e8305815bc2e98e8e24089b3cf5a310c3ca63bd5c054d94412e0eaa1cb27d4dc0b6b423adf9b8358d82e0d26b6aae84e1a1f866bac77e9ac44b457c20a0699b00ce9f388125025d5879996c8c81a3bbd69349ea8e8f24d1d68f91d62516df47dc7e8022615b4d36f6f3aa92e038d1ba4dd0410ed038d59b51a49246fcb17aeda232e7c40a05c41dacb176f7069bba8a14f8bd38615e7eb0585b8b78ecd801dcf5fea819b4f18adcd7fc81fef539be2e8c02387f262514f8be472198bf5ed81484c8a673b1171fdae4b6adedb156e437115124e785381b87e5d821cb09f500464c799d7fe84f03997b9f7723e1e72ff85880a64036cafab6cd3f14d52f559ed30c5126eab6b625b58af2d31e6377acd18f786bfe096ad881d0c00480c16fa3889dfd9571229f6a792bc1968531bbc458720ecd4e8da642a6988ab8be3337466dbfd67308fd58bb4d9ea13c5c01b6b6a4cb3201103ded90363cedc9ac2104fef5d94313d31fdca9d92356a7e5220fffc9d9a4a14363490b44730da215e3d1f2e2060ae91d7a9c6b2f921c8510684cce406a2662f09f706437eb4f44e500647a64aec932f3d4c0416d02f13f745f0ef8aa417ccf723364e612aed9a73504b57e46152c74ddc7ac8759127cd418f5c48decd390c96da8f3cc10ea1c7f0ffbbd7cde283c6f83873bc56dc78d51b75e2a32a560653b7d8729a669b75223a0fe9c22781320f2a171ad2cda54613f684e3226391b9c85de80664307ff66203c7def409efd840cb6c64ca253b1ef0f0889e52210324b624a890a7c33c1b2542a40002983e3f1bfdf025d26bae000eee216e3f562ea911209f6d0099fd7116fa9d7e17e1ad673dd4e91019809bdd37fd4a7bf2c4c2c032246c5608aa8197b1bf69fa09e7b9f1dc7ac479aeee8e36b15df5d6a982ea3179dc3e47f31414e5fbb5fe6d148c3a2e1956b099ada257465d50d923b5191c54cc412886d55370c5a04b3f010e0c9e8b0668f29584a8911795a7036b41d76189c271698d07d90434a6862f7004f5da005f9b449669f9b258b9419bc354dc6bb8f01142ef8f7c485ca70c1e743c8158a913c63f521e4f58b26fba3dee637408630c1245c51f11ad8b7cd9e97676fe6c0ce2f5d3029ce42ab92745b2f3f88ee0b9f30a82c631ea36e0106913e8d4404c0cbedc89517bf04ef526bfacb85964b8226593cb87cd8992fee173bea47fa83c839fcad678124aa172ce26548be7e51cc01a6098ce74db54be86a51356c5734cf0e247befb9bfeb39fc71c3bd0b33f9f3e5492eeb07a579d0a3c6acf33a67271df5486bc2fd10fea8c966b5fde156db6c0d1dc8bf1a2d315204bb04b4b5279e2b5642c8e053278ad4f040245ed5080680fe3d20109b3796c4026a133b0e1de43663ddc9cbbe0776b311bced42fb30fd9f3d708d424e51c6ba05986964ba3ebd8a94c4d78e88a98b5b8a9caa87bd9e498bda0d918432ae8f84fb9bb6c7a5c48fa02eca9714fc1ff7e44da0fa33b814c2371b236d2df3d8cc9976d6704f2e7a465f323905b1cc5ec455ef3f2f165f5915e06f179fa7cc6aaf812a3ebdf00d21c705c0fb3d4cff81ee758cbb0a5acd236a9bf8e6712415d199c814b4edcb6a2d56c3115942c45a5098432854dcb52a84e518a55efa4d7b3b6cf01c475cfbb9cefb900e9384096e76231ba5a338f7b6111f6a2e3ccbf6a2103db18eb6810da05d8b72a34c2f77ee9ba172a3dd0fb366c40f96225446b41269ee32381ab15316c17e8273e2059ebaea0b404a816392600d9846493763f2c26997d88a31a0c2c39fa17c816434c6e711bd80debda1e35fbb24b45c105e39617b2919c8a4095a9f4b1576e5919eac2078dfb668950085e69491cd5be002811fb26bd8de0ec5f2d3b2b2a3d5d04509dee1d055f95f73dfb4e750e75f97921bf418b7c5ee85640babb7ca16c671457b98a1d5ee124924890ead9901eed4e6579a9bec6f1190095f878c8dfe11ff526395e3d7974b6dc378ca0d4cb9ded903ae1dceb0ea253f1feec683df7ee81c3db29db0e6e3a8c8b016e58272bcf51b253e9f4f0683adfbbed0d04b2a7b70cdb296d868dac960c29eddbf87c4a82d71d501446a8a77516714ed97c8cd68cd2cc54e7731ec1aba4ada8448b55bfd1f83d464e775302a0066a988e9778542313c703487d40a496e5c6d23e254721ca6d2c3d315d124772c8b8b8e87ca0ef0e89b314506cba84eabbd07dde5f40416b1f3d38e228b6b76e8628e233b2a8339ffa20c944332d08754659ed1189b6fab14b56409a80693ff7d1da0b9b2dc41adfa1c33d888513f3eb84fbc5bd4503822baafd7fb5bf4ff47aab1cde245c1b85bd1b3a8b54bfa9e0109826c2a14e45eadeec9d6365f79148c30d0b2362bea4d7ff490d90ddab8bf8f885004e88223f877812dee2ef881833995994951afdca628537ad3b868cfebe67757d94a1ced2ae4629c6d2367f51fb40258659277c0b11f483d4665611b3bf958b05155518da3556a2b5cfa1996c4f60b2e0b60281360bafa116d19a9b872cb2b46c5443098c65130846f341e0af9b58ea7462625557225bb90ac9d22333a8f4d22d128ca9341056639b886e1fbab1867ce32a9f68f5499c8a39b53f4ced9584abd996dfd064a8300140fd0aa7c55e41e8bc1a258683917022b5383a899fd69a4a069195c2da584f9dbb005f3d45f9474a04663be80b10128dc224dfd0b36563ab3c2e3390e0415f9e2f485677ff6fe6363ff72b8a1ed5a0364e1d97cb8928d831388bdd9483c3893c8e95aedf53dd4775a750cd1e5d07ec3d09d8c0d1609ab7886b40e39d2aa00f3fedb232ec358691e9a8474204edfa8ac531d4f4bbdf52360bd757c7e2e298e82e559ddcd81d442c8656cff4504aaadd9073f4087cfe75d62ec30130a80c9ca50e8ae54a7d33ff68eea68c458d38e17b4d621cd41f708f4f075e3312fff9b56505b0dd6d2f26ce2061b1e1c318d67717ccf668953dbaf15ee42a067a2cba14e33f3566fecb5ec5491ce9a1438d80463d58616d865e6a0830454bec450e4792d54c69aa02d95831258d661609efd50b3347f0d1744df69027189425d234d643ada139c7a940722e865d9a2de2a16a741927cac131ba94fc1f1a49182b1e9e2b5b4efa3566ab3aacf14274391a45704c70b778b3c0bb584587b8e3b5cc883e58aca42dc30652b2123b005f7596260de9e5915fe2b93a2596c3ce25dade2a55e506e7c2e08592abc59db5d3873311485bb0c9d1870e7a7c9b7edb3deca5b0ab6963b1f5c858a30e7f58a49670d6ea14d349c358e1912bdfc1d7ea8b8ff0a9514ff6d21a970f474a7ca003be098fe8f77382dd493fc9f17703fd130fd9f5fb132c0eb59df3bc20302334fe8e7f81ec0c86f98211781387e2c628893e90a526399590063690065b9852f90ea9334aa9a6d9b04a0c644bea6fad9396ec7322652f952d344327faf058d9ea46ec7812acc03432dae71e2054514946bc7aa55e160462be20b4bb6f6003b93688ec0fc09f1f60ab15ce5a8414ee07e96c069bd471eb9821304f3d462e138dcfc0bdc26d3176ab6bc15ead748dc407ad200aac88b0b955a4d229086f2b205d9412b7e10cb1c78f629fb009caa92c35c0a1602586042de4463e8cbbcc8eca224e785c92587ac5b78dea4a6a2053e67790bc451ca2a25a49f1e84b1c0e54b950cfb19fad057c7e447f207b568da81a32ef6d75c579de23d67441069d761f3667fb7b9bd70cdb35859cece11f4714fc09c259bfdd05b5f64cf44dc3bef5170e68b14e177eedea6bff200a8aabe2ea0cb2c86db941fd456775efa399860e1edbc5b3d97b8068917eabf8e1a2e74a139c12b39121373b61bfdba81bcb3cb32a0fbe8c07913486055b9c5667dec8ca4bb1faa094d72fdfd3a7240855e24db316a1b5c17262b1df5ca4df8926dfb9878a706a456c60032b45fb59afd5e2e69c33579fd217e6762577f6141c36a253b1fa83c11073b281ec26846838b347667cee7364b26bbfbd1a47aad865a6519838ac435b8ada6e856cda39991450ed62c32767a9979518409afd923044ad006dd5995280627fad561f3fac86329c5e26422565c7e1312a1e1ec64a0652b753a497ea1060e43c41935afdaa5e0ac2080af2d7127ef97dce66519d65d0300242649c6442c72794e58e9e426be95a2e5b68287a2fff4d56fbc64028fbabe820859f0f153a448cf3ad42a788576eaba4d3858bc5833e16519a870ce6830515b2a6e0fdab849c3ae7d51ffd2ed4f25184c2720cc9db2927d047371fa9c7a3302750c60bec19b03610ab3abf272247d36b7aa11c7b5de8e4293fcae4fed7e9f9f98e4a725a91d7089663be2ebee94a7f6bbf07becc124f7bc752a3c47970f6262d65fb5b3bdff920faddebda4e0b3f1f21082bbd8a7ee3fcaeebd7315f4b8423172ed2866422c26a2377ebf3bd5f8436e1fedcbe9a04289ea4856a95361d92bf61541af9259c190bbec3266f67f780e908a72665182d929c161c11eb43a57b71098de6f3f8a8d421cc938501137b116d9907c80b39ccbb527f2568946bfb730e4f675649659c3a1d3010bd8303c031f46b91b05d77742807eb870a827b6a695d6941195b5fc718c2363ce2036961992a88b4d8568c3755278f8a86af6c877fb3b06b22bfe30282f273d073ae3f3e865e24565d5b569cac8a890072716420a02c2dbc15a1414d19a7f82792dd2b0a1bbf699495555539b29824262676f844a5b647fe382d99be863bfee04292908ff4cfb470be38b0611c0fc4bc8fdb490ce83b90127cc5d98959789c20208ac46cb495ed9f44441bc24faf777138d10c5ae1092155d5343b2555a7c9d41b8343a96c80b03e792978a8316d14316937b1b1a49ad1ca25d0bfa61ea34b4fb9b9af33c681b9a129719e40451713077a42d6188286d95cda8c81fd12183d21d624c3555a049cbf42f8e254a952f650d42aa64262ca93d82318ca53a595d25b49abbc58782bea96d70a8fa25e79add0334a0dea8118e2945dc4c24e3a8382c25e417c4b88f228170850c7075c7823d6f2cc8d4263036c854e3f2d149c42dd903c1003391bb3cfc9f8ed6aa845146bbfd38617a4d12359ac28c0e3080c0e91f74cfeae3c18f2e678d99bf6565d83fb8a2dbc5aec5f00f368ee09aaf9c60825390131b238b2e58aa380bf288c9d75115d95a868b466f6c02a234b29d4c3665a0040ddb02b5e39eaed22a8253c87638024dda32afd29d8dd2325d4b4f147f550103a1120e475052b1a7cb01f51d3c549d3cef03c48242a74802899d96d5240b50d542222fce70817ac15a0843ace9ab16012c42b73675cf8295601102fc56baddfa1798f2b89d058996eeff80d5b447f7736a9f4be7016f67abe4e573f60703461088d2da8ce850d8584017b18d8db3a0b75449da4c2f844dceb9149b67e22d56d18d2e9b4ff4927de3558084af4bab42284e3d3f533b24330fd0c8852a8b2b518e0487f6a8006794739dbeb7ab9d264983b3fc6ad70c18671005d72c75a8c9e97f4b40bebc3a44644be8109f11826fae783250b9e83489cfaf11ddffb9a6969eb490870072a6cca8c9ff56e2f8fc43c837612d4e3f2e46263ab537bebebe1bdf22b32fd69e8d9df3b907b5faebc82a5611f640eba447ba75419225c78759dae3840b02f6ec59c05150b7997fcab5ad0225f19f1b05e0c664d785737a61f6541d41a7ff2b4d7bab5dfaac24ac68274becd5d64cdab88f77cafadf43fdf02b784a1cdf3ab30133d229f0918d8760ae16fb1d36c885f89521816b6b3408783ebe00af389bcfc9e595f7c07069359711a3544ae2bb4dcaa8bfad23f0ead6bb7b95fba08d8e602593c66956196f2543756ec9ef4e2ead5b0e8ebfdff5c39659b2c67a34334498d3c9a967b0dffa06bb5a14bb432577a52dcb53f4d8efd71f0882fdbe0477ece29da85fd10eae654a2d57b212929f2a2e4c1f4e0657ea4ea8eedef4b27d63fa2010516a0c8c6b9faf5167ecd93f86f232916cb7cf398aca90c03d085c4e6434fa5f73656eb27f266e512f4d64a3c7f8fab8aa8255e6b7d14dd7c1c383cc29cae18f71b28be3cbf3d7291b29ee34ed1e476ccb989f208bbf17da1f790ffb06b71820a24a81da40bd72c9453d49233fc8f838c2417bec52c23185e9a03371521f51dff2f9f68df57e7a7f5e0641403d10a335c946b262d8bcc6b0494dbc96f64c2b5b08215e4a92a7d834662be6f6ae55955c027b91233e14c178db41832fe7a9edd33c5ba9de4e5f4842953cf5af6c9850630d0d8be1182d790715af667cf3d806889131abcfca9a6335f933c5535e755f8fd1988493d3ed9b2a99a8139ad6e9f82cd5e8a70d12e8e2f684fcbad0a138e24613b327d4d29fec85361f3cd76043441a6765348fe94254e355be804ba6314d884bb99668bdb9ec0b3c08f6bba522f988ce190612618eb715fb0f25c7dd5c670879e01ce863b24fb4de939efba4bebdca13f5d8a5e39201c937281f6a497b4250e0e36eb5c6f70ee685f7226f129f3b0c0b8564ecd4c91982addc2de69c857ff10bfedc277185c0dc7b332bdbe03972f81ed9f955e8ff72b8bed1b77a32fa1a826bc001044d1a01c0a55e95e74aaa5849312cbbf01d8694a12548e8f01782f0c4618a093ab34063bb2761e00c986c1ab108efe9890381e46f4dae6164863b83e10d98ff8a87420d181638bb6890b9a9ca269f998924bd99ad63b3a386dfa8ecf53b6756f046cb479c9a9c13cbf78128ecb3a87f4ec32dd85c187d30a03c48c1af673986d2ca31aa80e520fa2e4e493d8a3d92d443cb96deaa8e558052f65750a785f082c1f50933e527e8508c0e42009ea88bad161d09738d733f8ff1dca5fa7d2ca1cc42bbca265ef2ab10448e0e43abd8321d98abf27c3a5cf77936c18e2ec55074f6b29815bc4d77098f7c2645d34c3f0384ad2e438aec8c365db77c2a4ab0cea25cbfa386d7b30276fdcd0718e3973b1f986887cb440479c48502cfee8fa897dcb22a1a0108ef436256117bf2d3000de76f4d642ea1621e3bbd61f63a2f2dc19a7171daee535190e420ee759b0368d92e490a321e996e86792824793ab333c7d78269cc234d94a3ea396718b0a853c80d05a2fb4a93e1e2f6e79507cf00d3f3893d6fec173f2a1f9eda93575ad693f27645a500c6649468910e7ac35a951c0b4a46c46e199aad25aaa006def624c246009512857a2d43fd2a99cd40148fd84c9d4135299a3c64683f4674136004dc12e36f9bfea7bfc3043dd1f8d4dce3869638af0547934de919d56bab3a1ec5aedf3d7ad8b4226a3ebc7de82ec592cff4a5213b245e7ce129d9f5fa24888886da85e4aec0a22ff00c8478a5e0e9e0b08e4be65e705fdb308629ed863bb2c4cf3cf29468a13012e6a13e14e9631e49350f7e3f5fcf2714640f58fb760fd2f794911eb82386a204bded77a2c72b6c78e6a8cea68eb8c64a574008574aad0cced7209589196e1b83c6e4125cb9e0b9bb83b5ae741e96e73bc312c0ccc27ba4ceac1c30c96b158698a47e70e5f38db1f2b5374877b9ec2008838a4e728520e14d7680457d1465d33fec564bb3cf57d21c0902627f5034482aa58e384977e71991ea5f4186b30c74fb593606ad28fd342f302160d959d5c17f370eb24b0d4e802234a2378b043f317413d5a2b19f2197709de157f834489876967f628ee2c8cd6e1630f83487eb944e0d491bbbae9ff68488c8e936374005f4cb35a31bf6f6bb69c0e3d5305c20527a4913cd3ed14f24174829ca586ab0a779dd162e8bbd92499f9e99c138ae2b56b1f015a736b95039566c64398108e3484d900e223bbd87fd33ad96bf8a4d87c9070f31ad2898a31d51935728c60589e723ae82e2e880e6610711f7094a0e9b9f133f1422089c183cd9cc7504e475fb3ee4106c37b0bed5c2bb1104d85fb28bcfd88bf70fd92e3847c28b41430dbb616bce35c4e56c9c1a9efaec00bc9f11cddaedb864c1559eba0c20e32d60364b7866139e8c0f9f8c8df42bf16a4c135d05e45ce0d5dd4fb113941643397daade79a1021a159a663c5fc9d3cd1c3d1edeaa3c8275cc2dc237ba921023b8c9d20619473f5f559507cc6747c30d6f5b4a5e535cca06fe83a9c3aad257d4501e3c8d25cd262f612d1fe3412d34a066d25fab48e83d227f62efb7edf50d7135ace7de9e03b92838143298941d627a3dc76386a066de53b0752e0ce120008445b4ce95d5b472eab42d71d00a1dce1d92e2c64cbfd8936314c2d01ddceeba7ea837b22e34b8a2a6b24377c480cb03d4d605c94c870e66c4a8455890a26cc8e518090d3464971d548d15cd2d84d74b14392df8a2773c11d4bf9a59e81e48a56b528d779bfc6ddfe54f7bf2f51fed428d46c67c0f9d7f05642f984eba2a75cce5421d5340dd4b0c1248e9126620c05618892a3e9e2c294c482927b242d7a1f15e318908225de20068c123ff080deb8aa27e403e103f30216816b447b0f46a634198a0cf342d271ef5105cb062569e47f48a87be6a2af1ba4560b6d32b5885a679c1246cd82015108649598f7ea8b3b3aaae74b1795b4291f16e04b4cbb6d49d604531b5bb844c4a7be53decc014df5f08f7959175b2fbb1651bb08a57d527f9d62e84e8f824764be13f6bf0b36a41223a34471181f23250184c02d22c0b57458a12fbd7dcb0b7e56ef6e99f40df879380a51d5571cf29173b0ac761c880027f697dfa9af2883db2f180fc80cf8776d2e31000e7b3a8403a2cf835e2d79106ce543cd1d5fd3c4ac9fc68ae3265ea62ae8c20b1fbfbf5e236dc4d08f6b93abcd5b36dacbf3d5f6edb6f46e5b2f6dde68b3fe6df4d4e61d6cbbfe70ecc9ada977af80b742f79ad5dd7daa1de0970260e5bfd0b34da4facd84fd19b8f330d64e595d716fc9209609137ddb0162de6974e5e1b0bd7941ffd5c6e930ff42ac443b0baa625b824bf21b20fc194cef9e1bee3ec8f187e0e7ab41daec709847e575e56fea6ecb46acd36a00acc1d1f7fece12a8a86fec37e9497815bc8cb3ade4d24432074e0e2941b12c9cd4ba88883673a305eced2a13af242fcf88208c23b6c08ea63f31cc8aae3603440baf402446361b3d655d6706bf130b37d08e1c8e2ad9ed9a1e6ee01f161484872f783c7a0d6ab0601bc89510d85d3ece1a8993a2349fc6fc2b430a9a3552a368fc05d3f16d58ed52d7a5286b447871fc4f194ccaa35c46cfc522c88e5a5a001a7f13c39d81244ffcde65097f05f18dc0692b7ef0e23d3685195d30efe1662cef2e975abc9b72e4155f741b147dbbfb114d0fd7237dd5546398b435c21604e067a84d7bb2bf738bb9f8ba9ae9f7c21fc3c95affa18456092faec6cf40167f0710c1e450f15b50504423a732e32c60df57c0e25bd7213c0d1672cd5d63530cfbf8999f792425c65c5961684b6450437dc77741ac85864ed8d816098ea0072405ba9ff599842d6d04fad19e1d173cfa11e6b6f4a524b685875710576e375d259ba2afbafb732db8b674c54172b5b9e0b27443526ded6aeb1a9ed54ffeae085416bc615fc53dedba4cbb79779444141583f65df3ef169136d377bbe209dd23aedce151a2e723b2fe85e865e0d7b971fbca3a609197ddb2a8b96869866c3532b846abbb9e15ba2d6c3a91eee27a261ffd40251e131bd1a2cf93446e70229c05f594d28c0da57b27afc92a8f8ee19a4c8899afdba2ff791aa8e971c6c09c6703df940cfede37d2b09218bbeb6094414e9522d688d16c99b710804494a53630cf6a3784e1828282c683036eb09a206ace655abaf17a15e9163e1c99ef2db63d5f5e9be5a2e6da2add30a4566ff8b8322011425b8c9cf72e48d7cf152e2d8e207a1d310e5fc1385d0134fe2437b374e909d1052800b1270ac01475f3961ded65126e961448e26831d0819b73936d9848662b1a3706048bc2a62b7ec850e411dfa01b35f6944964dadebc9cc271dd15aee0e9e7ab8ab52c6e176752d228a02c7fbbe8185d3b9220b39a6c066db5a226980db7c3b46927ee9a8845d3dd1c7fa2817c04047a486deecf4dff72587b0e6155494e1d9c0e0775f8ad9596302e76cd5af49b653682588b1b214930600324c19d6cff1abe8037d9cab1ce735aa747e475730d66d1781a5be23abaa29ac2b725dc849437124649ab172d8a22e87929da0450d2d3ef7ffb98309c41a3b527b34be1b73503284ce7bcfe810a1425366009cc1d3bdd65aed26ad4bac8e4705664e385c71c4ca309c64ee7cfea98a3aa7ecf18ef351b101b0f81d24a109749e30f3bfd5c9f0c57fd1ebd4724b7085640069791ab1430ee6d23c80ca7493c8b538f7566dfcba23825378a85fbbc884237dc86911a81900ab0bd36186ee3ddad696f27e52236edcf82b35ec7ce8165a397bb6527fe6d41ed4697fdf5908c755c648b5e6e6e91c0445d703396f85d44db6c700bc7750af18c44501da19ab4c4bcd833bbc3bee22068a89e9b173b7921bb1e410aa0f9b51610422ad2fbeab4af41c5ceb35aa4abc4c52aa31a74b3f28d0ec31888b8c2c87dbe4f70af3800345a800c26731724bf4c21d9e9020a6955e0d749053838ec8f94ca900d4b428906d0ea0c4baac850b2f36be91a7468cb85c4c415d1ae1578b7d71b74975a2e4e31185dfc72d480c15a8a584ad39ace0d8149d541d0e71be83094f799163583e986389809b1112b885f1d3e00b3c0a40aa170f2932880366189c04d3b5cbfba32d1c42e1ad947b0df36f9222eb5966ace7d82793b0f87c4d1e7cd8ecc976890a946f2581c0db057c9cef2d857fe246af141a80d2599b0cde506b168a8925929c644baaeb0107e33f4fe86c14140967d1ae100a1ff90bde88182d83d77da2e73058ab4ded3fd108b263a815bc5ac4a6a414f1741a485dea8137c43900ebc8430cdfb17acf70690330d5d7a9bc9c4089d6c3fb296a2b5208ab79c1abde7c7c07174fb16ce4580219140a836373eb2453b1c67c742437c96e57e0853a5ec5bf15e26663162577192b6b6df41fae8ac32afc20e610c1129de19eaf8628223ea8e4b09652bda90f2d7fa8ee76dde019c983b16a10eccbd3f10ff07feff64cbf9b68f7e1b750de301644cf93568a01f7ee2f579903f98aad578ee3a4f5ba963ca92336d06dd68c1b40115d5316ce20a72a5f90dbfa3a9869faf60cebffdc7ff5cb260ef6631d5feb8c1fbc80414e047f113ab35b9ee4252b8cbf2e8b25c9b9b19a6ca11ce40a9d4d37efe1c2f4214e054f8c2e0dd1cc3517ab95231bc9fb2a1f45a2405171ca17f4485bf6c12d699c46d4c1170e5f7002837fb378f735cc26a822ea2d2b3c8ed50dc106ee0ccd42881ee0ba6f92231c3b8a872a1af4b946ecefffd5e8278c0c18c7997787962c9b610b080734bc21d7b751932a9a0588511459e0b27f16ea05a8247eeac755a942c01cc240f12143229eeca52b7d907f0fb1b82472254878048bb3ab3e95c33bfeb51e058a02c8b3401767a80b20cc7c9e389c6093ade031e2a0c94934fa74d0e0820638e2a15b0193c3e115c5c58581c225a5e39c30311f1b417b225219958d51ce514c721380d88a1d31b2b2ae89142c7f92e53c36c7f2c74d09f46ce577b276302254f57d43973462c1b67748c26e8295e1f6047e8c4788b7428a5538c136b95305e2ec12942c768150701d2c4acb92030262ecd8941176827070869631e5c58181e97e164a15bb49e0303c9628e5c60180797744e2776cda1ac74fc215fa5d75e9876f15584c629c097021adb06bf0a505a35f8129038c0d0f672ff347559d58a5519a576dc0c719e6ef761c32f3a8ed8fa03b83600c19676de99fce5c61f9e7d684a0175d0c9f711e0e00ed77eecb65306675c628d4a91339503e9d8eec8fa290d9438668559f671116cd3e2f48d6843a7eecc98d237137abb14c3ad9f306ec06c37dfb6c645d83975505b0c79e3b4b20bd051bc4d05bbaab22865adca54b6c4c26660501d26502f78027ca168c2d7e35b0568977563376ac81ff19789453d365f8f74ee9dabdff97b3ea7dbb57305d4bea8d8db957168f0a8d0b7cd2402c96c9f56c1233f29b9267fd04d3e7694e50b1fe3ad782a3ff76bed9ac0fbd0f77fb6702a8254155add4beb52b286c59cdffbec943ee0faf8ef4dc490fb30e5067c1259f4721237044bb6b0e4400256f0b02f6eb192808fdb709da9f242bfb661099be605a1318040d1384d1abf409bbf1447f0bcbdb2f95989c13e9e13a0b2284df510278a0f01f40f3092150451a53d07681df097392a2286885af9e7c14597829e2d91dc9a728e25b1502c880beb42553db0253d14c2a51cd1ee69bbbd9842fbcdd22c05bafa30064e7396bba4d468237eda6f6cb5469e87a45b70af1a73435b278a585e6098678774c3de6940a12155238fc5d42fb1355d74e2d587b9c550a93c305908b8c38b66546c8a5ac65fa7e6a9ff564bc7127e0a83bdd473750b5494985be61a6c30ec43c56288416ceeca872ea1c0e16800e059975c86b3f471160a857d7b378e82d81dc362fe7e1b8f3aebb0aa23f8a00a4f414635e3665b27174b90503e41196cf5d2cf12bb6f4922dfdbfd16cafd80ac7c56a6397bf8acbecfddff5a63a7586109cd5c7d09760b1edaad8c7f253f3a51d01af30257b9533304214a4a8f44232b1086792e32575d767cd2a8e107c267a716ad19ebc6ec0646eb9e640429f98ba9839e784b5537105103ee2421cd3f548e7f3578520d9771f043129ebf9d75db68a8fcf06a0190d2e766a44c82492bfc438a1c34fc003c9c812bfe5a8281126c71bcb0a701430e8ce14d0ce2776305fc990635a4fbafd790e184f076c8864fa527870d7b0ca7c539711a33cb227cc3548302b9a753204535eb00cf85a63d79adb502486a5fab379bcab4714829ea6158c685035934cf1cfe503316c05cd7d825d5799d36877376a7198f3d11c1c6f2397daddf20765b8680ced5291547566f1aa7d3864acc76d4490768d3394234604d45ede64acc691ab8514ddcb82a1f2890ec588597dbe2986c8dc20630bf08be712521ffa8c7453d3a19c3499885983c0c5be314e0d37909b62243c9673beed4e9ee3343b4b41c213d83891065cc3a9f175b0c31aaf6106f12e0518956f81cc0ac6cdd717f763493f17b2e8742a24f9953e559d204bd0fae76bc14aa741f61a8f633c9157a3f9cd87d19a4d27cca84aacf9227c89db856ea1cbad626968fb57155a5a120fd1cb84bd1f4a223252d92eab1ff0767d894917d819338eaa67ab8e8a9d5946d2fd44ac1324ea5e8a65b7f107f43d88ea54e2ac39c57b9fc40bb8cbd81e5c272a9ad7f268f39facabe6da07db8f3edd638f4f2808f29067e76ec7bc082b203f15aca2dfe2341b4fe7e875eaf4da36494dc3fa689dda3634c3ee4a533cd7a651bfc80e70d80b5eb4e32c76f4249dce9c006cca3afe6fe7f8172c29fb9e37096b799e61e7b21b964744318e28032518b6d05374273ac6dc74ecd7dded9f1dff8ca1407ccee3520d3b6caefb00320bdcffbd7c8da83e05201c8279e0b81699a9c65acb5f5c12667b76ef387b55306ba4d37819ff985d21bafe703ffacd0ec90f22f10d164a424175a4d077f977e140ca45d0ee63068bad3c2530a05dd853e2e736d6a72dc719b20d1f2f896220c7009c6051d734833203b565f660f7cd9863fd8c73ca3dec09bb94f21461a578478695c70d39560f8e0e54b9a16a205df4dd04f9ac1db9234ac326c758f825a1ce694a8982650769cc27338562f620c4e5950d9103e27baf8de709b62715872721defbbb99de79d6775e0ac9c87e7bd358893597baa96854c0f5dfddc785c2a3794eb3565fa31d35a75f4a0073da64917153b93c941fc34f38c80c0e0f1bb7cd48c74e90dfd178cbf0c4a9f6dfe01dd3dd30909e5527866297d69c9cdb9d67caf4bc9ea2e5ccfd91947320391c85ce28e5b8d542fcfc1c2e2bf8fea8cb4fe9754627fbb531b6a2f3e2c99464ea2c74501b40d9c45f3bfd45fbc55421b15c0d26e7c15ad921a8b21c65054e31d5ceeddd67c818fedf2caa21b39eb7130a48517f9a33973a78eb8a00044a9c4fe393a004ab56bbcfe6aed530ae646c33e9f2c52c34f20fa9e03d330c4a529cdc418125f2fcec2899fcd9fdb907b75007e386f1a25740799698468b414a27b26ac1558693b1bb1955f13b248fdb8b196fcf9c57e13cb5210a5811ba3a919d43d42506665dab1bee27cd512b1b8cd2a75a8d993104bc2201fc71086b08dd00de828685152b87981ef36fa42d1220f218b993121a3c1e91eb3de3ff65a1ae85d93f6848b6c713dbdd599f45541cf4ff7d89a41239dcc3d901986eb985cbb7805a7d4c4e45056cd99c16a24aa07672e472edbacdc80f5c056eacc9f07ce4d5754c7d83bfe5849d47beec9eb67eb85f211bac43646862bba3f7187788fbdf8356bc08b2c93b560dee77c4dde79933a0aca62406a92f4fb6cff5b14ed8434848dc0d7db1d2d3626889b36f5349b92a4e913d3e5bbdbeb7b444cfedfdd79be17ee04c80751ec86be66995d4a7ed9bb7b11a4c208759c8791252a6d8b1315b9d45a3edea63378461f7b2035a67b0d89788240d8720523440f736379749a262a26cdcaf01fdeb8de60a179289b49b557375cb2ab58973c8f663ba40e4a3b29e655138414b12e7cc3789f968fedfefb8c72d055b909f99a49ba369d9aa10a2e473ef5fb33c8044d2dcdfffeade5d4f44ac96ec927ffee6cffaffc93477215561c6242ca3e4308551714373568e249a071d525b93b6e9ba34bace0b87aa6c62b81987d5a4fdd32006191505368c6c77a7ea2ac155792fb97053116b8ca043af15d847c1ed755c0c7225cea427bae0ff498220a6d467510a705c4fc2cb0e9da47a648e40994096023932eb9699564b1d221685be57068cf072cde180d97905cdfa3c7105ae000697fb01f4330cb5261c1f4c24f684e5bc5afc4a8185a57ced407ffb9d9e2f983026c2f97e0a5c0d33748476661d0a0ddf93bcf470659bfe9cd0f018062fd349492e40f72558653f3c5619923ec3a20973bb2cb91dbad8643fbce787338407fd2873dc76ffef777f8f3b5ff3e1ad71bd131cdc48528acfcd6fec4633a65fcfd751a30f68ccb4bf43d6500f3384ee3ff57a8ec1efc3ef7ccfab877dbbe4cb659a89a772ad264f8768f9c7c506e71b2c247c3210925c038e59431e1d927bf3a19b2cf2d08d152901830a66efe120094b707c9718061010304fa5915441c0c85a231f358c44775dc4c3f879739dd477430a0e11a058ada8f815612afbb5a4d2c6392fbcfdd01c70ec3f152aa29e0a0f79fde3ebb2053e1783823c7a1b61d4c7860b2001a494be64e42fe2b5b9405cd3b0f0b7cb16d53c5f5d40934eecc6ce49183c5a92c3920165843e19bcd4f172cbc59dea154595442674b090ef6af5ce8c5082ba0cc4f9aa1f888d182938fc139c3b0c702d5f9c36b529a85cd050c3fd7ff4c0f2f79533677c6d0272409f2443bca09af6b87ff7b4606b6e5fd8f8283a36aef3d180b1a52777ebea9ff7afa021bc8853fdf1c4b86ce0f2638fc3666834865f79ac37cd73ca21d208b5e755567a61947612668bcaa027449036e3186ef0f3430aea690033cc3333cc3333cc333460f9a7f105975db33e58af80c17542d2949ee160ada12ee1f001e00c0a3d9ee66df0f7e060139108a0f29108e4828f709eb392606c711489f52d390315449922449529224d1c43301240187114e614bd39958427fe94558dfb3a4bd1f779db6141fe020825e529c99705230c1e341b8318c24932ae976e36b57f686307699edac9af960609f849d0d16b24ff6346e0003a991515b977f71ca6177b257459327f30525ea65cb302925a9fc1bbd4063e4e68e96b969738317e7ad0e6a49f60d2bea8d5d245ac4c91fe4c293c4baa0428ca7fa93a74fdc0ce1462ed624c47ce846c94b626ee02229e64e2d39ea7857b760e37f3a74cc9b78e21e6ed86213aadc634f658d6e32d2e3462d343977aab56a4fe71b2dee8a5b2299713eab4e881bb328cb42f758ca01c40d599876ee72d55ad00ea703f0cc943fdc88c57f213e5cc8da1eb8018b840e27963eee8e466d448403375e614d49e2d99628ba258e811baec0a2e753adea249f888854e06fb4a28e5f9ff3ee74cd75462c708315ff758d74eafc9fa91babf892183be7d30ffda926e1862ad81ce23bba7c9e553c15dd8646857f36e9a20a0023dc4045d7416b762c56ca6d086e9ce2b08a29a67fa5926375c314aea65589e994193a2fc28d52681e2d2651b7430aad62364bcf5c745f083746e1a4996b0ae1294f6c841ba2404a4f0eed1c73cecc93e04628ec2411e5525ebdeedd00457f5be13de529c137bc811b9f58a2e45825b91ead9323222228b8e189523033eb9027cc79f646276e70e2b89a163edbe3c626f29cd5f309e29f53ca8edcd00439eb1d73d8bba076263c9728b1ee928c8888b0e006267c59136773f4bc65e98d4bb895e6d929f611111115dcb044662545c99a95ae5a57e29aae89ca37dbfe299185b1f029bd64eae44ee28abb2dcf6919f2a3248cd226454dfd76f58944e964b345abce7c95410249b5b324279c1c6d7984d972f9dea5709224e56f38829bd81c5de2df625305c6386349d0de0316371a819f9ff4efd5d6da19c48c1e7783115b88cc714dfa6bfd750c0e90716311e5efe6bb73ef8c653212811b8a78d384499bd14454e75159b39b5aa8ce08901e63dc4084413c4aacdc540c6e1c829d70cfea2bb6e086215aa9d12cf91e7dd3322222d26348056e14a2d94f82c646661dab08519266fddca434973324c28d4124dcf67fd4cd175bfd1b82d0e478963b2a1b881b8038e39ba49536d6d24740b8f1073489e1c4f45efe34bfe1073b6ead494942c86b0910df81d7e0461fdcacf7b0b1b4e4509622dce00396febbf69a4fc8de24e1c61e8c16fe64b72aa8d48c841b7a603a9d99acd9dfc3876ab891877b47c2d2f26f97fcc1c399994dfeeb686a4278861b77f04a2e7832493f32537638c6577fc79a201f791db0122c6a7e4939e15f3a7cdebb16df3d73f053ffc69966eeacbb1c4e3fdb142526676ffe033db8118782c719b98d8d993c6498f1406ec0c1704276d42c9bde9f82c68d37bc52e1c4b83287dc7043b1e4ca6f77eb9c4e921e7803e9c28d3664b1f43cad49e1693f416eb021d73ad176356899b76ba83b3ec921e5bc33c41b6ae0b4424cc3c6d7cc0c166ea4c19cc25ece9ca43cd53e861b68b032e88c556a6db42d840f37cea078bf05b728f7aff307c6f0c0181d188303636c600c0d8c91813130d000be61865bbfc4436b88fbf194a151db8a1dd9f4e94a8f24dc204396e9cddeede5bcf3d1230d3663880a44448408711f41ce10f2013286f4800337c6c025d578cfb31d3a751cd0831b6270a5d7df7d2cc9a6370c7d32cfd4247e4c13c615fce00618b2b8944fbc91bbcba88c1b5f5853aecd1a1bf782353a95826df63aadbbe0955c399ef4779f9fc38546a62e624d8cbd57b700831b5ab891857f2b5364c3c735ed9146902137b090f8d1a4b1f41fa69decc18d2ba0a61fe4f4da52b270056e5881bae4e1844d97bed35a85ac849dce5161cbcc1f66fcc80d2a14d5f369bf42891dff142e4f36193feb73982d053cf694e58e594c52370acf87374d95b3cd6b42e1ae93dce377b854be3da1246339ceb7a245ea04443daffdab6ebae44dd8b253cac9e49a8d1b138e653397e48f9aa4e82ca1f05a27cd8eea9a8c4ac8736b5b84a7664b2b09acce46c92b62f9638d84e3cbb846c577dff411d4945a4cea3313344ce786114af28b6acb46fabd5b84d74efac2c7b366a63d6e10a196ede958c99031031bc320cb72dacf665be14a1bc250e3e48fd92f2f41d69302119113c446308c16fb19c38bad9e070d1df8068eb7404484033680515d12bf2e79fe8ba3df66e5563fb9bc7d516578c996d5631a9f5e98eabfdea325ef8b6e086cf0a29c35f9bd61a565f52edafcf1714fce3bd2161bba4043b2c4fa72750d968d5ce49fc492442d4bb9a564a447902167888878d9c0c55a1f93b019d3c67b68e316366c916df6126aba808d5a9ca4fe136e3426031b683f7b860ad270113cc1062df67c5d5294e5740c968f9cd580fb08b2820064c2c62c9a5b3f713c27d53049597827aab9a749e98249d988455972f4248d286d7961c1fefee44e25498a9a0407365e817a4a9ba9b99e4cde157cce88daf4dbd15c6e0561255a65b5ce58a8ac486d572d5ac96312d30d6cac02d910f7b9fb01b1a10aa36bbd9e5cd239b0910a2ac7fc639237a76ff8870d54506fa2f657099771ed53f869193bc524db07197dd8308596fb12dfe3319e7c96a2dfca54db5775f72734b0410aaa2c66f79ca82c66b283513427b6e75a852bb184e36043146e4539f9c247cf0a7a28f6d978cf9acd49cc64a48719437a78086c8022b17f2c5b5aab3c7b95c1c627f0ba3432997f4f245c6d85da59f868ab9032d8e8c423b55a315da5395a7a0c3638514e9ac232a577a26f13d8d8046162922c96586942ad34e9845b131b99e024494ba5b953f86b60b08189728cd9a24992fc5da176c1c625d0984cfe1cd74d78cb29c1181f20630a362c81058f5739c9b8cb955cc146258adf33e1c4ce8c62192ad8a044d12f46f734b9d0da4da2932449b22bb7b6e01b326c48e2cd9494dc706ff1a423e19e389b4bce23de9d03897356fdad8e0f0ff13d22c1feb2c5b29d7ad838e23e79322669fbc36ec846234e628ac97e6fbfada60d46d858449643c6187d34ebf26543117a686775eef28ddfda4844922833717652ea8d1a1b88283366df89323193148ed0c0c621d4f4569df7e484360dcfc10e6c18c23c61b242b3b35ee6f818e1410f3386f8b05188cbe3a89a747ff37f13224b67398465ffef71109ed877d96689fef1326243109609b2aae9ee9a9ea5e1390072868d4070e92edd9757494b1d1111393600b1854e49dbd72c6ab67fa8938999781db9d633dbf0838d3ed0b96c73c5b9d8c0061f3ca9523753ab3d98d69ef96eb16b373ac1861eca41db2df5e48fe1636ce421ff737f8fb9c5437b257d7c98ecda71d9b84355399966e3feb6535260c30eab979c24cbc76cd42199935b0df3c9532cb14187bfdf37ffe85b56866ccce113d3f426372dbf0f4744446cc8c1aa78f72f21bb639f8c888868c2461cd48f8cdfd227b767fe83d77ff062c2061cd01ab7becccd9a376f287665e6c535c13583b0e18692c5e7e82948d86883e795935052eb760c2608c6b0c106da4a90ad575fb3544744441c61630d86b04fd2264db6fbff881ab6b8dc27ed9dac21ac1111911fece3a0d11e04042222bf081b69b08106ff64b15abdbf24cd35222262051b67287c99c6954cf2a43c304391f1fd67be632187828d3228f7e55aa93d8d063bb14186e2afac6ca42ae39fd818836a258c6a12dfa42737222212051b62387996309bbffa2d52b0118643afe4cd8937ef686064880f1708f9f10303638c3186efc0c7136c80c1986372e5dc894b398f828d2fe4d539e798f23ed5520d8cf18131544006079860c30bac5559b6ac327143b7d10532789455d73c3fa15d820d2ee8e667b7b669b3c676a48790158201001cc1c616beb811b26145fa63d30263b93e7592bb4dd262230b7585d9c93572263b041b58a8ade3c9336e491cb98460e30a665ab05c17aafde4e088888815fa147563273da983c58260a30aa637938edebc266bec0363a8808c1f1bc4cbf091333840860f6c50e1acfb5049fd5e828d29f45ab33b966d728736a4a0099a27e5c9bdfe9675828d28984d379c54e9e1b96128141f1ae4444fd3627b425993ac3d6bb1caa4d609787a50d5cb5a13b09c1a93b8a16402399263ff63929666969094d56ee44dc5ecbf12de93263b49768a4ca924a8f13cfb6bdf75976604488f1b00f19146db404227dbb664ae9613a64c63880f37d838c2295afcbed27dfcd816f4b061844bd690922b9933c436c44611c8137f3f942c0ab14184cbf35a90088bea2967185eb68f9bc9dc16d909c39827770c93dbdc2925189db09fba97efff96a407358081fabd47ad9749cbf02f92a4df144bc54c48597d6198eb71ab98a46b4617d4e885f69ee4fc31695dd69316d4e04559ab2ba565dbadee152c4005357651d6937e97bc310f09a1862ece7c6671c3f3d5d572841ab9a0c2cf6fd0e93d4155bf01904d8119357091a0b395272a69fa7d6ff1af879cd85e36cd9790345c04b668bb4c2b496214a9f8d622b313b51dc9a0a1252ddaa0d53d7d31b7296516e54d325249de81d4908549bf9355e5be825824ac9694a0f1b623d6203560911ca524df30f29ec2fb0aadb4b35c9de6cda173c553d1c4d598b7d2d3d80a3c8de5f6e77e95a7d460459a9d2627e950275b3ae280168c2182069011c48c215b841aab48c39ee0f94acaf77d06a9a18a3533f75d2e8b75932415fd9db831a58def29d0410d54bc77b2af65926e13c453241a67bf7ed23fde262bf951c31449a2cb68f6923e6fdcd1a8510ab47b93187347cb5237298a3d1f3f7f4e4aea8eb951e821a22c4f6a99b05014c725a95c8284e6b7170a6c456534774ffba71cd40045169d9345edbe5a5972707cc48c1a9f48ee36ddd447744a45442a30a4071c38a386279c0a5df92f47b9b3be13c426f94a39c5d0b4d9327c08087cd4e0046f72cbc7bfe6c9576b6ca2ee5496b6c36a0a9ee26d4609b88626d49273dcaca8ddedf94c9c83fe5c981113997dc8141e192d257e8984eb90fdf2b378b52d51a4a76bf495f218b512c89594503964b66e901274d09793d7f4f5fc26c1986872148b9be9fb22094349b1628ef1d62ed50c6a4462d7178d93ff21915c266b4597ff083d6a6a8dcd991d4f3b22c9bc20fd390999e44650c13f68b2ca32c23462517d37b708d3d398050b8fcaf904063514a14965c8dc92f2dd1aa89188a692fe46ffbc632993a006222ebd1daf58db64a29e037721350ea107bff9e417a5eaafa96188f2e56a3a57f8cb9c1a8560df6d93850ba3a9f28888485f0d42a43b15bb3445cb9f1b841d611e36532a88929b5b927e2b66f6ae462036b90ce97a4ddf39019149bbb3259eb38423438054a0c61fcabbbfff99fde43a0de6400d3f90a19e2bc96ae6e87ad7e8430d3ed8b6732549c2f55b34a880031a20833d90a0861e4a50230f35f0405eec0d72a9a72eee2363b4a1c61db2fa12243f856698de0edcc534329d7fb12b5b8732ec9cc7e5c7844a35e890e598e28495c5b4d821c30335e650430ea6d9c9d8f9fa9b0992c1811a71405349e99ee127755f2322222ff01a7030f786342b6c2c4c64b43e23222235dce09a6419b55b2cc5eb8c8888f4a0428d36f029968fa6ca9bb21e4ea8c1864cfc2f294954fd74126aacc1880f6b52b699c4687a20a1861a9eb8b431675f6cebbb461af0dcbc143551fd8479053220e30335d060670baba9796deaa635d43803266bc5ecb27133142707dd6856828f07d150a30c98f0177396ce92ab3619148fcb0ddbe62788c906c95d29eaad98f44bf846e3e5325f0926dbdacd9b4546ed2498bd26b3d82749101b096faa57922461badf3dc2276fd8ea4ff77fb246c0dd3de6dce696f298a308fcfaa5579e8eda5e0e2218f9dd5e1e1bc699a2e3bfc685b1f46fa668b12d638c07a3d7a94ab557e195e2c0e04f63c5ee5c9775f25fdc25fac59532413ee4be48fe24c9f748de8b2ea778d5713fd79de605fba3b9ef76472fa777c1765c49f177be7a6b5db8275ced0559d918ea5cf03137b3751f2a51e3e211f9e0a9d75205ffdca2fd922d5ef4d8c2989dd36749fc74712d18379363d3c4a6244c0b2ffd42e77455d5ef2c2ccbb9e642d437aab2e0ccb25fc23f53aab160ed55c792b4adf184c5dfd1de4e8e1383f70a7a2e4e7e9fa0ad39573016c7dc3a6dd2eb5ad1a55b8a12b3cad058c145f17869939ce493b28a835e9c08dfecbfaa0215993a7f398f662a7ecf2d6ad2b57e2954d8295bd3bee5cc29758a3aee691e8f2945c714c88565dfd8fdb79252f039dcc7b9246d55428a448f16f36f2ae9349d51a479aa3d3746510b1d5120b7d1217350cffd87a27bf70a4d295e927350246969aa56ccddea4f54c2da9adc9ea22bec09c3b3c93946dd132adc892ec5a6877ed4bc97139b702163ac28317cbb09bd2fc67bb51c75a39ab0c4132c5ea88cf699f854633a39598eb363c29caa71b2c56c51cb4bb41544c24269894a969243ef64c961ac84b99e757e624a64fd7525e5d424cc3eea229f628e4a62af4bf3e99836dc84239149c17f74d234830f892393787134d474ff883de6ebd4704dd7b423ee6c1dbd6a6d84a9911abf938ce052cdcac78de40617916872d68a676bf93f452059e2a6662511dcdaf69524574c2e2250f3e89672c91ee2bd2ac13fd334c4f9426bc69ce525475b884bf21ca2928f999c27845b3badb9ddfe161f84ad6d714eaa4e39d782a8e36298f63ebff604a290dfe125c7aaf21810a574ad9a3475638eff704c9b9ca419b3f7eb87b5648f498a39c4bedb07eaf256b0900f6c6c0f573aeff1eee18a694623a57d93aa072b55ae52a8574ae6a18a368bd69496c1c44371d6c498a249d6ce1d92b7de242fef500fed909849be92437d79c9d5e1ccbc8feca8ad351d566993c3ced23968d9ab2cd689ca814c9389941f0b71671c74cf71aaab4463d909077a5d2d59ac94d3a6f30d56a8a02fd3d249e2744396aa4ebab0e17358b30d27f14471cb247b9292c9063d4cd4f789199b31d760ce141ae5996983986a307732a9fe2c37a6976950e24bd4749b348a976848fc12b4bf63444a976738cb9e94945f123d936628ef6a7e2837293626cb90d96554cd5a9b579264a0c2ba2a8b74a793720c499982c4dd6f8ad9a318e8e9e85025c9ad1dc7309c5ed324e17430186f54e4c593706a7fe1dca0d7bdf9e3f4ec053645468deffb0f7217883d31c5ca612d9972c188faec9723363bb905b4c6827b7f968d530b7812b2eff64dd20f66a1309fa4a496c44e2662a1726dbf351b0d19c42bf0f2d1e216c2ce3eb44217f3a6c2a6da7d0b562121e2d553553229584885e4b624315dfe6ffca750454b76f164e9cf7129d0594f36233ae7b0a390681f2b5fa566933a50e833d786ff589b2e3fe170d533d9d6ebd93ac1d9a8249b5d3c2dd9262487dbe7a5f18ae9640221aa1f359e9c38e7120a8b535e52a984e4cf95297f44f48f4948ba768fb20d26640e09c96a6e55314cd5538e70b84bd1e5265700232475e5cae7f1d9355d018a80a57eb87b92cbb2740520c229c5cbd9b9cb848d0f430b7da286ed73f55b186cccce92ad35754c07c398729b49ddafd732304c72b2f230da2f2aa13d85f76495a1335f74bd621bf3376d89592fcc1d473ef73ac6b1182f2a4d316f5f925d38de17f34ea5e40e992e4ad927976c2ec8f8f54fd6c9d723c3059f25173c836f647f8b4d1246237cb785293a3d93eab5a863dd06cfef1abd695185b018dbb36e793d0b5dfc663dbf7eda5716cc58e4ac9c7c9ad158609260b14db27c929eb0488e7935a65ad6bae42b32492e99ac27d574d015edc6457d27f92ec5562c277d274bf395b26758e1a476989b4b7f5131abf0b42d49f2ab42bd2c67327d3f6a9954bc9ea2eec947dac651f1891daa4eae8c95e49ca2fa3c9d25b3299cdeee514bb19ae690265a454d2b2912c36f36d14cd2d170147fd58b99789a9736515c99a1f555aaac6342c15d495a73679d390514cdee650d2f66b29f305c9e0bde6da2d49ea04a1039f1b07662aa139f6461e2d349e144f2b4c67d4d523661cd966afd49f95349d1c441d324a1bc5caf844a264cb39c35d1c2357f4c34bf5b2f7f5d96ff25b66462528f4e1defb74431bb363c6ab81dbd12dffb5f94a4a769e394403cfcc768e890b24e6229ab2ec9c48f9f5549e01773d094cf6aaa8cc4916a929999d59824244e59492df74dd9948f30ea98a6be4e294ed01146eb18aae782957a8d70bd73ee38f929d7c608a38d4f95a82d82f51377a53693909a22fcaa8dfececc1a2d11ea66d9dd4eb144328508aed27def9b8d76a50ea1bb45a67d1ddd6c528628e7282d53a90ab17c486fb3b698a43c21cc27d5265e7e4ab30f0237cb3d65d9b9ab0bc2f49a84cbb80391f6781a4f3f19bd0544b2f53969c92597dcfe01f528172b19ea34f4031db52bf5e3632cec03d1a9abf25973458f0f0965de55d924af90ed0199eb4e9115153a7a287a66bcf0f2e09d9498fd3dbc62785853d6bd6839354be60e84d6891f7395d801afe9e8ca27491dd031d9af3f8fc70b2574f833cffe8450ef8b9239185232457eac6fd0e54057ccd11cbdfff089839e44c67308cd493b70b8d3479ee68cb631e70d8931ca0497edd7d4710397d9a4ca5d1b32c1f4a3a5389b67c369329a98b2f484c56b487384ebcca549a706b3e96f46cd8c4948d390a49a5cd365aecc8806d32b36472d4de7cc19dc8aa3a525764ac13283e14b533b83a879ca6089529351f6152fd18888c80e4444840c01b23e826c0b900064587f73ee8bce374d71c4c78f1ffb407c308000637835d3cfe64e6f51420288a151ed0a96d6790101c270c64ca21e5a05c3b73f1171a9570101be6069b49c2d4b31b3f65e58d389495fdde450d5a680005d38cf598af49df5549a216890800baf97a8e1a41cb302026cc177bf8d8c9e4b72d819d8800908a005b235dfc99149f3a6360b9e60498a16328a85c37512f35aeaef92730565e6e344f9982b7c9410c00a558a9b3c88647aae9c2a9cef21af927f05ddcb488f1df2c3fb0104a002adb136d8d9f88d7b231b20c0144a424707b724490029b8399bb871e77b62bf512889bd39b387160a577d8a6f3b8fe5957c42490aa3275e5cae246f4e306cebe7e41f6297524d6893d0adb12439cde9c484d2977ce3937bea1d0e11b28084004b208012d4fc5131d47f67354c92e0f7c63efb2c1102019040c97e994c850970844b58910bdd647a9a03060218c1e4ed55f51b5dbbc42f10a00807999c71932f4979735c200011d674639e842953f10d17700c23693e6e87bad3140d0b43c90e7631c4fc7fadc138693c736fcfdb1a1f0e605451edc48b39ff8b93f0c933b352b6a4f51117e0f0059b2b55dfc5a4f9a4bb17444929680a7626258be1e0852972a231435d2e2967174d9bf6eef77ac888a6804317c52f8b3967d9bcb96a2e6ef9285fd9252d26491cb848b8ff1493d5ae7229b7c04b2a58a7f1d2a4390e5b5831c59834bc098e5a5cfeb12749dbf9a24a5ab452f9e46b4d62236a1470cc222989e35b31ce50c0218b3b3dbca8563c167de7f49e3a7b0320437aa41164c80870c0c2bfd8977c5f7b459b6392bc4924bc56c2e10aa5e3e5d6f464af1eca028e569cd7b3e7f01763a695acd833caf685a8e5d867051cab404af6389b83d788ea3854611cb58ecaad49451fea69a44232010e549419b57b9e92a720bf2e85369fd6fe9a80c31489e5690e9d73a4e7588a63a5181b227b41a30a0026e0204549325464c89c3d7f8ec2dd9cf9d67af1c31ac0210a4b574ad6bc235be587c24b957cb5e52f26491db1000e501835ab3fa5a83997a99fe842c718acc63de4898db890207b868848057078c2f34a4d5268184727b20b934934b7e0e0442571b27678a7ee938263139a6d4ab28a8a9a38f7be46a7a4ce80231367fe9c96efee1722830007261233cd379749bb9cc48c212d20238d2043807000c725684db93a0593c5ddfd36a38c4403005ac06189463bdbc71cdd93c7201a382a91f8c9096bd29d7b724fc04109b2339f7aa89cf84e018011704c22ddb3d891cc52a26a4270480247241af150a739c9887f6aa4471a1b648c317a0c32d880031266f02ef994a32e4c362222d26308103f41fc0422221bc0f188b24fe79b3cb59c4a1c610110138888f8b8010e47285a6652f6bc25d47f86a31164c66476c25d81322a800132c868328eb7e0c78f2d4305222264f00007236acf39864f65bbaeee8888480534408690068206193fc0b108c64c67e387e68d6951441aedbd528a932be04804d6b93e447426de9434a959e35854c07188522fe9444f0917c51cf1c103128ca181315640860a7018228d988bd4ac9ebbe2380a91c7ebac5f413322a2021c84b02fcd93d6fcc5586de4043806f155b2b89292183d7fec0d380187204a699218a3f44c6c76c750c1182510028e402459189fc8ccb97f7d4068a2c92197ae7c56ed3f24e47dc4d77eccfbab1f3ccf1a67b3957c3d011c7d30eba4df64923464c87cb857bb2db7fee6cf0be24078d0011c7b702e43db47355be5bc1ecabef963738b7a3e3b0f6f8a3997f7ccd5e885073d84a58a7c7ad99d8c88886c00c71d9eeb14377192b7cdc9480370d8c1a89d525d2a51b684f40c1c75e8a4ad9ca35bf420f706a183ddd12123cf63b435cdc03187379b6ef6f06fa4070e39d4be963579edf5999ce1830734c01107c62ef4c95c98a4e18103f11ee08083a14379cc2906f72c1a38dec0a698d4f11782c30d7884a590d1ed4bdeb481bbe8b497356db52419111161831ed463123baf4170aca1945e8fb5931a52f9e015bc3c23222269780e7a9881230d496a9dd74dfedace19178206c5e39dbcf1cbbca62e03c719924da3a7fa246c77a87ee030c3db264b7a46d65f864db6fd922ecbe7fa840cd56c67934e54b3f31e11113103480f83630c96f8d92e9f621963d40638c4709ce899299d7fdf85418953efb524679a3f7380030ce5bef52aa974e529fa85f37ff6bcf681c30b678c1d2a5669e795942e3c1f4e38e96c673a261172031c5c48ce0c1d972effbb21215bb03fbf2b839f9ce3de8888c810213e7ef8101f233ce831c46fa0053a7889d27144937806471628fbccf339e4fad288055309219b1b4aae5069b8d451327d9638acb0d9c9260972327f1a1d1c55f8d583eeaa6c6b26958c15e0a082f9651e272babc4471c533065d6a6e3ea598e130e29983edd76c5dcdbd74c1938a2606a84c49dea49eb09e9b102324e100c88881c20692438a080e3093d70380147138ca9d4941e3cc7a41ef103c40438c0c104e7f2adad764b4a31e258025ba631fcb667060d560187128ecff155226767f3260a389250ae782bfa31353601aad8918a53f9e5cfb9bb538eb98f1da8a0a4647b26ff7f455f46769cc23c156c9345cfef30459bc72bd6867e4729d00a9ffd184ef4144a9eb083145612f91fcf6bc7280afa9a426f8912e6b228ce4fa2496a284e5d7d9a334b4686bc0314477494b47eae6e0dedf8049ee55acbbfd5d2e6a5788292a431293a48e8aab5a313c9ab8713afa56e64e4849dae36f64fda44fe5e255b86edb730191111d9a1893acf65b2d09f4c70626a3ef12dc6264a30717650d51227652b9c2397307c59d4870f11e7f30e4b1cf7d9175ff5febe2f20eca80427c99e7179e311119121427cc88e20c80e4a183b95182d16b7c08e49bc394b9669451245b4796b8efdad5424707df3fbd4e1b352dca3083b2051cc2599a83fcd8eda23ba0f336f6229471ccdf6627df00cf9f70e7634223123e39c6498116a85e9d33c1a744c5e04274495f861afaebd55841ad543ed2ea967dc135146498693f4436c127221eb3f7620224b9e524a854ae2fe07073b0ea1486b9cf073bae6b1218893e63d26f1356f922e44b2bf7d5f8eaaf93335d2c3c7eec04790337af470c00e4224c5e5a8ba714db070f9f1b7631007b91265ac52f2527dc4ec10c451552addf5c86709fde0bd8119234880904d40ee084461337c73bc93911bdcc08c119c61460944446e60c68f09ec004495848b1abf5fc36a6a64c71ffc1017e23fa7b689b7c30fe6b3ead40f51c88e9c8077f4c137cf25cf6ece3c9bb3830fe63fbbef68d3712bbe87a3786659ab97f89edda107328ded949e6416cc1b1111f98146193fd0208188888888101fbc230f6ced868a721f173b8e07d3b8f7c587bcb994bcc3eaa7653a15a37d7d3bec600e33e7299e78fb19dd5187fa747e234e1c13434f63071d1276d63dd98b77923d40d83107eca2af06c96c053be490e5e452d36b9763523dd811074eb04ee12479c383ff1980c3d173df9628e38888889037ec9a59da2cac3c7655868f1f2ad8e186342ed76b4d8a21d26a83796256eca56dbf9fb0a1e0e91f4b084d155e5a43ebe63994665e8c49123598b1266474b298a42447831d6928b7c3c512acc025682c60071a6ecb4ea25645b75dce19ac9a0fcde31fa24dd20c5525317c6a0dba9ac61d6520b5435f55f8d693090044d841865c34f796c7c534730661c718d6ce97dfc3b5f8598e90fda10121ec10c32a57d525ad468fd4d3d813ec080327e7baac26d77a98ef08f151c60e30d47999a4bcb34b6dd9f185452fd3899ac79e8a777881df2c7a174f8e793a1464d1f0c08ffdb1a30b26dfbd249ddd4444dfc105a724ab986c136232dbb18553c24fb652ca1ed3dea1852b496e8ee5370b8d64a7f9c80b6e42c90e2c582e63314487765c818e5a1ed766bc65c21d56703a5ff95712bbc5bf1d5530e8a6778ecba1b4a467b0830ade7b95773c8f16e514540d255f925bc35fc5a5f0c97325b29f49ba7247149c9efb8a1dccdeda6407144c25dd754a7b69d37a4e06901d4fb03f37c7d64fbea8317e461a2b40638713f8bff5143aa927f033d258c18e26983c7fb353bafd159d0a3b98b05ebc5678e6e61c63762ca1b039fd6a73b6a7cf0862c609d208b24309f78efc8fc5a49b2d33490b2cb023095e92ab3589b213bae90e246ca26a93494f3cbebce308c91b3b255b97ec30421276f92d5a9d101a32c90ea6b0a3085efb64fae99b68f60b7610011f4b8266c89aa99c0f83578b9339797408a3badeb8df74ff126fff701f1d50828e607c9727fc4287accddd82348600c0093a80f14d6fb81fcdfca2dbecd6c12d6cc6a9c3179918767e37c59839e6ac40472f12b263ca5af92a4af93a7871924e969593261dbbf8a4532a0bd1396bc2051dbae0b6a45cab984c1ae96041472eba3c9fef3f59b15127830e5c24f961cdaab279d6948e5b346d266f0e51d19f3d5be0f99f242ba3f8c9a18e5a9851d4ba4c6c57970a2deaf8be92624575cc22414c0c55f335ebfcea9045e2e9dba7644933a555472c484bc12c5ea96f8a1916b76fca26a76d928dfc0a6fac2da746c615c7f8a87ae9ad3d96542bdeb8bc7ab63a2bd60d9aa3fb6f4cc9f62ad6e95896dc3c445f5a15e52561c2f5924ad0910aaf92a45a62ecf98e411da8309e5b7776e8a1a0e314ecb9271353123ee3673a4c717c1fc9bb93925c9623e828857134d8da787c056f49b1e88bf6656747a1b9c7641b962576a78842ff12567efa436c7d3a4291dc79a7c2540e8a244fd7a92bc89a57a6e3137c7adbab24dfde5baec313c750f9c35a4ed56fb23a3a516f36413bffa6480f278a7937c97cae1ccffb4d3493a2e9428575edec8888480f1191116020032618810752a043134a9514c49318f37fa6474c4726ae123b66b7d9b4c73a30a1e312a624a8a574b3c15f333a2c816f49d2e7b5c89b70a2a31294f06fbb53b72b633c131d9330c9c9bef3e5a54b13d32109a74bf2528dad8e48782725d9f237e76db971a003126be670d164b99b8c29113a1e81e5556f86fd205bee107438c213344c920d3d6791af8f6c0f336ed003083a1a614ebae895c7f41f041d8cb84a432539e96b4962f6e858843973260ba2194a9a5a11cb74a49b48bb021d8928af99584936afa89532b28013e84004fa3f166161a36b8cea38842796498c27252925d1dd800e43903737996f357cdd2f44f256e2a5ac91bb9527c41e4d4c4ad3ddebbe07f1a9e6cad01b41fc627db28e895b9d74206a8d12b44f364ffc181088db27b92dd426f6fd8395c4774f3935ffa6d10fc7cc2c553d6124e5eb431ad115aa64fdfca9e103a5964d9227eadf3c7be87334fdfecbc192ab07ac3c6eb214aff4340f5e7fee079337ce8778b0b35b422efc2e6de50ed68692aaf2adfa63ca0ed6c698f12a9a7013d6a1f0df697ab3e7f44ae840abc7d84afa75f1994339192b9aa19f7f241d7230e63c512565c5eceb75c4819cc91c4af389a9579e40071cf27bd9122a5e9a556f444444c71be88ee94a7be6110ce87003e39599fc2e8ec7bd75b4414d82acd49767a402630042071b2eeb923cfa3b7649a98e351883764e5973f0e85c51839ac433f396cea8b774a421dfaca29e4c9474a0414dde96abbffec27b1d677864e64edaa0ae1fcca3c30c97aedfc5f792ec245b47194eb77a72ee6e62c2a7830cdac929af630c6619b10b49af942dd1218636c9f5f3b69a3f7cad230c697091ab8cd19a8beb0043429f601b4b4c270693747cc10d376533e5eaf04262ae98637fcf021d5dc035dd86cdc77ba9ac830bc4a7d8e8152fa7ceead84226fce76d4f256dffae05cb9218772126875d5247160c173475c7977460a16cc25485fdee0a73e9b84239dd1d2a8966f244a4c30a6592da53b6ce967fb33aaaf064091d6a995e6c261d5438a653cbde72720acbcbd03185ae37bb5cba24558e94031d5228d2efc4dcf1672ffe3cd01185c4ba0c61af172894a4dff14f926d9a489fb0955882772ad9528ada0945995729f1ef928e3c2222f2e3878f1cfc40471316eb8da2a75a67313f4407134849fbe05942eb5552c81270d1d5e029cd3f99b8124a4f4b7eb2e55f37b12494a65d6d6fde49a32544071292a4d87789f88f1ea3e30888862eb12f53bef82a880e23ecf7a1ce82ee49f5c98888880f1d4530860f6e2932bd695b3a88b04bdfc9a55299de9b32720c83aecfef9b4ad21d9784d126ff107e2974889f2318596de557787eca2ede2007308cb8147b71454a437e835fb8d12f49c1d71de91cbec883af45e93157f97b44444488192322229ea317677bd5e5947d54531d1111d11cbc48bc94734f2c29e94a9d63175ac7f0b88c6d6d63e9e209b14e27a78fe9d7930b652aed55b0984c4e212ede8d66a767a99f53ddc275b59192fd2fe5b485dad91a35739fa3169ec5247f96202dcead4839c1636a27db083966714a9f5b952f4a3cf932841cb2482cc624f335fbe4cc118b4fb3d62dba49924f9d0316b4f6bcb96be802395e91893e279ac9ad2f33e77045a13177ad40c7c463ad7b3e39fc20c8c10a4a5adf10f15352a5ae8212c5c43d9ffc2a19a38a4d12d27be2c7d37bb602395251cd45934bf20915e77b96247b2c4f51facdf856398d78ce8c888898338525bf7b6e1a493b61721ff810c2023382780c80985102119112e42885292bbb9bf4492a0729febca1e2e3cbf295f828ccf429e9c43c9b47ad203e7282acab20c8101588888882137c33e69366fcf259460f20fee30c334e289c0f9d82d5dd897be7057280c2b38dccd12da6d8b15220c72758718f1a3a59a624d79e482daee6f075a1237b03710be4e8845b413fa7cc539b044d8f0de4e0c449d75366db9996fc01e23f7a6020c726d01c34a73359d4494a46e5d0847a97297c8ea9aacb44f6f596bf6251e55223986846ef55ac2fcf461bd920371011d921db3d2ef15d0a259ea2c7ae243c440819490e4b74a93bbf5bb1fa6db34a184ff8ffb9ec12eb6b4309d635ac9dc9272ef62993285dd4b3b390cc5e26e53fce40634806724882dbafbe8d0abfa39690489463b23c39b7632b854644444a8f1e374083bd2191989c4e34f1a4d4f9a48c88888c91e311a4ef989882054f6af21ac8e108cdaf4c30b184aa10ef888888101191202547234a3929ba329a26a16184a697c418c9b039d98f888804d99133811c8bb0dc3a8652d97c5a760e4590daf91d69192ec53b92885e5b3aa754ccdd2b4b200722eaf8d2b16b32a5f48f0d7203df334444ca086246072cc72114f5ca154fb212347a0c29e31f90c310658fe525cbfe981feb610e8d4260627759efaca38578040484287977e8e5ca2e9e1d042b1f2c2be5e819fdba8f17115181480e41f4269fa9fd9f94298e3d828c9c320281e9a53ff1cceb3d8188889020ae821c80f834fe058b72396383f000081a7ff04365d199cfdb1d06c8d8400e3f24c8979fe05973dc2873f4a19ecee4a369a4fbda11ccc18763ac4d8efdd375a5eee1b0ecf999e47ea9f4107239f4b08d5ca893cf548b4a8e3c24586bc8d2d047f0405d58868e1e7521a711111107e4b803bfb1d16d2bbe5ed2ecb0069ded9c27b425c2327c88889481069012e4a8836b31bf92e7e78c499c0e8b84497fae95a4b129c71cc80d76c936a597ab8f0f207b02325290430e97a8d3275e6e994c1a08e48883ba26516a724acdce11c801874c3bd879daf6933bfe811c6f50b2436d96e95f6634871b8e7917333f3f2222d26900c18088481a4036c9d186345cf6b9ace570fa8f88882820071b72ac214146a3bc05fbdeb4070d0211112121c8a186e583542c2971472f1f0912c487f8d0808848bb8f33cc58801939d2505a0e35911335367472a061bb7aab9bed98c7cc111191213e7200c44790112114c871865a343bc247400e3350fb12b6bec173f6b10c658d397ca790c1fde80e62ea3976e58ce1897fcf12cf505bb5c921063ee57787eafc2729382222d26684812c79935829d5f78649b71960284a6cf56aca173e6596e30b8ec409ab613188a6c9487b901d2939bc50ba0b675259e7da98638e2ed0122706ed14fa376a3c30e3c78f1da91c5c6052fe3b78febca7d58c32cc0872c6e5d8822272a96fa23432460e2d24ca46c6ca49ce480f33864420471630e953ba4ceead90cc488fe363c80e1102811c58b8c46c95cad241e20c8888508e2b7ca2279857484bf2ab233f725861db8aca31bcaade25f7810f2120c85185d3964ba56e0b213a15f01837b4c48d12fd9e427bf294bce3f9c275a4903029d7f1d36492e5287c265e5ff265c8761f0a7ee797e4192e5694ff84aa3fa58cb1b4d682ef84523a295b749224dd926f02b5696fd67298a6926782eb06c86860c125098fb194573cf2276add892b0ae5763d5ec2ad48f81cbd2b6e9a5262567072c79c6bfa55acaf169bc7ab53bc558195e578613c6dbc3b157a4876af6ce8bb0f2a78d1cf797982a8784ec1068d37dd31056e9af93a255f5a4b615f1e4de164354b2d294c397c495311be9a1c855e11af3195bc665014f4a592a762688c790b85e7563946fd646d624081670dbebabb19af4fd866e14e9394f5c4baba1f6126db097ec5da92981e7ba1e584dabad9eaee23f64d24a5789ad42a4dacb2bdc124590b9dcf447e39f527fa98f8ba82965cd1cd4dbf44df3164deea24af7f2c410555cf2958fb578e5602197d0d4daf9745564a98135e52d0a895724e2791e017a3a5ae44fba692e82fa693928a46e24a929d2c7fe7fa8a42c2cf32f14c8c99842ad147f83ef5e1c47f97f338a20a3d999abfeae46c23ccd0e4164b8a995c658419e357916e75952e4235c1a4cae15404abed152f59d7e66022be2a3361b3467dd91071189b93deb5431c6ed96973e69fc50c71e7c88cfaef941c538824d9f267ca689fd79284482fe4b64d7e2e4fe520be4b7d1b63f9fb5a2988433e953cd1faa9aa0c8466fbe17372539c4902e21c3e68ee31c93f98d366bf37bf9459927e60bae634fe4d0c97b20f69f2558fb29e753b1fbedf94d9a45b62caf79065b7cfc1654e8a1d3d5cd26bce54e26bd59a07eeb2fab5e495fc493c6ca29b333e79872b4757fff62de4b403675739437950f7b00e4ac8269df5746e1d1d9cbd32134b32a9a46e0e7fca98a56de440a5a7abfc1716f638a0c19345644f6b07077f4a3de4058d49a8bc01cf5abb29c665dd4237341267e14dbe0d499b262d19678362c1841e13ad98d36bd0e4601bdfde6258590daa79869267a366d5342c6752673cf5d06054dab967a9674def0c5ea5cf9d2daac64e9e19b69824937c93338d796548d6aeae3585cb793c326c9298d377fdfda4f1c6b0a579eb4edb57064f0c5f94d49c2e5de87b1706b336beb5c40e0cb6858c998d26cd96fb022687b58995367ca69c173217dda84ead4b52d785634c552594d8d8858e0bffc7efb1f1d49ff62decbd91f96149f6752d58f91f4f34f49bf4b12c98339428f51f7368d8b0708573937d4f0c69d7ae4079bea0d5ffad256a56286f496b162bceee6655e8e35b7a2e95b56d4685533a3605d3648dbbd6fb9d149342e2faff4b4568899345a1fb6cd9f9d146ec8782bfc9f793a72beffc13dcb86b71729b727627681dc7cad64344f62658a2b55afc4657ec4c68d64d37df9878b15e823d155d39a9848493d279a479923b4dc2fba7f1d226399b1409a592e266ff23f0d5926e97327e491aa19857bdc3440314e1dc759a4e4d4a239a018870697cab482975b70c63d1dca02946364f4518262b0dd1f379192d138c273a098c37a673746adc9594f94579c3eae54f69e37b5f1465935495f65e24e6fafa6e31e94b9c179c5592c22f899999de051d5bc563dc253139baa0730ab59c63d39b9c8b3a5fa60bb5d1c45e71b16fc86c9dd65bbcd9e7e1e4bc3763da02b18f136b5d62895d2dfe3cd924c9b7428b5c67f6cd720c993665164cc99a233a7dca1e5364a1646b68682b13a55262815fcca13a961458786e72bcf5d77d969457bce157b34c867f0e1557509536e4a66492b07e2b4c8d9b934d86d0a4b382729199f2d82cab575189a1b934846613635524c60cbda1cd42c635157d12ce4db2767d5751617f96bc0d6a41da3cc535ad9da25d6da99942cf97d349e1196e2ea5e8375c8464fbee5648b189afc142c9e249aa519867ce3565a2604f7ecdf9336da524a1a0c7734d3ad13fa9041459a5da7d699674527dc2dc7a995258d633a1f244a255e994f79d30b45eeef07b3b31cf89cfec6d66f24df471ebf3a352f7a3897b362521349d09df3f07134a7ebedb4a294ae34b9463a6d37db7b7762d61d656c9345952092b6336a144f661e7c44e615127c924ca594476a3af9b9c249104a7977f669f1397248984a627a78fba25e5db21d16c8cb996ade6657f44efdbed39590ae5ba239cf3d47fe96ec45effc92c57491d1d466ce9f9c6826a4a1e2f628dc1565ddeaf265644aaa91a19c6e325d9449472936c559356ba2222d1625ad0704b6ba287d83aad3596a4214e9e312761d348e50b71dbbe8915c3f63f24c4eeaea93f4cf4dd83c8c37570ef685e5d09e2a8919f4c12cf4322122310a7493994d89d78d3a518803874e62426c14e2e0d1f0762fc414fdbd79f2c539a588ae10736ddcfbca849b12fd3074f334f4d92f7b7fc440c3efc1d1232ef62d11917630f4b5c8aabd271535c0c3dd8137e351b7b52fc744444240f7efd7fb547e578c8e0c1b34d492aad24794d0bb9432668c78fd9a44c4912b343a659deb165e6dba63abc9fad8227d9d2801874489239d9d399cdb0760e6e77fcb4efb14a799403268bc9d2d964132fc5e240bee6db7c3925fb8ee0408af4cfd4efe6fdca1b56fd9ebbcbe11f4edf80186e20b4c3f5c58eb4ff6c1b1cb17872da5131d850f694542d6e8719d780aba9ac988692fefc2168a801354d5aa6b9648fe2488f34e4a21e639f98194183186728cf44d69a9c36c39f73e99414334f30b11f6794018234322044c89e60054284ec196294814e713916e3971d928fff1680a0031de8c10331c8e0a6ec911bdfb6c4ee801863a84b9849dbac16c5f06f4a5ad9d35fdde7464444ce2a0ca65613ef120c659861c600c4f84203f1c1032068ec10c30ba7df144ca2f5e27a427e788f2066a0185d28daa52635474f675dc88a8888c1053aac27b953c8764962437ea021c453f0e3870f11888898e10307626c213929059f333b0dc96881f697ce3d99ac64cd1192053c346d77fa5db38fb170bed097c14d8ac8cc5e41b99d10afcab9db99056258e18f26e5ce5e0ae1d1a40a7f495bb84977425eae0231a8507cbf75ccf73ad91306624cc13449b24cee570ac490c232a5fdd1627fca981e1111398118515846df5755ba4ece1d28ec579e32e33a22225202319ed09875bfd749d125762322226238a1d4d4fc133d670f51204613ccb1927cf18f400c265c925d749e0d09f303622cc1bfb9d20c15cc80184a502c8ca52c212ec30362240139c9738c59f9e78018485853ca9353ca21dbc20704621ce113a3da450d161111213d80041181184648b44df9337cdb4ab2c8408c221ca6b77943e66c2e8d1844f053f894aa256584c730c8f8f797525f6118dc42ead80926491a0b065179b5b1dd041886477eb0bbd4f27a79fca20aed41336ecac317c65c8cf165a6299689011ebd78c7e62c577e4d9ed320133081444306c683175aa524adb5d7276a6717a524cf78d078c209939e71c6fe80872ef23c256ff618fa83bab9387d25b1ad3c279345c2457e3176aacc07518b6ed1ae896165b2859e62b9e5e1e7ab36ed3dfc0c338e900cf0a8c531bdbe4c0e9ae671fee0418b72dd2a6b667c44360b74939c4a8afcf550b70a1921e0218bbbdd733dd56d364c38e0118b53a61fad12b1589f61919ca9d1515392b63c7a45969d96824f4da9ee4078b882cc1d0be719d6d16239e0d18a523c337f933fc737c58315e6f28e2926b35771ce14dcf4acc243159e249d98354995e8faa722b9939f70a2a7c8bd242a4c5e21fadf9298a4db9cc224f88e9e9476989498e27082859d6f548ae7a7663c093d29ccd0dd78bd73795719859dda62c7b43029899b2166fc5041193c4471f4602b1f1e85c2f0d7efa1841293249880620d8b0c9bbff2893fdf8c8a274b72a7db1367718f9dafe37ebcc7a3135aa7ee18bd3f9ca0ed2fbd329ae7b4ca26fcd9cdac165b2d42d304b3dae993709d39c52e13fdc7ca26f978a8f41b266afbb4fed2cc147d018011785ce23051bb616942547421f0b004f69792e00e7cb4087854c29d532d694d793e2694307c92bf9417d929eb4924fa650cbdf2e9f38425918897a6984c427d4c8098e123043c2271cc270fae6d6249e220e001094355d589a97f84c9bc4bf0184f48dde88c2d63033c1c4199dc2b8f4698536145638c8ce03287c7cb175d4461b59afb3be8b4953c1491f4a94e924c4c51fae48c3486a4e0023c127127a14326a94b4a92c488603ebb94983a87e8f2105b4c1ac6e2a5d0e93f1e8630c793c3eace39222222e4878f2168248f4238eb415bee72ceee4d10337a0009e2438068800721be925a364f3a87f800e243c8b200081a3d4444caf032068165ce25761eef4ddabf6fc0cf486305cb431026ab6b13735da75c07c2123f2dd7939b185a407c7d2bd74976444464480f1cc809c818e2e3c7192a0832a4063cfe906478eb2531ed87c2a8b5658949bc8cb30ff97dba4de92b1e7c404b8e277517736e9cc71ebee89c24f55c0f9f5e30fd2a0f9f4294074b2fa538a0017840dc3cdd62adb6427b07f3b77bb4942ffac3c60e4b05ab4fa2e475602d06f38c954cb9ac15f0a0c37a1225d895fc6f26c4630e85bebc6163b4da53cf0f33cc6016f090c3d25e576979d6fc7f3248c0230eb9d8c6cee9bb63c5118d1f1ee48ce30187739c13337644e6b6e2f106fbbadd5de62e95a92343f60422222343f60c119134868c80871b3ef51c2a257dcfa3191e6de0b624d9bbcef16083e1962f9e244db24997352c5e51e4dcae15f050c3b777e267c5acd9a44f439329fe47955877b7a2e1cf6bd5e2fa194a52b7588a999afda219c8bc143d4965e1b796321cbffea253d222bbe14186def534d35553c85f3cc690a68f26b45954fddd27c0430c57679d504b7f62cc3f0c67faf794db3d621e18126de4a44a35fbccf0f8c210216804e9d1e3003cbc6049524a3132b95ede982e546247694d577181cb7632975797721e796ca1cc95e6299a46afc95a402f89a671e2a3fd9e0534c97fad498c4b1b331e5868a7cdd2cf25b13fe6063caea0688c9accf246e9ed38c0c30a5dd59688aa011e5528860a1aa357125d43d303ff4010e7811923283ca8603a41f6f35ca749a54ee114d6524733f915bbf4101181010f2924e6f6ff349782808c6e1df088c2b5edfd267da46e4cf380021963ae635e134f2c9b041e4f305eac9fb7f8f84d1525f07082a37f52fc143dcab4c7a3099e4baf6f7e0a0f269c3ec7bafc7f4977353c96b0c9f95387b09f8712e893756ecb3c4709f24882b3711ee6f340c21fe3e429fb1c1e4730c747264ef43dddc6c308949c2b6e7b4eafa97d1e4548d6d2382e61e17a331e4438fbcfcdddc79d4f9d61a4a55e6ed2091bdf83c2d8243a659750f22dee0846965534c6a514189497e469b2bd4699f42f4c2d7d337d65fa6a7e61872f988acaf79e241363da56d8d10beaa3c3583ced4b993ac20e5e24c555e4cdc6f88a294dd8b18b36d24ed3a8d57acaea829c91b314323c49c2c98e5cf895c7d385ceb9c1eb1db878b5e459eff01a35c95b3c7792eec62cefb0c53177fc7ca627b530c854b43ff9a4425d5a54727277188ff92e6b165e8598894d91451f4e775fac8cc52968c813472c37091958d09d62b00db193e48e9760c72b521f2f31597f446a78821dae48b213a3849dbcf60aef6885b92d97e5e4b0dc7ab28315a534e1937b27cf3ce22a8e9daf4ad2ffe6ef0c1a670001010e76048ec0a8e4aea2e1a1a1402410884461201018b23b2d0163130820384c248d0543b170a64ceb031400004c2c1e4c3c22242a16121c140e0783c17028140c8602814020140a8783a1706b1c6689de1a7b6fe0a978b81dddcec048ecede675b908cb654a248e814824d07e23252a4f03ba357858320eea88b4b85ba1522699f4820015c8d362ed265f305e3d800ec47d61514e34c3ce14878e6c63b12db962a47223049309bafc64baf382f05ace6311e8d8edb5c58b1cbf322e4f7ffa7dada483e759771f63e46a0bd328208bf9d1fade204967fb32c4c44bb8bba538a49ab465c8e22f49e3f79da15e33a644180e8de8e1280782fcaf73c299ba4174ab2a1fa7ddb09cb232696843d53b4a8c633aeae5a782c151bb5dc7141afda5cc2474fda3c738a6d120af87e4d2c4ccca6de73ae9a3a4e806e5b529194b9bab82a80155fa7ab38fd0974d403aee3267a98259a638cd4cc48931156e10b4c7a6bda7d4c1bf904d6741410272852aca823326277de7bfde3a9d5f73ae941358bd228e15799915482eaeec6aa6413b696d92dc36efca90d876b1b9255d29ee8d1bd6f24e5fef722742383bb407f35d7ce480823f1d93beb68045cb35c60577c5b63a075cf7e4f9d98bf214953499d0e75e7ea6c90ed73d060a90363e8a1067321ad19aecaf77727620b0ac8f25b9350668d6c9a191eb0470b9474a92ec9f52ee928c80fc4f24ff8ea7c4ef510e19c74f1c2171eebdb9b0d660d289acab0f0be4d2662998a47bf9abde14f538c72eb35a8f01caf7748cc202cef36159e366092600f1de60578dde181a38d25c8ec8daa19210b02c2a228418783e8f1561759278bca7813f67c78d8c18ffdef60b2c804e72c88aeab4907eb730286afa428d54f70ed075f1d11faf168538e5c58cf9f7233a233a30643cfe52ab53752b172e5b294e4e61d5b8a335053042c24db70dfe44915ef32e39fd42a984f1f74a3611ca00ff8535c16e0ed85c4d42805ca77fe944871558fcdcc8061e8675e385e4b3988669825a5b79142d727f3fd3a805003c95b4653d65502253d0a1cf50e953bba9213772b91d21eb62e3918f8f8d1db419302f7d1b895e0fa920ed9d3e1c85097a4fb1af330b74edba7637d9fb07f2ae060bf7de1185ccfd74c86199559af259944ca7942be49b588d992d5b2c3cea6e814f5523a6ab341ffd4756213262cf16fb4473acaebe3b76a1ae79e2224bc2a5f15f9f686eccb0b752db89200d05cf778906e9b814ff59dbde0d7724d6389a4d27bf53e582390b370e132ab556f5bcce5024f5f832513513b5da046b1f08503b9707769e8283ae38bfce18b549f53a6d445b33c9fd549d57b3486e0c6f9104a353502a9d2b438268dc9fe8945ba83980ce9ef7213ee6af616a571cfcc9955cce5ca7688c319dd4f1495992ef85a3f8bb627a403185c75c9571e6c03f269288727244547980785fad0f71bfd4a9b93aad62467ca10b5d21f790e2166991120fda368b5770f7bbbda3e6b6964441b55fd13919a3397f75888046b4fb0012c2c0c6bf0bb7c1c1f66957c9821a39ce8fb65f9f73d66289015e504262ae7ab8b292a91cb235330e74bf0b5f2450f605452e98193cf8fc5da1e8b78bca8f0ebdba6855d3992a7a730a4fb53ed79de43e54d873121f9d3ce006af5fa342483939eff99e091a0b4121056bd802f181f0006783a3ee5c281f719588cae6eb74509d7e92755cbcc7c9f663c5133a973dbbd1c4ba07b63a2cae4268db872f4f31e29978a20a070b279602982967292f5b6c0f1534af484ff20fff25c0570b7f1809487a3928db2a8f923ac343b6be0dc15bd74019a01e345e23678d02f789b919c85dd4c0c30e192292d1db6b103abc5415bb3c17129d84b49dfdaf453381a1b371b1747bcdb29cfe392cf44ec77daca14349f05fad18840b00087d4aa146b3855fcb5feae4a7b1122e51c786730303f6355c49f6cc6710400b1b8e4ef7640060e85ba212e799580458848b1dd3e0243cfd78957c7def284be15c8aa4ef13a2a1e1b27ef6ac9fef5bc0f34d278572fa9e7981361fcaa23ef7c9f81623a4b1a9ae7d5d18f8ada59010cb80ce4d0dc316f8634bfcfbd6e58270e3be553f7b4432725eb4d1cae7398b1278a09f5bc62609a042c1f9e6d8e7a8bb11a491113c776f812415d936fc065798a6c1ee0e02f6c8f1802824b0be527eb4a8be29b02e31e2782fb8b7844715ae77e234346bfc54ff8c5eb8cf6e01392d38889c80f965b0f010e6601e1eec0be0cae0efccb3cf035be1dacf7ce84abc7508fd204055575ed6a423cd791dbe0fba1a44b8fb89bdf8c2a7340ed69d883a76efb965aae8af3c2f99ece431f1164f793748eaf5d785130f35ce1a07f0f6df539214c6070c3386df2a635b4dad23f800157316fed9754ff12050fdabf165109bbdc459c18e1260a170682691b92924debb745af349ee22f5d68581144ce1958e3b4b79aeeecbbb94a23dae535d63191a2fd6954c57fe8e903a9a5d3deced0b6b2b7cb94a644cf974fff68eed5b620c6f2d80de6b5eea9dae2328522b6cba850d4d106cd2c0f2abbe6077a69fef98fee447a7e43cde5afcd3ce9f9587063d0a8af9515e7b43a50ddf1c09a8a1a3d6a5d8f466ee663f55b2aad1389dcefd2699c9689eab70d2e270c994fb768df1e377c1fbf2e9da45fccef7382e08a4bc2b604f9fe22f586a910a9693eb789377e4ef5071f3d8e1d4e22763af6b16ddcfa5d43935c3ff3374ffa05d9ac610390344c1e00f5b534aa08c62836c7a74c493ccf08b867c3731c7dba0c4c4e4a2c712df443b2f00e13cd0bf491b79e97e12dddd33abaa7aac536703d33635f04752ab35c3286ec8aeb9277936b159dd35d584335d073f83a92656595af7d7ee1a1a2e551857d637b7ea3a5af2458a8eb97adf577c95d43aa57db659d06a4996fad187e779c5f1d388ad922946fcfac86c96150305dd9458014e00116efc10de669eb44232b3b71bc6c9e8d0db160ec2495a2331acbd71f14bbc7cb556a7e4e1667e04398375ce325d011d76780b8300dfd8f310188651da85c0deb8dcf53371ad72d114610181a6f969d7a5dad8681369d59cb0a7564e5ddef1b2c9746a23fff6f84a498db2ca19fbcb3799fe46465ca54245f46db86bf87ea038c249cc39cf30681199d9b2ef53e74b581a098b712c59b46e35e80b4b58823e777c2b47a5a74c2d9a94c865d2655c9a548dcf4113a3dc567b21b802ffe2c27d43cae34b171653d579fb1581dbc6730ea6f302819e259f3a93bcd93a6f0ab8db763dc468d3d64b9a5fcb7486f6cadc25a6269d6a6c247c0bdb90e70b744edc6200249553418197c331ee2e784a5a0d57be4cae5c30f38bec3b7b0a4a697cd90d347dfee1a2ce5216aae72e1761be0d0d29d48f5abf9757a0ca9d047dc7002dbf1f220e01cc07c8e1531a80877d778d7c5ef1a6134a4133071190a8bb0e95340afe0407b15446515649dd2cc59b6fdbfc2e30d0d865c48d82c05af8bdedea5df818541750dc26221a76ad28ce1e16797e2fd5f92bea49095fa98121dff2bd68fc8676ec82a9a6fb5fbffd4da7da1fa29213631bfb429779722bfbdc0b2a5932347242e2eb9de18f9bb1196856364a8ca9d33a658819d9273acc31d22ebd5bcf84a6863d70065c27dc1b9414dd83f0e881ab3fa6a40c34828c058fbaf6f49417eb14ae932efe5f323b9971fd570145e158cba2f67df981e71eef0f19d42929d7242829acd8af0b402d157d9479acfa7f552a0a3d7e05f4ba8eb8feb9e56c5b6d6a7e1f584dab117a88f9215af290e1c4b28a3cc9f2f966020db8ace5935bd74158cf21c01816f5d86b758fc1e874c511348f26949afa03e836edfeece028ff1bf9d9c24bbc7a2950a4a3a730e8e7b6ad70c58a74628f169edd79fc8e14880ac7760a96b8775cf63ae6691b9935a2173e8c94dd5395413e9126b36af4a50bed5226ece42562b8017701d061d8f7391c92d146f45bcbd1ee2140fe5f1e8d50afeb64894f61ec41ecbb3b7234e78ac37c8f842be8c62fa2619cc1e9f60f28d847234a14ba3c5ff5bc7eb6dabb75eeed04032eaad91273f9666e68ebd8e097995c80a242bdb39199e794a170bda3de15949c62f3b8fb8e19a775b9f2ef00dc4a379caff9411f20502ee6f627ab906712fa68bc291596d2aa2f7a21b16b0eb345a2787861c39d01943b7e36e6f797e9407e27234eab73d97795c8e009f826015ae87c2342b5f46f00e50f3175b97f9986bcc5a8b33a078f8726cb4e4b813680d60c5b4c32a8494f0a666ea9ed6fba141c07b128f6360ae92b428432af2a45acdd1b8a238ce8747a25462d5867fbaceea2b279148d703e579c92bd147aacd401fd0fea85701ea07cc5592cee26f38e5f55fad8d9893aec529370bfa3d4ee7b4647231d083ac304c9afe89300c03b0046374966ba7b5a9f5fc5ed36c1092cefb1c3c5a5c359205bf5ee81f12382f3529d4125fcea3d747ab7313e7f27b8c90a7087cca56075aed158692516d2df800a2d017b69e45673a3de05f17b66047058fa7c48de5ca06d43f01492b55b4170c763d15c564d20652bc639d0c244eb7b180d1038b3f578e7ac6582ccff49924f8c55fd6612428afedc6f7496b0bbf51bbd9b757e60a26af64b7905b9f40ec5fc2ded64096b6ec7d8c9a38f27569522e005adff90591a2793d41bae2da328c759ae0fd7df413c8c922ac984725542c6ca5d4f6e33a747c284c51f1e4a22dca14450eb310e44683342c1942e777d921e248168ba4bea789764bebe880362d96498bdf90e86c4e50be01be993b02de761627594aea9a2002afcb443b2e18bb7f9bb5e4caa2740da9c1cc0ec34ccda900bea918a15d42302a4916e80d99095005856a5545b94a68305e89d4c051e507bf54aaa7d00b5feca659f07e276991a57119f261a8ea632cc3191831bacb3e3082c3ddcde2fe02034cc5055747aca9918545f479668401329e03ff7a643c0c3284cfc927e698a3176e1ca487964e2019a45126aa6bca7690378f5d027ca2933225718861d6718a870a010a0d098aba72e5008a0a117743cefd89859b0e004604111a4eb393eed0f89b26108040f874b2932e7b37fbca0da04f6d3c2d99729c89afbd08944fae544a43f40d4375563185a615b145250ab92f58c78371d8204bafd279958c41b1dc5d48d68a698375a245555ae165c4b2744e9d303da539ed1f171ec18e79252caf65e5187922169510bacf12dfe8f66cce45c5db70992d5c55aff32765b0eea215c3f0e9e582511d62aa12ee2f155e5977561bc442d833b2b82fd7c3ec5ec1e18fcd3483840710a541f8e48314d82363c74cbedc2061f73095d0b540c0bd39e96a449b6e196ad2985962ef339010a28aa683f88b312632cd5963de66a4b1dafecb682dcc015851d6f4fb996c5a5bc9b1f6d45caf3f2758ebaf12d2ef48ed9b1237ec239eec2606ef173e6e7720b017b66aa98268483392b0a9cd477ca766794fed1e24d7e3f341c3746f0b138975694145a4e63944d472394f98a716b55955118c3b8592a195cf0e46fb5297a556b4b4c74a2036032d882954790abc611f3a7626257e9f1272a7e935b8130b6ea1b80b632ff209181bd47442786273ad340a76826e2594f78a6f3408e888032697d700dedce92f9d4472fc1769b4acfd966f53044dcbc67253b3820c862cae8e1155e4f99bba7d075b49836b1f0ba55039a06c6df5c6e58b8800326c34cb6ccc0df1fd89b8513a461b0217d016ab9bd49c98383ec03fbdae31112f0ed1e79253a1876cde5f4c2c7efcaaa1aeb8e7606411504b3db0a917ea960998fe2bf517552ad4a1544d596ae68b66c570b471fa6c0ed91c2de394bfe185d991303ec96e9b593a4b0da8443164131f60c0cc2e813d81188e1c417362b6906a775a5d5caf6237ae37d9b9af1eb60a43395a41152ea413bca48f563e12f213110c527c780d3f27890aced8a041425fc262e1c1f87cdf508ab7105d685e3afbcb8637a9b6bf2fc1306ccde571f801f8014bcab18567fe5e997289f42d3bc69fa9541a1c8e8ace9c7838dfa52437b4d868d0421af42bb3406d8704231eb8642e62e9c2c60763de67481298320be94ea886300b4bdc4be40120978e975fe4ba993ffb12931efe4166f0f14ada90610068f944b8e784810bbe56b624821244f644587168791f678b91039ce9383ca44fe4b5386511afa314096d6cbd8ff8ca6331f83df37995234f87288d404111cb5f02bf1b2a18014062bfe8fe9afe957862e5a91d274e3300f8c6695519ff758fb6fc1268c7894489366ba5237cd3731ed8dd1a905f4d1e872ed5e156cb7951307f1b9adf802e168de331eb4a9573e850f675cf8824394e85ebfe36fe0869d5147cc70cdab0fcd4a0d571b2c2257f501430eddbacc01859524369870a6c6988e768b2ee1753cdc820fa713f2db36589a2e6694ebb3c87bdda1becaabb9f6556e1039ebd0b6d3e273faac7f897a983699f42cb47ea985d0ea115522526aea15f5b29bbbea6eff7fb06346ab6a8ac5a963072f50e143743b14e86fb7ffb5415240675a41ef60c0e47e6123715cefea64f50323048a01ac740e3ed11d73e2dc3f429d1456104912a10013926925f34efce6beb59f91969cc65597bcae998a93d733dfbcf9dd9e1ef2da2530038adebbdf08e70b26b5e6fa707c73b4e627a9c9362aba8328db6ae600ac88d7aedf57dd2b1873c1d47e753f1d5ed803d728e799d93d36620a1fe2a1c83b147b31738e14c47e1a7b86a321cf09371e46b32d3ef1b78ebc962d8540781f2f5ddd46f6866aa4e4f6bb1890544decbeff607715142da32ea577d7441aae853902286bedea42071d2edec2ff72744261e2fb247663175fce0547e7ae89b404321aa95ad0e17121556715f8309aab344a0a5769a6c4eb12dbd2b10ca2d6141ff97c955a66e917b82a208b008d19f33cc7c53e3a404127d81ec30e1f5ed5ab58d43ee05aabbe0af6a6c7696369a70df37679cd010e820e2f14429c442412a0259451dad1d9864cf67c2449eda5c6321e59a3485dc52008f8fa8d9d21a3ea678c74fc962763c7536121f647dd07526ba6a1a542fcc62482a864a52d8fccf1e8378a9303869f12e4ee624e123a873367a2924505431ed5226aaa59b6aaf721a95a84456d85f7856f0e7996de210baa368d71a6e8fe9294489ca95d9da2e710b20cd053825999cc27d6dc93ae8c812b8e66ec40ab50beb09393d1abae4c8105da6658e47ed0c55d5ac41247115daed6baa2e143ba64b2baa1394cbca2286308b17a61e874f5747937565493e5dad227120dc02d2db260ca95a6a4208aff614175f1338e4d43e9d295696369d2933d3782700c38f9dd7437458913a07dadc9c42cda571e3a28fc715fa32729038bd6a57dbeae6ca931b61d4a68895a22edfdfd8faa8544d0747467d77b134ceb884631e32c348ec50b4d94cdc41742a67883441e9378474150d4c50248cb0c4b3923d376f4be1e7a3077179044152a8708e3a9b6e911e3ad2ec811e2ae3e6891e2ab7e106162fff4f78f9d2079d6564262fbe259cab3f9c3544a64f8c55bb26439c55baa44f1eef50dd4e9c148574961dc3d5e985f8eb4066801ddaca97883f7d7d63f2421d9d53502c3b2840b9c9dc4d02babb4f9e0c792da37c79edc6007622427019804c96d19cf04ca65f992068d8fd6644397bee24c439434b19724f415026f03594d921fa2d2b11cb9850eadd2042e50cb8e5a6f8e688ad194c7d17da47183b0f15174b9b695496439b696593479d66ebfb07bf3e4e1b42ee78e56cd662de20f3d0d393567a7751a02886a689c56a5dcd66466f5bc0f104335f154915922a20fb5d7f019a62c4da393a42a4bb1a1932edfd63e8bc46da0c7ff0e737b8024f39300f865b6b2608aec343a2ab9fb07d1ea30b2ccef4bdb9263a617712fc432cd73bf0655b0cc1b2c05bb51bf01fd26a625f36691147bcfa25d87611971150f4850c8fa7a6d910ba64c91d4d5f98665fb1e181ceeb287ae3671f598fc97c70bd6535aeb1be367e9b02bec73218daafdc92a601704a4f092dd8675739453f08d48ff2baf92047fe6a0e49fb87bf239d951f6e60cf8a99868f17852c76399cd2ce0a26e61aceac6349d2179d8ef99be5ed6b3ee16144fc57aca3b987deb8a195aa0af1d6a83aabbfeb61ae1290ebfa9279aad7ae31d98645468922be690661c4cb89288c8856e177c9f0eb0bdc8dd9e8272f1b236d0afc1ffca9fc1cc4933fd1cb65c419d41ddb9dac0e149280173a96703b4fb6a3a85f45beec642e9c5474a46df475c093332aaf3afe7e7803bc6f5b0ee638945132d2a34b2287bdb1ce5c0dae4c6bd82231d30c95438c534fe165eb2175d1317eb2bbcfc1691ae3998c650751029d8d3a139ae85aff5622dd023224a15844f0228acab7d7aacd27cd7260a1ae1a050bb1b1aa76f38e33b48a176e1cc3212c7892b9f524424ee5baf229359badcd429ba8bccdf52b55e148bea18454679ff7a32e8fd3ba293a640efddf12933435619f54b93eb053d18c5688fac60e832c38e6f37d9234cc4732bebc8aa810143beb331140a32e2aab27283f2b8bf683c593daee8fc1e01969d2ff6e45c7a1d8c73595ab6ab646c7a04c755237e350af98dffe987ca1661e14e383ced756e4f86ac4f6bd5a97130bbb1881ff7395f94fe90871870c6cf41a11cec2a91eaa51724ad4c304e7fa2b1f8cdb67385a761060f13015502002fa01f368504ba4ea5a189c4f498003b465a41d668fbb0f14f83146ab11f7d6e65000e14c96197450c455fdadb346c80aa16a0401b25e0c292ec427d97b48cc432101da8360d1be86d90c3919bbb4e7259fa24e024832cee5c8d4911a4ca0320ef08ce0f561128d15c166ed7610ed67b5b65177bf410360f01b73db8d84ac6ccc850c976dd65eacb21cccfb999c15f21751e626a7981a9c45e3982984622ba93c1dcffc51eebbdcaa46e2574e242798e18a1d1efb93e4b7e71d6a2107eb13bd42a30ded95329e777307f369687d8cc70a66ae872806f93696a7a000b3c71af5dd5368facf13696b9efaa6f352306d075d930f4aef0518a74d7ad3c00883c8660baf6b21df3caf6ea975ba66859a0d21008d7fc2a0770410b0632d682233078123d659cb3737a72e1f31dd410fde9518a0d96840e6cdf9e936d0852ad202b2b2beeef48a24b922e2ebc86b4acd5c58040718094b052510e349ece8df682768917c08244cd8e7619ec52af6d2f8383450197f6e359e72fe99269254e6c069fcbdd73749a5d291500cd68d4322d09d24c6b37c97526faf7f6f600d7477adf9a714fa40595a0ff65098737d40871df7dfbd838033a35f27a3ec4b203899d6ff1587e378c096450d2624f3e8fcfb3a4d8f16584b4619fb6141a3704df4692b3c9fbfaea9637103f7b63de88eb543587f5f20bf7da96d41be869b0e0bb3a1e9b01fe3224c539d535b8901e64f6603ec604533860be5d4877ef1c0283596fe0d1d0724bd6cec7dc758bf1dabf63fa01091bd63de82480b7f25d5deb6faa18e6a82088eb576dd3d601da434e60bf228e0915010fa648fc365e0e0aad948f8bef597b93b22d4e79074195f0444643dbd575b71c5066758edf6b0df5cd1e75fe7c0a81fa342e14e7f6189f52f991845e386c5b625e5c193f4a746a0e93c51278887f7dae1a97f7b10584bff8b8edc9b89ee31061b0663113198e438e08e50b2717d64cac2af5003ad8f10c84327dc564d3a1c59fa7be8b2d6cbe4c7dc9e9e70a4af69e729dce1134b1211d8ab9278618876ebdba543fef8bbef7e94abdbec8722a067efb6240b17d5a2c223743c1a3c26aaf4196a7898b9d3e478a4c494ace8b0d2e61293fa46584a43fcb7cbdd263f6e0e32eb3b1e8d2bdd76ab8f78de5cc47a410a979089ef39490fe20245e1a3f61444e1e836423156beba2450275f0390802bcba5747a75d90e61b58b4f19927158e431dbdb2b37deebf750ab11aa465d1fdd88060382243323a831bc2c2651db387c77644f5ae678f99167a4c305c6d96b3b4bbf66c85a53165865e6015a5f75c8b66edcd29adb61fad927f7e6fd1e1b70f453cf308ccb63ecf6d2d62c55842c067dfb76c65fb266319c4583617cb8ac53254b199368e59590879253ae56bc79c5e7bf56d577c5af091d236b41d446fb7bead8018161adf7302889c48e083dc97d4a2fab87d454ba9dade5e838a2ee0cd0395740e56f3441d13f7b127946e5770bb42d9443f977c9185ac629f058be4dd5c001bcca2de08387801403b9e218c92a1b18a73d9caea0a9c8f44831b96481ef707bc67b9017ef28493e38bee5c730f8726656e8bf1dedc7149495d5944bc3138b4d6958d26a1d2ce78ce71f52ede3842a2197ebd07b8305d76c08d30624431bcf4d4a227df7ecff8d3c0425e184fe3cc872d39ee7fe2d08f4784e217281066ba38b86ef80f17601026d554f45defb651cbd3a73a292d62a709cf1bf17162fdb6ae34e39a760b1d128f3c87044b475f650333a63e896eb0a4ae359f71d35126e02f9de024b15b1a0ea6442bbbb44e83cd0875636607a80e5030d63abd090c8524db52d94b57e087c20a1d37b00fe4e2d25d6ac2418df0197af19469a96f87449859c30595dc4490dd727a49dad63a2f43a7c51891b5bfa30929e6c7b0b516feca15faadd7456c19f344ecfca27bbac116c09ed51df0828a145ec5973176b078c808eb2616319817587ceac456b74216114b2690d9018477d786b2d690c6ad3947dda0eb1ff5fec5d404bf0ff78fd001d543da2080d76bdc0f373dcf6ffd09b035b8f7dae5766e7a70e979b7ef73e759bf5c20ec037a45cdec37036784e35b90536c325a9ad429b22abc2e69bd693c1ca9e21075294ae83ea4b62f9803c2f9b849e28f0a056695484b2315a97af1daa1a84f92583278736c4b1198532248e428fe2d4cf8151654739f1c73683d461702e7001cac1d696150d799e922a8d03dccbb499d35839630c6353a32ceb127a44bffb4a8335b1487098461a2f9f20fed4d54733ba8aa45743938544703bfe1fb4d1999076882db18ee73a81c59da8e4825c055d4d06356f4689400c13704e80a87a00fc72bc3f56d0be17d903dc9f00b7165d9eaa95c99676531a40c83d4daef2da6022e1a1ff883b30d1870634e8d305e8673789582df6681ee5906ff9187fe18d5f83a377270175f16211ac01f5e704eaa038ff25b4e54acad044278a908b58a681f9f64e2442b9c064075977d0259746fe4e9aa68089bcd8c6d0f89840def21a1725c5d7735f71032a1bd7cb1cd13205aef96a346a187690510c78093814d73aab9221da11f5e672e3c7e34405b58dd4095109d3ca35d7fe189db8336f92c8532d0389fb215deb041e278fbbf0d0da1f1235d465ca319163d7708747d69784c139410c17a7020bb7c5cc010aedc8808e5913cfd809f44f660c3ca65711f24fc3702077d86e91acaa732904883963930711e1dd868127a1b8d7e83a9f20f089f88f33223109595ecb3627cbee301d192137fedbe5795ef495418587bf4859beb30d4eb25aec2a3355c3385284fb218484c055dcbd64b1b78d2163bcd0e335c6c8870ee180f973548a88b5941d6ac8aa7a3aa179bb14fc69dc633808da368562c3c9588f1d8d2f787e19e539043106d7b1560572c4c457e986e81882f888f6526c56b4570826cfd7ce37ca3c81068861946d4db6467eada7a717fe54e7e5bfafe3eddc8caa2116845835e4e539dab72fdf98eb659bcac81b2b218016e693423d5d1d02a472bc71f37e85f2024e436d5075dce2da78aa62571054a4b7e8cba49604619a2d4b3a0397d2894d9020722311c3d7d257b1f9a85cdd254e12d41cf49bb11053afd00df0e746bd83086aab9cb978a255309e19e63d43d49f61e66d563a2f0fd5f3026aa36f3a6b42967af9985196a216d15a76be2d6b274a346d60d17f46038040b460c06c6477da8738ed45419a9ce48077a3b629870fb3ddb972f56cbdc438c19406794b56a3bfcef35b7491d6964dea1242cc28cd40811c225fbc29af96dc67187bcd55d17bcab33cead1ca3681cc2c43f471dc7e83795538c8735a243b0d8eb38c60978d4923a07a7a37c8cf64c6d7fd8d71221b7ed72528c7a22f68efe31ea0a35e86464d48ecf224491ecb26d77cc262d4e78ab1802953607632879d53622b79614af5b85bba6c7372233187a4d194cfcc4cb9000065e62e886157fcb545bfeead4242f0a1c70da9171e0be0dc437f8e12721bcb109ba3ef7afff96cf6371b56263c57ee8c0835b845e877d30ee7a36839f3d78f2395608c3b6d4d46cd29cd66880a09dfbabdd5359ca3523590f14004ce7515ae332d074c254d18c592c228bacdf7a821ba6aacd2adf77408df1f596538eb2a6b230fcfc83dbebd4086a5ee091817f1cc9c9ac37d9147c20e8cb3e9a0599fd9192d064cbf4ebfce6c60c84958cab1184b1c491fa2724df192d5e5f151caecbc381af5cc65c8818271b65486f56203160b7f028ea57815cb96a8daca089e9d3da8cca013a503c90fb10239a5986505b89384246b344f6b7f287b560aad35e700c5b7aa469ccbc465727750da8bb7cfbf4ec5e1b145a0be1bf9f406750bc1d13b22481a2fb423608782eb641dd539458ab56f249cb5134ac36cb4332433c9118d8385a9acb44aa2cb9d929e543ba4a9c178f6744de2e73240c64c08082c62029bef3d8fdd2e9f126075915bf331eaa8fa5d3bf57340a0d3c7ed55c6efbf67acb116219eee62fd5d4a0f521166933dbaec81b23530573766e4b1ea47b0677a52bc33e9b2e178695925fd0bc85b019907244a501950454cb14915414a8c7a78d2ff86440489c9f783e86ad874762622ccd8ec8dafb0c68fe6cd738c040e8d3d4ab1137c06990e27f0f42fce93498dd983b72afecff7717682e060d4eb0012d691bcd13011b621d2154fc0be1023b6a1fe91f942e6253ea059349571f92fd44055c8f5d5b3c106ae66362e01d58645b62e1198691aa02bd5bfa80e417371334fd12769e57d5c0bc02442d87b7407698cf88c4b6d1ece9c215aee5142dd49ff635045743bc7d97d7e478a57fb7428521bb7ab42f8ac226b5e08ee62b8489741cdcf831d41e5e908c53bf5a3b73d2bbb3686afe5614769687050fb6e6189ffa5ee8244564e66313929f0e58a015053910e4faacd63d5e73d539a75622a786b3a5608f9198d570fa7ca2593594ed846e9bb1732146d9adf1cdf533438e556960fe8c830eeb79ef9fceeceb090582d35203e1b34f8f37341dbf8da0e1d15d4ae67a9e788ae30c9b65f39a28b6b506adba5ee0930d9e861589c290f29d2cbf1da7808bb647c64476ec20f602da4b4947a558ee9291a9f25c1ec0675b57859924590db0f979aef30581857ac996caf8b8a416e902b42f7d868f5cbbe4d3436cf1a5bcef6b842f6d53cad60ab39c93c287587b0a01d899d2ed3f77752a601d631f7c53c0778734e91272a9ee9b25d42dd031804609874466f0e714e3f1af5d6a21d33c77821da180744d23a238c13821f4ee8df6fdc68681007b88ee9f2e0c9cbfde37f731d83f7c45f701f03c385e3927e5a7efc202329d7d0047a3b91aa216ec4c1d6e4e34580270d278c83e179702e0d3f6129b4821d225314d51433dfc6b6ed60ab06f07dbce168b8e3c11d8e72f37a894de9e99653d3d9a2588ba21fbf9a5fa8a54a9b06754f6bb970ed60c7d6933e8ef4c2b1838fb9f692eb4c8493af59480604be85143c57f529d2da5ec9619a929858d22e2081cec09bc3c5a711c960f2d746fba6765e44cc11e5bf7f028e393e5f064855e11a04a47268dab1209f263987e44f9f0e4e3d32df8c40a1787d4d7a4a1ac75afa235a65d07e0b80c132977cd1da6d71b745282e3adcd3fee69364ac75b3e470d669efcc90942db75d8bb7592b92a80d2ceac64bed36b4457293336885774ea95463f6941c9c9c89b9f2d06aa6009e527da8fef9fe4154285ef1e64120fd0a66dd77e4d4b3ceab2267040d20740c1ba95182806432f127c15acd1cbc53f957c1fff49540aa992b5fe18bf90c2d14da54ddba183e63b852576a619f1adfd89192d689e73e001456c52993f47ae69d653881b81e6c90d173cf1f482997fc1598d55f677f7ebf8b1921436caf68265adf4bb72926451b0bc66a892f5dc49e5dd57b57075665903b225d4b8d15df5a03f22405db2c6ef9df08f68970db8d04868c426689916b2f515515b00992c3b44073c0963e3516ecb9d30db3827ab9f52aa7ffb15dff6c22b8a825e331fb7d060e4c018ea27523c924cad1d3780a7fff74ac030bbac594e4180438d9775df3adedd17d78bf396f315c5c7ef742aca009de157953b7207305ea4fabba16011373457f31311b7ae752c7e98735e493d7ebabc6ccc1db2bfb19f9252f553af188e696f7b9743c528cebc2551147028efda8f1acdb18725aee84fe136affc6966e96a1ca4d7f87eeb0506838bd4d886865af2c31ab6cf026ab4451fbd624e3a18cdf819296942175f1ae4f75f490134faefb8189fd051f9bbc3e07d3e974f7523b6b535d88e94465c733ca98f7719baea52b1a44e927057fdb1a27c3efac45b03aee0553421dc0e51eeb19c0a2236ff6a5e95d5625b476676db333788729dabf549c8b5e35c3c0d6de83320f544b4bb8069a3c7c4d5a3a1dca26bfd362394c54da4810e9f026a6f2a76cfba7adf77397947e9f4168d4dbe9ef720b5dddb2ae492c6864443311b75b53e4f24fa5261b86ef24394e096c8b165edc483079e25a6e35c234d5b3d4b0321955272f949b1323e1373d91756b86da16164c61eb7900b2fa6a6be09d453ef06b62b559528ee26eaa709af33c9c7c124d648f8b0ec7fe7278d3e41e7456a2fe072d352f5aef4d8d3680c91b2ba9da04c1a69a40a566fe69a2112956db6f656feff304beafc34eafcf5d54674016d67011aabe26d3440ae24c901033ccff33ccff33ccf9f738efe10a2ff1d341091524a8ff27767139172570ad1afb39f70beb1d96f0fd87708bf2304a206d906ab069fa416b83897fab72bdda699852af3ec3a6ec5030b49397bcf9d242e33530808881820f0b8c299cf36b855c8c30a974d678f8da638b1c4a30a78e6d83827bbbdfc7d635b50070f2a9ccb738a1b3c1b52a3141e5358c3455fe5cf5a929c14d6b7aa9253fcaebc570ee70119376a340e1b9f031facc00a1e51c02e43dcc7a4902146282cb3a59f21522da2e409c5387f9bde4301f0838713d49cccf5398e8566b409bb5fa61caf289fa9f1c18309771a3ff58cb761535d42517b494eb53493a2898712e8d0acfa797597164f42fb7b265a654d82854e7b20e10c2a52c174ececff23d82567ce699a1f242a0f23942e2cb2f3c929821aa4bda673c72a2d65e04184bc7b344e8ef75cd7c370dd92681573b68c159a218c4a9acc3ebf280d7930fe7057bd1f63ca6b1a189ecc78cc61622119fe2259a3868d5f65862f5c55cb4daa2a1ece64462ff6c94e9b7caf19bcf84aee8adddfe19f97001461c62ec878c2d566c95c3137b60c1d704017d99aa8c9ff312120203372f185c7933f99580a6eccc085d69556e11a2c26e11a336e71588a4db29865737000046473380808dbc8e138fc062c98610b5bc3493e25582cb9de9019b5b0ec6a5386a8dbc9f10c5a64e2f96975de6aaacfcf9885b9ea9f827b8e9cbf7860862c12bc43b6c947747963713023166676b09cc25c7fe6de3360819b6c56d984fc06335e51d2193f69e3d2809ae18ad296cc7869ba13dd56d061194c3b09f679f3acd8465ba72aa66c60c62a4e93c4dbdf3b318bcfaa28ea6faedb4ba5e20af6dba63ea36255edec9222e2e729334e91f5c4a7cdae31c99e630a4e9e976694c24eb3ad97d14edcd899418aa48b75d6a17219c4c18c5178dda9bfbd57418e1d3a76862888cd722907cf983bcc9050a41ad751e14e9eec720628d8ebb8175e5c7dd38702333e51f824799dccaad4a35ec08e32c668c00c4f60a91ef59d8289fc55333ac18971c24952ca19b33c270a267d95a44e6da2cf92fcf28ed0ce279af83689d9336a32414b9a918952d00ee7e1970b6660c2bfcf9e4f516e63d071d8386390c120202a987189adfcb78359aeb0949e6109b7a37536848c82199538777c5fc46b13cca044f5296bf7973f77d937664c42b594c34d864fa92d3a431279fc907f96d27612cf8c4854f9a4285ea24282ec4cfb268ca724af5782198f78bc93e427d45db2ce3be20cd53a53e9b34baf11fee7981a6b690f27348311698ac48c7a547aee3316d18949cce6b279b7be2228cdbe953d2e9c2711562edfac8ab95c7144f42767c8e0973f4f7e082e2661d5ed3fb7d686303ff46c3d877ece8538bcbd7ddab8b21c2604b1fe615a42eacb832857dad38e379954411c5eb27f5906338b0642d7d471e2a580e04fbe124db2793acd1fcc1a7227327b3f98cebdf5c424e538d9f7a15862e9f9e30325a5fc695fd258b687fa644bd51a4cfaa9f4f0c91a1d3606ab8ce7610bf918c73ec9fae2e1ae9b3ff593a41893fc1d5015b79cb24d454bdb2161b33e55689228eb507c5450a91cc5a41c3a1c2e74f8b50f5ae139d49763a13df4b464e550f78e4ff6ea33e2608e7191498ec2a18b16b2dcbf27547d439ba5b9e5433714336eb496f2d818b661db0a2a1daf41f76303bd5267316d70b1185f43b19e32c915afc498e26ac84e43e68eb6cda2791a3ed1e4da509294a73347c37f826a12cb44932df333d05d49b0752ba1f372331caf3d9fda675c4be26578436e0a3f39193e49908eb3f0ef2bf918d098f39eb6c2e4f4c580f9a7eb4e73d26e3a0ce4494287ece0625783a1984c4aeb89ab8cf90b8da9f46bc5547db117cc0c1ad387f98df07421c9a48f31f3c91abfc3053aa78aa1a9ddc29573161fbde412522d9cff365ed64c839c05e3aa692c39c1e40f62a1fbbe93b7bf2bb81ba663ce392b3c963da595d42895528562feb78f5e9bea332a246679889d9eaccea660dfbced99e687bea4c045c9d9e5531d853e9895dfda68be928642514fcee4fe315428e927e01ba24753d84eb046329bd8e61363df84f5e2a41c56a7c56526a4d1b334cf2d77949750fcfd28a1d32dffea56fd7993409de6fbac8d75ae48c032a5527dcbae2779044f0a933c866e9c198d502629c3c8ae487537a308eaca4d46bc07df6d0611a874fb244f8f955fc350c2929444d964612416066da5e6e15a4f3be260ec1bce72bf8dbeffc048b813ae2a52c4fd5f5c9de424dfdcbee8b4d2cbe458f7b67b61e58a4c789817a74e99f3afd556f8ec22394ba786940a7339ba30532cafb42d6bb6e6e292a643461717e59c5c9b3acb76306fc1c97f0ea1157b4dd216a8bad5a464c91ac25aa4654990cda105af256767dff021bc5920529ec27a8c2c8ac92aab7a6271975c26984962ae5adcc755a58f1d0c1dcff96c574f7eeba05c7cc5b78f0e449a6c1a63eee6b0bfeb988ce6b94e727260a75bb2cbea344a2e0e7a89af1a7f38782799e617afbc72f3062c57b889bbbaedc7b8e1db8aab9cab2fe5316d68d389d5175e36e816c37ec8ea64f2b7065d3a9787ec4a7fa5066a3eb4f2cbe79827260d091b7a2567cfebf4a3610b9bb64c9f2e1e3f43725eed133cbffec7663027e16c529394326ce3259f566e64b83525fbb4d9c6f0b4b94972f8784f8f89c1905116e329a5bad2c25092e4a09b73a45c4c313018e7d2cea2c949d8ccbee007f5de9d9a6a97cb0ba591e892b773b6105717ce9e6ca22cc805b52c9e078dd7305f6d213f3984c692fc1c27a585e24c84ec9f27933e0b252db58831d7b81d0b45c5b25497af50921b4ffd5ccfb849ac70b6704d52948946156c79bd601e6cbb84890615f43649d2f2c6fcf9108d29b8415b4ef4570a6ee84f7b94f77a370a8f5caced0f42a1998f1ea6ab6247f109f76bfcfe946c96a213764b676d9a26b83ee9baaaf93e5b9860bde7971bcd61652d81b48c11fd7935aa44092629c9b69e14672a118d24dcb6f5aee12431a88676bc8d101d35682001cbe9b37c6238f6c609121a47308889397aa4cf973885280d23ac992694c79cc9f4348a90dc9db341db6230d1d020c29eca3493c69c31b665079e0210901d788ef7188629cec6fe8e8ad9ae968730cc5862658a16b739a70f10830667117040091a90058f60d8d1c2e5c8cc24567580e1099b92d7b5fd8b4b32b9a66c7b7c7cf245abfb9eee244e8a5ad2810ae0e8c01864e4e80008088ed7a1c3a31796b4a14ccc190da9d138b6c68dcde1c18b336597ea92b366cc700808c88db5b123c7e6a0c62e92e3baec6ff84c524cbdc04317565ae8cb601f53c6bc8ebd31038f5c5ced7abb321e259b250404240764b0c003177ad8df7fb8ecea490c04440cf616e06881c72d92a45fd9b421516a5388182a28410e13e8c071c3c31658da2cb1cb9bbf445505251083bd05018882472dd0641f2df377ba90a9101db43899904948bdbbd9f7434062e0310b7c5546aa42939cd30c0101b181872c8a1b3d3322c3d3a72432f088c5aa7fe1f17566366dc818630c32983d60d1596d5af69e13b1860e1ceef10a36ce5358d1350404440c15940004c46f9c63a386872bdacc9012ed2f1e90a10110101e909123c77bb4a2981f4b46f7670562c992ece8c64a957bac22dfd0713975a8051eaad8369594969ba184eb535112c572a69cd2cf89395498c73afe9dca895ed1298a6d5f55ee1ebebf3785fae65b612f2a851f6ac43d69c6d992430a6f56fb2dc53c2bd1f518c59b7721674fb23a7d0f5134f17b17cc2ce3558c3d42f125bd53133a74a38a1ea068638636bf58ef953c21787c22c9534e77964f3c3cc179d8e5dca5321ae220787422b7e8ed6ff9f51b32f0e044e2719704bb50a3e1dec49dd7d3c24939a6ada02636d794af9f534cf899094fb2bde029984850ab947653e54dbc5ce2aef7d23096af4f7841208687255293f5ba3e7aca2152258c31ca732d94586e552fa67c963bc6933845ab33492b27f1639384ba9b5d463d2512e958f2cca821487cb1cc4e9c3cf178c469dcfdaac657ddb516783882f914322ba7ef36a71bf16e7cfb952e79faa3147830a2d136a93351c73c948b60bdebe2c46edfe07a480edf81c315b1a513bb0e6fcb1fe744b465c9538e194a2ea1ae810722887d73950b966a637988743ecc8e6e46f70ccfc0c310e7d124c513f33726831e85f024b5c81ca34d6e3e32f020c45242a7cd6d2c176d10e7c7e4498e4db1c043106ef212b76dab452a2ef0080463d32261b62999d8a2c00310e658d7fc56f2a60e7afc819cdad7d4b7dadb280e0f3fd0493cff2df865c58f471faa24bd893187d78c69e4431d53ea6977b97c3d8787f0e00b1e7b5032794e2a966dba233dec1e4afe354950b193759071836fe0918736a56fa704170f4731c17c7cc3674d9a1c2c09eef04abfe94967cb332f0c3cec603ea1a47bfdd1cde1f1a883a7a37a9eb7a1832d7a5297e6b59c0a79cca10aff245d421e72c8a6a7f3a71db3fcbb471ccaa136656c79b3b98e071c922c86bab89921dbf67803fb169dfb93abb55ad8c30df88aa6b9941391caa30d7dcecd2cb12ba5bb65c39a7a2c557dad4fb4d6809d9c5dec2449bfd6d5e006d1f0df4a1a6c93fc5fccc484c0030d9ca88f5e6eccf7ef0c58b64cf2a5facd407ede2bb7fdca4ca22138767894c18aaf1a2db879c9dd64e0666acee43e3bca20410edf01021d788ca11433aa9398184bc871f88d1a3bd8430cb4f7a52c1597eb666fa00223f00883f29ede2f7bd454ad85d8a8e1031c9b838c1a2cf000c35947f44bd4f3a6b91e5f48dde4cc8a9a9324e709088887179ccb27871aff5c39945cc0a30b496e36e3a9939906d7830bc6952cde9bbb347d8cc716bab38f8baff1260123f8c0041f1a2e5a6fd85ca89750ec533b498b6a9e6889c4943a2c6b85548573051f9528277163ddbd06d7d0bae08312c9d93b25eea7b8d5960794951101073ce16312a60e1e2e97a856f5c10e24e143127b8e9893912af1ed2dc2472412a9182cfcdd09597a0808880e4814dd9254639bff4eb85bf0f1083dfe691ab9f8bb510d59b67143070a3e1c71666b1ecf924f7cf446109a2c8bfae56b30f90020e18311a76c39f8585c4df396456452eca53ef5983c498a682af4bce67d627c244213f573a7c62c3184f58108f3d6e87a86fcc79439446279e8fca4bdae29d2f16108c6c27b76e59f5d9b05848f4220d3b94a9476436adc581b3b3a87093e08816477f7cff946f992908f4118b7567a625c3a4f4c10895b54e8ea85d8fd0341e6946e4539a16c7740142ee3a68c1efe039e49accf3cc9a27c42c1871f529f908c9b621fbcf1389fc5d27a49221ff29c929a06f5345fda1ed433df92523cadfaf560785093437fce2589251f79d82cf8573ee1badac783c1cf3f6d645c92b27e87e582cb7e364f093eec4025d1849a8e49ec1cfa3a98a63f0997592f7c2ce9604c6eeacfd9b54ee79018956543097ec841314d62e89a133724fa88031bf61bf32b6559723fe0e0874a9d14618e8f37e461ec73d20c97825b16f870c36692a1423b4617a9948f365cba9e557e7b7b888e3272a0810f36b0a904cf60f9120202520304e4021f6b6076c3a6b974d4e8f3def85043e31526a5aa34e0230d854f9a84bb5025c9ff22f840c39ac29b7d94ca193ecc70c7a92d21cd2f439ef25e5ac8c9608a25df65b5bf68cf8cc18d9dd830df57eb9518de2afbceec50c1a2e4230cc6a6af3bf153ac2fd9aa0f30e4e92ac6eb1c27d6371f5f3827b9939c662b57532f1f5e4812190be7bb69f1a72ef431d67c5a8c553999f5c105c3363d574a83e512df422191d943a738792e470b5dcceba9933cf4624916d8aebc201ec604fb101630b90aa71b55223cfa7185f35a2a2f3121c4636905d737fa7dd668fd54a942aa7e9fe34742534a12f24105aa624ce9daceb7a47e4c610b1e56bf4afa9e33ff430a44497ac9f345353ea270092d1f5d725bc9dfd18181137c4061d76419d633b645ec8f279836066993764a9c4c8790b103070852f0e1047b4eccbb6ad27644ac828f2658ee269594ebed7ffe10127c306149f9fa92d524b518fe584231f642766654dfd23f9490f479f4a44f2e191f4930c9276a5a1243561f484870dffc9c73c2649b847c1c6159cb1ba5528655658d60e64fd4c55c7a8ae9471188dd60729fa249fa291f44a0cb3fa547dec8f8456318f9bdd8557c5dfdfd690823cf3cdf397430402318aed7bb58cca2a9abd234809118bb27aed2469dae6440e317cd2529486776132fd20bd0f0451f2d67f5ea6940a3177809efb9fa6e563c0fa1c18b53ec186229b94649e2bbf872adf947da97dfad8b4ceef0d59fa539c5391745678f35e21d5ca41a6ba7dd5a92b87b0bff3f06ad7cd516c9274929fbcf598be365ccb14c5c1b190d2dac99d7bdf298593c9537aa2a9cdcf8268bf34942f7a79c73831f0b2a2f76b6ac4ab32a581c935c5571a2e60a77f20a935dd8fadd6d031aae583454634cb44ba315c9d525d744daff9534a0c18ac44365bb941c7cdb5b45e289719f27a864d05045ff4998f3d39462c24b2315c55dfb7d749e51f17240031594189b9327cc65f4b07440e3146912aa935caaf1c67b1aa650cf6aec2dab690c5729aa95934daaba36539f145fb0bb2446b5e8fe5308688cc26499248b316751d4a3e36e51b33b72ec09404023149adcaa298deafe6d078a4ea888b5cc523b767a80c6274e26afb16330574b171a9e30764e163e854f93b1ff018d4e9c254586d7494d297e8640831367ff7aca750e73dbe8d051011fd0d844527aecb89c4bde5f33848626bacd1cf673d0fac83f137aef6664beac4bef314175aa893dbd5f22b9d2d5680a3af6b95b82b3b896ba335e89ac6e65fbbd4d36e594389cf02e9f3d3bccc427617596b3b1568b7d5b125cc9795ff24c8e6d762430a93e25e70209aff7a5c4b0222626e947147fa9b5b3dcc6fc71c4d6b6256448eee98d4847643f6dd47852cb88426f44e8b54d8c092fa294e4b43bd37f8d1d455425ac579c79ee7e1371a5688275c59c9ae5410427b23d1def2aff7308264fafbbe73de78a212c0fff290593e492af2d84e63f9a4fceef25fc8428e78f215366c75b1f045231b22b8a9ca7b4208e21df3999570ca706e2d8d6f3de71437b0404e9f65226c9db276dfea0781cdbe861da46f3c39529ad6d7788e84bfbc0fce54f9151574c960f468c5b07f70ee1c1dc83eae1c4fe3dcb4abd1e50b9cc92dbcf53cc7930ba2d2fc7327a7c110f644a22de69c433ea3b9c0e0fc892809204aaa816e08005f8e0c68e901bd8c021019ac0dd041206f00e1d65e42040007c7024900000ecd051460a061000bfc19671031c7be30002d09103012c00400ec66027988d1d394274dca85103010a68c20ed731868f51000530818ca92b2e06db13f31fb284843e61ffbe2c4783254409a4bcaf5c4ea7149004bc4bcc5132a5a79f2800096663c70e6c7419356a20400147301b3b6e84e8d81a3510a00023f80ec818630c1fc3000a2882d5a871000510c10739e0317c8c0244866136763419639451a3060222c2c863b3c45e65ac591692959401023286e7a8b1031b5da3fd07366eac8d1d3676dcb051c6a9916304916094462fa744aba5a4251160f41bafb16a3f962451e417885d2751d2fb73ceb72f92eaa4501964eb059f1efdc2b5c50bcb2d575c4acddf61adb10b9398c3e534a11e3a264310d1c576a325942485c728915c3025846d92ecbd3e65e8000189e0823531b5891bb736431e020212b985264b668d1b4a4f268ad8c20d1a3b7b0cd994cd482d1226ee324b9e1788d0a2b8b77b27ff264986c988cce293e4febbf214594462018b57b8a215ac58051d4eff2ca6a91c5b09711cec0a461051851b3ab7a224136bf74f85626e65da29658f214550718726c12fcf7f0a7b4a96f9d053c414495e9f2ecfb2c7bb934829cef79792844f4548c1e5cdf1c828fe5bf5f5ddddddba39228ad7f25dca686d93a386a234b72e715f1fba6704146426516b2f6aac62f61326f94dcd63c7524b16f144aaa9a32907fded98473a719b1c6c2cbd63fc6cc289dae34b8cd5bd6cb79b6893a8f84dbf49315542229a386945972c313ae564278864c28e765db57b463081bb446a656a77928c5ca2a01125a58d7b9ec73b2296d04e54d974112176a60e229548ccfcb0955e5726d208257af1bdfc9b25478d253209f42c63cc9fc636e74822f128d53c8b47c294d2e4a819a682ae09894738a258cd8c6d31c74d8d1bc108a5dfc2651ff14ceb0041056e90c349105984220a73bafd176b2bdb9588bbee523eb5320404c471808040208208534d8acfcbbb4ad19b1039c4156345dd4a5672f668c4102e88144237d398c4cc6dd5492a4288414404110840fce1d79cb2514c0a39d2fac118e273a84e25d207e3c31e92da24e50b3d13dae3881ef26078f0929d7091698bdce1d826ea6d274d2ed27e206207a274ba53e82825b617a943e286652dcb311dce99cadf492273d892655ecebeb20f45e45094b9f66837399c552271a8e2c2597a65058f397030a755d0d0dee62f165044dea06d8a923de52096ffb9c1a0d5f26742e53b6cd408c02b226d68d63d0916538f988411369c66d36aca4f7995ad236bd893144293664cfa8d6a68544b5a4fcc6c10498326474b1b93d6d792682894e895aaa5e259e832889c61f7f513d79310657d9ae1f14ee983b696d4e63210834819cad3cafaddb262924f065ea32b660ed9ce29263286634c5da29d3e51524a0808480e1b7b0210904444c41086b6e3e42499a4f6a879040ca5578c9a4c92605e9244be50fece9823239371192044bc504a9e837a9894fb94a9f241a40b66768e78f85831a6e00f225c306b76c50d36a1dfed16ea0c5553a9ed20a20534facaa75b15334fab7244b2609667b01433bbb545d5830816a8f5f13de9addd4abfc29e35bef119b640c40ac89898d4f3e4912a906d16e622211b274945a8d05692f9f812a22032054e2763fcf8f962f89455440ab9b75989e5f4515315c3225140d2637ab9e5c898c454040af5e8b4bebb49480d1c64e0a8a1c3466920f204c4d288c5f14c994b459c70f54da79a47d97867459a605277a97b9b74b3985584098a6612be34494796b04b6a4e951151429f532ccab8c602a08448120a9d1e3dd6685df47f0811247492143a48aa66ace62d7284ef2293d8b539edee190202e283b791818811e8ace4e9f4652db7c473e40004a40391222477aeab9694c44c0a47885068564db9d2d2af398c4d761deb1a5318d7d4a58291306b13ea9e34a58d3e80f10bcf62dbc3a6d866b3f1c529db358fcea7fcddf6e29852a8fcaa246a2e0d2f340b9e84d490f7d7ea6317675ce860971531ce872ed88b504b279e0b5c2c9e83d5464d1112e9c72d36792b9d5025131e4b5bfc5d42a55499eab4c28f5ad02231a6df9097a3b3f0c7f3bc7310b32c9a2c4adf15ff4aa2a2ba148b42374a6747df126cff800525c9df26565f4ba9fe8a722a93e412bac4cbd6ba42c9982a586fb6b764adc047f7b3c65b322da10f56b4957f5725fe3b7bfa5885be3a3296d51a7ca802b973d7defa9a8d2e031fa9a0e3bdc7ec927a9ba3e239c174f7e2925827cbe0e314d6275fcb15bcf3720e061fa6f0e75b342ead3ff83b838f52649eded75345830f52609bcde724f3dfec160c7c8c42149ce790d1e83dc9c30c848f5028395562fb5674ca988122dd78629e46f5e3134a496ba6707a37ea7b825e9bbbe8619e64d24e3c955b4e5cf950779d139b3017dc7fb71f7c6c423fb9f4e383c5b6aa77f0a109c6d2d8774a9572ca4b0f3e32118631a8933639200e87511005510c8230a437251da3135070c83c1a0ec6a2711ca9c20f138000cbc2c060381088c24151200c053114c4300cc34008c33024c34064c628a38c1e5f9c7a4763b44aefa8c58a5d091e1706b92db3db941f39306c66f7753634d143f52531aa001971eff8651410532eba83c458bbb10e65d5865af2913db980c2d7083412b5482c27a9205981561849aa150e79d7b11b4d42b56fa4c95890cc71009c7e53afbd388118c041a22ae2abce92872c60c6fee26200e0bf5f7eee30e5b898bea40b56292d51935be1190770f20ee2dffb74de20fa89e721bbe812e1fd619620e3a350f9b25283d6bb63606901d90d39810ebf22fff833992f6bf88a59180faec3c27a3d9a1e08439a9e253158fd95d3a625f40d8192bf6c908420cfea5105a0b87ec9ac4811e8c0650301b0e64facf2034dfc516c1fc4e24e00cd67b2db5c3bafbf26eade68c40d9abb7bf4ffb99eeb621aaa8b49fd41baba5229c2e7db1888f82f7db147ad9069b7f51a5cfa01dde1da574f8b46addf28513ebdbecdff39ff04e206d2fd3a099e8f055b9228940f241768f664fd6b234b2a7a01a80745725a40e47478dd5edfaa0e239cfdd4228658a74975ae7f88f215159e28e7f7c2dd1efa6d4613f24b0e045facf20e325ee1ad9e75d0216bf6664a9e8f11cd8b8b62ea12ccb17164a5e1b9a91ceaf5613f449cd187a4775260f3fbac0033730c4636dd4c18fc3a1d00359523fe8f5f383dad9d2a9a08b688aba810e6e37a88b6d5fe778eb82f8477bf4c49d20b3f8316209465ebc6f1a82e2b8d4a8d44720724bacc60118cb18dac76a3fb950d84dae2a53efb6feec4990fef8864784f2ee1ef1bb205b17421cc4f08bdddfd77a109e5487d3e42e8a89eef445f93fb896b0dd348bd445c5db4928f10e50725a6a93d0053ee3a8dec8a8c554974ca1c9f3e782cfbb8a374fae2eaad9c48140821f8472519dc60ca5103929b396866b4410aefa48032d4ee23f96b7844941ecc374511bdc59bd6e47841517f436f2443d3c3d5137c73b8c6b19fca26a62bc1869dbea0cb735ee0582ab6acac241941eb1a8399b6dc1c50cf8ce30ecb96c117882c95089335977749c11d413f487b75b522f89f47e081cc7793707d2758b79cba86fe6599d2e24acb66769ecf0924d7d01f591e42f1e8b22893dca599f36ccc02d63bb7875f537f12bc5a43da2c00c4ecd657e56fa1397c393ff15c3d8453abf3c2912c00ce24448a447c20c6d4dce9214ecd1f4075353e76c69b6fe5ce20fafeb0ad6c5f03dec04266f4cea2f235858fef7cd72a3b14105c008bb7a3e2fcca66868b74506f4c150dc533c66a17d4841dacb60b41541b258640a0f59fa7d8face0eafc996742062d11cd68fefb6ff9e6d8ff37f6a4b36c50bcd0de4daea347aa096818387896122904cc82529d48ed5bc38453552899f3552a2958ccaf8c572e663fd1f7488e22c9340ccc23928a51795d624639c5211e7be46f5b2f3f074f8e3e611f7802b7e968c35bbde28963f3cb7dd105890aa36641675bb294017a88ca00f74b4b60a4f3f5ef8f1df9530272bb748e7257852d249189d07460a7b99d0c82a4b05e5d04031c1cb51f929b8a43e6a6217b9f2affd7550f4b0637973998db0cb75ed1e60f6baa7b90cd8099c4c515ccad9e42a6df646b895ff4b44971473118bd01579ab0471c76e318d831ae48d47351f62e28f069781f37bc33772f1c2d27b2fbaece93dc8eb842c91bd315334b753ab3116074d8facb48713489b741c6efb397220f2cfe06370a9b0888857d07564ee66903e517492c990135c12b9b682cb58cbcac5bfbef48c0641b079f5e74e50d030f1f9d797842617f81b8fc72c369b59d7ad5f2c40d1e93656bd3dbcb11ef981529eedfe7eb460f22254e99015614fd30f0d7c85853ea662bdda8c830a766bfc9960f0b7a83eb25c0e35dd6b4c204d337acd6b91eb7e33ccd3ed6c1bca18b733d23ab48e681d84f89b436f23cf1d89e9066d53aa6d4980ec5fcd587a70084e6365598f2fac058f5e935a05f51bce14a0295491735601c8f58318fd044aeed6b2a627f2c84449090ae2ba14a1d3d0495869b7e88677eafd29d171b5a587f9115603fabf7c7a11a576ab4275d84bac9e4fded3c2d5af03c3bec05a8ba07e3bbd6a4ccaf5274c149c3593823ae369d1e23c8748e2c40270447479bdef73855a95ba359c93b1e76677ab1968cc4ff01940235fd9f9aff2d022f2f23c0561bc3e510a8176c0f3ebbad853cfe3cfd980855e247a872a01d7a3c101dfec16902babbdfef8531ea23233c2108fb3686f91e34245b5863c1756992d2e65f7e8eedb985df47045198588aad6418b350e60a32c7b75ef0b4b3ff6591bb921ffcfa2e0e1d088eae8b469b42a1a6a59672d6b8abf3d763722bb753f53320a56a86360bb041a65b294c73001f6f09a7fdfe6f2968e23c3d897e2bfa0122245d2195eb3828b201c5ce384225090c6939b0acd0996a955b433967151d0547533caa4986b6d0f3d5f4c653620105247655e257b4e440c6d44ac52806ff40fcdfc57483b1b14821134400721045b3adbc6d3747f317c4f44853be001274ec6d90648b3db664e0df71118cd689e04c59c39446532b80fc5a78454737330ec11c4c0024cf8f6905f1f54ed2e1611b9ad30de3d0e5a32ad5b65f53831873f3f246211b1c65a8aacf21d8e7a280563b8b34d2d3d7d541c591c21fe50c047e276d3837cf09191fd36b3bdd5d6c365fbefc4caf81ee30ed6689bdd3eb85db6fcc0e1b9b03002b1c5eb041fa752d43ba950127066339316f12c056a3c1315fec238580ec8223bef3e802a4a07afa3650d51c661e739f806a9639c5122d273f35a09a2f47ef1c136878451de97a51c6101bb352e0892fdbf8ffe89d3e4210f8ec7b34cc65b167e6af9b49350f3917767764c45cdecd86f985bf7c6046d24cee758ded220f67ed913d92378d057deb8985ccd6e6a255f35e98f4a5ec05c9658a98ca66e684f8441627eab4244bc0141b6f42eb417fce5b291414f23e76abd20ccfe7fa5bde47399b6fca00c88d95ae4cc46db2a2c4f756569f9c847b195a465448e994efb83482f733c3cb6e683391ce08b9d260e59ea533ee1ba4130beb04c5b0d860402929bf3915a9aad93f56db5756d6a85d8e1a4464d4aa0b324e213c4c18469061e21153e5b7d8e4bf88168349b018d9506cf9c4ff01c4039dfcd6fc30a50d9100ba36902af9ee013a121d0edfb7e7cca7dead586b0950ebcda7d9dead49ecb14837ccf0ad8aaa53a5eb6ec113301862ec604a3a054ab036ed9311ee267da95d12b7094cc6ae92f71c12adc19489837f135bd805997607026ea3955f0df311c3d303081ed49bccab80424791101a724f6888faa0f78de1f1a1712d2b96dcb03c09573fb09a44de51611ea55e1281ea34e0874ab12fda3cde5cedbed43d7694e49aad3b74230f74c8d0ffd1af398cbb8d38e598e03de751cf57ec22e64e5b61f871756c90025e8d199ef40384a1658ea61cb5e4f28c59e0cead024c4b88b4cd1bf8184c0aba16f6c55a4775921a2ef4d9cd3d816e53152cba3e66957b5879adad7d845e5d575c6ad06d6114f276caf096253c8967990d9160cc56ac96154cbe3ce736f2f1fa7ddebd7f6e761172f73a3057cad238e461301a7a6f854d298f9abd35833a15ec97e23a42c3518dbe89e2f3207c70c8db8e299c093150bf6c72678f2854542b9bdeb281353f1f0686d19e5def01c616cb19c5baa034c4019573a0b4b50de975e3ec532ea4808f4bb30976037b3e26ccb125608bf06ff0fe2be720de818bc23aa4764aa0b32f5dc2c2a3c859a7746035505954aca3a663b58b735825476e15ceb90aa5896d6373b283d44211c936ce267815501091355da8a8725da46c2c082cbecc5895f6cc2f7ca82a7db3d4241e43a77c1731bc7018cf1ddad7f4ac7bceacdbc9b74abe5742c82f6a6e89450f3ffa55fdc0370139ccbdd365f45208a554727e7adf8466d7df1f752130c97d6aaf5727280896774ea59e47aafe61b6b3b1a16c11b373fd43a89cf044c84891d420274b63184328050cfd6e7d6d1ea5b7dcc3f88cbbba25860c4cf00d345fe00b856e8aa5f6337a479c6e0f44b8755908b0d3960c3062a478c6c6e2b98cbf175225ea3a79cf12f2c67e8fedcb3e418a9374285dbbaeed712beb02bdb2399f856f9e0f11d52af5ee498baa4bbc92b10237cef8c7045102290aca055d113e603303d0a3170fc117be22ae194c591b7c8728316750a958f4deae13bf6ab8e40295ef8dfd4ab77a7edb3f15dc9f47f8a13d9230fe62730c837c11d7a6f09dd29df1ddb0367030ed3d89208404f19c2c2d37e5044b4198792fdb2c8239c8f20ce9e8997ca20df628863697eba96ea41b12a7aa7381ff304109868b0fba5a49f65923c6d10a1b8d4df30a707b91138c5a64159853adea822530ecced363544a4d5e17a5fb4a0571e8203161ef47aad7112f920cc00bf958e4680fba3f6a349965f1a8a269f253011e78e33fcfc9a6d606f796ee5909e5b3773306d397704e72b6a4acd946bb1dc77fa90baed3ea9c20c95b50f919b0fb2bc2824caf864329887d058b3ebc5daa8f4e0541eafc55822c18fd9d389920c570f13b68432498b23ba5f6a1c7b1cd8f9260ff6d979dd8891f949e45c8068a104e700662c507e5d013d6728f44b182db1ddd4f66cc460976af2cbc9e1952b9157f29ca3e4ab598886cac9e07376d289dd467f58d0dae7c2d402061eec7ab8b6d548fc1456a8a6383e82bd031512f339cae32d12e71093bce8967b7043ad4300763708ac3269862c5bc59ca3e241c5dd5941975a8fb00b8b627b50ba280ab74e74f938e8f916aa2b3a6fb0e29a14d79881a42333e9d904e92663ce0c47ad07506bdce2ce764311ddac7b4a3c19bac9129507b227b9994bdc4e825061f5e09e207b19fde4790c32ecb170274c7f3dc7a4d862e43a7c9fe0320001c940ab4b0ce95533b4128ae6e9b25ea0c7ac4be6b4eceefacb21fc6cf5933325a4ff4f2a605a83f4549d0e1dec83b568efecce140a728ac213071bf962ae8ebdf85e08ffa17427d540435e938c1908ec36a91e2cdff72194f1d0870232b7c86e2487da52081754a69a9ce349bf261d7a33e228a176ef7e2f4f15102cf63162eee54724daac20c5387ec17a52b3602165e11736c3c94fa269ecbb98505e2700a65d0a27faee321b9fefcb464c44103639531c9f22555417a882b80072cec78c8ef15e3ad0b3283fdd3778f85ab6229d6ac4505764c48267d7a36aa1787c470944df84363d6c3c1dff9ac3630d3d0b8ccf181466820c4652f15670fdebe94903f405572fe31f32af6ecf8d05faa3b4f7a3679ce03877f98c7d2b943fce08ff1ca35d0f5b82b7d96cba1f3e369e2d239ae8812d2045af21a0557ed54ecad28b75cc43103fdd5ef336f935e677143603ce4ebe11635ebc65a6e78228ad47ed7ad755f3c9070ccae75bb10f00357db40a8a87ab5c2b0f13811b67221d83a08da21624a0e949f83b7def703773a6844e12a160fbc739f89a52f6007cf531d4484b5d085f1a5ab13736c15654b32b97ed9507c16ff2d1d9e451a3e4aaff08fc83392047b0912c0fa44cb86f6607b3fd50bf6bb32c3721f094e1d2814abd559cdbb27116be3c1a06630496e0ceea84c4cc4f6ddc29e97f5fff6275a415570c231e416a3cfd773c25382ec79a1639f13a1c7f265e734c0049d12cb8b9f721865080e43b297d4e0a3f922bb56adbd0404443df98b92ef3bc7c3649c0d353e7a4b9a44a0583a74bf49caee8dfa2f4fd884fcc9fa9f6cea0ece931e03b0e863f0fcd1004379517ec4bb88d10b79de920d124bc2f29f430f2dfe615a73fdbe2aa835e8cae488b5d55fe4b830fbd1f9c7526209b158b822bafb43e0896addcc753cc6bf1a52c221a640ae68244aa2487fc832c9595d0ca517b3ea7b31bc72053969a5655678a3e130d57851c72a68dbe8249efe9071f6be64dbeb5117b5c6b985120eb6615805fe0851e3ed9c6b2e163910b1610bc751193f6a8844e34e99f69b5f520dbf848249468df3cf5ced20597a67eb153897bd2808b436c7e32a0466447942eb7720ccdeb5715e469e43e9e1462c13daac5bb32214b8a085b1f94805a96d86d692c3497c9b93a96b0ad2f618ba9cdba9d067bbf5add457aded77e5e95401b911d497adccb294d6d2ba9e4c6a5a6db8836e9b5d3404d4c17c06a33f6b54ba238181eb0ed300cdf60a6d7c90ea08cf796462384e4dbc6cb3f6a981002f009", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x88fbb13c02428a6ba0e3c362f503d78c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x9ba1b78972885c5d3fc221d6771e8ba20f4cf0917788d791142ff6c1f216e7b3": "0x01", - "0x9ba1b78972885c5d3fc221d6771e8ba24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000100000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34db9bf7072c23e5fcc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e": "0xcc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb364a2023e1987811b741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602": "0x741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb37428b13f2e5363940676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702": "0x0676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3add4f66f85260a9b94e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32": "0x94e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195092cf984b8a6521a76175726180741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602": "0x741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b861e1707ac2446d61757261800676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702": "0x0676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bb7409db8b905d2f6175726180cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e": "0xcc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d9ae2954d96d8a5d617572618094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32": "0x94e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe32", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1094e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe3294e8f841122bad62ecd5016f80587ef7d91043c828e3112f668523db811cbe320676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda7020676ce35043f553c1a3775a10ba54bd5757e48ebe38bbf2b4c4986896dcda702cc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5ecc4c407bd279279ebbfdb5ae2cd29b04ac748a90bcc23a910e303104e47b8c5e741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602741100320fca26c26c665a09fda76a2b2b11ab6d36acb8942132be5b436e7602", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", - "0xe81713b6b40972bbcd298d67597a495f0f4cf0917788d791142ff6c1f216e7b3": "0x01", - "0xe81713b6b40972bbcd298d67597a495f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf7327be699d4ca1e710c5cb7cfa19d3c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/bridge-hub-westend.json b/cumulus/parachains/chain-specs/bridge-hub-westend.json deleted file mode 100644 index fbed89729c79..000000000000 --- a/cumulus/parachains/chain-specs/bridge-hub-westend.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "Westend BridgeHub", - "id": "bridge-hub-westend", - "chainType": "Live", - "bootNodes": [ - "/dns/westend-bridge-hub-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKyEuqkkWvFSrwZWKWBAsHgLV3HGfHj7yH3LNJLAVhmxY", - "/dns/westend-bridge-hub-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWBpvudthz61XC4oP2YYFFJdhWohBeQ1ffn1BMSGWhapjd", - "/dns/westend-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPXqdRRthjKAMPFtaXUK7yBxsvh83QsmzXzALA3inoJfo", - "/dns/westend-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWAp2YpVaiNBy7rozEHJGocDpaLFt3VFZsGMBEYh4BoEz7", - "/dns/westend-bridge-hub-boot-ng.dwellir.com/tcp/30338/p2p/12D3KooWJWWRYTAwBLqYkh7iMBGDr5ouJ3MHj7M3fZ7zWS4zEk6F", - "/dns/westend-bridge-hub-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWJWWRYTAwBLqYkh7iMBGDr5ouJ3MHj7M3fZ7zWS4zEk6F", - "/dns/boot-cr.gatotech.network/tcp/33330/p2p/12D3KooWJHG6qznPzTSEbuujHNcvyzBZcR9zNRPFcXWUaoVWZBEw", - "/dns/boot-cr.gatotech.network/tcp/35330/wss/p2p/12D3KooWJHG6qznPzTSEbuujHNcvyzBZcR9zNRPFcXWUaoVWZBEw", - "/dns/bridge-hub-westend-bootnode.turboflakes.io/tcp/30620/p2p/12D3KooWLeExhPWCDUjcxCdzxTP5TpPbNBVG5t9MPvk1dZUM5naU", - "/dns/bridge-hub-westend-bootnode.turboflakes.io/tcp/30720/wss/p2p/12D3KooWLeExhPWCDUjcxCdzxTP5TpPbNBVG5t9MPvk1dZUM5naU", - "/dns/boot.metaspan.io/tcp/36032/p2p/12D3KooWPaLsu3buByBnGFQnp5UP4q1S652dGVft92TFeChizFir", - "/dns/boot.metaspan.io/tcp/36036/wss/p2p/12D3KooWPaLsu3buByBnGFQnp5UP4q1S652dGVft92TFeChizFir", - "/dns/boot-node.helikon.io/tcp/9220/p2p/12D3KooWK3K1Mu5Jjg96Lt9DUzg84KsWnZo44V4KB7mvhGqi6xnp", - "/dns/boot-node.helikon.io/tcp/9222/wss/p2p/12D3KooWK3K1Mu5Jjg96Lt9DUzg84KsWnZo44V4KB7mvhGqi6xnp" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "tokenDecimals": 12, - "tokenSymbol": "WND" - }, - "relay_chain": "westend", - "para_id": 1002, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xea030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x10be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6fc071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d851648e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x5005ca1f000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x00000000c26f7b6800", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9688c6dd4b6b4b2765c40a96abc380692c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6f": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96bb9110ff3aed8b042cd7e1063686c53c071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d85164": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96fd9a90873d74fab552e7a2e92eccb38be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f963c20ca9a5e48e3543cad79f6ea2538e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x4192446272696467652d6875622d6b7573616d61", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00587474043ef944860f5520581aa5037f9463647bd51e20bd6080b25e2406f1abe2ec64b0ff439520e6ed1847818671893a082d0b4f42116c01308207e08dc5aec66d31d43ec516ffa92d7662a8fd98ec1f76cab795dff6de9bc82da54c29a5cd10a10efb0e1c4f13c9f633aca37a92de6379982bb2e96028fc7a9299932a1e86bec7249429b798fcab616053eb3b55520f2327063a65719ee43b900a9e543d4966d3c3480f631dd10dc01013bdf629388c9cb39a5ea32616f37d95349b2bc62433a2298b8482459233a3906bd2ddd5c38e79b4ee1899cd455a240e53c4f6cc47e3efcafa3a7bd677e4d752fcf7bc3dd377dc248309df77a74a0a5f7255d23aa9ff2e6ab7ab3314bec5d5195aa78ffec7d58ebed7715a66ae260ae16370abaf4afa1e73dedde7bdd523260a3f3e6661dc99b56170b9fdc9ecf2e8ffe9b755930e4ce1fff4db9a8b9b0e0e218d5c875531f96b073b6ed333ed8a6e008822c32dd8f64c49e3cf64a1deb3bee3bf44b4fd2bd3f7bb3de03fae1ed9b7cd5899cfc7ebceffe5e840625a3da0f12b0df5c7dc35a087add65c6d9285f6bfad5a47f4bdec62befff1de8e5847b49f93ddf9ffb4a490b3c22c0fff9fee214cfe254cab1586faaf06d4cf1f6b0d08c667edc7d2c81db18ee026e96a8fd399a1fffde3905847f475c73f93856e00881e7b9427466394f45749dddffddddd0b757777ffdde121f8218a6f547f7fd7a8fa68f7ef6814d3fe410aedcfbac7534dab0bb469d541fbb77994603bd998bbf2810add956a4c02e8ae7a38a2da4f7ffcfdd728ebe93e666d4be3c614db9ec9d47acf58038a1420b21e630d487c8babf1e363ad019934fe6aafbbf7ab01c1ffe9f8ab39b69ae42a11956f6d555affe3d6561fb57e3520f998b5d50850ebb1d54a5c6d424b6f6d7557d4fab8d5edae89921c86d840adafdb5d0d42adaff187c76d6969d3c1e388238e3134beb55519e87b8c336b7b7f018b5a72d3c1a291ab4c2d4e078e238e38e2a09588c228e4cc5f4d94257b1cd8de3471613b8d3077d5c38a564977d5c316ba9f750fa7f64f8dda956a0c5d5a75d0fdddb13fd8f2e88d296f4c5fa3f877e96b54ff3ec61867fc5867bb343eba48e96ea9fffb7ed7809a5ba6f1d12589ee96f2bf6dbbeb8d696bfcab39f7560392ddf5d2de98ae6681652eb0a5fddbcf5ff7b1eddff77e23ebdc1235d380f1f336c9982b55185a1fed97fc52aef76cefd449f9eba48f1907ef76773f35eabd3fe6f0fd41c8bd8d6973b5df7d2636b33bead3fe6d54a3f8376c7be6feebae9f35a0e5b6bb2a81b6bbfe9f464dfefe53a37c633a1bd56f6ad4f36de96aef7ffaa779d39941527e4999d399c19fdf9f3921a68f7be72a53fe9f7ea601b67477d449fbb16d54e5f77f9fa30389c95f33dadbddfb044cfe0bf01b716ebb7b5c95749fb747b324aa834599d468339cf1d6744599440df36cb7077ff5dfeef665a32a53ff7dcc3718a6fffe6a3eb6bbfae8be73b2bbfd9fc63ce3cda9c624666128934c667b2c6115d5e10194bfbfb50b3c958af2b30664aa287fd6a8a5fdab016115e5ffe9dd76346764d20d009173af816d63bbf3c20126fffe96b0f59e28efa1c00757ca192194e93bfdeff74fde13c57a28d18a5c149982027f68c15ca102942f62c6a80296149493eff43f2eca2905e53de48616cc152a40f922668c2a604945912928d277f88716cc152a40f922668c2a604941c1e2ffb8f51dfefda1c7fd05e3df46d57de6b6bbfd7d22e61b6c57aa2a742d6c1730f9f7b7a4c306c36089242e9d3674a8a0c3860e183a473a5e747c907325470a3938c871424e0f72769013860e941c1ee478c9c9418e303951e43c915345e749ce514e1c3945c8a9414e17393de4c420c728c74a0e14392ec869418e11392fc801470e113943e43cc961410e1039a290430a3a44e498428e0f398890e3448e34727ec821262705394de4202187891c71e41c21278d1c2a3952e4ac20070539aa90a3821c247292c839418e0c72b0e45421070d1d554e149a247214714a3aad7152c2a98d131b27334e4338a171f2e21483d3151c28e010010709470c0e12708e8003049c20e08c81a3064e1370ccc029034708385f70c8c00183b3039c30707880930353114c49386c9896807306ce0f70dac059024ed28d13372bb839e2c6e8460537546eaeb8b1e246cb4d153745dc107123e5c6889b14dca0e046899b19dc507193e5668a1b19dc60b991e226063730b869c14d143750dc3c71c3829b2a3743dc087113e5a6e826881b206ea0dc3cb9f9e1c6879b1e6e54a63126384c5030b9617a82a909262498904c473019c1a404d317261b98ae98a230553159311961926213874d1a3668d8f4c0a68bcd17365c6cb4d80c6123844d149b229c1ed4bc5133851a29d440c1c6079b206c7aa869a3e6083548a861a3068d9a356acea8d15223839a2a6aa8a8d9a2860635596aa6a899414d0b6aaad44451e3848d1a3541d8c04113070d1568d0a80182260d1a22d0c0a0464513041a20d0944133060d189a18d4f850d3038d14345868544093021a24688e9870cc31130af38df984d9c614c2148346ca0433d59868cc3013073440cc20cc22cc1bcc2f66976983e9c5e43257b38bc9c5dc62d2606a31ad5842b05181c98b09889c31333fcc006133c63505cb4806099923648c648cf02b6686f05470312113c522423fd129e82a1619355b2c38fa8a0504cb0839516815d8acac319a05396ef40a72b6c811a29ba841ca01a3460dcb8ca9440e1cdd0216c26242bb20878b1c2af4949c29e478c302c25ac34ac285021313da896622e70639aa86a266ca9584a584b69263044b0d4b4c53b1d0b082c8419248d7132e363022b02230299811d810d80930240c50802b09272c4e3d385d71b5f156d718b08d9926c80461060a1e46526130ae1e5848d6102c30d61939502e1ec8377470a0c34547c1b4e5948413146aa25043058f024d1197159716ab059717971225364a3c28dda00446a907a523947650fa81a94b498c121caf0acb0d6b8cd584a7c5a68a67c555c675c625047fc2a57028a014201cf38709c47cc22eb0a1c2565c8c23c18d201346068d69c435e01b701716141889d760245c5b2e2eae2c3a893e81dc6215711dc1326246357d30bd611df17a20038425859f601121b190475848b081529a82c98c8b0ca9326d81a3841a2badc44c190c25668954c429e20c7a89d20a729e10b5340a4c63949c702b66cc88555862c808c140c02df8498d0bac29d6129612960c2c144c272c24260b6695191fac221f6309e150b0869054c8195854ac342c362219d61b561bd69115c6a4850c115715388839039b13f0103640a0419a656030c05080a5006b027b01e604460596059b028b01860593012605a6028c05d814ac05970f30283025b028b02bd80a30176054ae2f9718d70fae238c09ac0ab604f60466e532e232ba8a885368744093031a1cd078a10183e606345fd074a1b1018d17345c6856345dd0d480860b9a2d686840a3054d16345b68b0a0b982c68a9a2b3455689cb0a260fdc03a820d10d612ac2fd71b384fb84e80f306840202017f803e4028f0098cf26ca033058723871ba52a2515e0ac2153844c514d16d30c8f43aaf19e5850e02481c6888b0a9714bc08384cb0a2c430667a68249921b8c872828c94d6a2b7b40eb024ac27e478824d143021b0281c038601c3c129602acc04af8097e02aec044761ae715a8295f4a8d88ca141c2a98c8e82c3d820c114047f31d1c02a821504d3155619d6096ac298b0e028a62498da2815c19485e5031b241aa31810a0009e9906c40263ba7c2da1d41eb403110f085142242807214230761c9004091172cd40718390241f4002e4c891241010ba21e8c891241030c0cc13bbc3912244848270101214f40102ccb060937c0049112124581224021d841451428590048580044482fc4c950dba0149122442880829a28406dd8024890584908820c90d375016669cc021c90d4138b430b382dd8104414684ecb0030982664092a4c80e3b0465609b51c18ea08812ba24c8c892241bb8c036436585048920480434d4804310084040a40603cca46077307243500e3734b13b0821095a12940392223fc30492221fd09999b23714d901499125424d828490e088122544842c09c2e1481111a48cdc90e4484ac7cc121b0221448488e0404428a80234334a94a0c8112245848a20297233830211dc10d424a86626895d920402d9cc097687a02242459624c9414804446c66905824498a08115922021c84082539b28390224a28912522a0376f0a6be48624473c20244888080e458e106122b31c74c40344849088e00342846e085a52040724458408c9b1029462adc0e8b2852e11b62b958a3291e788700bdcc24ad87a3af01feae8409d6d8680bbf4d71d63d4a2e67e8add1ea3d6b1376a518b317aeca83df7d77df26dad63b7776ccd7737768cdd0ebddddba347df7d2e13bd5fb73f7f5132f3cac4d72edf3247c80c6962f4dedd185f77cb27fdf96e8c71a3f7c218e3babcde945266e635ecb664dc4b3225f93ac6ce715ef76eebb575b9474bb6f7c67d298f71638c3872a663dc8d2ee5faf3f806f0b63b46cf5ef7831d3b4ab9bbddeefdba775b6ec7dd8edbbddbedb4bd3bbeddee175bd88dfb1e7cce31f2f308df8bf141678fdb2de5c6ee95b26facedee09fbf1936f4646be6b4acbb2dc6577f477f9c25de8bb71ddfded7694dbedde2fc69fd849778fccf0010e6840472303948931c218b51d0c7048231dca1867bcdbdd6334c118635bcfdff5fcbd88f9f6fa9a4c1ac7c8bcddc37b017dea75776721f3d63c00b1e345b3bb2f6b7f98c3a679bdd7c2d734976cb81de17a43b8d776efe3c7bcb2574a99374380f7643f87ddd2df6cf85c3ef8dededcdcdccce94feb8dbd592f0b9d65f1d4bced71773bba1563afd5fedc5fc9e7b36b69bc7b7b7070bad7dd3db67b778c0edd4fbb32c66e993500bca300bab97979bd63f77befb949cabe91b1a335e3eebabbcdc66e544ecd5eefcadce63d0574af7bc7eef7ae6b574a29a5cbf76666decccc7b7d5dfe9e3fe9fe64bcaeeb6aec5d524af9dc358f1bd71d67370ec0b3ee8e7105d0dded31ecf0ddde6e21c616ba7b3d6a5a6f7b8c31c6eeeece121063d6bd0f00edbd0d805df7ed861e978bbb71771d86766c773b72f7b6ec868ef364cb766fb9af1b3ed87d79fbdbdd8dd2bdbbbbbbdfbe17fbc11929e525df7ab6ddddbbbbfeb20c013cd90bbe6f17bede9aac1bbee752beb7beeddddecedbeeceeecfdbbbdb6a87d13b6e773fe6d6614327095eb34d8225494210148218038a85264946200400940260f815604000089014c9610722397c028e1431c2730002f0e85ce872b890830001288001786a70385224871b84081d1101910f04e1b063110086007042449604210902c1921d04802d0c413bec10b444490892dc20644910932437042d114264071c6e08128200232805c0a0e486a01d7a4a39dc2044c4034272d8a10892221fe8b60f145912c444c80210a00005c08043909024424a48b0e48600948e0431093a22a4099110b4c00208921c11020224454000822447727c93201c90141182a408911c6ef8c00792701c825d04042df9809025498488dc90e4c811223a0a8043d092201c9624118252000c4260083242e4880784041559225480a0101411422282259c8dcf078444c0824d93a01c84082129b24489901b76281282254484762040cd0e394c0b4392244b728cdc40c403478e245952801d22414b7248106444885093202400d0211404821c2bec20b4439126413aac4500922445846e20b20312224b84840815094108927439168626453e10b4440967b38448d0911b74982009f29a45801024498aecb0248889101c900429514244481008882c4922b48310a126413a982009f202685e3411af6bd810229ef1a12122a2b87008110f0d110d0d0d1111c5a1a1a1a137e43d64888986867c08112f5169c8120d1111bda1378488878686868688de901d1af221433cc443433d648887867ac80e0d0d1111f910221ee2214b44740d191ae2213b34d44388181249226b081113f10e0d1111bd21434b148710f112c121bb43889888e80d592222221fb244443d84888978c812f19008bc14f0ee72087620b201717471c612a020052ac4912a3d14a2548983827dc6edeed4feb894b71a84466e1be2d40f1b47aa2847aaf4bde960a5c44529fd552afdf51e4a89737239c1022b984041173aa892ba1e4ae9a140297127dfe1b7382017fadfbe77a24f06fab0e317d87baccade1e53efbc7fbfe4d13aa7ccf7fdafbb1d8f04d8fa15df32c58de8fe83d1924f4a6f96d192dbcad285652fcbbc397b5bcaf6c2324de6c9c878b3cc6ea66d96edb63249741f939999c976abaedaad7618ba4f53f36a6abcb9060cdddfe2a5af749556b551129217305b380b1b7115568d01e3cf91d60b577745b9dbfd3d185f8cde1cb9dddf83305acfb2bcd97a3046cb92b274bdebf2e6cb92a5d2756158a63d4df366edc2b24cd3646466e69bd39ba796b14cc6333319cf99314d8dcdb3b1f1669b9a6c6db235ed56e7aeb042b638a7773a79f38926e3ad26e3cd06b3319932de6e341f4cb19b8cb715341f4c17e7e1e078338e9491cb637fad782365782801db1d3572111785a129ae3eca9cedd26c775977fcabf57270a5c4ac9c44997298e5d1c4acebe5c71ed12f4bccca61c2f0eef0978c68a6e4a8c2452c858bb8e88a991dbd17ccca616212ddc35f3a16790f7bf11d7f33a8d0a3683485eee12d7ac7cb7bee42fd6b7ce2d9919bc0e808b303c985a418c68401431f57b9e8c50c08aaf8323e1e4c7e6c9bc6d49d4eff7e018716eaafd39c049ac2df2fa210057defd328a7fc32346a57406c41f97368d4527ea1eea151f147a051bb122289fdb202adbbf2547d5a7d9ebc2421b43c8155b0ec2a081ed0ba6d50ee473103da47972c9b0f2eabcd07972e8daaf31bc528ca93f2c7c00cf0df4167a86fdec47c5a7d28dfd0edf20509b4b9ba5e28fb54a0a98f2e3f3d1b35c32a77c29fa7bbd25b8f61966571ee25eee37bac33d6dee73ca3299fe6eb53f9bcb2de9fc3342a7b7f16d33df3fdb98d46697f595f9279b9b15177fe341b17f98ebf9f4aa814a292db5c0372ed7df6ad0159998faada973e7becafc74a1b767155885effd3d85695d0eb57b3c0d212b7dd49ae3aa117c7461a0636c52adff19f58ccca2b5e79cf10dff1c7647845fde7265f93dc772767b61f66de09516ae6df3644cac7b82a2faece13955c0d42eb111e6a8489532b2598f90db3c99fd9a060abd1c0cd3c6f929bd97aab3ca868ff8fcf7012d47f66fb8148b5aa6254f4c4871e54292844292c6e46ac0cf1a4b0b406b9ef37b54ce73849eb1217d8eea8700a59655ed7c6a9cbcbb551e04777fe6379b84c0f544f3a8aa64293c8a4c8edc1cb83df1f6be7c2df172f3ddbeba50bf55d6de1a3a579a4a017980753c04557b8888dbc07fb2cdbf8b16d7d07f2eed38ec7a7c4cdff5dc7c383c56cbd674fefebd38d5c9590abf371fd3f7cc725e5ad4a2a23c5ac3c0546d1a80a8fa02a2b82460ea7505885a7507f78e43dd7fb4330fcfed7065f84619cc8ea1b26ac68d78bbf3e06f85729065d126995c1815fe85f1579a17b03baab2215c55863aebfccca5b683f6f69d4168df2ba6168ff220de9aedfd262ee2a8831d43fcce3551b18cdf6f09e063c595948299edba3e9feae37ef93a944fc562f85b50df6f9d71874f48e3f6fa7eedeb6a9d30ce69bd2a82a1f958cf29ba2d02145efd4a70589f6571eea6fc5ed4260fd1ddd5fdee5e5ddf7de3d7af4e85e4dd49f3fbff77a777a0fab7ca7bf9f0233ebae9fb5eb4987e9af4fbb1f6e5cd41d4ba1fd6e90516ca6fa3e2f03ae34a64597bc4cba2a559f6e4fede84bd513d71df469aa4eba625255d2eda752a95455524fca39fb77b9250c35a0a701bd8cfaf3f6fcf01dffa3d282d99ae34a634abae4e938623ead9d98efb60790dfd99e09f08ebfe7a075bd9c8440fd2b0dad1d75dea92b06f5af25ca1ad08fe5e1ef39984feb2679a1a1cb6508336865158d0f1bb4d1ddd219ba5cd85863ddf9c954220aaf604b74e038e8be90a4d6f363bb959607bfb55dfc4253f8fca1052174f8d6fff44f6fd6eeaedc7ab79ad1dead5fd62eeea0fcd085ca4363a0fcfd949988b9bf5fe5aea4c989b298c11359c818e30427489192a1753ead27f6014bb204127230842e68b044169a163350a1832e9a6085104d202395d1fe29b320a2f2830ec8102345142ca801b66e6411860f5c8081e508405c3478ddf3524a992bbd87552a95aaa8f2d0fd4e4eef19fa8112b88861869820002155a22d7b7770336781ed1cc25c2fdc0883d2d0f5c20944a0278acd30ddffe99e975a2f5b63a0fbfc8e9ca80b74bfb336df4cddf14b6207288c0045163dd0600a95f4e28d1ea8fc94db49f2f5f2ad5fefb9b8e93bfcfc4cab89fa4aa552f990aa3aa8efa0a9da51cf42bd8b942ca84b6e46cbdce93d32c51f37b9bd4d4a99fca64631e59ffc3a1ac5bfdec3e407478c61638a2a82d841cae9ca0a16d4dfd4a8a627fad33fdddbec8ebfb4997a87dff4c43cd15d597182dad05d599142773067e4e110d87acfea8b2954c8e92e0fded4fe64060c80830372751ffefb0a6dc0cc7d78817d23d0dd7d397663d7d7d7d77f9d8899076ca61fa80500b0a0432727c70967851b934d0dcd9c91d132ec2a492bc2e7cdcb637f351d380e6ac5ffa779eba9c7b9dd1dfeed6d290f3151770f81e33357e57bd9efc96ddfb3b85f728f6efff6af77dcaa90f7f63b7cbcdc924785bc9ff0f7efe7f5f5fd7adaf7a7abf9d39f266266f2f6d1f8f0428b7fbf8415fe76f71efc0739d9ddfbd7dd7befdfbff73ef263a435d678bf8bb22cf956fc2aa5251bca33de2f57275d7eeba1fc6a3dbff57d3531fb6b46fdb34631e72f3794c5ccffd3567d52e8f11a98ff72d544f7678698fdfbdbc3c7521d380e2abff22fb30d987e6b97479d747f1715bfcadfeeb8faa87c6bb301331f954f8d3ce7df9f268acc6030e7f7ef0bf4c6dcebceb99fce020c25bc082174088f9c5646aeabd2b912228c0e21640821840c397ed25d0da0185522841046871042c83d77034ea14547ac8217336ac0252929498b8e38855724c384089f11d314ff6df13d86cc3ce104b24a25f9117e7c4b72db5d7ceb31eb02efe166fdd380ac1fcb11721b9f3c0da81f4ed3890a2e9820554e8a7c8c163ec60d1f430377e315c924bda25724b3e9637c8c5479a1011524a4305768aad24aa5828f9f7cfec71a507cb72ecb7adcc64dc6885d253884c687ffe318ccb8d680a4f5e2931c43c82dd312fb1a60c82bb10957ae5ce1455252d24a87f543141aa40009294cc71863fc7e0861e408e38c042085d80c3a26241925d5206909495796a0d1c83d55a98ba77aaaa4a4248c46cec72c0fffd9c476346534724dbaf32f0d0132182ce7693b1e0aa150e4c2e6bb8e87c787d63df2999f7155d23c569a365ccde944c3cda3c949297fb7f4f544e58ac2dd29bdfc1227b7fa429199c4a147a435fcf22e278d2b04297c2b8b18638c985b177848a315217ddce379c2e14fbf1a3ca4958ef8049fc949d6bf8fdb9391bb9bfb79b1ddaaa4bc5b7d94f9997bddc5879b0e7e6493649214d6d713abba737ed205ab2c56c96c7227bda4a428258b65cdaf3d66bec220f3b5001a9c14c6af4ee173bb6d8f0c557af8bb3dae87cfcb000af00bbe5db204e1f11e25146006b0147ec17fce9929c39d34ae9e78a8e422579bd60d83c6bf36a6a5ed6d075f89f74896c20cd87d41fe53989494d46397476d2abf36ad2c85fa07f11e36f21d7f29f7a89e68dd23ea8f651b5336c2fe745a8c8db0af92ae174435f88cdb30ae721d008a1b8542a006e4697c8cb38bb783500362f1b68ce42a5318b7cbdb2e2cc3f28b2ec8d8519fb9eb6c6eeecb9e06b9d3054ea7d28b5540f81246f832c25f1a238cac01815cf62084ab0179f4c5d7428fc6f89163f228e45e6c48a567b6510ff63b7cfd4bdfeb7ead01e92772e629f3951ebedc1ef1e197b687b4b094b62740f0a4e42600fe93d203f1a9ebafa16b8b9b0028875a72306231c2d2b6ab80e7e4652f9bb19d0ad872b6d866ae01595f25157a55cc0d5bccca56f3c1df0fb7369d7aab5f855ed4801edceaa4dccceda6c3c6c799b808d36156817df2bd476780ed8eca46d41f0392724eedab4ff615018b7dddd9e87bf9d5d4590eebeb89bef823430c7ebcc706dff16f81c2d7b8da02ad279a9db013bd4eb4b4aba749a0a9c51d591efe4c0430d45f75b24900f22294410623ba0120c2f8bd816da3604fff468fefe1f628c6d9d32ef0de3f6ede423d8373424dfb9be831ebe01931578754945fa260569e525b4521f4d1749707fcd568e8d4fa4e5d240ab9e64d4852f8bdc9ee7cca7a4aa2f073f01eeb21c757a87f159a3590d96423fa7e91686d23bee2298beb31bee3ffb898fcb58da8ff26d1da46329b4f484a499fd163c17ae908bfd24840d2d865c0f5e2fd3c9de4bff7b3bbd37b721b9a2a95aa871496f7ef2d23efe3f3c34d0712f3bd051fcbd121c47cbf147e7c0fb51f4bdf632f7bf0f9dfc67c24a3fcb69a3dee0c6e4c597b5c364da7ceb27f42881bb99ac3297b1eb723a78d9c5c5367f4fdfbd7a717c4ef6841aeebce5fb2a0db274feff4aec07fdb43c8b778da0c4d23f79647fc48646dbb5dfca7013d274fc899781b019b26f8bcc113e55f0d4807dc6a47d97af8ba830c7983dc6cebcdb9d8cb56bbc0a38fd380ac13aa6614fedc1eefe1c37fddf3dc3cc1af939ab8d37b0fcf5b5c95148399b59dbae3e9ceffc7ccbaf3e75f4d76e71794c9148bcb2df3b8b73c6085143e9b206ebb1dfca701c51797ba06e4d1f7d374323d13641803b97a53ac784b9800e94de1e24d795762d2bbf2aebc296f8a5cedc020e41a15330ae126b14c08ffa7e326b78b198d4ee4b6bb139fa4b189b422b420e48e6434d2d5623661b7182b0c121c09068e847e2b1c09a390f33193091fe3631cc991ac30b20af5c7b2fa8a68fcb7552091eef2a84d82acef540743e3ff747542853e28b33aa942dfafb6dd45ae3a9942dfbfad3a128ddf5be41ec799679588c6e7b8c1af4f45dfaff5d5c7d0e749f439d2c977fc1d8cf75cffb87ae41571c9e629bea4f14b5c9593c6975c9d277aaa4fe343ae3ead275a7745fd5da3a153176725f98ebf37e14d89f54da133c8f81af55ed12ba2afbb9555ac8648d8eea83cd41f035a69bd5f5fbbd2d7a7f0d7a7c35fefc91ebef41eec21578ff050ebe363d62657cbb4acffe96cfbdd818f6dbb3bb5a3f04f14fec5d513ad934e0abfc4d549eba43c142a99f4fd428eb93a84bee77f1a90a7ef7f3c426b5b1a2d8b3bc2436184f021878487be4ce41a10cc42aba82084d17a55544a907240cae043cd47d34b967c8f164cc72065e86280f9d5a25b79a8ecd0ad9d6a8a0d7b6425488416952a54683f5f254ec555ee32257295bf4cc8a9a658960664e5b3edc7c78a8f4f1799490de8bdd47c34f52f65174a3e9edd08bf5a5c65328055fc42b6619b952bcae4971b6f21b98a6f61153380b3d817fabf4c0e8306cba31fb24a02903ac75b96477f89055be2e3c294da84c664238acdf4f0a854aa1f52cb2f1b7543f967146a74f0efe8787c7eb25049f97f50a08646c1e7b761087f0e8d2a517e2552406194ade7e7a2264e58b0855a36a0d6470dc892b10114be8483c2cf1ad543e116142e0a86a700ea5582a0fead01f96e4ff76a406c442d7e557835a711120d2788b043df470de89dc1bf0224d07700fa9c40017d38886d3c57a954aa294cc080be7f2fb3693ae9f81d9d0b3c53d0f731348a81a0ef7d64f889c00f0a04d982beafa151fb057d6f030786b441dfe3d0a88bbecf6177c5c41bf4bd50a334fabe49a376d5c40ff4bd9346b9a0a2d2c39346b15064057dcf521ae5f43d1ba5600b7dcf4934ead1f7fc9ea9346aabac80bee7281ab55fe87bbed2a85d5169027dcf52346acba0ef394ba376a5821dd0f7aca5519b03fa76b58225e83ba26f3583908223d1fe961770c30a1ff4c046117078f16ede53a9542aa3549581bedfe569d47b9ff7de7b4f6ecfa6fc356a0053bca05dca81154bac5ab0440fa02c21842d9660821666d6d05d2d1185254c91e265ded05d4d7102698a9627c63ccfcbc293c69ca1bb0202a90d20a08081316d7ec8c64c19baab2094a0f5ab4c8cee2a8828689d1a108298a279be7b0208eaef024f1058f0bc226cbb074e6a6ab83e9fd6b9710afe4fd3b03fdc170dea4b86bbc3cc8a0efd9262d6f56243a3fc7f644b4468f29eebf4d867efbdf7decb1ef6b4f7de7b6f4a5725fe4ff3a6bdc7ae92b466dcded582f9fc4b44dc8f4abfc743fff5bef180a586fe8be3c11fb64708218c97f53f0d2184d08a57fb15c5ac3a68d8d49327f2e33f29fdf53bba7b39f8cefbd2a6c477decbedbde55566c7fdf41eef864630a2efb197313951fe57f41e6b3e34e63ceb22db23fd374cd468d894f5446c5826a801a6c888fb82c1ac0bc6060e34aabe21cf881b2611a3b44a7fc518638cf18aa588c518638c31c6181f8b7fc52fc597568cf1b212e39146551da146d59c264a628cf17572b6c7d301b63b6a4945e3638f661ce82e3261b9a3740f703073f7141aab60fcc4bc1efb93efc4182363b5554fccecdf93b13d3ebe13fde1cbb8158d5f7d78cb14303e554ef1b3d0c85768fcea432357a59c5e5c4af6627141b215b00ffaa4c6448346268346f642e36f6d158daf86eee267988ac6bfb8c886eee2bff8bec5bf5c302b7ba1f1e373188d3a6a54c5f9d2a8ba5f68fcf8eca551fcf16b68547ffcf7d27bdec78f8fb33d7644ce4849f55a7ab114abd3fbebdcd1dd8bf38969bd9456e97fbabd24ad08df5f2f8044dcef05d663d795d9dc43d3a1217ebf06e0fb63de8fbd06fcb3efc7b0f72d7b97d19100bfd761da74e9a63adb7418db7452d2fa9fbe4ad6bbf5bc0591be637d5bd64bcbb22ccec82635159876bdcc6b40be7c198e072c35689c0ebff69b92cf830e733a41641e039b9279ed65381e9c60d1c04c135663a4348e07f932cf03961ae4cb703afcd613a578b85ee6b5af41e6b5e7d738275898ab417b8b7382bdf64eb29779a2d4a63675fda630d6807a890e33307d8f814d59bf04287e101dbe361d7ef99bc241fabf4d87069997af0199971c0f586ab05e7b1e74f8af972ff31ad0bec4f160713acce9d070bd7c0d94defad25baf3dc4a13b6d93296deb3bd7e62eb36d4adb36756d9b2a6d9b925e65e630a43bff2a37cc4aa2d7ef0b66d90f6651097e43967a68d5ac268e63d64c5a312bbdc75598991233464b124d912898fd3feedb9145e22a4c7e61fbdfd6ef757777774368c9a78367f5c826bdee608c566f9267ae2c95aedeeaf4d1195d6859327b4ccc2a6953d9a86e8a716606dda559a3fc5907e5fafb85ee623fba0ba35b0abd27e71e3d3266954166a55276bde5814959da2f7977377cdd1b345d9774633657330ccb324d939199113eef19b6642a112d95ae1d58a665ee892e96652e00adcb54222ae1152f4b3ebf9a3119b631c2117d3f85331f6279bcafee51f685a765c29aae62fa03537ac2845cdd304647f47d7d1fbdd0f7ba98fd6174f72ccb8a96b4a4252dcb8216f7bc74f73ebea30bcbf4f7cf8bf7bcd4fb77d4a8a54f876965fade0343df7bf8f579a14fc6a328bc5edf5ddff5ef860d1b767773fb62f09d3c3e62cc7dc8c5dcaf5326cd27036c9fa7983a4b1f11f369a4cbe509165a3f9b22af983c4559d80b23caff4c336ce93094ff1233f7314884597b75f21effe7efd52bc2d4d180f3f0743450e2017e49fee3746a786fbdc53989ff9cb3015aef9c4e0dee04be3f518a2855e23adf1133ebe9599be44d59dba6e2b629b86dea6d9b72a02027e7623eadbdc29ee895a9f66ad6d91651b75bc17647b5b2d09e2adafc7b82e5d15f9deef3e647ec0bef0c13dda7d177e43bfd15f6b08cac2376a7bfad2a67d0b6980043639246357a5531eb3b3af29e78148fde513c7aae49a06398e5d1bf5a9088e43bfd3f1d91bc47b64fe5e94a5fbfba518d48ee4611c9dd2822953a1e237938372aea89dc11ed7e6e2aa67f8d47f5444b4f98351ed17efee2643e30dd1d75d7f168ea1031275d2e504882be2d47071293b7d0ea53c0b8d1f2682eb35a57687f7d4746b45547b4fb5f1793dfcaf2da62a2f4484878a130d0e52285228acdf8742783bbbbbb7b8ca5eb7aec8a57bce215a347df22e7f303051721dca06ff9bd081261fec83ecb1e7b8c73a27df644a99920de83713a35602ff3329c1399c79e28359f28c5ef45dba329ffdc82f80effccf6c377f84b62a6cc36b54d1a615e5866f5792cdbb0ed8798f5443989ee585a71a15bc2ac9df72c0e8c52d58d287b12d9b6296cdbd46a5deacdc7521d474c1a5afae5a2461874351f3454c73fbeab802c0e8c682775c73d66633a05093475aedde8cecb984f6b27d5d0e55234055a170ce5189ea7b4847951318fd07ec77e98788f6500fcf8af51d7c78f9ffd6c54e923e783f3c58c5f7da80cdccfb52d91afc3908a5ea57f1f1f6e4b84e6d38062a9f48ffa0b9529854e8f98a8cf4f24bafaf22a94dfd49d494777fc5cd45cc3ee86dd0e9fc4a494d27b738e9fb01429a24001120ac25456c16fd8c5066174b75486ee0d806006855ce5e19946682309313e45e660ee2a092968f5a22794bf3af5a21374a1fc2ea5fa14a7c259666595f748793497084dea4344d917f8abfc1286124ab0d1c6acb76aa2fd588cf159960f969a9c52f3d155f6d1f43d56ca5cfbd2f3e1f43df61ed47cecf2f07f1c8e1bd3b9da6f3de49a9f7427df351ffdf2fd49a3daa46a94e42e2c66655589c6871761f014d3faeb8af966d00fbbbb39b80949ca441a812f1f5bcddd8b96073fcb606e1223794fe97969f054895bdfe9ed3d84db7b6babce092535e96eff6d4a3637e8fe5a343ebc58a20aadacaa5ec4468d6255a376b5c414cacf4fba8753cc49507e2f6a547c7e4c7edc2ab7aa0ea968bf5b2f97c77bb831951b53ac795ba61231c5d8995a1bfc1fffe9b811512824c754a6429d53d2ddfeba94eea6f7700fbbc31f85f2333341f9a7f76c8a59e5465ed41d7fb4c1ac5e4419cb5caf22dbc60a1f4bf9dd995be7770d889d88ee79d9ebf1585584ed63d66f4c31cbb2fce373e4b8b72dce8a568cd647aec69fa1056a24fe72e4aaacf1b76634fa889cb71bc9eef1e4d246174af72587b901752fa83fa6017914338f708200d4ffd280fc48a55241e9ee96e105455054610611b46cd1a6aee9b6827677779734a036c2cb3f1143fdb3690412f5379d8cb0a0fe3afcbf51bb3a0208eabfa35139a8bfd480bcdb80148608e30c22bafcc0031b294856115c687f0f8c30f2a1fd9188091744a10a4a24a18b1a7051a3d11a039502440fc8f4356a7950c414d44e0e68ff9b5bca688de149aaca40858042fd7d50af5100a0fd52d0fe961108b23d98fafb300984b0461457242db1f241aa4a9a8bd618a8fff2346ab944e1b260a898feccaca3e7a59c6ea376450411b4850ce9e7349d746063cc120fb22b330601eb626a74575286a06d9938745752d6c8ac9819dd15113dd0d3098a9e4fd349c734c130b4cedf81e49fed42f73d6c4b73625e74574faad03ab3a329e9ae9ec0807acf4bf1778d5afa830418df81dbc9347f47e7c2222185dfda76ac4077058418f4d15d215144ebf37815ae423b8e319902417ee8603a69547f93eeb6c7fbfe9dedf9d15f11501740fb0cdafde891ee48b03cfa7f784f0978a7bff988338400c33ed07eacc9f2e8c729e9aedfb91cbaebfeb883eeeeaee2bdd2e8e26042badf59e432f9777be4efef16607b24c766706d50ffda835adcf64e6531d4bfc240fd2f1c4ca74b1ed58072581e63d460d584df5b7a4a77b0fbe34329e5a42d7dc7e1c65b78d59d116f4982b7a0f1c1a58d156fe9cec88893e0298d7aeacf3960acf116dec22de193d1f2f06f2dbda5b3741775306b67a1ee71081cac8106f52dd4bf3d071d77307f78bf97252f0827d19d339828aa4c9e52190cf58f5ecc2ded56b952d25ebd9649c0fc37f5de391efc9fffe374f62d33bf12efd159fe26dea3b3bf29dfd6991fc7f1f80eff0fe6a636f5b3cfcdd5793ad5a77557b5a37557dd0f0c6c7760294e8706f8f135c0bf1c0ffbfc91e3014b0dfb1c9f077ec8c1dfd4a9bbfeb8bdeff4c36d7da79ee8ecff20fcfd36788fcefb4d2d6fd277fa77732ef335ba5c8a86a0ced529e97269c3085a7968ff13fedd30dece05e6fda9de368571c64f4cf8f1b9f214f895ab04b11ebb56a0c3367d1c853eee81be5f38e87b24f9de7bb9618053eb3b3aa217fa1ebeefedbd6f61bebbf7570c665da41c1a55a59246551d4774344a0bf2c4fddf4befe97f2fab70fb975d0d2186eeaf0de663e9fbdd517f29c6192f796fbddb87f2de8fbf5f24fadefbf81ebee70deb8ebf1d1fdbad2aa1f05bb30053c8010579efc5079f8e23267c9eeef6f7e126793b11deb30ae67bffe7db7bacda9c6734f9ad1fe23d9c32f58ebf9245a21ee17b6b935e9d50c762d65d86cbfc49ddc411858f75916150de2f32eccab55805f37dfd1f393f1168d47bf818d480e27b4f89ab52724f21171f48c711f33d8f0fb5361d48448e9033b247bec276073731bfffed802976f6eeefaeb91a8476a33ae7addfe71b8f3681e6aa8e23e643ce880e4c9c5ab97e4bdb0fa57742942afdb595a0f45867bde9607d954180e054f6d9974adb0f3f38190a2fb3dd3cce568f509cc75c03bac991dda3c477e05f7ffd6b54f6d7e778ecaf4dfbebfa2ae9f56cc5f721f3913351ebb513bd9e88fef8b5e1bcdc98aef04abc8785d7e4b3b0e5d0b83a698ecfe1aaa4395e7b1d20322fdf870cb7dde5784944354e0748f6dafbc871f3337f71442b70466e5a0372c35522ea385b3d62c2b6fde90a94e80a379bccaf264313c4fcd2634b533477e585185a7a99c716f3ac1ea1d7675b35d12c7bec31ae4e7a5dd767d96ff7b0f0f27aec59d8b677b2fff16baba7af796d63c214e75b03d27405ce88cc979eb519e6977e3520325f7a09acf0396e3e27e2bc95739363850d0826f33340329cfc6cb31e678bffe3d6564f9ccd639dadb0951eeb4c66aba5df8188cafc0ad86a3e88a80ef63af2ad27a218a7137f8527a2da86c96c95a9cc675b3d42b35f61f3a1fdf57103a2657fbdb5f9c05e7bb901c95e7bd62420f33832db66a5373dce568724404475b2d701a23df63e346ebb93798cdbeeb427a219a703e4faec7d5c3292ab43b4f4339f71daf5334f442fae12d1d2fff40a1bd39b9bfff19b6dbe69ab11a0336fb3551be8ccd76cf5089df920def352f06d781a10cd725658f8d5ac147d8a056ec894c2c284e9bca193ebba83a52666dd24258d724e820a31e5d285ee17baab5512c5b0ebb54b53d21dfca80179f6327f6d5af6329af67c6dfddad6d976f9755dd7bbbb5077b04977f0317ebc2e73fd4fef143377050531d40074576fe480629d3d0d687607df0263625f27a7e03769943f7c278d5a0a2fae36a1d7fb66d14ce32a11d5de37deb255227a699c0e16b5acf74d7eb6c95fcd6223a801f9b6e451df74a492465d0f2f4e88698903920f5fa851d6437e42e1c7d5a90d30036ca50ee6ae5661984ebf4abf8fbd17278dfb907fb86334acd498f179984f2de93b55a60efcd2ef914a95d2815c10ecaf771f7c11a38b2ad55120c85becda4ebe03c67c6afd885c7fc13aef01b23bfe3e90feabcee1ea874c125e6c990566d12b8d29697ddd76bed3ed2c0f2f4077ea411d86ce73707464036c7758ffa8f53ad66f2ad389ff68d489bf29ecb5dfd1289dd22f95bfdf354a07ae0bddf3bef3de337d9853bb7c50dae4f688c8ac1e609ba977fae3367f309fd687dcaf4afdceb0d6e9a63121dd3426d3ed2b8df93a4adbc97bdab087f990ab3eb49f36830bb2ebae5f7675b218f39dab3e1d44626be8ae99b9025d863373eecfdd2f22782e2260e7d01dbef6e7eecf1d3a84eefddcdd9d6377f87cdd17ca2feff204219722e7afdf7b90217c9e82c95f82ab09c8f583527d388dc9ef8f5f1c83c9136666e67766f2e4078f0aac1fe397f5f2ee26e46f76a77f4fdbc35ed60b0df36565d07ac35efacbecc7fc6d7c2c88b2e2c2c6ea055f5653b8983a74575d5041f361e6a0bbea420c135d8491749a3ca73c9d4ecfc33ecce3737a9487b2b1066aa64772f7a9bba3e8807677779fc2a8c11639e80208ea37a0fe7fc2a1d921cce81d6c8f1a1441fd5f0b3287106300000807e0620bf5674103f249b3860f5b8cd1850d88e0c3e70c7182eda18383c0851007a0be4515d45f4703f2b949c9218306509081062ba0fe3966777777b7109e1662500f83fa9f648381c6941f5041258a1294e8165aa67d2085a085156a001c98842caa40bbbbbb7f050da8b5226e70d3650104ea6fd280fc14441a3630649102066c5183fad768407e1a81105a20593952255101c01c228cb7c4cbc19625c4a079c2acf20a351a80850bc8c0228e37c0152a9a00e5888b24b46081460a1833fd329ba6938edfd1b9708513b45f8687c9114cc8c284288ab27843c70a4184b11a19571041fbb3693ae9f81d9d0b3c3158a185f6673e2f508218585a3046063fe0a23313e58dc5105045196568b9e207564431401530a0fdd79c3078230a313f7882c4e58c9c53924aa50a428a0ab2591a02ed2c48b4c150b1d2a1a20c3366804519ab2a90a0fd3134ea946508da3edd39ba082c9606f4168c2ed43fd698885031fb4c2105c865d2106e8cc14451156aa0ca212303eddf7e9f0804e9ce9a9b1e03751968a1ae0319c4a1c94075a2d9217cd0d11d77185258098214550000162a64607902463b8c4aa502221503fdf11dfe2224c8c9dc24639ee80ba4a07d06ed6e180c413b89360ca4409b0ddaff4b3b0647a0cb8576cfd4110f344e539c0063d2c4a08a996d1184c9821722660eddd515236052b8128796659ae8ae5e00c5ca0b989872ca78500466884943775594e484283d685f44616247e70201e8ae84d0c2e3055b66c0eba1bee7ef3d43360c8f0f2e62c898758fb80c8105adc186466933f8268df1deb3ccc862658c27d54dbaa26a610a0b868aa1fdcf5aad02bcdd59d6d38515786c716ffdb3fcbd8f3f6d6def8161a34704acb3f8be317d5b3d2243671e67f07f0f3723feef6df09f26017e298fc8402157fd9930856f410d0846d85207f37bb5b4bbc05fc87dff3f71fe6237eed3f15ca0fb16677af163b5acf8d6b3112b72496e95b65b1774d0edd666701ab9af960d5b3eece253191f72a6ee2693793de18287e77f47e7c2efc87e68c28ba328befb1d9fa3071c2d7eb0363d945cf0248bef7ec7cfc78a8e40418b1140a0421c47f0727af2e5c919ff113ea22b5c9004106e5085082b53a41cc78a10a79295215ce0048a4377e50233687d1e8902cc5593bf9ae87cbc9065770fc287ea7ff0193eefc7ee03c6eda6edd1f2f7b3463537b35c1edd5298dbc1df7a84666fbadc0ebe6b40a010f5b7409e0379d49fdfb9b6d8a7c0765fc7c9343309bfba94dd399c52638479aacfef026d37989bfe75fafb1b61eedf9cf1e163719d50770d08b6f41e4ef5cfc7d3438cf19b337e817f888cdeb25f775713b3e30af47142903ad72ea0d8ccfba6f2ab6f537fa646fce1ff346f3bf805e7749c4c2f7292db37e9a4dca26a68d3d602db1d4e8618b08319ac5258fcdf3f0f4f141d10e183226e90832e9720d2d81e1b4c10822ae5037521bc2d9a98a24aed5137e4f24c30dfa3fc2d704118b46e920bba70ea8918d30c7f04ba93c17adfdb7bee0f1f8490c14c268f3ece08fcf7b0680554ae0e4aa87cff758f5c5542a511ffb8d5195f897cffb749ef4de8d186ef42cd35e1945461eaccd0fd1b5d2e4548a1fe4198759396bc46d5ac9a583a57e73c9dfebb8e87a7fa34d1c1fc15e87209220c9a45a8779264dd2496c252497764cc9702068d343ebc7822d384135d2e5254409b2e172254f408c3018cefdfcb759267e15308218c727b92ab1b5f843052fee75c44ff1e42e1ef569feee914377295fff1bfee36c9ffd396b54bde6b2eb0fdddb13309739f553dd38d69c4554df70b28baa07c01ee812e57796332c30c517daf03e4a28fd36186ee6f10280fad1b07fd711a22263fd36d05ecb3a6c3eb30a90a8c1ad3dbfc3e66da6cf09d7e9beeebe67f1afb69995f0d68e67fba04c49c2ff3d65f5ffa6b05337bde1edad3fc6a40f37f9a8130e7d37018578928f6bcd55df9ac97cee6ebc9f475aef034bfc266da7c4e3cb4fbaff91fe74de6b16dbead3e4d4d0d2714e9fcd67cccd7a18538e288834e9ac9fd74d72fb3f974d7af6d04581efdb20893a78646552148ad147dca8602ed009befff11a451fcfd3c8daa0488a16bd4f5fd2e340a7e3f017cb3d97c07fe369b8edee993a7316b53f66954c66d2696a1bbfe67cee706aff43cc6fc8f8fab0b8676658ab58a5560c61c2579415a8551ad8abcf01430abe7e5f5718aad9e32f3f5bc451d9c5abfe9d00257e55f7f713afcec4c05ea9163c2547242915a379c0e733e29197aa7993a0f7c2e2417c27c863a10d27e0a64a1fd4df849afa45ca1ed23a67218292bec48a552a95258760a9453a86a92a1512bd07ea646e9489a516e8bd6f5a244a688f29bb64dd96c9b922a9aa629c276c7536666e69771ebdf5fe7e9fd34bde7793baa0f7dbbea2230feddb1cbd5209587f632f35bdfed080fe5ef9f861a1001502eeace9d74c7d520f4fd2e91cc5683feb6233c4ec63487ed4f13a174807465da1c112d3d76fa425a27305e3e27350a0942281b03e22fdd1d61a72e10935203b292fddb7420f11e839696814d65271bcc7e3e821cc69a04d64ad1a7328eb57edeb88bff7473bcd262ae4e9bdcd649f7f8f88e7f652dd42b4be1c20e9642fde22a3fa1fe4d7ce43c7dc7537da8579f2dd487569f26ddb9132c334a31fb595b7ed3ec4cb4caa72a7566046c772c6b40bbbb8fb10fe6ae5a905443a3f683f08e46596fbd8ff596f53c8d7a6fc5772b066a3db6fbd6ee6ebb63fd8eb47eddfafee5613d7b99fc5618f7c1931faa50f8bf3d80f8c1f80e942739c677e03737068c747777778eb57437e6741a33c67b988add819f858a0b851007147e6d23ceb23c201050e018305728fcf8f0798c94733e83f11e2e02d3b5e32b5cb48bf1185e7619e95407a716c76396077cf8369841e1d4326b47618c5810b3abc838e0632e20402e80422e142e0e28dcd91dd82d8f2bf3bd0f69143c8203abdca0107e901a8ea4f7744e59b3bef31e226a744ce8283cd11dd2348c5195231a1f8b4a4cfe187bb2874640f0b1ce208410426f8e8bb42872ace42e773c86f0c9ecd3809c8b3298fe3f3e48a3e2ff8feee28c16d3df0705ba8b411ae55c85ef1ffdfb31df827417bfb71fddc59fb9c124a2cba948e30f0a344a036aedc752875506ca31b84079870eaed90fdf898f3dffae286bbc2b8a6d2ca5bbf83f3cae68e5221f1f1e9eda75ff27e7b8a8bbf83346cc1d7dd2d128fff8ef135da0b1c3cca0ab1624d1ac51fb721b15f9e852c1efeeeeeee67674c7562ea07ea8656053d7c5456e477710be0769147c1b1a051f3e07ba8630287c25500c85f0a7511cdf77a063efd1b03bf0c9a0100d0ad5a03072419607f4c22a27bc97724ece72a4bbf759d84b16ef29b23bef99b0e5f5e02587e5f1be07cc87f99e56ce22e59ca7d37fed68e52cf40dd91d7e24ca6f64c48e43a378762525093ab54cf8d31cc63a0186cd00317377b33b773b63c19626cadc550bc2a0ef9f6233389875c7e6a0bbcfdb3bbce707c88af53fede3e9e3ac147dcae29cdf7b3174175ff0a351fe3f14e89e4db91756b650ff21deb3294fd5fdf2a72fb3bf3e979d498411c6945d3031d3e2a28a59138326b0400d26849817dd5514465089228829a0884363c1b4e8aea018034512142a3018b6d87bfd4acdb2bbadedb15fdfdbe8f298efc50761f78bddd0c777b6fbcd19ee3d7fdba4effd78f0d51385ef21d710c6ba75c36e289999abdddd4f77d2e5dd79efbd7eef3dac24ad082f991c6860727bac5faeee4eba33d448e73bfb16e4ddfdc8cb632b746fefbcf7e8bdc8aff3b98e284131f91ffc85106e7db56bd8510dcbb2a2f55684ef09cbe2673d6159113e21ac08df13f059f009015f84ef092bc2f784258410d6139615e113c28af03de1cead3f8bc18dc9685f77b5ab5a99adf39d7eadbbfdc5c5b62d29a1a5a7a5f71e843df8793e9f3873ee96616e9747a403a824cb566b4341eb1c433432320084a00113150030381c120b86e30145d3761f14800e89a24e604e9788d328c761145308216300210400000000446a261503e6149e8dbbfc970f5424549f34d9cb91c88ebe71d40831991669cb2ed2f877c43d5b3f8d6e0997f7a3d8e874da3367d5749751d0777b90a571c0853ca7fdc9c1ff802e558ed8df6e906faf6a2d3eb1d8f8bd05ddacc328e8f2c47279be8658f3eded26cf18e971f36c003d6e1f0ffa27a082166e08b466406252377e8cdb1f5b1a8168d444a0af9025ef00fb77fae6b86e5c370155d80214fd72d0ced47b2f78fc2583c5bbda9965acdab7fd938dfd5907ff2c00d22be0570c689f6bec37d420d55ee7da69ab145b79b1807854355784b77f5c86e91e0ec1484beb5c106afa05248fe1f713eb5933a7290d0097a8004892ae2e0e683d9340552d704140608853533e576fcd33529468d6dd64a02057fd1c049adb3bababc4ac08af603504df344973f4fccc59b172ded80b4a4d68f4143bf6773c0ca920ba51a0f6dfc30852da848aac8615a6c42f3f4d409b2244efa7eb6de653eeed04c9ffbc658520be78cc77be5ed7a30222b762d7e7390d8aae00232e58c55aabd32322b3f8ee4af91afbfdaa54a3b2cb9e75a0caa99692b1e93ef0bf0bfbba28ca8bc345d7e8c50e36161ceab29f3c8c48b609960e410bc58478579c5fee76fbdd8c8a9f96388e26e1abb76dfa05be74711f1c08f79ae61a0066f173b344f5eb77d418f34332707375a9226feb6ec7e9deef6d5d301a6eb6a9dba687f9d3881b0db7363baca1e481342a3ee1d65676ab42baf7f264f5049350f772fde1da4f0d4075296edec24e78c6f60c3c8072ef768bdc751f3ba6f0fb8609763104f3157036e9f437fce8dc4ea6dd6d3ed026b391b56ecf955d5ba4f132b6955298a51c8cd97c77bc969db6a991c0e9591896b21f6727f264bb861ca63f88e3a4bcdec921f8e5b693af4501e2b35876da342fe01397e68ae31c2cb5368766479354f2acf627720dad3a3a93a6f8888ee7b916088d70378f1e94489f5e8ee5f3f94993ca0a833bb92995d974a51aaab9efb9ccf20429230a5ba6c4a5f578ef6c4f0d97a466b4f2f3d413dc83948ae352823afccf565dd51e05470bf30e71447f4b5e7e153f04477600735b9f438200fd8c2429ec6bb1f8cf0f3f116817d24a4df5355727fa757b5dd901f5a39acd1337a27ca657f889baa2c5b40fb20c6e13ae6c95f7b3a54209c37220f488b47cda925cb60d27545adb1be2aab6d538c9a4ef427685c82ffd744d00d3ee68e93827ba3b64139a2d1403f484607a6893c0bcdc8852933cdc363b71990cadb020cfc5381bd171513d51e07645032def933e4d684cf31eae60745347776fda3d2ecdc408b61ac7684f22fbcd34fc1bb6e33387f0e72ab33240bd7eabdccec6174401440fa3ec105cef98352432f27fd0bbc93e31c897306911e3ef8d014d54e220b892894a0fc83a342e605e338af43088eec70481f8d67c76f38a2ce6fd9adcd79b644184db4ea226a88b96edaba35a91021c8052ddf591eca9e67f68784bd4e34223a13ddcc36e023c83ee8e25174f970b558036fe283259846ec7f259105ef4ae7c48ceafb682d35c1dedc4751cd53471aefa3ac7a8a42b27789c4832aaaf63c97389fab6d6233700756b783aa559562373814abc7a9efff4a63a40a958a841a3bff8830eb1a3f8471c762cd56e3606f93da05b5398d80a9f80215ae4ec6a8e915233c67935cb05fa331b1b69b6b256f8fdec417ea3751caa5653e9415a138822d7c39df5302832bbc17f80c1168919614bda08267f3b579baee52fe4bea250a45114e243659925c29d17f3a6de709f6d4665366d4e207a96e762e452c0e70efcd62d8057fa9ef2743fe4e820a71cbd5a44c2ea939c9ca9afb77a838ed14727a37557fb5d2bec267ade9c1942fcd1594052da228a03debfd3cf6645b6e0c14d5006e41129cd8e64d99ba9215feafcca719e7e8cbecfcafb064c5f076096b1437716cec0f3e3991a33016978012cd465b8db812ab8338600f33998429e41a1881cbcf33d220f7c0e36288d4200326ee805e7fc040362e1f2d737ade64059dc8d163a084a064c32a796909c961b95845c5d2495fc444050ed901f0c8e086e99d609cf3b526efb030f5f742622a3cdaec616b8dccf381d850d92322362702176402a1f839ae0b204ccd8028f3c7e82a184877765a045bf4c500d3f0d027b5aa43ef08f34e1e2fe1eebff4d86c95bac02b68420c9a82f4dd95d03166e16661ebf487956aef2364bbfc1f8e890aa0ce6b20304f9080aa25d28c426487c751d72118648ac8131f5175d424fd083ae8d7fefdd343ec6bf61c234268986c75cd151fd6c6fc0b8389da1837f411468cbe40d09d7d1eda9d237c3ff4edbc70d64d1014c4b90fd84c643f3f54f58a960c9eb2c100fd828f9c423a7cd44622c5100485f5d36657d1ea94f4d545bbf8d4f5a8b9e94554d2537e7e17bfa6dc9b29a58cd3c247ce70f679ad94ddbd13224494fcfae3f47e5d1e5669b4466557a46486ece110d3ca1dc807c98bf950e41c4f66f6416f8530bf4d5c8cfc5ceea5d3fff2f62ea9409dac3941d75bc8658568ae2c85c370e93fe8466ce3600e5fab24203a092000b56ca3043cc1029a422f6c94e2b4a2bf7c947b77958834d145bb9dd4747bf133773e12a5ccc5779fbfa78059e62ddfb7aca83dc4857d69be216b26c8290d9b54641dd5bc95fc1eeac826c71544e1aee5acded203e9bf225e73883ea55a607b61ae2b6a346c667052c3534f5869bc6ad1235aed84c8f2a1c6b4795b3108eeea9af8aabe28bd0964b23071d05d6cfbb82567620330edb714b0acc595ec10bfbf66d3a1e6be9d19c9a61acf31fbcffae11db6de5727dc42f9806e336e4a86401d4942db9464f0422d2aa81b2dc9708ee5488649716f4f536be30fb3fa959d1cc2fcc10bed9d3b2728c98e773f46d168c7990e47007ee80f3f520ad4a023dd3c11a51c85d7ab6636e8b0369f5babb90b8568a6b962c9fdb13830b63048a0e319198e1785bdfe5f1a910ab507ffaad2123c4709d15a3b89dae0a44f54aee191f8d49c822bc6698b163d93ba038edff0c2bd6eb24034f9da26f67296ebfc9b595c88439dd09f19c6a0ed21add4f97f3bed901bee1b44221f474627048ac8e1703c77785301e70f0781427a7bce369126ba9fb675398d8fb4d3e3401d6a0dd9a82f301ce6e606acfcb31153b82aab60b8ad1586399302fd5b3dcdd1520d8b8665e43e520b73a866e3f1a492f7f1d5fc1bf338678985ee77c9998c28efd08639ba27695eea56f582feacf8414bb1282b34d6a64a74baa976a0198cfe1a4791c0696768a26e65166e5e167a35f37803298d94073e4d197c9043734d411bf8933d37bbf188f298724edb8564d62a8978b28b2757c1589a95e69f301a165a621c909c81117acf04cbaac90527d6ef1379ad2f5417f707f7febfeb1d6684867af15d18e53e39a947e317b9ce49957abdd2b23c38762ee80dcdb0cde20999dc5350342c47b92c6fc989b2438000d0b3848721f82877e0c160a0f5a631d1452dd706818055087d76dd464025274bcf9659127b07e9b663badc97a62a33661fab790909015f94d3b12d27cfa1f87ee1f02f8ec1626618593dca0c34e6515c38b1674f6193fee038e5db97d1631ae8ed6b504452b29c2a436a7f028a277a0ace42729713037c183e3de3baa08c2212639d8df733773b55d2f4ee745d9f185ed4861460eae33a1a975b6d44faa7d30baa4b8a974f5f1cbbdcbcf619e64c8c8ec2b4125d0a7c252b004c5b266438bc6c679c54aef7dc11e1ecb29e7e0283674efcad06a99e6d834af36ee9ebefa5e582f0b4c0099501da02a2e39379d08c5263bc2b39306eb08b2b647352a494716671f9960a98a35fe85f61d78d963618e0a974d6757ac82a0169bcdaa3c359705a5dbd511553bf44d94a95c36f565dbbfe37392199e8d9010759fe2bdb44588d961f2fa24844fced231c0b38ce212c6dd88358d76aa5e7ef5c53e1475fda176d391895bb3c57959acff90753ab1064e6016f516e4fe6c53185aa3141e208975152d0591965227c0878e2c1049a74b8cd41297acac54398160a98d9de53ade3e5ee6ed5a43ecf449ed35e1c251cfb53d1b5670d2b545da6083f34baea4bf99eab86f8aa3b71d5f73dc4ef9af5cc4635501f28f976e267d5afb5306ba41e43012550dc22880c7f8672bf0abd807b6fab444d3b8baf8ac0a4235e3d50f39adedc486c395d143bbfe237030272ef1c9c7a8c755d9ae6b90a97a4e4e416cfb06861a9c6fe4f2a208126e622f24f246150b8b10ed5d587d4d9469154a0c7f6fc88b6378f06535f97143a59646b226edf8f97ece5ad2dfaae83ad0ebcabc0f3b20c3b1537f004046ee6eb8c9a325e4bc05c495dfb9c65a8613ebeed7dd76d9e5f9d07f151c0ad92abc7c7f638711cf86c90a265edddf79caf00f690334cf2740dd4dbba57d28b2189efee7d2c0b05dd50b72c9569ae0c9bacf80faa5c1e037a0fdd5ec35926e4253caac206f81e0484cfd0152e56c9ca3f6b13f05c5ca3b55b4fbe2c4af7baf03829e4c74f59ff9cca2a5fb5d8f094d4c7f113345feb958c33606f9aadc96e51704fb4ff9aec5a7087939a208c305f9d25087ee349cb6bfce8f438ef8f21102382b2a56cfe92e8e787e5923555b02b70225a17ea84623baab3b33dfd4b633e27ed2831d94ea3fca9e743b3c8549964f96e10c3b5db432885e161c9f0fad6355424282c0ca8705185067a0c0443f9705c400822033ae9f88f2d7bc575dfa56d5b80271c13b39be9820a7b012e86cc13ab032ec288d8bf507b63c3c699f2a540ec7c6c86494313703f928c348e719f4e4b36de02a04d261f932a2a14a79467965d4a97c3b2f31bd9ddbc520de223a0d76fd65b9a7471aa8b3e0b58ce33bbf71001a63996bd62ececc3831739b45b3145fbc3779d1967b13d5d6e72cf654b248c98f025578a4a8d4e5432cdfba06f513d03ee81ffa87dea1bbe85ca3b361581b87ec1eea20ae1d37bcc227454208b145913b84300ae06ae83b33b22a969e064cb188d679f62f5e99a80fe83a2391f0876729175e971b62d570ee1aeb426a7f3522624c21212964e61df5a2dc1652e438093b62f2e62323ab428baa5e649214d5ecf9f1d40ad34f503d6c312d4573bb4bfb088310e34ffe9b68920ea709f3ec5028751922480eef2a628d8faf31a2cbe34747aea1011d773131b6c3a276e534fb4167248e05a009fa9e55dbdf7e38554dd2f55374b1ce15f74b1016615534e0ac071debd51c4bdd4363af5d66a649eccd0c5dcb81bba463513da63383d0318f758c6e39ee2e0209dc02985ebe75627d2df779705cdaae7a9fdc116e5b1a3e7785bff8d057961e823be7107a8637bb6bbbf648f63be9d7717e0aca827ab41e895547fb78fa45004ed043b458ec3d651c2373771f54cadca6d8204c45f11ca7165c1eb498de67d823a928b99f3b13e5c80de0948e88f67d1f4aa2c1ce5e613f1ffc98007cb73e3f76a763fe76277a50f8313c0a72c035a88e459a51f92ee1e535a5020432d8baae0e868ecf8b47c7e1fd9e335a9457fd5c9f9a2e2629d591f09306d8310dd46f0c37f05df0825a8cc36d77a4dc837e3263bc92094b6bfabad0948edd576f275f592430cc8d438222ebea3aff6572e32ecc5d4e8f45746c62955e85fc44a37011d755ba6214567522ee28a383780a6e60f8d0e8c6b1ff3b855578ace1ceac3bfd7c9808140741fe0d7141f74a1bf76922116d72cc03f92e9558d125f8256c2669f65820f32d63ffdf716e0a7f3377046f39a476089408dce642bcf821257f5a5d0c04bf42283695b53c2442b055d4a862fdb8e90b6d00a39d4e3f088685fa318e18e616ba3362855600632fa7146eebf59683ee5d70a09ae1ccc116e7720046d79437d4132a2a0b706bac9cf6b440a7f3656ec059b9ccc27283c0b37047573356b726b6f3448bd81f65a9d7745d1573846c7c0fe0de9506d78b2094694a045b658ec90fdb90a6cdab3ff3db9e2672acbbf7600e7d8c7f90509107a8e2946da22af1ddc822c6aad746cb241bbe83be8420d9b6b0fceec17b099edce6b9e0a5a7aee4867e0e50cd424400b5d274380b2a987a40861d7f57b0df69c278af0e846e7d7196017888772b14f3e9ed3bd227d396f1248c7b3f8a896895896b7bba54862b616e2cf3772272eee9f40d315857035f03ce08ff77cc880c8e51391ae047cd9c2dd86e7bc81e54fca9be6ee8214673f88f51e2a82a4da1c1983655e9473549904ebb08682d032e906d5cac11620c3079559e2c799a3d2070673f79ee1274897829f4431fd0859db5913990f09808b2ce4dd63005e884767cb2f3430243baa3f143691b543f0348005cab4c037a0c732d1a0d18652d2eb2885577e219152b6e82c438fd891db25ed5567c17d82394339f98050746dd3d166e6956bb0ad68479ab90a123d9b585e546010ce073fdcba34f6eb7af8ec7d77fec19817c1d4ae64959df0a0ed1ee4cf2f3bc6fd1778a8a5ea0a7dfecd6db59c845bbe1acb02ef9a1f1dace54741d27f05f0555e54fb84601b24407093a1e50ad314b13015e4048d8b6745044c5134b4b0706b0ba3a09b256c7ccb1caa9a5ab8cd2832f1d06e30d735f5e73274b26556b2378a4a0b4336a6c962d35717a7599900975cc90cc1c377ea0aa7ad94607e5a945cbb8c7de4c51a4b6cac061ac65d4993e6ff2b75036cd41452bef2cb7bfa289989b004d67c98cd71d57932da498db90349a0012acd6c258a5f7c58fbd3f90396b3b3fbadd34a2bc1e2bb775a3ea0a2d035bdce3878468130251f4150a4065884081f3337d80a7562d6aed72ccc387fe792058e598160c55d7e9325b8876f8821d3f5867961efa46e77d29baa91bf986d497478d641d0796934adfbc628544812c2c8505414815c1315e9889e0b9194022160d1eeabf66720bc64e506d45419235eacd74f1d10829f5fb00bf34a605acfd25cd9ca84d0f4f77ec44e3495deec91949c62198de3ad3fa3897d3b15c8edb69764a0ec58645c43f1b8bc4aec96d8d0ba737d12e964f394886de4383df1948e5a6dfcf49bce5329044604739a17649436e4203b377768f786c92920f43215e4c2967c2243eaf32c3cf18f50f0e91ff758fb331a135a325938dfe6342d592a4e0f97bbfe72754ee87c0904dc7fe294d884252b9211ac546dd5382e38992d2df09720b446a0c9f6d7a4c400934683417248dd0d0770236c5acc29035ab6af8604030d288b4f51d7c2d893d42475811cfccb805d783813e0ca3e573600b23f75018036de227d1190a6ae1c41465c7d311560e41b5cd5baf8cb2215277a3ea6660bfa841db5cfc113a225eedc5b990b6a65bc7432c646861fcb1cfd05421506b60d929fc27c944ca61acfa5b0c166ff4184c41af2e5b05dc3ac6cf4ca08870c443edb8679f427187d6533a14a251c7c0b5eeca3db6e69ff100a21449cf39485f09aa477c2c635028ce10a196c5d1f1ae94645fb183f05e8e8fc881d02ca5414b41e12d444c969c651094815facbd508054f6ed442759136b6e2f8063563574241f8d71f66f056ebb0de5e4d820407043ac76a41302853dea8659eceae07543c36844f11812e97da62165ad3538b7a8e2256f545962e3a249610127c1b128da2ad166b3e491b5485d871a96cbcef1fa41c11a0eaa173e7c0da87ac8d9b8e3e2f3d38aaa479231cbd50e0047dc53673ffd730c61159dd4d99280bc91d99cb562565582d3e2cac5a731ad9d904aafa07dbcecde48c2c37c34ec8260a4f3610539c312eb36989e850c2c966b200749d6ec2284d5f654cb2f6c225f2c3558d8c23e10c0f533280a8b60fe8ee44a01605ccc2a472ad94fb881d4e37a39cb902bee62b87e96d73df5e25afab5954db531604805bfc5eeaa0dc8f35db74c08bb7c77dfd8034520d709719d1cd569794fc54fa352f863dd10367c7ef1f100d5431b5321c8f1925096d28b3a37b6fc382f41e646bcbaa7c4355cfef8241db18a95b39aad8e7e575fbb5971ca2a5ed0c0c3d9397e2795eccfd1489e62669d25a9c3e2a45bf4c4c496c85f2b2294a33902aba7c2f61a811693585c66c47c7f766c3810a2931dcc28d94a0d098072cd36135a02f6153919a3c9db7a807a23362151c64eefd7685b4f5c05380288e7b740548e4b859ba6f543b7fabd92a04a424502d03fa17175697629b9a8160ff4b111a571c8f095ea5d4b1bd06d33234ea31bdbe6153e278fc524f5fe82cdf865f612bf12be0146bcf12373c9a15aa49628ae93eb850e533b00953251db60ed8ef2c375cfb4390cd7f459c27662453ab9d10ba62a0074a971d6a74bf02e3e6040ee718093e8d48fc530abd08bb2e893999766766b5bb9722db97b83234eb2005d9d7ae4f06650d40e7384acc9b4285a1959841645a97a14fa2c4a0feaa01ef10fb0627cbe4bcbaf119f232a2161b30634411236484f99f21a8607e797d3fb41985e769be018f3a163c0b5f7129be85867409dd25f3ea7bcc4ffb21ae39e9525bd363e5b88ef9067e11833c77949dc7e6035595b71be61597b5b4123f18f03749fa1e7bf75e9226e38d114c26c83e9a52d0fb6b235021a09db77a0f293b8deaaf6437e5b70468893231dbd88357ac12484ce78bfc52c775cd0b4317947349927e775acec08aae07a8e38d4c486525d713a67a8b7ad47ad7de645d5038a49f3312736874274c5279e851346266a4e25d3a9014e99be56e2edc262a7536f3ccede58e9a8ab74279e6c4113a94e2075931b79a06e0f8c9bc40f3437ce9ecc7287063433a1fc139b99b68535c3834cd5f375e14daa7c544322e7866b19966079db0fcacd000b773971ae68bf98689ac43284ea8574ba6c3fe7d2011d4533332acdf26c2e0793a66a800e0132dd318ebe0046748916f802e30b1b776594c95ed5d09214d789054cf497c641504238707934cb30abbf80c4ea437395a67676e501cd362c4030429ff908e84aaf452d7bc85b2a2d06e00df317c60a79d807fe411c0c4c2f37fef398a52798327b50499195f48712cfa4176b6504ea4ea6ce0c78bbf0d0595f4d2c0e4428aa9832dd7b9199da76e259eb9a89ab2765576ea4f47ed215708fd5cad31863e7d59725a3771a2daed06dc9c2e315e5d1718990f68618facb08007e6d39e41fde56d1fa5b7fbfc81e392cd5d5f6baaacde80bea792a93e6ae12c00e9448dd1450b3258780021c7356177a23bcee966004469858f44c89b1d75712065004cc81149193a6236a006697c849dd938c43f37f740ef3375ce652c8725d4714992318e208c363a7083ba1996de30f6892921244ebef08836a3aaea5e6732f12cb7d2511fd76daa7f7d4169c60802802c28f54700d2f12c4435615cae44a2360a953ffb0a0431973e4609c2359d6e84e7eab43acd67bd3343cc58e244c4fca2ea1a4b4cfa6f87cb1103ab664a40298e7506f08527a94ddca095ecec4275008a97f933be18b4c6cbae635f175e21ef68afc145278062c8069178e03827afa79fd5c9c73391d064134f6b8b65cb8d7fa5eaaf8d586fdbe689978e17b06796ed6e1886b21a279c00988b794182e993813f0a449ca04801e232aabd4e5fb324ea9015b8eeb2c2dfea7ad4c4a68482a0e30e85c6a4411b32ab06d9c4f4ebf66056b54bcab494572a128fb9dc682e109a2a711e1c8b747a32af8551b5e24beac7609029ad617d34aa7c0d55b6ab81a0dc6b749257f256952ad50ea14d87b1f2d9a95db856d8abd342d6be6b023f7d8c14d3208edefb3c891dbd32fb547072954e973f18910cdfc2fc6b1393eff7da7c0f59ea5a6d221edf0b66a1140c50e652db48c8c8a08272569f9b9afa5bba6a062c01adc0f91e01605faf782e53268c4124b10a2218e3ed75453d0a5aa8b7ff87fc052ed03a038a69d8502385d89dbb1b580860e0e6f8ee2d0ac7d71c2c17051328debe30b0f8ad78fe3326c8ae37ecbf809b8a05e8b80c0dcd5185c5c26752a9dd3c2385c9d110688c2f183a551490bb11d62855f7607235dcf3371bf69fc0014559f4d40a09b7fb4becd9bad24e8e503b2067c178a09048253f4b372a92a369fe94a53c1cbd620e1c999d8e52629b00bb503e446b5601bf8cf12eb717e727cc7b8a5abf2440d361492c24f35a71c8204e14c01dd970762d9873c1855eabf302703787132a13d7462bd4f50ce8d631d8ccf47ac26a20e8114231e94a67f8df196c5b6b8dcbb918e37f88c77a6ff987876958f21cd514bc41c286213449d91aea61e07732610cf773424bf613e87d32d3e1b7bdab899bd7db6e5def96edde97f9f04ab1b50c86644a7452669170f917bc56834e6f84eb2dfcadbfa5bdfa9996eb709e60851527d7ea1a7359f1239b70bc3081af601c5eb1cc9c93a16b6274cec4b31f3e400186dae18c32e14ed5b92427cbadf5b0f4822be6d4349a45a10c545b693c56e640a8879493565af48a1b39e43aa4beca607da0ded1967ea154f0404d6408e043b2c46fc3149c1b3ec8e54eacce2cc3ecccd5d9151716ab7e63d0ed0551b4ebba4a123fed4adf6c81e065fef06c67b2e2f01947ee66c6755dbe239a00fe073d3ad62b70f447baabbe1952a5543ffdc621df182a216c8430c18eef930c23b5d091146e8e3b2537a23c64fccfc7169b1ce5914df2f56116465087d194d6fcaae587897c7bf4b6f4d3ec888120d7c8421b88d6efea1061324be6422a4da51cd7b56328be5c6f8e13feeb449440f95ae58f0968c8f4b3e219960c9011ad43b86c96451a46c74988abdc8b85866ea7d8ac9906f251653381c02ab65100ee3a6f07cc301604d3f272221c76c4a7eb2851ffdc780f6ea275e96912271efd8ec71caf1eecd9494cfdb83b7525ee3488e857750b08b1ca93f135522f474a18ee9ed936f9879cf4e72e1982bde91aee56829bee40168021ffddabc4c3ee61372f852a8951906c807ce68c837fd8d49741b161320ae3d0d532e68b2b279a932b3ff1271ef74be40ab16392db523a7c116f4d83c4f760cb198445800d46b0c7d001226a5985470c34bd0336f82316cd08c89c04058e372f56555dfc94a8e24074b02804b0d2dff681cc8d0bedfabfdd4320cebfdccbf2f6cad753057a0de83c97c008f8ecb774faf9f94b156b827a31937499fd9eae4a933dd1d3f3c61b19162952204607021baf0d0cac3f9577c5b24aa57712893a802c0c737acece6c557f2a784ca2d27fed1444ca2771e846338a55497c346b09a583bbeb855141e08db6b420b864cc5b628d9976f366d1001c426059fa8ebe158422828267d50f97fab560849b8f02bff4c81869787a4aeec5ca3ba9531c4d2e9489174e3d30729fd0f1cba81f5ba624df2e59a5e2b8c8d1cbe3812040cca154645b6323b56ecd5da902bd1f7ac03a570ba98b649f50d04eca97042d385a8ddb5d0b58857d92c4774f503947ab5496489048ad7055fb1522c684660dd0595a0fd55940e0834f763a6057d83924ed8e82e38df68699da1d0c9c0e28249c7cdc6ff4be68acf8e0e4f5ce884aca124669211d0075216ab4735b68d9004037b2abdfab06d0afdd616e5418c8298444ea0981eed625d76f864339d52e86f7d7f08c2967439dc1a3b36877ab5aa79a0e2b51ded782353e89dcc0a9777212fda5318b25317c33d3245d8d882813f6d8204b61c102082c188f4c922f142bd368bd070801388d50e896a8eba3106bc059ce32bc6e623e75d42e718b3e1f1ab6dc77382589c6ceb99275a3810a06d5bddbfc1f0e3c549f81fb2955b1266a00016e55da0b5dd12973d3b3b24a03b3a7504d014898f36aee22a38183a11b5fa932bba18183888735f5d71c8025010a0175910484c343b0184832edb319db65853d940ecd7e01a529d208be0bcd67807c7d15be8d666f18a5e2e57089d0d050ff7b27a756af413673e5d12e7d9b42e994947bbd04b839be513566f40954f9d02edac8157ac82b7f4a38c8f83bf5c213b582cdb2da4d965123b2a808fa9b737f8c51da56743d0b95b64caa589c0716b2c3dab28163f01ca7bfb37201bb69f75a4287019b3a91708f23912e519d17027e506b0561edd657084c030014ce3327085e0b39da0c2bc0a4961962aa134f85e1a09e054ab119e15a3626d7504e212a7b62ab9a86845e12384ac11f1dabc1262e702068fa76c14d08467ed3d00eb1be3e867219e14c507249e49719e0ba39fbb65ee68ef0195b741442a8f8b7519734cebe9b12f66769158728ccfec85c05fcc0572522c54d22330db63d8938ccd3c382f641a4bdd278de508d1172b918a36f761c61c9f516eecb7561073a23351fc618a72bb8143900a353927db00ae2f9bbb834e77cd23bb22c07c0e69cba33a8f45d5ed8099bd7ff8e4d16c737ce172a06a319ddb838286441600ace410be7dca2142dddd246ce678c8c9561006c97cd939b135a88b01b0581a8c525e0d6389423399250c708c248ad709d490c308708987d2c5f4be7fc93e9582530b7282ce9528213500be35af7497298a573596b293d80456447b810b304d7f048ae82514fb43231378cdb6113cce73be57b06d2b60a8d931c4ac0071c56ba89e505504fa41242e00df4ecc32fdf24d90616ad806111f7425e48215a9fb55c7d10920dcbbe3e831f6ee7ff8f157b0184e92be9e44ef991dbcf13aa591e6009a926012696fe42793641a17e44a902476f081825f7c2201632e9598f6cfcb15afb69c9c146a1d2dbe304985201323c7d956a0623cd6c0c1cceaf97a8a29256290bb0a6f7cf7aebbd3643b801ca3012da6a86d0cc709b6239470ca9986f8d8ad02a490113269117b71e519d06bb4f86395252634300ee89fcb017c70d5ae335a2bb5b73b08fb0320f33046bd07a0da355d7b811d9b7f888122d435099cee3fb416ecd78f03aae9f94232d7ee1c216f8469713137a560a8cb478b6ede66135e71387477f7081251ffe566d43c7fdd10086e9f613e1d6dab42f8ef6c45b4ca1fa4671346906f316121165fd48cdd9dc187a2b50c36871ae804b553cbee6ce91d7256acab2ab8a0fefd28b43c3377d7e2ffbbdb9c526281a4d5230b8ea1547cc004857653d08d2a12a56fa9f971c86aa60679ffa1152ad7f048683c609a0265d9cdeb2ac840c16becdfbf05a3e183eb41d5c7c24143c891c22e46b1c3d1a9223a4e6c6b04669505f4af9dc6c282284087257ec7071d40175cd389c75e5876bb34d777297a5a8a03155a5d1fe6b81a1048a0462fc8c9ec5868008c1ce092d228e06b6c0f88f8f6be12a0e70910f67ff12bff028a5b17d02580c566c7cbceb5ecda21eb1ac6900a72b65854c1503493366bc1046a61c0e7e4550fa639e3d36520ca28d3f22c60d284147889f83cb83bea001e69902be1e027265645c51e3f25a99e71abdce4d9bf3bb52df028a20115d01d7dace60f4cc6dd1030963937cf7b1d88ed2f0afda9da605785634d738b5deaf551bd0f20b046c17961bac0fefb41632972c80a8b2b2f2901fd47bd0c367320189ea6b307578ccdfb6e5ac947b29c455381e9ce3b19db4fd1ee5754bdebeb70b6d68ab8f67ec14db89f7acbe2ba38e1be0cddd4df7ca0d40219c992aab4b0419fbf57f4d1bf3079bf1681bae4fec5d965078e445a6c42ab20b5d3a94dc92f7e7944d80a1390497f4a3ce679b39041f2e0aaf4661678ab722bf9ab2c6c12fbb04cdc26e3307a19d7b435f9f3e5f3c8838006789ac092fa9c845b35278693b959f28aaba51a387c49dd91a93c34a105f1108b7f7966e07f73d8eaeb0f2480ba0011a6057f858776f544222d5628292099d391d766b7a1a65caac2db2f8e47d5434f22983fdf4b7413a0ee31acd291f89df1a27866b174796ee5f4fd6a4f6c35420d302390053e921551af0072f7d5da704689f84ceca0c4e627bf682de89bb873d8595c9211784e7970d0996658f7d42222a03a19857cd71a6f2e3e3ed894ac5c276b5a27436fcf669edf11ec93dc5a2e4ba584114758d6039f6540d1bf1a9d79c8b28475da488d8bf8fc142538added1949eff553b98fbb8cbcc828aa7dde1113b502a819cae3cf9b911e093fc5b9faf2e1d3d0c166c49443f901347925a68a7fa26a56c5c23084fb023cd257f2deb8c4d6c7b0e4b233a79da70b14941ed108a643f5e74112152c260eb18a384446207b0a0b36338c68ad9f4e86c088d5afb4951c76a24834b23e7a52d05066b1be4bc9a784ddec39447f37bda87c66d183552fd2309f9dfe3a41ecb0bb733c4a0e1aa400cda2d59c192af91b9a3722cc610ea5b13c3ed7990a225e010fd3748c389123768ea3f2e1745ca3af9d6fdafd996b86747139778bb45cf02b6f30ef9035f5ec2053032583ffff784fe761eb00255725c64ec2a72ecd2403ae4ffab60bd7ae2e1bd0a8a73f5eb7114b35fcf5d69f9bf7b918bd748782944f8d3f7354306d3a92cb8ce132161b09e8c07e4f31087ba39b05ae5f0987001d0149bb438bd6283c19c0ff0e5a1ae05100f165ce9c50b586d354254e6ef38fa26d2d6782fdb792892d1eda7e60900aabc634ef2bdcc3e6734b3327bdbe7a26b198cee4240617d578a6e0505832d13430a7faf6f15a7284ed00107a51c16c144b77fe288c8b20ebd110f048319b7df3e5eff1415dfde11c4d767af6f72f90a5458e0a9e9b1fc8757e58fb73531592ca04eb4db47e94aebcabb8ac392efe77dda9d13d407b37db1bf2c29370955c11ed444cf12f81e3ab5de6f1d7415bec9b43370597e9c75fadedba044a8b33d62715a6cd175e73a5d889b68ad6899ccb37ed733edf1e43e9610af2acd0248f67bc72dc560a54835c3e88f40602fb5ea490b04935299f64406ad0437dae2ae610b4025b01d5d91d5b9e28b8824380318ac39df589260bf5434e642c85f76f7998133eea6cabbc44b08257f9901b19bbabb3cb6eda831410b59c5aa5e1975dae9c334c8033b2c18b3a94978d0d83eb0118b123124e13680b6f72b7bd1af3651bf47de5ab4c70b292f1b5084a138967910f8d2aca0911e9b28a2bc589d53eef6b4674dc7ee7f06df28668b29c52147cff61ae094ed804ed667c1ff0c9a2b44d7fc8e747e5bc8b12fdad165d91aa85e85662460bceffa02944859aef0cac0a2a157a1ba518ba81be77e0eb953c80980186335962ddeb5b65a08491ef82d1af4d27726d1851d09f64c211f765ccd8c75da14492896ad708d85878bc29cdd112525f919d7b9d2202277069c47c276625b2ea7670abfe885b12a76dc61d063aeb0900731efdca90090510b62e973782f949fe5c06ee20e0e0cabe310d5a3f3027215fe9507cc746b86cb0ff71688b7e101124339ffb6b823729ba1b5657d7c79c9d000d7675b8a1d1fe9e4cb073d24562b0187c4e1fab51bb714f408480b9439c6a7fedecceeaf8549031957e6ef2da794e7d0007a7a64c49419adbb27ed3b9834c567a20afb308b383f9687f38aa92303c1c01a9a16238019b7a6992da13e1becff98d7cf29011c6c926d7a226e583cfd4bbd4ef733e79b617833b3a5dace41a1c2759fb1f5da516fcee9d76ebaca6a62ff84b52779423f045a9b1764b5af49b36e9c09847222084bd96500ec185550b9fa5795f56df9abd45355184010b19116aaa82a31322cea63f4d77a093de023dfe60fc4f491e944a29b251c8b1b39e4eda599a26a2bf85ee9426d6c1857d9faadbfa7718cb6395af33d9a796a3f3ec25d35934f1b2166676897659187e1f3103dba345b7ea647e7c2708288a1160d320ee2c35e313ebf101475575d4aadd19e05267878ad5908a8e5b47f23ef5743bab2538373a61cb0cdde3c0165ee3e839a490e6de3270eb6122bac0472cad0cae49a6568244c3cf26a5629909d401945bed905627ea201d4df6f854507a9e6956281ea4dec6a0c92d1796c8457b5b939ab46cd99e661df33018c6f233e4f7e0b48ddbe56f3363b0459ad7ab050cc68ec762e7bcc6727508b2181d093b65a24f649ce8d1272a6983acc044045ec8425050d315f1f47c835eea3e7f2e40b452da4a1b52ddb21c4ef70d724c33899f562102b6257bed5ffa81f3c4d297467115c0ec805d11a2ca87656320ecf111b99dc0c37b084132982ce1f9f395d802cab2b201efcba5bb6a3bc76e5918da1fff360bfba2511bb667f36928245b30729bcd1aec9d3a35609cb35736d8af2bf4179f548119f107f4562cab82c7cd16fdce85693808952f805712b094758b9c577503d648c26c46f8eabc46e13fd3c6ef27bc84776771329043ababa56afeda512807610f7152aaaebb3dd032b870416b16e1e55a45c4f91814f64a242e2007472b0b606f6306bcde633343694834b3de3ef78043990fd8be6a101c4eb391bf79e186a99137f4d3a43076870fce2fe9772d55646e04a734382ba3bcddb357421ad127a2b8a2dc6746c394442492bc45956bb1b91bddc238d14ef6fd7bdd9bf8804628832295001bd888b231967f1b4d1df70a95549247ac7efe7c62239707e701f29b2169a6366a2e576a417279eb68c55b97ce502336cd7c9de80b68ad0ba52ba1555f31c798a378b74853ee0965a922900cdffa86dc8260972a3f0b7e76ef76e536374f6d49f9b8b9ec02d4373f3197e3ee3a780cde84525ea270460b7aabbd78c0d2e771e1b517ae52f2444908345410a6fda993a98bef0d1224faf07204c0ddaa2a58dbea0bdc7f39342d9e74793a12dca790cf528aa3fd757985a4090a101c1e98bef1a79bb573827036947e3662cb98c7725a0ce2b13768ac1370746f7ed9cdc5ab517f6cd8e70050c3a0af37a43941e0f1a0096b35dc8f6ddf7fd229e20a19609c2195a8ce75c42172b141be033be6719d876c03201b555e1a3974a095319bc22bdd7e9e4569a12e9da216c61c5d0a62c23dd1cbf63928cc919a5cb7e1176c2be91a2d24544daa863f633d07d340bc0b9524d000069c933adb489b07e650bdc7d14f265919d512c3ea0b1d25321165f275278f51d4dba9d43096ca2350afe61f6f34689ccb7898ef472792e22177ff8daed65ace0d237e2a588342e29d3521f0af08d5c9aa4a91aa4beb8b30aebfe4eebf98295969d5c2f25cf6c4123acd5479e875fa9341713009718713934a47c3b5f27a432f706917ca527adfaa728edceeaddf9710fa408ade4c9ea9ad0ac5024c79a9c5a2161b8fc9c563006b191d75cb5fc827988cf23d1b5ea1f0162195bb6510aa3b4d18397e086c1a1b4d88ea99178ec74e6979e88a208fecdcb5f0e5afc41f44658881600981bd82a8ae3e5b0ffaea6a0ac54105e55ae7365a816acef240f4139da8bed6b6a0f247bc41754adc46397d4c9cf45e0b04ebf3bed2b9dbb4e8507a9c64e6e21b2acc29da8c6d49ae80ad68842fb999a4685bcac28d93872e7e6b5c430a92648d44b50ab7d93528b4a01a0c62c7618d7a5860294c4d0d2fc9a46c726e7d13f5aa18520f5238df143005ea31ff83b38593def263a859c9409394b8d9f5c022d91c4adb00cdfdaeeb1970909cc134e2b4730ecbc5f39385003fce64aac60b7a0f0d36ae0a61e040441005af99c8deb4709e85e61a2bf539c2cbf66451ef80664ac1fbe0580fc2b3333a6371875d40331e8072b0dae41b03cef144057f40165d2530301064b70b5006fdd596d355f5b398b94f08e09dd64f4263a33ae6f0539b64d58ce93464d23bddf710093fbcb667973888c5011d5e5fa0c7b7ae78bf076ab2726f7422b2b2e1ba7ebef454126b5b8056872b4140de2cc3f70767ce0ca92b8686f66233f2517d2106c651d003b21ea095056f244840135554257215ecae035892ec5d69c48ff565e00dc32fa1e27884e458d643887aed7df07739774a27a2730a164522d95ba69a817288625f57d9908e8d72beb68f2e6a3639789f9b918bfdf258b5a8c7a8b2280a77f48c7aa88f2ee3051a9f705e79baf85062044b428b7613362afa130d187289f3ca03e0eb357e497ad92cd6302b7409c47668858545d595d1e79b55f3d5b2ceeba1e5caca8e07308c1f95a3d966e1798e83f5f881fbabfededf8a661cd48308714ff71f2350fe717eebdb7a47f2eaf253ba62e0aa92558cb37e2a7acb439eead73692a09e5ef8ff6d04ea4de14479fc25fced0c895c110df778c6627dd2a37fd919542abc168a714524c490acc170a72d237c9da03ca11fe775a867b52c6ad3d19a6c4a9cef63ed89628f5e99b118059ae1b6bfb494dabf8d6a285947d073095dda2eed0f8669967a0374fbd8822f4342eb0501f40bf56f852f42f7c6091a2e8f7b51532cee40a2717495c10015833d3eb93428e0c6a85c9283162e0f83860404a9f667f4ff0414ad949e9b809c998d7e567faee70f5fee9e0e56dee5e66e3abeaebefb496d8510662ff3f60a94e5ae09062d15d6c58419933f32cff5e3e6729d6fc9bd18daa54e856260cddebf186314b214795543ee58fb28695613a1786603aa8e6033742a73557c2be98390aa8404e68bafa543448b3be0cfc09aa94854bb0383f96c19704dab1b460e175d98a33110b00a871b37ad88f8ed59f7b45fc0f8bce57e572e2c26e882e6578ba4398fa075c7d7ca536e15af2bf9b92d40c95a6ff80546d6aafc91ad1b191abc8ce198c93714982ece2624f70d4f1bc41baadb1774baa263e328fb430fa7dc219489e95b10f9eca1702c5c430fc4e4453cd91b24bc1209d36de1dbe366836101a77e3f34ce0163a0d9d2238f2c7b2af45431195ced99313bd43d19ff79bd9799c9243fa60f09c1a084049d04f60e8265930c078ba575fad74047f78603725a05c053d39c908727fea98700565c0365b78fa4d3b4660cd0c3c06c20a19b199390b0e7e2886841e00025b0575d297245d659926233b6d5ef2628f132565b995c0b11a92159d8ca163a98608191927501e8a50aa7d4c19f835046ee218eb744371df7bc36464c5b28a7dd16f5c42c68d0f2917bdc1519444d1e9186eb7719aaf2f8a421bb960393812922530bd344c721a0c82aefe793f3f38448e23451b5b18aa969ad2085661004669ef02b0fc50d34af389d6dff5d0739cfe45457dcd8cc2e2d2ba51c14b488d855d29b681a20b6e687e8ac3730428cbaa83693577d278d9e4c91e8d9dd2ef39b0ce339b1ee8e7f2df70f95f6a5416fd2da0ef54c5624953c912face1ebca8a949dd73be41b0e9aee84ef1510b6f278c212a03afbf97176d66ac7b84dc713b27d6ffe38502f212d391667da1403acf6b43d531877e496e901abb46678eaa76de55b0cd6414500dfe241e9bf4d2659cb4a296dbcc9e031992a6036405e1e1396940c9ca58daf0563198f0aab2bff64611bae20fe29d5690ea5df3942fad395da8ac23d05202f84eca6ed85426ee6285f589fe35d6c8a80ee553ee16db9e71e7faa13bee844564122b497e58f5269ebcea003320995fdeb4a860f5b4b2727be5d0be2b7aadcd1d5c44909374136a49c9dd18f7fbc3efffde31aa7051cf135734acfa110dbebc66e073fa83143bc5e3e56d009fa79f25b1239e1e6f23e03cfd298f1de2b16fc869dd2bcac43f224d8147538e218ed064acdf442b8fc09676f16fd1fe23d2ca7b3139bcc6698d61c478d61cbe44fe5792baadcd78d007e486acf7701461b96c7be31fb73c862925772be84a4c32acd6c5193f39d16a88500bd42b2b71abc9270da511da329240c9033efbef9d207b2b3b4f90cd301452b03740d02060450c16cb8535020dfd6b0155d90719ef377d950a9dc2857480b106c4a59c595f467ec02dd6265c257ffb879e0e6ecf401f1b9098ce044bb59a15adb4cfacc2cb3589f55057543aff5ebd0a2e5d83b1bd9fe0a872b398d8e8b60744ee4ee6be712570ecced8d33973e0fe1bdb6fb69fbccdb14bc6d168cf3b533cbdd614480f06e897468d970a6d9850b848a46e626cd9f39b9e6a6deccf8479bf6cf909039445ea50844360b14855f465154e3cdf1d5599e3c399134bd421c273aee0b8d12448988e58285f1d4f2f820c22fcce3efd2cd390236ece0b2acdc3d76d6687462cfe9d8a0fb0f735577cb4d08fae9cd3804a5038b3926384cc28493810b9eb4651ba901146c97222de8201af0d102a0837a50728d2c9d97a873418a13f8668c36a871c43e5206639fb011b434a3412540b40892f4805d52138ae5fce51c36d3bbc25b78478e865db925d4d4853693750f5fe043540c2eb8b4e36a072e9c5f1a18738e7f9a0b6cf57f622c4438a101c33a2909b1b4f4792a0ff20f98d08bbc690cf61d2f310bdf7ac63c038f5d4d115264cbe81140464585f4a7e253ef2eccb19cd20d740f949aa42cfed6014942afe2b40125dfba169543ca9c60a39a6179ae28b2b6491e4a7735f8ba4c02590bde7940932f5b620c388b1bd706531fdcc1c38bddb209fc00d70a8a1701f1422bc21eaa66a20b593a5da46ba9da73d019b4adc0a41792d551acaca9be34b4a984540f015937283bce7a86933b918d5fa2e38a25f36445a180452bd89a11e86aee9384add03839e2255f47b92feb0567242ebf9f4e25243d1fa1685f0543ff0c0bc8215e63d62f45e4583a095daa0a207f386bc446c4e6488706023149cc5cdd72752c04a453568c2a90a6ea5ec2cedcf18600640d8ecba8e4d5cd37ab9df43da15e124889105edd7aa9fac14677c39382584a234d7c980c405468037ecf4b6860291320eb752b7dac91f0d21e8d0f9c06a3516e64867a8e3877cf91ebef21d583a1db9fc7f1e5f3f2a3403148f5cbc2725ad249b400812d471e175faa51a8b10581f6ad89bc0a2ffa80be724f6568637f54939d771bac434baf4b8b9dff110f76ce33b111a2682d65cfa4a86283f04476f9c63a8c0e0793982353a4a33bb8da8d69961df233b4338f84fcde0e0fc54271c93965b18fbf6019cf52d588516c4d71de9021a12cee1b57ef396e17d66f608d8d9994e461e2cb52b4bf4ace32d3be711b24d5a10cdd61b6e3b5371f5cd57f3c3e24523621b1a8ba4481aae5f1455ea52b9f13dad2d00ea84813446c2c34f08a87c6d85f708f792ec44a755e130baadcd767adc5e201214fd67f8b1c511b76487ff191e9aea0e4e651e823c01ff6ee23a0484d060c030432847c564e56726577c796a96091e7ee72f8bce034eaed73088e52d52a89239f85c2b1653961df53b043ea1309dcf39f6981275e28c3a8e44a4239b2e858a113a107701d62b015a0e35bd46cceacd6d4e531f0d59417656420401bfdc0ef389cd693f65164ebbebe44f89e2631cef38104a50282e45e3827eaf45848f45e095e3882afe2577078625acaab320e8b3a24a21143661f5c41f38293a5641f871d2f35d529fa6b5a898dba20bc8e1fdca11fb5c64516493bfa57a0a129f440ea5f2ae06224d5e90dd1d2772e1e8774bd37f0b9de9c631b05ed05de79a7c5f99c955e10323e498b4271c6a58cdaec3b1da5498f541c74a5e47bb3ff5159447dd5436702e1cb1992c1555929f9ee49ae24695d1e5377dba3a48ec249fe2aef48e9253a7e51a11d47a477a43e322c5382fe031e2b7af886120a45b0cb2266a6146e9c2ba64c4f0b7e66faeb36f7628ac3b03d26d06a2a0b64d3fd7aa0af754195a07d601a9d738546c5765a5982c3316dea9f0f800562d25588220e0a89781b064cf6f1fe9f88edddeee50093487c97ee201a2c2d26f497bf791fc3485d8cfc6d411085280002393b7c244e60747da0e25c063d3222e96f8d4b994a8c8a232fb9abad837944fca29c9778029f06cda34540ec823020b93492aa806daf453617bcd81149698e5125d7769ae0388030cf0e17a57cf29c5b38faf5f51ca12343a889a6aaab756444cb438c1d7a003400872fc8806fc0d9ad3a9fdd813d073d3e620b2c1e91d180c50c382be8e459f483859124e1572ccb804b0057b208bd7f443b491846d08045205b2ba6b6d0966e72890fbb53b336c716abfd4fa921d2d8a22df958b2230ecb85cb2ffe8cd5720589b3cdc3ef9d6025ac275e7d80d1dbf62f5141d9d868c1c7c2ca23c1f88a5959b729f86f48f72746c7cd84b18b5c31f07cf118079e8f20216ab42bab8247404fc92e46d7d4ff02d6c65ecabf87d9bdc9e8483bebc21387b23ec47dc13d067241f803a20f1c0f48909f23234f154f211f4ec977a08b7ab09ca2c1414264c749061c56600e3ac4fb46ff614bef698640a03cd4ecb6445df8deea902a8f729bc298acf6e5b8a5fe4126753e0b10f5a8f1af8c06012f65b1c0935bc3133e92bade360737e97112b897007cae9e828071cccdfac20583bc6a7cbcb4991dfa771b52289aeadcbfa219ccc682b3022dc2cf4a46799b1205e02321f431bdfb0c2de72c03c7d47f14a40c5bba5bd30e3b934cfdb0dc2cc577013b1b01781c7b75e947d47e837623b72d565c6badc5f130e13b252514be5b30cd1db89c839da1386246940d48ae5fcca5bd6e12830a2953dd34ba6727a5e3b4c30c45a95af537260d1b18f9d4398090a5acadb5990d9ae1893e5d670d9eb1ac28953557a498f8b6f6b999f14cf494f64122c55e6c3bf5a48838b89efd3af2f1a06783d3703f6490a3a15a3ffa22c8c6ccc26d4d83bf9a99d272a8ba123627a46d1ec9153264a1a90747693ce36285ee5e6856fee328ff67c4183af00da04522d60b72e38f44f892132404b5c68da1064c1c5e747fa1cb1a1bd6fe8064d1aa3a696c17cb073bf9c69a095e3768551a1359951959fb788443a81fbf5acd215ab535ca853ae34d51ee5be733cc6b1b6595c967fe95767eeae634a18f928716dfd7982dbc85fed6f6b7509077d07b727806b2c0c0b5425381fa67c211f6d210f9c08e9d060b2532acbf8f4295be64be59595c0b7ab3fa117b80d46d3207764ccb9203d5d0899868a168112899bbe761ccf5c5e7017ceea0823fddbed4c992aff7a77ce3cbccb9fe3376e2bcddf1d91cae8c3b15e04b74886047a524bf3fc16fbabe9a264f4049e4cb842c32b1fb92293ef60395962e620e0d788043927c08b9be616e816b42cf51baa33754f1f744af38bf7311c1673afc632221efb15fa39fa5a83a40f221f385b8ac3044ff75586a9f715de42554b67ae7c3b8cfc88c4a6be459cc04896f11482f00935ad56094e5faa28f355a3608e2948a136d9e42dbb212188ed07a212e3ad8ddfad0f72b23113a6043ef9f973c6a17444261a094742e49b14bfe79a69db695684f62b06fa2bf41fc19202f416c3e36d6fac0e00a6d44cc0a0626529236f049abf9c4c806e52ecf199043d4d8cd0dbec676339ed9ef0179acf0a84de3cc6692d35f20832efc5cec3da6ac93a92b48ccf38764b7c5c22474de80e14a9a38458c865de1f50924986e2c328a5fd63445a9e14aa7083888dde2d2f596d61295d23e65df00da2c731cd66b509b974773302c3d6393e0163f770614213538eb9ff721dafc503137afae29c1f3a7206c8835840f5df68886273d2c1fb18e875bae650bbcde3797f988151a3f7991808f22f0f6940231d4c80fb049cfd3e0c64108e5521c134c8fa6d53144b287ea38352f943a4c014d628fd4a00e921364383a968003e76981c287e54e9dc0030afd700928ef112b84bbbe73673108d4560cea4027ef486b3d67cbb1703a507ec26c51e50db01146b819e3386818f317d4e3f84f065238bb7e92e4000b33c333e84b0e3629c8a94274d44bf74df480860ff8058f6e0044acb641ed83d7e382de9ba56802790126285403c4a428b9245138227b634eb43428a78157de8466c9ac8e8fcada95fade16dbad39c6585e1a4b8080b44631988f3b101af992e9b4678a7f709630b2599552ce9ab9897f6e2e331ebc82bb97f09f48a5f76c25c78c1cbedc2780bb410bcdba20bf6ccdd0426162113193e0799b41b96b564eca64b279405aa04af6d6722321bdac7b4a6f523cd773cc999b855c06ce083bba2e625390669188bc42c36f42179bd2025b98eaf6c7749af6f2cc777ec9bb8e5bcd7bc44a4d140042f19905a6c6fa204d28ec17c73b512cae365ff13ee525f11b680c56d2ee93dd908941ce88fb0b2060a2a871a592cd78a49ddbf5c282021e3ee2b82a70a23fc10052e14ddf1ca1c80f053599696cf81839e5e881e41c860dc19068ec173118fd10da68d894ec0cba9f8099f529410e2971740fef5fd5e341cffeb6e91b25c5c9776bdf8fcbfdc4f0e29f4016b548b42a2862dd6578cb7da936168d3d83a0bfbfad27e099842b1426deb86687c614b88b0177d522146a1a71705da3a8165592764ca49c73a4a673f7dd981ee8ff4ec4729dd4df3c4b3bd55b32ac7c71a92806c1b2a7985829c7961dafb8c006679466819d42c0c00752c15be2f7561dfaf5f9dc95779380a2b660ba23ddd18705fdc11a74ef6d07b77ed85db1d338fe6a4ea11d50c1c0f38be46667b9decd2b089aeb21755f6d83da4605ec34ea5590412d783850098b1078c01015dce4eba5e9192567be7a1c3e690a50e8d71cd006aa144ff30fd730127fdfd4b7b1650ad4ba610aa508722475e00c0bb90d9079684fcf01cc279f79b3cbbb7cab396fd73e0f3b45908853712c309817734306ccef21f36ff566f07d28393439dfff2227e0392b5659b865476beafad0521aece737bc1ec7c101e04aef3c6795ff56949d08b737ae65be47c9776a1ded3ea7a4abdfd874bd69405f032be20052a0a70da627bb5c2924eb1e9544781026986670d9e6b2fc700876bf2bb394f40cff87872fb1de0be7d480c08ba1716559f051cc1d3f3e5d42b7728d6f6799308b6e926bf82646929bcaa4d65a407ae20cd1ba4347dafdce93d452461392d6fb9095d4f6f6552c5e51d735ba311268c9ec417700e8a58328c25c97160496eec48b70d3236c1c5908e73b1d53b2b562f7d98eb9c1a6969a6b63a108f83942e2de29b009458c1b30f0b2c12dc2dbd2b886dde613600070d5cf67668e345521e288aa335d20a5a8e92244d761e8760e18ddd19a2816648c43203ffe4ab063f8932577d2621a1461f9815942961991a49fd31d3a63863238ad74a98ad0671d9e39d0b50a4bbf3b5f82f7e406a00167270b3b79c57dc758720ad2513e8cac8d6e5ce6820fec36bead0fdd6e68fc2550013525fa2a51f8235239758831425d5245a0a7831c178d40195587e75ff200f1d775d2eee286f7cbb7be30a023c15a6a6a4a8c50d0f2e38b14d7b2d7bdc926bddae777896f8ce061905515b96c43929f9987d536bfd780e3932090919388470fd8f4200f95741b44b7e8fe149171b532169c4869ca91c7baf382c0f91cbbef5cd6ad12ea6917c2dcd553361a3066ac9effc97fbb7d8b4721e0c71184b754fe0cdc186412c634eefe49cc44bf7de32851a667acfb25988537ddf6eb6fbdbab5f45e36c3c591a385ca2e3770909025ddf1471678a6605bd47dff9f237ff4f2f4a253815cbcfb4bea0c44af4943c9a32ecf1ce29c538fe7b7d548d8265e7c9fbef574fbb4e92c29db4019ac0da711e6686d4a69861649eb343108c2d964b5bf2dd3d2ea8ab10089511405a0fb82d00516b870bbe9cb6129e79589ea28d08fafb88059738f07182aad75fbc39a3e451a160a9861109f3313a4ecc43cafd7f415cd4c116d2684374708c7e0c4cd9e0180a8a83433b5db39fce872e193526b7b5ddef322409284d47c0b5b2aa508fa6f51396a68af29e8d83452b0313b699741100f84931a91f644c3c848b50c9b7e571ab96574fda4b74d4c5bac7c7959cf9e0ea9be395224ffda8bcf5f43f6232dceceb21a8425f0addc436bdd44a1342f9aa5811a5dad2b7a3a4c91e933d0ef1f781078572a5e59431ea00c9c2700a9a539be3ae1a56e734cd110f5de0f9e07515e4448605bceb90b48035e27e98582683ea1abc270bc46738374e7ff5502460dd822530c75267b3ce992ba7fcfc27c056ee3607dcc000aa46f86c7a4f029058c19df57882e0229176ea8a5161adbe7a8dda8c7350a5069736f786055fc069d784ddbc05e81c9e1223bd09f7a617306b50fa1c8ec57697b88d17ad63ab781ce45dabbc2a237470a3e758f1d9f661418a2e533844c879113268fd2a7d193ca32e86acf2b8ab3f51b508a6ff4849f2da61e4a5a5338f54a789e6624128e351161bc4aa6421853fa279e0f2e433804f1164bda6b60faf04627aa62492202bcad81e272c1fd17292c1eb607780ef67831463345c8d93ff9dfef5ca859698c29696ea2042ce9d44661b493405956d0a55d45974b31dd3d481a2593a5f25051d8e3e33cbf4783cddc1a5ff24dfef5ccbe8a29f336199854274b39e1fd27bf7fbaa277fdfd42d5dfeb67393d96b98f8fd6c82bf42dac1369d0d9e0dccca5005fdfd64e979793e4108e365967e411035f8ec2c411c0f33ac858dcda55ad7096efcffa8c8e6bf65e1e2c8adc8282d2ebb1088ced7818b8a6b4e92a502ba25a5e60cdf44abc8c8d1fe3dc40b991e479112e72529e953f10af9fdb771ddcf2253eab10d63850013da414da3425a6c344ccfacb64a3e8ff9eb65ab5a8bb4f1b5a50d430340a27e1b9123f4ed347d34d114d2a6498dd7bbcb6c01f5cc829c360e860f59b02cf957136dc87c1db7ca4d81213a9fc6dc98269dfae951dfdda989f00a3622a50473f51032540ee0cf3f6f685e4e1c9b83ba64847978fc033889e8ce14b47ad2023ffae16285ba83a0913b09ec9aad79bce61cff469bd268d49a976c0664b24b41408b82d4fac1b56b409e1c8191e032610939cec987fee3cb3aae3eb3cb0c8e722cc4940a1e3957e3d2c2cc4e49809f78f0e0b735ea140dd913d2cb8eaa73b7a542c19be8992420b4932b9d50f01aed09c7d56613729b6ef9cf0ad7c138aab3fa934a2c6855483b8fe81fc3fd17e911510383e11bf6e74409fe4eccfff59989c43ffa626b58a517fbc6132e58744feb912a4a93c32a06d809e22411c1f40ad98f3d7d902778a9af2823f7b11858b094590b957527a38e53e2058120ac91de996afc18b5e31d37149d3c51da80fa32d84d21186027f2bc8a9c74f191eab99b114eabc63f40ca71f383bd9e01c2c622fb1979b583bb2d16603840dd096812cc05d493e9a541491332e59c8f90d55916577bf440ee8e4d61518c011a201441758a9d647b39d479632d2680ba30119bc8875dfc11787760fba78921e68a22e6c74140f425decdd369da1e429b7e0b4017a1bc0b26080066ac7b611c9a5d154019443451965a934c50ea629215dba15b896a7ef27422a7306ee473eedbd75504a06ea77c54a534927d17259d20ad46008658d73958df49cf296f849301bc5dbeae4825d004f6887a4a056f6953ac5c842ee23ac395f84ffd6bd2dbe03a361693c0c9a4813d5cdc836a3046339ba6633367fc65c6d1e93393d665e9602d68dbf2a1c9c2a343b1d9e2bafc6386db8110f0feed0d43c9902a4a5022d8c4d8b828b6aef916f94adaa1c0665031adc0c802c01b2620485521d438116f657295785181e415092739af7a43fc9151166fc8240b75f2efe0ebd063c09dcc2d4bf3c639caeb96c589c13643be88fa580660ca7ef20a6203d96c4687be1b9bcdfcb5d954fcc968d738b2b3fbf81a935b73e85d4cb14379b474f99094ed30c0933249b8f2b52a44d42524686439f5d7ce28b31adc114d4a460034e9ed60d3d3b5b1623ee41b272bb45a7c43c54fa0ac3a476efa4ee2f438484de3cc264a6c7a5f9a83c47cc95cbce862e5bc58ff250782bd383d9a7f94252e33c2c98b6728c2fa3f6cebff45fcb7d01efc7afc150b6f24466337c333e22490c24249a57ad79fb1543e381454229748313a6402365688fdd26f8d02e79e476afa0bd9035242c1f5b56e2dd04fa991cc7ddc1e22c7c230c30e6eefdb922ea00f0b4bc5305b362377038467453bd818be0383fe38f0b17ed2e9662a81be6ee1262cc8206e0c52181d1c7466ea9509f93c360f9d57a08aacff2b41bf421102476fd096962dbcdebcd40426a293ed53afe85b1626087012330305b41cb120d2623998f41257d438c7e081a98afe3822e122457fee60602bf142fe25355f1ec8fb1c07a4076245c227ae43e8e071c72d662c1c846f10501de2e3e2c431e81f6c88e0c8c476ff4b274e08ee7e967ebd90828b2d89edb1596a04a9498e1bc1bf5291ee734d7f3b0345f41471a843eee3137a1ac143fe3abb9f301ef0aba8da7e00ec8fd615042a9fc0981031f87d1434b811330ae5a383b0d3c8421f71621d7eff4d81d61b8d68cbb4e42f77ab2d25b0284e4704a1d60723847779fd0563bac018f6ca16f1aafaf296db07c966a04f31d291eb54de17193b827deaff1f06807928b4f1aeb3e35234cff9d40f2847c20b3ce97cb38c3e03d8cc44d801ecabbce29fb1d6c13a92c956958aa884422e3e6250d7dda7faae9d7e0818a9765ddf3357ca5475a0940ee0255898efeac3a3d414d59a40b56110eae369beafd3339011efd43f9820e803892518c28e3a72eaf7663f44a0f15a1280cbe71111784aa49fbafbbb3b15978283b88341f1e1dce7de6a55bd557cbc9ac1f9eaaa468c7d7a904bfcbcef5712e0c4fd9982638153965f6b27bb2c68b84ec27447258d627a52cf46151fdd597b34b6f0f2a8b7067d43f9860325070f0ffb4660a373d2d631242c105f92224c1750b8256da702f1248c289fca0812582c35b75e1150464f60fe2511d052225202ec10e4d0184a6ee7229865ea29c96397d3983806a264b8a88853163d63fb5c4ea257e51da3059653e363d8fe13372dc985949322b872eda643c8475c9bc14355f4749941d9d5b89ff55685da5a324d83a9b19420974084a8a7c7e091d6ff233e9d8387c797bf65936599c102931b07bd5123e39a63baabc6145fb058d49594b3abb1b872bf4952a9e89e0dfe2cd3a03d04229407693a1ea05d358ce66c29ed7e651040e7288cae9cea58b9a8850df5291199adb98fb0bdc1170187d2fcf07f876763c57f6d3497f30030de2ee1b30de2f60e2f029140e97c37e8fab812fa2185c18d35640d9f55103ecaf0ecf96383109ee39508b6de96cb6080d86d1cc842d37542b3e6b603a042d716307b6718855da201822657421c7878fcda64de4e084db27b054ce7020a9e767d56409c0da5394d7eea3e5c336024a61795c9b90ead04b212f5ded0a5a219b6970c22487180c271f38eeccaff0a7666ef3cdc12225900b7063d99e3ba35f827e9e14284497223fc01fbadb5b62de9468d7423ad9b90901d5e0748071308d9e921cd916da7d7391adbcdf09ed30bff095de429fdb19ece67e82217d11eea80401ded2e1876b4ebae4879b34b0a14e259f8baec8a7c54a9ef3c6edb9c1b84145ac7b2a7c0278fddf54976cdba1e6537574c297c89756d52722d7b89859e579f36040f770e698ec62bf2497acd4e3b270ecd4e6a55ea29d5eae955ea754da97d636047b74db3dbf5cf3ff597a3f4aa68f45647a33a4aa70bc50eed7cc76aa736d36ce369b38772a176da09adcaf6ed3a47035ee7686cdb8c18a439aa76b30bd6a68d3d9aa756b3f9611221ea3befccd74baf1d5e45bbd5d1a087b73a1af32ed85108af9251ec4e071f96f22990850776728a25252da38f137be0cfb7c718b7bb1e69f766edd953e08561df7efb79fd93d82fed9776aa6df1631dceeacd2ef85db70e07173fe33bef5524be133f2f8ac3ea3c9ede3c22e91053e43174d1e3cda0bb7aedf5f47ac47468af371f51710848f0075c30f67a6a73cd126fd825f97c653bf6cfc5be61b13e565b7fd98cdd3d02a16faf7602f5f4d3e3abf578ae3daa235e92cfe32bc9e7d835b95d92cf0dc26192ec2bd73fcfae7f7eddcf8d3dc28ebd7e3b16b15335f494d66cd6eeb9254f54edea08bdde95d0b7bb22f28ad968b3765b220edd2872778a0af15e3fd11c22d78ddc1688e7e9ebcda21b419dd3cee3ec3c7e76a2f6fa59ad5663dd2276edb5134f3b1487f518b51bef76337d0bc495c6186f6e814cb0f2d11c17c65eadf5cde61e784be9a93df609bd76d92832ae4960d479b4da3bf663f30c203c37bb60cfeb8da2cee79dcfe93ff7f3ec9fc79ed259e2cf6558d9269fbb46f9dcd108b860124fbc279e3e66d75977c7ee8af5eb297dd11cd6cd2eb86e36b7448959b6ded1fa7e5dafdbcd2e78bb6673c5daa9cd3d489edd358a8cd3cf49ac6b93cfcd126bda6558d726da41a7be85b0bb527fbd5ff5571022d6a9ddeeb1b907d6deb1f9e1d076faedf49f6317b12bdb8d3dfab87ab3876ce79af5746c638fcda0db12f185d96af3f50fb8e0edd87474020e937c9efd73cc7a4eedc3dbabcd3d70fdc76aa79eeb7a548f3db32bdaaddb3b9b75d5e696d8b179097c91685fa1afd76e490c2a490efaaabd5e2dbb79097cdd3de27987397c5deb96c5d2e61dd8bdb2b908dc0347eabd8bb44726566e924e569185c4618973849de39c734e24290a4e729a260a42385df6084e14359d9abe42c127a6eb13ead15121a695e9f1616a8cb6545f121587fbc2e73c3d040ff75f3b6c033bd4612642082184104218e1fb42d72308616c202d46edf76e3f064c3762078705165858e1a6045f4a35166665d666ddd808015203e475ad5129ab8a13455595949745ad5a2d8f25b244ac023c31afb8e28a3a547098ae670ff0af2c0aaa4bea56777852c2e546f5b6d9057755ddead15237cb69aa0e5fc57bdf449833477b8dc5df0cea93914e54f5de7439bef75ebff7dea10d4b84c1ef5d4929274dc39ccf8a8a6131b07b57fc8951619cea7b5524df7b1a4e8d62d42ce59549275e0e4ecd12378497565408df7332980ebb3805000077d844af129b471842482dfdc4b06317767a451a5492d0e3453ec59c1aa360ed802829f0092fd804bb19277481e76cec5115edefe60694c4a00744197126ef93c5efa077eb392ada016548903502b246de452711bd4b5e55555154f5e4fd0164b31c11d91e7a349dc4d6b099a501b8ff02600160253499ae8d5149e01d34917173c5f0eed8014da6f3802693e8db2719d8ba95055dda1f1a08d141df9450ad0d09d5f548f6a83ac9439664e4a13f2c6249462e72199f9895bfac8c539bddcc0abc84b652513b41307cbd8350891e4d2ff97c588fce5d2de9b1845a1dbe468fa6f7504485c113fae9d3e10905ce2d8de9e521c571c41b0388971dbb4a86dd055f36c75c0486a7999d8d51abdd5115169ce1e7a975c1d0b2e0695b26ac5d043c03c85f36054ec7462c1238421742e4326eec51b53d641deed86a4b6c16914cb76e42d66191ddee0f3d6b40140bb4c9946df4d0287407cca2de092de0629aa8876c66c1a157363f5c894017aff509b35b1dda0b964c7915ecf29abf604a431b7a66dd0af5fa948600b0376b17b1ae93e4c09e5d05cbae4b9283feba8a75334b862e2c1f4c856e76c1f5da1dcdd153038260781956d4d32830fd0814183ef4e9ea19aa9b810213185ec6e77c98a438409f13de054315d4dc03b740bc123abc6e2e917408192227f90e3a44e8f0f2e8d1b4428f9dfeca511ddeccf279540776aae282e73ff8caaeeccab293e4909f5791f3bae0ec92e498cfae329f5d978bbeb239bbf608887c523b01faeb1d786a2debd8a9cd2c98fe511df092c8c36724f2f318a5774d22af3c490eead555a8eaba60794972549757a92e6776330b86a74f81d4e6ec1bbda3413c2c82ddba254f54ecbe734775889cde1591cfbb32729a59964fc62ecb078bdc3872ed1415a29e7ea23946ae2bb92d10cbf8757a33c98da2db0271e8d7231d2234848c9b1f0e1d7e866c5e62528bd9477340ba013c21765447c443e4ecd8e98d3dca2d10876e2e0186bf3e25a6511ca043dbd8511d10c321b01b7b449fdd79f3f51688e97577f4687a63c883c74387f03ba0e5d1a3e91a132a7c763416e8d17408631d7438601d170e05b9c5a676b0cea6d58bd9685d706673050496401e90140179b6873e109b33d6474d3bad37c78ca7f9da3e370dd36c961dfb75698f9825d15e8ffdc25eb1cfeb94b665da5dd93eef8ae7dab1cd2312fa743a9d4e47d334ada3699a93d2c98861d682357db21d3b1c52e339e8d363b1ce318fa5cf3a37d763db8cc1204fc91315fbc7c2213dc28e7dbbd8b5b47b611886619acd945e8325ac5918e639cdb161d9a338b03b35ebb2c012a6840c0b2cc11a9c59602989246694901189ee12b0046f405dc3a881d9cd6622f0e6f974e2a5917a66f39dc7288aa29e4f04760182b3edd33a1c448f68a594524a75a87fa8ebd188c02e29109bc13203bfd72ca3a88ba2a85391d24efd511df55407f6799ac52c6631d36e0e8c9e7acc683627903d7ea2f5511dd425d14e7d9268c75e339108673fceb479e7cd4460ea197d95559b6bbdd95df97cde95ce336a5966e0ec94cdf5b2ccc09f9b51f11945458afaf450b5665446d1d7671eeaf13a45d51ba92c52d4459d09f3d74504d60e298eeb13f45c12128935c6ce6be679d6b1d93d9607d9038e0dc03188f62c881e55acbe56919b657da81e74b1ccb83eaff914a855775d73be1231e3383b8e253896e0cc23c2d9352d7f70fc648fd563359b6537b3b9f3ea749bf33373c988c0916e56cb9d2be767631f88d8334b440e7ab378cde18b65069eb7aed9bc049e974e961938c6872febf0b4574abf5b36bb40915d8010016780ec40dfb1990577a616b7f8c98db1ecd16636febad727c69279747e5947b33ba861f55b7dbd9905531bad0beed8fca11f2dd62887f83cdeea01c91e698fb76693daebd16259768ff679766a2b097dfc768c84bef3cc350a0b26a177bb9905c777ae79ea939a8ee6a8d16258ae177d9da80440af9fb20aa3b6fed1093c4ceb0704f23c63f9e00ce4b93bccde3487e773ecd910da101f2dfbccb42c9b9936b34cd63a65c532ebd566165c3f158b26c866db31db01e511c6288661b571166920fbb008a28c3c7310e5733d3757ed23dacd2c1fec66d9cc6ac5b4bb3ee97ceb6c9d8fd82cb1d6c932bc7dcb2a468fd5aa5d96cf35334a6d490cea279b53e2ccf2c134b37c7ee0c182dd658d528c8c84da23450bf67cc247f8c191dd9cbd5af3d69cefdcf528b31e6d7e3bc8c61e595fc19eddba2531a8d8edb4389714e8b10e57a75d3554af0b4228e91017e82287377fba1eb6f6ec9a7538b36b211000fe800b9ed78ed98c61ac8375e625f17ca5f379cf9def4c78a859ed16e81dcd6a5a76ec115ecb3c87d7483c9fcfac8e75493cf42bd63da7d63db75c8fb4c3f949033da5b35bf244cd2e0b1641d7ee0ae89dbb128236679705c3a08b854222914f3d56af9b1fae30cbe0eccc67d76ec5647663e7664cc3209c1042d8823b5976d927d8337a68b357ebb1f940640cc3ea79f51cbbe77a4eef39bceeb9eb13d04336f6c8f30d7e83a00be7a575344b5a56e76617dcc15a30e639b51267d9476c0ac46cfe7c7a07645956a8f3cde6169cbddafc30a873ec9d6397773e64573a1e8c1e64eb33bb55db78b3f97329cbea7c763ca7f77cda4db3b9a52406353bf66d9eda95ceabc39205abd835ec9a765d8f26bd7909160c5fd33e2c2feb4a98893002bb4f36b75014471c19b94b6037847091f608c13e6d76c1d3f38ce1c37873fd8c7685bef19c9766b30ba657fbbcb988ed9a8eecef51c55e6bf564373ebcd96376027934ed1d0f487a1eb19b45a0cee722210fb63d521df3d7697dbd24d9cd31afeb1e8f5ddf6c9e77d7e7f5fa5cd8a7c753bb6dd74e697dfc75ec9a25a99fd7b27a73cc7bcdebb35dd75df9bcde95ceb5a9d10fd6d13a22d0b16b2221cf310fc8e3999aa59a36b5ebf49a07d3e8bd300d9bd629851487f5097ac630861debdcf3d9b15a531d9f6b16b3d93bd730ac5efbfc3df2bc631f3e441939f4dc358ae72336b689c773d0fd78306db6669d36b53baa6918b68d9c6e3230ec239d53afdbbc2bdaaf4bfbf539b59e7f6c0e8f3bc59ecd6f363b666be36a73675acde6eb7352db23c7a418f60cd3329b97c83123c66edf65adc750778470fd7ac86d968847d68ff66a3508674f13864d18364da03b9a599f32d041d324e7b64dad5a4dfbdc95ebef61374542f39d4f8f8dd5d180d3344dd33461d627ad7a28ad16f5fcf38f471e5e45deeca6e99202433637ee4b24a7b64e12e910a2ecb98cc39b47eee810d6e176eddbb36f76ca3ee1d4bea96c4fe9cce60fcee4896b9279817863607ab7c3679d4ea7a372fd532bad577534b64fb73a1a70fbb4d9e98e4ac0f3393d7b9c2e9a0edaece7736d3afc4532bd9325ce15639764bad33bbf8ecd699aa6699aae52271295d045b6cdf5684b6252026bd374157a27174c837878fa663f1efacf2d79a24e91eaf07cba2b9ecfbb02fa748c5e960ff6dce8a65f12d1e1a769b20ead4fa23b7d9a93364d6b3a9c1487fc344ded663851d813d49850a7b77c525e50f4ecc1f01dc700ec19a00fabe72387c75e9d0fa0c3cf3bd7b17f2c0671f6d9944e0a27cf69762d7be88e4278157a8f78636050060f33f8ce5d30f614086d63ec631fc61e03e03b57dc39b41d6780cee1476cc7833b1761b83b9f210bb2f4734218a498869a316a8a4a066981a1869a3f9d8646434fd16868347411a8276b1589fed1a8860d2723b32f2a14d20e70303a2138c5f9406905fac62341931c889241941ef005a2d44b59ab48f453fb64a049fc2b4194478226f17fa557b2e4504bd6192a456a29bc16e27cd8c2f9202ff2a27a01472ce07827312ea6b40fa7343e8333896f83c4a92a6827626084518467635d849add14606fe10c103f9fbc04e2b9a066d7057e8754e5e1ccf68d9b9da1c237cd3b83434981266dc01107c737068ead021cdb091ce363cc5e707cb50e9a68d64763378fb4cf9b7f5955de8ec88a7a26e0a8b59020385e074d72e7e0f8fcb868218e467c46860adfb985e0f81e50ca5a45a2c7ea467aa992d559154d684229078565155d459d34aaea02877b4583ddbb8a2aa59433bb819b9165c80ca1e6ab86547dc090a0c9cbcc510696e01718da68d96190884d55778c56c430f3bd673dc3201475ead3bd1722c9cf890921bca7e037b0f982fb57ce7583fb14185a76d55c35211921db9056407fb25ba9aba89675cdeb7a39f88981dfe9cb212a4232d0e47db2ef6a3099cd6aa0c94b7663a35d5bcdab5b4d377dd634599fac8aaa2a1957455531465851f1ba280e2a5655880adc9fa11fd80ffc1ccc4251fca26e705f8ec001f7e9480eee6b325e60906b489bf455d3851ab317290a9316d653548bc6bbd5f4a8bf0de9515715162c15cd56da6a64ec407ab1d5c8d8012529193b703eb8ecfd67b1aea2ba2ba83b081fad807523bbd94818356f2119cb7e8144c45353f2f35ef9702e4709ceb2c01c0a4f568afaded562a4cdbaf00183fb54b3998df652b31cdc27e1900c75339a1ec900c355d327d5fbd790ab14928128f55948c6ba516f46331246cd578d109c455885415b61ca6e325b1476fb014dfa990582fb903483fb1b4dce8f8c264846d3232930e7e2dde9dd48326aea55138aa24dfa94e2883724936119c5118aa247ad840f7984fa9e029fad3e591678132285647ab4d5381a65a839a3c1fd1c92c1fdacd42779abc14dd34556930de993cc026dfa5b8df3c13d47e39db297cdc1f9aac1fd49a9cc9c0c19d90438c17c2fb66c08a173ceb9c7474deeb98972eddcab925f24fa4889cd747c99311afd2522e79c8b437d3763b5a78892cef4141f4df4a12a0fd7ce467178364fa77ab48c62f3b264e5f1783c23d9088c3683fbf3e62312d58a49f93059678c467fc9eb9e1c8430c669ba739733d5b154534f51df7b8b9ee853e37443c19bea3998d9c838547733fca23461100cfc4e51d06647093ff770c0cf6a4e54f5f084585351df21cd5161528c8932d83d432ba2aceecf52b87a6909537de09e8ea769d2cc992904f7211715900a488fa09db00cce954da9264608cd17d804322104f814fc4645c235b86f55328d52018126fd998af443c3412ba04f594da6728fc2898a1746d987651c2a12514e578b9918ee29ea8ce9e760e603778ece393739e726779be184024f17f4a8126253aa10da872b1f37f81de6c4bcc8c09070471f3f62de8750d592b10f83d1a3ce6e706736382b4d174c51b37474c2c8caba1b568599c048443c611c34893e220cce52e21923ac2a6aa226f80962948439756a18b4107f81f3c70adca7341cf4a829ea93cd150d9e2eb1a8d329cb52d168323d6a2d46a381a3d19762a859d362705f03d22759a3016e1215da8f3eb1a24f324b45d3d768e07c70d5d2e01c5f2a20b8274cb40f43395511f6a3aa2c7f006b3353db32d0d05051d327f9c5e0f7dc34b88b3e795198e91b8d009c7b087eafc116bb192dacc05a44810780dd4c1662c03919d2d068214617a53e71335160e20bfc4e839f7b54d40c67de7de0f70c856451d65179426e99706e9bfe74c57b53d1277db1a6384e5033cb07df921ebd477226ef3f2010fc9e5f0e7c2f3f2960687cd4c4e05792c14f0a47e35d86a1e6270596c2f9e0ac14d3e3f487834699fefe62fac475176df2ecc32fc6dda68150a8c7b9695e0005ceb0e4eedc5061200af40167204a9c8126ef9006bf77d3e00c69220d35c694c2ec010956200339b0e0046ba0c3180e808499f8442720030f6cd082171f3649a8e1051dac27ccc42702c116576c81083070c10dc230c018302035623793c517b2e08248165b783ec882067a31af176b0730a05e60e960240e560ebea00d61828c2be40aaabbab6e6a3c09e314a1944f260b326c918439855ab19bd922084bd8e2099c8f15610bac0a216f50821033e05c7f0c8b3014e205862f10c39938c5197df2847061627827856c212448bcc2ec27aa9bf3c554f73ec5bb7204f5fcac3b14c82be17243deb223904750cfd5fc7c4a4b29df84cb0d799bb83e6f9577e0e9927ff60829e45d817c139625e52dd78474f24d58b74213f726e4154113778a3a092bfc3b8c75988de77b389a3062ba19ee511435dd4d8e87e37eec2a4c3763eac7c7f75d89cf46d94e8bdaf753d538320089b7685ad4c6f1ae6d08243e02dee105bfb73c24de495c901b4c5dd42794e8415e30f519352ca6ee8660eab151de0d4a657abca5822aff1ea64eddc4f9709d3a0de78375eacf3c1cb104352deb1c8d77c49b59cd703fc37d01e0f902f000e07e0070ff0178760a9e109b7645be7f5912eb0ae100dc47c2e5c501b8ef00dc77c1029300d1b83a49751d8ef8e15394162eabdbfd39e79cbbefd725f55c3be7dab917e38b2fbe185d7c5fd654c947e38d955de9962a5b84117603fd6ea62da6bb99dc7c5694c1d5bfa675b8c7d5a34f1cbe5afa84fec22e7ae507832fe75cbc2cb50f0e96f5eacfb6483c59af5fe718af78c52bc668d923e0df0d1435bbd24d8f24aa127e5f3c1b0cdfd2a307839a5d09c317b10123ae2ba69b31827a1af1f026cb7ed9fcf0551f0f8774de95931082e303296d9dc00ed5d1889dec0179175f1212c31be1c006315430b1cec406319068820d32870d7580f1b1417aec5087177bf45cd3e0067705467553ddbcaaf41a96f4a82f12f5a861903867764c20d0a4ff458fbab2c15dd94caa9233c6449900e046113decdc9f8c87125fdec51d5f20cab48112675a188c9dc5e7524d8a636a9a43e2492621b59937f4141a4d559aa46ada5468d2578a0b66629d894e9b4c6e5105f105050ea5a28126b105b8732a1a88228234a269035128e7037c47d1b4a1aee80ef53d8bbc503714aa4626da24be7ca166d1439960b449bf21505d5315eb296a678360b8aa54e1b098a0e9aa54956c445569f38064a82ad14c1b3bd894a64d8f2018f53d4f9b4aca9b8f126625ad4bdaec6672de0f9b96a9813ea84a5a55966e26e7fdb069999a385195a464cefbf16c5a264e5435553339ef87cd44c576ae73de8f38c1692627763bd7d91cea3b6ce77aba76ae9dac3217eb5932c0c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1811fc26c51c3289d7b3c986e468633efbd9218b80f733ac2866926a2cd173dea5782f09182e0fe34d31417920a2b5a16ec675956f64814251f8cd5724191a3f2704b8fbac775651b5de03e46d3b401d99006f4a86d68487444bd3deba12acf7ea8cac311144120d80f04b23267c3dd905e690b75821c94179609e0b26bbad4363739f0053b08432291482412a9478d9b91cd4ba21a086d88600c948124f80302813315354568c3860d1b369e1bc16686d5ed53c94852fd2102f29991901a4d63432291482412a9870d08a18d2eb5cd4d0e7ca1a6d8366cd8b0d1d9b00f161251cfe62627262626262626864422914824528f9b9b9b26f58f06d2332da469a64822914824d2eb7173e36edc4d48041b21997e4820754624e48fa626a6542abd12e926e7a561da47c74448229148241249060900b0f7121313131313135382267d59ab48f48f1e9037f3843c9a575372871d1313131313f35ea9547aa5577a00080056e36664f392a8a6d2744c4c8c7ca930221f8f19c9d478a4474343434343f3181953c55031534c8c813102c07a0bf5180d34693aadca39d734f46689dd5caf9b453f75f3e8360deecb4f0b6170c34093be3084c9e46059d0ba0167e8bb801532aec69a2679cbb22c6949392d29af4f89a3e1e1c4c606d2ca408deef9a8c1dd857642073e9cb09c703e38ac4772861bc9db802846e43ae51f0f3cfd09017175232076e79d81251178ba1bc94a092aa52105eae7614f5681fa38ca55eace1ee128e76217ae01a32042e008a23c191969034a94b661c3b174ff5123622a8bcda481fa6420cafbd13f7ac62ed4fc7ebc21381a7d98839a9dcd1b82112c3dde109c0f9f1e55961ef56dc88e198d6e03b70d1b6398a9bc70c1620c36e820063746f8810b16f011a3bb780e0353d4600b35b0c20e3062d800021ba8680315c2e006983050701ee1d8830d1846a7f4a8e4c4e1d8047402bbf81fdc6d4094286f00e165065eccc8c0093f6ee47a82b308c738f2c4c71aa5761d1d03ae1360d859d032f818ddd45c8c340887b385e17d428c31ba6e97d2b1b250005d9d284bba07db657a2d03e9de7befca1e3d12e067a57bd334cd3ce11602ac917dab1b411378841240487c441238ca3064c55da194b5ce681fb077f4a8bb9bda010f6f811e35743b9ce5e1681c8f3e71b79dabcec3eeb0408f1ade023c22dcc10352d7c6ad011b4208e18e3eb1008f86875d5ac394779512eff36ca6fedecd553e5b97e2ba753db24edd0908e76850d6bbced1682cad2b05cc6ff46567b4097cbd42adae74d731a1becf80328851b8f80343dcb2472268027d402113458f60757728ab3b94ee49f9de8d3391b64aac4750ba57f89c8ba418137d44992cc230caf89021f5498e38c051f449ae110711077de20e6fe04dfc51e34e5082a3b4b54731be9750df9de4c09ba25651dd8df7de7bcfb22ccbfabbaecbb2ae9badebbdeb5dd67b104208231de24bc988871aa3d18807672f0a521facd1e683a736a3c6b539d45ca3460f8df2b9019d1d19a1bebb4b08e14c69ceb08016aacbd2f2d88145cdae5404745df8986f5849f5bdef7b81f0c1f7021fccfbfd867f30efe53121fbbd3c18c82388941d3d827f344c1851c44d097e2f0fe631d127d9e5949e0b307c09c5c567d4e821c61863a4ba638c718a31c6d7a843bafbcdccc4c73b17ad30d680020a0a900b55bac6a23674b5b6a046c1052d1a67a705108f011f314a9f51a307299d8dd16bf48866479017e487ad0c15c21a6e0886d083dd4c144a16764e00630b788a429ac82428c08a19f9bac1d3675751bb6fb8b76d5883736debdc08dec94fd3a18d08a254ef6562741c8df72d7700f7a71b3338573ff0f4a614b06e54b7224193e9cd859ae5d4599d8e790053206a4ba051eacdf41238e0a97f7cc4c09308d7c053166e70026717044f5316375ce0cc039e5e3f8a432588155408edbae98e4728e9a1bbbba3c063e8110f1d9fbbbb29ea517fd457de5b4af99e7cafbb71778d1e413b4a3141ed4308a1e3a2876a8594345e78a31f7a0473f577577d7a7ed55ff595f728fbe45d47ddb2aacb7debb3ada4420800bf5bafad2c5f7583b0512305ceb4bc213c7a04ffee8e1e79b0a8373d4a49d0b4f40914030e3b60adfd3271a185a440937e02b07b89f3c1e1f7defb88871ef5a39e42d92082e813ca518e72d299f4a9cfc90661537ed0a21ebb2e02bfa7fc10044c09e2d6e8517f2b43cd23dc3dfcd027d9cde41eb8e8a18719213ec0108317d3cd10b9424d02a2d4ed0ece3b48efa07607fb29d63d9793e8ae6eb75331e8f5e66b379fde2cc2ee741de83a68d2378f707617e573b303034fd7e32dcbb2a25559f7dc7b0f56ae7ad57b417bac832613622470342611380388c031a04d801f7651e0e9970c9e6ee1004f8731934bc2d1989e9981ba68703fb296019b4ca8d4eb178a931c550c910c000000008315002028140c0845e3d13c0d44710f14001083aa4668481acaa320c9611452c81863082000400000000044004405009d0b287c5b387ecc55b5e4329ae508d11d57a1151ff5676ce1a779492bb3735505962154289cb3d228a43ea5145de09140a7db15700cfd98bdfad9ae5accc1a932a977ee54642e609a2600d6cd97915226f166a1676c5d700ff558e9f2074b372a2c018babee2361aedfb22f29d6ad2bcd205c599f1a32ea0c7dc7c95a7b8f45415cb859b26fe93582057fd299ecffa9c21b5c50290b31b6b4f8b6c71ae18b19809df68f559418940128cc2da712161ad1ff73e94d40c90570210c69f519110ba3ef53da936f3b0c873a81ea9440a459632e5d389b620f60662826a5c6b13fa0a9471451016e4ca5155dd1e6c0deb9f43caf912c1f9954bd43c2e53885ed06eb4979f94cff4f2c0d3365583df99138aed11fb9f3794837e1e689f1506b2d1f42b4a3973a5bb4f6042576b346fc82d0f96ee724bba0ee2fbb22dca407524c926af98efe0540baf965e399e37fd2ec03d7c61991c38b1dafabb7f8ceaec81c865e7d5bd09e4a398830e9c887262efbae68ff9cb769fd3ca42e2754e905c07f2c93df7c46b0638e7977375efc3891447a94c232f60b26fff9414982417f28db4535ff437e675562446d8a5e6754b6250556a4be514746da73772a8b46106722a54858122616fc87edf1667d7f6595b3a9570eae384abd26905983279f31d7fdd95af7bdfad52f882d3ed86a9d2d840ea8809b25b4fa4dd4d3f137827b5e3835076136cca0fd4a1748a6ad902cf574ceba664d43f2aa40f8d43d0e90c8aac6695b0214e1ca8c860d9a72923ed556c2b8e07c4597b6d0248787d250ed18165ec569a55db1dba53e6298d4a988828f01103d771ffa87d8d52621c92690eb1e00f4db3e3835c797c4036e2041c2e18792740ade815a4d68e89fcaad0738850e9591b829929fb20a103d39f182fc98d9e2e7081dd3e6625547d4a1bb856cbbd4c51b342c74afd7f441f51a77705bd1e633dd611439bde69fe55873c7a062fc6ad81274339f303220946d30fd31c1fb1c0b7c90770b48713de10d7213d5a32e497e19b93f354d3930357d89685c6b660d3dbc51827e30394b4b4fd461475347ae136d087d8290c1583f825146acd96e80faa65bea4a8ead7813fe8573c5006858f3f2092fd35713fc587e1e2d1086148cc1f00c9b3a48a70a2a2e3b00f35d7dc9052df115827d885df7ce012f44172cf11dcdaa2d5ad1597c80b61bc501aa0ba7cc761543ebf26ae97aba68c1e36f2faa392b87426a9f4e7ff665ae4b3c683caf28342aafaf2672bee2c31a7d1f308f577e4a27bc16f22698b0eb92ce1d593fdc94f5acceab07b104eafe0e8ae0cdf80d814b178d905e2efafdf298957d102ee15da78b9056a77e104dd01ba08e67f44ee8d2494fa82b8a7e87e308dee9ba09d289f53ec278e35b826e617aaced455ce98cd17e33ea863afa5eb1b689d5a74fff285ea32261d8aaadb8987d00c8403b465b6a4ba14e6ce0885ae6185b277213d68b669105b721aadc96d35f0d7c788c39b5d2dd363e3d70c9ec00ba4cd691e080c1099fcf42189b751966d9abea9b68316bfac8bc78829b0916afe630821c53e057e251b42e04b8f9dd851f4790e3270d68b61e5aa60fb1807388c22ff2b197867ac3f8bbc02df8e2aefde17341ab865ff2d0dcaabc6de97a2772fc79c41975e6ded2d05e8c17fadbc05486525e2f2051d6c2e051cdc7bcdefe551409179bf67c547b64fcae6fe75a226568d085229b3e8fd5ac2c22314787660a325882d8b2cd027cadee9915123a987451e0e13e024934f4918dcf60f058d286839ee3fa5632d9fc9a5041d28b25eda1835d472c30addf43d190fa8a7f8e3a2b142c8afc8e34cbabb9a55f8d188e0e1ca4975566599535427f62db94a7ee90889de2d1d50c919046f1e788e3b120c1eebc145d7a6611132adb41f41da94328210b8b65f61de336b4d31f2c0278bc7bbc5c39e847ef781d1eb4478f47867c996f7955cc1b960f598c616a1d8d6308dfeaba0883d6c67f7a1b7407e82002e6940074ae803a9db7e22e1073a65e628815b5295c74ae7acbbfb05160ddfb81c2b7032b5f0e94be31f0030eaccfb968d0756f45e6d404c0858d942dab7b02c0556071a0a6752ae47d33b4396c923a4808df63c9e260e428d5e6d7afa1f841085276ed84cf7088f398b554cc59fdfefe705de2485f369964a701d784605412b812bfbfe391f43a2ca5ae1e21c009945a2ca60e58b2ccbee2ead5c43d1a54312c76b7d74a23009d9e4cd419a07f946aa933d823a118baf7c03efc3ba2cd745c0ce6b03beb13515ace3cea93bed53b18aecff1c73ec5a5bd438446eb6a6bcf165008bdf338c7d6d90b5f786e0d4ac5d84ad145caba6a91755c470c5a0f57e993ee36df0a75cb4cac5ffcbb2e15bf1cb9e6aa9f1d032485b391e196c49d661932ca2a8aac5e61e496fab1db5bb1afccb914850f09a61bb2c43a2bacb266d3d592e3306a9c8992c93897f08a6008bfb40b42d4adb33061fe4085f7b32509dfe074ba72ebb2d15b80977eb799a187561e340f975a599bc90c119916181830cc2354a98cd428e0fde1096b32f9db865daaf0d7186b680d9c0bace6b3da1000a2460d4d45e07f33f6b96c41dc48afe8d8a7fb2eeadb06b32972cb0658aafae96b92486db194f440fae3feb1b8da3c15737ab33a99c81facbd88e6902f8ef2ad2e6042bbd4d92c14415cd46ad1c04334126ea27a788a5ec52bdc8dbfee16d481c94b5d8ad07f5c41c1fe22c835cb4159c022c964810e3aa098265bb4a6c4801989dd57939ba937a738cf2198c0230af190c1b4a26bc54ab89f2068a01b1a432142beb142b8a739ad720147f551b3ce21c88a0ade7006d1270fcddd138527019a57a78422fb16d0f15bd91948c53885cad424513434694ad3261aaf2ec7d9e26e19c57fbc5b7179900f691da4a1be3fd3de33bf9470d6aa08f89d17fa252eaa50f10fec2aebf1603c168120fc1daf9cd156628fd0918215eb14fa9c1196a6b333e66a2d6393a46a446bfc123d13c66bb9d97863203be90a6a651dbb38ef2a49e71334e4dc7bd28e71338cdd823058cc2765fe004df72d5cd87430291d1b716d1e6d6c5a785d60d7bce3f78906ae855418c0fd74b59043acd28dceed54f1fe85471ccf7e645f616c5087724154f6b0b38a3f3c7480c6c688347eb2928a19ed3c0a648b85c1e2927ee875a112cabcd82b787cb39094b59627643b6cf5084547e85f2d6c8ee9199a4d8c9ec0e5084efac417e3bb76124c3247e52d694f0833a7b8218c537f13ba3da7d9b17d73af0f479e22d1c4b34ae52f7feca0ff4cbfcce4abbce671e3c5a3ab4d2965e00e83a285ca038de9fad76a22b08002107f309ce25eca56b0bc9e8723a3b01831f4c944cd4c8d5f50e69685bef1e844e57a8a1d3b23de79e122611bbbd274f4964bd9b8f3b42675ba39cdf76f185c2018df3db51e9aaa790f4d4a67ac6146e2e1c3d2c9a22dca6ad12e9f9a2ceba85b6a0bffa0afdb9f82800e8a7d60fa98257254c3128a3bac56523ff1c8adccba3cc18ec23bdc86d4c113fda9267485d724bf05a9312e32d79534255131d85003f45d07108415070b3a244bbd04bb32950751271478a09fd5dde3d21b644cca7faf41274488661d8f01284ea2fc1b904783d73d01c2a07d8de85d69e19ab6c5fd4d416f37d56251d81fa43589eb03cde471f6348ed382f3ce115550f32f63eec94ed9d9891b387072ca48f418869b1a8e352bf9fd9a20fae5570d8a764e9486791f4abe73566e17125ef60e085db1e854aee61126867e8dae34e64d3f8fca9f1c01ead944a5df213c7151697a7f73a1bdcf416cf699e204fa37640d417d61f0209a0f55a53bad478b712665760af18e16a3b73abd7aaee1ef2097970718f41234d500c4ad3661871fcacbd9ce90f916061906bf1e56434b40826e744d43b81eb320f544157d99a17c35d85360b28417b643e7009a9b673e3ff14504bb45a8da3128d92b78d8cf7e29c9449dd7c1df3447fcf234b055a457d91639cee2dc563b3398a3b96d879f1c9fb44fe68926227ad48ea4fe9d9f070bb3649189e3672144b43ccf0aafb65e7e5160f852a30a2efd85359ed605c7b3b5740c91b582d4be8f0ce4c5410d798b7c0ea44a0546917965882c9aac272c138f95cd3c22928106b03a51bdecf12aa35daa2242ebf459aa5505014252b73ddf0e1dac07f8252be17451f0ae3c32a07c2df3cfaf824cea22c861cd8aa1801fa9b588afcc598e66996146a5718189666da602e3d1e8ebed6627a72bbffe35c64590ef79cb9c9447af002c10ca5f0546aa1e537fcfbcf6df4c852b71d63427eada4d2b29d3346645cb381ee4345f45c3dd5712374f0ad8767a05d5f276343ffedf4300e62519b2eb9fb373094c6ddaa4047a5281c43be1772a443d815fc89e8afcb719b8b5255a6cb05fd3dd5c2e0d601705f1e7e9dc714cb02c7b25c6532c8de79db37f962ed400b49c0a5aae0f19c3ed700006be130912daeabff7284da1f8b282c20bc0b515c5a5f722150cd07cb872739224e5b60f1f305de34fa04040fddd9c65c0efd5409ffca387c6692eba8936d0ded2909c7129c0991a1238768097a83885750c1cabc7a32b12aaa36d4f48548333ab8eb93fed0df3269d0c4a07cacafe088cc1d40e80f2dcf752efcd35da2d62689f9a4d227d83b7819fe0fb19f5d92ad586683f168b8b1d734acd1f9083b1083c5af9e109819407589e7804ca280e1ad5e0f12a70dc5b5aef283aed2d45b159ff91eff2ba4889ae3a69717a759f331f205e250219fc96d1f657abe1e19ad81978ab805813ff69dc61ee4325c7ef32995314da896afcbece69fffbba7f8a9f8aa278b135651988821b5dd68674343f4451ba1f3e9539479cd420b13990fc335dd1c39b45a7fb2fa06d0c6f9e82b7742ddc10ba88a27f8e42134a9ab28f1b58429f7fa513c7502eb0cabba701d7b263fc22858fe570bf4705167492d7e96c516643a69600539ceb13d55d90dbf3ad0993c41fe5254d0a8cb5e54d57e933541f302d6a169f0582bf989828e874810173de8a4608e8bab4c3336ffc8a0729b4c229bb3dc13939d1d7aaae1fbd80b7d24750e6575bc1b4e9cf305e84e26a2c82be51df577b3d9aa97b4f1a8504cec0f6becc3039a844d02797e30de1d77e2b237b34289784fc06027008924f57974e640250214be420ddaa5e01ff53d64b14f87fb7b9c8e66742a2a884057d04e919fd057beb9a02df0d85cbfbb6bb2b03ac357be826ce01604b637210eaf45555dd1284569ab491d7118bff85317a2dab04ba07d33a4d03d5bedd270212209836fcb812bc76ed623e1864766933763bc3b52568d4953e9b71d11d563b17e2eb00f4c52d15f8f8b9b9da9689b3213e5c78b54fa739696e5205e5b726028032e6ad705385aac24485fb41370164dc138e9618ff014e968aea34e48c4e66677de469d932596ceea313a32083b588b0f547d90d77effef2337da50faae845b31cec22aaf42b83dcfedb6ef161a5a9c7a654db165fee73f034ed34027c14fed2b142ef4ef9f8d62d859f8f3adb33d10217ab3ab80d97a83dbc029a98e68910ad863dbb9531e8f71fe9cf7f2d963e450cd54f0208b288521ed38e018a7696599161e1d5adbcd441e803218c80bd4891781fc86d23841e706e8548480d7246080f171596a3225102e54fc0df8ba6bae40832ce84cc85c0969c7609450d7cdf4ba2f879041e2f2068f60a182fbd0ebbe789299bacd96e0147404040fd01405912e5ef03faa173388764ca7dc18e71ab3a67670416e2a1c95d7e5c95d521244a2d9200e297b9df74d0161db03a7599cd0471abde5dc2d5010b58cc398679e6b744ada42d9f35a44bd3371552b2f1882e1062bdba56fb78781fc63a7df6b8b54e62301f1f39dc480a8194d63a79322688ea8dfe8cf20f4d9ac309d38d1eb96e0bbe6e42c944b81caddc73f27575b5bfd903cd7f97af8194351bfa20a34b8c57785a7fcdc466d8c2cbe91e79b63b701b8f9230c8048e10f415f0d5d1a11b8d623d069dba202e80ac91f8b38df6f6d111b4a4c4ef42674511e8200e12819250bbc9823c238909ba4a5eb904d3cc292024a0683b05ff6cda69214a45d94362d8be137c20325a734ee1cbe23009ee53f81cb33b06b3cb75dcf54484b09b485773ecbcda9737805730da9a96c7af047c8b39f090f0f0895c40122c9c44a51a884d496c311fa78db2eefa1dd3f20c49f1e96577feb03a721a766b5c937e9177405ce398ff1684d16d81c1ac6103fbf674ba7e300c9058d895379556ca3410010f82a2f1d3aad8c8a7030eb8f0b476e6cb30ef233b95e930ca4cc91433eb4fb1e2194e27ad43435ddb434c53798f6435aac754c6045d5e475633435d02b1d768014cb68c0c3b814dd9eb2f60a3e9ed561999284a869c602d6c7a165e2925aed38d5301f9d0f998682b8521ea2b0805511beab9bc3f1605dd542a3085572741651844482919259ff97384b7aebc6c31319f0e625e484451ff98d761b88c71eb882eaf7ebd4e82d76745bbb5f325ee4e14cb32da1b8ee6fe8e2dc6527aa4646fc474dae2c5ced6db52935fbdf4be575eac7ea2d84613eba9bc85f112306a9305f2eb26306f8fae28896eda385dd6b70be475e0032e8da480d3747848cb28f8031a8e84553832a7a3907876af9e19738926c0f00f1531ec3cef9d6fcd75c230161e8c82aa165456bae1e465e4c6d4e24d2e088dba5bda70c9dc8410250d90b5ecf62cbfa5e304283a2dd3e64dc50d407b47c936c8f60e7656b5d3bd34ebd93215775fc3ed2a9fb6567c2b9368c6a11119ca0e129be8c5afaf3a6fd82e59d8bce1c4a754a1e7b71d0461bab11d7953913fef161b92dfcd6b6853217c846fca97dbd9fa9805d22a14bbb9024e5fd15daf5680b4b2ea4be455ee505a3fd0feb6b35b27620c0fa502306c729f141b0076e37bb5b65e40f3b547af489e600834bb924437b88099a8d03e55fc2d892098b8f003c3a9f9e08a4ffeb1d755557a0baeb23043277d684190823751e9d6a710989c775c1634c8528bace9190f3defa5e062bab2e2bd1c32bb2128ae437074ed9c9b2bef9761c2964ed2ab2fa41e540b3fdbe3862c4004275006b400952d27043ad270cbb291a291ab6d072317a079571b44a6f4e650616610141be16dd2a3ade66151abad59568b01ac8293b39f30c0d157e60c8712ea29e6c14a5988df7c090986dd536ef86373be9b8d86f824886bd86adae775e3f56d8222bfdc32b81270ce7dbbad0a07c686854f3528bcf70b2e5a8b73444b0b5c235b8b52ed80543dd551b6fec82ff8835bac25f4936c598ae7fbb2a95061a5abca8c6140b936fdbf4fb02b231f0dec15e5dfc4c7495c0177d00ab8c6f6b4dc9c06319814dedc54a56a54ed928b2afba0eb27a31746a36a4244749380108d8f7e79adc69429f44b609ec90ec7d03c225da789b2138f128a7b8b283aaeaf70a8613b2588b1aa309408e8a7c051623413b4783219e0de793657e9084b918cb36c4b277b08dd6835e810dbf45755baf0b3a084913d0891b27f931d8f51ef58cf644ec585a87c2f8b35e5c061bcc366d903814fb44b72382ab080244b3fb4952c6889c926366051ba4523dd4f4090d436eeb011b2e1a1560f10799431615e34666403ba11735e031ed5b231f92d7750aef395916f3b32c2376df40d654a46a5852df1d4a20604230eee981651dd3864ea1f41a2b28be8459cb5b7d0752d6718282d6b3554fffe6f85a6483a9a296a8646e4528ed55ce65494e9b981003821021fec68c8a18e64bd542b8f96f90000d28f2e0939ccad1a4f08ac738c598da05903ae4490d87f62a7f48acd2336799b2b086c02bea677e979f0d5065956ef044f491db1e754770d142fa7b68b6d7b0bab8d47d65da27635eff022738973565792544089c096c43acb7173451a4194899828e6822ba8d6c0136c24746d035165c58ac70b679dd79108ea420a448c1e74aee2248a8e40e67435e692956da5ca59bcf0f7b8b920dbfc1547f2212d6bcb5f057bab67a7b725dfcfb01315c1975f41be545393c70fcb619488b5cab06823c4df906960845224d57a5561c3aeebf057807522434c24ae41bab2d2f231ef4b479dec0107ebeee958a3f35f10bc2ed7322a321c99164bded56e9a607c8ed431028d46fec95c69d7fbe4b122d4bcc730f9dd8bffeb94dc337e7308a692ab23d7c6eb9b73b5a4239c5233b13a22fe328048f7860f6a7f1ab152c3b707a040afbca21f043744dcc10d1fe29bd594b412fd545b8d2c8fc8556ca540ae25e80e6439ec912a92239c833408166b33abd61adf17456915f2b82b72c714c7ab0d81d91f569a03416cb69c76082d44b09d4f3be1493b7831672582bc44ce4b85cb183694544f5661ea16c6a68c81159d3e88acc45b1aaa4a04c5e85e54896051171ab004f4aa159896d297ff903a9cf03a69459a4a048a107f53889df6edce150a33a0100e4d08814325fd0ab21251ebbe725dcfef4377ed3be752c6d1396419b1688c3a6714494c059e1ac79f74ff79bfeb20e75173227980a93862f3b3d1493c86a770b96afd17522a5182154150308b5edb5779d453472c5341b24de61453004c7506344e3634bc48d557d1c96101f3d15b526ce1875a0445b84ddeb74cf7897c882a3eb6357c328d95b0a4f422d0e1a86957434424bd86944026f0a090a281147d6ea6155ab05a1840d836b49687135a92228fdc9a7dc48df50505edd0a85c141178e3eb08f81fecdba02bbd3d07c3ae10cc7aebaabe58bbd766c1108c48df7f74ec4a5ede556b9694ab779def801b03db5859427d4eeedd479d8d033f10befaf3bbc5cdd457c9f79209cf8a62ece3af58478340f7be038a3b8187ce17c86461efb12cbddf4bca47f709cf9b04933fb573f34ee6fd5ba9972949c4335e8316d2dca95c60d7a627300643a786197f760c48b51c6de36cf7aac940524d945861102855f8197e0ab452cb702e60af1267332f6af0dd8115c7c1b1b31d58f412383e04ad1abc69151e2f8ef2e570f96ad8c4cd18e4c82d0601b4ff6f065ad545b161f91c7b52b26774314462edc04de7d1e182f93dad30b3cfb5705c372bf53b7c296bec3b60a62351d53bda06605ad236aae139d654d32daed08be69c22c8a2d7702b703bf9c6833e8bb3da9b9c13b5d8f8150cdc9031b3a923c781ee6f74460c56513530f63a11beff2981804ffacdd7f88b30dd209c70c026d11c043141478db4ac2daea8489c22b64c21ae8cc06fc8edde359660a030d34e9d80d61bc025c2726af078c7a0d7ff6fed1b704691c96a08e4c0058b61a95975e204668c31a1133d910db9fbde5c42ad39f47fd7977b0a355a762f1e354e6f3e8b8baeb17381fa54b454ccf58973db93cde793a7297071e8d5b066acb7d35840799a7d9c48dd5e2f507db8a0a8105aa395965944332a366b1c862098aae5d2ed077812fbb655371abfa9e7ca7e9be5dcd7a1cad88158e11421e48e3cf636f98da8e6150470eeb05ce58c423baaa36ab4fe9bbbfe8cf9212305bd8ae8522c40fa0dce6ccc0f603689e820f9692fcb2515b0628fbc060867c8a1d630176745485bcee1f7c2b2890e5edb4075a9062b61ae86c61c849c2f2c8eb819d92a74b725e196221526faf73d0f3392a73a2f08b3bae04c987240eb875fdb8f9fa6452924af4deba6e2d5b4e1d9f48e6e269b3bbb3a51b52138758b42e054ff64d2ed2fc46814037acfa602517abd3b0d4f1e13b8932cc2a8e00d2fcd28a355f09a68ab61c081593b6e08c57b6026aac05179e430b346434206d76f652a174b3b58ff841ecc0ab456d36fa14d5b7537a240c4c892bdffbe0de769ee893d4d40fce063bcc07939c6cf03c4ae866aec22e42009011d35e4204c2cd48a1f9881226bb60a97117ed80915040adfe5be08138bb333d595fd87f242848fee3ff646eadfd3901f3bc793d939b82a2eecaeba584c9d3578d08c2b74f64375468fccaf7fea811097a06b49cf8009d979e676573d2b3a2aaabf8ad4e2a388bf997e1f69f01eee7e25da31a857621f435abf6445e99112a65ff1223c53af75bc946748e1269b460bc6b524a42ccc459af93f1b3939201b67405b67562877bdae3d2015397ecd9619aac2e2797a3981a3b47e385f416420b63dc19b0ed711d1ce4955be4868a1a2de7f520d2e9c43889e8e007ded5c4686cef4b05641848f86cb0a7a7fba932991d31bfe9543405d621a6d9912951290f581680bf5bc55e248b011aa53271e80c0babb2decaaa5ad942aa1a58cb34501f74cec9106e24e85f215022aaf2dce524745387e2414352826a0168fe8e2d32de23668aacb3408b1d5afbaa41f29f8bd7d590013884278eeac13be908c353898d7d973e04dfdf0a8280d3ba6f88bd25e24100418d66445b92e580a645054c7c9e75eec11075b9180bcd8f68549b6c1581239d7caaec4ca85ee6cc952aa596662731ec7cfad30b81e7f56bde6add90548c271a6d72d36590784c511af5eec5c726d5bdada02d19c8b3af7f5e58768085e3e9796ad8081a83c233aabaec0000b8ec674cd9a0e9f2423528a41777e7ebf08b46d1c63a3b2b561edf47a88b1b549578aaa90204f6a908b7d82d42f31c8784e003f699b9765523dace44018b99372d8c82494ecaf7523ca88d5cb6727c8d51204a12d4af0770f9936fcf19500ad6ee51ecc39ba43773044dfe6ccdce6b2d6de572a3933013f8dc10c1bb863eeefda511521df366508c0be55291eaa0f9d06f67c0e33a5258c37c77986e9edc4a3c78c2177b6ea726bf2105b26b8eb80eadde9f7422af016e3c68d51ca1804129916f3a1f60ed21de2a64b19309d55462907e7b8b65e6f906fed6dd17c410864dc2519e61f05c604bfe0a8394f9334e4dc2cfdc3f21634edee7949f2ea8df049a7f71f7457c6014c40018ac71d7f1611b41decb20b008825a6c4dfda77a4d46c15f8c650001d6c006b36eaaec2aeadedf09bac1c9c0e2b113125db8b956634ff92ca32d8bf50fefefc65f5dcef122250f1e35b03191c51b88ebe413a53b4b5dd67c98f39239070550cff49ac5419c07f040b977ca265c91745797b98886efe447b487a8744d52824d3264ef60ca8f08289696ae42d85868daa815d354bd48eff85e033495b6ab596e341db75fcd50e53c72ddbc3f66c8c223acddb42336c0b166f4d2d7c4c20acb1958195c2459291142f5c0ae85e97e37d0444284c1680d777321b7739437e5501e1f4ae7181286beaa05b353dfd0bbd4d577a831679019baa33430a26195dc367d0512f729a490847a65557c4b20a26afc000bce439176396e707a3292a58420301882d9bc2a0ac7bd6db0dec3589f673595790e86e3d2188dc19f60c574b1938d189b8a0a7b9113f453acaeadaf975e33aad43141688fd891cf33eda6f89e4529cb65101d66c89b412e777ac95449b47bc6f9e2122d21cb1c466c255d659826d44885f852819daa3175cf0ff27e2c817ca2f9093f9fe871dac24e14304c18e9603af529aacf40e319d1c9694cd1719e81d131e4e73285864c8570553c9fd31450738c712ba0a7a03a128c1800c68b9d5ee2f3a85b630584492ce666a6eba4981364e84b03d282020719cdd8f2737deb1dda6c4b879c26b06983369bb2a2fcecf87d59fd090b8d5fa6990103a7c9370347c48440147ee2fa0a1b9f4b9e2ac286cc0d050a7776b2827d71e2afa8ecbbcf348ea7b16da420c1cb11bc69a5e48cf7eaa06df73e22bdbdf535fe08de4f30519e490253a6eed88b28dfd833a9f0589bf1764495c36140ae76e834367ad9a67ff86f31863573c6d1bdf394164bceb802cbe13e5b826bc5a80ce2867728318c5955af4b7e5e2490a7d85818b261468135db65b51471a79b20d2c0c064e36d1e56edcf8ba9f00b4de0a9db53d09bfc69d9ecb92ec6e00e7c7544d8b24f80f41d31d6d46f77adc9e2a2f033d849a0357dbe91a5d09c22e5d28bda1a9690055631f455e785200e143f799d0ae7bc5309db4aa70fc862694a6a7157e24495a608b6005cae1ec3fd85cf42b454c6cb256bb4c4c89a24f601da0cfd5f2ad3639c7b64dca2cd34adbac10e323c98b004daa9557a1358e6799751225d2ef17e19cff4554bd984cc0dc513fa9324da0d9f02ff0ff374eac3ee9a4a9130aa003b1a33758e3af76d60b29b7504afd889d49bce08e8f087241eed2739d69cb0c3b478f9bdbfcf56e6370ca8ad3b497ece35126e72a17fc1cc13f04d378b181f2ff36edfc12edfa307a968fa81808f41f54fb53ca56a9b6ebcd4b2151769b1f1cb99441422fab157ad9d0cf73bff4cbb8f2a25c49f743232dbf6cfd9c16b7efbde44cf34bb5ef09a325ab7b54099a19da796b1d4d7b40b6b28ac2f073daf76afebb3a7b470e1e4727860cff464be8bea5b972585503385905191351cf5e61a656905d69d9d4ec9db080409d27971c9a1ce8d0d28110f979d159f9ef078b4062af1f28ece11aa986ae44fc60364dfd28bfd5f3e1a09b9b56eb4227e8502d51c81b656bda790e59005a3d148e1e997b2d5d14733c0b34ed9d46ed73a6ddb1035c0243671fe3237d0a7028145c460959f92c42ab224b0bb7596e67da3cb0a675991bc095b982a05422c4466d750a032820f74a71e2ad6647afb4cd5ad3a95052fd7475570395de6b9c63cab49b38a5b9876af515479377a60d8855be393a98d8abaff17da93e160e620ba51c468df476f8831852fac7567da12ab41fedbc9de845c2b1505c7a3e441f92baa035f18ca20291bd8492721234450e9f89d5331b6e613dd1140837f8d0da93fc18bc3a84c71a1a68bdefe7abb6c909b69970f2bdd1a97d581c05a0be87c30a35d8b6d10ab45d87bd83b7a197bae86c0d7fc852164e59273c918966ece478750a74c414cc3bec0a9f62ad0e34e367b162ae99c9fd8af2fbb1769fc1aa079c232d79e7792e8edfd0246b2e36d5f576311567aeb464fad847d90497f5e534be4cab63b7319dce45be8ee17b8c6ec11850f0dd7243e73452ba8fc359251bc33c3051f35a04a3a97b2fa40599a9f263c451c9cdafc376905c8a558f622630f2a8af9a1cd6ef987e097df0ae1851f949cc8fd050860258186d26e5846819a3320c151b0dbfbc4aeebe3eaf855acbcc07ef16d1b36c7d73b9ee802a91bcff53b27fa36c56e9856b713857ade745f7f75fd7f19c6b68b22544257ddd3e677b41a0e084b1fd71da53a001a2acebe65d23bde158ecaaca51ded00710e35e8a5e2cb611fc90380a8347b0ed8aa4efb929ab53a3130b2db983e7daa79c8a0239862e328f0cb0cbb94aa115fb574b0a4ba7659ceaadd88618a2962846e0d599a5c8857858141425e6642638dc3fb1e726a07d5143c87ff34f63fcf9ffedfb0740a1f459ed8e84cb1fcd9069e227a823466488a14eb9bacf972116b78507f49f04e402c772caaad5df672e0a3ff2e3ad84f18619f121aad9d940ebc4dd9ae3d32bd2d70e8dc2dcccbb027f10ac7e09760db614099821a25e9b56f5b569d79b16fc4199f2fc3bbc6b1ba8bd8b5095f949ea3f3298109afd2bd657c2f1997aebeee5d7d96b5628e36e2420604cb1120e09407f2fca0f0653e7a4096e787e11be9aff98f5c079a9f142f1c0536478dd3e4df34d2b4dc60d3bc5230714e151382c3cfb8dbf534d020827325ae108cdb7e028539be14f2d1e493fd12152c35f1d58316e13571c98b32bcdb6fedd02ce6c31f9e779a98d35b5bfcaddafb3478b58cd727d613f7ee291a36a22b65fa85411502c55d7ab741304f80a7f85220080e62b74146fd3379150f4f9338aa1e3a28424dd30e2663cf2e0650f71b4765061de33b406de538290693aa41f4e1f887d0f06149606441dec29f87f813c2c98af1ad849d6e1f98d8f551ef45efbbfb57b81e99cdeaa8c463fba80cadd5edba36fb60f09cc4c78d250e7c602f50d44861d6df334b82a7bc242359fb5c4adb02804a5fedabf82d382eb61a3478b8016980b4fc94d2138f05129b649eaa16c2aa4543a243395792bcd66c92ddc90735b89e42080b48fc3169c12cc3c0acd2c77beb1eef262b6c0b0677c348b61683cf43438c269ca14a7e38ecbf3cb420f29c7c370b64a5a48f15d5f0f0c61bf2765d80bfd559c5aaa2b0efd28e40d55b548fa0e275e24b5fc26f946fc9ebd72abcccb3890b541f264a4ec44459ec074a0672bfa59a23657dc5cd340b7a5a8f12581010fbaf35def7666a083655010c88f92c369d1216ce84888614c734ebcab3f8f31e3d2d3e8daaf2d1326ecbe8d6f22e4cc21e60617d9bcec01a8dd328774aacb98e3fe3f98c3ebbe1c6845d4682aa7a559c9897e40c35025cebf59e434ee560a78e71c5f362b71a14f649d9761dc1ebae4388b393e364b78f5b3ccb6dcb4035c19406000851d3889850c4b3b211dda22976df236ed0c39aa7b5cfd2720ae51084a6fcd4725d858e2cd70e876a2272c6534b2de93302c0a1382749431085eb11d29e5eeccbe919fb1f0d44b398a2d2f5d61502b568d72735adca62ec1e852ee6ae9107d7b64b2c152e374d10b48e35f977a7424635cc06da96c6497b8136b5603347f08d7ad55c6f787373fc6113f7a852e2abc1f3772973563871b2c0137e7853833a3accdf2504546ff4c594b6f54ae87c1cd54546e4b7491601a979675e56c14050f9ef024ed05513c58ce50ab47e6a5befe730e0fd995907dca1a7741b772b632d09e2db9c405a0468802603c90c01e8b2ac0b82f37eae3bb75532adf0bd6c1391d560d249d93f5aa6cb9d4f48cba823d96fa53cf79c3b97ada9f52feb4f284ff79ad3d5e420ea869cfe93e719ac716a5eb49505c212c6734014d38b2eec75a0ed8540adac662122928d906c6e47b18d191fdca9208892fdc3b6a0303d5fce55ae4680a2bd40d0f399bddce5ec15de65c0e211851e2aa2c6a98f247989dea31f230f293615bfafaa17bfac176c9a0be64f8ab822a23ece949280ce06ff9cf902c32f1854a68314c46c6d5bd12fcda8128b9c39d4ecd2b4bb6118016bd71345a206271ed286d857ae53063846fd8156d795bea19c42996acf50a27e85f239615d963d197b9f5da290c0a2549df196185e605c7cb9a3fa1e11e07e07ef3243cd57e236c3f02d89c658e7c8f3056f864476c58f71681229baf0d243a658d553a8fb54fac932af8f377d608fecb6e52e8355bf36f00c4258f81916c7083b51986af236333b91d245fdddf027702c5d52a936775c8b99c356f1d1ce8f234d7bd6fd3422b8cdb980a06fcc499436b2cf8a6f362a2096c0ddfd3ccbd787371cc5e4c6b19d62cf1ff0ebb29082ac3cc8f87b106d22203b25c8a0d50510e960e0f13fbdaf96bde101b92bf0f4d62f3d275e74892b5195504e616180b23f84e0d01ffbb43e9f8d6a82d710178b0b85a0057e921f2d1030f208cda480ac63907ac02f048df188d24452002dcfa89389efd0f194242a0b7b3282a860809e5818a2d51748f59804b4e9dbce78f0c6a0f42d91ccadf82c6f8bd966f8233bc003d8c8d73e4c352df0e504afe08d4650cebb7bda8cc3a50676a03966e3f486b5511ce77984ebd08ed41bd450ecd43de39238b6c46fc2a60e3dab610c94fe2a82595dbf2b77aa2c87982a81d1f3caacef29e1568e4aaa5ca059b60bb46e7745601d85e5bc4ed5ad471f665adcaf80a1db021c6840005ffa39a5658a4dd2060a11cf9036d794c96f4f2e353f3c7c6f3be10f75fdc294a57493033da0d33d0ab73ba9b849514f959de4e4b8a60b773c0306b25d3307365a14dc70d23caa31846250bc942ee302a891ba6bb13cc94141ad5975c8aa4b9dc11dd6347d4c3895ced26c5d2ac8651414d3a150d80159a331cc57f9ea4a0ff4d8a7342f3c1891b6620c5669755886a104ae1b4dbcd52cf2e46c05a5dd0ba4dde42e064de9fdcc494538fcc75ad173e3b3c8cd82f7c023a89894f7384e23277f9771d8b2ee4a4e61923347f99950d94561b337104c6c77739e1be064929d766d228c08a28cb3636f785be78839c332f5e298ac5f3fecb2fd19e0aa53d2951ce0ab142fdb8fef0f34114a3da7a94924321067721e35889195aec81016c087c10358d5f8a162371a44123c2fc9f1b47aafbe87eac07ae1e0c19240ca80cace7bf9493188e449e4e18c2f0b9d094912282d154c8114f3ed0cac56463544015f288451a1eed9e7ac66e929b60508fc832c84a9b2b080298a2088f9d5039e4faffe65b5c7f2b807c8cf2a1719a670a93ae5af65e906105b78d5c806a565a84d32d69ac2089c87659c2fb7bdd057c9a49479614474ae40df91f98a9de47940a701d8160bc584d72361696d84feada10a52a95f4a891b205304f94a60cc3ae482051cab675058a879662cdb28587ef0a3ab164a07b0ae2d38bf79ba574ea14801d0d3f3555544df504a437a9480d48cc1b457f20b67c6cf815027ea2699ca5a85143f3d42fd57d5e315a5a59387793ee678d50e3110f6237eabfd9f98062a51e0e08f14c25ad9495dcd55fe2e588bf2c1086e05314e4ba1ec41ad2a2b1df75e7d4f55e0326e3110f560875842398b07d425e87c507a075d5d0016b304ba1c82c0d8cc224d3a405a938d5765f523fe6e5bae78a79883b9b0f9bfd209c95c16b4188e2203347f1fa679139b823cabeaa7255f718f84a3a1d3d2bb061148dadb5cb93b02c1c0836a165e869b2290aed9bddc212d6971453d00eab2e67acae4c0402ce4a166dd45f9b746bb5159f65527cbf9214adcdd853939a854334d95e493ad30122f43569a75e3b29c57bad8515bf5bfdd2abc125a1a43b87bcb5a9e68972d5aeeabe50e26830661b0d79157cc4f9f0a34169684e0272b439bfbc36a3c564edb1f836521d3c6d40b3cac1b7c91bbade9518eb138940df5873a55185de23b09f1e6e454a267dad38b26c4555ca46ca07dec63af53b885fcf045946ab768c6769151241766102042b81f5911f3a7e2cad3657b4ccaafdad25e6bb8d7bd6d5a66feab96f4162de24979182337c9e65adbcd9ebfb418b67751ba058e63a7b200c433b845a1582c1f52569cc80c5f279dd87cd466f8c7d9f8e9d87d0c99f2add4431ce049bd18d7767030487e02dfea1b089f1732dc36d9415c709fac2e6f1969888a32fa24789a7e5a45118bf372fb5b00483004ddee5be5d17e7f056100d221cf39d1803f9a092c0f5e694688d1fe11c468e97e51c348af5ce3b7db676a9d289bec98e18367b6ecb4a3c7ac8e16a552502b329b70659ed98d2ec634d7669ddb35c1f9494a3fac0d1be748158fc046d843640499fc5e5b663101b656194a88143450a4ab2d0dbcb1923750c3204fed18a03e893e07dd878c9bce83403a6d2181d9f0d1d083e74cb600bed7f3c12370e14cc6e0092643ad47c420ded9c3d947d9f61fd1a8acd0736dd432bcf994969a6f31b2a940f773762f964fdf1bc3a521c16095187d01a94b580a3510a28a1aec82ad371ffd15e0e59ef8da8d10d08154ee4dbdf31dae1bfe17d41e20bed50718c74f2cd9ff025590b752373f8a3dd33cc31f38afacb8d26c3f3a7919bbc6d30a900321b4d80878aec4fa8619937f8495f7f6930a52d480d302451d5a486edf431bd9d05d4f818fb0acb960d2a17e96db683f5cde9c95d721008e04e94a4511cc07ce74b10244c422f65bdd05f5ae07f58d820a272aded9f66932e2930b4c4f72719910b9e44e2f3558d7fc638425da4603421a6bbbf4c58ac1d97542559aea3bfaa9f5fda5540c669acf52c1a7019071dd2ce7983aad64482259dd3b13f5444d72ddddf13c984580cb02efd34cf72dca1637f629aeb4c147bae6a20ad7070b3891993a30721f49a10a189986632bfa441ce679a5f70cbc26d1d68789ce8638e1ae8d187152fb3e885f6e6f8e224d9b8dca6fc6842a9a6d13f3ffbf8aea92ffb7002fa140cc3c337c2be6c91832a7c5749ecd975ffac92a6aa09234ef482aa689e2ef026895613acedd7480e19e5f8bea19acd24d6c0c6bff0579e2111e079daa0a6f2cfee07444becf946e94bcd864356871cb5d64209cfdd0cff26089398ba6d71cad24c1b605992bb7fa33f0efcca7865717627aaa16a9d804b962ceb64af4ee4465ba79005b6fbb207106a55a87015e8272b4f8869cd6d891b0aa502b44bbfc4dc22e764d7fb81472a78eb92378c9d2c37b57e5b0bd4368f9f83a749a64fb1904496c5941c07b59d437fcc253a5410201d414db030afb7f7a9a0c3c6ddc2f276fdc56a18e9219c58d814eaafaf269940b395981ba87dc99b9fff7bd87ec0e1495f3025a87de2836de7c09ae7742a56f6da2be9df59b85001f9eae1e2b49a706c8f8b1209e225424fdb30a209b7d5fd54d12fa3f79b029b0b01153168190ccad4cdf339eb47fc7b6fd183bda5d24ca7d4817da023443551a729224c65df481aa0611183db2bb9223d04e1817c20135b8293ef3ebfb8077b8210176eb4fff795f050d838fc48c8f9a23a51a776418bc1ef12264ebe8afa6851405c91bd1267082b049157e81f296243983a00785dad3f4153ec03901f962648ac8f4a85bae43f51c88a28d5e4bd264cf7a07c9c8398e2e11d3c12393ac2f92d40c8c7d02eb502fa51736c9ec5570a404aae25c5c3c4db8643d0df076e482d4305c05b09edb7e828a90c4f6fe42073b5811a3866fa4efc576621bd4c8ac644210c4dc67bd602cd3d7e860cc41451d14bb65423879f2586fc4d8995bee5db2fb9a267a7e174ebf15e4323e1513c56e41de7d6eba0f5e26e6478231c6fb767b11056057ff330d28325322c3f34cd618631a3af6deaa51f184a8746f0a5d9d96a6985b08e8982156cf6ab81d658c9fdc6de1c216ca94f7f505792b076871c87f6399015fe27a4bdfbcc1148a165802472cb24d0943287817d9958cf0db57ff376d700bf131f0765a84e3b3a5d631f159d02d63237c59964c1611ea2b924581d31c3efc0ef534e53599dc6d1e9144745b05d702a5a17b1dbdab2189a28f0b6938e91cc8498d68ad51f1d43fc650a364904b4bfd631229fe8d2fe2055e0540a758cab944bf14d6b6a837c23169da4203ffada05012ae720566e6953740e74ef207c9e718889bba7d318f715283c47a374af4d7b5024010c962f9cf853c5017e4c34a2857ef186002fca2973d4f1aa6438330a332859e11ffc21d6a62dfc5201e7af24517ec6b57388480e6937202c3aa263e06620cae9d90f18a22edc0c234876eca03c2bae5cc2cdd0c43790a0328d0db6230552cab5c95784c9cd481686ae4edfee4c5e71560947c917cae7d0d7ad5692702c5871d5187f4aac318c0afcb33a84818efea696d102a566274d727388723275d027226a873ff4523e3798ee7cd20e95788e678580fe358ec780d83fd0d60061dcddeac0143d3d52a31122a4a31c6803dadf844b8dfc6a8f86a9b906467cd165db30ed5b0a1d5403c2e89a20e83fa2084aca65529e5f9ae1fdc6513db1ec2b915b7460c4eb1ad90fd1ec70246e0c1e2f44186d8672821b7fdf2f802cfccd9ee269944b4edc3e721cddae0a1b38e2ef3dd8b3ef846b19c105e843992a5ad91492a0614d9ed76b24bbd44048763fe4d3dac29dc8038c5af8a38eb1c828414b73522551161fb4aaf2bce0867b1c309a7884c7bcd359cdd3a729359aaf5162ed453172575cc61a9e13bc53b940699e8b005d31b7989ef2425fc0a655896c24af9290c62b37596df86c9a987000e77fb7ecdac2850e8bc09b158f0f533d8a03b5557e0e9e61a620a434a63424129e48791d285c035d0b4096b5e2e666e2d26cbc109f452a56f366fa3a68aa7a6089c6a06a83074981db0649a530ac0615dfd606f058c468ac547122ff98498f1b47e83cae59bca51c9c116ce5a75bf058bf6b799d018114e6dc6b63b423b947b1513cae82e7045b69bf1268aa29f6527cbd06a72890caa80bb0b91334bad9681b035da80c279a12980ebf228304c9cad7e9627e81143006822a92af1119916d354653b16815db3f280e3ce27bb470fbda1e6c88c191ce0209e37cdd26273224a87aa14ad6639226486c8176310f71bfe232da2823a9a0bbaf5191f9ddb05adc53ecfff28c9b4fcde50093aad13e9c14612004ebf33516f461694f4131c011c36b02878bc4bf64af25d74b8f9791bdc4d4a82e85293251a320d045c5b00f1db02c6caf43dd191f96f3e6d42347f8d1167d8e3d8946ed16111a256ef4d8b240a31ad1c22f774c9f51a43da3d2d17e4aadbf89338a8bcda8e437bad3f53030a36865b240e665141150e7fe8f6f0a19304d46e1de2019951bce5c464659aa0397bf3a0778071ff84c8ac728e74656322b1ca3e20da866ef111942273368c33ceb1c92aadaf94015aa2327f98477721f56fe530b82310afd8c7bdc094d68d25701af7836044b04c5a8a6c7254655f22d49618e72a2be41aac504c428d140388c8a2e826154a37f6154cb7d7b24fba8aaf16f6e6f4cba95eeb75c698d718c1b1f6c68516315b914da11c6b641390b34e27fc977231490e24af7215cf2d03b56376dccdaf7c2392aea580312c614be191d3a17f5a4d7343556cddf55beffc62a857b44e24d200b7013e4be44f18065de9fdffb8bd9382ce1828df3de3d61e5698233ec609ddc272b9dcb00feef0477803aafee591a259e63270e5e14ff9ae963eda062c41271e7328831426925169fea90f4871f19c83bb824f74ac1526fab247cfa7c2668b671a44c3e56e83ac73564467123f146d5685ba4cddef3eb38e6a86e06a2de6a4257c2fd39f847fbbeb2951d95cd3549c1ced93fa855c6c9f5fe432f69069e452bbc7d933adc55cd8d55442cf89b2dac07c0d64c19f9fe1cf692b19702792a735be2eea171c38ce6034769d6c52d4e94567a8ae49abb41a7b26a15fd8bd79b797671dd0b12933003a020fb80b5cb5cf4f2606814210dc89e2c1d2d55f3e7e463ee85cdd45bc10b1fef1f4bd8c59c7e88094c7f0d11c3268b7f4d877c3af996117c20c00e2ccd989b42eb7922499d67bf075e6258ee4e9f0b6d05178ce8e5f2d6135599b691ea79af69b01f03ae5941e9559d1f5cb518f44655a3746626c8157596db9a03705b05e79c774756c39467ca8434a6e1866ae77aa630c5ea2cad11cfb6c3e0b2384c034cbecf24eeb614dafcd902464e37dbf5e55b3c59e23b5058f7453e830528afbe8faadfffb7287b559640b1adbe6ac74fb95640c9ab3b6bc5dc7a5ad96cbd7adc2e63e36effe30a4da0ee8a76abd048fee51542e7ea699dff7df0dabbab6b647325c2bf6f01c9d05cd4e986c9bb3a806da7523ea544afc603da81c75605550977b3142491b777d19a041cbaa4fbb42b4cafa0a417a864ce5c2bf7b39b9b663b73324d0fdc72ef5a73b6e78f8c3d55efc085f80384da27f4ad07b8046353177114073d0e63cfc82c6e1653a6d3ce249c8100dc082ee43ca7dd0ffb3a9b27ca384bbf0aac96940cdf37eb1614cc8d70d50f262e8dd13edbeaaa081b110ea8422281fbfbc9314c4ca0f86334862400bf665c4faf030219efd6f4f4134d7523430bb4bf0604d31fa45555c0cad26f556cd1e55436732743d1c6c62683c631518aac59fea38f4a7a6e0226873606125410bd5dc1afa181a0cd3cb83bf9f0baf72217a2c678610d2fa3ae750a42ca8450e0e8d0ef8dfc8f842c3ec714ce067930304a6a801fff28a93cb9b91c0551c7bb84e18c849c1584041a94f0d67cbe6d07561cf9176305f669bf737a3c86cac4f95b180380019f12e4757de3feaad00703d651c1c913d43b8c629219dd97549634812823b1d075a0cda37e9ca633a7ee975cf76d99b518f60b847a969f09fad86fad5ab1b2d2384f03a50b2b3408f55aa28c18fb36767319c10f2246d41ff725e33fe5dc7831643f6522badd1326fcea5aa936b3d879cb8be616c9a19c7b91f54c3f5ac6cd758803dcaa1630f576d68170c19143c1448fc0d9f5dfabd927ac5a55f8b270508ef4d23fe60faed3ab536b0c27b1825719c757917b3f06f407b5778e533cfcc6a18cbc1d303f2f3afaee04f0d3feff5a7d3dc14039b72a9840699de134ae145d7f5dac14c962a2267ddefa3c76729d7a780367ff8a61382aafa6900db4c8bec8790148d7c2950a85833839751a06090ff5f5b4baebdd2bedc0693a1f49da53aa783eed53227501acda02da14c666594018d6a603f9f907d92f328fa8060906bb540dd6024189a4bd68d312f598fc4971431084e95fdc0dd2c5baddd9716cf1e16ed87efc6c936da49bbc93b4990f86989f312933c7d677051ec3150e3d42ba91dd6d4bb9654a29a5f80576066606b2d38890a29728a713e9887652dd0dd51391214a820309229a69937f9344346d72d1ccccf4ede5aa29dbebd5a84d797e3f36f46b9cc84512bddae49f55919817d2b51d2ef987213b8db533fd3556a35aea03bebfc685fa78efafb9ba3596cce991a6b365244d615cb8d407ebdfe0616445ea10b9d8e4df6dfc1b0ea3a0ab4dfe719bddf6d241f21c216fa86ec468afac46699cc8e589b139a92297c8258ac227287251416d2fd194e99f91b657c329d3df2195e9db2bc744431271222e7231740dd989edac3a91ab5b20b595f2f06f16dc99ce6a937f0b50909dc8c59afe0630fda100a63f669afed0d5a818a584aeeead95c84e2235e55b2391ef357dbaec20f89ad25435c68d4b4e03f9dde8e68b4e44c6f417b9f804a7e8355de49addf69afe2d84541976c289714bb22f290fe7462317456919297a71221796856bfaeb9069218a9e699aae699b5eb9e24be68c74ba14d3aa9952cebf462ed98a2cd566f9a03929b68c6b6ed703ba30a6e99a97e3fbf2b57933bdd3718b53be39a96bd54c2d29839aeafdcf12b46b442eede05277a539a17f0b84d8f718038bd9ddab1e638a9e1d330694f9a1591d618ad9e994d97242cc5ffaf463f6abab96f83917262d89ff8d8a9cec8f8e199a7827a1694a5d3aede54455b777b561216f587cd239bd46093ef5db4c9ea2f395d240765e03c5b9509413a1ee84c2c98fc46427028c1e41b0623a0fa636bb38a328a9cdce896821e4b2d7b07234c0604e3ec27ead46092e31122025b2f31ab7b1719b9ad9794db39487bed7b80d9f7493324718b27907d9794d7c7e57c29f60351113b52bab0565720e3b81ec771e65f20b67f2763e65233911e7b8a8bda294dd5ddee56d57f56e18bdcbce91c9eb6e5f8c1f37bf8739167d83dcdddddddddddcccccccdcdddddddddddccc3136333333337777777777373773c6ccccccddddddddddcdcdda13b27f6b96dcdd1f12854622296bd4d06cf0e366e68e68aacbef3133ac42323f6666666666e67f1b8b22867514921fa6df7b7ecb1f80adc99c0ed8b258610bed611f1282fde350d062c3a6de6fea71aa2d85bdca533cbc5f414cad1ac05f3f423c85712b504128f59e5330ec1de471aa06f05f2168ad3eb0f75879601a46f20731cebb5f372f21bbbb5bb9a5293377b3a63233338e963191fbcefa7c861c3336813fea4a71666ee64643533df9c3f79eaf73ca0c452fabe6983bf654f5d33e4ca13d2d794682c9bf5af2df134cfee5134ba1a9fad0424ce2a9c3dbd581b635d8a94e8ea099a3213eb505e5c12db9f43b64af889634521efc39a48ed45510a0cc6e6b417d8cd48718fa6a6c5cf239e25296d2362923d1dd4758f2dedded43fc13ab2635ae6ef8dd115e01c39efdf945d805b3189e96ab5bf1bdaa6bb2e62ec8ca2a0fc71e07555f485df7b4380a4d5535b3e235c75573668e6f93b90de8779ab33ee8746d94484a2ead8cd44fd23a530bf5ef6bdb3a93c8ceae777e2673ada33cf6b32aa4fec3570d148a832397bd0ad9de7175fc8f4423918e76afc2bdbd5d4aa5d7f19b84dcfab9fb133526a343850e95d939dd0d5b2c5a68aed1b7d13277bb7491ffc067e4e8999030acdae9c14e2f29fa406ee74ce7266427672f84a0e6f4617a266ec1667019cc4f289b51064be124f8097e829960261887a5300e13d00e14a208baaaebfb63ad9d7bbbf7f32079eeaeeddeeefd4422966ef7c69e2708b9ecaafe465a63b9ce415490ebeee2392257dddd6396dd2c736c2ab1879895e1d9f6879581412060d47f1eecc1d8221c44a250163d980f71e39d3c1ff4783e40e0863dd8ed1cfc300023f5e4a9d5f8bc32e47eb3ba8356793c9ddcbfdb6e0fd9d684e5acddb387310c0c97aa606f6abc41924fadb7e7a41f3d7a60da0641aa3ce2c77e3003028cbe021475836a7143c80c19338f0f4ff63f64badd1e4fa68d74bc47848328c608a3a6651e37c9a3cf12d926d5b67d8800e97f2ea517edd5a3ddb09c42524f9e5ac3056c66c8fdf0aa3b6862d9c6251e62967d70700516fd1d465ae5f14ed3a688cada67daa4df69c87d87bbc1a81d845c2cbe62f3737df8ab09496f3bc1ced44ec35540f4bb55790cd9aa2fdb9de5313c0229c1ba6fa662aa23f71dc35abb1546d0123e5968da2b48bbdaa40fc39103af18579bf817fe2ec79bf2905cd53b6de2ee1c170f7cc226f66dc56376b11cfe37d96374a49c824fc6becb38a60aea4309d30a9f1a874b53d0189a0c2d404f9e829e564b184f8ec9d9511f3b59c77b4721d6aeae5f8c614e430be13235d0d4a513c06ac6d794c824525b4927694d5b7fbbfbb2ddd7d803a9d92f0987def1108d0baba93d8da4b395484f12e999fa1ae6e1ece16af765ef492263e601bd3c4924a6350e6467639533854b5524b7f3428c12a9e588b2cb442a0eb095c3c5a598e3e549227d6a120995bc80e405159fe0772fd88c7230a311337635706ca12817e217120973e3709831e37b8620b7dfbec3c17a418583d5a81caee5643652dccf128d9fc395230a6bacb938588b83b535e63e84a2a7f7fbd0a5f00573f8c48b430b4571395c8e1166fced0364b5d57c338d82100a74c1d7cef76a6315a2991a46da146725cb98c8f7309d65ff48dc0e97e20b315c8aa336c5efcf129984ecb89d199fdbe1d3fbf89c95f89aef596c586e70e8a88fcf7c8f830a8e1d1662f8c4f30d1132623e381595c3a5a6f8ef614b7d78e6fb108dfa6099efe160413114f5822a871266fc8886ecb89c195f736135fb06b2b3b1822bce110697038aa0d78c3972b86cac6674c126c7177d03d9e1907de7c20b02ef6d6407d299f141397cda8fd9c707e1f0c9d3ea3499c913c7132e451c2c2ec5d770b0c07841153ffa74b89af139870b2f2cbaf06a53fced5c78cd98c335e3376afbc89a71e370b0da14ff0cd9e160cdf8826ac65797c87540002b16a2782945231d54c81a335448500eba909a1456a4a7c915f979a211417ec0d8ac90a032361df9a6aeb6a062842da6c085b43175d542d284d6115a1649386945e1ba118d7448d11755cc4e7e1730f8a2660b420260eaea8b1fb8907fc6b644baa0c52603d9c2139f17c81a4684e1450cb62978a1828f0a6468eaaa0b2a4c903a5de47431031bd3a7aeba80c14a53170d087bf38e6cdfff547cf2ef9db98d9af411eb46c866d33281c118a51c8d605a54f8a493445c19c10a9ffa77f8e49e3d59000c0c15b25b958e87e46cdad7f4c94827dadddddddddddd0d499a4ab1b04d4b2bd5b4ffa317352d8c9af6bb1e515d4bbb9a1d0826fb746e48115e02a14e4873549bc60b92a0d9802e0e9776557c6ae9d7c9392f20c86e551b88915757a51be8bd913a559bc29e871524e0e16b4ab5a916e55a6c083d61052585bd0def2167640921d87b4dd9808120882a9248615c8b7241e0632f751723ad4c9bb6692408b026323486ec5635f7bb179502858b092732e0628c566a5f3627a5ce6b82648f38a334c53ab82485fc4d04c4c6a0f3fd3b329de42ad90f03c9ff48b6551571695b63965cea9d1e1ac87e4814e544d0cceeef1e0c66bfa7a12887ddfb61f6dba1f3294c39b5675495d81c1bafe1d23683966be1d7b9df5b10d26ddc89ec3cc73bca114ca332eedbd41f63841cc6b5fb5299bdbbbe33dba76048a4ae68a0e13b1a60487c6a1142fabf1619b9047bd9288c8361981c4fc81ccf6994f49c19de8ccac373667bb3644443f23bb7d13487b450d78e5790fd9d336fcb22b46e926a01186bc1b0c7ccccccccccfc981db0bc04fe370a72b28b407ea38156802f9ac4f0c6a58d5c92c15b31c40e66a9b4e38995b94f810c30eac1f0244ac4e28526c9b68680c4ec34cadce7edd20560eeef076063d0b9bfb9887494b6b453e78ad6af2ebbcc8d44f26bbccca0212d0217660e2e4cd767f302d9af7ee9d4ba6743265c6278c3419b2ce4c6b415b4aec26a65630304a3a1097515aa9093b3b3d3559061ea47066c089aa648e826ba8956d24ec4cc55d036b21375139e8256e229f0143411fd5acbb44cabaa2abbd8b5bbbb4cc334cdccfde97e1ffff8cefb841c08d933706f075a2b91fb5aa8934816ed676391cfb0f3eda0a94b07d299bd1a268361d9bb0c9f5ae02b3e3df1225c099f711bbf712cb25622fd35f68f21fb8e314c6b9b66629365d8679a125c6272339bc96ced91544bfeaef2388a51ab6994473972ad46869e2ec302d9b94a89dc64dc8f78f65e86412049a46b4e2487385979c4f768c449ab3c625c5671a921d77e844bfdee3ea3bdc540569cc4ca83bf3b2373bf359bd9dfc19cd90f3d9c56d3a6eeb49a5506adf2e0e7fde6d576ce9778bedf8ff06939170f480732c8082d7b75e974c84c7fad1bad5695f311e1f0f36f2f3e612217897fc01b03eff0820fc32fd8d969933fdcd9e9b129911d8cc2257f4dff5845765a94a9b9b8f401f28210673a8cc225872e2e895c992823b504790d6b1704ad1cd5512b2cc73ab9009f58cf07b0a969d87ac41ea432730f9e3ff8d4a1c035e7d576508f1f3d7ef069b91d5c6a54e446ee2245324528c29a5d69c624398c1a8a0af40e2932977361297feb2ad817dbee7458df2531f6dcda89079c79f62a334839551e2eab3a98a801466c318c315e187f17c320a03873b908a7dc7deff9ee33917dcff73ddf5d666e48bff7b825d1238644032c102be024c6e54ba51d14c8000c3b58bcb05a51b0e725e053915297bad4a52e75e9a54b6d6a154810e4e055c4f7606066ee3161404e90104687c2218450a76e0b1affa57cf5b115419bc011d49f3be6d84b800f6816a02e0a6040d5820cb4a8bc7427e648102171249545c3723fb8d40fb91e30bc0b0d9f0181f7bac7ece12e90dc92c8518b18637cf16ddae4cfb61c60e61901cc3e218031c68c04733d96c0b32c6248b020682e8004c71cc32006ddff87d7207de1e47f5a80d8fefcf6fb1de0dccb48d0df23e0666d107cc80de97902f62273f763747f6568ea12b3d8dddddddddddd5924c9ada99821889318172e3df8fedc1d7b6f3f108039f3079b3a25dff780405fb9b25ae22fed8b892192839c937fb500be0ce8217dc5ca7c3173485fb9321f47e47d0e71f28f80316e48cfc769c9b9d20e1d5c14f91b435397e56167b688652d9445626596c9deec6a9f60cf655aa06d7123451d4959fa8cd4e3e585069836f59328d04b82787c90ddaa8a70a95190db404e0e3764e0e5fc90a0b2dd985f660fc3f1798688f270cea6f7fb51326a5319a76c8290d4ff487195412cda6db20cfecc3543f164582a501096b3e0b681a7dd0a56f762a673695f11ac27d3c8e20a2bb385a9595cf19aa49d9e18ec0be9237985746e09f6241b4257ae5cb942ea714652f01e7e91f8906bb1017ef619672472dc122d298c14ba72e5ca95547f6ad0d4e3629bb6f9a599cfd0d4a5d368a6bfa692be5a6ec54d6407573ce10ab21ad57268039938f618f62f8dea87e11642ee63015970c525e7d9c1d5a4d942a55aa2bea9e50c8c228c2a88610855c8e006082874a0808026555c901b7169a368a46333d3d455142e2668ea4a0c5653f1027db87145ab0657e8200d39922229fb07ed8a2c76684225e7b968a4439362467663f697a4e8ccfe1d7c822fa4a9ab2836f3337525250c2631835867113acbc55e4942deed4c40fd89dede5be6518ddffdba390fa9ebe1d2fdcfbbdd03b3e62166aad0f33685dd28bebfb7f57bcc3f1b2686dcc75e738f6d6a8dd4ae36b5386a12f220f73de424af99af5e2c7322f75b555bd6e0d0d8cc13c4fa8ebcbb3b32f476ef4e81dcf76eedd6e71ce69cb7773b166184118886dcee1d1b4322f7b77dd80f723f2691dbeade2096e6792c8e4655b68fbf4cc3a800218771ce258cd32aa0509590ac226bbcb75af21328ac6163ddd76d5cc16db0b8bb3b8bba0f7cea90b481a3abd860b9c182bff738dee12ada0d1656e507886f0f0e88ce556aacfa0a6d0526ecd245c660cc3c9e7f70346aad9f63517e1352f3488053918b3bc82d6118863dff802268db1036594bef4d30fb771d6e359e17f166a98fa7d5d85a733fdd9a31725ea33c5e3b21bb1d93df86bf67636b955c50a8c68daeb1b58dd47ece359c86dc7fe1d37b9aa85fb69b90dd0edd99fbd9de9954bc861fe735d80ae4fe0ea622334fa4914068ead2754b3525678ccaa96ef1cd4b291ae99011c3074d10c3063f104308ed8964410a9f18c81b49f840919f2ec808831585309c20220c239e8431c40ac0b072058c299f27c0c05181f1c50cc070f2b142fad41518562001c60d1836aed58481b62124b28333fa70a667e6f2421b3ebdb90f991c99fbf005a7306a7d805340b13217ce3c990b6f5ad00571e67e07577319cef0a983357369f8d4412594e0530d9fba66c122f814c301660791f02d660775f8207180ad50937628c5dc6e81d41517349c16b3a48516eff2eef6b6bbabbbabbbda6e0f7497b7b82991da77bbbbabbbabab6dace15274b50bd62cd74125668cedd238100ee8057ab50b870a87cac64dbb40afb57163e34693b171a3c9f0e7e32b7e3850bb40af76b5d0d28e68eaa2d1d0f0695ba3691c251a125a8d46c325ff4ea3594ea3d996b9db42c84eae629b7825598662f8c92b49531d63848d034d5d3a1b2f25fbad44f67e2791ad925d48a309c5f0c9ff71447cb6a03ec685ec4231631009c56c0c3bf93b0707937fb1500c29a40a21919d2623c3a716e498beada9d184681ad522645318d7f27448d5c89f5d2866882b642687785071a1982864d7b30be58c46365e2f9a6fcaa7ceb5b9fb7577ab2a8c43d4d043066316a13b7cfbfef53e182304c2a9803dc7489b7a5e25f51c8875027333a1c12d915c1405b3638e40ea5879961b3eec6ff886fe2408a4bf5882f856bd514f216c3d29f49753ea6a146c14f6af055dac3631466a9d0859322c8732c0d93aca83bfa180bd1f7c755a070d095fcdbd03ada320f79fbbba2b1277d57f8ebdd7efbdf7de6b774223cda0b35fca435fd3c7be7beff779c387bd32f0763b6fd476ef2935f480350b0bf77682f3697797480fde03dc66356b04cd8a8f6b1694592f64785f507a36119fafad735e5ce27f0bfb060db9cfd3997b8b8dc32838059b18de28808765d664bc084d5da4100329d126a7b5046dfbd575e6a220cdaa8c9cb9f1bd62b0183398981d0c733b1d735b25c0ef0cd9849f59dcf57dd87befbdc73d00dce316dea9aafa7bef45e5d363cca7bbfbc33e401ed7dda0aa9ec39bfacfdbbddf1534dfb6b820985357f775a7bed1640d487f6c0526088107123485154ad040ca4c1a52547214775063c61b9f20ae68544c1240094fb494c0c3e47fa31a3f14e12c971c21093f302667ce24cd1494237e60032abc6085032b3c4794f0a000937ff50c293df87084131c22a4baf809a2069b22c305f385c959132fff2ea51d52904045896401880f1192c5881ea488893685dc585f4809e508e9c14122e1d4d5ab09b3fb23bcaa7c9420a30797d28e776922372fb61f88918424c490c21812c7d455941f9210a50673f4bc45231d2f6de27f7963c8229af3033176522850d6922352482dd101186401ea8379bfcbe1cd1ea41011647ff6dd0b1c92805fd292ed9db444fbf87918eea191549fda5ef3bce04099ba3a634a6bea0a27059386466dcf1fe471a4eee70da1078540da923cff0283277bfecc90fd90045cb9726566ef1f20d98783814d1f92a6626c2fe4cf206a302300cf9890eb417ac1919db228d05ae3f032318d6bd9e65af6e3dc07a9263f4c644918d8c4bfa4172a5e94cc9eb283b9fb3a012b24e0bcb84c149b2836a4d969ab7b2b224cd97fde3b7ab43c0c0998dd8fb95ca72e979fbc834ffb1e18bc2687b4a86151824f51d38ad0f40788fbbfe7f1bc973d43ae03ef756a35482a85184889f9cc906386584ba4b63cdf69cbf31d4b0dcbc3b087f3cf70e85707fc77c225a0af416216481049089bf86390d61032b337880ca41046f92a8846795cc8b5e2108e9342a450cb27ff67c8eefc0103c3a5dd7a6f68da7683249fa549dbec1dcd0a7f8078b4b87984ac4ca32412260c452592a5fd6301c94de40c4b0d8b0dcb0dcb147cca9e7fb59d36f18758da4e88e599425f5e763013e9d1f9e9e0ec422c162726933a16b4b7667132e40f2e75a11b246981d0b3702d428a6c0cac44b14ab1bc0e2918f6d0800555ce0e0b8b8dfaf03c3f0b133e31093473a86488e5f170120bd9c91bef216d7366f25f21478d123dffaf422c298a339e8f9e7f69940888a7156782b489bfc5f3f27548bd2784e5e56bad4476219647aba2b34ab1bcb69f19d8c3d590a5422cef817cef3bfe39a290efdd5d44721bbfe152c3300b49beb3d4742c371d0b322c2419045e91ddcb0f9846d9787eed07979889e4d9bd686a3fd86bef2d90d6e467855a8dd2147f28146572177a916218c2132bf87800b3902c2c241662dae4386e8870dc10f1e049e3f895e3b821da27bcc2824b2c010b845e722d42e4b33c0b572486213cb1d21808d2bfd35688c56a93139267a72d96b65888e1126b8a3f423ca91a2c356d8a3bc8ce59568dbaf1dc45e9abdf69d40d8e4514a3b6c3c2693b939fa5903a3b969ab8da207f1692a624a90649dbf4586a623c29961b1ca9a91049532092a69aa5596a586a72bc36def102229ef95cb1dfb347c852a38c64dfa3519b32b28490ecfb8dc08fdfbd4cae453d2dcab5d4807d7c1bde93ea7704d9c5d91f096c0a7ef336a8453f879d2ddb0b819ffde77746528bbe9125b437923d7c234b7c3821fef18dc0cfbe492dcab56c9c90ec21d7a252e384c4f737e25c8b72cf25cf7b560ad9a2b5685c4b0dd9c3f846fcb3b7211a69fdeea7c7f39ed746b9783a0952840b21435e21124208211108218431c2ccb32a1eb123b2a3f6fac6ccecb35720fbb12451677b11b7a83db8d469942ab71f5cc32772f42e2580bf47489d0e531fa687401d747049477cd2f7efd7c1a7f7df580c641747ca386cf37153b4c71362cfb108238c1ea1c32c83915b2d3d0cc31cc3308e08c61806318f8761191b6f1be1bb4faac9512335b996fc3b97f91869d392ff23452d69c93b1ce6ee2e37a4c8648edb1219185e1462f00125e041c80a279bd9a8a48d973535756a4600008080024315000020140e088562b14016c7c2bc0714800d729a427c5a9989635990a33888a29031c410020801061802c4989a99b941000a3ce0ca3d44e60a2ff3247324dc8aa53a2b07047a7195f73b599fa5a2f8405028674a039db61451bccf3ce6f61f81178148c012aaaa35e5779ecc4d9a72fce138f0422cd8157dd1b596f59779d894cb873b97126e0b8bb94133129df468f500c2b05514a826f69463a0f1ac577750a51869caec928b239569a3880d491a21a9d82e3322ee9ebe86894ea7357d0d5a5aa5e9335c235242126e6f0378e9a55f2bcda2cabb88a1cccbb5523666793ab6843ddfbb3dfc6b1c4b3a82d708d32160833cead2e120271f9d52ace0f01fdc7dd1138fc76cdd4aa0a63a1dce49bd8d69fa37da231c705eeff1d3f7233510988168d4433ac2b9c8127410a5fea6f15ad33d5e87338d1a0d2310c3305aa8ee1a05dc78fced106d937cbcd16cdaf4836fce552b6f0b834c4474e96584d81ab500f7ea5d1794fff02f715a8587922bf9b9925d3d28e05c248ae347766e214b1193365b9d9ae3880f87e6498bab61d101c6dfdafdb121cf2a282f133b775ab9a49b476fc83664fda6ae19c5a6d11082a2c30c8745c5ec85f1a30c0059a9d803b81d2e7ab070418978037b761215a40c338688b1db267324e08ea8d3a66210a64308d0e1124f0359cb4a7e14f6d43612090c027ff87d6599030e7d8c5f6d7f749308b772a99470946a253e5e19d21c13a6f5deba874267405d22a4b58a9298b9e848f643fe1b29b473529c9f5ab3fa4130e4e9d97b999641235a71f014edfd5edbc9797ba69b41d1b6a6ceae72dc254d1b39e3034745621670d4d9a49620e2fd5ba67482228a194be26f4b12930dca56bb5b5bcc5b75a87699b97074f13d1542485d775f73939086430c6f71d14013e7fe549ec814ef86435c9b38845f827066bfc7ade6bb4fe2fc10a8df12b95ab90b0bed4c50c2c78f98f41cd159878cd5033868b9e45b647483fd994e0b368a8c20f9f6cde729a8c5c9e3c79651569f91b653d2f43c13dab8ed84936c004ac62f0ada007a1705dceefb5c7e5d4a98337299f8b7b047ab72ff61e78cdfa4aa612cebbc49ded70996b99d00d5eb9a13727d1d2f3d8b36fc2d9f7087905843eccdd02e183c616bb3204d8dff41e8115b60752a84af9c5bd262b729755365d4d9d774e285c8c6f9949a17dbf696ac139710ebdebdf050c78cdd48894bc3e085bc4958e2e81057cafbbf602b5900bfd61bb3663bbc34e8f3b5f42721c8a06225440f43ac439eb5326135c7c19fc18a18361e90dfcbdd189cbe9b907faf9b5a3738027bd58d53688886ad963a456dc943e183995eff65b93ccd6643d722d4cb6862c3242912dcdd973dec10329a5ff352844acf1b4cd4a46fd65388b429d00293484db6f190163d61584178a1acdf21492b36ed1b11f03686b530d3b4936d53474a929f914c47ad7e3dbbad07bbd443718c30ac9c46eaef8b5ae987c277c0951e535ad78914149da7a66e6286d89eac9962ff9d04d6578c92f5658458f2f2e3f4a30ae08161a87b08fce4cc8a3a119c99026da6e0c2c7265075f79e3c40b2412c1989547eba4c997b84643748ab633864a54c8170b642aba3e844cb0324d1bd0e96075b49697d463bced406e74e9b6c9c69381bf3f019858aa542c0128039e4c3eab90065b6c3c82f1a68622109669fb04e63fb2695e7e18137e718eac61ed93a1c2ca68b4361fb824fe34b46bd894024943f2940130270ee282e391c080417e4ceb072cc3e0d10b45e2eff4cf55eeb7f935efec1409b119f60e3a5870cc71f9fd6a2385c853d9c1b59e95bd241a59b033cb6e9b08a0d7ed34e18e46071b715ccf076aa497fc14e22e9edb367821a39c37adf9584a28d8514b03e255c0f1bfab3d3b74b3da9e83ad8daacf090378e77bff1cdcfe7f472047f954c88d4d43b4b09e40dd3ccfd3387bcaff13637ca2fc9c7a761c0179f7d12982dd3aa34102d552e00c4c0a4f826cc7a766797bd8c4acc150ce8b5916f7f1a9e3e232c3eeaaa678b6a45d60a4844c36d148c443cbaefa44b97f4aaf47b9f5f0622780ebaf81b5531ee5739732dd835ec17c26d92ac3685b060958f0995ef5d61734a2dcde00b675db221ef3fa8221c60e20da417b662c9cffc61d217923c59c588f7a705ee28a24791f0898e32da5d50f97c17931b86673f2a06f2888efc1fcffc473ab8498a2299d99ce04d3196a7039a1be7a2b9cb8763683fc54d073ba28aa4b41542e4de1474a0e7dce4cd1fc05c869dbc708e19846eb509077afe5f70d90399fa2f2e6ec26a358c1b6acffc90839e25ea46b772312b14a91e03b7ef7d5004ee701fa6784cd0ddb511fe6e5c4eb21836ea3d8500f5e7bb3f53e49ef311891b21b6216dad09e84e95e6876de86932ff2d62feec501db2e2dba6b7b3540e7f9629940880e1a3ca3617e3191128b58815e809d77c511c0661f3d3bf26395a347ccfb4533a5a4588dda86f4fd46cf36b09e66960fa99c3a4af3151d3d8d13abc66d5475f42a880512deba4ac9031f3776488650c8c8dfed0108179a9211d6ab388501699d12d4505babd032cdcc36a01c1c42f1540a263a37f19f5d3d0d57cf954159cd7d1f6e11cdf8c6912bbd223f3b3a14ea603a2c19521d81eb8650ba0186fa3da63b23bcc9d96a8bddb05ebf241322f83c73cc952051fcf96ddf09dcf87fdaf56573ee77b0a8d19221195d54e6e0677d01c854814cd77f8a83921e0f13fda2b744c2cd90ae201a581c141be40e519e6c0a3d15671955687750900c8c4ef257f483249240bed162bc09688847bde8201c292d7e749fafa983833e907e2885356cd7eb5ac0dc48fe3c04faf19054295374f745c4c3c686ab89ccaf4ccad3977099e068ef73c611c9d2f413145a3db40cad1210bc00346df271232802c381d0e00dc0bae0c8bb9efd337dec42da95aa8449b34321c32e3244c26746b85c46e5782c0add880823cddd052c888035f5d608d38e0d202d7f535e05406cfa0c27f1a280b8338a89eaa6b028dca0f02992e5a16ba17704212db1bfb650fac8b5db4e5c3e18610cf95f396dcfa84ceb755ac796de6bc363351ac603104d52b5019b26897030687afd2cae21a184915c65ff1e4cd04ed95565a40b26af809c73776390b7addbdc9c4f73bcd769e6f39d98060a652769d09a83e5be11d6d95f475a3e42be8e2e2583584713713239a9f63cc041f34584d4963eb813b5bfdbb9cdef6b031939b27d6aa0d48b10fd4883a7bf03ecec92ac34d0fac2aaaa20cd4254d6113665e91b287148e081306a44143100385fc271f04e82596bb22eae3b1d02c8c9176517e27dff78b410688be283a4d19098d1511649428b2a89274996cb380ae7b4c637b279ca67d22574cc865efedc66b6ae93a188e2552ad545b726b14104ef956eb6b6629a6de22f897eb85406964465bb13d343fff241075a7b556d1e89e151f7378ab7060dab374d5a8250353da8844b4354dcb51f232be6e68f19a2131e0c70ba2d71bd02563bc1b6e11724a1d911dd2726d922121bb023914bd293c6d8f1c84cdec10d212d57104928ab43fa28ae620f740ac884b47adcd63feed0ce76fda6d1dfb83411dabbce30a70113a48462e4efad50305574da86399c5d5576fb2e9e33d6616e324b1bf2c283741bc6347bc27d940a05c989045f1e3ce3ef1cc7037215372e0eac6978c99411db7d4763b1ff741a29e76a1c3e8cc00086a74094837932f4da44f85cce846f21d18e034855fd7361f3b79812b26323f7cfae2389d83b77b4ac6666dac89c7d756cd22d1b0245e82e68c254dcac8b96dbc0b5d9458c59f9c8dacc8be2d81b84a6e33ab38ab05b2069002772169698d436fb196d97ed4d8e85dead59d38a237ec4e4200a27d75749ee83613129a8360df778c0c3e868fbf858ef356e6bd8e09cb83c10eecee8668b0f368c050995028d9bd3c55d167432963ae049488d609ad4f47ecc5301f6e923da8c79f95c931593d11540a873718332614ab40e1aa80b6a2852f8820cda03ceb827d2211cab3c2e97e1da33cebbc1127324ae2cf0fb2c8962ac04c4248eb56dcb7e09dd2d109316f35dd1afd27f48772a5266a89eb9d2899531ceabc2c5caeecb900c59903e7176071d5d5d9a826dbd2e05e2ad521590d08ed9de9539fe8c89c1af145425cfd9dd011bc9e2992485d8bc95cc5cf6fb8c760a87a69a490cd8738699ce84ef4c4f070a6e7e6ab1983d044732dd15a60aa5d8e01984f953f82b8982d9a1fab6065210efceb692e5664eb07be3cefceeb4bea5c21f479c2acb6ad4178f63a6837804d52e5331b5c331f4c53a287cd29c5b2e0b8a554bacea9dcc1fc15d2d5ba597a9021eaae342cd17434b1b88cbc558921de2844c176b89167a43558cc005b0e7cd586cd71549818e739e389bc9b36559cb1524fbf6e0c38f77766abc9378eb28c72ba8efc1be55ad026f0f999a6c4b6869430a5f82ad24642f0ccf01d099ffc474d49b1d7d04625e49943cc2a3b5263a8d6a04630331c392b88fb912ee2142a9293871248548761a7f39d3bef5789ca13983c89031db9ae4d25a97d8ccf093d7d3a3d8aeca7427712b7679a920f76425f2fc61a218c1a8c56730bed31d7a2aa95d3f54e047c1309a0b630b5564444f6df4773c3077f26e41ec2fc4b449b5d0208690b2ea62ed359508a47c139eb50522bc5086b41417e8d92d07ea991f0ccd1157c988437f0cbff262238b9b42302e417457e08b7546eb673e6bb1e05cbea084b064e67234bb47f22d527699865afc8ea5ccc3045ad8619e54d9115f68fd9ef20f47a036f93980cb99843f89382c1e23610d2dd9bfd5d8d961088cc10e6727ed846d0e7473428bb715d943831ea6369e80c3a15607917b4fe8437c12c3603a92ae7bc48f9feb880d893227d82c2c3a2b266705f1ce67207f0441adc8a1ac8bf85e907043f5a2c06bc3c12d7e7bbfd4adc7f676512c50f343a1eb3a4b62d5ff8db2ec66af091bc6fe7be00766b2a65f56629a9721fd221f4e6c1ec228c73a902f0080897d6895b01804590c690ccf839d9c04f8688bf40f95bede821040e29896b33f99851665af23c3cd7f6d6020b23694d0649470b39862270cd95514b70571466fd6c71f500f52dae41d98a9bbc86437d2a50f52e01b1e2c271bbb860ae3854828892ca3630cf4eeb570a8711a7448e7c6cc479c2a9dcaa9b15f77ffef1a7db23a62fb8d495615285e5df91e0a7433ed0097e43f3f52a70e84a14a06da07512272a06ef83690f5c01634a6148f370bcb7f713bec4fb75ebd32d3b383fa8f9e78a5ee6a8c01925d920e8cf4005ab487e4a13ba51c8ad5520bd3009e63807df92468b14ca9f3dcfbdca27970989d37c932254137d6e4de2cf2ec8bf1bbfe5479a294f106f9b519c1ec0879cd113a82ff890b5717c1a73e198a52afdff733a350aa2fe91d297c9a5b292d2039dff8b3e400a65bdd47f309bd38e20c6c133fa3cd983672aa650ea775df9049da1334bc207c96d22c11992b5956f356d68d26336a38146fac4e092e649748ed101b9ffe1711ffedb529d2a257812a24506b9fc0d482086fb38ec58c46d9ce259f043c2c02de2fc9fcc17076471be5d22a80936f45846bdbfac2782fdff9e9b11903e16584ca4b43639d753177d4edc68a7ffbc8108836991b0cc3964926940b1e8e65479723f341adc7a459a68e19581b1b5bbc6c87ed5cce0360d8efe0b08946a6524eefb60e089e8a6dc4f98463add1fce6257d215a0dd390dc5fbb39a3d3bacce155f3c36ac8aca93b74d59bd2a1cd3a1bd41d849bdf8ada49b3c415bb6e55280fc1a9b80009b060f7ebeadab97b265399302781e63216462eb38d7c7c3b2387309576cb9ec04ebbca02439f4f7377c6970727bd8fa6b568827dacc9d42247f9fdaea91ed9cccadc83d89a0b37b3c8cd3ca565e37f58999b0c5687bcdc9df206b37c9790a003ecedf5170a821265133a52a421c6a72730db29dd31823cfd4e1c7a76fbab1a991eb221d0932b141b3283b0cc77a3fddc94b062f5afea0f81b348f9fcc768f0e08df63219f10d56608b37ff0b127b5b281a6669f453b736025d0c02bf27e8a7dbae61f2ece507c864751ecbb41843c84f72c32b337e499b29dcbce61f451da0566aea6ca1e097d766e1e9df9cbe6b5bdd1feba6e07ac6fb4d07c239b60d94eb2b83d2585e3a5d9b23123f5606a64d3eb0a66c09bffdb4fcb3ae75af60122c954327b853e30d6b10964c03cc8b0b718a390d43c0fcefdf66c9eca22f2ee78230e94ff1e666fa54896caba91debd539edc2abc1e386f88b477992391d53977fc1b3bf3c626f55bad045040fff63d6c42cc4fd4fc9eeb07f8cf1bfddc17da6ac94d60dee0d51e072ba7144426f75cc824a9b32f93f53846562f19ae97294ac192f17df9b237da2d8deb7bcbaea01cb370a620db0a9f6f2afc0a445f003a7c35d94c0d700f524e12641662597fb7299c98838e2ec0b102db1c9a2745723ffcc3ffb462a9089741f7de30ec1935ea37eba55e7f4b50a14cdc71a8a5b82b1d56cbc5b369e3a228ed5172e4fd1a42e502c55432c0de8ded718b08d85323866e92027b9e80434bfd6897b6fb815211046ddedc947cb1a2b44ee42a622670b6656b5021fa63e3283e241b021c2da2fc312440770bfd425074eb672244e095c41f2a81291e07e4f71b08af5203821c6c09c76b779c7fcef137dc622fa4d7d65777d3d1161874ed1df01ec402c4c4bc1e8cafc724deaba37f801d665df00750ed4f6874ee958e5d7d8d07b4584ddb6009efeb4f706a84bebc8e9174e6fde770c7cc327ff70ac627ed17ccf8f52cf6ab047462136a83c76c749235f4bf8dec93387164a2ff3460909b907ced33811c10c7452d38569b7361340ec31db62842bb8300316c2367f4b2609324b5b50860ab8c5ea11e193bd1cc672a81c38928e674103a8400987ac049a027f4a16ae2afc653e64953f06afb82af059d6d975d521bcaec39c2c745d24b8cd9f7c28a0b4c2df43ecf6b894b1b50c6c5d1c03f9c29626f102733dd39c307af2193054b695bd34a629b816fdab92e38c41d6edd18703d98c3b8b004a4db31ae458797188dd61e194d2da16147ebfd8f58721f6fe36c30fb4233a7aaa41466210452b8d2e4e474eb9086ac3598d2833d193b8aaf0d51bdeba2bd4d8a3690d71f52c9c1651b9ad51f5116c6fe882e6a94af3708e4ef59c7529d9344152d68d11ba3e4735c5eee60649c545e89535c93909a96935f68251990c8a1b04695371902ff7c8ca4b18c7de9fa114b4b8c92b9368c3b47ee5d24c54614e8d493b3257fe7108d71aa858622990318a041be0aa04ef510fa51632425656b98626d7fe881ad6fa40337c2c611aec740c6f7d6aa2cf7d7db24447914a4902c3e460e2f06d95bdf1a83fe17c2ddfbd3ab3e6e6a65bb790770e6b19a08463f14a4a952a43f482ec4ac532c1ac08c5047906fa3bcda628e3ff30df9fae77017a41a50fabe553d811f1abb58b1fbe8bfc74537239b41373ba08c16842adc2aaf8a2869a2dc1b15da90e12ee13eadc215c53d502b1717934997ff02940609e535d3decfbea9803a848e74094548d516adbf1d582eb8cce5e10892820a14b7e4064d12ef36899df91004f2ef75ba3c99458483e81aaf39d33f5a8194d32ebbc06110b633337d2f61938cb7d81105434a59f0ad07e644585fc28e88d4a0ef1d04079e471e830137c0405f1a6de5e2c26443c410b903650c4cbbc0ff5312b35d2b0959737d25deced6cea56519d7228ff8badbeb30fd953a0a6ddcfc1e6c225c802010683438e907411441108107b7b306b0c4cc835d0d4a81e113dc52483281f9c415057d09b432f86710f339bd011240f2abbc988ab77dfa09f34c7e171f8a8f02992fdacf784d74757eff223fbf8c1068de5101abbdde4c08a2fff45dae86e9e5d94ad6927df45febb9667bfbd00246457900a0f347a2ff44abffb9e829ee868ea48e2bd532f0850c853cf3325d44c669ea51d3d9d45e0dade4d57fd73ed8fc1e11f0e52b392c9beec9ee54fe156af99c8a4158062590401f83e82d5ef849fc26ad4aa5864856aaa194f8494e83caff5075636a99ca33614408f52d26d1077b4efa17fa57776b5811362aa22ca5ace74efd770cab24dfd0ec6a65c5db214237e9c774684afd37c9b028c7d15e4e347e73e5e446e9c1b983a8bdefdedcb023e198d883492740e8d19b95b7c3e2ab731e367a8e509301f81e7c1157d959efe26a28b343ab1058e4f96a69f8cd0e2590eb075970ec514005f1cd9bbe7cce4083ed89d311f6df0628969d02f902679994a0848d356dbee78b8dde70725950f0db0bebe75f2c5bda692607871fb4666a1a24e4341ff03d048b03f082c9557bdd2f8de213b70987055a7b74035b1bd1da00c6d9069a15f509b47b0e96a0b0d14816b332c1d2f269cc5f5dd8cf32c3dda4f3eec5a7f728e8bf85d405aab9b17299520213948b969cc2fd30a9cc1e671bdadfd41b33a18985d707aed44a6a0226fd41aaad8fb671ba3870a746f4b0c26b7f0e9ac5a5a017870d8b4db3391ec404a1b71306209f275935c80c1d19fa11860fd24effbe123b5e11c920df09d6c3c60d5dd9dc4b0d91112cb4accbae8cc97d57740709fad3bcb0c44d42a5df6e3d6bde768b890680cb44f95bc151c5ca7e700a3718f68b95fa36ae7b94a3a42d7afb0d66f2ccc74709ac9319473906984640d1a162a5375e06eb20317009209ca965272e4cefac00564a6a26377e963030f06361c565e7d38b5e4458fc95d466d01148d514c624200bbddb554fad7fb2c375f0268291895069528a5eac6319d3be4fae22a04961f47b17dbcde8b97ccf7afba889bc48672283b1879406635f98a99217c0e3f2cfccdd620d7451d0d73b33f9d6c878829072b5a5bc7c84ca9adcc44a1841984831c2295fbb4a0eaa6421ab9db8ae2604dd8bc54e6044acdbe6bb35e11a1c30ab83994400072b55ef16146fc0bafb789b465fe5c2797cd9547dae24c710e97120fc1e9bbb7f8191ee5edf0c5853a987aa8b0fdd1a504795746057c017807122cbf11bd7a2b6113f81b40efd070ea9ea7a245e768e5568cfc7c6d4cd96cdf1be878028d579b41901dd5243dae9876b4de98711b4b5fde013cdfd69cc8747f4d13a5e360c14f37ad0d772960e6f4c06dcbd20afbba0d63bbc7646499f679e3fba2aa1ac8cc4043af0a9ac0528997025e41fc8178717aeda6e11e6ecd418761202ebcc7260c821eec3130afc68c8d9fe127836b61420a8f99d570d7e7c0b5309a4a5c7526b5d1bdc81c0b6ea9ca869abdfc5783abefc80f38d6fbd6f25d12be39c20ec208d37feed33cf4995c31f09d62d842c540ae7081081dd311f360506b4d5aacde0ef1f7a2cdf2f9eab03ce57d3f40aa4d62a8d287bab2e3d385ce346a21533063a250c47d9019c89e2078b361c382309b01c48e3c402d9278a2e22cc5c9ce068f73c13b3fa0c7d8f72c57e054dbfb1869dda2fefa978198b3e83b2bab94cfbb46e0b432c49f48be55fc52bbdc71e4fc5f8a557289479581338633e4ffef88f34d9dc4d2691232f6aff1eb1a5234e7a4dfc26b0f98ac6a8c6293504959e8577fc200dc26913ee0146b1c8780baeb5edec002248d7442eac3eb8ac0887b0c04e32935a56ae58be811da3618b6e422268a108dc3da1196a04ef341a1de3224226979eb8cb1285ab52ebeddf9e6fac7311a881674588e39c47425c1c03649a95b2824de38f0c14bc739c3d0871efc38a592cf642632835948f657804a540bdaad9de06b7eb30c7f6964cddc9667be5ab2580fbc1d6880e6b4c8f2239c5273e3981d8a626b34f8b3db63549d035d32801bdb2e442d3adc9a39a67994b5a8b3e65aac38f6828a7859fb0a814e34a039b7b8f405c14639e992ec667260ef88945b711ba9f701d1f21d53b60bc6b8efb66bdf7cfe89116ce80329c4b8694f357cfd85c95a4fc0a51bbdb18fbdc78f0d2ea9bb34b1d4943b61385957ce432fb98b35c91159fc62a3f62f71882f07fc0a3a1b3aea2a9ed4c654ccdece19e3f1e9df93300e4440e6c35da846739b81c7a9860da02b8a4f0044300d95e2fac6ec2aba5051572cc0ccc242f738a149f4a3b58173720212db6795887bd13c0f71eef91b789ccd2134e43f31904693cf054fe66f0ba3ba582607af0c8f41d9726bc384a4038e8a8e3e62e6c12895350f85344c86ee8c43cdff4d286a892d157546a3babea770a1450dc6a9721aab263412f1c5a4c3643b7124305d7ee4c070f9efcc35ab3260fea97683bc0774e04f27a5101d2de8031a9646b0ca8f5f0a02af2af3e3e60c1e321795f9f69c92d6684e87205c5f27884c18ab4202706a774b8977d190e3678abaad7a1b5f9bb3cd8f811b680b301166119696d2ac5b652b16d617c9d7c1a81d6274ef078be5af5e64ffa807f918e643be17ae03718073c799560a179da3aee44374fd7cd80fd1a282433071038d276efc30a73bf0eb5fb2174714c0cdd721a62b1806dd70346b0a9f78633da7786daacfb9127ab2e83081a53d70cf5209a6677261d2aba4a9e0c169a286e24b54579fc3d962fa164458f9a8d20e1b411b9cf433607d2eec3d7de934cd39497cad2bf9f5f6987f28161c919a0b1f734596993463327bf809797dcf328e713a5f6ae7634166b331a598bacbff64d99d88603507838464e1f94e6fa2dae44d2b5278b29a4a273f899ea8e374c59a85a9a657ea84ffb0ade66ad809f5db5182643b6e6fb630744074baea19b9a525d6044ae9d09620fa2d3598a70671bf2b6b38da57fecab21356e9dc08518fbc1ae2e826f4d009b8e6bb19b22861c741e532656721af2a95c6e4fd86991d390122ca8193e0a56a1ff2b3805203550b5081d51b37760d546d6de4e71bffabaeb6838126f5b1b1c6ad49f61819555640cc3f1616be019a3d273f0f4b07973ca355c32b398e046a6b2084777e2d0cf26ac8fe6e166d726bd07a37259345408daf05e644f882f3069be69789fa8d7b34f13b80a78f7357f08ce779fa583821d899f2496c2777a9ae82cecf48632b004955c59b73e2a2b6132c2b31cea8d97b5a804b7405f1a05501f548c621067af8f0381586e4ee971b458aecb6d9b259229edb1d25cf3eb63721c761b5cb257b7b41fb1f4def9f8e57c9181701ae16c6260e3f4d6b794ded0357c1da05147c76e3e6a4ce7903999a34073dcda1894f2465534fbee90c0aa076cf608f6ced0919ed3b94867dd5a0140e51b407fb8be71427ba1c37b8427c2e4d95d54a76dd91d667bf6e51efcd252003a0491f220bc81f060a5df559ad193cc0889714423da7efe075703be2dceda8245ada0edaee9c3e0af7d1bfa62d121fc4db3e442f5155598976702104ed0e0ffa7a8c6e7d8e5a7bc807052e79adde4aa210320fb0af51977a9a2d620dc3a58c4f4f1e7f37f27fa3885482367f6f896aac9866730bbfcb8922743257309a15998228da7acfe2d12f9498119e25cf8f7935ed82dee0e2477e318d2477e82ea28c80544a1861355582c008e9f2eca2188e00b9c2be71efc3fe0d7230c752f57dc5fc65f0ef8c9c6d899282ba78c80a0b2c6f264a6063a3827c83ef2d9d3d0ef23c2109176cc8f50ad7e3c67bfc11976d10ae869f1a5bc80a665538b4b777cb8de4ab2d609168efb963a0ca52fd0500028f80dc10bf6503311a65de717ccc1db5fc7db1196c0c92ac8e708b5482302290ff18060aa08b44e9d43f4228265ad77f957bbc2ce4102a997318d29bd000be292cb504d33d086d4f3d65ace143f55572f685b7d6cf8806b8cde0f53b982a6a1167918846fc9205b16395b7a1cf1f237050d3cc9f904a08796b17f06619c8cee714bfb26fa1e57186c62a7dd70b3b52c65147a0130aebe23e3654ea963f5fb6a6472566ae7bed7b0648c27fb756d9f8a0006e9726bd247a53818d4f12d67dba11686571269533646e55db83e2884e570b9a747dc32b0e075a4816d21456b7f6ac97903db4786f7d2201d4a9b2c82627b22914513a57cf009932d8cf20c75b14cf046979a9f9ee60b14595b99fa181f5a3245b814ead59b211c476e3aacadef820203e15600c2654b511b9dd9340220835a778a6151a3ab3ceb013756d9a768725d29370b9dfda03788e86dcd39754bd6f4f1b34a80dd0f821cd89566d379df012d377a568a3bac7142ea2fb05db11e11f70d6d998759443e10ef23533d217fe46c75237b761e83c10996821816b8134ad20e1d02266fe97b16f8f0422228cff8cdeec75560aad5ed56683f4f37023b4d310d099d2a296f6f6efc0d27ef1d81b991f3a293644f3597c7147db5f7717f816e8ab7f4e81aaeb3bb83a1b9cc21665cd099a0d4d2ac626196b7838eb03adcf5bbbabd5ebbd736012cc2ad1419fd14f0b8d0b6bab14fb80f2fba1e0010656178237254fb3fc4f5fd673a58266b2eff8ac8bae860b0bd19574075d3a5087c287ca83dc1869e7cda0db613bca7994c2268aa036b9de2ba820371c697bbdcaf62b4baf1d86437db2d85915cd339b376a5a41299775295c142303b2c37a843b3bae9d9c461ae45721f00a76c09375a87505941c37aa3050a95bfe96d2285292a14c120268dfde908c67a74c254d3ce70b271dc0becea42c740cdc58fe5100b3df56ea3f69add7b53cb7776c84ea9b9150ad4f7a8ace7a866d6a475adad40c58eed42f5feaa60f41d7e8646c2680083b97b41282985f51556c6315ffca9123f1c203f6ee110a89fa85f1ace7c47e8e9427b3114a840a7da14d4100a620498288636df5760d92fd9a219c0abd4585e6d9f983f24eda4b57988eedfc32052a1c26205079940f7f668257cfdc9bf3a93a37c6bf6336e646d47e975069f86d51a6e8651e4e7452aaf04582f4b3d1fbfdf06eaa7d5c26da6f4700c554e7d54ef7c72795b1bc698e51533ff6e51a19dcb7d60bc348cbf85466cf79989de129b5e1a49140fbaabede48b8968ee13fec5f61d885bc6d5e76cf42b193ce446ee8fbe8749a0e1d03cec2fd70492b9ba6c90d819873b76f2d6092425359c0ed4c49252856016daf04eb93abdf391c9426c5916838cbeb24be12a8b5bed1884e6ab542faa3cc4262b3fd5aee9b446edc08b1cdb3b3c73589f583b787049982e7e4b8b4d7d605a5fd15fe728096265466cfb370a8f93cea8ff01d9e94ac7bf258211a2a0efb6dd8e57153ef6e2d1b2429b50dea76097a0097294149b792938413c987c8a6546ef3ead4e84bee870618b699b861631e682ab29c175085b73516b933c4bf7ed39a8bb7a1e6e81d8d7e268af4ce2b997de8188ff9085f8b4f09ca74754e525aa06dc5ae319ee548eb77fa244d53f1b2e288c0c7f3e7040841f3f90780d91be7525c59dc00e02a9b0a05b59385f9c2b8bd222f29794ef1b34d5a54453cc0ea2d7abdef129923878a8f5beb458b01c6043ad87fb517c01cb3710c8cb7bd51dafb24d0720982f18d093102a93483b86f8b2db33c632e779b46a5ce0d48e647fa7c0d096211009592761c31287b791787d830374453703943e14ff45036c83cc4c471661245675488a1920c4d217bf6efd3f0a4fca3a6ba8b117182fc70ab2498ed91f4baada18a0a38c887f8515ab9d0bd005636bf24c50a7f979124e699498995684d1b9144cccd1099184c4f89c07a89e427dd6b1d299c3d3df32035fe3b90f2156e322570c8601218a3b14c361673b454136b281f0c3b5e4861638a00d525986000c32be94d856d13df7dbb1e0feccc5ae0cea45affc1028c4a02daecedc0da1d5cc3f70ca7b340787bd7724436f235d689166c139bccd25a9c8836db229c6b5a710ce2f9584c60d97306541a873a0a90bf29ceae496f7f30373fb80784f7b5ef34edd76f34e5874de3f82e2af3c66ede8c916a868dfc49b8e9588ca7cee8f74a8571a2527ab74c722bef40c282f16e5bff309e49fefb97c300439854f7e73831bf860053be47dfc15ff3fa04cc816e50d06b928cdd1f6e6c8e33b6981a255ebde6b8d9fb5908c7b2071e7c43ad5dd0c01bf7482d9eb72f26fba752172f29a1a1143fc0bb249a0ab4578a6c3e9aeb5d15813663383eb94fa933a1e0369424e5a7cd4b44474d5be44fdb633781c881bf2420b26ebdc37834ccd12eb75f21d07eecd1deace6d301d9ac22b83325e194a1f53097f0186cf6911d709c6d5593acaba12a0bdf9211a7affba64d3b68f96d15e1cb009619cadd9636c8de33780bbba8e7980d2f2918babeb04e0d5d539b16f45f6b0331ce875c37e59113bb3f53ac2e921251697f90ed0859247ed194cbcfad7a6b9270ef6073076a5d663f6ff98d87becef4f02a087128043a8452fc5e74ffbe9e06b3f8822c6f60d8cbf8fe6b28807125122b469d419eac8f67fc2c860f046c991d3b82f5ec1f44c8958798a8bd5cb0304a0675e0940e53a94556cd450f1e016b78f3e16aa5e891afe9689b1d82551466dff8b08cb7c88ed3624a7f792467813d861fea8f18f950099fb4027a9f563229eb1c8c82f1a19fd1d145ffa1ff0b37f97a0be8cd081118a84d8ff2d5a969462dc07711882c8647ca244dc438466679ad47eaaff0fb8a242f176269bc8089bbe93ee8637c1880624b1fc4a9884edbde07cb1e0214e23d5ea799c23bf912a66dea4291624e1e2ac92a8eaab2fc701034e43dfb254c4671df4af55bcd00e8bf47e769f737c15d92c0903ca564ffdccc5b2588b7f276b8c55fd19b435c0c50527ec132c5aa3dc5eaf5502695eca6cb6251304c8cdf3e32aa6bd9cb60b71bfe202f5538f22b812a3522a9550210051ae8bc2f3d7bb963b05f1a1b16af49d3c409374646cf7e70bac785d003bc658bc24e3a2b8c71064916875a80e2caab0726dd6a91a8dbf3d3a12966f6e534166b11bb14d24948aafbb17462c53a9a0ca60c9a720c229c8a74614107f9cab842b73c57c25b24e37adfa433bae543e2c9a36d0871da389b892c8aec7a587d22a7cee49c6f972d20a04d827fa510db5e6b1849bb62c5e60ad361a127d72033cd7106b2a2a5099e837ceb95071c65a54b01f68e31e59c490e102106be460ed8ac699696279ce2413213bb412a060ea9a1160fc2e240dfe8b9a9b6061fdb87932f562fbfee4f7075c6dfd4a3e55bbdc85b72c5396c7fbe8f454fd4180a6e4b7dca4ec30b4676461c5f4a576caabf1017dfa2089c44d9ef080b8d8285a57799c4927abec8fe5625e52d76462021d59f482910ac5a80e334645b17e0bbc84d4358c841fd4a7a2a170e5a6b6a3099092ab9b6014b20dba193779011aa91e965e1fb347adc05995b33f8c92b4cf35dc55ec256bb2988b463e07308ad11bc04062ffa033bf0b6543687aa11b0a5fe792a7691b0ecca53ea85a5f0b5a0472cf0862e4b021dc6fae7450b00a5ca972b8213de29ed6077496b2bda0ed95c3da6acea2ff053b92ab311f731de208e6d48479ff318e5fc48b23b12bb04b20d71db802e59334d5376d428babf895435e00153df05af42042a3349d28ec9a1949558b1465fb43fdfcb56052b5e37d22efad1a5b628c24efc70ae9e5d9d103899bea2751340ceba3078f40915d4f636de9312385139dc311d451c08fd0772615590b2527c9a652347cdfd1d7773bea8e627d7d123adda8149d4b5ed8932d0ac6a61cc6a810cc8a974f629632cfd1853bc1bba2c2ec0a329a8d08dad3bb9c549b54a97c59169391d5b14c462ed925a020ff1b0986cbbc4675197b3c757e93805692ab14d34ef9445de767073fb874de8e54aa7a39b47616405bf204d318711ffd0aa729897829d39c1e8c4f0f71d31854559f09480e6814ff42d7968bafcd17f8a3f1c65f5613c23e637369e9ad262e1c352d73e14385822954c27516b803891a94dea4ccf4645062cfb5b376b7d7a365f3e0a690d8fe68338c7d3a7a3159f9bc6279af92d288d8ec0566cab311782cb30e0102e31867b2b5efc3772963b3fb3a10046ce7b684f3e7c8bc7eb744224d375f367396e6f861820071a350fdd63def29fe6379960a0a55c178f6a15015f21c5679e28da0aca934de0f87bcfa424c2b9cf08642559eccba206ecfc09927fbd5e306f02950d28f07ae7c1bf4f68ac070a5027fb34eeed1880f2e6b2b34f746c0a0461fe24ad1e098e1faac681700cbbc44d2cc255d4e8b95ba62e04ed2d9b58c04bc2615c1888bef2558cc11cb5077e6d63ac09b10268be800c8424852c77c563ba217c4fdfb68dcb95dab6467203dafa2fb347205876da3e4e56adab80b81a22bd96eddec99bfc401af92f9b28f7825e7a0b069d262226885a1199d741f6e2ae3bac6cce1250c2816b0c1db08cb5191984a4210c756c0c7e118d7e97f153ec0c9dbfdccfd6f19d34a97c4e5bf041e813b4c396ced36acc777dbc5bacc30c1b3625acf0bff028956c0e7ecc0fbac91380159763c9b8bce7a8018a2dc36ab121dadf830fc6e05f01f0919c91f278773608822c29283ec1b8c869f746c6e3394b824ba1ae42e84c66b69988e7c49a7a68d138c6e111e507a585d67f878587c32d51d7b178cb64e53a3f7c2718097d6a2f7157afb9f7661092482fe0fd3c5bd8fda31088f7f04beb3b07fcbf15e4407eafca18a8050e9522f8a1dba7b3be999d43bda18e18a62b0cfa4e09c8d48c81e2a4c10f9161cb486cd881f923787730153b40bdd4676bf3e5f650b9386fc5898ca52c432975608042c80458dd88d9278ad62a46cb7132a3497837df712cdfb60284b3f1094305d7e06584b48b89b430f0c1c046338812c1f8a8bc4bb743ef4b74db4c55b8ed09e6ff5dd8b3fb7961dd9f510c682280161809e1b8320582b22149250947411db5e3e51ac66df425e8b80ea3c5ee3166f2ea07ce36608009e66c5f4a3a49e29794f234fb8f92eac5dfc94b9ab875363e4b08930bef6b89c6806f2b0c4db3964709da7552c7e8e21647b92e0fa0cc3290dce90e41c15130caf6a796badd91554415050959d712649d7b2b28f398f93c21d1da2626ef2020c7e362504dc0c97e63b767ec49d44b5593e529d9a66b2704c04a06072bb8cc80a79af9405ecc586895880ab04bc8efb2a2886e00850b70c8ce9930e1a4d8040781e2356dd0992cc69a8506d3807958249e5c5d8e11bbb3b801c14545a663e3ff270258cfc1e2e3b7a4b63350db5e83a32b8991f237b455496b8355297fe10c8bb1f6c0927baba46652d1c6e2091ad840d622275b6ff7ecdc06b740d825249301e8c9abcf80091428312a5dde83c18ced861811c7a49bbbc2f33c7a2600045be4d1891fa07c87dd40e511b721792c5e1a8f5f31964275e01c26ed296ed490435117990cd61237da9331b8839d9c68e088172cdee58c53b8063f2b5cad8301a91fd026370a38b48556552a3c3e5f2163dfc97736d7e10d098c633c539d78a23a7165b21c8226b0fff3ee5a287613629cc837adc942584d8e446c578cb936cb5b7e092a635e301fa83c400a32a820b80fb7bf0ad30b23700633492d5d99c2c0f1f9bd037c8fbbeb74504c5ba29e46d5ce1df479b4c6b5c9f99984bf7aa90206369ad562d01543086876f9357a30e144faf718fb335d75b7f2a9f3858bf1b4aa92a979620c4b52ee2c6012d7c0c676d2029493736b832e7a55ef2c108be0c087107af3ef5eb473b58f171b8b358bb52169fb174099959ef3fc94586d953b631b13b5e144fc30a8d6aa35753230941f444c08cacf3293e8c18f4fdffa0416af310d5f672d89541cab533be99d5d4a6a722c549a3148960126868cb8bb51096a2eaea760fbab525ab5f634aad5123016a2d5c202b98ce8e33394bccde595dff54a7a5668fd6b183d318efbd4ea3baa21c0474be243c957b43a3ef1af885ecf56a42ec81983c372cbca21a4d30bc9baf7ff17fd5640aa69058347397402fea30742881b64fa05463cced2b91e7dbb6e2f4ce9295af34387a33aa0491c66254e4ca6f4c18a9830b16f970d93ef531aee83ee0be7e6dbf0453d00e18acc1ab6613ef5a8c7b3b1c8d4d7a35cdfce5ec44ebb33b3d49600708ae3a54ac54339b35d0c8b40686c622ca8eb961aec959502b68b47b27f76ccbd1050366df85c78c9fe075c06e5faa3a2b24d8efae47fd8873c02eea0118b52bae30d3b55fdf11a3e8c4efedad9a8262e156a414d9578c516feb43875a4c2b5817350aee45741630d2556ca3549c33ce91114391fe67389ecf1861f5d3edd6c10540aa2b179b6507d6e860ed1418b233a03165db53283d1ff4ac036fd88c57bb93a9737ca2facc6263576803346e6013970bab8acda6f6d3e7fd7c216d24b5920908209444caa149d6b32b12a8eccc5407da997c295b90b1d8963279f0558b24fab73760880cf205191c8c9d1aa4864383c94157f160ec14acb4127e5d64096fc4df6548e8e4f3dfb4728574f2be730ba252b303aa1092fe338ceba3abd1042a27c412a87258bda23dc5255342f8a40bf99e31f323475e068d2640413e0634d1a211f6fad2df714193ba4a2a18e64287fb6ca9652ed4c03baae81c0f98d6ec3b16302a8c3187afd718eefe97446ac3d2cfbe41667a10cd4f8211b5570b494654366681c61d1506bb4b6a86ca95ecca42cfd6eee9be8768fbc5a91336e8a88d27113343b414e5a8c7dce3c0cc7007e1071b98e1fd4187146d49f56a61af5aa5f872e48a40a1f7969b08e36d299f4e9c74628b52f7386970ffce75fe1ac7b893489bffd398934c8ea443186685fabb323da7e7c9750b7500e65b4430461b7b354004500fdc15cab0527ca7d0b268cea7600f4af49ea096c459b4ae47ecc31be93a19113287aff3b28302b942ec48a083a08c76c91871ccd0818447ad19e8cbcb6908c1c33265083442c52bf2faa28f543822bb1df000bfb1d3095d178497210d30f05f18f104a711c3243a2db103dbd7d630a61e142217440284824e0047c8653c7243df3d600c5a31cf08e99b7d7bdd11a124b49e3e2af966d5c90432b0b18034afc048d6959166050c36a37c984c975f268775abcc8d340c4ce97fa74a8ee63012f28a40015ee085a9d4f5fb1378e8fad699a18ed7c20507987bdcfd20401b543e3e581bf9d988ccd6404ab8ba53afb7c9ce427bcd53b93f50a83401f8eb6323b73d0a61a42e4712256a51b3c9639799f7a03b878a8842f042c3ae3d5a3860a343a7a41349fac042095f7dc934034fbd55765751e29211116d0e1e881ef450cad4f478df965f5012579e4f69e916d6e9dfe782e7750edb26abdc8890c991ed9af6f22280415ac7295e06193d1ee682dc4a5e8c25802d63de343400b87b060268ec071439e5a1a3e2da199367a0a88dc8385ca301d26cd239241e4498f43b1e46cbe27dfd0491d67c28c765dc60ab40de385679677aea155f4316cd1c1d02d3bac35640be75a4f2caf4d0a95fc1b10f8343463ec2b7ce0dcf357e4102a259eb470c51ee3135124c57fdfe943ca4626150e2d68b41068251bb635121af7dacc262f2eeaae886b8a416c141c2a5e83201be77480c6370eca909b3ab768afb3f817c53af992b90c94d267650b642cc0fcba52cfe7adede322a91887ee1ae254afba26556790deb12ec495cc645c7db8710cb7a1854586ded6015d978abec2f9d274dbb4851e1107b2d79b7c5b587b5918dd1acec33b8d0adbccc4885f30e835aa605ba3c96b73a05fe1eed700be4052458048c82f942d6f55fb73573730c827a1946ec806f783ff1e78e7900b6f2e471a832473c8630c40307021d2f8f1c1c40a8982706c27beecedea91791a7bfe3a8aa02fbd41247a53811a219c8e53081cc29b5274c2e9c9b2c53803d00dbbc53e7f8fefab1bf30191ffc67d99d143b853696bb9f6e30902821557c2385cde7fb55e902444e8c9aa2067ec1bcc26712330c8a58fef367a8b1e9bbed914350a71cab1ed0484a172e0218f1f9f2f68642f8d4b5bd76a874095725afad58e412143a18bce6104854c1d4c512b67a59e445f72c78d172e550fbc4ef207e34b3f224c050b0040a07908bce3427786c0324adc73a8b10051261ed5e18e260859f1d5e34df0cc10c93a91ab9445ad05443607562e1202be8ee0e9fd44ce85956d945ce4994e4e183d4a4abd027c30dc4ebbcf2d694a09e558c22d85339a2c526deb30a215b9a97035d1cb567f00c0b63c3678543dfcfc7834eb207a89740ec905531026f85d5e8408f819cd0b1c608fb4df28d63ac32958636b58bc96b432c4059925074c02a0dc93f7f23c9cb531e86c1495159a8a9cd502c544674cf340a515329c2c181f4cc567e0c64a3a91f8c13b134d3fd163486d3eda7531832a54e4e7d5af330f82e1dbfc30674f9744ca2ac7b0a00814246739cd84ec383e11557eb27622c352be5f1a6dc05a474a5d591797873e48981283236f0144138979dbc6a962a1a56a007b0a0a510bbb908cff29f38a0fd5357724c45a399eea1a479c6c2bacb88e2eb2ed31910d30536c8c5eda66bbb788e64640d1826c8f55bd41502ffc0c0bcbbf6070ee0fcc0f667b2bbf51edfe6ecfb0cf1841d536f86c5b436e037604c9ba89d5582c3ec0bddd404e7b3582d96e739ab2855c5c8dd202e5b5638930a4ae459745ebcf7af96d8a4e1ef4a651f114b6e667192d64449c0c3f3b3fe330fe08ed4d96ef76dc903e8f8e62e6efc85abf32b3f64e3bc5bf2bbe2e365b00be597e2844e62adad2d55a9a3468ca983ef970ea62201140feca0cd55cf20c6718e22d08bf4b6a66b8a07c35b8b07062502642ddca8e17b6f08f1bb17a993d533bdfa87a2cd8ca813ec800b18fe50897dd4578cdc999121aa491fb5f7cab3bd55b310a34408a93e749a495fa553cb71c3860615bb6202468d65a77fcf7dce724c2f7fb6c9b76e4a66f5b46cadd2181c4530712de3f4341f6da39975a5c95c7a62c0949d79ec38af9dcef506b2187072c7e4fd2dd908ceaa89cd1696b0a571a514e6df414b67f450218c97ba48c67aedcceafc0f43b3b8486e5de0666783cff30c6fc82652028511c8d70c0ca80bde6ae1fc29c72307eb4f4ff7b083c3bdb17fe4f0a60618fb341ecfa5639d47e0f9a3b286be736609578a15a43b8942f4d22c17890ed8a6eab32183cecd717f6abc72425595c2bc321d906e0dd294aa9e71a737c736b8550fcdeb509032e239fae29503da06337dcf011f0439f4133d9950f1cc3a6d3ab270f25281c1877b69cff9c4b63129240a61feaae60ca0a98acac4a1681e063b55bf628b14d9e742102f2eef54a185562ea15f447fda459255f04abc4af832c81d42d0345634947455cf5ee981aff0ba1233904d0043de5f7ec6aa68d7505b6aac89b560d8089ea2aaea3e4ae5f24e5d653636e3df6b68a8f7ef929ac448c9c2af841376aec4cbdd17f7a9bd2b787c3871b1cfd1da45e3b2ca77255d8eaf3a99aaac4db9a37c95791e4e77764b5d60ae9b8b342e85e61495d698c74e022b95f2dccb7e17622940872983c0d7e96cb7a13d705701191c51d37affad087682e90ce63ae521fc000f79c69399100433a16696958a2b88a772ad18e0b52ba9a6ef3580a1bc7b4f1ecbe28c3c025ac689cb87e11d2d80b1b709d669a44bf4060c8b754cc093b02a848a18a02f9171496891974e88a049409d8b4f32d1e08aa24154396c47e5b11f8d94edbec87176f0c6b127c15c4bbddc67919d77c3ea7ac4a6858fd60ed9c782c940b8fe92d9ba63a633331fd3b0adc24829219c9f9351fb931f90aa19fbf3728c3ced32609cc648b46b857dbd4001dc09c04722b1b14fb21694f875bb2884210bd6fa372af6a616c04c295cfa9af88c597714f654eaa522d4f8d88a117f7b5a717c36debe6df5f91d3af1f58eff35bade5f7292a8d97a0ae9237212f2cb8061da49da794eaa427d31ecb5bcc2bdec9468c1d2118e1694195cc3635229fd4fd4b1efd2b9843d5e1bf137f00111a3fdd3b55654512c5b3aa057437b968ba3cc652ce39c3490e4380530a9ac6a07fc0d081d494084eefd22ac606e4c9101b2fc5734465952d5fbd5944b7a51f5cabffe74f6ac8ce47d0738002bf61a9e2020cde9fcbb442c0033d47a69957a5b748bf381b1596e9b0a64593e057cbe37a4505a62f21d22289b321757e9217eb529f4ce98aaa088d041a157867c83208313c91f7e071e88ff070bd8ad22a2c3526f9286a77e1515cd02a62378a460f4d6b387e08965cb98a6d1cd227bf8056b1f6fa4f554a2868718704a0eb3bfef7cc8b286329624993e12d6900a8ed8d6535ef95652c457386c7f4e14d0e9ec13f73292c3faf4052a31d83a0a0963a2a72f9acc91765838bfc0895bd9d3aac5bd9a38c088e107cf807482559735fbd4b62ac45df18f53d6f37363966c0045a2f28e61989724b88d365d28d67936bec4e0bea554ecd28de02a55ade15bace189797c334fceef94457f17431ca3736a8bbec830f3e5131e07d21f13953bd431c36f9a50b756827470cc7483d6251cfdd45b0a4607746e01e5311b3b6561c6f237e3e17475af00cf53dac567ce989c8ea6fe28367d2917075b8110b8ff40753ad2f2fb5d54fd3fc94b924aa18501e18f98d637444510aa964d45f904c8a3a5ad6b8c2a5ca9a495be41d676b15c6668a9dabd10cbd42eabec08ed92920f393a14427f82a7418bbb66ccee28372ce746a7cb38fbafbaf39e0ea7e0fdfdf2a2793121f5d8877c502dd48b4043eabe631841683059e3eb06c01081692563d555fd29880e61cf060e68bcd8b3b02a0fc20dce8661113f7abddfc1d715e8a25b10c4a21c85bd54e6ba63e6071ed8e70986ed2e2b463a25c97ecc8652349ba4963b252b912e34e58d7cb5fd1574ce8b06c69ca961401f4d3c4ae3244c7234298d9ba50afc0a7622542da325ba823d133ca6d6dde38000ca0a7f32ae6e03305e0cbd1d6f44b8daa0de9b3e08f2312b49fd9061a27a98caf043f2a163cc192c37e046a04b2ecc498d5a0632293031cb6066619aa5be8c56430040af509591245f457c94ec00807ec029f30f45d86005d8572c8310b20500b7c46acd906342ccc61b101096161dd893e8d5a2a2178e85f67b89420ba32a9672bc42c36d8ac5abb396b48f2fbc07aebd87d6c7c2d0ffb6230f69c0c6c753ed15ffdc63c2f67282507be1d80d2fc9da72bb9cd1b31a5e940a6dfa95ea239c83598a83edd782d2d6caee39508cc52417ddf0fd7c997d5668ed8445e363f502e2256b94582fb2d268a3f51fd1a71128d955e18bc198ba0b4a8c65bdf54a1433ff6e92b2b87d444b624ccaad1660fe67fa6dcb5507d06b4744b4192d653e88cb04f62ca03599f363a731a8135b48a5cc89d89740285672590e3d7be99b88280698a668c5fb6455f27235572fa5b1f17158a3910cf1f190e640a5654bce52b4544f15c0ef1f788faabc44fce625fff1495948f54c66ffacb82b55fd131810cb88e0ae2f0f03410296d80c227c98a8de829acbae104fa48f99cd0e723c5f0d2ef473d46fb05d1e84cb9b65e9f3c99f7299f6e180a0f05805fd3cf4d449166a1f8cfe34789139baf4330c0b15ceb9b87eb6e3e16733e3aeef90aad11a38210fa89618369b750cf7150fc481c7c258659af07a826f447cf0e2d9579a0a43b45e5fc75e09966a751f22040d8e00cc8e3454d89b55ad662194c9d8fc686073089f85d4522ceedd5ac70bda383143d10f51c169245fdb8de24f819e29522675a4f683a133ee925a549150e8d1efa3c43f1f0cbab2ff374f940a037a61027759409c15a5035fe966b4bff54aa593c47b6a56060142c030ac93cccee2da54dafef7af4315bea1e0e47b8ee80f3371c21c2113c8c8bae40d1970af1294908fddf1643eaa7062be928b611f95ed63a3b464efbdb7dc5ba694920c57077d0752073d5c14be4b216c387453b2e16c38ddd38508f94361ec7c28ab6840511a7860a0d080a201e54a9ae4acec4dbf1f700e6515e7700e0fdc67bd8220abd308ad876e39dcd7cfb0f3ef86ed5d4308a1aff33e978e6838d8651f30136d1ae24f19c3b41fc1e18ef4e795d9ef7768f9902321eba6443abbe5acccbe0d46b908fa77aadedef0dbeafc71018a5500fa545c88826af4a9b69004c6c18c8d121ca480066058f24409429cba0824a633d7168e20a780821056b0640b3f48726a28a86a0b48a0332b496c61085234c10314ad81be269208a18c23f7b3c76a0fac7575866659a6bde7e30a42dfdc9eeb317f9a86611fbb4db2328e4dffd85d4bac8cffe5f1310c8bd0bb6c3d68ddb256b0bbbe4b2cdc5dc2b21c3a11336eb0f1a487ae50cf052d66b63c3277d67c331406617b7a90b0822596e8e911a28817f473b7b4e57d17a1bd8432e4b81b329448ff3ab345b8c40de1ff708ea5b74417a15aca732372b489c4a4172edf801bb834834b170f645d1ab82fd425d0000474110abb1822b23e9f599ac14e20ebf3d991c3013b346a89b6de59cf5d0bff06512e425b5bee86d3d7c4795b6459b3f6d8e83504096d36884beee3a2cf34eb4568dbd45320010dcec8b1e22f3a19315cea9155c60c7f1925adb78bc2172f069736882ed741d4ea5c869075864f1297a011b2ce787103d3bcf0e8292ddaf0d0386b8fb722a277f05623b9a9a8a8b8f8dae3ad46a3f721473f92a315f9f1472b3c54f6e58f5454aa0dcf486e9b9423397a1595d1c759e5ac5189959519e4ad56566c785634e5e56824a58a7c15a9a222e5488e469d0d0f75d1d5b7529152fee85546a3d1caca6865349a3ee45442f648d16fca5bf1a8f04685f601140af5037d2fd6bb80d5a9f6b6ab8bc3a3478f1e3deebbf85aa23ea3cafb18c5e9030bd5befaabbcca4865f4f1555c0bc00f79f1fe2bbeff28f62f7ef45e4cdd77f18f625ddd81ba50f9f72e4629ff523a1efd2395ce85881cfd6e415dbc0d56f938eb68aacc9c90f8b744ead4bb0a44c8d3628b13cb0331c4e674739d58e6d3e016998647fff56f07aabd6ba28f514a9148f4b544e316947b6d37d7d8a94a536f1ae3be658d46f15f9c55e55dbcffa87b2f86cfaaf2da0ed445576770ec167447d868fac04247af124325ba0ff81de0a1f28e7964798c25c6c7defda3ca3b8bca632ad3c7682a31048c678101e359586000e05948efc1c80fc08b1ff2de90947ff1706eff68f6a2aef698a1188abe17839b759bfed8634fea5e74a486d90f403704002b53767507182e42c4cd7a2cbe77970ed6fbc71e42163a3489694f3c04283ad585fa90816a433770d11e9afadbd06dd111df3fe6e0c3d26bb6f4b8a80f4dad7e9f1b972e1b1556698116ff718c52924831fea3be3cae8fef037efd008dd30796aebbbb7bfab060380a24177d5c71fa7c2fa6c6e9037ebd7e7f07f8d7fbc7aec6bfde46c72ed209c4f4614d25f6e17cd306ae8f6088b2956d6bd76b0bbb08897536a767738210ca18b72791b8d1368af1ba664a393cc525fedeee1d3bf5f908bda1d4114f3571d98b87e7c692b6ac6bd991bdf69acd4973e182bbe1edee0dbdc7058c2deb5afab3b739615d4bff3bd99c8ad89c92c41c2ee9ecc81e9b40b2d9dd0c1ac81ae30ed3bc20ca477089bba53beec42349287ffc619a203661403109d33c15178e504e2da1ec439979b810045ae36acbd90214688d4ea2c714d3d4788411a6794b287b3c82696acca15cb324494e2cc27c396193bc01e5b8f360f8630dded324868938ee8677731b69b3b8f89ac541003b614a646f83b16ec61d21ae6783dddae28e7bdc893bded06143e8dedededeb2611c7c0de320809d3257b58fca530dc3cec3307a20fb9790fdefd4eba976e761e83c0dc303df6af82cef4e93a15906196490c1f7c990614335003140c87b5248938c991f332ed0ac0e08eb2f08ad7f9705dfb22610d6bf0ece1adddf465bdf6f753532a3407b2f167cded5c2aa05282df8c820ad19c81666d3c3827a9f4006b4361420d9424c03697f3fc182f6bb698d682c564f484208406b0fddd0760b6ed7e82716eca116e21fb455c5105c53b35de335916bac530dac59e15c20890421704969b95b5f2ad5cc5c5ccdd6448e5fc32ecc08da8f9a9a1afff6b7d66b56e703077c7e1c8ec3979bdaec5220a5baecd71566e79428e40fb7e276416c4472f997d65e5c4896c3c75b746cc4f2424b7033ee86735c8e37335f2c42d3aa46f9f1e280f0622257b8db5fd31afa66e33fbc21093e336cfe9929b43783ffe02855a7c07f70546bd145740aba882ea253d04434113d86266217f2c0344c9b9a68e4f4600554f768b7d8024cf39ca0bd0ee01cdcf5e0529c3b7df0d0dd3c3c2135e77440eacf0e609806827c5a1f14da5c6ad10179b45836b8e1ccf1847888129b1c4b469e4ba5999997977d40c728a5d7f00aadeb2e2e2ffcdc5c4de370aec677103264480dbce18202c93573b3b81a8bf26b297e23391714487e96d586f2c5d5c4173111a462263e224411a2fc2e3586b4f1cb3744831124f7376d9f89d3f784124308a2f43da184930d48a9857c4f2881a21a7d4fcc000bbabfcdd8d9dddeeebddfcd42fa1920cb9e32c5bbbd6b77b7773b076390fbedcd1813f23defcabc7f6b3d8c09f8de5b4b568899e59adbc690de1adebbfb432fd75ac05e91b2df7737fb410676ff5a970dcbc24ee052b8148e842b2162517027b2aeb8140e0547c2a1e050702680a8432664bf45df5fff3366dcbae00e15585df245cc294fbf05447f2ccf1611eb1529b3adc135fcdfbf55af360aa7f36051e0f1ee3d9920be357c095e93f32cccd6c8c19a76d8550f6805e4b63572b22488901b7d2a2baec04275850fadf28798f97f29c50401a806547055488d3e15155f9882c4e8533df981d6f7c21322587862c415aa275150a7f567861ed08a3fa01763a8220c2318c20839d041821545b81e94154891c416ace0031838e108562881521855547113058b1f40418253ff0ca6b1c1048ad1fe1c6dc25af085220c2d01288b204efd3b3c951552804058893e951531a02af4a9acc8d9818a72767adddd970f9758097f1b0cf4ebb3438d65415e3fd8e9bd187c6921aba6c282e66c7aa70d6a1fee48200655148ea89c84e10a59e38c114dfb2ee664d8b76459dc9450ff190d60534ca9869270be8282d619ea4357a0f5862834b3301c58cbdeeaeab5c23a253688cd1a5febec9fca5134fb851b73359bbdc6bd6f13d510d0f76264b362588f6b15b9b4af61deca512eaeda4aa0af9bd0c78db0972843948001d0f7afdad091b6466f8d7d76419bbeb97d5d91efc9583e9a4f13a9acac401ad5057d2b13a98c9a4b2eb18b57e24eb232dc3d2bc3ad646558e55fab542aea5be32ab2324c73b54087af59995e46b8c43d8517837fa56b273c9825bc12bfd575125e0c7e175d3ff160f8af1638418b6c8d5e3d197e9a56bd127f477115e97f145ab09f5aade2ae9d6b5ea9cbc89512a94c179d647b56c9c2243d4a6a3c5a67789172aa57cabfaff01aa29fffba793496368e7f3f611a2d0bf009d6f33714afc67b32d7f3b79366c2345cfb3c1aa2a7c2fada5250bebeb611640bd55ea564994ac7755be7d2c58cba8d258a55160a5367e8424157c42220589c0a09c9f1e0d1609b12cacff570a8cadd542ea7723a954b556ea7723c94ebb6aadb4fdd80ea2654b7215a37287553d5ada76e3c75dba95baa6e3a94ffd52da7e7a76a405513aada50d5a0d40d45eb7653b555d57caaa6aa5a4fd578aab6b3435a6a2713aad950cda0540d4559bbe1a7e970507644b68257a38facccccd7ac05943f1be2d1348f0e321cca8f658180cf201685daf0fc189447c34ac057a9bd6c533baa61f865fe00b3c6037c8c59658c8f999514f335ccfa353c0d343c0ccc97668da537c0acd2005f805949057802ccfa04f897e7f3f20298a83679cff6b4c905f033cc3a33c3ffaca5ff6ed6ef7ece4a9a3f8059e5005e06940cef326b74f9965965cbc3989504e359667d9627cd5a220db509eef04e9b6000669d01c0aca595597fe55dcc4a5299558ee61065396b9c55be6856d2acbf3b94ffc8d6b08e58191df0f4f860a68f504e006642c0fbe0f58c5ae5c42bf1fbe0d15849bc1ea6b1522aa6b176b89d7834560d5e89dfee731bfe71edd3268b4766d6788059658c594931b37e0ded4303aa4d9610ccacb134ab34c0aca402ccfa0440bdcc3a43bda74d57ea1ac0ac71ce2abb59493febcfd023801e19668d2eb3ca96594930667d161f22f94e9b620e046a539c7931eb4c2900b3961e00b33e696556927431ab54813b9447b34639ab4c9995248240d1a7442b048a30098c09cd506dc250d8509b30a08639626b604f783229a6c1a0d8611a8c07af068f0653f24afc9124b3591f4361a8a1d20e8a87f2102605655aad23b09e17833f011da6ea309f17831f011db6eab09f1783ffea30274878e2c991584294d712ba7eae947572247dfd40a198e3274702a34f4341f1c99148ff8a5ddb7636747b826f0336f2cb5aac0713d2d3260e7a30cc413d16d6c3588ff58f5e1ce44244b6e89881c7fed3471fad3b5b70f89ed58328efc430149798560c45f93121fc188a69d6aac210515c71635f091bde6f58b211ad1814cad8106343d817d6f44e351ead9909b220289f2aa605e57f5ba3624394a78d2fa45ee9d5e869e30b469ecc521b38950c0f2006da7b81b08b0d53a25c2ac56040c692199f95937ea6a92e2f3e04843e69dae326807d9c40b2c7debb1df1b30924fbd830fdcc3d1a48fe1d892a08e87b312e1cc8ddeec11cfcadc903cac502fe6c28deb1ff2c583787c23a83c226e9b0debf0587ebfdaf09e1dbd02e817c4b75839e9f1f1b8a5eff5eaa3544fdb5ab631a65b0aa55b9976224bd8a69fa79f23b3781fd1defd7d229b5a9020ce3efb14a527cec6b8956804dae83cd1aa37d9cf585d6f7d6fce159df13ea2f88fad4e66b98fa3263685d1ceaafade06bd98f085c331501ff6918ff9e961d9c73d3751a26023002af61346eeb62c3b4a96587e8379bd3f5b14ddb6f13c8f6a2c9ed10bd3681685fbd877af51deaffb807ec899ba586816fa361e06b968e95822a0a6bcb8eb539695dcb8ef7d96713880bd99c74fc63949244729d16daa17555426df2550f91e493a09c7a48a2843c87fa348ceb407fe682c482646bfbdeb60807ebfbadd94272c1f1bfde8510c92a148ab215563740d1218ba5e9bdda1e8710b441481c456b0f187d4ec4dcd0989e1854cc4dcc8d9017d4e3053581fdd0ec06fbc17e72c038a415085d80c0e5504ec5e570394da06a2a2de8e6c86ac3428753f268f00ca6ef6113264b6e2061e1caa010324a319e0024190040dfcf7b262c05f43f24d30c1af04b10881703e90a490596aa0265611b6028ff5ce96a9ec21b827e2cb3e4c89d9764f941b6f8e0f47a1f29f49a6f7dc5523af45fd387b578c0ad87c5524c630463c234efb50fc19802a6a88b72e8ae104cd123e88dd0857319b13074bb67ba6e1e0cf7458267b29eaf2228f36f0cb30fe74a77e170e9ba119275e3b96e584a20fb7d675da16d9d5c373f9cfa156433cb88aeb7c633bcbca09d42bbaf07d3fd4afdb0ffbd3f1a32e8722b83f6ee5377518e95446b8be3b5ed392cd5e1022f12897534b62cedb32c7a3468f1cb38914ad29d75b512d3788dc55c0e2ff59a5bf4c1470adddf7e86f6df906387057a7c4048ce113b49544c7e364813754290681fc49f9070b639f8f3ac9366cf6dbe39bc706945e36410b2fef53f6a1e7ceec636df93a9d9af0e7eed99d321029a7d8969b4ef7f9c0e7f6d56a6990e9f2f3e641175e08f6f837d2c752e4e1f5be21237f74291f557574540ad3967647069e6c5c89133a51dd218a3c20d07da04bf9f6fa233216bf7d07ecdc80e973af56274df340ca783730e97ba7a2af5803ec1096f1ae607b2720ee77011a6d1619ab55260d02c6903c9cffd245e599caedad0e863b7a0db6bdb6cc9f1e8f6351cd7cf3d7c1bba5ddd680f34dba7753634eb7a6c149b4b6465aeb7e27314fed86b5fb17f18867d6675bcbcbbbb5fd06b22ef6665de77bf476465de5fefbdefeeeeeede210f38320d3f7f05a2fcd0fe97be4fdb14597264bfdb60d77f372e1f91d0b2766a310c2e31320d5c64a0bd971a8021ca0f55f04587d7e4e17f3d57211f8d94ab901bb85694077ceb21b7858c6cbdf6b89aababf1eb520e870bdd79ad7e206b4aea4a49e188f4bd18d78ac21f4b7d9b31004340f88f3741e548b8139c89c5a1abe4cdda63e36ebcb96471e2157e9af0a00e7dffb0a0ef9bac788e388edf08052d51a58e8802e5a749129e1cc67922e4b3c4486a51409c4860868c75a125f4bd9194a3a238f9e949522467e809139f1d23421805e444498f4e112c38b072404c29569f4153fafdbc17a3caa00f0702d0e741c87d7f2ff441281a41a13d4ff91151a0fc3449c2d3384f847c9618e114a3a238f9e949b2453667a8c76392a3b4f34563c2bebf6ca0694b40c29970241c0967c29de04ef028dc094b8822891552e823020db6a0249794ed961dee6f73ea0e88c51b471215f2659f0449e87b027d2a2252d0f7841349a04efd36a72ae8fe06b6c6d2fd98591a92b5d4451e5967e8bea0620ad4e971379a0548a84f0a0f097487647d2a2e044169f04d1e1c042c4824291ffee37298213e7f7310da7bb1a03fab93f1c51a8db7c5e1ff626c09e45bc982addbd7a865d97b18f6ef9148148b0fb1b89fcd7d18e6d9db60d82eb610c28fddcccadc8010016ed34576e1ee5a96f5e8ee7bd01dbab484b4c734ef5d7ff95b0e65fff5f199aeb7e6e3d2c2ebe2cec68330730db4f74cce6f0614f27d8dcbcb8420f82e7ae2527b8030be5597629af5d8c3999581d6848fe9808095811f2106a185d1cbdad7a2cb61f778a13eb18530d0de4b0bf5ead1006221590b74c87fbd08b2896447f6fc98639f61d78ca7fdd8bdd36b9308f82f12c9a54d0340a9bea023837633812e579a1fc887c4a09c5006b268dbe01e3027626ea26067ab83818284ac91728ffe51d1809a81c9f4fe713aec0f5677134fd6c36e07a34e41e8f3c129fc161c3645e1f4b15b50ef5983ec90104e1f29d4a71296cdf67e518ba20d0305edbd5407a2ee43d85df840d8c7eeb4d83d2a014c024cd33d5a017f3f95e4b261cf9607f067bf833f9b4090f403c99ea7dca101e1d7667cdab4396ddd4a6dda667d6d3e86790983e441b243534d20d96b134955823f025bc50e8a803a8920c80c228560f2829308826413d54ea828823af1f357efb1e1af7b3fd72501ff0ab8a9536100c85d7376bf2c1805f52f2981d618ea0e743de99f9fc143c3f4d79987758d6a987e1e7472fa59e7e686b428c93a4224929428ac47d685b204101074d2f14727bb6953dc6998fe1eba50b462292ce5154b5d2a1f2cf5e34cc87a7558122f46ff76180c9e4ca7ac206bdc49d1feb8d3a6386bdcdfd91f8647833210cfb43d18285b63df8ae1d16cf168fca1300968af0e7dfff10981d69725f8a4a13018300a76378fadfbddb5e0e028140a45f721758aa21bd32cbf26a242f2673a921f4b4208a5cd271e9e895127fec728da2bb02e685dd0bf4547f765c12520843e64b53ccc6c26e08b7f38d0a66fae86b1d798903cb4a94ff05b74f8efefe441f96755fc13e7aa967336877f70b6c62a5142ebe27419f7e8a8523ecce384d665f2b33e5c5ac225d58bc1bf4ab6c636e1c48bc15f170894873635378b94d07eb908ec499b40829cb2c93b3b90fb75551e20d11e4898531f6f0bdad3829d3febc757bef295af7ce52b5ff9ca57bef295afdc95c85aa24a4a14ca7e43611a489fca0b4592b049a472214cf3545844a1fc45287f75940e653f42d9f7c9bafdd0a3b1359240eb8bab3a065a66c49beff57bdddebcfe9e6746c87de8eecea5f720ac0113b01b6afc8e3181052c2b5c826d12396118f8a2200ab1b7c1d7aa4dd9508c525e582772e223088af21c8240d910291b92246e552690fe5956b31585bf0d758c52f646b9639ad23dda2aa6a9a255fb304d5dd93aa6bd84693ad2f510bec8492682d972dad4a936adaa61e0934852768ac22849af89ba7e257eaebb5e897feb7e2c6519d6de1e8142174fb3d77613755cb775a2558ecc9eb117ad98a61f3ecb8dacf1afbfde9aa226356cce3496680ad4faee9944ab0703dfb2f66935345f5b031459af753714fe77383bb4be053f736112b6d232ae8aa1f5751ba2d0122de1993ad37f154941e1ef123675f3318cf5705aa21597e05b0fe1bf173879489e16ee61036d6f30dd9797d2be18bb5c0d37f77ad98677a5b0cf2fc7e0392011d6341c2f17d076e3987e291b84aca9f981cb220f42d6dc4097c3b1d6b26867d0f7d2bd97a0d5188628d0c210a06a4181c14dfc90a24f08f435817242b5e56a2c1722244482fe80d48af2624022ccccccd38ae242128a50fb436b4c6d29116a4b8988c86a41690b8a05c5e77cd58242f953acd0de0b0442d68d7249063108821118689a0ce4e352864518830c8bdc2d336b9aa6adb6da6abb6dbbdb6ada8c6102103a747bfe1bbafd3322af5273a9b4ef61190b0b10b2ff7a0803e9f1f74b6d8a316a9123bf387ae11256a2d667338fc6f6d66b9b8f1da2efc5b0815aef5c0e90c3817f9bdb1340ec504dbb2ea8e3856a737d587a7dd639603a4b10fd5e2c1884d69abbb1bd9be3c9d0251d4fe1ac7267259164e020fd6d264438018a3e22980045e923820972a8962204897f107f4af9f7d263e8ed7bcfa3ecf14aefbdb7edb4c013dae18045757bc30ae07771055957c92ab18448d196452e6a8bdab8a84867502dc81ccff195bac161fe01fb0eb848a35a884371a1275800ad9a38f1e96125bc84793845d9081f611d2ec238723a10b81cac08b77836f72051fe289419e5587890d0901326ab9f254928f71ca18cc37a3f82726a77aabf45a23e795a96cf28840d275eb1f002baa1bda669afa568acd928f6b0bb9e99afcb6ad2b0b945d67337834b391a407a591c97b72eeb6238338369b087655dedb1d123687c9ef13d0b3983c4f1492e5f8a898b13745d127237786e4d48c80c2f6b95828415121138e7eb0a5d9c5127db3378a960880ba23062e5d0ca42939c785d990f8c10c48f0f0a5ed80298f000e8844d9b13e6058961da8b217be2b07e3bf8718a140c3901c93ec8aea2b4e084c4dfe6a4615dd65d41663a6cb6ecc0b0accbe66b2de0638fd3814477e90648f07d58afe9d42744ea6ecc0bf2f253edd1cfdd80b30769133139a204e7b794b9fde81db37e6fb6c6f596c57d8c1f45d7accbe9c868e46ae26baf3d2b72372c497adc0d4bb3c116f6a8a8db9cbae110d9b41b22384aa886855c9c8cc886cd7a719c0e5ac77137b00d831b112238296b3de14814faf43591e4064dece0099da1af891d28110a4393a5588d3ff2ec77b3e7e4f529ff54feb149658ab2093f723a327a5d5ccdf5db6bbb177763ff65d495aa90fe32880fb5de46633ee31ce452bf6f929e16a29b5f21b7673e9fd76eed81e93e5637e374d0e8ce5da20a797dfd76af3333bbc4caf0125bc3e55a37d0de0ce9f021843ca073a9eec20e5ef0827fbdd5f180cff07277ea16b420649abacc0faf87f02db8d66541ee7858977559d65f0f3b1ed6f3af756df1d160ea16b4207c7ef564df565c2dfbd6a8f6dac6d28fd8c3d2fd0bbb30ec8aa1d6c738a743479b63d176ebee7dfab0a7d66253d4d5c875556e5d25d12ccbf6b32c66cc5dcf9dc32b8b5ad4b4e58d1616b118addf2c2c62315e31fb88452cc32af659fc38796011cbb0d8f1c0302c8bd66f1616b1182f2be50410e55ac01f46425cbf3f7485e067ff381dd7dcdfedb49df5c5ea61ebf66b913fce300da743075f0a7c2930bea7700aa7f0ac317a8c36f829dc18135f0cf8be85bcbe463a63a387061e8debe137e0d1e08733500cfb19a6193d7c194ca3f2f0678cbaad935ce25444bfcd365afe8034a5fbb154d4558c72738b35dadcffebaf8c053698b3feea9c7bfbfb3be9eb81ccfefdb55df696d7c6a3d174997fd0ded55deb2385a3fb17772d3a78d06b561b6cb1994204b974fbb1bfba5e47817c36b6c652f80d80f1cae1d487a50c453b72e2e3eeeeeeee9ec54d290b14ed8f99d1ffd21fbb7084f66f4dab087ee0c490052dec36e459f029fc09ae04fadea1782691aa7d9c10a9da24cac9c9c9c981b3fa4f4e9bfc090f867f0a9d2ca4acd8f12c7828a398f027b8159e059f82f2b34781fe131b46f8179c38f8faa7509c50f84f9f18f2a3591bb683030128965a129612a164c55242be4b48375840c80e9347838bf4b013d4a361e4d160ca8f06e73c1a1c376f22b1eb4114d00787803fd0f79ec533710ee53d4122914800203d18e680da2452591c5073402d527140cd19805691ca00b4724094df7f68cb3389e2006a2025e06b50518e13aa36b13c18fece076665c30f65e6a71261c1bb9aa797840f5be83571307d5cb2d855b462a92a5a518ea888480949344456524e10d3542c25f4c334553a5951a0d4124c0887a74906e5889b80a8146d15a64d2e15d108020000c314003030140a08c42281302822d7767d14000c8b9c44724e9909b320878118438c518618620031c0200302240322440100013bbcde27e2566dd18795930d96613cf3ccfe086cc1b64076d1775d7496e12b8bebb1ba30e39337b61b12ba0ba88b55804057ca43f1da77f83a5d22f74c206cb34d43bee498c9f6d17148e89e470745aef449ee5e22d103c16d6e322d064fda90e865b7bc4968b075fbaf6e06450476e1a7344b364f747831c6d934d473bbd852081b01db54dc418445bba63596c08766aa0e6b55b71553768460c9a6a26a0fa639415b83f054686bff5372da2837eda788b131c0dbd32e82d25fd004d139ec474ee79656a0acd1ba73ba84b08d4c7fe0050493e7fb49cf1ebe6f1990d94e555212a796604d62c404feed99f52491d004bd947c7a6d7dadf163522414aada803f74808fa5dae12d12665cae11a72eddf723b13ec57be4b66ff77cca28ada5883144a42be8be81a08a0c830ae0968d8db8d1426c7e58eb409f1f808f017ce39d41a7ad117e637d00cbfd38390ff288e13ac4fb3a0fb21bbf663b12705aa3e5a544a099d5a82d2878773ba6960b7e7af4a2ef44206fe1f2a9f09f4f166d06ed92efa993344efe0a833be0792d303191cb04dc00415343cd07f76bdfc7d38d346f447fc67c23527c7776d37f6f30fc2ce3fb619d8f2d10c8c4ccf5504bc9b62e144ba39c9e1bf56060578788c3ed3580e1d6945a0852b7c957023e9fe1030d5773619c084810a7b924191b0313156d35e55e7f083a21a0b1398e093e446a44cb4a4b40674026a47858cfbb24bcb3295a784e955476bd7f29c8270d5d3c46f0aa55870ae1242e2bebb69e73101e4d7a736a69009a32a5e190f686774a2109d369ec0492828a75bb8cc1a65a47cfdb5072a7517f70a156ff97c9a46d2e85111c03c18fc7905298780964683587b543cb381fda95bcb824081f04d53658b80b4b96b622501a14e01c62b781e9e86150bd7d50ad1f18c40ea56bb9c126dfd8a3e0d7b26c4d73acea79e1170869343d4dc4a55495f455882b137e9f80ee1750835c861a27d2899f400f4700f4e8eb000157d02ce3419cd1756f32f53390c80fd0f966588ebcdabff51b179da1060a770cd5873f572c4e3fcd6d61ad27acbeeea4b55bb0ca0fc956ec7de58e317092f8b87c9b5e6e812e07f8a9750fad3285707f982f77bb1d904b6ce88d2707da6b748d5217e1b86ff4026faf116bc3ebf9540d4873d45ea8e105f645bdca6ae509d7d395d1a4227ac361c396a285fe4efa02c818be6fc9dc91fa2c01084b3eff4a3477f0efab5bbc81d9a1c1d698c18e513bd0310eb12d6039fc2debe7d61adda466b609ce65569dfb76b56ec9c39b9fe8044d607e76d7a85e5ef014aa446503effea15237102246e40a76bf7fec98a6ba4817262363c07609ac94492374fbc34cbc14071c560b492bb2a134f0d577e7280de4ebe48961977cf0e585527605e426a5fe0060b4b7f690c0f5bd12ccddcc460663ac158e7bdaa87e2c0ef5d5c88021d7b0721055dc7502cd4befb0ae24430881e82385e8451a1ed0bb36ef0a78ded1b1530dbbae9271cf870ad236ae25c005c4aa7e256d42eb0d908ce243c77b409093e48ee833b9c0ebee55340a773b67815f9717b1a913e93425a282a696c0f04fec4e94a83de78c6907228b2bb7ba3d3bec42dac7676a2cca1940050e54bf099e726c3330ea39882b3d8195e723458b1f30ddae5da93ce7e48cdf8d8cf575a3013a3935cc78f6ea67c38bc1fd154026b03e46f4447cced10ccc27f130581ca889f917d0ec5f9a176c2a5371d33418d48f9020852c24f85ef7dc6be730b429f6f1365ae39d5fb9e3079ce789a808a4b3847842acde0d2609ed4ddb8e63aae859e9b71eabee391b1dcf4bd95665b316bbe81ec47535b99d8a608cfe5c2be3692d462bb72b2f3b14e8919624d68e270a8600edec85c28c345e1bc462451da47031286f60b5d90593aec03b2ed8dc0d760866706893c4de838de08bec362ae6821d9fa73ab9dd6fe6a40e84cfc2957877ef4107afa1eb314d2c62253b2b8d29cd1e060d511e6d2b467e09d5881231a04eaef82b557631a4b441da82772345490c1c75503d94b615f25807636ed71639d033c89e778ffe3a67fd2d8ac523783130f33eda0d981b0d56cdc160026bf00b5ffe832abd1b98f8e073bf0273e9c898650b1b0bf936e7038c9a8a74bf92378b6b1dbe2420edd9ee7e9b02154bf83241300b8793a0431f54cbdcb458eec82d2782f828f1d8cc1a341e8898acaadb5c34f0850900a08e17d58934abb1761aad6bba98dda7cf1a8992109caa4a4fd43491a7e4e7dafe63b2ca0f937b499586baccca63bbbeeb73e6188900d3e74c1dfa3f207051e3542aa958100f0a9572d7f0566bc5dbce5df4b57729d3669a6a3b145d8872e80d46d05ba7856bd1441e7e9d001a2547948dd78510979f4d943d66952fd8b41708f0e03aa0eb37d21ef934c74a2aa6b5534f699646edd8b16675cd44d1442ab6c98037884eb1ca8f8015446b8d6d06f31aefb930ca689a199464c05978719b37531e180a28e528c9d18f11ebf477717f558396ad3434061f22fbcef269b776fe4747ea18ba1e1f70c3b1c70c478a07d76097835e4487e7adaf1b34b623c03219d27c15ddffdeeace89e501c2368965979be3f618903798d119577d83ced1d7d182482645bd1c28c91e05c9c37562fabf58934619dbe29c2a083394249e258747803b8a69e7817d766dfa5e83cc285c647a119264823c55b11a4b4ed5c3155f526b567fb1cef6a3a85883df34b7ffb9b689a957d4100f977468b7b84cff3fbf152f68126c6853f761029eeb9dad419ac72d97ed09a4650e0c6b0ff282650cecb9e09d238a7ecbc589160b5c49534d4a6d492ccf863afc491af0305634bb0a62af6368821e9e40abbecb1a568460ebe925c2f5ab782a98285f1754a6f574b920f926565b578838e8b57c83c31db3e416fbfa8aa6559b74ffee4b42241841015952a2e1576080b76ec03020bfc037d972d4d72b807c192009f0264a2a52c816d64543a9b781c902a6aed6770b520224ad8ea68577a3f59406dd9b1b5aad4351901f8ed219c4c8444a0ba17ca39c32687c52c1f08e33377f10b8f90bda800b3c0e2193adff2389cb991c2276a956c511cde4a76ac757a57236141df86832fd0fe2cecd0ac47ec8e5bf16e814de88848a627fdca3682dcd7f13951f67fed78036c1794b7535d40bfb2ebe888253e6bdd5dd107ba5119af21007047f3cbcd6f9f3a111e12aa31934d832eb920831366fe1076b64f7d6ec01c9e8b19c2e60647e488146332cabd89ed7ee89f48e552b180881feb7cddf4de3a0808e31d9d46b5c5785866e25dee2850e040d6bb46afb7df4a396523e5bfa073ace3fc4da8bb2fa9fbf9c34b4e8a9ca4820a0d82b1ae1aaee066be8590e1b2cf989e77a47bfb25b583c69f0950e99c5ee9ed655f45e5903c21ef4b83a49d94c1a0ff39104ec81dac4b1647e57ea87d71b5db722d4714942fc16f6cc4c835f2aeedc6d9611e0d3028d432bc5934e5b30c1ca1ba59063472f5011d714cf332a13ae428f1b86b6c74f30d555492ebbff648b6f97741a0ae49947d9fde93264ef3b8b00a5c1e533bc68f8abfac08f43b474a73d74290683cc1ab61b456c526bd19a7027ebb7cb78114fca864a605a5b8a251706f3095bdf936f84684f652e22918528b99b5775fc9a9d1c585aae48ee3aabefe2b0039d1ad3469108aec66298dfe72fd05a859f0a01c5acae705f22d2495cef477e91ac15455b42c4c86478d0791efe5b604c2d39feab9806abd8b0893e663c8acd0f9762c7a80cb78a70467b9672f63da4e556f10375b58f003b382b27d2270b62fee2fd85e0932ce69997802c32394c9c41e7b7866d39286e27c4b2f239d773a10f680cb7f08a1cd62c4ae5aa64ed2ac9ecd592482237c366cbee6ff35f1cbbcf11752875db43552b39adc4a0752d920f8c0e649a6645681fb02c4bad830eb694a50c15c56e56d582e48489a5a80c78915d314dda43ee2d89870cf1e966df9e7a7ce9f277e2938fe8845578f2315687fa3444b06ed7d9152e9ecb066364011131d248a6486ac8a4d44fce7c74ecf12e276c4a0e238c5b3a197b55a6bec4129570a86c4e03c3baa611c765f2f290de122ea0ceb1069333038d173d4f6afc3c94b2b41a3d1e58a307d801fbab6641a15837b7d646503ba8b5b632f8988f62e1dc699935c9bcb2d93ebbe34ff9f941535bb30f65dbd029a364e9aa2a341e075d874586acbbcd2a2cb84a29a4b2d728608c08ac86914e98742fc7ad92a7efab9f164a6f90bc8bb8d382f428551204f21c33e37bbc7a0f5fc2a04d4a42204ad3336b3250662b0c16f6b4b2994fbca4e4311e03d0c21b6225ad4e05966967f461132909ad42dc56e9c6ba8b10358a4a2fd90dfd17e1fb466022e37714da48387cd6e84ef8d18a4250c1519d4f3e5353f4d8b224d6c75067a58bc624eaaa286ff9a44a6c0b8d577c1763a8ccc532d5e59a2fc235fd7c4ff909393c11424a961255d6f902259711289d685120a0b40be34ae05884c60782ba57a13ce8af32b7390f27194c3f27b299d5897b088e4acd0e3e305d43f1ac5a0ce0bfbbcc1992bb2f1fc2c61f9b0fd04a1409e0eda1d0d74a1912bc31610dd96902771859729ca33ed32236cd1204bbe1c171e41abb7129cb8d531f1c4e88595e7452df0dc50377e8a647e8ae060db78a016460648d156fd46ff2909b943dff63408394f9b2943734d97c5ec293608780dcffb51b15cac37df246714e67c9f2da3f45cf194a28e48d5d363b740eaa9162149296596f6045badb3179547a9a3e65f301f5271be3b76c04fc8a361c513096e13e168b0e1d1a74a687e5e8f4ae64837338d5cfb9d1b9c9b9737e0eb31f80e7db8cbe410ed11d67971c8a4756e77672140bc2373484be8dcb7571da10ae81fe66369b6ba160fb82c5b8d21a730e7323a9e1d1ca5d25cdc884168742a78405fc14ad69d695e9c4193d75ebf1c3136f2add2b12c3e4efb1731a00e080b8794f648447790046ad296f2032f374f28bfd211eefc34e5c0154edcc9cf6a0ea834eb42df8fc1315c4a47ce9dc517a75750806551056c4100b4ab55731a150106bec472e8e1284065eb090474a20d291de6b4cfc584fb7802a22ea09198a9b970b167b3e659829fbb86e2f4e47342a7a9c7e87f0e3b1d7f88d3582041f3b842c2a667feb7ff189801af05d3f5463c15d900ff98ac5f5f331a9059e98688ac2595d75c1e841d7488c6f96a9e8a1593dd9faa04556ae2674fbe4833b20cf25d12021e87af5fa0b14a4d8e988dafa5f2339bf7ca439b2b56012b3071a49d4154860ad50efe7bc6c12865abd2726165298b55e5d70a50f3d2c7bde1efaabd7b6845a727d2173af97c9d58ca04e831d16c4992d2496c2db1411ca2fef8e1886e92a146539c7c32e4eb3b1dbc26f870c9e91ae0404e49191271d4d71e7cab1856d3592e70bc11b1c140451213f3a3cdc29f1e221b02be68a641fc2fdef1ea27833c95657d906605ff1c9acea6327df8b67dda81008ac32e4dc9374dd504464cfa0e1a00053e728246512cb0bf28e03f6d4a046ee87a58019c0d3441819bf254a4c6678078313011dd3e9699184dbb59bcf2f36ee55b945262949bcfd67e6205e1b9bd373a4907029fc307bfd245b6d5df287e8a726e6ef07fd95b1f237cd09d989d906003544f48f8a71e9705a1f00ccb395df67f4f33c4cf966f8024b32a12f026635dd38e24bf4b10ccc5613e5018b42394a3651d2b12892a3b4268ac4a2941f295e13c5d25713dd410d8898d02bd3fca84cd8020655eb7cf888e724d9ebcb0edbb8a40bdb1288b7f0f2ff5d108c4b7289c8964cb799a11fd4e95c32f608d321f5fd78264b80a1a94db38280c57e42d8490e7cc1b1d80811dc3bbc9fe22eba1f2b9b182be5477001dc657ec0f9fb0da86c959fcd4c1f8aa05a11b584bb94920f802da1084f4260d3904620fe0480d0c8a05e194685e633a6e15a0b21bebc1fc95ca0b940409b61077fc4e68ffbb5c2c61334da673e82d88f43b9648726934327d97c7b06bd6347729ebc3dcc23cfe4fa9622bd1244a41e226a1511c11b91010575e2fa0a07718918e26157e1bd1716f526b405625d0eb56b4290f361110a2c888cd662141306f9db01559a8226d5b7692a2e86169f2969c0292100bd65c2f09a3985e89dd55f5bf34752f08ac93f3cfe612ca519e7e6a108b140010f0841182a343d6f2dc99e58a5ba8374ea49e34aeba1a6c76028dd1024cad11df7803e94d46d2151023c47391e4054bc24772cd0df7270788a5017155eab68cd28309aa05a211a825e2d4d9872b890ed34956654219977838e53cf36ebb61ccabc44cd0405dd4737b8191059b550c064e35a2c6480499038d9ea2fc0f51c8b28fe6bdd039cb458be7a0e8bc4e472337c539ecaa4018a8e26ad01e34a25243c3732d4ee48257aeff53fe35f4253faa699f36847421499083f908a9cacc47853389b0ed09d8dd09c67e000f65bfaf80b7a0d44d8653b87a785ce3effa000c712243b2cf06b11be9f61a1b1c14d04bb566297069c72196a7183aff7f448b0cb7d11ecb7c838855842ace61d99996723f4eae14b08c8fdb7cf315a660d286a33e78c29ad8e60af08a84158048d797e411f67d927c977e15ac9c484d8a9cd476ff263e277e40bdca79a0f60a2469e101af43964170cf00bc0ece98386a3ad3ec1d234061d5510f75772ba3d49165058c84fed92c1630f0077ebabe722c9736c290e7095c42c76601fac3a619d4f245fad8f5cc4993ad376bb7348f5a7b258cd45e6319188e4f7542837b11b2409b1c277edc476cb1d577682ff73f751397a1d4389be1e3821c0868d9b9b395afefa8c1397a020e4715e38f80c7f6b7b57182fed4773fdf7acb64ea78de7c7e968afd7a5598081160eca79c6a34bfdfc69dcc6a94cc5fd097b1dfe81002733dd3e065ee59a23631e91d5f1bb0fa1f1cca61f6696648c202f82005903db0d8ac0708b12a3c0b395245288618b648ed8ee4d172d50b18c7b57ff44d9b71278d67c40f36232439d4d2133ae03c9e220ff32742a61a175e8e4b6be72edadd432048d118a39331e25bf3b32f70d98311a0b80856a58e01b26e8127e3c2afd04b92c7b19e571d7273a8d081e4c1fa190164201380c70de4e282240b93c1dd13a8773371c499977ca733fc2598d0ba12b37202aec8833a8fa529326eb776c1ea187ff5679bfae155a12ad692872f88cf9ddad49311755fc69b28c9427170da32632e0ecdb16e16684d902e09ed2be0bf1b38a3acd7824a9688fd9c20e4c3e083f8b8f66ee67ad48e53b20a0e1ce1a08d60da398d71c76ce1fe057a246ef60e42ae3e2fdf6640ea1a769c75ccf11e5eec0883121c6688f2482655a94091aba059a8e7fe5dc9d66db4508b0164ddce39ee9bcc0765e216f057a5e22b8653b28fcc71a141c4715bf4b62a8c78803e33670a633796e8576bd4361ed1a4b5e4b6a7d275e5780ea126267955e63dd2b17448ae716190c568256ab982bf878a425e1d80005b871b036cdb65d40f2bfd3e51d0304a04b3d7f0a64f78af8a21ace6ce7093a6fe91a8ab139178a7b0219699f9ae5278bb08959b446ca6699fbb0aaa618476247db5b0f27da6fc588a3854f4b6ef3b0aa6559a17356a4211d265292be007f7bc415e8af3579247480f450398ef97c583f75b6767a3c8030023d2de42dbeb4d5d8db9659b1f4df1f83a70a4709db69318dcbde2865b12638649e082d0fb0c617181dece8d07a75e7a022850758067b93bb3d8fe3b92530168e22eef0d435055d8479af4da65dcacd10603deef93363e41942369f0f6333a3db3f18ff777487eaf59ef48356eb2048bfdf53944540cfa2b9250cd820cd1d3bda5ffc582c5ca458b8ab1442ee79b7a7bd6361a64f84062703331c2de2abbdb4d7323496b02b0eb12c99db80695af102fca925c90c39ceb6d7b989ba16da9b857619e607504e5e5ec178fbadeb8ab942c1f03a6f07e007c7783dbcd0b75d079bfa755376b43b69471b3b136644b3a05eb790f5a82a2034f6f5dcfd9875f5fab30ea0eb2d195900987afd0d9c1ddb2edd4bb6c5918c674eb542255b978282f102e5f51738f5bb4fba2a8051fa7f58dccb9d851f2db767101ed77acf1029c36c08d1732b412d10debaca16e7bf01b43a0b1cc4c343c5e519a9eb3df58cf1acb550648a40c0b7a130d5644c2f9579365b91d9b0ebebc7111f309d5fac64f949e0ce54c763de6bee1651248fa99f9c1b80615cff730270019c431d3b4764746298d4ef35e0da843062b3e436b0d6c3ac56cebcf5bf8f38fc0400f92fb24affd37b261cbfb7213a0654ec7b88daa45752c6047c5bb117f677278607a90fbf9845d85465b2f8afab94d871c7f81990b9420af3bb7dd41df215a2ac60637edb18c184b832c38e7cd82c4d979524c7df91c58bcdbbc2c88a86028a771af29117a07d584495017d59a1cffc1538149a26c010238394ca6376e2a0f513c1719cf387d70e8605abd5dcc6def3f421a632fd6dc944a699d04d073676a0d030ba1c62ad9c3376f70d7596735a895543e7aa17aa5a6b9e7fc4e153f2dedff5b80109fd1de9bd77f3cb4c0ff992e121ed80d0357d3b7889a35c3ed492c05de3810e1049a1c05d7740c7884529f045d4e11c209242015db3fdd672301878c4ed136c019008e40f1744ef3bbd5a6fe6f94c75907c399268940570dd0339441c6503bbae030e246ecb0aec9a87728c184a0309b10e5a569f2d977ce092404b489d86a7213415f656ae23a42aac046ed1d289aab88e9f288b8e2186297a0c015b52f1b8f1e3c2d249d3edc62846e240fbc6f22a9d6ae7d2035ecf610e118d12a9d348e6dd6503bbe6e11c455ccbd1470e2242d180e63a3ddf4f8ca507c610afdfd73292e31c0d3b1a8c48ca576ef22e09b8d114fe42e43194eb7dae4d64f2092b220e64e16656e8c9aaf371f10d7af4c186e6b45588445ceabbd37cd8d4fdfba977af1ca6e21457d8bc091f1f0f2eb19e6a2d68a203580dacd3c7dd23b4c9bf854eb5666e81fc521685c53f23aa3b6d556f239e1d92837eae1aa32736d6690e1845e890ffe45db31fec4e2042dd746fa051d44040884cf467de2ffb57c0e553e4c01b85c5a380f8685246f27ae7926801f687d437cdbdd4931fba88f99a47d22cd6622a95c1f528e0c03ab71e9f7983d81270de32c274ab32421b9378369cc7477a999beb906aa1b1d16b4e782b75b2daf5cc0a84c6d9ab273cb0ba27286b5c92c6de8bccb85905ac1171c0dbf1829d3020161a3b177a5e06d10601fbec2ae4bce51d696e1a5ab74e89c33177ba04f0e0138c32706dcaa59a57a566496f3e8e35bdb5a5a76637df039d3604b21599aefa523b117c012ff267c8995feb3181a161e730efe741652ef6f65efb02069d67e974822185d9647a5c846dfe067a53292819bf0f540e79287f0cdaa31e508d2107c3d23f13471dea65b7ceb3f8f7f825c3bb1f1030256eedf5907abf8078bca086ee5dd854f812a695e02e90a5485006ac2872a9d1622ae2beafddde60293cd12913431a01a970551cf5433252e1aadf74dfde3adadbab9f9eb6ee2626e5c5362673b12627cb7e28b4b13ea1f9b77d7c892b7be5b858af13e00f541a7676871b7d7bf81be100998cab4cc1ad9cb5e4c62089028e23bf400e55430998cafe608b34923aa11e8832fea04edd69ef54deaddd095f065c4fb33e6c7d776217eff4b7364fab12309c037d4e05f71e82dd847722caeaad7f8a15be8cf6c4cb58761fe19d845dfd3b71f648a8133878cb8a7d7e7d68d6de109495d14027020598c5a0d83a3a48749744a3cd810857b93fd53c89a436162b75141a167bf66c116b4d948dd83e86dbcaa95d58a7b586855128ccac94db05468c86e6a9b85b729c79bf3c8cc8158752ee5ac3e6a519de91ddf33c130e98270948f9edaada2ed14232bf76ada48e8a2f7f9446efb34406e88ac73c777e05ae9b24c5b515c67a89cda2a6ccd95c05017aa0bea56ae7027431c259f6458acfd437288abe0ee306aa2c3a732ae50fcd9cad2149c07005d8030491515409bca5a878ed4f89f3e7664d531c499d4684efa68ead45eff65c9bfe9a825c46d0afcb2db26957bde64b5261b4ac31b8a1478b366befcfff942f8bb2d8d7d4bb8887d222e8ef97dab9e2b952fdca0b5d056be75107a0565e5a049a90299d7c7cd9a2d213b80c4bd9032249ac009e3c8fda2c84594d89aa9550fbee505318204ce07ff1e5191c3cbdf9e928f2d79076a913f29cdb65c9684bcd4a7a6a2fe77844818a645214fa2ca01278069493cdb2be9d6c806b0579515e2d7133d93b70046dd5419f4e1034bec38880fb2688572bc45b3b8d4e2c4d97db465b96787df85720fb5419e5cd27de283edcc0f38137a8a88d69973c777cf05d8d03a0e21b5647c427138addc885c9f0a25a294fd6ae4729f648057c7b4578482bd0e4e4a32f191d7725315b7cccf219bdaea79d9b34969ebe5560d541099d6d0aaec658bb22b11d5266876d026b93b5970d42cc24431f02f47d80da1544b4e639d092cbd38a976b88b81fb5e18a72e874305c8131bb8f6a6c289425fafb5f8c3e4000dda0ad0993d57a5d4c1696440becdeb6560a33cc3f39ad68dd3325eeee258b0b6736280adadfdf8a579264a1fe4896974bd7f72d0de52d62cc783efaa8faff36524d7dfa3cb2729681c86631d7e46b5fee049b0be04bfef9782147956f52d084a81e3618fc463855e5901be6d9c36a653d237a93c5da4ff2df8c90090f84bab1b9422158e4d84af3a2e8b2c5b4cb0f4790e706d7a752e2e00db84961870bafe8e4550a4ecb88291ef6d8d9dca6854f8a7045542bcad3cdc28ea10c5746da3859c3cf05e2efc23cbb1a319a57eaef80b687724f69dd6b0632d6411b15b66bf51fc46692d842b9f02b7f069d95fae66e9d59c3deaab93690ce83dfb38584fc93f4ad982329b9605a49e8b3e753669ea86a2d2de49ce3c21d827b932b91cc9db759d7f0f452f35786035f314bca0eb5f87ad551644eac5b0e3ed4b080913d6a343838274a3fb58b8770bb358fd63f1af9751839e6abc61e0e0c20052fde2a73fa04663f876012849e31420b73e2da1053ecd0894e7ad966ec911a9f3e49d990b3e3105e84af9089d8ee8fa3e35352c4655ab4d32302707304cdb4b786f996eeb944081235be49376f6840934532ae1b3eb525d728055481fe397553fdd4c1ae551c61a7f2dac36bcd832df6a4409ccd1542ede1e6935d2248ae1159306b20b0465339cf4f61dabba66a3974d2b56a26ca836716177551663245202605a87afd1c2b267e1e44ecb74dc781e13d8bcd9b2d6de1fc308b08be396859ae5a368b046712f3168b4d0f89fc36cbc9be961a30bb3480d732c15e4008816267f5717c01220fa213fa873b719ac66c68d6ee4f9185569287f06f826601c8d0d8b85183e09620148f8e21232a4313c9a701eb5c69cf9a849dfdacf6bc5a4df8bae5d3ea58f31fa30bd289a47d7cb61bf1b7715de588f2495c040d96b89d0ffc2699a0e211fc5147f0f2f99e06a3c8fe39b5c851df3c1184d961d1c1dc21ef97314214364b46ca54f64738f5abd29bd823178b680dc6ca0cce3029192592fbcdd74869ce413d0ddd1a4408e8d5f9ce50220912131d34654916df3e4a8ddafe6ebd69f7bc3a5adc85c01629189c92b394b35890083a9dd14ce7ae857bcdcc07b8fd837cd6b9d832fa0a777e0316a2896fe803a2fae367505ced0a93d0825e02b3a0d5b16718365b652869f555144b186ddaf84ed4f2398de40720792b5c2c0e975546ea08e0c4d51561e35a275955f2e44c153ca5f37057379352d252c47ab64bacfad070c5a60dc20f2c3d616d944a900cf55dd3239bba2b074d4b779d655574e66368136248cea26d1f3ad5d0c862c45fd1a12e7a30afaca7f22fe97f354d98f2bfd751cf8dab837fde544123fc62dc73ddd5f8f58fbe67fda5394a4d09c635e611c578dc20eed734805631ad8d195fe7e3b9f654cd45dc0a0f0a4cfe5331a9a984e53ce8cdc14d2eb014e52b6f6ef436d1407bee904e0930d022344cec22291b0c75e727a2ecaa5fd28c78c382ae7dfe6d76f6f24be2c787f8b0c297f00ec3f1a39274562b8c54531df93144acdb9a35e91dab9dfbd65d160ec8b24ddd693c0b8a8abb2b4d462e5bed14d6730282d5b3b30f27fb2f645cb135f7e8de5dba52ffb2442a1a3723c82f7af087a227187b6203b3bf204d6c585602a736d99c6e0d9a12dee9b5b810f36e4a044a35036f6a37a32dd99df16858a6c61c3538bceff7061ea3b1b715527632c94ad0ba392c00d440981f5f03e2282a3a48f400d4f73eedf49682c6c2119d1a183fa4b1ff523d08439706bd28cffce9202c8d7bd0c645905b696af3d866d470e2de0e9ae36cb9d482fe0097bf0fff67aa2860b26bc6862ac45623e097c08db8436685eb9d9cf60bde51f5dfaf694912a17ccf8b5d5626a165d060e969fa293283fa3833651ea06e9da9001d092905c6d17daec3fa5e9f9b3c11b49ebb89450c4bc591490476158c76ce4767f7441258d818777c05c6d86b461de777fb67408cbd28e5ee92b44cf6e35e343f2590510fa25a5a7c28aa72ea44694849f14526a0a5aaaca2b3cebb5ee67944967a512191b5e5362406ae706b45f6e2252246b98f200bc007c29d340acc1910945471450345729c941b77260d34dbb63938e8a20d86355b44f69d729c2d913e1f03ee1b7372c45e47c98a3547d851cfe313008fd10e3dd782690004117dc81c073a17e5d9a29b69aea2e88a9761a55565a5a624a71c7d2548ad3c9271a28556bee631c74bc21023d220bd72234d41739a0375978069df612d66d85105e9b8c248c1ac18add7b58a16f9c5b8920b6854823349a5db0d3eaaee169a6e2559557e649387583b2541f22db2a7cb089bd991c63493cc90bac4a849d76b5ee6fe5508cc50ee018f288456ecdfadbaf0f14803ddbbec400cdc6d827b82317653d506ac8558d54572ee2b128fd14d8fe43f7ff7fa8b5ee252088f8ae0a9c6cb6917681ef7a0598876fe2a28342b9b8c098c1e6ece29bacde31da176a8c99d807ef1dccb908a761af0ee0462f743702780b0558042027a66ca6c657fe80de9e509d4a57a7f27f236bb34a92f0cae46c7991c6332c8220502ea4b0964a7b78c9ba11700de1e64dfb5fc3e3d61d4442bc1543f5d2be7c72f62d04b0d8a96013e34e328cc6399c7e1034bbd504f27e04bbba1248b21fd538859f4872745f79181ad4130738103d520859a7ac38dc939be52594c5fd7bdc5393099a2b9bcc6b47d0216ddf725d3bf53bc6e67edc090c3b8155ca2f15ede8ba7372c5849f6e0d1389e61eb4a26ae6551488aef9f5bbb98ea50576f4eeba28f03e676c015a9062629ca389675d641391d70075f213699e80dfc8c297f8a6695e2d96df8758c785099c3e80c7ed05bd3e472b12566295c67ac3cf3bece93a4c3cc04f4fed55f5f36053c3f1194b8b6dfc43613bf26c971350aadce185d2deb0eb385b84f116956bd5c2fcc5bb9bc967543afd7c691974ec94c0cecd10d5bd46fe7fb5791c57dd3d006d7c4088025df82eb5b3c127bf11c956302b7be89208fceae7922ec7fde528231289d49576797f53b9d28a76cd251f46b046bbd973672d80716525c66c32e0746cbacf3841570228878780d18077e083066ca69ac0e6930820ee752f13a04282401851ba8401bbeeffca78d51f72342fdf4624330bf0cfedc83224ac30dd49e7c321561d9ab4c53ef2a7a865e7e4d77338825d405ff8f499450b5894430e2e88abbf15060e6f4567704db1010e7dd789aed46c14b92507efed873bff39ee142ac853cbc3dfc58c2fa91c33f73a3e1a92628703a03850fab36683bdba9c143a4918127cfeed122ddb5cbbaecd69faec8ab8ca93a657c099b8fa560ab16d6db85e61a266ab86dded47f6a3a921f458e70243f8c0fe13327069956e9163248496e1d6a633af210d5d4745358069942409350c466aecf138809741cac78c1e759de049df5394c09b73ce258091541e75999ed7e1754564fccbd3207fb8630f951077f880e9135b3c5832f09551b4c7222149d85305e4efe8d21572f067a82218582af1e8913f2346109cc5b4acbcc55ad39925c462ec001ed1d4ae87420c597cd9e1b55689f86f8a3ea538dde66d01bd8e863cd110e0c0361a8a65243fe03b55b2a14c30e1dc14c883a7a2c43e25fd9255beb4879bc8c13bedf2161197422dd892494203c0064b033fcd3cacdb8c2bd0641037d8416fa22684ae8297323fa0946a96a667c0ad8ac778c1b53e4ead7ee8d2a3a469f42c28b13b223132777d13ef404bb0b5e93507ad226352fccf099246301c0e006ab8bc0b3006fa345adecceea273274555f95448afe627c625fffc0fbe5532fc389d7e681d889016640f538067d9c21cf1edd90a43d622283b3dc3a1632cb49d45017f77d7eff3f5ab8bdcf332f802472a7389036394ea4b8679d9101fa37ca4c2f549d95f0c189ab36f923f3493328a8d68bd91d3786e9ff46da6749fe14761ab364a0a6ad721d76fe98b9019404726dbda8e49e4e98edebcd9a04b50c13523c09480e0acf9cc1752e3d53cfc391d55effc09635b514b85ae7bcbd87ed6cd466785e2cecd409814c5bead400ff2a8912f01ab4345d1c5143e94bb05f18d6af669137b2090a8265f976d414e9757ce0505d34416585ca730778f8926ed398059a70d494b4a51f5082b59f6c123e6f35d801245eb362d46dc7e01241848d4ecbae3fcd815393d82c8cc7f6daa8b14e8a8d389e5efbdde28460a9e2f3839dd552acb9d1e57999a01d16ba4722f9e6ba22b431f58b8be1b8363b2e73a3ac59343cd45412cc6c3a5f58d3a1ad9e2bf8211d644e3ba3707b90b5a098f26b95266a174ee28dc953e220a2b770667ee8352706b517b7631b7fadbef2d645a912fd938b812cc79d39e4d16c32280fdd18213da29ac68ad45dfed573996b4051d8954130d8045277b8904eca4dbd13a971fed51d99eb919337fcf8dd30061f6d10c76ee35d52f2b9fe724ced64e234fbac25d221f11b2e07ef6321be285ccaa12553dd86329c505c58fcc4897b0939b8d8f680bef62029b74b4b8c47de430c7ea54d4cdf3e1101c111414096c4adcb164baf82799f3dff7a788ff621bd573df860535c285ddcda60ca4d4753d0e0d9a684322c2c5bab4d475d03d4ff7bcbb065d23ee4701c0547f3782ffa201b0804590a6403155be871f9f21415f8b4ae019726c11ae5b7f21d24e02ade216858e90e89aac487a41aac4c5d77c864a217b00d8d2b4981012d67092c10f83730fc72fc80fbb7092f324912ca77ac4219469b3bd6897fa0609fb582c888d1882a6ffab5d852bad1bd8b140c2ac78112e93a4809a2623620410726cbaf4ecd3ada59f2b0796e497ec2a9939530ba6a1475471179e2833481271d38f30b59082a2d3fc944187a472b96cb2e27b91f2822a3b266c21b480bedabdaad7abf82761ee7a0283004649090390818c6b74253c92689067729e7b7fb5204c1ccfc61ff25daf37ef7447d8e43307ef730489d5c47faa516306855925ff5047c3cd2d8d120c811194a51618e83406bea8911ccbb099f0a50d22275b84d84f5424fbd998c32908a9d571eb0b1e841c1da67cb2eadb57831dbb8af4c32caaf6d8dddfd2b164c72767813d5b4eff1f842a8d8b626c5f9daaf3e1bbb11d0537adb89fd0c711e3a55345b4d33f44b68bbdf2a5579f53439daefdf4de59e2df739b530090cfb7906b7a693a24cd519ac3cea7fc67988d44eb69f45dc70ca337ad5c1cf21ba7b2e9a37d974896c53a01e53f05a8da87047f056153acb01ff570ebfb304684ac2a0275358b7f4d63cf07fd1fd0dcc596965b25c9fe191c3348ac114a10d98325310ca6cdbc2c56801e867eb97fc1a52a316bef89982b4bdfc7f25afd2a929b4bc3ecaaaae517fa3259518003c690a59c76208d25d1cd82d602f69e94bdaf0788bc1af65b899547a825a73d22af93d5155959f5d8de4820bc1621951a9de8b66626333ceaae83f2304a45c1af534951bb4eb35923010ce2676a15f12145a2072583e2b10eb20360eccb9f8f6935b7c58b27d269a4cae724013031abb9c7127960a7faab6fc469c56143e6759b00fe00a9b0f0159badf5c7cc13bb1cd28368aa3cb5cd96237c8719b8e9a2ed1ca6e8dbd852e732622b01e277ec0aee038a4c870a24f880ca71af767027cd22f1dc927a2caebcbf5d9162aa246c7b18f9470af8ee0442b5741c3bb84124d9185aa10b7ab4bfdee01373fb4fbbb13fd8472b721d64ac069ac0d551a005e59dca20b0d78ab8fe4c2f427566fac27052f4fcf8b58c21b78428e0012ad019a2679cff0ae41c91b8066a2ec680c2e550265d4afc8b2e1d28cc7a165f147038e64583cdbe2ac7a3f51790cc0e10b4f5b9bccbe1f7e34d0edcc60d36bd62dff06cc9ee2041e4d5e28d01b328bb7af50e66f25c2e10e9f1e097f4989903f2eddc479048f04d190cd762afa540fa62f885a7f130195ce114b8e3a2c92947de8761a8b7e7206b0a238477eadc2b94caf6b6ee7e52a72f35a786b11772f407bbaa82fb41e5b85676d2f7e31766e1b783eb580c408fb06cedcc5861032e3f587d30d34f066dd76db3576f104894ae8d752587bafe458518426fe03249992028edcadb945d2f2661df866ee7f9aeb79b26c968b497a636fe01409d65dd6989818baa7b9f10e65142448ff04d7a8964ef881a5d6c334a31fb122b92098c3ae636e6d75b539c94f385190ea68898c962b1e89ddd033cb61f261fe84ca3f259276ad3aba38d8836aafd8a541c33a5ef2f1c309a41ed5aa01a6de8ccd0867fd78683d2b6a4a1953bdf84cdb99a951929f28fbc170958b3a70781d872f7849c58f336cd56e0b576b1acac0a3f984704daac08054192fdb4e1df367d228ee2b8392b5cb065f1121425f17695bad16352f6cb88f28581cd0eaa8d76b99046f63ef2da9a00ef8a73fb9c4b0f5d9119d8355265e6f050518294b23ab9f65df3baf627edd440071646fc3b04f2f767fb2e9c5524c5a50089d2acefbb70a0d22dbbd7cc3899b9b569eda950aabcd9726eb4c2d90442e69acb876d5a4805f17d2e96bd8fb4490a77c64ec350e81d4aebc794c83ea7f66c74ad6c6f17faf73c01e8a2d722319c292be637fbd3e4f1764a42928df5bb23a4da882015d995265719fd7bcd453bc5322c8bb102e1464c47bd531ad0e0524def4b83ed8eebe71a9d2d385d3110b5456bf8372a9aeb8e5ace575b46c8be3574db3dd7a647448685a89855ad5e6171e005bdd3efe5c983f6e367e23c55a899e4165107de9c30fd35b73d1700c7e182b911f75b858651f013b8570696423174380215213259908315ad497f13d9b165f9a4c4f341707caad3caa4c49c921c59b8219df41f666dc0d3e752dd34112498f070a86ce04314af4f3b1352b5281500ba77bc30ebf9c7fa45bb701695b8f9f2e0b13cb6169f6ec6758df6961a7a53dba655e1a53fc3168025a8f6e401fa60505762968f2b0e01ceb03348ee91b0247d8f33a2cda46751a6c3cd3dcd2115a3464feeff63b8c9bfbaa1e2bc13c5662c95c23d73542f87601d9ac46f6f39db6a9155395e6dff7bb1837f31821f46e990d73ad5b54a5a9766b2cd6abd19600b04815d950beee2593d590fdbed32ab5d25425fc3b7e0703376da41452dab1058e34f7635cfda382c2aa461e26ef7dc07db763c932be26dfe288d6a4aa83d665f0ef7ede851f9884f5431cee20a419ecab12ab91084e48c20507285101953a5c3719f4d6866420741d84d87901565ac779023e3e5391df88b6afccfe7bcebbe086b9adeb6b6ba363e8aadb633c374c9e3e35501935084e4ebe5012022e4b40eda83006f4753b992ce6f2f78da6682b0a28e5bfe7bc8b63407704dc0d84ca69a021bb1a041e830810c3a73a92354feb9bc430a899014cbc915610721f1d9b92594c4fd58274a0a1e970d2540b896ef8aa71e310e26b661bbbe7597288874d4ad9491e2f04f17a923f2a933099ab2d39985c2921541f977a336552e43cfab39242abd72af8f4890e90ef4080dc59099c7882fdf9c1c907fbef6ba854d616a20c5eb807410a5760f121cf4f86308fd15b9cda74c8f0a6757b8f75e3fa18dc944bb0371eebd5cca1a8d093917a89df544a7cf0424c40af83e23758c328f2a172a38cd40bf2579aea7aa890da49c3feaff55882173ea6db9180b73559bca8f748904a2b27a19e8ec24e87de92941581a3c5b08f57350e33fe350aa78dd4d76a5facb8e1c2b11f21f1ad409295720da9b6b00269482b71aac99f032c086491ac75b8868c9101446f3996e109985becb5065b626644f7345c681426d817a55388bf900619055ac1d6621f066889f3e0fac51b6d3f27b28f4e0b634fed1ac7881fd3a24f0ba570d549cdb75b3118fc35fb93c6157b11e6b0918269f7e2da582731be3488992f8dcf2501d1ef7cf4d363c7df8976bdd0daaf82561e524420645bc096a41d72cf9066c712b0c05fd2d6042b35a0d919a34270357382773d4d568c2b3e25389c7b58829818b56d0483d0033add26b701e2eca20d60cbff7126516c0ed43e4647ef0ef665c87af847b934dcb2390684e1491a5459060ef369fdcbff3a8843b1de336b0db06963a503d2a519fd805805f8379b5315956b7eb33f412f53cb363d75266bf2e5c9de55e0161a1fdaff7771b13313d8486fb44eb7260a25fb5c724cebfc1536f4628b488fbd0d36bfe821e8c5ef0dadc2c7a6bda3c345a9bee2014f46e0e482c2abab590747949f48fedfe211173c3ac74dd014aec6bebd84e0599fb13b08e1e13602151e08cf7b6da23729193addd042e357afc82979614da381a95a4e85f6bff7b40f9c3ae9c584097ddb40d544a0878543b11261f8cefcd4611b5b4769556944f42da51307dafd239106401461931fe18742ab517988d6fa284cc1af287b572420684d89c3095c65ffc1fe03a122671d1ea7447a73d1e174d02bcfa4d930bd2219ad80a56994cc8af38f9ff88603029c4095da2ec431f8501f9ef8fbcb32381de0679053af802cf559dacb622af6827cce67779c48e5e455fa78458103e83db66b7ca74e157203a840fd5de11ee47d57bc0623ac41bd4852104d9d9f971459382e2b06d4fcd8ba41de736b73bd812ffa5483dc6ec6932473be6a6dc0d27fd94d17cc8c021c4b46849b4a24dd1217f4b63e51110b80e160e434e97b788331c4776174cff9739c347cf86d4fabcd037e7630df2c5258d363f7e34046d341adc63b84de0f4e26b7f8f8002c736d65b19d4ddf57f0b82b18edf59294fd2bedf80e5c0c8d4f1d7a786663ceffd920f7e8be93bd3f00d488631c96d05569f5058e37b98dea0aab70043e805fd65e94c748ddf7fb6969a84d068bfab202afc9ea2e0571d9de93af3b9951566a4bf1faa79fd8a6c5d039540d56cbf61f8462b36260562fa13704909a1ed40bf6ba412e6ad37b7e71eca70b52e90060a3c93b9f1262515b6e9660056c3b38b02ddd492df2d669a34aff094bd20a848e92dfe4a1cb440f916ed59457bdd4f1aab599e275242de076b54829a0d6e589c2e8b5ebdd3ee262c81b600b320dcf215fe0157d9ab591fe627c437ae7abc8d8a647e3c7e023cffe2cb4951510501169ee6d9b5661e84e43e2edf8ec42cf22fbeec64613af60cd861b95c72f8dce068eb8d1c8a9a221fb4d18523f64035a17d95dd43a93f6e047c98e512c40bc9913bf6169319b162be59256ee4f9bff8a31c99131c8e19372434d43bdb2a93adddbba3c1d19ef50ab31f8fa85264b39ddbfc8603a385716a31ee6d27959c71cbc6f6ed5a4f507cd69829e592d26809d2f871c51fb069d7e49e380e5ddf5d4a9202b6452f98f1daad94dd054a500aef353b10a71e517267ce9a1fc1b4cd76b9f93477de4b1c91d5549d86870196a3614108a12284befe59a76b8be95728196ab0041e0d946053a16cdb7b1401409cf59d244d829706574748a69e6a3bbecd0e30dd0fe75b468b368f32e01091a4fd09c91879f6ba8ecbdd936a8b275946406febf01e277745f6c9312b82080e8e098d7526c185785c7ff817e654026d4bf340c25d30458674e969f1a6bc1d2c9e8b1fd1ccece71e1af1454317154c5618b6ab13c7bd00412e91ce275e4c9720dccceca7e263c83b760d331bfde9c29af5ab007c247f7805d5861c27f49a8187ae14389c6c68fd873055a371303fa8f57aadb71f7438d007eeda2c564d18e3ea7afde056ba4d9039632822e0ea33234c6c495f8e6356d0c1b57ace02cb252cb599b9010297d97d966b38c2881be93f67d5c2cecdf801cd29932a7653ea2b45f0a77a584a89b0c81b70128631e1b9ad99cc7c1c0fb767ac0c52902ebeebf514002db62cbf4cea7ef422aac5def2e149b987a51ca7d2871e1a10d074f3a452f3620843062527b94fe508ba88e76fbe203accfadaa61c088884b0071a924aa26d2e9f49965170836f02b228b3cd2f57530077749bd9e8e5a7599c11d8638cc2a8dd9cbfe1ac81f0336c5a6baaaf47529017cf74c39e8b333940a205a8d203f639fe4276f54633ca2ef282d40e42dd4d2d7818c0aef526b0737bf886bc87b16bd725f83ce6e3023404a0ced98c788bf2e22bb11ad16af244cd7038272dc1100b96dca0012893fcdbf18a232b312404404ba1fea6ed6a91dbf88b51650c2133a0618f69bc1cd75530fc6e284252fead21cac4353524a3def11a0126942d9db2cf76da0f785d0fc501a9ac598633f8869e18c7f09143e1bb3a5091a62a66122e584c6623abc1a519694c9551ce49fe3025cb40cf2ac8ae66b83a483d71f1fc502807115f7f2070c51486592a2fe246341b58253cb697c3310171cef4db98feac50aa971915d202e55fcb6c59b2417145fd72d0d44bec07a3df3f3c54e339ffd4129e2a7b110dbc9700faabbc5786864ab0794e40bbc184b71ce722b221204ba433dfe923cb2f0c387047a663c309bfa7a5c390c0fc6fd87f07123a1225d1afb203df9db6c33acbdee92c2e28f2c07cf21e8b1d9d48b18984c5405c038a9a92790de1a627d59f132c3cf7614b396756ee93d690ad1396a7856496c928b42d4ea350c554c297254a3d0b6cd48db2f29bcaf76339aa5eaca3f874b25a0d1c9d3f65c98331cc95e6fe1c1228d8dce178d3f0535861163d5df049a586a3636f2815dfcca26e338457a6b89a3306ef37d626545d4bafef143c89e5964bc01b84f100be8c0b745b7f4773d79ef8232d5a2f36b4b596f4c401dfe4a5dfec53b116042019bba2792dbc3d5962420a2d307676e4e34266faa568b0906b495d97e14f8178e8663f4e1d492b00635a9c5f0e2002a24938129768800f17e2c6112e482a845299e669f894862e2c16ddf91f8987a2b659ac2d9c7312a4f324a1061a5c11b72848b063d6a7599de478be9f2bb10753dd983b5e726c10b524f685315af8b20bacbee02075d10398d81ab60b02ae52ef11cb2759ce14b075dd0d22d32120c4a66487533cae9599b96f4c63e07345421770372bcf782e8aa271b8d67f0f9582c77465ceea09cd3724656f483d27056ceb94647a37fa56c1399be81472ec719af40108ca55cc3ca083021d802ce38af87964c1a00108f66f568acb715cb7c3a0827abcab33747b2ac3a1bb4dff1f0109893c03a1a0128e4f4f55be04bf537dbba8ea40291a6bc85bd27feac3e6bd24159a57e3538af88ce8578a6bea5e492f575dae917069c0c7e6be4d891b584e729b65fa41432b3c8374f3ff80d991fe620488650a81a4cf8968d767f4259c6c250c2934a1f9877bbf5a5ef96ef5136f19c8515b5dacaad470fd200814b861645fc2d0f051387c0e283f89ecb773b7d2bb1c3a9c909699c5151dd74811681b1fc1b71e89838ea7bc4c47ca0a05aef871c6ccd62a18f5902043df053ba8a2c1eba645949a5d6fac726c311844a29e8aa16bf32f10bab9f22a514b4ac0073bea48066c0df0c800c656ccb89b6f09ec5f0284a29602a13032d2f32ed10295bb62e0a339a756626bb160ddd94aecda4c35e3332bef594851d337d74761e78682df1eef44735c138ed11f4efd7a842800f3e245b7f3fcdfd3a5be3fa98c3d8c3a48db09648696e66752c12d03afb755bf0271d198b85fec584b3344f90a3834399a03bbbe300527a81a8ed354f2ad5b878440cc65fe533987086a0992ecc43ef072d5e37a621a58f3c5cf22688f21838ebe9df4237ead8e8455c89f68b30666681320711a8fd6e01f46b65c5522b90d2da878f5811d53325f5e2602c8545037f1081d8822cfc285f53ebbea0d5389953a3cf032e0f5762e3f2255378ba91a46e57a3d997e3311131eaef6da6f1cbad89c46643982af4b3edfbb75561172c945c625d8d8d06f24d4ae829aeec581e234a6c79017b380e3ff0c147ee4ad3c57a3f8c123e3c0d5f40301d9784264c6a2051b63b8cf0580c7ead64571009072344601c882d472018d3c15624e90c2a33865bc686d81112416430088ac231106e46f40b74420e746f85b8010ed6f48bcbb02d558c1ca8fdbbc3782c3421131dbf32670c877df5291998f667c9d69c215d49d110f53c58787e9ad313cbf1e24d23e42a4252a349e220205fc3c611d6c60c0b595d130019cb60d8e7f748f3110a1286783454a2d3aff6f3bc4f0ba3d817c7f9f810fe382c02e49af3efd7987c84c2e6d42b42e011eef15018e986fb36ad8d9fd281917ff9993f6f5fc228ec348ff18b9d4c54c5598e8783a95836a3dce7c152554292e62541cad57e1f8394a50936248b6fd8d0e59c1973cf9a8057c13126e29aec06bbcd819d614ce742c984d8230587aa16f22369ab1faff3d52a219dbcd3eac389367d41dbe5d0583f0394ef73337c56d3140cf79c71e7a13d9e069dfae1345c81c22f871ab40cdb5ff2d46908cb5d5f9ca1877c2ad801e3682aa68018ea57a72190ae35da6179d64fbb526c09b859c0d1fb1e9bfaa2b2941c7fb4e60278f05f8a6435e53db4a4a85978038757139624fc876a43713c22a517bb98c47030b78114e9780de2f1c0996319af006721c82180e5023c87ef1131a3dd14437e480ec0e781d6249a48d018af18320733c78ae99b95e4a9dfe02e263afc00bbcbd6ddc5392929dd7479c95d8c76c9d151e19828c1721f006d49d0f1677feae83847b818893143765953bd435cc7d140b606e31307176b263aa87a6ebc21533aab55f91677f9247bc57accd814bb5bfdf6f321399e18d2ab59403407d4a0ebbd50656e6e7ebeeb710312fad348af81c90f4cf52bde3ed8bc6ad10dadd1a355f2b3e806bbe8854ddd68db717370c9eaf06a53167c7765a7f21cb1db8132f802ae67776dbe16078feb52b31280421b50629827dd86070f2fd1684fe9de9820bd63791c4cbc84a445c901a94796834d5a0457cc5099d867537e63827515b4da364f2ce45c0460a726950c46cb35d194777c66d0ca1cee2add0017fe76058c1995af5fbbe6d2c3fc985135ef57d725e0f150320bcd978c927ca6caca601918630293620d9daf797eb15f08c04a0226ad054cde6a664e41425892fc569e5919888937e8c2f4c5b849a60879e734447c194a596b4ccdbaa1d40cd6adf559c22de103299cf63a2ca4d9a112404c4efc6df4347709e398cdd550b1ee49e01ebe2209013e2d7d1e78ddc671bb4f96d46de76dfc55d5b366b0ccd7174848a6ee913d3c7ff62457d33df68c142986538a7d8c552c4d5e160e0888210ce97c71101ded37a90f6da492e75d3a5271bdbbc76a3e5c505f6e9d49228f09219eaba97e894f4aae1904096dd2c65cbaf302db44eb68304187a156c6c544876fd4161677e43a30fce6fb11540f4e4eb2d1cd5228c76c36e49fd7e416c6baf184ba6daedf6e5c0600b17b2138712971127449b87a618db0e086de67e97cd6acc8b3ec4fc55c713e4b82dbfe745228b169b6713deefc045482e44325cf27a026571917b14a141e0c5a9f1df00b66918605843b3a86bbe77db1b4290ddb412f82e23f223d8fa5da6e5baa4b2f97f1e690ac5da04d0ef98a02a9aa2c2dbd7851b7e870a22b19648bd7d46c87e78d5bead3e50a2be71c67d89310632bae41cf0ab540f29d022c1bf20d77d480f2de97655f19d92ca7a3928a8ffe15a6d5a060a795600ce37161446745ef2a6e21389e7335eef1d247c315a07fc729a826a90df9687f60b392232c44f67f9393d80cdb35299e4416f3495f9b0fc248cd8b50f7913d171d892f4ff2217759d0c062dd914f7b800d149802ea2152695b601815a70dd9dafae9fb13007f30fc03a0a81b675d82aab9be09a066636a2053b3e1fa4ee24d0fcdd8d4b82397679edceeeccf7c6ed8f8f16245a830239df15671d8ca345aa428312ac2cc2028cd3a6a9b58a395dd9b48ca4c2903ae067c062a06d961803f3b0d60bcf3702c1f293853bf28e0735f21019fbb0b08f8ec3ebcf8eca71dc70232c2997ac6c5e73e02cbe756420d9fbb092b9f9b888d63b1dfdf3370a666993ef710a5cfbd031a3e77112dfa5bc6b1646070a6e639c0e72e81013e371005f8dc2c50f9dc31b8fff53c263893cb388abbfc9ee09e14dcbb029ee15f8e63a9a4cf0fc7bd23b867847b40c0fdaf07ce4f3e3f957b43b83703f75e80fbdf0a1c10c782722c13009f1f0ff74ae01c189cd302eedf8033c194a3788acf6ec7b92738c704e79280fb5b9c09d6f0e058aeef97e158b037f9ec6c1040430ac9e73f11c226563813dcf913c7029fce38caf78a9b668da3f8cb096c595e096c115881c09655e4e0265963cbf2011b8d0d07375333b62c1db0e5dbb2e5d14c617f1927959b64eb862d4b1bb67c63a8fc1ba0f2970cd8b2bc0bd8f2c5fe305ece8b9ba48c02b62c13b0e58b8097175b5681311e175b962c5bbe35ccf8afccb0dc84b14c5b96a52d5f1a582d78dc84cd388aff01b62c0db0e55b80e6c166b0bf4af360c75e5264b017ec3fc39655f8e778cbfd09b06539802d5f942d8f72b03f692505b0657903b0e5bb62cb23ff932dabb84e5107005b5631bada96ef75c2fe9f922ab62caf0c5bbe316c3ad83f058c34d164cb2a46f7c44683fd479bbc25b67c4bb63c22d9b20a5c45354ec861ada00c0901fce892906cd97bf06b2cd21ad73b533e50cd4c999c506b06314ff38547247aff591da193c3721448cac820481aa99233b708a871b53cd20512254ff26595b1acb0a393f3f96cb97d648d2b9d21420d8daa5f2af682c9004b6128ec64ed6b4c73b8d0dad1a19997ea42c2b5ba6a2e1a8aa5d6b85ed7e9b2c12573a52e540bd339c2d3da91b231a459026b5543c24fa3332ec5e91074a503213345d01d60ff1c5be05c4ad39917d2e6c6e1ac982c498a131a9c8b59f364f71138d319ecffc36d3861bf497180fd230b6ed7d019af7138353734d89d0d7e6e1202f6168ea569c0ef11308d38c2965be097e1d00386ff4ea0e042787d6a041e06688458811030303030303030303030303042082184103d7af4e8d1a3478f1e3d7af4e8218410420811240c3ff0c5b6bb5b46155cd72408a838742cbd8170ebe05477921b85e1d7006068ca294ef0c963015b08098a44dbddffdc49fc6e77a4cba15c0fffe4c10b7482a57cefd5e0bebfc11dbaf8c3cd0f6713c700c0be651e1c8db7f5b5dde801dbf060f64e1188eb1f849d7537ec081b75794185e3e588ac8c865c9cec6e24c94d313a899f5bb88cb3f97c7ed198f45f51d6657ee4305e989cb4daec03ba21510dae2425254c8c4ea0304911830c2a5edb2cfdc7f5c47e86b4acc01f9c26c5dfb218ad596ada5a5157d84b735c5152de0b75ae35d2a6fff85500f6d2200669466c4b46a26cab46e766daa2ad2edd8f4f8db4497bdb722c7e5f8db5d69a786badb52ade5a6b6dc95b6bad45f1d65a6be95b6bad1dbdb5d65a6badb525de5a6bed3f6badb5ff72acb5d65a6bdf5b126fadb5d65a6b45a1b72fa34b38aeb7d65a6badad6f2dc83e4916c3da13294cc81083898912940a1962486172c28425812a3961a2c48a50284e9828b12114355162e9458d4c94580a4295583a3fa8122596ce0c052d9dd0a2482c9db0a21e9df05114093ae19b283aa12834e9843572a7459ac3a1593fd89026c5d9a0eca259fddc1d5daa1f3fdf13b6b3e98daf69291c6bea43993639cb5970c65950e52c1a92f7f79e3639e4e12972da0451281dd40eaa85d32511903641952a88ca4675a3ea9289f777549b208be52996cbb07874e91669136cb58cf4f88e9d2e95acda145128162a0765d3a5f9feeda34d51a5ea1faa06a20a82fd5ba65fda1459ac3eb11ac5ea544f97de9036c5566c1189ad224642efff68da7449bf64ccf581553fae9727d3c57294f8232277480bc774b578e8128ecfdf784770f6fe321cb5825219a5b8249835612847893840ef2a1c37de11fc01c862780df6969becf516ca4db4d542b5502d148e1452482164b98952482185b0e5262ae545b969b65aa816aa8552b969b2582a968aa5c271ce38e38cb1e5a629e5bda8d842b949b65aa816aa8552b949b2582a968a15ff62b949aa1c25fec58a7fb5e24b796f0bc7c7506ec25a8e125fca7b5bf149b467a37213c67214d668742fc61a5d19df41296ccb04c5896d2bb1d91689c42b3ea256099296a875929960952061895800b05725a2973add6a092511d14b9da2707c8dce566bc6ff498225baacc962e1f82ae49baa3ba7caa7ea4d158e2f03169aa83b27ca276aa270fc18aeabd56ab570fc1451b29e0e8bb5c53709e2429cbd46aaa654b9545d52f5c94c8cf4e06844a2a644b9445d12854114d767a7f1477338d31a63ad560b6475022a3471e6e62773e1c87171e8affdfa661ccbc3d86737ab41bf335036837ebf8bbe31d0bda3d18b341d7680824bc1fe6aef098e054642d3711aa7711a1a1afa71cb01b4d9aca5371d0fdba75fadb6830e91c7757129187e3a8ea53ea6356e2df70963ff9ee0581cc67a4763ff8874093e5623775e6794735958af1a05fb6c25c94d313af911cfcd4e27f3204d7a9942e33436b8d7bf2e82333dfad8ff89139b890e88e9df0061daa44c3f94d5989bd5f170dd72ffcd5aea77dd6cd86d07bae9d04e27071d76a859b17274a4d63eb4f000b013e2830df6efac9f6a53cbf170d65a465dacf6d19c4b995fb54cc30b995d17e89663c5e5bdc0ec35187b0f12b3196fe35afa5876436f36e6f6669a847d8e87ebf67c6c232fdcfc649e4c97e863ff7cbc992e3dd557aad1fc8ac01810972db7c0fd2fa4cdbd19e1fc53f55b4982a5c04e66c0bed260a1e6341a7c12dad3691ab0975a8e8767bc0ea9e2a6be6914ec3123394530a642643504638d83b1c7faa96c12f63860df60d8cc5ade769b843d66d2a2e18861d86603cad806c10c0caa1013038fc4c0bffe5deffbfdf3d183fde30f37cf80a1c4598c2adf61eda349103f178ac1e531823b6ecf118e250651702e3ae6b1802fdde43352de51084200b7966912f51dc772b91468bcbfbeda2c6b797ff9e5ef7dfdcbdd73c4eeae6b834d82aee350e0efcc503e7182826ba3bf659a047beb19075b373b6bc6595dc269d3a74b19d6e01955ab9ca68b74893efc36e258ea7bf8b9b590bdb54fb59c6d996af9bda7643ca67da649f03f9aff6894144d631a1a29eff591ff93fea4bdc78817a1c2a5a93aef08b6c1e761b4ebb8e9b3e9f8bdee4f72b0c8cdae836a12fc1c0f3b0f67653f393c39111ebd23ef1dedbc60f8a39e9bfde427f7f01dd525ffa669211876901def9d2682d33736455a56401c10bfec86ee2036f4100c9bc6a5c0c7c2b5e19fe3cdc860f8bde32667390aec992efd70208e25f6c31ed4a7fd75cb2fabf1be63eef754d6d2ffde635ce60537b70ac3cfd9531ee3325d72978213e9207dfd9f8c525c1227d290c79f8c526487b67db40c8ebfc2f05bd5a50c8174093e9826a134d771222e053e9e2238e6b9f0283816f0e1f348c11da81e0ca11bc1101ee152e0e78e01865f4f94e0e6a6d1b91e7ed374118ee5ca6af43f22bcbcd6f1b06f0fa64950e6f968d2c438e04b3509de2881733c1486d190479766681a47810f49ffa3d1bdf09ba64b411c8bf3076b66bbbf5ff65e9a944997024ffd2a34fabdfd5dbb34ca852b6ddcb0716d1045fbc35037183dcfe0828026b8f9e22b5e287fe4581a5ff17297db341caabfd3e266437c7fb7a1072ca34b0efbeb2fa9e1cb41084fba3378e23613f8d0e5b488de2fba787de0c368e79c730ebe4bb984f8a0bafeaf97d1a5eb7118b99410bb275017be638e45022e74cb1b22b15a6ef11c7c41b6b08a105657b51b1a5389c9c0eeaf16dd2ad89dc6c30a6e0eac60b7d9783f576a566f933e9f49f8ad73ce39127c2729ef1d8dfe4f27ef142bf86ddf241552ccb8702be058dec7b7806371383f1b1c3f6ab905bebe4278e167d3a548812645d2ff68b4cd1cdcecfefdbb806379aefecbacc831e0f74a545e6681dfcab1889f53f03b65f8bd87d26e9987153c0ac275f5441037bf158e3dbc95f66e9a1457efa10def7bd525f7f1df8d9430c3a1079c42885bdfd587ab8623922ae026d0df98e31cca75d1805bcb2ea7456bc18db81137e2529e068dc0ade513b899bccfd0065fef30cc9e8d4bb9be566b5d0a8c28b8aeebba60bfcbaf0b7e841146086d684c37e852f0d420961ac4a3ef92952112212f4070bea7e83413fff7d224f7b74bfdfe58b4454b3802c3e0030bbb9a232b0c5f7c5ca3f66214f2e2033b212f31b8b3e71cc54f841f0afc541a3f15374d87021fc28ff07d832f5d0afcf872e1bb16f0552a7001c7e23074d0615c904aa552a9542a954aa552a9542a954aa552a9542a954aa552a9542ae5022705774532370104f9d79882eb6a8ec06057738407ae1952f302bb1ae962666626c5b3fad5e05c489e1efc7ed6bc482d4420e611e269aeb81063f0fb1853465c0a0bfe802722351ec383a36a1e3b364fa6c7e5b4a03533dc9314753eb8ba812c68047eefb0093d803944885a11fcfeca70e801c7873bd0b1dba00d848133ad4ce033a481043e432222f019f600029f6110dc0f631c8bc894438dcfd087077c8627a0f119ae0007124a70a6779af1d99be080cf1e8596cf5e05199fdd088e63b93b70a6a7bae1b31761c3671712e3b317a1019f5de55842dfef4038d3cb61c06767c1023e94524a29b51f4b29fdd8a79f3f4f2bfd58fa35dbb2fc2ae1572d52ed6177779f4edf7cd3ad0ea5f2fbff125d57f429e51c624e39e99c33fb39a7fc7c6c566badb5d65a6badd7adeabfe852f6d505ae5f83abf66badb5d65a6badf7d650ada1faf97ead3734e99c93caaf9fcff7a66306fbb496eef03d871ee1d31ad3e8506e4fc6e38337a034b373ce39c49c736694da5b5f5e593ff2ab7c9a633ae59c739acc479dc68348798339279593cea7534ebf445152297b659f0b770129af2ae5f522cd2da01dcbe95ee32b2f60889c84937889977013efee6fa24409090991bbfbacd3a9fb67be7fcedea5679f39ad3c6159a73fed45ddddabbbbbfb8abbbbbbbb3badd43feef5baaeebbaaeebbaaeebbaaeeb92d252494b32b25a2ba5959fec6369e4905be449d666b54aaa33e70d289d52564929dd6c5429a59453cafaf948abd1f991f323b33a29919d15d90cf9fdb1ce39e79c954a0b6964a5524a29a7a4f15d832fd28880525e5e3b0711d59db8f7a4dce4f62084230c6345718bb8107094e7423e16b05503210b36c92140011861e717e3161f5cc55abfe1778c20ecabebeea62b163b17f31f7e1f7fb8f9e1f734a3d1362b4dea7e3cb0f8f2e27e5f4a4a308c41718bb87104f3b18f2fcfc57c2cde602c1e4106631f65a28f4bbbe102bf7f66336afd6c4695f223099c49ca14602cf67031606c7b8131af5512fb86691216a3e329157764f1e53ac1f9314b8cc91d586e19ba63d12f218c9f1f865a94946e10ca8669d48f9b3d85b1cff1056328199f01c6de633cd5a538b31af1db531ee332329b11633cc598c257cb66410663234759515121a9d48fca3bf7d8b9e877b8b6eb6959817340785d15f49fcf67f5e77d11e845d94ff91784f05b7eed77fa517e8cfff9f8f4e9fbf531783ec5b1c1f48508fd1ec291009072af72af7a95a9808264a741f9e8949d66c5897c3efb8ded1569db3edb68bbdbd36d457dfab99f6e4fe6b39d642d024051c172af7a7569e00ae94725dec4676962935b2695d85ca3d42d378e2c19724936fa59ce8f0e88e7df00e1f9fda9b57e566b1dd555fd95aeb5d65a9da6d6876bad9f0f4046e35341b566a09c7dfdba01206bc91ece6fe6b36d598dfa93fe7c8d54a7f6b0f4202e057b121a8d8d07c1a560ef40702c9aa4f21e7b45bc6d557576a2a6d3a54864e7b31950ca7b7dbc995853ea0c366a2a9f19c160ec637cf80952803de481b1afda09fbaae22f3ca355af1c67397ad7f207187b29e53fec257d1d10677f0384b3efaf1fcd613be77cd014cde95626d72fba647fbac0f36b7073ce39e79cb3f19c53b4653444f3ce09ead57dd0cfcfa29f2ab216d1a6e3e1bbe587412bec9de6ddc6f4e7497777777777770c598cceb41ad9d3af33481537799046c1de8938cb71fcc66d2aeeee7e6f9721a3511b76bf68233c19222cac6b7d0477e0615857717b3215c6f0669e8fcc698c5004fbf9de7157b17d13a3573578231e17eee8c1deab50dff4542ebb1530d618f32218c61a32c2c13ebb0de8b197d9d3cf0f08c69c2845d632371d0f83b6ec5d66830d0358ea88f48ea76300eb9a53954a06294da4aa8575cdb18aa608acea926f29540e84c6249b0121dc566e7a3a4fa73acdd3793a4ee3586017e1434a56ba6b5ad1f1a62e9f94fd3a20967f0384e5d3975d92f54f6435e4d7ada58ecb3bfa7eaac10304c1d81f206b59811f90ea341cd0e56812e630e736179782053980ad1ad472b856075c0af6371c0bec8dac4a8a55af7a35c2d8087e3691b5f8b6830eae4bd1dddddffad36912f64ef31758712c9ff7afc149efb75918737777ebd45face6e6faa6591f5b226bb9361d0fcf4d6ed3bf35c72c78511a638c31c618638c31c618630e5de241e6022b8ea5fefb175d824fe2b30ac96752c9e72ff17964e2f3358dfe7d0dce857381df8f34a76914ec4d68ae514a68ae4b34d7249a6b944681efc513198d18657c41d3a5f8f2f3e7254dcd56226bf96c397bf9f14bb21af17a321a0fbd6a12f6243413fc028880b957a32edcfe1bfa6dc82d6ed615c1d8e727c3c30936b9f1f0e775407cfd0d10bedebfaed46de5e9ab506da50697ae10f921231c8cfe8b36f56aa54bf2492a4f1abd4987624f29a694d62fc968d01754053f198ea51d4b378f76278ea5b1bf288be1977f0e74d361d3f1f067cbfd3b3409f3d7d9c9216bb9b292557193d3380af6a4ff3af8f14e1d1dbb8f07d59de4ebe50713916fc24809f708d8b9112f10e04cd751b0cb5a1c671160d73fa0b5428b1dec9ccc9c29ae5e48708359602764043db8524be98ed7e3d212f58ef6e1f5c4d56ab57a3c24484a1a2612711fceae06c6b579419eea87ed1d29ec5a5d9252cb310971c5c3f3483c3c9f5f10fc80705fbec4318438e312c48c8b2b2f61e25d9746ef3c12c1f17fe5fa3b49c5a56cb1c20021846f872b61f7f2ec10756e8e0c6782a1832b851e7e035c893e2439535c3dcf48baece09fb892e8e14357ca1e4208a58417842e2bb7723c979470e5f19dc7e557a8e5eb6ae2eae1c7e3a6186d1e8b9978a5961fcf9199d19647a32ddfeb64fc68f35cc49ec722be0d8e0f572b9e1589edc2707194f871f4d936f8210d7baa853eae62cf73016d1e8bf8a3d883e3ca797ce7b45aad4ea753a516a76f643ce531317baa897ce7ba09a660b8099edc0467767c47faccbb0a612824c2b22c240a61374d8a8f27c795ec17c7027a1f707c1c0ef3810eb8d2f5f15d9e0b87792ce2a38238bd1ffce5c8dbe1484e0747821fd21ae048f07de5a61d1c0a74930c8702ffbdf0ac7446bec3da718e44379176e2482737911c0afc281d8acd69e5a4e2e08c73970d8deb0a7d7e186a212ccba0086226a1ab99843ee432214f39ec318e25f4f11d06ce534704d1f11ee43811717e687e28f4220bd26e7018f4d545a43d9ed7f3c0d031cd820622a74bb0127d7e3c3d8e2566345e74652da19fdbdc5c9a145f5623f4f7abe86e2ea0d08b6952fc3c1ff4bae0586ccc0f7dee17d1837e6ab746e845a11789441f7a187da748eb5593425aee246c7d73c287ab03e21baf85a7e861f48912dc164fcf8bbbe1829d4be9acc6bbf1b028a4e570291e702811e60820744a80231870fc1c5938e6df70c1f733082472c9e1581e0e7eec841c01045717fac1660876b8074c8220f8043b212390c1a2c742a2237ce01076428e40e12a4d66883e943d9d966a5f69f62e5d027d7c14f46bb52fbb41d4826533b2d00976590be8459b494b63d1ebc8400f38f422180d722d1cf10487be529b851eb4b99ed0e692831b7a79abb520ede190c7841e861efe95cd083d0c3d0c3dbc01c2b0033de05e893ec78b01730f38c7875be7c0ada794cdf30226e28c6e6e6c419c41c731c125c10921a93cc9a55162af7ad52557d373d38f475e2eda425b16800d15642311d7e1dcab5e451a40179b134008f500c72702c5234ad783637e3e700c3d1e1cd0c5b1cc8b7d5cc5555cc5555ccda97da6964dcd4ead4e8d4e6d4e4d4e0d9bda35b538270ff3619d67c22809b708421ce656304822b3a196d89292ea220e8e3f6484736f3cf562053b79ef68f44f6a1e37037fc495284f9ce30a6ef1a649319e48c1cd7006fee852f6fbf1e18c8c3eeec90a06ae9a47973e1fb38f760a24c071e7b1889f27166df98e4623288249d80919810daeae9d7bf083e2169172535c394a7c49ba2aa3959ab85ab50d6e23700cdd3816876f3894f8f123cf8359dd908c14213204a786b48a71456594b5acc0d9af1ad0374d1269399a143df5a357f17148376f330a02c49148ffb1572e2e257e8d39b88d839be30ac7f82f7e5cc59bc8722cf3634c028e479c299e1ce50b8ee7b980a7c7227e9471412a081c7f108944d8ab348906f6224c54452012242422908804e861b409fccb047ee8455f2b5ce188598d152e8633999444f0e3490c283e979cf81c2e25be48736992c9e60187121f45c9e94486b36bbdc413176012753ae15a1ddc874538ee93f8ea1ac94fcdf540ad45b2b934296212da0d172cfa99830bff7a971ca2eb619803e21b431f7a99cd801f0a855ef4aee361d1966d7c669ce02c9e4ef0e3e9144f109ea07c13d90df3ef75dd75d75d1cafcf02c0f5a1167a11111cdaf20986105f0d841f8c7129f241f86a1f9e0fbe5a8693e1ab5995c557abcea3e2abd11d8aaf366d26be9a6c1989af86f560f86a57ce85af1681447c35f8502e45beab390f2e453e8c96e1f86a8d41db894b910f9fc3a00d360984ab9de722732cfae388742308f767584d6cbfcb3f5904f87af11e48ba033f806041edeeeed7dace63390aa4d1910af74a8912328217ec6a7a782e76353d3b988718369051e36187b80216cba5bc978577702ccf3609738d82c1f0b1ab1f4ea38cde7df24517dcc78347c83649033b5c0143d8dae3d1a51e4ebe3d160ca56852fc1d70b842a326c117dfbf16bdc21043e0e0124d8f4fd287eb536bfff3554a19fa7bbd5e72cecf3e4f5d4a29a55f220863f5f9e42774879873ce39335ba90c65d7d60f952ba4b4f4124118abcf278798524482a4a4842c314b484888e46749ad0e88ebdf00e1fa9652fa1fea745cce0aa59406991ba8d4eb59ca821e2aa29104001316000038100c068442b13ccde254911f14000d748c46725c409405e320c9611c478c51001802000000000000024056034bd03ea6b9bd269469fb26ae6cdd77df591d10eeef4f8e4343256bcfe26e0e26cc60fc8edd0d339e811c36ce91d344a066afb58eac54e877b770d860c40c467171c1d128396f191057db038ca661a133fcf06a6035a4f74b4cd42779870b4ebf66fea96e46a185451cd2923f27ee660214e1c6f94e4d91c48c91424aa02ca73243439ee8a510304b028b4201389ac03214800c01cb6a7b9e00e486aebc36a0acb61ae2f36f8017005d4d1e65399ccab4f0fa4e879999c8203f93e9a51f124079573b1aa87821828b69b7c2baf8e895e6dbc9848f3726d5db5bddae3baef3d95c2879186aff00801156374556287f3e4fe03c8d31aaddeafe6deb47176c3cec31aa995e217c0a299a793897066cbd1fa70becd6ea095921926d86f49ab987a70e68ae574791efd78e3460d0e542987f2973362e49e35b5f97928745d7580a01efe20295b2362edfc219b24c60081f8dcecc1ddc129c9718ce7a68cbe99e57e116a910a8bbf4316e11d2ef595937eac02062cedb2bab88590d789bb5e496df78476c9bb0988d2391696bb70ade314f4a2b09a56756fb95909b7a3804c7aeb2e4130ff009b1b5a92b51868de47936e45662b6197d01657347c9db98375f2ba6a240e75b584c6256684b174b4c309866c18c495e74d4c14e1b31a14c0a175c1b5d5e61ea99005678c6427703a4cd11114bf91ee8b10372117bca8cf4b3b1bae4d207691639618e90e963a29f1b6560499fcc55f1e65ea9aab2dd448c0a2238698192b938eade693134c62a5fbb92f45c6db86afcd36b8cabfc060c59e7d4147272283afba70d7654121696cbe63711353907ca0103309eeaa6ce42c99e01df90d2e4625b1398bb8de2baf2513099654acbacc6ce0cbf50338a9acb7c28d1dbe65b98f16ade92f9814e78efc0f30ba2c79aacc8854570e5afb8c53d0f2faa814930cd31ad9ecd86a6cd8214869f23f5d951b3bbfda4f764f81180f4722a0e31bcfe3e88b9674a6a5b2e3dfd8f027beb0d2aede18a15522fe112cac4013ce6124a6e9071ec1671a4a127ad5c69d8c14c1efe249024f1b7f5907757669c31936e4f0d30e06bedc78c8e058e381b253fe01ed45d29af149f43f26801543cc605e3c77f528e4d7c7c8ed3518c82ff8d6c63f849617d5c0c8d11ebe93630d15be4cf6bb3797737c2c459f85e01311daa2326ff3a3c6e1e1755b8a65796058aa5d66e2673c95328bd9af7f07ad58260584c782795da7cf3345f277367e71f4c5a8f80d63cf267075569e9904e66449ac2b19ff159b9a5477132a9f50568ebf8638085df93f29e624a597d77bfa9fb6811792d6b07dee01792496777f9148023ea7ab1202eb8780448e8adf64ed6d9e4698a2c86f95201f93fce30d6492841ebe9f69ad25092a3516b85ed417b39d01cc55418aa11c5a5ec35bb9a2cae8377b8d46c578f975cf6986c735b8b1c0ad16886f02ea908bd0a57b3783d7b782c0ba46ef387c99634c31275de9cbfd2f131704a5fbb01076eb08f14d97bca6f8dfdd83ff7ef8ae67e3c97649709235c4a933e83908501d1f3873a0f6d2fd1bafec13251231f1a81d188e7a2a87ec6c2595bba24e7d852a7ef2a635d8944710103543c755ffdb0a281d93cf814d0c48367c683bb1f9e5097338d3cb0002edde546eab5e49f85bac0ce8d946bfd5a1454bf1da10a231755996e3f0d3de8f51c89bd71cbc8ab07f2082c3dfbb2fda692761cf1d6b7334f1caa42a48f2a54299aaa45c524a446814c9685dafe6a81ef974593c91f593070135d0710b588fbdf90c9edbe8813ce6ab296a022242379acbf5c4f083a919b1c3e1ba7b914ec1ddf40ccde4cb070367e3c438847e18b3e1bb5910afc82c797ec20b3eea2f8351b2c2cd7fe359b7f31f572124cacad007a0f3995854f53da71689f110edf7a859ee2fd001d1d8bbc644dedd44b10a6ab5e64d569ad44717075d07603f273ce21c37e573afb5a5a051dc6c56c2e10b470335a3513159d1318248f46a0c4fec0503ebe2b58f1690d9f6ca605a12c2257c7e26658f95a7045806832a355a7e724d18d0a2f6aedf2e1f23dd605f20300864b4be4a6751f48cefa6ec22c412ad935f8aa786fe9da03e5b0dab19d977bd960b60f617de1cd3e70c74097b81a24d1b84630049e14b814f82d43d12d09bac4714727c17e3310e0c42894a1365bc02d3110a857c48ababc56851d791caf22a08f8d7485b33360aa4dc06c552568036e023bcc11eaa0f09a23a1162e35cae8f2ef8d1ff749743bfc8e40701e2c865c347196421e7e031788e0c3e71513377c9e10c570233902b6edabc1b4fae533432ba9abfdd3d65257bdf26b01846864d90d5a8a73e10bb0e1f67183ae8ae2811cee54a7ab8fec8234066f869fe96dfc903297cf659e959f8b5ad0225cb67af0ff7684b851f7f933354f5ff42e674ce5fe10cc780e28ed3ecf7a4c962ccbbaa88bfec259f9c17c087445b602aac67971552edea8493e315775907d24bac5c819010f4f09a3455cc3543c4812ea2cdc4bffd6300b62091c4085acbeef8f3d0c61714e13cb2381efac33b69684a286686887c11f855a87c1b21f32ba19af67616cfbe1a7920cb3c5833b777d387571ecedcf079a40575eec53374c5cac730a21553a1541c7621a6c921681fee4eb5063aacd0cb0341765e44228cf48092bf555ac3c92205a5637fc08e40b7c25e0d7eb49a32bf8271b8a300216219bd169b186127752cd8d361640d142e2032abf14630e9ac20ab41f3c000018d4b8214c7cd5a4e1fc73829e9e10fd9e8b2e1dbb4cd607de02adde650c676de66f05b3ce092c487725906a6322256655c56475426e8cc5d3fbf9b863b055017b9c0732f12372080e853933ebb358018983090c2550e2912309ea4d01a2e7c8eb97c5f52495560b4dfc891299b46074d8297c8567bb9257b950245d21991766b8eeb4023ce9fa5907b8346af5318e5b96452bd52a7e0285161c99a67ff49c237e5ea81a686269c9c55da8daf28fb894283b0ea85569415fce2169706543b45d23f0030bf8bcda026bc0065da5b29398a91e0597df827e345d0e0037f75ce02ea3f4ccdd5704d084e362ce6706d62d6f2467502909fa522479acfca2cd007b55ed6bbf63d8933284c8c940c54b86bff86058e61b0d2a1f4998f36c3c86e11d19c4033819eb2cb832cc60e865806d7f6604d786cd88c8269d019a4d3f23643b840610fb8f8686dbf6a1347e057e1a4690415d10cdabd1dd1a9bc5e9908b929cd6fe5884814911d323b29aa1b9aee09679c32a02f6b93dfd2fdcc3d7155a28bca2dc6b23db7fc0c4a7d7d121f2dd0619d6e53dad731782711e6641dcbdc5979eb2e388941cec4b719fd2735006832b30e2e5e9a2a27ff66dc68a23e5dc713b2846aa5c4cdf454a39ae0c5192e90b76e2b0789cb9f1098ff3dc9493ca1840c347363ae0d077370b1d6864bbd18f552a3536327cda2d4a870e270280c9250a8831751267813b9b1cedf0c859c8c3a1b2107adde8a76c7060956295c07cf658626534c7da45d9cddaa73d2a1b1214d97405f1c0458f842ec88a734ae718025a0760ebc8a71d4adf540411e1c1dfffdb06e982c455bc9551235b81e0c33173a025689cb922fa961024a4415b760dd007001ca8db824531bbf48f95fc8e1cc208d994565299340a3155f52138a8964afd417684e7787ca7cd71e6de5902fff8612c81d5889351afe37438baea1526f6a8f4964fa441f1d30f2e89527af9053a5cba0a2eb9300ebaa69e025d9d9f8af31ae9f40aba39a8039dd4a189d98fef01f693b737f6c8a5d413d0216e89cfcbb24d620db1b7edf4d7530afc446a41f3e75177cf3ea7a219290ef477026db9bcbc23a7de24cb972754891ed75012837ea3beae8963c942f26a1063e098d8a024ced964530bb889d334731e261d1f3e316820ed377bb59cbdae281c40a4fb2d60292bce3c44b17ecfe8311a3b8f2ed88c5016754edd3e77ae9fec44741046d6301e8972b0b6e6342c2c6619d1805796f75ae099aa3598dd95a19fe4a52b08063f0bef44ba598bce2db90b7da181cb56b5f595b2d513961030d1c00b9b5cf8adb0e418a9aea648b6d072bf29ab5bbb622afa094bbab213130411adb56c9f6b6282da5efb667a7140bd67fa5ba7111224cce5b2cf576cab06437cfdcc4820db09f36903302e0369986cd9864727563220fde6042a81ee2b483e30467fe8a1426f5a94878b032b88a89e3dd62ba889c8d492c0f11359a10e87d11a098bc0d7f84998ac048229812077974a9c92652c1f2f030f706a06f7e8cce9f97729e72ed5eddb227f3480438dcf40234855754f2e945c34cf0a7be4527475110045fd729def10ec83c4be815d6b22fa5190c44813592990d6e9b073e57c90f21c7cd702dea982de6099f66cfe0660a733d7268ae3990070f7eac5b077a7de4f09d8819a78a11ea5802ed7cc62bcd242adc22d51c83010ca65c2691984e4bd2af8d576baabf28fc277c2597b6b43327bdc612dece5978430d6d581eed5b40555c4ebda8b3f827994ec2a3b79c3136c56e06f7cb26d46bd118c8193e1a0fc21d01a7d1c9a7ab61d4cf51fd1666b8cae788594a0bd26ce3ed0d12d159476433392a72b0bbcf259ca584df03734034baea9b2fa5f775c98e107e3455360c8eb6a9587a962c4f059098dd587169ee532c8ce197d17559916bd24883a271511267db030350201ff4ca04d9461c1170e9032c72d04184d5c2ad350949fc5fa54c85eb0fb2a99890a9407f79a46df8012f66639121947e5addfab4f32a70949127dbf67f590d925d51bf7e122b371e0a0896e215023dc907d3987813983648f8120816deacdbd67da75f7b53213cbda27024178c8e64e5ea71adb29ddc90be2e90d6f704d88082a5f380c0cd0e4e260ca34c7cd2c10662d0daed0e6d9b8ef613e62beecdafa01cfba264d060a67b696e172f61ae970d95c1d26370cacb495ebc9c8ea48c0658ffffd75951c16fc45d6a2e4a326e8922eb9b98bf42e2f1a0c68a80d0be45f101f0162f4d5b8b1d17348be9d5df9a5e149c0f4ce9b15a54958c167061affb011503a94c66446419cd806b839ba813ce01ba06e207db1057b09473f0b3c75d31149a9c684b4740107fc81d4a43cf4d54b3a5253727273400368e7424723a71ae79339dcb45c1bf282ae75e72ccf89b9ebcec5f79350d9c57633490313927adb3b468f752ade7f43f9a673fb36ea357ce6e0ea24b40b67d839b4b2cde955b6e8840eb5f4f104e3eace4ec8700f365438ab5805e896ce447e3ea2b4c47504d38e4b02fb62cf22f33088c9f7767d078d9da55eb77546c6f6c7acb583b4b5b01f2f7036de3fff65887c4b28c85fc6545d40f7801b7144a4596bff1dbdab0bcbafb79d5078b7bb15f6e73a9e1090c9244c603530514da8a7eb48e068ae73850a12f5656fc193711610669595e1edafe4adc782578c13f2b522f0665c309ce048cea7f109798a6e0ceaa409f2a162c530dcd7c7a4bb7e7f9a685251e5b8d32a48f994f23b24962f3ee518e9d361cd8c7575813eb850835ef8fb1160c88275a7094d8ca82320273621ebfeae9e0925dd787f32b53710110f296d3b66768192f9c8c4ea02fcf6ec024260025f4cf16f52f98a6a3d588a6ebebdb90d9cdf4c816b7b5af813d7e2473c7158b48aaeb8f11c3d7788337a00602f0811d50829b0b366ebaebf2e27a1718db5df895575c13a211a56567194729da3e6452c97ba80a7c98be80facc1f96f95d8e80b80b389dd5b31284722166999b08b66620f46e6e4ef5fd7c1440510c07b201bb4c81406e9b6957be0ec6a0e9ece5f47917218ee24a81e7edfccd6149dd81794139a8c8f7cf278fae251106369c187c42c3586f17140ae2cc5d5f19ce8c42212d8b29a6a0fe4f2c203b10e175ca3829aaa5d8ba176a2133832a9281d2fc0287fb06c3c49f3b6665fab933f01bfdf0c69d930d769892bd4d855b377df5d9903dea5a4125db9b225174cfc82a38517e51d92b1442776fa52115990f505664c2977e2d74f8e19c25cf64d48998e4ebc20042e81f0f8881d5a8a52a20b162f48f29fbc4c6c0a4af28a776fa2fa3c7b052217c93f676465030ea7d8d86143369e8a4f39e81a32c64427d69a7b4e40cc4073ee957314050ab415a3cf85417c4ba7d2bba68042f58b2b9a21624f462bd9cb91057ce0ec577bb2b1c45c2596f0c796ba0f269f409cba4e45f6a553ec6885ed3eb92dc97534c4739d774299fc65b0bcbd75fed8e7a06f4c567928e1a0c5cc4e5920b891499a67f1aac9c9014f86d9fe16111b49e826cd86acb6e4d8028a0036f6450cec88dbbc8e853b1f28e38809a23c4ecc9e844ca9996d6d255b0d94355c436e7e6fb43bbe5f1784617b4bb55298e3c36208d5e4b196faa957fcac9a9757cc29eb295caef4574658a9b1102aeb7713ec633dd22c699f2fac3d8532eca527b4aeca22e24b1099c1b0104205bc21774b4122f4a27b41a810066acc61be0ae3c25016410a04286aa527ddb6fb5ec817cfab5343a6dc1463f9b98315ebbb882810a38e9b9a3d7fbd558e8aafe2b6da4551eb45b0d294beda58baf6f1ec41dc03d22af791668a6105472d37164a951898963ff5c638c807705d9b6161428494249cb2f780431da1b71f3ffe62d00f245522b729232666b58850cdee93c00a8324be3ee45b248396bc27ceb0024f330a9742c92542c5de75496d504ff954831cf14fe2c5d2dcad46c3582fb67ad81c27a4688e66e19dbefc62502f995c248bf4c0c4d57efff443e139d4e87c1a5f9972a9a94d11679235a028069ee0e927477ef93420173bc39684f9dfc726edae2d3ac76547f1247efed82263cc2ac2847f9130466de057850f4fee6cbaba161021f97c2f2e76fb2d38387d4f345dd01889481fdfda3990cd27059279d54582f2ee93da25f6e205b4e5ba773ea0e183f3627daabefffcad35ceb0f2562bfeba5213e58f9efe787c4640380d9a24fbd4623509401676bca6538403cd262fcde8ebcb26f771d06bf9ae5256f5697a156256712bf5e910f3506387bdd97a6b3f815315abf0fd01d25a7183d6e011ad1ce45ea956c0ebb3d37e93ac2c6fe1a36c67a0bac4e25920473172b49fb580f4c4f02ddccffe8278280a7139125da84a2298d31a51cd664bb5b9faa730a8b95095b0012aa0322b94e86c82dea43f4c6b5c7a81bf59e1d1a42ce6981f2914ae01e1d108a5d870a1fdc73c5c0f1ec4a4e034a4b84655297839cd8aa8b70b3924e6ab6168ab01bc31a7853cc0a65fa26a89eb4e011886b8556016578597d8aa78a1bd5a8637532c311630981c8a9cf2ad31c71438a0c4237eb2d3cc822a1b51e86fdc53f2bca144d94be2303da2abf19387b850e727031d46f0ac240df3cd64fafd15023a89175b913721c0017184eec07e7b055da3f664d1f3a8f6647fe15e349845c3eb05ce57fece7f52a9c7f859165db76355c1657e3e1a80e745b2c65853accc73af5167f447767dd67feb48ffad87867c1cd959888a929d9250e88991156e1a7c3ed3df990fe1cab1153fc7496d57a2990c1e24c13af25110962cd2aca517425078e918a44a1120a517ea7435a842e5eee84d61e74e12dbece9455dc63605e4bad055274e11ccf5099d86f9fecbcb3c0a0ddcda88d8c13b17a5d8a8200e5b713e98b5f32df4189f59db8638c38fe6f26bc6970be79565c3222858c6c79d2383e0887129c04a191fd7daf8dbf2b4a7b35dacf2a493195f8ed7bc223a20d7a2480d2965f791ec793e33aea12c90fd102c9a5cdcbb8a236de243d460f2d8f5d8df55b86a20c20d9dee622de5b28c4eca1c75a0ca7e4a295ee1ac7ee5fa3921a94f5aa60d5be96ff0fec8b3b5e1a71aff85bde2d0e80ef0f51f8cdd024cf0d557e02bea767145837bc44fbff58a0d95e326c80be262e34fa00d9708e3ee11b33708262164772adf11e6816741f41cf52876f944503748a50274afff3e1819c51b86085899fc87bbdd153dddb90b19527a0f41f7625e92a3a6a19aa6c7bf591f98dfd3d838b1fa44aa4735180940fc294818cf2188f72ed4d982c1baf38c24ff964ca882b68001d3cf1f30a08b4463b4646b0693074b07fed9d4cda0d0db2b765ae40f2dd02d28b8184508df279205bc95570db52370cbc5f88191c425063422e31b95047c0c628dd961a478fd6e8702071a3e482bfe5bd8ba885f470d9384d3da4ad31a7530e727b9fb9a271a03d901ccfb9a4797fefe3a96264e8f168d3443870b66443bb6b20f0382eee26f0f652e90098ee04db74b587934970065b2adf3ef8f95dbcaecda6c5321bc5a3227030481cf3a788f3764aea959feea39b2663a37c15ed9bdee1d8c6c7eb9639e475a4aa4eeba0c173d329e42bfcef9c9d671780a855d2ee8826b7d9f1ae16dab3ca615e87060f0f804999545a79c305fe3a08bd30fa9ea5c9c96709060401c31884be6041e394d564f995aa666303939d33f585c313513812355e2ed1fd3737d4364a98e730de1128f37e9a8a892fce24bd2428a0175088fbaa40c24939feef117d189f17edbb5717815d9a2ba461e139691b341b17410559aebd433b3b35222c81e423fad94cce7b9af6bdc8563bf9279e84a6a2840fe7e1f07cb100ec3e220c4111257088fc9732c45a20c16e620e64c67e24a03b5edca7519c6df30ea1a733adb2291ec816439d75dff54906728f3018061ab7b02c9fab9320e0d49281b47f07fa0559d8775fa69582c99311e22652aeb0c8e575dc3ab7adc477b3a1a5c4cdaa004063ffb4ddafb7ac463b87ce259a0b988100d4b54d266348f0377b102add0bb6c1b9b164fd5e8d2761a9f2fe674871da0a6f722859e04e447191aa4ae34ce597258343dc363c4a7bc9319f137617b74b5822f0d53528f41e7e9089049480a8cc0fa98d52563c47aa6840be7608d8302088f44d141af7bcd48de130011456a7247da9993b7d9b13979aa41127507a54a4c0700e83e9436ea3a8461c0b63cd0b8509757b3e01cdc87fb049c70b65de2d0f2911e53cc2c582dbc07fa2ef3d78e8ce7f5c3b6ec62b01e10d7141044008afec6c1faff229c902094bc77ca070ccff526d8e2dc28ef5a3658b75ed015429eec08804288cc02e1eb91994844b512838f05dd6832fbe09f1e1f96c6b0f615385cd3944ad5bcc3bfb7caa791f1efc18484bab63fc60cc4e0ee756f2538aa8fa4ca0666c304c1db4f3d0325544133f38ff2aaa1d5034d167e4f2989d0fcc83932e8251afdf93d7f206d3d12999e7856c945e16ddda9acbc579ba53b0991ea6479da9c146090737dfe7ae48a6c0d7b2718ec5d85ab841f689de7a8a3478362f97fe0940423adaa46f39b212de99a2c86805210f32411da70664d00ac0c612a0678f814240e5ee39f55e9a133d9c095b86893b7fb8f3d53e9841400032363f217cf67663fa986224df95150b2f909d882ee7fdc10ec10bef025ee707d4689c87988919c195eb9ec373cc953777e678230882523e70981d51c2b151ebf0c2f67d9a83835686f8f9fc31af19a8e0a38ae6eff662c154aad526930fe1fcebf758a328b20edc847d71c7d8f18531648ac116f65273218719e2a02e5fe699b42ccb05fde85b477b7a7ba7fc21ef059fd5f090eb1abb7b07ba2393f530a5b512bb59db60719ec7e43de08b59e9dd267c08f4433ab8f030e0e9fa96649aa887a96032f08ee01eb3a8cc0276bfdcea6759733df5474a12ab59086d99bc4db919999d7b91191db5ffe3673cc68a570aaa8ae0ad7f32669604b87a820ed02ab91790a773918a3f2d09ce7ef8323628d3d1b37c32feee7389506caa7ad815596ce16f97098f41d408c029c246a12f36c63ad309f5caff3aff43f9b15fbb9ef499b9be5e8b906496d3928852b0a4dd96c3816e06d5449aca9ecdac4addf3d01b45149497cfe50059a7eb74285a6253658b34dc8f46c2087106956aceeb731ac07ceb52442dcb49006608edf177280dd99010efc3160dd456cdf84c393c49897392cfda545d04142248dd30ec9f08090f3c0130104242354b798c3b192d9c217d39a0fd5e1781310be2e3435e40f370cebc9c4b9a2cb1521c85082124293882f8a179754e131fd9e8eda5107c3215d388962f1fe84189773f515f359cd017a33d900f268cb78845da4848217a484391dbb3fbd0bc8781c40f5c2ab3b2105fb8347a3d7f61ca429a31f1791dd7efec3c20c33f12f4849973f5749fa55c76dd562b0fcc64e448818e22e8e03a1a701f281413b0830c53406742e612411640f828b1794334e720326d5363bc5b197c12a9c59840365d92e35268697e286c6da3602d55909f438ecf98656294ea685e4ae91eb6cfe5658a268007ef7233f4b174a8f9ac955503a1d925acd2838427bb4e87c9a3982f3cbeeb08ac75157b98a3c980e2885fc3918d5841826fe685b0abeddf46c995f6d234b2b6d78c6e63504e2715713510f9db30c28b230535c1de120ce79059d87a344aab556b701404753ad75956374111543699c896a866fb276e856e7d5a221bbdad63eeb2633b6f58a5df696581b8e1d9aef839adaeebb8e5ee17542efa288b96d84d09bf0a07d94db698260faad0e7b9ecfdf1c589d54be660e30374743e64cb58bc1b767b434e3feefeec55f240e015abde234fd6366c422285f42779140c86a440b940c175894a562476e2866cc6f192660dd75d76e6bdf1915e8101d4ed5f1d20a10dc15f5b8f7ebede0d0ab9d463d3bed1166f9fb02fcb44c33fbe2952ee776135c5dad7d4a5fbc93d0bcb20ccdde5ecbd99ca7295b9e129ed080febdb0400b57bbe0c9539fd5f7fcd11dce460256c55242faf04425e32b29ff98b428122f2ca3da11d266689829b8bcd47ccefb371765b5aae0f04e0a76a469d5bede43986db5df291de800b2f69c3bf1a28fee27d91badb115d8fa2c591a76c862717e1cf2e64e036d8ecc5adfc1cf68dae9c519268759ce21e9efb28888e8d7d14c36035301475bc39fc1968c134ec2f14a0b4cdb0943ee1f1c564b4a55c54c51302590e0392378befaee977c34ce189c171ae0603d99affefdd5892ce976ce44a63318f98bdb1e7e1ab35b9fbf6a21b5553919f00002a235a7f36279c5e5eaafdd32076d4f30fa86feaf87e1be60a1e64d199ae0d066952e0970589c54872d5d649372b001d2d39dd8ff2f8d858611e22b1133fb742c63ab83a04f9fec190646f630633ea11e287275d864ec276f0b6fe299956b29ca1d0fb14db9a0f958a1de82f7e03c0d1e16099d02f989f001c96ae6f501aff5707758d5f64cc51f2c0df3125fd38995457eee8ae151826cfa2955d8bf73ad21660d2190b2e92777b38d9742b45212bee7387c1d99d44767637ce94d813c67c12c93debb2504b5edcc26d4a16bb4d6be11d63e12aad925a7079b2dc220b22ffacdf7e92874d8c6bf6672b28db9e0da2eb39fc5268233814371dd5ad015051eeff14df4c132c3d494b345a32db8d0079e7082bb7979cdfc9294e7c59217d95c503ee319117483e2112cb5166464f1c13b23aa567973605124c8bc7467355bb6e9d4690133a8d1e2683c4dc9cafcddc686abee00aa7a6463e288e3e26244863dcf35ea0a8cd0c4851cf27952fcc10269e9db228ed1c897de400e75eba2a3c55e05d0b61da31439983e764c494e011cc36c7e061c4c49b0718a303feed3941e587f83cac00fe232996e8d06ebeed0b2a866d66298b29c2dde1ac75e81c2905556a5a28f95be25282a9eeac2d5f2b6ca6d225d4b42fe45d5ab7033045f4019b34e5343484a4397a102f22c198497d4c3418057bf2d9858dd40b97a10143a0c842c4545013d2c25607756c7a40da61236de1106f861a5a815db9636f36f8dc8ccdcbdf8a3417724edb86eb8beff79ae1a714e6f616f524a422b47366e988c37851667fd0bb7b5e4b47a6310286b0e0e31ae7190c1d2a30e688e29b763c1ae515f2cab29471f38a28b4de7e1ab04d16848f1ad7284a436bed89d9217c887d60651356800cf4a63fe868a5725df28b9e5206af4ff31b14c6ac58b3116c58b4eb0049441766ba9199fa7ebfef60f0a4c66613635361c660ed8762a09a9b8338f6a06c2b156245971daef4af4a93d6af083e52320dcd2bcef676ac2a9640cb3cfc1455878146e7819bc073784744b74e616cdd6d066022ca4da5c7546d528052745dc074524ed8001e1078dd6053c0087cce57f057653bcbd5d6e4ec8f3e2bef5286050d70e9082a7e5af1d04ab9155d1a27217d892ced11763f64121a66016d7169c589cd6f2e77ddcd804faa06c5fbcee35a9f72dd2b3561f38f42e6cefe935086532884faf4f1b1ce2ec1991b053e62349d19a10d20313cac86b20552e6f1873be2ad00bc32c50ea3ee0aa0fe9841023a0a125b18218f615952f2b56f01d3b3cc1ef357ceb010dde760d8f231fef7c9b7065fb1ee9f5054101fd2f88b4ad35244b858c61415c1ea0bb1263bc875be328f5650587b56b4593f547f849815601b944f5380ac03d3f8e0b845923127a8f47191c858579c796267040225070c72583ca6c6243b895ce2329272b580434903f99a4fbc17f415b123c1cad06a4894e36888710c159ee7a7caf408725173f906d4d88c6b1e12208b9759ecb2cd1eef90dad733e6547b1ceb610c95c396d63c3b1861c5c14acbb90667810a03e6d0d13ac6c545a6c40503f5939feaf3e71e3939f264ac6800229b7ee1fc4b0470c6e49be9db4a8ce594234d48f33d3b0544c004d3092698997842568cc98979b299e8000632ee299ce14db6a8d4988b7332e04a8732c7e68e012732160655b0b18768131649eadebb566f58cab3a2ae9aa30ed947cd21ccc109abdab9ed0c45c02d805bb5c451547889f00083c0cd7b7c57d4dfce9077208844cc23b770e222329cc759955507dca85c119ea8f6d239eed290221b0dd512a423d158c4a7f2f38e23ae5835e870a4d0ce128ed83d7a9aab2d90d703b1c4a3091d22ba654626782b63e07320f66731dc817b5391ce9deabaa8b7a38bd5eb2ea60cdb5a52dac58cbc34281db738767c28a13fb3043e0e4c65ad24b6879097422c585937c58b061486f0c975df9596892a4299d41d319620ee9d9bcd0bd96862b220e27fd32f0b8b17d18d4ab7529df55b4df908428062195feaa751a57427195f019108c55458aac74aeeb82407e7b6c750982ea212a9efb8c1772465d4053e0471ab90f4d81f5f318775de5bec31e35e50be1141035b1fc6ac3f6221ab51f846bd73794f24023f537eadb788126835965b125c134baa7f819d1723bf1195833e606c5e168b9ef5572d1fdf3a18986814095613c5e36ff34fa012adf45bec2914411c4fc2c1b671ec561dbd0da66ba511eefa35390d2e97906cdb53b361834d93a4ada0c3fa302848979a0bf177af7f8bb97058387990a2f1890ac0d940c1160d6c8dec4f44333de9b468ad2ff0ed4e7993b97f8e2de30ae7322690ce5dee573efcbaf01115cf222f6abe8c196a366d139491786ae8c70b383bafe60b6dae01ce27322f501b12bfebe7ca7f0d21c03a562b61ea3a28cc5c86cc54433881bd5afa079100c1161f9111417d4c1028b07ba70f069670f425ad697f06c86c9195d20dcf0035a8b38935412ea8aabb9f208e989a1501590a44c9503720d15aa1a0a6a071faa752bca645bbf71de0457b79536e4b990ddba5e6e316e76882fafba84707ac28f0b58d81728db65d96de24268c12ce6cdeea125d31f4303e5ca81af19164bfb3b2baad9d49a27ba57296fc2537b4ede9f9d3eef756ebcbbbef460da4a6b76d7282a8a49b42edc0594ea57f88afe26fc8fc0c8e514f44ff7ea117cd81f18c523b261124dc86634997bf086a42a115280b8c2a877cf8e0888ae7c541f37b18d280224e88cecc1582098bf060c8bfba3899ebfb370b089b1b15425419fb05c83598507bbd1c640ab74b0dc0b08ccf934ae35b981500a7c630d477bea5d11dac90ed5f0ffa7ed7ea3f7357eb0374cf7e4f468583de109297fd8a4e6bf34a2b7def6e7d2c1f2e74a0ee2a4ccdf500001446740ece212a5febf6b367f1786204278e5a802f16442bca09affc2b0b8ff94f03e0bc5d37a551eea839414aaf4682367323382a98a83c2ca433993c24a6fdda3db0e597f7c9964a7542b99273e2692353ac4f5a9bd597056ac640bbca92e14571761051353fba86fcf6be81d7d302be3855eeb055a97bcae0b777cc766788eb376710568e78f61c0bb6fac6c247b0e8288468191ebc7d8c0ec4bcaa124de487afc749d30e094da31a249d76e07afb0e03f809e181af104eb6caf3312d40e22f989c44711dbe246fd27c6bfb0677975e3185e9770c171d73fe1aadd77d0c610b49331f0e4355086bb4196dcf8d8d9d87bd063fd24a8a10f545a95374422c363008a7cc742b6c36ef8656e0692e7265c32dc1516c05f67370990d2863069ab3473522727ecccff3df92da2599cc32be9bd8393ef8c637488cb7f1554e77bb689db8b2b96401a41ed866a0fcfb2b3c6ecb1b9fc0a01fdba2c6a31de1e876d39f3ea61fc4e5263f9d9d5cdbe82276b46eee41bd520941bc9091f4a846904fa1dd6496f0db0677751008c88e769fb1fc65376c578fc2c97f1a510befe66e25046a22ab0ba34e72e64371d87e683d68470e420a4b79354453f5cf8349c7d81fbee83ee9e50069f44765e06563f5408f263c71d4c8f961978f36e2237c7d776f9aff2506a730239fc466aaa1cfd53a2beb06387b8eadf767735ed9eb96bd6d9ad9037a9de0150500916d01e987b6e1ae1d644ce656b5288d6d45917a928121bec8e5a4aa3c2893c65b6d2cbe23168ce8501a42c43505b8baf4fe94513d0472f69aa218f897991d05c706a2ea17b2536177faf4e91d08c5bb8c1dd7af0a09e88a306a5ad0e17610f300536a71f570069e73025292216e5b76d3e956f99662a2ed7c240658ebbd413ede0d7d90d015411f50bd8ee740688998e531367261f6d769de6aa505faf70477ff7f50d96783894619e93c345195e17532270499c1cf9bd464a3af4363268afc33aed71c55599ec3d76136e75dcaeca7895ac66b2c039047e4c8e67339ea9f4f01ebad839cf47911d3cfc738d180a06368b6c9ba3f7ee365f9a6acc3835ad6094d535afa9e063e7942e49a736361e1a73b5fa3cbca607623f54feab3b4493e32edadd00b919f8da8bd2d6effde035bd2f3bdc73f81ad95c3db0832d06da94ad97f6ec054815189de9ac0e36a47665fc4089793ecb76c909d91de22524408fc31b772e63a91a03aabfbf2f32371a475102d6ce78916b9e9031f01227fe1d5a196fd3dd59dfa884e91534c324d309045cb245fea0a7b344194a17d40de18802203c17e517285eb543ca75a9bd4a9fa3dc1951037ca222f7911d1343abbc4d4c524041809648425a421a50b114d46e885ec14bb83e6c6d96bff45a8fe7d39c89aaf544ef4bef7bb990944548d5aafc8d960731f25cc860d7c0d29da120111c8c7bfc8e780c86c621f646a4de9253efcfdc4b2e2733e50f92f7cdfb7aac4e006ccbd505c015a120713d68153dc0050287bd5ed230522a861cac8d3c99972a6c3d83f4e68334de158037cafb32beeebac474c8ee63be34bbc6be8b68b1778c83d2059956e279881b70ce37a6b583ce0eae232422208b999cd46abe52e73db0ba9734749223f92b88174affb1cdc265da710cb1df6610b565898e44cd2b351ee95ed46bb5b5cd5701e9601f00efb87840f4f807c01d2706901ef701788f8903a2c73f80dcdae655003ab80fc01b4e1c900ef609e88e8b0544877f02dce2c401e96e1f3c90ef0f8b60d3757e9b6ff1f342eca8ceb788795d6066396f990dbf330f38db4656066d1c3ff61bd70c7d786e7a0f47cd316ead8e38a779caa5a338077a8163e6f6c8fdfb7b37b6aab43483d267c4259b9257588e4d885e01ccb2a43a772f5454f798b9156f45b8e4e79babc3dc4940fa55f1f3f2259e40ed5712902721f3ab1ecc133a1a7b1f5558e953a481d73ab1174dc176e535467565d3a5cad1b11a56d14a014d9f143f5375497b8dc82b84ff115575a077edb2a0504ca3364a56fc4ab0cf006e5c6200e9b09f80f7dfc400e9619f7e62f195f48dcaaf0ba2a86c5bda713b80f9ab5edc775d4a16d40a5d51b98de69916c67bcc5e75ca0c2143ed4b706b709a5cca6a56e9e52b9c622a8bbab89eaf7b5afaa99de67cc8493ef85dad32f45d46ab11780516b56ca2f48412478ba240accc3918bf243b60fbddb45aa1cac893bfa97671ce5d7bf71d3af59d6a1b70e8b9aaeb5dced89aa277ff54bfc069d41b71ca781fc201f63f245d740992fadc3256d0cb1bee9dbd56c166ea52654077709b9052a39b8ec1039ee0b4d18ec4c7b2e36f76a57cce7425610f756a2f6b663b47501b1929663ed57c63571f14e78323775d4c8c7c4f014245de2e2d3725173ec4e2c8378e30466ea32955915d3de8ba62e2097ae16eb03256c71547e696d818b92ec14015d9994e2131b28bbc17879c93cd424614bb0045631f7da45e8f893322b6117f7a203631940160a95131d688acd2c1656421fc58b0f465ef6c6e789518af8db102fb5051dde63b6913dc72f1b46b3fdc18c3caece01385ac61c4605f8b7b8811bd76e63472fe3f39182f2c65e4433ea2c212f7aab5c50df33eeacbdc178b14c7c72d899da26071daa0f484e6a7ea67982cdf0e945cd4902f7b7b2c3982ddeafc0df1de406575b7795ef6950b3be959cabe1e060e933d0f373ba8010d5f3767f69de853f8e44648be4dde982be239764e3d403d1a525ff25178d602338c00f60cfbd448d67312e41d0de1f8d0cca815bb5f03e4d6f643c527396216d181c417bcbd25b86cbdc94313ec76e01d61008915119a94dcccadadc1170f1d2560cb38a89c5150c947ad05ccb6666cc8bf94bd376d6e55f6c2c33c96f24f30c9ff5340c4c2fb9aebdc9819acb86042310c3437eab483b6c553cfe8a93ec518afd7badb74954377bfe14a2a016238875c0e3dbd26bea8f69af59ee4c027b06b2df4f12ffcd407981272d03cfe9162440fd9e51a9c056fdfe28d9f95afefdc86e7572dd2a90ffcb3aac1bc47b0a405281120311834b05b8decc3b58180a4a9c9d2fce0b1f9c4f5e11f53bc1bf82e2a2af8f6c6e2df8221bd0391a53a4ef3af5a86debd92b0342ad84534133a0610234a1720453c9ff9f9fed84fb00d79682660922a572b1e7fd099b261f039084f236575f9e9e8cbfc5d255ec2826103ffb34f41c44dd93c0aa847f998057fb4e00f12f761dc7ae2337f2b02ac715b8f554fab3388fa047f2dbb9132498734ff20373f3052b5a3b50a6c3c9dec8ad80bfeeea29892f8e4e4ae8e7c8ad9aa3c36aafada393cc2773abfabe997ddc5e1c8652b013fffbbab7c48ae76c9ee3fa76e25b3f353cdff24042e46971a06c7a9611415d33aac4407c846b0bae2269cf658e093dc4e1dc276bc21bc4ac289e3f5f4221d77f97af5b88b05fb639d78474f9ca47a6805df94dfef77b90c6bb0cb6cef70cef1aedd20352fc57126c4f019547ceabc1089cf88e44b3a2ff05000ca8ecd1607195004b3c88dcdb11af47933dff16e0c786701f03bf1cb6abe71d045dcef49641d9650eae41b8699f5fc2c8ed6ed475d1126338049878c37276f9febe86f4f64203ec212c8885058ea852214b845707baca0104b27ce9ca22a354add2d59328e13ae1e3c3c241ad3e30401e8582e9a4f1820149cafd1c526a7eb03bc755d4f2f8c080e460af6db0c71a3832946e16dd0420f629ead6ffc015912d83d6ef5d673e3ae9f1a14964c26b895d20bd5de2b63f78f5abb602ccbc243b7ad3c74b69543bf59f2e8362b8f5627b6557a96ea1995de95db26106bb3e0d16d561ebd65e1a1db163c74dbcaa1eb8a6daa5ea3f45ea5de81d9e29dc68352d636ce7882fc6220940c94d5c0b5d99fa5a35fda6ee2677d17c6a0be513a43c62864c38711d6e6e2b6b0a7fef7912edc561afa196d4f9cc1d984d352b711dff7220aaaa92da1406601f77d1c61f14a16937b0fe3d19541c47b6c9c2b2f4c5895b54165155e0badff3d67db41a80b881d33726122718da49ebe156f30a3a4c9d16c77971d349299406ca1beda1bb36d299cad865a8000fbaa1318ecc93db87006473b28ab4fbd8681de66695776ea9457d5f1aef8982bdad17c548c7e7272fe7265000f77137c326b35cd1fe3e967ea1334b60a738f4bce81ca3f8a6e6c9d1511bfa757a509f93c9ac80b721323f9f368da86949a5aa52aeaf12e860cb94a7323d7b5e78e91cc8007e5dbc66101b66edddce3f8c8379554a86772c71798f95cf1bb67659dc402a6f19eab05daa99917997cb07831104f1b99956c04106062b3c8bfcaf19ea49eb1dcbd92173eb9b85c1cf593e9c4927d04dfee15c0cfa0c0fdfc58fdfe745dcdac87865cf0cd5ec467336be346a74e1a8c7798ef2b95d1c4ee2f556f74009a29a2f0fb4546e7490a0ad0ef43045d8237bc248cd37a61185be2d21a04139086bfe0053d9539b5a62d518d67bdd9b21e8c8c7d0f38b83c89b74b58d59dfd266f83bdf5003121a31dde514182e4a86e04e6ad85881ffa7368a9ac7a53f9b516d9fe96a2d09e8cbf11371bfdeea42a9b581c03dab778063024dc44548c3e55c48c067f364328a02efb8e0f9b9bf38347d6a743870f78f8a0c30f1d76e041870f38680f185cbee2f2e51e40e040050e10b08081050e2ca00d6410e89a1c08d982b4630a91a1cb22bb387c16bace3ab1caba7bbf0cdb15a28f831d7c028eec9b0099c75e34705cf1d425d01a1b6db4e8c2c2f30e2326f698d86841524799afc57c24221bb4daedae9e33e6985119237c204eb3c596075aabcc82f827b86664fff34334fc083b88ebe0796bef802f2c7205a3be9264be865e13b489fa51fce4b7c4ef22edef757aa491c3b50fbf17479070224c63937f0aac74989c2a62a7cbf4a20a333df30f759869991da9614fcf7c4f096b5ae6132ef571a037f4498e1254720a1a3eab56ca7882504e792112472b652c68fd96ce345b83874bcb74aa164437f59a53c2e811a3f1931c93a5d7524348dacaa9904a2dbc5a4e950d80045deb797b6709ddeb9f07efc127f33644c516cd82cc81a040806c2d499189606cfdb764fe8f270f885d9124b5108d56fb5da6fe27f2c62f262999900dadff4de6fea4e40150abd2840e99e155bfcbd47f543660b24aa2c82331b4fa4b32fdc7c96b3e6f3f87665b2b75c3ffec2fa7c2ac244d1178dff1a745be28175f40331b90cf45ce171cee2fc6944e94db9fde08754cac8ea972e31ab968391e3a5eb252c5f9b8715600275faa015fc8df5409550afd23921076e2336ca788153cfca6d6ac825b82af5d2425406129fb2657d08b1201d9ee4ae073d06dbe32ac3c82de490733a5302bb3a4d1b29c83f49aec037dc0984f513d6c6077ac23641f76eb116be58835b69ccc22ceebcc441e9a12f384f459e186ac5fe0ad586e87e2982ae0b4876aedd8c60fa37cfc93f538393f7c50232fe0aad5ecd2350490298734a58cb002f48bb7bf34aa1e5868e091dc4aa813d7b6f4060a6a1d69595134a281c29230aebc020a0cd0a95122a8d69670bfc1c38f5419cc973298cc51fd24d1a5b13f8db43e459982c9d2903909f7bd374054ec9568f3256af5a849e1e184119c3405bc5e6cfd066773cd80063a826e45a9de87d7d7bd7a5f3bb03d381b3f5420e13ddceb702026761f4205c2544b518ed458d1234b9d6d5d07661d15da0cb3c6f92119ea157a5f203928a704e9060a5bce85150d0897b35c21ef6bf2f7b18e40b82dc039ae258bee3f3845597f896ca6d7ca8e9fdce35dc25fab85e2596a433c22878c953a0cefa05d017daaad8fbfd7428ba3eb531f4e3da2bf61c35ea94996aab7350d6aa3d516feb289875f991f7c29322ed04a392cc56bd4eb2858d6fbd0fa57e6d88877df602a6d8010db5b5c03c50582cae2450ba802f9fef05ca35eeb472431ad62942c42b14bd4b7a0b5d8a1f9db217f51c54c31d8db96b4ff784bf529d98d1dfa6265ea9130a1c42c32d2538710618938009595e579b26ad3362dc764df9bcf7838bcc0e90e5883a853a61fc8d30f8b1bb2c3e93a9dfc98de4a8cb5d208457479ccdd3f74b07d365f9e904800ab8c532c62f3fdc0ae4fd1519aa69ef3ca6851cf7de2b4a784e216ae91bc4d676ad00257974c8496479c62c590adfa6433bd38ff6280f22cac385eb1125b9d7906720ff4b90ff009737c18fc4c2eaaf956584e50fae87441c8842c9e2c2e1911532ca843c044c996952ded62d8996d6d21759d3a178bce7d625f248e419d9f119df5dcd6244ee80d85a124b4f3b4bc53995de2ee8ea63b743ba22eae4deb5b896c78c1cd917fe0440cd8023a014e665b3016564d0701d0bc9274b687a0a1ac7a3a9150a5645b7c32cd8ef96e2342e610244497da1d042267dec44835a3e3d7dfe9a6c2e3d597f2ec1d06ca326283180bf5cba4b72e5ca751e8ed331d867049ab4937b2bb6db9a59429c9143806100670063a4cbcec7018a6e22cc8d93b3846c6137c31343865fce2a7c5091846be05c630e2863b908aa4e00505cce3259ea0dad40e9ef12b1fccd12bbfb3be48a4142efde979a9e91aa491568ea19fe35f70b0d0ea16e0190c3448bfc33a634ed4e9953ffdd80a62c50798470c5107ad4fdfa6e88736ee905dbee2c66f86452c6efc90adb816a0f325cfcc61c91749660db3866dfbd26f9b9cddc854f86edbb66ddd1bf8a9eece04818df6b62120891bb70dd6608c490d469996662e6ad4f050f05abcd4d70d115b755afe6fc52f86effb80be181aecbeb6f92252833e90701a86af0f249deed8631c93041b7aabd5cd8f517c248ca8c531e11953288b40fde9f49c17a24e9f6499f84a164f992371fe4ebf8263a2646dbf7d5bac566b3de5ff20185362815abdea698941241130be6401c9dc534936942c6fb170644ed7f5b4346999960f4a9306e3b67d9bc73826cad6251281646b274a7f584d1f4a296e7c934703ea9a9ebdf0f4993ebedcf6de323d609bde5fea0d895d572995064bf16f37a46fe8b12b782608514602398c8411c19170e3730c430a41c48ddf47dcf8a525ae8cc916c7c4974eb0ddf2d61d8a4736db6fad5e6d1fdf777ae54bdcd8844a47faff92c2c172438f75d79bb40cb7fbc4da2545a4b8c530c2ae4e8cb02855da460df683a1f4db578218a4bf6ef2c556af76e2d04f436930b6abc148030a97c8fc7c7678a6a371e3e770c3d8bf7da56d2b75737e5be90b8ddcedb78f61ed51b100c7f0cbf03f47b85df9f10977fa4a8e064d1f4658e9e3c7289128f26021ea889f2afdf05e6890bb004fc3b2f00ceaa3fb541b51f8589f238f954f7de90b6d066ec986076ee95320b8a5af41825bfa1515dc120a13b8a5771f97b1d5c6ef7e3e0aa51fb747a3e0bdb47836b47c1123342d3f3ddb9daca9fb4a2dcfa56f696969f9f64afd2d29b0b95b8b7ff5c2a6c267c86ce1ee22c672c6d20690c209134e9c30e18409274e66308324e64f9c3bfbc44677ee48ee934b15dca11ac5cef8908d5846c4cca10dd309657d8565540e339fb35ebc9c3b3759368cb008ebaaf5fc72b493529ede4fefa777aec4bdc71ef8ca3bd7715e4c55f152ac3c0af58e7ae75a588e5a8aa68f8d45a230fee0c24e2618502f61bd5a21e219760115847b22f1da97ef59b8109887c993aa8d496db32251fdc4d45e09ea3dbd13367a07940710e04a1a9c8a6f6104e6e13fdfc433279b0843fd6a25c5793ee49b1e75ba81ea270d4e2967bb9c0a4bc7797189d80fa078d90047f5e26d57bb5ca7d38a0986d3bb0ba7d389f362e7c50ef8e56a74ad3ed26919ccef44fd83a9f798db7679c3ec8c151b11e6329161fce70c588c45d9ca17c62deefc78f2fc69405dfff84f2618b4a7df2e5b53569672590e4b675dbaa296b5ac652d7398c35ca6791c667ae8b1d0631e03aa61f2984b0b5ed9643c73e23e7cb6d13c1a4f443dfd503fe30b9b753b07f55ce984427da8a7017551dff3668261e593fe7507aa650d22dd88844232b52b55860d1d168b9f0c269379bdd1755ebc332694ebe3faf125ac63bef5bae805be235bf18261e6af70c396790f5f86182de3db11e6738558ec935255ac1f79eccee75c86fad0b5b8b15ea13e6ed00403eabd57ec545cc633ec02ea93a82aabf5e43a72dd7000e8bc78515e071a9c6fe35d61996a7ecc01c33fbf343c589c4518c7ccf7d8038e991fa1601d51ba280503cad442903a519fa31ce528944798f3541f57eae7230ce5026774b65d4f3866c29a80c19a4a5721456a074edcd9429026126f1735381ff5b5ac8bdab5c2856d03d4d74f222cc2222cc25c2e97ab63d665dae52a97692330ccfcb62eeb4515c376192abf010708b7655d646a81fb1419767e189182d0df9efb82a09e48bc49bde27e46af505fcb6878ee0d41bd73cd4591f5c2f843c45ed4b76be7898b894bc99d6114e24e53cb5ca6030d33bfab55ee4c92ddc9321b1c97f6c82ef304a4c1f95ddf38c433a5af85ed2312afe6f3354f4aa05347a0c5cdeda53ba5dab7f6ad7d6bdf32897946939adf9c4c1090beb96b9e2335d7dcdda5bb77d588b2dca79151cb9c48308a3cfa277d429bb8753e654d8a73e7c904037df926930bf4656f3fbb60199e4ab87336e1cee9ee533db69ffcab17af4d524ba425accbf9d348f3a6d19c8d434dcdf29c69c46acdd085b89af69dd3abe61917344d339a93da348daca335ad6a5aa59a4667f609259a840131ae87035cc6853f1709c89f1f83fcf9fcf32be284bf18e6d3afc8949f8bd33742e355fbfa42fb448da3005b9f5f3ed8482a65d3f6212b1532374ea6779e9442bae68e06979c160ae92ebff6fd53fbcebbe196d36510fefa9e0ddc73937e3ddd53d30a3a1a273d5c058264e96d4f3df9ee859d0bf4e517e4db05f99b37ffb61712b942ba5bb5a75f90ef7e2e2ef0cb975f10fe3ed9309193974ddac753c4a7b32bf5d6f3130a4bffe35a79d8a8237e58fa4221dd6527d63fba8d3cbe7efdc2ee5222973f7a8f2e22a4bb3ddb4faf47b6cce6329226be497e5607f66ff8baa1eac6f62a1cbf708d6d2bc7f07faca1041b3291df187ad545be31f46a48748e3f56eb86b646993f21e60b066a90b5218e639462e7141bbf5d7653355750a9e80aaa1c1cedb46e4ab1f1359304369adae1a862d82ac586b62bd929c5862ec5727472d2398ee33ab23d85466eed66790a8bdc95febf362ea3cd1c869fdfe6f237cb86da4c9bb94c8c5f5859072737d4649735a2cb5c73a818fc3155356002c9d204a7237bd0df60ff4b8fc65972435ba5ff468e9ac653ca97744ad6a6b8f159d547e0e4aa9f6327249669c76cfc8ecf53584a061b8c7f63111e975dfe19c5ba2cb4b76dc0c597bf11fc984a593bdfbf7f6910f488cccbeffd8dcc71074d643ac1cae74e5ac1b9c47fe9e8b98ffd26fcc25f101507387ef114a53ddbcb000488654064e815d3155a66fb7e1cbd00d6d36caf759119b6ff8000f5e8a6cd8c03cb7de9e38f1b84be10d5955f4b1e3b4c6d817ef30ba910d5c5d1307d3707229a2f1adbf263614315cb4cdbd7c3715fdd809c58373cb1ea2603e2322a29bb8ba2bb7da9d3b3cba0e8a34edf79b63eb1f3a70bda160060990d300e9ed956618edb262e660cb8bd7d4038e60656a64a5ad89932e13852b2b70a51f570cf7dd732dc77bd5abdf453e540a65aa1c16863c3f14b0966ff86f65f473db840b431ea34d83c0dfa336955af5cfa79855eb994ba94f6f26a2eda33cde9238fcba0becf457e61aae4d5cdeb4e9a14e959961e643ff1da35857d97fe03f985f6081b461e96ece453cde34fc528e58c0dc425e19252ca29279506fd23d19421cb4fbc985c1e2243dfb9fe1e4687e924dd48542bfd429b4afd83a04a3574259d73ce49bfd2b74dab94a6ce054dbe8cd167e59139cff539b597b56af4e5a433c618a59c5156227401bb0cc44512175714b1dc9d5abb59a534c90665dc3c1bb62f51ba3ddf59c408cd7603c726097cdbbb47bfcda7177ff32f479540d830ba22d18dae5e19b9e2935ecdff8115f10b08a01b46d70f500f01c1d3603ff703a557fc469be9c81870fb239147592c6a999b0af43ab284db1f8f5a66868b5f4024dda6697758afbc555b2ee7e9b13eeb954dafdcbfbfab784e7f173528336ab06d832e34ba5e3a323a9d4d7dc4315ac87c9e8baeb6032b8ef4cc61663c36cdd221bafc4a3213c0e5978eebd66ef786c83b836543f0f28a141b46578f8eae5ea1c2baeb49cb304d57b1feecae9e79add6cefa8805377ad53cab84d5b8d33e6a5dbb6a75530b44347c5ead28433eb0fc6ae1b46eaa14965f4110ddfefb0a0286c4e786f6320e383724b9507352cd84e388fd4bbf9005474d97c271c452b06bd0c8f597a6dae00c6b4b2b65f8f15c7e2591bd5a4939e45c7e2521baa9cb2f21702ed79d2ca2691f91ae3e6a834660d05c238299e5b2cc88e5c7f16bd52a33330b280572434424a594d26fa494ef3d9052fa34729854b325320303f887f6a994f77815ff75da35683d9562dbfeb306319694d87e17c27263c764463fba7a7529bb82bda302591cdba1adf50bb5af327d0ba6ae57da0295eaff05ccf12f418ec0e10a2f9a9802072350198a02d5c410b1a4f3e0bffc531c9c30318215485a373842468305ab050ffecb73385e430c248678525be5844a2983094e68fd04018756105e3733909bcbe5d7cd0f38377cd5c6038e9334081bbeb4d74523b733c56fb7b98d03db1f5fc6975b30d13a4dca287bd52b297f72cc6d1d730e367ecbd060d337c2317defea536f33f988b39a205065303d407efc38be274383fdf168c804c2737e913ea7b5aca7cc6e7f57e955a83d52af82683de319eefb1b0c9ea9dfcf95be9a60d8be725d7fbba556833c710735638e3f10f03f95b2b6bd0ec9c1ba4d29330ce4326c547ad22b59fa012292d59991cbb629a526b7e40a6bd206bbb4d5abfa4d5b3a3c37e6f20bc9ecaec0e64e9bfa53aef7216754a100d5a15e815f80efe74ed9149edb584ab030ffa341f9df53930f982f8606e517f207f05c9d39ccef6850febf66f201f3b1d0a057008f65e6322902f04b0a5f0a295493033805f9b9b420bf22ec30e10bd7bf8713c00b532f5e68fb07e0850cf479e17673fb3d6f88bcef85f5e87694b873258b48cdb9fd354249bde2322e5f0178354249433648643776fbb9230e894bbafd43653459f150194ca07485f58a87be30ba1de5da0cddf48a932edf007835433743ac1e62e9f48a9b70f902c0ab11d269794b8849af988ccb17875723c4c447fa0425f58a9970f9ba7835414936d3e6a6578c74f9def06a846e589425f4a457bc84cbd7865723f444e84713fa09aad22b1ee3f24d7935415582906a1052935eb118976f0daf46a8896b73edf48aab5cbe287835423b3c251e219c5eb1122edf16af460847288713ca7925f58ac3b87c59bc9a57924d67c3a4570cc6e54bc3ab0962e263f281d22b9e5dbe33bc9a20284027a0209d5e71122edf15af264827a8850a6a15f58abfb87cad57f32a32b246af2abd622f2e5f9457f3aaf2425a79210535e9151f5dbe27af26a849906b4690eb75d42beee2f2357935afa3d78cc66b76d32b46c2e5db793541372c16164eaf988bcb97f36a8270725a729ef48a8d2edf9287c20fc7f0ad09dae9156f71f96e5e4dd04e833c132fdf1a261ae2ad09e2e118be13e9f6cf58d39eb32b5b48d5dddde7744dfbe9b94d839dd43780ec0c2cfdc2f8e3840d234bb2644e44aa3f524a29e597d4603f514c064ba5e6d79f065db77d4a3836ac3f40f55bd6fa55a09f94d6efb3590ed315e8a72b6a9876992ed611697bd25dcc65361f87e98f3737f587339ad59f99830aa509f6873b32b9c08680185c6c2f6d21a8ead19b07de1f600dded4930a5395c14e1691404c3c333333333333736466e639048ea5a5f2f5778c5fec77f65441dc0db65ba8bb87b0dddd0d85d36e2cbf9792588e31dc86a25d62f91987eb8e1e8d3a9a474719756c1c332bc7b4182559fc90794e8e71e4b9dd5a0b0876caaf2453d22ea594ce1db9786b5952388a5e47b65862675c7e1da9a203b2a6cbaf23b02340af1ca224b86d0736fe9cb16aee533c0fc99b037bf930e5c6e5d70d125e3e4cd154e6d4c89882e4089f2a9e009a4798dc9cb3ce39e79cd3a76bb2d61004423f9c9f6a50c530efe57c1c1868b0bf6ff8a9d4a53df0d0f4ab7638c065fa2de0324c042425897c30c10d5086a0e42849195618a107583dc2863616416ace79e4a1094552caef80e2e4c5d728f1c0d5722f41044f5c30d4048c24aa04516472b232840d6b0e02f02801b3a1e9ffd84aea8e31707040920110621c51046e0718b89cb4a6987e2ae931b048a26cc1c48b8a231f1a106165872326d0e18d10e16ac215537c6c70f38316540727350c8b23d54b14a008402c08828b295ab4643338e9f677a4020c25e4c0093a104216850bb298f1aa41c6ebcc82165f40e1e201064ac086c0c21a2205f296925849d32c19219d5864872aa694dfd28ba6d9a629e594372ebf78406254f9bbc70e7f61470fede5cfaf477bd92619d9b463c70e4e6e68bd0b661a1f3e6690c1a956b7908d924a0fa4c19ee1853438c30c0db60cdc6f5ffdc21dda677afa491b1b1aff4226a232dfe4e16098f99dc7c2301386a3fc90c8957efda3a1c895f2e9fbcfaf87fbf9dc94dc27039106bf6db6d674a856b0c0c23fe832d6bd1211d6ba0c68bf0adb03ec86556ec840fd04fdfa4668aaf63718a199cf4f6be2759180f6f563d0be7e459cc82fa2497617ff5a87bfa70e3b0b93e58e4844eac1d46f3851d3e6fc18a5c1086b30bea66930212ed360308da857dcd1a68937a26860fbf93ec14374c1cb4ff0187139a7cf496a1d26ba3c803f1ab9fc851e9b532cd7d06712689afab991c3448f1941808b70e5dfd0be1b3588261f377060e987f5c7f663fb9eedeba91f3b8cc680d7a2344c8cf9a7c16031723c5a1128a002a6800ad8724cfb70fc12c6987d21bd7219b6b388fcf955971828fd8c74c7975cb7aac19abadd2a87e9e698289bd0a7807cede75315d0e71e582bd5ad5d6aa50aaa76b020e756356687e1d98e84033f65c35aea61c70afcee3670fc32b178a15735aa6e9491f3bc924723bd59f2a48d0dcde671144059e4d8d0d4a6a11eed81c7a3d8bf59dcfe66b39da77e8f9e50bc57223708bf90eeca0fbbab451d21bdda73d411ca1afacd166e95b7f2dbdb01dd51ea45cb216887242f08c30924be38e293448f0c5a209484102ddabfbc6ef82aea0445a20b9bb22cd6f61147221604febaa84116494fe8e10550d0780fcf102b3c4a5c158f0f3c371c1951ab5542f9c1050b9f265d14565e7ef9f840614b435897e1eaa3b3430d2093131f1d8cb02832b4cf8b1e583a1cd8ae0c5314b60343c85a2d82606b44e1841a846185e52ebf7a8880434f151c5f3d51f0f03c53bafe36e5a906a9b0337eb82996461137b0362ebf7a704c3cd87af9d573c331c1b2cc8caca9082619589315dc102c0a975f4600b5c0b65c7e19918418460c41a7dcb4cb2f23708c40b21da15625caf0028c2ec9ab082d4c48bc8a8882caab0827745e452001845711431491e455840faf226a78314972e1e71b9f63fc513dd896a194524a29a594524a690b28a594524a29a594524a297da16070fc926a50feb8ed42545d8332be50abb5a9d43f08aa4cfda172ac7fbfd05519f2d00e16542b8039fee54a1c2c0dca8f39d20b8e3e7754ab704c627e5ef5741f568d4be188b2044aecfa3b8767627784b610445cfad11c73b3b1b25dede3e7b2fd90f8c22beeb5073907ab7855b5f96ddaa2dc9045eb9c06e97bad537be7527904abf96f2cd3a3c63c6b235cf116f5b9f4431bfe5aa779f176de0a0d43bf87cb748ec3d04fa56ce71e5f7a555f7b8d6bc71e399afc533548df5ffb4a73228f1f78467bfa8d8457a5a7df41b0cce929ea869d63fab006fd93a7314cfd92e70cd6fa26af7ee7d5d73ceda67b1c9ea6fb9c687f83ceead577a79a6b9af4596783254d6caf7ab60f6bc7bdbcd45fb12bd86818b07a2f317c910d23a38fc85d83b4ad8c572cc159b2e34ada399228ad890d19e87b34c001b657dccb68fad40e15d87125ef649ab2769e6cb0ce6dfb367183dbf62fa1bc46aef62ef4b321cb8b7421ef1ae313db1fe3f768a4eb8cd4a0e7e0485a955e310f1cbf8434a8cf2e2b80f534f343130b2c15cdfc10b5f102e673f47ae8cf4f2b6a18d7649acc191593ec303ef324b817ce0527c0bfdd6843c2869c91911bcd98586d7683c3d3dce060695032cd4365c107f0a71e4a088c00ffe9a1aee004f8bba905eec60f15e3187fce8db459af909c63c2f59f9c11c7f86f48d8509371aec9ae6761430d15bbeede4c93d8b076dd326a4d03a806edd828995d035c7e25617239948cf2d677f72929ce0d89b414d28511866e87a8a37fbe77aca8c35f7add0e5187ff7cf926938fa086aface1eb5f1bd1a23be1ef89183069024504031b4a1b69c342d201c9a78de28f0da5cdacb3e950447136e319ee322522f24cfcfe1ae287849571b2db59fcec72fc42c9cdc0c819da22cad5feb7ad542a751539297795063ba96748d8198b6772bc566b396dfbf95c67f2317bbad7bc1ee63a1957a59f5fbbb8923ea60fed4bf5b76de3ea56b76dab5bddb4a286e998c344260d33c3848426a1424c29730a554297d025530a455237fa023a840d59e812ba33a5d01dba4395241182dd85f89082e380904295489952a89239654ea13a730a0582ea00f13cbd06078323f3298c58dd6d8c310eb941c80d32e8c8e2deadf2a1fa80aae50c6e4c2ea02236a534206309a423b62fbf5a63e078b5baa07ef9d5326a51b1a158f0649e39b0f1e39c4558a7306cfcf9cd29e794ce84672f38aacc8f7ae9f7e3093636944e728c427c36c60d424370c7185b4603901021084a1223076e78ed7812e7b12b60bd4a9ccd4c9b0ea4d10dabd16d81bbdacc2a99dd66f71a62382ebf7ec0c10f49975f4a6c685c7efd60747d78c818fa22cafdcb435e40c1c9992edda54b9f539bdad4e68c382ea7cf6cf269fd93c96c35d8360210c0102b0001680100003e3870d8b8b8b06edc10fab1612308299572d5a8c183020a42392d2d362c2c3e346800cd9811d45a5931b2f685844205b94ea7d7cc6462755d0ecff0e59e6f4d50e9f9f2dd9e2fb714c2c26aacfed0a30aa502d528958816514ae5ba74775a2d8d494965b76994dbad067ba784544a2a552919958e846cc8197148672127931571312a9147e928f5b3e386f5c759edad26b79fce6ab536f5a02ad2270d967e1aecef3e75e7fc4a4f6888a531aaccc69819915174a9c81a5cc246b44de1dc9b2f3d21dd967371b8ee885c7985edee86739b0916a96371469b0d77d42bf9dc8c4bba9d4d456a30a9757be7f66b2a7836a8f0069853856703a8f094ce574185cf0615debdf9a9e02a68af82d675ac065bfb3a9c201bd2275eb04b67bd0a39225aa557216de2ada4db340a51afc2128c9bd22b7eb900e7f69760bd0aeb4f945e851289a85721673425f2e8703a180799e6a8f4add5653d0b15cd0002000a8314002030140a068442b1482420d184790f14000e7f98447c5c18c9b228c861188610328610000800002000203333330a000fdcf898a9bdb39ec031240594027a0c17b3dec280979e012428e1cafe59e4283686da0ab9343a097d30514a5b6b88d35f94af28878f88f61713f9b68c7d421e6249c8ce42e63ad4ab1b8c97d653217509b44fde45e29db29ea06816bc90738c1c1838151f7384640e36a52a8ba0b54b6941356acc8d161aa49bbac96cd914c6b59eeaacef41855a06737eb59962e23ed7b6f5d464f0413760f5d9bdc941cdf78bf6f07d4598344422f881cd3a69cbcf6e303b30b4f8ed3ca3f4f1677c1cbb3ba312f4a847b8c49105cb5336b54ebd4a95c4a0f13b9e9e98c0cba09c5bc7bbcc797794eca2c893327650aecde501be1c24b911de624ebe04e892ca0dd8bfc8656f217a1b1ffed58bb4b82078c4fd86215dcd8726e0dd62f2aa10ee352f7a7cb84b2f13c2c98fa5481f810a7592011093e96a1af5723e123dc500a2303301cc5228c7620b37e3c14e0ee1c8fec56765dc6d44bea0ca52a4567e41b3486c96575e2d158d9064ba1d55e475b7539e53000a8064ed4f7581f589da51f00c13922a3c1137ba6134386d378250b90ef819654df3b01d5121c6680890e1c6f5fedfbadfdf8b6de3c4e6d0375cf8a782e3f18320a0b6c33041b27cee4cd7442712fa26e69d6081d95154c3935f077484c10d5c3f637415a32587955d4f69d52e087436bae1dc279292a893c738f28dfde146c5434aa1e7afed5d88bbdc45cd0194770d94226231efa825402240b12d3a15e22d3671a2fa6acf20c4a856258f96f52133a9efdf0f24f92433fe834641e8b19872194c78b45641d9b7992052a2f35225834cc0a2359069c560285a933c97bc0d0d908f027c311231c55ed1f33272ce1e67c8e792065c74a0c102bb6c5a64123d45ea0586f2f38a30da1504b9a82801267767554961e8a4e1b890ae8a5904919f13b708bd46e8bfa3c9cb0822c7d56b83b6b089bd3ea542b75b4fe0bcd98c27b1aabf97d0904e58ae4010465c8acd5b7425d2c1f34338d8a4a0890e0f47a0bb1907b40f196bbbeae5e64f28bc1fac6dffcb85f0721e60144c477421e1831c0504343a0811524ae2aa9e0da61221896b02e1b8d13da3b7afae9bd9b5908541e43930c530223a51ec38aa06e7004be0547ecace8ed60b6ac94ef6872ca5be0d15106249e4f2f920b895496b8fb12f9096059f1da12485ff6dfb28751a41e84285028b9edd1b7b2e9c845ae1ed7e23dc76c2cdb00aa5f5230cd116dec71fcb369e2d8cf1030036b8461725b6fa22550856b128ff4cdbdd0c409a811020e474740a8d8520771f673b81bb48a021d9b388ebf9315caa8eb00bc4e33735518072b63b96f0ff1d77d5c8be8d3e8c71e1709cb90693e42000a239a0c168a1561ae01145cbdb24990f75ba479fc2d4e4649f0ffe1e1f97caf62df5cfda38e7d34f863c2916604e0d28af092c37307a94ae29fb8477c2d4eea0322e3a379618623b4ce3cba44580045cfddf9f874957cfe6e0c3d414da61aa670f400326b330729f7e13ababefc293791439c8deac427284d71e44f845a8fff2c8a2eec374d5399fca95bfb0c95597d2a2ad6166642d659a35e89446dc40e052ee56f1afc03c7434f5458cf327c35169cef1b5454e8e8aec7417491d27a9e5f59e7f707b46ad3f9b1ca4e469388be2651075954c8439a6e62f0fb823a07aa8883875baa7aab791ad45b4211633b2ee0bf0633396e7ac1a13fc225775461ef2fc22c6fb8b8cd3fa750af7062220162b644ad4761b1a06eb85defe44b70c148a3d3e6c81edaf5403ae23b9bcf3ceed991a5c8be7a6b1c56d81a2c2b7ff30ce22a835c35bf654d35d04a1f44c9aa5d34be85234a2ab9708456bc842093a0c286e2062b678e7ff2ef76f4a13e0673dae2ab19e63a9e592c4df09688dae802ac14c146bcb12e9ca4e841ef20c7282c9f77ae45c7b7d7502a0c827546c84acf3bfb2b8614c584952ea3a6fad09ca6c3a45925aa2ee81c872e2c9d097a7f4cfeeedd4a6256e433fac4f35871437d7b63ca773fbd90fa1b4dbccdf38e48b96f224e32115ba551e36cba86180b73c5bdfa22cb6c27b4464b9388107f1421e621ec853140068bd28ab9730d26e75efda51ba7eebcdcc048958addf923afda4f94b6e148e59ab95f93049251fdbacb2258e4dd6b66270b33d845313eb9c22198c5a7e64ab55c2610134a70d5cd7a9774ef8b080494980a2db1a5ba52cc318faceebde7a7d6f1739899a687fd48e501de716ac3e60ae832a0d8fd1de7eff0ff582f217bd05e7171fdc57447e09b866501c81f62cc9db424e0d9dd89bd23418f75c80c29aa5d599f620b45ce5fc6311b4cc3c6263796a833f6bff195c198c88b974d1d21382a6cb1bf999b323e0cfe5213113aa2954aaee57ea6bb7080119ed2c45869c73bfe00889cf28ba23ec5f08e683fcd25fc3e174108706382f70bcd50d3c0420fc15d2bc3e8896f378fe8bdc33b3cbc988da2d3df97de3579e9885380657a482ffd54f659b6629083278a0a03bb5330086071903f0b2950543a41ee0fd0ff67f9c671275dd92fdbc5fd201147e8798501a67418914fe72abc68c7f8b167c95cb4649f34e33fe59e10287eb5624a5853ea3e5e4b1a7e81c14cf61eb9426670bd17276408abb59f9a6abf753ad579bb9f7034fc3d2a7de9f7d71bca98ff2229483beec6122fb00a074b3be01432301990002024a80aed7bc2e1944cf2fc686f9653280314187617e17bee470aae127ae8a7523fd2a82abf4788702da713102cbb963c4ec26c0c07f024bda0521dc755c1d19f9155e19b527d0fdbc1b6d7e1f74dad993f2674a8ec72cb958aad31f06e9ff5d2256b08a25794c83fc4a8dda6679c2a054bba03709015c61748dee9380befc3b6707f03cd2254e4558e751123625fbb159043b749df54324644dda133d680816e4664c4cafb178cf14c000128d1d748f6efc2e70bc6be2d340e06d422a456106222582120f8ec896a9530f2c8c2d6041d7d1c5b1aed8a707bec300289322ba3e324265cfefdca2dcad6e666d0e5242bb48f597618114259aa62e9229d21f11ab6ccec9cf49dc3a07437b8baf50c4bf4f38787114bde3c62f4d838a7c4e7d06106c639d67183324e535ee4e52e5ec7110151528fc764fdb698b6bfdd2d6c3719d1c4d5ac371345882cb69e128d199786dd6bbad84633ead9d14f383a3d88ad80679b21f194c2956caf98f639d538bcddd8251fcf4b43d8762ec1d136d8aa72d78db737af7a9b63d27548b6927096e34c49abbd9b7d2901cbda000c95c9a5076d14bfc126d2ee75763467b812b7d3d6e40723d07b802a9afa1021a99bbe5efb72a0cd3dbfb7e846d63b808f3a67dc8b49d2f63898c0c5716205af43bd72c4dcb61e2f1772eec28e398db3557fde384c24ab94a4fb939d90eb1a6e756419fc537edac14b6abed94671b0188a066cc63c811737452d6eb9cd0e9f8c70944f209202a751b19d9197189b4594fd6983e402364e29228bdb806a4b59fb4dac274e0073beaeda1ef67576e152a54457722412f9b7ab41f435472fd343292c9102d95b6ca5d1822e264bc0b018e74de9052aa0b7a07ce81684f92bcb78898f25a4c5eedd34708fa5ae20d7b0ed4a94b293df33a546dd3d2f1d53b739066612215080980fbb7e8e6231da7f3b8ecab4359016bb991ae8148fed98426524b67c8e0bebd25853c406fc8531e06b58f82db92c0ad01bd20e058a0b5b28d3ec56293a6c09b0ec05650f44d0cc87285d09b209a7d2591c6e2e155fda7e22a6be2db9946e264b9d3eb7be899e83c044210d424f48760325f8239ea17150d3341189f2f8e89edea2242c518fdc02ee2a5fbb2da03b5686ce31970297ff9fd0f19100ca3ed7cdd06f31a5d00abaf5bacc309c29f3ecbe83489b9842fa27814fab0a04bde9be5dd9baf62092cc2a9d021caece4e92ec7567bc282061774f9a3bb72d7fd3024b2e0346e055af54ce9602f9ffcc0bfc75a2f41bec00c5e4d0c0e896450071e65e84b7b135248d7bddeb6870142f13993f652e41bc3427e9fe017e26ee91f849433cab0ef62be432dfbac29cd763b95d411daf2d0756e80add8d192b2403e04e040406dc7f6fe501482260f57b9d2108b8cbb8750e7c23da6053605a422dfed947fdb05b4de33c05621837a557424db19f08458bae8ba4813e47270de6db41561998e2bd03f35a925953a8f45f48ed9e2a7b99a29d62dac8c125a4d152bcbaafaf93541cc5a9aba342fcc9a6a86066a32f0d194f79b4a5417e4d02819cd4ccdb8957f37c2ee92e8fbb809d38d13bcf2fa329b5ddd839b01b8028f7c61f93b4aba73630158e79aa5ec0ce18985b5cd23fe97118cf7f07384d520f1c947382e5abc5fedeaa5d51f1c6531818b59c44d2a8d9f613774eea82339b7be421474df0097651827210ea442f798b2cde012f4f686f6ea9ed42e1e9775cb933bcc36305249f8fb526d9eb2ac332afaee46face44294186dba18de2867603e369403046dd0363c3d85a38a487d96beec93d4dc01dc916ced0e968ab76ac5952839192cf90f2fe455b565a47a73a31b73eda16e9f6ef2be4110476371e9571ad28573eeaf8dc4e3a93dfbc1a90bc84ad2a399ca17f0d8f8e9a386d52b16c5f6984fb9ed09ee574dee5f8317b2acceedca520c0bee4c2ba6e3640c2ccdfc5852ccd5aa65e1e4bc61af690af78367971bec96efa7692e6c2119d6bb394737a7829e3e8800f6177c94ecebbde089ea07f4b1c7a8c0e963d7fcfc8bf0aeb3ed267dfaa7f4a7b7a1603254a6f53bb4106b36fa74207b337a5e790b40df73224ea695edf7e4539ff4e931989f897c3ee3ab2883d56510196a69290acc4f5eccb2bf5919364bc2729c0f8a159be6bc3d808dd8c5ec68e4a43c18c8dcba812b1230b60153ffc5041f8487f40f42eedbc451efafb02920fe94457b99136496ea3e24ff94d4063a94f7ab5981ca3670cf744144b41061453bd9bc4eb6bf5df0320eb91f3d57008f24040d157c293da260ec01d9634d1d6025a75458c2955746602ab724b4bee6b2b8bca30be83ee8ea27a328a6861441482a877276739ddbee03fa5532488ace013aaa0528888093da4b1d061feccbe3fb1e4e7084f9d3a9048e858e54a6a6488bf6b614652d53c00eba4868d5d1782c7e0a24509689eff72e85e4e53322a5d2caf540f9dc93faaa4a893c94b81e87c1a6c4baaac8fedf387d88e097c33388f654ca1bfe74218c46246416d96dd24dc25f1053827b83bcab5b0f8124d45ff3ebf1d206003c519a4a9b3d47cf2e40c6611d7563443465635a66db8d8e4f82fae21a5286c7056a38600f051b9b135abc1904c9d5881a21f2b352a31b79e4a7c6455fd48db82d7ae8dec6898e2ef9b1edd2371aa344cd1cb4b2a6f9cce4f19a628e8c2293f4b195987df88d4143009017a9cc7f486d3ddeace7fd8539c7e898d7a43cf54cf4b4953ddb31b25fbd5e33f1f9321406dfd1778f27167748bd87b22a57a9a1dafcdfe98efa3f3e03c180fd90cff880c852850843099112746d8ca7956935a4e715aa4f053ce3fb92c576e912e4d052d4c2bad2921dc12c7b467b0003d42d55c34287c87c1b420845d3a9c6c4cded609f5926c31d76ab3aa982f6ea15532737869698c7578a1cfabc541b30620b9167fbc89461e03d2d578191322024bd3a8bb9bccab6e92d0ac0926206f7ff0e612a2b402fde32f7c9f0d7be73d89ec1151fafd62f8c96a191ddcd0ae14788672df6feecf3c18bc612cce560602f1402a8b8e64e1ef9747c6579c625b8383449642fa1372b37737f5a8b5f783117ae6a1623161cc8ab284050529e0f59ce435e7bce310037e319f15874c7f3852989509b472f8dd166e94c35cc184a55b7392412ebfd027d8d75884033010ce27efe776e2f9029a3f505b7e7bb6e5af7b568c0e3fa639bfc6bb9ee8321ecae1ef07eb8ae7c7b792e37816f3273da7b41f3fbc88cd1fd807d888b796bffea8867818ef1ab835def6c256e2d118bd7ef0b63ded67c1a65cc1a85315971afe41c1befb3df952144513da6e43ff8b5fc81c3cd7151557a328007746e6f7199856cea0a5d03e76ebe08ce010a600b77bd06b58a8342a35e969d36e38e261423d6c89261898aa10e9561a8ddc82e03f19066fff46f3ace4cc2d47aee995cccc116942a4a8bd0bea781d232b3539ed91fe015e441784abc9975c6626da3c993a671aef2966a4db59e8842049f058e1913c9bf043797f2afa21dd627abdb39d046a8540f51aa61b1439a0c679256662d013463666520f5b3ca468dc30b2c5b06944fd6b140b8968650b2ca04b9e0453f930c36e3512ddc26f057f7f42bc9dd8a1033111676f4900de29671f4dc5375b24f66bd1251da2c3d2430dc03eefe91e3501854fc06770cd342085b2255d0cc7964bad82723a38314780d949a0a6a96f05be156c874766b4d46aaf1f6836476e43218a69be158d12c2edc6d84f89faf098d9af1171a9e568d0604473134723e1a064d94313999ae0561e896313cffa055ddd2a06574b22bb5cfb61fc0b01918dc298e0f30782b76c6ddf3c1a7a0f3934aa12579771958885c7d062f7c027995d77d99acd7407ff0696e9f81c94d8e3d84a6be9a4fd9c4a5031428bb2fa3391946058085c6f179911d880ead0271ce1cd5644c5b03e899875706160c8284ff2ce11eda999fb7e21250c536b9d43e53fc6dc20e12d3fb10323f9f2e3bd85a6eeec302262ff7467dc08cd78ce9db74a59e2533c356336f580a7aea5d93db941d75ade6dc7af24ad2567eb495ccf82770dbde34453b60d15b8f57fdab56f0014da7a6270ee49b4daf9962456ec2da733b445bf5e47474d4ed4cb08ce11ac5c1792b8d19d5c3ff03710870000c28cd9aaaa9e7ba3bcfb0e8bedae8c09d6d2f055980074edf3128099756a62af9f0d6c3f68e4a7fee9ab3d2bb05050cb101462b76566a9ad2d193511e20a3c710438daee6988858e445ab63161bf7edd00c6148e1071f0fc58db4620423c8eb0d9e4063f09481dc22f55ac777e4cbcd4a22f66e6ad5ed13b64cf7692bcaca245ea17880bc85853ff0014b818454759e62a7e3bca705dda1544beec8d0ffa3862a3474ebc307ad589272e90b92beecd5f98d7e816d907a8df2df4ffadc5942d316ef5c172fb339a9e025c89ff001d53bff27f2f63a026c395574633af09618073bdd97038ce597a17592ca545591fe405138662ba9792730a68c8fe1f8c0f3f05b75e280074ffbf94fc3d723024f659907335bd0e89d4ad4bc4cb154bd80f388033e3de726df575d1b140c8c20b6cde54dc639ba43e111be2a32cd29f85dd8a6cdb09f0c26cc850782389e9233b30e72279467204be54672e89565532022b1e9842219c7fe1e60d0b8222b7bc3e11b406b73dc82da923c15d2507a503d2f83f7614bce5f72d14bf96a33c1c56723dc2dc04e8443078b759e388c5658b91f9991a5aaf8d2c0dcea1145d505844ed90858a1a0a6220ddb0e4dd35c7a6f9bb92a4ce3964ae4e5f0aa67cf9c91bd81cd76773540dfaede11dfa29522365b5839b43040fbcfe30d1edb555224090eff0639822d6a93af515f2610f0aa80838269e101f767364d266025ad3953e12a4416a32fead8f895d26cc258611db5b2acf699f63aaeaba3bef176585e1ecf69ce5a2d4698f2348d8600953d9f53e8f066759333002a4d0c33d585b7ab22284f7d08fe11c3c5664b18cd2aca84594f996ab466a9b92711a75d2e0e9f86d632e2ff31da6465db428021ceebb104fb0e713696643488ff4734c775c290055278093bd3f6b50dc6153c8a83ea3abd789cdf7bfc66b0109a784fd6c9e3ff033221cef8ef1c3aa0bfd934d186fc967f120ebee771fed24c67221779cfc601833351c08ca28b9e762026a3519cf4a9d397b3c9f304780a64a1905db0187e138efff2f1f765e26bc5d9479cdcce75af7877a44aa1edcd661e60604c20e321f782634899be4fc5b25bd423ee33fe041e4a0fb18727e46311d8bec3e225e1fe1c591e244e91030d9185ca12f7050aea455ac6ae22838982fc687556a0ef35969357966e451a0383fc28d5a7124bf5ebfce3574ea06bd6eae894113c71495425151817b2097ccd784a9f7e3322f5f3be2eb6d00faa2dc1ea61715596aca9f27de26d4ce45af790ac11d2e101c4e91efb800a2cb86fc1d65b4e2212e019f15bc7977d15e2a9cefc3985cb8e18b31124a4c9ecfef1b24cda7a8008e4c3e389157096e6950dfb3ce1a1a085c0630307698b904c2da417267130bc479887368bcd7a53560e22e6e19be2f32d08888bc3e5c70e7b20bdcc46c8817601ed838aeb7b7dffa1340dfce268dfa8a41f4967be1cdb5cf09448cee49ea198e7400a66d7cd89079ae01e880f5c12d4a450a43c7420a11d3b21eaa87687c00bf14b73ac1ebe1d0035ef86a67671eea01b3f6e042d9455725ce848efdc720aad13373d0d072aa3183d04ec50ac912362daa62a30cd5bb2391b0085dbed0c5ecafde4c6084e425f301da783f83e2ca53e66b83c7d8706806810b6f7ae9d424124f98fe8ae5e30ba5e58370cf5f50fb48046da2415bc58c4e7a9526ef98d1ef12d911a0ed88e06b2e9e08b5700740d99ae7021070805529bb66a5ee66db9a6871e90390b26863e3ac2d6771927feb486c0f368b0d0fb197ad728b6ab2ce3640d734698feac04555e9b9a75889dcf8e90e9db9bfbc2f3f4e731bea01d9126873a65fedeba28dfda24b2f144042b5c386049683bcaa994b01b98ec365a97b61c35437f124fc2a6a98f0d08f2585c5a38ad5dd71d2982689438132389b7c30c92529a42a8d9bcbfbd11acc54275476014e6e0012de6e002190d960c4589133d2ea280702b2b59a8eae5feb648eb6262153d9981cde99885f06aeb118584427847b59f3c448987190db1a03a31645b8c670d8fd1e317668bc793eae124c589b478e59f47a8fab939f26df1f294eea96013fa8727a53e2ac0ad37d743dd3373c8bcdfe5e9f9f7e302d9b05aa1595462196d0b67d065eb94b359bd7926e5b11b05f835080633b00739732309cf74e388e185e498b62cbe03917f6a203c7761342c2ab4d3adb5501667b9cb1a8c8ba67670bbb06fa085c14537185d2fadad075736444100f8b8bae33f68e4a8e71fc1a95a12fec2a70e73bfce841b7e4d685b47bd610ca0d2c47bc15c6b6a132a241627ec017a0ba0d838e1b1a136f3434d688d972f43d62650b7ed6ca9833f168dd6fa95a68d14f6bf56f88bcd8a057a9dbbaa77d036141a3ef769017a725f173490f4bee458547dad184ed911bc0bd6b156d1d6bdeca575ef001987e8b41d08ca679aac9edd88cc57590797413744b1b335ea2bcc932712a019ae916b2b3a5b61be64d46e44a501b2f1a2157e6752868b9e5a150a84612c4ae3ce19fc4d6885eb57c9067096d26b90c6a5cb34f35856c6b6f1d15e4ca849e62421681d59a8b4e5125f448e5bc424aec2ebc2f3e6ae6218759757843d68af375f896d982a3c28a5f4b2966238a8684fc571a707d4ae158c722164c97b4820634168ab95beb11caa5fd4ef2289871683a52764fef0ccd7dbb5f8f9ad119259d82912ce8e201a70b1b9ab599be339f4917fa0312ceec8ad15e5fcce601fce6cfac7934035ae05a415701605c3aac0fb3339a8db34e91de284974a583d6f3be8ffd377e7205fb41e58d06992643add80e648379b78b17e58db730ccda52dda56d688c9aca1b1bbd33d7f41dea817aaf941b4bc5decbf027ce3253adba1725e519ee77dade803274308d6cb59aa434711b07b998680953acb2632c64d2610141d0622b29ab606fb7a9f9c6f0071f7ccf1aa42b8017248c6cf5ae6036e92b6f70467ceaed6f1ac95985444baa108ee3f3ad5899353426ba279fdf423805ae5c3c8f5c1e21abc116ca83dcd5106c630348fa40e4fd292f71e61fb50c1c6157d1e95f80395a8cd5a5537b6122fae61f86fcd1d3e04d026c7393ad865fd15516493db1c8857fb1ed5b595c8fb96832a980618f35cffe3a442414287b9b05fd21b188442af614c02945be387af90854e8a9273203216bef193859a0a0a98fbbdb508e76511f492d0cf4e3df2507e8a593d1838d8cbadff14655e470768a9c15fa5fdcfeb36ec75fde8cb69930a140a9274b670ea49ac9f073b706c06de5a2cc7c5ae473572652591586ad6dea5cb5b1d432784ed0a6a17b192883332bbdbb203077e4bcb40e45718a5e1446e33b981875be32c36c995c7253bf2fb764275f44a47cc9eaf7daff7ce16a102a10b509cbe31848037549307de3034912b56a935ca751fb0798164d7af50c168140aee40be60aaa613926acd97128d1dd006e0ff85b80a4c985467dd18647821cc3875b1958ceab4d363fb393e87bf20cfdcaaeb2223a559fa395749dc2b0ba93655011483a70ed071672555d0ad221c7c33428b84054bf9f2f70de709742d08d3cfa1b43be50fbca982a8e2ae2dae6f5cd6e995958878669fa10fa5d7ade513f02958b8f24a58eb86c74439ed9b136c81c49f0f20e780e5c7eaf44dac2f80bd46c4ea43a6d997223bd873da1def4091b17254c4c94bd7aa6fe717111f2bf98a121b0b2c5a3c6820d2013844af4037e3bfbd22d0a0042d2f79cbaef049cfa9983a1784040783b3d04b941e8b737e6698c4ed273640dfe8da2f0b14ec81c215e8aab6b830c507b69ff4c947f120e123aee36ada381a7779162080cfa5f1a1ed96b1666f94f86702da1f995a8595ddf5a4f89f48102fd2ad8963082c3d044f3231357fe3403fd47ed634b35ee89a0a6e5bd583f22a35b4a0cbe5bd7af287f19641892fa561216028f9261b458de25844d48220d7ec37c4c14e6a30c0e3ef1adc0acf7d72949dd52cc348b060a4cc87bdd978285d743ea51fd1c99b62c5a35ee71918ccda3f5b4cc9924921697ad02e1de69916a1a2318a78ed339d096630477c8508f802dc39ef38486bfbf5789af31020ceb86dd0e619ef1c4f3d96658cbe01bd53d2fea7cd987f527a889b65253947d5cf5e4058c4e1bf3e1ff004365dc2179763da0707610d4b613e9b2cfe7663b2701f544dfd86211e0c2a63d3e8e6077f19011dd62898e7aec33cc9da73070ec48baa59f98dfb0ec150d20790bb8c3b4460a3135d42d832a439d47d798881cd4971f1133d92c340b6b1675689ecf71524ceb309c34a104a9a65462f75b579fdf8650c8d50f7f29dc42b35a8026e1d011e1c853b2e684c921bbb632fa277b36e88323cc2fdd6218507948eb2192d4db2e0a59cd8f3fb0884c901b17c8ccedaf8a4175cc271379230a9deec97f31943e42fc91b23da8cb53402afb86571ff044c5ec2a8069fc9b60c6054d7c562e12ddd94a177f44cfea8c22bbe391c183fc76d2336e861958b045daa12ecd6c898a509dbf8d9c24af344ae3c57b467b6c401a2be870a08b7b8e0563b5ca42c247b570b7af6e1a324287dc660fb9014e947373ed6ccbb00e19ab21daff9f80f3c169d6b11c9fac355fd452cd91bea5c6ad2b3aef9c46594aaaff351848ddc37d108e6fcc8f1c90175f9eace2b12ca0d99b9fe211a7299dcb7f6b6526724a60c2007b152a7e3ff735f8a842749e2096fd29711be40084106dc1c917c615b9b8215f22d6f1950fa9cf23b27c81d4a2097880be0f49d7a84349939e50c2f5ea8e3e40af44909ae14d3447d148cc1ac7ce6c906b0fd001608a38faf8ba6f269912706cff25cd6aec76e0d7e219056f2560590255630f76029a0cd7a4271b3113f023d1eac51a65c0df475f2dae8f70ecfaefb6ab79f85c9f11bc9c3b3435b358093f09960004246799bcfd793fea2d55afe3632d29ecf7d9d4c924b555b6b576e27434583797e1ab6c4e0342afbeca7685be416c17ccf4411e7ffa8111660d71e9604724c30408c4c2340aba592b2b3c9d0ef6d88b85f6bdb84532319c72f48ef3e5b953e2f30ebc3e53a0a2119c0682a2949674584660cf34552750a1d85cb9d5a2bbc4772bdd55a77d3bf1348ef44b6b59c1e3d078d4434fbb02df21454a212e2bf50480b815ecfe6cd9d0607953726c92d4d0f6c4941006409714e94aa8d1ad9c97c24e7b25bc967b3f0310fd332d9feca8b8b36a1dc465923fb522d026d5a8a8524e94b01292e7ee024d8f8367387698c8b88e4324d594d557a2d02b2f0d3678d4482740b18c210369a9365c505ded399f5982e03afc12054103874f57f2df6768b8c7fd2399651669e6f5f1de47d97f0fb0f23d5fd321881445aa37be38352f83375a7c5c4c38480526c3077aeabaa92a6e7ec05b5803a8c5ed157811dee6434884b062cf127a91d2d615460f2c162808c0f79d1d60a6027efd3edd17e3f9952317033a70ce287024ef58f9384b6cf6042940c92d05626c208fdba47947e055ba8ec37f45cff49ffd1647966f8fa94188e1d206c43145db727034d7004608e4ee06e3ebf535a7661753b1921aa4ec69a041e78991a579a1aa72856cb8258f7dbf4d92f99b680855d0d8421bf3f02f6927362a12a145fbb796e7a649b59ef8138e11c97cc28caeab182a296f87200bc889035402d697feca682eca4c23d16c7b2e79a50efe13cee3496226b31c5677cd90b503c505f7a62eb65a0015247095a471603a3821023ce309c2a805b636ac81f36176a5fb2f3056a56343203f87a66b6c361c0c9405b4ab9a42d3117b240b2b588f9ff29969d4c853816e3c0b6897137222e6c28b37ba8d8bbcc9aa5a0d482332aede5f109ea6e996014eb2e67e073a4dd38fd5bad5fc80a9df92785bafd12d38ae7798483de397d88328a0100911c9d89d9241c5e4b56228b5a3db425fbbc72c0f4ee7f7a07ad93d0cbf47b0a81dac43273c24601f6cc3cc63f53ac079b0f2902d13fa1e383cdd55645247311ce22d40a7d1e53908df2f2f574a2812a1c82c395caef311e926e10ccbecbf68982c2670c774539c8aa1efbf36be29106d948f22004377ad6f5e1b1ea97bfb24c274978176b429656f9580668ddc8f2fbb294b4a51b74bf704f404d1075e57ba284b03e8dd65a2834010479b9d8dbc17cd6297984fd77b23a18dde4c2e026317d74e184bef88bee491411c3231ad0aaaeec108ec1981e6e2cda2892907fd506466ac3837fffe9d5a5930d6af9fe8407aecfabc77400495e597f71531a1fdc2d27fa80baaab8da12fdcfa091e4dc558bc5aebf96c66428ade1d4caa3d5eb071540fa2c541a077bf2e82c7802531ea98aab6e4fe400d7394faf3d260226c4fa8ee3c49b2729c15c560fe32d31fac54cf160dd4a8dc7eb9366a1c7fe4aff67b00b04b1764c7219618a988eca129462db43715266d7bd9d6276ebaa760df5c7603f2168b2ac9ab2d6123720e09212c0552e2f838eafa3a1a2806c19840c895a29e0edea18a6219c8ac709a0a761107cddce1b304c49a44270de458ced617ab7ec860e7636b5c16586ebb0902c21ff0aed37a204ad9e6bfb6e75e48d4423c114a31f0343d7e1c4f0667cf79b34ed7a612366e2f27fc8672e5a116eb021bd4df7e8bf608925f7d64eb724f5f6090a298337c594d07c17a38e1e6538651879e36903a6eb551eae0d9df83b614c5b12b203a924cb1262a0edd41bd7a40ac0b43085a40e6a56964ea20e79064e12dfb8d7855f4e719cd4a324f3b4badb7c324ff3ded33fa46f173336d9c411e478e288aa43c036a6482b67bcc567fce846bce67daa00e5de0c7962983bb01bc9121bceb58408980a44db24afe2e58dfc8e3a4a17e0bf87b2ac2df3e6ca17c2f2645dd2fc6acfd24954360b1367d40fbcf95069c27ab81fdf32d8c0d28975213600f6bf3c66777ff9f7b86b2060bcc50e61d201efe144dd701a880374c3000c01b2f49500b4c7fc3906d5c64d8d4381c92bf5847d3d6216f71257ef17de4d26d7c31b3291bed6653d2f30e80d052e8b89ae45f2fd158f643363d1f0e95b22a67ab32caa453886fdb00cb6b733b4ddceac7c353b82c9be6ed8e8af79ec5a23cb4c16b67558cfb4f841574f1b78c25137de7fc19043480b57f3fcc2078ec65850044d00f1302d32cb53f424f434699337f20ada8a9459f51479586b34b54371f83e4e72a74839c55ab38095481b938a34ddcd78b7f3658edcac52cafa783272bdda959823efbdd1fd2626df0c1784e5d47d8dd996b8e021421cdeae1fa7444abc0921b84523bbf881ec8df0b54fd6a00caa0bf7f9d9d543a75601618680e6c6a5caa11bc4905a59a8e2a8de5ece7aec6ef06546e6ec6a71a3e1ff637f1be276d515c7fae24a64cd7a8ed55dcf806e448ad6b14299f84d8102488d84762e5135cda19b32fe0c89c611441b6cd0cdaa84bc40b682ae61ef32b1147ed8f0ca4384336c4260481aaa8978a4761fc75c5464106f5f1cfa4609cbc9b80a758edfc5b24147b3e843bc345fe10f37a0cc18a955d279061708f0e943007131414fe7276a4a622217a7b577bd7364b0913ef278f5357b077d6e36e4d04332d267ba29be50e8919abe9c0831859e5f51e34c024a473afb6c0d417951a9b97eb2601b46598be88c8de44a39d72d90818bffd3022ae65e18a251a4f12b28ed2d43bd5b22ed2c607228d9f640f28d4547474da4948c10ea797a21784692e6a860732d812d3675dc3093d35fb30570041118265efce8b29a895bb6463e3307d23c7c0c02b81686b983227452584884eb7f52c5a695b6738762fdd30242afd6ebc808202fd6832d9b83d84942b84dbc9de6703d02620c97ef824a2cfdcc7c32f43440430520f5989357b00636aa0a15e49701eea519d6fee511c123b566faa99624e0055a23ae0a8a635872b308bbff83f386f24078709ba008438c0223b6b763284ba5ddec615546b2ca532871564712b104932d3c5b8a19392b5b15dc858d01f31bc90661355b7f7cb3eb005700bb2a5d8119071521af3a2e22ff579490a06db646fd8161f91bdabca0e3c2c0c2637bd3720030add074a3b8ec0d05c09258b0ebb5b2529bac1ec0a607e3c325d04d1b12415c761261eea2bc935f27ed23cc8b75490d1621081bf6d454ab232548eb562c4ffa553714405ca1758ad990128d4b71ce1eeed636b2f79196e3fb6803f2ee00d781cc6125aff2d562600335537e8b8575e1abea4e8108d11114c5bc66deb40a19b73cadcaa9e9ecbb81b4998bcee2873f5d6346099507bf1bf2f2933809e64a347e7479f516d8c1c8b4ea08906391e3889ba3a47f58d88798c36e9a59f4e3d88e6f46224312ac58e3484a745eee39ce1c03ec6a6aa62b638e1f3eaaab70fed5aaa160d3eccde81f65dd108ebdc303a01dd6baf5153a562b3a097d09938645420b914f0c8d9d3c4fd74655e17b5dbd689a23db0d0f9c9c639cde1f05d96d7e95f929ee44aab9a258072238a3707dc712c06ce00fd21fe01400881aa5f73a94605c17cf90cc01fd28ba799a73dacc294209f83cf244674ddda31265d71b9e661b4736d449ded80cac69cb3f7d79c2cbc125617cb1a22632d287653fb6a9555981529d60a94706bc6b9a1e63da25f6bc45d86a131762eb033f5f557c70d7047254c08b184948467a9ff94db1b8f5616800c746a65985e82419c8c0e3a6d7bd0d2398731c3184bc5fbed9dcd023b42f2a2798cc900fb28388def3b0ae50bced563d95a1ac16addd70b7917b688fa8e72234d530ee22f7335fa0343985d844f41f82a4f35530bb42b37a3ef164909b7ac63f183fea32d68b622cc99032f23bd15add23dbaba158fbafd8d5613236a55b103249c36f692291e61591c66e2910e281c842b6eb1b556722a1e8b5842269c122ad9aa0f7210d0369c3a3b8c73aa41dba9bd61c00ba80b74ef6e3f45d085f5c27e5a5a21830f3056de8baa6783fb64ed978cdfcac1bc43dd761a418c126f96a1a0ea4f6c38f99dbb0c7a35c219486a87ccf077f19148a83c53708afdaaa6eb38de2c6e1c272196163beb3c3af2d4a0da1ed015d8d995382a4b00d324b8e071742db800e5a8632cde251d3ef15b1acb3dfe49de1db5861f6d381f11a81be134f8a1307b1937828433ccc6fe2037f06f294d28ebd1d82e510f0af7473731a4c0dbe7696070c40841e57022ada9b59e37822ec9a82b1763a0a13bbd83241a9f4e69ddecff6d3e84e648546354245b59483d1310e77572693976793bd52f5510c741ab37be7d32a083cf6972f842f42dc7263dfbaec95b9db446b0eafd712d4484e6fe88dbd8a857f6aa47319db68602e2ad65e21e0a4a6bef85d1543df1260f11a95bef604dac71d38adf09c10897233dadd28d0b76f725b095b4734d49890b4fbaad6c6113857857586b586ca3908e00841971010cceabb758041216c8aad3e92815154fb72108a2b48934fd2e2ea2e2c9bd897e770f9c01fe26343e01519f86291b79e5f94821a12755b82a03e2c01b80b4b307cb20e8085069fb1d2e146403db43ca4fc649d843e0edab3223ebf40870a71ac695e093d4b9acb5fbdfdef38b1d5eaf9d74efa1f4e12d3d6d304bcd5e42a1c80a687dff639481011a5cb260d28badadbc207cd53723c768092d9728f39d206c91e57ffbb89305cc9905194cca62a84e259828ef5a3630065be690e6d0544342e431e84203c4ef0f56c7465d48c8fe439eeced0089a2688b105fa7b1405948885a69278b0374694720df2893e31774a1374c89a0a8d612753c70cf36d08a98c34d4e70591053309b405ae99847e7a81ad2738d2df87bae87a29f151ea9149c0812fb3f631976c73361fd13d18b51be6aae247e7a076ddb81ff0ad53c25eb76eaf816207ed0f45fc6d869078b4b921532d85f862f425466d13925126f1cd1586f91fa5467fd0e770b9d27bded7f253d0be9c50d24505ac03bd1957b9bdff349ac9430d582f86cfa45206d8abb2c3717ace2210cbcf599b43415465488ddbc0db2ffa296b75aa82bbe86d8142499451d9357161a8cae7f09dd69d98097794ead05422545feff417a49871b8f977bb4241048c1bc2524954d4149ba3e7a70b78ce9c6aa282130551ee4c5ca96483b7137f31ae1251abd34e13eb332685c76925654aabf05e09222c689739de704b6e984ac512e538dbeb781c7885dccb6c5f216a180c88d69d1fb75d15fd2729a180f8711cbc8873e2879800fd4af0c34d5d2555ccc6a63f2abe3bf919f87b404f231001f963af238770c1f4b069fef70fe29f96c2b636d52550fb38468a0eab1c2d497fd2a88feca8fba369aa3997b349169d856c658e1a19e6a0ff6c33d34a68c38d4731166aed9373dd7070f16a46da88a1903bae14fb84af6771be9620cad24dcda14962e55f48c280714b40141bbc61ab562d5572f4c3d97f9c1fb930cece97d4baffa3ec4dbb7d4c119e80ebc4be908ead92a9fae04e73c26af6b2e2e641d307e3c732b2adee7a4ade914aa0e9df00446eb061c8acae8cf48c04ad558fdea46a8de54d7e0616cb0db9ecff7608f764a931a95dc337f888b459dfe696bd855b743dd11b83e69d9cf4a1c2dd41371d93270fd4134088d0bf1775cd7a45510952634da4e1f59e3686bb6cde0453557997dd4256d146a8aa0e05f81ae23c32196b69eef35e9c759644e2a500ccdf3306a9892acaef57947c4e9b50a6bc8eb98e8dfe0bf5536358c2abbce855d93a0403b48ead654a4c0f3042f254557a7b681dad5458e77c352af9eb850b5c7b44761757661e3f1229be993625d51fc1d6385ecd51b23167cb878a5acf26df563159e9ae568162b17b3c2a0990417435a7aa5089fff4ae587843e845c28365b2758f0af20f48c6904237f6dc9233131fb759f500c1644ab600bd376970dbc8321b9dad68d3f4f99aa1e246411ea7809d75959634ce504ffa6de11c7dc64c2eb4ee1e21e056dc5850161b258a417db9a5a71da4e8f2863dec22c928be4dc0463485fbc9f67cc43ce1f5dcea077d9ac5c69b474f178d2b084a6ac97b4dd02ec796ad1c6678caa713e7f2373185247b655651ab0c34911d7b64feff615531e634928f9f150673f04b47e11d627b57ab18e94124d4f8be9dde459df1ba46be659f9fd5db84d2274a8c8c728dd827d33965de6e2df75ac00833235b9aa42e0570c500c7828085ca41bd9284de2af68f196ae8e18eae940ef2162dee2e631df0514b69321dad69326ed2bd902d81535457bc930a73bdaae20013e028daba897b81b731e967a0d3a1912708e61624305d89f8c34b74c5dcdb31a4eb2bf0cae89986312455cd75a64804fdb4c3236cf5936f31a54e87c9e75c700c6faa3bfaee5961a7720b5d6973efcae14e23bc457ac43036b60569a81ef2b4003dd854efc74c5785a7c4ab6bc5f9e5ace191bee308ad25d10019e50149f7c9d5693dce8b2817e35bae2ba2c6e6cb5d42f4eafc4140280e25f895ba6c4758325a6eb291fdc241e7da5222d4d5c1b134b0fc6ca38f33956abf4c00ff7e1c79c145ca75b10736d73f11097c8261348a96b64dbd129a7bc21968faa6eb8dbf3bf3b26249c7aa3927a1b9ddce78beab43bff4f2bd90fc57e94ff3167a5988253f5f579413689a06a26263d21f70e4ce06b84a24d06d6fc0739142cfdb8cf4a629e3b6f3c6c8e5e21849d137a329dc03927cf31665a5320359e40bb4e371b6af4a435e548989d3db4529b8ec439521a5f5954025b89253adafa10013bda88f3e083df1c9c4a514d22313cd818459d66d24f8863b61dc4a50ccb8861d0526ec4b11177842f16771e15f96a80cb05e564f9360076ccad6e3af401943d3a531966baa161c34e31adf27441203d05a6b2cb88ff27cf99fc5215123d89755237b08af69b8fef629bc1fa03b97bb9c52cfb88ce6c6d9a9cca5815e8eae9a9638a01c1424d34da43905dbd9e68b6d03d67bbfe98e8213500ae20398d6e903fafb3703ecda48647af3e2d33f1e24010fe90349a0806924889a7c5bfa4059aef8e2eff1af0c1260649d465e259a4b7f0cd39d513902d3d9f931b4b3e7c21609a587b55e44180d41fae6bbfe8eb5c566b4e4b702a84c295a9b1bc8c22e45a793933a6998b1ce024bda2c86539de0ad93670549f09d5456b482d62eba36b2628f1cf865eab1b1efa8bf2263aa81264812523c8f2da682dc1eb79064fddea1a20e7aff443f761e51ad82473d750f52c1b8397819f2d6aecf48977419e38abd37b5a8c243ca41ac6652f0efbeb117eb143b4f8b94dd5fce95a1542af1777fdb5d68a25b00d8527c29375310535d3270637c226aaa310c9f53ff3a8c6a1ad26f3551929ed933e1453284d7424c5ac883d70e556b0c741b6fe8e717f53f53956c663338e5e528973726c7c7325cea2a1b89e391c6f48f5a0aca1f91132e27ac6e43ecc99abcfc139d5cca704195bd2625a7a521c068cb90f63b82ed7ab04e7848e2ce478574332037e195d7e2db24f87fd9f4ff372b8dad7b4adeae58b4695174e137430cd8fe9b609e040692e8210d45191193eb4bf7aa93cbebe58ec2328e9c17ad6b145c482e558a431abdad1f22114a921a43fc4cf15c0d0aeee4d7daa00cd44b1d693e1b80711d162fc13e44aa5995809cb8bff3ec6d6fd2fdaf919d0997d243e42f7c198b075cd2082f382ea76946ba77533467c10767d93f6050c53101d00f9942acadd76abdf8c8acb47a95e107b1ac6ad2c0bb81fc2b095dbc8e576ce34d974bc67c309c2223cfce41e668ee2cbaae092c8579cdfcef68d129497f905846e1bcd471716439e7f652630b42b7be0fd0af9c9fc2e9d79202693b1c82fefb91c1aeb928075af4abfa52f13055ab0784f3113fa67659ff901cfebd0d3050b111bb119c7c2bcd040bf7d4642e3d5660e95e12434db96e1f22626299fe0e4465bb8110ae4a3ac50c06bd0ba3d1cd57cf9f523ecbd085a18f84fd4bc615a3e863765ebc65f0cd9d7dae6faa1a9a156796d1eb9219d6fac00d2e1928db978e102a2d7c96c51e9df0ed68537fe24ab6fa3956e0d8708eb6e1a78bb43c41560595c1fff1050b61c5923069300aea28789b295a3e2778220d5827123d1067c043216c315889da390fde6c1383d859172967865adaa8a0c0c9e54f90b9bb8bea00d44c6b104046edebf44e0223dab5f5e065e795c3fa076a9714af83823bfe992446c32205df62019890f62b56297ab6b7badb3c3f912d92be9f5f775bdf737026efd71f5c20ef52ba7fed4335f3e7615d00bb6d98bb6c5d6a10829478fa3b0c351772b1db3d068ccc04758eb970cd50c10628da173ab7b4760928b8575f479f6d086c3c61ba2328a06c440cbdb46d905a80ed7ea01f065f97ab50b9853f252e1cc11e96ccfe813b67b3d4c01d8e44d484e9c041db0d9240a8f37be3de9410aa4f08d699bb50beeb1527e921acbf0608ff8e60cc6f6e4c9ea3ffd2124a01c23e8e8c22dfdfbb6eff46afb2d2523592311164c95f4bc36f55094ea42fb46c3a0111bc1d170d5640f97a1375f040616f3b8abea25622b574892c34d09359b29d42fd923479a29f89f00dc85005ee0c620d6c1692b4033a9b4d8c0a02e186c451bb07b5312bc9bc2f7859d4ee2743b7b8eede95c040a0f61eecc231836c2ccd16b0d960f9b5cff52759d3f34f7896df2156a6c7fb999ee287147967d99b9c6be639469b0cc2164c2887543f87d66a0cf9ee918946d7ce05d01e28c0ff11c19a535b3402366204a016ae7b5522f405962da088a1f812a7863b338c6c0f97f94c385fda5de018b2615bac4dfb598c219fe54131888a352b3e766a085f709ee4397841c7a648175dc0a948bb199833159cc62804e7d3c62d204de6927567cf603c61474b512398d06e8a9e730d7c5d94cd51e84e6d116e54ef4e188965f9376183bdd829605727ff265b03dc802389b8ed69018d154771f0fb6537817665b44085dbf6e37950bae81c5a8aabea253074de2f14c2e060212312b35841c3265e6b10f1c9c19bf58d1e67cf955e0da7a2e0092c8771486424fc8ce7168fc43cc8369dc5993f04ac91042b11ad7425ce38372bf1b74eb971b4a004cd9a33c47a89c8a3aa6bb41cbe6d4ea7fe839c2f27083634ee661110aea33699fb3866a124dd956bdf3612d167b7454de6ac16537bed5ad3295e7b556318dc0a9ee1e2495ed51b634ce8ff39eb84c9f2d52cb2bf23abf8d49472a7a7646e188f978f01e410953d545a33e075047e460cf2fefaa4b4b1c627d919081152e752250e64bfa9571bc7e1c625a52ba35a110a3adc79d0a2e57179b6a35de2a4509630788ed70e1c634a61e57676fb880f0b052ea41d194716ec05541d781f99f07e82e5974b6661b29303a70c03b4fd6647e7f5151c8c4fdc618af6e71a2f44f9418e801597ac152f8404c41f57fdfa96f771bf943e1a48999fa49b5a0c58a25e1c2bdbf87271e5ae249103ca54cbbff030a9f7ba06b62b09f25d49d393078eaadec4c9d52233fa5678248e3fece19b50128713c8e561041e1d762902438d80e4feadab033acc43d92022ae4fc2b85dd850a2d109e6e57d543e1adaf65444e0837f86c788fd8130186abd6e1d6586e74afdbb8d80e3f0ed009e1a9f2cd88ffb03b5bb6d6869140cae4435840b560b87e546290947eaa59e7328781ae0716aa17a3cd5011ecc666b9d909372416d809f723b679ecbdab706c500acfdfc858aa31eb4124bc8363c6f370ca8c27e2a18f4d3172a920edd65d210253bb8f7613c39c2b2dd069df91623d2d04bc967189e1882d852ce53d19e4b47ca6c07f5d56f998c9eb451e14fd3355a5c655bc0075975c9fa2cdada6bd0a2fd830b3b622f15b2318991ab51513f389e0b55c204dbc7db9d2c0bb108a58c56d802814b3bcd17bef9aa588c66ad3ec6495f77dc358b181ac420cc4ef7687e3da0e97330f64575396a1c19396ae78e4856d81e1ae35b7fb61a1092bdd0527176a69c5b0bfad101725ae297330060e7028fa02994bcc2fd138e1c323ac41427781fdb4f3f5eb19e437afb9ba1cabfe157f9305361b4df90e40b2ee2ae958c487221f0f0852576d3093a775b0f4358bf802cb4883ac26fa7790be0ae171109f4565fc8cd23a902cd409e0946dda483d0aa7a840d69cd2aaeb8032aaff964a945dd2c0cdb70b2a627454e70fbd6e0ee8760707bbd63f6df20b2013e08dcc2085e1b1bdafb44d8263fd058e7e5aa220380fa1088a194618888344d99acbbae5ebec6bcd33a861ce74c5e2d7e882a8391faa0611dbbce2937a6c082c73af0752205278318f308138c3afeaa581a3217366826bb86b689a51709630c179789df9a7d35ad89d3812ebcfdae8860345c6033a88baacf41951df347b08f79c997dc8c21b1bcc616e6bf098c1f297b4c6be39799f60e39279e8ec8dbf07bc5af9ea7d4a7b10e17871130cff9540cd37a29c44ad821ed3b4bcfdc38d669760b9d54c53dee49f8362df34b982c138653cd8dd64bf315cc5084113ef13da19047c7e85a4cc5f31c4b5a44425960320d8a6a0d1a4dbc2fc8425d1cc2dda820a867beefcb78761f4ad5d3be7f798043f6816abbb84ff622545cedd8d310b69ac51c25308f403c2699de846c2ab67b3292aca4847c8a7598d19c5076523f8cb84a02d80c208cc97422226b28139fd22b4b6c15ea80428d74cd9f7839cca5a75163ceb9273e9dba755729ea849652a3fd99e1c7754539e1375109975607c0004145bb0aa9072ef7b91d0eac730d80529d188437f0725f6b0189aa849eb25a2501a1b3777fe6206337fee3873d40d60a00e36f157b17d362858c007a1cc0d11fff6f8df2b2231e16b9104b061a0d2a8d43d29aa57702cda37aa142d7790d6d78d12d78130680041dc6399df703949b7436dfc6617b0175de5a12c70541def2c2a15c2662542859a3c9d2d2cf02d46b4ef763e70f0965703b6d421e8982e21370fe95e47867bac880fd03f4fd83539a958cdf7f779954a2562359cc7b2681d1f938a494bb13d0ae9eb6742f0199f681b2614964fe8606052d9403a1f8ef2f7139d431c71c2b33807c033db15dd7d08b8e23ce4bc6a3000729ba9c151fda727450b281b0118ae7294348b1241e0c5b1450ef098db4870d2fa013e4333d2a8acba8e24e3503caeec4d57198e565cdb4fe16335bf1e68817d2a05e285f05a995eac837483ea2dfa6451d9b17261f90f873eae877a12d383ccfc31cebf953cf6fe4783bdc1bee9ca52348f2ff9bb3274a47f6edb196927c254290810e1a2868e9d140cad82a676605d3cfc1f6f2bbd6a4b8dd591232ccdd47ae448e022ae93087448eab0e245184cf5c99ef42a36853a92cbd74d3c5992adcfbbd94fcdb131e7952e4fb74f91f6039c6c9678b656a057f1cac4bbec0f7e04fd6b009ac2e0687c72e43335c63d852ba0cc6e246be3f9c772a2b9b3c7e5131c1de370dd6f48eaea5d90b84fb093731a083735e435c280cac2a7e2763f28302dc407c017cb571193e94c89068b3328a3c75c88edbbf059ad912e467ab6b8380a81f38bf56cc547e8d7e05e597bf03422f4e75614c881f6bd1b2122260db21f92a855412c57e25a8254ce6dd74f95b65c1ba73f1138450549e3c287a4b12460ec393aa655f9d1eae89976e0de8e9e3f9ead60dc5ab4359cccb042a826c561eb77afa3960ebd266e92379a6e724727e4b72082768024885d89277d9240f97aa05f8034c40a021a4c91435d4050b29a0e112f64e94577bb5c6827b513ae13a1a9ce88e6027405f2d4d6af142e88ee35cbf91abc29620b0fc8596c1c76d0f390408d983f52493755fb2c7ae04b033570e1a910f9153322db287efcd50a47535b22e5de526e995292320404f9034b041bdefc218431c81ac3d38d7ce6b21aab3157b94c465b2ea3ad495bf0064ad7aa25dd981042ed214c02520a6c385b17330318edd128cfdddd674c91666ad665dfd1960c0ff72bc1624ab05ad45effcbe4e0b35a63ad166dc9e8b85f095692b5cd3767b96153626d53d43673066fe0cb6e94ab1da185f945a675eac71225d706714c4388fda776fbbbb3e4edc4c91c35b4e179f26951d60f77d40968fcdc2c4749e5fd95c9fde5ffbff5b9b9befd239ab4b28bdb92634e3cad9ad4a7541677c45971bf124f0f9e128f52ab6d62d7ee43ca9325a594ae28af695ad571e47e95a7b24810c6e0b2fcf81471e4e925573fca9ffd71f975c9da6cc593fd57cef2ee5d4f683f4fa51b67bca516e743cae2ba4da8f3b4dce53e40414219d631d9cc57f43a8f8fccc624b261a3895e2d1f1b3e401d2434249bad9ad53c50d6ae16cc07ca5cfaf8f8f8f8f8f8c45a4034e80a9986f0cb238ab056abd56ab55a11166111168166ad56abd56ab566ad94cc8b619889e8bee050bffaf57abdfa0585fac59a3df7a32c021cb94cde8ef33721d2933fef4d6d131f264b916bb458e417a32cd3183691c410326c2289a11c4f32dd1920dbe4cb63464fae5a849ab3c8e05933c540895ca58d4ce092174cc9b10341671966fe808d27979d5ca78d27cb825ca98d279716e4ba593fc94c0c9b580209998961e289cb35c8b55a3fcd0a2d24b1c850ca0d04d6f4b4d7c4124fb234b54d8c8c0eee675da599ab2cfedbe2c9cf72d4ff4afbc115db8013bb939900872bcec1e1dad140a4310d15739df7cac161cb75b0bbcf1bcab1fb40f039e22ec1add8e29875d91eeb933f6b04c8662aee107d62fbe810c772151d32a1a36f4fd6e5a8c7f5e47295d0b541d6056fb4fc9816ddefa3b42e1a343abbb540dc5a20d02642eb82379dad0bdec4aa59ebe23a27c231333cdcd9dd31c36c5d31db635d3178a3c4fd6893727731e8c6cce1fa2fc0108b75036e2c10bc0254592122eaf1d3c89f7599bafb6c91fcf86b89a8d87d5608c9ba7e6e0af6c49d76b86f5df9b18cbb75d99ea3fcd8bea2b42a86ccfeb40d5c32448f5812eb93df0ae54f41feec507e12d0122046e4cf3ac96f81f263ef88824c6856d436f06594ff8ff2a3705d2e48904c1f48e08c1ae9c1480f46807069486847b4234048dca9e2309c59867805b6bbe5584897e49dc7e4ff7f314cedc88d61b9d35dad5637e0d498cacdb070fb6e2b3f2ec025fbafb8ecb8a3ca67118ca8aab8b3e3584f3072795a9f397e6833b1630a6d34682339ec1ee5adb89fc7dc88e28f15b9ac6dbe6bbcd196d039dc9bbd6d23f33866cf9e7295a42da41bce9d4824dbf7964cf0e2f3d2bae13e9fbdf47871bdf478517bfdefb2587b4d7482fbf92c969d68a86dfc89fc5527b921ca894cb704afe4c63e83a85641888325b178f702e472456552a5ec10f83ba1fecfa569cf29c55e61758ae5e9d12a98552d8a921dfbd4a31ab3abecacec3c6a3fd0ffb89112ac8908217e78015769d8710b271a815c8931006b5c95818872fccac2892bb2ffdc1a90c8d49ee38f2d5d602e0861c486116c16575147c7540a28386492aae10252210dcd311962bac36dfcd1d3f77f94d655e4756c2fe50bc8fe5ac9e01d43e88e0384907abfffbb430821fc2c382897aab4be6e3758e397c29ae82a0e87089713eb9013d0a39f1d9945f5422965ca8694b2d3a4bcf76a9aa6d9e024e8f655ad17d26b42a1bd1a737777b7264d28e48e388686bcab11847618631bef22be5223ed208e88ad14b7318c38268914b6e042c491a755d107580c3f72728cf8e14985254ce24f6492618ed875bbbb310a55513f40f351970b6d1331ce8427d30d0d733fae0cdd322b481c71c436e41920964349828632cc2fc4a01634dc7b5d85a1e7795a8c1a36b5d72d717bd1c39f873facc953108a61fa76c491dd77b43d282ec4ff33277de979356ad4a8b1319145853435b692db301e6960d1246ec3fcbbfbc78e31469fd29e577123f618ac890b71e7b21cf4f4e4cf8485f4811a41f9971f53269860428a650a28b4c7648267da1b229bda8ba78735978b0b9744d1d112dec02c5b6c7b331842880c937c0ad3cc09e74fede5c72837e20f0f1146fe6e0ef35f5288712af584512a05a5e698e0c217751c3b89e38a852396d244352c59dd1d579a7456bf1059514714d99c1204b7831abda67bd4349a928191b7b8802a2161136249299d543ed6a8a4536af25f2cb4cd672377942ee816422d8ea390a7a05086f263843d5a7411b2b800b824063991dd630e6290c95de81734ec277a6790527e0eae23f91f83fe93388eb1b6316a55d44168491049b2c708840bfd0892bf5814877ee8c85f74921d7ff58ecd22710ced3eecc2864dbe9d4c8e724c654650d3309c53ceeed3e6cbf94dc201610f13148bd29c539b5a0bdad4a4cd97fa524d69cf94fcddffa94eca548afbd81bc7242d4423262d33f931d25e03c9dc82eb7e773526b4d83b555671bf9b9fe87e90d8c93cce21e2109191388786711a7ba086896537811a887c9703e2896b8858c33510f12ec7ec6ad0ba080447638a610dcb0e30aee27e18e288fbc94b4ce62c8ec6e6f1f75145f147af8926e7ee76778f9aff477777f7399b4e8856d0f28b853964d49ecf0c5d35676d92ad981231156c0eb2e1391b7a5d22db8a69b11a8bf12226690b8bd75efa6b2d9796b553108e499ee169e651a36413466789c5727f37672e93e5fe38677336672f55dae67ba9925be2f7a3f85205dec0d29412acbd2e1571dc0ceee7b2976c7337ea04cc34974997d5588d49975a8dc11b588be4d6aa459d004f92bf6a246b0f524dc9fd68abc6dad3a4d4b03cc5f0ad1a9b3329724a495bae0a77c673548d463546c10131d9bb549198b750665a6542a31ab7c700cfbf8b0a693e97556e5c5fed3991aff62fbeb8dadc641b572d89a5745b5c666662c01b19938d89392a4884cd64346c0c8d48145ff1151323336382373332c475460419220020c60cdec064886b00ac66e5e247016bc8515d14721418428dd3f272209868d8ce25fa382aba5cb04846500c5290080414233342cb8c081636942f184b182358ed8b4bb309619341bc0501aa7ab55989ad5601e8159e39cd9420612cbd825ddaa3d522cd4e9d2541e789c18a0460b52325588789c0033158a420711557257856c2ea10164370089e85b8a2360d5c80c8851660310880f4421d80a539da6381007f42c1460a1168af318a84a39a3053236512a6c92ba28a34932c393ca43cd36ddd78e4d65809eb9d5e4154e34d3625b77cc11d4833d26cb6c9729366f2e55d005b00d28dcda80b03a4485748242b50b5c95870c82d61122661d2005613c2fd48b354ca4933479d2e25cd1acf246c2661302f240cd3200531a54ee8130e100f601160254cf200aa4833d24c8bdc27b8117fa4d94c0c0dd30c1931605e5c5a66665c562340e1a3f5033e8fa3e8f467390a4eff774d7613dd1d1aeeefdffffd9a5abebfb4ff3e82d81b99fefffff17f13d5eaee1e272519d12f60746f771cde5d5211d02c73a74378c27abff2c41f869cebfe0e438e3f0c39ef579ef8c390f39ec4e3e8fefec41f063a053daa254d89a6445362618cad55b9529b74e3ec8450e078408c3898dd1b38ae9d8b70467280cd94858be789020704a0caaea01476e52acab289dd2af7b6d22429880d1bd5de1659239522b1b4b8bc099e776f8b5396a36ecc9826cd24614dc985b16fe2791e30789e87070f4f0ccfc39a25f1ffe276085296a3a8b854477b2c6b795c8ad42dae94dc78124522226a7fd657cc226a75d5c58f1350747cf85154c455f71f53894ded99da467698cace74ab06b04092c51336d0c10f392e98537ebe0b333259a6e8192b18318517554cf043184200aa01096e0b716730b1cdadfb6847e1e33c6ca7c135b57cec71814d1301b1d8210c2249b47ac0010f47703bfa1b0a181b44fcbf917a4c1288ebe9b1398088232f74a8306972c408f9ffff228092c289f223072e1f448a8020520118153fe8e28bd8aaca8f0ddf41d351dccf94dd71801f8004ab88155a4861c10a86e41e9dfcffff516ee36bc2422320220642624274386901ce7785e4cf84bd1af95918228cff7f874d44acf28991224a784085106280138b90336f246e3384391b4e0e18874824d2f8bb27981c639f5e728c2799d8279938fb74739c91e334e5d88d63db1cfbe492633cc9bccc6398acf589cb316a750aac715c7b006b1cf78994e3c30a2b05b9ca62ff4aafaf34944b429ad7a2ec3e15d6365366357a1f598e27192aee57611046595487b320cba7da538551bbba75969d951dd70af3c7337c942d34dabf4af12a05e615e615e6ffffafc9f7a9534a3e8eabb8efd355587b486eccede52a050555f58afa45064276fc29a066913db383ed7d58ce985eb28f45c731e209e4248a0a30cb19e431581369d1fd6066505dc19b9f30ad7b686519ded4214a391738b52bb1cf20dd70130987a427cac5fd2eeef7576b0a2911df4b392afacb51ed4efcd5369d8bf20c72149d41d05f748b3bc3fbcb69744c7c11d12daebf72c43c23c020a74a4e11a00c9714f1c9101e65082580c404423ba229993e66103308edc86401dd2690e9ba1fcc0c62fed08ecc1ff3c7f4d140d4e94389a664fe8064fe00cbbd6d1bde5aa2ff11a816e95af9936ec821a02a4e693924b79cabd84579e28fddcd85224cbaa46bd55ee3d5d6f55db9c789b5c9ea6fea90576d3337fcab99d3360f21b0fd373bfa143687a8d3071a778feeaee1149a06cf0dc2c2385a07d3a8980263c911aebc615ca25b73b8a353a74e5d926e449b4ac19bce14e770a16d1c537c0254518a61944f019952ea44a673d2b447713cd10eb74725a51ca6183ae71cd7241530dcb60d73da161f16a9f7e87e7b2d426242acc831b24a1936113273e5ef9b0c69e588bfc910a05ec25d05e18a04815208a043dcb0069e7083da82c38db845a59af11fbb8c86610e8be250bce17962519c49f176cac106ce94325ac7c2c430e7b83854d364178436e906c429383ddd2004d57b743bc3253e50e488210b11d1eb4dfd1ae55c92947e5e92fcd01e7a7fbadbfd87be4f4bec7fb8d878e2b2a9bd39e7a494e338ae5621ab2f8111836c21430890ede1e1c113c68c39a445417ba8e5c2f442570a8dd8eccea041cc0c4215995f996638305e08132d0a118a48921df6437ba8a93d193264c8983163888bf424d2006f4a2c904bd0296753f22f2de82c91bd437448ce1024235c81358d1fd6f4f81e7e5643a6641a2144429c2c112284616424c8960ce141a445f1a6f67e00428687350f6b3826a91f233f3f31b7ca854b8af8a1192e29a227b793a6a89d3d9d4ea7ae93214482a5a1a1a121818418434a20dd28a18412482a9ca0e7916e7847f47d3e01061e1d3684c9ccb0c990245b864d8638e140ed0d3e5d52048fdf208d5e9420eed86d03908f2b3e002a72850e4e1881f1b1851139e860020827ac28f182258864ea3a08e9e8f42c53197ceed01d7eeed01deea0e16ffacf1dba434dca985a0c186ab91db1458fb8f0791cc5c58d58be703b26dd5c363a8768e55a6cb53f6f5cbb3ef37f27595962215d77f721965f99e60cd2a1913afa14c2ff1e43ed56f8b94377e8b2fde70edd21a74307a7c31dba432bddfd1dce8032b09c61595400e13febdf64352818bac3181a2d1313676448372086704666868425562b2b3a54ace850d9b1b273a4a3a313a38e8e8ecee5e1840c2f5ffe0e8e9360033aaf692f9031c638834e74b2b3b36365c72cc1bcc168878a951d2b5462b44225c61d54ace850b1a24365c7cace918e8e4e8c3a3a3a3a2ad8f161aeacecb0b263e7cace8e1d3b66723a1046187705ab1174d08e489c1aad0cc4691c8e756377c4a1d2e843edb0a32c807362c71b6a17e5a3ffb7c41f0d9449a8f44d98f5b45434020000009315000020100a88046381309225c29aeb0314800e6384466c643c9486434910c4388c8118c618620000060064904108991aab210086d505b61f4d2108fa60407eafe5da663018990f94b4b9421fb326538f6692803dc0c684679019c8841043e1f43be243fef5a382973709529d3d14b03bb2f83281c5787173780f814fd93b7cdf1d11d7788d09cd571ff6eefb2caaae4a88329a34ce765ab17125490aad051336409704aaec22b393ddcf0b8cee33c0a16fcffbabc912d2718b85699a0f5139dbde0b5b8637be2c5ea391dd43bbaf7dd6f1a1ba93962c864333ea69bcfb00fbc9966b543086a2710a4d79c5003779c83fb182a2313996e5e6d38b05b275f1d29dfa7a3499f4e54c2d22dbfc26ba66ffcbc8d1938472a859e67fafb11a7e8248368322c3d2bcdb91f4937c2e3295d21086997d4db3f6ab7b4cac52df03e7504466c8094616c5cbecb40919d07abdcc5a870c9dc2f192f9440ab3933088ac3d4c46b3b47f260a6bae29b185ba10f8d246abaf40761aa6f71e2077a527f5bc3584263dd06285bdcf7e49bf2353fd2f882a8686d70a246f1ba555f7a996787d58860e0baa7e00b7a8f336db70e07a8d53df72a8731487911a94a2e7c5f190f63be0a5a19e50a404ab30e2589f2652dfe828ffe41bcd130c26000109180102c22e418f5731fe8fd3acfd2839a92fb2a3e13f59668db8a8a3d5c7fcf9609205a712e49673e8da2273b4ab55f1f1a1bd205f6c90a27d50db829d6adfe93824b6936c4680a82395c0bce6bd388e5e7958daeee39eb18fa292eeb5ebe59afa013145ff77871b65f85b533f5df9965df0df579bccb64b39a01db5ab1a549a4050bb73cd8118074350a589ecfada536942c5d39cae89b1999d33b7ff560e59f40ad65673c04172b89b05f6ac84647dc78a53c0c2c4b116655f97a289ebbfbdccc296063e37cf78687761a16b24973d24e33a26e0f7876491c3e27276b0399242035683d90632a99945510f1a080e953e474db1b5cb8b1790a64d5a760ba04efb3f134991dda555373e1363b2bb8090e063be126f31216f4aee17277b0b08e477e333abe7e22cd291b36db0161de2d99c09729222948a2622ab6847b18d369883616f077d8b3609082baa57a3618ce22a7222981c519ced93560f1a6630a7a4d5c3241c71bf6445718a2aeea537cac70db61f1dc92728ce2546acaf0eafa36bd0b1356460a8f964583bf1fe6d15e9e008f01b62731e016b527c263718a8e7b581c6d6f504a427e1a6865d566af8cab256764a7f279d44395b3bf91520bfa6e1897f039a07861b79b9eb0b4d36ff6243d844a380a8143398983dd48fd8e181b47c33a9bfe4a672c8450f5858c9274da3b5add2db6812b97c6fe08f56622d3ed643b19d369925b1bc410b2c9b16a2ab808552e6d015dd1b480ec9e5b49c9ad798c1396f29467644046ec42b7d10a4cfaaf51d405be43351786f80f4912006b3ded98e0735ce4fe83814c502323d01d68a78465e91c47ac1d80e87a13639ba01d1d757d30cac8c5a8160c6fb983d0c8ced1304d072a4c4380778e431e5791c10398394bd5eed3424e8f90aeb40870317bb2789fefc6f3b44609ca1faa2f30a86d857d60cff9dda3754d714824574dbc4cbfa0f12cd412f0121fb9e8a638d5d031f8a97b2b92f382e7fecd079b1338089e0e69d5ad7c531b4c01c1f9a7db52b02b277406d1f57a7d444be44cd8561d6ba32345cbd39f9f2e62e8f83ac5232a245a8862821db52c087878b90f59357ec05a8c513060b266344a425fe637c9fb3d1f4b6881d062fa0fe85eb14e3388c54e643084b9fc5d69c1c8d86ac26875f653a038f845667f4826f59617b0f1545e5de2afee76d08bca1fca87683bb6bc54202f6453553da3ebf41c55769de052adc81c6696a9b66f64cc54bf0a19d5a5ade5bd53badafb796be5fb9d74df61d9502fb66e2e4bd5157ecaa23406fd35cc3359134368323cc2ebf6c1286cb8c2210f4d66ea33b6d4af89c3e416319d27fd66e3f45a5f69e67ad5e7843959af3accc0aad34d732cfda48ec5fb56ee4d993ae7534d3c6b30c912038eae359c0b492842877fe594044ca8a67bba316cc5c6233e50ff2ea75a88e7a67e915d3f30fee8bb0a12e4efd61f3b7899988894c8e9b72210c8454601a161023974b79f41bd39c5f180ac93684261a7ea7b6fab6a58c561af9df8397a9447b02030559cdaba7cfe71b0641fd23182461fd015d9a04bf64415cea71b7c204e672fb56343b19a4ffe07d4b031c4987a7ff635d844c3c7cb9875d1284c5bf124c4297fb209af84d01a9a848d4850eb5b19a2cef1140f3057e9628fae8abd98a01104df6dc5885c7d30ad36bd9144ad5886787256c7c31a0447aa6e1718e86626722da7cdc8a5a33564faa5438548dc7e5d5ef9836f560eca213ffe205611289334704caa2536419c8cf7daec407593460e7424b17669a1e879b2f6baa96218ace99f7b8fda855f596630c3e99d1d61bd1eb8587b2a7658fb6343f1be1f7b7d593a002862689854939b1e2e3fea814d0d645fbf1204a2e35fbb3e6905b1db11709fc79d0ae055a4099e38db18a11c8da5da3b561944b1e210b686d9fd4133fdf1e5f4cbe04a67b578b36eea74512795b2ca2f14e4a8b6261ad0bfe68047c05e3622e8d763546c2889b4eb9ba3c1ea73e711e9b03c2c552fdd99c61ab00381cfe5e906ac454f48c89ce3514f70a0ee2e5f8170f7d26c9bbbd582788c06630ea909501581180b729edd0c1843296632ec4a73727608c560da07529ebd707e201cea3e5b5a3e58ee32cfe5c7ff595923c22a3c9d5dca46f0f716f78bcf9184bab863ede5abe9644ff0edee7666862218bfa17ac4d7e7432fef95647fee42cb8b497d5cec9d096e29180558375c1d2a478c69bfbf60c8597b9bc8280de25526d0f67c2cd725268b3d9872019583f9754ca0b685cd9ff8c1163d74d43beb8322d0736747340509b23233583ee21ebc19a60655bfb2be25807c9af66c557a1d7a3d8a15e15d627bc00c934ea516877bf2e26abd5cd6e86488f727893afa66492859792c314764960e2f60f32bbdfa8ccdffad79bfde8b0a15d65130009c1c5ec91be037b6cf1f4d34ae05016a7aedd140c9c3df4a63c14a88d944ee2b809be9958d0f25494a20f9be614595d3a53f9a6fe06147b86906566ea31e21d4e8576f27db3da4f1529559f61e91a4d63083b04e968e08354398f50e685b64d431fe04f11fc2109d5a96f8c8c5ca1fe2efbb0f42cca1618e2d78cd1cca24cc17fea83870573fb17ee1fb6e03f4412af228bd860182aeec68e515af62f75e274dd84e1a810e1008681243bcafe869c3ca6bbcfe9cf1a0416d9713578a45006c3c91e75a81c6abeade9845c33b9d1e7610738785d3cd665aa0711550787753f81bbbfee8074dc6b6854746d2f559d1f10285e3e97064bd2ac04452f2332e751ed877d419415a5a955da2570c41bd60b58d39b30d4db2f35465fd50170797495df1a711c3cdd6c70bb91c21b606e3014f91bf23aadc2d753b8a4792eb88aa585f43debdc34155ee02d93b276a26b0fa3b11e74c0b2c1a6eec914a36edd9f7f713666cdcb1e483cacb914c001177655bb1f8bbcf9407a6c8a489d15405a455d6447ea4d86974e7a408a0d1929370a6d4550d2778031ce0cb8f3038339565a70354a40e868a09beb1d46be393494c40b0b11eb7b0101e72ad0f20df5918739c98ebbaf48b963a73492ee684cab56dd951c298f03c49d7865f03d1348305f1b0d0f7cc2a2f9ab4e03aaae83dcacd2bcb094d487ddfbbac325c71f17a5646d96c8e45a7bc18d65d80ea97726dd7d606a9b3bc351a91b0402548473c3ef6dcc551434fa66039496d469149758a1b76aee2d7466e0cdc581d5ce3caf7caeceecee812b8048d474b93acd4edd088f714b493a699b34faf374681e9eb7699bc03e4755ddd716c335c0473ada6e58d7ecfaf598f92f8d08feb09e7c3ed391eb036f93354aa226581dc4fe0e7c87f4a5c846a6df94452e2b1da5c25c80b816afb1eda6273e12d7ff2e99747da0431911e00ffd23703b534ad133a820aecb6b45feda05b3aa46f880e8077ad56be984cda38b98646deb4587e70846503f57ff444ef6b4987081ba75061c28f3b34da1bb39345f6bf83ce1f273ffb5171687658f624d636796f8c0166b8421158aadb9dbe8bfa2d67aa72ff088d1a51cedb8f2b7dd63ea1f0377c8cd81b6211fcde5343dea16026777c39b8f7787e411d22586e2ef91d0861b40a87a23fd8188467a72b0d241d565154af9fb5c335fbaefdfc5fc761b60051f4d6b5db675bab9f21949bd9b2ec17adaebfddd37e59ee4c53402515d5f2bf3d7ae985535c60f443bd0a94e4be76c1e55c424abf5fac5208b02411a1ffa03ad4434d3d7a35fcc5aea19e2672c3e4ae93ca950b40357d42692b2c43a632b4256ef638233681dfed61f861b8e703738a3bde95cb9f6e426408d871fb3e46d8f2a800335b0503d0f7d34736af3bc55cee10062216e1132c132e16812c9ca1a8607fc3a79057da8bce70aea119495761d6ab8c7b6d3423f203b64caad275da2a4f89882f7c8f9aa0bfb5b00cc0aa8dbc2b5cacd3583d4bf91d658ec09b3d170240e602dd016985e15ac93918d604de20898ff382da4b56a86f67a42497de7806705984c5009e18070888144d2826e8ddd213c447e6497767c1a06ac207399252c97ef4aaaff8ce378f335d22619d06356cb58192fa5c023d1f18a0e70fc32471e0b98d210eb376234aa3cd5c8ae2838bc4a9e8242f46013f44f47352b0b3a0487f1b34a6b0f08db90bc76d70e45dae509f9208e2c0ef52c5b047989d2b0aa50213f03722e75039024226781e6cf517a874cd97249e2199f970639d29b0f5e597cb3e1daad2e82d5387e0e9fdaf344e8bb4cfce3e71598f5d8b0553dc5ed7da11e81a08ead608da33817930780155200f5cac8032a43ffa39696748641bbb100f5a56dd6b350f2dac0591168f91fce1c664419081f4cb571a6e0b8b2c1f33530108478f6b34416a1a450727ce298a7d7145f8b217163c454d53b5e0a51c85619f97208cb5988bc06a9ab9da90e61a7f5442acb69cddb09c7d9dd56da69ef09b8b28efa3048777eb4c2b3931897f23c62551ab7968f188b059b40d10ebc9a4210746ea2a51c41540e4882154895cf2aef65275d89c86682463644390f2c10185d60040b6f0652dc05115aa1d1a5af907abdb05b9d1578c3f77b8cedd102fdd08cbacc94811af724c72350e3535ef0059ffed948ed2ed3189f88cbe707fc1c63c90e4368b2344ab013403dfda2de93fad80afb4cce547711a99efd3473b75778812ccdde3f76f02edd3c96a3b013c45d32308c0abdfd5af0e0e8a46a49c20b8f22067b71545a3619d7701d8c0d375ad31f08c3d114baaed6114e9c5ce873a3a736054d2d0bdb497a3dcb1de9b811951b2425a50e4aefd242cec304d9e8b7cabe04c636e46f8ec19b1292e2f8c812915986a51f231e03a91e0de01ffd9baccad10d49666ac406cda687adffcf7ed3e3650ed091cbb3a7001ac65b439015428080712be4405432c64cb091b8213f2ff3f0628e32aba326b13ab7ab7f1df7a0957836d7e81490b44a0d1b79aee67669c842bde28ef8a2632cbec0d85a8194d9d2e834c45221b5a4c087ab08de1e4fa84d297fc90fe60d044e9ac7ac7c673c7fe1833fe1319b1c919f60a8a60bbf55ddb158cfefa000a97bf31d3ed20bfbce55b94999757e334b593a787daf1d3fdc63d9088ed1cd8d5aac436b21e9c91e058597d86441c128a637cb420b2be3ce7862719ff1452cd4a9b04126662b376b97dfd82ffc095cc3e26a27f095510277e64b321b5db44ae4ccc329f1d6eb76222cb8a894abc45a1b445356a5a69421173d6045229cd466b156ebbe7d92a5c32d0c95842853720c06f36afa2d06115604ee3dac4653be62e136421e27924358dd89c984fa53f22022618797df0b564046dfa819db4e24a05ea4e017854d4e64f2e41a85294c4aac8317064f5b8d8ccc6de54649065bd8f62509356b327d7c065a41c1f60c8f3741783b2c82df51579142d56b9818965c5791a2edf6a3e65da0e1ac0b1a42244285218cce59cc7939d378bbd1e77bf082fc85f32ce51bac1d691f921a19d2470777f3df6af3a5ee4727874dfff0de0eba53ccc90885c2d5c4f6b09a53f02c7e5d8af118718bcc8c0d8afa4454667a5eb4f5b1c711a9f1935c239720e9ede1bb7850926e59102bb6e603d69b64a38608f070dff47e4e91c51692420fc3b93480031870cb5771791d2620e69b4b88d2197c833668c2dd026d9e10a525877224586e773997264702765f3e720cae69d2cae7f3e1de27708deaccf6ddfe8212a2243a8344769164e1c0306ecb6aa2c52eeb7cdfb23fc31d224aca90c8381aee6089f806133a954bf20491a462c5ad279206e958801031ce1ff927fa314a61d735656395377abc28947eba09fd417983ba1d9d2d2f7a16e23c724b45d5906e81700fcbd4733dd7cc242c26375c7c2b34fcdb1046dcfc05798d6e11762bfe4024bf768b751a9f7192a297ede89bfe86fb36648594ecb341024226fcfa3587329b0d24cbaa022443c32a89ef23ae0cdcb1ded5337b62dab5f120735f135aa02ad55eb5182e6e9b1f5a8b029c3460dc57c519fdd9fb867a409df0ceecd15f16106efa4d7f20db05d27e9e1ec948e2970ac49b571b07ecfd3a16be322593082f53d2720ca4a17f13ea585c6e2cb4a954cf187b95ca1a2ba551d3139d7ac11869863eba6bdacfb747917fb06bfe063eebed9c817582a74a4279e808edc860b7a11559e97304f50ed3366e69e7acc4402be209a55236263c6fc5329f15e116b6e5cb9cbff2550089039cc8e59851b0a3c19f9713b6dfc144bd4e60efe9827d572ce84fbb0b301af8e4f6fa86e7038ca8270f3d6e4047a1635543dbca199837a62883f466d354869af10adeb210bf865e7277637fc173835d8d55ceb2e5426d761d2410d20123d95684350d6d7b1d319ab2eadf97ca87a8c650d6f0081a0f66577ffc1c369aad13616c3d8f610bf243d6b23dcf95d952765ed28f0e99e0270493c5ebec00081b766bf6940de6281725fac44bf761cabd88a89c2f8c944e892b6715f08edd2a2e0f8c566a176f80a8f1c69493bac38361a8ed345b9c2ab943c5ce268e8417d31a19183c4836bc21a93e08551ce5ed2badca2f7b66ee14141bd6131b4e281309f4cce4b9917b08aa3a8fbe97b7478eb97acd5b39dcf8093cfcd1ee59395820348af31706f17430146fda13fe0144b4542cab271020ef712cbb6d0cacc6d0aac2e0431f03b816e50f2860c24824981a02010c32ca8955d3511c99423cf2acce580b70731b999c7429e6216067a01cf0e77946615cb1cfda209ead51e0aed602f129a3420de3571ade3e2b5772caafbdd88bc55729bef8e94063e75ea19c35d7346c2738b5b04d073470956e60067891a976dae43fcae1e8d6f736a3aba4fbc109cb782b111615b2273e01c863f954c22c6bc0a512bcf6483bdb2118b54990963e0e26614bfa1ea20b66d00d9cd6bd980aa09ad26cd7b4f03c3052754cd139b15a8a168d647f0f5932917c6079fd2c7a27cc2970fce297ed162e4771dc7ed4d709a173a63618cf415721827a8ca0320deb264bdf6817986d5e9a95d9ff93db9e1791f6816d8235f5c98bd190a623e3a80a8df0517895443a6d9cbbce8df1601bc74378a29ab09977776905f78701ab7e8340e3544f4cda2d4af4495d0354caf549a344e47ea9d8b9fe383f0d7517e201aaae635e8c741d3682d6a5c656f82b4128061e1f44bd1d3970191dc9c1419e3169fb9657684c79e88ac2692aed183dd804880686909f94e3b062e809aa36291722bd62f0fe930e51f1839d625c59a4ada40647e8e2d2e685b2a42cc9e6626cf647278a9f3cfe660b5c2ee4997f4bad60fab299997a401a93da0e83c0763f0ecbb4e2d421f0d0a167e8af889e4779d5e0c2179b456c19feb2ef8e9e5f4854ad17ad0edd744a86e9d592d4bd8eac210c2e74a515b24ac32f7a5911e6a71ff4abe57c2e6ccbbe02fd7f4ccdbda22987a8ca4d10bec94f695161db15f736d56b33962a74ecdc89324038999da609276640d2595202662d086ef146dbe4538d7b1c837ae9e07b34de772108fe0bf62dab3f5290d14c14cfa9388d3ea90fb845abb98a493f873cc99c0d72a089b6f587f201532523a0b66283cf896ce9808b87b760b79c6b0bc5ca65d08884d482a38be7281fa9e11b81ab7ce0a092576b613d3ea151cf00e1e8ca39a39f38a042426d5abaef899902036802f219abd6d22e66be6471630727e7103cd5175377918d9fa7ff92d0d9c7e9456493dbdf41f6655ab7c59cd774b22f5401e6a4147c6dc21be382f52de362656164dd3f43467623a348edcbd21fc05b6ead6d695f26c6d9abcaf3bcf1cdae885609667c2c0794e2da174d750020e1b42fcb37085b98a0b5fbb21a796f0f7e65fe5423db624b5f500a8a95e50a00edb2fd37a823f0e03b5c34850ad3c7d39ee46020aa6ba94b43c32416b1678585e3d8ad2f878c0781737d0f03be9e170ef49bdd891a3ebd889be7034395677d39faf9e4fc18e6896bccd5842a8e64d853aa08a752d72d3cfb52b83a63eee7b7a644944d461ab6ab12b7d05dedbe300aa97a99d90fef36e97e63b357b3ecbefcdf7760509b32f818826caa37f512969f3711ec62e2d0c5ee4bef103e52b90096020186657c2d2c65d7d8396b6acef150a30495a917d7cbd8f2df17582e398e47a216b0066520161018ffba2f4177458dc4c5298b83fefa41e1fffd8a80925f7ea20dca6d79da71d227640af060d41b5032810b2684e8f48bb820ffbd541fdb3461c2d61c638a0d063c79b6874d42148bf1e2648ccfd00bd22a078cadb72e7230b00024c320b6db375e6e919fb8f009820b54ea9a1c952b6ce06b076671a62cb90a37441425568a3f3c5e59c51807c332fc39ffcd1a0ea7e6a1c928b81caeabbfbdaf8a30538fb6db7f12dbcba49f6e6d3244e43380b4c37358687ef4edf86091fd8a546fd883ddda73c67b990c29e17fab1acd4f40ed5b73417dc0ada09eb401796a556f539e7c3d4297cc8907bea80c944cc97c7036211872db2f97bc8ea49d48e792111607a2a55e97b355a36be3bff917d7a461755307b955b8344c1ca9385997fca3dafcf724a7b34ecfdd641c4a05aec5f2c28309a5c8268096ff444cd82d0207d9c807ec65d6874d69c1c0edbcefaf37c6941292d0544a85dec27bf27804654a7b68d88435d001e6364f616219934f2c514b34eb3795853a076eb96fbbaee694bda5e4a6b45ab36cb5daeb52f18ecbdaa82e92cfc98083b6dc782222fab853b717f2daa1d3d54ace961946c6920a2ae0223f957dbab19a783e1d192189ff265ca2fc31448732e7c3c6ebdae37a42ade5de69ddb325590465163585320fdd373ba1533a5129176d05e56267ec4335a66987c2425e42efee06eb2a1724e65dc8603f6f77b1039238d1ec90e2e4ea2598757b825c71656c346cb984bccf0d7aac823c65a185f9ca95df745e01d595fcab430c4b9ae459a85c9b141a72e9bb27be4499b5273e5ee4862b30eccb2d98adde9b462308ef3559b4d9080a358c8f847b0a08610db258136cc43fcd9c138136c9ac584914509377a1efa066c9d3468aa51fdcddea501812b9e85fbb7b3d0f8abe8f3cbd4d3498eefe0be0c6f1f6e18a0985d112b9be928de993818525bdd9a15028061ca07f326b9b08a7a6dba679c2c3b5f299e4c3dbdb664f4136c790c00dfb0454f8832679321741b85c61de39ab658bd6696a684dcbb700427b900d03345e503fec98d5977abd07287939c41cc19f481f0bc5743d263a19cbfefe166842b8c2b8cfcd99daef8a0ae00a86110f5d8f29fa779cd00482bb155180fdb91d5f88b49ca12d821310b9a8466dfa1c79090b53ed5718781d5ff68e04501899604f3406ae27085a04e37c56fba3735d3a30e4aff9255d8199faf691140383c3d1914744e912d7f1ebc476ef984925376e638f6b277bb0a8439a0ee7ff82139e7e5234c2543e8d10dbe5773b289fa25584c56a7d7b841201c640e4bc9d0dd85d2475eb8341b331743361b126825b133a8f666930024029262e422e24de03a77fc40cc37ddf87d735ad8884271b2265a09f4706813a799211fb8ff361267896cc92c918c215127b4dc231ede20759b30fcacb91158a74d5b70780eb9b63dd783bf839ceebe18b7287867e7ece94154150cd030ad176ca71903c38af8f512ccf4e7e393faccfb71aa0c4000e569aa6ae4cb163869d9736fe303bbda51d78fe7e4c8a743dcc6f1d68ea617f8a5144be8ced87d6f0cb1472f9e3da016e5c056f24bdc2f87ebbf9fa3cb2b96611da8a6f8e8408338f5439e0ca4f415e9d0a862f551ec2f574db93d3200f189fb550af5d737394f14b86710d51bd28e0f8a103916981f87ae8d6d2fd9ca2f4062a31dcf1a0cc6d5e45b537cabaa472d0c081398bff622473ec218b6d11b52147ebc5f02efc59d9b6ec1fad20b68cc32234e481ae7b1a6ba2c6a908e162d43390c34a8226c2ec11e01acf6f70717fed9358502269fa9101d24713ac1604078c741d429bba5bb93a5832ae125d7b5b91a9ed50905c7a6cabd6d0ad52c01d2a8be17b9727539c387b26e16eb11242b078dbca74c71d43ea016e7e2b945644545df438b61b2802b6c9f42130c9a44ce00963f5c4cef83c3bc4022e9eaf887aeecae0484571b63f46cf4620243863889f478a7c62d09ea037aeb6803a226278fb5ec724156acb62e706d47cf5b7a09b0aefd047ba81979ce391d4f17bfad8a050171f42ba040c32191e0e9e7bbb1e5fc10df94edb1d2b5d78bbd6b2e0203037fd24abe2401c0f00abc256b7173cf9a7a54a1a91eb7b82990107eb79df238525c275842f3b75e67ccc3ef1e4025d9b8f05b61b542035a68ea7eeed1b6edff1a5b062d9133c9d8b39d78740e8acce1523ae4dc604e0e8627dc64c0118705c97fc4af731c9c1b9164a90ffcb33ca001cf30d4bb1961950038cae0ccf0b6f5a846c291fa426f00149c9163cb2f5d77957c0a0b10a7d83c0122b2fc98a5b5f5db5638240c464185c8ff8ae4b170d8e05b94214994d0ca06255621a6f5ba5a6f64d8e3f84bd6fd7a8196584cc282a2cef82009c60194dd3c9f014f767827fb4d008b1d30c40ec17197b3a8f46fea5a06db999b14c903aca178b3e9278610e0d05caf47b49aed10a165bf7505397855d820c618b3547392da1b3835d22ff279986721117cb9e271f5a23e0ad49cddeda2f3c20f984490cc13d5c6b6c89487c67ed1af22996b70c5464b46c03c9995539e19bcc8034f394ecf4184984ecfd30ef1a54116e131ceec0542bd846a5e323502152d3b98a2aacd25c6b18432982022224142ec5d47d113f66047c3e7546c9ce2aab383ead4b62df454d56e14e1993d7f18b5f651505716d6e6e691beccaccc0d34b5cab2078ac8d04d19c555075ad24c9ae4bbd884651f09d77bc90ce45298a2c1ebebc38148d5b1766f4d55f48959cf1e4d990a5bb56b7a49c64e95ae3a8e713441503338291c96f7a3e11df02314a21e7c34c4a016402d32b366440f4224efa7b805ffe21dcc1fa4d655a103434319dc8bb41397657a96b8912439c1836b27da08fb5859ed138da13af658c0be5726562b35e04352bb2e5af38f15c6eb5e566d298451c0e505ed2468242fe845ca8fc565d83f3306b17eebb47f21067b656501ce89625ebc6d74eb4c5eaf7488ab236515c622ecc104e8e87f6037dd065a2ea45afbe8f9c142f5ff3a3730f38ca0a7ec7fb932feea13cff9c12e8e2188865f06aa588e736d88d665ba4fd34339e3226d3d8780ad55fc5e077c69303d9d3875407fafb2c4d955ec21628e52d6089820c1db9c5832c2ff3d51fefeb02a75de729cd72910d65b3bf7415bffa92e77839392de351be12cef1c286ef5034292f5f9d1db2bbde117bc81caadbaed00082febdc0e419c08e204d299b5967744c042b6be0b30635c4dc7740d840e35ab21543b07a51b832d3663bef8e9994086135d7c98e355f40f5cdf8b2203725773de1fc7daaba03bc2314d7b9a2c78749775ef059b8e57285e671141d8f4f0ea9ead1f2e9626b92d07926790661de0f25be2c7830f5e2272122e771be5a2f8756c16db0f706749d22bbb1c022bc1386354b43cf2dcb7a7f5b91c547cbcee5162f40c745d0bbbcec0a9dd3e589c95e3ccee5357c2e654453672eb4f962d8f5eb3e95b89a5960257791b4b275e38e7bfa9270cd185899d53996a9e9bd609359baa4a5a5ea3c99857d4079ce8968ca2c61870cf1975928b025531cd6886098c99f324bd1e306813a69cf95593e34dc77b0d0082d3448ac8d87b2e67805d84bc0f74a32cba4bc6496460961297693cc627997b7fc348650966e753dc8254059ba41bd4ef8e5a6f35a2236b925050bb3a31194f0315b9427ba58bb36591c59ea74835a594ed51d917c7ff6ea6e86e4f6e1b4f6452e4a7537e4373616964b250442e01f20861bb9881b6af566a32b549236986248cb8df59563507cc2dd26ba34aeb47b77351472cdf7f7de517c2a5a1ee0c3647d36cb507cc673e6b274f2ddae2640c814dae47c9ae69e21645cef5e8f6004771f04449d452ad8935b6db040483c9b1b8a25c12de1d2289a20b768252b43775ef260825ce1409965dff418e1413105621c3e63a4ba163431eb335e6d74a257c02cc67077cba8a847cc5c2dc2ac1aa99b04539b4c11ae373d29e219c86ad36b86781ed63552d843e9531bc66a8b654f733c3709c44a3d753304c2d3a71267e77a60356cd250ad2a7b5ff2167c4e9d95220afa4dcc2f8eba833cbd81dc12edf2ddf28ea8fabd17c82a6a814007c3a2b8541ed03097364ce27c16c3243cc3d690152611170ee583a1f459767c4f6ad1fc91749727a61e5307c8caaaa33d3fb2f6abd0f0dc0c462aae63311a37d199aedefa29aec8a2621749641716157b0e9e16a60344d1c313601c5e595559529a42a75dde383cd6809510c671238d77236e9404c73b083d619609c1e27fa9d8e108712a96e4b903d0f2bb5001390a00de18bba91ff68ef8abc4c2795d1324c45da0c193dab2877d8b8a16c893dddb893138821a40b399b00f5e4f60fe85bfebfcc98a928ba16ef39af41f0e5031141f027dc550d2aa9cd34ebb550ec74d3c7c94a7c890f6811e4502c9320343be9eb21e8302110b21a50a66753942b010915ddf0285cf737038ad6a60dafe8d524933ea9501d5be0dda297e901eb384eef028a4aa0ed92163daf30f96e2bc79ef03484afcb65cd3025dbb8ac992c91987d419d18a3e0a4344e9e77fdc7b326ae024ef809f2b310115d87bea5300701c20a9b6f93e2f63b826793de823269945ab8027022cc4ec44738b3a714474d3b190aec423953b23d34cb3425e80a5349e68da2626a31953810fc24fa1434994c80828c93baaa5722a3bd0a21f8a81552b64f0de0cd8cc8f31284be05579d01266edca7882c9a6db9933d247e17a97b3cd46ac176d3aa8b64158cff96b74c32b7203a9c6275a62ad75995a0ace87ad98bf2e184da71cd74010aaaec428cb8372c1c9d263dee140ae99b8239b647a6732d760598582984dbbad2d9ee9244b3d3a1eff528fefa0bada5bc79a2c03ccc9c0d4576e88490993e381f32783b645785761b6235214148e53a4eaffa3f00d06440d12db2db3682a9d946f4ddba1926bba309cc62739f243057be770dc7cb72ceef3f635487a0950acc0ac5f72c75d5b875b99914eab9a16ad34c41c66a5fdd3ac9e1b80e15f13870db79118b13d2d43b772654dd1e4be86ff40128616ea4cb4027ec30687a97d9834d6e07c02adebb05756fd7570dccffc14d83ed5f0231defaa3931a12a5bb3f97e2af4889124024c987c66b3d5d9640b7b7bf836561f3bc6a1c5d894780bd68a6d7a76fe4f191c645b984ee0da920b544a119588e35a14d4622d8eb33fa2e04ec94682ca9129bcbcd387cb5c8a03288ce7e6c9a94ae74f625bd857aeb8625aa9a10de247ae126945b999bc6ed80d3202e2facc3d1af80d9fb3fe9fa012e8086646d3fecc4b2400afef21553a90ced2f408088aa2823a94dc74aa26ff9250de60006f5aaef9f1a2d76c7d22f2da7acd61cf9e902d4da22bcb0659a818ae97118e4c65a1962af2c0b1728dbed292eac214df95ade386bdda70708e4d7066eeab360d84f90b052a3762a59afab18833b4f2d0ce483fa7d63fa141cf5711395e08c57492cdbdac7d0f13b08a5a05e1fcf9d9340ea58a43f0f796cebf99cf7b33e1d481161a7225f6f032d4b4fb50df25286d973fcb23802ac538844fc5e15a10a2af895d5766bdfcdb427298a2c380ce842ab418c9dfbd72fea13944a7e0cb2b2b55249333f87df4f8a3d908d19418b44d9c791174bc81a4214c576cd69671d3814f6ac6c0a939fe7c74396b4ec086d5a03fdd21521c6c2d5033895f166b876245554aa90fe651e483a0bc22105bdcad87d6a80940d815682a4988a4e9ed4e9ad2d26556747923c8c0cd50bd2cabdfc470d4ac10eb5149749d1a5b885ad0ddb1714658e4a86a8de2e89486fd2da25cab51d45ce60fea88441677fc8f29da578a7b4011dc31280a917df64e9d9938b0fc34dd7c6d9e036ea400e9f4aef77feb1e8ee4da5220d447809a58afae0a16f34d6d2f0da2b01f70fee46adfbaece4e9c35d73c293ebd845836d5eab903120e0a670abb20fb531c83b84b7f069228612aca52915b4ac0752dc14636bcfcfa3c82360ea94f9d20cdf545896fb97a01468711af6f9b13a02406bbd342dd8e10f23e7a5b9043f4b5b5d9ac0c43c4b065e5da83100841f80d071d1cc665d16f84b337c042d0e755163e03c3a481577f64a830682ec46941161b5f1d3dccfd4dc6bf6ab1e1060a2c4384a917533bb8e6d88a0a37b1b0088b516924f849794aeac85e81d88c1ee48878989d963bf2eb6568b5a3cae41d75e25fa8e217edda41c21a8af887d9b4adf12526e24bcaf1ac1af979c0383ea5a10cb1104dc0350f1c15e0cb7129373d1f5fb2604edf20816b3cad9b865d2bb55c9970c6a5d9b6d8bccaa5bbf7313f1452b0582d1797804e7861fe5b80bc4ce019792d664d79655d90b163c4ad7870793aeada33521beaef582fae87bd9c5ab1eae6b0ce7e59511fad53a6e364d17d4ea10da83f87e87b13538179b0b0d434b716a02e30bb5b8f40243531f5095640ac4cc00032abe9cd813a8b47d6e2fd96f989b4f23b974badcad4b0c628aaddf64c18bdc2d7ad8d68a8754c0e210094c6be943e4ed9527d231339a78797b6be5536f7b03542732a7db3a31937cd88955d035a82fadbe1c56c3a9e47b50a714803fead2626e88182b15a9bb9f312cf46e1f8a5427e380b5c93c9726ca3b9b8432a90d6fc42f7e15302e9c1eff3e1a7d8156276534fe7ee1743a02c398cd871b1f04ef0f9fd95671e8d934cace951111040303e6c0780d9f342c113ec8a422926ac8f9b68f64588cad72d1c4f48a2de3ac1ae6e189f8631384f7b2336d479221e618468dcfe0929ed6e9f1c2bf26aac75940f1813828bb21865cea91fd01f318d0aca8a6acbae4e2c8be8d77ec74ddfc3dcccb48d282a98939e761ad87b7dd3fe517260721d67624f5120d1a2d9d18aa22b8a4bc1fad35a84b4d69782fba4ff999f6766864e13467abb8046113d4a80eb50d5dff0f7c0e4c330e6820aa724a077f5cd3d691cc750fbb35cd3df0466aeb28df0c5ce4d0f8cdfe1b3dac7bef2610dd4894dd30d6b846d2812f53350a8648ad9b0ebe8ef301b4847b5630724759d15bdd0767b1e2af5b11706a4b79d81ab1e150d03896d45065de3504dcc35c58e132e145335ee29fe0250cb384c4be5102e760fecbdd2b05347826ebb4c76b69e655e24c5664a88f925e5e4c6056e728dd7dbe832ede8371b825d6fd2fb79b49f736bfbc08de29587d0b4d295fb04b58647766d29fb9f06ded67152c0970f9ac7ac0593a8f4d64cc0821929b83da239681eb76aa2884bce3ef9d45e4759a0dc0dcb908a1818fec43a1aad2bc081ece0c68c725bf09beab765cad225b06db3ffcbac6db32cd05440393ec65c130cbd8f9ace9c2e4c4aa16e2b89045ab3e2321165b3f52173ac94efb6adca09093032d0c700c830161a38216c2a734d06984e023c18bddfcbb79129110c57e4cfad0649478c382d1a48973817497155459e634eddc1dd351e5f2233a2366b6ec6bab7e20d6c1c86059806886ac4b7935f91f55a928bf1afa02c1d6440e822d33ce781449c829875e291208a89c087ac5ced211cebb703a8ffdec695a7b3ec1c00a1768dd78c8d3d4c1a98f902ca7780f69074b81441af32193645d123eff00d32e30786277a4951c677c620017f947ceddad5f33fcd7417dff1532840d0929e21a29ba0caba8503735060f697071ce19fffb093e72c903a548af32d4f83c1e194e3264154c25431f939a3b6cd983fc836865b6d0515577eab656058572270cbf116ce821d99398f2205d0dd54bd5d3965485bbc7e4de5953f616b855cdf55d3b2303c21daad7141c22e6f895db4d2b6b4a90e1b1969f9a51709cd367b64477693404ed2d2afc12014f3786f15963ffbd91aa7210eda618e2991ba417391fbed1dfa63fd1382be2ef4d650a584feb08f8b6223307e5d4b1a64aeede6effbe55574a552335d16bbb296444c87c756aafe08c650c910924934b26f5ea93e17ae03614dfc429a021768f6648a12b0c3a36ab25be332e7b9aaf1661b7beb5a913f90c6d910c2a305004695a130c1d64f79198e2679c9e03a23e666ddb54d2e4960b3c15445e6ddfa209cb5230a8a242a31ae3e314a532717ea4a29c6654bc24931ee453fabb93a35fc847017ae0af9822c259810e484b3e32f2f5eee11439e535fc729103d93d1c68a70fee5040e92af8eb695cbbcc03661ef22dd11176b6f37d9a8846c2a45bfde87ac4e1b6250e5ee126fe32271543f5539ee468e1096ff4d4d42976f801d995f1816d7dfce0447b01170361e978b201ac2a98187972c4a4e65c04bca9a58a0a02fe1679313ad5c8f8dc7d65ebf2d6708807fbb715bb3fd6c860857350ab1a06adfc02f33c516d103e2a428f7c4b0a2f773e8428749373c739464e5389583f149046b8c2d328b879509ba35a5bd25b7e527fc35581c85591f8d5c87354f27d933affc7f997e9b79d4368ac3c94e2540ccab3d6b54305b60e09ee2b37fec2921c2c277baa12197110deef9dcaaf8c0ed3f9743c7c9c8c85f250b79506ab0c05e6b024b002b1b70960041dc4bc4d217748e33a645e80240c39958e9bc4f6a990919a6c28b0357ecc942787d3461964922c602de2ae2f38fb9017c2a7b2a5d1a2caa2425bd3cf8e27e12501b7a3b5118550af7e0fe469791558b0e1b733a2ee06d3e5acc703cab5fa875b4090b24a074ae66bd9b71af1651a897d1f788aa168d975c08138559a5fc798b2dcf7bd73d296279ce383d9789221ebee42d61df4936bbb678b22a69a0b19f4a6077f9164c70ed20eb962a2a34c78fb5b6e22f7de5b4a29a54c490631081b08d908b202b7e9beacd0b9eb9f0a782aa700715e5ea26055db0b962e7b32c71186d5d57a5e5fc803e2d9fa09f0f80d7cebb315ad27c6135f45b6b2c85655898ef213233fa41faae4cb1f96a66d693f2b3f5e8f860f4e9410b7fe55ed05e987a3dcd91c593facbf10e7c25d552bee346cb510e7acf6576f28cd01fcc6b13577f0ac0e8e2a0229eb8f4e0c2d21f8966ff939e4352eef355df58e3375e3bb6f3ea8911f2abfa3e94721e0f9d38febaf3f3884609c7467787474d4d539d45387fc26e537f17142c029ae054a96b83e0901d726b2872c3f86868b3ff55dcd291d64ba87a00fc6386ad7391d6d75fa53299fd475616f0e419c9acff136fe4197afd9b8edbd9a10b6d4639fd4479f7b93ac8b0c4fa606179776e9ee477a4f541197ecb372c5b2d2e8ee8af1c83979555713da13b18a9845f4429b626d3c8a479ccccb8f45584c5918968238238c706db85b604b4bb7746a7b79c33218e3f8c2edaaa6dc31a96a726e84dc2df3db57191ecebb892fab0e59d612d4905358e6b74d6693f96775367c9d9379215e35f94deae55762f80dfe1e3c9691fb59c8fdd203b97d868d8cdcdf6211d093e3a7f086e542a1321073bf0a596efc91e847ea31ce4067fccf0ec1f83927833b1b1c8b9c4be128e5b23685c6cde15e28ac631096b938f6f0da61940f6e5bd7798ba9f75a5a5232a94fe1d88373f2be54ed837f48411c5dbfe9620f7348c96fba2894abf88d8c53b29c43392e9ce237dbcb6d7bf983edc5391ddf920377d506eeae0b8e444bb0d60b971aeb78f86d877896da75ee43903aecb7fdb651cbb1caf1e3d3f8cdf6f179f4eb6fab83e3531d04bffc1b32ef667b59f3cb05f2b2e1ed3d11e2cf8ddb42d8e226b3451deec3a939e4b1b63a5166eb641eff8ef84499e65f0829f9839f7fa1eacf1c9a433f433ff1e7508c4745f1bb49143ff784b3bf984310a7c1e8a5348e785094e524ea184caf46d5030fa797a49492659da19dea084e90e5cf881f26dd5433e15eeaa5d45f146f9d2fadc5c707631f8c31c675874f0b78c78ec73a74b4748c31c27c6de2c46fe213bcc11e88b68f5bdc925a5cb8ef6242a8a9c13109a738bc14027eb0260aedf898b463c7cb1d3b76ec88423470aee071f26312c4993fbc1af9f2a350079943d3892525ace4594496af82d7437e1773c85289b7170f670ec11ae94e76d07ce74c88c2281ae3cda332687ec777730804105c5e7aa9979aa99b886cb83b8235fe9fb6c807df76c8b344b0129ceac1ad8cfc46c7cbaf8e204e08df8d90e5d7f85983fcc6677b2c3f840df6e035f241d8e08e0d16d16cd0a86548ea533db81d3c82499fc23b292992200e5c4ae1e7dce5f2f380c4ec0d633f89c2afc3c67723e42c58e052eae5f7d24bfd86fb63cb1c4acad2e5bb3994e5ccff068f9c939f63e3e9fc018637b6aef38d9fb6fecce0f6cf7c577fea4feda112f9cd8c94989a636e8e49e5180dc7d64cdde49cfc69fb477e4de1aeca9f19f9d677f5a7eb3a4311fbfdf0c76fb0975f99f84dbf7c13ec7777d5cbc86c2fdfd85e8ef9e9bec6d6a55eb61568ee522bac10b3b6c950a2d4abe97f1bf9f0e8687b5b8d447e43f1ad951376064871bd2cbb6fadfdecbeb5d745fbcf59966537b3d65a9b6536b399b5d65a6b6f66efb57fb37b517fb32cb399b5f666d67e66eda33ecb6ccb5bfb2d594b4b96d9ecdabf2eac23a6a132f8ef3dfbdae682bbcea8d76ed692692fb7b468d95fd9b5d65a6badb5f7b39bfd7571b99fbddd329b596b5f88df7bdfdeec66d9b3d65afbd4ea586bab8579e938839be11dfbd95fdcd9bfdfc5a212ec90beacfd67dfe2e7dc263fdba210a81335af61824bfe7b38df7c73c20963965c87ff1abe8c45e447f931c6f8f2bd18166e5f714ef6739712156bd00fa5c8fd3e3489e294a32c41791d4a718f717fb692a43bcf397f3f652a4b7d39b85daae352339fe10eb5befe7840aa87d6d3ef08906156dfda2afa93fedc5eb6847825ffbd43e9efb9f30da420f900a5a9e8a42b3433f229bb93937f3b4927086dec281e0e6645f64eeaa49602bfa4fa4a6c1eb2c7187f7b382ef422ecb02cbfaf5c9d14b138e7094882fe6fe12e553b29dae8586edce98c2be3f3c68e70197e2f99906588fb4accb11f84a82e09517e3a7aacae66540fcbfebeb6ddbfb47fdac3a6ac695ab6ddcf969ccb1a8bb66538752fae4986d1287b0df51a5214a5acfdcd5e7bd46b7f518c1e6508bf7b812fdfd158d8fbcda56d1fc4d59eaae0765c95fd63f2301573b5ac15695a11ac89414c707412e3c2dde1e9ec455c8c0b77e73e4f67ed3737720ebeb6799173b085db710e25caed10998f3496ac7dca394dc3ef5c7667d10392655be769c4ccfeb2b22bcb50a8cf50289a82ab7d178be210961cf4806c2f5b5f831e901b6e14720e5a1f8b8cfc467b40500fff426d9d2392f6f7b547fd75fddda68d2d417b1446b9b8fcdd6cb61fce41977951702ec3f189d58946bc1ed0c6a2d7033e1dba9d1315214539ca4fd374b4b75be7d97e7c220431e734ec8fb2dbcb47ed85787c125baeece1572eeefd589423472a75835e0d7cfa93c86f5c1efe94e237f765eb3adbbfeef6b2cb16b30bc647b87cffbadbcd578645bfd1a213196a9aa669b1e8d5c0d734ed2fd8ed104a54f677eb8c7db6b914e7e0c7c870ef67b57a2db2a06adf4526aa866b10c4a981619173f067702fded1fe7e863bedb3bfd95f1cad4e869f73b8c372b4350705ad10eb0a3d87481c79a0107360e5d4e23062f4d51d93b251638c0933068dd2d1c95352aa422577a5076466ff966578115908c363f61f238b2ac2c84a55c03072bf2f41a5070436bd1e4db0063abd9c6b6e30622f559c5372ceaf8a26c19a8e30c62308c580d0094a899b6092a55df13e5da7996f4abd5cf8e438b428bb0d9d66be29f572eb554ac1f728a79c53d248c949279a034fb7eae706df7f30a8d5bf2eb72ccb33cbc29c5a3bfe16a8835c4ffdedb4d45e2ee9bcf08ed31e248dfd34e62477f0797ce7fa24795a9446f9d84f07692c2877d0c23bf4a1fcebf27cfddc3a8c4986d94fdccd8bc2795d0d2fd93f99461f5813a9532ce33fd84f771893dcd885b5e02028e9bb7ccb7791e2aeedcbe682bbfe69c118eb6ecc285feeee17c67e68fb409c18f4be9f40273108e244214cdb6660b8ed9329ad4f9b520c885adfd87a3b8f6093d2ad3b827514a2b9bfe3a1d93ecab28f555ab38d7fadc51d0fed9f8fff707704c38030a08931c1805a841989f2d3d1a3b58d2b34e94d986275ebc3fc7bb9d5afb6be9e9530ef1b76d1f84d86fd75c1aaaaaa1dfa49b2df4a4af97056dafd29b516dcf9f47b1f5ebc039fbee38ec7710f12ffee1fff6ea7dc61cfe33bf79364efeaaf4b761336ab7bbf31cce3597a74f8471ce21df9f71d773cd023ee30bfbed9c0c004d08965e8f7637fdddfbf6d11ff893b1e67c2be56ed1deff85f0d93eff22d3ffd351bfcc203b37f0bf60dd4c4a1cceff4623ebf3e36e5cfeb053f2a7695e24e62ab3b824d0c61d7f25be223589630637847fefcc61d0ffcc69e80d93c30cb9f8d656ca00d6ea0ea61eec7deab9f325e30db7cb7aaaa6aa65ce79cd3fde8fa8b524b38c5676878d8cc59bdb5c1b7416c9bf9b9b98d1a30a9f7bf2e8b524a797cc77e923c25262df996cc37c5627c7410ecdbfe8d2231f846d779cd6904633154c6e01dfa3113770f922479feb3e920f8a150eefc797c27e693e4b97530d328dfa683c087b3e3698a773ce6e1fb80f5bbeae7c41d6c92fd6dadf06fccc0702be6f1989fdf5598c7337c0a9b3c290c9027eedc04f9313116d3fa172a0116fb6811fa65700cee626e2c631fbe10ad04f9f3e7b72d227fdac039bb1befdfc126195e4ba4633eb345b0dc59c696fb3e3ac87cef70c0ee0696799425227fa7f18db7b6089665578803773fb23f8acb2ee7df803a704abee8cc56ca297fca18eca345f0b799bec937fdb7dfb0105813ff5f7097ca8135fc017eb0e6e20a3ff8aee678cc23f3f6600d2ac7f660cdf54185d5fee5988f0ed2f50f89bb1f12773c5266fb234f8b6702e85bb00468b14c35026343fb42208e1158133f1ef990b9ff47b67e5a3f2dee5e1ab11fad8d16773c12f361595625a99452e64ab18f1661e2da3e373c3543958c65d417f12413203f242298889092b9fc90886092899892afdc3fe337d6e79c53becf3a67cf6fe9d35f4e1ec73c9ebbe29d7eece37cece7765faaeaafea5f1731ed4192a4ab10b8837d921cb70ee6ee22eda7ae02cc3bf4b122d9c5e3f116c970e719cba84a1ffbee08d661b8dbb14cfd6925a084fef8317690f893c773b444501ff14e7cec31d4cc62763946bd95610bc747555667d2ede53a73cb1c3799fb6311d9d96d0957c6baea06ea2072667e57dc75d61e66adeb5cdf6279277e7d8aabfd28437fbe7c9baf7fe408d64522fd3b18ee3adb2258eeb78118ee2edcc5dcb8c3404fae6f4dab3399e46a93336fdd06727c0ee4183fd312ae3c7103b50812c7eb740dc08628433957d65d84c08ca2239f9c2b7b4d2c6de1234451ce95f9124b473957e645a06029e7cadc89a7a49c2bf3295a1ce55c5903c16489a19cd7c50f4a5e173f28e9205eb0220808a62d88ee4c3f99400747291a1914be7192f7840b529672a2c830e52beb1c6808c349ce95c11f287c722a22279c8a4081152749fa2707207c5cb034f9c9b9b224ee850b47594fce952579492c449194f39c001d1643a91f61e19493a41b165d17eda2c6a9c94a0a54895a41b700610708f8790ddd819fd75951251daea3faa64a2d3f5b3ad517e23dd249628971934ef56b8c3a5ec74b27898556f1706210cd224bea4596348c2c5fc7ebc012cbd6b2c5209925cb6f128784a6922c3f46bfd1f10f8bd5914ef55d0ad1cf772842ce3d69c0a7a7b43afe52a25815f8a55715fe4ecbf8bb98dc5125175242b1e8904fb350abd3f2d4ead0d7b1d1e0bfde162b3ca4ffeb534bc2cb15d33887ebf38a9f2a39275fc746abfc70ad9f6f05e3271d4bc16f3a87a829356a6c322d58088adfc08f97c842a150755616a64a321f7c0a1da47af91088c0bbc13b5c4070a92eb8aa20ecc0d5dab06a56aa54c51c2e057322aad4449de813bde237968a41b1d025ca849de0375df527581c33d3a5544e4484caae8e1d3ab28e31e678797a65c96f225395f8e3164f90589cd39c9c6b72af4f7dccc3772722a2791c1094fc26e6e5bb15a3efbccad1149adb97e6442ec58b70cc60dc1dc11a6fdf51a51c5f6bc5277cd52448c90fc4d9f130f5635085693610b6f893e198992f493a9df013ef4c2c4ef85225aa44ab502b34cee198a9fe298bd7d4f8ee3db9145e379f32310e924e414e32bf6d243827ff379ece393002a892cc7754892a51258a853ef98dcccba75952b061e3dfb391ca363889e385f8079b4b711c9bcc0cfe7c29d58aa9920c76a2d4775429e63b27a2595841a15e8956a15650d85b56cac6b6424f18aa44698bd4f0c5ddcd4f02ca6eef76bd44ef5c16bf8f7af8dd74b96f9e9fdfb8c780e0d22e32f22e72c743fc69e7b148abb2af88ba15e27090e3b82caf59018853e3b17fb05f8d3fccf6b279bee8a3291b7f350fea2697f25d468d14b581e7cb3ae5b4ae36afdcf77a5c69b811e724d63f467c7bb95eb189780595c8056a0a0a15fbc76fe41ba9aa7c61d8dcda88935d14e5f6bb7ce74d3a8cd7c45dc887fc86a833fb9a7c92e5bb2571742924c01af9734321888c3c5b7086bbfe212597e4f918eeee1979fe855ff07c14be328b809eecaf399e7fa7a6e3deee29382729c53b124b0085b292614d62c86cfe6d7a4098f8cd44fd7ba8877a97e97f1805e764ccfe211129655854c5a8e9680a931c95125f4262e228fbd7c84a30a5256ac0796338214df1a92ce9e337f0db8bec1f675e8fae17e6015a1daba373188e93897cfa9810c7b6e8356e7d095675dd9be08e4a3d68c9af9b9369b3b44abb9f44eef007f946d574b7dcedc8b69aa8fb38a2e7c8ee31d96d64ff2e95e503026f9665d957e7b27f36fb67357cb30d6531ab8ac9afc7e6d96ab9219bae47d3c91c1e73c3eaac43d42941453c8a3a4814f294daa54c092a2282472ca2558510266187381c1525051149293ec5c809c4a1946b113a9f69ece26c46c02eabfaaf79dad8bc9caf2a4495e0769d44248dfc26f68b4ad0b3222ab17f7f8d1063ac8ef3e3e31322fb617c1a8ec70f1ae7fabaaced6d15732e0add7ebf68382aa594733ead54850be4497f87be9c12d22eaee737fe9688fbcb2da18450b6952f887995af88c19a2f89453b246e2e67be28362b4663be2aac5a58e5f9ba30cb0e897fd921f1ab4aa3cb11d85442970a9e7b9a9f2cfccf104cfca4e0fbe687048590ec42ce6ef9859452da0f40c14557a57c596429e551bc2a2888a07062490baea603117c81032cacd8028b242c8eae507af5b2811262201dbd90021b1b1a63e82058d8c1924b8ce79ee6c9d8e2b9a7f9af7e7610c4b484076464f9243332fc9754104ff85c587e484938c8577e48494c158ca752053fe47953f7e5de194375d4827bdd97aa89dcdd8f42d8a024acb8a8482206394822074749f4a04acc0fc98aa72b4b92beb83d8d738d8249050da8d04135e79c732ad99067d339e79c5309873ca794f2619c36cc390590e7df1df2fc940af29431622a3c5c5482c8f079d85cf92141a1745365242a466019fe5ba2549ce49a1f1295209a464df11821dfc4295460b044a5064750e981131725430bf722c1d30e18d1adf9214de18365620a227098e2091c4c01032953387971b5fc90a860c1052a68a042c509ae4882357d5f9094c04115a5f80286f3f04d70617e484743d603473ba8e0d4831b6e681264040f968ea01c600a30aea4e0ca114b749103bb38d2a1ef0bd291098eaefa9880a2892c949a60802109060f9042c50c4763dce0082670e0a203a28a1cec40075e3c5de9d901045148f07483335e20da020243f060062b320c2d41d1e29d81c30eb010c20c2eb8704116465e602286a5216a8042045652d8706025062cb8e003192078818d148e08011554c430222a820c2c6c95285c8c01c443173bb822052c611c3dfdd090040e33a8e2002564ec808485a8861c6060c5039e8832c50b34943c89c28676c10f2968a18a0e5cccd042510c553c20c7071864003202638c23947a86a801183624b1a40524b250f180be010c8096a001932fa84c71618008092daa0022861178414500305062062376b88209175250008a26559260018b085c88e248154d3885c0043dfc3001c5a3f2bc68420b25208010020c9f277a62b082051a8628e30a179e488238ef080830bea0e208a1195a90e3c4032af4149ecd08390aa9b73f450289655a7e7cb9555833e4b185900872f7767768e33720691a10e5cc9710a02f3f004e394802e09403818ea84119f9bd1a247c8cac1825e58774e5498ffc908c4890ef03d23836454e7c70820443b8004b0ecccf39886414821cffbdeb90041326403f42f0543c7c9c1b22fa4dc725e58e271e81566a9e8c70770433e20886844da6b4ba534f327d42a7ed464c4c3260c204e80788c70f8f1f1e3f3c5e889be4a184870f8f1730261810f65359a9ac545854552a2c00e05383464d969aa71a3466d044b49426c25a6bad0779907fc099f8076470f5ac15a5b4daba2479d63a8b9c4af0d12244a70f379b1621fe14023d62efa9ed31a0105268428c3d1976f0fde5ecc990c7b3ec91dd4f5c186dcceb5f0fcb90f0727d222f573c33c3adb56e1d7d8fb427cb8d07e6881b0826b9b8c4181797eae222615e8379f93e3a084cbd3418dcf56498d7b6aabd8d0f585f5a9d2a04c26c31ffac4e0cee7ab2cb0b71ed7af56daa8faa5517171fafd6ce00466cd448491729ebdb48c19f7228428142fea4b3c4f39f8dc4b089f536be5fd678f99df572e2783923f3dd4d65893bed5dbebb38b091192c836fa49e7c233085bb2745eaaa7067802caf975f314c8579f90f2b867dcbbfe00afbfa2edb0c0d57c33c32bbb4e0eaedc6e3d9e53b1b155b17bca361974afbaa06e6f1cec23c9eb5b7d8878f0e82e11ded5dbedfad092e3098c7f385bd86491f2d82a417aa2d11faafb2aea7f63122f6278e11ec82b514b63ad8f746ab75199973e9dbed104bc433f699ddb00bbd21e7c386bb3c99733ecd89654ea739c598134bdc4ccd447fd689bb66caacbf1e75e7f52cc37286bb23594dd6829fd764583643c3b5f0112c5bb88b28fb913eaa7ecc16deb1d95b0f7731cbfa282619b5a8e3ec2bbc532bcef0ec6dbee4b2acf36b95b3cecd022f59e29dfad66741c20484ea794a27a5d977f6f2330cd419ee066a2130db50ff7a80ba9968ff003135a540381748a36f7d55fdf517ee5e727dbb557fed6540cb6bef56a77ecb76abbb3dafe95e72b555e76aadf52bfc67626262026202b2b17e5970f54829149f4027dea4837ef0fc1851efabb78910c76b2c8c6d18962dabba2afa313fbc73459965c53bfecf8437adf78e77287d38f68d2fa5945252da9242ba5900cb12ef448c19313162028425456d36b00616a19b7c4929d59142e0dc6a05a294c98b517eec187150df451b8883c210c628f143a30bbffbdc8f85c037e3d6402d42fca802941175c52565951c427e4845f4c0a4c827c7e487540453be2026a58849708ae78a3b573cb1a75feb775d34a4b3ec507fdf5b7f5b1ef6d7cde5fb5bb6ce26d7eceb3f6d8bb9d3be56dd11acabfd77b3b1708735b6be2d919dfe982fde41e17e6b73611ecf8d793ca3649e15de41fd35e1520df378ce70d783c23bfd32435b44e6ae6adde4359f6e93b6eceec691e6f71a7748624f378c56a7e5fd2a5fd3eef5ecc5759bf55bca2c9256670a8177cbfef5d497ebfb17e7acdb9317c59edfd8fa2357dc1dc19a081d49448bb0595fcdfb10c7e5a1cbcfcdfed5b2b9f0d0527f6e75d639677d140a85aaa8576b4b7d5b37978d6ef4515bf5f7610d74ce6beaa59bf53ad7b9dea273d877fd8aa96c22a610481fccbca5090c33c298e4f679f19bfbef53cf09ec6cab5bfdbbbdbcb575335c57d6ed0d3d2a71dd7b063925e184253f39bdd44cc17525b1248b8da5da6feae7e988a78844bf77ff3c1df1e4a48905de47dcee520a85055935aa46edeedeeedeeeddf069835289a8d5a81ad521aad195d52552a420dd0e2e2d9171d688d18a542b56a34faa22ddaed65ac3edc7b2dcbaa42e79e9a11271eb10d76bb8424495b630aa4fd84008892061712e7f7619e11631e489bbdb127717e21cf7a50bfed3e9f7228fa6f43d8710767e5d8ffcc0d57977e76b5ab9ef1d0124c0ed00100b71ae7bbc7dc9955133eeebf710f6bfad3e2ce3f8e5c0839e96ac2875510bb5cf125c721ff7a9dbcfa95cefe1c0afeff9c3e8feb323ae39ad246fbcefa4ecb05ce1a3133a151fe1bff75ee21d1b4af7860b5f695ab9f01140c201a49027dec3b05638311627ae0e43bcbace4f425821aece59b95f6da0f34d4a677d32c880920c28e997e7be80db587c47d1028ddc477e45865664f87528c3c7b24823c3176881051700a7baa4ebad4119554beeae07be80dd63287b85fd13818e8831c61869ac28893c5c3fd9477e4866fce41710bd4028778ff40227389de36f63756413d75f5671ad7f1602d6cba45b42bdc8703a8a93522aa584f1a9452bbede0b8531437cdf867a2d01f47a538fce27c6a4d3bd494ec0b94ff5eddaaf67ac35957a48b2e3f3d92d3c5cdddd31fe8094526ce3dc9b18c634e0e34163835b04a73e93c6edb760451be2aa88db7f9d7b463ec7f7288509c8917768a513421823445111679cb44e692f0c8b91ab53c6ae48688d72cea452d825e3acd8554429a558d297b4de28a5c4ae38b1abc8cb90674c19713b998fea7aa68c91e276c2850953524049fcca513b403969ada2cd0f1e28ccd6d44753c8333e8ec6b72c5a6b7f356752290bb32e14c4efe825593fc2dbd0703c46b06927f8ffe58bbd17abe14efb9dcfd8d7dd0ddbdac9c49e83db6f0371da894d9648b188e9c84765d86d27eda49fb49307b4931751eff590ed637d485d9b322e981cac0b34402159f1430e42df15597ebd5964f9840b9464f91e8e8c6189d0c3dbc3660492129597e14951451619422ab0c8f0fd3d1cda5204d7a3f9976357efcbcca79a0553e6922b44ad6a139711f7a54ea94cd425ea12af4c2cc1c4edb0252a77293b2cbe0a1c4965f80e6b0d1851ae5567ebcd84f745aefef20ba2deaa446e5f2ffbabd660a50c16d820074912ec47d270c3655df15cca9f273ebf5229f5a1e42a9be4fad5867b05590f371b5b8dadad4e9d39303032284c24ed012d7c8821074912cc2807e693cc1ba6c889527d4fce0591bc24305a0025074992ab0639309f246291464e94caa5bc422e759432bc7c2797a486b8d5915c28c85b2cc46a0dd7460c667b39d0ea9c302d135c19c6c38941728c5cbf934fafa93621f1704e904de44a25577945ae2f4b2087c85546c955ea70c6bb72fd98e501715943ae52865c97e4faf494e52e063dc1f893eb771286faf3e166f3b3274025b8d93c376805d6d4f8549560150fc70656dca5c2b85ed4dad42cb84253a0a8a9ff6c03e6c7a78a8cdb795393dfd8ab5ad4c20bf3dc712d809afc268e65bc9afab57ec43fb9e290eb771f712946120505faf32746927ad28110577228aeb0a67ecfbc705f8e8c618950cecb7101a691464e94fa9e5e8ffa561ad7e53b2fd230ee5ac39db648cb77f15d8b4f7e6387602e1b8f4d85125af01379996be17a1187492172e148d45684dac9b9fad18973f52d1c839cabf55d897b82b6ad10f305fcc67efd13ead75bffb21b9661b697e34df2abac4fb962dc8f76d9de31fb35319b11389bfc38e993eb8bb971f7305b142b7a53fd54eade5a2dac01e7ea5fc0b9aa88db3da79a539b2c0abfd7233ebd9afa586f7163d014b97e6cf2a483f8d78736063571aea29ee4fa3504b77e7c82b5befade04eb63cad537f4af780723b2be4389eec676e6c77f416efcf931f2c83cb7296ee748c492e2b60ec59d91adffa2f9d9aa80ce15fb6f33f7d7ca231f0f95d70b9bbc18e07f3c1eef537d5df887d7f403968c404286f5d5c8afb6faa90ad01bdf11bcc2a16b71c96fd8fda2689a4e5124b9c4a328cc40054981433f58b13b43959e45c131076b60bbe4ce2ae4c8cd81a60c3b0d10e52354e96acafdd5c70786cc03bff3b326a432c4fdba1b763feaf484523fa8c207ce4d1ae74e4023e725c8c74227f79d9b58667e758ec6392d288a1f986baeaf87fc97648592a634a0fa8a3b50bfc242fc07076b2295a17446a4a01ca3f489474e39c667e52d2971a512102121051173e8944fc39de037dd0f03f84d90ee4d01237751ee66a4ffd3703ffc6314b2e272f9b17e0e871e83d75e8f6e0ccbf5be51efbd87eae053d3fdd9415e7bdfbce6e437eafb21d3f777d7686994b57d4cea6ab5c24cfdc18ddcdb6bba1d6cca4b664718723fb44118387840ec19b91f92913b8ddc65e4863cc80dc7c80d9d5028140af5d539d4a3fed9bba136b8b461159d6eb5e41b5989e2f0f5557a2495e9d7bfe873e2ca7f353f5a245a209527de891f2d90ca3b1086ebd1c49853979c00fb755e844abd82f7bc6d17f38517459533be787a010a500e33408164fa418a5c7297b0c850830d6080860d32188109821081114eb8e082d1941b7220930e6d034a3f11c3fc805ff53e7cc1cb7ad57b8f475666c8286594d4c8b9478b9c7bf18bebd174d0c9aa5ab2dfc8eefdfc9f3f8fd9628cd542e8fe1a00d961d5b1ab782df83f9af77a2eb8c1a625dfdd01a026775755c8042184b58ae9b6d7e3c125e7de772a8af8bec84114688c91e5033ae0e18beb47861ebc3e9211415cecc88e44aa4695273b98c11843463f740cae262dc821678f564cf9c905c80f698a508e3cd06f214a3f9535b8f0e9cb4dc4277ec94dc4bf9b0647d089c9921388053ac1a72021283dc02c3e4d454b4c622c59120b7482598e94886ebdcc5575d0c9ba2eebe39012bfa901713c4a89468ef374b01499045d95f5e4375d4ccafed08bde21fb2f91255f6f3dc5a8d591af6a29e77ec7f2bf34f9fe32951539990a0ff11ca2dba8f4ad7565450a15d108000001008314000030100a07c5a2d16038ccc25cdb0714800c889a42765c1b88a32488419442c618430c2084003000046084a6a601010dd3415c0b5293676f7ac941718748bd22c768ee00b3c4158cce923d47dd6b34aff8887c1063ad253eac56a3b960549646f1e2575a67ca80c0b0fbdb8617fc271f3874f54cbc606f256f13a8ec6c7c7ed651f3662468f3187d435f68673ff60845244ada426dc97f0d661afead828aaeedb3f0b8ed731a00e0e82463eab209dbfb8a4b99f1a0123b7283d1a65baa73f4aeebebe73551acb411532fa1bb4ef26a9492c737a0e6d38f78ef0370ec4f0430388897ca83514e54c5dd1b396cdc17cb899eb706ae5c9707b1b5eda39a03e56c4e2e27dd4146602a1c27b766ed7e5e8d6c832cf2766e6d42e61c088309a28eb88e67d6c7bedebd40d23d07e8f2dcb3d587e59d78c05cad1e3772dbea2ee48f316342e503d6d607fcc64cb766282d97a31f7ac1fa79e0cfa30200a02d4fb535ea3aefaab01bc375ecb2e7ca0e31867197b53604227cd826f6752ce709a615b7e163da74c81abe01c0e4e1c72aedcfa8777e6c61fbb65e10a4e64d132f103f35f6f88b1376254ea551f64d8c6808d84c9eb6d10b1780d19073348d9218ba26cce286582655439512292f18c167ebf327202d334afd14c124b3277b13f85f929601b81dcd5aa226e259b8594498397275f534fc4ae0011e85df3d9a60db0d2f8987c4efa3324e8f56ef7508ad7276d9d7dfbbe6178ba1ccf76613d38e2dd06de8bcc1eb383dc7b33b09c8d8e15f5b6cbc42efdea3730b820f07ce32703bb6e6ac9b1627147e41d5687e0b0bc29a231fb0e184e635c9f7745ab78141c4e5a1e1f6351dafb94dbb5be798b111ef13a8564b43e93060c8cf94b5863b6612cb56c2b12dba668e4ae17246df270e509df238f96b35a2186e0079ffd07c6da6b563b1ee7b64401b2601f80c07d863dcc3eee8e399c1e5ef93890ad7101adae81f452ac53f2eef8443c22b7bcb83a69931db558fd490862b69b2d3908cdeb61918282cf57d1ab4848d5c2cc224d866d7da7e374bad69499707442528f177509741bdba06789b6860a6ee4a78e9d56c8032b3e7d6be802096b78c1c227b3383956b0b9b2aa778b6b25c5d1b947e2717427dabc2d972b06a133d78fa9f4ab0c489a85fdfb3b2c11653205a297428176fc6e30c19d264f232803b731458a878d876333938b39b569c190644d83696439620bd20d70494342099122b2dffda303b46b1b0122a0a50531b96648ddd03778e841b413df2d88af0ee6f7f02a2c168cb1fe7e6f278ca91a8f6fa504cbba34cb6184ca02d1aafeb91e252db48df02ed90ccff0ac9c0bba78c07ef1b633ea338c880386a02642722190adebc174aae46c45810cc313ce791b24e0411988eaaa5283b0bf2db295746b13964c1f1a496764cd517032cb85ecf4a178f384b2580e77981993903d1688e69dd880518ee416479600b1f432512187b0fb087dc1d79e80f4518918d4f1be051388be59ef2857bcf57f01318524961a75bd53711bbc8d4483a00a9759a0cefd012a3bf9d4f6154daa4c176f4326d8b01634099a0807aaec35fa0bf5e2412bf39956384c74b4025091c11147ad48f7af17bda74d326f6eb30a4356ee9333c20580c701c9e870bd44e18887722562714e8129bf32674ca16c5468daafc7a94fece5a5631bee05161e1e1431545f683fa2d83001f87a1b2a6363676ad5f5ef0f44a506d514f81a554193f83521c2d5bfd99afd7c21091589a25b3fc0b76ddc6a72a905533dff76622a54bf63bae7bd8d13645fe1da4fc5f73e5d9535fb8a2f229692eadc38fe512705636b6569ea51a917589b37261ea32336cbcf2f0480d7a184221a8761d19921f7083f952c7919cb7253387a613f2d579c2a93f69a716bd6e9c9e8a4ca68f81539e93a9a6ee4376695945fc210560f86e0def140e47c4be675c862a92e77896f5688ffc08f301fda784925e4649665f691f164ed2a42aa1d65868cf88aeecc7faad30a978a844ec0fd1ff59900eeb385d6b122153bd7e942a6efa7347b73e601af592e80e190b2188656e88e933ea6338a565e20d285c11bde8ba837e153abb20ea492c955dcdf685ba354001d37c1102ea9092ada047a3e4e709ea5689a8b167850ce48542dd935362e6a58669bb19f8218238f712d2d21ef4c183966e6414fdcb36929a5d86b70f71a32afb04e126a7c546825fda78f348d13104996d00a7ca9c01e00062e0e461d5eae6dd5099d65ab0dcdc04f767656c33a20a1be5b64b76cd48a9f13e24e84344a068e6baa67374bdc830370091eb319013c5e04a48621046d039914e354c009e69b1e285a19e86e654279c591d488a08543189f1f1995a914440632835ce4b63cebbf157bff8ee456ff4765b872ee0674b2fcad9c3f1d3e684c8bb45f8135708e64f4332cbe08c4073804128c14e6b5e5e46849534aa4570ca6451e5c2dae0805a9338ca70c0f9e3dcae700b8bc05ef29d963a946b83382725d2ee61944bb44d7ff832049bc8a4266ceef082f783b904bcecd68b5e14ca44dbed1e8cbad909c2dcbc0a00217d0220712f020eaa228033de631d9a0f9f4fdfbe7fdfca560908da23e35dec6f44136ebae9e332ced81fd4968b55f0a93f4db723c697557a1aa3c978fdc889ebc9e26260048d0f62c7e0678451157ce4d7febdadc7b3b6f67c2f5e02c70bc9c432021bbb003736c4059b77215d80b7a86e075de85ebf211fe27eb3690ea2b27347612b6de56ba3e36963c087aead1cb6c91fed3ec0bfe40b2aca2b61f6aa46d4bbe1319016a320a7dc9590f0d848532f157d1175d3feee5ebca3af7bd30fc388f4c323a200e95c6425e9ca5e77f94a08a2751bdf2020a55bed19c8df18df9ae8f424d081713f4152b1d1b3ca029e18f84556dda74e0db14cef2db5ced1886e5d3d02de0174acbb5de1c3c3e02f5244a0ff0a6eaf25a08e1b0f2560d0937182d64e4a1035c8030b9918a12b56c247ca74057f15fc769683d002c64aa3f2ad47bfa8e06763fac768d335b771bbfb66386286b7ea25b2f772621a8278e54f8c184eff77d8dffed80c00c647c99e62580ebe53c5567077e27bbe74ca53165281f04b410d0b029b270d35b2c2ad776d78fa322d5292b14be9a05e0abb9414d22d29f87ab9628509cad4655bb07c600baa1b27d1bae6699774215d7c9281a3f9d1c9608cec3a92c355785e17a78cca377e583381de193eb5345330824a0594f6ab97cfe23dcbfc3ed068603e4f5502bb3b2371a90e436d0b69578be65ad3401b17534fd0013f8c12b76ca771df91948b3076bb13a189d04fbd1033340f9e52cfc81b07a6c46c0a2c2a23f27a3ab87395a359e777794a34e15790779c4a533915e5463570428a41a04d61ded88117707515af546d648508cfa9c0a76a3ae7e90812bc6b1286d6ff4e6a2fed613cbbf8e99d07a4b2c0ae056ee8eb7e4674722a58f6abc2e3d6300ffbaa503892f613cefd8f9ee3806e57c5e7800b5ef1dc0f02f1939879cf7362597edff00de7789fb3100861bc663516ac8b5607cb3eb09bbc232d0499f16acc919a21ada634687cec0c85dacacac00f520c8ce466636261d3014a426fe6e7eca78fe6a6553f9d29883565d4a3e286a6625e7a9ef4b27686b4cc453a27be778ac34d6f4fa5453899c8132beb3dab0c22f7d0e6f12ff85ddffc701c6e6839cf48317a33dc7967931f1838487a243c3ae2e1868d2bd8c1507a0326e3aa96563fb100544b513d6afd4087a3de755c480a0771afdf98aa5ff637596427a0545644f791f9e948ff15e936de996cc657fe250938ddb9365374f6bb945cd49799aa85fd8256a2b483fccfe44e164d2c569e0692a13b46dd43a9be5b97f266ac59305725a9e225bbb92f1cef16279b8b97c88afe875bdaab5618e1f9cd2a42b0435b790ad87a031112fed92373fe377b1dd1a8e37a2444e52c3c3e5ae3c0055b855ba728743f7356f984c89474da4fba746a21a4f9f509bccb18858da72735d1ba3d99b8078e3998424841d3622b5c33f52fb26773a7bbefc7f42976ef5c0e09d90a5c96f599076ecd0f3bdca3b1d20b27f0cfebdb7b062582fd18756864585084f3478593cb765ac3fe5d35192b49a8ae734a56e5f3733c8c079038a4f8a0d85a6f2c090024b4feaa52758cd6a140c00430c882349c6c10201e0a05b72cf1e31b5240de3b296aa3d08db336eaadd820d8eb95d814b48b10d900b57174a144b49498ab100f3363a679a6dbdac7fe2e99254afaecdc0d12976ead1dfe60cd58fc06286e19b7502a38ac7a2e2652e753f62481caa0628b1b880a3e2b9bb6599a76358c52081e8a7ef31652bb2019c8eb0e31d452f46aa66cf44b287c9f1652c64a8afd4ec32fa2c6ca0a883ca2a28b97604b06245e051b69a5a093a4cfe5cf2ae4ab92a008e6944d30ba16a7ebb396f5bed3d0f82334705e09d7d40c853bc787ecfca89c85764c878386f38bc37d1e5a350d95b6b88f7137f230bcbe3b45472e398d0ca4f18b0bf851331f7741c2c66e8aaf342cc1d93134c23d84e3d04f62e9adecdcfd2466ebefbf3f5c45e4947bc0904875f0860bc26130238d6ac1a9811bc323ae60fd3b89dbfc27b20a2e1bc1a353cdac535d356f4c35fafc5b9c6d7eb09d143db6b8c77322e42f8d8adf20695a92640f1a2ff3c6e2efccafa55d26cd413bf2f8373aaa071570be8a35fbc94de396f7eca746b714e7ebc2df5881207dda3b5fe63a66ff6668b148a5fda0d04e7b75e1de48713f872e07084ebe81e8d98a77d06dba76142a65ede7ac07bd264c67654fd100133a36882c8c803972632b761842b7add9369e50166969cd058bab58f075cc96fcb255330bd57c0e52f418757505b97965a4684a10c400cf9319aa9f7248b8f584d22c7c443708f1925ee01b244a283d78f78a530a4ae099c48fae7061bde12ee9d12a485d84e5dc73c956c9ccfa9411aaacc09ecfa4d8bf121b8eebcc31686955e50bf0b8b77e0178cf922bc16cb4a0730ee9533e89d6c61ccd9f6212225f65ddee8a2447a18b25f5be1729012719109391ede0583e4f957b70b108f2bb36342a81868db27091726bc959896e10515788809ce7905cccad17d310702912f429033ff0bd22b4257d02cc67df8343743244f58473542126a3645b4651cb6454df0076b9730d82279cac18cec35c5f06b25e3e189f68b85eafa74594937a4ed5955e1ad5e8649f7084e27fddb692a6518c9862264c6ed770a9e9883d328f8de4d7e497302ae08dd2e6b80f2a8ac7f6c42cf689a2ff8c4c072b1828357d6787923d754be43ea70d0f89473c13945a9d6b873b99612807e42278901182a4c35cbb584ec388537e81cb4f0b27178e1cf338cdc79ec966042362a64aa241bb6811b483777280e8f892bcc7b3fee53116bf0cb1cb595e1f43c08c8fb9ac1b6c2b98de6cce02a539184c3c08f20a4791024153783735350b2fe988179dc32ea819f33c60b380c4481a165d5c99adfe800b5bc58bfae9a877de25637ab618928a84a2bd726896b3b819b8c9bf6330ba47cba6ba7357511580db802862b758a281a0f09edd432af63e7a4e7c140db957bf870e265b45ce6305ccba873d9d01759082bc69ed2b50ef2eb6ecc743b8d1eb98d46a9f39ecfc053ffe234606814aaa49f01f372c04242894e0045a027ce99e280a22704035cef42373050d6bf8072cb36b50be1e3d7293a2193f8837f35612e81cff570ca730086c95fce571e24d4d2b45d96acf6dd503b05fc6892256ce1cd9bfad4e55929e0cc7859ef0c3186336998011151724d58b876c70234e0564f591d9caef1aa9abd74c36a27a15bd5e43138047c74712735f521b05ec8d5cd97cd3785099b0ab939c3c9dbafb5977eff0f2f32e21c80589e4d96424532546c90f7b682c9aa8abd8a441ceb1668655caaf90e3f642482d1cefa029b5846e31b650121a171b0fa406e9d5f314e8019cda428809342fbea647e870df80c74cb249a3b12ba1819093a9b6bbb1f9402eb9afbf958d5c269d241b717027a1cdfdd6f5c6b82e487a7a3a362de290339a4b97a4eaecf74e74687aea51e0431fc179bc9b2d26877c2050a554555f067e653a958e90a5b709627c04938a14f3f11f581cb134e31febd0bac99f2bdf9e8694e59c8ec0a76ede05c8a1ec446fe0d56ae103689b5b39ecf06859fd7d198e1e43de68f60111bb905943c874722927244b97782df9d374f012b684287ca3c664cf212328a252ad94713203498a37f7238f01c114322f2cc0194f18b43ef6c7aa82bd7c16e21fdc6807c76804d8e4867f608d3ce4a50a93864e9ae2f9d11c20d3f5b69f27b253e027439fe0d0bbd98abfb6bf443a3fa13c5e5ab12137f521c94e11790fd850a220a5c5cd52f2e2ee011fc21203925c8706e0af65e8080d72c4729746b29abb989ce6864efbe1734498a29a53c4a558794a52ae25f0aacc24f6ebf27b5382200874b5f7af48112d748d007f8e2d30512edd5718b21ec281cd177ecc34fe808b6912dd83d83751fb254e995519b2b6fbe912451ac523d5c188b73214d4071bb0c1a8c4b5e29e10323ef8331c42ffd888689cee7346364892737572f8a1d246434fb51f376341885731def3137087c186ecc166084b078faf593772b34cf76c8e33b5eec937e9b102739f9ce27f1f743a93a6544230484a45bab7a8309aa81b5a150f3d12adc2cdd38ae0e74460e37e9bcced30ee877a6454e7fa4ee23d5e269ef57bd315b4f56751f10f921fb734a148a7cf00aea7bf0e3d2268a8431c138e8c799c0a10e2b89b655ba8950bdf46e8697aab15c56437da4f132e06d8fea136c707ab29b20b2050b1a4c2b64b95f7c63d7210d0c527912494cde1fa81e3dbab98418b9c2e14d363e0b36e98a98a55ab2c2a70340287f0bb74bb6d4d3f4fb31f997fb3e40e3c7aa676ace01125486e59698dbed2c86c674e5725f8e60cfaa14225cd5ccca44770c11540febab173e1c915aafe6ea479388590f3b9076a4d31b4770fa56c48c17753315c3f8d2de811125e59fd065683153cdbb33a6f55c75cf827266b4bfbd0bfc33f41892a1a4e38a9d16de22c5502382718d98fecbc05e432967e79b700d56a050b302de40c377e3bd3683b9c8fc69d750b2b8dfd34f4aacf0c3d4803800b2d02dc8228141b20198b8c009c4c18cbb3ff1d89747796a96ee6b40a5e0963dea017f9c55b1c9f868499466f305e8228592519bd83d77ba32601bf09f4e8fae2a1162a86388b6bfd3ad3a963bfc162082bfb2ebac3bf955b370462436a69ec6e69b8e1c016e33c52cd3c92fa86e9bc6dedbc9b206d8bdca08d88037b07f095a4d1d732540cf278347124a230ab4a50051fe93f14e87fcf1c8058c9d7003431838696628488079406a06510856c69600516428f8fb44b8a80d8b0e86acfdc10af303bcd91ac73b9c07faf3097916224e37ca64962d9c0c08da655b447743a15ed90fbda8296baea7f5ffadbf270c9b1e32276776a1da318c143cb606244b4dca190a6f2f014231c2295b67ddbc92f6057de520be0749f9b4f901070d0ed51bdca799beb0e9555e86bcd7b43ad8c154a486d5249ce7f8480ca695c16f5c0a026d8ebd5388d78b4be6fa4057a0f7abadf3806b8cdc12c549fd436d56da488614460a889cefb0d92761a72ac9d0b166312a8b0768d3cae1de68e4559bf2d03575346d9458f026ccec97a31187cbdf7cca852f9b9141327199559ff5dff1ceea43b027b85c8de3b9baf062bdd7cb9484e5399187acd4f80a7fe32ab622c2424969bf34b3318940084b0abe051f630e7e522dcd41181c07dd71d1d232ce41c69a65544471168e46e7478f95e1b5234f2d1f9411eabe3808baa065a8a978b78cdb96ae6437d1a49499ca7c97d1d7277d434b786dde88dae74d7b6856c4bd121200f584394c2ae3429781062a8d2bc61fc47699d7dbb34212a1d30b8237fb2f6df357c8435f463d254e287cc98245793f15c36f780093dab4b97cae0c48fbc3a434f007d5f15310518aeb1a40d3a65335c0019be608fd3543174d3a34323c8195040b9f38bb44e2ffd9a5a27cf0e471d5fa69d80475f60fab6b88d8434086aa545ba66fb27d7aa97f2d7ccb5400d368d5563b47e44b917bb147d15152304b5d246f5a7d241628816c84be13b695b0f833cec82c2b067edca672129b8422ab4ac6484f072bd183ea5747492ca13128c979fce6335239de87eb2617514a0ece298aed94562dcf682a2b82762a17581e0a6890ec28e128de89882df2aa4d256fbbe5086286d33726f5f2ef5ad4b4c2e612fdcbdc94bfd6044fcb51f01647ef3da9554d1c01d4acca3345fb8a5c86c4606411c0c5a98f90e53fc653f404a3daab7629108bdff06aa3d4b88514207c2c23d02e390d0d7ec3d28c18583054f1c3445c7d37924de5b306048bbc348fbf232229ef31cfe824c38812a6295dc758b7eaf446c3022b40359d5254ed180b634a7369cfcd11477547694be4a7e080f94bfb6beabe85686ba877fa75ae048d38fcebbece1a80cce0d0a4b0c3215c8915e3496b3a24949abbda3bdde5ddb6d7848dd65a756deed9d60f106dfe545bf381d325676ffc2480cd2db373871d549d8fe51edc743e0750c1a95db605939657fb1ce69d04c7d91bb1db12ff804b07f4cae4669cad22c14acbfbaef921b9769534422e354eb471cd74f113e20a2848b10eb0db50855cd10d2c8a6d555ee3ab0b8ba7cfe5d17a1ca505094eed3d56d6876d5f108b45a36f57e7414b548b3345ad9d0c7c1c97a2a9f81e0982266b7e79ce3d33bbf274962d08181b0edba796a3fce3b14013b296ab1677c61775d48f8292180f431653b62790bffcdc0977fd54056122b2d10733856eec127100c3b2cfaf5e06f37330720e1b234b43c84f920c3fcdd38431853316ec0041d043790846381531cfd06b2cc01bafbf2764ce4a5d2970f1bcc0eeb91a4217735ad922035c63917066e74cd2299fbebead360893732a1a2e203901f17a29addfb63294dd67d885ba3e8d7d547c45ba4ac42c89ad19e6a88be90361d97a98e797ff44a2c43625c5a7aa1fa08a272c784689d29b9dfcd5e63bee78e0f693d96d142d386b8d5173d76402864833a65a0019e327b5ff98787e0bbde638add3277c38a4517d790c95cc61ff8a573ec6705b93d2bef4c32d404c983a515bd1531e3ca0f52793884dd265896e36e57741f6e231099b7e543c5777df1260be15f0c009ae80aeb120ab0ce1f8404e0b372d3a05b255e9c9231b21ef40a133ac9e53cefe5a035f6f8d942b91cc31b1397af7fb16abd45ad36391b568c39c593f0ee74ae049d4ba685cc604aea9033b1282684ff0fd436024238264898221348a114e465fa2c82c579bc0a191ffd8011ddd3ea07e2fca18349d3cd1ec9584afe54617c1cdc8fdd367cab64a382e61c0c89296cb4015e6f62021bde83487f94a1ffd9e2eec4f1893020ee0db46da1e6600d75407ba51a417a01eab11b465ba94e702b039a4c3e7289f52631f86da84f752600469b257ee2b168b65b5c4c998f2898ec873a6d5d155bce613b8bbc12bc29cced3946ad2f2801167de9c92720ea75cd43fd454059ef7259bda4e3e65b0f920532695cd67a647e6788e275dcb26040ed420018da7083d2e0f5285ad4c421977978bf94b550fae2dbb65a605ea567c9cd5a267e8726010520b9e9e167a0f564b71a01647b99a3698df40886a278dd7f2513aa65b912968ec7f8202d04fbce3e050ec40ca55738128717ee76ca0a1dbef8b9374ab3cc526f4226e2cb92a22cba85692e48e5ae96c060529dea21682458a0aaa9006e3d60b5c85915192dedae85c141e54c11c35f493a3fdeb1806ad93b3523f5548bfb590553737b851bfa6511fd774ed2ab03814db00abb952002d04c120e5b3e289c2cd61fb0369e828479c5077d8ef65d663976cbc0e1cba926da2d68af26990516a62e512ac601af72eb24d69bdc05edba3d1b3222d44f5a1184155592c5798c6437e047fe08a6b5d307d78e40877d2d48ea47e93002cd04b4d380293e0cefecc809820f9308dcd65e297a51cd00c1548d64af010ba445fd4667b4367b1d1d6e646824491aa6411ea8835592787a079da042fdcf4e24ca06e00fa38f65ac4c9cc62209b4c88d21dc719542ac07b9adb7e85c0e21da80b271bb9c1d73484cc8e2c88025cf90d51ecfb7caaf5a082b417aea41d090859eeea01198364046fda4a069af143ae7ea4851ba702ea3729d3e64c009007e33261640270b41ddda3101908442049e1e8f1d1122980e6bfa641d804d858d87ff65bb43211206768e0d8b2afbd3ba0d066825954bbf2e1e3ab43743c28349f13dc38f59cc13f947fdaa57a3a48320d647f42c40b41a0a05b5dcd8ca5a9f6a2857864f81f78a174d5e08622de9c5c07c6712ad9b9fc1d4e1428e515f653a3c1abac9622992fdb72fed9e5a9aee17be401e8aa8f1a5405fedf9e2cd5f15f733d159395ce413f9f515ebc91e702f1120c16fc4d96926809246a5266002e34db38a14e3b50dc4ce527a049382f2a506441daf01f3acb60727d7b95b7ec8feed460de240d1a0dab2167622297275264ec911dddd01d22ae985c88501ceb2b5725056c4339084fd8a501666e478537a6fbc5e1e94461292e40a569b306e8d8b3635b54aeac73ad7451100cabc3cfee34452728545403cc86184ec5d1ed03a7bb1c0124c569dd87261f0a1db4e577ba0c5c9fe8cb50c1660c24ed5dbd8ba36be026be0bf2bc7138558afc052421a6a860ef5eec773617490e089fecd207b0e59eacefa1a1579b1c3fe0e5bfc7a321d2931c892d2b07ccc79e43c2c2d77139793237b2d51f19407c144dffef0702067e09f4a3a7283a63569e9b6a2a973885e11f7fa39dc58eb3ab0b9071395a4a280bc9b752811328590c948964874f8aead89ef2da4a60e71d4479a5c711e3b00dcc8239f02a7ae262be94e614470f40469585ac569e867cbc0c7290a6135430689e882d445b81bc892feb80196321caead90842753fb834c3718f43d0a1e7f9f4f67778ca607f47cc9e17875ceb07f9b60f0c6ec1e314e2d5a5059ab6d769c37beafa535dc1c84e077482b946ca94486987e4bd725cbfb6e000c22dcf083a5d5bc296e18d387236faba53c5245c2855b4a8f085623de10e84f2c0044b68ca5e0394b901c1b76802d8b53fc45439f3c4c98cde641c3146f09bc72792ae287053d43b14991a053f077d83c66554fce25decd0ad89222366dda253ead9e43d7948120a520cbfc474df043a8b9a0aeb5b30826c5d738338bff2d260110542010928c4dd452cc8cdcf38a4f056608d5c39e5fb3aa951168e51493702a61b5684d910189fd8be87a80ac199a431c090f09da2ada075c2300afe16c2329b3899b6800087b8a6081bc56f7a05c2be04e10dcbd54aaae71393bcb99003e5f269c141a379d24a97e7b114041270d836d7002525b3809eb3cc758f901e6a2773ca9e33f057c9ea825dd5cfa0245a0a904026e255965bde4679f8a143e1a9c90055b2ccc3e645d572bd0ba175694bbe1ebdc002cc6b1caededa69b23d7bf7243e66112bc34437cfd26f4f141137997e818514d353da6a1cb254144b686d76de9bcb8c3d55262ec2b840d5090ae5e87a79b37a1f343db772420bf7a0466f51381239a8773cae2bb82ad5825776c6a2d31845cf1c56b2236011b5b9aa3043c3b697c935df495792c9136d44e1a9b1167bbe806cbb194f25cac24a7883b1a5994126e87f39b78d07324b85ea512e01c41d2b728124d63a4a23e5548f4ad33b27fe6d8345df10caeffcc27964a004da02d57579acf80937bcfc92badbcccc1fedf3e28286783c0d803fc005806ba0c80fe704a0d00112558a8ba0ff6e04a54b9d9ffd9866ff6c14df6bbd5b1de079acaaae15b40fcfd127fc39406b4d6e5af1c80f48bbe2275ff7a197788847581638b300ce796157803235c6efe521e5d2e17cab15f3eaf2d7b7c7ee4e55e3e6e1be67fd098d3fb5cd198f8a1b8a358155644cdf48fd70aa8f7d0a68513465c74bf3ac0b1ceb623a7f5aedc4c825b9f2b4da3dd2a8a65b201e27d2f21164f8b602eaac537ed3c509c9c12726f751817c5e0a9ac43e28380a746222087d6b0b320af83939b738dba0838cd08843ca7a0074f990714eae4b789fa14191c80950c1124453655be8edd201266ac02005f831bcb0f3d9e46fc531a5a519a56ac3933080ff3876aedec5f2d3069dd15f10f45ff74aa09c1d5428b659b332240070ede5b3a4788200f580c5c2d1cfa9b65e3891743b1f0edba9efb95462803c3be406d13a2bf615981c1c702811e806bdbb13f657c94ef7d2fc28fd6d3fa8034a7b24aea0d470a94dfae1d29a8c7b89493360fff4cba488699e8cccbfce433845657860ea8670c18591eb8aec78c07f1ffda5b99d7818197391aec1366f16598a752cc88ef7f3442de500c78a7c00d30ef813cde01be150dd45373205cc99d50157e152038847e1b09ecb59a08506a44a072d504e194e6c491a6e426f070bca06a3656474da08cff77ebd33e661f835734fee60d4316cd21be8cf8d255e0ec52927ad602cea306ba93d548921138fda3e4f0112832066539ba22a848523f82562ba6ed1e4463a9b3399864b3cfe7ada753f2b928b305a791f1c0d5ec233168dabd0f08ec9652e4d3682beb2748d09f67fd0397228dece2be766600b894cb90e642097a15b1952d70db5d89823c91a0ed70bfbe0a0baabe8613a51e901ca00dcf50804b41bbe8b9a8c2bbdbff60514e0292acce04e8b981f801f0b28ac5d69f9f2d017614138ef6bddcaf4760bcaa8c6860dba60af6487b76e0fef5fa47d6e641250a7a3261792b93105c5e269c75d6c00dc26cc1bf01af84ee481e379128815e25e8604575008ee52330fdd0e5039f47a6021ff7de63be6bbf72919c08a59bc627d15ac20737d284d0d9bba8a2272584e41ee799f7b1712faf9c7565aaee667a71f69c35202768eb9048e6b8b60fcb7239185b106f2272b65190578c9b3d70b0eb63aaaf2e70aa074738e86aac3ff23ef0a61f59b122fb9077b1c3336f863fd6882419107628b19794298fc4395dd276d0f9eb868086f37fe7e2b1530a63b9362166fb0f869302722056d0e279fb23f520ce74bef39751317ce04a2faf44f20f0281d3fb0c69b18151da6d611c4107deb97d16c6bd9e09883e144d896157bb93d26455683513324c481f02614782cba76462120a9846f1a712477d68e423a897f4df2b8845e7ac1a49d3fb7d2862fc5fadb4f2ce8251100720a835c489278ded60e5fe89b515305a2a9d3a28f392257505a6a84447f8c320208c294d8707e1dd68ddd2543df9e99526be57406b23752a6bf5a736ac0a86b7cc2764473b0ef0d1225af15b0b61244a13df2bc0368440eaebf4a3020405fb4aff9e88f556211b9283601ca520a65100b4ff9f0a3de5917bb060a947e87b829686e5405308a0f00b158b4e528d77a43ec584814b95ada38b078f14b41ec418bd2abc171ec948e9f27d879cf9c33e8a3d2b052f05215b960b24cf2773c8e6f369cdd0586877f71d1b3f99c3393f4b10f7fed1ef0a02ec1191727c24b15dec20fffd4f5befba19e48362b55a99df1f6925c9c2fbb7ff6aa5739f4345610a962a8469b45ee8e5f7edba22b748a761dfbf07af95f3bc3c8fde0c6e5aec6cfef05f712f767066599a591ae3f9e5ad798e0ffcb13b616c3203f327b895adc9b8e3c011780d3c065038f4786b1ee84f5cf3d658b092706bb4b70f6e3e8797d0b34f076ef527ac7e50af906967d0404a58266a485903cfca1334449532775ef2f77f6555b8c3f85f79310ad50db9a5d88077e3538f6c2ea946e6449bf3a0cca75d09040d34da196828e6f7f16b4073933094a1f812d641802c6abdccc83bf1851160cfaf3a3aa2f0ecd2cbc83b10b699d65b33c7c3560ca59c5a2b624f058be4429ff9f003cb7c0d43c1ec4afbb0bf5256b868ceed14b5e1469c147fccc52ef059826cdb227e75022164dcbd25980e00e7abc02d679b82d9316f3bd1eb6300d5e7a83f0bea3f7594ca7d31cd98cf8f9640a74ab249a1a099e0cebf0b3f123ed3344c4437ef2ed9c5e8e3ddd1a15a5e5d2d3b595763d14400b7bfa72dc7598ecbbeb6fe178b8fc7d6521fad79aebd379bd7f5c81e94378b6c70111720b5ba4ef18274302ea3467f3a121e2fb8e2687e7abd45593dac27962203c990fff626ea3fc80f4b538a1f8b0224145b68d9f3ceb8f07674b0cd23840bdcdeb1e29b65dc9d159ec740c60a1496acf8db0e0bf3440d77ae086cb3ebabba6d3b7f69e81d9f1858a01311d4567e2c8ded2b951e530fd435675e90d4186337d6a9e2fb9638c5ff277e9a8b1d2f13dbfd0af6ea5ffaf351495019e37e0f9b88a3fb5ed5dc9df39e64b14e807d3fcb80b3a9fab96ad71d232f1e2d5719694eef7a385b700ce68b626fb0c43a6f7fc4d790dfc7cf71c9da61e746d0fb802a2a667485659dfe0af4b37a8a5c2491d68f2bc4aad7724cd74da37535cecf51972f9e133b71325a776c611a5aa794edab8c0c654a6ac76c41093d966fed9ed68b041dd2145808e71a04f7d4ce981cee7ab9bd0899d0f4b6d799d711d9cce8df623956337489f65463a5e11615253c58d2fab929580f8ca5fa332326ed8f8a2ed5335f42055c0bbc4e045d8d928e9dee57e064fc66c439dcf4bb619e2999fa3030786b6bdb3b4f81e7815e9a464a31b0245b251b15ae7c7f885f738fad1721cb7677f5e5501679b2d585cd645e3895a26426d78e70d233b63bd8991bb0cc41dfc243ce7f831fa902fd26c302752ebeb01555489ceb1618ce155e925be6350ee6da2173e1653370d07876c748f0721b16bb7534b875fc507631007cdd893f425413641c557dd909aa3d2aa75c134959f38911c201b8b5cd82ace6c9b0dbbdab82689bf4a3fc11442ef23f6cdafef8bb2d7268acae164d66aa83be1e6bd7bdd03428342e6556492980112d5925cad1c0f44b90cbcf8385f52a6c20b9b5c84bdec8bbb7cafff48de7bdc6369f024ce3a0f9de7dd08af119ec953f14611010aa1c1d228b0584d09b1ac6d8fce37f0e82d6b714cf5840130490ad516a903793629bf743daf967bcbe34440e2a3d1b309e1bdf09b90259f7aac374980af6e9d6fd2994897018c3424be505d62006f1934354d4ead4070300f2d5a4a2a4bb7ca69be17168152e1ecf54ad8a2a1f40e9418180817faf9e43aa71fd39156169f5892fb8fef8c3333d26f9c73d1ea6b55f7a7c03490a83fc0a904039879f1ee117904fa23091c4ffa7f703a4836f47123f2c6ed4a59fd495d785f124d3ec6895118b2f62696daeb58519dad1f3079d47ced2fc9d1f4d2382b1f5fb4a2cb80009eccebfa28d1647b72a462c77f8092643ce1f02af73964a2fea17003d31fdc5a2a88b4f539621d1e827341256adf9aea42501d0b230a0c680fe33facd77aba90076e3c4f80e8b63015cf02191877c267f0309769205a03f1a5bdafcd1f0a817119ba3773fa061ca898f80f97df1d11d607fd2203a4968ba8f5d8ed41a9b16973a3af7fcddce59d7b24f8d33347561cb2e12c7ee0e7961455ec3eb9fcf8ee4aac509b0c0e680ccb687fb4dae03318ca77f154e728fcfa82fb995c0ad1f0a5bbe03ab22554fc0bab00d05f1e386080e0c0f8c20eb4b16c828148291b5bed33a36e4333229d2769e596353ae4ec917d08d41c8daef18f71aae2d2da608b3ea469df56c9a5a3d6f35b17ae856e294a754b13db79c66756145dda1506cbcbbb6c30f953df1af1fbd9d5085f7e0db94671e3847c10552f3d0f00dd682517d40cd6fc2edb02e85403ef346d09aa7eb207d6690eb490938f8adcb9f753e7a05e0ec812bdb8ec2b6da37f324e463ff475ea4d246691b4edacc6b21d8613e3e01b3d984dc64d0eb31a6dab50a1ef6be5cb2e0fad64bb4ff7f0eede313b63a8dadbca35619b41c926ee29a3035a1fbce89679d94ed1c764a11f033fe308b31732d959405a0ef3362c6b3de3ce9ecfdea7f418d172c04b4f4b7fae75c153268a0bd646355292db2098390bd4fe0b51c2ecbd5c678a02185d6135153653d0a32d09418acbb08a2dfcdfbf50e72856cc78dc0d4489aa563e2306c38a97e42fc46b50d824701d01455d6e461c066419509cdb4d89842b4cb3e8283c31392132403051747517a7bacb83c7a27a67b1e0778e276a5f502c6c5a6435aaf006f8e5c2c07ae0227ec79656f9f937b7233e33c3dcd82e40efde94fdf6536be40262ee01227df28ee324d0d6b1dd6a1de9bd547d58332dd1b4ae10dc6b7c502f00b4d06efdcd2e270ccf873f3f24d2333ed42a1ef45790818b64bd159b5744d5e316f658101766c0c07b856b28178a283c5b7698094ecd69f867b124fff3874a29b2d9eed2ce818135867668e9ce532b7990a2c0caf92685c6965b940abf8b278df92e65b6b4fc5080b439b8731533a99ddc1691629e5bd32c7aebad7a2a5085160f38f1e344b8808e308695f988abf1102ac45a4e35ea4e916c60d97e2a038a8a0dcd36f9aa2d49e04a48efaae09e489c3f6fbb350191a135e5933cf053943f36cb23c754e7d247da4e7c6a21202dfaf9ba6466aedd9f31cf0953e848b2dea2882588f66d0c2811dcafbec4d3ef7ea3584c428c877eeec6c6f21845183573ee749934cd124790c682cb1e343c917d2a81e1b2a07018ef9dcc5624ed8102fe13de2fdbb0a2db1e12f61a86c851e5b6421dc507c3b2033d0fa8b708f4a0e9d9896ea0f597e1224a85288e44aaa5fa74439446f6a8bc4800d52bd9a87f3a108330a0730a4686a074f0dbbd9e6175d1f6bbee0fe0a239aafc9a5b94255066f5186a251497817fe9b6490d481f33ed0765b611b7e88372665ef6243202c18100354a12a4abb8204badba8c740788c2e116e1891bc34a25e64eeedfb6cd59b123ec9fa393eaedcaab1ff7829ed8f613b85a5b3036bb540c72563d403a639c590106c07c3eea71da60d15177a8491a6e526188c9e97e5a221cc904f2ed11ed03a277af36b3442b9ed897978b9441fccafffdf9016daedf7e68d3fe2607bb9a901a78a8e2133c54b24aa0d94844d091f8cd9f03490e1fb9d6580c5bd24072f9f9de26cb16548529fb0952bbe99f882cfed152c845d7155bdfa3fe180923c27bc7db382e6e81410d988e2c53ab38e50156d54a43d243e7d0d56b73a596d614462cf4be5f5a5c80a7f60baffd520d69a6084111207a62585e2d2f69c57f6238a4233d61c1c087ceca784a8bd784883b8ae1a4ce55de34a0801997c4a9960f95c365888002ca3490b66582cb05a7448be26d72956ef72b712633c97fc6b2be06d04001fc5e5bc5b77f001e38809fc362781774b90b0971c1d69ee8e38127d489834e9259ce5d282dcb1e39e2112e49603807074cea9854ced5b88458bafc6af6dcd9d7014dc1310d4035c109d0512bb9a554dbcc647c91352a6810de4ddb07a192f1e6329ac6e74b8314cbe36e60444792fac72aada84687ace6a5830fd968eab257e46f3eac8c22863c0036b9521d542878c80084c9b888a57c12d01556117a2631b800f46241c407867fae8be31226c398d8dcc8c3c6c98ec8215803dc05b529222a155d79ef7ee51034813b82b1c492d402ae00ad09db9ac919501c84c704196bf1883560bec1c34c877c4efe2dda92d2dc915a300d98bbb02f6f24ba1649bd6ce72bbdadd4aedae82251999f883a7dcd48d31fb6ab8617e2d6d166795858e5d99d04fc4afb167654dc907cd5eebeb29808d746ce317eb9696453ea8bb922471de23d6a8fb750fac5956af3a90bbc475bd4bebb50a70d619efd0a7d7532b363365dbaa3b16ff3e3455690a0f9ad0758b1420d3bcc17a57c00fbacb3337874259e8f0aff51ce22e09161d80263b5c6d1758e84e0731a869d7da463224083bcd0592a99489cceacb8bb92168b2d2ea2399fb7498d0c9c493b778b5b58cb0de72ff06d2249ca544ed9329010333651970ff44ec5d3fb94a695417b1a76fb5139d4f0f8ff9a0ca5c6649ff188891dc13702ff501e2c1de5e7378d5a24b39b6a2cad6ea00a5f5602239e6f1942168cc2a032642ac708f2b34e4757bea425c1934bd5d1331a99a0358dde18567f15f27852e8e1568f67ae887b423544190d6244a4d3353b555d1051bb3ca946be667cc0299ee9597b72ceeb9e9b6f89651aa5e4e2ef8067b90c57ff2b3e04353dcc8492feb20b159db4a7546f26b46086c7f79449ad94af381c10d6d3368468b9f10e0eb845cea84614aa54de8cd441bd3b879a8ee0e280eaae6eaa0c0df8815537882e2256ead5235886f65e2c29a62505e6d051d42f2c63da86109f30145db15407a289f7e12e6d35e6ef921fcd3d622d37d3b2810381d1b42950e99e1051ff21b9241c19ef63c0457f3ca1c0c1d84826a0775b54ed516a8f5a6c8631248a1f61b9e3d4ac69a70a0a46db80768cfa5959a62a2331a8fc05aca8429ab8f68edab40e5fa8d58ad0bc3faf6a96e6d60d2af756ee1841e6fa6cc94722a46effbc34ec0a91d16b811fd11c2090657369a514cc15963907c8f8a0bc28063532869c41b4f12973b6596068d8bac0f0c15408b6edcdb5a067d040568cb2ce73b7af4e3d37b4d5975c89bbd01de1f25f12001a2333597853f99d675e041d0882dcec9de5330a82559749f04cf2c0344c078ddd32dfe9d73979496a63498544181c19eef93d69630a4e73d116aedd6f3c31f09657ff8198424cdfc9a89fd42ab58eb7f3d186b567b253fd518f7e5e0e06f9bb72e6de84a2143767c29396dd3c22464fd0e0dbd89bcccf8ad2658d2b02d636132525c49178b02470b8bd458b0efc381059b2dfd0522a9c9139389b0e675f08c0c279ae3e89ef1f2a569698cb10883997eaa9275175e280ac0ad1d9d639809aec82eb6fb1832ba77e54a6690395477457225e656aad5dc26dbe81ac7c898343bd8e13a5ec6d5ac8a09ffc078791b9700887f3bd5214f1c754add90c9179f2fc26c1747b86f2e4c3da20e329e7fffed15ecc16c34d6e6affac99bbbc66b4c89ecafca69fd845ba12dc0da4f643575fd566bfaa9f7d39ac583db9a59129eeaf4ed49e0e128d7ec1f1045e86355c9c7e9d31d5f567ef1387b70adc37661689aa5f1409d3f5fdf1c51d60fd31d0b7bbd8db8e20f0763e96efcd1b0ea9c46dec7118f0825504e9ff7499db774da5be735cd06efb1e2c35a25f3819cb480ef4b41eab50e5ca29ecd6f7f91d67abfa51271106d65ff1efc4f72c6277970d92e52f86d0757df335aace4330a588d457d383e0dd7823e9fcb809e3c38dc539ec369b201eb0d562a586e38c75d1ae43094087092ea1b5379c926a18a82abcaa6838b3cddf4d2c54cee8c3dccb60bca5b8f7678aa6d61c4ab27f4ac5e7659e9981cfa4560dad92852488e81c96c0a3f115fe539e6c12c4c394d51ba67191b63dd045cc3607a589070702353e14528fd1d6f76a7763160d397b7e825f7d401065ebdea33059ec8d1c002f881b0f41af7ca3b05ff9dd86211e51c95525c3916e0a32b14cdef032dc08a16f4846b49ed37572351d43e965f5c980ed4c3d5707df370f6598039675738ac7560882a8fbc73e7e7a36a61621e7816582d65bb7d0b9392337b7deb457b976eb1a778cb10ef32a059d464d215e7bfbba46b78f25dfc42c613723cad8a44aa341169a5519ae4863dce160c4453064c42db604a015459e158315f5d0df8f0200e28c5080c4d7fbeac0cefb1cb304ed424b40ce6da9950d57929d56ee9a3b34f28d95c9c2644c3cac2940ad8c0f356a4c292978aaee8f218c0f7360c63e98c76bff521732075d98b6821fa3fe9b319aab43afde27c3b666ab0d28a0d8bde98c49852bf7b0ebd2223ea5d8a4af9f6015d54b4eac9ec22c1bdd71a5ba8518d28a1276daa301afc55a1db9375b4fee88228b210ca9133aa9d013febdfc9f800f945c11e826203a167c76b0295dca61055ef24a045f548742037297962fb17c2dadc3c54ec54114de095991988b23139a349a801cf505b5880bd0ddade9a7e00a18909712af9b9c47006234026494b6362027c963bf292aa789684546eeb1855ad55d12042886d6e50be7615d3e05360ba6a9362cd423bc05680bcf7e95c3b15ef0442bb19f9a158eb744f42da7947f052d3e6a3d7ff8268b8b5dd31dd8800f7548b5a7cad94632373772a5efa52f1f51045a9ea03cb2f00306704a359bcf6b8dcb46914f6c5869653d151cdda067d5258289fcda4cdb685d16929ed6a4b11d9e6bf670b9dbcb645096be69b2832e93846637914209e5c72bd233d80dd3e1e51e116c5d5d1bf9dafe7ff564a8a4c3640afd9ea05f6c58abf5cbf75d81f9aef0a889d1609c3c3d88ff5c1b8278cc16ddfbd9abcb7eb0198a54288c6d43a3d0131debb441295ec7f55b7031d17b69e0659b15138785ef7f0ca7efb7d58fd038f80acd1d078a9453a146d80868909fd23a08f252877fed1dda86b04cffca3e2596b70e776b8ee6dcc549218e51d58b85fef9e63812d52a0c8dd7f6e24e911c59ba1274ae100f4776cc8381c6085e23be925295a076654a9892bb5e8de39db4426fe0dc4584a62ed56decaff86c6556c5dac18284e0dcef115187196d43cf560da77910f02adbf3ea21756a95a1d879008967538c4dab1bae6e21a0972c944d0072ad879466a316c1cfcb2e4b00554062b5e2eae17be8fec5eeca32a58a0497797189ad8b24b51ce4328e957c3e30f627df3e6bb0efb71cd4bd47df8de3e91f9893af5991f8437965355f99a71f7e62b80b40bf9c5994d7576fbf6b5270cbe2ac3a6246f116acbfe499a003d7f0da22c2f34c28ac7f9a96d3fc1c9760ca37dd08bcd7edae6a3229c912c5a899c8fcfddea3e08ed144c5cd3f4cf7fa92e5b2b5806870ce593fd137a64d75a41c40ad2d0705446e6a96f5239e77d4151d6dc5463328ec9e115e566e31264614bdb80fe9775341e0ab1c9aa037cd8be105736d471016f1ccbd353f043f316acc5c98119a0835b74f55882ddedaac2e53928b5fcc4d5c5b02879c245460ad2e9a74775bdd15702939a3f9417b436a4783de0bc45ea22701b832452780f4b52537b543eec4d57cdd37fea413d4f8b815df1a84746c71c1b5f57451fc560ddd61ee237b4c17148d507244dd60125ab1ea4c2042a08d45152d80cfb07b1bae13ee891c9593d2d81bce25f37afb20a4c7973fd37b746213f326e0d0e3f338d9293fa2073030653bd67a9d580ab4ed9a9f6ea2104324a612cefde7ad043a85af9fc6573a98f190eb1f7ebf081d62148a58cd2ddc11a769809704b7ec623ea6605c5ee9bb0e58f0dd5041639ef54e83bc331edc58297123d27fb2a0ff284a6c8278849a0a157305b7685160469d764072c1ba63f386e50c6789b17474f409d96356845c5aa05323c4e14f5aba6ba24b44dea3ea95ffa70e42b8c63b5024095f8cfef02be1252fc70065175a5cfc89bf3dcbf71061f9b6ca741d82c282fb0834c7b2a35fb208f99bd4566939616b21720edf5d72d7581ff194e341c424e797351b745399da47b1e7c73fbb2997b1cb2ae4ba7baf2f4026f1f932e3bfe47c13fa0fbff8fce766ed8303e21b7dc13dc98b8cf83a83b1b190c0591f0ec36d6f11179ba5f4f18a863883f89ceec1f4c2e8ba1cd5f253dc35067e36e948180e00fec9d0c00866af51567b66d54a5ddaedae87b0886965c9bb40a46191c439eba1cb2c79144124492df5b0fd99fa78fa1ab41c8b074a0907d4cb377ef4891d07509a056f7bde35d19464ff7a3092caeaf99374444bfd1284a5c5d9ee4f4ec6c3c5754ea4c4b921244599307e28a2c2ea5ce02bea799904c4fd12b75068dd10ee9324210903f2152c5ad3119a7f11a0fddc99de0d2a3568777720bf5c8db52ff113fd8b2a71db0f87dd99b4ba742a6738b759feefca62c26a5a4b7e9c7a0f37b1d6b9cb2060596c5447f60420a01572fb2f4d859382cf3e718be661164710d42bd90dcc771281baf425d64fde4406c048475abb278afb3282b8c4b28b454742ae03f38c8288dafc02d82cc0939c7ac2fa6472813b417bedd38dc421a121055cf96ec29f82501f94da51f3348ccc4450e091557b4f47b7aa58bba57ddb4a6b629410c92ba61a1e0ace90c487e7fcc228c7afdbb8a499bcd9782594dc7fe9bbdfe08d6e59eaf032111536c6543bc0766c37e42a8c98161000743709820220deab225a3bbd6f98bc8d678daf748cf7965631f6184a8a2b4a3b5e973ac6ffcf136d0205d4d9a2c61de7ff87e14ee573c5dc55f88399e789b26dd891aba57a679d5ab16a5e8075a6c28426842561b442088de5a889bf715d3a93ab95e242051f371f8921bbccbc1de637cd244948adbb931bc9959881811bb86a24e65b2855bbe99d004317f963d88d244597de72c76e95a4a29531a11c904f47b98182bf547c8583303fd7cd1d80738c3a5bfd23ed8f183440f89a68dbd19b1a471a8d25dbafbddc240a2e5e8a4493b8e5c9703e494da31ac0a355bdb480e75320258c5a5d07789d7e2307b8f0f4639336ec199fbd4e41da908d47ea32ec7223f583398530d6dc4ef73aa5840ae650c97782503de30aab5735999a108b41105d2b00d6dfdccb08dfe793b229fce4cb36853d3b6a331c98450f16a92c86510fc23d5a52fca9e4914f560194dd81127d3f7cb6bb4d2db312c48886c77f112306a53aeffe6eee9f01a6420b50cb091cb893acdbd704214b9e64cd536b905e6067dda1d4d9f7a735e1dc89a9ff1ae093ec6a73d2be80f18b577229f06fb87a81d861cb1312a8ce567c26ae02036d7d3ceb5c50b7584c5db5bee79a6ef2593c7479bc4b4c2a7cae004db6756d2310a29440c16ec7ae2a08fb53c911307fd5f13dfe290ed7a7030271d489cb981866441fba4a916a7da56ed7914b65b6d35b85ecde1cfa6d39ef3ee6d1dc5d80ae3c2075d95bdb200a7fd151c202c3c55c59f44ddf5e42c3206e5696fadfaf5f9e950b4d8a7f6812f2fd80e49e47d32530c67ff4511abd555811089c2683b5bdf5614f8143694287b2093fe6d8ee198b81776460bebaa51008bc67348148ec1fde4ad4998c8ae7ff3150b83162f6ac38db8a10bd91136dddc684d88254a1300c0213b9e792f6a3a44051dafa1b10b086228a560af080f9ead66e98cbd0416b185123015e2d1706fc236a27402627db0cfa265b6439814b2a720b5eca822b4ef5b85d2be340cfb8b0f7f383976f1c1eaf30e5b46311d822942b7b1b5476039749106f67c081da75be05522c3602174f5a94bdfbc500b802def93eb194549194557e8532280d571c2f4fc0c8508cb871ef060497ba0456fc7e4b9045e2921b85816bcda49f9c17591a1b5ffd89b68d377a968fcfe58917b8d43591fe3c544691e89eaceb24006f2cef5098b36c506b0e08176b805973858ab4d31ebbe1856d65578016d8aad123f173e0d9b16c355da329809524920bda2fa66adbce1a9c49c98dfac6ea132323f83deae68e67b4e032065e5568d20924e93e6013b0287e94786d8eab786a813acc9fb32cfe34becbce26de053a277cf0f176ba8546199abda0cca9592b046ffa3187822eb88d8f4b844528f42f3de7127a4f5d802128cd8008537192cae3d9c2ab12f2cba235c6257ec6213d2789d047b345dc11163a37db23f8130020f3b64a7a7bb1370b305dc287b35b62689f16d131c090fe37395aea58fb0a481f1ed0a4daaaf2f94df8b2fd1cfa4f0249b75d323696d9043771675efb66e711c647249268cdcc1cc265b29d19670497823abe3d148617764fb84cfe25bc4b86e629c3e9f9307aa0122f288b1987608110c8826c4c23716881f3fc1a0683a827034981eaadb77d3e3151d2ef5d7a6952164d1edcd512035aa06281006314cb7731933ba9be801e275d5260101354502dc4d5f39c5024add0e876a097b9d350d6347c284b60c51ea8c30aba6646b2259196b7d654a333095648f57f00238b0e799bbf2d5352abaacf6552c9244ad20cbc20a17ba5d716b9873c82c1fcfec61a6434733b477a676823a49b219ce030b95c4e7a007e69fee55d683b7a58a33d900c0c99c33e927f1c808ce51f0cebbb5183c3953b7ab2431e25f5739ce861f640ca94f984f304ccbea6386d10df8f6c8499e64e1829438c6f6e95c9d25f292c6c38e4583245f99c5e47656a10105344ac9809174042d13f71f3c5d94f337217659222c18d6253f6d7516e1d79d889fd3b6fcaac8b1d9f907565e7bfbb328d477b3de45f883a5b0d8302413ca07aee105d9284915ce0bce06f63edc9d60afa25fbb2b2d708044659984a9c42db48c160a76ceb9a35a805645594a37af80aa7c7dc58ca09dba40b0daa70f2c169b6cb3039941920a7f2a8fbd69be0726cfe1d68ed15e8bd5d9cb38aba82abc9736c3fba1728bc34188035d08de095c04dc6c9be2853052825d9e7856cf0e0fb79217658c4c88caa5c44d0d7906bfc4fc8180fbe91844ab025d5708a4bd83db51e6e9806242f00703d2d15ec9e4751860cf677bce92232fbe8d971366e1a5abf5abe71580378261efb3b5a158d88bf615c3d7d8cc15f1fb1e9bc3f2c24a833d108b15ab24de299eb8b3d3d953d5e264fe41264480f50ed67b5b24bc7340288166bc999694d346bfee7f5b50f83b09e58404ee29460ae89e21f0d3666b2104062f450405106630d3caf98f0aa0f3b89a36b9616b1666d477e3def66eab4e0294ecee7fb3978bd916f4fb9c67a18fbdab14c40eea4ef078991cb47fd6a432f2ba3647663daee1343c11b19837c89503bc45aeb71088fa32534d5a44c22550eafd8694086828b0ee4d5d3a45c007eb35cc3f23141c5aa3b40b49d989cc42b73f3a4ba832937021b4b013be0de47251f6820a4058e3043e1cd559d06cd3e2304eb6072272d5cc248efd9eec5efde0146d04a765490f7c19c2f40ac066dbd74a13831c46a8e72d9488a8867ca4997ea3ed9de80b87c22935e84bbd3df242ea2bc1fd0c91afe38c4ae4157e141ba27eb1dbdf822ee8835b5272d807cabf8d2bd0625383c428eef21d4df7497b523c61620eae6adb6e14ccacbd9e49d93a940bb062bbce0c50a83804a28d46c0a4c9faa2314de058d880ced5cd1eae3a45822615885ccf82a582a0901a12b99e9988fc9b4ed5547497372da86289df7acc43f92b920ec88d6d5f48ae481e0ce369bc0516ef1d88f78b33a5812d482f80befdec3b198a64aca8574ae63a0f2a6cf6c258c5f8d7c2b868b021e79b5df89bd1a4af07871caa12f78532285e29c983b4273f6ee9ebde6f51711af120615e5087c6c79be78954f123a88b1d18aaa112fd4aac634b183763cafa95f37e21e100d49717c454540e04dab7bd40136db1017fcd6787ca052cdad2b108078a052112acd77113bb50c0a33d5fe696514b3da1b07cf52a85e6f72b6d1f34a579449c8c7694ff9e0ce63c1083e0a91ecb7d242956a18125effb3594c32017e1c16727d1de0d51030e2e6fe1705a893eaf709fe9896c4e0cfe6cced6c50b91de4210ee65b2b36516216a7c4fa9083dc3a57beffeb8c55ef3294ce05a1f1cdfc9be4d5e41ce811513322e59c8469223361d06a28969450c6eea902a6b8d752f16b581907c2cbf9ba9d78e602acb28be6c87c8243383c567524881fc7282b724d5ae0e34694f328722f496b18a320b6ae12b0245869e962c06c7716b118cc63c576748b4e3706145b61e4841ad32e3a3c71cc0b8d87b10c2e939197bb839aae49f947b04357863e3d2d8024ff678af4d58b8646890d8a082b85838cb59786cafc38c49b4dca417b1c3cc1e962c013df8463c5cd0ab0aed922fbf6f94a2ff70fec113dc9311a00047f88a5acaa628ef68548f59e88ea86ad0136c4ac42f24b87ae55317b19b6c7a7e4c96bba88b8d378e166d79db16c8c81b2b372922ba9f563702e2e8d2004044ad520b49c604fcfafb0cf9b6094006996c26b132ffb7f2b788696ce4eb51af18cd649f23bba484ff5ef888ae929dc8a1a399407ad8b082a99b82c47662bc81717a7396703246acc53765cf927cb7027b3512012cc98257947ea986f5768dbb0ede6880648ccd83539e458ebdac395d1e62c6674062f919968843d957048101528e0242febd1b113a446999d5f43760b374441b34083bc11be544b6e5023f875adb9aaa64deb98eac4963d4edb819dd8a0c07b9888ddda59afb066e36daac552562d55cb783c7232b9b70b7921cd1f04bcbc122eda7cb57a7f0bf679ffaa24565dc9a0837e72e9d0b4f453b4e7a84e90662fa908c8cda624dc13a0b5daf84ed25bf5f11ae8b9dbf7cfbf4dd83405b6a30535d18860b6e82852d993b6f27698c0810579a688a91c62a92771b6295bad71b970e4429024780df2feac15c85bdb8acbceaf3d766d183a17101fea325e8f4f57de691376ad0a75bde031aeea960a3e6b756b88485c896b45f317ca4f04ef003de91f6c743326d1975fdc658c3f9da9e8ddcc35d1a8bd6d7dc996667f560ee854fe6193951c173639d4027fc50231e994a604baa8e6f0afff0ee23a51462ca68d318a507a2d77a168a80a4eb986d941c7ce6b7b52e4937f53f5aac21a888485c606f9a73e5ae6ad353b9147d2e4039005931fb680c58b9bd0efcd87555f067113521695d7a41c8788ac56a53af03d9daad8c98fcd9961601cd8efba1e627cd79453285cf852e3c3025b7a29811069bc7a22b392f7a9ac37a7be0b271f091ba851ac49a1c098732711b5c1267678495b0fadd7607c3b6f5839294a8df58fcff75a51d19d4ec9bc884d23f555aeef773557cd0488c17ddacc7cc0927a39070adf6351dfd2b2990a0081e0cf109fcb37df8f2f0658a4defa97b86aa07b2113401db01388932febe5ee9331283d3846da23857ab7623041ee977f6681230a249adbf8e728809f7b54047a0cfec28a5064804cf69c95a8178cafad55871a735e3764b5add681007a63e2a4a898f51421150d36bb37cb816de343f8c1eb7f001805ea3d38caa8866dc93b8b6434c8c31dfa5f536590e9a7622fa9de6dc2c8036ac86eb6cbcc07580f40048ae3131860e98e09c3ec7a6346ea87a68bdb29cbc03f4a9199a88a5fba827f4c07a2a2f8092c485a8596c5ab45733e95d7350c7c66d371828fd638fe32ffecc8b3f12bc84006b6cf00448072f990a7a5a0eea5dcf2206ff43e6ff6fd86014dce7e80844ccc6c9be8c16767292738e5aa4dc801b2043983630c4eb36e9b6856c78d2c9a2f0a9de611dc1b3c4ce19689898bef5da1fc13cb15ad4934fcdd4199c7266c4fc9d833fa214d83e5fb8906c75cfae85f1679a815d34dbe206d4ba0b8bc8fde96eb3855250d87fc0d78b40c23880cee200aeb558ac870308da170a3880b960d27d03b82ac666e9e1b57f186ae96cb4031bebd68b055e1c6aa19128a3214119c97a3e555477991845e4c4c4c0c38dec262100fd043034965d265c010dc295c1be2c450a56f2c2dd95641911ffe4157701067d83749478e46b2aaef725b9079cac774ec72c7fab978da6923a133ce771412d0c3d8651c9afa401fa6062824c95c9f5722a1aa12b80c241201c9f570c44769d82e3c3f7e5a22dd24d8f01cc55659252dd1ec08987779927514f84febebe99bc6179448ebf8952a649d512a7940a8c38d06340351b01e9d66173ec4b29eda3ab8a2bfd6ff74ec068a1196667b80fc64869c250bfeb3c427601a3ee7a25f6d5793d0698deabcc19d759803f842129ae0a0902799961c4cb3d892241001701014bb19c9dd18cb887f8d1892ffa4fb4c9f0f9c00657f573ff87f63cdcc7f1f837a8e0e7651bc5579587443c40f2357340e24a7e86a1f5e7e5199493ab2ea4084929768aa8cbf38fcbac92bc879e1e3a921ed77313fa12190b76af7254667a46e485fac25b0a5a2b4810800fe945f3276901430e9742257f2397953498aa1ab992e5a0eb1b9f42a161747491b163b452c4c87c64f77dca39c060261b80034458a703a9fb39d85fcbf754aa76a10f96b7c6f96cc287a31d5325ca884d2812a902d38d7388ae396ada0278284a80b07ca65004b7aa33770d0651eef0a2c304171cf4cbf7fb46f73db63921f81c3f30fdb6ab9080d47fc3bef8546a0eab4b8c44641f81839e1b81656e090a3b5c0eb96e867a026ac7623ef57932099980dec402e885feba239dfed4419b1ffe99cba840e3840846d3dc28736a815d6bb12e53378e19f9a21d2c89f51b5a362438047e0d5bca0a973f5e92dd115d0247f7f82aa604bf1b332619213024ff2b27277a8e4c9dba385c7b0d2cc5a358e172a76fd6cd6e9871f47e86ff411982c277e1b3331955f5f99feebc66d3a3fb5e083cd8e002d733def05f6b4d92cb23bfee013fd463f1a502c538d927e7e27c408133061126e461f65c9384cf472d38d90c883e41da473c663ed6607706ca410b9b91a44d704651e1b2571fe7088806fb7a39e5f26a6f3a48d468844f1eb8aca03c7a3af6843b752f385b17837fc2e708365480f6280f32728a3e50fd7bd302067f6a133f3945d2022be58fbf28d24bd38679de0d9e63517e69c4c18568b1e58fb4ea6614585f58e42ff39e2f0d2c8963f39d2bd0e415897f7d99e1da03e2a328c6900ca02aa6a76f72f1906fda068a07db1cece80bc96a99d1c2dd8cf83ecd00943922febe8b2964357ebcab94e2fbee743a332349db04f6b5db39405d3628f5b1636ad7045d756e01a9d96c5042111f2505a4ec74bf432bef2ed8107a6e9fcc7dc9aeb6d6fb4eca47b7f36589eafcfa134db31b510ffbd594d07643acac4c6f01cef7a39ffa6b46b2d74401f9eb380d09e82107a465682ec8c7c2294ac04681839b1f8f2e00ae17ad4da3d634e442cfa0c474f30c9c7a800e260fbb18433fab240e5bb370ca477d7059b1e3ed11dd32cb9c4aa54350fa11e1c30dfb4c855e33458404718ac48f98b37255ea669576529069b94815b53f9d778ff040bfc15832bf835cbbfbc6093f95c0bb40a0325cb08c11f810126ba3ffcef30fe236da566969615e14ad844f13ccadebfca2ce30ab35cebb64fa487a1500d3aa64d56bdc2c485dcb3158a9b515565537a2842154b481f6ad5d7726618c6eea6372dea6a8d6ef814fbc7a80b58849d0ad0ee57a6fd46963fefdafda80feab85b3c0f69811f27d961949ae3136a704592199efbea691fd80bb5b9c7011134f4f22db1d9f69d0e10d41611d9f516f2ae9a5fe54805768037edde2910c5f714bd25ef030eec551fd3aeb11bd59ab6fdf2b4c5c4177c71627bab1f9fc023b42b38043a51996f3783e49408c7e8368fbf88c3a94a3a651a70f092055350ee437217c9957d7154a2aeae1d614a6238965a2b4769725dce31469f8e9de1da0f4c1a910bfa430186fb0c11e3cd353b33fa67281e4f7dfc19af9b365ebe7d5ce6255f37ccf888f70be40f5e032225d6d1ca5cb653a3221bb5ad0c7fd477a8e7f333b23828edc8bbb7fedc54cedb817478446f4392f089686262f766d92d369b3a1417f533d226bc2703593b7ce963d202532b67a0e78f4634550dc9f5c0e6bcd018c4e20c7fb78c86b3ed6cfaffbc0f08edf3b637fb99cc317ce6d2ba9165707aacaaea2b0b96b33b25141f223626d41980f593d02e432f3cdcbe2b78d87cf3402cbb526ce7475a905e4bbde3216ba27cad60cf5b9bd9de65bea062da95432111281fd7501b965cda095bda87fa8bbea77be01b2d3d50bcc0c723e63580e802b6542f57281f72dd89c00e0cfe95548cd497570a3040cbc5ccf45a4bb0d05e127a4f8e8e6f18a3de05a6966f642f7218af6aba2345d3809c9802f3263603d7d56d6036ea8095fed4e904b9cb0644511f005020c24c4a3bf1c581192bfc6c28e963b8482d7210332a8582f62cb9b500d3657cc76f81b23526cc541e85bcd8884ed46cf02ad8bbadb678420ca4d4407ab041f429d59595f534bc46585591f56c701f53e2511c48f55cedf69624b81cfb3e00b88a5d40b8b9ea766c034f239b5d73e89c860dc3c75728ac4cc4946ef2eab5b21a426ec943aa97c30956d4a3a3aded7b0277e049317174d9ae6a8006fb854ff27c2dd5f49074d691da43942006d7df646b2c41a49570e9b8acee65b746c6b95740f694e1e2b57c905184c07807f1611ee6d0f349322d45a20620a6c4227099284da8876cb2200d464c2203257a8310eb2a537193f5fcf791038e8835c02ae04ac62a87143cb6d4e09889aa2b1492db6662c8d08584d7d3696e882887667a2a7ef7b9acacbd5223815d164165637f0dfc6797db2878451aac009672feb1d56408b12666d352344271c0e48ebbd7755ec4e8558ebe38b5b751d5e26126fb2c08ea65b187bbc1b20689b910334095be4e630e9e772f26eac3ac5a14a5711ddb6c922698e6799e1232c838b34f010c0b7eb22ba822023199f9cdbf83e652985249046def5a4fa1ef3067412cfc32fce2574d2f45c3edf44ca62900a9c0d2327b24aa8fbfdd8d0e29f8bcebf1013db07adc38c6d2c04e1a843229756fbaa5782fa7df037f6c39f602afb49e98ccf45526155694036eb3a46827a42624bf57bc648aceed05c6c7ffb2244fb589e5f240d0f5084cc02bcc08725e84c3d84d971ed471f5f003df1e66c95974517abf68f03fa0823f42ce4acbb6c8e6acee2d88c91906bb114bd249c0953e41a0e4ae4dbada8d985bb5417feb71b04ef04b14c37e390e1f9aa80586d2a6f1220ff89fead63ae5ffc4f7ea473e5732fd740e570cdb3c35114a8ab92c4ed99866ce02300d0aaa7dae5d6f0297b6b16fc73fbd7b06de22d8ed18350b796707477764807bf400662c1e7b29c8dbf38190f1f8fb9dcf8602774aae0d0fc8ec4341a7d1dd27801fdfcaac3b2548b125cd6ed48357c3dfc409c3ae9d5bddc2952ee73a59e774095ab205635e996766b28469b7135f9371888594149b6fe7e0200304acd79af63661058ae39b3879305fe2ed1d44615b72330cbaf0017864007438a484c6228ee897c266aeaafa0849fdb0fbf8aa8b2bf13f0e5b7b52efe054f3a79b14b4532d04f402391645976e3af77c474264f2284f3d29cb1699c3e17175c494264ad52dca4810ec48bb1a52f9056039c589231597aacaa238616cec6dfc0dbee3c13fa72056fa6a83fc4035c3ed3cfa23736b14c6a9c4ccadc2663fda289773abc71509ec4a07ebcf092463f75d4e8c84c00f1827a06c7c4a1d7ddf81b0e2c3427aa820b5645eb1a3c050bc85be87a3b7a5a4e202e31264a6762f58f3bcb5296c1824c2e4bcde57beacb79ce02f157323a9b18ae1f0375b33aff1ddb9ec24c509ff1b3049a2dc070a5b6dc482a7cece0e0905a0f8cec48eadab2da777f9e51ed7a80f0078bbe6d4ce539cb98e4c98ac908b7d2611305b1f24ffa02db012c21030a14ca6757309a59a5036d55f465713544339018d286da5a35a14031dc64cac4e3678fbc29cad4612670c74d68f827176c98d1c60fe134ca71d505bc22a79902db85a6d4b2e61c7a8ef05e32c5999aef1f9290bde5de724b29534a29550675066d061243a243fe7b191546c86fdb79f1fc623b92c349ed53845467f9f12d6b87adf2bd6ee6226fbbe8a28b4c722b51c11efe43bdd38c7b10d750288047515787ef5c2795e33be7f11ef791f9ae87888afc74e33b472560797a60767bb75175779781ea7290d0009e06e7006099a7ee6e50dd8e7b51a5329b26d8d3d4ad93b5515b03361cb600fd4f47eab075923260eb6829c7d6957e015bf73836056c1d4c0d7293107fe997325b27a969eb682966eb4a9fc3d6fd8dade312b0714a2260eb24c561eb680966eb4aff1c67639335b64e525a22c0d695feb9ede4a6ce893d30309c00b68e7b97adfb5200b6ae44b74ddba4a4b4540240ece9cd5155ca4dee13ff4b259494b4a3302a958aab3e97d63d54bd7e3a40639a87e3269b262aff62e59bc810eea2c278d2f73f15b07cff1b6217c052f4508b831639e0573495a75aac335a40559ef430606c32db612b0c8da568b04fd501da2e0e9d13bd50195a158d0463dbe6bac2d0766db068551ca0f32c90b8ae3ce01da0adbfbc50d9761eb0fdacaa11e9491b7580b6340f85734d1a0d054fd304c39ef4d94f98d5641886651ad7114d9571d39392d252e99f13e2a62725a52f68895ed00b8252525a2afd431c8803a5a4b454fa17823ff1d4406e8a3dfed27fca9192d252e99f038a443efd30301cf75f2a511a895052d252e99fe3a417e87ef653477a4ef7826af30baa843a8553bb7162a788eab6c31f48d4eff47af854b7618fd71889baae26bd40316cebf8e287f12dcd9fbb1b5b6de53b34ef34db9187a269d2c9997e5102b3733310f9de4cbfffe126ebdff7fb0e624d9dea21ea6b16c8a0be9fcd02fae954e59daafe0b5f403b38f4a278410fe82b7c3edbe3cfeff93c28fc405040e143e5bfc29422b086091d1f1ca22b8888ae18225a02113694055036044474c50b0287e80a22222222ec8a2088e610290aed26d0501640d910904f16239b26598c6c9a8c414a4a4a8a7d3af02d299cf1c14bc2fc5829f54635bd8a31c61819e603fbd21f04171b06981f3e85768c2325a5a5120ee3cce95395616ffc572eddf2e998673e72dfba22b1c2bf7e5e5aa93912136634f7465b2703b375ff6405d3316c038970bdc1369c77ff8cddebe2ea75c9d4197f69d93143ec4bff1319256affa0f6575bc721511bfaf8d63da396403be6b8b959876f186f3ba49fe98d56eb89b92e1d0d9ebdc1a7129215d026e1bdd8d74d2e5e7c8182e0e5a48176955025f4729e30b978392b3f6ba369d792f3535b722aa1975309adfcd0e019c35c976ec6890ad5f8d736e7d6057939961228d70b7b5c2d574b866509d50e0b4246838182a002aa30eb82768f876771ecb02acbefb02064e58de6c423d08e8527a7b2f0d49e719a03679cb820f9d44992103e33ff8c43083720fcf127cf6d174710271a92409dacf3b1e63abe673b46db5abca80d38b8e622f954ef2d50e84395f7a5d6f910fbd08e51650bee587245edb80e2d0efe09adaa8808d7b8f1e4d883f95e7c328bd10241055465a5bdaf5ec24aab191794bed74b90e03b949191524acf766dbcf8b62e48900a254039fe03f2deff3d7902e8c9134b9aa5c6577da780ca1d0e95abaaaaaacaa792a0cab79930be8618a5d75fd2faa5066dfba543523bf8cc5d2b7cad48ae3e29e3c59a4a2f633c52af7f6f7ff6890270e0569ef4d9cf1519f559f56de9bdfa95ada301a38618a52dc6b6fb4249dbee68cbb68ec2d8765fb0ad2bcdf8a50d3982a4b39aca48d73e9d43f4c33a403bc44855bb231592ca526e5ba3fac707494fa0fc106e2a7dd5e087dcdd3af956c99252fa5bb22aa1005a2fd774bd6b7c69b0242ddf9791ab4d0681a1ddc391e17b64460173b31340bb1db6bbbbefbdddddddb7bbfb767777dfee0a26c7f8348ac0cabdd4dcab016fc01c2e0e2df9d5d6edc70dfa434bdbdddddddd47853c83e68417ab574508abf736ed89e8eede15f17d5ba76176149c284abaa7ee132aa4d411946a9152ed675987545da4e154f99130139982c514502c4187e8fb4e3e9982496de97066cf1f472352a70df1edfd5e1b66b4c0b28172041a62fed5b3a53dcd7a7f656f699df5d60664b31df29fd6510babcfc2b6ee3debafea1fff4c3fa9011902447dbf3502e95f2443bcbeaf5a78f05bcf6ffddc29b1b701d95fab5fc6877193924753da591f2dadebb7fe699ddcb7e0f4edeae72058ed5fdf80ecaf4ba07f3720fdef8314a91dc46bffb6f4f852ed9671660c841004e9c4118ae0d31349ce0ebd608730205fe0e3d301391880105145448a82340529880474baa188d4858aa822aab42075218612345034506ba39f245411555ac45082062a8612d51495944aa80a6a4e9e68a0e4a90ab41a1a40903cd5a1ca3f0021e8c40e956b3350d0161eacb5f0e856487392b522cd3d608b0a2bd231469aeb223c3cf7b7d6f74f1edcc4346f2de0a3b927a4631e0f441e0f6ea2401488ce3c600759bd94cccc2ce304164075a7d475a20b51d42d40509241523dab71f6a73726c4b4b8b540ec46c7f8ef463bc6b3f713ca20a59ad5c47f91374cfe5022cf9999f96930eca66bdb6edafd6813ae0303c305edd6e72423e10f7f6918e8c38d1f43bc3e3310e6868ce49e792f7e67474a5cd01cd024b5e3c6c1c9019f5cc70a6eb92d68dc30a63ef88b734dd0ea2b1ff1b9a8519da4f6d7f897d5f830e5f58cea9822cc4ab8c648c64c9ac3aaa931166c2496eaa5758b45275365622db28a2c2bfbce8e94689ac4f81149e58249ed642a142e96d4fe1c3bf416948b9a6b2b096554cc69910f7f5949e5a2feceaa2fc2556e35fca98c47acd5c63acdb1119cd31c168c42092d39826e37cea524c6c75ff6062d6e987243d10d4431744840a49faeba48f2f186d25cd34841ed0154c12b281820b536fa699c483e2428061840152a93dafe4e7848a9e67cab827c682767d42137dc509946e54d9ae48e192403a40050792301ad8d7e121528a92787a2daa49e98938553b99f07d6f951fb7ae9a6d15f5b27a4361046d40602a7363f090ab485473f44f2a3a439232d3a80688eb5e526a8649aa9c991c63aced5258168ce878fcb4773fcde49a2aaa84aaddb2995218e0fd9b0030478a00cdf89d84d19f6f0bb07b7b79dd1efa8376ee1d1fffe6d1d92ba6f5d326db1d704ed5c747875698e69b0214954f97d14557e9475aadcf112f5e980762e2e5028fb0671704099ab857311c1bffdf3ce407dcbf19f3fa7b60313b485474b8f67a4391ef15fdcd8864fdcfd392ffbaebea174ccf51610d606049f3aa63fd3b8a77f63b9419fe6582aa6756c44eddf0d9292d252e99fe364d0fcc95327cf7356339bb79dd1f7683bc242d3c4b7961eaff2f3e0f7f7ada507732d3cbc02d9602a9233d0f05c41db470f3e74a0b5a8d130966f527c34d7ff6e403b59bba5a4b49bc3fa6a327f7fdfd2968a549551f7c915746a0b8f6ef4d923a973347af9a397d55499b663ebc4b4f7b3b3d13684bbc87a5ad9efd83a84d150e15b50eb1a3ddb2eb7bab2f5985639d3312f2cd3ba1d5b8104f96c0341f5f2615623ffca6ab21dbe636e96d679c53422bc36ac2ff2a40664be7c9cca95ab4f13a7b9b5f4a85ebe7c99d5c8979db13684bb42247562dc45dd8ee98e0451e763a73a6be6d682d5e918a6453804d208e50f7c800ecbb85a3221948232604da59551c0c6441528a10b5968d90dc0fe0cc79781f173b4fca8cd68b2932971dc649a8332143e81ca2742a7c68f9895798b7b57f839822a34cdd069e2a7c25f185421f33461059c3a46e0a2768b45851112a153e1cfe818e6d1336255b683089d2aff3defa099d12ff0657cae712b310165b0cd5ab96feb20b37c9b6b5c5bfbcadac3e62531b826999571d3cbc8b48ccb442babd9afaaea754c5724d678ca8a98eb72e3b98c22108949fae8fee29beb25bbb3662430aac3cacff48b8a0a5451791ee201ed96a88d740c57089f4fb312d2317047914d08103546ae6d0877b113d2d213618c5344582b022bd560b41b6e92465a4079083ad1dddd1106f4cdc743cb5e5813fcc91d8fa142ce6a6457978c324a50ff0ee6c626b33ba29bc63cbc84cfab6ce2217f813fd43dd403993407799a8359cd0c16d01835db78331e312ab3956a2eead0f744ded4b6d8032cf8d497a3be1b352a99f2976540dd1ceadae8321800a85b5700f071ca4db4340461a00ccc908c938aa0ddfaec00819e7982052615c26e7de06b530d0f9feab0f25d8d0a596a4739e52f30a864290da5188b1ddac90a79465d43192ac0019b103c20c84df7011b0ffcb8e9808d8e9b0cd8e8704335b00d9858b6cb9c845906d37e820525a5c5b1cdf9146633f36320ccf9a3964a5a08e664ac6b34b72bb9653cc847737bc3734c517b68cedf3799b5b17fa3b9fdf9de689bdbad85b7ce657332bc5ca2fd86765409dad59037f266c6be6d06bbc89bf7de7bbd41863f0fe8699543c855b51da9806405c44c3cca522bd2351a7de7bc7515a6c9f993b5eba7d661b55a4ffa796535a4b72ed2c57d759208cdb0c95c6986691691ec871c3955d2685e181fe055ce7454ff9c216421753cc2b3240e2a1a699431c61c55b617392adcffad4ba42e3ae07b3f7eb0bbceb404fa2110f8fed3b5f750e38a24b2cb6007ef63697da569506a2e7533090800facb74f43f6cff75b0ae4bd5f1361f5020fc7d84b92e260ccb1607bf0db409ed64ff252b95b037a752d217d0ae54e1ec0a67744c7c0861dab434fc97c339e79c8fa4b6d6c98e6b7fd4e45b3fd39786a45a5a11afd2ab929bb06d3d5b1bfceb93054f3127c93ac23ac23ac23ae208eb08668b073caaa00c9b246a5d9606493f532a533495226d25094ee7f0b29ac8fc33bebb1b108e186fb367d767d75b4c68579a3f2f0c66d797b2ebdf7bbd445e8d1895d9f5160f6827ab915c1badb1a5790e89eb443d0de95794b4899443d2a6b3af8f3a24753e6c566fa77aefcdafe64c5bbb92a45f9a6a2b3a9d43c5f55a41ad2459416d2b39b0c22e6deb94d8a5edb8ea6372a55a7274a6a64ad194e65ae508ba92bd6d05d59ca53d6cc4cd1a304b9b35d376a8bfd0185649d62903ab6aa65d9ab53622a9b45559cd4a121c54732b42ace4aca05684a89da36445a7639674cc5c116271ecab5aa5684663130098e49a693ba3a7da760edd8ace935694740efda4c792edb8ea7b1ed06ea674cca86f9ba9b5414ae9e011d7a9a292d5ac2869aeab6a7eb5a2adbcc86a548a666a25a7a7633a95a254c738139e8e71a252b482f25ec1b1766515e1bb46de3c63543d566d982104ad9e508970ad7271545f6dbbc283758c33cc69498104b7bb3f7777f757e17bfe0484f0c518e10f845b70181dfa131072852f46f803e1161c4687d7131076852f46f803e1161c4687d39fb6433af94b5f4f3ad9b4e9da18cb628c1ee17bf1c117dd428242ecaa50db990f637c2938ab39216b568df0b1266b8cf0d2301ad66285afd221824e9c2237cda253913f6f5e32583bd68ea5036b47858896da6355c17abd0ec986847a7f04259d2a924d8cd547d249250b952ca28caf92c5e2d07193f55267e6f84b431956d06ee254515bcb92b2c2a2c6d76561cfe3cefcab5ad239a43a87fe392712aa54a5d3dc696db416683771743a66e6748c928ee9829c16c7be7865d0ab6b3bf32fed593b34c3b29a9d595ddb91300ccb6ae457d39999979997d9330ab8f5a49307554bfaa52b9d2a5037f5943fdad2442d56d658c32c1dd0681d412f1e17f297ae74e08ef55756035ddb8a33714827eb4927998d82d606cec439e1543ab565d4aca8c90ab5a8551562178c95b4ae3952a1b182c7f282b2ac3c76081f84706343f81c42f8b4af969451728e4b88313290eacf0fb6fb046e628c51db40d360e2808f25080b6cf717fbd2cfb22618ff018358dc5d7ef8940013638e165744f1824d94212d28acfb244a154b44c942e9791428ac285254ff1a318a938ad57d122565053460484c8cc9c40257b2722b9468019635c10a24b6b0a206562491c28514211c4809ba8214285286809d41ca0e32202946645a54d14596aa420c555c5185501558802ef877e16a6c5605c5c640ab29198a4a2d82e88cb2845a53c8ba402b285ad017490461810413a814f483a09913f439cea38cba4fb890441557d4ee61a6c0c048e3402c143fd0994273043671054d14ea2982e6085c810e688272c00529d01c814d6a4003b7ed1cba1a35bebf5c007ef530b6c82dc2afb6f847600b6620b1a8519fe151a3168040487f692666e08324688e3c19d0c04742c3750eef8604e484348518637cf04dc1ddbd0a7232853734837c2c4931d159c6899193ecd08f1e7cd87a7a7a1cfae85a5a5887534cf8596a6735ec3385763b543be9c3ddb7faad5a7a78e5f7ca5bd752a365e6875781381428b4c78f9921fcb7bc5b27a4c2f7409e0ca834bd6acad04241841f6c7eb001922c1d763161bdb52ccb62a9b2921850fc615fa41109e368188276371039711245143e04ed4829274ea2804778f0adef3a4b63e917ffc8d5daaddae4168128bfb763bd6747309a26f1378b007f7f7d4e0433d06e7d6458b62ec2b4f0e0870ff93dacdd87b6a14a3e972a35226fc91254747ecfb5b74e622c3d6306427797c73d33d0d669ae972839a9fd4c6a3f8988762e54ea4a3a39b563d4cf9225a82724a32067250129a5945525bfaa2ab949806231c66dd140dd8dd4382957bfb6a7c097aa45594c7356db53e0a38fe1952e6bebfce90fe5cadd2f3e562565a9aac6a28c2852ff68eebd2a3a7c32db8f97a3b9ae20849121841042dfc14d4cb31109047868ae77f8d1313bb8944e6572ccc058354c841042082174777f10be3b7c2ea9e5853731eb6577e5d5b7ce7af9130a6d77aff8f2ea7a5cc5ba1952fe6b49bd2dead2438d590f1a40d4186196145130330b99db1614ac232c292c28584838e9dfddddd588ecf0bae362690e6b5e42f2acc6b97a8e4e8aa7c7e7476888a8c84f289c144f8fcf0f5011ed53a9518fc3e5c0e8f4481ffa5302fa204ea86e0e57a2124896e897b8e764d6870ae93942550b752ad21041a29ed7c327e7d3fe448b0ada511ae6a571928d07b9142251fe5651f72d2868ffdca6d4aa7f5aacf0e7cb6aae4a83546ad990d7eadab6b9cbba42ed2a7095d8675aacb61d0c3edcac8650e6ba2c9be4fbe83b05e0f0625d73946db0d3eafe0ac92d7ef7d5d67df1b75ebc191bd4c9c71df66b6283ad7468b7419117eea2f6002dabdd4502dd95510445c2286ed94dc7be65f8322ee3bbd5c3aa92d52665a88ff84de4c34d0c68a209dd64400324c25d8b1a7d74b7436f9bd07961c338d264d8d0dd766dc4e7ba839234d677b28b1b1de323a81464f580fae86132843b162603aefba6e5e4ed7beb84f2c397f139ae7bd7a044051554b04cc176df7b6fb5774518fdbdf73c4208df7b0f46187ddfdb7dd25441c86b2342685141f99f7c113e089f4708e183f041f82cf8de8bef3d7e0fc6a5fb9a23023e081f363bc3208410c25147c9b604450f0519c29761a3f78f8328431a9ecdb3b171b77936cfc6e6c517f4e8d10386156398026fe0cd0df30dbc813737553442071d74a82188aa9252884a08ee2da6c01b7873c37c036fe0d02823c58a79f6055e3f5836e03f5924e1b35015919b4ac229902b2237d512951095909b8ac84d25e4a622725309b9a988dc643096c016e6649d79f63298c5acc26466cd9c2bc349e9cc2b9bd74f1351fe99661e9802c24811db9c4e9c8451368cc2b2cc9da8f24128c8cc7e0c8d3212fb30cf3e03814d30c53cd0c90b8456c6435628b31e5edf3647309591b217990af3c022200a024115ac09e6e4d4b650168a6871bc6f0b65a172a012394516c9220b50fa2253f1416a5f1af2002651fb3d571bf3a4813e76c23c10e0d9e145a6c248b01ca6fca553cd19815e281915951596aec17137606056565860f08c52c9e5593096ac6627caa2ac862130cf26b12659545484da30055315a0982c9ad2a6b8c124280b85b292b4093281291698a2589601d5b0037feeaf17e5db49e0f77c4d371cd048c0123c1198ee18b00e100fbc80aefc3c58e0a67292364d9f1e3688c8a788da6d511549b0d0627105ed38479624eb0861ae4bb7444f3091839394b3fddf859f871eda649d6aa42a338f1215e268618ada6d149569ba1c95bda5bf0c519f01cc5766b2d22ac9e86f616fad859f2b6fb409f4ab4b13d07e560114eea6507870d7d18cb86902fbe25f05d7eabb0dff289adbca525e9f2adc24a988fac80bd4ad2150ff36491a7f951473062f4a7058d092a0211f4687b801891a9c0b3090e0409f25fa65612894df77dfeef36da1f31728bf3f1fcaefcfb16b08192f6c5a129b298837971096259fe37355599665599665591c9f2b69310e64575230f3fbfe1f6e6a1aeefae1a6f98c629c270268acb7e567de88308ef85ca6d11de9c23e4d3337ee413da9d727e108b5e2b14faa7c6e1f6464606038eeff7a52ad8f4890e0198ff5b9b698a3b9f64d46a6b2020e195c7277efd7edee6a52c260c812572a15f9c2a217698eb02cc346937451eb8554a956220b84f1766bf0dd182dc3dd5d06b6bbdb324a368cbc474aa062ca49da7ea2051ed7b8daa0c9a8d331d74a3546aca1c2a89506f7e565f58940663c648d3f2bcc35963a25e6da8a4a9d17e6da8b3a27e61aad13c35c23d5391ad539c25ccbea2461ae617552ccb559e70bccb5abce15acb2ea5c992c986b559d30668c190373edd559c25cf33a65603364b4d8307a25a8fdcb3defde5e15735db480fb3632093502eebb744c0504e42353b9fd528952aec852c11549d14a42d7db7d94619611b46b54a33a09cdb0ad6b256f2b35a1ef79522d8ae6d6f19224dbd7f591546242dfd6b5115a27e9117c27be0005ae135f588269209c52a16f6d447310c8b7c6a25b8b0a5fbac9077f810ff9044339d28f326cfb5d417cba4ef27debbeba0efc1ee202280c3fb34bcf0d559805277501759f086d51e74b42ade74c7ea31c268803fafad3a8cd67a660504c1a15371f16c7fab036bc7a8b873e869173167298944c0a26f5eeee2ed5e14a1173b9c0efc3e6ef30344d30ed04d8673162bf19c65a7c4cbb99c07602ec598b5b27273635eb31adab51fd67da5d1825e9db3a3aba0256ea9839bf65b2f010570fbf512c3cd3dc4f370eb462b6f480efffd26767f2277c8ba33beb119e58a8c44db745b9746846000020080315000020100a8784e29040201e11365d7e14800f7d9242845c1b08c330874114420819620c00000000911118a919898200fd803bc1af6462351915783b70486f39f471cdd8d64b555100b0355875db084556db1a35708678bd66e6c7de65c9d8015441ec85aa25ddb07fe594656e4b286e0bc93274f0b386958882743a2dfc211389e0c140d9961ef224174f1da7d835ffd7e9610e9f3044d1a52ce0a069ec0bd81ec15ad17b41ed33cac98166fbf6477e70f1a123fc67f9d40b4d9e792aedce3bab69cf341d2be95bfe57a005270ca956725e869c6a59c4163ffecb442462541d47314a1d9b29acafaa20fe792ab76b483d0798b877a24273f2d057b5e6f56e060073a162e7abdc8d4358047070ebd7d8d33c680612431092cdf52eb63444ff0ca8ff33b907077531fe1e4935481af1677fc920a9c29f7d2e84e4b68d72044c4451e9d786262ce7ddab4e9049f74236023860beca40b2e61824de9079e673e677ddabd9cb9baa557449141bbc01b00dc92e5f4954660293676e385962c7beda6a14ac70c02f1cd9e2819fd785a4aad1dac0db864e46c9488dcb5ef87e53dc5102e1c39bd2e66becaba76a9ae0f2fb18a7b329bd14b555b2c77822d32644e08aacd094dc8e095bb153247517397c4066c3020806f5ae8e96d546a357bc930fbd982c46e8644657ae9fc231dc8bf7284f0aad566c32680b818fdd692a05eb14d518b5435e389811ca0317eda86f0429c64c744493819d9e815702f35cb6d644987a4445f51d2bdbf73a40a325bddaec447ffc3f07dd22e003703bafb5db9e8737ec74fc4d3de1188a35b703b7c967cd8f06facb27d4de91562c3601e9fab3ae5058036a17e768ed8505688084d154ab37ce7ef3ab2c6d37b5658288d1c06c58e2ed71645268d0e8ff9e9d690fcb2d4bbad1c01f5f2f20d1711fa28d4f46c7ad349a43e99b88508b50da700c9994af10cb535351822085986b481fff34b0b07169b7f5e792e476b09fe4b0ad2b74023146ac67ea5ff8d818c634ed5541d24f777e68a8696fa73e7f818af381377e29dffd5cce1a9a4d29bb4fe63eb01300ff4499c2db6bd3cd00b134221606fd8043e21ec216dfbf1c0f0f65d8ccc37f864dbc9d389a31aa869bdf3026e423f9ef1925b37c622e98fff93d2cc05cef494f691ddae33309c9b2a987b95b22346cd95a33c740a180819e317b97f93f0f77f045047d0179e904103c288e4f07f96a2695b185ac3aab206a643177dfaa42b3d3f6613e9d9a22a67fba965cbfb169ea345be70e89863c71052089ec7ffac2cd9206909b7d34aa7025639e9cc609b7a0b6ac848c00f7f424bd1b1818c90d78042c346a8603baaa2fca50359f44dc5b823c92232ff74a79066bf757fba7ee8d0f4f3480709fd8a062fc5b172f6f23add182eb96ef43e4dd5df9121555c1cad1808d7cbf5dd6dd2502ebd223e3aab73da7f094a0a9c16cd0bfaf7414578b09597b739c24a0380d8764a6c2352829d75146932eb8f931a2ea417dcc32de281d1f733c71117b04127810c76fda531de3269ce016ac224b2cc9356f1df7102812bb9aca3fb8ca24432e16d346453512538537cc1347b5b23116be5303056396902e7483e9a21f66221393eeebf1185bba8cbcd693a73910d986acf7e8e3ead0a2864ed107f53e508ada634b31982eafc54797c5d2edd1de98df6044c0e58c9445cba3b0d0912b39eb825829e3acd01e80d8cda396bc09cc6c8e742758303f2d3c829d56398d0517faa88cfde5c364682b3f2c296b54557888f366751d1e5c5d5d63ae6d3d513079475eb0aed5a29f386d4b8163f591ffc3f88b13350bb5ec35659254e099179150118a6648973aef2f0633eaf95480fe878af35c31eadcb6c47762e0f22098f592fe30a3b325926f911f7358f944a0e106bc8d350347526bc07ba5348427fa7062a2141e2dc030ec72e30245f7f5b6c2fc103d5d603feb4d36d3cb09436db308a58815daf2e17ccc64f8c3f0d8d5f16ad6cd47e9f48f379b8f6205dcc7c847f6703ccb0d47e0ae607826dc66bd972137adeb8292e79cfe9dadd662c1d4af57795dc832265043f78d77fdfcfdc996b2ba2446378be48a4acbff34f3291813ccb65c1561e690e4f6a9b49903573b005ff243b5b0523bf73e17b46a5064f56ef97056db2c29c499cd4a94324b3035c8a3b31c8066a444e4ec1230ae69916adf0a13712905504f61ec2299680fa97c6688a2452b8633b2b59d720088f246ff691ae328e368d55a4bae15269611d362cf6e371df54e08c0fc277fa64bf270b8df14c3078c848f0e2388511a549a6a31e3dde472e9140f63164509076786fa07a5a0b4bc2ff84084da3a8c95820f451d916bbe592984775215a66d1d81f0376c0a7b635aeb3370713c8c1e5b47381833253b1c582ff6ccfc085c60d046758ab4a209cf56e9b89b6759a02dfd5ba5f4513cc1ed0ecee2993d5ec61dcab168c23c6d804521245da5e9e36a0bae5a37600f190e58d9e77ac325e6690c4d72c96cdf1262c4f239e726771582471a18e39e9b2782f182e8cdc840b00083008617ab60af1f389962d21702aec89be00d1963d2c4bbf76976d0f6629cf3e1bccaf6c1d84b18dfab13f040f6f2c260f572e0c82c9b7e08e12ef7246f65389532dedf4b2644af11c4554b85643f98bdc2d4cb21e8651f8da54a11baac5d07f8bbb095fa990dbc4cf3690a19b7654d7ab38c91f94e70c16a19c0caefee38b71ff222539838553fef31da61ea798e30eece26f5151b18f07e92b74588ee64c8d0351003635abc7023f4c8848312d952afc95f25be1599b6359e108ed8fab77fe2209972b2e8a03c1ebd95ead383bbc6e2fe953373b26fe9fb5f672a6a1eebfd53bcf97851bc9871eb3fc5dbc717f5c51eb7fe57bc7d5c515e8c813bcbdc77db55ae6871e4fbf23e5457635f5e0666634f037efca587a35b90804ce96caa1699f65d212816e83f5ab9b6f4d3c4253a34464dc9f70a87f45f160da4359702160d5614e14d37524cdd264c796e51acce74177f22b26641dbf8216bca38088477ec69c0bbe248e82edb1587790e2b8f7af09e24eafe03cce728d62cab95829f193c6cea0cd2c8a43356b42b288cc52bb6c23110e6d068632eb2a815589e8dc29020a07895d2c226739f6384142b0ec3f4fb9e495bb4a41380a42f32af9de0f6a40edded58c2cc76458e51f4058804df6fd60d471ce0addd8e4d8de8d9a608215aa57ee4ce37f32208501ac2fd5ff95bb21c89437ebb5b4b0ca8fab88496a11a8599fd68df54ecbf083d23f548030650d4e3ccadf0680bf5ea129e03697cd4024395677c9105c94fb5cc0c4c94d3c863e630412ad86da0cd00f35b82a588b185e42490fdd854efb62a52fc824de700d9bcc06c95d219426668a49c096077344045bae04586f81724cc2686967915d6b5dad89c36658be54ced5eb40e59683cd456256af7191c9dc45da20ca365e431a21cbfe97056082537f2c8125cc3d1e7a18a902672dc98f2358fd770fa1cf422255ddc0043aeedf008296f87c2a918a2e094e6c54daa83f3a3c1db0e481f44825b0acde26cee587c7bfac5b286b0f17949d49f7ed3730d8a48b281ced857cb08971b0e8566d1088531d31364319119662e6a0e683c4951b8fc4915d44f29314518c2eb55a51b850eb6525e9d5588c5317098fccae9f9819285892a6f6e800f2545c9609387c2037f3078beee3c3d3efdb022555ca38db70d4039de4f7f344b5bd26dad0650eccd43e4c3669e56742efdc5abae52fe428f536179bd04ce8b73175aaaf1eb2857a8a4def81feb338b47758ea48697dde4c7f8a392dd57bdb80afa008c6891465896a9e571ac271bcc43e67b4654e99da7178cbcd926cafe9e7919e8742badbeb0b1e4f77ca2de3bbf47e877eaed2874b3d92653f22e7b2d6d97c57fb88ddd79142ff915347a4cfcab6d64a54760402156a7343c765f76c94e2e41ca4e3f267c3a3e5d0b0152b2f3cb6566c72b524917c38fb6a7b7db1f2751d1b5d5d6e4a5f0ddad3174e8f371b7b6b185ff92a9f555c991b6d16207e17fc4d7f8f582324b888d3c2193e7141d8c5f14b49ba4936ab660ae2ae914df55330de05bd2d2aefa7e3d17d68b379eff16f145af141dc86463ed42590a6cdb96df028262e86a0a3cddc30bb086c3af90bf06c6de5a39387d2b17f03454be6566126470c01e296e930c1e4b12365e67a1817836a1eb469b9869e617cf3da7fff013904c62eb8ab84b61d82bb042e4a28fd54ed5ae8616ce4e3e5521ec2b338d1f7b342859417249724aba3515d1130f2036de9dd9d4b0d0b1736f1ab815eadd616e0bec29eedc8fb2b87b39af91071c9527be1b44a960e5e24f3bba4a53db54b7064c5c09ad015c9288bdc1925e18cb0269fe8b5e35a40af4634d0f2850addcffd85d9928392921918476bf6699f99cde3073a0dee3f7220a78a8134e9cf6601eb61554be12facef2d9979279c1d254cc63b357a5f9c01edb04528ab995fe2abbb1ffc4e364b48895b2a6b0c019a22a8fa7aa7b5732ef01675bd272ddf822d7c67386ba8a2938fd83c18a0b6cb78c6a94401189bf74538b4db0a1536441ac115d6bc0bc613d3ce0ab88e32016895e06067fe50266e890f2a52f1c5dbabd1e23fc41497af5203972560a185431d6c265d7e53c2e532c68b8223c0afef534ff2cd4dfddc72f61664db688473726a872453c942055d4927487c54cd4c8db56c2ca12da371abcdb7d28a37383beca87afe5f39d5318d69fa045009cb6283af801c949ae8d46c4fd07c07cfe5fd8c4a66b3c84ea1881a59bfe5e96c79ceb3fed5dc745dd19cfb0588b7b654783057b3849a98f34713ac6954af1a395a4a024b1e35953c8e176c26082849f37138078fbd58de65ed0e2018b5b0aeb44f722b6371ccbaa2880386091f5442ce66befcd34bd5849f9a400f97e5e52c492102b6259486a79485fc407413b41f4ec7ffa578d0c1ece26921af4f7b8a64ab2dddf5b144e2537304848435cbc9c148cfaa7b3e8a1b2bb12cb8be7efeafd3ce6f0eccd63f79778aa666600fcb60ebc4948b7ecc475c4c0840f455859cf4e924210fde4f5a22ba4a1c0fbe927cb631270a8d2f9943847610baf0e10e0cbea72130466bdd5ed3b4ca25b81ae0d4015b3c39a660753f8cee400d3c36414c031b6bfc42589891a251579f5366dda7205ba879872551f203979cf9be6729b9f9f4a5df5b2cf2bbcd75ccf14a8039a91e4f6a67e280724441d450ea642874e30856b518f130f9273ee3bac556ea4f3944ac0d72cd594c0ffba0404d53c5a78442d1919342b0004c1c762ae99d1d972f6658c00b6be3778bcd2a2c370598bb1408f9953cd72ee21568c3b7e6c17c54d4c1059388ef27070b3936a4c7e52eea3ffa7ac92e734d76a349e6dfb9b48e6fe83728d1c7af5b31e84bb3131a752de726b14f5fb8ffe190fa0d76043b169ed852a6394c35888f20a31b730e30b285721f316327e01e52b64ce02c62ca4ac42cc2dccf8c2945598b985185b80f2b0005eb5a23a7cc6f7a20db5c9324cc06dd21101d1d581a106a02df29f5463a13562e86f8f4d979e5cfff80268f06e5e6c0e79bcf73ebac58574c2a775a94411421d5598a02b94f347a200aba436c8d9338c02dbe4e8909f4a1a0614d0e2a151cb7f55e30fa0a567df97326d8549a96bbaf1fbeb3de9656a787ad5e213baae1215aa710c31052314b7faa8970792387b401740bc8a4ce544e6dffa000884e57a41ab9de3fce64b1b812f079c15d69f8d3ad2eef751b843047c7209986f67f1b97b301ab03bf9ea9ac22b4290aa464a276b22c72d05217b90f4f19d51445310104e110f0abe0f9bfb51ef0f04fbbe42a40607c8bf14236f0ec057a11934576900b0447360672a75838e234b2cbe9e80226283369e699525b848622b09284a91cc85459264d2ebf3c8af529584880377d3072e70248758fd9f28bf3986dadb0cfeae1b2304ae54a78d4ea845d09bb5ce0cd0191ed920bed1890a4384ecf5b6174a113135582329a97bfa21896f3ad6b2ccdce7f9b6c6233fb4f7c9e2cacfd45d6ef4901d21934232ac3caa21581214a9f4c03f1de978f0b6ebb598e9b22eef2bba7e686a0fbce19ac6782951fa70192d448eea3efd374fade1385acbd5d24eed3a1b9a3e08a708014049d0a645a1899a5b0b1ec5cb199936b1742c3e18087143eead0c0692d494408119498e1612293e530957c212b4675850050293a040947209542219a65b627ffe2aa8232a4a3d16820a7e46a1efa4f2d40b5895c96b01ac886f21b27836c4bbdab4e0bb331f068247a22852d7759279eee52c1f9c9d62e01c0d0a5186702b3ae051411b3e38f83584ca805f958684cfcf96e070090368e1fd3b14d0c2bfe809871e5ff192cc09e79276d828871bff73039e201c76e4622fb90d6367c326ba796491281a9b399d48adbe209fa17f99c8b3a736934b6e790810180f7830dd5f67033601fc2d3353eda0538c4b224084aefbecb6a49828b37648696fdaefad56d8bb5b6b884b4ad2833001ae3678b8cbdc411cf56332393e6932502affd23301156a107b8bc1fc2dfab1ae07ae4458e371bed95c1e0974358f6b4b2f43ab1fa3a95349a830b1b2a32abb708e93b368e32f91dea4f15d36e59b9850a819b8f971fdaa4b6787bbdbdd755e9d6ba0c0505c0331633b8068bcc2d55a31d53e2e5138a975b1c12724efe793769ad45708fb6fea319c1756459aa87c68ca3cad84a554ce4ba6455b39a356481115eae3b6db7a246633719c47091614a5cbc25077304b2ba4fb6c45239dcbace83db3d05a2ce8d79fd4508e783cef0db91753801dd465e8e38d1c751c8693863f39e150a6f1db38b4338615847dd21b79558719244bead9179bffcb9a492a9c9ca48fd215bce56157e9a948b556ea9c0774320249b376fba699e95656fc20ce75949354a0e2cc4cfa0675136346a51b5c503b95a0ef5fed2d69a864d237b598113ba847752009dab345c330b2f6c7c3d5ac2d37ccd8e74c74a722cb864775333f23a98a761697916371b26d32451b6c1c3040d94b7a7d75e8d3d0e7f9009a5297eb68665cbb0673c8c600d739bfbe0e2afcfb2ac3abe70fc1b8293543bc318856264fc72d6d1b69b5511f93f3a34a81d3eb59281f8f03d7beae1cf5435669cf60ca8d31a1bdd078cf596d0e5a20a019c22e939c0b4d4772d3203c6a6e6866024a1d55115f8cfba61ac056a5582bef3b57caf437d3b4e83ae7614b27721607bce9ba9db7269c8ea3d03d955c357245c18333c093eb42d4c473182745b3d01908ce82a0f53abfc5c38eef99ed7cb464204d28673999d3ec0897e901fdb25c13d0c214020f9327c4c81b618af19b27759e91a1fc199ed05243125a9720c190e73d8b41c3178992b7562dac61ee378f98b78c503dd48011418c53930c0b14d8a8725edb262142d004b702a1ec1d6f28cf1d9004304c9aeaa171518f88bd49b009a519b742b3fc83d6e66531b5938ff7a9c514375f3f64af9356aa4f4098562fc54bd3d6d699572f294fd84d65164da8210ee5c246bdb1e700394b30564d9af95ee5ddfeeeac59093db5682be63af535dde0c814f703b5b91f97fbe7a6fb3049a4025554d28692e7e49ddc474ae2ac649051f4289ed35f0677eb732096f846775eff093cbb2604378bb5440045d8ab8e6e767abbbd6143f4d93503d3d21d1345c0509d0aa38cd7094861b5d3a41621cccb30cd7d8eeba1e810d3af73efe16a1a2712c0d7051953fe2880665373e30b4495d9496e3ae823c77043cdcfcaca6b28fa084b8ee9631968d7ca5865d50a666b74b3f95e55a3b857600fbd164c474944046ec3baaa0a0fd684d6c5af41e1e2efb4539a029ca9cbdabf1bc679fdb7fe0de1c8b233edb5a00a99122a5a8a7ef4631d1988f709e3cc5f30938098df43e96906b69efa9e76b23b5c00e8ae7e18bda965a40e436ea205274a1db1344d2745f7c6834d27866131eafbd2a3822b3e778447d3bc390014c274fe4bf34ba39b179f841bc6666a3ca55cbe26740ad122584b9bc7629dd4fd058528daad606a249ded69c07bd7967cfaa29d5cd84be040ccfde12dfb5b515c3ea28476d2008794192df62149f363be7c9cc649c28f3f2a43506a58bcb755139fb2c17034682c1633a84b5130d424e8ff48a9069b4d14ff9af6b871ad9db1816d1fd07548d50d20c6a9d9ed3398270da6db6bebb178ef4e4ab4ffb618c21ddb74bfac091bcf0e32aec074851cb4dec726aee4d8d0c8bd46af45e59203e2839b19db73a859c21e9da8c96bd2d409dcd42120646a3819c236e101c6a1806bf653266c7a494557fde8778bf5734edf39e02c8363475c34337b054d573ba32b7395096e2883f2dcffca028d94e9b061b4c8cdd0ebe92f90e9029dbf691caf0df7a3848a1f1de0d3f1f67748ee1e70d63c785b2151817a72de0eba078545f12643a0b6ee649b4b5b2cb2259ee106ff4b3850789ff031cd3d39b6c34d7ba49870633620594d0604f5ac11ec98a6bf1a1474c061459d2d8a1c0138b0e1607274009a980687de497630d781817c76f2111d0650dafd1cd0274de01dd23236aab0980c630af32e289bce91667bb52d4529377b4ce70bf4ff503c53697abb12ead14987640b9ed83ac67a7f1d6a8135dd8232a88edddb46c754aae0fbaecbbcbb13e4e31cad501ecb23c163a0a0d329fabecfc2bc0f522aa857da472289448e5deb4d5ea5d2215d3c34eaff0b323bd5ba4508b368d7200150d297b42a17a379f7839a11bf0c2174f6b4012daa3d1c959b4c4af40a3584be4f1856560965b4308cdbf34f3652dc7da9cc49affe20162d024866245d3230482ec869c0152bf14be96590564fde444269384dd3e769742b2bfce0871e7a9078cf116e82f547c9d80e471f0cba058d1d35f10b13cabf9dc2e2da05ea410a844a8a30a2785829d79789b46b0c313b2946009de7fa401a52af9f80ca54acfbc9992c52be57574dc840742beaef01a43e28499584d60793bd0448f963ccc351301940a77875db8d70456f13b2a6c394f0bd13dfe4bf4c6f4d540bed81b16448849d97e2b349d653a146b1a39f4958d7014af3de491eae861a635e3efa2144328d8bc24b955f67f12f49e7dbd628167a30192b0e4169ef9be46fd507e7c5d54a2e07553debe8a40fe6c17920d06524b3014c9c4b9ccaebe06da7154c0f5ee4249348f1e82ae88c99de22f9f91cf180701d24440764cc0b0a6524cc92c88cf2ccfdebc0f16f84706cafdf2c8f29ac9e7106019274a7df75f0e36ec438ec937ec24ba24471323242e04198995859c0c660677880f50133c1d1fd4fef032371656058dde388921b5beea432c05acc3acc07637d8280861cc06f614e0372bf9ba02e561dee635095d618fc2188b7be396e84cdbbb7604f3d3d31e28ded1daa0ea31458092e7efa65a655f47511ab0cb11cf86b14388f9a5df2cc5a68c48d3c2aa5f008b5a4e1a0d959db094cb4a81fe17805a1048b23bf6ce387ede9595908ec8cc3da0d5e66eeb5b4a656e9e3ce6c0ae8353eaaf17fe1a4ba7cc8cd9cc70fa1bc47dc970816300b03fd9a223ee85fbd392bc61b5dfcd842405ba881a06cedbd58945170c38a2e1692ca42c58a1ca18a4baf0e5518b16e9a20ee18a2e6ba94d9cb1482c6e1cd56ae376f132ae6b06de71f7cfa6b66a6f9c418a5015490390de202a4af0b0ff4b29c0a43aef91ac71ca2864e51f3d3135ad474960d7a7da465cb90012657fec280e6c715bfebe9b6645c82602138417d43de66dd936a8ae7c75aa73d6a1505bb23fdbe608ff7a30d325f3bc1469a1b862045684b22a8c6cd8394f1d661c5175422f5f5ed4ca8dac0aeb5019bb133078182f6787b3dee16e587d855caf87354c9db86b94af6bb70589964ed0f73b17603caf9ffc85376c786038be236b4fa78eb05b4982e0c5baab8fc8fc4667cc82a6af66aa9366f6763c651a92a03f3aafdf5ab412314abad1c193d0a080d35aae84c6dc9fae1f9e81e6dee53306db966cfeda5a70051de863bc51424d326e0cec6685d380d4c145c7a4ce9e4df79bee95df5e95d93c3c186d2accb0eba2c6377b2c6f272198b876c8134a332b224f6d8dcd7f8fe7089dc588617d7a8e989aeda4f764c3e51955123b1d79092e074e3fa22585535b2117cf6b4592f52343ec5a83aec4b2285315d6f25f4a860cc072d1144111085eccb5a2c35ff81ba8dfc25db2a0f1f0e7214c39084c1c120386ea3808eb79c1eb9dad50eaeef029a8275f15a39b2e75721f436b46f19b9dfbfd309ead38e20d6433a580074239004286757f104dd273a34c7b38c3efa3b6d602cd558e7376b4d29149c41cd6ac43446462693062ac9cf0875513e1165d343d39570c00748aca1eb227d64cc2bc4fa66f2d3320f0aa1c03ad3ec04a92dac26092a93987a9c7fffa9d4b7291a1ea9074507450916027e885edbfde815907c45ff7787c41c17421a03edd92b3921b62f939940b47993d52a6609b217352dbeac4b62b3ed7f703bab5346c586551f8909cd7025ddf06f2ef1c9c0e274b70b99f1b1c435d15e9e25f639c9dd25cf8b2065d36c90228e275bbf18336b9f645840503f9ab07f33108a8384c956634bb1b7f7b55a2f27d5a2014bdcb17a2d32f92e0872fb1d65d16c73fbc1b7b0c9934ab012142a22eb3b3c5ba3fe2bdbc7289ddf6216fb3c9b2321c311bd26eb362f7a093755946f60c18e1258d5045df881ca4759257e4291aa83d91939a8f48d22cd0b2b0e833d5bb3ac104370def8233591f123aa8d78e7a19d39acfd7b1dd5c146acdde282b3f4ccfb94ad77cbd881515e49023b0ca88e96f22e0de0899cad7cb156f4fe967a4a413a93ce614a2f10eb1d994440465d6daf33b606848fa26c00b3635663c4c8406daaa2fced03f743c8a75bed5a540d03ddb59ed19c98e5db660b1db7e2c98e6dc2f766b4b0c39f9cd80c402553e97dc926b993099e8a7d9f388c34ba31ef320fb819fee0e9c59a4c17760a5e3bcf32f9fe4ba17a8d6b281d65389f638678598563733e5e3e37fbc1c6bcf6194568912eec6cc1742b86bbf65cc18ddd71f964c80afff75950133643e98edba8120b2b3ec4c3651d66449f6a8609243991ae623421f472ce602d08bf19629a2745b5d6519e3111b6eae08cf3922459e2c399e9059c59adde1b654221fbad98cb4d37fd1b4f14b41622cb0e9221b0fa1ab47a9d5bd917b541873550d6108388ddc32ae1eb29cc29054f17ea02f64944adcca08f8786f5944a0b87d481a4500ca6ce31bcc8eda93e49a58154cef0edd804e9bdc364078fdc979f6024c0d7b24bff0b4d277d42e7b3fc58eee3407645e05f03bf0d8a0c6976c2cde697da17266635a9f02e26de1195019ac46e6e842ee36dace72fa2ad6fedc742804ce31a49be27b59485774dea4545ec9952b25acfbcc0639de79870e3eaf09e466d3f27b38529a52ba50e82e2e09aa8d3739ad842b2df41130a144aeeb5f154d6f1ab045a47171a8bd4ab6c6f91a7cb8ede3dea6d78f01aebae9f183018d712bb794ae7f547da2e668925a8078158eda3c81ef0f217a3babe3a04c9b09571cb88ffd5220680f542e6e3f3318668465782b4ed6bb5e8dee7362f9ebec5617eff56354673bd8a8ced3ae8c176cb88aba2358cdebc77f9a3325db15096561503237c2af7e8685c33d45b02a770819948f1ae96ef4b9c8de97dc62934aecdb19c72731f76a0b0f8aa9f8a8724a77825333bdd3b1cfb43efc88d563b9e0a8b83deb21b20395cc864c497646b94688f1e0b0ae0aeb30c3d9759177ba4fda45e6aa70f0e3f88e2e4317ac9b5c5c5f452ca169f8e62f84365aa11365b62d23500a5deae997859846f96f4e69a589a4326f00684262de720a58560590de704ef30f94411bd3705b88b3acb498e65129ccf89716337c86e72bca42c9d94cf8f19b1a2ea48325a72642a3c6c522f8d6776e132de1565152e9e62a8e2428570b148e636771109d3b207355cc7521fc5865648b34b6385258d1cf06a85f1cb5ee1c1052e5c3920a4c5ab839dbeae3c148b33be4718e715784e71d32ea1cbd5443762fbe2a4f73bc8226743226745c1c339216fd1eaac4e1703231c28606cafccc7dde3e411b8160022dd3ea7ce17d93e0f6cae0f00b054f6ef95d818d854ef9b1f918379a0fcb433c84db05d7b8da8a7425989c277f368e6edc2f40a05a08f0651e105647343f88c0273022ff88c3d8b4a8f7505d6755054132209a4f8fc484a7df9673078b49336a4e4207bc89252ca249bdd8ccc01096fdf76dc7239e96ffbc54917caae9932dcf13a9878867c76f83845131dff88d8b9a486f374516b68a1d60fb2164425766290bf0d1e92bb64ae6ff8b0d55de6b1b4ae29754c194da9db501d6276efb24c557a351d44316089023c3137b9aa91a6a10280dd7a5cee898d4acc1e84bc9c0620e4e52bafa74e657ca5069072f6f7670242b7b1bfbb31b518f26b3755a98abc2245c2f67b0404b3021333a31577e2860e52a49ee62544fcf362178eff9e59c716f70df0cb06f920d16cc3a419401a13931080240c99fa4effadb7ed0540bca24dfbead7880d2433d3145193d200a08d3bf0f6cafb8a29069d35c0e899d554d1132f52eebfe14117cccdfb4ac0de32f9a8e4ae541c29a39f5bb01f383b116c36f6d0a8d3b82c274430266cd294907c4d67e0dc5a581141b5d613763d4bc30a4505223c772006e217d5d06cdf575169ddc9d852887bf68fbc32dd68de0f38009a7b49eac1f3714d9f7cb17bf0576b08c0f6cabae138066f228a8555859cc723474a7c035508e8113f9adbf5e72afef2a43c21673aa5add6932d70ced6a0269abadca8c126587304faab4232a076e284e9c8e5772ab4904ccc4e23cb98f569b1b99a46b88d15f646d4eaac4e83e9066f97c78028590b37a7c5f7f1b883e82abe82e647d757776eade289fa192fc9888ece25c08b0e1615a680550d2fb3d2053c4cf40c2c9735a722996a83a285232260f0c13b38ca6b204a3ea65811ea6a30a1a14f9f0ac8a063b4410a4193abcbc73b6751b7df0134b9bc2bb6df34cda8f6f400037f01ce1a95522028000185bcadc7eb9abdf24ef57621d7203e3fdf5b1ea514054f29390bc17928b02463cda81a04decd03d68385ef202c2fa302e57db1738249e4ca8982a87662764d20dd078dee15beccd3da461c044320d8326357e9d00c7125015619b92071c7fc02cd0bff26e396925226088cd3d2bb9bc532febaed0f1bb5287bcf6063f09b4c5c7670895ab8d83cfbefbfafde9ee02d1697e2af988c853b35f3f2926f002dc162d51103d70d5d4b0c21cbd1b5d55e902f9c893174c9428028dd74648bbf6aba5f106053ed88dad8bc03b5a5723b3df79377d08a7aa138178a6bf546120f63edbd530a38f5dfcc36b74a091ef1e417b2ae0055030d2ee9c298c7f29951cd47529d3a7eab89e29691479efd0408d66580e27e6ad704378720869e271dd101c291d8f5452983d3671511c33865ce2d088561de35fc211ce10c518c8d8fef44de5488f61ef810388a98fab1b500c26158e4c192bf51bab8a9037bf708707b8081e1bfb3791df9a36acda12d63b0cd82996cfd9aff8d143fa220ca8ce99e1c38380ca32b27fce3c6b2e12819245a4220ebfad808cec8c2bab2fe0d4f905c29ceecba0f568d38c2412397747d891bd36323d32d194363b45c7e242451a391283bbd6ff29e8708bfb62e8686b53a939317eea48ab070083fe41116d3da3a4f2ab85e5bcc19dd5ccfa3d481991b058c62a1efb359715360232b4722ed0a82dcb115584a0f65b33f68529b0eb84552d7bbbfd6ab0a3cb8b04e050f69614ea99f4f8081bcf0b8209c8f378be578e6aa6d12004e14840210572cc3a20b8b3eac5f2839208ee3463a078f600c4a68e0605ac629f7dc294810a15f07809393d5aa5b3611c40fa19b2083e7251be32f1540bc261c100946223921ccbedb8d8ee84d5905c35c4b0f78a72e58e76f85d512d1362863d913b92d755b070a5714ec403502db7a4e365339162fd8bea77b78bec84f87eea94b00c91c79e801bdcc2d09145fbbc872ab411fe4a05121875930ff1b133ab05cb3894babb2c862fb089c051df8040091cce5957d278ddfc2c1dd4e8abe2c1c26644841e0b725e0a508b404f30c0a08ab1c2591d2e80d2740a3d5252333ec741b3e8442bfdf5347bcf7bf04ee743bdb205855bec2a782fddefccdb873ed77a9db2f5d35d3dbd5b50274e16b40871a48b0446b1ab40f1342db26a913a7b7c1fcf1218a0e57afdb3b7203b056c6740488671768cd056f0db8ef902d8071fca1a3e0c1a165242b37f2182200876836fb51357773658cef401cb13e155f99399f854aa027090b266b8789cc96a8188434f22b75f63545168b7eaf723ac31abd228d598022160c7d7684a0fe818a04229fd694f7412c67fdc75456ab4b975a68138190182b92e0023fb975641eea3d031d0e702af9d9b73bfc54844860a96647bd5bec8647f84c5789e00d0e002233ed4b36e25bcbdfc2691ebb3c306b1156b1f450e71b252b20c1a009c4a86b86caf781f92983bf958c243dd3896118e6e82fce8d0fa0828de235f97f608927be54317504f005f1268d17c74554898f6cbfbd8c38e9e15934e20e820ee839af1a8ed5ea176b84749040ad01eba430f286cc4aa33ad5e57806bde2427d3a9c845857f755e5d6bd7e21a2cbfe21aa44d51a3a9728f3efdd04558e50f71037f717d1526a34a230a2477dd6a412d718d21dac0451744c359f8cfd108ba220c6bd254908d4844ce271d6677502e5ac3f64382b1a5e9f83322a4b75ee5e7071e8fe8359595a4adaa6d2ccbec1886156435d9cbc985de2757a74acc6245362d3ba76df268816c289559c2a9ec2bc9239b069956ca516274eee6a500c014a69dd0253717ca72c34c12d5c338a19ac027c0a623203aff5c5b6e17e4416353d9acf1667ae70e60905c74fae565a818afc488a0f7691ad7d358d51d1d32d1251c168a1d86872cedc97824ec4ac03f997afeabcfbce6d4f22e1e446e70b3a3a9181818922c5dd055547f1949f3a74498f21bdaeeda97ca5b9fc562ed10fddc7becf889e38ad634db18ffe25a78b9f501033ce5ad772a83d77511c429e2e90bb92f14e36f714922c7442a2145c5330a313bca085098a3f53cc5e0d37bd62d39cb0a90447522c958281526ef05751107c69b413b50ef2aa809acc2d5df188b9b220e332bd89bca23374bd2be2e47fd846db3a91d57e5199419542cede159c88921d19b95395e9d4e524e30ea17622326fd2c26d3180c3e11ed252c885ac180e5444c46048e3748f9cd09873c3f118a3c6f82808b91de440ce7ed329590f6ae53a7e05a94a7ac84589ca8486528843f458bbab02c55ce26df680c09017c9e636c6d998b8bc036a478fc74b15798f22d944305396d518b04f823c5fd49098460e177ec6d2364d8e12a98da1ee2274a8375cfca442208dd7bc03f498650b24115a9b93bfbf16117c4fc28a7c959d44bedaa64e81567572aab8d1d14445a721bbf89ab2f8632310ca430c019035cb88f084bb57c9956705888beda3c8e0484d272e928fc1ecc32276813ab6cbea2c9b692b54ed72e65230ac12b26c94dd98c16773c0cfe5017ca3c8617c0508286f26750a9a721f877d9c40c10104ce5b31e9c762286a8ce54b464c02cebe20284b2b6ef2f4f575b45f445dada4f3bee1bdffb6531d0e2d95795807ef83b837f0badd87f47ac3c0390ee6c2dc14b95bffeb5b598bd66ef707cde3f10740580996d70d9c7e298ab221af073bc76f068b587979cbea65698eb5bb281f4166a187f36a42e43a1c18502035d71f46dd141cef8f7fc98f0c29e6d8e1c8ef9a0c457c001dcf5870801250cbc1246868427b62184f41d943c5aa73b3a23fd85b1dd906abeed877d328530382c7a1b7a314166abdcef8fae427c49db2f7c9da3d2d618c97088d1c9b041dab91ea6a716c8839d751763f54c92ded49d9900e2256247ce64ef92f4263b4ab9171fb353d401fe70a5fb572257fafbdd2fd8457bd913c9f1b199719b7e86070a481aa36bac96bbd85e071a86409f0466a1068668ce24d7c3843311cb51f02d0f5d3316377a4504d03a3fc1d54576243e96ec5b697873c93e2ae21f3c7c24bdd56bd56497ff2300fabe5b6b306a60348b416e2e40b78796c32dec83b98d63c71e73e0e019ecd24bcca1436469b9c9a8e8a38c008f9aab2221b3e88a0d2f8759223c6383c0d08da422b93eb11f710150f74ea708f66a6abe410801bf4f9fff983e540f8900900eba28d6e39fde3b756c05d7eb850ea241e57ad0ab23aa2fa50f727fecf1bb50b690a6203425ecd877fcd2a56c53a6a941e4a2b2d5d482bafd52e5dbed206a0d5267eb848ff0ebaa701a6d68633d9cd08774794378a24fad97a0b8b09e72edc41852606492facb01da6afc3656f766ac15321f707e2078338417784ea502690be82001380157fa99367eb03258f1a83f35a49db23430333a99c0bccaa1e838b1394daba14a5b34943f715c6c76580f14b1125cf0208cb77574a089976d511821ab4dc14f1c7cb26f736d3a8ebeeb2152861bd2db9b0467662f7203d592112c88b390fce912536ed3859252532f38fd8266aedc855b98804c2ba57fbdab772370d3233f2a2b3c9b6b4c204a338cabfa84bce5eb0c574151133fe0322ca8871e0ac2694d9a6f5e88a0db4a4ef40325ab492c77afed0d1720c35edff5b1ab49ec3301531cee024e0d7058c8c68ef05e4033b80b49bee4f27ed1a3706af7de0598fd9c02edbdbd4b925e65a2527dd0a7424f2bef7fd08f77438a68461b5eb619ad0d558d23020f655f3cf2b2f50eb7d05c259880c01eab85e177255da3cbb16376f48573f451e4af5d7c22c79a5278262ac1d55235f0519ab7790064acb938bb666a8cc4a3e245cca6402c72edcb240cc426391e1919dfcac9127b82172c648088d3ac678c478c8d28e046d6dca526b95b34809213ef20004fc8e3252184d71b84852ca5b6e8acfad62de1f41938e922a9d4452078ee8bca13a0755e620d116cf7d1ecfe1cc05877b0cd7030264f258c2e9803d6d24e9cf620c5cca43823afa2b3bc9a6652fec6f392c852e9b2024a98408a8638484f95a6312a6a95e33659f819d73e2f7b5a6555765227e1b2d4c8858fc71abc494b538df814342a6bd18273c8b9f92de7c594b9be5f609e3e2e5949f09a40b20b3d4bc0cbf09ee1267cdbc421fb1b6abaa572d3ffa54d19c9cef72faa2ce7100c538482c5f36d6dbca11e6146a5a610a48b823bc0a8b3cbd5a5ed832e1a67343c9b356c19ce159c5fa73233e56407dc4920d977255b364cc28db02b8de194eb2f1ea6bba68282b6be4215947500be4df37e5ef157a2db1b4e119c80245b0f241f19b475261a6ab18ec510184c06a93dcaee125edd9eabb51c1e31a1e50f1bfe1825ddc27ac9f3ed0297948cc1b8ba31b8660f437d93aa2fad99263546e2f259535b88f4d9c03c423da6a0ce2e7d2af0bded8c89d2e183981469a573de031531a704d5066a3285dee3366a1a5810eb48ad5d5e10c5eef56508301fe79055e038351c8235f9059c0e3eea1bd42524425b77800b45f0c3e3ed3a3f277770bce8a8a0ca3ac513830b8ee6e307e091064554f8f18937d8fc665c1552a17f0eceb0803531191b2996bbbaae509bfaa46ae97d58c18bb3a1b84a7394a41a01e1ac2b9b5d0588ed4e5c606c336c467ce2bc08bd8d509bc622b4ef78c00d80860a6c606f16237ec04850fb2161ae1427692928db52ddc7262f3368e18568e7b801c521baf01f3d90a5a422bc9b18aac6529484854167c007ecda89a105ed858e19ee8e7240c8b0eee39fae23e9a1d1a1313fb95622ba9ac3619bcd0c4973e7b8157448a171049a5f878c1f9632398044a19a293cf538759db9338379dd5952c1c922363bc9bcbf3f63bc2a9fccaa342a3af70937310beab9e270b6374b947f1749102e12a105965f0ffffe400346d60413dda5dd78a7115c0b844168941ca1c0531710c6a1883c408b36ff577835a087a4122bd9cac637af98f6c32ac3109a9df1045428425c92a540109bf385dae5cf04730f9c9dd4a70c8ca06c580c435ff631c888c036cd493e18fa1b630e6c2aaf3e8046cdb5a4b1a87433dfb15be0375fbcf23acc8fa0608b8e6dff04e6989e60df0126050753503726d85b96d16d87050cbbd011b2037075f44555731e600abfec822bc282a016079da030bceca71f588e3fabdff7cdb02a0907c3136d8a79823d70a297d9752228e51a6de729123425cf746774cb4684484f0ea21033b4c596cc855d57d655abcfef8c1d9f9588f23cd48c7c0829f0dbb6bdddde3af6f3c8eacb425f27c1b1be4cd1ebff49e91007ffa41813eb327ad9456d980af72a4f5b2f2de7c79268f83b49dc6a478dc707e6b4570c075e862bec4fbd99a7626904a46e9556ccde41fe9d9721069bd21311504617b2d31b14fe7a521b961846923c2807900f2fa93c2a60ff6c41375836beac4ed6a56aac91a96e4a3c929237016636371b1862b41e220993aa1c047423f049ad73ce0dcc581101bddf9344367091270846475579174e9120020934b016b99eed7b690bb313e6676140204711476f178d57d6ea8b428f80940e610e6a9252a48f45ba1310318ce4007feab53af2489aae76bc5f027d3e53d19d95a344726e5f82a6db3f3a9b1584ccded45b36d41aad9e1b4dd57e504b11c1b55c7077a715e9a9b0b8eb321c709227da898bd7d8b207cf012fd20e7dfe452a581536e1bddd3fd21719b1aaca3ac5acdd55902d79244205517eab0e7043954993ac3164161e7e9348193724d5b9ff0f9f136bc15b80113e52aea20af1fccbbe310e9b64d207927c14e24e80a19de8abd51bb05ac64163f922b1e760667dd424e75f43c37ffb715f3fed33d771bee00ae99ac7baf7e18a281197cda00d0ab04fb91458da47b11c1e5f2a9b95341f25bfedd8fa5d838443920052ef7ef92e2fdfdb0c41d7b3d65984c25731cdc2dbfc825c882a1208b65bc54d0ae2413c3626cc294b0589b38a559ec269e9226bed24cb4924d30a583c940b3e16c34d69154e65010bd42b0bab5ee9a9bcc812f9e9470f43f260cfe73a5e59d1a5a5cad95dfac83d57abb0cb55228e1e029297659e7f5ff24bdecd812fe89402854c05caa2912da0d9204ce6f0b3133ad5eb82777576e904a41d42e0dd2ef344562239cf8e1b6f36a3ea4c6df0fdf85c979543bd5a2bfc9192e1c7a32d0e64e956dc4402d7f2ef2edfcd170bc2b54fd004aa75ab774b52653b10b946a7b5bdd006ff395d07d78cb5eb41c29e158302bd81c0a9e79119010cde9d7837745f6aff9a150dc5ccc3422897398d0d31588a255a1327e655aebebbf44c452444e89ff9e648834c36f75ad486d4068efbe0241ca7d1eb8a91a6ce89f40cee7209db3d4f792fd089b9706e751012fdeaadb22a41bc99a440028af10f7e7a44be8d41e38d610186c4a8ddee8f70cc51062ec7c7d37183336b0ed86f02d67dfc8d392b01a652bd8fc60174fb064d5e592d01009a1217d80311c5028a7a7efb474ef2afdf499239373e2ad85827634d822c3135cb9a2223f244633f4c7a9797e9bfd75f07c64c076b67ab59b3c6ff1ee601b4d3fa7bb4129f9ff1108712afc1356e403a55b0aa56e0c3c63c3346c37ac67526c69b5a10ac6e782268bd52ab7798f24d94a1e4b2648ab7d00a7ceba0dd583987b8ed52f2c3ec4dbfd225af61231b309952cefbe16eb9bb1f5fa7ce969d1c3722cd0acad2a1e286e718cd3079bf846f921eea471152a31abb08a184ae5e18b4528e77bb6980bfee32d28dc35434601ebc1b610536e8f76117200cae327ccf177948f985d3e2711840676207433128522102e98e7f9a9bc1776f0d4a5dc973cb900e090baf1219a7646ec0dd37ef2e4766b7245d4a10156e62b04dbe97e309e1c0ea813049d359924e2bc2af7bcb7fad96cd79faa33c0d1990ad4fcdb67d3188e86ea32cb475eae66b3c710744d1e516b88e11540ac8ab30169457753e4d6161adee6029f65567bc90e2ebccebd3724da36e8c4c5f4111660d2ebb103586953d78d8a21be466f7fcdf46ff3e0b2e5bddfc34bb78f3ca5a7942bf792107161eb2470c0f614047c518449816e277df33445b0b397ec6ae07ac10413fad6f9f3c1ab6be1e5439f611e532f8bf6328649a268e950b36898596d93f770a13fa65f84514539a75a970c4267f5c7518ac57a9537cf203da00dcb25d4d10bb335ea3890b1973a69bfa9ab28b5a43b300c603ee96824dd1068103a168ad1ef8dc44de5cc85ae8907b6c0a96f02edfec5b9ad4f03ad6cd58b2fe4571c454766745e72c9e1359be86e596403bd63e38863886e03c750c31f4398ae3a85930df9f2ee82e64bf024bbe842adab8387fccf9bd4be1de680f18096c69703de1b5f4b0eea54bef90fa128017534eafef89481317920df58e281fc4101f140bebceba17187a14c2bc1175c200af2418c1e05f9c2fe28c80f182f7237eac51d4823e9ad06b299413e0dc820dfcc510fe1df2680cd243c6462da1a782768cd7cd541d545b9340b69a6cf86a97a7d8288673d6b6248b6a485702c3dd01a35099723b4cdd8588887a3395f183de3cb2ea4d658cf9c3501d6faf8142b885bcb098390f610b3dfc7194b9facd97400b06b78c347d8f80ec256ca28a19a1986bcb94916e2117894c077adfb242267bc7b412101dfb4ae945cc8a0566adf5ff4319f15bd4508c9bb16c79c9e1f94defafa158bd2f855010b6cb7c3084a4babfd51d0078096f06018e7a8e8e03778a70380c99a0a1903b65d1bdfb03f987ba659810863b1d0945c5903ceff4ba11b5277bb3995dde8c8040e9951fb199c815c749ecba769df5b48a836443a5a6ad63cd1e95ac0241144385c421590945a6c14210ece5103b2349deb1ab56efa4b883a40546a0624a1580d2adf873f0bf7cc095598da0f55716e8e2fdf5fa5fa34ec6bf63e25b0afd9760d93ba6caeedc09c5c1957b2605fc3d3c9ea0737ded770b9197ac43483c21fa880040fd2bcafb9da81119dd3140bcd32b7a426e96b2ea7a451f09f1f9a6c70f754cb673aaae81d76704be625ea46bcaf219587f0be666f528ff7355b6e6e08a8c07262a63251c1121ce0760206b8bcaf895780a2fb8e93f5e6fd1a25c3a1c0a23dbd9fe84db132d991bec638dcc1fb1abd2fec0ee6afe801d80add7c600349fed88ee8283347e3d1586688ba0c2a74c65bd7ce429edb313f0f4029d56be052a992cb19a4785f73f573fbff19e12ca293b0a9990ae81f1cb16e0428a1e120a98070c492d5cc77bfa8521d6121c288f5e90a1e16e035e99732a87d5eb9fa936270691f458f13800e739226007a052539a0f2b015747dfbcd319a0d7dfaa4630551e153a09f5fd23f2a75a32c73e65fddd784be80dac2af02ee1c8f49fd26865fdf0c0c7cf9504d79ab52ab205a7efaeb91ffccd2d31854edc0753b360f3962a51f98f38e68d98881bbca7e935f0450b28f2496de588851c5631b826a1054d312802ec5caaf1c6176343c9127f9029dde67a9bf89269a6786b58f7c408dcfeeddee7bdbf8a08005c353f980b452b117ad627fa9aab25607660e304b676f1c975d63789857194bf2d49b60d4a598ff77140f23001da7fcf84ef451d1093f549a9d0a53dfb868d253af16d730334f34ed08fde5e14b83328974f221e27a4d176a1572c96842e833a7e931d3c8e61d2f1494a6e6683c0e1f1b8c40530923da24c7ba33c731a7e033cefecb3f921bccdac1359d07a69898c09313541e748ac236b75c398199ec484b6c316d8ec4a73a38606031a964fbf27c32c201c0b4f8e052a642c306cc184d2a8fe00634daf9290ab08eec6d2e10da696a5fdc1246109e8f0bbf2bd87533286c6676b8f4c154b8443e6a9082ecaa2aac6df78c308436bed7a33b06c967646616a3d2f6a16d1d4970ed92149f711d1fb7383ab1294f650903b9f5f459e7bea9769120ef1e91fd8f4d31f3f77ed0506ab67d44986e5f0dc621e1e883f1bd1391309a8e3275da33185f7737fbde361d1a61dd04c9896b361dc295d94fec348461da7109c8d4453dd02b7df558811a0dc796fbec129d35ad7c1009f570f13cd3134d082170f8611c44ce510225e16a3ed7235d48d0f3654b91d7995d143437ace8521873af573e604cae31eb43241b87bd520a7b251c92829d46d8682c367a2a0961c47e4e719b7e3d50ce46db08849ec711a208c324099e7353050ad54be9e0ac78cb2fe0d9ee0e98cf5970975101cf13984c15ab37decb55cbd349a802c3f2b295fc199cb28e6f16c4a268e71e2f3d6cca0779643f8ebc65308d1800c8a4baa35b9a1eddf455dd630ff64afa229cba83d091a1eba3b62c0dd0b52e0dd09416d70755e78b863897f1b28aea356d403ab9768b759aeb7814c3e9d17ab01be2f7976f04a3a2d87fc24b925b901b093936379da51a2846037a6e5b6fd164ed7111fda5b82960348692d856fe84091e97a8c52aa11244946b81943601f5f20048001a3c8da82c623166a9d1fc5ee56683e1f525601bb00ba2206c04a3030da206e3f59fa0058fa8d37a54a3803554f1ccc650dccc7e0501d72d107ade7f83c636a75bb8f7a7fb1a9d35bd05e276401e90a516dbfede62caac9f74c2542481ea69cbbdf1608051f657ecf312bffa16c0c0f59d49fa4633a2889dfb2169fefa574e3444ac2692c5588324683548be2eeaa37d72553ff1c6c962b34d4b470c7e08652288c6e25bf93e62149714846d690941419ad236722d91304f3bbba407ee2458bd8e032dccd652a752da33f0cd57650cb3f89d267fec639882098c9ec470309406332f360ccc220329510e7a30df3ad52e5d156b86e2f65ba1f371654d6235bfad6ffae1ca01361c119fceb75ead402548cd45934812c6c7ce81b37f12337cd4284ebe92878df96269e6a371780bfc33b196fa4c353579e8e82573c8d3f907639593cfbc0c321e5ac40c57a9447d0a5bf851663fb3b38f8bf23704fd3499ce41610c7d6957071f223d0d5b34b5726f106df340085dc2fd0b1d499318451fedbd4636cdb721275c7a9e26db6e3342f91b6ab28186040317f835782b035cead3c3afade2a6b0a9a7ade9a9760be0001a66b45d2c412aec768f84d37b2013000534ca0dfee1f4905513a9da2b395c9a22da85d68b05de232a60ead50b9ef621713783b15ea983a11ee22ea527ccc3e633e5ace831c7f480cdf5a49cf7d5c99fa94ac1a8833ed8cd07ea80a2b720aeb10b22c939a09eca1f1ea8ffb66c8bb196d58c734ec3ff5491e9ec29a2b10a1cd62da432f2e6799b3632e299ae7e5a29dedceaf291dc7dd50b7db755035232f4c740d9dfda0232133f18ec2107d28685d147d03eb4137f0dc7ec2e4006047bce9224c329f9b3d14b3cab8eae890f2df3e87a99d0702012106914303473f08f20ff3f862ade431f69059dc1d5398503071578cf67fc393e1a194cbe9d72d03de98144af32959e52ea2f34104295cd4d729c3ed5b088981e470d3383891e4fbccde1f0684bf75e7ea580ec01f74320f5300f7052814b7bbedcaa45193b9890a82503a78be82303b989d090511df17056d9106d3d9d097c2121ca4e4a3270939f88bc6b2f99f6c48d1e4631d04a54e19bd6019fb773244022448eb9c6dcc78017e1f7067230e82f87d59c26e298ea33fb92813dd9701b850eb15838ba9113f752a1c4d19b2bc8f4d460f5cddcbf8f0de2fbb84219ad18dfbd9a97353c28ca9ea8872f0d97939cee51dd562e08af191b73ff720bf969b33c25d5c03209beb8aff3a4556a3168d43dcf9234b423d24903a53a2bc2d5741d4fba084456986144a139454ee6dd252693fa080c6e8a636106e90ae75d5c81b0d89c3783359f9c7d6935a77089d2e6682199c4fcd69ba2a842173227d0c364cdca4525dee08f54e676eedd001ba160dac346f311d08d46e64295e8ec2ab4e1e19eb32517be777c46f5f9c0f80a4776fc03d22fe09527fd755603a317696bd087eb9861ccd46cf855172ff01ef66904025179cbab383e9636356441809ad9b8910a010382714a296669ec1834964282a170c00245e0ccc950519f7a5817e35b8e823c2a3b3c085a541c11db1efc4cdb1a87be4e3276eb954be534eed0513b18637a8dcac358091b44982a867d17621ee0de904707ca462050b167aa35318f16ec8aef1ecf55b1f7dd0482956be7ff5d83f3d2d1706989857851a64840801be81358a5d5bcf0750423188ef0eaf6851a379a7fc725bcec408e702541dd1bf8df6aaddee784cde5a4b2e50c528dfef48e832984ed2ded88ff8a0f47dacfddbcaa3981c976a2082d673c1e24cfb11d170dfa37e8972ccbb2e51c6f57d34e9f79ac841fe7be11fcd2e974849c11ba28f0704ca8350217bd654ed70162c7dbf6246f1f4929d306c3a8812d1e8af30001299d7e7a03cf860a018bca5bb048e2acecb21c93536ab383b4033d45912a88dd78da2e85b5615969e388e1f007233fc058532f6ac396983b439b3cebc788d08da53dfa9babd8dae6294166b54bb21a7620aa3b457cf5dea2f56ef217afd0f32fb8aedd2903268c4370ecd23ada131439d0b7271c2385ac7f10864e440956b8cb6de00bee6150fb16d2495abaa61aafab3e215c9b6055d424663d018a11a870691ec5f352305b832ef8018fd89c19bb75b386eed17d00ed0f4c0d845a36995a0876d4645422121506a5ba9513f7ba86c6e6ec5ccd0eb59133959bde1c8a963b27122780d9650775614b5a683959d332d67340472d2deabce459170c96accca27d133c6032e6a8f83ebe320119d77a31db32be0ba2793d01a5af67a6964086e729949587e506823c0c5a8cf29754b638fa921f80c0f11f07fe47e932892933e9305508be839bb1617337d1146c0acaa2e0045629afa2f41c6171fd505dd955317ef94a0cfbcf61ad00ccddbedf40f5fcb22226db737455f951f352ba49d950020368813327d6f0c7c0116f02c475cf29fe747c2ce223ca013ef06bcb8e0446cc0eac3c7d0ea6d065c2f77486968f56cf7b778d5216b430ac8d07454a82ca163256bb22ed0a4ff9d07af22eeb5a50968690c7a1652453a734b489e940763f256a42828dff22fdc1e7142df0933a1510d4a793bc69ed1b860fa9b2dee984823a2986dd872eda8cf9b2e9d91cfa5df73ae29947da43ee0fa1a0f890c4c49148c9d780a0b2bffd1dd8569c230716ebad859ca4c081502df6cd8770c10a5c759d6fad879941eada6d2a476f83158bb8ef22a5440ab6664929b9b35f1f8e45e82e4b73e3b2e7f7fb90864c7091fcc749bbb1c240349d1a084d70dd148b3503a40ba7812b1f3481bfe7f03c39fc4781c918d96fd25de21b95f84e0e070540f845d9410f9fd2441177e3639125ec1bffe226e4866895bf2a8d2e6d7d8dddadf5e849758f35588acc36d78e51e2f3e5e63760b439b35bc5b69095647c71dca72eab700b7a430ca2009f31d0b7f4bc04e165529fb9c5351adafd9e19f417aab82ab31a33615aaef5e0192005c65fb4d7a8c31d4d4510ac6da922b394697c5da025ef4cd2a3d312904ef87f63fba6d192f29888425a3d7e0789e3eb1eb8a5a79dcffdc177c3d351c37310cf41186bc2fee49e9f2b34651264a3a78eaa50c66b320f8ffcc644b51bcb00da4b895239697929cb6f954e785265ab0b66e2d7dd28c29486227891a710ea475c893dffe0cebcdb088fddc6433e95d94ae0f22b99cd0d3350f341d580cd2d6f60f6370af8baec4d6c2c3134698e06ea06610a3cacb32ff57c4cb55e964b01ebb4f5b2093f1996aac84f645a3af2c0fa59fd9444b77d599d97ee32e387c802dc53279516e5c557658615fa2f9e18075c1de7577376c818425571c101c3cdbd3ee198da84e5ec183a0792c5d640e8d0fa62692d6260316263b05fac660d0a02ebd604b7de9a60d65d12dcfa652218fbf603d47df071eec284e00c5ca696683c566a7e4e0d8f07cd6f879a36be73c73e36f777b9612b4ee4d0aa53b4b90cef05727f29402c2c42ba56cae2aa7a00a81a24d816a9af0f4b03b99571fedf9f93eb578834fe48bd378a3d123a8c2861249cb0ee757ef381abf645fa5467044dd1b30f3f0b92d95d54627615df80175b3c82a80f487616e20529943ea0907d021b0505a6c837a10f99f283f5ac133c4b6f0f40610802a216924bc36f767fd34279ae28a71bd9cd4f67ab6f44ca18459e6d3b422ffb995d75e515be19a766c9f4c8707b4211ca1501bc958d0255de82b9a5a4544727f30509bd22ce70f3578e0c1292fe8fec8894934c17bb9dc5d15f77a28d175fa7bd0d4b342c2f0ab4c98be30d4dd5708a154ca047457d15c4d48c7fd2ee103b86b1df2264c341a48681aa330ffaf4f5cff6407f32cb1f0355af1aecb3017f1004848bf2df4724bde916b462ebe2cb85014fdb2623fad747ca8d98d7784b8f6779e1424907cd1eff607e71d23b6d15f382634c66869581543c02d85a051fe1af9092e767e7e0a64590abe20cf408aae3c0886c471623f875dce8f0ac464887559512c33a875252a7fef85e19b1fb9dfd47121de033886806179066debfa323373c7fef87a2e546e00757ce0a63fe4dd2fa5822c7523e49e61113d4d4adeb05b507171a1924d19d6c5d65a69c6541bdcac7a0f31448dffc03894ffc9399ccc3a1a15785bd1070a31b6ed0fb554eaa0f2cb19fc4295c8304ee54842a0e571040ea6ad201444ee2f0c8a2d8df610d4033f0294203f706008141a70e761a89f2f4031bd8d802b94ca249f5cdff6bee28a6ea3fcbdaa9ae054e6f90a013d9cf680299b24041d68beaa5caf57f3e5a5bb3841042b69432440eff0d870d457caf7c99be447c87f80af1b5f20de20bc4b7ca77e9fbc3d7872f95ef946f0f5f1ebe52be4adf1dbe3a7ca37ca17c73f8e2f07df24dfadef0b5e1ebe49bfbd6f0a5e1fbc96519e97bf4fdac628b66f87e8ed92226dff7eb4808ce84e678cd1be933d01cbf71bec18f688e6d70567346a2396ee3ecc6b909cd311be7aa330d34c76b9c6b70ae81e6588d739a738ee6188d731a672734c7679ca9ce36d01c977136e37c03cd310dce68ce4934c7639cc9383fa13916e3bc3be340731cc67906e71c688e65703e738642730cc63906e72834c75f9ca7ce3ad01c7b7186c179079ae3179ccd9c95688ecb9c5d70964273dcc559eacc03cd3117e7169c7ba03966c199cc790acdf198f316672a34c75a9ca3ce3ed01c67715ec1f9079ae32bce589c97688eab385b71ae42732ce60c750682e638cc5905e720688e53700673b64273ece5fce52c04cd311567dd79089ae329ce28381341737c82b31467269ae328ce26385fa1392ec1f9e95c04cdf19573116723688e8938339d8fa03916e23cc419099ae320ce56ce49d01c57390371c64273fcc379e99c85e698cad987b3169ae31ece53ce24a0399672e6e1ac04cdf10e67a5f3169ae328671dce4d34c7399ca19c97a0397e72c6e1cc04cdf10de7a4b313cdb193b30d672e34c7359c73e726688e9b9c69383b41734767a473179a63f21964f8be928821d0dd2111bc08dd1d02c16f747728860f9c88ee0ec1e081175c68e141e8ee500738b00116ee83ee0ead701034a0420630f019dd1dba8005ee01dd1daac03ba0bb431498c077d0dda114ce01dd1d92400420f0d3dda1075c07dd1d7240031e447787187020ba3b84c202962840c95002de4377874eb809434910708021030c15a004020c00c95b747788848f70440401e086ea1be93baff96e009edf00d584671b846e88e736c4aad5998d15d780755e83c53aa7699dd568711aae331a2ed799ea753ee3f53a9b61732ec3c6e68ce6e64c839b9b3319e3798c713cef70ce62e0e09c6790730e2327e77c46e72c031d9d730c76ce60ecec9ca778ce5ff0f09c61d073f6a287cdf89c5fe0e3737601ec5c06063b4bfd9cbbf8f939b700c7990b1c38ce64626716c462e72d80ce638080ce5141672d8282ce2bc871ce22478e33163ace57e8d071b6e2e72afe33143d8ba1f4ac02f21c8624cf603838a780030ece5f769cbdecd871d6099da910123aa3a083f3141d747096c283f3093cf0e06c02d9390a99ecfc343b9760363b17c1e37c85078f33d30767223ef8e03c448fb3103d7a9cad0c9d83181a3a0301c2b90a08209c977c9c7ff0e1e3ec03ed4c85463b4ff971eee1c78f330f40ce528000392b0539ef1024c8590721e72842849ca10c39e73064c81987daf949ad764eb29d6fb0d9ce36109d9d10119d7344ce35102172a681ee0eb99d9bdc6e67a4223f2a52e433d0dd21219c09056b085e0d614c1562781615dfba0d75fd86be3e529be3d09be7d0f13a14e73b34e73c54e73d74e73e94e730daf31fea731c14f618fd3910c5f1201a7b0e0a741d34e8a7398ea3465e69004ea98e93f4e780d2efa0e4852807ef80eeb80754e832dac167d483f3a0b27f4067ef41797c887e7010688ffba043a75110fe83fa38104a7b10fae34228900fa1415ea3426ea3434e446b27426dbf51a217a1441e02bd5d00b45e048afb112a808f40453809f4c891d0113e004ac2094091bc043a80178012e006a025fc00b400470035c093d003dc048a809f40933c01d4842ba1275c0134015f42957c01540147812e3903e802de008ac21d4019f007d0061c02d4018f007dc0254021f01468043e012a815380a6f00ad009dc029402bf00adc031402df00cd00b5c058a816b8066e02555e12b500d9c055a7e0374857380b2f00ed00dbc05ca81bb403bf017680bf70075e130d017fe01ea81c740613808e8072e021ac38be8b8437d005018143da4cf4ff410115019eed119b543524fd0c501806e2da25c8dbae06248f7907e08b45c15a1254e0848d615a30c375afe10a12525a2e5cc46cb1f355a121942cbf52284965b45105aee1820b4dc32b514cb058346cb1dc3072d170d1068b96d0cd1929bf4a0253ff980962c85072db9ca8c967c45464bd6e2012d994b07b4e4288468c95e6a297215b514794c2d452e534bb164304e4b1e43072d198d1cb4e4368268d94d8068d94f62b46c293868d9557e68d95760b46c2d3eb46c2e3d657ba9a55876153ab4ec31656a29960d462dc5b2d1a8a558761bb514cbd9a49662399fd4522ca7943aabd4522ce795726ae112452dc5e9650190f49b278af80900bc3fee2d8457979737385bc45d789c78e9534bb1889d086ae2a50eba45dc841097971eccb688b90c39bdf4f1638bd86908132f6d44b6889900c0122f0350b7889708d3f472c5d4522ce2a62cb6bc5c2d4cd822dec285122fb70b066c112be105095eee1713d8222641185a5eae181ad822d6524696977b462dc522ceb2069697cb4608b688b1bc91c4cb5dd3648b38092748bce41b9e6c112311e58897bc83942de223a818f1927fa8b2456c841045bc6422ae6c111781c495978c45cb16f19526a697cc04972d62a6278878c92588628b9888298678c95478d9221e228c102f594c155bc4426461e5256b31668bd80a1741bce42eca6c1107e105102ff90b30b6888108a3ca4b16638c2de22a652cbde433d0d8225e5ae38797cc06b7b145fcc31b3ebce4354db6887d7042e565dff0648b984a94292f7b07295bc453a8f4f0b27fa8b245dc83103cbc6c228a980724a4bc6c2c5ab688a53429bd6c26b86c112b3db1c3cb2e41145bc43b4ca1c3cba6c2cb16b10e61a2bc6c31556c1147c902cacbd662cc1631142e7278d95d94d922cec10b1c5ef617606c11e310c693972dc6185bc44fca487ad9671471d21a37bc6c36ba8d2de21bdeb0e165af69b2456c8313272fe70d4fb6889d44c9bd9c3b48d922ce51a9e1e5fca1ca16710d42d0f0721271658b9806249abc9c58b46c11376962a49793092e5bc4484f1cbd9c2588628b8ea698e1e5a4c2cb16cd1086c9cb29a68a2d629285d1cba9c5982d327a73318297b38b325b3482173908c872bc3d06b28411f907c8f24487812c65b67b802c69b5bf40964443ee0259ae4ec85b20cb850af20e90e546013907c872a57e7c0364b953b4b34096bbf3f115c872a9407849965b35740d902523f5b80a64c9491f3c0364c94a3c8e01b2e4a5d92f4096cc24bb05c892b378f00a90253b75700a90253f097d0264c9ba1d4f812c198a834b802c398a7c04c892a5e82140963cf53f802c79a7e30e204ba6caf106902557059d0164d9484047812c3b29f60590652be1f812b2eca59f2b802c9b09762564d9597c9e00b26ca79e9f4096fdc47313c8b2753b4f42960da57304906547e5fc0064d9520620cb9e1a5f00b2ecddcd4b20cba622005976552dc50190e544aaa588842c67522d4512c8722a8d409673a996e2915214812c054096d309578a952ca7ce08594ea80090e58caa5c8b48008450e44684ee0e11d9e8ee506d88902040e8eed00fba3b44a3bb433e280848953fd4e3031eb32c952ff3e0a9f23bd055bed08ea8cae740aaf2497aaacad7912328a9f281942a3f86e307e6f354f93dbacae781aafc9da8cad7c9c1d955fe4855f9375d55f9362f576ba9f2594c95bf129de653655d657ee2e6b5eae2c383e3848ea09f263c10a25c7c0ccd9c6c437e301100001059424c182f4d5a6451c5962eb818a3c4175e942181186180a1e58c32c6c8c2c61a6860d935fbc6b691c40d4e9a20b143942747fc40458a11440851a5082c485cb9c2449316a6123cc185082aa68862083161bc08a145165558e9828b31417ce1451920c408038c2a679431c6121b6ba0f103afe137b80d1f6e70d284ca0e519e4cf9818a941e8810a20a0f5890b8228589262d4a257882cb0e544c11850e62c27889a245165540e9828b31397ce145191cc408038c2767943146121b6ba07143afe937ba0d1b6e70d2c4c90e519ee47ea022a5062284a842031624ae3461a2494b099e38a2628a282a7f063161bc543e132db2a8a2f28dbae0624ce58fe08b20e5f4624839cbd4291b8e42d0473b66d88fb86a27f8cbcca5d500a8ad656666b652bb6b734e4de6335abba30475b5b3d43035d852374c1a3375a7ea8659e38aea29ed8dc1d8213e4fe5b4313e4d5bbf218512d28d0ab6b0420909d73a24249cf89db63986cc1660702c1d9e70c4f9bcef2bcd1b6c6081846b2a2424dc246fce4761320eb214ff43c2c812e643f690a5ec63aafc1db2a4f197a5b212140e597e4923597e4a959bd0e16ec8f29bda55ce89fae10c128eef2d4df0a96b4cd3b6381bb25ca817592ab9c8f2736a91e5079504327d542cb2fca42a7f5122597ebaa5a7ca1f5265afaab29412597a53200e065bd05a3104a737655ccb9d1a72c19540350cc38b2118144cd5f04c0d411136069432a09075bd9461a5def40cedda59df44238d74b882915fcee07dced0a56dcaa3ea3403528541ecdd090dc445783a1963a9ae9730b0a83dea7ad9a1a9e2b4fdec6c5ef659655deb3ac796f5e8dace105cab188c403d9b7fc172a8183d10377766ea7a09c34c0552d78b1867aa6cb6b7ee061ccbf7ddd947b6dad52d6b594e0de3eb8659419aa8a982d6ee083faf57202806525d2f3358aa1fd4f512069a2a760d0beb737aafcff5896751fc8ebcdffa58e2f708002b28f6effdfbcaf57dc5df57c11004c1af7ab939d39ac9b4a2a2c42adc93c53e3c28d8b55aedccc3a95e072a7f7e45d70381f845f5d821eea8a5ac02892e18ec9f4d7c603826812b9e42356d30182bb12c9cdee776ed2343f19b3bd1b5f2668f2523106c7566aa944ded107f99b6d5e81d792d9719d90ea191c9643debf770b1c4a6a262e4af5a62d8023fafd56af1b071cd8ec289416ba7cd6b91650b9f78ef4e4270d7c92e59b61092bbb39561fc77271ef9817c27dec33bf93e64486954cbfd06d91fe511b9fb638ffb4ae05a8258dbe8bb3867fc914d7d8fdcd91b839b39d5b53d777777ef76a9cb74b1a86da4cd58915925f1b442628565c5c5aa8b5517ab2871b52a2335963bab2e562d5821b16ac1aa051b5f29031212528501e67a5512bceabdfcc8b2ebd6f01f02407205efd31369692401c97a6831ae9734b2d41296c6522d451890ac472c09eb5b953412eef571da5a2ed65d346703118ef52411f77a91aeb368eb46a6abb610a4eeab8415a32e8925e6dd6875b810b01e8256cdf366ffde9737b66492d63df284c57947627f66b43c1c1ebc82025b118b71bda051e5058d2aa24155fb2e34a6d41206d4481e9dffe800bc4fd657a2f87d8db06f91ac1b9932d46f258ae20a31ccbad7a9fb2ac183ba249610d43c6ff65cb3c6f3bc5db306c7f23c0f0bebfb5a1200dc546aedbfdd6dcd9d936b9e377bae5953a45fe0ba6bd6d4eddd86a14b08405d722ed1da1d2ed64132a604045f2d2546ab873fc21de18e70ebb5e74d6f8a710a2a2ace98a24207af8c1ad0ac90d0a0d1a1d9a971d19509c69efd7993e5e4650da89d87b4c6ce73aa419287eb7fde9c426226090c22c045b83e808bcc6341a67937d3e4c878515e72583079c99131a3bc38c99131c2aa8ce57891ca6ec218cb7f545442784c5ed248a1c51421d5144e5358a06b290ce9a66cd8222a77064cb872f274669c9cc01973064737c6cc541ae3860b698b1eb4b0c0a001868329306a38313dbd94c0a8e1821f72a6743674a1baa1044ebcec20eab050d3544b534ca01314af296e90a698483a1ba8a250e25b20a420259a32963415bae6553e0b519519a6632f6740e57a6ab9543338c38d5ab2156f365f84ae8dd548a7003a89475fe720e3a529647d9b9677f63d6c912b9c0e7cb31508c4902af15824ef906f045ef56226b8de3a0aaed651d80341195dd82af1bbab47b8235cbf45969c637d9cb3d677ce5640398c2e6c555ddc37c2519d37325b7471ac9ea1ce7bb4f44a08c29a9fd57b48b9e99b737a2f1b918ca1e7fc5440446ba7ad69f5aac41bf22961242424249277e6792dae6893f7791e7f9ee7a190d4e402515d018659c3cbead100c49325e756b7a1c905a20ac3fc314557835febd4efadd0c52f04ccfa6a8aa1c339a7f8d984640c5d3ff01e10ab823696ead76287a57750247765a5870023ef1b0093ef55c23755d046529d241c55efe2cb005d67f896188a3fc8f528e4990315ad90bf01784848bcb26f043134d8b35ff35e187e1b8c37c9f2dbb9038371eb71c297234823e18b197e1d01578db96976fb6b827718c4da2db4ccdb5d6fff7920f8811ff881dfb7f776c5edbaf7da585a892bf14964edec63c5208aab95b8c44a5c893788a1189ae0c4f33caf82a128d65a21fdeaac226d56cde1c018d2ae9e8713698f9eb5ec03e7d7bc9f8dc7ec8171674c8138673458892b11058d438566f4ea7a29430665a08029c30b199451f61dae31b53cadcdb4429b2f18c753f834674de3e2d8b91e7f7e21f97945b07ad63004c1e9bd59a9c330a977c8fb98702cd50e95d61686496152984446a0cedf2319f4e65cfa8a5a41eb53739b1eba3d4fdca1bd0e7187dd29848b042f35c650cd6b06a398a6f534b2c83033b6be401ad1987a418d393f54f12ae322a38c30621033cf04328f0503fab9f1d945070e3926f7f6f424836794d20ac36233467ecf399b25c5c8ef3977ce5d01d16a2af2bdde39d362e47be7a5aec120d6498a372818b7ae949177a5571704cb4001538930cf3535831cc65851066e9f0335b61095015754d9e2090e55aeb8822be7d4919637a8a001145344210316e0b8ad54fe54b3378f03b2bac2eaabf314ab43727ec582ac7a73d732724ed17966379673aa95909090a4e0f8ae325b9b514461a6f65d527b9bd5be0b8bb64ddd9cf15dba699b512ea8da3b7c68628922a42859e105d741d4be4b69da8e505046171ec030b146066fe0faaea5ae3510d3c66e3431c68a0f3090e209aeefcad2b5aee2d4c5f5d4b5be4b8aae896d6c6d5eb9a2a646b537336d9b597ad6676abf55656b138895f181b052fbacaa699b5373c69f42aa4cd3660216bb25a28401d3450b70ed346d47438c49f3060c5ef0459a3670fd43edb774d356012d2c285366091e6e2802d76f4175ad7db0853828ada5bdd15ab2a4a87d56145b9b4d5666a56d33a967fc661d51fbac345d13a9d2d43e6bd7b5a652fbaca969435285861a24a145145cc4c0f594da47507c81822d6a306306543081eb1e6a9fa59b361b31463829d3458b32669ef6f6da676d6175e9daa24953b5b71cb5bf429ab65dc1106340d15d99a2056170fd5552d79a87da5f294d9b9017496b5cc0c31450f880ebaf96bad6526a7fc5346d2b4cb1c4132b766e54c500d75f65e9dacaa96bab2e6d6be1fa2b2c5664a4f6a6a3f657bbaeed4eb931c409be48e2055dc6c0f557555deb1dea05c630c344d20d7a18020aaecf4aea5aeb50fb2c25326a9f3545949ab6deeda676bbda17a1885396f606ab7d9169da768c145b683153c61b64c8c07547a97dd169da8e8048e3b485872f6b6e9002d7179fbad6508e94a092a50836c23c9172025ce750fb6254d744325d5b4d5b47458948e196b0cbd3de7c6a3f84eada6e3f4c132e4d5b3f3185588064a4f6d653fbe0ae6b555d4beadaf6c3295df36a3331813a2610aaf6bf2f4dd7aaf6c6535aa184540c90f8a10b25707d30a96b8d43ed834ad3b62d2841171318f1c40c1528b87e52fb20d3b41d1501444e09242b3e744101ae0f66e95a27d5eeb0f63fa969eba4a4a90f4ad794bea5bded4cdb91095ab00514515c7162290caeff65e95adf50fb9fd3b4ed185ebc6022f7e508354c80eb7f4f5d6b1b6affd34ddb91135ea8218334383031e505b86e27b5ff45f53f325dc3a99a36a6a2fa90bea7bdb5aa8c0c952f298822a64c0ed79d939a9ab60fdc6045182dbc48aa1203d75d43ed7b545d6b16434175a9cd524c5d9b6ada5eb8a2c50654aa9081c6165c7f5675ad69a87d2f49e987daf7a6742da7da986992a9fdf9346dec3491a6edfbe2082a3378410ab61881eb26b53f95a66d45c515663ca15303440ed79f4b5d9b4cd3b66218e14414279400a3050a70fd99a56bbca6f6a753d7bac64ff8899ada6f349d66d67e4f4d7e6781eada469191eab799aebd6a0cd832566abf971a4af394eeaa1a112295d7062e80e20d2cc6606a7206aecf505de31b48edba46d5e734bca56d22ae9beb1203b6b6da2d5795794ad76e6a9f95f88dda600d679c41e50924c69881ebcbd0355673d434c60c338408e38b932dd806b57734201d4183252e55b2e0968c6dfc5198361c66d860268c1359949a70ed466d31ca58010aba68d2430cb6701b55046a08f1044d1562a6aec0d17e18cb19c50fe79831cbdca20517a123732a752d09063af5fb0e59dbc6efb006fa746974a993479d930b1280deebc8c732338e4e585263d9358c653f8d7306a3e791a9de77ba3656ef3b64de6140de370535489d60ccd4a04e227582f182893a8f4c58fdf875c4b389c138ee308e3a8cec65645defbe1a8cece16abb49c4280e31f21823eb04a309a6aa875497832316eb18a2b53bca8fe90dd11ba2e7da20c14c56ba564e66e22c23ebcacd6e079e27085d3653aae8621e567336cf364cdf520a544666b2e5625919e7d7a9ceef6462a5f1565c8cfc7ddff77d53e5e834826cf0d72ff00ef53b6a65c55b43491b0120a7c33579e4ed30deb820e6a549428a291c37592387a79b9172133a2da2706404c1050d43dab022096774a3011a64e06670bd61c318b8ed21e58eb79f4d7954879cc931e15a3762ad612c4537a8e8462ed2ac34965eeb897186e689748547c3cb091c345a8437db3de77ce3c6f3e62c99bf40cca409dadc0611e73ae768bd5c552e5f452f209fbdad727ef3974e0dbc06d7ba386db5149366980dd27fd1e96587f473e8e46283f46fa8a81ba5c82245f76bced166f3b2032175a35e45ad972f77f8ac0e10f6b6fadec716115f2b8ac5e622c572731c3abbd8597fa4538c88b3b1491271379f51d376f3e63538d76d10712fd67bf52262992d6a55d78c9a33293a757306456715eba3dfa2391b8edb0d12922f9a34e25a2d23eda249226e46a353cce6a8ecd3c5da6654af8e562d7e95c3caafca3795792afb540eaaaca3b250650f2a0fa96cab0c80ca01a8cccccccccccccccccccccc2c446566666666666666666666666666666666222a3333333333333333333333333333333333333333cfc033301366c2466cc423e05bd1998b9cffbdddce97ed8dc8f9b4bd11d9ce37b2b7daf948f63644c8f928ec2dc8f929ec0dc8f92aecedc7f92dec8d76be0c7bf3b13710f636743e2bedadc7de3e389f99f6c6e37cceb2b7d9f9ecb437d9f9fcb4370fce67ddde3a389fa1f626743e47ed6dc7f92cb5370ec8333d9fa9f6f6f3b96a6f3ace39ceefa4bd059d81f6163bbf99f686e3fcceb2b71fd8f9fdb4379ff35bb7b79e33cf79676f537bcb39e39cdf545db5b71ba4bd25ed4d696faef3e7d264da1b6b6fabb378fe7cda5b78fed4ed0d3c7f676f6ffc151f87ffc3a7fc19ff079f08bff207c03781cf00fe04f81ae0bbc00f019f9bf0f9099fa5f0b90a9faff0590b9fb9f0390a3e7be173157c1ec3e7327c0683cf63f0190d3eb7c1ef26fc7ec26f29fcaec2ef2bfcd6c26f2efc8e82df5ef85d05bfc7f0bb0cbfc1e0f718fc4683df6df06713fe7cc29f52f8b30a7f5ee14f2dfcc9859999a1a0b9b0f257f9bc4398726dcdfd0d0021142957aaee6ec94f1e940d55b7ec1d4ed254aa4ef3694245bda07879f344e95357475d0fea0ed5b5d50d405d2696895d629bb669b7ec9655629558122c0956cb6ad937ea66592c8b6593d824168945628fd823d68835628bd822f689ba579669999688256287d82156881562adac950d628358201688adb255766997f687fd617d581f96ca52d9294b44dd1eb687e5617958292b6595566977d81d5687d561a36c9485b2503687cd6171d833ea3ed9279bb4497bc3deb036ac0deb649d6c6e735bc3d6b0342c134d7691768ff66867d81996c932d98b7b2bfa42f13dce76f93af16de2cbe5ebf465e2bbc4b7e9bbe5abc4f71ad82226c1f72e6c116bf966f962f926f145e27bc4d7886f256c154a55c4a936df17093835e6fd7557efb8803e75def8c458ae14a7804ccbd6c593051ec9022b881dfebcea71d16a30056379e4fda4e7793934b1961865df398a468c9f1e39bf1b5abba3e562bda4504861da80b23049e19062255e0aa2ac0351d76354e738e8ce613f393ee0e27298b2a0c02d05c25e77b9c8d832699dc59272b1a4a4a4725c2c17f9009694144f8f8bf56a310005299e1e17ebd56abd7a6893ce59cfeddce5bd872e6ebf178ba5e332dab98b873625c939588a2d8415429d675a6bba68af589256ebd5025ddeeb7525adbf74de7a934a788c76ced3ba8bf2fca35fed970b257005fb95e46351146696f13026a179ee7a015c2c149220915a3db7fd8a2589b5eb4a587735a9e47557f851af86e157a2ebac2b719dd5c3fa8b347a3d245f779d490fcb751e92c9cb45c6bc1d1d0a94c29ceda8aa9092949658284839853d4ae984e2788393d331a09fd50151f1311a7e751875dd87b6de436dce435fbd522286e157a4118e51ce45311459ab2f11bf62914cc6875f31b9b92886224f2886e21c00129d501c6f70725c8879802b0f995bb138bd237c73136bf2e68675f39b1ddae4fda33b0f6f8e43c77fdff755c54c10bf7325e2776e2ebe4925e17548a3f1e1e2705eb12437a3982489d737503a23483809870f8ca767ab1829fc0f65f1d098d773b3b32ff00664855f5dcc191f86e14d184e1dd62e6dccb977f0d3c9b5cb5bc1605ca493bcebd0c5f5387ea492f0636824e2d0a6243707e956a09eb01dfa6226841fbf84f59c7fb42b984363bd1b69acc9c54da69188a47da125c9e93ce7fd8a99307e7525e357463a1f0f924a702e924639c7192f529c87543c8baec4875f223e5c9d890eb933e62d599d4532c98979b3e28c34e691b9d5c3505cb15aae97cdce91d7af13cc834c858021656519439af82310bc481ad91c341a1f863f0243da8a68dac2af4826390f2f924c9a94e43c64121e04190a26d2833028184325c1114106c236912c0048ee9769c339110a14282449684b3425281f2818140f540f940ed40e14f81f7a73185ddd878aefa1adf350d677e8eb3ad485832e8ea6b4441393442428249c9bcdb119c00e9d806487e671682eb73af89cf89b873f61712119eb1cf0e195800f5707dfa4929b9b05a34c9d5542b84827d5694278f04ac283a451d377a3915402ee2b49ee7557ebacd5c5f0e0bd50dc5155212521f1449ea3d9afdd172a505c96b83cb13c96472d30c56297efa528459d17a5e85a295e869fa7c0ba117619ada5c34159ffa13ccfa1b0f7509fbf765ae35db1ced9494107b54b612783f8e4243a7dd395028f0aacebbca573263d3be938e70e4d3267f33daf35c6950ecba300db7448231619556984a04a1c4718ec97c96834a2174017c283e43fa2696b1249174e585c2e073beb399ff33c2475def49149723e9f64da763e63bd22597f5d09ebaf8b3c3b748718b9c9da7665e85a4f9652e7933a7526112bcb38eb9405f6d69fbfc0da42b04dea7c39a70c3b34cf508cacf3bce73b0f6349747ec2e27448a326253ed7d1218d74eef37dc592bc48a3269154c273d78d6024eb5b8d7c481e91ba96b476ae7326de75ce4332d921c99847e2b4be3896c7487396a4b4c494c56971235d9cec5b759ca3b0714ed0fcd6715e42f22fc980786975a7abeba0ace7a03e3a8fe5fc87eefc74712d24737eee788949a226695cc468f39bb38618b5ac0db6b6310ae652274371d4098c7bbd85c49564f5d697b0ee2299b8ce7a8b64d2a4c47516195b268b1327b9af243f37d2ac559f006c63916c65b5850b2657d9a11d9aa3f8d778b33b5a2b14613f642eb7bacf73acf71cb62a47b6021e4617079bdc6a892e72b5f22177ce56504a583d248b3cc2f1d01d2ac39ccdebd01ba8a5260f70056973acdefc142394ae752b0992695b7d1e85696bfdf57919a6ede673aa5c2a24d3b6b828a929f284c531d39cb1d3645d9d0c55272f2541c24b60e7e866cf99e3334ac7049a4113c78c4dd85c9d0e2a3e075d3d88f61c88f21c87ebb1d76134e6fddc5c075ddc9c73ce9e73ced9fae2a678d697ac5667adc8d832615d9cde9c17a737276c257a2b5204714e8fc79c738e3e2bb1c5dad1f9961bc56addfb07fac0c85c4e7ccf73abf3bcc52e1fbab8168b05b6c4f0463d4a56463ca4471ee19a928cdfa1314f67f51c1af370686c24733956cb9be2fc8ae59a36f33714697a73c28ebe760dd1e2cf8a1124d31604e3a41c2fc7d84b58f99c97321c275a5d0e0a7b50eb31ea3a0eaaf31c8af391f2fc86ee7c5f202e882e0e882e2e461787832e2e872eae059b36cffb098bfb4822266934d8b4c5f63d87dde74b7ede4332e9f9cf7d48264d4a7afef373263e8791b1fde2605fdc0fcceb57929bb3ede7fbd2f5438ad06c839164f5be5c6392c7ac464030239fa7edf503ebf159bd10eb9fb0389f2fb949434706d7f3efa00bb17ed3098bbb2173b9d661cfb9fe039219f9bb4dacc9243e64aceff323dcd690547293868e0b5c0f09bbcf95c0ee037b934a7eee731fd2c8f59fa6fe0f8d81fff9110e46632079f0f5235c0b3422029aeabd05a3b6f5e80a50c599ea799e93156a54d7153ad472d3542f045767c599ea1da86ba3cf6157e2731869d404fe451ab1ee739054d2f31fd268f59e1be9a61ee0fadd4599ac0e7b8b326952b222637dd85b879d098b8c35193361f59f2f69c1fef3d60f751d465bf7a1acf7d0d56faef3fabe92d0c5c1e8e27ce8e27ae8e278e8e276e8e2744e585c0e99cb8dcfd93ce73aebb99be75ecfb570402df390bcbc9bad72ad8c308d87b5cc03bf8c3d475fdb88a9ae1d6b018f96b483dbfafc74b5c1cfa982e5f754596f790cae2af8afc9dac49d8107c54f4a054170764f1b2c7cef892ecea34eaf117caaf7447a4eac2cc6c5f14b6f077a51730646795373068a3151f4aabae655f09e9a3415fc97e5ebd2369ea82fd7b5fd5284990a3a4da960fd962ac85439f08b113dd4f2db52c1b18aa1e73975ad247aea1ae84d795dbab65a90a0969e1415d4523d24223e782fca8baae019bcac8cd1235f0041a29681c73282074197d34acbd7e65fac4c55d6490017c7ade99aa18b258a63462446886ad75c2b846795b0ba718561ebab70b55ab1560f59ad7d9120922d1b6a64f317357a7d9c336f8b18b7652eefb125fd8a2de18f1f492636e72fce135b240c5e65915862e2bd2a8ad032ef22b938af67de270c46242df31e92465ae6ddb551a013addd518a4ed5fb7ec54f0c4551141f521716e7476c15cd1b5b405df3def2c4f00bc390a8651ead651e0b6446efa01623ebe5ee2a0e154566fec48f3fb26c8169b84228cbb9788f2c61f0aacec5b774a88cde8951e7e52b093aa4ac651ebf8e6081e1a0468cc381e34c595868e188966519c52c2df32e922253cb3ca81187c742d7700ebb37840a2de8b8f77be72cec346d3ff7fe7abd6cde359e9d7b97795ecf752e529d1d980e2d5f4551ece9b9ce5b3a222dc7aa23529dfb5017b6a787941dd121df328f2784c1ab3bdf9701461eead51d1a2b61357eb524c77fbeaf2541a7240a3f34853903a2464027328addc89cb18a18758e73ef27634b66ecf38bd341c696f47ffe4332017a7f71254d249f6382b1dc9d0a5dcbb9f7fd724a30ea9038bf79ceb4e1b8e7b54c0c6f648ee39c79bfa125432957b5dc5d0e1a130fbb8784840ba231914c82e33f7f8d003edcf1f5bbb625b04820201aa32b1a835745728590242bebca781cf48712cd9977189d6288689ee7451159473b9de305165fae2cd59fba5fae388109a34b05aa0be64cd4746aa4ba271ce15a3bead25e6b4bf4de6a5d248d62dedfba9178d74f581ccc689c33f022f923dc697306fe08e7faea272c4e248d5c6439debca47db8c5b90ec6bc279933d0235f386171484823237306fe0877d68f7022195322be75916ce20096d7bdb748a430f691b10688675dc9ea36ff6e431a357da412f12cd2887162b9ba242f32f69d71b125acbffe229bbeb3c826efde2b4948c692848f2d693d7cf8d619375f47bcd65bde6c815f9d1947f09f4cad2f0e8c792d9249ebafd65f3667f23a8b8cf517c7fae240af2a859681b7a12acc19087a2dca2f19a218b7c692e456178f53b9ba7ef3de57925caef5d773acdb9cc6bcdffc08e7a2ae2b69b96e48231b929de60c3ceb462ff2a9822d166d51a69877d78f704631135a675d49ebac7b6791464d1ea9847517a9c4487306de6849863903196787bcaf4891dce9c4cdd2a1d5c4b85b8c375254fe8d145d9ba154cbd80cab8949a2a91d1b61d6f9f9aefc506ada18c7642a87534f930c0e696a931ceecab02adcdd48b55e789f7b88b194cd0a8e539fd8da26e717a3ebaf8717639345c6e6ce1948b23ec9147e845bcaa251b1bdcd8f7052b1fdbe451a352da9a4751b923667df8dbe16bb8e24918d50c67187f82f8cc07504ae383bc417ff798e2d69dd751729921b5bc27aeb2d72a73867bcff56dcd5d2e66c1f4e757f547c4a8c934214b99d7a7accccdec724922ba65700156a9f99058aa465b36db044791f980f5c4168038524145198b3598a3656b0b7a28d528e33fecd5d617dd418eb4ed75cbdb375472c816a4fb2c568cdd9b37b76cf9e7376cf39bbe79c5d84172e08e5fb8e9ef4d0021a8821e3460ddec065a96092b0a27efb254a10eb7d6152536175bda8a1c61883d6c79f97fa9d757585efb3ecaffbebfe7825e28c3f30fa7d49ab1f91bad7056049ef93a2b57b73b558bddb246c5d89937728043faf77fbb532cf9beb7537f76eeff6ba5aac559ad6f24c3581e5286b9b875b801a4b75bf1ce174455d2f6a64a9385b2406b1de6280d539ff312155bf7f718252033f46b0d260a5c102c3da892b561a35c6728795060b0d1618161a2c34586186cc6055b1aa5e640ce130729796d1efad11d63510bee3144b05633952edbae6cb85d614546b2a0c7daefd2a01569b1ca976086ac890db6ea4bd30413edf0a02c407101f3e5a42bac170c8105b15f81d27a20901e223884cf6e387101aedc70f221a8d8846fb5621407cf800e2c34710203421441d0ca909f1139daad3fb7e1079b4fff066551e8334900644880f5008e80304c9ad39d450b54e140211ce0f22efa9e94f9696cdcfaa784c9955cdd4f058e2c1c4230b8f2d3cbab40d47c723b7abf33c92603a18165ddb28aa2c2b174b28886ada66553fbb2037d244f740cfa33c906655446fa21b6990e80b2ab5b3b9bbe3bb3bde548a9aa1537407523524129923a1904ae414d24a0ea41cb920354155416982a87e624644a052744a884948c703c4c78708f9517b9db0ba62ec93295c31f6bcdca91c533a87951c4c39967258e9d2a565e44c071414141444a51647846441052b469f20aa69635c909a6eda5b1e480b4a1354d5b29943298712101f3e80f8f0f1ad435ac88ffe21e4c78f1a2984d2dd143dc33b5b10220f5efe7cae3374d7321698d1e62d0e79a70d9da266e8192a25b4fbd10111e11bacdb0530ddcf6ef504f4c0587700a56b3f94a67460a56b3f3a60eae0880eb6742de6913c927840e191e3813453338bb1316e2d8582a85a80414868b654301b8c25959a51d8d39cc93ef81a37d3a960bc5d7c29b49322722389fc0847840ca5c4706ab58292a4348524c356ad8456af2342423b52886ada7e70bb692372166d672d55ee224e21452b546ada848cc21b194611a1acf4c2c2497346022a1544d5a0f7b36b10ec2e2d7629e9ca70c16a9e825e0d8ce709e9ba86a3f25b2bd73856b95c66e8149562beb171cd284622bf5d0cd2cb45fb01bed5143c91a0a0a6fd07fd41d3321fe40f15f9b36bd9ee75e4074dcb26e8791e48feec7ea8847656c6b18295078f7b49b575e38aad5144bcbd1cebb415216f3838f4b3e9e9f775e4cb7871da42f8eda55863b18740a9999ecded998edf481d393ab136c6a3ba415441542e187dba692755229427e926088b2341513741503b347ff34a12f483e6876af67dfd98c0381ea4399b3d46982e27889083b414e279b67b745f4786dc4833d5964e6b4e719d5595b32adbf775a476230d83ea5a493b687bc9020c0aa6fb32d2de4cf386f4d684bc2f6e2dc8fbaead01793f8c32d23f678c6510d5e78511c53f648c259d9d4a4d1b91bf5eceaa88903f668c7d21f7e84f9aaec560672a50cb763f54414e36af5a52292042401e20e7791d1902e4202d6d077223cd82b960af2340880e1201e9f63c7285fe8fb770e0a0fdb8aad4b46cf2c80505bd8ef8a0812048eb6f8aa102aaae181428d52075c55041437ded70b1543096ab911c5f4a88fc461add4ee4ad1b5d2dcdd98d32132fe1d8c5b1294550574a3b34bf382234e4328e545d3b9a55cdb09845cda0663a21344254b1ef4b68e7d168f7281108fe007dfcf8f103fcf1c307e8c160e497423f7cb4e8f23ccffbe1c33be87944e479e468240bde3d1f1e07ae99c3d82f7f401cb9ae95b3aa9d96fdec7ed080a9f33f54493894a62df73989890206751ec7120e2b6dcbdd208931c1933a8fe388b6794a3f69bab662a2e852e77faa40af1b8a7e6246d5b5924ab590139020a2a01f411d1424e4dad7111f37d2ad8477d0032907bca4dae40ade949a33da83a868b403a19d88f61f4d7b29b4ab1e8dd20ec382051d0c4cd77c7c1e0625d27c74d31f3fde64ac0663498576620ea347613a1c2f46a369ba3663347284ae342a45cda8a93c5524d23c9944429927a7b4cd668a9e81aaf3749e06ceaaba56fe64e181d4351eb9ae6d549da55029b4ab3f5966ba6923f2f90a04ab404040403f422e171132886ada2652d5b65c2e10e7e7ad97ebe56a4af47ed1fe83964424e0a82049a5cc8cfd138cdc94e8fb3ae2d16ea48980d0845c177a1df1f15677777bdded75d30ed292054fe84502571ac5c9e124e140d9e1c231771889fc763e95fae01f7c3f7809ab384c733647212aa1aab1694d13aaea2049a84a6827b41342234425a4a603242134426984a884d4748024b4a352423b20f7416db7791db109f90d902142765ce3d4b4d1a939eea68deee66c7ec7b52f1f3eee8569f049ddb4a6d15d55d77eb47ed0ad548a884a11d1add4cc1445d335a2cf532aa21f949ea19194a2a1a2522618cb202a4fc8735e477c902c784915c8756c1407a965f3358a3384e224b52cc78504a123103aaa69d97cc108c423b4dba1f99c3adff271bd5efeec586146d96b0457e5c1e34c18356d3125447efb8d348a2db9bdc88b904c62497e7e6ebf7d7144c8308a4afd64298560ba25440ed309ed747c7c533a95844addac31f6cb9f5d10d5cd5b39200ba7ceb7565c8ca5d0aeced2b46c5e6807529c8f542acb4f96ae9533aa9f2d33aaaef1989aa5e91a8f5dcbe6accaa3b3aa96cd075175d1ed45eee3f914217f76d3b3f9ffb3c3f9f47e662d996b9cf22a0bcc585229a1dd9c511cf5478cb1a43d5efef0a05366cc7c304ee56cdb7ede6ab1aba9901442ba964da1a724d40c98f1f57d51a92667555e8c424ed356e4f3424fd376fb1c77da603a211dcea954d78ad0ede1628119c38c6411cab81b15722222f454e761ba9dbf1c77889038e44b2a95634a1055d72698b10ca20aa26ad9f48a18cb202aa90ea20a4a1354d535a4ae758ef91c493994bae6e3f339a674edc79295ae1dd1b51f59ba46fb7c8e2d39ba742dd6244543a96894eee854cbe67d507a869a89b531f6b99642bb924aed6a8f9742bbcac1cb9f5d1a1e247cb5492a25659c55cdd4943b6ae748aaf3658fdb9b481055cf5e47fa83d39036fd6d27ea031c2b1cbfc5023372abc7900fd738d53590c87f7e0ed34d1b115268d7b3f91356b81b49a55230f2f78397333aa2b143f344e8583567f32d9b1da410edc003d9ec3c3ee83104c2e785b399835db15aae970d90cd48b543f351435f29edcdfb3c7ba9f3fc0402c940f5eb21fa02f7a0a5f8012d471ef4056f464b5146cb39e5012d777675be035ae224d579215aee50d5f91db4a42fa8f31cd0725291b4cc31a5ce535a9e96a30e5ad233753e070da2e59c02a2e59c8a09d117bcfa334ed579d8cfaecefb0451d5f91e5ae658aaf33c42bb524837a97266552f78237dc1aba5d0aecedfc07475de8652a93aa3ca90aa14a7544e2a43a62eb3b7383ded4835528d69d4d4791ca6ae6d699b8fd3a8a66bfb458a9912a89623d558a554a76e871bd41267a94e251c6a8973449d3848751efcbcd5521453d7cab00ca7aad26a4ad7ba8bab962ba5d511752ad539a4ab35fbc046b8ff3ed2f33c0ffc1edef3a6c80d962cb8faf354108b801dd97bdefccacfb6fab7a2bcbb2bec7e5f8b8c18729e6b7a31e456c80d2017432e865c8d2177c46e08445f28f3484f041346212debf78be67d2001c61e32d9077e308c3b7e30f4804271eeece75a2823e2f7300a0a46b1ee971d9ebcbee8a0c68534b2ea7ed1218dd798b155f78b0e62408d3775bfe820e5bac138d6fda20394ee8b0e4b3760184c1479e77c9dff81adc4cf9b9f3b7bcee6dd1f46bec77377ea30f2dc9de0275a91b5e83155aaa95ded5410a20b52183120837406d7ed44ed375294daef5cd758154a6f549fa5a60d06e32efc548bfa81895c0cc41491d44d2451fb4ca66b215f490a2ab4d0546d6a5f0623ce752dcc40953560a831220d2745e09a4bed33d31bb54524d3d6ba39e39ef5862d4b9801050e51a4c0b5d3932c5ab50f9b36d10a9635a8d8c0082cb2a001d74cd4fef843edefe4d0543daf8beaada07a5090a81e16d5838246053ae2c9ea6e91aeac87af232cd8971c9cd4d5eae0ebc8aa858508cc4760376e8c256cbd90210523a370384115ffae9514e85df3c8d26316f989540dc37baf23e191c0d6b5ee8911f5bbd7351e3a358c654779322424241a7448549cb69e9a92411552e75924c158c2ce345335d24dd592c148248e1c864d9aed2193bcd4791e1186c3143b5d7c496222476a8e393c51c8e01c16dce0a4cee39c618313170d8ec14c7c832ac408d18066c97ca9413726278548edd38410e5aca8fd108c0851fb227c714255fb05e8daeb48b3d070cdc68baaf3af8f6a8d11b23557d4fe4e1fc6431552fbaffb054905b5aff8d2444a0d40135518cc4cd2527319bb7db6d8eaf36514a3ce7bad3437b802a8f6590de6724dec7db9c1933ac33041edd79106776f4ce9a0f6c1118ad4b7516ac0d479ef4b434d11240cb6b279e2c4081b77600d429d5f1ba4016930eeb081096adfebdaad366cec6163849131baa6b8a4985e5b8c3a75bdb8c1840b8931a8ae1737beb86030e2a8ebc58d2fdc684307a52f51a86e30c2761871ea7a29438c2bcaa87a9d6074d5f062c1d8da810d3380685199c1250b33a2786919c1ba5ecc10838bb2dba95edd2f517e606a234ddd2f4730b501c572aa1c8bcd5284c988785c1b53d1d616ea92accddbd6cd058d20f9b2a58269194391a1ae652c8135d5a3a17adf50376dabdd6aa723210552501963dfb7aec8f5da33d33329a826cb302a36bf54d3167ad919bf8aaa31951f96c1557552a89b5688abd56e8586cf5aeada116d632cab345553402b2a17aefc6ab7dabd56bbcaf7661f81244b922d287049a109159c68a16b257791a16b259fe159a97cf6ba087395cf65484548c5defa7c11b85c32ba338ba65cddaac94159a2a9966c65f5b4d285ba302969da16a714268549a153175f1588b4bae849e93ca6d163f2983c262f8bf7e4419db1b79b32c65892a7caad8b251199a94228dae4d3b4c1c6c3a8ead3b42d4e37463d85ba39634fca8971676ca275484835e67dab4761402d83dd6ed08cb1ef784cd6832684568b1185c04d9663a8ab3c594e386ed0da9dafe21327ea245bcb2fe8215fb04ca9d0352663e210236d67fd6edab63136e1275d702521c8be8bdaab45115a5d0bb4acbfb16581ccd2116d632f4acd0698dab41db32183febc49eb72cfc4c6de525b895a8650bbb70db0a4adc500d4eee3eced8511b86e188ae29ccd27de1d18d2d892302437b60414e791d7a297d672bf75c33a636c21f3ad1bee51b7a4adae1cb7c912a8ee4518181db3c0b0c0fc5b8247ae475cc14caac08b1b39279d93d4ee7a2ca7711ef9562ca79103a4f1a8544b166b83550a15a2110004002020007315003030140c874322e180304b0351af0f14800d7fa254805a1408c33086610a21448821000000000200000333b30d08953f7ea888d757a2ed439313be9dcbd7ee56d8aac8deb5920eded788402d768bece5fa5a913d73378ae49f97da4dd4ebfcdf446f9f1b4362b802a01189a529b247bd6e0df71cf053a136f7f7d607d0b58629c013088029695dd9950c9931c8464a8104d940369dcf145503d93c11110606598c0389db88fc48f196c47d90757a4c66e2f41cc22980df1dfaccac1811e1c56e5c619c7d2da8e15fe834ebdf43f1da032fd2f8348a50599622c0ebf493349ee2e6fdab445a730b073fbe3807efe9db6a4d1fc64273bc9ee698a0df6236c53c43f0a0852d9b003eb433f46ab9b5515fdd29212ff02af0dc03234f86e080f597f21c6f9b6023f1c48758ebd6205ff22169f9be15cbb62e503c68817f7edcf1a978f8a967dbadded0914e342822cd3823b57e6cd51c57ff607cdbf4f7017c7549921833238af4aec4f4e594048fb8ca7f25d1c346d01173551c35cf671e500434634f7811eb6e1a1223b1df8bb5763414055528908529f7cf52cb1d8bd04491cb286986a89e2177c2f7a8a8106f71043fecb7acc161ae725695a59e05de351b4eac7e1207ad3dd0b52e7c58d0c237d69a0dd7c83064520b5d80b9ba6a69a67390a6d1d52f30b605ca3e7acc54a6cdad5eb52bc9330b535b96be140238b9fa2db31928173ef327b23780b56513d9090ec450afee3716034c6ab49ebc7b480844000cf653de6469009b9f02e98d39482dc543a9bb2b35514015f9d9c76eb7d3f2a7a4edd1fe5745fcf2bd551fb254f716cc07b01483cb5e4f4f4669b2fcf18454e40eae212456df5d0d9d4777a30a1dcabbb9a16e0908614f059657c7caa0a0bcfcb6bc73a8823cc165cbfc3eef7e57e66ed1b90b940411ab3abc59b5701156edcbe699ebe1b13f9f912846086abd75355ef657ddbb2eb5e4244949b326ee08ad1c3275fc9f2f4d2c12f4ffd4d28f8d61d9bf56f9167aa82b46e90e8f93e2693cf15d067e350cc327a5c70ed8ba8dab827b628797adfff2d6c8c0b8be1772ac0e6949c4b9ffa5b5a1baa5e344abf0655b4ee7b4df3b4f5b9ac532889875cf08501f62bc57c87e1281a00fc053a5b07074fa117b1e8e9c30d2c9899342444aa49e6e7c426c7f0e647fd5f375dc69afc533be67871d340ce471d10d9ece52ee0f11925bdba9f007fe32410bb564b6dcd0ac1056e6b31a210fc11b19f4f249f88d214f0358f7c2dae60d34327c0d7522e9eda51e13692ca89c4d147fc312b19dc4ee5d7b9898f6d812f75e1e9b11ae87953473b0d6f90ed55a34806b60040ff0f102df480fc3d8b021157bba427492896118e38ae92c4cda8873ee660fd76f8ea15a9fdd64e44791e343d7973cd42fa5bb0af6706606abee62c7a6e71fdc861c90dcb626060c991d817995c120f4b699f1774aa953429822e70368618c4b99ac7a721535070a1cba7825b2b75a64e823d2c2fc193177cd05a3991b60ed63ee7101804f083062d39d44d8bd9bdb888dbf296694d6ec6440a7f6e0747228ca808226bc01540f036e7741db754d2c7b9b41b96a14a3a928696448029b79635398c0364ec11c8c7118bd0b4c4c44136d09e31393c79e3984e3a133235cbc72c05ac14830718d3061d61421eb5fffe4193e19605d84e9b3ec6226aa6b069bc4e2722c07500dccd61028191002877efdff3e2d27735b2114ff3d77eceab530f88371729b494301ffb019b6d3bd9062506a75d1d3fd01b61d0416692eae70cd2c97e473eee5a02e08a297e3f08dfd82f178e1b4bb56e31e30cf94ed0ffd02624bafccb68f87f936960cea41f75bcafdb5310a65f894bc8c2a6f927b4728ee2c2178f2ff1dcbc00ca80a97f95ce06fc09f87821a51ac72f2bc51b5faef0a51876b680b54028e29258d736f3f045f3097ed932ca22f70a6e04c4a0086e0e6f2dc835704cf4a9585987cbf8a0d285a082f0dc80dc3c051b28a10d0e8b9e1315e89abc23235506cfa2b971e2c40c354eb1ccc683e04743742d3cf97501b1193e8eacccee82666a2834faa8d8551dc1d2eb8ed346d9869644a6f1cfd6d26ccb312ed3547bf62ca0b900cb9730c283d3effee11191d10750d7f0aa540cb94146e002bbcf6568d8396f55c9abdeb240872cba2ed9ad08e0c4be1186d44e1f282edbebbc13d05eb9d078ac2bd5b271bf1bf59e0dd2307b4e70266588069170baaf46b910482845470970fece65cf693cc5662bc44fb6900cea705d29d5d27b0e2cbf2626704c68efebe33f59df262d22758de4b768e8409cddc13c735fab9f6f64f1c1881190a416a2ce5eefaa9d268b10e8df51b9e60443480a0d98b1beaf6c7117f31019e5e20b95279d088740e681a6f2c7fa4b906bacdc8e3227a73fe940f4e5398c8db9c1a3f71ec0e386e57f40f1146490a7cb15f5e0ad561102da4c1c5712859cc96cf5db6b74652299dfa73a17830471d724a444288949c8f52c24d954fbb7be3fb79f270ee2aee4fcca87acb7ce34227e347fd119720f8855e96ad9dde969478f02c5bf198872573bb5043efeded993164b616f05ba9d862f733b605934e0b091dd7a5efc023bd8b99da0b343543dc6a74142c7089754835e30512823ada57e28d03be7885530515848f0bfed639bb8a68dd8c42c2760fccf5983f26b1f4d927d328056f31c222408d2bfcc85f72ba289963a1f3a10309921b8482c58eef4a3e538faf6a7ab0f2caeeb2be938e8da1498f709c5e070ba1557720654f5dd3f210c8a70e0b8de8d9e488f4e9b6521a011f81c675a80a86a439ff2623e2d0c62809557e0190d225cce8b50008d5f4ca1b02de80df17ff08c21144c04062377d4e0dd13336579df8215ddc49a1b61b7a97e9643182961506592e2f3254a70f3b03c7b54f92ded0f0af5f4583efe90f7ccfadf4076db20e14d4ef94f9c8f135ba1eb06f883dd1055d43eb24a999568ace5aa184dcb89428247014026868b52e63a229237dd708c68f38024358f988c8109eea3cd8bb0aee257691c80db419a573a1c45453c8f05c9015ce41d04fce60e652393d4b23d596269989a6d4325b1574ce2342dc5359fd4e1d8e1a595b33042f2aa4cbe944488e4bbb0fcf7a03cfaa20806850b4e8b268c210ecb8bcf8c0fa8f22b82a83bc90c226a3e16833f41be0cced3adc9859ab2b10800c3f90f4dabd546c72beee5ab1a8e0160f616dd74b026176f0ffa3b0c2c82e3cf0b8ee664b098a72ada5b4c7be3041d09a9e66b4452de34b8071338608d5bc4201d0f8e4e5745dcaf0b4c1e9b7ec05877fff0bf258b86d5f2cc21ecb9c0bdbe12d1aa250f1ca985c1d90aa88e0e68271c18299468406584d067583c65f8a5480aeb7086fdb4eb9490b834f97d18238380c6523b3c464d900c19352dd34d8119f6c0d251c4a9e66d9951bf9f73dbe1e383b0c05da24d1dcef0b670799beeab7c7b2718c7a38256816d0b8ee06ddef061383d949c60421b39711cdd24b41a9ae83863e3908b0674432270cd17241879441ac228ef2ae026216a7206b7c6cdf6d7f33c88c08cd0455ab77c44c7a7595c696f5ce2e97d1472039c1d44cfdeedc318928965559b5c67087b75541399183d2a353223e62275336230e5b6cc55e5a57d252a80dbe03d0ea0909491d7f4657c0776f93afea865a9722c1713856222aaee239f5ca9b4af0c1754404704fda8c403c2359a15cb296710ea41743554a2831126a0496400657bde9366829ba1b8661929d9cc1905baa566feb424e39aec0dd08ff7136de16c78da614decd6d7780c46db146b1b1b4d651afde217693d688283e606ba75a2ea14815cf87303c2f1ca3708612ebc9932cb6e0364e4e6efdb6d74b4bd99a614567b5378ab8c2bf74cc96410a6b5d639d37e28b2805b1cb500cf68137f874b17f92fdb4e0d089fbd646fdda1e2800b5ed321d30f05ba3248e6d9002c872d707ac69ada12a7fafa2f4630fdc69c8ba4bd7dfb53b843e81ad09790a2911417662cb8bad48444f611f4593e5d86131ae0e57e80286eaabe5f0d34fd3800bfe6843820a3722c94c532578a3aed2fc5b32e5cc4a46089b66330765bd5ad57f8b5772f810a91cbae6fdd9626624d9a25715ead613ee0c6fee70fbd0554b141487b010b89ee71ab9168cc53955107a9e20403d845feadccc21c907ab14adcb3e9975bb55e0aff29be3e6c9b256cff616c4b5269a63867ed8247b91996b224fea0478bd64ac052c28076b1fe61fdce24fce954427c7e4f6f509796407b438158f20065b4668fe9f1a47a03aa8ca155ff990236be726fb717d900909f61c0be2c56878c7b0ee39d0f64cc271482ca57cf03fa944a1f46676a3221b227c901f013c7d61eee1a50e019777ea795921170022f0bbcfc27202f19ef1496338cbcbe98abc67912c11cfd6a6514ee36e41e14c79d8521e2f16ac0d7f4def7f5a156b83e713841d970b88d07459796b6877f00af103c23a56d555c042ab3a62345cb55aab9a89e03896a57723f63cd82d7c50109484ef0386f20b52c3bc8c89b76a54827a657431f190c6e89bdfd4791d614582a95dcffb1a6051dd52625615f6e4c6c4cb043a290b808988b1bb5b74f452cae7e3e7e4e27ca50682260ebada0acdf6a0a0cbfcba9b01691383084403eb92238204d1e48bc0b9953b73bd192c7ee3213ce1b91a41680bff8874716e280ecc431ef1c88d342896219010c4a81c0160a5ed6c5c5484a076a2953f38349615c22f514f8ea22858f3d659adce4c4ce0341ac9c0f1634803759ce430854874fd76165fb12dd6dd47693a955df45b1e3ace4be8890091824543ce3af2c87f6b0ef5d191f217ab526f0287dbdc26e2aa22f243a3ba190b22f943bb9476515fe8d53caea9b801fd55b1e606ca2c222a20e2c4cbe9d19c9dda19bce3ea6b9441b47506fa65c9eacf69217162d88040168f72d374263cf3d361673e1297e514e16ef974d077efdeba0d6d9fa98889e57b9c0e64694c61a451d63a7371ed329ddf709fb602dd193a6edbc67e40a20b612e0d87b43cc38b1ecc6610cd5c750b3c8ce48634e27de64177b16c63ddbc4bb88cad4bac25b6a1adf0e8da18a2b500722f94b383f119ba4f570e352e006f238d61cf4ae2c745bff2b565aa5bccd59408be6db41c032f6cf17b63c4a2ea57c3f70d51ae3ab9ba881cab0475c54f02f3cb63d8480ca968950eb97e0e0749d0cf603c1337808516982004be68502253801883a1e8532103b483a4f10ed92f5011b8d17175f98aa13dfd715bf8558e7c51038ce039d982a1a70c89405a3c3ff54488ccf1f1a22fea05fe4815dbe1da9a40422a2996ac5a69d2e3294dc8f42c6b81b0d21484b8cc5813fcf0eb8cf9aed44c96a6caf25d0990dfaeaa770ebc24f0fc6e12ac24bed1a0c9c8f756054a3841d43aa18175f59c48c0cd98ae4b568e1e38cde0e2c073b3a00ac4476c855fc0cb93b142fab186ac5812fff0bded60128b1533fc17135674010de03512276dc58abe902b76d0e00336bba2d76819299ed8c1a2e7feb6151178b852ce048b9d7dc596b9ba987b9ad27e07bd4466c9cb500cf7fb0a767ffe4a3a4fffd5b13a4daa6782c72b0da5d446696560a33fcdd482dae6f3697414b19ee2ee2ed938b75e768a3689d3e00134a9b30fd7f4b9ec8d3856da46a9748d51e91ba5d2a511a46d63ab6410a859d8729fd3d090c6cc7117daca25f0317d61a72894ed1fbc27ece16ec909b90945fd466a6dafcf9d0cb5af6eee97f2b3aab1322d9f1fc021d77967e23bc7f4d1e8f9821f7c11f7d8b33158f6041957a93be51ad20683ffac898f4d5e6016a02a706077bb5f9df58c493b4db5bcd14070b14d958b05a966b79788f6b281a1d99642bad861f8285c5a0ed9398461f88d35f9a2d448cb43baa8167dd79d75b23391f5985b19892891393133b9c4e3061cdf93deebb6ef24622fc6fcd7a42dc38b2dd69df932685f2b82461bb361275271cce2a4cc201c499cc2245b37c0e004beffd401d5a52bfef0f23da426923f315a4a563b18fef4dfc4e7486474bc3daeb235077cee47780381345807807f9edb2c6bced3aaf80f5179815c78760e362333f6f6465bf930c28952f9bcd23db034148bafa0690043ed8ed5481a62a68dbf180889cdf19fb881f458d1461ac0fdc5b3d2cb17dab9f9635564751f21e1a9cebd11ceee73d64e27e35cf3b3aa7e902dd856d3c14d0b79e8c24c2aa6a0188862f700fcf06525b62c85c4bfddcc974af56d08ae711fea351fc9f41093d9d88ea0aedea1ff031e1b5c9a43caf429c448c22bf2fcc07d69ce820b4c73d4b3a49b3d8007eb886ac9c0592986958a093d82286b2a24dedbf2b466b1a866165b6ff708d6461908a9a859df7030ca1ad469a6946816f48aeab3b5c2d64b42b54b2395a28b81277e4dd5f10b5dc73f23d49cd9c40ef8efef53d6301f69175885298f2a129b06260ca382cb7227312fcaea036502980210c000b0956d2a78364c27292e7c974bc09d1f0cd9eef3e3a7a0101fda77ed1488a8dfb8e7be540243219968fbdccdb75fc04c4e456d07c501b5449abf942773da908960a06d902cd161fed95289b4174891be0e769276c553018af6c036afa3a399144e97ea71fd6fef0666c1d48bb4fbb1ec2474651c88614e979fbaed4c4f80d5f6e7d75f86278b95c5700b787db67e08cf503495ac6ac07502adea9ad55f72898813353233677482a5da10b48611139829a3a001620d5b6ab577ad5375f70a32764d5b2aeb248684582c6c89944eb2fd94d39051408a97b157012bc519ccc0771a4b68a0cb7de7f54e863248b52e1c2a6e33041ae2b9ef368459280d00649ead9660c3f88555d3883e645b33dfb35000ce696951f9e032c8fd2fcba1b4fca340b244e40682efc0c148f09486937742c5ff37b107af3cb664195b8c227ae7c37b8c2e64f5295b40dd796b69491b297ca1636eff8711ce003aae960966bb72b62e232aa2ce675a09a1fe998f40d0d8d4f6eb9569cc6d6c3862c93e6ba48622503626ac5f59bfdb6b9c2eda64041a335de0ab66c3d6e1dc4fd9e1f9d4f5fc8ce33aea14ca076c8e752a4f8331834cfbe3d753ac8baf7b388a6424c9f561a97a88b37487b42ea6d266628336374cb63fd4c1d9482da4f630e304e4640255fc29c2bf3fe9da95115a75c44fddfc6838f2689274a42855008f6906acb3337c4ebb7d113942e0b1fc66d07f39a16753f17123fdb579db1bf94698aea83721e2ca97519090d81e5029932ee1cf13e0a598938a3c22ae33b33b9ffa5a5119db148d2a1c2050e60c8e3cf300f13d8804caf82197ecb53ddea5e199fd95722ffaf3a9267122b99c7bc98f9a20b04910e5676292533f6184671a1bb9d74f187574c80c1f50abfd5a8064fb787062252f4258c11b257cc57f4fa0f4e7995311a5466b228a6dcedf0cbd4918c9ed8847c0c81971d76be283bc3868229b929708202a93265606e5a1a01c844d6290eef002efde8fc8921c6abee972bec72258f3133be6185a96bfadf16599f7c5e7c3aa24db8af1d1bd68c99176a40f2a1d743bb9d84206e3f54f4b450ee9fb64cf238ad605b21be6d3e6ce413d022b416949c49b6c86ca95494ddf842909ef52c3846f220eb257636cf7cf6b2dd58c5ec9238be2996614e3772bee6ddab279a71d83008c9ba4d49250024a8d9ff79916a44eee3c30ca0f4928d9011678b2641908a2083fbc4821abcd7e54834fca9c18221d5b063575e402c7f22abc8461482d634816787aeb0f08dbfde781e10780c3bc2e594890245a1719e2e547d98bfde292430994c5862dcdd9f0813a8f67e356545c14de0010e67ae6a1e936a9d612c583d6631bd809a62ed0d438ec6cf78ec60a21681d78306d406129c4afacc68b32430810cec832944e3a181e5e8d329f325436be66f02b632d659fef721f0b4f96659cd14dd900a8e5f48bb206c8e3c45fea58675b9731cff305f5e8361f5ab12f55d721c42af77581587d608098c7d476a3194aa6de81147e3cdf85eda17b09226a4465569b95d15ba47fa8e68e09f967f695895a48567d40bfa86b3e9f783ff880bae2469621a6e709447d2c461536312a022834f1a4745b64bc296f81c1a81f163c9e1d661015238150d698da3895b8a8eb20e0e469d30b58c873be51492b76c5b134961fb3058d52f9a2d306653a0867010aa3e4f2ac6961ca454392e82e48cea5c50faf422a1fc03cbdf7486caf1289ab0d5bbfb7cefa026befc758d0bfb229d44e296b66f4eddade5c614a9b7484fb3a276a1e5d853d8ae16fa0785ac42ecbaea8d2118ce98e6afd74960d0fc05a6b3ab88f6fb5dc06eba46846fd4a26114eadae4c5991b58eb029d9bf023fadc4d278d5851da0c40afa47e0327050fa73e527bd8f895fa593381806b0cb1562792a94832034a858b290747387fffa3a41b062acd4c87ff783872d99f234d65efae61b93867ffa93bc074d6c8c3a8f873a2822077f9029d0b697a00cfbde8585a74c0e12d6b528a06995f692ee434da3c4969539dbbb1a83b37ba91d41531dd0e48d55ec7020c2f46170190fd291da54095bda4320b6a38f61ceea89a63a222763f86b847c0f3ebd8c227b6630d09cd7fb8db422c21766ec8b7f61193ea58f0b4aac49e7c892aefc32f28c101cae7236f19e05b48a2c28172e551c93127e45ba0d78bbeed78a7c5f587a3198ad1555e9266cf6a135fa15d5a9002372a1d43fcc881e288d5f1ad1a4645c912b2f86829d0e1c2f1a2438fa73791878b79f8612d970a17279b44fef3801b98f5a163c469a53d212df36363a29b387fe5889a1bfed327ea60c4904ef8e440d54683b8c83ca0d2dd71ba5813506b9ef0eb94cbe1afb92cf7fe0258cbcf9a00c47950c80a9be8c67401764e5749f43b02fef57d48fea1cb3150f5e38a584c09aa90d66b16a6d94ac8f50815352432dc912d9a9db222ad563cc2644458df8ed8b59feba81fa0862273cb3e49bdce29afabf0dba2ca6184fb46a3ec484ff2821a66153e706c08a01cca71310476396441ac4d4b8feb903586b7dfa8f1c02301630c20128f534d676fee307a28f016c081827044dc9a4c2d2af7d0c98ed9e5652dbcd65b6f07a886887f3f0e9b1e44820c9a9c879826b7034cdd389b62b18546a91647a3c364b402af20015cf7125407c8439bb341122cf783c8199d08a74cd2f44829167930745b270f1ba30dd8ca64d2986ad420dcf63d2a13a0ae2b02bb84a1c587c8d0dc640a1200ea0862198054208f4943505c198eb3d776dcedc3021fa0132aaa22c140cd457131e79070b14061ccb5a19ca3b0b4b0dd711534776231e9e535c7b006b4849d46afe79c5933890b3c2c2d252533f6655e15435d3d610868d7c2899671e4392f0ab5a80d50b0b5008694070ec53f952a154f62c2c042cb57fa12dab71c00b8e4d8ff56a61210ead6cfb4efb786af0e06b70963a4b4d58918c16d5e0cfb97fc9c83167c6c980cd6ea0da4032812c517b4fa1858e06e3bca3c384581ab47b4c2dc7cabb0781b01c43f95ec1639f716a214957870ef4909d028d91d1886001ad2bbd82c97460ccde777e9d77da5e614a63ff129e4405c20d98050c1f6bae0a4a25476be9a79f5e2f442706c8899cb49b58c02adce941cef87eb21fba7829d0415ba0f89205a392455fcdf484507265a433479aa017815f2d7fc6774d14f90cf61a9f0f096594b6a350d2799403048fcd1110e3728c11f6df160d0574993f09ce899f38081294e5cedf7edcca4fe15b138a3d99e3f3a3c8691050ebfddf50da80171c05a5ceb72759792a16c1660ec9b9741bc8141437a2889f049a1aca63ec024090b9e962f0cd6357738159ce45e3ff8b6c42f5470b3d2417c2fc603b859479f1b7da869e861e65b8a6b8e47f1b634ab703b81048809e951a4e36f724d34e0137be1ff02204a9262a3e47689271c0d5101318867782a511b9bf92dc53405e46909283908f5880b7300df10c23129fd0f42f2c0a66e19f358fa188c939ee9a132ae0814e2ae5bcc38f9fb5f1a06ce7ac4ddb872ffbfcfb8d52068688b5688a1dcdc40a63e92e02577f128911239e43a2b8469410c51b9fffd73a95d8165e8498b66c45f6746f0e6907feaa75887ab6b814a7071888a4a3c091ec5279e92b140d87aaa401de943b5242917c75c7d07a7f9fcb6f7e2a7e99dc1fc04346128d650c5810c735132cefc92be8c6e9a3f1e839041ffa190be8f77a84dc984383b794187198878ef81c7fe8326df6f8db18ed2c2b583b2a6d421f8748d10122fb949308056a2346430e6bf7c602af5fa1d0d4fb358bd3a976e8e28bb3d48e55f1173603c1db38e812bca4d574659e4443e37f816247e1b55c0021b9a2af5a88aaba4d4d816b901806e200d7374f0b6b6b6e6a0d1968f6c52f0593b298f7f300f213a29107a34f14993ef12471d24186ad06c3a497a05894f6ef88058bbb8572b93b29e1fc095c1cfa5742f0f7a0cab72174f6ff3ebca8839d61f5ee04a62284310c62b69459ff22621bc4732f3fb07cdb43bb9e883ad38a57397dc4b91061388314f95d8031e382085d313fe35a10217d83821e4ebe0b2a166f4b0a3a2e743f14a5a079c49684a21ffeb57a63bf3f83f31b11cef23b4efd217ae697dae7cc31ff05f8520c5dfa8409cd1292159d0e08991cefe6b528d1d21ffcaa3dda39d91d4fac222384636c3e7d6e5a63e5e309fc49d6b794a44204ed70d1ca137165262b9301bfa0f594d996daefe42d687265d669bcbca3c64c36b410f0c5477917c638d8fca8777d5aae39b4585016f72cf6da88cff9c5731ef8d0d66693c6780d2761d965e6db45e938569404f90f555f35782980ad895d90cfc5a3f28e3feaff0335ba85f0607abc6853dd059fc8019390c238861704baf43202b66a69684b4e0ecb727589d154dac49be925ab0bf863de54b4994e32c2846449be41d6cd77ae2ea49b063fbe0eb8146b12eaa68f36f9b5d540fae76e4c2224dafdffd1afbedb5cfecbdfd6469dfea34ea0eb558d69beca5ffdfdc53741b2f0c200ecdc9b6a1571abfb431406357ef8b9f316de919307351e852a8989cea7e65f8915ea65c7a408bc0b33f24ca87815907edc8a8f5ba99fa151173e62a9d08f488f61e3175eba38c01fe306cb1e44c564e8043df4c72f6ceb338fb20fa686ee3c8bc7eecd9c9e731a97ecff615802b6f0b88a49f61e75f8647986f66ba2e746feecaee8b58d3e13809199710cfd7ad02aec3ce4f19ee6eed5da0126ba4a737caa64fbe03d573f1affc82840dfd1c3e12fdc0a721f9f20b1db44f2912d01c92d25ad8cb08dcf839c988caab55463c3b6ce1ea36e3220d9f1877d067a6968a2ff864733c4846390e6fdb7b80a0a0a51029c8aa150fd4bcb918435817eadc55857206972fac189ad4f76d6087be229f49fac93ffa0f7c14fc17322da808f9c84f9e226c0090136c2e98a9f05221698ead1950ec5162c8f52ae75ea224ad9bb4e20c378be27b382f6c65d23058268cd52da743d2776e95d327b279c126214aa218b40b361140ae7d05bd51e11d76e93ad84afc427774079d3a1f6a0d8872760950d304638cb313fcc384493ebde7d919b7c825e5b7b9f29397fb7676de340f670780b125aa9c392906a1ea9de252af995e0dd984a69bb7081f93f6848d2a8606ae85f7b2860260c7077fe241e038de91b51372d85839ca8f7264d1aafa8b22153ce2410d573d72730aefb5b574a09a13a53fa597b604c10b0c5d9e876730a9fc96990200bd180461062ac05a0ff425949df5975b5ca3595a225522fff2df9bf5ae0133cf3603edfa03caa580312d5262e5cb0dfc93bb494ada58b9c7050e83d5003cf0bb9e46ee046279424ccb89994a4a9f0adbff61a6dc86fbcab3fb6c7b6987a8a868b256af7708230268cf51c6505e48c4efb3fcd73bfe8cdea2458a33805d49820646f4e6652f886228e632a268103b80cc1e3516b455122fd7d68ca82c21ede9f51e977c82e34dd074dbb788a75b14dce30afb3a7b73d054a215e1ea5c9d21014b34d9c7175fb9115af041b040e351547b5420579ca7d326dab189076ff5e7dae9397e838d9c75571b3f6e97cce4c0d8798b57c21b6a956edbbbd28942a93437c5363c444b3f45421fc153e6f481b70302e4aa9c9c61833bcbeb92c8162ddd8670e5a344194d90d2e71c8b3e6c4fc255cba31c4013d97c42a9d01f6a0e4e639f1f35d34d5bb49949dd7bd85ba29326eb113bd607e6ffc9327140934d7bffa0bb809181e52dacb8a88f96c7ebe619481acf694c1c426a1ec32126a41d0e0c4e8215f52bff3fc84a39053b212b7f058c377581db47eb73ef476fa7adefd3221d87c6da1ba9d83928d7aa128dc29e369b8d685d4873b09325b9cfc7412c0ef5e83408319ca01626f3fac447000b5355196c4ffced659966dad332c6b2d090c6fc45d2d2b7f8f0797f0d1faad807ea9148c0fa8ee5dd9c674ac4ff0c5a2d19c9523f30815f5a4f5f11b8d5c8484e4e0bf5a77a21049c926e45d935091fe21ba3c71e5c284615725325af1e3955e2b3a4e2190925eefd9f6d0aa4914e199a27cb6c334a01a6e3b90ccf8aef57d918e0df5897a908d4e68fc6625bed44b738370c64a9339016470c0e51806b06b05346cacff2591450f6f07a80d0e90068d3dda95d7a2875cd2708a7cdf31d01eea2e78514cd7fd7f53ab8db7228822b5280f0bb00ae26ac5c4c2cbfcbd65100fa1635d855c01b1d5f32760e010accf0bb30eb0ccf467b60cc10ac37595ac1a0953df757997453059a511863bc1e00e67d588dca2c52f8eb786499c1042b88e2012b967b4be608ef88e91bb384c4f0d6e30473140bd0c0fca54aa998f07c74d479e0cf94f8ec59de8c173ba7b7c6642a434dd4147025c87de9ad9264b9308c5a6014e6eef86a6a68b5b4c153f7adfe4425f622c0b0a461c43d9db8ca59420a3d2207b33994882731fdedbc6888e0ee4f9770a4e8fc91ea3b1716d4bf13713cbe80bd68020de896eea4593abd138b1fd726831c276990210b3c4be3d0e455c4fb0e383a718ed8fe23f2e06511a018ee3b00f5c686b16381916afa2abe0d0839b4205027b20b143a9f8e76bbc38fe4c9d1c6604702d5852e5d1480bde7417e2da871b327016592ca69847cb611f16a84d0c0ee10d2eb73ee9333bbcde37b9418b21616e620837c3b07af0076e87f6bb2e579d80e11b6d95496fc445e3d09844d72ca98d6684cb9a5340d8b87c82f6832513bec10bcd9b4ad68df69354874765f866b85bfbf011ac4e1833b61907a4b50b95fc2424da4f99e8c510d19a1f5290660542cd481ce4a2ced3f20809e7f907b17858d56cc77d45f0ac89b57cbf7c586bf3bfa817d8f4ece8f5ae2945fc885d762116156cb7ca3d0df25fccf941ba251b58f1a0c9f19baf93edddd7641569726152c29e1f8b5d50bd004eb51eea2957781383c2197ebeb59bf983ac3f809166f0c0f95c03898e8381eda5513c69baf5ba25a080c4d8f9063b5f7f3ae2f5b579347942526e38b7185c27047a766983f573caf72f9ceca4a90702801fc23d678a17c8cf730b0c1e13efedd394381deec1d298e0c5d0db522ee7686a2f2059efc901112e347207114107d5a3271c5a682cc899f14513486f56d777826437e6e9662368a0f8d730c83b1078cf455bea0d401df1ce7732497c3ae337a4a90e984c7c14cc3abcc26c89893bc3c34bdf47c3475864b7d3a61c4e062c5033874542c4dfb38b9b7d5559b8c5b90d9c3f0a7448f1c2b470035bab7ff118c8be762d092e1e9f1d16fef258cc438b8e0e6948b666253d14cf39f133dbe93027a7baa04281d7d9fede0411b6be5b485f424ed51818d0e551dee54a98976eca0a9701786d2cff31ad4dd093392846c5f63908e73af73631aea0d6a2e54241bf947bb06e8af658a5a2c2fa1883e96677d59f2e8a7c2c7522547b14b9788517af171c5a7d47a786b3d2f3a8334a2f42efb4c86996816fb0014885d27a7fae21e3a92278d9315b5ac1df5ae270c0ae687f1038e4ac73a8337f447fd0da88f98d30a283f237888ac46c03b15b1a5db397d166602ad9ace5f004a4d509396b5387241a7a134166d1ca051dcf3061dc3f8f0042e877e15132716d39937ecc06d1101acab241e2440aac42c87903cd8badfde687ce458b607264785ce025544cacd8bbaa25372ae149ec939c97a43d90d859df8fe59f60ffee2c8b74d477730ce947ae6eacef433531c15932799d42b4e1722250011ecd2485029e6d06a5a978b9bca503d38f772c968242deac8b8aa31b2c41d75ccfa429499b7c2af31ab164703dcd63770cbfdfc78d202ea1d4e140743167b25124c63e2d9b86f944091649acf2af07747d0374a2d8b4be648952265fddeb8a92f1ce7f8c1c5a9faee1a78c03aac2077c143e73e370ea3cf99f75de73acd37cd466201fc2b3a85124d39043a7f8b3ea23262ce6890741a89b4f739abd9f14f207abc1bb9082404a8b970a5851430d8c4fd0193971af791e6770a1413cc273191dd4d1648430ffce2a86bccf8273180af4936a2e0dd9816a552f4feba93018ada6fe485a904c78eb02bcd68c637e1b987dd96fb682425781a9a240ed26c750f0452297620a76a733b9ea316238cd62d0ef492186c8eb97edeebf5038298192c86832d10e7348f5639233786f20becd89b6bd31be71688a94126618f2a2d25ce38fea33334727bb740bddd625661835ca47af9724bc1ee5a3a0df08e18325ddef856558caac312f75e573a8a9408eb6d4980abf584bfa20ef212b6c392e058fc454ea34a3714edc14dca0415c9374fe1d28a7e0ab7af1a7542347a5695d18707d47adc73217b0d608691777f02f013e9eeef3024c0c490c15b6ff58713b9a7e39393519fbc434b6dd1d00739a197aaf4641365dd46c92c5058396e50345a6521c4a4e2f0b75dc1129358ef1267902019a07101a587ce2c91508aba504fe25e52c69c913f153ec85a356f6bf45140f68b2b492725cb3acfe3285010fc7184bc68f60d24b611325e4489e9f1fc9eb1d38de0b621c58654304183343018531750dc6986189648ceec03eb9a8364be93b555441c8a197c182b642cd78332cc5c662bca51dd89081c31daae42c542247ed0f833f33425d2e48ccd3f90c95ddf8e8139f35846360c5b0b626dec25a354a58442d2692f21f16c534edc0d4880a1e9e708690d5fc2ae47721189dda32879a3eb12bbbfefe4960f81be217ee02baecc5d4933d71b2b6465fd0742f86e342e8da25f4d0dcd639f7b550075bf3f48462f8b3ac04dd98e0e396fb82439dfc2ddb7e7525dcb7b5c5af55b45ac988ca44b794016a447c70a61ab373dc4b45854286a50c19f478265097c87f21d65d060a0a19008e271a5244544dfc1a4825f5f4c6f32955ae3831ed78d32d7192538765e04391a7fb0192dfe6fa5c7f8c6138eaf6a498ebf653de37592f15dc7c502f5ac4449d7202fd4e09caf7bce38f24bc20284a90a1c86d958f19c8d1f2587f0651f12684bc9b30307d9bcfb40610d1c3744e3cc0e0e0ac844c6228284ac24c3820c7ff94b2a75de9ff4ce60bac2432e6a1c420c59313858952ce00c26faf13bd0ac9262a52905133e1a1319457b44da2d2b1a0f0f9ec322ce3bc78af5394a003fac40aad7d16002a53e1bdb5c3fae3df6d9b7110b4a04bf58a94e044fed6bd139d2d160c1d9c1390b443d8e5ae8252350a2bd821ee74f457ade07c63f85fba3f252a615d0ee2b3517945f1364f63e58f39994f89ee38bc7503c981de71b234d97d4e380d95f03a04f9287f50f5002ee9d447a85af16fbefc484a6dca20c12ea58a1fd5ab307fccf83d5e11c5abd0655d064fc81149eebcc30969f392068d4587be3416e0d0ec97f36813ffefa6b911665f9be5c67692d3ebfe23673e22a43581a63210f3e5571e55667e6011ae7170a242c2a122f3889c288080b81be8b7756cbaa79c18fcdca606cc0ef484ca463507b8702fc6aca2fa68b018f5865b5b2e9e8999ad6d24130d61745f1cdbbe73aecc3f62a77e94aafbba5ff77d626ad8e01234c6f690af230995a3a1c9ab4bd2f99dbc85f06c6a1bca71225d46d47954a8c42b8468469eb4dbb6775068c59f18581320765fe3ca43f5e47a8a246a11d6164fb619de87f863805311716bea97171df19dcc98eb498a2ef146501e61057829009de8922d30e8ecb86db0cc980803558c1be466a30242b7ca3a93023c403d20c8c3f5d7a38bcff56a024c2123fcf04048e301484eec27394ddc071cfb4958808084269ce9d1cf925cb00da3b792d5fb2258f20715292dc4ea833d2f65c37ce1ebcea2bd0f3150b31d414da934804e0e63c0be7192265b675da23edbf9e1fd397e0fb94a06cba4ce322ed0a598a0544d163957c46b96250139b5df6090fd1f636cbab25d4b5cb0cd64856ba3a16e26c2b7e54e417e14718cc3fa4541340e986483dd626036b213db35e5d09231741970afc1d1d54081a3fb489fe6d0955f3f4ee6c833a8aec59a1039c5cf8feedc84f47b5366f5014e4d7a08869ca54c41f5e8e61b153da669b2f90723360fc95929d2ce5546cf9a2c8fff38e61975b9fdec2d3f0ee6dc9cac6e7eeabdcdcc8dc61f970f80aa28ed92ace6b59fa5f257064c75a30826f677eaa07d8735d89b834a7548f0a721aec2e03df280f4673cae7f5fd291f0debe69ac825af09628de8489144f53f3c136854f9800ebf3b3af92bf761b3c4defdfec49cc4a3f387b43c59c4d13e41cc073e88c8d96d955050261249f1bc817ad6117f1e837f072b53ff54a5e13274a5cdad84a7fc7e37ad5fbfae9efae316c71f5bd2b27e1dd389145b0c04c5a45184af52c15010e16d9157a5e03aaa556d2d2e2e49b66c9a165d7b5e7a3959f583b1cce8ca92b180ee207d5af199724521ea91e99e3d0620abed19de4ba57710e30c6ac5d9ebdc8a2c87154abd2c03f50211528458b1f2d5515948210c31a31d82f2ac5cbf98c9e64085c8aeae810680f2d962faffece28b3bb939cc2ecddeb3d00b7c62a204fad76359d3e6a527cdcf33b8d9b494d3568c4af63ac9364ff5d869ccfc88a9e6103e1e0d1fa20f5932ce61767626cb02f7fe534fa823c44b703748a78a3b5ceb5cb89e162d8e1149bdb071a51b248d9b0896f06a5ad480bd11d6fe18679430de4bda5249b42995d4eaf0d98b897887fc4067045f5c48263d855612f16ba66c82590c3f022a729cc13450bd6ae594837f36a502a6c18b7cdf52c1dd84a4fbdb55221517a57ecc1101969ffda0daa3a1cbfe9c49ea2925eae2fece85028a392381115185077af582292531065192ad020baf038add78eeafdd7db35abef20a1ed4bc1aab7ff41c6b03215ebb90c597dc37ef12c0985effe1a95652104dd5758a5f9181e2e4bfd315d1f95fe33cc30b1226e54fa8c19741a0de15e1559f84e0b1642d819d5de307bb90fa8f6c6841eb1a71bd15f7a03bcf69388ce42d5ae17953bb5eafd7085ae3d4f2c8521c9fb152a946e2f6f0b35cb011b3eef40ad5ebd3dc8f08b1071cd5e0d327671e12aecfb50aff75a326c17f88c77c91063bacfa565fb0b5905d8537cede454894a2cca0f2ae95e0b0920868ad0786b928dd720b711bb19e8968b0756ea0d55b4185a4cc6ec90e684f7989665b96f4dbf58f51b6af5d0e84312b1a5b15bd2db23ae3ded8dae87e4a57c75a2e19785f12f91a5d0bdc4bc1f32c6aa8bd21468df559bddd0753179c11eb6a2b281df707de32e325c871e9efe0e06fba5ed297c1d4e9cef29dc9f28d83e45ecef8e947b8b00b46552ddf5231c54248e598eaf6e9a07cbb87896bd869052affba1b846669fdc1f87e1f754f979d1fa00ed34f435435bf5d9d2dad85f949c0d4d61543425ed6a5d5db0225f2770206691eb2fbe5e77a95812ef0b6644e248513bb34444d26e1c7aa1b9e10d462057014c2530bb95e9159e36b0bb8445e50b777f82c6ba0fc23c50f5f1f5fb7b87822e3e86e129b396a7d247c13e2b6e6581d664ddedf64d41cd38e79bb34518dc54be963f5e7ec0d545a3f2bd34d9b3ff2c0580b109f79f0c4a2e9e18f762cee8f7d0fa030a65106231fa751072ef2fa4658a3b57b0e47cd4ea43855a0967d5e04994f4ac58a28c79f650bc84dfd93e95a812c00b5cce66dd10b27a7e0672a0ddac4ac9358377b3daedf28a1afc6dd30b67e0d5fe301806f5a2e4896e7ec7c75ebe93a86160807abdced34809be700e1f4b1a03e8120ca39ab98808e8972d3aea8752d265e2f3f382e0b047b1b375ed57d975de8790ee76ccd0a00bcef3a67aeeb92fc0426a6543678e97bdd44612b968bcef3dd6108fbff527bfa972eaaa851d6604692c14bad4848eff4dc05a9f13cbb6d1884961ddffac25c77ea388f846ecd8526afc560ed85663f2fe6a51a27d0a67886dcd223e6b0196c447a210679ef1f10bc22e6f9bc1a453207ff94b6158b93822c7f1d98dd8de8525e8d81b0c1400abafe9c79d5bd805cd14ec93ae11d76d5169e698d7a445ba61c6a9e48959500f93637f1cea23a2fb39c1879df7abd08278640d070c535c8f45cb5946324b3403805a3f0a248f90993d82567ec9c9279055e1e56256915cc324bfd6e94f15d144442b5f7176cd8a74d038b70df5260e5f36edd32341f2d00863f2ed06c5193650f0f54a560ec0161da7dab6f0029062dbf73a435cf431d7a87daae1ff67d78d8d1a8bc7638470227cdf7d8df56ceb12831ce56508f82010847e33e329770e30b403cc0099fde1053d987729c0e3fadfbcf200a82f7e765c0a717395c6ccf80c00d26777743b5c5bbd1c87cc77884383802cf0e69e79468fbe78b4cfe0b0360bf83ce2e69aae06a46376fbae8c6da68eef5ac2d90c60047bba4fea85c10f9cc39b981c10a4223150e061c254334aba2fd070ec1e3b826790c02e4d7b05b777021965a90668d8a70efa8ef88aa62160b80889e1c309cd423efb0aeb1403dd6499a01a0b3d7ede72c7c84ef2e199b87311204a483504f2df016c01672c2fbbb376335d1012faae02f4536f498231ff974d9e97571cb2a56a18e93f61b08de5269097bc433337d712db4e18ca1139e9e0e0f813d3e84e3d898fc70d01e9877412ad433921ce48dacb8267cd0cf7d7c919291b835d6557527dc453cdb5254712737edb384c90d16ea1a809e79369b7a4d21409bbcf2f385ebca8a24a2fc28aa3ed7696b0ded075dbed4868fd9dba241ededa48afd756a4b60ea54d57c7160c847e0569c8ee047173e6236542128845c958ef12222f3648378849727f8bb4aa1db3aa8106d3cf740dbc88d3b3389da7e9e7058cee800cc074700d24898907005e55e073d520dc81b604f7971cb53cb864cb15e4208020ffa9107b56f68109481319cc8f99ba360026ff9fb54bdc46507a9f996b0366aab65c74415de9b2504a9372516321de28e1519b073e077ee7fca86cd8ac381863941240e5c0f162617203d2cb8c7df76034473b158e38c152d3685c21f4cb5d25ade07b80f40b5cee24f6cb6c3d9a4198d6a0033b5589b20d18636ccef01dfa6d648a3733cfd7597a3308ba22ae685eb9ce8d6ed9374163359e12b986610e1d79935116b6ca8e4d202a5116ba3dd8aedd9a6cbc3312a0d6c5d586a85f00e967de88fd645112a206595908b09b2d07b2979e185c830d682470c462772cdee39e0f7725a808314065ecc76719da1c7a725e1d1bcfcc018f1cf73f7ef31b18751d705553127ed4f51e596e743c34c4a1644f395b4a5ca407b274fd799b9dbbf90368b57ea6da279aff4d6fc202ce99e40855fbda0b4d73f0d8b1dc958618c88bd9c4587c791d399263382a1c577cf93aba3091ead160160aa029c4c257502131aaf80f68184cc3a86ca4994d909806faf54d8f2f81f378346e2c2c2934711acf016e129a0ed562cc854511141ad792cccd1c6ae4e2878ae6ba0c0c2315679b62fc8650c652f57e6183df7b26017b016c822691a2555383fb5de63772a99b0f65e56b91ffc6f4c56a9f52aa03d10b29a77df905782c9478094f6aac6c6989ec9d0f4d36324951010dd956446b78410fa98d0a0713f62d143a0db0a25e643dad111778b6a9821fa3ba447ee92a3290ab0d62588d6cde8ef1a760568a2b820aa445d47cd0c3877e1d98c2299a0150e1160265cd0faf20535457ae720e1e2ed8da4231cef03d0ee00dd5b14ea82cf1f4c8932e1080b269bf56cd28390e792f0c006111ea842582930a36cc765b3e314c97f548af1f22e836a37c255282ea56712536c995d70f51054ec860b7acb7d6632083c062aefb4202fa9ff659fb4be8c78639309f2a774d31a1f741258222668ea2929dcc92a751d62bdd05ba49248fad1211947f94687498757f763cced2a2829cafbf7e9f152d7e63885ab99294f019c44e548c5526c8cc21da7101cf451d7ff881ffcb23e405bb0b0c84f39db3b11f24591fda1a29513ebaa92ee14054fae750a872a09135d06f6bc46a029fda0e1c7fb77b9a8da3f684ea88273b0b7a7fcf4c2b24464208a41a4d661f412643789317da000b810957d897ca9d65a567c4a968005933ab326151bc26c8c673f562c65291ad0acc51dd3fe64086f0485982f411cd9fc07e6e5b8197098e37c56cddb3f97cc2b4baaf7b1527baff0d12698ff4e5d493540a1f61c2daa18f4f9317fa0439c414d6f8b04d782041ec542ac0c51a9f80932d64196be1de036eabf8cbb580ff352ee5eb0e44da231e15193cd47c10a6e71eeba23801ddfe7554ca5c6169afeb272b6e48be028eb3592310d0ac95609ed104c23fc8055450f18a586af20c995e61048ef530b0ca904dd958516bff03510c7c20e24926f89c37e0328b6e02e867db4e1e94aa5fa9710ecdc327d0b94f5ef9085b2f1a0243aa58d6e903a4d660007a4ad357dcb8f90e1fd4a9cc386cdb2cd67fc187bae3a943e869b50653551814b5fa84bebc7e091a37a77b281c041df8ffa48c0af4d0d5d60f40adbea2ff17101190989284aa8d3a457dc1e07cc6d381fd44fa53fe0f406f7c095d04d90cfdf84eb4b0e787b1cd44f5b28cfdb3a940a5aa52c93b71d911b71b45f8da6bf10bed6c93876b18a15e1991eb129abae8edd2012e25b4540f90ded72ce47c8025a09c28d62116387e938ab2c0475c03f5740f05b65b73a394b708daf0e144744a12171d2ff67ce169e1d9f099bc749e8e90e97ebf07e249a8a5a0a00f8dce2105619e1392d8a4b94f5368e03c7e390d9410ebe39fb430c5c7cef56f35c61fa01710381cfa8e6f7b8a427bf4c957609f3c4588f7b6ea01a939e4c68d1ad08e201bee1723d64408d97c42e248397230eb9acb7d4234223fc58c96b11bbfdc7f60f9346a4e3b035c6154843d4e49a358efea409ebf1eeea3297be2b9b1a32b783f21cddcd40e20588f53e8612ca54b0b6a4a86e3816d31b5a039be749125cf411cf9fe357991c992726a51c82365d7b5b5022e99577bb13de207880d3ae28ba4e2fcf78612cb5a133954f7c249e3a9fa73abc8969d8fd6b63ef3b39b2ec3552567510665c09406bd0b58853c0d68bcec33454f35009430d6daf0690fd6772b5ffe6f8cfa0a4735abaa00c4dd3d0b99f3a8b52a068f791e113331b28d990f01b3f775328df1b126b2c2d7336d50350d111b3d143e68981d15b614adae1339d34a7e5bedcb8c9842c5f920da8bfd010561730f95e0f65721ff8dd12349032f901bb0461a2b803bb5ced5f7f92b24fc9a7af3a26128bd2e93b67c3e6d1e11dcb3eac7c19092980268a7cb49c4df376d011491fd2ad24a0c9b3d14e93c4cb47eab0b41e7e52925680d55de3129f96a381e5538cee83067bbffa7d2fe47036d0981b67a906c7905f11ae11ddffd7f62565244db725232dbaffb8aee7a5d82e04120cf0949fd0472f12a352f84e314bbfa956da818016b485f57e1a618b54c9630a4dcc44006f40b541c97b18c6a5a9df214d2f355cc752abe664a370f7c55c8c945cd36336fad21751565fad9f69d8bb4c701560bea8cc44ef9ac8bf60e5858fe48bd37d568d77db896e47cd398c9b3ab744705fad9c8ff3a0935bf3690009bb814373ee1598ffa3dd001fbc1fb984b073e69b1053e8a197c948b5202093191cfe8919ccfff7d7afe7119a50c15af51fe89f011a85d8461185337115a4c23d67bad780ae93d79872d2912ac1d41ad7de59edd466fd7cf124742b69a14ac1a8829769f65a9083c7221a23971c7b4375d271752b433fd67de285ca7662e2875afb01ce0b799df4da97d76dc65288a308f3fb6f1d243d239bd829bb93a4d836e3a4149057908929d88ee0034c20bb4ec4337cf0e9ec94458f03c359efe211a023e4e7478c97538bb5f0a3ece558461794d16cee779a7bce0d412ca9e1d1e9681bf278b1e38ff7c283e4a1fbd9ca2aabfcee38d8c260a1759b9a61ef3fd984bcf923343a092a894ca5d17e9fb02bb653abfdba3bdf910f1f59c99f76dd16270d1b78c35f3498fc09af1c543426ff24fbdea4d21c415be0784e43971667103c2511c128084009359e65dd9bbeb89e7f83fc23a7378f0d475ca156227dcf42c1302363811ab72c652bbc89fd08405602f78450f5fd9e4f8fbf18366a26250d6aaa357fb3073f94c9c11ecb25bdd30d16f4c414de378a799b75d1dbac40e2ccecc5cc7382bd13378c34ffc48735532364f1a31bda8f20cd901dedd2d9cc782f0ada5a2b5b6f06214de9842c9766fc238c7a4fb1665bb110554f6f034b24f2d4d98d72586fb05e51215dffc38dd2a4234fb3fe2472a79834920a5bf9c0138641a8941ee1872590b159f5a844259e82fea0c08374d32e67c46e6d1e542cd73ba6b7f82ddd065f0cc1f5d86081effc3b19856816c799d5f7784f8ac23cb36ddd26baf78d5fd259b97afafe8520bdaa6bf169b055e267f2eab1eac7ed65dd8c78f285843cf31f81d2df15c686c663512376294945203c2308a3d61de601e8a5c70c8d8c8e17675f5fc34c77a7e50af2a008983c8e3995d44bfc38ce14afce361831fb2cac9aec253ab103f17a2b0a568c34eeff88f7dc7e0ad34f528353be30cc600ba2f0fc1075ae1e015a5b3055538ec98c52981b5da24864aeb700a331832b79bcd5f0068418054aab32fc3f05880dbf0e8f5ffafb0b3a48493d816d12bfe9fd257b0f998bcb9fe58f5e3c940871704b69220b3d2d963660f0195b129261edc186b3671e42ddd6f6c041a25844e7678c9b7a8d8ae88da5c1c4558dfba7c3f72d6bd43141bb50517edf210120fcfcfb2d7d0c1135f245c7f5600e3e637a65339f9248ac29792563ae0f530698265aa2d6dae76ce019803f37a308d47abbb2efc1df96c6184cb191caee1eac1ca361e801c06f820eb5adb2f51881fde3546882c965f11e50806f182d540b668ecb85835508ee55fadae1cd2dea1d8d6936d6178aff2fe9d4615d2ecdce9d24181932868efd68642bd3d6711c767485a180685d6b5acba285099f289c63aedf2ac3752d90f469d06b03e4206c69ee84968d02308e5cbe6b1b6d245aa38bd195aaa81c9444dedbfe6905e2e017776871a47edd3d2d36943d3f69d4d0ad8d52bc0ff94a8b6b3b726d29a2d8ee6fa6c0c6aab92b42380ab9eae952b081ca4b2a0ec3b44802bbda45cbef4391361bdf5f3f0fb7c2d9405edfbe2bca6b0132691bdde72a8a623571ceca3cacf5cbc001cfb5ef6a2de43627560afcf0cdc4483d6bc6ea0474c63f52e1cef3b2a86b9d55bdfd5e9bfb5ae1c9b422dfb1985e992c8b93001dfd498ce6718c388d26b5fccf6f072e11164f45630dd36d0c1995dc8291647ea71ba149b5081b3c2a518e8a327be34805cd3942636829383c92c0833abf07bb3224c8882685fd7fbd584e9c2af03521f5c2c3531436c868ce8e3a12dbec41bf9a3987a73a94ead608349ca3c9022c0fc22663d056160b4827e27e3cfd36df702adb002e9e952132febdc76a1badcaf093ae24f7942c1f2237a6abd77a116f3da5484dd22686b3b9927bb90f4b34e3aee511f6097216f508936688ab20edebc0a575d2487240a0f17649260e4b3ac247f4b888f2ddfed5c8ed4c808f17addbe83c86fb8151843d31e5cab3047853f9ba0401d4e6e516b2416867cb57b79ded283e875214ebe8a8259436017eb3c9126e7e6533730d7c151d08557315fbc5ebb0f86d1828afaea1e940e9b771ef2d2df14c295caaf3e0d2dd9f8b7c4685e1c3bfa414e9ec68fb1558ccf890c8d2a6eedaaac35cf5e3130f15ac657db8234689a60deb224d21708bfdacfb50580e936076b47ef201f645b3c40576ec6f90c2f99395caa1a9ceb580b7c13b4187b09c6a59eb71e9ab1f4719ce87975a2671a41e63099ddeaea5870b690b0a7a4e41dd3ae7026c3befe550e1de50daa75398c072370927fe8c199c976824b149235b2678f43af8423c237d95532a6cc5419c7064f0822ce0b8324850094ba162d0d88f4635da1cea02e63cdddc37d61a010c11ffb10de57dda994e476936639024bf28d00c3259874373c4a9b6e726265d6ef9b9ba8ef6f9118d2a4ff246ea2e7bb0ff970995d292b14838be52ffa0b90544347533642731c40c477194e2d42870ed365a65cd9166e61f8241f24681acd65d25cf30625ce131325928351d5606c3dc1d61c2d1c01530ba495f79f3748780d44c29f14b67ed3dd1cd0a3a39031f76a72441103d61a2e06a96f7fb2eb3e58d253106e65c239d57f1489bdc5843f28f7e0fed45c28d40cf8649d85b19f5175ae183948085b867fb3aa6f63980f0bfff79f7e038e44a59e3f78a6e6e36e0d2dbac091ab5f71dc923ba1b39aba80742c3c72d55bb7f48c9e4621a74073dfbe44494c353a88e85bf9137afa15222b5acbd3e06352e38feff3fada8af6ec5e256ce4bf064b46eebc4552eeb91101c939fa476d46ad340655edce56d8e28dceec5fdd67c0dac1e475a3f61162ea282ea881524937322a68c6511748b1644a058f1b1e352be4ac3591a17599936520bfdfe07ac20c51c432aa331e260fc2d5930f74b02ab878c5906103cc82d10aee5001a1f3c49d3679b5e5608b0e56eb01009d1776fc0f1c1aa9515ef6a751cb984838c2654299181e8830601eb3fe2fdb7da83e144089e4f97c3a79149d715cb63fd1e22d440d2b0394ce400d69661833423fb5bf4cf02120ce0af2ed0496c30a430d140148b413b3ff626f46e5a0d940b102be2b191434edc61ad5b0e274bf4799b9a7ea63d9fc24454cc9191131c323f1528f2e82916eb7a0b667666d113f43472eae6d51b7b6314d6d35c7b51d536b8b21a8ade8a9adf5bfb633756ddbfab58d92d7d63aafed3dbbb614716dc5e6da9acfb53dd2d736d6af6d9db8b6526a0e6a6bccd596ea5f5b09a5b656b7da26a66b6b22d7d6daa9adea59db63626dcb8ada16d16a8bb9d77633515b19a9b6d8666d4dffda5ed36b1bd5d4b685b6b688b3dadee9b5b551d69634d4d6f054db93a0b6459ddac6f4b5d51dd6764caf2d86b0b6b2a7b616b588d756e95edb6ca6b656b4da225ab575be6afb4ea96d4a51db02626d4587da8ee76b8ba2d756dba8ade95ddb19426d8bbada56d06b8bbad6f63a575b14726ded766ddd3fb55d116a5ba4ac6d81505bb15b6dd3f9daea106b2bb76b2bfba8ed81b6b615bddac6d4b5b5ddd63699525b83acb676476dd587da9ee4b68d9faeb9390071fb801d67d6f9b60ffceb16e23abdfd49f2f0e2438dfdef87212404ad7e0e79b4faf33caeedcba30bbd167b68fdc6101ffb954ad4c25bcb6b003a3ffd02272f76562136b262c6bf157c91ff9d248f67243d84bb7e07d232e71ed73af0f7d77050a081359cd393ddce826afb72c5774f1649d7931cbf5245c101af0f5eddb34074bb83e1e05dc374d22f4f03bc7530312fbd60472dc62bc528c7adc62a8b298eac8daa8aa889af8e5e8f5c8e5f8e5d8e5f8f5d1e5f1c5d1f5de5a6c727b50c71b958b717893c98568cc9163a1905e3b590cf3efcfbcc84026f64d0d5afeac10b0b24e4eafe3440072a434d8657b6d86ee23028357a44e6b45f91c5b024fe54435e2c1619020ec86283e6e6aa2c16d0e3439905c8da4cd2592cd4c6875db4803e2ddc95771ed6c2ac167f2ab61845c5c7da16601c99c06e31d08c950197d202507471610051ee948b14dcd8ecb9600bc7a4a98b1573ac20bbd4b18e81ea5db495c4f3808fa017d021f0f2f6a29c04be4ebef4468703ee0b6379f8c25fa4b7c08f041896cddf938191767b1f5a30bce3decf208c6d0258a5c2d47680211a46b5de7bd58769ddf78e203178b70486568a696df106b918a641dec38c1126761f431cc3a2c77c2abbe7081979b3fbd823c328c7bd5e2623c37c61c9055919ada85ce79649d4e5f67a8d24de6e7d7eb71c89e1b5d35224487eadda41c90f611b5233217c443e8119f6e95300c809cd798ef0b78d87024b567d4aeaf460796bac291d5926cfb83b3beedea3e0dcdfa3ebe39828c86d115200eef73891b34a6b2bae45c284e4479af5964692af7f30a952c39cbf938b8d7828782813bcfeccd3289ab45a6b46ceb0f9b5769353f6cdc73939ff167372cad7f93b69673fba31a9177a2235f4191ddf676a1950bed840875309fd8d154a9687e87349a25d0f4669e519fd5c7eb4e90b29d4409f939f289da8bb54b983295ecca6c9c59beef63d650afd34b956d4dadfa86061a666d79c5a7a51155458d5c9f956bf86ae12cac6fab8266bdfab564a195b7f17726dfbe74a2dcfebef62af6d9fc05265059b5d456c7ba4abd6056499e2914d2e5f766bc92cabe8b3994bd016fda60514a13677e2daa7f9b5e4d2dabe8e6e3bb6f5965fe9dbd65de2ae36c6e5ab30b7b9d9dcdd72baf037d4ce3fb63ba7e4aeee2a5e7c11797317ea5ddad7cb2e8c6fea62be755f7ec1c5fa4d5d03b8ee1130b0088287b309fe4d1f0c01e4fd98a06de17b5c6fef859d6d8b27875d99af6b87d14e2306af25f1e94cc5cff6157357c4787527cbb83126f12712173cc57d60f1a8b87843304e9a8cef91c665b67115723ca01daf79ec71381139158d1cc948ae87251f539343f1c9058ef235a0720c59b989583ecf5a0e862e57e9cb0718e6683ce60e98f992d01c1ed55c66369fc29b0328ce6d38e71bae7324e0b99ef47c8c7c0e653f1720d0d768d03158e8261ffa3c283a98185d45471f30a4a3c1a43b54e94bbc74f89ce93e992e89a79750c880fa73feb14d0b4c16db876fb9f365abef54f75d9ce457a6bfa0fcf7c116e0fb6cdb76602712ec6fc1fe53835ddc44d8d1df85fd74d8d5cd871dfd95d8cf8a5d69b1a317fb89b11ba28a7ebc7afd737bed6d76ccafc773b43156e112974d430651e4af8e7c4b4a720f7abac493c345f9c5946fa972d39b84a16f84ab5958482ac0ca44f2268d7d63981aeae73b57f839132ede7cf2d6e30da2c5267f12bebc8766a898cfabcc68d8c9479aebdf30265f4c45d7b04212b678efad72dd48a660c8b8c84682fcc7b172f7da82b5320a6f329267f33fec5c76ab501ef050b2dcede158e237b82a0b3172c191e4fa178ce417abd405f690c22dd67b8b5c1b93151c02d7b24922fb718c5c76af500eb0d0b2eee6f1786236b82e0b1132c19372f557cc6416abdc05b610c22fee75cbdc1b90153c0257b24826ff38cc5c77a9501eb050b2ecee795c623701d716a5e606a9ee6ffa83d1237941f42fe8d90f96c68d06290905642e50c72e12101711a2d6d1c18a8675d2d0997db0b38248e7422d87e9c6d52e7850ee35f88f7e5ae9eecab5a6da5b52b2e52ba1d2c105ec76548753ce32c240eb70052367ec402abc5d178f04b9a0d0374baade99e876e446ddff72299cb19092e54052b29b1a256b2d0e6a3953adcb916a4d0ea6b902a381ce3d70fc5aacda1def4e7752712025b1f111b403c7dd87031ded9ae7ec76f3b036e966e62788bc793d978e23878dd9cd05741f2bd183393769fb1c2d454df488cee6ac6491c78b318585f84c525e7212dc4bb67712e3582ad390a3477533d5e9e5fa93bab27885d34f4d188e248df1cb27935b428dac5d534c74a7c81f5a2b0ffcc6792237272f35f480e7e14b62a086c94a62409dc2d7a966fc279a5e2ed9130e2c832f1d9f1aa1d9fd74738b79b83ac5ae41bdbf3cb8200bf43d75810f54afe85aadf19f478b68d1bea716ed31350b5c3b757f7b64b12dec7eca721ea54eb16b53fd1f8f2dc0725d4f5cd003d42b7a0d2bfee7d1a25aa2efa9457c48fd45d7bcde9d1e509cc8b89fb2d81f8a4d84fa9ce5a7638a29b8492293cd6abcd6b19ee7d1a259d6f984c5794ced22d776e5df1e598ea57a9eb69887ab53ec1ad4fbcb830bb240df5317f840f58aaed51abfa165b8fdfe7269a0d2a48b31106c45d6c7ae3e1f5bccc3d59c7601c5fda5e01ad9d0efa30b7ca0ca1682ae582daf588c15f9a63d9efb3c4aba01749980d0e7d12a90266b6ed7202065b980d126106579bcade50873bbd4b5917a25562a05ecb73250ea90669a3c501dd04c53049a433465c20173fc864c7d408ebba9a90a88633764528173a0a64f2a308ed484c909c481c1fa89b11f8b2264e0c9b63042ac6819c59f9b8cecc76474683066c7c66d02b16da93900b3e510a33be3ddcdde86b1cfa13302b77139b070a6bffb605c216d03cbd9e6cc39c35e7cf8a64dab2a3f3ce83b2ae3e7ad8c5aa72ca326d9c4aa4279b4d1b17a675e206b37e398c912fe80e5e43ab66cbf1c970481f31d8fdd9227ee7002e664d03e77088047a8e95cc775861bab4ec650db1ad6949a7b84765cf8159d42bda5009b4002668bd4e944abfc820fa75ee74331782e66c5bff5184f8c5eca9522f81bb266099c7406fbedade119f605837f6d89fedf11a1813170c44bfc4675e57589c95448c7d5b24be8223a6f2960bb0eb30d8864d4cc53a440e0cf35a7f198475836f5ecc8416e20913f8ca0f9271bf616cdad0fb8116028b5a45aba0e0dfe04e7ab5c76b7de0b7a8ec201e5b85172179288f52e7c29bf0aa6ca9465f3d4c5c3e65e15cbe6e0ff410fe838a4141f49fb023285bc745bb63c30b2575d29dffe4ef80509c794b0d2714b98d1275cf09368235c95489727a39b07c5b9ab77ddd3c3c33f9001bc1a5f1a6f84c912d5c27a77f1241947f5ae3af8ffd0533404a9c7c492b51043cd74e349f9453025a7971be70e1e36f3aa28f723df1f408299d60033dd537cd39b62d0b17e115d389768f3091935ae6512fbf660bd58c69502cd0aadcd91a78332fc235f61dcb0e5b701016e9cf69db0a4e5999f1c32383e5393ecfeba9be3bcb6ccdcfea0d213722e0f8bef4179b3cd8ed082dfe648e5f707309c657d2dcb7e304d2c59626ed90372901b7fa76fc958cfbdda5b2c2645783f019b51bfaa5b9e9b5876394ffb344b84ee19b9a33f1441eb42da8800fb9c507394f927731d95ce8c2d75810401ab4590f43dd4f0327e4fa396221921333607884833d0df125a52d2e6e1623eeb2792ecc3828565a25c73012d2bd3e4970b6066b61472ca1d56afa1e4abdbea5b0247a4efc83005ae0a568472bd7100346bebf9ac18e6c240b1e6940f011e35b758a3f55dddfb8fbec5f461d291a9bc8419c8844e999895a5505c59dcd34a47141409eec4f5b56f63b8df7007a20b34c0720006069bb9e82c892323b6384755bcc3467a4af7e9e4ab7035c907d742a52c630b174c45f8c5b6229a0fa57801dc6fe0b67d6e58fa9aa6d3f5cae5e6a849474ecebe126e630b62729620077a747090f7d3fa0909176889301e51dd1c3de78aa091fef42906042e3f8dc41b5a0880e58575bab32a1900ef46cc8614e49ea54e1422d39e4466a8ab420dd88b0e68c81cdb6877b69b167ce1c39d754213f5165178d3d0e84a78e4f21d0359a408d55767679c2781626ab4b1a6249d56838dc21125f9038baedd2d9345901dea2e4c795861098bfb3ab26d6ac7eda9a1490e135393080d18cc236c4426e4f16b1b23a5ec0226a336e97a439c48a08b83265d09334bb9c70a03f944e613dae7d45201f9017ede612a3a1912824311327e6aae343db03af111c2b7ad322d653b883a9f76125eb02fce5d284c64dcd4589020ca1cc358c685e8f16abce4ff60fe80981d9b5dde26cfcaf0e7fd2b12d56a399baf0144e4329095135125364cd8b15564a357f68e5a078f6fc4da44a0276f395b931bcbea52e53217701378159c0b03fee6673e0b6fc7b5dc53f82807f62039a3a80a859a11d6cee526a3963144a973a6649f531dc274b64577112b5191ea742b9a81263512a9f4e35d8c6feaee021b8132bbadcd69bde5659e5ccd24194a325b766665e70e181d3e5d89d06d4a1d7cba5f8644ec66c459acd9e0669bab8264d24e523a9e59086c658a80d651f5fd76a04a54f9a4917460bec06860ad692ba743e5baeae94ec21167413363cfc39887c9ee77d173576270ba366745279f81c79a8690e8f4a7e32bafa71dba2d3ba3fcf77d5e4779acdb157d38f19f34b71053a77d1eca7425095924dde450f3dc127db46a989e450f1f67533fcc72f980afab6e06a8b198defe1a654adf2f065f48f2e74aaf51dbba812b7074b1edcc8f48101c3cbc638bdf15309596c0ad50eaba00da08112d7f16b682ce6734313bbafdccfc98fa395704fc4e6f5d01307ba9c3025d2b2c5224c5b7b4e03cd871990bfe6a5874204f88adaec440d2aa1c2d9bddc70502d86eef939b67414e52e6752e4bb022174954591c162d7ac4a22a6a393be017482bcf894b72d54df53daa8f13251e1d1825f5119ff65c589f4936e6babe06ff7810714cd50460ba2978e1834e3a8b7e23ff535907081938f445ed63e6a779575ce7d75fe69417d445636d99feaf217f11abb8108dc392a96b7515ff35c5eac8d3ad32425bc2de227a43adc44f9dbbdf50aba1fbb95e6fceeba00d01f34122e262141e9244c842237f6df9d602e63112fcdb522616167b49037d492b4130b5c94c5d01cdb7960004f585b339abac23fecf24589d91733bd37a1b82c655cf2f2943a787c1bc8c2a7d92090070ac9626ab9e1b6d82624f55b1e81185e7a41ab27be9327909d6f6e229e3fdd6e0fc7b267cd4d18b1210f03f6d874e00e44be8b0aec738929304cae3380cc27500d1e3f6488b4690b4ed9daf2aa003a8a06e9695d7f6af773e922e948f004788c111407fa0a2c9b8a9a0a2d6b95c78a5054b7104f98e72cedbd10c8b8aa12aff702ff26e1d40cc06f24727911bab7c9b99aa75f2d637f3d70f29119b9014ce3fdc09b422216aafb748bd1675d9615aab605a610da197aa7d44e60a90eb42ec41d91d311d5aa6887b541c10680c5040e184d882ca01815c8645dd27f02c797cf0ff70ad64949fb640f3163e33b88eca8c22242d5ba57064e06e0603143d26b12ca3c6ced79f7c9be170376b3006bc024eb67e50bf2282c057febc6c9f4114304d524fb49b8397d7b708f5e8b056fb1d74955cdd79ce46f4cf51bbaa91b40aab5238f91f7d22a8cfd0fdb9215affcabebd550e21811ecd83dac68365672c5b81b35e46117e43e0d11b79e39b53c4465b5f2826cba94914c088d7f8d08c64c84ddf913e6613774b9192cf7272599c98651024ee3f91a2f0fd10362f0bf5b7b9d49a3cab85441c175a0ddffb79cba49a001a65e3cb6678046511395dc8beeeef33445437af70530045897ab5ff9ae8eb7353687c0cc3018ca2027af431665d40ccba4a07930dc9c398e051a3c041866d1fd0d491b81f53b027ea804ceac14fd9312c831032f18f0f23c41fd8a4bfedcd66dd910906cc5fefde219b40b242ec99ce79e584fd166c905bd88b4a28da27224424217bef2da59452ca24653d060406dc059c0e1b4624243f5a0ffccd78a0daf5553b54bbf6c85ff1df709bbf991df5f1f7b01f919064d9d6de98d7536d24243fbb7a25a8b6f42a90f43c19fdc82d424b16041501d102c267005cd31314578c81831327c0614a163a6647241c82d882e02084435067f19dd606a519d38f129136a00d5a2b9d51b47cfbb5d60aee48e53f01a2162dc61af7c3fad4d61a7746a768af482263fb4fabc5888361c38edede8596bf02504c0647e7427756e8bc2312d092157d7744027ae286a21a6b1231d21721bfe3115e38d9f8c8800d4b5d9228010a8208d3642e01ee20c39e8f818d007644d201ccce7644d22116c4270d49b63fa501891db3d4a0c314403bdb9fe68663bf992e294bb2ec2865c9d19e6f87a4080d6dfbe4668fefe7c7c19f7dfeeb652f677fedcbc9d12981c708375e30eeb3a71f8ef69bf63ade0ccd5eceeeffcdd01466e84cbd0d2af5e5e88f59b3b24ffb10b4edb50ba41ef53394f366e8a77933f575541ff33a2c2d8b645aab2f47ba828a5c2d191423555a6be90f659005ae0bbe7b1d16003eb2541fcaa29897b19ccf21c2c95efb1c221cf9d9e36c1ff3e548d8735f4e8ee4be9c29bfa5ec952d693294317be4b937f3d99ba9df0c08fef771242c8aa12f5f04b55a2cfd314f84a3fafc39bf7e9cfcba85933fe6cbf1d6f42057fed05bd915345bb0d86cc16200f0ecd1acb119cc635a385babf7cf21c2c9affa1c221c99cf3d1bb0625e7f394438fa575fceeaf5abbe1c221cd5eb2f67f5f92bc78b3e1f9215e32f2ef4221d967dbdb68faced9ba91f0f1ebcad903df2299a955fb2f273af7a221c4d3403c2f6dce36ccfcddf8a70b6577d3973fb6691fe82260c1659d987d315cea014be19fa85907ad4a7be1ca2191ed9572086609f62d8c2061b945a2dd6cce97116f72a6c8ffa6642c83cb4f9338ce8c85a9a35f3c3f9daf367f8d091359f08094209259a5a2d5664715f0a2a6c5f8b8b1135d1c4892bcf5fb5a021c0f3da91ca0ea76785acb5427b5ad89e7686475cda7ab6666cd6cc158f8eac8c25773863b715a343dd82211a7c7e50faa16985bd2b74a837c531fdf5fc7befc559d5dcbd629cdd7cf1b59e7f9d138a46bf9ba2e9cbcf316b5a963dedb3a77d5bfe2cdbdefe96290d1e00ea3e75621785c65aebe3d7bc1dedb72cfb42126cb4cdcbd16169d96b9aa63da5afd11434fb9ab54fe360fd6614d1a928e50b951d390f521f265b42c769012d6aa41cb68834e18cd8ae1194b123cd603218d59e2500d8f135ce9bdbcf8fbdf3a97305092df919da8c1cacaba35ddfe8c91672b0ae86f64aa868d728498076d0ae5d4c46cb6fac1777075b75b0b8bb2fddd3ae6fbd95cbc1baf28973a5346b2c9d012bd29a7495b45272ca5287d8e1aa69cb5c29cd95d2aebf4af21b19a6f932b05ddfcb3187a462bb8355bfdfc1ba26192e19405e63e6d56da9b2ebc73164b464f4c8f0d9b58bedfaf8c2fc264cc598fc46ae9a4e48b2ebffec3a130297824c2cb2ec4bd30ee6a1404ffaf3619dd3ac41bfa529a3b4eb6b335fe8b083b976fd1553572445d30f655ebbbecc13fd6642a029cca79c08f39379fa6470d00e69cb6fba1d292a68069e00543bc3a9e727c88f5c4c924c199728fdb425cd69d688ace969b059a30d71b06e3d0e569783553a596ff3f9d980fc266e2007abf6d6db3697dfc4ddb30dd9b423ad71d0aca91dac83ed6abdeec9c1199cf9f4e997d37d9a0eabaaec67e18a6907e0b5295dd141483f4cbbfe56a46576c5b4cae2372e447644d8c1e417e22d487b92c34983cd1ad1c7b79e5903b3ea6b4b5303dad5c5a4bda690569441d1beec1a2b18447bd0e1fb87e00ea19b35753ecd1adca7674dfdfa91c35b90dfc4a60ee6607dd8d0f64493b28355e9f97730bfb933f7da8af442d3ae35176d43317cd9750bda35dc8476dd5ebbd64aeb5f09bafc26ec7eea539efab467c8ae149c5f67c4be259062387aaf004f035ed9f287215b461a5e23e553f9f5903ff70ea73fe7cb1ef2570e7ae7a013e930b569fc238de47648ce831d28c85085bd7210bb27e30a2d3f66493acab924b120f93049f7efd2c50ee98ee09c3e7fd2907e3ebf1ed34ad1f5bf1ef3e7ee41e987a594fe059211a7a2980f3c1750cd3fe05a4cc0742a73a4316bdcd2fb806fea01b93da0ad568ee07c9fdc8eb9e5cba9335367a6d28104b4eb0ef19edf440626039381c9c06460323019980c4c0626039381c9c0a4b22423a32c298b9225c946d44a7dba7339fc4e13423c53ff841b7bbe8e7b33f5db11811ef367dc80a2b6ff091ab5fd5104d85ad4e274d077b59e0cb3ab17aab042a53de27b7ced18c36c8d6eeeee78c6625f21930f90556b69f9f7391adecfae0940807d3f1308b02f4a027a9b2063fb9a2061dc7494ada92de69ff77e7e2c39ee83bac18edc0e4ec706fb7e266cb0ef6b7a9b92faa4280ff8fe80dd73870543b3894ef3f734608c397f39cbb28c6da62bd3a40d3ab4791b1bafc9344dcb7274cf7227ce95ce79bf8f3a68f1c5185f4b63ec08afdb96e5a67dfe4ddbb64dcbaead328ccd3f0d18b968335bf0cfaf23eef8338bf3049afdfc5527e38b37fcb3cf83fc9e79feb07fa49952bcf85223befc3981ee551733b032a4ac5c0e99ff7e98bdf6e1d7de390fb29faf399743cb729d1f69a896d8a63fe4ab9e87a7eddbfb8cf3b5b72fe5a9de5d33c43d5a7bee4312563bf5f147d093db213de05ef585a9e7fee9a6c377f517f4e4c169ebadfad99a07a6baddf01be7416967aff5d0b353ef9fb71b38946295df98dbde7239b614f785ddc637f0e6e1af1f78fb4e4ec7f62a6ffb42b955cf71aa0ff456bda6492ef58524ec14a7c3041966ab3e461adc075a8b7b4b793db647d57db91df2ab04b2d71ee5514a29ede1affde4766c5ba745d3efe19ffad05fab7e879b07fea9df2a4fee6ddb7ee334c96d9d137adb3c7fe776f86bafe27478333bb44f7deab5d7521e6ae7507dca0b559f0462a4b17d8c34b84fa5b614ea9bd9c17df6d96fdb57b32f7bde8d31ad8816699e860192cb5f6b08eecae5bff7aef6cd59848f878312a7478771297f1d7cb947cbfa25a02079bc46648db1b9ebf1705096e0a04df66ce40f6d18f0d9a8efa03421b5ef834d3e4033a8f9563d90ab9e0dae7e51fb7b2fc68fe337f351dff685abecb3e1372838e7d9c89e4d0f3aeed086c5001b39f2e43a889bfb50f05d65cd397f28c8adc9adf12821d42e123a7b1e53040c84207beee23e13eeae380e4a11a4cd1afeecddcfbc1368c69ff3f09b7b3f14e4b65f0e2a370e5d45a7ce071d6ad78e05d041498e899191104741045182217e8c8c84387aedecb52ceb664df6f1b5e838d3aff7299d35d39cc7c14c4e6ba7a59ea5540432cbce32ff447030a3f4abfde086b71ccc3ae06096d5207c5e9325d0fed572ee7230fb3a84963f7f520f7f85f1ec0c7ff6e4156f817e92e9934b0e669f5d3a7b77cdece3b4b5037ec32387f84d6624b34c8f6067a15cb2b33176a6a46767493736abb2b3cc5db326cb6cec4cba4bcf2efbc8598cb58e33cb7ef39756124410251802bf965d46f4971859f67cfadadce6477d68498dfced15bc3de7ed708fe2b14312e21287e25e4a8ee3384e04ad4db989f1df0fc497db319fbe185b7601767c7da1644bee834a3ffc3c1cd40077a1431b1b7f35d259935452a7527eb2c941fcf8352984beff4f6b953007f1d7236d5fbecc4ff16f5e28af6cfc999763bee6c924dec2fca410fe4c44e39730afee14dbf01bbaf1e3f88d7cfc18182166c0237ba4cb6ff26771bf5077a11ff69b78b4c3c8b431f6d91803610d3686cd1a8c5f9740c326c68ea36377a5b0d89fd961e7a69e4601fb727b28c36c1946fa3bf7817df937a64ced8f3a3875a436fd4c486d9d2b65935aabac5fab3ffd9412b269d34f8cd413122a549018226204114ef80842c4d20f2c2e3099e0c8132b4236b0938397292ce850451756754245ab7ab23064a451b7b0a19174806d04ec88a4c30fdad31085f8f1e7d7e3730ad0ef8b3a50901bdfcc241a05df12986fc244c1f77ce96044c1bbf985fecef97b146dce786da5d3294542e347592ce3224bcab86451b45812179e699145c9b8645cb22c322e99165916aa9ee83de8d779b4e596483d286d4b01fbd50fa907a11d77dcaebda5c5f7b40a749ce244698a93d78e539c14ed104f719264c7294e7c76dd718a131736b7e314272b6c89c30e045a7efadda79f04e30a18abbe0e6bc3997dfa3aac59058ea73b1bb2f7d8034f30c58d0e9e709f459cd8c243c62b5bd624b476c36f620d067460038552f9f17a55b163b6e4e9cbb7316bcccf9cd09d83f28f884484d8f18b9f0932cc9e5000d122a3133a7e84d198166932ee66de0c4e96e1d04d3513c2d47e7a0a9904faa941bb7a110909d08e015c741ce9f418a3cc284ab730828168e9884969a7764c7262c8fe3b39295d24d9514aec69dbd8518a972c5b8a962c1b013b4ab1e2b5895e47fab3e1ba1f7477445bddcdc09a4e667210671db5c15be5727440e8c8619dbdfccce58f0cea7ed071d79964fbbf9e86947644ca21e62eec88c4e488a8c815a3ec8834e4b48798a4d096455d12daf1eb9cb37e19fd5367acf5cb783b32bf8a8991f9b8f272745832af3d6d7a312f23f3edc8fcf462be104799fa32d3d3affa1baee5193a3e268166dbec73ce39735e4802d7819983fbe8692f85f234f9947dd072d3cf41aea3e21a109594520a45eba8482925f676f0e77bf1c78cef63fcede0afdefd426c2df6c7d5a99cd2a54bd1ba2a9d0974cc9ca7ba8fe1a0f33818bf6b32c676e7a99e4c428b28295059347530d2840edbb5c6eae30ff6fc89d730114abde472c4f8cb931cac1bf6fce8fde769771a6a433d8acb11f3282e074a6a727b12ba9d7139b6a75bb665714f0ebfffe8affab92fc4da977d3ff8f3a348a33ee75cf624741b7fcdf0cd2e9ec1da63edf3a350afc968a8988f5acac31fa5fb914ccac394939ecc977aeca5b08375532939583fff6447d9275d0eca21bf89d7cb5e7adca73ccce9d5cc3fa593835b620ed61cf99bfc26ee268f8bf136595465d7d7de0972bb569ef4f19a3a42fcfcc88fae748111fca46b47e35879abf7f1ac55aa83fc2474fbe6a739e79cf3ea95ac3e87fbe80d08f1c654e3b8d4e7f88ddcab8f87e8be8f6711e50f258f1c4172a9fa3340072b97fa6874d01287df487924b3afef47d9a33ece1c9362d3ae2fbd117230f0ba7dae59c38f664d7dec4faa2bedea2ea0fa57562cbf4e88ce1ef5a9cf91925f8c1b257db20ce57db965153f9abaab3e7fc3c1594316a99fd5cff5b174451af595b4bf855d4084d629a1e9c718263db44b82ce9742eec6fda6a550dafdeda6ee5fd4bd77434dc06fee77e037dbdf07697ed5cd40799cd72969ff6d048cb54f793ba9d72854eae3e6fe866b2f4787957a4ddb3cd4a7525fea370ff5a5b6e7b8d4dff0d496359ce18c6f132dd26c1ac5bdeae38798c6c1fc28ef1dccaafc59cb258d2790519f73cef93bbfa99f3fbf4602a5f276541fa3b5eae34efd0d8f51a13cfd2a954af5284fa35e85fa544a95f2b457a168f2d7232e1541048b31c618e34767e84e7a5c3948e9d3d944c63675d0698bad527a8d9efcdcb568a9ad94691f05207b29ebcbda45d1a1fc51ca3f3f3f3ff547e94749934a4a474f8e349bfaf267fed8af1fd59f7cc9230769288f22d6ba9b355c0e295f47d226d2a02fade8f9a154ca5ea98adf30e1a734cba630ba6d4f48426cd2b8cdb39dd7339ef64aed87964a9d54a21e6afb512007a9fc715043a271a418169b36feae482507e97742f4cb1fa511228dee8af6a77a86a74a25ad78d650f00489670d07c49a5a97d8d5461215a4306811058513d3939c01c3bd2e39f99aa6492e87a67de671a003296e842a5a7e766ece0ee2cebe99f93de4df9fdf8c223a3fde5e7be989e061c0418ae9bbd5417ee491e5d7bc305ed9186bdd75d4060b3ad41a780d9e302cee67c0709f665709f71dd8a13f09dd74bfdc6703668f81c456071d6a506b1cf09b187b41c334d8f48626bf98791a784936aae8f9df476d646152dddc30fec8a5b868aa5f9d149d7f7e1700fa19fe99619c614a29a5f55e2fd4c118d7d770a54fe320a55694664aca9712f5848eb83707fda38ee6524af73a3d2a2513fac8b5cd6beac79f9ca4a2e94ff0299ddfe660ad35c95b901e638c5f7869a5b448fbd3f718bf907a1597be0d43fa089106ad7242b1446847a4242d9b1d91845c737e618cd43a18232b82b30608943a08ce9a48e300b2867e44da3403bc804d7f628904060ed2a79145ffa543964d5f04bf29a169d327b941a116488b349bdfacfc06f5f13554dc597f7c9447a33f502ea13a0d6e42703501bfc1df0148f3ab6e06caeb8c347510cff7fc9d149dbff834236419f7dadbd1af4aa5f447957e8e4bbdd65a7ff6521a85d2284f7bad6d0d838cc6c1cc6714d1d33fc6a51aa4451493a60ecec40ce4474a29a591ca4fa8b52591201dd3114949acc7755a7bbe4e2e241e398ed6ebde7ba90c550ea818e998ebe3de2b821e8ec460049421865e605d305690ac5cc9b2cc5f5946a1b841a6c482c37d129a35111351a50616624d5e6238d214461431bbf7de9bb37d1b6b4588141eaaa0c27128e9a13cecd4e0400312101b4b6900012646521418927049c113960b9ce4ac0571ed0084a5a7090d540c8171f404ca8fddd65a6ba36cf19af825b3a28cc192c2d3616badb57609d7b6462c70a5a0abb5d61696680b4cb4055817c500b82082c46be2d821c82a20867ac3961bbedc30060e3c380ca9b8b3d65a5be4f29af88383b45057f447e0cba648c96be20e6dbc362f30c618e3284b5688cac117578c6d625b6dadb53b55328e9d2b39ffb0d65acb33040b1b37c1cfd3f88b5a8142c95a6bad15a56c65295b61ca5660d98a53ce2a0b83b57646952db8601245cb962b2cfbc5124c9670527b7244aab2a587f6e4e8e2428bc9d3d2154fbc08c3e6de7b6f184fb326621732d016495158789ac1e90b981c968069e19e1914f04505f95e30ae7d77883888548ca51892c2488a2752244951e588018c90a8e10443b41475d185972b18638cf18f272a7c8a2d720a1fa94413307ae86c34164758bcb050aa9d8f7be9a2e8c1a7f9e781e2887b94b3756a92432e9ba056ab050376ed887484cf26e46689886989212af8824b172540a0eebd37862433ec60c40f2e3ff840eae28a2d45f1a07d1bcc83b5d61ab9928d64c9469ab2912dd9c81770025142e2d9feb0d602e00726507ea0200261fa7aefbd4741b326625c04004d98486a0245966945feebf462e435f149526579a9f23d3347a878220823b6584114d6e5b2af8fb645e0cf185e137986f8e09801e84130da910d60c1c4c2162a3e5c49e2c24b45a2c77d7448c0c353e50a25ad2aa4780a9c08915fc438f072f4458a919414347fbcaeb53d336c6b73efbd5c605e139d6296c5e5c9b2622d6b33fe2c6aadb566f80b16505f641992d4a522ca15dde995d674e95dafae0c60b4b0c2119296238240d992595860b5d62a848be210e24757b1b94f338f5c79a20920409a88b1d4650b17389e181fb6645ac5eee44ce5951c94dc15e02e4e338c2a4a4aae56ab05242369f1a4b47ff44427b9d46ab588c808e586a41ce410242d96703165063092ac60592db2c84be4071b6cb8a7b941b3d7564b39fbc3b64eaeadd65a6b915690655b4b7fb4bcf062052da890b39ab8b65a6badb5d65a6b5770655b3b81d83057a08471628b99a413c31421531cf961454a972cba1cd9400ba72426887eb05c71a72f62d470c1529016acf0d1f2c2132cac885179946490a20c8810278454d1a459895131adb596049493e1070821beb89cc0c2ba57e424aebf1c20f1a457412cd84277d45a3ae4de1e2235e07befbd41b5666c973cf834ffb5c70162f490050952a005872a28289203521743eebd4a12c892051b0760384d1caed7f6c209436178b154451640ba7853919ea4223e4e45155f340d4e460051431231b0609483162427565c78a470c16114abd7de7befbd5766878a7dc364fcc3025898c6404113409204b915493c71e003bbb65a6badb5785b6badb5d65a6b6d13ca2494f390a2dcc364c2c9af0c110b929da31b8e3c89824b15fa6717ffb1a145ad562b07f79f1da16461fad9d9f571efbd4578c9e2c1a7f9efe166f8d2254b8da089268a98e2ea22c91018603124311f1e7c9aff2cbb3b40b8a030317a1b3c74592710c2d65acb41ab9573b53bd65abb8210282bb850f038ec56dcbef7de0b4be23571081b794ddc2cd813af89f583dc7b33133d3d5469b795e13b5b041442565f3451010d41af29885041c49598e440c945ffcea127af892ddca35dddcf734014e435f1664faf1cac41eebd374a8c89fa5c25a044799285964f6cf19ab8e9135fbc26d22a7fa35ec950bd183184248b1316564c0124672985912c462c09a2c308a47812d4c5052e6b2d144598604815613226fd806d409428d517eee39bd4f3726d8811db1ed10fbb18a15831b4ef0dc71407cfb2c409ca922dbad3ab4cab8adc7b6f8c0928312d5aeba7489c03231a8b09e6433cc5d8edbaaabbd65a6b12a6591337a5d7050d18d90942c315493e6070275f929c88718bb0e16e5c74d21331ec8f7d6d823abae4359109c3b453b77104c5bc26e7b99343d2b6da5a7b6db5d65a6b7f5b6bad45621f5b7b04936d2ba5984589b44873f58c8bdaf7defbf223a7033f8d83f307085680058f0f2643c8f072288810e2850ba6446c96f012265a4bb3bb73efbd51ecfb5a867d2f68a4adcd9fbf9f35d675ef2541185418a12206253ffc09a4252c3ff6b595d21a69a85d02a7fc63f42fc96b4bfc6ab5b6bb0ca2c856ebe5581f212d960a5c0a727c6987184b051b184c00c4229af140ca4f67cf2ea830b154488017277ca05d6a68b15448800a86744d3ac4db73641640b4582acc1a362e47a608f222ff0109e88504f4c4dd7987a0b7430c7e041d0855041404b04e294168c14906547a8c33bae872a575cc40decc971fe26dde1a345e33039831a8148d7795390a11d50c004002a3150000280c0a07c40291602ccc234d760f14000c748c4672582e0d07837118864110c4300c83200c03010400400030c83289b20601ea5874e088207cbdbe16189bccb94a6cddc22a336792badd5ec5ab57528521379977aa915d61b4c4a14d155a4abcbe337d96d5d0898ac6ee2d481c6793caa3ac4dc92dccccbc0834d439e1103bbc030ef28fc2d2ac9f3c5a057bc5158af2b50cbbd39f1b55980a97daab4df4620abbaa0745bee07ebbcf697af8f4fa9bd3d4c12e3bbf450281e931bbcd59446b10c85490c5cbd51c2ec4f8e69ca26bd16f24280dbebb26d6f1bccb3acf755e700cb131ff7790957366692157a94372fa0875e5e5dfc2d249232a95a9c1237d44354e5c5f6d9afdd53157bad2999acb221cab39cfe07ad9a74500d25d3eceb67183128b2a22d2832ef3b22b361ae0621ad46730c69f6071a1f5924c68a7381db71c24b1dc87cbe2bf6eb1cd44bad8883e7f7492808816993b3db5beb57b8a91df42cdd2203655a72cbc4d4023829cf433f49c2231e1191cee6491456210175e3b671928cc83968c5eb83c54af6ce455ebf9a1047a5e1db3722589ac2c684c31b04abc94dead38e527a901bcc8bc4ae7825c05e16aa411a1a434216f27966f3583ec01be11bd230831db63399ba68362fda3eea5dbcfc43503b7cb681dbad983dd75f1b2cc86d79ad7124f616bc075922e4cb38278986e609509183073186c71de3fe8c8176c359b238dddc51e8fe71146a3eeff6f112d4d5009b071d2fd2b23f3ca7e37a60bdd2226c762d1452a60d445848987e31743022a3b56167cb83c55dbc33be91ce437a973c60501ea9e3011425558e04ae9395ed133f927d34c1870f6b4414cd165fcc930a72b88ff740dc25a7e84394a1a31a1f82c215c20cb0687a4804eeb1bc0cc05b9666f8e93f558d4048458efc79279ca3708582fd00472d71d91bdb83157ba696418462971300b70a5278ee96f2ec370200296a1e9b7a8ed2b16b7633275b66812d4b3d6b332b5e26e53682d944446202d8d067582aa6b332acc87136eea8fda4ce7f42c55f955404b79aba2f116b95981fc69b653d8594a81da026a5883e9b2583e571c2ddfa012c4bd8a21e777450c3a306dbab376f4d44742f565b879e9f846a2647d855ec63ea60b279e8e1c85f973b8583597b3729b685c251b9ca4f5fe783c2b4c5f70e0ead5fc132b8e67d5576cf61bb4f3c191bbe112a92aa4af859c2f4eca986be451ea18fc4fb9dbd04cd128de8914abcd71526708b211b37cc67fddbd694d59bcf03fb3cf9f773b78d492d940ef98dafbc977837a8efb986002ab2bee7ad0136057ee8de652f90d0a988ff011bac2196b574c8fd5ae3ee8c1a02be9aaf37cfb65ed0807bd4164f0639cb87dd3031223e82c5192462b2d531adf4a0b9bfdcc9cdd17fed8509ae078d67e0a66489fa6e2f12055598471116abd5e5d67492399683896ce8158943f711f1f8faf5fcd679172faaf079d2696e9c7b006bf16f5c4286ca1b6593ec1965a87de9f945657644140d33ec87669d90fb52bf172ff8f59af5c182742d3b068d1fa4a103bef690e673b21fb37e16103e6b0214f6aee758015f7567804f5b8a84ed1b2592939d301ed2a73c6a7362a1864dc3bbda4541276b907bb476e839aa80b5a93b8ed69acd4251256b883e07a65b6b8c2d65cb0373b565cf80ece93af416510d39a56ec17fe2cca37d0321e44d5a4042cd5a66c65d4dd2a82468f187c255f1428362cd6da3a57952ed7bc7c1db603d7f624f0c734187fbac8f841959f3871185bc83e4da47f0b2393951a167c3944e9b687c7f2d2f28075c84eec10306abbc488c3b80c0cc56d945aac30bd5c969709fcb994216ee02c78f68c25f413d8ef62805b03f752e6a509ed733ffc4db58653ecf0e1a9436e323a84a4eca03d3455c0d552024d680c015e21b30e5b53d9e64b1cb8d1e7d23739ceb2c159775bb811077449004aaf83956a284fc55158dd9beb266caad5b8c1db669498cae396a1a4885e5c5966d2984529b9bcd3588e736b7f72bafbe76096cacd4e1dba4655e4c56a04147777e47e3a4b033e214fb76ccdb776ad073326224968c3649a5493b709cb64675f555bf1b18f1acb2c1be5994d34d8453585c9030ae1832a7939f5c4c6332a03d1891369175ee1f214ddb9828dd6ce456afb2cf279ac9780a735c834b1aafa106ef217b77add1a7bc5afeeb7b0ebf454cf98e9c2c29a50a0129ccce81a51bd2c5d8006db56e0ee49a21b58158fa67f228a6b077cc50e7cc76ef36e4042634b7f02c90196b05bd68fa80561c5c70b9bd6812a502136a5c59ed31793b16da70722959b62eef642085b64440f0841fc2151ac256136b574207ebcb7ec4b4e2dd88b6b679fc18b084b5c63a8e8db6a0ed7ee7102aa4f1f956b0c991d24f1c558e74a23614fb8bd14667acc25451d1e5cff28ca57d03e4e4f6f64db720cf986d7a052ca36a5db8b19998d0d40c47cb4a197bcf477c2187dc33d179a5373647536a147f18bb8e7c065034a946fa416036c609f111e0a74a651c5ee869ef2d7117feb9bdabcd8b62375781cd81f75b72763d961eb0355232d7021e5fe5ae0a9c1546c52d167f95c9f7d3c641dd26f3360c5b78ab2c3e7c60481ca7fb0fbff0af77b4afee5f95afd95dc8797bab5a97bc78e45e2516cf4d2ea3fef831223bc61edf447a2ea7f69d3d04454723c75f5523dff3387d096f80d9a804fe635987f473b7a708c3b14b15a8ac81daa9965db26e2204cc5e498d74522f9e74f8e0cff102b3d9e9e4de11fe7a42ab4a64dbf7324292d0a53f21f2c3cf850b611c5628a482b4a2a51b975a5c0d4bc6eda9b171d772a19c730a4b051d7aebb76f5a89b8695ce6ffa2ed118e9d42e3a657623e8b0a4cc2fdd55b345af6225d73947562caea0d66a86fb3f522d9c5e2052a0cd4cdb263282c07ed15d90bfe085de0a31a82d97083b6cf2198b7c4e8936e46c6b6a69bb9bbeab44496d031bb3a244c90ddc831246f8a9dd1244615bc1e30ac260028a64088732f773f7313a25856aa11304aec1accc7ac1c36fa9bffbf0fb88a66ca154299b0b5cda0b59fe00a99ad7a4bc65d22f2f12063e4e31842fba6449ae504d173e5194ef4ddb468fc37240a90e86131c216e0e03065571a36594ade8780c546d7027403eeaeaeacb019da9898966a12e745e426706c99c932ce23032b241cae46474feb285be5250531d517aff84ec7b9fe10c68cc482b6bf969ce6214b145496c78bd377309d31f764c4eec434ea03a028f6b7b75ba903b8709b506dd0ca2acb5b58ed416740395345c7df0cdba9adb2b25dec8b48b6ad1e222c4fa0e1b4e9aef6ab45c00919b62f916aa4c33168d308db0b69d81e19fe3fb00f6c5d2afb06b272ed2560aaf159982d7f7e41b5326f18a2e162517ea0f890394558065f97a822e1ca33a7d66ffddfaabe8152350a81903b019fb6bb1d339b3a48535b81caed4e75c2f24208e35eada8cfbf87142f90761a99fa7ae70c7b429028aac56fbfbd2ce4a6536792151c7e6f4d2eb5984da8512cc5cca778d5bd53057cd58e373a780682eeef24173fd49c672e3d6aae7b3559a1822fae86dbcb19f5538afd74f23567d2dce4ba03d7c69b8ad936cc3f8b76bdec392be751339b36cd1e8606ddca7a4335ceab9d54749cfb67006604568719880f9e0ad7ff68d7b3292d1b769cf62b14c6df9c22d8e53094f0307b73d71bb5097480e28f11932a26775f9e56a416d2c33d43181eaac972fe0aaaa07b25fb0b6455bc9d8e2c810e6315415e6d13b89b59fe126b6715c30aa9339e426239614c1bc7a33833ad1ab802833bae2cdd6891b42647fe2d02e2579569d0c9e60e7f506ed0071f5272054f99848207a17d5e9c2ea1eb8f7070b1abe79f58b69d26a199f005d3b50a7f835646f561a29bfe3e61299f6355bba7db453d64fe97e668accc6d56091949220889c41d411f2c13571204bdb11f3465f870fb659f63c875e501d3c7b52addb30a9d3acc14109cb62cc39d0fe6c1547e945a544b4d66cc22f229900e275358745d56a1c87de1863de7f416e63266724980f6c69c1f3f3e5cd348785e9560bf52409750b59f5cdd9b876396a5e704beeb790a9a3b4190670904d1635693683ac18ec3436bc6c6a9c8eb94ae44c5636bd6e73a6db91d44d28099673270763d23f0159f2164d2128ccc8af9985eb7bdae356e5b49359f335c435fa3a443095fe1ad936b9a1221bcd189999f1cf81e5991970079944aba2a88304a3059b3532748b4943f69cb01fd146724b7245a8e85da9b5628589e6c2408de45661e207b26db99ba0e31dcf6d2f08bb08505031bb8075a9f8803d21ba50ba1f1b4492593d24d34265539b99c7789e572cb507596865b968d39aa531010e8293721c8ee7efd01ccd2442fceeb78af6ad22825d869d540b0a9b88c943894bc7c88174fdf9c9d43f4e899c945a32b3ed9e5978603f90a3e496d551fc44a10a340342a2fdbe2ac6f2e9a0d085404c28a6c858e1c39475f2373cf7642246d4d7ac189f547db67ef917cb50a25f9c223786d9c382d55e913d35cca87ec659961685b7dc30ec409cf950d6375dd1a10a5adf9f765a3b0bc443cbf99f1f7530ae626c47f10312aa4a19f2fe52d31b16d35dc20da5842b053fc58faea2023176b05fb4836824cfdebdc8eab4c42466092aa0a8a10298d73269f91ef56ffa2190ce5364d391d893f1318310b395ca55516e5c420b9dfc1706b03c9e0c53aa4fdb9e87821262c98ba1242cec5bb87cb11b3201babcc449e8d9e421d4f79f91513d3e0fbae2784de6b07155f2a28b43e2d11e45aa968c546df4c8255b82ea0a66889ba7182b545325156d4bd12e77d53ea2d3f8829fec987e01c316abac489742ad0c142e122a9c5226df2d3f2dd5c5868b52359e41c5963ae2b726d31651896592f78e2f72b542e8f26b211ce482955739c3dab7e728d73dd7ad32760b5f7d3f50226861b735d0f8047469a9b627dea3e56c7f410a389969cdfb9b74a568551ca10ae44f9d7381d53ab39e1ec3541f4751e868d46098c898dd61fe76a2ac38e0e1e507e8fb83829e75c77df031f2ead935fec175811016fcf09c01dcdd95cb45af48714d792414fb9b405e87514d4a1957c58b73187c5ae6e82ab51ff8a57c82cad13dd913d459afffc0126ce579b79a150f8052e049caa36796130aaadcb62b6c2554510a31f3a821bd08b84a98cfb8f863447d4f859463dba39813af3a50fd946c1247af129e3eaa2d2f1453e16a37baf9ac5bdd6ac78fb99043054e7655d602dafcdbe8a97051c07ed8973fc4f06d21480569a229d2d31ad06adf16844d900724c46cb8853d14b33e13a528a4254d0ac4dba25278a927a8b1bd7d715feff4970512d6e2ba44460f3f3a782250857e021d938902d40f2fe3df30485062d05ed48de90c61e3e72322e1e43ce14e2177fbaaba6823db782a389fe56cffc2f9ad1c0815b030d04764907a7eb443e2dc34ddf0711b09404eb1977f403c17d4486e9fa7a9de6cd32b1570f31669ec8aca3b4612d06c353af21ffc1ef7668c2a911759dfb8dd27ab626ac630dd6714d28f89acaf1a5e58162d7cfac0b2ad831a78e18de0cc1c75621f9773f1184221465617c83790a9b41c771bec2b466d7f9f8a567aff228660c1a90348601c3c3244378da40e5db4cb3c55fefa2e85dd113071e87c6d16cf93963afb46c13c3cc61a24a3ade832b8458f327b09b329252945d7e49c07d8dbb249dab2d85fc180053e2987bdcb3118cc1df6ad1e22f99efe1715fd3b9a6376145930183c847581a135e16f8c316fc6c876050b756361584f2079b8f3c0b33ecac566d3d8cd18a8770ed783142581b65efc53c1e7618d2fcbf50acdc5ebdc5242a5f5355022f61027efebbb57cce990377494e33f03caf86a2a59c34d29ff163008271ecde1184d133ace1ec7f0e2e7c588f0a47a73c3c62a680987d200b35070c84a894cee18bc821a030d8427b639edbac6396084e1a163478c77e22857fd632d9010a7f0b88c7e3921ea8ae2bda7c9d5785826c912975307c01fa870ab8c502a19918c28d37b74961672da533a824d9f6268ca04d47fbbbd0c2498491d1acf39e66e360c13bc28d2830d9fe37ad85d777383b5801888d550cce7208ed2561186263c19f7926ac91f23c490f3f1d36090a6b2139f0310afa3d89387ae382b42da7edab003868e52b93304064ec82e33c5468b2ec7f8b99023f31066b4141f5c166533dd198628c1dcc82a6d6ed848441609e652db5e32a14ab05068dbb0508e4a6c2fe64521958263a06540dde51092248eb9d0dc32207777d29ffdec1aa7dada8ba27026c66e0ffa1fb47e2b6e88a9d0284bf2ca4c9dc07084f86c13655480c8808e710a63a615ce5451e72bf418040bb603a6edb51fdef10a5e6526f7faeda448c3a78cdecfafb09b0bc7eb50f0448db6baa9515e61f5a3d908b4492f4a6d7c0db851a6d9aef108680e14b3bf805e1d2b14ae03368732b7213b062c9f3da18034928f093e1d711d43b5c98a6bac1eabebf7d6db9bf2db9fa2a6c49f5871238f69d61a38b8a432160b2153febb012d8027fa5560a2e5754da1467548b0489f02bd5bfac220e841a6188a46faecf55601cc40192dcb91a439601cbde462ffa1eeb7e7b52e5459f669f2e80250948a024b5b9b9362ca431382b480d3201ab814d48881b70e9ce8745bc2691747b1c88b0fcd96796c0d95d0aa0dda91ee632c530d91aa9a2d1e6411d75c1da671ccd5d01d1527ea69c8e9f91cb94c1f19163a9ddbdbd79fd03b33664c680a650d250afd6a939a4aa14d82441ed40d9d2b62b6289fc312d1a068b40c4076cc80054f8f5708c361ed3a6977c2068103dd6cb529f102e65ae05fb522ac7b739e9dac5e2af1c346f10d3cca8b85caa2e5a78a5a74acf1f438062fe6c9c52292eae67c0cc2552660485879639e4375e065821385e0f6c25fc2682a5ab8a855aa6e9ea6480067843456b2b8657003ab6ce5249ba0567916ef453df11a60f76991ada9cbfbf4dc8b992bc551e6235643d38aa17aa5900e2a8da8adc72d463a0b776a98ad41065811dea7c8f34896820b23a3dc2bf789ce69d0498bdce2769a20b759114006089a82108333f28541ae99dc49406add04403769a261820b4bf988a74f34d807428fe832c99d7a8c37ad0d660c093561724c5178060b23f1ad55b68cfa439772a8efdb94e2abc3c38a90a3e0dccf40fc84e18dbc26836bb7a213a9eb11aaacb7bacde8e283345bb18e9ba6262935ce78b4cd8c65dc9a2b68d386bf98e58b363407c6bdf70b4a189085b1e99a0d7b9a9fc1338d731fd615ea16e6fe218618f9fb64e9fc3100580a94a0fae9f1f23ef011a19fb4a98678b95683a82d9fc036249f74286d985bd038ce4edc968f0a9072351010b2630fd1847b15d311131e986a26fe38586f5e71e60289b37a10d00d577bf816a228638ab81f67a9f0eb3b5bdd0c2df96b7122080dff9449bb41824465f5d8c2726851498ba13e86ad4110cc6d9e6a1a8812b1c76048470e811490d727cde573fedcef23cfc567189d36beef92f6dd6c26d6fb9b5424f3ea73601def996485b86ab9288141f66d4c0a94e8b13c384499d4abef55570a05217b21ede1a39282b53282a12ed05e8834829f0044a36b9356f17d311e7e5cf5ded8ecce66233136f8a31dfb1ca02b93188c160b6c01fad591246c1e468425db8def7f412c1fa41a11b73a1fe4f6be70bb9cc1399f24aa616a32faf0e57d3a4c804ce79b66a8421e8d3f873c9702f8246e32aba3b90f66a27f7203b49e76856e3c65e239b8a48c1f393c94b9c512cfe1348a0a5ac3bdb4bd62855d261254c8c68450f79d67897d4e9bb934a0e5d40e4e2b1250e94273fa90d8223585954a68365d90536cfb68aab8bbde8365927d6d2167376ac3f765fc40380413a1fb037174fc0ccb8145a2836dba1f0b78fd3b55928da3977fc5ed1d8ca008bc7a683b02258588a8f23a2475f96714c277e3afaeae8686bc8cd96ee013ffb5df9643706f35f45a0ddf9afa0d60f67a64dada94ee24534cc7aba16b09bde32d6700fcdf8770b176bc59c1eed0532cc1e37af317f4281d4d9d6eae6e997bb07fecb007e08cc40db8306cf7131b071d84f10fa1f7c9c7cedcf5bd8f1669e3f7c7b6784a4169559bcef0b1ede76daaddf9c331a24c4d455e2be76c04682a950e4482e0ea5d45bbf51d3376043acfa2b245d77c0ded6979228a9b69eb2ba7298b5344386b5c387fadefbdbac34b9e13a63a34dcfeda308eba31609be3a7332becaf4dff1cb970d569312cbf3d12b49747a54f5e2ab291a2a3d85443177bd62164eeec2cb44bbc9c2dce904809a1eba41c28616caf2b5eaee9b6e4f57a39f7b29831d815c906ad6c88862d2c62811b9f7143c5b514ed6cc992728421283f8bc494b46f8a07bc4c090ae6786528a631cb94b8868dabf6044a9458673580c76411002bfaa6cbc4c4d1004fe056fda059b6eaf0c0a4943dbddfff90c8c1c00aee39b99698a2134cb7167c574e30466977a6f9bd85f4af859129e73e086a5102e1778eed931f56ad9b1b796324b77cb462ba2c30f559d80977ddac0d712d36b62dab2cd4851896d0308b4f1c48aaf7b9d094ee2683dea5a56898da6498652188559e2f276859ce67db1e42dd4d760147e097be847be013a8905b6fa814ec14ebf2d82854cb7c8401aa36917a56f7bb8548c2962a98aee814646b7cbffa6a3ba195dfe623e0b6963682f36c472fe3afbe754231205bb8488692c241cb8a89cbf2fbb251f9b9a7e4ccee3b7e86959084ad3505e475e6ea25313d8411e1234fb30b3249d526e175594877640f9dfbc1921bc64523a913174a8d3350290ea949ccd917b3969233c5c729b921c1614aacb86f0fee80e816a0fbd03493363f6c627509caaf0694b8c98ee6c50be511a8ce7a18ac007e8210b5a887c2d935c59a5026ded7dc9bf651e288981c319c0f707d5156249494ab9d3b9f1a261dab375296f972d82430ccc17eb5d351ec6db27839c2a9bbd8e656a533eecd34ff4d8abbe33a58f052de0226fc720d40daa515d7b88545b55140450f2997530501e720456ab472200664a96a169b910d00a692572ca3bd712c737bba4a7de9b3830e64f689105cc130af6a435663ccb3d3ec20a57650858412a55fcc3e0c69989511b924bb5413ec3ebbbbac8af7e4579fdba73e4fd7204fb9300b36e7636131632b4d976391407f44b7cd2bfa1c11283db2eda8c3613dac72de863205937a60ca126631be9bd3ee24444ae57460a1bc6ec7e2bf63d2f385914b28a3d85e9d6994cf22bca8ad8927332ed6cbb313edb3d03dca380d2d61300dc33085790d0130e554566ad7b259ad0b9f72db1c57fa15505f354e0366077f06ce9cf8180c0095a01928943092a54453c26e2bf837dc687eb288d121127a0722c43939328dd3be3f5a5dc90408feb07a5fa5021b527b240c16aeeb3c5f783a830be78342cbc37d2e0ae89d62a6425bb6c86f58ac6c139b73ff13c815e2b77ab8cef1a343b9ca54118489f5f4dc5d927511b16f704f114cce186936f0daef8f752d8a699282f05b10c2eb7999d5464a1bd1b5ef17527a36d462635a5a92b1e51bf86d850f1a2c5a3801323490239e6db490453597aab57a096c8797f74cf4be60f5bde30b003099e68cdc15a417b45a1e139a5bde5fde916747f18a39acc7853173a9b0fa6ca6d9c659cc8d9d1113bdbf882fd1b82994f8a4ffba3308fca9b33481e95248ca2567d6565db4a307893e9c29dd74ea60eb50c3d631b21bb894ea51226707773cc0f97a1ba19128969ee44548c3366157d377403c141ea873886c76aa992733bff297bf9b2b429a373f529d81f45241ce59e671132360b10fd68480da84f49d30f132c0e4dd692044adcbb046a8204e20ad4158341a0a0128624a7dd9460732539ebfee6609d21f95b257c60139e8f62f11407e71e0ae4c97740d264f20ff1ce4b1c6d32e293d4262f12be3d5df2ee94109e7f1d69e9f8bf7049386d8694d7c90c8e047ed99b4d305c1cc445315130140aa65670f498eb3864808c96638a92168722d138b2920c37375dacd66973c3ef72590a11844770d9a07d9588a35d996f5be219cdc5b8b599e291ce492d28bcd68ecd77cb605d1e543c18166ad2ac1dad6355233230c9903e9804176ae6fb4f18eccc3d29a53345d0034dc035b1b5c0f53e10c156b5113da845ca8a1162647b9ddca90653b8510b54cfa74c55fe4e8640a48c953f55d1a3bfba3536a58398dc9bc2359cc8e0aeedf2796e6f503a4e8e23cc60c26fa227457eeb035a2dfa9c4830c8350490566d8667d373b8518f1dfb1d11ea1b3fde4fdd3cfdca756bad4adc61194e621dbff968137b38e1d2d446d86fc23165b0f1d8a42ae04e9a10cf856b28350da10bce1fee5a3b449631290805b5581f54340792465c9da83590db1543566071dcf781decd0de455702949b15f186391302c316af3cb902e0dc2c5e221a2f3e39bea07370a91db149eb2e893b4ecd50c700ff961e94d0b9ec5c23bf9868066bceffe72a46fc20163ec67233ea42bd196caee1cc66ab820ca4121b40d44429b1b2bfec49322576f24033cb277d064096a5c0bf742946b4bcae0ec7bdd6c9ef23502e085af641d681e579a450a548c134aa13882c6ade45bbc8b793248d9461404adea2a26af39d270d4e2720b93f745230d6833360aca785886fb8d91645c926a23f39a44e2dae81ccff5682a6adf239ba85f3883996f62c79c0dd8de1942ca4e8fd98b20238cfdb49b4527c106adf236ac83e55ee2f4f00b9eaad862209a11e6500807c241c6a09da97d5d9a7be3df3942b388408f8937ba5754ab7c6fef9f89fc38b386ec79e252f0d7bb5e210c27ab6080621b48731255ebdd831244464e36a0a99048b7bbdd68de7927e6280beb63ce73f5cbd5a68ad864358565c2f7cb5f4cc0a261b7f5cee504098f67fcd100f7d648c948bc7c2aa75fc089903af74cfa4ccd013a4c3d74f90add47bc8fa6d32fa4b897b8b197d34d18abbc015214d7a9442a3af239c785cb682fa7bf3c7b12c9b853e20f227f26f56f27a3f2f53793ba480c0a1b19809bd565b70d558b11ece8b26657da0318fd914b9128d9feecf52dbc690339cca246a8f96573e3c1f630489c09208745115a2b34cb13e509b7f4b013a1172d6fdc275b2a7f6ed058f1d8b58b1eac4cb96e0c8fd874f91693c1dbddd5d722951e108c74e85034a3e5b8b4a2e279c3bbb6073d37ecac9f1c50a01e414d2cb83a42287c0f52c4a691cf30beeb3844bf2a178fb1f2f555660dfada50f6ce12726020a209440bd89b08a3a6ea03c7e10bdb7bcb65e42560008ff2d2fd672a002fd94408866001e7e182aea03c1541335c76578eb1ef4d17eef220816f803fba49f344aa25172ccce4769aff15b376e76d2f3520b647f140d8b8e050ec6dc47d9f50957471fd615fdecb9ec9d8db3372be7f2b788f102975cd9102061cbb0e5038109eece97e27ab253112d5aeafd6709de208fac3abeafb68563f41f2486d82721716aee7f13bb6c04f5f64be9a2302d569d86eec452a883f411cdf68ed7bac39f5747b3dba380192adf21d58666595023f38af7004ddf4050ac5f6d4741de2114397b118c1756009ba2cdf4cffc1fa16168641ae1795d4efbdd42cf4151959480ecd717d3505172963476dbc6b4c2167b8e2cf30759e36ed09b3e02fa28f518fe65f6794c041b44bbb44796e8c0af196a644690803c0bd723a691513cf1ad9568791774226fffcc1ab4ccaa8cc438ad20e81cec412d992a3d8bf704dd35d6788c38988745b3bd993a28b84e85212981cceb1eeff12744b47bbef6b97d2d16e77822fbb06733eaac1a33cf52ce63807b221b831bdfe9591171df5f1beb62dec1ca9fbc4948388edbc3ec73c3a9fdf9bee443dc2099192c36d7dc289a0a345ed36f47616df1200b8c1ebe5da61e893a3c3e08410eec9d46349aca38ee89fca83ce7ec88d07222cfee4e3814d4ae3c95fc521898c48c44b1a89bd6ca5dd998e6cabb7db828daf3a2669b9c283842c0aad263cf97b2cb1c646dda1a64856965f83b85bc85af08afb709282631cf60913b7e85de02abbbe9acfde3d758f40516209cc14f632996622404e4460541cde65c78e097ca304db8b50f88d584ccf4a69ec9cfed946dbb42b3132f6ddafbb06df39f90057784d65bffc5945404c246e2a22ce969ded284e9cd0239ac3eae63ce45f6ffcb930dc7907bebaaf0fc65e10e87004f55e6b996646e6734a12847089a6b27f721368b3b0ae9406efccc7c955327e98e8ebff9c5d2553cf6f77dc6d1210e4863b9e9cec5e732c69c9470d15a06e34593f209ac98368131f73463c1f669a4efe144cc0607f2740781af25ad021ef172047aa8d36d448bd639e5e1ada25a766568fc08d63064649e97477378817af54adc34d028c46ef8c2f1671046f9b6fb9b18ea8edaf02e8755900c3db981dca0e827526d495fff4d28048271c49779249849b89d487436654a3809c775fac11300566ae4d1cd028ba672fbd72801208e1c40bf3f24541f9908d4eb3a4f272c81ec163e73a8768cffadbeab0d236387640a998f6a58b5413f4b4c935ae150a8c4ad360ec7d1f6c7415aebdf70a4651fecd7551a2b886bf3ef561dca84d0e5d3579f60942e1ac6d533b0eeab0f939d1cc08307f04e8868d779ac5175a5bb41433d1144e1f17b31d66236a1498e485dda70eeb91b0d91dcfd2847586f1b9236637c40299e97a17e93c41bf589d45bbc592cd3b6dfbb12edf77187aee7d056b2c59459cd3b5dd5555475312396e2d4b144b12c07e53a6f8095641b15ac557d42e9f9b61253740851155017a44cce4e358a097a15dbec9163dd35cdc53041572dbd6635b8f2346ad1df047c914bf0aef5721d694e43d141dd8552e9984484bb18e84c23fd6f5db365154e2a2027f4715c788ef3bd4ed2a3f1a5bf4b8368c0b5466ba4ffbeaef6659214a80e737816fb27a858f3be5c01eb342d9861930357d28ef87a1152550bbc8a6a6659c1f690fb3ad5305635ea26dd6e2124320eedaf315a78891ebd4642e6580e0beeb4c09c41d8343debcd6096f0488bd5d88cdc7e8402607392a2b1783b44c9f78360d1ccca57752111b4bc5082d6d1141d474006f3b8a38160e02ea119eb3c93819fa40176fc1bcfa855601614dcdb098450b9f2fbb63121884998d3e7f7d3622f699c8fee8417ee79d309d3427bf31cc304e0952ad47399fd065547d12a62d139218408794b8a2464e0c235e108e6827f377c8faf5811d7362d099847c083f72377e001cf023c1f9f8d7672fa3385e64301a9ceef16b820ee1b76301fa76f0588b383375dfcf9a9f7920046ff58a9da066f1768310f04d9fc9b2bd781ae4afe43ccca935470febc5e16a6a27e5ca4dace28cc13b3741aa9294198e50a0d326ea611d57785863df16f777a775bc6ce88c9219648057786a9496bbd9e377865880be50f24bc35cae40bd3af3a58fd35c8c4389dff775db4804e848cea5631cc1d30d358648fcbb8c89c1a1f7542fc3f124c3c7e427459dcc82d24e2dd4260a44d85244ff30a2ce117b4e06ea2247032f00e66c007ffaec67829083a38a7f3ec25743ab45b99d9265d21cc14b5b384afe9e8e3f0b3c91b41936b12fdfa1cc7c1c00a9cf6483edde99fffe1d33b024729143066de0733410ad8b180e683f9596fa07afffeb148b56316aa0b72731c70ba68fd274f4bb7bbf4428b21e0b1a45f03e102dec5913375117da2a7d8bb20a713d92768cddda00e3984fcf1f5b8570d5b4835ba7d76eb5cbd43e370cebe444cc4ddcb78afcb4e4ffe509772d0bed5c5982027f8bd0c411e487c3bf375e21fc27ca0f16686c2d8c410bf21e6818c6939737c2ce07c047bfc00108551497a167d52ff92f12b4fa7a45e33c2a9680b8454a0d3525971e65528a282cc70fe36ca93ffc7c4ce681a9019fe17f71312e042d5fc365dc35ee6ffe2920f72b2be68c4f25ffe6728a07b783023f3d33e9467e75fa2f245830c25846cf7391b91401bd2ad9f19ca82c1e7064ce0b386d3f2104a123ef69fec30bb65bcd40d57e0cf047717a2894b4b1663f3c5acc1b2d6bf71e3a1dc6db70c3d17008da6356269c3b4de6e9c7f09bf48a94ed8c90628d464af5dd3e31ad8ce5ca11aaea6dc66c6a3f503555c5379fc5d15dad99b00577013fc3a8970aff33a4aa26e3d4856674558b7be1b5e647955aedfbeafd9f51768012206e0fc4bd25769569322971d68b2140392e904604456d26170a2749774fac0341f78b69267eb430cda6242cb405abb8dc944fd2d2d8895064a5ae3a04d2313ef264ad23f50d7084b2ce74f27b72bbeb3a94f8d9ca7a89ec92a93932e85007661ca05d67aa03195b43fdb64eaee9f0e7003913d41fd9e074c10808740e0808bc7d874fcac158b8c2ef97f1a214e929c27e63b0090c8b8588f2b515036fa671057a46e7f5f77a0a298d090567d8745858a33b875c4d94c099607444cfcfb87aecb4df98e0e46f163e54f66e70b80713d2f5b2634c886b1f609db3da703b00cd7ed058779a0e21bc90c96f631c76027bbe9d71176f7454d0fddea88eb28b242c478113f5e40a8843827145b9e3d62919d3e4b61910b0fa10918471fd96a0d41c1175ab039e9b507058ac0221716eca07484c538c833a3e7cbb9e2be5073cdc8a2306615eb29e17f9a682e9d71de9a041e1dc96cdbd47d769e8de4f38596a5ff5dcd9ce7b1a7af29071ea7c6b32af5fd2740cb2090c900b95134917972c2937219d24a1c71fcdacf89aa1f9bb6c534f576a0bbeaf11ac45a87db528182e894a5296bd1d75f417ff7c406388e17d220edc72a6cb3836c803f7e499b671081ddaa0237c5bb547d284a8364d4d744c836142681e88b09b1368f328220386537ba4d3a407f13072394d4b2ed4b8f9e31e954bb9d01498dc81795919c89347292f3cba3c507fb3658eac1f19c87c2c36ff88c8eb963a98b4cce5f7f4636d83d98cee438969dfb52d3725abf3e4f919079301c0857c2144d83b0abbb90dadb4c51bdeedc7a2472d8fc4523330c96cfe498abb11b522863c9b5098067384488b37e7fd00dab22fd664f6bd91bd9b30456f83b607401dce5c175c07e35c7af43c2fb1e4bc868241af13a613fd0edb2ffc29c6561f2dab27be31f71a5fc59a29bec60ea1dfade0e6a65675181c4ae958250108ddc9a6053e1b74c7ba90b54e6c4f46159e4ba1bbaf4d00d9cd6e552880f1b06582fcb60f96827e3b0829a8e16306b5a7ad5fd951e7fab4dadcf0ca0ca6299f4d0f4788a136e7ff0059bdfe597371e67834001b29bcb33f34bd7fae585986b3c68d0cb48c300f72fd85885da2fcfa81bd751b0c6878940d53add37a50dd438483fe8856a30bd521ba513aa7ba322f2134ef2d7e11883168bf4b711594bba755abadfa3f20a09bf1f43498c0637ebcef18805715cd5b199434fba512bd16894fe81bb2a3ba303bc0d8436ef57c789267a2a3ba527ece296ba0db9e96969e953afa06aa117bd17ac99932a0d84ae222b38e9cd9a5d88a94fd29a981464bf5988ba520a8cc6682d1a7645066c8c2873163ab4d0c58ac32a57abc6d14bc3d3f231acf81099ef43e01cd3d392d011370909078282d0a0b85728e2ca5afc5a136808f15afed0bf2b3cc209626cb0f16ca575c8a7cb26b2ef068397f4ad473cb71a2d9245e9da96b593f6d8116c4e1e81fe1de000d4331f14f0e8551727cb6f14820db97650f0c8473cea51e2313ba5b0864745ef01b50c458c0e6b56022fbde5c4b710578235c872b6c6a184986d96750cbefa30f587e999066e8ea15b45bf9aa7717a51854428fc5beedddeb12191efa0f1563498e096fadfd67adcfe61b81559cf4ae9a5857e0860ae55af59f5ad083c2c88956f64d8cc231f7150e4e75060206ea824d1dfc70a056d2c41d01acb32a783961f3689e12f619c89afd18c878a030822f4a0a16ebb05c3c69a9dcdc9dc5ea2dc52f435427ac66378bf701aaba393cd92e31281f4cd6828a9ea4f613df309fad4ca49229936782c20a4b4007b10438b07a6a0efd9e2a8d2614dc9deaaa9a795e449049a9a56105656b7961799bb097594bb7d87630152d47e55d038236ca8b3135c5d1f373577c3379283a5319235b1634914d52d132488a938cd50fbffb908bc3a02a1bd3812d9fcd53c11471c1ab0a3b7feb5d0f3aa79f9c696b2c8e2718a7fe56b2cd2b592fa8699e32da2b4666d72119a2734a6cd0b382f14d06a17bfb5134a7a5c0f24e1b8abca3e1d60dd0d5c1ff21920f562c6c0a9742761080eb86d99fec7206f0e42cf0a77fa8be3bcfaf497e0d07bf392d5655684a6cbb16e15068d0ebf446267350da40946f900e728bbf56c37702333fc87fd580bd26214bc15f487ebbb642439705c2befaf9e3ce649e80757064c579199b862655790beba7df5a2d0d171a9f76f9e3a0dc48fb52cdaf1e0da5ce9d1c174711a9c08ffa551d793fe3b7098513a83b31f18d3bae84abfb375eab628d56c2d43469db26f8593eaa67f36afcff85c38e22c30d3f4b3edb25bc2459011d19d5273c47d3554c8ca47fd354f3b9050b031b7258e208a855836ac870212fd00bb77d5712a747413d04e088435e772279c4508ce75a25b512cd84140301c69edb440d3c885c54bf1360d5c9f4b859e0965276feccee9fd4d906289edb8d96890ec087761d03073aa050279e68a920505ae0c150ff1423d57768a1fe2c1532dbed67d2158437e80d8a67f422868ce0f33da919c586f809925ef22c7a2d8b9b40a302cea0f6914be5c0ed44b28b2c5b94301623fbaef1fb183d9868eea0a81d47d2e1c6efae16f85e1833b54bec0d20aab22b60466033f6d4bec7679c831da5d41577d4b0f7ba9d01dcb4b2996362bfaa15b6a4481a88229cc4b1e31fc7a88c534a3857adbec6a799ff441c6aa0b4def712dcedf88641038e18cc6eac02c656614e868b5f043e33af1f608476bb89a3480a5a948576c46c89ed450fbc5b8e833b1beb784145b2fd9fc5fa7579eebd30b1b0c99750e9bace3190b81841ee2ad10bd4fca6bae7fa34a8639ee85fed9262c54b97803cbaf75bb74b3180d3605b3bdd98e1e357b3a3ffbfd0a74407e336472cd2d0d974f0280946395c5098e8d433815df22bee4ab140c52b6de4f5c7c4ddc6564e2083a79079eed550c5850f18b09e04adaf39530440af00fbdd03b72bc52fe959fa2a8bf01004b9ab488847ab4b7c978447a871cf02066d26f28d4a61cf3e2e8d24cecf1ccc207bf62461c34e4ff4356cc5cc8c5c77af73aa74b34c4a5d18b61658fb8de50a1c92c2d993cba29101bf33aafd9a8c0172ea3c636a854b6653b7f14e0919b192ef37dae0c62046792b2656f3af65ebe20bed569f06a96bd0999fa5b5983af8998e11412ef63f96d2aa2ea3a7f9c11988b483d79f04a735feee6749bc42d04059148065765a0a5e7dc268998e17687487d99d0796a46e16d8d44dac2cbb8b413d120de2299c984f44e2c2e7d6d4b07debb90e6087fdc4a362bde1f6ff17eec9878cef5a5e1e606828fbb42c0c5aac52d2aba4d7aa7c20c5b1a3672e336fbbe87451f292a03d93e868c05be493fe6f850fd0c95382541783b1f926d5b4c0c5e08fecda6e52da08f176df7a74bbc03cf628a51c86eb62da9651ac20c7f8feec4d0b3e65cb288e77385b6f3fa213b132471c73704874fc49560702a109f8c2c14eb2d09dc67baa15f80f2149bf8060c4eef9d94229d9a0a2d7b9f177bc8890c18bc93802bc22c388843a248c0667ede9bc8011951eadca2eae8cc08e365427079c209b240489d43633b8a72507f8df04018cc4870b231130c54586a0397d79851128780634a1aa93742bad6304c414bc7f7ab9e1fa95c48d13914c4dfc9adf032115650dd7e22c3ebd831e3cf71b89c57ad4f7893ef0e0ef880dfc117262ae222b54404ebb3e688d831169a73cf5202b1b461f0c11c6731c0e59023b9f0faf161acfd7c51755a06aeb1a00bef5265f93c89a86ca49ff44aa7b16f586f6ad2e1626cac4d6cc8b4387c297b85e6c3b2e5b8f70ce39d7ac9baa41d286a97373bfb8bc4ce974edcd83fce5c5b3e0ababbf037bb208269d96751a708aed57ff970c6454b9c93d2e4773037a1238eb30000c3c81239b1a95f9124ebffe7d7ab6a3d821e6846d6e7aadb818b93820ee5ac75c8c6f82a353947d0fefe6c028bc5f97a9066bdad904b4881b09263247471dffdf78e347710cac62f27c97181e67d9e9d9c071a433f82fb0dc7d901a5b45a0cbd9c131b9c03b7ebaf2306d14fe3c5cfb6e78c78b36139a43d7eaba8e14fd4565f6cf6f0d9c4963e61e84873f1d202f9bac04121ff0dac4cd6aa2fb355ca3181fee80c51a358fa82b85e0b375629041f68b0414a5540e93c9ddb0c99e6fea1ca740e54f9dcc850d1e040550dd23da1a03a425ab76618eca15f0e55011c7a3e14698905ec6183f6bdbfa951b6cf1e7def1f4c12806e30dbe0d55f6a78f24d5a96841f84d96a8e4a4ff529a3b97d8f1b23649160761bba5e271c07e2d6f8b2857f0af322d734fecf103fc7887279c0dfde7ecd901dfa3df7b6f297033388803db58b386a14b876d6a4998da2cc29291b002139f616f8549c3b0cb41b0d3d509ae9a03f3f36e877032a9eb3fcf8855a07a644b2c03381b814391412731edc118310fd6e0732b1aec2e9e52b3fe23a70e1cf8ad0d6a55207babe937567b9e5a5beb3525abb840a1d5834b1758431e407f46e420ead7534eb8d04b82bc5f12b391d90134d71281ad1d4617305ed6a77328a9b2dc54dee0e637662b8b0be03edfdf5916465112628ff8659a6b9fe86d45990b35926a89a3ad2f637e4aaf153c55fe3637961e7506c358bcb222c1b23f3ec21bb0e78c84cc2af8b60f1f8e48242d1891e4c2e9a8de8e60360cd363b9326717a5b77b34ff65080f94444e49a0b35971265d66884fa4e182f2c79a597312c762dd0927252598be18b4524e511b85545b660a698d99c80cd65f2657346952164553e019c13b0372fff94e5dd1e5407a4c9e99042d1c1a3ae7940c346a83ae83a71bce1b0dac2cddb1a456d0aa7dec7bdd2bd932c9cf7bbdf1dd15b97ba0d8e67f23cc04df1dfe62ef4bdf9d8d9eb00c80faccc11f3ca7ca3b0714c6f7e813759c01e1c2f537ed12e29374bbb4f194c533888acf241817fe1923ff0f5224402d0f7f02a2ffe5a9774903708b4676b5a434cbc0b727f7a0bd2dfc65e6b86597acd5e8085d01df3c8adf7377ab4b9a54e06c8bab7ff6e1a16332b7cc4fa30a979a85b28cd905a79b4da223947b78c5b8ac331f75a3fe43c1f491ac702a85541e7f36b940197a82cf807baacad9462046997505bdfdb50989a591cb72fd40e1669bb9e01a33a91dd4738f9b008f205867d75a62aae695aed3feaf52c6124439dd3efb8fcb45e34cf9b39a8c14e69c17053548377f0b4cb1a836a9d29273abbc3ee4adc912f0937ca5a4e63d11f90dd8a0bb7aed2d7ef40176587bc411e7d010ffdc0ec9b4133ab0c8d65b8ce420304f8333c11e2552622b23a8317330d970e206e47100accb0f0b81b3ec5403fd6f8fdfa4bcc94c571b662bfd30023dd1c6c11869dcc51d764604a7242eb281bf5db316f90f2f982dbaa4a5df7bab952808f8f8de47fda61bcaaee884775918aadf96d1637d5a1edd13c45ca3e96764feb49e1dcdcd8c55fb3eb520e0540bb6e12b2d863c8a2bdf0eb59109d542b856e28a72a71fa76c58e59c2d17b9bb275597cecccbc7c6e413e598c6810db93e4d582440c61a5019d18e589f8bc1eada61fb39dae90ef17a4b1edf35334a93b5e68cd74600036d81058d4a606d1a0159ed5b51818b4da8aec6a3635d530e642c481135cb63b71ab0e8fe258509921e7ca179f306a0047a11b89a9b580a3d870c6bb56c81103b99abee1113ea4e1c321214a0dc0ad4896860f0972baa14f3a173d938115964725df06184928940af6e3b9a8a107d4658df5b3137bcd2c6b1813ea24b4641ddee5ef2cc43f6df81e7f86ca4d1569ae2a1de393ea95c32488a8f5b573745bd55da4a7edb45bf847a6245a89077560026cffec60649997b9ec2b7e0363a51e20fbaa87c81ca14b87260d92098e147ed358cd6979e39d7d404083f66a63943388fb506caa65d139f2871cdfdfe0903dd92f984423a049bb825d058f9ec382df1a0a1db48d637330581eb2f1a85c125f5883b3d173957742b401647fd86b91fae62c32ca9ef2d97a7147640bb0a5e0e0c39ecaac171dd7503eecdfdc55e2e0713d376e00ece39adfb8dfa582187f32ee4c2aded20df491e25e08161c4e720e27d0f794fac653c079f2c4a67589ebe449fc4085bc85db2ce34803cc0b4aee160ef77b725cb8b66b5047d0f8dc2e6824e46789b5dd38db6347aaf401d5b84227dd505239525af3482803c56d86da6c006dd0e28d2deaf5485d961e943a6ec328ac1a05a527aba980523501246ae21d16f95f2fe6b9b62eb17b5080c6757b7385ce9eed37f3104a57b54891ed126837a4efd1aab1e249dbae854de64d807d5028272853b0d6776b6696c015e14ddcabd52c890bfffa34edf2c586362e8e470fb3615a703fb375045ca4ac44df31a5c3bed3e8181016b2013ec987374044c2a0d01a1b67bb41245c287a8d5815a1ab8474587344af5144e34e6919d9bc5c87c80185a86eafd172af3d18fea0b8eb6b7ee4cdfc968307b3144993d4676534355789879a07e7ac4a02f3b0cdc73118f62168c29442e62114f089189e7c29086b62bb7678982ecaa3f8435228295afd742b455b1341dd02db1fc70c46b72b818a2b5a436421a713c8cbfa67ed5e3702f5f6db2325f116c969d7ebe39faa3d3c517d90559b731d13afa24530b33fc2c47646c1ecc8886b696100b0d9ca61a99f6375a45a4589d85c096a52ab5eda2c124e4117e91ec31d620cffda42fc399b3942716234af6b1932835e822d95f5a729d6fa99f89a488407ef9f14760334e14549c6131a019ad6cf5efce74d8aed7f2dcd331d359421bad3f3fe3a89279553ba406f029a13ce906f21d18e468b806755c78b22bf87060b94c12744f9d948b29ade73e36775c1cd6f90d2fdb940631e30817d24495029d89ebee97b030813e174ca48be159dca0dfcaf94e601da51dd455f500cd24d07a2001977e7f99dc345834c7f5bd9812f003b0d905f22c0ec156da4c58009b752b30185199091c2d6151c4200b310ed61100a001c460004d8eec9a6f693682fe6efc9116591dbc2b87b317a14c4d49364efbdf7de524a29939401bc0424042104455264a08016448727764565555596659149657b56b1a1a4323fe209201e27de18da985a6989ae8fd984132be597d71a1104d9299b289f18537308f90ed79739cd27676a3c29d2f5c7ec621ed001c2cb665466566658665a665c68d0d41e97a0e6a659a62eaa48f5b93ca2eb74e49c3721456429388e13ea5a28893c269e43ca9a26dd122a32544d951a30c63826036c63dcc3130689244f0081a0879e9a42aa4c07644288f8210829404c41537b506961264ed6de7bef92979b264c2634646b2c21b2f69473ce43bcdc3487806d43c8348987106b60f4478a882b444c9220f305955120d25973041024fa429317a0bcf043e2f2a1b2b0422f332f342fb52f258fda1a6b4508638cd3bc382e8529d898e59d19ca302b85f2a862465ab313fee17a185b39552d0f741dde91ab349165b2faba34c86c12a9245449ac9260611c2b4a438abb39e78cc5756960796926b5e3314192a18c2fc6186356968d710b30c080a4071635388896d4d492d8921cca78c9f8628c314653864373864353c4a5d1e1d2ec94b40d112e5f26949555e117c6188309c38129c3813943e2c11863bc84913418634c048a9be64fac0691a0f9fa78f072ca5f8f049ef47071d1d0c48797ca43042e38515ab7796badbd40ba6c6babe02de3ec615c615e61606164a430425f92727138901d97aca5064a941dbf659c73ce59cc15831213a4492d4c1b607928dba01f37cd5850962ea8a030f9e4f570620b524fd8994a0f2ba1fce268f05092d95293061321f7a109555659962b54a13dab8c092374c689353f55a99c73fd408b822073484913223dbccc105b551da053a555d3dcb6a2697b30a9e1154433427638d2e11f186309989902a407a035538240611de52a562239612e2b2e2c2e2d2eae4723846b2479f9563b952ad0da9e54ac7499356a43b9a2a715829923470096ecc088d85c538531ce517bb4f40e0e1cea96629143093038863872864cc5410337e4e454aacc9ce374f18631c61803ed00f1001901f2016a020465fbed07eb0ca9e511b9a76888ce909d213c438cac40c3c38a97529955500ab32b5496a5133adbb38a99d6ec4b0fe37f821e147cb842defa9c7306b373c1f05c30462e189fcf39e79c3549db683d24e7bc26e652a16436c40f1f506030e2880501d1c5f806321b1ba14d48e971d91d6a93060e4316c7ccfe98d552bfebd8711ead49da464f9d73ce3907c13a368c316e02aba6b99130c6788c8a1bb3e2c6b04818638c319a154b76c096541f324a6bbc4034575b8a53c94eb6460ae5dd1ec648f6a587f1af8db0e22a10618c2d0d1d2d3a73c0ba2de59654bd8125e689361e39ec78b9a2c64709a28ce009353a4272ce39e7dc85e3b8b7e1388ee37470b969be6032218cd261e85465a0119565f963d2f6acb2e3a2ed9b73ce390721c1ce964787c34895205df45b17668d54ad5a26260d26ca2d48d699c191a3858e265d7ec1891e3449db685dbb1bb82383871e2050410b0b62645e24d312fac85f7894e1a106d7a8815565d534b7aeeb3a3545fe84d54c2d292d2a90c612b08ac485e4850486448644c8822118b5856816e9e8dc7bef4dc24ad24ae24af24a024b22cb27ac49da464f3da3b163c8661e6076ee3a6ce4ab1322374d27b3cd094d3ba9919e0c0a2ab4cd1823d63831e403402c0879099450235f73ce39e7dcc1d04282c5690b20cc255c4be8f0c052028928283b7e35f9feedbf9d56d906a74176fa8751aa00a6ef9eb1205870a2477bc682d8a99b562e369486c422878d05b163d7af513370147bc686c6ec70cfd8d0d016f7d79ec30d609a1461f1c1dab2420a056493fa346190378b3a341e9f19eb01caa61dd833c64398ede5b0524ac3bce5ad6e4abf0335f8bc2705b06bedeafe5eba7e98fcf93bda9e1e7e060e7eb5d651fd4623ee1b81b8ce0decb65eaa23f9394ee5507cd371ae008109982704ec0a63cf17df74d59ccbaa39566bd0babe71dc462b64854a18788996b7bce58c91ad50cdf152e95f0be5bf7fdf598e33b7bffbdc9c47fdfdf442d17707e1c63f0ab76fb204df3736ea06bf6ebabdea1fb7ddd8a8bb7edd752439b0c3af397fa83ffc3e9cedf04795c7f739953fc432b4f51ebd87e20b45bb5be0d01fa86bad9fc370fc2c86f941d046985584e0f7c12879a98213347ef741f12ec2e8f57b8af77717c247b1c34fe181fe507ff89e7fe1eb0f5f24471bd8c1f7e167d0c668248dd54fd8dd9324f7f1927f283a2b064d37794b97fd9bf28b42ddc007d40fdfb3f92cde5f01daa81f8e2fbc44a797f0f7b5fe97c75b31f0121521fcfc9ec10e680a43fb7bc0f7d9463812cabf6213c0cebfe98c438f1effe664fd50b4bb821d8cf6e83d2d7e3c64d993cc9e312cb3edb1f85ae8d024dda4af458eaf850e2dc28bf0c2c50debf6a8570fc912b68dc8ed9188f375e174bab0a16f50dc3209804d3a8b246591fc6093374e56ac978582fe0eb12b617e88a8a1e68c67bd20b5f76f9036beefa006f8defb6d74488e0efe1d8fc2a3933b2ba5dbb47f8364afbd3809555344101122f06ef0717777f7a7fe1efa3809ab3a8b5267a313b6183c6f6429a594d2ea042c028bf03ba13dff30768097aad7bd15bb171be3223dbd148ea4dd3836e6676b0fc3dfea934a9e58e29e44d2ba015e2a42db3a1da71be777d381def9f59e769c345bf3bcb00706fbb4dee6a6411b987e3d0ae9bf60210657508dc65ef759ecbe724fd25dbd310bcd18de3b134dba2047acedcd19c31bb72c944115da601b3f2f4d40a36a3c6ffaa42e25ecb1757bf14fb221d9bcd09bfda46cb684512afd8b7f018314f6e88f6afa9b7bd8a34912fd6dd351451299ac5671ce1c34b9e970f3bd6e25dc7833c79bec282718a07b84fa44b93dff14b79184417eb9411d49ba6f3ad0bbbe266fdc5a27b06b7de2dd11e8f933d3520f913339e77ce5554d73ebba7c6b18e3fcf55011b3e4c8179f1c4892a8686dc6a9eaacf2820fd7e3818f265ae0b1e3091244a89002131edf91bdad42054a3744193b41991eb22c546557742564b567955613ba125b3c414eea8f35370593191682d27cce394751b969aea2b034c9062f2bcb8becd018cec450d444875471b9710eeaa345c10a40a6a85c70dcd0a52e52ce394f2a2fd6ce79686b9bac49da46eb9c5d39e712b89a08b265cc95165240651f3b5fa11e08a26f8f0345babdcc79a038f7a6a3c35976793c53467e7f0f8529637b7faf079db193411bdf832349f73756228e03252c58bc7f5844939a4576d51ccfcb34dca4176e32bb44df9d28a6eab7e93491de10a73306fd94e3384eb1c22988e24d18a4e7dafe5e9d9b8efbd722b7abed75d269c2740f697744931507256d110b84acb5af63759fd119dc9e4fc1aaebb442c56787ae342f79ad39cd856bbf09400f4065d0d1ed8cf18edd47776bad7d6b33bd38941e0a91a2be647a92007b56b04904ec17c4896359b3541f05e5608a47bfee6e44455688dc6040647404f0026964966c720b22b756773368c3734631bd7463858acf9e56a614ed4d045d0495a016d44f218267dc4d2458b4eb7bd3bff066117f474b1d1d2f81bbbea7fa78be7088fbf8a53ed5ec6e783b2cd21d76dad3ba236f643a699b8e22e4e7ba2ddcead6f9d06a4ef8e3a64a86e5ae61ac46376e7b292fd1cf22a5370cdfdb44d24e4ae9b655f76e53b9f768cb5ad97b29ce59e4b8cf2c2f553a52a7d4a9d31f7923d15aeaeedb53d18e9b117d7d429003df206dc6a07f1366719c4a4398e3e4a190a87e380bcbd40fcf84b19a5351200b6c390ef9d5c0156804f4a90f36a91f8640405a57fb8a5a8028443a7340d85752f14bd14fa7db740442e3f0b53100cbc0292512e7fe993170b56940fa7863c6f6e8e9531bdb6fab1740f46fef411056431056411848036720f64193e00fd1ae0ffe74b08dfab7d50d8126b7d5eadb3e9b27419a8ba091cff95389167f08c2c84d8bab4cc1fb9c48de98348faa668cfa9be318d9d9f537d996c5734495cf995dc3d7ae7563bd7615b2a74479b2c92d6857a721cc71c84f25731c12a4852fc79953a2e8ecfae18fe3e85dcb6c328cedbac226c3a05d9faa3e1e90e638332684ceae0f9e711cea63a7bed4b63a5d503a3d65edfa05d9f5c9baaddc34e99cf1a9a605f563dbff4b51f12b5d3a3ff9953b8f4a50bc3b8aff743c07c5d7ff4a14e2c7e3a65a7e293a7eaa9bede7a7ea7104e9c5f848685aff3fd5944181d07593e0c781b429c3770542fb2641da08d4895d85d04fc7ada3eb6a4b79a9da6d67d71f2fcdbddaf5b795e3904f6c3aa630a355ec0964c4ceae942c954665e80628c2b317e78debb6e93e67ce1aaa2a7b71deb83cdde7ac51179d39cb87ecc579c3d37de27ca7fb9cd98b2dbed6de7a6bd6a7fbb43e84a65fddddeb749f2e0b9eec147bc67e50a1823d6359726cbd67cc87250830b44317623f6cd13603d833f6832bf6838e4dea978196db05aac97f0313a8c00711c8a0015eba5fbf9eecfd3b7e3511d91978154df841c36ccd902a30dc404379911a3f8e603142c3210a10ca5726946b621002b2e5081242542214c821488e196af8b28507e543724c68814a141f50f8a1468b1a54cfd6d2820df9123b2108947f041ca7f2006911f203882d1d388107e542386092e242c4870f69d4d420dbfd2ed180dd22f8697b9d6a3bf530188a6321c7aeed58b61d77d98e5fdb716cfb573a27a5e1114d2f2d3aa229a57542715d58cdb1dba63589f45f2a9d4e17f6c1f7b7b42ecc9cebbd6f79c164d857b664fbcf765b7a735f2b3307bb78d88e615b2e6bc6f0ebc2ddb265b8424bb67fabb5ddafebbef04f695335677bff9b6e24a10b2a5a02c5015b04e5c4be09a80fbcf196d5e4b713511c9a5b12dd72caa0a422da9d62dc04bbbc845b2dec721c2e9668fb942b58b63f6e82a1d019147b49bc31d8be41db7f1352e256cdb1565bd8f6eb38d68319665b0bab3977ca34f9e720eb2188ed4fda21d88cc14393b8b5dd1fb78ace6cdcc22d5aeb54364954b036fd6ebecf9b7967e857c6a37da9cf8857fb7436fd6fbafbb669fd5f2a9d4ed9a66a4ead5513fd0b2e389d4aa92791e80f75f1129da86ff4917cea7967367dfccd400ddcddef0ddf4192b4c1ef47e2e71bf867ee1d7b435ea2f97e58a41e919774d0a437746bcd963567a23a30badba46579b31983da1f2fd1b7b0d4969a32c2a7f8bdeee7c4f96680bff9e718fe200066896cb1ddbe477ab103b0f188016abd21af0bd1053d9862b68f4a46efbd36d535473f05a143e9714b55d30c9a566fe6cd54b092d0f7fcb62e14fa5787da227a9b6c7a539b5e9e4dbf3a9d15780ef7130133fc6701ea688be646edcb858a00992f1436bd2dee3b6a2fccceaa69482c81fbcefbefe79c734e7d47d03df739f73d056f7c0cc1fb6fb4b33b54c2f75df8e0d35bd69cf04be8fe7b5a02f8e1d3a710081f04e1fbee43f8c654082138aae857d0d67e346967b49ac33df59ea2ec50cd21f2bea19ad3dd7ce03d099b846e9ce3b4374c191fd855a24c1c29d3bee80c0b855a409fda249bfe0e9bbe8739f03d02cd77f31a8e9037de76685b53edd815143aa3884d9f524ac96c0a65535b731cf2ab7fd884ec210fcf4e9a811a184cd87697cd2cdbdfd2396746c1c194222fcdfd3f65d4c74b739b660e264b78fcdf23af220633c602a6c93f08e86b8e02480bc05dc70b660c7f4ad3942aa1eb5f7081ffa558cd6867b433da49019b5e6a4eefe5c53c1ecfe5fd782beca5b64d6b12e9bf543a9da614d54a7a12b9752806b478d2f371f1a467e4c65f6f24fda49bd2bb184977b518671be93940858a584039a9bfb5cfa0e96750370bccd9c6a3081604010df8711514e9feb86e52b0b3117d771b78f8cbaeeccaaeeccaaeecba5ea783d6a0fe661fe3bf3167fbbddf4672cef0c9dff35cd5e4371020b9106f20c08284169e0bd159d5e442bc09c1c5dffccde8b06af2957813428b77f12e469755937f8bd159d5e4fee2d268d24be56ac3759eca713e1b2b7e8291a47bc56823fab611e9fe44252db2abe6b4187d8a6f915d75a8139d5a401f145d61b8c314db66b63926565bc553970dda7666715f9ca80be2572166d7477e9b8a1345c5fb2c36721b6f5c2d4c768099f3baffbe0e0c9274a834cef605b5746848020000b316000028100a860342912c0b831416c6071480095c82445c46361c8d460351281c0a8481300c444100c3010c053010c3300c55d29c9804002e007bc2cb977b834d0389c0ffabb40faa0a5152511d4efcb8d7d4c3bdcc95551a58392ab241ff22a7adf51a73c4b7397b502a82aadc802095e97b01a530339c910fe8e4bed30359c36afa047e1087d454115cb222199f16e246102d6c4ba42f5f588f802993e64a5b5028884436cd5ea349b3a93d149ce6b9f704a84ac221a8e7a9ff7eea3c22e2a828a4fc15f1bb3fd04b92542cc40c59a788b12960a502529097320e4b8fa5bed3639bd34951a496e572f32a42cb927cbf4d9a86dde830bfea6bf781f4afdaf7569f31ed6e2051d3331cac19c7c5843d36188c6c55567716427c8125f047d8572ea898651a18503bf91d27d5fa3cb888d7c027a2650c801d3ebfdda2fce66d835abda03b48c4e3cb26840669ab3d3771436bff4df3943aa4276260b98a1ace4cad9f3e907d8e57b2aaeb33e3108999eb012a0190ef263f6eef390298e3186b9e2bc1675c10a7a82d64458ad167a411afe00669e3e5589575bb93cd0dc682afac1750dfc4836a29fae9e3b179e90ecd6fb7ade24cb66df57820b838f3b81f16a0f67853584791e447b9ed9387ffb7aa6f96e7583f08e293f37566299a0c40728f6e558ca2487f77a5fcf8bb27baab2e84ab038899fd2799fe37c5cf141498de8c2ea153eaf307c685ee06dd98f2e350ffd1fbf031292377bf71710bcbddbc1240a2a61009067cfbc3e487fd36dcfc159c67637402a20ffc1261c31c44236ea694bbe4ddcfd88451513f10798164a5de511db05b85d2fbb3878c1bce518953801da96b69c46935c9a3cf3c620e9f3cdb93f4ddbeac0060813e9a4e143723605b73c1d4612c43cd7008032a1cc0fb99c330b230bcde43aa012bd5a960fc8349819c382a50813aefbbfc4d011c93f7d07ec13c81abb57d151495de36ad973249274f354ec1fc36260876591dd301cf0f6e66576add1d71be65cab7f959bba5cebbf5bb4468b002cd873f34b19ecdcc5de0186433fd7a000a267a4819972c3e58ceb00bdd64c2943386135853d237ff72a3d33c90c3d96f1623d663a8b9eaf9da4ff4f836f805d9797ddb2f74dfa33861ce5c5f648e34ae93d19d47dca69110ab912adb06badec8dfd989251517922e7549cd1bb622d38265a30772e76e420245f645fb90d9eab05f6a3a61bc75344ee11d3b9a764c5f726c33ba64b369c3affacb9d9122087d5f354ae2662490c54413d8252b5dcee3b1bc14f0d4a0f63800caded49ed2dee1089f181d152abbc5673a8de6dad2551cc3e3c89469c3159dcc3930fb70b224f76c69bfeb32e4260f86c805f2d4923cb21fdd7b0a3393b1cc5ac80064f5049dccb2314a6f28bf7bb85661f4975682a6add40681375f52932b25ad02e32d5ee0507c7953d2d185f90447e2bfd82fc355d1d9d06d5cb50906c16a7933a512387ba2db388a5189a56b599b0e0e749b95c1f9c950711c556749a650677a788cc0ee48896d5bd489e204a355438883a893de390750768c124b61b25fa5861b4ace3b9595e230fcaeb3951a77b33b7f3efbebed574c618101ea50031d31a20bba14521cb7a8a3c61ae88460204cd5f51a57eb32bce7d6256937ad390359893e5c7abe404cf0f4cc9e0d2923b7280c7431dbe7e286a27fe3b899800147c96f42e58043839b1d6f7e132cde5a101336e8bbbd5677c0ccc3fbf5471c932cc16930baa1078145fa01635b4f0758ff437f9e41f61611bf9647e4e69c3ec680c020a0d58b96e644f5348741ba82a239555ff33a6d8aac96c2c10f4a1efc2b011b3e403510958acc5e70890b6b2bc72b9a6b592f20a1c7b7e7e94e9e94d46ded576641d4c7b5de17d44ee2cb803c97d4cd57756a2335d89f1a57aa16b80ed1acf5d0679618a1eae3d57a50391e525d9a1059200ab195e6b0e1aab38a4f0bb661878ae28388f1b5c6a92a01a51dab1a821868e5e571e60499fadba4cd754713659e2ad30ddbac000a11f1cd4295f069bf2f6c5f98548702e62724c92cb10974a4298400098fd11123a44fe9eb1ed77832bbf74ef342303e4bc739ba16a86362731b39ce7ff4119d03e60d7f43e2c362a185d37bfdca66a2665610b1ee55afa921fed16783f2940a17be48d2c135e14c864dc80b60761263b825fadf9db4f41e49759d7babb796e584e1bbe2a8ee0bf1b1d684b5e3d0b9dd9d5676b893b98308b01657b9e46710a0b734881a3a95a6cfd6b2746cc1f7ad101ac6eee65e359642f2ff96a7e0d3a6a98dc7c5183475307ff5f0928a4763dd857fd2c917f4fe43b7d9571625d9ea5ed5089df79e7f00dc70352e2c613d3e70a556a6807217391054ab6ee9f47d6d3574154defff01dd5a5587a7a5bd57d6358a6a23fb7e0a43c89537a26347c2872c0afae164568b64c3c938e5b88066c15c1466e6906d446efcdc717eace394cf75bc710c8cc6c884d100261c4ae5e4ba7669eac7957097d63708df715b3788db580a82d7dcec6423030698f685215fbe747473b33d3d07a12ff0e177b50620125ac54aba12b2be695d99c2a85caaee6be36a211c448aff841880a839e8d8a4632d8b07e2ad01ba0d01cbe023c87fcfa959857d0a12bc0d963521233f5118e7fd57cdb3dc4b6f5c394e3f9f8f303870c30cb04ec81e9983ad03be8476afbd47743034da4da7a47d523ee8c0620418181fc3d9ededdda6b8cf30c0c71baccc41d5e755393e0d221270ae7c79b8023847ad870c80396e7de4dafbe7d8265a05e01ab6c910249eb2911f01a03326f00746aa0a19f8d663355a09dc1fe51a2ca84f6926906672e38f0ff043748ee17f25b974c469f5d21e710128c610cec9d48c89861d9d01e345b5e59592beb5d600ea181aa7eb3a91fc20a9b5875c26e2eda788937a85b1fc16755876bb6a2a7a9b04dbaa360c65d6eb9ee18cac3ca673e186faab8eab82c0cf5f3bc6d5c9149b97ba6d6bd20763cd4ba4b551c33b820cca2e5b61698777a900017157307dc0a2547b403db2ec8e117f34cf80b4800485a241e9c9696b56d407fb5fef823f19991942050dfd7f503cd7a98b4427141472106de445a2e68c0b2684333687362fc85289447fbbb67b7278975a0a70c1f726502a15c940d944846752f9c20388e28c9f50e5b1a930b1c8b6e430097b6113f61ab67cb3164d6f45f8ab6aa2c4a22e4855b5e543bb4dee3152328804c6ff4f3d32accf20f515a15b4787daae4c6d423c9b3d3bf59f0a9dd479eb2d6d1de8dd4ea8fd2c7791a8aa54b028dfaa49706165b60af262e544c70bcbc7923d58b3770aeee62dcaa7188aec015cea12573aa6a5cde3956a930a4b642a57067c4fc00e04f199f9513390037dc19c5d8e4d1dc54306a37bfb5a1afe54192d7f32ae68069d67ed2f2bd607c83512375d61a3f382883343d64a5fbac53d14d1ff06c9c1fe57af31e450d5419bc00c596a78ec8b950e4040d6933b46a8b6497c616a5ee859519e4a60e36268a13308baf9ab1684cf26a3a51941f5f3b23f1c2058c94c72ca5afab39e853f1752dff21f5ccaf0267afd01d80c5c34d507f3ed70784c2ffa95a74cbda30e0609d960ad6ec97e8a83cec05042d0ef2ae66c38763ec3d27175b330137866aa2047d22dd08078e793498c260217245324c41074b78913a6f5a61b14aa0fed74aa986fa2174a96f3728b28939e87c12561cc8f1ca4cce17d4c7408cd6a9303aaab73f62eab489582225b286b3a686559753c930e63e596e66205dce55aa81020ae4184caf54dc7e5750bc891c58289485ba572a98a1ec2219fe7a1e3eedf5df20a4b46031b0307343f4a64278edcdbaa5a11f4ac05442b7fea26a46e7be081842e9ed7fb1dd8375cf907d7264f51540f85b82dd10df1236cd0e6bdca6620afd8fc6c1c1eec57533c4950e1368c8d881ed8570e5eeaf6b920cf3ea3f3acf21cdbc849a0b107c06f0b2eb8b45e471b3a31aed54eb72556294405b2a1233054205d870a0ad7080da87de8415b016247cd51900d1a7d5e01a30f546c289b1e98e986a6fe06e53980295db84e975c06e5124c0eee881db83e1e530a965dcb41b859af142c110a8f9754cf1657a65bd0f11099a4f85ec69b1c26ddb9f6de295634b4401c1178ac28fe498641109f7d56e41824822cd462b6e57394a6e7ad99f9c067c41116f59516cf9e0fd73c1248a82a07f829b91e3aff1c08f0ee026a715db17607ab029a6b959508b77dbefac07b387c0428497e0f6a934895ab853e8c090a71e865728f3b9776d0e369bbb3c7eeeea1d7c7306e38b04d3c4b80838a88717e17c7c75900a47b89f50163b6ca9a30b0c787409c8702e74e1db9f7394996454f892a9f76471406349a28ee628449d1d1034c26433250d09c145fdc746fc3468e31c5d034601b1c8d947d4d208e6bdbc18c4b881f59e79d6808e7afb824de94582b57f2bdfaf39812c1feea9189c2b51c3a98de934a8a1d7ec5d60e3ac93fbaa86f4a51844c61ad35e86f756065e6501a7d6645e0ee75a8029872c81d1b7445debcd2e9e6f7ebf5974a5e6900ca348fde182a03ab85196476f6c3ddfc96fa94a9c5669121da417d49073129093a11502bccc6092722920a389d198ce8e5daf5af63dcfc5158887743f7db4ef013501845368e3d739738f7db0a57a291c890b951837e8e1860b4a12ae334a30f0a153c8f12ae4a69c6c2fc3f72c5fc3f5e3f1eff37f1b1af960d2289c91de6b9c9bd6c6818a5db547baed01260d2f4bf9e8380ff50dd63c8757547effc81a61b3d7dff152a7f5416026cea05de2cfcc30298855d570187605b6c6451541a7df40b56624b25465fc85e28701fb73d00d568fb2374941334ad024ee50f853e10060102884831f2d066b15a35ed419ef3e1fa16207fdc06a9a7d2065dccce598841edc43e70f9f2f2630dd198e52814bed723174774d28289a97413b77308d4aa7918ec264b99a3e3a58491daea2e71fd35776281e8d02f4b6766f243058fb10b75770fdffbea2165f72aabc59fb571a57d80ef5bf87545394e50cefb3d952cf1a36047947f807d0eebb666e1135c6d37debec11a6d66237e873d6fd80fa5298d8e98db09d820a3054bb0a2e96efa48521202e92568bfa2ef7a87ebae2046e931c3cc2705649356a4f23b4f07ce1c264c15a0ed318554efa0cede1ba862deed791218fc6ae687ff7bb0ca86512a7d2504a5749e6e8fce2032977d0c17c1884b3eb81b76ea846b8540bb6b36663dc52ccd74f40135f52ffe649a212f80dd6855e1b1709dbdb87c1899d018393e222a6cc57e55b0d6347106bfd7d943e88240ef8b4efab46b597b8c8634b96be1ba26ad8bd22b540deab4970010df7adb4f696d87d8f727b60ff58b0f2ef2936c30e91d2b4cb63aa759a0b99d4e58784468c371dda622ea174c7d73b49aaf5d4a25a91e46db61a2b5ba3439164badd854ac09e023ce4f816bfd24e9d424e50dbd793af6966fb06945ab18716dd5d34760c0fb574b85a027a8f674e9fe86c57a902c109f9da8b6f71b3b7242dbd333ef9db2ce574db97f07d4573ac724569242d5d0f73b6416f01bc116f91adcabe47768a826a5ba71964eb431734a16c3cab48b2285ab18cae9d0c16e2b8893306d2cb47694109f3aa9f5fcef6f5d20ae0bf837774b659b74f9ee329e4d417084e6ea217b1d0e01c141ffd58197872e26ef45e218b91bd3a867561434867958a375b026ff41af3d0052b5b604bea56aee67897f8e679f674a12a7742363290a928ffe2107a2e8c7a09c40ad9ec8fad97e4a2230e08110cca72e08c88bfda641c216dce13afd066990f66b1d55f0fe05e7423b1cffd78c24b1005b6dac01864e33c8305f1ca811c089184e80b818b54e4cbbc05210b9c54142939c7a63045d312868cf373ee41dbc7fa9a89f30ba368849924ba36b0f1f3869a33b1f79a53757e415190db1fab77352d6dd34a9b48ca6131054072bf1095381685824da37bc575824ac4963ff39a0088bc41ad2c92dca77f7fa91b7f9e59d9909b9b5f4c7fca84b5905cc495a8c3b624e909e9b2bb026a56c8a93e6caa76b5ef98147e68226c5a7ef8c095377bf0531eaf893a05cc0694b2cdaf5b2471b6f25b1b47be5766189a46db605ffb371d849f5e2f7916e78a2cf9c1c91c85a1efdec06a8531fd7b102db90f2df947f691dc8383f11535589e2874ce02d13a1b08d5257c924c3c9b9cc686b68be66d7c0cb3fbbdeb2d16dcd65aa149edc607a2bce8d4697b83c1237094ac7670808190b3c3a2120ea2b645c84c4315f89fe0a2564ad306536c7b9fc4a4a04c81ebed29258a0343ae83e4927e8014b548e9f2528aa39510c5c8b2b4b56c1fb61c6094bd0a9ad9d0b741c56715dd204d2875c6081e4fb926805f0e51fcc5f03c1f99c1b110f342bab3e072d4dfe49b6dfc820668a46ad2f0286ddf9cbf21895931d5b92867d3248e9352403820c42300ca1319d5cf024eb4bfbf870c79465f9f84c8ca07bad2c6db44885f2332e13803cdcb9b31a840a0987417819cd79200ce3af6f9840cb0092d8e14e743ac14624121de7d8289d144673b833930e418677131074a626fddcd61f035e230ffa2eb273a753f59626e9263790717d4007a1d1a6d58d81a4f27e5305f53786722e2382c135134864b5fed04653f071d422a72d19ee5cdba02ff67433a2e748fd30354f6c423a2a4f29066934ea15f60422b159cb326939b62d373005a52e2ddfdaaa19f6fc923c3bcc701f1e8ea595c44a7791b68ae3a5cd986b92d9da841a802a506bd087fd9b7f73aab877fb20b5d1c77076039e39de669ce87cb506fde59afd30679e671df90d405eb0e3682aa5930c4f7e31b4f72eec2e3ff82b69a3a58b703151f6bf2f346b1c63c5fe5d68bea80bf9eedb6e30c295ba88b9832cde7e6421833e882320eba3f01be268f363d1b60a0e08a671d5d51d1a28718764356be0627dce8219c07dbcc16e4911e8e9237022533f5dc0a94f35d083db3a52ffc2fb93d88c80c91a98c632e62114d09089f7855cb59daa1b36794adc14110872e875185f6b40eae9073876d18a57315042f4e4742991eafc3298cbbd75829a883436e706158374109fda43daac23a7ff0481dfa3a3fa126e1b2616f48b084f0d7e73c25d2834f3855c93cdd8d68ce561109ba216e3566ab758009efadaa48c67066cbb6454146425aec586b504c58b97f08a362d8e2b0ce24302ec125d0da2c415923a31ee8151fb56bd149d0ba67fb49c9f03207d18ce83b309b8dc302d224d83a49005f167ea3c0e0c0043b6a9703dd9386ba63e674e950d2420b292213700d78ec04c7fb345a64f12c22fbf58b8da9e0047b466718292213ef430685f18b4794199ed98939c4c1d670835b338d63941e769905134bb2ccc7f75241d209c3ca08c903efb994e7a4d4c729c2e74ff07cd720ba68cd006e126f91269f28cc53080ed47a97b33591b01693558b21276d1a4687c5c80be9e50f4e69ece5063930c023b6d90a9d78807b364383c728e18749b8bde8c31b34d80e4a684e7e0828bd4acfd806911671b0a8172ce296814d9f62c9d3a6a426d4af6d6bcaa93610c7cfbced2e7c54edaaaadb8dade71ffecd876ad8345e06cd3de00f58f8c9844ce0df2bc0324a64da4b0d38ea22be8316a6842ca8e1495a80b945b9b6293ee66af390249a72db259e2f1fabf370ceac2630b2480a41caf8114eb3556a11a43839ee1bc3ef8d16d438edf01b20aaeaeb92abc11bdac839c88d6afd1c6b507fa34b8341bb01477743ebbd08ef94c5a4fe9d492989da830a490e8827ab93e660b954896a1f6837aa978836066d05d188f1333ce18ef3faa475a6ad85c46caf709ee522ba5c36b4f6e63a34cd11a47d76a3a6aa656744b16026961dcbc0918ac47abd3b61cc37875533a9d21f1f67c201a7d3048d0f6d761b3e9cae7384fd12a10ced933d5971057f18ebc878ee35bb3305a42879b912a8cee8eb0331f31b2dc0dac0af1ce13a913303bce416915c1ee258ff32ae7fd06c56c328d10c68e45fccbb1a21659b4b5e465a8b5caee0be3ccb63564d0588052501cde4c236c53307d2176300cf46066a1da57e4de5dd1e3274be0e093ae3fe54249108e654ad3a569b5e2a71918f0bc46d22e2ede904fedba84faa3fa856afd19edc23568ee9484520a6a3d0f4896f8e831a9353ce2d5007a93e6b20eb4bf408a36125ee1d0a94c61604088beee9b45693051a5afc688297fe6137d175feaaee9862950f8242c75a296427d04665014c7c462fed193ccc706aa960a90c959af86df8dacb088b4377f349774993e770e478049a79af0144b23934511eb1989bf31253163bd64a6eb7d70da95469862a315eab91ec7954a86d88a550db573a40abbad262fb78baebf195074d21d1a79a6a5836e1f2b0d5d650bed561ec3bb40fb4045e9b7ab5ac98b90ca10491eadb8fb8883127c17c5be6151f73addf6c5c3b1829c4ad05a3d89f347ea9451363c61a31334f74881d2719852e3e82c8e1cb130e9058b62750d6080ede71ae59dc859d34afba63ec68930e915d2d30ce36b602b1893a5958c3faa797feaef173810ea13f9faff5efff498e470dfb112cafeaebc780a9b200683f36921d94922598fdab0653e731272a4c638c94bacb7c06a32a990e8064f74332920ce458826fefde8fcece307a46db527be07628aa49f16b1f6c5c09a7fbefc2605e100685f1bf7c87847985db47328f41720d5611a634159a46875384281662be628717e841d03e10950215dd89304bc2bb2e44dee0191fb3fe4e36b6f077d6c959c468c95ebe462d9a2b4bec887b91d41af40a6844deba7fe918e82ccf37f9294e89c50d9eab8f698f48428bf6fdea484812e5ad22c23ecd7421338e523ecbea4541e89526f199b62717570ebd6f59f4b4efab57b019c8208ffabd7a8193b1956ff9088e7a74ef74944846e5a04bd9c03c38da52fba9ae88a9d29868d5cc960821b910db878b172f1f9e3d5262adccf8d5f2f788a73b7dc0f681e9bd62a237874bc4691014f5dd93ccc4b361d21b4d84f1b9da1807e32e94ee81466492e0542430c88453aed76c76813040a7c53813237d5eef617c7395d134f90493829602c95971df55b2ea554b0ac697454d09a338fd5065f15ac16af9a3cd5e0a9364f3578d5e45d2d1eb579abc5534d9e6c8dc7b306af3fb68ef7db4ce9e6890ead95670dde35e45d83678dbc6be0592bcf1abc6bcab3064f5de3e359132f93bdc73b60e778712c68ea47a93d80a8899c5892496665303d22da7edd345595119601b979cd1824cbccc855b7c58b8d3d5da9f8670dbbbd70496cdb37294df9e49b3867bbd200c23a45428d2fb6b6a98a10d91d448f36f44a717c680e087daadb023da35c2be51f78200a68c8cd121dc32cc2651c16d55e220fb326f8c61d3012eac63c570250eca8c6b9c9e4cb8fbce7a5f3c07e7634dd433bc2675d10c5fc5e1ccdc717ee028d01e3c1617680c35659c574002e408b2752300589ac4414cafe828b8e8c7414cfae4dd494556febee81cabaea515e32b1e35805a40bf07ddeacd004e11330d6c7c9a49c6c4706bfdc31e403fe5398ca32c06605fbc9695b05f8e6f67cf3d8e1be613bbcbc234bec9c4061092ae7e4d778d5827e32ffe1fe4523ca8fcd7ed55f1f134ff6e6b6f687f6aaf6d898a2b0ff7d1ff6f910fa8ae9ce6e85522bd7e7c2363fde51031b3595023189297c981212acd3eda971cca2de2fec59684afd0b71570ef9453aa61ded8f51794636670efdfbadc5cd5422e47ebfda3082d06d91c3cc9f379e8860fe7882c67a3404d6e0194cd5ed502a207117e6e78bae23c366e01d0e91286684ed6a8c28ac0fdcbddecd01f8bdffaf9fc369246006d853d2935821061bfd66ad9be68039d588bf466b721bbd1500e226c006a0469ec375e3525be193ef506040132406fb49e4d6910143e2e586e461cccc501b45c2d311bcfaeccf1b63e40f8d6a634ef51aee0f37c73935b2d3295299c8ad786a3bd6ca261c77fd5b7b421db3d7ecb6eb840376f0261c9502d2e21b9f34e61844c0e8845a3b4ae229be924e3146655de6ad1108e995244326d7ad60d2b49fa9960c87e6b8e2794f6236a5f265ec651770d5cc9706e389a579642d0b7f624da95bda06c3c255333d2ff2c761017b6d978e1a10b2339259e229a003f8fccec5b594f25b4d41de4a02e1ee4c6ce725526e923f132689633c8a64c68fff2f8c69b5e292fc45ed41930e5288fc452b0e2f62ab851514a35e5a0aaa47f8c12e4c16e3244ca7687eb93b6e86b7768e38aee05bbd221aa08f17d91999950165a5a2c8bbb2e710518cfc9782b421784f77352efa4c7cf104258f089e2e78c16985ac06b86ce360c70b5b0f580aaac9507e8fc8a532dfd884dd1c457b4a92089c423d363384c63b4a724c915897e4ec4816745ed323c321b3f9af83945ce8adc2b37e8d2e9fba4c3f67fa34996eb09c45206e4c002f4ac9fcb203d43d1d80a055ef43fce41fa3a71b94715fe04d4dd150054424d90b87e45a3b658630318a2abb21f66b9fe2b9d75065c46582fecdfbbcad57a4b579c1c1cadc012874191731e0a78cae9b7d2fafc56f0241f2968ca5580ed3f1679eba1cfd8100b234ca9dc78be7e3d198f40bb05c4debbad77a5a504a61076e4dbef1b16903829bacda66ba887cd8d407e64951cd0e70abf372b60514c2ccad433dba3841d4a9a75e166480c672ca6d82f05750b5304c92e4c6d8a52c9bec2cc7d3951490881dccce8a6e1074b0814e2cf040805d65dd0ae31b442a98596fff7401b7746a1ed43613e22848e04566c82cea3631f991e32a9fffcb63ab92cbfa2615d29423b1dc2b296840a46ca4253644ab8348b831730f35333fcdc24ae7d0373f1f2f2ead41074cc5a3d06d5b54610f911b2b8fe4aa4112c66115a1a023b5079bbfdc6060d4cc565377401e438b5e1715368d8dfd32eb32706ba6d4c1886a21674936758e62ba996924deac882f033df12aebf6ab92ce9e8006ee0787e746208dcec7dea56341cb0bc2a6f06c36c900ec2181f311097487c6e7dae19dc35a385198575559f00e90cb183a2ff2974ce8ada8244a3bab4a31d7835646f50923468b1fed3f647ac39656145c5b498a85e4f8e374b3591cf3064940ec41382e781640141b20062d9de669019d88410d709923b6d3141c0e7050f04066379c095c532bc2c170d046e396120450226992863576029367583d1e67459a22c6aeec4ad8d59c510d9568f3cb26240298b06314881b803d0257abc364f1681e5c9fcf27d8e8a93afb1773afdd1da66171bd78baab877f41009b254e56cf789de81af6361b225f4253ca8a85008616b5516a19a74d55b611f6ad316d13016a03d983d4608ff886a502a1f453a19aeac6a089e7be51efdbc4653109edbdd6c824021c1409a66a3c549c425a98a116953f12ecb1a41e1d4c9b465e770a2520e543b1be560054085f0922169020f3c391fe82017bd2b2148b18466ae9925fa1da6df21f3815c76b477202e38cf482b2fc4c946047d3c4378156cecae7ba38368f7d5510f7e5a03cc4484874d4b7d99f0d1ec56f540c0de964995b4c61538903f58bdca9414f82184620cd1056c159318682b2e824ccb8c55ce04083737af9b8d680fa964b9679a21a2b0526a01b6be15729306f735a4b80ff2f35bbaf8eec2b864ae3a2c54a31ad7950921883aa2c4ab5ba18d320f2630414a216d241fb285c21fde5a3545670287ff21f526e7a840f4bd883a88e7db253e6187cc51190e5b4f8aa702d392660d2c4ac4d87033bdab3f9857da2131a83dc27c9e261fe746fc0e56f92570dcba6561d52398359cc51595e4b0089720b7737a4e891dab2612ecbc9cc62e72506a833ce2ca4e16044a0e23066415e80e684185c16431351c9f857ccec71b4c403ad25d98383996414a2150abcaab39712b3badc74bf3920074b66ab80518aa15933913beeeb9c5f513035c80023310d7c43fcfcf94ede9d041ecc1c2d7d2a25d6ce2b941966b76f24ca30a054127c336a7dc2f3758e6e6e019162a0df7ffc62c88f80aab80db01409613abaac99a36e1854449b0c1526694fcce60b694cae9d34fad21cd1318a96793b2dcb9711600dfbd15946a5f4630d6bc16e8b44c028fe322d542c00bec2c8af05392f688fa92fbb6bfee51dde978a1e2eb33b086f99ab0c5bbaee32d03c55917158c83486129050de6d5954168ec0bef89db5506384ab49f7d637f354a4536acf9d088fc35041cecc115e7e0f505b9475c4dee3c72a35276c16548f7d0fd1b53b2758f1cf9c6e0a285e22b2519781a2575a88560728d5d9417e2c0a06ff946db51646b1e17670f09ed3d0cea03eab1ed80793beea29a53eace5f75066b9600ae34cae5887edc1092a2e853e6600010e4b117cca4ef255d90eeb50893235a361886e1de221db0093a5f3e88ed7d0371355ef7c8ad7ad3e6f1abb1db1efce4519836c01a7d004c0347fa4b139f177258a773ca90b50a25626bd60981cd5e7f008dd5252f0bb7f5208206e23dd68d22a0003fbea6962257433de3c89853eb00a4c66edd229a363b5b75a48618225291e5cb6ac6d967d9e0781c846925480aa026c56df306322a4f75e5f9c9453d031b0c3fb8027fc41ca15f2c369d035e7b9e2e4a1ccb05cab00acbcf05296043289bbc6efe3410b4e8dac529e4b04b0d472420723e683d1fb38aa8362b46c622d2fef732c651e5f683c943a0cb3958ccc6020a2a1055e240b81697a6a5bcf1b9fa55a41bcdf864b008e1eafa21f2f12d09634dc6c17640c12288ffea12545b11e7d331155e38a9e53804281da76460fde848191a47e6bc2f48e083e97c35464e557a39fda8d9964e7291f0de44dca4dba7760e4d230d5878d2790a0425ade05f4cd953fb8cc191cdd9963580c1c3085a77612bfee92184200d197fdf57cbe9ecd78d646cdc8c0ac7e4081e8d130b3926ae88c300cdbe4a55c8ce1843b7839fba32c0bf36a325a128e637ea3600a25ae428736e9c03b7079d62c10be81c8b61e5a4ed4105816f99fc7992fa9e933023974e8e39909591738d1f383ee241e81451203838a5f4e35068b05efa3066717362b254061f24af8669e900d3aaecd0052b1e1674c546a7612689190919acc00f25ca4b816f4277e408f845c8664aabae2fe07aa1322364ba481a468f45f37e1ac00fc291172e82e671acd345814f2c585512237a14a80a891c662960b947577bdb5108d51a93d69711c3b20bc41ab81eb885967b0f651691e5eb5868a6ba0945980a098ee60e034ca9a8f4499749251084587e48b191b6107ca48ac1b3b6b42ab33935608db71ad92134444acd989eb5aac00507f27cfcb255548f8376ae9a873d98409234292c8990f4f3f5c0d1119cdb90cbf1b6b3553206a8a2faa26344c2664d27430e738bde74b814ce0abb9b1dc200201c6278f42c46d2f6c862144f25d744d660e36817da81ab471469512ad8d40222c021524581031024fed0903a72758d480af3d0b4a816a38af94604f63a379a543a3911aae043aeb1aaf94520e5cfaf901d8b13fbb6ade3b4e0f4098620488de050126a3ec98d1fa99f52e51ec6d1569b99841f83006bb31c318f492a72d0a4b47a093370bb1e0d1436180b595592c55a04dfc3c37b871502bbc0736c685ff9f5161310386eb3f0255a39e09a92960fd95f1da99b8f098a488a6dab767285765f45c733658e11afa0203a426515b32716d7daa5c4b8916402222e1c3642478b31477ed6ca6093713247fc8b8497b4690db28755e6a2769dbcd6e1a3260ffa9d104f9bf2ccd4ad47edca59d450677509b020f430dc07c717840a6a14285eb7ad4608ec6235fd889289fc1419e6daefd9a457e07c74c8eb84b6827b8b0a070e760d046be0d8b8444dde77250e3ba309a4fc2b114113f6b5398a08d33109baf25cd147134b40efce466260dd2b8a692141bfaa99d9c8ca2ecadcb0a295d232d09f87922694250f144eeeba000f26cb806ffa209a37eea8c0e8c3408ed147114f429bba4cd14b7a0a00d226d0e016c9fb6696460e82cfddaabf956be2bed55400cf2c09c1f28ff60e5901e3843922d9711c2409e74b9bb2037939cad6b3005121d2bbd4965161742fe69f05bd36b789a5c071e2b56c8b953340a330da8c11705bc5e5fed2e4980a84f79a87e2428da53e97bb25693312f9b92a792b5e3610fcd4634f342104a731c4de7c3519c44e86bfd4e0c48994f7a1b9ec33c10d20c838ab114eabaa1caf8d2a551f32d82d2c3f800cecbbaa5ad50d0c6e5ffd76f6d7328f60364a72f7a33e30d92e399284a37244475ef7c1c9006260a5c9307adb5e5aba64383133b2546af5b84eece632e0435fc0bc9b15e53b695b412321b2d0c042ab1e486f7e68f2f14e3dfc58bb2f18a6bd68ad31a09e9608b9cc633dde3e80f15cb5799cf7d7e6d14cd7b175b6e282adba5906c2795bf85124ae0d0ffdd053c1c5ba3d4c6b1027a26b96072406cc30cb80a66ef1df3d13014d71cc57c75af07960659b34abb09fea8ae81d4b301293efec169b3a78efc183098c2a6c2cd319907e4fb9979fa65dda41e88fee209165d8f0f5b82d49cac5ab7737c001aa63c60f26d25fb1091d746266ac9671df533d1081453d2e996b111d5cc210b03196a55cd5321c0b48c4dfa0c28625c87f83ce1f000789e3e2c3f9785f91e087e06cea8562beb2a5ac32046b85c3696f585c2f2608253b4e90ad5025746fc4394ae56474e18ed1eb986126046086be590907c2094e4e0903768305a0b4bb0385d97df6673707673c1dd1a6823798848c8ef9ffcb04f77f52d519c713a2d8c437c376195740be83f06315a6f8e2ae9574c427940afbc84787714f2d1929f4c665a827b04e3e26ca80e3600072123537c75dda709c5320be84dc5be2599d82791baffb06656b39209201a1f8403f850b6c9a188d803349a841bc2bd2365a6b3f735f6c8b505b7c8492abc9159116f69a93310980c0c7f196f656cae57c34b056ec11d4d11ef9981f75b4caf34b8e3389a50e06b8f14b4e3224bd2cc546435aca993d917d18ba015ebb13bd04208310c025caf1ba128c249382ca0018ae421db57cce6451eaaadc1f4c0a8c823e046c2904bab90e0a2733f7b63f4907e2697801b530c3f08368f30334a9132b4af653ec37848d36102a6ec083fb10229f621c40fbdfc0002f55698dcd77cad39b54a9f4886afd81b06d5d5aef86466d1b0b2be6bbb8d18291635c8c41133ab946db0f0749b0402b62a2323626c14bb9a95377d1a93262e0563b9623dcb4d09b759a9528aea1fde4c68fcad8c66ef4e24533d4808a1c17235870e90b5a88ac791a20bc09252c631969b00751f0269bea41b077008c32cf207dddd920cea6e84cf208495c8196d89517cd4ab7d977ec1402ed00a7881642b98c00b31b0b2a82ccb49547e4133d94aa8b41decc31bcec04968905828c9c99b6a8f13743a492541d1aecf0569f0b3f464f0b4ae6620226f964bcc2e9d8e6dcab14083a2cdb8798361a33f8135137e9cecc5e33777e0982c794b8579bb116a9db6ad07ff52d681578a7f499835574a4b2a85420e451b76bdae19254499dc22f43f2a10f49b026abef1575c50d8d1a803d9da1170905b6bb2602b38617d00f40eeef6944691980c890590de613f052b24a606264c5d96bd6c019111fbb8d502802308eb6d905ebc621dc6740c8cad049fbbdfcfa3bbe39ac7db03381442c8de7b6fb9a54c32251965056705720576c66232edd56c34ea6ca1d77017360365bb7cbec23e68436961c8813e1e1c2ed45e6b90b07fbf11538c1b7ff80033621a31d58bc371a08f03a9480ff7dfc8fdb60a055b3feb36903ce99fdde7394a45c68c986eff88a9537e98c2bd36982dd520b83654a77c5808fa2ae75f6e6b1b883bddde40414c03b8f114a4e56ea8175b702ddc8e8a75dfc8e55c42ce871672a024d829049b035f5aa51dbe5c3b0b887c255f3c208107071272b91fa20c5a1851fafb399015aef0e14413429c6802e5440f5213536130d4297dc75054d80f63e236a83d27c27e1c881bc5cb813a4548732d9d223fc4f1e0443ed35efb4ae67647ca8e5625f56aa5af584e85fd3c66d45efb60294acda0c50709ad8b65b81db79f7fde6832557135aeb3c1f409c77fb9cb8ab0cc815930713f0ed429f194c50b07723cb0e66a9097bb1ce4dd401105c684bb1caee7ff3610ed98d4d07caf4e0d7de995035f4a3b2635f0e5be7c23770317a2cd5d1dd7d25e73a02dd56da8f64676b09aaabd18e4d2ff7874a31353e840c993de505c4b75bb430d282b9db290b9f1b4c5e97e59e99405cccd4abd6a4fe6f68b802cd7c28150250ef4420acb81a467dbb4ada5b747490f36d327fd9890144bd6127a4d63e04035bac84ab7ff338ac97010305131c0cb20ec0892b88cc9cc1ff6c342979b8da40703d231a3db9f81d28365e0c598c04e98e9f663a1f460a18a85a2d6e83616dec648a08b9538504b142e7720e6561c688a2e07e24023e10b35d0620adb5618b6ad389073d9669893d9581c88e3b1b5b655cbc8b4173ba66025881eff4703d37c942c79c2efa0c64a10535c04d1e3e74da7e9c4154d11b6dd45bce25504b50a958bb8c365ee46e53a2637709f6345e33a263870612dc913fead6382c3f6dc735d35c913ae2a79c298142c631886d5f6b0b7a8f678c3565647f454509e4812f04504b90a500bb6817936af79df845ce6582e3fb6e96a14f1845f8355ee85dd486eaba6b655eaf25b54a760a16d26cab08428833fffc604b6519f7f93e994eb79d3b4ee62497001f1f6d830176121e9d956bc69ae0bc130ec688fb7151253b8ec2eaec3431185ff7b5b5deec4bbaddaa6b27e81034a296566ed051a231bfb538db647bb1c38039c2b99fbb8bb4b77778fcc1f2577b83b9160396e92bd0addfcc2d2a2eeee966cd56a2ddfcf4d2d5bb2bf56ce9764abe4b1fef557fd1c2bf4bb2bc67917323fde6a6f5e1d778e5f7bb17d6f788b0596c5e57fde9a2ea4bd96427a60fd4351b6640a3b08eb2d39d35ecfde62628822738c726317cbdc35cbd644d98a28ed69c956268435a9e1baf2b1cbdd4fb65a5106eeb6ec34520ffbc9166903a2f7d348e16de962a510569b00b6b21151814454b2c58a21ba644c58b0dc01dc688ab1c2154969a006a280b8f068ad745b83b9adbddce6d81c7356c4edab91fe5ea82b25875cd9811e052b5b737ea36cc8566677f90ceca781a8dbaf8192a5811ac822a9ab089a64754abb0f298467d83fde12bbfb99b9f8dcda76c55cfebf623aa59fb9bb254bb29a455150dde426961098152a9c49c5fce00305f8e307a13b801b7f38c1ba1aa5d44931bc2164e68713a01f4e7c2237814fbc225ca16f5257ac3ca93e663067c6b2a4e1ff7574fbeb487ae8cbee05f73cee06da9da6d8713f37754a3c4dd172fbfdd429920389cd4d20aecc4e459e8cdca4003a037db1801eb0fc039e01edf5634fb05f445d6e8a2937b989ab76026c8e54415e78922e4fd4e51973799e2e376b19263d30be5ace6bb80d462752eb0b6b2d87b3f9d7781e57c351dbfb0e8bc24492b110d829916198ef20e9d93c6b9d7fd6f9631d487a369dff104ff8353a2a47846599a68e4aad403ed8efd39e10d9929961cdd11c35a8e6c89adb6103da8034436c582ab60162f383fd4636a08d0f9a21363e6c7c8801ccac0935a146e4458424526a4f083b13639433eeececae31f1c03a4783c923fb6bec1e86242b1752259fdb4fc245f48898aed625d244f48890a40810646635d9f9de4f32739ba445b26aaf86794560602b17f61321ddd642174a84243d9a50138a902e9416caeea70935610b6c4b1392ac444c214da809638862886e6bc24c088bdd4f434392953c21d9c292224a89494384484b7ae88b98444cf264d304fb91ac444cfd4cb22259b13a228b82587277777777efe81e637fc72c7e444e152c17545cfe48bce43a5e388987bc54f292979a45041c265f9263e5bb4c9e8d5a6fcf2d7cad18db2083cb36128e8c0e5f2edb341932b6189dbe5bf633cb30cca46392bd0b9f63a5a46372fd8ccfb1a245130c09e32f92662d873342e90d26ef4287c38537f9ab7343c9cfe870ccf892d75c98e142c70407171e000f001766744c7098f12ebc0b3362649b0c8ef324249c189dbe9c8c183366683f43ebbbc9e0b418222d74e22d3181d1a92fa29974e24ac42a56b5ebd27a94949454edc24a4a4a28a73f0555c4844623559097940f122aa6741a8d1ce42067f18f7f42a150e8fa508bb338a8bdd108544359d8b0642d49594b755567eaa932514d5555652aaa02b9fcb223658ae8db36d61fd1837d4cd10ac5e5af2f59d28375b554bbaf7eb596be4d8c28b5243d7387d01397abe9b287b58455613f5749562dc9d4522df586554917cb3fee1f9233d1326201895e423c6ebf47fe7c989dbb0e85fe4640333333b73347430d8165f9c73fdc6269a151157790fe74d3d6edabe5369db9fd937bb2589335e764c1b0585a1e67b2a20c4d298baa2e15448a8548afd0a20c325e2e885712f1aa0167081bc4edab078e142c750255416129e7c09e740663b16d4a118bd55efb0c47c30c1df685dceb7d353bda2df9268b4e116807f6a3255a92b55a4b4baa922a8606611bfe916170172912a9582295f4385855a00a64f5cc6c352701c935a06f6418fc1d949e69c4112225464b90442a1a6acf595a40544555fce168344f1c31fae68864821ce4db1019a11dd99155d920f685ad0fb6a4cb1675d9c65cb6a5cbb6638ca3d168341a8d46b55aeba35aeb68c41ab1242b32f63956a8ec5876d429f43256b3b63eda634b1ab5674795244fb85f93f77390b3d0cefb396877b071e5aba356491dd520eff659d1e5aff7db4697df8aac8b1d591f2fd5477b275b495d1db5477f60a31c49966cb11d5d3bb223191a25a4ec611de4ae949be45f71aa885d2c283d3e41965d05733333333333734f2e227633f7b89a22ac04473d6e8bbb8151c17e1324495694219256dc537c401fa01d5d294783dfc8310d1d732c8a224dd49ca8d6640102e3295fb910577990db3f39c63835de660eaca3fc073eb844881e0742f4214447b10d3f85dc8d7164c56d1667e696c7619f3f43bbb4e79f88e2206739f90eb79f8783e084427148412ed4d5aa2c1710be60aed4b5ba845caa2b48f76bad19c2ca557bf12f54a75cdc3d5dfe53a75ca82ba5830b5543602f9494e10bd59b0f9d420bec33c109a280b8f4e4d1a5db2fb7b9795e1fffea1c74d05933ac88e2608fdbcfce2a59bea9890217c26d41f438290531650571826cc36118867e274d18cc9e71b273114ffaeb0eb7ff07564469da2d27c17071fb5b6c7f17737a08fb643aa81f071d440171e1212ac18c5edc638c31c618638ccc551cd8f871869ef18f7ffc2391b0f47b25b6371d94425aed39e860abd626c4ef180b8b6118f606b8d83b26310c932eaf7caf86cafbcf9216420a70e3498bd36de176dc94162fdd8d272d429703713f8c84cc81b81277e27634a947b739f0b664c9d90684e8b5dd80c0a3243d938778d23f89885e7f4f1e36f7cb4a9387b0bd0ed25e6bfec5731d1c9bb7321715f11ab4f3e5f0eeab5272b2733dc75d4c96a9dae321da76dcaeb6133e7dfaf491d933622437f673d67db55e5d771ba0a197b0b4fb3230726717439fb049bfdfae8c41c162d80b8e27fcf1ef57e38ba61a376bea042a666e3c6d01e4f6c7266e3c5141baf14f54882efd8e2bb09f7799c414dbbbdeace131a13181750c5c9fe74960bb578701f91970007df9d7e512e0f78bd617faa4dfc4dfbb87d2880317e0dc4b5e574703251fa362fc8127593ae5ea6e2accd7a15374686febd4f571678073afbf3a3a1c61afff7488e994efa97dd1714c7bdee4b04ee41ac9138e862b06355f7209ec673940ecf55f6bff75c8abd17cd17dd5de4d173b1682f5ff3a8caa0e83ac3a45f3f39bd533dd921f2deb544c769b0ef50a82dd3ed203e216dac981a9daa39fc375af1cccd21e83da9bfc696fbea853e6f671fe742b29d7cff911e6ceafe1840a40f78be1ce176ce41736eb227758a7d9c0c6274e3eee67af4b9a52e0472ca26c11458e6458c3001d835c9152755940229c056986e60c996078f08e094ed23c4dd1ec507b4b8c2b9a754b7ab2ce4ba5cd8db1243d18119811266cf4c4e5770c8c28dc022fff142205b104719e20a65ccf3f436cc3655233949a218fced50a20881e67d52bc43a24d616db982d2d18b79d941aa5760471f99904b7e32d11857fba64cd16d66cb91c9aa1f6d2e5276d3970d13445481185a60813f7d636da5e369616b27d3670f3b1813c326ba46045e152b87b8c2f317af40d6a0373fb65836aaf5b6bc9bb41498fa6fa36294da5a96e47f1c2dedd9a21ac742158603fad35bf4bb3aba0cd12eca7b5409ad4344d896eeeeeeeeeee6e6e96ec37b8ed23500b4b4469799cd1287483f9a1214614fa41e20834881e37c1400623b6e131a6d1cc41ad818d1185fee773871f421d2111e1fc8c58224a3f9da1981e2e68721f6246234e088b9973ce499b4ed953a6f873cbc0facf29432bd0a2b64981200a888b8987a804337a0141954aa552a9a44aaa381d0ececbe83ec02ad447ae54546ad4902c1982606f2a9554a9a44aaaa44aaa98f31f4745450002e828e249ff77e22426a9bab6b09f2c4995a44256c136623a05fbce62b4a081303218529565946a60045b2f5e038940010fd146e4bf4b05e3494cd22355302e9354c1b0d429edc0e888bc00e95b9226b98b0341f005a0066a5a9d425d402250c003942a10942ae9d1400d045f0082600a002d08126394514af9028d11ee7290577e0e726e45884a30238e3176d75081b09f83abcf5c620b4723559097fee983848a299d54543cef9f4b382215aa00572b1fb89a506225097e599a4a44e740617fc43a97b83d2ac97490ebe309fb796bcec97aeb8039affc1ede49217dd23bb07fb7aefd3bfca023245b73d47db7903bc186b96711ec275b379e805c7199aac0854b514a29a594524a29c7184bff1c8eb555cb589ab1d8e17284192a7a15951a2ddbe1e0188ca0070f2b1fb854e14a12dc922d23225de23655e2363d02acd1a2e06c6519667d749d2e25267c50ea946f962e4ca77cb375fb2748451cef4b2de9a99d095f9d097755fea0f19772775ea241b0df544d55946196220a15d133399c5952cd92ca5bf313b32c6ceda14ddad5c03f3b1c985767223b2f39137dd22fa7b07fe9089c9e493f05e9c800ff5115951914d05e83cc802f96a4c7978827fd3f4ab7a3e8072948410a724c71a9911d1a9056d24e3bb885993597eeeeeebf4a2022f0cb4c2157fe33f4b37757499e30e82a71f7b4027333333333337373cbf95db75652a6df3d243d7e443ce157620597bdf3514461d912e29f46c07c1f8d7a3492829b99999999999b5baedc5daea4c7a1b0920a971de502fbf9c78df85c5495f82ce122140af5c476848bffc0e37eda68ca39fde4e323740a5f4ee14b679a4e58983ecd6503ae25504a315063d20ca11942c3038d4b47145731fa93ac4ac01217929992d0ed2791216195804a7890b44a586e7ff46118866118866118866118866118866118866118866118866118862e832c78178158005f0e6badaf19623f15cd10cd104c3304d30cc1344330cd102c0bcd10acb3d00cc13a0bacb3680a20a1451a9f264f3442640f913b4629e79c93ce39a7c718a38b5a5d58fe898dd418dba34b77a9434a29e59c7604c6741a3326c7b320668ceeee1e6d757f6696927264a6d15ebb6398080b9c65b7709432c61b645986b1f449af8c6633cb3ccb649675465dd336e61eb62c0b59966519566badb5d67ac929438da62ba3d9ccfcaad775d52b9359cb205934599645ce062c2c2c2c2c2c52b24c59044de396ee31d4a8610015159f54d2f87fc1f3bc5366d46dce194d29cab35d4629634fa67122a1b14a4a2953720a969f6273baac564a97324a1967aba29471ceee93524ae9d1a5ac12eb8ca58c31c6a819410a4600c20873ba14a6dbd0c39c0ec4741b7a3082116ce8c1861ee4b3704b17bb692cd5d50a3f378256a96b25e7a671b1d726535275e3675545c52f8e067fcc5337e449df1b11a50bdbc550a386951cdbc3fe7043ea05cfc3b20b867e31b5ba565d8495b6cd6de35c75e3464a6e9bcd6e1b49fb41bbbed66aaba7328375a98008d86dce8fde8cb3021c4e9c6f01a923c618e79c735e53824f7f4e3a27776c97934ef91fa593d249bbd975f732c6e6c832d3f12df56b8c36e44ff7c901bf3d3e2638f00a7d5ea11d685b31f1e76bd280cdf5dfdc1e1da0d77d086dc6cfa0e1eeeefeef52769639f7054ebaf4350d1398af6e5d7a5df4a990f6e86bccccfc95d51ead578828b4766415220cf435b97132344a9f7e672b20c913fab55acb798c74e993341dd76d5ded5efc66a4fbedd98fb0f34fbc3f55b319e7faeeeb90f4c078faf2d422ddf72dfcc789212324a3db6e8c17dd2781b4b0e93e1973a9a6fb6410189d8fa48c6c45944d906a339ae2d014a526388c3c8c87d17900c68f7c5ca175a4e3011e46be85c7d1426782030c0fb4f0303eaee018f916ba91aeca931c303a499850d9da648bd64b59c42216b148032c168bc562cdc06dd5144db672ea5f5af77957461456b6fce32017652dac254397863ac52451d2936385be4c49b9a24ee29ac408ef6a1b217e74d145094c4e1802ddf184983984c90a94f3577e2b0304dbe597272082119acbdf20264517ff1c8eb519f06e77102cf3dbef147e1a9d2272997348d60441db00bf490e1ff85cee7c64fb6f24808baeb7a86a36e3d09f2dfa5a7ea487f370d539f68565c276270903e47631aceb2f7be6ba4c07b97e752aa5dba593ba8deb6313228aff27e512220cbe8a287e84951f234aa7fc6bb596b3751fe79fe52c139bd8c42636b189431ce210872ca065340c6358a36a36e3d09f5847a2ee7dde951185fd2449ae582d0fd595244959929e1c2bfed2243dbee22f554f49b3fbde4558db4fbc5084563e0d0720cab891c6e749c003faa4ff83e1323f03240eaad7c2fdaad70e8828fd0d88303ca0633cc0ed18e3f57700064494d64103b1091bef175947d0d0a28af4f40a3f65aecb5460515858ee06cbf5d8d579a0bef4609d07b2aff5ea605decaa3ca9214fe2cf6e19841669c8971fbf3fcf89dad6e115acf392a37d66e298e6b1f7ee86caf5330bf69a8ea53ed7dd90279c1c2b265cff06ecebf3d70e4712dcdd509feb70d478794231ba625beca5752f4f78bef4919d7f75de6db4b09e0d71a57ee46e603f4353ea5dfab63dfa94473e39ecc7e9489b789923322bb2f960628721469354ca8f2ebbda24b7af70fbb9d60fc4e00440d4600813f8808315990209c4134e56cc5c9112b6eae06147885042125b9cac58e2c572379eac706209d6de78b2428a29acc88d272b9080c5bcf1740413142e6b473833aecb079bdd780a42170a38023d456185eb379eae08723ffb202d76b1638c1d63079992a8c40df7f6b8643302000000a315000030100a8804e2905838d1b49cec1d14800b66805074563c134a634110a4308aa218638c3286000300200610a3100de924000d5f235f820f1d5f828f1c1f1d570c7a7da04b00ad834e00ad833a001d847ea8f48c4a099474ca09948b4aed901e41494709418948a946e81b2925280929d5da1dc187cea7cd87d117c507668128c51400b1ab0b396a7d8863932db0c330152125f98e05d8382eac72bf83d68e22dcbe7471600d7a74cc19d3f03a3cb9f6df89e09f90cee61cd2573267ac12881efa1f4273c6229aabeaf9402899f2e9b039632e8e4b480c13d798d89fe09c31a22b78385eceb63e736633524f2710131501b466bddd5e173073cf0575bf00bd082d6f3e50c8d55d821212f0fa1082e9efa503112c991bbcda628f2c4df0ad974216f6ccc6046d5f1dadb027068603b655d12bc3f514c66eaa6ed3c4ceb80b12b97383865fc059249137e75d286cd3cf6a9809483ddb2d4aca9b0b0a7f7567a144069c3c43632c7d8580b76a0a68d79cd85dcea2c42b39a31ac73c9362a9e13c46efbf9bacdad80caceaa7ef0beb2789c99ba3e784ac434e38930e2c5ae0fd92655d9aa85ed4309c22836b1d522ea121458899ea478903f3bcd0f197c7e3f22248df354d6effa52149bbb0f0e83f57342b0347b66d456222b143ac9e056652918518ca7240601802e40104ce065be1fec35d20a1c358ef4883310478d9a36d467ddb8b5727770a970a1362df737320ffd4e65bfa4a40235fba1b615b0c009b8453d703ee0c65d745812cd5b893a4cfb26f2ca911d98ec2c567f140600efa49ddfe8e5cd999707ee4559661e5792e02de9764e70fe879759e65a0875ba0f2e93be967d43b37785569f9af6e77175011b53a2edbea691b31786304b5e89b7d514f82fa7e66e71139290b630a0c1c007460c5e36371dc34b13bda842177ba322f9ea3a0dd69f72050032186a444c5478459fda783a913cd9d828e401c487606550ad9ab5a1746642dd06ba1e3556a9a470f995b6bef062859288a0bec2f50f4a196e58ed465e904f0137e3b8e99358851929e9bfbccdf8fc83da47fbf569c41905c6df7670d09f906b874b1fa8ca2e559ed2445fd174b5cf1a188686e9e5c100c2437001838157b9091accc1c7c354166b23bde6c022d59c720f840b43f12d185ad630e7cefcf27aabae99305484785f3e0719d81ef52a3b9e89cfea47269c43c9dc527c5ca6e42cceb16373fabc68ac80aad14668dfda38fb30afc9133384694aa5dfec1d22dfbe1ecdac41fb2c441f131628d0a2a941fd6d46196d6818eaa7f791aa65ad37e3cb96220657cea8ecc1fe40f569fb9c00f55ab8e100b778157587f123f4b6d2e207d85b4f6d34c1286c55d632958cd23ac90e28bcd905343fbc43e5807584db5dc6a4a4d406684e691cb3ce575073c940ee7814d08640bf958f88c92331fddf23d7794a1fb7517cdfd5629f4df3d47e743fa609de0a99b743a44a3f4a1f0d86d753ad8eb105e6d5de24b3c2e88fa29057b7cd19551a503200143d58be8680ddbde0c3a402738b53850dd08fc34c06894409b2c63aeb0a0dba306f4ed214034a991cc9bb23e42bed73c93f5abdd4b5accd4f41d327a04373049ad2fcd4043409af4618b404b2257291399efb390f697fa26348fe88d4c3d86c2ad1b66b2411889f77248e444b18b163e06b642ed0d2d29680b87d891f89b46e7633096be9cfd122f320342052f12c45a116197402cc524b86ea689bcc3592fcf3062bcbee0adf7cb2389aab3765a118c031d651364656b6dea9428f0896dcfe1d663db94b8bcc702177334638603713a6bb4d696443632b6e66196dca9440082aa4dff5ca5c24e6e745e807d49b19c229fc36dad28f62ac51d2282468dada440c00da9558080d72eb559cc21c8c6c76ada0e3f9c92241060fed5af96240eaf96b4e281454c9d2a7b1f17527a0f2bca55592ebe72a3b9d49c435c72c93503f9dbfc9b68043f53ab047d3189f8eda27749a37e855d2345df0d8f1804911dbb43a6acfa5168a9f3ab764f808427e097def3129db0125b41a1e6978dcd38a7a220ed035a2b2d33a20f34a1684790c903c54c3027133e1b52d5122d47fd6641a6d17a21be3521965a6a62ddc4fb0e30f26e7bf1e6786110c1316df6bb1b0dfeeb0b75a0c7e5054146d66a2ee3211da04a5a1c14a2fca14af6e364efda105d3feba5f4c131fb8d99c05f2f72df026c333c40bb4f32e451720fa6ab0e93342d483c2d389e06ab88fd236636217c60e919b6f0ac9a20276a9f60e9c25fbbcd4d24436670641538113098469a50eea6780394ad5463623ee4bf2ee401b5a681ae5de119ee2e7ac1e0502eb180716304ded0de8f8935757cb2e59645de7a3a897b076a72684c07bb520874485731aa11d38ccabc8ffc0d8c1f1ebe715ec4165e654bccd8299989e08ac8eac241ded3ea3e15e17299ce9ada158a7ee2fd5d4e7ea925570099d5105ce28e975d0f5240bde9738b1e5f1c21ac4c2b7d5932bf3cd2f1373b098010ea768f321a433e13c7b5bdf71701678819033cecdc050211997bc14a7cd60b2571ae1a14aeef33e9d5bc3f1b828259cac4021c637b7946509e7eef0c210025935edd071b331575b1d5fe68bc2e6a005209a822c81e8a038d24804927ab13b03866e5b1edf0bfe806408be29f95f06564f26abb473ef023743a815120612c886e048f38e61cea1c56c697caff52ae7b9cea1860f0e610417dc13a817d0261d9801050d94a205fc1b40488286f38d51b7e8ad18061e853cc87587cb56b00af6149725036c52c56b6983dcc6d2ecbdff4567135532f3057646134e47149accf2ed93689fda0ff280ae640ca52d3462f2c39d5391db0d1ad9d384919f2f44a0e57c865cd510199aa6e4ee846451218c941575238649740f29d1c5226d64680240a0051b633b274e830484e5ce9fb928b37bcd9f662edd6743440bfa3fe71a1245f812cf5645ea5adab0f0759fe2f5614671ae7d569228d0dec02a2aeb6cfbc3d88345d4d11755befc4dfaf498e959e3d67a9461ec769443e2d927347002bf841ea7bdd0a47ed061fecaeb9c9f663cd0860fd2902a8264400b96b35b84dc14fe1ed5a9379e38e417498e9746f87df231650f480cad48fc06cf26ada974c84b65b84330718660db9bb4a07ba91807ff9b3c56bfd60cf22cab066e87d109fdc0b4a1e58460c11e4f2d0ad57409bb5b16e5dcf0001c219b2d67d4398a05596863d6049b24e4974aaa037df24ca516aa85cae63d4f3c4c2b2a0ba94c9f021867fbceacf66b72887277627a93a6b408eefe1df667847723768bdb3481c74b3c3a67fd49fcdc84618b9796ecda66f49d7419410cb607e4b8622f692326037033d4d6475db6dbf10452af8013c967493807cd2d4564d321563d497a38b30c65032b7f173d55466f1b8cb4187f015672350b8a673589df1e56ac0f88611560d28c59d1313e3c10c148dfb1428277e0eb1722787e728dcdd617aa2f696431feaeced7480bcd889df65ab781d027c9b480bb5b6b612b2bad6ccc04f085850c96c939895d66c516976f1cc5ecbcc5b0880d718996c44a7624ca439f14ede0876c4191f711691a40aab2a2ae7d4f15384908ab3946b569483b72fefccfbabcb42963aeb7189c097eb9fcc04ff50dba358a112704528d85f8da11927aaf8746b3ad80464868a5d4302a6c8f482158464d3ef78441e9d615c0de651898730ec22e5c8c71034ab1acb0cc0b3f82f247050de38d5222b39ba8dd06fc6e3c5f9b749beaf5c73d7421dd12ee94d8598e47acaee75ef1fe4ad3b2d951b5eba2e6dbb47dce6172cc30d4b9e7a09290036c33be5adf8db7151fbaff2132abf252243c1ade753b0910783d8a9271227ea46f4fd10cc20fefc3deb91f41ec43cee40840a008973e5963a587e1edb12a73af1c03283ad6a291d891b219b67955faf6880c74d244cf62eabb3d2e9e42549d75f80f5f281c87db11056391ddc381c1892e49b27f4090b96240f69cfd21342f1dfc55890e3177630e0f697cfcf0d2d19838a9e4d6e9b52c9a16138b1ccfa097beece3facbfe105ce42e19b02bfb7b44149a5c099d5c3d70a5acdc22f1d30dd94642e3ef40d57a7243eb49d1bf123c79d6f5603378505789743e203cb71079006c9a66fc2de710aaf7575de913f0ad21dda8091ca02ff0b8daaa082ef087e35d5b27d130e97ec1bddf57791ed85b30dd8b518e5cddb1bc1e26f63d18dda80e5d3eb96664c3f24e0cd179186dc6f2604e0e0668117a0ba4ba442e10a4341ae39221c5309a08bbb03c6a510a7ec0a19e0da35a0aa78a96da6fc2989eba2fa9ca1d53a6a101a54c9ed809379ebf92042194a06af02e2d5886b45e55885df47cb60748bffd0f1bf33451765469f28adcb9a5d28655ed9998eb0e9774f7e2a6690f29afaff02a642520f65a73c4bf131a70be403841938d83105941404831ea19c0bf9c74c73404b88995e5762ccbdae443a5cd3b6d23fbea4eff269ad38540bffd6ddcf3bd6b976729956ce0a8eae70cf53df7e1d6fa32c2e4afac9bee0a9db79017bacc561f535e32bbf0a1569d2c7863c0eaf574554b309ce1c5ca57140ef53c192175226f92777d9d5bbe2bfc2673be72fdaa3964aca42099af6184eceb6776cec9515d19b63099fe7d25a149ac547ae65301a897eab70bc5320a4cb5c4cf92c1ed27635bd04685f29a599a196a7ddcba6fdad1213efd0e003f53b69f8dad2e46cdf492506ba796abb0e56e2ca44a5faada16ce36ca6c2ea5409b4559438bc7dd4254948b6f834dd3da55cc40fb6b2f956a49b69d3d0ea0a2dd10ca7860c17f984008ca47398296079e9e9eff9a4ba243c42933e07685049ca172416ab8c5120a8a9cbe75b1d70fb400fbc5dd2b0805ca448b11b6c12e6008cbc45140f615c3de468c8179aab9b251608cd9c848574fa5ffad54198b97e23074e6eaf03d37188b8a3d536f24d66e50b85c856e62f5ba4474f25d9bf5d0935604a8aae3bcceffda7bc90d2b57302aa9572811717dad5dcba3e3c72cd48db453c6e97e22bbfd65fdf03f5dfc4584a06f8fe7e3a02378c0917015a4441676c1b91abc1105a1c7d2344c88ec2f8dd3f2e2fb84338c306df9f40859be216003406b53b81ed5f336f98b151194b6b5ede43cb8374008040986f955aa3e39382b0887b0f5f0efec1ef4365a2e81d3ababeb97b5f96f63fa0991422be33ab78d6124156a633b91300ef4c7eb177199168860d74c932bcb4387b16ffdb0db4290546cc6d6d56c3d97817beeed56e1c6a077ee374821bb061c8bbf37740b559fb11ff4849181b452ba79188221fb04adf7ee84f9cfaee2745f087850c5482fbdb6d3e81b75984c8910cfff69f8a9ded6d98c4952d95a2cfbcfd107378dc5d704f2989437436038a08ff5085b9db247b0a7142a864922f5bb1ab6661d0c3108ca095df69773966c04b06b8d6e4b34012378c0b325a938362cdefa8f24aadfeb29a6e965638532467f25901c53a8a4254ed48b893a7a493272ab21eb32b940816139c38f0d3275ba66f335a3341679fa38fb31fcc393889779e638211f9ac39e4ac6ffacb51bf2cb24f547931bcc559252bb72ee6ccaec317b52bc9418d1cca10923267fe8fb31d39ec16d83ecd7b220b511d60a8b8c85d3f92afe10a8d83095a8c7e5f9882ccc96cc2593c5fbc082b9954d1dbc38141096e995dfc30699e93f40ac99cabfcca2e53fb1c2f1d874c920cd8da7498b44d660418646f89fa32f2c652f91cd570d0754617d021e8dffe7894450b8aed9d884935787fd4518ff78c0d6e8de0fa248a8102d8bbd326c8a17131fb5f1232de93cad254609410968afc5c966374b1320e46ecb14cc01e59cd5ee024e3e510d83e7d9e174bcf435b8e1baab1b4d4d303f01879ecfc7591c694173d1ab0e2edff2e091f80153d325ce496b68bc0615aa798ea8e20b8d07d7bf5228d7def9b9fd11fc3a2bfc869ed4387a9747c81f9e24c11cc0ddb7afa0d1c428b9c533473d59160630fbff33a6434856784ea31ef716a2bb5d6bf3eca1e18370175405841fb5ceb7e4a6dd0273ee5a0ea2c2160137ad691c7986adf7032577098eb9cad2754f34ed29d31f786cec28a2e7407ead6fa1804e40304f21bb8e5c2076b2fc9af658148113084a1007876abf19bc97f292fd236cd8b56983a401ba5ac42f5550ada2ca250268e95203ee86989bc3bd2657706b39e886d31d7b583b8db442d3f6d978856f5e15828ac5f55657c061fef954a19a487e21cd703a29d603c6c1f8966b8afcf32c5a10d542976ae15d6f427aa5b84807d061b8b53a046007e5e62484c9d4915e4052654a609dd05ccfa2c51136b1352739e9e16ed30fce8955ded90dceb611f3a5221d93169dbdee2645b55d0475976a5af5a54313f6b5051883c10bc358440dccf3f13a34a7dec808db4b0cf426f0762003b4d9cdd671949b34e7988660b4b517390cad3059c352e7b531d99aca30962bad86c47ea8938eb0a10d89f62a5d56bad14956b3998eb4639b452ec959699c23c0b2a59269438d460ee59f017e8a9117f0b24b5fb75152820e5eff03f4ef479f7a76d66de355fd81cf59e10a4286c8c28c77e8fe88290ec76f18dfaf6f0d634a955c8b2adca80429598f68254e113aead84265d719463cc0cef4ad45afb3a1661e8177c7da137a4412ea9a0403642b41e9d6742f9a220258232fbae7a3a71d023390057093a88755e41574c76bdf522fe8299fd9af51b964f5ecf96f117832d9a078f40c45a532d3d2a46cb54bdc034e661134958ecb6c5f0454db58c016406bf39a457ae498cbef1e2d6ce4373d58b58d20fc90d6bbb818efe435f2921c2223a786a691e3af297ded06def1090c83d68d18b9335d713eaf996b91ba9119762df7ae1dbe003835fe9f185900d28f4e1eda0b865caeea913a11ce78ef74469bbd07027ae758a18e9bb56217081a83f864b24f8637b30bab2505cb04ee92e16a35803f3ea42a90525025a90e0f69d6087e7ef441187397ea29666b07ca7e5f87a307ae3bcc671c3b074e011ac887d731c978f4c04a1bac1c2853ea240a9cdd04b3c237e25c5f6eba9f0592d4ea573e5faa3938cb8b7097d0d8dd8de90e641acd739df805a43e27d7f41b347e07ba8d36886f06bc39bfdea1bd265a84f3b7a914fdede1be60083c13e003016ff1718572de267297a96aa810dff53562eddf11fd4d15850eec4dff401cd9396ad2661c727e3dc89fe5ad37c9ee268f4eeae2a6114c337aed91ef0294637bb493fa6844d7aa60a982d1155fdff13b51b2748d803b0cf0f98a3a21e9f42b7dbed5e0cc28e0cdb780153cc6d11e17770b1be2b14dd88710889824b58b6ebe2d610ffb67021e42fec4f63c3a7eb6d21150df52a5fca6dc8a9bd700f9e0709b5fe5f78548441ad3fa65d384309443c34ba5119dc25bf612d061745c0833215846530aaacefc772f9b10b2e0f9bc099f13be00c6f2aa492a47efc03ee1662ee9fb110a78f69e0df7459aff31ce5e271ed4642630fc8ab949fa77958c3c2a1d37f5ff021db2feea69b018e47765744ae0fc6c38f0ab86ddfb26dd55fe29f9987c637f68a05f0f109bc2b8ae954503af0b00288e6b7c00ba83c8fc08470eb33a26d5a14f4f693078b7563b46506744fcea12925c54d229fe2bc08d81769bcc03c43c6c5f981ed190cbc46529649e177f2577d9f1ff815bbef3bc805632af6100492952455734dce41854a9b7fd53d48e5aafc356f3a9a22559a6f874f3cf1829978038a55a1e65233b6ff1d58c8cbad1df84b8fa15d98b749e6a606892fe7e9b78eaa84a8681716e9395dcdd27cf1944b0072b7cc3b5db7ea316e3a1d678b39daf55636ae254eef639b6b4c6e3bb8dfcfe2415f36b922fb91f12842b9160905a1e31d4a7f4ea3123a0e99dec8293704baa75a5214a60ff303158a0813a5dc0b59b1c90ba659159bb97bf78a9d17a1d9c6208e8b41d8b82a0ade716c27b71b2b777180358b8c1b1032e986294151558690b5d7a5cdbf66df4a546a92887509604a1bec53404eb5a32077430523a68266afbf9f985bda3ae4f4c31c0b999a6d354fa48741d94ff126c5cfa682298c0481fee8e02a47794e0479e99f34054481aa65779f6a1d4c4a61d7939e48f61c58488d424ac4d678bbd22226f22052460d1c267a5375bc0cab94038c838839889a10674731eba8a28febbed0388af1c00566b5e164b95e25e658669f43d4c181cf1cc821a2a42f767a14b6cf1cd849d08bbe1a719141826352efc2032d88032083d134a618180cc421775b7813ca6861b7627a3ce1140382b60cf22013b3fc10fc09c2d1c34fb289b95cbbf3a7a9f649b3cf0ce4b8c848ba91700aea81bfe62c3295edc033489d5a28242e144ce5a75a09a70f4de63dd07a4b8c6f24bd3151c2108d65407e970008bead3065f6403f8c71da39261d614e3b02f01c4829e94ca0520defdc76e7feb48722d963755473212e658ce1a31650d900ee67e90390b68e6cc0acbd542395c5e0ab062208d835dd95d5b300db2dba463f5d5be11b4030e410430d196ea9a82d57a88c72b488a65c06725d1d00a18610e5fe9927910cb50ce39785b8afd6441a198b364170ffcc2499b83103db681636deb9748abc1e2046856a645d9057aed707adbd4635bb126e6401e2d95e180a139119eb173ac138b9bf349901109f54d542ca0d270aa8056c56956218279cbd0d62544d06052646b177811045c52f3c20227b4e8515399468a3be7e65abaca01fa267936e405cac66da45a54673f5e5606e751b50da7dbbce15ea298b99fc4c0ff2dc6a7e6fb010ae7a90bc0214cfad07c85d80d44b653c5a4ad1115a97e30a7db09b4cd939c94f6c9061d700efbca531930e5cf1c2bff9899f46402bb4ebe284bfeea13bb809052ddc5b74cf3158173bc03969b8f7d982277c1a19b67550c0c6c23d47a30c8f79cf3e9026166f1b9b07ee40b3848fc42d9eca51a94a76256ed8c18d108f2c064ad10f8252e84d6dc892c63dd575d19436f718e0320720a70cea023cb2efe0d6f3d7883ebac8488a40c0abc8e215c097ff5504daf5c2185097bf0f5e43a0dd6e49b8118d5f01710370d16bb5f6db75cc068fb78c37e16c0169b31cd6df9196ac18d94fabfcc0f13126c442c60e2768a983672b6d8e9cbd75c2e2ede079a4ecda0285e0bb30ddf0209ea49db857cd9067b9081ba414c792621ea9e060755821e7c1ac60a190fd563cd502c1c1aff0ff53df6c2c3e1bfb9527ead42b3d55ff7a572329811430993636909ff5f661746544040f00a3406d04d5e9bc3c98bd8dfc765a1c2b5e9e9d2f5f20e30080e07135952c9fc4e184a9021282c1025e9ebd4de714527f64a8f6701cc15160dd18edc3e0ba732f41d0e1e62702ed3d035c18498032b5639e0a8696a0bfa941c368bf87813f1f7946dbbb1ead0e4b9b9d8f77ccc358423f96d92f6b7ae1c39c7eb4a9abb8aa8db39612a329d31b5915b036b5af73bfae2be691c303590cd0bfb96c0b6f4bb37df18072f64ec1c53caf20253745b8bf37a7e3016847d7e655eef617517277ccb1277c3ea58bef9ff2b84a8e139e8fa595d478bf67428b0f68f18860a8bc6092e23acf0f61ce1488d267ea22ec1d527c9d3190996ffcbaeef4198f93b81c44d9dd250ce912d6670bc6e478d1d41f70b387eaa458444d8f607614e97026aab287c8f2b77d30a95a4e6e246cf8373358db046be3c8c5e1cefbe94e11a3745164beeee39d96affa5e8f2123b9728da74980f79efc19658e74493a5480b0ed10de786253d4c63a43b11add96d8f6a0b60597fa0c17f31568800e0d21632d8c11fae9ce4f214e57f23fc2b2f08de458af1230b38053cef78ff0927c7824776066ee3ef4acc4b5b2e3604188ca7ce6928633cba5f6585b065715d6910b9f01b4f91bab7d06d14b4046046a1b2479ddb46790aa1af61b93de5aa8994a774df13c1c3e2e398c2fe23e4dba703c26e00d9845e82a3da6ae109c5c382d55866d41c52a8496d8acd7212f9a969d5b606faa661735712864418a2b94d581088157c31a040960528c92e0b5be84a88ffe3ebfd879c3e4be9c83084813ae18eba15aef2e8c2999dee8356ad6502ed313c6963c476b830babe2559762288bf5cff938d635e4a22508ac96421b9782f30b0dbfda0272b56b7aedd99ca5398e897dc8666aad9e0a347d6ed34f9945486b9e245e341305e319971e64135adf3c4de05171e367ad6c18f8f666da71a99c9126df5c2d55af5ddc29d9edafbd0a40b4a817ffb2b5ef4824ad94e4816150d9934b40d777d226272cb7a1449fd484c16326ba70b68d144385cdac149356879f933665160b8355613501e765357cf52bd8f2673d652df77e97486ea00016294950ad22a58658addf3fb0df0f1aa7578de2a451c802bc8f060c4b69f723f5e560c5826aadb8ba8f4a5dc1a3d294c5ff3e73018704b118b5ef3a8f9ba1824a111c652619065b5eec558a70b0c60a091e86f0c06760d6ce30e9c7e9a8d566005df51ab8f6fdec2dd614b40b9a198ec8bc58ffd4f316b19865441ea819e7477b61ac65fad80bae349378121595b082b01e9d646e5446c7e4f5b75ff7338e6427e7c660089c1866e76fc660092014c1659402c90e908ce3ed19fcab5cd9adc3ab0f8cda85a6dc37e10086cec4c52e753fdd2590d5b49439387eb00aa2d6a57e54a4027c9bdf4eb51b078dd0953791a9018f3a8d28b156b981a6a1cca910257ec41a4fff796661f3eca265f5ed223489c2709aaa09657bfa92b9ace08aca097b758f3e1990bd30fa49ff09a1e76c7451ff710178d3b30b180abd47743f54d251d7cd2be7ee9fc7abd1c500a4b6909983520be8ea6e43572c4db66404944f38778240e5d8675aae607d661d8ec631920cb9f30a62a6caf9171a87b8c170e89d5bbfb42d7d01e9efd060afb61a45dc1c3339b25effafa677bb8bca50b29ee86b83e759807c89c3b81c5d0b2934a2c62e2cb0cfae2a30b0b270c9ab00494b3d923eb6c0564757e7d8be7becdff6baeac0ef5fe114b06d1e7e18d2b1d6e09469cff21a07471ce3120823cf4a5027e2d048953f526b8bcd436a2d935904252aeadbbdbe38b32e560f5d18248ad8fd2044b574d5be49053266233c87d10591dd40ccb99a5499e46f5111b44c38e833162ec737e40b5ed393377df7108da9dcd1c54e9034255ab113448c69b99aa8e98b082b5b4806f3ca82a50c260f3fd76bb2d465fc8f7278bac79354384bf06f805c563f959e9ced2f9565e871cf6d09af088b66514845aa230191e9045ecd05cd600f4044d63166409b833041932c201941ea1a89da591ea2b13a070ad6ec95e86825ed019181399c44e0433be8a0965f292c9d896db65ac495f1c566744eaac6c868e7fe5777e78581325e590f9aab32a278604839a7bae634a2cc076a09de0d4c17af72da7ff2c30eb801ed70c90fe1db2b6f91ba53f7b547b2fc7a6f55fb5eb498a0d060786449bffa99b27e3e2d383a8fc42bb0b64102823f1910a0c234853ef11e90042381d548aaf027829d569781c5ecc6153cc7fd2aace32ad71ded9ce40744923e8165acad2b7336a652a347ed9233f484636977d924861fc811e2213e4a8a8fdf28f760eb8769fe13de15fe809ac2c425fd3460bc4bc1b46508b9aa3f2b503114a87e44e5d4ddd955d87029632b575643128fac34acb0c2ff3b6869441b7785d94b8b5eeb570e7a4141e989fe31e2e5a531a284f02975b2e9556e4b4982daec94a685782d4fbd46c6f26f2da5cc5482707a179547986acc4c67519583b715679153ce1205840ce6e563192d8ce3eaa8d1d3401fa38c87587351f69305a434a1d8a391ada4972a0728d2ef78a372e8a21fb67a1d6a2267c09290e396818f04c7f6c9457eb00a61f1740a7a479ecaf3abcf3665ae46bb63c3f0018b620e4ad221e136f452ac1666a604eda708c601772e396cc860a9741b17002f14a2e083b93a427f51873bec53a2a15859256be4eefaa01615e1f24e9a92162c320ecad231ce4751fa5ca13a0132e72fadb459f8665b09edbb8e2c02faa70fa41a461532a15e10d24287d26d9596f03fa35a8432300352c158ce42221b891785b23a58bc9eb95a009ae481b2a0c6cdaef0f1b8b9f7e68f1084823dd42c13f18a73d54122d51c8e8d6dc2418d0255211d793e2530478341242a50f7ed6dd3756402f261060ead3388bd0b66bf3f6ec3985dfe43272233b40c446f283468ef48d61f319394dbc56eaf6e3c7bd315a235333cce7ca637b9017f5f8cb3e7b546051a685312f37535e21f05f1dc2b6234b8adba1f227355e7d2e76ad3097fc8557ec2fbee2457ebdf232b51dc9f6a0dc9d4490c483022374e5804f1099c8d68af5fa8cf7435ddfec54e5f3c86a96010093387a1849bf838b3989e20bf8e0870676284cda702bdc476fb12ce9825e11e825892643c93af50ba30ce89ad165193355902e6a3d3614ee38b1230776a4697dc528a86980f04f7b755341c4780f76185c246fff80475c97dae63f2cbbcfee084550e5aaf31eaa5ea2172de041bb04f29822facdd164f4dfa817e27799ceb54dc455debb0b30ca87c969f68af996a72a85d60ebaa799b34cc43ded4f312a7060a0bd6561b5094d2ffc1263596029747238a711f52f2050e87cfa37782b66c3c22b681ab2c45df54017c8bb92b9bad8eca931014e644dc6882d6566b8ad7f367849e568d38f7dd7201b598d17434f16479f79de180ad32bff269b5037eb5173135752e59d23eafe37b650b1fbd348a29fe5968dc2083708e0df361fd66eaeef97d252e600d0b9321b77b870626f77d0808ef79a1dd282ed5405156f8759b3e0259afea5e672391a03c18afdcc44f8d57c1a9f1f5349dc246ecec95c464ef1945979e3b5e2e830e69f0cca49b5abe834b7114833f21dcf85be24936df214a817cb5c54360321051a53ce2d5c3d6abf8652c44e2f65efd46bc730523526217c9c4f488b210efd294a3a0cbe5dde370fdc7de34d70bde8ca46ca2ced9758b49f041026cf6db89a06f28bb3ad2986f3aa29c444425ea22ccb60e71446c1a3ec51a20b6cacd202a395665e2c0fd693dfb72c1e6584bb225b20b7e40a682c2f0a27c1ee4a8034406eb34f036e63ec9aa8b642edb9e599214d75b7545217a276ebb5cdfa38580bc4a6c653a59ee565d4da075d7c257f8434016107debb041761aa82e152b2f46254d510fd54c4d6d066ca64f17338e7c37f218f44c17263ef5bcc67d6a5b219879c9add2a69da5d078b21c0a2e58650e98ca70106762298e3c0eeb5c577b88352679b8a7953a456ec72d9f170f530275ae2ffa74539c2176ae0352c14d113f6f96c29b2224e65bc94d2cc253185e6d671a7c81fea240c96fdf36e81a0d2c8f383e23c47ce2633310d6886cd0b11124f7c40cee8771b1191d73ec31bb5195ccc25954c6f48de3796829b77dd63e959966d32bdd39a1f6775c890f2dd7ccac2d8960286f220e9e31796f9efc4a880a5c07657efd0fc654adbdd33eb08d0594eed6c896ab0053d98faf4add69026011d6a00a439aadeaac48031daa05c092d88316a47458fbb7fe3578c42ba213bc8553cd9f3b4e8e8958513d7f804c99d6f36234f99ee29cb8f19665287fbad6fd457b5f80b553ddedde406a2547aad275f8de24e4787fb22425bebd59ee127b2279f8547e4a6b9cfdd6bb8252a3a90042c68ebfab402969c0c7375b233301cae68b57058a9c94375ecff2c7086690b893405f5c18e9440f0bb78d5b237e70721bb611808e80281f13565d62e1f86902117a58f0d4321fc24bd2b21fbeb67b82a28ec326c48bbbad3beadb798d40439416445e38a1f52d98ec0c0f288072050a9aa8e58548066051608777a925bbaef11b81611c69404e15a3b5def4a776e6017c852a75487939095626f17b78a14c941bb9540e294c4a52c8d838a690316423ba20f0168499318db7fc7770e58e7aeae272ba03a8fcace6becbec81394e736110e09c2ef15d4e5f9ce19e38c74ca73cdbe52415c35276391a5f4a79bbae8f2c3abfc4c82ae6e8da7c9b767d37133c132456227be3df2e3add3e3bc9f538cec551bc746ed82b83ef47999b6deaf633b419e15bac1d68f6833910c17092c70ce032f4d77ab775feb22dc582012f20e071070654299075bcaef1ae38e0950cb44775d9c2b58065114f8d9d62a6802a701214542f253b363b2021602f9d708e9c8123474584e43431054ab387805016b4fbd89359a024bb1c2fba25996edbd02e102f4054bec758c59d51b562d6a08b0dc9a4ece8802732af9971fc483f9f730d156f4cefaa8ace49b5d026f275c6fd2ba17105764c5f2a5cc48e4279a7fdd1a9edced2aaa2b4131849267d83e643beec0625aa7f87f50983aed625e64a12ae706f8a587531fbacc7a7391c000a28b326312ba6676f923abb15b86710c3f7ae8e5efd8faad99cc49b0a993a02992113f5cf9b81ca440259af2a08080437b98bf3a6fa255deee561a8e88d1b0c199d50aeaacc0833cc6ec533f0ab8ca5e969f30e7f8509744f8002eeba9aa8cf20cc48be8118a599c9c1522c9d85633a23f8172c0472d568d48e326ceaf6afba6ccdfba20cae1108900de508f46fb75f0c3a0d75dc396f6d428f9109ee02bf6502fd4cea411bf6381a7cf16ee2d1ac282fd186d60c11d1a404d4866020bd330bde4c58db044acdbd0e73511dff78d00243270d405e401544a25353083611ecadc7ecb58f415e0f4f6c9fa6642b4972a3aa401e783385fed004ec44a70d609967b1ca0ddf5da1064799ddb11e98aa3750381c8e4ca02598e9756c13c232a7660a000d7be6404b5f792ac0f2914c3fad430b91c6a7920daf0e07f2100043428df71a12113164465f619926ac3a6bd18c8865e9fc1b22e9b2ccd6178ac5bfeca895d9f6235f4ddccaf87532d6d5d85ad48b8aa3caca7b90fb80c7df0891309cf91e56ed22be3ba91eb0d28c77d1076abba587b76c3941ce3eacac5e331a9702a760e9c9222b5a00edbb9005d4a1eee551d5b9998ad15ee5b40ee0f231ccd80c51d704d2013bb26b70d3da1519c6af39ceffecabf5ea04b569a7e9cb0b5a1f0eaddb1cf68b293a79f582dc3952ccb993defe85377a3aa41bd69e4cff026b215049c089f06412c051a3fb64b2f0037c405e474e511beb6d8edd17b3637919c42f2379e29d6cfde254275886c8f5da3ed084f1d49e0550d010158716d8714fc6a5603c51f0c9fa82d810b5d556c6b62c6944da7e746b65855a4a5781d233561dd6b2826d14806249a68580b5900d279e9b75cc084b307824259c176088b6fa3d2b5d972d8a81bb59f07b430c6d086f5d99a0493b89462acbc0a9bca0a81ddab9801cc4aace7232ca58c7d12f1904ad61b79669bfa5c66a5f13ceadcbe8f3d31b85c868c0e5afe4808384cb62e66dc584346107f39971ec3d21dbabbeedb03b7d439e906a5f9e5ee7a72aca2eeddbe637df01f611a622dc09cd5dce0c5cdd3d87313ce3eecde0d80934c780549b2f039e3ec2340fd57ec9d1d037e11593ed7b4483a064468d526523a9e359d4ab4332e26244abe72b8a0a9a6c4ccd536fc45d1af53e08e8ff68d2f1155183bf7b7e2de3ff29505cf077d082fe874c602ece13882eedf872bbbb8025c3ba2512a4c35003c6303482a76e2d1d7fd8e394bffb4b599a79496412e04e6e6b124b697791e8880c977ad268f2596c26d071825d4576592110daecbf4b2c2c47fc26308705a0f67d57328860f025eeff6d90003281fb825e263a3aa43e0ac9bc469968ea1c5344e4d744a0465c665bdb300ba2d36bdef27b1f647ec0d3336fc0f3406ed2f24deacdbc0c36fbe4016d6b218b02927175d64e7f278e544741059846d08d4af925b13d9cdbf18bd5b79adcacc10085353b5ce1ad6707005dd946485195dffbf13acf735c5b096276fcc34b657a33e294e85d4ad33580803051b09c031f42d5aa49650cefd830e6d4d2e22e47b08e1d527504363173315e6f7774a0cdc4f4b9027c5a2c8d0563e488316e5b83022a96166eb9a31d82e952eb22321eb4a7069407d4242149cbe038c6493f7e3c31ff4ec2868e8b9bdd571b3ef8120084222640ab9b6867e9d7c753ac2db496cd805c8f84a8bd7f58f47a098d4d73b2ea43693f42a68dcdb3120ea62b946d70eb4c49540cef9a5297389078d2678b0abaf3f664c6186b5d98a31669e249d103a5fe5b00f5d9a76a2a86fb0f995134961bb389055617e09fcf8dcbc024946447f86b154d944441ca4d4dba51450dba8c59114c3b93b999cd2c9886ae96f57bde80a8b2d689ab689ea67d70aed31f3074d984d034d4b803ed8f53707ebd6b40a2d10b6d0fb69301a8f443263ef26a20da032bcd40af611698bd38367874c7965940703c829332114494b189dc34ef0e6691674b3dfd06d7888f592362cf49487b441436c850418739bdf2913b650d34ae7fd3aa3520237f268e57b1d53524a31b7173a534083021888c2ef6448f0c32dde7d477eddecb13692715e5dc208c9892db3458e10ee16623e8d4f5152e406629dd06975ff10df549b91b85ba626d97ff335b4d81d9aa45a6e8c983f2922072cf5dc31fb8f818408c260f2232b7e1b9d20e82b9d719c3833d264c9f851db57ead8a681f66282cc3d177c25a452a2e5d927cdcb52d3226aefccb63a7a81ec0ff8ad2a064c48c09d0f61d7b04fa3a12c3a36c53eb39cfa6065809de2364d29f468492f4d8d1e53fe44130e12082ba863e1f7a94fa128b9e4cfa8fb101da4998bbd7c0787e4c8fb945bda2a45648db55f8bc3dc6fd92f544ca7ea23a109338bee1b2875a5d9cfb0c870c602bf3faec860e5082230d39c3d5d89713ce1135eaebf1b4602db09acff9b788c26278581d88c74e91a4b562ff2431f454d28f060abb7f90112b305ac32dac0f161353197ed5426895e3bea5295fe52d50ec01294f1b1b9a6281e897152380a7a8e971fdab82b267e86a758c0f7e851463d7d1079cbae446bc126e4d6375df4df0bcbb78dbe041b9408b1cdc0da791fff070022fa8daf69bd9006e88604346170e1204ed864c22e501d1deab93ae24de4267b07fb77f11d6397c580a240e490249c6a687919447bf75cd9ddd19a81a43b15854071d9925adababad84f8a2d2c58fa81fdd8515349c54cca7dc9be99a06d3639b8642492fa8b859866a1d9d5143c70add3211694f23077503cd8577568966fbdd364f42f632264d85f8ec379498ddd0f933170c4ef9dedc426b8c786be2b389421da73cd629759b81909cf7c6f1f3fbb9d2e0f018780b28c48672f484ff5dc2cf50832f536f258d093538c9f10055d7b6e0277c380394f02e6bd89bb9c392ce2516befa227876ed558556d989bc6a49740335aae86da6668f27acd852104a84c992630b441aeab24f347c8b6223cda08b14acfe516eb90cfcba3b5e58813b7b994e0d2d8bfef945e47fe0852bdf38d8f108beeb93ae39093b099e363559b3919a752eb1acbeed7b8ecd2e1104ec8ff9955ad03357ef483606e98cd31c07fee8bf9f27e2e839e236b7eaa2413bd73bffe318b0107e7b20b07f10ea8ab4a66e9c31121ea015258718c8fc1ca7cf0b9061e4c3ba2c24e574d298488e81c4e1f5c84e9d1b0ca8403f53fd46bc4378186a6e02d8b8646b7abfb05d8b29ba9ffa9ffaf5234a16d42cc5aa83d05b795ae6832ec1dda9a3a1e498299a8ed3e03f091c15dd6473e39dbe965b9f0cebcabcd963ab9ade382ea440f2cc60cda2e0d275960ed10b5ddb84431423e1fd50f355f7bc29708e4a1dee65fc45945e52e6ac04425f5b0c244461743442576bef1cdd7845227df9038c4840a1b0c20f758cc415c07477a54441b12f1a39cad3003fedb6c11dedb9d4bf8677a20e9ec1fd869528f3c4c28869dc7ca832aede7da04c4160811ac8ecd9b54a563c5a6063da59ab890f04ef57a866ca80a7e96b53c2fe9a13ca1c3bffa73250f6070d2fe98dc54c317973067cde4b00903dc0817aec2012960b6cc4523a8b058397f929ddc2574b8b26219a0bb6018c8d997c1ef52574c194ca86887837f1e8de516eebd8dbb5826eeea226d12844b4c90c3838c821c28115d64b789c1ba55758eea24ef252c921e091a1a2b9dea53aa764243d3a8087f7059b8df1c7986f5eb200d8d239c462516735cc0ab5762487f7c380b2e2a21a33eeecb97f08be45c938206e55d10b5fe24a5d5f10b948f53cd7350fdc051847c60105aa962b2fd931386b760447043cc85fb78a570fe58e795855d54928e8bef656404360004d3ef181d508e5231e6717e8aad2f3a1598b63d1c4c90e0a6e28d21f7181def9df1206255541105688099b3599f45aab4996a3c82c7982cc9bacbfb1c3148956d2b8d58afd4a7e99aec89d8ff9f4cba545686e28823d7d6123fe7f73b499b9114476b4acd455052bb458f5db6d6b279d288f0ccd73b31a470cde53e23b3d126c299a57c529084b951b033c6a90df8cb2aaa9824c295972b34ddfebdc620b2a0c35515815ca2dac3eb1ed61b4b7a56028ce6c7754c47440adeeebd69dece75d12cfb29baf7821f709cd7fc286481b743cacda4f20fcaa8daf565cb22ab1ea1694111e60e79d7616ba7c4375a3e5a82fddd7b39ca54b18db07effd87db2e7a43a6e5dfe0d021ff2dd7b68a5c9afb2ad2230bd5232299fb2aa41ea4d3af8f0f981a30ce6aa43ec2ad8034857b78ee26906b96aa3aa1039c60ef28ef4a03905eb1c9ce71f59f172dbc39bcb6a51ecacfc51e0e7c0fa2a92af42962f1663a5a5ec4ad6bab0a25c2a18417787aeb3a42e40c0ee624b2af21a526c77ca9fc1858da959f8fa574b83f21391249d466555abb0ac4ee38d33026e5a4bf5091580a521bc58a66b5da6c3fd8f42bbc5e576724c827af90a5a842b49efbe362143d33dfa08345a00aa8eb096471fa053839b06899e33ab8bd92b8f1862e263745b7087191d90a0bc0af364a814fc38da416ae0c4f0a6fb393a9dab4e77ebc050d4e15fc9ed410917746bba169b3cf54501256be94b397ba12fcb4e088b966041b65dae4883c8f28ad70c8d9771be9b560d7f782318c43bc8bee349ddfd2014064fd8dfbbe823ee2c28ed99cdcbe8a18ebfc3568934e59cd97539fd5c8b756f91c25aac4f9d54d630df57a3b228e39bdee5d99d1d9a3c8ae19bb46b42ab8dde11aef14473b20f30cc1b4ebd8de11e16a6afb169548a4d0ac4034c1e10c81680d8bf6c6d724b2d7d2e801dfc0b6d3052a4efc3de6ebd08ae071294c4a8a288290c78c388dd4ff80e8016eee628e444d98d1fe808b1012af7ffe37060857a49e5c297fcb907f28e46f512e2df163f343ddf4c0dc3ed69a691c8aa865f4553c432379a36bd18d5e99479489b91f87a6c0f42cae430beba2d3221aefc679d398122e748e1463909bd93b64d13c401c7d260660a36bad3b50c250ac5adc28d36f11b258b96ea34cec92ddd216d8aeb05ba530c3542b60939fb529981763eee5aa511c4303cd57d3ce5a0fd0d22129d7f564de7aa7a097427d3cb20f0e91cffacd1f76f397a81d78badee359d916c5258eaafd87acd8666eac0200b0cfdc302ce18dd0ba19099b5a11fa2b053f6f63836e6b61ec139f8f31c35e84dfc420d6d72912c20ff960ab6f73a7c4187c94cec7eadb47da4baf5b5c61461e43ad4563a3f38477cb78404fe83be505af64132f525f33cbcd2cd5f2b8fb6b4d95e18ab73c97d933b1c9f572a2c5d9503c08bcede304f27641ed69be9bba30df6ddacff749ab3887d6f6a51d224607e74a9da6d4e578809b67836931e5a2ca8506052e7443aef2ace8d2284c4e41295b11d61e3c0b189412b30e5f207391abdb4e1191cc723765f99f857bb37d3f85b71a9e9dce19865a72e8e0ddc3533aa7c2bc99ebf8b6b2c15066f5ac3d3da16e534b021d9be69f6613308fda4b2637f1f13cc50cc0c703fb37ec340c67a76bb97b0b30dc4e3f858d2d12bb125f8ebe188ab679ed394dac3c6405c8f21eca0c4926c9fd38359d04cc8f683e36c933e392c9b33117a5e9998004cf6d1641cdc4404dfdcdd0bf02727c87a6afd854df2786850db429914afe4ce21435ce0a2d149cf8740a319cb7a0ac7423aff6758b19d0f7e67f82de56ea93949aa790491ad32e1a51aed7f2cfd4810a1820e663c8b405f46f87402192462c0511e3bd7e6679575655319c67aa1b0ddf7c8ea11a6fe8e0a200f453d8a3879015809b46127d0deddf37f737210602939374a26c75d3c9972cc379f7c7f72072ad30cd3d67e7cb04298a07e8d5dae17c066357e5d338fc3400e36abcb40e9d30cd85a4ce18ee3097b3b49a6650be3ccf931a4006389249871ff1b2ff46999b91ef1ba4e2412550aa447b53426d4bd3baf5b1156bebce12f5b02b8238f489b7d02692ee0b33f4933dd81787ed1f751ad1f8b2a320d5987373a8e02cc9a3c9deaf40750981f3fe5fa6a51418909bac8e0d7650f991084fd92fd691dcce692053ff69d38ce9c6b2e2aca299352b0d7fbaf3cb12099af2b2ec6d4be80ff96bb2b0b37473ae5fc476774d7e7d92fce4e2d1f576fb9f7791f03bd7c2d29a9ea322ee4108b2aa8ecae4e5b49189639441626260e451441751e9eeb1361b5edbcc9a1506144ba217d52cb48918d02332fbfda50d53b1785f64f146640075b7de95f0d3a5a5876ba41709b7599dd694075fdea4e5c135bd7fea9b4a36c9000e983e74983f142291fea26bfaedea0f6cb473dce299ba132ede26a889aa058104030c39d25ad083434939d4af4bd76f7d936f98728410f2a03fb7c643ec9a5ae8715e4590c2aa1a7ce1c0702a87735dcc84798f9f1211a9bbd113c40e61e47a9c6b992a2b727c60c81f560aca5472ce478aa9309b02c00ddf5146ed8ee1697e400cdbb32df36a295ce45f0d90139c8d75c2b02cccf71023a538d5d77af24d855d65bc60abe9f188316cc7b9f01ab1cf71b52f76acaab9d883afd3d742b3aaa67ecdc0220ffc2726da0bb9028f3d29ec21b66adfedbb3f3e151e365c4fcd6d7cda5bc20712169b77fa849e9632a29abd7a121c2a42919d6be6a7eebfd7813f81ae93ed6ed2e371b5da8bead859e6fcd4d5374c14f27b130e28206350c3d1140bb5a59ec47c0da85a0cc279df4a252fb9a421a6da5aca935952c87760fcb800f0e58f624ddf183b279be716a146e322565347f29380e68b41afeadf0b661405b72223838a95d1bc6839604c35226396adab827b1e1b7c8cadc3d6da62f761551dbfc04dea57b29636521eee3ef650666c335f88486654b33e4cb79ccb71c0b79e79792d22bbb13264507b3d9ee8825b786ceca014baab83f58e57eff06c3f64b896f44b104c8e68e63a86528c8a1092f42608f1104cb8c5a2d5b28aa67b04224885f362830b299fcc878b4f86b825d258a1788fa5ac84fcff6f38379e8f3e72465f90a327341f87043458b194f74d595e4e6427b1a9c9c9cf75898c9d1e1ff296feb03ef68a4176e5702e969e892b3ce14ba7d50107047ad7d423c8878aa16c37589226bffe8e2df07c0f2bf3db5184d255b58471fe262a9533f16326ab291f50dee6ec08398a8cbcace3ca24bed93a2e0207f8eed4a40d3013f6c1e868e461f8fd7b1525c9083b8d2f135e756107d5af24aac0db11df9510f7bd06f9c68bfc8e6ad39c943875223122678a2bb5919d8d46619f313b70b26342acbcba9ca1b0240561e5ecd0275cc2ae78635cfe8825c6d26028ca11b30895d73680bb7dd2fc4c7893c3d51894f509b5a6a1d6a010e5f429351fa1b1700f1a7679173459ff233010ea6bfeae19c1d5d68cd93385aa6234969cf0058743edfa390f2b984200e5b4511bc1775df02242441de7097c2c22879cd0c190ef5d30a1284fb40330f827bc82bbe9f55ab6cddef8c89cbbce870bae84f6e8c57be20f5d4cdfd275df50ababf93f841d8a61795d4968b7b3bf610421c8744dfea4bd1494af59d74e24bb402548af97d431f94e5849ac1a9fe3094e93c9763f6855f79c36371ebd6a088eeb0fce259d0351308b8125c66c50df979f53f71ca803fdbb612fd48eaa19fdddf3596c36acc41779f1b99e16deced4c567529eda88054a7752fc5a685810d0029131266808ee709c29c29c2df9f3431ed83648047046d043799808dee20d8980567e15900880de046f97c04df89f73f79f38422ff77c01f447036aa436885720da59a5032dc561f24315cf978774e2b7a39ff45a5c13efcf1e733efd65171c69971e1e56e665502d2682635fc051cb72dce8cc5f466641648a1ff72394c38f7bd741412eb1a40cf12834b27293bd37d9726f295392321f08990894081f958f4af751f9a8a83ac0c5992c430f9e1fb97cfa172ebc269bbfef27e2545cb5774f070b9f5eb888c1a72b5304c5deef27d6ccf95f50b7b4bb811590f5491096fffdb0f0c7023c25e51cf02dc16acf4d4d7b4ea6e807bba64dfa9a974306c758137164b0fc6f099616619a6537c61acac2f2292873c860faf4cad013e3a49452a5721a09059b2d9ed4c115ed0752bf5ffb24fe3576a380b2972ebfc9b49f1a983511135318528a43184a71f79e4de8cedc27cd6650e95de72af756496fd9ee3d650f54aa9919faeeee4dbf5d8abbbbbfbb7bf3e8974f98b0099b99b161430af58aa7cf8a73c82f42634296cd70974d4d2e5de2158f1e508ae73c4273c82f028729956063236569494969fa4c9f69632365ce68c5ca1362524c3232a22e3db3dd8a4d9f3e78a4a5a42d9b9092d275912932511c387cc997542a29cee44cb4622d26b377f088639d8cce69c37e4eeca7fa00f27524cc2594f1f8899fc0c56e79771fb14709012ee296ee2f41893d1dfff6e8ad499cf638c28ef5c89cd5c644f7ee692d0d6cb65cd81c99b4b0d2c120963444141f40aa30c59290ac6dc2ca2849b158e3835d62e71216b1c635959c26ba8a9c48768c2822f130994c40898860db32616d6cb04dd462dad430fac15deee334b38acd6148632a31f110439ce0fe206a17532516b94b70872a6c8e4943dcfd4a5f220379b4cfdea63ece22e27be05d61dbd09f018b026b23e4b1f1e5476f87888f4cecf3a314a650c1939ed7ebf5e38a36b051dbee06d2a482602710f3958364c386164b703f8e9fa9c1c5e08836529fff675431b3b521d8845760c2fd346c6aa6869c5625c59e3a60a59440f369daceee8e1fd2881e861a5c2186447b865c8168071ee2948c0ed1e8a73566a2943446dabfd44c51d85c6d6033eda98d946d23f9cdc4820b24a4c79c260b9b63d112eecfd1810e6951903f3e34748526d28914fe4dd42da46ee10e924141fda45bf1bbe8473ae9b087da867e073b888a953f3d248764d85268a8873a0cbb83e493a01eea16076cf6a1b641b89b38913d16d64f9ab0affeda7981e311a2ef2ea58c4e93e3cf77f0884d11acbcd51d87aac38ed9bcb02fdf3fb471059e90068ee984b5b14318d2e8a2140d2f9c4c6c56a9626c2a0686576cc2c012ee4fc2533fce64d9edd25d4a97ee59a6655aa66559a7b2db3506e48b0334b0b9f634713c1e78d77cfa6d03ac6de8af32b0b95f320a9be7ab739d3e32fcd5b098e5994c7c1ad661bf624d7f4ef792dfc8fbea57bfdc35efcc5e45aa6c6d1644b83ff533356266f6a774febb2459ff4e55b1f993dcafaa43b02566b7269bdf0692a9a3bb1b49cd18638cf11ee9b05d0a59228e3449251c84fb53441c913c312ea594524a499dbabbbb747ffa392db39be50b37111888578e5061b354924addfa577fed2453958293ae38239fd82a7da44fcded93252c8b1edc2f97d42e4632c14d3a0481edef17ced207afe4c74f425244daa109f7f310672a4699ef1eed90f5dbb1bfa882c976ae7509f777aa181a29faaa6f1bfaa715d1d5354dbfbc40b01faa62bf0bb0b002f77f679511162fbca474d3aec6de04731f8f7cf94341c9e51e3df95274ab093ed2d802136f2c3a8c9c74c8e9301a724e765d548423d6e103a36ec520e8c0098e18a5c368a85b1737a1d9c7ec6a51348f7d576cae494995a629463981a2c2278a0a4ab5b8821b0b4b70df231668cc498935ee4a53a638277b36ca93b8a458e32fab60b3164bc2cef957fa85cd9e84fde7bc5accf164c2660e09c963b1c6639c5266024ebef48fc84a1d6017bd3929cd3eb0111b9fb12ff618bf2568c4064fb093362b78511ae5479b3b1c553106ec1ede84552a8dbee9be53dd4bb85313dc9fc5a6c9ed8486309c6bd85274d83d67acabbdd55f38a7737a2a694d9d70fda07f0463ff0d56fbe6eaf66dc4a67de00e4bdab43e2775f45b4009d63ea7b589e38cd9e9b353e3e8f58d4af00ebf165082a3d723cb4ab2cc45bec3e9f7b7f772f4d7cff1221a9eb2c61afa5f13f6fbdb0e2d519696f7c0acc93c799e159c745d9437248c3ca3f8d3d353fa1a7d4df59d15a060ff4ea5fa18a7aff5e5d2108e48c0d1c80a53302703e8e5e8fe4800ba90a6931107cb205f62989971f9189ef79a12773d1e52d3406f87f7da476fc6d3c0979717199a0c50e2199af65c4d9665327ec60c564ccccb5319d9ff8ba6fda6759aa681fd2aaf077fed1a2171f731bc1cdd7fcfcdd0b58fab54d66659f62a6f0e75987dc6a4549479817e138cd7833f65caac74ab29e2449cfd8bc7c39fbecb8346489c63bccb6755603e2ba2bd52b7bccf9e4b793c2476393d7de9f5383d7d0f8cd8c5dba1c9781558e4377229d76a33af07c6cbd15846875f5e5ec6af3e93311471607cf6930611a7fbecb9aefbd5cbe81e0628318bd783ea3bd577cf75d775aacf691860c4715584c4da1b3171f7457cf8e5e5bb6b84c4da73347448d80f6f1f23099ba7ea0b36cf1facf2227e8c3852fb3ea23c4df532c088dd2b426219af8146482ca3bb39c6779fbd3cf5741491f131aeca8bec5737c770d22dd52d126306754bc6f554df793b62a86c3a19717214e95ee5450ef9458c97cd0d9b43309f15915fff3b8f87b743562ae389a2521dd2af1dbe680fe3c60e514fbf5bf4763160cac2f463cc3030f530cd1da694524a1ff5d1d3416f767aad03236e019f05b460ae4764ce5480b34781b17bba05ebd612b9e4375991cdaaece686e2814df0fcacc86f3215449af93710c2f3ebcdf60578be9615e1f9dc1d8222c51cca6460e5b7cfacf3a516ddaa1d66134706c664d76e3eb0f6d4880dce9ec699a94425412f548983a3a4944ac7f28a222a1ab582d81cf7a19ca09cb8bb12285ae01823288db81857c4b062bb2084a007ccad6acf61ae51fec4f4798476dc0cf4e35d4106f0e36b2e123b809ae711c23777ef42dd4c1fbf27840e9f43901a6a901cb84705d9de0b82f29e4748879b81827c0e42d410e46d84a8c1e67984b89b51afc3cddee7f027207acc5c24b5eea071da7a701b0f1a1789edc1c30eee22d1f0cddc6f3d7e8248340c14c409c8e511ca08c833bc0c1749a521c309664e1a33dc4ce365b8482c9019b69b5f341e0fd363e679b8486a0f9897df7a6cb3c7369f4788c7cd403d5e0620333d1e06880c33cf23f472f3f62ff361fe7491681808081808a81808088d0a6447ea6100e16e86f1a78ba4c337091e21eef43c4208b81908c8ef0082c6cd40b07701f9192e128b93e011a231c3f308a56ee63e05e3e6d3c3f81cdf41470e1d1d7270e11c1c0e70030e30fc1b60001e078ce10d0002e06d80372dd006e952c0d70063f8028000f81a4002d88034b44b013f003086af0101f0344001cc00d2247197022e8f507859431d7a002e4b8a0efd650063b84040fc0c0800202e8bc869fc8980407e08d8e38580407e07ecf141402097f5e334fe3fc01e9715e434fe175c3d08caf80763fc0c50f532e0ea59a08c8f0163fc07aa1e05aede03657c07c6780aaa9e035797d5d3322e8b49c7b82c1fd56535e9d0df053c6118309382c410ace017502302cc0935c030403f0112485be0149831e103262a6097cfe922dc027e871e5ab00809064c27f79b9c5dbd9b96a6b26dc300d67ad08ad0b4f7ff6dbb471a6bdab360dd62f5746b3e11761613ec2c1fecac26d83fb37eb0b39c60cfac20ecac27ac21ec2f236609db2f1c715ec1561f88ab2662e87f1201f6e79cc0fedd09b0bfa702ec8f6a01f6ff562fc0be82c59a8823f6217c31ec31f3aa7a00573ec01fc0a1159844ba7eb0ffe003e82e1f6074f500664dfcb8a2a7e36305b3c2fe155f919680fb19358d7f451dfaf700a3cb8bbe22ec4b88004f27d89f37af7cb0af60b70801ed8304f6ebc2fab70d58b0fe2f455e486a42f4c99ed988aa5a89539464141f483186c3060d1b1b58ce7c873247fc7e29f3cb06b9ce88cae5fbd2529251d3921117a06096a3264d381e998009b6c1f128054add910f0f16008e472590f2750c67cf5201ebe96cdb6641896b8b6a0a5bbfe6a09f5bfe48e37aba398539aee5394fa7e5b996daf25cd737d3c57df574ea472f07065eaf171258c94abc7127b07e87df47232a6c3fa73b4fc77ee7e97c6f41cebbaf3ec78352ccb5802c5f59fef374502c8f6241b1a02c8ae53f0be66a5f7a3a2b7b79505cbffe77ed5730aeea4b5cbfc5e559402097bbaa37d561f6d1e5d92458db7da0c4d67ef47458c022506f9ffb5858c0fa9f8ec6a80936b680c4730a361fc119f53643a52a8bcddd125c51ffa9f087fa6a6f9618f5f5338fc709a3ead388fa0eb544b7a45ba8af3f3d9d6ac1983d0beace0e43f9e40636cb58911c92b19311921c925248a26ed9cf4e9d84f54d746d1fbb25e40d89b72ff23d77921db70473df815909ee58ee6a8788595e47c42c77d5f24558be3e4bfd963fbd12bc81b9c3dba394bcf0d7c202e66a41efa38752823f100318051ae930f71b98e31d183b8cd2dba2c7dd9811d8fada6f9bb6c98e796d9de0bc465f8a3811c7f8a0166b66cf299b684c465b5882fd939c69c2946ae06d21e653b627752b57257f7f9fc202ac459c7e281c28caef785f13887eb9e47dcdbbda91aef9d2356f12a11fa2eb880dc42aaefb8a555c3b3ee4168e4a108463e0785482228c822b5210c3f1c8043c2720c1510aa8c02c14905f847f71051b69bf14f01efa85e5a580df150f89fd25f69b75445cc448ac822f0562152c3f56c171a6998634240d4943d29034a4d7905cc9955cc9955cc9959ca691b42267f2e682b4240d4943527a252fb8cea1634e1d4f67c260b4a848471b1afaec1336fbcf0fb64fc4a6a6a222099330fb84dd2aeae6909ea4d312fbb70ebfad3501652ec591e05520c1f25781db9560a46024e0fc1fc38eef55c456cc22769f2f9b8f35fdae2d51b1b058f36561f3846d4b5a934fd1a4c4b09da66716965342011767327d617f6e09728ab6c27530614085e291a6434e0e136c963d75b381cdb207cfa6d7bc02eb79c1fce64f91be3c1918c1a3145f45a9eae8044b5e86e291cf955a03777e1b3f3e4f605491165880c32e48801bc431adf2414565db81516532e2c2898d1e27cc22232ebe20e5cb59d07538bb91bd70d4426c83e347bcb5b6de9afbadd6caddba6d1fb3125ca9a7b3f520bf629c41ed6787ddea5efb186377719ceee96c13476f47cdde47759a88b3d76ef603db4c3ce02ab0e2115ffbc68e638541bca93fc46f6ab556a5fa0f434d4ac139691afa43c827d556957d55f83129cc3638ab6ca830a53452ea3f56125d39d461f6034ba5d46cf149810a2aa83842cbf4ed24418a37241bda867e229cb520dcdacf9c3f68f2f414cc324da3e006723c2790e36af57480388d93941a993e1ea54027a51c4fd3f812e6b6ad398e4e2aa2d7afe33ced722f1694a7b9742e9e8e3f8b2761c0f074ea73744e23d3e70a29b45c91d5ec8a8813351fcdc7699a1ea196b4264df351b1997bc518359f54b7657882a797ee93829d722e25b992f60e026dff793ada12a660c46e05eef529d9ecb1c8bd62cd77052ac6bd5e1167c6e76034a72a2d8646352da3599daa6f427f341f1d8f693e1ea3284a3d6a3b0de54d16169b4ab9c0e8703c9ad6c4c1b85787da6a89cda825eeb5a4058a0965a55b3e1127a5dab816a58732a38dcba0fe33ccee331db68753104114b0807dbafaa3b52955cc66533077f798ac199d465696640c381a5901023ee168b4c594a2ae8a27a67423e08ededa942a860a474e14e1c8891d1c391174e444088e9c5022d54515aa9002eb49e1c060c511984cd191e088c9133afd88490bb2232628c08ee3111313e06c318cb3f286c4387800a6e4c2e1d554e452e2e262774b29dde386a2a1093f78b936d072025ff020290966e90b1e2425252525c914e1ecbd263b9f8b19b83df574b070a621019f9ecbb2fbfdc49ad3293b7d9fae96d4adede60a489cbf1f2dc6c294de17a658335f98f09429f20e70dc47450a2902b60e55faf21b8aed9f3e606da27d965f7d24285f1d36fd744bfed42a41ad0bb1e6664a6a50179e742b6b4d75a85bb9f2f8c81b59e27e4983fcbe99a4a1bfc276f4cbaf3db7f6e45a7b2a4cc866fedaeb98df1dc1fdd21be43210a8be067e5dd2b549d3380527aeb0da436ff5e9d06b5025aa419f146caeb159ad983556ad88d2d4e195faead02b4fb7fa4ec755ec7c7fad0b11277a52e8d58a0ebd7645aa4835a806d5a06e1b6baa87c4d12c9b71c61833adca8e295ab992f98c82003b7b039362436c1793b10e933a945364940efb7b50945599136b70f0d8f899060e29582b8d4e690fb44816b3d962997da5b16162567e5b252e766b7aa5adc437205b5a21c6186f8e31c61b3bb4b15114ca489d3ead94e2e9d3095a1176d747c54ae9d26972a60e97965c7aae043141c6cb6589f58f381a7d6109532e7f2f4447f01728dc136d68d3c2e697a0d74b90df44977f2f2b2d495b7041e92a69dad0cbd086386d481b7a097a8122de6cefff121471e4ecedbe401169fcc5074d9146defc3205f6bff985062f434a60f7a0581385cd2d492f414320f7136bfce94b10f697a097272f492f555ea4f85e2f462f432f482fb197292f44d89f4ef91a82752b733f1fcfb784fb8938fd325e9b265f7a3e4897f69c46a4116953c418315858368d6836e9d0ef64929d0948bbbe945d4929e27c4a4a557a9af44d8c97165e68447e65e9056332656b44ddca9f064533d294b2e0e24cbe45d8817c8f8fef46a69114e6de480a28014f6345b8d73e8b7dcaf674b3112398fbe8cd22dbc7ede736bd39c19c2aa2bdc4415b18b4c0da6bb48bde8eb0c320e0ce0f01853c37c1f01f0c67604fa7db2fe4a5f783fc9d9741fe07cbbeacc427d473d2e351bf7b20601220ffe37b80497a7c90e7220e1b8dbe80822366791d3804777fe2a2d75dae4ae783edbeeb5e7a2f230d3309ee7638feeebb0232bd01dcfdf3e8ae8ca1f7b4fb77af8789658c682cf35cf48e8e9a31e316e158e6c658e3bdd25f6ef6d1fdd373fe32465f5881bb97a9d22d4ea9c3ee72555660f30a96e18893e1d3f51b213e88f7e85af574e82b261d8c13d4161626e8c26443b0427c86f939fd7dff958ccc3bcc8fdf24912e21eecafbe812e23d21401b04ab019e9179ef673c473d9d19d6dba1c77ff7393da37b99bbe2d115f9cb55f9885964564e646456437ec3e33dad6804862bd87f055bf5742b46d08a6805e5262631c5a3d712ecbff2917121ea5686f97181d2ad9e02e6c763607ebc21443e8897dece0f1fc49d414e0383e74f87fe035c01f9f14a5c41c01590201fc4077193cc20afc4e56391b047047920fe881f4fe4f30a76faaf08fc1f44c0d5cecece471710e06a4788908fae4c09db3d37bb1fdd0701a38b931ea5a38af02addea6eb7c0f797590282abee25ee7e08b8eaee57e4fa8c9060573277d53bb0f7f479059bb1a69b18f59cec8280d1f5038c2ed6cd1d461561518445117e82b5ffbe68824fefde4e7f121f2fe42619f23fdebd1df9497af89d9b24c8bf7cf82382bcfc1fe0cb873f62c8f7fbf05cd6edf0a17fc8ef80f285801fa4eb582cd6b33ccff3be76e87df458dfb1bcf7ae4b50872e0352ac29f21be94a792f3d1f36ff220f4c6d582c49ecd2715fd1571471a490677d8c373bef7d8c373fbefb186f883c0c2237461a182f8475b34ab57363a4f16eb618c6ffb831d2c0f85cf147c5761f3de6a78fdf4817e70592cb7c79f18498175f50c5bc20fa86ba9557b08fa85bb986e093e283327da68f15981f989f2d5c885c88b8a064e3116905731a2e6c6fa987f98a628dff8cc266989f0cf30dc51aff15cbfb6f4ab7f2f4e9c054872bd6cdd198d5fd57f4197d48dd7a51fa96fc3fa6cf8aff77a56fe8cf6745b7a2d19529d8ff8bb1bc6efa742bbb10617fcfdf50936ec523b84b51c421723182797d43350411a78da4f0d783f6df7778ba21101fbfdae91ed403d2c3af76e4fff81ff708202f3fba727c82110701a36b08185d30609e2cc09ee44938af6055860fac80dc56309b0125e039ad030246570f30bada0be7bb802c58873e89d07e7ecb91c639b4677916cce5fda7cbafa4186265478a1f569e74e84f88acb410f2a45b598b6ecdcb7242643564b5d4ad0c2464b513d4ad0c1464a85b19e8c7cf2520bf5dd64f0c53b732508f9f971504bb61c9017a706092e3739b803fef64c6fbaf88ba95c3c7f1fe2b28ddca01f81b45ddca38cf2232ea5636c0b3a0ac907678ff95153ade7f15cbf1feab283aefbf4a9279ffd514d6fbaf9462de7f5565d5d4ad7cf336de7f75a55bd9866fbd6af01400a6c3921c7a5c4cb00faa89f7d339a144ddca04f81aa0742bd3f036ef1f533480f78f31aa79ff18a46ee5d4fbc758d1ad0ce3fd6362ddca2fef1f13a55b19e6fd6392ba955731534eef1fa3d4ad1c23a64ab7b22aa6a95b59004fe3fd63ae742bd3fc0cefcf7a752bc7f032bc3f8ba75b19003ff3feac21bf49325d0a787f16ac5b2ef7c1eb808f016586f80e442de03790039168413cd88021e01b6088cce318f2370c39c0101478f30dff43700c31404c0386fc0c07804464fe06111c1c1c6efe077366e0102182f33c427ff30ded86c7b9482a8e9b71ea101c37fe87fcdf7c7fc6909ff13c4237dc0c34e47110c119f20620826380e711ba71f33f0ef7e6199ff36003643e860891984b042472c1e71192b91988c8c73480480370dcb87f03f807781603760a90596fe322a93b3c423bece8d841c9ecb06edee163760aa003c5809dff866009b93c42d9c6b72e929a515fa346ccb374bed6d7b848ac15f23c423137dbf8ef22d162be1c5fe322a93bdc5ca3eee8d8f8989d98989b65fedb89f99e4728c7cd403baf23a4c6ce17e022b1350a10f339646efe5ee7590c68dd6ce37508417d77915421ad4e46084b880ceb79846cdc0c24e45b0c4009f98e01365a32bf03eb75bc076e3f2e8f50de916bbe868ba4fea801c5e570f3e67535fca8b919018fba48ec8f9a1c3c21ba1f4f17e005b93c4259876c536b705d241da635dc5cc30fc0e67984ba9bb1b6e30770915404dc3c80fac385bffbd1dd8c7afaa30b13d3d8b56511fa52d2a7ef58ca2d7cfe71865b32e79cb3e7ec25dd9a50b0a68aa981cd36b169e22f216fc8065536163dd14c64959884c91b59151ca77f944b689fc92564956682b3efba3923850d1b8653ce25f1c6364dfce96037c5683e47df8609f68f55ab1a0eaca570df7c8462ffed66bf35481ae2534f477d4dc61ae40d269af56b6d87c30636c758ad397e339b267e8d296bfc94787e7b3ad341db212dfaa4f081e1a3f229d9262c0c6c13f6051606f6052e5b4ae904927fc7297d9a073b2c5ec12e9bb4606aaaa2142549c90a242845eefdf18372bcb2a753653373f7c13eaf947ebb7bb22876064b383255c17909b6130821064f60558794a5eb30c3510831a8018c8b31c61cf72bdb6b175d74c1c273da68a54bb418b34e4527a594524ab318638c714e4ae79cf3e39cd3a547ae6abd553a299da739e7e6e9c4a794d249e93ccdcf69b75f343971b426416b123589ce4bc2a35c12944b824b02f56919931c3972749102a58fb315a912551dc89b19ab44734aced9a507d19deb9cc3f3562214b8f712b86e1231379e8dc743f1a0a60f3088219d37c46729dd5131ddeef6d9169749fd8b25509f12e06161716f99d497407d4a80a745cb34971a860c84b9b8a452297718933a0478a84f09f0c0f074a8bbbbbf4cea10e0a13e25c0c3b578818b33b19de3baedc471d2939528e6b712d913d02344c4269ed78b33128125203e62410c497ac0104a5c253a6d2809e33e8e856b21a2934a18512c168bc9198bd26127c57888ed602dcbac44a793ac154ad354a297b5e1346dd3d2e2d233ff34c2d0c5252553312ad57c87d1ea2a5125d2b9809db142e9b0898c5422dccf9db88d4371dd4f4b1439dc6a078e37aa563525aa0e989060c2833d1c8f48d0052218c1e34312335ea7b2457071a66b6cc40738eb1e9f8296be5f8bfdc345fcde9f113b0c462001152e8e465d10054d5411541d7bbd5e4e2c49c2fe4c68220aecdfd994aa8929b07fcc2fc1fe33ddba013b08aac0fe346c9a60ff1a36b4f8b01f85e00bd89f876e3181fd81740b00d87f4810434481fd1f10811e20607f23fe4428810980fd314084fd93746b4a9e6e89000af6283d3d720456f0231250811d853d08c78843e70d4cd072012ef874000b28184ac213fe01104c9b830f9cf8e087075030a1410b58ac682207d3e51ea357c14261a1f8a8582775b332b031b03965a1b0411f151b64836c133516c5b7b181d215fd460848ffceb7ea63561f09d7c77505f355d64d4e535f89aba69e38e18a2e2179fad069ea0b01d9be81f49f6e1295d3d4ef1b9d6653357d8df180ed2bb4f5b6f56fdfabecdae8b0e6384ded9a2dde408755b1b99bc0e8a23fb2e90d6c1376729f7d92d36fafc4a5d18fcf813e3a4bb2650f64fbecbb2f90ec4f3749e6eece126bbc5eedf667b1c66fe20ff366e9ed46e054b36a4ea3cd2cfbaabdd3c838fdd62c0327a599539fd35f94529a6d5258f953935946650e6d34e12f2b7fe62ca359466558b719705f3157a5964d4ae7742dc63863f4ee6eeb3475566db3c257046edb90d4ba21a9da86a466344eef28a9a4799b48366f47dda2f744b2f99f09694cc18403db12058f0bfb1da10a96a50757d8ed069d147bc2f1880919e0fc53b013c7232680b01702267e7498f0395a22c83e13a212663dc5604dc0fe9ba7e3425d0337ac063109571acc58ab138e603850620af68c8a0772e083230f3419e1488920bce0feac29092d1ce17e9a6531844e421229d802891ee0fe7e0e3861398005ee4f1d75800a26e0fe7702e378c42305f7d3e8ef8e35e10e0217b66f6c54c216044dd31a06f6c3f1e8c5a4bbe2e5020f0b36c3f1e8750328eca02b81ed703c7a0961899fa30f0015415b62411c8db658eab860637034cac2075cf0821658181c8db200658a2c28a1038255e16894852525985e545818381a3131f172c00485ce929836713c5ac20111a8a2e020f86831836587415f828b33b97b4d2dc8d624ea70fb3cb980b39f49903711f09ebe7006c359cfcc820ace3ecae9049cfdcc7e22c14646c06f265296dd5c330eecee293a0d6a5e1b4e93bd771c285dfee29a48d944b2e930fbf979122145d724f21b1fd90487709aecabac55b3c20a8c980dd25c9a57aa265b392ad5e8563c02ce6260138d764c2224ce725cfaec7df8cd679f6121e3b689b46df5275213e5e99b6884a1ec67946e45a32f98e06c56c1d9c72c8b91c9ec6396fd56b5ec331bc98433cf5ed6bf7bcd3e3521b39156955282cd1f56a9a415b21efdc8115caaed36b175d5db7cdb7c11477ecc9f3818bbb0d33b7d069eb22c8738cbb2ce7eb4f6bb138d9dde5a9507a63c6055331cb0a7cf3ecb2598c6a507c31d58eebb0818e996f7d407677f3ad98f1da69eb3d97f50acfd94cd3ea753609ef87473cbdb1ef6b3abeaa17ef69c7dd9883b6c638dcbb7b7437391e2e9784f9960f3e3b8c9e8a82cbbab2ccb69540dea737c3b9dde469c98c2a7b71daaa2b0271a67c4f93eab3cb222d99f9ecb40fba954cb3592c2f6e6ec8d90d83ecbe7b4fd0c8c9805b41d525587149498dbbaf6bce74edfe956b7abece9531fef348d635ca2d98d11bf99ae087448735cc2d406d3c73d272450c0040300471f9cc00966f99cd66a15b6887cdf216f91ed6f916d72371b3982b76c6eb8887cfa526e3ba2a4211f81e5474943d6009659099679c3da732fc1683f6bbd9c1898070953b282fbc31afdd6fba6bc215fde88d8519ee779de47efb381f5bc1b7978ff7d4ea340a0969fe00af5f35137078e9deff8660fdf9da8467d7b3a311dfe557518733a3382dd3eaba6a703d482fa0e5c7d2ff1f731abcf9160bfa14cafc7175d87d1a5a36a874d05bbdd58b799491afc6bacc938507bb095b0f56ae06afebc32cbb2150f09047b17cb5dcd899d0a15f6b6f0297d4a1f183ea517a64990375a2c5bca824acc09d893c0b2bbc33005d780a35118823027bbd983fb8f54f0f381c1e6eab45bd2e1d32abaa7c3251dfacb2749029beca804cc368641ce3285660680000000c314002028140e8a44029138209267aaaafc14000e878c4a7c549848b324865110c52083882104000000008400200a4951551000c3866261ebc9c5af229b17fb43f8e5b8277279203f152179ae4d74792e6d9ef682c14ba6fb6142b5425bd33ec5b2ad17804e27068b431026a39633a417aa8e1d026555b3b699d387ed11152134658ac7eceb37b045ad9679550f9dbe76bb146e5ee99fabce944c75cbedd2b4544848d13faa440dcdf98c7309e1b38fc24d6679cb78e2e14c38bc6f5a32e971d8b3946d4e94ce0c0ae66d15e303f1f672861f5406fb5a7a048f7f687ac993929ce04eb2a9dbf4952e097208dadfbc72c266d1d0f7bde90d6a00a8cef7118a8a6b09850bba7ce3d4342f768b5123eb271dfc0b9325056d06d9746bd9657d955eccede159883705b2ba01eef8174cd657986980992ee5b9997b5e941356bc5ec8ab73674a5b91f0b0f9766a98198d55ee64d4fe01a069fa670c6c28915d16ae7d9df931c4d90bd88afa1037c191fff3e10a92a91e60465336bdb822df3ef28837935cc05aa995c6de072eb799ed31751f06c6f2565a73b2b77548a206521681f98aca20ef768e4906fe76d10269ae10276e527b7ba275514b4f0cb1f733eba3d22dc940a2d9eb49938ae2f3f97d950dda2c29c0a31472d63e617219683a55729ed08b8455a20646f54fa121abea1a139a3ab158c589a60bf850ebec905fd515c96baa7f0876cd672d8e42a659f3595391a5357f7646d0ffe0d8ade8c27ab21c2e73486cd3c9d12e3db61115d7d1b90449130553023b1b6fe6b492665161e93fd36701683f21e84a31bab91843da7eb41c84bf3c27685f7b23b9df447518a99b32b1db39566d48031c518e41ea96803d5085f600097f19971e4bf4ee554669a6750a3dcbbf4ecb14f5c7057cfe479198129ac29f978be2d2a2294e67701d3df41dd5c2b6945dda5828705c1b9555181b06da5345989b823506ccde18d4fdc7e0ec5e6612c4105bb387f15e6415fbe5d4c3873d6e84843d8d1457a368762bc1d8ff18be017b1686b6b4411a2ddef94a50e6ac1d8a283b2393c21d662f404d73eacbf899b635d86f81d22d67ff58c01fb36a38f5f394881ba24c4d5b674566fd5e82c6d54fea6e006013e8f1be84cb1f54a497c8883b479006956638f03da7788835f41b512c9835f9f1d4ea3fc730bbce13656b0d87534f84ef3fdf61df52cbf8a0faab906b9bd2c5543bc7a6778a2b0a977238828ddb0c77af5a5fa4d115c324ca4151c9766c9e3e285e1755d44915e7eea8e8328457d334fedce8b533b844a306ddb6324986d78c6648aa3c6811f9f6003b16e65c4c4ca05f2ab7a15fe5a96eecac2021fb65c741b16343f7a6169867f871fdc867ea64aef2665c0d48e8b9577c35eb490fc24a603b3a7a610ee6a746e88a7134a9df0d52b2e23cc4d841178b15021e01ca81243613980e98d1161c9bf3a3c4b6e6194a4a8aaa1242af2d76075d6fa22e727a354d5e19a0c4de392211af52ac677d5cd8ede0d01019976313c21327897db658591cbb0c8458db1921a56777cc01437a3202c571dbe449678998e48748c16448fc9016603e226396095ac68a8fc9abf194225278dff880500a81bf533cfcc7b82f5989d51f4d766b611bc91ed9c1cf392f61ac1909ee7d8bf73ee7acc887fc8214ec8343536c46888861320ef5de840bfdbe77371fcfe83152dd0af7042bc208091251814b259276ab463ef30a9bccd277a46723eae6a60bcf98282bee6214b65ce7bc9c275744e353d7333721b2f566e6b669be8409f09789319ff138291a92f136c3ae92a1721b7e6d8b7cfcdffbe8af03a737197c9433c2ab4fdaaa02c85771cbd7a2eb0a7fa2a8fe1fc0db02a23f4ff3a7c0c77083e669eddc54c88404a61061aa7214de1422a0eac34cc26557e425d5121aa60eacf0b684de3a707f6cd2ccb2ac42634c6d8d9ccd02aadefed0e0b6d5881bc26a767ecacb7bbaae33f4c2865ebf745c7810bada3af36ce96e8f17036fc564ddd8d8fbe85ed186b33b92510463d54d06a2ea23b1cf2ae0473e14507c5364b6f27887caecf0c7c61753b718ce32eb21cffb62f9056059e86e7a7fb97d81f3a0d2824b2c0dce8121d9ab120d69cba927460435235c26ef753dcb432ae30e6f344d30832181dd4a5cd48ce41d9090f3a05c6239a2a884beba07847cba4bba66a5c41cf0678e021978499c9a4179c3abdfb31266f59fc7689f1802918c54543b0897b70899e64eca591774e8a1c893c987078430109c8b825659a9584ad2b9093b04f1769478dc7798cb26ce9b95b3adc2025054325b48f528ccf564f2d06dbf062704f9966a27f69efdb000748440955dcdc8f9a62f9f73918511a2ff8d2b987523e3bb7c28066621bbb5314eee08fa894cbe66ce6540a48015503c6a93045dbaafd8e3a0d69044859348d78c77420cc3c968a45dbfdd4c8608658c61e8481f226164cf92407656c03790b542e2006955c560787062b3a537e9e3b16ae44d4258eedaf5ceb91dfef159a71f95b0c54a853054fc0c42218bf7f1ce24e95b26943edd145a1df0609a344654f9f79da4a759c877d432598fa6beda0a696a21f7793261aa26b0460b81ff7f8cd464359ec4a155805ea493adb14eb136b184201149890541047aa4fa82b843bd2953f5f21ae2a8a57822c2638f9e473a7998e2a09029e708437477dcefeeebaa99932b303437d5f558a2e489a5403019ca29e7334fffe4785f4777e818d4dbaec9911010ef9d9e780b3dd30bc9b890f5995d8aa40605c5e3b00fe501175ca2a431765e3ee81c3979824fbee7cd12d31c2dd936544dac8d899804ea03fd3cef03cc05623dba237bb987db9affbc8763d21b73a01822e79adfd1d36ae5e2657c57ee22abe0e9922f827ff0330f838b94878b8f62113c62a865982f821e30267e5edcc84518a256185de0f0778dc1220903b984699e99583c5430e11a10f2e2d6c138e42f7bc48847456f71b788500a6a6f1a052f5b2a3893f1402a146913b1efdfa041163a5cc091502a84b1b3879b88a713254f26ab4ddf6e670a10f9c3d5db16d6282da0671506bd2a10607f9a0fb81a87624c9843d268a3c08e23e042accd3db244cc7f03149b8f03dfd8a62a379209009fe055ccd2abff248d7789acb14b4a7101bb1327272c40a733e1639402e849c13c47e79abc2eae812135e23a9b00e39cbc62a971a9dcdc8eb3811671142c92a20aff4c6e9cad98b348d2fd7c9ee9d13a9852dbef5953a37fe907efff803361925e55d7b4d0086e36c025b2e490021c7f38919e690551948f68807012f68429c7328d4e33bf7aaf45fcf6abe1b40f7ef8187e4aad5ed045615f118b9d046a76a32d982799ef12d7e8bb5bacfae8950d494740c84e83deba1d5c07a4994ecd264a3015484151eee54994b356abe52f459271c886260a6bb28e90fd41f0daf8a8c90c8cdd371daf0266ce247f62bd49c07300a28f8de509042591881a04f511c4441fecb3dd83659a1a9a09a341a5df64f717e929b31278444ec06648b74423c9511a27fb3ecbe40c3d36e5aa073311eb9e90cf6688c21fbc7a4dcb9570a8b099ce598a8a7301c513a3286c3e583ed1d42f3e1b6e8087281312212c09203af878da03926877b7039e502400040dadca80002f9f1c4ed51c0a93a1504eccac92773ec2d61a43b9f2a305bbbc10c6dd7dc206cc017353030d768481148f3eef31bd05dfa2c709372cc7591f070bffeaf23f39a4c89d146d3e3336ee24acabbcc09e3bd9801e986deb4341ba433cd8b10f94b107986d7fe1216eb1c9b4ef8ecaa72296707c351c94046e693701f7793a711b4a410c68ee48b76b2b1ce2948d5a039a51f03f1ed0ecf905c2cb04f420cdb3157d1f1cd2d7136a61bd816640f3d0858f5449b321387903e206c5e4eb49c9d6c9c6ba3f5249ab7ca92e3c05884d4480d8b74b9fcd28324b6d67bbb59b2261a2f850099e171ead9e9760a0cdd42ec2cdeaa4bbc83b9fd55c937ae4fcc3e12baf019d8dd7ef907a4d756a9384210bbc0acd62dfb2ece006b135dd7d1e7ac93460bd59bdca4fc2a54be189027cf8278bc3c60e6fe604ca862189b70f2205139b4592b45235d0b36898bb0ed5a28b9ee42daa83606998e25e61afcc55d1e80415f6c874d137349188d1cb52a2e5c2f9a4e77a6f55c4bf82c0195f42a35bfd13ee36b94bccc5a96c5026f33a0e45f6930d364d3daa14605016b0351a3bc3a1222c205a99a355e930eff9d6ce40aa6408cc4e2cea31a28d00b8c16ca010d405e23ee187f7284d790fe0442930efb09c540593b35f25394f7122bb21c5cfd1fa4ac43b23f0063ba203c2c9111d9175ec494c1bad466b85881c7e0e398ead1f53d67edaf5e74a406e74138e61e31cb4638a10d3b8aee4934333bbd57ee9161aefa8e92fecc0584cf8a6da81e73cc3551d7152dc60c42d6257091d56eeadb45a47831204672e966cc0637b535e2800574182382ba7de55620838831920f488e0d651985954304d810f08a0058d003d6a4402c518022bacb6c0e8d0afc8e0a97b55ff810173dfe929cd4f81e480233dbda05a9fb231032d19b49aae133f047d1379d104a1b4942e357a62e673d4f53aed22d73e61aa09e001781370c19f9b1a26de722eab7dad540908f0b98b416956a3636b2ab5fe3e81efc11a129b4d4d8db3ec16066be10731658881d8ee10245723b68d7e5f723d8e4fcc98308c79a13114216b58f68e0b4fcd056d18e915f90533fdb8924fbe3c016c90ca33e1fd0457ce4e97d47f419b1e3564ef111fe9789afcffa07bb30f4e28807004818b8fd9a5eca11a8e595245b4035a7662d52fa57b4de50669784c0208a6822ab638d5a800501b987f93820402a2d16172bbeeceea5a8a29fbb54a8e536231de11b06190e5b09beb9f6da074ee092b0aa6d8ca51ce5536ba8e550f347a8cff8e8f2984267bd3b071b7b8916cd694a882b44d9580e545de298b8e6f825eb1695b444bf39158544e633488967bc92cc73688f9f26c469144b61dbca962509b35f8d923a99595f936886e81eb002de52ca67f7f1c1a5d24d49ade5285e9a79b26575c8c32604999b62d58b1e88f19d7502b510addfd1666cb5dd3504c1387027b7d74224f8020fb08e0b9000f80924188a28af536de10674ba0f498c786fa2d7a2cb287468c08d04d2c658bb3e6422331a31871bce69c2e01ee1344909ce871f49f144194584440c048bb3f4a6d41f02f6aeea923eddb299239d36eb60c779f49b251dbe0d38b29e19be7f157e0eca69a770a504b86f9b5ba621d304b283bde239bcd3fc743414280267cbc7380ce9b3b3a722a38cbf1080781365b1cad144d920236abf3ea473c40386f17d9b1535dd63a6b6e5d8066067e1f6c72c2bababc986c7dceca3998c0e7d90ddfb47711a7df1fdac9abf7dddb2559ae9e06aacf6883e57149d8b93863323305eda527f022dd5ac695d2525266508b370d63612d07c4f2c6290be74cfc32ee2473d969f53f5bdf31fd8022cb03aff3b616c268f840a187a9f03b376d285598fb3461cb4451cc36f2c162cfcc374d4c5f2cf6b01b83de7ad3517bfbe62a06fe8fbc1229e70224a4608494ae2d06a7cd1589e996ba05d14ffe682def2e0f6784b5c38c2abcb95280bfc635d17667e573fa7805ead93aac1c550bd2bf825c15f6c308c48a18f471e8f7f8e74e075ff0c8a669b453e62fa0e6bf35ac9f4901bd27500377648185400df8122c5bbe4200107d267c63b5c1b6af588bf49ceebfca79342403db54b6f23729478662218d13e7a25b086138ee007475b325f9c24a6295070e661dfa88b02bdcebc59a902b385e336fa025b39eeeef60df7e07f082af90021e38eb4c19c974f22fe01ae34e48248b843c68c051461d988e445b95d7ac9c8a012fbe56194c3e27aa63ba323c50d0c68ee16d31218b2acbc86bfddc09e8be439463232331a15defa96bf0be9491ddc5a8039e3b1d16dd34b5481a895c4a2521fa32b22416d285f263e7f59b985187f322f0a52ea8640e625d998dd6d508d7555bb4f3cafa290b13e2ce4e08d5562cb989e7b1a97861112b5b50a682c9452119568990a64c3a486ed91c8e1cdc1cd86b248fafe4554a8d64fcceb9708c5c70013a165025cec7c89f3bc3166aa666592a5a369942825ad80566ecea32e0a7b9e9e1022e3112e8a79dd77f7f098e8e2d89dff0e2dce3514ad724d9564b450af260aa9e01454d7f1f61a6c3e14027b3e7092db51ca6292df176125a3a46972aea435d08c25d164c701cd14198a0535682a094c7c25211bbd5a25b65b049f4289560e717eb73c0177755ff7e56faac5edbfacfc6444326acbd41aa08b45e619e123810bee6e344e07724c39efe511f996ced833d9952008a967d64d0e92130cb63bcbfb421e692e7a6e70000e0e481fed0327a393565570ea120d315e1e28af8499224687b76063d874aac2885754dcc8605d0e1984ef2aa13a0c673a3d2adc0bf141fee344c9a84258e70d7518255e1415d68267b09a479970e0b7688910a9563e4555582e43a20c1bd1a66580bdc7f1f1fe12cfc54654484090df28ace5ad8744af279531c688052d1ad9635ff14452253ded2b98150c9066be06c3f9d4ad42c86c77b686920158d582599f7c9c5662665d93d41a8b221abd9f18feba07f6c48e7bf66fc505ef3a633876491925c34d7d7a88744c884722af38639fa98e882bb2d2a703ec3344e30540774b8329a1815b6dce63f4090669262c1357d925edf4e615583dbb9413e85157abb6f60f9f3929b69532a7bea11a6faf420b333c20488feee3a335fa693498fcac4e6a135ec4120ec7680b03fb8954502a9dd1382ac8403678f746a35be4e12d31ba22d0ecda05ac35b1a93d8ed216f6950b701090d1672385d06724544834466e7e333f96fc3415fd70bf17dca6b6f91da8c2fc3dc0e499825be654c2325781a29f279bdac851b78d815dc471d4747140132f7c766cdf8e72a9031e5f0b9d02073ad3a32d4c3c0b3c61d5e9faa0750e75a084ad18d8788c0b1ac2f553bf0cc3e59bf8b385a7df6aab6d26ad8c8d18656a502f5788cee27c74f8fd0475986578ab547a43daa863d89270a8968271015ef84795b87c94c32f39b24720826a3760c692a8c67e13dcf2e73d4c0940f5f3b199754fec2b684f683704824c193770469c1df09488a083ce8accd6d23917935cb939ae590d048bb93e4a3b5190b351dbc254f6b2d5ad0d46e21a70e2269e8018b96b42a339892ee3fa2b76e31657e4e4a5916383f3cba56880302ef82a37577d09848fe1667826938f8123810488be6184b677edc09c780c078d09d977021675cef068d2d9d131a2bee80654d2ff2b7517659dc5e32548fea3d3785b834ec9219283961a13f128a48c0735b83c073ba2d15a98b39a73c12fb124967fbcb77a14b114ade6148d33cb0a72ed8667509e12af65663a010b8d6f47f5d41c606afac4251bf97eba6143e633dff4564c2bf1a4589b6f70fa7e7fe16844c1157e54a988f4e575ca48880c1a8f10414194dcb88c0fafee18f5a701bc08413770e3bf16c737e43fbf2d626e5418c0a79e368eaa42a4914e21b924ac70bd2bcbda501d920a4b677b109084f9cfbffaa92cd22f03819c5b6f48083bd8cd8538b19b4aad0bd8cf0870a7acb8eb26f2a7a9249df81a94b16a44a70c432b6ad3637244d1ac687feefc1b9f3803348e9ab72c29f9f2ff07e63a662ac14a498a2628f7d48f99513bc18a0ab5d548b5b1613b73e2fef86a01f7072dc601d5e6ccfbea0091a7cf0f747996eb4bf7a184b178c6923e0bef91894fbdf98c6da77c7084d0a1750618c0a126292d300ad136ebe06c396c97cf9c5d6fcc9020bf8293c24b19478f2a91b552fde3b9c8673986ef75111cfda7fde880a989111f56b6081dd21513033831d066ed328df5529424e1b698a24f58e51726cd71e5821c0131ea9494a06b1fdcb4c8c9f92211e2929aa73e4f1879a57a53105320dd770cb0c46ae7f69060cc4cb7fd841f758c7bf184a2fea51c38780fd331992fef2f79e1d61ef0a03726faee91d91ecb01fc605721ef2305a31d079900d418e9ad00f6a2a763e3aa1f39a4c7cf42ec0dcd25f56aad5a063a60fef01215fc142fb312fce2825ccca8a78d28ec7bf006bd6c7af80bb1b680c4b2ef358770377a60dbed16f384f422df86ddc72775b12ffcdbb8b3f3deef85f6bda0b6cae5506b96a20e3066419c133fbaf18f940a0e3fee9f6479152345b7c229619c0e25cdff749a757eb42cd52be3d900d3861a770c58a31ab0f753a675a0675adb96e9344e63608959b96bc6a5b0bde8c9a8f3d374ca025a1fbc2f1b7b4a7b3aba0caeb1d3a6870d69b173c5b03b4a59f9ec51b9017409438fe3d9c00e7dc59a50eedd8d190634723fe1073f48a7b4803dafc8246c304dfa72f9beeeaabb0cd5d571d9ab580b81bbcdf306509eb4a877ded81f5c0bae68d3f54f1c89163f3b47834741510083521e1c7e6465ecd2c45606b17622230e84f38e14828ff08c24d4cc3cff674761b5912764b0817bbc8e5ea6b51f8fc866f478823124b507b4ca5f4dbf8bdb7f84948fa6aef3dfcc020c8e7588224be884f6a6755d45bc5b0924a54a9806ee9bb6c12986630cc2ac0d78b9c34d32c31f8bcb223847299c1bd74bbf426c4338afa97a735d1b90130f372ae34b8f42cd13104e4b653d835a26ff070b6832f26ec9ac83788f2a5c7b32358a96b6c1dfd7fbf73091ea30f75808cdf372911f49411f1862a96292e9d4d31257d5ed6df34f525f3b8841d919441a5447327c80109ab077ac2f5436de99ee06a28af4c363f67d5e66fd6a27daed9d92d01dc562ff5aab5e1582ab3c896308112aa1639c00612913a5812c56fa62816fdb6191a884868831e287cd8405c3cac6e5bdbb9872f40ec42dacc46a227ddc5242bc6c7b286011bd1d3c42af0ffb564aa779bafe6e120a4b18e455bab7f2ba13e563020a80ba03229566905e99d669ad9d2b89a9f673643ff4f5ae52d0d233eaad69328db1b04bcfa3536d3bf6964ad1029c64eb89eaa8eb05b1571ed10c4cd6f33a1f1e2877f5d5761af80ccd8df8f900991ac3f419cb6390929dc8a7caec39d5f456ee1fba9de03fe90b15e87f908ee4e26ef9c578fc398526fce2b98daf7bb775b956409d983d07d5339274b0ee05a229a59d1254a4b94f8967918a6f1ce9f30f6b90c3d393848baf0d9800c1d4c9298f2757307df1f11ffaaf64e090862c569d7d72a0df360228ffc1690a349b500dc5348ade3b88bf119de9b77b5fa1ef8917e033971aaaa98dc0d11efb57119c85bba2fcc710a9845786ee22ef0cb061218982add4de1a5c98508eb89b68414ab5f464b6f5405ec34292242f356aa0ec4447aca8c7e6663bcf44fa531b6d639ec48c2708fbeb6815b39b4e05d96eb6845a138f7c8f6ed2c180e4c75f7220396f4c4bd54ab2a57985dada29f5d707624dac9945744fb3b5db0640db5c16be6283c57f14e6392acf3a3ca2f67b27fe0f5adf0400ef2d3362a12483ddd437a98e43bc044dd89acb7bc9a15822789af08505bdf185f7e935b55ad1698301b78771d816fe7605b7eeb6d99cdff58d58dd56d48b98f4baa01f4ef35008f236c39c12bc37c01b6657704ff4c17cd693a865d3b373ea8e79cb2cd0c28907ab5234e891c3a5480f77ceca88ce917ee50e2d034fe3b57c7a4e81e9e6713c53e03ee9498c4ca84d6645f8b1d95d028d7b4078759568e8dfd17dd2183ae7cb97217caa5a5bcc6bde6a310414d4b1afd4851165cc8536990a7de33f65c2ad8e351234cd18590b6066cf25782d0996fd743c28830920bf55414ffe3883120fcefcfe11bd298a32e4d77f59a2d8f34994c998df0e74164b87f794e5001f70f1bd78030814b1c321904524ca09abb4e6a30698a7b7d98c82dfc4173ed2e81cc611e8c4b6af9d1edf2e22efef1f9e403453495e3af4f0641742bbbb8443f5c6d8c3d11063a1f8bbea21f0fab1ed2204a53d42d523a34541a79726847e9b7ee1532f9372c48c77ecc3c17f94bcd9d06bd82fef8c350758c20a830c5ec95f19ce2d5d35c26ef654ec289693b0a520b26acae54e3021c178db1821e8ce03eae33edafc40caea38c9a3d2e0431b3f9292098ea8a53658ab3fe59814cb6298c01e8af0d47762172954001d6d7f93df6dffedd9c195d4f9494e5a77a88c74e89a7f9b844b5ace5433ed227046777eeea56378e0fa28f7b0bae1f5a81e4ce77f084a51a14e163b3fd5f30095338802c648bb00f134ea922722be8a49afcd313be3e31c950b44e86f6be4ebddf8facebcb3159f0a782a20018a302ed14135490fd236c3691b8f1f497dbc962722037a182e4849abf4dac57c5fbebed731271c90e6e467f16dea1f1edb3ee6fe32699cfadfb6d273993bab29109610af4ef05d59056ee772edd25937d663f62ee4987d78007130ee0cb172849187c2ddc7ee384f2db80dad4fb196b988e0e64047f17eb31895c3ad8e118a9df0bc9dca699ed534fc96993cd0894acef4e4816de19da25e14c03af3a03b8a23bbe43b9b21bb740baff1cc0fa3be334160bc8d7a913671c9a98e9fc400e918c33ae49d53fef534723a91618dc70a22ceb24f3fda6b707ade37c548e4d236fd6b86759c9403a903b7bce95a0f59db647f82a3c9ae5b7fe8da3694010077359bc72208c6813cebb3288eed3ce2b4d1a9def39a691cbb93ad2802a57df8b2a60ecfca3140218f31b2115bfce2c6e3aec489903ab5e41d07fa00c71ec88f2a24cb532444b05fbf2fb2d66383167d5c9e951b4edf91ac2205d71ba16cc0b5231dfb8cb0c4f256b87a8ebae4f62805d02680cc14f925327522d9f17ab52754945aa8614b895b8454afd60fe730361d6ad166c578a09aef3fd6d90ccb21f42192aaed80fa3496da898ec06967620446803ae57bc53014484dcf42caf0cd3f58fe410a6e8bc5319066df505653772051e5327d6c7558dff1cc5869b637fed71d461b089423a83926528a57ddea51c4fae51e05c7b1a19cefb41a473d9516ae862e1646143ce919d40b635ca2c7836df325e14698099e4b24883364483c9282b5a6439a21ec4681f9ad7e20c4e63adbc11513385a8ca6e563893b0c21313b0db3551b058ee5a7e800b5de917a48fc2100af50c2bbd7f414f6b30bbe77a2b603ad41394980436906a561044f3bbfdff31b0008ce2ebd1afb7d4308658836780305f272a69012111fc4beab95356c4fe34b0b919c24648280c0a3f1e933165ea40806678fa690f3d46d73953eeed9682e47f1853795c5b820952f395f2624948e63cc6a0c5347f2f3661507253510f5e8e798fba0fe29d447d10b2d250a20e7c05ef33f9e11a7d01c45484a93578738113e33fef608f248f6e40522f5da07123a77aa1dcb137524a453b78cd0f5dd21de5970481d063476a4ab4afa6883cab238a24be3b57511c1c72dba283583d105564e909c58f30d5d5fbcb3b4db2317b3e5e36df5574bf4d2b3cfed806cdc61fede507491937fc717ad4a5df3193fb9a5ba0379d1085bb8d8fd34c1ce511ee5396144f89950689f8f456d4a4c8d522c811a0c7e0abe7143f73968df539875843eca3c2cf729a75d5231f3f27529354f5b542bc7622f27e1a3d6919a165a0d50ae8fdb2c99e5fc07bd423f41bc94c5a5e92112a532c6777cdabd2b25d96760e5635c64d032ff7a547eaa22352b714485d742deab5468224017d41395230a3f7eb41632d70e6ca83c1e451656cbb0fd2e920fc26c67640812e683bd8194acfb3a17cae16f48b7762bccd68be6e19817e366e302830acab2533dab61c111a742605ddc624d017d27cf24233aad3e24ba561ef6b336e1b311b7254b81aa91cd61bda166f3b18e665433388b851ec81a538a1bab1b72944feda7665040b78282d0fc4bd6a48abe9b1a15bbf8d70d8ec71ac6263f525471e8598b18a3fd130617f4dbb8dadb5898a151fad008c879da63de19766c1d529d330be061ad255efb4916512ce2b9db046352b0e91b6a2428a35556c683786fb7ac430175c44d5601cf76d569e7fc8db9462307c0b92132c1c1a66c1b6b664a295b204c339db526692efdc4a306bc05dc19d9fc5fbadcdfe9b3a10454667f3ea96498be10520ec222d177cd9976da720dbacda36504b34c8e1c9ef436705f84f9448938c68849e0d36ede2f81a2ad04cdba13fc339aecd03816cd1523eae14911565fb150699d7cec60b5f2dd16552318c0c716c4d43886e95e3d68be66f85432b41313d98e0913c1c0eade7b04206e945fad886f5cb5099dcfa54a9ef901ed49172570af07ea5a0f923e876eae882dd501c0d32e84a4d3acb0c9eb5a970c6f88d46f8dfe085e7d1afb4974228022b6fa6395641032e34d2559dd2ec6c842146450b29fa9444af572b2624e191a1b0f0b2b26794615d6aa99d8171cba590c28fc8be8176b39f2a25f951230637d69aba4eb2b0291398f54b2615d274e30ee86d588ce9ec7c6aeda8b4059d592a8b416799c1a3aea3cfd115345d405dcff8c7965ef01fb99f6803a742efe0c3e9d4b17d252fb092e14044b43224bf3deeb9c790ce6c2ca22903a3e10954c8784c938b214796a9b9528f5625548ca5206b800266692e47af88db147a88983edde6bb13a47c56bde515bcebf68cfdbc693814f027f428ae2c1368cbf6f21867fc9e33faeba1183681474a2230519242e6fde654ed3c67eb09959a4d930849a79046a015de72efdf298c530e2013c1628c5a4f3804f836272fae25df8cb11a632c25f58eca3b73d8a9d3c7bd03ecb0de53c43be7bf66f3357a910fc8fc8f6c5bbac44e5a81a05e81bc24ef56c42079731357db0fc56bff14c379d56d3448f85230fff9ddc9ffcab4f59819e52366671b1bee5b838d6f5a88585a0e538c4897aee51a80d5bfe4067a364d9c7140b206a20f6f8ed720e6e3c26f5f22089863d83407ae2b1944a2f7e98a5e79659f63f42ecae57fbe94c9b2f283d55cf0d4ea2bff6ada4d8f9121738cda48cb4806e254d31bdbde9898d30c3fc166ec9310a0124e70f3f6ee791425d27128a6d563894ea020394524c795c0ab963b2537a525e315454812025c5a8158557ac5d27f5751c05a8f5d2c69b829d0273d5798f5101cd21acbf2da190f5d8026fa2fa641be6ea528c4ce41e9f84b9bd2dede3c91abdd2f238457fb69ea302842acd0754da16e4d9b9441547a1708e2351d1db952f93d8c1ee6d52fbab9e2b14d7c8d11402c608778f5127db5e82a7960723915201cfab9d0263e9ee2f8bd3703034ad3d029beb8863776104c321e0003137f6290124a6d9907a7e732ec73486997ad80b2a023e83bb6e2acb3fee4b129901d91f6b84616440213d4816a53967edc77a21650a14a302cd24505f5ea743164d648766a7a12d679079ab507c6e598d5bad5b064a8cbff5e00222c7a27bd434d3f8c622e5241592b0171bc9f11c39718fcd1bd463102c6ca15fffcda5202145d11a28dcbe8b217b0a1bf683eb3439c8742007cb0993b3260f1753de6a50036fe08c869e271070165a071179ccec381978f5a5247fbee5f04340fdf4d89b61e14900ecea1c2df11aee4b01821dccd280055ee25efcba0e970376f723426128f50f5306d4a08fd502e93546e56a325eee301285e4e633ca436e5b097210af4185e7b46352e64d4bebe24b9a9dc23989f4790342652deec209cb890c8dac72c72cbbc55c5e4febda551441800f520645b5636bbf46bbede274ebaaf48c87967441dafda251d6f2dedd004a7b383ffccf34b804c42c07e4a54eb7e0b93a264495c5e3451cf6b8b98e7c0e558220a84cfea13b77794476235cf62e2e3f57e9b15409d5d0a749bcad0919fc038ad08387d04bf6a818d5425eed6fa72c4fba3572d06917dc2ae496720648ded9577a96aefd72521860a56cbe8fa01100c030ac2a23a9e0cf67898cc12bef261264c02925143c02f590e42d5f4fb6f3bb0f0b0ce049803a74b2b106a8b46204c8c7dd7e56d404cd9b4455fe6dc0a6dc3698ac45fdd3d46781ad1e6c3dc04855742f5f9538c62e400098cadd64a97738316510a460b01179af7c616aa39060a47a8b16e794c4728c819841196dfa199afc999c859c4b25dbbf0601f3cc597c39dfacc94d271758a1fb4a9485a2ae6c16b0b8c254eab29b6a1d9f60af238daa8daaefb8696c961d0cd00cd457d66dc4e2d1a1d7914c8728a83291fa770041d10802ca79e0d3a038ac34feeed9812852c277aa6adebdf660fea53bb0c9bfc0ef5e0aabad2ace34fd528bc7607a5b64e92671d235ae905f1fb91d0904c6febaefebecc9ed74d3df4ef7aeba375d2449a725c4d20f309efe0b42ca788bddc6d12112ae76d983b8dd8149ac6bc75847e43b0d05b4715674a80bd03c12f6ef53ccb0b2e0b03d11eb86e27a0b042d118c5ff3c242277e9db085c5740c9e09d2dbecc20ca21411372f67e925a95309eaf2cb609c30da4f3dcc9c5475f545dbe9f16be1f0bf77e07d9fb97d7fb28c683e781332134574847558960ef24aea19cefe44025ae5556ffbb1a6287c79112b9c493c891902bb2ee7d91d547fcddff104a02f351722062de727b64378b3654043c9459c0a05fe799dca993bc8bf633d5f0b5f322180b2e073e85a24beaab124556f4d37334a3467fc3b2ba71cdafc5a86e397421b889e5fcfc03a74c2909ae48c7d5925d0036da0d3e190dc4da2c5393dacd950442437825bf8e2ddf72d392ec5944a467afb61d8c59b0ea937161d91efaf5187f6349c0353dae5cab376574558fde73e1d4cabb3a67cf61adb548c8f1971f312c5f558e4c9668409141c92ab5c52f5daf8802faf08668c1cbacbeef7048052a2e61f9029858b15556fc148114da0112b1fdc65f899852d48468e39d4d4fd1f85acb8ba8e3a70384b860c09707e7151c63d357bb5d058b4a6e9984c045b67ef12e65b88ab4b4247d644e69ad515ca8c95e59a254ae2da89c44c1f31403cd0813e3bb1fc5e02d5e488378d114a39fdc118f66f603dd52abb4661147fceb8166d5dfe508725d2c80aaf037ad7601b261f7a8059e2acffcc415b773013ca2e76861b6bb1f166ae101205bbaff63e6fa8d991286d7e82b9384cdbe80390824ddb260e06d8c5975caf6e0b46765b7197e3f248ef87bb926b4c8d0bff9dc3c715677aa5d6051ffac7ebf76510df845600f232c7a6eed5975d030adcfb2d1ea07221f3d3d176e92dcc0991f4d4cf64ba224ec935b928ddb2321af0c0b6636f8a731a138f3261b50c479915a138e94aa22f517224740d0799d4a40f14f2408aa438e48b3552b567ca9e1d656001ae93788f437a9c5f6d45cac5084517c91b38469e9998ff5cbef164feedbaf1ad40db3993981a9f760f22c87bedf5bbd7b3eb3839a53901610b76ce8b8dbaa2bedce2d3a72e8c78de217f66732058617d3b943e0dd7bf38d0e090f4863917a12cd96d4a7cb723c994619f55627789d420ab6ec3f3f0f978ca4d1c03d46ea6b53084678d073d7d52f0f662394f8fe3e69375d5983a8f683888f7aea003c468e047eed8caaa1c183a60d1e805ac1bf2cc607de6ac380f96a67b4450a83163fd14d1f4870e37fe08455084604b9e272f520d29ca6a6443cb8a8fc7d508b4fa3bbc3bf26022899f09edf4ed99a0495654eabda48a9901f3ee9d1723cb3decc34310278fbb6591c26f8b58659b9e6c8f0ede55ebb142ccdc60d311423e006211f87adf1dbf4779e6dc18fb5fdce447454df293c84a2942c745c274bc067052447c5db9213395af231aa110d250e1882058b2c74c94b7929321f98e4280ee970b72ca50480b645a88acd0279a72f329bad3be77653162644ebe45182966fe16c9905f7e126672784010132fd93649d41a6d98211d01575b172085d45a31ea0f98c23a7272001c052c2011a37878d91aed108a6934a06bcdc5f35acfc3cada5a2942f5b28a5a01d33ce0d1b2bc7d6d3514724fee004b53ee288f6dacd49a68fd9b280cb194254e5f61203115a9ca8b4f182d7dd9b94c10281ea426d5b2846bfe9303653e99cb5a50aba8ecf1184632c2fcd0e977a20ed052cb64e383986a5538e2458f55e75c5dbd0bab49c718a8fccdc2b3a150b8946412d68fb0c9ad7561fd3dd529cb5b12c563ba868ad0f4a33abed9d390342e234f8da124d8bcb7de419da47f5b9803902e2463d48013d55ba5449fd5dd0755b2a2c294de6414f3fd205d6e745e86090f250f0faf1e06129474c00f3c65ebeebb5845e94b8570fd8d9ec75c5a9f0784153199e7c5c5e9ff3ba1db82cdc6ce903c8f593f7b4203162ae848041471a278292b878315e06d29729fe5e94231cd64951541ae211425042a1c8d2aad13a9c3e0ae93b44e05d140cc01f9d1f0c1e40fa4b2ca7eb634ccf422b88df5d96029f89405555355950ccf7495476ab461039f20a05806f9de95bb67db6fe12bf5a8d98b36a05370e9c71e404f0334c549fda7163b0b41b3fb145025b208890ce15a276067191fa0ecbf244e332434109210c611b4efe345bf373f868fa315fd51a176b9b795d4b1043893a0fad45f23d6949c582640dd66dc85725045f64705d4eb568de0f6efca633b71a00d894e35a7656ac49ea607294ad92979eafa8b2dad67f422c9c8ee1f12b0d49f1c92ca0876567170a817a8ec644d955cac1fc8753b5317b7990a2127ae3052b6567eff4e88c39931e06676477c66092d9a69e754cdceab85055ea864ef04e312751a6d54a7781f032ea655f43995874b259c0945467226107e6251088c7e901e3f841a12622e63881f67af725f89805ea8ae0dd9e03d498c07a359c246f3da8c6518e69e6097ce36ca803cf2d43dfc95851cb9f892af322785d4b51412f46b1579cd9cda88eb1af5914a060c2797c4e57521532dbc74ac9921ef0bca3a727d0ddd0790e7d002e4878999768328ebd6cd95f0a931778910b9a8ba742dc77f08cc407ddb227851bf47e7ada4758277202ff921762f46fde711df1e12570ef32c1694258722d8110e5051db0ba1c3912cb410be90b54985aa492ec644aca380018171851cebab6a0c17ece389fe000134c7bcb53d12a83ab2fe1190c7351e2882a0c2a3c019173a5b08bf0eaee086d6f47fcc18dc6a06cf48f89e421c0314ab9651e305575348f5a0e2dd7ce7c9feaae193ecd251727b5c273755cd3d4ade4f69f652ab4cb54d295ce922803ea261e13a6061364eff6e09812d8054881b182e3f292cc50357494b1719859302b1c0ff962b346ab17827625107e186260a68a4182d76b2dc3fc14d8e962b2e446193736a760ebcc6f92b3ddd9ae972a65dcd46b64ee4972f8165601c3656bf7f3b92710e1c9c157c136032b4c748a0cb817de8b8fd4a277e6c7caae09c9e9deab80ea917abe0dd8910ac6146ba50b4bdff4901aa9bf4786f5ca0430298a9f433a18e96e181b69c485c74318a9792974d0cf1c109c750186505f41ac648f244070829631675215b91f995745b6b15d579fb2308df96904017a61dee72f02073e6e9c0934cc8200d630b64bcc35307d1fae5e465c333f99956380400e9ac43363d081fa44079cc6499da6b7ceec41da6a0e152cd35668b5edb02870d9eda78f17bdc48e3c362639498bb07651f64f8b38c075164164165051337a005888788a6c6f6029fa1aec05cdf38f8ad00953ac6b6b5bbf13b8142fd48ba988eff5d575c5962e217784acaf1a291389f53c783108371876fe3e94a505c02dc4ca482c8046d74bc9bea25aa139157b0c8baa9f2daba69df937ea2ab6032aaa56279a9ba31ded4cd7cf9d5df2ad985ae70d334b540a11b616d11542e83db803f33d3133bdd12ea5b8d1b8287746fe1bbea3a8369fd40e6d491e01c97206d5d94defaa13a5deddd165bb5abe90951b1fa9600f2d26b7c508e92b70c227c27404a60abaaaa067f39d47050bbc1a1d44dfb7e9b5da94a7529fa83acd8282fdab4583971408c2ef699bfaddb4d78f651881857e64ed8d2d67365db6af9f363213c23a4b705936950890b65e3a35a41df396687dd02fbdf8d17b40e924519ea71f35d1636ad92f9bd27cc6107e4ee0bd77e7ff0cb62e5df5e2a82b4b2839f9a0349d864cc34e4a8cf738778f73a3277044ae1c4f4ed31a3cf6853ae73da936df48a1efca02fbae65daf25f7c4158a8a9eca3f3b18bc22dd2608bb6aa7687a2e7ea3710a19ad3362a99a8569440f48ab6af5dc51bc7526b0873d228b18553cd08204a3f8f074e34dca4c45416ddd499a7ab39021e4c473f3a4a32ec4992e5d9d88426dd6b68ca259f74bf62da8e08405353844bccd0ca0e11ba111f6902bb90737c1680b311473629f7057a34819c73a81e9f9e31d62df572f768376c38f77c99a807c2b98127f56b1462261073fe0a0a92b7da9d596d09b3dad05c44a5977b82e46cd4a9b645b9c1796ac7cb283b50002ce3106d8913320abaf759ea4b22d22aea9e16d089d1b12e42fa6e363a3ebca3d3185c354f8debd44eca9ecbf761fd29add2be8ddd57dba158c747d6d842c26edf4dfd7100312dba212f30adc2f2a709dfbcf1bf545972302b51007c26f42d15419e1c6a14386f26f7a3d707f3c2bfa612f9e4d90bab8940ed31d4b35934c3698d7caa290fac3b9de81b5fd5c7969af2836c9f4814a44a40e6be852092802ae9a3dcce47f32d7543be20df6ab5bdee394ef780c01d55bac903531490257873a98e17ad3ec90e3356bd329dcf678a4870f26806775e4b054ea2851bf27b2af5f04b8c7856fcbf4dec96c627a4a195cf55b94f5e27fafba075f94cab9cc5ce2491202e2f092d1dd31a75efab65967969c5c69a5deab47ce094c9a815f4057e6d6e72bc6203816b2c45160312777e276dd5162ef2ec0d9bb8cd4b01078b520d2cdb39ca2b11893634272f22017e6c560644e2be5289cdfa731197d32e24e7ef292d31551270861ea25fe1c24a401da01d47256232e0de0191c9a4174a70852b8b819f6535464abe6c723557abbfb89f52fbc704e2555b2004ddfbdcfae82df72d8dc0ab7dd888f77fe7e2c72b310c4eeebe8821d88721e775bc07c54347ebcbf20ec3b0ef9bbd4bfb2ac57527d607c9d529988c16066bc74df7a989f53e12fb504bee3b6d70551548bb435b44478b338489c49a89e0184d402d42bbe03ef92058e1dfc600f93f8e020adcb7e1966b7aa077712197502246db435ed771ee49ae7775016cbfb893f0aae95ba5dba4603cd11fdeee6e8af64759a50f0fd72d21c72309abe541b35323060b3626593aa086f03ab4b381b5ce4746993dfbe276a6f981a513d0cd3c899a59c9327d5af7e8ea003feb8099166ddadbd34c4a1da5c8f8093749032fef149d64a3ca8fb8979735ed15ab61ed5ea9487ebae90ec1de20931cfd5152db77db84871650512d9f4aa50adea8216daa4760fb989be13280d7f6a284e8cd3baa181d6dba974e6931d7d05bf31ae88636b6bf3c05b196611dca3a4a36ddd2ef74c04aaf55ff9054950912875ef25014b676e0039557fd3126df994a54df42a6e73f544d830656e1b809a9c9a4aee84f2a86fbd1b3deadb9bd11caca7fd53ef4228a2a9504dec238c12275db68d3ee2019817796422c38b6035b74d563cfbcb80af34de553f610046cc0fad2c1fbe46e4117b907664b7edba055c368a2c2768a10f7b81e4b40cc7824cc5df0a7dfb3fcecc4cfeaf50ed81dc2a4ae0a44c3e4fedfe96df8e1502892a0e78c9430ee06470673da4cfac0161a53e8431626b9ecd03ec6835d3674cb54cd0efbee60da71c90bb0a334250722d691b50e67b9ed935ddb8a4dcdd7aaa7fe11788af3e9abee0dddb6667e84818cb05ab2ecb2a109943a1cb5b941ffb3e1f8ad6c52a9a442ce48b6dc58bdf8560c506887f1e0c2f8b03ca43f86c487b91f6953640a8f37892d0511e3a61a47dfa46febc302d6b80b52b30e44044ed7c307fcdf9979042bc4d9f0e199f69c21f714882c57c6dcbda101910df076b86983903c521d2cfb978b195e7f0f59d4ec01163cb3e65a7345ec3381da12397c079ab7fc6d9884f651a0effb1d960b2fa0f5da56b12e40703550a942147d6e098a1077c6f7dbfb03237e6a7f529764dc682926ea2459b3c722775c30322aa5085f36595e8addf09322312e0c923a010527cc8ead2fad15ac47fa23a992479edd2d263f94de66b6fcd02f2a43f9eed8cca0b4397161f8be3fffc092188b834a2fc5cfc0a6c8e6e267ef2011d339bf5357821477791e73583c146361fe96ea0cad979f164c96dc3d2bd2c65e10b78fd04f652cbe416c7568c236720022a2ffeb369ec944414b0f83d42fe643e861f33309d70409232d1a04da24ca8320d6b28bb16258ff474df19af48ea39e6b41a9089ae014f2a7ab4eeb2dc29e51f65edc49c82d94a5cd2266e665263af9ed9230cf1807b050e2b32f8fe9968c5e22c094f1f2c8e86e17fd3f7b16d733ffa69863abb287f662c54348c9c61db5b89c2fc54ba05db5e5e77df3337e76f2e39d183572d3634522131d34efc7157c81934a6006e9b229f1ea29c43220a6412d73ed33d48ed9306c832ecdc4cc311ed645ea969046064345aae8c4383b51f9a17a0f4df11fafc9e33b69fa95516e1e846a85e9a9dc3192aeb09cc715e97d81247f67c999ca62d8cb8efa9e6828ba9ed64b40e459fa4fea8d15ab4d44fd65b00c413f93fd1dd34a51216d218ee5f4ae7c0d2d18f9fc9d1336afbdd9672cac22c799aa97b6544a227fde723eb0a83f71b3446e8b2903f67d79845bcd9cd23ae6403a4cbf1dc269d53381fe1cd32fe80988c6d04f451f364251eabef0637ea14d83b605f7740474c96666fb53f450bccbbd5b2c722cdf7242f88650a5d994b21789ed87d40dfa6b95c76983984c86468424e7c876a3b3ba48175056e5cecaa3728fbff6384f42243abb2b8ee098507233b2d09aa36d3e23bd128a19997898603522a7eebbf853f4f41837fc39a1fcb4c68fa8d086e26c8b5d910cad7d5bcb48cc375c57c025486a801409487fbc0c2edc57f610f828cd8620878ffd73568170e5ba84edb7498753081827db9a9dc494485bedd250ce9695a6c2368a2baf4040a7f9bcec8ec499c0d1e78dd002159ad90bb83712370f4ad13f7dad0a3f3e0b4ebfedb6b39b7644fdfde4a930c686511195104b2d2404ec169d600952717061e74db0ca848b9c723e05de9020e37c9691ac77f7c5de1d1ecc2d75e04ee9cc42f2debe11a861a2b193d22884b6ed809b55bc98e69e81ad75b5b8e594a08a5642945e19965d4384ea2fdcca762e6ebf12425c80edba9ee2badb67fb11da1e90ebde242fe58c3dce66303cbb153c9031cbb1c0a98752242980ec85f11576c02b708fce03212f2f7394a95c2ae4e76d149ab21bed295c0a1deb589eab004e026254587104ba4bbc059628c1f3d12ccb85542de6e94e09169ddc9ee5b5a0c2f19cbb64fc8f1b65004cc83811009c0b5a9bbaec1fb9bcf7e99d756ab0a4c38284cf2d9970526042fdaa6a295b13566711da3c32793dec747da5e276148958a948b87ceb211b7b630c0ae751da83fa54a05666b44c6ce95ae00fc74913ff6ac97eb8d45a3e88f41740971235cc3af17a432815d2d3d72f058442f34287f4eca20c165f0ed3596983d8e269e5f4b96765bb287f093e01f789cee84917b9d43dfe3571f9d2fccf439057c6d9e1ce2b2727721ab4ad56d8dfe6628cee664aa69b50316fabb316d7ed33708ad90b8a308cdb9c3dc689b32f55d11de29e5729395696b092441969c3b8b5129cb1e55374e006001e84ec1e3cd10c3ce53c92e1353b02132b8de514470f6d959e2627392c913c5dee6b0bef1a4312f245f2a728057546be528cbe0989044ed5696a9f9d117b7374e862b8dd0d13a857c64c8874cff213d832cb396909975180ea1324b43a54e79109860b49ec1339b6f38e5354631aa3bbc056cfa8e851b566c871d6fbb1dc09e41e7a0d1433be262140e279ca83c8953ac2d42b4265b4906292ccee6754b91d275ce5347639f2dc0ca2a7a41b603640121de79a9881ac8e89b3a01857ed5c27ad9e8bb1989031ee55a2f0b8620f3b8f07cb7515bac2fdb180670d0b78839cb14c14afee8224051a75428d9db9f3fed74c6754c87473996978c0064df8c5038edb93b3de54942f63da218c98f01094bb1a0a51cbb6ef4c65f1e0c65a044c6ae33edea1294b662a59ca77e191976714a3c26633ac6705aaec4f77ed4d2a924c6b4beb6e1c152ebc1514564f277eec838d26619c6b3ad96b1450cfb7595011a8f08981862272cfe5d055636483ae504be4943ba57887d6c9535c8fed7cb29b9875f28a1a0cd851f5944f7b7d0c8f500e1531864d34300323c85dfe090eb5e34938096204ca3820012d5702b2367788bd90b81133870c9d512a2c8ad35bf9bb1155103f84c10e4e6d74374fa3464be2f5ecd4a103d8ca50705cfbd735a7a5981b8e6f1eababec9d141f156f905fe10d323842d6837aef9cd26af98952ab0787d758558c77389906c4f7295ee79c90ac35d37b787fa45ac12546eb492d6e8d4109ee6646bd7d74133506622a654ae0254b7b0b6ca7650d621eb7b6c93c65dc1bfe6ad565cb0ace154f90942b9b0769e023914ac4f435fb53a7feecb7a1856d257a0ee134988e00023c3f51e53634fcde9186ecaf717c324c63f51fd0537bd1cdeb1efea453ad21a6d694607ce57e07183c166a2100c56eb471a92896531bd15515ac1ca8d3f8c0b71a40445c58561bcf1786f5990672ca5e6523944d9b479db7d3929ebcb50f37c8d07cab3cbdbbeebe38090011c162b0cd8b8572e2d320e1292e70c6f69259843f12c5b39a9d7f9e00fe18f72933ebedc6bde8075ecd89cbf94c6959617d13ab850526dc30cc5055a20d3b3406722bc8a5720388f684974eca5b49b02451c433b70331d74dcbd0780cbb94abf595b6c49b636dedea9abad87d9ef62cfcf66be7a4d2e0289800346ea6728af21b38540bfd0dd541cde232b0c8551552c79b55a624da6447fcd4cffd98cc58afc0b5883882b5bae2fa0147c98f93b5b49c864cb1554c646e35f51918a5c1f52159d5eeced29808bc639b6bb872d5c5e0f08cd39a28a51ec813cb1c88f133696e1f94e5fdc07ef25df9b0eed31c6a2b95c314481e3c9dac9d98bc5b29267eeecbbb2607488bb8f540858b3a5860d506b1924ae6f6432b4fb24619199043a00c1dbd547560bedef6cc4023833057897a2fab7d128f549450205885565132916a15981f5116e8ee7e3a0581b78e3b55d526ee1506cfab43a434628bc14e9579ee599ec20dd84bac09c296a6234ad8760d0412a0e09627c1e18631cda185ac4c1f84d960451c9b576c45bac26b180f3ed9d19cb6ca53d580b185e99c21b6612312a32bc6f0904b176368b7cf0764e778c313baf12b7a1850e21c90d8ea7c889d06b8b885b88b4c437e562c3e0faa45c1ca7fa2b3b9c18aa4461e5c0e5628c8088c5edaf0e4f4fb7b298ca2e76549a122101a7eb19f01db8a5418426627f15eb20a7620e8231bce7e99aaaf4245e31b11703bd901c357a1c16057bbb508e94e0d9e5014bb836392f9b3fe521436865f88384f676956e6dc2c7e4003dca5dad2152b4531b1adb5ede0ac25aa9bd73377bf65af7e95926e68d7afd5147eb1ef1ab63d22dc70e12811d872557269c63c509048c22e56a71a6e5e1c925bd200becac887bcf452134e620e1d24c925057291f1bca7b613b38bbad02608881d89f66a0c2ae00fa0f5347d4dd37458c086eb598fcd3a4a79dcf6128455d5b324e95c6c6c0f9f495004bc314156c0b3e60da7887e6b02eae310388beba2e3317e2d10672f1cca6a4a53768600b69f40a1bb0597df96cc744ef198a4ad366ea7d43c40aa31bbc78cd269e2badbf8c54eac037355cd6fd275fc93fa31623fb684926c566ad8bbee8eaac60081695a8e911c8a4183c8330310ddb5b0375d1b961b4d11d1564c19618a87287af33843d1a8588ea263e7bdb302ea7369a0b60a4086b525d9e594d1d120210117f358390187b2ec0a05447f7b924fc21dd2119ead42c7554879d842bc4af491b6d4cd75750b4d3fd5a3ac2afa19a82a0dbcaa9c437ccd9fcc1389a8f26182150ab5fcc40b729b85427d2d77dc321ec835c6c16143a230c67940f9d25dc57c000c77b9ff06b8ab28d2cd8cb74192eb87ad9df4e51b469f5506b162a598fc39fa72aa4cb1fefe14c481377c5012e99de5478d1094711b67a8590f386335b7aba78c26a7c0a57a243e93a89e774ba8eb5e5da442430b933c177419b34068198be786d478d9cebdfe5bb0a2f65b27b79730f780c4f9ded4fb2a4a298a4c4c67323c0df30f4eee65aad57598ef739296037d278828dacd0a5792e028baf8fdcee8d2dc2bb88dce7758c012e768825dff1a303312ecd3520710a8f613851981d66b1c23a6649d13247726c259c2da6979721584a56650034e02ed44c66b3ecb057d32278eb9054a7a8d83eae12402856d9e01b67b3e3b7ad1ce7a5b5320c69d7e26b8ad026a1cb77f62dbd88571a1c1f9178dc29cb0c6158fe24c0ec5d20a551595709025f891139799f086c81ab3e547fbdc4c5c499986538b9b17803dd5a0d0e78a52c87c532bbc4c5e9c57dbe0484eed01a02b08be6eab0b28dcd04507e8ae7280b71053d57b1bd1789015465cf1098abee12fa38515c2a532c3aac709ffba1f91ac84a69a3a5229c8f0d78231773fee2854f02018a232da2e7d4762682587ef80a2f33f296416b2e04ee0ea8da02a5da76e7f3b7e4cd8036ad223563c2627d23bd0665fddee12aa8f8622e6938112d02d27379fc30849e726500a9efc48e96ac0f83096ae7c66ed49bc3b218a54a3ecb32d8656a4f768c8a698d97e57357d6496ef0831d624f20832e6f2de2f459dfc775cec33d9237164f2aeb30a533540440df79694888ff1e690a466a1884fdb12257458bf84af4814e506706e3892514e6cfb252ab3e1f474b0a7b31238fbe567189b6cb8c0504b81bdd47edea56b1fa998516123ba3ba89e276e7d90419afe8e3f52df0a4d4b5fd1e70ded3ef0dcc746680d1078f8c43066676e93dc014c3586357cfc58ab3920ac258223f84ee3aca08b917b09d07d5530916d33b544055450c67b8ad5762df39531c16f4110e01b8c945facfe958062bee7189866aaa8a4cc1a5e50edc01a6ed2f07a6a71066316c883a1f96c6a54ccc2cfc8d21b1e4a5a87cc1c6bdb3adba06fcf2b24c79de87a372f204d270b00b5ab427b5e5d3e76c6f038c395b10d6c334995b95f37d4f9dbde51bf75cb8b4c2458c67fc5b454d97de14d51246410ae66d4af9ed30cbe986d176104bd09c8ae2d27b51b7a129800ff53022e07d63e8c378e830322582eef5b1aa79bd791cb1bb5c4e78225bf9a7eaf34777f6d571b52e9d54cd42ad6dec1b1da03614409082f0146357a3f4ea180a71bf50edf86ad5ce4c36c92692aa50b6233ef74399e6ddc1cae3c3ae48a73da8f74f9189af760364945714248717bcfdf95144f012dbfff9ce3514399eab7e2ec60503769b56ace45a5de5642f41ed1232684ea9090d9473b4dcfb823abc9e5b826fdcaa63522161b85fc7a7d760601b44b03aa66727a5a30d03a4a074bb421014a09cb43e3794079fd9ede5c20955a5e46dfbee4f5ed93b1fae472a025ab878f877ba2a546c7882a8412a2129f9d0a10b87acdb00ee90b03a0e186cb4a52f66d5f348d2396506c235b922da594322599028a074707bb078f89b2cdbb63c0fbac9fe8babb5f7fb66658ff769e1bcf955bc4799cd09291d125c09d50d47e6883e28b703bbe4a34c03986c0ee14fe22eee2df3373923b828107483e921ba0f7ac0b5fc87d4afa051fc6059023696f60bba7848b0b9f88dfba4e111093f1a4082845248931320292ff8c2010334479818717001dc1c003f41ec90dd0110c0d341f490280decb0d49028088aea4f09e080813d1951fa22b29c87f1cd173ec3a90715002184ca9411555b48002888160d10d5f5ea0830e5d9c562006102c853732027aafa47b4458c2393a58910dea46c87d80c96c716127e77744eee43e20a4088b991bb90fb013ce754417fef30d3a41c395dc141abf2372bbf71e5f48d1932b3f808023a51bbf835ce7c2f50fb0134b6efc4e0417cac801a1c265843048c01ea8dc9ccbb11e92dc2944fc448a9e00654635b0c062440646f0df14a30f64e88109d290109084f06234b40293b9538c46088384510b08385272c1889d5802c4df89e0c667e658942e77e8dd292f3019a08c39227e221fd061072a8a9c313202a29cd1919111107f477423d771a7223042982e6922a0d2020b1fd018499306884d605d6fe982ea30fe9b34c6f7a79b8d51c2edf50d7187db92118aa9ecde82bdbf5cbe7f269f4af93edfdd6d700e99c36d350e0e84223f4e79619ba9fcec829173bc5b42bf6294135c9877d47e61df7d501fffe53ef5e3e7740f7c1c9ce39987dad6a13ab475e8c78f367818c386f4cbb1284b264b95f6fe97633c88b939fda2f47126cee48438160587cbb12837dc56bf28bc19330ff375222adb261b9f211da1b295e29d9fffd597e221519041f2216ff23dd500f92dfff177a8ba054d1ef3f96703e633bd2e1cbd50c4e80e413d0b4557a80bc10ece48735960262a4c4c70ebb350742bffc8b81ea82ba58c314208ddbdbbdfbb31c5e3f1405dd44471fc31c5037599793ad486f3e3a70b5c107d21a2dbb90fdac97ffd92a34abb1c8ba2e4c28ffdb106f061385e25c46f91f169a0a8e3c6f8ef8b54e6c7fc345059b2fe09fcd9b3e5e3a013878ef941ba87633c28ddf9152802c79dcf29de66d3b3a275c59dfef35993cd785265cb057cb590bc5c7fcd3df0f8cb6d1f956938b14fee5340bfb3751354d59eb135ea777757fdc8819ac522e2f66b0f28d21286062d37b8c10b323100318b0adbbd6c6c872db77fc787b8fcb8d80e56ae92cab60bdb2f80ca160bdbafd55c8e21952006e50c2721850c2e5c9ab2609102c4a9ca9fdaf19e61fb80fda22c55b05ffcadeee99e5967967d3635cbaab35fdabf540fcf72a1f6a89f43defcbcc66ef4957399eba43353962a0853aeff7e093de92e47bdd8c43a592a6c47e318ddb24e2d54b64e7c61c26a14dea86c99da87317c20f3c4142d53a880b1a8980f4b311f9874136058f8efbd4a1292d3adac42e23f7c310148901fb238162c1eab20512d880a4610e86101e2c9bb54e89e16fc13aa8c71e197d03e118805b7e3a615b0172c3bddd3e1f88046467e39e5c31aa57cf092109b3132ba43ab1bdf870c6937ae707b8890026e33cffb21e9ea1e38847f48feb8801008420ab88f0145b739e69d97e2d1f9a778bcf7ce5f8ee0c627220109884c22b4e8c6232ef30ee5bafea0c975feec3e9cc3f9d191e072ff3f9779a7ebe7fe1ffde37d7f0e14a61b37e6d80f31dcb8c56bdf1968d0bc34bcc31f195074c46d23dee1362a725f9644651b03aea995b522bfc131284a31285a623a78b1c1f9f1deff75123ae420e6f20a01f13574aea8dfd3c2df2b7a6f0704dc5d7b5b7c87cf1b1a61a05676ce4688c80de237a0374721a43c381a9453024e88c8ed239be80f46f98ec3a3dfdfb9f841fe505ef9d3af4b65bb84ad364d2714551bcb458808bf0c546e77e8d01dfa6b5b7def5b08b7be7b039ec0f2af5e3e53e4e2c617dabcf6289baf9a66f336a1f95d8a7bdfaa57ed00623923f6ab4cf1107a696ebfd04b73e3737d9baff9fad566abe91aee996e90d003b19cfd234540963b72f32aeee9ff74083f5cb772df2fbf597db675454997724253565c12fbf627f7d7c84b037405beb55b10d7f1c87d01d2c4f5cf9eecfb07711f95b5af3a625b47f88fd8f757c17d546eab514de2ef0f99046f66123afe72df3b973dd9feee1fba3fe4d6797fc4e16bce72add66be7b2e3ca792806e2160997bbedb20796d502726790907f071b6e42fe9de43aeaa91dda6b5f5fe33e4ad4c34d680a8a4b423fa3f4b3fe2394234241d9610827371c110324a03f72c4bacefb23946b118945b1e30edf3773d594c04a8fa73e4fed50a56ad7efeaf7e651cc2ffadec5a9dff747df9baf371ba71e50a482a42262a040892b526401c4ac73f37463719d76e9df6c1dbca8ff71a2bbe2589b10ede2d8bc8ab3d6614bd9d786b335d46c945ff5b9fe7b48ffbdea7bca07acaf5ed47325ba2f0999456f9e6462f74912ff888cf25d87be2c7fcb7d92d03f329f4e2e09053a22d9752217aff447eed97579e3a7d25cf53d96acf458b2d263c94abff8c2a6ca2e1d337667f46d4d297df5eb31c570fd1f5327b90f07dcdbcbf5273e6a71fddba9b8feaf7b32b8fe9064476c7f2744bbb45f6e996212180c53d098e007295a18f962028f4265844d3459bafe3b59cde558132665fa5d5d00f77e47a13fc85fafeee72a62df8fe059da77524a4e8846bf6d18f5e80bf09e79fb611e1d47f6e5a201f0a721d41eb0c492ebba1c5382caad3672c2a0d8452efee35caac2e025ba78b1405421b0ce566eced4a7b22ccbb823daa73a2037725aad5c92ec8fa05059f6a80c95a1b2f8831248b1332a2c2a34aa2455920a8d0a8d0a8b2a29a68492950cd50319acbfeb8aed4a78edb40ef80d889fd2ba1cdbea97bf175e1aa3b729aa4f6dbed51e7f2d6c80e5341abfc6999ce9a98c8f61a4a48994a42d5e9ac47cd13d1d8f54dbd195947be91eface5ded612cc6b118939b7a2df5c397b88ec5b9977ef94c5930b673a5ec616ac7901e3cbfc7bbf46db6be33b5a386631ea1d3fe3d09aef65e3ec5f952f76247b71fe5c3de27f4509b7b49554ee8ddf8a8cdbdf0e317630d25c1a51ce7ded42f8faa26ac52f72c758f97b8846e5165e119bcd139aa7cb0f1fdc23ba5e45ae80bdf8968b57680c1ba7d07a8da41870e2a208c9123a203e80a7401665bffaed70e95f4b97f3d4b69a094d21a9c7129d74d8ebef724e5e27f7bcd8942cd4963a09452fa96e9d26f557129d70981bde45a2cfbaf772181040aaaca49163bc2ca555d8e7151ba9c4ac1fc3739cbead7abd9123b8209c909815d150a544e624854b9a8cb312490926a97a4abb4a47a623986c4925817252431a52fd9738d3e22120a94b96f53b2b83d6486b0077a5f4f93a60fc03132a4f499636448695cc22e26c625a96138c060aa26ad160ca6baa1b94879efbdf7ded3b830e122c3b536b01c2be2728c4b92db51fe8e713172cb70627180bf5b70fb6d6bb99de6a45a271b2fc78ad0c2354c0284f045b85d0c4a51ece0775903788b1b79a31f37b8452c66802867c44e2ce9b22bc2ad8f53146027960089703b0aa79d2af46e03d1a47dfcfe0e7a9ff590c73c429c467b14aa722068dda1966b5bb669d9d71ab58c99a728fb015f7b4ef9c85eab9f6dda7bea07fdf7afb9c73c2f4d0bf40a391aa3a1275f97a9dc3e36df51547dd7eb155dd4967aba15dd5aabb6e1d0cf3ef5d5a6c8edb4e6af81e14855f955d65af4b26c1322ba427e2b100dc2f9313ffeacffd3b366fe9835937ecd501c0ffad9674c177ed0bb71d332140ac505c5efe0b3508442904401fee43af91a97f1cd344e6e369b370ccc243ca0239b87819904f90fe8c7b54d88e8427f9b8d81a0d0f623e382520f3f55834dbdcbd4570ea73efc148753b91ff4e5d347fd0ca274fea093665c27b74e7b9c4c6e3819c7237ea51284fa2a5fdbb4c8a37eadef9f71ef28a05e8bfceebba8d6a85041e25344d1fc6e5f855a6f2c55f045b8bef99d7332734236efe9ceed8895221930b9833bb7a39f1b9f71e77c90e3e4860fd6c8f8effd8fd7b8ddba4375c4f2ff34bfc318a7eac8f247faaae10d7639db2f11ae73a9aa186c0b71391644d36da4cb312b59eeeb720c08323e868c98b95dd1960e04352c71f99f2a06eb445c8eb10087fb942ec7b084b903b81cc362e4a57aa09a10738554b8fc3d506674b842446a6e3734068b1694db0d518152c7dc6e28863104b06288dbb140c510978d8c2e739acb7c8d20b93189eb4534b97f638c8832ee0bbd2d7e7d0fb92ea64509fe38dc707ec4246effdb82de772dd0f04fa1f03f8a5aa0b174fd3b2671fb4707b5bfa778bc8f911baab708a53bd4d7b9aebf85f7d7b7bf43f5f217c5d7613cff6ac3b56ff49b3afdde1eedaf4fff7d8f89faba75a80fcabed66f4dd3fea7bbce9a6f1c1fa84b39219b9a28b37eec31930c9f8435fd3f2e9f3e3ce33ecdb691156cde880d5111900ddd86c0aed0bb2d0c75ed1dbc6b7463322e0c6a4654a0214d9a3469806cbe522a6b845e1a9be707bd26b5f153aa474dfc8e3e3faccfa91eef2b7db466abd9188c5b5babd9f806b7ba56b3f118b746ad66d3be37bf36db1133b1306f0b7d373064a65447acf69c521d598d9faef695a3bf07fbbd19801aed37d8ada8adb5d4bb5fd46ba97747fd90ecfaa25edb86f80fc91f17b82d04028a5327a0fea7df734b8ebb906b1179455aa3a8a452a9544afbfaa9542a957a76a5ced45a6bfd1bd64cadb5d667572523cbb22cfb1bd64c966559f6eccac09873ce293ffe9c737ac1dddddc1d9927c277ceb1a39f728e1e7c5d959999d9c67d631e1b8d796cfe86b581adf9d46b5fdfdac0a2e65b1b58f93636af718ef7369fe21c7c6dfe6d2e1b2ec8ba8d0ff952ceef7ff47d3e7d76673a5b7857d2a7dcdfc905d18f93739f52bebbbbbb10d1f7b735c3f6db6c38fe1b8e7f6f73f6744a57f0a1c275e79877e8ff34a51fe44ffd870c6957480177485e7f5fa155b894ee38f77cdbdecf8756bef982da15f2e0a514ea23f2664a749f9017c18e684ea199264d9a33f7f97d5cf7baad726a07fd16ec15028d8adcae5f689e2992e6b64083e0fb4bad9beb17a2472f14b9435a989785a2fbe4dc3a7ef9cc0df5457142efcc85cfe1f878a91ddd7bf9beb5d017f24ebf94cf80a223eee31d06fca3bd75d0bb7be367a148c8a5905f1804af3f17c4df1cd328fdca009a6abfb05dc3b11eb4dc0ede7e0c7ca1e5a0c2ee91dafb77455f1fb5758f07eabd3e66f7cdf95d6d7be681411ff4f9e9b772fac59fd9bc5b39b583a5cafed6825b87828ec3c36ff619f7ccc3282e887e9612a2577ec62dbb03ebdf6f0b199d1fe594304619611777973fe79c51a5e305a14fd83d90a77c1865740823f4214c78ef41789b5542fa65fbd5fdb03ff2505f08add6f585ffb8e7fc9e7b6c87ceacea1e0ba0a0024593d6d3165904a5a4aa57bf6cbf607f4f11ed177c2914e467436d37b8bdb77239d67474ede558145f6e654b03cbb1289e5c8e4531c6ed5ab1289ea815f57d4349515a8d851266f554465603f305982cee7b4bdf7bed3594440d4208a3b4c103d5e69c9366355a5035140a85aa1a0a4c2a954ad5d8482a549ab5d6aa56ab2c58dacdcdcd0d8b464d1836b41a356ad4b0d1624a7343f3c0030f3cb881a3329293daf15ecee7e47c90aa00d07c7bac189833b1279880a0bd4dcba1f2f74d18594861d4c4448ccd142ff4402d0f5e54414a810cc2b822072898c4cc393d30813f21c5152994e841abc186144ba478d24316af025c8e81a9726b5c8e8161523987bcfc912dab95f3aee71c7ef9675b8b5ffe7463f1cb7fca4d637eb97bdfd7e3735aacc70911bd6ebacfbb7f16606d564ff59e4d64a457847950b748e600e6e987b74a4d84370009b0ec1582089c63b2b531c1841baad54fad262cc084d58d79e34623f11ed550df1a1f36a156a2ab7a1c38fad5366034be7b7dcbbfa3adef347fc83972de3f720e9c1b3aae3fac8377f5d5371c52ace3c8d9de11f3f4e36cefc8f6607823f47bd0dfda1e101b5cf7aac1d1e0589cdce2e6c6889318f65140113c30096106962e4400f5bf32ec83002331a2b07225055ac200f5ff2ca07b1ed2ea7f7cb5a53e6eaa6da86fa5aea38a62f976cd3362626202c232b29e82c64c2a32b6bdf48be931bdf7b624e9228b145c18a560067c06cb16288c809881490b8781022b44d040850c1839b0172b4f189d01028cd111af1fb74612b9724378c02b4474ebfb80b7725390bc51100e48d323f398de7befb1d24ff744186e900327665470a60b194527b0210645bc3062424a4a810632bed081872ca29891001ac28841c5891562740142ead77b4b966d18758f898190dceee1707bdeca3fed1ff8d3edf108fe7373e6719e9883038deba9eb461f709c42bf9e17ee29f5abff068d4da13b1890a7db4830e8ec53b4040c1a82f8618905606c01d4ff90b08f560323726003273a90220650ff5bc23e45398c99411725535e80a609a0fed7847d34a0431429965802c413470021f5129cc6c90172ebc06f2875e2fb0f16b69cb03101517bdd612abb2ae7e8cb1a7bf4b87920276ddd0d52c83a10049e0be12b7620dcf81a100ec531bd6e04e21146c87534fe7641177e85fcbaa63916f3bcb73ce5ebb12eb41a85b73921a20b617c20fd8aef66a4092a77fde109219e18823b009b0283b5a8b45a2160095302343bc8420c2b9cc9dba119101e1e110426b1807d3a4beb442328007c5cae8d88ebab0a8d756d57ba933aebeeac3b897bf99dd44ded0493601698c4a3e8beec5fd683857d2c8c5d1a0637beb9715bdb2d377ed38dbf71ddebcbfd1b97b49a449fa85f10c975e2bfec6bd2d436ced159a6526ddf7940a69bba76bab19f6e5432533bb89fa91df3b3adb76dd3d249aa278b2a63834b98d0e0686c389c0b5c0697c16570195c0697019f7cd943fd7bbfd349ef81f07073d508a1460dd6795fe3b7cdf935c27b0ac27d1f828dfbdeb5c1f736fa8f07cb977e26297dc87af8b566d192929260cffba0bba9957a89cb9225c124cab920e45836beb7740f545a6ab9d10c4a51412488a46ab2f573fe03980493ba27001f43f8f8f0838f0f21ccf90e4218000821bc594108e1cd0a5208e1e37cd749ac8710d2c89c4cf7701fdfcbb88feb5b0fbb876e0108e16645034a814810a9b5dcacb8f8aecdcfb44eec2ffdf2d24b9d0529fed6480000c0cb5427a982b0ef41f8ae936e7cd7499dd44dedd43d207cfc7e0aa2b23637ff1bd196e43e415c27be13079340e05cc8f9ae933ef88ecbe81668e9a4ced25a6a7e1c001bdf0fb69c8db54d71fd8d8dfbb50d79746eddb7b6ae3564de8e9d86de657127f42bfecd86b3e26e7571d00c08fd3a8a39b1a4aa4245452c0663c4624026c644193126c8a8d034d174b9892f973fa77b9c89180ccca050b9eb2be34fde04cdbc0917c3c494b3f35733d8a7fb5e997ea982b0d396f1320e39fa9e99fef7c52bf3cabc2f9e196824bd54559818134db41feab32ccbb2eeb49b24b9a5c3e10e2abbbaa774fb7df3c7548a436fafe15f0148bf20131a2cfd0abcf7eeefce3388730f8129f4ab8100494185157a95c4a66652f7d02c5bbae75d46a910c475fae1fbcc858baa99f6ae734417c5a9d0af06a2ca62bbb7a4e325ee0373afb0254bde8da91d38fc9fc3ee8efa3935d8f7d9e380d1cbba2a26db51f97c21eb4a58099761b0a46281e5e75bbb2e51d9d53cf9467fbf3c65c2bb3da77623c7067b53999c3b10beef87f2082a9c9adc6ad3c1db09d1aef69e9444aedf17e1bf0dc91be1bdc38730c8e2a5894325fd7ab05fb3d73c0797a8be74e5a60184af32633b9b0b1f4277b7e11cfe33cea91ac3767fe7fcdfe99ef9ba33fe9cf3638c314ad819af8c08c1c408990c6b592d77f77785189605638c483c293bb5436503dbb5ae6c754f47735cdd23e56bf279cbb161cef7e6935350091feaa50c9a3f391c1fb3b94829a594524a699665b0236acc89af9281edfe5d0c736cb0ddfd64e005c91dc0130ebedc9dcbb125902e0fd7c10c2c0815720d220086750b5476c18e66d8cede18bf655991045575e60601a83df8720fd517f63d935059d7fdd977d0d1095476714a95031bcd75fdef9d8b5347a76e7777f7e6ee6e0ee2b1333fa646e69c73ce3979b253c74ef479eb74dca6bc62c2a2be632fb4e976d0041e1086caae0ea6fddce6967ad6138bfa4ca3a9ede53a3d67cdb953fb7e8dd32ea5b03662d584955b0fc975bc828118fe71ca293d321508ec6d4260f703b0cb5cd07c3a37fa75eb5cb77ec7ba35e7d66f758fea6bad5f9feae6595bf797f53fceda54ff8488ee4ac8efea39b563c5e9e85709db3685460da76dae7e3573f70cbbcccdfff16afbc57cd35007ef75bb4318e30e6dae92b0cc75acfb564858e6e42a06963fd67434d59a57888a19478eb9a6b473e1f24391017bada6984f7a106fe70edd2191c3875b4ebf5ce6cc0ab894e453e1bbb498877f05ebc41074879452bad12a8646a54fe8d76331f711ad30f4ba270881ddeea6b7e4df0dd909078b6131b7b9a0c7799605ac96ec7b66bab4a3847d9ff3f005574bd8f72e84972ee45660ecfbd514f0692f552d073671ecd0de6c5036df42443e16a0f4f2c1d1296d633db1aaf76fd5aa7aac27d6c28030cffb6853ed50642c1d97ff877304619ef7fcc2b1d3da47d4a3b8276c672db7001b13baa7510ff3d48efa4d3921aea69a97cab8aab19ed854c6d1e93eacd6f1b96ab2ddebfa6ba77bb4771ddd433f7bd4672dadbe6b9c101d175551dc7b2f7df86cc74bab7d4c709dc8e26227d10b2c0b8bed5e93d7a471faf94ef16f6dac2736be09415651d88ec5c4cf008be99e467d77425ef79dd03d53e33a6eda31b921f8b2304f4435613db1dd6bd26405855d6128768f94eee98434e91ef89074e0f889f409e1a5fbeedce065758edd894a73c9ff300feb803042187154c075e1af62ae1b637cb972565fecfbf88fa58c52c6a90407bd3dbeecf862b73fc9f055115d4af6c8ccdf9292fb15592e257bf9fe6f4a0aa52c61674e39a784afafab29e47c73328fece07d4eb5cbcf3df8e29853ce296d0588987784b82e7309acc7753a7660cf4f888ecbadf61936562b52bad98ffcbe84cb382e7752722ca480071b32f3348e4b5f6ce278ce3923437e679614760afb1eaea4b0ef5f17553e861d3b4618237ce66115565dec8b1d5bca28655c85b10f6ea9ecbab1e2623b5813217a40f189aef813996580e0bfa7fc54efe9fd6957ceabff6d5abf2acac4c85c8971e114e3824a19295e3459bd4029e6059258174cb12e90625c9411eb22c969d062062d6a208343eb995acb6ae5b8fb844cbcc08119d3b6fc7574c69091a141153a65849cc5c828a9ad31ee6a4c96bfdd0fa3a4b4774ad0e1629df7d49ba32f4869e43807b20e34e2995acb6ae5cc396592314d55886859d6164fdccebe94d510373f14dde0f46402272a90e1cc5317639a8c0182aa54506484114963aa487af201072eb4f8428b33aaa86ec0d142092dc25499363850325a206921446c0b2b97c6e5d81638c086ab2bd6ddbd8b96154a5b2d206afa8417c224e184c30c52b6900018679cd144122ec04109286360b6f5ef7aedbc76fea519e9d2c475aea39c10d87577779fa2c4b44515314c6262a0cc16cbba5e3b36b6b821db020568ae8dcbb1315e28b567614411131fc2c82283334986c8a2c5ed2c11628eb270b222225b0de1ee938526468e780063c50559b89855951511730c178f95c0c10633a05481060c14cf2236a68bd8982b8a54ee9ecee1757777f7d7d3cd0780ddeffa0fe61c0a701e7ef8010673ffe1060d288d9f8269ce39a7fd2b9498a64d9a73ce59c383ca4876c50c5740b1a9014a0aea8a234a69a538b8a248ea68f5f4748339e79c329440881c928cb132440eb660e1943d81a91186e660b583ad024409ae60e2454c105796fc8aa71b9e7aa094521a9520a9c1911c921879b2e4e5e9e9e829899c569461059a550aa2d070921ae2512bca54b183150fd275bbc909715d8a859524403e10e8cdd9512caabc60556099aea2d8168d6151c3d52ec7b038725b4f286db55c2b1d2074b960ab1c6030368388a72d846042081e746045f70456513a0b63059a277600a2092e69aa70e2040673274e9c3c485737549144c5d20a055388eb528e5738587b3956050d2837277771a7115cdd10abe2cb959763552871bb8731bd950d304819ab42695503102e2610ba5cadd5095a2d97cb5d76b7775c2d51a2448994981392550c2a215631a856b092a10458e35b90ee93dbd10ba917b775eefbf79c985ac13eb075fa7b0bfad4af76ea573f314eb75915847d3cfec21aa32f2b252b25427e790671f3156af066eb9e20edebd601791ae5565f81dc9b340fc8cda40cf4f9c29509e00b3b6aa8dcab2357906261965c8e4d212536850daa2b5647de7bef69f057472c3217c7851f61cff05c7b3b544fd876f62d10f213f6fb5be060b8c0ca0d2f78018b247a007232a272738b9b47e5767715e0a434f244193d096bed9c54b395fe964bdfcba532db38964392173b1fc27e41db2f9863ad34c3aa80f4cb66199def071a8f323a84d199acd06ab5b846f5d32f1b9fd2183b4ed930c20683fa87cab24cebec49335035d4dddefcb4c0996533b3519dd02feb107aca474a4e19cf70774a5922a852e8d7e50c85ca340a1f84ee31cc1863cc2095199c524e49bbbe682207236c772859e0eed3a50c7243caeeb8598f323a8411ba749293811e9c653426a34ba8aa40bf2a0ae6d860a194d9cf39e77c140a6667607f741507fa559fb6583246eb1f1dfa908fe2206dfabc36840e23bc92094238a16a01fdf21823e578a8ef7cf39f261f8452c6ad280b9e1fa8140e16553d0a15110900004110004315002020140a87440291482c188a829c7d14800d83943e6e50174843510ec3300882188841d010038061801042c8d4d4500d0080195ed4afe4da4a03f092092bf769ae1ff50afdd46eef9e7d4c2b31335082c819550e9161f34460f310519efc4f1fd5515bce842cc9d2637c910ad10d06528b9c89ae77ac714a60db14808b50d2d00f7c4c05a698441e92352114363391e71f175f06e8aced441c58c90ad231fcb30248e17c6dca3ba70b64c325a5845a4711260859a33477e1b57ae04bb04b8c0eae36bf8082fb0f266d17c26832c079034546cf5b872ee796c61dd5be801ebfc626da9b2a895d6ca822ea63c02a6d7d8e74622978d604be5fda5b615ad46d707de6c4cfa19d574cfd69508f3f09fa04e0d5cf19b94ae39eb710ae82190190af2aaf34f8941cfae73db8b82698fda9e8133c79f6b9dcae8bdaa0c5b6e93c19ddb9b44cfefedd42afb6c9006e550701aea56770687ac22df1cac7f0cd1b21d85bcfce0791245ff9788ca70e12881a8f226e3c7db9accc3aac4a8d8db7a3c4df0b3d564c0e207142f543eccbe2534c4fbb9d2d4c40301f29572ace32347998a1c4afba1612e07d83b37a3188a770cab200acb261059f0e8c6731f3803d1356c2d2d51e88798d23d4755c1a905b7621b8dba7e3b0ee34346fb8770c4c74377cf9171c1529ef5fa2631b31b3a1a2ad9ca336239f585a555427b4efbd760fb7c33c6c7959b436e212093ca351ff176be7352b9b7230df77346950a5fa794d744b4160841447f2b704def344e9e2557d786bbd16122d870482c8c3ccfbe3392b9879bc8146489d1d7aec675966cef82549516976b5d9fa395122af503ede906027e1052b67e0244bf8c5c879431eee3fc911d1071821cb13376228b4975e7cdf5d6f3ded32536b07ea1e11e416609ffda5f2ce11a9e7db32a7aa1a583cc3e8bd15cc51ea3a426866150d4ec3e19304d4b83e11a6546ed238de960a4aca2b40f3e2997d319f2f72c462a476c75a3567cee328d1c050368992dae15ad6262b7e83dde5d3f84b8d471bf30a96b240e4f4e50592ac8838940ddf30371d99014730fa2003560a65809682ccf05220332ca5f818499471b6af9fab97e950f6ec923ce11ec4ae98d3fbd2be5e40a931682cd133ef5459e113b6b3489c5fc1272c66c1351a374ec6ece96f5e2c2cce4ed4e776836b552c88a73cc72a3f9494d88be1a72008a94c901a7281869f231ee054ec619021674cdbe8287e3609491a19fb38c3227b9b983447f652be1c532c7280ace4a40c17c6826f55503a6426614bd4975403ea50b041164ccc823968c0311f307f5301683b520f24da64dabe2c3bf6df3ce91a07dd62423e80ad0d195cd2ee19ed0e2813c6f7c6020fe240cd08fe217a231d22827d234f4aefc1581a17d69cf56650a8490843453cb2e26698e6104820a1be2c9c2acbe1b21fee3b161e89e18e2614bdf393280650f5084f9ea0df88efdd45e0e0870b6e1a6f510bdce9d776724acb0d57d64281a22d61bde369b48bdd337315056e79c225c20ab80aa04007fc222d156316dce86c80b4267f60e92a0f12c3208dd017c3ec282bd81e73b940ef30b3eb6320fd8eb8bf5df70e59dcf2c207054aa1329e2422b4de2bb46cf991fba006cdf223aba1403f27f751de81011bd9ee33d62ee04bf8450c0d6729b7433a99606ffe53af02a477a74fade1169ce17501a3305fca1afeaf2d024cfafb821433ac8c27d920199ce0b25081521a173b02716ef05411006111d3c8d9a9846069b538e0ce67c16bcff75ce7e239fedecc21361c023498e75760c209d850ac3c7df9895d3c957b523c6c99419307a6d9d59aeece7777b4d6c9551bd72632bda81176b1cb0a320bd05c5ac48ca46d7a5097726cdba065f00f66bb986dee8d2d0a1164005eba04a09d10e7555b2a29b40f51d6e3436e55f5e78cb870618e5b5a688e77915d41c8d344f769fb764044d0a20f03647b1713fe5015ea44d67ead31de76d47e8ffb5e31163839a7931b062db3e8bb55b365bcd373738f5ed855d4686c386e29dc495df44de33569ead0f92644941b6ffd7a662dd7f2648fd66a73cadf2ea138e75574ce2478af3d8ebf7ae3be8b345f3fb2b59aa2cfd1be98f4ea54994184f06773e9ca554efcad878993a14375a97c304ceed15ae3c785ed6242041bdbf1f285973930941ea976fe6665f296aac2de81b092a37125fb8d7f74cc18e3bcce50663376367d12d601969c3b858d8911319731ad174b9fe9eeb0058dd885eda3cf966408f60e7800c046450b9b5f4b9e6f30bc4e95565281adddf4423d6bedab2d929fedb0f0a239c21c416d8bb9e9fd5ce20e5ff4e839c7afec53d7761963d29ec4bcaa29f163811f288fabf0d6b5f04fe4ec45938a77e2e024e367485464a3fd6ff986f41c913b666e32fc0ee087faf8fa8ffa9aac648bf9229088f5b7e4c3815f26de9621947f887d65e5de0b5a5f30e037e0ceb261aacfffa95f055b9a0953e2a13267373b55d6403093a69139b55e241db8c7caf69283d9e5c6b4bae920af3587e467b7431407c7001af2b63b7bae838938cb455ae6f877dfe3e508f7b8468fa1410d11ad9b5a08255501d9aa483d77754ac2d829ce2d4e889df5d749d02aae65eee9cbbb96385523a9d85c74ef30d3a3c1a6e75d26845797a32b39281a6e65ed0cb4006e14383da0e8929b0e2da76423061468b0c45a38cfc21707754a632ae082204ef61f4da1a1c800c4cd4fab255b549423cb4ce2e7dc1b05e3f08da45aaf85eddd6cf64c7acc4cec0de33ba3a3d703d6625f2a99bba402eeedb03dffbb70c89e2261eda72aaa49fd58637f457b897284ad35b9249ddd955966422e8bd6d42e9f39c2e543c3a1644e5df0223bf14673474c9a424c6f440fd32ad19452a3b40dd5576a57873e639b6e37573184f5487fb32a1f417155b6d4b07325524cea164757b08e4370ac8de18a90da921105b9bca3e5543ae0f8f17668553a0f6778739a3790df73aa6ece29984ba17757306a9f64a090b300253c15850ac2ba8513176a2af404609be34d1acc7ecd1e3a76c23d0d50e55935c3363eeb73469375acb61e027881af13b91e57163578bf8a92fe5cd6418f8c9aa5a0983c376b6ed17cf947423068cd596a24b2de56948d3ab3694c5c92c3f680e73f882358888c93ef10c2fa14e2e295c1ac89130494a3322a34cef010c808d1f8d387f9d50039260bed10fc0b9d8e243424bdb5b18c1e0fce31c82f4c731e35cf6954f4964a12a55a0c48327fa2241dfa03eea9721797f5f0362c16c65cc0b53d149a1e27ef570927e92dc06abe704cafbd610c1d892481b831b8a6391fe76c24120561ec82531a02ec1856515d46f7c51f3f7b4ee84cc67398a6bc35e580216243d8b6908ba993df2632939c782a5964b51e51b9c0c01fc3120e125042232254a62d2c1cd9793361eb2f3fc38cb8061c6232e2119603fa2f62e38305674fbc7b25bb7fd180d4c1e20cb84a349705f976d7abea836a8b7292f75ddaa60785331b216a9ba7e95f9097a1ebbf182d374447634e262986f75c55265642af6417e58c0ca9aa4105fe0ac9f5815a402b0074aa94ac018e88a3234ffd100fff70f99e0e87e32a294f27a5f6c3e1896f198349241aa2178a4dc2dc6f95a3edefb43fed89027c8c46c79b38c93a13cb4a1446f82a68a32eee97132118ff81e7cd13a34e4216aecc6979c1052974499860c7b9df242946660a83a40bf4a6d94b4b318f9c050b5e688340ca5ae2507cbd9ee95599d9c558715516c67c858f1d124fdf8dfa0fd3987bed62f6764f080d27b1488439e7913e7873bc856271cbc6f18ab89fcb905b980031908285875e77ef97043707f110f15c581642583c04d53f2fc870104e6e0f458dc87f8a436f80c294647a9acc1995086d61fe34641d744f6270a9747f51c9f5ad81e4e0a9655102f488a310eb13dc6fe93379459e8b33b9c75f993a658e7f8dc91a429a5a0c38f119efefebb49cbdf8601a57ab385ecfa0e68863979172d19ce8010073202b141825051db3a93dde545f0c8b49aefbf13e410c7c45329883268b8719e3337dbc4f646984454b22985910255ec55a1bc446f0b352c48194d6d57260f84080151ca834ed8e256deb8da97ef721299521766ac6e636a6e2d6a2b13401f34c70df4d2acbf5099e25cd1036d12150f4e5b2b9cc01a9f8a2a7652c126e57b598e3f08c1893574d587b8602dcec4e110c657c50b1530384ac91560e68b5b54cb276795a83737b00a70cf4aa30a2b49eb390eb1e187e44113f6de245383b9a6971f913f89ed909b31973c34aee6115d973848372579e5cce6e6f60685d7ab95bcaeea4aeb25b6d8c64746146b4bc94bfd1e397c6d6afc34cb4d986a0ba0e441f79ba7ddab19d7ab02b0e7f542cc410077c06bedcf4a851ad21763b4b934683bde7db65d78dd00096cb19cc4eb505c0ec8add4142397a55f1987988bfb3217793ccb2b9c0fa72447e87a2ab2ca6dc71ae6f678401873b91926cd66507559daee5f81c7fca9ca31db25444175928844b32554f450ff1fd5382ba6bd97613a7ab8c51fa6dd73310c0e4277bdd054154b3f5986cef1c17916eff97aaf101daa30f498ae98622f327b6d168d15cb6ad0aa558ab2e293717871f07ed0d0632d6d7b40036bdb7a9f5770849e35c73bc0d2f3d6242984ccefdd8fb00705b817b39438f1915f5de8308a1fd72142891f2f24fc02a52917c1353083c8344087b872fe14c4728620a6abc089cb883ecb803e8a62fbaf49ce48226d613c9d91354e17cbd1daa40cf7aa6f9f5e4dd50895f8138bc88a35f311c6ae368abcca48fb339eeaf66e108d0f1aaf523845ee1e9e42435250454acbc7ff73c4d8ada0a5483f4716e99229f9bcaf4d0e9711980aa0ac5ef5deaf433793a31a807f39d24d67ac0c986699a22506c2a8791941be3bbc49be1a5c25546c5396a8f71dcd24e2542e37dde32ac30606009cffede0ecb80d5e066ed34c376c238669697b2c3ad70e31b9b64e9e7db3d9e77c2daaf71488dca408352e16a95c2e001b0cb2e39ef6717a0eee1e931dee92b502a17408f0a1c10a42ead7a680c579869889dea1b6d4cf31586f81f322cf15b1b60e2e14276e5abae4b3f0492bcff1125337402d3d06e4604ead68e4dc365f480cbf595dd2e976ee133d7038df6dffe402335905db9f3b558c8e97b3610427921b091e831295ae947776f334c895b9be4520b898c37903293e569ad7eee3509619709a07d76bcc77c9f7cdf77d1a98a5b5c4fc78d5ae16372c90880b168b0a2254108c984aa919ec48ee308b7a22f0beeefb2d2769495d7c3c71dacc6bdcfeff5d9805be51744ddba4854a23acdb0339fc3ef5698a844aedf2113eb7107c858dabd385f31dcef811ad5eebe230c054917e20b99cf899fcb509c280ddb8c66385c21de9c41457eef83f31eee10c5b36d2589c39beb814c716a339d767499af372880ab5499190333143226f97dfd3fbb33f8be8f2ea21f3f2e2105dbdea14668256092e301893f045ccfb8c81251ad3b418418920a087fb72fb01824d50d469ca8c7a0490f5a6fbee77342dac74585910dcddd17da4741ff44f81db7a329b818dd112b72a8f3116291aae8629890f63988be654ab15881830157a903031ab2172b96ba66c1fe61c6bd8f0025b4f84eb801ff0be3116460decfc343176a61d4d9a572ac1e7a5c4b03b1eb7477e39abf3cd62b1744eccbd9ba817c6d9754ba7d788081251f2b7025b5afc4f53e38d4bd8025aa28e8f0a41aa43c06b8249c487139f503b2971ba499e9ab4e7694c6291189850a52f103e35af58b086840c9eeff494022e2870907a9ab1a8f0f0ef900421f3a459f645a40a6dc574e11e631032b4ce38d06255c6d81a7e1aee92f03fa2b435a59097bc80a1668f24300660f615449675377490f76645a366092136fc0d28fce62f8b03a06821f7b467c5ce0e48d5b19d48cbf12167bbf8d23937a4a4ac94f1d16d2b6188ba9453b5d391fd81a81b461bc78e320cb83795f52c9b2f3e7e786310f46cead5e5d122f2050e06027dabc11345e5ff653e36d92518dc61bbc20b480efadfa7defe9e43ab15a11a6364ff87f46b18aed59a3e7408776ff9fe89c74d028029de855821f14b0996ab5c08f45f903ad778784b1670d155d387a716bc6ebb173d8e9831af576116c7df5c615de3cb4e2a6186f4216cc0c4d19266bf83d31c16eafcec7240b901507351ebfeacd3268dd728758376126d536069dd1851783ca0735dbd70629f86ca7ed5fcf41c2859fd265003407beac89a614bb932bbb8d278c006a29d3330697c70e5d15c692e1d04fb3e20acb8599b4c1c2d26b5ac4b00c672fa53fb1724f7ed0eb3b9033409c4460f4cbca99b53eb97f4a1419eeadd1dd80400c290933e153b2d507b2c41761eee5d4600bb0578d034a41ead726375f017a67a7b97017f861dc24510241eb7ce34bb10c347373c4c60eff59c6431e22b1aeca01c4f603672e452982060e8fcb58293095c8414cd55bb0a7d76ca9319f9688dbb206c83e9f0057518f4dc1e18f3e8affb998fe153cf5128c1d518f8e8b6455b0078dcbdb81b1bc41087465ce892ea447c1a1c30accfabc4e8a4db2d61503d63eeba97854127dde08ac0f8a82d07cbd52f4b0375a5c62f4946320d2ebf0942a875e9b7747b09a6226205672770723ce7e876d0fd5f6a19d86192a73afa13b283e3b8034aca04f64636436d0dfbff4d4f04ec7529fecfdcb6fe731b3bd4832a33690e8c7a4d5a941ec60a587ac5b4213f87e4826f317c4cda49b4be82032ed343b4672ed7896091e108b0651005451d08b8150006261d08a28a8af00f4a2b056f75b4886729db37a75508a412c02bd00904541150649318805a01700bd2088e204e22f0662915bdbfd055ce18a807e611599c4497796c3eeca0dc1af29ec18c9b5f30c1378402c0ca2081005412f02a51888851bc45b009aa2b0b6fb055df38a453b58a3b1e89cfde88af712798bcdd9d7cc14eef211322240304f1e254c2c58a7702b45e3bd5d40ad378c08713a9bc2b554503fb8b8741b5d9076732a70f499e50a57348a4a0ae74a329bc21d4e3c3b4d5708e7768334e7001d9f6ebc9d7453e377ebd57d331135852b34c2d914ce4dd1727c49df0b5585f66e3a85fb884310a3e4e3dbe267c6b7804622fa7ee6f816ddc529436e4de610f2cc2c018900a131b2ebd951645b331ac3131915fe08332b4a16691e01c6915450ba56e6a02babb6703153e8867d912ebc9c5a056e0025e0944cd433e02a42ce1ff3dc4ef0749804982e0285dc819c08432d8170b425b8b159728e955fbe7cb786b21605b50426957912f1affe21ab75d729b622a6f627283a66140f93e3ea3effefc005450ffcde2deec22a8036a668087d9640634ea4838084bc58ffcc02c6230d1bcff231c8b2b0b0fef854bbc179e6fdd0db7cb545889ab276325a5dc8363a5726fdba36817dab7993c17d76b8fd8e43606c4ea7e58ac7fe38a391501eec578d772ca7461c06954157de748d9bd46373c559d562fc1da884c2c109cdc5e38ab343b760d5e43a139430fd27c6adf73ee29045893dec1b93f4f805157abf95542fd436312f786088a257d8b79ee9d7c6db51c42b58abf01911adf3b9f7405587365abeab384b77ea44f3e4c5adb1eaa47039ec29e2b2a098cd2ab0b82f547669799c6578f642ca2586062b4e46bd1f67f4bb707efe5fd9b6789dbc1de4d93f0f32e053ded3e7934b9433cf13df18807b28393171df08fd3eb140232470790a6ff8193e85bcb535a2ba91a1173cd11258102395af697fa2702b8302dce64837ce45e6e7f0b40c2fa0dd2d73788173987ab5929d3f01ea172a37b9548a7ef4cdffc06e31a7f62510e44149e851199e21d7dd6d1cdaa9960f10057a4eddd00748bd4eb133e4cb0cbafc09aaf19607e4e647018618b9fde285388ad00387cefd755bfedb59069da6a02f22566c07146fa5159be7d803c50aac0ed969740278c1e16a641af796b35c20f3696d59aae6456245afc5e5d46de8fc7749007889ed7120fbcc501e877ad1c206c1a31d1ea9dca09201d91f6b150fad6dc0e823b6fcaa8beb58a0cad85be4a11364016354366f06485f4c612871e01129f4be22d69457c3980a425a2f4b4b669b7a45bf34a39dee6d9d373a7a32920e31d01f227eba41b2ef11cab972ecd7e0c80cc3f1a1d44adc5571b426ff10f91b60880451513dc24b9cd4ad59aeba396e95f6ad6424fe4fc95e308f15c8f2db02bb8f48f5da883c86a891a98f8a5f4f6b7662d48e499e7f4c08480d1f54f1b341009a74259dfb3c29063f705411cc491c04ea345d550dffba34fc2957f4d4033a119ca58a83a105555631814972e29cdfd6692b59ecf2c1a02d8869b5b552466f92e5fb79933eb12519be18de5e53c06ff307e7690bc51be4af78c8c196f03e11a4b87752bcdcd9eea4f8b93ad60c97560afae286373d53c247aec6ac66ed618a795498241c05aaf3aef75850b356a15a287586b3f748588ce7f2bdf364e194ef451e8cc8808adc217407acee44a789bb3a3bd02848a05c0154296276903b004e118efdcb4a6c7b9f499a84f70b7d07087f90d3b47cec701d70c0c269d4e99585dace639fe78418c3e16cb891a08b801fa599e31227342a76d9779a2921c835b79d492e8da4c6a06528ecc05c2375fba700317919461b99101815a1df9004b3367c87d9b6055b286d8904098816fbb86184424de9ea6bb2649d30bac5d35e657c7b9c578d7cc0b14456a758595812678aa5e28bfcd1e1c3ef124a7612f4f7d577cc3060e63ff229ac4d16da7515f6aa0a261308fc605030f919e1f205c68ab232b8020ec3cc68a3b03abf22c71fc8d458d748e0404e356e97c64d0ccac43b4361e3234778fc88c75704ad7fe449cb2ccfe41ebfeb7cb4a7737dcaef76510028696001c5541d5a70bbc77eff502e79216b96416379e868cc611575218da9ccde44b4a04a8a0693e4d86f4a5906aa4b05e015a75c56147fed8859ea988053894a48d5b142b68b30ed164cc06c0d6f4471529a562e5477895349259517d8910e197560cf2498ca22ede31726017c6f1fdda9446f5b06fd7d2e4f9703e2590b39415f1c19ecac7eb1c2af8e8cdf29a9268c1122ff548ff0b0ce29d98963c14e208764012a2362bacfe581f28f9499abf31f741823ec6cc8715142d618f92402cbb1a0fad8de7016b5177dc22f7bfd437a4513d2d41d3a0c35e64a2016730c8c7eb8619f9d95701f98a6567395af1584071b1095210012d851b7def47beec77186343f07e706f4c812fecc31583a3ad2b54cd8371a7108cccb5e7c7c99088685770851835a8090a0cd55c1dc9b909b390d2e81870a1d9ef1bcf3c29f41a3f7aea7975cd17305335c50324bf6daac80021d98c95243658548b0cb112842123e6c23c8df29129c9d8457dc2a9192c5e31c06a41005e1deecd23ba2b2cf70bd99b60665c456de1640f5081410fb912b541203bc5c3afa360a1d3d0757909d2d45f505446a048a05ff9909b3ba4dcca33dc0527531a035afbbb29a0a464d7ac89d6848129e8932cb61665a240763b0da762d509084bb703775e0f3f33b03fe1ab9e3379173aa47c0cb4ee98a8b8ffc722fe42c7924f290c7a4839d77b162fee55f014c5ea85699db60500a3a2e5778789214dbed286dff9a77d765c24760e4efe1199c8ec48855e690b5bb67c465f17dcad3cd6a6d17f5c8456f563a41325c1ed5871215b7a4215b258ae22d4ac0bc0275235d85d48e343250cd3b65ffc00aca651e64d43d17f8c03b7349c6db4b9ada7c932da2316ae30020d85b2f1a0a5fcd9bed3bb37ec454ab173b7ef993abc9167d6a58834d8a7d14e3f6ed92a5569b23ba70a5782d72a115c2cbe34f9dcacd513512bff54148f5edc5d220b27a21f89b4693aec375acceabd375b64ed579aabb1dc16d22045241d00e6978e1646d9117405d3eac91b18bb1a651c710ff66652d30c2f5df13c5739bee3cea074e84e579a61288b41992b99bae38b9d1aaf4bcc5c566aaeeb714d58db9a8df94c2eda65ea5f12cb6dd530cbaf5dc6e8aaa1b7ff1b269a5db6d8d4ae75d4c9baee0bc57a8ee198be326158e6f88aaecc06c2727f3a66b720510b99d61b2602bee028fd996c6daa61fcb14328e2bad1379e4c68688b52745ba7ea3f5918e6dd054e7c159b04b84093b912c6f6c1d7ce38032a79b815e054ac0fc106dc59db088e0e55096711a3a48bb78eb9e95e5387870cf2ee07a0bd8fe4dae95081388c942a97dcc60315d7283d282fbaf5024de8e188a590fbe4b4a312d9bc5e16dfd8a706fcd96260069ce79faab46611c08bf82c9cd88eca52b23ba5614797c03f8abdf78c9910508c88183cb393d593308e176a1671075e8759d71e83b746e02e37235d083114a207e5a39a4b853f25bca3caa69946535751c05a338c249195d91a5f93a6ff2dc972a6519f863bd655bdd19f3a31645f80e5b088d68358a9e15633a7c2501a2366c2735232dae0d9e1633d0b6b14f22d8d2ec938c2bea6620129dbb8405c86ee900e75097640061260a72bee6c16bc85afec11959b988ab91f92e4dfeb56b4341aac03d952e38c93f9903e896f9ae0fd454679afb358c3bfa7fd9b654511c633873fdfe9393e6144709d87870afeccad4324ae64c10c77ccb3c42c42b1954532cbc1377cd0947b270b31ce14c4930aff95e7897e9a89e94a38a457f7780ffe4093b5d4c64cfc6ae7eacc1ba52cf3fe2b84e41186bc3939a33833e74e61409614c98a6a16f1df91e5eec5e1f73cffe45d3dd70058ef8705a20802dc6a7bd02631845c1059f5ce80531c8f1ba76394e4738274c9017285eff7b87a7b5e16c284ae9fd33586d9cf1462aa20a14eb077001df92aeb799c9902dda7e4b53ac128b33bcb88137f28643c124bf27e79ed890212a7339a49eff7366fd2e52373d51540f8abe1fe80e09f19f00c94a5edc5b21a448bc3e8280e9f4fa4817b6d07a6db8bbdc65daf82808b101e0aea8c7f340a59dcf8057cb7542997d3b458e8da113d96a34c3d469e5500418507df23ece9a6a2103e2769b31f7401ee94efc7eb9f91f3314722da423b41809d1691ddb4861cf1dd1c2be3bb2a5dfa79666c09060678367bdc20651f0689843ea2395ef4607dc948584a06182b34d1279e3f6d640e174d0885c0a04de1c30786e021890b94bc04eaced3002b0b8c15a039d3203a6e4feefbbe15624244450040d578a9d65595694d00fd559d15484f24aaeb7c886b576dd0fe98615f50aeb4f82f8392912e25f819f9c5a76390da20f6955db9bb1f4622c054eda3403a4144dde1e656bd62a65299e0bc56c82c7a0c131243a6a7a49ba93c0ea8bbada3c4bc252e309d14f9706124a4b2e4b054efea5e29e93524c8592b00dc1efbb324afd4d94fa9551ea32766e98a7548b3c5686288edb920f8356b4fe9df7c8ecd7aa42f96b8531aa8bc4d3092c0fb5ce7ea105a40521e7f82ebbb1676ea5d7d6ad909a403afbb03a6f00677e37e8fe7d4ea74c6bcbf16e10498bd3704a7ecb8f0be3fabdb428a60ae2e6ad8f7b42b8a108550bf7e8e47cc8d91c228160e2fdbfc9ff7762bd91a46aa618beca505b2decf124c912a0d64ee8a7362709977ed09b525a9ce54b1be7cf370d6f8bdc120a03853a6e9096faca98b26a371f4c26ec97d4cb200beb68a04f870e72c5a13522f91092d97b3160c9ae7f7aaedea06b54c97935da97e85aa351e267111b62baa045b5ddfc83f391fa51bc60ad0faf484c95d924b22ef63c7e3541fda059caf7cb1b3288e069fe0b44d2b5ab94005bbc05213f914f4349999669250b35e5a89f1ce53ff98c94d81acaed0de18c13f6393016b75c2a914c151d17c180cecaddeb89d9e71b0e0d7b00c251c17edfa2752a7534f540a7762812a30c46fbc2e68dc9efd73a4538fb032c9734a8d525e2011744ab9601921c6f440324ad1983286d3c6f7a3e1ac7fcf2dc075f71184fc1b3acaed041310c4ba595097f61c3b2e05f5426dbd17d4765041602db3c825c9158d59770ed604c5fb0984e2f4edca975af6dbd3216807e0ca58c9305aeb395f2e1137a7ff92090a35c11a7d1bbe4eb4865098674f9ae6a5e25838f6274978462850f41488edca61f6234e7135e6381a588bca0fae2de1d7fa8e0d7690c9fea8f70c9395b12ea7c81c6f0f6f74c9ddc1fd1bbde925e4b50b7f2b2785aaa6d1197e9a61b7909c96cf2650b710fe2b8317bbb3f9108f86015f2593d2297e7a8f980385e65d8fd10b0340aaccd82c2c0685020aa4867d11592db82de4c71b0a52cc3be962b33890781928e3ceeaed9a39878e7b4f12187a4b20376430e41748834cf668e6507ff57fc87aaf47ebf4c6eb3b13752b809d9ac6510882761d9724fefb5125aacb24a65a67b4ddca985d0bab5e5e4d627dc74962d42df2a8fc72822b791ee914f29e2a63ffbd88792cea77885dd64c6c6b15a096ea3cde000c9fc198a15f8074cd73a0c4d296a40ad1b1aaa6f089313b2020ffea2f0ee5052e3c0d8f45e07c705070127f94b11260beb81e5638e565b94a3ddd145a25e03a48c3361a3078bb415d9ac1c3e90ba9ed32216c5f07f1851b6ab508b24cf0e41d8a9f0d7bc02a379bc650501d7e0e39940ce9fa6fa16ed66f07801c0b0605b9a6c00319c6db2ac8eb0a727519b03671ee9bb0341bd51fd96b3162dda652470d543540189cfc0bc1f217a1134d5fb68009c22b2b3397bd650bc17b36cab78d52613a29530ac7a0352bf3af6a5fde52a1bb84709a1203845da5cb5e3c959b6098e7b53437d5d5ecccb142396dc203cef5dc3598a1469734e0b99da7e54fe68735f98e6786a8dd40e2f38aff2c2a3032e73b4592c200cc8daa1ee2346e6897f0d5c1c3fa7cd469bf7a50662155a2eee75983ac79fd5ef414bbdd6558fcf48fc38051c991eec3b7ea3cd94af4715497fe8154166fb6453211dafd4d373ac27a5d336daac9801d222000967273885582dd02cb565d72ffc5a9f086eb4b93d070f03a8123efb88cf51f83f6096f254d252cb1524116710849cf1faada0fe4010ce0e1fd14c98a95ccddf68734e235cd02e40519a9a6841567990d0bb57270cad9070851dc9b307e454161e7d342c0c5d2bf3c6364c939c63a025da4c5c906a77a945f66b9a29d5ac0ca258e1974c829e16ae34df932e957a87e48c7cf5f1a84c6365b4195e4cc81eac287a68eb13e18e0bbf1249f3f233d7a1760fe3fb5454b2e2a3398d107bc17a7e520a5e377acb5a869179d0d5dcf6d036fee743635604031a92d16688ca584963b82b39e2d39d0a1b925c986c8e4c4b49b2db0b0bfdd9050052532803b2f339ad1943496c66cb68b3a2eccfd52679dfe0d1d79711218dae194ad1d446b499e15d201359928f64beb0262c20e429dd6710fff9343d31d36161c58e56967f5e561f560d450f6256735183576386eb5f9b2944380bb6cf43ce0f4ef3e83c11773ff2ed081c236641548e3bde34def16d34339139bf10c4d40790401db0cdb9e1ee9ab8989658ecc086557ba9cf5292f5b7b02830f9cd4017a18804bc3ab994201c8dde3a5df9cc3ace04eb96b411549b2d0f13747cd4d6e632c99de14e2f4016ae0a5d0c4a5a276a8d8c54974629fec50d7e00915e8ae14672b2884d6c62a56b6d5621dd9c543f0acc130ab7c137dc1a9dcd97140565178fbaf4b582b00fa86cc0465c755a51b22243e3aed3c14611c86b996ee42f12560b4e79479ad51bf9ac05cdb01df90b2768827f67de2fbaaf0972ce890706048588dc5f8f3a6b3818d8262aafba8ef49f43c0a568418a12e0b2ccf1aea6150a72d0bf89dd611618b0ae20c8f7bd6d74776be610de6c9ad6e0ef25a193dc8462016159d72c013c71a973dc1908236ff8283844c1f8fa76ed86d1f2e81d6ae8189f89dea3b6a6f73cc7bd3728d779a1b6cb5cb6c7dadefeb3cee4375e601b2a90e6422773ddd606e573dc181127f5f547582876dc6e33df2728178ca7011d37455363dd48fdc243b552264fc73d52473028946ec57742ee62502d1b63f0b943360e24c041ef94d7eaef43dc89665da6b289a9b1b085e75336e486325629a94bc14684de357925181af033d1114d20978859f1a4c9015f7ed930508b0650c865187ea19445fa00ce992839b2ff816770de7722d7249b9d4fd060e299fd9ffc4c9e86c7a9da2d1f82644db77e4a3531dfde5aeea8351c3ccd9f0f8613e819c792378c28d2a73a609f6e1cfc8e50ec574ff093ee3ada1e68594a513c8dae009fc985d91cbc4cc3a8f7ab87f87dacd34c46bb4b831d1985705d73ae0d1c4540d8e74a59649645a13ebac05c9aa5a0ea25ec92d07c406817708fa852875c5f1a4b7b839a58558d0aac06cd46166eacc6ad98b137af6ed6e284f970ee49474e485d10253affec343c93e0040a6c6755b6488caeaba65768505494cf62f56bfcd6408d00654588ad0accd4af00878e12be1cdb7e81b83e3880b1e3fb72e285d5880518080f5d0970c9c1c83a4c795c0aea616033cb57bba9f2af538baaff443da9630da9ccf8582cf2166e495988d52e28e012e86b827d78581cf9fee5d76cc4ede1b1ffb6ae6e6ea5dcef1e6c2ea9786ecce96ef32bc4a961bb958b6c556dd95f39ba1946478021fa905180256c2c9db0e3235c3b1e978d3a23e57c0c8565a00ba084e2322ff1693bc51be178140cf14475cc21e8bb6590cec03222e557c76ee55b8e4769684c64fc0927546b3459671e157408428d8cb3e16882cadb26227ba0a42aac0e41805e15daf7ce1e377975785277cae504dcc4b534550cf44e981fbcda126b08b9f6186042e5ac99a3ccb423c977984b0f792bc69befd4c69b7dac3b66d66a6ea83a4a7821dcc759272fe554e329b1c3faba6313ed7f319b5940d7ab070ed0385f690b0220108019fb1bc52fa1afa708db7693860aedb7439191fa46aabf4e354562135a78f07d9fc8eb38d96f377d4ca57b08677e9c02c3ad771a86dc574dec9bf31a839e72d97da888f9db9e7342b4f2682c5572fa999e61527c4acc4b8b5ac0afbc1d0843246a464c54b9a05de14b310484bbaaddf8f30b513d409b8afdf0c19e0c112222623589ebe53ea35b2f2a5d78877876a16f94dc9471c0c4a4d06af64228d31d9a81bf195a085c690190a51f06ecc3dfe80c16303dc85870b2f0a3d36e8fcb4609949ff8105b1e9ae5c75fbbe708182bd82584acbf3bf2952d96774820db4a092c13f94639b2fe777971d167cb6b562401d4aa5699e257791c42df09d48f06baf6092476cc6da33164fdd79cda958529621a890b2d9c0e12914bc32bbec82dc3c6392b3242807534c34401d20b27f49243e4e24559b301ec0f70b0cc4b224beacc74b68cae8a7ece55f0138dcce414af09fb37152730a3449d8e07aaa0bf8b4e4d7c0dc4a9f89ff6a9e90f500742242c8e08daf75cd665aaed553706f059fcad187a828aef7bfec5025df63cd37e5cb69fa3e95f4df87289200f3c83f5940b27533e8c921ee15d1a301cd9db461d6a48fdf9d0f01d162afdfbfbb4c59fd350654612ba35b5801def32cc9536a6e877c7f1234bdae30a21092998222db3658b1db4c85ba3ccf21a0acf826ec5f7a36e9df6c2729d284e0663d91105eed769a53c96102f8062aeda67268de1296fa00496b4c8f45867d4a454966cdf70f66f788e0c1081a386775637b891c230b28448370487703bf740256c7e6252610feadd237a45f975a5193e043b0984734c709f7e78dce6611911777150bca08691d144863191bdf2a169d151f9337619077635e355b95615155dbd8b598151cf99410fd7f4b749031a00b0f04c3cf6e0f49c9559de86e8d58687c010662aeb646edf77a02780fd25744c33e5adbb0d42559e58314224f36fca051f51b14502f55000850a68ff16fdd13d2b6af73392c9fd03c97096fd806056c18eaae12fcf14f3d1e896f40b408251d3249960316badf5619585974b8c0341cf4a2dd23cd074b8f7d9768d6ef6684fa5bbfce5a72cd321c925e2cc9e554b946e30daba3a1dc97e1d27e4d286f42f0d82106b6a79ac5b17da06aae6b3a1b71f20dd5f89b7dc7ae77d5be19143d1cc8785804924af9a63ad9edc26a9634e7e2c85795b41c1480995e7b88d6f7ddacb24a169f9452b5b75d4e4ae44b0dff6e537a10b625e02d16220027381c23f8dec0f045a870e82bbe86d42735eef5663dbd0c29168bdc4b9495b36b4045eb5219429aff2d80663e40feeded762375d5dd59b8c6e553e896df0a41c9d8d290d670c85c891f9e1cb56c6ae03b2943eeca60d2f3c97129074e8198e8d035116bbc798bb21b397a8fbe915105b8b9e7bd2486dc7688e5d6636c10f6a11e80b802c08a278508a412c02bd0804f116805214d6ec7e0fc952ae11d6d905df738fb4d3ec19c969f71926f8402c1e44015005415f00421188053788b7009422b0a6fb05bae215890e881b7ec409f3e34f7cda58f03197fbf9ae94e9b44a464672f8dea6f0665542b02c941d3e6ca0784310443993e8f38d62c0bdbbd4ce8f75ed3d760e408664e4ab29dedc7edeb085d5468ea89a95a2066bc26f0c51bbb1f7c0f088bbe0bbcd42bb356133d38ae607e93294b81cd8984cecfa2bd4dada001f2ce7ea3fe2a3282088c203c5c6cd12cd0ecf91b836afbd81100882020ad6105eca51b9b0db3e73d823a8e19850b7cfd2b59813f6089503638c3484ce831cc131e41cf5e54c0fa332d49bdfbbe5746df5e98cb30a26c692a5050df1a5174ee4d090f1d96d20d278fcad207bed8b30b9e4b01be0e81b7afcf00f9d28d2547849f9f8efc6705ef7a9cda7378d23392e48d5f72ac5a063c4735497ccb9b6e460b040a037f30ceebf6afd590337ea239a51cf2fe4b407fe849ff36b68d30bfd954cf8e92fe26be7a16419fab44cfd8aedff5e9bd1927ea07ad018bf90b64f9001677cfb7f3451145c5e243433f2e16594beaf0a3e15097dfc143218222a4c545ee8789b22f8ac4b9f5ec06d3fb33282a78f21b1663b706f78128f61caacc34f18e0e58c24cce2bcec39c984b9ee9d86aa4c3882190f11e4739e11d1562fb9b09b83b0cca33ee5ad2ee0b31c04e20ddecb1ea96390888b13966bcc08a63160a3a5e260ecfe56f89a8e41774256ac041f710768290524a58ff9d5c9fc7adad0ba6ff0716699c846ee1e6e91a92a71b05754903dc452363ec0dbbab072074e5f1807ad38fccfbd4efab573dbaa48d044a509b11c2c2dc063029c663681f627b785f394c4e49544036c05aecf4a3db474e69bd010ca6e69b6a76dce58cdb0d1ae2b271e92fd0321955920f96d6c2a19e12bed7508a97ec5019143cc8a4fb3c9601d9e892126df2b7cac0f3d97f6305b2bf857ca627d440b14931fb4e5cb08574b2dc91bd264e6953983b4cab24a96c316b34c59d78de3a95bda8470dfeefce08d682466089e534883f408c1346fb2dd5eb49d12e0f2f5ecca96087beed7ef9c70f0e3223a8a3eb3fde952bb52a9496cb6a0072dcd1d32fa67b363e990dfd5d4415c4616a9c43fe0df50d6f787041c65c485105d66e96509f7454dec9039538a3e37bbca37543618653835fa0b9a089f14ca7a04708d5129565d54083979a620d8ff3b10fc284ea1d612fd9003f896f0b988c50f04e2a7b6936b38b817632103b056928978590d192b075eadeb9a88ac956b38907cea98c3196adcdcdad4aada4ef7087d2b8d9a678dc4d6ce2bd7a844c89684b45452abbfc68cb864acf55db04ffd90a35ca39393a0cb791b1cc8270e1a8f0f9282ebe41af9fb5643b414363537e5629ec0cef4748336eb0b5031b747aa3f4f087ed3289a0a44a27513110f7a0326873f54c513ad4af21081b3a832b41780b807863efa46b482f641ae08f0ee6c1c0a9fe09c8e1594d6f8c25fac8012848c7097e328ae890978eb78e8fc23af830ab2dbde7a43e1a8cf090ff3830033eeb50d625c0695f6f65b3c4a600a1483265a911288ceeecd424ee9c976a5d381b5b9893421174119a29ccf0d6348c11aa006c60d551e02a2601219d6acf0b291b7953e20b6974266648370078d82609a0b1f160c499178490edf50e5e45eb0373ae11f0b4817cfe3e46eaaf00c59f2244586f415b307ddede07e60913aae3132db529cf4b409942041ee7889ab6f72c4436f0704484196a5e623aab6a26c29be5f3dc029e598e1f3931783d451b30378ea6bc6130c465b4d46557d653285e406af9aefc5cb82bf70eb6c4fc2df642c5e0e609176b75f6009d45d69808e8c4c48f4382cef9a39543a9838e7a035ea8efc5b2fb164f75d52a6245bc0b282174ea1eb6e1225d70c746684d7df2c483ae71d507f9373c23e8bdb645a2a2d7b7f26e00025b92ce20827e40818d0438fbd164a7d513c0fefed8d3bb851922e08127bcf0b578634ec5239bb60f7ab123632c406e0cd698ee66ab79b31d5e52b7209b941aa942386b8f26c08e5bc2ecfe12d81406486bc3d44960f18c934fb2c867c8aa1cbf8e0100636b8dbe6040414aab116b23cc657544591d76f6d87c0abc4112bf3bdcc8e5e2aafc3c859dfd8d98f19891bf5e03cb37a94873627daf98dbf71e23d230d54a444787764f9153b80c4a8b0caa50b620a8adf4bdd9b6231c820fb5ba64a0e19cb8baf8ce36320e2f63ff9a43e464c5c9f019121c2c86a1aa29977fc4e180ccfb4407393504e7a0e00f94222be51a35ac811f5536c245aa32e50e179ee0fa039381c4b0bbb1ad8ac2b13f6746f9a5fd0196dc21842e232dd26c7d6a1da23ee9921b03c0bda6eebfc7a07cdd9e07c1ccf8f3d2986b760ad26d31b8ec34b40466a10f6eb73f31f38ffa2b49199d0f8ebce85809f766a3eccfad89aac6369b6d8c8a3d280d068869b33db2d346757f24fe6ba2cacdcc06bbcd849a48de6aeadb28196f8224649c778dbb03535996a03bc33e9def0d364249859ffd5300f294d4071cd2bc6ed985f3ecd293a17a729bc2f41b4bd6f850cb94d13a7a39b10fd5eb30aab198eaad01080ad97ee312bd9d70a3f4d7ffcb9f738453f1e3063cba70af24cc4d58c89f208f115a52a1c94a22899ffb062cabaf42c968ceb13ad060ddefa7d82daace063bf39bf28b82ddfd34e35b43a7ea86dfcd70d2f2fd200a0b516e1362b92cf36d92550c868b122b6d938b968306c6de0a07c3ffec26817345e8508ca4eee5dd21574bb7eb7d12838d7c5ad59e841a0b4e5cb795c0fc59db8953ba8dedaa7e752a9405166f0cfa77ff13a833c0760fe18cfeb50ba3ba0eaa7af8e0d5576fbdd2446f9c207ff311088c03dd9a4e12a13fea0217432d8430cce1c047670ecf0ed4e4d7d99b8393b2d2c6ed23ed837aff320c70b64151c724585e21a24a0647f2cecee54c71d06058ff1e3db22c76a2e5c826f0bea4b51ebb59574d8d3e0e22dbe5091568dec25edc226f7946919a7d9675a7f1fee7d51c9ecb4827a8266897eec4d5c12eb40924c1d2eda7482a86e871e727b833197220f68cbac23e0234e3378e5e3c78c2460112a3baca85568c1cbba36e9e74c97bdad69a5ac2fa04f6909f58b1fb94026571e65e2912b4da755f5f39a2b529a62b586f89e941efee5a7aa485aff051390b060bf3186588ceddf500ea2b4c7d6912eb948e9a2e83eb056eb4764085f6e699f291e31594bf1edef2ffe54048ad88c6743c825c2ed56616205fa7b9e7321f09c940df0ff3d3cd8372ef9e29c2bac1bfc1289cfe35f0c1030e1b74fb4bc7990a79a574b47e6f4b2a03cdae04bade579c393f11c3d768b627cb0daba52b5c8f3f97fdff6220666223d7844fd5ee7ba77abe84b55beddeaff7c5ec5da01701607f5bf4fa21002dc87f2c1a725438a1d49f2613fdc6b0a8afc94163e50fec03bab9df3e66e0b4d02d2a788ab2e17928e4fac079c68098cc361cf746a83f88818cb67bea0e7fc47e31128157cd13b4ab1cb113ddb053db2b513fc1414687c01378858d14c3cc8078f06e21306e2f423a7393767b431789a916b0282013f07d1607347773eb7146baf7f7f216870f043d000b0b16f9935b039f30c881f53b68390422c6774d35d906703a3c86b43dcb4bcb0acd906252ec64ea0ca106e8f374a1a01d593ac9ff1875d0964e429ef9d19c6eaf76139999cf7d1dca58a65a3cf2dcdd15363d19670fa94225aebc16eb90b37df6b56f7f630dfa5f599813762153f5e8230e9fbf82aabc73b303a0c41ccdebbd26d227e274654661ed964d5643b236efe435e1c603511a0533f1087a8a05155f6b6091ad825f9164b9def082d1aaad6257648aa228b47b2896c4c702129a46c575667e689c11f43b94525c5c942ff992f5d7a87b38d2957dd3185ca7cd4795be938f07ae0896d3bc48b9fb4519ed92a2cabdda11598323556dc25bbc57a593a420e54bc04b86a56147bc4c214858e08ec6d895c5a7bf7eb4a8caa9f7fd358455691292d713eba235a2b018c6b6af1cb244f8cfe79c9023064b43fdc4a0c91d9023464716bec80dbf60f352db3f0831c81883a9a39e1c3538f6c0192cb0ef8d25facbe7672fb8766bcd528a5423ef5b9f4b2cfb23082de9db6950d90b4b7c88c750abd9438c7ec01a8406eaf5c008acffc5f7a40e91b370772534e2ed236b79186119ba06d58caaaaaad107874f70fa41b098ff9f9a74752013c2950cd2cda1c16361729e270edae9b84b967a24d665137a1f742af0ab640bc6b8e2825d9b107c02e512b5757452f73b2b2621ab101e650083d836a0f10f9b67a3853c4294d216409ebecfc4c6b889acf858e5203e727f9bafe65ac31485c6f193d5ebdf714c726d62adc3ffbd349704039b18a614211452fe91d70a7b71ec1adc45cfc0991c8dca82f7a0b7a3b24d161592a9f97aa2dec04b47d9d162c89ed64241c17628cd081746167b4235a8af7b1b01f989889c45000324f75cc21bc604fd0bfab72aa11b5b2cad839dc77631836981802be5242908ab1c83d22dfb4e40d87065404cf1f7ccedbb9b3dab3314620e244666574c928f5aa2025079128474d18d91ddc81bfcb229b97e970f008b24b8d6d01289aedc1d976b49a37ead56ccbde6c834a0d23862941568f2780c8871bb89023c208dbf42128f9fb3905c17226c2c890bf4ea609b3bb839ac23938f5130cf60845885c7a3ee24f5abe9776bfffc8f6662a6c69009296c0bc5895ef447576cd96c093c824b50e9c1cafd02b4d3783796c48641e648d645d4cadc4659761782482ea7bafb8433a6b6ff47a6f7ae336cd768dddeea88102c9c7a2533568c448b6d372d63cd2b752fee5c7cfb614a5510b3b31e94f5c6e5a46b08f5160d81c04ce3728d671afe23c8256cd974a92417c190c00ff5789e69d800b3844b75f6b405c550ee3f446719c4989ddcd6c34cc5b21078b99cd1998a4d544891d943a619dfad16d3b91912917d53e57d3fe0cd362c730f0b0d6f060bc6920b338a7db8e95a962b3784bf2d90ec3c37d4967c013d6456513295b227a2ba1a407eae7ec87ecdc0632f82e263f5f46b4f9fb9a085d701784392d3ffcb8877b7610483b3444c518573a5d3d83d5cc9d4852f1109b35e04ba8b8cbae0235c1badedb34151ff5c3ed5553fc080eca6d35d038c503486b1f2ac71dd2538eeb6432444ce114d04f5d31b2af6586423bbf8833d5b5f7bd0d0557a4e2b82a06083e14455e19a7d05879000bf7c2528f64d8eed831d84cc1a22a6cc9d03da7eadd199a09e801f27f81951791691697c6f687b3eda0b3c852ee68090c32e2eeff0c7f61220122c11a37c2dc7229e89645c6b09f89e8dcf8c1e1aa70dad3ce0572bacefd0e7825571bc9b2620e21ec111aa707dd6c5c9e5e0aa535f4429f0596fe415694ee6bcead24eb8f4a967167545922dc45cc99706f703707d52dcac565dde25e58b962b23259505b8886376d3cf15c2480c28dbc5a703a0ba4c181f5f74aaefb4b54d1d5cf9707d9305402eff681814ccb8751ddd5c5fd409892f4b1539b397aff3576865d360bedc5f0c1aa8dccef64428102b8ac3062c008e4b2f96785672e81346d8386b09ef65d43d2838c89ed6e782a2fc997430b16540d89ed0a6bc1c2adce169db9658340fbf85c43f2b2dff3c4d7953d61b99bea678279f476d06dc10dca552ac4eb6ef4758e4e8ce3b8b56f936871cde50f62bc3b20edd33de9191921a5f89271124e73596e185d70a194c8c5681d34d4127af3ca97dde2b7015eebf7a84b0a4892054bd88c6916c004f206a699762ae71ae8410ba2a622688e0ebd5de9a1a12e35dc7a498881f583fc239364029a2df28ad88933ba63bb85c174412e9a1c71ea0f7c4e9617b57532a31556f646a0cf24d446efd641f05682f0eed90a27ca5c2f9a9368e1b5a6ed1d512673b1ccf3e30f533d3c8395d9fff96746077bb6de55a0018ba853afc17bc11077676de8083009f677d846eae130bac6b15f05ad473e3a5b010215780ccf587f40e0e1742472b843911ba5f374f0563e18cb72409d707063113e39e2a703c9af8dd11b896393b27431764a756cfe5bec793adc244129f922ed5103c1053b71247bb6852336df8a46e749280e365b7c606a7c827b1c1fa17a8f816577408b5aea5d211d94926abffa02eef1dff08ada5fc980240f4967a14c9fea56fa588e948ed8d5f8803ce79a56f2f9b912462295ea8a0f10babe1e3d003f8f3d630d864694343546bc62efe61e933ec6a1cd5e104e69278c0974f78bef9559ad152ec999c529a186740a0d32c396a9731e0417be23be67f20084921ffb8e1cc2b432ac20ec653d6fa9d8402a8619c13b12df24bdd9699deb7b978d33191d7acae7596a84c811620cf4efb29448f3ba2bc25e6e47d7a53276af9f7ed2e3b7638cd61c5d5585071f0800be39628de17c88cee9e3d3b104a6dc9c37a131961ace0c793b5ebc6ba9a7b05d5e921df3501e27f6f19e6f62590ea51985c281c3d7ed6f92b9790ce445f1054623adabbf2eef4efa2e02f489f2de61480cb79805a7b24fb4b9bd1e52f6ab255be4b5ac95966e3109421eb9e319c256380b145bfe41f8a7084b3dde05b0506d2766ef2f95a9395caf1b58de2497a277df72ae087acdb5205e62d97cc5bac5adc9ebb8eeb18db3485cd0d6368be1fac6a81b79e819a9a9b02ca53e48a43c20c8451e73817e6679b2809eb2c12cb5bfe76aef44a0e2e947213036ae6fa303c56b7c4ea6a56f2ee68774ef84473b560484c9986b29420b9d02963340db06b6dc958bbe405d79008ba12d73fd1e642465327943db0ddbc375843fdfa3e74e8d8cc8347c9365f131427326cabc0af1f0a84f6525bfbc2dd43d9c0f8c19ca5d127b836580ec83f2221ed00ee33fc957be57514d2367bb07334d0de5ffeb843913e857b74294631271cb1b4b09c79983da6b834bd72c8862136990151fb875b28a7162a987fc1ea2470dbbf12b457f87ede4326294eef61bffe55a90c3375862ed9bab46902ea4ef9b8db8f18c525bbcc2550b355e7eea5994928dbcff88ab8a35265c5ae07bc2d7ac074fd840c3257768abc702e4fe2ad0998f218d20bf471b152ed95ae1b7d7df8723f9dd8dbc2f5092b94286e2e040607e0ddbc980d6e39886fbab42d799078716e109407ad2e2174ac52afd788e334c177982047360cdb7693f19106c1f608528cc13fae4e93c65f58414cc7d9a00752e1182b4d0c988dfaf44b7321745af0eabac74afb6ce977207c2e7e5408bbd90b821f8fb24481e6f191511c236f9240fadec12c3141c147772683cf4025e50f06b479873425635c4d89f2b3b67ee012f8978140f4cac961ea5db842ef0542945148f5c5da49dae87de75edb547dcab1b0dcd759eeb9d43d6a47e09f87c43dee12301e2fa92b684949d9da40c3a90c2b61380752a77c5d1db3548a7d211323df0a319121c12010b8918a63ad98b390a3fd39a0876afabb3c02266e717cf5c177b9d9140e70d0a06b9d9c094f71f1b06136e012a9de784dbf9639aeab4a2b8388ba9aa7f97d2d600708731f05da39003195ca688e211161f3066fd4a031c50d0dd400b5761a99d0a81d4f6200fcd6ca6a949d02ad574a5ccdceb7047a7c73ede2673ce260395a44d064a45341775c19a316bff61962c87c8980274f911b14f6748d8f70004f46773f9744268cf3825793522ca622190039d968de6fb39b6f5ccd839d4df2e8b7df4e3d47879e30bdfe77452f05a3d126d87fb5e560d9f108872266377e2b09288dca5a1f16dfa41a5e9be9ccb9942c8004e26a970f887a4f8ed902dc39112f565b78614a692dc8c6657bbc2e5f2810a15aeee4861bb3f02ffadc5cde0d14085076b9772b37a653adf14c6b2c7dd28fe1e511807a7fc35805edb17477ce9c10815136954fa2adb7d97cf8fa0418c67719fe1075cba069b449fe408eb2bb7daf0a1a142950056e94530819415c56ac50a593120f85f09907546320debe1f81928d1b60282868353e5e9fb61954ed476265b5cc51d42cef7bec378fc6ef31cea0982aad22d42e64f82e856f9f4c0546d2bf25ab6228597f422adb677395bb5d9fef2424ed501df7b909250c250b0f3beb10ef6e7cfd4e8fddf3e254e07427bbe93040e83f7e0cc3b5190d4beae8a72cafcd990a46602f86ef8120c42bd70d1ee3c4b6e9f0db5f98a756d017ecf2e2bd6c2acce6a126976a3d0c6efab0c4fdbb481ca3d4971ecc5d5765b80f1bbc441b9d086eaa0c904453c612309c52bb13e306eb9b40f58af45d3ff2ab610134371f41216514d0b3b6f1fd8f380620d8e996e79e4c9daf506b0bbe0d2052596ae74685a55d1138ba546abc679f1b04e260efe66f4ad1879cd92c9fe029291d2023714eaeab89905e2251f15e0e8488cd0e182b901e78c4606dcb6933e5a7cdad3850f74e04a2ac636026c43f4af187bb04dce1f87e1abaacf13a6632635a3702dc70532dc06424ccdfa62fd4f1cc9577df88dbc14893894bea032858431a06c8034805b18c3ebedee74c7c965588fb81a2a0459d6272b6336b6221ec81801ac3e5f649996366263a0a42c219804467ce2d03f63e91cfb5fa1a0d3de86c0f82f7b8445cc5e81dd19e4b0bb81156bb42e3e278a86b64b714a9aace8a5ea1771a59cb59db11aa3ebd05d14e70af96170eea58e1e8acc34f9cc1d4c890b10974b8c9140f66b00c0c821df023a24fdf8170cc7cad4d06294a69fe82d429d0b44d8adf0224353ce35a60d9627f23539413b6ff2c501e9fe4fa79e587a3dbf9e4fb70a60b84f79cca2c5d80f5e87863563d8ead40dd5583acf2e6e22bded7cd6a79328344ffff570c8a908f112477e7dc330c8e48e8c8a39de9a11b236308394b344f6b2fcfb814431485ffafcb0d470a0124934b620e727d4a4fe8eef90b196e9729b016e0ae7889cba4198f5f162280a86937e4406c804483ddabb03e1476511266e3c76008f7afcbeb65bc5c537802d8648eb63124f610f188af45e0426f8b5f0d7e046531c9b3bd26198f03e51bfba2e240b207463edf539e57cf5752f902772e59d01e2ce6b17df9af3a9fa04d5c40b1901caa07d7582da3db12ae832229cbb091d075100ac8faf37323ea4e008d709e4bdca5a07383fa8f2fe725d0da4f1f000b1dfd4591e26564e2b72857030125f173c4016182006e8ce00ea6bdac7686f582f8bdea2f9dbd8d5af0638cf2fb2ce042420019318ccca7e4faa8b0cf070b158844298e4618948e5e5e8798c1c53711baecb420394894b27d72512255cae4b05e7947ff440b7550de73d93a9b2bab3d78221fbdb7c0c657e32a42d98a61682eb96eb28d0ad622ca25549ce21a46c638802d5ae58e60b485bc362b8c295d58abf136d864cc67a6f8dafe0c9f2ef12fa9613229d72d8e4928f08f1c7df9f095c3148f1ae8e4c06573e49e97583f4ad862c24deabed7e7047ca9cbdb0110a04cd0634f985d19eb4344ebf7afbdb3a1872697557e7cfebb82eb8bcbcf0e93c2c4dba0558147b956cb82a7b42f5bcc70adf0a9673f074e1ae88fc825f0834574d970ca43bd373d36d47f0e81646b9e6eefd4ce794d22a2477729c54eae0b949c1613352bc70ebd1990133003ab9a17c8d22121ca519dd6c338fea6c4566659562abb0320880c79d3b2f7b5405ac653bb8c28823b207dc4039f43d7754693b84e796184523a1c5d7484b71b58a99b4c3916881edd699e36635fc1de786afb62a473a155bc53db67e032f85bc96f5302e35516c8ab69a55ce7d5a7e168ab84ef1e1be3eaddaae3178f78f78b8307fa8a12490e7e170b226548a522ebadc3819b695287cf757f791bf43a01d1daa90fceb870107cd117e648df6fee77f06bdb228c2157917948c70afbf0f1f2311ae0360b1f32e78a2647bff3ab8b776ecaff39826547116fcd5db9aff2e8386f65d2a182f8d57682617af8e13f815707770f72eb85538b978f562da81ed8ad08e16d6279647b5694446113d83c3ac09c4ca89aafc79d9bab1f43bd957a12b4b9b0d07fa773858fc194801e88109b873d184d30691c8352fe1d0e0f064b0dc83b8634da197a18e9e7c89d7c7e97ef81f495cdfcf131710fa547e670790d4d846271a0ad2a41e876ffd30d6f89e502d1c40b1c9caaac701b76e41720c839592363b876f958c4e18c9995691038eb6c5d7f0b2f2e8971b8a939ef72fbc9a5bf901738505b17c2b747303b2eea32fea752914ae03b7c1a9bcc3a318d23903137e0d8b2d31fe02a1c1ff80f7d0da8aa43d9e4daf5d27c8325450c24a4f8a8836dae6f44a9633f207de22d89587f6056f804eb352082b6e0c6d5bcaf09239cdc0c4ea88a39728d09391dfb7603c21ccf7c4b6793886f53344f6691dc1a3d4282a18dda149ce63bdfd3f3253401702266ed3ebda6b70fb1848e14ab970166515f9ecfd38f8b47e28aab4ce760fe18666c80119380967a1753b439c99cd738da45921ef5a2a2c30c9216a14ffe368a3ef59eedb1324c7654302952447c069411fcd0e6fcca93e580f748320a30ad9f4950abd984dcd8b3c2eb73f01f4b5021ae455625c308ec24a07fa7aed25ce245a88bed652463782fa0086a2ef2e841e2c588dfe5a71f4e8ffe5d1342aceb7b03789080c07058002208cd474dd258b3e57cf4589982d8f57845eba411771f230048deb6fdbff9290bdf7de524a99a494325a0612069f0574fe0646666b7230e6fd9f4ef95bba70b93273985666d27432994c233568ba8401b3258b937442bd1a9148338c0e8f5d74c4273927a5ee15638c1fd41a000060b1022000178000e89402c036375de77938383900c029fa7252ea5eabbd5eadbd17632cf32ca35366d9c51896659ab67199b66d1c974a652ea552e56c6373d379d7d129bb2edbdcdc749de7e1e4784e0e9d322707274747e7fb5ab4d859f96a45a75cadbc8d82399c0db97574360a7e9c0db915305bb40567436e9eb8e33b3b74ca9d1d2cf5c517f33f9ca2df0991e36cd18829edb22730e545e40b0a727c1531dae11785b5cfd85a0c44c240f833f048480c20fc481848ab9afe19340331d0c15084ed35c6eaf83f80f98fd3a96b8c3d24fe0f3186613b6bd40b29eaa8fb21c71791a71711a317912d2f24233a505a3b1d5ce26befb536642a040d79eef81a02440a5e43b66cfa2e5cf835c4871dbe8b42f10a41d42b044170b8c14ade767c0dd1a163ca590d5432b7e36b080c55f2b7e36b8890ae29a7767c0941d3d590f38e2f2161760d215f70780561c12b881729be29187f1f4b8a3b8b559d689a205b82a8601e197984628904b2055b6b6d1027b427626badb5d6febdf79a10a6d630212a5720462f20416cbd40eebd189a9709587433d02e4a8da3272850a04c284e9c50279f0c187f1f2b067716ab6bf232dab286890e8657088098f0e465740591ee49d7e465f465e31d5f465db0505233c5d50275dab180317661cdd30eff5b6bb6d09eb8abd3165a393b6ac922882cb4ecf05d42b20ad9be7c26b3276e2c0b28b327ee1067234c5ab22041b742996f09e3ef5b32953a14d42ca561ea52484305489a2847696200d221e950d09246c9be3b6a49638495c49dc5ea926877e40a353b22b1a3962ba0ccd5bcde9430f0d7771103f3842cd7ae0ad835cf9e79ed9384dad1b538b3a097d27b6326fb8e5ad00cd98f351a20649cd2cf684cd8f4bdef5956cd0edf255988d81acc9359e080939a1aae60a18a295156f080828d756875fef0951b568231c632d8d88c0b1b9b91b2f1b551f9cc0b7698df5f80b3b0d7da2e48a694325a7b66886dadb53732c8a91db59c31c1762d677038d384450ba538d53f9ae23709f1e0117fea0d6cf93f66919c35343c7fa694724a39a50c02d35c9cb004122b8e7849830511206a668a3558184a29a55a155136045815585441858b334cf28c0a3befa8e54c9028be2a30febe3254acc19e10b140a94c0c8e68c972858a325065ce44615150c99ab062066bf01151180be2decb21895470d9418c131b7460819aa83255ca60894a9571a10c95a8d6b3a420428b1558aae842c514376be855e1de5bb443932938c880080b32600274c9ecfb19481921519d91b7a3162b92d8da8e5aac10c29ff2170ac38689da12c83e59edc31a75b168be20c9a42948ae0f6338f8b4c73e5570b5c3077efffa443ff40ffb0e1235e1f727fa61ff3ed63fec5f7fcf5f07d4684e992dc9b4e54f59ed58edf0b7ef6f35a82f144d4649ef6f41a9c8e958cdc7a8cd531f977ea771af519d03e76d2e6713467e17456d3a7f1cff9ccbbda661d388bb5d269a2d3f3591a693993497340af6a8cf69d8e63177ffe66fb48fee2ff6da4720ef6f6c82babf796e6965dffb2220ad823de6ef20d27610719f3ffb1128b0a2aaa7c08a7eea2350f69ae4826c1ebfe482babf9fe3086f8fffea957f8e961d1aa395eb1cf271b4150f5c59e95441b9331509728f30428f084420fcf37b442002753f7f84a0d58eec55afd23eb4cf3e02ad8082563b543eb8577d045a4d9de3e63b9bbfaf496e8716c4fdfd19b30323edb9019d56533bca5eb5430be25ef51eb47df6910bca3aea15fdd4d38314d35df0d43922edf9918beac4586871c6cea89201829959da64ec47ade0724d87aa2d267bcea9254a69cf39e7d412c534b5905932e7dbea5094e707a9458c1a8945c617464803c8041c4126091299138e001066734d80c147910931604860858a1c5c60844e21460562925802d723349c00650435e60447440084c788c122c68725ae15636563313b6c7ced12b63a6d41eb59504530c15c90ed8bc8cc9f67a17a3881091d846050535668811827617270011492094c401501c2440ba050803aa234059a314c637288d5dddddddd3d4affaa85fc290945db3fc49f598defb5b65677baed0dfb9916b21fd627a168dbaf12bb6922cf4cc831e668608eddc02f75883128641f03fddf2597178c5d2ed613ee2c9613538af122664c155a9c2c967f9fcbd5251958b5169f8195037130b0daf9429c698bd7b4edde7b412195b66d3a2fafb63994f4807b793fdc7438b7ea351dce7d43d7b6d15a6bed6b00f270aaee431e3e210f1fdb69a1fbaab7dfc922a21fb4863eb6fdaae9bb9a1bfad2cdec50ee1bc27d3a546f7eee9baf60e8517b2671e59e10dcf55b441825d44f5af1affa26e4e113562d64ffe6eb8743b34e34add6cd87321cd2a19720ad509cb52d05824a470fcdeeebcf279d5fed7c39fac66fd0b76fed98ea511eb5abfd9b57d98a5f477b3aa57354fa49fea43a1fbaf68ef6be85fd146783ca4f3d472db6af69fce93056be8e0e5d38a0477548429143458e46edeceeac95f6e5be993e461ac03e36834a9d192d0a433e6d1fea64152bcac03bfe07f3e76dc0b0c290567c8b4e320cedf197fa896ae7d160030ebe04da53350f9f6f71f01b8091f6680046da83afa4db53950d186e2f31cef9fb6ad5e1a6431e3e9b4bb56ddaa1a401e4df12eef7b55a25d01ea73a3a5787396b2b0ec5c3676f1ff2f0d9aa4f7de8da3e749bc12fbe908f391bdb0ba974282f17c2b6b72f81c268117ba8f49e3cb1cfbe9fd29c43490f36878a72a869a47f30c13bc1e515c1d8e58a51bee021b987a405262c58f18e1cb5c0e411f190bc96bc6cdff1c50293b4f1ce82913d9fe5c2813ce57c6988a52d31ba28a59456205bdfd2fcf3bd14e44929f50f9dce3964e98ad3f6f7260c09e4ff5be6c7a89948289ad301455bbe1f7929c8f4671309f5c3aa3bc0c176eab2c872fbb0a27c9ab73c5b346f8ab31402e0c0c4088a0e539ca9224a21850f2fc8b004054a4d50248450e208a326171051a4f4f4c496147610010f2b287201861964c1458809546090409122988c3cd1040f5720a145966b87ce92b315b2766bfbe645181105668c2c61450c9e94a002683e4f84f15f4e40626488234574004a224d874507f55a224393344b60d8f4bd0f5bb2b4c377e115a02c41da61c4b2e7372047963db9c433398c5f3040ebcf3062330d982d2b72f84f277da7d386ecacc8734ec7c2aac29dc572c9c0e52ad36161ad5521866dad8d4a73b3e34b85a41de65fc2d808c6189ba04402251fa4c49952154c6986acb4424a096953a2a6dbf1a584451625cd2b85a3170a2b746a3e3018638c57272831819225b412262c345787053843dc9c1deebd375038204b5e29287554a4792911a10426c5a4d597586738c319ce7086b31913839f615a087f944f42d1c6d3a3b3ce774a2709455bc81f93d9bdd6d6ea4ee99cd77d847bc35a31795bd02618027d493f8d82429e39fa135cdda8a1d442f3e917eda22d391ad4c195fca24dc110a6107d50c8ffa9fbccc2e57213902143663a99da45512185843ed8bfc89282bd8c1c0e0e7eae13ed5a33f70905ee6290e715dd2b69c89024514b9a7825e9b2d435e14952a0646a91214691c39cbd8f074b52938404ccbdd70ef110bc5030d231d145b1c18eaf24529234a93eb3456b747dc971525bdd5dd26e8a1cbfd65a6998ef098cbfcfd57971b9589d13ee2cd6ecc6c829854f8f4bee72754b28f13a92e675242a478d5afad67ed1d6ea56c1b8391036ae33224fe98176eb365b4664df35cac05feddfa7384070b91bbe85ecd7afd4254dd5aa47a01beb7bc33e0df39518e98c61487d3ff265fb53cd7dfe789d5f759cd1a501e217513959d8b091310ab04fd7bc8c1cadd9e64f84917fa4a5d96704e26ad0b759c8adf6d971a15780d8e2ee34bebbbbd7b8f90e29754abd2b81bb3b757777ea4eab6793bdce29f50ecbec82c852b2ba1e220683afbb82f1f7b13a12b8b358b3da8b311c67b517df38abbd36da1ac3ccead1098db43269189dd078ec5490e54777ea4e8bb0c4c6743d743d743d743d7426a822bb111c799df0d4ede057b2647915c9411291c37f56cbc5094eaf225c867865bce3ab480d2928328508fc2a92b48bc410a53ded78c85a88fefc89fbca962c4edd6bb5f662c7984e893156adbd1763ec628c619986b12cd3b46de3529e4ad12953294cdb368e4ba5541b974aa95439dba841d3654b963060b664b1584a95afd8d86cd9f36fb2dcd0297b7e47a178ee79744a8f3a891a33c3a8c99bcdcd4dd7795ee779383839393ade869393a3a3f37d2d72369def6bd1626767c5e33c3c744a1eda626767b5e2e1d16003df60033ae5063bdb8a87f268a0c11639643cab7b8db4861c661efad56d1a2bf183f9e39e3329a5b42e6411a058914189abd180d9528a2f36c7dc873895d2119483cb41617cdfd396fa039c3f4c87df6ab9acb5318a768c2f3c18b28726ab907bf80ebffdd1a7ee51d5e91763fe60fc7d56b02d8e2d11c514532c85ead35dc3216a41a81fa91ee26c58a1aab18eb3278d08e0902de1be082ce4f861d196be2988ad08434ec3e7e7d990c3ff9e9ec4c870b46b080ad1f719b3e5ba1165c82dfdef8b06cc968c32a49c766e5b9421250d39868f02b6288304b9ed4ba77f31fe8b31c659f69808d8fd21bbb11e197eec7ee41c707548332ab91af4eb57df7c627c11a6368d1bf145ae46a432c61c9681b17fd51eb3702ac5711cb7811f5f784c191831df92ab61dfe9db3a553f55fa07cb2992eab10dbbdec6309e8de91053a952291d67cbc3d76565c02c4ac99945866197327b96cb6658b35f75e8da6ea5d724df9f98fe0e5d996b4b99655cc5c00db8acd0bc14883dcffcc1ace6cd1fcc65d35fe1c0fe558fc110fb10bfd67d8c2f6e6ec00e0cb1b709b1c76636fd2e0630bb6e3c1c0dfb18c8bdb73d7e19763f3f04fa9dd652dbe468d89bec6fc095fdd4c79d1f03553f3f832b1cf5555f5fa557f65738529f7deab3cfb09fef451ea14de7d9924299f67458b42b37a9135f0bdf17e3949308cd064896369265e99c73da6aadb59ac57af23e567d8ab1c6aab1cb9fac1db5d07cf938fe042a427b3d01b3ef8eaf274ebc9e0cf1c4ccfe6692275868904d9f306dfa3cdb9cb56acf4a0ebfa699933851b3e3abc9101b013bbe9a406d0c6480b2289ede0f39ce160dc1b5eb5073d05b92fdab5725e7d0317fa40772d7b729d264ccf6b7d225524d82dc0e4ea969dc6b2d40ff0ff4ef400ae230d9f75738e8dfa73ac47ef597c6ce3b18370543fa3931bec04fc190d2cf58f66dc2b4b7cd7234769e823aefa02ac61721605487450edec7790cc4f91b5068fb9bcfdf75ef81ab9d8ffbc374b5f32d3e6e6dfbd56fbfd2ab1d5da3687bbfc2d1e26dbec5dbe400228190623c00cfd7a02d40ef3fd07b1d304c3df639a0d0cdc7add1cd410c4787db631ed86916a63df56f4021ec6d74cec018a0504a6f9bae711fd30eae6a64ef4fb50cd4b4cfa236f64376673db42f9b6a8d7e867de41c40ffd5c4cbbef6b5c939a0e804d85f8a6b60ed3fb9547ce12a329f5575e6f5a2c5a961ea1bb681e1ef0dd3b2ec2f8fd5df6c794cb2a43a1765721e612e168caec6ab598e06e674cf77894ded9aadd695767b94517394e1db3a9e3cb3e54d183cb3877af3c7ad6cf298720fdff4b9df400c0c45d8586adb736a1994dbc662da4ff0fe667d6bef9c0dedd778b345e7f4216a033f9e168c1789ef8bb1d7c0c67fa7efb97119a58f53d6da59ff6290c7b7ed9478b6f20a34fa6e43b2369e31aff7fdd578b6300679b030b7bd76e5955262f8ebef2ac1faf7bea66535f0be31382fae0803c37418b7583086dcf19cf20714e39cbfef3f633f5f32993f53e6d203b87c90c2b7697db713c9c321c7ff60cb92f7429e44b367bed4dfa5a143dfa0b578b624de74c891724b62c490f4fb28a5b352f74a5d096f054a25161f2c511ee5501eb5ab131fe350322929e90503d3ab851c92b6740a8ae2067e7f1bee5041b893fca48db3373f03550e624d7b0c946fb5cfe66baaf7b430ef22a21f41fe944956e4f531fb98679ad9ed6bea3d9c73d7ac37faf76bd559d6972e431f92c90eb5ed7fec0a867407c9771d43a9b469e1d5a14c8a540fcd4d87e6be7a886a9a563f82205cbbba2f5fbbe1f583e68ffc5a53af4ad9fa9aa7743834354f0a391ca25e34ed39ce462837f7fa29f9419a74aaeed537cdeb570df49f416d0cd25e7272b3d26edadbab552fbdf9135dd770a86a5ac8dfca7943d3abfbdbd7af5f37cd93421ea25b6a5f1ffb0cac2fa4e9ec9d0b61db12fb206cadb54c98d9dbb64fff052cbb831d5f2f1ced17132e2f264c2f2660b6b6b7a83d595146fee814b3843cb103ec71007c5210fb46dc10a3a058726289c8114bac2540acb94be45224427a893f2cc125c61269424423c35294a56e0990252196ae5822c0922c4b1e304083254afc9228856c22765972e9a020a593a5c51ac0f7094087867100b20f0b00f9a8c9b5149de9ff9012488b2cc78fa32483f9fe5153b5cfc25f6bad9567b6ea7b58e4f0fb789ed572ca417611d16ac8bdc1eade7bebbdf7de7b2fc65a837a6ff8394d12683c385370a6cca20db69058556da92b57a368fbd3f93326081c8e0b6cbdc12de43f67085467bd82b6cad177a46e918f9abed901e8a9c9f3b71f3c88d2002d1f172d9c1972d86ab970f9c4f868d06ac8ad93e3d56ac89d93298e263f5a31b3e3eb862edb67c75795a71db91b768f8093e30ccdcb2f1ca66c175a7793a1d03bbe7000b2a3065a8cd8c6461626b3156f50b3e5c659ca315cf3478a604b9f2d3d20a9969143bcb104e3a6ef4935ee38a4f4ea53a33e61d0e27cdd90e5a8c9a98c3f3e5bee72d76d44b3d6cb02ec61add552a49582f463ea519c1d509f136f1c2a9452cd63c3a2d9e41c3f5a2db27cba83e1f614e3fc7d5a95e747dab3b2fa7152c8934c8adb72742dcb474df3d3e2fca152e64f8de51f72cad0708eae451c25f9e6fa474dd43fc40ff0368c855de3dadc5b93c36f5356ab5aafd9a546ab21b7679aa3df90c38eaf1bb6ec02ecf8bae168575967ab5e914397cbc77bc82ddfe3eb86305bbe6e303373a43da1ef7065f5b7b7ad94c33cab6832a7341a311f35452de481e2ece0a829ca8f0a98b87bca2024cdf97548452ada9aeadacf3840b0eb4f30ac2e67cc6c6fd828b2528ad1a2cd108a54b4671a1c2959ce9f947f767fc25d7b1c2a3962f920d8d2ebc695fb2086f5a5ca1c0e3a6bad422e65105a64b90d9ead2539c458488bd32b638398bc265731b2533bbe6c48b3e536e79cd45f5598dcecf8aac234e7182dce571527696390a9bd4f6c8f62852469b46c0c89284851881462f024081049668092244d66c29299b69d61880a2f1c8184c949141aae201963c30b521c69020385181b906c6dc7970d40585fdc592c570b5c2e16b893183140c43471610a2305d29228741802480a529028c28d349581424cca888d4111853ae1048b25dd892698a6d4d003134098ae28d104d309987af896f8be2e49249104171abe5091c111494a40c248112e98e1a1c81527d010f5c4e55583d2b63bbe6a40f219f17dae15b85c451451846b08974b0897ebfb3c20e69c544e185d5c6df91e1133a099c1880a8ea42005410415a78dedf8a2328607edfa871f8581f9d87c34e9d8749c2051938e6cdbe66f8fb50ed5534d245fc52344ea4c7beefb639a6adacc791cee739e7ba2261d9e7c771d3a4f35117d1d9d03e7a52672e17c8ec6d14433343735d1d39efb9ebea0ea53e00a02d86faf03fb4d1335e127da7468afbaaf6d9a48049a657a6a2269a493a48e226ad2217f6a22a2261dd94b4d8401da733f7ba2fba9cf2e9b8f40f1cbfc501a751f81ee4d2893521d08b43df736a08fcc47938e4c4b27b4e73ef63e36c92324dbaf9b965668cfbdcf43246b1f444d118840f5ed47204cfba81f814269655f296a768b1d5f5392b616679c2929f567cc6c95c37e042290fd1d12a8fe8c79b590745215cd7967b0511265cc2bca0bf08eaf284fbca2a8919a3f38427cf952f7b891f5f811e48f5d4fb077c2a226db5f42b15d471a747a4fa278d9f2e3e60e70e14fc1b0e82918dea84fb57fd421d18abec7d88a4aa4539097241c149484c1c7b487e5da9bade8f1b450c8f2a3cb45678e5e2c10e434840993fd3bbe5a80c2c876edf87281891d6508284e3bfa186b3d4a524a25a6e5e56c8c81f2280a463ba3ce2ee28b1c49590318e71c26e84babcb3f6d890123ce29b49616a5f5eb7d3ff19c5256afd3dd7da83a8b874e4a65ac30c413e418b325953c0a8820279e1299e41b07525b866d100b480f2a950a6c3a9bd96fde52ce3edc76b6e3f990b7b980f9d472af717ab5637eea23303ff5457b0343bcb7cfc0b0849d3d4e81dadcb46c2bda1938443786c13076b14f8f2ceb37b5f9fa35a5ab4d4a87ae02c3dfaa9f4155a04db76d9b57430e5b3ea9cfbe7e2bcb40ecb395bd0de8cd56f619fcf8227b55f62930cb5e661a03b1de66cb4925e90f19eb30fb7cec69943e681146565dfc9fb4d313410e5dfb0e6dbbeaa1b9dde902f027f163cdca0db0b690fc398347bd9976a8c4cdd754b174866800000000c315002020140a0704e27048244e336dee3d14000b78823e7e543211c662410ea21888821886611084620030801840106306225403129f166f51b1de5a447d255574773b07494ca71e5a74fa46a2d01a8733a958e7c042dcac208c9b041dcd0356b869853756b89640730f2dcead0aa8dca4e86c1db262de5874b891283467e39954631a870729c776371c2428a6438f836463381b9ea41fd3389e496aacabdd99744c73b0c2dd56707491a277eea0026a7712b4360eacf0f75247a2d7d2dee299c431b6791071da196251bb360b7e906d7f92759e7082c0697879d8687a637a8761b05c70beb611377cb9a303afb56e246632f6e62a66ebb3fd205fec9cee33c3c56ffd2f39101ae46e34cc8de7dd69525c843f3d785da4dd0cac8dd1fb693d17967e6c77cae0dcc76bdce4d01b731d8a4a24447e494ddd826233c8295137bcc302f598a7cd26913c6dcc66b073dc33effbcc5d6f0678bc260fd4b27c57b9da6c2afb37389bc8b87d5d15e277edb6b79b28b58047a048287c679703f92d0322a61c5c6876747b33b025c6d3464ab8d0d5a43a4937b606d62f858e902980d0fe23bbc002be6d9adfe0bb28bebe973d61303c3f072baf7b4c829033261e49d598a9cd7439dc2ccc678fa33f1b8c0e7215f3ef779cb0ebee31859727f0aea7362d24eb5b687a63902d6cda2b6f19b82080eb49537220f8ca0787c4d37ab11992d6eab2a2abae6fdbe0c1d5449f896e56c13f21112a800451af998825e166a32fdd2ac21a214805b3fffd5f5ee91e1079eb9ff0ec4c1f1c94b0a881c98475511b052517a4069491688e6a5e51321f0abb31a9e87e30d7b107029f366603f5651076fcb16b4eec06cc7af0dfbec48dcc496035ef992d66cbc4c9961d76db776f75206feb73fedc73bec0e1784c5f3b81c0291d5c8990d78ffd71b6ae4449ab399e2ae24a933f7a0b3f28a88c11bbc8820cf177bd687fe1506e3112346f81e9ff01b93e46356fc154b1c47679b55014dab6fa120b161120d54936a1350df3a171ae302d020b45d8c6f4f7f283942888a0ad5cbd33dfd1cb4ba04fc30c4d5d03c50df098abf7cf5bef0d07020fc93c77541816ba54e3ee7061756cb803b0ab727160cba5d350b46d1770d37d8ce35e9b1b5a179ebdbe63896efb359ccf979d4c32e6467be09be0cbee7a9e74a7f705a38b693d10aafd38c1980c7e96e592d7b96411690b7336dd4775893faf0c08157521c0eaccc74038eaa20f99bd82110a36c725e2b1c788aebc90db69820d6281fbc42d9523866932999e5d864000310a54a77d5223a1c7a15850f10f91e37813bb4619b2a14d2e63699c24407a92bcd569df5fbd5238aec11bba3ebdcf25832972e55ae0b163d504099c4df567bfa796c7af2c870c4e66fd1ca2140d40fa126de598dd9f0afd39903c5b643dcd7dba18b68268e5abcb27ae0a58d22bc0a1e994cee78a19a008b8462cb7b8896ba15d406f6b9caf94c6e40e03be6a0f5bb31a5281a7aade6f6b3f56bafd2115478529339e6dfbaf22db0b8aa0d04ae900fcfabc6c0cc5cece6ba2c2ad95f5912014c4cf71e3776c68f2635c52d3d9c7b3f20d8d7846bd930f390db11dfc129c1fc5d73b2e9d471ee58bc467ae064ab2e682208e8fd7ea1933ca553c24bc453cf86eebd912c9a45da6955f7a60eeb5dc68b6f8e4fe3a045c4b6c498b41a16a8b2f99d82896c1465a55008b0584a0a6b90c55d592c4001f9b07d6e4b97c808d927d6c561b1f0298d497c47b56cdd0c7021f1b8a5b4c909de45dfd0ab480212f96ab7364a38d64ab517bd807be85dd8c3a65d04ce80dc609777b15625c8a78e2ba076f72a5d28ad6dbef2542321146f1d37761cd896d5f138ab9c8a061c9d1173d2d2ff2f6b8503ddc3c51bbb56d6ce560f58ad70287e7ed28e30e4c5c6232ad6156bd74332d6cbb2a7c0be5da16996152b2d567af5c3af3bd8e27fe1554c89b8a9615bca580d04ed0e86b65a8ebbab955899184460ad5e59e0edc96839c051659440762cb481aa337aab17d6844198d79a8a3d6ba4b802c4f26cdbdf7680eff2e879cd34989607bfe075a7755f15eeaafcb7d94e743a5b95f8c26900c86fc3724f9f374e7710e2708ddb3b4f5126f6b6cf9cf47786443279d6a81aebffe6b9bbe10da8c58b8d78eb72ed2ca3020fa78644328298fc6d0bf537677f41792381fcfe6ea09bc3c5faeecf918669cc05ff8d6d42d27f7e240ad22022031f741fd257be29f11190d3cb1b59cbf13edcd428a00dfd946b438e16f8c7697141bf8d745a671c8380c7939d5aa352a1e58d7da7ebe43b99385c5e67d4af31ee115d4125beb2cec53cd8dbf74634acfa89b9c382560e99c4c65027e01bd9610363d635148e2059bba7fa367e7e1869a2a5160940570734f0051a8bd318703fdb7e4ce0a2a33fac855f45e5451a16d6a05544b72b1b42fd0f5b3d5cee25713989aa617d99bae1f4089e93dde0e7070df83857aa6a3168200e8afd69f74445c228065da0760f7baed4c1e6c2394e6f82c4f4107b2ba29081c7e9adc39c30016ae19005abbf914d49cd9d2b168e41209c234daecd1f82a0f9c241ddcaf21fbbedc5a553d663c9e0e220e7a44aa6700dc417d5ddacf8bf7cda5e129dab0c8d6ad122c94725440eaa8961968d11d3235949fcab97b098644323976cacac62905695009c1b86e47dd7a42725f36ade7a6b066d3c4f5485a45831b88b67f39ad2279787eb77018e3636c77c58da66bbf1188254b55db0194ab8d2396744bb60f80c8118328af38f6d630f39f87999dc8b60354ec3130765870fde15e36560f681a1d8694c876dd217ab6be951fb88b85e98733049002b80948588a617ad589cb53082560422ced16b99c0b77995fce2d1f76338650779312b1558804751f794c5dbbb9211aee851eaa7129541d953df0d3576df14bcdee7a7d58dc4a75c8af39c75e9e34c17631d0fe815d8e0d8b002e0d86814c99bfa638b139f9e598796ba85d70d2ec61a77980cd13de150aaefb268d2874a6d8969528b77bebd865603eb02d297fe5e716d555d2e5e665222943cea132ac324460517708853626667be0aeacd6653b740651bb492886151362f68385886ba8e9468bfb12a2e08fd2f6f8c125e640e79c2a07844dd566740111d232f97ad1304aa03c3765e004a8584073458ad755e6153154f4ca9269fb0459781052fbd9fd4db7cf7205e41ed10157cb06a802854d4e374464b715cbe2ca779d316980adbb42532e3407960c1607f21fe0ac6384871200dc60c56b09a5b51318ad598b9ed97cd2afebddbe89b331afe2f349a9df9ae5c057555e12f60af394437c22779722bace5530f409d97762e50ec7c6e7d9cb6abb5997a2239866b68aa1396b80c501c177e02c4b3e594bb4bc202964e8edc201423d3b7e486afccde29933c7f88695e6ce5698b42b0b66f7e3d36eeba8bd9b789f94faf6b994520cf9ef48c0c0d292b301027184c136cda5ae8d71aabeaf211eeaadad4c25468876aa50836cfe33c6aa8510fd89df275b8b8e33977b163f31dc0235455112aee41c0dd9d5f3636c812baf6e58c5e908889a885896233745cf9c9b1f7e1bd933aef3670917be0db7811af86c3b84f4498dd37af5298ac1230c859386df90d6f6a156db3e9ce8691551cb50fa34d28d1a5dbf8bde6b550b4309eec8d22f5aaac80135cb6fa8a9374eff9407db3ff1d781f4f149391778cea0108215989c462c671a25de8548a320f6585b1ce899137e1eef83d442f513f80b8737236e2215f495977ef1e005e7096a354ae54826c7b87e18e4c07ef67c7be103dc026edb3ef163c46d10925f5d063acc9818c4bc59c666ee79e23f031d1b20ec2a5551ee127215144c528e5caf73ac295ef3cc6a925c2df72ebd735df085c40d9b1986f2e60dd967ea2e97304e052c33c997f04378e4d21cd8091e17fec6647908edca3a330d5e0112f91c96d092f56aa4dc1c56340f69d843e5a548832dab180421f61cfeda8801cc4225ba74823f769be5448196b3b6a7e6a89502671ca302c5b5d3a5333240c27821069c3570a2e8b7e054a65789990a97da59f04a3b7d9784616406a10e2b72a2acf8050ba53420058b07d3274f8d8dbd0f888e912bfcca060a4b0c5d8f4dcbabfd3ccfd63a03a02d6b9cf1792e67c4f9a032418d9b6179f0b3eeb85aaebbb8f266702874bfc318a5f8c9f677bba121d10c8e3566e21446f412e94afa91ae84eb542d435a52b590381fa4d25f4ff753af998974e31b923533d83ee0e11e44876897c9f3d7e0d4bf9ec7fe8e44f5f4945fd965fa3c93bc49ad347b91008307fe216a38a32203b6393bdb1a41c058c3f962d62c4713d8cb04c15ad3e4171b874f2ecc2f42b8be806e368425a0645bb8b86490a840d57eee74fd812e9bc82fc695663810a6cc42b5b95cbccc90eda8a4bed1d95077c6542d9e4b4a0dd89963234f1fb9a185f30c80a9d7952845b754aae2cc8f5dc17b9545db20c75a2f0dc0ec44e8512c77ab0b224014bca1bab85aa501f72cae5231e571c66aee11052360e614cdb6ebe8d317ed0f054fc923760e0e6441dcf92cc1753a20f9a9c100b977e022e9cb4cc2afb4ca47454e7fd6b53c91979511cb1efe85bd37f690c99925ab0119ca83c9bf727722ab9da8c7bb15748aa614534a3021d88590ae00aab09ec85605b089c585ca9c1c8a92d1fd142207939f53c52eb240c92e6a3ced966e2d14eee7f54640ba60c45095b694958dc48cac06b34730a3fdee5f3831e7e138c1e316fe141647fa6bd7accd5ac0f7cec8881d58e90475c1b207528bbe38502e91bbd4132ffb11857d35e1ffa6c473c7dc2217fd8b43814f59d3820d0649e5288d3ab844ba9c0d34f8774cb119d0fbcfd3df1b8af344ec84f00578c52ba1e7fd59e0447c9160b2e72f093b9d6e5557d8597a413e7aff464f51208c20471479dadc6154b49ee86cbe4db1a500ce5931f8d386666e12a5ec887c4afb0e45cecf7d12f4c0f88778fc295be9cff4cc5888698155b387143877c165d53abbaf18a059fdbf6a743a46de30b50550dbd6d14c06fdc929274979d1ceab2c90c28d0d371c8b450ba147c8e4bd69071af50a3de4d364cac7cf26d071f1826e47f19503e502e8db313d4809b003d9d6f8cb6cfb6e1dcdf23ff0a2479792fa0670c6e8784955eada53170d901058847f7a00fab681186e1415ad79d35f51d456b5411204a9c4964c70d8652b720c9937911e75695383c8267b17613039a9ea570a88efb5f4ca3683dc125076df9459aeda817dc4b7ebc3b78b7f9922c85b8026a1bfb150a11dbfffadb4c1d306b8a04ae2e0ee134256af6d6b6b1fbb8d13c1e5452043ce4cca11c5fe671caca1d7a98550906cc3e1fbd6edfd3b69feeae8a2b34c9ce8c560cf2d8dc620bbf1c3ae3e10946b0434cfe0f4f40f330fbcfa27f7e3f0e62e0523b9251cb985d7e71b16211869c1f6203bb7e53333c7930eb1d518f0f615aab669cfdb2c275b51fa9b27918e1209b78749ea060289101248a9ba680a410f8d66bbd99f83fecaede6a5087cfcf0a395f19bbfe23e3ca09dc947a43825202a0e0642e61c8ec120e6f5623316e05184058482e3c92ad1b6f6e594532ff77f581071e2afed9995cf42957b4e1c2a66e909de40cc129d3633ce3c1c3e838934198314273fd779d4d33bcea010b298ec776ab699b9b3857fcb0dfce0663db5e4f72ce01e952439b8d92893121992940e68dbe8ca5454db4b270205dc9b350edf0685cd163cb342e217c3b997440c8df514d6214d40fff0852cdaafef22f82f319e03f5c5ce0da6fc5ffdabc6eef1b7faa5af89402a027146d5334b829d3dd0a8fd1f26c97a904e68e445e61336342c25046dea151666555939baaf221cc0f3b6796ba09d0d8fb332ebd1604352d9d02c760625eb3c46da04658635e36189e7d179c38bcd740c4dade6826cedd06129fa405f2feac8eab0e485e627f63f65bc08aab7a00b8b9bb0c2c8896eef1b7ac3f26c756c2509e83607945a78f11189bd8ea15326d5efa02439e885db00e29df0028001fca6e4c5d2cbc5bc3b8fc14b464301ad4f37a492b447932c64fb50ced6e95d5332d5209694456c3e0d13398b1afad063c24ad6576fb170b1f8278e872b61f490d350902a74b5a20d7eddd9582bdf810e864fe03173ad4acf60242297b4910ba81339d57f89e464f6d02b54b342db3718a989d826809e232b906bd882864565e696de8bb734c8a2b6b89d00457a169211ec0e606e8c186b4044a1996b8d221b617c0aaf38f92c7bfaf6a19fe864f83e4ad40c9920c2fef22c4f53ebb9e6313673d6a17cebc5bc71bfa1cb783ba1400bb4e34a7c2787974a9a8a25e9d793c3a60907049892e539553712e5d3e905644a6f16594f24e45f98c9e4f1f9bc54642019d3db6eccaaabc2b38d15bba2c6a4b988ad85644056db4190bd0ff4aa9921ee9a2e5c3ecd7091f4f9bb66b211479240c9b2f8201338ea53649d0766754b2b8d5de82dc7e82de752c83ae264af7c8654169447657675b0c24859797bb28ddceae286139b6ae1ef32fa3717d4961f4ce09469edc4a5b5e81ccaa5c956e81cf79d5b761c980eeb17172ff23ee0c266000414b3812a796f412dadeb1d4b24c9305ccfb0c62360ae771155b0d6e2acb813c3038be6cc696cc6c168d6cd141ea568c5abe2aab6c29490dfe52d40596ef7ba36f5dbd797fb035b412be8e173ac86e0818ae6d8729f9da96020262c16b42d05d7e9b7f4c792b2613480baff3b836fdba3c0a7538328592b34f811f296eaf215101493c2f235d2a72244dc3c191be8864d6f43a7482ba81989ee5767403897d9320efae26ec88c0015966b116c8158ed28760836670177f63426e03777b657f62eeb60b49dc85fb014f084daeb44dad08f541095438a264a41c29656689f645acf76a078d6658c44d2acf7e1002b573bc46ad98a13d9d720b1a7d59159c1677694450d512bf3cfc62bf783980b3d229f6ecb0dd4765c14a0294102a2b7a8ce3be66331c5f34aae7b8228a9b44aa833a10df90b5d16c4e10246661b938f99bb4e0672dda74409b3a4fec1f8cbcd8d8420380b67748f27ea61565b4dd8e4fda029678120be77f0e2949a5b936e0ef942c754d8df953c9a9cbbdbb5c2203ee567bdb8e5c3fc0952ca5d00bda4bf60c777a3ded35c27a35e4b3644b42af8ee7c446f4b526782f1daa7b39a5c7eea5e61537182930f3e0c395b05e072ba1c076a3db00d19426d798d3f06501c840f73102245808cced580d0694ba1764af90fee0eaf20dc7df6d10ac295c12ae5f0523eaa516445d12406a8ed188409719ee27f5c433519b81b4e0c3888b188fb63862ba44b0e3504d9e641a301c2e32d61c5b302bfbbde30e792947ef37492cb95cc6b6e9049a7907f32f52fffc69fbf38e740004836e2a5022d6b9866c5b4aafe461e966ad37b984f91f23515d31f3b231e583be9ddddcff4f0d352944f237fb7648b1ab32cc40936f3edf23e984ec95ae5167244c28378ca1ebebb3edf72e94c5b3f59d7071eaaadcaf2f5fca1409ab6fd3bafa6e0eec2c0611292ab77aac929ccc5d3314ef178ca8a0dc184e00dc8ce05477e72791e19adf865b1e4b5955376615b622e9b71d4404d98c95c4f6dda0ccaa7544451e5e1cfa5a14252dcdadd2b833e90b4fae383d9b186ceb8531f1b4eac2ea0134148e0919a96cc93525ef083e570221ee87f4837190399b3ea1fe2566b615746fe6b5028d77b7182566f010472761b29520ea1f8dffb7a59beca1b7423749df89529b30d217c27f3be083e169a1cecc3ff538080a2719b20caa4103dec0761c590c1a8a4250d8f981b7c7077208eb9bddbe79492c8c34e50b8fd9307ff044e1ada08c0ced9443b7a4370b90de404d869aa61c873db4a58791977a00222279009ac476fa63b27761b76b11b7718bbb95cba438171deb7606582d19266d5b710ebd235888880e92f0a5f00f08b4c615d180de63acefafe98e4d024990136790a856a928708560f18e8a7474e346178f3a680d5549518e40bb9db4d13969da5c5ac0bba7f1468ba3b27b814a53ace409eacf88a4a886ec2a8294912f1d005d326ffbd72664b1698882eb12daae71d1a40f2f773084d98b9966ee7cf1708db36b012a895606afd2a29f9c2388739460acefe2097ca63563153e2443e79e16edc6ec5109e65122d92e887c2b4b2f8f63bd49c40c91eb64040c265b743635a4210b3897a4c6bc7fe1bebd8b4a784bc753189cd64cf0b3db222f54080ef5921510d8ca6dc0de649ea2ce9380cf79b5136cc757487d56441819bac4f51f656c21d9588dbd1d1ac970c5d84b8d6075475333c0431147a752078a6b7e2e85917c8a13303cb2bad98d35657d3dfb70d815687800c4955adccc7d3488884a72ec0c12cd770db1f3e4a2bda25d7f734431e7d7ec5b2c76c6bbc2ff8173d1eb37e741fd360e124dd7878a535047cb7ddfa07073ad2b1d4a0870ecc84b3077403bab3a0603669c5c56bd2968e7c969f126af2f6b6675c083052464cfbaabf07de7b7e31bdc431d1b2a1fafb703212ee1a4d0206b41a11590c424b44a994865593c8a4d7e5703316917aadf65480c92487585247ccbdcb3328d9747dfe2570398d3326aef51c071c20e4d9d4f08510ea00117f83d9d64c0980d2ec1b534e4f7cf8e20cf21c7d2033580d3bb5da3661d3e5087c9a4ed950f6a9d1796a5c5303fa0e0c0ddd3b7275c2aea080e2118f1a34c35ef12c0fb4e5e4b33fa1deb10e1b4be88c64c19502e4f9afdc3366694a18c13fe9486a98f86e68dd9f0cd6293301ab3dd1d7f6f406d83549cc54aebda7445848e57cf453b2c5ac1561c3895f1757fe2517f60b9b32b3a8e5b51683bc5be96f81e41826e34c77f1f2591271d8d534267c5f8c319c32363010a205651abaaba20aaa5fcf576d68383158848c025cd65fcc97c30ae0aa56bbf79f84361f7673f2b06c0310882d24a1ddce770f11b559d4ca417737821779fac53d4d65219daf698744ca3860d1698e0d1043de8fafd43f0d64066c05a5c44f59ec25221adb3cb9c86fcf917858ef3c2b65c237472cd7ab1980afaa8d9cdc230befa8d23fcf3217802bea63b94b2319e1454fbb039973f49256adba559266e30cb6bc373a3f0e28c1fd2eb03c8f101ec9770c70c2126496c880cf53dfcb8d2928a2f9d1da83869800e080e2f41152355a420d5068baef914f8fb7b9486dac064b0b52ea77d25cc3addc481dcb365b20b734807e21529b99e295b2b4e0bb1ed1a588e85e575afd5117b85066b73521075f52f2185df8c7ed3d270756a9052a7f3c8f947fd54f7006cad7561dc862fa16d767a7ec69f8c056b93a083011438f27619d7644627bb1501c769830e3d8c9f93559ce5768ca9bcbf8f35257c78fafbbbf36c7dca9d3094935402f0e6c46bee6a8af4112d3c78a6e40ac14b122d16e1f49a42eebb4f0ff78edf5bbe0491c846ac55bd6cf4e5d44f1287b6312dbf03218d198767d36e152aed9e21ceeb9597196f22fafd9f3ae53acc07b0a99757b7b2b8b6e399b4dee823c2e42d2c62099d7d15c87a61e54f9779e7263ef5e3479bdbe1879d9ecc279151281099fdf65375673864d814eb97f4e0b4d744596ada97f1e5dc2452d9fd5465598eb9eb8d914f46f8a500891b45a0522a4b95093e4e3bd764026341dba3be02203b62c71e9aea93bcc3c0192e3d4d2d1a1bed039cd5077243537ca16436207e4b96f244957c8beeea6bfb46e27903ccc143bcaebea198963b79cfd5d77303227324947764dfa16cc35df08c43f642086307879c917fb26a4d269786aa3cd300f4a2eda738a9b19964828fffb1c8f85815db29bf4c002fdb8616589def372793591e89ca6c0c34825129960212214b64d2b99da1986cac1163010b3bc14097c096880b6dae7e5c799df3710bf5026a2899cc7d91021f146556f2bfc17b5a46d30f3b13bd03723cdc659e09c00cb5c64d8a944dd007d68480d5f016d4adcccad2e1951fe96bc2c150bec5ae4f5644523485b46a2bf3d390c28e08cbc669da3bcd5a962bd2a6d4e888936961535f2eba46bfe1135ca53b009a2067ce04c7c3c99ea1383e91f24355c0c36a642bb59942d1c127be62d3e654135935fdf524d282f9dc25bfc4deaf63c1f919a5ed83b15c4f8d8186ddee3aa84c405a19d44107edac4499d61db346aa2190d183a76ca5cd4e94d46db89f01ea1d46c43de23e46ed40659c5e04f854ff269aaa02b09afcbc9ca5c87cb604f71212452d53c6e10ea1c15026b4fc714d759922d5e9efc8e8309ed121ba2d9b89891f0b7af5a6bfecf5ec09da21ae7b46cc9fd957c3505ebfd4feff6933227618f04ae0b15dcddcf5eb58ad5ee326411c6ab82880f351e4cf80107b7f6e47cad1daf79526f49a761034e81324e1146ddb4cc98c647923aeadf6d8185dacbcbaf1b25d60202d1f2a3167834b89eea68537812d1ce4ce567b1427dc6964347658193966a78ac4ac05aba2c386a217a4ee3ad83f8b5ca7ce0a5e9516b28e0d4d3603afb2d583dc975390334925100eafd5b9275787f9196338827f0a8caecf9ac2d67e049f81bf7e22c6710e2fe19cb0ddd178ce69b603cdf569705f6d2d60ccf79c47b05dc888f9ac2858adb855220f41a71b00bbd85a62e51a532c6ec6bcbff07fd2566f5c1794f1db142eb2a9cdcbe77df8a79e08bd86622105aa0121eaff3130e0ea9151b5080cbfe2c8e5861a193e986ec9f010ef4cf07d800f7e964c7f96029b260a1c35be05982db5a7250b281e48f3596a6e420c6c05511f3e20c91ab9921d4412483bfc70d4db1a7d38c189ac961eef03ff7e41aa52076968b344c844536ec8040399e6fcc1683d8d6d349bb3d5e72b48a58dfe65d4c9d8d4f4bd8ab8691c906e536524f92092d445f6e690e30d97b99132c27177b7aa07fecd312165c4d09cb6ddd7d678bc432128406f7164838a96cda8bcfff9f911cdb6beafd1fad246f389d2b622bc8a289452f33a3209327e1dcefa814003f573b56962ace2abfc3d658660944a45a1d2b0bf35a45c8ab338a4dac19b24f4b43491d6970e119e9daaee929670d1bb54174cbf988960a31210166741dc9df3a0f9e5ae13310e7df1313776b50ebfe4128415643e36c28487ea626d94859f199c5bfa5683f5d3430d4c07c002c223b780deb34a6eaee4864c49de74626d31e76d47de94efcbccfb2733af9702ee1e2102bdc8400a666942f7d5c1370c25a9e8bab9d119b18cd6aabc708d72f32f5639d6d4656a211288d7bd3b1e5db15aa4b285ef180f4c96935c07ccd6c3c1290a2ade2d5d55f2fc19ddb4b3072f948a34d6a1fc494d5b81d5588f118f2a507a71822f893aa91d19d64bfa6060d93c9051aa9c70b41728ad4f1b95d4dc236fa0326facd24ac01e62f2bf7682b2af525bc1acb0a9ab27da30de93638ceb5e539d4708295bbf8e58ee2297f2c2b4455e4067117a812da47b704cd8b914d1219e079cbc61a99b739ff5a744db2830ec66a2a6b051d16f79256c1650f626b2ed3268fc66a29194f5b69444640bd52f5d170217b2fe1050b940b18cd195f0716264e288a42ac5b55d48a0c79f9db51d870199d5997b135a70462503d107f5eda6c5378bf848ebdcfe10c8ee8f2732fe48b9ceb49c8f7f0d3706fe884aaf9f01334ac4781b100c009a000230c7fe9b79ecbe97c879642bd84e7a319301494c6148b2681508690427c5159b810ef3c0c08693c83075633888109371eeb3a03e81bd4d7f37918f176df5e49a59e489f1b4750d13942f31c904a040972043efae9b267b7084ca0ef59c7ae64393934ecfd9b33a935d39638acb9842e161d8d9fcee0eeab984cbe896d024cf8fd537c7b085b101a264210ac17730994eaf166d13648c4173b12786dc49e2ff5bafce72249971e34cf52b4152ef0a9125b2b84b1592607a6bfa08dcf1f209974040ca3a825559e43e37b231b105641b783ef7b05c2c0807e87923e0c0b33a2b3f80afb95d297b4621857a131c0722775ba54c5d10463458d1bf37baf87242eb76b049984971542f350940e603b16f627d3d286ecd9a4a112953c493a3e5dfd552d7aba425411ffba43c9f579613d6f311d22449a46b7be911ae0226a69423cbbbdc52ca75d32ee567fd3113f6a446aee3889114c350c29a20069c9fd7795096b16249acf27583b6de60ad0d1b177bf39ab79b7eacffab6aa94ec2c763fb43b162c216aad259deb762f80bf29d7ad64a9a342b487b1e102975f772156af9f3774b0573aaae37f341f2dd6f16c8aa615f3d7a4ab0425fa40cca72ca24225eaf6ecc6bb9ec1e237257e6e28aace60e4d5deb536344ad0cb547f0a4b8dab05fd29df35ac3ff0c5e28a538e04a582088ee1df59663e7be69367cebfee364a2c20f9dcacad0b1aa9002fa2ffe9c69c2de157216284ab9353f02baa2aea470dceeb06b78750ef163417d47fe33be0ffbd5ae04813258621cca3dbda7cbd9b645e1c048260e9bea03888a42941d3acf927605e816b5bd4c1b1134cf3af23e65581a6e739b0432edacc70b9c3ef3b99c82e25e67ac9ad54c1fd2950330a51a39d3511df7bbbee1d631c27372a5745b42958ddf7bce3bb5412e35190a119a8b7709440d855f805a5d968b816519dad3abc90b2553bbbe74629db7d058c443260816237d341bb5748c21c334181ff4ff9d89562920e58c641826d85ce73582203ae44918695fe2878cb746cb982090f8c33777009d0d58e8d6016741be3c667708db1d0861f623c2bbd5854c04c303672f0b9956ad4ed007b4a42853f6b3dfafd86255708e5df844cc04629e6162290cc9b923751b54ae213bbb1984084c5569a90db4bb7a9b1c9b51d7a123a542fa1d9aae28315e867903c0938f3d30b2a2ad076985ab017ad780a288a045e8452fb6095e590f28c0db828ad1875f70d07b4602c24d094834d2b17b4c6d3798f69ebd2c3b5723fc173c2d1ec087da70748586f159e0d4fb35f872b1ab10d3b826e33ddea230091078152dacdaa810c422f39a5f34164fbd324442ce00551dc2f99573f44c950b69ea57c908935334ffd65cbb47014aba9fd0daf1e3689d1ebdca0f8469ffb6d91eb71e1c8481392c97eeb69144946962c2526a17c6edbb6cdecf3154e81ca072d0ad77961c2edcda588cef4ca6084bf07188b29002e6f9f29933d83a18dfd610b2a0500659b83955e288a09e05649e2cc4b28104e56bb813e00183fcdac92f24462cd6909bcf7ac8f999a5495c3424d944c2d30eac3677ca134724c4da383e02cc011fc9a62aa4a27cdba3138fc9b96c7c361b4d19c4361e473e758f06cacdb3eb880803b69761645f67e2f2b47729f3eba0e3dcf543b0b849f54e54510bd0d30bac584dd3e5d6f7988bbfc66b9bc8057275e7a336a8b0484be50c510c3658038d8e2acce0f9b871ec3d9f0e46b6c4eec27e45d28906f766ebb64821c2166d64ff66504c6c08dc334f7cfed35c98e4c91f7b215d5a3d840305011e1158992aca9ed0ce72a3759c4d8a8459c132d0baff9bfedd6d138d5799150aa2d9a90f048768e0e987372bd94e9e083f739a41015d04c68dc5084c4683b44f5bbb565879a6216de9d624352375cf81da7f68deb407e9702807546108e618f28c7025c343a14f6938d2c33522b317e4c5db04f1a43a999563b61c317b353f8fbb2a20c95f2681b5e9148c58ad6af2ad911c204cbd2e1c69790317dcfb40f42c7a9c35de56a0e6c91ac5eb78b1565e14fbc589f3613a4cfeb5eaceb74950523d123a5adb9996db71e475bb1530ff50ad9ddeeca7b06ed98bee1f62d6fd2ad2e88fb2bb91a3f2943bb0cd8370fce765de031cb95d332dbc64692ba2bb03b2053c53a2b97da6127042457ec84b28436af75fee617fbb319cc84750de385cf19a6a13e3e34bc2c8d80359e7d713006a55d94247f1cd3c622fec16f888f2af7a84d5e1e3c8297e992379b11544f4db165a7aeda90af856ea2fdc326fca477d04272b09a3adc46487742000a95ead9f7457501b61c6218182b64bbdb6236f08e692b4dbd2a19fd046d9b765f72762121ae540c6a8cd63e92e5fa6361313acb238818e562a61427604550298a210115497dfab3101122da55feb4a14c54352a1b362c505794b33ee65ac77cb1ae95e16f6014bcbc882dd6621c1d6778129405c310909e1403602ee74a2cea527286c2e2b0f27ba6e81b327405542c7084105bda587b11b194557edf210b54304c16390658c7ed9f3d5c43b7ab5b01ed0c343966ab8c91b33ab048a5436af848b3292a516c7513d5f48cd331097baeca1076204e5a0fc929c55d004e9bb07055f4bafb9ea0cedf274ea9d08b4cdf0e3145045d34f338c41cbae5c0c61b53efd8bfbc6a16121224d762d1689b27d34267292eb24de9aa004483b4bf5f4e2dc0661d7db015a00e96fe2b70c4c1fd16fd43e9d21f6ffa24b44cd4f7b2347482add8a7d2ca2f882ab126c1151ecbae296af981b80f90c7863199c443befd8f293c6898581e7927d96b7b301d9591e0d227ab71b1a4615f9311417ed2bf1d701c3c081a81e6f0819287656620fb1baa38250c90a4cf22c277fb187bc9f35699d1244f65995fd09e3a9bae0352c2e7c85a92f64be21615e7e15e460aebd837803d5f141a283382091db045eb59c55149f10d76c184047d55a52e5d26c3199eaeb04ded3aba29b17f0730041d008cc183a031e64e0b0e3008458e175da8b5cc629dade8299332ab6102670bf02fbe4feabae4bbadfa2a7e1b0c48cd9b22361ad56834155315694b3b1090e7d37f21abdf8e6daf50f39f1dea6eb335122c2400798ab3307386150c1619e6f15691187e7441c5ccb971668bb67d313cc541c0e756de9c1b59824ef18a1ac1e605faeb5c39bcb868a2d4170493d77449da0c7213ae74df6e483a85bcaaa96ba61cce531af36f6049e6592e39045517a5e126087ec7f5fba901fbeccef93a5c4b15dc498c1c962679b961282cef7781e8f4c92000fa0c12926695fbffdeed4bca1c7fee7358f659798e0eb27cc34d00e3740b15c27ff295e635fa7a326c27c633cd22e36ef13bf97e97d924a6160efd21c058f142471310fb8501775a956f624522ab1c326339c942c0379092ef7d978466adc4efcc9cd0c00d4803400ef54569cf9e1c54e5017014725af1e888410f3a2d718b2ddbf0901e86611767ce3e05343610bf01af66d47e6c0a58b63cf0b41de3ad0bc1655bf5a14bec1d3a7c20436e6622252523b1bd48b6988d917f0f8fe5e60163423597eb010c83e35f4fc374cc2e482898705f8d7664d022da90800ccf6d4f46eb38bdd9ba7983022ae7f7ebc9677d1f880a3e203d62987d1f5ff924a6a1f2ac90b3a6a4b62fe443d44de5ef4489e186ea78a29e064545485dcb732551539cb9fb9435e4c3924af517572740d87dc4588a46a7670e1d4868e1f6afbbeae499df1b7e9da0582dff08270081cc079d812078f0d1402c71711a7d2fb0832eafd6741dd4510959d7cfda9dc4ec6d7ae63300c38cf99b6fcd67c4529db4d3c515ab5005510502e0edff1ac8a2b7d863a8dcd672280af758cc5be5e0f83ae63c5089406c4b417c939f09a6af0450c5badf397f05f07660feebad748dea874828399f8d3a24001086d6392242729ad83edb2271c826e50ac70ce2b5325f0a920fd9b024d50a4be3b508cd623956146ecc3092eb3a51e032d6e8fae6d7e391a4cd6779c8fc866d71e6b55194913cbbd1b57d3352de5f513390015079a322ad062708f0139dea92661e7c69db9b40a5662c34433c806758ae4dc91b4bd93c492902e4e209f8d08b027b28b7be06e2d96092b48dd2e488c09e5e6ead1a7f743b15d1b5b3f57a5caab4d1814d90e362a511395f7ad29580ed0c125280939bf05018ba3b7404dd1b5864111dbfa4c6e835142d1148e3b92b4fe4c86d8ea46e4b0b852a77ae254bc252d31222df1136ec37e2b4f6a564b983c8b02401838350e84f894cd5fe3708c4011da858d97a0d28a250b7b39d648512db4358935ce6c5dcaba1b82b1debbef60985f4d83b26d5687ab7018634bf1c4143d74b8a6e5f83b37887f1c0352447ce2dec363ecf235a0f57d6fdac7ba421943a8671c751c91c5b4515f03c99615097591242721548d510d353ee63057c6f31c42e4f2a9eb52683093fadd029d0344cf5239e70395821f590bb37023747eaa7ce2abd603941922020ab753b3de600b62fdd18068e9e2cdbc3c748a2679591f274118e57c3715315bd44ed2318d44dde48afcf3daf05b393b2d2ae1b441331c0970e73b30940221daec7c3bace740c2ec086d2c21dd7e3ad4ae2472e9da8c6e4fa923d8f4ad29697645588748b4a032aa2db79f2b9a937eaaa36348d04f19e608bfe148bf6ac1dcfbfca93a526f7127f353ecc5329cd1aa996007db9c7e446cd1e7b46c2d1938a44f48a931a30e61d3d259da53a7a68c9c82156f4e10b7d5319122576780396110328d91c2ba5bd8d69fb19d0d15e5e6b2c293402231c7842d458a866dabe772c257360e2a8d6802e0b28d32a676a50ea2b641b78b7911d12f2fe529af229e9f9699767a0d0a88a6db37880f39ca3b6f00baf117ffa141a2526c770d2ff31fd0d9cf10696ea2d07d84c2e99088a0b0206ec43460e6314e231944c271d25709c1cdf3086c1d8475245d22571755bc8724779764614d5fb626ec5e5a813c064fd6b0fa83d6edaae00cb51891bdb73aeb3a128b8a5d6c39958b318ec4e342b89d0fbbf0e3b4f1358a5b959c4f76b5729ea17446749028064a938635d2e0c30923b950d7947fa52871015555ec27a7356aba07b99e2e58064466171036fbf7a057ee791540145adbb741fb07bd9045d4c46002eb70a1914dce5750bef65ad2f42fa4558d73eb955fd5c7bd1c05f2267ffddd6202b17900cb91e16f7f02accf9d123c9dce336b0623fc966183448e65d6ad9dabdcf0eb65cd6694d02aef02d10ae540ef832f59f5a3a18fcd56097c8ad4f54a14314764f63189266d6ad1855f34bf81910fd24afd68fbe677669eea9f1cbd69242f49b242d3aac589537c2f3bf011f349121fd71a1c0ac54cf75682db0434f8cad15c115113d90da957534c97ca3ffa45a64627ea85f7b18e3c201b4f89585bffecf338539f3a97ddf07413df0c9dcb02afe51b2b505d4fb030bf17b4e85e1368deefd8161db96ce6930f5c3edba89b3e9b915e748825f2fd808552b822220c03310bfb305019e715dbbe7422c62e058b361d3cac647eae4fb241810fd13d8e82e7994104ad17d03ae8408a7a04aececcfcd74fd40b732a17ac9f3d23a63152b415eef8d9c3370baa57cb58676e9bb41403dab9be0ddc9a7aabede4c92c45ee9eca97f5dec6884186a47b4658cd9f09310d9e0e02080a8c3cd0eef2134e92f32b436be0ba309124c0db6f07c99269c7871e8d912374d7d3d0a9b3ab39a9e717264648d202151d7dda070bcc742fa420940298f0baf62ca5743311be7566c0e86b61fad1de4280142a3428c327d31bc3a4c9245e51d43fe55bfa7c69104a3e87d05581c7bb6d283e621731afb691a5b72b825ba6de4e2c7c6d803a0948bb7c4b37e36e101214e658e16ee3bc8a2811919432ff44758d630abfd3d8277f4a0fadf1f1ad233d89ac805690cedd86d313a63e69a36c0c17d1ca07cb0d764b5dd944ce405d10c8f6b84596d3263c6ad5867a3cb2756c760faded75b952ce36d597d663804159a6e632f7fa69a1445f7b1de1b22c64b6fffe49c853319790f810fa96f24a89908d3307eca03d86c719c8d10ed0ac334ad10734122bd1692175eac5af165dc0bf234368f907cfaf444b863512a33b551518b5b8c7690194a3d1899af92cfd1046765dd0bc6fb5dddb57bf562537f739ec3e1cff540f5714ba736146d9abbf1afa23dcadd7e5c092d810ca16fe9e1c2ef037294ac9a8a05698e6fd827fe6b2f889586d05914d142a72abf6539b4218b753c544cb14ea39053feb1dfebb5e29b9093f381ff063aaf741ff9fa903e88718a6b4f23e22ccb6e3857b22858ab68d38487fea61c1e4909bde08e6b6f88d8b6990aeaa6cff48a96285d3d7ff989dcbb79d7e782f1d8e3b2ed3e518901217121a781b7ba7d1e40c68bdbd517c44bc06565986be20fb52a76c7ba98b3a88c37e47009e221a132137f0732dd8be47d48531501585391dea7710f9040b7b10ea91769054b6bdcd7b833a9989f2b6fc33109ab7b8c2bec98a87854c4e8d7ba4ab3cdaa2e11018c4b7966efd6554f453eb4740b06c94ced6558b5cf46c242115b7d5556e9f2d1a040cc12df425abd1c0bfb518a9ef6214d091dd8ec35fe4bc13c09469250b216cb104b885d9e02df672499e32f1ff7e94f30bdfd34065202a245fa1e54dbbf382b8692874beda516c1c66928bcd728254e12bfc4c8fba4c46aa295a2f3563529de8a7a0fcbe4154c41e514ea2748bb057003777931aade5af56ca2bc1e8b8173ed24969183ca9c83db714794853b0f07562ad0d3aeafecedd551a03f3a5e8090012ad2b2d276598dc1e8a8681b3addeeba768f8ba0ebbbee1e6fd6433e16cb29181e9d4209b2bba92e58c4c044ab1d8b6d0a00f292aa61a1f2f694182e4193957bf861aeddcf8d42899e53018e2d5abc13df20c408e003b9af559faf17fcff21da512bfb838b8e5edd138949aef57238bf3301a4f6e10495f007bd7b59db6303c721e2f2512d025d1bdd0c2de51c5f72c5031ff12067e5f7f0bd6f07e39d154b8a52d12de32809befd8898306b278bd07043097f2317fc5452e37bf83e10289fdb1d978fb832759cd14d1e624ab23522ca872971ef5ed2cae10d66bbc28d7bc49a8922ead76c98e88878210a2a69f242342c1916970da22a494ee8c4628a2ce81ba78b2c3c62b98dc6a1d8908d5f9117406a03d175ba6c1f69de68c5f53ad616ed7d2b43db7f1c8102cb12c75b04b85a96e7e6c7513191be6c06e2ab758d2b6aae60ebd0a5050a2858c7c8f434190fdb1faa25f1e4d6ed5a029acd84f7d2e2bc46b3945b76f5f959cf5e12dd4f8a4177ab6e66f085362e964bc720aaa36b500a4b200b8b2c5ad1930a2176c96333a39933fd18c0b903fb1a855cdc6f2180964d703a16ade09dd2f302fe2b5e4bb9955bf0511b13de1a80d20f8a4e56b2ae5cd7f3b9e361872d687f9a5bfa55e61ab87bb3dc1548e09b66d8f7855522eaaa25632b65205c29fb4e90fc1009cb1217cd18518c981d0f835a43a38cfbc09f7d881760024a7aae71aa52300561fba26c17cdb546aca9e436dfb01faedfad515f09d799e9178e961b5adcea1499100d04036c6a7323422cb20ac5eccafd68a1cd8a9e5363bf60185293911e2f16d84ae8b8a896166eb456d70d4737a5d2a008c6960208acb8e7c19937a4c79f73584977457be1231d4adf295b904d01199e530c70dd6f79b0588d6ac94b55190802951b509f52e8a83315654f26432f596ecef9ae4802df340cbcb9318a888c1907e91383265e87490cb3f7f1f10dc5a8ce6017e651b84d4a3ac7ee3eb69af80d31d9433a960c8b04a82ff041c70e480a533faf274456259adbd3996942f8a41daebeebb4be5bccd8cdbbd2c48725159ca54930c705997a9613aaaed64de53c4513586d954d001fd046c67ca324657cb7363ac8ed6aba4bdccadbe9c84ce1e5d249bb757d606d51afd7ab258d741368a6beea96cfd140bac0e72c29a3f143c8814cdea0f088d1c41556d0b007da7fe3181996a74418aea8926881ae67adca23e67934dcdc9910817e91c8a603bf11f879fb32068f1f16d1837f6669036880276d0d7a4da04c9595933883d7352becad129a05b0dc41ed1d61888239e6fb406bc2481b78db14505f7193533032dd13f369af67b19bf96a4266052606ad023e88b4f51c5084986ba36e8384e0608aac3a9278a43f47b0fc200dea23b32efbded1a031e6067746201f732c2d1128c951e23e604a2cf415e3058a861d9844d8e3268b6ca53e46c9f53b44bd5ec933347e4e95be43f58d7505cbbceb3c48744145bcf60db94e40ee1f602b2c61aadd735d5b8c4c7a7fba3d340fe9d4abd64cc15440efec726d42518a688d0deb73cfb42d5edd5b6f8f2e66cadbe6519eca9d6a7db00d6481fb6b82c5b671c5ed2a0df22e95adff513328e480eb2de352eddf1b989825c6413c07336834a5b520c576edbaeea0f86549780a6d294c3091cc4b71d240555ec870652c02184838b9ec3769aa3c1fb4ec538758285162c1babd64fe8dce17c470541bff5aa129970800b2ad628585015c0a462f50d6846bb1b167651879e1b7faab2549d94206bffe7afc9a4cd0d409857ca5d40cd2ddd8fe4774a55bfc762840a77c8f90a0264144228b901a145f8fff52d47ebf8b5099bab63b83ad68ddc629c6a5d8d637f09d91a9e66c5abf56b007731161dea5b6ee9a555f9fa84a976f1f053def905ac21c82ec6bb6893e0fb8ab8699323f1dbda3213c9953c85114e0c77d979133ebd51f39e502e6cb6abd88615e9b2682b42853a8ef27629791f77e9cce0d7be72c22e4ec41720b773fe1b0ba929ca5437bb688a9d7606ae7d099c25cd509722c6fa7647b7e5096e2e4595441f1daa2a0adf512dedc71b680f3dde536843cb043c899ecc554a11ed499f8343ae708f4def971c91a85ffb57c10469ca5ae0bd9e1f17a54c4c9be6206d9ac51ec1939a89d5a8cc1da58bba0dffa6a93bb549081fb279d71474a3fd5e06075148259aa971c4512582bde1f27a52c82b57bc905c40f6a881438c2a5764b426764eafeb53708c61bd3e7281e49e96d498d8e78f16193199ca5bb33a2b99af360b13d8df4d45dee5e10dd51fa2adc36a0b1f31fbc9ae4c0f2226df6c94580b65b1957b436fa24614c075a7f1c758e2d2decc2fc5b8eda89cbbc711c8f1757e4dd37a1da1970cc31fd5a9891c35a23692bc610ba5ad9ac2d06dc60880cad25e7578c26748eb60c5b5a96d5d07501ed3278a3e3e6e7f476e71ecf3248fcf7d001a8a619d1e6751bbcdef7608c822704a455f3b3f5ad13328781d7ff9e9012ed12d4b026a45069f23e2e8a9ebfe6b8d2b2e3fe0b8fa330f465d97151834456bf030ba3aa2019204d82787946f576aac9d9382c0fbb88d3b10684fb7d90446663fe4429397dbcb394bfcc4bcbc6b59865e0fde9afd6ad83691767b61beca66e12b0a451fa225e438a05fd32d7ff69664b70d961488e604cf3eef57b2860f258b2dcc34119c06cd7c521784a74edc9a0f867619c83fee8c33dec25333954a668080b719975a5d25994c73bf94c75d4cb44277dbb8a13de16fb138925b026e38d7903d29d059f0a2af5e40f1a052ec35eca4b4ec27e5ea78de4f82803aa422aeda0e7b4e7d8006751076cf830e974dd4e637a7cf4c9d28b0f1680b83b30bd5e7c787ffac639a15b4255a05c390734270ff4fa3264c69ab81291a565d538329adeb37db890ec9a518bc83e46f578c9e412052df137966e5448d91d9bd508e4c7e24a66e795b2020ef2a15f3794fe1a76c9a4b66063be1058cc6ecbeb5332a451a67456d9a0c6d1f978be8d77875043125639b68dc70dce9b9502577902bdcabdebe92dabd11eb0a0073dc5cd2b0005eb2cfa111c040234b08c6c52571111a733fedbbc271a720482af32762e2b1a81802e19dce5529ced24d6a57471ab9a9d337803a58dedea95e64f741881621d6872f133a8e9d1ffea6ca849c8136180b1d62194bc0f4a46a751674134062c441d0004bc9601a8218c698285a9648f76cc8c36ea56c1e60967c2f8c7817352b48213e59b9c4c2eb8cbac7e71838936ddc52e8b0c608d78c3ba6fd5b79709a73e82fea1989f77d49c9cded3c5a54c0580120d39703901ce5b5be0082c62ae3d7d5803c66f1a9e2cf5958152988e6d0abbee3d57972b89714a23181f41aa274b244e025a147cae495691cdf38570d3b8183b43143017eae0268341673c085eb11fe24e8de0cc501fa769559c601c1cdb7fcf804916a5b2894d02cfabd7ff2b4c5ba8c02f4f7041e61684406eec88c86d967d7c0fac01c49c010c9933cb82a34e267af1a71924f84023821ba38093aca3acfba43855478ca328ee5859d33ae98d5aee4b8c742b6e70019ccf77411e3948a6377a1d3ffe9380db3445358ff42f65d290f021165d8197a50a8cc4e17c169e68a2ebb5eb5cb4da16bcf0dc0f8636b1d583fba83f683fbe4c4f6d32ab051eb347da06feedf8c0d84d18c60311402105e6b208d9bbd9d5306ed562f7598798f40c5405b59e488aa9ad5680debf28f39598bc50b11c57f9469cecd08e4d868580fa0f087187cbe6707cecdf6d05f444ac4db2bfcb179b205a3dc44054aa915fe4d8af4fb3d96772358454c75c0ea0e31dc48991b436cec5a6418e990a8d7250c741fdebd57e52ecf86c5f2f83da7d2fe16fed55f6bba90d373c01bcdc01fa413d445f608a69690e647edaa3f8cbfcc9d2c45fc7858f4dbf756c0daffde362a65579c3d0a0f5f4d61b66ab55c47bca99acb18e8fd60c12c3a733139fce5982bf8ba2a4796eb14af4f2ba74873984a4a864232083b4647dfcb23591bdb2bb7b4b2965b6045304c60323744982652443c586132e4e2e8a884548617c8c4644e30b39c42234a07ec8a218a293212cc41986a4184da81aa574418285ec808a88e4649c7222818a885890a47c903f442ce4187fd018837e8cc420592cb108b39402489568a5cb142c31a888419c901f388d2c8a884490c8157c8c3b8842c8718506ed474c8cb1268485e8829014a48f2a52852e5eb01051118d9c8c711a991419b520d9f041fe202259c8213ed110c1fc8c49315aa8b1107dd4528c5faa46225dc417b09038a88c409c88554e6294224c48357c1c212261398ad010957e84c4186328b1e0402905d942d507ba88396019a950199beccf898bfd39911e30912928250122e2e00295a119501069489ad1cd10a3939f6e3ec923c9a79b21e8fd606b49b05708cb6906e03902123b627a1d3d79c0eab47604c5684b6754a5823b4201db8e5ac0ee5108b0a3135e473a56809dd68e766018b4172c324d464f48b3e1012896d9a2942d66d93cb2ce48c682fb79b1edd2dce528661b257960640466c4a403dd690dc89410ca771f487be19241b371efbd1bf743abd0759df749d5684c60c6186330a46da159d99b67265797cce887c562b1f6ded109b57052751919e9a5c5696912ad9626a1412dd301208a9ac4e54653464c680e41fce97049961541bac090b62065c829720a47e3fbbe8fe8cb0ea7fd711b7c2b222d445ec8a43da612ed6061899442d2f607ddfc1128467e60af20a770fe06c898beeab406444b373f048a90da5a9027dd7b4aeae6f7a3d35a10a15a90138288d02bc594af8030d58e9e826409d2854640a904c2708b51158a16b5a3a3138e744c09c92a64ad914b37646ddb6e6e4a72485966b02344146626830ca32c5736a86ddb9450ca71db867beb8063cb6a7e1649b7bfbfaa1456b2c8d77a70c0834cad878f0d726a830e84af81d74f6f6c702805ded3df2568c7a111d8afdf773f7c37187c1b10bc016daecd9b14b2bff730f8b8e52d7a938424956d4928dbde6cdd5a4b33506be1d52f4db2eb6f2fd4a298663c85d49665cead16471a715646012526514933bcf0cc2082d485c49c1f489d03988170519554d98e0e2b3160a87081a30524434ae843ac599233760a40c46c861301b3142a0ccb6933bba2e534e124c08cca49ce8010a9220ca15558a82bc8d01a0c62708071a2c0c701b3fa258693d230ab71562171468d3a98d184d41798a816158e6ca853359cf4c95980d965d1a5cc0ea52d3cb8e050b454d5757cc005bac4079713829997734b911e4595069c8a43ada1665142ab36ea450a0ee7917328cf2a92239408970d84ce86b30f332aa4926005e80b15d549a15039a3ced1e82c5b33a6194e9a04c470f21907e7ec8c3a17308be16146a16852d7755dd7755dd7a9505b68d2a5cab972e51c60a6a4a4a31a09aa637ed0303d51904638a9931c374e1652909c15c616a70d680c0953c4c8899015ba8eda740385c1ca89f4e264c08c47b5516b378c396766595a705b8d080ae3174add234afa254c680e506785d18019b501c58e1305195ee79ef194f073aa38310c0aa6a2684f37e4604307495fbad0d239e55440073da39d01e8ea8c296704b329dae4494690b3cc79bd1e2ac409130fec869f285e9054741d4b12cc9a4e08cc88ce8a25842edc6af680d9e76264e1458426b21f436e44603bda21eb42329cb35a45a686d9023a662dafbbac1dee4c0bebb8d6ca75ac82c09a7bf81eccf65bd12dc216d6bdb2f4701086f5ee3fcd758ceb98e7791dc418631ddb686a879f190e7c55a91eb2362aa6c326756373581980aefa9e0b5f9a72e327fc84a36a6ab869bd508796f3f013a6c24ff8098e32b154bfad37bfcefaee47db147addbddeedbc2d031cd5e2e647c3cd3dc3f11396c25258ead2a8ade162cdcce7ba4dbc7bf17e8b5f1abfb4198ea3c0178ec24f2b203377934a711c0593c1155197bcbfe1b14dfd8ab840a5c781ea92cb66c5a654ddf3a238cd3d8e7a4f039517685fa0ad5ac9e07ed8bee97ed8be7e1ea5a254607d1d5d5b5d3f2b034ab5fd6dba51b5828aa3b0148eaa20ba6d87c6dae068eab9b3de5a9a93b3c9546f32d4e4d584d6c30ebe955dddd55ab95a39ceabe09bdbc64d2bebf6de7b3bd8ace03af6bddf2af77d5eddffbd75b12c08daa71606722ba39b276c76e9787605825bb69fad0fb8e23a79e6bbbc6d56762907f37bf9b737b7eeb307d0821be20bec6ff661b582ed3b6e65dfc7f2ecb3ea0c37f7def69b5b09fba0c620d3cdcdcd729385691d045db4676bb3b5d665611544fd8f736d5f5ddcaf5c319c5d9625088a7fbf2d72b3d22ba2c577de361365d7d91eb4b12ec41561c1fd80b9b2836f9a28410f7c0b6ee6b15a016863b5562beb5fd7759d8d55101cdfb6a56912521b7673776517c5232a85a1bab920000e62ba2841895901648381e809d15454d012a5b5d25a6badb4d64a9378d96ab590983aad45f9f4b06a1294de5abf1295e2d09b7389dbeffd12b4d3129ab572fa59ee6ef76badb5726f7eaeae69eff26ef7de5b83aaeaf7de7befbd3e36f745b6372e230c338c4f7694be711e3aad412541f54821c4049c041338a06cb9424850839ad16fa735a812ba19a20610ba19020a548b510714076408553070118f66109f4ccd96d4708484a144c28f1b88c6221c514c40717a797241063da9a061ccb8c5cb98058b18c314120526e450930c212a8028b530ba20342aa1419e208238c6e9c50ca7174f9911852fa408342ca1128f38e1a164e431848946bee082f8238511c909630b19a20d314050d28345090a72079812b44c89a10a14159ec62145c62e47e40c1ea2d39048e606b9828411840f56480213694952fce4b0810da3112baf28a29628928611524592900f302c7041e104b261964353acaaa983b18798f1d545862b240952c4265223151232454dc70b433b5ae43861067986b002892c05242bc61a64c6d90db52c648c8a28a489f825097963092ac8061f1897e8b85143dcf233a280419a70c403b1ca111eb10987f1a886114a1512c813d2c72908911166348a50e4820a640f1b4423bcf021858cb0186918d9004718316a4b07328c00030f14d9c334222189493dc4212b8c1e048d294a1095802083a9850f13076490aa2b5cc6d80c39a6c4a525311c79521a3ff8618548a4c231e260c2d8738a4c8ab8e0a0888a3263645e461858c81c53c41e4cc6a5a6314a883805847cd10259c2c642a3d3c6349a7e6e8831ca408485d885480a51aa2a1fed3c5b073fd7cd5a14d6a29b64733a269bd36473429e657f97eed265f2429e5fb6ab15d83aae42411667680b2be6ea1049067398737347835ba64cc9c1fe9e06953cbb76b3ec367fb3993821faed66ed6696599cee6b4c926a505db239660d2a7ff4fb36385159fafd2a64735cfd7e6502d4efd71fb508f3fcaa2034b865ca94453033dba22ba20615f5fb7907e4e609afee1a74455cce3f8b739bb209329afcca270d0d474343f3f945934f1a9a2ca3a1a1c9b0fada34f5b5f3f6334f6d8ef9f5196e6e9a9f793a93734feec93db9270718c4f4faa2d31a142b5b687ede9befed7d8d4bc7ecfe7b0ff49abb9cbd5abff77607769ca73337b7ed3277dfe940cdae799dbf86ff88bb5da696b19ff6ec32efcc87793f8b6b9f1aaec19dc9bf5afdae613dabe39e65b278cdb37e6686b3369aa796dacd4d1aaf66b59f8666ff36b3edfa2ceefdcaa563d9e2841de466f7f83dd8ff3ccef5f69500b4b78eedbd5fc3b696b1b786699fbdb79659d8fe92a575d6ac6dd3f5b3fe63adb86d95bbeb988ee9988e7952a214f502745a8b02eb6077efbd3a1ee8d8d39af599a5bfef6003c3fb0bd40efe089b7b720fdef859f8599af5f9859fa5f3a9c3a71deb1d9c5fb502fd39cbba59ff8465710d6e67991ee83a1a83f0f58fb0f973f5583aaf325fad586f6e7a4568fcd5957b2a88cab78f9b5ec7fbaa7a3f806019965ff9ccaf2ccbb09c35507d699d6bded35a6b1a57aec9b6be724fb967ece7058a1494252840506a4f9edc7bef35f7779f769cbe96d1efc38dd2fa94d25e294869addb56b906b7d70b6cf4bbc7187ff8f1c77a56f838ef67cd7cd525742c07b3e5e64c5ee99c73b6d6da99991773b7ab99196e6ece5a599d437ec2eba02d373602cab0fccab00c03323f0c24fb3c597dad80641fff7ebba8c5d979af70cef59573eec93db927f7006ddb7d79c2f4a4c6139f4e804e6b4eb23ce90be8b4e624c8bbdf99956f9bbffadf67ea68d001aa2fb8f5f6aff213d6d432125f8bf5a0f7fa57f5f430e7f1ec7eebd1bc8731375b1d7fde7f2f7233cf7ccb45edf7f9695cd47e98314d947d631b189bc54f78dd7b13839a9b28bb177eaeba84b9a31372b36e0fbe0962eeefc775ead7f77805c2ce0d6deb21e5fc638884ca9aa6653d64d500b3bfbbcfb9c0ed123d97fdea02adecce7c1ca761d8a5a33916c761eeb187ab876ba843ccd55de2b25aab6156cbe8e6b5a1b5f639edd3cd5bf17bd5622d0baaf63b7ebb7a6dbd5dfdbecaa3639d6cc565d9ca344ccbf47d10b4f606d5d070a0ee2f57bf65391a5bb30daaddb7ee6f45359c9b26ca9db98e596b35ad8718637c5fc3c07a06dda0ba1501e10f97015c370a2728af26f1ddbc7d98839f5d9804c6fc35e80a1f739d6a0cba9e7939e2629707b4712628aff85ce1e9a1cda58d7d2a295c69eef4044a12ba12d8cbfd8bc0d7951878aedcfd4769f7dbe2d88eb770ec8f4b48ad8872687b4f3dcfdafbdee7ddf2bcffbe6dbbb5df782784f446069e18b674eec118a6be90cb9ac4bef6bfec6d8bd301fcaf04c775409defc1e7f8fede2cbf040057da722bb9e7a60ef8dfdbaf55a1aaf2145eef0290eb1fa639f86dce062ce628e5aa8e7d70ab5bfd6a051ba8bd5f5d01cae912e07fdcc30515dbb0d3177cb687df046a073fc480d23a7eae6fbdea0b2a1d6131df9c760e0845b75befbdf5524e6d49637f16c7da10a58d6d9f6fce45efbd76e3e1aeb5af63cb1a9b524a6928857669c22e5f60a97b29a594526b29a5f4d27be9fd4bafb596725ec6c8b0cfe6d84e71deb4c143ac2d6515b695258ccddbecceb7557a57f46d0efd117723f2a1aa2d99d5a49e6a5235a8964a123a26b4b3de083dd7eb2310fec98120d7320e82af3564d87a8655a87c6d1302082805f48371b40f9880e9ae4e6b4c9e421dde78bddd34cf304de2a311dcafca60b9aaec7e80599c57b9629bac7e71c9a214d07e3d8cb1059a7b58bd8e7eee35e77ef59d79a2872b1d9ac81de4f6e3d56e209446f5aded50d2b6f971967e5982103dadaa377ec384f426dc1dca20dbc4d93eefd67f1b5518d6fc7d96f53adcaf38f72ceb32f3899e1fa4da153ed539bb4ce41e7e6f47dc4f96eb75519630acac5b9a9559d90d5985cd98ca17174b6d2c00197a21bf70546d0a502d2a0bcd3c747db47f1d6773b6afb7aaabb7bdfd3857ab73ed32b6ef6fa0ab955bfc8dcdc18fd3b74fca9094a06a010ad0cebd8757df8fb0dcb576f54d514d3de9dbe7d2fbae8467ab5d81cfb7ddda3c18e1b5d72471a277b8e397863067f3805fe77bee3f4ef177663e815dd4dbe99db538f62f94d638aa827f776efdd065963d7c7d5d2baa31b06dbffa1537c35fad56abef56dffd8aeff410fc1137ef74ec3251f68fdbd8bd3b61b5573e8efb388cb98712b463ee017c1dfcdb63fef7773ae732f389ee753fe2ee74cf6522f7ce3ee732b74e3beb0674725aa6659ec763611c7e9c3d6eb67a186a988eede0a78aaa632a68238475e336ce01eb596b39aec366d6eb3df7f1ee37d7ab82d86a50bf42fddeafe777f6cbb99dbe5dced5e50eb6fd0b44bfa11553a70c9ebf31b4a425a6a627a98d6eb02f8db6699bb6c932345ad21253d39394f6b9524f344cc752ecdd2a6d6e1e871c83399c629365766d9536378fa363da87b69b76eb69499ba6631ab66967372d6ddfa7d12c2d0c6925c871b9756c4a29a437e66df2e995d35a796b6f924cfeb0666eeef4b0f2ecfa50d492b4a8840cd9535a57a4090023170000280c0805c4223992c420148eea0314800b6c9e3a5c442820cb02711404410cc4300c03310cc3000c023008400c7206198ebd0011e3f2fbf082e744f375ab1e2ace8e0608543744b8cc64ef6ced1f77cda025d48224b510540da40b806cc4fd3746d030ab2272a36ccf0e8265a69b5cfc9f0f747372fcbdff773594a578f6110ca1449fd5dcec143c0bdf49d2ef0255c8ac116798824812c0bdd2d1c6313b8c33fa032f989eb2efc433a74f97e93506c0bf9392d8faae3b9b9b69fc03923df692f7369ed564523af72cbd5981abe8770e3d41b815bcf364bfbd17897867ba09b635f9ed93b879018af5d841a2362b44448e925a4f6d82a5738be25962bfbc07ac1ced743cdd825a943215c69ed8e16c85116f05204f26dd6678b0bdf36cdb33ffe56c45299213d5705bb4c3d1ca88820095140fe210512f018c29c468264c1e4af6bf1d559cfc3165a48cdbc7ad4bf6621cdb6932ddec4e8a15aeed3b2d804447802d275ec65d6e8165d8931ca89583bf88b1a285ba8bf07cdfb859a03a813b9f6cb061cd6834371000b524cf5593d43a3091c449197f04d21696895ab6fc4eabc4f004c1b277c109f4065a59d575d51df9281a31f04a97232a0aa8f67b6ab7e7101b6d44eb35a1481a8f80d09043f32e89b94cfefea95fe27c53e7b2f6b7f9cce81d9695568c5aa0fae8a061e6c81ce164509fceb0f8bee50504d7d63bacb5303d2a71d44a5733d3ec4089aa228dd938777506e6dc7898ff332b16a70f9870b4a67ab8865f4d89ead08303731442173377179ec6f46b4c1fddfdcbd2ff826c8a6644f3a984d3c05c927bb88afdca27bbbbd0752510c248c36d8341d3333180a073df6724645dbd2b3ee768d7362cf48a81d9a2fdc5ac60f23dc9e44671a811a5a141e9c6fe9057b7e976e690de62c01036a995ecbc552b905420a2841686455d5e8133d00e5beb3c5b236e0d1dfd843cc9e5a5a1e6ec02d3bf2f48075ea03a18639a1bcb56c10af364b3fa398c3d6bae17b008f78c355d8b3ea01e158b711cb0cace4201ee85b186b3a68fa9fc15573032d7f7e2d85e9999c9aa8ce18f68b016c19d3ff754d5dbbf14a4258eab4ab09f5c6d758ddb65e31df8eb2538047d8673be8be9d913ed94b50458077dad8ddbeb11781a03ff3cb202a5a0b9577b7b8287cfcab194d47020fddd9a34e14e502789e75ceccd7d225bc06cd3b5a395c805590f74b6e76313fc6c709613dc25bbad12b8888f91a23098d2342904618b6fa836d99103151bbeb2a90415b577742cc9a592c0350adf53020bfd88f64c8a9036e2a74582d153b9869737547df30409a224e9d96f7738ece148d71e81d9f2a1e04ee8fd30c2401f4dd09c22c0e723967b74694f19c102530885185c7717aa9bb465b0dc5ddd71107390eb18996c60b24a1d7fc9a68e7c9b43a6196b869f5c725743af04d166a043f8ecc7572d56668763e8995b5122b463a3b494150fa9bcb54e09df323b90bce21101c45d98cdaf8398e89aa24ea83a49b566e67a19136aa191276dd57da09bb98cf06fe8362ec0e1703e6b048f2b31d1d3168e458fc9e0564fd8745f721fbb15b5923bd2b95a7c26fe2c239be3788d39b540c00976b560ea6813f9a76dc13c9ba619487a35092dce44c2703e4eca7bd8ed977ac0c698cd2b3f79aea67b66d5dfb8851b62faa7d7fe11c25b67ae4569c094e32d299059bf448fd69d1c5a768434f22f3260ef327cc328a4b9f092f7553da4afd422f058dea42f6a24f49a256b14dda8853587ee199dfce60509093895053ab69d1c14af90c60d0c852e2f551ddb18bff2291ed304dec4a84618022b33e0ed3fcec75a0d3e6777bfc37bc18eafaa68aa475cdc41827be0c671b79fefff4455a8b52d43b9b31f69b6827aa5a89a401360b6d70f1f0a5c7bce8a93a36f33f581c843acb3dc90108761e7dc6dbc530a959c128c271d7ea80ba1f46f10fdab5045d1055fe74d623279fd43618b7f041b0d47d11035e89e7e9a0191e2d36603e32c3e0022ee456ee1332dbb2404a48d01d2db83e70063b6a77dc16c4f9d8ed3b0d6eed16d4dce48d86a80fb89d04f66688352bfb2620042a022c1df5409d4e198cc9c1886d653a21a5e70482c0ecca38d6851d39fc098269c9c4c741b1d1834f5a86795f830d83dea895fa4111161dce33ada67289832e623815ab55e1feea504475bc1bc65f831eec6687a7bed0083f839065998bcd978afc543620e7bfcdb009d6f16c6d127bcb10859a957702828f10621b4361cf3e3875dc05e8505dbcaaab8f6dc454b97b3f812c61957229275df3a7d91a21358e6b0ad2e64531b841c0e5dc93ddfe450c6db45734b5b868a850246e2bf4ca84d30b7f5b7685b4d202ebf8751772b231a3f6ac2292f716e58e9fca6f5c598e06c85aa981405a349000403124790e08d14ca0d6bda9b1b36ff0fc11bb2473ea5d0e17805547c97284583a890bebd73c8406d38cb4594be8fb20eafd4c8ddac547e5e41769c7c969a2b47832ff484a2680b786304f26b6541c9deec6a62b13b0a11a59e1661a6a4c9a30ce8f5fc3a3df6163590d16675512dd79507a53fe88fd1d09a8e019b80d038ac8a88108d0741f50e81b293b362b644a0cc103e4bce6a433547dfa8d90e974952a4cb3af60d90fa03d844fb10e9fd6f4979b41b615a9c4d1b61061bb58579f821bbd702f0d211ea980007af71d346ac701244ded145acc40861fa3ec1b66f5aceae2e92b20b0fd660cfd25a9f81cbe7272da8d063ef548bae23c230d87e0b272fefbe66543ed13110f0d9d701a7c401eecc69708cfe9c427f18be4cac8e05fc71d95ac45a089ae484a91dae9eda1ea7b49ae0262cafcaf650e720c8bc0189338f98c0f57a6468a26188c976fb2daa69ef5c48ff9250e82faacd9919c79ec5f9615097312643e715503fac6026d5e579b0bce07c7e94cce2bdaa91605da42cf83ac8660520172cda853cebbb3d7d291cdae41aa67c3cc7b081e2505a5f05fc9d36b44ea31c08c5d830f67c92847463f1a7efc2145cad83c0c729b7f88f71e11bb9842ab6bc8e8f0866239c8dfd66c25f0e7a8a67f0096c37dbc10626b1dccc151e1b5a83363288141b982c70aa0537942eda9276e98bbf4573d5bce0eb854a4625784156415e6082c52a318f6d29e1c53451a23ea899902cc7974da179e2a22e15f31e6ac31b10f4974552bedf2eeb453a01354d067ef75200c092019488310079a3a8bef1c8bd52d38049d2744796602e9b6bf2154f156d269c98d22d86655ea1e38cc8fcf34fec43fc8df5ce40b53e6b9c138f6704b3f540042654bbd804ddba08dea2d272509a5be71ad619dbe2067b98b3e25ed99c4534414f24fc5a32d67825e43444d7817f1f928ed106979e65af5cfde3551c9cd2a8b5fd38b7efcf268a9e9211741e808c64c80dcf33ff1391b6f4a54c5c481e3645089362234a7b487e38fee30042d356a88c2685e42dbe1275e267d06669a7846be7ea1777c43a61f5b6df42c0ecbe60dc21757464bc4c36caf45aa8002d781ff58c8ad1b73866e8cde85bc0d2a61004a7cf45c2541776a522c70396acd66c487bc1278ace3d057bc5fb0dc86742e2ce2b2e75e978b538de86e19d95fadef881515896034611c80c05599319abc0d95ba4b67a2af0a4c1dbe10e496b4cb86f040bfcbd093d9f328ab59d3e9ae09c73aa62fcd21c5289e840aa6909986e4370905fdedde5c09655860efc8292722537ce744ad506dcfb8231d81b30cf9466cd01ef18a9dd657dda2a2f6ff3f0af1b6f3febf40ff2a566f27e6c0401abf8975d56415a8bfba87baeaf96f742e72c16334b5d4163b366d2e024314e02cd6820137c527455c0256b8015c6a5c3f809a659423fdafea5b56724ac545d003edf2de1b1e01ebab468d080dd55c5eb562f9347e1d2822c219a160bf07c27364004d224272aa44bdbbe06eacd8b5e6c63f90f5498838a0f01e7c5fd027260a4b59c6dfd94440c4b780b18acd08d51807f45c70cebed4ca6da40d1bab45145ffc5d6a08b8d900ecb9a49b0f35546f220c10f98cafca7261449f08aeef0e2be8c15c8602d62be6b9256a877d082422f2283a3ff6845478d467cce7b86dedeaa1a1f1aa861dfb973fa289fe54932eb6b23711b65b1eb17dc2dfca155542af4d06d3e14d2ca9a4c40e56b91280415e7c8f8257a784dfd77f58a9ac863ef3cb3511db35f894425ac9f1f82447abd0d31f5de9f939be42cf9f4f184fbaa99bca33dab5a50402c12ab62a1e5f24662d29fc53038300f035dd680807d1e79f9a64b7c2ab8ef31c69482ebac6d38dbad7166c170dc38641aec83bb8dafbde5c620464621fba855b0d60732b0f0a532e18f073439c1bd87949fb160e8cbb59a125161b29df07590639c4ba53892d7db8c5af3720cd8f4df7e169415e0730002008a17191e68b27f7e941bacf02b56cafab1247337497b492e15f3a44150c7eae9098f68119a0250486c7979b4e7894309201f54b9f907a879dc8155af29b410a8f4e0ad9e290b1cb7e7c291205d304e2a8c5b406221f50bb731fea1c42ad2b82d5d3ff65112c506a09f9ca834e437cb58bdfa2e6c5fa968ae24d06eb1722b00be55940439e068cda2863d084c9a186778330bb0a231f4b096a4ca1daf916981f0e4234d43fa79246b0a40e18ccd20d0f0562e7b33b8ab97c1ddc073605738c8954d41883769b47e23d529da194c9ea29504fe52961da1968592e345ed180991f322c2bdd4f4ef520c711786aba18f48fe956cf5cdcd8e2eaced3890c5b2161c9b26c56026e0745e0c25e833a326aff3c85649cd0c6d9afc3a35b329d4198f4301998a6928d02679d3bfe9dafabf840c8b0dc92f4ad5fdba9e26452696d9e9b1327baa0620c56a4439a58d4a3dc1479067b79436fc27c7e0057316238c107e4d76a9b30200b3369dfd9a848bdbec18e6602db63569f2b091415987991138ca6f26f2c45da32019e751673573e78b8a26f9e5f66d9f67d37d9d98083f0ed40a9dcdef5652f40b7a280d0453500baddd453cfd5737f4eb681bcc4393428b0cf2206c81b9769c3a628e4d3479bb31d7d5e720ca179534106140018dbe67d28cff37854774381cba596fedab3740a03b6aa26476b3e3b083e48a58d90d0a83cca0d27305792ee21edfd48d254622ef5cc8ce3a0f11a2bb4d2fced46b090b83fff766d42c32c22a2fc7f0802df7a2592c307d22e5622272be4a6480c30a66b650697de4a5a9c917720c9889f920b12313f4c91bbaa7d0d351922b1d83cb9e937e6a38fc3f04adac1ffd5e4d436ef5e9440146ef607eee54d94bcf921ef5bef155c6d2eb72d9b05e9462fdd28ce4581b85379752c2022090caf78d9c6071db55d0dfb60eb49627f4fba5447461fa73fe4022c0237f915d9b464ea804a73343c4ba20ff2fd617f128cd601a5994f4ae8b28172d188938b8af53d3ee4ad4f25ca7f5f065e5a350a2aaca716bf47cbc632b46eb022a407c6c5225beb2a27cd494da0324c5584da9354a390dd506c8b623b68ab654ae20c3b5c524714f97f4596ce3fc9e63289b9322e586aabc130e986b703cd318cd364ae7aa411ec8ca8c0dd093c72edd3e927556ff084ba808b44c07300fe2491f464b1c45f3c60435add20a011fcfdb6fa9bdb720f15000b9c563705a8b104f83952af0aa9a8dce9025a2ad9626830aebe128256e0c4ff5fbbf020e914325f0b977204de8af47b6d21e25fad2cf9e19f804ed35522194cff47bb8642e09a567d5225bc4072871d205bd4a001bfecd0d2ddb9a338e8819d6716cb3c9ee3bdb64a35b303fd8cc5da167df256e32dff13af156ea127872c4e4132dba6632cfe6f6e39576efaf44200c9f5c0f74291e0ecc9ee5e14b72617ccb78625c6a8492dc2f33c8fbd96195dece0a953ffb4574b2cc98ba09f69effc7348af68d8b52b4545379428b88536e79f7ad3a3b2cf0eaec072e52d9f03c699ab41f63fad818cd7bb1cbc523299ca0fbe5872ee2bdea9a68807abaa3ef0fef43a6eaef8a5201005020e2b0f797355f470c6c54e2fd9794587fbfbfd6012f39279b8eb2231443381aade54719c1820e873552cd72bb41eff20b22f6931b0f253a0a759869ca33acc47ef57b2503c362f8da203073e60e34eb8744f1310ac9d965cb92f1f074b2862f162ed1a1095b642b246f8fe3d8e610de066fc490aae0e72e4a13cd57ce54f0cb8a3078cba789a5594a9bac4070e91073f9da21dd63446566bd0af9ab4971917e756814bcc2cd177d1f01ef19ff3b91048760e368f3aa1d11b128ea59fd8c790f66691ee72f89f3d9c9c25cfccf215566ce52c43194bf29612882df8430b157630666de6a88d5b8f8c4fc0362bb184644c7aec9cd51e1e0d2656c17ee0bb0a392180ff9544b0b3f8d2046e4331821f1360ab5a21552a212bdc69698a2b8e951682e67928acae80260e39e19a4b61b1ae3b23cf981a51c12134f2bd518e15edff931085440b7f0e05815d35ef282a2577f39338a55a11651db331d6b98a3185ae98c5f6de926e08501d2a185202cff25fe00515eb31f40da201b44561000b0acd925ed4f8212c39214789c40363371627ce68f106ed0f0834081d59783d8e6eefc38e071a0ff679a352e1a135b6d89eca517b1e50727bd78bd0c67a16a4a9ebe893c5f066f378d22351c34702ef6d12e119be300dd404252f7a3ab11c2cd712e4712f86059890bc862574a04cea8d756e6fe56674b05a1ce195e94417c636d34faf3e36a5920d15cbb780fdfe7cd3058ee9126c797631a12e0f058697d9d6c1e0b992dc28cf7df79fc0dd92cd57f07e43f79fed6376c06cc603de48bb4b4d20a3407f22258d2e0e2624c53be25b6dd4d49bb81df183e62902433b2dfc63017542d8843fbc0510e8881121ff432fab2a3d3691cfe97216102fae49c85143869a2accf9b0fdc14dd01f1e0b79e90110c31df53617c1049cc511e06dc4d2cabeeef69c326ef12cad1078e262de2de093144936cb0bf3325dab86806b736802d65dca812097cff0bac63ddbd3f4673fde1dab0cd58643ca7132b04a98cfdad301f625f95a119f5e74824c1e9fb8290a474654c9d05d9506af1130da6a9626d964a69de2eb915ccfd3d3a7d86af3a5c3beca0018f188c3c1cf2c9d3453b88685eac02b5cb1513746cbacd8ba07212d1a055501491dcb0b2919b5992e1b06c7171284d0b56a57110fd27b8b2c967e62bbf00ddf0f730dfd65363cb9d2acce7897e411a626c79ea797f4b77cfb19e11ad75ea0c16d8d305dc7c8874f6335f6986cc1a68cbdda235b728f5c5174a31be5bbe96fa889f660e7b4c61dd5bbb3b03642984eb9c5588ef9433852d7ff331dd5b24009b4c1d9f268ccd80fa495425648000eb68e80df9d63bd004b00ae4b4d69ec2022880910965456e58aa22808a4bd59d461e5e6acd3ca22a273b49424ed9d5dca60cbb9e565916d1155084de857fe3ed283c209a974830169fa914a787b63761dcf4cce64609dd39b933111b45ad8c8b00cac5849acb9e9da220210c8e9de9564da3acecffc8a0688ed274487cac62882e639738b3d01cffed28ec5c8ab068e50068d1cd04f03a5b1cd31007dadf9e67390f2770e397d12e70b90d2191a5ee08caa36db5342ca61ed010b6d1fe61f25e0126f82f12ddcbfb32cd4ba3569eb94bf10aeb6c27c56c5302cf84516fcf691997b34a29eb3038f94fc2abeecc68db887288bc4fe4422ab0d99993630f387da932e2e29ec2804e516dc2e1923c61044648a580f97cb63d086a4ba1be71d54afd4c755d44e0b5a1dd447280003dfb78f02df999c22c2b81009a69406cac1393825f916c10278bde5cd14f2d7a78bf36bc923a901b417268a9ce4bedc2b53c1c019a1d62da01c5463283de3b6fe85ae312f86a63a7047656cd8d406d69f8904a0b8f5d5f34a2960c4b5ceefe80946e90106a038db49242c99ad3aa3a58b2aebf913c97e16c2aa52cec4ab280ae288c90c36a78564145a28182f3ec9f357a885c143372867c5261d6c257d6ac4104253bcf5856e7d6ec19e5c3e107910500a08563bf31fca6f230b9b480d84f9a0d8da9a4e188ac026588aff5aeb1cb0ab972338da98cd619fcf1eea0549845d4ac9d38fd0d0da97259cb9b83ae376f343314ddfe328b327b19c1aaa411f6d5e1283d66a8f7a599482fc9deda8e59822e5c378772a95287009aa195045dcc7d97137e42ecd07d4c1cb942e4cdc2a5ca8b96614802818fd11a7f40f92585642de8da5eb7d2ee1d200c5faca557fee998b7732f9e3876b0649a284f3656e035fd3272053eee2a8f96c0d2f9054060cb53d7c34390ae05214888aa9d548f850f0ac9f0bced8935c11dac2bcdf6158daf6b305a6eb28237bc86b6e3fc60548f82221287f58955cb4a5a2425d770dcfc6a291356ca2d7d5634db4a0145fdac2a4be8797e9d79d179b8112fdf9a5f2d548d40227f3ce428ad326a096c60534ecd04ee1a107cdf060f66bce78f1db7b1241d59bf5a5e28578493d8c4796e1688e1442ebe9e177cfb6122bc1ff6e3d0d572ece08141c4abdf3bc86e5aa9d931b311f97cf26db8b615494ac108ba5a96086faadf72c61b9e0ff26d2bd064e55f8b3cccae23d906bc966575196d4ae8ce09fcaf55606ac08240015cf9a72fdcd429ad163a597d91b3ba2e88b44a1826e1daa7b25aba4f123e2b36226891c477b060002a5e4f61b5acd7b11a8d481bf1e5da6e755de2a516683cdc65a835980d02e1c6e2073c3464666919a301c635301f8f7bdd2f26794f472df4802d6242c141984155831cd25794b0a3230377ffacbae001a25186246eb9072a0a4e414c3cdda95a9a922204351d3429ef24fafba92fb6b5986d9b5de14e48c2d39f8043f4c97458516be4cdc3480a87998b4f9b17b1e1d52c87030531156a77d3fd83ae0bfede010bb3be78a5b22fb29e05b1a3e9850ca8f31ac86c5d70d836ef24eb792be8a54d6abcc4b55994c6e5894e0528d342bffa903435824742cb01f462c2791f404a10589c34b02c1b8335b0d40c1e4c3f1ceca2e77b430388c61e6dc806320cf2cb2b6c3ddf58d77eeae21b6611c1639626b3d95c60a11e1b7142ca985f4d93671ae20542c1127828410d5cf71eb48c236cee5f5c25610f5802be28835214eac402e87e95a837a26731394b184b8f20bad1f2433707e214bf385d13db855f3ee11bc04cc3ec01167d7a2b795ba00081d8f9a8fe00964217cc314a49d4a7592fbd9ae33ea136ae15af658083754a00dbc44b2fab3515afd3fecd7d250058ca009b64a7a394c959e8464f5f34aa73a08415c83df0cbf326f5087a80bdf9573abfb2b2b83581efb8847b4173dbcca11d220d9ceed1bb21a281dec79c6c3580a15167ce3e15276b9c78868516c014b3bf12698c1b80406e8813aceaf213a2c5c5305fe47d6a77b362e02fb050b74b7b0530d5c84ad42ac7da5f7eb2d838fefa155efdc980b83a22e2a961fe8a235f2a18876e6cc103a64b20afb6ade91e18e6d6fc2bd82a2881efc41481482ac848de0499270efb9542550931116503ed4dc6bc670f2d619d81267b76e359c06e00eacff875333c9111dc9229c8497a6627d9fdb7b829bf1207a46a59fb7fe2b02b08f3e1a958c012e5577a65a6adf40fc97a44c9afc44636beb2e4772c870e523574aea8242e785f9c24fe059152b373981efd10ddd301b71ef41ee51a9d59dbe1f14170c197e668c969b5ffe17771f29a3c5bab6f3bd969a9f40a5e62bfc332631cd86a0aafd474fa58c2f1dccff5954a390800eecb1d44882bdf17b4e2a1466a392344061e86dbd9576a0c21bf13e23cc142897f9e407de5aee82461f7e10ed672e55e3f482a5f59d84547967fa9013acdb95deb56e4c81322e86d0b6356acefbc60b007ea5d71193ed20d4dec6ee1374f001e9fbd69efbf2f6c68bb3f59536e75cdf0b622aba5c2c2a92f0a49fe30c55860e520dfbc6a531a3b650553ba6d2d15020207e40f8aec8145e7f1da1595aa16e529827c0bdbee505ab3680830dc0d92ba7fb03681b8e3041e66537a0c36805339cfbcfc01af46634e90553c07698612128ac82d2b554c6351a189b1bfa8ef388030efa8c3ef045345956d0e60b44d804824b3aceef9b302ecbff5b8c00a50e9171967662ca249aadea98590d688adf08db47110e12eb4f728ba662287e9f5b65d3381f26e2effca9bbbfe0f04dcbe4a8bdbb3faaefb8c8da8c3ba86d3f324720fe9bd66e2d564c733b72f6526f2ed32a2800befbc42611ca5579720a85b509b57684f5ed4877c419795e8ee2979027d33884c3bfc7ae23c126acd9f0b993817f2913a3d7f045ce071f88273402a62cbc41b590c9bce03c5da71bf0b9be6e88799e39e4120506c120718db303e308ff80a89f6d0b4c3ec963385664693d0472a1462854960b22f798b6f0588955a08f3218c7b9d24ca5b7f7605ee0fa8b9ebfda6348edd03eb8db7e3f6c78fda08c57d0285a1b8f718415681bbe591841bb69fca6a9402a2a5868e9e9a284c072e9695d890a90c76092bbc7684e2fdd72295575c693183d4a2dfa972d6891c9e453b7004e020d02bb173638b87bc25f0917742c1436f8a8cbb03d46fc6f95f5ba0bd264c24fbe47313ce518bf396926ce93689cfb4145029ba1e1bd3d8e6502b77782038a766e95383b6882b093d1993f7fc6063ae3381eab4adc1de0042912864b2aa9af856be50ff445711a82247d412e6b4c472dd53c6014b42568fe7f9ec94a4650de10b1b4f917f79bf42d784834a9c752e8b11e5af789df2a1779d249fdbccf89bf301a60c6a419788b41d8508f22fb3a8eec6b1f1d7cbd74334e6bc18d472e7d3a154b2130ea2849354e4a37e30b257bed5c5842d34cb32119a9f2d0b216c4d1c1c3fa7b75f045d7f0b27682457c2f4fb778b630ac9787bb9405f56b7008de2ad3aabe40f2cbed20f76e0b54ce3d17766b4d0f98bc1c90de08217fe135b2ca5f6928cac88185a35cbd0d9782c8d17832964dce212506118f361e674e7a9b30018e2f4d5486cecf910a27fccfdee4dff2bf5970f932b5c4e436ce79ca7f39f97496a9ddefc596adf816af1e0af8e4ef6f762824175c5d4622230b887a99621ac3395323a12c41aeb7622b1f1c4746714ab8af42e26f58d48d65c41ba21e94184846943f14dda9183c6a91f0c1ff1ee9eaeea81dc55594a4cf4286e6af065e0664456e964aff7d6da6bf989be30dc453345615ec82f86c0a57858df1b75d964f07b7e382803714eb1a0f5a4849bf3e290543209b8be20d32607d8a0419f1ea160893d99230fc6104a2ed61a55d05eaf1d74f086d3b93f5bcace3a8994a138a80a2c862102a0659e351dd8c34867298e57a9e16eddd498956419ea248d6102536bcbbf9593d46f09c70d6ecd84fc9506a36cc54e39980a9e37470831915d47e5af29e0b132f2fb5dcfdf2ef569ef11403696d3fe65590bc7d258008b810e3464d14509c667db99fb87d5b5727a24ea8dcecde2e0f65018d91d648d9e88b40e9e837bc5221b3fd8c37d9c4c8ca98ea2e620e8548f27cbaf3041664d936edefc1e6e3d7802358a10d9c3b4635d8349f3958d95415b3d3c09a0229d67abcf4604eed93c1dc4d107d6b13f6935c7ec124ea080084c349373da28fe861acbf053a2da1e0cc81340fb295100d9d03ba3069c699321f61e0649173c5ba343c662729568ab0faa939cc57ae1d3353ab3efcd3a78f29689cc9c92f016c8c82d63df8a27868dde18c8f466ec1b053125e0f1914d117cf822904f6e06f4c81973a2a42d5a6218f5089b31e5a62d6646069f89ca3cfe9188a69b58177e81ff592ccf8e1986e39913e80469517895ee8e014caec57283359221b984f036a4208d1e022dc5ed471faa5efc194a9506a866a3708485d00fb272606777e1004f065af9d27526f9b3f32c21c88206339cb0a070608e16f8c7fca7d9ba8355330cd3c208c23fbe5ceae1ae53180c65e929a4d63ba0ec2f8ac45eedc69269000404a8a08b8cd80b010409d9f2145b602e3881308d2063bc48ec3395fcdb9060076a3f523b39a5e5caab7517296f65e29194e630f40a100336a932d724519ee005c601665c614788ed92a7f03329ffc92776552862151faecaecc1372396edfacb781367a98e81a92d3387c794acfeb33b367d4d5b178828323a5219a2c4b4c6ca62babea705e7413b985f8e0cda0481b56a77a1eece50f861e9f96a64948597d5e3c621ee9cfed43677344779d9e1a9e7c23a5166aaf70fd86f275392d884521aaed95d8b2e1cae97146024c1f3f7b283c298f92d914c8b037eaa7badb599fdf85de2c1bff9cc42bebbd2037fbfdd7f36b6a7b86b4ca78efe1bd4f9edcbb3fa8eada3a63049f1d210565d63130d13942adda9197b98b2471cb8b33fa6fa5e4ea3972011caf3804d0928e3e30a40700388ebf0c05122f8b986b9012f8c2fc23d0c0e86db6520a08b83c7dbad37273602220e0752188c3fcc7b2c516d3f87637adf124a14b4bd8ac55a01fa527f93a6c5101578cf0532fe05324868fd9536e5d5c5118ec5adcd65aa50a820ed826c819a8b9c260fa0e2b2e7689faa0592b7b91bbf2b40fb98b55ec6a2531edb6faa2e048503d77613b105433f01c8e069dfac71987730a6ff499305ce12c2408846904480285f0cca9414c80751a0ff51a28082f635f76ce19a89e273efcb034c28f12dde25a0512e0614184ac58e14e882701f810ce4eff5746f34758f7667557f6ca9939d8fc071ecce04e1f36c1d48aefddc557f830438b2c78dc2c479b24573f170e14fae8f3373db7f6c829c87bacbdcc3bd0485ec905e8ea622c810845bab411d592f068e2c059510abc8ae4103a2afb4f5c4a11ac6f8dc318e38f5b0996cc61f5a555075b859698b19906346b4cf50a5cf104b5a7b89b6659be92cc8a04d9088248cac336844930658a486467cce9f2b6dc226b88c42ab2a8994e230b8fd119018e5d453c8b527e0b2c42625ed46991b85eea5ea90aa833f73fc86cd2ce5c70d7307f2e653d8a61ab2d2ac85f63d22c814d412c2c7cdfd4079efff0a75edbed93d3b01b6264973dad09bbe02dce6ed3db2054f45ccddc6d5043d12e70aa10e7017fbc8958a385ebc2f5f43242517beb05cad60ed9f77e3a704c7d52176250c659afadf760946c693d77e82fd98c6262ade9c7f43629a6813d546e32d6f26fcd6c3255ac2d16353b501e2111072bb5d41056f9cbc40dd38ea603fd593c6e6ce2260e534beaee9e5b38871caba6113d3ba1c46bb20f195f069735f3bd40866e64f2b51f9a07082805244ea41f33c386977386e862b89036c813d8bc71ce78726fb9211822549805c267a023859546b48a030461c0c2784bc2cd50a576b00450e6c8c0a37b665b618c86dc07f2469700f1ba1e165b756c83a924e1398b92bb189a38706485a25d5f9caa710b8fae397d2efc28c4cf11b01dd1438a215509fa06d05a0aa256790e0cc526622e8cf0ede64123f1bc296ec6651b83444b8c5d11083753bc1fe2c8332b2f02e3fc79bf98333b66328e7679733a6e2189c007b994547f72a81f0f0c147ead939a2481e54ecc861841c073a111eac31380deda8a87a6f5c270077d03b2e04bf1ef5d862a09cdc1e39a832b608ab19694340239414e6f16c3b1515a698bcb4825809247b32ee4552540f445b1bb2526ac289e9a39f86c8cc2135b112665c15303ed12456452362abfda29d0b9ca5187d157ec876ad84c5b196f734fa7dbe1357c7a03f8022e68565d1a371ad3cbc361c1954f269e7ee5b412a027e10f31afd548d6fe83c17dc9150243d1c56e6d94bf5d257568a0353055488a2f4b1f794ebcb82cb8ee973bd428ad4934d18d02fb7407fbda9fed3a453bd52cc5b293225c88e5a3748a4a7c21fb51ba2741723c8343914b0652533040353851c8b897b654d51e622f2c6d7b1341187989be05d8069ffba5e61adeb73275248cb07c5eec40fe33516ee9534cead05857e119bc192aa88736c34e8cc6d18837476e0ca228d2f924dadc64bd2449bb080ae705b74ab60f4331c12680a113c69c46da2990d6b1c5c92daba8e40246bdcd3f2a4fd56d8151ce9a473ba345249f1cd645a3c91394883ae49c5e558e0749784a08d6347aaecbe6bd1919d644a67a34bdab68d0398f45aa7067952f01a078604c2d5592caa405910ae886ae1baa263715705caa2d802cac265c1591a74982bb816d555d8889ef4b855caa20397e4ac357ac986c4bbcaf134486ce23a5e48c9db4f2b6c4023216f128b38da624de34a3abb578b6f2bb82c7454a02c8a16d02cde57bc8e45871e29546b3ab050304ed8b52575a48ad601410238f12618671749a4ce9913598c57e1b7606c1653569220a471e89380c215c645bab9c016ff166c0b2515a90ae215d1577c51c16db153815a41ac02dae25f2c3ce59052d04165269d9dbc56d870279d6a5e2ddc5654a7a40e835ca3a2b965f674ddb8c28c9551523f2d51151c3948f16c50d1a4f81af38a1d167a0bb40581c547594475914cb4736df10c6e524ccec66bd2642b898533a092106da2e2429738987488052295b4725db3b0bd0e69dd6a4a3cad301636d093e4d138a44800cf758c01a1ca8e3977e86090f4e4d2704d5a64e3e8e9b0dd71a4ea3e68c5667fd2bd164c85fd4b9c691fc200068700a594ee19f2d46b3d3b795c005ebb9ef569380b7253ec2fd7d3c63af5bd103e0d1146eb58b02d4cc9e219e9a48e2d5581ab308b0a8e19d2c6955890b5f05dd1b65058816e41bc629485db82d3027716b9a3911eb5348b9cc55bc2b0c37b4c4ed4c2c72c00f9936e1bd0748bce5174fa38ce525e464bc3b0485b51448b1b50244407520ba8d124456c1ca5482a57ab826ec5472ddd4038945a741d959489c6219da472691645afa452d7cd9b28688e9b94fe8a10c340b5dc242bc3b6b6f815118af12c070f2f432be6c5d475ccf64e767036a394ddabd0d41f40aaa7ae5322d7bcb09366fc4a9606033242581d5015efb3e8682755dcbe53618345a2bc715b44db22aa8214dad959e092851a69a477360e7412bc6b5a74b74547efa05e12956bb82519d2906d3779814a7f72d3f8ff843a73e63a8c9040ed68af45eab54c85a55670109154c5a5414bca6fd925d0a6bbc2141650d393c0d138d024f82e938a8e85ce02532d3a8848a0ee96a721f55aac8a74e47fa7c9d0d563c510aa393971c58d85b73327a8ce3f809242db38ca938eef3ab2a490da9e05a505aaa28a3583108af2a8e89523ce4d498364dedaf528d732085900ea6c089a82e2d0d427d529a2e170172c41a4854e0c1c387974a414368e05fb0a6500f42f1501e4b5027ac9555c5e30903a4e07aaf1fcc3705ba0e818d575f45c51158c3f1ad48660891f5585242ca1049d73c432f040345df3aca1dc6ccff30b5da40a186e6518664db9c262638189a008baf95498b8c363247d1f9e7fb440a64d5adb7bef2da594522629036705c205e70514535cebacfa335951d226ba5821f97f4600b1e57f3fe8d9c48beaccc5e9c5c589e70ae6e29cc2c5fc9f0fda5539e8d18b647325732c7c36b51fe74aac39b928deaf037a5a19fbade857849e9bc64a90bb0c34a94ca0e9428918bfc6388cc1f57ef431585f03edbe1d0d673e273abf78320163fcf7fabdf3eec03f87d417e7e7dc3fe5d873944173c53d855d9156b694a68993c8f693a2ef636badb5d667eea45cfa9980bb7edd24c6b87beedebd97524a31eeb6a71ba7b9cfec71aee8bcf89e46b3baf24784c6a7faa5404fce247a5feb4cd7bde7795aebf7915b8732302f447f7e9d1fe6b737b23138762391ad3d09069498048e5e7a1a0934b2b551f7181c2bb7cd74f22b95f1d9caa0323e212d7fccf7067777796f588dec4a3d69abadd6da6add9168bda59097d6b66e8d784adaccafc20a958f08dd7d42faa9fd9c2dff7492e1df18f30dd65a6bdd3b77d72fad06a5dfe8c2314bef66e75dd779672d12bdbdddeefd1dc7183fe9333857d72e1165872842b21db614cac2da358b6a73d74a8b5f86dad32eba3079b28763f6e9443012bda3a9154e3a8d2f74d00f41314fe22aac633e57e24a3c892b7155905863ea8af40e3925d1f739d9635c89832619a3817595d4ae502ae70cb528aa947b4a1806a5fc32bfcfc589f2428fb3e53e533e5354b545ae20b1c84f093dfefc16249d72b24044eacc9fa94741dacc9726ff82d0e37c4d31539c9c52cec8190bea525d929899fadc755d0d5d0d5d9226ab6f872f7a4e978b0544ebd3332567aaaba14b123313a46426d3a206fb27468d9deeb1512f89ab2c06a50567cd7481a1c71923da53f2cc9f443467a23dedcf20397a92184fe238526ed1639605eed4cae0fba6db0fc8a995816e420b2a2f7b1ae2e7be8fef5bb97be9f63b140064bb1cf7dc76ef6673b6a7db76a9a63893a7d6add6b7368c71d19eaa0954ca2638fcd2f4aa628a0dcce1f5f8fb3806c7edf1bbdf078242037ce4de9ebbee6197bf036df5edddebc960e722c7dd9ccd43fb35d11af7bd694eeede39675cb44fadfd0dd4660ec731ea7b3dac727a4c870fec508096b3b68206a670056685c8a31224c5d501d1da618593a8644071445a5821852013e0418f922836fa1ddf36e994bee61addac66434a6dad754e3be74475444156b11d3ddb7bbfe3f4b5eeb9a9656df4b3cb23ea4da6d605a133f7e40f32475cd835f15506476f32e9d4418f32363f488e693da4677e929c31de2bb8e89f4210173d5677e08c7048a4d0431a0659c5629dcbc881b32f4d332da2ec09c596425bae6cce3f56a5dc54c00e17a500b9e81f65b6f40eac265305f3f46548b9d0425e8185090441a10123fdab801d2b7c7b27013be8f124d3238cd9f1396bf598aa67034d70d1fb1f7d49681a4a17367d28324022beeb9519f528a59eb5d6ce5187d24592f4ce451bd24a7d546bc3ef89b6bf43714ea7213df67beae8d5306b9af57ab839e7acf5498f896c8bdade9cd45aeda98422e3ab169e1c077e1961029cc67fc7039452aa6b385afad40710ae823ceea628481930fc0df193dfc777feeadb02737f4f349616636cff4381b652c378b396dbbacd480ff72412e97de4268532fa85901e3f29c4af5f7b23db0347a0064920e7ddc833b2bd6efb0ceed06abd2dac334c74c638e39335429ba09c538bd1f25f0d9c9aa64d0dcf39b9accda96170fe9559bb534e39e76b52863dec9e12fc74d044f628dfe2dff12ba5fca868134c5e03c4456bed6b3ba4ee2f89d67688accdd1c2aa7d0e47f9da76380eed66ed6dd634edaa6cb0052584454c4807573647faa668e9f3f5658c5379a59457e2b8f77e1766307f25f077f0be068e39dfdbe3ef17c4610f8bb59de1fbbeeffbc007a4d7df79d64e7fad2b70de7d2c3de6af9b79a72b8cc14917d232db52484b4a48364515211d00d1755dd78d01574e229c4e88414e0839fb891d10827838b1638668012f20322f07c0a001356011784190524c852652f8643f5658a031bb800b5af8e00526501ea090b42015935a42a49aa1ca61682563e583100b8615040b5aba45441517c93565054023a0255410e405b56009a28ec889a017f7924209d8069b54a460c6b4199b5a5020cb322ed2c6a9ccf06c7a91c42cba2f2081b228245376aa2e9136aea2aa13481dcf61e5ab23a48efbc092366e02a9e341481b7f6f958ee8d1631ec3e238e6cb209f491dfa2e25db3ab7cae51a3aa252a284e4caaeef2929bbbea780d8f56daa8aed263837e7c37f0eb15fe407efee394be407ef2c6de653cf87fd22201d33a7398f2ae78751dcf9a517347de942ec9766d0f5a58ef6f52b77c1ed35f087b485e394f907fe2b6fcd758a4104b4e7dfd611d40e61cb211a627b2432adf65c9e777ecf9c534a9beeb3945976520347edebcb36fdaf9b3ea4bf8fc1edf3e51e8f9e34ceafafe9984fb7d148dd33b473e61fefe3af3d130b9923b51e8ff91e8ff9f7d297ef0362cfc7fdfbd3d34164d6fc90f61ccdac02d9be6f534531c088b6dc32062019561ca9c6718c35dd739ee6fe72a0f7246b3d2f94a06977e068b9cb5d3cb722339bc8b7bd2752b7febc992c6dbccfe0e83950c38c3e8fc6b937cf070e37cfc7fd30879d8b1ad4361b437e58b84ffa22755ffb5de7f9b8f649f6da273d673ff7586bb911e83d97b7e740f916f47e049ab6573d1fdccc725b1bf5b724381864a41ffde5ec99359dfc6985f87ccec11a0af131dfc31a17a76f01dbe196433048d953c6be943a3f73b6abf69c36b76927d6ee363f87a63d6b1c870da5cd38670d8d61080620b6ce96432fc8f6100daf0db3e5100d4ad4d4489d21f3a5b4b97fc3d1c81ef15fc7e3f51212e7a469d7481bf9ee4ef84f191ef5f1fbd43bb70c6578cc97ef3343aabdacde0fff1916993fec95f58642a86bd339706f5737ce9bbed5e971325ed775db7b1dd7e3fee653730547fffb42d7cf2fc0367eae6edc77739b3e6b07621d32dd17a923f773cb39bff6337d706191b9e5e3afde8ffa392c32b7fdebd15087fc3bbd1e267965dddca453f8537feadadc94d4c38df03aa9e353ead3fa5408b53fa4edf5a9113be7101cbd2f9b6cfa5586edaf79d9f4eb18583852fe893d1f999fb9b52f52b797ff43da32e4fe7a3fece3fb321cef0fe1a1b705fcb5c7da3bbe4f6486323da810ed7d037b8212ac5e7551fbecfd90b605a40dfd41c3d76a911ccaf4a0fe44e6be6128a43e91b96da8e367ee1ad624385a1f57a99fc7b8b2f35f2e7739eb931c4fe2699e7ed8d83334a1466989fe39fd8830d0094ddb94bea43f9eb06927b5c4316798dc2cf1571eda8f9aadeef1f0b0c8dc56f2b091dfc1cae3e270f4b76f85d83b85938ee36796527a1ceb1845e6a661868025a20a21c6119bb4a59018419f97efdbe2fbb870994270f1712124464a288c27df0e3610649d63d081182b31585f978f0b0fb6140a8386305056c8b468b142460118ae78428754173bc8a2e5cbd0972a52c8c000e20ba04f8bf785872f23c833bed4801fd72342a8a098e0200c20172ce1c9b231bec4b04597052686186079d3e3c74cd80086143050f059f19f4c7cd31724f6684ba12f51f6f8276f86f1f32cdb5f23f10018dc3023c110155a2891833dea4fd6c229cbe9f47d39f8bed309cbf76171bf57884ff09b81761c68f9313dbf4a9dfcf53da983bffe6cc03787e7be8f802d83effb6750065f3906fd167c37a094625aadb8b6cefd552c5eb836fd984fc88bd60cbe1908717145888b594be88bd527c5f7c172fe3e2c9f0dbaf0d20592ef06780915558238a2871e42f0421545321429f9a2b0c1a763bc84b1b91401c5e904c50785fcfb3eff3e8d7ddf7190b5481ab947128e0e2f339034178c81a6b1e5e6a1c29ed4ebb1ee9f471a7b3ef1bdbc28e1787f50bc00b9b47dc7613fc6d60a24458943879724a428f7484f2b2f5bfe7415499d59e425b5a51097d4964b6c29b445158a82d44141dad0b0d66a2da594565a2ba594525613a9339bd418489139953aa5019f8d511affac3d0847fd7dffa28c701461c2f1b46114e79e4e22291cc51f85e37f77e5b0ed4f55dde7acf5f7fd773f8a5d38deec1b20e6a144abccd2adcfb5e753221ab4e70df0f25454ada88aaaa88aaa28ef6e8096a702590b64812c9005b240967637c0ca53671447d25b67b7ce6e9ddd3abbb37d03a43cb685b16d61dbc2b6856d0bdbd6f6bf013a8f8d511cf9a79328fe7f9fd634dbd8be014e9ebba2396b9aa6dd55d646f4416d73609e73ce393a6ccf1ba0e4b9af02f8004cc049d3d8a9366d1265cb211c5401d8720807d6ae48244e56d594d4c9af04101011ae205a3ee42d3d1f6de710c354f4e64614ffbf4feb05481eed779c1295acd0f335b096b4e89183a960947ece5a7fdfbf28be460e16945514479b6356652936fdaa432bc9f498fdf31ea16861a7b231ceb9e85297b9e936e25387357de0a473f4390a7ad345f17432f9cc0564f9ae634a9b0ac4c7fee8a86f5fc7d4c14da7b24a3be313b375843ac2b9a5a723d32b45943dd6ed9fb71c7202c4d65a6839e4a4c990131b869ca0e4735ee79c2a4889e594b3b3034803ac5c9982aa627497ab9c73bae7607fa79c9d1d40aa58b9028bd15daeb5aa5083583b8114886450ce2904af3dfe04540892822c676787a9c68497434eae382b46775983e18bd1816ce68bd95ef8b098ae990f8441cd6451146446827a8cd9e6388e46dacc9f13ecbc1e1a9ac4212757f6284d342f0e39e9020e39f1b267329c70a51bf8a5f75e0bc3922a516e98816008fa0595255c97cbcd224b141b6a0a05268e6c996245104374c0beb0c40574cb168cf1162f6616594ef64d2fbee9bf0827a1c4bee006463c51450e1c58f15c141318e696279b17b1c5b460f89327b4e8c537fd17bdf8a62faa5c609bc5945bf4a74c4575308a90b2831f82f07bef1d63df25281022638c8bfec489c0de28f74f398b04a214dd50a425e88a23c4f080eb4fc768fd04a67561e21a226fd9b2e54f5c09ee9d426f78e2058b11615cd18104612c99c112991fd9a28b275f4a108417487af812832ef97259827242632e745eb75f5059822a61d222012e2a2a426d614d07a30829b37e616d1653bc092784141e98f560e5082dbc607204a571efbd5196e4800913f6de7bbb38618284dfc0640ccf62df3ba516bdf8a6ffa217dff4201342a45058a4604951f4a7bb837df2ff271c84e70c4b8068585244146e79d09f8ed11a63dc4507265dea4805032de6122634982c116ab0c5941dc2088aa24aede2862e95628cb95055510d61243898a10919623650f9e10375073f04e1410caa25a2e49a3a00143fe0b0644a952642e0454503d50d9c861c2421e2210a2c25d8a2082866dc1633862e4cac0cf75e2e2a2784c0a1ce9860318466830996e06284163cc8d07a428b253428d19f8ed1dae22318639dc5902a0b174dbee9f5a792bc308b0289193ce085091e5cb76c8c9f1ca981c5d0922e6a5ce1a51bf4988de439dde77b8bab44c2a04d7fba58f4f36bd3223f78cf481bd77abc1e1d534aa2c7dffb1dc737b3dd460c37efe3396a0a8ef9b3e723ff5322b57a3ee6b665dd1e3f0e7d783ee67b3d59896acb2cef63b0ba282d38f3633efd3a9f7e8ce3908f393064036bcba124558692acb6e6dceba9f5c7853dd21f1af0af3ddcfb9b4c467a5d81694d6ebf793de6dbedef76ef773a7cbbd783669cf3dbfc74cb2a5b124d2b5b56cb651e3b5e65f2ef9ebce9e7fc37ff3d421fa78a36fe8c3fd3b7f62f8c0c18183d23c6d3318336ce38302804c6eb3173d63994d93ebfd4e11b3fe77b876250779fe99463070a4156684106d50e521c8707ee751c80755afea0938e43c8edf4bb90ac793de65092d4a68ff16f3cb2ee6c48bd4e49ed2868f445d09e1fabe1b5e78ff2ef7bfeadfdd6c2d11f3fb5457ef0d6fc8678037bca9fef43046db9259257e6b8fc17ecf4a4a0e536fa55c3744875913e0d47fa9c05291d9f3ac1491307ab7999886682ecffe0e7a80371ee92e2404e85d28ed2dab9d793dda5fdf5f2fbd0b73de8572017a9b8a899aa6ffa452a301a915b56d0b4adcbc77e0d9d8a8b210f1bdb86ee72d15f0387d83d4b478a288ec73c668281e9117449065ff881513cf83450882f96102c168bc5629dd0e974252c9ecfc8ebb8edaea44e7dff9b83c4d16484230c4ca9a4c315295cd551186e214ed190de1087b11c86d65a6badbdf7de7b2fc618638c73ce39e7ac699aa6691a354057aa428f9468ccd9da0c70cbd2079ac4a1f1f26984d70949e3ff81963d802985e37dc12e2c87233db27d86f755e3881e71ea050404040404048442a150281425e2743a14509db56c6c55aa42e314a594e2144ee17d5ff7755ff7755ff7b5b2d65a6b6decc66cacce72d6fafbfe45b1026ddbb66ddb46abdd712de7486d54a38a9e41306e697004e75fa242d7b7b2c445d31f50eeef5007e7a620941bce908364916bca580e1bc16340e6e14c3e7d345ec0c6b5958e460c0080dbb45c4763064880d1a4916747a30be21d8d1aa0791142006146a6061e8d1b08008d4802006c984608332780f95e6b2875e11907a2e726aeb179447398a58dac4485a64024a52971d142a06cd9b4fd04650b25a571246272c47c0c8fd502349e19374669265859f626b9ae4d698ce73377924d6352d2c60abdc5806c302c34e94571744a06cc36f25e52076fba758ac27410c5993103943c1394a3185d8d6294358ad1d628465da318d02816348a05ed31933c465ab98cb4f21969e545a4154591563445a22ad2ab95c317e9f59b86a3b843d22b456966a82d1cbf942ad4a9934ca414af280d2aa7b4ea5b3d4b6cc162fe5424ce5ea683601b4c3c891b4c07cdf41c47b14c55b0d5a67385614e7aa536a53a65654516af68d1a88336fd98d24c6fb071836dfa31797e0563b4cbb8b2cd362d59a147ccc2ac92167abe56d2811ef1985914a77e38e2960c31ab94859ebfcda6ab3a6cb666791669d4977ad54926c61ef6bd6293283683805039a555df6ad53a1589b3977d310dcb2f1e9b79a40531abe5020aba3c2cb85029d5caf2cc9605ab2c0a42a5542b566be53cfea2fecaa31a42b1394f18e0c7acf3a33ee1c72f07e74711c73b4cea6c377ecc267ce2e99d2565d6df8b01f829933a9de9c71bf137feb49421fc7823cafff40872baa48ef7f35b903aa3ff7ebc91255943cac8190982a4f1e38df85b6ba97f47ea9072fcfc2c7564a8620ca073420e0e8e70bcb96142010850c2cdcd006c6a047043239200001b372384e08b7003c28c4c8dd2cdcd071ed0193031e08ca72a1818158c0a4605a38251c1e400310f0c38d2257b3e25aa95a81255a24a54eb8ced61c0fa39a495565a69a59d01720f03dacf71efbdf7de1f6f6680ddc380f773488c31c6f8c79b19a0f73020fe1c596699659659e6fce3cd0c7094c3ff6a3fde484d6a52939ad466689f436badb5d63fde80da9e01ca0861404d0a726db025bc20428b0f52e4d0f19b2cb312b61c6a42c539705e41dddedc88e23ff73b5e370e0b2e6ff6be4a57481d191e93c85da6477dfb3694db3d1dda9edad3ae4671d1c7566ba94fbb8d6a5853db97aed0fe43ea0662d3cfa06bac2125ea61e5de714e8612499bb9f3094a56684c29a594524a29a594524a29959d5c62eb59df4aa75628a2fcd2b02ff6323125e6fce913698aa6eecb9cb5febe7fe92fe7c1ff82c564b3a28a52ad562c56abe572016d2929516ccba222d49654c56ab55c5b4a29a5c364338992524af9524a29a5e4c9896599f6d947670e4d8d399887058a435bd9a581bea0279abd66bbcad9e599ad299b15a1522dbab2344671e803e5199bb1f9b1d8ae3cbea238a89cd2aa6ff52cb185a9bf5274769289b1877dfed2f9d3ff897f12f3c88650300ff512ee6b9ba077fd762da18abb4a9a6d7ed4353f7e021037cd152f091700d7c635dd116ef863067fd4ffe327c28f1fc278da78e6c72cf3a3def92b8d220d184d8636438bd13cd03ed058e3696fdb7f7bdb6094c66fd0ac6998aff4205542e6acf54780b0847ccafb26dc154569fcf300c2316b9b70d45f4d387e2f80707c3100e128d284e369b790c570cc9a8470d4dff76f0a477184703ced3a0b5da0eb5dd515820b0419c5b12d4ae39f67c2316b9970d45f8d70fcbe148e1f9b6ba8c44dd9243954340380024316000028140a864322a1481a864922ab3d14000e748e4c68603c9147c31c46511cc410431400840000000000106294527236090435610d19301fc342bc15e6da64a1db8dcab3c79abb271ce55a70e73565f249e46a31711d53212c539f81a7141d9e7bcbb54d8ba39ed43d09da0cfd0f6a021238721a9aadb719433849a318b01f27507a3f09e4a1040165f39396091444d321636b40791745283074cf44b5fb03f30ce6d1a1a6b9a3a204a671a1609740498c7b795074e9e9a86ce37b8b9dbfcfbc9ec6f2874b4f9d145dddcc0fdb28212b10fcbe9941522c03ac8c2a4b39a50d7d088673bb7c8a0c564e46efc236b5a7920a9d5a1869a8edd44f7db2a8f624d2505b624785af5de529645923c16fa9ee74513745046db26d17ee6ef941e35667ea609795b3ae67882cb373f44f2887e236c867e89121c12b0d6abccccb8166913e239b793ce1b934f5db30c2b884d105f177c1016eaee8bfcd27da05e0932a0b337b5af8360bb2247a9adedf5342b46c407537e3a877751f220c757d38e119a637b882b4923503d2c55bc48f99379f35843f39498e77a61261bc10efb08662561bb0880300a90d4dfc98def195458aec613ab2491781b0e983556080ef3cda6c254b68680c20a146d087291facf3d8641bd9cb5bfd4f01af16f5d3124e35d8a67a42c23ee05b06433cc7d1c426ae0c98e726e8648d77acaeaca4786e41035c14067a5bd74919080705f698ddd98ac5da7a3fc7306902802f9ee0748f59f3809d02a81a0cdb99a03d10a7316bb638ff351f1c4a97fc3c753b7e25adac0a4ba5fc0cb7f37e93116d8c249386d252cde7fcebb3f71568b190970e9461a3188872add2702f537c43133f6f04270cdf4dfc5847bc18fcd9d34fb894095b768ff8d6831f65ed4d8cf31eac58a4a500acdf42e17ddafe94753d27a416ea278681c354fe118bb79dede81a8284ba7e50099e6b9ac617821550f6372dbbf70d271cf95afab170f4abee2ea5685e0ec326ec3bbe9fc67744f783d61a8fe169cc19c62bcf5b8214af56fb1d8fcf061da555b1c97b075bf1192b4260749b8e2767c1c97db7fcca97fc4b4affd26367016a89e7db069f7ce9c1e8fddf44da4ffd34229d3beb099e611a70f0464e3764bc91476fe6592f7afa7a3f1ac8d6d53e7ba2ffbdde990cc22f30c8506ff4954aa02860f6013683e8b94c1f6ef45e753998affbabaacfef7102be7f9d1464996c3786579778cacd544824626a9c3dee168e53961d5c42d58a57bb0468b905035ec21eba545fb6e01b8530611bb9ecddf955704e8e044ee7e86d660e1f4c6d03da124c39f985ff00055bf37e58191ffe011ce4a5815063e320152e42f6935df76054aafa4503dba412288402eec9b01149b9b15f86ba7c2826c903ec09b52125343f539a3f92af97c243df631fb85972ea65a104eadc2dba91f68d3cd5b669a0c252c04a9565b984f428c2106fd81b659262efa176f355be02764e37f8f4db31e25b7ecfd674c49598f0dc033522aa20653a16a8dbc69227a3d677b386fb808530657cf92aa65f762d3f1a35300fe955b328fffd9545b3c956a6730f9ab8fa26e51f48d8a5fbbe0fd2a3baf7d048d66889932bf8c441204619682b3a0121d5e6e6b3b11d64642cbecefbd92f953459bc6833c963a96b39309ff88b54ca13932a20ab62f17a128dfcd39d5c7f25b19bff945576f8ec83afe651ba45aebc50bc12cfa02a85313cb70624120d32a46e13eb85afecaf27abc86f348c530da1cd88ede618cc186873e1139f5d694bd1540b3e463bc117bd157cecc90c8136c1c70d29f31b4f093e46208e56f54c7d02ed9b6e3dffab4a799d29e23a363e0b4aebcd4af62c42ccf60672e759e5d8d63fa0ea4aaea272e2b35a5abf9be78e2b103ea39fcf3a35b9c78492b53be65191ff84a2b6e1b8db9211c12073fdcc486480342030b90e2d7ed5fb559d497970d087d919b730ab3793ead91efe0128a6c09ae46d90e3e9cf6229f0970f0b1bc37f5de1860050b4e9cdd499c424ce6fd1f724183c35754155ef940fb4f48033930048bd91684c74a9719c35435ac6792ff04d50436c7705243019dac82b5ff6f95f548548ad5adf83b09e0c650d5dd981f1e0a382ebe1ae80ad3294ad16bc35e2186009d777e7831f0df99303e23ab8fb20eb34bdcc3e19ce53419de3ac70f7e142f77f437fe39c2dc4d3c81f2d97481f209b2801806e40e228eaad1ddf16af5b67c7087a09762a9669de75364146f756d792424f1fd9ac5cf78c8af0f94d16980bf26500b2d94537f61a68921301ce03b1601e4607804d842e1acc3fdb917d02de76ff0bca12df0d3073e3a8917a31a02938aecc484c0eedb978e0774f552c9675ff265a728fe5cf6f3dd6dd3754aa30fb17baa20dc08bd4dfd9cdec1725524b435844cc65c10b5ce76122468ad2206b0e6ea2b0742c830a741cfb3247d80cecb8fdde717c94c716ba0cebd5e187b5803c8875fce63db01cc9c78d937ad3bd0a620e5fbc9392c5467ee3a1a7de982059da1396a11aaddfb7adccc1032d9289f5db9e1bc1fe09e77c88dbdcd67390cf0c667251eebdb8e5f40ee2f90a977bc622616eceaf344ae4fc42aa5e34499b2b02d5d4fc5d5468b7f388eb451837586a213ff89c35077e35ce2958eb9d22b3802af9b93c590395da984a902b02ff7375f7fac4f0b469e72d241edfc2c58e594d53b3cd432c8b587621319eba9a1defa1bed338cb33bed12711de416d58d20198600d5d47429dbcaa91706b1669ba4551416e6daca2365628c4a308f6f804c9f47482a49a4de82320136a5f5c423a83434f20b9a244063f46a5e1d643c20eb0f451359e37133bc404c65548c0fa7d9c53a5b661c20162e2181a3e15c953ab9a53d1ee806f764160032004f455cb9892a5954a665b86e71dca165844fb5bd15a0e944604aaf40124a24a912655daf259526e554ac90f3ee5394807d3889ac6696aa6735f2e65e1fe660d6b85b40fe48451c63d1d20b974c8b69e0c8fa7a9c03cf951c14b5b2b53ff28a4528cdddd36660388845c2ac8f79c7774cb00169603790156089f82d811cd4ee6242b74d0910ffbc17d878038f261ab8614d0308887f1e97829ac507f4e75fa445334db036d0771a083da4c53916392bd5fbb7edd6b6c5505230ac5177aafb9f2dad9d82b35a509c537f95eb9feda4b2dabab65098d2ff95e77edda23582b8b84128a6ff25e77ed15a7d9a92bad843aa1eb1aa4de19b4ee15a59c86288ce0736a825f693ee54a9da95ea627b958b3d39c34848b78133e09ec8a766ca7513ded2b1735378da212c297dafbc1a85083a155555627a96f98f2d156c4db2959ca8c3fa3ff62c24a2b148a36e936d5f3387554edf47f8292f8d84b62b0c5eab1b10af0007a619a7e5da6ecac140eba6355ea372d24000c56f46f9699601130bb4d3cf265cacaacaa1945ecc9275c96813d6636426f0be4631487c3b41ffb37b9ef525d5303267b194c4f09e238bd370eec1a1020096d9917b0027697e6973d8a5e738d979c3230367117dfc8eb39f51033909da55fd849af4beea4a0bb797960fb0cfd57895fc59d8278b964bf3189ba66a8f4437657d2cb5df43b47f0e60cd84825cd3096977d6d3981b7d171f834632d210da5315ec31e05c20ccc83dfc4319e908adafaf830484507ba4269cac48a37e1986a4c095280b4145f97d9d12955a85b04d2efcfc8fe313e50596f49eca3ef92529fa61259f0c38b6216a0f79a3bef2e85d9c9ffc97a1a07ed65544bebf741f3e2054e0582d881e80e38604e3d94f3dcf3b0b1389ed02ec240a3b55c32052dde23a34905d30d59f1ba213dd71125aabc08ef0d30e2424fe61090028dc092202000bb72953f786948ae03d613c417e4ce46f028de695650599528396618a15804ac4c19ff988b3bb4da728230d9f1aae12c265d00105f0011e5976cc2ee4f39def05f1b8fbb750c3ae0a061735bd49f4a166a2b58cb2f110edd596689e0b3cda68dc9d5648e0a0caee7e5c8ae1ae6ac40ead23913d36d0cad93d4162e666acbc6c76ac9dbd7972c5a4a22dd2fb8fb106edcc1a091f8fadb812d0fdfd7490a7b9e2a2a34d17a215dc0cd08701624ed1c58f0937227dc7545974a276cbc3d64207587de36e417fefdd35b25a4b379a3b0a20bf14ce2369c358022b4e67da86cfad840510629d652c41bdbd1bf43e0c130e34a464489626d5bb741070c5a43f863a3536e3265cd1244e5717cbdb46b8b5e333d4e9b784a35a2063ad91d64ababca2402e9d6a5cd506808574047bbbd9cdad3bd8d8374abb73b35602519ad4a8c6b79c3f3026b8be9478e28ddae7be14b07d7bcd1dbc271ad13eb454b899a7615b3cbdde9cc54f57081a852a64b65a8841a8d6dc9a040ad694e67cded2835e443054a0fb09d1012fc6340a2ca309513189a4f04cb97b8f5d955810273e903e5c990202ccb40a1abdec25d148e9ebb15e09efcaeb3da701f010bd0c2a6bb32a9d1c2095d31c0b4f0a84c8c30b570daef4fb0b663ff2e0bbab5e1200fcdeb8622737f81bb6beadbbf3fde6a550c10e86dabda76fbde53343b221f630e5242e92abab5b9301e99dd13a010d787374d5c83aad0bb194dfce3db7ffa41fce513832a77b120868b8affaab34098e0634782371ce0ec6f6376bddb066bf906b0b0945002e27c4228b5caa867be3619cffd30544db750d5e89bd2704bf3f22554b5d7465c1133d36d7ee0d256a9d8722a21870c55cc26d3e08308cf39a601db50d12b18c9768d3ab8e3e84e180cbd81d5b0d1ac6b0bd549c42cf931550bb05dc2711746c1e3564839a5c65f2eb6c0b285acc8989a178b9771f42ab25aef37186a1439378fc82aff480ebda7ab7235c93f081e18884222a6fdf567567006a444b98757ba503b3174c33f2dbcc530d2500766e83c5a0a3e2d6d06bda38af7107e3988bcc5f22f0d34f721829985c262b179768a54ac9c94906186820993b44689ebd2e569c0948b350022fa764b9030e28ebf19c738d44a340348d34c3a03f29bfb177548fa12ddbe449446987687a86c9e4d28ca451fee0ac2d6315cf0097d0858a5201f93dd631c7214fbb924f36efbfed0b1d2df86fb1f30dc7477b0f7984964b301a47e9625f3848f3123dc9a9b058d0d96fd8722c484b1400ecc85b090408ef4196bed95f6052f104822988be8ca28dfbb190010b0296bedc4f5078f2f7a02f2ab1570866f063b2163cfec97e2aab9ba9eeea9f99a29ee6c4d7795c910633a672072a93ac1740a43ba7d18c06d75ee4754e64cd45027588be5c9706738598a6587828b83b06e9c206d1e465e26baa25f8f8459bc416bed1146ecc7244add72af2976917b16ffcae9ff98b71098ffc7c482cc9c32e4f9642f528a3d2f9647dbbffffbf1638d72821eee13db31a00d8a7acb35bd35c69f4cc1502780f0b1f7ecbbdc0639cb28756026d22b554d75808c8796c00e90a1857ea18822cc28a1ae84f74cb3a5010a0f7718f6931039d65cea27a9ecac1bc9c7c1aab993cf4c490ea4b675bdc749ab0c218df589ab6c1b7d535aa64429f5c3f0924c0e302e4d18b75b9b1ae30366c2efb09d40070b463346c838d64c61f340a6dbabe9929df0b0a92def4f5d17691fa86b285eb67d5630466b573bf831e7e55d33829328ade990c72bce8f0645d4b2e95e7cc780882672beab16cd555e23921c385937261e138cb3093a669693814c591922fecca2f440279da8c3f83a282146aaaaa0dc996546ae36e57554c0d3c672dda9a873f4b60be038d001b2ed950d14bf9d433fb711bfe05a3a6bd7e68bdd5b7a5c1c535a41b15f1c1b651aaf5abb29a0b49816373aa9e12623a502c05660e196fdb9ec5b30aec066ecdb22518bd4fe08a348f1eabe064685996070e35a77b27c0800aa2f5a7ea6adf214db95012af227bb02b30b62e7ceed34e740b9440220762e94334ffcf0452a2877db249e970932b38cbb7bfa111b743b6a032ed7914259a479b8b539492fae34151820f07f94b1d60d80b86954653e604e25348a3e7cc04cdb665431d3e2782de2c73ac988338cc2e8a1cb83192da1262b54bb0108ad59525f7d0bf04337e7aa46b7ba72d7fddf36e46ecae8f36d80a1e9521b218ab52b0c572a3a6a8153de1b08b3eebc18f6eaa62a20de97759dd42ca30e4879b25ed4db65fc06d7307319cbbea1838b70da69e3b87f123488bd7290c1735a12afc724394366cc45ccd06063ebe768f6652bdfe233b94238ebb801d820a72aadaf2b00700ba48af4a04e2152e9cc414bf572d8b4637c93321220288080691d91a8df1af1f184240b4d4c6367d7313d0ab2bc53c2eb41dd2adf81ecee9e737779f2051eb029c4c5c2387fa402e698f7cd264547ed5004585f2e9a899363d49f314b2da9b765d676e9dac5b28f89769be54348c74b601740432331b582850395c6fc6f96f77055302b026eba5110d8ef01f296dc61bfa4f60910df23f6d5622aceb8241f5e480ab072692ee003fc5dafb4dca46440b621bf2889c86669ce677779e665b06e03578bc4afacf3c745bb9ab884a8beba9bb4d5f1c113484df140602ced06beeff2f132f643b5bb0d478005297c2185a267f4cfcda92448cea1ff1e3a238b6202e7ee01109425fdccbdd16cc8d8b35afcc240eb725654832ccf5a3a1804a4aa520cfb8f339b5b94a9507dae7be1879509768f05464401cc029d983193fccaf638001113dae3bf77143044f558f7ea86eb0a3ef29631fb00030ce8c9c3c0d6cdc2b0baf8f7a896e6996339951526fd391c9640688c53183b2418e745cca98c05630ca92fe0bd70abd09f4df3383f533bf50567bd8375f064a532d14bf73a9ac78c3168ba814131d574976845a86c13cc696a8004692c087ecf244134e72e5b90fe2a2dbee0067400a70fdd18502fe4185a00814c46eda31528e317440f2ef0ddcbbfcc46a4173c464710504ddd66efcd0c1095edd20b056cfe802333319dc8550e6f3c32f805d5810dc31cf5118a592749d79621f47604e575405c8e020791a23d043236882c34eb0f9f9aaec3454da2d4c08a612856797b463608bd07f39c75df503de78d6d2803165bfbc06628fdcecd17a3a4a900a0c06d44c81ef7d9c24289680d600acb834727070e9c58c13dd6d18c942532d089981feaafe0198c519f2d0c15752465a4f9de06451dc2597605e4d43f44ea0b83e82bb4a9fcba5a63fb2e5e524a8685a398ddde83740e3e6addd0425bab6fedae5236d519551b73ba2799ee50723709c2ce11ad8d7ec351731e460deb3c7a46d6d607f480a90509a01856f0c8d1d1b54c585aa5411f68e939c715599ca1b787efd0ad8ec86ce55b450dc554e0797d1d646c94ec5a1564a2e95bdbdab8ef8692f36c5fe3a3a1caa65a7663dfb560755463f21e595139d0a82b97ac4d85dc7ee47d634d1ce084569c6823132bd623f0a133fb06eb6f1920f5b1fba9df2b2d3bd0eb521fd6811b6b48ffc9e673f8df9636bf5a6f0f3e59e403b6398879b0b8cf027b4db0ed673db49c089a012d681d7f793d0687dc9b7f1a0d1f02b7082b8ac43802fc096adc8e9fd626d37ea83f15a34e14cb87a7bbaa29d3ee4b92fe8ebd6e52f8a61b500c1bee9c3f8dae65b5de7ba174b4e52a04e9991134a18106790fa87026ed03570281ac54795b9fb2edfa1484298abfaf182d984a5bcd2a3cc253f45b8def61c5f64993246f980ca0cd73f6d6df6889bdbdd9ce41f42d326d7c28a6974fd39b57511618f98085c1d273f594dc70a91a4ea51edbe24290fb9bedc4ab04fc2f368c65d44688316fe590fb8ead95ecb313e42c2896eef6fde75e271efabdade510740ff4945fd0899b907ddebd47116cf9e5202bcdf894ba192e8274e0dd17b3d6167782eae6aeebedb8f568e7dd80b84f7ac8f84327c9862f456cbb91987c141fa5bc2f8aa3d600b73a0a31c3186afcb3c006028805c1dfc34137b1088d66f6a312aa7eace9d3da8781252baab1da7b14c46f259807e8c47b7b56ba88e20320fdd88894b85e464dc747e867bb02d9281f585fd72ab2c13f40727138274e5699beac0732511adcb5f19506560210a462d7a685322b87344c3a537c5d78fe4b472da7c6c14a7e6a296f4f70f8084dc6d79ecc46a9e8c6f97a39208f92c643f037aae8d26cdb62afbab4e4fdbe0d4a03fe1b6f6da9927ba60d65c3cb2b7884ce478b4b4460cab4b620b88e06569bff5cb2f13e10a554608666fdcc5a9bdc5590412c0424ddc4d0cadea3de3c7db11f99e545b02ccb4c8899e7bb9065fbc4aa3a8a3ea0666a379237f37be24174986c7dbc71af3cc3e364c9c92d6f749e10d71f936d1a3c1cb1f2fb86f72bf595b2ed277a204cc854e92313db1f07a7d7c687c4f41342c5a9a41dfe110407c7ca45b7ea6ab8cc5ee3b995a3ef0d903760b0ad90a09d69a610adcdbd6fd1baa3ece8b55b6978b389376e4c69592c8c4ae288de7d3e339f72bfe03fd771ef30aa2d70366aad909d0f8d708b02b270c7e5ddbf623f50d18d202f5af45c79b3d925d9a68fb01455c6c4162e7c3db420de5280ee9fcc8798cd2dc5491b3da16e884b60cc89ed75da7b8eb390c877a2948509336cd14a405743bf7ebc35678ded7c9dc75b089c1d94e71902d28fe62601448a28cd7fcfd764892002b3a051bb8e0d1bc88c300351ff88773c2c430f42df37ec8aa950a7fec2fd6de9121bf248a9ef19a68e1b30cab0927b44a4111896614888379af45fe809ef091e95630dcfcfe3953848b1326808cdd77193a26cf3931c180ea51868a31e2b929a9573cab00044f24171b6fb89a491a9b39253648d266b1b5b93021661e5063cdd47b0421d5c33929a365e649bf9d0dd8b8df9fad10aee32c386eaca5e89a86e89e13f2272bcef3533d7b02af5dcd9c593505850ad3579087ab6220d1f56f764cab6bff48e1189be84d1dd611c16be0e2baf9ba24193c0fa5eb4b16e450f687a33b1bc2f5834b640814f3d524b692f0ea26ca4378702cdd8ca3cb7daeb6d5db59f65e318ad8a3b0c896ab7192334927802f0180f7d90abb4de127ad205acd7a8e2fcc296973243b803c69eb3f71551d25b8ede2212cc5d7829a43bb0d10965c4244d688633161e9a19366ed0b6e910094cf9897194e6e6a2ee03e07c50b4ebc36db85e2579e53c14c20495506765dccaed22f62c8ca79beba40ebdb0cebda831efc424f422cbeb49e8a1bab5dce0557eb54ee0835dd56cfd57b876b868e88a456a5fe7b63a0b411586c82983d99afd1803d61c16843ddd8adde4c00248d08cc78800494e8edb397785c495b4cba2c5e5bdfa0d14467aa0d1b33a8ff8a5ab21d5df0d287408457b3effe622c3c86d82c70f7309680175384e46dcb1720a3bd7c7e36844129c700b74f3276444fc33ae397ba211ea6fbc27d05452ea823e3fc3ff8300b3660b7d5e55e9ec6ae87140b2421ca2d09521e01d5c6c9659cd246baafea50010c1084edbbd551b69270b0c07a8f3867de89eff4fa89a43e05d2ac5ef80b218c967a1a138f9c664d86ef739c2b18ed549dfd23a3b598340a162bb7148edab5c84c6449e78ada98d66c9e5e04ba6ab46db936c3364155db709ccb48e49729383a3a38b3b40740a8d560a6ba40fdaedbad1d706bceb3c35cd44ead1d0e5cf360a38659f8e9a5afa87ff1b608bdbef6dde8e3bb45ff1f6ade86a6f915ab102485ccb4fbb4181dc318f6b9756479f9f5535cb347fd880a7f0f6e5ab4c44574e121833c96cd4bc2dd37340dc641f872b04d2f05a1baecb8e4b65fe0c9de299597900b04c73d90542650ba726b851c3feff37743e4446e1f982cc04538f7b4013c9d6f2aa649e0a2c27123974428b60f8febe4c32ae0507c03c6581a49d3f5f2df3ba22fee6d9858fc831807a3876be9513fe68e385d97501b9c4a76345dd2ecbeee93807f0b795d4dbdc68dcdafd3ce97a85fe93ee3c7da15c1fffed051104f8e76b5476a46f0b686d69c75da327b8927ca583096dd9d0cf05a85f99aff1fea8fca78e9e0e943c5221365460bc66dcc7d2f9c696e8c8a8467b9e97e00095dc6abc7839b5aceae79ba777212ff1444c54431bbe015a888d4e8e3d42bff659c800730b477c6954add5591f39bb2529e8763b0543cf58ceb912d3d9de1cdeb9c49f420f7ac3e83d43657b86d1c46f0e5b02900305568b17d9285175250347a1afb1107380ba7b75a5b1889459e69d6890326d78069c2f8d8062011173520b238703289efbab1b68814333f3461e472ae58ab16ce99284e0a12142d5599e609a89bfe3f88d3485afe3a98fb30a8ae8eec2d84caf5dd1553e0f9dadd11db238f4ff276fafc5cc772ed5e2182c7a402fcdaf2f5618f4f6ecbf35b101272572f78b13855c85ec1ccdb00c8511c6e219de14dbeba5a8fa9a9416402924cf487358019829a5499d38854cb40acc66906fb210f89c22a1e50a1715d6cfdb549abc0589ffe38825757e07b378f894a62cb0eed23a3b7386e9f703a0742affb1be6ffb842d9a1d4f35be38eaf2452b8e93bd32d79d26d35d83b36df6aab14b05b28d8c012be3ff56d386500a7834769a89b39f7c5056d00d355abf59a0cd8b4ca12cc39fe85ad066d29a6699fd0420a9bbc36ff12d7a861f8be3aa782581c9fa886d702436f3cd9e9ef435a3ae5608662546e71a353de38059455ac2037d7203d81405393ee778ef72100a626716146c50bea482a62978a0f49ec08e48bd55b10adb84fa9310b0af0dcb05b605534688f954f0d273623c6abd59ce40a86a108dad8b76135fd36086940a8ed0d3002c28e8511d6ecc5380e41c2496e779fad9eec6846c939ecd2fe85768db49aeed488b0ce372307989b41e51820b08babeec6eb926f792d5284c8a6dcce5252980891c341655a22e0c4a84964b55d02430b4fa0b864efc666887d31bcac4575cd614b9398019763281d40cf815e467ae345b9c56107b2a6f23c792965305c2dfd3f60f21787000d7d86b4f39d454237b3a398cbac81fa05134dca3acef4782248ded2df233940e805a7273fdb9f63e4a28f3e8eea819400d790f441c8e32e6a243dd696d727e5df1ac33573aee1d6375fcccad16bd6a7e56a679295309bad515b1689f7cbe296adbe69fb9c11f7d388ca4f47ba31ae1779e85e2058766566512eb8ebeddda4d620f6d7e6bfbdfa6f379c1a3d6b59bbdca24d61cddbab5cb6aa46fa3ded3b65f776b8faca169682fefdd4e7cb3eacba02eeee8c5af947aedc4b2baa538ec9bf988b59488439eceb5729521bf1b7b6f9b6d76299082e18af08af3e7b344e030c0c62f8b6f22b5b5a9274bbbf791a1450b425b081ba209a9466b9e810c5537aedcfbd66a6098cc7840e0ee074dc77f9f2ca8bf5ba0c86bd1fefc6fb00f3566a20636cee0687ec1521266aa6ba0fef825347c135f14eb30e2cbbad3df5aeb4550feaf1c4ca2da372de303d36b7c5160cf5abe64786c586634251597acab7d960bd27474964e693687c14ba690ebff7c01c7d8d7de006132c84b450274c8ab2f7a6a83ba2775d738ce495b2a6036befc0329e3ad36c3be6c73540474cebc09bb848466777136c732a7730cb1e20f4e1b7fbb1f5caae5d3e1325be535c009b610baf65e5e46c1c09d1b15d92fe6d107cc32d7675b619a59fcfab9696755f6a8ad58c09791ed5526621a2c6b7bb841001c4a5f80abc4e6705e64aaf6adf5e4965c6a943bbb237fc11425919867347f35eef65513a7956c7ef1833178814a63efcdd08cf0f255619eea8bc4b14c7bf64d484a4db4597cea1882dc92eec5114b78e5c483975bb7ab21572471c46822911a067dee67488d733ef7149e3613e2d590b12dbfd0e9cd921a6150a0d24f31039381b4e8d33b54fa932692686057b7ee31028481e91aee68e02a3d19e12fc7752cb87516394bbd7b5cde004b7acc7539a6c776d9dd421239e4733b29358d12c79b62a0e16e0a5dba70c0cca710def800c3ba0a5356f85bada004911ac0d718a47be10475b948650e2def99627a67c8de37715d549ec1d5b6946bbd6a698ef645da96111bdffdfa7468228ac245eca7a5330ddc5ac8b0729dbfaee014b0398b166ebf3a0717aa0322d7f9b48485c05e82b156249ebe5a31524e221ae849f5b1b20ecadb0915e66e5e5bf3ea57f471ced2b0a8f2cbc664bf84c6c41a60504731b432645b978d9290618dbea7ff18d0d2486a926f958546c8d8552507a844576bdda4dc3a727d1310afc34a7b9f483c1ae11869090f794cefc5245330c4c406f7a1c6b14cd3c73cac07463f02e758ba1f8ea83fafad3a05d5f7ff15e1b4c5302980d8468ef6ab3f4c391f8252ee098b1ba75b7eaca103c591bde5199ed018670abe244ac9159700848aeb2f9bc50f63edb4973dd547e46cdd97cc15ac191d4d4d6270bda5933fafa0095eb50160aa401f0ff2049df81ff6ff553ba3cdf9a2842ea14229b8651672a54b9d71c8d2777996e0c9b0f1684f69fcb3725a3087dfe0c2bc46d9e26e0955365663e2111c4947f056f7bf1a2e04b284082518940ad4ed8f1796a080364a0f87e984e8ae72f318da68c1d0cab35e5070d9cebdaa27c686f7145898da3911c174edc09039c8ae912871433204f4cf3e8e3dbb98abc677b2561e26d406b256cd4075039d9cccd7455d2e47390203f87e5c8f0a5282c6d14cd05600ed7072c2bfe0a4431e603268ffc086c3da1906b91b3bd6fc6521e0adcf85a28688cfdd8a471b12b8f1aec0c188e8ed4af87e00df01b3fcf8e82c3a6d79c5364257f257660cab664a5aac642eb1b9265149361ccd2b1ae1cf4458b07e19d8e38ea4ed96e283cd447fa01255a0f0fe11d1aa083006759c41ae2d8a83c80d9cd86cbcc2c68adf7ab238123eaa2828232c4605b2090dd68d77bc41042fdf619c79d86bacdbb075c77dc0c74775259c2075ed31ba22b388ea9d9c435ce9a6351191134f5d1956933ee0d36d1a58926f9f8e68d4720b72ab80cb21a1ecfd9bcdba1538d4aaa7584438f79a4b4bb93044e3da9e211ac2c64c65afe5aad0b829882e2cb7f3dee6fdd2105bec3b550146c8c2a5fcb745ebecd4e63399a01dff73c6ede1cecc90176d7a94b4105dfcf228882a091e41f92a3950bb5c246c44734802aade4b839a07851b431be1993de81d3fd78b92d5457283cb2a265850a9b1902468248745fd822becac531d58fba868e8b0738953b1bcd578b1cf9ce8d7744528f7e53002c054d06d523cab7e5af761efa232e12fde4b0b1fa68aa20bcb7503da710bb549f0b3b8ceb1146cb2d2830b2180e649c0d19f566ed9040286bf7141908049a4a54dd12c2005fcff3cbf7a197bf2a255baf8ab3785cb7f23da362e05648f87142d3f9544b399722fdb63b2f15843cafd96bc8863a65111f329f87c33ff899a33b2bce167cb942dba0b17804b74e0f22c02a66ea2252da5b544ee3f563a6a3c0e99b9ebf1d4e65394db2359d76d47ae61012d928c82f4517c9bef2a10f940ee5dcf2a0eb3b88213d7851b137146ab2c6e45eb5b5df0e22d31290806f12a3fde96b8ff00ef19834bc4d05fd51914f03094694279f3c5102d045d427d75a5bd35f444a72dd0a8c0b66136cb6b41874b445cf3ef6733e84d131681f48981cb670387483cde39a8076274a205a15cb7cf31596c576f423a67bc8c3788141f4b8608f69164fd3c6abe0bd0d62f3b692e8962a9d13703a02a28728608f56e06439a2dd2bd0673c0890ef3d8628c6d94896fefccf968c6ba2d8ba5055b471906e30704436bac2b1f3a6dbee16c23f474c92435f3cd29a4292a8d3f9f46d93d917d23975cf684c2ef2363548413fc8259a11a1a96cdfe73c1472ee73707ee4afca07d26fa381e64a30183490a0b8b5d3f29a7706043838dcc9ebb76b48275e5523e50bad3a7844039bfb5ed056eaab6e2b3a46ac02c5c33f67b2dfe62f286198c0ee69c8930bd700d87b058fa3d6f9da42df6324be960a7e87c67db641674f928518d1e4cc60fb228fc8bd8cb3c2f8adee62d59a3fea699f928f322e49c3653dd382067fc68dcfbbfab345fef4e3f68f8b30a19045e36bb86f0451174df7a7b37500be55e02eb3b431018dcf3f9ec259b9eed1d287d4582b1457646f20f52446c605dbbda8bbfc883caa4c985e3841aafb35b0b66320b882a98e45d23c1a730818cf4b2b9ce2ea80eaa1210c19864c32255000bb00150a6f7f6b8da48a7a934d6fca918c3462155c2774c5e373ec745ceff481f92b3769a8308993e2aac9e6d2103249f4975b69690022ba0dc403320107fcae77d31facd325788c1f83c2f70ffe9a325d51510ed1281ae82d1aa99afc540a5676c218d9e4ab3cdad54b091dcacaa0d176d098a48d39622b451182697d55f04932c34345370e704bc4d4167043217a5676944aaab03dcb17a36daf773f6b6222f08e9148a030bcb735dfc03693a5aac15dd66bdbb4bdf2bea7cded36dff87e63c062349b6390229039c68a37286a64c7582d1d991fe5cc5c91d7f58855d19f7fd5d46c43ece796fdea06b8036555983954e5380466c80a33e0c7d43a15677d5b43bc6e6af41422159af16e4a074ae0fd860879c8a2c21eb2cc90986850b370413370b940ca5053a5d402eb808dcfd59c1ab61a5860768e45e7330ed99f0359a8b42c2ff659e4c69ba9070bc0111410a9c283ed669ee179c745570d77907c263c4d75d76691e83148e3e32dd9ce8e9f95f07f744517ed6c6ec850d815cd0b18de11a506104b2a274b3e3ae09b14ea918b1769d792db630fddc7875c9b4a219593f55e448bc6baa533a417da1a4d377ef13c2470587a22f0f17b723e46a50d5f4f556e2b853a32f0f33edad837c30c101acf2ef199013fa1be46fc437efffb53257a22af75f9b80f45a3a2ec76a46baa00d4bcefaaa390c9bf1640b82273297c0c1c7c332f416f2b02e214937b418471669784e4e2d150ad02d44262e238b19d4f5ac59f4950711130f4b8f2f83cca79931f1215ac4b0589735adf2eca83b6525b67470b17784c71d4f5333b3b61f456b3981600684895796cb9a7bc10977005a0669cb4f9a91326350f66a9d46f828c30a5e0d55237671b1002f6850b1e17125c285c5350190913778535ffec2aa9d6a4562145daf1b8f2483ed05894f4deeda76ca132fb41d0a1d016382102aa3c4b2d06f8a18e81dba9606009bfbb1948bf9066db698527b925f9734a950ce2a8e0d346042a5d616b5bcf3003962e1e785192dd8f099e54f4fd4e62a6c50ccdd7e81a8992e9c7e8ed9b225922b8362b920b8e86cb3868b15fe1f12dbf0373095fd84b8b137562643e9ba80fe31a817918061f30541ecf461786c98f8690c0da059d1453c212b9693754bd087f1ffbe2634634853a9d148f0c7ff54b8b820ed6380051a82181d35047efffd64f8d6bfa51e23e5556f28827dbe941e1d6e008879bb72f819c1a0bf02413c1faeeb707bd6c49c86b8119c0cf80452c0529775367de13b979e0c7e5226b1b2bc178daae00d1eb43d1f0d3a3c52b84243abc46c0443f8957a09ebbc8b2e84fe148595e886bf84a5042ce0bd51cb1f1aeeb1c7c1153727fe0f6184baa92f730ae88ff45e6ff5aa0cd0c347ddc79da0dd3cecbc6cd3e2536b61a0b24e3682d1943ef6c69dce1fe806d20a8613684ac418b58738ca1f4eb09b5aa625d8688a9313fc99a2ede007b2b2d7f57622a7107e2defd45ec3151b5dfd25d105dbade43664a1c65ab051ad2825dab99fab3a130322287a74160b76a245ad063cd47223daadb1ea38b709922bc4c821cfe5ab9140e464b8d2ba81617adb1340953768c938f208da60b705d00dc57e3d5468a8137d612806449f2abc8ddda0ad6bc27feef86824c7edc2fec759510d133019a2fb4d7e305a56251d051bff83765709d0a04e1f880ba84e91c8e404253797e741ec2de2c984868ec38fbbab042885facef0ec87f35b5bea0d7bb280ac6b5e913723e602e8e8765e9d726835fabf7927edd5d21a8fcd7622ed1f247596157e96857c55c3b8dc0020e6da62228d503d643a0f6e562210e8e40e4761c800ce0f000b05896f12d2735318b92c757d519b969962a64aec5ce51dbd8115cce1db5009c20a935a66a661f663f9ce8c43799f31b29b4d91eb99911d8a0ea64305dbc2749054e7448adc7efe24f630449d693bb6e996c2c339e932c51163b6410013a2b808d828161fea6cf90cb0e28bc3b623454cb18729c1f345b6e87b7b150782e3ccfca596505134a09712531552b317e0e3a5f8a9fce15800c3c1366f1eee074c7f02c88d41930e414b0e8b95422658c221ca68fce11a17eb425e58830ad9f0b3737762e311ee6880bbec4717ded5275d45754c39d3044fb1e9b7c532e636b77690d84a91a0dbe1b052efc1a56e7f0c80aa1394ab0a3ac1408dc46a127093ac9abb92bff2d8e0e56c7916f68cdb9006eabe634ea659d92a261d54c4c2fd0ac9ef87b5fa4c85ef653b26d4eda2a2019917361c84774e050ceb2977ead46705b29eb14b56fec05c5a6d029bd818e12a274c2970b4a20675347d319da9e228eac6732201dad515ac2cd3b1a8e236fe25bc552e4a91bcd19034c9f67fef220e42c3aad7f8d404146e0361a36de50f7c5c097c84bd0db0a5cd4b5632cdd20b866b471c114ee04f8df3ed3556add1149011d204a89d51d64650f338d5dd66cdfb68b911889ff997bf6e13722746ac7c6699a853b7ed36dfd0a40d1bc8182cf27e0f5f84986d734ba738bfe1dd75ba3a0ca8c3b5b2bc34ff7b93fb3522cfc03397b040930f3cd75398370b6c9bb0e3e859bef39505506a2c86b2d0acac294c2fa60e80e080e2bb64bf904f14df56e330051f540009e1010ba060c0c0a78c2b44c4a6063608685ca34eff4d8e37e06d39063dfb78dea5ce1e7e1473eb0ede1d2d1b65409c34d10fe0b560d85511bc881bdf50ccab718c4811825fb109172d0b387bd90beb7216b42d36c9e8538f38c3aa636050be0681f6c68e49c97e982a73c61df80748cf0b43d579316039e6d072ad616c5e422792eb6210d3b7ae5bee205cb5050d2fada983454b1f1daa2d2f98e771e7150d77329457966a0df2b29328f8940bc5f141b248dea9a6690e53af024ddee013563fb402f4957ecdf57a4e44da13ad27a34f3846ba99bf86da916430c8516624166c26d3a7301bada3e54d1f938dd690e283189b08ece3645be67c1eb1eff55ee11e4d98b7495c47545d1bff705e0dff5ab5ecb2230520c50a1724336bc3673124fefc6662dd8e802f6124aac2cce30403f82e4b152065f51e924194e566e2f9fac2800d82e3d8587a24fb5671623000afaa2a02e9eb9142d7da2a9f02fb797d7c995e6a4c277ba1692ec73705bb95464f33e7fb4548edf07579b46f98eb39eac684e5fd1ee65162062cbef301078b5702f5c4bf8fe31121daebc1101c54aca70df008582c46eca5f12f8b96f12677b4e07f44941fd7ba82ae5991c5a74a6ffb6364d48b978874101fb47afb2a6b7ca6cb3bb68ef85c179f225e6e7cb1a9816c4d8781257bf76f4456f4d26da1d5803e776ae54f5753ea269cee5333d4dbfde6c56571ff220dc62700ac6d9c791c551eea152ebd82f6082f1c0886e27264e9218af608e645acaba668b57c1e6fdcfe1873ba89686e8936a9e2a88bbc706b665938507bd9a8aaf3e1e153c1a4361b76a053f8d2e2d59f3f05d5bf5523c27897b59c65eaa2fc39f3fc1a1b994c9dde7b64b4624c4fa95a60ac21a263b0a36f32a8d6abaeed48f3e4acfaae7242e06dc8c844273942fefa436accd8f0a063a9717fb9aea6aa6a3c5f69d7d6a31a84dcfaf377ba33505ef0177210662c22bc182454becc81bf5ee49bfd329f716eebb3aa618c2a3079153ccc74568ac7eccfa28e323ec4a12fe397fb167c5fa9f34de56b872de4e64be533bd430c1c6dc8419f0f344fe126c2396051473bd8cba6a38c2ee85654e0ebb2a24f0b83f6c1178187b808035713b43b19477c3b84782d1d739c36a600531aa3668c8a15889f9d8ee98344437a52c2f31bac9d8df602682ec28ba1d02c4c3b559ec4968ba3a6ff6d6541745840b6362bd05188b55e0c01efc8256da46450ac355ea48963ee9a5a1e4706704953d55bce83a155d42509f215d91ba9e3a67478a965d7a81c2f130c6b47efd5f50b8fb93938c66210a823366bdc0b43c00791c7b772c7957b2ed40138019249f5e90808347d1c3478f0744c224413e7e796620b9a8ea3b433d1d69e88002892a059e2c7d251e2948e0596435d3b2d5438ab900328973a996b1ef85ef132c9ef19df2ddbcd3204326b541639cd034f3a169a18c08dda525166a9e11497e1389a5e3c1ac21435ecdbff044ac7d4e094610c7c3e8bbe41d63f4878702a86dda9a5542104ee933054d42c676b0b532bbb031b03fd6ac16e1938cbbb87bac4ce65b1b07ff0d4d06b5622369480c0ee49b2f4208ef5dfa8b95c7a6196f66fd48c2aa157f4f54657e32aadf29f277baac573993af60711e9a8aaa515c03369068a5bdca57d754ebfb178989913f51958e7bb1d01d14fa4e93b29042c5e505d2707e485318f7c3415ba8fb0f2914e04b76cf6f1b624a540acecde2159b18a10422b177b322801d2ecc89661b5d5d3b1d6862b6a4172a8f0be1c95a1562ea6f29a460116e331ddb21a4812bb6c89d472cd1e126a17597ad1faac12d91125b30148c96a2ded2852a33e6cc5e408bb44cf8d0d03b4b73fa90089d6e9fc17f0c7a400a827292a13ab92ea3f09e4ac7b6109fdc00c21a517bb2737cbe8f37ba9f5718106f3396e06edcd02eca8dde49fe375977c3e9e1db2a646fb444d3b8d838a1f1f67b02e1b2ac0e885da487e723ffb70c504bf948d5b02cccca1b013e9c089f2806141f41b1d5a2277c008b986c54ea48cb517c88e1e9f8b463341c27946c5368d5cd862d0734861219f02cd5d43497ef3f514a2f81c93028be8b91c739a22924243ab66b23f164d6bcd625a6a6a11ebc1b518737699b19141145ac38b334b99c9996dfe84425d9145189dca6853689ac19b53f41ba0ac0540ba20fc6f4a0947a04d495901685bc4b6f513cc75fc07c9b40010a43514c5a04b47973e72a96b6de52af8ee242101044ba65656e537383059dc2776719874b3e528e0764aaa091d2b16a4a6bea6a1a58e09017cf93bded9c95aa8b04e65a62d25151c75f6591c1732470e5d04625a2fb2813e9f8b75825fe9231932810a17a33f5710e58bb00b4ec6f3732407a870e73ea718f2d7387720679dbb72c9797ac334d70e0761f35abe44042fbcfe196942494c4c943a1f3aa3e857a31531efc0021c254202b8977670ef8d85071ce4dcdce7078e134d134de309239eb0b21a3b9c0dc81733b351bbd02075ea0770fb9b274dcff4aa4257aa427e1a53bec4ec25c99a917663317f608269c0fd19332fdce31e78036640f5af03f44c9b73c2aecd7ad6c12208b69023f4f2443856ed50894635ba2347e7f213822f953fd398b1e42243e8b455aae8c0983133d9b3754b78535da58ed17e4adcdca67e4ced4ba7648c23d47ab9d5c9bfd217219e7bf123c835b36102a74bd23306ee977b93a91f7a8bb98c77ba28faf22ec01b47ce18b52adaf08f37f79a72b4c2148f922706fb9fabf08008c3604bcd0c962f65156f16f65b1f7cf23a2833cbc3b60e552ddfec02a932826964d72b8138e523b9c69f61ff475fa1d676fa2f21c5babe102945327e0033107e7f500d568cedc61ea08e3223e1c7f8a3e8b870ab69657c2f0a3e7710d7428a2a393f8ec62b7d1b40ed690b35db922c6ea4d405a9159b4b2fe0dc0bd7371b5c0f13beba7957e0959aea8e0047efe460564593b7bbd0cdc9451ba602cceaea6f0544006e1b4289c927f690c48742f44aac540f9894ff656a5136be19f1cf48b5be0316bdb524fe15a832d51f8e8cf8508b26e17c5b98fd4790ecd6d39061dabf5cf851ecf0b4c248766f54a893875c6f8d8240134ea30ab7478846f6713098042019c37379040e91039e321364ec56f86158f7d6045e0ebf36498a2048eacfe849845ad53564d9c9f693e479c778a8ac353f16d49f321cfd51b0a01fc7570399ae2e80421a272bf9e7e685d1fa15580683834c75a3eb68c1fde59ff1549bace954ed182dcf5b2f6b51549d0e838238e8c2e0346a500af76ae81ff9562244a7b856a214fcca894bf907ddeb6c910a302f7ae922d57c7b736f547379f75e79b1afc268ec088a059c9be6846cced56eee1f7d0b9e95d1a48417548d4853f494380a0b25bd1dd1d78dc6ffe41c50643aa1cd4a428cf85f5b5b68ed9424b00a4049c951cb204ab45631f38484603bb4b901c710c23605b38806d83da00b05141dd990817d73a712682ced3495cea192bdba6784b784dc9baee72525afe1e918793dc64153244204899033239bae1c7a54e2cd5e70045f1a499f265545a354c19f2214c038cd4bac20e90e10de9ea087535b14ad1c6fb06f33686f9bde08278194f20509cea808c956151aa65868ff0bbe0e6f426492bd880ff1c03861881327707f30a737e0f2485683a4aa8ce0ddb9d6b48a30724af2ac0e6c599b105ea9d02a5de72047f61e0dc3c193aaa595c3aa352550eb5d71e4812d6526a9daeaa4490a0e245d54f2a152ce1e6a1dc88d03e6ddf846dbcf7b82ab6157c9b6b3c7c4b4be5456138ce981fba26477d9a3057c1b83cfd0770bff813571d88071620ead058e48f8a6dc68eed7256a170da95cd2409ae67b1c0a84c100a67ec43604a8044598c46d0368460860dd470197905335bceacebffc8a4f1546ac2c1607920c8042246ddbaa2bb7e8f054bba7bc87ba477020b1efe2e7a3a89a319f2805276bc91b0459e5d1cb80d364cd295d4089a9a546c2e3015050bdc7b3e7673bb6186e052efb5c27a3c1dacbdba46e07828790c8d8ba1554033c9b34005dd2dfd8911e4caf3c1b1fd4e2e32ae0222eb4f29f5206b972f509ac2449e4bdc8d1d01094b6b14552f0550d93440db4a6e4b22559e9c609fd34f092e4e615da67611e9fd166c12e6de08ec8047d6309417f4dd5b8b3453e37d45d265fada81d3da5f3046329bd50ab2407d70d8b04190e3344c462045a098a8f1dcbef0252babf3d89790dc922c1f8b80a3a143657ea9322c4e93a69431066fa4829665f95ac0a6901e564b5ae27424cb19260077b5c55ab9a7f28d9325aaf09542a84746c0e0af23561a24bed99f80d9d75cc1e019512bcda61b62d792d35a6affe4c8834d3eaa36ec59de0645ecdc5e3ad7efd3e60a0197175a16c562d6b165c13486530d3447d0fe10f2510bf18b62770b88aba2f53f55ee4cf2ce7d82609b4a1b4e9735eec53c157e06ddbbaff5cfd5f41236fea05a0ee0c52921468dc3b01e89b9603a4cb894ee975a6923370f7d1440e8da0c416ab7674562ccd302c2adf1d6f5d7272741163a1113be8bc7fd59ed5c9f91c7abc94ff8a39ac536121f557e9cc4371219612d39c505df9f75acb94a1fe842b3bf0054eb051aa3a9a7b93e04229cb6fb2bc602ee116eca5349708cd870af1641b27f7acff63170785c1fa3ccd84f7342b87087e59643797605c8d052355502f1058e8fea5ed22a2909aebd99b7d1e9dcab56fd2ea12aabc338ca7658e5b1f781ae5c429550c5b925f18aec6071b4b8e96d4de19f905ae40be63e6ab6fa986d5daf504195a3cac5b1f08f3a78e3f3b06f99eb78bdddb4836554d9a1b951f44505e4a4a1dd91f2b278c9b8f67bc310dc2adb1053a8a4b718a7acf0589c55107124e1d07fb21438cad48257cd2d58f60e7986105bb85e32133c7fdd4f1729642895c20e57382e8810a6a59162703403bd715dd399543066bbbd3a7d86bac0ae376a49c47c57d2d5e21982a79ea4ef1c964901b2e90231399657be35435a0996f1cb26199b3d0e89844c429c31613df97d37acdbace40479e5726e93057747d6e9a9153463ce56f35d54b93b5ed74039d3372bf2ccab9ac9cfb24eb7793b83a143b255bf283566b7496a7de7b6f1fd00182dfb6d7e964627646f9db36732abcd074ed32667a51459d7aea75a48b554cd5ec5466126f89847e36ff12da65ab5378b7437ebcf34a6d4a349b92c84d85a7d6a2e372f12476e55c5616c7bd80814904f5a14c18ed3bd9d16379bd32c6c1fcb0977b4ea92da1515a190ff666ead5cb09abd9d399b80d3654a2e42e71422e7cee07ec53434120f3e93b653b6d8ac448685742b13136127b60c750901b27302fe4a8d331fe2c246b22115dbc9d2f3c9f560323bb9b7d05273a935a9b882504793b8fbcf59d132368f8a04f8d722ec84e098508ed3bed3e583c661a085e45b56216f42364fd978417d34651a18560d582a4298dadee82a2dee1bb701350475b011886be40e477e5c31972a4caa6cf9f16872155f09742a2b5452864fbaddbd1f40da5b5b2b25de2db94db7775b39b000535860079f7c2566eba818a40e7db76fce66652b39b0d641b714c9c8fdbf0c4d11b9ed6ce5b395635dfea0e66ce34aba5e842aec1f247ec1388d06793090bd284c0cdb92df5efce4fb537bb54b6c2517f2177539835379cc19d9cebbce12b4fd08b64d907a1044b57a18bd9cc5e22d262da0bdb318ab177e29112a4d226cebaa355e2a1bd2e6a220b5feab47c86f198bdf7399d7bea8234faf4083847bac5d4a542e70df1b900840ea80536a70f2976345318bd4072e7242f88ea12824c5790ca396b174fa49bb751c47eda284024a571aa6d35aab06e2e2b8cb343190f582abdc66f72565e844bcfd125c73cb1c8406e77d465af75b77fda1c623b890e7b965f04d36a19a507b43e05b385fcc9f9d2210e00adecca645b28feb1b27a1624b8c46e05e4d5b0837d55512f11008e3c51af71573ae62b1ccdc1e38742d65883a2c23d952171310e16334190d7ae091f4899caa64b13701bde22a0f290e4e3c5d19763f2157a7728c1526e8475d7f71dca0931d7064f5c7e59d7dc207cbe90d43feab76931ce4e8d97891c22037cee017a11ed355e805415a70378a238621c824526ea393c3711327ed102c54730648feaf9c7f3725e1ad689dd1cf8a571a2685d2ef214dfdff98cb9637639b7fb1c86e93e77660ad4ce3a2306246be3f1941b670de0bff8077eda646fb9b74c52ca94a494011a0321036f03f9ca594e5a7fce39e79c94524a29fdffffff5a6b875cb88582a57dbab9515be1564e9ce86ed40280434122010881c251a0e80851a0a8d8cf160f638c31c62d68a9540a007c6aad8aceda16e6ee3df9d05a15e5dae5fcafd6aa2a8ddf2ee7436aadaa5608738e9c339673fe909cb47ad6c1dae5a4f5fb24a59452ca39e79c73524a29a5f4ffffff6badf5c4e5e22d149682e00ab64b9da371b48dbea163eed39a032ea8e7b2d4a7d362ce0a56d12db97472dc2e6f86ba867eb8511b7948ad557504b00ff44c6e1460517dc2d9bb8d834f398ea35cff871e5aaba211b6cbf93f44673bababbadad1cfc9796b55f5651f595a09fd09929793d620fa94f5a9d3a7aa4fdda793cb496bd5ddddddeeeeee2ea59452ca39e79c7376ceffffffff63d682d60054f4e995baa5592062882884d803078fe521458d7ecb489fac95564edbb66ddbb6e59c73ce19638c31c65f85feff595a6afdcdc6b66d9b084ca552a9541502492452ce9173cef9415eb4cb495f73fc58541630c618e3da2e27fdeeeeee7677777729a59452464a29a59462211b127daa508b52a9542a950a60ff00d12688b8829803878dfbb478c3636911671c7539b825baa0b66ddbb66df32ee79c73ce2d5ea9864a4ddf116ed43a18638c31feaa55158542a1509b8d6ddbb62c8e4623f81d18b17639f363f13972ce39e7ff6f9793ce39e79c336585aad00b4b050bef8a1b4882a9388a31220b443c0d0ae1b1bc6899227dce4a9f9366b3826a4e6ede75dd8ba730042bb04e980933613411e804c418638c71c580d3e9b4d9d8b66dfb2ba2b0cb3b1fc23befbcf3cebb8e524adbe5c418638ca594524a59853e442291482412c4c17d9006f7c1205690e33e0de2782c90e40e4939734a6edbb66ddb3652e3e05e3324fa58dad31edca8ad6809abcb5a2a56b037f5569f659f4943a21518820cc056d5be3d16d3c6b66ddbb6cdd0b49973ce76e9eeeeeef843a3d168341a8d606a05bb25c0c611dce00d30e63ec881fb62dc0759b84fabc07bff59f6f9682a60aaab90e87b6442107d86b8519393881bb5fa72e34d7693fd67d9e7d30243de55dc63d1437292939ce42427a59452b6777777f7cf90f6a1209eac33ad4a769dbbbbbbfbf0e1c3c7088931c6584a29a59439e79c739e29564a29a594d3dddddda507c45e2ee048e47201b55a63edea55c492907c4c4e523eb831c618e31d220a46146c97979db48278b2ced777131f7d8abd04fa97b5e69c73ced9755dce584a2cb1c4124b2cf1a44dad55e59c73ce9e73ced98330e79c734e4a29a594765dd775dd9c73ce39e5ffffffd75a6bad554a29a594240f5eef63bf5b1f6b82923282848aaba874842a2aefbdf8faf9cb31e79c739e14c38a31c698fa0e72db1ec4933ded6097a515c4937d07bb2cfd199233b6cb496ba5ed72feffffff9c73ce394d7cf8f0d1de514a29a5b4d65a6badffffff6fa9584a29a5947aadb5d65affffff9fda9394112434efa0773511b6cb49ebd76ddbb66d43b171dbb66dabb5d65aebffffff731c97626bad4d29a59452148ba2592346d8e0dca8a9a4b41da01f37347794f012253ac212252af63418db3d44ea1253c768cea050b10923398e9301c66e772927fdfff82448a85815b93db9bdd00c350dd590bc81c989ad9f3b949c62df754cc26a16641f862c7c131685144ed8ee09a1c7947e1f4b1ccd3761403c596764a9b01e0a52e346cd00212294446f8c50172a23aef88a151de18a15159b007cc20d4188d622d2966609097d0c3061e6689a1ec442c9c9226ed40c2073440e209a2d376a2a4c181084809b1576e46a80b5aaae5907bb58240b8b776461a998e45e8a576bf6d12a88020e2a29957c3e3696897da0931b7253c1d6e9f93dc7711cc7719eb30761c2c0ab015f69d6c128acdd65ad49e1652dfa5dd7755d5742ad03d8af7d7aa7d3e9743a2de146cda45dce87d45a55ad2a206045bb9cff34eb6057fd0f598bd6cf3ad835ad35e7acb5d65a6b873c24432efea5f89a627f847d10091b122a2af6419af3d0ec83445eba5103b98e9087421d61285431cf70c58ca3aeebbaaeebe228cee0464dab95beeeb91e1cc7711cf7b66a9743745dd7759db452ca9973ce39d7aa79c885ac200accdca895802961c284ad20916f376a00a871a36601c056100a0e23054f21858e3085142ac6622b85a4472b00e47c68ad8aaa805c5f0de07a701cc7715c3744d775ddd575d6aa3ae7c8390731b0ae284a792af2b66362c4c8c7d35a16ad8a91eb9d8899890bb5083df741f86aa5c913582fbe1742c3148323c6d80d4121f763e79c93d2cbf6c03e7125a609322fc8c4c8e020b303c97d2699930c0f484c324928e9b45062494848484a4a64f2c87d261b6830b96c9c747a40a92e483991c1084f8a8485261b88f8dc4f5c819fb80241a6191f4eb00b05d6490b1a84ef5f4c2f2ef7055fd1cff821721d825e6ac418bb5fb2e9450729e59c2f2fa7ffaf95e9e5c7cbcd75c304b359181f687345d60403034cc7a7d3d9bb46446066380106e68a1ec6e58a3291c7e269511b31c170f69fc5300ceb74608ad03a2eb04e32e079c2cb5e8a9b2b4a99b1e3ade7b180f07ef676c4d0e88009c4e1c247870c24c7c0a00324d4c486ccef33c5eca0870c91982284c434c105e485183c3132321c36d0d92106769a71c9f0a0062b938419ac1664a868a8a1da80e17b9081ba20c694818cb421c501b78188989e01260718667c68c171d30c1057de679af9e18a32ed44878e3f50a181ee6e9cae8169860d4c33483708d1515a2cd0a9db9a834412f096eced3f8af24226fad0cf63f1ee0b6043378dae36c3a53e16ff589866b07061b0de0ba1442d02507b5a0cdd0b40b80014164c7464263400810529100ca104383b8c6052ca449a894df60386d7fb4c35e4380f0b05032619789862e85032f0f4ff3fc6ffbf115e66a8f9eca9cbfd1322a060e09389986ad0713522289cf3e5bc4bac7004671c620bbc7829e2831fb50a15ad97ba51b3efe66af15244ad5638a294524a29adac890faa5d2e28a96a75ce39e79cd3da2c832918376a201187449728c33b1c987a100a014f100577c00c7980a497226aa987d7eb53adb5be4cab4549140a8542552fe08b9c9c9c9c9cf974ba5575ce9173ce39bb747777f7ffff7f12894422914896890f15522491482412c9a55f4edf3f954a752a954aa5b0cc0342adbbbbbb630b57b831c6dddddd9d79463e1a8d46a3519c41884f777777f74e76280f88acbaeeeeee56997d3a9d4eb81b376edcb87163777777a758cee5025ed08a9546dad44591e31151566641503f6ed444ba9122b8c8e353b1887a10422822124724b9e41381885bac015dfcff43933ef9a430056b7b5f72d20ae2c93a555629a59452feffff8f46a3d168341ac5d168341a8d62ad2cfa97c516ae7063c7d8dddddd23aa512854bb70b54b2aa594524a39673bc618638c2d4be50ccfe5a46fd29ff4542beb5596bdb067ed85611b84afeb649e778aa3ae4b9d322a4312cee9138cb1db5dc2d8ed2ee5743927a5ffb5a25f2bebaa2c6baf0bc33a9d4c4516e2292324259a8afbbca4623f8019a06652534201acf1e16d848078b20e7659abaa4fa77422401da8901891827262f2292119110901f1641decb25655e9cb0f1decb256559f4ee9a68d060fb80b9a6662054577afa006059776778d0fb7bbfdd3353ddcd6443ed554439211d13eeb4fdf748a7b297aa6796852975a478f7aa66152375cbb4b3927957352fa5f21fdafb5aaac5a559665ed65597b5d18d6b1375711f769580ed6b9efe6bec8bd144f8b378028d9081149f146dc7e4419b125e74784a121e747a763874d4907c7a3a42343187006c2c0ad066c8130207e3710e887739f039ec863b7bb94d3e59c94fe57fab5569565d9cab2f6ba30ac73619d4e96793c2099070424244444646484a4a4e4f331313919b17085a4a4c442906885fb1eaa4f3c4d060bc6931c324977b8403d60def7529ce490897e4affb7301b5a6b54b354cedd3db4723ba8db1dee762775bbd3dd6eab6bfb272f590d9da0325127e7b6d6c9b9ad75726814797b88da5e4048d7c30f345470351aa6186f620587acb241e500081a40b8a24c9ba1f1e38ab42c0735d85413034c4d4c8d073450b35d91a682473d6539fb4026828c068e16dc048d1e64d0e8d042638217684a31688288414d72c85230e67d261a1c9a03470348a094529aecd1b86400c769666e0772b0ea1571b796da8e7f3e9ad61f6b625251a070fa7f2f0061ff60e23412628cdd342ef713579e122c488304e891115db8309ee608346ed0c0e17e68e0a03eb04e62781da465825982209a20dc5d4a144d0d28a5f49f0633014493c2e40dd6898cdf415663c60629c87640ef33cdfc00c64f3a2795c944da9c73ce395b90bd641ec8469059183d6424c85490bd290686fbf799625a30826575207c1a4a8cec4980da78d7681db94f0d446f353a9c54bb4b3927957352fa5fe97fad5565d5aab22c6baf67597b5d18d6b9605ca86118eb64323c3817461e84b830a2e28e987988a4222e84711467222e2207081ea8d4cd098812ac712124dd802e50066c793b622ab6ffb8d006c6d8ed2e61ec769772ba9c93d2ff4abfd6aab22c5b59d65e1786752eacd3c9328f070424444464648484a4e48144290f2452e1422d444588c87bd146d8af2516438f00019aa5a894107a3b2201802008531900000221108571408db31049680714000b285a4a486e342a2e4896c863811021483120ca18600830041863c0ccccd098072287bc9d40bbe8227a12012e4435548bd8adec1339a97b76ae25b982b373600eeac56b045f1f8f70271d25c3c147f5fc21b56413380c17c2a58fee0a485c7d9c2327a48abea3daee3178f600337757fcd2a1ca992d67f9f9fbcedca3a43e79f1538f996e9817164eef3eba3c9147d74ba891548af59cbdc1bcf0dc11a8fc35487827ea646228775711bf67dddbdc3e57a7f24e8ddedacdc22122551597f9c99f257079f508fe60934c9d0231ac26a50959dae0d4c8912c6d434ef7f54680570997bce4c650c204c06ac2293c53b65bc235eba9b4650a9c4b884a2515dd4b2da89e1b15afa640cdf324eaf844a9eec9f1f1954c506ed09dd6228173276815335147fba4ab509820eaf69436ffb95f3d4f9111bcb6417c3541966b2417cdae62374b13bbf2b5d996d2217ad16a18b6c1d450d14784ec38e28e8ee3a049f809f3dc9916b9cc02951165d88d93e66be7ce2395d7f4108ef2973469f469c7470b607ef3f5f3cf2fec19791c589a208866bebeae47459d5c1b62adb428c2f0634242e2153d6ffbb308bd3cce1ea2cf0e67182e5ac3e313c8ea86bf14703754815a0c72d540147a19d06b86931fc9940c38a1ce6d79e627ae8f05377e44a68c99137f8a5a9a9dc14bcffc39b102a491518369a41c461b615450d49d712126f186c1222ce5e1c138fa6d64210a3d38ce70ce8d5f697088dfe7beb0201c755ebb66af2d2f3f79149dccb4fe712a5698420c810fc6ade299b96868b5cddcd000233602d1b7c1ccd08de174c7b7c24e275761f346aa8eed25896a622bd8e77813d8e47233d8a7a629d69c8726efc8d4b17b93a9c3f6d218e9ce9b440dd60b29556caf242a8f658499c444636e1312f14474f519257033112236f2a424e0be75acbfe7e22bd397a1f3cd78ad422f27305fdc1e76825c15cb6bb22a76dfde1fb060bcac625a509a0cf55fe7589746636d406189582ecc9782926e8b41ba01be3fdfd8d4f231efb8752ff872084f1be21c63c85d5777aab4590c84d2090a03c92b613a5f9e1b13d7e2fa7c362afd68f15f06167e88d17b0e88093f28db40e9806b0400ae009600a06e0e97b7acb7f1a2d8d55c437b84aa2b1e58c15f2bc3665d279bd3cc1a21c0b5770a2b62cbd096de71bfbbd453d5f2d47d16a5fd3a9672e5a3148eccfbdeb5e5789d39de6718119d40659b74ed553f0ae8048b6093df3d709c847980228d549adc10a5bc9068bd777d732ed59012077736b32f0554a382d32f4fcf62da6eb605748f39cf3388c0d9247032101220579ce36c9845661ee4f00b9e81c4d5f66e058ce314e65a74684458b30f661eeacef6ba4e73ddc7e96ad8a4feacaec3543f5a0b62363ab145c4cde9a5368a54c7058bca4d5c19890f6c33a7c69d0bf9d5b75ef6e5e912b3f840aa207a7836ff918c4c22e3f9783d11768d84cf187b4c80a8a5cf495845d71bcf3c0617b99f1c643ad6e83f44bef8695d1a2fdbb8f23652a679f5838d0417c7052163717a3f9d51389493f9bcb96dbe3821874cd63c5d15aeb942645eaeb1fe38e4e3760aaded093f1e041dde6b08f5f458a0a6145c30e7a7ef0e74dd5ef33ca8f09ec0a9a78f03b5256195293f7d77a4d7e6bac74287f5055e3d7d1ca85eaa411973767ace48d7ed351eefcea21870b868352829cf3baeb4a88fddfa4f50767f38747b2cca77678ebcdf9f27e4bf1b4e3fa88abe067e7f7f5e8c94454845cd2eaadc9d4ba754a692f7f4e68f66cd7e5c722fc5e650d76f598c2225a379281cd79ed4c11e9909e1cd7935e972b145ca21611615725634bfc006178491c74afdedc3d5160cbbe806a5d3580e0d86c823ad2e0c49f17b5de04bf5743b12ef293c8fb63ede213eb940330da8a69ab531af6d359cd45dc2e5412239c915f31c82a893f46b9ec379c21f8646a1ed9e0428cf73080d85e8cd8dc499dc6b24eed8e9e6b5faf923033c9dcc9ce07e5c01752c49116fdf4f6f38895671e8bc42f1113319ef468a3eb7e8907b0e32fc14dd07e7d10b2ac14880e5ccd14078385e93438bf244cf6b85d3759320b853179ddaf2ad3566c4ff1e061f49cc219d2ccfa263d12a04600913f77e6dca57370d0d4056c7602477657a912bd4cd94f46d10e27edb75c87833834be8ea6ee3498fb09271c6cec7545e43c304c9a6529040c800e1114dadb522c8153df56971f036c33691bb6ddd128c00b0b3abf3d3199e050c11e20d786821f54f3db871102050fcb6573e8112cb96181e28e61c3b41cfa36c95c3539dcd9ca7ea828775a0a1a2f44dcd971d23f77eaa369eb2eaa1db6792ee003a60228992d1f4d293191da4a876d420dfe4a146f8464c0936376f72191c0544b6d09d86b67e2ee708fd57e0eb0f045743784d905a4208d3b920680b30a8fa5a90026024a81c44e1046916ace7d2456ed2147d12a4605f5f71e71f00c453b6faf2168060aef89a3cfc3e453941fed21482a9f0ac1fd0903cadd64e3084d38bac43e8105aa7aff56dbcac001010cf8a48bb6c3fc14029fb7775c509e11e187182c1421662bb25010300f2c23e2bdc2b61fff3e92a8c6690f78f28567847a1520de36db9bf2cba51300c5be6947063f3519ebb52c43336e2ac04ef4c48e8d098ed6f6e9c25e6f9cea681af053509a5c303d7317c434e319a71b25d01fce89baaabc82bc313444e42cea273e7951861a82ce7b96ee2d43e8ac6298ed012bd50d97114ade67548f176c2764dfc3de3738979d5bbb602f5a2e3c5b461b3d0ed25dc41e4e9137290ef7d1061abe87079f5893fe550c0ae062c530ac52802d664cd5945046ca0432058843dcb34eae940d8e30eb3c4194a42f247826ca21251c104b8ceadfcb618e6b60046c5546f4ff86601112b0f8c5e5b8d7d6c88ce7b3e18044b1333a3853d1444200a4650308844fb3b3c1b557668e0aeb771f7c18040216e4fb70f14e2350f8ce911a08707f678fc35447ce448f56ced9489402a02113313d05825e6d297f501b9703656047fc03d1e9961b8747108cdeb5668199954a78c9c5089e428a773f1e8b2fe952de09778329fd09495a9f625b2600cbd5e225f5f82cf3049045ce444a31806b8e494e67af57219faf2592ced2861c887d7f70e0856138226ce80fa596f6b6f9fa99b1056c7a73d179c6b813d8d2c27470157bdeaad67e080af51c262b5f8756aeaf6faaaf3e390be0ad43f65e65076366c2a9f2be0390ecd22e07dda487c95a2fccb692ec7450148a2673950379c228225ca5ae92ea06ef35ad6549fefaa37b0fbb9a7ff0150aa43825986ba7f88616265a3ff29a3d3f821af5490ce0f64bc1b7de9dbd4bcf0f82757b56b35f48b183acaa3c6e04a6b3b3f3c54cbaaf958eba1ee51eb08cc478a0a3780d25a54681654ff0719683680ef7c220be47c1daf595528086cd17c3ff4299b2d6c00bad9317c597191f5a9cb2b629543c87b690239d7b8562e24d8777831561bdf8e04d354524db5965977d8d8bfac6e5be62318dc13710ff8d70434075d342781e332cf61b3241a979f7a5c8ba346301e2515a819edeab3a3698900429acbb9147b15aec329d8f8afad82c1a1e60164c0b1da2b5cf73436d02bff80a1cf23276359533408be97fc894a6ef81aa82751d40d33a9ef19b1253b308c33f22c7cb6fe38cc50d65349f8618d0c74dfde95e92644b9c2b1a4e866ead395a12a043bf70112d3651f1366caa6ab3d670c0f0ff89d985c8260db1a1968bedd6b63cc7e7d8d88454a49d58dd80af86977d49514d62a1f6809d75f1dbed2b0b6aee2f31a2211ce257cb0986f785c7fe06219409c6b1d1367811fcf1a977fcda880b86fa4e29d70247b4bee782b945bc6e7e1f6dabce36a3babf44350918c5c5a08a74a3bdbaeda8f033772f7efb93ed4bfad5d1d8599d5895e4b239100906ed9173debbbcd0d8ba7437006baea2d556ed6d84a65c7d78ef57f6b842d5b060ea15e2cecaf419b0ad9fa5a936272acb790540cf6108cbc43af646de84cd6024fe4a1a2cac26396b76f95d6d5897b47e350d88bd26ac2d12fe1f80f9e844e4dea3d4397682b6b64f1020a9a0a6c0ee1cbc3e538909b753e5950b849e0218ad040b14062a94c9763b663083d479eebafccb8c3d5ea063893fbc38d1c26ab417e7815a91d9e728f7eb245a9e5d86ba9782b9f91d3331cb66673ccf09cefd48049d92855e756dc8d990d0872373956fefc0d0fb98437147b638ee87fd4194aed669c6c73287f741851f35ff77b76d712f00049150180e04d918e114ca0a185e500c8c3fe08db5e0b6a49f72f9c296e4e2cd8d445cdcb14de99304458bcc92946e2987bc5266f642c01c09863d7088f070c22355e078543e294d239184e811b5e730d348528fbaf00fbba0244ecb71e1617b4093a204fb1a0012aa6ca80073eb78236db2c5ae7ab06f64d8133f87aa241e89b2dd42d844976a2bfe0a44893cf574476b9fdc6e0e07acdce12665a414a183c547c770be303bfaca28db99152beb301174af277d748f92a96c888e610fed8afb50d3e2292c179b1a457e326d321456873617309c48e7d433f52525f100be829842c71ed96cb107eef363e9ea68b7a0f283cc254d10e76448bc0c879a156fc13a422fc9eb77d8525dd95f79f7d058988fa78e7e6082fa7b4d80531ad697c20d7987c61c0ba4516ee98b07c710c110c6ab99143f94af1135b014b850c3688cea09153f4f5bffd9508ebd8e0d69550ed0da2e322244212c0069a0f656263428404b1db070922e859f793266c930056112a385d618eeb1438f57b61628dc05d1742ee9bd6b8503f52294653269aafafb0b8ecd042cb7c7c8cfb1b6e87c947892464110b2bad993cb94d2cc57be3d476162794dc7034ed41a09f799b112ce9a0716fdb2adaca8e101ae526ce3027d11205f29c145770c486b898e65c3f0f86129b61c42fecc6ed1dc4d67cf64624e5a143e7540ba1b3a50ffa4e117cd90baccb77866d649d81a284755a1618b35628b6b8825d7df9f88e41298c396365e6642948085866e064febf01dcb6b230848930cf079ca37cdf405db6cdda1466047816716afc6f606e1b599a424690e523a728ff674073205e0eb39c80c506380863aae7c184023d222bdb21f6db9e90f1667d5a25a3aac8e6a1806464241e3afe526721adcb4261e27b714d38c26cf461fc1bb77078897c0c1147dab28af1bdf8417908a29c6c400a66bd70cb96113fa9f7f89cb4b2ae0ea11a4ac4414a24f24826edf39319dcbecd44eae12c904ee3ad354ad194702796e87f0f38f475e01ba162891552f18f5005795e1df5137195381a8b64db1026276e2024390fc4b40d30090dc8c8c88db1b8c4295f6f55e3338a76a4dfbce66c962f26d3a59ae3b8d03e6997bcbc7c24fe702a510bb55b51d38ee07dd59eb9b12f882b6de601fbbe46d04afe22596507c533fc3c68e88ddb4d5ccb393ee47e7061b7bc6b846c4e296f03d9b24d20e542b37b119a8c72badaff1a25e5246e954d9c86b1cb2d628b0fbbeb60654702f77b91201116f1910c6802a0e52beb226e51b2df162ac689232ce6802ea8548d978c053b39c6e2085ea70e480b8b23aa1a9f9fb10fec261cd6df5c4501d724c20006810a183d8d808a9aea5ec306581244b4e40801949c86e2f6949cdb147c29086a4cfeb9ae9d107057b6655d8ddb68c6e43c6203d20bc6b1010bfbf7ccb4169da93060e0be2358fe3a6d955e115352b9a735b8430e3e9bcb81714abf91ab1d359aa8a11d044777b60687a3b8ee17bcb702006bfe11ff39b8a0720464330f1b619cf50f10e45b913813b79d72464627f705e2f6fbe6bec0f86107d6888ab9b866b865289efcefe9cac9ea5c0ead60305e05fd22c78ebc06498400a43da4f425c2772feef5a5c7a27abc8f5f647fc2739c8799b362a97c9e56e60b149a272d205649eca9dc043f0e378994892cb172aa37a417b763e597c6e0027a9c1de53b558def81f73a787c34e666adb0274b0d0e40eb8c5929d3a6facaba4ae113b581c0d8d22050e2abb552f9b08a4195629d61d24ef2a916b8721f883b2e06168ab45e86a07d5041394c5b56274603c1145ac5162c288a5d6d808a8249053afe04d213288a6f8778e38ceac4354b90bad342de7c6f2cc9759e45b342785105bef76a4439720f6436cbfd328adc07ee58e0c2953942b44b59e7dafc641d2286a1ac82010da993ab9e0ed17873e09250308ba8bd48852cdda244618920c1b6ba50bcd072753a3627d33c68004105bd6795b91f3dc16f224f206e360b391358814f24918f61c03381546e3bbcd21e992ea202df5880ec1e2c409b62c01d4664079cf0ff014e2ea8d102e8a208d94f39f68224d33b21480df9f8fa9aafd9964699f51ed9c67d05bad51ea255f6065ab658f572ba35d685053503fc0cb1c5e95d9e186f3b20435780a6fba4e193261646f01d8e615b0e41c34be306f5f36fdde1c00c3464996052bdd92b0c8301fced35903b583a77a7c5ab8b59e25288cdf49af2b4758ef6e7752566f5ec45a997c9bb5974876c7fbdc2f552ed12d69c156ad897245cd0832aa96b2b72c181d3f13fc0d7f1a9a9b4fd58bcaae083afcca77ceda7d22f5fe5d6b595679357d6c729299e4b049ef60f612c056d0794cb7344ae8aa178a0e147b7f080000770cb22d4366a55150aa0644a092eb4eb9b8eccabe67087fa57f969d775ec29c69c293396f0c6a66de0e86112bd45d5413deb247d38735942fd6e4dde17e2db829a984b7904c1ea47682bd6f4c3240058a2250f034fdae413a966bff26aad05df6e1ee15d659f9266f5799964947f33bc77a68ec06c7ec2b8603fc6817156439b1fbc045f7c8966fc80e7f8b4345246e79e965e54e7a4fddde3fcb99f94f1e8d3444abd4f73dada1b28f40f155309b59e1061c60ac095c9a42740c3c3e15eb8fc1f86c84e25fd385edb0a2d4733ee71abfba2b087f16ae6128824548a91f27218b66acea32510ee4d46ae1fc17707042d5fe6cc99f3a7f4d0d48b272f0ec532d2ca2df634a9a6c5b2965d2a52ef24150cd58b06b32812634678b45c20e7c536345eb47c683aed3f16eff2d562de0d8ba28565f3079053cf1b3c51bd3520455ee2b16df63c990abe91417a7270bef96b3d699e4250889b86605773b644d58694649c6e711a79fc75394deee63c9d552b43af218b37ef4c2e6f988e38b0b9ee29df5832f19ec03f806b381d3669952c3a20a22975032b3ee26d3677b1ead3c5cdaf1b322d40528c40c84a5ef70ce82f0291a130751bd41f6caff0194ac7eefd74c46f981dd189c62376a3e59869ccd11048dec52591e7ab5f377e681a3496cb5d94069d14f851cd6f6876bf9eeb014b64549da268df557ff9bc0fff83cacea7dd3a2c5e9efa9d540312003ad80bd0d0df7c5260cedbf688c5ea0fe98d1acfe28e60c7295c551f6b6a3d58a3e32b8b0bb97ae83d41a1c3e0a44781d988ab3de839fee4ef84d608c37ee0ad9c6271e42e42462be168300fa1e102c566af15aed924934bddde6a313436288bea61e7da25add2e6a7989b6d4c8f3a0bb38428688d18e6f5f10c31f54ecef66f214bf9b4984599e65a0e66e087d53cb9742aa41b13627d25f4c678330125c1dc75c1b3b12d542b95ade571e063d62c222b6a65e2959240bb1d2eb58859ffc9262c3f3537182d8b910c11f114e0583945fb7639974f958318f5f5786d4c2cc7a4fb49a086c5ca52e8ea2679e8386896c9867b943ae62cc90df13564a06b2e6ce20eacf7bd45a02f2dc025cb703c27c11a27a83a5c5507c8195a2b823b02fb7f0a4906bfb8a22a37b870182294bb32b374e14249ba272a7a3afd8f25387b998c9e18d202e90bd95ee372cf168d750fca6ad8ec82510b2918ae9b48068f2bdb79142c7a3e7585f687844bd70f86be2a36704f8005d2b4c1b18e1d8cd9164c91ef1fff21db8cc9953dbe9ef9a5d5d375f5f0f039718b00f253061429f59c769a5eefb249472d0b42dc628a16e43c58ca2b85c3b5a149070ac0a07e15001a5006b0bb86d1265349d1e3530964d1ed1eef21a8a1bf118d53ce63feb8f1f29c64686809dfb2ad7d22e7fe4712b8484293393d6a9178727f62b0e45b0c5ff9a4170c20b59c5aeddf212e46a32d99c6fc653c79b6c554de8c6bc300e2da7dfdf857d5baf34a0cdef745f0c73a0e3ce4424260c69621ee1580a904f486942a5541b888c3b034a73d8f06d89335816c998ddcf255c6671c10ec4e958156d7f1a06f11bd63a6af4358563676dba161e3bec9713013e0d3ee7bcbebd54f5ba86d54157a982ff617129db55291ef1a7504d1656e0b1e2f2954c4ca58ade3dcf681831025988f445fedf2ea7b7ff00f36746b95ee3e0ab6af3cc1832f662444b2732b41e138a7daddf19e80dc2c08087647334835294c8e930a258fc29d691d89be2b410648ba7c16ef735631dd012c807daf3f6518fe07918ff09fc6d334dc3adff818aaa1b892c7e4b307b44953e11011baaef1a17317b80853ee1bd2208d52e5bba716d9fdcc4bebd16ebfbec8d9d987a71e4b60866882fc982a3283bbae646fd9cdf070edef7b362860214b9ae1ce5d596f30aa068d011122188280b836159df9abe196ca495b67792919f3361b34d5afdead1fced6233f2c0e515f6e6acc0373055030ebeb25960e5886941b99589984521d733e4a8ff5dae3b595fdd013924914e1614621e8c1b9f82625f454848802889dcd06e1fe6d9c27faf3d074a54620b9a92ce64908bb5e224358ee456f1175f4325a1006ac9dcc382c37438a9b60e761e1c474fcbd72e11713078614b818c454c9b0aa2ad2274d95882851257084a7f226a1a9bcb52c985c08c9cbb150385b7d42591b4b5e3b543eff51b9844a5793b7efaafb133ca6321b3c6b5f451192ebf15edf5efbfa180742a159df456c4e9366baabb6f39a0270b2c5b4b28170813d5c3c0b9e7fb9ef1996c430d2351e0c41078a5d00b4a4b00cf95a8408059c811773618b2c90706c5d4bc7c26d55dc5b0be1deb0d7c49826be76d5355fcf5e8059ef80700fdec8e0b866003287613c8ddc0abdf0168c2c7397f884afeeaad7ffc21f4c82fff00b1bb20b148fced8ed69613c501033e994312700cfa7031675572d3dfe70d0138e4367e15d9722b830013122bb93a57aa10a57fc0d5e05b04ad45678f28515ec853f187186fed00346e4e80f7e21c01601ecf413701f65b21003037acc06e8e9b035aac466ce65bb146c8762111eb3086b9d0f163a96ea691f4041ec51125f4d36de263793c3e45134488815b20115c37fbbb96a9b07dcfebac4f8803f35fd3ef77aae154e3227f54ac2b5b1556d8b75df43756d3a3cca7a3cbec41bc30defa2664358cf56e8a195dcb210b63269327b7173f747d30deab3b699af29a94204ec82d742d298064ce8cf0c1c623250f0cdcecf032b8dd4d81b7f336c84dc80acd136ccf9f45cc9806c8c646cf92106c9783e83282bfedcdc8ba5b32a884c1e7ea74e59b2fe6b08a8dfe86b3c9e7ff966f701f57a6380e3aa73c61213e6c74b49fc2f413f9354cf051158977356c72457739f6179a6b1864f81228bffcd17af63ddda36bcdd886e9d27e71437573619bd8c5241a3285a8162131753ec1191727bf478b747e85d8a8f766feec7fe7aa0059db4612c725decc01000e7304ef2b9a869640968f8b64ac8e2b4801efe0c1f61aa560266501ef405aa843f2c8fb136aed3c633ebe662be0ce62d4d77db15c3f8b412a26e098b1b814d6a59c9f717ed25a9e43dccdec85ab4fdf8a093bb41075272d02b15e896a381a2c6481c6f72b0603eaad9581b372802f0de6784fcf356698765cc97b6f56f4e2eb6676165c63cc90296f05ac0a3c00567ff5de063eb09f605e8ae7832dd6849d2a098e67c2f1a502818d511c307c92d7bd7d7298a40afc828e1beb67cc4a6b39f1b8512337665cd6956807b0e80a9e90f2d4bad79255ae8488e41be6d742f570309db4e88570778e6fae09e1058f39578b52eab3eef077fe019ff437f5810e295e2931bc6154e48880e002cdae081287bee40b596bade75d20967236b135238084afe1f5e83814a169e68d5e11a7ec31fa8b121b580c5007ef2a5c750c898242bfa96512af445903abf9f85ccd32c81bec24eb41818ddcedd4beb4e7110acf62b53c1797a125bed68c82617159f0a17319784df14ef55827f5848db853a650ff15805b1181f3bf3937dca0fdc1a5ce6421943a684dc0239545012c8b03a106338b711aa898dd1cdef58d9d8d13fd39605ccdd0620665bb6223bf33a4d30758ca5dab00b0c0d146b34d94294d47ec2efd0c78268152f91b3eab612303be10411e57136cef78d7aa89395c711d8fda759f184460b5f245969d8ddd442ee14d8167ca0816eefdd169118eb37f2842fb5692db1b0e56a69c313712d4758c7ffd94eab426550dc2202a30e897a3beb1be89bc4ab91665089507aa9680d354ffbff193e2d0a1e566823452ff981fd0823e1c569c452581daff4eaf5327d48091e61245c2032bc999a4a0a75a58a2001f30d28aff4c454d91a9f1d41324df8679a03649c27302a49500b7667f2e561e441b005339e3ac216c50045111551801815e79a8d11e51699c5e9daa041aca601f24ac5cccd7cda039c3ec62c365575d0a2b53607888da1952ac50917623af0ce50f1e983c6b20ac030b15f057b78ad6144673ef07413da5b381df019dcaac693a2465171310e09c73c07f1c1956797fd7cd82d7d065f7016730538dcac87246ef586ccc4e695dbc698355cd22b3334f715fc235479fb8583e2284341f4ea494c89bf8b04fe3325f262a1f59e31679d8cad6219ecc56759b68ad363e5330a6a5ad3843eec4d2402a5d22c6958c83910607ab058e383d8e98740711045ef080dae1af743960ab149448ebdceb89c4acebeb35a9b81208b498a86dbf6c981d0cb06392a211557426eb8c459ef08968f70a45d61c29c2cdfb0bb27bf1db08396e131623ecffed6cff0085825dd146cde763c382982b7866dcc9631042cf7e4851ffead3842ccb3c7ee6ca8d0b2b3ab289ea032d8f79b21f6e8d83805286898eac9d9af0c70c9eeb2bcbd6e8751c788520a8c180d7053b0c886bfc006f335f6535bc9adb630db65511530140e42b9689ec1e26b599b743f1d3734bb7f896bcd2f060b5301fa28057729c8e9b1e4f60aa0fb0b8d88af5e103e36b129806418fcc512efb17cd9355b1c71c818cb184d3dae890517f580445c0f45e7d923755318de1e511ba5c21e763c8dd71763f483c5d137d7ddefc14446951aaf5648eef9e1e5b8a38488fe6770f1ac9db2b5a3d0977f5d5c347a44f1aad7202d58f947300d2c42b4678358d449001bd5401bc7b21c5f4ce03f1a922f3ff7daf8b487328a77fd0f7288de83fc631228d11ca4c41a919d2733539ba32442eab15e18c5c41e0affca071de03b1b03b02e1041b4ef8de5dda83be148fb02442633e5ebb2af51205c74d56319e55cdbdca92ecbae65baca393b77f079d45bb9f5018bc30bce2b3d4d3b48db718ef7d20442ef7c71d38a072c4cd38f16f0729e0d86ed73e4eaca149c88fb471707999200ce73381776a02b0e623ab9caabf9735fcadc7f4db2baa51db637e9b0aefaa8ba0882f64c2dd0783e7a630f684ff46ffc68390e2d7ead05b73331dec5f9a7f376c408520a793b39f228e3793b196f94a0b793978c525c65ec41a9c27aabd20da6e037620a3c25ccbc0cd4dcbcb10621fb536431388693d7a14b7b77a9cd55c549c97c17036cdd11fb6bdddbc1356fe63ad1d5f04c5312a4961e664fa75569b5b16adaba26562cf4b315f6d21a6bd5736bc94726d9ea40e229176a3c7f4b53991b6d1ffb645dac51defbfba5fbef89817af157e0918b0bacf28e81a39c34f04de1389db4deed6a506f5e40bb5d76e576ed75db56436d8d98559a50e1bc5d3b3fa2d89d330bfae69b504aa14c985e5257134ae46329ddf7c72bde248f947bf5d80ac3c74b06fbf82df9237adf568adf6407d7937ef21ca728110311e56ee67ee9649a036b382c37df0abea4d17e3bea89616e6d1b8eeefed04523eea8da9af38a2dfbc99dfe0da05473cae820396c4cfd9900c8accc72a653ddcafe83d2f6a265ab1c0df675fb99cc947be34ea5f8c1974fe70c5d91e750bfb5de420521ff69084fc0e8d3df946095c4bc63ee30cc9f52696ea61c0aee51087697914ee8de694496dacf8c215b3f6ab13a33f1d4275b00104d31d1ec68931814531af1925fd10bee7df9645ed8090878ba3fb6cfcaaf4ee50c9d37dce5a7231a0f706d92045b1258e3173ac38d9a30a721925955308c24c0cbf73219f2dce24bd3a1ebf9f2765cca7c3b5a1aa8e8daec2e475f0361dff8583ab748ddcde531c921357ba79ae8e4b9e9a3860fcb6b1d7ec5a390f98fb2320f00dbbe26b80b18bd97aa0651a80e1b75eaa80853cf8e947af0e8d1ff75e78a0a22832792c99d07766c1a54d5d3541c923510db7e89808ae497e6e04f96def1f7d0fd77f03055f8c890ea10794da20cbe6c9be66c717b1c9e1524039634d22a4c54a8023a5f2a1620a142bac429ba7b115cb0f7f34ca318d454cdf04d54053652de8689c52f4f9be5ad9aea71715c5a3cd32f9622a3dde5648c40561309c2bf5693a548aed7a03a7847941ab88bdf175d9dcfaa2ecec16439692f2e4bcec8fcec91e3ea3795737aff7b7de9ae78fa09efdd6ca77de7ed594c11d0633d687081e46134918604d1858f6441f00f015fa578839eb08a63f01cf83ac1d994465984cd833ab4f40cab59f8f15cb0016cd44ac64df9e1406423a30274be1f503bb5801d7f265aa489f7d80653cf7c063b4d1f000ea46915bca5653736fa82e75e3e06a2c40790cd3a00406803583765a085ef02c67457d9d52c92ae6980468a337a02fa422f55c5c23092b8dc2162d1070df6b4439e477d25a24a9c08f3d545e9c202aba659ec94b44935342f4cbc0a4634de7fe24d90c4abc77359c7566c7fd30944f10d6a4d19dda29ae080b6698321b8d2577eddb8829faa3f31d4468452589723cf017ae9f9a2663b03f92b0c4c51e535db259f709d9f189e69862019e0d31d478b4aab8b85ea5f30ea4300541be64345130aa22623fffbd23e7f53eccf17f29d5592d849c330aacf6ef246cf4d92b1b84d22b0b5c9f77cb1cb6c8284d4b88864366a102405434ae9e711fd9b051092eb12db15cf15f9c65ac94abe0f9897a492b78e20f933f72f53652096605f4406682836f885ad90248b30dcd458bea0be372668442f4685a65f0f5c9fe5bff10aeefb94d16fbae410dd225592dfe556b3146789869a84060b7f9a7c2609d04ab5b7c5c5107accbb153d65b857fbbee4c84f0cb7bf24df24a4ae8c3ffc023e7ab8d4f5cc6d5861697738e0e08aad3134e5cd13f7bb203c8ac55fcf3a972483f3b2a935c26631c3b94618e9906f69c00dde17db33dc883d38d3f3d9b2830f7c313fefe6e8a3315e667833ae95b58101fb45f75a992e76c243d88a492e4af1496c45db98a8225be9cbee8c0a990c27e4c07abae692e7fabdc5eb35d5482637f3b990f9af979f7711b844b324f63ca1998ecd59f31b859a0ab2de5e07be402473e616d10b2e043ef54198352127959acae410d206fb0659c45e918d683847fad1d184ac8cc843558b89bfe655e58163246ec8eab67f8fc89e8806ab415f1d37d027f5b69d3e733f972ce9fff135a0b34898c1ddbeeb74d0d03221c0ebe5fee1ebc1f06cc350b21cb9f498e838fcbb79a55298af62318bd2fc9f598bb56b7b09580c224c1908ae1d6089dfa184fb0bb3a6f6d9e43a9fa51cafb6cd16d65c58ab9ac03881a8ad659ce7d790975b719a76e070c9e200a3f2b669c8adcdd1ed42a6207fd0808344e2db65e047be4c8a6b871be234ae612430d210987dd91060c85012a432466bba10fff079820cfd7105f4eb49b253f97b71c3f3be97e015baa57183496282ba5604a44ca169f7cd35f8273471941bd5ad9384928937fdc7bc132941e843141d89d0a52962a2964774680e56fe883e022d821ad2ef237d37290829e6cfce4aad6a7af4cf025d4bfad90db346d9c0cbcc9eabcade44582e408a2846b82a2738a7358f230137dfa287cb619be12325dce8a144c28b93088c33893d0b07f4b94d986bf2966d973a691fb357992a7623e62eabb23d6317fa29d5a3f4427c6f9c80d96dab331e0cc05f9dee61c8f145a08a4187b31e19e8a14ccb411f037cf2ab9f3ba9d4547c3c69a13a7bbafec96fab6c034aa5b2e243282db902079277fb7c01416e7cacc41eb8f5698089a3b71a40c9f00f885f52f5268aeea5bb7bc0c09b80958ff6004340ff043895b026493f189b02da9480972c9c9f0872e4806539d78972626188ac0dbe901e25d880264aec5f2d633efe35b159b44f15ac4d24c462937f7bd08709190e8021dbc9b14636bd91ec74996ca35b94c4f6525d651bc50ef92374ff7c06b0eb426a5c3e5b998141008d3d0a79b8b23b0f0f69649527183d81ec0e447b4f927bd1b2e1c2b9b5e8d93dc8dc219a461b348bdccaf6c7f3f7373795842ec37d9ce344ced0ca56497cda31ec7eca0b56b9165280fa848cb00bd1dc0a9335d7c5c885df6d7b03891f326cc9f9906b27fbc1ecc03ed61d4cea43f6e8d6ee3caebb9f8e72722643b4df5d011a9613a349d1ea7e36a8d502953449b30f6c8681e6f9e2567b42275f7695911b107d80f899b102bd0ce95295d14b9f8c31e7ac73ed21a5485bec2ed2a57dccb44b8db08ef852d87c24c6de455c7de7f0630ff84dee908df337fe236b06f0e996eca6941d37c7cf16b80af7ca1f04705ca36a30c00095ecb756cb8357e67cbf2a8da98fbe69dc6a43f11db29fc1401da67b7b338fc35c9536729bcebac2590c8cadd2f4f4cca0b1f3cfec547b9291c5cb1f7617abe1ac2a84cce0bbaed9391f955dc8358b2a2ac2ca57050f46a80247493ab1ab8be984fd9db0d51cb745a7f962bc1fde482d3beab55d2aae9e68ae44b3a13f55b0eda17ff5b289a1afcc2e97ce69dc375b7051af51cf03204969ee3abd4053f21f74f2143c9dfd81a813d11112857d2f4d3972a5f89d833130872f5efe37ede9a41f1347f87e8bc374f2a5a1c540da0b296e98c7b91f8bd7b5764a0fcfabd6238d4f273f2dec3cc41d1fc703124c59382821a03c752b21ae621f4282df2cec79a6fdc2453eccb8b8f2f54536b038a8dc4a8d79a6419d6b6c84372d1a56b4dc66c50466b6e72edac2d66a012169fb6e95867a8bd9aca8ebb28a72b835c59f718652d3215e7a282d2d9343b053069ef9c5407b76716b6fb953fc5a85f5ecb951cf93b5d2f3b10b3d739ece3384ff8058068f37d77974d6dd47d15612fb2b70694a0b4cb3d7658acaa469c9558eb46950e83b8853924adf0778bace07e2a7d32a08cda00e0b7f4e64e074b4f28692da4068344d43300801c8142f849eb8b66b8b7a827c93e23ef69aba3fda5a5d8a74c9a0eebd29cc4770575be1ccd211533d17978b706c9a951fa6b5ba707c3a15f4e3888a259c43f4419c595eefe3f7f2bf588964e629ac40a5caf82507b608b65f5c15feb8b7e845b8ae5d2d795252536ebf0d4350c848d57c773392f005f370a8f3ecc086fcd5af9ed1e5cc94041b65cbb41e8741515462a2303c21f41580dbdc6cfca02d4aec001db3f339d0317328d9a426d36b441b1f488866002dea48b94558ca96fa472c73e8b4b5e471d62d642b40b243a26c505b1662fe241fbd5f4b3dc30a2bec39db259737d866408470c1a0059790598a40551abe9f557b3e8ad6aeac344dc4265435f9ab4d2cd8c92d30c07ea42c24628ce470293602ad0a1a23945ec0547f9934d825a270689560c363951c278c203e748e191ee52f79653d7e2ea293d6ff9fc3b13caf0b3f96d1a8c3f4c48e81e381c51cb0768a2a133178b6c081a6a2ea48c5d48b9232253146e64aa45221ccf85b77b96c4a25be20c01ca85b2f9f4e97e029274da707152a15848aaa0d8f651d88e502d9c864d98df08b70344b21477f9ee8a8d96c4784691940136de275fb1022caeca1f73b696ddd4c84842727193296d3e62a753f787543c4734c4ff74a083128b94ce236a02b9e8b1013b6c7c3c23646ce5a7f48b457d27f8ba3bbc3df86ebcf03326b671de05800720bc382d53e280a228123278fb137cadd662a8bd83295d9a072988664607a36fade6b395377bc0881ddfe96d1429eb9d22456a0b014b952dda189beb36745eeebd8c303eb4fb16f6ef3220e26e148768bf9525a59afed12220ae6fca755e487e23097529baa580ce3d22c5760b1608ca3df2be3387b91227ce2acc0b7fcd643b06a339b42e9f82a3ce9f66301f6a9de35b0b76316e3ea2c00da34f42001aa5f1c1251d865ef6b00989ace44207785d5dac6054e13d71ec782890c6d172fe4a30df9169857dea8f98d42c15ff01dcff441bfdec3ddd87c12a6d42955b6a2246ec40fa5b67273fbb74751a71f03ff75c1efbfe8043016d3fbb91149a260d75e131f56bac00fa9c053c65a13ee20b1354afab79c52df884bc39e12be4c90a752209031e521e58b8704d409dc7c6bd5a357471ad950b4e7161bb77f2a414eee74bd1a3551ea0ce4e51facb182aea26573bd5dd219ea5342a50ee0ec46b4ce83ee36c30eb9f09ed64ee8e50d9d3b48e97d5e8d15a112b6bdb324dd3d63b0d740c7b93a397d7791f9983147817fe4a63ab0132d63c6a9d57d07b0472807a48442caca52f5fc2cf3c4ff00251b1a6e6c3358cc2d9d5c18e4bea0bea720984108729a9974a6546815257d60faa27006041f81eb2990914915ac22e07cbafc1e6b3af9fb0bb82126e735e212e03734ddbb40941437fd495941256f57431663b1ee4a90c1ea269fe1d7d4fee14e707a56fad4c87152ca3d786f7812742fee7a6dfc8c5553d4b309c1b07260e036e03b04e671ca9d8d60cdb3da8479e8b4ce4381ce3a906f3024d50ea46241dfefce8903ea63e58e05ae2c351a2a9db16d5a4c31990993f38e3b68f9feb51ba518855cb90d39fcb372044eeeb8c64179e128385db0614a94c88c836fdd42cc9db0cdc944b7a4a61c36f7e44c868e3af7e0a5db69aef7d4806c2e9cff3ad3292ceff322d790c2b901d7ac496af640c71d1a281913247d467257111e525f64ba0d457dde552bd22a97615d11354b6e607d232c27b4ec6ecf5e83b5538ffbefede9298a643243d9b82ae4a94b3d4a4db2667b04035c5369d20a294056df3c5b7fd471e7b8dab5f11ad4368527a7c29204428cfc51f2f88c6cfd214aa5f701b56c84aa7090cc5919f1ed483b3792f584d4cea41b046b5a3b34ee8ae9729121fd8bf6fa57695e9643c3cacb16228296222472dc9f6cb7015a02f53461809011710e29d123323dd2f448c7ee8d0b5368ba0087060fd475857e3b59a1c14dd590ca1540d33b6b2d09de1dde7c1744710ba61a5be69ba3d82ee728547ca616c6b7d89fcf369ec80ec9f801d19b31cd6cb185e0b7220df2bb57aedc528adc012403330337035424873963255c7616e1517624e79c33e864493a9f3f7f27d407b09a3852975d1f747a10ea579e50bdfe57824e23d7ae3545c40c341d7b8901d547db828ebdc860ea9d8a8e36a6f358ef7c67350a1144d0450c6d8c1da10f86608f9ca6e25ed807fce97343601f804f9f23820e00e4e97334f584e7e977264b8232e38312f22b722944d5131f2d74a97ac27bfa9c69494444dfefecaff8f4b31852fe9593f05e5b0e4e4725d16edb743942cbd5cf9f750aae57d1c66025e88320a81e7af3ddddd4b0fb2edbd4b086db771ccee6d1bbbce1e1d6bf5014cef8ff8423429d27ac3d14e64afae71f0afde7ff50adb552ac6a1e1e71c343ad8b54fe1e4f7dad7aea8687b8f330eb6048b11223c20e543c789130f3f076d13ee59207ff850bc0b012263cc0d4bfef3c0851c45ff125519cc19fbfe73be8401b00eb1d84b47f3ee25749f57968bb289c414224449901ea4010053689e70f029120418276ee113d369f50457c30a4e16325ea8b8459248e10c5cf8ed0008c350c5166f03f41dbb1634729fc8e871fddf0709b4c3ccc2693e9c37b8ef7e171cc5e0fced9f090764f88699b8b217f102c0f69dfdccba6c6ea1a2b3952d394634038530a8a60631deb545f750b974d9fd67bb3acd62a001938e7dce31dce3d4f1f74d95e67875ea7d3e9743a9d0ee79c73ce3d2fe4bec339e79c732fecbec339e79c732fdc7c8773ce39e75ea8bfc339e79c732ff4f80ee79c73ce39dfe19c73ceb947ec845c1c37aebfc42081182e7845640cc810b2a24ac9b6632faa1a74908ebda85c2e58ad56abd56ab55aad56abd56ab55aad56abd56ab55aad56abd56ab55aad562bcb62612574004bb004cb6a6f86730bc016b0056c015bc016b0056c015bc016b0056c79bd58ced3056cc9b804698034401a2e00a879dbebdf5e3febf5310ad00afbd6120dd4c0fe32d529345db26179f3184f7a0cb64a51580d67fc03bdc8ed4440dfcdec66e76db3262e0aabaf48314ed5655f3f458adb373983407c5fad7f3bbaa1556b1f16d6aa9cbe84bf16a06a385fac84ce01a7cf8a5d6f58823d51d46e224b0158c3ce7f7118432d4b5553e00dcbca20cbc6fe6a13ac546ba5d683a3b5ba60fbb0b6769825cb940e55cbe8189b69977e6953d3e8164f712d702b2352c368187d8396e91aa69ee05edfa071d0309aa569748c86e118638c47a4c7559aa567b44b9b9a46c768183d22c18d0956d22c4b22729134cb6acdd22ccdd22ccdd2accab1e04c363339924371299353712eb89366611b582633b79aad662b8263d1b79a7a82fbad88cd065b0de782336d35a6f9b19d5c0b1c8a53712e38d356b39ddb699aa6699a2668a363b036c14a2372446e27693b2d264d8cb7733bb7733bb7733bb7b396655996b80666b19909b7b00bc630b8dc4e518d480b9989c42b7805c7c0353ac631b00cbc8261300b5e1995209cc9344dd3344d6cc305c76018cc82573089c92c725992cc64ea60a36913ac84432dd3344dd3344dd3344d934462d262129398c424262b8b25d2217ad94c04253a454c2227914b64627264632473511dd18c68462484484717cdd413dc8b8410a940342382227a895ca219d06563d2344dd334cded2ccbb22cbdd707ca87e903f5c1c2333d1aefa5592630914b243aadc8490445f412cd885c3c95f3dedf37224736462ea39811cc8865b4327a59125a0ab5423a42e6876a7a1d43ae904c25d550eb2b2d092de5bcf7f7fdffe6b336c14a98dc4ecddc9cd909b7733b459c5dcdc2e5fe3eefa5599a95996866792af35e9624cb7b7fdf3f8964f25e3c654778ea2bb79bbdd715b92cc965edeffb2791bc97c8e5bd40a78d029dc4f151a013e8f49576445a928bca7b7fdf3f89f49576045c618f22976b8b5c2297c8d53b1f6a59122b8a5414432dd0c98ed0ad6bb88f58a8a536bb9d1f47356cf7503b8e7e1cb9f43a628da318efc711cc881c95f47eee22d7085b01de6be1660ce950f9b03ac56b21f71d86338c2bb5387b64d0c992d052a5bf80ab4508b54240844cf021997ae23e8b6ec2b2ec4828f45ca8d509b546e468eb5ac73dbba72f81fc38aad1b35a80da4731b00f365f7f24e3c308f08dbe1f473023965e4764af21eda3957a82fbdc37e1167221214828325359b5c9cf2c4d97d2955fdbfcde4432919965979fcbb348a6caeaf52faab66aab97b20d0f86b76aedbd59866f86b1a6e5bc6979db38aeeb365cb7d968ede1c1d11e1ccede9c7736ef743c1ecffbf8001931e2fb4242c01ce67004f5fc2372389ae8012116c459e940136c1c6c7b527afa70ef401cdb5a1cddedae87c53ab8c3a66f758adc4dd8f4bb798c7bfbca3bc4680bc3362833ec16a2acf8d20ced675cd7b83bd19e7664067bd458d6c658994ef78b966e48bbed48ea6e5d6aafc7c8800ea555add5ddc7401eb67d1e76eb6a2a186c22b6bd19feabb22337e405bbbebd9cf90114776fd636612c56599a4cdb2c4b92a4a6595d2e92dca06b8f3695025ddd65bfc2d05df12b89242242427eed4d3e9b7305adb0bd3ed24bbfafa48af48ad47eceb2a8a9c0226631cbf99460dd5efb600a4ca03b42ce4d4becd7e7740836efe8559754fb09c17efd122b9e745bf1063abac334efc92da9b9ea12bbad2eb95b49863176d2335d82b1922c8ed6d5713e9f11ecd72721fbfb2658094585a5af221345ec4f54ee6351c5b642db2ab1e2273f02b4c79fb5dfd45ab2d696eebdb7543fcbb22c2b558c31c6b854434dd3344dd34a38047bd8a34db95c95aca4699625355113c6027bd8e336c9a5fa1da75245aa31fe124d3ce998d6b0f829c122d64b26586947bf56b42d3b42ff247bc0ad1b15e0c08103475531e9a0010c55661162aba4a8c0405568b074305880c142690a8d18d62bc5654a39532f505a6b0f8f172c2fc8fdc2c5870ecc01c60c0c178c18183a7c58a534a51c82d2105aeb8b9a17314081550100416c800515322fd0f8a194330cf4bc421059a339e79c737e79e143e73af60243042ce8b61b353466c8c10d261c2910504941c92165054cca89032911c09aa6a5b0e89aa6bda45c20057547ae5edf9636e56a9db4566befcdecbd5986b19661ac69396b396f1bc775d80b63659af3c6715db7d9e86eb3d17ab3d11e26115eb22a695694f96295ad92b25013556599e69cedcdb2c8d9f9b11c8e9fdabad671cfee07d343db77eddf0afba0037400f6eb7fe5577e65f9c9f4cfa5f3955f8d7a42bb56fbf03c1deed980505e8d67da4c7fa43e4c1f27fd81fa60e19d5fc96980503cc561b866792f8fc6a3f186f06aba47534f70ef0de111e1d17cb0f04c8fa6f3b96816c8c66a13ace4bdbc97f7da4ebec25536c39cc5597889b90bafc149efa567740d26b90bee82b7e02b9dbba827b8e72df80bdc05afc155dc05c69ecf332f4f618c31b698244992e4299ee2299ee2299ee2a91f143e287c506800f6285809f7946d98006160c204280311d0bc5744c4c3da7a036b690e6b6dd83952a02188ad65d720e36461d3c082f2030d34faf826ce0eabf9041b77ec45c60d5d46096436192e9c20a3450a326440c9c8c00a9afb6d4f0b818cb28ffbb10b5705bd3deb5ddd68586731969554570eae5ebffb8fdb745955d9beeb18b65176a692e867db7759b8f5cf5a6bb9eeb23121275ad68d3d6a288db5f0b6b82db4d4755fd0c2a5043c54805cc16aef8ebd9035c06185075cb06c908ebdc4a8818c71a3efdc9a80dd3158a0427d12dd31627002fd183a482ff2220302314e2d8891001d23c9a56b6f080952481a445ec81569c3f7d9d39ed75a9ad50b0e516bb527d841e5060c2a32bb632f2a3ab60e6c151a27a87020c36041050a83e5b4f38b0aaa8ffb5ff8bca0c18d22646c90d1a2a4c1d0b5195262d840ecaecc3c6c1f360c163f6c1db6c6ea61cbec116cd57ee192c28b1b68a0007fc7a19c6a3f21645fbf24fbfa27dddea75f729f7a18c03ef6279dba8060f63570873d6a2c169583d244cea9d3b221ed1a4c25552d64554bb12cd3348ff1a46bac4aaadfef8f368673320125b1396c4c25e18005a3c56839ae0551e1d0cd748c71ce4ac899e21230c7ce8fbfd36e0b1de367d1f16f704771572beeacb5b8bbf75edc7d966559863b8c31c61877df699b2dd45436f57261964a9ea64b19d3317e4d8ba00cc69d4a2762add5f16b58fb84b0bdf625db3d6575abdd4a87898ca08addefeee6b3cf423e33916559863f15d809b8a78e80ecb36fbbaa7bb2245ec7e3a9466a4390886d37e288d0e39d2c491db7ed9c54591662a54ff8b1fff99312187eec83fea41b5153499fa9926a48484b981e717a6ce741a89e19cfab92382df09e2c49ad22a0a8c0ec887e151e4e47977884c048a4fa1d6de211021ba9cf01021bb176a3ed8ee6fcfe8e06adb03def999129f1d0889c8ea723725ada849640dd533de20c3f23843ce849087910f8216f451240a093f3093d2e3b5241b80fdbfed89da00f79106acb9280be3e3ded48f5784e8c2509f9fa9c9625f97cd523c431f70f441cedab8f5d77665fb3ff10cfec3be2a9ea152466cfc3d1f3ea75ec4e8fabd7068cddd89d1ef3ec293efc159b3ac6ff09f183216647726847a8a510fc5a78eaf83f16d8590f794c079365a884920fa790d508040000090317000020140c8a44a2344d71200be4dc0114800a587c46686c3a164b2461418a032186a58c210418400c208400420c333366880066007e784c7517611974ba0c064e8745b0699d76e2c2b0c2ea0803e9e6deeefda1a58f0d765cb8903cc447173c08dd01220eaf3d0c5cc6c291f6b7a21bd7f8c7f793de9fe0aae1577e59f92a5229d76039567105a4f7eea692ce3dcd7fa4f12e6118363967693a6c4a104cf2a48a748c509e2a24f5a763277b8b6498f254413636b6dbd4595d9b2d47297f66756148c1403f66a11e18c72527e24dc43a8f030344b8ff339ebdea20d9266d1a0642008052be7594676899802833716cfe872a99182eb06ace18f829fbf89d812ea492c3f632f56f6b63ee5bfc2bf7da62f7391f3f687a371c21730da127fad2ff0d82dea74ceb320602817bd79fbe4af14dd098a83f406d47e1079f4b073fb074c490e0277c33d98a1d31c110a10af79dd3bac2d241b2101777c79e50328174f6bd08dd4d80d46abfa3df9e1340fe10781877aa0f3c49bb624eff3d43239e3ee0a44e569608c655167f2b2b9a0e5cc82c0a092c0342042c8f6e14329c12503076a831479d63b3a7bfb1b881fc14452d1480a2b663115661e9978f45d787c55085412e03fb8cd3b9870011234813741593fdfd8c98211d0c47204fc054353e40efef49de2afebbca41ae865e573f9907a4fd3c56b232c8befffb4a454a137378cee77a5c951d048271f26127039ad48323ef11109a7ca3e8be9b53e944fdd3978dd7bcb0368a459a39cbe905fc7e37d94a1adca4d89335dff697eea2ea6d1f8e456b3be3b1231819f60637458d3b893fee81beb9672fdc46b2eb2874b7c34fbfcfa2bf0cfd8b9e830618ba1cffc3c4135b6d6024b3c0a078cf2a5e16528aab0db240c46d5984db4fca7e4c70443302ef0fca7e59a28c11eab3f48ef826d9c17a0f9083b91881865675b05a61f95f2d9a00546e7aeb590775d730e5ccbdea7ccea9aff53f8e1671c42afac87e2e5f50e152266f4f60511714a573103704cd29aa2ab693e6119e67a0a2f7bf75e313b45171936d9af940ceb81c0b942f98e3a7b15c45433653701a89491205179f5c7f882231f1398091b7fc78ce3d234160a2ce4db6c950b65c0dd89ee99a192200cd0263032220c71fc0b077e11f6f7d510ce3be949e8a7d6069abe067d30bc2ee4c6f5780534e6f580fbd5fc70abce02346fe7c4a6c083a17994e434ca0cae53256e372bdeed4cd7d6dbbdeaf6355414099deb10669d24437f493b2a6918f03e36f03941449b6613bb153603d365e43807a8fc58290c5b541b0b3839409d0dbd2a429e9f305308de5fe8c0ffbd486f9ff75738012c27464a4375b053ad3396256fb0d13701ce0ca2bd008e743bd0517d01b8051e74f83a6e2ae968dc163b19761d529442ed5933b56e5c390fc58967e70ab3c6e4ffdb1e47ef477c3c48fd5be538377d93af0768c8f02b1a5bea9ee76269e14650b2c835a1770e617b33ae64220ebc3521b75de02721168dc7e08bc313543dd55b549f543cae63c3e873d8611a6bb74103e93f3645d9e1abc554fd6930360653e1169d0657db418b460fd4dee8dd7faaf2e5c4206ac9afbd1558847573eeea7d54dd5f3be92bf564588b013d060a8fa2527bc2bac8c17e837ee9dc097c2918172ff76404726a0942397cc53f3651856f04835a0a99a47aa905d44d34f799e6ffc4ba0377f7dbe751b72dcb9a108528f6541a08fda1cb35d912720d22d982728d2f2c980a8fe52a084535b2e71b73232b742aa1a191f7c9e07dbd6671c7a20ad3a0fc8d814b4f9c198ebc294230f429d0a9f44ab265794aeb5184bb453d4819b2d2810bbfb88021e0de71fafa320c917dbfc0b819e04399e0405f23af188266322f43ed0f22b6d1d923cbd74eb71fb48ba7d6118a4ff71c847586a10f48ef6f7dd9a9c0e9af3967c4ccd305fe0c0223f1699537d52a24ce6cd18f0aa8422f2ea3743a17ec515dab3ae9de757bab92a8b496b33fae0651616a60ae912f2ff1e6df0b6c99db3ef4b5841946f2dd612e8f9c8d8f6849b39a8ce9443f1a55903a095e2f28dee8b5c3606885ecee1f6b42cddb1aa00579c24908cd6c667d697d1fd4a4007a7bd2fa778af1cbf4ab493ecb1f8c254426f47f4043722fa8c16dd3dadfb009b9e9688ad6b8ea972e7d5b8ac5a60d15e9e009aca3a1903c05731516d919575e8abd84d0d9463e590ce924bbca6368558b93fd20e1192824c857eaf925e3b349d725b124c9d4cade25100029b9b438a1bb8d43c4afc2454b3c7fcf3a89f38c7596a4817496b7bf4d99033daf7f4452e8a2bb53a25adbe59fd55fe47d870af403416cab3d8a3f06e15aa93f678fceba63ed0b724a5fa70fff5a80be8eb498a869d549f4c1ea979e44f6a1810651feb7f5990321bcbc446e21aa586029d8d57117d474d9c83585d0470351964f1d0d91abeb817a2d0c97e92b404d73626cc77761ea8634f181f9b20e32fde107bc6d7b33f1b9cc8ed02e7394702173fe5916a75632a3c14c160a21707c003e98196897ec71167111567aa9999137840d401d09c80f0e0872550465a4b548c689f18772175e4363795207c7371f86ba23d342f1ce4d681c948a92a62034cf92699189d9151b2a6067bc5475d8d938bfd0ce07f170db5127dcda20d730c645d3861fcc067c8c513135cdc821f99c5bdf812ccd21364a6a7422fcc981f8ee96d3be5e02101d3b437e965fd66d63870d4b71b6e85c8e44c92d2016661fe54d6e32ab1c9ef72311b1904e49b45c779f2d37aba242bb79f589f9f6011f22e891bdf7f886a2b90e07349b8b115b03c64ddd13bf3a6766a717d48b688935ad664919b1a948b567b58bbdc161cae50ec9248e5f5c793580e60fbfc70329fa34db4d49c21b66558c3ac5e281350ed56043e49b93888cdf0d2b312bc01d5a01bfd6d1a7336ef9044ded1738842cf3405b44a6efff49520f2d2fecb6849435a755bd061bcf976879b5d6f556429a5650280d9d762289ec6286f43fc0d24742305bf2ac854790790e8870bee3d2808435988962b43c7fe54c083823df9d2ea077a2d021afee0db8e4e6dc7bc325c5fedc19d48452ba3792418c6fd2a9062d4cd174005d84f293d9c853be7b7cadef9d527428b93a5b1f1fedc128f8a93ced5687a78548de2a885e38a6abe516720aa7cbb7452364de0292ab789876667f8ae0fecb1d696e52991bb42fba12b9e3be5b54f1be5e5f844329c31c206f7a0c633067fb8783367b113a833f2f1e9e94349aada59421d23348b563e8791d998ec19bceb951a855b6e88f75830eb71f94cfeaecec423a2467dc21a1d767a7ea5a59698f5a42f8ae5cab2daf935b6a4bbc760690519eb5bce8a2ec36dea388cd425a09714cd808d3a4708e1a1a6c626cf6902e62c15dae0177550564ff2786dde4621c1e343c966a7889536766d617f081fa397f67a184a3a52cc8427167e9e3d074145b10bbe0874b069b115ac2c074389201140ac706c2bbefcb66867177c1a3587cb55ea86a084c7279388f002f2e8dd698980bec00d4106dadb44b3d0d0611635d88e6b11353b9a9953509a654d012847358d51854237fd9725cd76b78fda0344b4d9225e0ec40bab7fcdab967a2431b88b51df646d2966800f21a0c104d607335152650c9083249d3f5dc3ad0a5fbc0d51882f609a274ead3593e04331da394c611be0e750c5504ba21710787f62969e8a0260f2bd50c45c16d132dd1142181423037916e5400c06686ecf770f61cb2be779a9505db69f2bb275376e35ccb91dd61a01b8731b61e0234ea86289e6aafaf237e41aa576cbea7f7df68a74b5b224d3a7a8187b8eeddb294e8a079f6f8a7bccf7a1efb6d2bc6af1177e1bbe60050651a236f49aed685d3bf53272cd32266653777ff1026e48931bfe37c3ca1422936f995aa9b3a5cf0ca3190efbd5738d9d360abd6b5a5fe53e8f1b7a5a71b708bc0f37364d814c114c374feb60dc3795516309dcc2252cfa16ff2635b52416b0e4e286ffba51baf0cc7a6ffba642d53fe1f67cb809ae5abe97de3b059e56336498ec40540328ebb65932c6089cde3cb3075305e4e7f405cf232b911d2efbc1aa3d3f52fede1d5e49e3f923caecde153596fff93a8dd666f9d3fbb7a6e6bd359466d7ff267953ed4af8048f4032d120244866b337d341a14d817d2e44f63bd01409d988344e94d101c2199d1cf950ede2c1ea4ff5603f0d84d2d4c0dab18ed2a0dbbc1ffd4a2f82ce258dd6c6454e2a2354f9884500ac6aff962d6a2591aee8ed29790225af68443b4ccc7fff9e384b20f671e8b699f542150c7b6680e2100283461c580fb45315d6a057d195ea7c479eb9483a7db8bcf2079f4c1c9889e9a5c71050537b58b71c1c9ba7d327a7f534b51e612ffc67a146b4f1a8f88aac7ddec41944ba5ccbf978951c472a967c7f0749c4a6dd6957c5dbad9934d5de4ffeb20a87dd0ad74fad619aed8819d0bf68faa9c87720bd86aa89e5a882642e435f9064f0cae61486ae438b7dea7703aa764f4283c70dd86dbeaa7584607acc91c9311e1e30147b931c8099e60b6797d309bc018af10410228cfd7487807af51a6b33a0ddf3c2f50a7d5fd4f09e8026ba13d147baa7b2c5d8ceac4233df0704000156718d3526d9300fa83a8b1ebe298f2ea8dcbe636079a9423c2faf09f8137b9a4648b3a8a904516945840ff05fb52f84585a2ac1f6d7f2978c6333e20d5a13ae184204fef2740a500ca209a105236f362804f7c00a725c617b2a1a8b02f436c56db60d5623de98d30c01375fc47beb6cc2e6e40c757413d74673335656b01e3af3b4317fadcd21b2d96ae9c3d970af339c9871e4d4aaaebfeba0553c04f654ee6130472f12f44d3628edc693e1686ed2be8c403fff052ee2486e3f1fcdf77453aa6d039487f62d51173f4ece69fd1cdd99b9373687afb9be748dc290b887eddc54e6ad6a538485626e5ae8488cca3ffa0eab91a0e460971948146df6ffb6193c9ab16b7b74a1ce65f69e988bb0127bf84ff640c6bd6969cdc13ad0bb847a6854c4ef95a7aafde4771d856c99cec2e56b62d8ff1277985ca855729efcf9806b373937955fc4d1c067915ab6a95894e65327991cd5160f27110fd348b6ec9117e1b4a9854836ae1b68568ecf37a50f3d964dfc28a4ff2625b5803fc256ede106a6d277a0bc02394d6bba50003475efd1d0f9719e85a8c794a6ef9b7fb8f2ab20fc82a2c4a315a611cdec9d9445829417df117548a1a0d7ce53c4167373f95f1071dddfb1144265a19cdaa558d9f453c144957e050b81b2ac1c0dd7438c94324c49ea0e084446a4a338e0e6b23069276adbee6ee4169f2a2fcaa53b557160956ff4dfa51b87575428b0d26630813e40114743771b551230feb9ee8efa2d33f92a7523cb6f97e110662c9f7fb5dd324a7a43201557bb88ccb8eb50cbb6228a0bb1633d55bb46c7847d028bf57a2044fe4c009c3bd92e8667d81f8e8a87276b5d387aae601eb801136d874031618fbe1d80d05e62846cbfd1d721aa0b9d09fba64462842887917915b9455a7d16dd3a04b846a538b04129099c4cba969b0b3aad283e3366338a710e7b29011ae1b453db6492f8cff5120fc0bb565941529c6b3e9025d73c0f09e73c426c09dc8cea5b540c409ad1d8e14e0faf0985333c4e37977fae3c8c16c3d28772c5b8e8cc9b1523b0ec6f816d6402d7aa0114591d2e0d15016677c8f92dbdc4bca277a3ea5a4d8df9b53d5cc86561c58943a035b8c0f048add10b8d0493204d44e147905203e8d44e1a05e205d795c7862a0f51413b0ef0214db83c2a0ebca44e089e3ade0500e6d73739e4e14062099bf7ab38452735ba1739344501c9739b3fd58d25cec5b93a54d904be303f4b4b5ce282dca203a8225d468d38aaf89b2e6aebcca2270949b35ecf07a12d8d95b0f6ed5ca877db5b311ad46b92d43e187efdd0157faada38dc9e360f70f6060b793a0dee2d81e6b6cd6bec2278daa62f9a535b7cfc39a7dafdfe46dab0becc67f0fe0ef1f889bc7b17a5e2e684dfc95a31a281ff229f861052d0e9e0325bac72004ac8ed286e951b0749042b07db8a6defc38b84337192843af37d2d1bcddc3d367e6525ed387a311ff5e5e151292f84f631c1ecc4e49bd6cca8e05390684e19164d67a789ca7b4e3bb9ee33517b7ff9e42b24872525fe13bdc79a01a497d4eeeb9a6ee337e74418ed960c897834352bc4875399818baf66d90ca5a122d151686af6ea931f35ac7620485025deb7d151b3a739f04a9b1b25101d79fe8a1e828cd65b69930b4cbbfca73e89f36cd5a12a0dd106e0ba8084454aa1ffee3fb3ae3a31583beded2b5b82b6b7ff489a972b119acf1da27a66d1f9df1c22123a1eed3ed44bc8fdc534d26b8a3aaa8a9f5a053d21006d4c6ea8d1601ce32a633809e1b5cda4734e0842c82d3aacc5fd0fd0d124f048d3cef3a3d72d478936b92be78e9988068e4f2315e832053d077831048eff359fab889c527985e514faf6c79ed42a71a3be6e22b79ac79525ab88e85a290cf427821364aa9447718a90d8eefc67012a98f5623a39f6b31b3ad3442afa386017393b3511998ea1f95623e24871872d676526dfccb6ba56bfcfeda354feb26415f48913e9fa7c388c6f8e799250cf8962c78319ed8066b8d907f6d59f1dda4acce8979f633233b76fbe7f4a5d42a78c085a2ae079cd3b5a42160011a0e9f8b190691e2612101c074f0502f81b8a40eac124a00b0ddf11a4295094c3b0236c5d4a107f49944f3b4a6db816a202b563150b2b1d6a573bfe44880443b9b1a32483bb7c326495aa7f6055c32818afe03ea3a21daf5ccc935e4034d1fa78a955f076047a63f6860cb5c812898c31b323a0584dba3cf14856be23c072ec6f000793d04caea3d28f30358e933e6e62c7da4e5d2a629da62e61059f767c845e54380651ddf6d3cece02bdc3e49819bb30532bbc713dbd418b13117a0314768047b6a02827bb377a87fb0a5dd5c66ed089f3df6da871f05881c703abe5d42a1ee520166463a935dad2ecaf0dd924cf2f2b2bb39cbccfbaa2b6970ca5d8cfb8c25948c4f30cc86b7d6d7128d6a382b21f14d0fe44a9eb3e48b0b670734b83a6c4a75467dd8ce6323742440b6c85569c53d0aef4c006f55a116e942adca2651823e450d40b7124c10e31e35ba8976e9639762c8e2e4e5cadf8225e3500688632876daeec15c7665c65f01c3e09d9395b05498553511f150650c0a8f04d68a2c26cff801e46c086b30d69dc36642f85313b08cd90f3c3d749f75fd7c202da1f12a22cdd4f58f7e866b4ffa42a6a00f5d05e4aa96bfd7329dacf96fcc1a49c95372da01f5db47fb6144d925f4d21e6cfc65edab3bec425d56b519208b9785953d2bed646df8d6790a4b3a218a94bfbf7e24cc6e6ac852dad15c120f6cd208f22d54d76e0946ec15611daec42d3031685b778ecd140f1d4807f7b8e2f81334da96c649c69efb05a05dba113372d5f78378ac0565f4e34af36616379d223df8958088a67d46c8c22623480967e92edd940d14a89b91ababcee412c22caec5c0d9a2097fbcd3596ed1f7838ac5ae65ab57d0fe248f5d2a0f0a7c3957b481c85e46016354597c306025fcaad52aaed53205abcfbfc5389141fc76a0808d10a114d1c1de08960388c1129cff6c58dbc6c1a94c743e0a13b79cdcff51bd6012506a592336d4716cee31b8caefd571adc151acdb80d3c5a75c5560c89a2332cd56af8cab921149ec3d4ac2c6d038c9f6840e00137596898eccca9600f0072895c32a696f2ca9b655f5dcc19ccf101b74ca5a5d06451a14b6205970d1620212da47cb9f0480c8d06351141da3f868d229dd4c2c07aed94404fe4d305ea770fedb8501a84e63252d58b6b0330c2fe1e46ec41c39420ad03ea51ec45e661d2b0d76087c1b1ea11318ae2b19961d97230bae12f9c7a18af21c8686cfdc5cc752450ffa6ba2d99758d8e287efbf6db887cd48771807072206752404216a30462dfbca50f93cf953508c4a8878adff66102738ecb1af73dcc2e9a495543c187c154a3460080c05ae55ad3d8d0c3c097fc09f0a91181f0b363cbc334bdc443aa9de84d34f2f255d31fc6a68d8e1be52093b44e3092ff30f9ff66323a331578a9ad1c6678f7833a1a143bd9641ebc797655841c2943edfceb67021a78d2d64b33f8f9308f2360e7ae5b47dc39e7a15d0c83919a196066b90aceb141d06847bca0557351860225a26d339d957bc49c8006935a15d64e64db9be1889770517d341146663677e48881f461b02e32ef54c4783a0ec95f0d10478a5db4ed99fb91c5721d6c8fd71847a9fda44d55e8132366d6fa5bfe06409e5b6796843d7b4a00b4a784a13d5969206c9eb3d1f8d31056f054582a6f0d9be70021145ae5d08be90e1e78e20041c8f039778d5b3ae5c6521dcfe1665bc9995c8c2e77655e2ab38a765b66313b265b4a10bd800a8a4bb154a9bfdbcf7e75a1818e8f26095c1a11e9343b1941da0e9c3e6882c0394c6481fc17020a2880e021c8f11cae94c0c069a408a713421c93d6384820e42479ca71a40b280efc4b8a1d41b99acf55fdd4c8d226b67941fd66a721738bbd574e8bb2f71fd17a4cf37c31b2e79bb6c170ebe4289ceef7fbec9342e58885f41b0b6e242669c9707e7b7e424d9cac11453cbb4bd6735deb989cd5008e8e8d45e6f643f4ee8266333fc0df6fe9d3e892008e83ea2373f995262bcbbc27e1bb95eb91f0d7ab80ef875f80dedd4543241090bae8ba56d10597ac92173a1128ee43f1e6056ef25d49cedddd5697b2dd9378cd2ee17f07a7dd1226bcfda86cc9425f8c945e5d74d0976c5428804ba66873cb0d858af242ac8c0eba6462953849f70c18c5945a157350d960b9d2803f510d16695e4c15cf92b5680907244b0eb77c9336d0956e07bc41c590c027ad522a91cd4bf6701d76e30abba2a8f96305a98566abc5435dca5a16aadc489b3a3759a0532a350215440ec5cc1b744d16043246ca17f510abd4eefc14a086592fa44b282fb6a1fc3599e51d2b8c9d536b322ee95d81c6d074db8872a4b947dbfd137f199a51e6eef5f4ed90ba5532b95a7bc42633b510b8b901d957255819b6e483034c3c17cca4c7009bb0cffd70c62da1aba244b6e996aeb5feae0884c23833d3bce96c804f00430470352499c7098c4c300cbf019c9658f00ca23adad68d47dd7b2f6bc9abd1012b6532b58aaa23bea12b9f8a8aea983f37f7c71f7eff1d0b19bf61a6e022e7e7c34bca56e6f70aab26d7838788a733fdd438d21d155e9774d9ae21eabb864cbc6a1b1c37b8f4f45a0908dbcc440faa1561135fa6849de62ece2a8d24e357c9595f2665c79c243241c9638eb6d18bf5a1b0ce0bc37b250e736f210604965892473147f21ee4e00f800a1d24a816132edd6a8fda11eb1f1b4dbc7f95f330a15874e328cb7629f85e154cd808efdf4c3c8c5d563a4edba0571399ee3783e9835ef164faae986fed582036d85d96accdcb23b6eb8f5ad4a31e3570ce5401fe8b574cf134980ba19467fdcbe2087ae682bd42c6fd4e6b4fe325ff3221df3d77426d4797d03b87af249739165f1b7e9bd1e8c7320ec512e26117be6006ddaf5397e9364e185662a0ffdbb865c6099338338a4ac95636d1c793cd4b0e95b94c1ba7646066b10dbafa0ac28bf36edea55cbcafa552de83cbb49c45838d12ced73adb7a9916c1c253c3e6e26542bd15502d250a85f6a9f9fd9fddec7641e1fe9d057149b7c742488dcb0cbc1829bd68d148eb6451ab005ea6129bab1b2835956f2931facd654a27719232f3653cd3b601c6367206f7bf820de54a7ac26778fd005f66e0b0e0ddd9f65e870e1d992ab5b4f5f2823f5de64307306ef75c05af9d7f4167db904f69ed6499794882af5a1975841cde4402cd8e92aa98998120f3a4bca71773a4eed06fa195dbe10e1d95f78d0dbd72665ae911e101393595995c1823f695c682a7460eeae6c47c2ba85c2c9fd9695b32fa561384b42333c955f178d3c00f50ffaf39366b6f582d008e4781c2e99900d93e0398cc9e26ba01e5b87f3cb4c015a0a018068bdc7433cb6101be10956f17336166e6ff02d459530e1465d8ff13061852782cc9fe966e0313a5831ff191d48639047176273fdafac37b259873211bdbee6c56b2d408109ab066cd57d18b2eea0b1c3331c409a3c522e8874cc14ca69abe444b142508282001a8cb7959f8d9d8694541b25e2bd9092c6d7fe4a1bfa4d424679b536c4332619e4bdfb048d005d0c525e134be85bcf9a5a83c96bfce69ac0d67c44e90fc8c89a5447bcc08a69b78128c4347542a12a659289fbe5c18ed8c7731f4139e5012e8909760477cda9cd27a43b6512e7d0a76667c53176892062bb78b41c7cb0f353274de6c838319e81dd3b96bb02124bbc528702112a9f6c30e117eca70b33604c9ff1080c7fc0dc3086c902368f9cc26f1983f99351916e0d849bdc147db16770a36d43f12a71bc01a7910f6af0a1defaab565327476bbeda4da6d0d510522563d7daff289ad2fd479bfee1d9527a8b45df13734ee5766ea3f7948cd8b8bd29ac04640b6ea3a8849ed55db558dce01c28cf1d9995a4451063c6b8ad740556a62f1a572182ced5b6810bd1f78f52492f5fc547baa3815daf61267ac401c17e60c9a2c4e6347baeeb7b46adf633787cd72e9243ba7915d1e0a5698c03de52f04095a640f894579ba82f57b64e125880698e3065d947a06c98c810f5055a6b6818368d4f6e31c79fc20a74bdfa9404cb34b81009ff3ec061bcd39350af7b31d6ad31ceacb3f596959701e8da996ba8441a1cae893d88902a45ca6e32d59b4a8f92b7c5a5ec75efa2c37884bca705692b7dce05d3912e7e8ffaac479ab20055297cdcc7850c7344846d48d8bf602eca01dbbe584b7a1320c05cee29fe2031fafc1078b03b741dea78404baf229b16b50ec5666d73f9c1037ec7740d55fb78cb9d5a5a8bc3266fdf25609bd9427db0a74d51db3cdcbaec723c0746dadd25d78776f0b1b78d8fc4e10c5bb797344344a8894ee0398b2be0de20872e8ea82897b2f4dd27aa32ac2dd7ebd58c5b75c338fe48b61476d4152fa98093e7a72b5a3f310c93144ee91af439bcf391519c69b23b1c9a7621e9f0bc7f3a64d7fe768b8313c68deec25865e23e9c243f5949e49e3ad070d2b740a2d1b553ccb60245c4b2730f5ed232e2349a353f0701315d1b7c0d04f01f718c16ea8287c11e7818eb3b4958409cd261ff5a6e035a00dcb21c74974f0efee772a930b308bd0b715f65d708d6744711b6e4d33b6ff2e4ac4eed260f0fab11c58d4fef72b3eb7a90c2fd806b813136a3ae545020d67980271d98028b33a8021d2c19aa02441063fdb329bff03e4c1540f7cd805f5a739fbb5436eded1a7d4d5164b2c7950fb85f26ac95f3f02df06672bed334dfecd8a3dab7aaf8a86b3d924c4fca336236b1daf65cef58822f59a1e2239f7dad7935941329d00db854d408387e479cdbd91c8a1611416b9b7c4e4ebc3b586f6265a4577b937cfb149a2138df4b16c33ece82bcc56afa85097c99231b34c1b86e7010262b6f1ed3cfd122bf0e1d73ec481036ed60787be1bd34c54f841bb533caabb320bb3757948ec75242bb7d3889fc6bc31bc408bfae9d4db63640e5e6d6314160e70623420c12b78ceee0f12947964983f6f2c84582d9a416192f9d246d6e4922b5136cbfcb20f8277e2921d16185c20243ade0748ba2515c759ecf96431b5da927d2a480820d46b49489058c3d104c7b12c79de8e06ba3df6d51f05c306cde7dd19f2e54892cb4dcdaf44954eb1e385f874215833f7a07b90d8c8dde991ebefe609f6c4ce7787886ba30f3760805f49a0298dcaecac8325b670e0771aa04c675bc9bb0a4e20ccdd0d45c392b3d88b4fe703ef6ea6091f693f29f626d6df2a39afe771a2c7ad9fe41f421d683fc8bca17c5c9f59f06d1df3c16c1d9bc17b2c0fa764295525453895b8d0f803993b71b289474231007ffca825041b21a8a131b697b19e1f650a7be264138f8462007e72764b8b36425043636c2f637d3fca14f6c4c9261e09c500fcd0fd96166d848086ded85ec2bab71f180b45a78a6c449111581f0454230a438c78908453fb532d36de7fca802050475143386a3fbb7a8e2b2a54fcb2d9cfe0e7bf9e93d10c32fc9a8a6bcb13666227bf53a22b013248010fe43a2d1e9ad8930434aa6d1e01c87f4702ec3e8a0aad33fa7f1b0c17ee77a845db4773cfda7538ff825a82094ceb8325b4b6163670cd34a81990ebe6dc609f09ec6ff0a71d70f21983970292c8d7dbcbb8d447fa47d02895eb26103bea161a9063620113dd5085f6ae10cb0de67021f5bdb528215283da429f4f79bd7a7e37af30f998b4a0c989900a6f2b91342a06cd2f8c0cf312df37ad8171e8334ee1d3c2c3b00c90dba4dd1077c798fa9870fd548da46cbe119e0b70bd06301ff1b930fd4b8161978e5bcafd696cf4aba1aa7d6029bcf95e1e05e26de86f38ea332cea8e2beb4e5eae79836c5da18e89bdcd45db1ac20994e19ef5e661b40f0aa10b5d9c205d41f0f2870bb126a6c5c17a91a1e3f7ae1ea9aca1651620244eb44061f9ae98976979d414ae1014d880713b9d776e8844af7a1965eab7cba8323e24db32fb00205a7af1c271e15adfde3ef9034bbeefba7f506da9819a6aa0aad9c5aa4cc58ea12f2559ff025de09d0ac0089d0bb2a06c53bc1d718e5f334e3abf188077ad5eaf25f77eba8f583c1a1b9ce00f8f8a13971d917d49ad8155fdde9dbcc9517dd07c9f20c6cc17ce692f97029be8656740689f692d7d3a35b0788b90885217250a4d1785d0ed2095a12f7e3d74015cc65758006e07a90ad4572b936ae059c4017aa47f9905da9cb0eab044db500db41e3e3ea8db6290293c8ca7735cd92f59e860a68c64ef67c947bf71abdd8bf9a1e1b48b85ba704d5717ca64d785fad885501d853c58af13fbcb42dc063e600b42b91c5cc31116a702015b87850a2c878e55e90276aab1309013bcf65200fd4822ece05351e982e48a81be04fac5b02737fcb3509db9a7de645fabaa09ca29d68648f1073287b8ca5b1dc138706f117ff08d924331fc1764b319470ce5bf32b3a6399733f54b4bc38cc15c421b423ef86c08f74bee89b402107b757766b99c01bdd4581fe3731e80a25ba2fb4672fc56ea5e81778626b8613c5e5bc694883d036e1f9ce8b6514c2a499fed0da00dd828c67527298371dc1b400b30a318eb4e528632bb06c6c45857a2db8cd470a306bad23df12da3c996372d17457cc6183ef93de3c764109b3aee410a0a5bfbaec4811082900c6243dc8cb81e6886c7d7a3a61add8d22e5390339ea1bff0272ae8e2278088398826310fedf43b3d18e0551f80b20e72212acc32e8a8b5f4010211c5d4c4ae1a25e446c17411cb688d4663ecb7f298290335a4e4510871713d99e7bd65b0c28a89f2e71c2fe86f3791ac2be9568d553a46704e4d19b9559c1e20c11401b159340d074ffba0a80c6fe638c02311a8f17f83d52b18a624217bf073cc6e44e817a40d0b72b065a32e1ada7c0b59b0e04fea31d02889b04c16d285e95c0f4703c7570589d34f538d4dee7c86727028b15a3a8dde4ead84cbd444ba419f5ecfb4758f234bad01649daec680885dcd2bd040f85fb7e0b3a60dd07563fbdc864f9121c135dce0fb1f4e91a7e93cca4f15238ad4124298b1982c6921b51caada960bb7f13125ade7b7b42d7cca608fb9d9c61debfdb27225be634d5cca608fb9ddc013bce44862b48d86e6e8c59ef4c813a3e2a52a8b139372262ca7ddee3c5a1de5a2d2531713a91e8c8cd5b5906baf6fba4b71cef43a0e88f6d942783923a4d1e174fe200ea998d6f331e37ab3cab680a77cae3bc6435e771e56ba4c7cd14588f5b05ee596c1c25fcbcd890bbff69d0cbd32cc876af6cb2670c8ea6e6a37bdd21374141eeb9f9ebdd0bb21b89cb0af13fc690432ee0fb41f662854823c4cd7321b7011271525256d45af5140336d2c10c26a06095ee41fe41039b682d55c4e08c392d3b817ef82421a29c926672d5ed01633a50b19d28e746826cbdf5292780f18a98aeb5de8afc5589b61abdcedb7d67b8e5f6aef78dd3e6fe6940f166dd4e6c65b7e70693e29680a2cbf52fe6a1f2527ca244ff7731ac90d9468975936f48a737a730a10b4dc3246d6fbc7805cf5c11194a51a2e918625c10950aa34e27bb7f4e642b10896780e149f4094782a9831b56e22022b2fbf9993d0e060d9e69483409a369043b255ff37ee071b3b5a2c63f1731c8a0bf7a85f598121f7e2015a0b5b4053b9519e935a95125f3a1ebd5d14250a8e77a9d5918232c16a06bf29bfd6572009ce8f506c9a4837f888fcaf67a9b20a4625c2864e07a19a0a8f6e5fc103b5416412bd64f746e83c250f47e17318d45e7d74623dce52dc480fc0d9f61fee07d329efe359ff7f1c126d43660b902aef97da999482950be234e08e23b55326118e2212e72d6a65aab887a1a05518e9b8a2ff76b08ce2e5c1d8d2b8b1976e01db14e6ae67226a90e681681bed913ab40af26fc989106b2e0b9016317c465ae5c22652936ccbcbf80c93525e8b40ed202341354169512588e2ec7223aef162761185cc1ce7633149bc6a9846a0b402966ab01ca8568cd1b58ebb11d9faebd95257cf337a5520e7ac0efa7a7c12da7de5cf45e3eb06febd9d864a307ec361fd663bc2d8802c7200fb2d80b94fcde51f8121ce1114167964c45a0739640935c51eebbf0beb3bd71b535ba7389a4dee25df8c56e59b2528447251374aff21c54e193256a3016ae506b94830f2acec757d60f54873cf0e0c996a7b53b86c3652190f38ae89e7135880372dc349a0cf98a23ea66e028e2e6dee7d76ebca8e699403e4e2fc8b063765c70cc13718463e28cae287c9428cfec3181607492a391ad6b05badfb126d8a9702f2f267ced89405d4028230902e173eb8cd46c4d02aa9c8d4f5b805451491ba096e9b8e4e3aa35e2fc6f2ce9a40206d81324f04e651a8a5b8c1ed84af98a8aa12901a68ef258f5cda6bf2379c4524cf59f3a0bc07b7fc212a81f35f413bc2672548ee324550673c3d1b66e92486477f7d2965cb903e304d904ea04eead8d2fa78a4fdca34c3a7374b29faf148ab1c4afe063a36702b1986ddf8b90928fadc81b1f6389d141083536ba5c67bb2cb90eb623243ae414ba51207c6c77602c0e86e95328dd36621aaecebe291463c1589c0bf1e96323889130962a27d3c0b6d65a6b3a744a38383a6e6666c4acb87021adbcf8405a193518e524e9a4b6b56a71cd6dadb5d65af3b47fa51d393370d4ccccb8c9313323c61dc2d8da3f7708637bee10c638c1384d52ce49e5a4b4566b6fb5f7624c5115a6aa2a678fe7f36921adb13012122222c24213a1c13b81bf5677233aa37faba75745c115a5dafd4a51c2dbdb0e4f1a40b4d8fe1f2056b6bf754f776cfa203ab6bf8581c35a791d96c16dff975d60a7f846b1efd9c7cf193eefd47bbceb0cf473068b421f3ffd9bdf7596c2e989bbc2addaffd26fef00eaab07500d3def79fc396bab7a7f6a555f1f7fb62a1dc3575a3f36c06deaf17b34090f996a14ea2b8d02f2d4af0c5320df1e62191c0a10dd3e748aefcf370d413ac5b77dfc0fcf60ffa3fdca566c7feb308afa97c328eaa515d8d5578c02ce90ddaf4f357ca12ce3c0f6c7bbeaabf1a738c57abb9eeff5ddfd09d9dd43a23fbf084c43ddd84762b8ef700c59672a1e9d555fc21b3e61b13db6c4f3545575f54631359d81eeeaef9ec288b1e9fbc558045ff7f1531fbfba30e076de55a3b80c28fce9064adbf31e9da580a47a5d9cebe7ab7a7c55949e68461f07958dbf5e597dbfea358223bbdf2b5bb1abce56d8b73a539938e064c0c40f21211870db7dc0171faf5282f5d2b65a6477b75ae418dddddf6ae1ee5278a908f65be62206cc0b1733335eb870d9ee1fcebb71186fe22427e942aba5d5d6d88b4f2a5855fe5c35a98b4955ce55f6cc783ef8e4038269cebdc72b797cb8070979300f4611333536de4b69c76b79a41d39333370d4ccb8c9312386e4569c0be7d26adcfbcdc33144e76a88388cd32427add55e8ba98aaa72e5f9803cb01008c7f0011202122212c2c2080bd7220140004201104002aeab5d00c02721121c8347bb04f0f0bafcb96b520298d43f02cc28bddf5d859cc19197f60d0bac115823b046e001c2187f7c5b39f7b2d002667c26e435efca0d02fd7b4f8301f4ef73c3c7bf1bfe7a3c8ce7f2f8cf35ed0f8fc79fff669b63c601f3b9e0f6f09bebb1f95cbe6f6b2d7c7cbc7d5b6b012404207c2eb73faeb63d6e3cfa87107df5e76abbeeec2f80fc7b9190ebd1ed36d7713c931b6c7057d81e2e84c6000ce45d3d0cd53fc7c9ffbce6027dbea6ed017df51e7f411e18e401d2f98a1e0f8f50be20c8d59a01b2bf1f11ff78b6c7d55a0bd5057221f3e4b641210f72ad18ed8ffe216492d4fd9bdbbed86bfc8557b1bcd7b45df6fc2ce438971f31437d4604399b3831cb5b5df8ef0537fefb1485df831bd036a6f09c97ba3a73fe6e668e83237f007989415c7a3c0f28d44a29b542608580be1502ea4fafe906a3fda68f3fe2923338aa6eb4fb59df4b23528013e96e5addecd9f22d3bca77f8e46ea7ef880aaf2a499bf8ee087a8ca6905fdc9b04144002f36fcd3359802be1ae0814b2db90e4855e75380233555348da7ecd995b230bd908f90b21f742fe12aee1b817bb84bf006766e04cc38124c816f0d246717fed7d38e32fdc172e7aff326162442e9cd96fcee05c7d4990b3503667f6fbd0b5d9ef5fcbf408cec137a13b0e04b2b543cefc8614e134e1f55296fede73ff9cb5439ece3977c19188b503c9225920788bf4029e2b24e685e07f5c212f2e82ef7185c06c1c2fa09a1be40cba806a7266b96c08236406a806468c1945d868d9d9747111ed784e69446261bdb84d88410c104ed8365e150e96701b1ce213152351f7eeb15175aebe2be1f4f2d4faa6afaea9da15cb63a467523d0abbddcaeb749622a7ce09e93449ce866f63360bbbd190818b6dddb57ac828ee63dc1fa367e2517a264eff07e9994c1946f2d8f14c269d8f956702e7ff6c7921c862c36f93b4e15b2ed9c2170b09997a0b09399b301bbab7f14222352f04456ab416e05b3ac8eef30e9d0df39778b7e491f34cdce3cff28e0d3f5f22392f04ef67b7e491f342f02d1ce4094726b2e306087fe27830c78653c786dfde3c62c31d1bbef5e14585968feb8424cf908543979dc11724395788ec8110622d3c104a0fd60223f4783cf73df0f3106223acc5e3f912ef033d95cc2f3d3a739fab8bb1602c180bc602756810514323c68c5cb9af2af755ae2a99e5a7bc3dabf8f9eacaf2565171ab1795443a392b69a93cf053fda764a5fa4cf13fa0f7783e3257daf39fcfc7236d72f555a5b314ee453ba21dd14ef41be904ecee7e63a4e2530f63791445d1a75e4551ff1e367a588b0d5e3dea6124ea987297622c180bc6329a6c2083965db21b0d226e9ebb7b15637c7c453ba21d15155854c22fd2c1252dd5a5a8a874bf2a59c1f8e24a4ef12bcaf354a5a9afde13aae1fbfe15ed8876443b37404c7fd7df4daeb9d6dabbf60e1b612bed1dd6a23987adb4b85a3152bc0d5f121df2ac3a856eaa33953d5944f2548a0123868b21760ca1631f60371a43c0dc39958ca4942a2a4425914e490b55d9a29248a764654e9f958ce6cf9fae4a39cdff7466affd6ced7dcfb596d2d45a9d559d0237d52219bfd942c26c5a329a3e4b46b564f44235efd46d2cf5f3ab2b54533dfdacb310fd11121d52b80dcea8761b8afe08dcb2fe9d9e5a5d2b7c4a1dbe3bd18e6847b40373df5482215eecd06e3484280981b307b01b0d21668480d908d88d46103adb560f23b9fceef417dfc3481423bdd7a426e1018ee4eb9042f7fc0952121eb2d42974cbcf52a853c75830169fa3297ca6129812aa66c7b77ec4f61cdf212f7c39fcd455bdbddc4ffc1e97ffc7057f84be75fbacb536e53d3951d3fcf7229d69a99f1f1a3c3a9b94e7df343d1ae5fd7df953eaa9a262c596a2924847be2b69d919fe94e7f9155b3ed1e44a567686a7f5bcc3564a9df2f624610a944fa34cef79f9590ab7c94a461b876ab6d4d823b1e79d9c94ba2e85b6eebbc754be7c5169be48c7c1207f968ca49459cacb4a46db7dcdf8e4e3f9ea43a97c9c02b3500dec20f91ffc143e991ee5f3789af4ab39c9ff38986ddfd5a67da7494e2fa7ebc12fd2712ec89ff0357d099fa2d20bc97f39fe4c81d974f3e29f5467a21d0783cc59672910a6681db04699ec4b6975e664a8c6760f0576ef3616fdea65265f769c2f53e0767f3f0bd5d895761bf9f63f2e8fabd2573afeaceaecf8d495c26d443b0e86fbf645a5099fb025a35de3344d139d5ab4e35c9093aaf1d8c13612d6877d77f531476c05ec462388183b8815981c3b8816db6e8791b6ad178e565ae443675b7e3a62f19d9c7392f24d27ede443f750528d02310dd9632ccf3d8d029f9214a5b2b52a2a5640fad80ac55a6c940aef63236cc5c100ff612df46a94f715637130503fbd171f46da93fd0ca650ea7d7d32d4495bf561236c052361248ce4aa8f1ac55601f9c280db9e7f18c593c17dfdaac2657ffea32f4c79ec7baefcd485ff6d7c65959635a3de5afbf0ca54b85833c83006eaf1977078d55f61cd205b9dadd8f5db67291c67df4fa9b19b066054b83c1111bdc271465604e6c7af41fe34a3d4d38d836f7a7ef7991bb11b7ceeef4fa0761bb7b14eda7eda728ff25ef40861bc628c719aa6294a29a59c3264c89021235a32a80c2a83caa032a80c2a83caa0f16d7df1bde76e494490df9fe013ef84fb0908e18918633c314dd3349db0624e5831373739393131564cb6139f786858dcc7d77d4ab1862a46db7586bfd2eb8ebfd114daa08c95edef89d9e1fec6e8d8f73f6270c414b1fd3dd3e39be75dcf0fd0e7dbbc8fff7ef58b83abd4bfdeafae8c7e7b900b72ebc37b51948a51a58fad4a5b44e47b3f3fbd3215253c5e104a93f0902fc85f8d02f29546f9f84bf74da11b44c38ffbe1e179fc17f4f1d84b6ffd4befd7dbe6b49490fde18c111323e74a672a14fe129ee5d1a61e5ff92bea844544c63a4ba1293485c6f870f36894558c6ead5746e914ea57a662641131aa29b45a44e4149a32d2c048c568b76f3385be0dfee1282b5842583ba8019f4916aab1b314b853c01931d8888825d098c10b0d2066b0156cb404f7662bf724f0dc1d4208638c314ed3344d933401df56d610d3b535c43401dfd2b6dd0ff05928defb9f3c7fafb2df9b3cb4177a14bbcfe0c83ecb3e4afd39bfcef71cf86472fe0fe613e8714ef8c4f7841bd0767523e4e5f9fc39544fbdc456043c9fbf861a2aed372ef29f6fa9fdcb4271dffe89d56ed35a701b2c1879ea4cfe8b6d4bbaa3c68cd8fe2ba04a7d5086ac711c071dca92d134c109c2f8f4aa89fa4525914e11fbd5b824bd248cbbe825bff71c7e236be28b35d0c107b5c448729a9c76d63e6c6572ff3016e7c25b21ed391a593fc091f5438671b28825b07e04f5eec6854541ce3c47da481bcf91369e630269236d640e7923753c93491e21739e892d9574443aa2926847549236640d59236b481bb2e699c87734ca1acb058d54d314784e8d9511c904d9ed1cdfe125d7591991443b252bd27324ce33c9a4e78ca48d6772c91c9e236d443b229d292ae58876a6ce5c73aaa7ce70c89cf31cd1cee8f6601b0938724e24e71eecb45e647f7f7971992f2ed609320a7d992fcfa4ce19e3994c73c633997926b6460d1b135bc146188b9e2e5ec81fbe707926f05f3c13f9aec6f9c2eac17d8db55a2a80d33a41762ee00be82fdb615a360d18973d5d66cc33693460584020ae67d268c460c7f69f30a0cb7cc158aac6569c0b93c6462e2ec34165ba1f7152cfcfa08bb641786bf59051e4c73d498db13c93d718e97a44384d964b9e5a6b61e5e137f8cd8624870c515ade394863748e8da4f4a8121f1bc918e5c7489d94d24df81163c148f27293c5869383113e842c2c1fe4e9f5545dd8669b754eca7855a48c719a7416a50d8557dc353937e1eb5ee99c8b252327a5cf6cb75c6494f91145dcf35d672aef269239b56cbe3d5b0b2e2439e498c2712ce0387bd228d17544335f16c645fed5651d9636f75a3672c3560f321cc9a0f3c9e6994c121df2cb1c674fd7f1f9befda78db9016edd64bceccc0de2234b462090a824d21195443b25a3cf475412ede429bfa824dac9a29268a7f90b210ec4e92c05d6af6ee21095ac172e4035a21dd00dc80684533202e100e500e900d588765c9290849c4d92e772384035950e0e4fc88bbff0f1b0de17504dc865b170117c10fc59a5b3e1073838efb9532782a54354b27890b3146e1383929197ac83d7f4efc1375dd8c8dd79909fb66080911c6c816d0bc8d04af9131bad505febd52ff189842c5ec85ddac7f73de11337c62956f9e389558e3146fbb93cd5e7ea3d5567a38f8d5cadae5278848c9120c6e2eac74a83dd35d66bdabee399541eeefb11cfe47ec5276e556f8d6dc2dda6236cf7d2b733a15e6f3b13dcf61c7fc1712c2364f75986efe935e5e546602c313bfb02039c975d80dd68c0a054831cb72eb35f4dd3cc574a3cb10c754bf9f5adc427dc8e17f2f752fb38b53dc12b2bb9f6ca2fe43e453b25a37a4da7ef4d2e19bd908a6867ea6c9a1f1aac65842cdf4327da79130e2ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb2ac6a655a45c8094218a14387eed0e183eed00b0061c8f59423a8fcddeadc912dbd7826ee458b1a23a1a0b5f0fee77ce1829c4114a0a031a06d480222bbf6a2e0b8faf6d699b086902bcac66cafd5da28489b17e4cca3b0fd6d64f4283c67c2d6e744b0113bfcf7d47c7c5943c82646483c90e1bb8491339e89933164cc8e7f77b4f55e168c6c3f731b152ffbcd377dbd54f6bb528876423136e2e3cb6dae2867bc07b6fd08c907f268b63c93f62bb0a5c5cc268b0d47a32773489bd6c210f2640144cee0e841e87ebe70427bd77c986dbe926d24dc9d75051986dc644ddf260f27ffc96f3bfe73ced1cb417dd3017be33a1c6708f9664affb98dfc13f9d33f9396b98eddda0c72606cec6b371a302f5b974cd60b64b41eedfdab61e4fb36bbd68ff455769510ca9c37856a93b8485ee8592cc819096f814342e49d88f0ba32c859c8ba42ce42a13973161109853674be834fd771d66c58037a0c44a592119ca143c6e65930f078c57f2630fa0823c115db9e1dc9e107eee57821bf79a1676323bfb78e73f01b8b4f5a0bc1778b25e036bf7dcf91e385b45b6bf5c09b8624fb3542126c71b7f49d862d1a925ec8b91137408750786fdf8d1b379ec7c440086fc418e3cd8d75e3c68d1b376e5837ac1b376edcb871a379737f93084674e480446b6d45fa5c7926e0a8befc1ca81581faf26ba8191cd54033f8dc83cfa73bcc133e81306670e4469cc43dbd8d175e270d981e253efce9fd9cde5218ff647a505b33b9c483a39117849c41185610b2942e822af1c91cd0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0bc36e733b16c90dd99d0b16fc8b19f8947cde4cc733ce7859e25840ca7e7e4b8085b6cf7961072e6393f4c3f8167627a676770b0b0e386939393e71cb6a6e21c056840037f5b59333cdc9cefde93c9443cf198261224a288489480cc7982f0e4edd0c9893b796fa9a4d3eb818c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c0c0948bdb5301bc954b86ca8b3fa387fbd2c956bd52a9b7a98a5701c8ac207c1bfb57e08fc0b1f043f3bf594ce40400f1f7e3cd499c7473cc3ad4f7d7dec79a8b314d4d793fad86a88ebb77740f5f94bbc07548d3fc2afd7e7f3d47b3cdaca0fbf5af9ed53efb9acac63a86fdf7e7dcfdb6a7faad47f34090f99d234545f354af559a38450d5631df2eda16314211a44a7f8063df555674dc3fbd47d08ba0f2fb46f2bac19e2b75f2f7ccae2ac330a56ca615642869e5fc8eb53fa948fe0773886d75916a9d99fcff75b89f7c93963ab51e857aa5b8967e1370c6b7d4851d4e5389baa7efa96bca8640e5576b5653533010005d315002030140e878342612049f23c8d761f14800f848c4a68481c49435a10a5280621490831001002646000606430da1000d17001ed439d17837db30ee2819583fe07cb7f626f1f207e866b2bb8ae9dfa2dd8fc7f4f9996ef0e27fa0899af6cf7fdf29d23f62a2d4e13860068982ceb5df90f5c9005be805ac2950dd61a5bcff50707bdee3e1867d49c010ef3192d230e758bae3f7a17c1e86fd0ebc70fe4ba82667ebfd5423303e846934fbffd28082e21321ee607dd3e0e4a97cd63c400cbd2cf6a4c703b747fbf2b1f7be00ad7df9cefef079e690e38ad1ecf5d58e2d785856e0f49424cd2d35fe81944c9910d506d4c004c102ba1593001f3e3b88ec1167ba555ec56011c7afd4c280118983b29f1687cccde69f6dcb3316e3c3b11b0de6fbc191b036880f9b45a9f38355e28217013f2b351bd9dbac0e006b7bf62046593a27aa42512ed78b7e011145b3cf2631f1d9b58758ba7adce4f9786259c751efc451505af31688ce1112226b446870e1e2976b7ffd8a5429cb308ea7f56c623ca7e49f205a6ab63f1a03c4109db3bf8a29d7fec5c3fa439823963fa69cf0f4aa79e12bf7d97b7d04a374058862f1dca243f13fdcf81709486afae3f7c2408849e075c7eea0c844ca36e73dbf3958394c722016acb25b4bc61724eea790abaf8322116ca62fdb243b68954108a70c8e1d0609e8e80c929f335898811d1b6a72e3c48fac28753de9a4997011f6b18c36d5cea65c6dfd70ac3ed901e3dc14c7cde036d0c95d22f1aed86d38a56a7e91ec8455f961c8bfaa3e040ef328ee991e8e5a023c1f8bf69d47acb4ea5249722839bec61b0e18c227a09ed5393ee63cef5345a0d7515bb0220f82c36fdb0f6a02b1e516d08ff57965efcf34fd6f50b74c7ed1242bce9418956626e68fd288d62ead94f0b663152916ac1200f3da466e65969a63847e019534be8c22d1c17b0575127b8a9fa06b7a7d4239d1f80210a20e4fa03826d7c7ab319c1ff225856c087d9e91ca3478fa10f8e29448089c62d7a55fbd63fc9712d4e7e6ff86acff03a1850ba6b776746fe0c8511836478d60e0dc00c9c6321c090fd96adbce8cd90c8290df048aa717a933274310e1bb0f98ccd8aac29e0d121c13ac738acd61016d91e06605a0afbc67220382c06e3fd332dfcbde40d6655ddc3e2f806a74931f190053613053dc280f369964f021ee6ea827c27ae22269be7ed7f734f6d18502380a8ebf77cc2b339916a07b1d9fe2b26ddb3a4fe241a96aeb2a07f17f556f732287ed584c5f2f86ee92adb2cbace27d6a0febbc201066b35ed25e273b090d81ef46d3cb40beb5b17580962cc43335677077e3527a889fd57f89795127c8513a82c3878a6d618d655a5d491e217101b031b89b268f08c024f8d82a2e778a6dedb4242aee934ea78dff485fb0d11467c2cb03cb2c99028b09a9ac9b4657eeb49c3b8e40d313a9b7404f7246c097b2f7407331ae52a28a7d4eed9f6f858359e66fdd34d4338ed8560f91200c762a7cc9b2e83f6d364ed9f71550fa21b26a3a65267a60fb106e5cb66f01c370c541c9ee3db481982aae2a5685812d9bdbd18cc61fd5fef42aaaf081bc48a2de57b683f9c5bceb583be9d7f64abb673ae4cbce05d396b2b95e4b82b61b12d388fda937f49cae89017b2c405ddeaed1efba2617ae846eb926a4bb1474de6780407dfae4edb82da3539dc98a11c4abe5842c4422dfe4d9a18b1af7ffe48c0fdd53ff51ede1cab83e02f3afcd9a9eafd46871d1c68a97f6981de2f9897124766d07ebd3032aea83e3551b99aac86c86914b298624f1e985b56cbb010d3e184140fb1b880f2c2f24db61bc6103eb9829f443993430e996c0d6b8f3b08b79ac2c8ca913ac866e808b23abf0c01e8c01faa30a00c4d268dfbe8a8636ff4818dab99a0a9e85ab5b79a302d6f91a471dc17835c8273ae255433a857305dbfa5e1b2eb19a0b6a7f26dc854a49fa9f2310721d1eedf7d7db811f0ec85bcc3c54812a843df7cde87955c56bb2bc3e604667048871073d96f3300fb15870274f7dfd4383df7ca210fecec0729539811ec2ce1968cca89a1610c3f2ca18f8e3de648bde98bac2ff64814d41477f3f2ba79ff404fed6ac55cd06491e8e73c996a7fe1faf116dbc268296ee0e46b1324127c3e8573863e41fc9a055bb69e8f44fc54a7e783da432be880cbbfc3baa2eee9a2155e76df8c2282e1fba8a8d1310241aa4b656798079b48154db765aba2e4b05a1aef3cd742375f32b03ac09f2e206363245184e23c9bfbc42818158ec91b42bb2fa2d6a7475df4ce1f37269cd3ad102183db802f587db1ad043293188727e2ee53073ef1ccc9ca585d071289bc01996f8e8f5f191a4bf7220105ade26ae85c0c1942bc4b7eff793dcea8c47c39bfc2967c49bdf956278352f433cefd620b40525f9e3d2c6c04f53489a01714045f33b6cbc6e8214e5dce58023f6e835c41c3148c3ba232907d0687f5120df0f401eff790585fcf99baa22b95c9d84d1eafcb7a07ad02fee61c08cc3adac08059c7ce70ea224810f1319a8a366799aee756bed6856ea6270cb228e31cd2e64fcc10e610a22dc51b10e91888fea8a73c6956eed28640404b4d0462028d83e7b574158c7e39268e30433f6fd7024c7ff81efa0967246eada81706c200a632487f9c29c2d6543e45c093134587cf8093b1dcd7329b7a7940d02079881f5447284654234981c3af7752075b7ed590a854ac6041ba986bf3ae8c4e46f95b705317b51b57d0a273eea013c590b910784426c67e6e7bc693858d2326ae242bcf0991930a0ab5f35519ba2660b5c067e192dd398bf2e1a1f4b92e12c87260a132f10307e884118547167e28b008ae2a62497097b0b5499bf34d2adc7081655179a12c6a75af8ee7aa150e4f067c0a9080babadbb404438229347176b7e22d5b25af63cf472e079373b3ce0a78cc82b8ef7003c660d372fd9b3e210b53e638c3fcfda62dc2541796636e761df1b9359936c28b9b526009e64c4a28e8a483587b92feb5fd870588e3d8cd38006075ff98941635087926a65a30ebcf85039140c33bf98ef7c32c186fb066acc3bbf26f9831e5d6de3f7f590ea0c1e81bbe40ae5cba5dd8015daa1a1df88b8c1d22523df5e30a724289ed37db5fe56f1c8acf711ddd3dd4cfe6dd34b7c9afdad7b3ff7a493afa6d3ce65d1dee1898890450a9ef6c2fb32a3c148cca53bee7647283c030940e7e0d1240897a764ba8c4cb04d6d29681e8612654c8bd2940e83722668235940bd667041a2a6c0218305ff2a9f07d20371555ef26a97b8266974b32c9324b53ecc8d9496d2488aa831592850d8e64362b2eed2a83ca0a38599d89222459135580e839280bf06faba35db075364564e046efe2a11405b8554b92899cef641e7f15c836b98ee81076e36499e3204907759c0105a96cbcff7f64ede15ae8eb137d2f5a890cf9bfe4b5d8ffc2a2e76ca7a68ca5b60ee8c5031114c075e518712ce678f6317589664cca96b7761752ab8344378f2a8981167420db65578dce7d6900fa2138cd613851dbc2970cce1d8743276a0f243940cabe7781e69086efbdd212d562d8104251fb340269567f0ad8abcc8bda406edc20b7024a728321f15b8e109d99df800ec1ba684ce2e025371969893dda939e3d155cd89c10081d0a818ab544e9cf63080f520a9b6d6134e76122402d46aa59a3917f4cdb14f4cf60f16ceacd86822c4ec4c1d9fcdccd0610ce066db421c5a6738982001a4aa6f2d0febe6f48cbba1f403180e8e7dc5419fd4416c0b1a3517b0d5e5cec08029d813cd97114e10960e07d6fbcea2fcab239830c80f1d7ebd39e1c1958b9dc40eed0521d7216585a87a38c6a163068af6abcce179e181c6387fd0161a0f1e1fb4f11938fe3b2a0814a169700b2c41cbb086b2d3cb99b3ef230112d28d5d6f098aa18ae513dbbe98a862215cd450caf4103854306e85e23ff078130b2f7c4493523a979dd9ec55a523b27f2d52027addc5548701da91fed2afda4cbab1b88fa1076f800146a5e036bb61ab488dd2894fbaad3f45fd9b9a33166df7518286a6a11242186e4d90534bb015ce8452ffa5985308053d4e6e665c7b6b79384d93c157c07b6a5f722658514b3bce8ed3d28b3b2cdf2b2376fdfbd0b257bd62cd96271e1db1b2f5f5f7f2735366c59b0c0ca32589b22cf7ac42a0b310e6e09644b33f65a4024a88525bd425b15e60644fe0be9f8b48f9a8d21bc57b1df93bc4e2ce58b45b1a780f3cd2ee92310afb3233aab260a824faa54f5577d66f70fac21141a05d283a2815e7dda946e3ffece5e2f98267d391ee2b64a3bbb783e5ebe8b4be8459ba43d20d7afe7d8f36eb542229f4539147e8a079301e2b2bde8d9f29c5763849207161dc54a93fd701f41e85cae4968e7779d83de2b18f0b135cb2d12466caa331cbac755de49c23a9d45c28cd190bdfcfa18ef4383f4b69f48b8fde052387e88da684abf9653db3b803545e0fd064bb20e754228e06c5a4910c3e83e143c1b719149a383aba45a3395de9facb6c4252d94305e8806b1ac58a58de7f5de8dda3d8082936a4b8dd56b9d1cc6cc3df71064f77651d4d6ea609cebf97c9248856c6c3f4c2ef30c2b03c0a50998fd54964176861d66bc3756dcf162d4374ca298307b71f7f513ff008cbb54a8a550838270a537a8518f23f04d6d25a9a5d77eb1a41ce74bcbcb2f48975017155d9458b9f4f27d54b2b1c0fae2fbefafbd83221b16ac59b27cfdddbb57dfde783f35dbec2cb160c9c2599f728f3b7790abe02b58e1b1d485970ac3e7e2f10bf262795711249bfbcbab17295096e3495c04e6711980f380afe1358e53b45cca192db861d171d2cbebc1547f60f5760fde015c3e6c5b56a9e178be043edc836944482fd78391197905010619a0878a0e0bbd5b0e8d8add01dde87d2c7ac88abea474097025414adf8c2c17a1b3d994bf662a279acc4a86deff8869f7213831ddeaa5ae0af641ac7165722e2a84b8d3838128b8b9cd4fc60fc0ce3416e8f7b7103520e20ca64a87bc0a22da60c2efcf8e0b833c93d6f05d2f5df5085effde29814c045a7bdffa95397823e86e397e7a80ff5d2c7758c1be1d98b37b30865ac5df5eb18ae79154f2e78803bcecc1108056f62ed872708c5d6d03d4b6f61e4ce576d4a6bbbcd44da25046fd88fa81f9c51cf2b2213972d2572c4b0321b66793dc030e582bb7d5f6603cb7c4fac6df4ca84d78279970d2f235ff6b35a80f00558b103d18eb1d95ee128755fd5f6bafa295514e558cd2bd2e46f077532e8c86fd37b8083d18f163e8f55da6691ab64526a567f41e0ce443a61c57098b417f0fc69f79c9bc8a2fa0d0b81802f477b0e483e9de70f3f94fe7489e7a7178e10f214f6c633538cf2688415b4ee2f967844aecf1a24acfdb1fa731b600073bdf349af57ee9a6b34579ed98ae74e9d976964c2ab4f8ffc162e6d9f6e44c1d42ad29689a39b84f229c80ac1cc6d20dc74d7e07655f800f15ef6a36622e871bc4ab61845c4b57250b26bb22c16b309d3d1839fe81e79b4de3154e238b19724d09ae91da83997c98e4baed36e80434b74e5636e9ed6ae91cd9667241a639780faffaa2b9e261e850b62478787fde31d31edf44d9020a8b665ef444b5a399109ce8dbf062ba3b78c4cc7b8c992edd1ebb85394455881204f89de1bbf743d17d7e608ab66a8d5cc1bc618a72a06e1a3e0ee1b1b768b3fc778868d2a55ecf371d255845344f11f1b096e46228eb229af8562a0993c9fd128f9a88e6ad413c527460670dfc315f4434512e6a8f54983ae9eedad75944d328d984391b36ecb225fb59279a8f25a2d9c7f8523c61472b0eb567d18f917fa3424b2590c6ec0a7d41eca1596c18a28dadd0c6d9d3bd739c1bcba26d5469d67f96094161529299dee8cf2a5860059494be39b889d5d26223c3da3e6c6ee7d9128094c858a5bc491f99544d722b530a31d49c58ec8a0783c63200c24bdcaa048f53fb8c284c33de1ab745d934da98ae3e579baa8972dfdc19696fcdf643e630d811847117df1ec63d69d1a05b86161e57ac68746326671b7d9042b60121fd3c07c7ce0a69882f8cacfce2d03edc44316e5553b437f2e0eb6875420c6bf3ccc334ab88616bd33b11e4844cb8d8a9db8043d23e1aa2179c87bf4e80089e7c49ad547847988e47242ebe22bf7b23e0aec2474b2614033b85c078637dbc18ff7623555c9e7af0f6595b12f14a3bd5434b1d7c78492af04dbcc589b312a6a7009ca99a58eb83fff4c8f6a03fa9280aa33acc518712d91e76c3ff85257670382f47c7641e0e031d4523eadb43d0297338b365e6fc1e9cfe8b9a0429f08170db3f9513b0406027040d80e43c7d68cb4183a92c935a7e612efb56842a5c048ab3850f806596cdeaf709dbca7ffa51f9c8141f94ac5ca98a082c3e586afc6ecd07f25e823af247e2e559fb1bb935501fce086517b1b74f22b90f8557f761ddbc2180138539182dd2c4a8f70187c5560f3ccf8e519cf704ef43d5291753733030c40fc7b76bb6f4c350a07e489ea66a3c1a8fd279c040fcc1dc83fc6176b00f66ff50f4944bc2111c82ff006f4c9a3780feca47ff503371d15b37f7dc50e89ad691d2746a85132b2204ff375e87df87c6f67a7f466554ecdc83f2a1b42110422acc73596c45a31633188e0bb092fff0d1d9e45ec54c89c8a2934e852ad0d221154fe8d4a60cb0a099025ef40dfae95d0fff0ccd3eb728f5561cab0a5b69b59c98fbf946a537403ea6188f5ae1bf5dd4f935a3e29fd86c9af5aea32edaccfa95b2f2574d621b5521b140abac0452779cf7a23053399e197e43affe7248c969817bbdc156eee78ffe5f371968789a17a43ef56c6274da6221486e4df694bba58e67efe6d9d4fdebeee5a89f9d59afe91f6a5d71cc7774efea24f987c648c8b897ef2fbfd5f4fb2bf288d8826d9e146d09e6403ab606c0e88749a5a8fdfda2b663979682264d91667aaf5f4dba15c4b4faebae806c0953846c195cd0d37ea0c9188ab22a6400a46081a97f3def38bab5e31570993c0d1d298a1f4373bab2bb23545a2f3f7359009693a3169e6f4c7c1277b7e4e7ce987bc636712d23fe61acc81044512661902a518914c277545f416d6895795334ce7650ce836cfd7da3ad5650a56426f9a957c07b3d43eeb4d28198719d64a017e0a272216f11d5410fc04584bd7f8aa1417017da667a7b37cc9fda0f8e17087db6a5a8cc18a1180ff5118a0f52a556684108bff0b8514f72c420cfc2d0c0e2e3eacaaf0cf775c846e75f2f2d70de41af5580ffb498b146e72467e071bce394b4898a560b946e6b7b0bbf622a0d320d8946b7365c6af2af5920a974ad989994372afb7895aaccab5f5157d4384a4add2c281b7b0741e92ca9b059e06a7decd418189c0a55f191355751107b97511a983134d1561331a980df2091e866b0e3526c42e4759a9e2c6092d62a4a06372eb85950064540c723882acbaff025f3557b623f0eab55d4732c8f36eccb64e516f47c1f391dd0607e266abcb8ebc2e8c6d35229fd61526bb884b8d0d31a1ff89db89c5c37d287b4122ef4c7e5fa46bd1a91b01e928e9edc4e189b0ad5d02a8872519274b420795b21164588289897cad63f5a53ef6b6426109edf7ff436dbfa550dec4b5012519dc8e05d228075692a3c6a8f4e2230be05ce693192349b9fbac24c22f467ee45e127649f78d77aa91f78250e68c825f8383c7a3ea421f83bbb78a0dfb9f5e34af4eaa96c3ddbedf5fca9646c178dc9f7edd1514a7b38a7d53dd72d9d82c1c720f80411b35f1cc64ee1191a1be7123106acd3b76b749151c90b8f5ffe6f8e8ae226d3a54d12446514b819b569f09584aa343dc8ab6d0d6ecbbdd51a94e1c952a9b9384ca0368b798303ae472c89aa0fc00bd94c342404090ccfd3cee9e6f4d0986a0d7250e557fe75cfdbc95d7f18295a3f55bde50c1a9adcf32848124c6eb941f1bf650cec0f2afdc49c3528257e33d3e76c339081440ec2d820450e0d9f514a98b288eee868a001ee0913aaeaf6b2066956820cede8999db6febcb07dde34583f2fb979477b2517988b87540b8adf0777f41df1cf56d43012439b930878264f1044cd494c615ad8639eec866313eaf6b56bb3cd7991674e1f06d340ddd2c1ebc18124f9d1f23d6b060731aa7e70f393fbe2a82a8df0bf8f661b6d411e3250d1012bc568298bcdc267b7f7b853896307cc2383ae68634788ae7d34e80e2a887b264e059ad9a0cdb68b36db9acb5936eb0c818d3528a9aa9208650165a06ab3c40a408a3806e9a3994a3a15c01e7db405d8c3a14d2cb36136bab054efb655d12f9dc287b797be7561ee0a555d945d10779364cfb9a80894b8b50bda60cebe9a8d6247baf904b07a924351458a33882131259fdfe7c79b9b4766dd2f0692ff3efcf67899def358de641b7118d67a34db3fb3bc714c30f85bdcb7527182914d571cade2ac35fb111866034bbc142ed29acdf66bead100e5ed09d4a37dae810fddb3a2f14357d01daff1268fce740c177e60a62a952c473fa2b0a4f0b64f1294b50ad62638679dc7b3b827a1d69e1279195118123c0c587f95e7d8979d7d23f0475006bf913587e89549f0550f631859b5bc7feca270b69278aca929f492d10efb32c7b945d646dc88b32f9ce90954e385007bff6bc369e1538a87f95841972a8ad6b6b42d1069140c276e07948b81b0b8834becb3cb722fd93a72c54be43fdcffd45248d0892c1597e06129010703ff6128a81c238506aa3beb2f1ca92d91bc879a03216a4135d18f755d536aed7f64a36542aa4c034d2fc0a9412dfa9b028fd247e3f0da04edb97cf62e2147334d093040f25756c3cde0c769d2149bcd8c60158120f303e9db4389775d9cb3ecfb40d52ec41108058fd2067c4f1610934360ea26d6aee843de7b6b3ec787dcd34a21183ec5dfe46a5ec9f9b24d6e5bedb21e7a1a4dc795432ad93609d22fd6a6021130a1eae3615ad09da63920d8dfa20c826907ca4cd9fa6a0d752a1e1db3fd187d19e0d99192c24db00866b9a5f6da7d89fbbc3eeebfc1a5e1b3339bbeecdf828c8b17e13abc685364ede5f76de5cf406b78e455ba22ec2423c4cbba0e880b9ac91718e17ecf19183d290e1abb33277bdc4ee953a5751ead280f42099d1a7b46e601b1bb2974f49a0b05e4f647d72383bcba5c6653d861623639ae131a6ae75399232c760399c90a9ca22a1dd7319b46fe1595996747626e48fb9ce633f553112f29007b88b564143f7f540dcd963aeeea4a213f8fa74b46553e04fbe8c601820ea98009a61c1502c28a7225bc18b071fd3723e88249256204817b84e7b75761b060ba8ac45e38fd129672e0e73f106b273641e2523636ada0ee725058f0b19db893a47180c30a62ccb00c1b4fe6682b14094a87ffa5bce7a0955050e88aa363d53b0f254e546065af5515c1e6f8e5c8135da5cb725a2fedba0df61b7da2086a2bc819a0e0cde4dfa872a51121132e8b52e361adf4968abc0bc2dfd84540b98c2b2b19122511b0f8b83f4dda2a3176645ff812202e447b44d315ac15010241edd55ede554853044d3db68cbb2d2cd5156764a6fad41478765dbe784d2f60326f5ecdf5cb4cfa4ad0f30bcc637496da8b617d654169a20b5fb5bbcc921f2ee9fe6161f1e5a9f0898f267a0476b3cc03d8a4e29b269921d42408140a17a63e381633d052c620b08424dddde49b833c6e0037510425cbc89ff8c56f70268626983123a88104539231f56d90ccc8aa1c47784c8cd2a88861d36336db8b1750bab339a40df101cd3333885f8103c2d9afe4750563641a2ebfcc412200504667ff3fd1322dcc47e65622285ac2dafdc7a8f8364336dfb2f6fb4f430bcbd24f9948c9ec60947127f630002a0493457c282b42731a6451f82fbbfe92ea8c5072fbfef2ec31545d26721054ee112e70a34c7a78305479441c00f88bc0160a33536cbe7e7608af4559108910aad8c345cd31cf6c4f3f112d29f6beb89229c0a76647173e18aab27be17bf3bb68e4bd5665f64e6341f16646f2d068ab339a860a09e7a57a5d81113d5915234ede0c16b2775305bce43aaf623f59baa842416e0e9ffc4a4ee00159b05999b0ce907b04527948e209e13df2f0a0d461a2fd500ec66ae29021550131b1f67753d91d9ad5876a355ece8b9e50ad4e66d82a0fdd71ed162a507b45631feda1eea1431f24fbc7f46ebd7ef479451557497e49ccc0fb9655b3d1442fea797a21a2c51c7e010b0fca1af992d59c7b6234590d51c8171804785d9afef5c6adcd6323cb24b9a6180ef656b8057129a0ca79b061011793b10df542b58ad5b70f77b7d331d6e2f5374479f066d7c6269b9dfea2bc17f26fdcf163a467af7f8cf8243f562e0c5dcddfd837e549b511e22e215db76c803e3bfe6d8092b7a9ac2651f8d8132d864709868410864fb8927acceb556e367537328ce2c1ad28204fb9fa3eefc7d218f3094ba153f5963e442d9c3c02fad6d7d7ef254ca7f703378a9cea68cb3ef72a04da9c79210fa652be64e325db389aa4ad6847bb11cfca22182f9ab08053b8369419f3ad372221c9bed2a61386d15d5016a5e6450c7debed992660a178012dc35b83fc861937bd7ef7c5df94fe0ca4711bf9b3ecbf5dd774edbb4e349926ab1736d5c3922d154d17e71cfe90a4215fb92a1988e3dad0ae4d2ede2061d09657d34b6e585acd673db59afb1901c6146a12dc18612d5e3951740b8e7c916d35b1cbac46bc7d8dbcefc0fbe48a86747c2aa6a139a70137445ae0dbcb96a0e91807e6d408dc50b0a66c270b836668b6184ee2517452f611111fafa219b51f3f45b3caefff2ce3ca4ef315a7e805ef6d0e8a8b116d44ee63417889f72e166687fafa85b9b4c7effc2fcca45696d2954cb9b8ffc0c3d80fd542c4c47fd7cedbe981f9d436c587cb2bf55b6c1766514549413690def1467b62f3c2c9836b31d18579d022582bd9f9dffc913ee1cb84cd686603f0e88d1629f30f785b985f2185ae34537d17c7149a31ad7a7d19530b73f8569acb2558002a606591ed868c0a0fc644352928425f63b2c3573d38396d776e4a16f3378f73054f49c58f1d8c315304435ad369038a66c039908ea961966ff0e0c4c90b70a83753287f96929ae5a5f432c229fac70790c3713884bffa2548237d406454035b81cf444dc7d0b106105511c7783dffb0618477767e03cb9c580503b640129b35ccc0fca34af96665e47a86dec2d8f789649ab1edadda8377a00a8ae57968970756a10633cd448b7b8540d13ec0523e24ce31d36ceb1aa8421020123e701977f0fe44fbcaf07fa3f4e6adcb091881bf57a7a4445b1a8c5c00d1878d2447601c8cb1bed696397c9e2d7114a0e648b46632a0aa12895a206ce033493a48c64c4c601b950a5278d16ce6190642a481af4232f8fa1019b32f5be50d3143048037ad52f35fe497ddbfe780284b1c232a1b2750d9d21833b8a297c12c4ae3e126d1785d625346f238f9f1d64ff25f598c31272a4c2ea13f2df110f72379be4d69665e6113f866ed65c793618ddd4d125750447ce3193873bcf10055bff783fb402e46c172bf325cf869c1dff935f1b26919f3e0181f7bc08cfec395c63c13676e6b486f39fb4c9291d3029d20090d0962363ce8ab11ab5cbb6133b3b71dc199b18a60df1da761b3e6e4652707ebc32b6defe9f0bd3a39ac5e550329b2b079fbb67a88409e9dd24d901b32b34eaee1cad6451f5d5fd5f7f97c6190d207a1cad3c2e665420c4696bdbe5a9a8d2d24f555b1bdeaa7d3abce0e05e9ce0a51f9b34f1025a37e8e90c96830a9e872fc5c6c75232ec77f25d77fb59010953d8328bd2f184f3346c819b04fa709dd772c2fe40113f89241b5b2e2f2a823a02297edc2aa435368c4ea2a2ee3abc25517ef2af3a43a7b565b4e17dc24c458ad92ad68da5c3571995638d4cdbd0915c79929b3dee7b70bac1d6998324fe9fc363e925411328cb1fd08444aeba70aaca2fc6a5ccacc8503a42bc32206a4737e4a02ec64b52972c11e897308da3bdba13dee2104a7aa6c8afd6feda3aa4999c15e2833d13a479ae23aeeadaf0a75812d1aa9958d266cdd9e3560a1088aad15927610ad70cb0a7b000433a1073f07437531b0c5d9bbb7e8f2d287e51518fb2adc61a25f564c13547c5b6feaefbd8e659fdd90a7455c6644eb2c0fe0b8d205f000208798921d4c183a4c86a55b3e850ae88bcd7f43741a2730b1d12bd72527ed1bdf777905c56d37a62ca1e941d113db051434f5348bda32ed228a23f2c1f40fad7892598f71a4f8e0a588952175748daf445347bdf1caba46b2eefd7669193c82cd2782a32741928536f38f495e7659a46f47a619492a2222efba2ec0506b6016db79f0561a98e16d93269e756624787c8dd3b420b1dbcfc8af0d6382b81646ff96b49cf258b35af08524ef39333feaccfdc5a1e327856c7a17d6a0aa4051cbcdd6d49e627555cb2e730df7a5721658090d05db4d334b20c7e1bfc4b7e8f0bd5122d472b689d90cabc34e12282c270308a99c348e185eb551a228c821cb802c921a368aed8c547733d06b9ef72d7facf7129526a023bbc0ee53288d2bcd29e032d4a6828299356a02aa9c15700d27925ec940e35886fcada250de709979f440e848c6e27707dd5b87b038c566556fe12c492d8ee1faf674faca6b91cceea4374613fa8bf78a17918a0584874031fb5a33888a8f6fe1b06fe4217cb4bf912ab37c0f9820013231baadd57d12dcc054a1b476f743261817c30b9c3161cf7c14db14e7dd1adf312614987ab95d6a8a03da2083905f0ed67e169c38c562f2b6b5c4e9b562e82b2957b62f3439aa0f3b45e522a33889b37e9ec07e52d9a3b5c081c5fd34bf28bff51d4881826676c931c6cfbb7c304d780ad422d599512c7f16cadfe67b08cc431fc503392ac26d30477fea26cd96b59b4354e4096356e81375be28a038d7f588277e99184162a0c1907a75b7f55eedb16c9b9c9542b38150614c9116185faa418d1552e5fae0a2806caa6546208c3394bbb53aa2cbeccc0c2218a3c838259f0effad7073fb0621b800964fbc430c39122cc4e6a776c6a47087d6e2bc533f25ad31d7ec5bf5a83480f01c756cb13e0b87c00233edd5ff971ed48e4d4b781343ab262fb063a382c4817a4a2fcb2258794c502209a4a73c644dcb6de9c32ffac251c3335a0cddd23cc5d892a6fff605450df2406c979e912a419da0c4adacec213d770f45e2c3722cc7b00cf7c789c00a313429786cf53ec6ac71ac90c6298c939a5c7e78285de319cb89183ad964df56ca6c16c59333674bb19ca616024b1d441ff72650525f41893e5dbc63c2bb14d510f3eac6e0bbfa4e83ef92e26fa7849b8ea883e8d8f87ee03a68e986f2ccc0413cfed4a4418ed689c139a5aee384becea33951abdf8a84b7e3802df978d0686d680ffdaf00ed162ae5b41003a258b8ef626347a78c44b12bae99bb4e93641caa98aa7251937f800fd289474f740d2417fc150fc2b1a68d5f8d4fed8bb152cd0ac62f81546409e59bbf8ffcd918127437a0be5e2f7bf5ebd3a2f79603ada0dacb89899fb3befd8835afa5afb0b2075ba3f0ba1824a17b10888f914e9fed8dcceb188640445664b1f290e9da56e2fe410206d802eacdabf176639c48662e59cc7178fbacbf3f16d20719771354b4953934619c478d1f67edeffba4d5673dd64f4eb554f5801e361663dff8d70292b95962325b23c24001a0bb8abffc6d18b21f977e1decd3b3f6337a1fc68c3055798a58338025c2240b4275c95e6a05174741e315c746c140375ee4b49ec2470474e5ce0d44751db34ed94a5c0743a260ac390a101a31e5eabf718982294b20a7f1e09b6810331100dd297f71ba168c200a662fa3759f1ee3be2826bfa609600d4b5e3cc9ff5557418b6ff3db8b6252ef1e4b98ce66517b21c887a3df189431e4b980e3e5dc453a70fdac60a05976d6ccebd48304a0d0a082eb22f73aeadb233caf60e45ade70ed0aa69b6813c2f807b99e09c1884a3bece796c1d4eefe21775ff4b2c6fa9e93d2b99a2b07319f6676ffa18f0271ca24cae2d93332583c0807ba4745148cc4ae757b7205e36870ccb1b84756b3e003c70732c20af611de500d677fe049f42b98d4dd28229b941287b80014368754acb9b5c64daea02254206f86fd2167cab72ba487caf8e29d98933e037aa6bdc41d635aa7837ee1b1baf372434dc88c1e75864df51404922d852b825280fedf9db09215d1dbb5350d605251d2266e2cef53753c985ab6842ef064775d4cbfca60b46c59bf749e5d8606d7abf264a40ac4e86fa74e184c895694fb470883c1d5dcefcea60818e6d55730c29a991b6ae12f0dd718c4840a19254032a2a269b5d523970f733bb384ee474b066947cde960dc2aa4aed9ff6c226d04609c8ebe81ed821201c1d88a46526842580ae5b6c5768d016516e2d5566d7ad62a52d6fce76c127622830340b14839eafe0289b8a3a4df457e39b45c25aecbfcdf34991a62389a445d9699610ae9a91e2dc28764c2fc2f4657046847209a868e70185077ca88a8d52139950a126e652abbdb310c05cc407c14cb4d607209b67792760fb67f81578815d13bdf567c4d7edff1d8e6dd2fcc78c0c1fe3920f4216599a311f6b34e67ad44c62601bb7fcf876e2bf68926c2f0d26c14946f4f2dc3e2f1339451cd6162626dee43535c88edb46a21f9b0925401ed40c1b662fa9e5579effddf220cee1817e1b672aecff467b5c2538f1a602fcf1f3bdbf6acb4b09f6fb825db06e3d37bb33d229fa13db57a307591aee3ed70e65c55bcb6c188c04182c1019f648d5d5186c5c1bfde91462f1bb0ccd801bf01499c43f2df353f385cae1297a328130c97f7960de62b14e367de8a775d58400f755dbf5a06b844917adc5361b9dd861354f0e94db92f3ccf1922fd591cb8cd768d1cb4adf4a0d0a11d856324f8078033eea20ab47fd68c21e26f6839db2d5aa1f62cfa31b2bc176ee71e44354cdfa53120991f013c7712aeb37a438d0039ff86fbdd9046b60d371ce620dba211eeceee2eea5b15aa28041adbb64f184f01c2a603347fb8b15af0629b690ffe2fa8ed661a4379668a5e13de10b746e7385da0f072d876f651b595ec149b9b25a84d6ba220a30d1ed00ebc8c113e6c6e7e80df22ab2a42e8f0d9f3fe17331d06b9665f8c259e54818149cbc7b78783bb39c6a0e128a9de5449066f209bbf1d8df21589f9d133783c7849f4475b7495b3dc402d2eaa1ba1f7a5afa856ba930d457c6055bd3a79040c1fe7c42258525779f7bddd8ea8066f34632a5076aeced4ba3848807bbfab79ab67d318e9ebcaf39521257537bca98ba53178d824483eb052517572b2acd4092387f910a9a7a142151fc0ede3a42a19dfeb271196328013832710d6767a5ce062806fafa6d0a1133dcedeca1921ee7880d60c7855e6aed645c67a3977e0a43e58de1b7ca5651b577781bf65476036534176830df99844571ce3e976309c6affddabc9901c2aaaebeb1e04c6f89b3e03b5345dbbe2175be341993ee0ae42bb049f04379c03d49fcb2cd8ce04ba834ee17775e4086deb34c1028671831fa6351212a5ede3e61808b8e1f60548a0b9f82903ec7c1045abc9ef5af98d1fd3d03c4f5255beaf68eb3cd4471d1af01acc38d313ef33764463d3a620df9f622924ae1df1c517f23fca4292963e5733d92023f8ed1f15586f7c5b937ad01188d414f3bbc429666adba1f385a28d1f6d18736b93ef6a81a5b8be2b079ba71a6ff4f0b634f84042fd5e0f784baf4e35459d72b9a713d95eb7151435883b6a49f9838ee5910fdb69e38c578165adbbdcdee214fd08462210f232b1743c494ec42da2e52ce69f5f1daea1be4ee15065388f490876f81f3da548a3284ed9aa9ef18db98062a6d357971eb3306d2f3adafa276b732c8349a8917ca7ac5f03a51ae4a1ec344c6f9ef80ba19bd6487ea3fffbe8d8972219c303ab0c6c52ea0c26e0ae0ec9c7ddc03f08b62dd4bc70d7eef76aca6e95504ae1104da618d99f0eceec85f6f471dc8697ddb9e37f45359e71c99a2dd658a5954cfbe2260987580eb295756834a714847f9b817d0d4dc8100b9c0319afc1759561d917a244ea418fe8f973ec1f14d3aae3a0531a856e4b588097f1ad8778321c9152ef51afa7016f7d6d8a3dd34e50f46a567256f8fb2fc8af82bbcb146941c2cfbcef6a6500e9c0ff8e4e525d0f83ca520d62d1007bbd4c931d5aa0550f170095f55d1454a7ca2b557dcb46a4e3cd68898254abe428cf2f5959c452aef9c28e013c7e93543341a47e306ff347d5e4e82e62d9034db9f5d8f8055e9f0428154c0410488e444dbd49eafbc20c3f5ee4e67cc61bf52672e31c5215da706d53d981e88e159758c2d5447fa7fa2ed0d43f10e6e9a58a28280ace0ee0b1ff99fe7e3493f6816abd025803a0dbbd485ddadaed7f5509bb144788ccf1984d3597cb50d67f3cc65fcb8db007a92e0a9f71cf49aa4b716d147595f4f76c442cad0c43a0244a1b0a923eab9a382ea9e326c38e991332ca816874aee99bcab6debe22b1b68c484aa672e1c295ba004f6e795caeadf8132ffa0eb1c280f7b2cba3a0678013e3f9e28fba8c6b235e05b11579ac39c47a8bfabb831be30b7fd5eacba12e7ea5e01b6fec185fc5502c2eea3a063629e8a42e3b8ef0aeb7e12e74814df198f4133d3ddf9d201193d64835407cc4da89c2a6912cd72b006c2967feba56cad3d00d31a233401fdc51ab641d1ea1da36f7196ea8b9ae787d5839f75192529d8299dee3a008e99df25e70df816072991c1a475969bc9105991e45d8f6f97bbc4042851ca90dc5aeaa4dd01bf4ef9f36c6b8b97c55b20ef2957d919d27651bbe971bae7201c10eaa4abebbdb749530731bfd75c8c36e717eed6ab99275ef49fcb24c58deb3c848f5a62b4539abcb4cf79e00baba8c3436afa2e32ec44f9269df7d5e396ad55a54e9eeafc0d5603f49d9de4023de54f48cca8689b81e83a7df07c626dc5e7b324c51b38b2a62440731cb662d44d60f1b9624a06311255633c4a2882041e76de335be8da915c617d9e9525e5d46afdc996f8084c5015419820df81f34a76ed95bca358d0b8949fd3d3384aee96f7d23ef9063e8c670bb9fcb76bb9aea377befd86de0ccd011470f975d8569749bde88bf61a01c1a1576d5b0ed6cbb3196e3d08fb31bf52dc8bfa4c390cec330f2f6da58941e6448005e04310e37596d7db218c64f596d2a7ee8d9bbd949cdd3055f1354c291fd40edd460f3b136f72edf2febe9e1ba43d817641d53c044c97d638abcb57d526db271987dfa5ab54cf9cb0d0abbeea81880bfd75f532f77508423f7cd0f058ae79a29a77f5d1e6de8eb16622b81e158067732e0063af5e595525e4076a6fd9b423a8f42e7cc0aef5ee5be0e8fcbb43e13635da19047209e8ab175363bd25d52e7ec04e1dd8e357863713f4aa8d1742eac9ffe63d22b59acc702d6848f1350075eec68fe3e12372b8b50bb2c5a63082e6c6065f31db533d554cd9061440282c7823113b0d3ee4610e08bf8954edfacf914bbb5db851822402f84a1f6b9f7754ab68857d26895103bdc31f4704f6274ad90a57c552a97c1b731ca22e51df44037617c1bd4b9d2b3f6317c1d7e71776bd304161228f7ddf47098e1123bf3d7d5ed69db9c0c8b64bed08257d08bab9ef148b8047414ddee862d5bde44359370a021146ff72e3d609ce2638187efb2237a29cef0d41df47a3f59ba02187c73ca6186d9631d96f3f0cf8e8804dc5d3672f6bd27f0686c97cf713b6975c193cc77a4ad25a4a3e9d3291936c87ddac4dce3b1ee2390ef599f0d65a4de9036c01e57c4c89b3b046910c4f7d3b573c45606dc2fcb108dea6ba140e7da3de768fe04f8d7f5555ed2e91b103fa2285cb388220a59caaa3d279a418fadfe37355ba8fae4476904e179c7a0e3f9f6733ec849819efe1b47d6fb5bc22256ae44b64b84906c215681da801f04fa8a7f25c86959111f0b404c099bc5989371b5caa9f1bd84ccac2df563b50d2622cf6378ad23050a46dba31dfc37705b1af830cc06e4e1c35b0689c2330b11cdb4a7f314671e127b4eeb213084c4cf2d080207284face814bcb3342b4c7f737c783d99b4d1de0dae423fbbb902a83aa228a6044fe1eda70f8cbd729dde55bd0c27f63111305e58d06336efba00c73f9acc6501fd8170a5ebc28da836b8b7900f46976b1006e85e179615195ac9e76ebc680773973bf8d7ab838cdb2903b4a2fc6747eaac188c9f4643357d13ef3af587843e87696f653093fbd75be7074d44484456fc34dd0424298887df3904e69716123fe0a1b6754c44c5cf898805f075c158ae4d9d9f304e347b59f18b46f02ba6a9badaed753950a1423f46e3fbe88cf53f1989c90f8a3047d04c6611fc1606109e6e2a7c030dbfe9f958faa5d6422f32c14f84d069c6bfb24ca00083210484281f30e118d8796f689dfff28b6b1aa4702dc997fd450a720b4285a97def7ac547d25f95b6cf955e73eedfc0bb00d4de9204f9f75c99b7aa19a014728f18bc27cc313721b7891f86aecac0c57666451f503f7a1f0710ea9d97d4a63f8e2f54c9013081f38dcca45bffaee323c05e110f8cb75de270f885667e8ae4ff596ef1bd0d38d1552e056f860b0514f44e598fb49dd77d29e018d5a433c852b646614e9982535018f20f15b78bff9197999921200085ea71932168b70c1d3f105295f8ac634bd941870838143fd1a5f701dd1aa8d9b3db9dbf9b3660790f5b49c0365fcd197eb302dc6ef96df4ea074109303bb743dfa3a04a675c89e885c3fc2bc3cbe1f00864cf81819522c8d4ac39c0253a2eba54dab4ce19a79becde33dc3b384858775b2806b5427677487a7122b8bbe526cedfb8623b649aedbb5f1894c28ff7e3b5f7199b7d5a896feff03415c490bd72fee5ae8b18381e17805a3abc9653b48e8bc42424a11eb2a938c91de413e43d78fa44b8be5584512290179766afb46352c2ca218207d9ea37411872a7d1da5d2e38ce73c1ce5490bced281a4b75f83f452057aab1f6e83fe4b7ea9f9012b36f2131d7398666dbab0459ffb3414dfd1cd5f1455d8a1d7871556bc14ec40618b007321d280e2daeebf4b84be02137b5e302c215d9241819e8ab309ee1acc3ec157469f69d2d1920516293f165999da603fe30711aaf70a2fa4ee4d0364f036083b919217bd62d8649df902d5041de840e7d6d21b9b79317edb2684c2b120628b828216b50bad15e8dd8f0baf9bc829dd0a6c546bd1b084e1f44ffa26704b7778abed2bca142aaa00f22eb80f5a6d9fad90102dcd404ce78c4a10e56106867351d08bc262d891d27eea00374c107b35729701616018c0f551c18bcb13bd77202895b4ab22de5f65fba91b4bbc96d146ae990892179a7f38e49991c90a9dcfed6cc0969a82e122b36cc985f385c8775139202880f740d770eb51257a21f1227cdf59f898a32f23f8717cbf06f20d22bb1559a316d1212ce1fc24872751ab136a90aa81eec74271376f7748a2d89b2818c8e77c3f3368f1ac584182e443a415aa3b7ccb3da28920e5d8c14ded3e8cd13d779939874314fb2b5172985a48bf931d4dd30dd291cba7bd61d8c0efa99284f773044747be1e72996a07803f31c3de372743c7ea69ef1db68481bcba2ee06407730ef5d7baf90ee26ea0ee645b707525ce9cd4def758ae204fd695e2798278969e8f749cf75d23b99fcab755ce9ccd50a2589e2140a3fb460fd1afc0b899ecc25e53e870f53cffd52ee977c7acdfafd8ab313f7d5a7e3cf5669587f56ede7f5ef7c11749cdfe699c8bd1b78e763cfdd5929cd6d95e21253afcf446d3efdfe2dff0de761a535af13f4c7799eb7ec167bf8f95aec99fc254c1d7c262cd226a6a1d7ace307695889dcc338bed2f17efed06df6f071e94f7351a4b8c77fcbfec295da9ee67f5b929bbefadf32cefd92971f7bf8e5974e6c75de40c7f3e661a5b7a7dd6cf4717eade3a799e6fa2175908eb65af0dd56694ebc1fd692fa9737c93d21f730d3ff2dc96bd6dea34a14125dab24fc3c29683196d9a2dce7107e9e2015c97208e73e075b946b694150668b5c6674fbccf67677e374b7abbb7174370ddd3d80ee5aa8742d53ccd0dd32b0bafba6bb6174b70372340f1f7f365aab56e8737f5c4ef069ee7fcb5eb39eef241d533f9acd66b814cbb1045b62747700ba5b6dd1ddb2ee5627e8ee97ee564df4f779b514df67f2b7cd6b33be25e898c9bfcf61d5c83d9ccf25f84def39f2cd46c71c7e03e90de772ecf8ef14c10fdd1f0085149230c28a9967389be5c76f9b18ff380befc491e52cac8f67362cf187f3dac872167e0ff4da5b2ee72c83b37e77e3d09d2a42c583eef09db88f9967e8b9fefd5ba56e73a51e7e065fa952c7b98913a7ff9d8ec7792709d632a4e264f2d1a16387e21c1e3fe31c86553a6fe0bc93ccc13978961f3f1315e78cfc5f12c539bb5fc375defc4cf7f1df5ace1ebcb6168bcdf28be224f3b5245962582cf623cdb5bc2a01f8b5b56ba3a3dbea0940c20afc609de2a4e1ebd1a8582dc5f871ce8ff3d6727aece0a9eda081393b3c53c74707b823d4a163c78fcefbc03ecf9b31adc43938977609fc1b9893a92dc7daee0473ee87222d69393fda5b4e77e7e82ec5e3b10f2de82fd2e60d9c7f6be9e1dfcff53d26ce7a3f579a1fe3dc2fcdde764bf2050733ba433d75a62289fdcbf3a3d11dead5dd31ba43a1a05b9c4c76fcdbdd2fba5b6828a10e15d4dd35ba43e1eea6e90e35eb06d2f461a5f771a5f87aa11d73c067c2714c5d5e5ff41ffe340fc5d2deb0e374b777a7c2eeb6d11d4ad5f87a79ac5d7bef7b9d1e7ebd65feebd5d23c73fdf14572a49ee9bcd96d95e63cc76b6b3e532edd7da3bb76eaee5677ad4477e3ac58bbcf643d972938c909e2eb81cf34c3cd9b035e9c035a519c39b93b2f8d8addedd2dda84e75778b6ad5dd291ba408210529b801a6c6942670567083274748784152ad073bb2981185b86c9af04345068ee565a1082d8ac4052801f37383a3811d2a32606080a722f1d00c36283925a0032c20bcc44009999e12258aac552f5304c14677a3013788586af115102a540e32bd6ab9515ab5b0a41cc000a894a7564154aad54a95029976140ab584f295ab6c5030abd54a48ca61fc85b57a8159a95e5e605030ac9b25d56ab55aa954abd4132594c338ea0953ca5bb2ca5bdce546e9498baae509ab85e5a9173800217b71d552cb52cbcdd28ba7dcc5a5c583a894528e5a7a59ad54364a289051a55c95b2919169186f94cdcd2b77b9614ab98bb7ac6c9cd890a19c3c91c178cac6890d99cb0d4b2583b9515a39eac6c913d9cb4d4bab644bed0d43960282854ac920e594725a49710a82a5f24979502a081b294e4e38b141b614c4eac6092736c884f41499ea07146a89cc8d07b06e38f90f999e41c963dc864ce53363937219142a6806ca0f297fb9899272948c8cb3582ef302b37298d4ca46caca651c650385e5a8146bc68188c2b209c2862095c3d848714205a93c081b6a8eac7cc6935432313633330e13e34ea8201829322c29323ee3281b28308e62dd40712209c6510e25c653329d4d8d8bdb205b52f912b994bfccd874508c8d941877f220187fb19132e34178108ca3666ea2a81ce5a81b29507e5039cc4d1495c338cc8d14270f9a71d50b1d666ca0fca0f2989b282a7f714495a4f2148c8d132a08c659364e281b8260dc09151483b29139b2f219d7412585b50488a018473914188712e3280fa20a82b109c2092736c85c1c15744388ce497741e672b3b4442ee54be456be7255cd9195a73c697594f297a3957b2ae58202991b0e60a97c9e3cf921e52aff01e52b7fe2c413294e1ed49204e32dfe03cb63bc6f9e04e1412d374f7e70f1981b270f5239cccd0fac9b167fb9f9c105e52d372a6fffc1055553373ed029ddf024949031012353398aa66565b34241a7f21b513a77777f220505182a997ee997d5cbea15e515c4cb693544cad5ab2150455ca043352a0a6ae5c444dbdc8840b76a992a65b31a82f58402623081294e2f39a2c83a8552358c8bcb0d0e1760badb454877e182451423ba94a35a55456945c48ae5a242e583f27625171559dfdc8840d782aaa2c64a8d153557d45c5103842e4a87a57bca0f0b46a7091d4af6f2e23b52aedea251322c585c6e941a0b16abeb6cd870d7d9d15bc852a828b2d50d96dec28a2e95ba61617942874596da4286650b2c3733587e80a507c5c2124512356ac8948b7873428792b1582ea2502847a1ba22502825504920d115d125d11245a9b96862b1bace868d9ba8aa92f289f197175413b2d48b164da45a6e48c95a7c4aca95ea9890a58e40e3441325d533338509979b30e54a5de9be942be53ca852539a5051543e303e338555c58635e5ae642d517ea2c852fef3f3f3937a49c14801065cc0c00930646d031854f9e9a4d8e2055160f878cd11ba18bcc6957e54353631a866a6746c0231316466b8cafbc55710681f305c85624d41d5605151e1a854336c62788b8d8b2c2686b7380d1a323168c468e9665151f9a8b0344eca552c2a2bd90c9b6e991837aaa776a5acf44eaa4515d3ed5ad180710459aa08316466c4906a49ddd878a27be13349a8669848f534a17aa1d56abd30a344caa59a618285ea9929a91ed5116a3071572d9f4962e689544faae52a9f5122d59372154d6b060a148a060dd48b1a2b883049f5b478aaa56ad9bc7e8830a959423743d34f5dcabbbda5512997192d37bcc6936e784d8ddfb849dd2401c06ff88d9b27371c00374004c1f01a21d4f80d57fa912939111348f5bc701858547e523d305ce53f7440c5a6e52dd50b962bcd24f1f3e3c5cd0c2997ca6b521e000780d7d8d4f80d5702000f80dff09a00b838006c6ed4d8b09248b954ac221aa65a4df99111a1f2b9e12a18981b36ac1a9b29415efc88a0537549cca091e12a672151c386ab9c55848a86cf38eb02ed8386ab669288f9916133c3c60c4f798d1a33fcc58c1a335c522e352e1ec34c122e2e3349c8a099e1e231b8c430c34665c5c5c56dd470a9e1e2345c5c96a8719a1a9751e3e231b8b8b8b8d2cf8b17425e8811e3c609aa0b316c6a9ae85adca5d5b500214b75caf58275844c85c58aca0aeb653533a3aa918ac108999a2cba94cba45433def9cccd8cc370971b282ffc859a23330ec375987118373abcf017b0aa8b551415170d5329790d123a2e542e53ddf8aaa5a54546e6a6a6892ec653ce62bd78bf60012163b9a0687961a39ab149b52440a66750b2f1d4728b898989f18e89116396627cc65336318e7a3184860311a44addd41ca9e1343ca986d3b879e244ca9fd0f01a2a1b35800882a1e135a448f5b4b4c4f096192f9c565556344f32336c5e1ce54152ab2a3160b8cdaacaaa8ad5538c1b31e53a9242c36bb84c4d159d0d8fc16ddc407122a986db7028346e6a544ec36170181c4a8d9b1ad54dcd11189c862b81e106c669d4701b6ee3a65538a9191a29522e9a29345034aca57b92b19e80e9baae0a0d142924743450a87c6a788b930aa7c55bad1b9aa7174e2a2c5d0c193264b058ac97171aef1729954d0c7fb1014296a289e1303162c0d8f01a36366e5455543832deea6caa28cdc85e8899b94139dda0a2a45c59b09e5c62fc29d575366ca45e38c138bd708271a261b9128c93ec8593520ceb89f5c4c28285250aebe989f5f49245a744f34465089d12cdd393154f7253cad5b2b2c245cbaa4aaa27256b5955595591ea51f9d34a0b590b965bcad522a65c2dfe72934a71a17b71d50bca29e56a414549b95a544f50a8705a9ac64d0d171d2ae543c35535ba99140e8d1a2b3a2518a7971b17168bd57529185f5549f5bcf8138cab822053ea9e56ac276664a81f744a304e43c01401c3c48bb36090807192b5a05e6c686c6aae90394247c36bb4283d49b95a6c584fa8705a5850c85aaaa45c2d4a344f55642d4ed3e23458a4664451b1689e642dfe927225d50d2bd5e262caa783b8b0f1d44a01400b2a97172b2a1c94bf60b162050b965e11411343cd91181c064f8ae106869b24954c8bac268b6e55c48b151122e8504a2b2284bc487122b364326238ca5555d0f0cc92d570d40c9f715511dac70c47ada2dcc4b0a1f1948d8bac860d130be53468ac6868d1d2d2ade2a2715a5cb58a225bc962d8a8b468970c1b26968ce64665a55d2d6ec3468a0a4befb438027e8812644365a5860d134b46e3468545bb5a52321a362a2c1ad6e2335a5cb584ce69a1b15902069761b384132b08068f61a3b2a2c269711b36aaa786b5784d14ba96172fbcf042ca46a96553d34497f296ee85af3a182f58a917426054479899918291814c8d1537a47433326f979a2bbace6b82d02975b295ebec509af9110373d3374a3fbdca5263847e6142e593ba51523da13cc681085aa150fe24c6656e92665cc6656e80086a79a1228b711914a47a5aa6099927562d3a10e22b1b189b9a26ba952ba15e54a897169756bd54f142e52508aa172aaa272aaa1a2b949a0aa5a662b54a1149f51451ad5435553aa59922c8a06e3c29d5d3472997135417a4ccc4b812eb9552b5a86648b9521e2448ca85e2021459cd169d8bab7c6a5a7cc6810892916979b969b991b90122684585cec5553136342aaf294107734344e5e22e2f2e3639a2a45c2e4e5e5e5a5c88a46edc6a4ae02a77c911c505081726b71491544f9154cf8bb35a27e52c5f394c6a060459b264c992254b962c59b264c992254b962c59b264c992254b962c59b264c992254b962c59b264c95283a5064b0d961a2c35586ab0d460a9c15283a5064b0d9629d448e1ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57aea464ba83a46ab2e8da1b488d27994a0a9929323559743546800185cc130c992718324f30649e60c0f0179997979797972799ca5336329ebc06142a1fd5d393152b4a2c2596928ca7158c27194f2a7f92f1b492f1f42453b5dcc87852e1a86e5a49c6934ce5aa1a4f2e15e8dd5958e9427381886c6b920e39331e696e32d3f120051e8820c799f18f34a762ba75ba534578e81a45d3f116290e04c8eb8bb35c7b71168ab6890aac94b8fc20e3d0810071f0622114b0e330207ef3de167eaa071d8cba09904424243b9209f90f6f0a692b032f742b0338ba9581026400886e61c0896e612008ddc240147c66e0700224d5e0091d93b073757ead46439fb96bc71fbf0ca7152d98a379b69506dd3d05cd98f30c1f531bb844062970419025435d2e592ba28c344a879bb05af02fe9a1bde51f3d47435920a5421141c9d731980203519c60c6769ce5397bc193b93ceb81e2d9ac698eb93e2529f8f77e581f5f9bbbdb059dbb9382b4f6f569dd2d45d31c9f89da8044d182ee3ec2ffb5ee1ef2917f09a4b9bb59801fcf9ae6d8dd50847496bb5f3ae9ee15a820054947dd38ae24641329cb8f745f0ceb24f248b814c95b2221b9f65e2148ea83f887ee7cd18a42997c10947de9e491d4278d84705f04cef0cb9b7125e2618ac544b1d4797abf3c82c979933048499b74c39348f819cf2233cfa1dce7909bbe08bf6d1eddaf38a3dce7d01da9e2b15cda2328e8ee23123822c411d1667f796cb4b77664a8bb7147604760f098bde1fc85af97c919ce590e8cc546b0e9681e1599375ca5b3599de01268679e43444653f44f77460868727ee83ddd15e9a0fbfe58e26ac132fceb953ace8ab52420b5d922fd041551904237127cbabb8aaea8cbe96ea26e224688e80f78808812322a28620391367339f228d951a2a364049b469049f83014b931a3cbe109492b8726bafb06e63986f33bd0dd1ce8ee0d7477121940a2bb8fb840771751810974b704ba3b02dd0d81ee26c201dddd002116d0dd4e4174770210d0dd07e86e03747794ee06a2ebee1f3a1ca8800395fe3ebf4f6b16e870d040f8d856692c368494efeb262280ee88a068cf56690627395aa116221aa26f7876ff08e7df5ee81eea8ec8157ae619e2ebe5e09a64089124370821e94790c9d72652ee3e930531b5c20d48ddbd841c6f6e8a7fff08bf8c474792b7cda3fb5424ff87e4a62fca5644c24fb315ca8f84739f43fd2258146543220e43a22327e350c6b3080ee713019d1899456e7812793c6f47b547f222496f924d0a71560c6afab0122509e9d0cc73289c4f04e38c67910fadd051f8617d1297485f7e7904891c4126b99656881c2f1171669bf4609d25c644cf4433382b117e11ac49f2238574a85d2d43b74d77cfee845edd8daf3841db5d8aa03f10b4811c9c5f14837cf02472bb1fce2792aad3e503385c725c9678b66a2fce737d9cff6891dcc3b412dfc03a6f900b11942c41d07a6d163e2e03a08a41051c572e93e3cf30f572bf34b3556a4380ee6682d42f463857a7e7d286d42df6d78736e312876e25484df4e8ce86a7eefed0d670e2bea835608312e1572a86b67a0b6c28e27d5f8a53492c167ec5197d688b3e1e1a25ebee1bdd4dba0392a2bb5fa4d168057242eaee1bdd3c7407a40b7cbd5c8eb450867ea1bb1d48c6335ba537e74b271fcec0674205a06de86e2c74b70eddfde0829c236a859211420f4e76743706ba8aeeae75e7638b1f6217b502ba7b49773e3eba430bce3eb495022df051e2eb7d9e36ca346bceffcdb41c2c5af0fb6a8b3eff705ce4bcb85ac6621f8eabbee8d5c4c70ee48787748c61e9b096b5bfb11fc44690eb8fb949de6c74962b69b118cef5ab25472b64ab14279975b1b18b813122a2bf3cf6f298177dfe0b562bd463073d9c7477cf661e1645eb3f5de86e519cb412e74831b4e3bcb94988284e218cff86a16c56c66220bd5fdf3623b190f06b127cbd9cd90836c562d58ea30567185f1a8fee7cbae8ee4ae74d08897777d26c049b7c2280c35ada205bab44f87a1fdaaae3ede0f17460b410f6f4e61cf062d8083629c9819c46fe6f52502e5391e6b2e746773f13cd9389de0f67788ae29ce139bb8179d266b74c715d68b0bb77e88ec7b8c3dbf1766062b59732d5cfd1c1f3037e0f5ad8a3074f0f08fe0e2c77c979711d8f1923424c9c9c17e7364f2243847477f8387bafa5d9fb3d788ee61f52263a1ba585ee36d2dd0e267dcbf4ce1c4cda6b41db9d8e24740fe1ebc1789862b1588cec8ee70acdc3e43697a1d11272049988d7d6ee93654854ab444c767c246128ab36280716e11ef7451d4fd8fe6eb3a38a204eeb3853afd376a7187e584b9b71dc27ad93739cd5bc2570d2aee7c4cf93863f8ed4737fcbfe7d8ec121ee65f0ef6d9a4662b11dbce217fd6939519c1fd29a1d720fcf22ee611c7fe5b22bfc265af317c5b81f626d52123ade3f12cab60813858f24dba22e07095d0e0aba65f03c1df795363ec673064de0c004384419dde5d0d0dd7966b2bcd70ae1ebdd6a9913d4dd3abac3d173a7e3791332ce62311c8bcd66f845dabc5fc592a9d2cfe15f8a3f9ce5c761b5b4590e9ce139bb9f31b5fdcdf573a5b3679a2fe6321567bed6c812f837a1f0473a452191ce21464221929c37a9fed24c7a7c3f1cf2a1057f28df6732cad528cd85f331929a24d7470a3f93e3e72c7b09a9618aee9e859fe948c51916cb59fb7036824d339c1fe339cb617d9c230323d824d35d8edadd2edde5b8bd3c96f1873d9b7db6d525eb6e8f85b5744c8d0831493224ac8f24d2212fd2664df2228de6fb4c95682897c951c8b537b0ce47926dad5308576aa3d76806d922e10cb245e1d3e80531ad4492bdf818d6ddb65629b6b54a673850dd60136c049b7240dae4c10386393fcf337fc7f3087d786a3f3a7476c06820000d3e0690850150a1f1f5404cc79c1c10d33116c3b1585377336881736ee0e75ca6779239a3053d5a79cbd4e6f9fae3f922e93ec2bf6fb3d19bbdfed3fe96229d357f268aebd73ef4298394eef6d1d55221b932c85669285a22b9fbe5917c2df9e2277d266a12921f6319696d91284ea1fbe1b5b1d80e532c36824df7c36b84efd3f091705291126ca39866b134824126445d011946d0c930018fb91132dcba3ba6bb1fd0dd36cd804e86546e7ad8bce5b411e7639f484a99d7996d15fad1227db54549462c275e5451024a11303ca4acb40800bba930cb0a4d30d1dd46ba6f60ea6e5b7737acc6d7a337773641c0f573d3bbad7e6d0d1ce7df8c7b25c48a013174afa4c0d0bd32808dee55945ee17a453b1b1bdd54c4393c3c1edce9b163d27c787678683e3ce0cff7983a66cfe401be0eadc623dcf109431e3c660e98717973ba54a85222bfedceec4080f82d41d5e3b896ec0c530f07fb139c99bfb08b8627feba1fd6c7aedc2fcd72b4d9ccc318ffb555ea313c55381c31d1071f09fea1f0c33b414c876443bc6a69a5fed78e4dbe70fe6d961fc7628fe4de37fbcf6b163f0d74997b5fedfd21ff5ba6f73e93156252a73faed25a5867cd3a584b5b6b79deca890beb63cf9ff36c2be9a24833f6bf934ce27f717ebc74e7783f4f9c1f194142c4bde99eadd2d182953aa6f74ed071a5e1334dec619de187d38a21cdfa33cd9b3fcec33b711567c3f02b9d99661d4f1ce819db1b9e36fbf551fc6b6f989c1553fcf56db4e9168b33e3397a36effd65ab94e6afbfb6f637244b7f1aa6a493feb9363d3fa637cf382a7e1b7aa68eebfc519cf7c7bf91a3bd354be2bfd782d7de4b471f3f53ea4fcb33a4619da0870f96a1bd6416c27dd1b7c3f7a345fa5e38bc165789dcc31786c34a49eb55e65ec6539c36788d665bdd564bef2f71efe9cdf799be3ac691a987753e58ade7c44a36bd63ea5f8a9309d326dfb7837f991f7b2e9c7fc569dd56afd11b38df6bd6bfef818a93665a2985e5c45cbf74f2b85af0da3c45d1826eb3d7721c2d48f3e379f3582c1623b1c7dcfbb014c16a410f871fb497f42c96f86f1321434642b118cefdd2ace26c5d9a89e2e37668f27d68c1d8b743a617779fc93ece5fe2ac368a3d9c7f9b306b2b1d3f13b5796e8a7fa7576bb163997be153912467b534149fd65e1ee24ae4496c9592e414ef33191de582c2cf94466ff61ed96890b54933cf21252fd2a64827932cdba232634b24ccb64866abf4966d51589300e94e060bba6d6cf83c3392add25c27d38b8fc46dfd709967c633f16b9d377096dff6b9ad52519c6048f4d78246c8f112096b6969b9342a22c2c3148bcdb20de79268c999e750b514537cffa8a77490ee64ac6c96402bd23c779fe91fff25fd696eb3e3f0bf76b7d7ddb0995777d79044774d37ea4677e7ba8b8184aff7607d8c7f16d65f02276df6f4e64a6fe01c619f67c639f89968a623bd64f8373c4524dcbce12dd325374ff2918449c2fc48f76b19db22199743e1e36c588574f7adbb560260606062c2cf998eef3bf8df9260606062727d2621dd3d76d77ae9ee86818189f1606060627072300ce7fa4c8f411bc22a9d638ea59e87411be6e4c43099f3cdd504efe0a3cdb81482818189216a9a466a91a669c41b69c6efb55cd2fc15d6f79ce8d916b957ad674c9bbe36cdb13e699dfc5fbab474f2d7732ded387d2c475ae9e87f4bf2f0c759e4deffad7958a7db2a7d3dc6f8699e13ab451a2df66a1d2f815674d17355e61ef97882983aa6b7248f0949322a722f27568bbfcfa7e3c7a5bf3e9b3d77e7cdd5823ef30c438a6dd58ad3bfcff15f9b317ee15acd7e386ff65ba638c73f5ad031bd65cf65907b1fd2f7168bb3b404f0effb1c8a3b10d08f99e790bf42a2fb2165b2f7c85f403f62b19af8483f467a4322a71107e27f6d46f22773d9dddd0747e2fe2225470bdafa7d9f1097c1bde9757acdfead66fd45729c4d8f2713cde0fcd067c6b9b45eb35e8931759c692d5d9cd9664c6fc68f249769484b27b44850ae4f415a0b4c54cc7d0e37b0628b6e3025f74b3748c223e90ddfe086a9db222a4e404513154636b8820d7e60831f6c80a3063fa84112fdc24fe62a759c1b9e19bb8be2bc28da9c28ce12972e5ba53e44e4167cda23e11accd0400b1a4c41830574340069208029a0304514dd14790a1fdd1d0b3fd3bb8436e4b0eff3d757330a895e5f0c87f391d0861ce6e1b8704867b95fca21164bfa3c630bcadcfb7076841ce68934d7d233f8b5da5f3b9f96a9cdde8773bff4e138ce8f24cea4902809dff0bcd95a259a4112ddb2194421e75fc71327fb7a063fddddd5680636646045d6c94008191c75b7f75d2bf451212f83ae693178e2c31830b1ddf292f67e0fb38b41d71e08abb63a9eb79082b4449aa2c514263cf0493c4ea0dc2fe53e871d3d2550ee73f801be920f2d3825487ea429acee4cc7ef6ea0ee60200539ffe61887e764b45f0203ef054778010f5e00a5bb8b74f7829d17d8f072f799709e89e2ea987a2c66e98cc42eff70905c469fc72638ab13fcbcd6f4217d485e83bbe0032e60e2029aeef66e0982385a896d766b91e496788e1c397278b95fc2e2948205528452e820050e52e048e112c594766fd2bf7989536fc7611e8e6bc7619fd0e77f7184bcef43dc2345318116459a4314330a02446114050fa01f2ec387b3e332fa1c06f4c365f07e691a1192eb333d50d20ff095603cf30c1facb6627ce715128b25e1592ec91b9e44807eca1fe02b69a2c3d3844787fbf82977088962c00229e8f07860b656299e9ee7510f0f1e2246b1d8083209897e4a201608008a2e40c144db8ae937fba5993fbf653a7338a12800142c2f27e279eb567081157c2be854004537e1c1cb0c4e7f65b1cc6f0b4b9ae7c49ce75f9b63aa022515d0a4604a7b1f8ebf4222d78799e6ad0c7d7ca238853e9f29205310830d508043c109a8b4177ef8d6da68d4eb7d266b33e25e4ea4518c2d2eed7d5b9d612e2dbd6438ffbabc9c780227f0044aba13b89af0f0da81078f9c377b9d482770e94c1084b9011330e96ec2c3abca4c50a32b81164af081121c35e1c1435a5a0f73f796aff557e893da2a9df36d580219dd135dbc727dd9134378a2896ec2432e27ee09274f0cddd2bacdfe844b47822190c0e945737da6fbb9ac7304699ea3cde5ac4424c831822034e1c187885e3bf060ad874f92f6868e272e9c37d9087e18013882179c80a2bb090faf1d78f0aa25cb69f3eb7527ce5d5b694e8460278e747792ee9ae8a2bb9bf0e0af57487d071ebcbf653abd89294ddcbaefd76a250d9ce41238459f989cb7fb47ee55ea3836749bbdf7a8cbf1c4754de8b417d6d2d61eec4460a569f87d2e0222ba1bf6b713c1ad13810d0f27fc5bbe64d3d7097aa6aefab7a4105869af0b41115ef8f92ff92585008810b8badb56692e6d6ee2dc569f2f3c71e15f1054e912537fb0520c8227ee040199ab73746b9340f0d3384010c3c3983a10502c068473488ea727fd00faf1a3c9060101e1b87e8c2013208c3f1c4126f966a3bf84474709f4a3c9062d815b02870f6cd1dd9ecdb4dc1c3f87793833d707ed98e7cdf5b5897d7a7e240f5cc10331f080093cf0b587fd7398177e8869cdde5b16459b9b8478a0a5bb8dba5342054a7ca0bb9174a744527b38cc8946849878aecefbb66a45b7354f245d07a2e8eea5ee3a70d48199f672d388e7c0e7800438d003075edded619cb54832751bd6e997fe2ddf69fbebb85cc21b78b28119dafba5994571bec2a77e6ded487749c8ba24621a7082068aa081260dccba9bd65d06b6908125ba0c0c61200b18c88201243030d4218105891c20d1346fe02d49ffcfd589837db6e35f9887ff6b0ef3fe6bf563308f4747f8799dee4fab599779ecfb1ce6b976987c7eadbf3cacffe1e0789ecb5f2e1e269f38414ae6b28b225de25ed37beccbf8c3cf61b65aa7d72c3941231efb3e87794b985ecf53a4b376cb75de30fd7293b495b6bedbec64e9af6ffc4c67ffb5efc31fa6fe3fc43322c4645e5bb3d1bfcf647177c4138e78c0113d7447cc60c40d8c804167846884d819f1d3dd5e8e1f2dce9113f1c4e572645b7338a6625993791fced1d657f8bf34f3df32917bd371a6df678bbc9c284e9aef24af7d911c699f0d8f9fdfaacc0bff25ce3afd67686804d01d4d0dddd1fce88e86487734df1d0d10ddd124a03b9a0b74370d1931dd5dce16dde9c474a763d39dce8eee748874a793d49d4ed89d4eed4ea7ec4e2701dd0dc3a51584a65b4164e856101edd0ae2a35b416ea099e95a3008740b76816ec19ce8168c05dd82d1a05bb01f740b664577bf9061b560d492d05d0d0addd5b2d09ded4577b69aee6c347467f3bab3f5746723eace5680ee6c6477360374678b4077b60d74378c1a3166c84ce94ea607ddc918a13b992974279385ee6666ba9b114077333b5c6ab81475e7b2a43b9726ddb92875e76280ee9e91d131745068ba83e2dd41c9e90e4a50775066dd41c9bd10f3a25b62c8e028a23b1c20e80ec70abac32183ee70e8a03b1c45e80e4713bac3b1457738b0d09dabd59d4b86ee5c3574e7eae9ee00bc8eb80145835a32033504454357012c3e3b9e0e2c5b7b5d30250a143059daf4bf4b48d0a925bcc75604bd29e32f739d77dadc496b45ff5b5e0213e3fd9d7866ec5e2d9e4360623c9ce9385a70e2ee1c6f607d5aadb93829f824f699434d1c5437ea08d50325e309449840107cbddcf4360be946bd504c80c227497a338e8d78e27ea09474a39274a392ba5148dd2824dda823dd49207712b8a18eba514644243083046c1041029f69163ef84ac26721210249ddcde33942d19213441575a38c2ca148777f20071c504444ba1bc785afc7c394035eccc374034ac8102a8850372aa81b65032a4837ca866e14901388a8820a8eee540fba9b76e7430ddd33948a88203c3a2262ba43a42a24fc8ccb796b12f2801f07b8c0c3feb623643ad222f7998ca0f8c0ea4a33fe3c4525f6c8e650b48fb31487fd71f9efa43e1d3fd37d243f4237040ae6105fb7c7dc26fca0218e3c36c4cc10309d1055b4e7400e6423c4043c66f3e4280428049210443a0655504de8ee0274c7805b7763808bee4ee1588053771ff5f08369474a0d44828cbc8dee9c66e0240327269c92e8d96df6caf158f83978f672fac1897accf3f4f02b9d8d6013d8a4801b2840050a804037cecce51ef39b57eae1237951a439e0be28fcd00ae107c112490100e820aa80140412dd473f3c9090a6e7a5397ef896361d67eb52b5783e12f7c02773f93e692fe9373f3c30be01a748fef51f1e48481efe871e8e1b9c36e4fd9265aa14cf3cc39abde14924e34bcb4b7ac61f8ad6854737e2453c1cc3980677ef46feedfb6b6b19c7e58fc539c4bd8f4747f97df54972de70e3ace093f8f3f732b6a23fcdbd3ab660c5798d7e38b15892ebf32773f8efe7ff5acd8e98d679037f9c37e3b7d55b7ea617a908c2f2cd4645c720cd988aa2ec47cd3e934f9c1b9e4462b1a4bf2e072969b34f23ee654c45ff80927e7cb74c716338ff56fba3c5b854aa59582ead5b9b675b9b6c907bb04a5d893d1231c581d5662f6f49d8bdfbaf5b26f221b947739c996768b3631c989ca3cbddc35fb34e4e232f9bcd9e4b529c3895ba1c27b9374474a75882748a6259fb7116814f2211d9241cfe834f22813629533c546d91bdaf43b545a2388552aa9627b82c8c13e332b4453c3c19d2e389cf9319ba27359e74dd93171fb2f880c507297493d67106e0f21cc71980e7aecd33ac73f4d7003c465a7f0dc0c5395e5b5deeb15bb6d517fd85bdc90e9d0f2ff041091cd78cc1720f53f4f0811ebe8702746efad9bce5b4b30729d37dfcb63b6f423d502cced2c9fbd37aa0740ab99fee6600020ad0f444dbfb3dbc18ce176f367a1d674af31abde125dd1d768733d2a4444747017872e39d8e4b4b99fe1ee14a00ee783c9e0e18ecc50962187edb246724c6b9b41fdafcb889d6fe923351a44bb3a53bc7bf21b54aee8be214cab3e69f144492a111642234824cc81164929b84cc5bcae62d65484224bde1231cdd281a06d08d9aa11b25032a0037dd281b9477372a3f11d1dda8ac031a0562a77085049ed0dd292638008223195150e1d3dd281b22b08311110bc08014dd8d12020a02c0b92d3f44d0dda922426c6082103884b84277ab663c804a142c5084143fe86e172328c0052a08312e04e96e14165580c0932e2c70854f77af8ef85e2e70cb819212ba1b15041a0f0d786880132474f78c56de6638f7392051792aba4ca3bbc789cb2518adbcc1de16d24bcbc11ecebf52809c9ce00cf715c5630876e9ec783b30f09944718e182500d6bd423eafa8008cf60e097f076c029b60e4187ef9a593193986e414dd29199ddd427fd9da3bfbc2cf4fab96e2b7859fb33a3c3c3a70134948d4f4619db216124dba85c4936e21e1822102a0a1bb468f96114974cb881574cb882d74eb889f6e1db1a45b4718a05b472cd1ad236ad0ad2390d02d2456dd4202480b95ee2eeaae12e17ea6b15928d21b18ebee2b74b715beeeae42776f41852c524c010a2c5248a161a270450b283c218b8c6791230f7bb52fd24a1b66eaaf794b995f3bc4fb91669146717dec13d36b71f7ebdb7089ebd7c7f606fa2d2d01dcc3b8ccf34e929c3972607a27ee83dcc3ffb8fc340f2dbd4fe6b7391d72ef04ddd29406674b52ba1fcfbf60a548e18b42b82f5212825212da85284ea1a669c4c359519c8eafcde01c02fb4bfa749b7974847e9fc433c8e3d191fb25fc3947f30f07e7e572d56c0dbee3eb8162ff12db1b4e9ce1f43a43f16f9fa738aff59ffe17f49ac593e6b52423e17ff85f648b6a46b934c24fafcd4448d916655b64abf62ec1d922d626354d23b9524bfe4893b038654dd3c8f5ae1dc1a6197e263ae6184f32a4e1db3c5671b6e6f0d516855f6d14295b8b043791603c45a1fb471d0002173271243ed317216d5206c26bc147626b35f4ee904eb226019f7ab47708c659519419006ca2bb030fd08d5f243daca51de2e5e62de72d27ad05b422bac15adeecaf8ca9e8301a01be4fc4f67e0f9832d1d0e7fdb0d239fe457501b03087d0f4750e81f3cafd92ab554674f77737677c4dbacfe81bfa6ae8f618387b792cd3f0ef2fcda47b852c1909494232b351fcd846f1ce2c14ed0dffbde5d933d94b929366b11c6778cec407eb04e72de7bce52cc0131d3e7277de79037d7643b1495168253d21a98a6e07f2c35d407ef852129974441211dd9d73b4269ee7ed4044c4258624aff7739e64cecd484840a2028707242390a474583f4fc74e8494e44d1ffe0ea4191a5f2f074916244f7e6ded76a356d002d4946e140c5a8062c21125babbc78e03f9bd2598a3478f9f1e3e3d7a7af0e8b1a3878e1e3c3d767ae8f4e8f1f3f3e3f3d3f3c3e367c78f8e1f9e9f9d1f9d9f1e3e3f3e3e3e3d3e3c7c76f8e8f0e1f1d9f1d1f1e9d1f3d3e3d3d3d3c3a367478f8e1e9e9e9d1e9d9e1e3c7e78f8f0e8e1c183c70e1e3a78f0f0d8e1a1c3a3c78e9f1d3e3b7a76f0d8b163878e1d3c3b7676e8ece8a1e347878f8e1e1d3c74ecd0a143078f8e1d1d3a3a7af0fcf0f8f0f4f0f0e0d9c1a383878767874787a7c7cecf8ecf4ecf0e8f9d1d3b3a767876767674767ae8fce8f8e8f4e8f0d0d9a1a343874767474747a749075f6f2c6b4e1e6b4d768879b9625c501c8afbe0fe8a79c5f8e0eeeedda81774a35cd08d92a205473e8f1df9f11da17124868b23257c9fc7625edfe7b15c7bd13de6c371cfb5175d1f1020406cf0d83a620114fec28163a91b15450b8e10103be27134a31dd31763b834126484a5dbf38c886044a5654405c77ffcf01d9787c08888d104962abd37ec3627dd56111374783bb06b69b31bf544378a04dda81174a39ce84635d18d1241372a042826ba514b74a33ed08df240a75e6815752f4445a89049f2c3d7c3b3fb2448f38fb74cefc414d33c719df68273741f5fd31c67f01f8ed334c719729cb844faa0e7b893af082d22a43dfcd79fb420f64a9196e62f59ca41097cbddccdf573c839e280324289160e557466f3e87f88876d262915c9717e9f936349b3bd2c927bd8074e0deec373780dfe5f9bb91c889334cff28b3e70489a5da038c11910f7fc624e8effb5d5465f1997f7fb3ef772347fe19034bb1c9613ef14e958cb0bcbd5deda27cef1564b6d24cd3ef1749bfdfb3ebfd4da1b92661767992f65baf1cfe534fa3215cb51e6435c727da45c1f690689740e690981b5869a682fdb6a448809a6def4155b2ccadcfbeef7f9a44c1e7e8e9ce3cc38c99be608d271d65c8871a61337b3b5342f97296cfaf86a3d4ff7300f1d3c78f4d8ea387b6d8ebfefd6891fb4381bd69acd0989ee934fcbd3f6d7662372a4116412ce201baae84ea14065554354426c7862448809ecc8881093a34e3549c9c07382aa2b7eb4d0dd4052747bb64a458addab34764311511112d91227406277db84b99b04f4536452254840ab46ea6e1a00f101c80e4088e0eb01b9917f58691e1d3fa4c032193f9a3c4c5a3aef5009a25041075a3ea0c0d7cb8f6162aa0d69b539af327cbd6a299eb5620888d1f65858e992bfee93251296253dd8e302b3a5f9b89cd6cf067e10f013f4e3a35a3aeb7eb0fb013d5574e38903670d56ad55d2bd8271e9965540b72c11ddb24fba650dd0c343f7ac2748776391cefce1ecbfd6ea7975db5aeda1e96e2e7854e96e9cfba5297d7fe95adcac56b33c9418a2310fb2310f26dd3c82748b870e0f1b3cba776069eda8a263b0c36907d9dde12c5b11b776ecb02388db1ccea0ee08c02a9d37fbb04e1bcb0be2929cd95ce92c646ae9e0c1085678b0687c33c0f20006268f38824d7374203fbcd2f188222a4549a05a8afa21876eedbc5a666fc0b6c807b7365446e9d0d249d2d201a27b0896a3856d3aaee5751f490ee44d7384b5728478de87b3f5fb76bc06c7f7cb30ec2d71ecf9f1cd4689589b1486a251f88f4bd22dc6aff0f17dd2272a047dcb14f738b2f4b0be671c250a042d1c1944886e7812193f13e56eae425e046b928e022a868ba6424b778bddaae188c6d7fb41ab8619bab13829d08f1c8d4a8e27398e109bcd8a8c8890900851321372830c895112d26c1623e7df62f7eff730abb636e5a46e4aba6109fc9b50cb3545a32ca0441425f03152c71317dad107bdd966cfb3e91dd0f87362bd93e8435b1434f4f4265db0d2588c369657c8002d1ab680af776d9ef733cd8f479009067afdb87688284e21710ac5623121b54a62b1586c36ab1f86f436a3e49c911803c56240201569e51149ca6c522cf6795e7006c7d3e72d653fe62d2710bd96e267a2b64cfb6a67599cb7af81af64049b840c8595e600f4037c25403f9a6c502c167e93a5c5623b3c4c40a238854690492ca6c3143a19c3b1acb3d90c00dd9eac75838aee6eda84dd700a6fb8926aac78ad9a245a3506a8d1698ac39466451a49c5189e5a31301143932d6ac5e0dde5a522499618062add4dda2a7d91de70de8281886e2fcc89d46d110c3aba1b674cdef0bccd3c876c68c0c692960d195a3650354ad0aa0101ef470b96af5036711e49738d26ad1a2fde676f383ac9d77f8da4f97b7dffb5d9e7ff3559582dad698e348aa041a43d9186437385cf346f38d34563a6bb5dde9a21446bc6ab4563a5dbcb4ddccd53e6fd2d6db4e698dae80d9717d31a9187139622e8f20f698b06081a970c26b46410d1ede1ef739b3f5ca991cfe9e755ebcf54fff30fc9b8757b3e0baba5857426a3fb568ca7ee568c293192e8c6319ababb637cdddd8a11a4a7675b63d868aff33e4ed2b2d2f9734344deb241e324dcd716936e0fc7abdba2d525a1d535757f339b3d146dee64b46060a1056302dda4bde1fd5bbe658db4378491d37a618bd60b447c17fbfd5cfb71b473ccf36d936cbd60c28b09b45e0099c9c20c0d5a334ab4f7394c1c4126e41cfdfb62df0cfa1c664488096ecd1c69cda45a3241e816c2e2d75cda9c4abda3b1c48fa425c3d49299a1499bb1b76254d08a31d282e9a2bbbd2f37c10f673311ef78cdcaec25fd7ec6b3761f674597793770922d98215a30b60523a3c5ba81f7cd9ae6e8cd3c87bed887fb6a2d929c98294845b2e93dcccdd17a3f96b939e6ea247a5cce59ae0f74c3f3c622e251ecb3c57235abf35a2f5696ac1b1162f242052e5b2fa4e775ebe5a7db2bbdca5a2e5c74b727ceb2d2960b159727badb730f6750cba588f65a2e479f8f5a2e3ebc996718cea0902816039f29160b339e91387c5cce6c958644b4d5e2e4b55a7eba3d3c5b2b2bad5594ee6b5746dd52b5e0042d556da9845aaa1fad54155aa9285a29215a295b771b79ecf3e6587aecfb1c16f37e69e66ae917ce2752349b315972d634c7263fa82a3c23424c5a2824da6ba1722d14916ea16c7477abb178ada6a269ab9368f50d479dd1adbf25b55ac7039ae1be76214b39817eb44662b1249cad5d104017607061055c58e2420f1768d8c210b6b0812d14d9828fe77df9f1cc717e69e658ecf39a75f9ce88f3e1ecd0befc4846dfb4452e27fabe1ccd9fe6fd4869f3f678de4890d6498660164b5ba5373c8988e214ea824a77914417647769eb42a75ba6052ced69e1093c714d5a08a20556e3bee6d6e62c54690fe3fcb5a3cb737566c1a99be61947f5e159f8dabbd679b260c3561916a8f05162a1086fe6898520dddd5c60692f3771397fb92de2a202dddd8e694e34020a898080ac505a6188156aa8c21555e841158aa882d01657b658628b6f8b1ddd8d615e7d11d69475d0a11a89e2f41a1cc965f47ddf8b626ae4deb7f33df5e9f8bebe9ae43e156eb26091858a2c4b645940169e2ca82934d1ddfef23c8455ebaf29c0d04d8185250b2c1dc0526241c222430a5348816c519c428e4bf1c8615f6d9127e4619d3a780dae83cbc8cb62f9e264a2a5933c497a5f1427f8a2ad52ec134614059c2b5a90c2951d5c51c0951d575c5a3c418b14681184163ca0d08413402104506802851c4fa8c21336f0841c9ea093c553164264f143163956b0b0f2012b479aece0af5838dd6341430e83c1609ea3069abf4645c799fa7c8d9f690cf67967c7634639440ef370906c5674197d2ecff76b96067f715a12f4fc43ba654bf357be8f2b7d613cc9d22facda240ef33e1ca4cf6651a4619d2e7f659a6dc534f6657bc3398ecb611ee8985e4be4de776d06e710fce15224fd95bf23ef9b7d3b0e9b353a1de847fd1bee5a207ffdc0e264fabfb5d1de9acd4e70eaf63a2704f170aea54cf3f6344c4727c068c294eef630b6622eed2b97b4263475dbdc84236bafac094c9002c7e54cc04c703297b3382b1de2e18c2f753c71484cc0624ab78783ff6b58101184c551db985c86858d2baa748bf30a267039dd15df153addf476458ce7d6667bc3cd705f456b69b158d2ffadcd705f81927ed48c8a58215a018315309620457b6389f1748779e02d2d9e4d429640c35395a70f3c1d29610b4a5842094028c148093624210a49b040126c4042164860a26570f732be14e3b88fafe37c79b3cb9f898af34bdb7cd1f3c4792cce9aeb85e7cd45717ea2386775be682d0cc9f3c0fcfec26f9bf7992c8dfc4b9636f70a7f5eda0be7fb927e2ec74cf77fa9ce3c6f79f6226dba7769ae8f848c0422ed2519192111f21ea4f97d5c7a15b12a60388215421c61c711504658811142232031c25011b82802108ae043117a8a1053a5065d95045439eaf6c6a021b7d52daed48d1ce6fefaf0f4dcc4e1a56b71fe7d612dc5997139544332c37d9d551b8b5523c7363bccddfb667582b3cf61ee31245ee94d35274e98f7485e9295de272dcdf482b9a48da5edce218779d77edf0bc7fd3c225c410425ba5b487744981141c61074300426dafb1c539cefc1eaf2d7e3acf834c7d7faffadbd971349c7f93eafd2ff3be49b431032841a4360092105ddedc9208ef9e6791e2b6d6e003d7a787f5bf26ceb37f9be1d7e9c48182f81b60888e958bf077b6bb3ff5af87f6b54083edd3d3b65d3874038164bfad16483f06cb241a23841f09504010620d400084e8030801f50f984bc46e4fffac227ba8179067d7fcbb34e7f25b997f1588297822e8a73c9e8f31f90dd9d43773f18800fb6e8f6727fcb2f1f34f1c1101f783ec041c50a54a6f0705c78ce62b124afe15be2300f2768c8bf1a39ccc3451ce6e1ecb88c1ce6cdb2b548a8740f72d083263a93e5cd38aac5e1ef97a85893783de87800041ea080071f0f583b58c10e9c76a0a3d34117edcd66feb48f56e259f813c7b393e3289c9ff1f7f9e31207c3ea144912574b739d380fbdb4b95c93bde4e7192c6d2efc6babbd4d1aacc4a5cd798dc8ebf4c2ffeb8db96ac3f231e9e1eba0880e5a399022073507357000051c740007374f0847c865f43d9e41b1d82473348ae92dc9e51e7827a635a2997ff4e9f2eff358aef33ddbfa39cccbe4834d9fabd3488d8293268af6be686fb8d1e6e9617d241cd8e8f646ea1847a4e2a8d4cf4a17aa20069d42432232020000431100303824188cc74352d1883c2b15f10114800373c466944a9c09a3288929658c31c40000000000320030100d03083041da68374a093e03ff96a46b81d7bd73fe99cd6ffb092af5c3851221a5a3aea38ddc2ffb7b62e9adfa0b677dfe192b72fe10bf7cdf646a31cb1d540d1397be6574ca8685d297bbc3f09f33c3d3fd07c51d79dbd51be6125ef466c2706315a42344c758a11e6f8f6da49b8e0114106d764b53544211e2549e7e7932751dcdb15d9c593ef4c44e02109652e941cb09937c8c45dbc6bafd1710eaf26db9626d01930060034f9e4e7bbf87660f38f482a3afb9ea247ad456ef40282f805f30339b7543f68cbac9966349e09962c6f8795bda15e62291fb62ec8b42436ba725c592be1cb9472c654fa80e9e727611e693e9a317fa60999ee0fbe2870884dbf36eb6e4925dbc12adb99d50c2d6505f71acbde361b2e053eabc18c0de63a39dc70d7ab9067f4edb3ee2d2c5c89b5738ff441ee1668528ab59d31c75ce0430ef849e9f9ed4758efb573c7eda2ecb79b76a19f340c2b8a1270887aaf66f0845f10209cc625059525efc0d2bd3b9971eb2b21bb2e35fd6bc89490189cf5cf9accf929b89c1e2131336d3bba93a297684bc20b002154f093fcbbc5b02961c3f5669a79a86b31c6fb0abbf60e1425ec9b0b19b1a375adcca405672c61685dc629bc14b39f1716520164b3e95dbc7ab76d645f8cee2e04802824dc67f93fe56831614d86fe8910c762facc19d65e8940362d4832561941d6bb9c95f822fa58be2fbd3a4c53a6b3f21358bff8a60d6301613ff2718e2aec415be75efd49f235884a077e0feeb487097483c8cbcbe9a99849b2327a48526ca225b5e2fd6a90fe91d6f74f74ab7522ba55c5c191f119704ba8e3f8cc8286003f5039582819df56b321afcc32d3840e2d320adeba20b31fbd6f02ccb36d8fbdec91b5bc1b26f07d686844a4d8366a121426acb60886cab5cb0b72c7891a85a7473272694571b2d7f5609ef2d6523fd6b561b5ca21705a14b49a2a052d81824b69268fdd20c7b7344a4fe2e4a42e80a2dfc2a0a03cf4b50d0d07844b55859b53e0e6d4cf056ba9607554d101f9d04f5508ea6bc119c91fe41939e828de3ac0db9a167bf361e412f4dce219b1c0058143b7f4ab077d449f90cab332bb7b4eb1555ad42d4da13700f0a96e647ea6455f0aa32de61a29a51b91319323293a80778f026670baa2f95cee53c3e5bb55c01a62c927af7e50d882fd49b3ceaf4b790b3a459809326ff500af0c4283530fdeca370b10bcb9cf38316f7ec777649e39c38642825d1c889c4489204905d6d76ee82fb6f1b2db1904658a1bdff84c80e016065776aaaed91f1c67b726872e87fa0274a8301d0d5eae5953d77b0afe4b3470eac0f2146b3041102ba1bccf4a92d6f19a955475a8b4821eb0dd3488a24a94d476abc36ef62b78584a71f21baa1e40d521736249e29986e3e8a6902641168a8beaaeada4900bc9095160e41500ad8c61bf61632d33a111e676f4afe12de33547ad3624c6306cb96da0a031158baf378afe10107fe4ec4b755d409dfac744a7fd964823ee1e32422c5401d30b3a7630868c23e7c49197b024d55e8ff9f1417a62ab43485c308438e6c8f5a24dee612bb17f9fd29f66c5da2f9776fa4b42a2b261597877c6985997adc7e3120f94e24e7df1497ce25ce53e39b99d8411b3b61519fb76533edc82dbd209b122dcf539683027118d20882ffa4aced917ab1c4bff8529edd841381a13cbc80bfeea734b26a880217d81cf8b17974060944930b46a5cde31f98b502c58923b95d98e3cf33b027fd767d9cb9de920ca17d205b29e3dde36d7217175a79befa79a6e0760672da142556af74b53496ae0265f6f6d8f585503625f40c75ffaf0766cc84eeda17c8e49d545d886e8815dca61e12e85c67fb24c21e50525c29634fa055f0f3eea0d711e9d77fd69f5ae4054146d97eabbb3f8cb30a7d8047a7d89b78cf46e21c2174dfbecbacdb3b719df24da44207d0a19d0637e2ca3816c72371720cc6112bbc0d88bf26d06fa65354707a6efe1af916a92605c3bef4fc81a024506aecbbbf3f0298c4d0d2ff97ff924846d467ea8d0a7c730574a2b3cb8fa8000350acac4f823d00f1940110313ffd499d311c3ac186b0673ef238b210d8fd60e4398b97914ec1fb5edd968ee8c0bec72681c131bc5ae79724dcbc94cb17c9645f474e03ded3de10df64e167a2180658092058079336b921809ec705963584ab62ac8179798f8f65439193986e63cf6abda02beb32bab93ce2dd14be662ee606074d257b6ca27d368e51e60f6ec89a921305514259c6e72ffc08695d37d83bd87451fdcfe07824e5e7371bbedf2183ca6c4a5970d988c6b586e9b0278131cebff8f1c90517e621de45b58b060df4f33fd05c94f8ba964b541105e91e3a93bdd756542d669335c03c128bbc3dbed8ab88d81a3c6a21d3391ab0cb5cf8b0eaae20f24365b3d233408129dc8230efce8979847f32c18ba746eb61cfc40d63c0e6ee26975ed3b6219ff30388ec5007cc68c32b26c4f13e0161b07aa3bd1c0ef1890b0de2a95096085043f670d7593cd809c9a5d8c0ad9efb614ddf2bcdb3a22465245ef46d9a0278f4c7ad796377cc31a3f417750f31e072a04ffc13e1e7d75a768c6f9e6bbd3297fac847fbfbd318ebf387d79ea58dab3dcfbb98b1f51d73a83100dd00cd2df46375bd836841908252e3b9c0ab655cc7820b1c91ff3f5e6395316bca7d13c702af6b3e5d5431b6849fdd231fcf23eddead79140e0d68abbbaf8a9050c20d2c57a0705eb3db1baa43f36c97e71813f64f334b779462ec34c87c149cf736b8e0716257b0f6d61069b9fc69a42dace34f416398efe081002e9f490cfe7bfe1f6b5675467459ece9378122c90d452fc4b9c7ed45905e5209079697c962a539b0df89eefea640b4274af9fb03001b7cf596954e2cfbcff08d3334eb2bcaf0272508b9baa7f2a4ba40ea8bcf388e20f8e98e0fb2d634df5f6b5a040002dee244c97b70e4c3684cde3b9d9df6c80ad2169198f61ba7ea0dab66bce1fc34505fae8fd014605f08249b8fc04d44891f7636623a076027397be25d7ab621d92afe69813e2b3f0fe41881509dbcbcd5b213f6eadcaab7574e59b94ad073c9239cffbb74178eb9674a556371c4cce1a839842bc3f79c1e3f1ce3f49f3700d5e07f31d278385edcdb22c08b425c0096f9a93fcacd6394d109bc2eb65f441ef9efe08d569feb453ef186bdb85b9c42acbbb45c262d126b8595e3b761f0791b99dca8d4d75cc6c82f3da213b174cef009f0fc7df7d6342a574b403671db5c30fee75d8d495d42ec7dc1a19b4a3c8d70af33aaf51af9250c62fb44a9365317c1a0f337a2fe68c2893b968de7b74932476f73b01e77918806eb1f72c4c26d063507d7d2020e0bee03905ec4b43f8bd8dc92d6a6d6f3e82cd41cecc367b95d479614eeed81e744bce44c9e3a2c63c1189249843e0a3a77f976c2609a8422801794a4dc5261c896b58748c80107466c7c41f4f3334677dc5ad943f48efb1cb94dfa1cd9f8e2fcc862246521cbb0ed273378501e4d6e1e802029e715fc0b0abd0f8a6817e26d4e743049051e962bb822deaff617d715f029e26b065ccc2516f203444c8decfa06c43bd5cd7579885cbd09aec25ac8d1485b649380afac80ca4394d7bbc8a145f735bb001aa2cb543d85cf86ae4979d3868c6ad327c61e3bae595ab39e7f46eaceefaa573c28247b558009fa429c900fe952620feb2ccdcc5d974ef71b2e95aa172f5878653a2f95290bcd3712ae5b7fb3390ea2d87675514e30803bd021df3068f8e3340191945bbbe12308b055cb222a674b9091cca4aa167653325f96542f777e47963d99612703d98e8a8517709d123dd500b8ab3484d953536004f31ad0641e1e996bef815fd9f92d2cbe8952fb0b061c247755b08fb5603cf9f2ad9e705e06fbb648f59a48fe3d8bea00320b8859c59a0c5287d5574825059163d48dfc60523b33d67cb59c6a3371f744cb32497c21340dd7c0f7f88524b7c5b87f3ca1d9ff50283c0791baccd4d2ba118cff84e0c12a9e9f7839eaba44fdf7b3952fee47be735f7f07461ce08b9b02a90a830211db9518c2801ca814aebc81bb1b09cdf37b44f3e94ef684f20887c8bd48dc5dd94c003434b8725501a4583c6636028757b587632a8eddbb9588201db38963b42c2cc78ffc04eca524ca4605c27f83c9197e267070a5a8b905aae4b1274608aa5f1c2b75ba5724c44ed87136ee6313f5eafa74b5301c202117c001d9608736de73a3da2f6dc7f4a265265fd4c3e622a31b2e7564e4211f2eb454bde3bd31c7d9e305c385a2fb9ab5e22f01bc5e0ba58685038a2ec57e45b7b53cefbea6b2f25d2d69f759721c36da1c9ea61795556b3e28b087fa911212a4ef8f54f3d7710e0089290e4bfec355d157aabaa7ec0e422726c0e94513fcb508f320e2379ea43fb34af7d143df96fcc12bdc322f12ecac32e657f40e3fb074c7a67fc20a04cd50bfe7a9b917b4b430590fcc81dae47f39910ebb3bf87c1e1baf4a4b565de3505d3a48c4344ca7c9ffa36d639a178c660a1c008ae1847d974e1091655bce49e43cd92572ac9f4a049b083682161e7895c83c56ff5c77cfa0eeec4d89228701dc09db5789ca865f5817891bf97ab2951f71911bda71e26009ad8b6edda1de12ba03b34ec15a1e64864f2ffabd63837edb71223a21ba61e5a7aa102b058ce893df931357af916fa996fd0e7c0fd2fc5400e9c5c84ceac1531a3d6e7cfb470c0ebe49afe3247114dd38c9b0464c2df172cbbbb41ea0ab0ae13ebb6a704e562459d792d8d4b8cc73ffe33dcda87c48d7c10f3631b8e3b3b8de1c7cce25b9671b8e9c7e24b331ed78c5472a2ca1967660a49a9b9eeef8718a0a61352e8aaa4c072396ce6c65df16d62b598e1fc623d6e6f467b26522ebbc9d791a18146c06a110ff2b3a69d16860b960ee1a80a87a548be0486d162c4bab9ccc8d3f5e794d63c9c0542624c263c8ddfd21468251a933b0c67e937f1553b5c97c7c90348f22a4dd68b8f01e9cc763dc87755c78308108f1ea9c38fbd541e007e1e8fa15be9dde64c7b78e84f2c7fd7db79a692a36e971e97793439ad3002e2f2e20eb7f241e41cc89419c7aed5c767d39886b192379fffbe1366159bc8ef1294dc19e8dd220863ad0f4be5554e3da65d5976e4cad5227388eb7c02b23778fcfe8a57beff1065def9521e6204daf1f18ff6fe7f5fb4e61f5da35d9968140a0d8b6ce291c41fe57722960658fb042d087ba8ab0dd6f591df433c5f0fb664aed2993dcb6c5a917184cb167900f406825406da9913417b050bb24d25d577f67ad377a1f11b0495c14391a13b0fc386414de0832556e63e3b7f483ee4fa2ef1153c24636b9247fdb7b28da963463d0faf29c89f54b72ffccd2156d5a1f9acb27991dfabba298e779e7ac7ed7192e1f58b497cf8f7c38471aee857142a9c633e5b2fc4939a58f62f7dd3701c4d0298906318c9d7ad704ca7fd286f3f85c70a8e065756a822af506a50e4eb73248d1e0586c971b6f5bfde74ce61eb2ab7076fd26b444946b91624df73f0e63c588bc44c03753038a6c971a69203b2365649fc4e8083f31ecb1ff5583e8f7c3cd1067620f4df8f1ec95d3311a6679791769f25c633785cc5a41549cfb53c3150899ff436cc6cad837fd0b194fe9089c684528d332bc92e89f26ed60ddce529cd9b28560a2b2ccbf1f17f9347f8dcb3391605150575b469b89542e82ce428f44a807317959e2365fcea50db38b0fc161d9c477280e97f09f430f12dffe43bbe8c0fcd02c463c12ced91db119910cb7b5e79ea71e77f25ed1fbd02e7463be0080136c72b79d726e746d8e277b4ceefa1f60dbeaffcd3da8f179978548e2c09c79870cc1d8914be4cc0c1cb432ee7a78117ddb345b59ac9923be0e55036499a852d4922f9491b5f1454174d665a2f52bbe1006e156412f1b327961e3b1ea19f786b8dc31db6affc4c68fd0e570b6a6bdf4925ec0be4243568cb050f3f74e2ee67a2ad9ea942497699681506e79b4488d529ccc5135f9509958aec8113248707acd1dee54b3a70badb609bf41749386df16dfc2b0065be4dd9207e99256bb719611a26aded45c4e5a5df0866cada7cba31a7d08b214ea5ed804012239c0f801fdc5b66be981cdbe2b308e55995dbc808d9d621c6cbeae9a563341eb28027596e5783af5d7dd59a103999871411c32f84a25da1c88c75dd7fd3ade3b4428ae42fe6688af02c8e5d79dcfdcb7a50537c8f7d259dfdbeb78e2b789cf815743870736f92a026baa655754429361c6438c3d2362cd9d4773d8e85f8c5d4bece5be680b2c3a9e0892e9952b5c838f3c6bbf60e975997c8afce5c3587b8bff618215b7a08da46e1c1fe1bed45b54b44a3f869aee61610f4f77d9f353b484244e5f4ef133d0dd8aafc49bf4274c3cb97cdd169bcc4055f414989ee93796c36a4efd9d03690ab075d2f31668c9a1c9d53fec51693d6e578dccb23b2289c61aec9f31da51acd3b7213bcb03c954f51b778d2dbb4376eb00fa56d59e2c96a88fe88d53048106f69a3400bafcac5c5521ce78b2d884a0367047692a37feb31d10178ef9262754b0ea570fa094187bc6c294a1a10bdc6bf1db6384b261853b9b6bd1169a1d2666073b20c8e40594651523a76c371cb39d3707fd28661aa81464b47093d1ba86751ff7b296b58bc4e09bfc67662250c1af30109f0de1a9357b7e1cfeabdd8078f7e4eea13ac1b28f8e1d9c7844655f1d1d84cc08b6c89a0bbe165b2f08fd4b27475ce135d4cfbbd0e700f8fe5fe401f18650087030e11c3484d931220bf78dc386aab05dc1a123b60e8f7ce6a9c00549be68b08afc5a440a824863c43cccf1f0ec83eb664cf6b1409f7d480328968ae1bd9a8bcf4e706229efeb6185c072e0e6860aa8a13a4d6481e5dc8723bd5d7e1f0884248039850651953cc28aae4b649dc8459529c3e363f4ed4b88a3ef0740e81802348699b10f58ed774460ed6bff8306553d1187a409fef26b9c650be5cea6f754e44bf384fb941a73ad1db168a13bd0dc8be76d2ea37aa85f3e68b3c4e634be6efc400284be3b2c018279865bf7ff9e61989966f75773c251a24d5d331e92cdd00b10b491cdba57e3220f95d5ebabdf8f5146ec6a53d874aa965648889bb958b95d6564b57c92ff2ab50a0b256aab975581440ddfe80708bee8f785da569d7fced44d83e117056273bbc9e6f0134b6a11249d670c59142843c64e50115da477e29381854b39c392f525ee4a348e551b9b4fa53c73bb96cace336afbb610de27af89d952c0f1819c3cab0f56caac8f3af65210b3ab2125ee0f26aecdcd7a289658d7e110cbc0a359e57e113ca734a29db201581ce3b80c1c9a171b72c7b3cd9b247e77348e4bddf6faf59ec0b960f46f607d398759478e2cb8fe2aa60bb21a09f76ac6ed4ddd9f1a07ca159591fd7cbe33c1dcd3e5ca84c728bcf68c801a70af1b55ecdec3e69dc9428fec99231d1ae5e5cefbca173621c046eacb49047b58dc09768ae2bbed592708fc0e8051c4ff9f66dd07bcbacebaec3144d69904389c02cecc54dbaafd08022996359d09023a7fa4d1c38ef59171dfd45259ca3692e5330a739b92f444ff95621ee1c0df80a4ae5252425c7216f5cbc28beac9df21adae09311c4e8d6f63684fc40815a47d7445480d896eac1082e5640ca0ef11f489a60910925a637a5a2bbf1b9943922ad95304b4af322c854c4f95c11884cb61a4b86f74ccd203899ad14aae83b388fa7d8fdeb391c754f90a1b9eadff186ef235dd4b74ec9c4677543f2560e39de21ab2cecf8062c7942b815dc08f6e3f3c51f94c4eb3839552e1bf0ce4d1f21870d120387681d96d83f86ddf3d2cce6d7646a59ffc962a243e87e52ae6d664982db1ab300e138a8e3a217720e87f963e318895b362359944c6c31e8348d318c67e18bdd2f7b56b8771a33d32fe08fbfc5635fc0eee5c27f091667ab5fc44873799ff681e8b63e97247c23cdc2a5938125534582bd9ea727186229ef2d7118637859969553b617fb08d7af9143b963e10d6b24b054cb8584585671df2669ee9f1ce9384036121589ce0f1791103aad4b5c1c4eb4cbd40ae9abc667720790a5d963dc02d215a788f2ec4d1e4a4cec789d18f19fc6b6397036c5e7e7ff26df79e2872a61b949157dc9fa0efb4f638d05d1211470fc4474f26e278954d789135cebbdb18d4fe5d324b6f19deee4b2b8cb9d5afc94095570de11069d9c1c11add0d8529e53ebd5b98a5103079c9d006e4fd83be1309ba2b81b98c492acfa6366798187d9c852f5a91b62b551b35014c439eed8e2af9efcea0d94a28d43556960829b803959f3eb24f0bb2ae84d5d519f174667de45953b036fd78f398786b8d27ced588a3817939d5ce89f698999937c1d2d1fec8fb286106696cb30efecf0364b37e4db865bb7f6fdd6d4695a6f6d4a7d17b5594b1729a92cb314f5fd2d18a51fc3cf75801bc6a3121a0105373c4bc521b1dfc8741ae98a912aaa29d10da2c00d798a62fcb70e750046d336d25c4d8fefe3258c28236a720490d7653f57e915f7b57824e91d68e704164bbf145d094c1d50e5f3d87740614d7c2dfce1945f2309a07362b322c786296a8e771b480e8f63b4db4c28a26ed80a2c5e6fd65583e0dce024dca01b1f0f2f69f10ed79344d1b38c157f14f4f0b46a58a28f641a0f9c90d85f6e2cf31ebbcf6a69c46b440c0123a6bc6e986036dfcdfb80917f114ff4117a0ea4566a8fc6536706d00b58ee7f1bfd67c7cab0e38707e31075b215b444ea5ef06a030ccd94ca7749957252d6333d0e57f8208504c6699d4dca7020515251306958613422b0a79b92bb21ba0464948ed61258078f47fecd8d53ee752c0dc32c5f2fdd82583b808566dc868021533926476b9eb586b8c92463ab89c0bb6d29abb7e62f17b4449f81e7d4e0d0d986e34097eda9c061d9a2085c401c99098974cf3186908949faa86eed875c50a21154909574f070005ab189afa63a133e3acf76ff6df33024c955e2bd0cf57bf6917522055acd63ff9341f496b3a08f2439fbb630e48d4551ff3c6997acb1fa03f97a591841dfdf9175c9afbe7bb6d45d056847e7ad2152dd9d33681e63a30cb2a5c11b4547d2716bfe0686774c98e16c68300f5efa0ea9c21f87ad5c962eab9af33051fa34f5637d3ec0b0fda6980a6f588714caba9b9d823424b616310e8980876a893b080dd51094b949f77834e7b1bff857bc1eefa810da6010dee320771567d10ed4a0dc2524ff86ff29abd0502eb9c5009355e9cc7fb8aceffd61af6f375a5ed23228d1c89b45539b03600f6300f6e6be7e8d3f9826816865e7defaee34117eae2bf83efba4ceeb30c8c97e5e110e3cf59470301b9605930125c29bd7ec4748e47dfd2a8eeffd9072a89e8fd179b7f2b529090745d0cb8f63c08d07000e226693a4f9c0e007046e3120d2ce907fbaa17b12a5fb8dff918e08733873cff228023903b2586ab918091ea14f0a0314b7110f40193dfb76523a83c0465680f2958e83f82b074f12988420855db32b33f453234a1e84181976040db9d0f5891c91e0093e6b89b0de63716e33dd44dd3e5d7ec50af3d4921d03b18cc8a57615580ada50e247d6d3af8c8c448d755f965053c668e9260e9fc05353a6170cd379f20744c830641df996a44ffedeb291320fba18cdbed303c839f0ee972bc286afe6f027cc5483804f0e280277c7774cc808365df81e35d13159dca9c8e8c6ce9eb2563cb28c6db1c52cd57cbc6393f00d83fdbaafcb2ae81ceae03979d944d19b6950ef3dabc15122160011881786d4d5696b84aab87de03d3a077a700c0ab3d6bfe88e70f11517311c3335b36c98f42213c0f6f405359da5deda851c5f9887ede45bb8067a0e2add937bce11bb71e90e7ff7eba7c6f2db318fe9dc357c5f957d41e8983842067a868c608dcb392e609d9a92e7015a5f78e6e10cdd5c5bac10c59631ec3bfcb9e48d71a816bac6b4f807ed2c09c9bf905e60e7c8d88d9a31b028b59c380b43c7856a049cf67c8f57661abc14e2ee0ac9e45d79154bcd71f6c6c00577cf47cd0e3ef92cd38a7ada3c5a9e7d6b431a648756df6d4301a2a3e32a11b84af59ca6e1039b1ece6e132c16264c62164003b39d087948e22ae9f06caf66a6985bfe2268a54777fcacf3bf5e2aadf2fa26ed481cba424904d50ca2201ac593dfb46310cde0913bffedd08f84edf72c07d8ad7c938a8805e5c28d377f77355b816a0d9cfa6c6c696adc79222a222a126ac78a3f540ed7bd9a89438ec11232b63493166ef7537a8fbf5f5d46ad005482ec095e6fa624c7c592d83ed2e71207a0698c33ebb720dbfa11e99d6f666f980c315b4acdbe1c3087e643c9c7b032597ec742e03bcae87d18646baaa32337666f52728da52e9931e2699cbacd0e2a92beb7d2687e4789c58f1d891223ef9bb60e64c72a33fcc8322e8417255c19ec342760513953c3e9c72eddcda53fd8afca5448e9f231b8a64fe7be3c953bb9c3c4e1b8049bd9bafdb028bed9cff031b7f2c897448dbdf83d0b9a041ece3b26ee19413921e8ca1863f1f421bb4c30c68232f3513f367315b28a79be69d41316c004728efaaae16820795cfb7005061dfd41ccca2eea97cd96712d2627e0a8432c307b8fb5c0ceb7f64292fb819a7fd040b2d91b578508d91d49bf37f5fd4975f8b2764afeaa28c90d27ccc941176e728dfb7f9cf7fbad51e9aed73fd776a47287c5358939f817be036220ad66704dc60a45bb7ee160757bb1520ca593df36c489a6095bc1f6064f78530d1003696967dc6638e38a294188a28705dab032c179399f228ce1b61614b0a61ce9dd2ad29b9492e38517ff1c473e997e4efdf2288d8f565046a6451b3e55deb7fe7ef67233ac7ce094c74719beba8adfe25a53506b1252678e67a1fde5f87740a48f8c0c6098f8c73057e40b8b49751adc5ae81fb196d8aa6dccb97af4d612b9c7dfba3d68ecae610241d661ad592b35fbacdd31ee3fbdc0ea4f48899074d9af98444f5af67e9e5b897da57303d9e4ab94578ab3e7acf7cc42000c036b66c0b153f08bb279c7c42316e1f35d5cddcbd6f4eaddab800f9e734784997f357aff817522d821a65c7b71a443f50fbbc4e0057d66c10bed2acec1fb81b7350f4121d71a4ccfec8ad3e829ac27c07632b1f36ca0b21a4b76637cc708cbc67c279fd33c4688a199bf4cfa1f23a983771bf250e35c8d62aa97d5157af20d1f0497d746cbaa160302497a39e0641d29330d573df7dcd48c25621dc06fd9586d56080dba442b9a26811a7438a36ad904b6efe010b3540b1ca52ec20cc1cb06cf665759e159e9001a0f48062941023ab81267eb79fd6944ebd34f9a585b106ed70973d908cd37dcd748233dbe258d86ed3719adf0682a68609307b1595b8c53f1c6697c4f8371627c1e5c16dfcb84ddb4bbc97ea77c9c62a7b88600534688bc12183a6315b38709bff3fc03fda32a422b51e496fe866dae58a24e6956d2a0a25d53b4bba4d122854fc55ad8c390bcda3ece1cac4069ebf1c70f27789eae3af062d0c118c87937230067acf8008d1225871c1dd676682aaed64cdf9584aa74e067ca513a90283e926087d7c088cf9c2819d2212c9dd65d1f1cfa7004782d0d4859313a26c540b1251e5a00cbc4140e820c3a0433dd0250f25c54ba2f4bb3c9c91fd229d27ad74e0c04815a6d2533cffb7795e4d652c8455dc243d7e5515a8b036bf560be518fd7f44780ae0b1f87e2704ff04a0e963ec6f3ebfb216cfa5d4172c70f3918799583b13c1d5fe301109cfe8e5f9ea2a5d851d3eb655fff8573e719e0f851c9b22d89e7c4088704b0ff429ccd8e4ac1dc7fd5e903d5cf0a6807b9e56de79d18ca38c3898ffbbae5c45b6683e78928f574bd6136451678b498913637587de1af73c58124b147a92786ea5835d3c55f7f70ee2ea38c34ecb6bedce0553338af01705c2a1484e0d790149c65e0070cfd1464ff1e871ac398479e6cb48fb7ccf129ddbe1fe0d899cedf1c93686403785737d6baaf0bf401205c2634f6d02428331977eed5eda4f87fdc84c9b94a97f12dce7ee0c28137eab9e134f2fe22e5935e20147e041e035290ac59eef6b6c364f9635f7b64d197c2a427c0084375373c509990c9baba33876616fec01b93fcd10621f05b517ddda7ea8b9919d7e2110934e38b5122c90d57aaa2ac74cf2f9c63a47d09f672d4c7f939feb8680554d67dab8b678a41af3ee021bb154fa97eaff135ea11b2aba05f351d56f0b695c6a5d124b72e085f304d11c203394a9bbfb5c6c0ca8ef23412b1a22b658d7c855cd07cc6ce8882a2d8e09df806f5b9a22af38260ad9f787b9151353b4dc611260fb018f29268b53932e709b85032c37a4532f18c30174a32c0bd9a658b8d29ec6752052cb453e610df084ba7ce54c4a0b891ee93537a09d9d32233b7f156647d929be942a105b2635133c424cdcc910eedbdcf5fbf28504bc645e0c23be4ebbd4a8358a95578778e2beb4a4176bff452d002d3a079035e4808b7943071b7e24e6f734ccca7571d6c9b932d48ea795a917f423332de95bf37f308150865edf16c88b558033117dad43ff696405937e187ca2ed60d4f3491b4b63ce0e930a9c46152f838d9f5c35fc58900d656ac7c5e044ab1ebba2552203bcdfde3e89f1a364b4593883f736108cee74854446c721e11e8777c2ea5efa2b326abba0405b060e23cff3763b3c5e178fb02dbeb23fce9d6e1b4c5fe4971aead524780905ec1ac06e2a771a7b4c8494178ad9bd88b8a7a32c78142b5165e7701d5c855566404f5fe4c9ede238d735319aa5ee83610c47e459ce0773f8bdeeb34b733419ec182b9f8164315af4f5e67ba6c34737ff714d6fdbc2b142f908c475d218ed546bc8ca0265de0e7c752bebea247f69a2e7a6a5563ce92c27db05d0e86ec0642a3531d733b3f80ef2582e8249eccf44aa768d0aad618ec993333245422c61445283da01c81413991d0e58ce707ff4b46678703a3a624380d1df040111c4b2d9e05cf617976dd2ba8fd9ea32587689680d282310ee0a866cc90dcc8ecdb95a1bd4125b3509c026c268617b4f3ce67eb53eb90e8c1435330c9eee78eb98ad5734fa3afc5574fd7498270b33a0b0a05358f714000181617a8e37673f3e91cd5f1172b8c2535085286470f02fa7a1630e6203c92626bc6893d93130e75d1df643029d65cd7202fedb86f1c9f9db0d7b75c6c4cf7d8ad7d94a3b5999e1c7c72b5db60f39708c48db56e32b526dfdebef9a177ace24a33b826aab389cb82dff4c951b4cf60f092cf1e9fac6b28577ef258c0e96f3de85272977eb758a06cb32433c1c964ee0771bf1eaeb303a86369819a2c040df9ae29c5502d336601f5ec07d8d4f1c9324dd1479c75e7220997d60c0ef19fdc65c2c239caffe17ebab13033490d94a231c2a2248b6134417e78a1d4ee3e05fa461ecc6f488263f5e4d72b34e3b063e3e7c3d5de31c2f6b372db84b3a62ee11eccf096d4fa8ddd111fe31e861360ca4436614731131dbaada358ba27c298411439334044db2f19c6e6fddfa3716ba79967aae473003e6856463bbdba275d1dea5eb8d825e5bf91341e33c709edaca770812fac4db4667ac045d39d0cf6933cc61ab4414dde51ab84f8dc97a6bdf78c3be0b8d7d5c21d357990bc10bcca9ed53258fc14fef3bf1c1f423bc53697cd5397f9a2dd6e8de661716b0f42590ddbee78e6bd532e4ba80c09b2a3fdaf2948c16fa71e07af5b90410e0162b92f0f24fc33b695b9aca49a4fc5a076849f33989167ccc8d397c76a72460a3bc0fa4b289d586160dd9f59866ca2cae58f04408bb1124484aec25692eba2681f4cac9c743b54e62e8203f0464526c682f7580b0214e7e3ab9a281d52a2fe14f77f1a2262ff0d12e3ac354fae4eabea6f44617efca6c7e6dcf8fd9421feca2379fc5b7479b46e8f447f1f91895930b6bde8a065ddc4f65d05f15cc821cb33cd7d1e9af1864fc197f3be5fc80e4d1d15fc44aba7a8b8300b9ba0b79c9aa208318d590b2710d4af6d71a292f8b6175e50f95c7351de015214fb1dbfcdc8237bf5a9e0618319b83c11e63556ca9132142c51549f4830f622f0c199d9483d2b9ff8641a877c931ff327a3d957fc4f85c4362c53c8a8fe42834534daac256952a3c6e431339075e37a0169599208ddafd65abe587b43a914f236d5c12c1bed82651a2a56dc35f06e8a97722810aeba26ad05fe32f3e42e9cfd0bfc28e28c6078a7a6dab0b5d6fbc6e1b924e231e6ca7407fa1969ea19b2520e6d65d0ae915ca01c131dbc252b3bb9f9ff89a3f7518786d7104650203208b1f04eacaf3777b843a8dd5cce3740b68f462f5f06478ae11f7662d4120e592404f601898490d7c15ac8a0bc27e1784ef6e24b8f9d01a58d3e4a0d470d53b37284868ab0790f4948e34c98f3ee0a466fa52e6b79fec00f0e42a3937541d086370f18c31fa21d7a9da3101026c5c57cf211f8665217c5649f2e2578434643c7230195a725d1a69f819cd76f11e6b871603efe15dcebea524b229a4c50eabea8478fa31c939f6b75b2bac0e408298427db3b0949350276018d27f32ee8d73f411386fdbb0f9da87ba7d0944bbdde6203161e789599d7b5ff63d7e582bc3415e8463c2435913d73896e6119696761212168c090e9f84dee69c9487ce3e47c3322be04169626ea481716d682f3c185ceec7049910c9c68923015e02c3055206a20c579de308eb6ced489869d32f60690d968c56c4f46da2cefa38ccc409385b55ade8424f506a3ea17841d40ae023c68f37dd028c83be7fb63625a1ff987b4c33889fa189bd6dc71a886f79fa03a8e6015d78f7988b0713f297dc4e8cde4e5eca0875aefd35427f84d129906ac43a072974e2633219109c49aa94bc1d9b1a7f4d07f4273558b473ba75fbcff9f2f283b36a22e979628896f4c8bfa1dac2d0ab03efa9d73a3629f224166d28e680483401673e3834523d205441d84bcb6302c5e14d3c87c631455a4f465fe7f70b0d8fdb4f20de9cb16005b252176e6be1ba953ba189d69bd8524473827ec685b266873336da91983140440331555b1f22fda638d4aef0186a337ff99111c68bb2fa940856fe2204ced75184b465f76b756479cb657ba1230ff908dc21a03297d6911fdf47e0bae07a834cc7f349f507227d2b7064e8403764c7552274d876161151ea7dc99d37e50da29608c64625b3a386ae41a99a13a582da8d57be8f307ca2e0b754fe42dce0795800d1c7fdadff3196710584a310702dc9631e07777461b34f0b8d713a2b9d0c0586e9784fee16e087866a3f6a0a00d78f600e81825c2f562ae5d8cf70cadae5df08fe95ee73e08a9369f47806bb7d1224b516a57f90230588a648812635604b7bdfb49733a9bee79439982380031ea493e24656be70f53cb1a88535f598316ae3eec7f155710d04db6cf34433eeb9c8f86334f525082d4216a8d22c20b78bdb7259c9225fdc07dc93b5587d6c7954e603b2b0eb48037bde1208dd582d75db12e618404a50967265dc3f400629cfce1d89d2f4c6a8658e6fbf21aa2fc0bb520c0d963de05581c9a1425f29017c8ccd70654e91fd8f2c4a6f66ce0d0632c09b2edfe9f185c2cd93a36743b95538991ae66bb5336d065515c24490604363fb22800f408563ffead4c721c21117810709976aee1dab02e7a38734193afe632c4054a4474446714f5ec8021063ed8f6cd019dd1f60155ac4c8638bc9d9ea86982222f83b45e5db49a748fbaef97a3284b647b9018eef20606e21668df5c3cdc5cd5ffde0c77761f79296b85d3db4d4d609d79020bf82884abdcb53391a065189aee3caefe17516ccc679315bc632de47426c9bd51c6649bd82b230cf9bc1dc595081171a3526ffde5c0c702a9c870a85b414a841e93d855ce9f0e29acb063b51c3bfc19e4115afc6b59d34aa0f5061c22c4511b5668363f058419a80115a03f7a6eb248b3c0062d58426a0c2aa6410177fa114252e1d01b6e18662399f9f99fd408761ef4ced9e77b39fd99b6b211af2a10665f23d437dc067039f8cb94d3e5e6c39bdd8ed43e3ca7ed6f9f49525e962a3f920cfb5be764a566f3092c3db5ec6f0c36cb5f387666602bdeaa3e39e645e1e2ae11766cc1abd310ae7586276b0bfe54e96fdfca0b9f30dd202f53f85d5f845249584d5b61e68241ea03869c125308f6efef5d38a59a41bb2ff3d2ed00ee9e3e3cb76ab186e91b90bb3e1d3033a64ceb0be1e66aec19fab46e7e83f203a787615fdb4234574530477127b042054e28b41b3581d00ed36c0e3a6eacba511ad09c1ec04fd4048b117db90667bdce40634322cb2a23cad03a880d89f0348293b3ac5a68ea83603c29731c381eb091a7abb157b1e4e99affb373464640db7639f26d2cc1fa3c1017b75c199858e62445c3d61ced192a254587d0d56e0cd962042a754d8106f60f3a0178a9a1f7e5c0440c3d56e01b561f9a0df8085bd4ecf9e40fd24ee2c3b0373d5f884d3ff343ea493fe0090f191986f68523f2f5c6d67cf2f07af7ee3e15557bd9bfa5d42d4dd77e2b2718a42441fd9dc29b3372199574f5ce3cc3b4e1dcc0ff72700560cf6c2b04f9c8ec36573aa391900bdde4d6fc9e556ea56b528181d003d1fc1f9e97fe4798431c1457360ac1299bbfd7e620867e878732683a8611e640fbd0e46da357ac5f48a26dfb0d6e75bcc1a06859dd8f07fbf0cfa0568256be80a0f77a7f2cf17d3b86137c5b6e7d69182eb4685e2e29949a4c8fa7536571df2872afa6c76162e8e1a006340dd01ce068473efcef402ed68d04a0f300ad1ff1f95e65e08714452628e43b3ee81c15e49cf60a018e46aa488fdd12c3034caf19a2d56f62046dfe53afe130508631bb88a063050cec1aa1d072edf9b2a5ffadc4a1846a85b8551c1460dd977e93557265cf06ce34ff8ab6e787af38760139b7f0bb0e1f617a1e0752e32dbd9e67dc0afca151c1cc9977f66aa4999dbdea936bb567b59aaf7dfb101b913a8a1fbbb119f5f6ba218b61ab1b39f79c56b896fc2e58495208dbdee6029b21efab3b328c828cba7fed6fca4b23b18fda8e7b23d39255a926efcb38b15ef41f32928e5c901690bcf5aa5d582a6f981100891001782659ee23f60914bfb6b0e6c13e9478afbdd526ecad1ccd4fd15806e630d98869af16cc4eaf8b3303ed76782b2b147828822a820740f3bbeaa9dcb401492ca53c262636396f66fd48e868bd3012a22716ebb4abd39fb395d2c7e4861f14bcad170a59094ec4efffdc211514003543f7a53294162c5fdaed5edaf7725a1422e704f21f9929907155fd4640f2547398a3980a3d3e58f7e3a528c227217ea78e84244b39bd8b8166097ea28540a9e18ca94b15e5ebe8ae677cb4258b9ed40ee2940ec48bfca6399f17981fb44c5207be2f88dd42c8cf0ffd0391114a0c285b14b57cca2f4c1c270bf52eca32650fcda89dc7f9a0be787b8ce37a34fb04ec9e54e4ba700bc28e389dd12d8a4755aa3663e3de7577f80a29984fbac19bcef9f2cf9f27a732481ca5a2ef9c8c2b0075039bd8f49df55636122803dad5a6fe2d1db4d59cabb1e858865acabfd6cc7023f312bd68844213bd16eeeb017e8d6f9f6e5a9277e0e74406afffee33f7d6455aa992c43430eaba8ffdd94032679b7d78b987c44ac4a9c1265c06b0f7d7afd2d58693dba62a340ff348afed4cabd456ea98879723c0044a80de991f4e15a1454d90244f375eb177a62a6cc39f83d9ff3f75d58796a6cb1f8ac1cd1044cbf2d2e05f87058a3e1fde48930edaf0b917c414dadfc328717768bae5f93fc7d8fcbde292e8778423dc77f736f847600e6e218369a5b2257c6aae20ce1ca78837a39d4260a87bc5e6fa2aa40b0227ceb134ae55a198b4a850032f08ab56684162b92f959022444b4dc672498c5dcae34d13fa8985e0c4609009452cf79071871ae5287b3e9bf35f5021879f24b3b91a48190507ab90b816f6412dc66b06409901cb9d4dc3229b92e03b8a4e0cd670eecac765f2220788673f1367614eb8cc741d163e3c9539a5af14c39ba7e141a44c1062eec8fd35f1bf9a316b9e9efd1b8a97855d5cb997e81a8461dcc6c53dd1608a1355642f49805ef8b2c3492ada6914c508632262f2b15d5e3ecb2c1fdb6ae6a35398d3c694e656c64fe4412ba251b58bafa6388946eb12344d3841e1beb2588001f9e498e140f1e91c7619e46735369f0b370cc039332191345caa3c649df8801aa406aa270a93f322c3376317c8af9fdb19c4f7c6169675b6bc4714542a1e1d9510a1a0a57441bb2b489c7f588f3c11632ad99975abc22dfee04af09b3dac8b35a6a3737fa742bbd2a50265d1fefad91ba835655e5202db32f07c472b6436e100fa61da35999c4d05da64af569d6af054731102e1688582cd8f4363ce8afd159cf6c65a31d64d2e9b6ee709672ddb851d36bd2a6dd4b4a987cf522833f474c20697ca2941ffa1910f87d2cd3c22ce238530ed6282d8f35de4a7965957ae75028e7a5b48d4ec4b02f28fe891173e92fe38c308153fa3e095529dcb200c8c501b82e81686e6589584cc6f77efadb70b698022dbacce60097173f611fe21bdd45198cdcf0a015ddc60dacff7dc3eb0d445711f37d624950672179f9f69c18e212b2a38824d15028608411fdc8f234d5f236988be92649a227d05b73f59269b492428908c4ef763ec598ff6f4194a40df260d4bc4440ea931beeba771e38cd9899587213c085006069b2448710f3b2be7c4afb1fbedf4830f7032b6a2334da825a713b4fd396f2088ed4ca3fe5f964bef65f57164557ccda7fc291f72f68f86047726c33b2e3c8deb8a698e2fd4d9713127644b8da762ede9ac084e34f69a604c4aaf614609fcdbd1074f5fcb38a859650f5b878e6a91898dd057a955f1a362ed6e105fe5d0b6b24efd3b503a47296b9944cd990f89388f4737774bccb80dbf6fa61579ddc64014bfcc5efec6d5e27035bdf40fd0ccc16d53a96e45bd16996d5585d1604a073c1c660a616f92be25cfb18c476fed3a4cf4e8bb259a976e8f53bcdd6656d27686566dc06688bed5104f7941cea53249dcb6d4bf8fb136b381e7ddcc49a152cc8aab3c6680055017b4e0fc0b38a3ff9e4ed64ad1d71cd4013bdc293fb3013c1c32d5e9123ba54fe9640bcd2a5cdc8dc1270b873eadc9b04acf9d5fd5fa88f729e37cb3c8f73b5b0df05fdadd7d82fe86142b4c8ab2ce06580b3b33fd2075cb8ab28c8e1d7e505088084101dc9c8a0053f837c2ca1255f8297e6f3d51a9d1cd8714cd5e06605ae165443c29733f0b0bf9df271845b82285edc5e1f526931971ef56e687e2565274cda45ef77337d838744fb2bb4c7be3cd8ea68054ac9f278c71a072be44c537c7892ab38d9c05147087c3282288e4749adefa36a5d422609e4845a9994ca5fbb8d52281bcfbd415ba5c29b703937ce2fb7aff3b2dc5e90827e47275d5d534b9703d43ecfffad92512f6ffa4046241958619ff950544cc9f6ac8ccbad834afbb54131dd91dc8bb07a2d1d2153a98744c4aa76490b03e8ae2d5db1cb7cb0f81f9b5474dd2daa0d273ca9a36882867b10626a6ed7405dd64cd3cd21242cf41673a8e9907d0c680601109d3cb82332c905f9255b977fa388efdf1380232b81c0722a1f1f061d31ab5e0178565dfd04adf89d032eddc129f1e94d26fb8b35b86e45c9291d04a8310593aca9008f7e6e90534a582017757045f1fc7ee2253983c492e0424169cc4bdc8499ee7a4cf91b64fc2d9e3dd0cdb906637023ec3489800c18e9c81e6329062ce704f140606c24b8a0b0cfdb834dfad539ba37a674fda333f96fdf505629071584290e69099c7b977fc285ee336f45202573f06e0d4e657db77a297b50b3daba56b6ac2bdaf2cd19d591c567825a3c6425233c24be48f58b25d363aacfa58c041b89bfbf666ccade64d7902c8f4aa714966de4db62ca49bd08178c86647e13c1647b045e1514308aba8fbd5cb26ee154e9fa6438ae93133a13bde89bfdece19ede0fa11692b015583fae52ee3cbba45120542afb7cb5807c44afd8a88585a1b09471b5000af9ff7fa35099119343853b8f76962d189fdfa22374e5be571f2b37e7e5831fdb7dfc3e93b928da20e38f91faf206b2f855fa09a8b9ade454c7d6d2b4dc617ac6dabdf6fc8683bd25c63e64b1bad7807cc3211cb2750705f8b0df6dbd499a5bdebed6f94ef22641de66324ead409769a7db924526449b4bca01fc1037bbd3b45108ec00ce8d93eb88f0033caed0fe02d80ebb21235737596c5aa589d048e8dd338456f2aad027f48bf9938a85c51338415724356b4eae2116f940b9dcc6413d053e8398df6dbcc73712fc99e2806cc82d6a1eaf42236d0f8ff5c7e1c7c7a02b12e8f1b4193b49b4c4698198a9530e90df2f705dae902a606ff37f4ec119d01570cea543765105e3d511acd1715ce4484ce0ffd61c872da639205be36683de5c36389bb3ae277058859824b03ff124f630b12ddfa1c25aa44c3f3b7c4bf060357546b2aac30d7b38c007eb8e85c7b0da545e0003fe6f0e3c0be8790dcfe1812215f4e5d599f3f0493f7df4808d210e0b13fbbf74b1e3eed8aad36d9c3913fb3f371675c8e0bccf69035b889cd954dba527f81828b37f8073357fe9aaab04e4cda72ae06e68b51e855d305b4259f996022624707524053f5b553339058b7c4600c123d3788278a3654d32128c8d4ce7011d5ce66352f742b3209b639cbb7967fff48737fa8744bc0bcb506078a0f9e744b8fe78a9a6889e9f6527689b6b91fc0c30999fa3b5e02610eba40d67165163677a74398a3f4f9b639e0c7789d32524572e06d806bfd38c8189f3805986209c9e9366aa29a73056e8cdc4f88d38196f518a56fa8dd2a755ed655748422f7cb9e1cda6bfe858ee5414140a342ce3eff57d17142936c74383cb370ec7fcdeed74d6db785855ff466f2b10faa0f0bea2a6dbcd9da1730d6ff970cb839651edc489d1df1d2ffb1531e66b5364d60cd07288c4ae9889cf4d5adaa0110af74b41b2f9bb15cc1c52e5e6407edae12594d33b8ade11713230beff17738d84d7e4d29416a4ec60d7990c93de6f718946a187203040173f64610c965bd3fd990eae30efc6c9867d3d40072b82ddd2a9ef0134bdd20beeb801036b8d61d96495ab1069ff848270052b495cc422d235c8bbebb842102105ff861ebf459c98dc9df917219edcdd9fd1cc1caf33a31def957fedc3cad5d366ac2b3079857afeedcf6be00b3daea26af5617f5411dac34fbed15674b9eba46e28f62f18508d325e62343c569acf753062291e2b43ef0b98826f652c444ccab850eb1ed4d7be0a61303fb90c9df0b4ff2148fac3fd071d81049e0042c7850f43048286ebb4e9b89c150a63b9f15f1d4c477e12bdc5e58f747d4840209d29df5a6a3250369a2dbbd97d6913f85f391f35c870b0385bf95bed0b28266c9bc0bbe75a39bf8fcbefe3419df490ec3b4db5103b59e30ec243d404785e7285bb429a478c91eed0f008fddf50e4df89ce6bc821b9aed5db0d306a32beaedbf7dacf13dc85d7a317c83c4b886183c04b5c71b19e05706df40839a39a4359fdddaa32001bb27b5a154e91644c70ec49be4df903220e4fe7e75d79fb67a3197be3e13bbd7f267e1fa70df4856b6fc03d30e96f597fa55c0f85e39a415809a158f8126df273a4c63b3a87fc66c169a9a74724a945937687d0137bb13b7f9d99996f6242aea96c9ccb66b90103c04dc9feede53c40774e715eb58a7df3d226194941770738b88e709d167fa46530ee877cf774943e290f98603e94b30a31449eb36a21131bf1c9c1316a5aef4f453cc86e77a7d912120042afb9fbe5489bb6903a72b860e86d9eb78769180e0f0a2404d3bf49f791f8e00fcb298db2679cbf84cf518784ef164bd3fb38d5ca223f8755365c46abbf29044e386b5da499a7a8d7ad76c1d2758774b25a90a2e1d1e82cccabc68017c41ecfb8b5f70a1a3949af53999855290bc84eff3400784a5721fe672e685d9ed143c46e6ccd065c4e66d0612977c0c5fdda41a7321311740a0e52485c935e41408d9ed9be029ed5dd19c5b945a81af1d8721b90c37756de26151b34c1bbe5d93dcf3c447e9a3330859094f3ca8d6967788a40d3e800d90e626126230904cce606a2b5458e94300b68a42335f14d1b52445a1484a5b6501d3ab910982405acdf79a96fd8f4d68146392e01897fda5e04ca40f7e9474e702024a7aae31c87a94651cf75a1e33198beec06653715fd84cac4ece83287681f96baacdd2aa20d2ebf7bd0685c5af1756673f974434dcac10bde6d18a8498771ffcd4fae2cfa00b6c8a1e19a67a49301dbac6e37d5c7aef8cb8bf0b74c0ad7f21233ab05c4e8a7b036b28f2f27d24476fe01c69bffb5de358f6dcf6bfa777665292b059aa06eb3607840a6ca3f8b7621de6fa1e75c028e638bd20efcb76b15081a12979f4b8481edcd548dda2e4c7dcf6b5dd38f689d73f35ab19be9100a594f4f3cb0f399730bbbc4ec1fc33e2b0a1265790b139f670d3fb25568a416efbc9babd5bd36a0e58ab6bdfdf398a1627f8bbbbf183bbabfd42f49063279df666300426cc55e30f487b26fe6cf515c0b564c8f158ffdc1732a9755078dbd15340cad3e5cb13431922172c371b27e96b6e1089b1596f9a84b6a52005591d6155fe5ee90efb9008c7ac14e57ec8ef8f6eb16e3b55dd19c27f0f26f28731c4c117a8a4826fc2abc1007291d648758293cffc4de42b1f491d52cbecfc0f2000cb8675064c6cb8e2c7d1d3d7c35711a37fde7e17f7215fe9f0f007fe30aec46002bf681276b9e10a62d38552183d7e735a8a97806d1da06152d364d0094a7b3e96a4f552487ed5038bf86ac1dd036d6c4e11dd4a1f8006fab855a768aba1b8bd8817a8aa9223414e8be40e2d8d8a57687699278649489e918df75c6d5cc1ad201ac91b3153adb48ad3b610edad20309296a67fa799f03904d332ef897c989e3a2475f1f350554967e29479d03d5fe3aa66bce28245f880e67f18036b7febe239e313025066066b64df19bbbcd4949a166d323bef37eff8b83d68c0bab9829a129a8f8b7437468a435560715de37f3bf01c61486332170aee3b528de8ee521e57827b0e1ff90412fdf9c9c9d05c863ffed8f8b92d1b0b323bb03616860ec203d6e24ea1fa8758820b1422f9122c2f0769c6cf031ec8e1de7149b0ebba5d3a141432f2a6c6a09902096af08a1deb82bb295ed295bd76857a34d0f45a8312639b04d93b9fee7cb5c915f7be24688488652d273531878fd33c3e5dc0b134c8d3c09944f6b937a0deb2477cca175a444345545ad04067a82269ea4d12fcd1fb6d938eeefbf43945308e2a43cf5ff264244a58349d7f749a35ea8db1773c7b6f608b08d80406d11f382b5054dd152a24b0356a9e04cc20665d40038c60c0d501aa2ce5c6b032bdd42dcd5a32225e180e99840a0c5ef01b15d8b3102b98ada6bc7b410587b85dff96f033a07a16cab175e8f4089118805a3892c21980353af93379db6d3aacc4c4b67f7438ba0ca4ed29d1ac08b9cbca7e496db77954bc577e5e1c9033bca9ee7767cbc03f7b39c404df340b3d08e495ede62bcb08d7b6d2047ef23364d517a0402c7611fb9d91292991f0c453bf1534bf9053d389e0dfeb41e4f33e9d7dfa881a1f157212cedf794a9cc75d00a53bc4e412caab6baa55ce2a017d400cf560971202a0744c2c90cf10a1d840844d7945022589df58380691fa784ef412c237673b411a37068ccedc6e73c43e2c38268d23587d57b3b606dbb84237e5905e0448c142b63224058b913456ba89dd9195b87adac4acd9c7c8e0735082fe9a7af53fc210ba846b29b0c043aa60c9a8311a4db1036e1c7e7666981cb1c621c37a3535037e5cd96cb7dfbe6921534d765973f83fdf742f53a2997979ed0e0967b47ea3ac3550d06b60a6238386287c3369371cb7772565d7cbe58180da901d9f10c31e3b4717c9138c7ed063470ac0d4cb922f0bf649e8f3e2e1f6dc430ea72d2181d2a030f64c07c8f9bb2874383f409c8303d83d85250e45f94421673afcc02f8888b9b24164225eb589702271c7f1ec521b9b08f16fe4967d0545dfd8c0661cdfa57ef43bffebe23a153993321eb1f931681493bc882bb5640435bcb5ba528691878d6b28842acbd75c3d365e0821b28b844d3461b85a75b402acd819c5680b200c9b388f7993e204077c165e6cb25f598b89ceb8b5ea47f7670d5cd05b1fb00a9fa123b593dc343f594d84a933376e02fc18f5578f3a3852cc16bade36250408985d7c74215e40f63b0c5c24c28edfed1b91ee48a93eb4112f1f56ad6b85f76e3b69c9ba335928807bbe5e1661f003abc3517eba6022c0413b5c56de6d2dd9bfca239cbf460ec01016849798c53b9ed47262b166a9ff3114349ee556ccd130ed563eeb8951ac5a3e4a1e8367802b04de7f50b5b472722c04d0f7e69d0ddb612ed66afc3bba5202f5121ebbce1f0ce3f99f73b52575c58f10d16ff74fb4ae82e114182b0fc5900e7597f3817a9efe12fa3b92fe18d0de36f61ab97b108fada2e675ae2f0650a62409227115316ed0044e7c6180b0962cacd219c88df34220aafe0b436e5d8b8016665740e9362dcefb842e8d77dc491024d8403fccc8d074bbf5ddbb9bff66e12158a7debea555134e62c8aa0a6bab7eb3f69cc773ac376c3c31eeab11a14b56be1050030696aa1d2bf04fccd6ec2d4fa4d84c596492335748b2c850a35020885079456210debd1676c2e78266b336897817c7b920ae5c03432735414c4b92a3137ac4be696ffe7e620bae320b15c174da55e9a6667e966124dab9b584011deac4944575cb53e856d0a812751d85b7c81cc46d683499ad039a1906108e8bba78b5b6e2ae4eb1604f0db42ef68d434ed09fb709c9214698ccfa3cb91001b5c2ec5e37f988f879cca203933c96d459a420faada3bd4224f06b486543bccc81e3ee222075781c6a1a1a638f0c05116c2ee95ac9e5042d42ab22d022744328e09760c5064784c0e5200419420aa6a2dab448bd2f0404ac1a83333b40e7e43571281b0648be52cc9479f3d43595c5e0ec91013de4b41d3fb595f56e8ab3bc54988c30fa6d13aebd8126779a159b983aee958278f9970ab2b23b7fe2f6170a4febc299b5b52e5b740ba2007bb8065cea320a3e8a62688edad78a5760fd7268246734e0f073da0c36eec71fa2952dae4ea2763533ca88be1ad8317594a0f5500dfe13c1b55b910028702366f60f4a1cb78141eac343a047a21676e284f2054a492d284a87e9010f399fffe58ef3a97612f8973fa0eccc0d3799fecce47dd427b2e8d37d01ca0617bb66fa5325dbc33eb15699066ea87fe583c2f984f8dd1f93ae7aba56e01eaa58674d9fb40030d4c5b82e0694e3d0bdde6f54180f6eb09f2d9ed9b48fee06a9f723ac0db3127dc8e5e67ce9567a5d757e93a38acb753875fff3fe0e6f22cffa12a3eba43f61fc8fd273164fea5f2453b9a7de5055aaed81ad91e131f3ab5d9698391a7861bda33416f683e3c31113352856a2d68b1e2aba71b57ebe45e02819fe73af54585beeb9a71ae39ff8a0fe43cd2f4861aaf23e5c29e00ec8a93ae703bf353ca0eb069796536368aebd9d9e9b57cd2dca69a6ce0d1c6dce87c0254543b3782a276d92a688cf700b405575d39c0858acd84f59dd1fddfee518410bdb16f2e60e526b66fd139748cf9a7b5cdea72092988538d50a3c0cc7292df80b88024b9b5843ed825800dc0947bc46553e5be93902ea1d4cacdb30b1446d18f03c66e404cc888cd0148731f7bec7825595281e12c4a25f066e1d862ce327cd0ccdb63d68daf9cf3b00accc6ed1b6eeadba5582b90f8938798cfd539fa1d6e16841f5189f78536009048521faacbe1b426a80f036645a87d23e97541ee5644fb07d89b32dc3030a485f627f39fb39b37c63bc1bbf1966321a22062e7a439d1f6065c40ac26ba43f428a77f21fdcc49c0d6e83e24afe8f7e017c81ff8fe6fac83ba8550e7335270ebbf0398c3969f20184820efd797cbd01a701de34126d93d414975db08d429a4b176edf88d0261ff646d21267ce2603dcca1460490e41f6d6299ad25b8ce7d8c3251bef301427ce82a9e282fcf5e68d3a783c07ac1da9b32c8152723468b39127bfac2fe91ac632798aa4c87ad7c0de68f168a9172fa0b04d68722ec6a20c94b70d8e57a9bda43da61a4e62b0d7bc54746e9e86f9ff68c21874afc9459fab21d5d37c62c9c744b1f4027cfe8c6c3d6d1dddbe65c2f91ed3322ea196f41d9612acfbfe12bdadbcdf16f5d17f2f71613f40142c3318a0106480f31d2dcb25a0777271bfac7d78a0fef196d30c091897f407f207103a8df7e7b8fd3150e7baf5637b816054c348d53d27cc758333cfd58c0c8558c49e69feff989d16ad33fe2f4232d0a82e30bb39940b0e2c02671c603d1f2b1ec5911bea9bf96115bf99ae9594f9eb9a54796bed4a6920e34c6aafb393d0f22d33fbe577e659311e7ff8db73af4cf63bf07e1173b96ef1122e328ab7963dea8272e077bd876d67841ed0114d5b130a9728b2354d90c90e014e747d244c0efd6d56b353029418c9acc40d9246528647daabf1ba98f348488dee79ae0f1edae8d765e0722f0214447a2abbff4c07303ece5100a1e5efb8311eead9f5ab42d4fcde36d5de0eb9e2774ebe407f1f6ece8c532c646c3fb48620eb8eca309227027bb82d184462b80bafad9836202ab609cb8fb9033c47b272eca2dc5a6e6632f52c3b60523115bc84f0ee89105b3b3b0c0ba95a629b06a4212a97338a8c970468ed4a111617c1dd34150b39e77520cd6d8befe80e639ee164ede169ab6b0846e367431ac581eee40e98a964d62cb6d9545b8d703a2678785ab5da208f1a28a7f6dee486ad837db15b19939e93e9f6edb41e709cf4880c5382910c329ee194512763389e29a9fe8ab806785ab304d05e5e5548ab1d0acae7e7be3301028b0702dd30f70e01c3544de1ce4ec064d399c7f86bd110a6f9ab6506b5f3267564a80a2504eea736ea3d35be60ad114b493f200117c966f0f74031485668bded2ac68baab94f0d06967e1bcea613b5060041b098c8f953d1680e5adc1861a101ed2346a03d7011cb7a6ec26572e2196da2c580920655a8fd1a46eacb437335e833567f484e8c300e102e381da58daeb298dff70c9b26c266366ac61f7a69a5b9798e66bd44814603972be91e7c04794d4bad8847fa5af2cef6b4d803a05d9dd34452abe96a60884bd9a3ed7d31a7f7e9a4086d6e790fafbbe05ff7ec8e1a4abc60daf82ac6a92e2ae2c8e2f9272ab7111c0583d0362dedbec012ed713c5cc4d63451f6aee9aae8187967873783a93fba9a1519e55a0d1ff4f6f9fa0bacc85a3cd2472871a14fdc28ae60a6c966fa9d4d091a14acdf1428f65bbff7663bb5d6ce5c6822881228e2321fd3b2a60c5814d6600a71d7b401ceab89fa74430bb647bf8b41092e1c666fd11974e2135c08f83dd8aa6e23cbab79fc306deeeb2da852d453f5b39791ba21ac1102772d95bed83c6ba5cdcbcae713efc145b516fd317e8167dcb9999f5f35535e7a094152bc35cca8ab945b1b6e5aad69c2cd59faa622ccb3e91b1559ee19d3aff4844970dc944bb9d53e77222309b1917fa569724a577b1060b98c99dd205013cb75841331128ec6042246a94e6c36509fe8c56ce77a98d2413e1ee3881c3a0609d51eba6e681fea882210c022b0ca352744d8a288dfee220aacb685c2a6d95dff6eafc53a48da16471e17effcc42c96090ae8d5b913dcedcb7d10f1d9cffb494e9c19005bb8aefc3134a3edc74a7bb158bfb2e36c4e92a76534f23159ee0fd34b90222bc3074c65a83c36b70a354ef9aee867d20e7908e9e52f9c6dcb0482a1edca998e80ececde9f8526fab23dd53133ad34679b4389994e1679549d9c3b8f496c9dd5b05a21d536c2622634aa027d05f50e25a5b93ff641531d051b0e723e0fd12b1a9f34eff2a47d863c18bcc90a81cce44bb2906a309702a43559ec4f45f17febb7a364fff816379711e93daf0d3e8b8bab084fad6b9bb8bc15d870cffd28082cf4e61d6bf0746c2a1502dd694ed1ada6bc511be3cc13d950a349411ca4d9d587620658ee8e5619422e1abea698972cb359a7868ea6f147fa175e951311ac06b27b005a3651fd813f5fe3d85a525c4a597c79893b115c592236c41f42130c6f2a23120193741fcc810376960ae6b627cc0c02209feb1eabd52c38c83f330e5a49820d33ace60c68d7afccf8d3cd59402034afc22806a2081ddf0274dd05d18cae59f8091f84e4940a4cd90072836d17c4e0cf6800b6cd628ac0bef65826b32774f657d60aa393f3a96ec339458ceb331bef25e5189c9a105303f5150f72561eab0e8164036b94d0c297c011f37501901693025554f0638130f09126e9beb3b7b33dd12643310e96cce234845f67b861f06c6db6c494f0b9bb9137adede32c70d5988c192be4c48c3ab1fdbee40aae817d413435f9207f725861a269a915fdefd125b7656c4efd37904ea200764ca32c6e8975fbc0993121cb7ea7771791c1f7410faa06ade0747513f6823bc275bf25fa74546da32cd3162001c3ded2f3aafebcb54c380ccd68d6c90c48ddc6e438469af454d1f6c527ecdc144fdb0f8a98a8402a9909bcfa493690a4979d6ed4aaa1c9fa490e9f20051eb6dc68605d250cbf9cfc99ac6c1039b9f6782691ebe9a912b7b6b45ca10ad9c2cf16a87a1120c59a774ea287130a9de767b4439fd5c931c4cc1915a2e16178550a51509e4f069be9738a9bf4778589347b5ef971a023770265a3b1cfadc16ac8b2dcc0fa5b83ac695c56268672d86560786b9f05a5bebd32bc90d5a9dcf2ff09808501e68afb425aa0908d97ad321f5d0d87b265152dc7c80b09e5637c6328ee3870b9bf6b02796b93032164e40a329c65c0f9573be4b3bd6bc03fae2e5e0bcf15a14f8f42681b15f12188e3dd32b8c8a5eb0020af69daa45e92eedc847305d3dfa363be55c030c2f8b72311a7ca0f33c02a304e30abba0d98831c005d0cd22b512bbe218132ebc8f77871e5fd3e9d66283d68abcd36d8e968f3aedf97ff17e736e7de4daee0daa462e2c9e404cdc6d3879fc1d79d94f857aec693605f56f1801ae56e2b3d3589cde1c9c4904e7844e8bd7b794d885ac082d35642c30af095ac4f77b144f34d60773a380ff8e6cb81d71b2abac3d405cd2ce4cc755c2c500a49de7b9aba7ab186956f164e58dcdba3a403dca57339424f9c1f8684890e7780997fb9e1b4110ae0accb0055e045154bbbd6542d59b1b931352564780b2e8f324f8d3493378780d90576d8542307da92285a3b19c0e6898076999f3105f9f41444bcc5600807a3465b83fb1c648dc2e4db12ec6cecf8b8af72a76f181e676fde1d1e1aa13dd297f0c333285865190609510c65104b000d2d627a2f77cfd9d0fa59ef6f03d6833f7b9e63ab2a6105c0332944c13e834f8e503b232bcbd82b63c830397ac7934ce382478a83a60641ee11d8092349e42600ac96ad2891b66adc349a77a469b8c4720120c0b06566101a899077ab9a4b43afc9672dcaa786f5b540ed05dbfc140b281c714f08ec591e5e7158f6f9fe13ffe332cf26cc71088e160583e98aaf57ec0c33db11302f162d1aba68064936d35697a2be709ebfaaef2188d2f76e29fa35cb0e1885a04f3dac354e80687a7fdd1fc1b7501d9c378f92b97f2eea16eb54192c20adde855219123dcba160dbf2cb4d039005ed8c3c9ab3d69189c6fe29c8687d59193114dae66e0ae74498b7f47b64808d6dc5ab5e6ee2d6124dc7770150a0df3e7bb5b4ad2279f8b955d32785d7f8aa619724705c488306eabcd6b619bfd8905d32ee7e1a0da700f007acf9244a614fcd186d3cc3de2eefa82767dab977fb9ea4e8791fb25987af1f9b5f5a5e65175cd32c44066b0721f36108b425d0717530d3393fad8e99770de828498c27e0c4f292dffc835779cbaea02177a63002d92bc640d30828621fb6f9163ca8cf81cdbc26a8749eb3741861685c4d1aeeeac76be0de5239b5caafaded98bd34dcbbbbde3924bf64b306e650401482a64d01f0bac9fd038e34cd42bc0c245eb702398be6106733afc4c35cb08b9e4cb52fa7020019259378b0642b17e6695ac37c2e36881211906ad7e78f3fcaf8034230412bd4205b2e0d3e645e084beac5d29d4acf13323dae965822830f29c81740aa6d1e48c30323450d23d3528b39fe9f4edbdf6589b7d171dd9c7ab7b562b2ca3bd4f77330af9dceb117949d9c64be7c531f00e8261aac1f89fa5f72daed10a55f6b6a547039a81e38dfa63d07da0b1d598433c04eaacd9a096a5bab1d814ea9d52a2f852576ee0c02a9a5c6c056f6c7b3fb4574885560996b2c61aaccea4a24b534468779ea7abbbcdc716449f83a188954d98a1c93ed8e40ae117aba3a8ead6af9387b2858b6a6b1b5c1211ac0fe5e24c7297d744ee9a59381b97d22c571cbfba8c08c79355a69520810f9e8632a3af5a51e67f88aee96204226ea0b49398b35c21fe7c1e10b1f160a48e4064a024d2bc55e904f61b50a44df81ebf26c399385d1c075713e0cb90a7d29578dfc7b315eee5964949e49aebb51e4101041b3ddda0fc1073566d21532f64e155d1329d3b6abcce7e51ec60cca5147604f8af1eae7981703717d5a15e8b47a03d3751c3ca60c15c89929f44bf08965d50706bd63698a40925481d03adefcc145383c99638a0ca4872a986f545e0865e7923bcbde59df878def6d8043419bcf3594e06bd918006f1380ad2a93000e24690ea72925f9c273ffc370390aa53d5af3c9ba2d8c4ef2cc81e181680c345860353e3ff8ae22c8556e06dc9b12ae3124e6117556231959369185fc0775a6038fbfc2a51a99487d8d0ce004710d10de0fafe6946cb39197ae5892c97782123b7f7ff014f0a35c286e08387eeb6ecc5ba4629d64604f03b1e286c1d92eb5866496046950927125348c066612d8cdddee64a3266d736d791ec326730981a4ba7922dcf6159dee3f677c116ade8b823070c8c97f799b6f2ed049267d8c52830450a0cbdbdb13080e8d6ad738d6726e8f2b3f82e1008a345628baaedc343d27d6e7cdc530032cab6798d359bd5002f39c730945c5a5df935f0ea4091fb89790179b16fbc6eba333a18634bd6cab482ea535d68752122d592fe9ebbd118c026ed1381b904b60017043342731633cd96a79ab450f87ce93d94aed12a8317f4f8fce087220ae901a63a7d705b77bc4abfb1df9f0cedc418b8a5d7d6658fbe0c731170eb6f6d5f81e02b859422b8dc40ab23fb6f431fe8791436dcb1e9af274f377f57f453fd7780b42cb93a29d1bfc42da6f6f8c5908ec110504e8e2d66134925642d1584a9cd257de35805e6f96b4aa71391e08b8d5eb7c1415584aea98cc264a3d612c64b84ce1945de5f2f7e37cbab18185165740f178a4404a39f58053b579955424ca378fa30535dd904558161ebd34d64af042c5ac09a93fbffce5651958ea88f212dec20c10dc94434d93b6b89c8de85d9920c8094c46c6bb91222b2e7ca33ad61bc015d45508f2b228c5946e379f44a5cea85664344ba0e7cb15f005b5f62eb0aaf0a799dda7cfa168db841e021045076bf9fd103578437005d24521d8eacc2539048f6ad9a732daa095bfd27c8efc1b92911304ba31a0f9eca2d08e26e7fc04b2c53fb2996f635b4bd26966491771783fcb7d797ad4c0b54ab824d4550f1fedfea0278bde724129fa549edb6182542c930ddf40c9030248d30a00ff1a258c0a2968b64e9a0aa221fde601b181cc4ce19f540208145eb614159ae59ea008ff36707087520ea5c9c3a5d3a5b1bebb180ef76fe238431f6c1203a8af0d865a2618d10f4d893cae54ea554db123447e120ae94d3a91c042b449c1747dcaa5d2eb748efef21b84b8e52aacb0548a56446be9a36892f70b74a3fdcbe08aeea375c55d6c9561982b13997d5995f4dc44c7eb6128daf27ccc4c2f0b77f03e8f91fa34de7e5353612504b4401bb7305444b72fa550d46c36d44deb6f8e321fb6be060330fdacbdc442c271d66ffa0a32d2e05353c0d3cecf0b298ff5949b6864ef47b720bdcde7c12ad67bb74da3f6607aa3056c4e33ce1e03e28489b31a9e8382d1a57aabbbc14d5a24caa9dddb3446048a428a4d09e455d8e71b9076ed08eeb4a0df3414ace7ed98947383c388f8c3e0d9f8acd0738dc844b583d350ba8364513d5e4e937825d26a65ffc2c547c32b200bbb609c3848ededb6e16b0619761d4326a219af28a1464a58b057e4a451aa156f6f887635f7d2c27531f87e1eafb46cb9feb2e7d82dd2b2ec62b9187f942a052828d5715baa592b208c875863c4e252b767da9c9b54b27c075d2b0edfa21ccfdb06b47bf69f8ad8b2012ac82bf828ea2eae4b581e196873f1e20220a009110f6094388c0875211f56c3955e0344f1c35bfb24858d14577edbcfcfe935abbd0a0a1e61180da155038ad5b3f26cd46f974547dff45df1f46cd7cd4c40e9447da0affc07344a90d90dc23ab337553bbb74437a5bf3b7b5bb001e25402eb6c00dd7c9466a08368202f885a4372c2449c3398c664a6242030e26b3689466d99cbcb48c476c3555750bfdbd2416c037806e8ea2074044ab251bfa5dc12a46612c93ab108da89810527685c7f3f28a3888285a706880a7c7b5b3b158013839e5b1c884f627da983e7c29734b8c83a6fbf58ab343f240413cfc4f063345c486d12889fa1c991e5e5a0158b16592785218aadb149baae838f95937d50bc7320005350d8b64916bf4d04a6caeeae1da9d288e6dc144858e9c538025db5ad30e8c73efa926e7822393aeb91d29f1869b9f381514a0388d03c22b2f53e4a043ea6e8fda8cc9e5a651a543774e617c0b0bedac2a01e2fc574da5d805668ae9860f7576fb01a5c4bbac932df473b8e9bef7d9fc63030d41dbd837c6fa13a4edf44cc068309e2e20dad192991b12384f403c4d214278c20d3e08e79a55aa1351ecd2c13f85b83a3ea0bd11e8907b7c34aa9a9f91211071d3149d8753e938b58dfc2f3d2d68312bce5583896a040dc7417186a1adfe32f97dc740c1f38c22e72db455d708c1127228b47ad073de5fa5ee7195c3072f9f421b84969509c11e41ece90ce049d907a3a82414175066d11b1907d71b98985b6f2ede0630244c74780b2df03e63e9fd39ffd3fe0b78341ad4a2359bd1aa2eab4e07fddb446084b775c7cec263d80cb62ff25e6b32bb0846b89ff5b61ee2854e2fc3e83ec615ae34b215b93634bb196863efd200e3b6f1a01c04cd0516f51f344548983c98a996c5a48bbb0efe28597acf12bdf556e0914e1d14733f87323fe8e2cce74641b6cddddf3d241e2cb266f78c017626d81c4c44ac8f3a7e8bac6cfe05ba484ec672cd31ecdad2f8665c64896d686da65e15f3dab948bd45f214326d856cb0af5cd53e093aae79f84d61b8dbad1ae72bb75c03aed8544dd850bd1793d39c37e000b4363626630ee5e1f03e1cd5795afa1912251f9109fd11670e4fa66d1da456562df4f195aee29c0f9ad3cc8057e3a415ad212cc73761af24743177e3ba9301085435e0e215c16ad14dee9081ffb1ab8a85e548f4505f93bf716869453432d9ab5e49f8c7290caa27a69da5d461964c5f7d8ccc6fcf8e021c33e47f0b904b07c718200471cb204d5a6e037c371f8b2578e22e50cb4538be50812bc6065f8cc82430fd9a8e350cbad1d699cc8cdf99f6829ccc6ffebe8b75f4f1c6d1b5110bfabb6f6f8ac90c345b67945d5d4a63abbad30adbf3efd731b61a105d0ee136009c732f05aaafb4a6df734a7db3f1d5341c935c96a5cf4e7e586f967d030da37b146336152daa10be88d520c7d8336d0202539b480de40c3d03725026d82a6430be80cf4ac14835ea027e8387480ce40c74a30e8045a828e430fe80cf418fad25b95f157d5251f2c857511d304e26959fc676bdab8b53507d6b07144b05b0c6269edc6e4604d9b50fafbc06f26f3530d097d3bed0e017a82a5b523a8ea1295914c55252db29183f0258d3f0dbff7cb5f64f8403fc217c798a3c49726ed55bed9987bc58aaafd2c72471dcf18d9a584487b233c070e87dcc4241ca9fb1c9075ca309935c43b49d4c340fd5386c9d6a5eec8e1eddd1000f54b5ff037c4d6e40ce17d4a6d57211eefea3eb8dea61fab9901fe76f1ce76b54a39d26de5c5065c020b7e137166b922e86f3b3a6b4c82921a25309b4627e84523098ec92e35c5f99afa766bd6c23b907c73262d93c844c11c6deb0f6380d03a7add98bd9c5b8cb2b79093491783a8fcb1b2401f9c3c0bcf5478caffaee1d35692f09438065c71c1b40b43814fea31c3cf5cf4a49976f554d10fdda675fe35bbcbbfcbcce63d5e75d81f5d152d33c1b9bd6cb5cb2fb2e35f44d9157e5404e407279cd66cb2329ae8bdc3c7219c217bd374ad3cd5ebb7942e3032692fcd2924a103be1c05890f4d10608b366d288aa2288aa22806b1ffbdffebeb1f90a7101c4ac14171501cc25e4206bb06ec460ad64372e5c5eb2bd8d146e0ac31a5e74bd7bdb9b27b5b868a12084cb80f84a99bc0c76f961012dd13300ef00d537a848f21013ac208041441c410421c20888f010a0084cc0f3ef4c0c30e3ae470e17011e0061baa180afc51c554e08348278c23d5115c65c5135455957363049954458548157502a14c505515cc558222b45147113ad5f5c745023f4223f0038921e4318436aa245584f0834f8c109a203206446680c891aa9a8939e409f8ddc04f22e1d054d5b54785eae33aa3d9dc2aae2faaea124108f6f8d4a834ca20c0a41115a40f6428249292aabaf4b8f228e1e4aabaf0c0a3aaba3cf024130d7652555707525709fed2283f66e38ec7814ada11fb8daab99c7aaa830e6b22354122e1d0585230848e0a7f04462553aa96eafd2b2619d4a364688e781bd263215333e95157a04e2076450e0d54440c817a2cb41043aa8a4dd1535c19c040d51cfe3b324df1509c96a450f59fa49444295551cd9f4c506027a33328a9de514974bf86841a55f927a43aba238cb3009653525255d71a71544f949c9c52a5292412ce1292ad29130d26999abc044652b0542850d489aabae030dde0984ea52936a34a9a79d4ff929489869a4c3537f554539a32430504ae379ac36ebc7881ab0dd672fe89eb8b285575b15155d71a39ff048909268d443339a41294aabad4489dea4d555d69e0d1098714a5aa2e34aaea3ac30c2935557595718d718951fde99b7415ad0a57c5ab025611abf02a641555758551554992f4950b8caababef0a2460a0d1427353334531610aa420914d6870635a890e82b3828988b8baa4231a1c4fd29fa4a9224ec0a1344289124c9e96f70502814268da84061d2888a519512ce92124ec60e882d17e0e4ef2875aa5172b0a989d4a9de602739d8d4846c8d237172deca8b3823ec84c6cac98445ea4b36a6d2631b53a9391c2698684e89e6a6a45025d38c8c111247091968718026aaca0261cc50651143481f9e2c84d4545529077591ac50c1aa8215042b90150c72f34302c088c1118ac0381113037c81e19101062d804155bde0092fc0525515cd06e6d08006ca00030c31baa82a2fbc3831919a615441d1c4e94ba5914c124d260899d29398cc1240c8949e04635a90bab28525bac047089a88230d34a254532480055070fd93207b5c092509dda004a9220803046942844c12236492e43f0d51838569062571ee4f811add28418d6e6ac954a544bab119adc04915881f3515132602f9a1624289d44bf9d1290508066200f19840056c54d54d0845e5283d195fa0fe64e5c4a0008eaafa14ca0a2af532b8e60914c0fc0d14138df5396f45e664caa851ea64449122458a1829d526644056647252a7918c1213a43147090c89f9038eab66a92850f940823eaaaaa650d7151fa8c6168298c00844a1183fa650871f56aa4f1f2da8b0f491aa2a131f33e823884aa63492c1824ba81308068b2fb54ca940c90a238c588289256488c0824743a4f23f4922c5094a2aff131919199992151390c18247a1af823fa40518bca085045c2ca10402644a4f0a41c16498f0ec608f3cf64855312038415585aa089b098b9ab752494d902a4e0448f5a5fc294a3d7d3d5108218410bef7de7befbde79c73ce39e75c6badb5d65a6bddddddddddacb1c61a6bacb1c61a6bacb136e79c73ce39a794524a29a594eeeeeeeeee31c618638c31420821841042f8de7befbdf79e73ce39e79c73adb5d65a6bad7577777733c618638c31d673ce39e79c734a29a594524ae9eeeeeeee1e638c31c61823841042082184efbdf7de7bef39e79c73ce39d75a6badb5d65a77777777b39ed2237cae3514364eaaaa320202554c1da4d323714748dc136a8ae9f454729a30d1fcc8094cc23151818589f44dccbc044ca725557545717a512a652a95706da2aa2e074861a241595155d5d580aabaa8944ca3992952e4d4270ca8aaab8aaabaa898a2aa2a0a5f4a676c644e33a893890695bac179294a4a4e38f79a4a4a4657464ed41f615b51385606854b384b528f42e12f61516f5029d4e84f9f534932a42a8702aaeaaaa9aa4b4a8c1c3844f99289a6aaae28a254d5db98a47c4aa6844304eadfd692933fe1a47032fe54c5279c949511a54e232b53654a28507d5b4920fc49a046174d555d5054d5f5e40907502a4ea4849ca04e4099a1a12129a04821050dd127539c800245a80a25502449a2a4f4564c354fc2c126282413369f7252c544c24ebe34aa52a2337130a04a69943a99ac1219d0cb9ce0d8c2d52a0f1031845555153e5979c0e1419d4039368442d59b54a9964636a3d3458db08c0d4ee9655036a88a858ca949555d03104055a1aaea0ac0058098aaaa9cc04faaa9ba048f4c53e0ff9329759373ba0e78303e37722a0adf47a54c2454ca4492f222ce0daa2a747353932409dda06643d84ea80bb8c8d65360e468c388aa4a922474836a238eaabaa962d828037502a54656b60ea14e7f437a916c8dc3460f159499aaba8c14219d4ef49a4824250638ad61450d16546a742a292328aaea82b95cba48a38caaaaaa9c864cbd412227859242c6a6caa3644429254992541e1eae97cba5aa2a205ae06829038d2767dcc08c2caaaa0c1754321d9950194dca68525558d81764cc20551a996e423164e041c61b230663e8515551da9524499810a16a1325aaa0722ae971090b1326994c3774129dfe26648353c2a6e670f0a8aacae184f143555552ac89d444aa963e556fc934839d24490246012ad40934baa9a119cb8e982f2810c41702f0a20c5e10a1aa649650424626c91557c8a450f5e60aae5e7c192a8b0c63a86c6e156370d145185d20e122072825f86d3ee5c4e6534ea82835a2620b2f54315be4515520fc4ab6a8620b982a92a94ab430a4aa2a102a468b35aa4a063787a3c5142daa0a74329d4e4f223d16a82a63c4e79048385906f54d6471a34d5152d253bc145948a1aab0789a982cae10a28ab140162c70c757a982839231025545341698155841a5e4a24650fc2f71911430a4aaaacf3257a04a38a12b56ae287d4d95de66743a22e7ad549537e881d811554ca43054950586aab2be50c550200f2f50a180120ed41ac48e2861613a5911aa8a62288003058e54a65c7222811169490ee9e646c9a3aa284a0dcafa4302a46a94c415a19329748508352a8db24c13a81308951ad968a1aa2a2b0b554aa3534a4a9224cde13081425552e8f43758aa8d1258aacda3aa65a2391c25b0541b2c65409d4022541589505584e54955a54e26114ac6644a2579d4e9affc098bf57f5a527a2ba6141439350aea1960a2f1982b77a04e205c251173e5559f427d2974fad42864f3372824ee5f89b98203a9e2fc5081402021524f4291fe4a12d25f79522849555952b0a0f084aa42e5d428ff3984caa937285425dd14ad5030a8624e50d0346957922499e20911aa36618209254835553231114a92e447a754e80615fa2a289b9aaa98a6391cd30748249c25261a27ac40a1a2399c4a0a914c261b423d113246d89451e55412e91092953eaa1063e5357926885022630476a2c4fd2988680e47c688e67086b811b00945c006432088aa49555577f820662463442aa8aaea95a04650a44c265c5f0a52c524292f81919492931b9b53932af4c6e6d4a4aaac43ac1ef0a0aa42212954e8400086704802ec800213689007109468c0005cb280298191981214a2860c2012b84a5a30010f5e28010541d4e0c5933880486386760139fef8e3882ce0e0060e3938440f272cb0839a319628824b5e424c86b17260e1a0aaac1bd820067f21060f52c5e0996a0c5e30954c3407b84f40a947d1cade6191e45443aaaa62a9aa0a08948c4583aab266200342aa9aaa4ed4547522e68a19c45cf1e40a2455f5a8d37f951a25261445555983c4a0b26050aa3222d597c00895c231e5d427d515b25c51bdd8bc549e25aceaa56a89b15eaa1aac961b2c1a2c98e6f1aad386c787970b06a6c5d3b1ac8a0017a8ba2a2b0a4f02acea258996eaaa2ccbea5c4d2cebc5ba2cabe32281cbbaac97eb06292ccbc57aa92e6b0650e7727119c2888ce5b92e4f1a96c7b22e2316172eab48d56279aece5b16042ecbba60a65c3b5cd6e5e2b92c295c96e57259515804b0acce05038396ce0b0dd60d966559d7bc0600d3b1e8b05c2ecbba3a21ebf21829f22e2416133056cba7b384f5725d9eee18b92e8b881aa235014f1f89e3aa3cd5d501cbd319c2d372599daae5025612aceaaa6cb0c186caaa2c8f755955b060ae222ceb6ab9ae8e65390b090bc642725dd7e5326309715d9ecb621dd0911c600e60cd00001dae37ac962b07cb6375acea8a72c918b13cd53572a964aeb0cce85440c0c0aa1440c8d5b15c2ccf8b3583d581e3ba6092742cd9b1aecb237321293284d562592fccd33f30eb32e20273599665bd585612ebba84d071b18a5c9ece15ab00178e65758eb08a1cb92c9817eb52c0e5c3e5c3d543a7ea54560d96cb755933786ce878ae1caeebb25c2c4fb68a7cac232d97d562d1e0966559d60ed7025c8e14b92c0b83e4e5b2a2b0602cab73591eab89d5c3352f1eae23d7cbd56275accbbaac24560fd791ebc563755a3a96e556c71ac22a6221b12c2b09cb87cb48e7c582f158976525b12c971b2e01589ecb6af158f33a62752e1fac4ee7ba3c97c79ad765e97019b18a58309ecbb2ac24560f9791978ee581f15896e532160e45c028d141408bd5b18a581e1cac2245921c69c00e3e5806f058d7e572bdbc65c300d8912696755997655947542fd54d454522d615a82855325320e109864c5147124430a522814941c2112a2980084215451d3af8286a2155943a0291230a102628509000812b3c01c2072d3041020f6cd6810312b3d2000247c20c1f07c28815916091215e91c81c51a60c15e80a31f870c415795c461cc103262364581108a0c3082bfc70850c921f640800808a8e0038a0baa2458d4ac6c34565bda0aaa4a0e289980640e1d28591206c90a5c80b0c8c8b11232e2d473a3d1479e9b4740680a4460b9a02c00ce16204467a90d4607990bc300049aa3343c786961f7081812c2e345c2f453c46ccd083144116235320c11e2368d0e27a3bb44cf1582e4abc20cb124f9c88e1e2f218f13c21c20b598ed085d59224e6070568717974e81c714816042021cb0f51ba18400d4d78d161a20518597228420512016020cb9201dcc0a08c74218b12a9224cae58c38697229d195aac78c428430b184f4ce708a78513ec2852840fba80f9c21b345c475a1410f3323d4f7c03fad822002d43185962e4002e56788a78995ba4a00e265be8000d24ba98e13e192306598ee0e40c703143abc13a41961ca216465ea68b11181a3aee8449a707234b5eb47032831498263bd025468a344122052b91822c04f018118db82409c00c2e468ed0023cc003598cc034f1c19291a5a563438be512858b9196245c8a509280233845848069e262e42587199c28f2f1d0142180007838800e37140133048d1407d0c2080ce8c5cde0dc499417249e171d5a92746211241e216414f052e4c588078996273c520156cb0e1d205a6e6045606e67d224708031724311d76286e6c88319c2f3f17c5c3e90a5081a3c4eb420a0c587221f0f0f3574a7872db28090b03ab97384a7d33281023c800d53890f1118d2823ef8f8c01d636451012c282bf9ef150fb0824a15534c9112e5c9029a24916e8803046100190f2183246285293821014c0451001d7278a1030737c0c30351d00424e96100488eb8c420101584200f3ceee0401d74c8316508219000650003898c610b968a15aac08290690d34469989248cbce4a1461a5e04083fd0238f2433124000478cc0bcf0b0c3094c60c56328340b70b284ce7186186000e00870057c88e00359503185471c04e0d181215a98828925629117173fbe50c108ec70830d3226b08139e640030a0d13490881c412c31586eb0b9e2bc854e17a82c70917125a8e6005e142e4f241914390f4e0d2c155c81548878fcb8a0702d607a687161e66c8e122c035004b0031016801c01563d9e0a1e13ad262e42a020373bdbcb45c1eab63592ed50c357476e80892c5634616cf13972264ac172e68618307b2b4b42079394010b4f0d4d11e0220b903042e6364f13c297283111e70e0224b110678a8747c3892724102b30446ba18e924818391161b64814141160158a14511efc891052446c8d292489616243af8200b92540104c95204071aae97245a906869238c011cc9e18d2d3c6564a901881a80e81c1183040c0e31896cd1820018f9a244a7868e12307764e940d148b81871d9234be7888b0e1e238e74c7f220f1186164490b025e18e0a2838b111708201100120114c1a1c80d2f0ce890610b171d3a7d6cd132832c4140c06323130aa2074f122435b8c478acce119d194f94196e70b95ea878d9e185a6650034582e473a2d1e249d4ee7eabc74603a458cf0e0e9bc4c7901400d518cc4bcb8bc589d17cff320e1b16072e8eca045911f5a409085863db48871f1ec00e3c4161e236c5180904c9548199c00841fe8c0101acc00a78a1435d2a04d2460093795ac50052484b0a10698970650814293480e7ab0831fd06070bca1000c1801914264c08213f0810712a003b88193420375e20216ae3084437a304809b2b0c003aca05205141a264b7ef0810037040248167c88c0021508f5c083a9f4030d462842046cb22452062f74c18a0610e08618446440880b58700213f881c61962841ec0002aa0d03829240784e0600570341142100ac9810c066181201eb8830c2fb8c0c21510398405820432822eb23c76426366b802139660041a0c02880afed0430d331e871e604503a8704293484244cc0c85e480067264408d2e1e3f60014e96d02492d03083a762c2120ac9410d080144057ff8a1c71a6774e180053859228924fe9a0800c478aa4498b08422d48006840c02880afcd0630d35ce30a38b24841c60450290008d410c4f9ea8810622f090461964544105b3c30c3272b084a048229d325c646811c315061810783e70e971e161b5ab3bcc021d39a283808ecc0d3f5c3c583bbce8d0c9c1c2c14300eb8622010000003a36786a9881061b66d001490e4778301253e405c6e5e572716969e95855a543cc943d2a92ada9d2e87483c463d31d9570b298529a9263a628e00a9921644a23999f1a26ff8408559bcc7c20749d0d5860a0f6bb31af8c4938edfbd85fa0cfcece8f277e1cdbc316798340ccbd401db28ff66795afc60babc8dbe65681c5d40408841f8bc9b2ee026dae35f37ce163ee98ecf6b8401daecfe593defcd93aadc81b6e81b6f73567d7dc94cefeadc83b340a39a7052af1f4db98633edd7abc5e8795055a2fcb35e757bd5d950f8bbc9b062c2cd0970fdb0b5b860c33d7b5db15a8ad51c6875b8ceda1b5ee56a0d63efb6c5e18f364b9e139885505ea20ce96bd8dafdf94ffa8405d3ec96465fda04399eb1428ab2f27bbb11b420cb1b70b2c29d0e6574e79bdca5c1b64320a74e23ce74b6ce77dd59d590b0ad4e26ef9b6b5b33218ad8d4fa0dd1c644ff6bbbbcc62084f60398146f75ca7cff7f6c1969bc87bb6e381d504faae3ec70ff37c2c3b144eaaa65012071613687f8ef1795bf8b26458aa4da875bb1a584ba0d63eb373ba87ebad13db4fcd930f08e42d104b09b455efe7da7506717c805849a052fee71a61ad2e3af62e6c28b090405b6d0fe2c85c66b8d9d834ad45601d81caca1ee7f8cff6f56bdf08f4336e2f1dc7069fb12841a0760504621dea76a5a1261e56112894f07d3bf83ae7d9e41381bafba27dd8dd7a4796dd102874d931ec26932ebe978540a1757c23fb8eb55dfc5a1068edfbfe49981dcbf97f36c10202756d4267533679fb5dfb033a61ab6eabd79f36573c45deed32091622f46774fb12777e1fd0fb6cbdf8bfc597ad6c671d42f3cdb3a17c7d5b73385570ec3b61835372299b6c85d5036a6d8cd53d77edab8c4528f26e7e88c5031a236c3bdd7b6ecdd50745de4eb276f0aebd796366b33e27f2fe60c7f9fc09076522dd8f759c4f48b6d3974ab3fbb074402d7e0e66e70fc7792f7c22ef902935732c43e86cce65cbaeb266f2d92f84c207f185f235db6cbb9739a0d82b7399b197f3c4525691c441bdb362c9aeb3af336636a6530ee5bc95526c561cd60da8950cd7db38c7e9acac4ee4ed50960de8f5763bfb6ffe773bc776b26ae0ac5df7aa64d7ce57ed137947d89a80402050fb16160d5abe63f0e599fd9fb426d3893574ac4531ac195016eb95173acfadbe7c121e854a267f127612e30c2c1950f9a6c7d8d9620971bc4e08f5165f9ef539f93096cf7d103af1c4f96f94ec75cd97c580766533be6a1b673c3d6318d08791b9fc9c63533299db0b287b154797ccbe73d94a473517d09f2dbb16636c57e374794e61b580da6ba7b38cbdf9b2a5e399018b057446f6f03376ee6164d1ce10062c41e883cf5fbb89197bf5a550383894734ac9f685b502eaf7ad740f4a67d3390745de2f62b102a10ee689a56dee0dbd6226f29e645880d0ebd519bceeb23eac9089bca500bd6e62582aa0ef7ddbcdd759199d752df24e017d9755c6dbac9c1537f622efd367696dc142018d2e31ce915597a7acddb6b04e406db776f5ba8bcdba7b28f29e5716cb04f4efcbcf1eb608237bae89bc4976e4a9fb37a8921310287709ec9d2ddb73fdee5de6a4c849a40a024d784addb83f6873eed833be10b7ebda89bc592301f5b7d335f6fadac3be50e43d02cae63767bb32175b76f28abc9f1fb43d8bd1ff5ed65c7fcb22ef9c4a725da534b232a1d5c77b8c4dc824be36cbc8a2c8db8ac92422e1516b31b0f8a0d21bb3584a97def0e127f286775822a012defcedf56d5f258c21a0f061ff87184a26ed7d2ef27633a2d4888acfcce733f34961f954c934f399f97c663e369f42e53cd6700ffa96493c63735966c7d3aac00201f5fbeeee9b1377bcaf7d7e29663e33b4891f9d6a1a96c0fa00b5ee60db2bddb91aafb5226f532ad4acedb0f4a08dd57773e627d9bb124661e541bd5ee7ecb6266b7ed3fdc9743ad179010b0fead24adbe43738dfbf5ca50c75f400657f99937d9fb129a1bfc83b64c22e02560768adffaecb5a9f4777a18bbc4326dcedf0350d9590c9ba83b6e66674dff96f672c5be48d7a562c0e5027fdbd8f0feb7dcfb216f9941294d6ae6d4633baa6a11282806507addebc39c41347183b3a917795d228f6a7860908f4a961f2c9b933201008d46643325875d08b596eaebefd3c9f671779a7706c428f04161df467b490cdd8af5f95b38abc2d0ea12a6b9412e7c3da00c5d1e2e6ef72c6ac7d7d226f39c7c7872d4b38dd657f5fb3d2b0e4a0d75ae60f33ccdefbec57e46df3ae015a2164cf5ad7aeadee5e29f20c50d8d035577194d97ac37dc5c20075f57dba64d3b507df75228f4366f8b1c987fb4af61cac91655870d0c93293f8faadb9f6cb5fc57d6a988850b5890855454d3e331f299f9a271f0a821db0dea0d15566a347fcd3b3bc56e428100804ea2b2090cdc5f26015961bd4b2e6acc592b12a2776e6feb02e402786d89b7ccd2b83b2649250402094159349a487d5069dd3637c91c5f8d57ece22efdb2654c934030281429faa120704ba7f0504facc7c963cf199f934e104142090c521d63660b141a36c19df1a25b4ce239b320f6b0d0a3b7775d3461873869f45de210802b91a14db98dd7c5f59c311e609e9b0d2a0cf4136e76cf2b267f17d22ef50a83592ada5291cb0d06871be19e374d94fca8eee2e37c698c566a7cbde5a8bbce367e6f3a979f2018140ad430defc875609d41e785115ffc503a686f4f9177080402f51c9619747edfd617e3f739a18522ef3fddb49ef2b1e302ac32a89d2e32e6a09453c2fb960cfadaed38abb517c36fd3c7a0b1599ff5c29711be3c2386381f1aeb703e351f0b719c5bc012834e97ac737bade1e996b930a857f66273153e081d7606067deed9063f370bdd5af7bea0b53de3cabaca2aa7b3368a149f263e331f259f284f3e2fa2483736238863794159d7e760eed8648d4ce6bfc949cd4f0d93cfa786c9073bf9d43cf980402753bec9a9018142a41b9b51641dead768a884ac0f585dd0e68d6f7539ffbccd5a2cf20ea5be8a9b72c9c93301814020272010c8b1a6a112b2dab0b8a00f4f26fdc67ceb6db6cd2de86d6b23841637c9dc6dae0575cf2cc37266266dcff9ac2cd4426fc7b9e1eb6e75b23f354c3e201008540584345442a12c6874d0cd171bcccc5dcf28f28e09b0006de7ecbb18fabd5f619e15a08eddb7d7b59eaf7a5726f2761d9950805ac8a4f7eb89a5752de309d077aed93c276b2ee29b2540e36cb359dca2c3f939f77268b45e5bc5ee8eebbdeeb0d0af5f5b629b3dbbfb6f2a85b0a09731082163afd9fc7ef3151aeb6b9c23acd34e6f9b712893b5627f67f0d6ae32a728c4f319ac5fbb61d6624651d913ba679f73d5df6df944dd627ff7e13798319c1f015a1b96f37d43eb0ec68c6fa8bdccb1576c1b42f62e36515ced7d075bbfebd2fd9668eb37ed8d56ce78ef84d786fe7d1c71768eb96d785a126d1b735bf6d3e2aeb8ad159abf3597e7b4d96ddb5b214031c4f81bbbf7e7557a1dd18e36bf3c618536e2ecaa88661cddb5ae73cfebce6a15dad66618fb6d8dce6f9e9966d8fe5e289dd996f5e7d3fa6ab53e7f3a6e167f62da7af64f0b5fbefedacf4badbb6d616bf6e463b7d3d2d62ebf6899bbd0c93c67a516378925acb03af738ce2ba86ceebad86c6cee666719a28f41e6e6b319feb5f7ca0750f69e6def9fadd65aad7400ad0fda985fceb7d9322bada032ffb3bf10be37bba56c007d15d76c219ed8f1652da9d0765dac163fd77f5fbf3380e2299be16ed6fd83f57a15145e18bdcdaf315b16a753417d5e88dfba64d1c2077d0afadac9f9beb9bded91f9143af1840d4fdbe6b3cc6eaca1b0c176b1e66f96a19b510a85b14d083d37d920b3194a415d7e79a3f5ce51503763ec98ff4567f0de2854ded62264d8b1674c3a28144237ffcd089d6d8b69a8bd36d6fb7f2786d21b42411bdec82cbb13b6eaee7d425bcd354f3ce33306ad7c825a972ecec7d3ff366c6f01d4da5c6db3b5c5d61acece09cdf2ca6ef0c6f7dee0b54da893edf6da796b7bb739136a199eb5b6ec77f03ae696d07bb17c3ead7d8ec1f78dd2e7a05759bd21fb3bb313b4e2ea6694373be95ac2199a6fcc30c7c693356ed64dd0dc984d3927930d7fcc4a6885ad36f61aebcc6eab0aa0ec7375b6a16d5f31f304d0d9587b0cfb47d9a06b26f22e3d2974ff4a68360c8564d350092d6182ce18dbfd7a2db691c1cb723685e69325e864d2abbf9d1133091f5482bedbccee9dcfbd8bdf2df20eb98eb1ef5f719204cd39b21c3d432ca78dcc89bc43ad63ca26bb98c4c6640a5539854230937a6bb7ba26677e93b13745de2197924e5763beefa2739135d644deeeb43de758c40dcac9e6e32bf2c6c274aad22dd20767b77dfe8fdf6dbd22ef530a0569e7f7647691b98631ab56e49db2c973caa3eecd19ffb16df1f66729f20ee1520d9970376780a3ac5a581b4bf61a4fe7aac85b84c2b9099d4c3914957c663e359f9a279ffb536051a598ed4f1a9d2f3739af64b936bf8d89bc4f5574430c044ad96410e84fa64b450ac726c4200d9510154ddb3b9bedc79a31762cb1c825ce6789149f4fcd934fa834f2764add2cc168850ebde7bcec5dd6c722efd449cabe2612490148dcb7d56b76f76f998c55e4fdb7649a7f4b504a4ba244dd985c0dc8a78c0e6173fea0bfd98ec906d95c21914094e51c65aeedc95b636d55e44daa573e9442954cd7bb3462fd27d37d345442538ea0ef5ede8ba16dd0ce7728f246e5bc95f9a99aea6e0d69a8849a3082de86d5def7a6cdf8d99722efd3971040dd4e2959756efb55385de48dc2ffa850eaabc0fed43041d50f6b381f29528040211b132ed513a87e6a9e7c426fd250095961141142e19c42211d88e8177b18028b098b940f4244d8640ed0ba8a64827021f611c20043146008208c9011e287227c603d10c183103b3403e8100a22876663baa13f85426d25c276731fe538848620402864801bb0549b1f06d021132954a534aa52c544ca410032012800006c7c8839995295071b4211b6507b2b95648ba8a10034c89cc2e961860ebd28c40312218ea07230d24ca6930e458a80c1f54f3abcf8e092fa2a39b4348a07cfc8c6c63444a715e03ad527dd1dac0e61791e2a1edac8410d1d586f534b9e1cd60003c9914a890212c0c4124a249124493c5f50fca07338e5ac6f61cdcce305cded62895fccb6beced58240cd21e0e9a28126cac345f36cd1ad454f4f968aabb777372623084422bdbf445a97a141ac43068aa5b50f437cdb6c8fd5b844090e14a52520100884ba31b9189d3150b70f1966b93ec6f85d140365f1b6796dcbec4cce9a9f934e18a86c304efbd84a086166100c144e1be584f56173d732f705fafec9e86a3ff764b6b875bc401fcc195b5663c5b8cdf8ba409bb5ce323cfbe59c193b2e5026996b1743eb5c4ffc760bb42dbb72bebe30cf2c594b2dd0581d6cb81f6e3cab7c2e0bf4e176534e26a1cdfdbee11b1d2cd0e6248c335acff3be07db1c9d2b3c881dda6cf1b4b942f7ac403fb38c3dcec9ee8cd6c52a54db9fdfccafb267df83a04305eafeda67abb3b8ba973164dd99028d17f7952dde7f9949eced4ab3995074a4403ffb7b6edbbeac8edb3b059d28d0cca46c7da36516051d28d0066b85dedf6caecfa32c41e709344e5b999d973d9f19df7602bd8dedcb7eccca5b3b5f2b3a4da04d5aebfff73993d73dc87a8f0e13287ed8cde90d7664b1d5d75942831ed051026dd0f957f9fde0cbd9a3c81b8b2f55a9a50a4534a493048ab37b17b7da60e7da70eba08304ea66fb76f2bd79edcb18c6ce11a87d5bef4fdc5ae7d6f067d73e354c4a50a640a979f2510202411b748c407d42092bbed1598e18bb129d22d0799dfdeb1a9e9708f4e63c9bdbbed1615fd61902b5d0e7b7c7cfba3ec62f042a67752f7facb8c19ce30781fe75d5bae3e82d5f5c2f10286cb1df19abb24a9ff2fe80361cbdbee9ea93b5d97811a1d6c157e7637663db7ed60734b79536bf63f3bbfbd94368cc7f2584aec1866d67ed01adcd36773fa3cbafbaac3ca08c5977eee493afbdc37207d4df73d5baf96e6cd65cea80dabf2fd70c1b9ef1de280da1b23dfbfaee337c2e5b16f2b07db5ee3526734073c337e2eaf89f9439e3804ec757e666bf4ae81af41bd007dd63d8337be6b2cc36a06ddf5d7495b98c7f3fd680f6fbb76db2eafab97f1ad08731ac53c6be2fbeab7006d4a1cdb97ebdfe5a9d2e03cada43bfb84d9b9b6491101ab39badc6286d8bcdfa0d42237c18fb5559257c19037a6bc73ba3c417bbf7240c689bf2b2665b647edfc3f6029ae3cbb1badc5e8cd705d45fccd042c7aec3aeae0534de19ffd6cab285973516d058319bedbdbbdd0d760b426d8cb5b5fcd0ddc76a632ba08d490ba56bfeb07ce97d6a9880a6f8cc7c9e90728383df89d00d0e7e9c4727109af38b2f637bcde2886d144107105a5b632fb29c197c77b10dd1d6f0e8a88046182fcc574afcb149d8697452406dc77b674f88e36b9b330ae8abf661e86fda27f1ac1004028126bb40e704f45928e1acf1fe63365a07028140a1ce498d60b36e6d02ead8c3d83eefe9dc32c99a20a453025aefabccbd96adc6fc194a0c74fea06f1f74ffaee5c4f37e8da34302da58cbff6a597e18368847d03a7eb44e1fadc307f56aabb4d9662c59cc2edd8d8e08e87de8fdf3babecce733364340ef7cae1fd76b6b84bd07fd7777fdd11f6cffa4131d10d0eace1e7fb3afd9f82a8c8d8ace07e895b159289be36775c25cc279533a7ad01865635f99cbdd32942f0ffa72c38f2f6cee5f669689bc73f228652a9d5a93d2c183be2c5f371b6f6317d6e6e0141d0f50d9de93d72bf3cfb06b751a2aa1ef7480d6c6306cf816768dcf842594ce1df4b5e892c5aed7ba85d0a1191d0e509f6ee2791be6b7d045294376505b5f9dd133f61be1c479b2de40a70eda70c2ec24cc2d1f76d6d241b3ecd9be66db98b3662a753799f930faa41b9c9a4f94271f343a1ba0f3e39c4ffabdb7be8bf11cd4e58e77f6e376abb41d45def353c3c4c6745a020281402050470e7aa3740ecbeab5da96738bbcdb191d0d50e993c9265b67765f628b7393011a1fbbcfd86d79def66216799f4ca1d45779cda48301ca6e9b76c2db704787bbb54e1c54be6e5e596511dbee0aab9446928d0e1c74e65959c6ef1be21923f06d89149f26e68dcdedbc41ad639fe19c76dae9ec9d22ef36f37971e623713e519e7c5abca2e346e702d1b374eec9c6d5f32b458092ea28756393a5d346bf53878d06853a6bd0f74d4aeb5fdbabd1ed8bbce6c9478aab1d35e8ad59e60adfbfc711c69806c5cf3dceceddcc13de3845de5d32a1e16093ce5d63b3cdd7ed9e832d73bd8ec1962cbee94ce40d4b26d20c08f42513e946f7a273067dbfcdcde92e83d0766432898e19b471b3ee2184d8bee65e157937aa5306adf0caffd9ee6f36c6950c1a6dcbacd68ab1932f5f8e412d66ce9ecb2d4691f7a786c9e7c67472020402a1947cca89295572028aa98e18d4be1a276e8eb1bdcd33ee8441a78d2f67bcdd707ab3564f1404aaa7ef8041bdc20b9de777f90b6a71b4935d6fd7b61d7c2f6837b72ccf795dc56eda2e68e7671367dc8f45f9ef72416795ae61c9dc94783257b7a013b23aad659f1d7cfe5ad077fcefdabd70ba58ab77b25036718ccd9e9db6ff7e2214b20a27acb76118676bb00c74e2376bb550b6e7cebd4b068a5f6b90bdf4beb1f5b563a08d3976b2995f2cfd45e7a4182894d7a7df581f42d90c8681ba965994b6f95767d71f0cb462096386ac7a9556d6fb05fa3e46ebddaa8b0e5ff602ad2fe59b373767cee26abb40dbe6ce6d3b3609e56bc905dadec57e3f7f93ac31f62d50d8e26bacc56c3b335cb5405faeeed964b0b3932f6316e8fbbf86f932bf0de2c7027df9b958dbfb28bb65c8aec0707c8c1b14b99c725c5688de7562e9b57a96b3795701b78bed84d03ac6166791b78c595c5468d0141ad497141ae43657141a048506a3add345d81f73ec9beb09ed04f64857131ad4a88b09635c4b68d01a9712e83fecf6621673c52cce97c69504cae45b0c639e1823817673315ff79c6386efbc2d8f40bd216b38656cccfd3b69042a6bc6d146e8306bee569681ab08145ff88dc59ca76b0eef13814aebf7e539abec37ddc543a0b759fc66c5b5b587d0af10a8cb9659e66267f6eec353eae60a02cddedcd7d7ffb263de1e6b382e20d09be7cd2e5bc7d1bae8cf81eb07f43577d9edb6d5ecef1f11fa9895ff5876cc4dc61c08c4e43ba56ea4b87c4065646ebd4d9673cb7836d6a17ecde8b80ea12fcaf76e7dac357c52f6804e189bb9c7d8ae9bb55653d50910a875c809b978409fbdad595aaf3e1f86bf03dce4ece70edf6b75409dcd75b67f6d7b5e6beb83020402815aa3a112baceb80ca190d58a219c2ec3fa19e642a8736be38556deea4de680ca9b9dcb7ff83a429f1607b4e2d9f5e67e3799bcb6af1bc48e35fe37f7627bd90694d5dbbe76865e676b666b409ffc3671b3d5c677582b0d68c4f3d999db3d99e5432cf29e01f52ce5bb87dff328ad5b19d099db6cf7e0b5dd1c669310fa1cd7576d7bb235cc2e1cc4551b61751846d9a2631e038ae3736ea5b5f3366cf3c180fe6bec3e870cc68ef5ba175039ef4b689de5d9f67efbe372018d30cac720aecc35fbdc4a4dbd115c2d6830c3285bbef1d6fbacb280da39af74d31d6eecc9e8c725c8c3feee7a65bb39768b2b98764eecdf2cf7b4977920b7d995cf7cba7c5dc40e48fef9a4bdf7659b8e61ab027abfa77bcfbd627c5ffb14f864b7dffdcc6e43769b940b05f42f94ffd1315c1ad5136e8da542f199f994a07c663eb8347a22e7f438517c663e8f43aaad73fef422546df299f97c6a9e7c584340ae13bc7bebcdcdf6c5d3a309e03bdc2a9393d5ef6753e49df35642b2c52ec1c5cfe67c9eb16d3fafc8bb994cf199f9b4273e339f7ee253f3e47353a148390181e64db5617d32a5eab40ab9fea00ee34737e3b3f91e6e2ff29632041709464027f36ce19b71c666b7569177fdcc7c6a9e7c4020e9faf2835eeb1736e96e7e9fb1e33e68cead59bb8f5964cd622cf2d4a350d55171f1c12e1150281db6796b6b2b7f66c8da035708e23ff8dee267d7d75de4ed3075ed2121734e7ab318fbb1183b4a1050977376dc6c6eb0b66657e46d633ae54f0d934fbb62633a2dc939d58040d70768cf06e5ff67c7e273353f088f4b0fca58bdb0ef8d72b2171dce8356e758b7bf51caf78e170f5a6dab7fe57b77dc8d4d0fd09f92758bb9b6ffd7d6017a2fecfa0de2d60e5b26efa0ef39ebb27b36dad916371088492f2e0ed058efb5195a565dcdaebd1d14677baf74d64ec9be555c07ed87b9d9f9f08ccf61bd74d0ebb0661b6f9c1ba0913de6ee3d4a076b767350e60e1f3b6b18bb71b372d01c1f633fedebfb7fbb6a8062db8fcd37fdd6d8f1ce0cd07f6da7dbc7b865dbac6380ba56218cfe30b4d0abb73828ab15c728f3c311c2161b0eeaf2c42fbaf3c67932b7ee5b5c6f50d81136072bf6f66d4ae6066d73c67c677baf350c2ffed43cf9804033d4b0af349b8bc58ceb02b4a165b0d50c6fb50f563881ab0d6a5fc43263e69ae3ff18e7c5069d1e337b50da7735720dfaa283f659e7f06d0927c4c234030261613a9d5aaa41dd6bc3afb54b7cff459c2b0dca2a7bcedcfe7c1256dbfa53c32465329d6cea9f5252d0a0f5cde82eb62fbfcafaf80c9a1f46d898b13c1d3bd844de24520d79fbd430f98444a99bc7345442582e33a8bcf562d6d865d04d875da4a112c2571974def7cfeaf3ffafcd6132a8bc0f470b59bf17fdda31a8fcf8b5ba68df4a5cdf1583e65765abb83f36ebecab6150e6cc7e851066dbd73508066d09f39496bd96dfdfbf2fe8336b9d47899d7d565327132af4554e6fc31a89cb0bfa20f4cc2ace193af73952b9baa0ff10da7ed65a19656bf5e282e628ab63f79c93f3b6eb06a35c5b50662b9ed161d68db9d8fcd282fa3b7bdb189c1035bab2d02cdd3f77ec76cb7036e812a153d69f2f3fd75abf752ef27eb20c947db5ac4edc5ace3933dc64a0ccdd37fed7ea3fe9ba8140d001d618a8eb1c1b73f8be61ecf213f927ca93cf93628921c3ca1a6ef6d6e8acb419ffad375272fe897e1d225861a8d23537e38df3fdcb53e42fba75e647a71a52bda62720d04c7034c8e58dd6e6756e5f6d66f3edd8ed878b1b7d8136de1a2e6c50882784f959ebee5dc972172e6bd0fbe4cc5f9f74f8d86237b770518376ec26b16bccb28d95e5990695f2458cb18decbac7189e68d0c9aa95f82f7689637b3c83da792f84ef323ef78899cce2620675fd50dee89acbb86677b37029835a67a7bbd5350bb1832f4a0ab89041aff4e6667c9effb1e9f21854467fef32b61ee1eb29cf7011837e7e9fd15597f3b6c71c069dcedab9bf8ead6338633068ecd622c4ac36f758c3f90575f76e6d194b79b17447868b17944536db9df34d2bf2d7af452e5dd00adf7459be29db65f0b53c5cb8a0b9bdc6dade6b72de596b025cb6a0b76b9c7e7374cfd8662da874ebbed5b6194ae857ba64a157b2f62a66ddda57cfac25117afd6b8cf739872e43f9b08da0a50c54e666fbd9f7af7d9b8419682103c5b0cd6fef3df6acf46676b48c81da8cafbbb786dd4206b11868ae2d376b52ced8f0b70982963050076fb38c35cfecbacf9f528e1630d08ef0df6c10e79cdfb6ff02b5113319e7abf2a33bc45ea037e7fa97658b33837d6517a86c6d65848ed53a9fab920b34bbdb9ec48f1b76d356df02bd2e3a891bb30e7aab1db5405d6d0fe173526681c2db73428fd95f7cfe2016e85be86c8e503a77eeff0ab47533db2dc36615576905ea9d99bf695bbb3eb1ab0275ec3abf9da33f7f9935445aa840a595d05bbccc277cf3db0d5aa64059378bdd6331c6e8aaad91028deeb2e96e9d84f556e651a01136bc787a63f8c16c1b0a147a8e1fd9c4cdb9d7fa04cab07d36d6f7a6958dc569811627d06ef2be78a7b4d66b65b809f4e6173b6278a194f3e365029defd6e7ea6ced397fb54ba0cddadbed9ef9dae8d52a81c27e891bbf096d1268fedc0ee62aeb3be8b62281caeaf939e9aeab8dd6cd23d0f72f197b3df3acf1b96904ca9a5d3b9f652beb8bd58b40b18312469665cb8f2f8b44a0d3b5abcd6d7e9eb16c38043a25731bfddacf0d4ec72d42a0ef7db68b8fd5ebf2dd20d07c59fbea17be1c679e0e08d4d9f61ebadc5c95d6c2f6032afba5adaed5966de78608859deb7ccd9afd3671331fd006f39c2ffaabf5102c5a7ad0a06cdeb1e59c8cf98b8db5f080ca7ff3d91619ae2ef10ea895107f65ffde9bd9c6ac03ead9e3b4efd63a66237e86d09fb5c1596fc37ea193b5107a33eb68af9595593babcc01adf85fec87ae2bec8a714027c31eeb947f6f6eb15926c567e6c3a2f84479f221ddd88c424fbac1498562cb0de85768b1abd361c3b71fb4019dd6cdfb72cb7c99d7cc6a40fbd6fa3e6b677b6d838e06d4e1c818c49fdd7dd6626369990175d2ad6cd1626ff8644719d02a9d83cfd57a6b6d2ba1c89b10caf275d839573184595a06a1af326fd8da0c9f57ec3506d4796cb341776585ecb208032aaff3f9deb16b2e1bba17d01bafcbebfcb67616c316798b52232cde353df19eae5d40a374b5f68cde8cd5eb2c052d2da0f14dfb9c7dd26216d01a599bb0d6970fcb275b33418b20b43e1865fe7f0f65c69f5b56402bc391c50c6f74d7fae24fcd131028d4718f9640a8bffa565a089d63f5ef8f4e35354cae1420d03dcdcc7cee4ff1246b473420508a84e3de6801e4ddbb94ac4596f34f78d1a2022a21bc19b7c8b26b0fe29c02eab2c40ebfec0cdf96db45016db6e38c166756e7fb8c27a052b6c9a6cfda2fdb33fbd1a9e6a55a4c40677bf2552bdfafcd7e6d0968759873b3169d9c13d6a6a1122ab5fc41bdfa3b7c0e4b46028ae3fc8b9f319bab8f80b6336b3fdb36db7f73f75bfca0b9d6e67e66f8dc73b1c13e28aeef1bc336ba57a1b4ce07c536c77effa66b1cad7c91778ee994423df62602ea57de96d866d6586c0eb18c720868fe66efb5eb79de3671de83b2e795d96ed2616c1bb1c81bceb48080da07a58b99b9279bc73c3f4019cc8f41f82a6befbd88f5a0addf3bcc3fade769f1c32453c83b4a4b1e74d6991bebebcd9c745c271e543a732c32e81c8cd7b629f23e9952f76f50a551084a8b07dc63f8f5bcefafbf7cef809df5caec585fe7f01db4e585d83d8b9f9bf04d510b0764bd535e2833b3104b6cc7cf0a6175f5cd36e36b9177df963aa8ecdc10d6cc9ccb791dd3411b67763fcfc9d8f5fb9ec85b3aa0650374e266fe9131d72a86d7ce415d7319bb7d57bf510e8aefac5e9f37c659ca971aa0d95b73861fbecd36fc0c5067e36dfe2ec69edf638701dacf6199f3c59dfb59d8ad1f939638a88552767f37d82e5b8783f6bdee18731c9d6451be412bbeaf3e8f6fd6dbad1b6b342d6ed00b9d943167e7724b8759e40d9db45c803a2be5eb18b35f092b6b83be76b1d99ef2c9f6f06736a863085d7ed2e118ef84710d9aefacccedfc76336b5bd5a02c339871ab164a3ba19569d086b6c1ec2283f2edfc875bd0a0ad35699df5f6f2c914fad288541abd262d6750585d6c9261ebdcc2fa6e633ae5d66e498b1914e7d9d2bbc9361f93ce9f9441fbb5ceefc2381b4ac75f936821a3650c2a638b98bd88678b12ce0a02814082b48841ff5adcadbe742ccb3bbbd56809835ee736e3cb62953f996b6c0a500b18d4e5ebe67d16df93b146fc057d8e3db731da2759735dbda075be95b8b686b20bca6485353a76cf7fe164ac4a0b17f45908b3b3cc2e7c17ca683312a15257d8a3d2b245ecead3fd3df60fedf3162ddadffc5ba785b64556734b967ff341363f32779fabdfdadac293c8640f4277e8704e29dd9c537afd7619d76e8da185313e913dcb4061f6971b94f8b56a196e28528032e021030d9e31d0fafad9dbf6b27df9ed8b8146dbda64f7ba177386778681e2caa0b3d1f69db765fbc040db7c36ff5b8eb16518e7176847986b96f1566c2d76e7051ae19b11fb85d17b56d8ba402bf49a1f3256e5cbd8e4191e2ee456ad9d35ceeb308ef96ee161cf9f3762c75ce3a0426e6a81c60a9b84d7d61931fcbeb93e6956c09305ea4c5a77573fd6f7df321628738ce765adb27c050a6f8dd84e37a13bf7b756a0ad3f631b21fc98df4158053a1f9636becc1ebbb7e1d00cc34305da22eb76b5d536b37c971f179e2950d970c573c6c9a0b437b72c1e29d0763046866bce6e3bbf8b02b5f062d78ed91767f3f9a040ff3993ed6c6e5856eba4c85d3f36d13ce979027591b516676631d71bbdbf848529644ac166fdd8547a4e4325a4c4e384cb6c7eef64b517bb2745dea54abac1a6992634883181bebcfd72cbbe6e9bbbd5b304daa06ccf62e337dd7dd7b0dd541bf77f4a59d8ad049aaddb5ce56d8b638db09340ffdeda8c5d79ad336c1d09d4da6fdd629633b7f6e42b8dde944fcd938f29557212c573047af1c3f6af56f95cce2e1b81cafc99759eac59ab1fca39a5ba51f2f4a9d1734f111c119c6708ce230417045a2b9eb9fe74c6327eac81d0fa07cd8348633ea0efd3a37bd1c25cdb7cee3984beeb67734fefe7b0d68ffdd844030259cc5c77c0d303d73c68a01d388f0e1ad4d66308f51b1b93b2da371993ce5308f557b1633dfb5d736dfe149e1c50e66fc25a65b51233cc2e0e28f48c63cb58736c26ff06f4bed6e0d73b21966d56b701c5b16bad8ed967af3f096b4067bd19bab671da66cdfb9738898d06b4d5077dce6fdddc7b907966402fb336e35a3b46fce2638f0c6875ecaeecbff8e5ac528abc5d211e42687cb71f9cf8ca6a6b9d3f08bdd2c2dbac7b6f62586f8b8143eb62b79eb865f7fb228e0706d4737e9b6363d3b6eabe89bc597f6a989c6a663e339fff25a69af802fa6fcaf9d239cfd11f211e17d0f7fc1a769f4eded7f0f5b4804ac76476f5ca5aaddfea22efc802fa564ad6d97165b7c66805a1f0bdafaec9d8f2e2363dc2157802a138ced9de0db3adb2be2cf2ee06ea1b7800a10c33fb9cb519366793c1383c2aa0b2737c3da1b316df08992705543ac3edba9433cbf72da3c07302ca6e93b15ef7d8bd76f89a80d619d937f7fac29b7b4e4f0968b6b09fdf761b7eb558b6e1f983b6ecfae6e7f13af3bf924e0181dcf39080c2185dc4b83d3726b3bd226fd7271c5489b696518a670414db06bf62d92fe296f84679f271edf18356dcdeedf76beb708d2ce79442fd2d292999462910c8d30795b35b67696bb3efe655e4fda480b030e594de89534de9453539a577020402814a261b1bd30d390f1fd4e179ddc9f6c79d5dcaedf088a041d713029a5febdb0defbbaccefca750eaf4576640ada5670fdadae1f95cb76cf6b29c22ef99d3879a0704ac7395b6d95827660ec567860a5cc23135e15c6c09783ed013bfc6b1edbbd69e09f7043c7ae0c75cbf19716e35da6743260c9bb52c3c79d0089bc326d9bbfed3f3e341e395b3276b794eebd7af07688515de5b1f3f86b164b303b4b9d9b13d6bb8a76350de41e7ab2da39b99e5dcbe7280fecbb7318c7375d91d3e3ba8633536d998b36e98b3ab833a9f6eb60bdfbec33e596c0f1d0d4ad6dcbb3973b1dd640f7a3640ed641e31839e3d73d067598bf1abfb3c5badaf3bd46d051e39686e6ddb6ffeecdeb919e7f068807e73b5c539675bd9e474343c19a0cfec7b0d321c9f4396270628c4b5e1db6be3abb2e58d83c2facf5f8b6ddab7304a3868937f21eefcdebf41f3930fdeecf8c1becea31bb4c6b76ee22c6b8515fed4c27301faceb1b377be6693f93f10e8a6dab0323c6dd0865d6dd03dd8113b976cc6c306b5ed5a97ed1d86f36229d7a06f4ad9f5db56fc98b3ec4fef89470deaf01b630d3b56edac2c8bbc43adbb61514f6ed250092dc093068d1f61cbade696d0d9746378d0a08ee5e79aec2cf1edc7f90c3af1cbebfc2f668fe3fb2b1e33e86cf279df161ddeafde6ab0a852804058d4130844432564e32983e68cdbbb5d7deb647553e4dd6eea890a1a2a2193870c0a6795edfa61ecb259773d06b5ecbbebd76678c6dba2185436682d7b8cdd27afbcce3c61d0f7662e7a76cee616a5570f1814b68f6ec2d95cdaf8b0309150f7a4a4f52de5a05e94bfa8e42f4a658128475110832008009088cf0808000063130020381c18908683c188601ab75d0014000442625ca03c2a2493c8638140200e06511004611002300c03010c435124a531c85c07b11924c55b3a4b80262fedde329a8ff84d57fa59a1489ab133c5b78f1c747a96b29e439264cf8233a731f818dbe7487ce556729495121c0fb570b50ad0993ffec9cf0d190b58df27ba98a81805a7871465a544108a88a439f526d866588b207ac11622c7ef078270009298815348241aff16efe0639429a41561e29b76b7ec9ee0c832ced39082554560beeca44b9319a9e46b61f42d13438e30998af40a3cab04a1adcfc515348bd2dba0994d6bc9597753973fdfff536a7108d9f90007248e229af060be07c7d83c4a68e75785f2b947626010ea80259c22616fbe7694c94e4c1e6d8772d468a32148f9e1385e6bfc35372e9dd1a5b94e2025617c0fababec836845f34fe7b1451089fae6c7fc7b4010b67a889d6affd121864cad8f2a0b8a05dd94a4e03fd03f8a341b75a467c64d155a95328e7be0e165f61b696b74558031906223ec2fecbc9f11aeaea5c5e353acaf13e286be01206291b177c6c68af1bb19718991be182bcd4625b2614c8b6e1dd5eb4662cc2337f3582e3b7aa377d4206f6a5335d38caad5d163f010058f0e38271254b30c6a44b89847ed535337c56e5e6fa6cf42fd42af729e844ed95fdf3b241bbeda2f25a69a0a442adc132038f14a86bf42ff620de7625acd089367b3f5db46b8c37a323c48500dab952e214a2ab7442072eac3e277c15c240e4bf6b3b4ff67a9cf123f4bf259ea928f31775e676a96a52d3fa1652a600b984b2906022aa56efb6d82fb528f8f32fe68edfb485ee5ed461899f32537af0ebe29dd9c4e5d5aa265cfa3295f79d5437c86a8600215b5da4cc692bcf18da70362388cd68f3c5c0104d5abd69a7d98375810de7da0ea9de0992b892ec697468ce308807ca834b6cfeca13c83767c49be83451100242c7138e211088e8c63378a62236f6dede1dd7ff1be9a9183311ef18b071b0604f3143607c686a81d9418d8df63b48289c42b46a0795b6894389377a965a83c924802edd5a8b582b154ea81cbf6cc390ab344f1b21d19c6aeb2897bfb9ee4d6665119110dbb275562f5249c35ff11acfad50840ea0eb08b1df24b88fbe7e5a5d613c1dda635e280f69f959d38e7590885072c9925864cc8468acaa91fcb9cdba27d1977239562b97d059a7cb360bd971ad38687e4440f8103e5157bb4377221283665f433144af1ea3fa36a9f6f00613d616f1a1482ed6c76ea850b9484ed499dc336f400b9668c0432e462ca2f16ce07767828ea5eb554d401157a9646c64538a530843cf9848e32bfa592bca1ea6f82f28232ca3fcc9098f6ba81e60c370398540af6a14ffaf1732f2c98daa6bda0f32bada93fafc063b3669ea69329857a49c835c8bf8c2f6f1b119f3f53b3377771914492b2994942131b7f5c7840210fc626e1d088ba1a01ad5890cafd3255466cdda605d420320e5f283edac95b55ce8644150ea79d023d23ad66555527792f771c9ee89ff9c04ecc8a3157d2ce4ca6bed77d5f66f357765279b5d5a1909dd5d8429455d0c91d6393fcd80cce309ef4769b52eacf52fbbcabb611ec0d560c409e32b7595c4fd386b9006dfdf93f8d8c5ee9c2b2701500f5a2307e65a1891f4b3f4c52681525978cb218644ad8c1d5162cbb591235d48714d9a514ff385656c59fa38c81d1c485b1801e44082a0b27e70226f90ab7e31a04ddbb7a2cbe9d7a62e535186cf6b593c6bcdba1033e61ba2d8a398dc0543914f6797f784deb8132d119eee42f81d6d855b974cb175a1e361062a0ba03e93dd983392462f8c11a61a68fa3f2701966bc0deacab4e69ab580977d216c437d04b2bfbee3755193f68e10bfd3e8c1a1401a2cbcc26e12eb47f8e6af944649eab3caa172999c43aae1e520fd39a036bd7ad664bd8770a61f935d713ce406e221b39f01ef6e26dd6f641c50eef166d5cb448c1709e50f8602251851185173cdc274f24c9256c01381e2e6c97cfb0b5d66954d219312604bae24165554a04c9650d60dc09f85017b919c2ea7c03dc1a4125550961f7d977e81ad4f770c3a2190ccc94446751ad4016388cc1932384c0a7546993e4b047c7918cd40030cc50667d2f6647dcb5f6f6bbd0f56babbde18a852b4c549ccfa16dd06a1d43516d385002d0236f23536d4cf194aec0b71a97b5a501d0db4743be6f66fdd473e43b6a2319dace40087708dc21b22a42bc00f100d7e2d56a959de339c21776241e7860d05f0391d281a491312ba265fb5986bb8b779a33572f8a71ab06ab7d88919ce4ea74a0d0a3f1522131e04bb6e0b612f71a9c900e688224a04c0f818189d66e12f17c394b82a1579738b0b4077c7422741ac4230eb6d93d972e6df382db16a9ddd310c5450809df543432a7605745b6f0166376723ab5ef347808a7d3d8198191207752e115fd6b9c5e57ebf6a49631b58496a2789f8a91728c93a9ef70a710d327e83475610635fc7872c6f040bbbde843fef7d9505403efa18095eb2d6cfdbedd929f08e9f6e38d7723f796fd251122dabfcb27b5ebda8ced6eaceab86f430e47ed44ade9889b1a2c2d739336eea44205d4df56558752e2dcc496334b79152f657b7dfcfd99647c0e6d3813837c8b14915b5013d749b73951103c183eb84e877aa174cb7b9570dbc93c12f91d61e0369b6095e2800ed197e94e352a8c7c3a1750e9ea3b8a5db8a2acad9264d31fb6359cd008188f983b22c1f2a281176d93543e93ce244679aa0d6916fe7e12cee65e59fca20ed138e60ad6c8b2821cab852eb9db459724b9a225aba01e5deed722a1dc6b1850d8e9e6508098386b2cff4bf46ce003baac44e0625022e4bca8d6605449e5060500c73bd631187cef50b552780af4a524d840466760c0d1b7d4f741c86ada1e0f170ea6cb20f8b56b5e9a05b90fbeaf2fc0df6cb543a1b343ff89532c08a9d533529ec9d18e6010405609308c719d61a14aa7260db69053f3a531f2c188134a4cd806c49b65ad0f33e7c540858f2c5d9af7939a52c120c2dfe9b1c517e17ec48f3775aad8d94f4c9ad8d2e8722e0257d2f408b49ef4e0ed1a9c622d327b6364b3e6677d1891f1f0e52e968f011851554c6a5c88b95867b7cc08f556c14a205a1c695215609f9e070e11ec9706b1a3636693381efbf02b645d87c30219de2689d480507734e6afa80aacb81c30de7b521f4dae7d4f52c21770fe918efa0e62056e16d97dabecb165dd4c8e610a12a236c7945bfa5e900aea802f880a49cf3e4f1d181c310ea42ed700369d6f26aab02f4a44a35c175a03d83bf10b0c9444cc072e4c912285ebfdc70b8a21dec955afd1f9448ad79b4970a78768dae7ca9880301a6dc0ca203e84906d0be09ce3278fd62b7e9ff89bdb3efd2f2c595e80702b98251b5a13344a4b325d22cc8e50164781f5440dac08f7d442373e38be5ee623c1d9437e0e097e3f4ad454747e4e090281f13422956e53330bd4a4ea5cf80064cf72f45fd0b39baa7c4a44054c8f05fe7301eaf4a61a91510e83a01bd1394f60a58cd00fd0838e6041abd45a8ae8a0aae6211412abea24be3c96bf4a67504befe510d8ff4ba4079215879dc8c9757ff96a78c1bbccd6a07ae3a251776fee52265071d9db29aba4fb4180173f52b73dea8b2f6ec9e619bdfa48ba85573027bc5ed6ddf46522e8493a58302f14cdbab2630e5d8093d2d6612b3cadc187db93f515e7d8ac14c89ba31ae9454573174ea4d1206daa3cb3b11b50e97cb367d2a3e4b6a364a35aaf622069d3be2444804716df3c59d24bb7ea170fe66f04d0695861842308face29a9df266dac30801293a01f3ba81e7dd81804e8ca23a8c9840face46f8728149169bedf93c75208ad649dc8d92d377c498312bc469a3298d53b97fe2a913e169eaeed771fbe1c452b68035c49ebeb9ccdcfcac79aa66f61fa704449a695c40faf748bdceeaddadea53aee7cd2bf44f7ef84891e29e82a6e6521d1ee70e8661661b8b23a7e9bc831f705e1b5c286ab3612c88c952f19db5cdc99648ac131546682d1c3e7d20c498ea9f4d509810c9170b8cec64a4d1e56778540ce20221c168cc5b702fcf522cecaddcdc40a29f1892863b20ff574bf9c75100d3fe45b8d0b01260e3cb7eb704932eb9bdb6aa2038ccfca40e68f12b106807da2b8b07fc0e6c8ac80d599f94329c053f0de04114bfaf01f7b27c469886f2725df964f51b8056a6481bdb9cecfecfa2492bfa9ee5c42b2943d371c330fd1ad814e5d98831efea37a32c800e9bf2804ec8c36f87907a4ae675ee458561fd497aabee44eddf7270e22509a833e18bac166b082077145176839adb2f55c9b6986eb3cffc3b759350e7a768266bab7c458f0a62f979660db367e09df5758f432e0afd8b028669e75363deaa6bd5a6018aad4cba62714bf7af07a687fdb8a8c3b3b46950106ac52341af4f7a85a7c2d43c813cc065dd48fc901d92413b092586845392706545002e6111d225f86145297b5a3e57aa2ccab7a93d86ecc0715afb1a838be4e9a4f501db47cdaa114a68a66faa92d122c75e953601cf8137386ef8b5e550588d80f4bd698d6ceee36ca7608d2294f19af8941fbc3d33a830f0368166d0005bd6187cf94fb0ed82118578398650c6a18d14e973f120078bd2dce6ce517ab5693c8bfaaa0905c581540f91d749023f2e8ec462f14743f8c1be024731f0f3f447d0dcf626431d3e80e00cc5ca80b2806dc2ba40067193807e339976cb5416fac524e686311b554ba12511a5d4520a298594aa94424a21a59052955228a510ae4ac5bc16fa349618ec309635d8612c31d8616cadb1c46085b11d6359835518fde019c53056e314b0e1453ab7bf7738b3ab811b4341704a441fa7801c887f4e25fc61039947faeb66c97d1719b04279ea646dc0e59a231b7c3982e58a83cdebff746f540e642525a6c8136fca8b8bb93651e85a1ab881a3ae6eb6cfb0a96b01017870af0a5f2468791f0f6f1ae4cb01aad52237a6a143786d41d1fd7b865585c0f97bc2dbfabfc58391e2b2dc105eca4570e3709b6f14edd7e1e2f8b331c7d400f951dc517035993182d5676d22b9e9d570682899903b0fa003774be3d28a9a501a22d984b07cf94364495163742d4fb708ca5d66781b4003b77ad146321a158d22046e1618a22cb302d071852e5291848f7da4a5aefc8e3c064507471722649d1058317d5164a9d8bca18beb9c7583b6775b220c622628755bd4d4b74e09e56545b591b3a03f7329aef524f75a3964866c9c26e66b77e8f2f5dcb751fb15e3cd315015ed723b8d8039a09e9d11f0e605c69f730b89c13b3c388572148b4643a6328a9394aa81a354e46c9e2376ad8c2ba3564829d9e71ea166dbba00f8e5e47969e19d5b2944e90eb136ccb15831fcd8246d25a616a404f93b50162138c922b621fcf4604fdc0bca30ee8a95d207c687f3899fd3a5eaec65dd38c49bb6e9cd8a82c98e4d9a3a52cf2eb1cb103accbb4406fe7e613c723e5dfc855ae76de93e74eca8cca48814839d984b990441bbcd5e8c26b69a14e201c2bac093de18029bf20fa65cf097fc7f71c522f575d66253410b045537e303a0b4e4b831ebf3123db74e5f82e51457d28b514bb90b2347d492c1afa8d65b9bb608caa02fcb087f11036c56f0606de031117c903662cd6ab5e1af9a2376ffbf359471b636ac84909110a24e2ee2d8ed69a00adfa3f7810c23863532c5c4f0617631e666900f3719c13b948e5c5e83a2a77a088c86411a8380d4d8b64fd1891f1658d401e2b9332692cfa4bd2ba5c3d88229a3f7cc0783b0076ce878e4dd7272c00c6f444ab17bf1128ce694926d7ab014caddbc2e0f6befe08ca54bc95955d33238e0942890dddf821a0b80040fdb0f5a70a3118450d039b41006065069bfbc08df4f0b4e2d5a0181b9c444c210a427e00144c881f647139537f7cc783c1937ad9b49ecb2834c18c87927a16c96a8dffd2e8c4cbc37118a2cf4255e82f04dbd1d29f50c33b36c5d339a04fdf16cf5d1b37d3984595109192ac7d6b98b69b7d1422c46a00d6c8b2ea7f54669167116c98a15864686c884c30abf8dfa49e1f9f9dc1541ee69a72a0b87b39017577e2bb1e7b0921f302edf1281c09e86188b0dea94841039861e23905272e3c3c2333535b35d74c5604d31b6aad62ed26280ccc5cc629d3b1256734c2dcc129962fecf823c87045e881a5e4290ba83b0a043e94aab614eade856c0401099b53ce11131c3672cbbbc6b5e6edf4c693367023ef97a13be2f1f992979f2fc3a73a8e652a993d1f236e2c6083fb483935db4f34a245fe5180afa257cc8ce156766a55805a9bac4fec4b44e566c0c2b7fc9a0acd13cfe2d624c12e37be95c18755c9a7b31a44034511ad3c15e707143e79d4f4e208bf754d7cd441858b23721caac9fad2941ddace08438c5ca204b07e5c5354c528b86b1a46cda81ae091d85485d713d5944dfda21d1cb3bc86a0e1fd45b073fe2ed388a657dbe57af6ae604bd1fa7327f6171ebe0f3d1a4bb82df93a03b2dd55ff655e8bb6f3725c4ecf4acffc13fe3354df4701c80aca9e82195177bb686fdf1d79458b70f09a38a434e0977d4e00567ab96ade935108d6a911ca27b167c2275c93c3ef96300bc83da8eba85e3364685a5e3d0f6f0609aa6b43bc6a07e457a94a30008fa15e9f71f90d27eb84688e5f65bd5172205220ec39c1312d42f320ca7e4793fedcf055832d00310d4b50f65a6037c5d7ad1c39b2aea05b86ebc1657f924103e4ce89219ed628530cd053573134a9c76a2f9be8de64693d1ac8d08a437593243ee8833cad58d76d738c317f9bfe64ea5f745df1aeda5db032639922ab3c1783878269e7ba81a46c91954ef83e289248da7110dca0ccea4c2809e8e89d04e39010ec9c3e3c1c0141dfae93d552046bac11843bad0c71d444924a9d6441d72f95f44aef4173dde8c3cdd71ab64ff511958cabcc5698b6fc030961fa8b46e0d728d32c2480cfb706c9098a0ad000c2bfb45662890eac0f603031fa3822ef246621def6195746f9470478f34c27a60834b9654ea74ac4c6511427756a542e3149e601bd59e1748a64440ab035dc0762c3d1d2f04b81e26a1e449f0a60bb197e18e30523d490f72b9b822f912b288b8f83aea397f0a4edc1d30683fe294aa00d22d83c45d0541b90bc9463cce6d7223a35a053b8a2d62fc90bdf866cc9a61f85cb469d525fbd15b19ae989b6d245356b28831f0ee6a20d9ac4aba294ce45a6fd01a1b18a520a25949c3c424797ef255c8ebbee22896b35878cfd2486df68f7f2951537e825043284895328f63e054128d72c58b5df7132c7434e410fab924f413a8306e0768b9a3702f859bcafc508672740f292583cd2ac2ecb88edc5699e9e20d146a114e62e32cce802871132e2ee742c65584af582ee25c457888cc454c285e03ca8883f79e19d23085c365d5188902c229ff37b6a3f39f0dbea1fa049dec445ba7c2305e50e63f64d63e9b3533b6e7ace71b6b79af3fe47ca09b6b7f4d61f7a0e3258f4ee817779f19f0ea331d831689370c8be0f2556e66bc21f30d3fcff24788aa8cf44fa7b1e26d6e6418fcf786939c08aed2bb5428f0168d23f42d662c4468ef84661aab832a915e66d6794c580f41f1fae5bb368c1cfc4511a1d46bfc208cd4a2c7c482f4821cf9532073e48308c4cdbca45161035ae4bb75896c091ddc2cb5e68b4331f0b3e05d88d2293344a3b931cdaddaad2001bc2cb2832a893175abc5894964e7c89e4ff585eca56261f4209795cd25ad84f2dba3a43a5b6377f0b187aec0f6a62fa9b3aab8e0f57d67159570691a1b6536181065402fe1612b4315948f8d59e8fb8c5ffadbe3f7a51a9ce78aa8ffc991e1477288c77502e6f3d0e475ecd547e64a0f34a555e214df381f0d2f11e287bc17e5b1fd2ff1bdfbfb1cbd32598e35fdc9f036c07c43d97f1d2178c71a2c6c223befe02f5d02de978b2f6136cb00b4e5dd521757dbcd2b698052957b7ec450aed2bcc843e6e94f55cecdd8db1a37c4ed7dc27b37465d3b5b93abf80a3496ff759c8d504e50dca1363b724da70e4ef4b5d1d67ce214ac92a1bf08ad918df7c8fa56ca210a4f5ca6c4cfdb5e0dfddf7255f737d6a137d74b35ae4b6a41e856ec69de1921293fa6225524f4c3fa84cc1a3908139668eb8a719db58baf0486292995a09866ce4cbab5297f1f838bcd11ce241d14e53a609a8d96aad112491e4fd54483c2822df5980d3802d04bb50adc1a179773a03430e47bebce09d58c14e1a523e4b8ce22140fbf364b8353fe478224b11ca4299f6a9186d4af1fbeffe866cdeeeb5d9ad6d65b1ad7f29d4e4f52bde140ec6ace4dd009c24f5a95485e1d4772a7ed5615c58f4b52148917a9d04fcf7f25062345a36effb1bf6c29ca4d39b9075473161cfabfbd29694199aaa9e7ac24f579cbec301bf8c7389416be52785610583bf057d7acece172e60601d51447e5b2ffa6001810171d27f8250191e707182dac3839a0c668d67821dd8d1437bc674b38fe85a4eed3c837fc8c61e0d35d62b3b17a8bcdc179fd754ee2b29abc236d6acfc971be2a61d773a859e20091366e52fb60b1403f07ada7ade8513418de56901bcad3bdd12d8891cc1a729b5d918dd391ce9e61293260b87d7a774ae8fc0e97c9e7a2f92c5a8dd30ed0862a2481e959f737064e44849aa6d0ae6460512668a63145204d12b2f3f3861a33265e741050650a4e8d323d69c54dfeeb64c36dd704bd499b6e7c6640f1d2d6369ee2c1aaa39cead01b9d65c3305018f1d4c4543c37ba19bf14035f65dff76f60711a393911ed94ead81835ffd8995e8c86bfbf50a21b011ad0ba982f93380d8ecbbe4875e0e3c82be418274eb6c0f830916d91d3b8e1e93fa13bc722cd3daf3418d435967f583708a44e40a1fa8ec0d502b8fc8b3b17c6f391d947cf2eba556a2800a494bfa8215aee7e940722de576d6ff5e97fc5c14474be21ca5f2004625a3ae30a14645e6a05bd345add01b648f5083b35025f9e635ce6a5b74c029fadb65158ee1484ec9840551b7bbe217a7b6874bf71f6d94fa0f04b58b7171234da3d5ef8c0eee2240c66aaf2d02cf689c8598257dd7ece8fa8b59ae05aa8e4bda09c8539506558f95f512411031be75f9b01dc35e16f9780984540d3ffb6f13e4f9934a4abf8e4c9c84051f42f4aa564a711a69e6474b29b094431bef2ff6d8c301746974334c73060b312052cae215a0af4430ce4d0b0fafbd473bb2c332da7c079be44a60f0a74b0fbec0a12e8a9ae1372bc0843683711d8cd7abf7aa031fe1c49cc4b959aa4de8cb3773ac2c9d397decbfc8c6d3566a6e7c10656880bf78795d63860d518e757faf7ac1b4feccf2fde5b6d3ca162a9646b60dc60f42bd5eca13820c577b5b6d3f391a96c32f14bc83776fcde9fc888e6223f1e57fb6c6ff12cd7336220a97d75abbc3926f22c83425461e2cc94e7d4ff872bb4c6cb864c44277e0053382e234307e56004ff2deb70038b8f4ed554835dd2ce0a42b367d1141008445f09171e6e8d9fded83019ad6959b857b32208d75eec9981a72d690f5526c1db35152284366ff94fa7a432dcded3f501c232f1c61e78ff75e920a8c8bf952229878e1a9ea1b30835b11cb45019c44bd3f5d9349130186593e9298e5be2e47eeeae9b63630eebf2ac6aecfe24357ffc28f43fe6fa8d5880c299c5af675612c218e1d6d4543955d709600af62630a8f3e658a56b4e14e97141875f598c31d0e3a5fab40ddfe1e83741872ce4090f295dfc184d6e7d599ef74bcbf8f285b7f21623d7798509a4ca29131c10fbc9b15873ef7226515fde7be61c2350cdb73cc8eb049a4b52870dd7d769a41a7f245bfaf598953b1c680eeb871c719e8a33f1891005adb55dcfd0c9403d8a3513f029c0401c28bff27821429fa738c87d030fdc4bb89148474d3d8022a3a2c416a9955b0e0324b65315eeeccea0a79c0cab0de02af8bf464edfa32fcec0fee1ed806e6a58c840e517e7ae082d2a74c6efd714a1df7f849ebaba06e8d1ad98a960cf2420810accda0ef829bee0808ba5a392c0a86bfbd4a52955bf03574a9e449b56ac080714847ecf2e3bbe4d6203338ff0f698b61aefb265d92925f1e28764c67245f0db612dba7fad7cc141aeeae96f5aa38865942c5e954be09beaf461180da3bdc5b63f674e4f66e483c6e2ba13714224f5ba2ae76c400b7a3820813b1ae845d3d264ac8b39cb1c10ed9a8e7006c79baea6818855818e1c7a133bc78f32cf7314052e92f198451048d70d1e8547b0b394861244bf00f6b3f4fcb80eb4087784302b14e93cdd5a0af9af7a72d5da03e9e794f69e636b95877bbf83f616fa4b7f7f24f45ff407d05a58b965b2e7d3013523e16a6adde2ac1b868935e9a60d8bc4601e4660056797634614c17223233f43d40d8e1be173b05b12480969011d20d9608c0f7efadee14feaf5fee6de8138648edd94735be4c8df60c986886bdb96897c98fc80ff1db55785222bd02dcf6d98dc36499e02073d53fe2e125a5442e7c98dd7a74b4b5750e7924de2f644ed882c613f9694d16d11cb0f17a1bbb4fae96bc930f0351b41051bd9dfaa89fffb750a7eaa21ff022160222d80130d0d921701aa9b32261b275b39db301b858d9cad8d0d818dc686c0d6c686c0466343606b634360a3b121b0b5b121b0d1d810d8dad810d8686c086c6d6c086c343604b6363604361a1b025b1b1b0a7c5b5df30326c444d8b2b621c26a1b7b085bd21611d8dac61096a30922a8b5ed8720254d1041bd362911a4c4268d0b4a6b50e80d4febb68a2e3d8f30c1d927e828df28f68063ca3e8cfdf8968e26cb722531cab3cc0051321e5b79d91c4f98ecbd07cda43c631687d300ec440e7eed82531b1a7fba40d29b34362dad2ef27229a307354c11dc9bc4825a372bd9c808eb429e77f991542be3187c9103bc296f7ef7ecfb6a003933ccf9a17a637031337b6ef49b083ecdb0dc15059ff0b231a4409cde58f06a234be4cff46cd49d716e0a7922ce4aa81cd0e4fb439325501f8d467e63967dcef008bd7f3f5ec57598a571cc6ffa5394e168b9d7eaeb353165f6a82f90bbe3b61427aaf015f1c5af49d8ed4daf28c0f04fafa1a82ebaf8ae4474a60437f03b482e1dc7c180ebd30aa703d1366f194bd593693f0947939e65df8a2099f19666ac7009a86e25b184a771dcb27b0991c6dc96750da11c54b7c473f9cfa444cee3d7d9af8b0925398685495cadf9550d641b9b6f6addfd2b61b9eccd23332b3de994d4c0f37e5eb5e089cbeddc0c095da43a8b1a4723f7aedc00595c218e6cd4b4f07005f89175074e2b27f2ded393fef3fe24298862b14472ae28d3c618cbfeb3500a293528e81a20cede03b10155ee354bcd103a107e828708bc12f800f8da70a65a4a28f1ff5c7cc501d3e5508f39797461aa666f532426a6ea816a4125b5a462a0685bf49a91e9a856051a957df41161f3c52748cc777654d8d144645fc343be1041cef86530b886bb26c20dfac099d3da681793779d9cc6f2041d498b1334126dc85148b423a320d94e8a8eb405190a89566414e4dac9d090b5264527df0223db0b6643f2cd0d677ba89f7bdf60ff2a1d5b0c2207ed0591714178ad9f8113dec8c6a6f70b953db894e0cf4167b41c711bab4e1a0ade59310a65cdce539d64b784b858a3bad734c59a644a438b299cfa9a274eb0de0ccf5b65101f94a58979c4ec36f3bec9b4376aaef271f3e92ed4b11bff6afdfc443cbef07bef6a5dea3a3a8a9913ea8a8daae039bc0122052250b57ac5d332f112a58de1a7ff6644293a34e1f1dfc4c5fb4389df62eae0d7fab2b9f5902a1e6ff1c2a1a91e4073cef7984de806b97014e8a7c2ce5f398cdc6f979c93f24ca329e26c41eb7ba44dc19ac4ee35233c1a4b9dc563fb988409b1b738f573d3941941140158617672d4105e6157cbae794cfaaba12c297327ae02e5cd5f05816368c658aefd802a1086eb718c86d39ca62d43b8bc378c12799d56e54535e00c99eb3d64f80a2e1a8f943b46939d8e9f49562e69b7f083073710c342a80e96f16dc97b12b5fae4da2d205bd534851139ba4f27363be41221df64324ac4d7357609b93206dbd0a1fd67e8679afbba2ef2d856388ca520cd88129eb8da838e433707370fb2f0342a1e7c2e07295c2a869dda0957a6bd9018f15068bc2a16be400588c7e7b1b040af16afbde4492ca645d488dff38881ccfa9bc737564c8580638f5159793c647217c547706fe7b01d1a4cbd0b589937979839104bc27aebfcc716750fb174ee13f68a5e61db1bbf73115bacc35441c6a6a9d227e35bced26ae9bbfca2887976ba3d8f63dca51248b999a21a6351b6e58a84dadce75ded94ad5a9e63aacd79a59afc9441ccce58111bdd33fa7697571918c3c936b38c45eff8d1213a294bc7ced6a94e45bde3df36f03d091cff2d18d357f569e1fa9075efb52457be40149aa9d99c205140651d309244bc267783c83189c253397f81a73b961fb501c436e71ea030b92bc7c3f4b9e6e484b6711ad3579382fc2af2d9000b69772082502c12a41df71b1ddb334910b0963878b78d52e825ecd898d7daec2b2fc43d7d51eca8add8ac982a26c757f15096a9ea30cfc23f0477467dd37467db79b9879b11a17aee200afff0694847ab5d4a6d54eb04cda0c9ab890e9a7101fe7f20836ba3a90a6ac7646e55c6310eb33c7e5a73cb84498369c6befbae1cbb9dce0f342354f8e950de2c9b753bf313f343784b4e980d790d6af7bc70c8a65a984e60217d84eaccde2092605101adbc105463f5337c42e152d34346cedd4ce0782803f18c2582a57b5bee8bbdf90f1e2a8f752ebe752739772630b482f9e1d2c9c163aabcc7ee1ab789c28c9e38ff79a1fa85afda8956344bbb0bb2883f3507271db8cfd68f9ef35b8786d7125189177fe0d6e88bf078357b06142577ab4a142c3d3a80b79254ff0601874b7cc892602602940b502da0c7011ba69d174898b96305e3a8068d7e8714ac0a6ba2df3fb5f9ce3e47da2cf980ab4272e7f622ebe0f50484827d074c52d46736c535a56b865645bd1e0eebf53c12aa009cfc50a88373d269fc3f36b69021f3a964c4522ebc59bb88784dc7a6d411739d13b2850e43958c90170282ce89a7d637fff0a736c754b0fc3962e04c31d14737d834734b8d1b88e6d12bdd4ca8c2777063866cd43bfbea6e3c14ec6f51faefc84be7f90661fb87ce1ffc6acbdf7ea2c1cc8ce65300b0df4729261dc59fda289d0aedfa1b441f3fe99787edf6fcb1dc1f21009921f5c53898861963e759c4f062e24e45e3ce5fc13545608dba2370ff592e70cd10dc7d8a6225b1da064ea31899572e25899ee6d251ea97ee55dbb8f96cf7fd24a37c40d93bebf883c5a1c705f58f1f9a89bf32fc845fc459f4fc78481bc7d7b38cd73dfc2978db9f4acc09a12e50b0409fa5548ec75aceadc6263f50f6e748465fe2538da34787ca8f7d132aa779409ec2d9135c0a1a28771add07a3df03b6e0f6a8c7c87fb4e7ba1f9bdb7f8c4efce8ff9121b0c4e6588bd3825f752df4ff87d7fc99cc0c25dd3fd88ce706f240c6f27cca64efb8d1f7389c196fc3f1fc3928927607e54873c45d972d02b698c84792289fbdb62acff3a567370c81a293c19279a0130adc9c53f3a2cbd94c7a6162699bf48731a7d559aa2c04bb69e0a074850ea5fbf8e7e8e3e7d26e789d4e21ba6b56baf985fcd66088b0bd36a275f3f6b0c1254e08fc346d43c0acf9eb62e53f0f87e593a3fa886dedd3093f6e90ed1b3cdeaca690ecca9a8cc7a6e65a17a7f65935991366a05520747e7b672de39679a6590eb439bb000ef428255a0e995924f0cc156b8e201ed448318388c44a7496b6b681007b135f9868304c1513a8a9dd85b3de4fa8ffbb9189754057115b25f1ff12b923c83b5313049489d3742ed1715cbab0574142f4dc5a0840bef439e149f4361f1081ff7ce573c8bdaaf3af8984d5b81667dbcd43a2c5211be583a54a53a5c946b5acde4482a43881dec741c68931a4f8404ab8a1d13500b692225124011be7bd611d31e4a1ecd2cbdbb813b368c2a30cddfe2302376849cf0035b81cb2f5082b7813808ce2570adb431b03d05c7feabb97050f0d8aeb1c21f6cfa2e1f572fd62801c633c4641b10d9705ab6ed7d8be669c9b3f613b2a58fc84886cf56cd45d9498791991f6f356e172d1741fdd391114a1189d838e6edbd0d709b7a2339cfdfcdea0e7846acdf21b3a5a73b2b3c2b985616100fab920741f817f50517eb0c5dc9663b1d988769823950fdebf0bd847d210197fa5ced0ae4c85cf3e76f279344477ad42cdec4fa3a1db7035c40d2ee8788a82efefab7f59125b0147e449f774b50f274cd8af2339a8e5f5f3ddaef5e63a99e634a29921701fd471aae352ec7bcb3c05595ec5b031f3d3dd5594ff886477d44a64cfd1895b6c55f3bddf52810e851df8ae504022b82175dac2c72067f0947cd69168b6ffaadeef3a3e0573a16687a0e4ca1c5fe729a4aba4cc0912c2c11a10e11520b4f8b30cb3c043dd54e58df877f1a5dadfbbc8fa6fb3b6ad76aedaee4b41de9456bf0a4fde5eeff7d790940abb20e57099208f5334d9151b85cc0def73097321167a0c3b7b36fea35ca827a970dcad659012c040909c97ada39f55aa59ca466e8743bea672f63006d943fa3489bd8137a7b528bce01dff83db894ac1397a4af2e834a227185570627d4e5a9bbacea17444c641d8cba1a12d20e246894aa419d2187064afb4d56cf03220b72a45d9b625b9898d8a68832140d561e0e87d2834ea2e363ca30b0384d642c1639560b2b18a9114341d0628ae031e18d16e71208bdf11cae829554d2160b691e088152c1840291a00ac1e84426bcd62c377b03040da2814bc2e0826bb161849d1866180ea31e0815b6868ec4e703e431d0085ae85c106eb60c403b55129381d102c560d309aa60dc70cd567c700d5745c7169a2e564dc90dae65ddb06d902c376ee1a01ac45ac763d3576fb581d187b3f7163f6c0c2c1d0138b035b6f162eac9e99b8d97b607160e98dc181ad170347764f6c9c0cbd303830f562e0c6ee85858bb9273677865e0c5cd87a307063f5c0c8cdd41b93034b0f064eac1ed8b8d932f945922bf23324a7c76f47ee8d1f18b9163f18546db383a035c082c688e80bd3b9c5083ad7388ec28241d31d6932a385e7d7b46143f8f45097bcaa47913d53725eb2b156816376cf9825beaf6bf447d9c2ddffadc59e2ce118a407d659f263e7085f98cf4f69e648a102161e9d7979664c2e290bfbca1c90776bb8cca72f338a1f25da5376b6381384c0cb0081430163d216bf5a82c2984523c2dba6282fbd55960db3ab4639bb0a2bb79246d1c2c0a2320fe2f6149c5b42174db53b6cc36e3ba6f811eb537fa8c213c370ffc0a366da0c01ff49e63b2ce724b4de005921e3307f2faa09482683da1004165b100b33ecd66a3329869a849f58e79c46fea303de95b6096d6c18aee27866ad0f1da6ab8c52b564d881b39a3a46c8b72dd482c2fca0830557112b67104ecc6210340328975a52f2d904d12f634873b4f38212f001f0f743cf0367dbd2e7409db98f1e501de0a3042b569d904badb2107f4a9fa693c8303d7fe27a872589b87f5d9b42a5eb8f8fecb959f9501956035c17853287d05cf0c69fa8d5894bf188f9a250d0c4bcbd2b28685eef3b1c1e1429292ef26bb2747565fab36d1a0e23cb249798aa51258e067b5f43a6a3f550fd24b5907461208953df0320fe91e1738eb0800e49f6978ae4491f9ee7ffb3b11d79a0c86d708b16e672b0b71692d61be557f21729d7ee19b0f8fd4d78b269f5738f175ae82dac8bd85733807e2c4ce6fe0a2c009a30187432cb2d713df61dcc90111eaa693c6205c57d09d95f071bcb26c008b6584aa89bda399f6df656aa3231cf676d076ac12432d04c84c6fec89654189886ad87c51d5f35cc51aecd146787a1d86ea4714c93e20fb0ff1bbf981471123a6b79301a24d2a5517e9b1d45021af9693b64ed81ca276e9807fa185fe0748a2758b00f145ddd8c3c3fc338f648c84a58c821140bca2c1453c1b4ede3254aee5dc92fcccd7c309ed644ea4791b91e9693a6ea500e956176e0fa2cb24e6dd644c02d8a64ca26e850e3880998f818dacfe47e4dfdea3eee6651efca49b0adbbb1ab68ca280e5fae9df3522094840d61a53438de066f8745a90d456ba40ad75e8bb2f58f2662e7a98d55c6787ddc29e4fcf1c2bb22ad0ed81950eeb74938d6638c33bc068f44e6d8001f545c8be2ee30243cbea7fbdb80fd4ba791a2a466dba48edb2271014b64f1c4eb8fab1e0a7f29c18f3efcb56bda1ea89ed088fe56913114ab651c4b08835341ee9aa375f5f4e03fb789a1b1be8bd22c393b677f237e48d51f4a833b2e35cfc147d84f9bfbd4fdf0e7032bb5b7964563051b5393810cc8c0fc0f22810f7b299271a59b4fa3a160db24cb7dec9d6adc65ed736bafa6ebcdcf7c571335260653be36a9db1dc80e96b4c1bd16c5af30aa257e054dd90bf2962dacb149db45953038829bcd8ba566a5afabf1e03323bed2a77a9418ad5afa64f355e495d8985b15a0bd9e5c6c3577e36c91a09431438a939720618e6bb30f15c91b47b1e03929805d00b687f2c5fb1853e96b3da41190ba5509060e1b9f0777077d543326493512cd36dedd96ec883c39f904a010613bbd07538ab081a934211916f503ddf4dafc8efcc2a5841683204915728ddc694210fad434980821f9292cb4a0d52e68e016226e615cd1bc9b101e60f18929952e109d5240a069e1064cabd4d3cc355755c8efc21b260ab8321368458f3b23917c8c238b36d234be2bb9b8e35a2cd48ade396686693971d1978bb90e151cf115a5bf8f17caf194540339807d7d0e04b39c2a4773098e2955d792dcb181e37433a3e1a8d92d6384dc2a7f7fef82acf765f4a19289cd9878a4b5647805661e14faad13065d32f7b8b59d271cc4ff8fefa3a4d3ffaae3eb62b8e0ceb34d29780abb30f10953883bd087e652dcf7f1f43f731ea93e0ee06bafbd4e626d2409b753fb677870b2e2018d341d997f1139ced7edb07cbd047c3dc5913eee55ecfcd7f26e7e5ee5e1439934c38d5af8b53f2e2bb1e37caa52da748fb7c8dbb4e8e79367c7eda6e0e6d20257409f7e189ff31fdeac05d66e858ac9410c48fa5b5582b423b40207bcc65d55a04ac79ec4254b7d39476696ade2321d86e9e94bcb7f203e5f925b084b4eb6fda732cbe3e5cc30f2c0d47a4adba0aebc137299d78d0e8d0c84434c9e1929a190b69a90330e48b5eadc890efbb2024fa53c6cdf8b40e4999b5cb451d3ed0a56809a0dafb055b63a39b4fae0ae37721c2b7f9eb826b88972ccbaf06deac65865b0245837846d47346ba728143dfd1be261f632948561db76bae12752a7019fbf1fb5694f8e888c92d1a7c300b02e697ad73f71df0b0fe67ffbf911abf3154d199473319d8e337eee7ff830601a096dfdb81402f9b4fbbda8707408187650f749459608c5768ce0ca809ef9b33cd6e0d87dc91aa5eda6c14b93a249bd2ce92a063afefbf7a31ffdfa5cf4e00a18de1f2976b99dabcba87476e41681ef40fb555b146e9c3eedf7fc189ea3175446494db2b7b80e1cf058cbfd2119b773f62a8514c81f41b3172747c58c4971d81ab3d9ba78c0e58bc596dd9444522167bb7d5e745e1e8cb8d2ae50e67ffce3656c1129a3bd28a74beffc55339843c57c65662033afcd55db0b273e3cb6cc2d876f2ac4a94da3888fa59ad6b98b0356c48bfa93f68d736380d917df906437100e4c860c60db46ba7d6841f5a2d3d11b89ab11a9ae38befd51906f0e20c51c1751ea791ff970f12980a702f8b2671ed7c8691ea86aa0b8238f28ea3f999b27ab9ea6f11e9cbdba225efcbc3e0a715430e03b08544f1fcf1bd05d5d392f0ebc91b83da0fa59d0a10df8f38a446ce317ef14501dc7e8ea512698e70208890a3792add1a0615fe16e56c0ea5e84fafe1b6115ef4d9109374af53526a8453e1258479c3a2dd29b539b45f03c19431f568721c74dcf75fd89f6c893e2740499114173e1833b3617932d2a525345df46d7731a1a78ef1730e8d3300118a838fd3f9471056905b0bce8e49896228d02aaaac45912758748871bfcb1e11f6cea098224567d6cfe09dd5dd1474bc1b32b877ab796316dbbb02ad42065294d87eb37023db472d4130ba34e47c561a5eab106f6910c3f2f415e7b9b54be9a5534b38e564008711856ea2010a6b67a3fc4fe3dbd239b58891152713911becdcb70eb413e907e5088c046dbdaf9822d49913e50e4128489ae344cc83a6c9603240196e66b15a2adcea2d58ee95f9dbf7b713fda803a7823a3e89e9b248d0c782b28976dbba89defb31d0ac150992a4b6bed0a14cfcb5caecd6cf145d04449442438846fbfd21329051ebb20cb468c14de644b6863ac60f76d6690fc582249d7a3aabdc35203d5f097f1bcb06b6f9ab5ce18a91b08f133510cc0fffa22c91e7fc8e2698ffba2a3f954fc8f39e99043e99aa276f209cb38f19774d7a40a812e8a57891d7b1bcc4e9ca294e8a3e87e4d9ee56fa8ca319f50d45cd805b5aec51c8c5cb752214f7578ef74c44df76c0d16670f797e307199092835c675f9613248a899be97cef5948dc31d41d1b9b3328453c1fe258740feaf86b79fd29d6902618adc8e72fdb92211ff7821996198c832d4dbc258f3887525869665004ef5c011482fa1c0a93b3efd4a85a236a42939f32ae9db31fc075ccb8cf441d566678a270c889dd2e9d61767e37d8866628eb9d660a8bfb4fcbaa16b9247b74e1b84687ee66cd66d43b973c5a2cca51847c083389aa3587f0d9e388dd29fb61647bc3f7d94e1014efc37cb6fa68bceedbafd9f44f6179b63445b9b44410b4c81d6754c714a3de6a23f1b2bc6d2a8120b52cf0d86c8bfb294a7c3aa11ee0c6c29b94d52a64f880f3f1f1502a22dbd86b5c57536cbc3230dea77498f8e226fd830e1656656a21cbe303544e6ef2b658157a4a5462f18b5c91d14ef06b1958dc7b0ef7f4425f044d8e3e6ddf55d6678b322805e9ba28927e43462cf3e0d913060448b1155508c656564b0c6dd4033c53fd0e4259006576ab13b6a81a85381dfe59e8f7a250c224a5b183bdb404b2c6c2b8dab5aa6e0ccec5e5572df0a01cb0ec74ab72c95954ce31eb3eb12e709f524bff5ee5f2576fda59a34c06e5f7a2193dfc168c98f92a281a1d0604baac079a068a2caedfe9e2467fdbd2a34df48364e730dde2960ad9fc3ee415acc7d418d5adde7844e2e98a38d59eda2b217ea0f4f78fe3738f84d5c9d5aa71966c3336bea9d922423f66703abc5c5af06448c02ce7d44780b3750f26439c33f3f3f3f3f3f3f3fcb3908acb6022541a62495b0b4cb48c5402ea524534a29123dab000400000000000000b043db9b90305cc90b7d0b730b755d998c4ba5c2420d2798d226d9f6850e35796982f1b2894c1455cbbcd3aa508309c6d93b5d1b292f88dc8ba0c6128c1174085b228b514309359260c87141e32a964e6a291835906050fabe6523f4790ea2a50c6a1cc1a474b01cbbd0bbe1152c1c95871a46a8510483500b3535bb17221ebc3dd42082312d9a4d343f7bd37f95a1c6100c2975bc24db101243bf420d219893d83efbb04f8d2098f3fbb49b083fa347c1066edc08430d2018adf3f579aaa8733dc9a1558a0c32709011c6196afcc06421579a1b721d63e03004d4f08129564e4d763b79da1f08357a60ea1773f550174b46d6850d63c30b0ad8b871c3093578608a26a3923c613e22c31a3b305686d0dba172cabfe9006be4c0a0acb4f56dc90e512763885156030726c95d61264ed211fab3408d1b986c55d5523c21f2d67331be48adc3c5f8c201376eb40e1574d5b081d9c3aa2521dc4a95bcd4a881298e6fe98e6176a76512d4a081397cc955d21e5b3f4434e0c5561268ccc2e0aa2ee2f5238d8eee0236bca0808d1d638ca10127d09085797489b2ea6ce943d258a0110b737a10a253987ab6f1bab0c1011b5dd888c08e06c301376e88f13b763418e9c60d58105582a5a54d3cbb8c1d5f8831c61766628cf105b147d07805173f22c8a70e0e345cf18993bd6a5247860a89038d569426e5bcfd396bcc7cac386fdb4711d10fb2ef32d05885d7e9f77942030d55209f43aa5c9ed25b2f1847a5e238cfbac9336fd98f81062a144fc2a3c8d36ba36425f8828c2b1c85081aa7d054b88ca43fb9b6840c344c91858d09312663a30b1b5e58814629ce90dc17b6eee46413292c9b532adedde8fc4741f8d0d6298bf29fe88b82d3ef11e779fafc502c41dc45d88bd77150104f47c8294d14b934fa44bad4a5a84f5e1311792221a48aea396d21954e27ec3ff7d4d14644f90f27ae204185f89c4d1ca3b54ac79bd3a51e4de09f2faa9fbbf4c93b13779296b3245541de9830c74598e8f02536b1253b6db68466da562ca40c6531ae0497258bb4b36849ad94f04da953652a9378e249fe0e4b024d1f3d399abe515a46c24f417ac855cf27a290c042c88a58692c8f682389894fb0e8133c479ccb54bca8a62a45be11a451fa7236a1c3c41881981be9a92ecb85d8220efa3149ba7fa656a5884af9b60715a56bfa445ce2e5eebd3acae9082230f5ef2fe2ba9222e410cc6856c6a40af62536044a7e07116eb464bda46c028d4268162b450bb1ca65b6dddb62fdc7f479ed1422041a843066a9244a843b4997828330c504b522fca3e7180edc414310a66d358d6cfa746c850261f00b2e298baca0133c8030974e59d52a56789efe60f6dfdafb10413cae7e30a71cf4524e8bedb3953e98c7ad4fe4a4224708423e98aeb5ff9418bda0c4851546181138048d3d18d458d00d252ea7eea407937ce5881f6c23b7f6793025eb2fe1d1e74fd47830f5db864aa1a2e594457730bc491d8f24db46e3b683e9cb45b46988e9e4711dcc154dd35cbe66b4890ea6af10c74d2ce9dcfecec19c744747fc2c9153a4c8c15c9f4c75e414d25a827130d678fc89eb9856619243ab04627c5146038a05801234e0604ad3a5c47d481674d66f30d857e7a7896e4aa77154612582861b4c65b6dad9d3a90de6be139df488af54d3b3c1f4793b7fa7245f7fa13598b488cfbebe10d63d27004305078c1643c70500a00a1a6a30a9243a43b4a7fb5e3e0de6906821cf8eb890361a4c661fd93d577e95d4cf60acd20e79151617ea2643870ad0ebf812b849fd14d8a1820adcb8a1e34fa0a3c320650180020d3398848d7adcc80a632d7a60c73f8046190c2a6479e990ec42db050d3218ef3acae7111f8249ca8ec1143b8869d9cf75a35262307852f2de4a29a52a6fde6380512a40230ca60e77495e4eaadb72b1a20106d368dafac6dcbf279d2f98745dfa5152f29fd6688c1d387290a10214a0076878c1204ee5aecb1f84d0be971734ba60324f2594d6926779ae2e74ec10c39c00f58e0de8684019010d2e98cee45e85bd09d1798203ad0c8d2d182b265748e179665ecea1aa0593d01ff235316b1a59301a583068999ff8613b67e9fd0234ae5037685821695421695021694c216948c16844e16840016f10e4008d271c0d27248d2698f3a54e419476f11b35134c69574e95892046b48903052ac0718231c600432d0336bae015d05882392cadb6ef895e105a25185784ce295e6c2fd88446120c56a77384a02ac4070c301aa1180eb0a28104e38632cb9d4452edd43002348e60be2ee5232c59ce134d4630cfa7e89d9368ecde5f047399cb886aef944c732298e62e44b62853494f43304bcc1e97605b15264808a6384205b536755aed20184fc7ce923b2979903110cce923a80f93a03b56fa03936411a6d27f5a9093e203738987cea1b4e2afdf03935e3821412c448f8cd0e0812965be6ec85e5f98a41d98c7a4be6953ddca80860eccafa7f131fb2999cac98139a89cd38a7c9fb4f3d2c081797bcd7d5d2f4f12271a3730fe9905f16ea65aeab181419ec4f30b3f57b165a45103b3484f73b91ed1a081d13a29558f70417a2467618e215f5f23c63f08932c8c6b21e7521613aa5d140bb37c4a6d42ccd5447b6051376cc62b4c6e7721ff6775d773d01575234930a315c634afcb96217efad33c98c10af3dbe534e1b6de83c08c55984cc4099246e5f2e4cf053354615051ec44c46b875ec8a5c2dca22bbb96368f21275498d208ab581df7bf61cf3885d9cee4a964932a27bd29cce57d1edd3fe924aa748a5b14134b2a8814750304334661aed2956387dca7342c426688c22cca925092fcc2ac94c2402db82dcc0885295dcbc7c822adde4ea030e552e9835a975d53499f30c9ce47d2d6d852d57bc29c2e2f9f2ecd2df974274cefb7a7730e1e848e9b13a6b07f314f6b84897b3761ee3d25bed4447588ab264c93f3e90f9b75fe69cd84414e34520c118b242a260ce6b7172c897417db7209e389aae0d759b184f1b36453fa53a7d44f254c9b63aa520c55592ba4843982a71139adbe09c91551cc9884f14dde26e71411143324613cd5d5326ae9b3d69443ef13332261cefdd92bf54c3499ddb861a30b1b637451011b5d786206248cf1a57436cfcf4197be3198f108d39d3469fa3a5746be1c6148211f21c8b0be9873234c1e235ef8cedab1bc5a610623cc3526f462e687464a29c28c45983fd7db769eff3839a80893ca6afdf03974495d13618a93238d4690d5b624220c6b39ae87147287205f7f4a5e4262a918c214c467c995c4a410ed9fce5ab9fd2a4d0845fb25691ee297dc6f1097a810622129c74b27083ccfaf2a79669781304fd029a4f89721cbb7198020a9d2397d6f92cd7fe02b5bb6beec5693f383d1946a79f46471133484197dd0f45990f525fa42c2076384b2e421585e8ee21e189139d266d383a77f7325d7891159f3600ae92e9fd0daeb155429ccc0035ffa3c3c4d168fef704a3369b275ecc5eacb48a1a0c3b83266d8c160292ca43fe931ffb9327e0236bab0518b820ee39630a30e26cd0bdd0f112c9c5467d061c61c4cdae969e9a427f97d961666c8c1946d763f69970c5d7a1ccca7c7dcaab4c58b239c0107738d4cd77789b67f9312cc788339959216c1a42487d6158a60861bb00de6b3a07eddac3f75850db886535ec3bccbcbb26bab573a66a8c15c3ae5b6e7906a2f726c05950643303f2de77adaee271acc39e5149d79f5a452a30012669cc190d3abc93ced39557a6d7841815f818e2f1cd585196630091d3f462cfd7a1ea33298e4e5d7b41416b79f371dcc2083e9741ebda39392a2d248c88c31a04a7698859c7e7e825fe8f06286188c16627634f948a29fe09f0c1c627c8e1d38ac84c1b46e3e3a5af58cca1d16bc1856c5ca0c30186e929ad11a26ff2d0e1d63e06041eb281298f105938e27ffd5f7b2cbafca2a0d98e10553123ac40f41dcff4287174880195d3088b411a6e34ea91ced1d5f82b5e1c503fe0b1d5e70c194bb5a25eaf7ee639fb1059312375bea496625ad8cb1438c085cb1400870a4195a304911ad7bab3172d76ec18b81835817361e05657821466b20f553206f77ccc882b9422d440ad992fd8533b060f0746fa5f3e85cc1a46efa3cc9fa10baaa154cd12f05dd5d1bb2cc9243ab0c1d3bd68b9b51852badc509ea2bb42b4f9841059c3105bc2105bc7161cc8802ce8042e198f1849be184e3c08c267cbf82cf217c48c164962ad6fe635be99a438b8c3150702a858f2898b3e45762ae78ec0c5555e1030a26599161f223e50c11fb7882d126874bdeba3e6b75f0e104635f04612a23e24c742fccf0d10493faaa55afb470b2823ff86082e1b554d609ab16913e3ef85882394d8cedba10a9df7e25986d443ca5e5ba54084149304dca4955fe9330126c2418458e0e5237dcbf5e4dc2c711cc9ba293ccfc5f85d16b0b1f4630775cca23aa63672c9b41f8288229594c1f75dfb71d3a114c9ff74f4f1a7178dd153e8660ee3c539d6afab2fd058e320e0ed331c68e0de04001190cd8d10273e3c68e163c133e8460c8656f33cacd4b792408061fd54ea723285df2c7c1e40308c6492a99ec36cdef1c2954c2c70f4cdd1f82eb484b6182ed03e3080b274487f58871ad6c071f3d30976d47b14b3a7ca9200fcc49b4c5cb51b67a52b203530eddfa1b3a9ef8bd3a306704f73e69a34be42e078609233a46a867d987dcb8b103350ac2d0c1070eccae17d783d09318a95346bcf07103f3c8c9a8e8e93ccea54b071800067a47011908860f1b182b8a5750e22676f2332c7cd4c01054e4e468e157ec549cf04103c304a54a579d4eb3f19985218e450e21e6435997050f59986c338492259f58983d2be8149d3f2778c0c21cc45d4a5927ef8abcb8e0f10a731455d1f76b39c7f97368690e3c5c61b4db3521264c4e22d94c82472bcc93c33a927aadb56cc9a1b5da85072b8c6d51bf4cee5ef09479acc27c597c23950cd350b11ccaaa30adcaec69eafbca8aa930cbdac7ec3baf30f7a0c2209f2161725e75994f61ea9cd31f75d77b2b690a53e7f0f1cad9b1e5b152984ec911edf15b97fe2285a983f6a43aad554a1a8541a4ef1c7243f7db1a468b8136bc7880280ca262a14f8487f4b90f85413ebdc37b8f9eac0d8ad4725acf097a63b505030cb544787cc218214faa3295729acd3d61d0bb2fb516af6a5c04061865e8d8919d304b98b9f1bbe06b41597870c2702afa25b56c5a113c36519ed4dfa3bf3a449a305b842c29953a736891ca8441e7972ca146840ed9c761c30b0ad8f0c084e1b4d9a7b02e42c50ab98439fcb68898291756324ab5c0dcb8e16109c35878e6989fcc3a951c5a6424066e7471e346175dd8f0327474a002762ad0e20a1e9530a41c115a77fcb2fd420943ca6a42c52758bf79e70b30c0e824c617a4001e93400f49982c6e8d92ffa583a930163c22610e13e926629f04b123248cd73b1f9f4599675be8f108534ed926a5e0ad113ee8e108f56844f160847a2c425be0a1088f446421e294f64b3bc7d2830146bbf78d1b5fb40e2fb22e00abf038445a54fd8e903827cea1376e84513a76a060141e86c81b5508f520c43f9f4475fa0791b02d9d1d796f4f108ad4ed0b77a2dd2281c8e54b8c0c395d41f9020f4098777dcebd3eac4c337e24c605fe6048393ad354268a501d3f183c5690adc831299eaa0f26a54c629ade98d011e2c107bf3fdd945896186966c0630f8c7e0e3a1777ef2a7a30fea8cfb2a32abf4879f36052dae2485371d9f354f0609ea47c3c04f927f3447ee0710793699e782a5dc93e497630e9f3b8a02c2f5bce5d07935e8b977348bfa172e860d4cd7c1d355e31ece581c71c8c576ddb6ddb312ce92107d3cf49b418298a83d9739c3c2f5984fa16ab5ce001074358b318a1ecb28a6c17f0788369ddc27492694b925f0e2d1c63ecc081e6e10643885b275456342f4ec410a305ef618ca1c301ead10653e5575a7cc5da09150f369884da7c5ca9770b1e6b30861297be2b6b9a8dae06d3e9a4d457279da6b2c300153cd260fc946743bf538edd88ada0071e6830cca59ce4560a92948c1e67307fee9cf64c95c70cd1c30ca670ef9284c8dff70873282a7b8f3298b4b5d29d0ee15d2f4c4629ad117890c128233e7e89ef301a72adb540087028c0630ca620eef723e80822854a0ead1246ebd0b1800580014687b1811b37ce430c46ddd1cf7ccfefbeb10a50c064908102328c4718ea86043cc020028f2f98bb5312a526fd564c645e40428647174c1f5e59d4a8b10a3b71e11887c716d2430ba74a48a2a1f131a35a95147864c19c4f5aa6e68bab8a96940716cc61654988f0c9efded383c715ccd62d7282e7965910ad6048bae2a9b44a9469ebeee051056396ac4d1351fbbf7c0bdec55880158e22838cd7e1de561e54304e8e3de341a4589fd814cc29bcc547436d09fdab3ca460f6f3fe947e59d4e937cd230aa62e1129173f8487e00105934e6772abaeda6b929e605223bb748a641d9fbf130ce947c45aecbe0986e039889c3c3f4a4b9c0946bb50196dba72ce464b30a72dbf3f0d39425a90128c213bd3b6262809a6bab754fd2952b5a99160bc4d0fb22e2312c47c04738ca87b49977812e235823945cdd7a9f9eb78b708e67e19b548d5e7e95c2218466269e4145642daca10cc9de39cb091d966e21482b9d773c54574df423208a60b510f3df359391f08063d15f3b9eb1f98373547cec5922732f48141d407ad13a7b2d3df0383b6a033c6a35afc5becc103c307191a4107152e5ee5ba038f1d9854d7430813ce5d769d81870e4ce221eddd6c4e7ceb7268d5013c72601e25cddf52d8b99d706050725287d95d2af9d20dcc6341461cf5882daa640353746fcb7f3a5f0373d095e58296ee3ab57bd0c07c41aeee877f0bca45b330874fd1375b21598c2c0bc384689f6d42b81297c6c2ac7773792f291d151658984c3b425a3d3141e7ee15e64ff14d3c25b9f12757982cfa9f4e69c425cead30d94c50ea5a192bcc97254ee8a07222de641586eb38d14665892acce9114d5e478ecab2a7c29862caf42ef68a5b1615e65222e9150fa5272a770ad30749aa6355a8078f780d5398eae365c8a8b95ca3540aa355e59b92959f657b5298eaca929acefb288c91e2eb7e999feafb88c2a415edc3a5dc1e77e95018f74fcc54f5add5433d354071353e61f6339d453e9a0e1523353c61d0aba4c258881a62419d306788ef9e84942e5b9c30e558b2b409a174a8bc09936be71cb3a1ba19499a30793ccbe1eec2250d4f260c39665cec889ae7c8983085b90e72439ea82eed25ccb332772a784553794b18a48adbab24d3a52bac84e14f58f077cffd5f1f254c3a854a0f5325dde5da811e0c3526619e7ca584a4530e2d31bee81dafa3d4908421756e8f9f3a464dbcaa46248c77b94c4b2a1d489882790a8b63a9d32acc21a8f108e36be80ada9f15bfe38e30bb581221f77c700b320fd46884298ff8a5323de1c67a4698d296acbb944256faa04518d7f4c587491e82f228c2a4e625bd5af4489013611042e9db383db2e2d5351061d0d18d5ce2b4ba2b5ce310e64f3a5d9efa6ef708d7308439f4534ab9ec92441d3f90386a14c27c93dc92b2c8a972d9350861f090d24558b98c177710e6887a6a94526acb4b158459f65ac289100f25c14098b5e496c5beab1ab90061f020df29c8fb0793344fefa5ea7cfd42fc60c8716e9dce534508d21c8a43c70e1490fa52a30f89a464b1439ab152f1a1f1d44fe35b9d837ef70835f66035f4506e301935f2506ae0c194dbd67d7d2997bb647b8752c30e56a30eb9a3061d9618e2295eaacd0c49cda1e45032cb41e95ae7f34b8d38c0e10d35dc60c8c1a329b517133e477268951a6d308a0a9153f66c67a3424af9a1061b0877fdb983aa4e9feec2011ab061c5861a6b2835d448839d19775d22770e5a34941a673087a092a88537957e3e6630a832a1df6a3c0417498d32989258a5725d512177b66a90c1209fb79329296b5be9320e33a0c6184c962a17b27eb5421583215964fb90440e234a0f832923fec8fcc8c9e3976030995413f2329fd792be6036256221c4ae64fa725e3095e7535af4c456899104d4e882792376dfa7ed082f3f17cc294aa94dddb128a22d186d3ee354c5498bd5b56092f3eb19123b8ee89d0553c5cfef66b609a5e21a5830c9ca57cef94d4feed5b882f9ecb5472f2e744b94420d2b987462478be7137eafad82e95489fc5137c6bed627d4a082399b521fff0c5579255330e508faaa4b9bdc708914cc5beaed34e5ad27fb6c881a5130c972ef34e2d3dca4ae40c11cba84160f2164fc8d97851a4f30a5940de65a3031d953158cdfa2bdfda48c127a2a186ef29b4e16e47dca4fc1fcbda2a9aa1242eea56010b23ea468b3eadfa360f4e06e93663334475030253593ad2b9e8f799e60b4caaaea61dde26e2798a3d9ee95769b60aad53821ad3e07b532c154f2ba3627f98ba94b3088a98a4a2b2a65a8a80443aef0f0083964480b26c1185759fb67b2445910090695211749298f6012251efa3bfe3d786804d3a735f195ebb4c72298a49c4d925ca63f494430873ca76ee45be2e8433004699b163e470886536f73411c0483dbbcb85d4a5a3d0c04d3ae4e922221bce97f6092f922df7d6fc2ef03a399acecf5ea55677b60b89092497c0f6ebae581e14c5dd01e4af489650746111397a39ed6e6d4814179102342acb96e990353ad5cf61121d94f38309b8e7c89c8bf5fc21b984ca7fd855fa4aed106863b0b225f24affbdc006a6050916b155b594d6403a08141a794b5099ef2df9a85f94a9acead59177b72b2308886a44f99a42f25170b835fcee1fbddd67e82852928f5de7ee9720ea75798df52a8c9ea6e51f2ae30495321fd2f4798ebad30779b30255becca73569847c99d17cf3e428b56e189b3b895f6518541865013d74da93079a6a864ba3a94b85161dcb0dd10d14376b9ed14265d36de67e725c536539883b69b09b695b4c7560a93b4243d6ce5d65b6ca4306986e8cdc893e2a6360a83dc0eda6a219f1aa589c254f154ba09f5dee15928ccdf21c7fd7039478b19284cee41242d7921cba7ec13c64a491e9e52cfda324f9862592869bab24e185dc42eca950a9e943861f8b3937b7a96ad4d9b3079bc9ccc52f8772f69c29c42ccc8ee398def9f09f38bbbfc89f8dacf63c2107744a79689faaad725cce2c154dc557c0fa3b284f12559a8a462a8495055a264316ad2cb8712a694f6a1174a9b9f6712a64f2d498e792461ba20d38478ad98e444c2b417ed5b2f05130b43c214ad4432f72ce14c7e8461258b1c9d1d6152ef3793a32b5d781b610ebd596a322a4d5e4698e5e64c84761761f2d60959bbe3a4945584c9824a2e369377d79208a39b277ddbbf66722c441846b99ae713eb10a610512a33312c43184ead7c58e844d3b12a8439ce8776c812b13f5684305ddd96490f7ee62135085308917216248c6ba4046198f0ed9d4e84ad452a1046350fd1f361a9650284495fddffe4ff0f26a53e474e9dbcb1fbc1fcfed172f0fc569e3e9884befa8f544a08a9f3c1a0be751f3ffa45dc8329a48810b2280b2a82f4603c194b425f48bb521e0cf235cbe782182174f060f60f7a64dbfb7ad0dec1687a2b4f05bb1896dac11cb1847ab31b97531dccab9926d7d1b62b4907c3a5ae389d35f77e0ec64f22ec541c192d3939183c87784936be2a1e07c3cc8e0a9ddf720e1c4c522cff5d10f9c4fc0683274f35498abc5fdd60ccf7d6f50e5e7e5a1b0c6f31da62a7fd8fc50693a98b5d5297aff50ab4035a0dd0620da6b8369f6a3e77889f2fc4f8a2ea91181728d58231ce3e6a1d0806188f703c12630c0b68a106d3da2429492b3db5d49206434ebee3274a87701119636020c78e2f3c906830ecbdc4bb94a4447afa0c66dbd05ea15bce3e8b376e98c124b36452d48bb9193187d60bb4288341a95a917f11055fb000c950ba71b12e095a8cc124420c51e7f145deb939b4d6085a88c1e8d98476bb896bcb4b0ead42042dc260505e975427eca4112139b4c0608c14dd36d2bce97a3487d6174ca1438aa269ee1242f27788d136042dbc603871baddf5bf6288db05432eb7a03f1b4954680d085a70c19c3e34cd6cae554ef4646cc190937ab0fdd9329d4488f9400b2d9852bedcacf55829b4877ba045168ca22d1b93a45eeca494430b0ba611f74f5b912a5410b982314c8b8cd02d21925273280cb4b082d93d66de5de6a96cb90a260f2f3a55fc6c22a8e0f2400b2a98de3c46929299ff51cca1350573a9a4d2d362cc8ba839b474a085144c423e7838f9133943290a26d12d2967534a563415e2400b2898b2e4634b46b08b1f22e30906d392bfa408cb6f4232be00e3777c91830538767c099c60788dc9f36a22480e598b26184c249576499e98608c3f1d4f5d9dcea7db128c727672d13cbcae6436d04209e6ee341639abc4f57c39b4080db4488239e88cfc6126c8c96d3312cc92b53a5cf676b39c600db43882419ba70e23e1432c39d70221c011032d8c60f488339373c5cbba96a145110cf2567476b7a70eab12c1144158e44d490dc170625623a96669deca022d84602a135a41684f104ca2d29b34952c6ceba605100c4af256b6182afdc5dc8b1f18728a55d59ecb195b0b1f983dae9b1059630634800c2d7a60d6bbe42972cbe520610b84008701b4e08151440951714cbda51196b1030561fc0e4cbac43556a4e724641d9836f77d3bdcaa3de93930c4ae4aeda633ab9e8303a3ecba5c36adda8e90b2a2c50d4cbd13ad7b2b6803e3dd7b7e9178e5d0c2d13bc0784fa2450d8c9e23e97ef5d0125e177c41068ef731c4a8fa2f74ec602d68605ecbb5fbe5f919083e6661da4ff149a42bd1294cb230d6b7c71ef56f2ccca73fafa948e5a7820a2ccc2971523635fbc123f60a2b5718f968457eb0c22fb52d4aa7be5433aa2005df00f41d28e35598544e27b61da65246ebd0d1a90ab3254b62da5482f5376edcb871e346710c3e52b11fa8d08f53ec8729f6a314a54881a3283798031fa2c8a2f885b2ffec5d0ead120a497c80420054f8f844294f24f9e8c47e70c2343bf223885c0f99e5c7260ce925c73591224d1825ea977925ed3e32618a3ef271ba5458484a78840f4c98e349b952d91f74e464a9aaaae2d59278841401f8e0e31266af57d93f5dc994ecb7101f963058673711cd8a641556c214565295f6d35df3154a98c6e3f677927cf25927614ecae2a78efcb15629b6860f4998a35aec8fd029c26cad868f48989312e167d7494e9243c2e02b4aeb484a23d3c2fc0853484a922ef1af5ff372e1c31126d7dfb514793ea4a53780034755f9ab7e34c2a435aebb3e6ef12239b340087084e0831106392bfab7a1c74c9b6edcb871e30336bab051011b5d6cc0461736bcd841860a4ce00bf877803fb1527c2cc2e423b15f4bddcda88daa08c3ea07110b7141899c1435c44722cc1d4a9aa98f93453dc515f8408441a85790d4ef761eb239b474021f8730689d1c7ac7d73f4d7a8630c912e33d4207319dbd1c5a37f82884e973a7c8597452ad5557e68310e60aa22dcacecbcc773e06611272e6478e49b69d7c7e08c22cc1c428cb57e7d0aa127c91c418031de22310a6119f5c949ecbcaf00108d344cb14e5c1f25ecaf03118902e50c68e2f748c6182ae001911b871430e1f7f30e7f83b753b3bd5c9f483e9c56c73e4927a7f3f868f3e9844defcbfd8eda7a3c5757c307fd984747bea3d94f1a187fbc8c3071e4ef071870f3b98bab3c79bddbf114a99434bc3401f4883c0471d4cc9537e76d0952475300a1f74307c476fcd0a5e9d4e3d0773acf45b49de45c8ae7cc8c19c239ec59b10f4d6f97130987ef91a2bafd61a4de1030ec6d49e305ff1fcc0c71b4c4245c51391eb59547d810f379853bea47ff445aba74e8bf0d106b36c7fc7fc10e1830de6d8ae3f16c6b3044fe7d0da127cacc194a38e5d8587726891812df85083dd488321a4ebb7911ed53c943ed060522ac4137b11c9c27f39b4cc56f07106a34aae8bd748eead5d0e2d523ecc60b8bca117b2a5e8d3ca709611cf419bc841962a0f1f64308b929ceea2f4942c39879681f131067392102e27219496dcfe210663968892f3b1164ba6a44cf01106b3e8ecd82147aff996c060bcd7ce31ef39cbe2ff05d4c7ead91ea1f78221daf797b8ff127d7b170c397448f418f5a34605401a3eb860481353d2e965b914a12d9854dad53a9531f3f368c1381662363553f4083b0be62c216a6ddac7a4ab74e18fc35fc7183bc8b00090e1030be6f32cffd9cc662ee86707d1d1858f2b98ae2628f5cad6bd11cda155868e1d4c820f2b1865ef43754e57beaa0a5e0529c031868be0a30aa6bd345bf193914ddb1c5a0db871e3c68dd2c207158c7d3a2d9276af1cc99942a9d5249b79578a9d31b12a45b6e5ccb61ce514237030299f91ae633904e5f21b4c9384de272f49e7f6bac13c7a5fd4d36e83e9520ee993ecbb1ecbb2c19c449caffe71c927b26b3097b2c8eee9938945560de6f70ef2428d8ae1a13498d3d2e51115644754140dcfe5f568217c67309f0e1e6b45c65e546a0673ba203e44db74e5b70c86afb4eea04b326c4a07710c0655f91f23b622622606c3588630b3097e15296130ca08d9ab5727180c263f5608f3f98241afef930e72b2aaa770e105839bd2a75e4dec824944db63c5885fa121174c22c92677bca878096ec160979fb44794344a490b065de17ff4f49ce83d0b8905635c9e1142dea8eee80a86b3b4353a479d1ce559c124776fd2636d881aaf0ae658d6767d65b2e7a682f1d5439a5842fecbb42920175230e9eeff9deb2d0a26a53de759c996ad7228986e5cbc2798b32d4c8ed1a25fbb13ea46185c34c1543a45ed22775b9c09a6531dafd929649120c9a1a5e3cb68307014187d19e06209c62b9de0a5ba7343ff71e042095c24c1589dbb3b7c091dff215ae00209a69fdfeff41caf3b133218471d14b83882e1949945499d9629820b23982f9bef4f1e0f95d46705c145110ce6d6dbfad17350e5173e70410473d292373629cbe5b447072e86601e9db7153c7e808d2e6c38c046170db0d1c506810b21184582e4121145a77bd8858d2eb60c2e82605c1fcbcaba2176470b04532789a15ea935f1bd1f18cca4c55e79644df190810b1f9853c8557522268b9fca450f4c7baf272d87ff5316626470c103d36a24115447773db379c0c50e0c627cb32e76c0850e0c29eeacf2e9cd450e3a797376ab6effa92465e0020786b495761ac954acb46f60964f2a89c91739276e0393c872498930b935b5d6c01474c70895a95e12547ac0050dba9b24232ba2e634ac599c83adcad6b59da4ac11b690c50db688850eb68085f9ba2b4893943cba9eafb8938a676f8798cdbb852b4cc23d6bbbd3d7832d5a81c9cb8c76b95b0af261a9e35c9da57c593f45cab0052bcc22797564464a255cb40a7307afdc4e39d9c863a42d54614e79e76fd515f2368e4009de02376e90b1452a4c15413b7df874d926541864ddff68593bd3ff29cc663927eae84d61d2389d43089582e5be14e688e35eef41fea89e14a698a6d25c5cee18a351984bff57ae3849440589c29ca38733b7cd4841140a935db66c4a10280c2228d94adae779743e6136b3ceb5355599174f984c4a501dc253c65b3a61c849d4d4793271c2a0e13b3657164b846913e6d8f94474c89bce9834612cc9ff5f17a64c9857ac6274a8113985244c9843aef787e78e9222e912861166691b7611f4b784c934f43e88e4f61faf84c93e7e57c442dccd2961d02ced10569f84b174ac0f3a6478278f248c1f3b884d4891827922619e5461acc44bfe5343c2fc31717e3c8f30bcd66737f1f94dd88e30a57ad68c8f5c177623cca1941435edb27b624618d394bc8f7c2a4adc45984ec4d6e9ca5339a88a30b6094f59d9761a6a220c26c2f7e5583e22cc7521c4ef201f2a967f0843ce53a2847d6f0893b687f578f57ee2429883cc1a1dd74b432511c2ac3a62f205916f310863bb76ecbfb80e0ff91682309f8a65e792238418fb1681308893a839e2195a5adf0210e636df5691276446eb5bfcc1b0af16c95b5fc2567c0b3f9882c7db9517b116527c8b3e98459f7a9f74214e8abe051f4cd75945948abc1443df620fa6b3cfb2a65c2ff4e75bd8174b3ccf8361467799b430d197381e0ce67ae931b4a4d1d31dcc96e24ef72b685149763008d1af5b6d1fddff3a183dda588eed7430e414f5ed4d55bd85e660baa046fea5bbe55b0ea6d9f794a026feb738182f2bd43d75e0605271f1f0a47e8339a5bceb0bad52253798e34e1e21c279909c369853e48f0f55bd50321bccd59da327e556e1e2351867d3845259fcc4bb6a3077aaf594928cdd3ad360f64ae92dbe7d5096448329d48a6e24213a8361e457df64ad24214466306d978bdcafca6012b2562fe907dd1732183b47de4efcfa121234069332cd0b6b9fcb845e0c06f5da2517642ede1e0653f0997cf36e1f75301844b2f760eae677a22f18438ca5527f15e6e40583a5c9eb419f5d3082bcd456551f2e983bea576ed12f13e9b3059352bdec22e6aefd1e2d98b259d85f6fb3609caf5575f7327d27164c17e249d3bf5faab62b18ac6edecc3c248dea58c12c5792424afab72d75aa6092399563d57b4f52870aa6f1bc11715f4d89c99982e9b3e3e4775e6df7a560d0fccf213b488adc47c124b4f34eea4eb524878249826a27fb4b1e6ff4049399f03991171155e404a3e93c53bf222b554e134ce9a5bb32b622489709469b7cd9a936b4057709c6f77c49217cbc8d5409a60f23e242cc49307f270f22e5c86fa748306557588caac81a9623182c9df008293d093d8d6090bb586f962c82d9bbef674545634b229862a7bc3b62db637843307de978f1f6c8233221186fa425153d160453c5f2b812daaa7601c154229efeacd23f307956c890798f2b91f68121a924e31d44ba07a6506aebe926e25de281c9f6d243aaf2f7fd7760502522a775905417d781f9375efb2ee4b4a6e7c0701276e2acb5fce8383077ad6cc5741dd9a31b1864c57955dc0606f51cb7b2a57a54a706e6499d6f64c549a1eb2d68606cfd30cfc2f0933fc8139327f2c2b230f996a88f34636110a34a7da59b6c238485d152ab67750bf9828e5f613cbd26cac6544892b12bccb25d137eb74e8818b7c2545d4105694a75569f158620742a7527fa53f65598739eb8cdc8b5664815c6127fd1c4051791745261ec48b2737b0e2acc73136e7e445bdd730a43c85ed95f3e58f0b429cc1a415512c12e8529b946ecd433e2634c0a7384f38bbd1cdffe1d8521fe9bcab92a2461ae280c22cb3faaa7d97d341486ff944c6c43a9840b288ca222c8351d2384b37cc21c62ee9707717154653d61f0d3f9729fb690796e27cca7e299e9b5fd4a6e39611c9d7049fc269ad8761306f5924e789296f6add5842129f53c15399795da4c1843fcacff4f887f92c58449d5e5d74a7e09b3fb4cea0ca54ea7c712c6d3a9535d48b926e454c2bc365ac6342d2da829611293b9394a5a87a727610a959d51315ef5b6240c96dec1f298db2871240cb953d4bb2843c2943ef39e4f7e16d3238cab13fe43ce4ebb144798ad533821674ddba511a67422443679a594c90853c861524ad339a91c2ec2e8494ce57adf5baf0863e55688fa9d26c210ee7285fb0d1126a16562debda713891ec2fc1ad725c43facc91086ff112682382fbda5421843fe7d9c539d5813c2e8b1a1bd2372f0941f84d12dbc5a92ec283217844136526565c9ae190a845952bc78adbb97e40d089388fc96d3cb7f305ea7f3368b1fccc183eeb59c132fd807f3f79cc80a13592be68371478a4a16477fc5f760d2e55e6efa7b375a3d985fbe2c893c0fe658263cdc8b07e397976c89bcddb97207f3890b95dca61dccaf61490569d6c114621aca7ad4eb7f7430e7f710b573fe8c797330e7a8cadbede460109174bac3cdd8290e268dd1d93b9c9ed11a1cccf9913a255522baf306830875d56b153798f3e4450a6252da608ccb3935415de58e143618548e27d16623474f6b309fe8492a484f73755283d1e2a53209a3e2b29406f3c78b8c460a7ad6a3c1584abf2fdf728aba9fc1a4d732526d6e06b3584e91c3b9fe8c5019cc55a56d821a9d9307716dea7941c9680ce6f5145641fb9f9d480c06612e9ed49de5dd270c06e9c982c7f224180c2373977cbb53909cfc824174b490e9a283053bbd604ae726b2b729d321ce2e983c9698f0cf2541cac905a3eda5b7683ee21ae7168c6ae13e24fda616ccbe26b73d55e9f497cc8239c6c9778cf928ae25168c712ba34223fe25555ec114c92cdd64a88ca8d20a463f3b8ceda8946fe622611c0a0743815018080805d54d1b631408002028200cc562c170a86cf500140004372c263c3630202e1c1218161a161a08c2c150201c10854181202810060542c1602022d0c2ea0030763aacef3f044b870e0b54e00cf581fd7a02aef87f1719afee099cf49f71848b6ac740392efc3f37f0c8453a7d7403de00ab28bfbcafb2307eee171de7bce471a0feba18d1f3ba7a1a789cf4f97f405e9f502b87b0b7882c59839e402a50385fa3fe2a2a708c7ac3ea2e18c305ee11aec77cd036b820b910d271d132f9fe2ba882a3f2a19d16d06b8ecbf131c900fe481686fb17c02a5315f2380c06501775fbd181979fad95463f34a7a0167197f7bbea2a0a229d676be10028897eade2bf30198c925d2889d5da6bc02abfc3ed32372d800ff696c628ac6e34a86ac27b75fdb9075e486cc9e72e1544e57b6dc6d4581d09132af8475e7a95c973abd9ec8a0365f490a31e4cc404f4c383db9a08e2d929097c636198ad54bd40a05ec6efced63a225ee3fd2c3758ab017562d8bb973670e0b77b6e4c9fe05d59a932fbd736dd152a767c29a980362a424459892da5b8e1f4ff5e39e37206789f3d107dbb09271310840e6265abb1f788f1b2677d0a5c7224d80d2fac2de1c7c572d248add8d9b94ae14a34b5ee90237396f0549fb38f8fba7c67651731f5fb537c65948a215cae5b7b415799ad757e700daae3d039aa9a7f23db55ac4158149e50f0a41576c33a7c85fe377e561f30ed2c5719fa95e200e26835f57258d588cd8eed62f5ccefa1311699256048f1efb3e5b611373044861944e84259cd4c171b3cec6ebe9139c0ff977a998ab4b1106f0d57c5423c53b49be309b169f64e1a3e9c78557c0c1a9ee8872008a5552c941265d8f9410701c2670e0811bebb02fcd323a56069a882c139af3e6c29b00aeaf40a5fe01dcba9532b938ae6e741f44ac161ae155a1b6e48bc9e4b7ec7323bca98e01e3af01fe0281888a30e525bb9cc515244fcfdf09d024d3dcca2bd649b23a1749d89fde3a29e5e4969ec8f2f2081755ec434c15de4b566954061a2eee8a49de4b59dd8b60f2f50510af08b9dd595f1b0515ede0b28cd138eaab5fc41b09394f0a9b1ae8fe61d2ef6814e4e73795387edb269f4f528625f90d64fc2e1ddadf3781dc22296d7ca882d4111c2feb8d327e9643bf3f153daacfd072f631c9af939d90336644360a643980b1c38e8b202863ad9a9afe3ba8be03e1ec1ca21f7be0c17068254305034a1e2723b7070ad4edcea3056623ccae37f9da36f8b048a241fe4095f433b62ece0413009d458022fd3fc33c40eb6a92c6c2d44edb0c568014b3be9d0d7ab39f8f8a117d9d19ddbf2d120151181227184377f2477f6ca1fd1c13ae47c1fb5dd24e16774d02e48edc3fbeb5481afd4c9bb4658c4ab68a78a3a8eca22e6cd3d3d12a722fae69d6cc2554007ead81dd35d1d2d386cec1b1e7399f084b4946acd72ebbd5d039b54661214311cbd7df4f681a4745867affc111da47658171c2c9ce355a82b6f98e0d4f681b9e03774822efc99ac89dea93571898ae829d82f7a9bc6fad8ab765617e7d8afeacea9d1638a0e8d304e99c186d0549630894a0563aa78014325284ea13782cdd2ae14675ad9eb202ee80ecc290bdbd722ab993d12d41a67a32731dbb8cc10538a656e8832c008fff62ae66a9912929a6978d6613590962dec913818da0788bd85e26c827968272f2acbc16c03ba11fd3a8ad06324dc057e59f7e9c21f430f5b2c014bea4ff08d335cee3544bdef272cd79a1ba9b858e24f9904442084f8c9f3e0c2a75a25513223123a5ee6afe8a4aedc1d5da98371806aaddb24648abca28b66606223f4586655e2211733396290bda3ad4ed1dbda2e3dad798ef6e663dc11b42394ca737774a58ec44119585e1ede5d533fc234202250134778e7afe4c81ef930d588f5eaae0aaa6fb1bd611347821444000a456fd4460cc49af0ae204ebd4a134c15d2a13abc63ba2ba3a439ca128399ccda5305efc3e8cfdd309fd5bdbbab0c2b94150e9de5dbc5fcfb708311c3e5e73b5bcbb56b47723a5d92c08530f1d311452728b111d68aca7bccaf90f848d90aa5e54eab4b6e86957c2efc806c508637a66465eccc8b72e3c5ac3a4633c52d5ac5fae5bf5e8210f3030aaae834fd54a08ef9e91dab0198d38e7c2044b03d3f98e472ab284f03602ea7a67d150a72692135c8152717bf8d0bb6bc89869bd4b115fe338f9fbb72f092a70bf0639c39a07a9ca5ad81088047a6f0c39a7ff592c98a2fab5254cce82515a1ca7108144619d0a520fb4fec3ad7ae654836429f2a22d2bcc10f362a33e8cc08430c89344ce28253d02227e6a00b91629f08b6347b46f822f5586d20ff97e25bead968ccf32d4760ce8bad9525644e00c687644875d6262c71982094d50d228b74eaad1d2ff376f72acd2e9855624203d91ace3aa4b4b898036fe62f60dffd41a83c52748de5d27c7e904759783431ffc1112b325ed6d99178d8bd2ead221adf361c467232cb4fadc1626a10017cd4b4d1210ede70fd7f836b03f1c7829ce7201d9c2f1aa100fb2424fd42a86ea8332c8d9458ace43dd900fe9c4bfaff4b46a1288c54b6639e50d07ef7dc998651c43a782733a53bae5b2a41b63ade885a505a9198ceaa72cf5f8c3fa47f38ff9161d4926f34dd47da0c8e64972658d977e12629c24b0d5681c0134801604e5c43424ec097c856b7aec6c865ebdc9e33ac111ab44d19b3276150b875d94b39cfc4356bbc7cb57a1026974c2996896ef38dfaa2f8712132b5ee65526f7b908031d7b9162f75e4bd100cb15f3be58c2daf08c2ea1e285f1d7d3285eb416d317af8d1574adc9d95bd29e6a2749c6a7aded8b4efe6629dd82a75e0a62aaf875b379ef080bf14a5aa8ad1a7ee6dd3f8483272be51e114ce0fa53cc25a3ac78dd737b8dcbd44b51f6f06b742ee0915f45ad9e2d5cf9a55fce006eafeab40508bc3206235cd22c695ee17ef41f1ebc0522a67ddec7377424e808bae436cc6c6fb9f267c62b3256d66c595cddbf58f0ee59aa15a14532004b7cd79e226f71af871873c8878f3bbdb7dd368372f2beee6842357e82a217862075132498144615122a23ee13a664b9118b13639db470db94eb654bdd85937c34c0ab8ca279b2fc36b1d6a053b9ec409bfd4e161f36913a1b9ca41ec51f8a8ebaf9f2e0730de8548add5fb0c1267ea8d187656f76660a3182c5b322c841ac690d46c5824ac82bf6cc076bac2257199a1880ece13b64bf372f6dff55cd3fa3995daca55b6bece351ed7ed6cf6e54d8be5f45f010e7f1bbfcc9031b6043c0fb92e280f979dad768028ee931a1e1fc4e434a3e21b4e2bcac621e80c83729f90a20a91a1100becc93712353c605aa476117c105a6926111f8dab645d45fa782d8880e977c34bedeaafea9eb88558295a8d5a572789c1a44b29ba2321e9c354b1b2389b9523501a27ae392f0fb6604d04fbcd4919e64460b1a535aa0850a48e19c4ccd1015cdab2a80e4c7d0ddcad650a53342f70e29eccca81a65a705fbff9464033ec5eb4bbd8c5069c8b0531878b1e640fe10b85968a42efc3f28d17f2b772dbd4efd3c53ed47b942e0ce450f1814214af9035d5495f5d347767265f64ee57dc7017a4d7c0925d0b84d5ad4749a899e3894ba0cfb3c6707ba8c1c674784d95ca95b07906fdc4bf2da1cc51af9ab194518c2efaa8b7dba659d720424bd4d9bd13864f03e6dbcac62c223ab04a13cecf8a2530a548b9442397c8df8bf225abc49fc808afc48130c6d7b0c687f87fec1133f4be8ae901540d0d5283417a2b5908c06c9fbda990c1e9d3b026ad671398aea3edeccf4222fef8fa3f137ebd3a36bab1de42d1d90b3a19019a9f2849d3f54b9c03c47cc143696c202bc7e6bae0605e1d9749d840686e2230208108f2328ccec5d8cf1431b3d071b357152927b24f8570146dc175661927142ec972bc9a36b0d1a681a2a2fe70b1a80726d14a0ddca771d80ed6aed24a4896a8419f491e921c9ee364112f880ba4fd5ef183dd523273de6e583bf2abaca78bc44a08ae18bdc08dbe7688fe0900b350b4808f9c33a0a46882df5dbbc52a296edd72edb510e1ec8cefa489a36852e7d76a04dfd8254a0e6ce438da4e08c42facea6c0b42096a5653848dbce0360eb04d65d8d3974feab8fce68c43ebb21e51436f88e0bdc999b53648d0eedd5140ef19f4a5e35e724bb05c53a3c1282fd5e5b15b05567a25095baa23e744c731e00ada758dd522cceff0bfd10e791a03e8dd383855f9fb68fb7f48b79149cd414380ac957470296a1e30af17b11a2158d9f5276b15eb43b2f3800abc1dff4d500e55a7e7e6339b084a67ec40a819b81221b15ec9f27ad4908e43d7205ad2dd36aadd9bcdba1e5f618f7cc5656102ddf5cda4513c177a91bedcd7685381a645461a1e399b75880b928a94e733d0dad7b8add1b6e3f23d6a6107114d95d81417ef4440c8b96311e7d03209c09ed92da55a5dee6cbca5352dc6a3d1fffcfde11219211450aa8de77cf2e309d6d00fc6629c94c6388b117fbb93f9c5dbca38e823b8deb464808b79c814f01cc2fbe37c7e7f67e3f9e0e726b53ba3d2efe4851673ab50e5d5c5321de1d8b18a3e5f5b61dccf52ae78559aed0b1b9e8dbae60475c427766591d0bb34800eb449eb23f5f2b1e66d97c2ce531f9b5e1f58a0e6f109c6b0f3eebe9f9ae8dc3464350e30c691058e53710b383345858d83e965c5e8c603e6e3dbf910b7fab8c9bdd0a3563a75c451921802eced19d74ae5d5f7de5c2a808784f410793becfc3bc64519f345bc13084afe74756848ededa3220c79684d395e2411e7d3454c09ba2fecbe2e718dcf4d270cbb3262d32fb41953f338820ac53a0ce4e670104a980dc9912194deb788de50a75f96e100b93d0314294cd2c49fed8725b036b54c14100b294c3eb21ae94ec8dab09ec3598a53ef9e2035f7e091393a4924682c16c90f731aa253ce6fe9b7beff59a4ded8abd73250534eab431d15930be916ea24c8567833401ba44de39eb48dc17a9d67502be8f40d483509f4dfd1588b6e484030e30261713bd0cc0d7b3964087e52c1a55d7604fe635c17f78d79b3112b121640c7c6359456e6baa4eef5243130a9bcd820120cafe3d89173e823a91e818b7c24036470169a356df6551d0aef678676469a906eb524dab89d5c243582f11052040267d6b64052b793a2550f00d40fefd27cb70c0550f35b852078433955b55456b5c0d9877594508725fc09099640a399e817ea630f91fb212203f3210db3c2339688f5260ac7770be8360a9b20adfa0454a5960c2d4515aa2a3f33ab6c04e0133b5ecc642773b2e92c3f203f1b5c8a2648cc2c33df83afba5fa42cc6f084ed8fc4aeae5c54475e52562b6d3e51c37b5f4aded48c0d8ac6afa4bf4afc4dbc36da5365c4d3e5d968ce259b1520adb4ba1d8a30018b71c149dbb654c4ebe8d9e2137bd7acbf6cb175c4f116c33b1fac7a555d54a7386422d454a0aa8d81d22cbff57d29378d68fbba766c6b5f2f2ff55241c81a53176917616f6aa03d22a4eeb3da7ea11b95652166999062adb1a815a2b2608cd9241a83d211fe71b8b6aeb886e8f01b44a5911c9def7e089618223d508c9e8130a8c82ece2df4298927464381a38d3132263c5b989e1f1a085830a373e4a3f929e9506a5358c625dfdca11ff9765ad297af83684e098847b2ac9b64c0e837ae5f565f6849a2b1c7735d510ee8d390c21e3214f1892c6702666e1c068025465d7bf4d587a717a345acb97e567661e092376f40013ca9e02991942b8dfc0919be586d797eea14d9bdfcfbbbf36c134af050fb19ae7454989080c2b148c2698cdea3e6ee9c53aec29f83a26ec0249c9a74aa886e349731799a37735d8497f15906e95a9b720164c86e131c2e1b58d70be1a9f508ad41588b7c7a0cfa4f8096edc800fa3be5440c4792dd41ad4ac195fe84bd55bea045a0588cc9e67271873af72ac4d8c7d1f6aa71918697600e2fc402d42a6bdcea53da0e838d995370f8c56061891319f0982eca2675000a1974ef972b7810d15e36cd34646b9baf51aed67e04ffdba35f5a8eca7b1df53bf563143aa1e02cccc5fdfc20471462370a264e5db3d4091dca8936d8e0e026775a4c30c41137d08fc14ed47ff7ddf1175c6320067d95bde75a60b752e9e1d7d015576c937253b837410990fa37012cb192319e10b0a89485fd2a2c0521a783a40dc3ee640b7e7724124669779af1ff53088056ace862ad4db08d0d90521924fd22720c84f8b9e74e055c9d31bc3ac16693433ffa8349239c1b772bedc8546be175adbf63c01dde47bfd0c9f6ba38084d6a7864ea99b5a444a9952e014487cea91a145a259dd9ce6d2a2fa02ed4952a05002fe9854eec363bf51856ad11951954dafe87238878526a429e9e5f950a697fca7cac2564b1e864356e01ee789cf1dd09f1392f291e576b87302868ad17bc7d15a923587e01aa0d390361f224c3eff31cb5bd7796abdecd2550780967eda1b7c3732bdae8fdb001371b81d8f26c4964180101fab05de0825e997bdddc25319a7549d444bf96f92afbcefbc7b31a800e9e8d879d4ded0bc6e4db11311f74474891bcd2dc45d03dcf630703e8dcb2f87b0982ed272d214f675434f4b8e3b3a9c692e2b7999ec582f02bde5e415e9a0c97da6f98cb73f6716ae1ee22373a61db682292b0b9d14694371444cc15f0a87725106f4061472ed49e4c0bb6efe7b78dbeb71b730d1ee42d4c500da89dbdde112354e62db40d083cef8c0fbb2416c6c36e78906bf0d2bb907d7e4aab636ae79b0011db40e94a21b756ed0c01470148dfbeff5b897cc33eff01c01a007e01e4b2019765b0a515e1fdd86ba61e1f826cba8524c8de0909fc665fec3f39b3dd0f86e33e5041d49680ca6358599da8ae2aad6067dbe3b88ae5208472ec80de41a2283b391d74299fadc8fd0ff8dfba8462e407bc33cac8d10bc4aeba5aec0c67e7b9f1e18e62e2a2848e5b271ff8a0e5cd4357f4d23682870e86fcfaf57a2bc73e5a6d16a11784367cd4fba407d84eaf1990397599048592359d3ecbab17c9a7357cd7e3e652272ab51625ff31035a426d615c22102d3075841bf10560f8b1fa9a2087c7ea4b419010accbbd0051bc27bdcc95ee1f65a95cf7be006ed7f5c9425aa40b01a200520ec40c25fb82e75da903b6850e7edb2fe3a00cc61bfa2204e5d6da05e75abdc908ab41975b862e42518314f3621b0f32ac5390f7a9c01a8f1aeced9dbfd31ce1d5744f10eabe410fa26ba7b17eb5aa3dc18ac3cc79e2c3a09ff0172bddba5477d463bda9b06b3da72530d65de733923c4e426ca1186b10362ee073703e1cbb7a31b4c77575b445b7b10808a9db3503ceea27a417a3a2d10971c3848470def99528ea05369753622c2048a423e011a608f90f8148cabec7cfde1d2001369444e881e101af9626addb20fc31d5bdb36d620f8f90810a1b710ff7fbac2f874e7c145324a94d58fa0cd44f7ae951033c1c1b915a429dd01c135291adc09ad23d71015652d2818b5622e3425f556c7869bb25ef48185d84028e45f8a7ac5975a57cb9720337e220194b5c90029d5c04bd086474d11e6dc38b93258636f290ac1f68d073d14b0a4fa67cf69c09774d5614f4670f409c01d842c5c2b5d18df5de966e495912ae4ee7b8c48ca7efeb4b69b3d9c6eaf89a761f55881d465026d1bd5fdfaa9a42d01dccb34f17b608083f654322a44cd6ef0ec6917570597408b6d190efc4290a6441e7884b1da8211a3d11288571e450dbd0cfe8210aed0ae7aa5145a3eaa19b50dbd1afe834b42b14721450147b433d1b9031109ccaf894ef2aa3c8ac1bd423db01de1a5f0379452665dfcf7e12c07f2f7eeab4f2cc7c414a6f53097401d85b278e27a0c910a9317f945a3ac5f97bea646e7076d06ce1c5007c5e0f023e81b7cb354b110c64e91ea84b121aaa04cf03a5d20129db314316895a21b8799acb66b2f52a00c6e63507861bde2e361f8e67666bd77cbe69a54ea9513b4cbfe8fb423b4b813b552c34f9c9d5023983e660a624c5709117c31d4827e90e9666ca076ccb182190ff26582851cb5b9490fc65c05e2765c085814c3faa6402240069c08402d47cbe37d0f90db9bf6d12c27e408316dc94654fc72ecba4aabe799e261c50d9989d0d626d5e7923b73895b4115736b37fd4830c7a53d84004b7855deac6f1ee57bed07a7c739e4883662d61f874768d44790267fa268274db7b270de69d1114f72e826ed41a06e70d12b208819d094362772c53dd0741fb4ff563dc92d861d5a9692e078548afb36d08f7b3cfcbe76564336a1909e2124482887e742866c8802bdb407f924d64f024eb77c9ba600b60c22e3f5c838d585599d7aee999ff0f3402745561bb851debca70e5d29b01a5565376fd278265352b054237080d8cc0b068377619146bfd47306e56b1b9babf990747d3c5a5b889b6da576a7d0b8e6dee2d5a6af527ff84d9c89cbcd04ddc617dcb78147e933a9fd32e142a604e6d6cf8fa9dd50df519dd353eed10c1f4b94ad874f22f91411dd806958c7d25dfad7173724bdc25e3344db195bf7327be5fb25d4c2f39bffa30723fd6dcf8f935254c4825356a6913917719a659b29eca44244763a0f512527202777b69ca9407be72c46e86dffa86642b03f0661a139a46a2126b9d2f871ec0f838458b52f16bcdda25a291b8632e685908bce41902d6e6a83556113e9d9ed859fb0a6119e626731f43aec6a7b4c1787694a4a2afeaed44c4d3ed5ddaa2000b7a22e33f45a7c43b25b17ea642112d8c29ea7825f1aee64e9bae843d195f1e0727562c4f001a84252844ba247fdaaf0b20681899cf246a7956608655cdff836879de7c0c6ad2908460d959f998e088067bbfb223f660194cbb4bab235d1c4a6e8b1bc5e8b35ec99d71442b1b87c87a2c2e0697f334c320416ae4543d08ca953e5d64c4e3b3152d7a681b1597e26ca3f8631ec364a62f388646c87595218d181b3c8a173eca0c5b0256a8987fa614d81116123a39df6283a387926d024643f4b1db46d904745e1c8bfa2bb0547392a307f8c812cfba98ec389039c18b86192f2da4dbef509ecc2338fa9f37c04daf6516fe7e58287053539e21137186cb966608077c3d803bb0cfd3e4b5108037514aaa8e14cf1709361fb4191af580de71ebdc4056822dd78a79565492e68aeabedf9e284584ab83f0e1aa9a960ec66aac24515daa42da6c3aa81299f497523650a7c547d49d1a02cd53cfa4ffb5f3bf593b709012d34bc38273571a6b4afcf5d0c31a2e422970120b5000389595aca2112da475a1a262433d7fb5572874df82f62646a203920b885c1327e8c1e76aba0f8667613e9cf5022618f5e1c00d51e7f384611fd284dba2d6866b321da1c5cd351d121602454da75a93aae55e4959f9f0e811099b70e6e220788718d2ec2f2323734e0316eceaa179392afb9fbfabb61411fc5923d639baa830e147c35742652329f5a01991a60950a2515e595dda05a63bab37ffa04dd2d99e9a17b162de1ff475a5d341085a509bf55722110502a2a4315ddcb4e78ff77463ef53131139abaacc1d97e442e1cd500001e010e619d4b9176c07c0d85c77f25225b800d4f6b0ca26a4e056d3c233ddd9512ca1b0b2fd139c98034e1cf9ef0433be0d1a104c2d738d360d550810a0a1bbe7553113a01160cf20700d7437362b9bf98c1456786cf0da3d7fd99894226f36c89a3a7999b7e7c965f7ccda23bcacbeb969c2ad8167cec14e3902fcd61cc1e29284c9016abbbf8bbc31b7cd7ca90243ec5aef851cb6231ee5c86ad5f388c597b218c2450099e56417c153c7f857f2dbecdc9a2efe621b2024cd672331680e48186173e7499676adb033e35f68776f1ea69ba8d04394bbdae03c5d2c1b4a5a1cffa07c0f4d781772e8366022da45a899e778ce748139f65a9f6ad2d6e738b0507284f66bfe8a8048496c26924e53a1503c507058fffbbc6234ccffb3cc8f7f62d5fb1fdd5474ca2f207ba009f2bb22ea1d13af23028af21efcc36adc46cd997c46c33ee7f2ce8e9d2c6d176298c073d982f28da2092ab655983881653375b39f4d8ba8658e545297b456e644970ae2eb418497795aa2a1c76864409a81f0a0a2a04e8e693cae07d34383f8bcc403e44dbd521eab9feb8c412c1ac3a71b06bdcd89e9718531eca9c53c66693b03d96ec0fb4b8c7d32ba4c94a65cd6259e6c32e9510d6658c4ff1fd5771da7140d84e5a54ebe1e8fd26031409d62ec6d6ae3402ec80b959f8246c601e6452d4e8155440bf55e1adec40d70983a24bceb4b0e86a04d1aeceff9b5b27e6906be1119200674a07381fb336ffdc15bf1465795bf91093790f26153479eccdbce9977f7b95c580e55b25715119184cc3e62eaf0f2e716a3634040edd563c8baa290de0ab72d09d973217a76684f86e885d0e901212dec2df40c00d0e799131bad923dd1e34f7b03456f9eeecd533df8440fa0e8c5133df7143dfe74e6b636dc247892243ce3034001d41a5e29b1f155ceb5194ab26c2729b716acaea5c392b594c885ebfcf44b70fa703c6178427d5191046bfd81f286b5a0f74bcd8a375f0b38a056de8d327e58ee3b8254bd72e42cd4706fa2d95d44186be09a446267171ba50f0d33f5f910752f48270cb0470b23e8bac5478e6d45457133b8075327165fae2b760984a794a065090a6b0a92cabe37ec268f8529ce22d08839d7e76572b0781e49ff472a135d4a614cc55b51e9be7df7f456be7ebb16bd4cce350c7455e53d8efa44f767a8092b202448c7142ce9a8f0df78d469193f9fc17b47b49c8897076f5c6c8f56c8392816d6949da046cb06156c0beb545a3396b9d204ec5e0a26a1bb495f1a1091f65a99d9287c31512245523460cbb2bd4327985ed062ea01c0940494e8c216be97b64e27326e3098abc5f1ad792e679cb164c031acb98c59ada111c7d4e60541cc05d6d5a07407d9bc36f039e4219ae83ca2b2ac85865eb06c10e4c72cf2e186913b294fd6129b490a501c54dc253131d691018e8cc35b6d6066d001884c29d520f40a03e3329405ad5d2feb3cbf84937e2294b390a0c39cc3ec6d7af127ec23f737f8aaf790dcf7dfb9e50c995031577bd717bcf6ca8660d9bc58c5522051bf5a74523944a8e2ddc9d9029d4e2551680be6f3c5e00bdaab980bb1dc5c98b9a65319c17fb702aedc8cd6a5690e48455621cddc6d5760ab641003838dfb7e01c1aa0306b803f1948e6bb2a17fde5fee3e64aa3347184458b25b08573dd1d6bf1d0f251187002432ca05d39a00407977e8f470c8c29585a900b9ce2fa836bc45dd77f043ca59bc41831886d52dab99159e7dbc0f1b8701add0c2ef1f987302fb284d37586dbfb92a1a77eac9bec7783f30483d80410440a77d6deb0a098412acf9ab5ce4750127934b1141ea0040e2753d49217a74eb25bdbc2fd0a2b97788643d44ad1d3e2704fca02dfb61ff7569881832c7f51e22903f2efd43036503a1c85101fb96603a368fcf3284535538b3fefdb62d9077c6fa68ff2836355b49363e9aa1123e3348dd63eb2e52d70addb9d3bdac6eee74f9d225765d145bdd6cb3424552985db3f0ba18dd7a5e9dc9d707e196933ef829c3a802c0926bbc0605aa2d666cee190901cadc300a54d26e8ee03bea9901477d9c358ccb19860ce7020e4d4e73f94d5ada165131871ec122106746d9adf3152e6c2d8c1ef40b74dde52568fe0675ea9641f69598ef0f7bc0c89e3a68496cf130924b09d78b94452ab3114e0bd498cd18a241eb0f11ed745012f66c812abe945f64c3d1a0f4742ce71a939e7b0614cbd580f9582c8760df2013033ee9422cba249681a0d130fae5f0407070d139070d6c99c4d0bdea1d302af72529f03804422c07321fcee94388360229e10ae47b504851e4001d5909c517756536bcb6cf738d6df11c36e45d148c32ee563228df7b6112e65ea50a9180c1ad8b24cbaa12ba8dac426a9adecb5eafeeb8e90bccf5b552b84d7f8f3c87a0ff9deccc9bbf65aa7abe29a6ff36019b3b647263f92def687006c45ac6ae78320a0e76ffe4e48a968caff33718a055cefd105abbd753d1f1e72f0099495cbfb8f5bcc306098d4aa8da30c1ed26c57b9592cb29e25acce445b0cafc99b849a6275590fc2928accb3d554784008d2dd0cd687408012c8a23106d6b4bd1b099cc243cab862a2e0ffca5c8f62bb0a203eb5bca69fa95c22a2ec9ec92900ca8be8802ccacc0acc4ad6cb329f3f4f204b4f1e9bcb3285aacecfef1eb85f78628bb8e40a7e018b036c01cd7a889760dabdade0525009c3a463efcda0b76fe2c329007134ea5a735eeea0b58cd175107d1f4ede346a27f2d46504af9e5673bea39d1b0316ac53d76a0f689badf67471862fe859ad6cc38a40dde94c418db6c40c84ff5bb2f9c370cf0657eefb1da50e4b7fca368723400bc85fa7dcd66fe09d8411a0e8b250c01d369627a1e9926e02a92d365f87283ac2734dcb6acfbf63ee6b41259617ec346a202748e6adb9a2ee8955f94f551fae6f5b39c1676dde3e1b098ec8bdc93e18812d43401162db7fa702eb6c2cb8c4b881744f566b06f948bbc7287504128e1c909116b51292b82ed6d9addc2ed711739fbc95517e721aaf4a38220e07f3ec7579d66777046ea07cfd0ca1781afe676abfb0ab40deb359d32a19fa18f8847a2f4eec1f020598e357bc1dbe0831c275fb0290812f51cc22e7268e3818a821bd52f1ed4c295e8e3fa236c9556988cf66e8d1b3c462509292b3003fc6b4be1147b0b00e98aac0f03de96c55d0e3540b0a6d0013c0c3c0c3c0c3c0cbcc6f05bbb6f76e6d6fe96524ac1003a08a594524a2925cffd8fff5fdee2ad256a7d44ff8c03e102e10e3a0e420e099d337c1c1921030d93d0de2f4a925789c82f213ab87f06eab0e18ba2094ac97b61a3d604d9f5a2bca52566ab9d0b0dc88fdf71467ca034fd110408f2a26462fe3d7efe0919a75d14548d67d1bf65a5f7d545c944b31ecd1fdd4de96de4e2647d3ad6370671519c51275aa2fea798681033925b14e3f97dc9bdb0ffbcfe2003fd19673f5290206fc60f1f1cf0b6618b736dde12f7191a2341cc48ba166a9ca4cb33978bc64802f2e3cf481b810d5ae8232a4be4cfb264631645774fc2695fed2a2553b228480f63f2a7dfdbd7d00e360d72d0f811240564a061d206cc3a8819c9046cc4a2f8e2e94a0e3b93fcae1d6c0b8bb29aa930a1e4ec5dbb011baf286e079327ffe42c69458ede043a7400f991c8b0e18a629f770e5d9bf97aa43dd0400b52061a40d28f5694640d72f39baa04ad27064800831117d860c5a33aeee6242635b0b18a92ea2c5b2332892a0af36d5a33db993ae11a01d2a928cc760665de254f4545419e787a4c9dec77c977b00531233945d97ed47f583f77b0e9036c98a2a0b6e4c867b5dfacbb14e5eaa0591e477e12d4ad6798c1034951de5f93fb640cfa674ca3286be638dfae2509ed221ba22849ba313dbb6c1a99c7c3a3c79b804351709137f1f3fd9f1c53a028e946d7f418aad4ca7fd2193b4868fb89c25ce7cf27496b3d510c71aa7abb393b9e4702188cbcc04627ca291be57490b7cd79730f0ce8d091468fe74441a9d2253295f48b3588190932c0c62650870d4d144f99f8666270cd1a353b401fd0a143870e2067f83026010c46908d4c143d497a62274f4ac932c14449e826f724ff6d9a8eb944e124cffd20aa94a037b7447994ebe7ea4c6bcd3909d8a8c4a57663e7aaae72db6e275be724293132a5011d3a50e271868fc301148c714589e2697ccc1fa24ad0ad272e3626511236177a9fd5c33a248972cea7ff4c17fee5a56ac046248addd9449bd6f318aa03898292f604dd7773b5187ba432464e1f512e936943e7f5b5cebb23ca3187d9342a324615ed48193c3e4987471940dc7e040182361a51329d7de7ed544614e6d6d2e48d2b934a2260631125419c2494b8d993a0d44e467c0419411b8a28c9937abd93242af305d8484469aed3987ac7f2f1161125d91717971932779c0e510e76a5b2933c524c6c28fdf81d86504d096a4a0c423edc5060a3107b09e57f7fab2622e4831075b853428d6e90ee2f423e06d185cb26a9941e357a5d0a6c088215e5dff3f7deadc04620ca3944f6876af099ff75e0a38c327e0710b6b5018854cf642d35decc74f0d7f6bf6ff57c98e1e3c719762ab0f18752b7a9e71d4f4aae9eac6cf8a19cbcf624a95de26c92d9c176520e467c04c1b3d18762b4517b9d5a3767d3238747900f02e44c49008311b3c187c29e29e9648da7d81af38224201cb0b187623a41cec679d72489cd0dde0c3fe3cd80800d3d14b6b2dfa4cfa8b48e6bdf196fc6076ce4a17c15736d8214b355770790f7800e1d7828e86692eedafb1936ee5012f7649ad6bffd51118fa1820e8cb103c87b80db0ea5b2fd594d36deed888f2026384303818d3a14dbc24d0821d7e5830d3a14338b4cd56ad65fbecea16c3a98f451a34c4caf8df44846cc00f23a1819f11104310336e4803a2a0ea5571f1d74eead7a9ce0509cb30c4a75a7476cbc0165c2e9df870c93a3203dfe3c0bfad2f811a447d233de0cdc810d3794d96883ebb0c18632ec61630d653ad2861a2a715d77b39a4f305310206370000563f4d948431b1ab86c9ca1cc8619ca21c48338dfda4619d06c90a13c1b5fe665cb73a6720c255df727aa713f7c92188ab9a4500b6d2d1f9a85a1a0593f8e4e6975820c0243d1e470a28d9a1eed1c6f828d2f94c472bf3c8e121dcce385f27f0c76c24a3e84de74a124669d1f6ad5c4ee3c174a5e7ab2c899b1ed99ab6c6ca13832de6ebbc466c9b6160a5ff3317e8dd69c35ad1ca08d2c144f5853ea0419830cad66c106164a4acc478ce89d6ceae40ae535bb319127ebc6bcb14229478ef6a69e2779548582d20b933bd99f32dc3a74a49971768064b04185e209ff9283cea2fd791f6c4ca1ec492c4da7fec2c186148aed1ecc2449923e95a424b11185929bdcd96e4e7810ef6760030a369ed0cf26ed93a3dbc1a683ff918e9ac186138a3d9e3b6c6cbf836d9160a309853d69fe7c344779770f369850924f92df93fa8c4f9f440f369650d249e6f4bd7fa7c47e9550cc24bb9f9876a36ae11d6c24a1248fdf9a9ce395bd8d4828fdd9298da542b87d890c6c1ca160ef9a4685c9e924a9bac186114a1b65ff55ef948edab0c14611cadbe9bd9f643d19f7da2042b9f4fefbff653bd86c0ca1244bc70cf7f33c33103b820d21944ec9ef69399993a03a48d4084669ffe2d3d79c9c6b4c3bd8ee74e850440d6074fda2f8594f97861abe2886bcd93ba1e4a0a368c46af4a224c93b15a6f455d8782c508317c551926c624cba539aba3576516adb24c95136e7ed6e0d5d94e4605a655663c7ae4e5ba2462e0a3f2a63e5e4ef94c926450d5c946ec376d69363d0235b4dbcf6448d5b94edd3c4367bbd778e75a2862d4a82ead4a1f4c7b66d0c1574c009356a51f2a0da27f975345513ae440d5a94649f3ce11b32f8aa8134be8c94356651ee54dad525d7e50959b1004f16c5d8195c733c6144290d0d5899dfa1462c4a325d5d98cc6d51a68da1820ee8705d440d58144c92737bdc0ddddd5f51ceabf1eaa4d1faf14a3bd8caf81e3e780479b4203dd2f9914cc06568ae285f7e67657687f1d4b4e2f4b97ed3c9f16ed6604539fe8f9ac7385f72ea6baca2a4b64eccf2fd614f5ee1504315a52a516e637e858a29a5a2a42cf7b54ad850b27dc3420d5414c34c3cf1293a9814522e438d5394fc33798a924b53a7ee0a354c51dcd1a25447d73839ecb452f87557ae1eef559d567992a275588d516cf9480d5114e48a126e2a3e49a50495156a84a21cde538cbc9c8ed7c3070f20ee821aa028c94e22e3fa69a5e869c48c0f353ef1c6c847930455d5f0443156dfbfd536e8d768558d4e147fe49c08ff35f164722ed4e044b13fcc468a7f8a36d3260a4ae8244eac4466747e61a8a1895209722e6485ce24099e4c1433438432a91957b3061365f7d96dd18ce631da3bf80f352e51d05227cbcd697749fd09352c514c424992e7270fcda9d383c7d6a8445975ce4c2a97cd303f053a7420a10625ca9f25d666983a5da53489d29de7a4428fc8e0269244c944cd53ede132ffc744a23cef256da5ccfb7a0612658d7f92bcd2b6a784fd8892a61231e1614794127644d94f94b2d45c4ad68e36a2341a43adcd768a57ca88c28e4e929259d7b3aa5c444126e1a624edd6fc1615511879553a8bbaebfa30116579cb92d4e81051d2ea72277ea7e6e4ed10259d4737ec95668892691244dd749b586521caa1fef4f976d0b964558310e5cb52aa3fb2337949328882fa9c38bfd1bd934e2288d29b8ce61c7479186d12886266db1863d8f03eef0144e1e47c2641d59d3cf7fca118f4b78fe85496b2bf1f0a1e4acad4217f1fca5174c9e81e3b43f7e643417712de49da9c5888f7501026876ec6f4256e87f55012d65a42c920e7a198040f13523b9c6767f150ae8c77c2eac3494266ef50f8e49bd1b53c6728513b14e637c99ad6f563ee5a87b2a65e291132c7304de950f60f175264fe3c87730e055de5a7dc3ff4ed470e2569252839e9fc1c4b380e251d1eebffbd436612e1a0c6bf3d25e8f10d2539f6add2edc3724337944433281dcf39e5956d2865f693c49f786c2869104aee5ca26b28e6ea52a742a6869249d2f8c626e9262a4b43493eb9355f83cc79d255030da5fb6cda3272ba2ad32329c8db19f8aa733315b17dd1b81022a6dda60a410d33f8487a7ca0870f1e1a70408d3234a0061946789c91801a63e0710606d2e9e1e30035c480801a6150400d30f03803033fd20d7ef86841091450e30b6490f12a70400d2f74210135b850801a5b1831400d2d8c84d4c8821835b02052e30a02a861851b35aa30c2e30c0cfc0f343020460d2a94de42760e27d667fff0b800f54829b81a53287e14bd398e6d70f9f08aa08614cac94d692b5f07a907d6884229db24edbd12753ab635a0f0952ad10d2632696f90121033be2ea3c613b68613caa3274cd7270d26d88614d56882d76042d75882d75082d74802d640c2d53882d73042693dd4c8243ebb989c221493de568fd93e87bc8c08e553aaef62f3211483be911daf4188aa554308c5a8bee5aeaa6132570b2318aa9db21b185897f809362efa454989671dfd4ffeec31f6457935e99feb986218bd28c8334ffdf02274457353088317e5cd9f634ea393ab787e17251377b27ec74edaa4954218ba288c92459af4a04caf24e5a2d4d9e47a8ff2fc191917e57393eb4439e1d7a2738bf2db8587f6d8649ec43fde041e862d8afa1ffd53f9c69431accac185518bb2c93973dc4e327abada4218b428ad69fb6af1d31837cda260baeb3f83ff8932b65961210c5914b4a6ebecf2751db6d7a1236dc4ea5211462c8aabc1848ecd122c0a2756c9f0a89b34bea40c61bca278a24a103f7ee2c827390118c27045d1db574f0ced68608c2ac1181a18a348308606c6a8118ca181314a046368608cfa4318ad2886127334f4e92c3bf38e3058512ac94f7568901b63ab28e6b859dc9e9021e76a5184a18ad2c5c5c6886bea9224d9c1228c54144ce356cc667bcf9dd9c168a0a2f0f9e4f4261a4b563dac08e314c5dca09b3fab86ca5aa808c314c5bcffb9ee3e29111a64a708a314e510a2438a0af5b42d91a2781ede9e242f615dc7eb4218a3285d6e4e3a74850e19e3c6853044512a317dc7a7c6e8a9e21d43051d581f6184a25c5ab25fde64a6893040512cd10e267e56af8a910ac2f844b1cb5428f1b2cb242679a238629269c5f966fe341a098b208c4e94fd44b76694cb659d1b06270a1ef2e3e9a09a6312e107c2d8444987faac3759d6473b19600e4313c53a39a67cfb9c4e1e6e44189928ea7c7f8edf3f329e3051d0cc314691493ce87c899277d0a5dae27122b444f904d5b4555d52892d4a70189328963c39937c30d9a4509244513f653ae9a453248a76e97a3626c96a7a48146f4b3c49992e29ba448f2886ead6ee90a94c4e21471445c98e08ad50234aa2d6757ffa49ee9911a58d5922f79f44eabb889224d49456aa8892abc972362af49464228af2376a69cac6373c88288687fa09113287289dd2314a7e0c512a496e4c1aabc2335f88925c327f9c5199f49584284999467d0607c126080e23102591e9e435d137aa6a0f88d29a7892b9e9fd0fa55af9126e1ed6e5771f01a713fb2c542ddcf842f9bc2f46699dd30937bc509021cc744caac4fb946f74a1684a26e9e4ee3f39f6e44251cf74ba3c25933c3ab785f2cc763cf1635c589a68a1243ffe299ddfef3ccb42294ccf8f85d2f8b7888ca2be8272d7b99a25fb1e9b9dbec17d6492338fbacfad500ce126e9f8eb39882b19b121dca842317d6e90324a59d90651a16862f3a9569867e9e014caa76a4c8868f9f93a49a1e4b143990acd8d2814348858b5b679030addb7d9a677e7cc7ab8f5de675cc6676f3ca1b0256fc7e89e111e67fc483a636484043018d171c309c593ec6ef35e45a38c444170a309c538ed58b2ffed2e9f1d6c64f828033d708309454f77724ca73bf9cfa90cf33d12193e444002188c88e0c61232afdcadec2cf530d53abf52da419d85dcfa890c327c88e00c1f24d0a1830c1f6528de504231af09ea5ba269b7ec8e70230925258ae92fa57962fc38136e20a1e025e977b6a81290df61021eb1346e1ca154d2efc78cf428d232d03003c75041074880c60874e8d0a103080ff3239940878e26010c467edc3042e1a4f4a0dfadef60db16dc2842e163c9122bbfcdf54c4428e7b4af99bad2d3c35a861b4328a6a8c6ccdb0cb13dba2184723691e1d364ffa5e7835196d9b95c35d164d2c9c0286c7813a2e755915f9453c8b8d02d490cdb7b5341c4172561622661920e32d3677688f4a2e0a34910baa4cee1768382082f8a9af46d52a10413bd4a76f8eda2e4fbffbb5675527a76b6a70bbc42bd42ef63e743d4533da3be6aaad7c3070f915c944266be46eb955d99457051502b49f6b3cc276d92dea22c7fa2c8353741a379b628e9b81e9d73fa5a144eea26f14fc66951123c93ecfc8ed67eaa59946366993139644b923d591473fa9eacfef0f0bdc5a2924db5b3aaf70ef9258969f7eeed6151ccdbe15f7252f4694de4157e9bd77985ab9dcc6d99a0aef1c143d6a94f0d445c516edb8f93d48ba67cdc8a920a559304935956944d29c9e49c319707b70f101e66e42a0a27ef5a9a189eb34949aba220b7a3f3c78979d6182c88a462cd9f19d37bea37c1c813445051cc3d5d9ba9aff42795c8298af996f65defb9bdc414257162434b7dcde69da5287dc6d7ffe7f0d9df91a2b3dbdbb5fc725991b96cdb647be273cbc78d454651eef45dbd4195e0404414a5be52faf7eb94f2edd62a20128ae2485793c4581adb62048a928c25fcf22b63fafb3f515042e6d277db26d5683d5192234556a7ea9c741276a224953a41bb32b3d469443851d20c55e2e9bf6e92f526f44a79abf634130f95eb2ab946e99ae899c4a489d2779f122b9468264ae27e6d6777de092298288c9a583a479ce5c7510e442e5118f599f386eeab0c93250af39a4e6f7e9c1cfb57a21cda64ad5e8722942898bc75273ce8182243914914ece3bd4f6549d23a950c005110914439470df5daed1444225152267558df7c7e0e6132e37fbc09d21969a8001225a92ff37e2a91b1a482883ca23ca2e55293d838a21844e3ff9fae140f1dc720d288463f67b8be12538208238a2745a86879ea9c53b883ed0c0bf2c3870974e8105944b14d6ae8909f93c682d6808822cedaf94cf89344942e53751c0f99e1d32e828872a6c9d174f3203dde047b8862b5efe751b17b37c2b41ce8d09196034c133144b9d377b3a4eaf6f55ea410e5ce572568dd8b901324428872699df966dc9cd74ba88cc483033a74005932880ca2741edf74d69f6a12571d3a74e84823880e1d690439348808a2983a497ba6e24e9c7c90472375754702188cbc48204aaad3e8cd88978fa12402889289c8f966d08afca1e4a74fce25cdd87810f143419c8dd65a19e920d2876207e1217c537b5396f850d62b53a27eeab9dc5d7a10d94361830c72e7da3fea887e10d14331739a9997669a1695481e8a3a2a3dcc2d84c915c243293b5e559c0e3ac624e60ea5bb18eddf6c6287d2e86477fd763742f63a943e57a99079573a14eb32e7d2601e747658640ec5f07b9175219443f16d4f4e15d98ac4a1f0ff39be3a7b22702866ab86a767a76c132241e40dc53711379127acdae9dd50fc2477c63631ec3dc436146327a1340966ddea193664a76b6b2f9fed1a63e2b1aea1c7c40ded396b28270d99793b069983b85f105143e19324870ce2d2640a3f0d2521dac7d3e4121fb3e565104143319f3849f6203798a0e45d1039433964665cbb69c917930b226628a886fbf9155d166b2a43795ff64c85168990a1186a429ab8b13d9b3045c6506a1d3b414f86ed6d911044c450d8f0324196a03496890943e946a4ed8eab891f4ac0504e9224c6532eab419ffa8562abeec95632f342f1f3467f0b3b75a178279baeed7866912d17b6111959f53cf92aefd898ab6410bd55e299ec164a269a2c5e5283bf6aa6af20a285927cd22e466a902786259285628961843eeb1ba1d923828592d45682d86d958f252e7285624cb19e7418d9dcb78b58a1301e27232ddda4bef602912a14d39abea898d823f5a5424143ec7f9374894c81b5bc70d576d9ef589dc9573b9bf48948a19cf477d039097392f25c240ac570ad41c611d9277c4e040a05193ef67fd2b3c813449c5032d5fdecd49dcd3b25d2848266b7b2ee9874899f08130a9ad56c45789ad151892ca1541deac194dc3177c6224a484e1f37da88449250b6df50a3e5fb4464520409cedd9ec77ecbe7c7d86a224728461feb34f21b474348c40805259d8cd5a83629b22b43a408c5f64c8bcb8d458850cc1d654ff668da94c57a079121945309193dcacde6f841224228e898b435dc886d6e644580810c9440041d58168404a31863beed2c510b0146a94abcd131d97af81ccf2441c82f0aba2b3fdb4b902f0a5a7a1aee4abd282921c2f53a6dd071235e14a4c9d57d920e3289ded945c94a8e31689d58d9dee8a2a4d2cff429b9b19c3f1765f378e275c74fda0417854f25de666f12224e7e8b52bf26cf51624a4f63dba21c447e0ca14666b6538ba2f7de77ae6adf20c3b4287d27939dd3b6c97b328b828a3d41dfa5d9c75316851322325efe67539dc6a2f8259a7b4acf38b14f58944c6729d1d6d739fff78a72987cc2bc8893d1f4ae28a95332d4849f20bfb35694f624e9a44fa5d4968715254177c9bf59a399e72b6415e50d4a9bdaef4f9d170821aa2808538da24fa9378d53878e11fb44482a0adef6a1c473511a63dec13682fe1015c5ca1a996234e2575784905394d48d74dfd5185fe2c7142559343b69c556a528462db9e4f1ca5cb1931d6c21a42887c949e4533398dcd6284abae48637315b7c4e1f5114c4baf767123d1fa60d45e93abf9dea46590821a028c59f98042165478327433e5118e1576a2784c9d48478a2f8bf2942e43685fe5048274ae79dc4e81d4fe38eb8836d04219c28aefac94933a4f9ab1fb289722ed9f9a36f6e079b0e1d411219233a742c77214413a5d22a2a5ed3c4aa0c8764a2fc417df89eab90d6d9104c944bbb3795fb6697682197289c949b34b89dce861d628982599fe825c59b54ff56a220feebdf269f0cd71c568450a23452ae4bb83a539e931ef0ac43c824ca264e30c1df5dcdd408248d14826e4288244a2323c306b99f4d258d44a9357ac76f1543205192f57e7487d649557dc8238a31c67c2cc14c52f53bc411a53aeb24c4d5889ff01b51d0ee574a9e29a93bcd783808614449ac2f318b891ae42ac61f842ca220cb64ced9b75df77c4514d33688f2d26a629e9688b22751b3da9ca85e928c8862993ad941a726c93c098f1b380e21e410c551a3ebee33bded961c0f420c51eeac66b2ef6d8014a2bca3669d2b4cc7d22144d9841c7751fb18bad9200a1f4c8d4e5a63ca7d91a51122886236b13adde56d8ad3620f420251dc13ca7e5ebf04a184858028dffa9db898ece8d8f908f943314e3c99a9e304dbce0fe52073a3bb9f96f0c9d50312d2077baf54e688f7f850da36bd26b53b69db6584eca1b46692e64a13ca4c26dd8c103d144e6367fb33954d79939187e2d6291d4a3e40d6062178289ae82da73e84ea16888f1d7c83903b145e5483fca06bb2ca166287b2668a91399b4e72b229a40ee56fcf9b5b4f340bedd0e1eb993fb73c8d264884903930277a77bbb3e6daad7342c78f294d8b968e102287a26556bb92dbf4496996101287d2cc9e7c72f20ccf4e7a191cb69242a72f5b2f39db1d84bc017d720c4ac56d8b380c216e28e6e5292d2f254afe15d2064cdf5454b3b5cb0411a33d9af4fc216c28fe9a24e97c9a394486d7508a17b1617bc567aea386529f69aa4d92a8493a7d1a8a6725f4badd6828c898744c4c5e4d4d3b43d945d5bfe62027c9a6cc50f6a067bb369d8ea326652895cecdfb4c13f3e69c103220ba66b5699e5bd5e96a42dbeabb27b9c428f6184a6ead66265f22f4b885103194de4cac12e3a439d9752c8484a1a8d1bc94ae8b685493103014e3b9668b5f590d230af942d1830c93ff949b53931d6c18e205bf36efd3ba5675d3c2b4ab5a63e8fbb051463bd85c10d28592d0a3a33ce59e0e232e147e3659a6681c75ab42b65034352ab49cbd2619422d943d499dab4e2bb241f782902c1477f3de888fc94eb20f0b66a79cebe659de6e7d6bbcc74c82da43ae5092492fef4a0e5aa1f4e1d1447c9d6c723acd20a40a5e9e5462501993e6f9544844f98a4e4acdb60a9942492eed2489abfc532b511022857249a24ab46ecff0650a8942d94f752a61b2e71884dafa2150e0c6b54e5fbfe55c3ec30c1ef8819027943d27f9724a3576924f1ef000b2021d3a7cfc483ce8e1a3870e1d66a0d1c3439c500cedf1eeb4e4793c37439a50bc8fffb1f53235fbfc23ed383f3ea5e047901498f538837f0401821ec284926670d9f0b6cf6eb21d6c40789831d22395c13692c6193ecea590251453dcc851ee9a472db383ed2e10a284b208993942896a269b1908494231669af8a8b9fef81d87043018e14008120a271f4aa98dee1e53b3834780f038f390239446984c3a4207119d9b4523ff830cb5330e314239080d22b5d7e4cee320408a50d096cbf4a6c4bcf1734a8462926d1b43637793b83984d2a7893da6a413431226c57f7b5c065d308a9bd5f11fcf323d6014932489330529935388e2e9062b13939e849e10e54d269af28f9ff4f24194acad573336cc9408a2b8559b736ef32c9a0e44694f49b1fd9fa53703a2a4730eda9b422899ed1f0a2b7a932693a3b7f543713ba97f2a518c3e94eb3d9f5651627ba1187c28a5af67e5eceb4912630f252f7513d15f92ac8aa187f24923b3c709e72526461ecaa9e579479528e7e6321e8a9a3ff77cc5e68606fb0ee53afb8d7dea9ff2ead9a158aa523f6636da655c87d25965149df4b6838d0ec5d2ab12e227ad6f9881cca1a43586e7e78f5b6f470ea54f62d2499b60b9ea4971287b67f4331b935d94180e0525f3bf8813d97f62de502a39b747ffe437f3d90da5dabece76f7557aa681186d28d8596cccd3e9f7ffb56381186c28f89ca85cfd69a97c62aca1a49f76b399fcf88cf61d410c359433358beb955292ca98186928bb08f18c17d281186828a99929e936a6b7aecf50cea66e9214fff7f12533144c50bd5146b35e5c4381186528a6302592a19c36f5ac5f68d1b4e90e361f4339786f8678d34c208618ca5b9e71b5dd77547976b0b918612828c143d4893987134264f4e04106193eca0043c1c47c234b740e27786704627ca1e8fd66aa24b7d2bc508e31746743d4f76b294617ccf0e12300627001f5e0a1831e688488b105bce32aafabdde2e244348fbdccc6e40ec680185a285c6aeccc1c937d442da30c1e21d0a1438c2c1c72f6c2a35a28dd76b0f9898105ceedcdddeb74bbdd2e3424c6150a4a507e7af6bee133658592dc33324d4bd2d1499233ccf8401a190002e44da0021d3a7480418c2a949358de9fa563ba2b691e4932824619cf820f7080033a74f4894185c2e74f72a2aba7dcccd829943fa7d0eb26ef89a7d38f245d0a2541e67c1f54bcc4e347908c42294443cbcb9928144acab43b7a8f8aae9e502caff9b4799d3c7dbc83cd9d50927247988650724407b1a9408c2614f4e4784a8dc6d1d0498030a1fc49ed9b248a5d8ab684f2784c1db1e935a8d1a96b81184a285bc90e1f32b3e6b8382046128ad6632ef755dea9330d0231909090d71191557911e30825e134b429595b7437c7080521566d4c34e9d2feee15885184e2e67c92ad07914d399e95400c2294cb3aa88cbaa642474f3b20c6104a9d74739e136e83c8931d233d7e9c0f1e2367005112c060c4036208a154825e5849728e41077d30ca49fe53567e1d4b381d304a926a8fec604ad2ca14c72fca7a4a925f64494aeee616c0e18b9298d3497e6850efa283a31725f17b4ab892b66ec4c97861bd6b6c7adea969acd6e66ac6baf03a7969b500c72e8abe1ef35b09795ebdd145613b98dc5f32e82445998b822a6d7662b30f6471e0a2542b7ac4e64dd28d06075030068e5b9446485fffd1265b1456c493fb9eb528e597aaec2eb54d958ee0a045e9fa74099e5a6390f1e1e183052366068e5994e430ad9ed93aa7aa481645f3a4831d8bb2c87cf2eea5a87c3111020e5894936e30d124ad780e32fc8a82eaa4f24c7d6cc47c0439238d1f678b80c31525d1744789789356946f3b27b598132bca49c96b5cfecf7ad45761a9a65988a7912a4a3726d39faa1152549f8a4369c91f4687868a7266f993c486ba0d7d9da224a35e52fea89c126f1ca62809b63542e6529373d5a143878ef48347ec81a0933408384a519e8d757ac3a789ce92a25c2374fe2ccaa46d6c14e52cf2feabd699a194a228498274cda949f36a9ba128f7e529bb2e3150a4f11e1ee655d6f99eb2b1537388cf0f97b9f944c93d7a92737e39888f3252a04347101f65006923e0f0444909f9d929638ccbba13654ffa24ad3e39719a8d596fa29c9ba3aaaf3732ecab89d2079344ef739ffc9e9389ac4a64e6da2a4fcee4d53cc920eeb99b429d60a25c6b6a4cb43b47746dc61c071c9728984ad9f39125a7d23196288e90679ff3a74dd557a2e0c99414d57afa944e8972d6b0aa4cba9d44b9ece7f2f22acf549404e755e7d95521d765e19d5bfd73f2106b672490f9d349a226c18644e92bb3c88eb239b3c34794f399b0fbafb5ba8f7144a966375ac79c3be4868d28c6b4142d6f4acea74a8c684ff5ecec2e463dd63cd478d88fe7a0f9a47411c7c87cdd752e01c0167028a2dc57a71b4f7c31c11cf040b801ef33cf4494ffd42ab7736d8e55820311a5f3bc97e359e37f648728a9f849611fcfcf939c066880c310653ffdfdf3d13a522b44b9bb4a9f7f929d8480f0680352068f206810a224b4d6c70b3b4f9a9e4194ec777334bdf1e67bc4218882d6123e75a893203c7af000f2bb8264d2f811d405e1d183470f34469249e3cd38332399812310e5d099e3e456cf121b015134f904f77ed38680e30fa5fa3add98939a9421f43370f8a17862bc9f893215a3b93e94ade39b64727363e2091f4a65ab29ee33df433963fa37f5fd9cb3c8e40d70e8a1a0b79edda12bda00471e0a3a890b19bd3bd7cda90c1f3e4c1938f050ae93328ef8121fffe11f3e46d87ea426018e3b1493c949cacdfce1b043a9048d9bbbd51e4cec70d4a1f4a9a3c4e492b48174461a2ac8010e3a946793243eeee818b63973287b97789dac441f8fbd1c8af9a41e93b36538e2c08dec6b67998a895ea6a6d97e98f46b6579101e659c91821f41805001071c4a4296dded88d61374f38682f57a1284124c3638dc50b44e3a98f89ab4e91b471b4c725de610a7a734be053e74a082c4c18692d299479ffbc692adaea1f8195aae4a434e9e8c430d2559357d771855429685230de5d22173b2666fefa538d05050db329ee93736fcb3836da4870f1fc92106c6d0809d9f94034438ce50523352533dab69966e479037810e1d3b82e03043c13a4fc56d76fcea111a65a41f6770e3284341cbbc97eba7b95c3b82bc097247903f23d3087289830c2571f3aa474f275b8e4682fce0f12348ff080204c75052bae7516334316a85430ca537b9e7b21e538e27f90047188ad9b4d448f9ac0938c050d0595af3a6908e9cf166b007707ca19841493525639e14a733d2088296c68f6e1c5e288932b53be671ac3ddd8562fe9384c90f621c5c287d502d269d0eea5d3c1c5b28faba9c99feba3c79e3d042f1542655a2c94b06cd6601bdbad00b55addc2bb76c13936c26afa53e62a1d8e7de1f4cba502da14ae0b842f9a4f33f952d1b4de7562888dc53728969faae4d1c552829492ab19e23ea4f3ee1a04231a91691563ae5a4e5532826eb0d91496e38a450fc98417497a05fa36438a250b492cac7fa9340a1ec7a258bc8320d8f1bc7134a92e678ff6c130e2794849c949f2b211c4d28e668172506a999af64389850f23d1de11b75a46818c71254fd0ed1fb4a17d3a925389450504afecc953ff28801c191844e334b2bbfdbd63e34477e891b638e9f3e470ffc483af02182830309853df9849d921666a1e408e598b5e924f32a7d131fc90bd283870f13acd9080e23945534d566af9f4e9250077014a160a2243ffd269badd63f56063888500c32e913ed46cb966cf269c78ff82063045f806308454d3dc9939844c8ea3a8d9c61c68f1d7a1a031c4228f79eb893d22475e6d96094f24f844815e5116e00a3f42789f217ede5495e7f5192b5dd17f2355f947cd49feaf4c194aed58b720ce24e9da4497689657a176ef0a2682a7e37984e259f65752fdcd845c1467ad239dfc6f33cd145614bd67ace8d16d57a2e4ad63dd75bfa1e3c768c241ef000e21f40b828c6fd3b99942cb144f75b94e47472aa3229333ad3b62889f564a2ba68ff4f6d2d0aef379f413edd4795b4286899fc112f274c88d22c0a1ef467b351fa5bcd238b3cde632cddba33343e4649dff1bf2f514f2a16ac49dd24f31958143c7f35457be315e5a4c694e8246e5c518e1f99947613a1edb25694326ab45bddacb33fd6e1062bca2b9ef24ca6df926262c38d5514b3c798a95f3c7695ec862a0e324ab840ca6ea4a21c4b30f51ae6e4ec094245c9e74c3a61ff44b535394549c9796d3e68111deb6f98a2f0d9a52ba34972f8336f94a2d81b4d4cf2a3a97690dd2085a3eae2295bf2d5d5b164d3d33198e9e3c628cad9c498c442891335635194eaeceec36bee46288aa3aff1449a7823a40714e513badf6f4d522649dd27ca1b4ebcb0f5dc1b5179a260829be8f8cba436fb4e14c35a97204a4647afe484aeb2a2e2bada29b39e253547091b57b289929d70a31e7769620fb7ecb23ccd0dbdabcd3f16677bfa4f938982aea7c91fca45894fddc044b135eae712ec3fa7c98d4b144bcfc8c986c61225a14a4b8ccfd91b9528bbeb67cfa4a4b2ac9a12e53cb99397344dde244a929fba9b6f5066f3a171468f0ff800f2030d0d004941d2c8804be238b9789d99abce1d915e721c575372372251127e377583ba0c7b3a66902857b6dcab854ca5eef38892a853cd1d648e25f73b02f1d7f1d53d4563b8d188f2c93e3b2383ec06230a1ea4cbdda6b8a5706311e5b712e3b86e921b8a287acadf499993fce644943264cbbf6687871e1181f8a06d9e76a5431444d7738cd0136a3b370c5136713ec98e332944faf94be877d96f104271fb5635b3537d993dd19d632649333746dd370651507957efccec3c4a4e10c5289ee48cbe9f39c98ae046208aa1bbd625f487841b8028993096df732afeae27dcf84331543cfd9ffe761dd50f05cf1837e79294dce843e9fdab763fa7dfd4263e14d466e6bea3c74713da43f173529f623def3a787a288cb4f78e31d5e8a04af250bab212c4afbc69d90b0f5ca8eaa75ae8a6c7ac8bb89bf938aa27457728ccc967793a9bf835c125dcb04331ade74925d7d6a11cb4c809f124448782acf3eb513ae7d8fd7328cd65c939fc4ad97ee450d034f983facd9e602771288612a54e7e456398131ccae963740ddb3a673af4867290a269840cfb3ffddd50cc71b3a142e34e3e711b52da9b37e88c5136144ba7cc9254846b287f7c875aa949baafa486d275ce6a223bde5a6b1acaab413ede667afb9c464339c92478d40eadaaadcee058a78ee77b6975ec5d768679d37156bf2666288769cd284a3e65289fb81d22546a34951b194a82c926e7314cb5bac918b4f53479db5d7d5119934f255d08d51274520c05d9313a42c6138662a9dc13fe4ccaf7fbc15092f649c90304c042494af7de3e21cf3249ba42793797d05d222ee35990962080158abd61267c38d126775285d27dd051ec6c35938ba850d8ea505e2708d55d9929142ced3a9b8e1b01a45056aff4249de9b94faa1d6c4046121963a8a003be2040144a5a3a543ecf4433393de30c34a050b8b20c63724b6c06a5911f49073eca18413d7824776368c00d047842492ad3eb19ff3a49989c5018d94ec29887cca7bf0945dfb01b57bf6453f232a1b4f3e1f536e3fb0493004b28c893b9a9fda4d3257c2514cd3dae94ccada5b6dbc196831bf4768200492829a1bec3e82641c911096535f56c1ee7e00623692c08c13d82004728f89887c9ea7fa3356984a2d70965f92bef5f220325f541802214373e9958a565c2db4b8492e60b6defa3744647ec6e4080211434afc7cc5e360184501a1da3284f6d272783ec2083c78f4d7204a318ee7d7ac37a94e61d18a593b74d639cc92f6fef602be35310206a64f4e0e1bf28e853eaef6432a51f37be28a57b9ada133e2de3de8ba2c6cda493109bbddbe545f94db6cea5e44d9f42bb28dda63e99339e397461e87899ce6ed77a6c9939725118194b104289f69a9ec9818bb29b4c56d299b090e316c534f9c4fab8917766ee602be3d1c0417a347050ca168a6dfe92153fa2c06b512e6dfe96493629e38e2a072d4ac25aa68d7aebe231e591631625b94b52bd71a27673892c4aeea9a309eb23f220472c8a9ee23536c8e6789dfb410e58944fcf27b93ecfefe14402188cc420c72b0afbe6166e6319cf3444c8e18a529c8ef1478b347b90a315c50dc246671a993c28252bca259d6676b10fa173090572aca224a97ad22644eb7b7a5451b6cd615d4b2a39af3c15253195dc6964fe13a3041505cfbba7abd1838c1993e314e5cd20c37d5491d1c36c8a62f9871711b596a21cf2bc3e5e8b98f824521483baee8a512d39ba1b4549b49f0e1ab6dac1e66fc8218a527bdf6f967832675387a2bc1e270825ac3940519246f4847c8d61e9a71c9f288f6bd89ca2fdae647278a292a3ac9da313c5d3f95428f5529f522f327270c274ad31379d95cb2d95519673325b468e4d14647cf4a48baeb5abf303393451da9461b286fa26114a3251b410e7f13a55cc450813e593ca24335dd263aa3ec7258a9f33d4fd8fec8a5c7358a2a87772e1d1b70461e21c9528497ea1deb9c4eca26b0e4a144dc7ded9999e1c4d26f5e061d62651ee123f25fba6123e9c76b0ad9300062341c82189e22639f752b27f876d5340460f1e3f820041234724f02dc955ff20402081970a533b26bdee91e311dfe74d420699f94ccec8e188b2e9f36426b6c68c1c8d68d736b6c4cddd44f486924328a5564236c8c188d26b95e8209388cbe71751b4134758e6532ba2bc4147cd63a3ca43291185f7536a951a7d410e4494a45326da8ef2b68f2787286b36316e58fb0d51902749b2efc912febae72844c184ae095f9acb4108636fd7db75eeb6cee454e811c27350d2ab6e20c831084cd8baac2d114449fd961c4574e8cc934094444fb2c224f1d23640143c95a692937e54ff50da9e31651d5a9485fc503c2587bc99e80a531f4ad2c9125b2dd3c7ddf0a1fc275ab59992ece3bf87b288495ab3723d14e3a753627e3a0f859364dbfc4d1f25db782868d29dc454a149467c8772cdb789f3ad1d4a8295c93453aacad63a14dd5347b79f74289699ee09277328f7ba678ea153d4470e85d74e4aee637c6c310ee5d4bc6fd9dedb263814459f6462436ff044bd2fc9e18692248d5ebb8f6bca97e46843a9c4e7d38aeee81c4b72b0c17ca2d1ef7f5b43e135673991a9b304a9a1145b625c89bab8320d05996963632568288c7dc99fe4e40c657b33bd22d6a264133314933aede9e7294349abe6b4c16312ff3c19ca712776b831d53afe180a9fe39b365444a62e86b25aa94ed2ee3094cb33c612257cfad96028c8ccb4d174bf9ce47ea114d726948c1df36beb85b2bc69eec8c8ce1eed423176d4b0b26d62d797b850923309f1d2133a9e96b650124ad34d6fa4cf5d490ba5bd4fe941c68b532b65a124442b83124eb050d412d64413536593d0154a25091d9a7412338790150ae244cd67edbbd0f92a60f12bee39f95428db6d6613d553b4be5328d79a94e3366a2eaf14ca99f2275d4d5027280ae5282636c959846e8d50289b68cd7c85e809e5d6934f6c53236b45e484f2e998e329eb533a89a809059d564a98bb66b30d31a1a0a374fef70a2da124e69c74fcace9379d28a198b489ef9f95c994a02414edfbefbed34cf9070925499aaace3174506b1fa1185fa2e74e7752be11ca49d63c84ce5762e3229483107a72c7386bfa12a1a062de31e634c7104eb2c9d026c8f3e41042d97654f86c66493a9e60943c453d7e148151ce0df39dbb4d88e67e51bc0f9d27a94fbbad1d5f9442be843d13f474b84e2f8a77257c7a9f67f1102f4aee629e641242dc767651b0ee24899e374617e59c4c0c0f0d2583f04d2e8aefa6f36c6e838bd2959c4e3e314a880f9b5b14ff7eabe4112163ce1a5b1465bd93fc7bcf8dada945e9e624b951359366d0d0a220b29fe4bd360d15fa59946c3bd7be48fb0d9d9745613f99604a5022347f3e16251dfae34a9860a79e874549c5497258088d179e7f4541e71d6126cf295162de15e58d41b4a4320dad9a6f454127fd5ee2969f9cf3cf8a5258dfe7dee7d4cdff2a4a99d3eedd664da5f457452944cd2a479c8ae2697d6c5feff8e1a2a29ca254797dd09a3b7a8ab22933794d66be935153146496aa3fc94693a896a270e24436cc498a926eaa9a98d4cdf48da2247b68889d8d161b1345597449fb7163091f0a45490cea64ddb31e14c5b8bfa3e1f3897232bbcfef279ed04e08a183064f270a57d53144c8d6091a4e947264529a83cac9d1df44c9da739017a72dd66ba29cc4b7fa139f3db967a27ce2758ac9d3ffa863a2545f999faf2f26af97289afa89094d6f63ab25ca39bbb35ff78f47b1122593e2b38dcbea97478952e7d81a4c2651bc3fdf9c3e37d85d2e89e28be779cc2351d298ca3aaba4215152a2e44da2f388d29d14ae7db1e1724714ed578497aeee084d238ac1f488ff125ce4e4195112e3793be3ed84cb17511cf5581fcc83b6bf1551d052c2293d93f3e64494ba24e9ffaf6bd6444461942827ee47c3747988b27ddc18d4c83949fc0c519253fb4b1c3daba74294b2c543c9ebd7ae12a298df329d9ce8d5678328ccd89f902234778e200afe7aa24f327945571d88d2ac8e68d00c33220244492c194fac4fb7ffe70f454f4a8ccf96127368fc5078d376a7fa3bfaa70f05fffba001f0a16052a3097fa393da9807b087525cf96fb04ef225cb03d0839baf730ed3511e401e4a27d49a9226886852790078289d76caa43b79fe3479007728a87555c93908a119f200ec503031d32f4fde39f9f100ea501e11f2c73be949eef100e8500ed58fa72b469c24c60398434997faaa8d769be3e201c8a16cb5b2e3bbfa694f3b803894437e0ee219934e6bda01c0a1e0757ed2c4742ad6b4037843416309fe3d32bf66d10ec00d852d0fee41c9e6a13a3b80369474106fe2d24d299dd901b0c1d82927eac7cc1a8a1bf2fec7a42741e9d5503a793d881c21d7cc4f43d95c3c93dc391a8a31a75ac294fc41c36728e6b28f5e4233978e9aa15c654a92fcce321493a4cd35750913fe244379ac849259176a7fdc319477b3c36639f19ddf8aa1f81e5f3b89c3502e1dc2d56450d24c03433193d2bcf2ab1c5ded174aa2c7585d3b42959578a1d8eba3356fcae59aba509071d66e67c4858218a533cb77b6500e99f7c3069779df68a1d41e74ceebfb24eb260be5f07971214e6492f358286b9e3949544f3278ae50fe11a2edd9af94b8154a9fc7cf63384149ea56a17ca7ec4437a526774b8592a8f36da5b497f53a85d2091ac7cd3c955caa144a4a893fb9c43bc7a48c42d1f53d986c909e4950a150ae4cd9a24ca54f28b66990a93542673d714271d5355597a909054b916da2db9e848909a512328c0ea54a67f52ca15ca69ad13a6bec7694503c254c3f084f276a9250ec1242962c62d4cb060965554d229b84995c9a23942f33c79cb4c931d66f84c286fa5977fd1ef18b50d07f35a2456b5487088513c784b5184b0ffb008650eed039edda3a75d8072084625687f7de1d8cf249275e9ace098ca285becd0e19e3c9d9fc4541d98f6971aff1cca62f4abf321f1ae4dbbccd5e14935c62ec960993514d5e9445cb8449597b4a9eb90bbe5486cf6266eaa26ca3d397d251cc4549d29e647f92d56453828b724cb5fa75ea4c32935b149409fb9d32ca0413648be2865d11e92143694e2d4a27cd7edc9132aa3bb42827295cce5463d9c7cca29864271953cec8cdbf2c0aee51b39f8a63514ea125fa886e7a7a61519224911dfc93c7a6fb8ac288c855ad49771e5714475354e75342caafad28a790a9438eca8ac2c82437b828add5e12a4aaf51ef7c34544539f46e9a0c25a928885177d209ff616e848ad2d6c7a43f45413f9e787295249898a264594ac7d52437d5538ad25e2699e4d0fa4165485112b369aec3e6a49e1f4539c663682f513d26a22898aef5f624762839146539b1840ef71f5f6350944d0956b2592a6adc4f14f36e66e8ac93d7564f947c2d3d98a815996127ca5fab617ece46f7769cb84c74c79f2cd94482d2a357939834519ad12fa9e9397710ca445146a8174b935146081325fd3a25a658c949165da2642657c9edb61a21b2443985b727a5714e664e258a2566116d15bfef1f4a946c44694d1b9a4451cb44c9209498de3492289f94f257c22479fa8f44b9c32a3d34c9f6d121519e3b37111e4b091a3fa22093ca87a73b1d3de988b2f69a6795fce11e36a224084dcd26f87b8f18511ced9e33959871ef4514f36438c947ef2d355344e12a3326259324a228d757254544415a5b499bcc3b06934314eb63d83fdd36ad27431475ade48d25ea018df9a8e46dc522e25820120904c260201406226f5701b313080018401e8a046391684058363f1480035a322040342a221e1e1418160e4402613018060342a1201808088582a13020200ebaa72a8d0f59dc8e3311435b91c7d702b9c2ca9974472508f2da1e16aea488cf13b778423dfd7476651f072e88e61494b3ae8cdb71768c7515af4d9153cdb1186a8bf08beccc4a6790eeb735854f11bf72c15b5e9bc32cfe37d08d205a20117a20696508827ebf479927da46619557b1b9936513442c10513c22d7ee875634999995c4e885ae6a2ab557b83e0add27c14d1bdd9dbd98697d94eb92f5d243352a5502993d565cfafaa073c87bec36844ea9c733cf5b0995d84f150d841ed430d3d53363a6f2f53abbae2f415cadf935341e07df6364cc5f05518e072cd48d89afeb7bf3764e92ed494ea8052688c39a7a873a59dd2a3f96cf2aa3883b76286f653a718240eaf348585cbc1734ad99d82441a45deb55923599120bf66401bdb9006e00c388e7040693f70a34a8dcd5dfeaa3fb626757aaf2626fa6d8d264454d27138dcc08ad8519ddd260b622e87ba8d6a47adfa830060af408a808a4e064524061b23ea8f824244456f8940c0b19c4349ba0ac24d8c33fe813bb29d8adc4e026cbd4939af30eb3a0ec34f2db077eca35d96a8b687e1f208f8ba313870bef48a3eb27bc245a32605a4804c20cf8559a9309188060d175d4081ac91a76f7dc75d35100e72e500b941403db279496190c7d89e0392233a59391877cb701132aa422e83c76091e3126c361bcec7d0558597f59330016308ddea9221a30e8456de1f140f34ecc922e966184db04e902a34ab612da36e8323e89ac7ff189b4bdf7f6bd37058f6d7467944e779108910c66328f45292150cfafc5a2d54c68cf5f24a30aefaa70e22b8736fcd33cbdebb250f787f52c47ee96f08e2a42f8a771227a2c28da5bb8635140179cd9d7f881ab01e93b5cc9b9ca56be581966908f96d8a415d44e9d8d3b44289c9d6f7c5b47afee9cd0b7122a550819215eb4cb4a60142a63717f74773ac607fbfb5b82db9b44a043565ec234d6826d5fe3e21c79c6da34e0ded2a6f680c3568cda6066fae9b800f955e469fa5b7c31190daf3c40a727bde2cd133d1b0b3be7bbb80d89644186e55e29027b16aabc81334c53d9cd75468141fd2431fe5e8b1fdf8f6de06c8b88b6db4cbe462540da8a59cf9a7d441907b240e8ec2769894e5ad284949ac281b6cf9afd9f985b7e3134c9956c5e0242999866614d0617f05166205e4362dd6a22ac3847674ebf6013c8516b01e5caf3122e8d74346f771d770c96f01e4afc386ef00607d0120a443b1f49275611e07324a11746ee3df8d41fe462b42d4fe4c65413264ef7722c9f25ec87f1c7de6a99e4dba1f453fc88ddf19061490b15b49dbdc3e98b94fa05f2ccd16c53f09f9ade73f74184ccbb77e495dd0dbba7c2f36d622f54d4418858000642ced0994c6458980c43f61a6136958ae436801fab48411fbc1bcfbfdfc73d5718257d23efe7ddce13642b28a3e47cf48efd4377084648588445880b7d108be8d0701b1e8c03cacc3cba6811b59f07c7c01024046c1f782025ad500a7d51fad40e35cb026e4789398c0fd2213642c9fbe0d594e4e55323436ce9e361b1658790aa564e9ea9ac765a7695c2aab343e8450c7fb4ce8168463d0690291236aa44a7c44b3cc24bacc44a08044eba8806b11013a14de0b4982ecff8013bf087eddc8719d30e369eefdbcb7e0e153936aec51d96e2d4f92fa24b54f6a8085dca96cc03f677f05d0517e1081c800370181c84437032c0229f37266c1b4b1d2915eeab45988ad6f3d44ffd422a3ed9d93308c5e7b94be16638084600012480e36014208454c00010506171300e8561222a7b57388d381998e337f7e4ff9b317c4fdd64394b8334a4833bb8813bb0433a02067c301d0805db7bcff7a1d761fb5c83c7da69bc57917d34d169c31fb56541a34066da1122dc74608c0ac521c229b82d457773ef2a572609377f4a6fc99dd956dc9bf35cc877e8001fa0a11d8a1496c0c854ecf02096e95f96c9037edd8e7e6397ec0fdd71381d8c82842008a508e134a1f1dce8c789398a8fa4d03bbdd0128d51fa1497af49edb0350bba5d32eec48db811178b9b71a830b34458cf73d3393bf6862e11cf22bda19185ec4af994de28476abb229123796139d1deaee6aef4e52a98f68d7fe88e8071400e89c369700c0ec1009452a733cc543efa3b39b15d3ab28fd8013b6087d901da96cc2a10e0eda4be67f7ec965d60f7cd684366c4415228b78b3c160de249a0fe7e2af5dd04b7e016dc018b21371c0c07c1303015825e26bc109575fef81d8e41f6dda73099e25bec8e9bf84e381b8312aa242d24964306d6df589577d4f8081e46d5634e08c8a474dac50c0752e4dd1d0e3cf21dc0ba93d700846052ffa042b03b5951f1f0cd5d68b68a8a4340b781ea2c818f587d46c66646094d04ffbba0f9ca94d1194c85f346f20190295e724564a457c0d5587cb548ad1d40f1a56c68144774523a99f095cbfda01950b66e3539aef7b2c10ba889f76fa5a0f56a3120c3bb961ad315d65987f961a322d68f0bc5983b23b5309079e7a42de47fa84e9a7fea8d3fedb34d0173ae6f0d2ca03a1ab45d927fb0b9a76129753abb358e24200136d5636dc131e7191275e8908c73d943d63b9aa5f6e9c4cb7272088d871cc0dd5ea897635b853d5573e25588d5467e931da2eebdb449e248186e16b721719e90e1c1baab1d9e689441639c953806e070861c4c9f912d32349650cdcf0b94381451d10eb40be2ead712090bd0e9df82fbd11667458b477103a99ec8a65cf6b31cd3526ccd65f0482d2001e459bf1a00211ec58c8f54caf40a04120b4bd07f04ba3c37e87ff698f3e77832b12771168ed96ea50ea29a1b837efac3e43ff62cc5f2f693fef863ca64226973c5a5fb389fc59fc064adf17882789320bd3d42e5bcce429de41d30f7d1928efb4a01914804e508dc1fd1854e77dd9df1644011e5dca6b4ed8a7b814d819053db46fd22cb83416903d8ec55fb40ad25c751bdb46aa7ca6902690fc911c755b3c20347891b50f86cba6b490e151fa126dbcda74f130d28408a3d95b10334950c84a8f38d29e3ecf24601b67c28b841d4e99cbed5fcbe2504c30b40b7175779f70cf3dacc86d1fda454a3ce0f3347eb5380f070ecb75e0f1e7e0f8d9699028c412e745021bf1a3bffa1f108c200916b5dde2bdad1b24381a47ef6b5a704eeb047e7592725e89e121c796a61b9e11e052f9ef119350722dae5c476cd8ea02a91856f6d1c63f5ce7ccce7865fdd180a528c2ced962cfafb68c2f606afe4aff52b39da4217c3777027d5dd5a05c5a1cc85e9463a2e3dda04042f8915f070b4bc1a33853af102e72a9a6983c0f1c60ab16e306d4e0fe5717c173a12a5cb1165680412a7d91c730a375dc984cdacabf976cdbaa774b81f26f5c0b0181400422b80af8a0d88b150be82f43b04622db86040937eea8f8aa6fc1486db2825a1a1b08446d7c4c0df4fa828195a21a2e450f1777206a4b4e11c9a10357b46f5c0a11567ce918a092d9b36d6ca3042708241a6f861843ac68c5125419f1b870794925e65668a70cdd699d5b51b9860b37cabe3d44541671db64ef7f28d7a76a8d6754d94965dabe6c64c26e55dddaa8154742039ea4ec5dfb86b8736731bc91271a7571c1f137faf25a4da79e51040bc20554053a2dccad2bfcf69309b8a3b4175cdd5de50e5c0a24f57167db75a400eed70b393209fe3d708d584e5725eeaf5b60ea029616d43856dc19221b0e999d4a070686d2d0ee0d7e0befeef3a07a5342698474a638e016da6c3df839912312a0276ed38006a1d2f0fe040af5dd59520b5c2a1be1cbbba35e95da4869c0daa89b8bfa9333c56e559048c748f790a77b0a7e2bc4898e6ba697e63cb8232d65527abf6f285e464f4d6bc870c58ef81d5760ae56bce0881b3190c67f78037fa85585daa6d5c87a7cc0957abc7f1ee328a4eb7ad61f9f9c0b3362780ab0d447054c4cd347ca0af3b5355e3691eefece7c84fac0819d0f5c1163a595629e0140aea6365fbaeba40a24993808a13d6c3586c5932c29181835fbe05a7d049620fc8f162a1612777f6b19ce1d920f7db7a2b02f1f8973010946ed6e37a5010c829a4fb19170bb7dfa3c7a018f8fe0ff4e4ca4dc4cb6243199fc5664f51baa025c59f034c9c512f8c8d3a93112381b0d09b42cae83da6129b9fb9858574d5ca7fd76de42d8346a782967ad0759d0efecfc694e7d0d8c271a97895018a1c2dfeda6a400043f7c6bc4d9e229e0dc5339aef7e04df0169a603c23a424042c539b76b4e6b36c32515c18f24a2df7e546318056471b7b8e47b2e2f3ef4ecc036df94d99de20025d75ad96e12170c24f6331795250fe63a5cfbe721e4db632389e6f7eb85e89b59e81c6c8585d8fba3b2905a9e9864a73d0aa109cb224fbe6486adec7199926484539496b9d7e0faa20ebde1919f64cf2cbb8e9e78db42c5b93174ea9e81c1c2031943cefa2872952fd7d347ad0847cf293d19811cf248c0d44b078c0f6e3017b4157bd30606ccdd7790a246c2b5badab983a70d8340ab243b9ec359b02de050e4a4f8845fb61ca09d4c7b3abbdb3aadf0ec3bdc3647d09d85914f5056dd6515f8c178f58a4cc45b2925ac200eadd76413b3cc592395b7ff107db6b90e9bf9588dad736dda18a3dd13025175f75b13978a0ad1927298320cd74388e01aa1daa32995155b0c06ff2e9a9c38d01b1d103fb045499bcccc29b1d5a660634c06eec96fa1f48221f8c157ba56ead2915cb659b0ef2a81e851bde9d6a6397e0dd4b483858d4538030ca5e0c3beb8e720614fa5e267fa127c4b4f70210e000c1dd4614d6306d3bc3bbde7a45b60dc1ce3d5ea6239db58b480cc495cd9321825298f8e7405663e2a330787a64177da8982436be871d0b59c90c66178547d8a1e81951d194d690f12fc13142d13a59f2a10f2e84c8a5f48f58d447a5d3d703c9c5138309162c379497e5ce666371b6ee8d520d57976b28a3760cee2abe93ea2ba26912aab1cb0362db25278f503358e9427a7746c0652579f8224f72c0b4e108792a38fe0669a932637ef641473c275c1cef947bdd31b7d0de338c573181cdd69f2a8faf0075141a5121f5938cb8bafafce65e2a389c188b9bec6d7dd729da0d522c25f0c9237929910d4a0198d6185cd15b56b18c287744409c14ddc4e729a78e14f76ba6079ebd1962007e6b5a697fbf361ada7f0b0fb06287c356a3f58ff6cf73c5febb3d68c7b20f58e4eda7f84047e15a8a81d87d6fa9bac6e50c4ddf7931de7461c7b04dee8866c203c4d449e65f14e8faa38864d69113a5db6c307dc00ee9de20e1ec252382d571e7fb46c1c1232d13d41b0ef29a371bf4e3b9d33205f26a27c836659553e1c5c7c0501edf08636f24296f0fbb6c2c8b4d42c21c4e86805581b5c8255beead40cafdad4bd947425802fbee7890e896d5ab6f16b524156f3ba56b73228ad7b0fec948763d51a35cfe32f13250b3ea3d82c6b648dc843702096bd0ebbb5275db72ed8562ec980e406d0036a467042b295eb0f7d79c142a1bbeb33eef49253979912834343d4396cbb7c0bf271514f20018ec69e998b51f75dfee9778f2c5db7fcb968fb217b0bcf3f8a24666c295bd592520f4d02ba5fc1d774eefb60305391ed733cde317bb9db60283cbfef60ebaa6c6d45b8aad16df47c83b17ca39725f9db1d31327414661507f8c0b9c5a1174c5a2d35c94a3d42cdaf86cc5f0aae1682e4a8bcb82a27886d48d11d462d570d99f03046ee00d4483168a11682986a0bcdf2f5987f69f44488643970f0d957be2b367a141c33e885dee061f609ef820b6eaa6fd6904e04dda71927a0da26a999a307bd9ff531690a20ab434d45cd0d5045bd5988f3681111edbec4cd0a7f637d71ebbe502fd6fd4cd2af25072f0e8706b3cc39efda02888768913682514aa53f946a1b52841b80129ba6335bf7a501c744fd24a50d59b4aaa5f8a1f110a8b2685b5168b7c823c9dc97281c4de9680d4059a443687bd2e85d0387048202558f1c238b433b9c704ee4cf8773846eb060ff542976b3bb140255cfea5e6658e21b077957765a70b88cde5a42d904b5a57a7ab5637fb800eec1a111ce38ddecfd7d3a3294e9af34bd82a7d6c265722c48a34d644f6ef756e26785850a9d6b9bd5ef47e252d5cb91a230e7c46838344383333371f53ed40695ef6569eb04601369221d59c7cb318ec3bb1603fae1acfccd20cb01742311d696baeb2c62643e9389c71779ce242d495e89a0b7beebb0aaf67a16a94362f035bfedd91e000fd81451c457979a2733d74238a30e3476a43012540c7a917fe938ed45aa9bf69a28015c809e2d742b54bfded9d2a6571a788099ac561e1c68ab303dc068be84dc73cd25bb3759dda503f019a6b49cffaa42b42bee6a3345329c5f35312122c024aabaa5eb469723dc52d3c9749cf214a17e0ae20f34de242d1c9affbdd7c4a9ad3d8c9801d835823206be629ab504b9fafd7199253c9e1d5f6a9601b36d322e084e464d1a69e2e10f80963df0b15396275f22ff11889712a883cd18cd0a392d14f57ad5f9ba77754ea930396dea9fbee17e0faf6085c9514c94199ce1913d70f9fc1f0fd5a691a75bbc2030ee9eabdb949b31a42b0e285b38e8eb01cb661fcb20c13f0ca51c0c2c074d8adbe9d0455f635ad0f876b6aeb711def59e4348fc2369d4a1b888c4ae7b4f9cee507ac1e90a27c9538fb30ebdc6b05d6be345b31465e9c28c122d3157d6b70dd3689f417e6dd1332b1458401731322291ef593138d90fe0c9c6f21830c39e3fb453c32cb529dc9d40bf65bac7a8559c02aca2aa23da361692dcca9d0632edc42746d5c9cc8d6078f4c5fa37938c6461e1daee97a2060f313f2ee0a163eb7168d97e8eae19014d6613d15bd14107b29280dc0db51448438aeb11ea45c25441983fc1f54d763e30eccacab0489150231850e0aa053f8589630ab783df51be730cd20c27ea2c517820a4a30344c25542c12b177a9ec6fee3da7cacbe403b5d870924b37b80d52a24e2f14c43102513ee6a4c346c4613ec54032db6a128ed45190131b46ad0b3719d7405afdb7c1235f7a96402824aff71241c53048e54ddce2bb2a6423959e9901033368cf7bd9327ebf2d579f2e49bfd27f8ff9dbdd3087b62250b22c2686ba08bfea1231cc287db4a5f3bb829a20155be3c892b03097615228805c1f72cf00f11af44f0a97ad8a072c6dab0b160dde3a1350a58567167a8fc8102f571a390952f3db38f3a3cffae35de6f5e8dfc71caa4692ef09f717ff43adc91d1a43585bb071fdf25ee869960f4c4140f9cf519004832afdd99524ebe597fd469fb7708a50f14351e9d44fe5f8fa3b3526fbd112d39046ead80da3516505efb8064a3e50f40452e82b3f7713d472f90fc93ee64374f6db4d5bdd7c5f854bab6bcb45a9fd56412cc602aa2266219c2912e9b67f7b77632be30ea56ca8c56d0583412198a3e0d971cb4229b32db6a4769f75af4507560a1a78a27f3ca584d21a565a076c7130712a38293aa624eb32a6002598d85743f4d40f9d4d4f544c9e650c00d232b29a4d3b49ee5da866af249db575045c42f0c54d7e9a084c3c317ebf609985cbd18ef588e9def7be38b9c3ceef8bb9919578e8f6b01a7c9bafdbb9e75979627887be05e062f7f286986a7fdb08f1e61cd72afb1d5923709a43b5bb036dbb0130cde1dd745c4a09a843cf71acf14e402241c9ad98df318cadd58e5882772f91d7ee7a62b232f3d86e0c83d301a500e203c73b99c55b61f211e74321a87d498356ea2a638d3d282e13332ed1eb62423e8e9ca773f5aa0e9ef0270a33c5defd0a4e66c3ecc0104a28fb499b1bd5b84ac6fa34658567dce5adbb69b9428533ebb65d193eb22a89a6618b43cf6e6af0b4585c99a66a26db1425c565be6411ecb415bb1ec00b4d621052d6118d59775683d15b2b0c840e6c0a1e5cc1f23dc88ea06701fac86f5fb065bc51bb85de2967aefbb026e0e0a9caef13340d45e4e7a43b3f2e890be94c067ac147cd56655c696a9de0c07ad39746468ce40dc84fe26fc6d8acfad8121e7439278241bd2244401d6d02affb766483545f760b4a74ef25b700386bbe88f6eed1052df2f4a1a85d6768ecd44d463d195f4778612c37497e861efd01af15638927a5f037151ca96e3a3ebad6a22f25e8636ac586deb1ab0a083604e9e428479f3c86dec76508fb23bfaf07f198a03e7650cc85d4724b89d421b0a394db29f4532478ff1e5e96f8438791fafca142ac3830124928c937ee2df92023c5bb653b5e000392933e783e9ec605cc6740c0fc3056806d6029d7f53f4b04ec0400cb0b13b8c16dd9d879a38ae9c3c40d3fc478addf9e81c8b594d6eb2bcdcd7fea086f8adbba094b6d108386b31859fe89de7d56ed42f8a702c5ae38b17a03427aca0d47e47a048fda55f8d27a97d080c97000dcf3fe33b6680eeb3b10866135e679f3fc60d6214a3ce90904a01a2ba062d25df67c238d1e8801e525d2df2b41c343e1cdaff9d730c42545777b6596e96d2ad2c617780e3c684834183aa5d9846f02f4c8d97301c1d0c06483a03a3bce517f6a45799286afb40c5a0f56b6830e5f4b3b6d74fb78c9a434cbcd4421ae8bdc7a5c7e92885dde269799355ce0a32cc76ed0acd9b0ac9168870eaa9c9dccba7c77c6fb487f1029f691df45113c00c0e0285a69f1f48a0952dce1e02dc8398ccd7a7406924464229d4e38f875473ae44d1bef728e9ce661439c2550630466a9bdb7a70d82356b10e1e899b402af69218b21718e1f5c5ba0f6216afdd57a7fb9c5f829c83839cf07bfee380f585a968e73b06a6f394363e37cbbb9ecced735dac36b2273bbfea5cbe082e746c84c83f6da60a87aad13aa9e1f415b710770aa4b7e70e2f06c179b8c45e7e4202e8eb69ef1b2a04d6617946e1df3ea283980583bb3f251687f3a171935d0133626ddb8e17601c559df4e25431474bc1aca22a3ef75451cc99ef408f807bfee72f0bd5ab8a49666e3a20aa281e398f3b4c922748c0d1b51c7aea28c4bf76584754fa8fe11fc4eef6546ee1cfc4268a6a20ab9f31e6f95c92c124319e94fe09333bcc112fb9692419a1124174a3426abb00fa0e48335b060286673fb47550905a2ca702331fea2e1c0ba8c01937895f30419e9e1adc9b9d0978e9a5242b2f846ad3f3885a2cdd09fbc79fbd4fa8514622731ed566c77380713c62d691916a04aafebc880ce9275b1906107830d6771744fbee3e0a97a8380e20c4172f0146a4c97d359145022afba660f3aeec8cf2e51340074d6db64da3d7ddcce0b88e42993fa0b508290a247ffc8b906fd4fde2d7ce1db9aff3e66a344a6ed3e334152415793ed69731665cb56943129cd45b90af789821422c5390f91a0ca9954ef13588aad92f4310f0d569da08b781e545e6199156715800b8c43f529e72aa870c51d8ed69efafb14cb1f78c48dd8520bde3196514ed7f83c34ba79165078864d4a19de3a607dfdfee53549cfbfa42b77a851a8f1a466fa4bbb84ab4303aba751a527b7531b93c4d358e39c6ded1f4862f9b79d46937416bb169201ee9841b507e300f3c0428b931557a4d38620ac9d4fd4937975b5640580d2dc01faa99a596d135d35788e21544a44c111db859753db690af45db09161ad8d30db8353a8ae4cd368597b7d063babc8aaa5a16fa333ceace8051f79dd1dec60f7c77ba194217f5d0ad72ddd30e4200993f6f7aad3e027884a049f21217f308abadac611e4880ecfa02f1881fae34e025988fc690eab09f1552891f0bf9a54f930b6f225ba6de1739f5e1cf2c87f08246540b758ef5cf2aa918a2d59d8f8f3f81a03a9b407857c2b4bf5ca6d8b6964c85e2c140803c018e80d159badf640ae9b54e0adbc50a5c28c6970b93b060e91b2751b51c4b8555b230d61adfac7dbad1e948842851efa59715759268f8fd4d455e6d611e97e45c0db01e9bbee6268346a4caa1b1e3841c4a19f205bd83b4a9cd3dad410e51ee67138c3424a0ec7724291da14ff6f185e3c89fc483adbd2579493ee0da934e8f029c1f9d786c868171bb060bf78cdd549e8ab506b233a9f4e0b984cbf0cbf7c70ff576586293cb0888cfab259dff072bcdbb15dbd31eff406ee5ccef95e0d3ce92b81f7aeb4761be56884347ffa21021cd70ca653b2e37171d4c44ac13b43b664ec57a094d44727e755c28e5499804c410c46412ef050b35f892fa5196264e60eaf2407c9f7848d8638e70d740a0445d46e6456cf176aa207dcbeefc7cdfb32e4890f499b79d8a68a0505a8e71a7d0ad7ada8e27ec6f20b9ad51398c39b057c0de85c08f2d151a468fc2449c1682d7f333a2462b8793b596be81f255b9e9d0d3a5f3879576d7414e54c762bee02d25e7c83d3d0fedf460a87df8958877e60c30cb4fcc7d6f31195b384a8cd1db62c8d73a67c38b72edc718d9b7d5d3a678ab368336630c8aa1d2c1b556921dc3f4600eee230cdacef8ef723c888ae84cfcf4ab95316135bb05a40d4806587775001d5c617903deac92128d5a56dfc1236d417fff8a823f30eac8c5ea832471e361d7a9a4a7d753c16247ca1b3c76bd26e088667c34bcacf2a97b8c10f378f1206f38af56b86fc79e89c7d4e8b26d5cfbf5d4c24626bc4b1424ee8bbb0d4a6dcb1584c63b00060168500877731d5a376c00838ae7c7aac4436920bcab62e0adbba18e7230437e74940b3719b134960a7077cec20cc3096b7da80a0fd43b68c4f0c1012015e9eddd7dce36ae53950f2e187b506c08be30ce0d1af792be7edb15f6d12353ffb58783902e587405668e35bdb0ef200c46855fae39527ca08f44bad98b4e7aebf8c93eb81139b549c1aaca348d9a64f3047d62a2fda4da787348ed77350b095075023f1f74a2421e69108d939750351b9c3866c94d40acb0f30fe273b38198978924ff77580d82758366220e9dea3002ce6075af12107e55cf8dfcb02d8d971e2469073486271f23c340db5282e3b8778d42b1cf1cb4920aba248e5911de81f81f476e82449d13041687061586627f122eb63b84f093e8a6da3194d9039dd291129b83bc23e3f5e68a672681ef3c4815c3cd0c27590285d863cadeb61b09130f006aa2d3efea875cb4b42ab25048aff74be91985ceb430201320368645d42f8e51a2046d386048a203be24ac07155f7e434291b4cacbfd75d9e832bb10b7fea5425966f0370f47c64f90ef0ee7040b4ee79fb19c3a6e50aff566345f49e57f2027b109ab7896d320df7019e35290ad54a7ac47d3feb4915da70b503370532654e67194f99b08d5c613330de3a6137aaf009077374e2d4b468cee5a2d4779d937264ef089b5221d7cbbaa33e697fb075c44f26dcf56e3720483c6b865fd36a42ec4109e1ca200e864643575b56849648453fca36ce9dc004413c27ca225e757ee0c1bcae03a2ab44b3017ebdc873217b7c1cc283c07a30433f8b07f719aa707a0a2849349ed7a85abf61b81be5373e6e869d4846a573298b41639f3482a224921da50d13d3b7386d460e3a6977b5b9dcc6e0deea941be1b92aeb18e8f891e9d42b21d45bf2ab4f0998ad48352aec29fea88f36cefb3f0f64b695798e613596bc95f5dd0eb98556647f5d04c3839300328e2b8ae2d3f39e646fa58c192f53e272fadc0453386a336298bc0a93b094605f311ab11d0caf0d7db614302eb204f3d1033c925ca9e4afe51be81c064f4b1ddd23ca70cccdd5d3df7ef9db9a34926e097a16d02e940c6f1d9c99aa0e99078e75bf6d27e0c555c4a8cd99fa996f90f150740c069d025bc4e89b2995236197428016470d0cbc0d91ce593145f1f9b1810c4a020443a98247108d7b4998305be464686ed0121493c583f21a8e2ff8fefcb7ad0cd17cca8b6957b8336c2c87841d4a287a82e14ac96f241fb5c931cd7d9cb3149b66145d425c9c733d7aed0f6c9c93b0ec8879bc1c98e78b4b01894a8bd49d23c03139cee3a0f21ffc9e984692127bc2ff7b80f5eec06e185c20a096ae6166a75ecccc3af9a18bc1ebbed66205c960015cce289e8c7e9a60060398f7bff5ea3551ead1bfb5a3d1244205185b9d2a29bc328ea22134f1d8f63b69e9b1945eab27748bcc27f2e49ceb865343da10639f2a88fa8ab983df79212201319c4c3e30b6913fee2fe03babb1e97bf958bdcccd0e3831b7c510bc8622a580241edcb0270c26cdd3cf6ab42cb08dfc2a55e64a1fd01b2c249de4eb5ef84ff089ee532f24c23cc3c3532d1b00d0db42de76f24cb0a0a0f9440b4fa649e48ea18b3223f4935c49c2079c5003ec61658690a820ad6b463ace3f7a9c134caa7cd5fc8ec57840d660070ad74a7d8eeaf653fec284a0fc971a3ee8eabb256b8c78dfcc563cd4c2b8f9d9d3e5f93b36cd02e2f28af59ad08651b522f9ae7b41ac63293c4b4d16408028addfdb8d865f5a698ecf88d499a4416a08b233b57c804199a153486f7e4d9deba0c92eb08f0e0fc15dbde453d28ac22223b7ff8407785f9f954b1da68478b63546431a9d7157a0224ac9ee84b79e8bb4a68ca55bcb7766cdc20bafa401447a1f30ca61217e416aafb632f4942ef3d01f10f1aa50d621024ee96cccd585fe392380a35c550b7b0cad17a30720a78a42b5b20889ade8f3e0b8bc7a1172173e5a8f10603b973d647ba9c99a2aa06e4724a66d22ff576bbe1eefdd320e17d59c27762d0747bb6517fc7ea73b540ecb0e4ea68895680ea08b487321049f4537213c0a9c560d5e4ccf3714060dd7a0b95042eb108d2c8badb84894019fac50248f844dc8f39387265b481d7017aaf93b0c862b0f839884ce7dc4a7ce331a7e51608a7401278d540fadf40ad3e14c659fbde9f7bd864238258e0a0e6ead05b998b4f9e8b0689152228c8cdcb911c63183ec439b7bbe2633154b6c26c9bf251d3e9ffc563b6565ab5f09e95b8862ce268ab6e86e60a23b0dc1d079463c151710039a9399a8e4f87a2c3e66ed7ef4d2871ebcccab75355a62a693f43801f079b8ce77bc95d3a957ea26be993a67e48b8814c5582909210025e196ff38eaf2dc830fa94aea4c969790af8daf083d5609fe08c384a553873447d7226c9636505842551f2019660b3106f92ff57d956936452eecab5be717f83c94527c8c1b7df788964e501235f5b6141ca4397ef8f524a037e596b9f3c0870f2a0a109b9c3a0c41bf3130727840b145925eefaff24744b635cd4f04970794f4815ab81d3a6823e71b1c6e1aeeab46227a19a9c87b2eb44b8a7a0133c33e1607c400c113640a8b0fa777993e8fa8992b1fe09c04fc33728f98e964c149d38d2af470bd3c3556126c4a05288a14f2b8ab8de2a36e721a3889f60c54d1f05278675cec6b6da464f02056612ae3882f8ccc87761a332095d4feb873cd29360f92ab6f84c1af529c1f566bd1ce1da39ac3e9617b620014a590c6c72a42eaeeb34e4bb4d25c13de9d687d3d3da5e72bfd4e2b6239b20345d64a4bfaa5281eebb7a90c0e84de247fb9402c55ed618660ec9026393e6cfbdf68b608664615b472b5dc17705f4951d69ec344adedf5300e39e34d151d51746dbeb561b8fb740bf847011e99778a168237ec6b98e71632c49c4c4d91f5d8c0fcb2c2154a21b4842845097f494d9081a4243046de60d92d12075a0a704db53ddb18f94c7fae65bbd876a7ec0799598911d7c11f5dd6917bd72c32a1602de4458eb846dc5db7172692773110d596a4583b64513e4ce299700e70c06639186a17538e5c8e35e5b1d5229b35eb9c0fe089586a5c8b0d0d7a9ba7c81efbf76c0ce5c5745d02761993554bfea895e55e8985ba20a50185c01e90043574a2ff71167a979bbda94e7590f119cea2cc900c7cee9daee93d7c3292a270504bd5530615840519b384919f0599c43ebda9c4c5b740f12a431de7b2a4d5216a48d0de8613e6df0838722f64e50dc8cf4cf8a16b76088e086b0fd5b4197295c004ea6e7bace9712f3b9435b2563177d3ed4906098642c448b87aa45e8752aaeb1cf8378ae8ba9288e78d12445ec0db62ffa253a755e300e574eb02bae1c689f62dc16085c0ce8b5239148308cd91e9b386991bbb628134c0851c336a5800f8646db2f1ac3d4e298a429006e7727fd00fbdc0eb272f85dfdd1cdd86e3f06851094378799b7b9a207e208b8dc7bcc5991c014e3217ce4ea0501f2463e4b4ab94f9cbf5cb73d7cb0a541af076f0118061366d9d59d5be613ae30bf1357969239c3d4d0c18abb921733fa1512a521e43814d9f32fa2bdee574c4a27c2c9ceb3d152b085cb7432ec2c0a12d966bb64364839c1736fe23bf58afb4289358944ee9eef3a56bc3f0fbd1cb5b800ed105ec155b18c49e57d68b68b4e6adfb62fa7c8bc4c6cd31d0a90a84f1d07b101d37f2f58d8ef31ff6b66d1118f4fac61a604ff3752ac973ad483ffcbaf9bbf54f0f8ffc4c7247134218021d585cb9d31722da0e020a89e1b15504b635bf10b00e7dffc534293713aadd7c8920c740d054a01ba31ce5a3450b024e9f3ffffffffffffffff63affbb7acb2df0615abb69489c4bbf44be1c937a594524a29316c4108c88d9f90558138ce7e78900579058305dd6aeeeed018645c71031d400104d424f1a184628ed6a7713b42576d3e925036a9ea614d0e17759f0f24943c8e6837257b337ca3033764c8d0a1e3081f4728b78c984d0bdd30336c9803c287118a3945b59a78f16af3c64711ca969dd4a60d19b3a6fa4184625c5a7cc9256ffc4c3a8c8d1a7c0ca1989ee4982135b89ad4e3c0f3218492e81ac42997d13bfd230866cb788da7e308e311e52881103e80501ca1c39c52933d85c9d260bb41ba4f2cf0f845416563a3c83775f8a2681fddbfa3e899f03e6978f4a2d4f94bec55159de9325e14436a8d87b34d6b78eca29c1d3aee4d9898c34317e5cf1e6e2b64509b9da1b6c32317a5d22b0f75559250fa448caf61230569966c9c53e386072e4ae1de9f94767578dca22474cfe5492bd9a27cd5a9934a9344dd18d5a2184f8a3fe16a428bc2aa260db9b2cda27882ccb51d46c7d450cb827371abb536b51aeda924b966a3fd279958947cce732e51322939f91eb028c80dd2f35f634bf0784539e95fd19be175aa645c51fecad85b51d03d267d671a8f66b9072bca27f77b6e51f1233ee3b18a82c9d93a49ee932a4aca8310eb12635edd3a150525e34dd0b1a2b6b74445b9426b6ae99b90e29f53144f8aebdd71b113db3445514eeaf1f33e391a844ad18a6badc7d77daa075d9ecf4d4851506f72232789493670788ca2182795a02493dda61a8aa214ba9312a5ecf4fe9c5af00845490825427e040f5014538dfaaabf92cff77fa2dc39c6d751f6698387274a92a7d0e1f5bfdb04cba31325c19498a10499339ce8e9f0e04439bec6fd9da025af949b28094a70595132c79323d24469747938e15369d8dd64a2d8bfeba536094dfb1b268a291f848adcf7b6c9b94439c89af02fa95ae258afb03ccf4cd9f2983d45c7ec9cdfaf4449c62b41e7e0a619756224373e806cd4a0b1012f4a944eb95e7fd40f26c49b4466a679f9f19ab19b6a96e2e93bb4c9a484fd9228a7cd4990266b14b93d4742ad77db4f99ddf93561e3281db246f6c60312e534dfa56b46e64f3767e0f18872093263f2134bb8ee93238a269feab09f4d439f23edb8911a51be123eabc6b4b4eace88d2a7cda96f7212f25844e10413749aa7080fca5244b964091b53fd597b6f12513c953954a7077d216c449483a7d2fba77d163a868dc7218a1d223a6b7bac2d39a919a214d2478cf7c9c953270b5112de4178f0938f8107210a623e6693f73d873e08acbc464fd5333db75d6bdb836cd07808a2ec273d5da6e6cdde63203ab5ab7f95af0051ae8d9de47b907afca12ce23e9c9cbacb21461e0f3f94e34bd89920d73e94425d3b53ad557632f0e04349091fc374123bcac5e9028f3d94cb4eec328609a593891e8ad9a79b41c5f6c8435194587152f4c724c6ca030fe593ba633c69b7c71dca3f32e7e912ca245175193264c89021a388e0618782967442972083a7cdd7a1a0757272f339128d1c98edc1830e27a1f9f6ae39281ece6f36bec9350db6a4430c1bcfd6040f399446be64f31c1487f29b8e55a7e45b93071c4aafaf9397739393b7f34609d5071e6f28c587136de2fbd6fce38682acd5d79aef3a49966d28091aa64d0a9de363ce86d286b410a2fef93f774f81c71a4a72da8ee8bc1ff45af35043b936957834c14db2bc3cd2907c88ed9998ea98678588b6fc4dad77bb29e38186728e99b3b6d5dd405ebfc719ca1f6e7ce437969534d360dbc10d93438c1986682ff0304339aba9b76bcfe9a4b91940dba183841bf0284339365cd58934c9044d7a90a154828e899a6c2fe03186626856f7b8a54497907a88a1a46557e362af95391f86d28d123b73dcec018672d4543a851226997a3dbe707dd5e9ae6bb995e5bbdcbc55f97c060f2f946dcf7492c293a4b4765d28493ae7bd30bbb8504a2d4d9250b2fc73b45b2879da350d4f623025945a28deae8e36e936f3adf2c842d94bacd251b25327138485e207252b1f34c753627c85c2c77cd22466c812cccc11aebb496a4337520a7e00414269ddfd7b3d79da6a9d099023ec76a2963227f2163aa2ad375a4e0ca554066284d29ea792b9994c9694428a501425fda4d2722242f146091e3ff2a45bc921432809a2e307297b0aa1f031e7689d217b5278902094be3fa6df98c35d677e102014e7e4eec92408f3ec491fbf28c67ce20942dc9ef8b67df8a2206f94a44788f0a317e52d732f5945989cf9e045e12f4e5d096a74ee27a1c1763976e0c08f5ddc872ecaf321de739f4c2e4afaf46ac925e8338c060a508e12243692064cf1818be2ff67c9271b774efc3e6e51ee9cfbc574902364334ff8b045319de06132a6745f7753f8a84569e6c3abf77d1a7cd0a258bb9bfaf67a624bf9318b725af98b1191d260934549ca7fc6c634ba5d37170bfe8045f164f6f63b41563bb781238c1a3a5e51ea70b2b5627228cd9e1aae786e55a4672ae5e8f2d18ae27a1a61ee694aa87c3b6e88912361634541998a4b4ddfd8f00c7caca298ba3b6a9e24078e03c1872a4a1af6e4ec699ba5a2a0a9f2e563a4b843478e1ac98c6403b3a336f0818af2e5aa98a8b752aa3c681ff8384541a611239314cdd3b6860d1c3ad474b8073e4cc177493abcbf6f68b0e5f82845a9ef7d76476ef8db67a428758cf15bfeda6afa1845b1ab9975a7e69e175b26883cd9717ecae41fa2286916d379b9ebf234fa0845496c6998187426edac41511e11276589327d7ca2e44952ea5d44fbf0443966ccc8c851d28962f84fa6a9ba1d2626e144414b091762936ca2541bd765e6cb429d68a2986da5793a6de6479928756c52b5397f67444c944d693759922e5da2e86b92eaa04ba8ba2f59a22cdb61b1a6a74a94dcfaf3b56a26a17c4489827e7f9bdcd6493041348982876d68b75b519d214994ba53cfac966c5ae21f8972dd28d36f3799ae3f240a2aea32277d25f6cdff887295647a1d3d5c57f98e2828a94d7364bc37c8be11c50c4a6ab813bda5eac388c2ff8c9244789c7df42ca2e87f1fcecdf4e993378a2889cbce194ff7892806d18fdd3c9631668388b2e8a04e563149b4a8e610a50a1525fab9c718940c51b8d0a6aaf9d66da74294f5c4850e4d69a34b8428e6f9cd7525cd4c1c0da218b322269b6cdad4ef82287afa471344be8923e38128e70fa7c164ac89517540f09d7f23f64e7f28a9cf9ba4cd781fadf74331660f6ae12f7f25d387d3fa499de46f9b0f2555af27356cca6bd77b289abdc71cb3d34329dcaa4f90d5dd1beb3c14e7444d71562789ae351eca5be2865ceae6b05adfa1344a525927f607d1931d4af2a38fdbc9a8e37d1d4a25c8ddc6d149e6ea4c8772d0e03d7ad43c8752c814fae7f7bf39cc72285989a6b5533f9d8bce369384170e05d5317512fd2596bbfb8682b576a63629265eae1bca9d4648bdcbb60d657db9f174fa938e6ad95036eb9272e22737f144d75092623cdb24f17aeba46a28864ee9693a78f4d7350d051ddf47971a71eb494543b9fc644de27e7a86a2d606f1ae314d3b9e662889197eeb7492fbc7ce3214c3a48893b43ddb29930c250d563efb2e7b1ecc3194473bb46df0520c052bdd34b2d12419250c43e9e4f0493e4925d79e100c655142b593125a9412835f285f678bae756813445e288736b3afb8cf5d9aeb427963a488754d6e1d1e17caf74966d7cc399f6cdd164a63da294bb04f99acd342c184faefda3d793b59164a259a30bbe7293ae80c0b25ed3fc95e435728e812c7acac36c6f3562827f164b62d393dc860158a17169ffec7740ea242e94cf80b8d5e7d4ca17c23d64bf22b8d49896d60520b3ea450ec11dd4a19ed486ad0d0e13a708831a33ea25074f55b0f26d69307258dfb8042395deb24ad55da4b861f4fd06dab36536bbece622e4f0c0df24fce39dfeac309e5aadf74331bc7a490d3b8616c9820213148d0f8d184829a6998d217e220a140860c1ca41c4c288512229e6489cd7c3f9650328739bd234c286eee36b126843037a9c8128a399b0c6a3ee66bb361105102aa29464813333bc868b0f18e48122c6f1041020e224748ad6b36eeecc511314239ac9df831c9e1fa83a8080539fac3674f9c74728408c54c4aa812b3079942e79121143fa89055caac24f9931121947d4d644e77759246876d8804a1a449f4d3a6dd21461d0142e124fbfb24e65b4fdbf945496fe3ec9bc891e955882fcada724257e69cb10e482f0a6626858e71ddf1420dbbf3ceda53d3d349e97117c520fa5fede4125d4d52a58bf2e8f22c959924d975e6a21c1f166a731204c145497a120d325b591620b728a7783f93d1575be453b62896924f1c757296592d4a5af5348ae97f517274060e082dd2f53a6d7d19f9ccd1711685b78dd79fce974549a82b63512ea553f8e96efeee1c162599cb5ebe4d777cb55f51b8fdd3a72393891eba00e28a7265d0646ae3e67c42a615a52a9336752631b4785851fe1825d6c7b63531dbab280932be67ce1cdba34421aa48af2c63aebe2a6b76aee6c5d3baf7e8bad1435251d0f53949df3c69082a4a1bcca489b6bb9053143bf3526555fbd264b820a628659aa8d3b641a528998923273c9c2832931052147d637594cdfd3726c25e026414c5d3e16bca4fa74c621f01228ae2b59ac8c7283ab529ab099050a881a2944992c3348a10e22efe849627ca9a54b642456c88bf209d28c76c2e25568d6be8ca06104e94a4e71c27492709f23c4f830d25d4a7c35600d944a96eee94c9d589ce9ca141345132a9b3e90f426a1e256c032413455dfb3f3977ee9c3633a33051328f265b697b8989191a7fa33400b944b14bdcd52625a6523289ad254af29aeba3ca6b9528e960926accd0e52801841298083da72fd34e46da9049980c49600b2091b8a469f1d23a80020840a21c4d7e74653a49ce32790432fa9c988413af50b723cc283e6f258979e24694fc2cfbf4468df93ccc88b2897e9332a409b288f2699c12b38bc731195644694bca654c8f5342a589f04ec4bde3743ccc7564bb3ae44e081bf91911e5d2304287a81565196c25400e5192ac6dc50493d67646431464cdf7471d8d7f93a42085284871b351d227b19418d9305fe3861837cc9f8500428892b89dfdc4750f03904194faf34ddafe247f57021144f1633cd1673569150840144d3649064d4abb99faee02903f9808207e288d3ab9d3798aefae3506a40f85d377d2494a481393523eecc1560f697968081eb4ba35716f2bbfe43b541b4fee0c62879212479507e9259aea155287c2a90932ef6353103a641fc81c8aa2e412d3f82611de9f4b103994a3cd6f7b38796b7aa301240e70e842efe46eedeef24b56c81b0a1b6e2b4bf61cdfc6e486f2c62b951f13a34e79da50d2aed9acf11b3c6f05614349f6fd1244cb354b944c8002138800b286b2bc3b55c7439403881aca4166932f55ae54299334944ff89117fd58ae39090d05d5f964350deba1a4e80cc5990d13fbeebe3f44662848f36dbb369d329462347d92ccdd3e282143490c3a8a7637bdb7228fa1a89e43cb99882c497cc550d82043060f2f234f0986a19ce274d57c6eb84c0d0c0569279fb0ea77db25f585b26c50df91fe555ef242497a9afa133b5ae9d877a1dca2574bd470a1d42563dae86c463dd12d94aec64c93ee9204102d1493507b529f4c5274d02059485fadc235e6b0b96a2c54667669b9a3b117569e19e3888a8931c8154ab6f9499d52ef5b724c02c40a65537b26ff7e6cfb6aab502eb95d76a289fd964d8592876597bc9fcc32bbb682009942f135cf7e281fb70c9717112052285b774952b5e7865032240ac5a0de77b5c931661c42400522804007500001b31c3b706801028592de3325f364e3c7f509658d6aa542f39658f2292714ed5a4bcaa097b9798434a1a0ee4c76af96c7181a8409c5fca9f294186b4c06d9120a33ae5994f0262514f4cb77126e7e3fbd360448128ae7f227d70112709b80d704eeea1e108107948c5c19e680dfa1638c1c0508c00ece045e8c1c381400801d3ac640010102906860c6a0c10d63030102d09123fd18488c1c3812300200040000000040004c1846c7183698000716d0011d3570180504a00800d0a1e3c8208000cc0e836414200066874162e4907100000ca00109c8916cf066878e19331600800030e00058630712238c29ec0087147084f15128f5888e1cf713148a1bfc33c698f584e269ed31efa4a53b4a34d878c170425935f66fd39e349d3c34d87680e3c348616c18290c05a3095863470e1a3a6ccc9891003098803576d8a0a1c3cc9891003096b023e908238561003094803576e0a0061a63c68c04809184c267f130257dc967f4d0e03e1be32c8c9463060e6aa019c86dc78d1aa8e3468d1d394e000612120ec408238c14c601c03802ce988100308c6067688b5e5a886014a19cdd3ca4c6d9134b18c12042c97bc5ad3c963a49be8650d84fc2576e0c18422827951e7ce4fb6dba3208452bb74dae319dd8270706100a325dec94981c54c658e4178ab7bdb5adc9e7115f944e4b6a98a8aa1edb89f4a278626dc9595b5e94bca39a77c9f4bea387811cd94559737510d592ee3b670c1d3350c2404417e8b9129bdc474c6e69b09de5a2707a57f4d6ccb5c85e8d03115c944d0962336a4ee2796a1688dca2a4ab6374b6bcc48b4b838daf02115b9433fdbae7843c2d1fcf183ad274ec6e20528bf376586a10619d4668318b9345c1f6427a926a359bd58ac4620d165baf3019aeb056945d5c344b7528b74e6b8e1d3822ac38297b55cb2c59310db66403a3828baca2a4b3a5f56e3c4988a8e2b24aad2e17b134adbc5351f6d46c3a94247c29e98fa0a2e4c1f2cee5739c894de41425b5ed1fb77354d7b91153944f301ddf171ba2b3454a915999c99a66eed685faba8dce75213ba4115294c4fc7092a0f37dfac551942459f3e64c2e7b1022a260b3bfec0769285ceda0153f32890d149f283314f14451afbacda396704aa813452df94ed3b7af91132591117f92aa364990fe264a3ae47d1e314296a8494d144764fc943947af30934c94ef44133469ac39410669443051f2abf953bf9a84cbea12c5cb0ccf5955abfde79925f8cc1cddb111bb9837b91205e9d64199d8d7699f8d50a2f027b7f49b124f17429328fe6a86d02945f8fc18918431b2e4d2714d9f502412695a76b8ab9e6eec9e6c97d929e963ccba61041227c31e718e28c88b6b2e29ee4afa341a228d6004dfe99ab5f39a3a27a3d95be7414972d839755a046be279e179f7ae592aa2249fd59489f12f2f5b224ad7bbf1548f0e22cad9a45bc84d9f35298f1ca22073b84faf7bd77b6fc410ac959da7659b5597ec1b2944b974d2f8e9f7ff4ff41142a00d026594204a9dd963da33dd924549204c0602a220d6631e7ee733735a07e986d220471a015e8eb4a3c60b227f3019e6b982881f8a59a2d6647e45a5eb7d3019c587b33d9c8cd283c9082392079371a3f110b943294ccc26a6a2539c1cb44349691343dc83bb2387183ab20e05a976526f36a9dbdda383c9b039988c1844e4501a5735b945475d5b53240e253fbfd6d03a6e3a9d227028bdd9aa9d9ff81bca1d4e8baec86b65c91137943667ed109e22da6dd486f36cc6bde5643fc6dae3a85dd7cb86c47f666927d1c81a8aa3aa3498c5ae86f2493fbfd72046d2505a93754cb6a8ec378286a255ed98ec30c9c41c46ce5092495895d472c40cc553a2c9b7a679925d688b48198abba1d3e7b417faf626434196a017b2e4ad4f668eb4a3c6192132869226bd926eff3fed298988a120bf59434d5499ad31128672cee41b6cfcf27d35113094c4602567a3f4fb663df28592349a4912f5f688170aa32fddec36633ab7225d288bde13facdd4e99374225c287e7db6f8cf7d7f2cb205fdce7b6d4faf8572ddc97c3e31ddb7f648160a26fe78be4db18e4147832d8285827653e6fb73e2b4760a44ae801065c27e35c71951aaed41c40a6b9bdd757ba76dc689df269dd34e7910a9c245a860326a0a25f9e9fbdcead2c4a58e8848c146240ac53299e97b6a66444ea0e032f6234f2866d9b19027662afd4fc40945138da349dc249dc628d28482d8200a864da86387592c874110056110c43008e465496b131348201038200c4683f1903c1366f9011300818b42f1702c128b43a16040128418048320044210848110048118c4209649751e851650261e6a64589db613d16ded23f87631d261b4449164da43dbff931721b03b854feb34321963c25ec1cb76cb3911fec7ff0db63da8cea92cd5a03abd17c3633452d996eb0e84f7ed8ac9ac8f63af2be38cf71bd167cb818208c02393187bd142f4e98ac476a465c55562b368971fd8254ccdcc9f4094a3507e3216fd660061a86c3ed80256f5d8e928ffa3d130b92a3203841126fd4ab1fd241dc9bcdad475c93a8343ec57610bdf03e7ec43163bdc23fe59a7192dc147458646d2aa53354cb5add908a526b72c295cdc25b25b1dab674ed135e6cc274a40c236e1ddee1ee7521f2c02217792dd7ae8a73ee6f79544bef4d42f94dc0cf5e5edf0d818d3eea4fe4fb67078f9a3e17299bfacf3be25626aa4f97e6e111a647d7285c5e24626455836688e096d26b35cca65a86d53e41ed6f34c8ad6379f6b4b4654874e97936e59deb053d332c1aae48b0f89231172211086f26db68f88431623f0fb0a59393bb25b9cd0866dd0600f1dd3b859a53a92346b7fcf546505fcbac1986db07f166046e0f16d6e93b6ed36db9a5000c35cd327f1a9a55e000a11067bb21e7b670be83664a2f375bd7de24d78ccfc7f7f152a89eab3d0b8c9ee6245990704e183a59b242d64b5886433b0b05904e76465567f712c7fab39c500c6bf21e3948fd584753f999715f6c4959e8327510d3fe6a57e0ceba8159dad4c226af0fb7bfecd9011b8d6af7ca920024b1a628b1a8a98fe02028d1d08a4f656ec313a430c44d044fe42901c6951e91c103cd61a3e240eb563f44e4684178716324076f001472c40b943a0c7f5aa6f4cc81c7804a0ace9e618fc8ceb141d6948baae47b57c23400a2ec33a3aa8434fcb87c72d4e6acdd11bb6e5ad8dbf0071b3a64d432a1f5383c8110810564f1e63e02742a547cbf11ce5318771cb5fdb14039ec8b5e73914cba4d0585c9b3bbd7fec9c36fd2464ed15dc219461cf0e81138ec64c3f5b099998dbf9fb66c9c01c2b996562879dd025e9c426f771c881bd53c7e8191ecdca6016640e2bc9611a83dff68c395837a6050ad15315c073c261661a9ee0cd0cefdcb30863e389fc7e2ba42dfc52c77a7c8a1e0ab5d00d13ca1d73a81b3e8c84b27a1df46dcb04f754c35c7f435959ed7dd2f5b3893023950b6e44b2b8d0dd0c5d1a64e266d1374d5adfd359ebd68917863a13a7d6a92e0027db71914195c29168072660be4231a58427e728477548d6ea86f835b37a90a902a1246609cc9dd768123aec619db633881b3dc9cbe64ac62d040551a6bcc9b031b8f5062066b09a32566cbb221c18bb38d17b5a292236102071e6dabb1210f6a2655928d95022a118f7688ba1ad3f2447ed8fd689597ff668647c6d52b1d6c248ea3e296ccd58e7c45ed194cbde1ac1d5e1cec2eb7d39da0902b2c771932e0688a7eeef6b9c34c2f3e32367c69cb7a7c54545c2b28d39d6e36c440df9f093baecb2e1b14ba5b04f9ce2410a88f40d17e424b297c3d1ba63fad0defc27438fb133740b53d9e271e2dd802a6e619b495a42517c7066e3e1d14d314b2b1b3dcd0958f62129e3dfbf145bc665f2d4a98accab28e60361397b6cf36b68f910d79ecec4fc78e5fc929b5fdcc583fbddfa746ebde0e6c81f9c8a2570f962f7ade0df0a19ae4f6826290743dcdf53588fc6775096f4f7e2cefd5be1a3500d4acb3a11ffee0f2d1f1360f02d1143db106b3bb4833775bc8148febb1d77533875153e45ef1d9cdbdc3f4c4059a640bfb75df955285795267b1d87c595c94bee7519cd46bbf287cfece0aa6c327ee05747473c5dd83019c3b83b4b24d436301d34efe8d83c080f35fba07bd1a34e43676515b1e44fc4edbcfbfdf807e8f443e25f641d080046833a2a2744a0b567fda5458dd5f7d5b98249a5af747a699f96fc5c00a23cf44a278f4dae861d10190be154bc4896e9a4b197c2cbd5933b63029a23dadfc3452919875c87b90d966b7f08df4596c611187dd90ad11dbbee6cfabeda8ae06eec32fd8529d3842429f39033637ef146262eec541e7b45cdd78b0d9c982422a6107ce581c1c17603819e3d568ca4a059ed64316e0eb6e725022ec6c0d343e9508ae9314af05e24ee375787f6a7c78adb3d87327d19290e75291786a7ebc40e8e8302231a3d1f0139cea710037edaa9a1676390e1c4fb1ad7f5e112bd88b4e5adbc676def4c1d9f80fc21d5c176df8cb3f2660344718da237f28f9191dd0929615eb5c1f8100c8a38e7aed9091207f808fbfa774ecb6e7af971629feb881a82c754edc6ed2fb0e4de9b322a2c5317f9f465349a1b16d9d1a4041155b0a06c27e616ade83db42bac26ee757ba304b63a20eca0a703036f987e41c13729cf30ffa3381272485e73c5843c3468270847959f99dd10523d81ccbd72bacbc8bd566ed708da2fc310f158accdf18a231b0a8c4488f1536bcc6e597323c30cd8623b784e09fd52921a67242c434258b89b4301db8444387bbe514c41456cda8ff305f5d8d6cba0ec10e284d13bb877161b6037f37513a0e3e1538c70a489e1acba1484f153af6fddf890e17dbe73a1601df7b7024168829ec55a12c8b5c7a5ac6354bf165ba44b3540bf7230d8970b5a5d49973d7ff59282e2a6fbb9e5daa20b404062f145d0285a27c72702ba5d5a4621968d4342bd948bf7653a1bf2e87224582b4586a5b2f13a30859605295e08e7b897b165a62a3276088607574cd76d374bfd056d0c5484a0cd103145bd1bbc1a399124406152bf29d245efb04c0df1e3ca032172527b825c53038508d77cc4f848058eabee4c508f4fdf60860912a4289e8d63da40024c16bb478f30ac5aadceb773441b65e1358f397770b7e45be065b6c20cb039632755743597058241fe3b81210caa51142879ce61dc6eb09a45c59dfb29e9ddac956c1872b3d64557c0ac4dc428ec2ceaa2361ef15ab06b26e5cefe622cf9f31a2c647452ce77bd17522df5087b763d3f657f55077806b2eb89f9f13f19feddcf4169ccbfaf448b08096df3ee40c65662b007b2c99c970cd0e5cfd008be333425eb950054ea26f74e7be3a315d8748e6684898ac039ba078f43af6cfa57bd336a441b69f11c76ba59ffe0b0d2a2aa64cdbb262d3b5b02333aa82550d4ab882582aaa129bd44c30360833707aac3299bba1efa7bc34fc948e116e1347d4fd1a96eda68188b8d1d3e6858d930b89ff1802c23d8b0be1b21519995a7f48a9e600522b870ef7431f50b8c60c29c0e5e778cda4d503c067dce0d06eebd7865258585d7a31ff484faacfe44c983007f4ab5f28bd56a6c51d7191a23ca74ddfd2321330b9239c1d93b2155a364d9673c2789e86826a9d7ec2635912276071222a8ad4a3d999d6334c316872315037286a9d42268d1933e71b6098928cfb648c9fdc85ac1d10a309c060d26483af7537ae7824ce79dcb1dcfdafc7ce056f3f5ef499438efd396cdf42ba7b263cea1b4c59efff5661d1891da92041b4aef5825a8a32942ba90aeb1f2d7e48c9a79ca58984485791b6e28c8b6be1833f084b861849445d4fa71f572348513d47b1014fae97672869ca8941572f45d0e5b48a3de9fba40dad830ba50c7471a8a1db29da709417e6e5451361863504ec237546105889cc030fc505953a8610c34c364f82c03cc5b264e4af46fbcb47cc332f7fbcec181d78e9fff5a217cc0a22da02a587cc8ae4e3031a71ec00e933f1636a3a22ea6366d9c9e864593427195e7f05335ecbf5114c8d2895ea85a33cb4f7f0005e5640e422d9f97602a854cad6158e2dfd0059b7140106fb9955c56bb6b70c9b3aa971bde59713d39765771afd5a6df6ce727ee2b1eabaac12aa5f500673539ef92449e84749bd3ca61f34ac20b3a86f94c9a8535fb2571131131443d8a3eb0310fcd1197486934688698d8865bd935daa1ca95145cb0523872d53a30ecc9b17db1b6061df4b6acf543f2e9364d2c951b4fc596c9346506f7515270a1eabda19d6d1e259ee2c96e03b0f99dfb22853e8fb49c31fcc6c8a18c16f4868483bd6754c49931bd184650c04fc5fcb95445a0b0c8b49621d7f4d861f17532d6102e82bd207d171d4efa70508abfbd75e058f3a18c0857ac5adcb67e2e9b97794c08a7ce27cb04296570d9f370ad5e2b44f4d419c1f6a5232b13e6094ff934075cc98a4654f47bf51bb9aec695f4ac3dd28bca364f72511c16755e58c5ad20cfe69c20c052853c8483262c91cc76accf40202d5057e452e1700c0936f25cf437c0564877e0c2309ecbcf6cd01687e51603842ea1faa78a19a882dc4f09da947516c0198f2b34d3839f57eb8717c182f9b52eed77e86085d9afb579c5a12710421f50c98110cd4ba8cee1b33e16012bfad42949c547572d8c335425063a9f389333bd4da8c9990e2666924de76c4af691b9a302b1935cd64f1dc3679fbbd2584928dd4a58a0d46499a05fa92e008b7c2fffff3b6872103dcfc557f1568d689295560b17dc6e4858200fa9392889bf0c18762628f2b7a43c08291e32d5d49ac7f34c60c832d126d5f499086c32e357c79e7b891c7d2480a4a304516949f301984c113072a3ce370ee442ef101a72a103893efc83368bdc1e79ce917640a5d25b2581ef19601564a56cd919b181ed03682ea8b1c1510642344669c3761b25c152f70794b29593b2c00273039edb6068c57b2ffe256cd5fbc41e8d096038bdabe01dcb83d4fc043b044e9c976e977a293f80047b7fc65215cc9bd0bce0097bc11c75f4ccc0d7025a8780c759023943d79aca90b6b33d90ebb0469badbeaf741821c448126041d6641db5fa6cbf25b383a35fe2822db8fba515fb5602cffe91359670f73860291a2ae7273a1c408bb1d9008cb3423fed53b557e839616bfd8e209d9e3563cc06aced594ba99536c24416124b9fa4262987e01753adfcca879026c993d4ab58adeb922b7c2a1020b60ee6443dee2c6b461ae71e8b6749c51d4ddfa142fced6ad9b4e1e9f642fe968e80bc1c35b25e655f24b21c75c04d6751c84bda981d7f2b798743833508dfd9b6760e2c2aac7e7920dd581db2c32b67349f30141518239a93c3bfcdf9b1ffc34ec572679902229f64586beb5c1f1cdc77eb1829c0d1cd6508d987eb462fee0c2b0d42c3ddc4f24453ca01d30c503af4e733090536228c634944c3e825f037c19e7889d625a28f97d0451d85a6f2f19cd2b812a4486c5b520e470a5f2010f33b781d197de325702e347d16fb195819f954a1b20f31590bdc329d2a51004f16b010911c6d15b0f8bce060778e43c36e39a921c8222983dc7dbdac73a3d41c32c5bfb9ba1a2c5553c235ea1e63aeee850563fc81614cc778b66268c6b8e73de344aa08c9cadf34949787e1339d43185cdc4db624ce9f5c06e7a7f1802216584370707c432759106b81f94cb445e2a555000b6ec56e566f92e52348cc68b18c40922e0be04b4274a315c09165f51578267438344c13e7052edd2a1d5552b3f0a32ee6941e15b81a6c6c7735602730d52693d44d022ae32824a0c7b184bf55e46c1252f34b6e612e2326eeb55919ea871a47acc32ec19ac6ff65f9bf6d774f99fd60d5f036da575e0a49350c432a625823e7db97ba3d356072681fd81efdf1ca5e9181c4effe0b12c963617d9261767795aa80422c466679d675686e077d7cf4e0d4b18db624c7999343ef7b911b35eeab1ac7a36b2ce9efdb9dd52318815eb3a5546c089440b45ebfc13b964548283845c2faac217d0cc48b3d02d2c7bc463199f93f37cc91de69dd402e126fd47017e07a490fc205148f1ea63bdd6b3216b6b3e6af6b4c0687f6d2d89154bc09aaaf36c1361ba5d4cd9733e5afae129fc4d37e7a267534b550c67256642aa52f7599b1f8de62fa6a105618d54e08c0018720104117307b322738941ad98b603f80b11ef04c88e70757767b7beadf21a12ddee344bd73fbe5810df148da82c30c3e88e470050c2397f401248196a6b795d640cfed0903f475d97803c5e00d74198d75356692597c12678deff6c967fd51a44ca748f6d1a0ee8e8cc9fbf99e5d6d01c88c0eb74653878d1ad67c1eaec2e31406b2cf584911f6dc0158b32ef8b9ec83d7d29992f2a5f05b9735dd1779ff23ce1967e6e827ddd5c7d3d747278950cd360cb1360fe9ef7f273ea66b3d88707ed34ae8db1f58e68a8d2118bd63a6b2326c1e384f49553a97700a50fed7a0601459b76f43cf20f63521d4ca1b09c294ab4f4e05a735d4e8cd3086e03b53f3570823043fb3b2f3644e5bef0b8eb9536614000c732e703cc5945402d1de7346ba39242c5d48ebc91889efd7b45e1a6cc2cf0379852612328397aeef039ec266d29baa7a1c8d1473769b57df0d4b6d4472459c97bda1750365b503d22ac907192d813225e7a0e8f36bd0ff6dfd36a7d35c83a249d8d3d4029d55d89676b92176c136323c4497491a861a40f46fa636953176234c938047cca3a741446df86ccaf23614613a7f709541c07fb58327486ba17b91b1a383811afcaca3378a8a989ce3c8d75f228bca40a8af8de3ab4e58c77526cc616202db1f6688c4d206033a0488ebc679cd820d047241a0f9221c371a09", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x10be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6fc071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d851648e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x10be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6fc071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d851648e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb353f244fd0f7ee324be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35": "0xbe3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3843e5f3cf6f6c3e3c071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d85164": "0xc071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d85164", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb38770965708df79a6c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6f": "0xc091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6f", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ebb131cb08cc01f08e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32": "0x8e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501045d67da6c89aaf6175726180c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6f": "0xc091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195015b5381a514fe84d6175726180be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35": "0xbe3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503c8728ecbe30649b6175726180c071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d85164": "0xc071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d85164", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195074d073263ff3984861757261808e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32": "0x8e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x10be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6fc071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d851648e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x10be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35be3213fd40251dcf15fb3527ba9a62ac130cd43f491206bb908ae5af25787a35c091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6fc091e37f53bbef7d4883f5c332904cb25e85bad2bf43511d61fd50c6f972ab6fc071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d85164c071a7af1abc0b84a66e421f08c5014ec2f3cf64fdae8cf0e47ef69744d851648e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b328e2e8e492f9ff1d774701a72eea217d483a04997e3bc0569f7461d3a43c07b32", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x02000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/bridge-hub-wococo.json b/cumulus/parachains/chain-specs/bridge-hub-wococo.json deleted file mode 100644 index 7024789b8cca..000000000000 --- a/cumulus/parachains/chain-specs/bridge-hub-wococo.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "Wococo BridgeHub", - "id": "bridge-hub-wococo", - "chainType": "Live", - "bootNodes": [ - "/dns/wococo-bridge-hub-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWCNomXYZWuhwHsWhZpmrFmswEG8W89UY9NjEGExM38yCr", - "/dns/wococo-bridge-hub-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKSq37RLqP3Ws3FtJDYB1xsjoBeJmehVYDZcCDRNLBXas", - "/dns/wococo-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWDkSQzQYC7VwpJKF8VJtJZMG8bcvWXm1UEJSKk8UE2iv5", - "/dns/wococo-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWQoUFxyPbpotTdUpfnsxQfQ4uyxz1beW5Z39LGM8JPhLi" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 42, - "tokenDecimals": 12, - "tokenSymbol": "WOOK" - }, - "relay_chain": "wococo", - "para_id": 1014, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xf6030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x0a000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9050f9ffb4503e7865bae8a399c89a5da52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b4dbfc3b7761206de75b3a8d70fc3d44a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b908aa810c364ce8c3bd964ff3d424cc926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f52c4b3c3fd1c798e3843e21a38f1421b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ff9bdc7d7afef8c14d5b253d4e25b33db0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x5191446272696467652d6875622d726f636f636f", - "0x2b46c0ae62c8114b3eda55630f11ff3a0f4cf0917788d791142ff6c1f216e7b3": "0x0000", - "0x2b46c0ae62c8114b3eda55630f11ff3a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x365c9cdbf82b9bda69e4bbdf1b38a7834e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x38653611363acac183fe5c86aa85f77b0f4cf0917788d791142ff6c1f216e7b3": "0x0000", - "0x38653611363acac183fe5c86aa85f77b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00584402045e8e84760e521040ed361d686da611213512500714bb39cad5cf5641bd06bd0abd9638f539f67d2082d63fc6761fdaff8a1fa0ce30dde74873a8d1951f13478143baf1c7fc501ed2ffc5ee26424bdade7b6f29a59432c914d40f5b0d260deeca2b0c7fdbbaa337c730fdf8653b3fc62f4b4cffc7b7f86506e0f85b77f5661a70fdf8e55ec2f1e797db5d343c81010803387e6e77651670fc3c57c0f17fe2fc1ad70f4a8c13270e1c3c3f7e39052c7f835cfce4cfaf7177482a8ef48352f1bc19e278a1c03871e2c4c13986e3cbafdd05af7417fc176e116214ca295bf7a04ee0f5920d5fb075582fd9e004eee7dc070ee96f39ac978ce0e0fe1ddcdf3cfdb3b5013cf8fd9d6d5b3bac2186dfbf9dda612d1de6dfbfc14d72edb0c6d9e26ed40a6eb47157e3283fbe7fec88f86d885ac10d37ee6a0c3f7e2d2fec885877c5ef6e85c6b023e2ffe3d08cadb1fb43f7fbe331081db0c1871faa04de92d11a9c25f6b7f0adede8d3de933d0c3f7b5842d84284d161fc1f8731c618e1c708dddf62bf3a47fce53b3402df6ff68f0e219aad79f263ffad4ff0b636c1eb8fdf1d917ed8a940839191910db86fbb2b5becbf39d70e83efb07697ff8fc74fbacb1f8827bfe5b0c69ec3da5dfdfe2b87c5f76f390c62ffee8844f9cd10029612b318bec5f0ea1c812f1fbebc4410c7db1d117833c4f07ffcc79bc7afd0e3162116213c636bdc3cd9c3fe9b7558ced931e3c1cf1cf6cff1db5d3f3cf8f1fbbb43025f285eebae2c71ff8f6ff08b7806ba06cfc09936c8c14f62ae518802dd602815cf90ea1a8528d0084351009e81c3f0fd4d8d42146884a12800cf40317cff53a310051a61280ac0f0fdbb33228d8c30fc1fdf9ceb46017e8edfeeeab70ecb10c7efdfe267ddd55f002f7e7f7745a4bbfae3b5eeeafff1cd39f839e61a85287009cf40317cffae5188028d30140560f8feb043e21961f89cc31afb7767041a61f83ffee33ffee3fdb5bbfa9bc7af90875b8498439f636bdfe0b7c3723fbcedaefefe1884acad978cb8e0ae5bb3c2f0e0f7b7b6a3043c020773683b5576c4ec74d9c9610769e76847079d3874ded07942878d1c38726a908384ce520e169d2d397ae4c0d19922e74d0e0d726c90a32527881c1ce878d1b99223454e1c395ce4bc91932647889c31395ee41491a32687889c2372aac8a122078a9c2c3957e4a420874b4e1b3a5fe4dc20c78d9c2472b6e848a143458e113943e428a1d325870d1d2e74d4c84943670b1d2f7484d049810e179d2c72b4d0494207899c3572b2c809a303448e1a3968e434a1e3440e133a6374c4e860d1c9a2a3854e173a6de8ac9173860f2e7c64e123091f5a7c6cf131840f217c28f948f2b143eb8ed619ad33ad315a575a43b4886815d112c283382d1e5a46b4bab47a6821b572681db5acb4aab47c6829b56e68d9d09ad2326a2dd1e2d2628255048b4b6b8716102d245640b0ceb0cc6095c1228365863506ab042c3158655869b0d2b0ba608d6171c1da82a5054b0c8b0d6b05ac395872b0d6b0e260a9800507eb0d961bac14b0da60a96165c10ac3c28205867505cb0a161a161aac33582660b1c15a83a5068b0e9617d6142c28584eb0a2601dc1328285042b0b0b0b4b0b2b08d696d51eab1bace658ddb18a63058355192b33565aac985829b1c261556565a4aa4345878a8d6a052d2aaa34546da8d4a8d2a8e050a140a502951915192a32aa12a8965460a8c25029a97e50f1a0caa2baa20242d5838a08d5169515d50daa2a2b285438a46e908a418a8e1497541da932a92e526c52665263a44c90222355460a4e8a885411a92da9a55517a91e523ba4aaa47040d581a203c506b502d41ca814a0c64085818a831203f5065506c5060a0dea0c94095060a0be407981ea227584fa821a83e202b5054a0b5416282c50605057a0ac40516153d091e9baa0289042684dd0353a2f5039ac86a03fa47e48f950bf785ca4122b703c3820a2916dc1ed50814d0cd561ee21e730d9918dc9bcc8bae0c4c8b8f08ee40a3c2b340be5c1c8c94a648185c246e1ad31b36c65e60f560913189c0b4e649cde7049a73cb830ab32528e0e88037020fb20c2c7122a36542950c9a19a830271aa82334ad9b07a0206931ea637a624930ea61898dc98f030bd60278b1c2f2617703a7467a85ac0b540fb82b2e1a9c1e261cbc1760396145d182b30a6195d178a0487c56a4c0a063e7ee0ca9c84e07ce07ae0624071a049b49a50b5e1baa850d03d4c30e8c298eed870903385244382915b482da419e9854423d19067c832e419690269861c23976416b24c848104436221c39063c82ea418928be826de116310ed9062e417328c24234b10c988654433dc0df4065c95d416292d52625259a4c2a4b04881495d91b2225545ea4b8a8ad41429295251a4a04879493d917222d525d5448a89d412d40a45a247ad24e80e9b1b5b0ab63128961614ad28343ab4309a1cda15da1c9a149a155a15da190d0b6d4c7cc1c441eb08af8aea0eee87d40d3eb8acc2b06db82c03180165c6c68122c3aa20270ad50c58535253ac98ac053488eecad60595c36e5911416db09a816a881a05eb07153a2db638740eaac6b687d462dbe8beb06f745cd036ba2d681a140e548dc604aa8a75a31bb319d1899143d013d034e81b54087a443481c988728966c4335447aa1ce810f14c95629b82cb8252d9a8f0a66c52c835f4064e0b0f87f9c644639e99269867a4ee9868660db41fa21afbc589052735d68b531da736bc1a5829362eb30a8e8e4dcd1cc2844337c4e90a560e53ccd4428554a9a044d429e8163a03539b2e0b1947a605a724dde89672bad00943c708f946ca60e2a02ae35169c1a065470bcd0a07120ae9c55485e9cb76c336451a21a790544829e4171985b44256616ac2d4c5c484c909d312262fa627e411b4074e0c35826aa145705e5857621b561756132a213a21ac18272d34e944c7ca8b131b3487139b79c5a6c4f6e544c4690d5b666323a6a0dbc285c1ba617b43a5474b89235d0f2b1b7870565e72b0d88e905954656c557838886c7060e45c3155a15b54303965d831b50a8ecd14827b01ad62b2721a22e78ca6a55e31d558346c173a6298a6542c5462e488d15193842a715bd02bdc52ce163309eac3fc62a9c8c9e364850e13d58a1a4662c901c274838e1b394b262adc175b18394f14a1535ee8404e9b9a05e7c55687ce11dc981c27748858d58005848e12261b221aca854e191d2d1c9906705ca0d4acdef84022031aa0c04a8c150d567016b0d24388498aca8b84120880428312b141dc904b22f3182445c907923c5112044392241b8c2d34094a9244434d210129241005910c489c50e08582e2052552a404c5d04489035a682283930f3431128393282a9480f27281273e20c30a412fb4c024ca901e9413177854976e81484ad007923079824340a48293254e963891c0a39a5892c4890b4d8c0c0d395900d192a0a121270b18008a899632c4440951500b4982825c10006a8976e24213264942102548062849983cc1444d8262088112161ea544072d69e2a449122549983cc1414b9a3881005113199c2c59823f4025d1829325412d848042a2a58420482889142921083ad2c4091329528226f0a1b83408983cc1518284a238b900920f75442709922148860850a085a0175e50428101a08c6829424b82605852444b216a1214250886264c1eb5a5091317745044f41226529a30894244435092100c3d79a2244994a0168698c83044688993a1213ba8213a86244a8894b4a08428e801289410226032a484091193264c5828199604d110944205d1519c2c8043656929414c889844710203910c4a54282cddc40913222551646821099193212949983cc14aa2c880599c96165ae264e80349828894b4c06448c90ca68641431f5042d444061792102d098ac2a485264c9224f1018235aa6eccc06107eed8d64b464618c6a20f4ab7d02df009ac52e775a6ce9c3a73ce391f3620cae8ee31d2e88336a554c618a38fd8b4db2775eab46937a5317a8cde9446a7d4bda98cddd1146974d92e3dca0e423a21b410c23651e9d1caa6749e28b5d646774925758fdd1dad8d32524a29ede8dd4edb3bc6e9557ad562a4d57aa4399a4c596beaa47b4bf76a8a31336516b6a44d9d76b791e8923645511aa36d1929a5d4463982a49c779c515277b7564ab7ed544ada945211a2b74f2b9bdaa61d2195725249e18c905219a38c56f300d476f796b77b6c2aadec4c566a295b6b8dd1bad328b5f6485b4ed931ca6ea7b63dba5c817e965a08671115887c1f03e689523a29e559c090384f725a4abb1829ed6052dad46b94526a324a199b6e51f3683b464a1d77f4e15ab7f49316393a42bb7bd4dbfb27c7a9d3e850e5dd0e21ed1c053c37bb63c7d63414ca5a77872dbbe794d2d2ee283308a3f57992d1ba161b00b43d84107a7ab6cd7d76d65acd4ad9d15ae724c72500019ca7c0c52929a5ddddb6b5c8797bc71829a5d23d5a6a6d8c1da537d70ea5f40821f5d853ce9eddb337dad1bd63bb5c11721db5d8b1a91480bb006208d14485a01065cbd8b1a39c514a2935adbbdd5a6b6db4527ad7c9ae93d235cddd5a2badb4314a6b350f8075b74ebdbb4ed3bc45698c07a0b2a9bb76d2da6ab6a7b5d6cae8ae494d4a193d7a8c515208a1bb078992cae63877cedbbafb50d8cdba1bd2da5edbeb3640ccbadb3bc208238c1dd0e89436ede8edde1ddbdba97b778cd129a5d4673bed760a29841f50e800701f1edd23ddf16edfe1a2945abb6b10da181b15a375eb313a75db326aa713baa7d3e8de2d216ceb6dad49762d29adcb38dd6d942977f729a395537ae081071ea452ed31524a6137f47677299da7dd9b8bd1bddda3bbb70928947487314619a5bbc728829452caa64ddbbd3bbaecee3c46975d53f70622658cd15d528feed5e5a4d16943e83b4aec301155ed2188e22486a01868092d0445096a218a932430030009621285680401a87c749023b444c90786869c8cf0ca010104107cac2ad11225529a288942948488490c313871b1aea7a36a12f4e4891210ba84189810359121caf55c2092e18320189210356112e54992255298c4b07302ec031a9c80800804980180acba8420404a4802244848c9d00792bcd084090c5294c0f0260c31117afd1040011a089113272e12ba04254151584142498868086a4200d60b02b85d821422294c68081a81000d8406262e044579f25205bda0248a132229495a186202c39224444332287121a8859e4a14450991140100116100444aa20435097a218a14006c0da48520295282a23c89c1c9922451826670b224284a1225525a581294a404219801803c591224c52783610991920f2481410a93264c5c707d1002179844099a21c9014a30800180b41094c409d193104459224236143443d050121a94c410c2ce0b4e8692bcd084c90b2f3819f2016300a18382a2b890248a1322254b9c0c0d29d951110549f9199a0445af4b48d2c409132951826648124549d0d092243404b5d0844992264c94c0b0c405179c2421a221e8ced024288ed081e13158543ba0188cc158762a92b1c8813a5654818a8a6214a808c6602c56648162b0a8a828a635501715c58a62d1818a60aca8a8481645a0182c8ab92c2a8ac536a02e2aea585151512c36818a605151516c027551cc81baa8289601754c032a82310854048b8a1c28068b2050171559a02e2a8240311883b10ad44545b198042aea18058ac18e4da06ea0188cc52450c762b108d4b19803c5600c02750c021d9171c0ee86314851d201dd3e26d376a9e9cb161a451fb8147be49f3e07c9afecfa56f6b2cf16c325f941b89b5fdacd2e9ce15277f36f173a5cc2d98574fb6cfad3676f83eb764d9768629335f59f6ef63698be1b994c6f7a3732dddc5da2995bf2299d66a85ff85d507e05b2c1dbce3b2c7b8ffab0e8d775f4f14ebf456bad8d9f50d5ac8dd16a9a971df5dacd8eeba36e76ff3264f3f22f435cfd7afcfa6e791c66caa63fa50ffd297483f3f4a6344b7c14fdcbb00dce93422ffb496f866cf07c1a9f3e7c4a23fd1c25a6921ef1b7f0a3f1157d7a7bed01f542783dbebdd48b3ecffdc9fddde9c32328c49f5a36900dce4c5d11d4fb15f2b7dfa132ed39a7afa29fe228ea37fa92aa6eca1fa5754432bf82b7f835768f2e71fcdcadcfcffbb25f7dacc6dd473b9fab97d78b3eabfbdd73f7244dd07ef6b0bdb65e21ffeeed678b2de471987f47e7b0df3cc46dfe7215b1bd42fef4b3b7bf41fa995b9fd5dbee427ffb65a2881d5e9dfad9cfffe8f382485088fd99450c3f1345dcfd963dd57ebeec73573eebebeec94411dbdfee43fbda67d9cb8e4806d960ea5f63fb4d5ced4771fd1abbbbfddc25aef44224f863faeaebeef15ef25ca526c6325bbc62e4799577320f8696002f87d5e71c7efef1f3dfb22ccbe06f9fd0c966d9b6e93cccec15dafe64a18fb845cd6a5bbc029453d0ba3fcb13fe96fd26b9131cc6f270ac8619bf5f3372c1997efd84b208e1c7f88242e2d7a80546988fcff10a10fbf914af60fafedd6d6d7b2d78a3859f4fad335d26857c028559fc32f40bc469f6db6139f0b79fdf06dff428558c2f986559275ec980c01fd56a9fe2de9b11fe073a7787eb8ac417823abf7548381c1f083e77b3d52ebc1fd8bb1375b48e488d65f0b69db6ed94bde2ccf9baf7f1d5ff8911fac71ef9a66fdd6c511f7d7e628ffc8c75557f518fbd6bbad96676d37ecb367bfa4dbbf637e7809ce0b0f9f1e7cd27e099029e5e193c5fb6cecc394fd836cfb6ed6167e47481c01fd9cfdfbe6c6f9638bb3af627fa00c51ef96b96d62cad59c2f2814021d9c4db67a2894f6ffa7c02aedbf64227ed678784c3db039dde5a0f9f7e4d0b9f6e269a387bd3cd2760fa6bb0fceecb8040215bf6da05027fc88e488d5730ccb22c0362845b84580ef4e00a0887b3589a81b6bdfe56ff0bb78fef0f92c20f031ca6bdd7bf6dfefef0a38ffa6a071eb452315603c7bdbcc2c934f1d4715cfcece5954cf591eb4edd47d469d59d7e25cde0985d78e6c733b7f09c34cc79b92f437ccaf1f3898bb7fefcb287278dd5101f4e1a1fca3442dc17e1383378730c4a2579e50cce1466dca3eae9b33f84374b3398bef60f4f97c871063ffb25723cb30b43086dcec323f1b9f9c12f6b97c871a461eb56acef8679a7a8ba5cbc3aa7af4f55dfc1cdb683f7e066cf836fb95a9fbaf9e7c79b8d3cec90cc8f2f951c561fbebc0285c487dcffc41f8f5f63ee8b3925cde0faeef0e3158acfcd796516f8a3b2be75f3afde839b5bdd7770b757ddf8f42bac39755533f51d9c2fbf8573c399dfdd199ffe165f05e3a7383878cb263e7d8d293ec518638c27eeca2c515ec1f0695764be3ffde2ffc49ccf07fce8fb973dea3bbdf7997efb3c5ea9e4ca767ef6eae7567e1b7d7c48ff0a0eb312f0213ede157d58e01ebedffcad7a736bdeece1ecc2d18525b45f61e5be7e96b8fee69ccc42adf5bc562b3fb6f1b30bdbf876e885b3cf43af4c1f3ed70de332987fe5aecc52bf2cb59c9e3e0bd18786d823ffbfd5f2bc4683e5cb2ca76fc78c37f4c2dce9e96b9fc39dbefb2cb560ed7d7c1d7b20f74227ee69883e36f6c077fdb75a32de3cf4824658bee9eb7675374b2d98becc028570328b5492666416c885e539344883399cfa31406cc106c0bdf4031bbc350a055e2ffd0006bb702ffd9084b746d1c0eba51fcae00dc3dfda044f622e094b2e58fe068d3cdc6ffb570ef3fef4fdf08ac3baef875a1ca67d46bfb72dfbbaefbe7e343e0dd1c78d624ffcd46f11b56d99bb7bf609d9dedcb3acfa767fbc3b24dcc3ff710e090af1af799a9ebbd9b17dd3cd8eb3fff1f9652e09d739e7cdef5f86d8fae739ef9c7e85b2b73f7b8b5c774522cef36a0fbfec6148633514e1f9f5c29a498031fc9f08bfcc69c199bef609f917e1f9e588e17b6724e2f85b0cd7875f8659e2a9c1d76ebb6b664e096722ef88d40b256221ef9064c7be51cd1dc3aff5662e09d3b7f5a5c34c5fbf7eaeb542a8c4d56f87993ec3244ceb7cd7be0c6b4e8cee4343ec890fb0f5b39fd9fbcd12d718df8da24f3c5a7dca8d707c00fc79b311f8f3e7c30e09fcf9ed30edeb734750c8fceaff13b17f3b663c22c7331339ae4f3f734958fbeecb1077ef7545523fafd07cff53eacb10432dc6f851f5ab38592b53bda9ef6aacf5b2a296fab1de95eac6f9296e0cdeb2aff19c59f6cddf20373f893324134f6ff8237347b83eed8ac0ef9e7ef37fa2e93b3df779bf7dda43faddd7cddbeea2f1934f43f48947b0e1b41ce6b81f6e71d82ce2f8243f1e459fa825f6c897f01e61f9f0511fb4fed98fb0dfaeb3dd670e6fce7148504886181ae1f89366f3e16b0fc5f086389c5da1f9f5b5cf7e83f001f5b59b21fcb2cd3bfff9ddc3ce08fcf9dd97258657c7bef634bb12961fb5449f8e3d52462df52951c5f03351c5dd9b3ec323ac0d71187e1ee270f7dc6789b5b75d11f842ddcd10d7dfbe7648380c1b0ece16779fa31358bef7b5bbba3f7dd25dddcd4415d737dd0c8f30fdee5e76370f71b83e77b3c4f239242804de2c2586eb6faf7d6b4f3b221a9784b36f6e90ab1fc5f66b3cbf1c02e86eca23c0b37ef3bb3332f1fc1faf9fc4f683b83b231bae9743823fe8955c708b104b410fa8b830e59c3226441336c84116187ce14517a91ddc7c3cf840e50331268eac30429aa202373940edf0c60e2ea8f28115eea51eaaf080871e7304c92865c442ca6f2b65b6584af90696522a91a93222183c70b1c399243982bc18bf79c002c797ee038da2121ea0c01de05ee2010b99d7ab056b5f3c3c4ba4e47901f100bd8078fa045f90b1c38b249c80c10d1e0f49a634ca9cac58b166e8f04687a40dc829e594f2bd242a584a292fe0d91ddc4b4954608a7b29e9090f236988d70b03d6be3c661270dc6fa38f1425e850420b1bb8a0c2e814010bbc2c20010ea98c0e521c539034194725b0f2e50b0ad0e061426ac204c6e25ed2814a0e6b8ee048c0091c20cc88630b2b2fc8a343c29221197184a4288d3bc8a0e00d366cacc1e5e006090725241dee25241a20b1e0dfc5c2f3b8dec5c2bb3ccff53c2c3ccfbbdee5792d345e0420000108cc53f3e45ec255b6fb78b1a77e5b2c3fcfe95fe7afdc55e7ebd53df5e7cdf43d7755fad93b72c242b4e5307aeb77fb74f7648bbb7dbe7beac39be9b7dc551f56577d04781eaebfc1eec809cf5f790e830fe9d7d83b07c4f08c3e7048addfddbcf9b15febaefa3f2e3f7e7e6133ee6a95175e7ebd1c96ff84faf583386c7efd141c96e9cfafdf11b5821b62ea374fbd42bd14f348a38339e79c55bc60557982e5b599585e2def795c047877c58fa70a96957cd7f3fcac62c5245f6e31684591f42f3f97fcfc3cf27ffce5c7f75eaa91f3ffcfe3c10970fe17dd02057133c18c22e968290f7ad4c4105176f4f1e6d10eeeb562c32b8f6c48c29e4603530ba64b38681399f385f3bcde2afa0c79c38836b81421851d446c5d661449f10ebdf07c6f7ead55fdf81d7deaf5620f7cf9d96288a588347888820b135ec46878be37049ebf7258c513093cab0c9973ca2bc46b9c3d6c87c0ef4bb5383c363dbe81656e7e26c0520a5d06e27e09bfdf7582fbd821fd5ba3caf07a890a1c8cc2bd44a507dc9dff8f33c0fbf8f0771c9679708e778807c3975c2f5929018e2f8518127fe53e7248fc6f14208e31c6f8e34d32f0bde82387c087ef9fe72ef8f35b790ffcd51a6fc3bd64250c66e15eb282046e1e580463d25d0e2b3fbc5e09b0f6f5fd5bce8e18f16bc28385e273916b87651b7bfc3bd7b7eff4e5e7211e6c3ffbcd7ed65dfed9a700af7e63fff93f9e7d1277f49143fcadfd1ac30ec90c10c35b6f131e4caf90fcc961f8dda9206fbb2b5e0b1d696bf781464646464643f20b77903683a34f4c0b2b92f8d2069c3cf2886248bfe7b00c77bfebc77de490fecec0fcad3b220ff03cdc4b555a80fde1f75b1ff9396ef1b3dfdd918a85e24b77cdff71ebb078b3c4f3bb61f1b375d7fc76d7fc15164fe2ee76453864ce6f9e79853cd845ea8d191ca0c00b1a274e60c560e1b2c9cf96de0c71bb8b3ebdd962e83d8d42e3fcb0fa99cb10cfcf1ea6dfeed343720bd3a7f6e9af1c2631bd798807d3dfe867dd053f058f3efcee8ad06bed573fe9ae580f539091c70f698800c28621f4adc32aa6efe17084e9efb84f2f191919fd30843e8fc31ad377459f1e426f1e7ae179adbbe4b7bbe40bf1a28f1d22e5378fbc42de848e044f8c3146f83142777f19e14081473a36b223060f363c28cc97432f6ce74714b111961735a0c0f0e537f49218be9410ba0163fc2d7eb03bf83f3ee7c78f9b73f1abfeb083ef5d740867b0f54471ee6a77e51d0cff847b69ca1adc7217fcde998206678bdddfdd5d0c767777ffe6f127feef3097c3b26c392c3ecf94231c9f739f382412c071dec1f1e34b87f1c42bf48ae1856ac3eba51bb6e05eb2e10dce2eec6f02ee251b96707744bc1ff73cce61fd3e1ff76ff36b1c3f88b736c18398466e7ef4614724d2efce01314c37d819994f6f9e3f7ff3ce8887e77727dd257f935cfc20de2247bff9b0ebff1321073e0cb82b7efd8030c001208755e830eee313d9a7f3e61807821c448d0c1e0c9282c39e012b38c061dbc767c161d6088733c499c21fd6edc0f07d30830187e5200ecbad26c8128e9fc20a0e8bcf0187a9707c181cd64b3e2c81e30fb90f1cd241f00ae76e43e10f7a279289a1c438715ad12748cbd4ea5a78c26b7f0bf25a902c08aed7ba0b06c15109b708b10e6e74d4c0aab5d6974a9a34335f43623ffa52495e914a328b34c37aed63492579258b34e3306aa954aa55667987754f9fc761dcd377390c3e7d02386c7b6a29bd7966a9850599e564aa52693e0bd107ae549b177d42f82f38c2cfce37a49a98c6d1400cef194ce195664cd943d4c3cfa6bf0fff666ffbecafddfbcdcff66f7b081e7c6e7de0e3f38370db7b74be7f27a7d501f71d7fe7eadceccab93e6efed6cd2d0c3bb8d607c2b86ed7bcdbc36741de6c3dafa5baf9fb66577cae9f0ebd3097bdf59b539dbd465f62ee0a791c7debbd455193a705db7985bce73e7bef8e70d9f6de15a2d44289bb1f77c52e8363e672170182e0f9b076b08310baa028800e05c15485f9dad3af49102c34b5df36c881f085f0f6044c5f96d26bbbce7357d7754f3f280af0becb07bf4dce469f0f24e04342b836f6d0fff10fbe8e3d947eccb22c9b9c8d3e1ff890bb82bbbe2e213c343a456af4eea2df7d2d77d1e7be1d77d1df3e1e77d1ef2e02be85f081f0d9d8639f7e2b382cbe772a686fef0a12884340f81f0fe1fbe0e99739c05df141f8bcd813ff83cfc69ef83f31fb629bc1320bfc426339dea2c206890d92890d365d93e908898d0989cd11121ba40e29226994523894bea1d40da57650da86d20bd9983e335def3bcd27f579fb93473def7aba9b25ee6ee670173d1ae5f7b763c6d32ed77ffa22d6b297f54f57fb367dffe93351c4a63fdd0c93ba2b647a4dab37c74c57c87690fbee886cf6e9cf8feebc0bcf393f0fadb07d6add45b9bcc2747e34666fbf262b2c443ffb2d72da977daddeb65def4b7df7d5efe2fd8fcb4e02aa47d9d4c7794f4d7d5ef614f5b5f7d8f7aaf6f5b3eed25658e3b096bda679dfd2723bee82de0357dec3860d1b36486c903af7c2d8627372915ba216bf02313c921726b96bd2979ffdfa98dede6c3ffb97fcd8f56b6ffada7bb4cb7dfd1c87b52bedddb2faf26d36f1f4ee88bd102976856a9d56be8431c62ab9d9c273c6fa4939bfcc6159ffc7a1c4da84c342f2cecbb92bdad8acf4abfcccf4bd624fa417c92bfafc98a431f59b471529c961f5e71c03916a4dea3a1bcb8749f09b5f4bdc52fa4cee157d4c12ca3bef676278f1636cd580e7cbeffe44f92521c11ff2e5cf9f38e5e62636e8d7b806faf4c620a4104ed4dbf99e87ba48a018d8c67e504cec88d0d3a3be130c632d14032d180ac5388cc236d852086118995fd8e61360180ac36c5b63cf61b47e997dd5bfe67c3bcf4833b18c2f416cef184cc1d80bc578eebebecdfef6662826f5306f8fead7defbe893fa08dfde1cc447f5f0e617b6a7b75ee6bdfd8e3eaadbde937dbcd9950f87388c92d7f45aee2e916bf025465da1eda27e7bd3cd2fee127976ed663931457d7def8ea0ea29fbed0a41786198ccdad969763e7cfb410bad9d75da0967855c772ad0d77e8b5cea533dfd4cbf6d4fbfed539feaeb977549fd8f6f6f9f7e76d5a2147eeeaaeea21f1128104a7739fa21a9fff1d815b16ffad811c9ae74177dabfaacf7d0dfbeec619a7d9ebbe2abbeef8a684fffc74d5fbbcb7bfec737fb6d9f7dd25ddbd32f7b78fbed61a782f6dbf6f0b35ff6a0404ce947c46ba97d5ceba3cf8ee7307ba19830274f7d71a536f8712ff5b0056fbd39d79d4a057da854aaff71d81151a1fe0585b01ec5faf940a010d645b235273b22ac9b6398f5a8cfda47a1ac45bdfdd811b13f3176447c3cebf371730cab50a8871d11d4d60e53b5fd06f2f18ac32c9189fa545f8658f571ab9c4dd914b03d614a200f3a68a988cc8f3e3f1e74d09a1f6d837de05e0ae20cde22379d904b442ebe05e279b5603aff0585349e375e7117d53c78f8f33bf8f959fb393b1520fee07774726e46bdeadb61accfde77ff137d3eb83b3af7b63a039ab775739f69f54d01cf6bedb3be76576645cba57e655ff5ed98f15097686255eae613ba6fc78ce75d22c7aacf1ed82242f625565d21d45565a8cf3ab8dd67ed7693bb42a8573d7cef8ea820eb1239f7a82b647fe2d82199d87240e08f39bfba9dbe3b22a6ff71f8b02b5221ee4cdbbe7eed2efa75cf15e95e65b9875fdd320fa60f147da4f7d0e7ec0ad31def54e88a38e63e9e3ed3273fce6b790ffc17862e0ce3d780e9cfeffec49ae31520f0c7fcf9f427d28f612a6f9651c63c705516230c7dc0bd84c50eb9d5dc38fb7eafebbaae7a9f50a66fbf88769de7656fbbd597d1c97511f52bcf5b79deea7fe2aa7bd427645a9d3cef572bd4ea511dcaf3fec74fa837997ee5a1565d664955eac4aa1eea4d2bd47b52255312e5dd93d4bebea9e33eae3bb261ed66fad9ebf8db4be10f3ae1d73182188347c0bd148412de4e6efa84727df945b3a2503f6737bf43559b259e0f8094c21fda6bd1f4289486d2501a4a43fd4f44696ffa843614874299506fd24cddff38f7e5222c64faedbb43b23dea7fbc7b22c726a811cd6e0861caf41beaba77b3c57ebad9c36ebada7337fef651f843cbeccd1805eb94b8c5d8555921ee6a841271ed4e8518b6bfc9fa650fc76a80dfd50e7e57ff27d6f8da2734bf31acddcd31dc41a8d5d7dc8eee4289183e4076dfdf1d962b1808eea52b6bb0bcd16139836589aed3b8d73e772fbb2242f566b8755d966559d775dd675dd7ddccd1ace5d92c3697fdc5dfe0b7755704f6973de76c840d31fd84a0d480ed37eece48847842fa9d25fe0c6fc75f834dc0bd04441457d05c71026fb1ab7f450b1600ee2520dce0cd39da11a90f3bce5dfdf55bb9ab6bb6a6cf2d5c6fe63efbf67bbaa6dbb1a77ef431bd9fbed69b1f57efb78a7afba9afbbc7deec61fbdda3beee1eefebee397db6a7bbd9e2daeecabe1d331e778926ae377bd915c93121ed7e16af10fcfab45e0a7f1cd95e5e0a7fc4db33c63915c304c74098b4ede4faed94d2f9442ee41ca59372574876fd244cb2493246da5466f4b32dbcb254d636c56a707f78e45a8438b841682d54b26e9f3bf926adf45e9e3cd3cdd6badbe73ecb23dc854856722f4dca9792bac3a45a4dfe9ce9244f9be9b57882485996c13178b39cb596f30b91e4f665ff1337c941a41d99c98afa187d50f73b2985e4dbaf553e8448f047f71277dc8ddc6f96abdc476e8b34494a29a5ec25937b79442d9ab7d9b8ef7f5908219c270d426b2794fedc2731fd1a3b8542e84f2badf53c28fff4fec18ffb38dc1e3d7a845a849ff6fe69dfde495e2e56837c6b5fcab7fe86936eca124bee2514e2cfdd9f28bfec7670d67485b8afaa77fb9093ab97aad5cdee6dace79d6eb7bcdc5779e9fd710981a2cf4f6acba47c29e54329edcfd7baae087c7985e49f9e8314fea059447912f5de6bd0bd9b89a685f2bdac2342b5e04d72527e12739f94107b6764c32769bb22fedacf4f3efce69b1cfe2639fa82f4a1b556fb1ac3ee6dd4628cdfbddcb49b3d7bb395b25e4be18feea54e7dfa337e6bbbb99569375b4c35ee37ed85b84ce33e7291fbc8dd4c346d7c0a8568d9a5f007ed88506f83a194524a49e18f29a1d12a0bd7123b7e74bd4e089282c3b6d73ed3779f7dff4c0fbfba52a1221116583256830646934bc84f88d36e8e61eda1a42fe1cb2d52cbc240215a279f4b653725dd2f97297577d7ae907cee35e95ff670ac06ea95ca2570ae4fe442da1761eaefd225ae607e22fdb2dc827395da77557afd970f6f8d13c609e384127e866f1d963d8410d2d7b4f74f5aeb79dddc8561fc93afd1abc3bdfdba42dddcf2a7371bf1a74f1f7648be38cc3e7c08060aa10f35fa35d6e86769dff4795d11d4d32b445ffb13caaaeeeaa62efdfad6614e596bea8a78e773355533753314e3f42dd711d9363929e6bec692d24f62f951ca691482f137fdc4eee3deeb9b3eedb3eff4f16399e8855fdc55e7d3cfd673ab615e0f61991eb65a4e27ec60f6d05a6bbb2b44df64c34021193a4cbef71d7de27b57e28d7ed5beb6b7b75f21faf6a17d8d6e374331d65a4b4d500c8657277beee7b75af6eb739f94d8f4f5b7ee331483b7677da7cf12496cbfbe355dee2b50b4b6bb198ac1f5c370bf3dfcb23ded886c520bd668967d8d29a5946661e08f4aa191e73ebec009679a712ead77bd3ef81c64e7732fe97c6e33dbf773def6f1dbbe3f04104c1fecbc4ee6eede69ee59063dfbce2914721f7eb18b9a77af4d3370c9dbb81b87739af76e9ffde7fd79b3ef7e7e16e1b2e0b01c29a59c69aecb79c6effd3e4f33140af138cde0094d6d6ad3c39bebc4596c45230f8ebb8137d7a7f0faad7049e3fef4ddffd976089fbd06a1bbd4efcd1d4ac5eac08356101fd27d9a996670fd6dbb14fea8ddca5eb7087fe2785e9b4fe30300de1c2fd1c4fe9c6b3f5eea01b07a378af23bf2dcd38d37fb14e1423ae1e02debbaaf719665ddbd546e1f7cfbe5df3e04106e6efd0737bbf0cecd2f9d9b8360f93fd1071a512824cbf1717390eee620ad9b5ff6e6970737bb5c1ddcfcac9b5b4baa9bbaa89b699fedfbe7ee3d33994c266d7bd3677b290bdec6dd389c68947d363dcc2ed1c410c2cd5a9b3d6cf2cf2d6cfa954e4a29a5b4034c29a5d487971ae4c0e535a9a559ed3b6ee03d4d25e9ca968a63b044add9eb0439b881892a698ca0038c375878f060adb5d622808b1a3dbc80d3822890c8c4d1c8b8c921084de332441859b880066c30a1c3901a8328c8c4608b2462d0438040d364b600c3e5861af490858a0222183fe0e1c31ad2891e7a4a40e72b3ecf0968b821e68c13fc70050509f8a2bec14229a519d5ae54e967e228cbac0cf132adf1668d1bb041858da4f93972dcb0871352bc71811804241db5154ddb810a6e06aa2972072b1ee89004a5948201e33d3da64cf603e6cc534a2911714ace0c5455ec10565c76361a2323231c68adb5b21185f7349831652866e30ca5aee74169395da932e79cda9c9c1a3d4c9a161303e6cc164188d9c386255250d26176c1a2696dc8a1d3c60d7cf857c541a5c3136ac82c9b42060730e894aa06d73a258fc65f3891c54887232fd258c11c6608f9e28b46e68b2d785803255f3e240b1710c018820b0906103b24552cd424d912e07c3105ba400ccf0bd4682f98230710d2c820a90c2058000334be40218b35ee48434d1a6bd26843421a38b22519fc7065eeb186524a7b50e31b8f399096b43053850c3d0e30459824b8181919191929b911ee2526b41809a169796c44685a1a49043563ba000e8a8c1d3e5ca9b29179810d3c326d4ed08351abb502ba83d7f2569ea7431a9e0956def53cff409ec0527778d55a2b162aded3491363b9d28a4604a005061456ec0e5d6489811e53bc50c38a206f661b4869a295278e40010f44989182295990f1a9c28c172871f4721fb223dc4b561c1de10078d1c2488a3b54f0e608d811774587773dcf3f5784694a00e210038b25ae00d3c50b0c40a908f1aee7f9cf6323e25dcff31a921bba54f1018d227ab0e204306a88f857754197c7a6e466ac31a38d196e2a1044fcf0464a1f3b44ce39271aef69356bdab89143b4c091d2ab9862584cd9d28551162c4a5698b0451c7b58c9010ece70a20d901d58256841144234b1460a3a4a78c20c0d0b28a67c41d891c41674f84046122fa57f5122bc373232baa1d65ac15862821185d7840c5cd0050923f4b0e28a1f612c6185a70ea5a3b8078551888666709329e20c9c2328618238766061b4e6a800532c4d244dcbb952c5948419f7a1b71a234d1c2c50230c376c9004095ed8c1439691f1c20654bc8f4bb3d25a6badb5d65a6b9a3770ad72881df08064d070d380339618038e334865d610204d13199934544cc121b1c7111b61dac44187990178c1e20397d6cbc8c8680aa594aa31f29e3ecab01aa52c6b41a1b2061c3adc28c388140ca12360ba83894c1b53b09851323232ca41f6120ec698c1b407d31c2861fa84153746a0f4bd36984ef1022a5e2a9d34c394524ac56893650ec6107270c1c20734643084ba302553c69a24cc9833e032adec68d0464586067b1c35a00c30ce88e9f2c51e360800ce948c0c9ca42a31ce7681317030838e2ccc40410b02200796d7ec3546464655e69c6f5773ce39a938e33d9dc6bee1b169d9e13d950a17aef525b930726c61ec4002001664ec5218347e30c349102c28038e2fb808420b1e7aba0308315baad840658b0857a49713000146075382e88114270c1a7508a1c7f582b481f144172449040f1e8cbcc04153c798af0e248e8e785b6bad6f784fb3b176783f6fbcf19ec6b9f553c8518498247a48620c23fe8852b9591902b543ec072b6cac00872aa840410f21d02094f4b0628e90bcc1e20436bc80871a80010219206440660a31901acd192536be443144970fba8854689054e9a4b0f5d1470e518a3a4b584ca1e5c00453b63459d491650c1c1510b143c5b261e268027770e1522689277c8043c78b1dc24a1e8d066f27c8c5c8c80889524a698606f7d21d4798d24683b57861250f2bb2d481c699213998be970653374b573c7f63d65aebac3f3f9e338eae08b325a90d1940f800c3892e910d0cacd450868c25c250e30641f4d0029346aee0cd0eef7a9e2cbbaf471a2d6364a0061e6178b0042607948d0d3afcffeb4ddf600dca4d1694cd952a40c6c8228b29b05843055c7480038e0c0e7a30b2b8d65a6badbfe2813a78f52b66b3147b1acf69f18f679ffd56ee6a373150c1094ce0461a3e28c172c2b6f9e283a4523ed5ae47a9ac2b5cc9b031836b65411a5c6bad370fbd3c77c9cf84f01a7b2d6dd8fab34387fed0ef02e4cb2c7f932da55c05e1b57b77f37818dbe9d309a149e88fe1c6dd81f0c18e4e8e8f96071db056aa14ca3b993a6ed3325be994d19b84feee6093d025fe8f5bdbf176f714c198bbb3b935f87eefeeee7edc5d3ffef11883900431c6fe7e7873fffcd8b37ff60bcd18638cd25dfd664a895ae10d35ee6a2c5b4a29a5942fe99c7442d966c96f5e618932c6e81f1fd64133a594da34fafe36e1cff717729392e79f39188cdfb0f9197ebb4bc2772c045fba4bb60ab42f22703395b0fc8d76f140c0dd2464f9652a61f78caa02cb975fa612119e7c69e340c92f384f2e21e07933eecde422abc07972511a83055394b0d4be94406a1b673d544ab5629d4c5d16c4cbda95ea85f2ec13ef64eab84d6b363f99dbe7b1945e0955b02601ddc8b623f71b3cfb06787e0bfd46a7e933b9cba44ec09300789aba27904a10af2de562ddfce26e0e82bd27dc77803a996e77eb85548a6e80eb0342c0a8875f5837077961faab9b5ff4555ffabbd9a06e8e6df1be6fd7fcd919e925cc3d548a3ef0cbe99a6e7779f0e46ee6c0972f5f80707d592195bae6063d402a2b98c1218509d0582dab9c4b0bf7c280c5f55fafd76b02fdb42e3499cb34e89c70287e99d4271e148afaa5a20064848e9b33dfedf307a3f6734421fbf9b0853800fee8323bbca2cf130740213009fe88ef799e6d712fec38f719ac3dfd64bbe63f893e16264121dd3fecbf1b376e50e826213bce30095a0b95a28f92126e30625e3cd64cdbfd9a84f957bbd903583efcf04c82db3502dc1999b0dd94dd6e12a6a55de664250c396497c13266821605734e5a6bad75428974cee974cd6c69ddc19873c239e79c904e7a051cd3b3cc68835ab39f6f1b05faf3b346c1723c50a9f21a62db84f954b2aff24334ad88b609d31639b677360993e209e7ec36c0ac41d25969ad53721ef5a88775d3d25f27bcfcd5b109c0836526b797109b46dfe5fd5ce1c1cfbdd44bd2bedc4c392c9d73cee9940d8d8c680329d0fc363f59b7a9cd3929a5744a0e64d9b7c36a9854d2496b9d934e77c92b7d684a27849452af66997d3a9f7eadbf550e89fcf9c5da199197bb4df3901d11ffe9ad5a63a07c7fe8922b1ae3483c89b472a330bfaeb6bc8cf0b8cf2febae88a79423c053ca4a219c52d4392dcd68d71eb4cc023d9c614641e9500b533a29a555d096562cb58401cf97de500bcf8fb6f38ac392b68070cf0546e2ec6a8da0861735640bcb5803d928d0b8c411c7f4ca26814e4c63f5eb26226b9044314e9c38716688785034e484b235c4cdcce109a77f5022843ed66b496965a535674a39a5a453ba7c971c1d99a5da4b88ed73754f66e9bb68b0d5e594083f3ebcbd058c1d116bab0f5e2bf6c4df7aab9cfffc7c3e9e9948d28e08bc2defcab4020ffa6ff3017242a8855c22411b0c9fc2e165a8c5b56029653709b2634fee36585e1f722d30449ffaf2c225d792049d702796221087d41b95624f7c0d8b3b91dd09d712d3f080c6b5c82579c59cd3d239e72442bf9896f3ac98d4a7153aa5cfe145eee7dbe8b3bd10dce6c25a665f4fbc17cb8b1a5e5e585a8f2e786f35e184d07dfaf53cafd592d67d32197d88ad6fceb7f3eb7c3b6b4744ced9199997f3aec3c38354e61af09cdeaa2589249eefdd1105c4891347622971f344eaf3b583e94aba0ead56ad40ae4a6b903c3b62f058014f5443dd58eee6f8252661199570354231948ae1ed2621c7a32e9efcee5460613458deec4f7f287ef9f22a0d96ef68da0d8e9f87e21725dec0f3f30a473438c725371d607aa9929bb8e469708e4bd1a900f3838d5fa86403ddd04fb61b4ca1bbfbd06a367cfff94189eeb93569bb1982f3ba0dae9f5bd0880a180fbee5bc7693fdb00419b2ddb8a159a637efd3eff9591ebc69db45394cbb874a8b290db6d639ef1087a91a5ed4f08269a54d38cf0d47ddf0629c710f7a048c74465a65d233b65b9db98210d1ad7e5d84ea5dae17f75a76f3b3107d543775339bd9ecedb51f113dc5891307ce40b1bc338ead79b2e6e6ad73f29371d6cfd38989049653082ca70f58fecc611ec9973f78526636044cbfce239ce7128e9f83543caf66468d073fcf258d8cf9057a41c60b3bbf60e92ecd0d171b94327a97f6e0514a29a5b7a5c33210a63fb9d919794caf7744fceb4b7a25d13c12429c387130a5ef4fef0c13e20cc637fed23fcedb5bcece179e7f6329dffd8df8c71b8b106ae13e072901cb9ecf47fb78ad46817e90149a0812420e01670f6f5a86a63aa617862621befde2c1ef16a4803a2a93844c014b0dca2b3837214043bf78a15fe8172e948a1d3c2f5d9253e8125da25f2017344ed02f9c1b19dd153120b387ed37e4c2d2b39ee7aee8eff9b4a4f5ba789ce7ae18c45df15bd127f39a82bbe2d3a52096f31c4ad71af902ca5292216b4d7872485bf28c1ad29694bec0f4330affc0f36a689a84f8b40c0f7ed6d0686870fc293787dad29196238c2a565b62491881983e459e9191910d43a4f06ff95448d2dbf2e3d36fe70b4f7ec30e89bcf1db04af9b3fbb151acbdb1d8147e2851225846f54585b58fbf91d875cb8562d5eadffe3daf7dd33dffbcca32e3c69b0587e4b202cffe96cbc794784aed0b8de21179e0fbb233eced471059e167737e7fbcfdbc485e595afea51cdd62778f48bf8cbbbd36a08615ee1a6d9c2ee964edf7b7e919bdb6ce8519aba49f0bcc2ee9193d4d60c85f659c52d9efc22f25afa1eacdb954f987ebdf98463a7c2c4f3ba9a84f85d1c1efcecc2310ac4d985e35b0993d3bb151ad33bb4c2f2bd3b62821067eac0b23b79758cb8bc4d5658c2b9471ee260124c82470d91c40871050f00f7521070f0766a87e5a1f905c79f2d2d0d98befcac102dee92b508bb102d38cf9fdf9d4721f136fc41e997855cc1f25d8892bbe44f2159e00f7965ac42cfc23fe8380eb6bf75a702c4f6eaacd0d87e91c6f6ee94c07b9c6d0cd72f3faef55dfefcf11ac3f3239afe3f3136215c636b1efb0dbd69f036eeaadec65dd5dbc0eeb3cafde93375dfcbed3bfab4fae6c7f266a289a4e10f7ff94148e10f79fd9af97157bc96049e7ffcfc3886730df727f6a4f087944598e6189424f0fc9fc76153fe45835b84a218d39c9e606b9e0c9570b4edc25bab1b05487fdb9c839dbd2bcf23e25ed33ece3b0bbf19bc20d10786d813dfb6e95a064f88fed4607058f6f1879e1039ac068719394c931f1f1ec123982435fbf688b401a219a8646a598a4335ca9843333390000034005316003038180e080524b2aa6af20114001179b2525e4c948aa328c95114848c3184104208010400600818438463039b800a8633fff4469cb02112bba7b18c6889720983c7847f223b9fa0c8e05b82de07071d25ccf677f412f1965aa818d4491dbc287da19482b109b0a6ee1f9984e00db19ce74b3d9a168fa6ea485682252495d29dd0dbd223fcfe7e96f2d297f6c51639505a73da552aa6b995b76f5751949906b5ac454006d2f0a35901f92005c4a22a21b958db58153d758a38548447420459157a234b34bc3c86970a262a4a44a8fe835c3accc41504cde1f8769e5be53f14a268e726ba2fc37129f22cca15cc173a186afef1908ff09ee0262b6e6ef8cd027f270ab50cefffec365b712098ff0a89dd72516d13da3d44e0b19ce4d71b5f069b80a06ca562909fc8ecd3306976f35444ccc32ff084054f5e04ee5135c25d3580150d04de271e15270695536ed00df8a051bd03821b5ef8ec63b2d0f17496427d9799f8feecaf0ce2ab300f10df58e96203ebda71c902d61a2b61cc9433be973f0bf658f3bec0366c79fbaf34b140ed1e42b29eeb28353c537326a83b6db7216d17ca438291e60f1bdaa41a71a43a807ad708a4a96813cb910c0234324ea62702d044e8412fd27edb3c1347431fa23b71940b02128c79cd05968172ec84427229f2409574359c3468a7273a58fe88953bbbb53aecac0d75bb1d8fcd8ab60f730cbba170612e09b1c71d89571ebc64a7884c59c8161d34c41d20d99ff5523722e068722461bc8a4610988c2103c7708faa59b4d821e14efab164ea248a5c58ea3a92e110bd89c68df5bbdca69ea2a0480a84ea4eb3e2c28de6bb457e82818697e0618727696e59f781831dba51f572b63488b5930a725acb7086a47029f909463814b038a913756edefe8c955d3c857c7d755bac9ea6272be3080bf970bfa5efc42130ac8f8e4be28819617ed4686eeda6b67d4d505d014ba3775e383f0a5324e08df6d96c6d454c863d31a1901982c2ad2c3f02512bf94ffb81b02bc62084f6a007fce6a3a79e51f83639ede732bffbc70fbb95ec2d409e7ec36d5fb607c227353f873ca7660fd652b2c04b6975a806f4f526e28aafdcf92f91ebf23a3baa2ebbd54900b0f170c399abf58d814679d71d7b5d1ef9fbabef86fa4c56951a4df4f3d8feb9933c2341225c61e865bdc2f20d0dcbb3facb10ed0e5850ba175d0e061839214e01bd04a5383df04a775b2c3f3ff7749e35b84919db2c0baff729d72d0e1c36164865d75081d2eae90bbd05bd4636ea8dbdb72e01f635ff9e59dca97445abcdce6842103cb0b32083aa9866e33e50ba4d9921273a2d17613ddcb2f78bfaa9682e888510aa701967a509f30749b2ecf16608a4d9db59d1592c54c2d25f7e6d076a76953a1ef347e1b7dbf3f73b8ad8352842ddda9041f9b5e94a8802d553bc62568fc68ae7a3276f1279565b4f2f8767e8f4f37d00ca8e27c7735db6c6082024e73e7027903b65457d791f697ab6600c366f74511a4b85b0d8b5a7d21bd41c151057d11f9205702982159e2e513d19a076f054d53792d5d0b8b139315bc4afd1dac03c9731971a22abc93ab5a4d314b65c10530e27ca1ceefcf793be863d480d617b506b9e292debf6ec1be6d87f9ed8999ae77e0a8a821a10f88d22a4346324376942b484b10ba9de14d1e3d7468235b74e089e4be7cd4cac038ff60190558201e13cee9d765b18569dde3d5c9a68c70f2bfc3802ea584546d5ca781c99926a12e5a3bb8293726f0b7c365ae1ba511515ea2656d04c043529cbbff9ed72183fb7abdf6a4c43dfcec55cd4bdb0692b5cb5853cecb78fa384c78d61e4c461320fd53047e7997a5681b8d5ba9c49d2093a6a656a13a0f2c2acab52b0ed1c2678373231ec0369eb9af014883062dfbbfbbffa0627860309337088060b465e25593980f1f63245db4d2dbafab0b26ab0200e7f4b7d813185acb8688fc62782b90036bf6bfa83598f76ea6a812a039a5917496731e5105a0c8a4e27298743c02757f31b929baf6d5961ae7222251b62ccb4e20ad5f62a90a351e2cf877f34029e42ab0aabe7918178a8c8364f4292bfcef84111020a1b2ae040594dea6ef73d83d618cbe23adf4424accfcf206468cd7faee4000884af6a4f82cb7199d4b8732e937846a4ce0b7cf3890fa26e7df5ef61aa2ddd943c1eefd0bc64728d0d612855f115a773ac4f46e2db3ca201eed4a6ed6758e9686a54c665b24bf7d3d0aaba98c5a3a14df6885735abb64506ff81f657d34ac1897f31f658d20f643fcfa1f70f68a8ea511df4bf8ca7dcf89347ca81561694bbccf53dad64847253a68b1660bed6a141754bb6fea99c75e95665721c3502fdcd72ee05eb3b0d88aab0e1092e2b2e9e27481492e39ffb7d5c882c88b6bf3d4241f417ad9b7cf46e09c8e4383100c4f16e3e64b6d25b1096b4e6d19bc6c8c660e19feb36595cd08cfdea2b7ce1868bedccc720d954ed6189a3e13f8c9bf644c20f96e706e5ff68423cad062a3af527cb0c8bea85ecfa0c6b4d0e864c6b3246fbf537ac68802d6e6f7d120035a1851c61cc7bdbf4cd88edef952799ebd24a4d05c7cf82beae23c9933acc09d67fd851ae6553309d46a160576c1174ae9351b8798854f2712983b80f75b1fc971dd8d50701eb2ced7f31262dabc006d6284e0a640d4cdf9d2f2f14b81ef7dc2e430838da441be003525f17d0b326bb844877e457fa0ac7479d52822ba84d1eed93181468e5a5a671e8620459c36dc4e7f26df061f55e800282e43970be4772046fa0963c0c7a6d80ae040a02bb891e765dac1ed7641a5b45202cfca6039317c099b6e542b823b1d1711ba8796f724995e1ce3521f0584ba3b5b194234af17cd4561df5c52b29b12f8a0374b356e71d7dcb974b051146697a438f2f531f3b80907ebf298f3312a04f6633dae17bccd8b4902da9d624a70888230f2947c48c7ae139c4d9295770b05a6b3efb6366f7d20af279d9fb84df379b5e4b3dde917fd6514bfcb570f4b47e56af5ba3e9d27896cf3a23e9d89774f1b7e89b61de876a106fdf3c936ed9b1c520c696cba71f98934360420ea32bd33e7e217590471a5d65975891a0443b83e2f310b0edf9d0aabacda842bb82b7756460b4d7ef8f035a2b21868d0e3bd4a66cfc6cc7e553b3b616b5d7fb48d7b80cad7a6767bfb40676fc7ce62545203b42225e2f93d7bf41414b7f0bf051549a92f946ef1d2b184d650289cd0673093ebef15cc088830f99553b9481f649bccbdd06953ff311f0159b7c845fb4e9a4c97a0e5de19a62f62e43b81636032ef22e7adbebb64798d1a5e5a921aca0ed9189350a01e8dec10a70630197bdeb8288f256ee9394093cbc2fe5604240434e82c85adf0d31e882d64be51770e82708a48d465dc4f792f63aa385280e53571b5e0ec57f1f9d8bf153337e1652dd7a11e4ce9412206650cb185058fb6efb53dd1c4c3b7e33940b0cb00782d36eaa25a7d4ee3035640b2d4ee07be3f88e4b126d2f8c8eb17c486851da2c9bc045906dade52a85614a2bfebdb0e7a181d2d374622f65d5cd396f85e6bb252500234dc5d5f50e93ee12da74a9c849e88e15bb81de159a60d20bba68cb8c30d1806955505d1557c08e162ba002707263cce400a1a879b6237f33339c05b565251ae712ba49c4cd0a1fa82a582e3919722c04a402236b9fad914b846beda7475325f9a6f14a6e218b709db346fd56e35766bd5876829dfe06ca938d3fd9d48313906ed0b4d1d36fe5e6e10d0e550323b98504f8763bb4c7799671c626272895b9e6611d4657b36acb88549ee1b5e9ce29420f82638528ffe4c378158fbb67bcffee197f1e4d3cce5b2d57470fb2856ef3e683d5bc446df6ffb905041af320e8a9acdc06b0b045ffab110bd9140bc8e356508e606d7f52bfab673edf130631e2a1b2c84b0eabb8970b66b533bfff4b44483e442e90147f3778361bc6704c9f6c3e8ba2932c466de7da05c6ad8b62b354d575d1f28e2e3817d2ad8284a6a87386c0aa37f5aec395a7a0c6a2a4a4b085a9800c204efe084aad04ba95773c587915f8b3e1c8d855c8dec7e16a75df04d3e42424417fb1390892892f1a3adff7ae09e0c7bb8938c98ff077f74ec63c9dd409050e58033e34019be50a9a035c2ff8447ea304d318aa23a7deda022e6283dfcbed6431b7849bb96d7aa62293043ebddb1df1116720dd3361b17c419247cb652f1e915443fc6be8932d642ee94881899139e128f6ebc1614311ad4e10cb524c224ce0ac23dd81a3b476e9f840bfdcd8c30a2993701b2548f50b9c504a7a629a322bb22b6c469e807fae416d7a6ca486a78b89f6067eb45a01e235da8191b53a72325e63b6c06c58ada2cd3d1cd5a1f03feced9f56cc4f6a9dfc540dcb031bad8f42d94b1817f2b99e74dfb2e0ab98d1cb5aa92bbaf35fac643979475f33a2a44303edd108e9070d643291f9e487472034f87dfd605f841afe6152c33f63c92aacc9592ba1682ed3a3fb3a0a80892e1d618271e60411910201456847e935165f320ee402423ce913091b8e2f8f9e4f77f498759973a426d671df83cfcff8d078e3f38a67e2bc691c57f56599802af9dbc6e70a1365e2be85cc61045a346239f050fd3cf15c010e5a0de10655c9fff039f56a6c8b881b49c489e2e08f24fd80823301b3c4b76d362b2520e66b838f19cd360ac6334919e456ba4d2de24dedb140f3cf367eb4b4941f9a0770c2a10f4d408e7475210de2d4e8d9a80748afe78b3b5f5163622eb45a0cb3d31531b4a0fbcab933b278eac661d5046a6ee06296a3f77fadb5fdfd647b1be9cae0eff5fcfc6876cde50ade9655edb34e626e01f8dbec4a4300148f7139738314c9f78c61ddef08a415c4beec71487b279808d8d04f118d824f5844e03988cceaac091528395ab7e88fa5cf2414e2e95affb4dc6b21bd8ecd3682da314b11ff9d62fcb0cf97f309d9b84cb0dd36bfabd24fb3ac5eff10fefda1f833b9a25564747d0deb94aa7282ad0296efbb52ca5bea7bf23e1fb1e8170c4a3e1fd4f60719c6b5b44cb0c1bf6374d159e3528014170874cb5884864d80bdd7616354afa9f6a3b7d9bb4c82b83af079e780aa45a4e56bd23248c08531e629f86c64b94b0a1b1c7176e1eb689fc2073805b1f8c45a8b7ec3f562c3d5ddf422f939fafa85c70c6152de4663692d7e4e3d0a8802a695ed9926470982615ad63b43913611b51ced522895669479bda82a1314a6c66290d4e887764cae247782b2fa9a04c86216ac5aab45b5b95e5798210e1128772d2f5065ef6780302b4a1828ef2fe8fa14197bf8e57c784790fc2db41509497feff9fcd949f459a09560380f7e90eb1e3b57cc6dbad2890b08fc4a40c1f23ffcff494361854d66e5648b8a69f6af222987df781981205e5c289a70c549df74f76efdf82b22549c06e7bc6c1904a79dcf4f411caac79e5c93c451a82226aed8440fb8272abfe9190a7cc48ed99f738a67319ce9e3da0cab966372ac6c02826f1cc67acbbda5d76278f5f1571638f6ee172d493ac996b2bcc11b6591cb6948228d2a989bf606ee7e6ffe49209fb752b8603f4c2a64128adffb6608b5f09b94722420fbb1a98116d4f254c93784ad71ccf398ba669851ba948430af0456da252358419d5674ee9b61487042ccd6e58adb58beee8368ba55d5efefe7fac675233878d337cabe0986c78a84e2e71e10760090af95b5fb8160aced8f345a47d7b94ee300bf62e3bfe92769c0d8adb2a48d18e2b51c7c164127dffffe3df979d8a292ff60f095fdc157c420797c857ba7ab3c5ed766528cf354a3bb10684bd08566ebb00f2212da607d8a704a68d820c9083f9c0c3cb1bf4065ac91cfb19ed9c74da4eb90c7ca395d5f7dc5f811b2d15e0d177a40f86b8f7eb621c0fe2002ec000736d80e542759b32dc1ada6687a60f1a50164435fd9c7a30d94696e36859ef54aff538e22fee6de883213b92605a128c614ae533f831687b5e75bec927f63dfcbb7e95c3570920e5c3e47e2515a4cae43181248570f0f9d3da5220254e8ea3f457579485cbb7ae5ede7a09c44596ad4456ae04002e7688e2bd6b6514046476982ec80728c5a5de7b6159d9175a1309c77d618f7be11b8728a019501c571909a496a0df1e268b2d8788821f5b80a93febd912a71530d6832193e4e0a09dd65b1e521748efd83c5128ded6d21d5a1ff3bfea6ca3bf4685cee29ee0f5fc183a39f0df78f71c401bb039b38a21ffcbbd506ea311c118156488d5e00a9f711805f11415999b88dc3e731f7aa3cb6dde35171b95e93bbae1e1160080ded4e0b76f174b6ee6826447a440ba31b79774bc2700ac930068c76d5f3d0090e19ece53c76023cbb8c976e63b0e1407044ecd76a0f666132c6b2cae15867e8392bb633df67c805d72acfb530d21af5668fa70e0ceb025e3743cedd844339c2f7d649aa37edae9c0cae71cd35938f2cc468a9ef09338afdfaa377ce7f64ac7d2bb310031446f7d9497f13a3596844fcee309adb4ff0c8a6527769797ef52b769d4aadce3b1da8ec676be77e41149e19f173ca9fecd8d306fe797d5b6aa93d8daec63f077861e13427d039cc3aa1b1f3c82307292c1b1930b719fe35535b316f4194606a877d95a78862596f8ac5e06c62b0a7ba2ce8c42c37b203422c8d90eaf98bd7ed0a2e8ea1108c4f05b0c4bdf9cb40a1ec40aa26273c40550da1671e825224ff4897b27f7919e92ed11299eda8710837162751c1f96ee03908d8e1509a8cb53b6fd5fd56c2b77fcf7e00a546867c0338945ccbf3d5508648fa7cd18446820d283ec768f03f57dbcb7c26a0e0d7ab2881022c6263fdbdea9e021b152ae6ba4aeb757ef1b60caa95ff9af37b9661ccd370d20485ae3a61a94e0ceb3ee04e8592374b8c90e221b4fd83417e0d87d0b90dbacf99224324e19a5b637a61d89f83808300119069116ad2e19c78d26c83205c2e06c17795ad453ee6d47955c9fb5253f3b46a5b07ddf8d1641ed5da6912c1f85c3bb23436c16645637b6b79841d85247ef80cc317b0f40550ee25950868d38efc17df52a01913f59587c84fa089c2b63447067806c3da0b9090c5bc33d0d8d1421aad66ecd9c706a2b809ee4193c6b71a3a384fbaaaf5f47c2c4f0a41b148dfbd3805c86b1a73425da8524a81a7b9a1dc322142d7cc6b7da25fa106b6de887170d85cf5b04b915b78dce04d02dd1950dd68e61055bbf5db1b5af1fabca8c8e00cc6dfcc120cdb970c50e12c1d73701f00f4d0dcf2a8cd91bd2889af3d4879d8caf497e485b2a6c44d8454d2cb02bc97880bbac71b099124999a23444658ad58eb6248c97e9c598faa5f10ea52b9300abc4ca06f5d21a1a586a45c516a0c585256c3a410a4db066666c444cfbb89bb26ff5123555490a7e47cebaf49a117f5e81f1a9b8c57209be03a788f451f52536c446f2aba792417bd1d8b74a3ea6d009b602bac73c2f01458f0da65440628acd0af53bc29f0e721dd04abe2426d0ce470ed2a42312b78cc486a8a0992ad3f59aa4fa165f40fc1a7151967dfe3144795b05514447f024e5127f11afd990ca4b1ad1429174a91d685889042acddd1020edd07dab346643594ca8d717cc27bc82fa8d018a6d04061067294def003ddd5350b25e93130c91b35a482bffc792195706d13676f8082f134b34eeeceb78db8bf31f77b68580b667f2c8d86d2fa62c59dfe9f6136667a11caebdea53b84a21f88494a26103b393ed394c520ef25712ddf82aa57b470976fabe3e629df2d53a259b8b4630edb37a22160095197f51655ca14d5e6d64d48539391d2be9fdfbccfd01104bf37ba949288d8254377cb43172c2f6389dc8768f231a37e8f4165cafa67cd0a2f3f5c08a3b370e73f302d0c10ca063ea46cc3970582bd5d2ea781120c1d20014c20c332a321e4d5151e3db8903a14a7233c62635cf6c0e02c0434164ab8ee26b4e627d369eef0bc4b3eb3f2ba91767e6be0a84bb70fcef720f5366f63df229b6331db067753126473e078ac9b1cc848786b24b0c21bd8d1ed2e8cb1bcf8795cd58be6c19441c8a41161d730aa2cb65d15ab1f5c9d57a8dcceebbc0f22560c8d87055c2166385d3e33f88a18022cfced79da7a60d939ca36a3870f1ee9d4a9cbb5212ae29feeab8cc0197404440b38c6eac85519de69016b5f1ad0ef1f4dad51522d3486d983812765a42aade8f859c953152da41df9141bbc4f7ae59281b4db14f24acff0b39235f5e8b8a55e8f3ac90b0c237b7b97bf1a2c419918da08f69c91a5e6973339d434b3b4f3ece1d9dabd8931644a9277ced48658b04e1eb11b984e7b6d5f734932208561c9069e90ca0e615ef82d9dc12f7aa0c16fc7e9512d1a86a772a08454bee0066c7eca3e7c90ce619cce1be8038faacaf434b752532bb0ca45141ebe9fcdc72a48ca6485680467a4213ddb7f756d47953230291d678bb71f0c18ef01b71130d0a71e8161ab80f247d529371db418f3c1727f557d4e1269741a0e6a1f7317102eb5c9270bc20fc0cec4550006b1c13892b203e62557a361e198717f02541b35e532cb364c7d8940d20abbce6d03fce80e1c28bf0ade4dbc5763834a927bb6a424e002b2f9e014b401dec941a07afc43bf9cd25c4933f1572787eab436485c8a8da581f513262666a6354f5c2f3f044e419dd3ad031df63b8aeb154ee008b69d8f101bac28ef4181b7ff60a404d2bdc9be14446daf489d197eb6b341c2723c77c668f0864ed0fdc337b77761d8a7a5da6c5b3cf4af779379e704c08373f66b7188b381a28b4db9e96ea4d5dcecf0f8d4a64fa60eaf33445051d183f7d203326cb1eb01920dd68b1fc45a59c574d87b9f08b8c59a54467d9beee232027cb1b2dc34fb6648d47eb05552d26f7326e338c8d9a6ebd6eca51c9e1ea1c9c15c6e02a91d89dc7425975d20b5c592753efe1b9efb31cb6e840723e2f8ecad092353292bd57e107c3147da1e47810204ee1b9138b04112de9711a7310548000629dc0c58e68417c193359a0cf0f06fa0d17a317a52a4a5a4ec7b5945cecb8e337f8056140a5993928eca2efa063520be19888e7eea349218e33c05e71346894bb087d0595e2618120d63bc2002cc5954818e5d9632b9dc13345d15f336ba6ddb9d0b2de6f51a482b5c365d80223f957e7aa6420458f504ec77ca3a223223bea6d96420c374fe4d1312c636fb3e638b084661171c45b01d566c99579922ca319b9494aaacba9017160cb878d868b7a3f99d38ca5c1869c6c64347aa1b5a0a06e7c3bb4e932bdd0df529d61144f61f80667853c62cbadc6c4da073c7ebdd9b29733a2b6cd838d3ba4080be80126170253c5050e336ac9a8ad10d74d9d7f86321538c9f6a30bf5ae9500964c54612919f04e9979ae6520f961a4f6d8fde0e677f4998e9dee44f94441915c56d942c5037110a5678456b575b26aefd36975b5277a958cc2f425acafd650a663093e1077623d9ad3a4664f73c26191cb5def7edbbd4eb6701721a51f299088774e70a91301e70066de0f80983cb6ea865284e6bec2e65d68b271ef09fc7fa317962ba68266a9def9876b85865fbd4bdbcc75960b41fb091ccb8e98750b545de3786ea2bdd46dee9847df67272817a25760bad9ac75d08c816cc7e2110102a04edc67b2aa5d695cb616bfd31f9818775173b2f4ce3717dff84c486ba32d4ac8d7b370a86ee7d1207a661c5cc097897e7f71f2428d7bdfd5cf26ca57b4fb1ed52362c44c7cfaf57d643154f8cccb8124a4d974208dfafe70f0ec6cd1b3c003e361019a651de2180636b74c31004b700990841c3e72492c8d83e9786d763cf455ce6092272119ab98d7c7881253e68d77a1e6a3ce8aefa4652f5fb6de6e530b1a9b69e6f320805444e7c6885158828d2919e2fb14a5e99bf54501c548579129e5746eaf9f9f52e8c29fcc912f6e3482c004280e77eb5c4c04d99b4829fa8b3080772150f91556d815daf58068b78b4af1d78e6b9a8f19f55cb022eeef016d0c7df2038fda1b7c059ecc6b7d6514fa967e546218731481ebedd5c58d76a33018f16b8193fe6aabfc2634e3401fd85a5e3bbc2ac7b2c38bee2100749a13babb11ba999f4095c361caf4a0d7e9af829059e0c418e8865db30f957c674af04875664319f5479d5f2164cd73434dc44b6c4902c54a88d962b187c0a4026756307f6d644e2882b6afe25729ae3bbb23fd2d2e1830f22f34540409a20b4a11f344f9adc7bbb22fc2475536f5be2f640eca3d01132bf8930c856abeb40f323ddc8ad0081230908fae7718a3750c3f05be05be56aa8b05a4e05d8432c2d454dde0e82d267801371ab42b2d38f56c801cf580c60b2646cce9123e5d2cc558533aac8eeb3ba4a2d9a338a4c92314b52ff92e56a8e9459f004b20bc49aeffa612e1653b8366609167994c866644300f094718a4e92ecda647a34f1f274a0084b33f6a67eea0fba32bc6c6a1d0da56c85d45b0075bb6d9959b57df62a667f0e915909a086168baa9e8e7b221e70f2f70812461531d203929e2ef06a751357099ac460482ab07e052506ae67d7537c75433197c19a0cb4f685eeb1c67d9774fad1d532502610aee0aebdbbbaa5e6e5dcbc9ce0f65329d7ba51075e82804cc03b57aba04d7107a67373bef46e974f0e86eb771473238b2422997a9eda3184ac4e7d7772910e9cbb5c9661cdf20fe478786b492d86b8d18097dc236a70beb3cb0120c9b5b7425be8dd958861ff9083824a4ab0fd2ba1fd8bf464c7a61f4c254c9a6cbd9225f6b59c0362ebfee9878b2c1b89324004a57dd68ca0ea6ae6a33c8e5602c1182f5d602e203395ee60c186e38391c3be5459ac0322a083ab8f5f265021b6a0265060164aec1a484f8bf2d55f794aa0796386027b6433fe0b1c6b7b960be8ba4504ab0fe57e7a240c05f0e2fdc98f3038e7943e59484de333887290ed6daad0ff062dc261bb90a9dcd16450ae902715ac3f3379de529735bc20d903b7b85ad15eaeb74ff9c15b1f026a07b53d95f34238204a73493c9de1130e47b80a9ab1314fd13f701f1094cfee038eb9f9630f441aa0c9d55028a12bd8e2253e0634b510ac2031faa190e6aaa4af991ba40f942cc90bb938801d64f71e20a33e1f4a2f7fe899ccec1803e83f4489ae3bf3464ee1bd7ec37ef735eac1d07fce9bea11020e03643aaf8a4e13f7f7a307d577a44a5257ec1d12b337047285e7ce803b45d32840f8a571304bd31733ae74642af71e3bce1c7efcb42acad1c22b20727b8541a99b90f6e2b5a25485483e3261a08c1da1cf4913a4b5fbede2cc0ddbcdd2edbcecd667625cd6f14a539313defe3165ca6a088a7098cdb2ac8b0974489a0948b76973663ef85359ed65c8cc1015281fd7186c370b919a2be6351b19bc00766ddcdc87ec6db23aca7a3344640bf4ce44a2ee3c0478b30d3c6e0a59c71bc313598b31fda2d39e303f669ae57d9380367ea2b0d8664573b45c2455194598427d8c144d8dff15b40bb3d684401a8036867e0bc4a2a5e89a29736d1edc791f0083de1cfa03bf0a0e2cbfd84497cd40df1a64cabc840f00bd7e3f5f5a01a5d1d64a012544062f12f89f1a130325029a17e8dfb8c5a6451e97190f803d735765b1ab7072fce7cbfbc62c37a4dafb5a6e3e3844b2c2c186039b4c66a8e18858eb2a38f0a9a2f6f383a950e749a6da415a1eb10e83e0cc1af9efd5001daa3f859e05c32781def749982e18631858c1e845cf8de6c43f3f7128ea510d149e92d3088122cf9e897da8c46b6b1856278930558297b5e213d0510b731d25294457208ee3b98eaf224ff6fa242b3a338f9beb5031eb150d191d0c16fb7064e133c4125cbfa5fa9e10ed42018b4d49810579aad5a7d678613943b5c64dd54da1a9cc54016077159bb9cbcb81a2802aa1ef0eb5a05551c7360daf51f5bfc40919e2b7f2501b89a3a92f9b219ef53fc35b75040ab4ff6eb88a6b83baef6c11730438658d05318a81811a96ac324608bd23c07d92578281fe0938268f9f7c219423f4336883d528c511965e0e162f75045730d1507f0c4ed0624a4818e9943d53792dea0fdeae805957b4de45d511c0b630dad14d39e319389ae8fa807a450a2cfb0594a868236dff5c57d50394874ced3523327074fd105ba4d3d41fa1ca28989dfa73e4c42893503c37283aa7345fd3be29f35b5ddd2d5411a998684184650d2e976a4db40099ea53bad423fa5bfbd96e0459a57367cef5a3c26a70e6e00f2114e9944787f6e688ce46d5fac0b51b35c28eafa722a08fe618a7828663d430391c386e66ac92830418d8542e54e89d62cb5b9d38a33fd07225e233e4038266a4452559980a702a241e674e433770818940a77836eb2aa35df7447dee2e2a456ac82674065d7207eb50dffa23c549940da1b2bef74c196e5cd3d696a2fe6951d824e69386c0904b9755803ad3c0a9d71688b27edd12236e92d9f58291431600b5a96ec58a064811e76fc81c8bbcd71ad9b26fea607abd7cd44accb4cc9689a84216354df9ec9a255f3aef8f2047aa3d37df42bee02e043675056ccf5854f09697da6fba3d581cf4a10346fb4611a7a92b18a761ccd51bccc338b544de02dee76cd7a443c34f7d9bd7774172ad8e5271755cbe88d0fa6cf196de06d42a9f18fc086924856ae8c5072763001e4e21f6245bb9196fa23200e20ba106d544842a26c6c3ea9af7bd895cb611d8c92d3975d10c39bebd093089728bb0e48de6334132c37a83227e2e0cba7b2f6d2e2a5bdbe652942a11d181cea5c21b06d0208ab3e7aa356f625b498851588093e252b8884ace894e048be21870c9d24af21cea1155f26b27d60be8e5c12db8b6a59a2d8d4390691af42c2bec341d2afd081299b6d9fb73b2d3a976906124339ea950f4e9e41dff8e469263b27990ad9c247a6a70c720b07fc037a0a62ad642f562c48914ffbdb94ca6ad409cf795eba607a51156082d79267922c11881b9552d15ee30503d4c48673e1e8b98e1ad06adf6e28f1a4a70dbd44ab6f02d8e115fd1b442d725b8db08163f75b21eb4f103bcb96050eb5cedf7977bba3d35bdb3095f870c64985a6cd0f63df567610914b7b19ef625a6a7d919632092e23e2c64f6e4e2c9e24ef25b72124a47a6675b353762d34ebbc0c9381bf75628690250d3a4189b258a4efcb1750bb6f7a5c74626ea8b035e87a57fc757c4a90aee841606c2235972dfafec93f348a1f462bc8311f525b85639739f97d455739051a8769df433022016484cdc0445a2451017eebfdb2a8c197f485e72270755320b71cf10fa2277f7629e5f1b72db735168699890e210c558fb07a342fbae09b65f820d340a6472729679678d1e13982d3e603fa97bea183fe1339728fb7e6d9f21ee6a01a5c8b296dd8e6fe6d2bec3419a21df90196a8a9a5052ae594cfe156a06ae52bf0060569cb3380d4c71eb7c65bf83648d054d6c6cbbc6b50ca3e178aab633a4653746a868b1b9178008dcfb0344f18ab1d7e63205a03d525aef820c700641dbb3009e100eb386ade95834962d938901295785a4af3c95a2bf16840cca84f54642719b4b23463407922e3b05a302c3b5373e11e8d14a6c762a6a8d90c5d7a52d495f7fda1d6dcabafeef0f88cefc6fc51e8d96dc14d09549ca53728013ed058d88ba56e2dc9790cb4a256982b9a52d2a04dac22376e9422365a2bcf6b77f91244e92aecf58386ac4e823642fb31c91adbb79561fd6cee60a5c6a1130ceb62e6d5ad611ee6a169386da93458d00b64e22d4637308527af4ec82d7f1b4115c82ed32315e99ae409e39a0a16e8f3d9ee608f8bc7136eea94e86067e8f7cc49244948db8381e36b2c68c5898c18e6a5c3f529541c3963071deb19dc3aee04e213749e7a7145d770b66eabe54133302b502bf64f411c42c9c9f848bbb93b0f0849ade1b5c1d2cad3643d54328acc77bd0addf4c133d566ef829e58be06115e0efc18edd21bfcb0b12eb6390648ab7e4c1e08297a21fcb352c99405c89bd18d3b2f857237808c1128115af6ab7ec5e32af85e8162aa70a572f09a01003c121b6e96d4893dc1d5745dd3eff84b23a50a872ab51fcd48713676361c227ad4a31e41105e8579605a016526ed4f12f265d3653e5eb2027aa85124072cd8a0acd01401a48112aecb305c62c5be6fa97c535a78b95e46d44011b723b08fda34292b75286416a918c7163cc5c3bda8d4bf7370b8067f266e5569ca4b065b2c99851060e80b91f18762897748a17075816eff00de761d1c26f8e2d32fb0b294885a47164b2986c8f2a919de41d110987468f543e7052606b3280090d0736ae857facab96674eda3f13d2382ee279a792cc868253c0c90c84245ff8c4d468b72b6656066e5e2f2fd2f49ab32a0fba95b2197fa05a0070b686201fadbef8fb3ab8d4684498a32a5284cd752cef61c0f011969c451d36175fa420cb8e52dbce24d143fa6865e992970b63c0174b05d1460571105a22272898f0c089c52510c3891dfc40f68b8d881189f2b7613054444f3db1aa537b8b3a7b220eb7c750ebb19c19e08344fb8648c3a57accc9af689c9fa3878e1386119b81872c3ce9dd1e1dd22e618ab479c8768774d2c44bdd2eca43c7ea0046e6d3415632f51742a974c093f34a35d2046ccb170a6214c0c95e2328c120da8134488eca20c67f1ab28f5fde74852da2c2b8d0a247bee1356917bba66acedd6cf5a852045c87c96592044c86063f923c9cee41ae43696d8365f833bc17a0049803c2ac6d1e1533083377a21a2ffb81da5b356a4dcc8333297e3386fca65c90b365f503d484566d3e1d809be15d5e96cb0c38df8a863e5fcb541663090343561c4b3c977edf5a9fc579e6042ee75c2c60e0d495dd656d4c415c155fd6c4d868c448fca9dd3c9db4d64d4470ab9c54b1e53f8ceb9096ea04a8706fe94675911cb5e698a0b2df0f08cae791b53f7b6bdc78882dfdb28bc563aa9d690e245a54fe7cd6a7021b0795d22d67e3a7599d9d945950591318eaaed440cdac3a7e3850359358d6582d46fa4582c8ac6938e4ec0f6f21cb2e43be1179ad729163267c633203fdfd1e4200128cc8403ebc0b03a756f270548e88ea893dcdc23b25817b646a3ed0312ef497c37511b56dfc314fa8de95e90685a1e8ac2b2609694187d4664e711c2de6719c15b8ee64e53ee1fd366151dc6d4f728d12a9ca38325e5296dc828db4759610cf5d74abd0b24209abbc5be88f90ce450719ae2fe92c30e35e28d38c1f001405025cbfac6dfa44ccc7a1a8bd1c9714d8a748ec65e3ba60679c59051c7cc9e15e2e044aa5250a040faddcec45105a6ed0509c211fde6f746eafaafbf1f2db046b98160132d10af77fceeeea1282d32bd49ac3878e6023956ad4a9354e0104291a34a014ab919d708dcf24f18f715600a53294b2a271cf4d4f2c3969f30cc80562c859113d83638300bbc21b686e582501c158b482981bb148045729badc8179838f43b0dedc3e89e3839faf1d895215d240d0c4fb0371ec17d220ff7cf21f0e463042723e929a5b785987f51cf559445622eb59c40521f4b8d7d9fe0441f9cbb3228adfa6d5994be466d53e50a041283e204c1f900b782526b0edeb83c07f932659e4ff011b189c401d3e16a9de9809cbfc80f46cc60b08a22425976f003fcb2bf27581fb91f00e827d472104230e99630e1353220abeb3344b7659ca3882931a8cd715fc3b827d201af53596b8b0316e1243ee4e661067b5922706338ae231674880f7852bca167f473dc4df0bb7cffacb32cab4631cca535ab5c33fddf7d0eacd25690628074a63d8b13de6f95c378d00104304c27c95447c1ba68e51e1218be0125ca33b841cc0472cfd8c33118fe26e295814e65d3cf8fe284c7088ffda0568fe8507510f426e34439729eb5783827813229420104051bff2411e9973e3e383f92d6efc726ff16b3e2f859450994d361252439e3416c4856c8ef6d15b0cb652a02c05edd9993aa39fb7220f6c8534967e3f4abd3f803bc371b7cdaf4c9ed22ca5b67753bb6855a321e251b55e136afb5e8837453a738e25a5ae437bf19a25281c2b1dba55768e5d20ce96f6b9e4234d20a87969588156f61868e24e143b9326c199a73fb75629b29f93c0b9798f8a1160790a322778723aa24b83273ca8988141e2b26dad560ed59db88424366d9e8424fc04f8fca0caa44ce5d5e1841f30f1ce3840c454524fa48eab769da6d9e125aa7a5663e6a5cc7256e1f88ab09b321c202c52fd3cd6abf64e0151b3d2ce5095683c8867feedbe21c8462c419cf04982eb24ec379df46dfc6542067ab208e3c0d7926ef283d6437017d860cae421bb5841b114526f368dbbbfcdcd094189c670a105e56d52dc9c47e76ab697612ec2ad9082b1263d7dd0b56b206c00dee7aefc0a7610d091c06a34a93f323374467aac15526e0c6c007f47add3ca1c38c46b2eab23deeca15171e4fc2f73d2fa21f98ddd3659b5ea2a60453a48dcb4c497268bfd012dabd00330657bea37ac5e10770d26201e26c788146108c8ed6bc3b90f94266929f6f775f8c0fa6ab82d901332421a4274b81150a8b8728ad7c75ef421a1886bc8c5cfddf6440696b4a0442286fe6e1c7e84dcb107c5206b8614fa264e011bb6e572e4cdff6bd8544e7121d2484bb806124fc9543e5c8fd77f00084decf21a9d3bd13fa5a42455e74e6fe5c2bdc7d9ab61b4acea6dd885e31c51a6f9d0ad363d74c88d9f056570cd6f30ea70d7787551029ce1dde8fca9c1a8b1cc3c4e3a84d23f23103fc4201bedd68775b40ea522b4730b119ca786a571808ce60b69ccf5d89332247660ac9650d7dee483c1d13e5c40052c1d5a30c86b8b7939ca12c6d887627c6062e83640dcb4fd0593343502d26104691474b9caf8e00dd5e4544803ebc6d6bd01fdca27389483cf97b5b2ec2ea552657903a578144177687b3761a4a21e9fe89268160d0466a168058aca24d49e16997e5ff6edddd72851c8cc698004b739a130a42ddc0985c6513a1d4303f8e488f534086d223d2443b9c2861ecfe2543c3a1a059bf52180d53a5ab5bdacb9fcf8464f0bc38e6cdccf9c1f25a80de669ceffc260e2ffc22e225f4389a5de085ddbb888f7a1a17244b62c32474d04e545b05702f028d254f44817d0f47de0596baa6db4f995af179aa90d601dd571a1111f6afac42fca8bd93a303085f73d9335f90cd988796702e9c10f3ba4916eb80114041b45a0eaf6957c0efe2a2373c9bcb87d1f9935827299f85fc6843782c4999941ccaa08b70bd3bc939d49fa306d406acf753911ab3e1ae3057a984b19e807f8e261e0afd9f6e7b8527fe8d30c19d0dd85a4fb0f8537620805e2f3ee4c61dea3f6cd58f52f99b2e28e3d8cea610c90a019adb847bfad4f6e933bdc3769cfec627d8e60c8e415b22d1500daacbbc8b007c41600e6f5b2e648cbaad9073589185c42b76dd739cd420198380c856d00305700e30cb10db99c17afe5e452c03dfe27e7cab2fe0f0ae5cedf11a663c69b486325503d631f21a720f4f25ed7c00b0f28179cb8361fcaebd12680b32a29cc191b0b4274b5815a711deeba0e0697ec1074684d87edce403871ae5a0e9df1013711a1bbce6910917901cf2b3d674e8427f477a9f446028878d026da5d812d78ce851951455aea96bbc581e18b69524ea4ae391da385c22b74d8d4eaf16c569365482907fa9388e5b2550e46ab17e8b6794f9b0978c56d51d77f27885294ccdb7da0f0aae27463e38552c9226a3344d5a0d4dde860aadfd38e4a54423c8a467e7c90953e96ce7de969cb32fdba4b251aeb0fc39f5012d50076ac527db2a9a5a804308e9f94071a06652573d0930d08d5fba0fc597ab6f4133a0e92461c0601186b27e300d4bf4897deda915e85edae1035ff8127e210540e2d11d5d6e1a66d1cef6a95b17281ac71bbc3d45b227bd1ea5515dfdcf43c61d36cb42ec686177ebb61129230c9a49814d35e04530808850dc5be1f39501d7c31551c0c98f2db5affe2ce07b84634a99c5f00f33d4f6f47db05802276fefa8d80625523fce3be2ddc6eb2c207dc1e0580c54bc475c952dc7d4f45fd6255ec878e3825055464c5d5f542bb1bd46db9a99aecba7f4bfa289375f74e4e41e6167c4ee04b4ba6c9d3b0b50bb6abae4311044fe88a5514a7334e8f1b94bf18ce0abcf1eda78ba7669bdb9b1ea1690629c164cd0b3f6b1c9faf4726df5c9a7f8ab7e2b46ce1e264e4bee05a0d6c76c4979d328c97262d7df052e06eddc373f48eb3c94e3ea7d5f55cb4c6794ec5762acdfb6d3c981893335b147b18783f1fa2d0728a6cbac0a55b15eb189d50eab223e0ba3ffec60f0ea296483cdf8f03dad3eb1ef28d69bd14d939d02ce9d36e324f8d396be870b13b349644f1c05e9affebd40aa656a18d17b8359697dc4c79c432b2b862261b743701551ed88c5a37f91bb82e5494bc2d5aae14fb6186085dd206a0d1ed3ef6a0c7956dabd7006d293b5f2097b72611458d956022a163170c34196cb253985586332c91cb10933289db00269a9606b71d4f5cb2be3de048779b83a6d32c0c0b11d202d25066a285215d59d92c90e40d0f19448fa50a143a3f006a28c89931aeaa637bb43c6524b2b854e92d0fd51f3915c5dc41ff5c84b777615ceacec8a8d6bfd9416698714dc4824a3dce93db181637f34faccf3464e91275e045fdfc23f17d8ca845d3a605f33684afe2bdfe62cd0a8f98e84a3fe3e1b067695f6a042e19753af1a89c1b8e2866b87be775fb87c5b5a1191c3b04de32f4f23ec33730058e259eca350c3e45c5186f8a23641bf08d65c2106f3a2c2d926f99f7326cef97aa29d43dc70036a28d44ec7e74fb2c41c498f041acf52546ccb4b67d7403a430c9b07b399ff314c106ff4a90629fa4bc59612f1e2e837e0fe465f2ef61cb75751df5dbf812640c945f953e862f5c44a167f6c287e0b4f5e87c0b2482a57ab141ac9dc925bb96e1032a4559b96ea217a904c6f71c57c5867b77c65dc898db2d4980a3fb10bfc515aca7728bbde27900f819985fe34476c141da5e28781e5ca07da77e0fe40521fbb658b2dc0be222c59bac7cc6ab669845c01e3818979f1d5d58871f6bd9af6c0338bb6f256131549a7bdf0888047624ae948159f78604526cefe093b98a4db4de044f580511bebdb89579dbe49f88a55e1137a1ae680adfea2b7a5941743df7159f89f64c926bfc38912bd00494c4f9e9fbbb64af38dc260efa0529199dd0748774944f9a4cde52a61325e4a76565f11293aaeb0fcd78dd0a85fcc5bc649914183bb77d2d7812cc33c0444fd598a49cc7393d55b211934c1b775301d360a6177770932e2cce529a33490cb0874d83743830f899493a1add68edc654de0ca0326cdb0e92457f84471588b6ac07af09128aa300ddd02793007e0e1b2cfc5b041403a104e38ea327809811deb89a087a15ec8f28303ad6a837d7684df5ce9a0c99d88e5bcb0a4b076a92eaff44453e9821e2479c0d1ea44d1a4e6aca78991ce1db06276a86958c7d74875e082de81ec64212dca90df24794a2086b17353ef40f442ad1779d117a6c97c01e3542e32f0edc2864c6874f886afed1c19953e167b90a5f99bba7b5ef9817b641ea2f17e5726a6c4a588704fb48eafebe6590f2da24c5659bc9789df17bd99402316ed35b389cb64f26fb4b99c9ee6612aaa09d7d2c9a17795411076e35910707e0578dbe47ac086a803c123523ab0d61cb48a5c6f9219bf2496abf4f259662341ba72ce84eb955d670d55a6c583eae5ef947578112e23cf125e12b5e4d9ff62454faa27d8efdc93ac33bfbe8dc9a7a0da102e2fec79fdc53ee918dae56a9706506b5605f6e2a695bf6ef7989d3de94cd9fcb54c9597dfdbcbd652596bd9383146994f0dc685e1943ff89fbf2e84b36caaa42a56337ce3366aef26969e9c4d57859dc6f776af984feb503055532479a3c5965ea5f98a871a14f8b434155de025815fce907af4990ebf8a7947f012b6b5bf9f26ab8522bc4512e940a93ee405a21b3fe426f0ecddea96dabd2a24e5724c29eb5d8a6778f3e28008f08f9f30c995e2df14121599faec216b2ea8186a6e590046ee929519ff715a044dada1dcaa11e0d64cfdbde1ee7043f9ef0e31155e5f9943da319ece37ec4ea8f5a6aa257df035ae571ccb846ab7c3da5cc83db384df0db2c52c42872ad01cf8a341cde0a85fe84df1e2447940012b0aaaba045fba7f7b43f1ba6f991c47f2dbad4efc4aad980086871db16527d3527f999c40c03a4201c7501121917b19ce419f84e4464083eca618007626e07938ada6a54121cb5ce8e6a7c4495db2fa13636ae84ea0ffc66cd674c56a921a8157e9880e8a112b8e2463931b0b6fd8bcb7c4ce5c41630ea60661346a1a4f5b77ba7c5a78ba216f2658f366917a29938e3f912f6f19d52f83cac79d5c08c6e11781635ec2e10966d34bc091c6a28eb98a30aa1aeec99e7da40a98fc00d7dd23193c5e0d1b38437291563442ac43a4797b1be5e06493da831f59ff81cb643b88ae5c2a543f1f38a1e16be90130d67e81668456b5011f41070fc476c31cd02e1259c6617576e06cd9a4ca27a3331b885dbc6a60106694646583a1a872ab51b2d4b1c1e34b4e712c5420692651e1f523d34643867e4be56059b238bdcd20e21c0871d67af2554bb1eb50fa9805bb4e8c27abc2c48c6a4ba12204c45d394d0616abfd291c94682dcea560daa8347c1802b2c47e884b5fc6c1638f68b76a3e1dfb2b2ec5ba4ab319289d1ad92bbd2f48baf8ef609b8398659857c31128a4819c5aa66f448064e75ced79084f72f0e6cf1fedfc0d9b230e2130e6af7ea6e7f20aaa61091ea7bdc4d13ff9d07a94f0fa86e8b2c12af7b772dd182b25bb26f409d6d8ffcc34d3533e035c0ddcd649fe2e96d56c1db1a028de26e1aedc384833ddb7ce6e8e6acacf8b081d436a68cf6be761d31b11550e10d57cd9346299eba58c7393f82179d40619d9017c32749bc6169a6be2c96679c9df0a3dfe7b0b860ce749f80ba094a72824a84309e99fae29b11562114b13235ed32fb9f4ef189ec5406e26ae08a8be363eb464d3aee5b25428a887ce36f014230213cd8799dadc63b81dfc214e6edd830c425d427d393662c09976746b2981c265d0a16a84ddc28c4ba3b7b308ed440e39ccd29b92db94833fe4bacb3cf8f124fcb56defa4e8ec0689b255abe8685b424b11c57b52887ef8a75ad312bd399d640fbcf18a6b2b734cb30137a0497beada06c0620cda06729060ab15c90d600fa0243a33e418f5c77f1e9b73cbd73798463cdac7399b27bfeb1ea9347b979dde900e3a1d0bde76e6ff58bd0ee093b41bee6b9f3cbe478693d8568db14699622d9a52d395435b6da18d95bc520dd154d4f6cbc3c2934bbff7efa5152c41009f45962b88a9d6a93cb4271f94826ca03bc7fb5e11d6653cb20b3fed44de84606657356f0f89a8b2befbf4e20b34f2581006c07ce0a75bb794e07ca99638a390c897b33a82678feeb88af5eb7409ad1accc594d4f91b315456e217e9d9c54c8a385c6baa22df614da9de1c7c1535fc48a70c47263d5bc388fec29e4b51b3805dc2a09c031c51884be2afba06386ef4130fd9fcfa88bd8d86e5008bfb8ea2d4a26a2559041f988465dfe14d020e04a123223ba232f85760d2308eebf04346b411119b6e64124a64ddc0645cd8acd6b99d70c09587b2d445873256ac92ca3eb5434d8eb8fd0bfefff72919f9aea6b869b9ef9f16b8a991c5b60af64667df7976eeedf0fb57d1abf4cbed64cfbfe3c2f78c1549c909349fd83b9b06d19b46429040d2ffcfd260c559716adcdf7b9c4c2fa777e4e0b18484c417e611e482eca2b32349e7a4092e037a84ba1b2557f5d29515ecfe8036386aa4c0c5048c5c7b9d36d79598b98441a8cbcab320a3286cfbe7707f80fd6783a25294a43151054d387df22aa89a4a9c075b90fea908750e3503450dd123fc69a4fc1a5c4a880e9bface41267c88cff61a0e3dbace4126728e31f3b04747978b4f01f0cdd978b6bf489f1ec58fce26f497c97c9436b25c2108a2c4da12cfe4634c7d60a8ca1165b244de5f1aba902e8af5249a9086fcf4d1eca2f27d5300e12c9083ad7b62029d237090d0994e8dc1098726b80cb72a8fb114b8cfbac298380d63a41ef9e40356262f3df97cd0337bed56a2e71868cf7ca98f0bed4fe4aea065bf2734dfea85a9eba435c20465c638f1114bdd00bac93d543f929db09a24bb954a86fab7260451b69659f04025009f8b022d220ea07b09e24a37d14f616a9a4f12a1c5049c2fb5cfccf4f212cb6491c41c4859b010127c0380a165b0308df13421ac4f200230c7c04d7050ea830a1287597eee14ee8bd59d95a2f0f97efad560c6cd2a26661efcdf9a1e28f8a5894a07e92608821c7e7496f05ca14e06c7c843261b23c732314e20e79f98842ed3bded9b419ed381bf8c4b976f3842c48fe75b6142ba8c5c0fce33d3b428b18660b1ff828af4cc288605d7986e68d15134fe85eeabc4c3d09be579e0eed24beef8f8602168fe35f53d104f13558758cc17782425ccec7f8e7e9dec73210274ff4b7a888c348fdc5e107e4bf415b70f1e54d3e6d4e1c0dc8bb6f6dc6923ef3c40e2efd694e46bd75899a7e42873cb04b4c7cffffa9d090f3c9d7b118fdf3f61df569dd93ec4cd00238bed1855278ea154acfbd96f8776803399e4d1b1088c6a7d023500e58fceab1261fc34665effa240046bca4e77d9116445e161b2b8e007a9ed1455d5e51e7fc0c35496ccf1575d2587e837b3622f3a7c7f0ff674aa3e5c54d969bb3253a03f1c33a9b0b3b95f6a8c02559810ac394c4b0dc5f1dcdc5c9a7b2b5f3e57b432258e5b50d4f4c465676b3e7a151b8119fbfdf76b3068830d027b1b530bcb247b2f8f4a206e14bfb54a9c3e28b992a3c50c419f245723975c39f5011bf460965317bdacfa28966a3c4ace9e1f3820782114a7b5e9ea202e56fc55685cbb7acce3960081ac7c35414989a18b148bdadfca98f8b1f986a3c95675c549a17d5cc2252c0324444629334aa05e80f5c4ee641ebf95b814eb1460c500c34682d4ad279c1cec1f80fc5f94e91a45824729557519049ec21cf9c014fcfada74a843b637b38bfbd05a16b221af969f10724eea4844c6c246d33c089c3570905c99b9e7e93299ccaae4ccb9e53a94e238c813e20903acac47a6a097e36d67b18a5be85212c446d2edfe2662d80490c63c0f070cdaa752ea0b3285015fb245e04be38146f2720f506e3b0419f37a213490fd325b9b1fe81d2c7edb9e076ded7f6243415ecb10bd9d5fe5dfd3c956feb6b74b9e1f5e8802b0a08ac012a1ed241a72bec9b8ae2f6298b592adcc002c11436f2c56bc102985a07988859706b90ca5b6342511f8fcb296ec54e1907c8ff3b6b8c1981e39902ea520d9b9aa07edc428f13a3380ca7afa609fdae2b4a14dc760a49a68c2bfc965d156dd65727dad6826d72de8eeb486884296af63ec0925150fbe0cdc95e2162e5218c057a8fa5408c12313f66e292593f7cfff7866e7ead98bd2909eb2364de462be74b6c830bff4021c3f80aea93eb00438d033f969d5aba51432b13023e188a98fb2a519911c15f0e192ecad3882f8bc06217e3957d191b0e1b4eb578b9ae4453dbc7001d95c4244dc249e4ee5dde30ab2e1a0abf4492bf0868f1eaa8426aedc52902fdd9252d576a88a0fbed37efe23d3f23735ff61fcb9dbf3956efa443af262d8abafd5032780fed2fbfbd6c9eea8dd470d9ddf1e7b3bf6bbe0a646dbb7342d264a5332e05e56d61db969b12fed1431cb50afc68cad171485cec25c4cd84116c3cfc3ba7f9752e3f9850fb86d0333a16c54ce8a8ae2d4d08daac026787fedf473f431c2f3f476b83759b5c54141970416cb9728a9283387db216e390b3427c26e25351c13304f41adee1bf7d7f9a5b8d99ab27dacd113acc19d411000b88c50c61fd94283b80ed67cdf2df249366451d8afc7987c4b611c75a1c43ceca1dd49f3c6f37904a582d3c8cf03be63843df5297ba4c79cc38d0136da4bc427cec54f300838b841b8ead5fc07403276b34d1a31cc481558fd2a0a201d30572eac84c2916070bd8a85478fa86d4d08e8e2ec94b16d7c8023c013d2e576f3c3b1a685151528bb8d11080da02c0372d15cfbbc65459bcc20f59a093c96d823cfa93ec5d3320f61ddcd9fe8b9f3bb1ef2239caca74dc3c1bdd4e7655108e9b9a5ec6398ca81e80abeb354644068ea99a43004c73857236621f27e7000e4e545f0815103ffbf9654c7d90a69e1f437bfa4c6682493dde7a5ebf793c94a5a1ef896dc647e3d842c75f482f717abbd71fcb13b90f32569534d8f282f3a12d32d70bf6828c9b4f836e2158524e52c49ec3b6324b61a4db12c2dae8cab14fa73ce37997d07fbc28f55e23a675fc436882b92dd8e7226ed512d42fe8ad912e19f1004ff484d1209d3dc013dfc6b0466c35ef7df98e84f4d760292cf40525155e75eb6d72610afd30e618169c2671ec698d036d6a49d38aa3293854f638fb0af6f08aa2df5350fe14cf9396aa4917fce0207f38a840592d3ee8899527032ba1d147452f5879cfb0652601eccf8fa212f57bd8572e9cc04548e3e78f9feba71b259259302842a0fe28343cf927afb82fbaa1db7fad65d3e09b16c1ce8f62443dabb7b8fe8e5fbddf53e673a6e09eaa9460c97586bd1b4630fb42d3172624e3c0fe47019c8bc26cd03fdbb867c688b60e87b820b4eac6427a70ae8551cf2115451f886002a6877844cc101cb5867cfeb25787c1be75ef0da87f1109851de3d7749448f9d233b70b079a9d956693ba1539dd884907a52bbf6c18af0855d8cfa555a7df1eda1251932a31ef42595f6148db63000e5900c7cfc504dbdd95bbc280a286993b156ee66197b0aa2ddbb665188d3877b0be2b6c7dc391ec3962518da3c404b68e4e993a421288862564aaedb335a4e0d4de238b0d0d021d66a9fa516328d41618a4f41aa406148f59735dd7a42890f61ef5fbab91c1ae217dda01ad441510989cfc7adc6b4915453a74357123bc7c35b5d182253840192ced6c711c8c15e7b56a840e5d40c468ab4114473b38c1d1aadc9a4802b1f81837e3440e5672decabc19a17df22135317f9f8c09e3f6a4ff0a921028a643697cddba4d748211e8c96592c38916062379bd7b5322e495dc762400a8a8d818d7a2bbfb52aead4e3535a7760a55998aae4421cfd5497c62032ff545c5aa8d8aba612985f406ebdd8a31543e05ce8a8e630e4057a03186e5b2a89017f4eabd4f5e848aa83c312eae838c962a1e7e0434d9bc43e1708930f2a5686505a8ea0ff56ec3d87309782bf507cc57025a0bf66d5e30d0399b36fbc90598330a2813eda17b2cd61aedeb3f85387031d39af7b59f5d80732cd449536f24fbfb11f2389c7870904af58123461707880200203410e4604827b3e230b3d865be46f17ac0d028f2d4b977ab43ac9125462bbbbbbb779e07e1066906403748b202e6b886ba349473ce46d52673ce19a8d5ca25b888720a504495199884f0b090e080e5a6438f0eba70214aa18a0abb1f2596d0d50084d5c383188f196c489204103a254a14d1c1698ba089aa2b2a5d50a071c4eac895160e20a003054c7634e520c921861b1841e281e24ac81e81f4fadacffcdfe8995c88a21821830b3e5926247154431116d208227a00b19b1284d00e48b8b01b7a0f78eca9671d3f1246961bef041884aec0b024e4065725e9f8869dc739e71c0413b5c927a9a90b23881eb86327c82804211e947e24211464c7952147824c189a3a0c501ce71bf5eae64a81c40ec6187ff8c3b320164259b48f910f928f92cf924f13a8d47375c601cbe9e6c4e324e484a3a1b5d65ad3d859425103151d3e544574d06075c4902074c4f4d01fa0911232be58e3aa4dea9d1cbd63a726e79c791c519bbce191a479932a792469017ded67be7e8d1da236495474f43b46a6121a39b8f028a9728a322247dd41d11bb29aa0216946124ba87c48e2724281cf788c735b0b3ea67e100114c5c34d2ee2ee762acca81c989002d0f7e5686a01551f8acc9b1684f60f5e8cee47161d49b87a75a8728d9c1dac33cedfcd39e71894aa4d6aecc3673cc67905ba596dd9b163484806266e30114373891b4f2bc7508dc6f5c118635eb5496d430e893d9210494108a8188690210909fc44eeea972784b0d1a27aba375aad6d948b08b55a32871f285d74f8c03aa2a367a3e9efbdf7eec0519bcc69237eb30369f6540248b1f3b59ff91f40902e3abe0f4915a21c2d3da0f840e2260be1020ad9051bf4b08801a8060da52251928eac283159f5a04a461688c20061e9a173c2b2854a95254335f54ad3d557aebc2411ffdacf7c8fccd945e188ba5a5243851a5c7835828435900049d119e79b73ce50d526f5073e3defb45a39e7dcf338becf06c38ec49a56b7dbedc6944b2c2849ac09001c7f33ce39e79cab9e7ace97e39c735e8107861250b86c71f2c4d2122a4bfc008d94d0035df293fb98a7a5a7a627a83b93cdf8e1331ee31c07f5fcbcbdc105251e8355695dd1d9d139e79c7394a228475192a22489c2846b3ff33264e35e6b5bf2daa08131c6187fbd213476ec7c4dc642b728618cf18d0e7812b013f47d3f5f63b58810602203103f82340d614310447646176b8c31c6988810111c911c11232248449472cdccf5d15a6baded10143c84c4bdf7de9c546e2ad7cb55e5ae72597ae8c9074bcd71257b29c88255c291a826865801081b9830a247c617638c7196aa2fcbd5f7618cb18d5eadce10a23689cbcd309acd40fa5a8e50ee76bbe5d0425d2e19e5845268b5b0803c781c717908f1c0f1c8f130e28144021a563c1c783edc2069ea080e2f477ec86102e8410e273c61850769e787293a6868031ebe1a3b3b33fcd372408d1b4d9e7041a28cf8210987440e638cb1134cd4269fa4a63e184ef4be8fcb50c77807064518cd70840db8d4b0e506fbd003cbc118e30fd7087d1f0282e88a9f7cb176d292e46786291c4b64d91dc1a2e3fb14c063a733cedfcd3967aa6a931a5cc2e9169104908d5b0a999cda9cf7de7bbb0c519b242a3ab2bd4b92b54ce8fb32c5680ad214a5294b539ab48e7befbd3748ee04fdf0af28aa28ab282ca9dbfd1d3ee331cea54839a1621e0f5a28826aa714839193a01e9298d08465e2566d52efa31c1b2bc823a0824ce1312a62091e358878e8d85ae15600e2003b4534210429080a90149223aa72195f3c75f4a84deaa8d23aaef86c2be560a92f40559bd4435a723044647d5aad0a54936f909e9df37d2ff09cefcbc9dffdbeeffbbeeffbbecfc80e1be1612354d888153682855fb8615cc3232643079523965878c2470a5751476adc80ca2e280421c4d4a39b4149141884243185c87dd045880d4f3b90f0d8a107a585a7b9e4a7b5424ad44e091f4ea258411d55ad40afaca84df62b2ccdb172a8903c36885804fc1080c8f50100c6f8678510942055c448cf951c946e3094a31e4477fac0436d52e8c2f00177efa75320b18331c6180705d55c104aef42a9820185cf7428328431c6180785bd1e3a2e5e5f7cad6eb7dbcebdf7de7befbd513c514251b8a85c9451145294524dcfd9050e3a564ec0eaa18a0eba275156e10d514f04e1331ee39c85272d310861ca3144e5498a889754165c1056bcdbed5682b4eaf2869e9d55b7edb45a992a0917ae70e1e1049f1cb8e858219dab73ce5988276a9352533d184254fd68ad754bb7b44f2be71ca4e4de58bad17403eac6ee066fbb901383815c09619d0d82080af2ca2e00d1f9dacffccb84f47e58803288a4a8b440044815131d27dd901f2119638c31c63a45d4268f92927c373a4cdf877b723c4ca8831f3dec19070f1240010b152522a92641418cec0842e473f30307e486d60141010768435eb9f5d07060460e271e5c8448c20307255c9aa099052d4047434f922b2780e434f94c2c4520b54043951b98ecdc60271deb00a5d89139e8fb58cc9005dedd3c91c659ce39efba5c1a82eb39ef3ad852ea81e14410ba9da919a0704d8e5465242b20d5e49c3392aa8be48aafe0a187881454d8098a729399e8604a52365af86b3ff3af8444815eb05f83a5c87e244e09c9d6b1ca4076165433b758fdccd77ee6ff01365c209e562be79c6fe4661e2043cf52104c6c6c61bac14c2edce0a95b76ffba24204287179c78a2c7101a6ef212a03ce387cf788c7313acd0077456d728a35b97ebf5aa4fc54aab38ce3aa5e2b8ebc3a054e49be71d4e69e37e7981c1606062b1100794f8da4a63668c768d32fa8be3bc40beeb14075f0cd0e79c94ce0cb394d2b4a4998fb3fe5a20df3c74d9cae9e42e3d03c0032867460ad5e983548738f86d1883f6fa77cfc47aadda287e2975e812c4f3d6676869a6d66271eec429456bf46bd5664e511b7dba83fc803e9d559dfee8a2d3d9d35192867ea54d284953a3e8bce70d7e9682bf7439a1a48d7eeef26794b4c9c0fc7162995de14274fa52ce299dfef7b1d669cf80a4a10f83d6287c3e98779de27aeb6aa35fbec45dfeec13b9ae36fae19516650864566d577cd6b0b57a4bf94277f9e0b7adbda3ed35873855c58a262eb3fa0a6c1f271414082fddd22614add1bf527cfe38a1baa52d6ab5745a0af5f1a04c1461441320a434d93581fa195e1fbf26072813c0679f7d2ec941a5cbb70ee8b6a9db97da3ea72d00d0edd7d01672091226baedf65d4c2003f28594bb136ab7b485d8e94b143aa547af65c517e3185ef243c77726adb0f86c77bbd43189a14acd5c48268a2f9637909a3009b2e3315dea980cd11798087d8d098fa42d2653927c83906ebbd43129fde851823e38317d89d19a8c50af32970682931b59ddfe8cb6a09dfe8a24b9d30f6103d40605d2ed769b714375508e14d0e9e842c7e674d841c72574bbdd6e3743a40eca923ecaa74e6fae1802103d31841faec4107ec0a235cea53a9d353aed210041158a2076203c7f83692ba88d4edacc4adecc88b7c87ab3de8a33d369fee6c5a87ab59ae9f3c78bd5675ae3afb56a53ab30aa4d5daa9826ab8dde7c52f8dd5d5ca73f5f76e02e388c24bdfe0432c0d461960cf5fa16943214b0ddbeede30cbaa54949336f94eea958973c0663679d23d439a7a58dd6ced9edb6e27729a5fd499bdfeb4f1673f6fa521ce7ecb58212ffc839e3aff6ebbd3bb0e49c33fe6abf5e8c69f256ca02285f5c1b3342acdb4b6bad2fd2463f266d6aaa8d3e1d57f41a5aa33f7ba8b6734cd1e5377ea0d77fbca57c71b1ad745e6a55a8a999616e4998e95a3ef1faf847f82705065ebbd4e9a4faf842fc76a9d341a92c70da6b9208dd0d06e815003aa55eebcf6ac5b32e75ba5cdf5dea74434f6c4b70a9a16308914ecbcdd491bc49803ea7b479190069c33be813095b8c69e2cc0c13a8d01e8d4bc398f6347e106286b6fa7a50632a480c5a80e80194a344c4a774831b9fc2eee317f5b1d6278d3eba70d2421fe5d20cdd933eca9d9cea3574e2a3d78fcd6408f96124078a0d1d4d96b8a91f42b5915568d8e0e1874f4e0c4a6e6acd4e4ce8af2e754e74728f71f6c2f6399f4f3de78e1a28113d6188ab217afaac832fd9a2fee32217881c3234cb932732708b838eb7bad43db1413e3962adac5b6badad369e08a938f8ab4bdd131e98f6a484a018c5f1840655c2b7962bce89a0e232283a3a2a4f45a615bebbd43df998591cec52f784a34c4f3f7dea9e6edd5a6b676c466b5a382c89a90487994284a7d055225ccf40a1f0d88f1f294c273900f5c05174a973d24283f0982e754e55a8140fbbd43949f531d69d94f45a61d09cbbd439c5d0c12e754e387c308055ca179af9596bed6b1ab3d65a7b6fe8746b97605680ac0c5921b252f4f33ae39c73ce5aaaa84d5e5d185ab22e0c26747e1fc939add6117e216708c6187360020da0bab40588b733e531c6f887476df2874aff58f11facd9833d3c5e97371451c5a382badd6e4152ea76a0a8c09e1b357893a2a59aab6fe30c638cb18f2a1f573eb28a748a808a868a888a8aa82de7a50e837e3c6cadb5d61e10b981f669b586805008499d0a581ed0110109c9d1094961deac3ab6818e2f89e7938166f7de7b6900519ba431a46910f1d94eee927649764c1ff4960c1d11eb81a887a21e8e643f3d72c9d012a22118293d295552ae3e6729f1d8134c96cf788cf37bc3b6b3c294ed7a0cd1e307158e1fbabc80e4cab68050e4b09443530e503a35a210dd2b07638c3ffce12430e7bb1f0ca0929d03e46425cd63e23df1a47853bc1e04ae74eccc1c51603934df0d3f08ed5ca901882c2e4844386d2e069081e484548e23237c74663c8184d3015365e9581e9e1adcc4d324d48483d1949b7dce79c7c8e79cf3932b6a934fb2b40e3a5c07a0d9fb04a5a0ebe9aa787ec8f8628c31bea1065ec7584609af2a11a2875e21559bd44db81e03ec5478d25962d4a387129c50a2b365033c9484b050020d3a94d882c3b6b003e27373aa4e0ea8079b6412b404ee96038f9eae89197a605d2c4b3270408121ca094582f458016b07971582a414205c624713346e44546cc0040d296ce14036f57a8e0839f11375440b96203db5c850bd29426221a348871d26e8c822b4044b1622443b72f4421c4330c6d869ea73ea7d4e55338cf18e11b3044590b8da2129ca67882b1b94248829e829482a686abb90132364b1300e57eaee680b5811add167d16554a09a59758ad5e9a68a8935f78ab6f39c431c9dbf8f52985dc5db67e28692a5f826215a1b0af7c6e1c79aabb8d7110fdfc57ad4467f86382ddae5650db674d28b4629dd81348da479aecfd71fcccbae22d85d62ac2a6675859525045b3282e1aa4d092957043bd2b1adc5182fd68b55c5ac6257314338180e86043382e160447d84e17697312a98d9070260b7e616677f89b3871314658fed2a861ae9d6d4d46affb3d9a58d3aa906df30cfe55d2aab194fd2ecbd779524539dd6546059f17a555662ccbad6bd7cc156cfd22a8d06ba5aef0a71f6bbc218d5ca04352c065018490846eaad97214e6b05109807e98ed91f13e2749738fb8a5dc5579f899b576dbb5c91d1fd6abf1dc882058bcd79a7d1429c16c62fe5e31ffc3efe76155ffa1581a87850dc39153bcb85debbd6c76ff77d9aeadb7d3bcdd346fa4823e924ad7479ba8a4e72b1aed5e5adc0f6f1f254883290fe8738df7f18c37615cc2e1dbfb8ab15be228c31d33d9d9b6539dcd230da0b6da4bd9e8b16be6895b65bb46dc4a3d3c77b74739266fe67748b6e8feba3cfcfb451c642a72f23d4e7ab1065b581b61d8030068aae691a09576d3413b5dd1f5fffc8c1b7b40f87792e16be5d2af1f23eaaefe3a936b78a6aab6af35955db77a32d3e1fbe1cd9e29b92b57bd5e9d78fa7d36f67c5c5d9c30178c045d96d1dec0e429cfbb9c7001e6c2dee5cd111add1dfe246a2359a446df4a5eaad8ab3ce5485de2aa6257e3ba86a73a14088e959450efcdf4ec50e775b5abb429c664a9af957040243bb52d466566d1eec2aca74f0835d4515ad0b455bc468ad66573145bf221098b7345d6df3c103ec2aca3a98336eb5421c1811add1ef7b8c1f0be1f8fe2792809160b92fc4c14360d1165f4bbe909dfe072a605731d641172fc4b9bdd79669c2e5c3a0611843f78ff6ed240d7d992618aedabcbc60e91be799c184aa68d555a6559d3e7ebbaa03020a277c84e1f08f301c52c7b4512b55db7c185156db7897fa7cd006f6128ba9c2ab15598869b2dcfd6f275fec145757b21c8a1084988e6929ac2eeff6a80d0cfe70d5463f3765d443aa52ba5afa9a7a1f94ae92e56ed587ab36fb68277db99de4c36da60f693f7d38a9a54ea79a76ef83fa7ab96f476b29b691cedf948a1027d3be5dd6faeed6072260bbc4d9ad287badc265424c83e1b410b9f5f4bfdd7f53d406c6681f511b598eca72497cdc49669b69d3c6fdd4b4a52e6ddc53b2ddee7dbd4e1f94e5aa4dac8adae8c7ae8c62595c470948961b9235c51041f598a24e7f94ed98fa082b8201200441d6312d462573057fe0535987116144d4469f8310e7a3c1703bf0eff1e3bf1da4714933bfac19b0abe8ea570422f356e6af14b541f1f46544594e85a84151e7aa8d2ea236fa4b572e6a2e4f5fde2ca9d3239debe3d34f215eab6aa30f235eac6aa33f13b74cdc54d5e6f228d5869234f4b5b871b446df256e225aa39fc59da335faa1b88b9cf876148bb6d83bc87aab575f35eb63bdd57abb19f571d6e9a310bf5db5d18f113f5eb5d18f891f55b5d167118230ebbb2502e1f91b98d79baab7f6d3df5757be1ddd08d9800f373fa02f5f7c4f5f56446d609ebe2c07237eb410e7d2be1dee6d2ada423ffd5d455b804f7f5bd116f7e96b24cd932fead3d749d4661f511bfda9a95eafaa8a5e5dd12c9ad5e973108210d36d4e6ce5d7a2cdf5f9a0f85cd2cccfe2165b1fee05e6c36d028438fa0910c6b0fd7b018431623a48db46b4465f450e3e7ebb4e2f8eaad30709108a40fbf758ecdffd962825cdd8c2f579eb230cd7e97fe215b528ca72e3d7e753b04f59aed3071bb0abf839605751830fd855cc1d8b56efbea57cb182bf5cb07083ad2f85cef85a1a0f2250e97cf9a0e6000848800256b85a5dc527e385b2200782f415eef8fcf972f1f0f9f4a7fc1a23ec52d2485a6b13d789cf9fa135f9b546f1f955be94d2865b461e6e994d2b9db8758d327aad342969e4c3a0b40e593b27c5593bec90b5ce92b3d08b679d2f37ab56cd829c7376bdadcd7b089ec2a9fe5a1c9c2e586a2dfd682d8d31801ab1104e49c04896d6eee5b11027f770bead706a91248dd419efcfda7bf1bd17e3efcb3bcf40adb30ea7b45136f53975cee195f64d4941ed423b40daeda22e853166b792663ef8ed6fca39c73df7ae1bb4a0c64fdf8ad4524b69b4525a69a5b4660d6a3dc6ec1e49905616dc3b0c37155da074bd5e9c8a2ff28e327a18baf63ee2a394eaf3c11068ed8952dd026b3597122a64c24707f4a9f7ebb579af7ff951f74f04dc796881dca54b97acdea2018179575883d9cd10fd148714d0ff7af0e5f5126f7f79e997d1c110873fd5ff22ce1084dbf5bf6e07ad7e4b6d60afb97e7912669d87382fb4eff9e6a27ec1fbe52582a09f3fc8451026eac0dec6dfc06843f4abe0ef7a300c715cdbe5e2b413f4913f09b3ee7a189487a22e755159355deaa29e3a58371765bfe1188a805faf459728a37f76fd305146d3f60d8ec2377f71d7a74516cc1e3ef13eba9e84dd350eff57e812ad4bbabaa481e3df9c8638faf5c6af1f631d8fb3d80adae2f5bfc55146df210ee734991064e71f43764e9379f911682b9a701911f86bfefa5fbef532fa27bac4b105ddf5af17918ba3ee2f317c19ba5ea28cee1249d83da46d9ff901f89f38da0e6e51d2dae3972148b3adcfff7dfad3b48c6923d46cfa3aa2524c75cef90329bd2048c54d0bc57bf7f7fdfec0dcca9fcef5e9df5aeb1050ceccb0f091f7dfcf6b0dc59cf05d7b87ae300c7f8b2d5ab877185a9d979d3240903653c24a10c817b286d6ee7d70042035a8b919f25bccd91f3e9882115e503b1019ec971d7c1834146720e366ff278e32fa97814ddb6fc5164d04c59106b70eb65e861a90371b14f36f3147c66d2927c4a34363c6eda6868c9b9638ea9e3f033cad5d1cda0c715634e1af6e69b2a986135d8622bcfa47ab1115093e72f99c7efd0e08c004a82b2a5540f8f06143065c4b06167ae019b8880a555a6675390269939452b9a435e7b3d97fad56835dc8a58e23d047c0339d4629a5985e6c71c518637c29add4526a7390b4b106595deaf4faf5083ebf923075baaca26d91bf56ad6fcef8bbb4b471d6abb4c9af592fe330d2466a993e33d20a2e834f28030a332c9ff118e7980b2843cf0cce79eceb52e7e4471ff95f1f506ac9a5dd3222e0b7faaf2e0a5597ba28bbde4197ba28475def24fdbbd4451175d0ee1cde9d3716ed0c2f20bbbd17901dd3b00232f45bf942f63bc318f82da64fefeb797fa6cb88403bfd17986094d169c64f47c00f5a1104d0af38d3e54cb52580ba28a0fed2a52e0a56072568f70bfda37d2cedec327f8fa59ce95794561440cfb4da12c7ab1fb4e27d1b82407f62e0beb5bb4bf956c49fc5f15260a6e399d72f2d8d083ec28f9acf3029fd39e79cd58a24d4fa9c3ac4a1d64e7b5dd20a986df0491b6393d25aadbd17e39cb5feb49ca2fc96fc560b04f70e2595526e9c977cf0c55fe69c72665f603018f9b1584ccc8cb92e0ec2c4260e288bc9643218984cf6c26532d94be60a65b20db63e9d65f8da017c59548af6bafccaa3523ba949ebb517676db5ae746a89b3fcf4d702b7ddbbd2b95be00e5dd6e5aa74baacdc3294af5bb35daea42eff8554d4a514476ad4e5bfd0229885c12a9d309aa335f958575487deaeb0aeac9a98a4a0989a989666516e0e4d217ad5e557abdaa3eaf26f0f040aa0e2289914e0a286d6e44f4a6bb5f6628b71a5134f5aabb5f7e26c73ae74667b31ce797e2ddb6a553a5b597f5fab05823bb46158e90ce79ee19c2f6e39af74f2d0f57a71fe12c69813066361602a9d30b02d652c06058a2d65333b9b553a672f7b8aa385911f0b63ccce696d8a31618cd9e7833128a4ccca64954e9976c950a0f6f9b38f33e89396718c76c95060f7f9ba8f2ce893e6410b20285fd50a970fbea8b55fe79c73ce491bedd3f954565a5de3089d42d1da9df406ca99518504a7fe1ea4b8c7ad7df0f21be3a0c4398c61bb0e71c007b5c6693df87d21ced76ab540704e2e69429cfde0b67d8738af07c310277cd0e56a2d615788c31f7cb91ee4bb15ea075f2495d54ad885813374bdf84b0a97383b98c5d9412dce0e82e2ec604b9c1db4e2ece01667075fe2ec6028ce0e82776f7176d9c1bb5fe2ec7c5721f87cf02554016803af4b6f81fcd96548815997b4a21a223ca4b1c6fa66517dd5e5df2a6aa3b151b551f1f22f956caa4db52275f9d5a8da502aa5ba546d605ece5e7ecd551bd94b27648dcaaf38640b8a456bf425d0aceaf02cf9b48adad4db5721f9e27bf97447a7288ff628156db15f56239d21f76dfccd10fbb2dac46c2e54b54df9e2f5b2f52e51a21063aa08a3bf1c59fb6ef4c38d1a877b598ea7262925596a6dd706f96e89b283303b667fbb8ab090dfded1e5c17ed42f3f7297ae197553eb566ddff751812a24b8ab28556cfced5dc5f9cd8ec35d450a2382e13e193dfb156577ed2a5618110d971aa894cb9aec61d221743302000000c31700002810088724511ea969c87c14800c5078505e4a34508c486271300e83208642100461180641108481208002294792bb0150f8ea20842f70778afa1dfc6306e1226b6871b0b545448aff8f8bee024bba1249cc327f3c2d28f6cb4c368208f26d5bc7a3ac3e1669607f6ce913a3291fce8ebe4e087a9db5405a665132ae1c885cc826c5175bbd2249647682bf0e2b9998ce0c8a1dc63aad6d1bb4dcd39c28e8706b9f99812f6b2029738240d74bfeb815d68fd3b58db14ca91b193215951df2dc38e8aeccf88ae32eb50871736591fe1dc3f3c919be4aadcfafcd03b3b0bb6c0225fd9434481b2e345baa98405bedc09ebdcfe63cad8378cdbd0b6370698f1b698accd0bc50971c0f80346aa5a683b3ff0cebf0d2478d6db2cdfa9fa8b4ed68c5c8f78dfe3453e32773ed0b6318540a114f01e5d4349d8032f9cbe92f747b5465b454debc7ff49a65b90ef2f2fda2cb24b7f1768fd3c7a4396ec890d4afa0f444f877ec86c5e5ad172afbcc0fa3c4846931bbee2da38903e985726384ede914c08026166c4caf63980123373106155e3b71f38f5e6ca61a7e38347336a49eca9c000982702ee352659bd95beb3020938b5014070e9e291f5d51f1d8ab74ac5a0486d70388f2924e03f843c985e69502eafa99ec8fd7bd12a312b83a73024ff7cf77dca966ba179989c44e1f562784de86d60bc6cb78d6ba3afbc879bbd805f4953b6da158415c200545237ea84065b224141a2332cb40092d37220f20ee004f77b2610ab86649cc74628fa65304d6ed67179d39b6f74a54b37de36b5eec2cdde1704dfd4a604409b655eadf0625fb39f83edcee00a25ea5cb9fa3802c831bb478dc8561828fecc0f95acd69543c71be9dcb2be096e3559c1be195204ddce4be6e8780b36424d36ebfdd180e1a9739cc0f3d6d9f6b09173c69b9d2ccf4ce6c4fc41aa44c0480881149e3a2ef523f835d88b3ce54948c822329ac147ef49eed35e04478be88641b20f18a7bf9c4a4034a8a7985a8f3c0ec5a734ea423839ed389e79c4e2a40bebd62638da5737a53620bbcb2ecb22a750ecda138303e0fda3552b558879551dc65d3a25723459a678e30d7b22b754e510b378bc87b1a4715c0ce14f5c7587303669b6792335001e58bb5fb3f111a97c341c521b4699dc8102e28a650423f6d0d8d8fb0265e7509219192bd903019008d01c5ced7f468ab3c32e21d527d51109d0966d04cc31352ae097e93f6986ac09349b14fa474f4d458f581d099428a3aee32c51e43643e086df5dea5ff23cea41acd5cf92cc4917619e2e59ca25c76804b0de95ea127ca518be8d5c9d8b9d8317815d894a2397c827147ca5aa0f7d7f0a5001c2dc5e870ba4401b58095cb05106794aaa1b37dc0512a2326896930f6cc7d95725bb815cd25b727b0d2036ae5c135e2ef4389082bb77e481682ffc384613d34c123ea9a9e32aa26091b56829573b8cc68f1e7c8e042593befe42dc5a28b243c5236390b6d514936cae1f8a4255afb9f07d9e65927d7e516e57f0247666dfcea6dc703989e498b29e0509f7ec2e53e3eb5a043a919f5550a81b5793f785e2c7c93871dfe89f673d97d16f20293e60d00a1920a278e7dc9add61869234c3f38b555741d494229555d50fe73c9591fa4feb398f7066f349a5c686e3415b01d6de006e6621208f36de4a46cc3c0f780b980393efb792f5d9da957ffab0cba9001c35b8998344c74906298849311800559daedebb8e2f5be996779db89dd3b17a32f8d400ad7e27c43a3b79d4c100ac834f27e39d0a907bb891f618ac8f30856d95b3386e06de7ae442cacfe0b1dcc31b3d884d49f1bca167955c019a025c09b432fac04f6c77a0e0ba90c32590375fba06140359a68bcf33d79fdfac02de0445a5f4c491d7c001e3292334eaad03311eb4dc514023284437f32a1b85e11c7cee8fefa2ad85b6e09519ac719371b9c81def078e1ae4a26eed5ab0cdf24c2d2652c3672d2e7a2d789081ff9d386ad20ccb4737768c6049a2198eb913d7a6fce4ee583f06faa609f239de1746a5e7b6eaf38f231de498d5b12ff4f2a6066af4a7cc5dc7a1222ba221b7b90d1be79ec658ec616840ae164c3941865fbf41e54515b7cd289db3618ccdd3f9d4c987ced1c929f630ebb743e05011da61801ad561663c19d9fc9a9866b2f1d7f2acfa046dda5ddcefd1aaded7c83481620581be9decf72e79ba6e15516237ca9ece7075595f32dc6ec4c170dfeb6671f212d6d760cbb61f3448db11b99c232bb26df7ba2f6e9904ab8d5e4eb89874db3b246e51f89f76c9cf99f2c700ecd24fb183016c639d2287ed2b146244f6c47e5c601604be0b4e3210ccc90d7338f08eda9aa9baead251e8c598a65dc3a582d025b5451bc326316da97fda3b284db028f8bbec37a78e67ae947341fc963ec3f2228e43d2bf5a4dd77ceae29e0cc664a3dfb8acf04c2982622200eb07aa3c0affb1fd5584fd45a7206124be295b3fa10be883a87a96ac085497a5559c388ab6c4a9841213407d91a62bc5a8147b69a77b96c778b654f6f826c8c8c8548e683c16e991daf40df615cade8582ac73ec6393530a1932a5bac6a50d78a636ad9707f201d678d4815eb3f62c6c4107505328cb23bbbff5f4b0ba6c805f093780dd10b62b2449a45d99cc222eb0ab7245bd3561ed0ea56f1ef099897aa69c0f86dad6f639ed0d7a56240be5e1f60eb8d73ab1c8e2ce4a06c30dba9c3dfae37b1026364c51833addb02ee160acdcd05cb122ce7611f051624470694d91f1958e2c2e80fff37059da683888d5a21e29c058473ced5138b40fa8a3c20e1574b288e44adf685ea801c50f66fc9ecab049f84484015fd08614365551235793e600b61bf44a88d70aeed83d9948341a02fab3cbfec6bfb7780bb2a7941985e101929309f19008a1146a97bea0b90954a3c8d7234daec45712ed7ff1dc72e3f5eff65d8d2260994b5f6a7f48bf7d0dc4522604e7d623ce71f4b316a932e19291371967b7e01e4cff36126ea8a9f3e1999c5f24d5433f35c69b51be2dea26e68650950eb2b8d583ecf22e017659f287b8e7b53b6f4785aa3d56c03d80809c506c2684ff3d80a324f4ac3edfb7f14e47511aacc878be3a82962cd027b8e4058713204a0a1989ab3c4250fe91e645ef2819c9322a0087ad02d0b87db631f3c94ae6805102c495ea90298527b121688d1c58d50bd45791de8b4631ecc314ff162a8e6ee59bf1f4deb899f2f78a4c843bf8598ac002160ecf1b7ccb584159564268b8ee327dfa941c40b670e71c46e4e955a415508550dcec4da093aac9e2318c5d0f6a70809e383a51c8bf34ee8b9961b50c7325813f9e72c7cbd6c804f0e5c8e2ae9369216966492f0e2c793557848293f573a2fd1c008a2d8d7fc1193fbc6f49b74447586eb3c893b48f589caf9447e9382ac7ce7be0ee7e95f7c0d1f04c18e60662bf71db1cf9d39bf2c21c41987b207029ac93959c387fad74588efdd19ec577825004502768f487c88359a2cc2e19a46ae3c05de5da1e21ed9f4861406fdf0b5e9ee51b35dac7f3a5f9abe4d2f384365228df5b02e9b076fceacfe9ee1ef4729f9aa58b90f41bab64a60fdd16a17db699e3c3a7f88c2319738994a7ba73861af5423a48d197925a3c4b6709d9607f3fb2b1c853151b5defaf00b446588af5a1b15abb9c403ddc67efff8da71b872e47491afca0811e2812649536138db7390cd0a6e57ec79127ab7c0f5b4bae986d78153027b42eb4ba55260583a1ec6e7f02cfa548d488700b3a9598b72fa23215d3a95ecdc4dd712e30d9d4b65042b8eca4695853e82ba5336567df99e972e5cb6cebfb31010631d83c816b4d65f595baa2dc4a585db5ac8ce9d7ae0b668e79b50c8b50467f7df09ad3a72a63a1443a3549f3afd69f25794829b496a77a6611fa7a664e89f6812dcf17bb95e66b0546e454c07debe05a0495502e16e7e60b71dff36ab4ff7b5fd8ef1b1962fd5b7f0e6c42371e73a7693c7851c3c8301035b3c80856011813f434f9619f7f013658cfdcaddaa7070ef0b34654cdb63510eb2401437d23e49bd1766b533a8ac02d330419c847eb3a6d9610d1e77d84cbd16167663a3508e3fed8990f55f0a9873da59884d55c8ae5081ed411f93e4dbb000c257603389bce453907d5eb0631acd4fb0d297f538352e13396de6a4fcf8d1e393dccae2c32f27fc5df243bf386bf70cd8471efe8e7fd20aa5dbce51185ab8fe20924e548492275ece4c9e70265432f42dbd776a534a42fabded539ad629d079b43876fe5af177109609d50c78ea637217a90795bf6e03845ccf71325c154ac06032863130a50d7dc30262e25bc595eeb22bb5680a5308a891eb7bf06cbfc9289c130607be5ce967ff76830636f2ac3ca1352b7be7e177c311d009cda32cce9f51d4fb8ec33ed5ef2f0f7ce1d323074363eb35cf53f69973d4abaf00eca4d31e14134d86c0e97c8558e3bbe0b87699b7a68d87f20eb499abc9216ed4cea1170d267bc2112e84ace5465c6c47ad1f41025c6cd58200bba03b92902708a1101b116b6265567002bcb7bd7773435445545a7a0b1cf2b7fe1f332c78c08f876ba8a3f5e60499d21d43ab947a389c4bf44a04cd7c7f0bafe6e1edab371a3378a488030e4f4eec72b0aa40b9dfa192a0b0cfc88ec061ded11b0dc6b354f075875e9a79a99c501175f2a79ab2e15b4cdf0713c1e24d2149dea9e2f169cbefebce83b94e0f15fc4da34597f9f618ce038b9bd49273bbc43e861b91274c11139650465a427c5c6045d0dc85a46637880badda3e333b32affed1a9f276f7c4faba6d863b5a3de055e3b0a09a3023033d72e5e482886bba82a2b1484bd854a67a3fcf914e210f10b9824c820f6b27ed2911fc06f12e9449f6d6ccde4763f6e7c8da67db9e68fc2c6dd141edfcbc94a1e276ae68c830dac5d80d113965019b0a9a234cdd785ed6991c02931369d2adcc217f5190e57afe2c515a76db4b09f9906f4af046fcedde2cbaa338c3159239da2657962ee5ee3ef171a65dc62dc032b8b6cbc85475745f771e7a93e5a9bb00d48ccaa7c3b85fd6ec408f3a392634aac844d2c96eae6a1dc1adcab1314beba2f756462b26e794e8ba8d7638b1e636a781e6a006687c59c6b03f994ce68e6c64f5e9d1fd8bf5681601142e64215d0f684b253c1b350499ac6c63a38bdabb9635644d134151a609fb0dce3900a339ebc0c448d15ee3ad989369e630a7ebed34d4d1f5663ecf12a86f9cc74bbc44fb48050a848e09e0108cce411cdac9c04aee1f2442e68ae771a145a568126061ac968928ab014e77138017b4ce9a9c866bbd0328f0625e0923fc4cbd0e5d56cd90842c539610fdd286ecc4a01b073aaa39ee673ceea178fb19dcae2c6e29058b568891875418b8e2a8cce45ada98785022f9e1c994b83bc0a41893555b7eeb72e6b2d448700f1aa8e1ac3e1d87217087903bc4fb8b3f62f3855113eb6f21938c987e0330f603e53cae8311335af9712221e1fbf63b7362eda61b31927dc6e31913bd712ef5e27fdf18c57515c5aa153450a6cf0535da87f81951cf6c85d094065ae8bcb2f53e3f61983b6192abf07a80854ffd20c177dea386c64b04e637743a0ff31268d597fea63d051b579cdaed4ad1b1399d5d046d418041bdef92a99fe92becef8ae68e9aff7926d5c9d6fa9b4b8dada5613193dd71468645482b1ca9affae07a24af17f7f1bc69f6c2c189daa184686c34a5861c3b127063e00aef58a8f531388ea217465483b6c64c13f4fa2aa913ed3d0683b416f8c1274cb3620fab86ed3c771afc1ebc5b0e5472fed6b0b331101a4282fc904d6199b32e8461f084c8c619ecbdf0c00125c9a83e7e1de0de84e04ea1ed12dd56f84e95acc0c6dc56a80970de8131e40e840086e008c8a30479a0a5531428d240eb306619385984d2da7ce16e9b362dfb811efc1e800650c4f239339ace6685e4b99864c6ed6d1f0b9e439168c46ddaeadbc6f880721aefd806b5abfa06fc0e2a3fdac99cef0911b7fbba110059dda3d330d5338d0bdb52ede4ec85efbaec72976215526dafd420cc79c2f44302e33ac3a2e2bd1a13ea9c3e598a87d92b9d4245b6ec0bd6d74fba29292ca5bce83fd8556ffce1c48c324f88460e2a663de5938105c7470a27db0a5326acb13f2393893e6adc344169a7c7ba212d8eac1c9ad866bb0dbbbb1912791cb7512611770ddab0e7375c1834c0fab95e1a866fdaca018d65ebada3303663e3307e6da60f1b5f3aa79107e5f28ef3aaffb461c045e4edc4652ee546a122611b79921e5127986a5b0f1939c0d2569346de1a0637d7c2963271d739aa7c4806cb48739127dbae2dc04d885dbefddab5c4a156c16a76020e6825db92e6b3f8c6125fe8088b82b3049995d3ed5cd665a8b8d71aa42f2c096dd9319e006d129185fad6ef8a1b84f80e6d497a371013303a04bf19dbc705cdeed16953f876c5a6709416446ae42c5aa0063687135436930511c0c266bf363e74b9ac31090b54e83ab8a851f4488c19f0cf626fe767d5a8f71479b2304666f7f2afc1339d5f0f8a50c9d1bb55f991dc6510bae5760a670eb126c51e69e1b065a44631f1631288c1dbb6155e6c286f7fc4960929e4ad78a462ee8c63536a811ad8559c8ae3d223843dc009f7ea160ca9d944dc54685c580c20afbd9d7e950eb4310b69b99b5e05b92a847070138fc860d4266c9380079acb7f836e7475491992b6937ed1ba8944aaa2c3195fc75f4a3b05edc022c75ed41953b026045385c7e264920b657fadf37ae19395b20663921e5a01345f3ca00410fb8d2b8dc85974458a99160067cb0584863702aafd0bb8840101faf5e7ec430430cbae8ba2b0450db665db8e366930b577dfd7dd50dd96ef6317a18155bc2c9b9865bb14756fb3155ace4b26731d35cbd2c1d0c574751255645970c83e8b0f3fc55c53c37a39e32950130ab5b7236151f9cee457e9e49655d398b16070691b864215e87516d682cafbaf547dba0e7b4d4cc7caa053eb4b11ddc5b209059c85eb2640decabfc48f1c6a6529469597afbac30476815bb7c2f39d6acf8cc9df3a2c21f2cac0a4c68b00a66b42207edfcc050928374820a8b81b3683b811bf96cb84e7c98a13aeb548c8e19a0fb4097065c2ab613cf7b2e701397115b2c893d4770325ee0a32d43bc62a8481200fb18cbebc21d0f00f5cc5888e0cf5f8bd5e96ccaf3f376da62102435650e01653b6b380dc0fa042730acd00f2264cbe367cae190b35637aca81db547dd3478674a615de81c52e423347a158a21d0ad652ad4ff9a465ff42255989d2898e80d9dc6fb35526e0833f25b0642017c3d8e1c1c7cb1c9e07d7a9736e4adc83b612fd5de2d92d9c78c8ce4c4e8f0f4392561b2299920f313af1011d655906fba9f27e767668c69e1f0acd1d9936524f5c9a269a466b797b8701cfc63e9fe7e9c4bf4b74f7ebe544ec6f6defe1e04a10f68b87550d4b95e299f7a11e592e17262e448fbe48aa0aba3099e33c9996e1d973f594f368c267b8a524d12b221758076977c5815b9d5f780abd6e664f8c8c85b6201c42ac4e664fe5a92e49b85c3309deb6b04f1e6576598f2cfeee4e0cf1ce45127af4fe7df3f23cc92a1eaef047a994e3fc96bc5655e239779fb54a9f72e680174fb2824e90857d1a23e20f320b414986f30b1ca0d3db1b2dc47569fe6f321578ee91027c037c68d08f76d291c36bb01c3041029c72d51435a7504524a773d3bda7c2fda1990107416d08aec14f6189c700f882e77c44e7c3d55dd91167d4430e0ef05edccefa4e79aff988da656335d17c58adb9dbfa288a8a8f1a0e914a7a890c714057cfe0cd8289ea87dcbee9176ac40b974cff6695f06c7927a0d604b8b3db307ac26f1f24cb750f4dec0283d3ce15827eda7e8781bf7a4a248e7773ae025898d2083aa8919acf0481f3782411c482a7502c3a3d9aa102d8cef5ff3f7342329f944a43f8bb0790bf28c813f12fc4a8d7277e1a043b8082292c90673fb478558ec8c07f9df84ff72131b69306af87651c2ce08b1dd127f20cedc0f8fffacc45b57464ed6870cc230848be3e848ac05e7e66fe238a236dc6316fcc99096494956b09617a2d6f7a3486b5387b67a3155aa1a77612355e172d05fb19b7b3233a3eef7c6dba8308e2f2d190e9c6e50b7051d43478d94d89eccbc9324226988ce5023cddc1e98cc0a144196f5f414ea09256425aaf84726a0997e08cce1c3731435237b6f7328558714fdb6c34cae11594053797647e1071dfe409ac722e17748b67f6e4101d187f88202a023cf71ace27002dc19510d819926452db70f703a154a5ae322a493d1fbed43cc599c57126b88d9a7b89957739bbb63d788698b120e8583151688644b308f957f33740b31320a630b87495400753ef0f778c9e0a8913ce4107f73d49dece1c1ed8e28122b950f946871cb943afdc9cfcf9bb8022702c366553995a69bfbe5ed5a33fce6ce43df6351f64848d38994b668a965065835d19c45890ab7f15d62ef22f8bbc34b6ddff184b49bfe73fb829f8650a890935a4e8c85d4843022cc54017df00794839f1ce8d5b91a38262f02fccddd130b9290001f0426f756c6698ba5588dded127d9ba5296acce409eeae2e8402abe458f5404bef9f565dad4dfa77039cb6492bf6ea0936ee7d3360449c6a2dd5702ad3e9d69ed58b4d07f10aa8a3229a9b10722ea5347412f633ca46199965248d1e7a30ae053c255ea7f8b21c82962b3ca060b2bd28c412ad3b2eff727ee282d2332d7061bdbfa1ba36e18e3fc883b42158999bd1353783e03c337ed2638a0772d05e0d1f4c4a78704039145139097a22f9c046c0098ef80d16372c7f98ac5586096934bd3855a792a5ca97be72fc4ef4a966c8aaa5dcd62c6a06e17ed472431419ed8bae4a0c75e93978d32a7789e3cc42d8e0ac55bf09ff61ae685fec59bdbbb796e29a3db1a3f07bdd4d8dd3dbcc0de2657a97e5eb465b6e1f603405a0698e1045166bddc58ce1645196670c641099ac1806dd4ddaf28c31e14eef0a73e05c30672e2c45daa7c3b0f0d57da74b5ccecb96c3bb6c7b65be37e11417c108292599482429ee29f093762f700f3a1a9965b32a89a2cfa873d2a208d78437eded875d809d0708c2cab6f6bb018e085175b3ddfd000e5591228fbcbea9d3b5813448603ca9d5c66a1327cc3502ea10432cf09d8c06f3428e55decd4de6be2d0b17ae022abcde2858dc18d7ae6eb6c5d4a6c5659ddac128f891209eeceac101ed5b4fbfd563f03cfc67d49186a9dc36414a71f9d190acc21bf2faceb027dca918e987071aa485f2fa393d0de23b44980a32ad6d6cce2e34e92ec419a89485eafbb3b23bad433d2f0889d561397fb1e562d46fed8d095ee65295a79ac3319fd70f0a11ccfc3b7c2a5fb905c93df2e094acc6c61fb3097d17311e9ebce6c653748d8d64c0e3bf7fceec4124b09b59056e33febf27dc52883e72519df1d5fd817fa8d883a7d7c570e2d21368471082aa86fad72d847a61f0e639099e4136c92af29974a5674e561e040330ac32b8eeafa736476cd6f1be888dba909b804b920131f8bd34a2a4bd57d67c6f4deb09a60ef1c65bae80ba44943f8d98b00c2d842bfbea2d7cd1325200e61028164f4e4a8ca4866f712563caefc76cc705c042f4810d61a9e5a17e94813ef904859f42dc75ef017bcff1a79fe82715ed66ca00d56f4581014a5d8ebcd54cc9cb043cc8d80416cc3257d2aa6283d52e5f39c4a81b283b75eccf943d272c39b07e402c8f2d5281b1e7d73791cf545543edc9085485e9ad37775e2bfb10fc22f587442de1e664059f2a8610dad9517e31c730fdfac5d22ed77f309d8707b68f2050de9626c541fa48e58f3c928cdedc3ec67e9f947cd58fa170ca9809c97251265a4059592ff4c50ae07d58a7e8ccf0b75e428ae55a016d262c1948c7029643a25ace5604d09d174f0caf047dbdadb8a9de9c305e6c7efddb7518489c32243c0b092a743fc81e65f9ab1891b7e2752e4c1200b36a8fe8b9e7ce6673d69c4c95967d67deaf04a2b73e1997c16fc7d0cea2aa72ff2a5b3212ea1acfd1dabdfd2bc7af0e978c6481fa35fb2d0d4a46d6d65d77a8129de8f65403c3f6e347f04e5bdf46979828322eab7068642fe78deb72db93c4b306bf7b127d8d475aaadd84653f7416908424104781781470528474483f82ae05234511b58757dd5e409d6f8a6a02282b4c41cd5671531d3bec6bf09bb6539c6104b1138cc1e24e21b3e93d0b384d24db191448fe2d278e2ca9807d90a7a20636b982dd50f3e8de414e0a9074599551b680529441e6c8e2ca6d60e8f7251689f0744f3d038d9f504961243f4112602017bbbe62c72192538262f3afb0d893b43426a27f53ffd910388072e603ab51082d5f76552e886a5e36709273c60256cd1c63ce1001e0002dcf2c3693fba193aad6b6e179a4100c902c7c86632b0117c44deef804a02e367d2aabb57f108b7fa45772670e2432b9ba5cb9cbc79db8e8239a81b069c6c8d9a3995b720995f6012bbc410abb17e8be30ead0e9b2117d88ce95434022047f67c11e0275a3e68f8ff41f7dabbd163a2bb4121d2d376f5217d0a61c168bc60136fbe6ebc1b93ee023b668702b8910c11d6ba36f521e2ad3de591273b7e588e4b4cad9d3a4042d95fda0af74b2f3af5fe964a3805670cd8ab7e295378617eae22de52195f54481d7637e0cb3abea34cf0e3142d0da865972892f50d726cdf1690420b8e96426d8ecea1c335516f99ae09ed413389258615d74b40753c640c35048387820959f28a0635b7caf396af4c31fe6441eff48954b8629270754cfe91446f5b55c44509f6ab9746254813fee5fcfe869b1b119c7a6e1965147db07217c42103afc0625509fa3d8cc38516be3882884394d8d311cc3c6944407e55129d9bc959ddf67341d3f18b5651529ffd68649535b059a5d4e925c21140f0800ee628bd45cffc352239d9119c24127faa0d6383022de75924ee4f51428416d59877265c7f0e7497c487df269c7300b7ed74b5cb22f6f9200c7497e270a9814d10939b20fed85b41d02ec246af47eec8463a5d7002a8f2201d695221480ce59e0951054f07dff1566274a587aad0ac6e0aaa682c7b18f131c35019e269026dda3e1570dc502a6c79109981d27d28092512cfc91e9a07de5f0f3a9aed1bde9d7697dcf4252097d40b84d8b58630008d583df1c803b2fd222d5a8ab5d4014517415489791fb953048fc78bf69df412e9df1db46e8949092a443b132fb8df02499c1c963ba3be4c3591e14e31140dbfa00a59ba5703ee82f9750caedf0a9a96ddf68c3494b219d916ae2661f39017e3ad9985dacf958e6c1b3abc43c6a41aada35c4450606701d23c53a3a416f07309440063a7647a148b78e74967a5c44fade62ebe8c0f87a83bd69348fb330b01b11f78689025b0ad1b944085172121405c47e929a7a618a695439a38fb2ba040f30cbfa3e38a42334cf1a595327b4d7d2bf9c3482989e1f02aa44c0eeb05e54eb456001936528cec2a1d62580e967523ac02aaa015679e971b3e815ea7733ca2399236fbfb96c7d1e386487be13da649c7a9b6636b674858791ecdcd89b112ed064d7f27ac7ddc6b011ba68fec654a84145dbe369b187cd4481ce8c73cbfbf1dfe98f5803b3a6c8bcaf35fd6e0370dc0030b9b80d96aef8f2363dc14141aa3d7458dae32a617ce1a005fe0a9d7f5862f4e1b9a060a5e10a520b9a4cc2fd0c245c4d83c06f453a51d6d5518887e7a847c9b1b9702ffc4717990a708c6a0736b9bfa3a76398b3a5d5c720d03e89e96692466cb26596014fa0c55402276ae7c77f175d0f715efd033938acaa450570337af4a585031cb2b361ba7bce226f97445c6424887767d5dba11e90b46c47a09c49db2b6dc6df83f52df32b1afaedd94384a28f5d8552ea45c3f8d2c6aab3f9027b4843a111f5b7b2cb9d5287a32d2e64be9e1a84a9bc538ca6c186bc41512dc55213778a728cdb875d291e788412a128c3e361d2ca33457a3a376b0b0d43d90c1efe8ac2718ad45691bbe6a45a0b11384582878aba01f1a77f6d654face0c73a8c2c1a5e8bb25465fa2baa691869e52024981504cbf621a0397a527ef8d77c01c93eef2cc68d639a476fe462047958261ab7f516f1932996cd6c4b9aaa86ca71dffd162842e2486ca097f08a6f8ae9143595af047552ee44cda3fab8da37423aa88cca77332a86fe5b570cb3c9c0b214444a0738987801c6d006aa1a019c611726d6560c4a6c3225cbf89394197a28c10953ea08c789b772c6f24829644efadfe79f176ae550a6d788a60b391c12de55f1a874cc768649ed59d6348c026ab484e2a76b84e3ffa2b22df23deb15805e2887a56478546eafe4097512680471063bffa84a93fa84117fc3c771da2687d24a5c5c418c931a9ccc4584d1394f24107c3556f1cf6a6200c91435a8b7c64003795df4be374c3434746d2e83666eba3a4279182d761f6e2578326dc384cd50686ca05482988e22150f9c70696a982877974d4733eb2e6afeb381814f46a6e3362fb7d7f58758c755ccd3c449af1cfeeb491e626140d260786f2e409a9c25dc6549352d0afe5a03548aaad1750c3d4863f66affee4ba769ec7e5600e38d3df4d2a215c72e6fb542ffca1a09c6954b888cb7186da89fee09d4757413e4da3f16e5fdc172083c2df2408462033fd30f512f9860f594110eca2eef250318501d55a8ce3d2ed90df1d819d1a5f4276398ddb4ce42ea380d26dcf9cafb8010f428c974a619f815612a42379a846941ecc110cda2f2a6aafcb8d1207661717f836811402071cbf724297e05205117976f0aecdf873b716c1a929a02645a2a973a313613c4b5c9e18f8c06ed56e10a353a275400b2b99fad201c13ac189f0848c5132565103ae51a1a86485035a483dbfe7807d1d6a479a64e68cdfdf989486c56532e549840a17a9420a809dd98d31a9c0aafdc3445ed93ede8cd6a4a2bb7c0775d037ffadb4e6537943e4867dc0373a97c0f486284df999255405c792210a9c6165c760bbd8060f7d94881e436e4f4ff024e507b46916df220a764914bd235fc458d4fe28faa840d615df844a79c8612e95b5c78b31a00852afba02135361a7c50c49db998cc601091400aba870cb432af43f58a5f2ee46e65d1c6f19007909b8f321357c9dafe12b8d64d3785a8c3b5c0e129542450dd125d44ecfc1a3b177ac196141a262e9564a19d23bb1eb501b97174c99f7cc2acf8a273e6727da0421707ffcb05f7dfc2dd70769715921803f885a6023517b85bf368de4a2e2b521dd86b10203e4fa42715372870abecb6e2b09c342bde00ad006eb701ac2697422f44c51a0880ae5e0ba2401d15882050453438718dba559e8233144f5176f0d0d88c1e032afe2769930d82bdaa6185532fcfa8326f9f2afdab4b81b0cb5e44983a9e078f6c4b4a25e74751d51c0abe4d6068a55ea4205f776ced60884251b04c5e8e3cb8fd878c58998a3ea7f58bc62e5e33895d1045640edcd1c05fc7fc116355f9f964910f21041b19f6e0361722c54b3e775325a6a7f57ab7731f81cedefc961eacb560151ef75347a3730e0c7ce603888ec7b5797025850d96162706a32d9c6b7c3acc02f7f542d966ac5c0400bad07c349fcd7a5ce10074b6b7805dcc9001f80c3cbf5b1a140fb5fb24abd2e60beaca17d435c17b5add0264ff215cc4943ae244f0bfcff6e0d29837ad2fa216af18c8f0a138f235b512ee3083de0a0a4be0922e801c10395a401ebccddf687e072680e934bd1cebb8f3b9122cc918758848ce319d20a1581325c39d507ba053c9849173b8496944c8c63ab772df63cd6f3051d506de9dcdb33ee0dac02a8ea7ad1c7213093046608e1e1275d5c3315afd1e98385e94f5182d1374ca5fe4f7a8ac83c615c84468cc5c3717723a26263eb5d9979a2ab930c43fb60146787ab872220f9eb9c4a50198d3b63efa0d2c51903534b365bb950ad2c610afbf8e33f1d6c1f227845471a0e2eb50bb035ed6e85efe4f672381de324dba2492d674facf93c43ad47351fb143ea5efb2b9cdecf592652e048297f38387350401517e198d8114716468a37d08f794944e4b4724a59be76376eeab653295e89644279736e8b5137ceba261e2668230a18253583625b49dadcbfc3977057b0d9ca40f828fcf284fa8ecfe80d1c0378433ce0efe9bcc181b3e7ec503ea94cf42e83269804ddfe104b0c12ce3d989ddd356e8b0109dcde3cd182cb3dc0164bfcd3b423e2bdd0c8aeca54b68f95f592f56fac84d0179fd073524bc1dc0c84ae738c92c6a8f021cdb872d052dc9ef0910a7f60bc262c2e05596f3a2509b16da81063d81a6c03ec7954dafa63283b40d374b52dfe96dbb4d70bbd6b3b514d8b3d6c0fb5a2b4ae86c62103b81676bb3a22be92654e7c2e2ea0a7f60a1097c3c1d66ad1295250d200e2f2e991d01488c9561191d9a5be9b547e3179d8049f3b044f0220e1acf54fe4f22cc2ee7c9a9ef3c94008617210c502cde9d014722b530c6fadec11082530807a05f191cc2ec51475ce084192033acafdab90ad20ef5aa0dfdf82c1cea2d850aca8bc46bbb69e1d00608e6b15b03406a9a75c4eeb66d2213a23de790a5ac57e9778d22fc8f6d82d334dab5954fd1d88a4db7cf5a9273a6606b942dae9ea0609b28ad442e7c82ba088cbe7cc5813dbfa4d85246ef4b2f8184254b9644d04ce000fd0c4e00f92aa806c70279482402fc7494cfc50ac3c2524b6545a2065d5a5a59abdddbcf90cc842105c9ada87716db1d5fc80e6eac533bec6c2aafa058776fa92744de5f2673d8fc2bdde0f05893df16097afb80b9d045f37e18fe02d0708079102f9a4e9f09b0fa4f17c2350b1333b5bd17c77533e117faad4907be1f11a301d0b4502fc545e748584e7acfe9c5b1a5ecb06457d16da0b02878d8f446be04d880dcfe466eea4d7479d384fa0252480f0f2bda6a6543ac410dbd44bbf3fbda02e1a83ce69a3538cfc331f3f90fab0e18438a650e84eeca4bb20cf9652f9fcc92c995436826d03fac9899d119f9afb2cdc92b6db97534b8699c80375296b2a54c79f81b03508a8f4ddf5a354b0e2905ba05131a82fa0f447696b223b6d0fbb5316837e2ef3fe33001994a1ffc05d0b2317d9739118f443be334adfc7061ad83c4e4a253c98387957dd6b76c88bf7a35e43e804aa2a3794bb587a8248f3b8571e78386817b4d5520ab7f2815cece3c8a1b2d3214b9255c768646446f8ae595d006d739d853b840817d9bfb429f193d7f2d41d3161c4e9448889941fc043ed77ed48a3413be6eb516cc1d5da9b8a0f7d09f2dc41952337918895925257405498812d653cd60a17aa274702591fe9f9424499c16ed1b8489feeec063008791d18175aa1ff20cba01e8002860dd4fe23b4ebd31514f485142bf339c4206b16628c7d02e02fc9185c308669460970c96bae8f051617e2da07a2e4e00ece8092c042110ab343624aab027be788cd0cd694e3008a4797cf16026b3acc55a7fc9f209833dfdba97726d9bb0053f5e77390936321695334cbadac6889eca00fdf1015c6996bf4d0eef600359ee53dc8202b236623d787d426109f09970a828b1e926f843a3154cd1c36e61205f8c55b38caba4a78fee34071511ae360972867b7d003d82ce3831c180288e85641c6b8ec64447bbc6e2961399abfa073354de98761e205faca20ac91af5ebfc6aa6b51c07c5133b7bb4735075b7512222ea05c7910e4753db69c92f34f6a49a7950f462bd40cd2947221ac1d4620163a61688ab149f123bc9b0695756880c668356ee1059550807549948ee54e8c453c24419f35fd01cd2d803fd69be278dd5ba251665a493ef9bf10e0f928754987774e03b7f350eb33a91e4a9d08951cca4e04f9e90361942fc3912807b650857f1d78f9abfac1ac3b7f37d1d75fdc30a15554b45a9021b3d1e014177516adc022872f4c45cffdae9b4f3e582238202cf8255b421772ff3f60256113a0ab459587b3f901dd456737bc4d67b27c2e9db0ad6b0bebc925fd21d0d79195828cfb4ee0f84e17ec038ecd74d4651e285ef4b5ec2197f0387134470610c2cc373d9320a67778cfc65abc7b845fb1f6b00694c3063646adc52082b5b6303d24fc2e7739c7fd634b50fc648ba63d1cb2ee2bcb0841d6b8609001810dfd6ed85dfaf5aeb6e1164e70d306d1b23e78546432efa540341d0e9ca8bbbcd13381b355442a8174969afc2bd6aa086c32dffe2af9c6382484c76cfc124a17564499c5042745c508da35d222183eda7cda26fc0b803cfc140055f218a9654d75ba33c767e87d5070039ca2f8578fd13657c193c961bcfb1d9206fbdf3f5513ff4902b7d4f40437ca8bb6e8c28263bf5f8902db69a5b28b1c7150cb53d3cf51ba9bdacda6bdb19097e5f646b68b860ade8453da30daeff7300a8cfa179a76605fd5375ab8c90ea5bf2e1e6aabbdc86d2e28ea3649f81cce2ba7dc0d11b5a4a4bc800293decd4d28a1bcc27a85e8cfe43b5936b706452f2868a71831f416f02cc5e4aeb7804285d1ef9a846b79f4fe93783927021c7beef6e0fd30921d9288b47033a54d3dc425c8e0668285b5ba9cb8210fe77436133656dc5539d9660cc30725fffa7b571ea644de8145387e4ef064ad32e7dcc7d5de838fc90fc92a6c81f21c0809efecabd38d74b79ceabfe54b74e5d8097058e224ff750197f924a8b1164f1b334c512bd32549ddbe6773b2f0e0375dfe2748abd848b3b184667d90b834b7e6c99b460d040c77c8ad00c81bbc29c8f3b123ed4c2a1e780b8b1b3dd83575bcadc1117fbcb1182c7f70b01cf7d8083285902c9c54c301eaebeec38efb54b99f9aa38442ef4221ec5d44aa0ba33cb1489a8dd22c9d1ea5e9fafca3f3f33426211b22f289986ab9a7813ab430cf10f49d338365740c4f883068e84d3fe73833e134433dacd3b14b2935514200bd980bbcb10bcfdec9af3e5d3b4d8c0900252fff8268936711183a0499c0a882776626567bc04946c8e0d9823c5c5f86bb185a0fc5288118bb001e92cf51301accb036a766ba857309c11a539cd9a8c737e6e97cac1f8bbd715015cbc48c1b99c23cba7d67173dc720c0dc1d590dace5df8d8d5cf180680400804f2c45da40a0b404b778d8ddc9c173b8bdbf4eb1b9a0542d65adbad7523dd88f59295bd03f50a200ae609d43e6cdd1b293b5d0bbcb4956b816a0812040e7190810cc62023481038c461075ba7ced57090c5bab32c8b5e52beeacf66d41f75dd7d63b4c9ca2ed8a2977c8f980d1f57e3dda26e43d126ebd6e91ba35e6d92af7e12c9353ce8ddc6712dd62d322af5971ba7928f1e64917899f599d661e38c81ad4f9a459bac22d8bab44eefe3699375100d1e8fd5b5b61586f5c6e9534e9fac37147d7246aab083adb7f5d6e95375eb1da485f4093467add0b2ee56ac4bd33b202ec840066390b1923bc755d8750c526765d1c3ab2da9a053ed208b69cf6c3c9c1d64afbbecbe2ca82b06a9f3b47a8f8b17bb3388417f435c8d1ef429bb8f8bd30787aa5d76631b1183eef3712df3561c6a76d0e7f3f3d1ee6c5366ab3f8bc4c32c1231da2178feb2f96581e769f582b4693e5aa1e6c6c1f3f03e216d9aafeed369d33c48489d7f3e13d60a9f4f5b61d4fc7cf0fcfcf3795cf4c919e9f9c1f30f499ffaf3af8b3ecd3f2fdecfcabc349d0352820a5d28230c508c80085e9060e70b9d261c0e8ed00114479430822a70a290814fb8802eceb03332852ab2a0ceb1380fc0172a5e9e09d01580806ce3dc02dc02f28f7eefd4614054dcd732311f41f24cc42ba9792b647967c239269c63c93d7076ef83ee26af7308706fecc69391d6c93c0c8807c4c4fd43fe09920c13f1d47d62ca309184f3194206135a74818538f8408609797dd08fd739d7370969d32dc3e0ee208455555537cb43096704452ac6282384a00761105fc7186d8db5535d4be30084fbf1041f6b2822f8815c8d3550d7d4f57bb03b42186177144b8e106109d65c8f8c0fec2fed12f2d4d481738deb9177583e4679e59f8517b284e006f725bc8ec68178478a808377c0ee481074801f2604fcbbee7d9f756de201c4447dd712a3ba4318ecb815e75c942fa78160d838188e81e15be2c5cf922e9068e183240b1e2a76201188b409baf7e99302c321183af8749c83328eae2863bcbca368b41796f1be9c94abc2531f14b83ba70ab424457d1775d8450a81544ed41c8dc28ea709425ccbc3e9e1d48225dc04c1810ec0288243a23857494949ed3801195730210963a8c20c32d2092cb5208337217646a040049ceb6b00a1ab01a5947f125e31420863c326a08412c2e08b9e028c1da3c94463655e2a57cf27a68b8d457c500c312226c6732850a2448912254ade53222191c8c37371f10106a6e10afc699862ad2a6d224529dfd5a62fa4a328098b403de99c73ce41e81c26c66c0921a42ee79c032581f00b28a18430f802070f52a336814465a8ef0e3b233d44c08d3309374c7681f1810752cb74ec136882a0901294402767d6c04108a1a4c14b69d82357022205c337ce18c0110b9a9d730e7bc31bb273ced5ec9c7330a2384751f20444616f787087424275f8c12290250df53d8ab037480a140251d49049adeda2579442aab4d861cc1042986b865508218c43b221d8513a62502feabbc420bc2808af5c2b9dd939e7429568424c0c509c97fb8bd81b9e6ba1503e40c527282227c567082194422e512eaa86fa0ee35d4b8c3146d21549e09c73d2e66aa22933ba94f21c55b97ef44022189ea601129971772a4e25db81064e2861010b5e4a69872d898f167ab41fedc727894f8f4f4f95c3058f114a92f8e8a1e487f2a161d8626707469c1520300e315fec0481e30b1e3944470706efe5bab9d181a20b2d4419656c839349c299e49d847f91a2823cd722df7b2f084adc0e752bb9dee0fe1454efec54393b3b14a887b49016d2459a481b9ac88cd6e99cce494929a9901a8ac6699c1c4e1a48df00c04472d1cf89fac6784bde922a873a8288c8fba1ee4bc244122d47c9cece0d81dec3c3434a82c4e7a59476d854562a7557e5482e86b02189cf4ee5822aa75a817be91ec852c560a7e7dd1ee91345129f1e9f9e9c79750f1b768eec28d9d17292ececf8b0c1878a224a8af8eccc21497c0670817eed80ec13a263f2880c69c3109f2ae70b36d8a91e909b1b28701ececb79cffef0409bfa4b709f1640828ae0e16a8c5092c4470f253fa4d7837b07c812bbbbf7e29e7bbf17e9f32417decbb5f32c9ca54fe32b0bd732862174f4000131bccfb5c84b123613ab1c1f2df4482e70bfafe05e7aa777b6c0fd3a7af7da0141a1e5f44e1fd1c0d07eb49febc8b513c4b58383c700d8cc1494f673c54e15ee45fb71da4f147ce610ca06ed4703a35fa8db5a744f955345017f88d9a1407207644d6fc377e08bf4d9f1d989402a8c8b8b0b025a8544424002dea8d61aceb9972a0a57e55c550eee5f3b7d3ad22f920be91304e9a372137b071e9cc0398803c3509d06a85b91a7de32b3e4645a0603a3ba6e99fa96a0a51c113bec05c27b13fcf51b01a597ab970a7e5ae8e09ce9e1f70e23d6a14913bef0d03ea460785da40c4cee750a5639c197a85033093749a55f68b42905d5b93ee92061bfb8031b6a44709f4a9c364121713004030443a540b3e7d25c8d12894a490259a6784890e05ef233e34ab9267c9133b0bbb4cfe7f5a4a494544825941c4e720080491c01002ee76a8cb08b4ad43c7be41144441e0f646979df4ebc793b444e7e4833ae1b7a4320cb13f284e45c37a4339c1481533c228f484a69874d2587ab62e7248ed401435d995a983d1a769f57702f7d33b7c07dddf48d0e7d33802870963a59df0cc9c1997d134447e70cf6c29cfb7b51b429e7e5e490ce2080eba6c685a10e653dd0c3fd983c1c38c5bb1980e9824e3c4c6f6870e3d660ba9cab6155440ce153040f243502c08c484280025c3bdaa4e3023deb034cb43fc4ec04c182e170342ef81c1b212c75da2406171309b311312ca3be531a170c436db9a0e89e3d4170bf97702f12c7e19480d40de390f5481c8863006c666ad1a69e3d0770b99cb86eae25dccbec81ee2a01c6c149dad4a75fcc1ef8227574660f6e9d8b05f4001724a3ba48ea8e74dd4096aef3ba812f52ea489d8a53301b3a6009c7d0399c82e482804640025e025414206930a58e8c817bb96eae9b1be09b8b0537b84f1570a9e4504a99414239311989425bd5324c452302fbb2e0e1d87d899850f37167d28a09f6bc0a5f53e2f3fb6c538587a779b75eafb54d599e3a95b6ba1f183ef6e9f5e16542bedd354d1718ca3a29a5a4e2bcd90785df1d45494aca8b44c43e280c9740c518e19b079677363f9328e74eddfc0eba2ebe471d40178988e5f5219740679f5c84b54d3d1bd3b4cd4be2f5b342852cd53384cf411607af9450562c638c1144cdee17af6b5327f16c402d85502cbba8aa5956d5c2a0bec87e5d7f325776818e6517e894750abb40a08ab26e84096f5a8781717131997e12c97aae79e2ec9c802bd0a9492beb52d47556b01a1406daa7ef7a587c6333f1d008f8d23235e08aab61dddd08f872ddbd077cc1eeee01f842effe6e1e0e7cd1eef2cbc1ee3900d44503770fce1d80ba483c9c8f3bb353606ea84f0523b5a94fc22a809dde244a147832f44f865e9c4b063b4e940142dfc494790e01f3977d328ded8832d86d62094d86be655c9f3055391987cde8a0d73904cccfeaa5a8f054e7045c7d52540ee784d77de18030302e2e26d34f22d50a9d80a74d133095235ad7b996f998ae4c6dfacba91ac405284881a11004f7af3ea969bc8b3eb0275467f3083ff8787d3c3c135f8a77d7dd5b781b0944344ae9bb99d4f0ee1d3e683530dc92f6023fc70592a7858ec7e37a7c80a1e10283dfcadbf46cf49db3f9eece479dbbdad47d0a2ffca27d87afaf1c03921e8ba28c608104bb31b033724511f0cc46e05c5199c390a8d71ed3206ca63aa8aae66d13490c55fb9cd76cc8671fad693eb076b3f61a129e9fd88cf689cdcc536d3e6dfeea9728336fde4e37abdd7ce1aa3a5c9d5af45d9b757aebf4dbeb29365381a0db2b4c085019659441069eaf303b45ad4838a2d06758d72cb91ef4cd76e0e1d07569340d8b2ebab96684b53beddb65730dd66e7669af872e9bebad195d9af64bcb2e6dae51b1a24ea9fdd22e152beac4b966946b46d8b2fec31035d87d56478621bc600a3523dc81478621bc400af0a44338a0239b7be05128865eebcd3d70bc597bf61848e96b7de86f53bd66473458ac35c6cb1beb43b54d6e641dce309b6d5a3e9eba972138feda4207c79f9cce580fc74f987b601f10d39ce41910b81e511eb7931e6f36b91322de139a1ac6bbb6050ed68e72ea362daa33c28525d45179392c077dc484d02e6f3ea2e20e94f0066c3076f96a73c5b59646a7091dfbe8620fc58a9dda1c0a62fbe810bbf5d5462044ef81437f1804eae32d8d5e1a1dbbeb5b1a5d1c8e7e443f3abd23ecd86dee1173e8201c0f6ff2a21b85d88e5d9aeda34b8372cd47c4daf511f176518078d7feb01c28d7cdb83e20be2eafddec6e34b93e203eb9bc6e7ef8e4c4e62470d434fbe4558bc02188230432f6ec03e2939b4540e7756133d6a36dec3021208eda8d6daaa19be57d405c6ff601b1c79b7d4029922471392c8cbd5aeb1ac466acd1430f7df64bca43a7a120b687b25b452ddabec9af5c7b66afd0b3a7d807d8e052769af8d0b31b1f7a0cddd1c3d8a5b14e0fb5fa770a81aade61750be39d9eba4d8cea8c70c107d3d7d0cd363874cd4a9b7b949eddf54bcae5e825eb9a6574f3c49af6141b0343b6030f9f5cda6c72107669ea698e7afa98c681625ddad0b7938bb4d0e54397b72e76144b13bab14d237779b36b56f413bbd9c6229b4deeb4f4997e033638748c9646cf3e3a664597567bc8e68743af36f7d0e445d8334ba35d1ba16f21eb2a7df5cde624302d69a791afd7e4abf68add9b93c0f4ee3e22beee1eb6e8b5fe987560f769338fdc033b1948592ae27777440fece399a0b4a8060ebe9476c4cbcbfba3072908614726de4666254f8c659c9005c2977877576373351c8c6b71438d6de20210dca701238235a8220840b0865d1540d8021545ae788317b800d85d2146cf16b228d2180fb9061901cf123dc08e47092af061b0e3514209fcb0195292ea70742199a13ed2914a5dc50378deb2d43a0284e7a84d8f349f835975e9d3acfeaccaaaacfb8254f6e9d827042399a13a2c1da6aa14f4452eb6d003ec8c6c21887b0276467cb4c03e477c88809d111f29defb04d819c94214983a6c8614466d9218b5678cb15655552f0ad50aab5393f522bb84e82308457723d16b155dd1a10d5d91752e2412d9d03641950ae9aa37bbcf9a150bbeb2f015a9aaaaaab2f498cdd4081a0add0b428bddd91a92116d7ad5d2b02e968736bd63964711353d7c78e0479b6edaf4569e509f0d860ff7ed77691e91505b465e8c31c624505218fdde83955da2ba35677587ab4b59559f96ba950581a80abea2a07cf1c17e4d84929690dc509dd5401a08ae7f63d806d2267752186a3fbf31e4730275d306b30635d246822576815e14fd78a8590042df31db54f44e9be42ddb476c17e9534be04bebe4b9a4a990ad93d10b9bd94eb199581d04c2b0776c591476a3f1bc5dc4b5c81f83148220688222764bd3fab4fe6ebd7afc0b5d988dbfec461d75d784a61ed4ea9af23c90bdda7405a9daf3bcaac7d33ab2be563aaf07f3d6fa5c6793cecabe24cf8b36c936cd99d783f9987e5df4c9bd2eb0cd5ef911c1f2d522117116483cdc05ad288f1fe81fe8a66b6a93c440f7e5c4a0fe8736c9c750e8eece9d82b09909df14a1190a9b99f3ba669977d87ff4e9bd9b79f30332a93c18959d56a54d3ffac4a34f0e7449f499847950539b30d07d90fa7ee8d37b45da244df25d041403a1e3c1f254def4038f1f34fae5e55c389be27d39f0a58b4016f99c1c2a64f360f972f0cbe9d3c3f22f8a3ee9bc207d6a2cff2c88d484aaf3a26893fc65a7652fec30907d3951a8f15da48bc017539e5517298265147d023da64df0e5a5c0b1c8bf00cb1a60f97480e5a704dd97935951fb8d04eb511828e90da12e62cca2c2c7088f03d2b26b57c52ed03550051d848140200df301040a02479fb483fe114905cb2c098cdad7aa3927bd75bdda25ea374dab775bfd75d55baf59ec569b658f819ac56a66ad57eb9a745ad5044951fdaadfee3e72995d6953f5cdbe4dd5277c095d1364a95e5d2ad40c83ab78d24a4c9fb2e9873ee55110d571f4697b75d3ca4724953e51afaed96a496dd8427689d045db16128542a16fdb43db160aad5497c6f50cd9021731c668851a218410768443fc8b943cb54bd05fced13b4c2f25bdf4cebedbfd685beaf45979a3cf2bf28ac81e299f045d242595a74f0ed34a47474747eae8c097c7a3a3a3f37876a828425d5c8dc6f13442ecddb7f38ae8c017f730ea6fa74f11ca59ddb753a44d31bf2213042bf5768ac0972713ff5ca650e1f3e3b1fe78b2e8f141f292f4a97abc65a3b314bb7a5210d473cecaf378200b36d35b14d5e2c743a2b563a5ee13d2a6189d50e78d8d2bea4e9b9d0fce35ae8bf8c7d3a6785213ea9f4e9b3adebe3c5ccb0c20b51fdf8f86052c6821258c1d636c28a59452ca28e5a594524a299f6551e365942687c404d44d1ad4154a0faafeae20038c2be0b004bf0059422ba38c32ca90b9dec465aec7c3f4e91d24abea4e711db12c6c86dec266bab2d84c05aa287dd88c35b119ebd38216a4af6c1146d4b4293e623cda149f45a1becfbbec9060d61b736d82af2a58c10cc3e1b0754bf034efa0bf212c116d8ad7b0997977b4295636c2e8e893d301ab09133f274cc3e0186164506132e835245c1d6233a0431008545dd75537f5e9651a38b6293ef38089d057dbead4ce3fecdd790531f5c9d1227e30a98a6afde1781f6262daf4ee439be24136c66751c0d49577b635054a9242adf092a19f7d824a6acc7587c4866a1d9e94325fbd3e4a658c71526acd496d45e92deb3190da8afa659dcd93c657708c43c04214b7375c6377ab6b81cf786aff86c34068bff7deb37d698f78f13d2b50d72fb1022161f9a4bc9a05cba010ffa87cf1a7c643d32b23be273b6647628c110c38de0c4ac498e1e15ae2edd1020c086f063987ddacf14d47273521f1708699f085018e25de09150b1cab00311b8ddf85712df1194f35457869b4c9445a83c9217962feea5375eddbddf334b569be5a1a6d9a2e90653ebb34bba256a7ef550fc298958080b81ee2fc03d7eb5c4b95f554f78419f4e0ea315d8407fa94cfc3881e7da24e03cf673786cb8d0a9ecf2bf36ece39a763a99e64e70757f30e2ec1d5bc0b0d93ca572aab59d219ead5a679f8ae27b1a1d63ba9655957f6cd2eb13d5455db5d687b966d777b65b5bb55aff531b0b2da56edf52d4f7c65d663fa6db2e8cd2bd8a2956d152b2a6cf8724028a06ecea0c63695b4bbe7e2ee44d07a365610ae9858dc8834c305e658a73735bbe0e8925ddac567514aadca7577162a252a7c9c95ab61639b64846da06f7959575c97a0cb5799febad52f7a5d17bdb14d204a3e315ce65319d57fc5c462c532aceb029be8573f74f17233ae4df0107e240fe3a1bbef29d47375eb5a6f2c47f5b65e75633ff6dd0a6c03cf13526078eb27f7a2bbc4665e8cfd306b05f4f1a33ecd7035feaeab0e7ab64eef3c7d6339ac43d8d80c0df9616c52939a14858166409b0559cbce472c740a8878044d065c300df5eab23a6633b665ec1676299b5db00e1cfad5a7bbbb3e3d0a4481a8570abe80443763b7feb099d0053d06d6ebf2c4d975b14d57bc9cd7d150b7c605cbcb08b707ca29829b5ef0b683153ad78f81135ed4ddcd2ed8e16cc2f9b89d9b591ece79c1f88701d18f44e0e9eb1ee7836930b2c51652088694d6c7ed3183e027d3e2cd526eb24a79af2bbb306c54afd33ac2e2265f85c8aeede6c862b5f4ee10ca7a5ddae52b65d296b2ad94dd1c20f801c10f8edfe841772ea6b5abc253eba509d5c81c5c43378eeae8c444848944d7eb69155db566d7abe8aa597573ba19a5b496c491505c4dfb93d9cd42da103c7a66b757ed6699832b8e84a24da15b2d1d5c6fae9139979452ca2c7bb5d96b0eae525e3657f65a23732e795d19043fd925737070ae91391cf0e1001210fc40144c0147e640144cc10969f2aa097e6239cb7a24dd42b965726b64cda86698988c2ecd3cb1ac0ac5a4aa500e8f626272b3cd89cdb2939050286c66a2e4405229a188be519195a74de9a539b68b6e88463883b0a45d1ba2d367b556cbaa337ea3bac975c16bc6cd51dde495098511de61418cae6d303b842420aa6f971804b2d35b82a737f9664bf0d6b750a804af0d93876eaec1a1ebba6ab5b00480df48f90c912842938b007073a47cc6534c3ec3da40dc0e7fe01b2637d7606add5c83b7db600cc7ab1eb76a240f31214687976674edd29c1c3e64473007d2e3a14a09e56194c7340ab5145248512086cdcc4398d16955425894f42cc226df5c0fd73b40dfc4e4b14f2837b9c9af3e9ddce4d5d518dde4d735b1d8cd35183b6d4a6f89be9463bbf61bdb351b7aed37e835cdba90ddb094a31cda2ce5f496721cf1cac0a3c39be3e961bc35231b7cd9c6d7eb21be4d0e4d22d2cd8df385db24dacd1d40746845232cbae814c5c636897e622f5b5d8be831c6d3df889866c77e23bbd8b5c1d0529be1e15142779816d32856742d74739c1cfe4474288ab7946374f80dc0152cfae8d67af81b15de519b442f470ca4f37a9810f3669bea4054d8bab32ccd0debf51033c136939bc37abd55314c9bd65dd96360557dd2ede69a451d7478a6838d81a053685d9af9aa9aaf6c9894b0977288befd8668bbceb5d4db60df7e03fbb66155d49875ccbe32b0c342a1cdba39b0c76374c36e29473cf60d60b7ba96ede61a8a519b785db3f426767bb419b57974a932f0292d69bf11baceb5848e5de75a44b7c1da2de5d08efd8676ec36385a6a31ab59910dd91c31c4ea2956aa3707f678a97637a0ddea5ae8e3adae05bb0d7698766f64d8757312f8d68c6c66acee9cf6d50c1161cda16d16a8c8661f58b4d507b11d5e58bbd94396b59dd426ed99155d7fc7b457cd3a4df6ec6adfdc85b57b89acc3219b6bae4b7643780a6f52c186118300fdc921bc79d4b0b5d368e5c9254476cde64b2b894eb3fdbae85edf2ea83d06467bddb279135d57bbd42cf40101edf09644992d897e3ddbac5b125d1c0e97b0d358171dbb2a56886eddf9ebf1db2f9b7dc0edd415e38597bf2e4dbde8d29c1cda1c6fcd85eb8d2727903ec251a42626105e1bbc4ce0637508af1ba1161b42086f2545856fd1639f4c2efaecd3551289be91eacd57858f305eec249b3d74d578131b3a0dfcf610fc76b85d384765b9aab2ac0b678f36fbc071625966f268f3e8d45bb34eaa6a43d9f6f8edf1d5bd7e626936914dc49ed9d04d6cadb671c8e6d10559d6f66b131dbbe8970d3ddaec9bcd17d9eb98a5a972cd556d4e22d37eb90b4f9b89a06cf681dd61dc0116769005786baeb7032cec000bf8bd515a44443b25e54a829151461965943832f94cfbcb44230b65869cb24a92bc34dd4d4a29350d463b9172c6890909453bbd26e54de44fb24b4c080aa35d461965945146a93d4a6ab376a965f4d2661c5866b7147af6ebd49642df4ee7ac9544fab3094bedd905cb5b0addebdbb75fc781e9af18282595269730583e83c1f546931c263348379e8c4652cbe42533f928a59645994529a5945264330e2c2a997084c1dacee4a93d241f930b8e37946d39c4d01d24a5a8a8a4904eb2d056b32c7bbc19066737d7c0886cae81891607ceee6096f21928d648a472127cc9e1a519249c652a37bbe0eca6904e6efe4d2e2e3893e273b00eb2441c301126cb70e078cdaa585163966559ae818938d7c0c0c8247c727060f75957b050410e6056b050010e527ac60c88c0f4541b8d6aad2bd9cd2b389bb3de4c048e376738a28c32ca28459a9477a566a566c5c484141a1de5c4047b3df6788a65d94352bbc484d84e8f3ddabc826316b398c52c66dba5f7f231bbc8666c747a983d9eaa44c4cb5bd2aa2d611876ecf938c3b69b89c0f5f46622b0c4b29168f4ecd28c4e6b567076b98247a12c44ca504e4c4c4ceab3d3cca46619cd4c6a463322544651ae886e83c6e401471f703c6d3836ab3dabd1e4e61a6f5e11adb4a966a512b1729c1d4b152c557036ba9a3431f9c8ba36896eae99a6854426cfece82636c748448428746b5688a859a959b189c2a60811304ac4c0b302a3440c5798e8f4c0548b999499b434d67aadde614264988f88b938ddbc446ed65a7f851eb5fa4c087aec992c693707bdd843365351c542af3db057faaa95b69b835eec66b4da5c1faaa2639746f4edd25cd4fa88b8fa885854af8a723232198db25146b35146b7edc2a1c77e3964810fc51c5abc35bbd963e0ed7679d10c1b9b25c6add6dc036777998c8199cdd6e899157d647360d9b5cde61e18bbb4db4356d36ce3cd662bb3d866736037d324c6a3c749572b5cb732eab05a8385c8ba6e97f6b23287379b6b46d6ab910884cd542294110dfd44b45ddb2c755aadc49e5d6e87981036d67a1ae333f9cde6118e37b26fd9dde2319bb72042cffee2eb633c959766b3572b81b09e5db3d9a3cd3510d872dd2cf60cdb6ce6301bd7b7c774b6ddbc1d141f311c0f876e09117abc34a16797863e7eb335a3d08d11259e8846373f2c1289b66c1365d84cb565d5451f9663b35525aadae36dd49b6da48d527667a1574b5fe10ba94a291202bbc36eb455752b4765b9cb6ab334d7ad5bd6b76b368fb00cd94a2275bd39bb7be824abdd3d066ab66684b763b6030f5f879675cb6ad76633ed8de5d81eaa56bbb4a29b6b9cbda1bd3eb3f9e5d0eaad57d7cd6e6d8da5f5b939ec46ddaebbbcb4a2d6ad2afb7ea831e9d1109ad150dce208474dbbb906c79be5af07d0ec4f74074377d33e437bbc798435f79a51362f93511d913e4d1e6fc5504e3eeb28bbf6ecf234c34cb6c72bbb4e25bd6ef6f8ecf1f49bcd57fd76a8d99c9d5e29e5f678bafd0a85b64b7ffd3a7da69dda5c83e345aba6dd9a11a6f5f4d2d46f9706bb6ccd28bb35235c318c6482723232198db26ba7da28d3b48b3ebb36cae8a5cd5aaf592f212c7c5db3d64336d7e0d0e1c4a2bb7e119d8a6c1e69526553b1a26e36f4cc62332e7a76d1b73bcaaa4874f308cb9b6b4617d52eed0ed3b45c333a894e55645d9b4237579c6597331ed6f2712defd3d6206d1252a5681319d5c55b757890b527f0bb86e36af45fb67cf01b6181dfb34910f07bca88c7b5bc5bf5e406bf50121bd4ac25d1c1cfb9162d499ff2d3bce853b6c116cef7e96a48fcaec3d5b8f0fb0ed27c414d2142abe8cb1cf852bd2f756e758e051ef1c3c6c4477800471019478e8856b0c2c37bd2b21c6c18d35ddaa4c38ac6d95981e16dbc1efab027bb0cc1b3c385089e223c38a09125398097455871e101c6c5c58507d31ae68448be080327320192de26d8a436ddddabf880e17da06c6dc39c334e41e79a389348f0a59f4918f2b89623520b0872ef6a13fc73ceb9e7e9fe2e854c2785b83aaf5961051f943e9247eec81ed98321cc320b2dfa942b177dca328b2ca490474222933c9f48466d1aa0bf4f9065814034468bc648ab49279d745aa7a716ad267dd47ad57c0f142184b18706234904ab401aa636c18751b309d3e897918c8be9674f8243854f1249124537d5ddb161773f1f2d26cece478b1e2d30fc8e1d238aa8f129e23344083b234b94a8579d3f69d079407ac3c145ce14f43ac862a71b6acb0841efbe1bfb70406fd069fad4df21f5dedf71dc73f0efe6f90ac73e206d82b09aefa64f0f3704dd2170c4e8685317d103e44161048f1f15cc0478f3838304489f72863c3e7a55e9539f4a431a702a139ee003e4094ee0f9e1e1bdf7de7bfdf76aadafbe275f7cefc1b8146144cd73edfa21e1d127238ae8534dcc869d91307e2ef845cd13ff18a14fed4c71081842bcd0011dc1d10113c8a879de00006e1db0c3812ff333167135faf21247aa20224182e1092cdf5cf40b2807e2b81a3e7da24045201022630c012383847801cae92e3227a80008386329000396e35ae4295b648c213a00c07db31dd7226f8100804139f0e5eaa259e4bdd00143c835c6100c08112c31288a60994117121b54f96ce56cae2584df6506705f76565dcbcb1ac055c62ec5f89e08cbc3c8ffd02ff5477ed405964de4f202cb9bb0a444ae50a20c9c7dc0d25da1041538beb638b8b064064717b41c10163a2aaec6c36e08ee6e25745c0f4543c618a939e78c261bb344ed43087fe81384f03cd429cc2851d09287f8c3abca3a8aeabeeb6975dfb2acda17046fdd5cd909840eb86f3d768e135317c77589d9d10349c55de4dd21ae8e3689e250454ca87dca0e49764930cc5007ac14098ed0c0072700bb233360014f0c64e93705765789d88c6c4903c73b0804ca6e078370f409741b34a763a12c8e981f8af0809f8130e6071cf29a98d03038fa9479f821883ee58833cc47d855d1c40e7026e1fea93d23a0d28a3a038508a17272346945cd91087ecf9108122418e6c09cdee99d9f9f27044b2beabb931468660e3bccc63bbc25204c72c67d2311d7d28f92a20a21e26a0000bb3b2427e84cfd2c81e077a9843b3979e36ac4bf0af77b24e26ac0bf7b02217c4ccb246d9a8116091b33114288d9a03997479bfacdbc6761d45c75d250f39c8dddb8110f3118638c0e8b11da0a678a939dcf7b9ff0aebe1b34c7b5f4dfe5e15afad4bd1b54bc535097e2c012059e8cfcc339090cef14f20e0159fa5bd42c7fe48fabe17a09ee4337066e4b0ceca880b3a5831e827b09ee678a236524176abf678a83fb55888505752b940445cdaee7e9c09dbe8333c98bfe6edee545f53fe04ed499e4330d9c5d4fe5518411357db22edfa34ff4f23e3ce06a80aa6907d1cd34707e37373979bdb9a25c0759b27b72dd5cabc97590851a5d07595a5a966559d082cec54f37e785e78cddefbaa2e16572353abeb1bb8ed743bcef4602aec6bb6f04ae455edebc1e5a092c0fed93e2e950fb84bc202f8a97f37a80e5a50edc1be25ae4b7a0ee4df5c2fb21cb7b44b4ae98a054d39c6bedf201b5457d315eefbdf762bde8033d51ed45467dcf454949498148da73cf39e7faf57330d80c7487ddceb9ca39372d6ce6bdfbfabdd7efc57e8ca018f328b6fbc1efd0a2f4c29c735896695a7597e65c16afdff411e3acb0db5137a9d3dcb1acdf7bb1e17b365ea8819ca8efe6ab6e214de4466fe4b2ec974c42cd3442319baec55da3da8545a8f5ab19e8ed5003ea56f2dcc1f1f4bd39ab7b4284bc5bb750b3dbf18138f0257b3ccc812f35c31807f408999514e36a6038be7de04b0fc8123f67ad2452fbb81f1ff8f2864096f83a9f10c812c3a8b97d7ce41635bb1dec625c8d77d2166a15707458e087a710f882535e7c0ff8f2bee058e2cb30d750c3c0f1e79591d34e7cc6bee2192a7d3df4783dc0db3e48b81af336175c4beca10313cfe70a3bf7e96a4c1b97155547cbcc5b8354f87e5f702f31af0c38be35e0f8c27865e0e88410c8127f980359e235a8f3d23ed7cda66fb76e26cd7943b56e2452fd6f6e9f08b44c76210e6489af3eb97d70fc133267ad24d2cdc753481582233677aad68c80830714903c8b043c385e7fd1314660e5051f182b30a26c425250ec9c2205b272409723d588cf0ae8a19f1180ddff6849ae057e88d743df19ee0090bab3c4052c2f8fccacb8a0130912243c201213121e104e242624538c9a9764c78321fc10f0451e1e0784a0ed083850388104cfc0ae0a277eaa788310ac825d1562508121114c352ee9b86c64dc557ac5e46a3c5229fef43fb0cf4bc0c990200bf5797f60f7363277812cc7d4e7eb25e064eacd557b7691324e263bf55e295e0764a190908093c1717fc44016ea978dcc690fa6ae82457532d82dedb83e7fdd1becd7e7f54106644a7d4b1598a7df51d5fbc3077d77ccd3fbe3c9ccec7630f592fcc3980eec9674805eda711df4eba03f19180127739d464b9f730f664740fc44486aefdcdce01e430f106ef0659f0e64a12eb750f3c38143cd6e49e40159a86796b24e51b780abd181cae3f5d0778a7aea17702f409a30c960c721c9d453efc60138243460eacef9800323833dbb3560ead4b24fe6b22f073e9c3651d5e737dccf0f47071020d7b303a1d75e8aafb791c12c56ef0fedbe9dffc82e0fa67edd4686527b5922a578ec3632454af19622709d3ec6bb831ebb425e0e64a1de104cfd7a3a98ba1e0e64a1acf7cdb5c45717b2c4832e2482dd0e495836afab26281247bc32b0bb8f99b51edb7fb603131f012a230e37b8735075c09769723552b0bc0b7cb15eaa4b88e4ef3b6550af63d52d4148ddec92c067f7070fc8d27f8d29b525f7aca7e49e39fa1dd6e9dde9fde1037777d067f7870b6491ff21a909b2c8f71b0e2341722dfdcdb558a787d86529b5aeb4e33afd75ef2cedb8d695c09371d0edc0691b83ae0b64715acfb4e9963ea0dd327d83ab7b71ae5fdd05beccdf1d06be4cfb642c5bd9ac4875b8a40348ff7dc30f97e47f5cb73e3fef0ffaea3632109bd1010488f5eb02a94e6f8c655d4af2f436323025794b11b05e7d8755dd1f3e907747757a7f38c852dd0a5940ffe1208b751d64b191b1917132d5842ca0c7b4cc8c42adae457e732dd24196d9f31a96e1260bf575a9217ef7a14fce48178a9c4ef0bb113efaa5ba7946c0a023939f038622383b24f8c51e306c01f74faf87c68fd4271ef0fb3ba9bcf3f07a805fc12f0738d3984dd4e30c63829d912ea4c03c38c36057450a7e80dfcd0cae3ec9964656600228e6745f0421b998825d154d780193b033e28523b5ab60822dbac84113c468a20c49641e0ef0042e1d1e4a46f9b6a08626ec400d443035e420e6a0861d50178646d410030ce1492e8e67c3ce881a489086318e604fa75f5f0f0f3b200a2e96c8d077b575000970702353dad18787f7470380ecc8b48d0c75ddfdde83d05559b6c1ee005a3072239344bfac05d636f070e8b34ff3d6318c52ecb4af8d3af80923176070d105de013b235b14b1c113bb01a25ea854cb988a8b1a650cd188000000011315002030140e8904a3e18020a87aef011480108dac4c62449889b32087510a19630c31841002400446006664061b00c0497ae8d130665179b0dbc158114d3f880b3119da4a60013541de03a980b8448eeb53b3221a5cecd288ace50bc4426564df2241db17894c82231cae20f6ce9b98499589cc461726626d13613c960a7161fb1314c8a5984640648b3c3cd45cfcbbbc60ca865fc6f521360718b53b3a072495148d4f1ec6349ee1a9e557944c254bcd103e3b12d8004dd42d2ba37a614c0168e45a06a7bfcb3fee76e9bd98c51323fd3c296e675dc04d4c9f378f33010d4a4bb87346463c3ecc6673274632181df1dcd3d1445d1dc8fa7e894550b4d08cbcd6d98a579567906320914371a27ba96756c1da306e581e2fd8f7fd0636b673163f43bb5bee9b82b1c1eb893f474d4e5de7a2712d55a1d9f6f2476ef9dddac23d4d61a29403931e7f2e104d14f0c866254198ed9ce2b2ee0d86074a288b8b42eabe42fb7b07b11ea6de256a3f46d38793be08f241ee45ac353e0c733cecec1d7b70635de0ca7157f3dd63f007647bb51b243e87126ee61debc93b7cf64630b68894359601f076878f869772b3522f9b46bc23a0fb1c44d523ad8ac56b771aca25fce7b5d34096e53f03c1aba7bffd205201232c6ba193e0763a885cecb17f0553640a00b88a3492953af654fc2193fb940cf9d07f7ec64b4ef02909485b4020d56ec57862369a9fe4f4145c6f80da2df8daf49392435e674e16c33d11fe5a978cdc727dd4285df4d4689cd8352e1e8b70cd424eb6bda7bafac3e2b8cc651f6c9890e59a1eb792b4cb4b000283819793392f54932300bd241249f9b125045e53a1cc46852a71cb73c944a32fbbc0c5474ff16ea5bc34e75cc8a8dcddaff36591cfd2161bb7c017f4a9378c4aaf8fc707f2dc887df517cf8ea7e0d5971d5245f501e324b4808b5f070f4f650bfbb0c0b5690ba19486ec5057dc4dbfafc8f61661e536c18a68009d901622e640f31a15aaafcb9a0159d4385e4970c52885409f9ccd5119cf2bd6870289b2726ebb2ef334374caaa2c8dbc8bc0040ec50a27e098c83891d522de11123a45a3725f0fbf73ed89bfbe51e75acb9b0a5e5dd6ef65f0f557fc87da5bbbebf1404e9455d446e0ed7cd468fb575925f16d11e683e36265e2b98792d091348bba1f1069f68695d4a5282b2d0a9a0b80da8258ae8683e003d9834ae693570c10475b6b839cf9556b4ab6a1bff06bbc1505e40d397e06cabc9b5fabdffd7f970c1df37c64694be2335ee2308e13308b4d2eee6f2362fbce8fb078a2afe217d3b68b83a4724476696db93e0660804675ad03cee5ebc2b44278347b043ccf7b0e1cf3a6cc156759c00b8f143981d0c9867b266be8d44216ed33dabc147482711b1e81308efca5e3a35af2ec284fc348cf6f3df5df0d0df0b2573717f7b3d5463c37f27240d0d05a5b4cad07fb75f14139d5b207df7e56d2bc92acc0595bee1178672eb6ab5cc2f8c61edd5b02aba7525bcbd6c9b8c955e57d3e0f5ea0e2ddccef88dad8b23d0770fdb5d896c6aa731267855bdae10e5d6e03d8b6a38e8ccc5d87809cfef0eb63bc3261fa2fc9edcbbd65f97933bf55792d1bb9c1ecd6179b6bac937a620f7262337f35d7e079b813cae3e84bb6fcce2d56065efff64ba2df3fcc48f09ff91c7ab0b52a018fedecab16b6b0782c3cf6b8d42bd8111affcf9f2e482c9c6b814855a674b0e173d5b62806b33b8043522286fe0b2afb84032d890843fdeb5602d42f9d361e74514abab73124fe0eb8fb5ff65339c9ab94df8a370795016696dd2783e9254addaae7d3c2a79a47a4b934e4706e4e64cc6450004a65845383795017cfb1173dcde89710f3c7cd66935720954726fd02cfe991823e903e44b7a2bb7e08d383b17a5e2355c4d5726a584ad5457c730cbd893068844a45f89514b2597fc12a5940be4bb6188a1fda31ab3f3dc340e91b8c062865179817726893b2829ece032b45be6a8f39d3e4b7854abdac4ad533414a7c0c1126b7951135e94e5ceb0c34ee482b3635ceb2dbf1a697044650159965018b7ac603f8f61a0a392940b2328c876001f28a0f4bb0ef1fa4ba2cd69a9d313348e9b8dbbc29868c9b7a4f29d61a808e5caf27d80d128238f83d1cd48b7812c0f454988d61dd1f0e42508432fe2811112dd78e0c89eec1d3b1695d3ca2a4b2f026acef294a1aa5c728805a0432e1f7ee4575de49aa0df078b1cc52b10a510a26bb0eed096f396e0c32bf17e00f6800f17420effc6e2802a00e444e872c9b18c97b05883ed67b48f081075408c293b72a2129b11d0321c08a574043532e58985929c25ee04e5ab2e189225913112841e48c4cd172a3871d8721891dee9d4c7b97ab4517f57419d126f2818c5fa6105f4c3e006e912e2b0632dbbddbda20f6d0b5199f4736dc29232be202b3de04248df8526c78c5032dc2abc3dfc58da17c5b6dd03ad19890ad6fa3ecf5d4f6c7a16956dd004213ac62c185b8e1579d9ddf8b26021517f6883665125c117d347124c88f1d48abe935eb1244f9666951e3e7430b03a0068a2c3c2e14851029e48377310b310f3c0e54d68a8851ede94571c1e1dbd0c73f3d3f0e6c40f007db86d04872b0b10d892c5bcd3cd3fffaf26d7438e2a85fe63b25d70474fe56b6126f91025e07f844f76e5b8cb1c8c2afb88b677ee1286e1a03089cca87f766a05bf7a0bd43a062e33abd0cf5f3a57a55a5d9559dfb391ec7fba02d99cd80ee32371dc019113e7295ab130547024030280b9397a5e3505f91b7f82674b362094c59803adf15133f5ec38fbddca832a00dd148129b8f37d3e31a078a7a80ff63e52d68c9f67e048152330650031c3ce028ce9ee4663c4040f66b1e1ac25a6b867fe2f1b00bfb90ddb5ee18aba0b3e6b0c12cd0d66b30c7a35dcd0163c3a90ca4b26ea7c946179b17bc938e7194bfe9e4462c3ced0f871c4c1558f2a6d31f37378d144e068ce16e5b3ac15022b1aec41553bfb24cd78e7a21b4eea7006d0fbff2982d0a1f53ceb8577433cd807e03001fb20a3930329034947f77070ee6482356fab16894b4a1fe1c2049785b044419e6552083395d1aecb4f03d13ac6345f94abe08558081db56d3668cf05cf8262f4ae0fb9a03d357eeea31d74ba8bc949e1a57f5120201c797c80b6ef1b8e19faa70b48adf2fe1a24d673d490451eb0f5c76ced64d86558a81b345fe920e575440fcc9ce83ae26cc7cbb86fcb54939aa0b03f4aeeabe4fbcf29710119c5bf612458855a131017fed814f138047b9f962381e4153f783f6894210f4c47ad279888904f447708036d3d03046104d9bfefdf3d71c0fb9140e6bb8c2ff6f79ee91085d8240189cb0ee8e23a02cd18cbadc3ebf715f523e609317bd01fd20385450ab4ef8a4590314004b35fba937dbf5fda2219601520cca5ddc8e409a52b4cc58b37c6a2fb786b127a09b36f45189e6f93a802224127415a7feb0c5d13301bef9a6b9705a79391da7adc07964aa7babe043c54ed8b90d0f59735981564aa1400cd79bd6a0240888e45c83d1383fe1aef9a613bee70c973e191341575f8ff438e58310797a787c778e05a543e8d8f98f201b1ab7a8419f9b58d8c78a167237afcf7ef20faba0c7849a6818d4aff4a42395a061450804a444561d8fe8ecf924fa1ae14f4ecc632e4fc03658b0a7a4bf228ad5a3e67c2adb3bd1f90bdcefee815a05039ac7662ee338ec9c4454415ab78121617f63cf8f40c49cb675628c534a062e1da7875928fed1135fde6bb25d41a38105a6750ab6c12521a06c593d0e185d0bb4a9ed42ce69802661d2ab34fa633d2a7ac0336aba04de75333ac6c34d4629e034f3435e8221ba549ba5dafbee73dfb8a9e1367754d727da5d21816c5c0854c0b6a37d24021f5c251ad66bf65db493e06d6bc69436a2ea50efc6c3cd5d487dd06ca10aa2e995f56b7779f74fa89156c8603c20dd50d9e1545746f796b07a356c4b1bcf00d2962c9b22dedb0ca54b94ea744e3f9ff916dbc33e1ab3411adbf710afe1a599ae1606fcc59586934584d7fc1bcf56a8a0f5885540e32076c2f8ee237880571905c890274467523fa38d06413aa2f7ea077ae37f49e80b89bad7ec78d9d4f458621b6a2d1480f2d97ca2536155b2a25fee08aba43e3ccfb2a194e1206058472dd48f2cbfa3c8c14491a1a9a91df516b49e3aab01e50a7eb9517adac7e36cf6dae9461b22d8e42176a8da1605c25ac686b40fd382b8b08ed149a3a2d8860f0c1d447a6c7c6df7bdda7726a3c85c3b80ec7da1f7eb20d09cef796d2a611ff2fdd9f690967cd49759e02c69c18b50f930737c6060e71c7bfdca3be0514452271a81970003d85bacf4221267af2aa1f3694267769f20c201c4b062a1d428feaa2392dd65300c123fe47e776bd8c387a66c79725d5a5d0d99a06380a2e670574bf2c70ff0227169fba0242b843a180e237d4320d8e1030f8641858b84e082217581050c137c4dd1e14df9bee0431f1e7b68b48047e8d8eb56382680f49be5974a6ee293d06149ce1162fb5e7797df80115e0934b05f4154fd7e19f31d6d5530554488b2d32ec8b6835c4ea5e688151a04210d444c30d9067f5549761f961cfdb085478ff6278c6f3089c52d1661bc7ab30810a604cb676e2984826d6decadafc3050e17cee1ada3eeb82d362c0b1f2faf08718cfcf43dd3f31a94a6895cb4c91b268a6887a1b1b26cd309159312a184b2b59e9d8992a69dff37fff1317359bfbf66cb24453a8f067d677483da615c1f1911432df916d2165355100660d9fb96139b0504bd0eab6c6c06a4d38e34fdd31bb50bffa4a8f7c36b619edf594a7b56b95beb480aa994470eb6006f8499c36791e1f07a363fa903192457836a423fbd91d43bfc0e31388ce0ca9f864812d501a414aedf028300a0630c42d8f28453c43d443ec4be332cf3b722642d851b57753a2f5753ffe717420a4b4359bd87fb90533f5421075ecb38c584106b2f5e555410a766814d5d9794a55970ca8414196881795dd4099ce2c6d994a2247fd33b521eb1fbd7446ddc2bf8b7fbc2f6853918ff14ee21c99a2875f3c36e43e9b06e68c89180b705ec113c9c7390509c693aca7006a9d1384a5853f74ff90322c49a39053dd3f04d367392f31c7fda3132e1cc2a440ee62887f248c36adf8554dada05f4161318b42773a54da85b6649d296ecba8a29652444903dcba55870070e2c160d3ede1292d1ab00e96f55787f2ed346394a571435427e744454afc5ad52326f760ab7ad7b66d7ef05e355c6d7360e62c0cb0dd1e2137968da6bbdcee02d030216f4c0634d1890a5cfbfbf7df5c629b449c62e2897d7c8f1bac103d76ffda860dd724fa854ef27eea95610b9493aaacd0353b1b58eff09e6d1cb9815ed638d9d43dd5de846f9832426432bb45229cffb958e8b074ecb1d8da2ce4861c097c0b2e1b2c3b0f29f6e5ca9545c5e8d72ec4ed882f1226ce6b1053701ba13eaa9f015b77f8868d03bd8f5644873b896ed68a0ed8b79075b03f7c0b7f7170f890deb5957f3cdc8b58dd4787d86b74b50c3484bf87507dfacea4aa971fd05bd54a931afad858459c0a13aa83bea32de28283fb2fd2f0494b575764525d8c862da3f4cc0ec5289daddf86c40c5b0eed84924ca3019d5474e8dc436cbe73d3537bfe59dc59ae8d9256611864a41daf02b84bc85ccda5d1e17fbd58187cc50df0a7d1d89119969076f98f71d7a93b4e4fe9f6aebcb536567897c200f913a54bcae2ee1e853ef984547f303c6b9e52b116a75c4d49bf657ae04784bffeea3f62626085159ba3bf0a222503334f86ba4b8abbb7e422ac575cf16847637c30b248230ed84c44a15b0305cbdf97046ccd8252b88f21d56de3d69e725c6091aed8a99957d7b030d14385d123e17a9112be6b4c52a784f9e2d5923f6ebfd56fe84140e8cb2c17bfd32c88decf39f16ee519cbc3afe7daf4f2ecfcf5449022e1eeee8635abbbcf7e1e832eeefebb81ebba71ee46f5ca1add181be547fd4066d3320d21d6f10159c963c76699e009e8442c8a06a057884715a3aa1047aba357cec0280fde3ef03e7ac5629528da36ffa7c25698233b4d3336b3e49dc93e7c0da3cca12cb8f29f641a8c36123eb7047a0796ad44a7d1686d6b778b591ce30908d42a21dc05452b86bd4d9305c54cb18ebc5fd281dff02e30ce1b34f57333f257f121930cd95a9db867694690c8001d7f23b5703c93e89a1b402e932234458eb50a00e27bcc298a7c01f6007a59ef226e22faef83df382313f76330b636e68697522fa2d8f23ed1b63713631f917d17a2cf9cf728e514c450030bb3fc57251ad3ffb3cbb0a57c6b59d4230d3b7297d9dd473b157c1a5bfef957469b9e796a4a427e0f3f84f4bbec90dfa89186b787411e0cddf55b1455051b09366029157c198ac0ee36eb8085bd50fd43e18afe50cd42ee6cbf381d330f85e043b2eaf6409503fe85157bad870ccfa3008a7bb0d4a6a4581d40b1f7de3eede566252ac5c003bb466191215395d175d0ceffb6c9abd695963081e9028532a084414a707712f9b271f1c02c805c97374ff632a55a9d4a98463687cc6613b2bbbcb85197ce7f3b83ee067ea3d3fd38a9a7b7d074a55a89ef419a6af27e5027810b6b2f2563a2593b49c86758f3118dba894048feaf461b25a9f1de895dce1e40cb6527efbd2544ef0aa15bd04e3e686b96cccf6169724febb49842d8398ce15f0f4077cc03a5d6b5a9ac443d68bf7a40391edd2f225a70b35243da3d4e95b3940c3fa07390c341a5080d7edf153fe99a85aa400a94bf412e540eea40fe7bda3e472d698409bb5620dc4da54eddffffa95a2f46523755af9678e9fd6521f30c7d490a0293ac7a9799135da628ba09360ecf531796c1236c71b2694398251924720f00f2e07a358d6a8bdcc8beeed18c323cc4c5b19a1a3c325b8ed2680f780fbb0abcf0d33131d39e6d9635b2ad02d69106e0ba6605e8904f0fc0a57a990d80d4d1b902d60030529eaa42c25ae2567f8df1c7d284fb806afc01c816ef12a1b880af78a98a0b5894076c6daca15e00a33071010d8df93b0a74634f241d7a572224821b50135c9850fc2f5d20b8cd0fa798eb3c211b67fe46cb8609f5c90f10c060592bccfb0f89e0ff0f0907b49f3feaee7b1cac39e4d5d8cc6350e43988a447fb1d68c47d1c1186c3a2ba6e39e6b1248da2266a5f8bca81dcc1f43e6393fc8f6d6c6d2ced1f417321f57210190282b0a2ccf8d017f228cf15d52d60dc22224e040fb85580b7a80d34115ff4f2d9b984c20ae5b912f5aaf73a102cb14934703581d6d9721ac61d47b8473efc557ec877830a50f21c700bffef71c39d01d4dd452933cd4464f7fe2b5350009cf0781710ffd648121d5ba11dfe3f376fa0487878fd7b5f63df9865c0557be934303bfa39b2d4f40985470e9e0c2202e588cca83fe35d6114403cf4d1e5c9a71783c02fac03b37da7e44229b4d7b7c0bb07687dcd54d6213173dd205e2844a14491bee714a64f4d1d521f760deaf41782db6440ea5494167484f179aeb95a130d090d4f286522b7be7daa84b6f7c2426b6867c426051e38862047b0564ef2fcafd5dd49496315f2bb7765b1662b923b437e375a0a091f1e77f8c3fbab05e2df0f9efce7c523f70942e6955c939428d86ec838d80d2fc10b67b2bdb679689ff20e74a276c88ad01a8d3d480fbd377b7b97dfa0fc3f9bf752380e73a768525359a3e620ee8c85e7daf74b35bb2dec80dfb469dd939c7e9e385a1b89477fd3a064e9f8898b53c366bd5052f5de2025893ab770c4208ad99479953aa1cfc9374932d3840c1c589284304c3829359e31695b19fa8bfaed2d035de4dd86533a397dd995637351e4982d9066bb1222bce73f950e08c68bb974ad632ef75cbb106c9fae00372517e49521e6c367bcb9d4e0061606f39c11e117a226222891e3030b51139f55537bb2adb236b9acb58a690d8a13b3fe73b0e61a3eef9ad5fdc89e9d60bc529d68d08aa48f246e480e836e1b494a37969b57af45072bd044c6ad0e1d3f13bc532a47937a69a55635dafb31edcd371c6a29aca592b27dbfc83e059df98512667a9df9bb1da300da3589c25c12b6fef11ae31fb8a07c049154be6cc54368c041c2c3651c06206285a1bf672295d1501f7fa216aac29aad726a6c94a90f482b59bcf3559d22431378b374cad93c26247e2831024efd6e892d8610cecc48df3274766ef73696360cc046b3941c2d7ae6dd78b733c241d1b8526e5b3779824f3475820d37d12b50f50b1b49111dc14fa2afd6bd07618aba4657f85f6ec65b8eb6a723c75f246a813e8e6e526039c575ad31c41e5a39674d60864ddbe348628135360b7fed190e88190d6c94f8916e881115daa86f7eff89b3086bdbfb98e1930216351d0d02f1184d87f7514099c21bf66113fbf198b4cf18ab0ca8a93da2344619c73edee1d7b058182904086965e89a81761d67f8b7d4a88572872b018159055fb9be7e2b7783fa5014897afedef9ab9552bac0b89246f20f69523c0a54c291d304e67f1ff93ce519440b77f20af2990335e16ac9b59964bea1b693a4d6702946e1639ed933720acc9768579705ce628edb375e157608621b92a82527eac3852abcc92d162f40c7b1de7f7b09c48e336177004960fd3c8752a15e30ec21866178126f6e447b20665a792759ea097a8c153210a26468c2688469098b55660fb81ade35c258be700310055df1009a663d89feb1f222edb1b711adc4fefc9ff439980872c7a3731d06752ba6b8569feb47bc03c49a705b6dfc499ccc3da11210c49ffc6ad4c1fef5e156c3d4239359fbe9155710575084a6763f9cbd926498f508fb7f6e726b4b65a305ef20779e076b6bbc398c0c947cedef089919d6bc695f8f226a55cc88d3737a4a97631378fa15a570572b04a00268f1a5f40a99577cf45ad381671605d3e9d4832dbee7c30c5eb4d0230458f6f40aeb32300042c101b90d03a9f7867936d32c2a8e41dc9f759961ce0c3dbbf96f7760c9678f14a6af5667715f70d3ba998f011fc5ee7a66b24ccc0fe8a07d336235a97d0512c8c8880d1d0102d205d131cace11c0e1d80e14520bef477b4a2b0d14f8bc6763f9461c6945958971bd4ac3d1814a300e2896169d58d7fc90a1904e74230e18e138ebec78a4191d1a738f92fcb20be8a10a3e062f13f9a996a0c3fb8f71f128c9f00ea6d2c0ea243e73673baa12f78314b4cf6f1480929c52c0f53be4b20f76288f69e3dafcf796d844aeb699383e4f0896a9a34b3925a83025e52b599da432b5674eb8dd68d0ecb312eec47a5fba4cf841b47208ce2dc44aed4512e39eecd2ad2198c985501341e1a3f3f0b49342bcd2468e9222a297191a56e427858bbdbb388331990fd236101c52e3c8ee94ccfd7235ba83b08b0f0156243b8de1fd63950ffa8db714cf69128558b693d18cd754fcd46e539609e186c640d412c789b528f24310d1068c419ccf92838ddad3a776a351e6b8ef36a41e2dbf36611dd1b5414b2b2ab0408041c3d22aa87324c51594631f3ae99b8e9d31427c653f4606867539328c8aca2518255f332701f1ca07037636d765c8e20468c5f90b63fad6ae5c4026987f84eacb532a33c67d0fb5ec473e6c93ea07cf1e0923cee427ef3bb0c893c61c26179696921730920e691a34ad451da011944b88a0929bb2d356dcfc0600912bd9f2978a7028ddeca7359d3c03e6f51641f02013efb89906509618b1156f9202b725dad37b189e6d0929a422f68351967bf15c3eed8d628c4e42c33f90aa9436eb90a337f86807b52ddceb117f9792bbd1909cba949140ec476c356d1e9ec412b6712535d86841b33261ea270548e3f5488275357f290e7b73dce2a39d616986ce2ebcd2d1a3805ee1b58fd3cb7d096edca7a7b0f585a0896fa481b4e566d662d006cd0c33bb9a2e2533294d006609962e769211a70debbaa80d63518e331590dd100941a08726711019406479274b1f1e03a7300de04a4020d8355a55aa4b33cc9b76356b9e9c88728d83eea7a026c93a1474804bdf3af2b78786373209424418fd2d1129f8031f84727cb14d4d718383ae76b2bb39c9b4a43c23fb312957bf424622f5c39bc2bb2cc0e58bc2ddd4179ec1dd6a6e33a52fb69915d40c9f399ce134378040d172299aa0d1e69e1709ac6e273f94bba512907ef1a24f443bd7cb916f06ccaf0e845b32ca10350cb06a1dcf31a0c56125d33183334bc931700ae46a3813eab8d3f322d702b9216a135abfd1b86d1a3e2bc01241c6bfd732014940a0ad16b214c2bd39584be9cac0e0945c2661238bcbcf92b30c51ad565c394aac5fd474b0a2cf6dea34292578933bdd37d592227559e5252029b28b05d179faf187b315a1b5a403973910952be4071be5469989f1d84d8c3255adf09c46339cb415d69d38a059e2b997a097eff749ca34811129c4913074701cdc1e5adc047b3c9108cf911b503ecea378cc34217de5faea035ce00da395517a2aa92ba745a9558ef9269f46b0ee7cd12182f8c306ccd29e0c7385bb5c90bbef53213371391a969b0bd3c4d7955223809820d063bb1bde3e2a1b453cb816d550794776a4f7ed929bf8ab453d67431db54862791a728c9b598dbf14460cb215b20a3f3ba85a879a9d35591fea6a9532aa0e9949cb95ebc3ea55aaca54c8657578d1402b6e013dc3b5d46de350f9295506d9ddfae5af68abbf50a667dd3548195a070fc86047157637156bf0ea3edb9bd1effd3b6b61bb4d77d224e238553949bc0019ec26a049c87bbfb4906cc55d305e83815f08d4f1b13de82cb06fe7146313d799e607cd7dc61f3508b876aa5681d96f44557cb89038a00f6c12d0e4ca5902af993aa251aaec16046a1c34447c4f45c87fa473dc961485e0e2c53e42065b31d65a2047fa0dcbce23abfd1276becbc88402d0882e6d1eca20edbb00c6c517b536f7f0566f0d50542191b054abd3179010bbcdef0997154ea15d63aafe9917a3d64a04a166df94effa807e752c1bb84f4fe6b20802b2b6f982553a82b04e8d4c2907b42a608804d661b813c650aa6208330b7e7a6321e77cc7418aa5f518a6034fe930368290e2c613af4a054fb425b13fb81708ed969311b835bf84e36b8a11f8312e14d72df746206dc9508c2e9ada95a091b087d09decd2889f06bc052ba6a46f3d3494ee9686426b660d1c6f7879e331f8e4da5bfa826a4246f23241550c99df7e3b40f6e182d7a3fc759a0bac5af61ecc21b3266efe30d2d45a6725d1cf0694c35928ecb27a6a3e874c4b9fc5ab6056e85467edc49ee96aeec720b11f25ca0695ad11c880832e50601635558b527c0230496b704ded2fb225ba3125bf46da3127c1f0e2188737933cbde7f8b7986187fc3c969121253fe49be7b6c4b6e74a2de78789ae7eb32f9c91e9ff51c0dae1703a5e2660ce9564c90f816c63c84d35090c7b5384607859426990a6b8d5d523b6f828ebfabac25a09a37d25a0a379944bbf6783e31cebd410054adf287be71d4e4b31d67e07443644d43c7353104b1498b73f9981296cc1ea92433000755d1e0e060c9dcb9eb3e860761c557cabf613cc1530c02af32a832dfd81d2b04a909952bdbab4eedb9e7d20d3d94c0faa9a9165a587fd1fe3adfa4b6c9d231c92cf7d42b3a08a8297ef497563076c1d679aed511cf4f663793c53d88409df3744a9295b86a9008ec87371a4b64574a4393d293e17e7a23473c324a10c50ca9880e779e4d5c10b21a62b0fbd799c398762245c4542b736a3f2650f7c91032bc6e852afc097e79e479bd046d3a2ee1afe0781a33c61eb8820989458bcc5c0f30a6b5c3b13d5fd8e14ae40868b6a1867c3437ae75eb98d183a5815f71596722a41f9acc28c7f924abc0d74ba76a8a8cb8a81d270cd1bcb653a94bbc2d27846a61500c0ebb712831d4367370c5f601e26072a9ef33ac93c42d9beabaae38a11424acc19866eb056c19cee297a5628d7948592bcad59accfaabca67055da5879edcb659d317b246b69e071c066385254435ea0e996a14606e85c29b4e15d6f609c077134621f8dfe7e4616d6fc30e21ed79f482e28206394202fabe82a70abff9fea2f93ffa26d4f416336958f1f36ccc594e0cc16d4867f3d2bed57cc7f360931558bf9afe6a260ddcb341a7e34a872e9fbc0e378b86d0514ebca02bf1c760909825a07f888bf5828b4d1a8ef61085989907fc81d69067b284284ad2ba84fe3449a8275c36a006bddd14cafec9a6693909be0eac1e1e9307fe232895fcd4f11dda651e52f04606c42f10041e23e78b90f16ba9359697e898c178466bac2dc631bc1a42b61ab6720f77b76bacfb124135374e3ef9e711b4d023a5f4e351f2c574792a47bd74d8561d66f3bff15236bd15e07d28e769f46c21be3f2aaf9d8ddb0195732a80939266dd69c1d56eaef8137ad87f473ef6e4c9970334be96a6665ac3a11e050265588b09df816edb734abf11c83c19181a1091090f7a9ca628ecf3bfe304a1dd83841fac1e02b1165aeec6fd8a237e41bcd782ebe7201aae08f67d12b4f363e0204bc6b028ebfa6dfd3a34688be9168f03574a5cefc11f17eda18ac7c9795d5ac4a152947cb407bc02c54b97729b11634b56fc7d126accc8c2b7e405d2e3acb11d85d3605c62ad07e85790ba6e6b3611f8b204008871871858c598c0a9d8f96404c45d0971aa433507613102dc55f01c13775da35cb20c82b5dfb207c54922ceda2f266213949d3885272577a3428705698fc5311de87664a4350c82ddfc08621574c5a39f3b6ce8b8a3592d4da206d0698d7b6b653a845331a2bdc44843be90f5d301489db89166fe815c1e7068b81f3f57bc81e802323d787df5f2df906ccf7530e13496886b3f3100f132ee27af3cac7d262b03610731287d7e434e5658351229501d72821c41997e2ebf075552451e8ba04bfa6b020f927530ce630f46d3023ba087c7e5642a028d47f70e48284a33a8513c3dd6fb1696df05b67282ca925ce3ce4436a0c616af995d6e295d4e5b337208778fac05e70856821b8cac38ebde6ffb4c02029b83a9200d176a3b85571568484b8c0ad7dfe2324ab318f48640112d73dbb31d6a5c1a0b88d0314a51503f954dd0a2b113583aa060ca85196163388aaa57615763f5d82d33b6b51c9848cfabdb397c382a7369262e25fd5481b096c5c67ca6e3f8bf1aa097ce10df2b4d596673c09c2a07242acb91f769e40f1d5e8b0c3b70c2f5152d358f4ea61fd6a22379c9aec507f35d49c88a2f89aaf36d18f105ec8a18118bf6106a33fb09ff511e829c3867c91afa4775d9ad6e9a12139159449365bd94d42422a32853c4c5262af636a266378e1fa46ab8906889d6173b3cc184e8288514593038bd9e90e5841162e014ee85d247a6f0280886480688dc2908ae9307b006f6fe9d7feddb73d8e19c6c7cbcffb59e0bd0a6ed74c0c3fa0b1e60317fc42c5aa532b910e34331ec6b1450a2ab9f2a8694d69175765de2eec9303b20ba9305dd0d665ef4d773e1a2958b2971a45c1c762059685be6a91a3966c68f2fb4f1890842c3fc956a1d274d48edb3d8e4712996aa000ed2865ced4cc7d0d4f5979b1dd219ea74fd927b8e5c49b81fa9b13f53d075151e8b865b017810c51512c20a6ce53d15fbdffc411b6502051a880ac4c3701bd8f2e47858984ebcd519c900950d25e52e20dcd3a0207c3f1fdb30adfe70231f14cfe6daa05877cb2992959f4864cb0bc4eac32a4d5ddc1421f7b9c42f9da7e96a98cef79be54f39fd9513dfaf1432c16ee1e6e79acc5a3ec17545ee1445ca247c73462bb13c89bc6dbe1dee037c014a3f79c011646cce02e74a4a3612501c986a98f8a865418809dd5a461382b9e1832f637d0192931411b33001bc36ab9da3b156b05def7bbc04fb6297685b1b86b4b2db98aa962eaebc0045851c077d882ddcdc79e55d8887cb941d29436bfb458830d0e40d7fca3acd7eef4d3c82b9fdc2f7707c3a0272f0119f5f4afb94ae46903769ead6a06a238ea9495f2bcea20e5ed3f353a37c64b1192463f1d163a95e5bc53cb12b5327d9c602d2533baee979b38491886e626e4c58665129720f2f5cbf7b7feddb3deeff6dfb30092220bb632cb475dfe1e9f4250612fef277f0d5a36a99dece4879092f845f97775058c8af580528ab5cd8bf0a120c8275d70c9861f0a6fe02784cec84c1203745fc87f5e57e34650d0d1acbc4186c3e9f1dbf1ea1a171174d3cceac37d6023bbf5b75806709ce9ca4aa89f3074468b6e6b55c8a587ef9394395853cb003f4867fb7c1d107a0189209079b2e3465bf5ccf75c5cba13840cab4f8eeff9f6b646327e7e227bbfbc165519df4058eef162a78abd15ff874e0d392b7c7d35e078b83c04c878529584392e54c8bc9902bc312162d704c5bb2809174ebfab77cbd00a7f6ae59e9f00a7b794eee43defefb7a67b04a5b165e8c4eb406f651843b6e2c8cb97c18a2449a1a734c6613fc2104705111a98f9bfcc1d5ef52e2286dfe72563dce9ba0cccaf6ab4e35bd9c1a2031160b262fd609619766e5e00a462fcf67b77511504468699f80c3502e6e8540bbabea241b30293301f10f533f0dda50f347db910f5d66920457a057203fd84c7f583da1fd75205c3d24042417a17734c104518f4dfb3a2758c61e830b9c53c987a9cd782d40f64d53b128dc49772d559dd91ae6ee54fb43f4122b8c12118cc02062b8a880ccec7802dfa045fbe850ec04186809b86b07e928198ca3f84934c7db938cee12e79dd1bd65ac3efd4c0fff9ea69738f54cc915cb69f5dd222d70671df26cb59059b5bdceed523b38d366ff64d59ea01245c824f6a9517164967fde2ee433a2e2a9a864442c7a9cdffbc42f6b9e0fcbd267a39fa7e8bb991541aadbc3f5b8d85e90c7d453ad107e4d525dcd66c7cbf88eab323c9891e78eebf291d0016419a7e4e7449ffbca3c4e6e6e1bdd7c96226b3ec3726c4d46424c2ce72225e1d2d4aebcde48f327eab4a0df7ce7353d4a4b9903abc196dfe033c5b133b150c5f2174b005d2b60a304cba07e8762097309181b9ae3413882b85c4e7988beb3f9f4b9f7e947260fdc1e2b894d206d18b7d89926518b989f115268402f1da14ecd71c70d8748a5cce375a97c8be5b10adb784e460baf14f064f33153ac85982ab2abb14698083bef339abee8f3e251f4c53f0c23ee9a0a0c771756940802a0a367f4ea83ef000e924af6f241178adaced8d405071b01d5053da16db08382589375373e9a21d17086300cb118e3d359215c9d3a92ecee0280b24854d964288fae1e9894b6e7752ed9ba085e89a1934091b8d11b2f8121acbddb9e480a03e8abe62e8fd1c3ccecc3b3f40631e3e942351de038cbde8780036a5509ace3efa7b91dc8a4592e98ec9ac39386393f1d83facab83923516dfa605de82bef59a28dfa0fbb1a7c6cb1e36c017948720f6f655de99a14a81e47b0281936ea41428220056046abf0390c13bf8153bd963eaf750e4b874ae87173300c854e79f94d23370a60a527e8695458e0e714ce71bf1678470093af4d6b67f4955484474627e24c3f6cd1c3ac3876c28365684e5acdeae005a87d237835ee886cde76f8face187bf190de7eed02b396093560add81a5c9bd15d3efa1032b20731d296ce64d3e814fdc11051af6512792799d46fb605164b886ccdb3e242c652005fa74f05e5c879c00da0076ce6b39ae79a358e2dd30e890f10232f7af6878409069b3d1d19ea7c3b8ac59345df2c69120e67b3f650ebcfd49cf1da70283e51519a910578df54206e1a09d5a682b806404bacbeea0aea27abd1a3da9b46d799d59dc0c1b7a40eef932c141dc9c25e95abd8eba6cae46329a2dbc68eca6b088b08e3a4445b7f1c74ccf27c8bb0633a3bcef32211b1c0ec1bfbeb3c5a710071f37f334d5d1db3c6383318e1aea39acac88469ac18639bec385e61f1268262b969b0692e0c418011f0fe3f3e334d6da211b9079c207b08a71a8011a339e59f1ec6d704da11a1930d995b6a3be1e9fb79022fb67fcf274dcb4fbf1bd0b34d252b02aea7a5ea5e7eb3c134241635459e9ee26ef2fa4dde8043000bac960c2798d44b9b07415103ca903f11eb7283bbe17e71e2e270b9109ceebbc45a54f3a30714b57cd0c42ed089a5633860f8eca630488d8d5571e2708d8e6118240f5a96764e4ce5c8422a80d5e0cf43210b85bc5fc39d10fb077ba9d472679911220152ad9b6c20a94c5d6bd657318eee3fc886eb0c07e0cf066cfd8782700416dd03ccddb90a8fc186754e8056cc523bf758dcc3cbad14ab068a0ee5406cbce7598d55501a414826b879565865f481fd6a477c839b6185c92cf07b0941efe70e72fe07ea27f1f8992ec499d958a4e1b4c92d0d9a8da1c4e1815fdb38b72f8c99e9c7e0c8ae67301b0d7351afb68ffc6e0529f96adf20f8a6787dfd407f63644e8617cfa210ba55ea80c5c9fdd43b344af800af92a3a680e1a185c1da4328448e2b9d0bb39f251038e46220850a4b37e7b034bf11517818a3185893a6f6d509707baf57c4bc3b9ece6f2e57157a062cf8d1f7c23df248a4b14f9f94e33d4b0c631a0978f014e08ebfd9528bcefc4a2184c0eb716c1ebbea3ba6a0e1a0f2b3edeb34cdc4d79f33096168796c34be75e1d718a302212157ceb5f3754fe0022f8c58d32806018572242fa7efebd52fb3fb73bbcde4063108c3e1269a3274d842ea880f04e56192128e669c688deb307380179ec25a9802ea78ce53088706c40dce1228e98c8e6faa2ca2d679cba48f3807b22242aba8937f165511d6929d5858705961796e97c185032213f3957db4e0337ea72f9f9228e4f507ee667d6b7d6631f38d188535e19d925ccb8eb20ed2ec45b410c6f6d0399bab323bbf9588a968d6eb8e0bc03e135c63d564372f5217dad2aabb1230e5ad6c93fe90a9ecd1714afcc580da5ea29100ced67d1c55e0aeb33efb1599869ad86560abca3c0a9228612a4dc8dad2ae31dd079ac34bc1cc0d4a5986981b2e87ea3ad27edd6196ac72de8a022db0ac64c4b871c9c4123376f188fdf32ac0951a6b6407b59100ea6255d4020e8162fb5122fc2bd0fb4d5a95ed5e0482c6600c52376ca0680fadcf70358a332f643556dac3b31d048e934184407f3202a9ec7d5adb0a55e2d044de040b5575628f898361746c5368c1f18c3aaa901af6e3a2fa33ce87b3e980e699cc0991f1c12d1b0b0f204fad75ec2de54e4d32f209984aa068f25a0c3df95a004cdc7297cfd1fea1d6d02f985273ad2e8133ad8ad37bd1c817790259fff3e4ba8d7bed6f35adc18d4eefb96f2b4f716d869e1c01602f32276da30e680b1216290aece63a77d682680414967206437dca760d0a01d5144fcf5270fb95b20568d4ab034380540b9f8d160f8857b599125c2686246004fe25fd2617dbad3be5960752c9ff2d5dc280a00fc139fe23077cc6d6023f34d266406dd52f3f7a8718da2b6e424d4ffeee954249d4e56d414cd2ea334490031fd3b5f192eb13a78f149526ea7b04f31df046e062118a0838e73fbadfa15de560e350c1edd891a49cbef7e25b6430107c06c1780988981dffe0b9ab92d961c5683f560eaccdf819f80ea53c27d6afd6e82f78a06ed24b220f25c51123dcbafd27534732fe6ac87f01e2868049f873f38e4d4715510211ca2a96eda54fe446b97c07adad887a3c9c95b6a2288afca599f672dcf9ea03ad4f0bb40280bba768a0f694b806b20df86bd59058eb9ae62af5d4657de09a41918d8900c20e37d35eaa70867394635dc318cdace713a71651382ef128c0000369e74677e95c01cf60c0c3adcaf2bcc74eb100c4db0760e81ba00a0522e725f8079fc777ff280e6f70f3ace6c474477f593f3eab0502987e0e64c4dd2a5920c126ebf4338354c7c09275511d947127702492daadfbaaa71f5e9f0b55c297e8452a126fde37d501aef5d8c97125ebc8f7436c619501ab2ad50b4d188de6a83f611ac6faa37cb97a7c94883639d8c59ea58568c5f4db5252dc514d92066c9fa0783ba82f85d094d546cd999d92e737c963d6a8dec5c1d5a4b590afb7aaaf815aac8060ab346b827c1e48023e7518ed1328c9fedf6ba216cdce652b445e705f92f662a0cdca3dfcf69639ba0b37c7ee6ec6856b8791f111fba6a2523920d6e7f21c86d4b5287362c4e55775e43ffe77244f7a54d9214e3d7b7c225989e536c81e8b2edde3d08b2f8159b7e404468f73b5ffc634981026974b92c1a92d749b86b0edae1cca881c95c8542a786193f014b3bc870982efbf8dde1e10b7107f3bf53c8b070048e6492c566b9f78d38c0ae0e122346c5b264fef61da237c11dbfff89ae988da0245267d3ff2fbf80702f81126a1ed7439810c26c292000b7c68b81245e08fe0edcc597199e05dfbabe2e603488ac613d2ee93a1535d5e562ccc14da4b7c8452427c2f814311c59dd627b43d88821e429be44988b45cda01e6a6ba14288f01b6d657c7e6569d86404eb5c5f2bf479c91bf4b6c70cb11ed1d4940cde3a21923b955c647903a778620f50d1e1c6c753a8877a29406b6a0a76dfbdea6b192fa87dc314d50afd14d2488147a75b30374fd0bc41b100ada13cd01f645d0ec1564a8231527e9539e696ab2450d817586fcc12007d1d6277ef10ad5aa51621f6236e4a0e10206d5b934e3a26c26a7d7713215a369c355eb032f178617d98cb9c25cd011dc840e149650ace3704c377679f895580c376128a4d26b9a80bfaa69c3d49610a6bb05c3894160f550e5a6d33dcc12808052b521fee1d5cc774b5f0ca1e93d4bd0bb841dc317f77297c92e82b53c321aec9e0463ca35409e71deb668dd776e139246aa0de2ea46027593cc52276b4c0cc6abe70ad7f2c3bf0d6dd0dbda036a1e2cb777e16dff3651bd4076936912c2c1e54b5e4db0b88c025f6b0dd771ae9f25536f9d3b8e2c10fc34feb9b78740ee101c4117af9513f8b8e5f130d3f3de6944de645191d94af4a0caea3d88b972fb6318556dd2ebac5511564e00eb8911f06f14efbf4bf631683399bb51a6cde836c451e6314aa880546a55953ff66ac19c27c3a176df6b064cbb140348c97869be3c2893c04176644348dcc3b0e2d19e9bc667646dbe77aa84e27c300c915544baaa8108ec252c1189f1a5d0148d0b1847068d39650bc6351d131cbee20e0924521dfb92b710efc940b831e2b4dc459bd83dc011cee13f7577d016bc8eb7e3e445d91ce55c9dd586a7e129dae6f6449754bc3a1709249710aa13f21f1420e266761f3513e0bf99309654a569382f24f41ea64ee8a50fd7d8f30e79ef5d5514c9d13ec114e6eab688d2194c2de98bb885dead08a53067f94832dc6d82eaa36f9a0582c1c3ee18760da99a914c7d765286eb67f1ed3060b8a97fd3c890e31f60b51554db0385c7c10202e7d0a55326d917d34c119abf390cb7351c37f918be8b2addc15ce4c7c9aeeefd439e1677ea17d51d6a7bf42fbd3433123e3f760704f4e61b587e2315f58ad245b252c6b441bf441d1e337bfb1715aecebdf2868d6a5693176766c16a876ea4b388c7d2ec4677ebc3d99d1470ddcc3af141a2b695daadaf71ebc3de7b9730bb7eb79d49934160ac6350fcc70a466c2aa44e408e2cfb8d217380aca995548f62be452c4bef58284eb10d7183006cb52d514ceb9b2d93595e47e5d69cf750d61263251138d3be04a0d37359320fa1b6d93b5ca4dc68dc379df8cb28044c7cc3cde42f0f03678917e33b61b3981521e83c5721795e4bd1c8d87c2d9a87eb3335a4c7e434fb2d29f64dd6a90b349a4bcbedebd17b986944c936da8649fa640580d88dd08e99a3c95571120978a64354bcaa0e152330f3a40af99b54ed07d04e1835e6c13bdd26cbb7f18717a97573509a37b26f9fe0570050fa5c7703458960bc67cacf81deabbfcdf4f7c2dc2324f4e11422ced34d727d5e1bf5c60d43c86dce606f3c6970f2bf61ebd48fb8bd2d7ffc41b6ffbf3c0d1e6f32ba2436601e93df9ec02fc800bf54aa8b620a0dd0a40ab90e8cde2c1e7a333503590c79c9f1e5280390180908ee0a301739c044cb3ffe4412cd0103b605663fe29bc78a9c24f9409ef65eb7c188d28c288e6c5d0f17818b70fb73bd7fe57170b3923c85d4c022567435e697140c525a3133a28a6ef0775101765f4ce70b58e7716fa3477ba543f924475e8f2ab08d053754fbd78dec0eacc6739e64f9d5b10ab1653fb3cece3c4c420047ae4b8dba48ba42b50035baad037531e89de359b75e4637d743329437906d56b42f6331166dd6510a1818b51552b6b6b770089f301c2640e2cc937889b5683a9e01c5e53aa88a73a6cba95c44f9fefbf97da93355fa39bfc30064b8d5276b3cd5452cd7b6baa4ae258778261e786644ac31964edc1322195b38a9f74b74785a54759bf591618c3799abdd7d78d0754666fc4b2192d19bbf7ebd6321597269d8127efa4604800fcd3130a3ef69b8aa71dcf52d08587500c2fbc52142b047d24edd98dc68da2de097b15417c0dfde2bd27ee3542fcdaf48bf44e482f8bbf7f5cb10945f8a463f50ea84e18ce538adfbf4f6e1d372d61ee735b39b4b18fe83cb93a99af594068d142079c26ee03f95610aea51e854b5369b8ee22efb52de3993a85769d21f59e28bea9e14b0701fc7b9b0944bb1513dcce3bd5cbc561efd30406096a5ccf59372790b5decf085a16680dac16b6ec0192299b31eb5118a071724d0c9db93180feb0c3b3da0c6e3461cec5610aaad138887ef5d06ace81048ba0be9a5cf76002b86ceebc6d33be3a58b0cb01d7012eb5a561047c168464b4811c424d58861d047aff97baa7baf20109e3eafeab330c0d567e6586005105bbe4449dd45e3f7b207172403dfae469388945454fb897c1f76a7786733cc600b3f9052c5a73d8bdef08158e5466af39413df3145c776a9e3586b50105b960174c2cef114b1a762130cd0a1a15be621e8049c8ff448212b6a70ab6b3d6dd3d1da30c1a9e5a5a1e0bf166036be53846831434e4d7460177d5667536fbc8a536675a1040d101cf7e93a931fa182460f2da3811c99d1d24efe4e212aadf44d74c480b13634f2188c498d2dac0d2aea0e1180d279b21f35e15d1368986deff6ccf089608cebe704d78910a5ac478f442bac79a2bd6851c3ecdc5ca364b02281e44047b10ebb59878b08821427a65c1cf9b8e001fffe98b040f19ee9310d53328a50359bb0f7d497a9d548dda248bd047fcab1be8fce58a936c90e7e88fbb4f434459e47bba1e3e6347560407f5ed9cfc36915e003428040b249bec7f5ae5b5ab345a2a0e1d50e798e730a7872eee6e488c42e9241b526a3cce7a59d84fa6dac636bebc61a3ba425e4e68d8a8c23a6e0dca86b118945e37c49905802cb0aa4f1ca5c38a1610ef9c199ff94604c793e7fe4889e8b83f13b700d08f687433e48f2fd3609a858b7c8b096dfd3d9bac653e50f5da61013f3018303d62a4e470366e71c245b2951a42339238e141abc1c3b5f0be73cefc5f67501308623dc1308d83aa2dda762dac0cb50054344eeb36061fb3664bead35e8a193e86ecf62fdd6e9134eafc700da10edf7d8f1e2ae468d357a0a507a73d890efc81b93963ea8db641f680f8dfe63e25013c7b3a38ea171740a086a8d0ff392aca79175c20b826b331d484b72fc90ae9df044fe714177df48467aefb3be47baf99d6df926ea4629887d52cc27ad31a0146645471aab2da813168bac09a1d2aab234d1ea6dfedbee0aa6fa3ca15677d9b678ec559baeabbe38e37ff24b89f34d883f4b7b6fd8a87e39b89e6212caf331e70953f780f762c399583437c95ca571310ee7138615bbec210f0d7710304244b3cd920a74e537eca85d4d34640e1da77c0b57614de382d18249f4c445f1181fe9c2122310deb0f0b2d0391976e16aca4c1d3e3137d6ae88442d01e5422f2a164dec9be2a7bbc763b250740d98487c4613e5f16da09b9d8bedded209bde1de9d43c6edcc2e9f85be3e1683cc4c64188e2a4642f248139353685c26d1eb0b291779962e2d6d3d53a1adf1b745743835e1af588495586733a916d48cb880daa017266aad39045c31e27691f79b5bb6d6bda723d9fd60e04f095bcc83668cab06c0755ab3066e684c443720939d8e8522a025ede6ba613d6b05d5379d6a78759e9803edb29b32435947919d68b1c724149216e4a10e38571c4a825e590135a19f316fee463c6d361f554fb0cb352b83b8744dc6539fdfc73e31c65458b00fd47310d08c41f861748baed1afb3f1b1770aa6ef1d69b29bd854c7c6ca5f00309de64022d07d82a6751646ced3b744f4e2fe340db245cc736275bb8f6401655852c5861e5216a5ecdbcc3d306e66f8a54266c3742de60a984093e7855584b20bca97202e7ac7885c0e60a86b247ea3e78acac0041ad604e374ba0d718e3a861ae9679d271742826ad820a5c39de7e65f80acdb7100eb4a53a26575e30fe3d53aa5469cdfd3961972db4ca151ef905b4a55398888f0ccf094041fe3d5bb33121958f5efc3b6464a088cc01ee1ec70b3f3406dc72f3537c9d2fa174029815660af4159d17eb9702bf94f22f18d933f320b29afffca3d940317e6aed25bd99801feb588a7b244e2575644f7e29267476723facb3cf2d558145ec050ae81bb885b63fcbdadcc6d98fceea04e3bfee46b434065e0e8faf48d9d2e8ce322a718f8c9f18a9f19dcaebdf16857ec63a4f069d1ed0a251e9c2eb80a8b59c286d5469a42ec4cb9bd6864a42514ca2cbdecc0669e13ba23ff607e780725793b4fd165087dd4853e61c22237f42ae7801b95d082efd4967a16f247eb107926c56725e4e6a48b1c334208f8551d93020f4e13e43d257132a1523299ba810819872a2354a8b92358b3516291f7402c53ab74c2606c01676bb17a7671e30e23d55d58920f2e52308f6668014f18ffd6688441cea2a8f5e8b6f3910d5ef85968163b86b19a36523777cec55ad10750b5f42dea88b901f7faa18f0cb92470f379b0dd010f09c234121b2344f0b305822850d0ed96328c2fffae843755d432f287a44fc07409765910900039a1b673cf1944658ccbf3381f08181c209e9ef004dce543cf0db09810f317a374bfc20ab5d2c20f118095ce1678ce6f382dddc4898f711c7094e8a75c9cc8d41617eefe288053f57f4a07b70e882694e791c319cf705cca51b371a2cc370f935d33bce6da6a1ab2ffe807acdae95a424f06445012b52ea7a7523aba04a7d35e7900ed4b087a1af6b2c68746bef8cf21cd1136277b85cebe87329a83a8561980e7c1a3e2a7c380c811e7c6246cff78f5269f55a2ded67265680fb5e5400835929b49a651d5c9731be456bb5feda4929b57ce72e4d7ce956fff1eb47b80b1207b18130b93c1f74ce4cf5020e70e3fba597f80432a2741cd223ddf81b0219b6ec0f4c76744d52ada2a3798ad469f3c59f1a9a1b1861fa6762e2eb993fdbdc6c82c7525f89c6ddcc7ea5447b14eb762073dd44dfb1a8262c9724dcb26593e95ec742d1aa5e0904f05526cc8797c06b5a5d325b062483d77f4b208e7cbfc669efa20c66abd025c29617693061db0920f28c4d0448a69e649718f7515c9077a6c18b115794e7a931737e214b5a6a106f70021162f425c9810ff1f759109abf450639224e84c642ea38df3595a45cc5086e1576c91d5a022f90f22ed1e3c3074a648d7985147f13981e5bcd06fcbbcdf15b8ce574e0ffd5f0618466c672be487da6b6ff08cdd3135d17f50fd78547657e3e5e8bd819a465020d750018174efe37583d2276f0f21140fa1188619239e51e74c36e6851cc35cfb5d73f7d30b3cc80df11e8cccaf361751e991bf03b9e64f0c1d5e6a409bc7310d6f2612b0993e0964b59bbc1eb0dfa1bad2db7329a6966b54a4bc40da31cc78f5c4c763de0493231957aee3e314f69eb9120391558dac7df33878e98f6c65fbef0eb711bc4a64b8ec57279fba51aeed2386e741fd4973af8c57f5a3fa8a3c56c23003db6a30456283d7e15c8ddb74995d8fb6f5f3fda6b3859c54bdc11a38e79859f9bf23a8e12102633970550c31f0d2b1ffa4601bd4591dc198393fdedcfbfc4ab86737d47dac411270a6877b7f43fcced4059788a98419034efa0935545f0d3710bce0052618d8a3247a974df6205bf6a62219e5e1304296e6f78f61c981b33d1204cc765db3394f9b120300312fda7f7256822a5f22b2737333500371c4f0d398ccedd0a37e73779fd6168c179a375b75af6f3e87bd1a0810be5146754aa34770bcfb9a69d77fe729ee67c0bca84d4482954b199c286909ec0db935660a74005afe1cb339aea226d524bc2e3601ae86a4b8fc62da7bdb7fa8865bbab955832764d7957acfae9390b8a8efde92be5067850fbdd4803ecb81ac3eb0c02f0749ef0bf9a76073f8f4f74cb0a0081eea7e745064869052ad5ef162045f76fa57d807da839ee551cc90d1a31c5bc1fefc26a6f68efacb445d8c53e83656d0395192f2fae66ea3f7428569a43757e5965f0d0db0d5f3a464035bd68575aeb5e86ef2b5dfedaac28bcef4bee48a7c0e968136c50d1bee09c0cd00e3873e682816f62ff009cf0b4d5e775b2d3ca145000b6be6072379980340d21a57574fdb275dc02be0d68e2765c74a2933719fc3bb7acd6481f894c44694b15087c7cbfb38edb248c1430b1bc6c31bc9e0149387fbeab14fe04f58ffb08980cea3e8963ddfbfaa12c39a4531274c53519990f85c3c6ddb9bdded671fc8a2b3226d8e9b631e670660090ee8c1b7ee778808046735a3172bc4f84a909e8f99f8b20a638dddfe715cbecd63526ecab86b0be8e2315ffa04795967457ecb31f3cc79bc853db6f57b1b893e348097d048e6fcea3212f7939be3fd2bf729b6b9b4d03291d5440f6aa4b9f3800e3ae71a912c936e21045fabb3ac012daee51c287d862fe6e9bea068a8282e4298c5dd5d700f1d186d66d265083802e3833d22bc4c8bffaa7e5a13fdf0d4d8cb62f3bcc2d082d0d80686bad0b22bfecb6d372d9a23b3558cb21204bbb71b0391bff29eaefd7d3f9ab6c246ce90670f946ae04cc7818404670e479602162168a82f3b5633df361d60e08631efd97914eb0c6c4a3dab269be6cc1c254e706033ef55d074318aeeace4d0d05098914136e8b39db318688642d515a41f5a5e9926316b8e883301c49013692aa450bb725e5607385a4d296cd540ad7cfe8537d5bc407471e6247efa5571c79aa403ff88fd0c4871f579ada4a7fcf2b97c8902a93cc914e7b9a9278d53980effaf8dc8d352675b24059f16e887d9695f4b6dde500bf4e4c9ad42d9ab94e464f5f0233008d74dd500077669486db05246f0940938c7c7300384baff0b080131542f040481be06d70fea2cca91558cbd6d2b3518848d016bc9090b79a5db829c61b555c4f82828b3ee22345b7ba32a5aacb5d34e7b6d19d0ac09155cec81296498843fd988e3249721570b9d01d051f8e1eaed0822b9dd9e333fdd79e650abab159cc4c5ec9a5d2be567feffe728747480d616babc7a47f3a8ca3a532fe30e9864bfd7282e87644854999c1dbaf169f7e5db37b4495c2ee1e5ba3df90a170a1a7944d34c8e473c3e4903adb0da13327991b63b2a599b9a8d0ccf685c8ec10f77f694e7cad8255e91c389056ad3d459caf7669937cd6144bb273f004b95b6cf01a4da2dec2190248c272995bb7bb2b44c096be66a1da0facba20b676116d610d5dc44ea690cb29723b039b293cdda211f844ba9d350aff9db605abde98cee9e43c83f33e8b057559e813f1e5cb0b0b02a4c600c7b72e0bf3ccc687e702b2839fbac06127e74a0bea944ea69ec244856fb7757fb2ae4435f130144ba96ffa46e1439250c6641076c7a8ba27b4043bad1a8ae37a99499ed0ddeb7cc5574fbd85ef411ba2a3b461428439fd05f9d39308fc2e76f12d65dc01530912002f8094a9f5bae6af3cff7f485ad64221e6a514432ff02c95b9298fd89eb552d08ad34aec8e150a0b5b4804a92e95f7bce0724bca9c18c493baf9f176bbdd6b82e02d06cb14bc622ca5f1e298106d19966d7bd6854b12d3fc9f10ad91944754a3ebd6c1a3c8d4f2cc8d398257d09b866060b787abca334d11a78058df4392e8ceacade9673b403120314c2afe32628e4f3234c0157b8969fb4170f63c608c79a3256b8421a395911137d285022be812c00a571713333f53d52d45401d2d0e78d828d05c93733868ba43528643bf39021b8a1126de0646be2405c7118c5819e378c1ce121ea3fc8b07674d6d586596ebb3c350d1fad2ac466212c0d834798cf8e2487e3bc1d83dba2a090afc820e7c6c88f9bae35a06ddb85267349c797d672e321bd77797a3116a173d27741514bbb06dbeadc32f2b4599b0da5f07a4510e617c6324550a308aedfaa2d0c49631a8a6c54f7aec30c284815c40ca9886267c106ec449c1cf6ff622441023309e6b7b66a259a33a6afabe1c9de07eee3f5872be760d4b91c7dea23d92b283d54338393910ae5b2556aaf96ae80aafb1aa86a7feadba2470b29fb3217cf40b100350a4dc7a085fb712e4891206c59d3321bdd2e9e041f2313935fca051610473d816839878111be37988d9cfdde1ee4b93247a919ab3139c5861a675bd9ca3702ee14d9b762ed233890c116c26c8df3706eaa2fadc2502172ccc8df5b94851864426558dc859970852676132bd8abe2a695b35a8434a656dae4043c42a17eb307acba4f1d761d2362dda7f4d1ff21fba4b9c3dde04862225182dfba3046a687d49d423fb1f0941b22f0895fc07d26f9855e1345447082f3f5c9140fad1077e6c5be0359879bd0d972cbbcda537fe765f6f8dfb620b4cb99624dbefc1c302f68633c3b5c0351fd13ed3e3e84f910789dcf9c049efd5e9192e090fa57f54a8bb6a661a96372997625ed9d2093fba2de43eb694d4729c200e41035384371ace39df221a8cad89ad94fd145b0a01ec760a0cf6088b3f70d1ceaa1a5085c1ad6ae91a4a69a2c4a94983a9b6b33169b909ac54a4fb2626062bac4abac27d786db7016188e82dfd582d5bb68a9bd93c5eeefae1b8a9755193023e43a143e74dc938372dd6999a49a9fd08322d84f7a26f8dab819c4661520f3e4b08148e4a293ae20a78ed4a02c59936d5494f61ce825218a72428ae8302bf988a603f0b670c9ca58faa2705ccd5f07ce2464b9b1716ec8547ca0516bec2208fda681dde93505e8741665b9090a92f1ad52891a73a12608548f3cd9272a22a058b5f173eb8f803c3bac30f8fd7d31b119a3b4ca60a00027d1b5d977dc77f64508789b2ec3bd40594da4d219b06948960ca8ff3bbdbb178412c6048e50bce58f40e64109f72510d24d87b130cd2f3749959a10a116caa1491bea492e48ad8354d13446368650b3cf81bfb2a8a637d1437bf4f16cdf202abb081b112e04087a2e6824d75e9507092a3023c7416e12a3d01c298904370375f3b2b0b75c4b5b76abd75bdf1309447cd0e5ffcc3f399111eeda97089a9722be42bd461df015a7872975506291d15e483471605c24538fb3fff3bc63fd325089264d7b968f72f19daacd4b8256f9fb808da3c4a7e26b7685699afbd9c480a0b87afdf0f9085a54824dfb7dfe768c0112f20deb9dd803f98d37cc8c8754ff9016a5782c1e906088feef34d4488ac25a25886be8c03c60bf8147ea628ffdb4a0169e509df98f2e03312630205c82234c7520d8d6799c368936d47ff3814a5b84fc86b950b4dd007cce908dfb8034b3a81f8c44c063d75f34f604f39deaec7dd9d40de58df1d78a258afcf87b884225fa6b5ba5e12efe77cbbd005513c4453fde385067548b32c2cb635e2e2b68d96c19c54a4c33fbaf33ccb7f4eecbb0b770ab64b89e9d6239952d0928ff93de10c5151b9849886f97851e97bc10c5d941c693c478fcb95d61192142d408b58f0f4b4935d8d96ed108372c077e70b350ac0b1e931c251378224d80a4d81e1b4130fc151e4bb55b80bf35aa1916aa716b488fe0f0b046ed39d90abe74f30cc7aa816d38c1ac554f823c7e2a97c211ec7cd47251407534ded7d5a9befc03ec1593a66b3de56f9fc9276c4797df7b2a39484ac08a17e21e1a3ad27f9fb7ffa6c2c3185647fb5b0c8a21614e9be4f94e94555bc22d8682b82a9caac376e6dfec5ffe6f05c583651760252ddab743c9cb8debb0b44c8afab794936f7b32b400e30ae7e8f1bdf090751b533d9386ffd092c45ed003e42f1545c913f28773e4d9a768fa5fd253a38688cac7c5c5e9eb70261ae22266266a025ad990c7d338380ac780e2a9b4a61bfb8a8dd4ba046cd0a0cb8325a028e4f8e6655886fb66cf817fb04c8636df220e59096bcc965ba24c2971840385ae74acb2f7da5377fa19b69e8c8c13ed42d8985c7077988815b32438700eb792f698e9599a8813ebeb301cb1e57b82f7066044a8198e97fb9c8b17ba2db9d2050ed5ab3376b3f1cfe58775de5abaaa7e106e0fb005edd5b926ff0dfb80890a20a858822baa4c1983a04086be6afe55b40e6a349b2f885f48af3b1880ffaa3a55ae2bc796b41ec4b042e1684680d5920923252073580551cb8131241d84541088f2e0a3a53521923719a9bc3b8c6b07e59e32995be763e8fa5396bb145323e07838922c2469c35d984740ee89cdf158b4b899dd27fbf37bc831f32ce8a9446f6de7befbdb74c49ca570dd20cf70c9f459cdb9c19d451c2a54a38f1b4b1511ca791511c7f72cbcdcd589f6f8d071cc29f6c34ef20cdc946731acd538ee2f88be6cc8ce2f8098cf153299146669e7a954a9d431aa7c657cd5451648454b65b167f95169514152d258e34b21ccd0c0c9a2734517c467572e4c0a71cd521b1ff6892f8d46526770283ea34d5e9f3851346fd3760449dbdf2b3e461c0a790f491efa72f5bf234e05348eaeffcce498391af4f5f411c34294662d2170b267dcd981904c1cc208d19430dc1cc26eb94c3fe3ccc187a87994d1c66b649e4f0cdac7a02fbabccbcc30aecffc198315411cc6cf630b34d02c7cc3702664f7d2de0bf574e1a31e9eb48d881eec327fdf7a00c8dcb27bd2d87745ffa67950a0b92f7d9c162c4f4b1d22bb7c282ea4b112bddca5fba159e66955eb9100b2a1b12d55111d88e50b7f294236feb569e62e4a85b79ca0aff9d66cd84752b4fe1f9f034856644de5f1565c8fbab8084bcbf4a0a02de5f4533df5f45e5df5f5553bdbfaa8acdfbab6eddca017813de5f95a55b1900af43d4ad5cc29b372dddca3fdecca2c21de0fd555b5eefaf2ac2efafe212e4fd55395517f0fd55462a2f61ac5bb9f5ae9f6e651f4f826c842704981920ca0940059002843643055513abd8f7ff5bb772ce8bf0fe9fa55b7900dfe3fd9f08e7fd5f0b8ff77f5cb7f27dffdfd2ad6c7aff2fea568679ffe7d2ad8ce3fd3fd7ad9ce375bcff77e95696f99af77fa36ee5984fbdff7ba1797f33d6ad2c800fe1fdcd9f6ee5d5b3dedf94752bdf3c08ef6f3ee9563e7f478f7d39e0fdcd99ca345bf8cf1c27f0a23913814f993a4c25df03fecd47f2ff038909a7125045841c72e60fc9cc9f79c8ab9098f0a953c945f22335430111c9dbb4f02c9c3e4159c7eb9c4ac03cf3259420e4ccaa7f04d894702ab9978512de274875669d6fc89911f0259c4a4013ce5c0288c4049d572151a9ce6cbe0d1295cdfb0421e0cc5390bc092c9480e47fb050c28ff709d239b3ea859867b67904fc5380851990859438bec9c2f77f2a2159307f0a0b9fa2c00c0b2f52c0049df7091acf6c3e91efccff431e34c11d02e4d4bb4e25e0ceccfb041d60e77566f0bf9df1d3b173809fd921c06be6470980671effdbf970026091d32728bb9e8453099875fc08237c0f060943127e8453c92df23e41df995d1f9e4abe2fc43fc2a9043cc09947007782b8fedbf9be338b1fee7ce1fb04e1334fd9f9204546d879029c4aee0804f81e871fe4410988249cd9f5af223ac02224a4668a804546f07d825c679e52e44990808e229f92808b84f7099a39f3f80710cf0cfeeb5126cac8e9139451c83c5e8453096844c7fb0419e08433a36644118cf038730aafc3088f1374fc0c0450679e79d1c8db08a08e9c3e41d900b907284201ce2c3e0a88b5229c5984c7e9f13e41e299817c283ccea9044ce1cc38a091020079d188289e39f5d6c869834f90e81384c299a718f9021cc131f23c8ee0f0789f20206716bf00f6813c0a0206f8138e88001e39e1c8cc99538f3a32837a9f20039c79ca913f0102221cf91e1010a1c7fb04e938f3cc1be0cca83fe16b92f0ec389580200a21d4a47874a41210c2a9e4f2a880828e53c987cface3533c4f632af9f09407d4ac70fa04e51432eb413895802180508383862604d6994378104e25770556eacc305f021e07cf8e57e15402f2e080f9144f2a45c393a2799fa0049c790acf83b0c20e9ec7b102083bde2708e6cca987a1791c5f732af9f09424a614403c658510c01550b86f5a41c7994d5f732a21f169834f908e9af7094ae1cc53567814928470e629b17fadf0ac53c9c536f80485c07a9fa07b661d7f4d67ae21324408020ef0c2410c70420180986006e0754c007c09e6cdff30cf77992d124c1ff5e5801fc1bc790298e78b60e6f43007d02f073c8e79f33cccf3433005c032573dfe72c0e9131480d3b4f5ca01709a587ae50f8279734e49f23bccf39c12fb5792d3bc39cbdf3473fc9b32af3263dec63cbd0e33c7d798329f32639ec63cfd8c99e351a6cc8b66cc5bf3f4a399e334817ae50f9a32a729a557fe9f19739ab4d36952e9953f0b66914762eefc0a6691e73177fe8859e4346b3ba729e42cff9229621ca687051329bc6018f39b22968512d8643a1426b732f0353d1d9e30e201a6650ad4864ba739eb95ff204d18ec8f441a8bff9da1991f7f9fc9f07bfc7daef93efc20fec13003ee3e2fc11d06df474eb7421b9ae0d3f203bbfbceeecd59b74c2077edbcbf49735791f7376bee32f2fea690bb8ebcbf69cbe60dfbc330c5474c1a9a1193a6884933db3169645cdc4c235311f5cabf01a66ae62c7f06982a2067f92fc054d19ce5af0053252445b7e55af3abc1cdaa197612a64342349c5534ecaad9006296a4d04968a3753388ebdf24d8bedd99ddddbd3731edee52773748bd3a8e38dc553f08d626797ad5e009762008762058bbdad5ae56b05a13f47610fcceb305d0a38d2d3808daf7b301e07f592e4882eb7567925e9d3b9f15974559fd2294d04d7174b88f332d6a3368985e3163868730bd528616bcea16e87d1a975e29030bb6dd42afba855ef55be97eb8a00b9616edb4e0aefaea6e411738ffc8ab0690d83b4133bfe0df5bc11e160cd67f8162c11d78839b4118090523bdc98fe910135670bf87e9101334dc67beb88a980e3961c26404eab4b859a489455017118dead4dc13454e884974594383fb38868ab348c3eedfa51191c859fe37ecfd41da9a1e1ea9c98a4b87ba88e12cceba95c52da36c76d4ad3cc244a36e65f1688cd22d58b7e8101755b0ffe8d3e217b1a85b74880820ec2f7269577d8d30714bb7baf71974c0dd0942b91d6e22256edc67071412e1d92c0ad06d0626858c2e22ad8a902d0b4da48935918a586504f28c18e94dee8cb8b8ddd756e784aefc73d7a47b82fdadd013f69a680fa738fe79c494c430d437725c8ae3368ae35fcd4e46714a1dada37554ba5a879375559e74b30e4b77eb88ba2d9d503703ea562e75513a2954a7df28053730ecdd8b823646365eb8601cd85f05a4a2d22e5491cd1731b4cc08a97e54320b13630d9c5533a03182c059254505c3feb6f68c50b7f20cced6ad0cce5899c152aa70aa6d6163e42efa1ae2ed449cc96e3f4e76e6992223dd6b06c7459ec11561df6144715c9c9d6aa72a27a153d1a94bbb646c272b5da294804e594e4427dc89cbc956022ad1ba95c559494a89ca0e20aa53dfc519d5e9f7103bca0b5411c5f1534de6aeef297d2b24ceb0dbe49ce55fcb22ddcbb34ee03c83b391511cdc0cce596e636473067585ef6f6344752af859d5e4fbac6282bdcf366c60ff19217785a78d91b3fc4114eab3319a11f26c8c6684b238cb01ce3b8690612f01617f7aee00a2385bae794282e2f8cfe0b07faa9bc175abc3fe335da860ff99a26ec9607f9a58b79eb4ab03f29fe1d22d7a258d1b769b192f47d8bda8cb159c6960d8cb2e4538d3fc609fc961ffce561ba3da51b7f209091b2fddaa2cc06e04ce365f1660310a5b9c6ad8ff8404d5b9817993de4803b7461a4ef12dc57c03ce7a653b0ab6f5fb473429ae74ac4be0d1f481c70e4d7a458d30302d09803bd62b1047ad20683299683099faa79f604b021e3f3234c758af6c772199f566d62c95c859f649b36ee995adb82737f7d197549f35cb9534bae01bc5b1dfe4b651e77ab5806bb13f89a90d871bd4182247754a6fbf7feed730a8ab028122593ee969ee9957b79aa338350c4a3af3cb00db66229eb9b20154cf006770fb69e7b56bad5d9d7ae79d77de75d5ebbe69fffcdcdcb95be7faedcd82200aceb20f82f7f6bf5afd98627a232fbdb28f82bbea91b3ecd77e340d5b7acb3577cbb9e56e8fb3dd59bb8c2db835d72d297d42ec5fa6b36691d22b1c6ea59d368dfba9517320786fcdb92f291b47199ee7d3abba02d1466bf56a9dcf0fa61dac57d607975628c6f2884b3f773022b09771e9d7bca46b858da2ecf6f7090e81614f88e278252fbdf228156d25a35e79a5a35e791fa479f8708944cef2be8a44eea2215a7d77e6475591c8d5d528cb7b94941be509d6a1cb8186087b1f0373178d2dc7c4c092c9cd34361a2ced2a19659a2cd87bef881ff07dfa04f0bdbfb06ec5c06aa6ec77d85ad1864727b24daef717467546ec3d4d91eb8558322ebdc28508978cba65dffbd251b72af6bee4a55bd5fbfc037b9f738ec0de671c5dcc59de5b77816fdf444de8a8d41ededb07a94ecc0db6a20dd7ba98bbba9ab3a85413686cb587f728d4bdb9bdae86bda7b15513bad853aaf3d1d8868c40344531ec3d68ca7eb0f7344533ecbdf75d2ca609f6be868aa1dd0e284607ecbded6231343bb86ebd52eb02612ffad5fdad696b14c733484406c7c0288e949b4522ec7dbe30ec61ef4522aa1383bdb74960fbd926a192519dfa9e149c496c698ab0f73445345cda05bef75f7db05612e9f0c3ca303ccfeb9ede649a1aaeeff85b81686b211ff86e1b8f4e76a6c51fbe3fb171766354405ba5a28e018a914275bab403baaa3140b896ba509cfaa51dd016a5395c2aea56898cce750b2c19957245dc7c67b959b7c06e7d343cb83149784310e1fa370515e80e4175c4af7fa3d09678055d41a12d91a857f5633a356e4657722e2852021bd175a6876b3964c430d43788c46018ea1b43643aec47385fa23b8479ef8ce2d49b82caba82b66e1491a85b170aa5f5a6c6152317e49428c2b5b2f23582268c9b455cbf11be88a33add33c1f54f372462a8f8cea84efddc31c9de1048e0f08ca1e2ec0d81eb77015d0dd7c666e8e9cedc7dfd7e1af07385755f777ad503cb75865eb5574da825f882f8d54a85f54a347bf00c675cef51e855e7f1bd91c4a23985fc9e7691df3f43b76cfd69565bb9dfe3192aacc670f73b3b7062a0869b97d41ef5eb9357d8b8c286143c365993f4aa056ccf16407ce617c8cf6c210909eef799128940af5a063cd6af0fbe40e2ef6cc18bab42f8de995f00323ad9959e0bf52d083e117ff004f281ba04775f8574ffa457668dd22b201910b7cce1e61f3ffa4b2617656f4d6c1215782c5910db47c0009ecc60044070a922c3e2659308810a377239a04931dbe2556b46264ca9097604d86bffb0461a389c83a94d46c34d6838044c876251b07d7a93abf7bde77d0f82f7a250be72f0b39d9db9761688daa3bea556466bf5afefa590ea990a400103ee229d07eeef6e70bff79daeb35a0337d31ca6380c64b0669a4b42bf69adeea09dd1d6ed15bd6137813e2723bdc96e841dd411dfa6b2dca6d61f603faa2cd0ac63d3d3e2b14917cdc6a327d42bb7829d8a0903d3d676d32a4deb551bb5b64680fd69ba2937bbcd76732277e17857ccfb7b51b7b878ce853c4abbe8cb7f3409b144c01c1ff52443774f0f9a3018e045d3c3e069cae94d667dc59897b2c0c7618294053e4cad270c33e05a4f1fa429752c26759653f11aad5725a6b61bd8c06e7aecc79256343b3cc68004e64d4fc600be0cb22a045df9c7d096cfee89ea8c5f69a7c77ae56f327b70bce949f301d574d90fb7fe8fac57ee58288ebf0b517a7f9ff5fbe330837860def4b41422d623cff5a81e75eb4bb7c41864b8b87ef8f58b63f19b67e95514b4877f35c7ae2b85d42fbd72583dead5eb9abebf1e99dedf6bdd3a39269d3174a5997d8a98ff74ab7e9b20f698bbc097bfcbec8fb66d3b4ee155e7141c6f4d1083a591a07e1c676a07c7e3387bea8b06d3c338a6258fe961fe7e53e926d455893a46754aef60c9ec1891bbba0965f9bb19d887c0de50b0b713ec26c5e50c6ec55d575b6bb5b576b72debd9547eeeca1d7410bcbf02cfbccac939385ad64f7ae53f83bb9ae8c72de7c72ae76347df3fbd72b7d91c0b8eb36a6996bf1355c782c3f59bdb88f0a706ce6eaba1ac5aab8f0be576cc5d57063aabbec93c750b48afaa1b91da4668a437200882407a453f7fdff799a3936eedf7f6ab3dc1cf49b2ef86878f1a2fea3c6b3bdb759d0d8188b6f3c20acef07de0f9bdfd4eaf938286b5d652ef8430dda9b5d6026181d947f7e985fb35d4755d342d6581240665c0deafc01ffb52153efc819f9ff6878f5e754e941c106c7ab1b760d7c8e9ac6799107fe86823cbf83933e881417443d7755d37a44689a5061eb0f480038b0a9c98702ed7e82200985e594308ebc0f4ca1a42f8000a212bdda25008cdb0bfc7a53da36e51289af8c19e974f865345be0f3f253ef862ca9e48be25f6c5fae3d9d3b364865b120c90148742ee96a3386b7af1edc9d3533ac29eb2a199b267aa48f8e223a93f9e348c5fff4c591ab277f432fd0f52fc9e209ef24d670fca59ce437e79f6acc81f28b0b40257d843547d6a91883f9e3404f1947e7c1a4c2f3e92f1cb2f4f1a4a3f3e7de51f0f20bf2c99296b3253f6a4f74593f430bfe4d5550847ec74f654da4c881683b9a4eecf7516439379d42f79e578fa227dae42305f8f9ce5ff3d413ce39bbe27487ce7293dccd953794c5f3a7baae93c7b723df55671e24dc48db51e617f92d966aafb2f55e4fbfe547722f9be5348c0222da878510308067b911ee68378ee871f864f7a9ef0493187397b3a76366d167eee58d8339ac77247b15c1fa1cc1ca68c196352677962ae8fc6a7aff1b3c74edfdf13c413fefd9e201e1c1f7e8f7fcc002f98279d3d413ca43f9d3da727f1dc279d3da7b32faea785ce1bea0ba66fa6a72fd3e716329da9ee97bcbca35be9e9ab74a6ba73c7873acb2b7296ff9297971b87fd63985cfa4a21a9aff0eb2b0ce2217de94b674f50aa48e94dcf537ad3d91364bf873aab644f9ed2dfb3c767ee424e2b72d1ccd197f8d967e2494310cff8e2d357761a0de399e2f9f2c5338584fcf2c9b32728b523be11fa124f24de11106398c0043718ece53db17e912f82f1cb33c513be985d08fbd760b9f4857396bb5bd161892aaae00283bde88b3c6910c178c24aa3201cb8e0053218ec157ef8d971d8fff4c42d808f0dd32970f61caef9e086294c89b08d617fd0f423d38f2e7d89af8ab31f7d329825b64f68dc8ebabcb6edd62b65854a407cea16f5eeebda76e419ee7965032cee4edbb786fb75358c3a3315e53226882975755d77f2707c30a029bc62692491654992c69278431308f3e1f04e5d8c95f11c3d43d219140d09ec157d1fb9b8d759efeef6bc73ebdecdc5d82d7274b3d28c4eba89c239bc320570fc3eb3a3acd203b84c01044937718ce2c52339924878248d25d24d128f7834916e8a78c4417e267db919e211c7781a63c61c638e1135ce8c3533291a92870037a542bc07f7d7efdab178274c44182b64b53d6eb8dfdddd99a0b9bbbbdb19dc48e0fe8a806eed509d8a7fd0d91141324023056b0c61c4cb91c0de822e3cecee5e832b0d777b3780e1f77d679d41ccb3e5402a9e7432c87d5efcd827709e11193f5eeb8cd8c0dff79d50354bef0df8ab4fc8fc0c20f0477b856db38bf2724f68187d3da2e1755e1a5a8881d1c86d51051a339c3f478c22dc34c7c78f9cee078a2507b7cdf951695e37f9fd0796fe9874c575f0ddacf85ad0adbb5b775b12c51f45b1646d78c3ff36408db00be17ff75e4a73a02e98d3a3b49f544a603a69b3b24be98174c5754cff065ebcb3b5fb4692ac2591efc31fa3f4aa814eb7eed6ad7b674b77bcd7cca4b5b5bb4f30d4eeac513a2925917fcaab74ebd42b777721775bbfdfba95a5dfdd5f2debd9ad63fdd34ffa3b4a7fd9673411d5a958a47ddfb2ccd0dca439ab49575c0fc76071f619f6a7659d59fb6ee6d19b866929a42b7d9d8d7fadb8b96f7deb565e12962a94ce54c92a71af694b2625edbb1837835fb67fbf4893e3a6f59e64d230483651be586c21fea1e9f9d995441ae7509cfeaece6a942eb83fdc5f6f554bbb4c597f95d22d8a05072db8ab08e1f61a96181a38571b6e124b1312e05cb3e0eeac3b50b7728ed3ba959b08cfba45b1c4b8e07e8fd2ad6ac31138bb14dc41383b15dcdfe5f8f826ea16bd628610ee6f2dddaa3bac56f6cdd50ed745ece7eabbc1cd9fbaf804c57d5c650ace9586bba657fdde2fc6cd282fb2211ae94d1e800dbb91234fff05fc7da60b2f9cb048b2715d101ff5a3090affec67cf9c5f78e1c75ac3174e2e7c8f7a5a0e417daf9cc877a23e34f309873f36d98343d1ac988e1fea5cf5ea3f3672b8fb2e851189c9f32c982be4f0f8a81b1e1fd5060e534cf18f1fa8cfe9d50f14dc91888f21e0aff0b534529fe76b6984be7c76bec87747dc3a1a317b8c7c913f62f61cf99d6f1d9f92c1b18e332fc1366f73d652888eb3ff83b48e244f55339b368ef0f8363f7a576570c557cd5440bd127ff4a48c1e59cbb1b4829b5533aaa303e340c05d0f78aac2d2ad940aa857ae9272ea02f670b36a769e724e5c08bc2af5e3dbd8bcff29e7ae9efa82c099129fbe20f02204ccfb38ab664ab88171cc9adbb579b114629a4a052cc136a659b12d5518dfe64ca930becddb9c2edcd393f2148f95b4b1b1b1b9cbc765412d7ae5e8a8ce607f15c5b921644305fbd7530e8477103e9704c93fe06b894401ff8013d3cc7ae545cc144f91d92f79ed98299e9d7fc03fe0eca101fa2534326775485c1a769e85a7a1c823a9e590c66211d75f343da05ef98e495f45524878789ebe583053485658e1e96bec91969e945e8de3a9aa4d6e4daf50417c6cd203ea16bdb2031fecef49e9161d7fecba1c7fc7a4afb1b6946e8da7bf07d42d1def3fda3c2d85a8a2e83053e3573c7e1233359e34b217cd9366f97fb8abb23955b35e753e3775dacfaa99a53829a1268b98f4b5933a73cd8be73f2a09189ec1144b12328ca4bf8701bfc2d9c3c2ef7c2d91d4ef69c0f39c3d481e1681a701c9d7df316111781a5828425f11f8209d4259a49f85e731ebaf603e9255af3c50b1f8a449f13561dee633a82325a69e762b358ea9d409f66afc5aa6be5ba9332fc137b41b5ab752ef7f43a54ff0a757b0bfea7710fdab66eeda09c3302c8b742fd50c85ea685e0a11532991c4a9077b957a5a8a9ffad44eca9c528486c747fd581b856a638647f264a375341a9989864ab7f28c91c94423eb564733a3a9d108d9b0f8d364a1894203649a31ea5656cd668eba95bbdb8c97992f5eb900ab9aedb85db3c79ba6084fa9e99a3025dcad99aef9a34716316f68ce727aa542c1fe1d0d04efed68453a279868e6b348e4a76a36a392d9d8ca12ee948bf1e956beb553eed4e56414138b91c5cc62a2c448f1723a12c75bbb42ddca25dcad72ad4481fd71bc8d8dea88bfe3696454674ce9b0116b25dcad459145afe6ae93cd59fe62cd1477549f6f6d0711c5f99dd15401519cf0dde6d471a6ce0cd2c8529f73601e17c43c9e52d70c8fa791d138a13ae3fbcf18a5ce9cc3e6cc57c78c512a07ce25dcc9e6ae120e756d70ec0859c023c23662a67c4cc4264622ac131d4c3d301123cba27402060e9915af872eac932ba2cc0c981ea6383989f2f5c0c3c98a5076a5e4440b0e1918600f44e0a8d5dd6bedee76977db9b741cf2875b2eeeef6fab3fa3b24eba7419a09196ecff3aa15c25d8c07166ec1fbff51a81b005a93013d5101c0b9abddae06329cbb9ae9e1b149ea1685bad71a79de574a47c7fe6d3f9b70776f8d1c04fb658ddcd5c99cd50f82f71ae17e2fd6addc71e96cddca5ecc83752b77b5eea85bd983793f5dadbfabd29e4f7f97ebfaaae1ee72b8e5b6f313847231ad955ad2141089bfc0b34704af2f64612772d704d7ef64f54dd40cae3213ae9e6c06365c29143bd0308542872d459842f173c35646756aae67387070b395b50facc86030188cc9eb7e57eb84dc45a2810da490d9dcd536d8cd5df5e55668b10116d8ab7e87f3169c85b345ee12bdf8608d2c3977552318ec5541d17adeb9e668ee598d72991a155518ae63ed80aa0cd73377b43ac3355b19b64245f5bb9ccc5d3044417081bdeadb9991bb6acc13b2409d91b5b98bbe4ca04209dbcb3b7317ebcedcc950385b5937f33377b03eb33df26c9d96d1a365cd76d6764ec086c6d8f205183b58f1b256b0fddb05db2b2c304a62688717e011d3a11d6a385fdc658cf4867e4daf6c7033bda190a45b8d1d0505ec243933dd42967e6e8ababa9306c7096efe01c4ffc7d00e40980efd64c104c074e8678651a03a8efd53a03afdb4cb5640b7285eb92b4768760414422c61032f2f7f1e0ff8203da5eb1980d14b0403307a51ca5361dd3900a3572ba0578e42af604e701f531a7c21e556db5619e94df66a5aaca400e883c11111407c08a2efe8e86886198efe6835831fdd4e7402f404c8a3c56a2e4bad4e9034234a9104eeb2edcdf05892a41d404cba40d5843e4db4877ff652d061149eac5bd9f3682592dca27eada79fe052f76aa5da486ff2076483eeae95ec55f7f7703d9c1f531cdcdcb1ff665f141c700e9d78efdf32d0339d7a557bd530a0cec2eb6dd7a2b697dc926c576ed1795fc8a323100aef23e98aacb1dddc7810f9a0404a461fa84524222a6d017a7d0f95e0faeed525b8e6bf0131fd9b1b9c1fd7dc1348a250ffa31471fcba25c66e793d5bd17203353886669db90b8572103c2b10ea51a87bbb4ce13db2ecc62d4a7bf3b27b227129cab688e290645002dd153ea57d4da62df8298e094c303f6abe59ae9eb9c4cf2f82e09d959ab8f573c390f447138ca9bc2512399a4453089a3eaf33599377b500c96539aee86c40da6bc5bde28a2b4c2d6c706da45d31b5433b68712eb8dc70cee051ea2284db00ce1040a90bd6475e37cc91a60243b263c28604436624472e6296c8a8d112d488d213c92682651bd79d2c51506dc9895b9f9a485dc922aa0d7bfd6e2d6cf96ec9914c286c11eb15dd69efa626905981b0ff0cee2a4259fe58607f0f03fb9b3853222f7728ce96a35ee51cec0dc3dd095a9344a386e9df2eaed3efa4b8fed405bedc56db778391960ba00da027dd1961c879090ecf9c2db7737ad54f63b788c1e256fe3003c1392720393e8672f0d1416e7cf1ff7b5bbf2008c0e1be90d36fcb06e425b83ef8b65c40f8f53be53dc51fb880f74bf0dfac787ce1f8b414c7f0ad18be0d4fef2bf63e13c430b870da25d8cf4ecbd83f9686d41e72b27909267b5557b9c37488ed55cdc9b1b576b5ae9c557fe5ac223f7e74de29ff283fb29645bc7bff20ddbdbf100f1019714764c47e82432ac5a95f777c6cb83680cea23f9672fdca211587e59051a4b5497909b6562cfdc792903a9646a8b34a2215e391a4b549fe20c5a1751449f68774dd69cf940aa30c4b6c056932b467fd65682f38044c879adc30cd2fbc9073bae03de89d2ed8eea44464e86cb770b8fe2fe4600be29afbfb5fcb5013211d7cd9814f26bd14e2b68b31e2062cb067d70f5c20a542adbf04e3ba45774339ec1eb551d7dadd3ef34426e9c0cd555654655556651d7014d84217750ee5b07b041a758eba2ef56acdd342c4c52f09ba77d5bd562e9ff935a0b3ec0d076ea6b6ae77d5f66dfda1aedbac9a8313cdbc7ef4a4f6f44eafb35ee73ef3747ff4aac660dba9b5a8d20a82d4eb346aa55dfdc11eb5d9aeabb6eb6a0ef6bf9a5e9da85e81191c2b79921eb8f9c70f77d1936c16fd5a2991c5a2fb917e18ca6067f466dd82e099bdca04f85ead526b95093b4340909cdea9e7ca598e020c442db853234a77ba15d1dfaa10adb5ae9b61eb5d0b46f073aa0961f6279662c9404e9d3fa5ef11e0fb1caf0470f06b201bb89912d976baadcb36e903db4aa90f02b8796b56fce94dee225cbbefbb1f4cbf6ec1f565f8b0fd6c71ae44f4f44a15446ce9772511efbfb6247df2a714423f9346a940bdaa4ff0572937d71bae5f6f55c82b5869954aad75eb64ab8bbe9c967ede36512d84187766a43ddab794077c52d396b53e357171290d685c9a62a13a5487521ab8800418e5525877073df0039d65ddfef7cadddd3bb7d6bd3d140b6e7deaeef76b438b5b9f82a4940a00c0fe156707603f6d8357f4e311ac9fabf3ba6dd7edd6adc5eddddd6d564cbbc16ef0037b90c4182a09413054f2815e57b2b6ad974ad75d2165d9a7260ee0fe6a4b153eec5609eef70f45f0f32c15af32e37261301dbae1864ac62dad01bba62f6cb821a643366cd1565c11d3211baec0e15a4c876ca841c5723f4c876cb81dc006db90cf15387f8e1a15bc0fe6d823421821522551229f1a1a1c9570a3f4b24f9ab61fd401ee1a6242fa9e51ab90c1b906fb0eb0bff507af14ec8f1a410fb0bff8678c0b2f72a012458a279ca812349638ec00f4aab57e107751296c5dc860affa3b5e3f49b76a85c15e7985999c00f7dbeec1556385fd41700914990e6954c1031b3479436805a70f0adcef75773716475ccc60073f08caa186573781bb6170777777570ae94c9e720d169c6f70e681fdc5c0fed6aff8e0891ffc80fd076360bff2c613d887603660cfc1d65d089801151ea8a0600747bc9c09ecfffeab6eb17cc0d17d3ddd13e35613c4117c9182fb6d7fffd336dcd0a10a0f9610a20624961082c2e42efbaad88d3740a0453027f8dcb0f1c086901b35e8810d9c1b5edcd0c6cc0d307e8e8cdc40e3a70d58f8a4dde062cbecd6607a850b1f5c8182f3b709baa8f5d005140d45175b84ee09d32b5d78711714c5dc766130bd5264026c627ac50ba11c467a9363567099d056925e7910a02beff3e783bdf778405d15463d1f7869602f7b6460ef3d21aaa3c3bd9bbb4aefbd47e42ed27befe1dc55bef79ef79e171402d9132249b7bc195d79ef7942fe79ee5df39ea369ab09924822ec9de8cb9aa433e787b3c08a49a1539325d39e39267d914cfa02cdd20dc0ab347deaeb06f0e573c393a808de937504efc126c17b4fc85da76679efddb0e7adc2b8f4653fe6cddc95c48bb90b8518f684cc199ce5bd584531b40274c2666044ece2ec095daf46359cbd22710646c8400c2bd08dd6ad4c8fa274abb2a00ace24cede0c7b2dc0d9a39282ed6a542707f6bec2a88e8f07a33a157b3f83f749bc072f4871d87b1414d0aef1bd1f290ecaf2be345394e53d68eea0389e67cd1dafd1f4b93018ac88d70dab97cf0df7255211bc07eb085ff56996577d7ae57ddfbb99bda0ebffb937a338de07698fcaf56e1e96f1bf3f6114b27933aa439de5e1f7d913c2dea7c2107c4fc8b3756b067befe5bcb48b5251e4bd87a55bf44a1b32ec554f0bf69e66af087bef59c161ef69f6ba60cfbb61ef43f0f366ddf2b2577dba5595588097b0eb9fc198a2ae49438cb6ead5be26ea567173895e12dc130dd4f3ecb57ea24a54a7bead5b30d21b6b76415c5b8231bdf8a129a26a447334fd282434b3587a93f8a54e344be6354f585cd4771f665a149abff2b9a4173f3f26c727387c981f2b69329d590687f9b1144ab9a5a7bd2a9da4e9cc38500d38e2522cfec5a73f7d97297ca7ef5ba314323ec8e4bb2586953a291ce2383c53e1539c1a5271f88d2b0ed2a4399aa119c441109b4ca6bf54876293e94793898a724d5df7a6f02dd5298584e358325d08dff463085382299d29154a2f3e91d2892387ff818a4b7f5f2c7d787bd53daa57ddf863486b755269de1d93a7572fc5fdb65c7ad3dd0a6a310356c60efd5e4e67cae1bad07dfdfc02d99dd905fffaf574e1fbd0a4639319ec64f84cd299c117c8217d86b9d6da237bb8fb1828c5c921ee406fa4340ced0dca2f954ae43f0afdab20eea2affe1d9efe08b4abc678186120fd25929442db6a4205414c92987cf249d2a44e2e09924ffa205d9a53ee7b66aa7cef29ae66aa3c8754ea79a4b32cbfe97dc1b5b5548174bf7cd14c91be62d28fa4f3be4ecdeaff707775e65b7ffcfcd813df3c9928ead549b70ce2521cd3ab3dba2e9343ec9ba3b537b8987a4fcbcec3b6b3b5fef97961547a19bbd5185370caf7a76ee6acdac9a85cfb2ef09d55bfc3b55222da34debd25dbf5bdbf6776318ae30f0a259144267157fdc9486ff2ad614a032f68604a032f64e054f721f670c595ba50aecf264c4b2bb83f50178a5659b778e0fefa84fcac23467574e066f5997382ea594d80fb81f4aaed0aacb5160bee1fad8024bd8a40af4837ee0f25f1039ca48508f4aad69f5e59b901ab7ea31be66a60614e05a322f41371963c984ed29973c860c26aca18796912648ec05326b7c3cd30b81814e8e4a58d27799642a6c4fcb9634729c47f0779f10d79530a21ffc654530363eb158c09870117684b460b181a6944a24157fde451392b9b286b4457986eb79a1a58afbc2240717c98219bc94cc99ec8e46068a41f41203ddacd35b01e6ec2e8d0f129d327f5af7a9b30e7625763a68c523992992aa23829548502e71414dc9f4ddcff995cc0c09b32665011fa55a60c1974847e1b53260c4a423fcacc117316cc593232b90090a953264745f80973e4298ea78ed386268cdbe5303d9ab3eac904408daaf4a6dcb31ccff276438e6300483769400fcd29a713f4bcce8a625892652904664b075384233d15782df2ab270c1f1e71ccccfcc9f439bdcdebf81a199c8c163530130e095a392b85c8396eb531cb1a5011fa759825157484fe1ab38c82925012a5cc12872b8bbcc8f73a9de58d8ad04ff3862bcc39ab494663509d7e9930a809a65bed4175c6cf397e70e7f0c12df305e7284ebf8c165d6470dd4a854157fdb71a10c5e9af81b92b150565a5924082865343d06ea5a0d0951051b01535302c8a707f5803b3e19213b319532667ca18f5cacb91b372c064722a6ccfd42c05bbb9bc81f5c7fa612e0aaeee04d72a228c0aaeefa74b711f707dd3994d52e07e1ad351361286f4117c904082b71cebf4b0c1dfe9e69498a70923247354041820120dda8221823c2a676513261c79e426f2a864ba996ee447049009673203e60a98263e195ccbf5e347ea8dd41ba937489174205c7f1c8124a7a0500f9a31d4277d07eb5669ab81b6ca21130e86e6ac0e0aea828102c606d4ab2b680b8608baeac7f13947939f4bdf853877c9e040940923530a194f185c6cfc405bb76088ba1ca22d982be8ca84735798a3b98b3c7228a8cb54036a7397e9e62ca06e95b55ec110415b650b72dc1b9a70259cc9a312ce30b412164f181a0c0ee7ae726692c199a9544e0610c720c385b9820b0c51b7525e843977a59ea0acfe28707fce0a5cf846ca4671fa4b668a4671fa4b3335a338328ad34f1eb92b550465d500c87473570a0a65b520f5a4ac752be584aefa3b2584432a09dc7f04c339874c660c9930688f7e193347cc94e9d2abfe1853a69cb94be60856ce707f09e5108beb2993d3e1da68e16243d4adf2a3f8cf13f7f19f2fee836bae8175ad81d55c03cb365b6a70ad81e1fe1a588d4f4dac5b5d8c59e3d3ac7e9d528877d6c04ca831a11452e3635403238dac672dd5a11497273802e966e8c3b42484a08749b3529cfa3126ca59f547d386e694d3499b659a7f3dd4dfca1b004a216516104a2135b0f25603ab81c560700260e1e0f0c82171a510982dbdeaef510a296f14a73fa5c4cd3238dc2f73d4ad5cde70e7bac818c978e9567ec16bb8bc511d4a758c62689e3b6e0a1042575aa392954b605a0910e92975f9dc26c1fb1bfe459b84af59dff8f57d742bfc4a96e514d28b6696c192ced0cc3280d676d676967e24e9f3beef3b53e053ec6729043c7f58f0cce0e360357eef991feab10743077098c2c5200c178367ee000e4f17be074f7a7ed7f3ce947d8add330f4c36180327ba34510316144dc10419621c7155d1a1081c505053220c2332e8a34a0508444127a00d7d11a392bb38e0c2061a54a9a24311180638820a0f6ce002329e48f18591112481866d8d1c9400c8091e2c89a1a00539f4e0498e56c405ec958fe096cee8e18bd9961c7834d105b55c71c728ea1b563a7749980ecd8e50c18c88fac5ac043a98ed70c32dfda01bc3871d59dc530e90b8e414adc51d6d5ec312b1208a9012c409da4a103fe0206ae82145415bd940630808336a184340f0408bae610808222843403cd10d015105db13b6d65a5bd70082160410425429eec57408081d78b839bc94e09660f4172dbdc3d00f371c0cfd00834a34f4436de807150cfde0c3d00fb0a127604cf1a40b9c6f9dc193296231f8c1d093246030f444881c869edc50dd18f2810d3be48318433eecc08732ca26d2d04287378c9c206272dbc1117ae50532f8320217b0c007247470c4eb41133ce0404a1858047961642cf213c6951738f101076bf4507484ae808720218ecaf0c10db52e8eb4e0031054dc8084131bd0e0c2c816479230d2046602273e7c19ba4194d8161540e1018a0d3a88c16c8a16475865119d1bb040cb5015143421250b2325a85de1c61644ec10430116472a00c40329b92cac2041159c112b4a14d1440d293da80087235e340747c822a41116cbfbfa5d8cea78d4057ead1d0ed7ff5c45b87a8cea7caeae09653571e2040a9421bad84963a39f5d8ce2d433bfd0d53058afb8f906df78494485bd18b627798322c6b89f1af547dadf8ff5a496526a2975fbeeeeeed46d3df56a54e2661024ad3943af6a4f0b6eae76f9ce9e66d5197a5512e37e69e04c8f8c9418e94d077a55bdd833d390c3f6bd2d6eae7dd20fd26d76a057b58f6cd36e4a9bb6f5ac673d6bdbb6694f4b7d80393f7c802b10f5f9bbcbd251b40f43fcf4404415214c707180c183f6e28e4d54336e78442771bf28dee49a74a07245264f5c100c16dcd00a252a97510d2c40604e9843cba1e584b41a48abd1b6a079c92d89085794cbc9312327a79643abd1b8a0e5d47268351a0d68e489085794cbc9312327a79643abd1b8a08994d53d6dcaeaacf801ecd6e27272c01c5c43a250ffe314710c73c09c90560369355a151a4da8e6029f56a1b92b27879653e3515be5589b63736cce89bbaf13c0feb552ec0ac1cfecb063d06ccaeab288bbeeab5fecfde8d66cbaeadecb20c01efa68567f17746fbaf2dff30e37ee5c3e8eb83528544e2d8756a3c58006769f9373821c989c9c1c1fed6a5a9803e684b41a48abd184684039be18ad5befa10b67c11445f4c084eb704f980ef5c083ef7063dae82a2e98a576b9e21507e28e4d78096e78041b4ea2bce14487867261cca05d10d3211918ee23bb42c4f5301d9259b921c5c0f9736c94d1bbb8f51b878705a31840a90702b05fcc237e2c42d535614365bac72e6240a291f4845802ddfa4d29a54cdcfa4d29a55d22a55490c1fd1fce19c02d0e317e38df94bb7f980ef5b083ca850908d72f74b0420a325ef47118716b0d3018860b8c88e20656d8808817edc1184ca0418215106184e555dfc375ab56d185ea58bc811576c1bf3f7b395c3d9fbc5ff97b66eece1756b87bf7707e7a449e962dae57eb56956ee5c03970f5a23041f1a2304531fd98b26946744464829962b8ffdafa69be37dcf9e6ab03124cc1650926b498418257be54e07c73b8f335ba5e3c28d7090f8a15dc57c803ba543ca05ba5e6acda05aad1707fa9288ace25a31fe05c3ada52650b2953b8608a26af7cb3e07c63b83f5fd97d1246098b304a5b78e05cc21995b21895b478b09290072bd93cd80df79760fd349762b873299766626c3104ce0560cc9af8bc72690a9c4b34dc9f4bb5521527d870e20b6ed291ad8bcd0b110947544494c3fd24a01ee04ca29152509443174048e0c00667bc32490a9c4937dc9f4944242d5d131294ae0929ca007026cd3a19e947467ad2011d0191601dc9d6e50d772e73898b99a249edcb153088d0e195cb28702e73b83f9746279c4b2f58944e60515a1100cea5505149a5a8ac6254ce8c4aa09286fbc9a2353299c936bc98628d14bc21a50b28af5cde702e63b83f97b2189ccb27b608120b5b04b985853389b335328bad69b13652c8666d3736702663240762a0032e455f82c061f6ca2414389334dc9fc91a6e9cc92ad6c9c88675327e19bb8c5e56388f4776366eb1332e34a11beecf23118e571eb59c314239638c32fe8c4f4c9cc7d991787434c28e445b3fcde20d771689b2881bc1113e4c51c596d918af2cd200673187fbb368247ac14274020bd18a4845acf2388b42456214514a0e770e8d70875960c1124b630530c8f9e09545d80c701663b83f8b32f195c5274f84583c116e09b3845a70fbad59f5736805778805f787301de430873e9818c30a932f98784119af1c62c139a4e1fe1cd65ce32b8755866063882f5dbce0068f68208e5644cbe17e1048076790863b836ae00c2e11420a327ae8a283152cd1c52b83433883379008d4e24c4028ce048c02fe804f7083338f7d4720cc63b11b2e87fbf367f479f1e273c28bcfca47a50aee4fa8bffefaa3e58ebe1811fdf97bf28487c513de162f0b6e2db83ddccd13ba79b67e0fd6efc570674f0c9cbd067c1102075f48e141114bbcb27705678f86fbb3d743743d44d775e98e681d8e560464847347c39dbb1a1e03e74ee80b2a5284f1451559d0b8bc72677b02e7ee86fb734784bbd3d24c3a28cd244ad7ddac63471dccdafa69b637dc8b0a2ec0b0e9200a32a2bcb22db2e16c73b83f5b2f565827acb082fbad10ce52c1d92a393bcb5920dbd9a5c0d98f6c0cf7672b83c1d93e19c2b118620b6ec7e1a679169a162117725b158265d1d97b94a1040db254e1021918bdb203c9a03f7b95da848ddae44b77f182fb08b7ac28476b222d5974ee2d0e6828148b28b87bd682b37e9e74cca855025dd5cfd5095c8215dc5f6dfd34d71bae3f572fb85fb952c1b50a6e5a1067d577006d857455bfbd737d82fb6380738dd584213b238b1f8c4883c98bb6d0af8024dd7fbb062434c1043786ac8b202e5e1506b83fa7df876371b377e5660fe8899bbd5a6794bbd98375595c70e882b65b2ae3665b84eb97c2b8d91ae1faa52d252d6eb6365cffb671b31fe1fa9d12f5cb1f2e89874b7e7173637173d370edba2b68c470d7fdcdaa7b544d570208389fce58038fd003237a4069ab13a23e58457d908a4b82c12559b91e91ad1908d8fded98e802779d7d75bf434471f68870e582ddc3758b8824a33ed9e59642dcd212b754e5e6c7b54d40d833ca31c2abd65a6bedca9e9dac817e466bc5275442c1cdb6b4c31232886bb948d9598d0ca1575311cb01a874a9c08116dbab79a8e246d1cba50515dbabe7079627845e22b03e00bd68936069e78a81098e5e63e9a8541382bdda44750ae063d3696a4b5f6e578b25a359a8f44a95b7a922868ca1190104000000031500303018108ac56291481669c2e8071400108da44a704e9449b32887410a2163880100002100000003338341020091ba00e1af897c8868da0161a2a3721fbc1e43d59be171e5c48b796715a9e083234ef6ed7007d2021a96b30c75e21e15cafef8b6bd4868c7e1fd4c1be1f7793b083ca846b9ed8d54305cfb96c8710d494950d85a3a467ed944225eed0ff357bf14ff5fad032f0abddfa2eac0f8e76c2258c8c533435250b30a9999f246ae42edc1f44235b8a03d4e80524e910c520cad50c87fbf8ad44c52f72543b295d32fe0655c1de103732047f5c784fbcd3ba8df6894133316d8ccf34253b2b13cd9e57eb3505884cd63f9ce31d88c17d05e81e151c60645d39383fed87f341c131e9ff83fac3b84f1e05714636400101705d81a047fa79b8b893e644fe8c246ce288612504fa4ec0491cd82e179831f94c3fab115795e01a06501b7cc7cb5959c05bbdfeeb64c6ade83ed157e0fad3fb9fec16cad04ff531956bf7ec3a67e03f4f718adeaa322ef14d0f5eabd322c0628d200a0a02e5041f28425acf2f5420235f894c2beb18093a6f5b8f2ccd3448e0e93b593d08f4b0e8e0d2aac571db0c7ea549e56f741067096e38199c6d108e8ecef3c1df417898191121d659c53a977886ddb0c09980da71f30bb9fa6cc4699ca770fb3107353254a7e46d83a4da29d751e1c734744b12d5af3de8005e6125d0787e0aa3166f6be49f4f8ed11cd66caf6cfa0b04dad88f9ebeb01148087518c46090e2b8c60801112327ddb529f9f08978a9137681545d33c1c741851144ade48a6059f9fe057123769e46efc3b240e74241e9ecb3cbb99373c043ee2fbd6e416646bf54d34c4986ddb4b700e7aff514bfb6e28a5ac3a6d97b25dadd3fa09e27e05da86b0e5d7882c24b38d26a49781c7f08b7b870192f58bc3397c120bcb1b8585745b2490d79980ab129ecd9b0222facb5ae54b54f56366699ea61cd4d12bc9a99baae20444a884b14b8c2fba50a202fc9efc5ce6744714cb9459466cb74c0afbdcaa6436631dad13af992ec9ea894b7eb4d974725bd876d519e877c749e445dc40fbc2343caaad7de59cb1e7eb1d1ff2c10ff3f85d60df1d98f1602891330902f238ac32d5333a99f4d5bc39e9b27f28c0002a1b655cbd9db8ab1e6f685be0da4457490af6f1f065922fa1636d1723eb2790eb89c5672698bc35392042b640b3a12624a7d0482fb91712fbda1aabca374af90292f4631734ccc793d97928b6023786bc649f98e57ecdde0eb8d1c699480c3537e9d1e545737a5390f83ec4c9c32f8121b6c0c6ff0fc996554ca4676fb3acbb4753574788a7b8fd5cbafacbc9936fe8f41a786ced52f34d5daf8260d42c61d5de6b91ee7de9f5408444b6c6839e01193876960d935173c4ce4fc21190d1292076ff974081ede61f6184c803f963783eac4ac0927ee888c0f57fb53f256b59e2713cc0849fab62769cac7ce2e68561e69b7eda0527d5dac3c3d61c18dc27294714a9a40fa3ae9f403b5c287bdca2d1f84e218b87d6f5dc1c2361cb7ae48d333a1d47ac10254e419fa52ba6855f96ba3f83da77f215e6acbe87b542a679e3956d1afa59e53b0f81311b8fd8e34e7a47add97643ebdf9cab0749c34c608eb8c910d5df0b16a7ef0deb84f350e2adc9743c77962cd073e7047732c3a4766df1c1f464be895082215e228c58ae4d73cabbd0edf455cb1b2fadf5a0828f9b0e8ee889cdc9fc3626c4dc54b20ad76dcabf17a159e10946c47d6ab130973c80837576d758a6160f05476c3472eb9a24d5548650734c0a6deb5672c8a0a490ca97699cd790c88f8276529e1916fc9893398a01723e8b9ee707dea852f39c37273f07ac88909072d180c210ea2104f28642963725cddb7fdb98f88a18e5cb9f490fd69a38ea515d1eefa9e27f039356466dc19e0b79ca5cad7e8175406f76d14a571482197807037e0df4cdfe96809989ef8bee482e99c2ad7bf28b18ca2a8e485c2dda76ad538a9fdc744a8cd486e0c3760f3ee4ae1494aba143d30c2827006d5fbd8687c3eabcab468dc8e53f664658169900b66e70fb291825c8da7d1b71424044b898f0a552cfeac6fbaa645b3964c047fe1d0a5ab4ac7a5b8196aec6eb93ddc8416e5cfffd2ca85f0fcc38c4627f90f385c5c54133b74214419210342da896d5ff1568c39ba8006305c745c6ea385582bee6a6c1635db72d60e1eb71306a6d68c0370a50927aee4700bf48de2b1997d158b27d77329bcb5e43d0733ef644b11f2f2ce33e920702e41fb2d377f785a0e916abe58b00ff033bf63c734a433d61817e3057e409136a37eb2f2dfcf1048ec6a56ad2d738fd4355fa751b38b88e95f256cb7a0cc799cea6b62aac94c46b2c0755d88cddbd10e1b2751740045e10b3375e1c0186388babdf605780d207eab21620cbef960e01c925dc7d274b7aa1391d2c8936e605a27c55364540d47ed1f16d8cb3ddd7bc1c115efecc2c4bacc7367efccdf96cd3002b5539e6bc48fade49f994aeadde8a83b173b2131773b0a36d65f7ef5085f68c990b3f76aa09d24e5e4e078bd0782a0d4bede01b3131f4e38f8fd1877cc95dd86bc3ba30c7d3f177762be25f69aac00defcbba2aec2f0471cbf4ef446c56d46c8580fb28ffd6d9389e280ec8bc328e01c42c4510d64ab7cefc1e0649aef6793d98811c4074f13182b0389afee6c1167baa480707ac2435bac3e7753101ec2cb8fad64f132ce8d3b85a168a25415bd6462ed0f69bab46507d9b67298e92f6b237826d797e2aa5ac59b4510c8eae4335811f6f371dafe32c3396fd2e24665dcb4b73f7b0db0afa6ea36ac3222905c41e2672ac188ce68d8b6649af3cfab762abd971e894fbdb01ef31348f5ce251602834fae6e8615be6ee81ec47f7c0c85708c62605f004a55c9e2b0ee03d0aa966ff4f5d50ee1ebc369c693e1e07f970a82d84aef09aa68222fc784dda0f4a149e4a83148ba2298bf445c164eb6f9f12723c94290b3c2e1d0a43b9663fa80a2b2c7e9ad6ab4550229b9a5b41d10201701e72f7f15cc97911919a2b7ccd67104812231fa72dc8262f5fa3877e48afe26ac73958b6c2ed789aff8d1032fe60b52a641cb9489e68480ad7d421951845c743710b8fe78edbaef8534b825ed84cd096416ce1bb52f9d9860ea0e36eb648cc56fd3d92cca604255168f640905d183670703f02b7c74291a8f97230fe0b0e6fe4db9841352bdd399fe28bc4db8a759753f2ddf4f0856588d12e54f42314455f6ad8e7f14133890b3e8fd73f2b495057d66a655f458b767720be3fa8218c719d13322e094b1c9b2333a37cd9573109c23bd2bc2c94afe029062c779d3f95ab1a6e585ea3d6e3c96a514f8cfed4089ba25bb31d55b0f16f08303d5a671124b7855dca37312391e51c20c0c60e3edded1cb627a14f2aa5753d6e8b6838bf194978cb0942f6b7afb92f49d9fa975ecf8860a8974462053110641c1a9a5ef7f63f791a8011dc05fdcb21ff02a3e4ce2a55e64b3bb3e8ac21ff078bf067220c03068c5794a5e6921d33b5d2d554264ddd5e1c1b3dd1fec895abf418c7841ec4f88fe2c0710ccb275ae2c4bc0604cd1550a80dc0d0bfb012a9c3829aa8ee011c6214202a027941ec0292f56618a3610774da08ebe163504eec39288f1e46bef980db61e6e3fe4a60e8521cb78cb5122e1b53c578fa32de9d6e9e9f68c8da6e5d7f8f450537c7a3d478d20ebc0c20b30780e109ed30e703e85839e041337f00ac9deb0a549d08cf884aded21442129c341183ba9d441c0f23a720a0f08e38687a625b0c76bf72f83ac6943e3e7fe5a78293624d87dd9a51d574610085118816a53b280c09810026e3e011bdf1e5b0bf0996125ee137617688f8306cd250d1faa2cc87a06fd2d3b15a85cc9700b13f8d1caac6251eca9c4497be1643a9187ae0d3997defb69f60a873dc3af66c4f21e3982784398469102ec159140a8c859489834ea0dc497acb45214de60afa0e13852492e241257d89f3319a737535874f6a1a30c434434baf8b6a0343ce34d0fe1211d49b3910c85005ccffcea7a21878fcd27e33d199bb22be18933fbbf9d9ecafcd878ddfd2b92f046dc24dda1ccced6c293e125046dffe17823f89306e0085b87287d910bffaac58ef0b796b6c67f786418d6a3a163a35a507c985be103381c0cff0d6169e2fc7650674faa039c056cc0dd977c37a4e97c12f0076ec7335a4f3a154fb0e545a01ac3c8fa807156ed11434970c8181e070cefe5851030382ba9c2cef5b4632694010506f2c56aaf8873465ab2191e9d61f10686af9a8367bad0499c180a8a519072adff284134f348b8afb4fdef88316e0496c3af6ada93488a3def40336af431c0e7dd2029dedae6000424001d529b0c8f48646cbd926e902012520a220e249cc1f44f55a9388bfc0889c60210428b40acec04e086371c62968c31df6af70c06d6a519978ddf73c86ab986cc7e70368410e18e01687d4f74738d0f70a287b5cb060c3ea57bcd6164969185df07128874a1a506fa49657bbfc27ea3db184ca4f6cc9108e9575688f97334e382ca28169e3630708135d6544a0bfcd6e41fc6166207eb8c5886df1bb0ae9098db8cc738b113f143400396365820997a6c46fa715c1f12bfa306ebef2200bb76a37b63c9c3f83cfd1c0452c039362cf8131cfc54ef876357bc747bfbf1b5a5cd955ad770d3c5caac2f74af0cb1374b2ae5fd25c39a206efecfb06844c1d026a0784870c2d428e96f38af6527d6516970829fae12561c61ab33b3786d847534544cca4303d4aa7e00e2981eaabaa5e6047491716d3c8b60ef0ce83b6fc1f246c0fbc6234c220993db362c484ee75b5c7b18abc979a10ce1c0962cc16488b2fa0c2e38ff57e6f690cccf96fc27db208426de2de77989cd569e970bddd07cf81807ad7ab09af8f4493946999a68d69e19b3737fb8e7f5c042de40070cc5ad426409cb256b9a6385fbeef912ad049c9b4f1f27a04823095810708987503c4fb98b164062169c2321bf2a63bff16fa66a6c98386127989eb2250ad05319260ceae1758cf0bd3de6cd68f04987d1582ba630cb60ac994ea63dadd5d50c1202fe381262a8627ec7a34a9b2ea2ec7685db50d67f087436056122bb0a189a73719d04566be2dac12bcf27b64b94d13263583c7ef9a85d8b05cc8cd8e6a407d0f2865912f191c8abe4b8cee6d8c9579c212fb62a57cca81b90bd3aa7b93e4c4b00a6817bb43c7590431968e0a04e3e6629904364b663b10e1dc5fb6472a71f17b45239574687b431554ca84085b5984447d18bfa1be4a605c2a6057003e4642da633f1bef9b1aef9288440ff18be960b985ae507e5439a1505ffe7bcaa17678a64bac0699bff04bcc77fb63d1e051aae4d1962b98ffbdfc765cf362787f0ab18c9e602b233567475f21913df11112f511d0c777ad7d85218268b0180d15f516def5a3dc79d6a7d36bed62a2226dc006385ba6b15b23cc3d7dd8b4b34461d1cd93829a7610b60b8216f072b9f7dd39c8af3d65bd1acc3b991d5187f3667beebe0093222a0093bbd071638da7b661e40a88977ea9901dafe3bf32ba90439ebd36718c22a91bcd28704b952437da8461fa2a3117f1d5e5c6cbd784fa1cd1dd662be1c0dc3116fcf9f0bd23fd3847306a310c1530bc64017f84d3b19592ed5f83c13bb30c1d5ff3f3f66f1924a21fd3bfe152084e567ff537e449475abe5fe549f4fc5a17c9eb7bebdbdd5c8dd558e0d51f2eb0c0a009512b01aab87c9a34031c98b8b5eed81d3b4e316f7d19e0ecf5f2dc230f8db5d8f1caa4a9e9df1dccd1f9bb44685e3ee1f273fd0933a052a21aa20edc3e0b55dc3e5547c1d597d3355ed6246b7be89fe6721a73c716dec18a44452b6188800a1c3dfba0f3d57cdd32bd2b00168a726e6b60763c0a6d7d2e9da1be5bb5e79a31966a191f66ff7d7a132297c0e6f78b1181db901a6d98b797b1bea8a7980154ef45d7676525da317c95f25fdc6ce0634a02ad2a3d9f604816d2946b9418e3f6146ba3cb1285707c67288998e04b6e494540648e21d928b668f2f210534a1cb36092237ca661a46f70cd003457548cb9ea384421ce192da4e8e67d8c900893b48075d7ff1f126c74a7dac9b75046f3bee7d639583e72c8a39a4ca327dba3cffcc885463cb6bd6a66b07af472a1e6d98666fc490165cf630e94c52c96a64cdf58ba5a7e98557739aa12302e0395613824ddb81598f200e94214b52819c6b28c8a102225113ab23a9f4a5c9e248804044374f4cca3b23f6f754a3855da68cc6cddc42b9f13af09319c427293f56e35c90905f78ba2045833cf21be0216bddb83149b6e4a6fc7f656cda630bca98593312668c10e6318632c00e5f21a7082760c079108e1d24567f6cb1c4d2a4b8923347789b99a89b7e8d4894b83d1a7e029ce17a8659695c4dfd0f697cb06f3beba25177c71cc5897dc431691c36b78ab65bfd203f8cb0ad7392e367981dfc6134f5dabc8d87364643848eb87db282e323cb5b001b6f89cf1bbc26d8ec304491e3ecb854d929db5054797e3097091014afd66e7fad8ddb1321021c9d7aa32c3ccb5550bbc5d94e989f1830ebf4608121005c287dde0be90a18d55094b9a5b764f200f624494dbb406f0c601d2be25c023fdd53f457aff057008d90ad901a0e25e1989b8a51a3aab89a9d00c7151c79dcafd0267e34a2f0a6f49b3ff7444b369690146604c74dd2f5ec52f3aca132b24e5d174bee1e7263869f11de6b1da933c1621f06c99a15ff3d86973dcbba64c2f9f99076086485850f585603498693331548e9dcbf338ff2b115e3d98b57189deafd000aaa810ce1480ed464e0bfe6a5980c0fb83c0d5546f4a82d608ecaa24a822bac712f74e21dc122ab25f283320ff400801a4efb806c41dfdf83616227e69f5d939cb8f13364fcc319825ac19040f5c207d99225a3dca9c255544389550f10dbfc82e6450c7e0f7a9dd84e0c67e9f5b64f79307aada47de985a33c85ab12be9df433197df22618e6283717164283e8d9623c94c43478326628349a3d0319179e058d8486c646a1eb20ac3c99a85796e9e68e1ea1b8e4d51eb06bf877ba14c64a11d8fd6d69ea7a0de7b0dc5444451f2debd5e5a8b708d4f55e28ff1a6b6fde01fdf9619625b0eb06584b4c7f7596b8de0d0deef73d461c33b7b401f95f835f3cdba4514b27664160f49d874bd7aca20456ada553ce46cd24317fc03eaf4c668db312bad06ae0df229460d27efedc3384cb41fc88e9570d16f8cbafa8e745552888c94e3ce4aea0e8c1a0119310dd11644fa03d337f019640a43ba5e22442617ce4325e2e63834102a65cdb6370e14e3dbdf2ee0130c187f223f41182a71336e4484f6f488729bb63c38bad8bacf8e5da313e46de77e964eab814c29a44a519f9d269bb2b7b1c84a49bd367bddbe614d17d08c855b0ff9194bd6fc6f6cfd57bf00508505b61d7fdd8b05303c04df26f13980a5403031f8b43e128d4ff6c36fb34a5c2ccff8ab583b4a99a9a5589dd36b3a7940702756d493db4552937a1af6da0cc8586eda11843ca2455203c13ade753c21add945741097036629801535007d8e0f921b1648bd43c61378ef07c8030ef7ffe3833c653b23a48a0fc2d5765b7b589c673c080bdf7715db61f5e383482123c726116972653bce560943c1c5e921b0652d958ce22000786810d70951f102d6b397ed25ec7764a640b1ef5c8ad32178ee27c973219fff7f763cde0653894a85850bdd8e6ee1740c66788f63ef3d43b2957aa0a29ae1ed36e380ccdcc0f098b5bf43173611b58500ab7a5d5e4ffdba9a56ce6b6c73bd9114609e3d6f8180ff0379461001f06b918e724d66414fc01a2f0c072b33dab2f4ce669cb5ba786a2160f4f839048dd9f8fb7043fbbd4cbbc4fae30f9596ce18fc8579a6fb34a3ba1466a73f848171eb1e48213da25407a7aa42fb4bd310244d9a8c6769381e825c7399e8d9a8b16b9879db2ed09b03e523359cb5cb21f8f0c97e3e718c2039f8a950ff4f726dd15c8a2c24e0a6a9833bc9e403add9f709f00d3c3d6c7502e9336a358acd57c6967b8e6233f65dcf436357e9f10a604f56e4a813a332b8c5a85893942cbb657db7375117d8a621f75174ac278c38a77c2e72a8f324d53d19ca6f213a8103c5bba6220e38d2362367fee22b0c3be96b3f3bd4c52566d7877e45bb0144b0228b5d6c2a198c0379a1527c553582b31296901d2d85fe4ccec347049c263e276815d305df5ffce69051d4b31f0b2d36b2df68ac4cd841febea129c015d7f963be8cdf226ccfef3b75d29d0e1d7b15c067916032b858862e0db949de242381cf8c1929f79fdbe06231b0a8b02b5414b459ea21b31f831a5f3527d12f3903a84dfa3f79a4c4903ac7426af8f9da13fd9dc338b1f988f39f91d83efd6dfa33c78870e4c4669b4dc96c81a2032ab5e4390f53723d634eb05676729a06a61e0da70168e28eb3a560c11ca7afc383c287ecbcd2492864091e3cacc4558606fec8647099d22ffd26cf5a750f5d4adf7ca717c73e0cb44e8f277fbb50c0dea50960f614c17fb003c305f4bfbe43d1337c7b65ddb003d52309a177f0307ea8cc0163f122892fcc516f9a0426cea1735f49b51ba02539a6276ed27f320fb5821f070ccf78679f2bb05f97efd89b459e50d44f9881a7d2037f9014f8998deb70d9b814fa095e0e821a9cf2762820035169692a9c02ac036ea94ef06c11d555d87ebd9b77218115469ac3dc1b311bb42310110febad50c49493c120aaa1dded3b7dd46d820392b5f70ccc5a6da26e903b406837d9f54bdeafc2df3d2a331ba5571a85165541c37083ff0717a849201944c8b54acc0655fd177e2683ff0fda135d14e3fdb8b86710f7a5522f2bff24856ff3210b1bb76176181887cbc90fe29ef9d127f5865c55cedd49cebe501a3befda9ac6be77a2083cea79ff7b3767ae1911ea1d35428d7fa36902481896e728eab4deb2294a10dba28add573a0842432f2c49f258b67fe52eb666630200721f283fb08f4ca5eaa43e694ffc37be0c3404fcb5ddbb817dfe2c2519d4791c3c1d01e31b7f8c677c1c097f3e902949dcaa2b5f052d691aabdb57ba5fcda9dd27a0ff73ec7916c2a6aee42c55c9653219754ac3749e0d08e3967363e6d25bfa7d2bfb9ddc7316328b54179ec7e2d9c42286f4b6d9533630e75a60f699adacc9c74c321382eff0cbe22fa65b5b3363c9cb55390de574abdf7cc2e8f878268a86818d3c0009374088de2462b3d5a5f27c780dd5e68e78d28f218e93d4d44e860c5d7dc8ff7fa0efbde108395a7dbe8833f75d69e5a15641e5755cbc15c7aa8a856017bd05e79729a891466e2e0d7ba97b530895dc430282396bb3dad8a500c465dda7a3b20009e8ba2a259901cf31c6c58f758fb3807800a33fa2e3d30b88a4acb5793fa423f964252bf9a9b9e2f413bf86a5c3fdc65ea12cb4cb2448afe6d83f3a0fdb73b7caaf7c7b1c3145417391ff898699b25658f0b2c33ea0fd4f650a513087446794049dd2a68d8b8ee8cd5adc6dda0716eaa9f5e4af6a06f3319ce70574a33aefb3d3d0b86b942a9024ede561891e54af8237a93890fa87f920f675c23560b4130d5194be82c8a2710784a39137209a4e1765d7811b223399c07301fa687b16784af5be038bc8af47289925b83cc392796893ca31086c366fb02d624d9d4110a3b6bb608791ee05d31c1cf59e09835e0982bee0e71f5221bc392eb4e93940309637a9f7ca61ebe5edfcfd7409abd7febf4fadeb07b7dc84bf7a138e3118609bfc8f8118126b8687b0e37d2cefe2d6dc67c3b78c98145eafd42d88ad39f6aaa13ddddf9b28c3ec8ff56ac33624481065cf10a2c7964f31c86329e50aa793b59e783bb884e5f611eb1607181c2a6242309cc7db4accdd860ab6416cb83ac0e01cb160b711232ca1bbde897b9db60662e9fc54bd905e4cccf003374b0c15ac7a1f090c9f19f66112a09930596897e0ee6773842938a01cdac0834b5e244a6740ca7bd98bb5d6ff175b2bd8a357f8240a653064599f93655d82c3b99b55121fea523362a43ccc5d92c842419114d63dc31d441e0554c698ba74d475a8243fefa75b6b33fdd638b14a8cb09fafbc6c192d6c5441a4865eaca44127f1fa061ee8ed7a42cac0ce29e4221c5c7f9528f105c1d0b6f58daa11d3d996c7e7784df60642870157d9e3f5dda68157b8a7b7f233dcb1d10958bf49af0fc2f4043ec18e57b3a67cde79f75ee8cadb44230a8d9608edd8763abfcfdb617ca3f6919c4ffa3d65dd10fccdc793f61bd468a1e9d32d36d4ef185886fa16ed9cf27ba8e96d1b3761bff477515d75691c3e7a3f659a225391c6aff71ea93b38978986a4aa8866a4f1d7bc841e5cc3e6b815ff726e44d9316a3821850f31d385b6152306e6b4f631b804c97db65d04f2bca2a268f2b6f30f49ed08151cd59ed28c1e3b5658bc982326d3b58f2f94c1da6d1281a00075214ef824288c97837fc0e543605b1206df29c4eb88dd842504f9cc14acc12bf5c42878ca7df623bcb09dada2eb428d821cb4233bf371b3286c170d42471d465b01e1d38f24fd078356460298ac15a019082febcd9b06f2f9f7fa67526d39e1427d3576fcd7c3a91e3f1e229eefa62f5487edcfdb33f40f7a986bbe047b3155a9ad2fab240ccf32cb47c68161934a28bd2bf5a1ee1f241acb2032116c6f40546458db16937e01aa15e2114dc79f9e86f4fdc33915d13dd57354faeb44d4b5c51a482ab4e9385a174cc7c528a4ee862b77e1f08ca8fe2e71582198506f2206ef9873f4a3efb6c28ad198f4cfdaefbb397e83198ca03acaa418d5ac15b5c62e78d9fff60b2b6ec2fda258e71c1c20a9249a77176250fa6c78ee97a1ce7693ac42bb4b12cd9cea5bdb4e6a2e41b77ffd903a2ad87c52e4eee4f5b232079037b1c8809928ce8d84a4ea58c2b88c0fd8702173241bd9cfedd3f1276fcc67ae8264272ba8cec27b58f549349bbd3b2a3e8ad5dd3adf004dfd6a7b1b4137eaccaf59757f34fcba67dcc8ab68a24f3be135e6c9d0f825c68e219c79d4827f6ce529acddf6234f780d44eb3a4bf702e12c25581767878a58e3855f9975bd890189b03f3241cc010aed0b64411bd25563dbebef3687c092865ff7ce2368e2ec450b26fb341699557487a69e1fe17b29b3b3468fa463286b5c0566e0accf43b065fe86fb3b0ab5042931d2573b864ce5cb35942496380601897a1b37d7a6520cdf51739ba91b2e79240fab3fe8548f15b13708939b82a39ecf412aebcceadc0d90347bfb2758dbd0980e8ca0cfa2d898424f9b827db0abd09af8b2f004e3125d411e5a283454aade5d0ea59a90697140c1e22f82b0cbf2d0bce6eebe515ac967a39a56832806d09aa14101eac20324f79fa784cea82b7c1e08411c8ca469310742b18120ae5cb52882449ce9b7de7cb149f522c8eea1b35577e55744f8e4558de9fb4ec0848d22e5e23ee78dfb141b9a0c1aee6d5f141f8dc1ee38cf0d97da2a51d28fe045cdf7a6cec2530d317a600223c5fae21e4bd0cc89951f25011e3377c4638c5d073a5eb790cf1e1011f86244314064541b6f4cea38c324837b59d5900e32c57ff1af8a9a27edaa22b4c7c60e26ca83f063d4460f9c45e7861efe858aa8cceed35c0b8ba48866dc62ae64fab4c39f8f5e84aa31f9184aafe2a54fb752b9ef8023ef2162ea39993cccd2a06292b7929c97da8291b0bff31598989a8345266348b37c145d1ee2919f767485ab1423ce079d6daa0e536c34bb4d56d1fa002885190fc541f86a2415c4b330f9ead968a5f07ee9bf8c99795a9515a608f5cdb75609118ebac0deb910ab6f994c86c2d03ae271c13efb4deadbce6bc2a00b6af4029c2879201436338d842ffbcae7334a5b06a3d2bb4f2d21b70c3f1d2b0a178a49ff3c3878841a88500f17c5c9bc8e25a0471b2a38514b1f094b994fa096a7ca7c03322992e0d9334af11657baa55a6d68c6c0448015d4ece5707d50fde23105df68f7e285440020c6f3b7f12955b087874545dac456cf2187bc6e68ef9f5cb5e4caac49d379e9576463b4dc2c7c1f5d889dc0d3f70f61151d444986226362622989b3da664a70875cf06484afa6acf383fd38780f1ac3b0d0081f2b84a318cff72d3195448c0cc8cf93fa8444941ef8d7a6823eb8adfdb6e2feffe4ac956e82319704c0dda2347907583208bbe2cac85422a616a4c79a29901d971a7358950b80d8744b7dca42bf655ce4f159e5e9f45cd1af70d2f2c8fe62c071dcedf6a1a1e14a16ae92f7b8a09760aca1554abb6d6e6db5ea24d6d3e2b80baabc09a405fe2d125aefbc47aa92204d528f69cd6d3cf18d9590c21d0230d28e2976785605a4f83fa33682bd19ed4926a498b574b93bbfbeb359e22d451c65aa8aff4945775c1a2d28b4372bc038a827e464906565e02ccfa4e5adb2f578e26869e59137ccbcc6f88bf256e28c954da9b56172ab6154e43ec79b4631cf91911f557e691e28eedeb9bf2d9fd6dfa110dd0f239a6997a0bf9904defb7dbf6c62d518b5b8d6d9a60d73c96a3743e981ca8287d5d32f3f5c96faa476cd1b92bcf38a85f2d6c0084268e8b328d6ed75216d73e4ddd7cef1e4389b845419f11aa1520137978657bd6435e2d5a6f47af4dc874ce648c9d656ea4334b8469a13f9d8076c52e23139c627babfe4f68f7821cf1e4859f240a8de8c2b7e2793cbd45f526dc41c15628db3ee3500e719240f96fdbd69d4c43fdffc7c53709cea9698b8a130c8fd76f89f767c3424f7373d7ade3c2da15efd31780c9944ce0390b033c5a59b12eb43190e548ccc5fc5e18ff45aec5cf77fd3d5503d4d04c451ca82b464e1528eca51758daa79ee749a449b38485a14892e69d44930c6d08008533f5aba29ba15b9822787e15473093ddea58df33ca576047a9ccc201be09e286c251d47c6730482072c483e3f0f9f5671d40275881242082977d6ea32e8d812747c42a0a52bcb5efa236dcfba3c33f01f6f7dbc6d8962712b75ac12f21c6e55aa66d157150df19920d6db52350b049bff4c30d502a7ab3ebd466be3439d40ba64c282147cc56fced1d3cd5c4d66687630270223370f8b24379208a5ea89f7574e239f0243ece8f34c451c59e20e4bf46fde1a28d9bd0e36a9bcb86c4187b5633f5c468aab6cdf76b5f71218a90a80e66083bd5c3df3fc05e8d1324c2cb6b8695af2e531183e6b9058b6d33748c7910906aa54f72108cdc9b8c19dd5d411d42b28c974028be120cc76601bfdf9cef13ce648fdfdce3ee5bcff2634886d68481104d2d645157a98d4db9a067cd2110d04a641b1af5bd3c63c61a89fe71853aaf16c47f7ecee9a4f7a3bfcae974c73a0d00931c02533ec8aae8a8bd0553375a1aa747bdc9054238259df4ab86eee91c4dd89af28b184acdfec52d6dfe07fafffcbfcb700d8cfb31d983097c0f9441938d169ed9bc3f14622bb84dec143aac0bfa085526988eb961d53d1d54efd414fb71cd316334f518e8d08c94fe39b88f4cc26bc88a4b844579eae8b3e89efa58b5e06de47078265f49eaa3a5bbee28a889865d46c053470fdb0786d258270fbcb13edea2685080ad61c789663954581486270152c1a6776cc4157ad12d8584c4fe7268ef133fd994d900409be37118bd40ad46777f972f49ac4389aff5c13145cc251e5793b416e4e3edc0f8dff0af919a9cecda15a54626d301faa0ecd49d1d6494c311819ad535bea3c086fbacef24e976bb7631c2115b9bcc5ed8cb798e1aee24b1f47369cad9763ec5ba14192b6faa9be782a1bb8b1169325adba47d081de48ac40e8bf92888cfbbdccad3da9cc284434def24ac318c629f070cb7fb9e3d529981b9916f1067f527add497e76f978e773734b64c6249b6969a1a48ca3aa6d54c79864d5aaab05a1c61be466cc0a1063af4db274b6810a56e69a19c6d61aea9e37a9634dc4d3d1951d719d6df6a5e253323f13bd5edd7d267d22ba563c2ecfc0d72f50f359f951ef9018eea573a91492f59425d6934ce899bf10be318c39fe3bb7bd2a95b1a828b5f81e0fcab72c3be60acf7b23e81c1ddf436950b445e591bd0b8151c7c65ed59593eb38d499c007250fe89043154b9ecd2d006e6f71b46644e61c479a87d196dc3ab3dcadeecd4b3521f827e40e2a12d5d2bc2c7de02d155023b451eea9ba7bb0632486b59408f24c3a509c071b753b6ea9e177f260ddf0824dec6a2b0d79c396eff603e0ad6b6d30d023cda254434b7784b74d89584cb78985bab8fd5d1389e31c046e7d214bbb06cc79c439772c5a21aaada9a3fa621857260fa201220dd63ffa4c9e1693c534e16b869ac9b17a749735ec74a5f4e956f6d1875f86cf74d6c8d90748ae6fa87ebb724e5685e3c937b37e1f11d920faed22876ccbe050afbd64a5afb6fc0ed26b9cecd78d7ee36cbf40f410e7fb65a3cfa64fbdd2cd4bbc55afe07b70425aff1ecd5b8f1fb3329fbe57bec7a26386c622f4830ac747f9d3f922e57e67cdc0ce2fc905a60f35e6cbbfc5d542bf26bd8c5aaccf2004c47ae9a5b10e1f01e75b7648fee500682abfbcf6aa60d1f81743dbce42b2de0035dd50bdd5f79e5e8d6559b504e2e3f0514d3c5af255a9e9759c3a78fcaa648259f0d93a7374294bbddbf4f972fd5edcddf0a0e97d9d260835ac5406d7c48d0564164c165586e6234c3315476e45f27f8af3c7865cff7e4bda05276fa3524ae7cf8624093629eca8979d5f22485cb12216ea7528bd6953549c70659ad721d6a7ab8e6bfba8662d4b9340c8cbc753f19feb05acc50c4f0c8d641f4aa767724f1dbe188d5ddb04665d8e24b69a8ccba927c5354f377fc3cac94c28a19b383aa354f68d1033cbb292e08a17c97f4d781a3b84001a9e5c912028506dc7ab12dcbf1969672ff666e7545d94c982c5ca495cb816d4971dff6cd4091fe30fa31fcff367549d517ae31a3f8888836dfed5b493c87879a1d4f3fa765567451bc87fb7925de607a8462c3935dd17812ac4e9639e6bec4919f3e60f17a246dea1d8e72d2c7c4a3039fd0343cdcb77d8efa9744455411e8e35e1aca7adf9eb280f370d82db602fa5b2c24d7d3ffe1cdf17125adb8b6b3d2e4cadbc37c2bae0716ed1574b680b07c5927794e48f9945682a11876a504c10941e5144e5525d89868c65cc3a0b16350e4148337b63da12b1a2508e6128d6368c08b4f4923cc0799db0a5032b1aa7d28e34da0ff1ed6d4ed785a2abe6f7b3bacc86577bde57bd5a5d86b77488a0ff3b7ff1543f8cab1b40971df651dfcca50c354370d358f11da1b9573478902c072f596c373e0d66e10cd9178a1d3926bad22a77e16d2c034f83b330fa2b05469ed0ac8bafa6b9a8e6e4a10a7f7ea7a409ebd9f772a615475347f27a4a9f8f0d37ffd23e734a38684ad2ac353fcf7956b0d8d0f86ce1866320eec8bc6b0b7a52cefab7f3eb136ef723b48d320d6b159dd9d8bdb25a20b46c9da5368d5d0786212de1e9d50b9be0c41bf86518300474aa657c8cc45a9e66c7eb47f6acb28d967fec5fad0f190fbae7a46a124028ec49f3abc6a6733127661f1b73da5bfd74fe1161baf0cfff7b4a5092e963a3036d24499de29d5e7d862c1a9552bfdc8523bc0a3c7278d8a1397fbdb272f318659e1316e9f14dbd28fdc9f21a848985408c7e21195ebca01d9a93593eaa837054f45820d1683e8a82239f4aded32f27d08e67a8f318a00f8168a68f9d259affa9d9d043428174975b85934ab73a1062d27e94cbf414d32849ce775d9faa4a9ee4f18ce83830411dc28a89dff94079cd631fc265ad7db8fc8a21d39676b85fbb9ebf68c7ac0aef50afcc9c27628641f9c9cac710c2cae4cf09be2f69b1c336744d81f321f38c2e8f2294087b294877e0f74b88accd59e8fee5cae6fa85ab27d31824cbc83e4f7f2b0c35bcde5a85c14a7e578e1450ffbc4ed45f95cb4577fc3619339d29ed893d5519a87470d490242530d27112db17add0b511a6500a199c336ffacc67a64226844169946c0fffdeaad7d65e8b0cdd5baba0b5ba8ea8bb40b7f1a79575b5968d60d96c2daee2af6749513df9338e641b3a5c5150a1f10d7281742d8ba0894726daf355619bfb06eb1654ab8e9da9fba534b9c8d25218bc8021d18bb60c9761e0037b7cfd57f5cb2cf09489c1142c7315d63b961936ddc7a886743363c2e3ce14d83de2ea66d487983e1c760956153664efc66044d16e1478bb00fab4df9a3595ae76de5a08235a39dced20cad43256adddfab97ad7ab91bb0d0e3a4f4cb60667bee643e8616cd08047e929c085f69e66bcf6b00576d8caf942a919c3441c6318cb05c36e6cecf52bec474f04690eed5ce486463d8a12101ba2ed604df67d3dac48b94e3da759038fe09d4b2b5a82a5f28d8ecc09e82ba47c0e9b8bf21f7d77b4c2a495ae26929d836a34bcde31669dc10d4c7467f6db6dc2a837fbf982104fdd6226dee6c2db56dc0e5099a49135add5a6643a075d573f2ee155f238f5b2ec9041ecde098d1f2af148ffd8e2fdb5cfc22db34b823f172418082f6fbeb2b783512121a3747c10c2fc8236d5696de903632cfca4a0801a0b130d959185f4402e749c9dd74123c46790c86e3424f6b38d5635ffaf0cbfbcbf15219a71a600543329b9d993cb533347862ed13ebf73cbc3a2db9df604173c850168bda7c20fcc4a683ca7d1a4ab00d3e797d10e0785a206a1bd151fb68b76cc94753dd630ea9584a630a7908a04eb3a3602f4e3b78e1a75e5f99c233dfa6086d89636f8bd213031c0c02cf0074ec1ac5b984da85fd97aca5a6241066d299b9aaa77f7bf58248007ac0d095cf21ececea89f8c590c3d2b6774798e59f5f9a28665b9ba18628745b45179a0798a174303667169e8e24922d8a45ade8a71320a434620b72d5bc9dae2e70a692e4ea0cf7469dc680077395f608e2f12323eda107a427e303baea6c80c895ea436c1622eb4636e310ade5d2b123a8fd58e43fb2841b591049cc44743f1390eb148ac983830453952f67d9bdbda95bbdb8f48b58195552bd018acb3ae71514bfd5daa56848e6d9e4c68ecf6dac6e6a18a871403c08442fb788b22c2189771e5683aeeb325163ae11351112e27b4787be6b2674e347d9aaa70afe4f742df4491f2f9bd7c4c98d86338ec4da7e079c1e01b7bcb70f89f9aba08bcad03b16d92f474bc1b2361a8552aa671d0e14b62d9b35c6618c8c0e8b6900b9700be980094f18c9e53fbd5a99a4c534f692e665faebb05024edef1cd1413263715143b2a21d4e12b592530bd31ebf460a41262c113b4cd90999e290f355b412550aea887f18c109e53798b5778f26e3b88f8a3de89b4c628e2ecdd0f4f485af3a8c84c02a9370a4c92412855ab3e9753914bc3a459d1a5def39a941c1008fd4418d6eb396c17b6e268dda9cd6a3c52b51f2eb5f612269076c6b10062b227599b7419ca9a04fc4724e47424f70a00942fce4675881c18ab5a91333e498cc691780292e5686115694f72779019d74b0de2351ac90e75c97f5d9533dc8ec89411582d24c1b60804860b6eab643fb216f82bb9eb799f1b57d241e8f1b51e1d81b5c5d02660d19469c0a6a373f80e28880dddf07ef043cc5bec0602546c3ff2b153c58e038e265ba0a57a93cdab83e29ad7e733dcb4eca548788123d25d64cfd5a9ad9760cb1156da08a7377266ecb667fb05a782ac3163b154419d0bdb6dd12add44a20d2e19fd842b00650cf0c361063f72e113757097722eedb6926fca9983dbf882634635b76d8541520e5c38b25f7b61abe573f429ca164d82b00daacb4500d1849a4f696bead7f2c017685d75b3f0f5dbba4d7480d57ce09cbfa9f60acbe1ef3462e2cac905f06553b959bfd01d82e0aed05163932d3a27f73d2d68cab73f83b09a16b4ca2fe0ef462db4328b2d009004103de589b30731a8579106359231f670fdbe06d9c487a3813d2f33f6022a747ae9c25ae8c3295dc43a13c43637c4261ee8499071ac91818387acc5a624d98b8e5af5f7da00812371b553b5643bf340672b0006ef78a190557dd7316ad1c6354774883bc815c87915484071a6f2e474dedcb1cd680030d9809ddd0c58a96bd08dd80ef472c80b38f68885e856071940ddbee19a934c439a384b74838b70e6a1e9d672463ca9648aa9a8169f21337ce4e455fa0b550d6e57cca734619c1d73d0e92fff2e60b05b073d2860ae7f92c17b529a136fc6b31875554c02baa5c0a06eb28b7491ffd5c324c780ec3a93b407c27172ff40b365844e5a0ac5b9e48c139f72f8e0d2bad067453ae14174b3cc303c52dfe16573a8eff4e055073941ba863046767f27024cb2c2db0c3506d824f86d3cb0fbe1dfc94ac302093b5c201250f33d97233867c086be8a42a1476be19a1ca9c36ab9b2d05a5eeb1b6f26a04c62a5299730167f5d1f2246474125442b9777c8420934a8441e68aac1d167b0d2cedc46af49eee5e5a7deb8b95f8abd13879ba647c65d0e70428fb25388995ccfe497c3c18473164dbc3a64f35ff1f7a958c06eca3b4b71aa8c7b13c3d5ab21d12f47e554a3a2a8c5a39aee1f745a73ea18a452699bb09b5957352dd11a461947e39c1fef3ecdb1f555ca8f770e3b07639b7b49594ac16e59cd8f51963aa19fee57af39e2ef69791757ebe0dfc98fadd7f24e06abfae6c6ba745c9bdf5a0fa16d8566ac0b04502b3e60d83a01de5c8d5545a8c1fccacbf54c3cf449ce1a965687e09b8b6eca09ead113687b27894c9d845450e8c2d94998d9ee9b4e8cfbee3d5640eff915dcb1a951b3a19a9d209a2df5f86a069a9927f072cdad707443fb111bc6c84b848d85159d135d2708ebe9675012b79eb0ecce1f33be2f9016d3a1908f828939c365c6b3de39d1f4f2a9d9fc13dec475471067a4ddc57b4b8290a74ab4dcb7f911b1087c67274928e7ac4fb70925159da048208021426add74f3e3ee236af5be62a95d9cae2b8e618d4864ca7c8871086bc78464d5fa18e561fe4db8e8e4954b4949af877ff9ca62a4b44740179d7424ad674f89efbf2b843a25e36a691c76c82b1f64a717cda6bfe3c795cc2a3ae968a5343e901910e2d4275a748274ee876aee7bb00a585ac20371006da720474a34b90e080f0253c8dd40e0531455922c2bd509534ed870c31262ed07e0027b225091b2d01dfdfd5ebb8e33c7eb68adb783114250a26e0f7a47358503f06d3ac9c54d82a328195e038024f4e9f96ee4d86fbd497ea9fe175f9fc804cf02eb2b674f692daad64f8717a70c750b83bce77949893fa70bdf9688055ff558b2feb12e4c83cdc3199e3bcd4aca219ab509b14ebd5ebaa9c9c1f3fadc67f949619217e795b14b7e238aa17da3c026d511c7aa013c07b50ca9570cafafc8ddaa1c0950f428dfbf4e6b3fbb6c72cd3c4f97c9e0a315bbea275c2e426ba04aee08351ba8ce9843599039c665c686367670daebe6672351bb5fa609e940a2733cb745621643558c47a01dfb2fbca5c1d16836c0a1c0433fe978ba2488edb18ece5fabbfb808df610868cca18d73a94a524ea7d9fa2cbf0f949b72aa2c5b3f214134faed526249fb9e8ecca9a9d33056d368fb1d549dce0a3bc596094a66eb3a92d3d4bec1113e08be8c0ea30312a8b817d0d5727e3fb9e0a9146975ddb0d4f1602e2aa5393351a73d312714ec386b8a4d6af69fa35e2f7e451abfcbf63927f36e0ea18cf65f5d2f56f5ca637e3892882a3da11e8cc4ce867b9aaa6571de806038245a13981fa759b4a6d0b51481fca45eff2674983eb4b96c5d476e02fcce12cb57a221317048a651628c0f2c260b22706dc7cca6bc6b83d4996eb2505ec7142ecf2cf185594c636c15a8491a5bbe7d19b09b516831150198eaad5a83ee257756409d331fa8000b091da8dc4b11e0741c4cb8becf4e115dae06378413c2d7569b4a2b2bd14f47f5e2f829f1549b1343dcb79c22535d7aa7406b9bd5584b1fd8d8ef0c98bb31690b35639b1352691c8c941932cc797e36793367c34095c6d1b6c03e8ba0b589058a85ea55290a8c96ff31c3ca8f7c55c5222ed1081efb4477b4dae99c188af7752d982d758ef8baa0b9823239dccd86736e306aaa659984fa97d6ce045004d4622fa52b5448f19776fd3a1e292a7ef620c4a186b650252cd4c80719d08486bd1c50b06cb46fdcf9790599eb6014504c4dfea7f8d6b445bb3e0a633a45682e29aac6ecf2ed2d169ce3a1931fa77bfda7346df8e14b07a0847e701a4b37928b2d09a07f608dc24dc225a59e94d0f47ba3cbe4a407a03b90712906525b375b9f5b6a112b33d015a2985c63ea80ea07fc0687ca6307faef69da2e2e669cf9b0860552f2e678a2d89909d85178ffe78e82bd95db64dc19437d18dce5262227547d2700d1cdcb89967a0deb43f8619b7b5db9518c80716ea533c080e067ab512540464d67db2246752f8b5ec0469144baab9795d19d9f11922555d59fe595b68cfc188eef632bc4aa135b043083248c12aee51f776bf504481a817d80d36ffe6d9a25039071260e6666beb93d93ccb783ddfedfe58e2e3a7a8d68bd3dcd5ad329fd73ea94f7d27838f149d882b7a4e8cc41f54e89925737305372c483b42b10b604f4411cb5b318801e4bf72ae4e0bd3560b4b207ef1089d02d3ddf9f4a73b1e2443e5cc2d96ae33b7b18e182fa325916ddafd231242b7c3eceb311fc59000f01e5b63d92ed2024a4831e9f63e599ab5b9321a4a38ad650be39f4c804ff2abe90e123a68d6409c8b4bc082b7573f0efd4414925b6b4fea116cb0a2470ab0b023a07050eacaa643b2b55ccc954095555cce7086807f26a45379692936abe7b735ff12f0c5c805dcb05e849672a027b4eeffe5170abd1577be274567d152bdaa808f6d899697e63cc3f3892d0f23e5cb8c82277679f270abed587541a04811ffe8321c8688f2f46fcc2e02f463d31e00f43bf18e88d815f187cc5403f067c61e42b06bd31f209039f18e8c5885f187c7c84cede2874cfe48ce4a41c56321e4ae6602fe895cf6d4dce372313ac334eb524bd5c0e577d5fdb2659a7b468e82b769dde9fdfddf49cd42c7999f17f333a3c6041a499e77c0bc2421a42e2cd67ebd60e07774fb780477f9735100e8f9b0356dc8af756363759ded51c89d1f710719ac57cd40f94d27e1edddef41752cf55616b2d381dcca0d88d92f92c2bd9e1d56c9fc646cb10864b9c98393a0dc395155cdfbca3cfec44d7b66443b9facb35be8ff1336ffff35d30d097c4f04229ced104229f115f75c68ddfcc036a5589430c3e41f7dbff47df70f7b4356882f4dd776c706d7dd5ee2995848ef5a41c806fc08fbc9813385d8f7987888400591fc9bc9650d5479dd1fed10e613f5f6f876fff759f69c2e1159f8924050b40c6f224d951f421065871b9b117382916fda600195f607295bb36277d118670848827877f563bf2fe9fc2cc8680aad045ca40a8c8fc587a4746110d18136e7cb5541044302a0e299a43fe22b76c9288f8774f077bd9d56dd42a8af85ca731b3c1ed678741faa22002605f009bb417bb6aa1217ac604220df4652c438f6ba7895fd4196f0106e373e13383d5f8a84be589adf4d22b7a37bdf791ad046ab63cdacd664214b35c27daef2b9a985aa9cf41a23ec1bea61cff264de2792a6e4aed3ddd824433a0d009ac53725934dfd210b724a2220aa7c9707dd6ce35dcfc6cf198c2f2db2a4d426e8d87ea99e40145751f73cf86525b330f8c8db803499bcbd3c2f67fe21038ce970ad3a78982928813f7c48745e863a35cbc49dc189958989f484f6070156462f1accb3d85709a7b62b23d54ce01b7381f48236b0813cdcd7f66da5f28da8fa32120d0ded830f8b5db23948415c2edb40b8d401e1207b6cdb360b9004434b8d80b553bec0b58e2632261781601545d48688cc1b430d27a99e955180c289517fa2bc961640081f3a22eb85cde4adc8dc5af55da6e457eef5245426d8a73073e1a740cc00981c717cd085ce5a72398f25eb2c5cdc2376d1bf428ed2523a2e5f83320a35b48627d7d98fbaa618d3793b98cfb0b75a883ad5a8d37d766e5e9aaa13c5c444075b4b1fbe02eaa7349f7add57e9a0ba8569416f06801d8b45dae29867a2ef2a626365bf70502931b41b9b46b04de5b9cf3c50c22af971cc196799b6d0158a7a8e90954c7e1e0a861adea3a288239edcbbf081e55ba8b6838bf19c989cebf9624aa0a08146d699d6b5ec43737229e0d97836b37561d14766b33f55f65c4007997a9b427eac8da8600cba2282ffbbf6d998123923732449e398494aafcdb2d39507eff9323a4ec6492568a8ad15da68fc51352eacdbf23286b27a20f6c490c4c0a69f4103f953af7f080db1fa43004d31362cb751c5ea1d132fc97735eebfb17c29826cf0132ddc200fe7039489774f53bbc829ab88cd460bbc2f080586530921b6fee46b2ecf409be32d7ecf71e83e261d48540c33369f8144048e23a7c3a840931b15f5d4c6a7c81b5ee21a4299d1a67872ba8c683573ce8eef53199245eedd5dfffac6db0aa3e33044e77d235bea52329a429381c56d8d19db41948ce80e330c14fc43286a4ca041c5b501aa6e4a9e8c5546352baa5ba7d5110576e628cd119a82a37a720550ad1b4615713264470c4a18f2e83e51a4e32aad3f65584d9e584188cbd29b751514eb53a95e9ceeb312cff12a7419fe3d54799905c690037d2cb6b6f300ef0f8935ddc9c574ec46247cabda17582b9b750e92ff084da56a001b05b085b878da0ae3c0d0a6161077c73936bff7e5f36f829026a210aa771678713d8f3d679e5353b48d34b4962fd1c05721ba3f2302b752f3af24d63fc3b91803c5ccc67d6fd16372627ceb52ecbd52deae5cf0b9506b9fca4c3cca2a5f3ee8e1fc67e5f537d8835b517e6b78c1c272c2c40a6eb12870960b2e1a44e618142617ce9b338d9d3539b53aa48e517c2641997497d44b5b46e8ea4c116e023a923c5c6d274eb5d6201e90a5c00f96321e0a4a076edc88dde9de193c50de00dbd0e15a4b6e23e9a7f70312e75a744cec7e17ee414f0b52c37c5af1333e4a1858d3d9b99f9b440a3b5ed7f39424a8ee940fb320dd97accbed5ea28f997f5addcfc81cee1d1a45256df9ce0729d1239925f3c9e1e37a9651203457b76c2dcfd0db3de19d43f422a1cc6fa4ac64d9ca6665c4d41b3252b04f40771345fc5aaae65871b66b04cd7e3888e47aa261511b406b1d61afa5abb446802d45421538654cbbad77792436ef972b324dfc31c184c4093dafaaffbf00db71e5e39735e37452571c6a682f939af10272349abe6bac14e37509a1c18222ad78702161534753b292a7ab947c817ea8e668a960fbb484d64b0110f4817f6385a58a5ae29d3489a982c4c556d34629879268e85bbd64a9535feaa4dfee7a6401d7bfb82d1b6154a25194af8e1a010b0435bf322a515a68cf75a7cbb02f5d3264b47bf05118469ddb540a7c2c754e067ec410c01634ab02eb30634860a6fda269488f0d826d49d74da29c95b34c23eba455e27046546228af960bf1fb275865f9ff5661911f1592d8676f83d129f4ad8574efff5cf40e08274cc14afaf6ae8991e026960b942db0177804a9250f010d912db1aac8dde61b3c3191c07a4557fdc4e42be5ebb9127f1de733fc8c8aa27bfe0754dffac6bc4029d5c3c9bac743220b192dd338493528439843361ad91f355e54a5e7a0fd9f06759d88fd955b9aaa6647f408ea67e930a6bed848092c2b896c24bb5171fd8c80aeb340377a132df212b43f1b93dbb6f3e1404aee3581c6fde992806abf441ee5d6f43c32d000a20c1fd384f4f7dbc4bb49ce205e97588075fa0a35dc055b650d09f24e52bd74b5c439f23baeb01241070c58f5ca295d34653b79ec871145f8ca6981ad0f1c81440b80f62ed8c010eb7f1a77c5244809db8e47ab8090c50cdc1e7101e33dd937a253d269ce9d60cc9ca1fca6ce221d4d3d57f0f8f70cc453c7bcdf407f57d877e9d67be21847504b0a2e36d8cfc4e01d842df1c96815211b71ed102a2660110f1a14fe61820b1b6bd6975c7663ecd0e54f2bc69c830ff4a938ce89090ed987ae5d1157170cc074f8fbd5605f8775c4242adfb57a197ab637a427a0f3d8a6df7e0fb5f0e67df18643832a13cf197a6f587b8324b9855a424ca4e2db5d16e6e61aeae9e19d38500403b9e36690df0a9a59e33a4850c7ec5cc9f0143dcb945fd637518076b586cbc5dabc53aaa4ae147c731cf45411ef9bab8d825a6b9e632ab65f999199bb4ca49154ceab73a6761c6718fd89f2e7a1a8ae1211d7bc3ede6957d385934a7192968c44b3066c48cc7a1a357c6213aa064c6f02b90155b711e477736208886c9ecb4e8b0ef5abe21c98471b2058f256f0a3521bd31c5426959922ea5e2380a71ccfa54d2ed5f2111f0fe4f30dd4c582a5242e2309d6a3a9cdad816366dccab7a4379053e5fc1395892657a29478b2d501dc2961108f9dbba494d48bce0df7f14e0e9ff3036c5e31901b53dff87212a0187e43568d7fae7577c963050703628e33b2ab58378731d15e92f48f2e24440fbe22b518bb5f59ca743a0c8f856247c803e199eb1f184881aadc985afd8449f8431fbefd92b979b82a686c963becd15f6f6c1f07435d5ab60f5c3f195af6eb3e90dacf9fd791577a7faa9c753530e2f7bbdfcf0239a3f62dd4f91cd5377befe6cf949f56b9560b79005af45fd4ba2ad4cdac86370801d99b120d4e932d37d185bf31127255f3a8db31c4589e763c4093cdc6a1abb11690e52fc8f4715df831660f5f7a1cf21a4022881d7cd8fd8a93fcb61f483f9279a00b71ac0a3143dbbfd111afc1f967ea6b2227cd625121b03566bd90f0738909e9af5c1a3453c72101d38ad51198bf3381a5506263b89e9268ae8e1cd54f01acda2c2ae0e8a31055cadf3e41a8ee42012d08618ce2ebe329976f7170ac118ae1dae29d4c6a2ece6c99793b2ecc11c6322190fd220090c7771784e43a1e5c59e5199a8b3d2aa7e15937279cb5d931061c986f1cf43181b7bfb599c956afb7139a39745af32174a13b1f3621405042b9f8c764699b6833f8016a886141a136bdbdae32427df52d4acc8cd14d068c0dc11195581b06f9f2b0bd167e5d42df622045b8656971fc12402655c7faced0d9ac8d55f25e6cfbb8d9c91b13a83e91fe3ea06b9ef6111b5148797ddc41015158373a6325bf6fca08f39637c61fa5e092f4625d40a257ce6eb11c05f3dbdd15ddda1806e0a5ed2869e0105f4597b86eff75fa4db07ca60e1f63894cdb2816089223884af53b4337f60f9f5ba544674b8b9037acad6847d5b8c7214b0dcc1979b5d042c90d915dbee0cc9a0b0fc39aa6a9934a27990599a697dfe456d0d95797c8d22fa57d1783ca6cc2990b11d082bd564b8b09ce54024687569c2ae12711b2dfbe0c9aed8a0ae4870b02421db8a3a1eda489e34cfb9b07ed117860e52429bbc0eb0ad088dd9d39314a003c7fa02fef521db6eb1970d18b8d465e8cc4fde7a23db9a8a5d515b5ef922f9b9b01d540636645a7e35cc3402db6d7dd44d54b6212bdd96458585aa8eb468508871c272960391602dd2e4588531ece35cc56dfa4bd207db5664d06e65390824480ec56c18ab5e9a3c6d0c5dd37f605f1a2e915bf6766777f3fe17a8d2889ce0880c3afaab9a281543091fa338c366de34c51bdb9657ec1a9ae341ad83b316fabf427edbd316c7dc6085663c87a101976a37e718094087a6d8aaf3c1613b4c338a821c8427ba82f28a9668f8588cca463d56ced75649477e100ec5005149dcb7e4d5c9b805f0771d985274b7411fb1954b596321c4eee682b92863704af48b1acdba0591994c3198437127c05044290d2f4f3ffbaef0d0fb8692773584e1f1b59553e4270af83b0169a8d26e684033aaa832284785b54b744458e5a496c63bda1a5e986478a803c846122a629dd86ca5390cb37c58310a0410a611998c8df877fca1b5ee9d9630331928fba5071479852ba094e82c1b5cd756688463094a90ea685169c6a606d8530be195d01298375fcbf3ffd35f42fcfa96cd80fc894d59a815490039fbbc882d37336864c7ab2a658029f1a3821fc890d2d90ae8672cd118d67cd269ef20e5e4511b160e554dcf61b1b0fec58b0d08739eaf5cf9e46f0404db0373d0c2467835a12bc42691d69b9e63a708ddde6c45db9387d3cd472550a1a8685b699f1fca7037f57419b16aa6f5f1911da3e880d51026be9a0c4ae2c91f4846697a1e630b64c9f923a6f893f6b8d2d5814409032f9fc3f9cd2edf02ce6731fef91f1f9d1c74af0481e45327918f5126025f38a88abd316993bd16111c02576ca976f4ed0e9eaacc35ad338f9497910812e9c56054ed5f7523e059294d16174f919741a632a089359e7fb1fb6a4f545c3ac5e4d345a44579899f88d91a64344a2df8cdd9750d7940c4a9c6289510160a597a37304e4ae264e7c42280ae3c434439a593badb31c04c6164889e7e69e89bd301ef39919c8a48a49a7c2efb10b7041c4a8099ec915aaee5c3bad2f54bea98cc31b3e079663c11a016ce6629f1cb47a9f90f33da5b291891acb7876109bd95c970fcd850c8487cafe4197978a2fdd5d8070b22b190586c42c1ed4a6b205dc97b6d40fc1a1e3501e5b07a5ab45c4a907d74bb8a8ed415d3f32205ae5c90db1b2f8e8b924e940797fab1560ac7f4a1341565a6657d4976902abdff1f48cfe4cb3382f2d4733a1fb33f4b54c255488b5085eb1e101bc699ea18944e50f9ceb2830d0ec7c20f3629776213a7cbe76fe49c772f42f0442788e4c55efe2098ece66c10da7d69b999cf33c4fb6a9b001da108e1359052ff227b85236708ed4b2d71d48cc4a28161158cc8bcb8e3131b30b87f2fe360e4053a804b3982ce2034352d2902fd41811cf32578003b6121b327d0e491a5c851a59353e65a5a3d357b8e13c0228bfc669566cbe68860b915f27fde7dad6f73ac39f17ad0ceb0acf109a008526561fe4a9e3d3d84d98be8bf2c08ac670d8b9b7011f06bf5aecd6a5ca0fa7b342d9aca18982878b45f67b851b937125f1403a50b41956ed3e411b9e384a283508a0017b06ba933ad39b3786764bc6cd37e5ed088ce9b7fe1e57fbe1669675fead7fba5e6c94b75f485d3374f68a6632a1e1e3d034c6309b69294c063e7bc531b55532c0ae0ff6d0c12fda5071ca06559e0e1ea1fb1a3722c5e264447e0db418816582a720acc93ce8c3e70c9f4d911e46b9dc9054fa0548689f74d866ee4103a2754764ccc1695aece592f47a80c0b4dcae5c284197fdbb63716424f729a13169fe272c1ec70c3eeb5ec554d0d34c897c4fc501792282280d2edd9460363410e74716ad2991d6664e5c497eec7f3067e83e30f0fd3e9eef1546e521247fa0d23490021d06dcbcde5e0e6c6edc868eeaf5632a327717f643a1a534506b3948698a79ac0ad6fb5359031c3f42284ad106a01970730e0efed716296af748da3a0d50dde46831fef496af2f942598daecc14b8b905a37ac183ace0c5ae1085aceea4bb119042ce8a5e46bb996476b8ea7629e1ce07dbcc31f330bf669a95599bfb4fa9f357b93f01fe017e394f50cd7059d9745e9fca8fc35bde26948788baa2f18e1289ff1e12e27e37781ef4ec503d2c6c910ac514d83ec860c403eba82e8e6a8bb0e43f23d77e6fc1815c41b6b3c4e8b2427ebe678fe2b4243b1ea2fcbdf8904c7c72a5cde9802e1c927db06681dcd1ba8173d172963581fb78ba4c69cc9589110aa80eedd6ecf7e2baac1eb8277038963759042fc7cc64bde6967ff1143263c926660dd41568f7c805f993bf16b0c4332141c9d12db6af88a118e447e3b860f7420af1a5d10ab008b862b878f9b5adb5d9757e4accc09c384a860d52e4a431603bdc76e259f22a01b417ba5ffc126c544dbf89a3e56fdcc8e85f56d82cd162b7e761c08133f3094c8cbeb4fbb0014a24cb444f29360f78972a8c95cebe9ea1b2b4a2b15a4824c1f3aaf28d27922a3966d89ed1ddcb74235185d14b5e6c9749bcba747f329bf26fd6d8c0bde1b7148a8d83a821072eab17b9650dbc3a65fc3c8b96ffd278eab6c0428cc738193272fc00145b4eaface5922abcc326d71629a056913df85b454f2613332af046c68d6cb297e521c310c74719e1534b989accf3714a6815c1de53a61097f2166ef43da424844d9600d992cee97f1ecd48874c29bc7fee64d0c30b9c4138b5c8f40fb3fd0ad94ce20240a715124f744b3a915c64136ccf1c613ee53b842e8f2527f8b60d0941cc08deceff1ba411829fb20400e14f740f11765f0343d3c904980da5a2e935d48493c189f0c16f09d54f31789733e169746e3705d130fa7891a4730779e132539d57e151a6a678b47d49549ad6c6e5a0b1c3076b3355e3faf906cb4711c9dc052c62bb62f557ddbdc527b87819f5e0f7c7a34c5307cf9fa766e6b71280f0ce9f14a3197d66349812deaeaae8d7c55c3263fee22cf8bf0dc44837e69c33e4ee67f2c62e5199b1f5d1b291e2319a154619201683c0dce007b3366574ed3074b82a4c967a214c7873076167293b0be438635aa08c4e28a2cdfd6724a15b6e3158afbfdb7110b9542d1490229f39dbd70de0cc7115c0578d54fc28898d388828ed264234be07001aabfdd49b1109efcf6d145af1f13fb0c06d170842ceac02cfa58f874a289ab3a34616175f3997d1984e1de7a0dddd0cfa91951269cadd1e0fa1ec10aaf54bce51cba3cda5c495138c98337236433936e535f8015c9ebad54929dafc918843d811690d0353159ac37a9be7f6351af277e242a24bd7f364c25866e91541a2a6ec81f58550399d4848857914e7b16d35604461fd938bab0d6d5d58ca37f9df3cf85bafa0372e272afeda182d1edb546ebfdf074ee3fce1ee0c7d7f19158f025b5b0accdf9ec5f135561b5abcba40d6c264f852a9774084db29967e3ad0be81d9997fbeab384393f4a6ccf392052482f9b2eb02e5ff1dac09fa46c6d7304cd9cdba7dd237c8975d2bc678c35408353ba04dd73f229ee41afbbbc569a7283d0c46f2861177fe54a80fc47da0b5a5d522ed852c638eaa4f5b13fdb1141a16aa1370a1e81b3208ddc45b6d4114aaa8640f5d38cbc46c5c0e0843cca32739dcc36dde7f1f10d73f175b1207df9eb8b901c15a4ae5f67a41412200efae7039d74e1c6823a4076de35375e68eac81377309f9c72b32d5c2f8bdcb38115b187e605aca98c7059d2032bd3a2d7575177b9b7922894b50851988f78cd853384143e95dbdd2de15c6f8ef251c3485162ce8a38be706abab55d799b2ad7e41a139326fca26fdb7fcdd15bbbe26d71f912378ccd4706135d5f188411a9b29fda558a493f6fd0b12d54496f34280a9cfdaff7924d743af6a4199749b9cdc7114c532881e82db40031fb8d2e58ec1f2b38e05af7d81f0b4bc150024513eb74373f3f3d8c8412e7267b1921dd0aef55e2def1717336d360091864138a3264d2e23d9e3e755fc140e03316093c82590a6f5bb891985e50fd51f7082cc217760349650e87a2a7ba352fb0d808c0d469970b92b496a3d22ab7476c6c71498be97a21eff5c491625377b0798beaac618aa597344f298f177a5b1a60a4d958cc46b2587a8b0389f79f789746d53b6701aa087911beab2ce9751e17a8d67c02032434722f58346c6456d7226c0c7f59cf31d1c15cfd27cda0e2214b24cca28cfc68ab0cdf3fd2025fec065070c41b81382190a1c3e4a33f2c530e39e9fe550ce9c98301d613200f5d1a94563b2426f09092adfdc717d4169c92e9dd01f10ff42bde0cbf8ba9133711bec28ca869e4a623a7dcaa7f300329bb38a8658185c168567c0222001ca053881d640c2f40745b929163858ec03106243ca041ef1b6c19698c8fa0aa1c83f6f802561b098d007a93cec2c1dc11765f88dfaa9a4837063dbfc880164e48b5045d82b28fd52f5d787035ee3c833b0e33c14ba3bfd993b8b759ba3097617b97afb7efb85c307121086cf558418e94dd11a9fab2717727d130dcb6455c656f6a74ca296e70c973a7a86869373a17cf0a406d049c3ff364a04dacfac15c546d2dae56567e92846c8992fbff7cea21c6b3efbfb3f5f2ff3b1306797d4062f4a4acf2a84844b0b2ef46380bd866e1855e7f566693d2f201c9987f2e617b54acb34f12133585014babcd3f64b5b674396c0e996ab3e021ce801ba50ad456040d05d6d0e451dc31c668c7f22da9fc5fdc4e01246c8b93e5da52e1b5fcac9d8a6e0a0879e306b80a72718ae488b7d06f847dae7ebed0d704f0e1abbd5b5031ff0a1e18076de053a36e3cd1f812c8ffbd5d66ccdccd6eccaee955b4a29a54c013004340494042914089e3e10044d60c9034190869e0fd0d0f301ad35ad35ad5b584e26546b0586ae522764097ed5b3e8a65d7446dbc09ef0b1d8b3fa1bae4a2c1d8221086aadc75514f4454196d62bbdaa1cca345f21583994895572ad34188261088a3dabc7624fabb46a551157462c1d30ec4416267edd559369d50a5da813d895aa096b568bd62ca9ef964c166d793614eab46ab94c2d21b89550a754c7d248bd42ad5aae53edc41e17178ec5457409d196473ba1562dd7e9c5e5e55da21097f8ff302e5cc59aa5e56442890fb36ab94a465ec4c246bcb884a0d61a049704b1240813d69dd8c3f258ec69790e14858030fff22eaf126350a105e6c525748126ac2b872ab1585a5ef43571758592d8a42b876aad5a4e21c8994a26164bc963f1b892a769134bcb29043953c9c46229792c1e57f234bd89b3f5daaa657a9538c3ef58751caaa575c7a142d0642a9958ab92b7f24c254feb4eeb4eec0141a32e035fb9323aed95d169a764958665545f9495f2d9f4cbf5a5127d470906149d800f5d67fae6a4b6d6a9c14db4bdeef45c8bb3d51a56f2955fce3a2b09b112edd977993ec6e4f570edef645139854a9dbe542a954ab55241e09e3929add5da7b31d6b49cb76de3b8aed3daf34aa592c9f4dd9c3c1454a0299014954aa954e04ab55aad52a8d5eaf4ad562bd3aae4ad562bee89ce634a7f52b4e977164668d3a9af881f46c86d5c9b1be9d77523f7437c73731c2734356f222b6fe034916dfa37705c1b4608468813e70671d8dbcfd64175d09245904dbf0471d042be0860d906a27dc0b2cf6d5c9b763e5eaf476ccffc258b20f7f690d9738cfd382cc95772b19f4d3f8751598efd6cfadaa8ad3f29c242741e53c2e86caacde96eadbbbb8fe5fc6ee6397bbecf79eecaf96ccf2d4e527f8e079f0929c9f1704a2a8debfdb91db729bd8b431bc8a682edbf41f1991f9414721bedfdb720b739b94fe8964a0cb7069fb9384f38cdcd39dabe93b48fe8dc9d4ac37affcb53695adeef1751b47d8921a7b94a9ef88b7e6983b6bf6de234f7478a93d4df1ae133578892466ef3bdbf15729b1fb7f1defd12d56c4eaedeff2bcd46a47337f5ca68db5660e7f27adc9d39ed7937f6ab68f726f6b0587f63b8384da00c11f98440e7e61851722b95bc9b1e960712b90c15d017a5559c7e9a290b6a8da53ffd892fbb8a75c3944c8222aa345f7ea39548865d29ff1453f0bc1bdc852eefa627fc95aee2d5275074e5d01af43199334b6c29aa2fa2fa129a3224cbc1e141a7067f09d9419ca41fc46ab2e9e9448464d32f8d382b23239317d4227e412e63be742ad5dd5165187d738a5819d5974511e1b0c4ba535fb37b8d7b3e51f46ef28b2c9bc8c24469243f80bc4ececa88ca090706c76154ea8b65b7b16ce9616b6d2c593bb5e3ae17f411e59d6ea5dd9b93fbd93de8dd74dfa950a142663ecda5fca8df1e14852c993fc3ef003d994704ea0705e4eda078503e6c51d057376e4694a4cf551dddf8a3be649069fb9495a0a93982dad1d1450e1bda1971504c86cd8dd30c106ee0f868681ade8df63570cc99393367b6d74534a5c948a0396f799c5728a90d314393432684593497984c38cd349a4e68b299dafe27bf31939832f48d2acd9ccde66c26514ea2211cfa717837f771783decae6f53bfcd6f68b22943f197dda44236a538f38a6cde98493d184b6d88591efa72847044efece0a01000a0e70c670a1cae08003ab6039420d400148870780ed8323b08b043a3111371d4d48800004fc74f006444e868ce9ccdd9b432697451d19c45219230afe761783cecaee30edffc6e4700740f7dc32ee74c936d238a9b683a56b413da8892453737decde561abfb8c7dc74a1c66e5bb4271287953c72cc50d0fad8d349592dc353c6036562245cf9cbf6fce601e0fbce7ac045f07a3870fea638439828c00e61473e62ffab3074ea38bbc88c6a08b2829459100646232289d8dda2852a50a121a0387ab681f8bd9c36f1be2a1b20971e0ab95e3f9c193271e3ee93c263eff720c7798fb9c738e2fa67d77f1c2a4e6ee5e7d9268e193b3bb7bf54982854fad96dbb43d5560c52e6badb5facf29484ca762c4b5569755fdf698fadd2cf2ec606b756ab5b6de9f02f3b9bb7b459d5c52efae548bbb8a056cadbe6d4316cbbd15ae58906881b5b2a8dc5bb46765de1f9ffaf2d7417312a98cab7d7139c1bc7c0eb3e27b37fe5e6bad96a7c4b3fdd6e75c208ebabc3a5a4597dd576c2cb497f4cd16572375cd2efcc9cb5e179af3e19b5fafb5d6da17da63c2b3f2f3af7fe7eeb78cd56c180c1a03e6ddf84f9918323160305eb878912d58ac8851318a0ff3e2e292a136a05c6b91f868a574da91ce2122907a8e8a20c9a0e1cd660de3edbaa873567ddcdf4de4462721d72d8f9692d7bb41b2f8f3a89180ffbec519e318fb4835e8b2fd187c5573133525adbdc9aa6dcbf966fbaed1ce39371b7374648fc47c12b561fd6c4da23f0c411a8254eb0c4878de9b825a6bb5010933d14d9be98cf95953697cd05aaae3a4d5fa0e9f0adbefc755535fd4477d1d8032b179b4d8752c014a508b4d2fc6d35b72be1a1c9486003e80f87276ace152110ec2afcc9014c407215058a08928a4d8e490020d98408826acb060c78502882736e0b66e07caa1e86b41477374d4bd5a6a2979290af804e4f69fb5d6ea4df9e65f0a08e5246cadb5628d0a77af7cf3a324cd3e5f993f3a53e66f6e0efbac29cd47eba63cf6be5b6bbf7ea97dfe4e13b3e803a8fb3e16fdb5ca82cedf5a6b5557fffd7b6f7681b5d5da5a3fffac8f7f6ab77a23d4d15aa7b8e26bedb576d4f68822b9d36cdcbb0b74e6cd330c3286691562e28bc73bef9c2f6b3df0f79bf3f3d7f9f6eb7d6dcef71b6d4e6d4eaa7d25e1deb73fc21d7511b118131b84b036c686aed3327cda0ff1694f82864720770442e70d5d67f20e4c5aed5da22da1396f5ca7a9e7b0187cf34b1e8fd3d4e133d14f15baa0420baae9ba49a554aaa942a554a00a04c1a6efc70c1f37116bd239edbe39bde75e8c31c6d8628c31dec9796b8c31c63fb5fdbed3c9a232c67f350dbffd7dad8fa9259dcf25554c81560c8324419ebb4f1e987071f2e008cf11d997a1e8b0122c3ddf09079f07fd702508081db607fd7065973908881bb60729b9b24b1ba4e4689fb6072929daf3e64ca04a0fdf93567bb19637aed35e698a23c0c10e4fdf29c94e0ef5c99b739e504c26c784d529cf5a9b521da10255e090291d147005ae708e5782156bc5ba172809c10a5921cea1f3216c852d223c0ca192b7212d9616cb11447c367d4d440911241f8bd65a6b96162246d9f483b903142e6d32994c2e97994a0997179717530a627450f01d1395e5c93a37474779817981e921490f4c6cf703a353a9540ae67b30ea44f01a0441f0c5ac8160b1582c716cb55aad51c5dc21869815312b523c39277f482bb48b8b8bcb0a16d9ea80450b162d8cc044581bb4d073033020b5288a22f952a142858a970b27b2a626d363f202c60b18437278b8e23364665190b512183018304cc4ac8725b24704160316c34ef962c8c4e86434a24f2626132b2a72831ac8e0063119b1989dc2f34d913143868c2247e4191a0683c166cc20924d20232323030208448ec89e6c763fd498a95163cbd145925039ccd0cccc6c073292b353db81348043534343a391e86f3b90111cb28e910ab46e5063a3c6eb6ce829fabb771d66c409234d582341467c8c2cd9f435cd32b06163c30611a2ba1d88c8143be555516c6ed8d830d9a576a02239c044d813dcd0738649b72341021a76386fdcf06eaec31c362489b61de8c8066ab8ed40476e8819b962a40acb8989cf818ae8ec523b50919c9d6b8843dbb061c3060e1c2b22376edcb89123470eefe6861d523287b782dd393687d1cfe1f5f0fc670822cb29069f03f5302bede636bedd662c0015ee8789cf1604d97b8f8ea2dc28f6e85e1b746d1421295248b1831dece05e6be55a29808064506228c8de2656ae1db2b789956b87ec95e2da217b9b58b976c85e7bad5c3b14c4817b748f8ee63cba47f7e88806323070e26466af946b9d24d92be5da6b93ec9502058945b24848b52259248b14459369e7db39e79c4854ecb5d75e7bed104ed29c73ce59e79c4944494449444944b53a4112c30907cab516096905760517c9da0bc5de15b4606836ab52a58ab537c9ded91147e010498172ad93247ba55ceb24c95e29d7ceec9572ad93247ba55c7b6d92bd52a020b1481609a956248b6491907e0220234237675d0dec759264efccda9b64ef6ca88a09aacc66b39a295c50a10595f5efc694281d157c37d6de7b31c69aa67579e33aed954cdf099552812b56d8d22dda3f27849941a7f9535ff4ad0c2d2e1880e5b8f8772f302fb6eda7edd813b58861dec59ee38b2f712447152d54c414c14296737db6af6256acd06432ede743f2637bce70569a4c9369324d362b3559b7e74cc80aed6e23c312b3dabae89b82057964dcd979f18fd93e084a4e254a26134aca349f51324a0e6709a60f25e9bf5e2e7e8785a3cc5cbcd0e16cb6c14c4143f725c5403716915b1b51d2137a0103032f3939309e14183017580c578c16994e4f9d984c4ed79a3812f0990c1933c2caa2b1a251036c52c33bfdfe45a4642a045fdea24ddf84059ce0425fb1db5aec61c0833e2c2d4ef47a50c0613140cc2898f0752ff415370c435f3177307d3325f173a28ea13dd135aef002ce76bd16b950ec31e15bf7bbef48efa6fb191c371d86df04311465f415ef0ec5909274fcea8b62293eba00d15d01a2fbe5794a7a620f0a7f82a8b3f1b388ad133e147b4e7896d1c6bf0adaf841ebb3f1df9c2764158a12feb3f11bb1f1df9c9e1b64e39ca49ca31c5bf46489cf0e6dfc338c82f8d517fe135462ca00a2d7170244afaf04885e4db0bb8be993d88380ffc4ef1020a2c403884e5f25d94207ed6464cd726bf87c87d341a8a5d22843e3a4af5481a055356ae092377e94c46f0031cfd057a4579c34b4d863c277e227e2d907abc1f110b3fd5ca6c0fd50ef66be7b2dd43d82cf0088866d1fdf9402602881ce1c4610850ee6cf03bed6dbe125dfdcd6ded80f870571828549e3017446eb348cf18c41c05ff48324f951ec870ef29553c78d6aad5f4e9daed378c0f3f3e4cc3e24b0a70b7b8ee5fd07e29bdbfaa8343f7250fd3ace7dc5d8ae623975102196631f4333a5f1c1b37d549a1f46dff6a01b2899ebf843874d3f8830490f373f7c2e9f4c69a6f947e300ceee4c140625e948e35fabb96eb5abba7ab5545bc0fb7e1853f2cd58692c6b6231fd5ba65a8ccecc9c29e4b230378de9f45d1973b1cd95353a7076a63335f88bfe6c5293c73216824de9634ae9dbb1fc2a0e738ee5cf1c87d13fd1f0955348484888471df5d8637ad33869f951d99ee4fa6e6b6a623192fcb7b97aee309bc2be4fc237379e40ecd7b70f9483d02e730e4984a86a6cc464902f71cfd69cf33d1ba0e06006db9d74096c6ccb9c7f50ab7b9e34e0af9ef5e51752a7250cbbb43f637ca67b2e35b9544c49de683ffb52099a3c57e875548c5fd8620903b96fc61987372f6ceeafe841dec4868c7dbf7cedfbe4a7def4de77a9d6be5f9ef6fde93461f8f55d3596305bfbd458c2809fc732448de5771ac39135babfbe7135babf4ade088ee1c6da0a2fecbc892bcce9b59457a83b8faec128e706840ba128474309db727f630ec4b96dbae7b1bcaf5d7c471df5c62811dd8f6fe3fc3e96f8b5affe6dfcb36a594b21dc3e7dd08d25a93d9e9af637bfa6b9fb5f4a5622f35ad7c074f759cb9bb7cf394b4b6bb8f7de7bdddd4671f78944be9aad40ecdf7bef6de19674be5a6b75bb2d92bb5b77776badbbbb23d1d9aad55a6bad5673fcfedad75a35ed8e628dd2794c49f2b4b02c88a909d941bf1544862f02dc8f91afc43f6e23c3fdb860109cb81fd79e234be6b0a2af7429926d97a24d9ffe70f88725237990ac07b0cc06d5eb61bd5afa332db6bf3700ffd973cc30d4395110c5ecc0572ba5d8035f7dcc029ac792528c29a5948ee5fdfadb8a29543a038ec10bbeafe82b3f2d830ff7d88befc55a38e99c934e15b6d75e7badb5b86e9dfba40193e7a8046c5ed8d839190100083317000018100887854241160449a8ba0f14000f5a76465c5232170824b1401c464110c53010c44010c640084341ca40e50c53a802007c613884add2807b38610ff173cba2eeaab0beb1edf2e2ccb9c512f343ff8cf7561241b144afd16e1765e115ddeb9b439cee38284ce03f8c5b712632bdb616f1fa1ffefb53101126afc9a753d7684ab8e9d45ad26bfc0dee3463ff1592a4948eec27f6e4baa2b826d5952dc24cd541ca9eef6508be27c835dfb3b47fd220704fa64d1ae63410cc30809b7f33a1448b3a65d9336f569813d7112d7b272ee81c6579efad80e40d75246410bfe4402de463827973307d79fa3345054f0f81bd8263ccdb9deb33ee731f911db2a54a71fd6a86d1b7908848a4b260cd3c8c26a04014eafb03215d59d69046824b6bc696327a69d8c2842449495ac443966e7bdcd9c88cc77bfabfd26b205718b869e9ed12c4d595004dc3f2ec02b45d5c895ff1d1a8515e4522ffee05f32cbc93710bee3cf653ac4978b8883a8bff1193c202848e088e05257a1b46483193c0dd0457d15c5d737c1e9181424db2f64b039e52017862ee852cb97f271ccf0b29e0d91f0d11f973d284f92629dd479b963364b9a3a42a35a79eb86043387c02c143ebc9562804a8c33652bb800d0d7ed939eeaf6622cbf5afb058631c91c712151ce1f69b195e232ea2d925fbfc57f2c6a7106cbebe1fb20a1aa69e2dd457612531a21ff5e2cb50b150c6e87ab2be26e27d6d9547c486b3e0601f47ce6b35f193d59c03b72f4fc32688f1aab3f7f42efe1a0de0f581f003089e20bf01295a4e52882f8ba857ceffa5e8e0c531125515c704c7252415796162b3cc89fd86c4a79913c3fc65349a391dc7a66148ca96f98d0e07faa7269b4782b807e0a6634fe7699f2a825b4c3477c8680755c323c6eebbf4900066a90d4584a334c0e4b260eb708def9f0a4f81957bce9d71b5fa8ec64960c03adc21daf466ae11f895328d8e4f1410a4e6de3d1a83796e502314aa42c2957493246ee0cb9d5b2a93df6e4e22ec8be3a2668c89b69ed83393785c85f4ec233d82c74b945b5479acef8ad5afc850e3e6a386f8b42bc1e5c92b3f5e919a08b615227e79ecdd9b8ee9313d489203ed9a7630490e6b9814b50410068d5390b826af5d07e317ad4ff6f1129b0201956e9817c829a7e259140ad4679d02462706345696dd8df065d5632e7dd843fe8c05848a86bac6c34368d1f5f1c593b0286aec1b90d563660a827cb00c72713d736249f473fc58d91823f83b643973ac9f97811598e2a7dd8c231e672ca80c6b4cb2a5945f1eda3c8d957e1f5621a062f6cc4c058b8b354d4a0c63281c6aac216e928fe808d315e5ba73bd737b6ec56edcae19cd813c8fff5c097d12136626432a78d9e6b9d5d256140e7b29685208bd5ced0aab760b25ff7dba3e67fbfb25041e305456817383f97ccf236456e04d8303943945727e231aade5943b87f0569cc506e3c790fef6abe4670d350b12741f8872c1696941b7d9c5b8136b107d7fa77243bda1061a3153abd6f00c927ca7d5aa7501733a1c04de310e80b55e274feec0dd0cd1af642de5a17398df5e16e50766d7cff94c70379a8a1e358c91326c180d6ffcc676279a2ae7d1dd347fd110fa8119c25be313b7f749cd56da7d42115215c287fb68f2a11664e4ed69ed13ff2268fc5ffed8d451cde55f59049d6c379040d17ecd2e164c87cfdd08d8533b6755a250babfc194defa0a65eaaa23c468d332a0d82fe57494b4764b771ce0021187ff25ff280d161567591ece86deea96d291bdce95aa3e8b482c974b5b2930f6d5a060ffa28f511a8eac5aaadcdc5cc78483b2e86ca88fc162870f477d120033e20349d74fa11eefc1f0644b177ad2bb1f8c0b682b20b7c3933717e22bf7a165585af93c5da5180c983f4667e1ba1663447440ea09fc4480ba715358a4c8580b2a3c8305ba43392a2075ee0482f9108615c33bcf070249bcd606a04811a594f710affd78439070c72c023e5ca6d417a7b85dc64fd299344d355bebd542a240cbc848d4f5eb53adf72a0207041289bc72762c34bac91004a063ea544217e542b5afa80f625d558784a8caae1215eb526a89da7cc8301e55ff03ab4d9f5357c8f7953ce17bad5e7f387300fbbd7af3d891172e992a68165334c855988b9c43055177ccc153c4ca17aeb949b9498a033d57951f26d222412f533c59624bf70877720cd66f6b3a2e1cf162ce9333a3eebbb488c6fdc5089a2ce411c706c557153ce2b1d9f4f10742690b9a83983f84eea2a0631d88fec071831e80554ae7689657dd29c07e31046d164fd5af8446f5d72aa67e87b3cc21f999a54d10372bc649d84a67c0f316de509b990142d1c308df1ef2ab93852649c1ad309541346482a49c07fe34c4a8c089661911f950476fe4681aed4d7447ef5865f11aa8e859e42a951e652ed375ba36d12572ead9402205b8e10676e1e4485c93874197e0d1b408b87fbb854037c3c6fd5e45480b41bca44b5a080a9f2a087f7283873ea6f1615a68eb1df4ba33bb1a7427f306535fc3448f487cb33496e368028b65c8accb2012a6bafd85ca92a43f59a23f921aca2905c79dabbecbb3a410e1dc6a4567d2e353d3448f76ea1e67b9794ad8f3ef0de559747536b54452f2dbfe70403151e6a58531958160d138ace928117fe3644d9fe58a6eef8b0cfd57f4c20861bd62d1985349070ef2308d382e423e00b6811e8771262149a0ea87084acd42095c7539f26fa07b6efacda734cdce650563c3a6e352fc32d748b35a182d7347ebb241d4df5a469847839494f3efcd0faa1dd2d8853ab07f907d3d8ea30f260ffae2d42c1af8d7e89bbbfa294be274d40e801a24eb658e309adc6cde649c710a07d778796be1829e78def075ec665bcea621f8ba8918830dcb565dba8929c3fe91610a26f1a0a33b3f4d6cc6ea549d699a257751d0ba56f37abc38f59bcc56c85447ce104032350ae0d75cbffc2a2adfecc3073a9918134d489888ae2d991737a0a7adc2b9e767070169f4b4a0c96914955297298f70ded567d3c56c2c76d2bd60c147a0c7897dcc5b590cdf6241ff8446a8f625c56f6d75e34dd756506155d8be889c85de0639a5b07c2bbaa7ed132317ea8947731b1274e29ba516a2530b971d061165bcd93cb12c55f78263ec5b1f44e704b232d8ecf688cf2bd603e4eedaf1478594fca9b21899c8c321fdfb291c96ffe184f3d9f4b0bd7ee3e9309a2545bcd490636102c6a0412316e7c8638c7ef3b8d4926996ca312641e9fb14fcd84a3e17ec44d9a303b3bc5473e40b129307ff1e4015f26d662974654c85b6e062a209d3969488e3a4f7bd935847e7242d0d04bd662d65bfc7fcaac08ed1d94a158762cdd48a7a668b06f36394853da44eb83cb2983860808742582dec2d4f55645966916b92c231525b443ce254f608ec1ad71bdbc6abd571bd4ab4cc4f41c1c3b7f2b2577579ed67a3972c383afa4c1df281d2b9cfdafb965785d439cfd16bed7da1e82fbadfed116ae9f75d7ba72b532349c0898587e51773fe3d1c2862edfd6ed5a01453b0a7a8da393c4ce27fb5b757680ec8a47faabdd6e85abcf1bc53057ee10eaf0ee7b134818c1607f193d87e934ebf6306c5dcc6a0dea91beb2441f765b574dbb4d4db2d7fe489699cdd9ff864acb9503dad6ff3dabbb4f861535bff87045f8fde5fffe5e344ba9a384aa3d3b2c18591c46a9c2479266d5c1f01d7a40a0f118550e294b240ffe789ae9b5eafdb3bcaee80c9eb429aa21d53ae1a230f1f846abf55267e5aa92a05de4297db929719bdcfa46c989f66e107f13908c34a61c5f63d95b18aa41771aace37b22b5231d137c3fae76e7a4fa154dbe9379075cb993f646568362bc418b63045d047e2c5a76b1edeaa6395fe87fcc7f3c51f8864444a263483862274473345e05e0ffedfe3d76d85d89dd7d999be108da30c223b84eecccdd11a5183f2a82513a2b15ec00ac819d0db73e1bedf2a88e1fab20cc74e7dfe6e67107a235a10896c5c49b71750d9bd70b8d8d35b885cbc8a04c042c987b039b1b85a02c1dd924e2c8af9f4fab756510a1078f936cf16ada4f585f597804efa67a4f9f1c17c85fd1531a1f3216f7890407d6140c8d40ba7f882aae427979f4ea89d33938a0a874339526943f31483656685f0ef034806843cc054209171426748449c06e5960a7e00c063885367c2f7382067e20e933ed3b531b8393f8095f84e7fa5570447f0a071a2e93c81cde10d2a697086489c3474b9e5d00ca3fa839d3385c595bc66b54b018bbea8b3c39b9d0e47db1e1e5f5d94986bfa3a31b9a595908e69652957b86748ee03643add9e1b52c3dfe71db5a0d3f99e8e16849ace8eb018453c59a00e4d6020b12aa5e712403da615459f62baacd83c17b9148e1a19239b64694f5ec4cd9d18d0168c8a240b95be51d4bff68c32fd0019a62b5c82620e1bb386493ac9787d98191067b99391f65635081097b33ba7f122a92f6058fd2530dd67ba5effd8173889124672895ab1f8a1a66873892e0ab0e04e8a5e86860c42818c5fc9d7933e5de89f02356d356beeb75523a0bb1ee1ad9d4f70daee08dd4b2771903ff409bbc5954c7c672a22a55c520004dd3df2560a2ad59042fe563a1ff163229e8add3a81a939e0606465e0bf6cc3493609526581213810de48df73343f1f80daa037f6e94f9d6522372c34fd06a30be5efc0669072c28ab6c8d79d2cbfd0a325d3fc97931cfe2107bc4098515be68b3b6e8ea7746c8d796f4a7df63c09656ef2b17f339a21fa15b5d2551c9a7b3a68eed74d774f37fa7d4770de8e1f4d54ca614b3a9b7ebf7f5bfe074ba7f91dc8bf7076322c64c0f26d5eb4f37322fba75cc034a17fab1f26c14cb094667df32f00c67abbaf59f39080d7c8339819a1556902df448c0788ca0847c236658c77f9c4060b316cdd85958e1a0e988b11b129e5c074b913c4ad2a762e0b692bbdb35785966f89bed2bb5b75d40f9f6e9136a57aef5247e40deac29e43e0bcb042e92d054c752f8ec5bbf4133be08e400c5f443f9ffa0f58175f61071bf1b8b11f56c5b4f88746e680b9d2e88c611f6b7873f247e8e68d9180f1879fdb559b95d584583f054d07abf3c22c2d71da0a2a18f5dc044f52e326d4347d25810a19fab600877edf2f0d52a3490607dba25e143d325f762a1f1cc692afd47bb2615db940f999b913eeea4546a2bf6023ae0cd2d427ab7a7365f705eab99fd3255845338df5547ee69e275abf7a1ec8a3559ada64587042ffdc40961e44cad35e78df8b44402707dcc8aaeabac6680b8bee1c537fddd784345ec8e9323c252c3cfd8b7939797ab637e22a9867db495ab702c90659610f0252f181402edc85b164bb6a2365fb00eb3b17e99a704f3795f0a96e0bf9294bc37e73acb04c4303ea39b48a5d4480312d5f46a3defedf546bbb855113521df7eac27b9cfd88762de1d3fb17e9905346c45e9c9843ca0dcde4c4c65437a1a54898a142e169497ba1f88f88be11daef61764908540d1aaaf14f3058d4ad50085a67aa7f99eb9f61c00c14f55ee0ae0da5d7c9841003f9c93dfb7f65029faa7b39fa9776d8cf2edfc193d86b5fa62850163470898e3df29efb5c6a32ca6bde2367d6dc0999f4ec91913bc533641d0051b659f16e868b8dec11c3e06c827091512a7ac907f9579e1043b9efe70d059637e9d53767221f64d7f97b54175bb47a0c2345ee36fcd7830666e6e07158a7bbc00216343db8d713da29d616687a63fa8e2b67e7c6dab15e96064eb59b115526c8919d723720d66125837a6cf273e61e5a66a47180a48f2d025f736415c20d4581ca834281f0ccf822f619c9ceb8fd6cdce8a93b8c0d15937a27a11c6d290f3a4883004d7752a3a59ebb9ab360496c047618365c5f2178a3c85140c0b3271c10ef5711fa456e3329d146243981b38e62224e46c2375b8f96674ba6195f7653ec3d35e720ecc13243fc956f89a628aa7c808e0ea1c0b02cc34fca863e013c32b8dd8cf5182008aef9fb24941c50f8a929cbaef69e17771140607d74a64f84c6746e16ba6567cab56402ae0165f609c3276557b25ad499ef20d05eec2212838698a59285a7c2eb8eec7b5474ae606c3deae0a5e32472e599cf53a64f95c8751c9856c2f6573edf7e1d04d7e050bdccd0f0d012cad98565a1b27a03aca3f2c86d7c1810e89671ce6e2c1bf5f63b585e25cf01ee660c3b6f280d4e123f6c863d7f280d6e12372c82b9796a462756909f734d0c7675346ce6c739a6647b695399c8c73926d00a94742420e05ef0b3669892948f12f190181c9dd3810323c64b1c345ef183b79cb4548eeea641f50ff3013ab8cdbf7eb1f8c9669c795339b859fc62fdcdf583e640a8f865031c6022020b2e3afda2f69d27d17d9610d69795b7aa1df81bf5dd484ddd835d13ef60d05f68035dd76da254f276ba0d2df7c742b55e3e5590b29d681b585baa3c6ee35d8e4541421720f47818024e9f7d23a857204bda300b3b3df6e819a85cc83567e1b84e028199ce0da63e0098e2514330781ec15d0a7a901a6a3bf0e72dd0fa16607d0b05f07453aeb6859bdf51b56eebeba0b88e8b7a999db607963127172e2bd5ca1db00ee591dbf8dc9041b18439bb7059a99acf60794a9f03dc37671cf943293849dc6231aebca11c9c44dc62132ee78f86271dcaa025c13e1c636230aba3b1197fce3521b0494f27e25e8e310356a0f4313061f7823b356248aa7fb8b4c23330b73d46a22581c01231f0d38210b4f2e8a393d8f126080459df8ad34840d603233f28778988e54a28ed28660e9f6196b9728c9bf7dfb9a0ac7cccb24b0278e66cae40dc1bd57dfecee298e19052cf1b3a0145191fe4f7f2fee4d8e05d76a9aec225135b7ad20f6df866ab9ffa873768afba0ac851512604b91aefc1571951661018967041434b846bba9dd0ecf5541f0f1df7524833ef8fdc5ec2f2497df75a2f6ef3fac2bb8eb6fa08f9114252aff5fce602b3acb60ad4fae9da4bb522922303a7e85ee7c5cf2f4583bbbe40a2aa5db8ed3a5e243d1369cbe47e90a27f22784593516ca4fce7c8722a1337a1e0c5b1f059b41091ca6ef7fa4aeefe23551d36f825e900e6017b39b2ee2447aace2bdf21f43f1bc775a9d2d71d1411e4a4e126a8e17d86195fecce3113d192a4b32b3262052fb68c79eaed77617ae5afd2e4499609154cbf13eb97fb37388ec7999d97aabce60352091bf877d5059f1207f4501df2b49cc44ebf11b63505189a5c9c75ccdcbfc52f5ef1458ec5d05a0e4ca9f4d41754f1999c69e597a6b13a39cfd33a39c59337362e16a5218554aaada5bcbafc3c667d6123360aa0d2fc028bc1cee5f29ebe792a787afd6b8db2d44de721c6396847e85faa8d887897a58d16aae96e40873bb9836c921654478aae956f38b680288a0d14a4c331646c4dfc7e029986a243a7e73014169fe4b0504595aa8a1bce85a9ff9dac76e52ed1a1df7112a2dc48dc8957d12a28013d184f225868b3eaf92f32ea6b38cd2583c0abdc7ee4c2dd10580226ed32112d6fcb86bd10c32001088bbdb138e0ef03f98a18282e6f1130e8c19b672c1eb0c16f3094ca04a6a0cec14b6062d91884787d61eec43b088d2436e2c2a74da5842f5c9752c3d2ab90b553a876f776766552ddc8e67c121a07055f70871a0764aa160ae80d78c0ce5a2ad079a0754bf98c33c5045a924d1a410f843ae7e086dadaa1049c9c2be03962f701de91a6e0cb1062c9419b8fdae641ae7f52261cecf652fe32e327cc4198ede52750c9c47289c7879526e91e9fe0d8256bd708492df9ddb6de8a2109adb1cf83847c950121b49d84d10df32b87af8b5468ec0b81fbb9aa1202a6573a5a6870ecec520fa740602dedb6d157c02fe929104a5f5667225c4f4862424d1961582d8d2689850b6815d7c2909b1c40d633ee5ce4420db336e55db8376c46fd3862ba581e01a5201d91be33ddfde6ed9d3750f3be4bf90b99c0ea44ffc41fafcd454b925c6ebbeeb3d1c3b7866717486e6db56104f4a68bfadb5db07b4f4e82ad580e9957abcb5769f744f12b11cc5e12eb09dafa2e07f4b9f30f7db0fc7735076b2a704058d95ddb9aeb61f10482d101e5823188c78019b071c6679085099f5c2602b2f491c52dc31c71f4839b2d10b9efca791cbb8fbbab629b3382fd29b908c72dc407bf17b72a9570cde5cd2e76b644caa40181f800b8a3a00c9fa5d420ecea36325d6728cf9ac72d0479c22721c1e99e05a2b969ae59fdc1fa663c8a8191cdd08fb92e1cc4dadb0651ed0e19f375f7071e660379d313500b871ff50e934b8a94df1e8b2bd4384864b38141b741b2228c89aac85b484a074abd91d25f2bc4dc4766824f42d4252dd48e28be011d42916fa255f41b276049d734e002aa8deeb35e176c1c69568f5f0146e37a08824476ae1abce4c720bd5f19caa4733b9755a2b83a9077a8066b1e89bdac9e0ee20d7452710dbecb073d8270459d2a2eb4a7a693e045f57f50be79278fa2d1f073325264ba2989c233df229471ba57b13501488b55e3504b5b9443c41022fc3283582ce5d03278b9fab6f9e148e8400e16d88be4fb370eb6b88a51237233194ef63c91fe15c1710300f3247e48855711761104d7cd9dc1736c20faf150cf0a8e49030c1de082cae9b9120c75cf5476440ced2df3c22b965505f33708710d0870c348568b7bd8008f06a534b88c2b46dc28997d640d1111680b5a3362de099ba548496a66ed5bb780b1acea2bf00d2061e6a47f89ba0ecd588f20e64b8146a98ec799ddff6dc647a6afa8f1d066dc006d2b4865d80270404a39322bc8236943272d5e451dde4258edc942a2cb01f5fa237d8b55f77c894190fa96aaba5ec1de8f5a9451461eb1a8fd484afba1821718501914aba2e5f2d955f2233c489477da2601eba8d4899c85902278f8081aca926836cae881b023119fce2008dd9d5af5a4dc10029ca0d38df700a329e0259389be7d4da18780f779ad24ab3ac80c7aa54f30aa1a9330616daf41d0383730b3402cf4b2e8faeb9bd35f4d7aa0b1b29bed5aa64bbdbad93dbd1fb99ef353d3f6f7063be03193d6300fb1e7e425b25717c55386a507dcb3477b7cd858f022ecbcdc4330c528c84fb8ef512b9d8b58f430f572c50c150805d775f7df091a7b2860bbb5737ac4f20b5c0495c06a4a2d03849a51640f6b68f2b03d07361fc21233add22ba2e5c0ff9133b890367455b84d53d0650274efca89df068442a33010121140f90a524119e596b17e1a56a2e8f2d5454f2a49ecaa469936badace88de4b77a6bc98f0711ce411e4d144627a2b34e476fa4584b9b10c632f664df1cf45707617e5e16173c011266f2b0361d486914dccd58dae157ed311fed4582a4f7fe8c94442c8d0baa8e3ce3e49eb0619d2fd4b6bc4b0d6d59130be6d8e42932d59db8cb9c2d2ec8e6d7373b7f1d7e482440dcd0264649a42af2cf2b89d42a520b54d887ba6519bb04310c4b845bd27f040c69b50000df0d409ed821904a877800d117bec6a388f9f5bb86f60fc5a21360f0d5cd72c7661b108100b23b43d986786b0da81475a79252c977e343b0827b02a62823a6487432cb58e0ec4a1fae1c8726df41f9f80c2015cd0060b2a03fa3be04e1fa4e3634c96a1fca267645eb8d541831dde5199173ca1769928119d9ae703d8188cb1d23d1257e5b0dddc286c35fe85a10b836d39eba544a63b8c6bbc9c4a04a749ec9c6a564cc06bdc1e04d269a4b21251208b6a02d3fc1458319a1ac8933dd05e8980cea4910f4cdaf853a709b68ff95a22508df64f908ac0698652953aa5f0174d9fabe8ec79fcf81e8405f43ee27d78da1639720f33b09373baa84d42334494d6100830d924cc2b64144258699e2fc219ba79f42e0e427c9d5cf08d612cd16953f0538534fb8a39936f1dd2f0004592d9be638c485c08a26afa54f81af670114a517ef1743da55ebaed0a20e463451d38c660ef97d67d15f4bf296718fea62d966f6d07ca4b0cbcabfde44b496d4a9c5dc15ca8e13db4674a30707b0e462604d38a54ec20d8df670f21740f2b4bd0c070b9143d220800b82b6036be403e1c56cbf9e6491492fb0c8bd43f56412f803cc6c284ab0b075a3acf083143a41e40538702a0a30aa578e9360e496168a803b9fb08a48cd198666204aa9c0ad5d8e7f33958dca227ea6673f4c2703f52951aa4e350fd16b78f04d017e3b3277eed4856f5e201badc3b1d29c64fd86302e551c1da105486a13f57ee8a044840983a37e52b81a4faa9e17f9e40dcc3b992bf1f370960d984a0345f295f65521dd052755129390223f9b912950b93806724d47c109c3767fe5ddd9079cdbd52f20a664062590e46e0cd68b365ae3f04e204826dfae3833623517ec91b27182d26f35ab6532fa7962bc18ab10de18aadddf77d1ac64bdc3301ecd8ab0160ba5b3608f1e287c002a1928d1eaae1a74cebf91986f9788981bc8bcb72cb145888120f863494c7b460af2863f0eea072af6dc8ff2d3c5005b2c09772793113270b7b2d8abcc1bee3c743a6b8bc71b8ba512abb402a02c142ac0ef53455531c7d2046c6b67e581dea0d558c9554e0446c276178a1d6f07ed32419fb3cfbb39a8d10538bd69611808572c98d7f98580323b416b326539efc1a650341a1db25715c8ac7dd6b1a4b5d03b380d7f76f4a880d0f4753de9de4881aa0c2d0947239e0143847872d793c815ef9176c3508950e9b241649f7aabe641000e09a568158792ac27b5ff6aabcf597c0387ce79510a300af08e72ab985d3b240feee14fa182f57de5a97325b0cbde035da716784e6710b41e59bf039cffe161b8b507f2af1195873bb057954c0ea213f6e41e4cffff1736643dc934d78e05a22587d419b2fb08357290bac83be9f4cd313f9611f4988ab50ff45ef3103ebfd43b02bba0ee4282fef49ed54a78b8f0a11d238ca579dd00c5e8976d85760301fde070e82e46ce3480ee4edce85a8f1f057d20d432365bae69f8399eea1facb541daf99138be8af7f8d26f602bc617f73ec8e736540357b820bad69effe052c2df3110cec6b92f3418f4d2197e748b605022c5a5dc5739b0a0af05436f100ed1310a8d56a41c401a39e6b29a99e3def8b7e6b47bab423719e14b44bed6870c17a1553ca52b17dd32704a8cd1c9474abb6fd1b9c9e17d933f825d75628bba8086a00988819365d064176732d8a29fd7334d28f182cf030ba0347187bcc6ae52c688c7da074ff5f51b81bf78dbde34fdc02ad3964ef5084bd52d69e3f70cf25da7b741fcea2506284f84963691bcc46888aa6350e213219f00bba9878f159eddf05cb63e1d333bc340728c409b9116247f4e02d6b5fdc917086cc58f656b942eff4267f6e9b02046db02d7911e2c538d26dc7ce0cb33fabbebeb7044db3e7d0a8678a7d62004d8babe04d92685890bcb84ef8a9f49fe8f884daf3d3974104e54e5f478a67f29f1ff0b6dcdf66c4ce54224790da0382fb84e01e51ed068f647407aec2304125c348650e6810eac5c6cf606fa8843e4669875510b6d8bfe4e1563fa20475ce7a2daf54a1cb50b4d2421220220dbd6ef3556efc120a1a880d884d990e02e1e808f30873e16c1a2fb327af0e818d8d18938f7ec7cde01c9f171ee07cbdb2f83ac197c7f78e91397a2b1159f759df5bf8d7a79a6d3e513fe39f7c380d4abea036b4f277b8f9d6761f582150d5899d25df210326a573aeb7a33180b37276882240eb302c3ebe2af03277a3527a2f4e86f9dc1c925fe3bd4909566353938d32961dc738725dab6c1e8c2bee084e870eab0ae6bb9a351d9d27861f732f9caf8fba59da33e789bf290c4201b21e877fb46749b368e7273bc364aa2573cb47249fa9f41182846f2006644a5fd6f4fec95fbf8644c6c7eb161f59ab8e8fdbc4dbf596dc425e82f16acf3bfa8afca2477ee5780425abaaa04c7a594ecf7a9561c1a091faccc0dccb1e26cbf553a47312c194064018619df033e9745812843300a43569a59b0199be32d845a4f65c28d3a0ed3a8a62433a3b248ab9264070b7131b41a1e044d103dec353ecaaf17472e799beaca62ff812d99f43d80fcafa909ccba2e47824ea55217f4a777a0b131d2f7ecceb024118b5d00a71abc225de6faddf10af730fae80823ba6f7b5a5dd3436b8da645210d95cd8c1c5ced4ab321dca0e56775ba9a1e6eeecc2c9a05ac8292aab50d7ee6f4aaa54a441d233e04a3a386fdc907b6596427636b3a4481ef779f9addff72d08caa7e9202dc11d46cc81a8e8270617885cd7aabf027d21fe1b7e96a8ddc41b04f6e3d701d9c5399937ece21fc21f3655e0f4e9132aa3e2a33bfc8632a010dc097b947a8c8f7f0880b18c8c12ed87651246d11116e09a5e529750a93a546cb152d76bc593213ee80da0a484220cc229f1a99bdf0fa82556d4b7c95c1b63bd4df2964332e1432c5640a05afb6505178b84cb5ccf4a7aa0b8cdf34b6fc73cf0024581c6f1771250a5252444853ee86a027bae57c20dad1474013d2733945cd7dbb02be22b4f57b6d92cb8c2646765451650d4ec9990699e29a88070699a88e9920f80a273803a5cd220d98bb07122b5d8ad07a9211bdd9f8e0d08f84faedd2439b938ba793dcf4f7c33a37f9f28fc85fa13e56ea467b26ab6d08736937a365ac16da7f3d35964e0adf1146b172208de6170f07838be79f6f95d1efe2d12a888ef504cdea3e4b377e1ed2892487929547aac32d1b063338728d300637afd8e3e6143c90a0c6a864a38a7a1861815079fab1288f29869ababf8b43fdcb6062a60ec89a602007fd48b4b454e8ba701e8613a7178de66634f11ba4e3b3b8555ce272d926b6fc80777104f425cc0ceba725b1056a92b9bfde33192ef341098810f195829a1e762d47044e7c6112cb843bee698d3f186968ad80292874ac756038e4c28917e1036532d614337f3083ba4a7004deb98f241e7897a415857d42c837387ca2be22a4faf1b05381f5934c7d3b5edc4a7a28268b91c84b8a28df977e0534443796686c458ff713094323cb7467084567d2f5d94133d77e6f10242f38819ac3c13adbd197c1cedcedf40381e72db32093814691c12488e56aeab4abc03d407504df67d2c7ba8daaa376a9a7aad28ee525199579e18fc36853ed4c6956839598800bbdd29ebaf5d726a62ed20ca2265912d956a9a96b1e163bd4686c7bdae16619861fc57e7861aac2ed78a3353aa6d11c9f010ab848657037261c984b8301a10c52db4c8ad9106e00820f6c51112528ac19bb15c5c32216ecc8689f2165aa4d658037014a8d820b3d3b864ee9d23f698506f6d058f543f7c37cda4c1fbd6111960ac572b04bde41081beb9fbef8d75008f8ab477ae062be6d50951e5bafcf1ac10bf9cef43d8a8ca648093eb6dfdc06a710a887339f537d23c377bc16622f4ccc5bf066f3ab7446438f9c7f2bdf600a1fb4038fdc4a093c21c911149cd8800d627ed4e82523abf2d8d2d1f9ecacb0f0783c5eeeb276b67b885ca13dc0c5073d943b0f3024c520a7c8970e0f333f13dedc905a5351e7ff3f29bdf082ae1f75ddcb3a66b345287271896f3274309bf5aaec1277797b3d4656255cb04da0d6105003b66c98f9ab5dde2592f96f083a761a734c124f3c4541936de3e2d48702d436e8d5c11d3ee096c48932687c157123c885630e4680a50c723d20d7377092c55350bcb8ad35e1ca4806652d01f3cf613d8c3dfcd14998be3ea9bc6c6dc58724054289f6021e0c7686e0a8621847fb0fb7b0fde6d244a73e75b24dd5a88145d5ede993dc8c84c6006072b40619dd2306cb985207c9d28ba448d3743e67b7248c5d012469cb3a458a3ebd5cee0af66101e236b0fd6f0cbf167f390297ff0def7644e8ec0385f4978f80dcd58fd0caecff58636348cc1ad315556b349a08207d61b506b02a204ebfda62e621401ecf2abac3bc388e74d7c00b0c05b0a7672c34eaf0504763a75d20982adab81ca09fa044d5778512515a968f96405185a450f91fe25cd777e5de3758503ac50a2349568e9190fe5a95960e305bf8c9d5113f204d1a1fce77ceebda52a148116b4b2f3f0d2c5d265b926d3be283ae6b2530eac4e0fe29fd246b7ad81ba6baba0f731186dd346b3ff20fa364008b06c37ff51c99d7da61912707dcdfccdc96c4f3d73a86a429102c0ff129632b0e098b1ae5953334ee5b0115c797f5ba7eae38dfc7e136cebe29adb0603665f5f52abdacf9de2f4bde5d1c3df41819061931e2d5dba4fcba5b50ec1055e2eca5ff6ccbe985b1208a952c4813a6d35288016fbeb9251060a160da18b85cfe8a12213955f4658dd6a452297c11daf6110db57048da85e7f32ce7f821a0aa09d5b8fe84cfb40d40f7baaeb1f8ab02afb9e71b4597851498ceb7faaa61f94112151370d8e5550f84649004e60b80de46f00291c92bb97ed9a005a63d1ce1e410b2e50e15636be6c2970a0aaf2054646b1b9bbc2218a0045aa44f4ba42b10932e070bc46bdd72c4f3b7e7895c97c15470bf9cffb3a02f01f9226eb5f72865158070249479854a050dcf48b9fdcf8ae9dc28822f009f7315024d9a03966ee192d2c8d032f3e3bc141899570af0310b493fc628d92ad90371a590c27954ec47a19c84a27b2f30b81291ddc19fd397f8c145c5f6e59ae283605719105b490d4c8d99ccbbfeed4747bda4977824d6740b876e523fbf78f0ea8efafdaa3a3ce35f225580ab9cb09aebc76646c4f1370a87401faf4622d1a316c2397a682a02c37f5afc817831f6fb0a10869ab08d70e348a97c7abed699ca20d290633a53b3f184138f79a33ccbe2b084526168639c8d38047b97fcfb7d09c9f8f86ab702fe86a7916593508ddd6950f2b32f0f04b142dd4bc2421f27231ad103001a831721656fa609f96cbbf2b1b1c0baf62c34092c73d223e8719b73367e28df23b914d7ee443065723a9d40669aea9c8ca1ce167375c3632d999440a771c9aafd8571eedb48c337dd8b60c8c7b3a1b4d5104f346ccb6981bdeeea7bbb6b2976413919560358129e3a29f369487543c3279e5b5de44a859b8af3ffccdd62fbe13ce908a2d760a7049b5f5473d4940062a401a6bfe1a6a8e4112149a7deff7d94e067c0e37a99dcf39fb96dd18ac14e4dfac2afbb25b90c695fc19e53fd6dd5fa9830810bd91122b337b8e92fc0ce5eca00d54d64f432b6bc65ff80d19c13f28c54e87bea14fd56b20bc7b77147a1620879f20d1d07a262194e134fa08a53c8a02219d868e2ab8495b3efcc52ba18e8db138b987c78362fb17d07de995f9eb223c7f9c09116bdb376b87ede49848858b69fbbd61d09eb189f23baa391659f36cd58c8e190b6f96fb6ac559b7594594980886c85beab2f1a824368055560ff43fe357cdfd778358ec7bd11a96263f04c372757a6e91eeea93a6671e5a3ad2fad38312ed68e0839430522fae9b430aa49aa42db0a3abbcaa31f91d7cd751c50e1a7a9157d261bbde52d8900b1b5dad7e50890b33b22b122fca018ad3cd5b8ad95e03352e8b9f7e8b5859f95058534cc2e41de815477ad32ad06bacb04dcb339075b35a9e0d94c8c2717b12e2dddc85ff3aa527b41bf99692187201115b2306a42d94e348ddbbdd7c8d551d2958cdae5303de3e095fa615644bf2cdcf68bfc970955edeea75f8a408cca2039aaf1e8852106878940e6848968671ac85bb11849b17e89e4fb3b910a6c3007cea63eca3e4630e7013e1c79989369bad0d8224ed80cb20ad905004c700b4d4c70d5f16be2c961694d0e1206964257bef4de49652ca9452ee0822086f0836d5cf57d3b82fc636d5cfd71679f7bd6956ad6e8cd32f51ceb573fdadf55584119d04fbf7105c1062654e44c4ca9e182d5606351c4da0fc7cf9a80469dcee2324c8dceeae9d451925561635af8f082e40ac4c9e01852fac47860c235636ab90c114ceb032d30a945819a6797d430c21c4ca32cd2b961b33384290d65058828c11101ac4a0c5ca4e9ad72e23093e28c3ca6a8441626554f3ca3a98c2119258998d1b9ad767840cceb0321c9a57d782128a58198de6150e29a1c5ca72685ea10b90708695e9d0bcca15e4000644ac6c078f21850f8f21854f5791048533a89804c5119668b1b05c2df05912e2716405134c21c4c2d2592043894c8dd75411789971523bffc438434b8be5160b7f7106168268bcf6146600218895d5685e1f154818b13200685edf08b420c4ca5ed0bc624ee082102b83c1bf10210421af58fa082964a939904082112bb39a572c0f055b00f28a85bf50420a8a58ec09e8b400d8d8fa3636363630d8bc6063636313e1f3b6e961c92dd9eb7ea2c8b9aee185b9b5a64f3a5ad3eeefbd07618c170d2fdcfe6c729c8fdb92f9ba989939cade6c9cc3b086f099999999db8868a81adfb6dee2893ad759062156350d6ada73ad35d671d23422db840f3a84b02164ecd459b9cc96c7b332a0dc7ece50b5fb99a570934afb5cfeac35f7f15800d79f0e548aed27208c53e30cedcfe0468390db9f4516a3fdf4b622ef3eabc338fd409c6b0a4fec5cdb549178b99f89f82c72337333379452c668e110e7323e85acbb1d42d80ddbad88ff3a8ec97ddf1d9df52bbf1be9ff3ac2097ba0fb15af1f7b4769583b2117daf8ee0037bebbc1f15da5f98ec7edde5abb942608bd613dd68cd6beff56f4e953dbc19fdfa1226b3536e421450894d0c64f18271e845e98b63769b7bfc3be6db73d5366da889ce6a9dd9451a9a1619f61a6dab786965dec6959dd7e52d14e9fbde9b14a8587def9d86733db6ae8b9db33ce0f53ed3bebedee3dbc93a65b8625c434410acda9e514ddaf6273be8f8f610f6b4737225843bede55fd1f0f6c1ed8636a4f02f46cc895463a3ab75fa3ba89550a637cf83cb2613d425bad167c2c05181de6c8df5b068e6beeb3413d0a2f9b1abf69d3bfcf3293c984d2fe3df84cd779886182178e87182654717df2e69a3f263c9c9e63fa391f42211c1168fb9a2d68fcb993c3c1390560ce7f433dce8f2800e764b9fd44a78db3f93ddf5b11f8d7fb59e3439750c2d642073980efb13c73b8c4471c40d721d20edf1f8378d5c3f747215ef1f0fd9188573f7c7f2ce2950fffe4fba3d15b61e07b28fedc168a43fc747751d44540b8fdd00b5ec5a2260216bc8a493bbe1f2271101ddf0fbf70901cdfb1359f28361efdcd4152dfefbd00087cd3e0f87eeead947cbfeaad74f825dfb693f25eca0c47bdf14aeace3fa92d83a7a935be473dbd8e8ac3a3aa8de751e92fa9cde573d424bf43ed27be87da34781e6a13fd0fb587de87da33f858dfd5943c519969d0443d54996750996580434dc2a5eabc9b1d6474a8aa53a534474b88b9f0210f9621bbb41ef5868f1506279cf82c877a436d27361c15c92ba9cdc4eb501b064f536bf81d3502bfa4f60b3e47b5e177a81d83efa176138f19a08584e2520c9a88800d6398944e464215f56ee4d780840918bc40875552b52a2b0ec5b4587ddc2cd3622d002601ad0e49c032042af38fceafec2015669c29585a97e6334d8b35869b6d5b5cf0b1deb4608b0b5af043ed25de87da41af440e94bb4b04295183052bf85809a085052bd0f2436d15bc0fb553f0b10e2007149cb95d44ca4105294041ac026082aa433007d40d4dab43126092839d434c2caa0ee5606d6c6e5c4a2273630dc0cd68b4582dcda16d157b54e5f1b1d66be31c8f8fdfe3b31b1b911e3c783c6f4478d444ed331b1b118dc75683ed513b663ab61c72f86ba3c70e0d472df24a6a9be075a89de5692a0dafa31ef91dd5c82fa95d82d7ea5003fd56873a8947d5a13ec16340df2389e7d12738111599944c639c888a8a8a8e18391161455898c660a3531727a213d18908eb02a8ce24fa043414691374962e410efbc2cd505aac0088b526d6d4cd525aac3dae568798603d688d162b0f003cd48d75c7cd60d062d58146ac39d08895e66656fba13612ef43ed233e561cf7498d5fded093c7400f1f9ec70f8f6d75c88747d5a11f7e870e9f1d7e9efce0037d42481cf153990fd0452564e8e20a12d04514e020593b58e6033ca94dc463a0b6cfc77ae36a7508038faa434f1ec3c0f378f23c541f1edea788c9224177811505912fe25951c422aca849507db05dc4ff50db081eea6b8d87ea2c1e6ab3883471252473bb88644417d14418f1a0f9509b04cf4385acf843e412854c4a263430255a2dac08034f687028d161898d86a33ae095d49ed7a162799a3ae477d407fc0eb547f03dd41ee263b571e30c5803aa0ecb7a2b7589bdf20ca839ec7d25b55b330c71400f962b3d821e628607b06eb78638a007cb9506fc926ae57354060840c35157afa456791dea079ea6eafc8eba80dfa18ae07ba821784c08bd31a7eab041de03758915e21350735805bc920a02118440c802822800043aab2a1f1042042110b280200a0081ceaaca0784c0727e49f5c0e7a809780c8b03d070d41fafa44e791d6a104f5355bfa3caf03b549eefa176e063ad014407ec3b5a7558043c107589e5c0e3d41cf600afa452e1e90010191070002aaa1f5382e0004f0780c88080035051fd981204070cf04b2a109fa3e21040c35109f04a6af73a540d3c4de57e472dc0ef5037f03d54291febe96a75488747d521259f55ac08f3b2f9906850ec3bac082edd2e22f150a3d0bb1940d56163f80cd42516ca0ba0e6b037afa446e108d069004a0f9a0d48f161e3ca2f400c37513802741a8032805f5233f039aa007ad0d0ca69382a0cafa456e075a814789afabfa306e077a817f858b7bbd521258faa434ebe47e551b54a253ecfb4c15aefc631a177e3d8100c4a58ab158b5a4550e97611a907f93cd41f2a3ff93e3cf972e563407ef642d561ed37a94bec041e003587adafa45a002b6abd555c127aabf8830df12a26c137fe30c0804251baa385b5ba13d1f5cf2e6053e507c056ac6829891fec0758111a4b4b1670f2305480021380a7f8435c477de197d4269fa30200ab4aaa76a3c5aabd1e3cea56877a900146904066bb6e3bdad6af51125f7c41e4cf36ddd5bacdccb6d32ec720e77abe9bce7ab3d11f9be055447a371db1e038c56d241adc7ed9c539f9457e9160fa19f5cb30b248f64b23296584458d3427a548b7d9caa1eba5d05b5d567627816e9391593ce76f7bf972bb78e6762473fb8a41718be7c026dceee6f2773717f5eceff5c64f59cd937204ba5a46c4fb5e1b83baef75563a65f848088cfb6cee6b21a1346ea78a494d14713b21f74528f472bc081bbceb76fd3d887fd71f852251e412893ca7899cf348e41cf7a2d08b449ec3f7688a2ef39a01f5db1707f17ff0898cdfc674ce8773fdef25fc94b445ba48228d1b5f4748d1333aea42745b0506bdcd4a3eb065a49539eab22423ac468c70a69d885bdfe5cf98718af47dedec43d77f4dd13f0fcaa0b104b594b9f223120a92aee92f08a1e96166d29ebd2ef9d9dc8848db3733d52941dc877f6d36644eb623f1a5455a8113b753fa0ad1f7bdcf2e47728e0715b4f3251fe3395d94f9bee44ae020f2a7d4908ffdac59ed3b9150b0744d2fe59bf8ce1f21fa4ef93cb6dff7f07657eeb30e8673fe3cb4a0ec5c47732f264d38c823c08ddf1120c29dc7542295783b567a166e69d07e2f830145d125639b6bfa79bdf76c67aac17bd7bb30ec9bbb1ac36c62534e9e40973e6b92364d2e2430dccb46275e3522a3959ad190211d07e11c10a81bc5f4552acf46c30cd9358b5471eec278925cd77c29a87bfd109f0f67bde28c97859ca4e662b56333940e99c1c8bb9853471a08d48d027f2302e103b95e859ef3ee83f0c1f71ed4e85b6596d2eb4d292603d89a5a1533c99d2f471aa95243ec9782eaee8635b75989c9fb4951ff26d36b26386b0f91b5b7d8f0a5a06e438824deb635a82ae8ff5f46bc32a8bac309937bd94e3e977adf739f93d732ac696e648de437fe3438e0b7e97ab64913a26783beeb5f1256badd48627cd048a767e3d1d3e9f4ff5639fe44f4d9e99dde1342d4481bd25be9f88df3f8cc5293ed503a7fa37dded6065a1e96df0dca68eeb0ed3ef0410e1ee8031cae6d91345fa51dcf85efafbe4d83f6ce5141ffcea95dd76bd7958455d4bb792ad2780fb91b38381f2acfd9be6f547e37d049dbf8d6b991bb82c6e864da2548bfc633d56ab0d64040a70d687b57bdbe8ac4de460dbaf05ff7663be8543b1d9335994caff21c21e28d72d1b7aa32dfeac69bbe4df57d6ff0df0d2e5ea800c90d2e5ea4a0ca5b99beb6cd7bdbdbb66dfb57a738e09d3b0df18d485bf8dbbff7de7b5beda638b935feb4a91eb41d9cf277b39d935bc3764e6e14f8eaa97372b7bf3a743385a1efe435aef77a7d0359935f55c28fdc0d3b44c80fa87fa773230b3060c080815af610be776998f69e76cd0b4e613e8649d3cb961d3722b3e714a017b38939e7bce075cd26aa206517ba99d3b092a4c71b7982a6e2f7dcd411dbf596982af22e7c26ce5971ae63d1e5ad48c74add6fc473def7d710dddda69040b729ff9eebb6eb9b3ad2f55c6e2150b79d8d4dbf16060d570f41fb916492ac0103a19ffdaca8ceca46a1e868119aad6ad73f4debebb3eb3d0c5e4f427a339ab711c1a0e75ccfd85f6fc2ace986be4c52661e4b30df1ff267a64ae337ef256f3ca916f05e90c378220c28aefc773dff1412fff8d146e9f7e71fc2e4eb27aadb0ada17c221f9e0b5047b9364481b107f46ca36db880c691608f6d8fb33795b0ed89bb0cf78cb21b3d836a459207ee30fad342b9bc104d408cd82769c94e4adb2f767d203865a825993e58d324effd2e5570aced00204209bfe1a48ecb499e69f34ed7bd332db413617ab405a800014e7a4f43fdad47c99c212cea0ddbc50a840bb0622d3405ac8a0ee19cfe240415a8000b4f564814a0505dab1914f4b078aca890a0814321333454cca6f938cb67fa60f1bc1a7e3d75f17075d40bb6eb596076f16cf0192d15ef7d9fe699f1e74cb814c7de9e019ad386e2ba3f29ce97e3d574453f07b2e13e7381f4e726438de6dbcb7aa12f43a6c8eea4bd5c570ce2f0eeb555067dab5df361b7f82366e34511084df44d1c60d18df86edbc0cf6439e445d5a8982b6dab918d75feb1a890aac5460ed34ef742eeb3c9dbe6e3bfa3d670c613c3104540c613c11c63bb795a1433b2e1568fe045fe9c89adb3919277a2b27f17dc93997d6bf38e7605c0c5fedb05e83a2e9fccbab02ed9ccc9730d7cfb48f77ecd142dbd1380a45a973b134b7f3202fe34f48a2feec6e7432f29794648b1097eca7b3b44f7b61f2ef49dbf9279982b618e75e526c24319e23c53871eea5da274baa835a888b737dbdd25cde88f4fb1e6fc7638c1e5d7a8bb9afff9deba2944d4ae70a016f14d7714eb677b784efd25d46f1ae6edfcb08a58c32466755ff90f764082be8047d2fe6f6d32b409e3049504bd314547ebfb4a923f165b4edd3ad2a8c54430761df45edc573be349836ea308dd462ac68d64ab7b4cd34bb65dbc7b969bafa0bcdc52a2bbdd59c94a250ff1ca75219a9c18b641184fdee6d53fd3df7c8fbfe17055a20aa2cb38b7e2893264fa0480982c7870f950d596e3f74d2040cca4a3e7d7a925606a526945f523edb8e5641fbf68641be18754d35ca7bd835a5c9f9e9abec8d6e566dfcc6b74b055473973242e79e1532064287bcb975a819c59f6c87da344986ccdfab52e94be79bd364a9f4fd9697943685e44a9b92df73a5edfa42711bd1521ebc92e237dd01eef3f7dd0d9bb9efbb7a1fc53678880df802edbb7ed3179a9adf73a7109090d0cd5c9b357564fef69bedb60f027e7c20e0c78f1b919b75ddafbbe76fefb7cda68af0e529dd051af86e0fb7227e37fb68e01b450afc090491386978579b9fc9daf5cbd72a151e183fcceddb778b28bc5cbe7c6dea08f48d88e639effa67a7ebb1ae27c3aa5fcd733a2c43782b0b5d4f85350a7cffebf263f5bd8ee74ad1aee965757f4f1df1bfde2ddb14922b0a3b27f99a329bba9e59367ed3a9ebe1bdec0b81762ad585628d26615eb41041cb5f219e937adff7fb0c3a6b6c8082dbb6f34153432f3716322ad0df4411d18e938c763c47a3516adff11c2a4dc5b093273c220ca0db46612eb33333d75c7fa66e83f2f76850171568879aa85963d211d2e900b1d9885c45501b8ef361f3342877a7f19a9a47d1568da4db4f5b6f55a34c8b8ea11d2d738516b7abb15423a98611053275e982887f8811317ecca01dbd5f946ea77a6a86164237bd9304215c82323ef169870e638cd76503286ef7ee656c0163c718db2f29ed55c66d3bada0dddd0d217cb19b4a43f86243f8623784f1bdf9a65c010cc8d45c9a3242aeff0bc142a9e6b29d6528ff99ef0249427fc8b61372f96bf480762a0cc3302137fe157fc21c137c3a9ed36cbbd386695886613a2e1f5591058699e625ab469da341d538c7a79650384306aeaf7febb80a883f19de04136498bb3b0465b42bd058a544a01c978fb060c2edbe8c11848aa230c6fb8e99d9ea38d74f428176aafb638c408ba277e2f6ba2edbf947ab724ec7a547772ad06ec2f9942002c707c2c59faa195fc773a27bfc6955cee900b96c072333ac538bc17fc3d9855b5bbafbaf93fbd751284aa30e101d9e785955759cfb212ec4368b2f16a01032d325ab2199d5dff1c518e16316f38db79453e4400a51c8ba0af415b3f84c15cfb142e4c5878c9656905097db7f4109c5733a951351e5ada09039a349413b269301c6a901edf88c5213aa58c980e442494a4905101946170cb85cc1841959b22863832cca70c20c201b5d9819c2bbfcbae425fd3207bb1ec8330ccdf9a6e0c196197411f4450b1962a4fce70b40480aa416cb6d92eb4d0f5b2d9e9f9f2c5fc2686971f969a2223039edc36a96a9d26e2bf457b122050a1332cce2ed896a67bb7c540512b763231f2aaee36e1214c2739df8fddceb7eeef58b3e1ec7236e628a269334c95875b4f95650c8bc17827f402befcef74e453ecfbc4e9e3cebe4df7603bc52087fceef647a939369bb9e77d9662e3e22f83c08bff90784f2231509dfdf252f699971607c9b433b84d91d3b6443e9784ebf10cff9ebc58b3ba3e0f0a34befe747507fccc567124170e1f52e0c8ec0186ffcc73f640862d4dc5fbaa5e2cf33ef639cf8504acdddad334efc7725f2e5952f938b2593af79c253941d21bcbc618174cb2831460bd48aa6c0833180ccb905bea3960d8410ca187b4888dff8730c68e4fa9deb77ce47bf5bce47cd44d1c08804284518601c99e13338e74ddcdddddddd7fc7279d1d2319b197e580bccd125aab7ed96110ddddddddddddfd2f09a48646830df9a69f3b2bf73de7b904a42e35a6f4d3e0b7dfdf2f3333333333f30e338eff0ccecfcccccca8cb47566481b9b985e0115947d19b0dad45eb69bd1d81afd58230ca8f5398b9dd6b74966183ac684e1613e79a08635cf30dc9759b386782262eb44324a042e88c2bc8094b17019777b00432ee9c94a250ff1c333fbf8a935cdf598cc4f496d9a58bbe84991a9d28fa0dd40d74d906da58405be9fa76db3e970da265458ae7fc8de276ac6466e95222cc164961b2c8a2c4e4ddf4a42c7e5f03137756725672567a76062aaa20830b2131170197b9100acaaeac9934f9d1f22489cd3839d3adce92d3713b3def942ad7a758b93e8373fd2a959190397d7829733b149c56a042de62e67b5d97bc24ac7c55401e64e63a5a9ba169e95603db89ae24cef94e124e4ac2c47378ce0692d20e6141bc15f63a1c44bebf0278d543744be7aa789cf3e939a9fed3cfed4e3ff75509a25bfeb355836a416be39cf727813049da392945a1fee575556e097a35a1afb4dd3a6141e3cd78836f92b54b72e510bf2c274575a355a94c5f7cfc9dec929fba6c11bf1714291dd45c78da2788fe69a0de72fb2fe9c4733ad593a1e98469a5f84d43d142e3c72a84dbf0e33d9326feef4221fc4e795d48e388b7ee94d78ce358ae7f2379b6997bcfc4df3bc929ef46cba4490f13cf7976687e7f13cf715b8391b79a56e7dd20a98014c92fce304b218926d26b05d2bdbee3a5eb310ab49b971d9a3f2dc7653a1c64bbfe4288f44fb76c403b5e72b2c4a71bd0f9a66febf1afbf7c23e2c37574fcb7ab530695b7d34972a3ed925c55cb24578a4ac56d413b4e12656c8303fa3eb7fb2d7eb65c045cde6288a2cb9b4b817633045f74f141d1303472b4ccfc3624f1e5f551dad705ed26172a9e8dd3f7de7befbdf7de7bef9f8e11aa8576dc7d76e8faf73e3ce7b2f3d138f75a08d9cfe5a31f98b9978f7e50847b048599cb47508cb93cb87c0445d05b51ae79c20d89c6ecdb0dd70d9ed3c36d5d3c2e1ed1eb7628ab938347a5a0ef5c435f4d4ba5e577933d213acecdd805dd505d885bc07c4c64a4c0854d9664e25065080be1beefb0333d840bb4e333dd44f21cf8cfc7179d77d3ff52d6eb39153d33df8db3301280414649262d2129193da317c45bc97f3fe4aa50decd5382e7743ce6090769c6799784b2bacc90469009b4e33352e83e225ed26a506343023fca2845628494bc147d495a1af3043046446784b874112a2af2525404a648b66299eb11fb5416c1006159867d44e2d2d77518c5a4084614c3575c85a5d885cbcb4c9816cf728f6650e6668fcda26903353f0ae636faa74c359ee3f1b9b7f2f1a5212fd79f755cff5ff9683338014fa1cc9099eb4f4d582cc1f587507b5b0de3c89f991dd21ec31cd36c14925d86fc6abf793e82398d5f9ce34b733b96b9d208c297271a14dea60ff56ee81528bf1b28efa6dfc6b97678ea7a6edfae41960ad38307526c4599143dc4c42d70af525581049417786995410618ad312ea04d507ebefc88db3f7500a60b582832230a455bb2383203c5135820018cffe490441233609bedbed47b39494d88b95dd35f2218cf71236e7fdf9e1ee431c8df74dd460cf294733fecdbab1590f684bf0dc49b3073bb9ad79b0d7e03a688c1ec69bef549e31a0dabe07fcc143e0821843e02c833f25086e2208ee2202e73e6330d8a79b00268b8ef5bdb2c8a7122b49d81fb68988ba8f73452eed36810f74d9ec851c68ef28f0a4900c3c4edfec9008c09ae00d33a83839fdbfd4d41963d3127a5d0761042f810c27eefcdd41267f9fbedaedc21b7fc6e1c4b3becc1cfc852bc07e0a0c54737c812032d6e60c41347a0503e5b391981beb7c2834412462cff1f44d8418b9559a18c110b5e5d40a8ba10fe0e9fc1c58c11cb59b232cba808f01aa16174f403337ab0050aaed042fa0fadb9fe5690e5cf431cf532b882098c934ac085153a38f3458923a8a8e2f4848cc92891c6991f2f9060a208405408e160b9bb9dee41d99c8106505041128ca43084c47a4938e1c1282fd4bcece3aeabaeeb5c67a3242def67d8a6d0f27ccacbbab4dda490cd3033263eb11cdf4f5e50f89d14d4956fc673dec7f7249f14e54456221914cf71a307453a81a202fae4592862e8db3849a65ca47fc2ac8d17ff8909e3ab664537923aa03c7ce8fbce8d6ebcbef32425c6893f69fc530f2864a5db5f6e7c4fca7cc9c76c1fdfcb780ea655d3cbcad7a1731de6c625a87d41e7a414d5bd93b782acf850b2405f119605184561f84646c55b5755f9ced637eaade43ff6995f5aa03ea6f93eefafa0de4ada14fff56f056d8ae7ef986c8a5fbedd79368583fcf929b63bf2676a27fef5f1af1e16f6b44b0bf46d3934ebfae7fd4e297e9ebe29ed77de9b7efbbeb3a6f8af4491fd15d3bfbf12c56677e0cfbff2def4574db14d691607d3bfdf31b132bb331ffe1568536c51ce61ffacf9272b688a95caae5f62facb5e8962e7fdfc2bf04dbf64fef597bdf27e3eb3b0eb87388651d5eb22e3e7e2065d6eb7562b1b4aa051f8bb753b7e0773fbf6103d97ebcf64c98f75c75b2c2c9d10f0c64f1d69a11bedb31d96bb4359b28b9f3a82dd68a7d47826c255ddaea7d5ad2b6fb4687fdfdea6fc14ba9435ecf61e42ed10328ebccc38f2af4bc616e3c8d79cebb1f48410376b7ee65a347a2bd3cfef6dc764e7ec1866ed626841188c60307a395a8c737d8ed6bd1a3b75425ccc88712ecc68b65a465c9e39a973712e3d41e6f6cbea574c8fed981eb36c837a37f1676a4e239e136ffc1ac0dcf8493c67bbf1ab788e8fafe28ee7f011972d373e47462273a32771f1e2765ce6c6169724dc8ed3b891754955fc187322156ef413dc0ec88d26b8cd85dbd5bca93e1ad45bbd8f6f03b49901c3e77d056228be141e7387780849978fc01873972e1f8581843b842caedfa31f6cf941d1ed8d49f7e02d16db167cfeee022bda16b4a9252c68ad449103b3ae60e1312cdbe231acfe4ec263e81586004633f75ebb37433b8373fc52ba1d7379b3628c276c614543af20d0ee55dacf9641472157dab38e535f716dc5b99e1d34e7162430b878b9dd42fd53c6d63e73148ad2a09ff9cd5c9ca67fda9c0ff90734cd392d15ecfa6e4d13966576cabbd70ff16e75cb3993d5aae637fdf087be9ff115e0fadff00f1f3b977ccf33ef0de3c4b0e4ba61ce1fe7ba92ebbdf72cc7387e7377b8f099f36e3189f59bd8c0874241b7431ad4b6d7d1d188c8e6559955a39b691555b8f3a2c1c5996b9a7eabc9b20ccb30efad52e6e06b958639f85945710d73f0bd3e73f04d55e3c99039083b29f73d2b379e4e3694620b9e8e773b11bd3ac608af772a578c505e3142795dd76563845c85e7eed3dd83e69c33cea899349ecb84097199b60e5c73ce0f5c87b30a34fd7b1f2698447777777777774fe90b3308fdc8d9773c4763cedf9f6f7c8891f8cc9c3f73cc79174411f6242c89e37c30790204e9bea77a4f8cfb30314f890b2d9735413bcc0833c2c23c882569f1de0d433fcfba9ea72f10ef5e5588dfbc18df7b526809a5bc2e1510210efbbafd917fcc2721a4029f67dec838fd9cbf84363e09218416324e3f17217cf3dffb98308e8151c6cab761901fbcf7de7befbdf7de7bcfddfd6d98732f6273a758b9dd704e34fcbdf7de7b1df4de7b1921e783bb7cd50eaa0da4e5a7b340e85bf0f7aeb762bee9369dba2a774a156f8d0b86114209a310c7227bff8391f4e5f95cf085991e978fac38413b8124c6154920a39de8d17197d3b840bbd9aceb278764ea5809ab906ff826feac347c13ffaa1adfa06ec773e78517da29407c7044ac7c74b804ab98c5af06e7bcc9fbb37c13854869872e192d10d55b5dd688d339ef9213fcd1b99b17f042ffe85e405f46d113d04703cd02be7ff437ca99991b8c9ef73bef3db456acf42835d0922bbce40a3712638c9134274571567e7eb27c09a385cb0f1051111825a09f9f9f9fffc2fd645ad0ae5b3f2d1f9e20deeab24e749a30928e7ce208fa378deb4eb843f0c29b5b1962641a51149dd10afc6859aaf7fe2db450fb3322c529b6291ce2cb5ff21eda2b57a2d881ff6c8a9f59f2afbc8f36c576e87a66c567967b4555b6ccf079119860c2e48e240673c7904cef1786a4c29886ce2fb14cfcf19cbef05d401f920d5a97bb8ce4e5889b3deda2027fcfe5eb9988f14b1118ae890ce3f46346f18b0dbc841b55f2bd767d7b70f15af722d2038976aabbd1105bf7fab81579c144c30bd764e112e3f41779e14e0bb17f75087becb18a89f19baef34e0ce98a02ede217a488d4ff1c756b2415656c337dbabbbbbbbbbbfb7cdeee5af48783127051c5ef67f256d7f712ede6ed614d49440fabf6b05238c8bf7e47fe65ad44f1de4aca9f593bf0a3b562536e290bf52e2cd04e75051aaa25da71ae84c7dd4d1a54f3dc28fc52b40bff8a5de4624639f7fc06194b4229e39bf39a9a13325c3ad4f4fc5b2c1d61f1a5afebbab84b3281fef571bdcd50763dd7eb626677beaeefa4bcc33a3fab3eec9f3984d7e5261b85df947d766d4498afc953da47627a7ed904fad78a1ad03819f406d307a168a8c4cdf644390a159a110000000000b314000020100a05c462b16844a289c1ba0314000d80984a76589a88b324c861148590320410000030004004648666241b05e8867416985005c033236dabf73ca0a07a7bb54425016e1689120c3026fe0fa0437bd3d85637ac4d6e83b15ab798c154050517a230f2e98bc988aad370b0e202b1df70fadc7cc48e5bbdc465473b614cdfb3b5da0023bbabd424b42931e3e4aa4258aec408c1831b12606db331755ec562af72c7532e4da4b93a786b0994f627aa17cc493107d25c826ac31683d65b24aff119e4c8adf9c1a73afa2d0fcdf007d5435bf4a3a8dc78c26b6f614e9929fa574557476ab9c7c6325063a02898c8ad506fdc4d2f619671e7c4e179de0f38491a773ee09fcdae1de8fbf8d3e3cc070a4de3bf8269b4a7e17b7f45d5eb95c9c5c6a17c1004645feba845c95094daff16fda8127f8e5f715436144ae9072448f1f4680cb568dc785e49ac30ebe87300784959583331cff52b593e06c812bb85633e3e4ea8c576252bde7a335d38e6cb9b5c21f91ac8c8fb5ef4a22b1fb65dd131541f9a5daf0cd7c350c1f0d28569cd0408952ad08fd913fcf67ea82cb367d847e251e99b1181084cf3e3cfaf685ad56ab3afa97a43c87ffc8540f25c315194578491c18b9606e4e61c67034d89fd338096e5930a6b87cc95a38d319704904d122fb268e3c79b0487c8180e602e9d5c2dc9533943643eff54bab0e4de1bc563cf7df25f1c88c9aea7e33dc101bc42eca22e6b7537b80786ab08d127046979db23ec707a6954a5143f9460db75e8c4c37cc45aac805e99c7068e7317d689bd454fe80b36738a58b94fa11985dd86a3b4bfc36e894907d259ad1e88b5d1dc9e49c8425b21ac10ce2d9777ae12d86bebde8703cd0f612d1bf6acdca32414d423afe6a602390fc8ee2fd0284db09a70406eb32e62acc8c761ccf1542484822df0512987aa1118222dd6f40c878dd68b3626f2642f4324f1d0814c914d6d6e66a83911a396dbd5dc0275005b042e843d32589c7224134d904c54137f606fec202f5c41dca22403ba3a18aae405efdd1090aa4e6f50662e61460b2b5a4a18f6f8830d80dd53c44539cfd0d8b0b4dfa39eb06ffe3f0d1592b5ce2c3ca5039684a890a224077ab584f01ce1b70a4939adff9b0420d1adb17643c2488fd9e93022c12a9248a9e3b171ea2835a70eb28d046de133efd5881875799896111225cbb2c2c4118feb9bfd7551059d8cf7789a104e519fe259c7a1d422519516e1d0f2b87a64f1ecf523cb5dbb8c0f4eea1f85a1cc93a6db89663983df937852ff26746030f55a7f3d07d77c7fc6ddd8b1edb6d495f29b0351571fd71a580a1b95ede6d07aa4c109d2bf43669b6a7b8046158e840281cfd95ba959b77c06b1337421f975687d8ec30247d59d4e9e9024387d74d81f07ba8ec31542fc0c173fdefbe87d944ccc0de723e10d90febcb0e6b8100baad93d3cb8471d9d5c1f0274aa316b35a7ef12accd4b3027bdf38fce4ff5d7aa962e2032c5d0efcfd14f78b55e0b51cefba0071c35fcb0d41f04f2bfe801b8baa43d12da85af3cd08f4d117eeb5d03a77dd27a0cf742d95fcc6051db958b175a151bae3729421c0448a125a005e593a80c61f47c8eba74b46864ba06eedf384003cf188da071165a590c54499b1543ed72cd1d687c85086604b662bef71044307403e9f06db4499a063275d1928cc50b4c6f5b841c4b24a3a01285879a37bf4b367babd3bef680133778d5c77b8131bd020975ef8909e1d35381814db475a89703d725c936cc73523fbac45c62b1bc9508f8a005957021d0ba86861747f11e287b7d70b00c85e6442c2c717a46668f227ae6f95e643087e1f6e938d60ef1ef855ce4c09e01da5016f7819ecb57f347c8bc2cc1ce19a401c281d3b686d4d039905cace59d5fbe54284a6fd6a1de33bd455690e06056146cc2965a7d70b9ed25d43c191528a04032907d74313c031cc8834d2c9d27909ff1de55582395683cbfd315ddb02b0d9f1b716b2e62bf7ed479b30f5e8501f306c802108ddc042993d0d2e69913e2d35f636851c1dbabb2dcc466a0435df2855ab28674d1368661a728762c7ae79ffa2bf72f5784af456fff3d0310bfaf3ca19fc82645f8ffbe5201bf7b07cfad46b5143e0ea1b6e25a426d2800345a7ceb6fa60c77fcf46863665a120b8075c44eef53a2ccbf7b0040ae8390e365edc94d20cf2d7e5148ba834efc0685bca90f7262771bec30b22e63d066be2bf1b13b6d4e142896b453bc457140e70660366176dd0a0033ac160ad5018cb33483c79d39725c4758cce6f4b0a167bee77b97a7be7fb17d93c4344c0aafae3b01b54998b36b04e385e97a72054905a2112f0d880aeecc02a6e5b0ebf0b4ee2444c051d6174def3c9aca53b3e021e064535d363dc99b011d9086a19f36b2bba42ddaddd4215a1e0b0f3f3dfa6127719c3cac0e7d6f0b114b1f09682184ae9a9c9fe935fb984287fb6b00a59946ca56e0e0438ffa9ecc091601377113916b9c7e1926e011bbce5a9c23c0730a286b1001112f139dbe6f8f0c09624abd12202553b7e5fd79f4a126ca84b827e733d730a8adcc29e032b0ff00492f59764bcea85bc00b9006ecd9d6c8c47752b454f0b11b450fa47cff4d0084f3a87c8a94f55e8cb1d97e1713f56b879bd3aafe5d5e9cf02eed16e81aa439342a750c8dec957cca3798ed5dfc642fdf80289ecd41ab078b13dfd68132d0534e8b661ebfc7e8a9bd72b4899cdfeba45441e544b98cfff1884e04fef696b1eed24aa19118fd2ba2f715b1161f10a039dc8021c98327fe51501011fbb6e4de45d7a66fbad0127e8c6a5f412221628bc3da4947814b5946a427f17d00053bfb47f37d8efa1e8a8bfffc3bb0e6cb1e93fe02dd4f1b71869c9181efd3840f8469ec0e6ec367f19b487803beac13cd58ce9d9bcd7dec3e84bbd6a934771c632d740dbb80514e6a5e736c7f5cef532678c10a23548df4c6579780d548f049a11d6682b0cec442bf57ccc255f7502444e793135de809d4b8489e3a8b927fc0f52f6d18f05d9c7cab9102a8944c10ef44d32e21b8a9a1f90b93bb27ccb672e9ec46ef359750c0f43b72c9b630b902ac401357ae528b1830d91dc08a83c875e51c3352f274c8397718809022c8c862dba1978d0a84d3cffcf6740596a2bd63248fae800dcf316302b928dcd5eae7a25a7e945bbbc76cb90e0caee490219033be32c623f791b52dc8bf61f520100a3062bb9c49f8e31f1054ad8c5d11a7131a15973ca14a61de261e11cb21e59c23b236842741ab54eab5d283aa6a17da3e022710724ef5d8666ba2d38715ec135aa475299d70b3c5aa59fff4c2b4b9d6cbe7f5ffffe8f4320d83fbbdffaf47a18a452828b01f5e30551f08a72746c445a94e0a9dea689ec8bb7a1ff7be0829adf32784ae170b64e97951a58c00dd46227de0b52fc02128dd36978e959964c4072cc239c409d0b88a449c63d8eef0196a9440debf0a4b7278411783c0151941a1b6336eb055913b30ad11c615692cb65a00d504a93f0174d3a6081e1d1011d68f562c50f2ed784679ab27821b9f3e95bbee3bda84c2ff0cd9cf85e783b3964c688aa6f9c88731ff489489d078fd3051ab4d9f74bb005a3630929e69082892de9f280b15cd1352d9038e280372dc8bd0d4cf13588fc45c0f351cb4e1a0f7579b9e9beff91b507de83efebdc33238592cfe2996bc95134c20da309154e47d06eeee4706283835990e4dceaa434110a3995e213b22026092b240515fe1c1344b960600c0e92aa2deac1ea15172019a4e39c481bb6f98d2ba1d584bed44e914c7f2e8dc80bc50fe2dad03c33063ae6eee4545a90f1cc090cc49eeb129d7a15dd1703de8c704485abf139afc9cf7022974f476f1e80e22c519a182d343ec2f2becb97db6e8066c8a067a1d96e446931461c216717a81a17a256715375b2017ef998bba1b44e7ac7b7587b074e0751edc2b734d9b5f27a9744e0644f843cf34e20c2e92dccb637cd1d513dd43f8563814995e9efd824cda59bdf4b3a3860aa8d0dd212f9d3883b1c3291ac98fcfbb1ab4139cae062a0f5273c34d457e7f539f221226143c358c89984cd34443ba23aef2ea176db71174a0d7cf641e2692132d017415c310884dcd850cf248e042f6659cf964cac2cbcb3ddee85dbeeb6b4fd418a8feb6088a5382b90df466a181df2bf46a4040e685c793611da392e803f5fae7cf32e3b4b5a82d29ebe6c45ae57234d3f455bfc177e8e343421e68fdc06fcafb296683710936d932b47d2b77253890f06005504860874394104bd9448ec8e824adc51f92c20ee05721025ebc2e81e93bd7fb4702d94c5440a7fdb6830ca6d1634b6c2540a2a7c14ca548eb16910039508cab07d0752bb6edecd613565747b40bd5abdceae3e5d6d2377fbc016136109b39c6a5e78edd7c53dc2f242425d784c78206cf2ffedd0ed36f08f02381e15eef6fded6339e5fbd680d6d6a4864469edfcb16920e7ef81c3aa430d2aac8e35fd3d0fd6356cad56ba7e0032117ae536ac2b2eb010db3a100913615ff089cecb103a399116584396361e15360a5c836c177c837bdbe7dfa9e272fd627c0790c8708f6e90f82669a6c136d4186ac319aef60118a70522a45f4ed46d3c81208e521a5ad94ce5c451cf0a0b22a79edb63259470ec01a62ee41c9288953efa4438722cb39db32485e88f78b4f2467e5b843d2d0edf506d2c49209ce365f0ad27e62735e0fa09147f991f6570a8453d993f74b16285a17838a38baa58b26c076dfa121e2c0206dd99d755f80b63c775c0de2bfb0b873504fa9a6766ee773258d5ce5a0070b037511c4d713dda0696858eb6e6d0f2d88791040fa284f12bbfb0d213212ed1093bb96f294552e03de0bc73da9b5ebabca496db889f47c700891c18eba3468d9637782a9ac20944e4456055a745518bc1f71fa2283b12c950619c42d9bbe1c20304c08312c8f6269d3d9ece930d232e7c4a3811881a99ffc42bdcd6f1dd547c85bb7662cfc9c8e1ab907461a71c15e9ee5547c8bc52f917f9b60bd1d2976c71f1084c70fcef7509e2f8d35640380f08939e5d32c281f74ece1aa68ed3c293e4bf86bc0624195bb405ed14bed8cec3f9a1a04695f31ba86387343adc4494283868f54ae9aeffa9fd0225cc711cd19900e622cac7a80827ca8d60e7f45392eddd6f2040dcc39871830109f07c0c3a281f4840b8c4fc5e1a4f9392a208932f87f73b7dc2a863d96f32fe01450c0641ad6f4c991d0e4756e9da75c50cc1cbb784783766ca31d1fcc7463f407d9ccb4bdbfa4e5ebd8fa67fb45736bcfd799d33995ca9eac62a0701f2805edfa9e127da21ad30d59a530858f74e02661ecbb2cb4f1f41a50c4ba2dae80bb8990dff363938bead282acc07bcc5c5009908caa989fb32c8ecdc11d00dfbfb6e5fd49fcf5d251242af0ded9c69c99a6fabcfcee884f10b2dfcf9babbe82df42ec50256c6c7b44bbac19e909cea38c14cc7275f8d3270c3ad6f09b1721232e4a2a46664b0afb195f9cae4557914d842a620aeb282feda0cf2636ff60a89c9fada8b87f2aa7f2a1f840024ab4467977ec258f70416a4456a04a58d1e0b4492b8b36c6f9e4b9ba4942e0513e2b598cb41732bdb4224f88488987dd9dc1c8d8899319dd1ec358847631b3cf115d5604c80cb551393e19e4712b5d635774f946532f96625c114d504d55e42db373ed4a6f4a7a0fc220fd67888c91b064eef26b65b7cb8a4e0c0d0f8d642439f7f456171e568ee943765baf16b094bd8ae5142be3f1daa5c48ea75cad5daa585040160427151097baa84eec994859aa652c3d15a7e53fd74b4d243db6cdff35e58f53de8c1faa09ce4d750e78b46c6bb7b7076dc6b6819e17345bb5046ed052eacee65aef4b95b84110ab84d9bf92f4da05a4ba71bd7fa3c2424f3d486cf265ad8c4d124839abe5afe0a260ba6022f6653ff57489893dc8a64db22d6f190df8a910fd35087fb6ba6e36302e0ac1b616b3737f3e7b487fe16b8f8d2d97962dc741367f698530fdb7d427312b2052e80dfea9d69c00b8fbfb238b233e772019ed0790318ffe085956204c56153a341d80b61bdddbfb557ad9d0504927f90c591d9a5539041f3f65722d58b334c9c0925c848491d203b2b85136431733612d5260108319f0c2bdaa3af054398cf79c6b05bec515d5a67b145b865337cef85e7441bc59abe9bd000f4d8b3471eff0f44e9a5f9baaa9a3c8e3e233fef7c0ea621833f97100e9d33668df9754ec993d455f44e4f4aa2593db9dc27409ce7a606c082cba9904d5c2efe0471d436f2a9ca51b3c9cde55254bec0b9b02ddcf4431c12f7aa8280c0e0417fc6230d1d1c338efce28e11371c6c61f531bc8bd267b6addcbdab4126c2e6de06fddf2b43fb503676d0b55f9c2184b40a69b673f2b4cd3e974530c4f8d0078920a8c441cca7f474cd3dc6f81c29dffa776625331c30725861b64d7d21bfaf5fc480e54ca8da4eb12fdeefd0b2fd577d74c06876bc237a80e10359b264b5d11e420dee79871da6eba25d37d34154d8e1ba9d2536bfe5acd968a4a980e22cd6af1e545907c65c5b7ad5bcd2e7bd7cfb98b9d1cff5d6a8741f80f122ab0f960a959db23148b15906fc6e1a465c4fdc4bf3626e8e0448367721ab45e8fcbbebc0a8a248ce0906565688fd758a91b5fa984cc9f9f692a5b4a8afd5c4c25af7962583cfe795dea7e915de4d407505aae8a75280cc6ca64bfe7acc2d6eec3f55ed2e9314a06470d6716335332913d4af82772f2ebb5d1ca9c713573ae7bb9afc376ef7d638e5473843d34dbadbfb5be016cdbaa4eaaacb51ac0b04aa2cd16c0880710ec7a1922fde87dcffa284ec6c1c579f6ba629f8d36401eed63cda37c73809e9c8de47330a2f58bca93b91708c21090dbc3acbada6aed5d36a3d2190cda54ea93a2b91fe5d3c1c21187204f753e3c5604470362da365732fd86d8d99e629f72e081d27c7ba1c0d030dfb296b3cc69c3dbd3fcfdd3b5e69863eecfa878a5d01822b239c6920cfd512c278990ec20b944cfae0edb968b6608992ecfc062c5697b1aa97996b751c118fc9f2e9beda28f877d7e1030e3ff3f111c332328262abc4575e0063c6b18c6889ea456c916146eb5ed534b029b8234a5ddf4d2d60d8a9c7470bdc32d735182c250879d4389410be40fe2f5f06881d64c74dbcf57de9572f5765f4d3f0f02781588a6878f3f7efc110fee43cc88269afd8ccfb252d305dc80cdd45f08b435c77e4d5cb5ef07bf7f3a3a0a14d3d79801b16915e3da2d1f5da420c379accb963455744206e86a5aa3ea7899a10b76e4438b7d9da0f860237d57beeff03e48dfda004b86acbf75c6ce8899be6351dd2a2de9ba6b28160c7726c6c94a6e8920e63d22ae7c27c452d7e0f6c667dcc6681ebfbdbdfb8232cd17dd1b7c45a69027db0277184eaa1b979b9d86e755fc94edaa46d2106bb0cb0c918e83755fb7fd524e7813e56bebc2a890008519d0d2c08832a4c30d22e1a4f449dce30538102f991221aa0020d857ec1bea481f78db163c912697fe0948d2ea30bf413264269c1cadff14a06d5c42eb51d4e1c4c7f90c69a020ae9c26e7e0b5c4f172b206fa9af09164fa2d15746bcbdcceb358797a5893cda83ddfee2e05ff79732ae5308b92adedcc595f4704860e50a6cdeb51a23230499d633765f1cf8af87c5d941e7f2b4188f2c6203d15658e34fbd4d0f4d1809a76bbeb3647596246c27d43b47f36524ff079e51abc13e6eca46fd1a5bb7228e1812b97467ec1df479bfd9717707323b49ce7b30049f301e03a6a96a28cda54195fa369af3080553f3ad86020e642c8ca6ee360be0650da6c5d638e44979fc292b149b9319e9917b8ee0488998e4d29b5088832ae0e5111452d0b47174852ea76d50d9a7618ab411e8eb3b06f32f91bca72eaaf318335c5d4082bbbb3be3eb2d67c502d7e6693f6e53e6b58581f5145337080a529cb75c8a7d9cdbbb6813de505442c0d4c1ed6940c5cfbcabed7a172f825a6e9886cb6279709c60f4ee93ac49f8a65414afddc21498621ed0e0f904879528bad87cd0534aed430819ee74a4e42e4f22a889137b4d17546d14205881c6d4cf89e535f8e1969d5457a61ef49b1b1934e49e9a1405451207dec7169fcd672b183182027cd4e53d2022db34141bc8aac109ede0a3012f371984be9d6041f028a9712b834c8a6fab3628e8764b576774bd8cdbbe86c0d58f18f242c8afa2ae0c44076b4680202102d879006ffc88d7269271f28fc6d40cc4b1e6a55de0a5456d32b0a430d7451f8c4c2ab445c41330764b63675d4b1954ba7fee9347c2c8de8fad8fbdff87c9ca843615e1809a9a9067d0e51836b7b5e2935a3f68942aeb4f6ace2b9a63ce346424cca3a357dd7dc98b28a35453ee2abc0534cf878aae0daf491fe2a072fa2d5cb8ecc73c24e07bf48623e1523b292b8f8125a246bb42ed29d693802dd8268f63b9b7384735841521f00c81596a582aea9d2c3949710f948ac62b13323342e8b2049110e83c51a71d2adde8de951988b5e46da21a0051ce681da32a614344c6a8214585e872185dd9ce8aad29c156fdf18421c8295ecdc3143e426f8a9578f9da5804cfe38fa8c3fca86409dcefb45d0418bcd146582546aa91c30b0194902204eb87245a0028ec60da189c9ccbc2817b58d0267b60a523b66e6c8ac12ed445f3878537289903d355e49718bae48de76c3fe6d0797de22da34d0347f6a14f7b67a0deccb3bd225472292b8310990d09ceeb6aeb62640619a23a00146b8690df2bd1d081bb4eab32311bcec9d8811a668c32de122e9cdddd08e3c409ab0588d52bfc7f33190c15a70521b4e983c674a9f6d0dae66341022cde477f8712fc0a74ff0120384fa0ca5ae9cb0ef947f423e7e8cd0f0ac5590224d3794dc6705990e8e0c9336d7f8de1981b86c39918bd0da1222cbcc84f576b3511cf01c6a048f21349024c91966d94bc2cae99187a0f55611e7d0398ccffc6b23925a0b401860561fdbc3125fa854c0b6ba6bc830d86ae7dc593e5cabda3893e5d974efac2d3c73f44414a4a097f56d84ac1141eaa10825e97679242e90a8cdd347cb943efce8e57edfbb73c6903a11fab8843912e272707dfbd103628e15a0f8af8108202e430bcaab31618097ba80b11b5a7e33fd66c353f984af64d78d590d9dd3d57141ac5b499c2d68f6354aaad41b5f401218ab39a42911d035e388769c94d18b037945227c69845ed1b0e3650212d3718bbfc615625805afaf98694573b075521e70ac64bb77b8c45370c3d4d6e28b9f54f5d9ee94bc618ec795c0f54ca2af64e6a1acd745b8b0b3b426354fcbe72c755ec48d015f70e2c8ca1d4250369dab1845f8523f5cd1562569c7be8027d33ec87b83a88a586773079dc66a884dd210039cbe2c3adbbd814b20e175a5b40019c053f9bbf7d87ed084f4a962b630e2df43a64c3f2fc24234c22cf647b9381c3d5468c9b7da45601cd82da9b2308fbaf4817238691783286134c018652eebce203c501acb8c6d66b6e82a56a1ab163ff905f5e9c9e5baf3cea986064ee9eb94eba2e5922ac90f8f6f512cbd8577e3732dd2622da44767d31086150ed75ddbb5a9696f4b997c7ba2f22daf45d962032415918b9e353cf1b87f60ecd290c7a30c0416dd13931cccb485095059024b431778a4e4d1be0f6cc93e2d3b4c8350a57b85f799aeb70ef54acb30678655b1494a534b712064952a5eb10c738920f33f2c1b1b10218133c54167461dcb5d47d33e86352ee2c41c016c4e186a7855d9df102b52c3875fc0417c7865277b26474f48a9434494b84220e1b4c9d5de6989fd9c81f185e35517c451601aebc0380677fc1f0f2a600a9bffa39ef1e332136ae2f036ec45381cf3fcd4074f106b930be5e5e4ba8505494b30eddf8837b70fecdf8c9d9101862a8ce7c261054194c6dbe0d8a4430257fb1e94441f68dc03f1955b543b70eb8c106a78d60911488c662f2973c00512d271a0b4f7dfdc13f501efe586ae53da4ae841e9f25228dc46b5cca15a85157cc7a905b741ad11aa3153a06743006e42da52009fa707915b6834ca15522f289737ab984e0c20ecb6bf63688d4c9866f65f8fd75d53b7ed23e3be5b8a0bd66c2dec204f4735a25eee4a2a56245bd1d7659298e4d1611a9347824af786fc10fec74373a8278ba5d69c13ced920c82bd6fc8a61663261ef5725ab860d63638b6fd420fcf0a45632bf78b88c10d434eabbfc12d8b82eabda832ee8819165573e2c286652b4a1504cb1672de03b50ccfd09629ef88df08ce0d8fc83506dcb113be11c0f61d38a6955b55165f978e098ac145776332fb2f9fbe4155656c02465171a55bb09287226bce5beb2f731ffbd430c18dcf2327e30b4ccdba8730b012249aacbe01a10973febb2f68bc78845bc006e031cfffa0595f137fa5a515f3a1d57b5f71076ba0d3b02d6ba65fb0b3e9764a7a43984770245fcd74f086e70c0a0b97380f72b4cd05e4f7f6a43a080324b4f2720b61cd927b7c2bc98607f4a377453e5d13fdd9daa23bfd8cacd15ddbc0018abf5b539a5e1d325f3ee5f4e1adab3a684e88ca1a0f179be11d28ce2284b119425b12f93a84dc65e1b265ce3f96d644fd56ab466373724869813f6d4cf326242d5886842c07d1a4ba8291ea1bb5fd77cb72db7dc158dcec7e20c9724ac0118883eaaed96a42906ddebdf790a48a1ba0120c4199d6dd829c244cd57335cbbb3fc85c901a797c69bac7c220232d56fa77e02504686ebdae49a580340bfc27febbf125e19c4ea0a51a9fab1232ebd86c23e55d370de42244dc78c8af53624adc708724183a66041c1fd278b99726ba81e21ae403bb4957018246e5641b1435229e4fac5df9661f4c93aa435d28e9c7ab609de4ff856700e81b56adbd358a70214b2baa0d9b24f0a8588824afa992356fdaefe5c473dd347604d32cbb96a90acb717bc51059cb99b94578d89100826b4d130861eecf72f0beb5a6d4bb970dba4072d2240468854f266f11dce48c19485f8841f62a86575eed6cd92d4fad74d2fe024f501175ddc43a0071bd78dfe8d1b38734ae61b069d8da69335a7317037f7f403127054d7e9bd2758dc17fd5942149aa5c0692f01231dc1dc240aded34f1f8b39432fd3fa55effd1426eb9c4d8584973ccedf648fe4645a64890b9a2de285ce11e428d00321c9774765c059bc41e7ecad8522f4e34e8d91e9e06a857f7e10265ddb2003ced4f98b430e0565784623bcc719331d4a245b62260ca8045b0ec6601791ce9efa4f46a0fdf74024264ba809c8db343b8b5909911c2b68480102bbd88aadf80772b434bf5f81e963b7f7b555e8da08efaccd0f64861d544722edfc7e9172731372840c5915fc28bc9bcbe59a521d909a77549114aecce3f6bb7d57d27b1d508689929dd343bb1fb359f1aadf193d4cc11c376b650c61ebcd7833ed5865238381224d18068c655d0ea6a27077a3acb4ae030e5cbe3724131a9308bdc036c99dd4183375cafd29548db74f9f5075096255d381ad88879950f8c79a616612d216660d0b4f0d623081f6fa742bd543873d2282c80c6cc38875ac4989cad2b07ae09f7a9f139b67a565f69ba218ecc44a03c5fa2915e38a203a1152283fb2a6f19b31b3227922a363e2c2643434a6db43a9b86ef3aed04cdfa543ffd63862d9725cde6e80eab5a901fed002ce104bcb9ca6b3ec9394eec45f34790821c213e58d97017ea840b2a688046a3e35971f05d3171892990266189141eb0338ee5ac658815f8640382f51875c51b540a5299a181d0df71b7a524496f87ea0e2b9c08e5a0cba89894d7783c49f3dc2aee478f0f3d40944b8e670ce4e5d98579ebece0de47020de3d11fb7bf13ce8089cf378355378b9091d24a19547edc83c87b421fc00b6828a40f7ba22914e2d10fc12840bfa340a504a258aa57a48ee62d38f35b367234e0e60a6e83f76ecfd1a128cceeabccfc0bc6773c0a1e80b306142669eb1704d0bca753da2755ae737a1c7a41475396df63dc15848d965e74a48e362490b1e283f20560c949a4f0133cc9f48ba9ef6f1c827863911d616a3cb22a8dc11c5ab64ee6ac818cae732e43b12a75e8d206c23c73cdf0317b1d6ceede8c208af574fed8150b7ff0ecc1da48d88475aaaa3b188915f4e0ea5f3e6f1cabf8e11b175ab1560106649e5658472f90ef756acff5eb0bbf6c08994db3b15db6db28f460254c4d8801e01329a8641328cdbb8871e81319d4a3c106f9b5903bb3ab3bfaa2bbb980d06b78c25b21e4374d38cee6f49c3dc2999770d8b9c4499e9ba77010bbf2ec204c9622c9c7386299b3a73dca6056ed636b20aec4a5a9db13ce464c90e7099e3d11136710d78e6176153d416e465376fc4d7ab715a81bd43d910d9941c1fd6d4bba63023f699fe0ab5c42b6d0d61bbab61e9651d7dc3f7d17395891a7f25207ac4b7fda0684490195f110d2a82004166fb5106ad7e87b0835cdaf4a42d80ee68fcae3dc25a72e0d71e0a277a7937528edd29a2c1a4a6d7a3d088d36d1aea99e98f5f0e20e864d7b49b1681ad22d3ebb114e0808b00c2fdf8447c0980c1983023bcf18415d79c6ddf5e2cfa9238e5ecdbd92e976008be7d399e9aa65e0136a80052e0b3a77c9cba16b810c7a8fc0762d18a1c21382c18cfd83a1510aa04ee21a3887288425702d210a664b090a25d5fa3b4019e1d18c18ee6a62ab752a3c0c3b2ff9f6c0e096b44c7254e6525661d30192087973299a4936413a71e07c157082f154977bfab9dad1994121d6a01c769ef2f2dc94619619cded3746815222e168e8cd48ed8bb024a8d66e036a38399b03140536b4fffab11a1135ffc6fb9437b185b6472cdde623317638de28abcd96365301d3e35a27b54704f32b26d42e1e417ffe9207e7d6cab12f1d7de26d2d662fd51b2badcb10c32619381b18131fa3a4b6befa3615086b7a799d94a6c8b19c330cd073b1adcb7f3181cfca98adf5d6f47b83fd3815f9b0acd08772c97e169299c879c9b1ebfc4547c5c49e217716073af074cac9c9ac7ad8ee5dd9d8dcd99c5b4930b6d97b086095e89d4240bcc2dea70eb064fd83da0a65c1bcbe8debedea59ac3f23800d3c26323c1118d403e4d182da2e5760d9942bd881315383d8b3ccc8214be757882886149f0c3760f330c4868106fc796e55f6d21583bec1008792b3027648e9fd1e6c5d9450f2dce39adbea572c0a4af86bf2575432b808d629101a32e48829dce32550778295449c4823e4a6c522473320534c044aa00d455651187e068ab17eb088ac14288c6060827aa382ff1c98e1d1011914734bbc2b6feb62b0224d1717f8340973cbe1f50ebca49815ee2804ef71552a9e48c940f65519f8f79214c3877e96d5639f7619deb6d3c53c15db6dfe1fe5f8c282f3fe79ae93b16d9ce9f190e7c1ec36608d99a5457f0e8b4844ba96d9ac8152fa484c11e70107a9598ec1daf0c7e88bdc6d83f721a34aabdb92a9565089a03332ba19c46ee48a9ab7849685f3a086d6aa70ed01930f7ab759773884c20bac95ab2d6127807325a513d26d282b9d5530629f1e2d105a06f085df0d17a84521bd6c02280d9b68002e9e6a8f79bd72cd08f1cd1d441203461cbfd7a358e4defe8482da8d9b124a6ecb1b34947437286459a9252d881b3c6a3f36cbb997555407e505991e249cf1d77d1d88ef4a6dfa2baec72b3ce5bc28a0b9e0f8b6bc2da725f685545159404b7d73ca89ada28deb495b36de3ff13c34bd3747b99c24f9e39661c1d6514969df1220beec5bc5b74a1a1a010a8d685b6d30d0822721cb0adfe802adc15b96557360a57a5e4b58e60e6fb96e3a3c7624c89d569ca3c19ae808cce68753e7ad6e46a8f0b2bfb7a87368c7f86b6aba62d170c213af80a2792290942681431e8de6118b2b560a6ba5b667b46293dfcf6b28bc1ad5d09053a32944cde41918ffcc1653c3074cd33143d62def39ed03bf5917c7474d146e332d1e4f2a2b6b088cd0913251d26449e86785795bab348d469164f92768da6f4a7633c19eac2409e63f8e7f18131f9954bf6ce0cd87ba89f8abf8a675adc292e18287fa86000d5af219e4c2eb7909ce762d786e02f3ef2ee46937ac9ffc839f9c686c448cc310d438a4381d8442f2985df348e00cff531b9510a5d3d1856456c3a54d4e2124bd95b4dd89c554d377e61bd4eb688c5596d19983df035f03af821cda534fbe9eb8f950598e2b7df20192c358459ac4cc9e4d043e87b7806c8034712604b2261fbdc8b6ab8a028ab07f5d2e07fda59589e13cf6c00eeceb66c5858de1eed0a54605cada8cf745b814a30985c5d1fee7878c4fd9a03548f1bbef52a136a84ff5753693af590f5771dc582d1635ca5b44d4990ee2556e20ebd9e40b56301c62bb4c93f13fc41746897e3cd8c7df039742256274ba3bfd3a3b4c5510c906840a0596643b31bf9eea2fddeb9a3dc3d497638cb51855217fc430e20866d08036ca321ba044891aa4899031d327d063218bef21862e63135bc5c4ed421a060ad221db0905ba2f473cbd200fac2a40bd57e4950113275d48f734f923b10d1b281f2293802a5cb6100b9830b01b6a8bcda46910d4b7d7d068f29a9311e628e8a264161312e8d01cd2017646e4a4c77747baaf13f5209acba0d01f10526bb5f5b179f1713353082a5accf8c3cea7b1e2a4fc95b4990cea6fb20b1b58648dfad71bab72e8c8f1046110abfac7e520137dcc881f6d4d117862eca8c88eb43388266620a0732ac3f0e71c47f444f4d1edf579c9b1146807aee577362dcb36e00b6bf5d4de9c600efd13646e5bce707a63a2aaac507acc5baf6373ca2a0bc2a7d14cab67a3ac4df004d3ff565c7f81b69a60e9d132469a6440b4e2195ebc46d18a0d36f5f3e87204a349c44b0fa099c9045e9ba940b2adb09b8b3e4f9e2ac96e1b8b94f0e46739aad49f144af71ef365ad426db0e98aeeb507720ea2a06c9ea43e50a2a7d33ade6da15a04235a8452c2ce8f869beb9cf541e4958a9df854462aaf3049633025c69bd1c9e751faaa590008ba476dfb516f24602780130c11240e701377dfc0fcdb41a15aea75cd7e88720c844640365bab4b585f08a45bb2f9e99c862918a90cb0a2f2c9bcb16469f55c89f6c6b13410708f0ed175e2b0d22527bba5983e2b63f03c923a581ba75d08ba1a45a08d9242e1b39a6aefee23987edfa435b6bb915ad7906ff2fbbb1447c4b55031950442cc26b3842030687f1691a0fcf441b3a4e844c28d1d181907dd4f20de091ac5e45e2b2acdaaf07ce36ef71b1b0d01fdbc8b50df75a606a4724be20d669a696909a83da617f09e2140e605a4a8f750698043fad26eac354acb0e89afd6baf1ab5938fa3ab1b291c062d30691b183eb7633a1a1862e904668cf97b291672516cb6a2ff5a9d4f9e7d7547971573ae70b4676dc83eaa16f0eeb9368a2661461087fa9de8c35daae769bc0c9932c4e430f843d18a9e861b044c3e6eb6224be78de803da9558d6d86a45320a65fd64e9a96cfb0e44ca50b8ad729e35561bec4adc44054f605fed468587f97d403cf312de9095219797e2ef86b5e9de74bbf3d926ee6624b19fda24423a0b5182182b9bcb0a85b8ef7ae9d040b8518dceaf63ab02dc796bb0fa74093fdb61aa97282a9f55cd354cd18f51d17077585987c9148d3a7deb79342f3de5ea13aa55ecfb62052711ee0cd2fd0c5212ed52a5feec62c0c634805616dc0bfea15d91e87696ceb526e7fc89949f17fed3dcda95a1c22caa92a2d9156d6228abbade1b84bb063ae0269b8b9f6ec7b9c6d040074ed812a6b5c021f16d7564e8ad218431cf7f3e02e4aad384bed13bbb83d65eed12cd84139dfe9e19c487407460508d62fb343f596681818f227b3492620ba90adebbfb7e055a340e80e5b0ceee717db03c00a4bdb1551d0b53392f06e119d34771f867bd475c9e26d782ce3eac17a8fb999051e4591b956294f0fc5c02e9ec0830cce0736afa2e3806274ff0080f1a594e21dc03769c5df4ba51773232f76eb4fbdcb1d62cb23f4bae1c9ae56fc3b85e0cd416d07607daeb7f72301a4431c8bbe607d2eedbe0233052953b6d57f4c29b535b92f52ab8ff4e8fafd29349793f756780121e6f8f8f0ab9f4c969e23e0c5b37448abfc3a512345a5256ff041f2214f398b25ae08a8a5b4058b2803470054b204525e61b12b7f8586bffdb4326c75198784daa293db213527578086ad82c590be697305fca1fa44dfb65ce0af219714dd332517fe4f17ba759b5f0d770893151da5fe63fd7262d1d2bc15f2da873699ddf8262a06b580a214709adc9725f142a7ac358ec1deb590808495d3a22697e95eadd4a9b9b1a64ce269783af9c0139eaf6209c9c321c175d0de312a2c6ee9457c649890b5b5da8db8b2292ee90263f667058bb5544b5747d080605a973a3a095b5899c6ab96c503af4ffae60eba8dc37afa4d1b48f4e2ab7760b5facfc71dbfdf1fa83142de407f6dbf17ed02f761768fcbc9c5d643a1f1c47a0776698de76be5a59512ea32b631291dc4dd9e8047d1fd1701ef33010f9b79ebe05f5dbf750f0fbd89471c3a1c9de9a18238ae33aab2b1da7a01a1c7e41c798fc673a7f612a5a79add5da8d24d625f573cb08958c946cf38743b69a63281573fca6e119844c54ba3263e2ee6bdb6eedbe7f2897dcbda3e8af72d4d7750decd20bf2a6cc470e50e5bf1e6d14d6a7f0268313458dee8d9e2ad7d1c64bdf2cb0e2f816454877139c68d2bfce08a8e38de782aa432deae6f0166914edd1db2cf4bfa150cf2eec02cf4c3af254c1c28cdd7464b98aa7498f7cbed71682b7b8029b1755c6eb035495577d3d65184cb503592ecf9f91c053f909c49145b1aef95b1ca01f322562df8d68e793c0e7c19adc7a8c76398d953e9960bc2efcad21760619ba44315b3c3a61e16d01bd64919ed0ee110a66d2753b7b29b2177b9db16515592b444cd70205f6f858fe4db5ca238b4ab3776759a74638e60875288fbda843ed5d52ed43a7c8de94b4f20e0ad9dcd047ac9ac379c911df8a67d4566dc23e90182890dbbab6dc27d0e4eb0214c6e920165d2425d13ca86b901461d2b725add3e67f0e880ea55b231c808d9795d06c3a9052da02e2c82bc21ef2a4117b04c6ca98ffe07f53308a9b325f14fc821d0ec09da4d561a382711bb8c7dfa026e15e47693f930cd71b37fb1d6f3f838febdfa6dbc1e0657b38238806fd04b70dcc590c20ddf6ae76b0441d0c46c362db9cbca227c0067215605e6cc64a56bf11d3a9de9a2b801cb79b72aed9638405a1404b48ed0c4c682af7841c9ea3a421baf8fb0f3d955ef5e704d1a20429a4ffe019d345d932e7b04ea287cb38ba80100004a04338f395acc8b5d4c5e6f6e8f9ad8cac6c47b25568f6305ebfa3d36bfc75a28edb5cb4ebc577094fc96c9b46358061acd4323776dd0f40133e3ca1ad1d34fda716a4dcc0b518c8a9951ed1c9804766749d5c90ab818a507436468c3a6fd13e967811baa13758923944436ade3c27681483c6c1c8ddc9cd9c4da1a36599d43e60ac63a5ad5b3a9e57579951aad6f28ebf559f8770f8758ef5d1a7cb17e52e77b570287fe6580467ab19fb70e8d75a81621b876800b8e031fe81c84892f45c268c7e2ebb3155778dfceb2450ef7c41a4c302060bb38edb8c6472388fd2187493244c2536945bcd1d84b351f4afd8ea08a5def1d049b0b603a098b266bb9cc8f8d5b51c92d7cb98ab51c0f593d62d13a54d031eb2067886f8a0468bcc7a094236ccd917de6cee1508512d85045c0d03861ffe46aae66ea7c240b1ff2166d9f57b406b18026cc4916362cc5d3ccee61f6e8929e0d3810d6e23bb992051d3516197d13ab529aa2017e9a2eb80c7a30a0f0ee8db65608cf94a07df01755c0736a81866c8d40ee88dcbb63d30c72c26a498ae3e7628c118b3294b63b44ea6222d725639f76037fbd9ebf9481c9d26287c618249a1d0a8fda8e68b258d256250a9d15029d17ec2ea346043c49642b68d8732156c5f4124fe97599cb9482e043ac172d568d1a0009a675a32795a0ac171c2374ae066405d24a1cc27b5d431350ca8a3625c416c5972525f46112e4ba08da698640768ef4da4fb6bb3e13169a22162642f3040d8dc027a0f0f019e8a3696ef3a885ac20243be1d4ec12285dd746d677d712264d338c690226fec0dd57bf8e86af1546e7837a90dcffe7ea81c24e1b9810e1d9f880f4c48e3a9eb3b760833dc08be0d8f20074feeebab2af678ccdab4fa0c82b57dce32f9d5a40bce5e968600a57e7c2378a8f0b4d40974fd4124d27b24f449102a0d2728347d33ad3ba41db7d9b2a066fa00e99aa0b84cd42e73ffaa32a12029e05da7fe04cf286a2129fcd7c461a6bbd28f9a28c7a11ba1316a3d8a0246ccb1333426d0c6c71318fdd3d12f1c5fda933cf50dc81c0ca7df0c239a2e0b8664969e615a3c7b60b7ef45dfa0d9f1570f3b9f01be833552e770dce8261c357d63d49eebc1e6a9b6ada83761688c04b83e2e6d791dc4cd6341d3a4c4d24399783b1271570932097a4b891204319af8a383eb4ac4a435b7da783f87e83ebd838802806129587aa7e0caa00872c9752739f79ce74e0224c0d3353ac38d0101c852871a588bd7893a570ae137447658fc59ad059ed3a18e71bd364a2222ac9e90bb2285fa5a2463e66cc39f651519c47a2253c6ea772afcad7266dfa88a9c9eb33cf4e9597f0a9ee72ab9a8eef1644cf818023add36e95004026a9d74fffba9a0c23929ee531c7779da58a3fe0954828d55672504cf56551ac42b7e1cd4759aa29ca1bd9d9113b162000bd09949b3a1920f148d40d553a4483239b14d13f97f973cb195752a8fe556d4f55f22d864e8d163ad1688ab932b8890d27ea23489c69c32972f83077653c1b768963636c04dfc6691904894fa8c2993e665ac2e664faf9e9cdc930c3ae4c06f7391eb42d09dbbd9f7cea6fadc4e354d6197be8b92f6e5c96ebc5506ac223965e9ac2d3b11e7b63dcf762f6e952206eaab2bc51f856e28f6bc36e109c18b4fc531ba0e2b4a999c2d61ccfdf4df42f7abc8be4df96e27cd86ad8013cc596e3d23bfcb9458c942a3b399507f3cf8cbf75f2d532b52bc3328d07fcd405b2ce2f67205be3871da2c6cc38d009ea0ee626a4d0f65b8be84df5079a451c05925a9b8b23230a195ea0031bf776cd075642469d3ea7985826f4a8edb68979927b9388081cb9d8106b0d003998638d4099704d46543239130dd818a407e771dc0171158140882d7741681f063d3d1910e5803d6716e41a3465ccd317915fd8046babe80afd2b5bf041cd2602cdeaae17636472d855e103e0b0b4da807bcdc7dcf1f8f0a4acae13410a41c02a1cf81365c9bf19ed20e2cec7fc88f965cb4a137309c716a55266e835c534e2416d05e3d15f3a74874b5758a3f78fd351e8c0286b23e6859821c3ce52dc393cf26bdf2797176857866de93dfa565b693a8b9b22df70da3938afa05ca07a977769609b8e96ba8228dca8a85881593506edb1d23e5b2f8ee06686a9b3041367b26b76868c76e748a9049fd6ffe7fee8a17293d83a94cb903c1b08990d2f59c01a7834203d5c230ec8830aaada4cc0628735cfd649af645f3d7858d046b91b54685b23a7361e78e575709f0094f9e78f9073de018b04c35fb1bd7c4288e2135746ff1b1d10ee74ba531bb14989880883020cfd9c45634c1648992f412ba8fcd2486382c7fb4f1b3f4aafb1e83b00462bdad391b8fa112884ff4063593d486141d3d89e894ed2706afaa2dce31093e0e8a3011cfce346cc54a10963d9dc8924bcdd19cf16205c48b28f13ec394e2dd7db534af3c2cf03d18e1a753be5a3b581c4f1ed364f82752d3d6909297313add7542793a8ac743480c85b4e889d723912fa3b722919685d929e1c2a6f897c9db6391d4534c30b346e64f4c6cbc6590405eed8055fb7fffd5edd418c459cb52e01e7d4f2a14d9a2a6bc008421cdceea9c0836b4e0918aefd2a1542135c847d060fd5acdca3460aaadfb890288b079cab49c5194e4f95843a07337733536e60507858c8b33167884f0e2aa3ccc5b6433a9f61a1633f24f6b0b96a4899710a20992d6d1482e3a742523d650e5b7c5e355321890cf71e0338524695dfdc172cf30240cd2b452353325500d076c164319196f86e763eba9c57c4087b473a811f3b5e099856f24344e5547cc126a66d3a45a555b385a8be9de87afaa42ed76ff97653c1d45272ca9cfc44b28952648801a06e853c3f849347182084614e213a0100d18d24fe8c6805e877c23c1b7208b2f840260da6b52472ed2c0d46e8d42b3168437049dd95040beb401ed2c9858353a980523fea835418c9129ef87b40381ddc7c7a2ce4ac4068077b9121aa7967cc39d0e93b1dea247e166c20de15a2dc5fc0703c28c3a89d90e0364de47f4b5ddcfa3713d54555c79fc87f27da0ec3f4d55834aef2e0abc892334f61b4995df1cc5308b9321546af77f2a3d431a4359912a1e58bdf1b22e0974f57ef5d207ce10ddb57faaa16f46f5d09aca0609b41dd548123fa430a1f64bb8d683c8a9f5704d81f7542f40fa79f1531f5ffcfc9bd1c781f5ba1500b61b286baf56b8c16084e4d13e5324ac127379321cb987836416ce2a56405b4c9be98739c2aa4aec5af69c91be498c89e0584aad4f6f9b9570b8aa8df1710035648c6c7b4ae86ab6c9fb60bb2e7a3854a6547f636ba1c6d8f4fdd03f26833b9dfdcc9f6460198ee335d9b88c49958f1614db6befd361878f80224733e396634fb1f2d18e02905bbb37c8758a4ad6d8bade58c6e818130a2a73d96a696ee4859a9f1d3962bfa29f06774338e12d3df7d338e73c1994ce1a6e237e725e8989a09e46d0220161496d2b55f4048b44165786ef0bf101dd9c9ce43df4aa34644be25faba32c5dd8f710aefb000f811a03f910a82110e14b17ab35a2ed781d5d00569180b4222ef7c918e80918f610316a0d521252aeb6449bb134ceb2658ca28f6255de98e6b55f83e2f9e7490a17308c6608cbc70ffd9ca08cbf346f277a143e430412248cdbeb83f4a08ea020402a0f59e6229d08490be73127232b636a30f54d89254d8336b2191b0a49d177062be61f605d764f2e0ba2ecb5af2b57d48d7d06fadc838004e17b71532cbb382675b75095a2bf5a2ea8443678da86a279af6c32365613a8fbb54e17b6b2d9567a763fbab2d03cc240ec04292d7524edb4078e41e2aed91caaca614eb7758578a7e46f11fed13642160f2d682e081c59ada62b679666e14941c745c5d4fd0facea75bb724efc3914219b23a3ccc06a9a2712759ef9263c5d8b7868a0d8562e7cf04068ff579840964c12036b6594396d293c0cc01655f59585355c6010e023d5eb76c31f72d86cb6c140ad401689a86fc225ebfa18898025f29502a9bd41be3d0abd37a757075c090fe5908ca36b1839d8918fbb3d1e1af3eeba9522d84f0f02b31e07719f62514af6584272b63664cda6a4dd6e97ce7012ebb191a8a9bba122ab495f5992ef2175de6c5ebcd5ba10311d2890a96f40208ae0abbdbcdc6307c426d675bf830aea8454cf531f38be148032d897ab1621bf12f174d96d9748615eb805d43abfb1aa459f0f3a0a0e191fab80d76a2802f56eb4ba02b717330bbf9a03b4376cca4b6acf213619542199c692e427ac4b202171217aa15c777c27735210c68963ca9e8f625187c9d60b773df5b0c5cd8dc73dae3f660701c6ac3fc9a38c4aac8ea37f10ed7a6b73219e3da427a5ea2ad762bf51d202595f08ed00523789fb14305ee7fe1ec7904cb89c1ed07fa230988072d5ffb91e80982c0fe82da9dbf635212a3527a437b7fb70cc9b6dfaff624e61eca726506c5a8b7e0f73f9326eb56055ff71253c1fc6922ebb93986c0a6280f2e38929cb6d871d5d9428f187e32d3652ed807adb266baa2cff5d03d03e84715c790361cf50c8e14da2f33716efb9d9036b0b5883d981a2f313989620a9f915a5143a162b2d02009432c9b92392747b96c3d5dd9f01cb9c0d35f7ece90fe5fa975b6ba8abef42258da2782fb19cbd6c65d593c862b5acf5ca934f012192bd978f3e396ed7114792105fe5e9d07c10a1b66c8a2e2a6a14f31528067c5268f86b5a0aead28e4b8fe7b758a18b668c00fd078705e897900f0971ea1d7c96f9cc720feb7f1d23b71c2ecf3d6161ec91377697aeaf061951e80f51789883599d4e314781c0e94a73b39855f419984eacc569204742557bb4c7c9f82c6a59afca9903a76ddb6950c2cc96971011b73ba67c239bcbdc5eeaa37be0a418816415547486e4882e2440e50fa1844fec8de6cdb04a1e086363a4450e22d4735523a2681c4b2458c164918d6fe0cf3a3394e5f92f609a07423855f005cf401dcb393b71c8ee8561af9398b32066fcc852f075879488b008dd1ccae3b07a92a7c871776caf4f8601c2ba5f2505002ba9e5274c2701509c3b5ce5ab777cd389d735c2a1d977eaf4d3cdfaed65b8e0595bb040e4bc3af48e138ae2dac26ee5c3afee165b705c5e2ae3f82ea5c24dd9bb712c57bc0a9cbec7a905cc2be949f76bfb9d24ac80c7d23381f46f6c9b17419ce15231ced5341ba041d31405c46811c4e92edfa285a342e28b9f21c3d8e9ce11c90b5ecaf7e9b9066e0c89b0d451bb724f4690fe67322d19f1b0e9cda82b19267b719ab5d3def7e9419d16026bba65f7115da32057e6ea1023995169974ea617f15ea4261c6ed105e01caedf60d05c408d5bb7284b987f7331bfb43bdd12f84bc2561c778d5b3f0a3fa0611bf004eae58c349f39a19c007d8084a140cfdd395a24293b7512fb12122ae8fa2196345532aefc8f6e3161efd6d4b7b8034e2ffcda3a37ffda6c09c7a15dc5f4aeb9497918e5347ca29a3ecd04faf2056b6d6f737540f690bd051bb0e3aa29c192578aefeceaa58284d3a1904a300552c9702d8338d2640f15ed6900a3aa2e356bf14cd752044b5be41c06f88801fad3aa603e509e2a0dd35fcc4f45e782f09dd67c73bf904f2c20800e9433ec04607ef83318da50ec85be74a561d535bb0a6f08c319d798313e0087ae1e660bcf7b8fd74146c16e200022216350692e7725e7cd0783e5e8db4ac8ace04da5180f335d74d398aa7c21ab33be38e012113e71ab0bcc61c959cf1c7a9e6bce82606e2e33a816173e1badaef571148c2d1a30e4d9c36d1acfd5150996464eadd450e593d9bccccf31ddc2bf524bb596323620dfe7f4fbe903ce8fe5d9d1decb4dc1bf59e728add4ce2f85823ee1969de4c83abce0affbac4a4823e1a8e1933753a98a2d9c30fa8d95979148110ca4616dd8ef68fd56c6a0ea3a478e2f74a3df592cee7087d14a00c9e071d4710677cae044f5ec92b13046a4b0a2249fba300428e87ec1ae6abe8f0ab7aa459343cc8404031478859788db5377bdf652c7bff0d554606a09bd5fdf6fb60ba52f49c1de0eab3311c031f03f547cd5dafd6bf8815ed648ee68cf77aefa4ac9ddfd13dc8c569f8f3bbaaa656e4420c5a702df66da1cfe3f4bcfeab9c9a9a418fa636ce7058d5b70fa745d0b5f4c503960ca10431a75339d01ca23c0452e9fb2f37df32d5d16c56da9dcca1ea5af775099c42dd970ce4cbe3cc9bc4e818be2cee97ca3e2dcd0901dfc84091023f3b02d3ada64e7e099a6a3bef77d4656ab59974be56086c210147c65fc3d9a44200b69bb0da90c53499f5aaa1641e6a4ec38e78424b988ef134c57a627b8f537298a4068f9458c83657ef6952760790f6bdf7386387026b6fcd25474131baa84147a17fc2cb73394e6a462d9021a88b83685c91f9191b4bee341692acc5e827ee1130f31fdf90dd4ec293f953bcbe936415330b7c32ddf358bfbce14484870797bde1c99f24029240c18f18f929dc3b9160f984da0c713e1bad7e5cac5edc4a5d3735358729b85278b785befdbdfc5a208fc838c5519c01f6870594bea17dd59cf6947f1e026df9b2d4537efecc3edc1824a980133f30136ad3b1b6fef61f7050f395a13e1d112cadfeebfcedf2917f4f78747772a51333a305d1b78e0461c752b3ef1b2034f554840a67c39a34a7810bcfed22cb14520301e6d3364bb14e202710adec22826a61d2cc58785d70dfe80e2c87ed0f26b22dc74c57828358c2aa61f86ea85a0d11cbeb38fc8557ebe584089d3b5a9e68692f7c7ab9c89958dbf6a92adb18e9a5b443157ab3ee577ae5e9660490d1ae56af341146510e54f5a9efc646610ceef22bf161759bf11805906b460351b15e720dd9247b167ccea9ff44c52745867f2d1dec9e0cac36706d19d5ba07140aafc9fc99760cb5714e57eda3e71f910f0c5a814fdeb5d4e833abfac7e82dad32713f7941820bbd86e6b5b9de115dd44e78fbe126225ff0ee6fc37d6185ed304dd3f0e2e482db513de060f264f6ec9a23a6df63a0f51c8bda8cbf9ef4ed3c64d5afe1f6d40d6ee06753cbe09d892cdf66e29f76a47188d652ef6fd481c14540ee7c3f8137c2054d23e3994006127efc7f3a95614df42608322b0163cbb5a06e28bfd32aa302a2f451f84347960b96ce828d20671e759439a4e8b9dddc826672e8e86c96a3cfb97449b63396839606e61f116226f02fe4debd51a14891115dc8e9ae15dff5d13e54d7ed97aa46f911e5b58c3b358877aec5f2e7fa64ef05efc10e3568a9932d9f8b24783f55ee6fff46658c549efd4dfceb0cd0961e530a81f52c7d2a4cced13145a0956a4702245a05b1f9b7348c7cff48ff5e2699f3bfcf9878808cdeab75e2c95cd5ae793c690398a2d1b78245f6b4f14b62ab43637aa26fbf5deffb1779d8755f524c912607df6179ef9314f8f5cccc1623917213e6e2c4780c8f8882605802932716006c1e159d25bfbbc872c23918e08f2c8d98e8840431964e77d2b0ce23b465b4f939ab5a24807958ad2c8459fe04784577de5dabdf85ee05ae869f5f52ff67822a3a29dda914a4547b9e3bfdef366218628298c49d41cece9fefdfd87299b89510e4af2d6db94d610570bf7ac9d67dbf6f8cae4f3ab1468aa74448b7ab71be08c53b0607914d3c3e1faa6608e1a61d435700805d3f4b91a837e4a8f14b95fcfee6b0c1ceda9c256eb0d9ecb17ee83e4279c080f9b5b241c652fae0d98d8fab03e4816d7b8da1feb0f27b8702c595319b448b4dcb17e2814d84fe739efc6131d7764e01239dd9ca4bc4d1d787af64eef8ef9e86b486e1f8f1cdcfc28083143c6d74773edc8153760d18376873a3d897fee276261fdfe4d703673d93123d3f2dc6b3717bdcf9edd67e24b5234731b1850b4e980c7d4b13142669efecd3da8112e0cb9ae951f4026e0c21bbc76a6cec2383ca236614596db1d1f42f3f9109f631afe001575e6e1ed99054c8a145a3fe2c186469d9aaa9ed53cba04ac9f15920db2cc381f4fcdc6754ee5022c4149f9499a7828a0872823987d4979ae5fb09f8a1565f9ce6965c791fc926285b995638414e532df416918b73207312427f11c90f6b0c4ab689aff7887d7045579bf4b64add0d1d44f7b836276005dafd6d97bdc5b23a54e89ad3f9fd9f3a3d1645d317a546f595ceff6bd2a6933b9555ce08d8627cfa904d10f4c7ac00e6a329a66cd10aab4a0e3b7999811773da3b38f4f84a82c77af8856d5dac77d7dec0abf161f21d3258ee4fa2d05d16141274664794babedcb391752531bcad77f88274e34cc07d8bd0a8e01ff196bc8cb361f0088150d51e2e336491e9b3529bdd9176f013fdf104c1ce801d6fbd19031c9f94a28b81bce041d99eac1fed4481ccd6e900ab7d157e9e921c4f4f99c0b9cc9e547276f4879f91f073599cdbc2b431d8f1b7124f949ca888cd0c54c5fb7b42af5af74df5e2de0917d7d18e26d0f5af51dea6eb2e2464f295be92ae820c9a0e53586109be5337d0f3767c86f6cbc220c256b802aaaacc757ff4aa3314ed57ce73425707c1c0e3723d27884c0fb4a023478d9fff0bf0840c838aadd09d115a35da765575402b9d039a8abe0ba75931c775f659291bb893b562f670dc48bc8921727dbd4767ca55a262046765503694cac94c8c62bd432ad1d7d6aaea0d9e8b32d3931250968e782e7728bca045b6a81dbbd18a39ac4f2a747384f817c9a9ba975ae5817a76a028b79d9fe7453d74b883233906dd01fb67dfcea4c0215fa28fb14cfbfd49f365b144779c74aed037146f45289eff7211a6af05d0feb024c4ab31bc84bd347f9b05a65b5cc37c7a31421077e9997c97c7f7f3e5c4575d6b4a05c6a5cf54bd1f55012e91d1e7242e2d430a54670473547dad97ac5a1aba67806b1c42f869d605220730ad8518e2ac3809bee5bb80c104b3e6dc2ab8c780ea59f9cec4bd3169944e9ddbed0994de700c24198793ea21287faa5b097d28c563853f53163307119453b99e5ea8460679942f7b0ceafa6f2986ba1abc87ac1c94ef961ee8d883e47fce6408393ebe67ea4d57462b9e6de2688f23c0c113f5c1e610ad7bde17b4b694bdc12b3c4270013b2ac60d260ac1a32d50675d5d4c1ba3813b95c26ed8ad3cf0201882109901448eb1e7e6b20ad2783cbe53ab0f91783b146fb0bc5f7995ea5a51b7a2ee205ac027cad6246ef5be805075a759e039e45e31fef16266edcb9cc270edc7f941f8c5e3fb480129464ad7ad63ec97ae83d11177d7f77f1bc360ade296dce432e5dcc15be68244fcdd664e2d3fdab7f95569a1050fa11e218bd17171e25cfcb4635a66b6ebe8281f311f621271ecabed36f5515886a8bdcb63dd3c7a3d2490fab301bbe8c5ad886ebd88c1fa99cbd474cb02ff86583d4cdd355e712311370b3fa29b80869239b043e98e00e53c27de4969f9794b56250fa456575b2b3d73109f1ad6da02803aeead351c8a009c3d26aefd0d8ab9f72de95fb8afa2c329ce3b49e29e9b3116f1675055b60ac525a1988069e12a00644456755f39bc672d99bf8c860bc3a65dc94bd7a16fac1db1e25b6a0b480a6d0b535df9fd27da8054c23dfa66e1b6a14f9a0c3989db42c759554bc30d63d65172f02e67dd9cf1e73ebe6e8024a85cfa317489d0844a619339a95d4e964ac191c4664890bd85be143a879f471b93ef93b24dba954bafd4420e62c9d432227d8100805611bc2094faf1e866c8aa88a8bdf73f2fc90171a252c2115a015b2f5df1929ca217f4bab3ba5c5e6e3b580749c5211240a8b5a3e079e8247f5e51bb59d76ab7ce9600a00aea0e1525ae8f11293908a174a656d34eddf40740043a2394b1c7b60a9834dbec832238036ae826d174cfe523021304e6590651faa3540b4b8b5dda1016aab4ab8774cff498cb0399e3abd132f86b0028dcead61d7340b9071366d0623b12152cdefe1f50d1cf2a8bfd0ad81b24195c382f7025f8a73fc46b227b29887e4b81625bfc3f1907b7656ef662f8763e579da99438cc8c2edab6e47954072428370dafd190523fd74d444c3d85f87d7a1ccfd1934c618ab9f78bab29afc4312c8c490a3364ab055f846a17d28b68961adc68b32272d964e04ce89fc2ae57b0425fd9e07e21818fb78ce70c2023f2d1e8e2c6c92934cb4472d6ae775935dbded7804fd6a6045b3642745208c459dded34f1de1305dd50c4aea9b1d2bf52a9ed1a1580b8b01e1e2b2a945b935693157d0e2f31207f36ac19a17f2ae391149af16874a990b6d492d7a40832642c3a12992b520e61b8a071029d18d1523621eef447bfbba33a86b47f27742c0d6d1b0b588dd9e8832ad7d94cae37de1a6b4a6662fc9aa65e1482b2e6ac75c76c05c8083e0021f17e44f88a77021c60cd8dfae30a699f9d4b950b53461502186e5dfa340b4160dc4396770844436d396043e5bad90fa8f86cd44c8296094f55b0281d3331a8544f341062a81802eb5aea56e37720a38de6b29ce7f89517099b9291012d0067c8f4f8936e71469cfd282796d203649e3f4207000261aab48b6df1a4356e8545e3098824b39cf97460acf0adecdcbda82ddad0a5f1373fd118770c7a64f21f3232a8407ebb48abe7f728f4117340a1ac15b8db92b84441a2bac138a30a881c0a84d78675fe9e4408c16b8d8c3a3d177726fa06d409d2d2e92a170fb578d16d20361b0e010009b8616377570b674bb3fe7af98c38bfb0e9012960a89fd3c3cd4f031554d6b6521a4b99907db4ecc0f0801b89fcc6e22dd3a36c5e4de1717bd4009d9ff515f49617b7a9e14f80a7980c3860c5909186eafa90e2afef4aa035917eae81e10a6b35bd2e8eaed22d0a3ae328fc97b90977f6beadb030554f25a2be64d9e62d3fdd8ad9ccadea33f3d5a7878ff2385fcd60c41cfd100d091e3e05c34a2d8619c5614f49ccc91e94191b2082af6cf5c0afbbf7d73831e6f8a77b450b0b92e36c56c5650b09ecba289e566a432fd332cf60e2e6c8405b60e10ff8e69f878b0c21a66056b99a10e18c4282dea0dec6a3e0138f91d8138c9b1d8c76c094ac4f9051b1f48e132428087f94589dd8c3b058b49085d65b22e70aeae8ba92e54374cc68e25dc229b243fb4502feefd2788b833f8120fd5cc34ae85c6142941057f8f7a3307a5e0c29245733049f8d5495e62db3c16de3ef3a02e650bc8304a7a465cfff1c87da88fb035c755a1233c48763b62dbbb8f246dea673acd3009f0feaa39d1cdc630136319cb508370ae23a5cce045e011301f81b7712d7594c320994670804a6b51ea9a10c2291efabda6994bf96ca551efc84db8685f0990eb1a25c6f9c9b426cdfec465a8c3ef2cb32184268f62d8cbe11dd952df7c6a8b40c3219f4b4f7265b491425ebc2eeac0f3064b788adbdc9a50479acf0bcf2a034fb9bed3747133b6375f42cd50d065168bc00d0e8fd59e2d58937301ea52dbf8fd0f94c075b065dd5297d25b5a890d20970781b010267043210bccc05e22c51b1f4ff1c293a4d7adefa3325787253a4aaa68e13aafcfb7571ec426ad70f3231d0f728d07ea52ef6048fbdddc63afc2b1e67307fdb0c4c8ca8f23e25a764804940af9960fc9d70cd78f6d6716ade4660ff0eeba41cf14a3d29ff8ccb6ce62b2a14669af9395be229ec418132eaf93613f30853fa73831ca67f1d0bc3985e83a36032bfcb5d789c1ce334de9c4ac9f19269029d9134770e05683b9f46be21bc43601891d138fced33c9f18c58f4b9c58eab378505e66927e6ce86ed6078799b7f0c8a39ce284363afec0a9cd199f5336e8c0f125112bf1cad2a92937ebae467286fd3548effd4de1c928a801ed72eb2ed05d41afed2c386d051405bbf8d14331c861a7e550f0f787aca824a2816dfb02cd5ed129c022ee3b5827e1f3024351534cc4f9e248add0ef6b5a0a240b12d842aceedf19511b007747faafe556443f89504578090e3acfed6f68456bcb9940300e89859636477d7f341b929db802fbfb9a7611e3a3ccfef223d1efcef67bb0028ef4e39ab62a375cdc469a36c19120257798c30b28970049004d863700cd47422677268a649410d05d5aca290952a322474c158ab484d78d694be0369204cf6b46b9668d35405eaf5a1ab620afb4c64e603297b1c86c94f41a4ff501d0ccdfe2611a7e4f9df251d0695e965a62fbccbcf26a047fff86e87ca90bdb4eefd36140a1064bbc5ddffc9d169589bd353d3dcdced3c9ee881a5badb08709b468033a8afe7e5a301856a503753c781c664c75ff01cb20d1ba45e6af75bab148d8a3ec4a8a2ff2a615efcbb8b4ff264e82868e87b06ee4dc8fc8e9e1c6fc42ee780cdc7bd95c2c681f8e06235bd88b937568c44608919becbdc9965b4a99524a0109089107df0741fed324073eebbbbbee04dd3702db6ce24dc5b8bb72f74201a276f717a46e1b87b1d999bda9248850a0f8cab27118fe8975dfa43465d9546e1b7eacd404092a6b4054fe2f42d16cb86ce78b9c9b128f0c40b56c7c95456918fea19b29389599392b63a732c9c6e2f12e0b9201ddff4836bc0e77b3b1866c0ea177a73541b7c256353b11d4aa948c0fe195f154525ff4941eaafb1da53b284ac3f40fcd29f48b14958f65c8217288daffc9f81030784be52e06b9c815ec4cbf2c6273f0b6c011beef8c6ca916e7431aa6dd46e2d4fecf8d149139b2838ee918a1bf06140a45b0ef5202daffc1769e4ad319701b6c4d64d015829228f5faaf17890421694a7bcd9034a58b9a280cfab5511bc59db9f1d5caf0f5ba1ed37440926601213519ccfec216cb5645dac51efed474c0d674cc275d1756bab6ebbaaeeb9a521a5139320243c861fa49c3185139320223e338c7614e6ea30d994f9605cae38ba9cccc3a0ce1692c8e95f63a65ca822ed01353ea97d1d899ada99de127846a8aa980b9b8c0490c867079814f7797efefd79437a420f7ff362605b9e3e0cc4c3dd0b307a8cd309be71403b2acd76c31a2159558f9fe70ab41bcd919ebf9230e2fa02660bd860c90249f9d4aaa8244026a8f93442c4cc3f4f82af6380c50abe44d7b55ac4aa260929ab02429d4fed873fdb79182e6cd356f7cd58b79266f5ad591885d91bea50b6a3f495201b364c9eaae1f2c5931525b9101f2260055dedcc89be632b00151bb65b7d9908216c20d9a40d8dd857199c2ed392ddf87de64f03a934179b1d9aadd5df668b338f663985712c680d5b531683f8410328410465e8710420821c39501927a98996d9c3bc8c37501630c234689614481ddbabba3200c27d86c06383601630779b868d34d369e14069999a704ba7ae73576746260a196841647ff2402edb8393ab4918a3a9557a424a41dd81e6967a3736f3c5644e80e53eeeeee717677775f777737135254ac78a2abfbb3f3829dcb8a256aaa76107fca06d68022bcf0ed1301d46fa3ec1417eab754aad721d5fdf7e322d585fc3f3ee284a7fa11aaff042a41f5a74aa4808aa8fe0f34a5fa7b532851fd63a6a052fd65689a54ff1d45a8fe434517d5bf070e25a8fe39c0a0fa7ba055fb538516d5bf079b9b22d59f715ab53f4f8a5ab53f4388a2fafe58e1829dda3d063d7510e815f420dc100189138ad8e00761b420074b28b90c4ac8c1902934410c2b889a053908a37fae1bc19ac24fa27df9224e7c1925375caffd7e8f3da971eafcaf118bf919e7225f480d8973915de430f385d4d8402e94d8d46c8d12fef930f395dcd0419404a145314a6eb882f45f9d920fc9f515e028e8800a9bebfaabfb21fe28c1448d0f3fd874fff5f3270b681f39ccfc88c58c383009d8becc27143ec639388c4b632f3f08e9af17c2e3e2482fa426884bcbbfe1924fea82bca766153476a69aad99dddcdf997d9a43a402859db7ff60ccdcdb7d1ba046d8a8fbce334cc8ebedefc22b305a8411941f6a5530824b50fe2821f4ceb6e3e9ae09517e676fdeb8c54ab9eeee2bd9a173f0594a68c918533990b8e9816bbab4208e434beec0a5058fcc39a57487ded5b2a49412f27bb424ecc1bac718638c11faeadad12b6c955a18ebf7d7bb619b140e8b713435e5f35fd3ea61d2c000819e92338413e54911336bed7cc9c13dc03953524310e8550f3230c4548fc4d1703c64782023990757437b37344cf752c9f9223565479cc1ecb9d282ec3e60cd2b6766500da0dd19990e0396ecb86b7468f50644cc8f9324ba064e88f081139b1ff0643197a862db42e6a745a85caafce2c5c8484144addf36a9f05ba105faf649dda222a042205c3b00b99d7a80ba2a49c614415cd426aa8e44155180428a57ea522a423841006a7ffc620a016a2f81aefc3489c2293540ff0bdddd34b5d21f7d52bf959f292a344085f06918152ee9c126bbd795fabd20a07e376a4bed9f4a002106b53f0546ed9f20fcd4fe8101104a50bb2d2ae8a470ce981839a965594aa059dd1f288e78fa4b20d1688aaea488708872360ac59315645bf094a0d0e2084c09411a1447489074761a662b6dc11157163e180e8ccc241891aa286249b9a2d0e208c905d18ce2e80591c8322206904848e200091fc2894f8750c47b2f9d67035f4a114e82ff8fcf148afc4be1992c5ec4804159a8fbb30414474b6451bf37c21261d0808814473f5228b9111380ba3f48caa8b0ee8f144c3421dac1309e227e416dae00156b20d4e6b8ba5234c1456d2e01d505fefa0c21415d9f20a4509b73819d565115db9525171aea2704874be14491da5c4be54c0bba92fa56c50e08571dfddeefd21dc79106b4dd69903be9a448c1420a0d9a90228512b172ee34f8cbf10069d820ec7e6c75bfad523f776e6b2f6008d8be7c33702afcdddd088fb41724c60b9660138b76e66567c05895fb2a7e92f63806390c7c5413287c62881a6351905192a32540adea22157eec69d5fe3019aa2baf81df4add2f52a97005425ebf8f41be8a5d4988f214c187b06849abbc8b44d20942f108414f08090911050d4d8912d4da0efda24e4f9238d4e3ab6854e453a1b481d167e117390cbca191a83df8de45a1f620f501ed8f3cadf2aedf6b4161e558d4aa58e1c72fe047a356a52a7c99d3aa23bdda284636363640d4c08f54a0b8a97088bca990880995fa499c0a23cf0c76ea278d54f8dc9ea4fa0855f8d0880a7fbfd8a442a1566d93214451e1c7a156b96043dcd16498deb9b875846e85f0639256e9c0af3103471b82c9f8db7d701742f88b835fab025d2db0d9aaddf7e8ec871d842d847fe86e1460bb2be8bfdd36e4b8a903bacf8c045e5ed63a730c92e225a7654dd901bf32a0a4df658ed4dcdc40b043df19afd7b4e0bce637fff23199bbe6357dcc79d1581fe7b4ba7b798d4e29801042082184d0bd1b322fd3dd0714847143bf5fbd1093f104030929a594314218a594524a29a50c425a2fa594524a29a594525a5206017e319577b79bbb6c65677a4e4a5329b8db90959d99b12b0a2c0c7c08340c7c08030c0b58000e1c0318000000f065372c0ef834edc12f41a16c03a1c0f6e58b41bd1aa2c4e7ae8ceaf2d17e7d53f7378b290215ef7e79b1fe732337da197630b6555ba58f512504a24a284495df0d8b7b79f96fcd122222c121553ef64ed41d51953646befe2ed6c3f7ae8e8a9751e593b2ce8dda93bf033fe1da55dfbc6c9d2abbaf736427fde8b28134fc1560b9fcbef1951b398cfc54ca8d6eaa57fd8233f3979a0ed774ccabbbfe73a318f8d28d38c7f5f27d0a3be32fdfc358176357db6bff6d5f0b0b75fec782fc8db316663e89f3f5660bf34b2d130746ca2657e3afcbfdf29eef1ec3d7cb3d066938d8be14614aaa4d597bf3bfd40e1a2918162e5ce8f35d422697b507e1d2581373d6dec74f416805141d1c2bb02fc6e8233e8451beec7cc468452bc6ef193a426eeeee9d39abb9d8b23fb698fb699c3ff956bfe497dc26448552c686d6126c4f26d3b69d7edbb66ddbde74dab69369dbb66d336d26d366da28b7f21bc7d5643299b66ddbb66ddb4e9bc9743a6da793c9643a9d4ca69369336da68d9b6f42bd693b9db6a7ef6fc346e9e944b73f3d464f277a426da7cdb46dade9d860b6c27d5da9fb6ebfc2b13caae5b46262316d6599f1acb1cc303d663a6ddb76da36d3b6a1b8b6ac709d33638669db9ea64ddbb6994edb763299b66ddbb6b7341ddb763235caf4a895d3cac9d4f9d8def4a8eedbfea4cdb0bde9b16d333d4d9fb868dab687db531d915be9962a7894202857ae94503a0d2768f7b78fe92f1f7236b8bb5b7066346e4059a8632cf51262943e3ea9f1b5a1fa55fe4c6bbf34943e6a557bcce27898f587f7a8d737b74303614c7e2f7fcaf7313baecaee7d33d5f8a4f8754a29255cf9d52bd78d6b1dbcba6dd897b0cffe2bfd72d897b0f7512a71259c5267596f75d2fae52e19504dd3ba6d6612097273426f20489492a878a9fb53049d8a53b76e4502931e17a0c104f57730284dab5cfaabd7f8d6fc786192fb845409dbc3b2e69e6b0fe5ea5a0c5cd74d08baff2fa4aefb60e581bd4a15ccdad9a54f488519d78f715fb7293e480f84fb4a3e4a3f7fb3e29c5fe2e2fc1f5c4941fc91748432eaf73c9e4af57fe9989f19e8c48c26eb8f9c0ff940b8c6eba18febe3dfd899f9fe3876c67a7fcce27ec0bfb86983f531be65bd84b3bda9e988eb3d79630942a215237494ba55a855ec46acb8c8216f8ec6e116fafd978738d6747051e3700ede16fa9b368eb393daeeeece3e0bd3efce3fbb825915f587ca28bb8c138242ad82dd76f65f572c488dbf9b83a7700bfe58f785a007f679ea6f65cb39b66e93d666f0f1d5364f21bdb74f8d7d329e523db60b3ad25e6d4de32ccccecc1a57b05fc3a0fa631d17fdd0c6718edb25b9035f5cc4596d0f762cc418e4752f7d3f706f7c45b1189f9e545450457d4e54513c5451a8d3f3101ba138eee88f3da5bc276210994ea747991e55049b3ab399f97f2bf2a6ba8a65158d3c52c1b0d5744c2850d314a0d37b8a0635edbc50dd179f4800d5c5285d04a2c1437d00e14a8387fa383d10aea8a781033f722a190d1c645293213efc14ea5145280a25053742a1bac8a43d9f5a0c16aafb7460a38a7a2a646a3a505dca098d455d246acfffb388e214ab68674e278eabe585bf0d26d3e96411b5caf4fe25cc743a994ea7ae862850d47f91a8ba51dd191437494ee8ca9f229556a1de3f1eed8ce9fd3113c7358eb1333fd808f533dedf06d30ceea4cd807a5317350d9b61e26eb4e7a6199c7cd3c7a1f6fc511c0f5c4d5d0ded9db8ad510885e222188bc36871408112c1a86e453d9665344c15755514ea79575b837ad674a07ee3beaedba93d54d74f378ee521477f35d4d374145a79ffe813af8b248de8178dba3a0b2c548b76ce5a44ad6a797f6b4aab4eef2c276e6b0b072bcbb3d6c2d2e9e0d5d363278e56cc94c156a17ebf8d50a847f9a31e73e6768fa595953f715c53d8cfe03aa73d7fd650d148daf86a6ba6a9fb527fea3ecfaa2b9d4f69cf9f0614f4f42bef46ad9af14ee430fea41ada67535a6555b7886674d1a83d7f8ba8f46e3d819e3a1fa83ffd4af7a1def4a78f812bc619ea043ba845a36fa57ede3946353ea9feb373a2d10e71ff656768ca326a7182f9631e5d69b781697869cfc68ca954730f511bc231b027adb04fb55149b465f82abf6797755e7b730af47b1e7e6c951fc3b8cc6360d871030e3af43004c7c8ce129f2742256e8892b6587e775f57493f6d78696fc5a353a01e7f0719b6ce97812bec9a919e7f9090a4b60dfdd8b746830f95d4dd4b7b3c482418c1e0dab03dff60cf85c5e19ae53bc375dbdb3996e04bee85f67ca81076318b63bba1dfd717a30b09e6d2e282b07eee5abfd57a082deb97eb8ee37e9ab6e23707bb5f77a12e03ea3edb30511103b670018bba308bd303ce6120ec143828b130fed0d7a8ba3f7756d783eace1deb6c36b4ffd321abd810ba55479e20c8680a2836b4eecf155390a88040ef80dac38770a59630928665dc56d2757dff0bf74121db9ee5223bdade4ab148cc59f13901b62fcbbbd09b37923821b2c4870816f5db285f4c6d2743982c64cc21dcc99ce362ef12af65daf65c62d0ea041a02aa0b34a453a755039ab330fc3ddc4b2cd38ea1bf428d1dca0945d575328449a5699ac6894522518c82d99082c69f32c4a71d6c18a7bde21ad2ecd63f3557da6324d7c7ab830d136756630cfdf4b3a183ee60cd42500827fc8e12c299419733ebd93f5c9451b9ba3f5ca0a07631441540dd9f2d8a6abf106c865406d415828d4e17424149845af5357701d4358d0473f145f5a028ed44adda1f2e802a4fa9fc30a8f21605fdfceba020bef92890fffa354fd1624ed08ff2a8b643229f1f0b6a8fa3b4470225fbf25d68e6c0f4e2a83aacac14f1333333ffc73a3753e040a9cc58e854d6591c53a03b13b9e722bd92cff0a3340ce77490070539d13af4710faa7b543d08064d1d6c5f3c1e75dfff47fcaf87ba3cd078c896655996d5fd901fbb6fef0282fee0aedbee47fc8fe7c3f8fced4eee7ec80ec9fcd8c118dabbf308b49e856be1ad126b4d876ce1826061618131fe1504faad516dbaa261b2f1fd2bdfcf636750df5f4bc57e17c3fe7d95ea66f7d196da52bf67e15256e65afcd67420a161faf95cea22b075763fe67fa5544b8a1341cbcfe8be59677ce9a1a6834709b8a6c6d76869e18208f243959a962722a4a6a523e2f235ba5d98afd4fd98cf7f7a1a9ff11c929647b59c3ae690d87817ee8720b64acd0d8d1a1b9d10a9af91aab14452359e48ea6d3c1197aee589d8e8520eb3eff2342e5d8d69e26e6453a3dd6f89bb8f476df9ee4ba51e6be158525c102c1f44480d0b1744cb071152d3f22d2dcf1ca9fba624fd673e0ba5f6b3c897175763d9446b2c9bb2f6b883b0bd09db9b93a6776441347f7f8286d4a963da54e66e471644ed6d7db9d11e5b42563abb42e51cd2a6ee0ba9f995d4ae8af4dffc0b9b5c363f9b19336733fb2bcbb2ec4951d39149807faaf8bfebb18c8315bbb8ebadeb693a55b3cccabaefea30eb5ac11aebb2b419e6b32579f0a893089a4387437bf2e912b4ff5ba2b8026c07f6a161dffaae5e315efab3467a35e3734eabbe87afe6a43495fa174a59bca4bda8d35e3cd23011872493ce14fd94f731de0ac5a46a4cd5eac5d4e853d3c361e21341b9a7639ef6e2d32528ffc73cf108296880ba3f5374b045090aa0829a5501c21b757fa66851a9138e6871c1670a51dccc2929a84e570650f7a78ba24aaafb4344543ffa31c000dd5fe9cc5064a68ce71c23c5dddd9da116eeeeeedc5cfb99c8ddddddb9a5a49cd7076af1123f2ac1dddd9bc8dddd5b0b7777776e227777e777e796e2eeeececdae04cf8301061b2f5318b1840e3686803810cfc21b074b56e032329247278809c9230548b74d67017b485289c5ca0a0e3b69c29088731971840a23293133623c6f8887584465e0f09015c2a0f8204748ca101b41191421041b4949c5d450e4999167a55540e0fac02c483e913f0a9058231659ccb2d8267033c10f17dba47366141540a9fc52da9b1d461d5e869c3bdb8526601853fb617785bb10e60d60fd5873bd9a3710776682da40a061fa9f0c6d55680e329d8c8c8ccc94faedcd8eeee721fa65fa61e01cfa0757a948e077ebeeee5e3c827c8ce510f202bd926918f92b9550bf05aa511a46befc6f9bf8ca7af92048a24a7641954c44956c822ab70a69ce8bd2994a753bbc73b3434ae92c7d81a2c897e11ee9822a7f87164faafc1a606815aa55fba345922a9f93f48a6b24b6cd5dfa465099887b2a01e3b94750ac3959331aef6b90b2a4f2bfd02bae41adb8268bd5093374d820161696de75c185468d16ee13c22384e7f49f0e1b248447080f0b0b0bcbb3bcf5980d1b7e351e00789a66e158de46044057c3ba807a966e1d263e9401f5158b0d1bcfc26223f52c2e3452445a9e488d1a2d1f9fc657b8ef37e8c47d3a6c904b0d2e4524d52284878565069c33380ab3dda02a3ffe42ba7209a16d12c2f6653ae0e66b300760bf9f0d5132fd598bcf31a331b31105bd9eabd4cf7ad2f78eabfb313fab4382fda004be92869ccbacb04a2921f709a91db02a10aff085d41f5ca54a952a6f8445ec870fed43f28392f94a305ecdd274740cd63b841042e85f2291fe47d6f140a3525246ca1e3e89bacc68a9917a2234fa59fc377bd28ef52f7d3c6aa99b97f694fb7854aa3d3627a5a9d437aaebc7b84a353d46ea3e5849f033ce2bec0adb7fce2ecb485ffafeacfb484f7990381e75b518b84a25659d411cb0fbfab1c6fe87f55f0f55eb78a0513309ccfac3fa0ff820bdf63e48cfeddef8bafb61fd077fc6633c60f7c37af8d8d70f9b9b7577613ed263a4ee47d62111c2e55d66b87442a46a88b4fc8c1a349522c2727a1aa80f0839692f03dbd45d1ca6eed3ba7e0cfb1a1c0d2ee530fe298e484b17849484123a3882055154a153b31de53e1e15fb391ffbc5d65741866c9528b49082186458e10a556a667c105c7363d51011520331d27f6b3a48dd0cf37b3ae46cb5f21a97717485d4ad70930414be0b0da4ef2775fdb34e1b78e07a752e33cc6abd0e56e5c1ebec2ca12fa2d04d8d31b604a4ec7e6bda04e3875c10f023fcadf09921e7dd2e84990fe6f29304b457496a502a954aa552a964838dbe20131f3371597bd99f38da5e06dbcbb40fd6ad2b69d90909eb999f44a2c187ca2f3b48205c9df3c7be1fc219d34fb3ede6b39bcf6e3e3095a2b4bbf935f2fc1b7371c4273141ade79ac5e4c0819d6161ceebe3c797d13e6b4f7b1347dbd3607b5ae9276c595beec0759b57d5bacccaaa9401eb207ffcddcdeca39fdffa56b5c541c8cc1bfeb3c5dd3983ded16835e382ce198dec1439c4680111ff06a59a14f48bda44299a4afd7b5e4c8c8c4505fde24e44224229258e058316c4a5344553838d956df23720a510e2a0461c741bb1c6dda4d2d429a531f20821c6b8a9973963b828b91f1c353965ceee93ccbbcccc5146beaea0f1af2ba8114afaae59994aa5aeeb88e58322ae2b9ef48429764e8c9da30314e5888f919e273bbcbb393939399cc3394073523a314f88faef720ed7ccd8e518d9192576657deba898b0baced92ae41cb6591c40e020a942d47e1c1c86d36a3c02d1b6123a4c34c1c3399073f688856967258038a773765a1593b40ae6e4e44869d28eeceedcb98f957c2023d4aa9473ced91e94cf75e508a197646a5aa9eb8a385c2c92138de830e19155c418659447f108c8f3de2dcbb22c8f4632c628b985070a431d65a9a755328925301ef9eabf7864e47107059beab555a59e129356b58e515d35114a3d13ca21918c6b8ccd515ac22d1c5957a04b38c76684afd21208af9f2830a98ce1f4b4aa757680f5db74b69d281ca9fd5b92de76e490aa63d3d98e4c3944dac43238239c2346321647bf6f466a3315276c2a56467b2d6de211152780a8dc6155d031dc697686b198420b82b24fdaeb2ca8f65b41d01d60853433718cc5d1f20444a8fd2b494045ed5f5ec52a304cffb74188475c50d247a33ed22a77da4644bf524f8d47a51e2ff9f84ad37a4a3d380ed33f27a55438ad270afdb49eda40edf5507b5c6222042df9947a30a1da4f7be8970101f92a96118f32a07814817c85613c47d887f160516aff50abb6623c56603c4d24c1fd48a042e330f323f758f7e7094be4ce925ecdd89f2f96d4ce80726a7bd013aaa89fd4a9adf384a28e9c013d6955270161943262ebeede41663935f92f533ac2fab44603c4f1553c6a98fe39319c8e98131446a32a81f5997db4c234038a4737d81047ddc4a1316a41a5910bf5b0ac1c232f40603a73521908ac6430a45ee6b4a040617b1e638c91351d14093aa5d429da58407d244bc9ccccccccccd2a7539f9ec7c4380634e77f0f32822ae949f2594a29e5f498181fac87f67cd5355be3e3b2335b630e1b6915e9fbab979c3fcadfb8127759eccc92f417d7437bcda4c8364594e912da437998bea5a9e463bf9bc39f44395e18fec82d002abfa451e234ee9bd5fa52d546b5fee2be00d4097b10b2333c501f3687ec7808b233cef93367d52d3d4dfbe3b0335d8fd08f6f64e49b1bcb2a7151c7617cb22e8d61e2d9ee69d24586e89d66d239bd3b76cc09f49fd3cc3a3b47a4fab1ce0e1ba020dc848d0d51cd0fd9098c6aac4f7511db383be3be9adf4cd46e258e703ef2e123afa117d08f5d17f3a53137e7eccc7603ede7ed0c0d33c831c3b6d05f636749417b7a98b4eae3a37ad329aff39e35d4db85bb31e88bf5df35a080f2d8d14be8c742dcb338fab9070bd39f4a994c423c6b0fd15ef73c6bb28b813f461c17d0af6f6c70f11bed7996931dd4af735e883131323fa0dcd1f40c0bd3efd3b345edc7d1df37564eab8cb4cafba66f622c62e239a9406ed1e6e001203af04df72fcc01c25ead420e83907ffa8a03b3b9eb826e515d987e9f09a5359ac5d14f93a0df16c1325ae5454539c4286d24cfc927c6e8d11fbbaea01e638c5106ad57d7efe6e3abab9bddd6454cab42b12ad4e5aa59fde6ce68b50095bbcda73d18d0a8c4aa624f7bf107476a7f14b51f06ed0c7ca902257646bef544ed7f1293f67eb02a5214ebf517a3c08c50c19701e109eb25c74f62d2aa08c47a51ec10ff0f33c282f2535d89daff6146b8cee2d881ebf740f8c511e405fdb62a556e3eb57ff3e920cfbacde2f825ff7ff2211535f4627a6ce0851b40433290d7f376777727105f95806b94c8d095bb7d2a03fa79b18789e77945601576373ef15e88a994fb6e2aa0bb38fc8be4448662d06bafab47ab7a001758debd3020ecb32f719be37a1e0450f7b1151e66c5ba0bb80dd53499d6eb5f21affd1ad855e9b56f1a3d768686b76378515b6747c6f990957efb96d1baaecbbb4ad9f6a5acf45bf6da57207badab40e9b76ec7b4f1617bcdf4f4fb314b7657ac338b0c1f94dc40dff43e68bf7d7f0f5ff940dff42efc376caffd0da6a7cf9a0b7713d85efb0a6c5d054c1ded64b2a31e3f90c94adf8f65dcd6c8d094b8adc9385f6d9a0b8f204a6ec8bef441b6aede50ea8268dda698fb05c0c2aae27ff1c8242d89bd64fd0ad5a2565daf9abb3d5a45baa66544a73d263e36a4d64c36b5dfb2588889faa655bb9a445378888f7a082eb2fedf573d1ca67f4e4affa5a0f2b3848ac1ec7dd531319e979adc0959d66b9551d57a2c1ea9fcd65babf2b772ecb610bb2f1e515725a5b4acc9fc9ce3f28f3db866655147ec2663b1ab1fc0036abf500a0cea8500761e802aa0768edafbb33328a0bf03d78f79aceea3951641bf3deaa18707305e762fd99002670bcf8bda60d416a35a292fe897e216a61f867118b0f33409fab1902c925fb44ab2100bcd197162919cc56144c764b369f1844f504c8c0c0e3ac0f042904f8c89e1d72a33c7743b81c8094238adc56efbe7739759736a37044180518df5d38ba3fac5785184a69b609d7298b6a8e0757f7640e5e57a69da31b4c30323348c5dd0cfabdd95394d078d01fd627c9ac4c4c4c4a04bc9e6135331eea77ec70d2f3664e2c65475a9fdbf335dfb27b58ce818638caf73c35aecb6bf357a847e29984aa5a4c42992b3f9c82b567c36e6b4aa23503c127d624f7c1277e2128901b5949de9b4b7757fa3019d316767b48d468ad48e455a25634e7b3a54a014094ada212569558c3931c7b2224e9f5ca8142d7775450d11cd00000000c314002028100c07842291503c9ee8baf20314800c879846724e9949e324c9711432c618428c21c010024004406088860800b17ccc0f9967cba0b8be26a7e1c0c86b0fd9938b95c77bf289c01d1f623c61996d1ef4fea49764f0c2b049a02c78c15122aa34838ea6fb615429d635e75ed5753030ad8a59a4522b24a1fc86b48a399eaa3259231cf1db1c037c5c098829761b2745f8b61669be1b81f9ce0d544cc9e14f5d5b951e3b710f0377732bf956fd6d112bab45646c179e17ce52a5430a3a7de3841c2611ee1522d009c0392dc4a1455c9182403be85fdadb3feeb9984c549b26d5936a64a49d66fb547d5bac0cde18864044ab5dc0f2258cf8904ba549b2c13aaa2144bde86bb6ad78e66be379cea874e7a047bd9d8a43f0c8c9e519ac44135c0027dfea9142627dba5acf79b5e18b799febb6c8b00605e2a14a11e3f405dd2af6b6609de284bec7c70a72c4ee1dd0f7d860e59527b06900eb8ecd3f20f861088d0403c989203be1d83c85002544600e2282e2cf2bf4599e08e52dd7ace1e439b111b626ce1aa66ec44d4cb26b08aabc113b09709cf6fd771ba079477abca084b366c60e30d088cbd37519797e135874099aca06606bc1981535ce5f51fa48cc1e3f54012338cdb386b26b40f39258bf1144a2858f610aaf72ccc9bfa6554bca2085132280ea71dc89270da279cf75e80449a3df6acc2490a3aea297685ca49e02591bd55858a925ad400c494066d90aeace08eb5ee1340bed2466250de91e0de74e31e16b1f9467b96f546403bf022885fcf45489a23d9064264666db57839b06a8a8454567f251bcb9350915f729dda1ba650e64326fa9a3b300a53f98cba9c7fbf4b66d5bf35fc8ce6e19897e1f56fe21a04ff62cce5ae1e479c8a7fa9b414eec877caa37b39e8b9eff3b94babeea8bd5cf31d3777be35f059ba0dc24bf162ee526580046374471fe4598d4d27ab380795a483a2b8ba28ed21f96c2cc1a55e31a2566e9ff039519c85fd74e42cff227758992ea2666a51085dce7f1ca77eac16eb6380fde72f0d2f9e691420ddc45d044370c9ca8d340169e243fedd3b3acee9ebfbeffa4cefd9e3cb5990f222d0c39b5bbcf7f9ca87fe6f46c322097562792396e65acbdbc8e2242dcca334d8f898be7a46d20e507ef68c2929764d131420910f6c39a49b7863815f751eca0a4d0ac89112d0b17af00a13209abe222b52081e0a2ef6188a4dbd248ea4e709dadd62fa4c94409bb40ca18bcc4c4f0249566d533082ec88d350de8a0b911a28198cf0f20ba2e92251d43dcaee39509ee1564d3d3d7bd8bad806308b75caecab81ca765c31302d0c1a46b5120f834356bc20f39c566da9d60c952f5b46855fefce142063de20b3dcdc0e11809807e580c08a6089f413f49e37b1c1f7bcd2a13285bcc66899605e9387fb122c7da28d00daaf81a12397c3e8548f19a99bb688d2639b7bc4f041523529b67f51193dfd3cca7aa3cf4f691efa6035273a27eee200755a4f836e293297925f15a3bcce3c587bca7bb0d650d30f01a7b42285181ca1add2dca15a84613b725820b38e55b9deda862d133f3f21f8b4a9556d9d2d044b231a11c0975c950cb282205223eb9e5dff27ccf4092effd8939f3efc8d8fca201c0fbe737fea62f1b7508f9fb24ba5a35c10325d3a33e94ce1047055881d124e5346a9ec4f6401dd7d1d403dc263cf4216bd062ec6c884eccf37edc5dfc86146067c428c238abf8a95773a9a1eee70feb69c9ee0204efa4c530ea1b75f082c02d35de47378dc6d749eadfb2525b8924bff3f26b21b892a1914fd58a6a0b9ea50a176b99d4a8fe98b34659819fcf0717104a09b9471b79da8ff47cf62071f22fb9e0d48ee3ed3384c6706f3ab80a9ed9743bdeecb79c35dc3fcc3eb68cf30ebdf6b0f77fdf412ec373328faceab7c57372f979471a2b547f4d8dbd354285f19a107f861ac3f95cf34f5adf871dc007d7a0997d7003a16d089b1a13da9542da07e4bb60ee95949310c912408a61a6c7a04a86f83f8ba5fdc0e82cae08bc3aacb7003db90565b3f73dc7d0e4d3eb58c030434dbf779a495f76f11054e1a36ddfce5e47eb422530f6f42bf0220717305c463cf0996255f804c0ca8347c01ffde4ad09c390d9808388a013147b6d3602b010b9fa36fde7178d53d402ce629b5917fca351d5b31e7e781a4c93948bdd9e16c0967a760cbec54b493e592e9238d0516f36085f1c7a88c254034a9cf7690f392b806ad9d6fc2d1e128ebd841a6f561514aadafe45ef2bc2400b9b660deecbc9aa3d0878c35cb7fda47af1a45e1a0e2ec9c58445bb11caa2c3d4851ed6538ea0bc7cf7238ac087ea1b9a40cbac12f236e974a4dc206ce913d6e2cf9901a79342a923c6ae6d2e062a313f911005055d6a8ba66c445c2e481cc2375219a27af6204a57018ec54b261e8aa7f1fa2ae02a62c0fe02fac7cf4d52205e3dc2f07be122cd970129ee21d2e8077152355343494965df6f41d8036403afbb1967458427cbe18a1746508958886ef51f0ae89de02580e9099a0fb1e9fe407a8c843dcc9369f904a9fb6472e8ca3656094997161db81acc5e66b6927ba19151ed81248416bd0b5fd2fb599a8f14ca338205ee1f740e37605128ee92de9086b683d9fd58873188a7de7fdd3e383f45fb1a0aa8a33be72bad2dee9d35207d2ecd3e106efb5a5acf19e2f4297ca435e90c80eff09e5b7586b81ec1e522e6b99094ed5e1502d25cef9e7ba82cef57119b695f1f08fd5abb7146cd4b109d1aba77484478228af9f14675066c806adb3056c483b2453b1bf237b85abf5f2c3110acee2862bd587ca3af1b9a59c6e3cfec2b8d084c2bf2817b4e660ec9e1cbd3966352e6102bb307ca019bd57c41d772026a4ef90698eae68626419788ca2d2844858415ba6f299bd41128f3245b12b336607b8bd33c76bca2e42528096515df5d19508ad0fa08ba9e4b016539e8fb9c43a1905f3f7e12aac3c76b11814120181f910405a5c42830050aa69830854da9a78da4e017684ee3867a671d65a64b12d435ce64bae0438291fa2979396aa20e25403eaed0db19296cea109943a216623ad490120a1c15dfc5654d06236968dd61c249d5e5b4e0a873ab7e82f9f870cab78d1bb9d53efc1b5619209ad7b93067864c9364b40cf39befbf90cbbc00824d840a56d6a4aefcc0ada183a8e0ca05646f5c8eaf080c0f0da7f3c8a6af7124f7994b8556cb0850c10275aa985987c5ced5a8b74f96e6bfdf2450602de0666496885da3e680d5750a10f74bbee1693c7f716044c205f199a72443299f066114d7f62c830204b398f4c03da6046a822eca590588c31db72722364c570421bd24105b3ed499f9c0d8d69292c9452c1704479d4baa2876197baff7d21b64e4ad00487da538965519a52ca802e88176146d263a5438643ccff0a80a2f0cf615db68e4e21933189bcf55e11c83ed288bc251790471db734fe1f731de1c8a72fcf3c924a62b0b9fb2a23a53dfcabedaf75a3526ad81ab0ea922e5452462053a3450a61ac0823b838a1c4365edca803ec5f8b6dd649b8ef01fbb6d5656461ddcd5e2125686921a7659aef58650f775854bdb160c2dee40ba213cf9cffdf14df2291b6f0c2a975e5ad5cfd82f5d73a4cbc24f5f41c74a107a189e47d27a7d642e80f4c5ac95e132e18c4e1250468d62870538e4ac45407177c5a41623a5fa286e47406f39496e758557ecd947195d65df20e38e6733d3a3245dd2edda78c21189fb29011ce98a341be0cf96353c578f163e7cecb88ff410cd1ee203dd1501a878c8220ebcaa0f878ccf2d4cd3f4a9163a6aa1924bba8c159106e7551ea60b4f5e140ccfb0e3c9edd651fecc938b958e56593e75d5c51c0dc1a518e4260c8209d06d36cfec897aaba997c73e7591892d47f5e860ef2610d8db9e17a51203949a53665eaf41d0ddf7e9061ff6056826c2d0368164ce49e5d67f72740ee19f5a466ca92cccab9372b8c226d129d4e25dcc8dbec0d4f4d5880345858de2850c3a730ca38062e0a61c1bb460c9cbaaf911ee77c4cec6f2c53d5d8707ae8d91f187150bd53156f4050f83096f9c059edc76d00866a5c744224b325eda14414a984c93bc9d2c1613f42ff221b9e6b3860135afe8090bf0729b4ab13b098ba7158ce125d115fa3218a6052b032ef019dbec1453fc2b9dd043e068e3ede390c4d73bff797e7dcdecedd68a4729e0fe0e177348b058622f01a98a8cc83881c34e3d869185cb30fa2e92d35c94a2426209fe9a0a5b1a445094a47e9ec316dfe7cfdb79e72a29ac9263eb30b9d1d77bdf2b5cbd422a33149eca1a7c0a8202022ebd9b643916632e02eee5b1aa6327b9655f556742a7857ee0d7af5943fa182751e1302ac968a9e8724e1ce8a647fd6c15b343b3a1611705e608f98757bd3789e28a375a31aeb0b3b0ed8ad77e3962274928d6f024f53b8c5df2b86613f9fdbad45297b11dfdf446f74a9715bc0e4825162cad1a10460978ad8f10d967fa0bc252ce823b27159c6558495ca83b5a77de993d5ecc65dd4dbd9c148ce59928c77fadcddf20245e928dc18ad601f3acc2d09f3d09f44970784fa57fd384016c4c724cc2c11f5f17fc09fa9f5e3dc7ab5a7bff27c2133d0403f9a61285273a479b17cdaf777da764cc13d3449827292410a662b1e1d9b414021c9376ef9482b44ab7638c31f8570b1e7cabf5ffc333046030452bef14ee37b64208ecc74ba4caf225d1fad206b527622943aaf9a04f2def4ad4846ccc812cf63ca12a9f0270b25bd7d17d853004cf3a1081c3523432845071e391290a0394c4987c74c9111084f6bbdaf3726a21d6df44b08dda93c1fca8be79677284148a84b8a00999c6d0e90ec244f71e795f6d48458feb83b10fd4630cd5e35d24c9199868602ece493eee1d543e91f3d8c9d2eb9e758f744e644fce3c1a4de0d8a2109ff037460d1deb4145a519f2c208bd8098a5030626c2d81126e5fc2b723fcc7d3a76673992e67b59a13e987a48ee0c06180416b74110f4e6e5278315f105c5f333ddc77ca79b365903ca7cf37292da84ae82d293838b21f88a8292ee968142714f408d9aa322c5ad56a8132ecb70e0ddbe642a402e927934dc5f0613482e30b9d305ba8b7d8bab7800504d03a119469977ea098f7e7816592d1849ed7266be4f2b6142348bdef6769252f4d9019e7f506a6527d0ca013597b690b4002626169fed8b821207efe7b0a0c5103406ca89e0c278e8a6b82f349ee544bfe4cb63b261cf1d62ae02dab1c320d2eda3536a1491bb7ab824a2eb03ca83ae7272fb48c11240f47401febf019d9ebf072a2705ee336146bba59037c42e6949d36a513c826cf17e24379dc914696353b83066dcdd73e773e3b7b80aea870124ebf24282802d57aa72d621a7b5726510ceb4e5da00eecd41071e673fe67b97acf2441c3cd76da925565886864737221a835187150f9345ceda9ccab5b07b72527d3697866253556f5399f94eda646362c8aa73df4cf37db1ba5007eda2627ac7bc5b8befdf1009c4245094b58883f9f7536d2d2d3f705ec6eafb764aa685324a401be1e601ba42a419d5501fb08604eea6126aa8c163d794a783866362e4d11da94a10dd8927cf403443c64b44809fef3ca0bdd9405aa60bb30a24249d07ccfa472d7ba1f7b494cab8ae534e2c1a3b53feed70415243811b08898dcffb6874f4333f6e6a6a0b641221a130ad8df904496b1e428614041d33771d3781113125dc88ad01c2559c8c16d294364187dbed67776fcdcaed54053425e00bfffb081b209453bb53ed843034755fd54deccc71d548d6b95d751fbe1fa62de5a38b6701314a51c92aea30a687e972fb39fc33296235db329018e4b6042b98e4cedc574d6bd22da47cbdb765d694238eef90e8ad219afa0aa7054994b49bd7fb1986b22e781c6381c3faf094c99e657a807b097f9a49798b9f59613f9698cdfbe9202f960827971fc20c799e4ca5961ce9b4314f8014cfb1cb27bd7b9affcb9a63cf62dcf432599856ee02ccd17e3701b684f9bcbb586557598a98cc7e0893ac4020ea799850dc92ccf60fe477b1b0c1cc8be9e3ac04f49bc227e3dc89a39d2350911bbe41bf44c6fd814299f480ac425e24553db356e3eccaaf0fa10aa159d1e24abf090a443753ec2122dd3cd9d616ac70c719e961f821ebcd711c50eec740c721aa3f8d87d87d6db366e177ab35b510f1c5b306ebaa5dce93dd33cf95c084dac60463198a434bec8f4a3c4a23dea6737aed603b34a6e2bca036166fde038d7a5d3231dc7774fb81827c53a5dbdfda11487717797e05898614a36bb80eef56f659bbf879d56cae529b384f132170dcf1a0534cb4585364b3f1ef795690eaa1e911792b258a13990463e95d2b22a420723cfd29bc748d605cecff4457d67c522cf1d7f059a88148b61358624413a20008ab739aaf9572eb91d495497d26a1bfa583bbd278baf98cac2ac7535022998847274160131c6557817e96fa5e52fe2f35952fd9de1269625e67f9009e6f86950a76e4ed9d1a3b7d603d0496d05824d2527cbe0b69fb2077bd58d4021875711eb0a0a33dda7cfd53ec294ab282054cd8a1251a96298b2e0fc1b643c48d64022fe03c263f0c16b8094fd17ad6ae4abbbf4ff2693f21fe77df2b72bd8f2d7f30b5281574ef7b12e64fd7b6da2a258cc1c362075507407c5f21c1573b6a5c0a82503ac792b808f1b2d3adb0dde3fcc0b267de96a8d047ec87cbc9b7ed657c404706c0f6de1b57d8c33c69bdd663a4dc09d443bd98d0c7904f28301cfde4d6995c21815840aae1525afa77016501a952b0eb2f941012a1db281e70a63316237e10e97423da274395607e5cfa520c0ff04ae212fab54ffbd760b22896d32966a77b6d474732e9be3eef0189e590e4a78473ce594a8b4bcfaed672b86d32e7f8ed6fc963f388d6e6bdabc203af47651b93ccd50cc1c5802bea15948bd406eab1f8e94fac32c62befa6bad9bb012c8efd2f0f9f10fcc1960e59a275c28309c14a39cfe44a3a79f997b84269d773c5a0674ae5b51213e1a42dd877ecef1bed3bdd946001ead852c199b29da16928ba7a960576a5552d2099a141c65075ed3445ded0cb270b5c0feac302121b89d47b110077654fe3f2a2fd3cb92cc9f8629914d6af4b0c0251504097ac601fdc97aa1e4ac02f0788c70bf5f8af32c0c55e89383ad3e6e7f9d942c43275e0fb92e8ca2c4e180d981c66b02e15df431ea1f93b1113d7701e5463641e5a79281d1e22873107159539d52209020c1f7b24151685440513d60a9e1983a2e408c391832f6a44830471bc5927c1c55c587407235c0f0da71f269b96a7c6ba682b52383f510c8fe062f67caa8d5c7bd769785a829fc12baf50a4f4a9f821e5acbb6a1da07001d58af82a05961419f630f9b3c1a2dd5885f15253a4ec7d39187fc78d5f303a76aa266cd406295b07ea469ebab34ea2d0f07427f05250e6d1d1ec9d7b56756b4dc3228fb5f481e4cb6c4efe526c32f4b724ef5693211340aceda38b162b36fcaefe05ed459d9a167940ac846d7ae16f2a5460c6c774853361f15d8732295ce78f4e41fbd8a6f5847c06f2ed53de8d5c7251f341505dd29f5c029664eb3c166316573d3703f49dadaeac2d3a532e7f194b804201361c82f305760b532f1f9ef26811c9af5331fed375f3e4c8cfad9199841fff44c283185a92435bc605b8960f114c8351059d1bc83956b9e3c324d60b524d790a24ce6eb7f8a36bc6d9906038d0cbb418fa83edef296971b4c4dd46912e93c6517af20ee257b08fda16747cc7449a9a8bea6174172e97fcb7b4053551e4ac22a59d865b6e112f99f9caa9deb4332b6360a354b0ca5aa9985b567050bfc718bd3fe166308919ae5004d89cdc73e102c4635dc0681dfb8ff0c5c816a2eafb1a923fc127d837b681d81a4fc793dc6baeb940451111025b17b926acba316e62991ee8a12aafd8d225658243f30c33bb84ff9ff64c3805fe0da3dff9e3b79ecfe40b70ca0c2ae209ab21bdf7214c686c899f8e8cefa37a9c0235f2aa411c0048bec4562807a8916fa2be1b1196dc95fc74e0b261ad9b38f509e909694e5652b509daff710f6d6349961955a983eae79cec951042e36c555dfa4d73f6433d0df31c5ed09a2a9a141a9c5347abbf374be0936fb1f169873ef3ee6637052002a4938bf33a11fe0d91b7c8c7daf5c883c82c814e569d4aeb78a73975f62a74a7c1249b3d3daa282bee803177756a53cec1fcf9182a29fd34969e6331e0cf485771f22ec7139815c4194355f574da0e354e8bd9d6541e17831bb1e11dff88b3ff6ef8eab99633d17d24dde4865368947a558188875beb9988ff8a6af5dd05d6f520ffcfedd91424cc58d961f344342e8a48a20744938898a4072481af1ba524dbd5d679a3adc242d69177f766f5f02108ef1c3dac87e0dab76f329ad90b87e71c9933d716da22d6a339fce8eb6c1f16262160695ed2496f40ff7000e2f6ceb25596c86c3fee678e25e6daf2b7de055653490313172c3c0717f557046b018975bc7486c912a10c61dd304d69d53dc48da231e4b88e977d0e79fccff97faebb251ed103c6a92224ddf6899d6a2dc0e05295633981abced6825aed486f3097809c670582a161413d5866eb683472e5c5da90e75c91b9667b760285228588ca7abd24df50a6821039454a0ef2eab1af8747892a120363653a97c02819f65b5950b76beb962313d632ea365b7c0e7f65f25d9861584b5a291c1fe671a8d4d0d76ba0e2032dfeb3c0b38b7278e41d1478160529385f0176050d5de23b852a9cc1a3fbfb8d5380c6fc75f3c148ae38c472795124369527263c1c3e6df7e6dd8bb8527974a4fb312b1440c800a4eea9dd3d0c3672a987d8a3bd54dd82bbc5c74cffd2971a12892f69ee9cbe4698503fdca3e26733e6458422af15996d04462afde56f0f0af1f9841aec59e0d1f9d9b9e30cda1d5bc014b0deb27ade65ccdfd30269fbb4e721e19db4fc33c0a7b5469b7c7e339feba4d3f3c51a78e8323cf8d997243164df14d5625c75fc43645c59ca1127511930b880a4f293c2f832c6d177d62a926441bf1dbef7242bc0b34814acc12798da92b9aee9ce1da3505942683177e188deb43d89e65e9f587489b4dcac1b1b0c9185f4599a1b05a5f70fdfb335e58c4dd2a5765fae76c32851aefd9710d9e824e382341a8a9c430f8cc6a388ca9fb75ee9567388af2032d28600e104ff2665311ce50ebe244d59a3573c54c11dbd1c9de04883c4ae297eae32fd18ea73c9c59d4af1a0305eeb0fcc160d97162a76e4d4dc8092669a68b107858bfba5d36f90953b0d6b10ce8946c7ea1be7b3c2398b2c0b8bfb8f49bd51eb8afa5c75d97d1a8087da1c78d2dc6e30b421ecedab340b106a836d7d3c1067da3e2dc7b750388e5434c5132d56ee84c0b94a95d4375ce2e3a13381acfb6f8825e3cd23dc0d82759cfd178f4d843dae67856927a83fd0e2c407baef24c182d4647f02ed006911aa2bcdd6a321412a96407ee4a86336bae35f0373dc370a180b808f8c99cc02e5a496d1c2cd4365e39afcfd531837eb02951e990eeeaabda4c3c52a5e6e0c6c370c302ee0cd33a5955b43fcf77147066350a24d914c49f9fc9f872162986074d1d86ace84754bc0fc24840f91bf9d41df303024be5f4d32d6a9e02581f78ef44663ef1a6355d952ab85b6e1465c7b63f260859ae64cab8180b7915560870a0867ae8b96a2110c68ac81fa2439788b028361d29e66dfb419eda4131ac43fd593acb446141ebbbd47115f1c7f89e6784f4ac0de895ef1065a027730eae6345499df691883ded22f2734ec5c959bfd3b82071f63840b350e5a0462dc80a2bd0276ae6c068a11e89d8336e241424975b2768162f0eb780a5f94570efdf0cdc5a0988959fffcd91ac55156880790e49a39c842593116fd78d791a7c3af75bf8c01ad218afa532d4201a1a201cbdeb0befd71f694091ae2bf805179c3d8b22e36b683b17567037de6b7ad2add1164bd8298ae215a464c13ee298cf394f294583e6439b01eecdff897e2439662a52032ed17cc6af3877e1eb94aa2483c5e47723a1d318213c18cabe76bcbb0007042385105b7e3f10d9322710c1c39861c8a02a854ba734de937edb258dfd0034c6aadbe738b343b6a091b56a482bb2c74fd088bc80e0b724f4e1330d3936886d8c07d9c43660ece87e3c868c7dcbfbff0a454308e62aed81e584a65267d7440d1d1f739b10445612541c4ab5eefed763e7af49b7c2962caafe9154af66ff9315af944b24ba9ad515717c18497aef37774cd7c64bead74b71207990f0ac2c9d926e3946609f4a15fd9cfba2f379e015a07f353e0496976c74b2827bc30fcdbe2dade037ec4f62545e00e097a6da6c701bd929d348c479b89125e042a162b63e8b2c05adbcc4f1302a5675efcd096ded89541937dab2b2b9bdf231033ce128a546e53a7d6998fecd39aad764ed7657cd84e49286db8afbc200c2bb90c924ecbc9709a029b9ef49ae9c67f766db5f5541035640d9cdc35d859df802e9fce09d06bcd0d959ef13f85892d64b5de631515f5383c8f9269599eea585bc285eaf60a573ec8d4b46ea4dfdb05a2a90db3a29d3ec5352c9bb83853ccc3a4ad0b1ac07799ad28f44ed09b80007bdd12a5a2510c6f43a770db4c09a1d39bbcc454090e9aea45b380d0396592ac302ffa896fcd2b02e7dac5d1438bc6e3db333911f56ea470593cd544ade9f4ac498c05f794daf6ffa608d355a3e67bd99e14fddd306a4d137de15518e310d2fefa5e8539c1d855c2732e5263f5ea9ad3909e708513ce371c63942831b1d2f4dd7c7e16ac624b63cace52e80950a1019c35b546252d0a634fc0abd8e6d41a8a2a69f2ca64f0bc24528c06ae5fee21dea282210eb304a22f6de292dc02b877e76e4d3b34661dbd3473778cedc47c52433ba6de899fdeeb9a25a88b911cec169d6d39bad65438d18f758c614d1f088f42b841095a525dae3f3528ff183bbd03aacf7437621b5e10f2a926b7aa464c3295a6b2843094ab02055efd3a71659989efae1f7650dbf3503d1dcf6590eb764b3d5f02ea2e98acc180deb4410c697734f202e21740ef69d70b370bc016746039b81bdb92c6e06a5c81e52493b32aa58e56aa779a54134ef3eb17a3c899778006660d1737d43cb3d34764120fbe60104f04ec1195f8362902bea9c6151230cc8886a4ee46a2c62487d79e80b653a3115b465471d3b4f8440a1180907d13f4bd3886f8afa57612f94eab263e672580066a1c4fabdcb6aebe1ebd4524e8d970020c5339eac7f7efd15bfbf73ddfe450f8abf0a58aeceada566466bd33b818a8f53a5fd8752a431022a82b9072bd95271abecf484b92a915ce743df17932aa4e5fcdbff88d9f0638737fb1611be62094b449057c733c881d8a07da35c73a934eefbb253670a50965889266a63493c140880ad04a80b5c9302ee713a9d1b111ef08868d1d91ccf74170b9c8ce67fdd6f3f979850da128bc82702e207ea58dd95f868eff3739bb89cf042770184f0523d5eabd62569e79891e1f5bdf48ecb41abc8aa7448b79fa9cdb0905b0a9c3b11a75d0a53b90006939c0951d977d369e1f24b9fe167a32e3b3c995378dba8295597660b918eb7d2211ca144b52bbe707a377f642c865541f9087275604c984c5e51a9ec1588245a444f5cef04ea9783b4eae87f94b997618b798e66e1f4274cfdf001f92d67bb3e657597658794c8146604b5a344c66b8c9083510c407d9f176ddbe118e393b5aa030b7188e86dd670cd03fa281f46894aa7bf18e58d7764f66be224e620f805dfe60829d1aa40337961d71639e30a42c14dcb38e0ae0a8525b111d893a42cafa7635804f8f58ac18fec6c27805b57064c814d6049f131edcc53218f2d9c849021eba9937de3310a559d1f699d422f73f0c307a9e456eca1e6cc6b178689464973244980032746dfd3be597676a23e87959b9ca4bc63f1862bcad00cfedccd0303f905aeddff1a852867abd56a87bfd0098d24ffdc53f429576502579cfa64c02dfb462a3b4cac8d09e846d2247eb420868273d1db010789f2cfb8d5a60b45dc375e8263a743c01dd4ce07a89e2a932f62167e598caae4e7cc2a4af7fdf5a046cd862c370e0e45a34150eddf866e952242154049a157a236a81117e96ff1bb934fd844f476aea63fd489ac6368aac61386a32bf1b93b677747297de39d8a8a0064c37bd1d20a0e5b12e636b907200054f770f79c893928d87e8d8f5b0b5e638e3daeb4d32e154724c6bb6c0f51b011490304cb3605d36f09d99c687c8314d89425a9b49e0d4aa9bf9598608dc46836741d14288f3578635573dec86578e5b9c53cd51b6f6863efda32ffaa8e502cb50e53533fa52ecb7680ac8cf05197c5058011b1070ddfab89f6050b9d347fbb0d2ef3b8ffa5b15df77bbd28838fd58cc06a8eb48568c8a1ce4d36ae4a18a2b8903cf2b0539da51af7fcafe43ae24e51380eb23671c7f3da2c20bdff8c5cab43037670127b2276b9f5a40e20a436d2cf689fcbe101a446ea0758b5d34bc6c171d48c3461b93079dacf1d1b3239c31ac3a8c498e509ebe8292c46fcbe65f854173aefcf9f80bb396d003fab070f84ed8f77d961899d253bec0bf5b2417ad18b53650504f65caa22bcc8689d684e91776fca21e2c75bcae304163b122d7e1db28be63d3a1926f1adc9c33c4f9f2c6b0704ab392260597962eb4f7ed55cece468128eb7cf3986173cd3e26f2d73e90e86b54e2dba47f745d90e81cab13d9e618a3f6b971245624a65c5ff76a85a48863ae08f5ae1786625363820b64ee965f401f6283fdfe79171d4022c0ec79c9fc361b36d74203ac3eb1e8f29d06cfb1bcf0f7becdb1207948aa345d440813038a78aa542fcf2a732b2ff15f52ae0bdf86f9d076112f034295f6c8569e5aec8351d7a3241897486e2f8b508788f456acf97f11599b1b0c8d0447e62a511b9beecbb0257c3141d5c09ec03de390f91288d76facf4f070b717c410b80f2307bfa0da23bdf93bf0a9b130851f8821ad9f7441adb16201e091538ffd4bb513e588dd0161562e3b7db52973152632ef09589b583a0893cbd31e800376cea51e4af14304033b8ddfb7230f9444b97d783b36bfdcc0c4750098fe214081d7242617c1dad4c9acf92a5f1f3c36ebf8439dabd8aa20d58f17881f47c2be7e65c4fb47942315c41539a2a4006a9f8a3692f0c5db9a7a242f2e9afbfb45e8f608f910e4bbb8740182d439a9998f6d29bf88061a8d1aa7c943c327723b81a92c845eb99c44e839b59a42dc996bad9aaef3d57de0f99a34f456626cd2ba11a1113763cfcd83ffce717b3fee6b8f5a09e4c8351b7a0e4714065ea79599a4f061ee8ecd921e8efb10b26fc0d45c7cd6aba18986416cd1b2c2c2961a0ede91c36bc596da3641ceba8a29a45012632011fe0978934c42dbe978f7392ec0c6c3d919fc405fe3352e52d7622445a5b452c76d18e5c5e8b6906f103c6feb89b2045d3cdaf754654e3f70bda90cc998c5f0d9c752046603ab815a6f26348aae07f33b206ee133a036c62d7b58157b3ece579c90347c4098d47f8a47ae16f06a3c0048dd9a628e05bfb9fb8887478cf59f80b980c518011460de2f8d002a82014bbf0a039e1ffc290c2b40ea03f5ec70ae72109662b587c9061776b794ad294eca26e36231811aa3c2ff4b9f9f38aad3f085cce1fe6084987c969422c45f8b62aa9795de5868c0bb7387848b49ca687b47270880932d92eb5b4ab3b3b0dc885313f8888ecb84270b2281ef972582274c607223dbd36ded39077e8825a87964f1c03d748fe86568b20e6b541f279a4aaf120ffd63f4a6062ace4ecb2d53566d307e02d29544252a2260a59ed904a075019a3cb4f2dbb9d278bf0925625e02bbb5d6dfb9d2a6070893c1fe147285a12c577233215852e261124fcbecbee148e068cf72d119a928c199ec5cad3267b6e6cb7d75f383099f7134c32bb144618b0ca42d45232297a00670cad44a28eb54a2b03a8bcc545f7c606ffb867fcbbb88025cc40ea4194510e51490107aa370b880008e9e10379634e5383afd0f95aa6b39a669edbd9ced6de2ffd8028503a7bf655416f1dfd5a1991179a86c9ed0819769d9c8461407ff30cde9e8d355a72edd56472a99211a3b3e7fe5da6c47541c59fbe45061115b8b852a344cb67013ca01c77d3930c48ecd7f7d07d843407e3d848ba0bfa6fb90c024f5a174a3a997cd100c825116d48ea261c9fb5060c3869659939df3c38805dde198881907fc93ac04350a561f85f67899b6e678d7b9351e2939d0d583410bb137d4cc6cd8676aef4b571b610c3d5e694c2d3840911e4f4579952905af2d7343e35a971be2629f7b624fd7106431b1f435cad4ab243cb286f9f11fdd15c0a484c86782d8e7cc3bf124a9d091cb9d6ffcbdc469edf47adc628f9e5045ba98bd36eea77f37e57248afca48cf29944fb507f05ab4619ed015ee08a099ab673f295dd2c20784d2873318a400d94a01b90e8b3df2efb5b976e762099a7dc718508a6886f8dd0cdb11d877bed7e3bba9e5f6ee30f7b8834502165b77c7aabe3a1d816e507ebd5d1e0e6a59044d6d3f5448d1bbae19f589c7629382b557bb69a1ea3e33f61f90c0a3f4ed3009c29aca9c0f6f2fe9e2b4cb3cc49354b4731127b876015671861ffa7aa75c5c6a8a95822381f7595c44284c67d5f33008b56740ac2e9495440edde5a131ea943d11f0579bc7cade23134201731673a67e5c74bcf7b8bddeedcaf17a6d54b2c5ce689db3f6b422158c7bd1389fcc429c8296b7e50b11860b7fbaea0c62d963c46b2b1899868d6d1090cf2ac6fe695556283362ff6e089452f51aaea286dc5890d6182ab339263a137ef7e3e32db2c57ef1aea83b5d28207137245f8046b4871f79cf8df7c8e9be15567021d1db792513d6353fb23c57229b410254e4fe38a2dc6b701c77069530f4e1191c9788e69fb0a1df9e6817dc799db85e260c82468ae9da8489e46e98bc09a24063bc5c8b37c67ec1f335c4895b8ae8d7212952294a5ff48b0cf1ba51d8200dfb8896c1f64fbd27339a5f0f7a8660fc387f6cc05d5d762b7a2f7233d98593daf08e727dc6a4f516286d77b50010e166b6b0801cbe6e5b7457b0bdac1dc561f74b843aed6c5cde3e8dc94076a875e99466437205d7352ead681b214894f908709fed3c0e3ffb22f00c846e7420a7bda94ab89f1ea044df8e05ae36a1fb44513534660d4c031fbeedbbcff06c8126b641fa229d0d0271f000b3880515c33f60b6092f007127ac5d256fa630a40b0161a147b111ebcfba9b5bc3afc972b7d0cd9a5e6cabdb8a3357285a57ec1ab7a84de505bcc43f30a552ce5810231b7aded1705292434267eebe9e85b30da8ab801e97859a7261a0e472465e71212fddbeeba1c041e085827d508eb9cfb9fa429cbfcd84cb433bbe7810e4215836d8318447ecc7afe27ebc24fe8ee276358049c023db93dc601d1cba57069c64c067c0a28a42d776235254224e42b2a53128b2a8bf7313deb96bd69e739d1841d4968451e9f3dddae05f53dd3f9a0aa1deb7f87e8571e971c1e8e98e0410de1f8c9132d972d17cc0cf6ae08d682ce89a5832e9e9036191a94f1754c3c12d59b3c68439305849aba37ee9420bd97ccc11c23b1f18b83b6aab05697b160e4e21b847f59378e49bb1b7c1e4be265bb922f967d1288548a907754d8c89cf1064ad2338049fd001e19285a33a879a8d745e5497555fa4d1622af4aed22e688dff218903371b7810a0ba8bfa1f2d2717a400a6b757ca728a2851773a13797944aaf0031f8997ec42033bc4b780dd0c0581b27b52a659326ad720cdebe04242b27ce08334a43c94f7f4ff067205c8222fb3799ae27faba382ae9fe289d5775a4486ab00921ceb5a53e39b19d9631f5a7de5ac7f045f84c100b85ee3d5b0a7635d7941b26bcaa85509af3fa3886aa3dc69bb1eb88c970c1c94a28c07934aaa7557740907876f57151e48cab9c9b64b6b7512c38edc205e453940d33d25b3f62906007bee8cb36aa510de30be8783a8127e324b6f5e66d56cd63f73806cb374e7bb877c89739d0e5360a1e3ee8bb171d607c769d61b467c9f5536448927b41eccf2018dbd9c8ef86bb7b2333d94d47b7d6f8f9951128cc872d68d8c7e5c1a6a4b676b915991fedb9081d7485ac1126314ccf62f823e13b3a4c900d10a4dc201a39c946ff0e7132d70ea2736cecdf74b03591e7aa008520df9baf5d4120e74b1104955b269aeb4130c8343e4bed22ec0382fb131b6a37031ead37750743aaadd01c6d79dd7299b461f3e1a6b923e08ee07d64f719cc9b1b192a2167427041a5aa52c211ae43f4b45048b851bbfe18f03d9c4544803e32a7dd2769da07d8b0d90555be6c911632fd1ea6c6873a65099e964593fe6b00a371c6aeab5c94c9cdf609bf2289f03667aee9aabead8ff6e1fe8a66dfa840f01b8cb964e5676dfd95369edd327b2e805da6aceb5812772a029e25d4c7a290d32c6b5e8d8ef5651d826497ab3acc6cbde8cb78738d10821902007a505d98de595f0b55fe4cf485aa8ea2486b2e51c828a479a569ed4b12a20705f2962d3d099892cd114033c1fb915a1740f3361190a34ee0be065e64d3a784a3b15b9b59ed2383bdf8394bcc9d6eab2130d7a76d3152ca65dd90530b6c04afbbe558a88e923ee5fbb4f51e288021bb9cfe5c53af138e2bb27240e122c40405612212a070b2314ff742b76a8e0f647425230d3ac6cc51d8d82c52a323361df1053a3e80c068aeb00acea9a671123967fd0110a560dd2c5de5aed0d667096bd5faa37587f242704b174e7b662fda19cd56dbe88127c2e04c6a221223cca8942773245ae8f342d784625c9069c89e925a5829cfba4a4b557d2d756ef141f005a1da1e98be23fb1e391c6d960c43c5464ad33504dae59e79496a9a4039ac0b23dc9113e1d0b5ca089f5f06563da99a2f9e6d3bef8d75e08770ded20c286de10b2a1950dba9ec0e0ad41bd653da208cd2aa3b5f501a064d6a02c07183b31fd264886601f5a536bc82ee844ee548f926a139dbd7adac6860213b4b7bbbd6ba908f5b6bc6c4542d8eadafe05b54078a7079c289b9987ba89501b4fd5cfe96bbc2d5dec73672c95ac13ea47593695e6139451658817ecf44cdac817e7ce3a31889d3d1cc2b125f8b51c68c8125be1a691ac72ce2ab5d5699f99887e877af6a57f7a2fd5adc3f881a630d889d5b30fb89223fc23234f3477f7ccee0e3adcc4f773b433a607a8e8c5d003b3f72d6d1dc54681c19e2aa5c5081b4b804d75a9a1eac1e7db0b4567df0f167e5e31539f318ec8de689d5dc691621eb4ae5f9564713b12c0e24de8d70a40de0380e26295240d9fe22ae2d06a41df61a07e9e4367fe0ac55e41b79dbe9e8a63189fc4547b7426277ed2cfc75a46c07a299e110bdeb427301e204890a1b0897865e111c6c7e2ba1409044ebf7fee8a71fe45b77739e8cab61ad21090f9c15778d296bd45e98f56b923e3e675ac2570e2a2722a163232041105f4a78ccea93408b6a25cdb6aef06a9f88a4694ae8b64212e94bb94099268d4b8ad9e1e153b8946f766b899808f5bbc1f59abf7c5072707418262985e20f31cefb9ee014814c488344fec60b0c30fd2c4566939c329b5b6eeb8a82b1f4d5f114976967a332a0385cccac9991d3aa7fd6952e397696151f1a750cb6f57ef216f663873c8a2db156b9486638dd635600cd28d94afce246df662bd21fb5c25a01ed3e71bb1171e6b7114a4852c5fc25090b0c006ea9c085187937ca5f7abf6d3cee441db4407815ed05f7a916a2cdbb485e4d054919c5bc9a0988c629676d82ccfc4ee6722607f2270019f652fec3fa24e54c8f90869199473f0c1d5a2eb518ea85fdcefdb168da1a0849701907d0e0719b3de1144f93eb05973d307fec839f1027d8d84fb9bbfbe919231042a4407ab3025e3c61049398d3ec5a52b5bf2f01f2de47aadbf81291d3f4f4cde23d25036aeb7f83f501d4a8dee04ed3405c0da50ad6ddfafd2f89c9e601b860eeeb5f967eb135db03ac72385c65700141c15a35daadf7230c2a6afa1f95ca2d1b4c5b4a541d14f3913453c6440a268c0fc90b1a4fe8bbce02c511be5e6c7dbfbd131611d0c54b1527d22eca9a7055f1f2bcea27b0f95c2f48ebbb8a7796b4c40fafaab464e7859159d9f677860cff17fea32bfe0685357cebfb1dc841bd3b26797394b9ed3b6f0512a00c00f7b4f8352259cb1ada34d1727ce3d84db4f9b459d7cb601ed363929703d4dc3b7c5c78162e02db6523003e514d8d4784054a8bc78a5e0efe68f76bd48df97d20e93d44f05ff450355fa77093fd6c6f477e82df5817e16958317a57a62db32299042f1a97c77b455e5a0086f8888c0eb67713ce7e5db41dedc7eb57087bbb16539db5da0099d64ad426b0ff426b441f63bb896472b92a439d033da7a5122f73f8cb839d772c200bbdee6bd17540d1ac3dbc9e04c9e95e2747ce7eedea4011aa14b7bcf419d8a61895f519485ab5da3abc5019656df58a329e0bf12fbf7ee52fbf1b21c16c9dbd5e073ecb797986b7b8d7369b60a1b78e0216097995fcc487e9db10323f614a0b9333248af3bdf04e11a28a3ba536dd0c92f681947c5a1be2a8886d8905eab3f0fdf0763798e4da943e8b21e57ba9fb0f8100d5280dc0b5b060a9bf0a7c2565266729821b2b98f0c0be1b2ffb8d915ba0dce7534760d9160ddd741fc60dcb4a2db7da283a1b3847feabe321d81bd21d8696bb64f4d9d46b88ba9bc35a0f02e2fdaa36e5a4be00e82a46e14af8df92057a54d64b02244ab5cdd279847026c5a51fdaf879ba46124b8c88ae7b1cd61b098a0c1d60dae71dbf099a17baed38258d30f4ec699fcbfe2c884f274cbf7954a62629cf47f158b468d3b1c8e5a1741e580ab47977490141d184127354622e06874647256c3bc163c6ea784f26097c16c4137410872c04b864bb0e8a16d976f56b087a56261bbf71f077aace11fd99186ff899326eb55b627d856994986f1f9bcc6b0ecbdd8918bbe05a141725684d7325a14e00fdb711f5fb76898eff4944b100dc24c6a0e8146a16b7ce193a16da5ed9fb3a860ce019a754668364aff6c1d3ebe5b80a4f268e8020e560f991e7c127d9263da67335b42df3d30cf704f8993245efccfb5984f1487d62a6ca1ea7f7849ef021a598dcf0c332781377707dcb4c93613f01cad4dead88541302cea278624dee64ec7f9e62c7681ee94d944daf84a40e9ac4c101c22990507e91fd8c55cc213863bbdc194ec3d9faeddfd86c747d0e4c69dba52c916642031d2557ba2762c74c75d501c119fb6b6cdca601df9442f68057f3dff54bc7027f4bd8bdbfb8830af6f1a33777e172df7f2f3ef584e83b63052e48522d2f88f47139acbd861456f3dc35ff2116f9b68af3e2eafc42e7b40c6257f64fe88e8c0e2a58f88a1785d8809757eee2809f20fec9bd1b03772f1f83beaa41d6b71c21e858c309edcb0ae6090998ac54ba3201c223b08c3e8b486fe53fa048805ae0c3081dce8e54f14405c09af9e37987956c7ee213ca79f8119b7e40be65daf9eeb082780fbb8b2f88195d615d5cea189bfb185e7512a67d41994602ba82b26d7c68e977e58901b244fe328a0ce3c6819aad34ecff9b79e9fa4674a4a65889d0300f192b83cbf0c56f11a5519717210f3156b3c02848131f95eab089305393272a1f241b68fe2388b9157bd764c8ed02d850c196cd346f4136e5a0f48bed71f571a9a6be42b7cbed7f12f3b3321ef341d36cdd967e7f154afc492b9a28b5d5c62c92e7f62b08786153dae17e89f168828d2439b497ad429335b90b7e4a511aa097b48c4e04223e4d13f46945bf1ec999baade5819031d8bb5668462431a78ca0d984a3e2fbf8845246e660d0abd257ce781e41e607970e2a494e268c74bfd54ca2b624418886947c475682ef6bec919d888f736fa00d801c96cd02ed5ca958d641c6c65973563723b59499446e529109517a10b9e5fd8314e65a2655042c561e99bb7d648747c71bec9a203c2e4c6b2cf23a7874952009cf1c5bb2f2e28ee533ad538c93b3802b44e893999a04907fee0f92d2434e129ba3ade199471583584475016e16ddabff99e8fb060fee9d4d170b23dec43ba6dbeec87b9320d345d452ac2819da708172474ae3a155c680827e5b0790f9216deb0879ba987815b2fa71382a2a4dbf7beaeb75dba7c47c2a21c3a38e0362473e9f329a633bfcd323a137658c4f15fe0f12ca7522b508d723ef5ce2269b5a8befc4259560e598be33823c0892dac76de57ce98643c704d972b2db600297c01a977ce19282add97f5e1bc17a7342feddefdda36d77a20d04d04b03bfcee96929d42b608e559f84ce62c5e9331089765ae20807fe4b3d62ab0bf51afab9597e6a06c249a1ce0e41e50221ab1d4536400259ec2b4829f6568640d84726892ce659ba4c49ebd0f49be29fc35b278a58e1ac38081266e7359968704a46cbeae109f0d650b4ab84f45492bdf5ca2bb2e65e5f9b43095e27d660e5be88eb440710cd57ef3eb8197b9772b86e7cb784a1a5a68ebb4a51cc2093893321895c01105f045e3764a69b4696d60dac6882025d361e0a5e5ea30889dc4e0af4e5772b35a8790678e2e0794fea5664a944d3fa1286ca410d10b52cfa2e8db93e4882312194a9c163974addf1d6ed2e48b0f1efffe84e8bc4030f3c4e5e4c585c12ac4399b6d07234f1c5606fe7490160f92ca8b855ffa30764cd6998673507dde658db6413813592bdc8099b5ec770c16ad7ef74f4b00cce4f86b0c4b099bd572dda07a33b295e75f9f02de820d193112952cd1f4c62598b35473cdc78baaec8cc711a32676ec3221e6af9201d604268772173c0c625b0ee0a25f5e2632102400e0245057eabd4324c2f3971a273ce1843db922c2c85901c1de2fa58ebf946e52070278df1b3e42f02d44fa5fafef9aaabab05478cae829cd9fb7f54634a7d0ec770a813ee4a1bc28ad5e62532de7c4b83be82de8ce4ba46b26a54e47ad09afe9f1a06aa7c1f10a4d1cff0a6418e4eb13678ecc70c709b89f90bb2c6e27cd2dcf64c8e12ef45c4b04984740d2e80870af83e5f4376d77f571a440256c58ba6aecabac39b952736f6c85282376625e363de9cea4a533c0eec5947339876408ac4d8f690e431f9b5e8a580b5753b89e18d0d6b4ee8e3495d7a9e96a7f1ef1e3a6e9dac08ed0bd6705d819ef06a5dae0fee289e803c81e5703f4ca08cc924c22e5594a3a8bcd75abe18987a37b27fd97e27884342411e70ce484a616de42130060c6009fb76eb36d7b6d0a59d02d806bd92bd7a67372418aa3a917805a9317b92f2ded97af972cfc6a589b5f93d7c6571dbff36a2de5beba357730880c0ad6c6832e3573f092cdd88a4f6e2a226783fcd62b7332c6c9d2b0e8211b5671d9f62b96b11a997abba67d927ebf623f75b1042196e11db611a54a52b880d4b481ee4ee518a8c800b3b44412521bf1e49f3282495ecd07a46a078d9ac8b4a21bb362db64431ab05c08db50c958117d25e8437c0155fd5d8d3a14f32ac0499cdf6c33702c6474c992f423f9a087ba651cf6f98314a96ae9425fa09478215e8c5e24afbc90cbe243028e3604c07891561a3fd6c27e75098e7e35ec4804ff7b063e91b97a2392f627a35c5693142975b25049dffdc7e80a27a231376992c688e95863c78c3d01adafe1c69195b67c025b7e3c9abd5dbdc117f183be1aa34f6568e1552c9301871155105f91042c6fc2f0aa5e38862b2ab5fad8cc732d383cfae3829a7adb0ab24975502e41987777d446e911f7041747ec0a453a1040f23314fb688010cdebf511e9903630421121f62615829a3ec29a69c5d66bcd8d86aa6a834d6c3808912c2743004e72a0610148bcc376647178693a6c14470e9b25654d81601a8fcaef384720bb4cbfc704f009e3eab7560823d4f9506b003fd413cc154c71d645326e95f0402d1676ad3a9c645b8476e1c4e4b5d85c239cc31de41022f6ae103d46a6ad46506f997d7f0ff48f56cbb6bfec8cfe16ce8be2a60a5ee37b3b6e35df95f9129aeec1865241c13f82416d7b39c3339ffab11c94d9a242c6039dd518e426b5d913a190d07018e82618e44a6131fd8d63ad05e0adb51475e0bac8e5cbe291e20282a9f6e94b331868f938153017144fdef0e4195148f1543fb52c4a660a9a963b35200fa6c65fd4e8ffebc53ed7da8c5288bc300d1fe53c7a4405e1821272c4917ddefbc3162e982d0ebe2fd682cf3ad29be479e82a604e88d76c8f4ffd74706ac7a4a32700b6ede0d20e0e7e22f66c1ed362dbdb61b9aa9193faa8038c0c47318447f2ec51ca11fdf48b2fc9390b4c66b7eb3d06cdf0ae6bdbb820e14e6b84fa66626be7e0af283aa213aab32deef1805d3b2371a1f821364739714a31a5a32d9603818d3d48cf69da03fc466dd950a2cf1497cd733039c1e57315d4d699fde4012b56fbda27f7f9ea7dd23b7149f12df1d42ea0eaf4f877463809e9db0a066308f73a72e953321c076522569ad40e1d2f1af8be49b3dfc144d0dac1c51ae1c5bd8dc44311134f4953a95b63c013bc80658e98e254e460dec36b00f33c08cde55a43558939fce7eef859b65b21ea37a89c0e269ec5fbf2e87dbfb5b6c6ded68dca787761ace2fb26070c457d4bf6c9aa8963adbeb8c7b243c812cf4a7404b8b8d72457f664059ff84038f5e4dade6dfd267d9b405581098643f06e5dfb510f30f04a6309bf0f1891219b4b0ede52204e837fbc60c3ffc2abdeb5b38606a480630e598d0765363a26c6558948c1b38e9b8906b4e3d2cc248a596be25c8fd2f018eb38b2b27dc0cca1f700a62b2456d65520c6dafbebca29e0d14476f1f5b18149abd96b6635ac8bfca5e432078dffe29654822e5ffa96319bfb63b614a499e38c3178cbe1bccc2a4b18c3711addae90e25aba8f78117af000d92c0626c6b90aabe201e84c3ab74e91d2ead099c18b298264011c66942ad1a4ae3b3be93cbde472042d359c176d50ccae3d50c0b5f0bec2382496cb92de3d7865c75447d80e95b216456b6c3cc0422310c50370927b007d61a2b9e9b6aeee2dd15a87ba89970f2418e27fd5b311c94cc01b686c729206ed3c8a505df915ebc75d48a296a03a811ba80e3147d6bb4e9267da5deccbf3aa5f51d03bc594863361e8f9ce657f74bc614ee6b407cdd9cb5b2bc7b17353c95a8d678e47ec357005ac8e0bc69a9940de226d2ad3292059459558caeaee0ca6367574b594725a39c3f865317076b874c7e409d66a174b65f501b31a6cc76579ba4546b329710c0bda932e98f69709eb447ea8fe81bab1b3e426fff088c09a2df7f520255bd865852a6cc295f316bbd5c06493381bf74896b4456870b82edb706fe6e2c0b1aae7135d4e9caef83be5521020709138905dcded85e626acae32a55192bca69394a002bede0167784687afcc4368a4ba4a2d92b2ba80aff1b90ccd494a521a1c33fdc183a1ed5b5abf4195e5b080dcd01800995caba400751a70aac271121ab3b8f46b8efc8336b933c26fbc790c5431954295c44f3c8ef5d123929667f94aeb81150c7f5eb8c9a1245e37d951de5c5c5a4616009dcbb33c2da3b97268447f5a383b870b42db94b59e0212d5852c22a96bbced81d01e28e97ae4876d279c8cb0daf4a72c4c41ba0cdfe7a9f18483a4d156ffbd72e7436b3e0bd51c4fbc0962ee9c967ebd1349b581d5193bbd7e577847404ff62cceb2c2c97f88a7fa9b899c988778ea6f669e8bdeff3b94babeea8c559f63d357bbe22f2f2013f2b110f1d5687f4c72ad6a0e9018238ca5e1df69ffc1274a220cce87b56636485a0f04cb1183ff0063670b95a1329ad781670a8b79438fb2cf97f33ff87165f6e1b231caaa758c2a71f4896236ea40d46bb605eaa86d6a428641191a4364fdde0cdd92b220885e1ec60632f4d65f3e24a37cee3440e68443b5825b4ed775fc5d55a84cb489ed4f19ecb6bd38d5cde25c9cca6b70de027cf9a9807d6d7c3d3a2ebd81fe86c8ad2760a545b379d65c36a2b76407883bb96adca93217ea40ab7f14da70eed36b46aa8c5b093205f9eb2b4d4ace365cae28eb1f24962773cd9e930360d0dd7aece338a452b52073a24a77b5bd2db94531951201a66c7d8c77b565671461b36d9b1ae96d0a3c8ba46d7a8da49089718d0d3d7c874b371e2e0eefc301ed7ca444486cce42e56e23b81584a0907bc8a46c76462fe4ad96fc3ccd6a4b39304138894638e01e78c81800843b053aadb22ddd3c19570b409201a822fd2c100a8d350d41f51491a3b194d0c316f1b848d03a5c5e8198731092f1c82f186846506b4c39904083647ab5ccd6ea94b99ddc0b11ee987d9db126d16ee371146554ceefae8466a882b1f1de7fdda19c126e668ef2ad1336435b48197614dfc14eff163436b37c49af453befbeb44e9a7fd9468dd5aaf11536111d1b46e1926aae942884e1b35faa425d942ec92869b8222da44f91b3bb73381a49b4da501f7dec344e8d1eb597bffe1e72f8dde246a93783a41ede408ef08ab951bf13f05a52a990492f1efe883d19c89ef08aeafbd6d335fed1f5fc7edcc6a3a1fc2796f726ae40da0039d62898056cef920b93c74efc95d38863626da853a4cea66b08df7f8ed8b66e6b77053781ee03e256a5c29391e33343b8cfa7cc07b41dc3b8df5ceb7c82efb68e75b9c67c8f96d5093b0702f353b08559bd51be695ec67a071c77c6cf9235de9c39e5405a7edb97916b66860d9e0f9fbbb2ab2fc411f1b05bc2adf7593630eba25b5a2af414f164723902f501d2bea332c537f91680c6caeb795751d2f2d28163f45985b831133bcc7a6f2f92227d8853242e3985780977c527e70ef4df4030d5d268705e97d47a6eb0828990df05c829916939c0bd6ca354593396801ca419f4a83e53123d7c547143910b7fc80294a407345c58178bc0e91425dd0d44442712b7923e19b5f8b0aad4385b39e8175bcec0855b6ab26b99f46adf21007ae6ad8792385ff1c0b4cd72c2d04e243a40e61a2d38bc4ce3f924d42ed7c4cd108adbd8e3b8fb881a9de57ca7040e756c24d91a658c9503da92e93f63827810dad8121ab8ce0af46a9022d4ed4f14bb849e0ee85d260f444ab580777e3d7f444a5279f021bf4888dbdb160dea3541cbb721a18dc2466933dc614ed41a96c72fdca3ad1d143b3892bc034713c938b1e3061f9d75f7b646a32fe8eadc150000012bc6bf7897f25bc2c89c13ca12880214854807b7b0d12a8938ec5ab5d675c57a2ade33ea25c49646a48fa82ba6500c93d21b11675a1176d83a5574060fe89ecd4625340945d1187f3b09fc0ae827fcaa79bee429cc647858675cce4324cecb731a144a8ec411ee604cc8838620a94f2f9008bece558658b542064e0cdd5fd723f0ba45395fedcab11e6db556172de3c4e30242b4f8e0f7ffecdfcaf09fda1d6ec309a83680ef985c4a5800a1d2fc3f64ef662da80aa5127343c9512309e23d77add5018c4ae34bcce408d36d84b2e53e511f037abc46d2c0cafe651514cd097776912d6528e81a0dd982c004fdabec5bf00f1b2506309e46bf086e06275eaf77edbafe9569a1c38d7d78ab841a1eca1adae80d7f2f4f13e2d75af367a0b42fc389c3f3039654441e581942a10768a2a734fcbd21a3fdc7c3df0e6cc8dd9892329d3f474138576485dae14cad49f4b85b16e1cfaf95e13488a69673b1f822bb8d5d6132b184a6e105381d635c347661455f8dcb631869e7f65a06f1bd52327bd40942e15309f68d84befa937bf564278fc37572d32b326de17cdead88392d2764aeb44fdb3ace15129b23c0a74a7708dcf644cf55e6bd505f863b034008b8952a89b19be79e875b76e8b9f838fb9ba81e7a48904d321433bc7b1e689b9e0fa6f688d01808bb3f2d10dc450515e4ef4586c0813f5589ca22acebb42509953f05e6123c512446a59ac5a619065e277862a86d89f2fadf4bca34608271e1d45b16406207f9bd67556b4a682af0710df9bdfa98e7f872be15490a956ca465a142570073ee82c20def557b4c7b3e4838d2e41f36e30c382600e83f0c534da690dc4976150f620e8b615527c47b7776cd41183eb6c8310f55944cdf6ece7eaee5004dae560d948ef452b0608c93233b47e76b946716ca8896612d957e077a68d5d789e6ef9dc07cd5aaedb1696a6a7cfac6060f0d3ba1cd6db17772e5b5c25618c4c9639f668d50aa60f674d720b45b6b9e20eeb84d349c1c5f261e47d5c268f884f86d474d6f35a9a3b0f6207c368dc6252fbb65b3642bfae10789da99e4e853b2f65ff373ba0ed0ab872e5c5dc5486f41c4cdf85aba02ed744ff238ae360b57d09fdf02f4d4ee47866372644127f6e9c7c276764fd238ac164b57d4971f0a5a3b5f8d5a75496ce5d136d0561fb3441f08ba63c459756626a319c2ac769eb0e8e7d39eda085053d0436166c4cf278689704bf0218f244c03cc2443c563c6bed6638a890fc28b5787de0bd3ac2e437c367e2e70a82382cf7c67c5db7072f917183a5b8e38b6e71c29817fb30447022890973aa2a15f26d2570c0d424bf4cdbf3c4c1ce880a4dfe6ffd536de8499d4a0a8fc13676d321028099914ca51c2d03b05b712337aa885258361c01bd868b58c9394a8b9b7c0358ecc8bcea2c73870f38cd4a9ff37f04eb25a9d1505b7fc85fec78c3aef616521501804bf77813960f4db413ce2e391c4cb17632870017450ef6ad5b46e0d0213b1f3992d73a8a52e6d244334f434a38d6ea5b828a761c31b04591c5eb6f5b44dbc27a6e23fbb594d24ba515f1e3d68cabf72231e8c95a1f2458c5eb1d70f518576a3bab31538833b11288cb51e00d244cb4da4da151f684552759c36398da9fecd5933caad53e46fd0b2a33b406dbbbb39228a9d48ffb03852c2f964a69f65b816bf2cc29e2e04e7b26dae414f447849c21c2a5b5a18ef24e3958f4013e3b049af077ddd807e3a6a6599370258608b507b9467904c9665e291caf202cb491c68df26f44754a0d91d72350b6e3d7df039b7106f83bc82f026a022c8856700e0a3dd409171a47d472be6f85d521d0d27815b3d42201352dd23c60dea15b095dfd01392883ee388d6c6ad6f22e7d413d344131d41da6f599945be9103119d3342538c2da5480f53e00f2c46edaff94fac624b97b864d7c61280a0f6d5f3759cb763d28d2d9a4b64fc4fca0fc6d50097d308cfcfeaa4a5c9d8bc3ffb40686425f029174f0c5d3a433e5574a14393f6f1939d605352f4a93909821d67c69a78b129b1e6fbcdbfa355b65524a3971b51e08f4cf0dd259bd8a889401cefdc0aa7dee89a74cab788df677f36b50eb1f9d514998e42b5c2a652561f2bc023ecc0aae7be052d2a4ea550ebdbcf307691123ab9ac64399049a8de5c3d21839dccd6bc0a792e11b71174370236493f0df41bab0acc13991286e3c69c6284792c799d9b3258bf7189204c6b702fad6ce96d7543648f3870a3897cd586c52e4761731e2bdb8683019db49c0ec7af625414be599cf34425663a068b7fa7e227168c051a995502d3de8c70e4a3f944e01c369070e7e3e5d6b936d3c4dbfbfd411ec1e72b178c30b9e6c1829cf6c7a03ff316c4e12481e2d3d55a65d1c7b4ef5fd5da45c9840eab368db9a1d62c10e2d13f1cb9ee006a77889d925e80ca411953b0b2eb5da479fe9ea031af428ad7980fdc641e88a31b111d7f8788f76cf8045b623bf69bbf68da0ee4240bd771d9b8cc958e12bb5d37805b86d005a88661b500ac61402d00eb485ceb0901343a032a5bca765b30dc11a703190b57b53a0ce6fa53e5e5bee68c02ab3e7b2512719a52cfe280be93b59273545a72986599c080d4eb39c380705f9c739e77f8dea5117ec10c42bcba8a5375bd33fed81ba80295d603fa51486fb2f7965b4a29534a0197076e0729071703ecc30f7c0136c9af95b7c0b14b35f30149fd22c64823ad957e371741f4c7c67eaf426c582b9d5936461528179be816658388784431d18fa511c14471f46c6ff4fa76cf80417f2817dc794684fee4419e11a2b73e4aba1f07bd5b72bd833938411de8e70481402050cff5d929b9dec11c24b212a9ac576160bb1b91ca419137ea88d878ea6ca20b2aca1f09c1fe0d5d502e2897171da14f211feeb7afc2280af609edc384eb9f298927d0a75056f4134f22102c95ba20d813256a30b9fe3598b82974c1d9c2951f8eee0f045d685c6a4458b0ef829a33d0920bca4d21c8a7566b47a37f102c9544a9984f012e2789dd5c918b65e8f51719e166c1c8002e2789c52e8f8b7a54229428d8b063857c321f2de473fd41a21d4f9484543c8994d030fea231ae4fe1fa17d7455ab8f70e91cbc1276c18f209f98494380242d18ec8e5a0d3dcb0636551b022253847cce6bb9c040b4c4429142536ec5856e08cf1ea58abdbb1e249e472b1b0a0040b53c4e326d0bc9c13861697037922210e039a9f28656b903136e86089a2b02c33bafea2d70db27043114c8789859acb49c668b95c4e3286cf15b9e249948a302e7265de312452827380ae08250c2b72f9a3806143518a95640c55922bf4e45441c905c0e51c2aa42ee72091103ff14c153c3757e46272fd453b2e82b989ab68821151cff56f2109c28f06a23b5487b6a88b22b9feb426487777a31cf47a3baf67e20cc8880d413cae9debdd55ca087239c8afeba09c9b72d0855c0dd43da163c51388491021ddab3661bbf93c4c1f2e96074020b3c2be6af0841b8a6013a03d2c09c9c0b698f0badd4d3c8178bce7e6fa7736f1d4d9dc1c075de77a0ba4aa367685ba01e1a4ae3f4be4ba410b442e207c70d0d9c7b6c08622973f8d895c2257f7cf6d171b185c3029a594523e318d1e4f2486f1af60e7841d5161259d5956595180711557a41bd28bd4433a42725d7f9211528bc443c221e55cff2857562b2b5f59adac5c6e375c59cd8e42c618a38c1a16563eb7b262195fa51871d033c0da58516cac94554a13cbd2df97e5067afb5b317251eaca8a653a1b3fb0c1b291f38971fdbf1fef07d7df63d5f8410d1db0a9b26a20b94e038ceb4fc38765fa493ab8fe241c92147c9a29d28a89eb13057c4a594598c9829516d894550d29d8241ae235562cc3895e50c3c8154141e3c532dab7ac5866fb1327ae93562c33df3717682c96e9dfa4703d6595628465a610ce31059b660a18f44f59cdd44cb914a455465a8986b829c5c6c117b029058a94151429b12adc9595135efd141bf9fe2950c8552c5ce99a58ed862babeb95c61256b7458a9458cb6a65455a51eda3f1ca7ea65866ceaf5e44710e29515c709db990c296e21c42b61fcce0a62e758d2595d890b4bafe35706a2071d37cd28ab422adb24c3504dc5ac68a8b514697f2c54728bf516b2ca3ddcd5c2a954aa5582a81e068646d977c4aa20f47a5d2c997e14418cf5811c6a7beb8e05306639817cb7c2cd33783c2f5cfbae053e6ca5c61f88fcb4d61d6bafe61a6e3e3a630c3b96e0ab3d5f5f7277e6ee44ccaf5276e587b52ae1337ac4b629cb4e947e3679e100900a3f70ececaa3e3a0534a698b725dc332eef429bd71507429cd329a514a29a59f640648ee002e27a1a2757b037547a58ecf061d7abc28102db73f7339f8ca5cd777b2d72a7ea1ad2baede7c2c0e10fdc99f7c1d6089cf3306e0c2cf8ce879c68e5ef4e4e92bc2f8d39583f52605967e5857b71aa9373be8673a3e9cc38f60c35a5b3a2e4780cdbafaeaba162283e74f91cd554510255056154196b88983b003d5f5efeadc71e2b1cd5adc4b2fece112316fd7237eaa33fe15c9ca4db42b0b74f29c57e4e4b9a65346592b11079d7e585f4b622aa6a182c010e4fa579f28e9ca4d6125723dac2d236eaa47dce4426aab48ddb1617dd55a635f8797dcc43e88b8897ef2c18e013e633fae89a7af267e15e6a0eb8835d72b0f1636cc60d7bb27fb71535337c5506e7aedb8c9e5266f205aeecb154b10b9add37213cf1013d2c26637ec1a1f505ad8ec9565f55579a830e4fa57989b46d75fabd184f8e905567bc44865b0baa4c660543872430d75438523dc500be273fdb3b0ae6ecfaab403cb0ed2fa8a27caaaad97ebf5aa3118caa7e6facff5cf70e249f4fe192b5bc593e80bd9312c75d4ed584d3c098061fceb0f6aaea829d557e7d32971d3cc62f665446c585fd507477d5d7fb087eef8691e711887e9968e9b5ca6f9b3a7878767674747c77372261224376c1b9bfaaaaf5a6f1cec5f1919a1401e031659206149165974c1c510701046165984114626856c959436ad1d22ac21383aab66958a59c7037a60198fa592118d8412a640cd1ca1b1e03543db0966b972a4034b03296e019c7976cc212facdf9061bdf2664117d79b6019fcbd55397687d9363fe249f34f5569c44d51a552cdc92de12e7671bb5ea8203c1ddbf9a18129b9fe5c5dae964da90482239fb131220efa4ae56096c92fbb19fdfaedd5aeddcd953b7be6715d90ec766833ebdaddb53bab2f29a5557ee609116b880b2af241bc0ddb5ac9679bb061bb6e6ebcda051bbf6fa0df2e07bdba833b9ee32d6739f81feb4d91edb9d809d13565dbd552d832222b371971537c97abdb611ad4e2ae1512742be0eecc0afe5e90e0c6d85d7b576ba5747e911569c26ecffd48d3a66ae5a0919b2399103e32cad404f26eb19092a6ac40e5112bc448a594727e943be04020909be229fb92d7284deea7d20ee6e1010e96ec0d2cc8e0c4c183fc521c8dc007dcd83f224cc60000b76958226597b021019d526c91c4064f743183264accd0d51232a03f588206597c1f616a40109df0c50a6e1cfd4b0d2637c5e7865faa71d5e544dd3f343bcb961f597090a879e5e50e8746a12e0be42621587fce6e61fd434ec2fa2381c65533aeba1e9b9834a3d964c9214626199d4be6fca61858b4c32c73cc5541a4a185b40cfeb1e3113b06f88cf69cf68a33f3597290dfdfdf0ff23aacd5f5eb56abaaca8eda7a4cd3d0392ec4f319ae827c88a738c3ce6ab95e7746ef5c7739a8d3ca691afa0aee2154213d54647bee1cd033db67c41133dae737f10a2d0500b919185d22b8c98d1f0502a25908c11fd22f22de22b58d0032937df5369085f3f32dcbb24702c84cf621a1fdf67d42f0fbf471a3967d49648f44ad59f61589ac3e12ccfdf5b31186f91e2181cc1790cbe8201d80ccef5bf26f1362a38c35e8cc8f273953e486af84286e18c3841b324b83c10dd9e5451737e4d79ce10516377eca287e299e803ca14410929005124ca184d44cfc1ef1548117094c5084248a58c1c44cccc0cb49bc2872512e27f122053ce06e6e4a29a52198cd8360f7d05ea32cf3f372afbd3f6704ea87831c43fd883025b08dfa118da841ac3581a5f34796d950e7aae0146d4a9972ffa8d5fd6390717e1dc5130396f0b018eae76387f6db871cdbc08f6e41838039c0a6387fae4870354fc65903cb9c837ecf0086f1f711c411a03dbd309cc38608ad3860c518b3988d4623e67a90849060bdb9d8597767dd31fb58b9bb6528c6af66a010889981a6ea6604f25a332cc028860ded88657c87edc6166474341ad51abb1e4c9eb36fd49792d64e734c0cf32cd58059e11c0cfa976274d810b3e26e4ec13233f7f4c0572ac912186cba925cc103b33b1cfc763b643eb76374dc242915c12a12aab5a3d13f08964a42aa1dbd7d50f4335b73f6f0f18386071dd867728f4adb677ab0cc0b778e92e0f6c08bd1a41b728b5bdec7b7e1bfcf97ad1ea21f284437b3565114f68461ae7b61ed1aed8d5f77d73ea4d62aa25518d2df846429fba5d603d0b066f82d4b3f5fbfcfd29fcff40cff540da9b5dac898165a7c5a68a1058f1625e879d9c20848d8620b1e7c91451649086389192c66e6549c0dd7e2763822dc100e87d3e156dc91ebcfb44529a5b4a77866e69ae0d364a99ea3c1754e8aeb9c1377f3d97c6c16d7371fee33627b2033da17dafa85f5b71f6ee618da7c1cf499101876fbed9b2c9fadc55b2b6e2dd636597ddade00575c7f518b65e8778a53cd1c8719754dec3627eb091b72aac9a93895ec50568aa1712acba92ea7e2545936831552c1139ef0841ee0c00ad11150df5f8bed5ddddddddddddcd6ddab55f76fdcf7f700084c20b485dd425bd8d00d7b35819605f58ab342ab5557c70a384b64d9b66ddbe6f5cd7860fd7b05ead58a655e9a066cda9a154fdd87be7bd406daba1dd973bf7d7bdbc6711bb77942446edbb6eae0f6dc757f680b2bba61afb62af08038fc4b55d0f1462264f3012446cf9d3ef800e12627725d0c9eeba06e0709c65a432250680bcbddb0b34a433f9c6041df3dd7a5dcb47d3a38e80d60e9ef3e1f11c61b30453f4798ee3d161f3dd301d18778107d2cc4f6f5b90f7d35c28440946ef6dc4ce609513f0472c3fe84f861730129d2fd04dc549ffbd083be05b04c117607a6a1df5f0796d93ef4fde83e1f9dd01656bb61afb855afdac88d9b46af5301504796a4c0cee956bb9a676b9e62fa70d31044d4db2f4437b91bf7dcc70ef68f5511f56e1f4b731e4b7f2dc595b1e21c26b061a756ecf2c1839bb2e7981bb4148661fc3987ff8ae250246ed27ad520d09711b18d03fab05717f4855dad40209b9410d5901c075b3a2e075d9c8f4ec0d2ef8d0aab815fb2392686b963bbc4930118c6ff07ad1b5871436ec98e5e0d9ce3000ce3af738350854f7fb5c6b48ccf39a0b0f1fbc398989839fbc5edc3d6cc3c79e278f911e872944ac984ab5d2b57eeee089ab4d2ba39ad5ba51288005fce4277d997801f6f6aab6ae6484423a094d266e65a9dc1582ac556c7c4989898181da1efbefb8c38000d6b26f44066421b13a30ad1b801b8221c19b6aa6d3c9794524ae7f5d1aa19d82132edebe4531011c65f030c7a1ad8de3f88789a0ce3df6363a5347b970ed626d821e4f5ef1ee2a0eb52d81a140de86b220ee3350b3847132c838a7354256cb53ab00f88f1a1a273c8e69d169ae05a31f6e05139c8f7eb5a2ba54d388e638efb39778ee3388e7b8eb5b90486712ee60ddde5bef9eafb381f00be0731b049b624cb8e21fa7de70e9268f54d1937713819379c38ad71dbff8340de4c4d2153c53986d838888473b072600eb6f6c3444cb682b9b2d9e804a2149d1cf31b1566846a36ff60b62927283254be94910c10fcb736bbfc732915d913149452e90404ed176331fe30e285d5dbd08461a47d3614d79ff6efd811e7f8800d4121c74e34d5cdac183ffdb839d19b08e3fdb4890df96098f925fe31df6704bbd3b9c5ac1a93b1fca68c855dc3de9d080536e41a198bfda0acce455dc0a0d6ca959f65b8a585c420773cdcd9b57da11c580efe1b15b66fc86e186fe211d7de27111528129944a611ed9b11e7c369138f38e8d626c6f9f4c378b30aa714577b99ad588673d05eca901d94d912b8ad06dc7663fd39f7e852327fdc31c6edc67677b711bd018e5fc2108c356f7c99e32e9dd70e4cf2dca8f95c8f1f8b6bd56aede871f868546bfc19e7ffdd428f0a5817871b57be1cd49868b119a02746232dc6c3baadc586b0b69e1a232e6e890a09cb38cd4aa7fb09096119df7460c311d70f554b83c3afc55a11c6bfd56ab55a7de54b867078e412a944f6f0f8978dd2c68f654e07f9b26e38aaade9b0cc12ad3503f4021b6aad988cc91ee9e3a6506b5d3785201e9d0b6b8d6ae88166a5d33f42709c0745a41595a458e608cb7869869f5aad1d8d5c63e2a0bbb490001b4a004c83960596c19fdfb558cbca979b785886c64d7ce52b9eb45fd9585595af987cc99716932fd9e23e838f3efbc2e36facffa41ed8f9451047a2c2b214216ff642886ef6d10fb5d8f5cfbe22fab2e4d0777edff9fd107fca2fc684889b18247fdce4517af30c85602b3720b0b90c84cb391fe0b9dc7663fb55e58f9b96f8a94a2692090d4d9020b7854c21f7e7cec0ded41bbf6ae32015761be2a6a60faaae5584d1b961bfbcbf4824acaebae3a7ed26c2b84982e2cd76134f31debce2291e4172fde5176f6a18b63f6635f145cff671fbb841c1f667d996bd6759c671918bed5e4310c7f6d9735bf6dcb6719fc5df9ee3366edb70e8104936b0344302852eb877ee9d7b7fee0b5babb5dedac925ddd8f9f4c178aa957ee1e8725b37d7931707b58d7e8965fae9b3002efdd9ed3041b4c3c19ffb401cd8e1e0debccd7145f4e53e1cd2fd4936d8e24533c510cddefc32d4a55fd857b2e460af7c7b04ea1251a5c737eca13441dbcafeec76943847f65d1336cdf528959329a5a1f0882b6538c36d196ed7e4f0b901a3a172db4777fb5956d01702e1694ed8fec99190581e0d844aaf6b3a96fe6e6820b7dbab7193f4e1ea6f6f8e3ec4bc1e3fe61297b8e4d525378bb9d94b2f2c952aa8697cc4185def923a393b244b3653a734f4241ad86ce51271c4ed4ffe38987d5f1dce91a8b0fd38dc84c341f90efebba22b7a6169730e3a7378b9f3eb9e48c244e76eff57e37edb364dfbf0448b8930da77c7c48e73d0d6cfc5c4b08c5fed21e08301f85435ed354dd342eeb99af6ed951cd44007b5b086e0d53ec65fd3be46ed396a1a173b1e7fb7adbfb7edeb0f11acd0c11633b440b1cccae5f8912347fe81fdf4ed176e444d0f5ca6fc09d14d424983c8c5ed8f30ced1345aee8c7e9619373ee9c6d740ee8dee8c8ef3b95a433c51da104e4e9a55ad6a363fce8a2998bc91936635ab363fce8aa90893936634b3f971564c4d3aa9cd8fb3e4946df323a3bb8dbbb3cb03b6dddd99b942619bacc0b0695185666b8f72d2ac6a1b07ea42227b8222234565e5851169064b0b0a668392372c3348a3175668d470a1115336d3055b51499181325dd7ffc4e55b9c651353275614eade6349d19f0ec46dde3723f5b3d5cf06a99f7f46ff5753365e40b01b6a37b01b56ae767382d26e644bcbf28d15186a6c289524387e899379d28f1c63d4989f3a617677f7373f7bae524a50944110f1c38846f96923c2613c08e9447c4118696b848341fc20c2060d9b52e86134b2967d0797fbc324627a08e67c9fee737e3f383361fba3d349635f4166313a3333c8ccfca204cb1fd282e5ff19ff59267ba60ad48dcfc9e77eb96a1ae447552d430c58a63fba02ced115e56aa16c0caa54ab457df5e20dca531126fe7fea7aaf6ebcc2869e6ac59b78aa2f57371187cad58def1d037ca66aa9b9d252551561e26ba9f85a6a0879c3dabadacb5255d3a029c132ac80653414708ef85a8a7330c1c6afaaf885eca3baf1e3fb122ce01308056c9a1fdf9960934c81427bd9e7a6a12f4f4f32106ef872639c41693be0b2e797d0bb2eace8b92e0ad663e1a7575e1e5e9e6b502765d7850d4b5e77b78343f9139f9ddbb1cb49beb0b9dcecbab0a3efa2c05282a5c4eb721928f3fcce8e43273d78c0974bfa170f868f63d8f0afbcf1b2bf77dac527f05f3eac57e5994f31a8a8905e3cd27bc7c3cbc3f0f275e5253f4b7d50bd2facbcf02bcf3528b4f785e77e017c18bec6733cc5f0345a1efc183c183c66987f8e6b90e7b5ee7bff792190fb7dd6edf838ee6ee8cb71cf832ff7b5ca0bbffee6715ed801d6e5b7f1dc01b9d523625e1b1f6d19bc672ff4d6f55e47fc3c1d0e7a9f0defd577791da47cf771d0050b1e7838c2868d85a31cf532e51b0b96e12b9fe5bfc717887579fe7470f03dbe2e2eefe2f970b055f1241986f4a04bfa1a5f58532e89f42d9f0cd96bbdbeec20295eeeba21d8b05ddaab3c6b39f00ffcf539f6bce3d14d2eb77d2c3df86ecf83eff6b55461ff6a1fb92fe42fa2eff6321ec88ddf3497f41ae93b791df1c5e3991b1ebfe0857e57bcd055bc146f0829a3692e3b78e260089ae12398e2271d35ca94cb5fc83f42b0edeaaeb061e35cd9aa28e50ff9b57ef2b91a587e1db13edbd048fcc5e399ea79ffaecceb4bdbf52f107603d9871dbbf45132583c31674fe313e427a36f3b1d805cfb2899cd44f124c61e50beb06fb01f0e07b3ffe1ebb20f81687d4a43317e30a761ee3e7afd41c041fa7d45ef5da5a1c681350e0f123785fcc3ca490981c5531023213a62ca107d3be5261e314c7c0aa236f6401f022ebfe9bc86158de21a646d1d6ddaf76019bfdc03f1c34df1b9c7813302b884cb3df389e3985cae724bb8a0e4b292cb49b880ba5c77f5fb657b61894a6fcab4d64ffe70a07a92e2207d4ec244c90d632ef7f363dc14da1a38933ff73d38e6513c4950e54431ee9d7b3bfacad9f3f73d3a7bee53dcf4c2d11dd468159ac5d3ab8c5e5216109b543e74940fe9e5d06594cb2b33b8d8b17882e19fc6733cdd78d2734c79186e781a871435bb1d241594969f2e3f293f7fc6288ad2701ecbb28e3513076716737066a4277dc79a899b687ccb13ebe0bfbc783453c80fc1cfbc3c47c353798e515ad8e531a60666710ebbe20c25cd888ffcc06d6b9f1c54cdcd5ee5391068ce96ecc9aa8e74c91df9923c12267b6a2b87d57532cb5454a4fcc0ec7b699ff6c93ed92476551ee56916bb1d19334a8b8b8c14f9328548afc88d7ff16a7ee6868eee4c9a547efef4824d28dff2e104c3e5c329853b4d291fce2bdc49a26122fd7c1b545050b7bfc5a526c54bddfe1b9e90ecb3a4a7e1c52ee95b725bfe843c04e2a54545652e40e551be22fab67c381c0455be170727084492819d1b102c2769e273394913d8e53a504bd93b644739994ad91ff6759119b7949f757056503db1f19c83524d6b4384b58f0f3791a2cb4d2e2e1e5f1b5e8a83ff32f8dadcf934beb092be58caf7127561cd60f6289e64b0bfc5ab0cf6bb782006fb657896c1fe142f85c1fe176fc430fd5c37d31862ce91fd9d272007ffe33bcf13eba090222f8f9a2e51d68e46ff20d8ddcf51af6e42394d5884992f5b5e3ea8bb1d35fe3f96e99f6f834d2e3f57acccca33afbc8b0cf233ef86f7e2c916afa565a70acd6ef88ec51c376557b67861cbd36f1bff3cd7fbbf5c68c23a36ba615d2ef91d932e99aa91f23b4a103038a508244abec0539209af91277094fc80d3d4e4824f121561e6d7809112e34e55162eadb9930691a86c3472d0fec00e3e0da988fd2facb70b415064b85c94ba28a594ba6cb88e406dd878fa2fc3fb859f4a96502fdaf022cbc1e949eafdf03f445f172e30b9f233e9dd80e1c379f9252a9e60f822ec1bddf8502f1f8ca76560f0fb088ba78c613e6619be9fb1effb220f8fbf5eec2d3038bf09f3340d1d6b19e64f266227b873fadca905ce313f8c5adc2989b8e9467a805149d42871a7a79ab8473eef4369c4fbef698a8a444994a49135b1a5b40e4ecfbe7fc8beffd8411befb2432a6233216efa9f9fa9e2e9e5479fb95cdec617d6f92f5e44e230f33f2fb61c9cef795107457637d02715b1a1e5f1c3c8c1f944f44df981f638088ba7f69121effcd9333dca664affbd88e3e0247dc82c0fe2359ed338385de66b5fcc71704a548471949497f111a6f2f3994e1acf92cd7f1a1cf7e1844d189d347e3e0d7232c3ce98f1cc336a7892c693350e4edac1e2e9eb84d1f824cac1f9e18485120546bfcf7b7f6cd8ece9b07e4b8bc797c5e33bc31ba2495e389a3ff242d00b5e385af186c8ee1032c50b536e3861370545a2eeb45f5bd9d914f664bd3263b9388f2347ba9febd515657555573cf18ccb555dae39e4ca8eac8833e4469c78ea72aa0ba7ba62abbaa2eb0a914aaaab63551715366c588dbd03ebf153c3e284c176dc945ddfe1895f75b9ba411d23df4cc6f81cbbe55f19bb9fda85cca93a3b353033ca86ccbadf63c6c713d7ec1bc91d2d5558d9378b4fa9bc33b27e742468858d2f4b978709620ec3d74f80aa1eb091b3ef306657826cd61c4355d2b734bec724ba4702d481ea779fc4f648689ba67df749708fc4c66ddb779f44e891e042dd73a00e34c57c695d7e7086cb49b600bb610d9cb7797d625f7adc9f9473ce29a79492a9d72b38e79717909bb4831d17dbf902f1ee23703ec4d3fc7e57f1cf0de517a5f6b2471c8c3837de708e185511a65b80bcf2930ebaea86b2c5803833bf7913615260ddc64d44dcb472138559a16a24295b7637fc8ddd4f27e97eb5ddf165741bf43bb716985c7f8903cc75e5ffe5442d290138e1681922670c720c83e35d45068e97a41e58f9fdfe5d72a941a385650669f4c28a4a8a0c94132b0a75206ed332156474faa0da70043759071fac38c2128841a79a81b8b099672cc38e85f6b200c7ecd231b2923592a607c642128744556cc98eebc68807f11a9f9e1c56dbf41026b19077ee0ca5fe6efee6ef16c5980d4b3cfa3adfe026684a1965e49a72f46cf29ff8702c6de41026b1d7ce919b988a4194f8b47288b88da398f0bc708eb4904efd00c13a3db6176edb8195cd1d43fd99141cc72f0e52806b90e3b8eca16651941d0f6666e61a98bb9999a315dc88b95300902b9f3b098e5f628cd96539f252b86bc92507834814571cf1aca98d83f3a65faf3af9c125504afc5cede512a9ab916e9fdcd62e4b7c79e76d9b08139d87a8444d56563d0b991a110000202000b314000030140a874302a150302215d5cd0714800c848c4a74541ec9d320885114648c31c818431000c41000818119c11407043406eded9961672cdbc2f55f085e63545d2677c4b4e5a3e9a743afef616495b0219b15ab2d20c50063a02b6b4d831545b1a2a6fc6a6e3dbb26d570b39b8d022faed469e2c2f949a9dad15042f8dd539423b18a12f23833acf499fc3fac2878e82a5088823e37c95bcac7c5b012887a512660a03cef89558e98f16a03cf1f8d37302f174133088b509f30bef2e038610b28efcb369affb1716e4974ccb50ea980a8e740567dcde06691be5757ffa41f27af3117684896fcdee53295a2222e7fe593cd3dc06442f45ebe1ea1728c37b7a10716c65e0501984e4ab0769aa4b81840be9b07ab4aa8bafd426bde0e743c1121254e2992f4f510c2a856a04002dc936955081dec5dca0f5f50383ce438edb031749f3314662df49bd8250481334aebda532401861044b66149fb3c3357d802357e14bb057f1168cb8c748fd41331f46e4bf182034fee7b78c6fdecae67bcac568385551da1cfdbfa8f439b3c0c50b4e0ab9737144ccbf6a8d124ab50305f3a008dd99d36f06b75c9d93e96dc44306058a5a15411069095ea599836fa31f26625885ce3ae62add7e85a3987504c3269c60ec2915373a84003af09ba4e7082b097ed7677669fc43354af58408a18096ca91f35adfe8b77e0001004d20d9a4753a58a6409b0c5b8a62334a551347081c74ce7e8fec120157ee755046e2bbe916ab91df40bdf47a7c2b4726b82d8283d8dc238301ac2d2b2e507aae19cc283134484aba03415a0441ff010ec56fe89e07e955e26abdec507acd1d31e88c80d90d686ad62caff3f0bd49d5e5d19c18076bee4d98e7ee29201ffbdacf5c6e99d938267961d5c56739c064ce5babc8c10663f5502b2691cb9586001aab51d913df7cf0dc74646a7edf5d412deda11e65c05d6d806185ef54fc32ae358adeeccc6fff642f5056e1774c58e0251ba52a8c8d1c874daeda0135534d199817fa6422252884cc489e863b25e38c9a8d343abf613d462deaffdaad07ca4a2aea204c5009ef94fb6324a916bcf469d1318c88788b653088a9c030c581ea2397ca2fb67ef2cc6d2ece8fcea8a5a700332a14ef4311232b8c0f19c1ac111f157fb9f7b053880f52cbbdb7426929a8fbebd3f80a4550559db31343d6b1b89ccb95868aeea10df8360f02b69492c608a866ef491940c9d8bb5a1205893758d26059a2b54f46e43ec62277cf72d0e5ac143588424c76413d63ef2e2b37bd60052f1346b083ac067fe294d8877c42e4e589780febfa4385268d2d3ae0d6e5d53ef1ed009815a3f0687a282135c0216d9a0435840118683e38b9d46b058f6bdde4c746e4c433b9a1c4a78dc952648f24939773c8bb8afa0ba2e9346d987d2738fc8e6a5c5663e1a004916e338c52a27b0e075ede1d6c3d4361b6643b6c2326180a2810f845681381e08dd7f67d99ab92b8b2100739f3afd40c13185350fe2fcd73e2521b152ab805a98076e3ec99d096d86dfe698dbf306612af032778b98a48137c1ac85b87326033d6d659ed3f5a046515dbb40c92e8565989c88402a77e10c8005a5f9d47560dfb821b34620175089fbb9ba1f09db1161cd0b935571160badb421a67728050a1448b5c563aac4b95f9ad29622989724cc27f71388a07bc2c3ee717232298810fb88ab36dcca94d580b62ddbe2464af22938933c4ba49ffb7867fd4b82358a32b4237b47002389f72d50561e0edcb2aafae1e9bd0e835aa9fcdb513eef959b42f84646d882122ec944d1f75e2aadf38b32dfbe453ca48023902d901eec5f39ed6f5fea7d9578855597b68bd109f2112b011aac5a32556e9938eee1b4a9dc7e47b0fbafcad0fe077a9da08a0ef56f3c73aa5f0cb2bd8efafdfdd49846ebd9620e9cd02ab1248d033e8e7eb95632c45384f584633bfd56ff83be35aba0b2e5d40391881e4a64b5c67e98a07bd6a25f92e69c52584aa72c11f86b3fd698232c5269256f91c4c99990893bca5bbd6a698238027a8319e68817cca9b2bfdc974143118800206fc91055c4033f08398b4a8e0793d6476d8bc163ade125cd74ec40f4d4e1856eb47e1054373883e3055aeb714ef0226a904620fd2832148b01f33fe047065c42e96ff14214ee85036acba0aa2f1490d2f94e3da8d20b0b505236d7042dd64dbb3890c6ca832af6395d54aec14331cfa84ba5168151bdf40b42c94a38282b41ed2786868211e8ccd244be4fc65ac440ab8aaf2c983ad2f511fd23e0814f1a46d2c9021d5e450fa982547bf84f2e3417c46766ae816e8eb6f100a2e761670a50e976d8b81df84f6adf87bc817e8cfcbcb58cf514cec07b27f98dace801bb694c6ac53b3503a0150c21ada1091ee98b7f10325a241dd20942a070fa5a85133281f7a0dec5ba3fd1aa7fac323b9b1624783d42862ccfbdc8ee3c18e7506c4521f313ba1a1a154242d363a42d321724dc62dc661f284385ae7aa85b70660bba0449cb7f2cd2e0a0d21a27a598a95053e9a1bdf9cec38214503bc347026d5c515391f95d27ef4460da500df7858fe9db6a5c13f50ae618cd655d40fa6068ee21c6b71b5cb9505e3d384dfc1c9b333e5770a62ac6f43a0d7d31e6193b1bb316ab1d509dfa3493fbc92b389c38344a8670e0fb9d6140ee021a052fa4185925835b8fbfc9d9cd6b9b4488e6b3a648032e74a7ca34896d61bce8ebbbb21ccc322df7b659fe21867c0c796c46e4e2c91f08b7a85c017f139dd20515a5de51b27351e08eb1eaeb4d7d670c62afbc3c95ee24531e57fadc6871a01b77febf1444d66050ae3203a2471b296a91df344d37759e4140d0e526d1c9546943d54c79b248390e0de13d361c221e60e2b8acf4399caea85f820c5522f6809ed4e98c105e89a1f582809e16a600a2a3aa179ac9d51cc31daea19a50563a08fbd14b56cc9e1702ba813a01e3dd5cd596cd529a5b386220049b640894109695744359e8871b42dddd21d75d0159f56e2469d7294c00993b7ce212d944877f3d987077580e5788fdce91e82afe0e48a998f3b9e648efeb4f20b0a1e4a071a38791ae4ea620983c8627cfb11f40d87cf2ac421d04afca866fbed1dd302748c453af3f92ec062d2a7fe7496921285af26d931df04aa586704a49d43817a857e44ea091e9c20445e46b4c2c4608564082df79ea00e49b1acca3d5d792893c379db0d8a8cddefbf57a7ff4b8c915ec45be261c1859f02ed960ce815a24ca0e32cba3db626420c7e9edd4f9819241be94ce6385f8658c62874e2619bbf7efd8b782ef1e94ce3c2ef84f429ce524489d15b9efce82fb8772e08acef51098a4fe4917baba3fddece788146e6f4f6eceed19dd6fae615f33a5558667a51c426d5bf358e754b1dd690ab52ea43c10b497ca9c3dc2f22e66978070aaecc9e21c310710b200d152936565f4b3e383716957b391e76a27c0eeee8587b9a64c7b23a73c678aa51367e43082bcca6d444b2b66ef33d040477d1f517b1664818e1de3e3673e6c5ba63b947271f4ed8399ba43fa78cb6beb2b150afbcf5629afa4232cc09045ab236a21a89fc1ecc5a95ac94c28f0ce8d5158bb7b964b62a9ebc93947f47cb6a862c4718db8d827c432fe9b0f7e46c70fd96e5090aabb5fef6949c599c7f320a10719b4613cc4ac33872e1bade10145f235ab4c90dec183fe9c4e0246ea8b60d4fb0f82cfc0028071a6c95c4b619203dc8c2b7907ce34f3421c0131ce7ab81699a7eb20d1e5862da882df14442772a4318c375d5012f5a11e7b68b5a06081b359ebb0917789ba3146cddcc608edc183cfd10bd5804fdb1394205b0e7b2e0add3a9f089e6a2829a6ea736becfb4717e5bab3c3a27b93f713ac72356ea25aac3fda5e3a43d4e8da4755ab17d250f1abae9764c3e01a6b115eb14437a6153c2a2b6130d8ddd40f982a89d59eee7b171c885dbad877cd4c8766b98c0b1d17de41c51296869f2119520ac80c4f4a19613a8683f017bd578773f7c24064704a935cd2633e7edc2820890f14f087002f03c091e1dd925d8de8622823974b2af2694f8e2b4772220e76c2bb2ccfb651f9e7d0345e4466162cdf60072fd04e5567c8fd40f91faf4b1bd00f08b85507f7597aea321b66c93bd895bdc8e22edce8dc473eeefc049a7734037a5c2f532a81997a1db7a00e5c6cdc5d03139c72f6936bcdcf3030e4c88ac2f348a2f080268f2dda1d0c6b9e8e223acd64a4bd8c737f8ddc3c391932d2099999f59a6091ee76f5d0a2a807cd1b70e47970e8d018b4f135da877aa6490b86a70ebd0ed012e19beaea67898401367369222c918b528b24d004ea0898a5a8e210dc9ab76a6cafa3dd7481f484412fcedad294cfae11b972c8fcb6e5743311d4c3031e2486e9b99756ab432efa4c0aea99d5eaf88bc3b204f7c7aa43988f4d2903b85369091e0969d2c9c6b6d9566c83bc02b7c0257c5ffd857b50c411a38a09f90209c668ec6c129ec4eb09294f5986e158ef05897089e8210b55574744fc6d7988076862707431a2ba274f67332673f312d03e838a23063abfdb3c122c7a392eaae6cf4c52c6779b023b8aa1735807581c00c3771b1d1ba49390d465d4c2b74fcfcb3b30567aa8b7d47a42562181f329c1b04ad123cee07ee7bc54376ce94b5463279960f829f0c05656b38f5319bce7ea440c1494b1ddb674986eccff0350b759794cd86d2a1db87f50ef5c1128bd09d6ab804e8d471393f3afdfce61321685a130bc0d903e2137abb01e2216d34ecce53a5b5647b24b1282df09cfa1d914504f82cc744f4c5c0d26db347d038ad610eeaf0332a1114e3d36c98922eeda6f7672a31a7eb8f8edb04b5c1544f555ee55631b199fe049c76fe40266a24b2c9b7bab33bf1b34944ec51d1543ea49e0ee038c824580526dcc4b08ac500dfcce75d85431b26c4e36539bfe5d64865d704cc99cf1c3631dbd7993f59e104354846143d0326ba2ac0ce993f3b409438ac9017e588676bba9f982717a0e77e842c53f691255a2ac12a9671afcf38282b397d6a9e6aeed4454936b98bb9ee68c896a2d89cb1b6ccb29dea1d4870810eaefbed44f5e739ed6d69cb96761e15ce23264143c11a6d5a2ea702eff80c54545b02475069cd6016c9b49635748b700acdc44b4a2704b354c96af1902f7b3da2c4748e1d498a14a8c24e432cb02422c2c0c698819d24792c171ccd8baca2b70e3f452ab8abac2d900ec83fc7b2f056aa993bddbb408dd0c34cd765d0aae89c2eb51721d145c87a2eba1f45a285c0f45d74b01dbf9d6b3b82e289daaca912564f681a1bba91f722752770a853da66c20876af994349becc6e97a166fd11bf3144049d98870d1c8a45ea44e6dea4ab9807909a84d87a43512287220030c0d4393d255791c144f7b318aec65f466c545188dbf41d5c633715439209692a9ec4969682e0b95508b04215e51595ba664e04cd8e35fb2f7443542bfe7bac503150699c7a7637a61b6092f8cfca165beba7496d202a995151d563da8e0aad65525cb96b1425dacd7672084ffc2a72cb4a120474d601d9f6255f7c5247cc00a3eb0faf68509fa80153e602d1fb22afbc3647cc22a9fb12af6a7497c14580d3e19e7a3dbf585c8dc9a89d0951f0a0891e101b0a7c0e773c7a756187c2b99c7ed083368e01e727af7a3d341c43fa5f5f94cd651b3a069b87de1e98799eafbc88a3229bd4a938cf98c588e3aadb8cf20f4cd09fc4f42ead66544c1ea7c8419a66f266c4af26648212e47cb440c07465c07218e43e1139689780e82980e8218960f9f3948621c0031c8a1fce4a398654d2c5f66cf276db915d95c43085dc60142b07c67d75822c2038de3217fb9750c2d41dce4eea1549e641511433d33bc231fb72617758a82ec6b35053deb5abfac69b710261513e97f61820bb5a7517f4863180125e67bf32e135541e60739d5daf3e2693dca0ef4ab694328703845550a0b667d82c49fa056a00644bd9396edf3e313b3963bc391a22a1815ddbacb28e01e86af3b47291373e555a0209bb396d843bae22b37a1e90a7789f7729a513c2c9b4d3110b4f7a1bf92519e32cb44619d58dbb2f806938009ae3af9bed6e38402fae0035f63c467f1f36b5ce2b2b8d37aeac54335acbf1f954614c957fcaafa59077c58f7efd50a94cff75343188e490e49b151c15d9f9531b7f391982ac45d4190026230d6ced54c44afe2b7f276512bf969990be5f4495cc17ba465d50749a08266a24d69d6e3bb7ab5b9b9bdf4ac6c4947c7eac6b7a8b194a1a11ef92ee65c05906824f765e00a91d0ff46f6d0e56ef31d290dfc2405e8378fcdd901a20723060fe0b7dccbd93e4d982e42ea724b385aa83537f409b95a379ea4c8a6b9361e0882ddd6dd61aa844ee6049e8f2f1a3c78aab632890830671d8b628cc0f1bd532a395885f44ed570f8956fbdc90c391e2e4598281fd47c6b533770de563968ef12010f001d6bfea28fddc41f48781888cd17f94655b94dc1ad7191449275928350c82fd7f81988f9e9c9f689fe6125bdfe858b8ca264f743d9947ea93a5403cfb461625c07a74186463734c33990c17fc9606d3400c39874187cb67232a4bcfe33d177c3951d803fbecb6062b2381f7d50261691e4bf30973da2299ab8c8a113cf80f85c0e5d1a32687d5445b40891154b37ecab18d1a5df67a76e9b21d14e746140245b23274cc0d4916cfe76a49b296902f238101acaa8120c96e02fc8e9c7c61e3a37f103830c40082e6ac58c3406de8477c42394c10db95c731454cb8b834cfa27b6d9258c95bb5ad14cbafee3246fb7fa33e923ecfd31aaaacff9b6b57f3e33f94f77b2a251d17805d19eb52d3470a36097aaaf482650ed88888b1b580f77edbedbc177affe0e6264e2f918983e46c758adf55348f6e342eaacc0bf9f0110aafe80f1e4b752df267578d157f8aa06c820c381634c53966a08ac33f1c43a38827c88cc347c29aed4e140efc21d2834e8d53d49c97b34efaff39e0c7a0ff4bc833c5ea267af50ea6b638168e47fb6844c302bddca395cf43f9fa460f8f969be427c68889ca63d7f085cf0e49d8cc00a52c01ed7cb4a5d2c00462a0ca8bc616c5af01a60c9e20a2240cc01cb60b6ae1a2a59199f302298431de04076a49a687834f304cd4ba520eec844318fdb22a91aef4900a3b5e68ca9c9518d3a3d3581b2068a563c7b6f1cbe525f7c4f55a909dc1b865db0020dd1bfa0020dadb57fee08c215a1880a63b328344f643d3e7cee862af51a501a8ab64a14e292ef24f68670fdb790fc3ae020e63965c1dcd42cdbc7e9be2b687dfdd5b3d2abf8b8c0118d7262aa1dce064cde835dee2c4cfc28343df22af75c6cc27655cbe7c6e46ade0a5c6a567aaa60a72f68563676e63ad9ea47b8f10983ab55fe34468f48022ff2f1cee306320424e3e9db16402d218ad97eb55797dc880b74b67b1c3c7715c9309e4bd4b13a1dc3ce3f8b58056c45f7efddcd00090681b57a14f70c446eba84a8d6876e202bcbfe152b6caee48f2922977ad616a29e176cb0df4209af4b3492be23eaa258f72d7d4d9f300063e419622272565e24b7c71ca9718a92fdf419dfa554fb643da6ac730c24b327e671ea400f6ce1c04f6d25d4914cc559e476ca0285f368d7b4e9bcda0690ef67a0baba5e0931e8fa70ca6dc2535f3c23e6b373587bc5e6683e9e835218a7efac062a99ebe123d698d542d0865b031a3bce8d1cbb8beb1c6b67768a86183adb1429e610b16ae631b55dfb2752eb5edd3147accd3c1cf363fd9c0e2ef2c149f7a92c60a79b9a042dc85386837a2e132c33b76742652ef2a0806a597b6dd72878d025b0a8685482b01910d5ddf83d1c41dda9a5a224c585da56adf36f78827000400bd3b89051a2169f7904f8cc9657a9547a640270682550c14642c2f16ab0308a4b8ff002a0b0fdf47ac4b2fadde43f584935567878b845028885db97f5e687a57329972a989cc1f8003a31dd5f590aa283558e2ccd9c52e8a18379443044285a65d86befed087131d82a328c49b7e835f2b9b99c73249f0ff3012bf91c7cb84b269f775059be46c528edbf9a4abd99227e82deb63cca54b112b2280eb95dc3ccfca1a05cea561132713b707704dc48811e62d6d0445e21d86c2d1b0244e0f47ad330d8da19498ecf4666879808456cc6a9839be2f5879117041df885da9835d2e8a06a36b2b7349866e6ef28a5bc398083dbd441ca76fcf6488a34200969bd5a73ba0d5d5cfa1b61023388f31ae9993283ee39b99f764a3b807cb41eb4222d2e17a72173038ae4508bccde1674d2f3e1d8efce301c723375fe1d2de96005cb470c08713aa8b419fb6b4417ea0f117b317f90bd3b26a5ccec22f4e2c1c48a734124e345b8590a756262f8c8bd2c00b24abbf626869a6691948288295e5e068b4e22a310fa163fbc96101b5370c040a4d89ab44e69ffcad926463c62d9c386f4deef6c71ceb016e779faaad7c4b31c50fd02f10d2f2c2e36a164b6f7d169758ac02116b3ee22e75ad409afe745b5d769a19e64aefeab0ec60bc1742a55245e33ae056dea7ca7f723935c8c080b50ca11ef8ce9a63cd9e04932749125a19f7094efbd7807ee76d4c4a176da52f10ffb881e832983e2b8613ae4c330adf3928e10881f8fc3d024806d863f45251622a948b9a0369fe445d075c50dcfc73fb4cbc85255dead047b645fd0b7422d08a93f145ae6fea5ff0238792fd4f5f0af189788c46477f8532531929528b89ceb0d95c57a08dcf915d0566913ac61ba30a3193d8206e119ea838e496efb63908c1e714254117fc7a1295c6c22e58b3a7718db101d8bae13287acca5dc130b1fabe5ee198c144693320f108cc67c73031352037ee836c9e402f8a0b887d7d83ec0261050691c350998b2ba8eca2185f4efc784b105225c5f0294aaae322b5beadf26d2f62130c9f48db8aa4d007c1a9eeca79fda43d2228e33d9aa4cd351be9681d90053534fb14797e4bf6e83de58373c829ae0e25b77f100d44ca14aea6ec0cb30224ca9622def1244629f609e4f8693cf0129d6fa79e85d9b199121cf44452c87cb26c099ed107bcc79d3875b873dddc309e145480e36a88f2eb6ff256bf823b28cfcc7616679652d5bc5d8df627485618774b9c5787963c5282472ae2270185477af513e20056e390a0fd9087ade41a36268ecfacb8ebb0a42c0eca9e486483e66275f42c12cbf4ef64617c3be5c57b4ff2c34c4bbf767809c79b850b2906e28ac5c69b0ddef10ec974c6ce693f03c3455df8289b53119f5e25a25e1c60aa40c24e2fe8c3b2f258b8b5fc02b077b031053c015697ec239fe71b5e0c53527d6f49b30224f21b0cd30fc480f9d1eb332847c1eee69156ade0e71ccbe1845447012538b5114b01b890511f65b8b54ada51825620cd166c8d0d6a953764ffe2c3fc6f063b01feb700aab4ad629af7dd1da503580f403254b44d18cd13193fe446138666d2f3f2d56da2275983914e42a815b32d65cd339ecc7e991301ecc24edf821e2b34ce6d9059c6384380ec54ef388225507a82de2dca0f7b76872fdf144d08722f70cc40e3dce24a4baef1ec55bda29b054e68d7dec5888f2ecb69ed7c76c85244a2e812b8b5b577c09308ef84f6ddeaeae3de210054db6b9933d99961d2b0f8573292a92e771abba36209bc6623acf224062b8997ca75c7fd75d9232047ce2ef56cdcf30742bea482c98912324f3e11d84a653fa88514a7aa2c18ab29f4f5faa7b07336d273518f02601ace2fb2c4672b0d5db343d55ee31eed006b78ce746e72ff76b82fd4f2ede743af6cacef6fc0fe5b12f68e946567e8e069b015c34537eea9f83209527742da4318ad97dd067598c0ba72f0dbfef1cf8cec90a7c6768f9f314f1ee82d7705d3a0f11b41ec90b454029cc52b327023347f1e124007908ed1ae852395e0e86dbbc6f8752e1f6ebd087ac9f0b9ab65852a5907ed890bc62b928f308b53c424ecf1994427f4f149ae83195f0c034f0b86c4fdc9cc6491ed27bea761b7a128272b4f2e0d34913a24074becc6276ef5cde841488f682a2433a483012854a43a296453ef2cb9d1f0249eb88931228ee367a1af1854df937dc44d85a790f884da557fb247d0c7118d839ca250469ee66de5730abbac480e2b3d4f60d6ab3b450d050c702bd39df38c5b494e71db9f15e86e653cce548a79241d8a9d69eda6e02e4d83e8330cd208ee7dc20fd1618ae6ec76fa56c6d15e0c0314aae362ac1617ce6c890dbd5b0227ace4e5f0103875124b5ab002ee25823e9eeb307474403ebd42b60e01989a4565a33c0333b3c8ff62f96041caac0c567549099b5068854d251fc44d342e9da41c5047f742c3d5e315fc5e95ec502afbb811ea3318561d2074a6de5605089da17781460170afbe8a390dffe56855813f1587e8e7266b6d0269ce6f8ed4d490e143328d0a8f220a8861a415d2280622921946500316cdf8cbf35872dd37c1999dcf8ab634cfb396c3cae9783f79a6d1bcd013b700e980f785c3bb0eec51ce0ba0d48c21b5243d991005ca6bf4a48db60f1db299d03f780f0c0393b90b87f886117808d149a5b8d2f2788c890d328b503340706fbc04a53973c661bf9fe8df6f43d341f769b2efb01dc6c7442db6876c0241fa0442284c73693efefa31a1733f9199a094d7dfce5a5d14f9aff56d89922fc2d3fea72d6b9bf35ac8313f408885a80361ecffd20c7ef554efb796613d8265058e4f108b570e926f96dbf7d6d690e0d7460d037a2d88ca4dc4625a8e06c8eef49902b102d09fe1b3eb4a441811bb25b2094059719017c4c4027caa03e02ae3b6abb0205c611e72acc19b990d967b0a04d31109084bb8cc9ca9fb9d1992d04713bf0df81e7fad12f3f26091a642da78c86eb29d07f053811e07be51f139b3f88f0124d0a4ca846c449d59cff323aea622f2ef354743ad8a38f7305458e7f7181072c34f6720f33230a650d2d4beb29dc589208bef31322f3b07ebe12d22ea0107ea2bd78ccd0ecf4a9e5f8b8071dc3a3cd00527ef520491baffdbc0c868628d9692f59266ad189c40a488bb871801c5ac8a0ea341f4f0279df3bf03ffaa26e2ea516965d9827af798e1493340c86cc424d39893b970bc4fe822a6a1a5892e32018b1b6180c00bf7efe062361fcdde47a854ada3c9a90be19cbf605db185b8d33bfd0db47fbef971b936a8b2fd64fb526a2742381347e996a300bb8789fa6780d993297618937fa73a86a5d248f4a913357fbdeb2540aaa48e8958a8fe5473f01c90a99cedad3cb152117311d9f430b41d09d4df9854cb93b790eed3adeff3367c2d4cdfed6ec78ccb8027a09ff287ebeddfee34c6e2a5020ad58f4c317c95d2077d34b834defb3addd0c240ba2396001d126f51ada88b0c8d763cb2f3c3c2b4dbec4d5066ba8c788a028c772a48cc30fd76a8f6acea4fe684a8e38a05060cc1431e51fc9652972d6d6a0f0aca281a7d784ec81e95d3743a6f0bdbd068c11a9fad21205b4094bd541df29d3d0bdb75e1c51100cdc3180c5bcd0a6b5f42754f70298d3d7abe5e3e927e556a812ddab86941add5444ef3e98ec046349d391b690714f0c8b9888ad7095293236ab07f264be3845a68bc84c0cf52815ebdad7a74d4a6c3d000a6f8623f677bd724c1ed828a8994a106670bc8353bb45c71d053dfc8e521f554df76a1602d5065ec5401f19708afbd838015c6b037da48c8cc31139b5c689b26722210d29db79651bb3418d3ad4d0c5e23c8e8042313628ae15d2523b54740950424150db2722962f19f9cc8447d304fa9813a3a410024744f8e4a389c5d7548bd2af5b3ad045efaa59c1875bb13aef87d6e87a5c126c850e411d6e89e1521afc184df93c533998c5ddce1337c802a8824ef9dc2ff20b83c2f21bf350e0d6dd8b4124eb5c9ebb1c62cac843d04a21408cf97dcfb12d004bf63031e8c89363fa28a4981bba9fc3db2557d611df56085cebe6762a32364ec81ee1b1e9db234076b5c556e4f2666e2681f7848d0778bc8b90f9b9fab49354373ced78241a44ca3fe6247f88c3b19587434370d985bb91ecbc73f4eb0aa10052c945ae471e3a47d9a71cd43a58f250f781f0554a09f501779cc264d17a8c19bd829fd3e324bdaa23419a29c648f0c71185d0e5cdfa319e652922826269a18053feb514d061f60e8a43ffeee0923e79a080a2664f20b12e4341afabca931b1e90c0ca6a743c8b282a6afef2dda4429e9de3a833772a68398dbf26e1102ac611e5516084526c6292ab2aa7ede942bfeeaf336b1a0c6369d29d7fa274eeb15bf848c1993ab481e7c0ce3e7f814401286644dae84a65170a425de57713301b42374dedb63abadd3609c9f5b0004a58303175acd150a8f5a1e522e7646de2b8736cadee0ee86cb192ee558e6873ad0b8f30c05db6b05800caf9b126c914a74177350de2eaaa295362d9a6691f28c4438bff691c49df3c0d89ce0b321f23a280f7e9c6941e9903ad1c4649c362bbc9943bcacdb440f2a81393c6b1318196df5a20dcfe69d069165afa652074348352a2118b7a84ebc083fe5ca7113730036879cba6a92283f01b94c9af1831df12269e637a5391121f39d4ebd3de91acd1bc0fc6a870281c4fd4fe2174890b4c8cb4e6d4ab365f5512eeda3873e9005f95f959812d6c1c1a75dd5aa88c4144e3b0923b9ff29cd48e5895ea886d027f2fc3a11bc23f67fe6d32f61caa40530680c4e2e37f5256b58222595dca0e9be778dcead2feb1ca04dad5356fec78bd28b86c17c969d362858ead55920967542ebb1ddcf240ab43d26180b0e4efcd9bbf772a83df0cfb8499161f2128e978de819c1d91371605a6506a4e181e069e441397c699eecc93da51dd1ab6c9177d3961cd4107f07f651138e87e043a27240c87531976edb63452b81dd938a8acaecefe243e3f36e4085a554d53e57e173a56a22c9bcb7c0b9bb567b587a48cf2fe226a01e7e0e5ce891c5ad5a1ff523d993eb9cd3c95d6b830a91df04c68e9f4bcf52cf81f5b311199cecd79518eea2d06de4d8fe29e93830209e28dcaa98adaabcb190e226cf65b09e05de57be350ed4455df41773e479e01189bd19b378aef19ddf0eec47827b7a9795b853b905c83ba662840f2a16ac62e95b617ea6590cd3624da14858016d67527fb63bb4fa535aa6e075d1a41843fdf71528657a24ae98a917cea2659f1785067f933c2514856591298cc3ba3f48ff27509fc0ace38940fa7317e90c89eed9c3448f95813d45e6b4fab87d45ce92fa7772964ec411aa5282d24350d52db51054c9fdd5386262c646e09228db9c30f62229a6032f5f8d8d97bc0c787ba845fc8fe6157a47c1b3e205b969b3e57f517e4dcadba64d36e3f6be507eb70bd800055dcbab57b10f1386b41b43db52024961ad9cbdb684403db851872386a252078cd2e24573e360fd3baab65731eee0e581ae7351d9c5116ad5d7665cead4a93348c23efde181ece76827b0a39ea620f1481e7cf8d1dc0f6ac0597d20bc23b168e4b391413bb146a34cc49315cec649598f09533b257dfac60e5ecc236210b103471c6e4815baeb93f8bf2b8a0fb80cbc5eb1a362d215ff48baa1c9487c589bb501cd511929fbe1c9c0c6e2b73fe79956233ad3da3ca0627c56a9d92305644017f0d8fc1b31382aae58a57c016ba01a1e38cf2c4503a6b2e942705a8ea397e4991b400f45065bccda6485b1c9c43f15436fbfa12fde40c80fcae03369b935e3392a6a6eb99068f46b60cef8a253ac213f9c081ea8e1ed120710fc2a065471ad58a53c5cf63c80de0ce66e39af5ba3e3b8f41742e083ab5109e9032021cfc60a1d784f0f4960e02c4a0395dba75a4d45509cc30e93fb78e522340b8675de7cdf9e3283a79081696b9a9661219f0c6fa4d291084c60889bb0ce224fd59dbc2abf9ae926b5c2472284652116233ffa0b2a0d0f80caae9b957db145a1be45a4be9fd1b6d4421d4143a1bd262c809e3a6a484fce97d63cd3c968e9edfa3c49df2813e7a52002be118d2c53a08f2018522085d158d7f9c585631d5a6fd60d0249664b058e0e393a980adbd06a625e05188473ab32498423ba8b07777b61dae512be9465f6b635d863b968d115eebf45b2447399f401598ec555d2960b16feff0aab494805c980064e6f7c22eb3346c8d641738ba0f5f6b280ef38b1be910c59421d167584d952ebe5d4d4827663668386d6f2022ca7a6311e9028e3dfa0877380036e0ee76b29e265aca2c8197a0d2980c9fd2735f0a84cab17f320775fa35e06aeb066ac9534a7e75ec5ecbd0fec1b6ef22f0b39b851b7bd92bdc61259e67b39598e5b5a0edcefc4a90ae2d1391b574e5ffd26ccb6cd86926ad84c82e6cbf3a620467dd993149f06056ea2595c0e37bda73dfa9d7066f9164bd06f41bc1cdcf917d9b72bc4945a707d216204e70bcb75ebaa2064edee54c36a28bd61aec02fbe6444e11061da6062b9a94ceb24f6fc5adbb7748116ad86c732dbfe046a507394d80c82aefd037b92dc01706ede09e1f8524c217335798c2e11d6072aa8e21d1d5e8668c52c6cfc920f38cd98da6c3a8f1293e762170d6829daa05c30b624f0ddd3cbbfc08bbcaa54f9bcd88c51fded6e38f48460c9d311c7854a24cfbc96b718b5d92461f658a7cdf0e8d6da11a0e3bd9462a9b2a375736cbfb3aa55476428727c154d88705e3e07f3750e0a9a84d97ea61388ce6808c2179305c72657a285b206c77b15abe6174c9e52860c42efa94db13c6517e63bda2f245957d98aae8f55f75c0842ada47a9ac35005de343134472f1d9cf03cbe496db3ab23e9852e2b62ce13ebeeacd830428457cb6151eb58920a7e2f5b762d82fb17f842953ba26180015b005158f18dd4e5668da762f37a7c319a32dab24efbf1a4132a40edc5ec221548d0908332253d22410df5bb66f2fc5dc7638c18227e787f05e34063e90d1b6f5b652a522de042a98b2cfe776f9df05c8a6100ee4be76273df0d288c1375375960ddd9e74da6ddddea9acdffaa2dca88ac475b483f1df152510b9e5e8d282423d4c96a1fab17a75df0d80f45b616683a547f315d159867e4e956c2e54ed1f4213bfb135a6eccd6303947f12582a5e04ffe1552137d642e0cbc4026457aadb9796bae02153ac11c7d0894ce3a73bb3521c2b2e8e576e6418eb7b231656a2ae3f39b869e4ee1d625d3594607f875cc498e52c9997b712bcc5a24d08dc6b16472a3b04ee38c4225fcc9604d7824fca462c248d0cd4d8402c14c582c3604035f33c18ad40594ae98e08046ba0b5aff2c062854c3be0ea7cc7d922c49baecc4ff903dceeb0d244dd031b8bbd6784037fa4d4d031f636eaa07492389506cb916c419e4036704d792fbfa415774c6078cdaa71ba51eaa8b55060eeca590fe7895b333eebd1ce1362c643e0f1818b1f0b2517068f150cbf19829b9f703444c5483f1aec9d5ce108baca591510be3ab3f79b1f05eed842121eb6bd06d0b6051661b299e6a7837cd22788904c87d409e893dac5de06d23cc6b013a3740505a70d558925a11c2f59a39ee615637984b7c13e1f7ec31b098767391fd1158a1945206f7ca76da0132e31e5338bb318e8be548325a19aa17960d32ffc02e3575ce87a22a8d98f0a548e2ca9139925f945ca01029e16d7fa5e6bee4787400ea4059925a2920c428c18025cf879a93824c69409a425929619584d2fa0c65e44859fb6552b2caf8ff864f20ac9175a4bf06c6f3cc9efb2d4679f3a479de955990d726104c648605833e3048a203ada80ce96b144fc63b6890c833e077822b5f4b9da4f29f25a27b07745d9c4464390fb0a7f3e24a678e089bc20ff12005079879e8a412645b55a5b0e06581a0a1b194b4f9599960e4ac642f15ad43cd2f2ddf4edecbffbae0b0392f14e1eb4e4be5a1cf73ef88480413e15be62fabb22aad8ab5de45858d9b78b5dcda1bae2b9e6e02bc3d944b1ce4cbf800a083e24dbfdeb6893c6db7b0f43ead8e016506b0ff938420d3f025b3404631753ef8f7785aca97182d9e3c8120372c4e022b8b10388e59f8eed5bc4eb1ae660abd61bdba4c97e53a640f8d8468b60856105c9b12a75ab26244a24503a1b47c41d56d901428bede51dc3559eacc01a3a069bf905c233a15f4867308092c5b253d32b68f62b7da215fa0fb0cff44409bb002b79702da9a7940b79cdf817c73170a959bc286238a23850e0d53774e4945484b3abdad9c9f1390a8d548e393bff4d1e12fbae63bcec088b96888144a38f219540b03b30153d5ac9709ce08db48cb0528f1de879a9dcd0977acb6dffada844f8aedea104526957daafd0b4a15ab4e13b5a2dd51fd06cd87fb0c22709ec3f44993304bab543f364dc571cef177f2ecebd709bc1c725133e584c8f85514f70b2356eaab89782bfd81b8fd8285d0da63b197495c45ec637ada7aedb28eb1d98de6eebd5afdedac4eebb0cdc6c8bfedd34e95832d6c3d27a235a65411a7fec3b175e0e045d835559880968b3e19ce485b0163b9686129ed4ab1072beef84ed332eace744942112831dc214dd565e027312196921050b17f872a703101672b981680e6e96e865841c05b5c9e3f267da68c8b3a5e72f93423fc35d81807755c7ed76b4c18705b78e7bd36bef93e58132eca1ce0c99d3bfaf7790c170db63c077871e39f2a7a0afa20331927ca31f24511b3364682a5aa126e3498ba9049dfaf166ecc30447b5310e09023fcbf9efb3722e4e8b413117ef530513eaae00a1ba96d80fb5540b0e2515873ec7a51c2eb81b3d6c22eb32247082036ac905315bc2a12b81410e6ec4e8d1c7406d0b905fdc24f741f512029bc8dde3061575c395c0c4fcd739c47e0ca7aa8e604d422c5af2963145e46337075590cfda9b6c00a2b98abbf7a7faa504183fea80a0ba43da26c1b66bfe3bd96a889817f472421bd7db85ff8f0d3f44d01cd005178a73823a5163cc6c4e8e39d504859d493c9f418125671b25302c76635112a8a5fa9a46e80b63124374b2d30a0a0335a9927e12bdbd098815b7aee0dfd04d56f4ca9f85ae1e4b9643b02ebd5546377698e5974c4478d8bd900fb766a8247dbc859f304ab978942a4f36524924d243b2fa9493eb5ef7818a477a0a7646df242f7b6158056e8d100cebd42e4cc9622005dda609cc29dc94aca96867859bedfdb76514bacd5625738d5f9cf13f5301fe66229dc2ffa22a02b800590eb1c7671749615c96f2c28514f24b78081a11657c791345a160e2b87f0f32af7104a70279763b1dc5ad8390380c2a0f5b0cb5351ca4cf577c73611bc32ba0e1d7d16f8b1cd457964c5c02badbde8400423dd4464473519da425bf27154bf4054ba7331b7c4a790e2ea90e85540b9b24cc2c2d1a3873433170573d46ce4373de099550e5851d7610fbb2cd16be886f7c258529e005f48cca9c497cfde7a788a99fd19c612154ab9943e4a6c9a6a2cffc4a25528b9bd6c78add660c70c043bff1851bb6d96fe21784b5bcb536939cf2ed3936df74d896a5a932fb1983e6626851545720c4a947e6c4efec3904eeb871a7dd82e2e97e979a29ff0ca793c067f6fa3d1a2e9e4fb92082ce694cb02c429e463301b64584e631fa17012be34f991564acefb19abfb6e88ae5377a572e4cb8ff7db4b2d0d84c90173e183f846bf8a427e539d56c1753e184cdad5da72e75e30d37617bc80fad890322a534d6a57b5d97ebfb0d517f0a56a9be18ee32e1cf21329cb513040bd5f7ec04e554ef26106ac2fe0dcfffd8150212d55becc089d28b6fa7e5ed3575568aa4be8656fc91bf3d74d0c907011970d5a1b5bb7b0d98236fbcced3ae38edadce2c833e1edfa04a6b1a5486d49380e6fc1a86e44935a971e3f51ac63a86fffd1f90666a69dcf7eb5f630bb78513f32c8937c74d58f593f20b0cda9bd538eeb70c2f6ba14a8a805352c493c300eb0ad4d7acccac382fa0652fc77820f294e1d1bebd97fb79d45f34fb8ec9b0d4bfdddc36a08f7146fdf8425b9b543093718db31ee7635fc4220ac939cdf781621bbee2554ab7eb2a802679cfe22cdfd3ffd85a2a427422e42930ba9ddb1b588fb989efb182a3876df1661a408a84f848fd561efd0129aeddd17856e674a5a2642206e27658653b43b27000814484869ad7acc3d6bc33bcb42ca53d2cd9a528c52f5a10aea254d90aa4eaaa8ab2004322b3a9250365e6101d64855e9d736d887a3dbe9f4ddde0195f5d63557cfc78a2330b4cb4231bb56ce44e236a47f693dd054c2bf36c4631e192120c24ef37948938a64863fd4324699a7553fd765a5fd31e0212106ddf3f5475230bd21b842762fbdb96d0159477e42cf4a6cfd759a374ca7e93fdf74698bbe266f46f47974d3404380044355064b4e859564e634b5300d8b70cfb3b8150b41fed501a6d5773910edb59fdf19cbd0229682cdb9a71ebaffdee7cfdc3255d4b374c348bec202afdc0239e77af85726ea76475c2b1745a50289010f459af825b0e739df0ba241345c2827166226abf9ef2b6dad2f27c47e2a46839a55b9b73791538609949fe7c14166c93d416a126c1026e5249a5ddbb9089362e7f6d965a349f655a264bde3f1c79ef6946ca36cbd7ce3cd739b39c84374beb3d3c005cc491571d2289c93603437600b2e18a6a7cce67db8a24b7560a05244dfe3f44f450f2f897f776081e493bed5c188994944a800ae436f725450cc099e294924a489a0c61071759b3a3b2fe422e2cd74b45d3581dc7cd7fdeb5e229eb74579a234b896449593fb2c8dcd9160e498368d0b810183272d2980a610c6c8b758f983a2c01a3e5508010b39f02b4bbc5f14a8b70035cffd7978377f4145b20b85f262742d047fdf6adba13e62d56135d652aa764c595809f9c54411ff6f5355802893d5f0592a21497687a2720dd69468a81f2413d4de71547017226f99c403961b60c4b6054547fda8982e9027ff49a2d0312e875c2dcfa53d41fca604cea230c17308559e81cc8e99c294200b56789c4dd08130fb8489a391e047f66692231b1237aaae16101278f8f87ec4058bd5df7c8dd4c9556cb56f9185ed3a7492d138cc5b4b1a7d4477be304a8ac7c3045e9ab8c09d478a1108fcb953aa209f8212b6d33968422ea6ff03408a68e0520f0e59b8f86016c94df4c97e0d067213c2b90e8b15ffec62f6b0d49f53a588478aa82e3a670825f1614426d80f72b4507b2e5410a7a309787c39460b195f9a91a0c8bb9445d48f0c827ba0624681df8bc14dda459937bd4a2e373ff27840f09d84ad7b08a78af5ca66345ffc268e01fc951e29bd3aa9c21a9bb7fef23c8f0affaa467475ceaf2831082a267157137cffbb1f6806a391b05489fe4825eef04e1fbad24f213b83f3c531158745a714eae6c20e3369aad620aaa0a88ec96e88a50046b969d09277b923988fa4458a4d326dd628113ac818fc02ef581fb07440b57f898aae5ea8e7c04240e8b83ac3808fa38fafdc9107822d579167604e3e83154ac2ef9f1ab741dcd91e2d026ec74d4932b69f7daf4d9b84762cfcb5274769cc42785d829c4425834af50fa241eb3c530ccdbe13337e0001ce46ebbcc3e1fab620e1692bd917bf102ac553b9bee40a67db008ff8ab32a87beec0738a176d8012a90a3ca6ca019452c6f84aba30efad4c38eeef5b5a2dcc6e8020e371b8c4461575645d9d0088138b88e7636e6bded09d395ea6f01c67b766b9303607e76668fba11288edbb64464bba9f1b976e701cfcd42bdd648057f0dcaea07c5e5b7058c90556467d6f154302cc3debc190387eaf02f1c9d198f582d5bf7272232423c55b5844387c0ce44e6a14438204092bc8143f7ed477fe16349b54dec254c2337113177f3aff5a0a9330adaf4b1df4df7e063b1efcc293fdeab8d267f6e08afbe94a32dc5983592cc7263ecdc39ff9a772d5daf802bc3f6e6108cb244c5d7048eafa81944a84bf53ca5d80aa3c868dc5280914ed5d7cee13fe9b218aaac06deca61437516d16aafbc5960524e4306e3c63ebb2da76da381b1045ef48aa0f8ce85c9ecdf8dc5c762f53d03fce05bd4cd57c6a07fd76ab8a3c0cb222f4a37c41a43978f72c3e520404325c90e37d49d0010e0dafab3a2203a94ee56013d5d3e26e9c0bf10a72ed3e662b78e52d2b26e16f83316e3d4e3b7a8a246c0d65c1063a6e5455feaa9ed558c787fb877f9f8028875255f1b61faf1aa9a2368a1a30b265438c1fe4f94486173e8bdee9203f3a1145a6e8918b2ca75f73bf94db4fb7044adf74b354ca0cffc2dd0400f71b2ca687e4777245304ab80ee2eeb073b8ee100a69fcd0c0e14b107c1180bba3fdb6972365c058fd9d4d6ccd69623368407d4278b6102866bce8ab1dc91dcb885629349c1c3c69ddb1742ba15d77ad2b51a1de5f564c8b84a1a4d12b1f5725f05e010aa222d792258c92a4cf9c4fa077804b61ee7cb82824d2de91f8cd7fa35f3f3073a0f165967002fec21fe72370a271f6854634b220610fb17c4808258ae24c438216aa6dc3a9a87cdb07f29edc443cfac95d220749363b8c7d3cae7e86a1b622fc7ece8f546d1e9fa30095b48de9b9ffd09bd8913e76d7233def6a859de0982ef28b487a68e3d62b2ad05ec336962d90847b612f94cfb938495b3ca8d89b575d5b4a35a7349bd6d1ab26a162281f1480cdfbdefe07d636b7c6ac6f6f4fa8cc3f5ce111680637ed5f3d16338012d183cab5ef85437f40d1ff5eb7be8433587e1a710940b86dd19a5808840870460bed53266adaf48d112967eefb72c0640bf74f61baca8e0ff5c70539d52ef29e40e15ecf9793314103080bf18b7a6f6fbdc22689ed58d52b4226fdfcdc222f9efad3ceb381c24cce8b292b5e7811974dafc2c2beb05c81202d2252b7b70bd6ad061d3149dc9d7327e318aa2a8cbae8a63613293d16d5ab62965975a500683174ff33115739f0b135797906d8384b71c07a041eee92894dc21f2b8230412112d263411bf5f1aaaa1f47bb875df650c6bea08af4fba42ec97945d2dc118b896cd2d3ff6cd881c392d31adb4e873e6d988b2772d7f446bc9ad3f7dcb79d5eb21f4a034e11566dd1ae39838890bf786f32d8c518182a8d353e1d014f1149def4fafff4733850df5dcd87020beae4f8b5c92504259f6ce552516dd10fe60b137308ecc8d44680a04ec9b01848129302322d9cd23e7e656cb31eaa3742dcca25c9d71250636e589ff9b278ea22792da2ec92c449a035f389c909e21beb2c4c835ad656b3bbd339eff6601485fceba7a44e1ab3acb29029cf9d5e901db656265af9c83240a1d4b03bc18a43d565bf1b672c807929a599e26759ed806ecd28310afcf01633d35668cf7f300fcf6494d220e9200fd95fc0a8487405e59b80fcad19ec37fc98997cefcfe9a295b0f8453d46cbb7dfb4e725e663ade9927838179a9e517f46f5ff52cc45108063430c8742da13175ae10dcc48309433441d6724ce66392e98640a7d4334ebc0a34df7232679c5458be06904c59d4f4c455194000ae36f428d18f2fe740f0ae65117312190b7ec7de98feff874e5aeb741baf59fd4e03749137234ad993d5abb39030ce4289bedb5f0e575a1b185efd56a170e54d88d3d4528aabfdee628995e2c98d6e890d1303c4f70245cdbd4058bd341675aeddbd376424e3b562b62af62750945a0a51a74ec7a39e5c4af0e126f304a93c166c4803f04bfa858091589f817453dc496d84294346bee7b8f20f0fe6052dd401b157db1cfb8031d3e6053197fa98e77a0c7a83a7282e8da149fa002e43d6f735e62b70f925ffe56894bc27e813915ca1e9f5fffa7a6f001874c0e2731d50868b42dbc544e0834015cb4db968a428b047de33947bd7456978a5d0eb5ee72c35c31c1e7d834098b4a0d299351332a09a3abb5e9a332726772e01b2a157f4c990e664e13168a235df7957215d278d18d4aae9626d032e065d9b69945279e89583b3fc4a7aeee4c515c16c6f33bcfc27e541890e60e7e4a07864ee4459c153e5e0ee521b8922429b6ee318659a6822d6c15ab93647ef6528b2d39426e69192809ed4990596f4543d683d060ff6bafc5943566b58e588b49e9f997180b4f34d98fab8157cc56b6b5d602466d03a1d20174df8652c18dde6e23f8b5f85eaa6232e1456770d822f48a154b9245e46af4c135877f0a308806b92ce8318d43d846fb112dace76a4fce1af98082478ee2f37fa7e8fd5d2979323307fab7f73e362d6bbc38079313f61aa29f95b136d290619b2f838264d1a9c7f2a37252466031a36f9564dc353ebd6ad0e02cf2904bf649ba4458e0b8c7665e318a40e37f6bfaa4c2ba4e97a3dec6c6a63f9e2dea3e2fe6ffef885899fa48d5ded5880316b5c680011a19f0905e848d3c1a2f7cb580e53e0ef76ca998c392474f9b884cfe06a575a5b0b82b41fb23e05aa6bf7ecfa90ddfb1e386da4516a2c492558a1e500e7d3273c2f89cd9c580bae340168fc3d2bb0db0421cdf430fd747b7af7a28a896519e96f83009d664191987122205e226f4f01e8fb4791d02826ebbaf8d7d52034e5c06f2b44636bcfa2ce1ebca0ecb0958b1f873a7ab4fb16b03315e5409303e02c0159f09b9992e2e9eb49f92cfb9bd69624f4d7242ca9a55445236704507d2488056d0baffb48e02251460f8f3fe9310eb1ee449a0fb88f0acbea44957e20984f0db5b3196a14753188972884932dbd0d9ca818d0d5cd97c49589a3866bebb1922cc3432b2e0ef38700a55ca270c6a7faa568a62cb3a86fbc24c435368cc7fe03ce09f246c6c3404fdff5b63ff1e684ff8fa25da28ea6492dd0f40361aef671df2b1cbfab9a5c88ee81d864b9da0536cb54796d57cfa19c3a2c97f87bc1548874137fe17f02f4ed82eec2aa30be330157ca52494ae9f842fcc0b8bdac94899071593ed2ef63790805465c285a80a371439a4d1cf5ae5f7b6ffd3f195dc7c1320f0838a501f9d24f0d3b6eeed28b28b49b50597290f6f9becff35d0815882a98bcfedb688ec02029a60bc56f1fbedc0e53df529a85f85b96a8a511f1f0fd58fa9b5ca771056b7608dec0b73866169cb07ae1961b325fbda6ec6c53a0a611f7adf3fc77f0d6664b1c346919437f59c59186b6be84ec9880c66e4425f8edead9e10a2cc61f10fe042b2ecae62de33e2d9169cd74700e3664a8c09e3e73a841de9cc40853f8b4a63c5c76035708c508ab1a472188f1fe9b0eca79763290e081af4d9183fd10825f80a3bb64f264fbef105ad356edc13107ca3338302e33de192e514420102bea1f98a23014783e6cca524409065a104cf1a7c1b4c356322aea69263fe751967273968758815821c9f00da61abd3afd100a44a147cd976a4f75eeb16b0b18ffe230424d92c00151babca5807f1b5db812e049bcbeb99b9f9e6d1ac44655b2aab55b26b059e68aefa4854e75e74e6c2144199aca45243824a4e79e570c1d96ae6385c5bcf99e17d8b8767b1dbb47d100651d282cd8433e6f4c318496ceebbd43da27ad4df30ecb619b08341a579637a003a4f8a375eec4fa00dba6356365306356c2bc2bcf3187be9c2fa9bfb3d1971d4ee0f06d234e9855150623a868268cd25f1ce12321aba050388818891faacccc47d338222e87c34180adf0ae3f870b54fff0f07d3159540d800b119ea2d35ddfbf22c1f4cad28cf3a361cfa035e108248cfaea9bbe387be5ce7f5f6d371b47491300a1adabdb3666e613e8a9938238d61fbfd3f18b13b8e9904c50cde4f2db8e2a811a214026acb34b28596377a811b79f48f610b77410f341e654dae3da2865d0bb46a56967e309a30573f9bc0ce3fa727fabf04f407cf4cb11baf5d6fb1d230ab40e1536d3583257d9c0234db6d75d0fbd1576d6d3e0ef8e190346b0d8951a91fd444a60cd5c02ee090c98a9632d08120cf443a62ef7147d4023cababfc69c28d9cbda0d4925eadffb28c2a066c1832919c1189fd72ee8192387a855e5b72eca4e1b190403b1c87893204a7d302d54bc81e66cf7171dd116ecb181d540c2eec0a0fc6c2c222dd804c0a70c4b0656db3d5d114c499081158d28aa52c9eae7cc560c22796dcff491afaa0b80a501e928b6cdb19e0886db36f682bcc2e6135710732a9ad8138c9975fa70d84e743a6be3fe2bbd46f9cd550c11257444db2e2aeb8910e0a9be913a909681cb6c54e7e9fe67eb12143678c98ea158ff10d81f0e639e2a93a03449392e0d466df8729f82eba816f72b1759723c633f6cac141b963a88b0683623326f85dfc7baacccf70e179f5465f8625c68d85b1cba54621a39d1af33908e2435553d5b1254f82a7bd6db3061b74c59e8a10d705e5a4dffbd125a837e3f9b5fc488c683f0800a3120f8f219ebc1097b524baf58523bf33c7813dae5186df7c25211b35440e238cf4ef69227a36995251d83cb955eb5370393ea05716dcf41f2f0b6824c240a6f7ed9deade66142276e352ce12cab40cf289ea50e0b40cab5db7aaf289da799b5e9c8ef0f852709e5c73cf1369dfe6ee7d96b4a0f97ed85c6fae88d5f5976ea1f936415818abeab1f1e2ba84370e2af95d29d97c52934a488d0c9c27b58773afa4bac7a9238ae52303a37f68d6ed3286b34700cf6a49610cd6a176ecf1fcfd2a9379dcad741fc898b3f30b8a33ec9db6f1654ab4aac8b40b75c1714b98c64d0ea7189f965d654be73c97e0bab99bf8e95a6664e92c9f93c07fb602d4ada04cc1d4c768a597b3c3d3e0262fb514b6b69ec3fd78f1fe44a98d26c6c21d531da2681e79f0c7d8b2b397f4af3ecd74d7e8b1b809c819aef7d47ffe37033c5be6fb4f767e8f6b1ce4672af0969982eaa3902cf3c2387ba236a2bb9cbaca95371be3c2aac1d527060dcb00427f644b66e55425dcb023f7051f49205c3cbacafd422b1e28fc483586a6ad10a7540149d63aea3baa3dd13996ec707b0c176f0f18a01efee82ab51d5a92691ad4e88412c30af400cdd2a8771b58d91f18423d518e4828ba11d2f133b60bb97a9515ef285516554e140cb250108f7c8410d36106fa6f054f3808cc0c2936ebfd4a54d232573a2090b8f7c1f24c0f6d129fb0f856c628878aaeb1f428395fc14e3afe67f2f52edcfbdcef4d11f261a1f63c9c1070edea5d4c19aaa3fce6824172aedc428b0e4f37d7d4ed8c289b75da8bf6e36e6a3e8a25a9f1cf0f1c363e7851f463d88810ae819b0252632c229f8d3698c1873bdb5d8ab4469e5c724e8057c4696d5ca46b1236ec87013959e2c25255a8ae32995187e4cb9a855048d036fcca157ec3aa4228b244f06ad68a109268dbad6cf590e6631d77f313de72d51dea2877f8ef7e6e389fed2839223a69c332bbe548be0b39668bf1d08dcdd891532ba185f5570b5b97376354e61a5f57468a8ba1e27e5aab5f567e77677b8c370a4218f2d22b364af7e1c74a1597aff31088a51f6b11b65562db8d4e6a9a307680aab503541499c8ff3a3df41352c126709675fcf6705cc9d69351b738602b64ae957235182c637b02036a63cb2b68fe702a3a45d0f922819983cdb657b6d93bd76f97160bf5fcc7171895ed07b47e05a352729d8104f282e85cb980682eeaef1a45205361646a78c4f638adc230939417f4b88998187ea3bd6331fbe2694a606c63c4cb46d748c51d372b81b81a7272e39e41f223b4f29c993875967711d96ac91be8eb57a83e6f3e9af28e13f5c94387a2ac79244cb54123d9293dc695f4c1729cb811932512c8de440103f6ee575b4ceda7c3934b9452c2a827585627452f4e951351e7c393c55345dc7c3b329af5e393b273dce71ca37703d8a3d9919534520935a4210f989ed89703ee5e2cf13f95c33752270f55904d0b586ab18e28f910006c1cbbbe9f71cd9e62355f86076257225822925d1265247d894814f0d6c6fdd4df4976a36b4d71414b2192327a63e6e8121d98eb3886ab85ce948c629f803e3df9fa0085346c623289121ad29704a8c1c63b9bc207100aa25df6825282a95993c9da0d6a8b6c6d1fde90409b79c5d4e71f47d4803d60315aa6ec6addccea5ab6d26c87a66cf012096ca51419d09258aee663907248f206acdb80bbcfe6052e41ffc580f7a8bb8b4be3319886a79c98061d128974cac21321e7e8e96822fbdc262823bc044aec29d60420c1a68f865a6bb02f81414f7bd145ca8ae5c13f0a799b690af9bd36470a45217f8b2234e967c5a3d1f1b3144f41668774717fc915dd18e107c4fec67a066483719a806fa3ee04c67c8d578294d70a50d76a02fa283d3e28d83141ec2354ec5ff8805cb5235290a10e6dbd6637729aa52d234ce33536fed6f873eb07b54ed55e191b8833088c20ad0c1d7d1867f082bdb486b9ab9c2be406b777addd93ce208143ee872aad4d539299c0ed7a259888ba4229997987308228010381f37262b8f71938a7134d865ff5e16cd9e218922e461d8b16bb6d1da2df672a2a237fab6de253f31d34f2edc2c7b4f5c2ed86e9d66466c13a056af2db12888029f7c61ea0c012c1b6d25aa9ee4ce02ba485a715b501c55a503583340223e78272d28e7f34ef624a4202331006e0be003dd3281ae505e08028536f0ef4e41701cb54087d203290b94497fa6a045e4f16b3613f58dec2951717effa1ba97533d3bb5a3932f09915bee2db794322529030c074807d10628ee73c441c51f2820d8aebcfd888217e34566f81c5580edc71e0f4686b71f65fa145371261551a95853a44d2b94783111e786cf0e86a107a342489f628780cf3ea4132282edbb4f9b52bc7d0ff262224f8ccfae046cdf7b1eccbf7dcfe9535ce1cfaee32aab6283171385607cf61ba41e0c8ab7ef3cfa245107f8ec3d7ca070b07d47b5e9e4edfb075e8ca431c0670701b6ef340f2665d527992ac0e71e9249f98c509b50a8f06224ce8bcf6d85a0076382a74fb28bf9dc3d9d10fbad6a93c9db6f245e8ce481f9dc41c0f67be7c194de7edff449da6073ec89b7df2b783152e8e573b700db6f9b07437afbbda34f1375fadc34a8e661bf65da340ac38b9934a6cf7089220fa604a84f3355c36718945aa58684b48964092f66e2b8b0f3edec08f019ee743c5d0fb67ec48b993c03f80c7180edc31f0f66e4edc39a3ecd95003e439b1b5bdf3e0cc18b99422e9fe108b07d683f883e59a8169f5f1114dc61ff87365d6fdf022fc6a2812de407e0f3cb02b6efc383b96f7f873e592d9f9f0f108bcf8f08d87e8d1763e1b0e8930580cf2e5ed8d7a14dd8dba7f160e2dbe7da247a1a3ecf80ed3b0bcbe78bedf6d9b1fd152fc6e2597930fdd67e6c137dfbf0c55842b0857c6b7f8595617570a45a4cc590c2813195e7069cce4f3585802ed5a53a1e18537162f060592b8e35d61885604cad30a21096d8ea00a8156a85a2813198900168b0ec0a90ea525d0a07c6603c2f70b04cc574a92ed5f1c0180c0766cb8d6136484c4a211883d1bc48217cad4ea8156a85a2813197908926e5a7abab21d5a5ba140e8cb9785ce0747eba5204e8525daae3813117ce0078b0fcb9f2d38512c05ca1e64afe148231178dcb1442f989ae5aa056a8158a06c650a100d0a4fc44bb9654aa4be1c018cac302a7f3134d01a04b7529f9160f8ca13890061e2cdf5af989a29c453ecb96e9b556b54708c6501ad802e545364b08af44d416515c44cdb079112cbf6518ad80aacab312c3b66dda06557545852845ad2a6a8a5a71b0fc18deaa5454a551b1a1526ca84a83e56f28b29395107682590cd3522a0a86a1c04e30dbf160f96f023349e17c2e5d0c07cb57295d273014466302439960288ba1301a2c5f05898e5642a4955d8d5642587e8a128ba4e32175f6ea3a1e2c3f654e4fe1a452291c2c1f6544e21c652ed44553572579a12e1a2c1fc5112e5d09ad562b212cbf5e282eb43d58f634273b9ecebb8e07cbafd8499456d59ca4299c52eada70b0fcab35aea2525b20144569600cb6822de4974a2814a634d802a93d3ed80ac6d423bc16f2e5aad4d59c9a84967f02eb6ef49345e1d7a66c5371a6b5c61102d95995a4da64fd49c6cbb740ac8edd71771da7a938bfd6ae39f923adf6549f949faa9066912f8465aa0ec13255bbd722b1eede8aca155579d41aa87a2aec6daa0de0ae533b67915f2add6b43e9bb0e965f479a48b31ed7dda2bf765d9b80657794663bb8d4a6da643723663e868c977f72c4cd46c878ebad871b10d1fe68d3932c999c3615db6dca59a41465dbd71fd8d2a04a8606799aa5a735e8038540ab93f213544115b429df32e79bf3e041ed7afae43ace52759c0754f9c9fe6816f9120896726ed68e50301a76804877ade8eaa6f42b9ab2226d9b5c6dda0c48ffb648229148d7f5b1360ef659ae563c6afa86d2be691cfa51eb1bfaf4baae97df385a78a71f9ca4f50f7eead48d24c27d7f7a828f85f4f2913ecb22a4cf254dfa3c69e4fc975ad05eb64d9bfaa954e21281a5f6797a00fb98353db0e4f11cc4017e9c017f5a1d86c017d4e8b6d21c095aa4cf484372258914e1623240d092b627a18bfebffde5ef70319148442f6c45daa1010e78a66b3389c1849a98fc4563d84818bdb7b46a27d2260baf2c2d5b71471667a24c94993313356b64914933794c99b903d3a06155aea631ba23daa6dd153541e3eafaa7711ba7395296c2f20633e2a634275fe551cc3fc5f0f2638d4d9b505e7ebca16993ed81e5e7e8034b14963ce64854a1f461ac28a51b8d1baeede51009847db4497bf9d68d9fb697bfa24486fafa1834af2395a743e386c6e91b3f750d8c4486529a53d1340f6a4ea8594a9fdf0a484eff684ef68dfcef1a227d43e525b14ba66819e214b95279b9e251d3e3e4e4e4df3bf9a8a534a7b2959a93f2e95da1f82c57284a58224322d1aa4d96c890287b0b85969dc8d56a6561abd50e7204c36a1a9557e66097a2b92fd4b7923b85e7573af2a38f0f816aef6893e7e079ef0673ee43adadfb36c3fffedddc7ad7624e9b2c20100af34b54782d4025f0fc67c5ccb5872deb47da1bd1e27c4aefadf5fd905513ff12124b83401e6984f4b96f4a7f4ba41117356e4d6bcec7465c300cc77af71e6aad10e57fbf5a1626e310154fec8942868c543b3a2211bc378328540ff7e14fa7352369104873f35de67fa97427cc696e3e46846bbda49f7ba6712e0cf2f9243fbf79748ff6f1a387406dba3f1f4e149eef736eb16ff07c126d072067995fb71a6c9b235b07198d92cfcfe7afbff160e693c027adc0f047eee8b1c0177d49c3cceb936879062c7a9296bf84457fb57cb1080828c36ea514cd8717fcb677e1e64fece6663893e3f2aa737bd79499f1b60c61387d7ff17b7f0fe6fcc032e3a8ee0fb6fbfc0177b4e901cd49eebf5492c2cdfef067dae4d0ebfff39cd7427e6eb9e12cf2a2b4f4299f3304cc915a8ec31967914f6974aa510d0849370eceb4ec99e922c3a5089eef13f2c898d3ce683ce79cd3e7a4f4de52a9e36b89315ec98e067ee0cce1c7dd90d747be0dcadc9236b9ce852427c8000637c618638c52c61a39e79c724a29a57c2a295f4a29a59c539ea0c36f870815aea3b7f2fa716c538c1af081df8e067ae0b6f0bd53c630246188c2c559ae18bfb7a7c26270637631651adfe56347af59c2cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf129c3a848f05aeb650df6887081ef8ed1041836b6725213a3aa74bc75976e20bfce8166282e8ca06fc60e2a5e3274a5730e6aad1b974746ae88ad698dc135c44563cb8a464cbf106c71d788844dab20361d514807c3a20f8de2d7b0d268245a22d77876f82a09393c2c1d90cf6f1c22a086808c630d8035b404b0cad8228cd5142a7d299b2c605bb74ca094ae455035bb89faea01a68e1f8b2e2f85750bcb8807de268751802cf8f53c67f38c71dec510705eff4e280cfd1050df81c67c080cff1881d9af4fdaec43be1b0f13912b180cfd1030af81c43a043930479273893c3676f42023ebb146a7cf62bd0f8ec447a1eccb5c13bc1140e9f3d07333ebb0f647c7621dcf023dfef1f7827e84382189f1d052e80d1222abc53cbb4160cf0b99570225ef4088977ea9b22c07cee204d78c9be3b18983eb70d3a072eda86e19d7aa88b18c0e7fe4093c0a5b1770885007c86546861f195fb0c7b601168f80c91803bc0fdf088777295b3f8ca8330c070053004efe42bfa7dc5008b7861c0fdb880fb2df03ce5f30b4ad15de39da28e0f0f66bef5289fdf4e0170d7d0823bffc9c88915ef14571ecc3b5d41fde2d4015ba60dd818f072e9d8d8325dc096af0274d8b20abe6a72d8324dc0966f8d99ab06fbd3d8b28ad3150e5ba633b67c65a4fc6fd8b20aa62a046c99c6d8f2c5d007c696559cda1c60cbd4005bbe0590f17fb165156b2866cb1466cbd7869b21ecffd2f9c9ea4e5ba6a62ddf1abaf377b16515ff1ef2937543802dd3016cf90aa0876eb0bfcb9655dc6ab1651a802ddf161b7f165b56993e00d832a561cb9745e583fd3957d119b64caf0c5bbe2b56b6ac126bfc34679c45c7fd63d8b24a69db72e96a5bbe5f4355b64c6f8a2d97fc53b6ace232c7af203f49942dab94506cb9744fb67c73b07f29d2135ba6d7c496afc9e65fb265954a9ae14b37f6883d482e9deb0997cfd55d2a1ff22112ad31e95e35170eaed47573d9788ff78cac2e105c3397cc502af55a6063d514807c3aa7719ad702a94d0f7252374141af053616698d6b36444b40517486caececbc962e0b41403e6dd336af0536aed84d10747252458a544bc652815563a1ac191f1fad31a635aed4c70bab20a01f3fae9411543a3910f55ab49e73661a316d66cd4409f9f05a2ca025865641345e0b6c3c7394d0a974f20a5e792d50bb825e8b53019ba90146c48d12d85f0bd8319fdbdf38be9dd7f392a5748ddd6d6dc4ad1b2ae1f65f412f380b00c37f1d26e33a2bec04c0f0f3f50397d742b3924ff7f2e2fac1c9afa094190c1573e9c016feb906fcde4590b3f8e9c51ce0b1e8c01837c11e040c33681330c4c32739410c803886d0938424924822892492482289249248a2a7a7a7a727489020418204091224489020417a7a7a7a7a80e0e08bdbb3e69cd2f67facbbaf39dadc0edeee5b7479fd4218c1860dbbdb4b34e08e1c6c11fd71d6e3e0472933d7011fd83348298425b810461610421c5c941912eee0a08e3c04ee8de2cc02d2c01923c487abb88a6e5b4efff6f6e601dba39c16bdb09a59d1e8461d5c49242526264e944e50a0a4a450a1f275cb2c901a2bb06d13fc95ecc591e8df977c6e47ef2db98db3bc15e4811676b5a7552a55112258de2a04f3c1cd35956ad38f3ecda8dd9c73c5cf883369f839e764f9c933ffe79c53e5a7d0dc7ece39b59f9266a6fc9c73a2fcc4992a7ece3953fce499a59f73ce133f85268a9f73ce939f93669af839e72cf989334d7e4e28846792fc9c735e3f1f1e311ffe9873f64f8b2688392d30477efe0f3e3c18ece79cf36bcc39a90b3c75a0f160eecfe7da447fce49ef149af6e714fda434b3fe7c122b63662ac3e7cba57c15c3f3744242945ed4aae2a056a815aad2e0a4ba549712e2e9525daae311c270502bd40a85d1e0a4ba549712e2e9525daae311ba702c1ad40ab5425d3438a92ed5a584788456509c88533bd47f090d4860597133c8b0625bd99af42af5ab4aad239bd56a7d959b8204941494918a9aa213ea523a944e543ac1934aa52c8a139cd289cc04124ae66ab5aa2656ec844ab60e2399578aa7ae521744c285bafa1a01025aad562b12c530ac07eb84ae6e76b1eb919175533ca9d44c453a2d90e624ce08355151d6fe6181fcc899217d703b3f79778a013ab8dfbfcac0c5dc40b9817203c9b8f3c49bf7c9ae42f90c8b9512eff16cdb36baadac68a08a23db566c8d195862ac5f6d9b78cb872249be26b61e62b2358bddb24d867ea658b5f65bf4d8c5304c84fd08135d1856c230ec5f300cc330158661d80a6b03cb300c1b619f6536db36ec57ac0dcc6e99bec665aec5af9a74b9dc82171011286b99190f68dfc2229b9aef34673da964bda7721c05af85f552731f6ed35c8fd762fda5794d0fe92015604b88070d1120f7eec138befc725739be9ca54df5af872fc655b085f5d7257a1d238ceb76d917f8651bb0b523fbd78e46cfa7b30fa3edbf88c1f66d78f65f1e4cf69ccb73a5b7d65a3bfacddab0236bed6da03659a3cff747234dc5d6b87894c17bf568eba11b37eeeeeeeeee14220d4773d68e14a601bf9d1d3b706dc9a0d6d5dd5bd27e6bc3bb5b3e20da323dc42573c9a00c974f371c2ab606dc7a78411d0528642e734b5700596c53b7d64380825c1577747dabd4e3f28834d87a0f03f6d67b910793fd09764bb4a98788c0959065ddcfded36f9f5a0f7bee96290e15fd76460e020011212482adef7f449ab3dedb0880690f765d775df52fecaa29fe22824d19d49cd2928a7b15150b88e276dfdeabb036e2b7a7b0394420efba96b9b7e42d033bd85d5b7dc97c4a805282b0f5796585adcf2c86b0f5d9854be7f1eaebba2836e3c2e8735c749159efc2d65881614f733ab82eb2a9c19986321a8ed7627d9440047131055e8bf513782daca7253ff9d0400d94527ab841d4095bc33758037974479f188ce1a14df11ba8814a1d84ad066a16eb9d62b481eaf67a4890095b636e60083e65d87c92f662b8e638d22cbb5e1ecc8b7938db707277ef5cd5f7453ee9b30b49c9e73739f1fe36bc98873d06fb9fd05cd52cd69bd05eb39868af4bb4d724da6b967b9d581bd70bd5e87aff2ccaaeb23eb3ef9b095b43b40901f168cba2cffefa92b571bddd8480d8ca0dd49dbc806ed796657fd9172262fa3a4698feccb62dfbe0da5582eb3fe48558369ccb73a5bf256abdebb8676f626dbc601d3a2fb4151a3ea07ef8c022363b1d4493eaf1a1d8836465cc2fb136e8666b6ca08d7f9eef323b50cd593f626b4cd18b8b5bcf592aac0a373710ac5fa1f530c0246b837edb401ff06644e4f65e204e833c604de62a958a7ef6b93fdb20ca6e225ba33efd5a3558a3411e1a8684f5385e8b8cd53b66b217d65b169411f2febd7f3971c1cd1015a3f3bc16eb5d7315156e4301e8c1d0b7fe4f4e464630eda71ad66d656aa36e596e686b60dfcfe2806d39aab5411e0d51f4ad9a4a9b52d883c34f2faacee781e80e1d6c6bd8ef4d083883bee8dbf6534da40501b1dd2a606d9ab35cbc96feaa615aae01f70b6b63b50c61e043cb2f3630959203adac657a47cfc86073a0df3f73bddea2b7f40de45a0f1a862171dd7a5751eba9c521c7cd9ab338f496a36e3d34677d1010635b059ab39ee26813f6d657a08736c1ae39eb5d50b8046cc11e68e3271774e7f2942ceb61e7a7d856a79456defa6aca30f9aec527693388df9a105407c4f45dfcd4439ac57acb22a263fd73eb69b065f5f710cbfaab866f77cb9ab3626a0e513b889c278481094c880113567244e1f8f01f7eff0fec8fe1e0c6187d6896f8cfce90985ef49ff4d15c3f0ce8f63b90ee1a21a59ecbe3f11d070f26057ec48be91eb045a43f7aa8843390814747fa730f79ce83f18f5f3dbeb50ab0a2e7a9ccd6803fa7c43e37c8a239df62ebf0dec9538f257ece155d8563f7e0e6e87ffc706e9bad6f5e6f140c77c86ddae4a34fa236cd7fa6d6e91cec6345e2c1643a4676cb360cd70cbf836c0df8edbe6aa11eea22cdd243d60a366c070252e2e61ec2407f12bd03f99066f1d47391dfeb25ffe71efdc2cdd140cd4521cdb54fdcd1a6dc3e38c69907f3e2eb08a988c0e0e6f669216d7a40fdfa6d9d133ba7c473771c0806d2dc0adc5f61cc71078edf714773d1815e4b7c2ddc1cfe41c0e8369d83e3bb4c9b72f4c38f45dab4e3c1581fdf8b7830d8d7c7a696eb9661b5727f07d91add58136eee148e36387e074520ed3ad973d09bff682efa909eff2ba594cc7f747417f22ba594d83ee2b74d740b95dab13488baa2ff782dd18174f780317ec46be142bea7c48363dcc131e2e0b5c4cf9d021c1d08b729fbcf8fef400f060a0fa63f7a50ff7c9f5601fd107e77f398f08a150211718d1de18b52045142521e3f72ffa5d2bd310ee98e55d4dd16ca4420627cb738484c9b8b31fa77e0765140bfbf9874cc8781c4b572e8c8e111f54bd42d36d78197977effbfd868683a6834248adc66c8194360199d469bdec97b97054f0144abc6af1076d6d15dca2d12c131ca2c6e2e566c683debbdb8b381d4fcf93466493ea5f7cea759d765bc975da0816a25c6faa86b367b15c7b8b9d4803ebc60bfc00bce01ff6db9befd5a3d4f250299cbe630f271e4e343ab80918f4ffa112d3617738ed10701314a0e2bd8be7decddc64fd481c41b2cff3d18205bf66105dfa76f227a97f994de2bdfcc33e0fa511b799296e3d3217864cb2b303a5e6d8461ecf15ae88ff0d54443227c35db63f1d5b25486af569da6e2ab614118bedab573e1abd1b6a1f86a56110b5f6dfa5c4dfe90f86a115fcd7d782df461340dc7f7da565ecbd5e0c32f36873b476c03eebf2c2cee9725ee8e706b10c67af2664c7d4b2028094ae86eef97ed36600b51227d8ba0768a90c10f085fd0c119ce7c21855dd2173443697c23f4af87330f0666cdd1871e78384a14297df8a1b9eeee255cf93cf0e00ca421b826701a0ce10cf4ad873892d29c8c0f67e2d4749823a5e6766008652e9f1e2285e77baf037ec6009eff1e4cb6e9784b6023489f678eecb9e69eb5d65abbc9b7810bf17b59a6e9c8b44dea3004ceb6f758e4b965f266737ea6e5f9d9c3f079b76cd3613dbc4071cb14da06bc18a2a79848241a899c625f479a68341a8946196d2b63e44764ec70b70ddccfc01031eed76967e8804be022e0ec7ff2e0ece3f5a2c72ed18f445a965834dabeb92c3fceb22d870ef8d9fe0e77bb5fc41031ee5604c98f6c9b0ef8d94bcc88fb24a46de624c6dd3c70fffe94f56a1b804bc49881ffbd5a0fced21fb7f75aee86436b02ee8f2cb8f901fdc8bd3f52c41df9228ab85fc41db9a216fd58c10a58b8f75a924ea5c37114e32eaf9ec55a3fab6f5fe49efd8884c54c52f955be95f233ecdd62b5d60a6fc4a8578ee3388eb302a594529ad9ab6299bd2a7661d876c3d68851af1cc77196cb382b9ca01849898909ec04356192955812ecaf2cb3b5d65a6badb5565aebbf5affa56badb5d65aabadb6d66a6d96bddd6eac581b75e361cbd8e3c0208e304257752ec4711cc7715784115ae932be4b7f9b437cf71cf529a594d2cf1c0f385c467bd5af97afb0f52e0417b224f7428c7ae53a8ee3382b504a29a5f6298655d90bfcb20d38cb46d993b2d1c827fbd7d9c3e8d3eb176dba3e8bc1d9dbf032fb5996655996655946cab22c23dd8c748374335a29a515c70dacc364948e452cfa38e632fcfbabc6e9a83ab9dda011070f8e09d15a2f4b29b502bd28a5d55652f61846cab0ea9a73f4a2f47a8cce8bbae698e3388ee3aeab52ad717c3856214a297d95d28dc64a7dac06653080693778c011010854eefaa9029d4a87e37caecf9db950342de3ffdcbed8f0425a79f9e7fad3d64d08783df6f5945dfead39e656a8b5d282274c9894904029258e3641d8e379787930d8c37f41024ba00934014fc0d24308bf74c284490909941794524a91fcfa39fb6aebf632517d297bc01a200e7c8c194497998dca2d623d281522e2fa3a46b8bedb796113c3300c7bc1300cc330cc5ed8b418865deeeeeeeeeeeeeeee5e67b00dd264a81b3e3e3e3e3eb36233d87cc938ee390eda642251ada24afabe312289ea065e0b11afc58c8db3dc3467717f697d29373833cabe7ecd348882343e375e8bd5320f06eb1b6c7d13f1609e8fd672cfbc1b3e4132744608c3b08afda3d7b545ac521ab30da220cd4c9b301a148661377c7c7c7c28966518866938b28d87cc5e5aa5194633eca29816ff9a3687c79246ecda78d84e8cb8d6dfe00107ad18ad188d5a7c9296e91aaca75a1010e7f0586a9c9f7a48c7e9bc3cb63d68a1d4d0b0fcac312004e612fcf693154b383e8e57b8f1dfbf9f76802dfca95e8c3b3ce0c13ceaa5d79221ce436029b7f75662741d6c7da534e59fca53aa421fa32a3df409ae9cc57ae86f35832d08bf519c944e9830297912d2c377b90fe1bf8071030d1d7668d394f1f40edbda8094d217cdc1959f6280f0073fc5b041d4b65167a11b44a97814158f12bf033c7009bf1d0e14c13566293495778dfe6bda47cd887fa9c59f9aacdaf559f622cdfe7d9236f2241ae94b349237d14ade8466f22734135fd24efc89567a14dac9b786e251b4fe941913abf809a6527c2e614d83449ac5527998f27febe1509bfc6fca962f45d1541e62ec0a17a6f8dc40b0f5b97780533e370ac5035b5f536810abd074fc80f2291fad0d158ff2aee251be76962207158ff2303a058a2604c4291e12696b07b68268501e46aba00011e3f760f5a7682f36d75c0a4de2144d067d140d12b11e85068b682dd39cf525eb4f683da3354d73d69b68ad3589d635dd43ebabb58fbe691cad53cd599fe53490e6ac9f5aebf44e73aad79aa7bb6783abf79ceb83adf8348b56d4717d86356a8f62d785c58b4a29bf876e7c307d4bb27073fb5c202860eb5b88f4f611d2a69783842b8743de33ae73d22545ea5bf94ac37a15e0a14fa47f1d8b95b62c210e805fc078373c937429c08be9c78d53638555bfd639bbc3d85bec33ec4594da1fdd7e87f645337ec7ef48bf075f6faf17ed60faee9ffd0cc18a7ea3029b3da804ec980a831eaa9911000000001316000030100e868442b144cdc248ef3914001078884a7058194964711044214c19631421840003000000406040a638009f001e7779b6919068760b89c4dd60303ee562dbc6093aa7dd54965ee0ec2dad11e4b572a4634f12e481fd32b06c42d0110aa56923aa49ce425b1a360f1f748f03cdc1d5635171ed21831fab1b219117c1a23348af743e5fdb67096c026b9244030d3b0c428b4afb3a95f6dace7268a7907af10fdbd3616386b0cb44c45606012d58f356fffee4ca1b5ebd9e7fb18a8a4fc19f1fb135fb22ed424955f4b009078d1c5b226978322162abe3978c96d69cc9aaa896d399c9e13134f293b7f82684ac46cf1c7155ebf051f6501a8de34f1eeba8696beb81bc929f69d106813a62af72800a4cf45ee4fd195126196d68f97f6674e74f98bfe787877a5798b8bb5761188b591e99c90571b43fb9572569f770c74bc9080747bbd4e1bdac42d8fd2939e217f5446651faf5d6fbbd617543dd70562cdb99b88a1b3fe9b1c791c0f80779ccd8f47a3c900b2424c2dfc3a929704e082419e80a595ad4015d494c486b64fa090cb57ee66d2179e5da0e45ad412c7016ac1ad7ed12d0d71e828d46f2cc87c66a4e6a523fc93fdcb1b5183a2f58581ae28d20eaae7e0c129848c6479c099c3e6b79a13f34862bef1866bc7a6d996bf2ecbeee32d7eeb15109fc49e4a13223503e2f9657921d00fc57d0dc7e2af0dd14c816fee2bceb7e708a26802ca8405707ce54698bb5e20285621835091d20465b005f3983e076da3b22a09943940069ecf39a3bc8ed5bbe0158768c6650e10e625a30e52626fe1494fd0eab6c12ad0a6f25ba6d86c63dbfc80a01d7c229a62d140f9404b0fa183fc22ae30410ea0d3c94f33a6d6b315c8982ea06eba377b1b6aa18a549c08bdc77cba1398551364287dd691af1e217412d65dce38425a41f6296f8e6473dfb4d313b5198adec8dc4a126a24251dc6a86b7b3784cc019614d3b1104dffa5ecf23e18c1a3c12b2d16b9c6e82ee04bf0b804da0b58653423dd304bdd3641ee027e7a4a11d387eb1f2cabd87de910c06bb0398f984837924432e2251b99fd739339f4acd7b27c9a53e66bc7724d38ea74481f03e3be3e6432a7bc6d003310baca8b7be7c500d22a19b0ecd6830db88c76d00aea0f3991a32201af16893a4571f1cd54b324e1175322263a230b471263a119432ae3018776b4b6673f7324286a65caba10d895a42a27a85b6422c0dab7cb67bbdcb055425095aaebc495d80a4975f6a615da9cbb150691230619884d57040385766fc0043952559e6855b18d465f369a669062885ce38ec0cbb131dc9d8ec02fc6dc0be11315e5427aecea4788925b3eb5615144914577912d9272a25ad64af6421620fda91e0b0f3efb6d58c7fb62e90df3814cc7db95d0850e977a90128910d372b71733d0d4895957053ab06eefb2df8017a21ce2186dcd22c02539caaf6bc4c03290e4a509aaef7a615b1b8b1015b1d4a3d2a4c6a47ada6d2c5eacc612a4124f3f40862c22731e84a2275603566249be8108d3e2fac9eb77a7daceb6d213c94bf25addf8b333555e234ce73b3244bfdc9e3ef421233d6757f11465c1dcbd64c920726618c4f4465b88ea7464eb8e8a110c9fa524ae510bde5c5cd24dc6d3f5e9b9924abbafbc1dff74ce29ec3879de1ee0060c8efca8eae33492859697d33d34134502a0c52289ed1312a70c4b38655acb24566a3e1a96297bab78862de26116bfb15988115671b9b8e7631964c4216c911d316075d17a5b050700350338511022304d0665a02ab45ce8c024d4a89de896dbdc41f6f8b2f7aa2c24c1213024df6473852afdf8fa4e3f0ac6ceb4e144711e7a828f10e43ff3dcdb6ca6b93ac526308d4265ca04c0495b8f7a316b9f2b9cc4b28b08c4334297a47e334ddb498c0b443884c0ee8af02259ed9a32cdb241f21a99a0eef999a62cca044e9c02659dec0c5d6a1c7be1b902b8507592e4938a4e9697385aecb09a434f9cd3aee8a09a028992df8b1df882523ea3a93748f841274c6be916e2654b48f5192442fd5f040e602814901ff8b2687629c7248b32311497697b76306e6916a047b77ad766b28fa7a1904e18043c0b118f0dec409da122c90b9847142900f15aa5ccfd9c421740a6625c8608820f638cc42c788d4f57acb729ebc40e27852e9b0447a2811a0fd05428f9075073f4221203ce8c46e1520c31413019d1ad1d3ada807298c7f47fecc0e6878dff6a48da3205c9d665eb106b1fe753474e00b7f18e9a2527790e4265a94bc74e081c32814388905dd81a28eb8cafe9c8b5becf05d4e44a26dbe21254fa99d4549e9b7ec2846dafc9b2e106761d45b8851ce0582858ae5f087e7a8681809008a8aeca15540814e981aeca796a1d8b575cf31028ba9a1069e5cb71311694de42d268ac06107be198781e013cb10c4918a9573e211c07d31f5faefed6c534a8547c375a4220a990029194829e7daf7e00e49d4903ccb1763312396ea09d939f5ae5612cf17e806a507acdbb129d324d63d363cab063290556aa175b3b669a9f0af493519885b9873d7836a5e9bb0e3a68f3821e9cdeaf3848f773edc4748fba495f222ff7f5ad39e7686e710141f48efa8a2ffa2ef21340dabfffa8dc69a8203dc7c7b141ecbbe6b6d20840826285488568f8986d263e5e7ab9ad9d53e18d22a03d1dd389b339078ac071ba2845e12421d6c58d33eab8669a2e2d24cf366516f69ab78f074268593ee09aedb984a83710b00f1f8b0cc9573e09abae54493c69482b6e37d64f737c89d3b83e695788a60d757c176c4a7daf01477697350b24bc9133af198ab23ea4e50366f0de01a58d140ea78174d87bf49c02195d2325265251b9b0375072e1640ed4f3ebab1d3a7d1c16f1fd0a1e977aaca32e20443ede465d50278c7f43611c57eb29d67ae03e3104e26a06a7220353790fc6c88ee00a2b484ac8e07df0f08c36d8e5427619933815217287b5f31ce5be36a430e9837babb540f0e46b8380a8d0f24cd82d229237d91e94d95a9977411a937abce30da41dfab9d4da3c9bc1b0b86a06db1dafcdf9bfeaf4b071fc7f0b892dda0d4f8e98f44ad8d0f8a50e10ed0d2aeac6c536cd32743b0aab1b617482d03567b4a24730dbe0d787cdf030137c786418b3714f85952806e11dd581328afce996b84de489f4be3765aee380aca3cef0f08653537715bb439a5ce67cfe7b3409ab3fab374d6f5a2b20b5c883a7478ea6424f37beff476a53684bc7276ae11915060c2d4529ff5552cc23ca3e9663d4a212958f0ae277b28ec6b755e42b532f57e19b949c5fbd671e9e9a959637187cc14455310c93eba01276f54b6162d76ca14899701cf67168af327bc80cdee2a1bc8d1bc271ecd6592021db940845289748ba8f589ec958ad22adfc6220c31d8ca1a410d4a16251915966b15b5c9b92c9169d1c0471bd7bc28bc4f229eb647d72091979e16d8959884f9611161a5ca7aa45337952359410617e6d86b58da14e6d9c8388d1c87d3d89ffc8a3475b52a6f5598cc93576983c6325004d9042c43147782daedc5456d2a9ef211e234827afd69fa21847d3b6b7e075977cb4039eddb5ae62036decbc025e5e631f964478e3cead867f232a2e0802b7f8b28d7b2f2e3e811767397c3e183973732506bd3cf5f80c478c839bcbb27cf94b75f44a9c5663107a752133c1cfcc786b3d6cdc37bd36f914433e1471952e9085b1a59c10242be80aa69ee47f7388e1fd6ec62382855d91ccc6dd70a937dc76261c1219efdf46b19f17963978eb57351cb248b70b0d8464513e43e8ebaa22f12889c9140e0cf45886ca82ccd07c356c426309a36f3d86f101708f7ef3c0a61d82bcc4983caf65ef982cb8ea58c49e3b63295eadd753fde333c609ed2b2769602b15fad3c8dbed15b088a09d1af10d5a14ad5ec52e007fc79fde4bef2cf3ca5669d92ba6db267a7aade21ab7e8114bd1408b03770e34cc1cea04988b579928b86f927f1802243a3fe4a634f2d1fe9947c33367cac2dd7e879d490e7fdb5f37d4df58bbf45cfcd11fb674ae31ceea07276f29178cc50aed8445c89227a839c173d6287c2b58d9d08cb7b4c6992305679bb4af83fd82a2eaf2a908ee010403d72fb7e44f31f6ad651f45a420db449f5dea8460392164d4e09020a24aa3ffc0841a745b905e8d723838849378c4b9842fc225950731fd090941007fc42a1bc84ac0527c5a1fea24ec8b786d004ea687335c7aaefe590a78df6dca954616e699c0b2277d2eab72aa65b4163bd5c420034f32fde5c1e3691ecc48e78e5d9134aa1230266d6c026174d8811918ea1deb82c7b128ebb8e85339238ecbb05d45963ac2cce94f964746c1f2361cf9dab184d5576fce728a34b74406540b9fd272e49536f0f7e35d119830afd00b618a2f2a8b1fb6b5c78d616c0bee5b6cb3c10c81b68c83aad9f6293cc2a57f479c24d5ce41e6d99ff08a558ebe344877238cb106353ff5cf5f88f8f0afee216edfe296170fdc7614bb1abcc28c9fd9e24334ab3ec159a203d1651bd695f76749e2b2a9e8039e21b6e2d87680b02dc6ea545c17400fd6f08a68dd3e1edbd283197d9aa12d264499cf4e9447f5018529a41a7d0b49dc1aeed5830ba5c4a9a701351aebac2436657ebea5e0c43bf58dd43a1072455df10fb43162b1d3084891c521fb02862536aa0b6901370ffdee1cf0c870b29837dd99bc9ae555b960a42c8817e280f8a3c7a0509cb3cffca51761f152fbc95c97a1218551620a2f346c0c8ed7d213220da75c935ec3e2e767ba8611ee685878ebfcdffdb37731c5ec3e991c7f9d5f84e2222926433e53c3d6ccd7148fd389999651c1764c58d66a82fd48928626ac1c28b22a58a22ef15e08495cefd6f84aebf4b18eecb81bcf92c05954ed4208d8e4ab950995d82daf41876d864db25a8959386ae1a21ba7e9c55bd27f6126c874bbba0e95516c261b70cc0a9d990c5265dce956972d396531a39934669fbf25ab2f99c3948330b100f9e87daa33b4dfa373982211083c8f98df4e59ff9513af110fc8098c7d76ed7b9f8e09da7be93b64258b7e3f4b3e757e2117853b17c10f06b14d73fa0acbfd8f5a0d31dd8b523b1410f1c3b16f9273f80ef071dc0fe9024bb0124a606b656d9e78fc87d22a20a3e5236fd951f591cb2b45c9935557b94ff7ad5e004a8c3dc88906ad5b6b8a9db48515a330e114cd8b8ccf5123d81956f0b2e6d65f93c20d24fbcad5a07dafeae9fab102ce62a8d91ab60132acfb52a00bca64b4d1637cb6d82ad962eaa5fe2b52055f04aa95dbf381f219886d4f484db23f35876d07fb4d39f8d54dbc0ce18986f6a3e87baac3b4a6aa4f55b81407f613a9876e791d0aae5d1b5ffda3b011d48d25e26744ef7d1ee2cba70f77b1d1241e407371de76c18a844661a66119658b46fdc65c1af15f5fcc93a80d1da5a210601353e9b77d67871082b094a971dfdbebf6a533cca4c184bf4f2a8613dfb56ed8bf2523c43af3f0e327615e0f085dd01134d2203967699919511621203302979f39458e8842459a95f85fe784a9fdc124d9573ebe38132d3d1784c90d9f4624cf7b95136661fb96befbbae33f8957e8cdd3798cb6e426101d50f5a41d95a7716d1e8238a00a7d85aad9de8a861b109973a09939e27025c13e5b68a8914a52691e56c404a3d895921aa18a1c7ca69826bb03d84547735513c05c2a33eaa0ada3fa117042a103d14cb5324fa2cb724ba442057305c81e823df9940dcd764bdd056b90a569c487074c7415ca9c2b946fb06b70302fc1c0452c8f2d3257e06dd0c1ca0e19413c3e828d341d02c9e641fc61cd0f096fb5431847ed286e5b42188349b53c3f1f191def77a0fa2fafec2dbdebed89303558466d92ec0a9c810f07186b507e0c7659c1d3ddbe95363c4db0237db98357483bd955f26b3b212083cfca87d59692f8663ecabba17e392ad0175af8fcf17e3113b5f1e06d0698fe0030b6eb360d58bcfe669a9d91f966825d3b9415801cfb5034a4dcb0e67409f08e0e039d22cbfe400a1bf912c8a84f2ca03590d7f45ff9371e1a0b564839936891a5bc3d7c8ae810e5123eb556e2c9e4f2745b801363901982cb412952ff2abd0b8e0efa52e7251a2d0a438efe0ce798cc37d267d63f1ca541e456a3cec4bea4524e234e36155615c2393cd80ed8500f29750c5e5ca1c716eff16e2db4f300512c013ec3b67d494133c02edf0f16467313d9671a7467c7380ce87ceb0c0cf0a27c8b2108fb0322a08328b6f90e2f33b5afb50fbce78f76f1a130065eb70b598988a3cf0bd25594ed8938411c9741eda477ef5b4df0d2f9c6338d58c070775a65f6ea4f6d686e3a0df4d83915e437e9f9f1cd3710e8d00f81d55880f6d2d0ed703dff28b601dc48e5b47c94a3085794666cb41dd1f4ef036516d188af4df0614c91edd2014e290a0624b1849660520631b2c0d42b38c33a9497bc473b56bcac1efc98d2cc5bd198513e9bf75b6df4fec5955376801b7f1b6da1eceb2492ab0f593ada5eafa58c753d807dde5ab6b23aa0892eb0f46e5a6a04ace2b9a37088a123dfc0f287a2fd26f48574c64dc020d24aa72cdc35d3bb84ed270527b6e3355d5408df9b99d195a30e985000e786814fab750005cc3e6437ea45b8f4602191db702374a201d02b3b13036a0a6e274c0b1ef0ac8224ec644649cd36ace598cd72c3710909105cbc0622c5be05be57c023376ebac087dd4f7647ec70b7b9e0580590baf160366263c35a7ea638bf6479f9729da9c2f485a00aa7add3d3d18372469a27116f1c0cd3d17c8b5a3d9387dafc47b30f4d88db68a9e238b6981182cc5f87c7bebfae586d93e529476ad76fe0a297ab080659bc2c04acbdbf1c5a7594f0703645e472082c8f95380701c8211c08006c0989ec32f5e00cf022b7fb55c5b7bf399161760986843a161dc70bf51d50f65bee384c652bdf5a16c9a168c16746aeb5fc952913f827bbd5d441d044e466219a82be6508426472753128d961b0f8fccbce9421d1bea7cfa5f9c0dd496c06905fc7027e040354a7143df8340a658c151a7704ef97559aff683c3d4a30c5ec395722c119a7a66b594ee1f696aa97436b1c4e16e614e1e197a0aad08564b740b2d36887a82d0fc353dcccd0504fad718c8e4bc8581d66d48cb5bcd2cd09a0544b1028a8cc9ec4e59f5091897301651b10d95d6cc164f9f45d683507217baae842ece7d82e1a1a00d1b16187340937e81ae4a008b992ee9a7b1b84a2b9a6bf7431e367c0464094ee91b2cec116ba91bbd6cf00030e9055f5e70a70b4ef882dfcefae3de15d1ee63ff2371822643284b1944832080196437f03aa35b466b14bc6b51a80784d3c2c4cfc0b92a03539e12ba8566278d0bc20ee786328fa90544c7056e19114087114056ce1e7b0aa87c6056cf3736944ad9f545d5932e199443d42bc3aee1480ab438f00a936a4c3e90a1fdd42e0e182162c44b69e423c0facc86906c81234183503ca541ab3d7b7a6238ae29f1ac0116e80967ee51ba79b89c516c5638ec307f3cf110e004ef4d2f6913e8045e78e9bb23154a80cedf74f8382f1fab8496c227af1d3f4b788eb056e4385cc9a9c326df106420d5daefc1d28468439fc1cb5329f38a49691726f0b4e45f582116444ca580a154b3f921fe91fa06f062b5b947a3b8656e9715f8e6583207fa98e3b2f52684b36e78fc55610619b7b5ca008ebc2dc3169141c26b50d369117077c667d46e421c21554515e2a3ce7ce34435d847dcad15c01682eb4010d2ac13a43e9436f8ce18a8a53910e705decd952caffa74a6fa91c367f45a7c7512df4494fcaa87c9e2a66dd496962b19447d4b32ead53393a2a499cba3e1dcc3ec8d31cf4758e82df5107447ab7670fa284b62335150a9146608344daaeb9ac8c41c0817e823059c87cd43356cdf515da544db467506a39f951ce9dd44842183c4c143e99c1df01cbc67f1731e207b661fbb0f46facc8559b68836ff4125f338174b2846fcd99fd55b09248d57a968ddb8a6f6058fd4da0f0547075521ef0798649d78c7ac400ec341f48fbd8db9b13ff6d73dc712f23f0754b148d91bb18122776e7da549e0b82c92fee4c3e67bdae0310029d9d539a3f2204d35519c13171cd5359eca0ce8e00b15a3e650816914b1003bd0d07d228bbe3c26eb2694000259872734306b707ef4128cb6355bf339b43e630ca3f7bb5da5b6b9e296ddc59961744b521b90f4bc3aea6c91d004182955fe8de4928e81d51572649f4754866592837429bc7173034f24329861723c15704e0a6ad47f69762fdcc1d214889b29e540dd0b1d457448e56c16d2781feb88c78e60528a803b7fb34dc13cc158cd51afcead52f254fa4dd32965d7dc25fef135234a908e91d03fa17ed28e6c56ed2da44d3ef247ac7cf4a38369e18a39c4f23c5fcaadc780d6ba81d8739c13556a910288bf991f6abfe51c0616a7880fc4701f00c40efe5193e5412e10dd474a0635d7f0f3b4a7b207b77e1258d1592af8a28c25588325ff88ad082091a7dc1555afe2035046c956781aa00157fcfe5bfbe3c5f01e88f7ee923877b23ae2215d8c51f1960a13553f2508705d9680f73a52c975b35284ddb1732efc4e9e211737fce91b9a5e010cba0685390292d5979f7f0618e62da8a0b280b00cbb611f1a167c2f18afe28aa8de8c48872fd6e5ce4ef426587bdf54445742075627728864142c796904b27940dd11f8380732ee52a1c9a91bc4c38ab6b94c748d6d661571f657b25e7c854b73a43f2407f376ab492e9966a066ed30f3c54e0fddcd3ee0b5f17f07c972f9111dcdbb063e6b14c2b474473622042bd9b1499d75b6fe4d65ab4a89c2c404dc824731e44afa32b22e8ec3aee9fc2339140e4b5657979920aaa98b0c4b04b37d0d80dc415d282fc4339471e24c5414038d840db3d23f70a5f60047af83689ed369b00cb2c5ce05e28f6adaf1c353af53ef338e3e2b5a68acef55803106df961aa649dd7b3b41d8a4dd058da12f6a38c43df69117ac06ee54bdf23afba8fe2e357f25b16f8c4d5791fd895db7b1ff98d9092aa1575d68b5be753c24a10174befecde8189b786c776467373a9712a73149b4f4eecb9a35e7cad75c5ddc7a495c930406780d83cada9015c659c58659bf0590440d614fe15aa91008ad9111bce8757c050060e1b289ff6a4f95774987cb2f82266da31d1bead31d1fc3e800346aaf6b35adbac33d07c535dc9cce6c061e5d63a9ed8ff6a08bce73c79ef4a99a41c87cce1fe2ef48ee3dd5b35d583e7c559c625af5bea820ceea5bc27dd98bb33a4e351f727521f23a23f2e2112a5406743c5ddd147f397aa06054a932baf618eb9e772aa22d461f4a4b6c6ccfe0d37bb19e8ebbaef6228029e79ca45c7d5ba43dd95ef69c1e443d09e9117aa3b7a3af9e8c108e5464be19cf04a7a582149a035a55b5b078a1ba9fbacde9e495491432bf22d8cbe4f444a86f3a3d51b954ae9223c853ca55f403d241b98a6e204444a27d042774b2ff8c65018df64ba2d1c4988b87cb09ce13e8de3e85dc97a807c6aa955e8a69b124f860a5cbb9611e49676ab5a4d2cbd04dc9df5cbb8e8ee9a9287802d78e374d644ac49330f7891248c342708e7f557b30cead8147844349c83d18d2b417d313e23f83aee135787120349003987a19d6309bd6400afb4c11710d305c3c00341cf9eaac371018a911412a39cc113b221b3f8735fb3e72526748a2eb41b10def097c3ca6f86b4d20d2b4518983020284dfa781da6eac4405a664a638455dc2186127be19e726192b7d111180f10b8a34507b81789b934a302c3394dbd1638c362c4540a238cd86289583ad48febda3ab87c2cd4c004110cd4bc5baeb6d418dbdfa4958507a1f90dbf0aac7dd30c415fa6ac52823abe3a6c5fdbc2c91dba2f9a8b18799cfb12e11262c86b2bace48ded5c6ba43348ebca23aa0ebf07c56c6a8652a366bcee4831ab154b8bde9a0a7575c193dfa8748c8f07b22c73479c57eae956b148f5b8d73a23f6dd5c86e713e3eb5e4771b50fb3083c5053a939d5fe2e19f095bdbe17b476e91ac0145870b2b56d1ae256fc9115c8bda8a900822438452ab5a17f8d508a4804655651fcb653dd8f76ad0284541ef95c7cb4809b976870834bce643683c0a60936ed975a53a53389b1dfb51ff1c22909ffccd7b4684416d550c5311f1b2c32fce0daf36dab0c058b4e4b08418df82704bd3862a5fb1af5b102883e8310b5e4d34749bdf939fd5db1e29a2d3d1d5a2e370e6654da3d2f64f272c96429299c0879415b2d4093de1849cfdd4511db0401d7e26856fec38125dabf21327393fd00570611b454324a6e8316a29297b889079cb313122e4acc2578a94d33f906c93afc367a3eac94ea8bf6a87f61ea4a7d345fc3ddde6cd9fd619b60c3ca303919c2a261474c6e1b5b20833a94c2b97bec2a684e6c7cd4420eb773ab5e666368981086d3f62c82bdc8b0092c0001860d7d7adca50f2d985e95e8ddfcc1b657c810160dd8df55f7171b26778fe5b77e712898e065834d6901708246cbedfa9ea0c89cc201b42ffc14e0f18604039da3a557f6384fd7532299902d399625a691e862d51da3d5c1be6487dfc5811fd83da53b80047e0dedc5d9f5dcb8f34205b56f01d4262ad49cc2eb5e318cdad8b36cb2e9bfe196f677c1df75cd224d2453086e47b09ebe736430bc8387d11552865fbc1bf16c2f02d7d3b175890b64bbf09421f3f842ea0dd0f1138671b60d6254dfb35e16d763fb4a44f6fd13437b4dec0b32ec0f340b847f10585091c87a63ef2a5f3bf083cc6fdf97bbe60773838c136060c1e2ba81507775c2d95436433c630aeee3b8936c3219ff2163db6ad9499969357ef54300c1bbce780a40790cf890cdc6508ee046cee004f810c7db82487f59b3d3fa99b4ea7a036bea1f453fa80f9fff1a5b59910e8fb72d0182b6fe4b69e36ab4c43f681a3af5a3017a881aa70550d01532c9f1febbe87febd0969891772667cec26ff8ae2bb7b68fa28c5a23033e434ee808b8410a1ed8f9b9f81e3b4c712395e69f33afc2691e5d13511513715dbfbf85aaf52182fc57ee6f37a05b08baf4c17ca56de90d566468275d048d8e5bd7d417b70316598f09be841bdca4876e17ec00485191def3230cf13b76896af4b863105559fd262db46034f3db35746906319324ba91f4930de76c570559fe73d28f6c371358466bb248bd8da057140acb8e1811e8b2f8b7f82c805f3171cca692fedb330a4ca7a9167b1613f08028d09f04d1086492a1a99a0aaa2b2ec13112a645cb9096b823e208b81dc3ecf2251e4ed15800a66c7477951c4e3043607a3e90aca6f57f225cdd93cf626867a47a812ef4873133cf340d39b2534f93459bca290df3a4687b2677acc07667b16691ef25ede4d7aabd137dab36fe99d02b675aea3440691d68e4251ee1b152c5bc4c63aac182a6b5e1b59faf834c009b50df64ddf58563c8c5e18642cd1cf154d5e6b2c732b15ca4504b65dfb34dfd8a836aa6c3c04cc1a7141bbd62068de00287b9b6569e5a42a03fcb7a0a7823dad3f712fbe6e721363f3d97f384605fef15158585bafe8412b085f9e0e26c282a696e25ad211825c9395c46c4434176ea264698a03fb1adc32836834a7eba82acda8a28d25c61536d85056b3e0c8626ed2eb3f5f2bf5ae1f7bec4076c7ce1bb326f0b23f3d129976a8adff28ef2e94b477373dd25946a8fc78014fb045e45e71830f372502121cd27c487c7e26c4124d45329a832a059847d58661e79e273a4c504ebbc8a51aa481da5d26eb79be0fdba71457a049a63671faced14adf3edd05bfadbde67792cb6cd609e5d2f6e9e6294c6dcbabb11f21852abce48e665baa8618fd3a3b1a051dbe04373ae72a27012285aa6efaef9f98c8231b20de203ecaa0c114a34a2703e0bff59f2d9d35b55a1cc2f3cd077acf269b17917431c26f4cc2edf8700e5ab8950f9d812f161a1cd7dd1bd5b81cff03ffd46bc298b68993f5e8e3e9142fdffd081e844f65847b0b0ee4f714b52e9b6578b13629e243c53f047e4fa583ad13637e1bb76d0e6cbfa72e3648d30ee2fe932c9ded005fd401d26c2a0e7c09b5654830356e73ec674c376d70b3c5c2a7c895d7e3aa2f3a5f404c02c5a1688a94d9948956c1b32fd23d9e374c8b3f5a1761341785ad90aae0528d666724e70f000670da5389c647d2208957fd4c4e712e9f633f921d6ac04bce603ef27b2a3ae3908a7d2aaaee696cd0a3700f738262170f9a84aad426cea2f8d27c6f53776393bdfc4115d2013601d0d34614a51c67f9c49f8ad48872b6b029da3f4d83ed97094684bee123a13ae20b92c589302692378c137308986734a7ae1ca23275aa48ab8297fe99cc6ef4e8482dc05886df39efc7f5cdd24d1bc2f6a96b1985e6ec1c6275a06baa237da6d9ad2ab63009fd8e792c6c480ff3b8bd4e4198a8107a53a33816c37e2a4a3f2bdef42ff7342890a3f88a85f266a87ce429e4f50c3327559db4a6256d59fc598572980a46545fbf0abafe820abf1ff2a36e4468c33ef94386bfcca5eba1b1a0093fa5e0e919f6a0f184c4763a8d2da8679b79e8be05a7701f3a24cb1b5a69a0134eb03cd1b3762e8fffce8681ea5d30e308862245219def0b077c23d53a8acaee56a5f69bdb3bd74fb82aa7702731e591198b6d2232c13ff929e48d5d88343d9c2f1142c5e526de647a9119d3ce63eaf9b107cd7a6ee2b8b3d913620efe2aa409569c683f5d6ee85a43573af4d5d8949a5e89351112a88678df99118f25dd9ed4c417d952bc0a7d0316efd2fdc05e734e1e1e1de02de606203d5e0228068e0ee036ce1d900e571a3006430fe806ee268a93bfd17c6837b41fed0ded477fa1fdd06ff43fb41bfd436f43f3d16ae8bea7de758663a35fc4e17ccb55b440d76d04e9424e7114ecf621b753ba172136ee5cb0df94c99928442e6844fbc8225416a24e6bdd8001b7db59ef544cfed2c2c75f03d6ef3a3c17f47d84bed0d27f4ec0db563e3a770c6bd29aa4c61d9b7b1bb08fe611196ad49d8e2fe2e9398057eefa6db2fc5d0b3c21a8b8800032c561536b43b7b42b3fa809260e66d22287878352ce0f37891a4f395b5c786b9ddaea5a81c5d9dc66abd2744578aa79b7d5d3b3951214a12d33d7d60181ebb0526c5bd134b6db2e1257abc8d7ef4aad6a116dee078ad6482dc48dfd7880442d9c0443ca00034e2b620edf89303f6bff50b2a655b8f9328034a3b4961bfe57c992561a9ab301438fd604893d7e9b7cdafe53baa2b5e450185885d82b8c8b2bb4b073f99e84b959ff49a9052d149a0d0891f428f7f8ace2c6fe3e54c02e52b3e924798f0700b54cb9cd3a3c733f4fdbde3f2604532feeb4c19cb8602466e1f063a29e9d7565a5960981b6c95d7b8ca8d828a25a03aaf1dac558834239446db87f6049b86f6375b7941b5ebcbe860da63a338a629f07b9aa8a02c407429804b5dd52eb19dcc9392e5b426a95b4e762aca6f1ba260987228485b4af606a455f2b17a8c74f2cbefda54651c0df1e6e4669864d895ac87113cda3eb2c2ccedf1448c2c5162357f89b3d386d8898ca842b672db23920c83b74dc8b6265b7e690e0585cd33e0b2db534bff9366d3f0ba0b0c52b01ec6d93fc458ced37d3f7a754ff0929edd71a4a17dc8464850e027d63d1614fa474517fbc809885b7598b6cbfafac2e747d708e172ce98bb4c95fd317094def3b0cbd1f8ce330b05f60685f23bd5a9e3c064ab624cb8cfb1f220b8c4b0bc3d97ca92434c49570dd6a74dc136961d4f989011c8f1a31a11a668ed96884b1217af3abed13d0d9712e8e31061d907a201dc97ee5d7927084bef1d4b532bcb2b9dce691508e9469daef28e6b12bacdbf296243c311876e1621b5185b0c378822b4c12f6e3fa21257e892dd00122fc92509b87c1724e69e46aba997276ca540bf45401b875bbd0e7e1af87127edca9cc00e443e6f79dce13039e842be49e06b36e61c4dca41e4247e62df3fb0d0d4cb6840b86296fcd104389224881862ec123093186e3d80de0bcc6a92fd670be10b5ef9d41978576406b7a7c34ebd052a8f0158b69258a7afadc41f520d629d8e73e9ee19af1e0a5abe499bcef2f9a03506e8ebafca8e626b30aab9b5e31ccc486e88aec9bed75f8f64dd2d9d1153814617588677eedb1721e2ef5d8a1ef5fba49a11bcf58dbcaeb078db2e723ba8bcb06c9a5f7b75c2b6da09e5d202117f4431a23b0f1c41730ec49a6b745178cd7347c47bab7179dbb3847468da9e375cb789e3de86cb0e9e19eaf4443fb38a433bf21b889346e127585acf594c0310eaf90614fd2be3d7ed75a9bbc5420613146057141f7d72de41ca0d456f44acf55e73f15d387666a58d763434e4f61edab621d3ba79b6d8334ea13417dbff1ee86116b2d90b66cce9f90658272cbe596348b494d8ea95310879c97883654cb44b264ea2ad50d8e5a873c9589a4a7c43d0248f130165e1ae71a9893d307c7dcea74cbc6b60459c4a607d232e3b80dee182338ecdae8698dd4029cac73a7d9ff327ef4d88faaf730a88d647083dea37a8cdcc4ec54f73f864cde87574192ea8dfbc924c1f27fc87ab843d9d08274f36770958fd4bb3c366fd326fd5892af52a676e46d3b64401b3acac5f8435be72d15619eedb9ec1f377b522ce93d1762e2a0c6a032af1bc834f73817763699999fb7957d67d53066c1e54dc3d0711e57f8792497fbe70078f0d8cbd7703c4f9fcc0f1bec06ac203a4e37da4491c3c7561fcba6f757509e12657a9f0fe353d0172db7f221cc192afe11aa2baea6fff3101ee73771e7e87c8c1054cf27bddb1a68f4e4f214287bc60506bb6f25796171d7c40b6afc5f8167910ffc362faab91c68bd729227ce7ec4be3d536c4aa7ebe0bb14c531b2893a80ca59de840770abe97562da09fd0b60cc9d419b2dd9cb137afcec605da9c7dc0e32cc6ab595ca18c543f8cdb11c5647f83c5264a738232ab26d70251f856d2747585e156aa2986ffba9a30177c2460eeac447bd493f4251a042752d76e160944dd7886498e773787dc760dd53e6bcce37cf5fd11c14bddd4935ff4d4e7931fbd0e07b2a30cfe452452af6f28faf2f1373ef729c149978445414ce3270f9bb27daa7804debadf19af0c822cfc6f94bda5906894de42ea9bf81259769a17a2812b688b913197709b1338dcb3c104a2ced452b4904540c4db5282582f49f6f1f943981c220c38c4367e1c4ef4280272abb89ced7502de2f2f441979846db045ad9255143d2606b10fb04bd2649abbe2000559e961ae726e9bef62b1b85d8463768d67fdebea7f0b23c7530480dc2bd7749098244e75a988f042e258c7e3ee0e64834afcf625610fb28bdb9a6ff69899fe9a6906ea4d8853723e80ac58ebc51883e32f6c40d0af56edb9bb35ee0f6b2d48be59377f3e6e7fe92ee2bbd14fb4777e9f6777f41f72bb98c95dfcdbfbd12ea1559af400e7d5a3151ce41f5c709d5f71531a3a79e2b416d9e325708fa22096725df84c244c527f9be2a466cdd2e43980afcaf944d46c02e819d21ac3ff0c89c08047f46658cce3c2ec578411ba32a74352029fa3bbdb894c4cc6ddb852e16f1d2803eaf239d781fa13a979bdaf38ea165d3fcc419489252cf4e0712db4ca744071f912b1ea7ae1654f112364f1721ca007fd377d605a3b6b58cf0ceb1dccc245a19452c7efe0ae5d85837d9fb0e18d41458cb4ca004e110e7c82a83546a743b01a9e1daf1f1a8a9131dc7b9f88a97ff00797807cdc238120f9376460a53cabc56d3b284f66d6459c09662ed0361de5d5a4c66efcbbc44a19f4f86d512549df93e61ca36606bab9e9fd6f2eef15366e6b4e26a7fea145264cf7e0166ef3832c151f32bfae30c49c11f5dff0a92e818842cec4b64b90b3b892554962c9beedeb39d55fa5a7953b482ad9f2406ccc7a26f81cc873f5eaa5964d66f86eddc3514ada30f1bbfc84618b996ce048b3cf049e048d5bbd755978531fc2f097fa2309f2865526e52248266f0f1d2c53140c0684445af8fa9ab39516d0f9efe43329840e9e9b92ac470b2b0fa20f1d967df3ef3e9cb77be7df2d997cfe6a3c6fdd925b21cc6d8f8f6d557dfbef2e9c3573e7df3917d98f521079f99171920a9180ed195918e3b6ce60399442b899bd10a058d9006d06f091b149ee184599bbd8f866ccce77d630123de2855b6bcf6420609bc3e4ea0815a94532fcdc0f25e1d74ce7cc63e533a0c2910347c63a728c4c36e6c60fb6bebe5d14334202c3aa49e06a80ffb95089c060ce06ec006fb37fccc52fbad88669c196244023c1d2aba4d5ae20b0d45e80208c1776eec78e8b6250ab4c282263b1462c991dbc5aab1ebcc32c82ab1df232b4d58bc4c16797580b074c33cf44afffde9b698b8faaa5b847ed67f16d59015b7807ee17f92e8b50a9017137d4e323f2630c321a5794ec63feadaf828d19c21c6ce86f6fbca72dfc651ce6ef99f39397f4933765c6f4eda3f5e942593f23527891fcbc8de2c9af1e1d0ac517fa849a6251ac99cac3f1e1fc3d76866c30ab346fda100991634ee72b2fc786e0c5fd0100843cb1af587ca3119d1d0cac9fae3ca1db1973562cc6acaacf9f7604ca23cf9649afc44276699d1382886c986fefb42713bc111c96ef59f7d38cf8b2287896630a3e287069cb9f160d88a5c88bf3f88673ff64176f6fff8c27d85babe998fa952673a33590ca3451debe76a33aee3c2daae98cc44a121881b6b861b9862e61cfb9bc56edad38c4145ab486d86f52ae98ac65a0de0864c522970792e73d9fbb708ea6c64e790014417839bc5572ee70c3b69b083018d330e6b8987eef3b4ddf15c39f113043aecde811d651aeb29698e4ffb504c0fe3d13d8c7da6b044d5818d73bdc45fe3a94547f4faae7b7ee13641dd7c85720dbd2fa98fd11a015b5b8e3a2dafc8d9000f05f1423fc4cb7f2915050178bc23b788d72a446dbd502c1fdbc6b2410b55f96fcdc36c88ddd3e9b716b3d54ee221e37cba3972cc2fdc4f923f4dc3262ee6bfef93bbcc71780f1f80b72645b1ce733eeedc677ec1fd3809184d52c5d148572c9eb16434cdb2778ffb82b76ace90b298c8f3be368faf590eee114038aae12e9619ced791bbcd2fdc8fdf05a3c9c2b8ce9f3e37c737c7e11e0e1f7e4d2e636b7c675ca6712eb3dd8f268c5287340e6c6bf13ddbe71c737b1096b9b5b08de12d2262cf5ee727db4fde4aa486711c8d39c762dfb3dcb2a4268522dd01a2b88e6bec7e83f94174c72f922d29f2f6fae9c6cee71934b9640347c04672b3272d741c8b3cd08b8ad913e5b5637656ef16428444d39238778b8f3f40aca36a8f6f1ad999bdb5305c7e12610be62704cdcfbd5db2ac992ef6401aac1ffeaef0818fde1fbf2f34201edbd3bd45ab10b20f5fe5184abf2f43e9d085d2c69b24fc9a9e593d6120fe0178eced4984508c6830257cf47c27c8637470902cc77e468e09c6fb816ff53afcfe300178ec4ff7d2c8f8c3974506bbb847837285e8a87a5c0ac981c320c3361e2fd9e9a0b56be214a2540355718fb4cff6a95ebc4e8ca8387e32090193b4a31a56b7f107b040c6ab9c05c03443afff1a2f5bdc59b731c4de379653cb79e3fe4e3cfded7866c5c45fccb7e45659c5f3f4121883a7c8b03759a45e396087bd58cce182c693006ea9a8481a7bf498ed12f1f58c1ad95b3fb16363aa662bd799ade697d669edaedee348a1c8fd60dd83392be97789fb9e3fc2200cbbdbb7f22487fe98a2b30a1e4cddba769153a515dd45f190c3db9d4ab30be6e436ad5c78e287f616e3df225081aeedd1bd38fcd9bd78d501caa2550f1fce6b6ddc50ca612d7302ad1714f003b189c20a4cddc3d702b910a8d361f56a9891a2dcf8c1086aa41795857be95a90c1b83f27216a7826fd0078107f52893e9a1cb334f0c8ed2228c4a86aac9698d1bfe203353daaf487fe6aa02d4498973ecf8acbc4c6351f8ce5716362c0a2f0f4937668ffa672a5af257f80d99194e7c1f578bfb398c995a906cceebbc1c707b838d994995b66503616193d0d560f6d8d45169e9398b8dde22d50c98ce897243ae4f4b99c6586242f76cb484a29b54f4cc797d703035fe1801bcc40a676f1fb21996edc1dfd2946f122ed9dacf6b88a7778e2551237fd378fbbe848a4dc3b414cd09d7df2f2ef83067d32617f66683b4d1c002ffae112a1eb4d5ada90cea364bed8a2f4a0d0312476c07b0e7fa5fb4b37acd6fee77398c8ccb10273f41d6b53b489f785c046a3ef33106bcb0ebdc8419feb4aec7d9fb96102a614284667011854bc971f98ffc1bd42809afec8f7d738ca562c9be6f7c702b9850d178c3d972cc080e6ee02d4f5dff71ba3505d3720f43c521953d4742a38ee3fdea7180572d441d27127074c5cfa479731b0a75b56e31518a68172991ff30e5da09b92ff4e0e5010227f241bc1f24637b15abb3fee6135125ee133dfd1ac2e58ef667d296482bd76608807b21b0c8c9e8b2ca28c92be0f9fe5f129385ed21fee2986da8b1e2260da6ae5269c13208423ec3507472842464766c844c521bd95e9f7c1f5e77db5f395a0f1b289bde39a785e5e967deef61f35bddcabc0df4a28a10fd43a153590bf88e12fef76a882aba99b76091478d6b2c2028e1fa00ffa389f9a85577d9da592d41c956812d729ef482496a6bd24f5bd1b8826e2ee109dd1ffd367beb2e7a4cfdbe9647b57defb5dceea91d2ed9b7c7fd0786c24486c29450794e9e75d5f4490d3d6d52052e81034d509e2c1bd0cc95ad88c879918af0bc632966449a16c33b2113fb426ba09bb5f393cd406052041bb68476943cec2b0498aad8ef4e36518b59d59b2e63d716dc6cfb0a6c52479d8dcba39fad75be86196c3f987fc2082ca3e96a4ad63f65a0950fe6cc03dc6d0bd5fb12946ccb9e3d1a432df3999acc9cbac6b04ff421ed920af19db8e1aa940701d8740a69303af968f16a23cffe6680cf48b5e3ce2038fc1a25a8e748b4b542a87ce41ba932a247b2ad87aa343a05820fec59f00fdd1dbdd525108045aae03630f5120442d2fc8621bbe20162ba8da4a0836d644bab88b2bc0f213e57e21d1afb45752fe601a89ed744e04060c9945a3be2c53d66679f46f3cba8a9963ee234da598f3ac8e0294639545efa629330f9dba68a6fae01ac373fee03c83975e6530c2a7baa42375a34716583da9ddf556b89050eb3284e6d033136bedc51d809027d059c6c057ae89598d608a36d7c5653e8b14fc078cc4c23caae4ff6378b392613024d50056d77c817a7d8c5a080f8d7002ba60634c4573028012b6f70af1459051d1f34d698f3650285863e38801776cb3890e8d34013792265fa1ccb14f7f42d1f2ef1825563d2348bb85c682aba6539f59c3fe50350eb8edd5eacca5d2ebf2cc8e09ddd6b4742b329fde4f1b2a1fdd0ace22d5c6f3de88c335cad0bb726b75af123870576eee0b354331229e2fcdc41ee9833545a3c959df5a20ae48c947b576b3bf95b6563e00c834103cdc535ed89060e38409976f34a28271329a9f3ecb9c836a8c542bd71b578064777fab8fb49d81ec33066ff5edcad1a76ddcbbe1311bc591b28cdce4c5a7b32c85f3f9a3ed8b080557faa28798eb60cb88a72b8c6a96a7f226e52479852d22288cbfcf5c6825bfc30ed3865dc82bbd990a20d57ab689039c243dae8cd834450560ac703593e41c8711f810ca9f3d2a92853878386b3bba7c32bdc72ef3bd01312dcb794b388fa0a8afcab83c49cd9079fa3ca15bd9661bb3977841cf97b0d2680591a1f6faa6c0776c36a23a2a36a40385c2535751c9d2801d469432fbe565956ec044519152d6b29e7e42e319c335cf0a5c04d120ebcc99f3f465e4e5b5fe885195759c3a626307482b7da5c9fb40c3593f60e20da1c750dc1265c63c4507b72195e8eb45d498067644eb1f015520ddbb9fa46ce8e8cfa08eac0657aba4ecf244d535f2ac748c838652e95b5b91c2facbb172e22a365dbc4e2889b2a8b1cb550eb7c9253d6c2b6aa36f750a3ab8ba2861f1cd28b58edb7c0b0f5d8ba3e9de887537c7f09b6be83ea03cc3775a7634957076b43c1aea6cc62bc7961ba2c1c032559976f401f365492a3dfcec1011cfbc73aaa77a935dc334d89386a22ff3d15967c6325c68711469cc061c798a4064a78d7cd7cea28231d499ee6934a86615826d07a391d3d51f1a508e7823e411bbd9d420d87d09e79bb15f830980600152cadc78d509eae715454e32c045b1984171b51c5db95acd27d44613cc4412fa57ff5c140414296b29e449a20134885c382e9289cccbd3ee92e247dcc45747d80c733cefcf5d4a7615e86ce7566bcde6b6e794b35fe00f350c1c32a3174474e9072239374b077864a8cf879f436b5a282748af15e83b2263535a9d20adb349c878507f299510673ad3dc43e0c201cc66e4203171d0383b32ada5f98e7c88759aa0bd8d5bf503d5265d421bfbff41615f435134da99c4b2a254af0cb1df276e98f7c494dbcfcacaf888508ecf18cd5e717da850b2695ed679b6ee56fbf2ac55d5039c4c3297797a31a32373d2562e77c0d7e616179ddc2bf378d84b152ff5bb3310c877ec2310b4b2328364df4fed3788c443071acd527601159926d79329f9e37166446537719b9f4ab7363bda3f1a57afb09e6204586aa0dc8f581dc0457bba53df2f11a13735d7b198603b95ec0cb9d578ca0350ac209e2b551fc06f8415fa87d65a77145ccdd63864bd8697f22a4c89e096ebc43e092b2af51dfadf8d08783d7b5cda812a6ac7f7cce0aa6af3993d7520e2275ab52b4c201a1146425c64b349da2ed54462f0234f2d8482be59fa9448e82d9294d444518f0397dadf3a34a3261deb93deb6645f758e709b6333cbdfbf318c45120fdce8802132fbcfa65dda8390f09e93ed4c49927c950a1e0cb16be16657c1cbed9e0ed74cc144126d5f81189556edd95d4a21476dd9da9f6ee944b0f548d5ce1d6cfb25e31821738ee8e08344e7d3b3eb7780d28e39685665d144666b586a915733789fb305b2895c870cc8633004a08fd319a663800e0d4e177608f35f989e246395b3cdacba121883f1d81102a82b0657ffea965f2c0aa80a9354d6a2f162b05d31217d6ecd6796e06d123eebca7a1858672f126c2931c16331edf12f6b49c12d17c1dea1d884ff2ade1d48991735f82f85898021b8f157c26c0f03820e5cc06362030404bccf752d189b1192b21eb8ed730377e01a18eae0a129812126febcd8c60de9ac4c2d03d6d8185e332583701aaa7182415d091d53201670e42ef011ad3872bb9c329a2bb296f0925ccf771b0e2273c5d11ce79e9752354b949a17e53bdde5f2b21e8a4709c0b7cc8f4dbe39e6a6a815a7bf8d04b7142c1866f10fa7deed2b9aeb24f5280060adde25a481016cc395ece64a0b7ccd342dbf1d83ee7425e4058146d0fdbbe7449abc745b7eb3e4b3084d3f9ed4573e574a5745a04fbfaa9268ad3d7ae34988b96ab9ce81e2d27a1262f4089391f99a320ba669068facc48d120da6498d25459c742e745afa6eb6ced413f47c84b4c045ca98e523f5295d4b933d40a463970f03f7e8cd3c60df57c55d17c2cec4c1d65de4e224d68478945a77f42e2ac3ee16877ca3cce6061a1ddc4cc8a033a43e2f0546990d9ff1c1106b618fdf8b717f5d2b5f1b0073b3643bfa2e63e4857e59ce9b096f976594b898eb3b677c14d6572942dcf7d56849870f95666af433a23798f29d2612b17d730ee86006ad0c70f41b7ec5443a1449c444233322a13dfbc6396012438f036ada636f9b3df36bb66a05bf9904f0baa2483e1677ba07ca6e405f618d45baed874a512fad775199596329140b82814fb31595622bee5841667362727217c2e243414fbe5e5166b524558131d973b52257551dbd9b496c7db00bdceee61063874289fb052bec43450f629d2657d707352a0c1b1c932682d7151035caf50c4bb0ce679b411fbe46393cf5b495351f176f1a71e2c3034e8981acaac8eff9e9d1882dcc7db16c490b584d1984c90c8ba30b3f959fcbc774366382993185caf5f39ffb0ecd00daf98564a6f3108ebbc8ee90d63dcc40d40783245d3053157f6dc63ade921c5a74ba03e40d034a47a2735c4016d6a8033927a77fd91b8f09160a88508166d7b40a61891e23a042050f0b2bfa7959312c91d5218f9137770b1582d6266df1869b3b7427d01d198b89e07df400497cf8ce815dbfd55b72d3bf9ebaef5b229becbd9bc8bda54c49ca030704073307b90b7b897c91714ea8ef57c80fc86312c6f32ab957a3366509fc0ae67c610ef85d983376083c2028019ac1df01663094ff619ae987c327a45e03f8387cb060e8a03b08b691b9b2acdb12fd0b06b6c4ff70671077cb887ca9b0860206eb9bb662072224b9be0c7c7099df841e6b53d726f06bb71cf3f8bc835d4b916b1b993018ac63d74f8e852cd5efdbba5a58265c2f727d97428f20c4fc46bed4af1f8eef5588dcfa85dfccf3c9cc093dd6a2f452f78e7980efdf81becfb3c8f513fa4d8b75ba82b819fc6e5523ad164d905cdfa712f2458794c5aa7c1203926b4afb9429d5d379d648182ec4d109839879b37866a72f4fd7e09ddd392f82b5906e4de72ad7110d675999a122921123258402fa5cd0f3791dd7b13f7bf66823678bbb8389fc73b8f31de658f0ca3b66791ad8bd0f87965beccc4cd374a9b67cf779d4bac53b80d8def3efdca9bb7b34700bc78454c58276ab1a999906de0144f7e140e3e973349e6a349e6ab50ec9b548ae2d4d69da64c79634ac67b67bb6d76aa6b8330d3c8bb4c882e70a9eae7964be4478d6c888816792693395e0196bf1a645d9c573094e93399b4e66ce7cd228dcd6f3164e9693eb6f3b95d34e74b4d8434e8bdd5edbcdda4deb6c5bc76e5a9d4026ab552dab4d2d09236db0b653d57ef7dbb69bb59bd6d9b68edd3447ad740c1174b145175b8073d6b0dfb483fe485df3a1fe8ce2f677f34610647f85a80a59a728803cd9f86af0dcf511ea614a24d71f6d4898ede57788b8c92e64594304106b7b889016eb8d18505e865ece78b9f292f492e5a569e44d8ac2cdc44c51144551140a7fda54e34f2edd6a23edea23fdea9a09a4456e76671eefad6d02615e0dfd3895ccd8ca8ff386c4328fe4f0557eb42af8f361ab6cf8b3e5ff2e9b97c7f871dea4fc38b190f1a21759215d047f6a7c7d0aa44f2e346dd284d0fbb589fb176eb409f42a6f1562b1b468834296a79485be88b2e4a028fed408559e3ecb93e8b3d0a6fbf46dbc404dded347409b509e3e0d6d0a3dfd1bda3463e5e9e7d026d2d3d7a14d349efe0eada34dff9482445f3f1c2888522a4a3dcbbb608af21209b3fc0a26fd0cbcf2213ce35170e83d8cf21de630f81fe6fedeef60cf6fdbab60ed43acf23570f81f5cc362ec82698f2ed56f954c06aa99a2462d5f3fa6434cc4e55530111efc34532959a761cfc1da77f0f635b0ca7b70e72ff6fc87ef73f87b1073df61d062d0a360ef43180563fb2b78c693f0cabb609f7909ff289aa91adf82ff3f58e547b8e569e0d163fc79164ce34998e56b6077c1eea44b15d443d708c31087a3883e084baca345fa2d988716e98ff00e2dd2a7c182736891feca0c7c438bf4439806148c8098185aa40fe21b2fd86041243dcb07abdc2ed1a79f7602f397d77c28885290d540208d826c8f56895ec6579894af3f919821984948d367b260129924c8f5e787822805590d04d228c86e22bc027aed412f03af801ee4b05cdf7a1290bfec7b8d84017d7d47224f14d526fb9504b9aa1c0bb722fb0e727dcf833c0f02bd8d816790b9f35daab608fa4843d14e9cc0aa52f00e20b2fdfa298047fd6a00695f0da0f74c219e07fdfc70b0d6d30977cc6c3daa5642c2d8af2f413ff66a07983ddfc1d73e0864ed8364ee19ee2f40613b9100cd3be62c7754d2a4f54a521ca60d1ff49488265966213211493eaf7d9efa58655296353e5ab9b35e0c2c33c808099c509d20d71741ae1286c70e30777e071099fb11f4f7bb6b412f6500812ae8fb6bbfb7f72365d7e2825efb18786610963905074173e7bd06f4db670308047ada898010b967f683e88cf569e8281ab693ed7b8100b94f33c8f57b562b01e469a60c2091803e9baa7e0b49f90c670a147e56e1c3d17d1e37bb328f3deb5945224f53ce9a49935aa282c5b422d7a7b5ce219f9756f1a01dcff6a047516ead5354a7833d1dfc75b0d7c15de63ab8d3c1b683b70ed662b58369eefcd0b14f67ee402fdcbc15a21d482459be9406c872dbb68d0052f6e7c3d1a17828289d94a9e6ecd1e2c75ed6bb215967eea40301018db4081aa254a4b8a3cfc6de620b0973ede9d65c92915cbf87b09a89aa6a1328c4fb5a6bcf66b32b12a17c3cc96296353e94e44eb694937a38265c8a42a92ecce605ab3fb616b9829e4a275daa3f9fd81e17c8a4e9d24cc47999e80ab1436e11d1ec48ae3162bc0ef9f2f90f9e34b024335b9de4fa9a4de692793395bc44f15fd4b3fc09678a8bfbf97a86db4913eeac3d3c5f9f162161fcebf7122408225513063fe2ae285a2cc8d559443e36520ad0fea37db6cf67eba06ca10f316c614caf7c7e5bf93c7dd077dd07e3d4e751330e2e19f4910f902715be3e0f3a24cce76b1d69e4943c4ad99747299b34f2a53e08cf940ae1fc802cd507400aab57e34c4591ab8441f911f49eefa80bae87843bf30cfe3ceea37ce738f409c729048443ffc1e34cf1a8799ca95038532d92320ade014406bd6b713fbffd3853342f9f993f5866d7a1e4064b48220c19fb0ed8be135ec0891cec6fe18a7480b58009689aa0646cb822c31c9db71d3c67bc94c2d6031788b08716ef09ee6823cf39e78c2ccd9ffebd62438b0f72a586cffe9f3dd4028ad80a9004a982083632a30c7568717e8739720e39da244dda118e200213b29c5a6f51e8a4ed3c8fd25e71fd7da43ddd93a195ee4210a84075dd89a2286b8c0092e7dbd041479fb656cd8f26b6a604799436ddaac6082379943795fa040000a6470ab1885198ba3c3d0c3f15e1bd8fceeb3aaff33e6cc7769ed779dce73dd779dd73f45ff07087398c377777af2f9d6216d8752280b427f556d2cd4f80cc5e8b93a3b9eedfa1c275f01310fe0290a7eefddf4fa06fef4ebd002e1e777fea2e04f7dcec3c58039eb78010329eef30053c6327a4de7b1e0ff6bc0f21643c2111cf6f9e9f5a2502fe07864574efc3f3baeebdce47f7e0fbf83cef03fc3cfeb9e772be6d0d4827a9b8397610803c7d4ffffdf479fa220b36e858001759a24fe9d319ba898536cdf7bed364f805ccac693f7a2f01cf44be0f53e07aef9ef75c0cbe27d47efe46e47ee7e6c85bf879f01316f1bde7f3f8f8a4e77d7cff791fe07d1f1ff0df4f3794526a6fa345f99a27e924c9e7ecee04482bbce89ace1ebc44a764326589be0e3350651e3453a924d3af39686e43bed09653877ca13c38e181f093fcc107fa109030b04c17da431b12c633fdaf92854e4a4775a6340e3421f1a039d4a29673e70b2d5ef9a23deda6276a52bbb93a786072c79bb54fa97cd0fe0708481876982e4818fb9a48d3aea66978c6c87698305c91e7e7c47a6a43c8f3474984ac6d73aac8e0d6a7dacfd5105ca716b1bd0f6dd3b4e7ecfbd8ecd679cbbded74fc393ba5f5523b95f343dbddfde5d7dedd7313827685816c0a456e8a14d9de9f7bedb9cdb76eabdb7b5b751d6d9b64cdabd770fbeec3c1c36df3cd6de46813d5c35cb5d84a24172829cef9a760142c25578439b3de95732665920b7310896438de2be773610ef6436a91fb1a762c6c9b16fda96c868e6fe8a4e7c89727d755bd366d38f4d5d548980f8984f180efe9f0087a42cafa64a62ce9d15611fcd9f32f66e6b83087cbb9a2173d27cb3cc74fd4e5e288705d6d82f92914ce09f3e9036db5388bb448599e4359394f664eba499eaf82824b59b4086d110925e953287c922ff11b9f4a92b4e8dfb93f19a9903cbf3d47be4c1fb476b5e9087db5c9f3817b6f93a44d281324cce7f90f8f9ef00b3f057023f7eee270e7cded09f6d791cf9547e7d173be903033cf7730e689cabc849301fa832291274ae6272a852ccd9f62cef2ac82e650970aaebba86c7eedd1a6d15d5946970859e599c97d4c73ae361dd15c89c75a9c5e459e9ee4499fe67b4e9bb67f92882527274fd90e73f224114ba83d25f3dbc6c75eb991398f4c2078be44d9c764ab1e92a44dd2c96faf719cf63bc0ac85d539ee67e6421ffcb9700299b3e944e2cdab6f3e7da25aa49c02b8d79cd35cf3ea79e118830ef2c5bfb9ef6601d316e70c2353c7f239dc5916e6ece76c3a993913861738cffb98e6f0f61fce816f6851aa90b7cdeb7efefce99953040a477b45cf85e3cb09c3fd8eec8108bbc812f757ee20732f03731fc30099fb140270df2b3fc5f8094e2e06f6f0b7c87d0ae62a97c32b49be70e128442bf432bb06426f012164429f2314869ec35a18c28ec70aa0b27f8c7358c3282f3f064819143cce16e4f99bd56490f1a7f8a5ac295007000c4a679e3479d3e44f940572e06ec8a384c99a18b27c1b5206f48056bc9ecffbb89f0b7a1e9cef09455c5c26927e5f484339e99cd46b71865a1c6ff6df6ebaf0a28b2ebce8a28b2ebc78c213b678e5fa5d7b64f7205f2a8e99e9cba6b23df2635a8654cef68c17c8f274a5489a402f7f07794279617c71a191e2317cb2769e84f9f8cbef3e3c2d9ef983bb255fea7fd833a5d4dd41f01d047d89df4c58cba64dfdfc38abc8dc8703f8143693b4c9e66947bb4e426b2161b8dea34f28f7c38dc256520f08e441c9913092a6dae4f9fe781feeec5802367b5e067236f51441c248e03a161206bf12c673c1effed37dc0e762703dded8b22fb8f0781110227b9e8855d1adb15b63b768cafc667098cb6cbcf879e91d9e4fc4aac0c11452cc3a514ab772b73cbbc7037e3878de6df0783c9e3d3c7b00b10eaab907d67df73fa18af6200db4390ce6de851fd80dc799845cbfdd434d821eb6fcd48397eabb5216cbeec334c7f0dc1db6a229d7b744acbbcab7895dd26119baf7a75307f20507d20528c0a76df250f0c441220359fe3c48f3d4010ea40b497a8908890cfa480d2e1de7bae384f9963373726eb754527063577498c3e44bfd199ee7d48574a9fe9022b91a7125a40bf53dd855f2c57b094e90cc4496ea7bca87f8a23d1f8e9abfb06572c23cd6269a6b8cf6f8272227dd6ad29c121aa7823f36930c86a00f07f05d4697481bc0903e68631eb67a74234f478b1602b3882172fdfa75aae44bfd98f660cfddd6b63d2306021c1883b93fbfaae409e5ab95309f9f29a8dc6978ca74a523b5fec0bd4aafcdbedbbf4bdcb1e4caf64bae2396a341e9863b52ba22cf522ccf9ad24c9ea30a57e4a9422c4f2aae689d46385e620d41d2e4199b71c40cd78c579edff292305f6e81e5efc79624dc8fa4d88cd40cd58c559e2945e4f9dc4bc270797e0a4ac2a0c07c7e4c99c9738b128e2cd99f2f4b4b902792aae4846c4baa15507984e3a7124e29d62692aa3404692205a9a3128e9f546024559b54624d0a224d2a4390a22de1681fd32b449454f97bfb28b8468e97ac0acc4fa4192fc5da54830ba9320458ae1b187df0687e38b67cc31a33f9627f45033704bb6f2b2b8f251c92ca85991848d17e0927975c2d70916d0b39d956554752f969e5ea224a31b0ac15a8aa72bd619d912f355cb1a1fef7328f3fd456aeff7d8f0b621e3b661036134119c1296cfe40335606f41d08f77002fc464dba34c3ce1be17c328c9ab468b358694129a74d384dda04befdd2acf4fd7cfb2a5950eb1d691a70355d1279f4a8c8f63bcf73779ffe9d7bb8dacd2ea41cf6beb63af6b927a4e9aab8d64b69ba41648fda1a7d08db9230dcf398b9fbabeab77f83a846952cba1694c8f6c7102c5b169864fb2349c5028e7cb125952cb2fd894b38f2c57e7b610b33985cee79cc91f542daea274ad9da4e5843255fec8f239c6c4b38d97e01525cb768abecbf49a90179ea843f74c94da366c49c2f65e74922f71d2f84802cf93bca51201877bc71439fac68e6a445af39dd71f679d8418716fd453f75e10dcd85379474421a5af428dc3a9b692b0acebcfc79b257279574f38059855c33704709cb34f8a9c1262e0d120694ebdf90c34f2ca8ee78e3460c7dbad2faa95ffbeb1a90d1de869ffcb591b6e51b369c838616eb2c896eda169d0129a84cbf9bb3bb9b36716f00c9f4eb17f25491c82b648d499818992ac91449a694522aca022625a53366c670cc8d16db33c3151a13dee81bc5155d17d1eedf6a8d698ddeb4486fb448e9e7823b6f8cb386312dd2bfd1226d19d94d28eacd8a0b6e7d4b6fccd0c1b5b11afbc4a6ec8ab25aceedaf610acaeba2d6efeeeeeedaed92a5d6ae9b477aabfb64086202372412b9bc5adc2ef59e066ad41a721c2ae4da55cf5abdd32bfd62f3a89673479a679d52f318e1fdf07e783fbc1fde0fef87f7c3fbe1fdf07e783fbc1fe04bd2f882cd8e1946a7baba2e75471b1bcd1d6db8ec493ddb9c5c4d8b352d72b0914bc2d5b4a871af16b56e6eb6d32571c71112b7ded7dee5e50273b1f19394d11ec452e6835d5ad503f10a11f0efd3ef34528e97b477418184e9522061b8073129a709a03d7541650d0c49b30a853bbab046d22c6b2db1d0ac6271471796cbcf01f46fe8c2f292f66368766deefc512c34fbe4512c8a3b8e5823d6a8357a62e482656dc4ca1a67f31ad9b47deee525ed391796bfc5e090ebe2f2534bcc85e5d2b2b92eb096d811b7f3c01d555679c4c468c8871bcc428ae012f0882f0b8b41997ce96fae25e6e127932f5aea8e9c0c4cc917ed8330802fb2f603c87101f6c152a673d1dea5489bfabdc585459f703d8f2ef7754717960b6bc2d043b4b236cadec24cc28cb21d6529dfdddd2790fd66fb12ff2066f73e19bcabbdf7c9e0b5a8d99769ef682bbcac07aefc5165355a6591b51f695491b5a761f344d67e6461226bcfb29230dbabacc026ee0a2e3fcdd79ec7cc2e2c09735b8a90b5ef3a5e104631daa2a11988e3c2fa3a0fdc11c4c95a45c99796a13fc4449a48da8770248c35919c2045edc750933c8a2991b50fa9248c7f68c6246b0fc29130df8fa07dd2aca52039e148878995c243c346c2f86b3f5aa9ac326d693e7af1eeb43796aec8da8fa358d6441464edc7d04c64c99751658563943d2cc5e48bf633985c54fe7e6c8965cddf5a97e7c3d1923dc4c95a87b5e7b0c6c9b2f6dccb4ffeda1ec7cc5b28ca17ed7178b62111f0c15024d2dca5488bdac7b4edc07569b9b05ad4feb6eefcd185f5820d8d994ecaf8ffc0fbc1f43c2b244e9b3a779336d17799a5d316c126aebf56843c552b24135971244c977dc9a81d91ddfda5ac5cc4e44934562b72a845779cb9e26d37b835cc41438b1ec51d2b0e6cde10a7498bfec13813dcb17a0deb0c67acf22b4e9d856ef01522447ea2c14b6e330b0cee58712a4e9b9ab449dbdee7a6bdaf6c2f33b542da5457da10ad880c3c6a68436d9229a930a66cce9e5886db9c586e9bd4b46fd165f345c39c2e6d704729e3a16532dab425dfbb36a148515ad36d91caaf4da21651a46985245fe8af882e52a44fe9f44f0bbf453abb767f1096569f2ffd696def9794c8cccb6c2f3e0ba4189b1aeb7e90baee47ad5da26fbbb81e9a654a4999be683a49ea6274a022363bb298b981f186b6bdd3771e383dc2a437602aedae6a377032d3bc582ca6830eb1584c87582cc60d318bf1936f5608b693736fdce8dc1c9f1889e2838efb3a4ab85e6b273b76d32ae7497587a4d89edc51e2cc740f1ca40026337fa6be0709d34b7e45c3914171c73923eb61866a37b846886425dc1ee6f7cc94b1df8388037ce7a5cccc945991e18a03fc26f47e9615f42d5fa67ca19acbdddd3dd47949ba778c6f8daadc53b24b81942e6305d5ece4d1dd1d0cfb1dd3eed4f6a605e1cef75a434a4ff673c2b796525e17dcf9deb7823bdf4271e753771eac6aadb55677afdae649cef3649b64a59d5aabd72bea63036fa5b5d65e51296a5ab51f90dd90704354a300dd42295e5112a6bef760f65d5dcdc6409712a3d65a434a81a8fd5c0a3a104a8a8a772710cda8b47f26e1cedae944934e20e68c09c44a051609b753595dd60c9b884e92bafb3891bd16ec783ceffdd411751da5b2012d6343adfbcc3ab9fbb1d41de4a17859ab00953394563a1d85a8a81ed42e34bf1e548e098a9bb8e3d3f9543a45c10724c3516484bcee0437a5b3d33aad1677524abf8be1f547679d32bc09a8cc8f4ec04fb54865cdaf48bf7be8ff7d32782766e44e9127bb0ed71a25f156909815d7dab8ae28cb9a202e87e2c6c8b2264809dc06413ad0515c4f963541504e8325bce0aaf8604ae186b2ac596206dec412447a043725cb9a25906062091f34f7cb99b12b230b27eead028c0ba28113b92845da07f70a69275c9b658d12345307f7cbb246890da0545e9440c5854b713b59d6a87054b210cc4a30e7ab4649eea7362f584d8bfd72af74455333cc4c693ab4d3f19e1d9ad234995dd2997d33b48ce35a9e919adcffbd3cae1966831e88faf483785094508f149a92e23d531cd57259eae5c51d698a0ca7d6d3d2ab6675ab5dfd9abd60363199b7506d8342a150a88ec9706639b97f6bb55aad560b8542a1502895cebba0506896d3a8994ebd5eafd7ebf54aa552a954ca65ad5eb55aad568bd52dd7ab2b756fb5bce52d6f79eb138a2142794dd8b49931d94cbd5eafd72b954aa5522997cd721ad5339df2d7ebf57abd52a9542a957299cb62c800e59455cd158b07fa7abd5ea9f94aa552a9d4844d9b1993517fbd5eafd72b954aa552a9192b343cfc59e1c899bd715f22588be2bf4874ef54b166abe7ebf57af54b1a23efdab037562b1e44d1e2dc99e851d746a3b33aa374e674d6e2755e5c30b3c06eafbce4a72a6eb7bb91fb6dfc546daa4d157d15b387a3f8e1f872b579c2a764e9b1f65e91487edd13eefcb669d397e577b623bba900267492348656b9692ea7f21227a44fd239559baa11ae0837c44f154897fa698468b98675463b92a59fea8c28f7ad40faf4b19971e115f2b1a9342df913eb71678f72f52c3b30dd27a81a3d38c8fd1e9884a9332572bfd7a44f9f954b186f13fdc0685e405c5f8fd693dc1f96e7e463d34e31ac898b3547f9b3f253dfb096b49ab872bf723ff9d0b06d60eccb6f0943e753594e9f3375ebd36f8691caf3d9e03c82b0b9e58bf6da942f1b063ab3db6367ad4f5d3da8dbd7d91312c6bf7e6c72addf4afa04ae60b95670e5c4d5a4952bc8ca355475521461936736981317cbb5812b3f6d375dea5fc26ad272927b7bd223779dc9dd5ab8c5ea4cfb055ad29e1e5a81b4b0d7de1b435a11892a7ca0b8542948000108480a57080923fcf844f14241a24912178444184040197c9230e287272472cdaefd00906f06319089233c18cc785ad081eea5fa5e46c4a0151303d7d5c18fce9199ce0a7ba4c5198103db14389d2d3a20ab49420a3e5a1950c5cc606609246260f02a321312d160c64bb21a31624a3b5f7e33d029864c51e466800646d8c45011eb92bca210e0d42c6b40b0c58f66e61140106b1bdc962c6b40208513f7b3ac01811260dc5114905c1523f4e07eaa0072b71ccc255c192e68215c30cb9a0f0c89c1a559d67c6085800fa86a6878f024509635469420d32c6b687290c7b731826ea5062da84c7f82ab16291872dec8fcd43d7d10076c02ce4027601337c4449ab81f3284c3814c297744a6b41fbc429e40952cc5244c4aa62408224f200c66821cbbd172ee08c2626012f0d5227d70e525fa1c068b7430683168047481475aa43504592dd25781425aa4609216a9bb833620ac45fa200c8481b04cb5154d03e9833735997e99fe9db9347d9a4cd8804bda246b903092a92ad31f412739994e0e1c91c78bcaf402c9740471327dad9a469026d3559b4610060369daf47476912914f2080e510077c4a46fc1587f378305c9fd817b65ee955b765a70678c6011327d59c381551e350d5b501d1494beb02ca3592bcd636934575dfbcb39e71452552d82b9736f7695f5dfd6f51f6bac43b9bfde743d525db09964ce9c14940be924695491a55ef2a5672d3271edfce5ae769db2d2ba792aabc57e3077d4bbaf5b3b9079741e39d7846105b97f56ce4531f7029bb82e0983929b7ed7245deaef0a6bb17b065dc9a1bd165a60cad4b0be10329c1451c834dc3277847b71aed9f53c722e1559f5412749630152d93ef89d7b5deaf6fb0ca3dc79f7eebbd16b95ef7d4c733305955740e5cebd0ecb4c3b5f18d772ac164b455ab4cf6a955425212dda9752cad2ab45cb795f1877fbc2b85a09a7c4449e463fae3093ed0a4364fb297191ed8fb6b050b8a330b20d5b3690ed7b985cedb58fb964c9bebd313f955825562c5b708a6cbf059584e9bcbd2a0d8986af65d92fb1da54c47e4b966bad25ae8683e5fac9b55443a150280402815754963ca9c0bc1e215d5e5f1c179bb8a8c4cd1476410c95a21900000000b314000028140c8844a391581c8f035d991f14800d7ea23a745a9d8ac31cca611443c8106308000000006000464646a2008e230e90ce6020521e1d441c93c903feaad4344104290cef06c190a646f319881fd14c2dc2e9caa4b93db06fae30edab91a898486329efdec880476fe1125c0087021f9dc874e9e6f8ab7ae148bcdd9c8c6b18dc06c4b898744767b21ab7def8dc6e6bf3618889e137e17dcf78fd55e8179e05ab6fdb249a4a5cfa3eadb4e130697f00e3c4473339f8fc7f9312a3da34539a40a112c4375360dff72369a28b69db7e4bf814423b5479409f066dfb9752506029770c63270d95336882337a18bff87cca26838d4a841a4fadb7cf76b1f748aaf220e060ceea770735d64cc904850d1481f4f93765786a993125ca9d5b1776a6a31f4a1f31a6370ee79a50269377a6a5d8fbc89d2e08a3e5f238accca0d4cf074741c58a433f05082c90f2f2e50b32b9b511799f650549acc4f710de5c247c904d6ef30e6f47575b20476ba5240ff82c1445a83ba451a47931a94978a757107bb3a56addcdf61d7e0182010dd010d2b3f4f463850cd24a5c4a66284e3843d17808109cac53a9efb6333528f499fde171936494727be68cb41539f76b5b1b70108daa7b8d9d93a3b9c4a04a12393b4ededdd73a898aaf5b264067a8710a36f33e33806a5f385fc4464c97d02440b60ce6091dd05bbaed214cc364665351e4ceeda7efa411e5aeab06661826c1fa1c205e428518580b60527d451ec8427692f330eaaf03fce2099824d559caadb8f3e03895f27a30441f869b970880dc6ef3afa37a7fce7417a1132f866602b06327079b91f84fd9a7bdd6e26f382acbe7ca588917a986047d7ae81494d358e39c4ab84eabbbd27f8cfd516dc7aeba0322c409d1192dd59d54b1d2a70ea22ca2fbfc40eb853d38c91d12604a66d5ab0e527efdf9462ab44a1f74c9fa3f4ebee12ee8be985e4dc1beaec038c93a8098e8855d64b76d194a81189d4ab90a4ecf97ec1584b9765c677b4f940cdcd79416801f509680f1ad0112c050331567f6d49128b7c1295f8bca227946a0916b9453d0f14071a323fca47b936deb7db13418b902e804f2aadc9c63b4a02ca3107d738daab30586d21e7238d929c8f1cf2db205d2d4d30ffd60658262223c35046679887f49a0ed565b708a100c1936d75ef27940e097981fe5a51a037b8cbb2c4a89713f0685f583ac79fa824d70a00eb604e448cf8cffdda095c4c65f237648162809504cc43212068617975a88fc4a449be0f44898acce7f9580fa472fb7152b7b3318005965c87c4098009c2c57f08dfd02dd6ed7aec128a425f040b00a0615f5f9328989017de7675b99e07977fc12c4240971f90af7c54ae228cb0f0f7eb516442ad8fed156d5fda77164b5e7cfb55d1058602f4e111f365a72d7abc78b19c1489f1992e8bd2d87aa739cc5b0a573f9aaa3849fdaf465ee455e7c6247c1270dff67c57295958f4ec227b822de5ffa531c8a8d336cd93f6e745a23274bc6e00f20823fd192e334c4930da59ca17d3ab3b93a772d59c1a36a700f568854d83378c3d4b24336ac446eb3fe43a7575ae5a8e5e53b8abf3181548245d5240949c9559f36afd0c8c0b6e9e706e23fd99833453b6222a98b1d40d3a79a02d52830d804d11963cc148f20b46419506ff4b80c963c2d2fcb490734b2eb0b5a8d632245d02d11a033855593b4c2112c3302b5b53ef9d610ebd5b4d1792f096cb3e29c4ec5b9d447a0d225b793e88e6f54533843dff004cc0a2e7a0f280bffd0e4fd1688c419e632c64a87f636bddef489aac92439d3abf3a72d60c5d384817ea119341441f6ab11915af458a693a8a5cd0ff08302e786f7700283de518bee06c819faadf450d93839f2b3bbd45202263414d795757195afe0d82d66497f2f3ae801d90922722fa17534b6789424a31278e89e6a566c44cc3ebf8a7a1b70b9117606449f416b1dbcc6a1231a347ec8667b7630352160f5657aec34028a22b54eb20d3aed0efa515c24003b6f47509d123c42423f6a28cff1c3672ec83429fdc6b00bf6355558f1bc48c482456f69f22a29c88e26b9f3f11aa722b4283b5c06f605b076ff80b937f6c7190c460a6c4403101f552eac0e310f251b1e49bb0b70f1492093c739e0bc7163112440422f70eed93aa429e7b32b0b334c244cf3dc791d3df4c170bcbc029144b9222f38db9a1edaa9508713de03b4ad9a72701125722656a290a57260cbc19a4caf3e7321d8fa078061ff5cbc32ddae6cbbf69a01f224d6daf02e504ed9c5622572a547a39791a72142805e68ad2af350c2a8288681af8e7e5e74276ba6f344db09b99dd0eb8b046f938d3ddf9da64b3770cdabeaa8d4c3c6434047eefe5323711ca184a14e29e26a82a8957d6dfe0292fe0c0cb65a9d815e1f729c1aee13a6e7d019641073b3a62531f923cd31d456fe33fd8a8ae7a1829222a624006af15e837873abc8fb4186f85de4d48533ae0fa508012814448d0ec819fcc734d6240d03739a43df2082e81c22226a462f007c89092127c0c4163084e654330d4a500830042a0bf827d1edf30c3a95e32d0d8ee9e46a84a143472f509cbcd8028a41ee44951c8a61a40e82a5f746eb43c529388f71b869a4fa55825228814adb09b87d82388a87b06944ea1abdc91e75c441bc9041ffa6c43f6898401a595a64f662b67960f8e12b29a606ecd695875f19124eb691aff3cd7a1a98925116813185a5341944e1054af1302607731fbff6dab30c4a491a5b377557d09ce368d2c04d3a2451eb4c55158630f42d241b11e7b06112905b3a98c6067da399630fbcc7f779019dc5d027f111456e53c17660ece88e8d48a8cd7e42f4839141638f88812ad00a94099467ed7bb5683898886b8b1dd06f68abfd2ee7e4ae6b7204a08ab116703c7792737d6805050081c5f64ac125624d63c1695eb98a9c0c524dad006349830998bc3592151c852555528b26b53e02cc5fc48248c875dc9687317f9347104521d02100fc24c524fbdfe889354ef01aa51f4aa544a5289546f143ed7433c05da5e885715ba953ac10f18693a71877993c26ce9d7000ce4e99e87c8dbed825d694286269c62194c373db7e88460af1555d6071cbb9a90813f76131a622097ac9800c070b6f0808424ec0c5bc8864477ce162c4c8d5389d9597f8739542d00e7ab30777813c96bbb3f093bc4dc3f1745d1b81a421c7a5c55d407872f8ca9d4f8d902e6c2ddc25269973e38dd40fb5d3cc829b8da41fa5511225aa9cdbcbed1983e9c4b6bfd9dfcb2086178ab038a5432877a8c9211942a112f99d41b85b066cc39f7cf9344b4fe83c6c0d8fbd7d000b9b34fc78c27c4e4674dee4ef4d2bd20460a9707dc7f92963880024b1022f1fe965ee6bc7b816156a45b769e1bcfa182f3e80c66db3b92463da73eeb1252e882da7813f715d19a9eeb6a8cc4eafb0a38ab40313c3f62330275f8e4e1f945229982045769f417a12a5661bc4814c00d655f88a5aa5fa9c5778fbf7ce0e863b98f53500bb925238af8be885f809e71d7c0c1d9872d02d3c7072394dedc4adac939f957e8327f2b9531ef230c1c261e43f45926390c8fe5818321ee30bfc1827006744eafcd46f929f6e6385709a4956934737030036e51988884c0ffe1e0d0a8a502bc109d01444c0967da791c5649aa9baaec639c2994d0e0dbda74ea8c64264415057458b0cc9c5a8b51ee5c134172f17a1fe56b24e1895f12122c0bf6661c864f7c0d84d985a6c280f38b7efb6d3b87acb4e513449ed4434344c67b236d184480bdd122481a2c81915389d6314282eb2a59a0e24d0b11d52a05e1ac45eb5d83b551467a51774137a430a46e4bfd4266832f9961218e02a2d120a11b040928126e82826bfe69eaa02b61fef94270e8524aa66a39738e5108c92c327ae188250fe1f1cad5a49c60b0ba61d465c100cf44eacc187a740ce7ed9481753b1a1a653e6cc6de1bdcb5502e48db947479b7dcc85c17f02bbbca4c69b59bf4e3b9341e0f0752880951c1827cd66195e9fb72c978eb5f2e24b05eb9c6efb313551f23d5b4d382c396e33514e023973380fe00ddfa0c91510038a1e0321e0c3efbe9a59b72099d0890397b27f1dce72416586e1171f697b6a8b9aaaa0f0c3cfe0a7acd95b75feb4a81b74fde2fef17b0acd7c92a5d7ac6fd4626bd70d01677cee8c2258e408dd038225ea477c163d2dbf5abbd9264b7e0a51b1570de4e376d2b26c2167cf2321494b9b4da83a65b9facf032283fefe8085df5a19f686ef8af4ac04d08d667515f10cee084bd7a9ae9fa44a581318f18de98bf123eebecef3935bac1bf57eb3b3407ebae625b392f798bfbe361511f671c735c1355b0b690e65744e98d7455954f7c976bc2a998b25c426b4c7f6751bff1fadd42545452e60d5af31d961e6ec9195c429cf7557cceaec3baf028ccf36778d97f06ae447649bfa3087631e4ead15ae67b4e322619135caa87b84fe37014852952f98818c2e0779091dea0dc8646dc249fdc36adc66931b05ed02254743e8015c7972f30fbf2ed4ab972561b67938f8b2d8a170497169d3baf8fa18bbae56b105522c207a7720f0dd38bf3f05e6e8bde71b40bbb66a0e704a7e81925dec0b2f3f84a34e1110b3cdd0199c63788e229315651bb419ce7b47b95612cb3b2e3b4507873aefeeb4e880a16111c12e69b4d0b45aeb415fdba13c30bfc937550ac00ba59ded28d8ddbda3e66dc60667706ef7af59c3987d9d28ce174d7bf694baa8a85306c69f908694d6a17ccb25ba56065a46f161658dbacaa43cc40b2888cb840b1c1a9a4c8177b6ac57ba6e1a58dd589828e9e99a344ca7037586abb98e4e3259fe612d8ed4beae3846c589fee0414b6461b7d332f193dc8860bf9962ec2d7f7431ab7a031d6dd649602a516f5da061c71ea15a89e23aa1b8465b10d575863a8ab22cd23564e07c5c41b846a3e1bc898272e134528fa491053fe1d538bc7c1c250f79c45a11e30a42b8b6ad88754d438e88b59451ddf227c62454ca9addf1fb27c6e7054351729423626572267d49285d2f6b115ce38839aad3b35255be4b197c99fe30908bdab84815ec980fa8cabd786fe9c00f9dcc5dbcacb49195aad6fecdeaa2ea16bfda62f20e6a0a9aea463adee5f3ac49d874c3d9effdfe5c44b56f0f3bfb1586730f99ec661baeb7d8d330bca494e396ad5bb982357d0ffd2e38bae872d13844230dad4057eecbe9dead92a6538ef391ad8359a3d457852521e8f71bf1b8a8f1e311ae5b75a871db94f3c9731e08d18a37323e8208e0cc5558e0c31cb11256a021666f728daf56e30a4e6b8404ff6656806f39a1f0cfb175d031d61f9945490e3e6305b2a649a551789e2602251e11935bb6f2079ce1afbc8bd36dc58982d4a6a403bd5c6fe37f89ce19a220c98e83c0795c6a2fa1abb386250935c0c9e9f7059e274f14dc88426ed0ceee526fd2c001cf225b341b5470e4add53c10b64710dd36154293034693d582a26a5bef609ab43c73249126e98253e9d68d3c0259946dca76d06722582a8950bb2b45daddacf44862482c05ce45050eed91172038488aa9089a3a0d7f72c3e8e02ecab4ad6a50ec9a48a8269ffa90e187f2cfd600e8baf272d8a49a27b211f8ca31168901aedf9af40f7defc54a5f4aeab6e9508071e3624050d016ad6528c1e36d38ab2bd3dc4a0c81d9bb16411c62625fb78bc25d0398c7aa9bd83582fd2846adea736077a31844d283c25ba703d94c95d9ad08a8b5873540dbd1597aae301c846cc4f48087e3d6923a60e8f2a68e129a3dd4e23318fc58104f260176b1c970d8d62a4932d8de76c7dbf09f146ef382a8572e0df2d586869a29d39ef8538a0d529b4b6856c59e80f64c0f8d6ffe981e950927313fa2f799052d8ee7c8485f4683d00e8dac7cc93a0b020ac1cf3cfef3b04ace0ae434bbaa5023d8c2718dc7b54c25060325dc2664d07b9f4ac23e06d234a4e99db4be8b420dc1cadf969a7b9910befd36e957a1be84fc30858500fd9d933584a82a0f91a2284b78001cb8c0f7364fe1775766029ed08b6e5c49389b5663e79a96479f3b2ccb53f3242850202e3ff0bbd7b7e02dbf672167bbbf62ffbc3f9b6acdc75abd7084167cb2ee581fc9553b5cadd91e0ffed827e9ad0b8755d1caa0e11b7f1d069b6c9a96af168cd7d2051c03e4df00444f96151b1eae20450d3e9cae26add55672ce0ba12e6d2714787d951cab24422210148daa88e491bb6abb1bc04d728404e26c790f24a9e137193c975d4328f81abe3718a2f17da21b108195c3e3906c28cba8e4bb3674639074746f0bcd7d65342eaa0db1bce5c6ed6e24a75b4ef4971b7d857e02f30b6cef97468b86887489fc21290a5f4a998435a6ade4c7a19c77d058c3d4cbbb9d0edcff524f783617291acd6d516fb5def11f5c62d62508d3614dbcd3d7fe4eba3b78041b0142198a1c1231f67139477a23feae85468a60255ee1d618dcc5c6999094b5d44c3521d86bd9ac5070e09ee24be58c7ade5fa667902382dc19dc401fdbcb2b05f3aade384838f5b962226af4c4524a886cf6b4ba04475e5de13685ca35cf8287f98145d5acc4ff290ab64d7295fabef27843a91e2868abe8c1d02d9053f14c42442319fcc7395a082b8b5f58b950b1483b2e221e1a39956fe1d87757ae5bdd65cd4ca5963b36770e78ce001f2f00842767f562d158d00fc7e240a649c4e134c389d609884c97a7b74493cdb272ac9d6c2abf464d479ab8caa1f487d27f686d1de0d55de6751b0ec59cf47df6e07ab0d8fb6bc958360b80e885e523c6a4a4c11993b8456c67e41e2180f6e7cb3bda9bfe1aa2d3baed49edd1e00c146ec8e43eb266cd0148f65d01fa833d8c40b5dc3ee751e722aea563fa9a7b852708b4a0e6be0ecdef6d82dc71dfee344a19b892d2cda8038d3861b29259ed6d7aa03b3c05902c3f10de60439c2142c80615fc5593b0134a06a0d3cdcdf2fed9b2885579aa12760ce58f24243c1825062600685a262e48b5c19156ec82378cd2eba9c8bca64397b5fac263ae24ca60cddf5c7b4521c353ac0d69efc9835b4b47296fb592a0b94449ac6c3f495a560a1b830c4b9fad6690b856d859e613b22a708359d58b5703ea2a2cf58997e86bdf703ef434c3ea71ad111a41600b339f8a4751f1a16e7d5085e80a448dddeb3b62fbcd9d00bf1671c7a408c7a3aadbb1bf169b54bc0f6008b088c92ce58f346992c00827d9436fae1f61906f2c8e54cb076a1ce1766f5382a8127a621a6acb888972d316ecc3dde466f64fe93fe1aa9fafe35eab6d8ecf47720124627f37788e31e858b3f173224e720a6daee8f98a70bac8ba30f734bc7b1a444af0ab5f513ee14395535cb5215338e8999d68068cfac4fbd55496048c8eeffdfe19d687eddf53aa1ebab027971ee86b5c018ac5058449d90178c0a05722497321b2cc23d5bd238fb5dd0187813218ebf5cc5671d5f90f6318a61996f456246741a9f9096995c562835bd24a8da832bce38b7807ca0fbcce10cc481114714b28a228152587dc77011abf1289f4513e92428a4c74ef8c33b0ffd86f42016f9ec21eeb56c0ce6d6682c16ab57422fb92e9f08e5b687160d95002b790983c59ce506b9109505c7addb8e66c6f98f8b3cd3021bb12a6a33a03236d18dee2294c79497ee576dc1d1809b3c0229590309c33c59c2157511744a015918e9bac307fcd09f66e298fdca410f6987a3813fed3ee3b0e12886e86f647e06530a737a4dd40ef3014cd80ed6024a55bd54ebf4682ace04d87c3bbc1c86495744431bfe85da491b40f7aa63f6923e5c398f085a2661d533b520549639c35a9744428972e57b822c3c7b05c734b7dbf078d6971121a91b4fbfabf5d99ebcc7ba455526b61874c4a58e0a750dbe57a05366d0a0dd0980c9727bb475b020bb39224e66f58560b7fb2b79bfce3afcd9a358c93e31f01dbbc8844c8a0c32ae97a879ecef5b8d62b3bff266b2d2fe2c44384e0edbc1fc57a3aded5d1de12ed7363157af34b332b531e9c22a9bedc3ebc52f870af45e999f588e207db08f3bb12fdabb210fc6162658649845d8b7173dab6b41c4d050514c8443d1a239284ca53c8be57a1f23e6ae66c20a2c262a0fa38e5edece3c8b4d1918920b40f39d02615752c8051a378437c12be4257018fc9c1a6edc63fc6cc73f00ebdc416f8c2b9d4eb552412b658923286f37c422153fc121de577d20789225b6a1689ef2b677d6284213ae1d0ecff991552a68c484e6c9ba7cb80193f8ce8ae6b9c7dd5cc8195287a311e2931c17f535ff247cdf3a012ff9919003148454af80186e5aa791917053d363c83f83db6d73ed23047daff3b01d6532c38c26919aa7df85c40bc6bf03c0e9c769e6ba9c4c5d4196e2697181653861a204f076b5e2a465b52c41d131c8d5d48183bc61dd0ade2d51d272f8536146d1a381b5ca665622a4be173793d3d716162489b507bd5a200bbb8182e2937bf1517d4d3c5e8056db3e40585e71d19a6ee0d5b5d40649c0f0ac107559d5f0a75ffff2fa410738e86a8f24118f0a81cd73e95f84989854bd8c1bbf090ad77946885423352ce235c6254ef03a6865d6587f45c6ca746da201a7a5394fdc35c13bedc33bad1c1adc20af3b2dc49f24d848ca47599f332ee470fc87ca261f3c065a669b77c9db2a6147ece1ea2c7fd45d6eecea5a238711bf907b1d4c59ad480fda2080b91f85950a88b6c8cc3fd78e4a4aadf1e8047c40f4c60e12ee71ef040299e7c1238c185a23cb4d33d36dbf769da539225bff3406d52f63c28efec221f2a24f68950aa046f88b27795c52f68a5b7617d4c922f9ba467be435caad5dac023742d8090003e5b34dc13949d31f1224e95978a412757cd8c62d2acb78181cdad58a69a8395f18a30d80337d259bbbd3cbca6b35233360b7af55acbba99afbb1e422a8ab277d78f99cd1238804506b27811eab3f54dabc40d120bc934278c76ea5dbb9f857ea473c897413d8d06031c1792c10f80965898198d42019b8ba9363c1709e6e46c2c971f99bf37f890381c2dda2a2a3084bc1548dfdb10f19434896fb4687e7823eb78e73a7b0dbd064bd86ed6001f7fc4b592026460dc54ec27a262d581668e1e6bc4f61ea0d633fa7d5b18388645ef179078fcf5fc626058295c7389754d0330cde02af825d604420f5ac8ca70cc9ee37d129f72cac7a6de9928e281aefd075a3b05fb24d34d4daaae49d49b5b0907f4c989f1f9f35d547e7fb80108bd272c84e1cc4ba05a4f36bd5c8e761457cfc9919df30f07fc33e3e97a67080f17c3ed7791f72ad96dc27dbbab85d8645794e5cbcedaf66fe57045d2c11ae768939f1db9c93f6c762a69e9fa445a86da198a1504bd555bf9e929b88b33079dd4d1f78189eca1cf9895f84d4384af44b088ae6b30bc1229227918846ea86f6faf06aa55d5c1c0bf4972f9152b256f039c64046a9802f4fa6791453cade72c5f04fb960ccff958955c9a2b212b41027462998efb9cd58c1db31aa2b35c801d89a871f43a5ca64a182b168a19870586f650c97d947e62024d9692df0b0d08278e87b6a2e56608f7e5f241b27ef0ff7f29b3e620fe8b7432abfef3ab7d39e90eacfb8340a483da27a772daff7e802cf7eb8e836b49b7cef93fa4ad19d7d6a80cd2a955d5059926c4b6ca7c9a8a40d0dfa3f3f6f96cfefd9445941ad75184aa15f0c83b441a916bbf10725d5ff8f7d7a1793787bea983c4bdd87f6975b0d29453e71c581a3fbe367f47cd3ef1dadea01117b5cffd0409abf01bdb50b320eaab51e812367fa7ad4c9d36eb3d081c613f115cdaf9161b63b6ad745b23365db5d7db4f351ee948991ab88fe7b5be007f014d3887d24f26360cd2efb526adc5f93e39f2b38430e71badf8d03ba4bbf455e780300fe59b48b300124ddcda6af5607baa5c41d305c5d10a8311ed83790a21d77a04422fa4506408c9c39dd5df6cd20fbeed885b995c05e37d720c013a0c045bdab2367d18749d876575218a56bd4f25a0344f367a9ab3a2f6bfce068486be507da59448be9ad1d96c84656062f0c10865ab5c8963d67d485251142448003bdb1ad945b0522b4a94325087e26e2ac2fc9b040b5fdf088938d7cb7a10e8cb218a66a1a60a2ceb0229f26147e97fd5260ddbc14a408665f19f9204a1e2cf1391726ecd19a9d201e623a371dad33a8a8cf4708b4965a6858dd115c37d9742caf80df68dab0a696024967a0f87e6f0450f54cdaa43327453b0404ac6ec0f37e35fb9ed195e3f56da36aab131b1c5208325816f8a80056f33b4be158030f897b2d58915f152fd651eac9683cd8f009724df13237ef13b8e82691bb7adfd30107cbc610a9413e59f985020cd6e5da27768d17a9d2e1b43a9a8fae41cfee410541a6d05caa5c2974e246978a6d686019906c1827cb404bc5605ef1c6b5cf3a231424d1c0154e1f51eed506608dc4e2d889b912a06abd97c07e0c1de5185b26b389e18af081d137dc2387f933e52c23ed933e51dcbd0cc0e4ebe0ab1b47a051f5838fab25d122077f2697f77991b0d60eaa0cd6cd3ae0b04d9989ee89a1bb1d98b6c803224fc21a01e9e582ebc509fccd1299b131938623311965f3daaa159b188bc1537497b1468bd9ce74eddc7c94d286473781a43deca05ec5c7b0e7453aec7d114d2e01746870a3616c56d3968b676b5ebb01aac684e30c7815d726aa0e5cbbafc3de7e40ee6d27c6493e0bf5b7936ab606cb6869fc307b74aa950eb5664cfbad2f66f7fcbc79844b85f360ef66a10bd21526cdef17e2d172cf4d1d1afb3e984b95b63db7e9b44f52f8822a15ee3a693d4e5ef304855f04e1731bf11bd1a30b7c106e11af65524e8b246c9a0e7cc680b97b8fd2618ea63e218bc597d114c041d244c1d753ed8f35204f5668a35f7b48da16ceb5423ec72138c6d421a1cd2837d62a08a0950017198111e7b5d29d1d4cca4f325b719453c9e0d545c5d7eb1f87a0ce303b883922722bb75125f714570b0377bd11c2db27df21182cd04151fbf7597b9f373c17b2b745fe3b0013d1c73c2ebc139ff6d8f1c09a8798e1c57687395454fffa46cbc3509e5d874b7b2cae3dbe5f7426510c60c1cb09ecf1fcb438baa535d0c29521d80d2265ece2bbc61b1bba0d46a95ce6a16bd0ecc17626d7416f531ecbae816311257b18c83877da3a774d29fca11eaad8733b9925145b0fcf44f489d2c4d7e18347972884fe1ad6bdca69205490dc9474d77fb287a4feafd1c5562e3679c2a8f8df537557188a13b55ef2739558aaf66a4921206a355bb5a7a484c1cccce531426db314bfd0f6f76df1328d46af63af546cca640554d0cd888b2c686e15333df5b9b34ff69f0bd8377ab64deb26e39ba62b4ccba07b29c295adb4ff1c09f534886f994541ea0564b48aa4abdf142ea5cf2301f231cc55bcab621bb3454bd9bb54f7fadb5049ba678de3a17f5dd7bf575c6cd2f1b83bba569f289d678a20fbd3963b7bf9ec7f8840cffcedc136c9272075027d0aeffcdce4ad52707680e31d594aedd1dd8f215075879289ba2a5c5b11a07062a65531ac05f9598f3248bc81b9214380cb2c1a9fde6f8e1454dd73e06c2fb4fdc6f6b9c3db26192bb794d3bc9446f26ae01702ce8fd518b2bce03c0fa2ace70a659cd12f8c76e7eeb8bf13c14cb39cad95e0053b06dd06e6aaf44185a307294f5f29e6de5dd3dfcd6f8020a4ec637f1f5661102bb9d58925e01e3b819b6fcff59ec242c35b28d777f21643a2be1d0f6a7e9b6a3253fd2d12d86c4b1c8c672d981629bf3f994aaaa9e8162014ad1fa486efcc599c199a4c32385f37cd008abaf06e08548141f84fd34d9fc746b36da67e5fe7cfb6748eccd60413fe72cffcd313252cafbe9e152f5e06fe15edff3150a09ebfd41f7d6ed53091a5b8daed35a477b4b9fdaf9f8e33810849e9840a7356a434c8714b3e5e9eaaa5c862e16b8a3020a01dcb005531e6545042e55347fa7c6ba89e650c4540057c76b44b52ceaa5e9b8f9c01110ac5143a967936e43bc31dbea1992147d47bc14ead730422778c327667408d88dfe716270b297a65fa0d20289d851657bf20f0e950293e26e63592d65040ed5d25c4a6419c1c1e047c192e470d0f5374dc7a466c53ce2108e35cc2d4a76dfa0f58934be86e6ac1cadac65428d7e00820bec1580f747955cd4128a461f63c101636a5fb90ffcd2e84b7fa8b6db2ed847ab07f38b69c79042db78a9fb748a1f468c421f3767dc6dc2e24761eb54c465d6f61b03153584adda01a4410b4271d195ba95ca308490747a8af3f0b65a140ee4c680b55313c4da4614142c3972774e3e9a2ee7a7454346283c99a9bdc462830f089d24a06fb0ec2bb682673b790503ad55c1f8567af4644a90ab8c7c01c2331886dc8e855f447846dc2a42dc0af90b4ce32e34dc58b46548738143196c9ea1989bd41eb871a6a3f6f0acf5c20e5429d4a21d78148e4ed797b4087b5ae5aa95cf984a441849db6a202c5c44b4d867d4a34ae786a04cceb87eedf57fecf008ae9b7e2a6cf0711a21dcb7dceca51f825b41d357d53e77a9e82cf00b1f8f09adc5a7a1fcda6ab059a36e5016f2f2c0838f7d5feaeafa0070e1370edc97dacf6d37388e5db6352d6a674c6f986c2a2776c921ef7f0cf0e361c467c99343491d2987289ae3aac6592d357ba3960863b2b8e4214dc83d4a90708a5b522e4bf62c32ea51f58c0779151059281a736c223c82bf14034c96b06b186cbb7c0774d74aab4e701fe5ed3738a7566013ad07f2ee2b71a80c7ce611629120b52534137817c816f8c862e11dcbf2a636732b972db591eed4d48e65f9cb80627cdbce9a74996db5c0d1fca86cb514f04392a2d06f239a131fcb7289e894e0f63e9f2a35935f66356711a4af9a62b7cd6dae2341e2906454c944ea6c94eadd16c1b38e8c0b81278661163896908792b4b8e4732a7c375c67c92769c2704f9c3106f4a31b16f3a49045057bf4f9c6d7cbc313c0449f13df05d0ffc33a62d7544df4b085859570cdc488803bd6cbe4ab705025fb15a3cfabd1d3317c18ecd7bb30819b4949bd498a688ce29fa0c554ece8772f1f0fcc62fa4e50df6b698f141b64ddfe42f3c700a50a7689ded93111f299456ddf00c0e09f8df1a038c9172821b9c8acc3bad85e609e1e1049205592fc4f349e3440925a005be4ae1383d870ab09dc360973908d895f1c17ea394088a2c8631ac73493a93d891792f6bf8dec7396ff8a2acfac5090249d1641208212f2790a4d7637d9f410d0246c2cfa798181a32d145883ba888737e70dd12000c2eec936ddc4d2162742e2f3fe0ed32bab9a4a2201c631f39c116845d366344496db8f3486ddfb61d5264e9cb15142460b52db613ba538d0c642eef8f6677438dcf6d20f5d72eb7d203ad406160fa5c1eb899a9a02c135f7c58caf8a13516dab27e3217c15a334acea9672e986fd04c1170283e03f9c4b0ecd4e574cafc02b1514b2cd979988b71e9e7d19e11f226ce9ca5d0f982feb57d980948f37feb05be71f800d87a6fc69d950a18de7caef42455ad4bd0d8de0117bf5b1d0a8db06b942324a845236b478577b47d9ddd5a6c11e7e43f1ab825d9287d36e0de1a99d8f1f5a5346067a942e9b961fcee3dded8277ac71a80dfa58216f80cfd5d04a50cf878c6cbafc1af8f954a1d304c6d5d06ecda07de0bb7c8b58d8d1a65f162a043eaa0a61ff595a225420fa04dc328375151ab45d54eae6f7ababb56723e4e272c2eae3332c4cfbe86e11ee02adce34aa903a418aa2e23c78366f283ee6c85579efb9e170c6fcbcdb81fe8fb86cfaa6900cd2145fbb77523e8f32d47a23809c701ac1eb32354c98ed48e53b2c80109cda3a35a9f0a6d249d84ff9e8a6d2aac6a77c57f2538e529da9971e895da8b6fb268065ff3b3e0fc92cafc2b886f7d9ed0f05179910fcb603aa0274df2cce2b492c1f4a1c0aa41d44ffb74c100197a9af77073f0d59cbd3d4f0805f65c5749302273a7940036d50b023debcc316f8d2d800df7402763610fc1381b618c4c8de65d8583d4ea9ea590e9d0153d44b4404a3f0ae96c14389d0d48cc428bc921a0223763e858537baabfade6a1b38c5e351043aef2cb7f9f751423b6e224d77ffd78bdd20c2b458a4f5c849fe59e4515cb530ac96b461f327ca247d5deee7987f9077d9bf9bcc0ecdafb15e7c073506e13c721e69c4b3207f4545e67e608a867acc31bc2b9c938a69bde9c9c158a343c5e30222f8def07a8d33a4e0be742c5486d315f702f2347ec200af763949c6089f87b4baaa9ea83332e44d7dc6b599625d3a652fa62d4d180e64652948be4205f4a281ff487936a8246a11699b2ae68e6ed1d253f85933240f8a7053a5d4051bbe2138d68d0eabb7338a2e0abfde78c64d75e67470825bb27551c655d87d722c342b332de28f00a37094c78b17bb1a8f0fdc7f78d9b5e7d582419a242245a974e26153cff53fde3424ff6e1056343abcde689f3b53b34536a525a2da5a76477fd9b919cfe330e561c6d92d66e66dac5231c959921d460f96dab3ffdf0a5145af066124976f5628a91fb049c7bfdadb85eb5b6422f5f146470127f1991c56b10391ff69f29edc5a861110bae08f635205ce835dbe1ce711ee01332dafe9e63f9f493b93cc910412b7b611365a00000788ce2ec126ec4d9bb7232fc00252ef25f0b9a3686fb22171c00c38f2aa7c907abc8a9a77794fa0d756499923a25ab38f90148401369f4935a8b17d96578b310db4294674d12f02facaeb053a3dcbf4eed7d0478bff6ad9dff0fe545cbbfe8e88d622a1f9ddab81f76e39bcc449d58f3aa6951e49a98b289319eb19131de88dac9b3cd1ed9ce744129e071a32b2642cce090226a3d9650fd4b815511687f7511b3156d9ca20d118f534248aa64eb7c645032685f1339deef5d7fe7463247b576caf4e4d8f6021849545b643308ba10262cc78e5b393fada3ab3fd0e5a4986f79b362c28b9e8374150ef87ff05c3a6932da5660f06670bd79aa219880a181b02b29628a59d1037d5d206036f3573efe682407ff66dac20f7e1b4c9f2981b1ded0564ca58f78bdcd8b1ea42c189b281e98dcb35517829bd034493c2d06ffa59c38ea5d7364f04bc398d31ae6ff21c3da31d47ab643168b814209e6e9f94c9c14cc5136d1c621777e4c21acf51c78c205e80d34f53d22f63790c8ce9b952cf9ae617a01502bd31a275fcfcd35dc65692b0fcc67b450b6190e5f7bf05d7551c5a2ecef26e32e73a401a2f8673cb33084d379f450f554ec58ed5415fd699ab73425095234684d46e0646280089194a896e5c3a70923c231cca511f3b58316c98f490674af4029eb82f07f57cbc85e889a363b8794e3941c172a4e1e37b494ece6c6854364fc89ab96cf38d6481ef0cea14dcf115800e48dbb755ce3af2a128f87c1b7cb9435191ee6b8809604b88b026747c362f1552e6b0f070f3184e2e7ae34326f07ca72826b2ac22a719da5058c88692b8522069c5c51e3a4e9fe54c0b0c3c18edd6b7f39b204936dd9358bf36e5d74bffd27bdcb487732695cedcc340a2edb57c17c9af639b217e9857afc2e0abf7d49efd1665c4c5f0ca7b24d730d521e81f490edd71d8731d100b4bb1b8b7b3ba25703cfd1e31fb7992fc9e792cebe7292b9731273812ab35746f65b9080fe46426b744d648700568a5df7cfb056ef323e042f3cbf60b9718cf7f1895ecac3bcf902eeadce5674c1ae72c991a1874af63d7a781a2b11c9f452b1eb2868c8bae02a54a66fc439ab74888adf1e1c6fbdbed2498b84530cd020be646c0f5c61807f1305ce3d3c143340148cb992062720f14a6882e9cb9823ca44b673818069dbf2d318cab1860c71c853a374b723fce54413cb4fcb6ed07a292550c5eba930631453bbe87c499cbd2ef9419e75a92b1b71b31eb1ba742ca7a03934e187feb064b40657b839aa5a24a38e34d82c9012a9578a5c91d4fcb3821d2582ad63e00b2cd7fa5c1ae00971984d7e5db2491df72532fd7686950010fa219ee429b9451ad89d14524751873585697753d552d3673476305584ca4e3f9124b42db1fdc561926d24b21f8b42f06be15d338e73bcde73743ee7dae52e5e8342bd710dfcfc4112937c4abb9868330836b20a8118eb10542a7c67e8f1cbe7cdf9ead8619d110bb12a1482bc82afc28bd5622c3cc7b2b9a8a0410d7b0b7d6cd9870b9e0e834e69d4d68871c1d0bd203cef68d60402f9d74db945889da956a8e774cab9fc077bb93a2f3a35f01d4694c862145f401bb6fe3d67da2531cb1b92ae7009a69873c13d8bb48b4394539ab35976f0e75c00adc2e926174640c8de713760de911442f55ec88019152e55fefd49ef26a3acb099906c945a7a6dadd85e95be029a886c8c20138f663bb1eccb458022e9866e87bc1e20b0cc4a420e8fda6f45049a77ca5be0794c635d89c191da40ca1bbab6cfb1e2e81a8dbb235def862f5bdb86d2da249f9f687668fdf7066a6c59b4f2279cbebb58579e199324f92cb5bef3eb69b33008b6d00d776431a924551451e34bbb3d5a61c64937d7b9342d2cf612f2ac39b207e3728a655a05eec22880d9f7c135ed214cc7813d763435764e0d53549f9a831122088b64fc240c94988e61911dd6c84866fd94bde36e0ab6b4811ef5b432a7e28e9ab018ae9b51564ba0451403ce1a5bccccd9d27c84ae3f539f2577a9b5d376a2ca1a5528d9a76fba0edfc2b52462161c825788ffe4a5cb0e9993acfeae5abb43319be9ac2cc04ae0d2b409512503b1011e8c59eefb775937ba3176e09dc48441160e49a0f125a303cccbf237f0b3a6715a72cad3e207d9092ea15256146fc8bf05203b1c2ec27a39731a549069c4570eee188cebc60e9ac62caa52ab1040698d6e96ae1595c3ae6c8262d7540ad7cbe180a3e71cbf655a0c6dc924bf6ecf70dea7bb9c1f03a6de2ba53a34f0cd1bfbbfba19fa5985cd09db1d5eddddfcc8900919f419086944e99485cbd97223c4553c1159c560509002e273b7506c6dccc8369a313e5cdbf97917d317acb913915db2c5707406d44c9e8f0dee39e07bc544a9524d2e853bc8daf51272b59de194079a92d9bac510626c5d6090e42478c32c11f84c26cfaa74ad2db88649ff76c4f7dcb3debc544442694a59c54247c3c231aa1254a5a213ea50b32349de4c79810e84e86cecdccccb215f2962363a4f056cdb5cc42cbbded5fb24468c6b5fddedb89eb7fb489855976283420a16b5d48a6d5999d56e593970b8c44a7b1e10348967116297a1d1f13e5a42f13056d4a1c769cf882262ae872f8beab98f9f3d90ba5e8ab46fa4af5aa32f4838bf96041df86e873efe4c3a1976ca2574cea67a38c7f7224c079018ff2c68494587abf71a64909fc52824fe630874b699a9db4590431cc70a3e6537a3a9853059e46cc48712998b65f56a01b28b58c944668403952bf1d0183792820f96e08745a95d0455544514e74e17742ae0afabe767d690d3f878f55f436857dbd24f62d85b14ffaec047d779e427de71e1f5109a17fa9c26a4d17bcbc6ad08f786e9c46673293032feccd282ed1c4df4004e57983d495e8c870426185c368483810b4483901852089f3f49c6efba0de5716c99c6b52bbac87c449f100c0a6ad99fcca34b5c517c67f8be356cc92698b53b0f21729c4c0f56e9eef7c762315b83a940b6ffa0404729b4d5eea3c1632b4e44b945b6682ee733d60a676879770384905d409efad35958ad5ff4471d1b0a8707d57975b3a405ad6d3ffcfc96f6264b018d9857413de0594ea87f4ebd66daf22365184fe0912fd81f7073638c143a9fcb4797c8eb55cdd471ddda561725135bbde313415d93f692501427b178755eba6dda8580c9838f51b61c95a92d08f28275f4b5777890af53ad99330c43094f7348695391be43c32bf5a931231a5f59ccee8aa9c3a71758bda41996f119e968d2188b077ede61a8426ca0ba182ddee62d1c1e46317550598e626e2d3b6dea31bb9a4ed744101ec2b876ed12190b126762d8097668e9d0fda490d00a0120b417966d1a4f33bfc33a87ebf7b47ac1509614aa8221101ff50b41db0c5d27b9f5360fee143f97b0317f9912083512e919b5f186581a2a49c2ab06cb40b45d9f3f5c15a18b8545be7b6722aa2b3d06a2fd0d3264389f86e178dbe99af929b8a2bd7e9bb130220e5dc557439b42435b0cf3c7adb635581a154db92050ceb981239d5669da3cb211de265a5ae41fac769f7fb337328e17b6bff0b2fb7b69131c97fce76ab745b3da7581464800c8b696b036865fb90325c77acca8f1424bbf58f3c444ba9e5095d222be25e634b5ad81025fd061d9d5280308f2b112cf68fd160fa8dc1fd25d619967ec8c608902703ceb52c72266f4072c4715389409e63ce9652dcffd0acb625c290edf817e2debd0c9280d9b28297501656b2a149a5485c17320a85c077b9e1102c0730bb4587b0599b252ea9851ce5e22dcdb83e33241062110c8db5e5aa902b4a883f56ef316d67fee4d43e17562ba806843b18a4db8d00f1b6576b3e42988e5c6946b8e237b433a7a1676b9882dec4682459bba5e651283bbf5126e0d3b7cab5f3660efbe9e9e04e7f875f54849c4386976e51e481370ffdd1c65489ae1f91caac187b728ae638e29d792b807825d618ae06dc3115c05e479a1c56242186597635f634e20afc3a52965bba2eb1ef713c4a710ce29eedbd1112ba14ff3a5761673a6ec5ac3830126dfe3330a0e55b41171f38fdc7f7b676eb3446b77ad6cd5bd318c184ca40eba1c912a3a5a0ba7dc3053c54773f3d12bbe771f955ff039211fa089621c928e97d4255dffd8d41b067f72cc8131e1e29510cff514c5a804904cff5d38fc97054726ebb3d4db9cbf786a4af3508a1293348cd88dc07e60b8ca4a6b84bf797e749d765271535b0314a9fcb24c675afebfe0b780a7d21c289e780614cc5b27a6ee2cbfc458dd2656a89710f239bebff8640a803c5ed8d1d4cd593cbc42560d307762f29fa8b73e8b9d9399cf225dd89b8b12002c8ca74b91f854893b5895310a64db4a329c42ee7dd5a8511d270f53bd6cf609def4417a458854c4ef4be94015f1d3a6833fae48486d2199cffa30dac850700cdaa8562094c105205bb12682509e4032f86bbfb28517e4189f592f69b1159c8b7626236e18204de631b5f972003a26935ea96d5c1846ae26ac7be0ffc1e1ae5da913fc5ed21c087dd1ec4627ea060a014f37e945dd14758007e7c80574c2709cfa6a680b05eeb483737fb9bd22e205da26d981b0315204eab4ac6d778065ab6b6b51c9db9ae18edfce56ac9a49e75f87dd68b6aa5662142df3fb40b5a0f694ec09063fe33f0bad444f839af9b8bf40c64d77fc8eed11f3fdb1dc4d5a62bdd4a739da9da60267485baee1f7955721d3f22e04c75c6da9fd5057150cb3c302c382d0d5c3225c723fd06f1c6a0520fe65af175cc105b7d3a04a926c001e4c514d7a645c08e17ba81271cd11293501470870cdac8b99c61248fb4bab51a3aec6bf146a8ad9446b4bf8133afb55ec4c94636cf003abbbe068c0b48d7f978be878574d980db794d81b63c4b9b8f51aca96aa083c681fc3310e88556d0c9cd92707df9919a952ad664703f519b355065c289b567efa774443674da995ec9227525ce341f8eb2ab450c0d573298372ce82ffdade06650db26bb6c19850f2c4a3d92eef09a24b2a2a35225082890613582b2efb6508e69018ffec0451468d88e0ec62833369477f6046bb7ff7d961f746264a7896559412165122fea73ba2a004adba7da7a15ee622c0062fee00a2cd3964146ecd9a936a5f4c1a7d0d417958ff3c1e718e8d89fbd585a725121315dfa451fc6c47ad322851684c38282d1e3411c01acc95aa6373c8e9625480049952cecaea5614d1c9fb5ee125d1801f39f1c56b0336b0ce33d124811eff14b4b8446b58729bcab57b4c04bc5d87b7b5d4ddd150886f498f88348ec235c91c6f0a54860cee2fbdcb7c9563bae00ebe4c817560423ba57ed5a9885ef349a4870f98cbf609788f55d342c6db085422d9d6e1ad0a3e40834e1d9d1b108d20108eadfa93367d0c656510fb6c45b063d43622de85acefac3871f08cb1b78d230c307689bc0f8de5141082312ae82492f59d1dd346085b3cead51c62aadf4f8fe6173be0e997f4e7558b5ae6ed17bff30eed57362c4452916bda7075251ca29f682abd8d6ea471063776ca24817abb741f4a5f08b3e1aaaa851a1dcbd52cae896c3d772fd7d92815ce28b54d9c424e0a4ac731db9fed2f9cb46301cdc84bdb624827b8ac59142428f3807e9c1d3460c2a58bc6114f1cd066c451068386e2c1eaac181877e28dbc167a761a1c622f1e41a7d99df94651c518e19c53eb47960dbf292eafcba9914701b3f93e2b0a2493ff81a2091c75b2bf04f7273c94b701287495f71f1c4f00265345309fb9dc4b05023da5ca5828760c44b6e30e850f0ccbf0db252d68a950258acb18c01605ed79cb43ab05214a484c4d39de770c7fbf3f1fff186ffbf9bfe7f2ef39c32e539a3833c1258aa9186686fd00050a829b2c18cc2518e2db6b6ea8808054f00aa83d6ab882d614c8e38f1c4087c6e89881b7935ff49e45aa63bae9759eb2c2e64dccfb6f272627e025f21d10a2e014d4dcafe8657bcca45b0f9cb1145968c8b574f0a38cf1b8f5310c0a134ea499281d04ac849a8b02fa727e710439c84518b7b3294748c248717169cb5d30f81a02857e6a6c959f1deb18a72d8d5500d766cca7c2e19a149ead1a15a82e0066490df6209aad8418f09212d614e855c8565c545b61d10d3b5f47f8cc000432a7bc07208460619c7060407540c4fdcbf7f7d39770b1e07da21e64730e4a30cf91d98974f059990250dabf90bd86f39fc8813ebc9ca774c089a74ff8513aed3f790a347c0c6da6d5c5048d30aef05dcf9fa47ccc8ee88564c7ae8d3f9e96b6f26a4377f9794f2fdc922de9b9ea1af8f551a89351550dfee11cef17de002a1a574d76b49bba1f4940ae5063a552bf47935f9ca8086347045a783a63c6e6e8d2261faf6c22545e269de44ca522456692c4f9875c3de7cc607764871e141238ce5ed82c4b0c5419893e4ab99488c59a8a80ee644a994cd767d3c6499e0b7b58acc244cf59b5b1d7ee4e0730b35609e725a8902619731c0d14b03a75a899dedbd0a99eed306a40237b7398444abf976a568f3df8acb2bec31fe2ea52d90f5b2f23c45329f80e35c21a0340ce340b8c2a9faa798161753a826c6285083399d5aef2a097e1c20e7c80d6fd0f987eb734040f99995e00bcc94e234fdbceaf2e179eb37c144c51006374535a5de9ff15b6daf162b345242b972029d38de8dc5c4ea3f4ca50671db2cbad34337e9b4debe9836d1f37b3a617c336f17151270ec9f1a5d754c009f0f7a59041eeaa17352d8bc123316ac448c34157f0634a5b21a3a5ee8a4da4541cca2b0860fb14f630d792b26fe64c0375a5a7844b0ebc6685fe9e6c8026a9e67e990cbe980cddc73c0312edf4997b610c02f872c02fcb92e01dac7accc78a5242e09144db70fc8811d83eb9aa416d6ff63b323969c6c136c64a63576aeb557169d76478c72536393fabd7436811bcf8011b25bfc74924c2acd324625a4248319b8fafc10deea41e0d08c1c5ea3afd13c23816587c04995d3f12827637712f6db675ef613fc90c2fc9e48fa94841b3ddc00e83159c104b1fa7b587609fd92ada2ea8711bcd71037ac81caefd7bce0ea8300a0602023117c669e16c1af67196cb0d66037bdfeef1d67f077f4a0235d3d79f89f64e530fbc9d90bb49571df5fce58535819405bc91ad8147310c053fb92f1dbcec6e409afb14c2d0140f5e6ef0094f9ad5f9ae4a96fd6d4d103033706715c5d7791992ee78020a6f99d6bc0e483e8ea7b8b6822ee59e9b995c838de362b43fd3070e560266ec9e588eee1c58627647b1fd1c3031ab8700adb70cfcddf693c84ab22b35acb0071f80cd60455dd500b8d5226ec822ba3fe2a4ae08193eb250bfd91ca9b88a3832a8b73c653547ae5c09d0989ab23f57c00562f83ebd1055d7aec008733ad2dddc342d5ec4c345f6b45b9277852777b98e7a8088854f6d4c6e78012d9b77042b2884dd25c6cdb2e8ba36f3352ce9cdec6dbd307c18c7b3cad973f086a883e6b2d498b4d08cff18615d70cea070f42d56a33a15db2029348dcd558f1c790262bdd65e1536c07e07731a99c4ccb9af0655c2421964b7ba7963d6ef4305d4a2240161128d9ae9a1bee44284534f95bedfd16c6daeec4e14156b25a338a345a4026458379c46e8f1443ffb61ea579d3c3bc33e03a69218ba91eca20bcc0058f79f92569697ab89121ece12bd5cbf4cebd25dd019765773a73c5fdcca0a83c402c2a20833843efc9371b2ca11be868e1120a86f848816fa5ccaf1291a4afa5de8fe98ec79a07e090382eac1fce011c518def1bd2b84b719966105db38c36e5159174b0ad2b183f133df8de4174c764915ca409ede38f73a3329fc301cb60dc3dead68224bfa3136ee13cb8a700c9c9bb558f7f1fa92a19ec019a2d9d363f4d684954a4a1b862953b4220304cd0b81db9e5d4458ee6cbe914b9730b54164a0caa0c20d55c9f5b67a999b27b711ed60610fadd74bd0e2bd20fd32d5e30a0708cf3861e96eb3e2e415aec7eaaa7fe973066cd59f32da6769b2ad9e7905f9236d74bc8686aa37906a19385ec7087ffbac65ff70976ba2fc28b425c3b22c864b8a97b1c715fc92fb22cb6b24dde4654e750d373e05f71b4ad4071bd09f9f4eea704ba5c4cb8a8e907838b004bf44145248383041678794d129c70243cce5310f9df0e3dc8672b6f46e7b9c0669d9a6ef1f352d79c965a681fc18c55c44689d5e70879e065c9e19888b57404c7621847a016a0b1fe112b5386b1cd5ab807d1d129c5bb2d21b5e83ecff03f648dd00ed2063b47b53a29380c096d983c0c46e4ca8c2ef4799fdf3b2f451255712c35f255eaee43dbd2668e3ec860e05983490f881d33b001506656614946b18f5a2e21800e309b5ae3654bc521951209c64a7be81d8c38b97dfd9a96f7ab3b77a429a5ed873b0bf768ed9f9df8385ec0ccc8b3315e3057cc5659350fb3f991640c6f3b932299bcf553005c69d40fbd89080176414beca79521231e51c61221d4c9d0de5797e1fccdc34403cd308d4451716d8bb500ac626bd4e51723212cc53ca34832935d2a84c38fc808803127f29b298c10621160c25324b0f71dc01b4f40da0c390ef80ae8b86be10b9d3d9185b5d35cc39b0d6ffcf75d540490de466c25841a149a27c3eb351e3615cb87f6d145c62fbc9d4963282bedc73c6d99179b7c19299c558ac12f86749fffb38725500a35990492a138ee781763ff0294775af3ca3d6db4486110e6c03e85ee266475861b5505a215506a11176fa955d5bcbaac060e6451cfc0d97c6850ec3869ebf473b116410726670f95227ce8d199f421a4f8fca0e675dffbc3d570a804de4781042c49205877004134e81a8378b25108213128300fdb661d5918e2002566777708ca30780bd07412a1d67c14bb3d95687d183586e4ed9df979d0035d9530d21172b87933f4d95120319fb0feb19060d48009c79b2ff9ad6a091ce4a8672099ac445b0d704cd94ec9aa1c87b90b14b9233615641f450d25831647a9bcc63adb3bd9c2ea21b895ba59b4ce466b25097b4aff3616bd741aef7179b463610db8ce36fb13aa44e1a784ee845ca957c1aa22ff1432d9d26ea80e324a15416e1fe340fe46513938e70e4aa588db3366dfa99fba3fbe0160b1b1ab4d629dd284852434cc1ffd012f6686f359f996fe62c80b4ce903d359f6ec2e2350e3d068591fe3f1247c293497321a5158b98f24588c6ae35c9f59491c0f0e1f671d6ff5482f1d1fca1e1cfe8821827f5c06a67f64f1ae88c210b1bee1230bf6c8338b32431d3b5fe2a2677db0002281ebbdde8817323fa0a5e121ce6c0776f15b0e9fa52106b0a117aa8a3bb97ef5110ed63b612ba2b341700aaca8ccda5cf5825e12f4e33a2fd7405bf858eb36f9259e6eafcb5920a0e296fb5a453be8ad4ac32bd12c86a0478bf62926802b86bc6de03d3c2291abdebec840c6be41b211ab4cc33e520489a6056e1f74103d17dcaa077a321b5670e2f03f3e9423803c61b2cd4614c1f17da4100c3cbf047b573eda641f395e09ff3d3d76d880d628e95dde4d8f6a83059beed8205435ac8200700ab3e9389b841567bae15ad88c41ee5e3c815a3d49498d57a44a5d0d7ef8eceeb94ef4db5264ec5a6a86978331739a935b20b036cf35768f03ed32e216e90191eb409c92340eeaff77b4d2518dbe447621d5f4efdff99171be145a5c22968583868f6b69f96461eeef29dae47c62be7f6f4e7093eeffb8e4306831bbc35b4d05628cca458d041fad7d7499cb4de37632e10556d55f397342e07a7b1f3dfd06c323eca9d134be5cce55ddeb2530c2456eff3885de0d4161ca9422f0545a6247dbc55b01e59c44195fd1ecf6fce7ef120365dacd70a5b2b876594b9d14e028294d947c729614e469d8fc20c9ca74afe5332487e556a268898dfdd30260d2bcdbbcd9c8c3a92e7ddc58c26c0ff6fa676417035cd9b6a5d2d031a67bbe14ab599e44909b83b40a464b728fb7f93d2a1bf6bd26c887317cc77b27ff4ba5ed563c4fcf152a649a3b3261da9cfb464fd1507fff897d2acb5f097be5d10a66decd554e9436fcb43065cac339fe35a378cdc2e1a99b07642703da721280562058524d07c9096756d83c8a4239e266992a28648caf17263f8179061c09819eb659003201a9eab328f0a358e3664f94e6feffffd05836cb54fb8a3ad390bfb1892ed0e2564c7b4c70088a5ddfeeddd6f6de52a62453080831089607402e8edf1fd65cccc0f787422e16f1fde1908b18f8feb0c8c50b7cffccca450b7cff4c8f8b15f8fe19968b14f8fe191f1727f0fd332d1725f0fd332e1789f8fe99978b11f8fe19988b1070f101df3f33737188ef9fa1b9e880ef9f01725188ef9fa9cd08cd0ccd149d56a79ed3c9e7d43ab94e2f177bf8fe13ec143bcd4e27a053ed24741a3a15d1ac687a68687c685a6178e47b273a55f8fd342f1a184d8c664643a301a2a9d108d10cd114b9287e7fcdaaa6a78655e353d3aa71d5bc6a6035b19a590dad06c8451b762afbfd3535175df8fe1a211701f0fd35432eda7c7f4d918ba8efffb172f1c7f7ffe871b1e6fb7fb05ca4f9fe1f3e2e9ebeff47cbc599efffe172d1c7b7f778779977cfe1c5c2f8f7f822aa169f97d90f2fdf2364c2736328a67a794fbef7592d90f80dd8d015be4258180b67212d040a6ba150381416cdac667a6658333e33ad19d7cc6b0636139b99cdd08498a9cd08cd0ccd14ad7a583e2dd70b169bd1806a424345342b9a1e1a168d0f4dcb6d685e34309a18cd8c8646034453a311a219a229aa59d5f4d4b06a7c6a5a35ae9a570dac265633aba1d5d46a846a866a8a7eac7ef4fc60fdf0f9d1b2dd33c730fa1a24f00cfd3eec1121be0911ac543e3eb43d9d0a8990c6550344699446815c7ce1fbe61bc87790c7f986e103f0fd1bcbc518be65f8feade5e20cdfbfb95c4c7d8b42be69f8cef9aee1db86efdf6a2e0ae0fb37211707f04d80efdf8a5c1cf2fddccac5fbfd5c8f8baaef027cdff0fd5ccb459d6f1cbe73f89d988b3a7c3f3773d1002eeee0220f35170fe02202be7b7091888b09f8f6e1fb3b968b0af8fecec7c51fbebf6bb9b880efef5c2e02f1fdddcb45067c7f07733188efef622e36e0fbbb998b34343e342c9a1e9ad5a9e83474123ad54e4027da69768a9d60a7d7c9756a9d7c4eac53cf6935533433342334539b01729b19dacc6c263633f39a71cdb4667c6658333d33ab301c0a85c25a0814d2c259180bc357c8a30c21acc98761d8806d79db72846dd1806de1b12d46d896d1b664c0b614615b30605b2e605b2c605b2a605b28605d26605d24605d88b02e11b02e10b02eae075897d710d605e600eb1213c2bacc1a605d68415817200658971a10d6456801d665e807eb52a400bb63e583ddd19300bb8345c4eef0e9c1ee6821c0ee701dc0ee78f16077c076b03b6206b03b663ad81d3b76470e76070e76878edd7183dd51006b5259d3b5a6cf9a7caca945006b720dc09a5e02b026980dd614abc19a6639d644833509b126d19a52d6348335c9605f62b02f01b02f30d8171cfb12c4be00b12f37f6e505fbe2827d01807db1b12f35b7e947d9971ff6a5c6be14b94d3f8de571b23c662c0f1e21e99963f0de5405cfd06fa7181cc338c1b82f3ee019faf965c637fd3d2c95b134369aae184d588c138c3b86ae2946e8fac1d9a08e322e99260d93692203ab42f53bcab8a895b2c5f5728af917fb626b08c217b111c7c6c6c6684aedf1e3e53674b25179b61257a3fc5fe6c7ce7bbc4cd7d52aaf9296969f4609c1e35f42981f5ebec7f778f9222a6fc651fde2505a8d870faae3dcb63f5efe6259d5e00f24154c0d10df7035a8638b4fe8e3a2ccfbf8b1ebd1e2d3e273fb2bcb459930f4d1753dc2d0f512b26eff6ca3f21d431749b2abf8c7d8ce590563d96d66e85a9154210c09750c5dfe625965b2ace28c0003048ab8f4025c1ebbc8958b428505536c4c361a9080524a2901a0b821d4441b48e830a880a950e1248aed091544d890e0846ca5d14ac2cd7159d69a715d4c93cb8e63ef9e7bd975bfb1cbae3399b8706ee1f4e98151e5773e83fe4ca48d1b6d9c74d2a8e3b62fa4d7a47694d9398e63661e72d1dbb66fd9f10de98734736fe29cee2bc1d17b9649a3705ce2724b803a74970ba7128dea264036261274e83250ec324cbee4aaa60450092fabe0f169e41abb4837aeebf89f77dca687044144b62c32cd4646803c232c43d8ce3052baee58c06ebd2cc3c2558239e79c2c7cf320163a2c74328ce9c9f7da7a1cc49f411d5cfaebe83057ab11a35c823a7ce7ebd096aed2df5347de194e26b1ec04c5ee103c3e3569d4f63120c11ab5915e8d22411d49afbb35e9457f9bdbf3889955df7cf3cd49b12be813e419b54733173d2745d1295aeb54d7559f2f4408ca4455a321d451084d0aa174e8c382575550f99973c38d933fab3a17e7835ab0548144b50273ce90e39ffdcc1d27654d883929b770c6b2eb36d9b68da00e11a1390e0e0e8eb731e79c4fc453322653691222c2a269c62c84bbe6c66111a776dc0513a1d1da87bcbbfbb773ad2c5733f8ce8ea5dbbdd7a514b4e9e734c9a0763ca52b555840352122cd5dd7ddddc5702478858dce0d0b1dce95729374523adb0ad52fcb7e842085da97653f4f380d2030144aa612136a196e0201e0c8000a12444105294d4ca0dac0a86d5070826edbb66d67acbc4848e85318d4b0821320149c7850b001926ef25334bf1f2b6c2a4fb4c182328ef0a095c69f602ecb7e8e70b7cbb29f33eef8381d1c422e4b2356947c904145151c15452598d554b7bab9cf1377fc2db270b9c7f5976161c6757f93976457105df0b26c8b2ad0adbbe56f3fae1eb49f9629081546877b92e30b56823a1c16eaf8d7e9f53fa971fd519da2b92eca262b2452aebba05cdfa88cb94b3ca653d251a87fc3b4e9c063cea9a13975cf84f6657cf48881e1f162dae1c2ecded25dd29183a5aea8809f471a75dc46a7b76466fea1a2230eafb96817e78fdddddd75774b7627b44bcb16efd274968e4a272b470583aafc4999a9cf486ab9b36c9503c1f0b85001dd3d0aeaf07fde07d280446177da11e7f20375bcebd40c3d77d2080ca2ddcae4aa07ddd18dfe142f9430545568b2d8922d96a4a0d6cbb22d7ee846e956a48a234150ecc0c80ae268828adac0d110420773254780367c9ca8261ae8a0967a5c96d1e00597745946039f3bd67f524d2c973b1f624c01aae66f9506c40586cc5582db4f4d473e58182c7ce72c75fd758bdb5a20a96e4ce1daebdf5d1117bc208b214c110512de70a20661cc489e1975acdd18320d1c9881c5097290c6cfaa61347881b28adb3f3b35737b3445d77d4ae050c12c8b2856d0ca420915435988918496051090a8a688657104964f165180428a57166c94408582a22c8a5852c5f2711bee62d023854a8a21b7e1eeeb4ad6ea7759f633c50957f4b471c515fdbaa28b367245196e03329a00440613b6f0fa4b8489886b442869c1955f44a748578a5e8c47ae624a5c77943d2f254fee28930c4d69a28ed275a50965227ac5c182d665245c76628513497bc00318ac5426598374a34e79e5cb30bbf285746a74e513c1d3e268c53218c4aea4bdceb83020ba234be1919f5cf9d3dbe43623a89d13b554ab6361073938799f952a8e8ceafe09f1bd27610417c2e0b03df7498c927b1088efd993e09efe68f4feaad19cbfcd0d0402040286f4de832153064921077446a14e172661049d8ed3b56fb1832de48036b803f723520fa41f718ecaf3c69151d96366e6da4f7afe2e1cbfff3a9544f7db7ba3cfd6466d25591dbbeb3dd7b9c88454756e437ad2875aa82ea4533f412038b652c100317fe557c21054153b57d77b151fe633215530e0affce681210774be50c70b93308214761d17abf299366a9a8295952b6a4fe59773520a521ac2788883ca1a52324bc9524ac9cc2cc3dec16496cccccccccccc2c99437e29a5dc014ab2e4154c6f834928aa3f75771ab694393eddd91d8c52fdc1245407c1e8c24eb2f39d51e0b9fe6c47fed2ed920c6a7fbe02451dbffa7d3521228d239f70594a139a0997bb5bce12ccda0fda8f1a9ad3ccf5b6cf6d68edf5bacfed5f99eb913cef73dbe37adfe736e67ae0e716e67a2a9f5b1ed75ba99f5bd3f55872945a4a2d2e3b4c2f3030313d7cfc7fe1e776a3d73b7d6ee7f5686a6c6a503fd0283d4ef7382a21cb20643a89e3e7be5c76b2855608723ccbb3242047b87215134586747d724b97652f805d09ea106179ae05553edfd029be2a2afde104c3ce298bd5f11e0f8a83ca37c709d5a9fa2ddf2fc4459767d9dec5a2de6d4a61732f70dd98cbb2174091e3658e90891ccf6e23c311fc117bfc8dacca8f9e64c7f955abf20cfacacacae7c0772584dd952f72a51d5fc58e72943fb2de7f2ab6c8052d12572a41af17ca306490d10ff1d137f703cbeb0899c8f12c447284ef365d67fd59feca7716cb2ada4a7351be98ddd18ffca54c064297653200bab4cb321990e006e1e2c73d0e4309c245264420b108fa4248c5647b11481d14c18a958a8911dc6fdf4fc40fa3ffe8e58f4ad0911582c3a4fa8f7ec451826af1fdb45a804380b6e7551fa52b3fe78a65b6b1016de78d5ecad0a911e9fd19943e7adf41268e38e2b8231c221ad541a471b95088dddca8230315411b19caed97ce8333a451fd3f744aa5e776d795ea5877e4275dd2e97600433217f8dcc62162c9ae20925d41f45786e4042d9f4e4fc198e46d31fa05d91a89e1f1698481769b4ba386b5532bdfef499dfa2070ef9e70574223bce7ebf5b00c87154f58c9ebcd1f56d43174fd7071c1a87ef0995332aefa35409cf3b5f8d070ef96f432ae3622c34573d6473474f5f7adae7f0edad1ef168ed4081d8d2018ba3c9e35c25f5ed3f7b03309758c7175ef992ced2e835d486921ec52200aa551ed44fd1edf1ed4237ce1fbd18fdeef94ba72afac52cc7dc8bc8ae7c31ef1b1e33d1f3e7cecb0324b7c5815958c3d22f3929171f9b02b2a9cdb03c7e5dba5e565663ee6b749b9128395db593a823a863d7c8463748a9483dff93c7c38e7e30103bfdc33a778b456fe65c639cee30a261fced9ded552fa91c7153ca685070c9c470bd4f1238f2d74b024cb8f3cb6b8397eb3342ebe89711c19d7adaccfea60f14d97627c430222d52c49c892d46854d348ab95211a6d686885b6a206e7c8db3fab50473faed05cec2833bbfd2d76acb76447d701561607640e96d0357a8b0f3572c7169fb193711997cc129537aa4c93462961ffa51553c218d22b31a863485add91d2c2259df2bb813f42033c468c1928020317b0400528300109101101083c60080708d180201800c4027e50800f0920d203020ec0c30e06d06127071c746e2880ea864308300001d850430e0d42c4d40c32c4100018708200b979c1ca20e102006c7c5aae17ec47ccc50e7cff8f998b1ef8fed0c539fe3df2b8c26d1e57e0203476e64fd6c7ffb0345f634f6f637f3ccad6bc0bd6e60160518f8405c0cb5817deadcaed803d22e3c9581faa4fe5f52763415595b12a2a0fd823d5a767e8f74065ada8bc982531af185716ea18e37a7b4489e7c06fc026f147d80d3c8f3de23560ff47cbf346580d7c1176fc0c5823fe02b688c780cdc057c05ee02d6031f013b015780a580b3c1176022f014b81878025e2236025f0435808fc036c045e083bc43bc03ee083b0427c03ac031e081bc433c036e07bd899ffc102f10bb00c781fec0faf00bb8027627df80458053c022c91efc126e079b008f803d81ede009687dfc11ee077ac01be03d6c7eb6077781ceccee76075f81b2c0eaf63737895bde10b60753eb4aabfb6004f001bfe107b5f0096003f003be46bb002781bec009e065bc3e7581b5eb434bc109bf33358f15356c8c7606778196cea61b0317c00ac0c1fc4c2f03836007f63833c108bf3d6defc0b16c82361edcbd8172616ea18e38a71b9d8e3fb635e31b04e7985f50cfd49d8fa729b7ec5b8625c314b42978b1bf8fef015c25c3ce2fbc3988b1af8fe70e622cff78734178df8fe305d12db21e98ef474ac46f9c05ea655b72a2da9a3f77a3501572f3402a2f0f8348235afb277b22b49b4018c24289c74e60673a02fe5b6f546aaa6da712412c916517992eb48a4f7b6cf1651c9e724d77deddb4ea37e43fdb66d6347db98773a2587d016e7702f651552f64cbecb2331744b69e1a5b4e87995f793c4513a7b4257b4412dbcf7b6cfb345540c6eafeae813ea2b4a39aefbb4207d678ba83cf0235998f9ac2aa2f22c8cf49ef8c02aefa525e23dc9c2f893be884a5a9c9ea1dfed0fde9384f830ad83f273bddb3f5a21697154fb49721b045263e8b61677ec8a6ed79cfcd8e08ea3233e2508d4a91184020675aa9bb83d41289d8a92ea02b0943b8409574a2923cdae2cd5ae64669e49714bac2bc71c4cb83247ed4ac915805355703eaed71f68e40c8fd6812be99b9dcdf7e86c56464837ba6dde795e371a798ecfb3303f78fffd1732e1859ddbc82fa2f2be6f7377777003c139e7749fd3dde7f469bfcfedecda664a3048766556bf19a8439f346ad6d166970625a8679cc31d5047f38ee6eef66b99ded2d2d2d2925b4824b016840973ce39e21b9eb3e31b0e856e14ad2640dda97ba468c30c2fd8f0f83d8e0195edde6d4c28c731e9ba6e34a294524a3f8f524a2908aaa8544a29a5254a698c49878e5249967474b2a5fb799a14bb4674112a4116e8d08315b03194852b8a15391823084734a9c2118af022128202073945e0020a0f9a60218692243c09a316049bd10381278c14cc645f14ad618331808a68d083042f07befd2225900b01d49152d62e354af685901bc199516f727f7f3703e76b9b86f9c261526743a37ae84d51fd3f97350ccf9399fef5c64db7f249f249a3f97da4cffbc0397e3a2b2aa0bbfbec6a8e39e79c639d3a3eb72550c7ed686ae17671912e54a5e6d0e1f29540b9a3861423c5482cf05cca9eddcdcfdddf3d6479cba4db06eafcb80fc7aa946e73ebe6d7baf239ae54aaa65aedbaeedb5c3131a6171a71f75e7f0dea74f2495ef749e9ee2e59524a77777777e9d2634929dddddddda54b29dddddddda5cb5a59587248777777f79fd265c83fc4db8e3cdbebbecc1bde1452cab652498b34c49448228f5c675d7f9e1f2a89e8d40daebc3b51845cecde9f871d3847bebf0e5cc3f6fe3b9cd3ee2fc4c52e44e20659c3166680834c23f826092e827360ae3f129c339f301216c137b22a7fbbcdd31689327c87b9f1a544c21d2ec245efbdbbb00b67655d9ee1a4c031dd46cda210125d65fa2acb11700f0bdf34c7f16c2bdfa871c7189917417734c5f0c7d255cee16b622b3c1e3880e1415d19e22c67244a299d2fda4265e8c3c7ab7559e6c513182ecbba605d0e48da1992a4a41a6969714ebf735fa2c9df6c8338b8dc91646485c637de8fd4c8ca8a6f483c6a95b3251aad45a2ad9c71bdb6ae7fd7d2ba2e8d5c971746871e617668b9f3bb3b8e45ee6a93e138bdb8f2473b449d9852d41354f9b363e6be0dccc21d9999b9fb3999d9755c237cbafb646666eefb974952e5b304afc0ee6117854927654d8a444a23bc3129a593521ace39c5a493ba31e91493524a279d534c15d2a80a8f9959b664fb9cf3a373a2208a2adf03bbae0b87786c8817a173b17b1f4da3c9393af449dec7dd574b3ca5cee9bcc1ee6c96878ffec7a8af1b7d226e68d4a4027490692330d6a8928f784bcb8a73fc9be6ab2273d48d3a20f0ca0ac76d1cb76d5bd7bd3143d9978a60d4f99c6934e1f169e45ab7719ce5e2f632dc66446014bfb75cdc62fe04a736da1a0cc7eddf622e6e406ed39b50a33622706a9b02506c0dd6c16d87b1df8045ae391f1edc666d4260dd0672d1cd38c26d2087b914ea6ae5d7e1af9c5d67bd530af526d43db73558a41b1ca016266fb4712a1eb6ecac16dcd2613d0ee35adc14888888888888888888888888888888888888888888888888888888888888888888888888e65bc1eb46dd88c335c98a0d758be6c18133724db26243ddf2e0c019b92659b1210f0e0f0e0f0e9cd8a4936b92359d6b707477370e1cddddddc1ecf0ddfeee8e1db8fde3eea12369d426c37777ca73d6ba32fd89cba23fc1365dc7f9138cea2c702af49986ee3f7dba74779f2418b5dec337fc9e53ca734e76fa1c52ca048d0a5532abb0ba1dd7b9a909ac68c3dddddde51a2e4bb677777777a75b28a7505dae739cbb4bd1c61ad2c5c5e9aaa5f4586b1d2b0dbbe6c2722b464deb540fe740912dbfd5b8520a91e18e3b435a4bb221c1d98ea0a6bc1ab7db9334aa4767b55c5a0375e8ebbef9745e1a55b274b9bee386b68131a3599ea4c5ed67f3f162f319b58086d029a750ead8ac6675924fae58ae3f77ab09189b4bb5705dfa25195c4affd429bea6196861064377acbfc5136c7c9f154f58d1460ec9f24477446c649228ea281c54bf5e2c7963cadf12ff9874a3d1649e22aaa85fd7c6ab6bb08cdac508eac842b28b2290e8827366a9f2340a091f2128212fc42424844e7665481e5a44a5461b86746af4fc37eccc8df4425adc897941b63c94cca312f3763f1a3dd73b1a3ddb24f85bd21f171e8a8daec1910a6a49b6641975942d2c8cd4918b24163c9258700ec734ca746254f73b2e2e81ba5d105e833bf8e57e091e7de1c845435cda51269678a216fd27472990cccc93528962979452bee1a6e0e54c917bff8ec5ed3dacee9b6df7144b672a2553db4d77774abdf09a3223e195e526a1a85fa3022698a529d7f4a7ed8d3b3e8e0ebe2b793700fc7c6635d552ad4b682648e14eb66061e1fc0d5abc1107157c88a0021e389164065c12304a6085ada8045310630953e288020b1f38093a49eb04a5ebeee4064e5870bdcb322741f848204e55c90955fe28c3e5cee5103a56741105106600451a2b3fd24fc0dc90022382a9319348648f8442229982e71b95e0be9e0f8a0f4918a3087479680f0d2c1a90d0d043c3096860d1c0f24625dabb0e7647298334b9ed61c8204d65f7352d226587138ceef3a2aa14d539594e5b6a147f5ed4d1c4301c5e5761993ae5612c0aefa52d7259f2e479e41ba6df935c975d96419afd79037598d26e4a7f486f019041d8caf7248d92b48827613ae5b3bc736ac193d496e03975008c5047067241ad0a3e313333bb337d670e479e4f864619a18e1dca24637e4aa742c2aeb73269a951fd813ac6dcbe25194608bbd3ce225414d4f1a53cf594cd85c792467d660961a4f724cf76dd245aab7537f539e766e553ba49e948c625da0430403021a5f052794f7a27a48a8910df935eaa421820432a26800ca93aee8dface3ac363961f880113c375592686cfbdb92c0b43e85616ee5a8e46a32f7297b89d1d658c932a0ba376b922b7ad127eb9504a3b4a24e3127732d7ae02291b24a34ac9b5a7c6ccc548efc713ea8e56a42907fa75a9c97576ee807367ccac8e9ef4dc8f401d8e0379287247ef791f773beffb1adc01673e377a1eddd3397f8775e19bf9d2966490f99be5f992c32f87914e174ea7e1178ee444e2832a654f6629e7c6ffb951e9cae4e74aa55aedbaaf73c5c4f09bdce7f2e74695eff5d7dff3af7c6eac803534b951c76feeb827aa0c2b4b8ed0db9b25cb8fa1d26536f4b9e06bb5bed6f67c1a597a9f0beab66ddb36b76fcb43a3dcf37e5aef6bdfc9440d2719c47f86e30736961cffb52a372a071bb55b6ff75eb76c57c9f13247c87cc3729235dc80eaee4ad881271007e7c14db5763c5b6514c14d826ffc49b33a7fe4d9c7b38de704b343bddcd7cbf9f644a9d4f249eb02eab07c199248d0e291ed9d78d51632a1cf743aa5d4bbdb89253fd785cbb2357ed29ecb4ddb1541d2a8d95df7fc908c4a7093fef8f55c6f9f3d7c50c820fef47300e783de811cf8ce3007be1e72d26fc0bd13afe242269bcb22ee489fc7d41bddbe9f2a7f88d7d5386ff395ee9cbb8be04e6959f7199c52064172e54f97cf600f7d024b879eb42855fc2de145588d924970b79f9fe7141e9f2cc783735d722fbf7bb747e05c2e1c712ef76cf983f93eef512ffc0e912086d8624e9020b9e1f324f8de370ad529ee7bf4a0ad6dc3bd643be2426a3ba652f4e067cae51efcb0725cee010ba67051147359c6c508ee929fcb322e5a3a2ecb96f45cd992594cc6647547efc5b22545d78b7932273050e3b2131848b9a274d282315230e5fe65274986aeb77284097d275e05e4f93482abdbff43a37a76f5070e9ade9c3b9e0d406cd7d333f4975c75f5ea1f29a594524aea79d39bdef4e6ec1f6f25b0466d636caeadc9e66a5407cdcca021250cc7b0f6c9bf9256a7646496f8f011d4a3c74f4c0c141818190f1e519abcbc2831999eecd821c5c5658c961624a5d28f0e1d5072e448c2c2b2a4d6262b2b414077274876411df087f4b7a48e1c1127c4a9714ba69f9d1273769513626ee8965151efb91ad54b622419e9456ad24d6ac2a48ede6bc4f9d4b8ede352c324a50675e741b93d7a4f6e8f9eeb76d79eecb6e7ead4e8f92c19492c25a426a4216f8c298dea55a3fe84d37d3ca6cbdd67e2d114493a3285e6688c3982098d6052eaf7601a75bee7f17c4a5c96df6528b7a350697eda71e4536b547b526ebf47f3a000b14d00f920409e8300010204083310205ed06d8fe641a1b16317bbfd2a4bea2c09532e2949a7466e8cdb2e543872413e9d621913daed5fdd71ebf15e36c81a522ccee11e56758a2fabf8927a3887893eda48c99dd2e2541d19fd78e1d83d91dd5192d17b3189dd9bcb3226acebe0f750eee947efd51de914ede91445d229173af5c237b7e7d13cb7486275349009f5e689348abfe625a873136e5ba83fe4c72da16013eacd0be15c3a37e10b2e58120b00e168b209598efacfdad8489b90396442823e340f28dbffc38e1cabb163f7e4f6d3d8b16b72fb4f763596ac4fa3ba05d4a92ec2e53b6377d0000a0a42a3d6a98672f98676078d1a1a52d09002eb5413e1f2b576270a6c8c31669dea215cbe6f77a2cc9e3c6975aacfb87c65ec4e94961225ae4e35edf2f56177a2b8962c01ea549b71f9f6b03b518082827c3ad542b87c63ec4e149f9f1f5aa73a08972f8cdd8942830225d6a97e72f9f2b03b516232599457a71a0897ef8bdd89f28ad2244a9356a7fa0797afc9ee04b594289975aa7d70f9eeb03b41b3274f6a9dead9e5eb6277826a52a4c03ad53db87c5bec4e106c8c317a3ad54e2edf92dd09ea4182c4a7535dc6e5abc3ee04f9fcfcd03ad5b2cb3787dd09a24181c2ea54f3e0f265b13b41ac24495c9d6a322edf6a77825c4b96bc3ad53bb87c57ec4ed0ab4913a04e75ecf255b13b414041413b41b14eb50e2e5fd0ee04c582649c03ee04c9f886ef902ec3044deec8f56c435b11b7bad4e54d661ecf7b69c7ef7adecfc96a5423a95197924e0a958663cf7a5c5fd4958b5e54d46aefe58523cff57e5acf8349c92f7be0b0eba1b65bcd1f3b0f66794ab26b424340d264a2af693dd8fc26b51fd6ad3a357a0fecfbe62ff4602f93c7ee12d6299e3d2e7e4b9a67cfedafe85bd26237a5bf968b9d3c5274254bb286bce78eddea08a9352aa22bc9069c40a884ac37763dc914a2111900080008007315000020100a0704628140208e5435d73e14000b789a4a7048198b634110e43008a218c620040c008018600c02c8304353260022f6bc1cbff12752177aa43623b73d4270595ecae83cd1726bf84757828de109fae3cd6b64b4f95bdac172afeef25a32829c0c5660bdad01bb2a82753351f29433d2196e0acc97285067e04d56d79d358452ca357e921c1bf52701c33d250b7ebbee6ba84760dd9ccefdd799c053be78f8108124fd1246e8d9ebac0463dd9914edf63a4cfb6d0868f5a99c8ffe6fe20b153b23b1c72c772edafc68af040c644fe9ab5682d6d71dda2bea4f1b378e9786910c6957070fa51a896abf0edef4bb4a6b5d5b8d236631177dbdb255d394fbce2d424420d5d50849aa5afbccd911219b6aa5fcc899790834e96f1099ac025558cfe7c12a50b54e1f0dc37ae6437783549f0925231ba7105b8ddf061f07e68f3ca88e1617bbd78af13f8afae3d21f5420727cf96d302d8dbd8af00ca2928bd82816dfa18d1b306e3a1ac421622ef673c8a2e20b5e80181d6ade18633d58c8be2edcd01583b1aea96d4bc317e933cddab1ecf03b0404227488ed2f7711980e43c3505cf212c86e17f95c3ba12c285f4fe4ea56bfe44eb8e00567cba913d7a83f2309de4b948f0e0bfdf30775f7665131d9c4c0d521a4512c7c4010d11532d9185325c7a4ae6aabb3c20f7b62614a833014a9c29e93b6b20ad27e8370e85441e74082f7fb48a2d0f044cebf86497b22121702f4cd10157d87452eb4cad97f7d3405643c0a36ea7250e23582f41dee93a82272a0dabe473cec2378c2a143f9ad40afdeba9fcb91ec29c81923acc3c701b06059e4f107e333e61a42fd45fc33ef9d16bcffe5fdff2ecc0b78d3e31f6d5a4e47e286cbcde953fde50099a1d2ccfa0b2be6c8fd5124fe5c43c8e70596c68dc9fdc9b284654e8a30eb7694863881246342d20c1ef8e4f1ee8c5d202f6d4c8f009e936f6eb1e2c73491225e68d4b091710448103109c6a1f12d0b9fafdd84e51f5040052134f4b1e9ab0836cb58e83a14fe193f963a55169b646f94ec20cf7f004cbe874ee8dfc3cf7894da5c1b69995c8234f98899b907a357266c510341570ab910f07441672fe20a6247bc7f93ec3d5581fde8d14a8d005c419962fbd0c42a6b6f3e7c46746dc4cd55c2553fd5b2d472e596981d58be2120f82320e3087d1cf6fe5cdcb4b13d7adce06784cc29aebfceb933945a304ed5f3fd2a16f727e90763bcfe9b6e002acc370743892c5929a8f7a4b07a26326d09a7cdde92dd66deeb099259d98c6fd2aa3974fe43d1263ddf080c0240442acf8a8c68b77fbed294769f09219dd1291f1be5a2f9c56d6ad2ad5650cae1631fdde452949c79faa5235abde114381d71bc85be059a4420ed1e92957045f284ec1f8dbc61aeb26125b8326756ed2f5619a9551144db7bd5d19ba3103af16e6658ab42153963de07d1ec18ff3300d465fe025c013465f04ff084379f07a16bc04ca1d3881d3590954b0a3b4dea638fb185dbae30c8f0f0d839e71a263f989154c8a162754675a670c650c485d9cb0a3de376b77e2639b07be46cd4976d9530bed94b7818362522a9bc8d4425eba791214a121e83e24c82874bdc1a6c4904806225434ca8dae69046e2d617c94ef4515511cc9af2b8d4fe6fe06364c1eb7c38a04f7a2432354cb99433842d4bfbbb333d8788bd5bfbf3779154529b99171dd3dc0d9b3c72ea00d1925dae2d857b5e826451fb18a83a458c60f3b5205717d0a013d40bb996257dad2ab0ea1ee5b8c8ca35f0452d390ea7fff8af1ee2cdb7a5fbd7a370babe98189b36bc5df8bb5a73a42ec0c58ce1cb0c07cceb3a7d6208315558a569731e076ea261e333d5f3799ab3311337f1539abdec72f47d0a748030c78359a00c8da1536d1ea099a9ab54017faaa8292820c97306ec63bdd6c470c9b632639d039d2c9e02900fc476e02e854046d466b4f36f62ded599afbe74161a64c261467364f93ea8582ce45b9383a82b8670c0bcbd1c4b91d3efb22ef7f46a088a4a4b77101f51a1a01917306bbaafb8060002e50323a041964e97e415cbbbfb7312405ed281ceb15678d23e8f964f0a92be1caf2428dcf9421e526fa7b07ee8d1bbcb4141e7d16cfed5c79975a737dd16306929af90a8043f49d4f3f21858964eb0b1696b36ee96019b11ac7900c956533c2a3aed143c8886e2f44512b640f70bdc27715c827e939d9d10d3c1c15e7c290c14f8301e2c3d50641dfc5312f9ac0e7d3d4f713c1f0695cd67c11f00eb07c6ad06702fc34d78199daff51c5f13716f6e715d640bd2d460c0f7f46a7b8ca6393428e0aa6abd1c6293ec5fadd9fcdf32a9a0d0fed8c3c927671ab0b51bdfed4dccd7ce263a01c02a6b3ab167771eec099081fdb2b133f40e3bf33f7f8bb7efbd788e5e59ac7f61894a54edca4afb0aee95aa0031c73139534bc132e151c0e47a862f661d6297accf4eba38f82bf554e5839d9e84fc9b9f3235d5ca1e7c6291e8c2ee2bf1c88122aef5471b6df94672d865ec7a609c514b9ad4520653aabdea8e929e689a6f5d0a31f2f92ea0e69bf17e03da7c1cef5782ca17e3fc36287c6bdc2f839a8fc6f84bd0f0cdd8bf01353ee4b1e0ef05b508a32c5a40bfbea82844e4358aa03022d72b12e5885e5b112923c27545a70851e91aaf2814235e88da2fd6817df3974c9f6ab74499ba40d4ef4b7b3d7a32451d8dcacd34d6c7075c184a77c5eebacad4d4a5e461a13d1a06e0ec079e3db4be8ac235fccc5871baf8051cbae41d3d1df388dc8239c3d83233c7841b1111b1f5f65734c3110e66b0c85f9d557f1b761def57347488f227d8cccdbe4d26b256e711ecd3b4a89008ffa7244cd49c9e9213c056fb46d4d156c49bca491e793660d626856c76ec98bb3b28a96fc5cd8b8ca4dbc2a75ca03f1189bee5c221da6331cf05b6cfdefcfc1a69063a081192f0d2a837f442a5490ffd944ad65b453a8925435259be9b19903e8a6b9f8873672389a02508fa16f62c57a4354ec22c64d7dcc072e5aaebff9623c9bf2b60ff2790f21ecd2eb08f92c1937678052d0e9803bcef244a893696aadeb0b10105db9b47e63e9cee2a1fec2d81461009f77703d99ce3166dc4cb92d5b0fed068bc873ec12cf7e428aa7760f6536e154244b2ea2d1376aaf65fcefcdf51f897453dbff65fe868a675288a19e1ccbc7181821036a49ad0b1e573cb04a75bde6dc11a2e15eb5df3c191c0a16c544d2081b81e3d19d4264b9bfeff91691e1ce5a85d9da9d514e7a0892b75d3942a74c8605c763f4d5e62b006d851b3d33d3ad55608ab97f013adbec43ae1a3f44df0a2afabf2f735ef7f15a484d79d67b7e118ce1100077fcab3be464bed6bfd2f04216c3f0099a3e5bed805aae64937f4f08e47d05037d134cfb1c33d7cc50659f698a7bef4efa61b5ad33a8b89996b215216ee666deeae40db14f61b439bfddb9db4100f12685a18d8848ad09f76f87eecb55727bd800dd9b6c9cf5b402e8744843ddcd3a68e96ed6c66844803a50e0193c526afceabcc14c040d5934e5cb3553b878aab114c0416be450fa3b7f17c72a98f226909c06af8eb1393b34385be6568ebce082cf34ddeb5158c5e1a56c2128bf04d870da76e7d0280816f08b9d2427ec6174b6bc3d2b24fe391a548c67fea7964b521757f15a3005e0ab2ff7aacf477b91ae9205300468d061bc1f137970855faae974a9f301edcfd12ec0d093cc046715a3af5df6fb37f215d52477170d954e801f1ec63ee612c80749ab45b55c11e60186b04b9810402417db14481e552111992be1b8716f6adbd170dfe53c5f18fe91714b78a680c742d5fb517cb7247a71f9282cefcf75cc8fb5a29de817b0f5d0efe2cf95061a980c29f4ebdcb3d024e4df0b6b08d5b28019e289634a99bf85d87fbe6a252371d320a6d7d6889a529b4c9d2240c6daed9876a02c1d4e1b19b15afd0c680677950889d4d074c001536188229a5ffb868b2bc5f3836521270db06a507dbc9c31e78bdf1daeb3a6f847b9dfe81106bd632315ad30e0ce089f22e088d2c91ab3fdb0def6941fa1f87f87b87f77b57a9c41d873b0f03af7c7d3039d56c64a037bc91241e5b5422dd4279e2b19e6ccb7dccbe7a60ab361a871b97879fcde4dcf0c6b4131613c5b5930c5e982d47a8e2320168cad7cec052964b270bf756f90ef6785febebe584d4e0fb840c6d1e58fb6cd879128213332c2ce5b532acf08ab7d6204155089ec740bb4b6bdda4b614e24ecd6a4ff05e320d3adbd650d6e25d1a1276282e8923207d928528c89b8c611cbcf0b2fd9bbe8a1660e4968b4479cffbf594e7cf44c4bc29a06513f62a3d0396057586ea011ccd4294277536139528aca53f18ad770b5553697000a4cfe2f944c15fbc16dffd181ee3f21f5f50176be663c045385a13c07a7e8e06806e9d0b011de229286072eb477b01b9fc191b60323caf07f00e8e2302ddc68925003a3d4f0ae06ececb02adcd1930603a3fef0c606fce73038dc1893a30b2f78c826a5352f5e203cac93cfb19c442f75c667bc6c49aa004e381338c7eb01ec08590b0483aa2c5361a9de330e685412a3f31391d0ae843d44680cb1ff5033649ae07f3e92972fc00bd1d6de4e0ad4eaccc530b4b3249e7bf142af67e1dc361ecddc54886ca196e514e00219b11e6822ab5044e4f538883330147fa5d061796ed66338df7093e62755ea2b400a04897b14868e0b3e250d63845e4a58e9ae7ee6e7cf3e955630932209295f0f1c75f18c20beeafd307fa623a397d90c457e47302164d32cbbceff81ddb93111095ba7a93da9b2874ff725ddfaf44350fdf4c962c88eca40919aef636cc17fc756e291ccdc067005a0140d4148715345d56fb62fe3f6d1f5f26d4396999bc5301e90f38cdd4c983b8c58dcf95fc0e54930325f69a2d5f3201010d370c5226cbd8f1ffa8fd862d1765f2ac53ae6160452a8579b4173732106572efd027f0ac6d86c5c04874a3b92d8549a35285e2399192b424440f2db7564f9d4d8eebc6ce7880cd22a4fd81d22aaf5bfcdfc6bb2a806d76ea8803ef1407d125ee082c81faa1d32dd9f5935b03e55cfe5e1eb136b7c0bf40f45aa96e1ceacd6b658ccc1e9b3ba7d70f3fe28ef168f722d84835b75f4edb38039d1f9fa00bbc4e8b4885b2b26f9c3a65110f5243a7b5add2cb1edc2769f7e170605ee9d0599d50966030121da76c77e31d81e5ba18c41a8b8d74ab85a5b41195018efab65a43af449e0e4398e3988a50894128d5f07781fc1297b84cae009631236cb3dbf95fcf5379028671ba7f283ea3df8cb2745b8d0929865a9e91c5e0ce2816e40a468637ecca686cb91b0005e60cdb58c5be6040ebe497b90a9a8b56b506140f3ab8bc7d0b3ada7d508eb40b6853c365db80dc2d4e40d3a847e48e811ec2533d20d264f0bc4aa40e4515d22b6bc57041cb9a5b089ba9789f7887792f825653dd97b9a6413273314927421230cf0c8cfa56c7fa138e618d3b25fa34778d44247133f30db95f4bf933620d67869d322306f88c78c39920e7ccc4003f33d2f0cc7fa8ea07eeee4ca916334c60cf881d3b73d6c28c33c033e2c7ce94b4317306f4ccc8b13327adc44ce5f4210669324298556e44486dbf7e411439c0f38db806da858a4ef0d6f060b35e66674ee4dd99edfa403842b3b4a134cce22b5cf4531165024beaed6806a6ce850d83e010c476d04ebf0b530f00adafef4d7f7fec591da811ff1807c4953590233882da7a73cdc386dd34e2fc5b9092fdabd860ace2800c169a73130a9457b184b9f905f98f06a20112822f745900032d959a1d14bed30d6608712a3cf87be6542b2e8a5684da70800ac2c18a09c21159e80b7a5c5579b2985c2f6f0d759b436cada8856d6ee76299b3215b7f9e3c11988e06192a62364c46e4ba314e81afd7372167748f95a2905a8f0bb100209e0725935dcc9f9ebd7e532c32f9048b00dd6c63a906352ba1b77c9c42c1852c1304fb7513e83e2d4c7348a019f3854b80f4b8df30c58aa7f4a0bce59ceebbbc5f423b240973edaeca54781f6c9620a58cd3042fb8acc5c2e2dddfe5a009b0e8a5a6218302e37e841a5cd036621d6f1128e024e0123aab3ccbe0ced9c74a0ff3db9258f34c77e4b8885a206294321c3de8b70f646a95c15204df203f3263f2ecddd7a0ecd29ed746e503f67fadff19a7c0d5746259f4c83070bb0bc85fad63b9c09b95d3acbea17f01d7ac416f0936a1d5a18f9e8a7d6e4047780ef047b708b3a472087a1dfda407e8237f0a9de28a6bcfa18e9b28c1dc29b27108defc47beb024b84ba02cffcf7ed0c4091abe657d30edeb378d42369dd1c40ea48ce45250d06cd93eb5ffd64467f0843cc76573137f6ceff412d4ce8116dae0e926b02e42c58caf3ee6b9f0c9dca32ed1d768ffe5a450f3668f4f55fd24995294d887af7a21a8b153c8bc66d59040105c3a78cf1db2c15cb87a1635ae865c8d4efc85ab3cd7c7c402bf3fef49e76a5cdeaaff1e019dc739d4b4571d26bb2712437622cc9442fbc74341c12d48f6eaf5be831ab3c810ac13ba5bef1b3a2eaf6017f456906857f747cac2683752c493bf0ebad19116a0c736fd475c039b513f043865369c6d38d42229341cc19356a0fd8638825ee6eba4ebf183127f1be82bf8e757f1af293f3595330940401f79c7880819b6d819f61ec23df8d5a1a5af5a784b1c388ec9f8e1a98e5e2268b33fe4f7f6f7eddb155c246bd5bb0bcd82705014ecc762570624861a742d1f5c06dd0b47457fa69da826804bad756ebe54459c453c965c365fea70d75366920b912b191263c5b0014dfa22d6ea03e8ec26f8a522af4f9832825a3124c9435a4d57ff4a41d168ae0492fff52a3ba497c0cf861fad8c2df24e93a4bd0d46038c0ac9ce595eccaa8367f1f8270a7d2a2fe410b427859e2a33d544f7f0b6a2f7f5cf94beefb8aa93d5f386792ab2ee71965c27df5f9a7b6e5a1580ee4c146611fa9f37127c7e610cada7b5139435e787d7d4cfbcd0f1d65f15babf5f7fde82e4b6e78a0ba37eb501941942efba8261fd075a67d74fd8617704d34699ae88b28070743634c7d50194f838e3c691ef51644b16d61c7a27fcfc279436e409e9894f7fee65192cad5e6109d1f1ab34b686ba826758171b5403273f5a6d358885c056ee418b65c8f82a3d1d3293d061c05a6f386b51bc2c0c2f32f4b976e26c316e6f4a3d6f03a9f03da7633a93deaa906259ed45bc5541bfcec4e77e9f41cb2333386403e8f0a08690e77072d5b33f52212db7239c7a98e0cfbec652f20f76ba1a2b0caf5b6568f85edb7c1a18a4ed6597b15e2308e32012654eda6006b280521d581869695f4185376e3af3fc19af75d36bd28ffef27a716f6c7a3e69842821ea4bb8c94ae1f5761186536339cecddb87d55ebbd7eede410cf3276ad19fb319ee24c664438ec53ac5ff7ea535d2ec042eafe783a4a0327a6524de5abfa5b21d42791a7de65d7c7d853b61e935771bf3903f679f295b98aafc598ecde32bb330877c308e2215176d9d6fca5f9a8b6c0041f540cc7ec925ff761854511cebda42178e07c8477fcccadd3234aa72397bf468ba78c3991c93e248dfff503e018297e5ab9a81e3722a4afa6c5897484364c87e85d29b00189bf4e9980b80bcc7e866060e5debb5f4d414da75c75470d9784d272431ed008d0d19441087ac4de0408360f546df71c59b7c14ebae2b47bea32d87099a9a9c3d84d876eb8a4bcf330a593b966008df0305f91af33918812c5b47d09f8b0c4b2cf5ac897c7723f394642d108e48e4641c3c7cdc12fb2762d8b361fc0ccc5c8690a77b52c0ca804820c9fee06305d8dbb7aa34f55a3423ef02a27f3c5a8021ce3c29e26c6bd0bf7930e861a93d3504f5f828661e3b20b51ae5be06853bab2f1f77d4b668e88fd6dac7f17f5492b309fac76b6de658ebd394dd862fc7384371c606d9747e655cd4db1775a6626c0d27d9dea0fa68e46edcbdde1474f381ee77aedd899bd657430ce2af23146dddcc3fdca4b0c11fda79bea81543cf219fa635bd305fe9f3d9038e3b96ad39f07b0883ba7e0a632c34bd846ae9ff8c576944956d76dc8af4e948d3f20379a3950fc8e16a1aa9e686c12035bd765167b29a07d2b9b03bd45799140425f5fcba401d34ab7078a8363db655aa4d12a455dd2691307bb2f5b8492746554dbe73eb2feb6ece1b1bb06439992beaf2b6bca8c2dd3b58b0921e847d2cf3f953c7874588c0c16fd97b061dc83ce40c93064bb64fbe3346fdd1f73838d2367ba0e928c4d4a44ee09959bf200d86f98c61cd85326011bf4fabf69409d568eb59acf05c7c9294f9588b18568813624e9c98f19ba15af6f8fa9c7be3ef9cbb6e57d14745c68a4d731e772b161cd8163fa97dc2dc0aec15ced96b06670a701d0ef7e129807ac0058e792def87b23582a58bdbc77749d97d2c3eb9714f957be0904dbab6d632146c26e1a1b519d5861956e5b4d1f08d5eba89967bcf72623855f1c9be1c29ac01176804899359d5b608000518c5556ab74e6f8ce8a1c93e9ee781f05632914fd0be2ed4797176f7f66b41b0eac32cd5550d34609544b36255ee015353daca301e4d70e859aaaed7c0a4c6da3c1ca8f290baa17a15730f33705098727e834d27ccb40bd7b8a0e1ac7ee9596672fb7321fe16b4cc0fe71db39ad7b27aa3a049eba7e0974bca1f3476e5950a155624c4049b788310333b4b52ecaa00043af655f7c4af1c08eea3fd785c04a95acba2c9975dd4d0a56eb29a6cbb18d88117232cdab75f7e6dabc7d2140bb352e51cde421dc9200228af321555748ddd9b03f0facd297e3abeff79c7a5f0c651ee99c2d762a3a40b219a8c77518c5070879c17444736eb824d55b8a3b06bacde020d062f2a6021fa2909c566806beda3492394723b258151a907aad0b5f1990f7313918a7867b299ddeca9d21d9558788cf9e5ca9e390661fea57813417067ce44b18d9cca36274ed859e27596fa43f89cc72ea0de0b2c13d8d4c41e9c355476519b556d27c27d1e4b772b3b03c06083b3202efa8eca58c81e53a3060631a6a21a132de43c8a5c044d44fd6aa47e7cab2a4892e2ab7ae66dd12962d1e70976763ac6af0063cd6a5508c39395d2f21907be538e5bb5af2a1a4d20a0ddf0a6376b189f0f51e81f590d52f553017cebbe1ea379a225fb912380753e63d4f3bec1f82226bd90ad6a02a1def25617f40dc07062eb0b0b567228374ac5078c3587a92d83f247497a83e437b77b28087756cce2ceadeda5e9b8bf52c5c93d8f524be5ab71c0ffba40cd19d9925acc8d6d45ccf5ac34b0ac19487eb14c465bf8bca7b1b501d47b445a2360e786eb465da47775b19bbe9009135e03f7bae64ee31ab215435dc2546c52a2885e480a998a3553425441778d20f11d8a223dfb40c72730a14f6f3760c5dce231e08a0fd4139730763ff16e91fd24f72e5361a31f4d43487c0f27086124288bbe2fd00a0323002062acf4db0036a5d7c0974c5f75d340abc0dbeab28cf4547551c5a0f12fcda0243977eb49b540ea4b3558775844bb52c973a3f98aa790c58880c6dfd46e1831e7679280aee66f79205826851bbcef33c049bd1df762415eb60b00b290615a6a0be09eb78f1d46817fc316ad261ed8029dd4241750ddf2b18aca20d6802e4470cd30a26a4845db23dbaed97531174ea124db070c71aa9bb86d9545353e79041c19bc699b14d2e6e3abaf534e7ed2fd75efd0687791b8f118dd730d88219fc46cd278472df487ac3dd09a39615f23ea996fc0175963f33637f8a491480be639653c86322106da8dc79a62847425d2978cfd6b73bda90395a067adfa28cb039d34a6ba1b6dcdac30046a9d57582e5c2ac238e42bee69237b09666c64f980e69106f582163beefdeb481fa604209a032d24add941f08113872975e507a1c2afe7765662b036da193261527ec65f228955c23ea2ab0a59c5b579d063c8c3e96499267d04c27e06874ef8b9cdd17e6a48766ea1f9d98a3dbeee6fbea4d71f54747763016a6980d0b544b0adf660435646e502a5ca13e886c20a3eceaf540b29a2bd592150f5100ffcc93d0c0f209c2d7fa703e28db03940148318124327b56a7d1a1afeb9f9243badf66e94ce035acfc7f0cd5acecac50baea030ab869cf0f11860a972ff0635731b6f5489f82467f9ec114acdad506b4cab2d3a2955f305b5c94d6a15ecaffeb4911f5ad18e811018931146972480c008648e233c69a779e2be12950bdfe1444de150475fa8f1a7805c791fdd9f61ed605fe2e99fe07fa3a176fc2ce8333f1f2002f274f560d948199085a738903b753846c86856e23fa9981f3302246d0a0598ad82b589b9e45d08cd5284cceb3028eb290aceb8077a019262f1d99611cb553fd93e358e6f5f06fbe8630245694a8515478349e0223a27ae6d096148dc86d98ce9a4ba8b3fa34188124fdac55858e98fa186a07c23c9301317cbdaa261249e631e2ba572e6de1ae5a700dc21b6b7e90422ac37e04318ac9b616d9dd42548482f6e770f940faa2145126236b8a2ad690299ed6257f5f894fce70389432f15b1a60c68676772d496b7238e16d875d505a3685805ca2db5c4471613b25361dcc74426bdc73f5279fa8f23a7fa94c04724f0d95653991e04de23ee3ffd217e0f1b86f60b06aa1420a67349647834ab3fa6fafe676d50aabd13fa7e3904e82855d8894e235c850f95987c89643e297e7136145d4cd741d3e936073e77dc80abfe54b059ff994479cbbf07aabf3aa6f147a62a61f2191a63242d40734c7000ccc8cbb952c46c5c3343dd0a17f579673bd669aebd77ddf1293617a4bd743f884f6c3578d9fa805c745a7555c4a38988229689d140705946c5788854d9b70166cd0bca1403ce17000b5adb70ef97c486711dca4ae77e868c9ba7eb30b847c34d08e4f938cb2f50f2619a5b78fd1042e0351353616b1c71213a035e3dafe768057399ce7705e1f6ac57f1e1a8d90084283a2c23c1b977c199b07787e458871b79a589fd8d450547dbe17f4b6dc6a1259b6aa9bfea798042211c6793a77571f1432037c4bc061a07a8e42b7fcd8dc517bef25ce2ac005c6f0960fb9653b2ae3edc92846975f9d3c01b6788067411647925e92fbdff7a9a845e3037ff85e34e1f0e483601813ee91aeeef8ebc1dc1a33282e12ee1503107b74966720d18a9adb7573f4aaa1c11534bd8e375b243ec8b6aebafd89f76bc1258c576a2f747bd31dd9ee0863a4839d55b045412915584a330c4c6ac0a2808b48308c8ce88c181d98ced1a863af89b88f38a18d1be86af29e72b29d012794d66ba27c83304d7d5c30739d636d77fadeea3fb2471d39267885dc90f996e9e67885db8ca4013bb2ceb2b6227c4e709789191b08061b344a95be2a13004870b97fced707686b86159003884beeaea168da566c3cf5411eab9326ac56e4f7571b5f1e7dd688a51bf07ebe26e2c4873e2bebaf8927a2491aa3a745a039a57b18686ae78ef47addc24eeb8e9847bca685dabd89aa6328b8175cf9d25daba005fd415d7a045ac5dbf548bc94f3b46c8b2a8e473755f4b0a942e005c02e313b69fd132468ed59d11ba8812f3eec0eb4015fcf22f72a1e9f6bb5cfbc9d205b110caed0d6635eb55eef15dbf636e982503be9851fa965b81a12ef037ddabf2d4ef1e0207bdce909c9d6ffd36e2a5420a318a412ccc02f4038992cc3689c53e5fc3d28270ba99f75ccc7c052f704d74c3136a87f017bad377767851f7b2c7f0b4161b839aba7ae4d689bc1a9f8e5c505275c41af6d045ff7bcd2b3bcfdd1914b3eec3aa4f14e1d90e9aeaf244f1c0511ba8d7456616fc1db84753758343d02c1d124287b7283ff82ae8cc2ba0dc4fa5a06fa712b06e842def1c0d94ee6c05a4db5ccac50ddfe4574d37ad02e53e95667d43a9f9337420e9e7d52adcf8d653f5cd548aeac69a7aefab405dd762a9a41be4c6d8b3cc46fa6afe25b46fad8b886729266875a869c68053afb2d107e6044709d6e74b866e0fb98930a55b223eeb5041ad9f38f22898aa2bdda2309822b97c042ee0072ce99c2ddd42082a0c89c49c5fdea096e4c5cc6e906f41bd0f6bf5e253d82598d8cc26b437cab08d4c1601f4dcf3e8b28f28b73014ebc95c98694d5e8e8a603a09a72a7d6c662b722911c9084a82580243fa0188827f9e6569baa54731c7fe370d2eca0808a2d04690b29694438d86ef8497624897fa28101ea6be960d05712a23bc489f275ddcd9a46e3b417656b6c1f44a9a9dbdf243ae82426069038b23e65192ffd9d3b5cb1d4629a4cba912060898db5b1c02bd7bd20c28b8c37c368621c0327095df2dd67b459a564c84bd83a0f898406d4770c9182b4d4aa17e4396c14682b1b552f449fa474515a50b4b164030caff0a4d67324fe8528cf802b0101c526e8596641d1389e409c002dbd3153eb905c9198a05e1a5fceedbaaa27375a93f78b58c0983217ae2533208e865badecb3f3f6290ac5ad11ea9676084ae1cdc6e7be26c6b43f0d2df602ec880218c769f5954f4093f215dab94d16627a0e20e682e9c9a572090eb8e09330bc2e01651e521c06f4910602dcf04070593dc45812d14581e0e0394c819efe01096ab6d80fbf2eb05e44731e60763b07b6dbea07c0e026fef353879c1696adc8e251779c87501747d17c9f228f19ffbe791c42956025ddb8d83491439f633debf1084ac0515510008e8d9fecb00c0ea6981286b890d43bc9b020c585641ca58542c210a3267e04149e6bc13e3e0046a79f679613823d6220d6ba69ca3855ca78998098943318444c25f53801dbed9f8a343bd59c5b55924f2a6fdf75e9855f4d40763e50a2b29669417734a52a03d1fe5bd80bb721d79bc290fa2b52d227e4aac9c0576e905fc9c428cccf6965f6a15ac2ff4810e274f30a6423241e4e31b5f6d88f06d135a909189fd3a45ea22b3a614a15345d6b552842e26c2e3f2d14d649f2a83e5f8b729c33c9580b05bff20340b84dc4dfea311db926089a4a15e279435889f117f112d21022be8053095c95e3380b72119fdb5571c2216e9d8142a7c212b78fe35adeb724959de4e2821a9dd4baea9015784837f68828a1e65635f2305d042fc3fb0014071a501b91f497e232a9035888a4b1c7fab4113a8fdb57855af676255caa0f0e220c26ec84bbbdea5495399d4ebbfcb1bf9b0f846eb3d255bd29310a3c63c31222b70f15514f1f1f7bfc08259d5542270017a0dce17496658d9245d5fa19227f0c04872467e5e1d6c4ae4203f134a1044036569222772640175318369c12ad0a5c8dc5700b42cc16a45fe0c6b9c2d4fa00a5de2451cd88a1f881451951f85f4820abfa21d252a8661a234038891dc3401a454efe40c3a475c8824a7ba93f19d9c2bcd36b1ee27142024f71dfd107fa42c9ffedcb869bcf4126a3fc9ae02019ec288a07e43b23904fb19e481fab5dcc818daae2566d31b28a876958c411111a58fdd256695631223a77fea95f45f216a431e3915603fccf8fd7700e1a233dcfd10dbfa60b0b65d20a08c075fc9f5eb8f90a3e3fc4990a92cb7633fb15f8c1a11b683f7b346ef877cbdf0172c31571650af0d6cf204b2bf142ce0fc3518c3f172e364209d6ff49d5b4b699540114480040d631f9d2e8930f89b26ae1b83223d9adf8930fc06136d1434e358d0c0f239ff77012ce3d035b46c0c7ffcc06dd08e130a61e72240150c6fc8bc9dd28b1b1fa9837b3072af7f3304fa4f0ad3bdfd622efdb5b505f583ef48bb8fdac04febf59539e43ac2398d7f615109e57581b877b5a4ea802ba87d5bd58412a4a8b7c0c7256b57079412ffeb240d2859a795f70681d6dc56f610203be5eba6faa867262e1a9b61df613a5b4bb031d3b7a4758fca17375a8e7918a4a9f127a00801ed78df98f82492ac9cfe80509517fa1c72cfda252b18264f1a63084ed062deaccb83ef5a6faf2be4bcb75b6695dbf86fb3ead978c035cf1db25dab44cd2b58a8780e501235897f00292b65f7d49f3c9ac7c63a9d4ee5c006daf9d9f97e080f25f011612f9f03637edd50e7e1b26e441f6ac4fd3360d94caae4eb540029f1561bd88ace2187a00e862ab50461cba9c8a11d3d8ea4d09883ddcc708c7720da403ed8f38826a515a4a7dfaf2bd3c413f63e7a56d9aa4e2543b57cba29761329054c9aefe0890178ab19d284df2dfc7b021aa4ace363cbfb0024d0144c160875e8d2492464f49b419558d144d51be529f3d6a3146dc1ae9ece67d914e5f3998d8f447d0462d56a7c7a75b858397fdc1124fb675ae48d910aa453692d0ae15d686dc53cd842dfb8a1858011e23039a9d2a6913bcfc562f69d877d63cd432af40d1a0eef1b5cd9929cfe94d1c12d2f019d6c3d20bb6e40de4c28ba40e8bdce77964036a38c5b4f2f50de82b59484b30577d9865904b884d640af5f40163c05d65f071c4334cc13ccd925f00322f9c268eca046760f3c32c2ccd7a64679b8ffb028675690ab0ed05a72d907a1db81e752ee76a4082611761aa6a3a490700659588d96ecb9e6bd7d5a6838c01afc8e42c19635707df8080bb36c9c3eab64225bd954e5eba9f97d6deeec58810dcc3db3b364bdec25df1e0837bcdcf3445a31961b676783e82706797375cb12b4477fad0be564cca013da8b9f5d0edc3f9a65658070af85e23b82e0efe03ffc04414f53ddaec5caad7484024cb1d620a2bce3132ec44d0dca77e39e81f727e6b7ab3943bc6bb1a6b51b1ecd9359348934b9d67c16b428f0e126fb24bd6854d7da093ca62b1d0636309710a93ad5376046a8c16c1dd1417e10b8e9d0d5fc72171985fe7af915eede448582a97e8368d574907b022c1eccc582e54496d669b3324556ed2935181bd5cc52b2a243724a533d04293f7da46fe367d1fe03b2a0750e5b01a7d4700eecc3df0f1f05d0afda7c8b1cc29a16adc87c94653d6aad7f084bf1145bf1324cf937b2abd997793ea891fc41a588d6d219f2261d3b0991f6954709a6c5dae97ca4c3a28cdeb8ef2d18b4c553b8249bcc1a08fde0f2b0ec5e0e30967b6656ba549c0bd37db0ddd6defaf3c539d6eb838b788732eefb00e9eee9275095619a4de9786f3ef80e9718aa0bde583b5aff4e2b537e5533360365a895403907116049bc6e8d76ef146d728073f232ae402e905f616300d8c80eb60593f7513cd478a062619f6296da3f03623b5907e2624841f3d6f0b8ea5f9efed2f04ef480fcc3a1e306de81b08c3d8d5c07bf195020011c75d00354edb02d24062b823c3a9bc7fe689625b65ca456c3c7b69854d0e585bcd6c25a2d2774dd0a82d0ec0bd5bcac4cbefcb5cd67d96a8081d4f4c07f35abb61b83b08483aba54551578f7a077da027151608c24429063f82054c512314ba2bfa210074c1693cb5e114f1e35ba9a593b78a2377ac4f01f9070e1fe5b5e69c122bfc95208756e415b7579ec04cf82919f2abe8b6f02931476897224415abc8d0b98da5f53bcf6f2f834a27099fd03780185a84c7bfab8611706f75bf69af1144f35b8d86d7d4e248fe9431fdad51ea65e35e57c7b3949f323ebabe8e80c2b3125b20c74e42956ef7d856cb089a64013a019bb41bdada94bcb77cdb702a7158a91d81ed090fb0e0b23ace38778a8b856500598c23918ef83b98ef5c15e0e08e8e687e1c1c30bcbfe8867caff21fc25701e1287d3faef7a13d0071b014ff5a2472b02b2c022ecc9386c09b87a5a1640ac261906cf93e36ed13bab56398a913287553c62d375f97083cde3b87394e2d915e7d99c7e5239b9974075da2905689595965bb04cc8561074d506cfeaa2d90ad112497bccc332488bf9a07f42c3709a0daa838a61002ed92a56014b2bee5b0c6c1a64c9cab73ad661927a77c87bcd6733960377a7995d68c4152657b75029c912dd57971c74a1b5a66d41ddb9a034076fd840878aa113d06eaad84cc0782afe477ea2b0b64a3c07a72e7acbd89b1ac3a3272c013b318a7f72bc1385f4c000b1c419a8e4300493ddaba8c55b372338d1423368227f6145b516bbd7cdfac218977c620197b98c47a0f39e116056678ac5741cb13d342be114c34cdeab99d4ee74fcc7b7c3de6765b93e93c2ad99688eedfa4abe232d954fe340cfdd8c116b8a9470ca327e53f1a77a2dd2dc74da7ecf47654752d2a2a77018c4759606ebbdf574cc8db3f98ae6bb7c45b88337408c91ca6246cfacd3aecd625a98886f39f1a06c7851c6ee6af881ba7b7fae98c220cfae2934c45de8a5d216675d3ca17a88eb81eae19585cd5e46c8fc358060d322bf028b40c8baf6bdca14e4ac2f6cca0afe52ec262083705e28d2ff4844ab5ff5e8f0d8249ad9ec58f22f1f55cb44fd938e424c31e470e0096265aeede9da89677c4d30267e0c3a7da45e0a6b5dc5d927a1acb462ab576e9bc2ec6e5c1eca7c73c70861b279ba0f648f25ac65358de0cb4baa139e68e93a4e2998a056041a7a2d3c572b4dbcd0e4b900734f2046c6de7be9a912ebfccd5591f77cb46022d10908c3308c4b810e8c0e11abc0c8dcc93637d657e3ce21dc75e3bf1e89b8fc187686d001a2519f571f67c958065411ad4c713043fabd26eda780803d2764c1c4e629573f95aeea8ac8dcf67d9c9c3ad0fd7af529c6bb9b09f7f9aa5962bfd8768b97f91baa5754d4b1a6d3310ad6070a75d14492a2dc5f599578eeda03eac1f76b437f4168e508cebcdd7a7e295bb7c634e1372b21e976bcc77c468226b65e2731ca96de4e50128ed7233439093886ba5c02ad2a53dc96b9752ad5e8f191cb63d28c644e5809e008db48360b93bb687d79502ff9278b36943a1b713de376419a9a7132099f420587b4653c984c22a4388a66f7578fd070836c235360c8a04da04d2b3f3402707a5681de38f7362580e03c1635f4de17a7ff4ade1bec9af650672110b0fc6507787ab5a3614499fbd80b4b8021dca110f649c01e792a6f2f18cfcfffa8b2b343fc70ac4ad1320e51adbd8feb442f061ae11e2ec7caa5b9da296cbfc91fba1c306b280e0c7826975aeecc4d6eb401564dfe5ee7bf2967f530bc597736421603019ecd29616d711bb78b6463dd9c5439bfcc1a6c65362b9aedd623c65a3e45b5e3c25acd7ff76a9584b53ff99be1fd7d9cfc3978aaa761f475ae969bda21fe811fc9c5d308da4625ba6b5b711ab980abb665fbca0dc665210bccfafe3664bf97408779c2fd399cbe4ebe5d7f9154958380b417dd18c1bb659b1f1e4cc2f6df9527a6ddb60f9fbe49b8cb30896647a66c1edf731bfe822f445b0f2bea267b39df70a466fa8378dcc30a69209bbe481e24e83d0a6b30178e20bb9a4785024480635d0237a393075b7cf890b60526e20d9fb29e9b56c5ba7c89ccb1506ac5ab072dec806c1325a700c0c3d1db1c70ecd1eb7786a8c3ecaf92107a48e148b01e0c68fd1dee68a839ae73846363db00fe058f68d73412e4a996e6b03d91efe58e156ae75df195cb752c5e8005e66ae0de5c0a5eb955eba1555f0086e81604dc2516c6be45541df938c44b0f9075ca35899edd226a10edf2ba08c2f32ccfc67884c447bd77b9caa9cf6f37997328401138ad0f990e887ba8d485deda71a88e1bd378ed82bba32758b593de82c36d5931363cb6162b03c950ae76da9facbd236146c3664d54f00dbf80373b6e17a36a9956dc79f8d4b8366395948e00f21c70450b77e5a5ea2bc22b1d45583eca444eeccc78934c8f582604047fe7666aa9b836a47e11812e0b19e874afd900dfd6011665f7271033a03fb58ec03f73c80433f508dc2b9d2d9834314d5a40891f1a0cf063b2fc6d4ac82ef7527335de033e61b516341775279850e7214c6084ff70e9268140a19e9f71a13dd98f804726149e716592078ab6256e2a8eb1e1cf4dfca9116983e0c708f16e83f5053be8a9c847789ec16c66ffdd01a918930b8cd59f5a0a2f822e194d017dbd6d8235933e4854716a28e9e7a1c16d9074a801017748c90fe289ebf9fa31c70327074a4a569909e4e8ea9c706f39d789efb2bdcbcb2dde2c0e774e64113fe4d4e8e8d69207ce790a3556ba90d4e1afb71a4cc105c35d38412453f34de3df659284fe497d3e4dfadb6c52517e01fbb3d99f685470495f85e904d6bf3aa11c86b2cdb7b4da9f26a00ad64d1f31ee3e7e64372d53ce7fe5610b2880a3b93f1ff52862baea3faedac5810f7d567a0602c56fc3d0c21ad5ef673a711ec6339bee4af4da2cfa5b817a090e24c3076318f48fe6f13207f7b5a9639944aba054e14afa44117cf390c54ce367154748c0cd94eae6c809b34f86b6c49645fda49a3b0f4e96c020693b21f21f907159cb0d505e4bb5a2cd607a967269c61458959b1a39e7979805af402c47cd7e441b03fcac68d22e19dfb15d9c379710df255204d33b173d3c5ce40b303510920976f57431d826ec21efcdcb71d1075dbff8b1ee5f0215dae3fe7484a47e221a62b73a5e40fc4c98cf793bca4bbe615f5230379e018df8d6b4815fc3928126d6372a86c62518caf39c7dd40fd656a5a91f359da96a4bc72d7c506879ea3b008618ac08fdf7f700165727a2350e69644e8da265413e698e4d81ec1db4cb8a3feeb4d823b0bcc51a4b372b5899308596220a659b0d5c484671d7f525ddadf94e3504ae042bf207ad8e1f099f46a7f222b65a67b81c35cca4207738e1bb3b23dcc14c253d47f723e7b176f86400663fd096ca41e57f531e77671e1e0f42b34d308b1d24e5775b821712a28f16eadfc711f300635fc088da54ae24d3c31c6873a5589507a7876d159ed6eb356e8d41f0f624c3fdd12515d0409ecd00f2f2187a64a8f63d1becc232ab15df552c8a4870e26e8fcc7a8594a7ea71cfc8b147f5164973436f3e03153ffb6266b32a98e45833403550e0bd181dc18bae03326d876c36a899e329621ba5d293b26795764d9e92a200c64388c1647aea48d452de1f37b7c9809c2eda58244e7d73a2123d8971461be1ee220b6869082c6f1889b44dcb07fc1bf9d4605b68dec33fbc4f48f1389058e00a7219e67ce1efa51bf61922cd050f10bdb7f1cda062ac405b3f0d877fd39d1b57884c5078ddb0ef998e60e3ef91a1fad65d1936fb4e4ebecc96802707f68da8251c678cf7d50dcafff368163e1b3e5ae0d23b1606077d639a5464878a873aa5b30bd32b9b5ecff6e8bcf2908e7c68a57dd9bf9878b8b9466cfe8373e20ddff15353cdb1e593dbcbf5a74f546e67a415404b36affbfc74e3949016e2ba12adbb47c09f83ab0a7131572f2956e29a5a4c24a427d062059aa74fb5852a41dbef34682bf2020525f2eac5118d4201305f83e7c86ef186c7608659d3c93c560b2a16bee6aceb98e1b4a2f868a77384b3a32bc734c498dd72fc05464717b47885e9e15fe20997860b9ee589d055c8ff5172c219f79ce2342a54f6a0f702eb632e1fbf2845144c3526e980708a62771eb8eee376defd2a0941744de8b09b8567e7a53e5af77a426f791f100e419e5d482d1364cd7bcaf72880904d2bb01be311de5dfcd238630daf633efa0931ae6f8bce5153888656b7cc5967e8af45e5aa00bc61d4ae26e1c90c149456f01e18e20a0a5223e1abffac9b54ad0d25da47baab132075df84e09bae5a6a09eae8f810cad515564692a774539d2f30b6a4ad792b794fc978eb2a9c809a1e16fe827493d2eb5fb16e524d78d4faa7d4833d12bc64fbd7e574b8656bca2d447eb245789c12439860aef7ae42ca89cebf9a41c9155c3bb627e538bc4a570a6924fb342e428834755fc5a11c2d5c04d095f5d81340570bffa2a95cf4375586af19b5825110c58b469e838dff17f0498126456ee2ee682ab58151aadb818c5a2a9f866b97d2144d7d0f997f9180c56f1a6b528ffc0da309797647a1f60ca355d29d7412057a174909da9a0d43281112d315f7e41f382c5edb367117f54e38d21d93170234225d57d32de69441fb927aaf23fde2b79e519f197a4a2ff0e8b20bf9ce760c6a678df30dbc9ed7347d44c8e553940888663268726783a8485fde2809c7d466f0d5e0ba72b5491ef8ae9a5ebb1aec6758df9ffc582d4bb2c74d2f61111683114ac172dbcd5a7487ce7cfeec49dbd4e6c9360d93871fddcc21656534ef4f7058026663d71f47bcab0492a8fdc0f15b95fe281aefc83f649ab7ac53e3ed54470a6360fd6cc371ac1674e61356ab34a62998a05552ca6395de3484180036fc9981a70bd506478c3afd6e766bed4fc94bd747b9f1e34c28178b72a5a0a462cfaffed7c4951760c31fb7be72e9fa2061b871ff356e809a786367fb8bb1fcf9f90cc9914c58ced2f39b58c8453637f753e557c943db6eea7a7fa18d484d24351f375e1799c669368efecce0c1af8d8dd02f0b353c46768db5e09b11400c690d9c3fd702df34fec4841d407230744d7326d0bc25bf52654e63306aee07cb7412b04b939f01180619afee5ec1d41a7037faa3fb8c76491c9c2cf5f244b66df68f7e934ea7d505117e8bfcd03c80229abd2e982136bf54d72d3619276c368981ee8561d3347be836b059cdab9f89ac48155f9123b4f9def89e713345442ca802271cd86417c36d3a9dbe765b6fc2f2f233a329df0c0289385419394fa589b8bd01b41216161267d802f92618a30173dff0aea501af8d3e891106b1538282a3c27cf4f5bfe4bdf3691e5c39fc5443825cadf90616d169adcfa93d7cd9b291d9519598741b7e8a311f1fae38251a74c06363c97d8d2aadd13ac59cf407cb5bb6f551e43fffe82fdf82c19e3ffb765558f1a636aac8ff6e66521c6dc19dd7773527a5e1fd453a2693a0dd4b49123760b118489293ad1c76a5805c8ac9698fad26ba315d4e418fa122205e2e80cda748541a6c1959eeee559b4edc41abbb061821a207d2205be825b516fba9925c6e8af9eb21e8be21452f7d00d425acd07eddeb569c6574a51a08cf8198855cc48cb86a0120fb4ac5009cbd0883ca897e8e5adc2dca01a4bd0d83a8d3f828a0118b5fb266ebaa5462189dd9e965a54001bfc63be31a110813cd436c19676d8738bf0a6a19d449471fa94e01ca4632283e136961928443e37ab3c2369ca77b9c9287d017af21b10bc6c1f2b3779aec62434ef47423ffd4b98496a1138032968ccb54cbc384179b35a29ed1ebce6c9cf17c84f6bd8f77d1c3f7e291bf42e91535508e1b922403e827ed403f775ae45d3907c54f22a879dc9f5818318cd610c6643d594a46f4d5b6fc800a2a97d543198b298cedc97286c2453e74b574f6b338f745ac1c678ded403f176a9eff35213d430531b1fb24bc23b5bb4d50d5e88f12767f973cb067931d5726c5c282db75f2579802e5d8c0abbeb8d6d2def38efe3d62af2133f8fdf570275f60e4bba187b29864f89cd20267dcceca8c68a28f84672133ffda9c0c37382c194c64829a66e0edb4882377bee1beb28d56406acdfe001f70b1d9f33c6cb61b496d2685f9a60a053b6fbeeb1f4140d64d0e17a8c74c3b33b05541274f4638fc556b427f09a7eaab85fed5690e17c001155a9b70498226fd2462346d825f34794239b50718268de66427d7f2121a18843af46dbe0def3992c3d6af00052f7bb5e1ee662eff90bff25fe02ad5f14e883e8344bd6ef399718f61d434c53a1a7d9a3c8838347b5d3c1530c4cc29534a66a20cb018ae186622219bef3ad6c48af250f7dc2eab581089623680681328ff2f1146522e4d597946bcfcca8f045ec678d43d0fb66434f64989efd49fb0a79dc207f7f1d39ca6b100b03b5e633210a8059588bc8964840bb3b4a060f4faa198f12b2d18db4433f07d0c5145c6009eef34d0bbff963ca1c5a79fe995188f778f19ddb0230247a73234cba5e4d282bf9291cfe7a5004c42d8d0762ffb42160c286e49f0b19575fafdfff825e7d2c48a57e391e8803d8ce1292dd69c5450820a61170950553e04dacbe037f27d7b877ee4c066e6fae5e0991f4c3d4e010a60a2c1594d8544337c910d3452d441b0d691f86585fc17d78e92d3d07147a1e7a2ef4d4e9b52252fb5e5be1e222be71edca01067b95888047cc96a3e9bb35500735d8faf3509d5ed14c0c041c3edb1578c063c68af88e368822fa24380304a79ecdab978c7c637c54921927ebf5e6a8338dc26ddbf5352ef46620b72a0c2710c62b072d76fa6e518f5ff1d3b12cd53b20a298984197050f8b55e88026de10c0c3603454d2c265809f1144ae101115901126958179fcf16eaa41769831071eb39d3b36c8cbca5015a30ec1486e0ee40898e6b6254aec556dd1099930a7c0d85b5e12bf976fa176151acb1ca0d328ac659b685012702f29c690eee9c9ac0d92150b1176a613910999e2ea2dc7cc1d5d8f127c47a012a033e83f0da5e8a925a63b53ed5e49692dee7bf2d2307581f7b5c2922a5b69cb1726f5cb5204f491f2fc4bbb8990acb6b4430419f967adaad2f4ffaea7030c1123c6a817002dd11321452c1d66c5e4c4b0803901fbb7924cfb00fea1cabbe7454b98527a9d98b0f5bd8a8ebf3f36e52685a7431b8120887b7b671aa243a5920caa146304294a9ace20ed806b6da78b4e6d3fc2225cce2d134d3e3d436f2b52dbd1d305954e9064f0e886ecb7c9a88e6d8797ce2efb83f9516ee3c0ca207bcb1e0c0bd887f39aa4c44ede104c22c132ffa3a3607ebd1f40156f08e83f0054e9c46ec5c807ab812c5a7708de2ae115a1a2c20ce018a9442a045d3205a94ad1d9039d2014024c468fbb63873dea36329966a0f2f4e082b5d8e7e6b80ab9fee0a76c935af1fc7ee3d68d00863d81842ee247aad77105b6cc27f7cfc03c7169dcc6354bb8e33cce5279054d03ab2f83c6d94cd351224a00b1d9f3663234f46a78a7407eb11ec5521124be3d8513ce4214ada4a85b8017c72d4f16d9b94d541e277e1afbde4e93c3e7246bf324d1b7525037c8e70c7bc26f759ddc97449f15b5936c408c62e6c801048e232f7c4ce7277019c199c3e8c69b2c99d3fd0871782307cddb19664912e702e650d7d9414b56e70ef539fa665b654178d84c59bc80dfa4fb4f9828333bf3328707c1656b3c32c09c5b8bc9e88498efb448dc1b38d0b3f903be35dbe00cdc761061bbd13861bf5e70e9dbc2c3d243f80fdc204527cbbb0b257890b3dcc268e1675082a7c0da8b18245fe617887debf0628d309caec5dd753001a0ee5446af74f595692768afd13f59fc74d44ca2a0c48baf9ba3733ff2e4b4bd016abc24fda0835242cc69c884a0a4c91442540e53050e8a8357388a994383fb42a84a052e8e781eb2f88f07c4822dac9f08f2d5aafee072f93803255475f23c35f55149c141ee032cadced7065bc41260e500ac8a743c006d5c2fc83f1296e05866ca9cbff4c1cf06d8822cbf3f7056101f278f0241b5d088f487d8fb598a348376eca00b1d90bc688382ac2916548587c477009d9a59fc322d92c48e96d0d346679d7fc819233323fbc0e56b4a0a7a229c9f931d48e2c0cc131aa8212bb9823913914f8a5b4a0b719128404a99ec156ba6bcb5ae878ea100761b889c2541edafa0412b81f92cae542b1931cab071a4b1614a6a8e70358cc8b06bc03178cbb7d9009204a939cc8ebdb11c1e0cfa3ad463fef1483899f69f2d67de2cf7716b14ab837cade5a129720dc950b9c2af668b44677229d615209d0c5cd4b1c839574406b0c6597db63890a3cc553d547c6cee8fe1a5ad1f8093eb6aa92c78e85edd37bbf1e12a3d96c852e2db06b0c3fdcdc9c01bd372570059f61c61dde7779b3d70fff0585b20d299d3b1f87eab2bd55636dc28dbe45daee80cfa18f6308d966c81301f3991987cd84ff4012131e138b7d3f6fb8fe87008365b54d66980da82a8deb08a9934c4ad3e916358c188da5ecf1fc0544b91c75e20f89839464048ad29fb438830fadd7cdccffbf6ddbf5c6e7549fd4f3e5eacb2f2ee93300fb8e979b6e8801e9dc16165c9389bef693169746e1531865af949a4a1b5db889fc789cd40f28224c54f5c2e8a15cc2e7633df1e2b5cb32cc2bd26efb45c5008b2fc280a6a31fabbd4a427f67ef9931a819e3e4bde048ee049254a7af6356a0158388826d3a3348ba83f12ac49e83b1595ec3ad5e3da4257b43129fd0c9731c64fe9fccd9e82bf52e078dc171eec8d2ef13b3ee5f3f9cae7fb94cef72bbdef29bbbe87728d0c0042ee912f4156b5fa616ef4c4eff82abdcf513ebfaf7cfea7e47c5ff9fb9f92eb7be5c77fcadfe79eb23f107f8852dec169f3110b53d7fee06c7b6a270d27a0bdabdebf6f98ad8108319fb95da3483a9532572f6b231a3bdaa4a86012dfaeb41326ccb74152a657f1197828dbee470df8e69db07cd1206dc5ddd65a4f9611f0ba50704c7caef9510d01810c95a4226a0f86c06970170a0afa3533b1ca475df3257260d995edf12053c0aa3bab12155d09dd98283330517100ddbc4097ff18a05bbd03bf8376ad359b1135d1edd40a55272cf7d94988e050b2e03fe66dec32a5d66b02de2420e9566ed23447b5333891e2f4c668f96de1059a12411377244fa94125011bd7ea2c33d43f555fe6ae7c6d351d87a9d7b871724649314d14dae506681a6061c9aedaf7fe02280a4e2cc5bf210d3d0b06246895e3d1363f097c336a1c4b22807599858637985700e8e7c117224cf235d5d478fe217b9e295b42ef090b0e2b77f07b2c31dec11c84de0d796612c4c07c42f69cb1c90bf2e8b02c545ae8ee128fd0d62b2c6b5f6ceba1459131dfd03c00bc1a8215e4d69e658d360e7f0941f81d6d761fab6224cc3865d2d8ada475bfe19df20c454d57ea796da622b87ec9433b5a29eb1a873130e486033a6286795a30ceba4a079a17ed98da12247a787b85b70dd10724d0a4d1a462a380992b0d76e048b60cab0f81caaae3e8222b8859a9c0700800846110447d77fe3806502ddd51b013b8a67aa8aaf62d031daee07af9c9de7b6fb9b79429c914a7078a072d075ff4764e977e7dd2078b920916824c9104526b4afbf4f66e98ca98941155ba28a1c34bd932cc195bfcb4d80449dfd20a0f443f2dc9ad23b7e0c2e537894bd24f04812533777377ea4bfd9054672984594a7971e8cfd9179ef048d82fccc313fefa7a64589be5d7231ff34ea1bf137a8aa83645d8a5b34dfbb2f7fbc4124cdf180c6ab8503d3a29a8c0ac900b69ef9c10bfb0d6d5ca1d047574168ae7439d1472e881a250ab13866ab850504bf8c04950f1fc45ad292a052931f9e8b2aa5e497cf6c81f56458d4418a0d74c93cac320bb8edf7c5c20d3b7d863e2a6a9514708e105355c262d0ce147080b84c83e46010627c0a59ae050d490dbe3189c0066c61022dc51da7fda0f53d41294d21392d30f12901211922b814b3a45daa374b57221dd4f354f090797f75c7f7dabaa828a55d1bd09cc9a579ab60aa72b5f9e7d29c0acead129e98a98a2a42a4df8c9b3e49865b35f58b10ff78414d073f5a7abe2b486f1310b308a26bc482124851829b8f2bd5300a816f3764322cb4085acc86c98e08a2cc69c28849e37345a4a29a56cc92c1e4a62e450473101d4ea4b071b0c3dd1a260d8a0cc1605c39c73cea1213a0445c2e00409b678511d1e29e3755d2e7bd64dcef951c902338f11e79c733a0771190c50d21ac605df2ec7782205dfc1d39f1758041048001484124d2ba062a59d2c410433f315467255d47cc8230b1adf2e97207262e83bc909167c273d914483208f3123e8620c2b9868ead26aa0259ae8ee6e9e0f3924329e5dd22c569efdf2d9418834d6c8810c2c579ab091a5933e230e15cf4e9192b0c4e0d9650d41784e092f5c77b764d60658989e9ddd4340020dad77642b9e8083678e08ec4a1a4ede06202c2e3479c2e244861732c292830e58a6047d0d47aba3f99ba44568486785f135af6bf696aafd262d81c60f4baca105e8e84a12950f5d87d7a853d4e824f446a99002fbb38338bb338207cfbefbc1731733490736877d84def1400d5d3c892d3ca7b0392c3fba3b91fbcab63c7c4b1d51e7af4fa00a512f8fad662e43923ee49f9fcc85c18e518d4343bdbef8991077e24e64f1883bd917c970fc82be7de30efdda5347d4fe25f24dd89c7612afd4e96c346777f7f48c7ea8181db50319191d31cb84cde91b28e24f7f4be21b6d4e7b1429450c56236a187fe20fb3da2310b3fcdb3906ae54ea9025f208a512a3da673ba5a15db68731eadbe32e0d2f693080f94012d513305e7ca04b4440a9d0ad243cdf60b2a8e13e41a950676c923321d188e968b548d18899993d53a3ae886211e581c6220612d27dcd581445d064546e89d26aa4f3ab138d7aa752da46341353c368840df14e0c621ca01e82f27d91e19d1ec6515a62727afa714549242e0bad2ba4d58840f0d1430dca7316c5b3674ab387b9c312adea864ddfedd38a3a06999f666572c8cfaa2db21283d0ac0f96455ad13fbf94d3fd67fc342524a4242422dce5b3da98448dc32eebf48b7e21ad983356975e7af1a98caf3188085c54b03ef645e0d2c5e6ec9452f4f2faa427b525ca05cf92f8fd404444e1464528cc8acf1e7fd8e38ddf2782288aad097077110ce2a565344c84e3a28633ee4e193521a128b424c6e8d1e78724c6c8f243cd885d33625d2c70d2e505ff9c2caa21129a403c81e60c319c428420e610a41d88253f11b8342db841fa13818bd3fad8ff1c7dd1ac04ea9a6b9f0a9a53f769f9b09712a386b4d5be32e0010c3006895332187d84c5898e41f144899fdf56f931eb08e3c54fabb94720e148ca473f12697e629215281f7d63b742282b563e5ca8135cf1e19259c06c30e9a3c785e2a347ef115d8418a4fdc783f04d94849cf8992844b36cf952c4d7fc6ef922f4dacfffd2badd2ad21856ef1bfbb722a2ca6f089b1266ca942953a6353d5c792bb430fd721530bf3e9b085c4e9d7e2b605fed29362dee8ecc214716db02767397d9e4b2a22fb540b44019cf7e81ddd152f0e1aaf1ec210d071687fdf27a36879958fa85e2378909a0df6217bf139caa12176631f1d33650393aaa72148f3e3ec5a30f823e00fa40e83f40fa00e803210e6221167a4662a11e820c05110a12244810a20f12442808910f11e8490413c13c0f4530114c0f5d5027d4cdd0097542df2175429d500fd9970c8b8c29637a0d2863ea410e49212525998392d2cb2829a4a414a9442349248924d14ba5684424897cd82465268b397b927b63c730ce322cc3bad9f38ed14ac7d9dd53ca9976e9492ee8392bcfcc0ee8eee6ab876d7950211a8814c16ca9868b0422459ecde9ef83f5d1de1fd838ed21839b93755143708703c362d0e8956c22c982c998b22f19161953c634b4719daf6237a49394eb76c1cd3b8df3329a6d5ab669d9365dcb2826b5d8666cf2fac2242a55ca57c66e48cad97b30283bfec0a21a7aaa4bf9163b22b163ee88c4e794a779e76dde0b686eebcc85708ccf69fc65dce52551c9263629a5d44dc52c6e15995bb1c2d84df8c6206154ec9748a415efc89f9f9f9fa29604235b2b7949fc96dd10b940b699bae63b8c4a7f8904c105526473dadb7176870111a75769b505cd76f9067f84cde985ea8592bddd51a6429f966330df9cf531255d6c772986794a9a52cc993233e674550c3a0f06416e4b5d5fef30ab2384903214032665c448a2356170c11617309cdf242b2cf8d46fd2095ef8b0fa0f4569dcd058fa0947058fa8b4baa2c50940e0dceaa7af1a3f5df24efc99ae0a4954cf39c5f145813a39fcf272f80da21a6e540a3333333774a8cb6075956783c3557ec33bcf0687772ea7951a6ed496c26683a3e99d6d4de76abc65b0c67778a1cfeff0d80dd9e15b1bd1e19a13d1e19a0a4f7df342ffcdbb6d7c3bda3dfc363535be79427a87c7c3e0741d2030888109306be5d32950011d3a7ce5853ebfbae1d443425d876fcd514f87afb4229a6f4e44fb3e9fcf6a7c3b22493ea48e25f9f67ae6d77c06883e74bc0e17d22b6f0406757c2430387378a16ac990ce8da8fcc627db861715aeba196f89fc14f54b8cd2ef97dfa43068fcc65c479d04c6baa8f24ba59f0e88d5006634a346fbbc4fe9b79a937a9619d11c73221a0a8eb9cfbbe6b1d38edd10ea0cce8d4a4105a0181485f6336f1fbb965421d85ac3302965c4a254b218b62d8d0c7593c280f9f07564632354252c85ded13cf3f607ccefaea1d8d71836b7c6506d967e7e5a36d8776473cddb8a2f5d927e5ae12ad51148385282a7c3832dd570957a46882ae5eabb9579dbc2a2a861e5992fb6502ec5c9766700e00ac8b70136a77d6969a19ed832df3cbcb1a1beff92e55f36d7f6e04d67a3a23a0f76a6eacf831df3d25bf4172e928e1cc1b63c5261d4f91b73f4ad549fb1893a3fae87d08863cc14b53d7ef9334665b0dd1863ec346ad49921d82db7bb7957763783717773b031a494524ab9524a2925ed28a5e48c6a6a4c8dbe4c63438d21cf4c15354a29a59c317072c6755d9793339c384a94dc0b7a5543b3768ee2581c5eed4e54f2e7e2431ccfcea4e4459db339ca149595c4218c961fc24cd1210c943020e8c1417f1e6014a0c61932b98c163c790b96885c0826075ba0e43cc660fad075e69815ad2bb992ab95ebf0e8441e1941a9a3e3c40c33335319f3bc7a66660e554bdf4f3c7c3b0056dd125b68f62b801822f8768f9a6005358e45185cbe9d834af35c6586e71dcfccccbc41013ee4c20801185bbe5d83ba049377d30d91208011039824bedda61e31e110c382307e07e52553c58894181410a066c5eceb459923199c10030325a316df7034c4cccccc021b707454e9d2e500bf68c1b7e3e886f44a091d54dd1019c400df5f1ce1851adf7ec306062ee8020594266364b02109a1ca1d51bb19bc20a28b8d216a74e71139d58d1a0978765a9d9878f69517373c3b8db3b0454a14348a7a3003a906249868aa1702ac145d28f1ec3360f4208513615c2082c916424a34916353365e7543002dba00e2d9ebca419d15283d7bc783435217647878010620a6a0e1680633ddddcd71e16509f0610f0f9acc5081142bf0e1d9b7e9cab36f3a64b4b00230a06c21850c5a3d43953456dddd1a93cd0d17ab0f7fa8400b325b7cd9c20c2e52f0ec3a4d4268f1c3b3673ccccc5fd4303333dd2d4cdf8e3133b3ea9999992f1e26caec6384166518910652143d74d1e296e199999919480a3ee4be553fb25062ba218ba1efd5561c1324753154df408bed0a143cbb64a7363c6361f4ec9e859367671067893138a0c26c962e48cf5d78f9e1d957343cbb835fd22840944aa9a604f6c35386a5860b0827ba1434a1302b9a7c90ad22a4cb8a313c744b0446b3cb0d4d58b502424a0b0823c6d90f69edb2c3502b88a52e37b47e301a434a556714c160c2e90926a27a4081132b2800c28a151044a86a64196c1a75220eecb2a5c438582ea0821a2ac98aa1242b86428921c13c760d900c7ed1483be6d243d2547e3645a24b27125dd22f6c47c1e7314f7a7bdb0c720e5289c82d77f51bea5c47c02360af560b729291267712a00fb1586c4104831b96420003171d4485c9169b3e54dd80f0210f2a90602ab078ae2289e7a56d8a122f5cf5ca40981dc4703203142f5ad0ba6248e2b26549cac28a5361f43d74aa8ac76f12154153a4f1617549c6360514ab07a5d4318a61d431ea48302aa9378d74a32f8314c324b738dc5ce4dc952ba594f3baae29a1dcb071c718a58cbb4b7b803cfc866319f905b556963eac7c70f0c1cb0c45148da004472d95184b528c2fd7755d57d21446244d01c307e03789cb174d644b4d66bb6951ce6e488c9e7d51521a23a591b2804d4abd18a5f4cb9b31d218e3754d193fc6de29e594bdc5469915a30e8f8398d3dd997526d6ebab110c2beecae5dd9d5f7b4eb7676eec8dbb1b7dc60ffc9c92a76cbbbbbbbb71f7851a77bb9b36c61877e76ff801ef393f2e4b32e8fbd9fcfc267637eeee6edcdd7da269127597ceec16661f29834eeceec4664fd991e01366925de0aba38c335e916758866d65e571f4d520666420cc1cd78ca55f987df4db39a992377271d6657bfb4ed9e204296a1da38ca1b237c7d8fd3127d5f59622f1e3c39ef9589669ee9365cec2afd3eb9a8e7d1b7d649701a28fcbb199c2efcc7c7a88c1a904cbbca77e797345b9da3c5e7ef3862d82bee265e61f0c367fab0383242a25956a83ac87d2a3947e451f41e4e49f46e2239932fad8287b7ad9e62cdd1c2f7a38321cd74e3d62f2e9271dfbb6a737ca97524ac961a40c933c974695517292ce9944f558c47aa4055199bd9d32fbfc912b25c73278c5cbdc2ddb65f7b52c76297b0269414c6666665ece82030e98c5c5189d97be05398ee36c9047947730a10662266649c78ec87c216644312962e81762458c71133333b3cf23325288524822109ab2c510a151d40961489c261499851921ac8a2fecfd4230b69471621c608fa0ba4969fc7cb882fa90ae6ec01e36472edf2f817f5a99d7dec1fc72ea3169c2d3ba1c88b6b2eca37ef5090710e3f71bc246ba0a8bd4eac0e51dc0244b36bb4b9736fb1dc15c7edb38b30a4789f9283034d44d1ab39434e6e7d9f7c728edc4960c969efda604fe69613d04f65d2ea42f6fee22e9e1971f0afdeb377e3b231dfc7e437440b264735fbcbb65cab4ae214268b5cba6cd977779097f97291376778f912d53e6777bf8f7578b11d1f7f40ae09ab2fb8b29d4376e8bdce64dd9b8dc376934c0516fc9e2ccd91e8bd097ad8b9b7239f59614913fdb8571d4b37940e79c9bd07d9c9bb0375254251b95f93ebd4fcba7c5be794c36af4cb49b2b55c9467d4ffff46ded7a707958e3027cbe5b9bb72dcd0b57cf535e9d91036c584bbfb8d949a79b370505be7a76b7ec52d987023f4629365510059b8e794ba6cb12b22f2e8e2c42bd2952ca28a5c43c1380a628e179243dfdd4c1f76965be4d26993799a284e77bda83e94cc4e759b2f0d2c88dbf7cc3b8d839a063d7535060acbbe94cd10f056621fa602c49c02b9f48f9e94df9a28cb98fc831d89d03549073859746a62b3d21fa769fef8e88cfcbae018c51cc378a518f31c6103dc65864cef82db97c4c2ed2df2e250a7cc54e613e5d62599fdbc64cafbee4d579d7cdcb27cbb6ac2553e7cffcea86b06f9b4bce85f0b6b1b07da1cf6bceac6531f3d96210839237cf3ccdf7af2bc964e6c974a98b9c185d98bb58e08a2b78f264e6e6e666962cb999254b6e66c9929b59b264ee3002d1299ec8752f73ce39e79c73ce39e79c73ce39e79c73ce39e79c73ce39a95c27622afd8c9a4abb249bb68d73ce39efee6eda4dd9d37cbda65a6354d3b6204debac334a31acbbb56e8db6532fe33009a77a29bf30022d985de262d7c4fc854956425c768a08c4befcf14e31cb78f172c5153116c156ac7e9993acc4fc7a64301460ffc234c2fed0d9c00534fd650e7bb06fe7fd98ad28e2a76f22f974f1133f79b4a23d4975f40b9370f189b6bdf6755a374413c25a8a26f5e4c9f684e3aa4b4d4b79044aa568b7d14ca7dd179f601d912ee5f1490cb29fc2ba21a92d729d57196c1583ab19aff3946f5737242584535efc2e05cedbdfb2f904e84990952f6a0c0a0aea99786d4197c8054d18b755ef24d1bb30629d03b68f5facb246d568ea863aa17c214cb9ed8a741ff57cc6354fd2788c34a9ea9cdbb0517da3f9c2787546b4af5facd211a98ef9b6b1caec86c42d729587075e7ead51a5b3a0f49a0be92ed409e5cf68e52856893e58b2a8c420474f8f79d18b1a8fbed02776462b59dbc91973c6e8e40c39844ee496bb37abe5a8aa554a19394a65635c3b0f97bb7465f3eec64c6691b4b1c476ca66d6819999a5d08298524a2977836e0e9e3b76939e7377775bd8a44f1923effc760a29e5eeeeb619bcccccdcccccacc52665738c5d3672749ab3a5f00805c7d1059b7415e3b06ffcea1645070c66896b851432456810891162fe61244060c5cfe64811430424bfcc887b85262030426230323ff3c39638e0f6e69fcb8526116c3dbde3ee789391598811708cd31db10b8c1aaec0e9ac80892d9021744e219897bba45c975e92cb282e2bed98572a3be7ec5ced18246d3647f2dd40516d8a68deeef3d10bb99ea79b47334e722b198735662cb244c752c3aa39e6600f9e1b902b3fcd3929a5d4fb72e9f3d2eb997f7d57f4d172bbdec8916333b1c5dfd5e6f21732d3f317b2d3f374a276ebf40ee7f2552becd2bc9b5d90bd71a4cb0df354abe9f3ec71e6f9fce5f5cca79f90c6245d90a5945386cd03d3a8e3ee76fb6e77f7eea7c445e90c7b9acedd5dba12cc6297a45e1881e293e863fae552fa3c989dbb2be76c597dd8284fb7941e992b067db4727dd7855dd775b1cf39e575496f4e223a2738187897b4e212b708f1257eac9d030d548dbe34bb1dbbc3e8ded9ed2f94dedef63aaf0759ecec48b9debed95cee3101a22dea99631e106d61bed433af094f0b9b36d77704f3fd126a8b5ed7fc86a02ea4298d13ce6479e5178a26803efa364333469dbf503411b4a018ca60099c233302bc44a40d8a8cfc4d3a52e32362d39068c688e1a36f6ad38298712ba3976988dbdcd404068c98ee5e6a2762af1131c6488233628c118933aa8811887562d0d9f9c13a35e87c69a2ae7299e1a48b326078322e32c63cf79b440619ec658b930d8aeeee8dded77657237c90e10518621ce28c187138e32746252ac7bdaa2a190c59f8175620449b8a9a8c9a58908d2180674fc92691b1e587802184964d0430fad5d6b6c4c5d26ef8e300cfde269131f4db2da0fefcfcfceec536d7b5ba69baf1d347288177544f68c1e527e5f979196961c6878b24f4c416229891270e3f873e5415e95d2729c5b63c361bcf9c7ad98d534a5d082f7779c6cd289bcea5ab7ce238a27265aabf128e11c860f238bf4962983e859ede47bf111d47dc1c137a876fdfc091e3068e1c33335e5353934acdccf826a46b3c1a9ff1aaebf036ea8833333a6e7821cd513d1078a206de8d57a7541beadb383b3efa1d31a171a653a071a6cd1706344fdf1e7a45443a78fe36252b35ba57a4460d699e689e9825c5d040312b8a5992868c8d1f1b406b238859546888595098456d14d98862a30866d9c8cf337a8f0a83ed15e145f1a478450cb6cf7444b017c00d951a5f4a4813d01dcd130f35cc01a514d23c7d6f1a54e328318bb5a88f4adfdbe615056049011b7c0c41c8e7e89153001f3a0418000ed88107063880007e2080b5c313001e1f000048101012f0292004217f4d9935c7d536ae4be9c8c19e03ea3b07540e34c87c7b8e2866adbe5d47918e2278872594830cb3564b1334be3d1d4142df397ca883e81b49cb0b22f85047946f1d3fdf7e4de915795198d53e7c0b60e9064723acf0322773dddd577477fdc21b249899c36e2634a7e70e76dc24b149f9e81a5293605937160462593bae67d78a34a3dec15ce9c68ea3e72a38c7b3efe889bf2131185af9e8461f1d939f8d0430bf3c0214f3cbe9a73d7df44f73fae81a53efac807d3625f8e5d8a731354ef4b4a5c69973cea21965fbddb9f901e28b36ad4ca4a934bf4cd91a13b3426de99b98d550b425a1deb1290153c12fdf16e63eade8db99807d9bd0b73929b12d8f9b5f6c1a2d101cbf3e8fae9f05c2c4c9eed059c3efdc0188d7f9ecd3903647cbb2382da503203e9c473b5cb3869f4ce6d1918d13955545aaa879340375798d940d4915757d610d09c6f870ab91b239ed335115a926a98a16c82a7bda9c76a3233903c5ac700b67e6110e2066853a3368cca369e5872a4a45867762eba87d43daf133c3d89647d801d4f7f56944dc75d8c530cbf2e10c94eff6f0464acbb74b4f47d4e614f14be487379466a0dc5062b0ddc689ca1ede50baf9ed13da9c769b2c35fc9ebe574c1d102d90586334bf27a6ef0e88767851d9430dbe270d9e36305a20dcb76f40e5138a3546cc0a575fbe2866853546cfc4acf07bd2008a59e18aa986caf7f489593569e0a40198ef4903a76f5f7d997f436983ef00aa8c6d79d834a9458dd318510d69ec0102b322576f1cbca28b40c2d29b22176a38b9e78b2f7addfc50c35954847483430d67d154e272396bbaa4328f988594c42c5e2213160887e3dbeb0456bf432562563883269110b3426a44b91bdf3e8ba2349d41f39790e0ba0502816d4da41aeabce6f435d7d134cd7f30a8f1e8302879b8aa569ba649d7b4ef4797aaf399c772d35c6e13cca49bcf6b5e485f0b356c4ea72dd9bb27b430014a42280929fb8100d4a45b2e60ad291bf80172a165841617a044bf9cfe5eecb1bbfaf2ab277f48f892d9513f92fe1863e434e42f33333737c3103d885f97b515f04208bc30e124071310d1ea1e90c0b2310d400b3e3cabf1ec71a505045f3c6f99917288ab3bfa45549b6e3b43d517110bea616035b03a0b44821e6c109e1eae0c966210fe3c581fde1e5e5d7c73341a7e9870941b28aa212e6881c4cd895d46cb1828818c139592acf050d129e28ff44c8114137ae7f276cc318fa7c12b0b9d621753ec9a58bd3e6f1c3235dca7f05aba7e2ea08be85aba98c00e7d9c26b350b81e495d01ec8e23f9c418427d1b77e3c6dd2bce3955577bf494741929d74fe09dda727f7e886214ba225064c260139b65b37c96678fb2bb63645ea46f10d4d1e1e18948989979126dcdedc68db55d994d6666c97c5dd8dca572b7bb05979b99b9b5dd652fa4bb5c489fdbb4ac4b652ea0204a149542892ee0018718aa8d5f2d3cb840c69830671c51b55f2d3b88e1d405af51e9af961db2602715fbd5b2c3d20e4a444cd28a186a7cf1a2060bb8a861c61435f59bb4460b57eaf69bb48650d31a3d3ca843cb5f2d39cc400cd531a2e12886238aa4d0a1c80b273f2db0e19390a22588cc0daa959153e32ca5018747c2498b0c5166f82396861069d1e1474b0e6574ca88d1a20313967dc08601817dc0b5c27101948c521abaa2b06447605a506901a2cc4a0b1062fc8d5f2d407cf1a24cd36fd21a509f82dfa43582f82a8da05efa6a4102e939b0fa30859f9f9fef597dc8fd76bfedb193987cccb16fbfab3f24edfc5b847f1ef187a4bd1f8994acc568e937505f09071f3d74293eaf9e2d9b07120c615c0fd62981c64e1aada2a89b65e60b4177f979b03bd2a93d10188c4e5de7d439751eae36a773212c8d7a87417766bf564a4cba9c73767727659cccbe507ed77599fb7429df244d492a697f8ace7cb6c5ce48ea3b2f32f39d8a3f5c81bf487fcafbe36ffdd1ebba6f199c538300ac3c13621cf62cfb4c665e16829a39fd56d34267faae738e776e78e7aad90de9a07ecba86cb323225f765fe8f39d77d7f9d50de9d488f2d187dfa419a0f1b3ebbe95cb51a6420f7c9675528e8eaacb94cba3974e33ef6490f28ce83397633297693c7d7de99b065cb7e9e06a8c2a8e1b3974dca0a99587f47aacb81a23ea3ee65b6a46c94cca3b1adf979e793399a7ba22326b0e2911b39050afcece420bc4860391ae64867a36bcf8335d03a4d7ea524aaf2e846d78fb1f8d573d24d4488a7ef2db7670639ef350c5503c1e621c46a34666079339bb1ca36bc00ee95d369f53d715e93cf34d7a2bef26bbbc03210ab34229a5300b89f4ccb9eb8cc41048f95403529e79273bcfa451e3a01a74e6bdb32d5a57bc399911553ae6947ae7586764e6af1980f90df39bc4d518d5303e929ef8483aef1cf3cde36a8ea8988735aef67d33a562b0e3e654b8c2d34f7a1736550c76be711c9793a9ee5b0633a690858e7c48bf49c35e85ce18a7bf09a14ba824ce562539090dcd0800009000e314000018100a09840281382c1ed465c17c14800c778c3e7a583498c7b2188761100541c8186388318618600891191a9a220400ec21f0b2476929381f6babed1c109f0adbffc4101366501c27f194756892c6691ff69d606ca20d2dc2389aca3542b0338b61420e859fdd42a4f08609ff460341b4c6c38e324d3f0d428912ecef54fff7c852aaef7fe841a7031d31296af7feabcd23411ccad62e334128e3dfeee18cba02318469c8875e75e57371cf7bc16eb83fbd1be0f8633306758c087667b1101546fa0c4a87e50de3670f71f06a8f6fc9e13f9185b5c8625732e4afd823af0355135f79868588fd7c5671b3f79b4a28e932b42ab1de71e15582addd077f845f6317a023bbbe22d3bccf95387e48d52fdb10fb133275011ea85e684486267c3d319649e48b8880285e27e788b271255c58b362f0252e55059fd429217963abf9ab01287b338634668d3eec5e613eb3795f99b7b859629cd99dc66057b1dd8512af01c68e41dd2e4692ee23e88a109e7bdc04f208574a5efa0c0b9bf80094145c2108f6c1eedac45d8546f18c31b0c13c0f3effb364c7753eb007e60e63d9a6b87557500949537050cbe3e3140087f7d5e03143ea899278d76529b1f01a4f26564a101f82518e83d0f233826ef96bc61488c4ad93e81d25f7f7432866d337366b6e38f3aac4bd1ab7c3d2702e946ee4765e56169f6596baae0dec988025a1f7ffea9313002df29ac6c6896f53922722bb686c9c0b7e67091e07593d9a06280b7d411999e4892c6a4d00b2058801cf2d6f3117cd80453052c8b264711940ec088e5dc562cbebd00ba68e57139db50f309b6f08fc2507395e093e382c298aa41a0eb6930b1e3b55fff87486b92877088834334d3e26229e85d0018da9dafbe17872c44881ad970d302204f433c29757ecf4d8813229910018ef4223c573e62ebc28b4d01d2cea843df87ae07c1f82f34e73c2fbf0b4bea72d1c30784f041c6e06cf5ed61a8bbf6e81a79dea865be74b717be95fd9833e23245da1ed4c8b02d1087381d4a510d8f79799aeae9e51f2405d8db61ea70faaac4dcf287c7677e95146442590ee9f9acfa8432a0f71042ff0bbbdb3382f8a8e99e726d6023c4e6c398d7381d78f1a25e82672517e49eef4a95979d372de5cf9572554f56c1b2fdebd6bc28e4698022db3258a120035eabc728041a396406070031192c063404fb03c88b32dc8a14a672f63cca8bb0f1ed4c68570b6e587bd3c0c08ca081166336c85163c09826d1faac111b587ec5d184cf81c364775a915a7a5da96559750fd0bd71770c28184faa26b4789b84d0082cc16be2a0e81173b8702b5e0f739eb2f35cd26ae838438dbc3c4f55a1293aab378cb590c5bb7b6402ddd3dd096039d0fd47cbfd6bfd7b12936b5835d9f6606c3752f0c0e9e47d71cc8f15cc60588957b709e8981944f27368471ae56a796ce07173c008eb50788ec43e9c3dcc8da83bdb025c7adb2b714276069a2468be34f01b49988adbaefde025f392c8136338e2490bb8dd2300a5c1899357285ed4243b0bd6381086e4e1241cd833a74fdd36eedbbf056c1ef75c38e0cbd3ac0a3501e1e64f82f316d1ca8bf1f145c6fce7b44c14f7f100ff5338edcc0c6bb765cf35e75e34202b0f15e6aa943efa000ada30b4e45576f22e5dba58fbda7f9e94491fd8b71a36c8e76cd23e8a15c8b3f716c8a3aba6d1af6c8bc08250389e07ba6aac10162e888f1b994b57fb87f97a250fcce0d8f2dc303fbda70c54f509450f767aaed0d44703355aaba20d94cdbf06ba347528578a37b26d5a4b4a4d8e6844c19491ffd9837662198963746fd68407a467aab76b36cfe1fb1a88dbe9d85cd07c90df5004d12ac6d3b354430e62d2a575f8409235b60b857d7ab25ef653057aa5bc3a9b9a642978993da99d37109d44e114a20800f0b9d8ff2f9374f32a1e0f85391cce6d03bc46fb822c30758c33dae4b95f007d99c6baccbc7a4668c9d3b20d838489e6056682ac01c23db3c585b0ad4fe8c1af76bcb8edb74684a25f16a4298a96a9b8a2f4ca37f31a17ba5c322a9c992cc802d85bc719d526c45638c22b98c08260f9dbd31c4623d0688216795a34b4351db03c7b8754ec0683454251d830fa70ac23ed0adf17979b37ca85a13069ea3f6495d11cd20f2a72d47a2c4a6aaa7926aa31db48cc862a1c7403d77f5f16332aafad1a1e6a37f1cf456c3fd26f23b29755681b7a7d4e24f1124a1445284da7f88047ce46852fc06e8b4da8d1201c194c80e23d5d0a7add95a626840059343a8b156f035c44858c1f0ec1b5ca5915b9165e9ec0add8e456579627e2fa4807369807e8dc4b00a46c522e222e40a6d6d01e3e324d598e2d0068a5ca38e0435ba33a7fd767719d41b623a516e17ffcf558b7f051513d6370c498fc70b2bd22017af2b50ee27f42d16b0e3f1a8db201522804365f49643233af101903f573b927ed207cd4295fcb7f9f85a2972c6fa9cb97f870880efcfb9b9e02fd40e3a000b03d914d9ab77f9118a26e8db18aabe98f3e5f2a3d72241892e76f49f110c1627e71a637c401150848fc832f6216b0fa84a3f96291029829a03e95f95a4090f23a8fa3154acd8ef0b074521fe2cdf72a317e9411be09d358f662da682d0e16a6e58919d560b8471ff27061528ff74a47dc3f9000890d5f46e928d2afeb59587a3280cf52be721ab5e0aafd3e27b7abfb9034878c07c166d06f049a1c1e0498c0be8681675e0502b25f4619af9887e32805ac721d950228eff9507beda6a4b8c783bb96471ff251aaf74992a4d8f9bd2bc048206a542cde9b1d502c3f7cb0713b7086e6fa4337a4dbe25dcc79b5e8e77d683f75ecc1e893aa91e091818a9f714ecf5d1a3dc168395fad560cc8822edb39f420363b644b027e94d90f771cb96c520cba45c8f71453038260f6260637b0809ce69674cb45cd9632f7ccb3b9b0128907b41d375c7cf74114859984668caf12e2eb67563de1c8ac28b201966c29d171e96167407bbc2175705aafacac2e05f5cb87c5b0aa0ea99928d9918c99862a45a01575bba30731b7c9fb2d1b1de650623225f722d5ae543794c47310c20f77164864b3dad82192ef3fccbb5f59e955c78cc3016d2c5e242a172a91909995938b70e79021410cab93497833aaabfed25e03f91c91fb3c8c12daf8877c464d1679ca5478bcd5315d481b05ea31fdab32f58d19c711b6cb17e7a1e2922f5010d2a43c4844a463c1839a6deead13a8826877ec4f0507a2003c53ea0194eb2a4a9d8ac46c459e4756ce1d3b23f064ca2871263540310136d641dd8ca4520891c1713104f896a111b85ded1539c2b65a98d93cd8fd119f44a8b71946cd8944d4a1052e2404ebf6fc4009148a371fbdd007453f0503ad6daf6cade826cdf8f3b2dbb75f8068614818dc949f97c85a3ae3ffb0c2ca3197350805cb552ce6ff6e81db1602a5d056c81bd215881fd5a6bcd7c59b978ee8133929d27438d3f5c38f5494ab6106a71276d5f3c5262b015e7e796c65877f2a3a18646e9bf8908f774b03af5711c27f9272e9cfa14cb282c0ce8682b7bea3e027e464c25700270d5b7561efbd594b9eba7a4bc6b3004fd99ed94dc56d0d36f9c56cba8f458f4d63f54268a793d9e82a900e083a4f95effdc6b78a8255c384f54c35d92286b2bd3ecbd8ae2c2e8956a4627a00c0c2060049837a3e8816805e68d2aedc01fac0154e5373c9a83225b21be5452a69efd06889614a427f1c27f5ecb70db79aabdc2efc885214005fdfb413a6db8a90c72ae1c126c4ca8f91ee00e9430acb97b400709c21e0f1636ba032bf09db720fdabf4ca4d3195c54a301e961cb3975d8cd4708cfca570a97d30f2858a59160e23bf8c255fee8b3a4b29b70a16f29a2c01fe0b97b0804b061cd3a655211f9de06f328699d72796e5bf940f813339ae2c7eaea859c47e920c7d7f5e5f4ce644d56f2a5c86a7d3e73772921b422f91c9c64ce8543f6e85d09c9c98ddf8297ed892ccd5c9847ac26398f0e0317b6c39b94f37ea2a347f987226d29fdc3ea0f76f87f095994773fae0261e55af56207d346dd8c3ab3a0dfe90459558cbbff8f86b5ceb076dd6a8ff69b31948aa8122e2d8daeab2fbf8f4ff3ecdb1e70e8b2243dde82d1a5210a3809d799eba23d5637bdb793b4550f53c905221e8d442e68e34281419b5dbfe246d21487cfd971b3fd0b33936d575d5ed3d7b1787dacabe7d9bd91801009e96542687a5a3a31f95f664f795a9126bd42b1630d1487608433f7aeedb26e84418929bad2a75bb6a0d0af4204ffb5f671d0dfb48a1c959a71371f433bb2c79977b65557a70f17450fc82e0e9cc21e5d99c35b1c53ed200208c7770468e52c1a6aeb4ca3063e270a8dd2d161a404a873f201e46d4900c60d37a9cff1aca9ec91e98708ea5fd6d950f611d7e486c9df10cd20176459511efb90fabadcb3cf481920e704589ab4887df46d2811afb0bce78c24200b8ae02009a21ada81dc3400b27655ae3cffab904b45d78f93bbabd14a9f13ff741a0aa26ed4549d6fce55319b5bece9fcac7a91e37fc722262a1c065086f053d207af47b87cb79e068b000e8d9515ed13c32af4ee46485686a48bfdc1f5405b131c42d70628bb46259aa8faec3629fe3df969cc16801d635e82fd15c6f9a764765449755144a16e974013cda765f2592326dffa2387e19765a41f9d3e52233c9886c5b2f3bca933b2ab3af151450a3946a5524d586850ce838b743f8c3a245e78d37e44f71f901dcc79e300ec3d07c34b0f5c9930d7105d5d49282f03333ae5da1efc77ffd118a56cb1ded80b2555a2f3b08b67cd5abd7e83dda1c6c026c7bff21ee2c0f9807e7ede8ff3f910a18e920cca0c0c651f7142f904e260d3b321d41d74c0a781a5dd0400da40350c3c04bdb8b32305ddc23eab5a46b42432c2f025bd1739e1f2aa9cc9e2dcd700ec3a72ec469b6ce4d58e8a46cf60a4dad66576e288d3f9c38a0fc7a31c1143c64664a8efc98e22dcb2c2640e89defbd3c3c3b9e08b88828d9aa5fa6529bfa72a1b30fcca40294c96f0b75a4651a043a67ef429b302658c9f35739a4b817896a22dc50a9247f25525ba0651eaff47dbcc53ed8d4c22654e79d2879739d544a9de42f7a2243922b26b25cefe15038bc630619901925140461209655da6cf7cbe30e5926be3ea9af7ade7398abb00e613b61792547dba9a1999030f25601f1a51517fd3bba0e71ef1d90fc0380a428ec71f7a35305ff014992f8a1506427553bc1c8a4b567465bf22f9f6f7aa3228ef0f634ef9a4df963863390cd840ee38f9c078dbdaf7e3be5b83d0b793e527ed2e5dbc5b01a1f6a81cb1b8709cc17bd7cf9014100437894fdabb1e1d5aa297f50ddf10325548f9e1f5b55d0359bce92ffd2bd43e77089f82ce49c8b6603c713338b73fb7de0e65c58b0e2dc17b7ca40e8ff217cc00b9fa3997e282f954d431566a24246cc5e1b50bddd0661d27f129de6987c37701ba3aecf0c3845b95fbda99c11a499c117114b18a0efc899fb6e3b733cea608d39a9254499988f65964819af13fc9483778f9c78f365924d26d8f28597cd25bb36cb802a581aa54299e82e96c449a9f7984bfa25131db290d13a2b4cad8377c14d2aadb5915d37e49f8d3630d3242676deee09326b8828170c6641206840eb045e142e5fccdfd016498c19307b1452a4b9f6d01a4905b97e780dab9bf62af452da64187caa7dfe498c7088d37f4a40fbbf617e16125136f0c8bc4cd897b1c5470d5addfc6aa04a21883f0f62d66c71220614d08f463fd7e4e5329e628aad2e420e9fc0021a20b1721b14d4ae714f825a17d4d16250e5fe052dd4bd57156b23569b0977cb5d243936a6e6bb6678d7af8a42a8641704c8529c457a700135b2f31794e29753c3e5059ae5586d6c9744c9948a28bd92d51cdc3634131e41ff0392d62b1e55cb91f2ad7b56f0ce2e697060e92a2b9041a6bb983b37ef12c725baabc5a1579d1939f7d9be97a723f12b5713faf77cd05d480fa7d1312ff9ee14ec8d9dbf0a6291dfb33dd6b2ecd44dfc740597c1348e351e9533f2c4116a2a8390c384b83c9eaf22ab3de56e5dc6df606f570458d8698acd12418e4c03d4e5825d58cf0f73380b19873c011e62e9ace8b26155ac1e30d95d546232f1a6f3f2d5c6497003390f7701f220d2c031940f6565df8c65004b99c5fad399acd974e2fe58723a014121ea5106d2c49eea1ceca7df369b1fcd7951cb8fb2c509462d8a6f092e20dc6b767809c2b384972acbd866c020fe598380722a5c261210ccdd6611651726afe65ad7d45519da1251d0dc5fd3cf3b84e02e8b7ea5a81be3782c8244530a14bc4e884bf8a83f64251d036f6729fd3d04508a0d2bafc9002d724dc8e7d01b9992edf295db999e1f54bf08dc443228319032ace733db909db508a001db8670bd3062d4ed133250a373f6df40193f3ce1d95a1177b384dd6e34a610654a82fe549b428eb28ca1d3f9e2a4e039cd1c3e011347f4248cfaa4a19e60b9809c6a462f027c8c86aa00c64796cef8e8d105c7b7d228ad8bb97792c8d9d98902f6b4b3530218585cfbc4b0b618b7fe6857b29bb3706af40ba7b773c411374f00e92d33635c9eada1c54c08b1b8f683add6ea7214dacf51865bbf6f749263fb8afa7630631a0f853a864710accb27401411d0993a16a77c2d8a96577446656fd1b81c4131dbf62092b080471b9d999df5fb16e8add1c79044400adc1f37245d84811acd3c3e01803e388d81c3d5f05b532596d6fdb63c2683161ae320cb768a69d896ce499b460caa694e38b3e7c0950f8c3d748ffc2004aa581195641c987a082b47815b2411d3dc8865d4adc4f20d10716e2087124afdf963b62428294adabcf1e42a6c5617c2bc614785060f6dd14e7c430d105085830c4ab71a129fe022b85c39a222e3a023037b422e2621ff19a018f8288c72f4c29b93f1b464f5e62bb2ce2ad68ecdd7159a9150474324c5da871e99c3502f03456052ff7fe643e56997f45b8aa82e74c1b8b997dbbdf8348ccff40a57b658c2e970709b1c3202786b58f9fdb8d4fd12c4396941740c21c0d55e59d5be047ebb4db8a75ba843a77ef7bcc686ca000fe9eda4fbd30e20aefb4b4640b2e723d43e717059883dc575704d2506fb2aef71b8434783254176881b9ba837ca1ccef25a4623e1eae716fb7fb408d8fab4a172352281298d659818c804fd523cec3a2460149cae9e827883dec6ca0bc85d419f6281a0261b3fa3c9562871c719543ec6ade090a0f00e51526f871508dfcc7cc9b2ff61fcd934c77a811b936914a51b4b51be90b33007c9efbe9b137899428180cfde8543a60f395b80797bbca7bfcc341ed48023a8881aa5ef2474a3c0257b7eb18a544318bbb2563530c466301fe6797251d8ec893b4eb8adb7ed3eb2a27d5ff2344567035e0998204bc03747c5c131ce0428822fb16e85fd311ce8b223522449e57cc2762def0af2a01f24ad24b1f551212e2a3ea79efb1dbf06fda61d3438ed9a854b00dd1e568395452aecc8e50bbde08bc93c720e634a69e1782470196fb6560517873675f17fcb9a0e31e028005bfa5404e9ce20c79dae709ab138d62443e03f2a5f9c4bd4c4858b4ecee1ab953789ca671ba4fc263823ba1a237a6356f8bf5d9f13a71840061f7b0c34fac39bff2ac380666551297e03461b812615ac03c911bc8ca24ccac0f0acb3b50e62b7c242092b7fbf1ec29c9694e40517ea7fce63a1d70009b3fff2c303192e570010c1031baf2b0184118554a45e944b1db01bd9c78671b0a1c4e0135d4025d2a92b036689eecc268ffa2b64946499937f85250da23af8291e39a3ba152a117147f8930657d263667d4f5b8db82a1fc5245f259ed35ecfd5b31225c37e16ffa1decac10e9419cdf16f6636f167609510f78af48cb2416cda2a9f01778139fba4b4745b677650030bb473d9da5e74e8d31f849a07ccad9f92fc31831035ad931bea88198c827d046c67adbe0f9d3b8c39806c57e4b093e015008e54d072e13b9a7acd8da340b2fdb0b56445010b49e68a40fd77b338ab03999e8e354b3545225a19ed358277b8b79f04ea1cfd66fee64a0509897abc2a74875f2013b5c652e44cf9eed9d0e2bc3082392ddb6b77b49b67dd4c03ad226b27eb95742478479245b6b3057ef5371ce1a00e7aa720a8a09b41cf6d372782737092d2c9f9e26aa1c49979d46acbbe1c04f5f238d9874622664ef717fe335ce385c650c69d83d3f281bfa37ee070db5ac0530f9cb6b1703b3535d4b670880ac93ba34513c836eca40a8624cf214117497f6f6df02db7fcb0892e0fe4d83181f87dcc2e28e5b4a9334209683fbce6b0b2d30cce0bbc8ba5e2283f090c4f29de7caf8a7f764bb0ad6c9025d44023066449f31418ee532d28733377b49cf3409700cfe77c196283b1d346dc6c5ba641d3a0b23985d051c987094176b5b9c5b77e1cc064ca4ebae0e45ff1ba8d7487a35f0949de9bbbcca33a19a962f67c208c10b93ce7c980db7a9956826e3763c8e24140d19e90d6775158065bb3ead3d6f7cd4e37eca9b3d86544bc9149a711fef6af791162d338afa1f6ac8dc9de2d7931b976cb777c5c7f388a5acb242fd14e59fb446dec2bcfc1bdc4940d92b572d5fd626c77047a67796a6f3a38c56676efff87691f9eb269c9dc2f4e4a7ebf6eb76d2e5ec5bfd76955cc997b20930f59ea5911b9832a60e97b2760d1fb462c39382b9dd5d6a1394f525bcb5a90722599b279c92b8d4a672da581c033f54094c913210ed2a316606e549bc732a4f20afda991ae7b3b47b62d34d76cceb1db42fe5274752de9be8984a0292971af54fa64ef93db0b3892336d947b5a0e2b1f42208e32f238bd18a5c7996f91265680f4d32546eb6937477ad5090a0e000353c1326935feb0972c3b9fe077218bd77269ab35a90fee35a2be321674c3b3b9e05e28794980349716120f36b3712b05047b427b80edede5a6b52029e43fb8286cb51afe579b58b6d198a5861a3e92d6040455e96eec49ab796b3a6836db28eb08097b7600a503cae61bf7adc948b1f10df2088826ca3531a812265c740d69afc7ed3348bd748b4a0905ce7d324d0d54fe4e28670f220a011b3a879875398a34fe5ed1507c903b96902d963da06937573ba913717ac0ea1a208ed42c0cefe9bf21bc9b6845ed6e9b33498190fbedd482ac4c54cd969c29b83e02234b322916fcaaa9455b6dab5bfe66717385940015afa7946c81e017672ea0c5278fba6acce38eadd6c148f92cf1b88597d15cc6e8fff57ffebb3367e260392982487b0b33c28e94cf43d19bea46d17767f1df6534dfb7cbd538fc60eee00f72dc5559e0b794378a913f232861252cb2e0d8f709a378cb4fe68cf49e8e33cac290594e94980f7dd88f617966080bba0e512d6efe51529fa5d3478622378a7dce5ee191cdc98248bd5c3c8677f01b1184c60d6068f6a55e100e5905390b7f60d7da798703702485d73d35136050831378b139c4dca2907532cab4799f0bd28b0e574619783fd4d79b81491c82b30d11cfd1eb7003a5d74a2679683fd3f7e34b3eaf0461d0029fe78a2f1e7e68a291fd46cc3959cae55cfe6d5e20008deeadef5f62e0e0611fb0dd92a5e56db19e6d23a52c43c78313e7705add1301e6e7ec9120e1280fc55eaea3d06b30c8feb8f309554aa7d879035592d7a0b4e0337bec76fc103e562bb376cab3b0abf677107e4edbbf3e021be21f739ead44800169a9d27bc5303be1fe104d9f6672db502c830ef329b13fa193990efdb339142a2f0038ff487a98c4f21f8bcb83a42b60c616d58751006d2e8a82a2813f3a7c25555d5005fb0310267b2506b34476a37a50748f8663ddfb981f92af6561b132932f1113daf35e117b5855985936af2bf54d5b05a57b27d9c26791fce8d3aa7a5270822dbeedadf028aa5d8842058b32f95e44ad2dc24500684c756f6e48575a7e1890d8914c34ee4e61bd540cedc60257b4d41967cfe0084ad09aba546b33a206f4502a06a40d0e949bcef9a8bc809ad026ba18d73f729ef6adb16685b35822d5f60e29760f067285bae908aac48ddc811c2050106d866f57890d03dd5e68c69860a99579e8b7393f1a14bc6a192892ea2c2e176e8faa12f47fa9c91931eb9ab19555f7b480b75a6579150a3e5425dd2e7974d3b2b6a0020a2ddeba36e31789c5ae88cc2821816e4b4679d33fa21b24f7634efc7fab4b21728af7b595df86a53082b06d5cf2ab89317bf68a289f9f225aec93eb55eea38c3311642bae68957b59b572218205a12ee61aeecdaebcf41b3d5bf3ee4a9307d68e19f6c9c2fc92dce38a1ada4b98e7fd1a77aee9000f3360820660cfeb08cb2d581facd0ccc10285e47d0968ffd8cd6847abfcf11e9cede882b47dc1aa759bf2d4222aa5b5967a5e2a27f5401d963f722a09f887e41ca51d21525bbda2b7cb8e522b6499b462c3af1cdb8a4d96e005a6750b071e8e5436cc74db2d30606d40dff8a6192e029bebcbe0ff90eeb86e72a6396515f986d60556c9bb94692f1dd24a3d3cfb4524ecaa5b84c9ddbb4cd289bc88add8359ec81850736a21014d0820349b1d858d71038adc9ceaeaefa5806f912336323ee023407cc4d89568c7893ce36afe89a2f29feccaa7c73bd97d036450aa27ea3784d225b765ad957ca917af0ad4fa533ddc08e0a4821ff1a7740d5af256b58fe8c051b01d8d24bdae5eab315d3d8670201d161f3c4fe66443b70e9a76be198b8982b23000a84206306721675ac2f60915aaf51658c5faa209a5ae847931b274a420bc9443b00c84e816cd89cc50ba6e67a338bc49812820b4dc05ca762e76653429421b2c127f37c2909d43c0a6eaf6b593ea4d29015ce3e1ebe4fceac4933253df4d1f7c3954bce87c17750f72fbd8613fc8aa6778b3450aa4164a508478cce1caeb27c51a6db74d15ad11db0052379297524d860cffa3d040404e29efb49c6d2f404b9447dd4d39ced8e3d870b7c3db072d00ee29a4bca3b44bd2fa27b524a3ae9324af75bc630c7f5f7210cf751dee1070084850eec80c9410d72c7b2bf8a50c7cb360dfd05bcad3c704a5882c3338f401c3c800e96f7a2feea74df1d50e497ecb9e6c66734e81b4146674e8f87239711f1b2d7076a65a745ccd92420a30cfb5f3bb7d3d9a63cc10041167b7fb9c5fff72924ba576671f77ccb1815b74d9562c38d7142e02534aaad67a0f4b7eb61dea84b3c23bd0028d89dea2a58065fd847a9b306cb6c00b161de2ad5d71daaf625192e8f80ee696a6d115b23b2c092e6bb602b7119a137434035e3b61cb09403227fb180f22f650f3f8211c96cd148053d36787b484f0b21c570725d149efae5756f8572c2d7069631c2d3d49d77c1f3526f0f47f032f73abffbe335548cb058c1db281f630258cdd2adf61eedaee4ca0ca6a119abd832200da0740e27a2c44c368a04f7051afa8ea2f0cb1e868e0a3cecf892b849af378d01b0d202696070ee967aa2527184920a5568214fa47806ac02dc1d943da1c754044cf105b3d9d193836554a957e9765a66f553e49b435e12042ce81a7839966e330b30bdbad2a4836e3356ca827b0c06b727a6fdb9e1395dd8bfb667f737237e45b9d7480a49c147e2396572ea5686219a7388b6e9871c5c955c1c22d1e56659007132e839cc4b3ed7aa196e921e0a176af5de89612dd4a36f62d9e474112d85bce87383a1ea91eaf0ff82bbc85faa982e859855b296ca6038add18456ac6d3a624fc7fcfab9a6bd62395876ef115142ed7a9161b86e739d1eef112d3e5fe4ad3f04bf5f563f6d52063e15517460635442e45ee84bb24afcfab64622c369f1839a907c9fa406af080394a783e915cb620eb21cb7b2492f61dce168ba2d57d2df5a131b92d3d24fb99748dc522a4714ff52725594f867e37b01ba3cef04ac390b0e0a4b39b96efa9d5c59843fb1fff0f3c6234800d017342bfb24d08b121214d8666a15306e5d4842ae6b3bbe25b4459858f275e2cf8ce6deea34414a389f2323a34f19be20f66dbc59f16d4d6b68ea18080b210967d5acdca485c49d0822aef1117de0b82896f763f9b31a86a1a9d0bf4d1eddc3081d58bb16f2dd57451e94e3eb8985b348d384c664fc7930b258553643cb8ce370dae9f758c7cf58161e36226f3b1eadf33f91897a2182eb0dfd61fb7a436ea55ef6e3900fe31e8f58bafd055bcf08358d6e54e57bde926856479dd388ab01d16881529cd3abd9e09499b7db1e2ad361110d67f6e96083c5605927b993295d93cc9ead0462e51a4ee4ec0bb0c7edd1da7aca1e7afb285a7652c9b9c56604c1927d7cbf85f84f2ea499d8bc5d772be54b7a6ac871469efa12a44663ecc0ac0b00e006e29dec4b09964f387443a9f11c768ed70c50689a4ebc08c89f0f9d2077d0f387df7308c0826ba340c1691993118d9aa5a48c328158ccc860ab9464006eb1a0471692744bf88defef05dc0a56dcb68f4ed368a8d099726a41827fa8e2568377aeba5137e4b7705615f0555fee39d4738ad7157d291f1374f23649725f2de60543814b71daf479f9c9c0d83b4fb0ba6f63efcb578d740a936e5f18f95d7b1b9d9a131d2c8278e1d3a90fe1cbc153b810a62c1b7f4b96e94eccafe79fd341d1e95c3b7a7f2f0ad050ba5d6d7eb97f9dfbd3c30cf4b3b8aa8ab1ef22ddcfcb13342db098dd2e1ccf1981f2a20a79c843bcc3cefe586079e7a85e7f0f7033f8fb74f82e847cfbb23421457ed9bdd0526d96051ac6ea3162530d4e9f37055af6cc87837e7ba8a68ca8dd051f4ccdc5fc186c749c02a80f04e8bec6a3d2d82699f1650e4e15544addc7abec12ce72aa5746225f2ce3f82db138ad5001040d05ada8fd3dec07e1aa77ee539a8d483a13d96f7ba41699bf45bec83cface1c8cb9c725025f2b7482ec695e2dedcb2b2db6a45822e3062c4b4d14aaec70d411f6ccb385894f8dab248997bf8fbbdba2561272c463e7a1d41999ba3cc2f6b1977812187d918cc2efd03850016e87d2ccf372bcc9027b3fc29383103c907f028c4f5423e714579f27384e6f1c02feb0051f8314c868a59165452f6f2b502b93dccb095adcbdff38cc847e82adbb220c51b0c23aff2e0e55211d60181efbfcc65a92549df27a4acf6dfe37f907de452cdbdfbaaca4a64beed3885f96b9c89f7d0a443629b8d6f29857ab0c8cc897d26df277b05f92970f09bdc4078900856585d3727fab35d086cb74fc433cf9a4a895a40880cf012f09d93b7cf43ffb1cba11894efec58c2746a972af997bd00c45722c88fc88d411721e2b514667a923dd1c93617c4220117b43485ac8564302f4fb91e5ebbc1c7769b22944e9777afaff645603f192c6e886de19a94816ca03dea7d407bcccd66acb94e8ef36c5210ecd6ca0add0d9993a1a06775f3a775b2f2f1c329b30c5c13e1472759888059a5c84a6e0f8870ad42d1038abfa21de3ade6c678d84c9a32f9c314e5d7e1854fc2bbb2bd49888326060c163933cbf581bbba580bd2efc302d11df317ece32a1325b08c3b34ab9aca95ff1d01b8f0c6a2a4685c666c78238de7ee145660f3d49cb27b5f7283396c149d05f499cc9cb39df6ff7cc57f0659a99ad430e6e9e17a01b10cd64b8369abda67f0420363a0919140ad652b296b9359c597861cf14f5d0155f9d1467ce882de98ad6937e93d9da2526ddb2f53d8ea05ceaeb4b0564e7441d1e87ef783fe4a72e15d5d72e6a04dcee4fab6e53fa3fcc760c21661864d9f23ca5104456b58867ec8dee4cf3937a9db72da6d9eab045f81f2fd60b8f8589cfeb1be2da881236ab5d591f884c17956fab558a7c4ae83fb7b4bc65d68699a0dd25e2e7d3f21e81bef388ba46fe3130a37b1ab9d77f2c06c3f7599b56cef387ce60afac1ca7f0e14dcca2c886d0db01ba4339b0de6ba4a857706a0563a097d85c4780857903c9f7d16e79dbdd09254c467071de5c3af89ccfa69a2ba2a2c51fd5801f3ca673934dc6961f8f4ec0ee37b00e4a044f20483ff8767aee4e999cb9541949c224bb212f126699624007457206652d12e65bf8e56ec3f7a72fcd69a6112b6df9d0532263c03c3c4ef78ec02572031c4b1032799f13563d9d1bd819c3bfc7385d4da84301ac468dad06ebe32aa1d98a6ec63c5bf9dd03393cc4f621e6bad62f2081a27bdcd8a074f8b279c1a5b634e1b24695e7a902c2afc55bce9bf000baea7f37d2830f54d97d736cd6d8356fda8cc0f1981e983220e9c42f189de72033a01e901a1923d4528ae2570055ef1dc0f091d32377c9180445e001dc92f16ed611a3ed83f7de04b8fa3518bcd343deb26060cf5ce08f3bea502283a0b192fa336696a6fe259c993a3d1c88a4c3f02743ccaed1e2ec28b67c9350728ee0196c49d4540e230ffe10365e7bf45c8dbe19d936f1ef286be16cce0d17b9f66c4ab627a1cafa82f32f0d70d57e11926704e6825d88cf7f361dacaf230a71891cbdfdeab77e6d4b7a15d266de110bf034259f573af4385e4066f4255927d8b8045323ec706fc59019b843cb1eb174a968d4449f4819e46e15ef1af8a4142eebab895f94909aeffecb037c0b77f983138e4ecfe27992010603aa10e3b41de5c536b848021ac3565dd163d2baf70c1754dcecb90c8a2359b49db8267ec6b843da597cf499a3f66e5dcfa39e62d75efb0b977659be75495200d830220cd6c44a9218c49730c9b296942f83ed001346c8d314544eeea351d108cf889685a5918d3714c0de2eed519927d2a72067069191ba934e83cc928393a40f0460e958868f5bf4c296e85b8f2e7d6454ac4db9508da2856228fa7d265866711e0a543498546baa78ed122542b07b621d7a35f5634908f48b35d211b2599b08f20de7139d90a8d18aea23ded5c2b25b197ff1b4428bc0321eec11e55b59254ea13a5b91ba276748c93c2b6849e88eba9dbddadf301b3b5bb21f0d36d60ce3eac059a334168753bd7b801588958efc7bc9034dff0f650010e76f75dc9ee6d1f41b253ad7226166fb99dac8fa1ab996d9098007013c0d9c577a1903d98afa593311d2189c279246336882807f2c6d4c1dcd8382de0063c7cad2b5c094aff7a1eb6a8f725aee48a075a060e50069e2a29190da7a4bda6cb2a0d005f860437a044cc284951768faec00df84dc6f1433d758434d80ae4a45a108c2b4eb8be9d528297ff40a2e388ec01493a941d5b08f4a9c0707271585914bc3b500ab05c307cc65756f4ff1492a1c90960ef068814bea8bb1ac8eb9e95091b76cc9757258ca4465c430a31bb65fe6d8ee2ed5f613fee0d08a20930f88430b3c82011f59c2fdb9bb255f6f77ba4e6ece883733301826beb4d438116201f1bac1485f18333f303f3488f819af8ed5630b007729346ef0bde247076872c46983ab22a95256affaa458f40949728ecf7429185ff0cb3f90fcbf019cdfbb78285e9a4cbfd796dfe258c6df20602aa17b16f5e7edb4122a263b96b09265915fb809f5fb505f4d506130435255b73f34e6ba05c84b9aba9b7c0e43bd6bfe5b63fb80d710815b979da999035dcc738adaa964a8b809e715bde6246c18b376c1347f84eaa5079d93d62f023d3776c8a44415c4940aefa5a28f30971691554bf90bc89870862c7fe492b02f6fd6fa32ddc00e95d1d3c968c0f295cb8102656f172dc364a9cd395e8885fac88da1a88109bca204bed92850b51107580e4eaa4018f50bb695d5d09062ca320619d2a5dbd082557520013e69af6751da65299fa41b47061ec07fef14b0b1534e4835367d9c809f28d8455567f543da829f8cd1aaff6eb91e30c1445bf209ee99d865783df3bba7feb7ea634974ab14abc0c85861b7dbf90a283a3d00143292094f2f1bf612f94c4932b735e80e8b1cb2105f829c7a98a0c7dbadd83bf4fdd23f045df27c3cbf9e7e97671f06a172043c0aadc1ac846a56ba8e8c89ba6de71417a30de0c8d7aa1d6fa13fb878b8dd3f5ec1672749d88dc563586bb6275d253b54fab30b810b68698d1cdbbe8fb54789261091f4484ee9e3663972c00c8b24a6b6949071f8c45a2ba7b7e29120545c60529ce31a4156ca1b50ba654f0e1801af43ec1295f0817087a5588945a609e0d0552d29aa521718fc5ae77b163c64016e8ab4d2760a6dfa22316b4844a9b3e6e93fa8c3d8d8c2fcf1cd3c11c5bcecf820429b42c1ded516756ab4fbc8b2ba200cfdd873cdce1f9d8eebe1cd53e1995446ab413b96e1bdbcd828110c15105e0e7c3970aa76f93a8b78c2ebb00c0eb05227508e109f0ff47ae50d6c5f6815c1084786a3c18f4bb359bb54d9b8556a7cb5acc8a7b5af70f77c885e6d97a160229db4b505aac19fc65d5218766720881c54a23067027472fbc4d75f187d9d996533acabd3caada6e52c3701bf1ca76c0ab3989f826214a4dd861592910986a84ddbc3fd85465fa924bbe4cecd2948b4277861b0e111bc9c5ebb1c0efc925a01d7a4d8cc00c4fb3ffb871552e52a158556a63900261d842e960c595073876066026cca1aad024a060f43a10141457e295a834d02e058fc303548545b4c4620836f00ad50fc9fba6c4d170fb15f890108db2249e08d2338a9fb15099584909eddb11626b9b5bb97bf741cf3311c65a97630d2e1a7fc8dcff0be32893dcbc56ca71db575ff69923ba6a6a8140ed513e1b73475e2480b02b110e33cbfa483d9a62c835103c0f60cb12c1872bcb06d04a1501a232360600c2ded961faae7e4ed30a5e24b5c3d6e228150ed4f8d38c4c1b498ff27def4f88be0452c5d1fe1ce51c1288f063a46df73f06b323684534fba3d1901e74666a1dd863bb6335dfc0237c3aaca7544029c9436bf141da3c27d59dc57ade87973bfc9885658b9d96fe2ff169877f74068089e52bb6180f81835ca7b170fab64a8517a5a02090064a294f15bd5c085ff016ae74cff7395705e9d5f67b36f108df3fd1f6bd3d7bc57e78edff12adfac36a19bcfa33e7aa794711fa5038c6f43104ec78135714bed4d834c4990ec4b453a0f6082a2cbca26adcdd5df684cd4859cbba7ef986c0eef4d2898213f2b70fb01bfae00a7d0c0051b4dfe25766702e9d2e82c7f02b1f4f3b4a857572536654988a9b481881512216c8d029337834d1109e0e61e0dc2382dc067865f9761b48251c268de02d0f0a70441fc9af0d2f197275b2b2147d172143d210fb3abfe0e961c0023854c0df0b005bd17a949f9e8ff8b5b64ab9bc9f84c7856cdb39d1aab681e5f729c30bcd19257308ac0e4bbdac212fa8a7677f6465e44538d43c19b63e046fdd9952cb75fd5c6f46462d19791f4074b0d0cf16ce1a59ba9b6ae56916b8130bee1f17b4a2b3d7558c4cd4c369f5359da9ff42a6f64d9d41cf85b4be90bdd76363f9ac0a9c4e9a363236dbf697444fff02e5cc04b46cbdf3b351914601e0ca5e6d2895bc812311cc3b7a973b153a358e1c91ab03dcf5ef3a7a8c0ef1e9515ffd7b9dfe19cbaa671442599aa944df55dc06220d3d2b86b8f45e83968092a4053d1b5af07b7a81db3db7556f27f8fb4989348803a06759294098d820550a47e2ed41028ed1a493e08cd6e09fd6428a5a82857ef2acc9c13d50c1ae05504e48f8420df5f86c1d246c59a07f86d3e3054c85e257e329e73a6524568be55c8d5cec0f4a78c60a90a969939ba79adb916337c309e9bce857c9a7f39c2425ce0ee57ca91e1bc9c69862660190e2c908c4090d30d03a0c685626d269526b52f5c7a6b1db1f738e78f1fd5f0383a70bf0e5ff1fff1ff2b33c00ba93766059394aee6e71af43ec11ee3273d43d080396ef8746d1ba0a1d212a5268078bd9cd5a6fdee0a98e52a6d62593edaec6dddb6e6d721396db07ccd52c55a418790aae673d6c072fb6eb2fe6358a5150f70c69ec0e9c51741e9dc275e47453f8c8e045d7a0ac072285bb59fcb17ba39a6d83e0772958e41ad52c6a990c21057e56ed2e9e2a0fd8286b01d5e87e6271f92002136b592f4e9b163e74c805096bd35add227729a9b8237c27c35f8099af1325936433235c23546b2943cf1acc2ae9ea155cead3abfddcb18dd3db1e19418ba7ed437a4a2315707bf3f1f1e6a040cd5990cf14a8091dcf4c9fe43474b3c5f4c9f316ac76d8aa013881648106fd67f4a2999fe9d92cfad5f394d4043da6a4fd58ff88ac52f82a750eefd6345989db7f368eaecc53caea4c416e19f873c8417dd4d4919dfd118d6895e8cc95b291336d902bfd59a54f72126e3478fe5374e43991a8d2f5fa27ed3082732d4bd9a751252cffe04df2776092052dbff51a49c7d6176495deb1787e1c4157022f6d1ca03c3f3d83b643039c3373b88fa207bae798e1a07e0422c9d8877207c6606178f13606eeb9485c28741d54b1f5b9a6ff41f7502345fb04856d9004865c2f6b7408c96375a08519b729bbb9083696e924fb382ce5015f8812c473cfc3319af42979ba55403479e32ceefa02269fa199979a6bfd083ba07fcf3e2c6cc5ee022e6cb91d81fe1a9e88097bf23c79e180330f0b4c0ad1d0ae329de5df12824e87a5f04475b337a649b8c95c949faf38e6f0bad45f4511ccbd27e6762b6a8b73cfef3d11b6f4b2b9a82e9d24fdc91afd000afc93f4fc95b8f8453186c289736283274cebfbc26de7923952d9ffe805b4214404b5df2cb64006f78f5d6a7bd0af8bd70094c08e7a133d00fe1e9365e08093d50ab91079edcdb23b55000240cbd3101791a75d69c00e7387807c7d4e5f05e0ccff15a59fd4dca69959a28071f6d45c4d688f47eb8f9a10d983475ced98134f055701f2276852e6731ae7a2fa7e5168b0169ea6c9e70c98401ffd62146c845fed7ac49582fcfb2a0ea0dea159c543baa0f7cf39b73e734baa3ad4d79b9f50f73952dd16555e2f6d87d60f5b1ac28be7bcbe8694e80c4995e1d0042c70faa97d51a64566cddc77e03c655042dd91dbb33039cedae4f85087c11516732e0253439d14cdcd63e88ac681533a3f62ca8cb82afd623735e9eadc6a2c168fee647f40691c860619b2be566e8f1b2a61d80dfcb86904ff5161912e7823019826c7d1b81cb2359ccb679cea5ecb426310058ea61653e6e9bb251951c0faf7d11364c37252849e52f6ca13ad6d3941ff90facb7303923feaf662dd6c57e2dd15b676966e15ea83af431fc6ddf0c54e735ed66ac50ae01d14ab611515c842bbf8c8b853050356d81cea4aaaac94a8eac16025b14cfb29e7ccdfab645429e84459d24ddd68a668d96fc9ac5dfb83738c4a0700e0691386c9e943bd2964f38738cd0e86823d4de8436ce3ba055dca1d8b42e6e52120a2686fe327c6aa93ae0e01cdef43db18c329691da937ebfcefb0fa263c56354b29f36c5f54641434908cf58a94d63c08c662a079fbaf0a12ac844475246de067b9d10c663dbb86950a004f7052647a7ad67a8bb5c5773f139e6bd3e14067ac167ab6f932788d9a59af64c41499db18bd5db69738da839e02805597ddd8770e26f9fb7688125d41a16800887092bbb9e0786b1e181943df4bfd77692d34c368f383c2da9f91529eebfc94c5473ab72a51b2ac95b0bb7f7167492a2f0b255e7b3258f0517c96036998ea64c581340c55470e27d3ae4f0c866aafbc39af5443f695532effb53a2ed7d0ac78009635f5e87f9047ebfd042e6fc219352a23676b4833f0a686f2f2cce8ce7758cfaf9161e48aac5ada33d1216332b1bd82ab44ccc5790155393c547de04eb803becc29a326c75940f3b0aa4bff71a11357fa7fc0fb0be8e3b73564eb9584ae6b7ef798c01028180312b47a75d31825262937530d9c4b4acce3280aafd52a7e98dd9c0752f9461b63220ecbaa37bca367fad478ffb88d6d15457e6dce2abca04bf35bac2aa771d797f82c412701f5b129fd799ad9d865e834ef42de4de31632b76e74379106f016b94115324edee0fa165a9fd0cc097d5fd424b5c87d5b7ad364d514e8a7acfcaa49cc9587374fbc121d61c04da311aa772db5bc19e94612e23446a4dc2203604ebbf23082cc7d0543772324231ba83c5e50f0bf2030c13a5172b15cfebcf6eef8ae4024b8089abc9a04e91aba2e1b4e34799d03f17cd0e7cf90ed866e7963ad743171ac0c2471c300d7561fc8b3270b5adf36e2377c04258ad8881bfa6d5d5791dccdf076e687879ea9f04c2fa963207e3fd14a607439b5e7af463269f8fabad5e0f28b61054a3ac63e7c9f181193fb3d38ef8f0d8482ed3378312e72115b9e7c145fa5b2d11fbf7d141d8c2c4fbd78cdbdfb8e82f8c5f8d76845c5a83a534bcc91e10a4e545d4486e0bab549a9a27d5058ba8e8553e1dfcdd7c81a65a50c111162a61203318340eede410d2f5aa933722b4672c10b04350ff29ac4be74b87a58b385a87cd04f7b70b50d1635f159832f17d0724788d59f1a77c32ddacef4d699c9e36194fb2112a0cb2cd61afeb48649647cbe32d8fb69741e123f36df36fba2dcc509d13ece972e8eb16b9b8f821db753c70a45e65b21336a41237a78d1da819cb8ad6028765c6f796604f96ee1067582ffc0cea82ddb9531d317550f19fe717a573056d69ca17166122af24b8a6e1e74923b0437a1c75cc62970356bd8c707a8a71c6711d4e6f9e6ef90106da7ce49542d7aac0f29f52ad26a3eba0f24514eacea5b23f566acbe8a2fd6b3e22b23e9bf474a93c25be3bca995a74980210210397338c78a186d473de7813f246ab4848747c2bf3dcb393a9e87bb68fae9e13b8caf974464aaf0b2f337691cca9742824508ef82dba73af45ab4ba1c1c5e8e9c489f661978d2e99fcf7386dcc7afcf638bda3c44fcfb5e29193e73fe841548e326261e7289e593edd014764edbc254e76e01c056f1453b93fdf5d980d7d1cad2033ee08c4639d923eca4adee51855b433317e2e5d3a883b9811079d58005b67727a4dfdbdbe7315dc6f65a64b5f2150d868240edb1ba9062f40e950fa9437664593816c093b69bf3039ef944aca30433730ccd50e2f10f90c2078a3ec29e2c5b1d205709ad158f9b33a407f711790878d9a1102e1eadc52812522254e1593c20e893463132b7205d19f70596b0b9482fa8b67278ad57f08b89999bf5f5c96ee5090999bd40919242b06cb4cb82128387926f971e96b7ddc85ed031ec6eafc9ba2b27ce21e4f5d052500f3a6ea743e4eb6ecefa92335938a46bcb970fd1a96a400c99083b8c86c1c6939cf03284e37ecdcaeb753a11d021f80c1a10a5a80660b3b20522a5807fcccf3a9ca8cdb0493ebc2b5360f5254a23b92daa32142506c8aaa575e901528f8e06f05ae60facdce33f30aaa676debdbe667530bebcdaa2f2a594bc90042071bc9317549d782fa5685de18ddc013462dae8054704724fef2233c417c61f2b1f174cf93678f4992d4cc8f508688d25280a5b320770006dae896237b4d700a1e691bb2a90527f8918c812205f32e93363a2d5c7b9a17b4fd8df6f37b5c2d6e2ba10812300b9809b52d5d3b26adbbf69ea366b0fc116c421dc49a79bacfd0c462f0d460e1fd96e3103d6c6fb263fd57611d85cef32bbe213775b87fe2d8006e111a767cb46fb19f483bbf4cf5c6cccfaa862f342e86ba206d5ce9deea7ed0c3a9bcadca03018b7a1e776cfa676e65cb19f9ba70320ee3615aff2f1f6bfd07456536af90cec5303b9be891ed4659edf57ee4b29a5de47edc00591038e16e074f50d789e1b29970a821d8544cf0c12b0772267ca9e36ae897845ffc9623eaff516ed3df96b98ed6d6968dfc14e6856a9089c5c04168962ad171ea74ca7028f6ce851286e1cd582e35c9720a5ecf76ba3f75c8a4b07a500bee84930959e5016fce40e45ad1e97672bf7966685fe233138c749c0b2559f1de9a6842252e65dbb1bf44780f80c6fd02bc3546f2215cbde21364a8b6f7a2d65102269a8c11727f06f1200b8fe099bb2e7c4936fa3199251f71a4f087fdf75da25de1d5627428182066f4a626e511d689fdcce891fb7609edaa83191085d56a7242bf9418dce6b8005f15f96e80a767b92d2801d16df6a5bbc9c2d89d3527817176d82877efa4888236b7e16c8a3c24d98b9aeed84c036b79c0717511cc4b1ca476d2d28a67bdfb2dce9a651bcd6240b7deedc752bf5fa60c8c08ae8af9802fb1d8445f5b98ae0e09223dc8bfa9802c0544fc269647707a42d48158aa6a6e749ad94b47a83da2b63f2ed7e986452d2fbefa97b7b3a73f7fe600816fa1044f170362e901b06a16bf784c38d967b4402c48358a7d2a3c666fee936c7183e12b15eb100fd669e7c003e1fb77d3280060019caa7753b5dbd2d5d60ef3e5e1e93c24bebf4d4fba41424483a714bc0c6d9a22aff504a5cdc93050e8d830e482d167aaa6a6345e8d22aae921444f602cfbf4831eea2d2d81a762337ad64b95ad8c82c1cc37802f51f68c4bb4e112ebad9fa7b0b103b432ad10bbf5f0a7128f22457888287892d557fd984817fa2aa95d7280066aaa22a9ae18e68b7bfe1a6b3bb7e3e5b42bc46fa1b58a9eb54cbfce52357bf89544346d01636afdc6c4ec22386b106ba4d0c85daa710bcdfe57f25fd36f616d6dab806a2175b1b4485d6b073d54171d5189aa6c09678fa251a520399af07996cf2236f2ede5e166ab24b7a0893c4bef807f6c8f14cfceb860b51e8bd8a5b7c9890854b2c54e0319c7cce3971c9465d649bc674b14ce39c8ebbbaf73da6b2e78ffb9fc86ae5a8a1305bb345668d4fc94a699a66c0665035b74b3f00eceaa22ee90c7cd44a820a04ecad16bc8eeb9c486015a00035a0ce2055333d00665c4d85f97efcaa7cf5fa5e62295d3483c36abba2f9a9cb0c819877ba5b297af86c16657c8f7b97986a3808b1a2e28ec9fc63620aeedafb03c234a8c72963e77c380e69db5364e489e682895bfd0b9d8fcf45affc2a114bd54f67b96ea192c2577ffa4adfb1055229cce8072ea1cbb970c5740438a28b753ce2d288fad14edd4cee31d30a1b15588cbc202af50081f7d1ebeb0e575647d4326f6975f97eb3205dd2ca3c5da14ff0ac759a5e625697edfa0c908384bdf029c85df1d901f6dd38516d6947b71cf569b75c7a3805462db900928b2e1dc98c524261758017e4ed9ee006f2edd755de270165a937e01a9ecbc3b9c1d89a8cbff945bdbee95503748b409949d11ada2f0816901ae547abf1f17916f7f8603400993d3e30fc9fc8cb25687e6a4b83a46b4bf0a79b1a38996a3c0e40578ea0a96da134cc7c592c11786fa4da4f00e48f6f4a3d4ca57e34f464e49265c45d445d1fb5aec1b6e6f78e1619c3ebfaf0601c34d884b044ea7e9435056ccf4142a5f37cdd057234d3e2cf73e38865785dfc364945b64045630724e158208e51bbc72caf8978a6c7f04da387a1f1bd551ef83e54ed61bbb93424ed8e444ea8846ccefc41721fda74cabb9415460b181a101659fdefee4a773345a4fd13365d4dd63c0930adc38b103fa604981b350ef40e002027b719581abee3304a9502e7aab62287c5911d89acd0386ffa9735f86748eb23ebcb86df39b58055ba004d8be543de11c8ce3f34bd33552db7de0aa59aa6d3b694c4e66701ef9991bfade5038d5045209ac6f1c8f32f8cec4a78a064b931ec5162e4b6c258981bf4e46d4f8c6b980f7bc38102f02e51a514daf8224124cdf57cb487298510c7c5af7ba65669a6f6ed73362d74943289d028638a0f59f06c9cd99066ea2f8373c8211d72eb18910cc9882ce5b164a73fa4a23d802245a1302b04219a4905c1942f247ed384e38f805969220c579a80c095d7bdf4a829f8226ca7769d3b764c2d326c90cd0cf4d1b3192be0169727acbd1428f0639a60492f3ff9ae22a1a4f973971a3f5624495efebffb4a96e037b7774fddd76d5f177235ebdd561d3df5dc6c21b23053cb02a61ec17a09f7d6b13bcd1a2c0b168fbba6b8dfa71178f2538ff93f7a6ee503213f6777c795e36e3dbdaa238a7a8795a6415966e408d3bae7edbff9055fccf5b8eb9eb8e3fd8273d5b67d5ee60788b9767e387798d3bc6c3bd08af64a9e9ddad38a3a978f19d5cd927882624c9555fbd166c012ee76fd92832256a6ea6db69b0da2d1c4716022a07773703b2148ba67abb6497ef3cc46aec542e45d86bb296cbb3039072fdc31baaa9fe25c91f66d15b3932f5c6e8b8c1cc8e84f07e89e06771f7b42df4efb1c096e267604fb0718cdccca62069eb6d5adef69a6962d3661a77d578eb7cc3c6dd1193f711b40abbf58a9b397cadb335720ec1dae7697a575a8ef7f469ade21b8ac433e77164e1686f9eb91a217aedbcfa4f21cb8859af6f7f5068df5469062b0043fabc635c387ba4ac609086ef75b7dac1e9e5c4be4c71f6e1b850ebcfb9a11b446ceb9287d101131dd8efd05e5dd8950831aff93dad92d7b07f2ac2f76bbb72375c1316877200623c3c1964b468ddc63e66a4fa39c1510e5330b73bb5037e0553bf10f1d9858fa8861533e2b34101e08f9adca771f489ed371ef0af122d21d258276b1b71e7fc97a891035aa8bd778c3e0cd0e22d18830487a82a89c42f576c50d21443319a9f6c2c17f81aa6964f0976e3b0be1cc0afe11767a24ba89fcee71ce698196140e405431536734dd7df0cc209ba294bb0735b200563db69d82541aadaaea28a8350f117007d5f268430d323d6400155583175f95223311f5e8db6817e2e6cbacfb7783a92a02013688a75e97a1895226140fee3ef8ed4cd795261f4be37a0127d41cbf1881e5cda05c27e3d1b89bb158df7a3a149275d7f78566dd7daddd11073f43f05ba8d1345e6b642e3ff16752efa2c747d057dcdc4041f2c1c7711c05a45be4beb95ac56d55c57a1105531308a29f9a1c2b2f47571d70f41d4ab8192e70070961874576ec020a6b25e66cc1ea05bb8ae95f1a81abd1433815c7894b67a56ede139083ce94fe71924c7bf321a3397140eabbe72e5d369f94dd0c697df96d9a7ef60175f321cc9d4bedf692d5eb83a7f54f04a8d53248842f54e1c7a18926eb1deab56ed106e55ad7c529f0bdf845669a9508f7d755aa0ffc821449626036de353b2d6e2b046dc05678e82bca6c1e33b5d4e1a45edb9a339fc2ce3042d3ebe13a05ebc334c11355447058b13bb04a454064e096b448ac24aa7a1d532fc4e303fceac31e556a037d686d977d2769ce6409542b0508575c4da93e14caabcc6f4aa94b552e9bd0c2a05218ea6021d098bc10c68a85888652b48fad5bdb88acb3f4b225a4524ac0d9c529f51c62e53cbecaeeecfed85693d53a5e6dc207e6cc1b4af74635db04c8f99e456dfb4d55b9466ef6bc54731f9e6c9ed2970ea33dbac294c9d599842f0d0384f8475466b249dcce37abeda6e7bdde9dd3074802de22541f4ae9c349418f63c8ce6c86d2585b698f8ffb7020711b2e354028a5144d58e20f155e7ce0c2e78ba13d109e208087fcee19c9259c81df01c6ed802751b9c484bb7344b629d714a489f5b68dbb6a4f35008fc53448c4a98657b21bb5cb579e1918d1f2a34dcc0b4d158be1e946cbc16079e6cfcb949e710fd604e7fc2264563940723a7e95aa356a2c107cb6612784e25e039f4dcd07155cdc55be07b519c3087c368e275d591eafcdbea7e6404a636f4200e612ee651e0bb20d78d6fe30f2fa6f08b048eb67708dfb778e4f41ecbb3a89a45f94c4ec6d812c50bec87652e5420a74c35142ebba381d440b2d3efbf72b4ca1c8d3699a0018efb19aca8c7859537c755cfb8c9fb8c2c9cd6392e8fee601c0a90ef5a9b56bb4f07af83413e1ebb917662b9313fbf86822ac301b47184bae68db7b51df352853231e73960071bddab7330a4926b9eb1ae95dbe46924d60a2b6cd95f8ce413123b2ad7488890f1a07e1b31f368ca8f1428eb87640f45caa70042fba128a88ade7abec1613603b99c8f1055a18554e4b942aed94cbf141079595fed78a40fd577e55d87203b9cd12900601d17abea6de10370d73bf62e8e48a23f28a3dc5641013964b1fdeda941131f93eff0044642401f02413a79104a6598cc1289a786d1ebdb908aa19f1af25830b769da773cfe952177119dedbaacb211c27ab3df9e803d1215602c5506bdd5b34f97c05bd8b72ea8c6f3ba1788a401d37f1aef544a743592f28a497342225ce5af1ab117e2e3acddf7aad690c1d63fdb5b62dd1ce30607e15e3a1a1d44f14524363f21918de3d151afa8027c5daca7e002dfc6c843e60c2816249033824dd9e086138477544cfc6225cb63ff56c2a18656e73db57bf6703567c25780166ffda172e25d39a49f01dbc275db192b75685eb3f6ba540f9c2ba1dc198cdc3e670583aea161120ef11c9321df689b721047bd61e6fd32adf4424b231343c76715f392849ddfbcc913b1e19b2c828afe00cb15de46e3d4265b29ae4e5550976b2b4be07111acbc684ba7a065ce847941f29f69aeb42ebaa1aa0552ec06102b57695b3e3258c415cc9276c5fc1ae8b7061cf4e211b29f19ace5d9073e1c517258e8f64542117a24af92ae66b2359b525851f19c9cb272493dd9076664d250b52815dae419e7e0ff4cf3a9e36523f809115cdaa7ef4f5d92c4bbb0dca5c99d5bc84d2240e6cf94cca12c51cbf10a554b10732708a4e569e1ae3141af89292d2ce455e70c5c6012de25ea58dba6937ba5e2516140664bce3c20991863bec90165c14d3280d345ccc5b433dcc374898b1df85688d5283f69487a78e3bcc6fa1f203d3adadd882838974fc524b25e3b308b63d4c67822795064d867798580d44e2d9c37b0ac3f1c215fabe6a303946716131a5513556b4c23d4cedc99ed5ea153b09c269a5c4d0964d598ad614b752b8aafd3459a90d35f214d725d27a15335800e28381a78f1a1e6bd79cc1af6253ab9acca0358fc8c61b675ea6a38b1fbbddb4f7a8bfd5c684d8bcdbd61f155c41bffd355b7ed90085f61e9d8fd0d9197cc1ed667cd5315cc967b91d5b08f6e53ed2e69dc391f782d20c870ec957e9c87ee3ace30211fa762aa3d67529b78fd0d29d0760f861ceb4971e011f6dfd41320aa005cfb6f6b6d74c89a01ac0b8ef76e95142cb55049ee0be3cc9476a45824fecc478d1e6ba584d167483dd4d35e858953362e2b7cb85b99fcd57ddc2aa005ed28bc729eba6911517ed913551aa96eae75174f1d97480ece9a217e1b9ef342bb5d533385cc7833157628fbf35b12f72ca0c76fd0523bbc3233b9b613fa8b88577583d1d2e9686611fb9fcc4bf2064be4ea8dedee40c8143585e825093d7f7cac56b1e303e254d639b1e7bb0f2a12462a4a74d0bfcd4eb44e22e70700f4a63cc948e059f529cb868b473f37c63f2c45015407d2c370e6a57ad6a97f2c5657e8d72202f2a4fb3c2f8f57f42104414331300a6139c8884bcacc66b349c02ba35d4642e9d77235815e732d04e479491ad0b9a0b929a3f225785dc9ee81102b3929de4beea2f20deee81848e49de69c76e25d8a558d794448ac5f2724fb59f5d9013ddf7964115a8571760c8d0a9349a6d4a20f901c64639e82ba0469938d7a637db42e8b5daeaebe149be176c44bab9044699c729c44727c86571c1668cba05b7b5d6550be05af5f162ff20c982384a3b20dd34ee7de3761413fa26642cf41d778f395e8fedc70c5464243619c87589cb8a3a216877b5b24245796aff18707522b0273451238b9af08a891e02ad610fcd9c071f534097171c3775c2aab62fc6b28fcbde31e3e94462a71aa106951e12cd447783dea45fee7ef38f99179121258ecb04d1b2aaceec1692ba5ba87f214832fbbbe2a8267a583129d7c488950ef4d1f0a911e6d73cb5025082e32e22a9965bf5865b7c7b7b40a20029c70c79ff18b07422b79ca3b4fcf5285800c890eee9900c2284c87c05c8e5ee8ddba754d419dde2ee769016c51e73ec90f68f7f4f4fe439b16f3af05159f62c420631212c5f097239f7c6f5290ff5463770573bb814a571ef1bef964e24d64d730d709a182bd18de725e829f24adebb6b466622d631dda25beee1a26cc57dfadeb81cea89db742052beec56a42c6251fff947b331fe6b880ca17fee41a6e9449eb621f78e57af8ea86102df9d682258c85aa297c437ac530e512342f1212fdd5bd2036a98780d4064d380f45bc7db8e7a4f37ebd883eb5411fed55a4d53eb6df5ed9020463bb86f6c8b2eb1dbe35b5eabc316728ca7acc65519860dc627dc4a0a6ff966b8fd188e0215c20673b71450c2fb9506f3a2f2b4e6e1ef92fbb52e66938863f5f5b6a429569f590ff3400bb3682ec021edf3571818e5929200ef607c5fd91126504eab632cf04e7463afb87412183dbac82a642b83e5181043b739bedcc390781319d201b0bc9597e8e3b2f0a1964ffdd0e50cfdf73899ac4dda1568a959ab320661a219b550b36a2b85311696fc10eaf526e8519e95c2b1141e51274c0770598904506520ab70a73649188097b153a063745cf5066db5023ac39924b84af06473cf04181f2ef16f29daa66a24c2591665e5ea1943690a007cbae20a6c35c5690835845ef29c91834f1179de2bdc882513794e5011d9888267bffdfe50d283c8f42eea1ab393a1c99ff712a0307d9caef453162d91e4b74f53121f689f7e8257948283bcede76e3607f700b0c8451e73d410eb04040f8ea9a677a9c984d753e038464fc59b2e837aef60addff7a0bc9cd93fa84ad19e6b20a87ed73a26776c37a6e5845f5fde00c0f817cd3edce63cd4117cd6c0be7ec4a64547affe743ec13e7510026c366b944da0d260302e49f03b2157c8381bb218931bfaf55de3a21844f750ce39282c5e41e854c3bc8b0332e33cc69f01bb0a8cb32086b8a54250e78f386a98f108ce9331d1ccc57a062cb83041f966efb179f4b41b37ff73c7b35438622aadc311c695109520e1441225ff8b8995798deaad30ffa4a59a8f4ddc1c99458dd9a7bc92646d37f43a9535b0c0a6d1e7b1de3c0273554e0ccea95b84450d4228dce3854e2835ab7c06857b8a329d61a230d4f7699b23474340202a35e3b99d6f478856dc3dbff0819b77479c53d1bb0707ba0208c80d4f59334e8f041e2e3d84b8a14e3e680d350a3d3955a50f4611ecba079290635957ec7b52656071c6cfbaf209975cac1965ee47c89c0e0c0043f2e4a2ddec3a2c0ed831868d488977b15623a55716d61bd6d93c937d1d975b43595c3d08dd0d80372ef2cffa1f93e9a171c1264a4f973c6b90f3c76f11ecfd67747cacb20552258f0ac40768f83059b968bfe0c4e5e8bb122099beef125060c7c844880747d8fbb4c3c946f9052781984ce1ceb62a9a47c6c64e4d33a1e028e08b693195203f95a68001de2cfa5c8a0a79e0d0b90489d1fae7b95faf3f63b31af1e0de80d10c218af5e6ad0ab8198786a8125296a88fa00a358a96de25e84256268d20c7c51dfd66b7d713699ee15e429862354e014042256d369f527aeed79122cabf8b0529d7ce8a389bdf4b7d9a9f66cd62957b256c88a23fe46f5bee3350fdd094232a3910481e00a55c43b22cc1c0747ed73920d78f3659fd8a071fb82ed39a7f8f2ed0d86b174b0a775a89aed990627114e629b2ab95fb170cd5a97aa6c8f53e22867fe78dca147319adb960773bcaa5b7236f5180c1de1882ebaf43fc963aafc3dc71fb00576f27ea934db83382fe3bf9a62e9bac917020fd7786cdf5bb32b93c6289d947544ea6924da1638c8e9960f5ecb48c282e44a9f14c4333893b888860e099f49c9d838edc359ed252f73edaa2c84ee518bbe6cc4289c801c40704dae916935a309ad9a8036d017d95b81b7534825bf2d2eb59e7172b99af1215d352945a7b55d4f985a604e02d693b8187001706eb32008b85bfee0d409597f7ea7b5b741153d7f101e64cc00f7bc9101e6b3e07a234b27709915b4a995292015309ff0801094ee9f6a4c1e9ee350dce50c7aca9b973de50b145972cbed0e5ba68f1c3165d4202c4e8eece3e41f1f3f93e2d3fd5188f9452de78dd4012f27844375a104ff4862be4051bb6ecb4ecb45469943ffd192b4f7d9efe0cd68c239dda9efe8c9946cd9869903efdcd9b71a44ff43fde8c959fe86bde0cd70c240dd28e8df219ab06a9ec6f06ab41dab2d352a541fae534f84d6990ba7f6a3ed997d32095f275682fe7a5d2066925cb4ff23fd2468be2e052fa9bb672050f0e403597b63cf522463facf4378da4852b5c5a82f222563f2469e1d28883b6ec406931f9c04a01d4441cf44d3db01febc6723c5ff87205ebd2f07b89451c547e78c31577b05cda4fdf468e8d2902a8893b4a97bec7ab2db0393237608d0abf9c8fd5a8f086cbc6ab51e1c7faa6dc70d1bf81a4bf23365af46dcc748a55375c97da685dfa9f8ca77a46f06071477ddab27369a57109f002c140869beb4fc5865ca5ab820d1987715ab264ae9dec24576e4e93a0eb41ea0b69946b9e902035b0f25bce8f46360d31ebac5ba89ba1d9cde9df6d32efd5d5ae76ef5f3d914e87be50540589be5ecd132fe641d13c9836bd9a395f44454465a6b5c07a349a269279ca7b45ca491af72e06f4f9783697f78a32bc62b8893b463de2275a7953cc3959bc9877e345f1a4740a064db451c2149e6a559050b49a8005e268265a4d11cc26c1e2783827d41ee340b1fc954a20884bc73821d0a7a9482681205e0a7d58ea55cb34abf3787ad532b5e31a4923e12a8cf38cf395ab5c5f49c9612a8d9af14e5dc9f49146d5994642776815aa43673211cc26c1e2c040709b6d3adbce36db749c3bc21dd9622f5bec65a3b2cdb69b0d6793b2e56cb28dca36db74b62adc8a93e18e805eee4e677447ca1ef2324ec4e14f659bcbe394914b3627a9459a21b91a4591344a6a24181352934699a4dca2d496974846a9b74571ba49b9fe2d48d8502413edacb0568eb45666a69cf2b6b741f17fd228f9d2ab2db030d968c61380b5d8c0868c335f9203b1c0f27475ecc913282e1d309432b7e7bd3c184a861bbf6e1ab7f176b3dd3488339a79ca7b39e94b5ffa8a6c241f0d3a10979d32e7dca66cc661a971e167c7596efcb094ed29f194489efcfd91244362792f98a7a4478a71e2c877921053323a01f49434e8a30b850dbd9707bbfedb36e292b03d4cb388c37faee20f3d68dcfe2a67a31be530fa078c3efaa987fc968cbe8b69a9a2ca92d1cb6fe5b3679c734e6e01851cb8f2670db28d1f7ad8b83d6c5cd985381b6bd04211cd2026ba81b5d7dfe248712344e14a9a52db927d988ec540841808091bf35ef28be14605d6f472350a49a7b8d1e81be9f4cd75ea042b5a89563dead117db98e5e7bd746c68493252e53fda71ef158b512072117281651c2a9d6a4d08eb83bce168d694e50a89567ac40e94c48e6671070ba926eee04ab50536243d11c558b6416914b39417295689a40c11b751e9dfc216066e8870ab0215e20edea81077c446fd0814031b8e66235289542ac55045f7198e69670556ca10bb1ef3530d13ff50062664a0b93238d9e8145ad61f4b242379238f93d1c5d09f1ecfa0c1d1b85c77413774a5a723920d61c3d18c04f314d71a1b2bdde06481e53d8ffabc16ba42ac4184c303883bfa5db087955e7cec62603c4c8b565584c3358894f000fc59beb02f0c6f058ab762713cb55263bfb0c64432d08773fd3fde0a92065da4239a354865e529914809d7208a421c80ffea3fd16a757d0a11878b946cb73f916c93c286229ceb0f13e14811f916639cb8a3df29e3344af3d4e612c136570906b3b11d1b338964225983fd8d5c53b436b5176bb6980b2c6d2ef0869b89337531fc5bdc5ab619dcb602cbdfdded99e40c1658fed1935e7e4cc24a7ed2681571cc9f3438ad468d2ec6f2c77d5dcce76b373d49c416c413442a3b1e9ac70b6b5cfa9b17962efd90c7c970831199390de2b80a2cbfe51adecb53d2366e7fdecb654b5f473adda73e354be914e91bedf4943b9ad92876f4e107e77a30cffb6378de2b06db3c2eb634b191716a136c389ad53bf2fa412f1b461c5783fe5f17b32169d01f0000e8623c1ff6cb1b430c5d8ce765d86cd8e862badf22e304c023802ee6c68d2ec6d3830b79ec1a605282edaa46a77755a3b36a7486b8de6edc9841f4337431768256b2c8826a539b9352a1543c9e4ffd7c3c559bb47360e716e23a39b710d7897e0b71dd0ac80b8988dea5c8c670aadc183302cecd71630cc78aeba9116915cac1e5e862badf401c773db6efafa506769b82260404cb32c06a5c598a5b8c877643df64c53c72fdb55fe3bcb04658d2bcd06eb1500626b4ff8c669f7ed32cee78c51da3ebffe97ad0c9da620d76251df1dea275595a2497a764fc4609259d92e9565bf840b4da62e5a956f9d7f698348a75e49d4f658d0a45b22da6042b9f6adcd3e7ba184e24932024ac01646c25b0fc24130f1aa39fd1fd0bade9157198a48e52c5698fbbd153a38f343ff23c98d744c45149bd9757e3bd3c1aefe529f1601e8dd7c473e229f19878308fc66be2c47b6dbf7da88b916fbb6679ea8bd476b3e1d8d8622024768bc51d9cf79ab23315b1b918c7236343c6097d7f1659cc494325c9590aa9b5cd48ab485ac934aa7b7f12abf3463aa32adf68a741d2aa411912ab1bcda4b0fd9366737ddb4bc230c9bfedf22dc5818eb01bcb53261d621431ed50fad18fbe204c4b485ffad1973eaa628cbcd18e9f666d00df7236d9e59fefb56792cf2b93fc7060216e7f1eac4107b16ce8bdbc977bb0464591482492bd48068a64e188c48160609b9aa46c3997590ac913cdda00fe23ef01ad12c9b4b0a2558b4ca3e4164b89607ef2274d92ccf588b3c3e84b5bb061c4e16e2892b5ac5a44304f89642d3f14c9463b394c15e91bcd4c60e70799800cce029df25e1da9e8dc70341be9f4c9fb1bcdb8b02195b1a965d7db74d0d828130f1ad7f48a38fce5b571e36f3b5c5f26f9f1b8db01a81544b26d07570317638af4f1871053a44f3413ed18e1fa6f36d8d0c57c98b7e70e0a16f4dd136c48657183d222996927ee58798af441444d44d045d375c3d18c45f2465e741809406243efe5bde28e4e046b11ec3a7dc28a609fdfde2362d2232e5cffdcd16c948598da5cf70bd73fd4c53468c6868ce33f9a798aca46333a922f3bc8ab09583fec76e495e53e5c69b91a15eb87e69ca1919556832b332fb87ea666b2c2a4c18f87df95232259a3bc3f5b031b8a641d725eb87264a5759d88f9bae168d6b2e5b7a4249790e86cdab3fb5b32fa78ab5ca73a944a835efabc17e91b792fd9f5efac273d2f1b402fb0a148d681c186015e1d46d2f0223f8c3957018d8a3ec042e6bacaa35cbfed7d0c19db1ffe9319119689f5889db92123f952c9da7f89373f23d881d650f0e94f7b5210599312ca34c9d7666cc84eb6296a368e714a57d8edb9e3747638ee0b59093f61d7e7dbf3946236e4e49c56844176ad08434ec31a359bc99df2e327ad96483a15553031a7268c393535b55a5b2afd83edea9bd9852bc428d46a6da9f40fca2f04db75270c9cdc1a6eb4412273650d4e2a77be676571e4738ea7402738383737311d3a5e5e9c9dbc90b8c313127138f55c9ed877719981aed8a24bd8ad3be387910995d9ddb54dd378db1ec699dba8b36ab5f55539bbfdfc96df3ede8f8cca6c87ab747bec6a1009bf2effa6c1748b892d6ed3679db3d6dfeaacb36a9a36a5bb00c7c605311b17d4508d0adbaf39c17a3e7611f0bc9663611aa6e76fdea685594d086c5871b0ddf5983caa56bf70ce7e2258ade713ddddedddcdb5bbbbdbbbdb6fc441e59cddddeddd4d5b879fa2edfe423adddd3f7777777bbbbb7d748cdd35babd1b65bb7be56ecf7cfee89457760dee6eef5293183f1b9ad2bddd654b1963d4d17dc1b3b0fc119c54892aabac52a3b26a746251659573ca8a4595556a747241568d4e2ce8d4aaa453e3c2a4746a58c84a27165556c9052ec88a4595556a747241568d4e2cf845086eb74beaf98f17e3297a78b81e1cecf5ac5c4a39239d9519042c25cd9c936af2b5e2417601ee67d7a32f7dea40224eb5212211c0eac6cb29d6c048c0b883fecac503f082744b80c8f942f27a315db9388afc5c5a77b186e6619d0772eff12c790f46878e5abb987afd3d1fdee15afd8f1abf3cd6c02b1e407f5cd26da186a768909f34afb806c6411c403fc36ee7e00bfbfae784fa7bd75ed1a9925b770bc58f345694b835c6a05c7e215136bb619c451ded4396615695cb2b70e26a54549aba21771170e7d72adca9021a445401ae7c37c04c154fb99429ccd8d63d42cdb52d2eaa94f2a5ac5283538529c44640052c54d25f5742f1842be50a40b041fe6f901fc64c143566a2dc7eca85cdcc912bad605df88a1b722950c195d22605545c69bd4ab63366125576e08426b2e842042a47a28a24aa689d1136aaf823c3b8d2e5060f71431a6c884faebc618c22e5ca304e8954ae8c3a376ec832574a29955cc94caee4263712e74a1f5cf9d5961e7cd9e2cad701e3038809a470e50711e2822bff023c28b9f23b50021aac5a336039e14a1b1340e1ca67d7ab0505f6baf2045fb8d206053657d6748bc60db8d0d5c88d92c1881a7421d840dd875cd5fef3fcd9366d033dc7759ced4adc57c488aafa4982752e11126402f26384dbab7810fddbbb1784133af46f5f10fe3faf94dbb64d5ae78ca7094ecfc3f4ac73ce5a1fa6ab67f6e64e581999fadacb7c806c2d0dca2042fc24dfe3f1e027b973df2a61a3aaa3f71c424a66081daafaacaa8a37b0aaaa228005aaaa0e55fd307443cb76e7be251e4adb536bd55eb4af881115e8271817987571f194f7cb9904e536ad7aa8901e224a3ea594522a29a5dc531ae44337fa7998e6bc8d7ea807a37a3e34fa2126f4c5a54f57ae104a29fd172b7187e4964c5a8d9a29ff25203f01bf9425263a09aea97ea2dc77ff7ea2dc51aeb3496ce8ed87961041e41622a2e6db974f631b71e987fd624aabf538e4d16fa6a1f47900e229966db3faf9c26a59e6b57ac83296691f10d012f60a71876b5267197d9fedb1414b422c3fd1d057c4888a577ea22e3fd19f5e9106e9771ebffc449ff34232b021cb2efda6cf541a45c31aacd3a8305661599128dfbd46dc319fbea845db53821bfa4318d626b1feb5b6770e1e4f143e7eeaaa3965a25b1671e4258382f541b245970d1485edce94037dff1de69bbe3d530efe9bff66daa17ffbf638130f36f570fbc66b52b96762ce33a936af1a8c9fb4f7782f7ed29e3d20d54f5a3581ad9f900635ab84e5d7be2171d6dd336895db2496bef61a882918f1c42fa48788627d0562caf3120c573eb7623cc51ca2aa56e085785ec6b841e28e18a518058fb7c58e0d5ae2d981559eaf881155c94ff245be7b21256c28614c00888c7fbfbfb42b8f6db5d35e7bd01784133a749f89bffba8d23e08137f2620a07f405481be7bd01744112776e8be20b4073de833f17bde882a08530ea0ef5e07d077cfdf7d459ce04f87ee3d5f91edbb2fc23de88da8a22aaaeac7f8d0c303a2caf33ec4d007e279fed04755f54caae955072f882907d06bbf03e8b5ee833031e877e83ef405a17da61c3e5fdfc4df0e9fafa61d3cafbde7b5ef7e5ac0dbbc7ff160dc559d175551e5d1fc02426a8ec7886c990396b69dbda659e2e048ab26ca68d537312436353128363956b0ac5c75ecba7b943ef9bfd010b98f399e23b7ef1b4f715fec93e7fdfb7cd64f427bc3bee16a9d2db484041b7a8ecb5b316f4cd0739d3ecdb2b09286f9f272bd6fa4dbf03a9a603d54d8b06f62cdf462dff40d6bc53da188d09c52b26466240dfa0ce8091b7d90a19422054aa77cc58a72bdfde67aada5d23ff8e26c274f66fa52d2c91486a3602e59462352f264f9e486f2b603348f1155b040e6c62a9898a982099924b31b6d92b86e8d1b6d62b073aba79886c64649ce0d998606a7869f58c1862d73cf91b4c8df040526a3cd94ac12c039323509eca65668da460924ed0e6b54e82d67d2283f62497d249daadfef2d3f49fa7dec849bb4ac651f107c63a8f4ac5155588d32f9d7526ee7340e15d96ba36495801bb27497d069a42c715c8311a641fad50b417d8f7bfd78651123aa0aa47e3588d59d757a37c01995063b641a19f7cda16954934639695477aca534d83d651ac186356c9c96795381718b90a9b2abe422101d91a01cf52227a9276bec5a9d9d466463b384b564d5b2d16689d8ad29818d364b1c991fef1232b75f5a227488982273a34d13b01bde68d3c40a6e113a5ba847bcf2e534523bfa85305a2e578a462a1702d1577acb4b82991b6d9ab8b9d1a60927973b1c5ec2a06f0488beb2148d4491c624dab0a4f477ec28fb5f7e4858bdbc8c52ca180861dde50d5b74f95861e5546dd185ffa594374958fee8ff430f1a3d685cff9c75002501250125012501250125012501250125012501250125e9ee6e8e99bb298d6c69b3604159b00fc2428d2e402f2b92b939b618638c6f84f987e9eeeeee36783c221d771e209ea68e886356ff524ba73eef729aeff1ac7b37e80cccc55ab9247cdbb60e14e1d5c7c371bd6a14cf667d17d3df8a79c52deeb7f7e799bb5166cfe779ed79560f73778c92888c32ca2861b0b42dc3eaae570dba911dd8b05b9f1f1d0082b906dd79c52c9eed3428032ac2869107203ad028fed7a6841b38b1fdfc71868d99993bd0df2897521af1f81cc5f6b4a7ff90f69c8e8273f96794db3e39768ee5a41ad5aae7233f1f6ffe54cf6763fe6c5c0792209037839a378e39ee744234cc176eeb40ec85dde4f2876838f62c33efe8b44caf74767466b127516e9ec49ed4b09217cfb08b5bad13a7cc29426868a641c7e56e6ee6666eee66eee6e6666ee6e66ee66e6e6ee6666eee66eee6e6666ee6e66ee66e6e6ee6666eee66eee6e6666ee6e66ee66e66666666666e66eee6e6666ee6e66e668e5f9ce109e865638cee39e79c2e7da367b468c5b460dd188bb2736f8c45a172632c8a943b6f8c45d1e27637c6a2c42ed712076c6620538a013b07c1a68999e812e6985dfa5b9cb173abdc193a0dcaa8c86633a4349833434a8374c6944b3f8b2ca23408e5de5c4ae34983f4f4a27de9cf8835a89d5a336a4e33979e5c973e89a29d28a29d258668c24c76dcbf192cf9335a3746fb4d7a9b11a670c525bba7d528f6820b4b3fde6833c4eace1bd2a809575c37a755a35a8990249372e9d378d229a9a23094dcf074e4b49a51737d8872e98cd8a53bbc0862c68b8f2a9bc569e5a996999f58395476c315178805365c719d565ceb86530624480c377e8c1a292b2ea90a576039643b74e5499a6802c594690f4487209b9d79caa44391f9d9d91b51494fb4f2938846d3887c6a444c1aa42c62b52772229aa2a641faf5db13356954143111d1889a50cbadb838d7c74e8976fc44bf6b6f65b6c2b2331e36ae6867734d86e9054a3c06dcca4a4bb4e3a91c37a21d5ea29be52ee59c946a5aad4e786650123303cc33c3ebf3d9368eeb64ba2ee6c492397272c556c4013a12736a753de43db1421ce865b70f753c44f7d40a4000661aa4ad2ee6b384d51ec64fae285a59717f4dd334ed3443049c71219969909e5a0dbe780103064b177362354845be22ca91e32b2bce6ab10c342cd68ac873e4342acc7193634aa398090b894482f182445a119148244b0a8148a48e2403e8b45a61cd6fc5884afefc8a9c587ea2dd813eac31368b40a107ee691571d0d78ab0462efd8d94e3c6533972e4b8b9f44b1d0f1b37474d0b6ccda5e16925f2fc69f5e1c10df96a4fc3090d270dd21fc0751a348dd2be7e4aa349a3f883d160d22827362eada29526b58e60c63959a981e29233829b4b7f05e629a9a22fe24aa3e6e38a38e2f524588db2475a8dfacc9ce89f90506f0f880e0dd29968b5f2414ab9344883f4b46245894e5cc4a4535545dfce7c6bd91a5193cf17da9d4bdfe6c8726e3865b04b7a790a74118cbee849a362855d0ad2dc90e4443473a9e87569dc9cd417d81761cc0112c4dd6d64aac820cd6c5e20e3f6bad6b29cd9cd4e139772130ac50d671577cf577b5d6ef7435ea60f4487203e3c359f3ee8d1a3fb8b2fecd734afb60cd7f34dd9a4d220fdeacd5983f42375d9fe15178d9a06e98aebd215d70a12ba5dfa2bb195289df2e4ac2899b9f4b46a72e98a934b576a2e5d8172e90aecd2af5a9f568d0a69d49c64a846a3a651e194695346a72cc7aceb02e0606b6fe9395b74a9344ccc64366e692f1b18eb32cbcc9cd795a12d98106e4883b708ec8d4c099c9d1bb85826b381cb062c3660dd1feaed21140358143951e8d0908d8a727eff2ef85845009c24f1240a58144f6ed0763935273649c854a1647563154a88b8f1230fcfd5aed7835780e375f38d7a69c2e4b22c1471f40c52ca77fe86f0fb8d77fa674bfefc0de19777083f8c52830d850d43a12e821452803efe06f2a2aa763fe70cfdfca9ea2d7641fc39ad87faa1ec1eb07dbfec80f4578455fd204faaa206f25c15bb086c527e219197cbef7998ee8ec7479326edb77e0ee4b52af499b4e73eaa603a7611f0ef4cda0724fa69ce49697b131ae88006511544f7ced476dc05f17c7d1db82f227f2bc2aafa9d9dc2522a83f097ff89dd0e9ecfc4f533f107a4bee75915bb1de4734c876095ffe659f7d0efad1456fbc27ff110d0800734a0e209273752f104ec2ae1462a9cb0e26a1f6d2cbe49d5b1ed15b633e097e3176195f65e3db14bc9ad9fa20724b22cf8560aeb5f8c600f4e36af199750e45c6fc2ba2e00f9dcb94b77e92ebf21d2dda5bb7c7f59efd6dadd5ccebb4d7937ea77d39aafe7030a8d444fb16c020d11074bc9d2dddd67d54c931ffc960659c62867c85dcbc5386b832597e52fa1c07694097c032b29ff1248e0400183e2090c9a19176984af6e6e7fdc116f8ca1f4d65dfad43a6e7de957ac5cf41457e9936c0dc9ed76a9f26a257df27ccda45f35f2d592a6514d66c9a7afae9c4f6cf2a39473ca66e11003100dba03b9f3397604a2087f7e2b5d6196b260b7f744d7a234aabb188d6a5b0c3f69d0b9662bcdb4adca1a37da5cc90a36e41a4d3648a7e0528c9f0693d830ce580431f5e2a0cd6304a25342fc2413773c0f2f9e6211c49387be90995c23745fc84a5cbfd9be9061703d765905d7bf7e6c84b34cc4e13cd42d58f95ab06c4dfdf109176e4cfd552ec2901b18b6e812c618638c316ea01b1b6d8e98a243a3a2a6bd0e4d7b4da3da0d4dc8478f9af69aa669df1f71680faac26a9a276109263eee8861c629ed9476beb06a7387b5e329a6413ccdc7c18a7b7045c431614bec84cde79d5aad2d9558b3d209634dfad1d73cde8938e67fbc606bbdc1165d6e3438e701eebce2345fbe900b10b100af80e8700356d053158802780550fb847057b7b0fcd463cddddcdddd9371c2433e72e99ceeeeeeaef12a89e5cebfda85f587791f14c6470cac2ba041ea6386edf9807162e7c71bc61a145f1f0ad0ba18ad6380012ec77079064b4cc13c8cb8a39f1986be0cf785918bcbab9813f22ae25c1af2aa7ecc3311077d5e8188d0d2f629a5db94cb1e7d496d8eb8b9b173aed199ddddddccfdb93438a90cfadd1030a2fafcc61c7fdfa49f0b909a09e8e0baf37998308d62fa35efa739690ef134ff0897093f5ffb3e2037bccac2165dbe566b4bb19b48839286693c858178922fa594af84122b630e8da79899b9c52fab16f878c132bd428ae4e9ca7892b546c1faf7bfd8d0a9a8923647481c294056d81c5173e5ffdd420db2c23233337f34784471761f106c01850b1f3517f061736060c86ed9924a2aa99c31eb5384a7b360eae4fa47f762f7e3f978fc0836e416cc5bad96a7e5f13ead176e79cab65aadcf57fde4ade28f5aad5e28659c756075a178b4b021b72a939a16d31b13d830586e005f1662db3e443017ba65cffe823b1329e968d093d0b28b39051bc6588eec6ed4d3041bd3364f10b8d618f5413dcd07e8c353b1d8c7a208ac29095b7377f3e76eceb5e7f2e88f38e24f7a378da3f36e95d33c5cdd3e9c67e33ebe753c3650bd120794524a76699152527727d59b8a1657b46c77a38d1653f8115ad4c052aac5924b2975b9d4857ea04c8d97c0866eb4d1c2b585b537da68c1baa0162b18364e9420a9f0c251b103ae268a2642d051f18318382042088e0a27bcc0010b449003264da298c12c0433a0a2092a6cc0fa5a503f27075d8e14a597249774a34dce111c22148104144588000c76866c89103a6661dc58051152341756c68d5510f1e241844b070c5924e16fb4d1810deebcd1260a8e0c162fb07881f42209e945921749727832ed546b8a99c81f694f7ffeba1be58b0d9d42dd7039d0a969799086c9a811743f5a3a9dfe52da9eae6e8fbbcf1a7fd63ed6d2572f81da175dfcc38299d3b96e0dd788835ffe6c35caf919e4ca91fb413973a412482f92a0c00639d8810c162fb078812d8cd9255d7f1806b4e4dc788d200727f09e0cf3777fe27a77614ca4a4a16910f409a301931bbe8d711d069b3739d74fc04537a8146de9a594923bfe92a79cabb5a5ab2367eb8f2f62ae88df90a00a1355910fc42db6e8812ab6013eb0d2050994b43077943d44124dac54edf1f5400ead9adf3e039c1b6d688e7c37dacc40765ffc5d4620f3b9ebe1a014d8eaa1cd0166f9c30f7431128991ebbafd41c8aefcba856be058d356d8a24b1867cc3c97443f3161a31424ad925f48a45dd7bfea3962e3b5118711ec6c76cf37c20337f9fb0073e71b69ff78874c771a4fe3f6d3488004dd8e35ee16b738675ff7b80b217ac591a3834c1ebf5f7a26ef587363177793dc04552cb6f650ad7a3e5c4888b04a90ec1c06f5eba1c6ad3ceced8167b7f6c039b7720d3ce5268446a5fb4b5929d7f1f01bfa7fded3fd98efb16b40a55fe8bf753cb6afdd8ff9b57570376f88e7e3fd78433c9f8976026efd7a48c0ad2cdb25e887be1ba0b7be46bf1ff3f31441cb4203620a8c3e7088a839803b5f0031a523cc71e77747ac0f4f959a60c3d2ed7ee2403fe736c979c77d9670b6c1eee676cd96950eac3bc129cc34364228f1d982cd0d6395c854878ef9371ad535801af1ea1cd03c280dff7e9e3faf3d77311ed0f32d61bd8afb6ef4697efd6c83933e5f2c6c186377469c3baf56021b6d9e904d7afb9932bd629ba297347cd00725fa100d77e5431d77c5fbe4bfd858abdcec7ef8dd3ed935a06f8ddd038cbc8046882caca00a27b458822ac6d3c6d5ffbcf6c2e30be3d58b44b81bfa4a0d7e3eab9100b46d9d2723b8fd16c1edf371abcfeff14a0dc2b02b3ca5d0313eb3a6c5d88de2da4ba9ea5fe839c2768f4ed3e6ac1faff649b355fba2155bff94314a7f193dcf5187d5de1b55bfb9f7bce6d5777f29995f6808e472d7d39efa7288fcfec2974be4e56a2febfdc1c8d5be5f56d93f67ec1a07ff7e30d23580bee40b04df21b141ff213e41febde7bfc62b3904022bbfa50a5b5b5b7409690ee378aa5955b4326928f42ca167193d0b0caea1499cfff49ff5e7fc5017e6877ea3c1919e8544fa18a3d1932a3f817323116eb47162cadd6c7cc703f440805c045d469fe7bdf8182c2c1faad96a743f3814a2d1e1c0f2a18f9d0bcbfc9100388e3bba07be21d297483f92517a920c8f6f8dd1e8597e9b818b30edfdd3983143869df33f73cee9c528753c406f7f0b00d72c4f954a94d22fc9968e654a9ff4a16c1d61fe4da39a1de03f6f68148a43ea7ef8cf7ff11be0fb22c6bf78fa840e09fd7cdafde0da80fa1746874368f42ca497a718a7be3c1555d55251c7a3ef286cb92111ee967e54fa70be8c1f329f1477989ebe3c41dcc1f2f43716193f59dec4f224d2b3fcd6d3636179d2c3b4697ea5ef21744b1fd6cb7259be547a8e3b98633c6143f7f3316a6043d98a01b3a15c5d96df5e622c593de1e4fa97bef4dcf1b01fbb1e432669caf8c218a46f488c273dfd10e9411d0e31481f0bcb778703cb8f5e86172fe959bc0df02581be30c6832ecbcfaec710d203c177f431e4ea52c96a14e95b35aaf485a4df9e8ebe21a41f3d7dd0e8bb0e07d2a8001cc71d3c86801e08befe34c658e2e9787017319cb021ef5cfad2f5b2b53d1dc2ef79fa1dd7e1c0b1c1ad9de33641b1c1d1e7cdee6384f17d18c38c5b596eed76843ee46ead47d8fa9a0cdaf2f361c0f80b2f5e9017ef8ac701c173d5a81dae425fb3a325fac142dedc8938e4d397a76617e249fe09ae7cd0179688b8920a415f57b2bdf25b3c39d327b97d12896c35285bbe6449f92c05677e52caade5b2fd7ca10572eb4f4a298d5e3dee32cd29b55725e43f3f2044e861b8f3bbce1ff487876175c30f0871671777fbc0e560baaf773f8c78175d5c186f23eec78b43b48fb77a43b4cff483fe7cfac9e7eb61dff9d50643fce13681e869a743848706e77bccb6ddae76beec62427f8088f27ff1a08f3105b217f431de603f2c5dd0f3eb27f7aa331e1ac5f7028d72224034c8c3ca5331c655fc42fa9fd760bc39900e1fd803625ef9f140ef02f746770b909f19cb37cc750b2b7f93948dc059c49f367e373bcf4ba3a6d53eb0c11713d81b2fd5635874d2a0565b6bb0f9c6ad7f37f3c268ba98d95285255dffd8e140bacca4c1c94adc5f2cb9eeda8525dd68e304922b7ffbd0862b0d70258e2b63b872c6e5970c0970ba5114bd4e3e219ee64f8ed2a7f973fb42b6c200f346a33d25e298ef2022d850878a51d1c609d69d1f04f419fb86950f5deeb4eff37578ea455df992e8bbb19f8e1b2a767eb7b666d982e5e4f88b7ce376ff0e62cfaff34e193f6a709f929b53d6e0430fdcc56d8f13db570e911bbf04827de037c5db6d84fd177efa376868540f1f7817f08423eef07cf7c0b7bec7f3f96064752b0f98ec5cfaa546511b26472e7d977e41bdb8347629c8826e3f6873eee3993e1fef10cfd7df3cd3e7fb71c3adef03ccf57c261c6eb8fd375c8f9fd61d6cdd1c638cf1e327d22eeed831b2c6cc517e6b1f4fa5f2e3f10d4e83fc7944845cc0029c93334586840f059474c45b024b0fdeb85ea76cf10183fa11a4e8a8b44d1566450c198d00000008008314002028100c888462c160301ea99ae23b14000e859e4678589b49c32087710a1963002100100300006000044606db00717a79d06bc7bd4a04f2404a6cf04f531b43d1829a4cac527b03fe8c9c34712b7ece8f9860f8a20ea117f96dab79d61aff747f86413a8c25862cc5283099a6ef92b67ae92b03c81bf22b1d795ac2c3439188306b89df4c6258eb0edf37373e8c667a4598735f0c606c5c390dabc33bfa0fe9d63ed948b52b313e54be141298b682660d57f0f0644bd58de6ecf5175ec57badc26c8a18519b086069215125de3959be84388f37b5397050dca6094b692d9ba4b4d076fcd7004f5799132de5e17eb29d9e8ac60c7910a1148be09e4579b84cca06e421390ea83ad44c82c91441e6acfa0b17ab47ee74d65f498ba1840702ecc065e20281224e7bda082791bf3e2a724acacd089ff6854667330ff69655fb5c6472f402839c321e2b21ce18687a7131e8af0b891c09795c1857b862c351d436af2c1d1750ea565745c778311099ccd1007cec36837462f9ef6f69712719fa5926546157c7bcf1c3010fc4c0e0c37891b6e706a9700b7f6c00c8fba607daba9181708e39a093396eb5b397f16a2f9ad1bac475cf509aea3f1a54bc4828bff147becb7be31626d636e398a359a569c3737fd8169dfc4479dbb9c732ec4aa37bb78f17ed6454af29005ac19fb6bf819186c3ec0f76d6e47c0abc36b33472f13a792fd1ee0a258d5f7a48ed4a6fa8d7cfcd2d149157bffdd218a0af1ad94fa4195974542ac58177f8b2ad76d7a9861acd6a802e1814819a30dbac8dac55ae5429ad71c5970ce930e2a817e10fc99155dd9cd8c5a6890315ae7743eacadd217ad7460cf785d536749ab8af2e2284ae6e88699d6e756c456d26a7f916012972a9c01a7701a5a0e9d552475bc8c345c2af969061a995d71a3df8aeadb5e45c3e4bcaf4790d30dc49488d144093fbdea23bff2d3e0aaf01b34b5ac109c4086d543983e93d4780ab57afdd84b5d39daf006fbeb07f69aff4aa2eb887276fdd10f66f25b68a72941da9ce263879d0fd2ef899462e310b4e3807d211672125520a2efb60117448778ec4be842253991abeb21b50804a1dfbca446ce2f094da3a7b2ff70b7e6f98cf35b8da3c5a07b803d97d092686205bee286f8326d9e96f3cd701f929eaa897a4fc084a0bac77ac9647cffe567162884b3d9a1c87879b0af455f1a66446eda17bbeaaa4e95b80aa688ef5acd04e53c3d9266c310543fce054b8a3387a67fab079467614b9c63ffcdc293b8a607740b2b889cf3a066c098b9bbfd093c29d2bf6ba1fc700d00308099e24ae45a6d509c8ca3591a11d3fd88ceb3af0deec0687bd1ab8131dbfebeaccca7a480544afa01c4c29fdc8ee4e171c3899b95084d377c19e3c626eda5bedb6ed327d0230b58904e15f4d0d7485dce74cc094d595659eedec314f4019f20eb891e09617ac897502cbb4de6be35457e9b348d73e61fcba93e5c931eeac4b2d6b498a989c9a2b4daef092e2e552b77a8a0508882fc67f2f0a2ca15b90ee488cb199e8dff828eb787797590fc6b50cc041eb8b78466210000c366b458ab9c45554b4ffa73e0515bd4f1b99a423e7ea8ed144feea3a8256fdef43b34c2f7a7b743181897822a2dee10643aa55076bd52724e481b9a16c900786492d9603b80bfc86be41e068c458d18d209ef4411e38907ed03f041fec746b28ced82119863037624fde21fbdd440f8ff7a5a5c779d7f18d9ec5f12021d473a3babc307c67d20008c67d868f39229f14acf52617d0d06dde2d0b84404192269db5c509c3d7c1e869dc2d97148b073c2bd6a928276225d174f1b0ef6840062f708ae964e8599f80e19e15ee86540348e06158291920eb6f6a2d3e019f72141c0f0db84b6a2978fa2f99d9bdb922481a551a7e1a4aefd3f4fb3cf14274f9dc71cd2e140a3f30c52661915d6fed62e5c2d8999d308687054817feb9cf8521ee55c01cfb5c5d51178ab4fb76c5bf40d2cfd699e09a49d90a059d0c7172cd98ad18f4f727c0752b144c43b016617f5e7b34e42797c432da50750f79171b1ab6d9561b6863fd884c942746ec8758954d70323b5315d01aa1b65920964884f63f38ee7122b26ec295fc5a51d3fbcad708c714556899c8de9e69a14533a73bf4e21cc952f48a72054273ca0c330b949f7ef444a882f2187e4d391af6fd74dd7073219ee71381807d227ccb46287c9feda297abe5c50e04a6ed546ac7a7f37feabd384920a749866f56d6fc2147f94dd0b20f63be10a6ea697497b07563683f07f75adbf01d8a5c42ead8589ea9d7fb9869249d05e5a3b20e70d3281068065a1b00cc0c909c97df169ccbc8dc1d75828c4f680ec4502a3232e45236754aaccb7fae09300b73e598dd699570c3b555b206cc25f35514dbdd8c45e0f5ca71a687f78508a1fe81c15f4ec0744e231d0fba12f834803fa97a5eb86bdeb6eaae85ec41169c1499f2b43b15956d3ff40e30969aad407e280c46d1f4863fca7ffbce5e50fd187c8c7435f66dd428ecbaf9bb4254c63fba47596e0821929ec9d29f47776c9274572d50508fa94192a50c1be6f452d986f29b30d664f597394809a55b6ae2bd39f79f97b5a192fecd0b185a43f778fb9be3a98028db575061905170600891161782784ea975fd48fbfc69d2140f2573371f7d348f7086b567e6409ab2356f45d5b9c396ed848362a32846d286b19344ce5fec4743cbe08219d3448e89ef1ac651058225b0ad4e00b8e8ca81592da51a415fd825e47dd16636fdbd35e651f8220c9fc17d965ac744d932e70b733ca8c12022cb56d4b1940f69d728a24b50ef14f335a91803e63c7a4d3a73f02d17c11f63dcef84d37526b9c12fbab01019255bca36d791e94c64ba1209e01e34a8e3153cce519e20487f0359388ce572626ca9971aace5b38559c718a400e8a5e88115a8f8583ae32fa8266377de5f8f8f70fbbf81d8100bc14fb1b33c4f64eaa46d5b97ec05eec50011d74b740d9bfedce02271e9f594d2a82de0631cd89b4cb6c2d44f1a39fbcaffa91311ecf11b6d5268bce86660410668ba7cc1ab419106ce8ac2874e390716f981754888b1d3890a14ef9957bda34f80ecc563272d98adb900337e5e7fadfbc11093b1817252c87d9866dc0cc86f390422f185debe15447c6427626216ea940347058b15ab17ab9290580362d754148da5fa8c47f5abb5aa5451f4394cec4e502781b4d0436144d9876b426b4de3fb0df1802bc9e357526911d1415af911d29a7b83fb09ca4b7c157d4c0b17229ebf3ef02944c45708102d3004032b8750676b12539f164289314782d4fa8d44185b3f892065af8d68bb87e01549b7d6784d8bdb444d2280e02bf193678f2aa598779c8793fb996a64f16cb57f45b6c50dd08eb97f0a70e90a38fab2fc6957ef43b7d41bebc0a51962fe2be6450fc7586e08b267c5e9e843fc7d4f36125b5d3dda6b9f178780817a02b6f798e6f3c5b6c91608fc275589eeafb1e5e75e8e051c43f966406ee6542452993dd28ef93edadb95a013fb4f46e33949a2efa563db2267aa89859b2b764da60148e04de5c5b302f3a2fa4e743075f597f762ca12b8e67fab321c9eca9db282359a700bbde14593feb5507c5c2e6a245cbefd2168e3571a19af75ad3c33c1d7eecbb68f477e93d4b83875acff96d37226d505108f5429510ad9835faaf7e9e824cf49c218a317e3900e0a110b34b4e7b5759165fb1be5dcb7fcfe33ed7386283f81fbfc53a92cb2a5c5e13bdbadd2392abae3f2fd142c0a5c8fa199b201dfa1cac58bdb8383ddd1958fd9708ad486719d19ab3d662c62e98af1d1410e40c88fd655819fd43c5f0dfdf2d12835b6d0475d9948684d28f17446508a91c03640ed1d5a19c68f373cf4142efd7df082fb95f6511c307c56ebd2a1c9301c8fb8401bb5bc62acf5c27513a035ae37224a6d497ae27bab044c6590985e474d4b31d72cb5b8ac0c725d3e0af5a3dc834c582f7ca27e5c9c73b68702effb3d9ea96c6ba794815c7391a62d722c990f1d7407c0bc5ab7684252713ab24c15ee81e3fe26aed8942826286a50347e351f3fb09f18addd0a914d7c5872ca1270c9bc1b67f52b18dd571f785de22ae1a81e90b8c8b60f4866754109df4c5ab8ae44da64bc50624446a3532e4fe6708386d000c2e55295e8ec93c6e67a38c35e4d042028d89e3911fa70576adc797a1cc50a2eaabae78a1a643f26c44585cbec67b2109fcb8eb4b0037fcf40a891924e3bb1d7a08687ce635dba31e1354b503a3704ef98026b464370b54b7ac5e2181fb13e5fc626c4b5493caa960e3eb2c58a6d1aee0e4f1476a9bcbfbd048264d80c370e5788985606632d29e235f84de69315a2f5666832b9492730c542ba548c5c2c6a11a82f73f724d93e49b2fe14eaf984889f36e8a550dc8d623e1483aef260023f5df3214e2a2572ac59e8c4976ec6e1c5ed10579d9931fa1e18e1e63af31bc4f4a2cfbe67d4cb8b5d268f6d55e81ff8cd4e36da9908810aab7647cc001237fbe47de0ecedc7818f74d44c45d55f1c54b71f27febfc2196c04d3b168d58ccdfe9721af1197ce46c6aaa74b401741c2904c2e8a4057b297656b9137caecefcc590b8356f8225f24f1fc726e96e2ee985d5af83eb4f1ae73c13261c0323888a1856cf3192e9bb47979eb49b9a11cee7881a31854d4bbb4611f071ba65978427e12b1d0a94920002b960c0992a18d2a43f25b240510bf459b4b00f9487615860bfcb0eb79cab63631213c1559d943f8a8d4b0ecdddbfef462543283054205b1a3ab4b8c623e4688a71b65d9b3747cac40fa7381f2fa6c090a016e329eb7ed961fa21ebc2d2259f2b277bbe62613faad7d270b10491da7723082f62799dee038aa08c929b0681578d43b1f897b8786bdf58f3b01cd63c264fff68f6c9dd4882c10259f938ecea0537df56a36e0297d2af854564c3ac7350d9c77d6d1998959142b5f42a919ae21ea65f84430a02acd71936bc260332af1acca57f5740a147976f0ba9f674e0d92b8c480cd912835976aa667d394c575c8f6013a6eff3bfe9fca59fcb102661df7f23a547744dbf0e018b896e827f5d765e6554c1a4273c149fa7922dbd60f0cd24adb18d2cff70dd58e2365acb85cbfa4a33fdab14029b167edbbb1576bccbee83d10183549811ec3d30ce497d910745914166a34c37fcf604450d46c9b3815101c2477016afe80c2e838b0c6463f25a281ea3f0e5ef66bbe0206ecce6caa8a7e83a6bcf2d034f0720630359c99bec9f516da37cb886741f3642f9df2751637887a534bedfcd8d8ff59c2683f0eda017b6f202deafb1b9fff3c3e2bbfb3be3858cc9958fa75da5533f4de294be216a677d1e76459f869a2e639712655f36528c96ca291c01999f3615af0f9b069b151a530a02323d99da449ca21fced214387995060c011d5f8db6b2860476f1c278195f803f7fe4f67d9d3a89ba333197550341c1bad8e03671a5019524ca8223616af2e9c009846edb61ce9b74aa811db0d614c8815e2befae489db987a98b300e3d20446487e1996368ec5c32adb5e8b452ac827fa2434c3a49c440b5f42ca349a745a8ed3cc2c17bd06d5085e016b997d91ef411d24b8f95d606601d9809a60c08471f13b7a9d8ad70ba8094888e44eabf5556235421acf7840e6cbf5d437ca7a717d1d5ebf8b9c15b9cfd6f6512649df4be711545b2d1c738dc3e2481478b2fa8a69d1dcd9976dacf87ac29b65ff1edd26b7ab0362d5f24c05d1be6db7a7bb32ad84082b8dfabf86d952cfe7824ae25d4607b4f688b5c5fb1e3e8cfd7d2ea8226c17a041bc2ac866e1604be24c9e94fffdef592e87dc5a4963ba0ef3dac178ff03e1db447f5b0b85affcf9896fa9b87644bf2f600e4dd8d63e9cd4131d0f79f07bcc2e6de6c9cd63c22cb8c35d11e623c48da295bce9eeedaa32b45b3f8300bfc66c737e4b428d0df5340af21e68a82c27319d6c09cd737da886aa991b68f6c2f9cf26cb4b51eb12b27abb498ac35fd0e4ada4cadf87587bbc4ecdd44f8a86f85f576834fa9de67219940bb581bb03fc9a221597bf44aedbe01927a5012debf71c0eda99bf09593d6ce6ad131a7dc3d36b6a2f4ba286ef33416fd7eb2c9d51ed63d353c3db281055d66a6f6aac030bac403d90e1b7de1715f41d74da738849dfaad29b0d487ce74a452bd8130f493367219bdceff00d4862013b8646d2474a3510204fa5ffb3f90d2017a1610070ce968f5e320d189beef8f4d1426e9f6e93a5d863ede0daf5cc27c6470b81cb310f2dce6172c6d7d75daeeb8b34d6743db72e1f73b65cf2bdd8608f2d7eb7d8b8b3151dffe484562527b283c8ed49f9acc8c0fa681628be06fae93c7921bfdb9fee462438fca5ead64142e636104ee679e3733d5adad2d268b04e4afa302328ef518c4ec68194824651070b814f76bc9e8b322f2fcf6a59333725f35804f4cbcbd89564566a6bacd8ab680cb9339a79350c5984ac088a1a67d41931cec7fa84bec8bb5a95ec66e083862271c62299a9da4fb7cc9abe6faa38f66577799f9615eeb608c1d218f569e4b205d355cb338afd3e8ef2f731c6f9287b8efa3e3320ff1c449c040c5570f67e0444cdc3a0c11430c744f105c3d1ae38d2f045117c19ee3928eeadb3c7ab8445a0bd084cc5e4c03200284fd2f2c9ea6c598b4e6cf7368424a4a1e7ef3f856ca267da9a0e7d1ed02d0d4c3fafc43db1449f7d67bd11dccc5f2c76ab12bc4e95bdf1e4fde6e95c4a8f40ebf777904100ded8140c9e6e1271df2cb85c77dedb8e3bdfc98aec7501b0bcf52d807500f49c2a6bd0b1b503eac085d88ce6c47801070f4d442ec821c80dd42f141bd6b4d358c47b9b31c659297591af1832fe8596cda850e533fdc09d2906001f79cd1a362269be1b1c36ce32d0c0282e8984cdfa6a7982f11c6e4d20f7f0c9e3dfffa864324ef544f5b59cf8c2a6b30ed216bf6807a03bfb79e38a2c2081cfdbcb9225c7bf29109a992b7e5f4d8ea4c6c45cb1c7abe186c42e6b158d80c91c9b542ba9d1f78a93c8f3588379be208dcc16d9c82341b476bec0c2e8ca4819622f9480b70cccd5e26c60e8d3b53eca8ccee42c7e903bbe1c05bacf3df0d6d939e08cca405f66a4ea399fb5dcac265b06298fcdfc20273976ef74714de4ce8e9a1ee7feef484866367c7b09f22a49da19d55c602190cf5491b6acc570dd30c3bc037a7eb9e938101b2413f25e5162a7bce5b3dbb3d22d10a19a2274f0f1e763f3587089a58b044002bb818b5912c8c00be049d960ff0d6235c955592284a333fb5b85550b9d3b126fdd64b5ad6a35f63b4e65d15702cbaef129d1e6e7845235c589d6bd79165b51060c5c2425ee881f1335832154c3282b113a148283fb6c90193d3480a2343d8455a64d343d58a54ef069c8b751487a10582ecd1abeb91426223dfca4bce26fb2c03de9e10750432d0038a2d1bdb74e8881931ef625afdb58f5f49339f688325e3198f4070e484b8786009a59a9386d8df28210520856c52a4213aa4c9c1ce09554a8e373961af925ce750d30951c9f253ef3fb6d838581849a87531ac3ecad81677993539c4019d17e810618765191ef73566e08fb6560916f77fb1176db7eea0ad19815d1a293ae6469a8c2445f1821e97ad0c61bed248c802fc06e854069746d4b61597e5ebe520af9f4acd6aaa0ae0cb8085344d082762fb9b696165cba19162de218e9a6c2a008a21b9a456081a5c1e1baffd36f08e4891db57d4fff53a645e05a6a9be91d993a489a478a8f321df4252f09d59475fe09863bd15be5138f01083e2f6c1851c044f69a447a624bc20b37c7998b13e30fc94fe1e45ee7d6f5fe8320279954a0ab24a20319ebe4a5efa7ca97c6c07539a0beafa7cb426ba08ef806a4ceb438b4e5d0245b6e655cc982d073db9c4b3ff1c948107744bb4996073211f530e59d93b167241e3d8e9b3311745c2b1b63432dee642699b56eb77be8af5c24fba21063b21db520b94a0635d2e49d4ec701d5f2ac2c5f71e8520d99ff5619220f6ac3f75abda189a8854a99f6d80caee362beb6fba3da2c33d1ba9af915ca4d1ca62a152d76e3b1026f6d6566baa98cf4e1b8e1d724c9ed23768a3cac25e7d408ad8af2ac6e7382908f405fecf3aff245689d09605570e221428cffaa8553b00d709a2b91db9e7aa382b7483d886a880da7609cc40f89b65d623649e322ec76b358872a57a122676c503d414ded9bc345ab9dcbb7429d685a3bf47575acc5f2e84a285024eba222ce0d41515022a3b1ac9e18f79838c9c846be214165bd991289c923668604d5d73746d7a0bee0005886973a60b059c75945b2c9f2e541d4827c48a58a7980429dae03eb45f23b906af977e9e37d5daf25cc9a06a80115529c4222421c46d3450ec549bb4fa725deb166efef6b60c580faa16a0a1fd712dbff27853429a4d340da477ee71122705eb8e2a98ed717aef8f8d53bdf04e77160767bfe4d87403f59ab6d8e24a486df9a4a0eecf6cd7762abf95a300a70ffba88c5ea22e23f6c7fd0fffae73f2eb30c424a13202a386b01268fb8a7d148a2f32719e3174510a7361b53af4f29d5902e186e643cd31898f5c52f9a9e7532b2a452b3c7b390f7ffcc335bfdaa6e4d1e2362289c55dd69444aaf31e733fa42b108761b04ae29700a29202ef487bf2a9bce12b6a55a27fdc6fedb5b5cb869c19fcadd4be8dcdb5188e97c18eb2eadf45aa943d898fd06573db382bf6a3e74a054fc7d517a497a6e1d785b30769d2b64475410f488f32a220618b40f09b60488e092e1bc6bb544e8d46b7f977f69f71afad68db8f042723bed1e39dddcaac54e4c4625fb4d7cee7ef13512d7687db0509fb3c0bbf5d1ce7857211eda327123af1a0d5f742b41f6fb2984069af717c361366b902ae3549f6a42804a7cf552d5551b9514f9e1f800dbf5c1fe8564eeac924c4bdc485b5da7a10d210b1c09d8cad079434b43a4342960e0a3478de1f6a700bbe44a82544b12ed1b5a5491cacc59f49b1a43f6e634a4ab66135dfa3e4aefd050c842e3d9014c1a5018bf12633a5af55c56d17ff2583776f9da4f542e4946e665b5f07946a854e49a96a21a0c889118432dc4b28ba4612c79714d6b0bcc0783ec6f4981a686ddd9fe657f5671e5ea1f6a7016777dcc64350f2d6714094470a50bc906caa4bda2be4a482c34fdb2aacc55214a7493c489ff5a41497a171f83c76e9598809b0a369412ff00453def12e50b1d6ec113fca37aa6c3c02aad4950de4a2e68dace5f3e9e9a17debae1d5884ba32e83e0be41be828e4cc04d1b373034eb7dd115fd9935a03817c862fa2db93c3927136f015665d5ad448861e1eaa86564f222ee00ccb5cef8e530bb64ecd74033b91b20d20c2dedefa466f2c9acbcc3b2adc703db39ca90a9da25b868486c3f086dcccbdad120ea583551c2c51b287e40b083915bf9003a401e38cad3e41ae037f2d00ab0b4dcb2ea3a57ddb508ca463eaa7326ccc668775c19a9de3c2a080138d06282b16ee380388703d01dfb1a9ac97cbf73a8445ba45beca401cc9a0aab4e2674f7cdc5faca1399c48b444156821bc1dbeeff41caca868a9307667b3efebfbe5e3627eb6c5b0c2ab0f56b8f41c30abc1049e0b02536e15b38b64245132bc38a23470b6c742e4b1a12a9e6846960915c56461c61ee006610297d98808efb85b281ac141e6d8ebffc655b7eed2cb172e02418958c59015657b42a08ff14740402196ae2183fbc2ced132d9aa832319c81fc55694ff408400b7ce01d7f1666ef8820c67da8d53bab0de1370930d66dc4579700fc1754a5c771f8162f28eb9430dd0d2c6f99c906019fde483955f3c012599ed034a3edf2c28becc77a78742c924986d73fc6fab1f6e1d406b1d37d51116091a688406a684b06fa178e3ef9209c4c6a0918dbdff5c33f0f0bc1cd0173b73f274be41c30ae3dd8bf3d36d004b9f820e6e84f2f97d746143201b5446f86468f6b4dc2aa383bf0b1fe6c5c1f05c0d8ff90ae923e8dbc73603efc18701bfaec888ca13bb15f591e92e5875432c2221833b69d0ebff2e6c2413873b0fd343c774d3e2bc06ab6c784c530274caa792543771135318e622af41141d5c74dd989a40331ef7545d1b3f9e2355dcdad7c40d6ffefa414bdd05ef32f4fa9c7d9ec6264f45469495c77340ba77b628b58edc3b82e84a9191f1545abf99d5e58a4c17ffca2799c6f9130bd5d09a1a5030581fea6a42fd1f72db33ed5a1ab01620d8e53e776fc03e767bf430282ccc103ddb2f362e2dd9f394cc3a958f6d0a6f2754ec421b009b6c12458e41a53599942896ef2b8901741ce62347be4369b8485d3173c13812b354d7ca1bcf23faa629fe6bea7be97d8c71404685d3cf671526a2fe88da00f3c50248bd6269ac4f4a59088506d4506383173281efbe0a1aa862e815a4e1a8f2f21f6cd40d7f060f11fa0eda8e60691e17aa108f1991e43e97aa3f7b1a431ffca8f91bd6eb7bb46770357a9e10b5a97fe3ea5462df32fc643a8c11887aa117118ea32938b1949316383225ed464c0c23f40737c804f5c2a380361a10fd8673a68314c8a06240e29b3135dd6c3e198a99af8188410e9c67ddadb2351beeb991ae405ce3bb2e698daabac24c20557b68b8244eccd4c39ddaa13d8ed2d1c3293ba338b06fb8e68ebfd12f42c2b11f0d9494488195c539bb4d58a4381f4d9e752ad56f2508a034e63c381beae8a7816970902f8ecb4a15745064169f18c8b40353f2da2e970d6aeb2d57da45ef7fee6ca048ae96185604603a437f5977c4efd726d7ce73d62da63a58d650f3045d7f879c95f40221115837e4ac14740fba1de54b3f89a22b5fa32fb39fad7d5f20a15d78fa0afcc2acc7417e6b8fbfa9586324c4e402d135bb05ac3e263405b48fb766dc88461fa3e7201548b6040856336eb53a1e757798dabcf3f544ac6bb2c7b1cf42e7dd30ab70c12e90646a332885eb6f313b23d14db54166a3c6167a0a091fd9569ed2370de6f51ba336def382e4679377fe95517d0f0327a189696dbc1614f30405fcce56d3491b30e5d740e7a07816abdb2794204943e54069b49b987cba8c429475409fabfa64da29c2ca1f3badc67f7ce6e90a701b06f2338b4372c1dcc5582123580ee56941963c34f7663d3f3b64ce940fd4a9d5dd04583bf144617d3db87fd227c0703e160f89514a985d3ecc14983b16320ed64f068d6c9ec19b77f9bac901748ee955d2c73e86feefb976af81d11079325b7913ee7da5ce8dc7324d45d52aa400f00e13590206ed80fbd0348d01ed745f8c261ff578537003a6c54a130c9068cb134c6326e772da34c66f7c2de869ef516824d46f2081a1750d0c6dedbffe6b8bce53c74031fac560dcaea95cf467dac9559d17710cbaabfc5a45be60d374577605821141eae0080e97f880d100647039f9d63727fbca2385a15f478792e255ef083079fe3d0129b30647129fcecf92cc9eb429e297c146f94cd60a439a6308b20756305dc93f0f24fabbb0fa2c1c407b2165422e8b0ab3ff6b16e1d2a023fdcbb7ece9547d0e0dfea2b98004e7492983957ae289f27ec6907068a1b9172d421f5a40de6c8f9593d431e7bb50f4a03780dbedb0bf1a51cdce0dafe107e9fc2d8f75499164db19bcf3b2be1e9949b0e2b5c60709a3075449bad36f2d728b8a5d7a3654b9c6203cd868c7f5fa69ab0adbcb239377ed71d5449f8fa5cfdedf98c034ad45204b878df44c5912ce360758bac6921dda1c06e217095f9049eb9580e2cc3960c461f37484d782863002dab7fb4584006a962b81b17e9da712d56cb958e50f7a71164a544e46479750f6b5be73687d22ec2d8866d97ae91e242b7aba75abb2ff0ea15e404325296d8714e2c018227a2153e26ae85ea83e46d0528151de8b550f5f4dcbf0b4ffb0e489a1d81c3883985753fa3f465e56c9ad0309987ce6b905e689ce85963a33ec0712f9ec0821c8f747065f8f84979373e51bf363343d07d658a6e4f38c45d3647fd3d21f4d77f6fd41e4236b46c77c27d44d8861f02bfe9d9e92de1853a98761b901d2fa2e13f86938c61734ca9a5c1189b6588e9dcb501fd38746e55de2d3423e48301deaf845fb835a79abb69b9c2f6e1272a44671e9e929d8a364c409d41e7691c894619e0da27372f0092843df9610641876c67f394f1017c4534280012a65a14d8113b1ed9fe5eee98427b8afe7cd97bbda5fff77034729b26d9e320019101c8f6c9a0e0ce9335aa503d3d31b4c8f66b83022269cbaf18d75e9121bdd4bc9b485bec9c71b62b135cdebeab595608b49f24866bab91c61b99c0014dd63ed13d0320061e0416fd59da0ac954d6165c10918ad53c969abb68570d85183fe5b1704d81a36a8fc55e1d638144383c5034892e1f1fd7fbfa952c72745b1b8c52636433defd9d87767de94a5684109ebf25cfebbd56bb1a3a03e030dcd43a5960600ffee23ce9437ecc9b755d34c5f492402509898dedf98d6ea5b4ff03d94f38f4401fa0ce38b6c715b9f7ac118212c57ac5a0eb6f5b64ab2645045def01e3897eb3c8d066f3eec3e0b81e38c8a0f5c1152915fd6ae329c2001035d627e886085216a26a406f71ca6d640f7a45bfed7f44f21e8d585eafe57177c8bd0cc440b867c80c25c83b87d53bc25a75bdb8be8e44d8035b5e3130f180e08a737545a108eda75c1ba49b9131f4951b9bbd2529bba4c866d432a5425540470c263004f18272dd65fcd0fedc6e54c3f4963e9e89eeda09762c532f571d71080e969e1db75c79b685aa65f52defa56a12fe9b680ec5457dab5e9b0f8a4e384215554ec0534426ad733313fa91a7b3d9c1398eca62fb712559105f81e8a13354f4e402fa4c595fa55d07c45cf555487603bd41b38e95a8da7e54f2a9d91d1c6f941e377f0b6da04ec1d85221600b065b22073224e6825cc56f3ebac4c9f403c2dc24556879692d2e3602446110ca9c1d421a3adc17db2c38a43aa67cb920d84c5bba83b317628fd70a7df25435c48740015bd2ffd89678b9e318b11aa0e3089f4820212019905cd91f4bd3e88d48111545b52d95cc4e22baf2e2aad111ca2a6cfc9961f63d85f514cf6e7e1ddb7d31e86232f12af51757c1b80cf0495222c3fee069413b052b61ad4a90c92ef102dd7603a22f7de0602751b20893bd112fa87ec2ccda9f1e7167460d4ebbadba4689d29d2da2b45be8eb118bc7a44d7f9bf47eb4e6ab7d9a41cf68ec3843516ecb821b7260a9ce122e031ded2dcf3b95eba7e150223d8ac562b1c2dc98e7e099a1940abbd2e0188b84d9c719e38b5b9bdda173fa8f735c8036045b1b0a29ce138cc81fe35b195c831f24354f651b9128b0703042f89a04bd718ad1ff865622ec443814ebfd4c62a1c30732696bcbf7dff77ff563380ab09178fa1eef205a92f3e890eb44d7b2124fb40c0442dfd0a5751589dddbef2e2925e4fe44a6f9d84beb9262166cc744a43b410c8acf9041c0c925cb61aebf980edda2c8a908b3ead2850fb9fec8df187af33bf08ea22578fa8e6ff2ff5f7d23cbc6e643a19c6b540555066b54466471f1241a507241db97084a96850277210a0028b0137d09536765352dfb2db79222ccfa6e855b8a62975749bd008e0d6400d164519519fa281584ccda302d08165d498564df46a4daa7d87ea33b78386a90d666b20f67134a8de9959a700c023908a0bf62175aee16c308941fb542170eca38e82b97c7865f51dd1e1861b36dde92601a4723bbe1c5ff5a64221710f709304968eb4e060ab1650f6926fe26104445f3d4199227bd35bd4f007984cdc2f00c8959c8ba8c9b5e39e08a12c1c9c7c39f92cc388f22e49b6606ac2a44ca0c8f7a0dde3b92abaf666660cf85396e2636286a16ec7d37991bd360f6c2d1edb77d64754f34ac00747076ecce7d4ce3a1ef2d9f9e316602f21c9a4a6b949628dcb58787f463c8b209c33041a807cc0f28d3b9e9a3b6ffe1d7b41463773f28690a01079a0bb878a9b115ffd280820d016842792acf475400cbe098711ecec890b5a7529b39221d29418095fc466d19f9391d38ab9f9f0921cff4f0cc34397b948c8d18534fc845028b6c22a82ec24d12193280b4b87fb31826a60fe2cfee57bdcf6888e33e11aab03a0514ca83da230820b077201a0e6a6874578980c5a68a282816388606cc384f149042fd198941cc4e0d3ae7faff2cc3eceb237a925c6aac709a1a7294ee8dac80e2464aa6c99df2e2ecb066383e1a96ef80d596bdb00646505a6b24fe9a4b9db0743e48a0de3e5766a26c631cb2b0f2b576e61dc6490e6e33f65153174bdf00439fec8676997a04ecefd392e1de382930f6b7043ad12a9966c5463e16ac9754c320506cd98c963b7192d0ea5f969066d88b92691a7593a24c8e769ecc6cade9d105b538f88801ad9b5852a788b39ad11f812135db34256bae283071a1e0cb12f555344016f93c682cbab9879b020e92449561cdfae3a76b220022905f15f46c5611d47dadb75a7ebdb69e4e81c27e437d499ad45103952f93aea4ad9e2394ee79ec10753cafe11a4242b303029e0846402074e1cbca2d4432b3eb23b05464ba0be3b0951b2848d556184082c9f81200eb318252934a57a231ca8278710fcb8f5ab7ecbbd28a60074a86f7cb4420673bfb15c812a9545513e5aa317d3c8550da6e30d8a7ab6258fc44da820a83e8fff7cba1d412d250ab700842b29c2f6d85c047ec05b560099ed2122c877179389d528109ec5d558b40564c0c36f6b668dce120b0ce762ec1816df091e749cb89c078a1945bac9af5601725d931fff75bd8b23223bb540151b41362b8a876571c0aace4b03291bcedbfb4699ffeece424b6c319844351151a29b43caa9274ec4f291f9cc2155fa489b7da82ce245fe47b6978dcea995902ca5ad85dc2cf733503a61b1401f6de6ceaf63104e1f7b44306903757e6daa0a1339a5d533fe83154505e8587f0fc38470cd2d2a2d0971e3b61c296e260d67b58eac32c7751a8e535fa6b4e8de8329256859da5daf6063a5805b8299cd48101b1b143c4cec36ab2911dae5468f5e07f6a4969568fc2ea57b8c9920c3bb828a01372f75b2d7443128831f89d46cb49367a019b1e260f548f39d14f5190b7095391a35e2f98e532cfe4b1ed787860008f5f1b92e9e980292cfbf228473469ee5510be367badadb335c24eba59b1f5c804e93a9f7dabd62a03f7c0c40bedd64c5eadf4e5a6f777b132aae8969ef9f4bc3c6ad13843beaf74384938ad5ebba29f60ca14596a56e53d32652660ffab63b5137b77c469ae1048267a4c49bafba6e65c86f4d807ea54a7fff61bb1c25dfee462faeedd39b7ace01ed7a6ca361d974ed9002d7ecaee5f6b65e4b3c89714eec845ac33fa58e4c8175ec9b54a014ab7a960fd2e372e32f4bf2014ee78db32d2e5e7541f9612ead550986ca7aa398594f3f1b136b13d614c73ab8a9b010cc39b9120028b8c197ac92fac7834668770c4ac2b6fe22d01d4ffe6756628a8cb7e6d50cef41cd32e2075e3b2e320d9fdcdb3024643248c01eff8907bff0357eafd00664faa6ccb3043c382c61e896ed1c4a034a3cf9936ec98adce8288749f6f06d82768b5d3b365774f74645b991a91ec4b7f16546ab837f326dd786fa8b9dd67378833d8b6fd8e44cc45ab274e3f805e6da2a1c4ba88708944ebf390acf7588fd1847451b2f6afe7542ba0ac4f650bfa34812029c5998b3ebca56337f2c30e19d4c07481db2248c8d4f88009d2ceeeca02537d43a3c6dccd8476b72dec091480eec7fb4c52d9aaa8fd71974c8581e4a10ea19210955f7e21b1d55827c83a6a6f51cc01780d0bf9f30b5ad2a7307f17b408f1791606b389c6f04187258ae331c47834f1bd5cb862f7d4ffa57472961fbc1dc8f53312201dad4220d0a0696b7397e5d525b616ba838a49cee8950250d42016d182318fe3b135e14461e23fcf4c687ec46049c6dc9401c8c9335aafeae0abc609bdf7666ce1a41e781e464d627bcfd8c83f7440135c33b11d799bd2c10711a30758b7ccd8931eb4f8c59bc04c2dba16960eff9571849d76cbdde44e3fffbe2217f7f48e21391e25fc3bd10874e731b65d3c0e95d430f2c4257175579547fa338e75499e76aac42194c801a05948044d43f713b807d8837451453c900b28d4329a076a9d635b73f43cf71f661b99626c2acc5465f7ebc5eee506c05d19904371fd9f8874937935b3e7e86f75bdf62a692ba644fc50dbfd0bef6309b2d83adf85030850bd55b45d773b9b0103fc3bec055c424b16bb9a5339fa0be8c3de1bcee6d18915420bae3ebc1686d9a7376a35f90609bf9238ed244a91885e337086c0efb7c4de0c4badfbc94c1cac74c3aedce64103e2e6da744a18dbd51627d9a4d676fda110cd94d7e1e3d3b67b36eb44cde41ce0bc42f793737b042ec78264bdf06a0227eb58391dad42903a4506471072b7a719ba802b3dede46a8a2f90c7a10bcd2921bafb34796d4c4c115f7402ab00abe324e13c0beec57e8ce7cdf9093404b78a0b6c0681ab328933c5c1ba8cf20ef3e122f1f9f83722de9fa5de6b1d9d64bbb11cd7188490e5166811ab86ab7ec353cc8b4db255dce84cef5482334305d3626c767e60a3a3c73035486249cb723474e313fa73572a0425cd909a40813832ad589b2a1b49c4623717368c532944ad042929327e013e68ad7c3d4ae82b0c032a34968fcdab1ddc6d6dd50999254ee15427b2f7ef4df2dcd90e48b7bfc314c251992169f7cc43646c4c6878d9f2d93cbfe45a12a75be4444f778b1ef6c90c98047871426982779a1521c98add64f050cbe3890958ed2d53f4136c8accbc3d7e9fddb206df917b423bee71c2c239fd5eca4c09e9f3157527792b97f321034c9c30c52781850b88887d72d7667c061eeb7db07979b7aaee72019a4487e504eed229fe677792fc4783bc977a405d98912dba119682947af4e6fcdfd85a546438bfbc27fec0dee7b4a5a385ebf07547cd73552161b6a0dfea60d9d8983a88ef1a22d5ed08f64f96024c410bf32295fbf1a59f073a71655e033801acb2251f6db25cd85c9d2fd796a249907bc7270eda4454c31316fb3975339ee5d91f34375177e071725272f2425cb11560785be6b54f400ffd2af96804a06a468f70f596e39d89c7abeb7c0f2e8b2c99085c91238e163681acc1b9dc71b0cf1c93f9312ccb333099a917ef2fdbb6be6d877da3884cebee924317b042e30b785f2d218dc8934dc26fc88aea25eb650162f67b0ff56168d9c9350b4293719618ca229b07c03144e5e29756ce168f65d00348697773a44c2f503c72070ea5d96546b1cb8079c47b59a00c12297dcc3758e4981cc2d9135f4d83308caedc48a1713deb08beadc0e86c829cf32ba773630eec70c89690726099ca380d6c572fbb372a14c3c82f7e169e4dcb1523badf97492996b834acb9fd234166185c1a16e1a12fbb4eb4a1c75b28174c35f384970a5b593c4919564a533fea0d2539298e1ec74c771c19aecadd7301d9aecaec5ceef0ae6b3ecdfacd2886bd7fd2c1ff66f06b65b137c31c0c16a4f1f4b0c85cdfc20696a5bf1cd9149e5294bb72e0cc2539ff15f8f55b6c8a4d8e8e30a63bf791d6a41f68632d6b63a0db8385519e0b2e26f46a52513bdabcc78f5d6feb538ae4e592c1878c5e09dbff69ccbfe202a6bbd3dc918c266395c3f4d6b2dc09f89d4c67a6abcc0bfefec666c7d6dd502d0bb7b81702db0ec0f4159c286859e0a24889cf089c13f5d63c2661ae51ad23e31ea4a19c69162c3186de6e0c7dcc9e2cba4d57cece27176662bc320340a2dbe9d0761b7f19b652990cf44adf64ff2ac3d32ef7802d2159f1cfc021bf3e0aa46dd9823403f0f65249563627fd9f6ef5760a10a916506802d5c2c6ecf1731ec8fd16c18a7585b0d6f41c061ccc54977968b7ea923de7f5641eb5a330d33356911156a586c736d08b0329b4928dbd1877f530b33e1e7097c05f66c6e7592e12c6450e9d03cf56e272826c5d3d5f9bc1153e5bfa392f708a2bccf45e469c48c49c57671f1338f02f0c9804046d076df9c256656112f9bd101603d5fc3fa3a1c0022f2be34e4f22df6d79c13fac30fa167e4de7b7eda2b59b12adfccc99dad401b807a8dbd1b550f1c4911027d0780d7b40e71cbf48296fe4008e9038b4ea1887e0bdd7a27c463dbedda5690ace959dd839299f9c56f7cf41781372e24425aab3ddbd9d06ed4a4af96fdc948eb7d0be1e6d7afd124d82bfdaf61445195253c67fe22cd3e8edd5ef33434ca30ffc61d3dd13ae8ffb2a8e97c6a41ccbc0f253191e420bf3982f267d1f70f347bf4c2cf50462a7d303f071f34f07aeb3ab01968466af8c1697539569a413fca4652dbb5da2fcec288f6cfec7a6c8e8d95632c25d73c074d861749ef3e727d3062680108e22efcc2890631f92c40032f9375c9a66b749be65131d45eb5c1cfd1a21aebdf3d8b10605288ec4e04c1e7ecbd52671f0d1006be3195d3fbf02e8c0854dca80b716a6c1f665c26ec848fa535ee174dc386cdef40f18ab1910e4ae03184836fef8f65111e4d15ce0aa04a3ba05f24013ad4067b4ced54732f49ce7008b325aaf5b13280a9818dfc8366cc9620edecd1bfe957e41fb8c2a2e76b5d086a41818f0ded9e265274806da0fd51a46b1ad0e40c0ff88524c9e6c1f935c82f01e02a466065680b5d14b148ca2fc18edf4c5b5a40517ea2dab2bd77e2d8360e1ea8003f864aed89127c046906f6edd6a24a46a3611f101edfc2992ab3309eb2e851c715e7d1acaa3f7cc79dd1ff558bb67e2eb37bdc75af16d3e0156734aee0f1d85866f5508d42bab6d0f124544691f1047cce69501014d4fe388e944cc72e8f6897b88bd8f46af81747ead7506c3c02576a18973d53a66c03997750fd69e1cdbe0083b33ca7c11b87ea40f5b60ee895dc41b4bc68022048d9939a93564f1f196b4f63b324f7b3e5835b1fdf875208d4786e23f4cfc051edc4ee4c9e951d697105726083f1bb89b78916723bf046f50a5786198003215c79abb8f895425b4bca8b4bb63121614d108bf89788d9df7fdc2202cb4a82228edad0cfeb837611dd91936c663b4e5218689803a925fdd5d1df0929e088bd90edd0bc0ac492cc58fef28639a5e17083db853a593ddb4befc03d6184b19822fd0afeeb7c9251862760dfd84fbd8c7dfb072718898278ca5c64a3ecd72643640971eec6ba5a11b11b481bc9de74e1065621dc6d34f102f3c64af0221aa7371ad5a9e574e8557a2439f8710d2ccfa048ceb2b19f5c234f992e0029ab13d75764f30ed0ed7b509333857a0c08ffe301db350ccb28c1a3b5b39fa1203684b412cea27dec5ea81901f3493c100be0a0ea39e97dc737f27de91aefa42daa3062126b766c0a75416a9b8f18c4bd9ea726f2c8c4d70f97eeceffeda01a3a7599c25b322e810a12d585a20a402518c0542567d568e27ed6f4c95106e7bbcd7566947fb82051a1d00830230bd7866c3b6a3b39b0b6640a420b56cf3dfbfa7637c337ef8953ff783a0eb1bbab3179dfd4fdc12231e76c98145f8ab7638e6ccd68be8eb598dea1a6d15f4f1963bc3415140a7e1845da564068daa1435cdfade09b72ae532ef7d425019aba0816a5ed7c503bcda72f806663d8d0a84de4fb3e9afa61a45beb99e67546e41f90fb4551a0a663f61622d4fa986f2972026928589b73f3f806986db5084efa750c0c30932735675f4a083cb37f2fe4bb43155c9cfb49591a93b5978e4c9b75dc3722ebf0de462a54785b9b65843b5b3ea77f75563a5f08291b2a5e447461cef7c0bd8097785becbaea515c1aed86427c92dd8686a2595bbe77155b4b194773c01e9a6475d17f262b35b5c0520e140b2d60a25eb0c46146e8279da817431a0ecc6aa4963b62c8fae9d494ce4a20584278b98757b1230ac0d45a52cd90d4a1045e7817042dd7fc6cd1dcc922c91011e7cdb638bb0cf3432ee1a5dca7a6e5338017af3ee386e26f8b5c3f5df35af5a9ce400df75065c736880035cccd8740e3b34dfda2f153e70ea80c9a12827f6f92802726439ee23ca32212960a30cac17d31b50a765cc30c1e9a3ae95c41115a6dad9d164b7ef7b7fc61e2838c0bff50bbef4ca88263b814cbae1757f425fec41f16cfe92e6f8f2e12bae6841e7f52095b2b4b60d22d91734b686d95dc2f216339bf5381957be3c06abc2f1bdc25fabc4553c4a0b5df00860477cd7066d82adce46b64d268c9804174d812286a1ad94534f08f449a1cb7a039097e3764093e022af0d61bc7819379364fb94227201a2f2576efaab731650b8f3ea593f72fd4cec7195d3584f5c9922585dae0ff0fd6fc480cf45889251848c95901f71d1bf2e701f3eaeda90aee77d475c247fdaa49f24528b2a222e4a80bbdbe960436a1f4420b0774917755d0e8c6d199da27b760d2e19cee6c47b157ffb934c76b52762347cd0173aa748d7242cc2eff80778f990d343dd3a2bd28f9e8cedfff80e51751bb68b194b66c5e4d5700cdc54781af06bf14f25a6a7e47cf1c42337f397aecfecc586201c8f9f01ee529e06ee3909ae9b040fe41557b24840f51d19adca84e95931c8b20aa537ada1980116562ea7f4b40d72398c93e540ee5d187018214444764e820c9c5c0ce5673e5071b263c963b0480a2d2652559e429dc810f272d8982e745f1c54aaa311b28fa3f676381e6c11db00871a3f498dcffc8b829b0bd06f15a03f047ed90103ef30edb90e851eca672fe338ac2b513a88586ba4b708a12da1132836e916a85370299d62397717e4f84882e5324ab33c52abb999ff31281733d0063feb38fbd31b6991d50897c4349b723b9494243e01c69aca7f323a4efacad0fd5407fa682b17ddeaee73f2f010c63c582571a2ca33111cb249548ad6cab3b2a21dab69f9f860f69dcd954b9224d94c980199f706b6c09a2da476843b79830c2dbd3ffedd05ac323695daa8e35af652e698903cd5f15468beec7867150f63c44e83a6595ebb45029bee364b00eb38a926e402b602a89d200cb93bd11b5992b90fdd2cb30a8f73fe0c839a8f0f4eb0a7edb075440bf79c6ea579d96cd491ddb5a31fb707cec1fee7b4e59adf8650ee615eb7602188cb189ca2605faeee594af7c069e99419b96c7909eacdbe6917b8b64b6e38d71b9cb6c43d153b5cd900a4744496ca6a156029a345794db44fd2ee7d7ab084d7de17f002a71eabb2d297ba9c179f4178831fd0b6a4fb4c1d448608974c389bac7d5dff69a8089fc68b3bb9daee14738ceee55425795e758d6bbd461f15315ee05278fe22509773f8739d6cfab32b0bcf3a6422973ec2b5fcd61e2213469c4fdcabbaf4c60ae92718368df39b4db2c65b692fbd891207a69ea33a99ef2a69a04e1dffac2f04fbec66aa5f2c100358b1a1604d90589ca973b3233bdb19cf492dd150236f6162eac056b056ae628b965d8db91aa343396ffae39fdc8cc72f2ab5a588e99798b8e16260b1e0095790174123ac79759bdd035abb1e28cbb235de17fd3101393bab876aeb436d79e41c29a4fda47289ffa24c60fdb6da8b1727bc7b1ed941eca38f6d1b23a548b62a35baa693a528f8074a7c903c890c458ef3a1c1a58c25a0cf8a76c7b5e78b613fbd9cac24bb7f6e32513f611c7fa60e5e042cd4537fe45ea18f741127883ce9c0f805d86655e8d354f0a9f79561e0f80e261403558d371dfaafbd7ac5e6774b9274abac68f0ce4fde1ddab9406511679141b5eea020093aa7023d65aa8588b2ffc035ca5dc38039f75026de894a0106d5744f48d265720b9065e0a758f2fe7b528f6b350af1043b41c9b6a824d84a7b5e6809d093fc8093e920ce6381e901973d24d658cdf0b2d30616e5ba0a6892a0a11919ed6be8244c76c65501ab5d4ce3a8a79b0de3a991bb7fbf5f2bb444bae84a493b902931879b182e12dbf7c0da04287877aa4f878ee43c8125f15954292b8eccf3dc7abd66d0ea6dbc684442b9551c0642c090b89192f7045b329f91fb1b347d0f8d93337ad4339d67093e652441ab92589f81062bf7e0a5aeea70895b7f299628427518f80c78b9879f3fc866e79e37ed5a297d5f115a293d7aadd1fd4f057f52ac102456aad3a86b3ec294ce6b1f54e7ce7c059fe7f0d16a005ec66157936a1db00323616eb2a1767fa2bd9d378639d0ad45ec5a0cebc9835bb6aae412912da2e4a997f2b689785af7bea73aa217b62dfe664042302a1fbcc9023527cead1b78614f419b1392f7371b9cdea014a67dc6541bca4f379ba850c38d9c1d89a67b865f998c29362a052bf4928f917e4c01ac7695c02f2b38fd39e741f6656477760bb4bc61b3e803a231011c426206680fdf28ef6fa1f6ccfd260de1ebdf515c64d82081e8242f3d1b7135fa8d3230e8153d9cb7a0799f0005a6fbec28f503b4d087b8794f5c32d39b378736e6720e8a4cef4ba16940fe80e75326d43b345e8f13265ab1e6530e0530a726cbe30f1b721e7537e72296d594caf5271bcc98f084111f3b49680a0bc80074726ff8cea36ca15278d8157e072174422a06cb78710fa72f9139d75b2c39e71b3fb0dec835f91d30357f98c201eaf34f2f9e623a0bbacd195d5b7138d909de3250e11d945bab45e37c396e4c4877cce81a1470cb21ab200d7ae655144582c2051cd180032bd8d69bedddd60eb7b6703874a3e4ce8675645820153041c57811d4b49024eca3f84fc7e63d11ddd9e10a5023b0d99139981daeabfcdb3a6da028c14357cc60e69699e3cc4546b7d274cfcf412366b6cc4721c6ed91805fdbe53442ef887ee4808d7601349df42a618221995df9ce55880cffaf50d47634c631902221cf9773f61080d480415c9e5421154f439b262688b9a8694d856fe26530c446bc5896e4e3c7a21e6690a141b0171f898d1ca1a82db84f028cd343c2d3a2dac6aef92ef9de93e4949aa4264b6196765370af0e2c288c07df84bc3729c0137a5d7f544c2271522585c88a094ab8fbe32947d4f7c3244bc2c5731049934f3223fa51d6d6c5b27a422292c833efd9cc68bb5d3fdaca317e9eb158665d9c8369d8732652e530a28f19e748567788292d19ead0c2e220e50203400413463b230a61bdb264224dfdde28f62beecc96e3a8d4a47e63a16862ad80d3f6f02ab62260027bb61f083e69293cb048c5cc9a2eaba72fab560e290842a73ecdc333fa28c1d997bcab6266a47df08997ed8de17f1bd80ca59573db63bfc05dd84202c7949340e13cd23c2ea19a2f7cd291d5c06f633ab9925e45a46b758a36e1d2fa68527967499a2b7c91f9832c6ed0085610e8baa7413f744d7c400c086286f479e745daff03f738226424fd60d61d260ef57ce9af90d9d379d5ad499bfd7572a9aca104df3a19193fe0549e476847dcbc7da7d9ea4075648a69649d4086bfe2779b38f44d9d5ba7ad5b1ae95e69a62d79144ea8d9be07a5e2b374096b9159988707222e63902d9b58d42c1805073c3aa7ce551e2bd7dc50d559b85886494decad104c56b2bc5550b02a92bc7c057f6f8ff0192d2d2dbb386758bab22f2863260d78a641ddfbbc62cb04898bbc62e244d1f3028cff34b7d52f5824e69d857702cc09e7e97b1b9f15a2a395b86374b5c8c92a2c6250b8f9bc394d98a310459fe898a8175b8bb9575b7983aa63f37b2b7d55822e191fbc495a743bab411a46a735b91ce163d3abf3eacf65132baf5905b8d7825e38e6dd112dcb3458608e3faefd4479566d3916617a62cb7ce7e5f8ef522f4264d44e91a333acb574f06e6c7d4e3e2be4241f28f28a9659374dd041c661d77217c4349bf9dfb6c5068a17c51db16f5b1407ac6e406d36d09b7e33d1a7134ac75105c9c404346006da32cf21441789462dd69dd390b5c4931489cfa0f77b439c72a00a685f83b5f08ace2bcd82b426fc659735f67f4709e74eda7ade558bcbc1adc3f252f7dc0e6437b93f813995350c8f2c93b169756825c8cdf416e6cd341bd4c711bc8186ddc4e55630f04c3f365e4708607e6b615600e96b2fe0e61c1c51df2121dfd5ccdbec359e344de90d9d51fe5e13b8273ac5c2c4ab6a1a34d587141154ebe4e54cfb20e64d7f29229a8b2f21d7c48f3bf55aeae7f96a3984df20d5e25cbd7a045e18c7608920b10c1237ed147a7be297ce6ed869c050709d1065050713a68bca86883f71275f66079a78c6863aedef9deb0bfd17b43235e14437a255aba60288ab63b3805a44e812181890734b3c606844075238b5afdecd20101281a8a4b42317cb782901e7b26bcad1d7bb0bf93fd2de52c18555ace66053175bd19aacf81c422092302b837b084698f4387c213b0f2cdadbeaa9b91733b917561cdc750c8cd18c548fba55078eac53e12ba426bf0b7c173ac379472082c3df4f9a695ac683c943487c951936da05c30bc92dd0f4e5062d40cabd3778da5d26394236347d5ea4e3b6d74138eca0ca160a1b8378eb9fbda3a698c391107d4a8024c756bc15c821bd8ab0a895f0d18019db60f96c4310d62daef2c40ad47b62727e25d4149717a3d077605d5c1aa09395418e7ca512efbd8d37518b81c5e17f77a607b487aa0233370d16402cfe47f1f617d0ca71608b836c15544c992d5eee3841877242d1005069046d7055980fd4d949f58b200e0be8ab0ee8750c61f7a1a6707b12f49ecb233678ad562fdfeea7376b870e88094be2daf3ed2bd1db9bd6d08bfd8c55e587d303e62e68d8bf5702000e88bedee846b0dada7a66c5a037766a9ab5b5224da740a951c5c522ea82a8c9c64786b9c07c0f342e228942fdbfd4176c6598f2da1e20ad73f11f8af7016593243098a14f5bdc0276ec65f306286b7fd8078f960bfeb33db6f3ed95eec922bcd8f65caefd7ed509ab84e27b70714dc0a837672a35e79f110ccd2e22aaa6f0d18c506875134c92502ea0e3e4298d0b37c2307613b56f7579f1e19168fd25a637d288510f351c3ceaa05171f404b1279619b2b626e051172f303b6f123395d67f9dc6fe66314ab1892fe5c80437a8b04dac440ed247a8415d2aab4381bc458a482877f73b41bfdd1270d6f5605641a49ac40936269bf8d8a580d4de6230456ff1e67df66404bbb440470c787385c4ee3ab6bda230299160104017944c5adcd73fad0701ca01fb97a0c2d4b82ace9920ce1fc63c159856255e02f98f1b28589359053056381f8591ca04f011107ba25b863f65b92d34da6e5a1b4d8eb207b513efd461558b19d7c88a0a77066cdbb3e050d9bd6ee4d2b9d52ba55549fb3d2fdee92108596033413a7e648e986c3d9b5a289d3740cbe875090a1ba765ca3b024f3be5ac70cf9375c2210a908cac4b0b24dc3fa1fb76b0438bd070608b459403eaf02de375213c57e89b375ebca39e35b59b828e65a2680ad704f968836c54d2ea60f00f9fec1f097700a45f1b4532de0a8645a093edbd57f50251811f42176a7f1fb5457b52b01bc21ae3f4ea39a1ede9c7155d577b7a3f9bf2f7aa3f3e96c378fed78224f82ef98db36752c4939e524aa3eddb7cffe2bee1adcfd5db144adc06ab3f2b054ce4f87862274074a2d8149ea8602e90007f1ee56ec359629a3f7faa49adf5181df050256c8e0ccb93cd9a6cde18edde0d83de96012e9fdd651e0f699d7a159f450cb4a6ef00cd1500110847ab9c3a0bad55f30bb212e28866186e88a71f9e79ec8612de750a3033d99e3993a177a678680c385c79109a9ca98d5cc4c7206d234b4214a4f193c7385b887da3f66e105c62f429c9194f9be75e48b2e8e17d3acf847b0aa4bee22def200a3c558c18659cb60bcdb29b190a89a34254183e52e77b865117c0860deb9103841d43bc5c00e9a53ae8186cb337744752f5e019a45b446f8e8e6c7ab00ef05948f676f1d2846766534892e7473c059d3f18b243dcdb3a5d280135f3831fad9cd69b090443fe7a39e7018f03d1da1f0bf57a02c8631d72ea1d5e8439f1de1a562903d40976a51bb4a63bf4a68dec2f3ac53a155c99aa4638ec692787003129e7bc7c10d867897b3b37c928f3d722330c5e51e7485ba73e1849ee2e48a853d248121be6848a4784208a48a27466a531226165aca4505f94f70f1ad3fbbf5714890451ca2998a2e40c8e2dc7a8798af2bf787a109175da9a02271a119128ec70ecc9ad0ea790e4de4be84ff64e419183bb1b66e31ea20307115acad93473920a22ee95038d83f55148a42adb2f498d4c66bf54be8ea8cc4a5330737806a57ddef2914a24176f01321e988470d8d34cdeafb3c7376045f7aeb66e3484ddc342113cc866a8966d4f339af2a8b25358f05625790fbe130ec19526a262de232aec68155b446dfb4238e723a6f0cc1fff3810bf68aa4b033b068d902387479b49f1a27276e8e866ebbb08d9a5fca2ae7fd94fdd66d1d443f5f98986153d2dbd3b78e1c8d797daa84e3d70192c585ec3069f59ec638322f94ae302621e4243be50fb965289b1bd052b140c0319304a1826fe2d4c533c0697507af35bcfa8772d939d10f4e35899c8b61846265ba23174185c6ae81828e95c3bfbb219497225a1ab25fdd62c530cd10b0cebdabd5f5a8c00063243d401b17a00224c347f404bde756a83e6e0ce1810777ce40bd0469663ffe0ff31e3e5d807bd4fd77c279fedd9b89d1e593ded161891254b8c5e4c3149708b711f51723c0c7c0e79bae8cc6b6341b55797c404c0797cfa8f1f05ea504783ea0972abe39f45f45f8df0acc73001154f2b65917d4adce9bf021b3f4930c787c57355ce0de628043fa0bf171ff02c7a0a823db91cb38dc8bdae6fe2fc12057f3196a90c13437fedf2c1a08b5fe1477c176b6e9520f72d0fe3e4d4fbe4cf2b0e316ed9c6cbd345d8f007af27617839f843e5d4b5360d3e8b4258b15cb4ad12acbf3f644d60438081d914e171bfa334014f71e2a50d82f7f71035e6719741c13b5287033adf63ce262c826a345e0472a686cc841c43e40ad09eb522faa686c9c24cdb6da1a73f7a7e8e355cf0c31c33477131c0cc8c60222a0397ef401ca4fbe5b285aacfb7ff516657b655377d9bf4b2d8b694c11a0284e8ffc6b66a379fbe4269619a50c36a62133676a66fdef4cdb30886d06fcd3322c5ac8a15f8d85a4461f1b3bee4e2eb2b864d9674f6a1f93264bcf7452dff26f2232cede3d012ab43396bbeec4d51c6747497d647ec99349ae14fd282dc9b67b2fe57baea2c50156bff1ab11712911e99a1a8790374d4f2791e0152356c52fa8f68aaad2179b806ae771b1a495469a95a74b8b7a723cdef03971cbd0e947de8aea1554e17e6700d03e81ad0780d3cb945cc63d4cbfdab145ce062b762dbe15f08191a804b4f85f4d55183d48b007dd6dd8b536cbceb3b73cec55136d0598ecefa19c1e1af65841b4a171107e8e11aa10df5a23a59622874d8d0008796a03c9722df3ca5b8acb421468031453239854bc2066bd4400232d47d3f3970bcdf81734f9234416e030459f3cd31f4bdd9766687c0ba727307d8e22ff3af6a504c440dd0018e83180a4c7a39aa03d55b104ebf4ed94cfb310cf8c3cbe90f89b7b171a20eb4837fe52e74c0d53f703939d0bbde39d58d12a48da49b77b7f86096cc6f122f1ca284c45f537c4877491ca6a0f9565033a8ef067264e59136bea4327205dcbb82e6f1d27344849ecbd92fdd9635424086d7a5c7ff868b2e0682e393f7d6ccc136cc008fc6b93fd7132c0f39ff30e78be3c4e1166075cbc1a91d00b69183728d0f00ea35ec4e7f8ae3daf352eef300b0fcb8ec432fd3c250401ce0b14ec36aec4347599bc657cae1f4f75b3075c84513f2bfbfe7b55f6739d8d625980d339631ea3fc015e12466f675913184d3c1ccf5b4d43ff88aaf73ab6240d3ff6f67423e7e5274eda312df50cd59c3f34b2ce1dfbcdd13554afc84b8a92970d2560875c8a2c7d815e055745f958db82be0ad95bc64787ff987bd0c4157907e5ea1fe039b834f4281730b8626ab2bbca3f00140ca7fce2d82d0dfe26a88b9451c6a4cd1a687c1cf6c775cc78aec1316e8489b0e6db4071b92a45e13a99b6cfa2c9f772a6823765f44a989f287eb1b9cad1f4183c00b1385f7ddd906e6b59267e819c0217e1d962354a70c519f7c2f49a35329fda1e6300024f31695a87918c69dcec413b8eae0ebdcccfaecf2deddd4f933a0b5c6f13dc6883fef215438f5b151b0e82bb250dd5854a20cdb6f73c13bc8064b46fe4e9c32de992dfdf7e9daa49ba5da4cda95135832b75d0e02a4b73de07bcc86e011aa407e11f2dbb82e7b0a017e98a83ddd45c8d00bd4f44d0ae22a5ec6f8db2d33749b487b6710fe14e095b005a9ff39957b69d8ce99c2b2a49cdd76b437e280160a2ded7e6080c143eb84ef6a95787363ae6e37400d57d2dc5aa8faec9aac1713b242db62c1037a0d525902ed873a6038a0f6381fb305bbcb5be6af9364507e115a2428d119720a13e4fa5df98526e7aff00de3dc1a92c6dd90b6c4a211410f7197b0a29b2b815433912ba33a37b206102831fd1a6d7893ee97e084e61193bedace83a4ed34d608ba8c0141d3a2526f0686a3871b13d3402138e2add203aacc89f3d520d9393e224d142cd45c1d983937409190ed5dafdb22934455a1f22c16ba57c4690a9885faedf39de1d140225f43baecf5752a05fabedafb937f11b2eb544949925ca33142ec7792f5b09c1570196392eea0c449c1099059e7fd3979feeced783b4bc1e8ad745767b0f9b312733e0fe239f7de2b78d060ce6ca5db3d1027b5d64dda2e070ab2a47b9a9fd73e0e7a049846d80d3fb1e772f57e88034771d38524906937a88dae47b68ef9f01f388a4e2c09a2c6bc4c99d6e737e74b382d5ef588e167f94b58c45596ba0438f98a807d8d39be17b86380f1d062380faedd5a624731f91e87a3f51f2aa17435a3bf49c8d904ce79e8f2017ebcf21d1de479fd83631cbeec57c9c3586097fada92cbb0beddcacc13cc33d42d6a451053cdcc6bb70280b56130bc522d7f9f3137de266c91708641da84287780aec62ec15221635428e4690bb36de8c40629c0d9888bcfc3b0d022365692f958322775fb7bd444c6d656e2ff4479910f246b3ae0302416e8c2b72479172a0013bf734858014a12cf4834a340b80450f2f441763310a53edcb0664633c4dffe78716332cc3aad05e0023a088c32ea6191908b9b0d228471cbca33d8057b3048d5737fd1f56cfde77ac713e70c38200dda81cebd02d29b0524360f401bc0099ddea7e31c0630f449b9f476cb8e9312042a6295a1605da6539865e551d60f73a1936029c42b4b2fb4fcd2e0aae636fbf84554482814e072d5fb06c9ad041aada3e51e52249b38761c22e8e39e642b8e5430e19d9ac4868a3f65e34eb9d2b21c55c045a7244c40c5dd75bb1db459654ab3db910e5f764efebb577e4f2f37bd66b567b3fe601fbf3b25ca6a7e759be5346e0a218b4c6b5c31e31eb4efacbb5a0810bdd41860fa00803439a830e8956820af80ba71e346c78ec03db03a9c69146013444c64d76142b72de49f328bc30357c829796b15d33f1251e14a10a00f416dcce6fb171286ecb093ad6421d548b71c4a2ca5abce2f51a1ed74ed0d4a888750736c28c6aa21adcff9b2398711383a225bf88c960522afa45f2e0581dfee7642670f12d2250fd80291c3899aa052c0294af82a742a82b2bc60a9e2eed6cf2c998b41487e36f6be74476510d33a2e875055b20c86cf10c48729054da3c1236a70c65b1556269fe1431ea9a7d390f596c71044f4decf1ad7647a74bbc5e78784461684a02be1bcc10b55c9d47f396b3fbd4cf644c24d62ca61337591b7811db209810349819b68dffe605a90c81b999c0c7337022d70a88138e0ac549b1c3178499452c29d2bd8662eed0f4afc497cf5dda3a7c4f30e076fad0dfb42381fc7fd4a59aeafb3414bbe23e05ef35689b3f73da7e63d0274e7c362ddee81373cd2c73cb147cbb25aa54b1572a3603ac0691c4dbe7735124906782690add6321f7837fe321461b6b9cd7475d60ec3a8b1d710dd39db0f94533112659813a3b41a84b9829b9c21255878eaa29602652e0a4e11f650d03abc08da98379f093bb3830c4ab06df69bd00ae8ee76c72bf28146848d96508008576b10a29694166f26580aaeb39867cff1f5e6eec2efc714f05793aebfff40ebf8b0672c7b7aed28792dabe4581799ee1b9a271990962f052e37baa16df0a2abc37759282957ba4e3d012922541db8c3048fae818e7c41096da27b32d6ab5e939d5548ac791671af1ca5a1cc1a1016243f91d39544e2c59ea97c62ec3fb3c0f064e6204d6e394c9e563fa05411e2d6e739b94a470051dd22acc3ad054398eb9da2675b2358fb80fe5815a6f755b284628d935306d0b81a9e17b49b06189c0a96ed6e609c67590d83a55bd4d4da88fe6a835b811284e2494225aa36a329869189e060b2521753fd744cdbd792e18a9ab9858e17980876ba75baf94af8c53266821c00a7522bbcf0bf20ddb9d852d131a14d3d52a906f839b23f92f875ad298261ea18de2067db76bf3841c1021242141039811d4e33403133a2df5eb52c5dcbd608703f52107fae5140fdf658c05932347dd2ce1efe4b74af4d018e5f66ee4cf5fe4fc0874e5be2f5aa273e4457ecb547458df356d8d77b9b864b054f3323c2937789a758b4775940c87b4c146ecccd79393f0a616b7f63c8492f6f9ecbe4c66d43842a31666b10f74734e71e8b28d5ade03c02dc2f575bd562002199c2e3485d780ecf0d458abeb24d88d004b4c46b0dd77ed5a34747041d9c045b2260a7f710fe17e7124b8b30cb67e0921c36289474cce15a633883aecc6b770f9a7133caf08025211fa655d52a5b384e846e27f4434d52481d0a89b0656d456e681a018ae40ee5fd0ef50c520a68c9db2d37ba5b9aec66c55c080bf58c633863cf3f8714c82d5c25078f1eb4c12adcba7fbc50e9d3f4a2aff2cb53a820ab050e9d63b67783447b24a69330bd7dac487a330cbf617efe64c178ff84f388292078c8331fb3ded30d43042686bce03fbb5c99d73ef9feec66fda3a81239b04b64243021e7d091a6db1741f0d77202282573b7ccc726fd6c5b4683a31b889d15a6e428b119134fba8afb0701bfed124a90b340ee7ba7a3e640ef90c81e0994131afc627cf591de8ebf483ae060b0690264df494793054c0b17ff8ba59a46c1ea21cc62440ddd1d505c00146743ca0e527abaf3060b9c441bf0d0bd16980a5bbae4b17db0910ed52f2999fa59d5598022f3b9bfc9944fff932fcb2cec4cd9460ee6e6748ec422d08635b1662b83a27725faed47c7b04b74ea67b455075a14dad2d5719c7dddbec8941b88aa846f32d382df4f578dd4e9fb41cdefe220e787a1ec19f238bfc7702470c56d63e30247016930035cc4984a501c94481e60cfb273a83ab9534033843203d063fca7904530d72c29148755912a39a683478bcd0151060963f5c2428ab201a03df98db8a55483faa4dc97ec89107aeb53037e53f2763195c1ea31f9e3f211730ebb1709f322f6c7142c5c0924608340dbfd45a977bb8239844a889f246ee269107d79fe40bc734ad0f2a39cf103ac5d979b511f6a1b850afbbe2318e6b667fa3d39a1b5332a1556f2cad3aaefa3039736cd883ca36988d1de17894410411acb44219a1cf63b1c357a1187162ef53102740d6d6843eea24069691b6a3ae091e105c1fd82602f4b2b19dd3bf4f7aefbe5b6fcd4c50756f76aa94868690c8751cd8d313107f79e3aeb45db2c49b5f279c2332c43a743c64c45065d2231921ab47c5d8d07c74bace70667fb9653a8b180f9d9da2d0b76fe49e60225a74aa07b368ff9e254c1c9d461c51564dc44818e192e4e06b015e21cbaca9267f6603d1622b8c1fdd941677873461bb1667250a9b666165e87596e00877b4eb82f64966a0a2dc09227b8d712ed993dd817fa67381c7048ffef4e6dec964650470a09af0c693104936f66b9c6c6c57edf46c0b71a82b516209c23af5ce5ff191b0da94383783de2c50b315ebf058adf6e42c169826ad72788ed73be709ac99fff5632e6906389ca219272f10c9ef4c8c034a35b82d0bffbecd5867c0a283ce992ced5f0c217ac4b7070bec2c09c45caa6782a485109cac09a3556f3968838941fb23ec318d78be8ed4e643f7f068b67dcb558e2da3a57a36e96bd0406545c576288c167c5eb9a359ebe094a380a5de7b4850874d051ab371ac85e7cd0c3b46698595b783402c87d176e1fc7b8c6d8b908150f95ffe976250e92bd05857c06a0b3b4b6a48d872450e0a1c8b5d8d71378b463d7294bce0a836b298ac410e496888486733a29ed06c57d483137ad96c992164ec0b835e9f348dba61e4ebaaa8d44cf0e6b1ae093e0ec5695b94003468144546133bc356c591c7fe6eef48d5c0b61f83892a4127d851f60b5a9f6618be4c4be4c4c882fa4e9e225e2411dea6d38007bfaaa6aad23e2d20beef1434d528e8b32eb3f61d3983a5a18a2492448a7bce4e01ed88f4615bb2c7c23089fa8ec806b252b16a7ba80ff0038a320be16444e1697fa0c3f187ccffb4ee7e3c10d7c6868b35642ec5b12108923a03432bb8d1a39bd65ad99402341219c1782f595b018990e5ac46d87e29c7bca286f002b19b0f0845e7f2d41a7eab83f233ed6ed98a74ddba55e700cc53ab46f18f17bb93425041a2ed8b6bfaa467fe2ccfacd93d9ff634ab9c1620b81cfc9bc04dae204170b16d128b0fe778f15249b37f94814846be2176435e37d03d2b97423ef20e56b7783dd02dc31f84dec2752e0339e7a392b34e2a2636d5a92f8b10fe3f53e0ae8f8e8235ce73a9b52fe0703c6bea30a064830511fc2658dfe45e295d2f6087d1aa01a1c26031b84157042de8248b66b8988506e6eaa3b26471848b561d60a43bf87a0048263f31470813677831c09751e8b5a89d0ca679baea44171a3e0a21123904d998fa46cfd145848f44683e4885fc7672fb042c42c9b649eaa8bd2df34dc5ed231d16abe11936fd3b29d0c61cc51c8c2cc56a1fccba2ccdcb44c9f405215b9b1121e02fef2108b0833b5a463f3ab2b0616ff934312e51206d8e9b205265b11514ea36b2d57c9137eb539c7134bd27319cecf9727662ada18af056bcf1f6653e465e53bce7ce328468323404e36e71bea81c9c42dacb795c63d41c3f69233672909f2ca1c95f1b59288951b91874a12b63e2aabf95de87893c8a56561f2775c78034aa05a875a20d2324e07a91b1a16d63ed926ac4fc13b87f3d8b1ac2b8e88f58ca60bde7b8019ddcd84ed8a65dbc54c1ec0e4ba333b3c00882acc3d80f381e6ce3cb9d47f7f9557b3959acba248ec433fe8626fd8480891dd6dcbbda54c29c935086d0852082fef16d616bf1a64067356802bee2590b7ea16d286bf67645c7e2d40de92afd9655a35aa4696d262ac5187fc6d5cac6fa490134a2ebfd7d337a7cb51bac54d8ebc237d23856cf043f3bd604c137202883b7a40b22034eeb8e335dacbb5113a331f4f7ef40d730d2e3f3331721466e3f2f338ad5cfe9122f1e99b91cb72f9b90a71f9f9ab1012a79f6920af48a22c72cb8e3b4aa2d8112547cceec84d4a45a56a54892ad0e5e7b28c5c8dab5d7e8a643bda90288dfe4c2b7d33d990387507bbaa5d7e22afa75b24b90dd3ee1b76641a1312a79b5b6d58ee06aa5a6c51550389434920c1b824f0255474b8e25e86c0815ff34b489c8d04d38df8eb159e00f71bec7a4882edfd55e02e778624d8c2950a7c2596bb3df75b480289e572cfbd875824964b4189e54e3087d8a2b862ed088add9ef5cdca6582bd52a8892ceee8babcca39a1c3d156a309f8f58a62b878524ad9fdccccccddcfb265bb4fba9d4e6ad8b17e9d34d58825130f29a52783902d594ac9cfdd31049743c949296fb03c4a2f375837a92089acdced9b66c8a2aea462031877d5fd659aea9aa06a0516fceaac1eb9123ce79c9973da1759aeab024b3f037a76453b704553e08ac680a79c5681f26553f375e6ecc161ce9c73ce39a7cf39e79c734ba19e522ae37da7266aa27ea652a9ef4f79def3c87c69bac012b8eaf09b5b71dc36b7c4eee4ee9c386823e81bf9041a5cee7cd9375c66357c3f5b82e0b6964fa4c1e5cedf497de977525f0a799cf4a7c215ed70a7be17f2a0be56273af665c0214e86c478ef3d0c380415ae5648bdf7ab0e7752e18aa2bef4ab1dd4977e45c318d88210905f40f6f1e69b4e75d28ebaeb5a05026a260553f24000635e057e3f03ca3c0ac4f12998926751dcf4058a7537ec9cd47d73c959ea643ee66338fe2bcd3c9117ea63defb9d182fa6d6eb5faa5592414fe0215b18f00285972736e6bf975207f7a587f98ae353cfd3bd0c8e97a6958ee7cdfc6cb1799c6ce1cef733210f8e2f1c02f3a9e7910963c252ed4a30a91015c662a7f90308c358b6f54b0d4c6821490808443ab410927024a99266928078161402587a10c0ef55a0e97180303ff3727a19fb31a81040f9c231a3e32da61119e91809c971b9529094a48214084992f14c5ffa18cc7f329e1793fa30e4711213f2c0fc57fa4a257e8162a743b19433ad74bcaf807c79a1573f2e954c5ffa60aa29880a7ce957938ec779a0101f5ca853d47d4ea760ba3a5287cba2d27bcfc2f7312f4d3a32323120ffb450df86ae7456fd9ecc7bbf23f35e873b38de7b2fe4b16ec33d8e27f2aade92796e48cc7f5ff2bed4ad569899a9cfe3fdcc8ecce30879625e26946ec385de977ec72b79315f58823181a93016437decf431d37b1fb36ffa7e409eb9cd090c1292c4f5498b276b46147399b19e36eaa2a67550cf6cd85b185aeb79263046be4a2dfbc96926f2561bf53891b7e4aba87b66d8304e72c38edd1333fdcbe774f778eb855fba6e494b9aab48f7744f1be92e32c3eee99e067ca37d37b9b0eacf0b42df051aaedafbf926bcbf4ba7851174ab04f3fe42b6dc1c6f79ff305781a78f953ea6c7bd439d2f5cf57f4fe4e57dbfd3fd17f238e9e739853121fb84dcd33de16b03ad14dba63f05768fb762a44db7cb974ef739ed41dee3edce4546d74b44201fb94d0c6424b7298289eed64f2d283b1f6f79a6f7e7206f9ddef98767fc6299cf0f5053fba77f79d3f75ee93b6f59fff4cc6dfc4f60d3dcc6df8244d7768ff8ddf3a8d99523c0f011d93a45449fd036cddf32386050a9179fed65c0d3c75414587a3bb91477733e836c1fab7f9adc73f6f4727a1bf2d43f3d4ff7db665f38ce9eb002f7dbef70bf853c4e68b8b3fd29e47909b7d78999fef3bed47de57edb6ae9e3927a7c7c187931f038caf5e728fcc2317301a964e4918c7d7eb8c701762f03963e06b40f9342995e6875798b81663417edc791f81e383afa80077e1c49af56e5a8dacf7dcc7e877a79bdc25414f7f5fb6bf730218ffdee794acf3d9117f7d6f35ad5c3fd8e2e1797d03dd761de82a97f8162fb8eaed50adc97de47a7631bfc5191581f3a3ab1faa8efc021a8ef9e038738d97e488581a996fb9d8a0a4370354be0d782901e9f9aece787ad474cfbc4d8a9520322c45b323f8218c63d2c631f1ce0cbcb80dcc7ace609dcbeafa0e9a56927a771c4c06c3fbcc54134a41f48407ce8d43848ade642102035766145bf02f205f35d107e79fb31ee51dfe18a765db8ea4f39d139bd3f6b7bff9cfa5c77bff3f2dd77873bdca7421e5428431e1b4ab7912fee14c662b5fb975088dbb88d3310c3d834db80d4b8c8bb06e06706566ab1e3c98876995cfe0030e99be63fcdc08eaa95bc4994716578a2f5cdaabf2fff89e8f4c43d9d80aefcbab063bd7c320ac08f8db518843d72fded111f3fbc8563e41f2bb27e74f10c581f07c87d0c587a19b07b18f0fb14e8a140d34bd30c285f3840f98a01e54b06942f18f9922f2fc7fd81ae7f87b6c7c260aa13dae6058a9dd78509b3fc1ee7861d5f472571fa312075f8980aa17447697433c036fe63c9e5c280d4e1c31a61f943b05558aed55a954a14592c972bc86a0b32bfe7f7f74d900ac8572c56fa3ac3d516eac0d8f7a759cd473d91979fc2d50c572bd4b7bf536dc8e364863bdca3429eeeb91f45d795790e8c7918d0fe0944fd2908eb01d992f287c4e1ae3ff7780bf5fe5e5d92617f64d96a85fa32bf535f26e471b23d8ffdfa5bb8c37d4cc8837aee731ac6047c69a803f35e0ae49769a5635fde1d144c188bbd7cecfb58e9ebc74c1ff33ed6fd6b4ef0071036812c731b97492fece3a34a4711996d4ae2ad58ca977fa54c82008d4e0d960e026a11775a5822ab0052eaa8c18eb20889d66812ac481609f1e136feb6da9a0e163bb2ae8b5d98d79fe686a9ac4559ade2014f7dfa869f3269f714e45df9cff79f482d3291953bafcc232c3ca69116769c46957b266df8895c66182079cf3c1c1b080805f636cb126af71df6cf4c5293b0815a6417ea078101764bbf712ebc60bd69e2d1d42401a9838491af538fb9fd4367578e008347a4d40f4883df7b9a163becaebbf3baeebabbaf95ab5ce56a0df9082b89f2848b242e6aa3aabb9fee02080aa1a4db85236b54cd80bac07247eee9e2cae9093b72cf898a75e1057bbd882124095c8395425b44b9a30335b946461e85db82cb1d1d480a6db1c5833c8a941e73b74da1f39e66c87aef4d530a7e3defa5d451df0b5544d8fe12f5265f09a4e91b2e9cd9917b6487ea71e534c5726fbdb07f2b7f274d29f0ed7cc80db52341fb5c1174bfbdd775e13804e976df2fd781a40efe93146b42ea59c15fa6b005efc03a728f3f07bec0a17ae440d6a2bc32bb2a1f16ba0274995fecfc5ef7d2e4d5fa1e33b9df7fe1d8cf976f7d14bafb1ccf690e247247eaa16c51ba112afe24bf0406ccf29903b5c8a3039d68f6eb983646186104228608823109599edddd2d6bb195c05aac5272b5c2bc043b0439ae613aec58d8b006f9568eab5eadd5e33cfa32f41892c401254e5fb79bfdb69eb7a0fb00683f680224857ea0e54aa11f3cb9fe6e44dfacb877c065c0f5ef9a2301598fd1bca503e404ec05f344de8a797f0f06641a0cb86201e6633e26e421f253c405f6820999466d0a55645329eb0590fd00e62fff14ca1619f51ccdac3496bee99f09ccdbdcb5bf70df5921ece8488e747a6e4b52dfd8f7afa0c75ab4a15ff9d167462d228d3ee3b877cfe2b5d93365de8a4d5813494c26dd8ad1284caeff6cd22df1c7b7f48d147a23a9b9592ca86f467726aebf47e91bafc1041c48e2b8155287bf876ec58ba40ecf5283f59a23b568013b2ff7f44a9a912f2ebd928a2cc6e1e8c21e0e6b18c311ceb691d2ddf42770a4f990c669c338829a2bdf144adaf77c2471e8cbf742b66427511dbb3b4dd21c49ea7032a48dbf1220a07c8e7847ece8b3a3eb336fc999d7ea3f1b5dd78158d71d49bcfed7c53b3ad25b47f22c27d422b64798333ad2f5b749d0fcc85d1ec1c86cafb478b2a6d63ba5eb27f71bf882c4a852499c0580205b3856b0a4b09932b9cd153491d865424e0b2f746b8676820e9054568c8e6416a2d1c6d0d4d8184a9b4fccf764ac7bd1f02f27fcb2632e33cc656e6e70e6b2ea7237a72eafe88a7eccdd4a974bdd274d2f3b52c7fc0b481df31b345da6463433cbf29b1c6a448fe603e8158ac4eaf10079a382146958757a741115e40d77953b0c2be78665b9e6cbad6f25ce0a52c7fcf928d9aa00dbcc9fe217777271e78f20481df33f2e6c075219b3c4814dbef377646047ba05c2cf0664324b8c36dbbe99df9d3477f606ebded8a84b97527af3c3c24d3cb0e0b86eebb69d16e9735f2af3fea7c9a5b496c6af7ed7c6a838a4956532598b4cf0a531d786ebf107830b230370c52fa19822e84a28a690e16ee08a4312ee0d686f30a3831bc42ff754a8713dfa6db4bb0de17074b7f085be41b86b8279b9f73629e087c5f5eab781a9dba084e2063bb85ef74171032d2bff986f034b7705d7f33690666629906d89bc61d8467ffbd9826e780629d21f3726976e404028f734cf206fb80629d2a745b886ede9f6260ec31a4a4484644d2f6d7a0972ba497c24145520b9cc32a9e37e6f625d9d158a7e44dd5116c9a21c2c89c349a40efaf40f205b7c03dbd0a7a14cc5e1c83fa0d8660b47dee152d665d9c785156554b66d7493511a7db95596b1122a73e933adb5fae11dd0ca6d634d8e4b9f6ea12f478985379a958157b6ee94db24fdb60d8aeaca9f261ef2a5d339a97be5da29c8f33ab37bf7e550448bb34b2fa28589161fb414d152440b17d1c21c4ee9ce0497aba79d3c3d76b4d8df26568bfdac49b926368728d26dfbb135bf719446c5d51963bfafba90da9de33934e94d152e4f9e29677348524a19b6bbbb7bbbfb74d9dd3d96dfa59ca3ca8b62f95bd61f74ffdc29b1d49a93b0a0e28e0dbbddb1eee923b795dc367a1214012ab234310415405c644bdc9189c4b82317b1952206ea6e33babbbb5b47321c11030c189151d01dd9c78a26b849d7884445484104962656a421f46a25eee82ab2a159ee400746909421850624aabc3a892ab4b8dd3fd65861c6bc42873baf08e3ceff23ae942514e0969e33f1285d95b7fa48c80aa1dbf1e86826d44c1cd851f5002455da465ab922626165716d691bf900245cda465e5558e4c6ad5fbf6fc6f9aaa7f9517555453ef3615bd39a06c62d00cc0eecd845475384c160324cb07aab8faa00823d1bb0c466795ffd73bbf6c2436559e49a5c7b0a19952e3410a1e50c27af867284142f1284b08a18aebfaaa690a83e3b93eac10d4c3cdca6941842064786b1a042e8fac7a8a40a056c48f1c61049a630a2c393275174779b8a54f18731f170ebeeced6741d0232c8628d1e18d9e10d365e8ec47524f7cfba0b80c68a3bd62ce08e397698d02f475985c889db3ffb6b142cb8fd56158511b7ffa580dd7e510a2b6e3fcb65e4b6d01439b82d546576fbad2c4aa28c12df9c2691ecfabf5422a0d8e10030c41af80cd5705b68e88adbff220d42505871fb4d261eedbad636142aaa1aec285e9eaf16c284ebef0d215403cded2fd927426cfcd96eca135194e103cec4a36d1a54ac0ce0f66f314ba9c4aeffac3198f24568bf20335eec677bca935bb36365fe1c527c8073bb8640a4aa342b476045b4232431d4683dc021061f2932f010a39221a96d24ac6de49da1a76de41dadca871d603d17261392b204929c2eadb252342bfd60a3db467b0d8bba524889a03bbe50140e64bf2b8594b0c2444889232b4af0804a900c0e847db95228c808cd6e570a05c510d483152015165adcf15946684f5c29447bc29fe34a215a8f57742b90e45e25da97ae6a6465ab8158b2558d74648bd22460e44e7bb4c857a7452ebab51e85d5a8083b76a0cbe55e86cba1faa507ebd1854f0eb603d2395fe2373256e221317df064cda358c63ac89618aa66d0fd528a3edcce913aa45896fee3c3b24de6326f19fb33c7f99c1eb2333b3bb3f4979be424273929597a385b9cbff90ee2ac5d36cd2ab2ac4525dc93f26c581786cbc59ab4cf8c2f2ed76a2666d6e284659865ecb3858c98cb958db8dc31075deebaaee676396eb7e3765aa6dcaeebdea2b182dbbd0a8d2e6ef79fc611b77b718b91db3d6bcb95db7d35f1e86a65d5deb8dc6f9b0d3f94d25c71c79a1d97527ac610979ec1c6a53d20baf445faacda0e669821e54d857d5e33e6b8358b10d75fe559c6b8fea2194cf0408cebdf2c1aed765cbb483206908a5519a672ddddff3ccb5883073f77fea712e1499037e79cde0c921464f44046ad0c2224246a104248b2cec4a32dd2183a40c0edafdf932e4c3c7c0c99a37ad3d00f3fbcc4fc69973b7fced96fdbd463afdc39c29d4dec5869c428a23f2849be39e79c7e65042eee98a30077dcd1002c4061c4c210420c30cab8fdd2563b4455b1aac771dc15f6bb52e80bdab5555a505ffc1a5108a8f405173a705218756fbfd072439da105340a240e8c243bcc17bf46248a111d2152b2a9ec1751c4adcac6a88892e8bf05e3099217bf461c9a4dfb6050c181a598b9101859288922488dda290c16d752d8d4954251f80cdb5d2914a50bd6220a961f2b73a550943344b852a889254f60c1e2f93daf97ce3927ade6c513dd37e3c73f2ce626fe31f3fff8f8fc70e5c6b063c324037a9e05d2841ed60bd50054d8535f56084b9dc8e73f5d61ffc5fbaf63dd73a467903839dc1860dd44f5b862f4776cd985dc754aaec73e7e1a6b38aac251e5c3a5bb5e6d58adb08ef1cce5ef969cf273e40ba04e62d24fba6552df3497bef19ed8f523b52d7d534d9c17c27cfa0883cd5cb8848e41923083d4c177642e9763b5d6dad5ae76b5d61a76acf9b7d00076b7d09bc29fa510a89ffc28d0c10a4a95d421654e9280a20a14dc4c14322d88263916376fff8e1907c05a62e19cd63723ffdc27faa67ffcc7bdde205c97bb75f7db94d2d5e214cbbab37f6319ecdfeead5555ece56e8f9bb4d80be828585247f75b29ac874fbab8a36515753224c14cd422bf0db263edc2af6df839946dd361fdd911b2f8a7c879984e29a5343539e44fcaccfc514a671593b3a51a9a98b975a96bd3ee40497ba33133f04c38b0fc638cfdea3c92a9d1103c2444eeab39553432d75ba9a31a2ed7dd7dcaf98d31d7251629c1a751c5d8af52777729e7fca68d51c3fe690db08bf99e289f8fe6cfe72f240e0d5b0622eb3f7960295dc37a38ca233be7d1fc5aad85a966296c8a74e79cb4a483ed772b1b6fa017b538bf9b6f8bb0db53fa35a421a5f4ce4be5579c17f58d17b4e77393869369379d3d7b4af9f45b5ae91ab25ed76d552d8eb69ba34d7ba34dbba9bc65b1b62eb64be2c93f4db1abca3cf97d86ef56d26897dff20a866a6022014f1a61815d39a4c488dbe10b7d4fa0ba2fa88830bb6044edf273615867d236fcb98facb94f4f59e3a73858e93edfa1ac510a036b535d60bf9a95ff69b1f23d2ff22a5ec4ef42bce5d55a15ffd4faab1daf7bcf7dee38593b9dcb6d587ea8150a72a806262b16bc6ec50237a4ca17fafabb498599dbdffeaa1504666effcced17c1f6fdf4b77005810e51d04335cc5c07e59011da6d10c84ce9391686745f7dac76ba1e352cfd58ed54e64286b9cd1676943549f35add81276b4698a3dbefcdd9ec99796b1691366d83db33c9ed375d86756ccefac6c39ea1dbd3605fa6b749b76bb727114ccc28b6b2a617b75f8e539630812409fd63c70de87e9c5fdc7ec90c9862947e82b2825f0bd1535fa537813df6557a6f3699b3c96d3f67f349ff0cea9bd39d59bac54ecc28b1db0feb89e5f67c6ea30deb7136e99b55cc65b0fef5fb4b478279191287c39641eae8ef9e267d333faefb0de4a7a057f04b415e17a4d4b19aefc99d52e989bc3a30d6fdb7c128d0ed39bb5e80fe052ba0bf0369f857b7e3852bfeef4da57ff9d2bf84d26d60b7571caed0afea35b7e92237e2048c2e468d4bf0ef9f44781ab2d535481b2fb1580630c00823ac5630307774249c177e22248e87466e7f73d83d4c427f05606e43867558d11d59740d3be97c3283c2396bb1ad1376a5ba342d7acb9174bc555556bc638bd791faab0dfd55c3fe6926768431f299893ac058269edc619d98fd34f176f7769f5d2abd572a954ade61ff7c45a8ec888c1ee99b9e7907796b1a55b7aa69f4fd17f27ce16ae77bd313799d9ec82bf5445e2fbfda81f1c2d56ae7e589bc504fe40513127975388a3deb20b7a9df4a85fef9335c4dc91ef6ec5542b67f54cd2bd388bbc2362d06f52fe16ae7e54f7f0a794eff62026152f66dc863df14ae764c2ff332210f036105d0cbf4445e68d85174b1a8d8fe9195d3e30cabe34389fd01b68086ed3f828cdb4f5ae4f7598bdca2db52e8eedf1b3f2d5279efd934f270ae66974aa54e8a12d3142947889822a5895237857604e40532ec285b088f18769449a8d40d49dc0084373b12820b33163b32ec64dfab45497c2043e4e5812bff9727f22acd52a92b152df911aa41a99bbcf3bde9c56743fcc0c18618ea39e2854d8128906545ac09e431fdf72f20cfcb7bb3c87f70c27f30fa698264f94f2003ade005641ac84158ecc841b4565b0287395b82064455d0b0231371b335685064a50776e4221d34277e92a0c1e84a187664a31a8e74331eb2d0278eb4e08922b5232c67d8918f8250b499ec065ed1941c8c31250731a42c5aecc84840231c51f9e1e76787ef880a50142a30d852db32861db9b6061355d11a4abad625cb8c8d2235c8e024e67264474eeadad112536cb425bce0c27482fd38ec89202bb427a0f8acfce5134aa4a104d622bfcced1818f603db03fbdbc28eddb3be794274f93ba86f7064e9968a1644bb6c54a5a8c7366a2cdd6ed437fcf38acbfa86b7cb3e2d3255628fec539924b2f2e2f6ef7c2f47df4c8e565a7b7047c8b02ce39e16e723b1f673bcc5729b69439657697d814e06b9a760108902e78980fbad7ad273b95a34f66938be306feae97b29d0c54a62533fb26e0aa9d0d5e214826605f2f06bb5a2114d9e2d09cbb016a76d815d3d4f9a9f00f819809fef2d117e3ef7489cf9f2bdfcf7acbe898199f3653ef5144cd114a55446e653a9d45370b43725937a1c60102913ba5221abc519d3435e1abe302fcc57930a0ee8d2a5cb044e31e0bc30e04a854e04a7ef589879115e9a5850fd8740dc66823c217c0f1e105ec76d668eb5c1a60210ae587010de5fbe0010ae58e817e145088784c082f1b123a3a484d1c1a668c2da368fe2e47da92327b12bf05bf4583b5c93025c972e5db4dcbab1fa468a2dcecf0182005614cc5b431170e176ed11578116e4b6b044767c3bbb7204184a44601ad583e782855df95c172bbf666e7212a156b384c98ed83c42a26868c916cc9f7771fdfb7e5b05ea90fadc0fd99ebe735fc3badaa135ac00bf36509ada4a1df25d081cccb834e3211fd9656905367447793469433e62dc5166b9e112f8f2d3eca8c9e1a292a44a57b90cf31e0670e5d0122472e8c18778f099245c39c4c3929bba7228872377b4b7979cbebe41c1bc2278206ec39ff4034947d2e60fc9f2c60f49fc404312b1d70c596ec34637a71b1c595cdc51b5c51d45a33bbab4b8a324cae28ed2080756ee28b1f841c914337a3022c41a2fc6e2721b6d0039d183315c60c49317bbe00a173c448143111fbc5a90f2c30f48a038e30ba1979c92c50e8ab8e244075704f1e2d7f11691266cf83083284ddc40450c5efc3fbc45c44796450e50a8449182cb8b1f88b788e0008410d2164b72b0850d5e0cbb39ad86959f225d9c809245183d5c214692082e48425ffc9affd1064810f9708413468cf1daac08e204e5053478d1145f6367777cd65644c5dbb66d49361a92148e8644546449b5ddd00b8ebc2b875e40bba82b875e40c65125626405555c5144066d34c1c40e3a9c9a4605df1123ebcfa1dc416697b0760887d9954338fc70b972e88626b787b76892dbf07c164b14ff6baa19d29adbb04b9a7bce09fc3d80f0742b351bba81b925f52997b17cb769cd5bb4459f456b5f592c4e14c37053d94993bc259dd6c64d6655cc4f93faa693688d26f5d32de3bc340956eb9bfeefc52fc1a9841d290c269f7360475aa3491b6c239238dfe5dfaa9480248eeaf29792240ecd2237a39bc37f425fa140fc5c7e9ac567df54180ce69582a08136a573968e92d4e86c5312596527fc155d2fc0ad675c0f80cff5179598a08e8b6407d7c37b641b92c9e0fa7ba58f36a593bb16d0bae9ec511eb9ee524a261edccbfc920905ee4eca8239dad93075c8062ed72dad094167bf4bb9cede2d31a3200c1c0cac1c9214bd9cacf8895c0ed72003090612b80025bd642b60fca47f1494666471c2e7c57d74fbca85306cbf852a9f208f93ed7960a03f9fdb421886c010c2e6cf906ea100fe120362b32734643e01ad440b625629fb2547b9bf7ef79ef85d48636338fc8ab0fdd47be98131866ddfb3932f252d9e8056a20551a2519f163d0545e346849d9fe3b5fe04a912caa4452a6bd19ffe18b12395cd77daa4451f6f51a09f168db0e3936e79fff44ea62d8ff64496684184935dca29bf512f2911b62765a44b417a3dfed2b85eb3cb9e2f361394435bb85c0a76974d3c4c3e7664b176b898094bc35aa52cc293356337bbfedeecfc259b7667fb489c25b2d5b486c1ec2380e60c3b0abb74d2dc559cfbb8c568cf75ff4bc35983b9c08eb376dd9f7bd6e696a4bee16e7685e78d9e4481c84581aae4cbd0b7f7cd3b5a294729dd28a5b46edbe6a19c379c88fc884ef739db6e74cae935de74fa07a055edeededededeed277477cb539239a7cf39a7cf397dceed4729a5f449ff45564d70da83e51f41cdf50e3f362cbf3b0d5628f00dc25ddcf97da3dca4936b92c6e46260adadd9009d6d78ecb2c5103e65adb5d6b7e756b52aa9f2af7247dbf0ecdfe1f21bb4b400460d5c67296ea18ca2bb67f069afbb9b065b4a40e352840f96a001547bd9206ec75ceee548a3008e33e1722f81b81cc70dcd7074b9981297fb6fc1e5b81550b9dc100d4bb8ed270ea89052d61892618aa118a05c2a69deb25f4c8d50171aaebf55d9707d08e6c56529969f2f3f570508aa317f4063a03180b4bbbd372b839fabc5ed27cfd90da809b981349bede7f2dee536db6f2edadef6837d1e48a92b751d2704bb62d471251f3f3626b60964ab3374c0edf7b834259523212e466cf54b933f6a03d86fd3c79b33fda95f7afb6e20a090167dde86633dbd842fb4e8817c55de6218fc10773be26ecf425adcbe43202dce366c15bb97a6526982d20401de4283186e0d4720462c90be61d187071f893382c4f1bbf1d718b0138672b7f75a47b2497b60cc1f3393ed9917f0c3432ce0226becc355b697371099e56ebf6dd2e885ed9989cd0677e418cda60402b42930e5087ca8685cbed16d73b931c2ddfeeb1ba6cd20a90104834986e5608165892df664c38ef247f1d61c6dd3bfd336fd34aa16ab2c6a1daf462cf730cc12e10351c5ac246454d20d1c6a68f0400b1facf8bcda89294931a46212c77d50c49d3fe9106d68b162f08bb04ac01d6b92d4b8fdb3dba0e1761b40dc6ec3095114592c9628b29ab348f2a1bb356acdc18f0f4d830b9a30b791958d299068f961830b1cd060c30c26b5a4a42239a071b4e50daf884f62c65e740b6cd7850c16c795424dccf049cc78a085165a489c1472c08c2185d8885dd79148eeca72fd4df86e13b28813c38eef2fb248b8fe3a64093344c1f87116965e1f2d7a16b65ef9dc3454d1c44861c79f3b3a1cee44617908082ed7df65440b2d6416b6fb250beb2e136e66ee0bdd2aa1e884357eac64b9d46713e0d2fef128049038f3ef0c5fc0bdcb07fd8d7e9538399d6c5d69439f521d2e7479447614615048769351f395532c3fcbdcc443be9361f9e7f4a05839e70c6873ce195eca0196304c18dc279592caa794524aa9a42e039ed4a8e48c16863d0d15a2190100802000d314003028100c0704428148281c9466c97614000c7c984c80549609e324887118062162100100180300010032223434a3006a49d24a09e5875e96b9a9420a4d1bf61d2b220c8854e6651b430124cb0e3a7c5dcf6cae9cbb239d0e1af20c1f0efe7080cb55eba54558738288d4f77de865b66aa3b4d77ab1ca41a0d1ec71bdb329c8c4355016a1e71d6309418398721f5d80b6b7adec8ed27a8aeac522a901636c59ca4374ecb5d9065b595221cd40925be9b8492d53c70e390ce3546b85d8bf77baf66900eab53b46105a26db4c0ee06d4c1c0293cb83a3a5a355d50e5933b6c66ac8ac7cc663e869d11a863b7caff5f2e4820237642dbb5e3edc8cba2a9faf37325cfe00d95753b48aabf3049c19b6a0714b21c4f6922bec122213c1186a785789856df21294cebc86faddd84d1fcbc4a2ccb22929bc0b413145a4f03c111b0fc4694b41e91cb96262628ffb59469fe56d0109003eb5809ba141816fc66992a6082b425ed2dadd5f2e5a39e5425945d49e49dcef3addcca2ee8fcd7786f66841ab889b90c855909637aab729796b84f20ff35ac88689b4f4951320c5fb25d506c94a0c91b4be59b62f5148db256944edbbb02c025d405956082389f51a0f412d3b817dc51df1b868795e91b80703afb80ea2ce1c6927d77cc5d91087fbc2e485a6ba8b19a1e351458749b71c8201ba8e1b0edce7d99f7a2a791be5c11464374df03a7b1aa53d5588315b3047b033a72175737a0c308be2fab2111ddd48d8a91879166c8dfb13291c0032161657004d5e9b8883f4db015a2319a117cb68d6595abe54ac2799515c19b2f5aad084e5824b5c1190e1c0e2774186ee93b418436875abc8f6aaeba2315087a0a7fff1f058abdac2234eb1862d70c8255d431c27665936c734f10b50791a86c330032e2530a1f0c2b4cbf09aef303b514928ab314ee0fa6c331f78f7b5d3ced8169808646d4f592c9b2ddd441f6eba692c9dc7eea9e0f148a95c2b498afb8aee713d5e4c7dcbf4d79793913e850695f2e30f6ace7a4e296d5bb26c1e5eb974c9a95ff66adb885bf5ada242d37c6168df53628647dc1e5948dc7010df002bcecffc16110b9fb52fdbcc35f0538f315080a61b75e87160bfee3183d00e22c18e49adc0b6e83b57f4c680059572dce6c6cfd1ab42635233421bdffe9237c3eec9b5e112f433fff60d44b2407c3febf2e53aedf6dda709409abba0db222a337d10784de393b629bc1ef0043f852f20845b771e0219c67f9041053008e55ba7b98f3bf27be6513f61c50753c32f020fc89f877a3c0929e4931e89f23890430e6fafc71a7d76d39e4b4b6fc9bbea84bc55be361be112a5158c84b5c3b18f0865d9911152049e557d13966e76a4153ba33dc2bc58ea8a68f48824a16107120ceba6072b6939a104996529f7f42d424499fad1f90b1fa7cbb0b5f1458987c3a655fdbd97b00d8931c54e4c9d2aef409d82aee804be4d789b65b37005e52140a1d8aafca1075c31101ad7eb5bab909eb8750a7a2d497935dccea7c74f4ac70defa75ebebc1cc70c1f928e98c009687831ab41ee611a394b8cbc45c04290ad17b5863e1502ffa6e35c8ff6e9078d643986d1d1075e5fc650a5f14b1f7c32bea6b240e50a7b661a9a1ac8322c24d08310016c26d8fdeed0984bf7b2d2bc8849344b10d9bd54f9d5a6109d93ce7cafcd0e8b160900cc65da47d2f1458ca7e83b344057d5c89276aec1d150dce459c3d389e1fb8721ea327e6ac02b32506bfadc4b7cf72e600c8325d6ff338456b8f3408b301c1408e8fb8b26a463c709f00c73ecc1f2f3b17d1b2f631868d8d78c2fb4a4e6b056df8f601a0919e9bd0f462069405693c7a34127d8ee3425440cf2a9190aba13a1bb82048201ab41775e16e88234541caa70d5409dd6baf619b416706d10108fd94cefdfda0d598f25d50f1c2800acc96e1295ec54a374407d36e9771524c25de09fdaa7b9ba7848789f317d15b706fd2abc5d847983a90aab741cf23e7dbca5e41019411848a737105a9ec31748ca7dd01dcd26e0ec2d200fd6892f12fbbbfb6231a1bd9d380feed28014ff05856003b8adc18d6c341e8ced8ca2ba98bb08395a4991f4625e7244282649f19ebf9c7cca4d8f645e9f065f683ce83d4feaf19f01e8e439167e1afadc497179fcba9782051059aad07c1ea0eb8e1436e931dc92b5988c49f9c39362f276d2fda8decc1a7ee97e1b5fb8526120ebbaca18bd8f22a00c7a950a4025788af509ec792478204be7d4a10417e99928923f8ddc17c78dcdc9a5de85d367af293273693a08364037d907bbcfb93dd7502b061082a5c1a67a4294c0c18995052da8613e056c9fc10afe5c359cdd8358b1f8aaaf59cce79d50e4306a88ee6ce235f59c0bc44ce8be234dc318c6e98f7f37bb21f5718c2f0c0ae805b4afcb77f0b97efe6799bb3258435ee48a0cc2bd955bcefd70803d79e6dc51c3d4074f45d8d8bbb83a9973b7f6e2342ce50e83427aafac33fe90ba60eb949abd1a0f39301d6ab9d3070792ff9c1da3c01f6e11879aa95315d241f4998264b11c41a03b5f16150eb93c90f3755aaae826786d4132c605d3820c88474aa79b8cb245a4bce1cea202e177c5024556af3b780b79452ab904345ad36f1f3534b04772d53d8368df7b782045ff72ede5178848e78b3764028a087936c22e6b813602b59128b75cb7b16277e76e7ef6da3ee0ca628d52ea7c3ca6e561103151b599c504dbbd05110319645c08f441c1a8b3b2354bdc99231983c908cd3c9d74896f05d77bd58b85126eb6fb470c6d42776f3b8f35ef9867b15664d880689bca3e329b479a6bb3e55637100b72dfc6b0dfeb6d941ec9c411e0476a1a8df0ce29f419023603d2751cf6c1bb3e37d3fcd4c0b80ca319a7d34b00a8255f67672c04dcd1ad06140faa76ef130c8b16f6a1349a746b94864510ee2dec79c6b47a2eee2d3ac7c780a24dc107c006f07fb35c63f9b099f9fb18ea5751a041b2c079df904538060ee0138e2bc487f8a44916df6fb140da3985f458429c9dde5f9978c3b39f6095d5a98ee918479882bd130285ea6f893b59f79e08b420226a12fef81970bda7eb464b104bc45b40a9768f6288b592073f25b4473362a9c22e219f43bfa6a191fc91eb0a4951ac75d5cb1328928ae74314c7d2ea4b895e6f195ccc41ec6838f11c4b2e517da1857f4587901e190ddd8d333703f2578a32a62923b9064503b6e062d38da5b948464a01d1e471ea34206e3881d633883414241f8758c5a0c10b6b5b8a67bcd0d8a164d1883e72369d01a6906446f69b378a02b46ed701fbcf20ba6511b29a49e845d01c49a51269ecf0ca202ace3a32b70802194834b06e3b7205d508165e33bec099a19dc927c11c1f00b1f4877f5547a0074380aa659f584e3e97246b3d5a489de0764d4b5d5b384954c978835366d7991acea2b7bcc32396dcb2ae8e270b9a80408909fee81e72732fab0e42897e68e5402013adb132add98e58a49a8cf5d6a294c28a9610575d7dc7b3a180d878c4f5567cdb8d6e24dc4fe19445d5fd94072c48917a1b888850135fac234585babc3366a159854b8061759a7a26e3b8eff3597e5e256af521c12c56f9ad879ffaa4772aa46f8e22ec30b1a17978791aeacb409b3873776e8f13fa281482f3a4c483f597b6edaf2ff2375fc871ca7f42445b15f739e3b31bd07846a59f1f8d35526ffac8c6721d5519248d284f1fbceff992cd8e7a9c4b8d0bb121b38835af8c6b5f182acc3be40754e5334f1fb0a2d5912eeb9bf1b4e28d90ab008aee414b4d84e7cab695b8f3d03d1ec878ed0945145611d5496682dfe9365410ca865c0262addaffd808d0db3e011532b7a747a7afda5ed03751d621c2ec5666f10a6cf06d2fb8cbf0b24d58b01777db7db1c898a9f88537d9f1c7ec572fa7bf9b0fe34489912a64cf17dda0c728609c1b2cecd85308741e90806fd0cab439bd0ca53963d269fc080579072d7a123faaa53e7c34f79bc66219b06bef21aac319452a1ef113306a379f89d020d0a0ec1900f6d02bbf15057cc05f047b5ec10428ad84e97f8dc1f777ce6495a71fad09d1bb029eae16e16e861cdbbf0c37c5729e48244c529bdd8ed66111fc71076ab73e843587b204e747befff8f6be0f9ce720c07abc9f221a1760a5676a49459ac15c11ad63a30448318920bc8ff58cb1769635613329389e0815327eebc7ff1e6f40aec012d12b49ec67734328f6c1dfa36d7dc86e6247d01d88a4c2ce021243a7b868e4ef6dfabab5b722018beeadd463cb26303ff0a9cacf72954a7983894f0b13ba58cecb8ffc4671ef83b3ebec87d6cd80959a9564cd9b91d5d775a3384717e6b2d3f8271702435b7a1b189bb3244d412d345516fb121f730b38a71f0ef0be470b6db57e1b1a13d748dc55de9cff683c001b98012c7cd2314be96cf48774ee2ca133d7bb56026301e978f3b68fd704148cd6cfda16b5d490311d6a913bf9e394f64428a8e282a18c0f59bcea263408613f68c28561664e0913499cc0254a1a33bba5c485bdd5a40e55b599f2c7b0c81a1b5fcb6bb81db82cc71882bb74df427cb5934332b9667f6c12adc1287c47fbfbdcb373ae020789a5224d8d820bee93b1497c2fc1cd2b1ef875515a392795ebaacdd42413e966e7616d32a2d9f9db9609c8273d188388dce1f7765051b05f32be0b77451669422580d672421c8cf17ee42f27823edeff874918f02cd0dc6773bc15198a88480cf2c2615c4f884b4375f0053917f3d266fea95be76881d35e4c67b3027e8c98d6548bf6871ad9c25c68b915ed508f6955ee97d39aef24c403a4db1a75ccb57effa21564da594c850922f5a7488a37342b58c162de4e2bf305c42e93d1ce449f6e96c354a2c936fcae0de9f253333331a0682f98a9a3f4fcdd7d9ad441f16c8a83785bde342c431d6e982c131f87ca7802ce1b0039036e5157fa26aec699f7655819c57d59a931910c5818900d9b5d34f55a61184dd55034d33366e8e9da35815919985bf86b9d97c9fc25d5cb125fd1d017eb5d4e65f956c618d4913134da136220d279564e0686f5d21705b128b86f898dc6b84f9f1b1fa167b8f51eb87d74c0e7498391f007f1521eca3c6f4018a70596842ece684c0d3ea98c0dd6ad920217020bed64cb4ea5b85cd8a8322588785dfcb1c45d1276fab4afb5ce7441a521b5731631121e43d9e3925e3d12ad355e14a073ec2b572012cada0a4e9c76e1190ab593c09e5b8a437cdc030e234b1148dc260db7ef44d16f278d3233cff7377738b6b93ffd601a98d61d798ee39489a7667e0d1de58084e040bd61e06e46d2c66469caf330a07f3f487196fc6e13577e60d8dbfbcce95b25ec25f6a828bdd9e88a2b253fb909440fa37b78c50aff8d69ad45eb20d2f42c4d5d961d43d482a82fb58248caad9f90e5054d95b9041c59b6b52ab819cbfe628bf34fe7308f1c60ed282fd7012f2c256906d23ac0c6ecc1ca7d057b267715c0a9c7145bdf954ffbd54159af9ca081c81c4b100f17d98512b6e5b857918793bc32ec58b4a52e1eb97c6808343808dfc5140fa7701c8ba64d1e6e62568932212aa1a9b4ecbb9bee148e4882d4a5a8d1c610a0d595d42a2dd3dde5dd4af1401dd506ece7a3157ac2c10a59461e1b506afeecb4877415d7a3a15df7bf39c51dd92ef0b4b248837c2d8a9bf7d611b5752e7bb740473d5a628d64afac6fdb2518b51c374a6700c4349bc22b3b53f2a84d187ca646c47908f6ef81d04da82acabb82557b1e35d830b8a1c37e8a61c90357d3979cb02882ee1c3bd4850851a22c42895ae912fd09bee1bd632174c256d9355f37b9fd94ac44757eff351ea521e48343222af386578c4c521cfd4ce716b6ff11b932a66d84602a594b619f7e3755097faa2a808b3797490a135c7740856ce3f2fbe8b9fda3bf8e4453e263e3a21cecbd674afaed246d22e723290493633a78a6f0d5890c5d3a7de7103da6c51f358c17d00f53da9b619030153b68dd4e1a75454497597c553c56b8c774f783d6686c6e78ef32a4b52b9cecf76275831dfb3e31e6ccf498e114e04a7f73c6e3ba369a3ce948d9f28e92deaee53081a7c9cc77623286dc7402a218f5bd4cd39a5f7eb31165505de3a5e7f8bdc9b65980e6c80f514007487353812fca0bcf7643c725b1aeaff121f7f6586504e0f89133625d99027817e811db7af59600b85003520d8134994fa80f415355923e47a420ec75a14eb98fc09c7904b41d3294d0583765659f36000bd1e4aa4c9b43461ad8d74a4d8392f92a42712a2519382f91a06c2a71f18f8cb3fb497c1f30f90a95d2155250c55f22428a6da50ead3e8328d7a7c106c7b997d68335cf559e0e316615890416742f20574f68972915772681eff28a185c574b5a1499e11ebfc911c9e5e44608cb0ee89d80f84881164cf3ac55b721de9e59e6a6f793cfdd6ff91515a1453f607d9b58d56053fb115a894047b8052b29daab9a2de5ddebe9ef31ed2a7fb62cf68c7ea9f93bdd154be0e832d81c7c845e74068a51412f0cf81357365cb18952c4558a713fe16a718c9ae7f2a9fb08e41fa26132bafdafd77e43410340fae188fe8bafa95b02104f8f3a859b31d4aaed17f926bef966da9f7be067efa70174d3576848bf463f9b847c3279bc2bc79828464333843b417642a3bdd8e50a8894418fc2bb84d505d2c771a4038104b0b35f3f219e8934a00f13b27e07941c45c4f4b72b5b3a8b37c7fdcee0da29c93dbe976e7509075cf90d28d3d9be8191520ae7c49b56419b34014a37f8ccbaffe010a823a1c44085f181b27fc5c36ce6d8fbcf84291cbd3f5753abfdfac1605ad11418836a5db74cb1f64dc774645aa2e80110bd591336cd5d3fa9088af76a8beea86c7beecf1bbef853128d92f29f67b28d690ee0f18c1c4bc931b6744b8c53e244914f5acc95d35165148fc4489488c710ce7db58511b2262ccd38846dac657fde39b3a5ca310c7fd57044f4551b42d52d4d090930360bc61a337053e7afae74974013f7a3fd3500a027f52246a45052b25e479f44cdc42e89eb06e23875012dcca4d517f0d7dd2023c8b9666e47c643cf569aa475ebd115a19e990171e93ef85782f906486c402251a2f7aaead80faf3f59e510026ca64403ee6017701260dcd173cc6fe05114cbb39ee85218a23486ae24a3b71ccc22fffb14a7d8b73ceaf8a7742d122472143405685379c52ba949aff9e4a3276183a600b4fbe36ee3b32b8d9bfdd636b894fc3a40d98f09ae14be288a302532910bde5a6556c70ffacd8e9d08cce3174f20655676cccd4c595207a6228c751635507087ec0020fd312e1298a257974636dca914e1697aaee7201aca8cdb605e793b1431ea302fb038c24dfdf980c33b794416fc57789517cb20b642dd1b1fdd4de3cc581fe093102d4dfddaf3cd08eb710e08814aaa078bf0e490a8c315d6768419a3ffb73ca0dd0c8d795c70940e77adc725180cdb351293bde6f91d7f7e328e9fec608e54c2c4694f151624040abe13317b89429f27553a2293d1a10eff20093302e965ac749ff0d6a08c1ef4c94eaab378d77087cbe0bbd67197add8142f937b1937b7d0e61a784129276854590734ba1d8ee139f767d7fd038a5a9b7bb98b733fdb4adff519f6a843fa1c8439cc1d66e2a558b9a0dbf1104bb5dcf195db1806d66a109c085fa6b0e79627401d25458db0f7ae9179ebf6e05abe00a51242069411c33c19f129b6172a0d0184726e7297cfb8ece9e7912f0188a763830ebe3e9860e4a567a39ea118b10c89ebe282efbad49c58538b01e8a339c18e3e3db4829ee5a0c3f955846052e82927490140f0312894168c7213bac4cee6dc8d0b6478ccdca4086aba53bc0d579ed6b998d62f6df0c730c30fd8fc13aba0d606b48ad1d55e5046e6ba09252379b14a96bab3a28699e2892fdd12d8b890b7289ea8200d31f18d2f898181ef1b86a0cb2876bfea134f616663bf5325a213b69b3c7f7e71d9f8650b9e1ab2e351004821567fd878bd3bd184aaa4c15293f72683649e8866496488b8531be7c6f0810563a7285a744404352a94bbaf1044796c8faf53dcba1bc007751cde97f81838fef67905aa302b5e79a8961175595616d0292f3a451775314977f6c986cfdb160f4da559066c2746fe5b3b88feddceeba21fe0b0b3cae484746410006bbd485120c08b2b636f2595c909a50745d860cd2edfba7dddfcd6048baf459feafda4365780df1b4682378aee995385f1dcac79c5277b691dbb3d76058e1a5b237b1f8f5ca0876a061b6f7c86a8ebf32bead4a74eacb9de75a9ae11ea5dbfcbf3db725550916e2c845ea43d490dcc9baeb23ec9d0db0656dc6701f4b71739c1fd88d70000221b09023a8f00f6a5e975e4f3547ad132056c7d8a1d5672a8afbde412ef3a510755d04c7df16ef8be4989eca9271837af6fae164751efe70c50de7d43e270304500e3152af6db807abf7b2c8150e9d5e0baca3a55688dfe658ac8533e09d0d58d85ef5c5b850c3e6d60d28ab27243bc1e15520d25a9da6760f13a3ef1544a866fce43aaf32c4cadc1923c11a765d091804265ea12463d30da55956b11f0db2318e8fe05e2952a540637c04352888f55aec8f893ebc9dd306efff2c7dec4464503983886beb8a572f51e8fc66ab9b586b25db53baf71408fe99332e0deec31e3644b3758ec90808f0861d8034a4584ba8c5e67f76ff686b8c203c55c242c2369e9671741d76d663fa61af2be2ed046f40db2e4aa9dd958d8e8cb2f7afd2c9cebd241330815a7268e4254d676d3c5db5575fd0fbfdd2744736fc3436df7e1d1e9eaa399a4891632824fc957bfd9c10669c3bfd676182f519d919fe507bfc428d8fe60dde7466a0f587560c8dc4140cc61ab9c9937555c8cb301863018c3978d17055268b29da1eb20b4dc1450ae972cec300bdbaebddc3278d650855e1d8dd0b6d8610310434c0419ec46358b06d4d5cc08328d63d6ac84db707a5bd86ea269e6f94d132da82b58f859e8225783834561209a8709b6aa5a27018a0a3d34dbcb1bdce30d6977e2789d971ff2542a73c6c760362db0c81d1ea95e8ee7315598d542f6971c3cf416cf5474a1e27c8425ed0f62de301d4e9ede8028f5258fae8d0117e8e4668a9e8721f70a28d648a898adb442cbb72e054745a1b3e556f8f7e81ddab1d5a5183b4da94678eff234a2880164ee9d431ac2bde463483bc8e4f23cb49daef111300b2fc5ec3034d9e14c86adcd107e1bc0de7fcc5d4b93c820ebd15b475df795c89bd226db911a7a8af47c39c3fc74a19cd90afecfb3599b7c467081c35be855faabf57ab325176859cc549d994ca015826df03b65fcfe329fb345fcc546564430dd26690104db4e18f5af0f27c2c12ec9e00e84743a4c6035c5eb92294ebc1f6c23acedcf0d5ebc63d60c2b1fcb06652ed0174d1d04b690f06e54307451a2bcebfd380c7d7c067971ce82f6fb6dcf83bd8b75b56b28cf75d9d366a7e3180498fb3d8e0a19549915fdacb49b2d9668080c66a39938ec03b216287e6257264b5cbcd3b06d239922715ef4f27854d50267c6917941595475356390aea8a599d12335eb0748786cc185fe1517e8b3b2ed7d3c21f1c29b04fe6ea517529f24ad21640778f7a9eab3f0fea616cf42840a4afed4cf206e282bd20669b34bbb3ffb734b8cd15b99e7f2156514c10cdd68393bda353656aeccd4cc25ecbfa7846d93544c706100d99e608c893446a539f0e6f67af09ab86516877add7c2c6c30c71bac4b350e15aa223706179a00512a03894d0971d5e9aeeca87cb2ff352c69b419f4b6089fe2d52e03b9bcca29155acac9ecd608b874bb5c9e1cdf0929859b093aa4973a13a854f42d13591de83466cb14b8ce78610481e36a127350f229aa1dcc6c51c69cae2608403839db39dca81beaf2ef539b04fe4fdaa6d51b032cfed26d54d1ad41a0a90a96d8953a8a6d2db73eca24d58a6ad0d3a2c8031a5417b948fce5e9a62e7744ebfd21406fb1312c9372a2ca91d37f708862fd165d74bd07c7c9cae4cb0426ef0beb4192ed1d6219a463dc892a0071dfe6c288ad01954148857972529d3c90579e656c796a34d11e8c3c0e14849060a1006cb591d63f5f892dea79795462dc7b9dd2b6f1932e075cf067ea587e2a258e2a783bd35962578c676dca10c898ca9845e25ca59379dc51947e52d33782edfa0a965b88259afa3371b84e6850b3ba2a0dd91c09dd8c008c147d16786a3ccc5560831aaa5a0a323ea6edd9c7cc7948365665802daa0c4b5c3c32d49c78f7ff21a873d23fd540cb76c6c39f03c0fb053321a59b06f068d5e36031612f562e1864ac1147f81ec9d17182c63f59808b9880bbedd0726289f5242c6cae2831364e7d06dc0670a83cfb3b169104b5a895647c24b5ae35f568c05c70e862080135834daf55a70b0cce98f9e86b1ece88aa107cd6cbbe19454c328013bae1907a917138253abab253a960f325375aa1b7ba0148f25b2f028ebeacdac7346d41794dde2bb9681fcd158519714818a40516a0c25bff78133f49409e647df1a0299d635c222608a51e01e63307d57ac446adbd19ea799c8433f87f643db3656d9b8c341500242c2151c5824d86002bfb1e27c81c3d59b4d5007516ff7efe404a4b0e372055c1c4963c5025e2920a790cd75cfc11032d8a8390c03f995e6c0616086c7d609dd5b3cf82082958984f113567d2ebe441a3683d5b6dc051b8659c355ed81dcaca1ca33bb0519e079ebeb3f148e7798f7452d299916aabb973dcd10ff05bcaf0406a06c941460110dbf1ff20bc2a5f11014cf3a7a542b11297cbb5a24d7065ffae2776e7c4f46f30e3cce31a4288a1bdb9542eec807dcd457e7384d24684d88a321270a8dd86c2e824eba0f3ba65c0901322821f0a86b3c7ac7acfaebbbcd22d415cf114bab55b0e63649710b9d79e72ce40e3d2d9a523111fd1bbab04ce0287c6fb0990ffdbef20909bf613b55cf50055bd88c506219b85ee33ddcac408376fa9a06ab1419e35481131adcab03fd74b9781ba6b2deba5fd8e256de8db69bc3cdd6ba759e6777a421790a7cf20e3b6756acb47dc18a15606801428840f21d9add54fdf5f11dde5bde80836ffedf4bb3e07d4690394d8ef25cb2c845270b0362e8eef27c11c045ef48a343452163f202ba66c8b17047ad2d5b0a5e0d639fc2a591251057719180aa7b2301f79e4078ca93f4bef6d643e5c2335ce6ea3e073f7b81f6e9edbe5f60c97b1bd9030d6e618387bc9edf2768ac8dfa92878ccfd3e91b9d3342dbb80862d194187daae658d75967baf56f1692373eb058d73116c0204524c46832a3a51d300c01fec3b6fa87be570a0e7ed31126e24d65b2dd247170ffedd7f482389a4600b9ef59ba68f26a277df03ef4d91e0954d22e5a8f7d6a97d34c029ab2eb64504f52d577d9c5032e0a08199f513fe14ee108a5abdae2e70f2ef43d658b98df723bf46a8e98fbbd7f31eefda40c634f914a3134204c0016128da1faf0581edbd66b3580ca6e9d8b517b5b778614edc8db84636cc4a975601aafd69dc5ba6621750c9d6a9cdbb00a3198c77a527737d32c63a36160ce53aaf19e05f40b41274f3934f0d1a6740419fc2f118570e8138e31238052d9fc21a7ebc3e5a37ee8598c813af7a8bb7f349360886c1fe53640235381b5ad1342044242fdc103f1ca505ce1f9c5c2062a183c8c40b1debf95736cd05165a5ca58a44fd8a5bfcca4b920c5d71cb8de5eb0070527f0ba69bb5c7724e9cb84aa7a8dde15e671f459e8e4472442120a1644889407d1005b4a302cce5821895423c6aa782ee7b96dfcb6cf568ba0b5956ce70850b7276d7340a83be54a29d7b6c60e016009fdbe3d9ad14c3eb9cb0230e2f0c18b74bfd91f3791aa65f88fddf492ec835e001a4a68f7882351c4058f76e9bd14e67ed0bb64da3ab2f91053840413b322e42b604af8435dc59d4e413547ec7ad091184e7e0c45672bc6d7ee08bc665575101d5cd92cbbaee30cab7a6e34598089d2cee829adccb1ff1fbe4a8929d23c237e61ed34c90398bc9ff8f42a5588962b9e61198d1a288df7901e2e6f37aa6979bf5de7efd239a21c58a1c7d8c6653f245738643107799d10095c8e6ff2f47d6e2db1bc87b498c52de49aac05868a6f87d7136cfd499e2df012997f3955464197219c39748f21068df950ff58756cdf3eb3aaf8ec612adbc2ac1c9f418ab27555c5a7663212cf9dea09caf728f71ab430cc2c556ac81d3dc4e649af93429e5c092aaed48315e6320c2874c250b5317835e51ff94d169dddc86728902f3deaa4822753556b4e1c9515052765f29317b0d659c82017fac9c8c3d6da0efb78187641b8b0e111e5112781822d1c2254d02d347c9d5754f7a53c00498806a998cc819381226a18b383932c778186fa22b8335d25e24ab8a862b93ac340ea42cfe8fa2a23628037e83ac484594c36841fe7aca72bdea8430efcecb8a983a3a2d99ba348f764a57c6ef2c24c876ec25e39c552f217a93aaadfd869512a9c47c06b8c371ab88f8d2ba72841cc6afb77d68f97138ac87cb4b19bf6b6a5edc10bbd1a99e9b866e11256d6fd4311ded2646946452d24fb14e48ce65a56286053a6e66f0d34ce6429a30b4066926bbcd8c75a7a02b9740f517eb7c0d11a1bb4a2595c0fcc598e96deebd1ca340f52902f5d9f02d2965b9a8691932e238a158b885d8244631421cd6e5d942924c646f15bf1c91d7b4d132336d717657b37a4f4969bbcf4101a7ce734f99ce25e3ceecbdae66964fead001abdfd241045e45c6c5b7859ae4701029f329014300b69f5a35a814a9fae448df2cda6aa4345e22167f012f017ef2b4840118a19b24dded57ab0db3a3561f9b62995ddef211a4da568ef532de2a79e666369c446d67081ef22df077ce14a123ccb37149a1569cbe9a756ac9dec917122681d79aa467a42f5cf273c74208c9c45a8119fd425ced7669ff1e3b1c633013d7775984fe7392a2dbb85c32e018f601cc97ebfcb29c98e07f3a257ad4dee3f80e993a2dcc8ebef62ebc6ccd8d9aaea892ced84ff5c97ecaa6595710a7b34fdf8a072322ccc4cba74187f302a0313ac4eeb6e1022269d67fdef04c441161e33bfb32cc20fd03eadf1f4f336e71438546446ec05b48d53990e7e535c4600206234ba9bb96d5610d05ab0018c68fef7bf22fcc62470a38b8d223f251ff3d9445cbc79507ccae53e84ba125d22474a9782c298f5ed73e42da99c5d33998e3d42146a443f185a0a83c64d459005d2d1a702fbe5df4550ad701b409c53d7f1382435c78a658f5d9a3ccb2170aa13da506d9af4b4c1c72ce5f7c6d02a5c043aa6746b2ac8658b81a12dfe6b1a49eae6772ebcf2a22064ee83882151f6a948d76c5836a27c64ab76a27d42b863213b6eb51bc6ab38bf6ca370bd4ecc82bc9edfe1b0ef70cc7cb778f8d3676f60fcc0ff60346fe4e541dbc5756f814b691215ac49204cbc3869b728887ba54754dc38371bddb90cba9c5e632cc2620103753ed7ac1788cac51a1c5cc55483001fb026ad868b6f3104ccb61bc95095453584b85c061abc97402451c16464df3d663af556b335b5f77d453431a236278eccbea0a49c0b9f64608001d4b501157ab43033bb90945484fa18d78abaeba36200b398da070fc1406a78709c30275e84d1deb33a3a104adc73200cbd694385a6497108a35641bc4b2d8055e497ca2dfd1e3778c9b70e8ae246507e8c62298042b7b03ce86940f618231763a589d149c1dff05fd96ce21da2116256b8f33e2de0dd6a49fc265d6a9d207499016ca6bd07683331685405d3077fc2e6c3420015f94fe3260f8b1b67ece083fd4de11b07b882f4d2946b7d994a53b8ecd2ba91333e106808c2f4fe5c88c59db8c223e6876c6d1878221e49ca6e2ba04d8b67549811b7620f4fa2fff5e5c852c1992feb88a3abb891af35988042bfdd86c6c17b3d18082252ccd8b0a2624aa1888081c5a09fea17f896e8caf2e13dd11300ac23b0312e845fd20b292811d2458e9e56b528b1c2f4917f41d86253d7158c6aca3a2bc4b5de3d5c9c80386a507195761ff0c636a01d7ffb38ab3ca69b5a05710fa20007843f11b054cc6c2ff9ff956812ab02f76945326cdfd470f978360998b221ac5e2736a7cf45e6dba774f20543e131dd1317df1d49de047b952122f12ba567dece9b705d1de1c6746ea92d18dc303c42c92358b2abe44429424a997a2e80f1e719de2f033da8ffc6aac96d2fa81a8ec5f78b2bf34d746cb3d727a656dd124c28bac8b1ba7124889efd562cf00d9a608a8d0ab04ec46fe83196d0ace26f554d86ef45726da394f099c0c8563bfc0c37519e6c79d25dfe578c4e35369ac71031e6e881b0c8eac4a8a2ff2b279e75700642f6e7c0963731495a002f540f469688d36e96ba58b70ef0ef4be43a28bb2de62c6669e59bd2acf02177d8cd9bf48b2e7ff33a92d6dc57a935a356d652281a26efc372e517b742d2deb07d55ff5d65a6c14124d092dd063b4bbc934bba4727d205232a1793d5aa1686ed48dcb45da0d31b28ed5d6266167f71f18de2bad2f443f4cdc9431ca4c30802e8b29afd80c6061d99ef2855b26b23ade968ff2c1538476273cd34adf5a98922f78b8bcb6f74cc9139903b13206fe566a3bc25420df18b0653ddee6a124b2e3bda30c2e210d522c14fd6d07f996345358edaef4e3b50845d57109151e118d99e275fa0fafb1f04d7ca243606ba1373a9912756d3edb205a236d426565a2ac2c1bea64c9e412685a1090b503f58b1dd946d54daaac76ec74c9c9b871e58e2044a04f75e97663d64aeb714d5365b563a74b4ec68d2b77043694ea21f25d8ec8320daa2d75aa403319ea12752356dc10968db531df33372847fe6d2a5cb12995abab2f699aac3d246e20a8fab1908547827e9c2e992204a607c6c307c375599ba18323bffa26ecf067b5267a414eda7c7fd7ce51e1e9e3a6959ecf112a47612776712f866309115a90600cd3cfeb581bcefd08372870c69939d1e49dfcf5f35647023247b226fa292d7c95be19903c72c23e90ee3cbd5917fdf0c6e03249cbfba3b09330252965ec034698ccf88e906665bf64480d8b0953069d16cb8581431579cf898db6ff1568c5da5e3cdb31636db757d1322f4627dd309135a88ed1d2eacc7a5047c51ca8578b9b50c3836e25448b8166af80506270c4217690c2cfbcecc025bd8f5d93d3862af0b43d0f3602e41b4905e6a187a6ebcfc3984943ac788a65d4a9605ba8e765a8693f2865499ad009616774607ffe31a86152cb77b4393c221754111fda029d097252bccf982c99533964a7c939c1e3c4d30afcf96efbb1c477fe4017c5c77fe7018f391bc5bebb484f29bc1873d869bfa1f143ea0a5a93783f1a63582781de66ae557b1a242687505cd582c7cf4696f0850782a44954f142e863747d0b5139c26cec8a342e6e63ac49cb52550515eba54ae65a228d89afec983ef4805d280b75a9be0a2a9aa47fef8558defb907e6700b799a2c7a5d9c3e044ea35df5464f0759160b2a79f47be0486647cf4fa6739c50894a998b2de6cc0c740a92c0d6fb63190cfb37b1642bfa38a82bb5eecc8c12a8e71809734b09bd173f6ae05e5dd66eee0e7914317769c095e1913c78f4d94b2e0372da27220088d92d6f12b2fcf561dda22d366b608a9168ba32d16f0370a494c3156a29b0ea0fa2dd6966ede432164b78b65a51412859caf0165c2f2f474fac3baec774033d67f5b8b103d05906934507930f8080b7ace89258e47118ad684a5406ab0315154f38b8f634f609fafcce7a4b6d304415b02539d51c25001b59bdacd439a116cf8a4ff3e28e036d6ed25f1f5f4ccf3b6f3976d670df5b9ab3b99a7a837e1d950a0a79701d871fcdf4960849bed9363ff9d009726703d18d22ad705086ee5503b85cf5ed469ae6ca5be275ea1a381bf7a193e853631732abfa0f049bae3b1d06303427cc7ee0599b2070ad5ed66c8a5b0c46c7d560f7e6b2291a4f39f832be131ea599ed8c34195f129658be1e5ab6fe75d201f522d91a73fd590dfc4718bb503fe50e2e322c219bfdc72b4a21223e9a233241d582a126968ee1125bb938868866f1af422f80214e882c48d3cb019cbe515264a4848c8bd2a5d5e46e207d72e1ff083d4ece33f6ac887e28d8be79fbdb06035c95b826c200034c191ae248e94f36b1f5253e9ae9433040d570818df4602d461a3186813fc6058ba4c8f3401b394dd1eb84e3bcee1b090f790e5c913c92e8f9b45d18a3224e6f6989330466c9a6bc58aa739cdc19e57b09c4a4a09a360e8e34f1c77671b71a382a1ff726e5303cc2865952d8851724a0da20bdef5c874e26d32740533775951fe42bb36efa0872e52d659548871d67f834af8451c6aa5fb1c6b791c702d036490dffb12a85b91fb5e14f5c237cbdeb0ef62a8c0ef9f469bc45450e2ab5a70f328b1b3afd694a824ea87ee9bfc3066747ca5a228536b8c3245c90c167d12815dd2d1a8b2bfb9d8d5e1f3ed606693d2affeebc37f770900227b8cb32ebcffbc9145db05200592c194ba40171b220f335b8765708e5e2c93389de47f836ad23642273bd405bf715fa37ba27d3a5708423ebce103c53d3fa2a1ccb89c8695b701a1ad096e6abcfeadf989fd964a2bbf4657aeafcf32084474057af9cb18a2f769e07cde2aca037985d9a202024128921917d9f7278b861699cad0a8e3d24df620c35c0885ac11b9b4900f745ab2057f592b24389869288bdd4ed72219579c51ac8f792fd97a9ee7f4ac3d3e06cc67eafa14744704b975236583673b43406fc39fd77b47e2cb5bda79b0fa3056de9c5c448b7fdc79f3d1f3cca7eca9e7e9c62f045a02f68550d3d861b703878bad0cacb528d9d82fb111dbd1960dfbc45b0dcf6401460aa55301356963d95270b2c8fc25b4c5be8162ed08c003f44a6434801b421cc4060e8d7276656dc670cef7347e6f3c5ac498cda2735a850275c8cec97a5a854cc94a1b765ef3bcf55f0cfa9d5bd4a921f86cf56210bde967de01362df7d7f4472e0635e243069e4ed5f447186ebc9ef98df37c081875f262d00ecb1389904988fee9810521195d25434f5cbf9e43df8eb04abe3a2869517eadae40141ff391e0af0826b04499cc6549c5f30ec45862baddc4559a9408b45b349567b503fddb48a1e8fe40f88e721b6718538ec0b4393084bcb895eff59fc8387e1c4baebc0e70204db0b2fc3b6280b5612f0626d554ec39cf036a10059583bd82768db71a8c4a93861e6c89e4a897af24790ee0434bcccd9c566b45dcb53eed95e6bea707d19b10655a7419440c368a8f96dbb0e702cd39a0ad63b70f01de51caf1a8ff11b324eaee9a9f4412b85c2bf24ba430f501ac93a0b923e4c2c2e73a141d23aa0e346ae4e4d040c35a0faadaa9b0ae79cf914e1a6e6abc5ab7fcb54a8fe55276a555ede50232d0b12d942d926e8acaa82990f5f961718772430878723cb6e5028e607d5fbace6684b5da4aa386520f56f4a54d05e035c988742e4dda8928490bbf78bfa50078b277e02d78ce01dff0cb6ba860b09471d776a7f18fa6f80469a76e30f336a3eff424354bfe04a3d5406ae952298d69885a0a224f4a9c0d80c289c748aab83259c23dd1e8df7de10c168011691d60fb16e2f16da096a2c2899f064b70fa732bce340589c53ce83e23fc7c109988b28e34f44346b6879d44ae196504ba27e41ff6440ce1939f4860e8aa9fd79c65f2665e22cbf4100c2bd3932fc1d8a2093a4019312027535fafbdeabb4c3749ac60a596389dcd9d960175fe130289ad89389c845bff40b85031177087da19bc01081b1a370543167a2b86776ea11772d16b6dcd51ec240588507eaee5db18ff1b72b88b232a764498dbbeffa33466002b49fe1448d564d0fa16023e5c43da3fe8f6adb57cd3d74c682922a886ce749ff59d1c2725a3dcaea658f140ab7aaf124ba52b2b5dac93af12a3312a5e4055b2d9ea6a5c2b3617ea5111bd7521624d66c3ddc56896a20092666dce2baeb0a3511e1e19013b275dea7bdf38f7f380a5808776e16a258146977fc880145dbc3f25e830bf292d80d4636b80a97a98d5efee894061e83053dbfc68c23556f56c7a28988af566a7abee9ce0ce5f59c3e05666fa9fa0856f5b0d90f9a005d295b4b307e840b05aff764481f2562a8056408944aae1ced81a2a608245188f100690ae231d9594481c4c1fd69c5d3631af392017af1b717dadc6997910b8516dac8813f9c1adbc68d8ebdf33de8f235091732f8e5bc857d87c37977d55c0e06888e4d2db52fa06960405b1790251a43f31339cddb084b1d3a8fd6f9db384132694a1d595386a756f0032c4666b9ad32715709215aaa390f927e6d2feee77d3c3a5c599dde4aa6ed4984fa0b6fce7ac74c01766717ba15ff2da874f4e9211e8520ab3cb758d0214b3039eb7f27d9f00439086e14878882c2049cc67106e04006e136208020165329c1378a5be4b53a0494ea254c5920407af25811d6ca08c852eba0979dd81a89c49fbdf508bef806df9bb01697a3a54147b530e6495b18f4c420c06d11658c740c931c71be018fe81731b446c30af6a86b2ebab25cc5b1b720ce910eefc6bb97585c60b80215c4ecf1b42237161563ff5f3e085e53c9b158a87e69d47a867193aea926a8cc41f35443412c74aaaadff00aceb09231e591676c8d8f2538d340b3b43d547832ed0e94a46bfbeaa125bea63ba3fc4a52c13def9abc50cc3f930f612c2737292633a9a11421dc04f23ce5cb721a4f1917c0ae80214ebc054c4d82c2868ae3d85b7b2884c238431ab7735d00f2aa0718cfcf83ae94b2555ef0d61eab89eabb8bac91b11ad349430101bf088f854810291ae27897b7067823e39fc439efa9a29d64ae9122e1d8d5db5a8a373903de01ec59f5a41cb2fc7e42037dac1ce3a14edd29cbad51e14c3f3fac2d98af37968dbec0dd89e267843920234a192a6f34350a271db09f54b6eceed6a46a6f6af24c02e29dff0740666a948ca8a81255308efb487e346a890506cb7cc342a2747e28178efc6147079b84cb763ca9636591e82197ac34b84f41b9f22446b4cad725a61f8141979696da6726cc7d4b5586ff68b75bd00500a3a076779c13e04f204d3991e4a38a3170a07cf3aad80cb276f7c1c4ab1c075c353c60fd803559324e8d7cf6d4dc05a574a71191b2437950813303c11315559a36eccd431518f3b8990540109047e4234fa08aa78c2339b2b430f05b16af818b1b7d290b92b6a6bbd984c8fa3fccdef4272e2476c12bcf2b75d7c6712ff6ea12b143f5f7342272107a827da768c5e0e56d13b1dd0d0b28b049421018683203fe07991d1f3a7f6f1d727fc17a34aeeee4bc02a276c6be9c243381a59d3472552e8e4a37794825f63ef2895341e1b21c8ca382750fc4e66f1ca2b40649a99d1b85a4c3c8a82dace15f0a2d3882b5258f99cf6fcc4260f19775c935d02d6e5cc5cea4021029b11b63cbc2bb605d3e17f9d13d5497efcdc449d368bdcf007dcfb164537f5a9c99f66a9f2d09266eac6c54e0f82b64c424896add2d32ef98fdf26b7a2bb934b69fd3001b43d0e435aa736dcba86d765719d56cbac09c5759a3d1337c11c9429e461426b218aeeda954bd21097b41e7edb17dc136b901ff5a54a0134dda4f6715b7b52b8cbc2a7fac4f4c433c6681b8535838ccdc92606b609acd3154e45c949d7e3d8ba592a59a12038939409a6a3b2dd868281f50fa28c6c353864d1592398f6375412dcada4c21cde38c0addb6fe7b7019d2189400640c8ff9677e319e99e643bbe7e77aeaa169982ddf41456d62bcca7003697f4cec0dde8a785e44805d4610ca42ae3814314a5965cd553fb21424d5ed06cdfb3a36ff278349d1740ab2d49c7a762d4899cb09af04a5da9afa15d2a1bed42cd22162aae34b1e08a2f124f9ca9fbd4134b7e4c9260e9597f781df921e3904d870c0c1488d77e9f313a7bcba54b19938d1dd275661a1f55a03e65706217aaab838868340cbde41a268da5cfe20172b9c1bcb06453d357b220632f6d44bd3a54e16f3b2036a824feddf80ceaffcf62f710b50f368d9fceb643b2004fc0b7422d7e8d6564ab303ee2d2af0902df0523f39818f5a8b345f1e0d7cc7f42be003c4afc57299cec29d591d38e5c0ccd57fc9b79916da9cf13814df1e8264d3b0a35edd6011a7a90f147894768dbaaba2e1da94a0e0bf7e3f59ae36d0686d3d7f599f1de590b6ec96c3b8ff9d34550e388fa7088757ff684df7a8758f7db2bb1c4654f9c4a7686a2ae7aeb4ab89aaadbcf7ed5763ab784b41028dadbe573e9d57e4917d713a43218ad96cbeecd41e8d424811eeb147bd42001fb7a55203ea1577011535701ff87d2d5dcda9e78c1c9354337b3307c3d74f68f4238e4cb809200166c3db6ba803de3fe64b0a5333c94b79d311d53bf4e5dcf877d12d3668ce81c15cae7fdd01d8708c91329d3497758d35b0f5ce578651f3d19824c8d67bd11a54e6ca31502f7194f0186dd18b38e78856cfbf86efbcfeef847bcd31301241c37124f97cf90435a0c05af30f3145239bfcfe4c7cecf6eb39faa7d303e716cfc5e80452dba5f4824ff2b63272029c5c2d9ec134a67c1220051296273b378d998a8371a5d72c9b858a31725011adae86459d1c11c5e827f1efbd352dfd77fbb6d34cf7993cc59d4ee40090c278ff5b3e987226d838283729496acfba464fe5d28aba4bdec4febe86c4672d86ac9efacd87fbc1654e6fdbaeff61e0a5d74f33ec8d173b06c75dec5ee5ce09c97f8192b659446089a8946d1b57d5a5fac464630576629915e8ed3dcb1152532da4f31d2f6cb2fd644ed10debb6fd809ea210a506f06f7d659f7ec03c248d5d9473bc140b9c4f767e8031268b6246d175469ca96b8c67a1be249abd846c1e3d7d1609231ba1012055de18669e88db1311b359e3f74f7a3cf3bc13bf11edbf6d1400c33283bb42c1c128434b3a2270c4d26ab20fcf0befe7b9686184b4a2b9e9c704af32f1742afd9ec8ca9b6624f8988a64af78c3bb46cf6fa6cd41ba2caff6fb05383d9d264400275ce99c79cd93e641c9846b4b2e670e48dc6baf225c3412784f0339bd940dac66a4db841abb38dcf635dba30f72de6b61a807962a03dab5c4425a897cdc651908248e75bfa5d11508b04590911cb27132ae9cb538e06a9c3979fcaf6fa96ec108ad98a0001412926080581bdc69ebf2d0b530e2484e3bf9616a8a98abfc3348b8147cbfd8f889200fb4d5132993e2f9df7acbb43700130df30b4a0f1e2dd9b6a1811bb22b085f0f7e173ba0cd9b30d513cd23e17d65df6dce706199ebf8411ac7be201b4f2944fceda7177c736dd7e21608236ffa7b1d74b229d1010d2e2f655ee120437e0c2ca4c0142a8209869e8fd8aa21ddcad63023766575d702c94e5609d843688dd07bffc884e263bfe74fa9a14c84c35bf45b24374e85a0168aa37ccf85dae61a3e64496c903d140cfedd1a0672de0c1d85a11f85bdc7c6bc7321030774c47ed708baadb0dcbf90b8d5925a1c480f2b7e4bbd8d2907b6167911b66985d6d7b38cefe77656072ab2556775853937527038453ec07470daf80e338b6857cd326c77f69e447f85b8aa3d5cc637f64965b615ae605f4c2843e162e9cbf73ef337f6c639a5ce1b542e2aae465f14e92e635b8d8d2b344fbc076cfdbb142f489d8da562c1ef7d6ebb03ceeaed07dff826e4a861cf29642fef5f105e48e0bf0f8a19b624c1052b8983a13f315f9e581a679f10fa1dfe952eb3a874d367f2ddd716f000e85913673d23175e24da7710b1ac4e94d1b1f72b426d84061d74b4cd70adf252c54b5c27c2856bed277b931322b439bb0296abc5e80af31017e3dfa8c1175e73fec872bee8de3fa513dbe2e4565b1635ecb232bd5c38804fe0d74f72e9e85c42a50bd54e3ee2f460d12a438b4e12c303abfda8f9ff29f2c207342fa2bb49721d652d71f9fd7e52c0fc25bdf2b9fb50d99a46e68c99845dc404d27cf0e6830d93a7acd9f11eb0689622b8adbb27fcb084f4156c7f4adc55570fb04214550c1b480118f5ec9aaed049f95f8e722a70e1fee0c6a5c8dd21024499539a11a32a870ce35f8e81f7681b035d6647bbb6565818de5943fabfa42e1652738a84e33001d4ed90efe0112d9ec2cd6f02db21c938eac60f81ecc840a974e21305c2b070646c220a439558af0f9217c59c3fe738c45459e694155ed8917b3ed2d7ad578798c39736c7481ccbdf3f8f910782394605e14f4bdd65e0398a462ec5c4587469f088f1683106f32c331635f91946c730d181d752d1f96621a2e83ae1803abb7d3393b2c7a0cc81d65bafaea84ff00540355cfe30c7bbe7cab3d3fa00b65f221b9a6adfaaff49406c679947d323e68649ae2847426953a7501357ffeeeb41b3277c56dda3fff92f6e7875e14d206fe52bab583435d5205b3fcd50c0afc16e0d5b7153ca5ecf6ad4857c54bc8f7b9cfc596ddcefe3df6dd3cc52e5bd4b9a6173fc245e9d23ac685752a18c87928204cfb6d4123aef3ff68c8487526948faf1b3978b67f10714e56c1888fa646991f4256932d9c9ad7daf41e94984266531f5092505c0474d1dc887c4582c39b27fef06674bd3d3abc59f46978f3dc256f86379702b856ebe6f8767bba25bd8762f92b4fe1a9c9950833b2042ac60003ada96917b40b5aed7c985d1bb4eaf77801bc7265ff5fd49b68cd4f07ffce3d231dc57ec1faa340d87d722a00db55bc6428e9fa5b5cbb5a9db391ac4aa5de941ccc994f1b0952f75eb16214d5e888c43a1dd7d6aec764605a1b0163f99ffa11f49be5bfd9fe38887f19ef75079eade0b65a7d447de5d63769d26cb4e24c440f4e9db4b1481c8bc71e75d55e46bfc8fcd1e48819cc01c4de18fc01fbb0bfc19636faf480c9063bfaad5d8cfcdc79bf423ecb41f4c37e6ba0e2941209166ddb1db304eb810a70714d66524fe49bb4ffcd048c3813cb2fc07034ebbe600e464902a1fc1351e3de7a2864b01f8b9c76f8f485267b7bc9ad842a05eb74e6757842c2f71b043936994d6827cdb5830e848995bf11180d28f4000e93bcbd2995d66748003fe8b1a084e85f20e482bc36cebcc24f8877e50fc4c68a2d039aa79c61c6912db31b506bb22142e1e0207add6d202dc91268d6c4532da305959c3d14e2eb6c423f36b468ca85c1e2d92d1079c10564b563da922a511bf0ec0a454d554134ef33091d115436e42856999fb9c28e43c68db38f5f0410c2d912cbd89309a5108915c4ed54304ddacaab05add9835f0535368d1927f452fb6772286945b2458ff1896fddcbeaa5d5c9ae220078cf4436cd69cfb545d236675fe25188d82e44552766c046997ef5f05a22d7d15fd3279fb10c635743a06789205ddef8b2b8a37a257959a4bb17bf2caf9baa3ccfc47926376909b809de9814b5eae3d13565f3cedc05358d648a5198a35ac2c081e53c44d1a7142d4dc154969dea4de9fecbcc67bac245b5753b6ca22dcea18d2568ad8075eec211c4511d8374f21ec121f5d9292a747f127ee456cbffdea020c168fd3bcfca563bfb8f0d409f098982503f3f3074db2c9f41249f8c4159d8f935af1a14f25d6d3f800c13d00f74b3be48e080610fe982067ca5ce914465ab670bdc779517db48320b9b09017f6960536091a8000b94026e4e9155f3e4d588025e2af9dfaa6a2254c560806a356988272fe449e67b7cc2616bd5d10324fe496560589b4d38856c9887d531b8ac14c48e0a53f54e586f1906a10aa764bf694ff585ca5687a2341c9690c2c516f64f84a7db1cbca590ddd7a0694bc634d2ecaa6756a716da873150c591cd33aa8d45780aff78b50e5000dceaa2ace8e9113c7a9b5d72fec63c3c7c2b4605010eb076428a209d612645de3529309210cde6d142c4949252930b216dd83bbc16b7e4640fd079f9858314ab96fbbd3588cdcb8b76799a2466010a85c3d0a4bf6c45e72d8bace70ee9d1a610cb88a1a1b88ae474faa1f70117f1039ad2fbc3420a7b50d0eaa4cd840976e92761f6bfba7f2e60008474492ae124fc359aadee1c31ce27759d55201f83822f87b8c323747e245b498ac47477dfb769a607bc0e46be0ef22c267da154e65465dbc07a37838c0c63a0f024995c633a399edc221b930835c67db20058a24d1679806ceffed8c83898e11dcfef8571c2bd60d3c27a6925056f56b06a805fd933e10ccc71341ba911878d03fe782475483c3cfb926c8fa8cf236a48711cac4a4c873103d7a0c9967a36c469ca44c12f6d0990b7241430256cb1b1b377845653ed8579ee64a00672df88c63220a04181b357795085c391dcef0a4ba75f1c3cf9bb22800459022e12744f4b61e42367e52ce0207ec5d6ca87b35279ef963effa3ed8e436dc2a0f90a690aeeaaa30ee44ff90d230709553ac4b31606cf1198ae21516ba84c460a68e370b892d6abe3d21f27d61454dd232bdc8bf14166e4b558bd1fe76dba97b3afe8cab119e43dfc601b8c03abe9f93d4269483a51e9e206ed0b76fa2a1e118c0b5225475cf05f5c246e5c8e44a1c7a0444f71c536ec1f5deb09fa0bdcbb6f7069a8ffae25a0a98c29972a1935fde518baebe353a670694b03ff6520c8b9103bdf1a781c0d3d1bcbcc79b9820bec64d02adf2ebb559a74229d95e3b995ce1f922086f0025dcb7e92ea9033176246537de8947e8a185340c355f98c10b0a363f076476e471675fd4d3d38e037fe4088101d7a387b0dea526f2979d45d8e0e67d467f52f2ab19cf0792daaa5bb7726de5d63821e6d041841566354b7142301f0869a084f406c8e622b51d6f3499185e87ed61f18eae44506a09d1ec35dd514393c6e163b857acb7119bd0519bd02eb4023ab319c47011e2ebedcb8176538ee48816b13928d65e6de3db676e6ea4359690df6b335b0ee7ac08232b98d3e5aa3cf576fc1b8feda8ad8c831d716b210683459e8049e1a1567cf31baa5aa0cd8e5be4e3c8e4df3dfc0425cf16496dba0b1046237cf7dba49102c4bbaa7cebc295bdd60f5f2784f1897e34dd4e333cf674b1cd55b9d3e313f19ed551a4bcc090d12e28dde0ed9030d7f250863c4fdd49fe3585fd417a7074622f8f24e0b84eb9ec89ea33bff012ee1b640c2fda3dda317b22f09b5e166c4ee2a6109642178bbace073867dd7946eaa6c2fb2730bd8f1e5b0919a17e4f6cb3a7c88d2a2715e0e3854a248378f6d0d01ac3f192936bdacbbfaf86ab91c03874bfdfcda69becc714cc4e8e02d790495b5f6f53a1ebee9e9f81126f4747c616d701f8df17d2a61c95e309f17b100204713d52484e262c2a1512ff8d7fb3a51381ea68695f4a5d1ac34047d2f5348425e6cd18a023fab3d9a9bf429c702674c508bdf1f797933abae37898cdb5f02107054f32d17679fd360c57ae4789432e05ade29db1a63bd6af8086df0f25254d4d2b3260f32db1ea26247a97e5f1a73042c00c2af929791bc980454a6631ad5241e0aec882896aad9f924cbfd1ef63621f8e07cd03726b0c1af08253266d844002d0d71263d6dce5b88cc098fd3c61eb16647d0663334f0ccd925482d63492f22794c2a23d23da0dfdf14676bd98274d538ee87b05ffbf1191bd8b37f1b502ca349d8a2aeab8dbf6c588b7df9ba6ee5147acddc68330c222b50626cf03b73a1936e93f0182ef57cf91ebc7270f84f9b8e4d2781e8c4d880c112ca6b02e51a11ca138a7bd702d268d8e42bd2549cc80965c6aa8e5987c649f91b546ece294cbdb5466b03a9aaa572bb189474a306190c431df962285e0e98d8da1263871c830786d30d66014cb17e5f9c410b9d50e19abc922126df64b44fbfafa9a55fda455f1558b6db06d5cc0a4f3c63f97f6198f30902b9ee72564f79c006c5de941ace858000b00f788212eecf59589e7a9a622717af157b291f9cc7a3efc23840214659403a9d428c69a7ce455fdc277f245ea391e368b51a98cf0d0e268c67d382da81837d3f4799b9cf5be02e1afcae6518983452a28ca34858c0bca67933a5f2fc127d756b0dd2e865c40395ec85c35cba80aee102edb1830a735b6f41ab1662e4dd5b03d6b8e1ecf1b655227a6ffa2b44b1c63ed8383ef149f1f4ef58b58a205761ab6a25763345e45274fee93f33951b28011b1f234af12892c921af9bb93f40fb38b535537df30daea8b3b7954e091fa41fc6cceb2c52501f303eed5c29f5bfa0609e69d24cb859086b662275c825085d7810c5f6624c9ba06c16a7c0a17ff1c0d5059628c43218b098bac392807c4fcb76ab20daa08a9335af518570ca2fdf00876034a2a81648d9b79f9371227345780f3d0ba465bb48f8a50bba1c7a63db8e156f90b37edb0e2c3085fe4825c6925f9a962b085960ee242bd7acfde1751334dc8a877e9f115d2a1ba2483c20c48087e4d20902375ba623b983a1c19b774cf6fd5ffd280624dc37c83f360bcc37d7a4ca1892d348f54a3322088ff67cec29f5f950c00ba7c794fd43d12f73d00ac38f306ba750d32577f74b960a41383d45f89675a684fbefe9a7ecad387410d76ae9e6f17bc4427c0bf862e94b5f91ec76412e74d280ff3c022b0da797868c00d08e8f069339b8351314570100670445b979a0dfbd92657e76c618b1f3baa8dcfed9608c74d903333c3b0bc8bbee996db50e9f2a22c389eb0dcfa0814b3f3babf40ec3e7a088a3d043c5ee3f5ff721386730445ebe4747c9e88286f5ff9a5e941ef2bb000a455501bba19fe735d3373e5cb970688021b84ca746ebcce4267e727542e6492ea764a4284e7c21c7a1154bb547c86dd58ea873f891a34e51b56f0a992a3ccbfa5acb3b5ad7f2df9ff6b9f2e5fee62e01b39f4d47e4ad73d2bdba1223def75bb9155e5cf0354a0e7d0cb3d242a37ba1c640b73ffdb620ec95696ee7cfc99928d8994fa2f8017175fa09e8c57334a7b631e1ea3f026eb457d25d922780279d07da0be597f891c9c7a9175c0a0c4965f314f0f5586f0199b1afb8606006afbd5e5af973bd7eb4b6492691599fb3a0ebe090c2c84f1195cab5964af7df13339fc558fe03f42ac0b7c2ac65c6b3775df838b68fadf41d757b71c82a0d0afb85792ed6e5e8d4e352a1b849f8a0579686af14fda476fb246501bd15c21bbed9b561c9d847ead42f18136b21f02b11fa4e01c9bbd4238ba9c88747804dde265a458929511fad9bdaa870a2006ee737240d5ecf08dcb4f53952922bd888417130643c03a3fc8aba17ff6eb7397cf9e4763a1de7139032a602f4f6deefd5a8a1c9ef1cab93d05a634589094389c930d341508a2df02a1db0aff298abf2348e53a2f7376598d45d3b52e6ce5085eef21429813533eb3a68f6c2800ad4b638d7f2fb4ed259149c038486a2616e1b905bb83347e266bc0a2bcdaeb465c793c7eb0174c8fa4db3cba4b203be3b88005504852ebb484e6de72339344af3d0e1341968711619ede4a55965a6b63ed59727b89ee34f36c8127a354f989465a4ef33e87ca5b7f849f6f95b746714cae28c5909610f1fe50df887899b06f45ae15278bce8ebb53d75ae4d567037313e69a18c5ef0c6ac5d5ebecb1a6ca9d644e00cd3d205f4071975c5a75ae7a7d49c82e4330432755165003f6940f1dc4769e652e3cc763619b8a9f9d0af08971ac4c584d1732ac535147f6de3b01b967380e92a4affb5f407d83ea32c3d9b9e66d1280f8142e24d857bc43fe8e4b9cc1bc237a6007fbc1f0ff48ee95fbddf748922bc4b4a0f392aa5d4dfe2f8893bd217c53412e6bd24cc8c1ace79a917de9024e0031abf428a5a3092b24a0774aa617e1b91213d28cad17924336a9311c1c8f70c4cd22b47045e65a70271c2fc5018567e3cf33e0a1359721d8e18c40e21ee26ff9bec0143b92dc90e8421a6848edc3e61396109a31149c8de9b6cb9a59429c9148c08a008af084c3f67337589ae281491c4a113605c3bf6a82ef59092be016a4d6fa2eea2b9ade91d95dc9882b25e4bcd39e7a494d22b9ed8620aad92447be89342af100ca5d3439756a644b1215ee194d4e82cba28827ae8bcdd2e855e374a81b01ef3a8972551e14b2f7a607c7bdfea04479ebdcf5f286a0a0d87e3d0d6b52dc6b8716fdf1e3711cb444cc4444c54d459ac4d34b22ca1be3979ad84d18ca68b384ab75ab5d54ae823968acd168227605e2b350ebb637aed851785aa0fb59dd25a572bf72eb10b121212121212121c1a1a1a824370e8058ac95dd241b34a57984fa983d695fbea88d2125397e88a42bba3c8a86f805ad1fba86f622b7a2345ef24f85b0f9822d215ad9d72da6058270fb2e009ede9ec8e01b62b5567ab7876cc6bb95dd41bd47d8c190d2d88fbd05f1fd237dcd2b1424dcf4cf711c1a8d117872a65b42a7d7a78027b3901d81dd073c0e6985eb39b764aa5ba55dfa0bc9c9e99ce51bad5aaad56d46379437a26077b8210fa98736beb0f756ed947c761cccb9a583507816d515f6e85cce722d5302a3caadf22e5b00d4324509604dacaac572bd579b08db3faa676ad7089e8312d9df64d0532e753e6ececfdb0671ea5dec2afa3e199e845f8d40a2ba0e4f21d63b72ec0c036fc51032fc00053bf158e24eac74222959676c7fce8d1736227a516801f3eb2784a164df49a15fc57c24724d80db01f54e85a503bfb76a99042af672043131831e39c724a0ca379950119c25a94a3c500bbfb06b6a0d1aaeb315dc33af82922ea0b30ec8e7e66eec17390455a496196115245c25e68d0a194d57ab54a67b9cc8470357d6b75e9ccf2a0333b4b764da8c354f697ebf9951a3d5a6550d78bd056662194e242d1d22fa7600f50760a7432e5173af4ef080b255ec085949bee197a43b18d3dc3321fad4cf1b5e92397cbc5a4b52ef3317e4e021bba7ba4d71e6afb07a4e6d7b1f5d9c3b311e83bdeb00e97611434ce3aa2aed333aad05626c69652ae1797392889da0d8181895dddec4526aa13d589fac9a1117e374775a27e957d865416c3c84008218410d2fcc0f13d274f0c5599c5109ea8d413d14909b3b8a8ae0f3df453d1d2facad9a7878359bca2592d51bf55d7309329455a8ef881094ac83798a87901480ec56116e7308b1d859cf839363407a762511286ebb5e40c2e3980f1c40e929ef8c28b126aad15935336520b38be554a3f072e925c192209d31e59b9a24675b435be37bbbd11ee921cea56a9189d4589d1103a94a194444329a535ac231d2924e950410eb0c856b522e4f40cd4302c070a27451f24012df5686372a2f43828e434a5b57609355cd41e9428c038e2c86b890d922061586c39651c8228d265aa5108b6608d186de286450b0b96388210c26ed8b1bb1bb61af5b56489ffbc9508829bb449bfbfb467588859ccd083aee9b1cf393d28c42c57d763467ec18520b6f9ea11261a4589553958909cc0c113b85f4f1151774708bb237e4bf15d05cce2834e40230db00de63ab816443ae6da9c3306b9942089b0c796fae6c237f00625fb0a22e9af1c01614592464a22a5b919326a52eff3d7c00b4098d59967ddaa67da574a56b0e0218986524a4b1822e8bf158d34903146116d8509841076c38eddddb08647b6654b0e1a7466b11015732618382d7b6173a4c888dbbccd14faf00d8cb3c3a0f217d92d0ccc82f17c501eb7791f0c3a791f3cc233eb7d9087c7a1625ea54c9106bd2dd5f614729885024e5ff1a012a6ef9ced733aac153684b23d1dcce21520dc97106b3c166dbbbbe1228959770f45c87ea134fa287b23db8baa905238f17032d3dde66c67d6bb2211881e2e8c59b01f54762d08faaeb3b74460548c1b514da4f743a4d5481b9822c491286ce8a0c3962d4cf0f36791b92589dc32c40c33892d425b74e0867e055a284184b444121bb43a8b1a900749d404c114cde092c39c73ce2b341d084929a534a32933830b217964860d6c88dee74068d1b890dbef0b082b804092e96e1684524a092504646bd2cd81a4e3285a901f1be407ffc2ddeef677b71b6e4435891fbd1f22adcdb102285c826c32df48600dea1791963d22f54d44ea5eadbe2378d41ecb30ea4721c7c2a92e12520b3cb3a27e1387a8f7d160de2723bd2b98237b38bced994f8693b61ab4202c4f090bf14acfb01bf50c47a266610594e3f0c6c54820e51c508bf37e384f79949340ca37ef67f394b73d138d863e02b0a5f97210802d9487d3659a9fbadd4ec9278fe252cf78675d1ca2b4d638d44b431d87881e63a3c2a3e83046473a74e94524a4e7d8dd64c298dba2ad0c16f33717e558587d7029fae79f45fd5652469de93cbd18fa40bfaa328c2ae3510ba1adccd6a1aae599238b46cb94a62c96e7d81007d7f0002619f06ebe2d84f04a951e236c69da7215a08e793f9d9400e659cf347b43c8ab427d22c070a890c28e5d05199ba119bb5b639d42075ac0947124d65585a9358629ca88c10896ca20628cd6c4a20335280d44a4aae042a36c43b767ba7d841be64f87dccef4393dc3a1f244afd3a52784031fd0cb989d08c33718d6c1f08c0f5374ffe86ffeee583fc6ecc0077ab9fa9f908be8f9f4b7f3c48e75071fb962d6c666231a659b15c518323364ee41a33793621b158a49323be73226312c4297589c5146e8b1dcbf1a1a14d8e6a391bfaf2563fc5753dd945276ea7d98d3cca8faefebb8f0d16747a17fbcc144fd366905d6f151e8fc5a1205550243e9a76bad9d2dd97559da1c7369ddd604d6c87c0db3a6438fd533d0bf392464844509299d4ca69377c9e943faa6f74ac7999302df680e63c4a4c4628c724e27a61fed8efd9945ad624af1733ea91273780406314b7a10df4c293c337d1a316b722ca8df1c9a43f387e99c6b9318e529d7686bcc8bc39aca07755f4c907ce69b6b736b52b96df3894fe752cdf17074f0c83cd37ca3b4c7467dcb9cba77facd53dd4fca69cf44c845605b5587caa28e79f4181618e50c5de52a4f869443df56749cf6a8c7a731d4dbd60e15f3a47f7ba4c2f4b6134b1c147d14c197bac4a4a48e51aa9215499c642e05201f2e3a4e6f2aa8df1ed9601293580ce6c529b72d6a2fd34f34a0abbc88355ee5a8203d30df5cd350beb17ff89722c62802cb6fce1971e46f3867db723ff6e8531eaa5339aac985fee80e75fd867f40601ee5eb2ef48bb7035de51aa773c355de87f21b5eca672a3a876aa36ade8ea3a13af828f8d3ceff867f34854239e57aa0b0d5633818d703dbc738dbbc1f9bd747a57cf86ff804f2aa1b9c639c0a2f1ccad7551d0fca0302f398d7d40e74cc6f7428c7e9da018189c13c1f9b7373ce39274cc7c3ce79733b9b73ae719b083bd4e93cec37fc637ff1f6f5e9f4a55b1df61baace3f3553a99437d72385eafc51aef2e9afa15428ca36289408421585e23a76981d76ce511d8dd1e15ce59cab5c53752fde07f42fa8eeeb71c355dd77c3f3b19b23e5bb3950aed2fca5abaeeaf653dd324b55bd189d946f8ef20de5619b77ea3e208e751fcc32a5e0a6820d4a7737d35537abd9611af3a8d6a575ebf6511e6cb350eab76a1c4ed374ca2da600f4537a5b022e5cb468b9e28a2953a0405161f1c597be2f1630794a1bae8cec403bd4a40acbe9acb3c7b33ebfe9995c20cb799ffbf60ef7dbbcc8b3be0f6117a3037d73e8db0ff8a76c6ad1e3598f1fabb0db06e4633f65de0764fb9353c7e9930e3fa45eedb8cdfb36f6930aeb1bcab554ac5eddb66e761f109f5307647b76ca33d4e35957817d3d9eeeeb3e94c3ad8b9d4d744edb3c7a86ea806c1d8fe6a76da3bf798ae3bc75aea3b183fe387dea787a7e3eba07c4e7f903ea6920fd9cf631d1d3615f5f6757a24d51a5d1d123cfb42f26e56504959fd37b19e104f2320a07e519f6866c682bf34188d337d25b01097895b6eaac1bc6183d86defeceb4677b845391a8dd903992400b809300b460d78db48c623395e2ee6ed6cc047e678486ec3025a594187876d811024101e109664c1b8b53ca19b1ee1333330b76fb535aeb6ab5cc98195ab61bb91ba646b9cd28753e8c52e5c328353e8c527be3d2a87046a9fcf0895f9f5166a4ddd8ee94bb72eb9e3015e6868e2865948d6d5aefeeeeeec6651d6cb3bb3bc2aa68a8d0a1ffd03ea6b1313bdab7c34fc90032cd53d215252424e8332fbb09fca9e3ec6308b87bd961e09bd3f1294fb1e3635b7a0bb6a5b7605b7acb9678dab2269c1a42084f9a7642631d6e292456274206030486ca19b19326671ca2719133f622edc629e1102aa7f78da0a4952841ead5aad69dde1e4fd33739bd330e8561534eef9336b5cfbab7300540076d653e86dc5102203275795e9a734ecc0df0944f425ec77bda5de03bc6e8410a02cc4dd093e945684b6b180db8a0f44277fd116be14aec50c0492187870e1d0dbb22abd6131f1898b48ed704e9530498469999e132c6365162372808d94bb6b134f793b6c1ddb1be9ab6a5321d7bc339c6751b06e429cc538c528a514a378ed6ac0e9508d9d6ad9ad49ef1018661189665aea15c877abc39a46319e51a36d531a4593dc419ebc26ddd42cc211c629f1e1f0d351c3aea1bb844eb6a846f043e499f06f8ee5878adeb9d91be71da83e075e863de777781e7381d87cba84c85ec3f229f79fcf54bc828b6a1190a84d4465320681995d13316c10ced1413816d01b54ede4f4d1023106afd10010105d3dbbb1d73acbd186f72f288b4ab7572a00722025f2045124aad939fbc2751fa6c5dd3df9e7e355dcf0fc3e6a4d8571c5615864184a46da82f6df01635c5032cb5febe9a70c1d4a4063c54eef7d5e4a8891111486d68abd85287c45831c6183fd6a7432b82e346d96677777777b7fb84a451b6a1bd4420106488146ba8500d6e11c5a9391be615223cbb74df5ae8411714fc8046941ca48cb1640c09a3d4cf1fa29054978950b003ac48d9d2860a5c261012030a5356bfa8d091787ea6b436f9b0c51736e80088334ed0ea3090c0a1bb9bbe20a91b01941c81e46a4167f54d74b95a4c943cd33d0dd1496de4c43a7619814b23dd81127d31317243dd811011af1520fd573d7221b79da82fbf2f14f0f09ffb58c1d16be8f5f1f7c5840c160c71611e6481195d7469615e4c04b685438abaad05249921a9b52dcc3b729432c68ea74f8e9159465e8c7da02d9118205a4f6276244f8c0ef4e97ae8c5fc80de936a6ac23ce9fbd1fb814994e0a0a84564a3c20852eb09bbfbfcece86f5f4d47e33ad2a503fd5ce35590f91ef81fd85e7a9fcf03d97e42a008590dc802d886d041156933f32085183df801102e2e39a061e386088a31c6486536332c8b3176370c1c6ed472066aa5a466a9e663091638609283273518b18325519c8ad4954dc418230a445dc808b2d274448c565cfa88c56da93290186162ec668a54aa00be00e30545d460a305556cd0410fe4532206e8f0248729a21c9d40098c2a3d6c8143105d6cb0450d72b0044bed618c16dc50832c3cc021888a1863b442250908299608b1c40f5a518b0da2c7d50ab6be15b3b8ae927e68a992c49325429441462b7ef1d15d004b50c9c33653c48551bf5a5732090b005b2ac30831daa872021c96064b5440250f9c095054a1a2c90a2a6db0e1c5921c52d3638c3156017cec5254d44690133182a0a18b25357ca41f638cb18ccaec2b3e025612769e9c208b264aa8a00a1fb4a2d2c72dd9d2487730f30eed7a28a5acd2576c03f372065cda28030823485f44d1925cbc94524a295df22e0e37925869a66559b6b03765f43055f4d0a51add9b72f270775344cc82f1068d62bdbb1bb320f30cb4edfe7c626c19658cdc2ea8f1e1f3f6e030ebb1bb796477c75fff81a7b1eaeef689dfc415c3026c49872de9096d2de931edf0637452df9efa2622e86623c2ea28df343f39855107ce94d6ba5a19618d04000fc6bbe1bd781f5579d5fb683c94d7488dc494791f126ca49ee2b1ea436d26368227b0d74c1c83dd01bd3683099ef0e27a5e622116da1c049fde4eac4d4cc1b2a64f10bc665af9900894ae6a0d61b532dabc78b444ebca63580801040fc1b7154227030d21f8ca7f565e0c0b20f8ca579e0c2b07c1b7f51382afbccaad10021008dd9339271324824444908808120de9d2a54b972e5d90b627b6483da4f5d0a987568ecd0fa1ebd1d03efafad67cc67372b83e75a853084f1ae47c6429f8dac933d7bec6e1ac8b272199c34e08fc2c8bdd28e8f5f4c7f8e8870e3ddf1cebf06997793cb4876e56dbbd0c6ab4fba8c3d34f6c864b03fd73005013bf4b037fbed93315baa7bf7550dbb93dc743eca737c5e5fa03fc34426b551795473a09ffc9fd231bd81d416abec93ad082e1d077bde90515c9d19a2e74a305817c4d0e56089a2a2eea078fe4e0a3ffacd79ef1c10f30080206454ad0355734620443d0b064895650911c2de842375aeb4145b885b910038418d0fa792201e83f2bf8cf139c9e8912980ebd1ff76a66f68c1ba46842861645747183d6b616a8072a4b2449e2c495176c69d5b8cbd58247d886048844086d77c7579372787a192311f9c5474f7e138b8e791f98de371d48bb80e9a5f781a50289f7fd7cf4ee960a12fcf49a508dc87fd05b3a10a01f7e7e600141471f582a44f0717a1f582d2fbd2422261060e589e84961f2387e5f528a7c939f7522a9a6a6a61f5a591317085bb8a0861db85c2dd8d34d4ddfc425001d56c08392203e30ac966fe2428095275c4216107434c4b5542069ad7f2278f9ed2b064cbc0ffc2634ac9656b6decf3a910f2411228b19d670b95ad473057dbc1ebb76e658408015279a585075b105116dd4d0d4d45ac7e16626b48e11428c4a59a59c3ca50ebf629684dc945976747b8db7b3a6b767d3e96cef5508bb838d704c4ccc019bb19374732c93a1adaf4c94bb037e09cc92def435fd519516f5e452328bba741dbbc3370775e95a577986ced010be6f563c435dfa6a9542d81dd4fbf715650dd8f4fb8a42e571308bc6603198b7af18d4f0fb8ac10cbfea899fc9cdb1bedc941ecf1e2121bbe89b23fa2f71c5b777e47a8604d13083eb7bbe10fc808da69f1e03d04f2f06e934888619be07367d43be77a8f70df9f6e83ea6e3740f6c7ac8e3f5fc3c141ae61ae47a68beb974da71bebbc3c7e9bfcd355fce07751efad1df57942e2f391f1d3bd7513f75f0352dcb9ceba0f765ecdab6fd38bd6bdd8683bab9e6271d9a2db7c39eb9dc60a7207a8d8c46a224bd741c7cc32dc983e50cda2e2fc30d683b551bb3605c283ac6184f6c457330cc7960519c3ce616e09bd8c2f60a8603760467f018ff4a8ac73019ac8bf62565e93ffabda8a0f20d24c2000bd778201a3132b2695fd51c6d01e044dd881e3660512030e44f6b677a761a1e46de3728f45c962071e58c2476288118ad0541d5aa57fd58cf3a584643cf4ec3a3b20ddf00bdedf76524f4d15bb9b4555951792b80b62a1a54f60de583f6fb8201122130183222c60d58ca38d2da4d83de4c99dba9f2e93f611a9665de97f9c933ac2eb320f72316f993633efd996346bcb53cc3c2f1d0fba637840df0911bb753153977f83edd322f8368574551a1ea553ffa301052c2e8d971ac3a551415fa7e0cdab2a6ed06d401d897124457bc92284ac5448750464f077a7b4fbc92500205e9f7c5098c1e0860ec61d42864c0c90f4db7e559af87884371f2fb8272e40ff0fb4242e95b9b33667a3ee04f9f1e5c9998024d6554dbbff628f6c7f65aaa699493bddd210f0e3ba1adeaa84291f2ebebd0a35a4aa5446d67ef21f25103da7277ecd81d7b3b24da2b1244df0ed38dc67f25380f7be465d6c61bf47dbdc08917997d80db74e1bba220ba94f1d7ab3dac9cb5757167a0f730e6a0053d816e027bf5a2fa9682faf9c4df15a633909af71acc8f68427d769f3f4b6f639650ddb7404ed1d1b3a740bdeb55fadd8db0a6678ba8305bb7db65ed42f71468968ae9fa582c9a12a447169b50c45b352cf69a086553ad82d6d414113d7b094199535f19a8847645bc0589d80476ae8d4ad40d95b00d1326cc824ca093d75e503fa8843d9554bf1a244d34cc7938cc8a465a370e01a27e955b52bf652a42b2316d4a2449211798569080962526289552a9700ca6a54ea24195439b23074b24423da3833b499ee192429b245dcc4a5aa4a567cf4941090f91899138894d60a74a4c51a1d720d5442566b1d7c4259c236a4a98d2ad2e3ab16822d30c2e5c69e188a367b700dd7068d923081de63ca9df5e6961db6582a3d905613e2b8cfbc4bab588b7566c023b8c41fdea3b0a490daa954de0f582c8f789dfb07a9f4ffcac04ab0a441cae71d61144cf4e53c2dc66dced086bc2751c718445c32308eb6ad80436817d865159417a481cd0e9f41ca408a30b1c39599a60ae35d763195b0c426f023359abf9adb085fcc1158e0a23d178b5600c1db22847070f2a911d070e29b3bb553231ab4b0a881f2a0bc2d40cea278b92aa2cd291c434059cf43113ec2ba934ea57c3f4ec3525c8246ac4aaa80546cf364026506098a8ae60188989d80812b11154c2529e8f20938e8b986806f563a2e7222276c22c864f8a8a889c1071511b1509f30f4c98c8c90fea47e936a920ad742879761e39292c96e9b1db6716e621b942920a3d8af342c7cf35cc4a6185169a2687fab158d3a361b842ad51bffa304c720bd7ab0541cffe13e42dea4866c3ee863de59c73cee96d11baa8a81f4d45513f9a861654c45bf19b496fc4261cb109ec5a52fd5849ca89da37d1a1111321b1cdc74a58c918cfce4ca2919448859d3c1b3d339192cdc1117ad1281a454f2a39f550bf6af4ec156626c519d4ad3032dbaafa50bf45cab951bf4a030db67808b338fac41f66b1c3e033e427002ba55a9f4c797618187c60108e67df18638c314a28e184134e082374c9d2fba0eb8759437ca0d40f2a2969e11b67a71b354283ad95493551e1100f7d50e808dd70401e506c547676fd0787bc5f49a4fc3a5b81a343c7131e9e9dc74e89be322c19d826b0a3aa54766e2d3a287d12f4ecdb0a070dcc93f622de92f11444f462dab7b5714c3b76838f257950d99738597a76af4e7e7836628de7163719ffc9b467516a71d097d8a608e97df86388df039bdec52c2d278b96d6e0c65c987e3f478b2e6cb33388e28adfcfc9a2856dda7b0662ba6cad250ed6c719a7cc50d841470db31a43f2c3365ff588f930d6b1bc65e6ec7a523f7db5dabc97d4d8421a6314d8867a7bce0a19cd4e5e4c4665c7ca82a8fbb125c336b1318c7760535353d357f7619f3fbbc6ed1f909a9f1e338fe0a5898d9362f41eae547b77d460139bd8cb17f5f3c7b04a23837985594d39d5f081032a2cb9c22c960ab38a31c62cde4594527a1370ce1e2f58d46ff57385c365586c237dcec520c4e04ca2588c27c7783067ff302f46078b1e0cb328a594524a29cdb21a25b428a5d71bd4cf5d86153b1c48754ef9c5164cde005dac2c6591f270b5f0a28e10970b16b4baba808ccc92f14afdea4b293bcaa0bd5851bfd41603d07eecc31ffcf0258b0a7d13d01bbda2b24399a680b632cbbd64a9317a94892a6471f232bf2f2c4753623a9f8cccda972a2a92166b542318a3d949731b5f969481eec2d6ad706840eb60366c57839d84b6329f4402a930513948f476168d37bb4ae09b9337b71337f827efc3d1dc4a8b351aa34d527e4a79ec7a88b81eeb242abd91fc4f1e9d4f5eccc9a5b73177f228758eeb388f5d2761596a2eae23434c8aa4205da13406dbb00c621bee829e6c5ec45b4f62e476a647eff35e730a9f71f0c3f796713b3dc5fb60bc4662d6675c9552bf3e624e8783fcd83f39aae3e7b41dde91e1b5cd7bf322b733bd9ee27d42e07f90761007479e1de31e001ba98acdd18d24172e941215fb0a66c910bd17283ac906896df691d0245e827809e285e9b5059417265e98883ea4008508ca10528e1841e4c3f6cbd0b2e6943d30b833a317d9891d7c384a1fce52b3038fc8232e8f57094d59f290a86655695c464ba2464182e8618d3da12c56c41c3616a374ea75e84f5696bc942ec3f23e2035ee2ea3050eff794d0ab495d96ee6c7e3776f686bfd8505172c8ebc1c8931768c5e833e3acccb8a093ebee0305f5998f1a7df57164b49af2b5dae1c791941dd5716575e5908bdb2487a5de1a1ca1afc92c38b119fee7e318205dbd699b933aa30fdd8871042086143f6cdc155945e55b4782aa83c57c1e2d779febeaa24fd0aa631c60beb3c82d7e1bfed049a2a8a7d5181e5c515b39e03807e5d0627ebdb7a3282162309ff4920f9c52fdb2f5e6adb51975dec64bb80a9453dd7528124fa9791f01a5cae02243c5bd1a9a2a0d17ae0331443bfb974ee628039fb99c7033d0be243bf679b5e73e67c6c7ecad9d73c10acbc3d7ddda2117d8342e837cf5cd36496ed449dcc37cd61a779d66ddedc0e75083ff632d7ba8f1ffa38d0845c06dce807f8e8f3f544d24fc75668e1688d3662a4e6a77419960b2f3c71441ec941cb182fa7b376977ae76c758593c2cb09a397122688cfc6a900c363ceeb3e53866d7a605310769fb98381c79c62ce8b79bb34ebf9c8e6697e1073eea887751f3bd04f9e0ff3f56fea605ecc0e3be6eccbdcb56b90dbd957385e4757fcece4cef01ff57d2961543598e9d43f199a9e6778eadab28b7a5887d3738687dc948bc6e326e59cafc3acd69dfa02fd0948d3b418ea99734d70f9e85c1a411f9d07a9694030ebf9e9d75c8bd9c15c460c85ed60288cba969d661773f27c4cf9e82787f291477ae66d59733e4ea7d3c9e391fe458f0148059ee9d1bfe99b97394e673fbff9ecbed85c643701b01594f222b085d35bd7b1a777328f87f3e81ce73d39d7bc18cd31ce8bd1bc1deab33b39c64329b64331bade375ddb3c269b5d4ce6f9907bc4e4a36b3c27d7a66f9bc69c0f4d47d3bc3df35621fa740d3e7c88aad171e2ad8726a4f4186a18756162e80c8e1a77d297797631d2e163be53159d846fc77c3be9bc73e74e0cfa4eb8581e76ec586746853e436f326ed2650f550f2a744d723e16cbc4582858f31cbdca2c1220d0847d036d556cd4a86aa3f211bfaf170a9e83f87d41d1e559bf2f2888747c6a60da0f042578fd3a54b551fb89dfd7145e3c9cf2fb9222c9d3fcbe905e90fb71aa81d2f7b8f04c49be8708ea3f1f2fb65805f19f0f51109a17fff9e4e085fc2f862c9238400c92fe8bc128e997ba5cdc36fd3af7a0f5c097d2cac307bc6cb0e41076313bd2ca479756fe8b01e8a3cb9e6d6a6a924b0fab1c7df7dd6bbc7137c2cb4e5a79c8fd100200e8f9f0b377c7c31e5d934d1fa303bdfd07f4f67cb4a742cbfbf04bef631702bf1de8bbefae7bf6d1be0d260fbd6f874dc4a9da52f7b5040f4f7f609e39edbecc794e4e5dfae6ed1aaa8b41a162744e3fbd9ed40b61ae8b4139fc1475d6892ed76b1ebf5f73ee9899fb8172ae4bf9d6a17c76bd715bb73e78b96dddfee0b98e5fc3e244f5c0a64f391bcfad841c51313b0b45ff072465b1fcecb89b9eea38b93cecb409eacbfd804e29655f1f103ab30e3b750dd569dd9661c66bbda1bae5a239aa8b017b21fc1c08025f7339c36bae4d4e6546d57c39550faae63e168b6c082343380780d27c8a8b86477535af6527678df3dd1c19e7dbf4fe936fa72d3bb9d605d9386efa76f2ec4473f2325fa7ddc2a992deb7b7621673109301c76d1bc7711cc7ad0cc786a69d4e9aa6699a764696519a650e3b55962ccb32a7bb23ab9007da3233c6cc9159d8e6c01c76aa2caa2c357ab63b7ab0633b96b45555a91fc552b37b7677cf6d73604ea90a4bdd97942e2f1d9b8e3111da8f7d196dbb2df22b66ddf0bb3952dbe64839772a2c15e59c6faeb90a4b3d79a6c292f26d77b0a79cdb1dfb29e754175a4a07730cebcc9da977e6d467379d9910f8edededf9538f873a96c1ac697753c7e99e1fa79c3165ca0ed9b78b69878ef3bb341fe610c37a603488cf06830b4f9dee4e71b9a8d3eef382f42c93cbf53e2f7ff26e9fe55480e1b3203d0d78de1ced3e93667307039ff9083d0d78b839a8b74bd38ec3d2fb0372c80e7da38751d1a46bb2a7ca31d7e00fb6bbeb58cfcfc39e7ee8a9a514767b8cd19e7eea09a90f24ba66f88fbd075b6386a61742bf8c277ad7ed63f67a8208c13e06a0875e8f9dceb307aef1311e752784277fd3bdafe7e723c47e9e3a77cccc3d3f0e6300fa756ef8ededf5fcbc0998a58136349516955910ee4b0a1408a167a06ab1dbee80bfed8e20f0886b6efbd4ee08025ddfd300577505a338a8240e1655392a15cd88000000005314002020140a878402a158341e52855dfb14800b8b9e44745698c9b32489611442c618430801040000008088cc8cc64100e84a32aaa98103b553366244dfb51e7ef1e67970766edebd30313ed43fa9fe8b7e96998759ea9a1e1db82bfcce61e5e2f3ace0e05753781e71a774045d99db22068412b4d29664c394c0b2b5e7517e6518d747f3754dc2a584585e9504056abeb17a5df4da963e364691bdfaeab9198d3b3e0c1c0d3b93b5adb5d1b3205b73a3cdd9cec23e62f940ae9676ab424b2007e4b172428cca0a1937516ba765fab19fe9592d29f4cadf8d92d3b537ab6a7d5af520e9e00b6f2a2c55eb9f997ed72573008295eb7ef22a41472e39421883223f6ba4ac792438706c494433e46882b6ef28e128d483246639f88921febab60ce586f97d7b2e8bf880937511bca7de728ef913928f4a958319395600dddb9e0cc92b0b43785671a0d550ffbdc6cfcdce48dbf4c0550c227f2914ea6d74fb29fe3f0890e43b67bafc0a416e8d71ae27b6a6faa2ca77e4f9b1efd60842daa0e51c3bb10a159ddd24e8221d3041473d7d6f3aa604b771d5e9c6bc35b6e56113da961989c2ccfcd98d3ac3091896b10f1d7b05575cef3728520511ea01f4662a266ee47457251b3b434aa426396315f22046cc17645081e3afc761d088a9be63109f9008cb9168923d536797e71882310d942149f0b9a6f421645effd689dc968086652f4160a984207d4de502dc81abdd3042edaa2c1b2902f1e45717c950e445e3d006834fb8933e597b0a6d75697308f104a9e1a2658900943cf16f5897476dbb6fcd5c630e413e6181fb0996559f6a7bc6d402c81d2c623862d8e85d45a470f155b6acacee4dd0925aa0dd2d3db9a0be34cd12a73826bf2e1bbd8ad166a4fe5bdbc00cd33089db341a6cda6c939946525186064e94497473be053353b8dc4294a19e417a765191bcc689ba2be9d7f95f8b7292e5fd7fe5023348e988a49998389c33a98a184408b6a3c98409a45496f62f8c0bdb5072e177ef84d896c97dc44784e852b38ec4578cca56b3a2c7527b269dbcdc1883120858ae2254d6a3abad43ee3bf707502da508ac18db6e9b00f1b4e63c10a6912c41123d4f67b586ef4d5cda1807a0117c5c7feca5c3de4bcc93569d1386908bb34d96b855003ae82000943f708ea7c177ba371df99787c28af8760b0cc9f06e15a49ed9471fb965e4e3298c0bb2b43a75e1d1d280f96314bbd31b1c2c6b90a47372aba592d01f65795768a02f6b45bd2feced2d24bc10c38b8e02a1cb2c6010d5aa2149c31a3bd2f4f9843cc0a15580d2d7669638fd059a2d051c6347a146200865f69a0ba0c0035128216380cd8447868b31e0874cd2189343fd53eb8d32b2d008f01ba632693c7f04d912343f884771d12ba76b0556ddb77ac2a2868d9fa4d5fb03788625a1ba18c7a078684635dee4163f2bd737d5dda06990c6017b48edb139481b738f7cec05322a39681c8a6316c9407517e42cd8650227a96fa286c9ff7421708ff9c2974fefda63121ad12052bb1db4e0be07b76907c6846ccb2c729b984c68e6c4e1a53d0a77a66252c923710c571d80941ae39f57c7367846385b7b878122b280ddf7939899b38ee848fd4d9154206ca6b684a593736a512c5aee8ccbf7a44e7212a82b1071dcf2c6ddfff100b572ea6bc21b241b31c49b2742b582badde494a8b09495c5fff73ef2308ea8a15224167f060d84a07dcf4e8f67c73a61c4d83395665d4df8c4ee7f6f71a6a267c9537a2625850de4ff5e827c6a525f7609d04a053dd60c3211165b13e9f7193beae530a0f0ea6f3a5c8550072ac7a822406740bc95db8b9548c2cfdbff6718d6b67913ecb364217363653e3e89d33dd450152b601f3c6d74e8a29f2bc88f6f786e7da9c6aa9b5ffc0f84d6957fd814bb1008cb2504c2c7b5696a43e1877d4b0097c9811b7c1b0bfe968808ac401105ba40ddd6cd183de2dcae957a62887cf71b391a4506c82a47b8ecc0a76b92d413697f6dfaf1cfb1ee4044442a202d58ec0b2f8b257d9cec387dec74c4791c405832f009346b6edd7a74a2b66eb3cda418f90b1fd55925213691922316fe489253262cf0093122dcf5fb916a68c8cfbdaec98a5dfe74ab9a2277b4e38cb55ad255c2894554aa8e2ecdafb67cb93b6f206862fa03fa4f6d9c9ccdf3ed999377d750a863b022532807c7b65afc82065efbee77e037a13fecb1170dfe989a1151a9d38292ec03d67656ccee3686785a920826930c98d4e642f4cadea3371fdd1b538213f89fbdbcc94d56dddf615d6cef72b651697a50bac3c52b9e2af585c776c849f54a77106bd244b8039bc42f2a49eb0faf7b4199637c4209005e86040010134217616e2e29a6dd5cbda4545cb0284df183656028552e9450f7502a80fc421eb870a1e96a2ec1fe9d449b369a2358a56069042e7736d5c9da03151d18125a33602bfe148fef1f5d593deb9e81655f2229431844b07b358889ad7b14e63d63e1c846767a3e529cdf264830a0bb623a993196fe3098053a2bee5d59c13646080bebac285ac8b0e329ea3613beeba6d7152be31a8ec8404fd4cd64cbb4437c496e7afc6a95f5e963295dadf1bf510e65a8e59e8a7a00b748613a93a71210a7d4c3066925f86945e20b74e5191f5f281b531c7a1504526a7446fe501fa1efd17aab89c02d6fc62152b7a84eba91f61b8ee9447e20fa06382c6f41d08b8df9776c2283a13348171f01283db2cbf1856779dc118ac34b3d190c735010aded84e96475ac4c420e0d6571ab0abec9ce733c37f48d9e1e95e25521043dc00aa18d838c23234645b18f2c28740bc92016ca47476be466a62a4328d70baa00866469ffbb60761108724944e4859091479d938088c8f8ab8dcbe9d4aa7797553be93a367c51c1f6ddf8ca2a6c9a8cfb98f1e813329b7b405c95b1aa45d2ba1e9b4e97c041582c48c73b16eadce47d422758a830095082ae124b410866d4fa9f66ccc747dbfc3e78682afb561c59845faf18c9cdf2f7d94961557a26e8afbb5b5eaef7681943d2483afa19cc60ddb74992c9076612dd3ad686a8f68ef1619df56f8adcde239ff9df512c993df6ae86ac3cdabdeb07cfeb5c23d773d198255ff24a219883cdb7b422d6fc94e866d61bbf3f5fe2ea1fb38e71ac8b058266b42f998c6dca58a8a74ccdcfc84030cca99e961a6b9d72d0ec30746c9ed96acde0cd121a318892e33cb914475b533b045578808a53b3c4d0f5590d8f324d08a6184a8b5601cce30515e66a6690fd7d6d3c3c5de4a10d35fd1e3ca4d0809426c120e65468315b31a29dc148e56535049e5b29862d8b0cff1fe6f16f459ac145e684bef3c1210b2c786f7592e0a5a753b8294a8d2748683973131f527a63514f205cf3e254c169d76f7351e1b6b8c03238317c817c6935296bee7dce0881d8a86a0cd478c5554dab5d83c1bc78c56ede16b2b737f4b99195193e8e5717f85cb54327423c811db07da6d84304d65442f323136f1a8e1d2d448c369c6d9a3fd0c40d655e9c15699e1728bb96d48378dc112749627744a18a0992f9bcabf14ad6891adbe148f201e97fb7ba1fc3e25218ae64632d71e2307de24c66638216afe765b8a3118e9391884241500a565544b2b8d8454c60244c825ecf052bca8b85b4541ec6e27b2382a3c1b15989f7e10d0dab9ccd881085099ee6f1f548f8f3c87de6a8e7496d88666195fb920692679add3760d9cad5c64817bb1e5d61e9a953e750d8336b5d3980357bf8e4f02f257568111528402515fc0dcb46cacf9f26509d3de374b97a28e1e6db1c6c69664ecf7572c68e95ea292d0824be983c48c7971ce4be7414f5a3a589df8f2f19eccb2a8e2bbd4e52a1f1d43905ef0280a060ee56e8037c3417d375a08c1a6491203ce78e0e1172a003167cc97de4ce5f13069a7f70b33be724dc6c4c10c70e08c26d2050e8e6a696f6d28714b47e921bc0df085cd807f233274e9913b7f221d7f3150b934d37597024832a1bb160b2fd6e1f3e26220e3986aa0596f1cb9d849e27d954d999e8631d61fed118620256191378c9d58e538ab6331ffac70c27d2df1f0d2cb5e9f3bc36a5b04479052ccd7f71bf159959efc3bc805edf14ac8a3545d86cc5ce5443e8cf3d68203fce9885ccc1cef0043d771d9be3233b14332bc88198d0c43d3678eee2aa5b1ffb0ca02087d2d3b8fdd831e6265b19dac1ebe28f540ffb22309ed91187b8abb95613aee45e30aa91bea11ea6174ac0e4c307dc020f5fa14e110eec0b1e915f2e10714e172451cf3d24887db21fcb3af9669099f23bb9cb2ea589fc391006ef0c0cb6f5648230f3728144da018d02c7de52da8c0b7872c7629a1427cd4f25cbd33377bc6f3bc6caafe91072e2d584293390cbc15685aa5e8476414589dbead67dfd34807ff43d7ca2d71a9cf3eba3188672bf1e31abf5490ec231dfae22c3749d0f023620f490c90d33a0818f2f96253797ee62c2e33c0efc9c8862030c608b4ad9f3934a792b150b4f79caa09257f88613fb9b85eb78149a33e016316975fd6dba1f3254df7853568bbad1c016ac599db8ed7648ed7558bdbcccec1d7171deaba578c201a5c28e10dcbe09c8bea096c63bffee0d7c491c9ee0e3aa32144632ceae91e7cc099bacb5813f11df6ab97032afea1b9ec030d04c60e4c69155c781e1c957c68d510740ec9131f1fc4346ef8ac4bef0799bfec202e5b3abed3b0bf96557334268e658a0e06a69864d6143a378477217a80a3d54b0d0dc952c773563670ad87d41bed7cc74cbec9d6a015693818433844eb0f900d4abe7b0ce38573c3a3eee5270ada3365600aa2515de6b8123efb3c49fdd0f91af6bcd87a40f4b03002d59e937d93fe0bb84cc1faadb137ade0adb1832046a29b57f4ecf50c3308e2520786d3e45c987dd3f961077051dc23e0cf179bd1ad604a811c30fc01ebc6f1a77f0e05423971c1fccf82fe74eb7c6359a3c14e046cb87ab394b354bca8db2de64d382ea0acd64078633d98e3a0d78358100626711a554750423f42c63f0f2c8192ee1d4522f8428eb95ec4b2456f3ec7c501747cfa4fd8ecc61266763ba3854721475f47e9817cc19a9fdafa4fe7298a03d484b25ac17f0b558bada259f23d8e2ca8bf34057bf5d7d332a8dd33059475950ea0b7e0760e8ff4febd9dee487ea8cbb0171c26fe1c3b37668984bba9a890508feb2828cabe370c2bc6d0c5bbe4578c62fade498118cac7a91c8367bf7cdc65fd714267e19c6c62d3e10062c8c254f8cf42bb729519e943fc894e3d499ff7a373f134dd4f88f314d10a1cb3d371aca34ec894ee984b1d7705f7a61b57b480b7ca0bb4bda2bc8035b62fccd755fcb9eafbcaafef262ce4b504ae7c43c119ee1e24f4c1b84c2a0853624134d503f4b4cefd4f0a0e716401aab50f4c9e05381c848718b1fcccc516ee684216cbfc293653d9eb17ce053e633f55e81f94d79ec4f6608607cdfd6f46d2a3b28a7325f2e4255a5cdf11c77eddc6e94abc9988aa45e89fae0de9325f013398e6eb74fd60207ae14ac96d2264b40f2269100e52a13f87cf91ebd19ca0fb5dbf7123f09b004292dbf182a563e2bf6d9eb11087008f787db8fd35cb9b60d63cc98d5c31982a7e4b4c1cded99eba0fde05a05094ba99320f3e9ffb7a03950882dd82820f7438bbbb079bdb1d149e0bc284f8374df8f56fed35c02cfeccde9925447cf1c5a88744f708531e4a90a72bce7f1c0f7c06e4eeece09008b7049a4daab46e25f50aa84fe007aafa75019ef2e4a289ac5a42ff6120ce96dc365c2987ae85447a2118da7ce7dcaa2e00f6e244c7b0ab7b12f17649d674dc4244b45ef930e0381dde337d2932e02a21a90dfe03a890be684bdd50dd8f435f48320c0b990a5861364b3ff218e16443bfb523fb6120d3278dc4ad9175815103efcf4839b0b323972b0b7f82a2a0304d3a7ffad6c37f04aaa7241c112fd0fa9da03e95b050aa266ba9512854dc015c0cc53f876ba7dbd005ad5ab04350c20ce57a673516ec8107ee3d86ec1fe58d812f933007e6d37a52cc0ad225ecb0d88d3cc1bdef4e16b5a70dffc9da5626b9aee728ec35f6dc5c3d684ae5a685207757e23f11f9a643847fd6cc9851293bfb5b0ea4d2472caf7e1ba65fdd301f67faa9487f99cfc18ec00e5a6ca6bcd7a6749166c5d086f848c32572644338ee0b2f8aec371b7c2ee2f538f04364c02e5b8e16b35e4b9bc77a8dbd68a0c02b35822c41734cf6c8c93c53dac2aad54b760c7bf63c6a83f5a7fd4b6ba04cb1567b88571d19ba4de08615286cd4402685f06234248bc8ad0d48001b3a7e19af70a6c5e3cd33b1b97d1062c1e1299a0033253959f2dea34aabec1eeb10c706afc05913e79ccbdf62d5215f5bd564ec010d97cf989c24993e2a97ddc66a3a50158c88d58f76c1359050244e91b7d08ba77487a40ea2fcc5e0f0cfcb29543bb95924352a059ad5b02a407d4be8b204d1273798d057b09f753df10951e2199678d2d659e36dc733c6084dcf8158bf1e71fc2b18fe86138021ada15a0a65ad37e2c57570b9f08a80b1bcbe58e373553bee94fff44a8af9f7ad860e2a825c847f7530fb7b2e7ec2bdf642b0596263ff0e52da967070759583ace26e6e5a7c36a182ee356fe7e25f0ba2ca90731224f3f5762118cad2fad8a56f8a459fd3a71dffb419082a188ef0821594294025493fc44c9088d77f8be9e0e931f69ddea1e87a5e3c2435e4304e754338f37ba87fb6af4bc4c346f5c5ce26e798fcf3c1b023e8e52be11c8aaa18e74d1b79aa215feb33559251fadcb910559fd10875f7151f8875dea4ed6a3fd723b07f0e9abea6411e61482f8317000b0ae5fbb78e2fc8cff9c0dd56c00ec3b087d70537cd6d502ec003531bdb17c7f28e5b71584edc2be6183bc3aa08d936999412aa2f755114d2e7fc6a698c6e59e9f150bedf24bdc4126f80078491cda1727e399331cf5a2412fdb5fd970e8ccc3a2c309c959f1115613cfd0d0a5aff00ffff33d5d18e720e98a68b597602d24b2feb4a71c78869795a524a3f65def70b6c2708fa571a0220c2177ac564564543267f37af202e7a10a98283686e44e05264a12648f937afb3e60794c8dcec37e299d6008af65465aac504ee68ada743b91da955c6c00a42b03e88ceeafd548a754d95b5977f0d47c1bc14cca4940936594767b75325eb285b48e8b2062d028ea2f1ceb70595a6896264f9c29a6bd758534ee631e6fbd658e4f3f2aaa0b7a99dc546cfbca58e952d1a46f1385d8807ea04a4ef8690aaec5a2e2dc3b42395f193106c0b03c7760e352a9ba85cd0ff902f963859d41814b44718e70d52c15233c492cda5f19ca8eab51f309625d31c07c27479692f05b46f897bfa5bc2275e3ca464ee2b704f979e97066c08f495ca7205f7d7245f0594098c67fec512d20a2e12f08ea4e5766871e8bb9015399fdc7292ea4910daf9aa5b7fed99441bcdee9365c52cd395a0801a8cefae81c67603cb7dbf25b08723d2309c6f1ff50803f169208324d4c2dc9fab1df4481df9882d979368e71a02e7d591322bc905b7288b2b1fca2e70b42cc1351fcbe131b7c6e566759af42309c74051cbd2097d3cb9de5a25ad580114791a01ae480e7c75365fde43b7ffb5a7d230a0fe6f30b966bc327bee9a0d7a55c94ee7e54d6c5928385ee9787f910ddfbc1cf08e8ad54b6dac3a58408ed923b542a338015b46f4e54808a82ea127ccc1a883a8d209d8ddc544d19d366277ae249d20eac6499fffa589168e6edf7e2310f482676ef9d5e41e4702a25b7c0086f60b5e627bd5a9149f57ddc9f475254ad408f67db0cbe8634fd080a57fc23ef055bba50db972792546e638b971a04246a3315c3774e2d8880b0e5a3e32a66786f64b567ee2e7fd3b1d008c5b89844460c468153b8fc56ab53048191a6aab8e30c162b28123274d2ed89e9a853a9164403e6265330db701a3a6e92f0060babee7aee8a4ec0683ccdeb0bdba9c4749a042d435de84ef4d71d3194c647c64c72cc9fef2949165c087721fc5367e89f07fefe38deec6b7194c3abacf793619b344ee92238c4a1bafebd188fb3acdc9df1d9642f24791fc10cbbb7246ff4fd28c46b586a1203e07ae9ad747967ec455baa0fd4e2dcd561ea76a1128f3ff575380a9aa1e6f757feb58b8e0fcd387d00f0b3c3b56beb1473f6737414c27c2cf6b8fb326119a5db381d0b730ec570bf2a514fd2fa3588236391166452236da5fa54a244773ef56a040ecb32431831b29e8327fb274126c72a97e9616f216305a507e26557f42fe1b8457961495b8100f45d40775779015ead4bc36512eef7b42e81528405378f30906bdd85a6c311569e6f32a96f6384c9ef297f1881cec15fe27f66d348bec919a0302944fd78af6295fe58f12129bae11891230a4afe01e7d5b75be621a2a00915394877b65b8f8934b2f49b8d7d05c1f4a693f8a53a1e8f6cfea45c81c796dd1ad6acfc4a8179a8505a31dafbdd8d4d9690f4494610af3e69bb3ef765cb9542cd290ae0229d0bdce7f703dc546c2661a3c9218d7040c6a159b6523eefb0a80b8fc16075b4325f84bfd8ce41219c5602849c700b722a865d3ee4b87f2d784ba43819d856dd1b3e41309ab0adb574453ec8fbfc7afe471b75b1324f600c1f54929fe4248d3ff25eb7894aa8542f09fdbf6d56a46bfa905bac5c3102f6a7575a31dd98d9f027a1c12f02e26ce76a6e0ae9341d4572231e3444e5b84e74b95b43af4657ffbdb6da43134980b309044220257c18f61b13497f5c107a07b56f275c46d618226259bb5d50d03154b44cea8d14f8979b0d33e512d4390d4414169bfdcdc75751006e6bec5ff3dd7818b3e47c8593117df83cbb73d9deb970280f4bd19940a417550cb631d17e3b8298a401165e64dfdc418300b8861e4c504712ef6ef24fa7ebb3b3513771f226eb4bf82bd371addf1be8e8094f94e1e93532242c9badca9b9b497cdba93a0581a3268a22318fc912731e765a64171de6b2be6acba8f9b0dc431089f6e18f9f0421098ba64febd2400a40add11728dcf003f3a7cc0013b942cb58ba10521294324762d2659b8247a33d680c261db398ba2fb8caa3828c2c59eedff94a7059679ff8ae28906cce642c5754c028bea041166f202d36090d59c42a16be6ba72439434a78c8384c4a5fa94da144843baefe4f9993830d737084a373463c4513285c92cde0039ce26389443a77fdb59755893bd6266bf2e0b928c0f697703bd1f47a2969469725612169313fdc081025418720201eb72a5ed4291bd9586ced4f950844b8087646019f6774c5d97862069e65243cf37f5476550fbd6cd263fdebc4e268d9b0673a42c5d97f96ac910e19871c44d725049e465bdb78b0092aa4a010c4bd99a1731f00f0108c4c5168c4a7913809828bda95c5c62956a368782e4166fe75a0cfbf18ae63268cb1f9012ef3f62b345af47a064df6545f917202b597b1b53f5c9a7ef8b330dc6fe6aadc8c4937566ea6b7fc7aaa86b106bc175f7ece8764fc0032193943f8ad9c840b0c9419526a80261688c1dd7a1b93f39b7b250f9c3810c27a964c9cd081e3bed16089359bec1a5583c5f2f61c9b026cd599ed8021cd2730320da8e97db4a75f61641bd3fce7bfad13fdc0a1e7175a6761397660440a6dfda4dee21fdd67593585f6e86918a9dd555ddc98069b6758549eae24311493375931892d07e8ab05f429cbd7b2c5ea4051af20b32fcd6642805b5cc9b318431b9d447c7af32b2c131f442a3b69affe3d3a651a7449af8ede6b0e60616d7eb2c31913d9cee7f22192149360ac77c0bbc8c6abb0ee96ef8cbaaac06befd9c57daf5061ee04111a78ab1d36d525046a3805100e51ab1429528a6b95ade04929b4219cd1d5d51e5d5c6a6e025444730c55c6664ca24ea08139eb667942b506c4e6cdb6003c2bd9779443a69bf1d6a5dde0b3e16cf6d8594859ec1930ee1aea5df535f38d4c6fca0029008e5212bb2d5f0e893c3a6511cd91172b2ea1faa07858e96a0f3bcb167e7fc3bc7b2f4b89944b2818c674a3e8eac176039cea1d0239ea4af7b9578844149df8c66898539e46bb12d98aefce63c39301e31a3ccc985e346d4baaa5d06553801266156bf45f2c5bbc970286a0c7df453611a359eaeac1926abd1f8c416ec08c63a4402b06dd5150ef5006d3634c912b7841ea92e0d6eeea03a0f4da5cc7c2a504ab8bb43ad942b7f6d147dba47165418a2353859073d6a2de9ca997f34edfae92358b644abe1d3775a0cdf47495c64aa113be9f6872ebc9211da3170282123441228a17519e6cd878a6f082dc0216fe42183287d6291e1f95ca6ec34a694f5693d5ab2d8b5549c6106c153f5736407ff5c64c39eb6f74ec5558f67b692b75893ccd6c5d25376d55e34095a7e166a75428f85338668acaf6fd73d85850d3a696e832f6da94436470efee2c3cb7ac14b97dc0abca12eb6e2182a889120ebcb03e1a24645125af601a4f7f50621a2a5fae08b02c4a008f1f82a4d8ec95fc23afc0e0b16c2f789094f0bd34ff960c0c722007dcfcc3ec7204e47ab2a689d620e3a06801ec993a8e5a8ab80d66e9abaf50dbc119d760915310ff7261c6112b3723e02d4b8e19fef229f03543ef057841f13cc46e50dc4ccf0bfdeb6bc9066593e59da9b0e532d7381d32946df200945c96686ad113cb92a4c5a3ba0e2a67792599e2e9e54e83e4d57210a8508dbdd007f874b2a4064310b5d38b3e625c93fdf20b56f7d6b514338439f6a59396f499af4c0384b41a19858812b9cdae03b744afc485b33d690998d14e6767a299c8619be31ee8139413d716a17887c5b5a217888b201aa4fdb9148eaed5f1f9949c2fb45185eca89e54efaff1035f038134390ed5e7a1f50ad2aa4beb21f8882b25f8be735c29fe73c3196e223ea684138c86b724f685827c3f3dd1b6e836a7481bee9b8038ce3d80099042f8a2254743678d2cb1d604728c372dd8beb5e44a4282b98cf44475d83dd04a9652036ac0da6656c8ab069eb74f9c9ba24ffd4773df6efd00bee7a29307700f0a4e8e257c75b095a5d823e3a33cad64c64fdf2fc6b4988cd6746f5c7d31b24ffdca4aa1d303e33a24236c345d50cda72aee7764fbf0ef8582f662e3e301c64269051b7388f8c5332637062a2bce4e06a1bb3bc911458bbb30961c279b4710264d7cdbc8a5deecc58f0311d6d67a3c7857253ebf245eacb75223ed3bd90bfef05bcb15f468afec1181476093f084b9f1cf057bdbd704bf5904807a89df121de9b14f6d568dfb822caff3df1b041f92f58c78b9c10242181a1c72eba9a2f3900c36ff8c078af84b81fcc331cc1238b4ed6253c6fc0b591ddb3d5f70b0ce02450521d1ddb0a5695a8bd33074a19e5b7585a16622fd600016514e12c200705d720149d30eb73f06a0fa9cfbf9433bfcc784bda04574a3e1af65006ccf82236141f70841e7df2d56a7ffc3bf410e986c5ca01bd31dce9cd823d6bbb5e12001b7938c7b9d6debd2bc4d11a1949e68c13e1ae37a71680529f13f642eeec084b0b4149b58a661aba9b9843a97715fd17575ad744f522b6bacb2d726437f0e2785fd8b2db11e7f2ed3383e61a0f2de68c6c56eea5d66151f14f8481972ce2c0b4f65550e49160251726075516d8916ac51016d1995009db07b00243f35daccbfc9a37dc38b4cc0bb970f5fadb10a09d4ef1200fabb60eb5bed97ef1c8a3b994941e36bdbc8e51799385935fa804efb7c35474ec7292f76268fc314f7e997e63c612ad9575d16fd02050228fd2598ee48c4cc46bcf85d867da29f84b9fde48b4e71329addf9292e76ea87a6cef0ef4cf9fa31cbfb80f06b838caaa84e959fa215b8261d71b5ee516b34fd38cc183d1af50501d66397afd1c353895ae89f92b64886d539658616e5f2516f00a3352dadc23244c3b36f5eb4197a98c2a5d4ff9b1adfc89b3f1cd7c64ae2747f81b3c5efc19d275af7b04da3d9176254d16fdfde1643349b91062134b56fff24b88fd9d21a1837edb9380d767f02481414e4245ae317f96cd5ffd08fbdd5bebc3442eada0057c6e6c5389fd20cf1fd11a029737e7778f18fe82671831eaed2fb65791ce69215dcbd788c72bb5cb78d9b8cc2530eba8bd7e2f49da57c000de463e61a0368a8cbe87f5718e23b0bb010d89884e400cef8232b751c2b90d4532d77a1c744fba931393ff73d04eca99cb6b217a8bdc3c7bd5a9733ae2762ef9237ddf8caba16a22ed23c9f207b8158511865a9b38b6b7400f1b87cd05fc7066c120a0c9ef247a10e107fe70ff830ff6539a8c007f7a4d4fc5c31e12395f3583db79cac676f2674791efb38559ae5233b1cf3cfe99ddd78306de9b312a02087636fd079543120c342429099eb1f734318f04bbbd449dcfbb2501021e95375f9214c33d59ba9f62b4a545b9d2d2392872a4c17d3322e27d8054c743cbb1e835742e1fd6f5536ce1304a184e449032e1419717d60764fb921572e62391c94530d722e5d9c4e763677b91cac152455b7b9ff24356befaee274fe5fc077d848f8ce1a98ee9e001805cf15dfbe92ea7118d4d33fa1a830d4595970d4214505e3eaab723ec2ce7a9c9947219465aa8065df2322ca0df2c8055a2dd536accd589b56a80fd61e7ff17dd46017656e61ee49fe3b5a5b9f9492205084a8f3f9b9897768dbdbf91a5a7a0c53f5fd5b29407bf0d3b9da7af0deeaee6d35a8eee6227871513f59610529d2c798965d90e334c7dac8edfab2381ec37ca0f490901c0a3e4eb8cc42803e4ddc3e7c6e5d211a73011fbb0068a9c6eb4ccafd3a8888bfa2c797c2a51cd776d2e7f464a8da628b054b92021782f451dfd20b4e0b3b6db05e5c46dde74cb30abd80c94bb430a4a2b3fd9343314c95291af9da77fe8b58db83b5acb169929ea414623902009286e15a7375e6db9824de69c3015e181e6a8759c0c448475727431cd8300f7f07ec730d7691284e94fda3524e6049fe91c0b8ba72bffd389ce0f48d4945b189cbd37fe656c75b9aaba25bce3bbdd7c3d3a84cf7ad036bc2b303f1b3bc1b38bd63ce892124a38bb06c72d971548c077262ccf36f500e39edfe21c348ed669f9dda4095d26a22f8dd36ba2f9f17dca958c52dcfb3bf6cb50caec643bcaab7b6ba5768c811179a2fea9f8bba1a982ed97b816e711ead67d728741b35b8bcce3b97713321167a93befb8b78f2c7be5c466337ed17b5d2a5c43d3fe5e451e3caad5f608a4f5c39d428cbd6ec4774dbc33f04391ec40002453eeb360ccbbd5127a89f215576606e363545e0051b1424f0672542837745edc4fcfdeaaac37f9ee275f255ba838a5aeedf377f153563fe7a4c79f14bead33b3b3239819cf0484896d47a5e1706d9eb6e707922ad38f59fc655ab506e5652b347e5db224a1f98b43ff7b150ded829616135862a9fdcf705665cc5f9105a090963d9a107700c807c42fb4980927b8386838e4465f10ad6cef943c4ad1b90066212d002aa952d23f6a4a49b8a34ac2562f09bc01cd59a666828cc801e68864dc42b92b093127568b6d64fba285bbc8dc413267b78aa83654daa8cf3507380886a0ed290b365d11bb9490505dc8127b0dabc26e2e283056c5f65bc733b3e02328387f9e8e8ee8b90d33c5394ffa9dd90c6687a29dc55d950ee8cebd95165d5132f3e5a9d948d3e58e046b99df408c0e999efc4f261f2848bedd4be391b96a0b791a9843a3b99ca228abba3c1d163b2c4384b519c8251a12e4ba85c7cb62918e44e64d6fa3b17489f67a2eee2bb241e60426adea5fb8b3bcd44d9558cf169d53d190b3f7b5e22b00582551260a304cfaab732999bac52b5452df427d01785087aac6ebcbb9c7fb87e4c9464bb0829893e6fc8f8b32c05b72a72031ac72d5ade803620a0773629dfad9f6bd1d5272161dbbe8231e27f20327fdeb2c038459e803fe0babc141bb8738737a4ca717a8ab5be8f28ce5022d8e7f8cc6f119d61a75dbf0cb0d701107fa35e16bd3aaa5328241a250c977f610cc3a33c719998c8423ba59803e653c1a80700b0859248090107b1de1008e698d37737df1b0bd6e2d5fa228c245c6128d38e7613d388c7b40478e93aa497fe57dad02a144d6568cf7600193700badb8d3985edb0aea22ca40adb109e89c03caa2be8c3b56642f4471bb3d6b444fb407ffb82817bd9cc37e859613234acdcd71cee8a12f1d8f85e72780c27e64b2bf017bb908b12711518a869e3a58cbfd77bcc30c38700ece387d647fc2ad6c44ab88712ef4ba34afcd9a79e2e4e8e1e7b461d9865ca2a40ddda4b9ad340d6075ca82c1d5b58ef7610a1c644349d0f78941e3b5549ea400e5ca43bc587dcfd108d4d97f2ae4da386d0247134f8573c8ae631ac3fb1c1e0e444ace36a202838fa7afdef3d8a90bee85017364fc1d4c64e3a5a83e73333cd7b348e02059b4f57770fd4609c08db70ed7f27ef6e377470e7b5825c05a94befd8a6cf8bc14b340b42937cb7b431c13ab590a16dce31e16f4b1282509bd2eebb5514a0c4f8af00ac2e65f8709323b9ecc889bfb6a4014108c8a5244054f9a40a032b409f0e1edb4a54d18e5c16a74f4073e576421a05029a9523ba41cc90c6f92b486efc29735fde8a50056763a66e8a9e994b03992e4d3e824aa368a538d1cf58934a184253122a60cdd1afc101a8a432a642770b0efd5c60133c19a88f0a8570fb0cd8516a90516b091e4837d5c45896ece703a0cdb3f7b51e420ed7fa15abcb887e192c957dcc87ebd0d1281689df7d9438930e851aa2a2472c6e03f388082df1e0c15364235ac699470822c1d99c4dbc11ed74a25c950eca2a916c32e860f5d602ac668867831ecf35bd97050f980c9f422e908a2dd84cc1779fc834be665094a1f182ce1468837b02913334d7b09aa8efa44a3943c72260680bd4646533f436628262b800bc1a0b6060bd63a7424921bedfdaba3b0b3da12e094e15d75744df07827de2d84ee50065f925162c03218fae078bae378b5d2f8309f5fff6b52205621aca6ea69766045b19b6496d5b2aa91c7cd2ff5405e7da8b84cd0e59ed97a572409c7b06b4fc6b3c242607988c79354a178fd620f5a68b5846c2e4d50eaca5ab963b6d9c637f761909e492a5bfdd3ae1922e0578adb55ec1c6292930aeb6300c28dd70e84b29d7c5fc977fcc26cc287c1aa7b1f3791ef026fa10fc656fbd39d36e4af27e036f1db9312cb779086bc3fd7d19a348e8e76f97f4143aad87f40554e94b0187012ab6ed78499e3cf09544927f00454e823067649166d586c69983cb7fde266e8f8f558920c8455c4bcb699283bde5009271069137df2fa69f8c11b681ac9458bc56d4771548297d510a75990e69bde250ec8ee25f158d6e1a23122e9458ab4e5e3a973fffd678829dfd01c5cf0dac94bcae27859b4790bf492993d164ea484676a2be121f011c44ca465233625ecf06e25cdcad5de049c9974079524e148fe52b350b4a7c47da50814c2ed32199aeb5314c230e94b5715dda226880b28d7dc5675fc106289720067dda862354c72b87c624de468f5cc873607b04c3ef62aa922d20ecc545b892b38adb1d2c8dd507d87dd8680c28fbc978314d8c2d0b07abd6a28c4a64c63055d240180686cbf4bda93bd5b326c038bf76c4807fce3c00e4fe49560ca7bcb4f1553f12f08f4d6c0bf90fee389cd47fe01b3183462811e2e330a3af1032b349f34161a9d4c6daceeca0ba391cf4d703385f44d6c3cea235fc5d64fecc17b0c1ca8647206f3631cfc3ef2940b60f81ff8efd8a464832186d91928d9821c966a3b1e553ae794bc6c3a0c5cbedf763ebc18f2037f2c221918d7176b17088a30c3f02f70945f09df9b1a6379b89d5219c21292216904c5b43bd28ac8e0c4a0814f885fc4151bc08bf1f1533c61e7f6f56b6e8a2ee4472c712e8af374e71820b1c21d0e3f915d75baef9f1d8c02227471160ac828b5561a5386ee69c3159f8ad93da1810d44b9c9b88f75ec1f83cca7ecd40a2714fa1d9a9e71f76d89c77eef6ae9224c2f256b9a2d1213088a0806423eda9eda3f7deb07ca5d4cbe13bb9065ff7c85703a7e2168cfb062d2c117f7fd9af8edbf8f92ec5af25ddc76f83b45b29a67bdd0118910b5289231b31bdd7010b42f982d17c4182b66d07f4de3685a83277ac851fb92fba8aadcc9294a49914f1219b3ceca24c38943c8b39c210d31b5d3822048f70ce3dc1b37bdab692053b94cea2ca27d0df783f5b10e17e01791a2f580a8c60b621d07e2bc8338c8db6a07c86a1ed569cc78cdcbae00d751eee846e13d948fcde9fe314ea84e92231f5417e2c959cc704eb23c42a0ca13e0c2e942aa266744762dcf3cbe1478ac54382ee85598e9a17e71366e2799611043d7d61442b2118d5b8b3b6f76db13e70730c51e2f86c0d08f59d77439f3fa9d85298632a4de8b6361c9bf0aaf9181e38c3639d86d113a3fb1b9a08e35d39776befcacaed55b18e549e3e03fba66e706ea6bd53b203d767380efd758a486e3f04050112ac8de3afe4cff2efcb0b936790a680dafedfc9724b9e1ccd22e50b2d76670085822807e238fd0a4ed5697fa48b5cef2274eb32e800684068ca49a2f114550868ebf387d25613675da6e192092aff13ea281af0f76a7272f8a19904249739a09c190891555fc51345a8104a161ee67090ccd214eee8e22af2db1ab00e24e2590a41b743e359cd6106b75cc1a86f3625048285c2093d2d1383e29309d7c4f734544d7318f840c5a0001ac5248e5290c19363b59c66b31790280bfe28df302113db93ac40ff08f92f93e0b3232911133bccfde853f653875374a4455161786642a242f322a9e3cac72fd0ca637ba947a9ec380af5d7cd5abfd8440133b88fd505a33ec15d11d60a0a81dae1622a7d18b766e89acc951940bbe808d2989bb28d0414c30c38a7515e764b833655a52b62251ee6eb695ab2b263f7bfc7edea80f07160a09464b8a43095a1312080467353c14f06847de07e8ac071699fafdb1737cf7c886c0afa365a69e124dfef95a76d7342421bf5dbd36f7673d25626dcd77c04e0756ac749d3c2b4aaad9070c4d16305b898cf6312872183f21f57b08013a99ba637d3e7ee9d8503957726d6c019b8170852503d8f716dbbdf341fa6478b44c44c58895de006de04820c0674b6d44beeda9fc4f971cf196cd0a45a3ced5cfa49908a2e968714025a3210bf91ac9505358e9234465842420115203ef140f6dfa97ab5eb72d7ee7f4dd8043108d27ff18f33a332cb5f0f81deb657deaaf7245ccff48fc31fffe439969503706f6b4b2fca8597dcd012995bc0ab7191cd46cddfd8ef6324576b6c1a7ec523d4029ff0329c53dadee0b9f080bf369b764e47d2fa5416ccc0ffc66ecdc5681c412008b341aa9903c891122464c3d928fb7e0c3dd9a8d8ce59f039fd6d47cb09bddff778c5e578f0c1f8520f4e4654e6fd8270cd9ffa7b8f5e6631501effb5e4a9520a5e1d4b2df26395bf155353f37bb7a13ff50632cc0712d1ac81620170540faeafa8506300998e895f912518ca08636a2083ebf4d6aa9a5b5aa30b7ee9e092c4801331aca1a08611c68040e351de08bd918b042a9de3d3a989780a2464b0b25506dd497524173efc1aca65a65fdf87712d99f4e5b9fdb1ff375a2d3ba2bfa8133517a14c866f00444b2a173c9db11821ed08194d24a80c0b8981f1d54d54e1b100ca8d6cdf1884850a13063f4f2465b2082d953cc01f979d4c0d1316484c263c646c68430aae0f784282db8043e7591b685f6d5ae11b28fa3c06bef2602513b4c85acf09bbd622be510b85d147b572e33e0ae1da2c760dd7c9630fdd0a0093b27675e98f9c9ab70db23dfa4f322f41cba9d26550ad0b4a3487a961feca722fade93344a34aec1552d7e13e997ba8eb041c93807522559a4385a676e08c338322572952d2c1168878f53044ee770a75878e6f648f3e458c34174f708da94baf3bf6c6b4fd6700e113b5119aeb64429afd1be91172fd80ef2486815107fc9dbeeb6bedaa3f02d155d544882602efff75b11590409153b493eaae71fe31765972bd9f890313a938656876ffc0334e17016c2808cc5444344fffd8cc973ee41ccce001af018f4d80393be931167b32c62452057ce0f9e3aa4b8f0b56019e272315656d81398e905bc5b7fea5dc5791a013a5b55e4aef098a6575de89634dc38e4c8833303cc3240f103baca85609b64073c34459c00256fc74cd3bfeb11a2e6a0915907381fbdadc9e1dd26867636997abae62e4292d25615d0f7553af77f6f0e148aef5eae9b95ce7ebddbae3501d9b8b1846fe427026e82c47de45cf81c93582720115c6ea46305253fd4ba0eed15d57d59d67c93745083bc116d9befaa4e4f7674b4256b21fa65741f14d506d04a4eaf12379a411d8c3cf6428ca712d4c19962cf27496400d94848febc4ae6661fb403a6d9071c95c35b0ff9b8ab3256e0d606df935905ecf00de1f401451eecea27e60c68cbf8d456cc7fe4691c642c09a483444ab843334a78882d86d01851284ec3d9c2b19355a19ade34c6c9a2cf064b21f752730cb31aa19a3db96c626be18ed05d68c437bcd3c12cf013295af1d86df778af51b66659d6da9e51855f442dc5549926da0dceb0f1794e3c668d4b14ffc622cc53c9db3be53a7937a750c56eb61826354e553753988f6f10cf0d12f5304c9e0a55b2d0a704b01c8fcb558aab3cfdf742fb07c739ae1ea91efd9e9a345388f94d70e61d75f902c851bd9e56e725cd3161d98203e0f02d27b2b45fd489870ea3ac4a4d06bf462fa6eed403f30231854c0177790c148653ae8c051bd6fb5d31c6270cb220344cecb897e6aeca8d16374223225bc3224ddc938abdd9222164c7d53eb1f52ff04ba9d74f5f5afb3b4735d497674624602651b9f7a218d015cf919d814ac8e2a55dffedf82cb76cc5563f4b51eac39442de03e28f9c4b50034d60ce19a87a4aebd43fe65b6822ec8caaf8bebd404c7a3df90572ab4f8c6e5028473c6545eeaf2856a1e5478188254a4553d9eafa4cffed7042368d83f9a974748f3443462102d920c041b1f589c0140da4449c371bdb3e83c42e9cf0cae98e6b6601d021090bd174cad9d230cf71b1b626068a293be94ddd21786fa53d6c41325976537188e50d83beea70056a49645a213a89b117e91a8b947805236d41fe8398c2dd775e70fa0c185826443b942bad5a6be3c9e203f4c79843556820c3a759b0bda4923dd7aa60bce3d94e59f35cbcd5b3bdff8a1adc898b5c7920a5cf4bee91f891dc321fdf5a001708d9468684dd8251ed1e3b29ad11fa5ab15aa73b144e8c4cbb69966b35ab27bba5b9dd2f7ac7d7629f7282c3f8e7f453068945d47d25516a21432d6a522482eb65db818cf57dee158b788fd7fa3de6b1fefa39be87fb3a3f71013963a093c5cf474ef0f936412b2438efbd08aecc9bfb2e4e9632b5ac79f750e6a843927489b82d4949c02fc8e7ed749a5cad6158540f98abb4107589bfd6798d626e2fb69f1bea0fe3d4cb61d89444ea0a5a93bafc184ba616bafd9917a5fc0bdb427988dd73c66f62d7b784af2b62fba4076ddec14f472ed8d563540a4753fed5adf53905d79eb00bb53b30fcccf29027825288244334f1ecfaccfbe9bc8137f53725d794d0a51fbab8f37edda8b9298a689491847a09a08658d4defa3fc6d1c95a79f19dbfa81e980b8b7610873bb0c8a98f6765248cafe36b419703a78a1496380c5100d79149125b5c5651454194ece08586fa010526c57b7149d361d20c0877af6ba4ae0864016ba85c037d453408fd9e8052ded94271645af574365570d3d0cf2a6e08a494b74919232c94a40eabdfb87e662b3e52d1419f7a02c6f7010e23c2795eceffffa8e211b883ddccf9e2d2ac59db7a6f55925349f724bd989dfdf5c385dfbe85afb7b93228a2277b90431177e94484f575764516ae385767adb0ec02e931de478e2fab29156486281f5ff54e23721376294d8ba5a17409d9c5fbe341ab6e47aa511505d6e9621a1c3ba50e47b05e311b21cdcec16348d08b8583cc5fcd0e5122f240328918803515888daa9275b0c90dbb3d51311cbd272cfc3381c3c9324cd6f85b6c436fc120814dab78269d9c6534137a129393d72e4b971d26d57dd39a4645134810668c1365704b5f6d0e46b5d639d61f27b01ad551cdea81f1663ff6603ae2be0372dd33b71cc2c43a314341d44595ee639d1b7ab8b7b7eec8d5d87639a4c086bf70106e9ad1d34c7928d49715fdc02dd7575c5f070491becb88898cab08e19c1d87b12e2f4b4223223a67b67d2374741b87f20f078ec16a4be1d5c0587816b6477a81163a51980bcd516f169369c370ef8ca100f60b5e75599af2f73a154447a23ceb14f5fecfaff4e5f5e1e5e1deb6b45c3332f9f3ce6a34e9f57a44712cc4612e9d3022453bf5fd4b1f46d4eb03792afbf766184ff78a4e35cd5e5cd862dbb29e5150f8f93563df92c499bb013cd5c4a4da2f2a263694bd471cc2b94a2deb31fbd491c1f60bda5e8c9471361c401a2d2ce15bd6615d381d6e732b0b7341015bf93ca70f46ea09c3c2e20c08ea7e7cef8a730684d23a26aa44db034a51b4582f81c246d37a4655b3f32047e76925053f8b2520847dadd7cef1937a0b89f8e24945b1612034688c4d1496a1d9249567fe98ba71c87a8cce1886ce557b462f327e45865815b5981c630a8563a83e069bf176aea990f66091934b142b2811030bab6b174cf7e4ab90bb8763742c9e49e16491f518f93681dbb5240e860ad69c6431303ff3725ca857a345e871c4753bbc547090a41a42e30a0e2241c76491bb32fca113ef92bfd8704ea7b6b509f9f2e9a5e29bbd95af57f560289e9b92839ac07b8983ca6551d0847667789c5ceaa48483817cc49afef9a2897135583f08ee8347068f1977e6c5bf1d8cfa6e7743bb865686af90040280aa6bb29488a222be216438d1a78bcd1b7d17012d3da2549968695a9b34e1a4cde39abb43965ef6f589a29676ca4a3434d051280e5e47b38c34fdf3a521ea46265210d5d301c11f8df3579e6d056690b211fd813d34c6e377758f281f681bf59fa60a0358936de579b711ac6085b826608abe087d46bfbfb6d6f8a75fe41447304dfa460ace157cdc4df706e6f4f39cd1c38a464c0ad4a9db69448ef1ac9c064ebd4773aa40c343f042923627e5a19ce39051282cebb844337013b742e30f6a133372449f4b6ead9435210cb0d8796c194d8832329eac26fe3d32b72f422ccc5c268ffc1ef4519a30e7cff88ef3d8fa6c173ef8dd93b9a7066441fe014e211a0d8f13dd39b01e3012d99961722132438c487a5f888246f1551687d68be18160f8f5cfd95b8f86b298048511060c6e66cd5f2b29641dc0b76afb0a88abc2d02691d955e24706293323b53034ccaa768422d27c26167fc21080125644e21c7857f0a4be2f76e314c5c58da5d416b0089d05952625ddbba528a704d4b827d2f7665446afede1fb6080cf8cec7df70e01a4617c0c5039405b8978a74fe087756b9da0430fbdfb1a99916312972203a8b5311a04f3ed7d9bd8c0310d4f38176625f2d3fdc250690c689c291f67f44ff6b794aa319a75a4d1f7d8cf589d70da014bfd789120edd1180ce8ef1eab87c7a0930c4de5feb08fdd81d2d57a91557a2cd979ef94ac8b0b88cb08e7345785605de9aab8d37c9e84bda0fe5b3bf82b2858f4d10feed4341b53405c045ca53247c6c64f67201001e29ede270246e2ead7f9aa593e2eceb5eef68cd77cadb0b773ab430def44395edd4350b9b80ac2e0f998045ca25fb6bdd53f8d752a9511bb1b76184d70786b0270868a9558426c8b35b0a883b789082bc9cd5f4a2c4557a75643bf37a0261df110d85a9ac6db82d1e48f9aacfd09cbc38847e35d67ad18d657ba9122ffd134bd1a4f437c1fb2dae8a07992b85e03a6bdb39f07b6971922663f560f4d96cdfbfd66730e409815e0c09765a3a1a6bf4445ba46a0556ea99c9c82e7b87308dec95e8983c837647e3e17bfb6c7452224cd4b7d5d4e7addfd9b6dcd1f62c2836394d4b204141c986867671281cfa0eab24c28ef5043f91b1995a363267dc7b5eb5c35cd32599378beca4fe125b08a1c6f8d09dfcc8a14d41f60a9513089d3af11a4384c8eb4460994f86dccd9c9ab1ea7b7f6e6bf032d3bf5933e2a8ecc3117f5c5af91b9212d76088846b18ecbb153dc909336d3cc915065f73b7170667637b243ec8bc028d0767c4d85617ca0127ad802c560f7057770ac39185a13dc33186bdd000befa42c52be2e39dd9aacbcadc002de88ff6c8293374098906a2e3e8205263eda433753f3cae97411bd4b4ebe88e7847662d2f6008f7225d6b82dcb69659b8f7747e4cf2efcabf403ec9d03329c1a3f2e4c06c1c1179057e24da1f95713515d2c6d4e521af280ee9e424bac00e8c83c735a6d73337c081f2d54f1a898d76a5a37851b738e08894179b3a5fbb62b5d834893a1b71b0803762fd88f042e5dd3416bc0efe71d5dba614ca90526828770eeb8f8d8801b2ac2891ee61c94cc6cdede7cc3389bd32d9ac078ef71f892909a50d1a24b290fb9a122acb981f0a7e654c50e52bbc0d9c214e67667b91688f97a595fa2b4025b1bbf485e08e222bef4c5a2b5a72e2f722226a7c0a4064261ee2b6be08ca9d377ad760869225b789bb10bbc60ced413cd442ec15146c58cb0fd80fc97a5e2c06e69c6a7f5b4b0d4c93a04c377545552886dee783c534bd71f97eee1d561f10565fabdc75960bca4cf8a390c25908d5ae9e3b2a90457b0449f3bc6c23fab2ca5b6b6aabec0ebde1e0db076095893f6fa6cb889a1b3d35fc449e749fb700d138418cff0de2632aa636cb21df0f49ccef5039a01f79cf3433154edf38a136258274c704b7cc6d747092dd779185898b6815c1b1434697ba220427efb2cd0b0c4308beeff11107d14c916c0427bb8d903cc5a7bba21bf28ec44865a8b915c88e284624788626452f7a382f93fd359b677cd7ae2292970889ec7882cf5c50dccfd0a78438e0ef498b657319de5bfb8807813121144d6519aba464621a9df54803b74c56de342d4df2318d0771962b349952d237a17dab7f01c6b6c0f528fec15a80d232c10514f84bb76ab94e321313ab54bebccfa56f0b6a2de5267b7962d45787cb43301c540644f263cf8cc52dfe0268682b88f02a0bbae9613331c68c68b02ebca5db5a0deadb9488c13dbf7b0ce82173ebaf83c16e3160c2506a5bb2b25b0da453043e065c1c9807daea04d1853970c1b02b335c6c8cf875e71068529d3b09c8bcd62a147d6ab7f8e19b09662f67f2a0cccdf56b2e22ab643753279d2d42575baf09c7a7216bde428303e0339fc2995a7689901f13f1c0dd6c20b920c8815c718ffeac314906e464b33ff91dd706304eef29dcb385afabe328e22177ffa8bb5732b0593c0c0ed1050349fa1ade4824b47800a9eb63863d631704cec78b0907e52b88e67a8e04f2f1896bef14a72133a7cbf21e4c91874b6cf6108c5dec291daf826ba9ea4e8cc99abbdb36b1e423bda3e9a2b827396248cd00016797f168850b48ccba87a8345e72c85ac3951fe9216236039c259c51d81c9aa0a534c4fad90d238799a396216ee8fd54c35c441956f3d93e108a339855eb8e7662b2a604beb236ba2eb4a44b9173fb4f613c440e2847afd1a5a1ee3ed8f817f31ab18f5e6554593d12bf93eda059cb31aab6852eebbd6c22ff67f615a04d30f7db6d64e087d52216fbc51559c7acf0e58b06e7faf09a822a9e7809f25871622908b7b9e3279792c3845f83701a4109bf5f04be27fa1fd98803346332127d7cba2137e4fa932cc29acaf9658e0825f27486c34496f45e0619958e0d1a67388090993dd2925b57ac0c8080e90cf9fe1205df624011938e9a1a6ba50e390c3a3a6c3793c7019678ab5bbf4ef8d24322264fa5e34a1888d32a3b56e68025beb7be8025920e9a0bdf7224d5132169e6fb63a02fa66ee10c703d0a259c8da12c4bc60020f9420fd347e0422d0b48501106fcc03d1968c8478c35e45a0b2c30441776032830a1a0dd00316539222cc303dd1f9171ce498a302c6f02c4f58950584650eb7e4831a099a24af1e4a9ac78487c538d8602f22bd11583d6bde90217efda965b13af417096844a6e16b6aea9465a092fb29f8a6355e869f48c27fb570388330b0579b1ab8cb9d397b5d258db3105ec3747072a4f7af7655812bd268d89964d423c599bc3e03228339bc0952cfa0772bdeda70ad8c42096bd6dbb226de27252a46d0692557893bfa032be8d17e8809bcc4a39f2265ac5d5acaf810ff047533e13f7b80c1abb3217dabebafd3b2241a6cf745cdc6f9dd73e1aeebd2f726cf74163d9e34c2dfbf37d2392b25b8e0740d21788efaabc0bde9ac980b76f980217a7b10539a79de1255b88848e64a20c05f500a9df3a31a9e9864210705bc036a41b40199068b51a206831326810567a3d88bc0c5325e31929e27063a602c48545fe790a6b837236b67ccb34976a58425eff5aa0e4d723f42f3ac56b8d23c45e68aebe8d489df7df6ee140934dcfe66bde34426694474acb9219786b110f74bf6d33cd19dab38794872b5a24dcf332deb8dac523a72f7b21d66063b508fbfaaefda9ff1a816fe21b2dac93549252dd0635eb1afdd885659880e0dcee17ed39bbae8be15d4f016a0315c8f45fdce6af8ad0b378eed3507da0cceb1e184c360440e16338cfa83dc3429ef57821ad5fdccce7d4237694b149fc4cf62a79845f8f286e4370ff2300f97746a93f0fb8f44d8ddc0022796394b19999856754dcf2c1f3470c6fa94ec45f592ff03b7fe48e93b54e1f39b15de38d4310c1dc81eb495e47aea0270f4f71c484a7e54279b256a42afac3f71dfd11ab73e456e6b18385bdadd0613bc0caae448b523f0db90d094a854dff3cf52874bab2ebde982e542abfb1896a7a95f4708f905257c21fcfd41ed1684dd8dc9a98692ac7a9c83622bb93c7773d743ab87db694c7158242ca37d2c1ca3701c2fdc51148e067b38fa2233818028335cd673adc23a0c2140e1a087d3a294d9bd1d7b87a251a10b4d845c5ed3489549a26af58a320dabb55bf8acd4c063c28a19a11a0d825985b2dfcaa49367434a66c07e0b678ce25ec4a9a44b103d074a38943dc5916ac14665fd69e7ff784809385d1ca0ca280ef78f2d71f00381007950dbe4914168af9b150ffdc795a64188764144249e0aba7ac4b1e459fc083cfb50c7cbd397054cc52e08513c4504aee3b82ab482bb6caf69463b3b0733396d873e8b92311e160e80e4ae8c9ae30c1fb3bd161831027e9ebe374844c34b58935cda24ba85b7a30f58432722d01e8852527f3c5552b7c620f47cff4e4fca9c58359f28d40670bdf059afe5f8c52158452211c792ae245208b0fc04328ea2eef4e24588ba020dbb9c627ea32606241758727f7fdd38cbb4ce085b4ebe9b8d98fc7a8f2ee2d622e07f423535e2e61dc85f2d810f67c698838949a6064ee4cdd64435b85488092d9a49c22ae33b122b789812f318d259aa41fdb47372e847211069cfaa962716497f6f7ff6cd290410e1b73f9594255919adf4e8dcc21d985752065f4b1543a55bc111c594667e1022ca447d62fae40851e1a24b10949c3b88f7dcc5706797c0befe29519945b39dfaad2e81c47ba4d662f8840dafeb3c22566968982ef8c53b86f18d31a19f988e8e34385fd89c96462aa11ab3d1440349aa47845953a02c708059a9cd905eba874ca48456df7643fc176387234a40ed1990405320bb7d35e3458cae9db30b41aa2953489b0e160a580b124824bcd8faa940e236ef4c224290eb1b9e309fb5c27162380e2545d372e58bba7e0e650d9534a71507ba59a986f54dc2d57b1bdc7e42c679a4cdd120eac6eccb81a8a741c991bb70a2322fa8731f3ac2f2a6586141c07d4e60bce44b075127826606b681edca2b4908639c29ff56535523be09a1aa2096134ad5e402d0a9443c572a3d31b9993dee02db7e015269f6ffc49426f7a28dcb9a0cbac83f957a0d9e1fe624626954185c1b66460a5cd73c62d61fb4bb7aa4607c912524c19d6797d2965a165ce652b6f56f5724111b2ec4a6126ddb993143dcd0eb14aae94f19907994899588e59637588ea5d24931ca5e18e092f65ee45e7a80c5eaf9fb8710fcf3bdbb9408755d45dc713c4cb7432d5b1eb9636c223492118ae5fece426f59bc08e50ed53a649043497d56c0fea470f6ff5f4872e27f9a8256488462620f49f6ce2515fd32820171461212e15e438f216f6a8f9e8788b8b058c53748e4fa861562be935768515c3601d9faaefc145066152ae5de70624782a9aed3a763dbb81ebba776230fbfb3e547f96fe020ea913c0e1080848335cf9d5972c89fa4d6c7109185e49757aa32b51028a28b71e21e50f0b2114d0afa4605af1f6f04f61664143b6e06be64717eadef223f326413ac86c94d2690255dfaf0a760beb3d4ebfbd82f5d3945f2cdf6f265f32fc3e7c3402964bb2d0030384d2d34a46e7e48a398c5ed783aa91fa254b291fdc8a879240710d03c5d7eb5466cc629b1e4e55a147cecd3e4c5b4af15d73aa34b412f43b59980db70538f5ba6246107b893957c41054411532d117c05bdaf0138f0f37d37aa0e6cdf02b4277da9f2e976b67acb82ed19b9021edc0c57944717c030179c63732e6e08bb5eb01a45c8e6fcac47cee7fa7c3fadfe971ff84d182d2066ac183d02cc0c7442f97892e4a1b1c987ddf779a2b39140e51a608c30b70fff4f9cc48d594ff037a1337cb249560081b103fadd503352b88cdf19e4388726b9f7668b5fed8f8d6fc4000dec8e5409e86119c0d616f6fda196ca16b66267e6c39ac17b6aaebc0355a8c28c54928ec919437bf5450860cdd96751aa6d9e8ccddda9ee9a3d793ea2ace9b14d0049d735442b892c8fd150c6d992c45d2fce892a9aca397decfc89da90dfddb99a824571246100fdee499ef0a9a2d60e8c675aa833c9c5bb9f586d1b1a6e0ade6d0efeaa9a33fad55cc270eba5bdc8db75dc3f1cce50457f63e573a70bc1ade44f2a369717404d8091f7626b4808a91f18469c51ade5fa2120ee89226ddd5728a289f1b6c3a47117a288bbc22268416128e305997a799d99b320ff242a0250203c9a15726d64160156734eaf37e0b1b8535404b6659bf17741b96cc002b2c4466aaa427ba6715db562b51564a0a007cc878eea1b02b9cc8fe26ca26d1a30c2304aeacac89658a3064882e2cea9f8487a861b1ada8a6d0bed196ae35401ddfacc5ac9b141bb9fc99a0aa0e6849413ec3c60c87f7561c43010d2823515c935cd0a15ea1b55834b1b8e1043b8f4b9d533d6c0d1775f6ae39b0b89c77404d20680608c64a4c8f96d5af1997ecb9f85bd00c533c4bea611b71c7ba946aa4724746bec269d6be6b2825a6d49b3bbca4ff16ab12e543d593dbb021a46a3fcb086483eede6a1d4384122f5fd94ce4de2c883d4513ce8212ecdd0db88e166b59946a1d4198959e872d6d1f029d8e4685477146a957a7c4e3c84413774dec4b58246163b227a1844c8f9ef0372c995eef42806ce21c89640cce7d5a48c3c76e608dcedc327646af69ffa61409b77cef7bb5552deef4325a20e89da192ae0d9a5005c90ca4ef79852086de7f1f2ea0f481b3887783d32985b60c59e105d11889da50619490a6689322308a52286ec9b2009452f63b281616537c2dfc6da774884212126639304088a50623b6c8cf337b41b8518aa844b2831fbfe2e7ec313e0d509f93475b3f10f51bf8e871d6deb63794c86e95803c9f2d3694f65b76d6abf8fb45003138dccba5554168763e635176ad8f999725bd3463a416d432d210accd6bd625b8d81fbbec52fb9a7ecd6563d71db5ee2db769c07fb9ff769463f528f464abaa25f3f8c9b6ab5bc4923dabd9d916017796978014027a7f57db9da70dc39fa633b0647a3a4ceaf86348f519fd5cb1609ea55b63e6fb6cecce131b371ea822a4debbfbd13024305ae0602aaaeb2a091914652c1d1b97fac7174fe2b16b3fc4ce4ccb7216ff499db59e04c90a0f4103935c2dacce139f0592074aaf632a829810640178e15073fad3c6827959665f68f8e4d323b5a23e316921419425aafe13fbd790e362c1635d6aa0dc75b103702a59d2916fc00f4a7b2796f6c2e63de1b2bec17d7d23b2f27a60c70efcb0070c24b9ef0f9ae2ac07c5c1e71d83fc62ad0af8dde74897b71ddec5125f3f72168b9c441d2a4a3de432f321a34f4d3c63e917f078df41d5bbc3f56719538555be69b3fc2c25404aee4856a0ab3c936a108ae71dd89861109f9dcba57926aa05e446a320905469fed05122a78ff9a15e44497f4b4e84827eeb7a2e4aee2468fd6711b1cfa66d6cd1670e37a4ddd94ccb2857681c3bc4ac28e6d94418eccea172777e552455df607f4359d03bc341577b7775dd92d0c4e5a88b005c23b9061e0987ae995d2afbf22b8a2cc5c8a13df0c142d6cc8ba8e01773d2f5d020f022d7fa85e33b8542f039fdec2898276b2db25d4493d17d390dc1115791ce2fb21fde3f9c1140b9a5b59185d6a63a6fb72a7f1c711bb28236c0af1da14167ae6085c243686b8277e207d677c6fa836c254c6cd27ce0b28f83ee090b76e76ead0ef984f6756286f8884cfdbeb4c2e5279f64eec8cb6fcc15119c29bbf37b40e7d368cde535bf59f1f0b377d501a9d72870a75c4d944deb01e2ffb71f8448a686f2c86fd707e754ebaaeba6235581f67a42165ef5dc5e87e26b1939df33bd9e3aa4a5fc8226141500bd2f35f3866e8413430158c0a89931924279458652aa389f7b18cb01ce4d1428afea4f261162b8a724180f7c72935e51294c5d53485a33e378656ec08b596eba1d568e74418ebd6b7bc6aae9b993a0849ff156cd172a6816b010c2dfe2167467c52446d81c58ab28ac74610a5b16cb82576370b8a30fdcc90be837cba17217163c44e55a8aaac26a625fac3064625f2a881e964b720f278d31c58851b2fe21123a09022905f470b6d328d3ffbd8178fd73d120bde3213c2b6a62644e602a5181569b8e9cbb1e468a72e924ec811d23410819ac497e12d0cb7a958831cfc373a82c0acd5375cd0cc92962c4114b188c59c04357ea31838a1cfbf9a3725237423c9b30f64e45a29a670a90f33294c64a35780f137f0fb52fd4a8b56d65b4a2cc1da8373470aedc20e160610beed19cc5e9b1bf604929966016050d5440704b7b24373eba894cce81223c360799e8e87aae12474d7b5623a7a19b45565acb1d671c15fd148ef4038fdf699d2b3b9ea9c08e3981e416e851f9468ced9c96564046c94a74921f0dfc2aa66890fcbe7919f32542b303b6215d865b45ce01c76ad4e0c4e1719c40318e0ebbd39d0aa8100f59230b7141805590878cd793616b8dfb35023a51d1d8f40c8edd3469c9caebc78c70521c75c21c8279cc83eba2f7ae443146dbcfb1c1cba900b532258430c1e84683717d00f6c3d1828e4da4184f657a5ce9a9c95230e86917e445794890e49e659d213144502b9aeb64749c4c1df1161e8eac281a9afe739e7203d25b4a032fee3a7fbee0104a602cc41191e89c55230747a6d099b2e9a96c62765c600c520f8a84b52c09d11e4dcf670ad31f560aa5d85a66ce70a4e2b99ee960ba941a50edb5247412e2a2c9bad5d61442a5e147ac53042be9a27a7630c188948368c455b91dafa0ccf0f315cc4ecad8e0b0d0701c7c5cb7c85e224c6505fac991c24087817da3eb748e4d1792b1c1a764517600c8e9c9f7876aecfa1cb2f06925e4f9f9dec433b8c006944ee3bbe0de67a640587dd6724fa1de1bd91b468468048b692b91ce081978ab0277f922fe3cc61fad7679d5533183efe330547c6690d5488e085c08f9451d987b4b3f6623271e350e0d4bf7dd2d1e60c3f1cf976233aa34f6665f44a89cd09c7b73d4e881a2a300644d663eee16aec47b5ff1e5b062cc692a8baeb661b15c1a3cd1440df9f4277cb6c5f9413ed911d9e31bfdc017e2388c27a223dd8323f51cc14d8fd1732684241eb654f6192d1789fdcf5f130b311e3c6ff1081184b1a472f158bfd7713386224ed3d964624ea7697c1d783b8abd2c048e741268711ff1198f31f93aaf2784bc79d348038b0fec2e442b7a54b2316b49adcbf41db8cdd0f76c0b2ba4268747137cea38ddf4c237ccf88ef11a3ec5a6e39e6fea59b13cb30b2681a18cab596541365ac8469237cab06c97f811d4290cb0705c1730fa66e21c5c57884a687026454d65c6205fcfb0d1dc934b59023fdf7453e0ffb5b094e8344e1a89781fa3c82850cbc312610b8d83d3a18d57941608ce9d01749332545f3761dab11418fa2b784dd99c6ede23bc306e6147cebca4fc15317c45e29cb8abc3f04d9981694f916406a2b9330986831a625cbeba1e092f619a11a872336395d23fa35b819953e21ddfc54f092de004851b78118a8e3c9628c7e00a94acbb34830455b87aaab222dba61cbea9e4d44a08762c6aba767aab1b86d54ac03cd52d52205e9a700769b7ad01b3f2c84eb79278e047a83a9d5d00ce2a1c253fedea7c7e901c504aa0ca97c4bd094efa09e6a16299652841c9484bfc120b037273e9a54a468af374c89150cd8c5784d2306f38c0dbf91160a597582d8f761e423ca7222033113f57c192c4d38d5fa690e8244f5132ed89dfa1519f39b4a6631690005417a054074cb0801881ebf4bd18a2f6e31ed3bb40e39612f5ae02d3d0900a875ec0b6f4b5ff3b1cc17a2947425c8b40a16517f6f8d59c9a382eaf64569f4cf1ef06ca2889a4484e59a1b33eb43f7a87d6f66cd04b2cb11031635af7f86656ac839c752a33f497563c5595ad8b6c2e95f93c38d58ca46d60386854ff8f8753bc8bb206a08d694ecd7acc6cb4dfd525d406bd1c88050a8aa25afc0f501cd71c66b5730fa527f1ce1243035ce18127f8e63cf0cf1ee095cae27605f20c75853c9ec9a800ee67917544ecf025115f3fbb4082c0a8dd0bfa10fea3ec7b52ec132f87d93e3a60af7ed747694f8c3314d2d26e1325567a2fee29196c21f3ac72ffb44b7ecf8bc445af11469c762a027a76c362b650e02e473833e2ec2bc3568112142b0fcf92bbef2cf73fe3b405f4d28a13a21acb0667e07b094a3133f18cba5b68ce6cc297e98d5d79595f365b354662d5eea1f109bade71fcac712106f8f8d7c7409b57b72d57346c4629f971664eb13fa3aff941afdb1cf67fe93b029b44d863c8d89e55bba5802673d1ad811b53323864780474396e5e8a2012eea5496390e8f8228e210f2e9bc4099c926cabfdc64a561147aa0a80ae4ae450c66fef64d086a7525dc975d95010ca0fa9d99559a7c663a54cdf1c057b43ecfbd399fc40e28337dfbb02c963a1641aaa9d4dc0b05570848b41dfe0ab77a333584bc8890105a3812c14b5647f7a0596064a10ad89e6026c534858d4938aa7f55cfca97da885ecc8469cefe55d0c4ed8df093e6a91610b0545346009c637dae105af59f68363b617fb013eca5968d7377632284fb560e813f8c38ec2eaca970f98d6db67c05d9d6c0c5b89a2012969fe76f91e57e07e0d608f7c6c087e5ef7ac38d5e9e67eb0b574955c8365223b232b7de64ab424708f5a42ea0f9d7dd07057cdec11c442396a10bb89312a16429718424619f3bcd2a7886bf580e22a0b7480a9d291fd618b33a99e1e427e050b36787cee51c111f5bee5e5a2b039ef4b0fbbcce7cf303b53cb87811d1537c7d679fed7b8619cf60f482b377b8de12b56f30c7fcc762b97538003cff7e1898242a65a453e56a3fc0d89fd4d449ed92b4848893aee45ed0b71eb90481fd33c2ad8932356cdd10a4e30d1ebf8c5d8927a6522f1edf48345485b8724fbad25aa9bc16a566a59a138d4c61cb2868c027fba9043c23fc844ef31913c945318ceb38154e6a0441559443ce2af8d107f7ac430870024f4f322f512e4e641999471fa1ca0986516a43008fae7e7b828b343a1f1a85c8cf97354ae6eb253cfc45cf501a9d033fd2bfd988100fe5c05019a5aa8f175a6ec902b988544289c327198382137962016e555b7e7a3804d7b56edc8047a33e7b0f2c65441fad1c80c4b412d4140b1bbea1245004523a966882eb1912dc0a9ef41741405dec67a09d0ad0dda336e1b4df2c8bb3956036602d2ab025f8eb442f1cee7b7d6031429f6a85e3ddf75aac855d701f484025aac51595d400cd24a07d7d6aa264511b9b597ae4057e1176d0482e3006f62c4ec1fa591612001b54aa8c992a4da0e58e6eef6e61e596527f60878c99f6ca2d9b9dd37558aeb4f7ab9a8d380992351fb7af9398ffede841291bd37217b6f996492293205e7056b0551c0ef6e8c4f061583769d9325cea5e50c5264159665943a15afdbef764dd6b80192edc1124bb5ade0717b27d88ab8f1d2a5658c018f1b86a5ebbe2430ee3db5d4eeb9adaeba6dabb5b719dcddb9544e05ad1ea6a94e4fa26917dab5c86d75e38e6dc7b6c27aab8165b46cf59eb7da9ccbc1c5bb6eeb4497d7ba6d75eb28ac7dd6e91b95e6d2b5b65c2dab9fbb3b753a3798ed60b0d94cb9eb105494525ae9b67175b5ac3a57aed4290ab8d0ca71f40575297dd1f79342bb749974636206266544e706e6a5cdd3c52d6b597753da4d9b9c4d7677336566e6d97101367657052a07bef8ea9cb35a3ae7b6ad3ae7aa37b91e5c60f0ad1e1d574d5d21bcb8711b6bb4dbc64c79c5d4683e0aacb5f673ba74b4312ff71cd364c072bdc97523d85d71efbc63db7157e794503ae52adadd29a5eeb452a74ac89c7271efe25ddc4bdfb69655af75dbb676f759c51b5de75d57dbab7be1c2c5a8762ee709d67a6bfda424b94cebf2744b5897a52e4697695dccdc1246eb22352fad5d7caac7024ff2240ad44a6e8502c9508a8af2a4284fe269a530458a14efbd9ed8b295528c53c2560ac3306ca5d05ba93bcadd7d157efd868181ec5d7d38ba9496b992d3adcf25d9247f3d71d50840937dc2a5b095c22ffba995b60fc5370cb0af3dd53ffd5d0df6caad0ffbb27bb875555b0a451886b0307c17ed713cb970866da595ba4a092ceb8b42a35b513c0ab21da98ed074c69aad9fce9a3f7ffed763c1cb980005f88795e2cbeebfb4f7f5cc401cfbcc7fcdf95d8a3bff75eefc14a3f79d331c7b9cbaf1236279b56df030ba9f2b292ca5a4a4566aa786eaa85eeaa7c6726bab36dd1ac3f36648d9923c894b8a41046cdd70295a3dc3ef25a6a6567a8f7eacefc6ae65acdfc61928dec6bcb3831410ddd64f9296717524a496d16cac65f5757ee74f3cfda424a0673a0155a569e74b7fb2b274e3499ee4525c49c759b02f5ba97b2739303788d1911db4aca2203937f2222e547cf7221464fd1f5d88fad4f7c0988e9323c5e8c0932051a06e427deab7ba4a5b89e9d01435ecc66e6aa6962db5ac95a84f45c122cbaebe0bca3396f3f2fcb646053bbfe7cb56ca799d6f256e81a5a3faa7e7ebc4b1170786f30cbed079176dc1786353a2405d542b45f59023b4acfece97ad74e24baeaa0102add64fa52a6da5f5fd6ab533c2c628295ad6329cd1c6bc652b85a3920deeca888a8a4a413a596badb5d6a74eb400748042530191d7d3cb074b4b01141c685366685345b422ccbc9ea880e81ab1e6729322882ebff3379dba5da9925326aad46de00bee5f6a2c14156c57cea83ba32859c26814b3bbbe96d59f533305b77f4acda82935a79c4e6d2b782fa715ad082e3f20390015114338894193664a903389c0eb8abf9ab093c5b744d41dc0659a981faee79f6fe197e0652010a88ffbd7d6d7a05e73bef46fbdac7f66d47fbd5eafd78b74d1af31f67acf35e62539406f140f509f560717944eee7cab7eeb7d2c3bf71d72088750d0eb2908a18ece2d790afcbfa065feb1eb0f989792fe4ebfacdbef8c433b3b0f1b3db0e3727d155fdcd9d9791d388276481d382f56b2c6bfc828b0777d949dbf69913863095388a9c951119109398286b84d500e59b413042379c05e8728c2602fc2c4d701fb9cd781b3f33a72704817d4a71fa7eb44b29dc2a8ff39f802ac4fbf1fe9f774f49f171ce7f52ff9fbd99de0ea2748bf7b91b1dd9796affb53ba7dadb40677fd9b45f92b988d7a5b46eb37c963e775c0766062ceebc0c9c1c1f91d1e3aaf2347270796f33b275e87ce899dd781edc0eaef3cec775e07ea96b1cbb42d4e3b309d1c1c9169491855776ff26a9c219e7ebe013426b4e480030bb433416e98817bd8e189922321128c5922021a1349b4333acc508858068520539cd6c08025c969088d7c0620677ed45892e58b101a4e00b304ed8c8e5bdaa7f28303274547cce8c0b464a98a0b2c413891ca42d5040b324420f411fa986939b183abae11e02ced7076959162cb2ced4862ddbd0c90d6501b35ae323e866e4eb03a818a1566a8d65a7b9031c2231366a8cd8b8c0940325b88dcddfd8909a9214e38386142490c649a7e90b96195b303d72524f2922c9961284b932e41602093838c9010d45a6b65336a5e402a8a8aa1c913a5315475cc19a336750c976dcc971d6d702ed3cc5059025ea69951e1bb3a790c162a30e19053773348d7cd18b91ebb2bf09dcbb4326cee77995666cc2dedf3f0026781d2c3d29212506569018530472c160ab9c7700801591285c70f2f3df8a02281199b181b2936b1865571814625f54a037ba1b1250c067ba5a96ad9ab8cedaaaa9719209eb7f462e2f5e475e675e6f5e4f524c9652246445c9c3211b9650745a32e986bc3299776daf3a5260acbecad82542fbc98789da1513dbdccd0c034d194488a227e8b1d8e07b2c096d7f2a87d10b4ad96ed3a16ab6f97f363b1baf7be9fd53df82ea8d7faae63b1480eec74ad9665756f7f46d712bf25b6ba6f91acc11245511445513c61bf652dd9df02c756abd56ab544b1e52d0f0767249a3263fbafffdb9ee5b11efcefc5f1fb09fa37f8bd7f64e9912c328af80c96300b9ad2df2d763f8e5ba3694a54da972ab77a01d373ebd6e1b8e9b0481255b42f4597695ed6d0bc807901d1de6cdf3ad6d7b230984e5718fb219104892077beede69c4d7396eae7ee5e379d20388eeb563949b0582cef635da621d1a6f5812008b66e361eaecf5a6b5daf5710f10bc33014715a2ae87c393939393a307fe1c4b7b3b3b37382c72583055f0ff862f67c4f0f08635a007a2818641a1252685e9a3ac537c7ef07efebb089304b60b0f090c38d932335c50e42f0603384871d4749628c6c1227ee354a982476c498d0e30818e6e90b1325e448069769470c71732ed38e68da76a830f86ee41c400c4984a0cc10060d19fef2e58a9227477620420491e7dc82fe772bcf063d6f1d37e84beb9cd503cb911506ade4023af0601643c60acb40348b0f5a84109aa2821f82fa610c848308d416a72134c860431041fdcf40385258926605587698d0c292a07e190349a00710528cb61061839aa04981e876b1809675cd9e6f640370cf0f8058cfb52a32b81a74ec0160065f78e173c081abc705070be0c0d5b36a56ade99f9e15e5fb85a3087d815e452cdf9bcff5ab1720cbc117b641b1b50a377091a55fd7bf7ee74b169712e0529f4bc74ba94f5703f47cb95dfa5d142d9c5b884fc992860697feac652c8c580a83768055f4f78c1e9818f4f38c374614e38ce1bf43962960ad43e69038e4346215fde2380212e2c4228a566c0244e004ea0535305ca1e100426584903205052b5a82c277fd178e3f6eff6b5cf1c2f50caedee53f57feb3ae2e576115ed4137eb1fbf3eab4c2badd56a07334627604209282d637eca0710a3a71f3d66e8a9e4c57a8c96cde6d16c89c71155b2741142e10baf816129082117804059e13146a4d01024898b1825ec24c504426b5c0042488707e0ea999d65d4c6067e6bdcb8ab6780df150ad2a9a96593a9653262fc30cda9a9e46207193448a8525873e50c0e100cf121071242504d943c087206cc1227453c518380205aca242121a2cc95596532fd943a4c55553c99b4dc9e555ac6dc651451507cc78d9331a0bf8d9455b00a5a7bb4e05c4a5f0845f3b432954411d892a13cb0808cb20b61e64c0c84e3484c102a2d34c920460541fdd38981be3037a05902491a286582fa271403e15062c4972b46517058c10f41fd338a812eb0e44996da910b26d021a89ff6744f198f63eeb376735f2b4752fa2e68cfe9d3371fe2087d10188829c9f3a5c3086cc953970ab90d9bb78f3b51f74ebfe9d88d1f13a03e37eee882c202809c41fd170ab6847110f7baa16723bb9fdd67c415301501b0e0320e03f1ff70ab1fd64f364073a37763e7dfa3b38fff8a142a6001b8ee5f52760a24fbaa576b8a5b3f356ad8884004be860d193c1fb0fee66f4812bc67f5db90c1f3c1cd73cf912480af6fd2f5dc7bae675006f8dc6b9cb9469e7e1c41dd7b7ef381f7ac6f5006f837ef323e1996bc2179e8b7a0beb1f3c8182b32aa71cc2fc1e2a8dd09e1717f351e4eb5a22d2111a1096a3eb408f14310351f4ff3eb6d1312fee05ef3513444864f966f903b89853ecc62a10f33fe19c0162e253124357505892a20e86104643a354421205146aa882f42476282ea95a9dae58715c7521b1a22b4f25dae150561c3666162510f3cdac244765a94838f4a5ad9b115b94044910f138a7e0cd58a885cbf5c2b3a9299a9ed0043543b018ae740db9bb536d4543361081c6228aa1151210a450080cb35221fb5a11514416b3992d4724829e371536f62c0eff52cc009588b96da0ea7fe698e5b701bb7d82ab7a8945bd0e6163db90503388eeb2639637bba6d3326b76db5ba53da3debd6fdd65d83bb3336fa1bc0719bf41484926a398cda30b5b9a10eb6fc8f59b1bbc1b29e21c0e29ed5bd4f06703fc97206c78d33b655d95de69c52c56236b8c76a30412ca4614643cc3d66e6f9c5e358b8c2569b9a6ee882edbee4291068b3940ccb3f714db76a00b4a27dea735d672d0cf63f6b1911528cb27a17dd4c7426b3b7254ad907bb16f83d73ef711cd9b58c2bbb6ec1e318c7711cc7711c0d2e031cc551fc17cc56700bef634039fcfefc9fc5797e7efe679163149c0f459bf3dd6f61af70cc19bf7db8678db29671235fd73f05c279d7f733c8728d769cb58cfb9b71c5025ac63d38723076d032eebd3106abe09eb9e77e72ddecb02b0bde56c97276c1ff98c912fc4963763330bb33be677d6439bbdf73e2f33f6b20924d72cbeceda73e3731f02d057ad9ef7f95dfdb0bda1216e3cee0bedb6c7b0a737653ea5ebf58f8c4321942b14cf2164ab1fcb505f6473d67d5d5f6d1afb556b61d7339c2a57c66e6715b7fbe536f500f99f89c33644229ede12a1053c17f9ba19318a55d0bc62af835105271f1eb388ef3cd2332bfee614b0e2ebf8f258beb1f26d9f9cc9d0e21930b5ab03d4ea9cb9642166870d3f5f0053b3f64c262049eb7c205b7905def65d4a77fbe6d9cb7bb9f210cb6b49676ac011ec812822c4797c60c4b072d6b59ea3357f382a32865e9bbb8e9680cb694b13c269ad2fd8e0fba79fa0be89fd2453feb7b5894068b06dce8610814a54b83a3ee8ab5226fb86932d42682ae3e47c9600dc482fa8863acbf48c68a5f6c39912652734d38320a4f93b66eb552cb54a294adcf818c50060b82054210d240dfe89feec892b1802f3652049f555845fd1ee9c89d01922865cb8954c32a550322f44f12fdfa134aff94ae010b17240d6eba1f5821082f5397064fddb98d7ebd0baaf65e70eb331317c4cb2f64f25de58eaca5083ea198525a39aeb5ce64b19e90491db965b57254bcdcad6015bccd7a8699991f267e4ce81017ac823560516b18c5ce771ab15b57c8624c389c32bff236c6f3d901d4a4738a403ba0316ba251773a4dd289054ff1944f5a43d7aeabbc824511eab68d3512206bf7c9b5d52cc86e562d1754e0ce1873cfa511bbcc2b58f4ccdadccd4df48777d3f929d370061b320967b0f38bf0bc56aecf33b8bed71e175b3cab60104227b57ad8c46912112c343547684d34d19a18425bc1118d0d5177d358a804ea072966686b96686b8c684d70a1ad495267e07f3822d0ee590ebe586dddddddb3c7c4a092cdecd36f3b8c8a81ce10444d0ed877ec3714b911112b5a8ba649141f9d7b5f1a26d26cb9afcbb4344f4dee55553cac98e6061e422106f0210c0a599658e9b2c586aaa5b00a88162a00a0943182882c637e18c26ba83aaa52210577a741d07c71a169a2885b41d37483468823b43446d2e4e0c19966d775676164d975ddb33fb1c771e0a7342ce2d5eb1133982d420931684eb0e2c353b01540fc2b20d6f373958bb27a8f670a6eab95e5ab516c1f510571ca8b99629425432728017344494d09162451892bd9c17d0cf5151e6a4b6a4b7a882c085163427482b804c5e59a92274a52b8a57d1a9decc432597e77bafbb3cf16a1383333f3a424152336119950f1301ef7d6dddd546cd3e9b59bce2db39d928e141393cc6662928aa6960298bad1dfb6c771bd0a3a60b6b993fc2606fd0e8a466cdff2bb1e573fd188f5ca2dbaefedb90634e00377bb3e637bdab70319e0b79bd4276dd54abae8a7cf130629035792fdc799db00cd6c635ee656536b2948dd1bafde6489e3ba830da80cf819eddc829dce362212e91fee9a8e3c9fc19e3fc17e15f8a42df6e8c9cccc350833736566a6cc3dba364ff7e279ddb86ed5d1233ae54a62915824165135133d9af2ba719bd7ad566f42e5d48bec7c168b264e793b07cfebc675ab8ea7e61113553781f2ba711dc744d54dbc6edcc644e575ab4c5e7d1e399d953cd51db61162151dd40c89d22d61174acc61b98604aa8684a986b474044a34c1720d49931a12540d0952ed48140fb1870dd9846c4236219b908dd82364239e10b209d98846a20f9187c843ecc15fce49760af01cc4207d2302b1fc747425561183876b2ccf2906b1fd5db774a4a866a44a14221e31333333d31ffc6da2917b157d783fb338c4ce6777177b74ab15108f63e2907d21352505c68b94d49aaa27a827a9a827a827a7d94da97b9ddd94bad710a87baddbc6d56de35694725db75ab158de8ac5f240ea7d1f08b65a37dfd76a2d59ab74bbd7ac69a32e5ab3a60aea492aea09eac9694a99493349923b917a4d1583011342a941971adc762616b39b52f73a9b52f75a37afdbc6715db7e2bad58ac5f2bc8fe57d1f08b65a3760ebe6c65a97eb157a18d29ee12b14451c9c1c10468e0e1dbd57d863c369d35b6ee05214d7ad88449c739beb1106341ca0893468d018f152a48d9a226c4ca82a628647d589cbb5224314090204454398c0a6fd32662ceb72ad88d32dff65308a30511fbe34e7728d480e446ab8e5cf946e607cb76d1b63b7ed68058308d28a4893bb11996244d55cc82c115b22b6c46cc8512c06c63df625f6251646c8901d428c7674976b4288b621424290c208c931a4c4111b22258ed40c29513b52e272976b475c8eb05cce72b916644d77224fa08edb87bfecb1edc3d5b64ffbb40f85a23dc578dc97dde3fe8e9d9220042b19905092c6cc8a9cf5da838fcfc71110589b73b906c4885bdaa755de24823aa58e05888551fb395d4a5fec0fa16ceb720d880d3520546ebd5c03d202125e19c52959c214fe293368d0e06f3203bf81d7f54f7773cece7f1e31837128f56595a3beece963ff45789d7775dbde46dd8dc7966dabfe934f90c312164260049b294882a81390a40b0322e4dacb3520396ef93331b35909ba6e068494171e6c90ca618448131e7a6c59f5404285a72c2b243b7c60fd38936406b3523b74406c5801798a726669051886f0c18685a61e4cc01e52803cf5f0d1ea81e4e96347d07e5809a5c8232f39865648226929c87728436b3c9828123ed57e0471bdcbb51fb5304bd21405dabc4caa6d42511f1236a1a8ad6aaa681e4da411928a661488fb201f9ffa6cef23cf074e42f71eb47dfd1b256cefcf91256ceffe374a20854ad89eabdf0fcb800a55755212cf07503c1f8ca443714a3ce616f366de7ceb6dc860fdeafbf59f8c1bdddb088024bc1e7c2fc8f5947ce1afcee5653e474571de73de5ddcebc1ee3df03dd02379fa57e484a23ef35f2338f274551fd5d1467dd07bfd8b24c105be3efc902481fbd77390f74dbe68f143d78b1ffefc46e2d91e4790f85e1d6df4cbb8f9d5d3b72183f5ada75fe3831bde7f7ff31fdc00df82325c32b87f7d0ca2ee5fdf77ff2279fc73924610723206770638a438ce0f479e8d9c56aab5b181790398a8a8346e3755a9636668000020080a4316000018100a8843e280388e24a22af90e14800b6b80426c503298064391480ec3200a8218884218844114640c4206198520a2ab00384cd46e0c59d7bafd9125bbc32a7a6caed40e18c6ad04599bda52527f09ca900bc53fe979a97f7671da1580f0a693c1d93b59201e84846789568bd6f38226ea3012680842569287cda5e2e0aacd80135f3fc88d9aa0d8bbb57d2da69cab0cdc362c14477331654405195e657767bfd46681f11d8da18c5811e6804ccfc5791710270de845c8e80e47777d841963158d4a05aebb8dd2e797b93b6419e49a94965e55941e62a3bd63da2c81183766590e2ceb1063b690323e666849a6f0b639d259b9a78dcfbe355e4612694d1612aa6090cb56589656ed1c5d16f196e7d71386296e126f5e7bf93d406aec85eda9ae53cc689a6cb1a9b2803fb50c0927331f2d9770c2bb04855879da0d3df7cecde6e7e24866f3951d7f377b17c7a6792d4d8fd247f2a328382c12d0698ea4cbea978357e2a799c9cbe56dbf481c47622979d1e27f319fce37ccd1a5d15ce6ff70e50074ed95b0b67a166829d1effd4c1156775bdf55e399ad99a5e1fc0aa9218f5893269fe6494c655425724ee15e6bbd2721d8e616af1da33227aa892dce973859e22c9f2cdfd55ed1f11019e9bdc8be1da05f74e8758386b6673bfbb34ee1c0f6602b59f789014b5b66f2fc6673d166920c0eb3c4ff83c877794e2f4f17c89e162fdde31ae53d74a8fe9e40e03bbab4367c0d6d89091aaea3d59fa06ea5408292f7a2066cea393a38846953026035d10fd087c8b2e1acfa512f58a65081b2a020179a394407bbfe366a88fd84f683f28942e51cae0a04544e96a2f142c5c91165d5e5c157a938bf4fc8d6c8193abe1c36cc2c678a49bf87e5a9d870fa2a88e88d8728c7e728f30182df2b3ac7175f3eaad8936e95c00a2e283b37fd1802b91c7d6ffa1d7623df858d3f48dd5e93fa00e143ac5c92f8db7f9f07773719e86778005eff4085aebdfc2d06e20de52e27348f72cf46f434348b250db126c94feaf35451755d61d9882bdc38801058f67aaba3400308622628a6ab0d08941e405029b2576719534f349166353c2e2aa575fd879c9e8f2328b211620ce8811243e4be959d899e4aef82cc0f9bc4ccb7874403e10f340729a8f1c0c2fc32f80865d1b39736cfbc4b5e84ac7aa039a3944564c4f3dae647697e59d7ed8674d67863fdee6e13547ab62f6d79a81e83fb0c80f454020023f02d5ab6233ded7d17805073f014775ae2232954c03ab625018c81b24e9c2e75438bb992a60afab28947d817a97c58bc98d45e4d7f1f4d0ba76b4f9a4eaebcf8204f2ff7a04cd0b79e721bf8bdd83693cf95b75c557e4a1c5e1783b45450206cbabf09327dc08c1c268995474c855cf3a91e51b213a7974a42e5eda45770b0647298d30f997390c4181f957d49b3ceb55984720a2277186f34f8f9b8713bdb1644338c919784c10d83d716ebc41987dd03a963d18297e20048c4cd1e4ec49532e83e2019d71dcf77a41e04ebeef7372c7068cee399433a721204a71f9d40589325840b856e445e2921cdab084a8e68031d154d4a7a36f8a76dae7c3f59776aa39f9caa431bd481d7b0303a998978c6cf3d0352da421be8c3be62234588eb31a5466803ba56eb7b044b09a3296803f5d76c07db9a2f425c01135f406b15fee5fd178027f0222901262775ff6ca0cd72473ec302184dfe154023f5b0aec169317f619e2cdb6d44cc5f76af5476649bcda171459ab5ecc74857b2d9260d1b18185767228ec6e76b6460ad5db18a48fa824906d8b321e9e867675c1ba6b492bedaacb94b4326f7f52cf60c707587344cfac2fcecd593601b57a84b3be9cb473101a373d8da6c8b924789eae87423c4370df9d3452bea7352faea303ad632813142f9651a5ae90bbd7a1ca4fa83cfb06a2153137460365c0df62a6a625c0cad79b4ffc35d51308b9806e0cc571c44b89a347b5c6b233e25b89f830bf802a9f6535093c6c6788fb407ba49e01b7ae2cbaecee6dc436ab543d41c7ec2ae9acae3f0c33b3dd59b3b6872dacb74a0fc8f43e2bf7a4b632e1df69ae91b0b3e7d7fd1650aecaa174553393dd54b6c46da1402076c9997196a244ec03128f6611f5111fea90ce9821155aed6a830cd8dcd8527db212ee19b8fddd63c51302452e0ebb1fab3ddbc5881fca00baa9db225885014d441d0736f98aa9002da76cf17d9815a56d482600ad6f298ed780d70d593f276033b4487683f1574e74b4d7e3d0624240baf86553391c1989d35c53ea5597a4624bd8e76f1850d9480423c377dba64a9ba63d62df2d86b8e0b0175721c630ad853c498cd261a694fa02e697074681b238e2900c4cc5ff66adec02ddac12af4b448fe04151f22239e5afec43f7c7647fa35914726b838ebf501edd254e93d17363e3bd45e5d7bca10981aa2ee5eaaecd3fb1401cd5d739d6236b3a1c2d25f8d08d3f4e31ad262f957851f4752bea7b3819cc0f392a95064d29e5bcb2ac8bad001aaaf3338aefe0d220f3cb322a553dec8207e327fe5520b071a2818b940eba6fbac12645d7f3373743a6305e31530de558cc906733e10b290373c9873c9759a5ccb93a8ae72d7692cb72bef58dae9fece3660d8e4bf62c2ba322ec9c43c1ca1e1ab616de9fec8823aadfad67a2ea2691e1d9b54c6fa1a12c0e632f903ec7b0252a7b3a0cb98bf6602d0ca2ec0dc28b396b641ffb2492a66eda1fbf80b60e7dd64c49e8a94497d81ecc81502300d55a9550e6c707bc92fef1d709e899b5eef00d09934b3ca299cf8eed004b8f99325dc9692c05eade0b207454ab69fa1605937eb66b919c617067da7bd25b03c6c206de15292a2e4492652d602817da3589079dd6d3fea01b51882b91c8cbc583b91fd8618519fd17d8e28742743356c9c82979db1409ae2d403466feecab779855de7769a07aeae260b7a007bcd38eb286346c552666b019666e09294889403bf65929a42736c83237b9c48a56415e23f47d5bf47a33a0f632fd3a76062fc68930159bc8d3de4ac2c4d6327bec50d19a56b7a4719771d3f677c984220e45518e2e38fb9275d0dd27a666d8fbd1d90df982096cd8bd7b122c751339d3cc09fbb28af31964e0f6029ed5af9be8007220ab40ede6854a2177f4c9c0ad5249e3758aa240a206f44b5b37ab413ca9094dd7285d2f1dd2c79c31c3b8245f6b30029f6e50e1981600001dc6e0214b5f9b7a43702620480c87e161045be572447704c18845ecec0a240127cac0888850da1cc310588ed4de3184c4c925efa9b861209fa25d7c7c474ab192e348afe4756cda4e72f79e9fcf47ab19a2907d1563b83c1d4d4fd8b428eb674019d2ef8284bcc72447606c7ce8ffa81fcd67975a4d944104c9f0e5a175093be2f9b1935298ab01927389fdaf42df140ecfba2915937a62ecc55bf5faea518c756c9544c2142500f7b2d3ec86cbe8eb3e7e5ee167c315266b49d4c87ebd35c8e7f3f81c9f1ba5e15b251cdb0a653b6d73ede674ea123bcc92b351615591cc0e131ae5fb518177f19b2f658925b084c2ba7ed31752c4d1ee7e79465da1e077ad691c917f919d9c683ab1d59797250fc19cfdb9d820f20beb597ee75b682fb9f37907d8c14e382697189998e903a605cc084103fa35f6dfee18336541bc49b7f283daabcb41f0ce56d6ac6bfabb9dc8564ccb66f5398d50a95e79c26d73779147969c66a61f38f54ee07724f8af5ced7b9c6fc9afe444f9b60e5e12b204340c149448115a7ed28fd2f7e622484074db35d8de113506560b95176f782df248d0e1f9f321adabb20b68d5180185635794352b8cc81a77220591b5a0ec82f7aa9748729dae54100ea9583517b5d28039d1f295e1153fce85c54ce198459791015977a0c5af36e34c207e2605b1393c4808de961f723e3237e980713e2960b089295ce8f4ee9b289fb37ac8dbb4eafc4cb06c87103246f354f3cc1468fa899ae6e16799fdb178467840a50bce51a618b76e312db602b6e096611160681641f76393bbf0644075c6507c55b8f8d890f07911d789d9b3c1c23148fb1c55e219b37f83ce3d1ee250d18ceb561741162c8890168515e77b5e768b70c03d0f383367852b292d4718c72f930ac3756564325e5f31d5582998815bd4a531f31aab136bace80b8a54e9272a953ae394fec1e36bf8e57f78a50a7477c139dee685cb012f11b5b6af744e2236f9905337e0c53f16e8224d66332359b1b330bde6ec67081ca7565125314e2a090dc90c44070b3ad736ea23931b4a3578c14e7f06ec9f615e26dd64eea1addd1c8bc3541cbafe1e8bedf0e1482f87e45579fe9a8041e356dfc35ce88f0572aa271c6dec498afdf52ba0febd25cf44505abbe1b2573cf08be97262914624a76b7bca7c4b43ecad43381b53911fce40285a8a95c707453a509e67b70ae1ca41e559ea6402fce09ee1705c6b4f932c9b43aaf3c04138c54e22418cf8c42f1101454b0396b556ac254c5554c56abe82b089b30631ce375bb0082c1bf96d65af40a02050f5c18176d19dbc858a59f89def2ea4abb3233901b0e7c2543e4005112d8b6f4ac8e9bf7faae29b0b46a2e138f1350b281d94bb52af7bb93fbd3f3935e51563c8c7f32141e7b27314b5e96a4b3294b30e9b7d56c81df2ecbc4fe9726194b73a0d583086c7f446f58a07e04aa256c27a044a3e9e79d2b2209664995250524dcf664a600e2b6daa74accf1f812cc773e65454cf8ae9537d07f1bed501da43519c1445f99d88b42dc9a9859fd91b86c92282b5e9e98ac44a221814a2c657742fd26329b005dbbbc2774bcb4b8445b9a71a8a586653d151a3995d1427f5cf3541463a87d267154a87d8d52032478692eded41d09ae9a0594a19afdcbc8432920034512630e67cf0817f6664e48e4743052abd3d31488f36fbaa31130cb78d488f3b26ffda4e950e79f5bd685c48421b3b00bccd11b49896401eef7bae27c7aec4e35aae5c144681f2e1a9efaa10ca291eb7ee617b481e10277bafe2621be681f5ce1e63e544750f9dd7ba5bdfbbc4422a6935019ee29b158d1af9a62134a9d01e8712c635127e4c5e18e4834d4ca6534eb614b7ef85d6bc097c27bf1582b73d44b2a9e4418b85dd9522eae4b04f744654be477835b10b873b25dcfe81ce23f469668992eda444a64d3b969c5e6b5ac601c1d2fb72e1e733673fd0d5e9242de9fe2c1bb84fb7abb04a07fd2e16e79d204166c453b84f2447c6a5942e3972b120f74f1a2c8460954541b1e29d8ee993925f31a0c6b995ea37ced7844147181ebe8833cad846ae8203a2254a8cafdfa375ae2f215d4b6ab0c6c5d533e8d1a7ede3025422849c3a329a48bbb2ae95be3c16de4466b45a95d6c674e6fd7cd40c3d274e517d73695feca5062b461e11cc0e75c45f52cf9514f36dfe2c15d6deb6182a2ea28c9e8d1ace29dfe6570c4e997a756532a01b93a8ede801219aa64562a4c7290bde2dfb0f0ba1fa811a14c1feb850a1c6ab0fe0a290f388a5b8599ad59012269658c1f3fedec4d8142d87106aafe849ccdbaba701c0746de0aac3e3278bdabc96c3449dbf66eef739d1636e0278cad77503a8db302a0fafa30456952889135b93079ea40f80281e1de2f9d493e7a0550af511a1504e5e6e6946c219d04f5f68fedbd3b399bc06119d38fc444dad1cd6f3030fcecedc30ee50f9d4d2d2756ec6b50727b535a009e4820834de501d20379c0bd3f3c11fc1e69320fe15ffb9e26c85e8bfa856d54fb6a1b7f5b19515f2e19ea6a7a069dbd61717b688ea2fd1b672460af140153ded6b670187edc021d99045c635358829012cdb9c999584d4f5798e74d625a26bc7f13a9c8adcc4621e94305a3f210a47f26cf4a64208e9208a133046ca412cce925c2f549fe26e716650d90f42c09dd056de0027e9c98e96fca30338c5209cb917a1801eb41df1c4911524702d027e7a545ebe45eae212ea5a74f64faae64b98167cae94113c5117bfaf2802bb32665bfda563ddf96fe98b2387fb14c592ba7024f3bde72b39d15e6efcd907b471765e2c237c035b8f162c7f465023fda43448423e06b9e4d7831b8a6ef4fda44e75418a13ee7ceff2c296493f0a888204b31da1020e8b32128ec0b1fa496c77702daa13801715a84cec2dde30941fd822ca37d87217ea4bd037ff8d5dfebc2e5ecfaca07e0d583158947f2f89419a4f2a953c51baae37cee8c99331d543fd7914da9e98fe244d86c2620a6656de56ada7443556221049e6f4771496fade1b2c7795176d088c8c4926212bf302a4f49baa8ca0562db91ea16fea6bcc6ff4e49080123fb034cbbc486b7d70dfa3201b6da3f8836c5af0856a5ff64615da1193d2897776ae7b8932778e26b7e5e8dea00ac31e659aaf2d94eb08ced06bfcb40f4f782dd06e0023742cd8ebcdf8b447ebdfd18122427b336feaaadd5f96af41f9e0fa876fb67aa15b397c196a2031a1ef36fc44e3da119c21a4fa5799361de3a4616b3ce1d0184e4209ab323c2680a87507fd54407897bbf3ee30171b5304da2d85afb61190561a8091535fab645d378a822a564146b96b04743ba1bc0b33a7ba04cafe044bf8f8cfe741468456bec8bb22542f26ddebe4d64abde541c8219c696385c6c64bc953864897f1017f4a994a71550c5e78ff98edf6a36da50751b1e97d8de941680372666f879fb303c26785aa5fedeed8cd202faad7231aa01b9a220096836551a27df3ac72dfab935132bec72f16912fa8c887c4a20890931085da64a17e2ff1d3ff55d53fa90d10018c648a29d963ff0ca107cfd69b93fc303783c1fe8c634468a27bde048bbfdfc50167211adf356d2909c0924adbc27ea4b8c36a54247ac9a1ee9b2ec1d7bc3794aa2d751f3f1155c633f37fc14c42cfbc5b2f3a9737f8deade13775bb6ac7ee2f5fc6fc2a40b8726b0f3e2977ff9180dddda0f25c1355ba33ef80fadd86663caf6c4f407074cfae27a048f85fb8e8d52c8e6e88e49cda5255c62f8450e2250b43244f27c4ab8e7441b7e4caecc801481e03e8de27519a1d24209f2c29188c273138ca6b3e49a040da8ba49c2f8bfc1540e3a6072c6224bb5ee5cb5ecfe30d52ff2a538103166f6e4252aef6a534da051489911ce182ace808366a53795503f94aa7d764433a92da219548f823f82f4473b8138fdd162293d6c7409bbbaef94bcdf25bdc398fb3f4b20313106ee0885f6f0f072a7f4aaeb2ae5cfafc72866f345e4643d7b27d007f624ac74d816f528d3235c7b5fc8a033fddc85872812474312e9d2bff1dc1a5aaf27ecbeb3e4caf6da736ab75ff46911f574bcdb5909c1560e135e922e52d16b35085fbe4813c11a8c3d07511c0e0fc86786d3fcb0262e8864c1e5ca0f91dab1d03faa8cb59fd7f1508c12804ea27f78d4f483687639aa4c6306ace295b9a4d3cf843af515dbcd8b77d18dddc58538ea811f7c12804944ca2914fccf8ff8de265104c341c8669b02d6137f63cc0441659a3ba08f0f970aa8341247aad80d88a99342be185f6c7924c62180bc01909b82b8050df128217832ba6d1b43774ef749c626594269c85950f35cfa7afb0586e5a12ea57f71018d2d2bfc9867938b6a39ca61f889f40838877d99b2e7f26ca3c564e250d083393446ed37517d1c6e204633900bb93a03cd69ec5a60b9984f425b35f95a24212eb963ffda87c81ffb51ae17578fd398639cfe85809d13bb7293edb6ee4b3804b0e015f443d0c0a490a9c99e2c9d5c33103ed070a616c3b88208b6e652289345a0c0b50fe48d95b0d3e0918feb7c7ebd1d8172fda8914631593a82702419a7a592ceeb26bdce9a1dbc21e63954845a617b3502cebd833d26989c230378a0c4e6ad29600f8228e05d53fbc414ec66636a36b3649fc131920ee5ad930cd0866e93a829c8d3ac7476a3dcab44f40e9cf1df38f252fb32f9bfbe78b789f2104d99190f28de5bd9129f322996f823becf90cf9e0f023cfc352198e44862b05ca9d8f7238c4234dcd8dc414c4d21a404c83d60204fb5601235e9d584c87fa4c68cbfd2041b172365a42989337402be68215064f85b0bd0071eda2ab6dac3753d8ea06a72ea7ad8a54fe982e413bd0201e87fefabe461fbedbeb6432ab755338f3cfd37d28750055ea640725fda3bae980a834604ed145d6b4e5b63d99c1c6b34de0880034c227ce464b05a1c44151ea97617e3bb6f1153b210c96a598fff8fba1fe2aaab0c97163c266b86e2afd14ced11e9d1afc6716e490a80cdec085bda03394acec554626e189c08761903561b021455a813083bd75ec18c368f0942548a8eaed97948841ee123e20d130c44196be749880219597f843d31682b6f89414405acb4abd385dffa251c413035e713051ee62174844273cac31aac4981a3b76fed0c99c661c7f33fb89d1daea387288bb75f4125c243ca03f5a7a0a9e70e912072f0448e97e5f4daac63e984a690f79f4245a16bf0a7a5fbe16236e3568ee6afb3637679451083d3da4cd5dc690d272ac9a0501e1df2aa787eb9643d052d81c658c9a3196bebd7177f549d5b9dc2213f0d2f6748119f945b49ca7f97c5c9a4fbbb5e818c5738e34430ef68cc1bb47436448d9519e1aed3523ce99e1a2120fde61a0063ecb1681c6ef2f6a816d4dc28f54a85a408cb87ce3b93b0989b078a00d5aff7c4845375545377399f22f95b3ea5511300e3a44deaa17aad751267c7f5b96ec661869d4cb0011d71133cb47074bde6803bfbf85f379d6634b4a4cea318ae11d19af9e918df5d7d3cbc0d899c4f1f905d1f00fe697d26ee71d9934d0c482f488634c12bb5834432d4bdf17d3526360244eca1e75c4681dbf405c8669a209424712b2af4f059344f717ada4f9582fa8c3b935c0ad4aeb70956d3d9480f35f6ffc2425f5ef0fe8c2dc324a658761883d74664dff514410450de6a06b34dfb8abb4844e86ddda99cc4854c35b0780774f9ef17451d1103754355c1ebb3966187b509b71767e8ebb33ea006cb4d3514487ba89b9c22633503a4db57df9895209d3db25f4208f50ca724911658a21d4568d4fdfff0223e0b5504272b9e6bfe2f23343ee8af2a74a43c0b6b93d862b8023106a3e2e523cc5979d5c0aba3b40d0605439a7c5a4d3ed39c3e54568fb3d31430e51a430ef41c20c1bf4555bb4090dfd1aa62561155fde2fe927eb72450ece3c61375912c3af25d11f751347df2125d5565ef036cb1ef9a744169b74cde2e4359ad3ab47434954a7c30b0cf25e6dfc866baaa4cb455f8e231dcf484d44ed821e3b372d33e9f864396a52c3601301d7d8f149235cb8e824702186b27a1e532a950637d6e01e583fc0b17637e4e4b38987c5dba2be4e75dc9aea5ac39781c244ee63de800414559450df592f209eddf32cf1dde85c503704bbc071b084bd214c7baf5826441fa254bd3619d6b4e6bb56c384a5fb70d4921038614fd33191640731728a74b6c40de020eac0e7d0fbf4501216b27b5fcdef6ec6a0a663d79799011bf59e82ff982a10e1675e48fc26228037c6ee469dde8dc2b32523047678c7bb0e1bb61470ca488c64048814b951460bff50463678bf929fe9770614c50ecd4f8a92d9fec968026ec24d8edd2e5bf74b416c67f249e6aa00f843b5ed008068cf14e5d1c8bf54cded3fbb805767e900eadbeda1da23611c81b5b7d90fa7bffd329e8165221778bc33297f6033ea41d3adbbd9fef942b1aae4702b0a1a0f76061a6ced92d8f25df1c15c89f67ac1601e72a38857fb20c37646956ac6677013c4136e5b128a354fb8a8d1fe4868d3f5d6062a9dc5df9d40fa39c00bc8c0930e1010e29e116d61b9d5a723ba0563660e00584de65095f18eaa394ad829c63fa240e1fea4798c336502772b8b99895bf0b097b11f88751ec5985224c576a27506ec6a96e49ba61ee21c625dc7ce33deecf177c0d67a726ca4188492a7e98ad1978e0e0f5ad9f7d6c08863955c40c3e93618f0654334de8109ae7ba23498c87e8829df2bbd59a2481895c0f5831b4d298ad4d2829831386c38d89579d408ce71aa8b838676c4875815d3b78a42e4c65ef915e72e8e291cbd5ef65d1b814ad8f574e3546dc9ab90a4030b585aeb8c436876b966e82c9ba0d73e1ccb45c8d875235cbeeedf4a6c7153404419ed83130fd9dc50946fc90f07418be0aee1b182ed57cd0eca3b4f473f0338df5c35e0be80bc49a9856ab206a38c6e221e329d98329a6cb0f4e64a23b0f904a72b24c9410bbdac7ae58c7956ef0951ed66600842c93d3648b880168f6a392ad33f2e830934bfa00e94172ad1f58621ece710937b4a83a131d4625cdd1976ca8f784664d0ec0b27f79fdb7000086b3227b14744fa449445a5c4f39942331311b74785e621c859f8109e31b518ef5260ea265d38422f0645126365a66f47f167c497c4b515b51e212bd44111ba2c332b0a01ce9e7ad18a72a3c73a1c3edd30c481a9dc330e9876e30b0ed419f6dd8214c600ef4522b6019cfb2f7a7d0a2ad673d3034f2114691140cf8cdb36c1037d454d2eaf562efef18fb25904ab91f7ba24ac3c9dcf115a410f62a4f17e834a0d3475bb098c642f49faba930f846bdcae3281528ea3f9c7d6a38edc7833835a0c3584276099bc811706ae6f26eb00b65f296294395723feee7e3d7ef5555cd4e2192e537da8f438d9e1b8d73904c904331da1871f04b995ed57746c0227e564a9233707b3650bbc232b831ff14acb515f4a8344cd48abd87ed2a740633dd474cf1aa26777c587ec813e490f4142fee26b2368186334e331de3b82c35085b24d31e5c51f970623b9ae91ca8541a928d62fcde38903bf5bfea6e7bf8fa4a8ec2f184f699a4b413081a4f8ec214fe69133fe265e643d6d07f1b684805d1d49210d742788848d96b4e3da0a8a5b0d55f96017180f96617af54df2a9c0e30bea63fe0bef953483175993d578ef6f0c54687742b249e25631ad67a307e1cd425a22cb5408ea72d286a705b2b9fa08b36aa409a51555e031791acbc6134f3c08e06ea74e70a5cb5d47f64a07073407771e182792a17eeac25d7de4ba0916b536d41fc9d888a596d617320b2368318a3d69037864d4d1c3867b8da5c9b435da1dda1b0aac539618b8d81105784a11cc69bb4cc34e0e553cb381313ee0189e97411cf182999ed041e0fdcf35a9606c77a4345c72fd500706bc45467c9c10911ab0beb063fb020ea632d2039c638bf180f7a3788c4011299d7f6bb12f02fb850045b20ad8e60a9f0d5ca5a48d95b358598b506a49125bd07d969414a5a0aa52f675994d48688588ac498e7f04534c96032aaa541503aa5d47a980844e269433987dfd031804b9ef5c223cefab1ff4017b82b64b42164e9928a6af8e1aa2535c51b876cbb6840dba2d6f8c22e01e821ad3b8c4e3d5b2982482e485d131b26df2ee67e2004c06134e6687acdfd4041bd181301333f5dfec4f55ccfcdc3cbf4af05d60ab564805130e5efba0c5c8451971b31d39f66030c1c7962a8f9b07494e8476b61e9054b73484057e1a6ea535830bf54429a5055b46ed8b5745285aa4fc400bc17d626a46e7d33f1035104b8865b9c5cdedd5f3c2642b476a0eb491a946e2035650492a9ff02fc871bceb620886daa1222aa948e7a8de66e28563feae31863166e0c33e6d19d5e8747f2080d6482b61a3cb0377c8ef1ba1b0692dbb6d9c9102ccb3017647f126fead8755d6afd00183fa6e55b392a819a8f6a9c831651ec12988a043be46707a84b78f92072a82240f9dfc8eda434910c035109e05cc27a093e80c48108af236617e48e0c9ee2125874d43d36651cdbcb97c1a4666f04cd8469cbc9fc7a0d31c8bcaf03e2c8f38c603ae58beb18d8a7003834c5fed31e76c70de8141158ece895968e0b5aa3f8055c412fca42087b0eac8d17182bd8e714beb71632385e8050f4d18b31df9f1339d962f3c51653fb82e81cffb29561da3ea1a848724b75ccbb52ea03eeca5e3c166bd04aeef155d8f663722fb079586c75836b9df7dc79757f82dcd557caeb9ef8d1cbd904ca58c6248cedcef3bbbbf29e1d4dfa5146d4c9bdf95b6e546d3043b66507839cb50b07ae66df97027740ab070fcda3015ee91beab8464a85564f2addeba0d5a6cdfb44a1eec46eff3c1b562c44b6ee30183925fce5aa5f0bf69fc372f63e5584d895d7fef3e9af14b2882d940d90fe35f193a201f3c601d8ff73d533bb155948cbbde86554e389d857f345c9d56ba1827a8af9a560a977640fff78fc8d4681d222302d0a40a3406911983605a255a0b4084c9b02d12a505a04a6cd1418a06dd58c48d5103b60fb07eae5ad069fdabfd6839eeabfd5c14ef7b7d5e053fbd77ad053fd9756ef60a7f603debdfe541a92cbe7a4bc9c76196e524710b292b63a9c830efe4cf60453ddf3c6146019a7d1ffab8537481316d7c13c4dd854644e6747d7d4ed39afe0ba353f1148c234b86e051bb17bf2f09bb770f5eb97e05485483a3b61f3374be87c507759461f0fd3dd9ea24eac4f18295862bad948ccb6aa7b5203bac9ec5775c35a73e3d65d9a5249f46aafa3756c115904a296f924c084a56ee8f78728c6ff5af71d55ab56ebcf277c0505d41cf670519a40426ebc5c0219c158a2ed8aba533c976371e534efc417b55d646532acb50e1e45a6beea232b5c8d467cb229c082839f41cbcca5ae872c052d9cd170f793f5bcacf97d49222dd8e5d0eeb3a5714091bf94d866af2f1766dc40de803c66aa198d6161893d691345ba9b8e06b86eab80ffe6198005a720b35416416a46c3c125cea8f87641ff0c4df8f085b3a9e3bec34d3834cc82bb66347cb765a8184f8439c010cec3f80b19425e66eac25cc1fa5e239c9fa1d992a7a1fa8fe65ee1611a00de10dab228839c746db558d6984066349a0f013e5e0a076843f7f0ee5f4899d12888869a3cd8a352337fc51e8956339aa5d24e412fbe1c0961cdbbc6b69cae8a2c2ec134e7d255c33abd01df53c83ee18d0c3a26d38c4302522dde4afd3db825464633c25449b864e2aea0d117e528cfc1ebfe7c8aeaab57f6d0a0762a773e8ba5aa255c4dd44343b95f4424144573354fcc4904b7ace4310b385ad7f229cfd9943282916dfae8c848784680cec5f085409dac8285c12027061cb289833890831c9ec31cec409303ee5594ac1850d500308a9554586e6485a7b6196afd4365e223abc83236156f892f1855cc2ead6282379543791f6793d291036028830cc1abdf851b1a7285791b4714a8b4f18eb6a51661dcf4130115ed8a3b7ca884ac02dfcf0d18d6721d42a0ad8d3fb689b2ae02e0b6bd3bdbce727e51b0dee61eda75998e2060d5ee6fd3be8497db6f55bf3a939122c619fe16cc94f2a14767d61e6bc2cdfb79dd5aba1581ea62c352b4bae8de90c36be90a16e33198caa0d0024bf482ac5252d39d3aa33bcdf7ea2e7a58042c6dd8acac3c1671914440a33db5309f053114f06bcc8692aea802397be7cf79043e346ff36917fcc5d1676dc1440b320ab2823a7fdb8af7ad993c7316d2149c7900b4377f09e8734e2ca04d30a5518eb9f6f219a56b421e3202a683d41be48510ad104797341683b420745cd4dfb1d59c8f3a995a872f6418a6a742cf1f0ee7897de661a19394c4c5836c8e07e4cc8af387bb14818389129f9aa63c2078456f219c732e34f23ec458d939f39f5fcf641d28dc5d25a9a78b42ccf1277ddda99f04d574c352d5ddd0391e6320293ba963bfc8f39aa0098e2011bca75542e34e733b98e282116c88a031aa58d480ea2a4a797e1869b6ec59c37d82ba33a0928bce2ce5d616b8c85fc11ea3cb18c45a6906b42f66c39b3a4de65564e312d990f7ddea484ea29ffdc1a727ac94f4b613f60773725a0a301372cf44678ef79c990a4b892a773d0f91ae33f9848f756fbc786ca48ea409b9b39370fccacf02392baf108171810ea6f29af1593c577470bd06eac13959efbcd58a746385a2b9a4a028894aff89107d36c84e473b15f0499068456debc4e84c3addb7a20e5cfdc31947a37d9981c3d2542560eb26f31144f6a28909cec6908e1fde488900fd5444585ab7461c235a015c864c4a033f274992202cca4292bb0e90929b73b824175dd007ea611104b74b7aaebeb93848c6c3f82a1ebf8cbe1abd040789b43570f88b34a5cc66697601a088931fcbcc38718c043b6dc99f9dc5c436776f5a59c480710fcc18e38f1ec39a539adcdd4526f4a4bd7baf52b02fa7cc1f49411e92621226271d19e6c1403126f2d80778f211b0fdb25cd6b8106153b2cf6d385ee51b66f7ceb13656c77acadcd343ba1b251c0724a4d052d2d200cb0f02365511eaf4c26fab21f0366fa939d7a70484b2782d77a3e6182630be3c82dd3f3404a2bce723f7456332b7dd77d89313d5b7939f0756a279a26394d1e0c8882cc482f8ba84cd48641af32deeb1325c3c93693558807075b9155819df173136c8c6db57a867a0130969da7bafde5bf0bab3493588ebda927f7b3d0b3fe490bdecc5f7b30a45408d0cb678c86e0a7daf04bd1c0cec0629b98ae1f5205f5a1f4c84e9078eec32bf8d95e083d03a4c1c93c2acb61425cb887fe6a14d952fb0de2d0fa1f14cb250d188da26a5fc668d8a72f4de9d236152f253dfeb6882b4b1618d628522b22b83efc35edbe7460a917117e4d4579384e24b0d4e93721429cecc27f3379b56f43485d8966f8abd9e04bacfe060543b6da6f4bab1cbc922e02f203bf7ec4ae43f0965ed1813a840832210bae96f686e6421fa83c16b218f2189da145266b36d84b58dea1769a7146bf7b33e84cf0278feb53743e0d6e9a688f27f0b8ab5ffe96269d8635affe2e4a2cbae9336b0fc515e7fbf1919a09fbc0ed0ddc9a0347c78d0a315da8ec8ebd089cdd6192f2b2ed8f54eb9dd0823fb0aab64891e0762a0cf48f59001e3fa75a3d250485bab5cbcb645aef14de32bb287123e87287834c5dd787bb1ab4111c2b1257df53bbdbc41798a0591f93a3caddf544d4f82dd92e7e4eccf468a0d7a245c26f180286d9663af7d30e4300aaaff050114628e5466a045da3cc2af3b836775507e35588371e788d296fcf2a1086996408e2c88bc4dfe2d37fbfb69ee2231ebaae55638eb6ddcedc3d24d869f2e6929dc6c85f56a225143c60d1a85185324cec5073c9690bc8f7bb7b46424a202a798207278a3d7b05ba8d18961d213689d7836e837a1dba42208abb70530bbb795f22765a3f43c2a480f5e7457b9002592b0595270abd73e059a288852f0a5203483306d13ddc2c1827381e9559f1d28a806228ff8f0773403fa6d521460d7aa9d85e5b0dbd1e3246377bb763a874fb455fa2ff1ba9894974f0276b162a5dee1c926f6e0866919fd7ee89bc318dd61b24584f0d1119cd3d6ae6d37e468a50d791b5717e5a229b7643b9c2b9dc98cef6321aaa5043158f52909376ca689f040d8ab81d8f3a0d6fe3849bd3c28bb86c3dcee38316fe6fbe9cead90afc74c1ae9a130fc636d5970e30a4d4b660e1d735132b18b7e8a7c95bde3aec210ab0c6312c4515499b2fa089c9f0ca2d85c2d77e95ef7d9e7c16a25846f02809977641b0fcf12f6d86d2ec28a7c018b4bbe03afcee1e2a80e3de1791a01c3080ee90760482654e23d9ffed0033d6a220d7880b5005c90faeb62c973469f1f7ef461f747acf3cae992b754921bf6e546effeadca0aafb22d1cdefeb01eeead0740e474bee26939326a408935719f9063690c03c63f3a12853487b86c419c9031f358217e13e0af01859eac93f882b71fbc893fdbe147269a9699b2f655c1a541475aea68cd6828771ca141f8bcea92893638f5c650d30c2b06e5379dde510839a715a558783509b2c029f90bd077198adc33080ef03a577ea6ee426736d0b08c09819b5c043e40d2305ce5c9c6368a90b08bbb660d5f25081695c31ea4883cff5bfd892a68225b0dd583b95d92fb8a54c2e0d6c35a57cb0f9338b8667e9014e9d069ee1c58a5b5b2b8471c583348ff985d69ab19b8d374eec02c5c08e64e651a3e819adbab98f004fedadaabdc3a06b8726e6f339d281fdc1dc68e4248b9aaf278320c3e6d6b9893cc1273a1af87485723c627624338e4052269d29432702f98e1c11ef19681158bf296ae6b5d163d2919ce6590961063b36d4b04ca238181154b767c91943f2a3893511a2244d5f3b7083928c9ac995ce22c21d6fd89059525d5a98771541d9d5825d389c38ec759f611f46940417d77af4c97cb5a7555d9ca9069e4a29e8899d31911838cfef603c6a42e6655188c404025343ed17e097dcf63b0ec9eb068cb2bebebafe9abc14efcdc385e0e540a13539ac4637041b044a035f26c12c093060f143eea032c52b3921e0937893810feb7522d757475007fe05baae2fcceb29cd436af3159ac1e8d579848680b2c2b6384a207083bfef6d1f4eab510f98b6b204d93c66e224ffb7328b48ba19dd94d93f7403ac7e16145e2181851b0532ae901f3d7c5cec19c27d804c35140713968dd4a31f7086e0a4f626bf7346bd01b608e7a942b7303f4d22006e456e37eb24720525cee70fbc3251e9eeb62dcdc15f16c65b683f03cdfa1f78c274cca73069808578724e34e063dc1e6a29bbd0b38a7658e46e9cb74e01ec836aef121a624c36fdef4eafda4c6444ac2d327b57481f38d5feff5066edf69e3891e85a6e57a8879e50db8ba88e80a6f43b62c08da564696ba30e4045683bd78642b29129b7e01bf24143f13d9728848f6947af7220c1d59c7665d8f5c754bdf2c687702da3a4893e8aa43fca3a490a6a85bb124599df75e992b636a57a67eda11e9fb4def6c1a293be3a9b048d6367c0c80fc264404ccb7fd8484870fb823305a5d4ecca0ac5b7d4c227aeb5d74765dff6a93c9775e43064d623958ca9b9443e77787e06284e2b3f699ff71aac7ef9875ac06e7a2552c0cbda2a54d415948824b04afc23cd267951a69925a6e372cad3f714e25d9b3e7025991ef24cdc8c1af9941ebf9ea2e626414607c796141498c3a41ba764fc99d23435557044c03c014606cfba55abd2c3080ef95ff5d05d12fa505b015a287f7b0b5ef04677ccad90532137a533b880a313fe058ea93036b0211224a0feb23d73d35244b72da9b212a219139b9a6bff776b9107be96b1f914906273e7b07f07abb7185028dd1329358d781acef92994ba220878bad9a58e00acb404a5d7edd12b3c6088a305dba42c9b00f6f2b27bfced10184c1268a9b8a00231cc2058ab3b74cef76ee63112f9b48a8f00e9a09a9744fe3866a2de774bb80afd90b23a9d2b216fe7e73880fd915a1b36fa7af6417794995c3068fc8deec741c617a5038e240634461e40d3ba410af7eda16750373b7c38e16d7255ed383467d0fd5fc6dcd0c3a15c869a5a5d96c5e9df405c19b6bcdc963f94c5d7132f6f70aa923e1463cf9c65610cedce8040c57f329a46eb5e91b1b1818ec241afdd6f9945619ec764e583e3998420ca05b74425d4ee639c1ce696e9b1f6f3a85fbdf92a2bcd6911bfc6d3951e13c31a67946331e42811ae4d0d3c4100f819782864d1e07444be5cb1652aa4c7a50ec56d19723cf96eeecb13ecaeae3e30fafe98c9f221b71cb56d48bd62fc67421090cafcb8176980bc8812f8bad887a66ddfe0fb33316090cc2353bb0f9382e5c225107606462ff54d213d7633b222f8e1a8eda2d9bceac899a2cde00c09f515cc83e7f0d9d9b3373a693e845a0eef5eb9cace0037b59a05d92623b30c7d0ad05bcd04e96f15c667b3b2601d6a7524810bf6f5ddb7ae5a786c38954ee6321cc745ee5d0129e62419beaa82b3ea429770688ba071950d765c1cbca0a433682c0b9f0eb68ea6bf4dc66e6711fe84c4d55aae4c1afcdf3a87f9440e915e93f5f11248b0b65a96859fa6dcc338e40e56ddbce3f2afa8c9a405500f62c225d0896b33b5f65a11693e72110821d55542fd85db6601ec26ec188e1ef34e66edf0b62c948ea6cd62177fcf3d324e414d4f04a13ce2caf1b1ab98d82ca565ff5bf81403ea01565c214cb7ac78a902544dde490066e8d358b4f19d8929c1c29b6aae46e4167bac2f0df3d94c9569eac52ec1a037c6fa21744e8eb524652a8606ed2fc6f3f412c518a51437e3c99cd23e2cdab2cbb712ff6b4b7edb32b56d7186fdc512ce991f1e62052063eafc7c357b61efc4b1eeb66e399f1c6050568b7818a2976b4ed3b72cb028134c64b72d727ba658bc2a06234ef0ec467c75ce860aaa403a4a6c3dec5459b9fdb98bc7285e0adbc9ca1a78ee4353504f489ca8e8e10d64cbda324313976c0a722c68875621c6c6bc564ff641148afa5124697bd79e4903181717605f64c7494c0b3b0b09425c5ad7429a2d619f13e126e6871075f38e4d9e1a304c1f2e85615f1d95e45595dc92ae21151f277acd633ab6b7e26d45b62d565f1db29851b9ba125453ade0355112b404dae7592c8e06a3481fb120c898031942eea6806273941425048a6998391eacc7f855273ebcd7c7004e1bc1ba5f62600e424ca477223fc5615f1145753f87efe3e79f1c44e492692e90b865c1fdf895ae26bf9da36bcb58a6d55114f7295fa70ba18455839f6c74ea96ac8d1eb76c2ffa2d952fffdc1e9268d4189f39b1470becc349853302fdda49728a22a622bb94a37be3b362cc3dd0d3f6e9c454b30a5a112849768567460609734a62fc4f00756ea905d76d1c00a80e5b1bb7a85f492381b4d6d3fc7158e250a09432d2c74e60cbd0c597ada5eb783c35bec1ea47d4606133d51833281ff542dd555d6bedbdbc43c4a307c1f0b1fc43dfd3926a2ae2d0bfba00c2edf857f1289836679268c7d17fc80ee8cc8a1173502c823788255e956a1c440bd0b8fa38abd3bc3841fa940ddc67b3936a348f16153207b1617a1cf2b768a1a276002d1bb960690c4aed914a7de260c9101201aa2cf32a8c702d8863f7f9797e469b3e70bcb925d72a10e6aa66102a064bf873011a57e35ecef96641131bbbd72f7de0ca80481338b2351780426aa1e80935147d85c4e347649e7b6aecc1d4d21aa62adb4eaeaac8879b432445109656b4d846212235d6bb8a39881bada511ae2b223228570207bb6cd7105c16dcb3bc5dbf3952ddc73501f67756abcb320fdbad11112c543d81adc36903ae4f6c9220ed53c78e4d149c265069cf68854a2314a60c06bd9f6846fa0277d77587120525e885f2979393f315e9a4cae402904fc93816016f14c276509a9494b43c6862d9083c2b45c5d8b1629464280527e0e2777ae09af368cc7320bb44847e07c6063eb612fc32226ec87d511c950a0adbd3e53bac7088e561f1a8f0ccabea2a261115b70afea027c3bbaeb9e23ad143b1a02b343c69d4d7217dee1bc35bca6edd3ca19cc828ff895ba68aee5c60e8d4b46cd8873f0a941c8671ecef72e70244df6cab5d534a8f2b0e3f2a85ad0326c552b2f69d27833c07ac05eeb7d18fc1ff20098522b45b21327e45f1081aa28eba6b062a9984252dd38e024e3528ba65088c6bf63c8fcd4b9ce9d7331a5cf881cb36722b189792196b16bc18f0905de4fcadfa356d8965b587385b9a95ef18e9584139261ed8246505e249e275e83964d6bb47b559e83566157cc261b71baf1626d4592c44c023eceb504287604428a3b4f2ed0b43abf27bf95ba909d28210772a263dabeaf135ba1d888af4cd70160853ec0fed236e9bd3d1aa0f5e9439a957a6c2326a2cc045afd40dde0bb275f3e72c11f04436ebf0a3d3c52e02018772243239b4dcec346ee3c21b685f7e7627130190bbee0883f111786b18f9457aeb5a3726ffe5c5108fcacea81e6f7862f7371bc07da83960222075c470a13d8a2a7674824ac8e80c8f541e266cdc691a32fc90519123ff3c49d5c66f97313331d47a5328fddfa09602509863444ccc897cfb9ce3b4e90aea7545475eff3d2b11e9665fbbac6a1dd68b94b9dc5fc59cfbe8210d4cc9f7d8040bc29b69c21963927e01c0756217e5a1a4eb313a612e34d7d5a69f281eb1047babea5d13a6e092c082791cdd39565e875c37cf95751e91b879b6be7b036a9291595b4d34726075f8f60edb7ba00eeb9c12da8620bbd3134dcec23b75c4407b28674258e3e0c9d4122eb62f38f692566d1698cfe26045c4c1f203ff008d47eb7618a155a04684e428e091b346be101120de4a7415b3478d32e6509da11a7b4865e741ae2bb17a68923d48658558be86c3069659f19dd89ca9f07e8b10ff38611d84a21d896056d4f7b803ebefe8e1acf8ab1c265bf95ffda69b2cdb2bc0f79570e3568cb8e689f10331dfc65f80b7698dd4b53534b65bf90beb56a61c2db6b949b7a8d15f5596cd859029507372af86a2e1e47891eca92040f0b09b66e392ba40d0225120139de519c9c3a67d20cdf37578848da37ff11217fd09235d3924898febb9b19088d6a92ec9dd91193624a229e84d0deea31f785d11328216674950eb20d3abb85a93d03a3fe31378984a93542ea0e6193f2ce61c9f47ffbc7e920642b644aa8e895120133082b6001420894e31fbb7e7b4df4e2ef716d5a1c6cc7d76cabd7bdc41528105553d5cd0030cce23b8ec48413d137fe4194f0456d173477dc52c04b67cbbe883077a941f45481dc3e8bfd1b46096a374810e662c1f653a82ce7307ff6dd403bad546e9f8dcbb395a83cc730293c47e9344b57cd0d883903859b084189bd9730c30c2ea099f92088f1d970e6e76029cff2b90a29c72e7a62fdb637a53d56928797a026d4d457b47a56d1ca5f10b2781d312f4ae423c3c049d5045202f94c869b8bcb856aa552a27300e7620270ed7b4a33e986f5c197e2972c3a99805ae8dd2b8c4ee8f0be833504f5bfb4e1713c93c68b33c198090da93d26868b1d8ab0ec2bd06b6551ded6625a441f735492ddd30142a58aaee55f8f750ffd150795afc7626fdc7a2006a28321be4dde644ac3c650ca6867debed146d6618c65872ddbbd49edfa1aa3439920451f28e26da147013dbcf4018a5ef1465c404cca4d1bbaba2fc55db04ecd56cdd64ea2a31d81b4352d2b4bd52dd5dbf6a572d5079168fdec08eb9742bfe2d331e4a31c03f61d99279a41e3c2fb3ae2b558780fe0b5b45e6e364b1d24b906cc8d280234b196483689eceedeb40335041e045f04f962fdc272bef09bb677e95dd65ed05f2f68fad52ffca69f745ea7f3ab574f04e91efda0f8923fc29e9d47fffa5f6752ad7ecdb9f1f0a217397e2ffb5ab5e74515eba0b8b10e8a3bd3b556afd73d9f9ac7f4f7a90effe93ffd88df985ff5f4527f7af99d299d6f9ddad681e7f8fa306d39328ce936d56ece29edd39cdfe8a3baeac3dd74ed5fbf26fdb2dcce3ab81d493d512f28badc58bfe675aa03bb172479ec6f4fdf91f88dfbd48349ec4df780c94172fb7b4172e3a79f7d4e90dcf74d14fb289a73ce39e7083e748ab986a4ad6d7f7f23178eec0c368cb5a0b4632d18c5a6bc89b57065e3adb5d9ce82365291d3c0743275f1e3fbe079b1ca12632dcbb2ec658237cb34cdc5fbcbfdd2de74dd0b8a3caed65e94ee4134584a29a35743fb679e7ca965a6e57b41516e4f6a4beb90d0081bd8d43d11e884b3bdfa41f1a5f3236cd97972d38f4b7e83be9d6eb65781481ed9534fea6c9d36bb9241938df02419663b040382cbab8e7def87f5d7f99fe8d92410248dcf18b5e9ce73a1336d7afbd507cf0bede5d58ed6c158077dc9632ee94c4aefc557fb3a8fda7858171aa537bda3bd2c57ba48aefcbd171a45ff94e9ed37a7f96afa2e34d5f2573b52502e7fd3b61cd668638d564dca9752c79b4b1d50997aaeb34f4fef5dfde8ed482f823b7bcec982366eea6b481a20b4a9b1611b6fc7a568b448eae99e6b67996759bfe86b9fbd37b5c9c66f78be6d8ef65c352818179a192f7a74a83ae817d5ec67da677ab2c93a2f286ed73cf7edd707418aa4317772ce59ceeceb8f195b7befc70ccfb56d50dcda96ea565086ffdd3ad0fe95edc643dbda7b92a4e102c2f09f4e06469e3f66ecec51dabbd9d79f6cfc86a6bd206db689d67d3bb829a5d7eac9c60f50e9ca9f0a866e3401970bccbdae1d5c3bb8a4308942254c11528e8ec4a0d41045cac4e0823da318b9a2f67cc2d99188f8d837286ea06859754e444a296fd500063be2a8f46bfc2a9fca0c437e10fff82a12729452ce0f3265340245caf6320b59b6e398ff5cf69c176a2a41863625920f1822ca2a12f29d1007d28b7e10aa3580c17614d0ab4da6fbd794dd87f0830c41fd9c8c34fe94523e9c4186e25f7f68d2f79afe9afe9afe5ed35fd35f9389be35cdf970cb26fd204399571cfe52879c0c724a29a564e1db525ec9d930c6829088c3d011269ad0c046891a2bcae0a0638ea6dc232c4a2c3d2a81e9c884eca8487ef2e6f464496bb161ec488aac0817c39855124a29a54faaf03c0993e48912ad8615c40e1715141d26392b18d956201a82e5ca7a64c376b161ec688ca6c6370e4b1186d127e2d8f1902b2cbbd7ccf3e9269fba7ec55f49ad43fed096b1e3d1f1435b763c22962ff972c697dcf4988513374e927032705b9c187132847257e6e6a4034670b819b2f7315a714a6de6eb38e411a3a56df481941dc7705eb207d15c40fefce460c8d501b15543f6fee584c0105783af58ac2c73b25cae17ee7559b162c58a9519d7deb7f7decf4cf8b3b75d662d0b6734cb3217ac2e6a4df3efd32e03acfdb25f7138ddf535ae4c86b1457545b25a11b1cab12a6eb6dd30868548ec8a1b2c4a62d11527b6b7da7792d9327665cc9672d28f41727251646f4584e44c62578e368c59d1b213b061cc4a914de94522fbdbab5f7b41920691e74f7db9359942a50f7af8f01bbea915a23dffca101846d45fa880ed3d0b9ed58ae19ae1e54ded3d4d144a4ad9c258eb6cdd19dd9b8b2debbfb0197eb85d1cb39bcd6da5d6c5ad75fe84a6652e4d96cf4191e79bea8d2fa58d319b3d06f69ddbaf76fd7bba1d47b3dbfd58ed1aadd541b34e96c431f280e57346640f82f140d2c8d2d68772bea3a01d451f29d1077fccb19d30fc542a954aa572ce5ace39eb1b5ba9d752a9eef4a8d49f724efdc94fa7134cfd4ff4a71bd0dddeaa1deb53dd67edf564ed71fea8cee16b2fa772e7cdd8f971d4b40ec696f65be70dededd4f9a734d4ff440837aa0b8afba4fd8fc45a8da21d7f29c3f71c85ec81b63a726672148a30e27b8e7f63cb2f94a14d91a1c4493085b12a6fbf6218370f7e36d4417c4b20f3ed7710820e530840fccca6ff23e396efb966bdec177ba8049b3e103cb3a9b69e7f90a17dffdad71eef74f4753afad837d9b560b2edf3ec906fdfc5db1caba71d7c6e668f7adf78dc2cdbc6908e72ac5e76aaa7dde931dc80646c3c2c7ea9bd21bc7560bfc5dfaec5a7ba17fed4a33a0f3fea733a9ed5c3adf333ffec7856bff3709b5cbca9e3d981dfc5e377a179561a6868e73ccf8e9dcfbff3f9f3c3ed83218ee3c8d77fb175707fa7cb799d2ee7559db7fd7dae7ba51e6edf78d816dac37faf64bdee678deabcfbf5d4bd8636d6f6afe6019a943ece3a99b5c9ee07d59d7d08190f47b3a506c2c186f701435eb6d410c6b86fb708ccb77303e21b686e10caf04e335c7072dc3056a5cdf687ff801814beeca4969e100f10fcfd1323842d38a529e6d8c7bdd2faf051743b56cee66c713e647fcfe54a02fa7024b2e3e0156af66f189342654a99edda303625caaea2b40bb0610c2987ed464b2ea594527bdcd49e6bb713ee36b783c0dd31a08cf84116933110a31a1f92c68c30e04f78d1b4cabc528c35a6ec321218b2a287b5c7daf863441fd45356f449ddcff47334ae88ec41a50fa28f174437f73adcd3ef91b3f354fb9ccf79fa1ee8742bae7b21b2f6706f3cb457e9e81b5bd447a5b5d8e280c8706bdce77430b6763aed539d86d2fed469b7f3f0cbbf9af6f0d76cb58626274e22d9a3c961f6192074ff9126d36337c90e08c4dad465c0b5bd0ff6cbf42ffbd7a43dd746bdd3c83452ad54f71d97444675598338fe35bdf5561b636df22dce2a2b0210d142112bdf805c4a29a5942ecffca8917314a6841f357e08a23388ce68e68718638c510649332f448890208a419c38716af61e3e753d1b4aaeb318bbaed3ffd6f7e17f4d3fc2f6ce93bbe2bfd77dbeac2f03954e19bd8cf9f9f129b40141d0e533934215375c4260c21327d67cd9115dc4d8d0040b538448d3040d669e4822a5892e492c79b2fab22b9723d50a2ed50aae2627a48941cc902f0a11402c41e6c4c2ce6088d920021b94d850a4490fdf1a2744c22c817284e60c172cf286312e52708162ce3955297c8410f6009b13b8012651a0c9192523592cc645cb1625551325b88051156dd1b20569c992d816a2580d2aa83e30b73019a24a92b3616c8b0a5b4ed041091224b0d290a48508d511a844864d155ebaa4817d6668505aa22a12a3c1cdae1bc66860b3841115111511974b25c4758118222d463bdb30a6454c0c5cb28c5111c5a034244e143374c0fe5de1f75a5b9a30447dec84907a6818c7c79fe91ea7975ac83fea9c250cfbf67b62f34d5a3e8e3bafa3fa9d57bd10520fcefde7f7f09ff3fd33dd63b5d21f6821a41e3aef5ac8b5a375ecbb8612864a0b69a19730ec73dab4759a1642c2580b216599ee81fa9316f22209c33eeafd5d6b5a080409c37e7c8c75d4422e44c2b08f75517cd742510b091142eaa1bd6ba10b4818f6b517fafc108743342d1ee2b0390f71f8ffc8169d10520ffc395ac871e0477daa13417bd3e74e04a41e9a16c1a8274caedaaf4818f67b62598b2084240188839ab408f4b5f82e43920c4a9bbe04208efa2cab5f8e1a92d1b690451659b2d40d6359a8dc0d63598ef286b12c39449c6304ea3869a65b89688021bd81bbc9b2dceae3ad13d6885d907f941d100e6274089bf8f022eca316514a67d19c45d48be89c718e669b4d8db814e4d986c26254b2c45c4061c65c9a6c625998c4603832dbcc361c175beedbd33a4e2967ef695b732fb823b2163788cfada8e65bdb5e02f1373dd479beb3a7f6efd03675b0ccce3a48e514d6faf8fceea7fe95577f08c9044d787dc60db2ff2cebae84c13931df1d4acb159183eecc5e7e0cfff952fe4a88ec0fe97b575fe9fa66a0648528b5519337e0096df9208cc9be835cdbb5e3628bbe101a39ce29bb9e959aecbd522c83e18cac79e0eeeefe3344d6fe47ca1a5b834af7c61f0760edad56ff2daa3dd7a6d33ffea8b123e728cc375d3b132532e76db2b75ac5d56a75a592b15fe5cf8e7ead376eefecc3ad5aafbe5f535fad45232fbcd9f36b7dfb3aa00ddf5edfca7007fc9ca00d8736dcb32feb337fb61c403cceeca15f1fb7e8eeb3fe7670f7449fbab4e9f3ecb85f9f7b9af3b5f3ee7bf54ff676f755efddaf2f28d9f42d16381bffcdf9dbe5ef893e55bbbcf42fde34d6b6010dedd4f7449ff973fbd9f1e47c8b87dbc4bdaaf3ea4beef1739a27e77976b4d87ebb2f5f27f5391dd0d04e699dee762f94d69aaef5356823c8bdf75e7b41d8d7de0bec7bedfcfa38ab2f37a0baa3fefc0965d01c3aa00c7fb847f0212ede21775ecd94fd9c530b9a306972803dea70a297a3739aa63e9d5efbc9423ddc4e287aa2f444a10c7f8d4b833b3837dd80ee5bf939ea9cfa076b478f961334214f2ea178414d7e947d6f6e586acff680c9a8cf7ecb911f6ea8ec01dc281d2477c0add33a53bed6522967bc4328974adc7bef0dac1d2a3858c5129f0b26c40b4cac143b20718411951fe20c218109489c70302a5f0a1f54d2600e878701c06012ae0526f91229e8e15bc167016463c2978295f95a58a1c18a6fcbb0244ec4c467441361a019d81043d67c18c0aaa8014c083e2f015601ab32a508163d54f9818e2049122762be0ef6c577f8a00f6e94d8f00eac19c19700d8149f9aaf85cf00302fea81b9142b3e00c0e07c10cc093ea46f07a6037331f08a34377c26f8bc042c180c2207147c2a1cf151d887e48bf3050096826fcb9723c3b6602898c7de48017130c11c862c20141f38810f4a3817a883d11468c27c4b1f0d1730193e173e1f05080076f4f1a8606dca7c453cf15df1043a41840314cc7c59602cb80d513e349f9ff0a5f96e6c006301b033df99158c518106d5ca77e44c60f14125ba7c1a6602ffa10858950f0a11e753e34478f94e3011c0215c8a183e203e2f4200d80c2a3e27c10ff794430a2028c104244c8688c06889d10b58ecab71009891af003027de04de50e1130ee6c81b32396c71a288112adcf0396183c3b7822d7d12f686872f068c8a249660f9943e103ccc8f7cf1270a282e9ce952c607129ae43044911112300706c07c06272ecc498046f894232011eea6890f896fcc77418561984301e553c1e7818f0c105348141306b1f87a78ebd4566badb5d65a8b421a2373ce5c6d0adbda31dbda67d93ce743fd5f629d28e090c6c8131d3e04c050f091f9b2c800e62b04f1c12f9e9415418608082078d832460c3da1c8e7c4a3806daeec5891ed54f1a9d6a8d6a4a88871c7083d6a67a2c9d2f65c316012f4a909b12647a8090ebd5cf5eaa6b0e415fda73ae6d314b2bf4bf9f429109a1fa6abaea84c90a34f36c2dd1d42c881ed7bd61dbab8cae16974b56ae5f83c555fbd92aa20f21a3c800c2716405e45f7a803907d019895e1acb36a426400640a01ad4da826776f3090efc720c3798105b8271321b9063825464a29654b0545cfb35a3cd9e557e0172e62ec8b980867cfd5a2c8b552f7250c59348860cc406ad0697d8f524a554b59ca28bffaab962aadd47f683bca1a56ac9d18e16aa5d303abf20c5a9f4a9a6717828c71cbabb94c8494d9f936b344481e6dd53c32b6c8444893bec6306e40c3a7cec9d21b80216bfe7d95103995ed132151d6cd90b5da94b2628b7e4f6ca9a0c82bf72e04dff3e7947246942b12c140be4f3c966a2a2bd9bb9bcad885e09b3ed573ca2d1321650f95a04ffd4ccb4c1ddd1f81c09aea4b8e1f7fc85dd31bc6924ad8d0020ce14d7980c49bd882494ab66f55d2abbc64ef6bcc37db7dc6f62452469fecdd3da7841b160ca38fd4f1612c8968c33dbb21e915a8c2daa73ff4d5dda9b096d2b74ebf83b887aac71430ce709a60968990a8563df1454ae907f0fe0b970d635fa81860c3d80d7062c496fc566ca9b064af1583c2a8a3c4be28edd8c1d80d70a2dc242818c8b7cdd06220df354b55ec86a50d63494b7bc686b1a41836109ae10f9e990849c6bc38b1636019337c58b16722a4287f85612642827f82a92ae6c7a18d51a86ec37777d73e776c40f1e30e0becf9b2f3b48e2e6e3ab61c33c25039fa54181f46a923524a5f53678f61c8f21e7e972cefbfba60b157b1e55d6a297b31f2b264fb67a8638c72c6bc5c8979498a52a8a6c8974ba60d9168a8144db7753d0a15d10800400100c314000020100806c5228150281ccf15c63d14000a868c3c744c954723711cc6400cc3300c822000800000022008820008006114638a1f539420858f7061137e724068bd07c5b86e9365c4a555ba9ab9ae67da5e431047e159ec6631e7a173f8106088720f89e7256462a23adef307266d16531e5c7317b69eb49d4f6e8ff8cde30f2a983d6e6b6688d478306bc743a786e701ec87721e1440a815e2629a4746a7a2a967b6e1f6605910c77af778d32cb87b16eea420f650b60588f810a980288b8647d56efbc1e2cfd3e91c3f243dc4142f1e648712420f51c307712024e3593c3a870d42441066d1787cda2cd03def9d09c2164473212eb278f234b14330a8c422583ef5c7fe5adc70808c932287676eb3f0e01170c51f708eb888eb81a04181e042643f78f9c10781911052883d1ed02c883c4bed2e163d62ef6663f62cb65321e7a9bea5d0e5e1360e10ae3da860e151b6792584593a8f67370b78cfeaba8b1d8fcb964e88b2d27a44ea7ad63d6adb2c9e3c98dd7ce63c7668ba1e84426006b102b147a4ce67bdc7dd26e70f2a683debb41a88f043ac88787c9d4441f844f44ca259a879dcb834435cdcf048e554d4f62cdb2cbe7a047317461ea772762a7ade36f383cd87e63e5864f3946b2ab479786d20208810ad1fe536a53ca8d8f7c4dae6426cf1f006c1830805218648db834b0fd221f410b6219a037191dd53def5d4f6f06c0079b050ecc9c45da4f190cd41d1dc23d3701f92f560f1edc1968be2db33a641f460e1c4e3eed20462c5c653dddd16c2f1bf9e8f737c00bbe21e4c21e21f2c43a816420adc1e9dbb1e02130af180bbe33ffc0962459ea7136ef1681e6b9b6fe34e57e1530750569ec916f581fb60ad0f16df9e6039e4b87b543df050e25010b820b621be3f84efc3a81e2c19f1037df04b57c6fb7a9c7090b1990fb122c833de8611844fe61eb1370b674fb693e3211b4437047e20a680787cd72e02a1e702cfa9a3f90171105254f608a659c8f7ec9d5e0f413ea41cc48a82a7272e8a741ef79ac9436a47205a808c46611074b5784a6a49f980d1e09c3cf8c69cadc59ce1a0be6b0f4365360b8e475d8ef14f0fe006e2070b674fee9d4f268f60350b79cf8ed3f310fc87f2071442ddc0965a8a07e83d5a23cc94c1203f4c0ac34c971c04b286792ade2cc43d4a753e153d75df2cc034ba071f305d8043fcd3ea5972b358e961744c20b410c9057181e5599ef3d9f6f47617795051ec31b5497d105f4b00d956c251a3cfb119a3751f0521d941f9a86ca9f9a0c2dfd35d734224cd83142d1ea5358a0ff57fb081d0ed03bb077b85b8f8f784db6d438747830e0a318f6abb82070b394f129a0a688f159b37102bf8793cce9f432aa26295dd53d33cd6ee26c4ff2120502a8b39a3cf0a37c2830a791e481ba086272d84a6f3b00f0012cb5906987ec4c45e6a26d78b131436e0a6afbf1882b17a0dd48ad7eee1ca33e41942f11823dd507112a7aad26320ea708013946265e0edeef8ba9f1e30b5cf5344d6e17bbc66a2b5a598f985c7104015e4c9d58240beae743e8e227dc856fc09d6e4548e4ef7855f00aa1248b8ab1212d50a182bf8cb48b688b1963edc7c935dea6c8d39fec6be83a024e7538a8754cd82866759a727178f62ce27718faa73e1830a388f841b0a22b943d1dbc06323ff83d30f4e592f9fce4131c9b46c1c9ddcdf767c0b004ab7e93f84fbb9d0bde379721830a59da7bbce184efd17749e4f297fed4e0a2198ecdd1084faab4292ee33f123a1873ec23be2625b130d41c638d866019091ef7bcce487dcf7f901ced961cee82fef0351de98e27a9599258c42b3a8777c854acd267899fc039709107046bd8aab7262be74f4d1d42be38cd3d59ba8f61540914744c91c58030f407ae15875646df56291ff3c57ce6cbd9dfb01977403cb099291438736c61d3543a66a88a3507b9634be8fffe0ef701aae3b942ba6ccffbb0bdcdd71228d753e71188446c673e64299b8c624a9cad405e7c731ae49bdbca6ca058750eaad3317949432d51a41c98506d1f91a3baff9fcce47bcf010b1eb5e1cbce219b3f3da170e8639ed4e5b48c2bb0ec0e35b0035c6b0cb58d75e9281d246ce746d9504dcf028cbbe0383b24c0acdd6469b4ded7b3dac8d30f56f6f73503d56041958e210ca43defaf16366fb54bee507fae841ce1bdc3092a1b56bacebd2eff9740f4dc732a055f094ef1197f2c23a66d12ae89c2c00651d2a388b4bd183500704f0d11a19e284ae7905f558b1fe0fe5eae5441a8c4c557139c6e03014b74e2b252c92ad5d73a03b18f38f73a92517b6aa87742efd76699646703153fbdf844cac2022101bbacad63bbcfa0bc5a46c6b0850a53ac6b6aa4b9180c46f7d0951317c8fa21667c16a808c9b0e746b9c779bef8db548579c3892a44c60a0ac1de7f321dc6bf24c27d77cc775d5873812a0ccb101312a41bdd3c3d02e1f5acb29a10f3469edeb7ac332d6935c2a676e96ef2091360c8252245755ed54204b5b6775d149bb56f9f45cff5bdc1395cf8271682a79f60129014b994aa3a1e536c206f90075b4ea239414912069476fbe8e7a2eaea89940f44b600e5c14468225991ff7021c0d3762977ff37c11e506b09dc4b3e8cf31d324934b9c2f9ca8beb00d6f4b8b44f25f99e29bb7e5f580a3ee70e8a31663d4a110ff389e079d64f9f0b5862a14c2e6e497c42bebdfe8ff2c7330c3af61fd240910808ea07bf3023bd604b84ecd9d87f8902555c64c5f8af971a42b72d3503cb1e399a24cdb34cb2a1f5872986c2c936cd62d92efce2e082e111df371ed5199b076dbf9d02032f1fe4e86720b0ae31bc6866bfa8a571c21455c13731b8b4740c432cf55a2b17391986f09cebc5a5cb08298e6b9a4ed3eada4e562331b69dd05922c1aad0ccea1d50be17431409277b4de47f56468acd7b0ef0e17da6ec827ce9c2c14b6dfa5430a89391d9a050683cb64abea2d2ed898563c1cb72478c258f575768577fc4f868c6db18237b7c13baca926f5a5694c4aa272367eb5ee11ec99ca7a6ed0de312ba4fc21ddc941b07e90de2cfaf8566bd55a1e3715a2f921cebc2efc229a730850f858e79b424bc12ad968fe4d08d2601104cfd6f9828ca65fadd374af163aefe6aa8762751f60672e32296c2e149410fb258969c5a0798b71bc36915418c496fec044c188e7486924d9a0312a2bd66a331d48d8306ae8ee72c215364be625185089393a434dcdd23fd3ca613cbdc645dd32d7409aabce0d011c7191aa8b3c4803717dbd8d681085e4e481cb61025487957eb4361ffee98bce05a381f1adb022906764318c49099a78870a72c536be07677ddc6bd0a09d5f2fc0c38db46b16a0e221de584f3d71264d037310a7ea09425ac918299fc3a7b22cc0091d70539b62afa8b5e9bcd5e8fc50b6bc1821b443d1946b69c85d542aeb6dcb0fc22593ea5019c4ec0d098f9215967ddc6992e17f680bae536ec2d4d633a3f4c9a00d13a971b965533b74209172f4c8e8d5f53f167d5ec222500818f9a82792a9feb51de26a7a05200a842653151f4179349d9b59aa618b6aa50805114dfbf3efcc362e3ed95f785dd6bc2125ed51bd9f8275e5a7219de9df88733326fee47c1fac8e6b314d13e968da6182e27daf0d8ea0295c837a1b035ba3c92fd9d0b1c8a95f330ff5e760b8280daf5e2b83a6cf9eb6cc7e99b53e1c9ebffc0361e1035a0310f6f5d67e14f401e50ae971cfd48233260b5bddf56b00e86ac34151e0cf3be457bdb07a3d04fd5200437fb360f70c225ff7d3de43945d925cdb60dd8ed70cb266c3416c175c9c4267cde735ec11dc648e279b664cb8672cd7abdf6f5070a39a7994f37655fda583c660b8a1fde2928c7b054ff9335852721d63df21794318e86d02561bd091185438c0f832abc4534d07376dabb4f301031c9f2dd52ec92c79bf47e30158a8f17c516ef4235290e611d3abce3447eb73780d8a8c11c427e8c2c5bda466d6b65361cd2ea22c348f4037b84614becf76f42c1bf278c623bd765de486f0604adef822a13d5471ee900ea62c7b27d515a68af281612d8534941da195b65fe86641a8c7924cd3f657b87684183deb8ef364f7659d02d746d78605b5df358fe8ef68279e17fe50acb549fa273682d7af54d062bcf563ccc8484f4a49e912280c3c7fb47f43931541cc1acaa8fb92269a11f9958c22a119da71e3fb1d78d2564765fd124848e70bb06a5174c1939a23a349545bb9a0a0581e70d9227b173d14eec742fd9324442d431815d266a45b51c0ec39d1d48c38139abda9825ed6cf807c2ef789cbb04175163a91c951aefc86232048b3f9e4de45dd2b39b3ebd92b15be3598ff2ee7fa3ccf6cb75174ed171cc62139940318cfc49ba6fef319deee2e433b6b925c5f496bf638a418f3476490a9017161156156ca563ec83213ebf94e922908791241d6e84d42934a0cae598429304394c0307e731763f67e9321766b74dcffd573d599de541860772e65b42c16e84e2bd87682badf8ed18700a91876911dd0c88918815b689a16572e1d16c4034bc029f91985bd7f4dd0a3a3f6a14c3d9742b9116e14259e084064d83644af22d084e51a27d816f6a3dc32877ca655946a9edd4b14bdb876fafb93191f0abbba2f9e71a3ed86fb6000d9f17e95860929bdd3ded459307aedddb02619debcf1fbe8f3168b059b8d98b6020f1921fa31f5386380e5f6b0686b29c57c187e32adcded4cf5ee33f7e71290c1a6e7fe656f877977c3655560435a6d9f144853628dcef3edb1865d44fdb7f6fe430371bb225062d63f3adce005a6f407383f20661ca29f56b89838d56aa33b976c204539c6b9df205935e3a0b71aaec490da19bf855e796bdd4000857e0eec9b31e142e7f44eb0e91510e0dbb4925ad22dd9cafcf29c1253fc13ce36d38635b6a74b06684dbb6b70c3c971410c05fbb0467afa68ac797eef47e4d646fe447583cc7e1ae9a44505caa59300517146ad5461c874f6540e8882077e7d83c7f45d8f4da7b7c06f778b969233e62c96d7bb71e315e7963c0db710c30ebd515840f91419778c69528731cf65dc78f81d44ec4b2e38fcee968833123a1265f6684037b1524ea3247c68ed581d2a9ac165f8ea1bf31356c1c05356be8428acc948ddeef82a2f64f2fc17db7e16c34db0456aea01ac322313a22cf9807dd2d9655ce310691718e533e6a303b8eb9b60e3eac0c41bfaa8f24832a51f7da20a14b79f0b98b7a1a8a77765228031b8e71549e7ca6c17a9243707cfb43368ca9ec344d554b47010ed0b8aed3be1c66e09f0cd218207500265f9315c2bae8a62e2a0d08b5fc373df484e8b1ad6c5b8ac261040525dd750aa22be3e02934328beb4bb1cd8cb1e18efc24c139279b5ea942248e145d999e121afff6186e4aea4e1a67ce60ea18b879430a19401b2ccf21bf312a28b77f1fc17c5b040338f165205b786862411ecbb855f466ae5269d95ae2d998d4ea95371f30179f820b9f8d9e84a67979ae4837b140b2f5dda920b6727d2f31004eb662d5026fd265ee34d28b34062f11e4fcc87775815358ca26b28b5c8df561f0a9cfff89019bbf0d4d255e7612710e4c690b634f22d08328f6aaeaa56ae42f47dc674a8696cf01b747ecbc0ec672e0ae2d414607abb77967ee4904d7f6b9c8b3a7ed16cd8ff37f916c99a9a9d08994157d5548f9e9b261f93f499d316f661ec908989c05348499ebcf06184288430a0c3761dc6950cf3a2e1cb8f0db2fdab246699a597e837d5587acf6dc84a85ef6612157bcc12c3573a6d2253511314400f88856ddce7aa217104a0fbc5ef83333d1b46060bc53f5fe28120ff3b51f9efa400ad0253c67604671c52929212a088efb7f0359eb9de0e01ce3402244335c9d87886d964032529de57e50268c4f406aa39ec6ebf7f1ea165408ad4b6c33fc608d345221ad36655b723ec3581d4110fbb45312bcefbfcdeceb97515d2e3218f32630e8fd975d0f7d8650310405bef0da332cb93cc1b3cd9de99b491479662e54746c1bfede5a7d88ae809bca21397d6c825222d1e44c21c8ec0aec650c634bc2f0d8c1429c861e1230b9d704835f203584702c122611776ad0390f40b2d1458276c621242e785528930a508a3c2b91d2545d582d474f9be5ae060b7f855855935587f94390e1222968d05174a411178a25b5b2ab20ec01a922781a823f2bd0638bb8175edde472dbad2c076d94f2344c728d1afdf721c503cd45be07c7d4ee66992ce77b68cf19d11c0dfe8066a30571a51f054b31916f5bea6b0c5116105efc6e860371f55c3248d6c8293221e9394663d2b18afe0538767d9658f040bcdaec862e876a4da830d0e604f062952c53f8a05a751853c87f1a62f4415c10d2aab08a48cebd883abd6c543fa5b94298c38e19d059a261d7a1e47fa69b9d1760a5742e8799fe9f13e106eace4debb59424310066864eaaf495b97ef51003ca05c43f725b87522efe9626650e1816e773f0fbc43cab1c4916f6986322929203388069699af807dfe16a1dfda9babd7481a48477e9bb8699811d3a884455900bf18617625f39745b08870c0a5173a6d88099174f58c44f4a3d18b0a6b0722ed2f45ec1267d16ee7711da9e4af04ca66221c729ffd4ed3d7abcaba25c7a6bf4cd277789bb02a0c74ea83e1cef614ecce4a7820904512f10816ac2c27a178457b4b3f10b3e36406747039cb07765fd020ae495bf5504b0371588c5c7470805e107df25cecfac05f9cea71ebb8b454ccfa5b960ac8de3868b3a4b28b23f3476771c4c74b08f86c8d404dae01325470a13e4589d3875cc0d4b863076de4c88081b7a9c1ef812eb108cddf55056df1cdf43f99c93d52bd2497752a1af49ba939895dfff8f8f4267b69e26c51191bc4d66c651e53517610529ae257c4136feb531ee19d3db0daad5fb8b80d91905f177ce2025cc9c497cf36de36e7603e6ac8a882eda0bee283f802f971acdb0580f3bcb955b41c63945c7d7d099445acf1f02b3994c72a9dfac106d845c9ff1516878e7b761e92e73bac2975cecf9b93500d0e08db8c88f2089dea11cf131529e5aaab05ba5199551ecdbd407134f7a5315066ea26c9731d2e5b98493e400eb5218ecbaa453d29cfef8c730810fdb85600949779da0d7b812866bfc8110e1941c8163dbe54da7b70e5c144e4b61b1c3df0f5af35a42a776a7e5c56489b23d2656cd0b1b87bb61c6f057994d2fcc047aaa61afc9702d7213bc57a013cb3cc9476d026456425a17cbc7ba031b0d16463ae162842496949503b9c1aaee0df95af4f57566f22a8f4568b910b11b516fa042c88a26ed94437b3ea09750f6334c821380ae0368cd743113a0f7311e6278d7828f201b8a5fb772e565ba2aad6681bc1fc026d47562a6f1002cd3099e957c4356ccbc49a014859974b6de0c61a75522a6df747d9a96ec96d27b0f2c1028ed56e9a332ab513a447de48773c849906e145686558fa22958a6669c7b8831b574d486a1da2bbe7d40c484d3fd4052fdf33bd100f07b130530c3485c74f2a9c0c45e6bff2bab44affc795866d34090db58475464bd446afc5daa873c1220e56be438d30e8466ef5ea8e62a01505d847a22f7a386d1306348b6cc8c6ac5594107795ec80a2ff22f961a0db016b6cd6cc7a7ec2ec56172a16383eb78e52ba96a2956e4438d888fdccae1dede98280b0fbc8504dc11c05db38751195904f53ec4ab5748d5cc7a53be06ec1f6352011270a568d28d8708f03b2f913ebb1804407160ce6efb0ff1ed250c55f4dc64aa76dab4433c7de9c4f62df2ee6d8c7edea01129a4246666a2433250b60ec78ace3cfe4d7ce6b7e2fc7e4c6ab82f4bfe0da1369d4458b39ee3bfe47e655b86e9501c64e5219ee4bf037a0c6058c2c016dda66a41a4f16bdcc3fac0d02b77a43b373acd9b6c4989209ffe5ca38e49a8b521c7b6e67de6126c2a85e3d2fd2cc347e322e339460e8e26f7ffe6d0b960a4bee7748fac33a2f07f2afc72d2ead2bdb7a52866a09639fdd4d6faeb52fa7edb0d705f5a5a6135d367a3dab441f25062912629c4c6fd6ff076da99ca1962e086f264da024a5fa8f6db05712b314bc3546367fbcee3372b9671f3fba6791a71fbc9bb5ed33db147ab99157129753381814dde845eddc70e3349830c43dba8af5969a3520e644d3a002ae6a3ad4d2c46bcc18794d6710014216c498f0904856053197840970c3eae32dd9abbf4570c5589084599caf737b353938746d39534bcc3ae0ecd5abd868237e7e6bcc598c99f4606ce5141b5ce9b0a1326609142613ed424dfb6577b53ac84f0cdd04391b809574d118a1af532c02dc676797783f627297fb945d1e1dba56172aac196f8eab1533de350856060de9024b0dc14847c33c388b6034b8c11673c3e83058e3ff24f88b33ecdf759648d804576bdbcbe798c51d3f328efe21f982e08df1a1841e528b30de2c6c1f03d76615d7803ca3773420ef24f8af4432a4682567c14f33ec95076163be662b2d1cdac93e6f921ad250031e1164257d9bc3581b3661ff1a3cdd80c59ab9de9995876ed0e56d749cc8c2f4aa1b35db1579c6e66cd8b865fcfd1103f06e7a768fa0bc5f3688974a4cc0583f0ac7d655ccb6c5dbc0a7f5500c0e24ea2257378ae0164d243c9e95957b49652e25d0a91a576c89789ef2849788e0eb8671d34b3ee5e0daf0ea368dfee1f1ebe259553b19c2b5aca8de1a79d97212cf9c9c727071e0bdc551a2a28695a7b020f99e60d63407ea20e6a4d4d2c6b3e6e0603ffe630403bf680ac7709342a6e7bd887314214afd0d49476e6ee77ea5ff432d73392379fc0b9899b3e4f87ae54d41870e4638c5f0405da89964074f54a18d53417e9fcd77e29488f02ef21af4c97a3a498eb49b374ce70debbc16025353b4ab847f133fc3caec293daf0b8ccf270648303927de43e8fb522f6137d06db75b1a65061e14ebaebe9228b58ccac3efeee03e67f87f20560479e12b9de2938b2f0c2f11915559439057815ebabcfc7461b78c7dd01738512b0a3fb91ed6963cc32aa0e72c57642f9233b12ea760c843bd8c1450c47c2db0a6673d02ac0dd60ee08aadf510145287db4564f8c31bab73822a4e9613adfe17a0c6f9c585a1444367066771f2bfb06508bbc6fb039b2bbc5aae55782f466d70e2b574feddd91f43b0f811330b2062b9db98fa17398018ec721cd5ac009ad9eee5421fabdcfa9ac2d42f0a9f3cac14e41f8360fc84b51e97c126b239e22ef3b0e9bca7292e78a7f56513f5b79827c4978e338d53113b02c2486b953e2041fd781bc2f1a6956237076f45056248c868ce2df2bfc6fdfe4513e940bcd62ff73047f334570325088c4521d642adc5ede8a7239a51d2a30ba379b11fc858afb81a7889eb46b2bf4a918e264c639a9841269025d3efb80424ba764b41e1405b8588c64d1824fbff30a3b2ffad50800f8c2f69c8cb5823bbc6a5de65ff8133fd7c428b91e46bbe5f24bc1dd2b9ae1791aaf487f346fd41390ec323fd59222b65107d0674f0165f015df9c03fa2e57c85d7b8d55f90e5379b8c7010529ffae747fbfa082eb761baf97a2e2268aaf90c3424017c224837106b10e49110f2a5d2f99048994b64336bb2846af60e5c877f52a8d6e5ec95dc107ee2ba1a9296fefe95e8acf0b152d5a0b75c65d5564d0416b50741f0ec8051e508189983042c192bb4f6b50a7290787c09946cd91d538c3c0aa72b8dc37bf39e61cd2d002d4a831ac10b1d450016a7e61ecba16ad0d49afa71661cb9c726a85443eebb5026d951aa056193fe8ca0c27ad14c7dee50b55c14fe08984872157680875b318f2d33030290e3429d5950658242170651337d16e94b11fd348332ac2bc1d5a156dcdf9c091f86c1f483a34a47596f676f92b7a330df8f262380185e661e15bf6c255d46327ece19b54888b127ab71a837804a5b3deb3c6c7683790b565e5f7e33c5703b06904bcfef336dd49a6d8f663e9dc3bd6ebb689816d7187d6ad0df2a76df86bdc4e08dea2fa22607c16d1ad42ff9c1a8e54cb43e925c287c4b75c0c857fbf619f33318158ae0ec8c72680afc043eac86769304d1ce2227e9a7e093f3bc0b1fd12e7c3ab6c90d6473b37d2f87d62a10480754915bef7ebc1466f1031a2024a54f2dacabb34fb17e25ea5be741ec515afb1f1680b257aac75665765c58e04d9ebaedec83fc73c0c37f94899d3863b99d2e0d17a931d5e30d9117be7a943d711795208625b871013a9b3bfd098825dc08270626b03863e62f8afbd07715aa5e3661336d8afcb5a5d76df7746abe7564667885bcd9d406cd16b5a9d4959ada4d66a58bb03cf72acbdaa6be6ba6ebd3a67ec6758e5071d9e82c243a52a01eadc27ef616e0fb14b5a2ca9967e888c12a9649b4fbad378e1c34a6b2f224621beaa4e22dd28596ab2951dc69fac1fc7b1bf78117cce218265e202471e5eac66bcc9a4e179e9468d14eafc9476889298a6567e7ca9c5d5fc25113316a39f1e8bfcb8d7a7759a34e1d76294b12df3a2b53e567e0c6074756a595475ea5a0aa0370498096f8cdc1fa62c178990bfceea4f34b0f77a5c9d0b66ecbc551251d26980c23107d743ca11a1d0335dd1837e9aef858ff4fbf7b6cb11f3ed7ae502d264361639320cf24377002cb90de0d24235777572bae9682f5e554b8501234dd49308bad5dc8b844cb964dc016c9abee43bb41e9391d5a6982d44bbc18514f91d0fbbeb5a7fea52673e67611e3def88c4bda27752b27aee9c033dadc6404b2d3914bae4cf442ddb8c0ae35bb3206f49d48228b12f237505cb8119d3ee9f35f4d6005c636d953f7c203cdf2d033c36643db01e87c573a7c8e81a10e7a8766e738453907bf5f826c3f355a49884ce68102b3e6bab6a36c6bd47310e45300cf1689385cb4a46025ca25bff20c93c54cf36103935ac20335fbb5937cbc3073344078d38e5ac743a7e23cc44b36a9d5e3858935e088ddd52a3c7d7459f6d4562fb541bb3b7fe1d9c4be2a07e26cf505b011921c5cca74519ff033e9decf3df85d2ec518a654549776251c528db56f204125c76cb12c30f1e6046652b58b37f826495e7bed21d57504cccb43ef90fb2fe6c2c1823ae2ab06641107122fc3c60e11f8c90e43210c748bb2c1d5aae455e48607a2d72f10bf8be0bc1efad2c9ce63362ff1c948fa37d1d0212cb25bb1d14616317ecc4bc93a04bac6fb4c72b71a67949fda8804ca17363cc9f6bfbd033c4e86ff5a2526867e22d17a55a26090ee1e1352fd8cadb3fc8fcbada8b016e02813fc665c30dcc3f1a8d588ff49e0c50a1a07706a5bd92110531ddc00ec0438433498188a77e40352cb8a70961178bc404de808eb6b33cc6739190cf61eec6c9e92e168b6ef65e769e57193056d607f88d7f93375a718cf73943af6aaccfd88159c128dd3cac2ba6039c8e407156bf9f0a9a19e16500e20f5c6e47b16c0b0979d4b850c4d3920d8a7d3cb39083bef23f2d76ce871b28106174eed3b693906a66c016eec3d3e6f4019d334ca160a2842f65a03d0d9bdcab94d1bfe003bc4686d3c7e054756c1f56d56db8bd95e90a2798736e1ef3d7ff9b275e45b686a1d81e0b8067b55dc3315513a7a9bf18e514f99136b4ccd45c6b9cc16f4032b1f5a2621e937dbc8757e6b2c4e6d057acd9363808ee792d210939434c333332c1307df9f3e7f3cb187957565a214021618b7f5926ee1a21227cc3772bd6b1f5c612d7b62c9c0d3c0fe8963a3a18a3423c629fe338d1d5632e0576769955e5e02997782a11f703b1860f9f9a3f1ea5d81cde3ea1e0b8807ed7469acc4e59498884bdd52056751949810342c656e9cf113b76a966ccd79f9193f0c0d5db3e1d186fff07dc2b64dd8ed464b41157ed25dc6bb0250cec30a6be76c9cfc769e2eaa524a53efa7f5702cadc9067a67d26f00cc70cff120554d50b34327d58493f6a276cbf498ae496ee862e4adf4e874058a65dc94a3ad8116833fa0f85086752d80344f564f8d0f0ee64f129a692a4e0b3f145a4841d374ff386e79245a5b06e629035900e979ef46c5f5a926d7832bf3fae2d2982603639633d248f57e74a1fa8987c1ba5b3c50754f204ede12bcad6674898638a94221b98682a86372c56d623d4b58137f9afc3892b0445117d36be10ac8a25762fd4dc0b4834f2a06535336ba6a9378bca7a70401fe83b769bc77a77ef57c7abf3e2f8ffe23aea0ec044d304a41061e285f9314e915518699cfad3918dc1d92b844bcbda992a7837c6e7da881c99658926fe490da7c421f3b013dfe9654d682d3f3e12a8d5270d1939d40b17c62a650ceb02ae5245111683a30269a8eb8c11de965134242af48a728a72c41963f4e4d661255b8b64a2aea124a57e9ed8d4a31ec5170ab138d1e0cec2c035a7ad48b98c475f5cc6091d49fdc8687a80a8f36312b8e6e241738bbc36ab902cf2b9f0c1067523b83bbc81f60aecceb0a7612f16cea55a79deb0fba8079660981de1e32ac2af310b21de663f6165137a7670403a40354886a20a0c3fd32678019274017ca2143adf3aefaa53071ca1ece46d7ad649207f4a3c98b6c60e0180bd31200edcd427a462aee8f51bed337058c70329bfdf55c4b037fbe1088dd9091c8dc27644fd6720148d57a5bd4a4dd60de045717b7a36dd14ca46326a4667392e5626b2dad4f05a352a3cb6b1ec987def50987484b03259bad1acdc8f997bd8dcdce7bbafde0863bdcceb9c02b5758d4ebf71eb19a764de3e30eff37112e8e22d512a23735fa0f647715a43a7d2fec08bf0a954c84ef776648ae2aa8083a2fb885cfd1c8ccba8edf181cc006e8deee4a25f0862f35cde9bdbbc7f988390bdb07b3d71f94af5194f892d8e65396205493cbb55fe729258f633453fbb1b231d368c9e94285636a06f3ed1fbbd4c96af2d4b69880f50487c5d44850396c7e5185bb6bcf7a36ea838b64788055c59f83a9545122e1af4ad8bb1bdcde92ec16e71d16089ea580b3f26701e2d61875b746f4346e554410dd13f410a075b1600a0fb3e16a952074c549002997f0f814fb6b85e32816b4a3cb0779ded4f57af2795bebe0ed081e7d87936fe2e91d68451652f326c43d9a7654f14ccd100af2aa7280e46a0cffd56ad0f3c1a9b5999dcc3bef8835c068c6dca9ecaf73228dc216a6d05a68a9fa6afca01cc0bc9b31d05204a49f3daac94391a0cf11914c8c6a958d859337e1a9abb03f2fec580ae65d3fbe15a957addb42d336b8075950cd0818416b51f3ff0418683699623964ece94c81a083d77ab91664d77525afcd65e28f594d0797f1bbb4c3555b172cd11cdb6d7c72ad2de5d07a353ab2cc1a12a0c8d9170bed44862bfbe59d287d83f1719076b4a3f7f631479f21eed053f85dc27ba559464973319ce831713ef34eb5fcca60430c7d2bc2909eee50f5526edc5917355c030eb6de5dbe23b399eadc629a5a859e1e29db9ee1b6cefbebc859aa15191900ad89b696b5ffcfee17f9bce79f80255461966b50b36c98607f1af1ecc45bbeb51a863fc1410398c3edfd7d174865126afed7ea04a8038b64c59bb8112a6e9a82dc20163e4e89998ed7b807af4b8cf5a3120a5b65c22815d77846ce9ffd4005b3510108979399b58d5354168647646d341360174d0d93cabea8ea2775d46add3ee46a380269b4ce6951b8369f3f7733486c35ea19a115f024621d63e2cfe59c5e95ae8937f43a3e8e9dd1af50a3bdd5578412c8d98525e96813b7f95a3199f1a892939c3699c644c8938147eaa0ec96069f7fb84a18d01ef49a3961ec85a4cbf9e24075eb99027b7ab13c4abc728d99020120070651e6238a357231472367aedba6206323c5f55d81fc7bc57e48e3420541644d1feda6e6c1116748415e9d5ad7c04a1e60e1f765afce0d6523501dbbb86ffdcf2d39be6efb2c7539783f1922ef30f84b6491e0863fdc5f1c04117f18c4ce9b80236fa9b53db32c0554d9f17491b0594ef7f34c2a92f414209122450c94667e2a28b2efc03e59ed92b9083bf570eba65368b239c123ee01530662006d4f0c5ce44b907a7da50df630223f498b10b122204e510e5117e0b4013c83fd7f5b79ddb343c3df216f58f7488d205e249e033cd6016a518a831cd8b00ae4c866125d23d30cf2e0f29feb918381c65c582a5e87046690f4762a5aec1d996d0b189e9f420233cc6ccbad94c3ba8178979295b7769092ed905223e1fb6b7fdab611165a78050e7a7c702abbb3f1d115e09dfa1095b9bea1713d7595f1c1a113e0f6c8f8603946aa4e16418d2d9a98b1d8a81a45a562a2853f80ed586eee46f5aedf7f83036e13636ccb5bd97165ad9376361d629aaecaa05f8569355de509bfb52c4bc9c10a88020e8efe2de7da90c6c1e6aa632c4849150e69942e6d5bce299700f2ab9715a6a06972807aca14f93768b5920bea2067f008d1b2e19407aef6162e6a60d16867a649b6267e5041e48b5b6cfd12eac03883f4bb3be8a5c40a15a2d57640d351177b18a96c91e573f048fa5af325a21c830688fdd00e0c7423852c56c48e81c46557fd6707e409cf9ebbdbfbc54fe8fbfc10e9b2a517a7e2aa738006ef5c0cfa516901fc56a76bf31f00328047f6c2815da0dbb329267c069727191812f4bf3d00947c01d16833e860589a3046b98bb900486a02da0aa2f6d02db7dac08e2b177ea337a176a3e7abcb90792a4474f4cab9534bc9637b505b9d64d1de08856fc21f7d11d6ba263cbe48f0d50cf5e4eed6f66ed758551594ec95ec7edd9bcfeb5eb00bf29d0dde73591a419861ee039c4f649c245aefe8b39c269fdaa1dedb04dedd1bbb94fac7d0a972ebc5647eb8786b3c605a46aadb082ecbb2fe7a6f4ce63345853250b71171304ca8be2129829773cd76fa31997ae782f8fb9e70fe8d804e42fe169dfff0be823574d96d1c907b92e1da04349609848e014c6aa3c5fd8fcd4c37949dba21963d4446d19806720c3ce44ad7280390cc6fe20441310af1181bf2744793cb185545a52d80c768375559274b2769e731a8ecd78e97dfa699a3c9a5c03e7e639ef205c1581555a917a4a9f7dd07f0abf9a1e7e0be0e159f6d26c193c10512e19662360543834e911d3a1c98c6620089817a5d72959cf5d5989c5f178ef694179517f98b09fe0bde6caeb1b2c0345c1e52617f1158fc179476efd61817393e573642da67836cbd3e4b426322d0a4e9cb2925cb65317964dc8983e62862334491d523b236293a8278919022b3cb32e6b3ae6a3021d2754f842e33c4cf223eb336937ba8a331986d258476a79ddc89349f489a9ad54409ab9292222009de2093998cec36fc83400364484a3f462e2e839d45bf6537850ef604853e50386075679128423c39ade3111a10bef4256cd4cfd5a8fef6249e98c2fdfab7a21a2474a0736690ea3908c18661f3c3da72e1204f398d61bcbabbd35cc703d2e0c3e80d70902d076d259d15c405cfe0571b7ddae4072fb64c2af7ee75bdfad32a6d0f85319434c409cf6d14fc3474031b039009c9ea367d975b79fa621c1642cbfa2ab18b4a590b425204e47a2e0c1b4941e48e0e7194a85c0b2f29a0a75871369ca2cd98eea318e2834807744173eb96521d0b2bca7635238d9da0a0fe8c414839889f874a1a336a38611ce60242ab2c0ca4df69336adbca262b9edfe16a5767b6e03b65efadc7831c1cedcb9073ef36a86ec2e6686e3c67b442f2b46bf604bad5961bc67978ff3319a88a62e748509a89815201869a7163062c1d0a328b51c7d6e5244107e9410cbf71141ddfe7a02481ebed1c4851484346a13e1d133a0780e1ce4d3748cbceba4915a28620a3c70730d4e0c8985cc860fc3c8b61ae2fe37e34855d52d082b8f25a43c6902971637820727540710c9a9cbf0518e47030451d56ece01f1c9a9e0090eb8d2c73c019030e77916b25166beb3b929484a80c156fd99b06d000e62f87f3823168630e7561b03ea7a53c95dd3e48955f69ae9603d9cae1359735967cf810946d8d594fdd8643632903e536a2cbcfe77ca36b1b1974faa77891a2d89277e20b5af00b4f6d960fb24a1208c39aa3bb6ca242150cdb7e0ef1c0025e58d6dc45d5b0ff4f05835ef6c54751c74df577ee6fef71c3b4812aef1ea3025cb1032a6ce67d5c400ec29236ffcf6a2bb2b3ca515edfdde2defca42bb84bf1bb1ffb33979f2636cffc05bd19de778f62de66c67b770707079fd03c069a0ee4315072ecb09dbd8e54bea81158e09b1d1e2d2045f41091b445f677b7944422bbbb37b70c640848075f07302bfd5ccfb08c046f36ca473e508c236d08a1eb3c5f9783de82abe1e2cc30786f3e82f96857564d368207a831c66ff1375ca76fde66b66c560ee36b568beb1ca6a367a35a6b7eda5a9665d9e5b211f4ec2809ee4c5f8232e93a2cc272d6dbddb66ce4b00ea8babb3bd499de2e978d6a6ca949ebebb05db7added88afecb371b410d6036aab5e6a39ddd7b6f367a6a0171a0561036d1719ffc75bff75ed28f3ffc8e28e67ee483b0fbd3c222a58fcadbe9d8769defada49490c893eceb07434aed6316a41a849ac575bef16bae73aeb3d63efe4e6249b91cfcf733082124a2ee37e71aab971c5e5d167dd6ea33fa91b5ba99c6d52cc6afb7adb51816590d16e9588cf1ad346f69b8cf56ab5c078be0ed814537ebc1977aa981b80986f51881cd0691dc27677f75f6cb9fbfbe28ec5143a369d7ddfdbe7eecd3dcebdf5bfd625c0435f0aff7ed732bae730cdb75ceeafedd9cdc9ccefdf8e4b2f915cfaf386977d45f843d3dd63a67f698086a003fc347b346ee67bec3ece96b5f2bd761d8a66f6bfd5ae151a5b57a8db13e9caf77ef116144229bafe1e29c3930914e4c635887613bd3b9460dab268b31b6789b7963b3aa9189eb802a248a5f399b165cacc19946a6ddd7db735eb9ef6b4e9f9868d72c23ae747e5d4904a5122b262559683998b3cddfe15d047b00d53debbedf01d5ec21bc3a6ece5cae1c2ecaafeca9941f932ea875e75f653a70ae4fccee2213eb259d27731d50ddf557dcc3b8086a007151966518b66fadb5e222b9e41a62b2f166bd3f91d90bd82f4a0aa82d0552145ca438b2b59dbd1f6d8d85ff3d8f8510c21f0be184b673fc927b35e94f09b3f816eeb9b3df3efcfec2ff58af69d9bb94d2df61d23bcf5e3ff545d8d257eed93b0c6ae09f3952f670c5fd645f69de5f864359f3345ce7bb7e0dd7b91f698e7b59957ea3c20d3988307ab4ebeef01d06aded72aec17ac96116fd1e2d1dbed6720dff1fc87530cb39f0f6e720ea4d3acb9fb696d52ccb6c68dbfae39f2fb97ad197111d763a3668df76fa86eb892ee27770679fff4518361cf697dbfe919f7d956ff3e7d49ed8b633fcda7772d3ec7fb0fd9b3d0778dbd2086a905dce8d280dbaa194524ae946f000b3c64a8c514b145a96087a01490ba6d041aacc992733e492275cb67cd2450b55144d42082184104208250771a439daead75aeef1c0872fd7a836fb456981da5a76738d1839ea6563d2125a4ca541ee599f513e8ccf3ec8cd282d49568831c6317a9ee0868c96455a23685921055a84eca82c5fb248c1c2db52e8c9202aa0019bee514016293bee179505ca76a90044182752984891a4354511570a56700591e5e804597e18314305a645854b4bc815149270b910c54542ac8a1ecedc906486960f47c8b4e01ac28422b09470d3022c3da2ae20a2828a2c2d26aaa430258a10537c7061716a99510112277009b9f00452abc815202d16ae8ce06a010b97942e5d9eb8b962891618d102828816ec898b053ab8bcd070e3850906185a4229b458e04410d790134327187363451451b4ca54451de1322ae2e9879b2c9abcb0a4850214b87c20e2329274534513427e68c2474baa4cebca9711b620391143c28584944b4b940a3c606143eb49494b8b1157092cb8aca81ad25aaa22ba99e24c12615a424ce192010b154a8891c22408139e5c2ac0c18914fc88018bd2095c9828baf9c284095a348871f56801112d3a58719a7a3284d20a9a72704dd1d4820249abea85255000620958154b08b97ec862852a8680c24503132d22545a2fb0c00754931d5c46d4e04a9281842525159658316af1608584961464a6bcb88890c2a5431348542d134069c58020727263868992243114a15ac115a6ca51902a3f7630d30498960f2e2e2757ae2421260a0a623754f470c30d2e2666801d6931b5e0cac184224a94d0eaa1440f970d57fca062862cae23fa56696dd1774acb6808d794272e303b34b1a49544925614232e282db89e38214812405a4392103a618cab8a97a12d445c3952e28829ad150cd10ae2890b861d5c5c96b47a48d2cac1080f2db89e9ce00412405a312021e4921a93c44beb862dae1eae984089d60a535c4086b8b1e2890a767065591245122b46925a681971c21254405c3b50092931c6062fad315baeb872034689569329ad3043e0f0e4068b1dbe2c693149e25a62c465420b474ea8e108202d274708b5aa8c711d7981624b0bcc951494702d4d996108284f56b0830b4b8448d20262c455d582abe9042f5480e04045a895c598960c5e5c4c5b905c6959a1440ba62831c4094facece0a2b2444892169411d7112d6c39a10420ae226df78b3242a808322880194245abe809170b5537679068219992b2bb9e2c43ecee5d354c41edaec77b7caa498c3dce15a04c18a32943536025b0f68b9a828214262a65898f2925079894f2032c4a8902b34294e547b65f94142ed60995514aa9208060a9a9224d6a8912b29b2ebae5a45d5db4d311e5a2c4e6942192dba0f49b51c894208504989421246421b3d2eeb446f4a8cdb420340c5f5253524bc418a39c525fa2a49ea094d26a8fa2a20c65f8de7b332d0a5394251dc5294a2cca14168bc5d23a0a972858a290d91b097b731e1b9bb7b1b9919c94242943b42a52477e4825816521a570d85498503e26d4152353cffbe4cc841a1a8173616171c062c2a82750512ba8b2a1205b2d68282d25b1d694aefb4541f1e177a0e0004586dd7d8f0cab305386a2a6c03426ba24871f70142956a464814e689b529414128ccceeec97fda2a0608982c20494a9bbadd49128a9241b10207a7acaf46c1b196bb79d1d971929776209969040c3932c59b2289af192c468a3c2139a2efa7138401049196113da8b71f5f957ff76b68edf1a0fbe8d2eb2aab3b3f3baaff99d0eec1aa3b91f1aa3b8f6dcf5053c3bdb37b8b3c1233d68d084006c407bdbfd63c411f543d2fe8823a4e1c7f86cd09eff0f4c9aa27e807247b2d3e3ba4207de9133fae96b8ef5d21eafb6addd4ab54d4f4c42736c29844118844969d8eab88f5f2a5168ee5c13a5d25f4a4923a5d48daa04c569a17741ee4735bae46895dfa94b850386dda0c1f7de7befbdf79e8f94d1e39933f03df8de63bd0de41b6ef85e4613d3648c1230fa458951daf53331b0fa569b33d3d06f6b97bdcd352af793fdd8ec6bb759fa9a7bc3793ef76bdc7cbbf136fbb8d6d7a0ff646f69c6e81785c513164d5aec2ccc7edb1723eef8f7c96ddd0704dfd7be18ef3dfa7f41668302f4bc410daeef986fbc996b646fb91c1bf0fad6b20deb5bb31bc09dbdf6824ffbbe9659986dc01e3db67d6bc3bee56452e6447b8ee5e39eb4711b42773d3d11c6ff0645fbcfc73d1731c61dcb68cfc110b15fd4972aadfda2be406df71fd7e1798ba2fd9fd0b66ddbc604133bda7bcd8f6fbe362bbab31be2d7db167b8c0efd09ed39fd2ae5fde9a56abf282f52db00fb457939b22dfec2e40bd2d6229eaf559ca7dc31cf1bd4561cb48cfd472dae34e80b49c6898067cce04ff306fef486cfbf786e2d62faf2af367cfbf3f04017b465f8bb36b71390868d789311b3fbba34eee5eae3fb38fb9773d09d3dd8d90eeffbaa56e6fbe65f86bc74d99ae3ad7bb1ddc7408185d4d622ce68de60aba2b1ac785b0b82dcdd96a3bee867cfd20d29670384861c7ef82c162b9eac10da1aebdda94be589a66d32aeb36fdfbbf9a02d0cec9fbddeeef45b986d689cf549ebb6021d9fbeb42f7d5fdab10f3ada9755205501eb40021dbc3ddf4e6dc2e7ab19dd57b54b6c7736aacbd3267580d0d6be561dfa2ac25dbd873aa1c5183f564a6b377f2617a7d09e575c040fb0dff77b9739f77f2ed0ad419bbea4c55b72b8e8452370d1a5b2f7befc2b83f6dc3568d7970ebc2977a9cc200a21161e2433de2b6df5aaf1f6eaf1bf3c01297fc5c95fadbec6db2b2e27fb9fd5d3cf381d20748e8dd5d35f711fb4b5bf32a20c0fdaf7a563dbd6fdc95790061d8b26d811122c4e0c9b3842a227717c4dc344b888c98f384f7c98a483c64518a6431375414b82f261cd47ce536b7c92f169cf3aa30be9537b6598cb88d239981477500c81331261d3bc83f668e513ad4ab2cf61bbe4092a4684d414d586837ed24ffa49dbf0041523426a8aca7db44815a9621527ad6d369ddfe1d996dce9a4b5cda6f33b3c3668b8b5cda6f33b3cd928233d69296df34f50fa291b65987e4ada9d3f697fc29af6b4659bce465539c020e4ee6b9a63982167a3750df835f8b8420e3bcf0d717b1b13fd737f6aefd4043e41b90f25024ab98f563f7e8cc55824a26a725f195142254c4d90c97d94c0a6ad863bb71cb4fdb7bb8d4973bc6d7bc77de484dfc1dde1227800c81d4545c1b43be80463eed341a6bdb4e3ebf090d9b1c58e51510c6ddbe97233c7dc9c60bb73a7089d76748a30205374daf1072dcb38e8742f17b9ce56a628855138aac1443535f868d6d4d43c26aac1493535353535180689740d24d29846d71a1a8c8b70112e9a62a8a8da70c87e515310f1996b915fe7d735bf56fa11616748e5ce35dfcff5817c5b4d6f86b36ed142b768a15f46d4f981fc67a5695ab478ad59fa59b9458b97e134abd72d58ac4c59b6c5731da4a161cd1afdcf3557535bacf4d7d4e8973472cbcfe2b2afbf7a652378807c43db19d7d1bf39fe5667695d58d2f37536d25a7f8669ad334c6b9d8f1ca67f63659c595ac7b2f2968db25136ca4615891628ed02ec174545974b7fbafaf245d87066ae9bacc7ac6cff029d58fd9bc5cc6265162bbf8c98b37ffd6879c5627dce383fce58dc8eb8599d08fb07bef62fe7d03ebf0c67e1cf8f3916877fb5e230b75a752208eaf48e3032c759fce2a4e5ba7d549934655886655846da369a2687b9a6c1ab8c31c6eeee34347fe3345b8d679c8d367d9dc418e3b591c6f7f8b3230419e15f7c71d2cffcb761e62efd658438e4a55cbe6c04ec17c5e5698a26770a25530cdd0b54ef773a30ebfa63fd2caff1e35c0733ec5dceb8c5e71a9a5fe9c03b7bd62a638d03aa3be3ae6f9ac66d97a67c9461f9281f35e95553d2d3553725b5f8fb3636fbda6affe6f5dcc5dd746c5b5fd86adb1cb66dd9281b65a3a61a9776a5f4bd3af9e253281d5b691fffec0861db7f7bfea630faaf931bc83bc8bdf85b9e7602f68bda02e3d2c485686b31db2d623601f68bda22b535c714dbb03effed1161c0a3c71cde175ce0abf75af3d57247f6f50b6ffdcf691ebf38177ac57136e334ad0bfad1e46719771f46cbfdc0af95bba1edc975f0658c4bda691619d1a58a23709f9cfd4645814dc77bef8df8de186f5c5d2a50838ba3cdca66d639b93a679df15e2cd7efd4ad52dd9fca7c1cf3af5faa4d9592605574e1f088deac669702999476a95cf71baeb32db81aee4edd7ba92ed5bd54e001327f0ec3697cd66f55afef55ad1bcee1a592655946b4b51863bc542a7caf0e6ff72a05a57a34f9d6e4fa052197ed97cac3a2e361b9f32f15df36891d0605bc4aea78581e169b9dbff32eda79f253c03e2c5e75a95c2a59965daa7d6badf5528939593c3fe5a3a7a5caa4599fcdfcf9e111d10e5376efbd56bb376b166723cf3ccb471bce39393b27179b97fbc9ae43e8015f6700f6ac0f816dffed9ffaf3ef2bc772371eb0677d67f6cb34098ed103620a272c50f922454b940e4ab218d10d43623f5ed878bfd80f1362444ab11f4c361ca399c39e73e29410dfc67e0cd95bec4709677080c47c50c57c74511203a28453e44efec3260ace8f2a38100a0e09d1fda573b15e9e8bb73b16072460792edea65c379fe2f8d0aefd3eb0e13f695d1bbe1d4f8233c2c643005b0441fb08f99b165de9847e75ad6fadbd3077007bdcb5fa0e7b9dc4365bcee946724e871dbdfada716e47fad38ee4994177ef69fb1e37f2d78e4ed55401efa84067c0036d849e8476a71eac4d949bf946b6e1fb3b05e5a572a9dc07fe8baf10e0739e1e34e80e3231b9cbf8da96cc3cbb99d1cffd3d7f21007a31e0c7877a71818701fcf7daf1ed07dd41a919efb5b73d0efb732a300c5681445218e3224c848b300c37515a428afd911438312969721f1b0c8920112ed29b5729c54898da06d82f3614b5638f5d7f3ef94fdb747853ae83506cf86e64fe6436ca47cf977667ab765393eea0d30cf83006fdc1874eb0097c729f771eeb366fc79723a7b3137b486d1c1368191b7ada4f8b9eff76f7305e171b9ff950ba3f3d9ee7c3c1d093c7f37617f7ab6769e868bfd8508fedc37e31a126fe5f6013d824e6c58062f6d39bbcc08b012ff030c0ce13a38c32461921d28b0191f6fb23cd5f899052062fd3c06f9ba2a196f1ed2d2340692c7ff81acc1b14fafd56a521ccc5c02e5f9c07569844e53c559cc7feb6843ea2d25088712eee33b7283484493c3dce03313542cf39a1d21685863106f8246c029d6093769e5a391bf9f4ed6bee899d87621de7d9a664f0a2a70132e8dbcf79e0d7973af07e39159fbea947c47e2f85c57c6d5268fad5c638e79c336ad9b5f6da2bb4b86dd1f2e76bda66739ded3ad97b764ae9b362cc791573ad974a8cf7dae870b3a2c78bf676b6277a74ec91f5b595b1d9ac9c58ffb675bad7711f8c3fe74c639fc6eab7411b685f9ad75bb1f05ee1af38bfb48935fcaaf65a58f3f5714dac9952dcdd8336dc9452c9e5c87f3bfe94d2a394324af727adf78b0dc13048570c6d4f68dcfd66857edfd9383f83d7e33c0fce785cc7b3dfffcf2864ce39a73b76f7e73c21e8c73a07ffdb8e1d3b7eec1863c7733ee9cf7ebedece4f5f86af56abd5b3de026d8c85b5ca38bf8236d678368549af52f83af605cb97a83058f68b02c3654b305536b521d4e7baf7c1fe299f74dc53b4e7ba8a588f2aca92af49295b163db55ab55a6bb5afbdeed72a69bd19b8cfbbf75eac15107fd21c2a89b459e68bb67975e03cf0be071cf800e65be3edecb50b2187eb6b32d3b8f1fabdd65ecb592c45cfcb6d52740733831739fef0bf2059e95100941276e03cce011327254c5a6909e98806128530021b020e7870010c74c0818c0824a1a3ac91abf9ab10f60acbd5ea31c678e54faf8ac69964507952c08a35575246c9751f6c89a406cf1a29a364c98852466471da5de06d1557f2e7ab931b471925123abe8c08028df834e66b71da7b67a6a141c8e5d4781b7239acff81acaf407b3ec6acd78bf95f9ef3a503efcce1f8c22f191149cdcb57cc346ab808b80bb732a83cd5ac409bff76623da4363462bf2833488e99d09d8d31c6bbe9701effc079a69c8788186ef2c4a4493bc2a49454617008f6f8eca98e0f746c1c5042776f4e7b33d63169cc9ff74ece613bc629a584704228b357126ca2e11dd0c031fb0d8bb63f907b21c95bc706e4dbfe1052cc316a1e44176ead8dd1460fb4bb80d9431b71c0b81da1a10734e0d3b0167640757fe0c1c60307f0572bcedd05d769ffeac1948e312772d366cb3828a0c9d7f6ba4015cd992d8bfeee35fb1201dc1b12babec97a5b5fb2d6f9f9b591d1f3b527ed7d12efe93e2f5bfdfc2dcb5ef31cfd3facafcfe2eaebbf1fb4f3ab03da59bfde5b9de9c4acb53d18ca30176e57f47bf0bd07ef85f741682d7cf642c8c9f7af7b1fc26ae73f776b39eb6eb56addedbbf0df6b3b4203edcebeed6ca63d6d371bcb6d5386f34c05609f6fedfdee69700082dc1b0fbaebe95e6ccf9ee862becdbea001b66619f4b88f85776b558eb0de7645d3c775ef753c8aa7c59b101aeee7f43577cd39e8a613530ae907bb83af63db6e660866c8d1d72a86afb775a4931e6d4db8bb95ad898d422c5b4c771069c7df96d094a3f452d5163a1d9b1ff95135017cfe684028b56deb80efaffaef059fbf18e78c73c639e39cd1edcd345eadb656bbe1fbf9b262587df4c597f78aa6f94b8b31461aa3c797479aa10cf75adfdd29b5b87a8df3b9d328ed7b5af584985894163251503845414134866aabf294045f48b4a72fa29fa17dd2cc322e1f4d0138b9127711ff1e711e2598d4447702d8f1bbc72e00cb83e69e222c8a2afbb55f54144e5b63e5fcd220f69c390ccb34ecc320be5582412227ba63ed783756bdf7e69cbfc6db39ffcc3f3fcf5f3d05dada2a630dbf82b6f6aa9693be244fd8cee80b36335a62b1d9741e3ba7fdeab5f94856cf7a516b6d8db7319793ff077f7dcc056d7f75783b507ebd9776fd2523aea4bbf0cf3c12d917e0f4d09d8531c37c615f86437cef6759a65f7f7e751bdcac872ffdaaf1b67ecf1c44cd45adf5d7785b7339abffd14f7f15408a441a5518f5408118292d4daa44452188a211248c6070257a985042589ea02105467a28828930491811813f8e6431c488fc9e09068671424288981052424d481439633483c081c8842b42e420868a8c0f505431542525c80b08f1638a1cb2c8a082148e289244042795215b902233f828421b80c214145b86a678d1c18813285181cc952d45aca061ca07158f420b112b544a2c711465069df203121148b444996c05669082e587092838a1420a113372042216746062e28910172824518888f1016f684249280c112846a69841af9820849011d884c88f291ca6ca10c18354112641600850411c7962041915846c31001952e1d2924f20481246b420440e4e9ea01089a11e49618811b445132aa4a04cac8a99a122a8966250126204d67a04b66b25d2b51ee9b16b159a1a5ad29bb6d19ac8074a9d362d82029e3046300153855094120ba6822cc91b22504230f454c943f43cbff34f247fe7f53b2087129e96f8c147165033ea83dab512fd7fcfe5a1035a8aa8614c192233ec30833e01e2b48890135164e9c7120c2c0c51451555676af831c491268c88f8d31412c2889348a48890113b340822381005e9c0c4981f66ca14c10405028a2009e23232830f18a2701283911dac0c298acd6004c916285ea8724491a8084491213fa6868c48292314c0080bce70b1a14715d10f44a68696a6449d81fd500609144e50456251080f106668f0c134441527cca84f762562c3aebbfaf02352c9000a494cd9618528534a984157602406a2a50ba8d0013395d4c40a23aa78e28a15f902e4022e3068529340307c8101cb140c50fb7d45daf0dfd2d086dfc1fdbacb6347dd3a0f83f7e0c3d14177bfdf7dba4de7f5769df2a55f5dfd17c551ffe9c7d94420b9e5cfbbe54f8d661c9c949c8df338dc4fcbf970ee9c73c08feef37aa0322cb2bf57647fab138452706abfbfa0c3f6da3a6fb47139997139e73edec0b7761ee8dbf30d1bb65a2c2c86156ad7ba2ba713d3f5e194f5ad8dcad99c4aa3fa8e4c362989098bd8ae6fe3cff9b405bdf4dab4b82d6a3aa96f3024c27de27edfca1bc0a75dad843534f6c7fe7c1a9d6d58cedab7336e03df75be7c630d6f3b3d0de0e0021ee818c1d0911213d7cc98095fbb61ffb15f7fe27c03be4065b30dabb76d83729273095f9c2bf8c44ab24c5c38b25f4c29a6a4f4feb2d4b67f3d73e6cc97ed1cbc6d0397eddf056da80423b3fdb597fdc67bf83beaf607da51370ef8ddddf5e3fc0d9fbe3bf7fc3d845974d96fbf167a6896661e5ff6a7ded9f195fd7cddf852defd7ee24b1022d7d19f74bee2b49193f645163caa17303290af1b21a41f33b00fef6b67539c8781bfad701b4184e141fcd7c36032d1f133d8de00397b9cc7795ebcddf578c0810f62087adce7c5787bca298f788056da980a55fbc55220134b414a62d9bf5f2c096a6b12d7495f527e9dc08bc91783e2095d5ab8b33588e90f7df903d8d96f274a236863940f83fb7467cfece5abe20ddc56f9f4abb4f4ebdbd1417b70b330b402962ddf5798daf2e70a5f26862fb835c7e1f20502d08e1a9fc78ebaf1c360661cfe72661cf35f11ee69730ef96e63becb87ffa43e65c1973829d0f17fe6d7a0a57df950a3afecef6b076b7fc67ddd128a69daf1e3d2d1864f7becb78398ec00ec174b42da4070c78790420861b5f5c20b2437a654cb3428a5ff30c85f5f19ddd9557bfab236dbbc01fcf8eae6e521b909a1fd8e7e7d9971d0a7b4fec06e661b90521abfbe80dc8bfd76b0367c18ecb72c486dedbba07d9ff6db5a55d3d27efb1da1d065f5ddd534b6d1b217feac6918bf9dbd7a75da67d9ed286bf3901b3f90dc73c33adb9c2cccddd5e797b51947f61a0737cb520ac28e10ecfc3ce453fb2b08e9afa8cc38b2f65973ed5734344d7b0f03bc7ad99d9dbddeaf72ce5e661cf7b5d7b297d5b847279ddc7be13c2f83496df8484ffb6deaaf6e6a2cedc50bda90cb360640df8fff7b6963003fb01341d0f6d74dceb9175bb4f831a4a6cded1743826df8dac1f281174e68ffc2a72ffbd7eeec17ee43a7267f42187d9c4066c7d82f7642920a5d628000bfab5fe97b318068c5b9213e95f83df9e26110a5467d095ff0cca6be03da780fbfc6e37278c8ec211783b6cc39e63f8e478ee56cd41ffa137d044aafbbcc39ab2c5b79cc37e8e31a2fb818660320b8ebe320d127342d6df9f2dec8a0dc20273f0f69fffd0ed67edc0e8823e37840cf39e43f8e078c9cb5f3c68ea5dc0be7e19ef08f0ee18efbb97d31e612f951be9cf467471d4774f9e231215481169f36fd3ab5b4e34b3047dbff0ee9b163eca88bc6b2cfd9afb9c6cd3e6707dcef79c80d7f072be7a05fb92ee6980f391ef1fdbbf920d8d05b04febbe6d8887f3f723fdccf1561bffb1dece0b679076b8be03d0cba1b738ec8c92b7940b8736cd48f0f0437e5e48fef80db665026d1e45729f9367654b5ed531c634fcfecd903d89053c005383de89e1d2a0044d141cc1de364c08e2f76dcd1be385f0e081d4fe9369c939dde4f27a6e100ecfbaba32fdfbefd982bd7390f488bd09efbecb0fe9207dc91b31b98616a1bada70c52480d9bb55f4c489330306831214331a316708cc0900959808aa525a822320cb1d28310241b13a22484f3c2cd7e31231f9bee1733eaf11c6993c0051754e001850e8cb0450a0b445780798287205171bf5810283331d891189026382a047121a3608439e70c52d402043d3c9962ea6949114b33a693333288d00f2ff8093c85068b907c294410263706731204078558101df66abf5810251a0bb4e7d6f16cb28206a008e99224aa8916f4b0434f0f4e0a3d4838483edd7f1c532074887e2f718468f96fe21763ee1061fbdbfb62dc979f5f8c1aa4b1a804ce564631643424010009a3150000280c0a868342c158308c9274b61d14800c7fa044744e974da420874118639031c618420831c400030440886caa0058956e60dc687ccef5e20280ab452f25787b747e97d7e6a747c374e0b440ffed039c2161819fad1bdc34bf5008b524040c6b078a1b826bb73164c6b104e25a5de1a1182a8559e0dddfaf4635b0da881b6c1aa897558ed8be3d22a7067dd110bdd451755cae55d36d890827c00c6ea2242af0b7b735c123c28e02c7d4b5ddf56edd702fd1ece0093063a91724ee3759ce6ba3e0a0fe1bfcc67812f4550eafad8d9bd4061dee4f034047be4a4c161e736547869f287bbefd7f5337a706a10fa0b529665954a8554ad07bd63e5a75afe02a32bfb65ea32983894160d59e4ba7af69906bcdb40462adae7041c9815502d7cd7c191f5499dda49a9537ef246d5f94925b52a0748a59429e1c0d6ad5ce4db1aa403c8299c12f217e631ae28412748b44bc896817d15c087369e9980aed45fd57479cb76ab99d79bb1dd0029bf4be2040c315221117c01b97c5fa765bb4b870f7ba2cd2b75bcd227e37a11612a08b80d0699fbef3bb66035afba84113f58dd2105a62c5c1ee03faf456cbada54b28b4d72c790204ca154c7ffa4d800d3e1b71ebbe443a42b2de73236b557cec969f099bf4cf711c82d9a630d899e46d9d518457539145ab1d1c839246a7e2dc15e4957eadd0c38132a1b0c0fb2b7e85d39a3bfd410ab937f819b6d9803e3829dfc53289ab67789f9adb51a5db31361d14f87a6fbfcf1fcb5c70d8058441027fb67163ec88ee6916c3af972b27178205f7edc3339a6e98adb6f8329b92c30bd6593c6cb3ed79a21a60e48af20d89bbf8a0bf7486ad6e600179953c55e67d0d3e603aadcdf20112e93400de01234c903aadc1d99e8640c07a5e338b6823137ce4aad0e156acca640e50582ac699740041226b0031f4de8144047e31258fd58b840c81b8ac964c58d2eb3e7be3424b9c585187424d5704ee2a0589355af1637630af50a872db3fda6e0efcce5e2df7167dcc62da5cd15aeb46c30d9a9e5c3e82e78b24d286eabdcb7494cef81ce62a14a2d549750cd5aa61b7e06713ae430fa77418d89f26336f01c1529f007a26ac139e8cce3e50237bb00c6fc14c9cece42d644bf62924d25072eeb11699a5eb237f3d5503b1ad955ceab1354a1bd5304ab46ab57463775509fadd77ef49bf9db1edb3230eb39f7353a73803ad855838951ecf4da26fd83941779ef3126c7d3a0005fc945979da91d92874c346110887285b428eb1a124372085b14657560318281452908c9b7a7735ba6393df2365916504ec6b5c49e86fb9aa06828e36cf1647aba68b9cba398cac3c63cec3ecb950292f2b163402b709550f882c3caf490b7674fd093e135cf596ca8c9d5cbd8c2607d49e73dc94e8eeaa8133a20319cb0b71f36c78cfa407a9ec64e4e4444a2eacc009b1f6a07f93e5396a07485c38c36447752b852aee692c9ebbe35e9c751e48fd2be5718b5d07999a04060d02cf0dc624b42f40b18527e653844de88cc60bef14d43d532a08fe05503afbb664a716ce0863e46cf888c01a8684b4915c3956e408bbd1d36baa98ba1ba0c04344f259b944b27aab6493d2b767044911b9e857669ade255632bb7d23d0db64bc2db77e3dc7a6f2e657008fbbc16da395a6cf2150e332a1608a6ce1d8848ada39b3d1289611c90a690e57de879b1e7e379899991a857afbdba1b80790bbeaa3198114d0ecaed30d2890bc705f096a23deeede2e709fd0925f858a9dc395295b54b15378c14e05c1b4145d53d47725d07c61ae8b028d00eb97edf118dd020a24d9135799dd4a99d418c9c28f0d19b3c52aa7672d671a7d23133a9c27a187e66550ad73850656b60fdbb3d1d82c766ee14ac1f2bbfbe371695202f49dfe72bf79be1143e5f6e3fe30b4c997029872021e79dd61e3c002667125ed1f4c23e74a18322d4eca52499a4e144d81f8a0a59f79345d58a5833ef06bc5e4755e6ec68c7e38b328a2c27c934d46c0257b473225995c6318df4883aeb062e82ab2e1950238f25ee93fa0958d65c17ddb51d2949034919fd191bf0a2f9a973225fc231b4b4292fe396098672fbb9a28ade439c007ad6387ba682663e63bc802e6384b8774d8b6243a885be794abd5908993efd73b6fa6f0804459df118d6023b4e40015b185a1a7a840ee26aebfa0825bffcb807db2eb76d83bf66f6868dc229602b9b9d3f3f33eddd365653b5fb3db27c4b34934d31f8a048c2d4d36c4da5cbb464e9928ad4f902718f298f2a8e1b15d6fbea358fdbc46e51c7bca6629ef44eb35fd58c634d34a89df296d723988bbdda5a1ab24827f02aa5788dd994b249b4e12dfe4852814ebfb3e859406f594cd0d89c98c4a06b911a76a82ac155133bdd97d29ab73f27433263811e660d9b4b457af8f54214b12692896ac49158c520d560f13d41a696224398430ba0a92b34234a80a5190cb88037d5d60a7b44ead44325c3e1125c8dce2902cc1780ef560f05c179095d1896db3cd0c88ce25dca3a0f70b2dae5ba6df399c38ecd43955dd6213a75cab25f152cc5ae8f8a71249196b068e7e4af7290690020faa38774130905b3449a066ebbdd03d5495b0679d8b8c94b1a364e9cc789988101c4469cbf84a114c38f7208acc2b4a41c9ea76e14dd47a862c7331f4d12350a70b188e4a1733e48266b1462323bc3cf1e601135a46d29dab548d9036bfeb8a51d2b89654a31c14d150237c7556b9c18906e4be54a13675c47239bd6c3ca7e6e52d808c5ec53648ee6d3a210174fa4518d09ca4f9872b2b7d222d0544809fb41cbd1f4fee37a27990d41df48fb91b0f735a09a465091571a04c0a2ec530ec93338e851898dad3510c4d12d0500c0f4a40a5999d3f2ccd03080e08667d220421d5600363b0aeb85482313ceaad93a35df8e0c2ce4245728307c08d370433207858a1c502394631545fcb8ba83e55c58b20459b6e61a543461a9b16022d32c3351103b282b11c889896ab23d7b5f3ded6f7b897d3c1d0fe53f100bace5ae87c6fc18c6b79fb0d0fa0d6d490178fafeafe0fa08428ce4478205ec50aa7cebb8f53476f2f01af821d4a12b5a3e794cd772792cefa3aa6ba88ebbf030a8d452a53db41e3bc5b9a6ccbd2454243f7889fd82625be31a904a101080c449f14d13a6fa3b1bb05263cd3d5378035a598598ed0d525e25424c8090a53154f2869d01967aada06d19c3441c31f4e42c16c2cccfbd1232ab50b04cca1767712ff67de96be262a9e85c7c8fcc26e536082c8c7e6c6331aa261b7595767105e4d0554edbfb196f3b75133b73c0058a3da77ab52ff994cb0013f9cb4dc343c06d6fc84ee0cf7aa88c836c6f1d65164080a8b5259ed7f9900901212e588b0b50efb852c852ad98678149a901d0ed498f46743ffb3813d9c7eb62084b91bb18c218bb0d7566f8e5fe82a7672f0c277be1549adedd74d4c0fd90683643872c55bc7caa8b063d2db8d0384581897c153de1de9908093e8b9a52a589fc2da8569c22e2b0fbd422705e181e4f182e03a2c347fbc5544a4566e4fc5bde6af7b6dffa661d5f196e9127394e9bce629837f26d32b18e244ceacdbced37fca6dd043eff31fa9c6c43150b9dc3397a927588c0acbc410d15a4ab6673dc583f9eefa14ccb7e06085c47cd2388920b44c84e118d936f22c998aa02a2eda228a01beaee6c045834465d3abdaf60a586aacb2ec8ea2522068cc8f254abedda11ae283d2a3265cf07292eb3433e508d040199686bc7bfaa85f6ce7829a0f5cac53f8e42a3ea0d49436a170d6683dc325318b78590be8a6e8f334b715b05ced5c838a9379287ad38d485a27babe17052a5c5d632b913c44471ee7a0f842cfc4c3c1267c1bc65978a02857056237cf739fc956900bfcd81d257c48cf5b4577157a0d284854680c0b4980b89d117088fccc477b765d422d386c3ba87960d9e4b73849e131b358dc537ba6a9ebefb91be58e67a6f43110a7808e07996c19067ced2d5c552667f687c33438fe37c5b7a4741d535ace6609f0ea466711929d32fb2c9351733ece0210b0402bac10d554cac085e57094f44b7d70a9561f52f21658d394570ecd56d5ba6bcde8aa6741ef2f28a88a40178ff17f9f79ce3ca963804a3714b4a16ce751e8d8fffd975ed01dfef1eeff0121384c7a3df04935774828b7517123c75fd573337aeaf1b7fb70a6e282dd06a33cf058a0d9afac0998dba55084fc5488920cb0730fba12dc8512952e9117ab0c0948c97e550c46e48c3ebd69450c4944c296eff9cb3a6b310d2c2538ac7c02a087b59799b2ced59719ed903777a8600342cda457c4a8f5a937b14299d0d8ca0308db154a6290a4bbb30db8d1ce56fcfb24701602a93756c8f11ec744475d92d4b4632991033e80841907cb0d2dff3e25d34ed62a40abdbc1048183f78e7dfbf9ae64e463984570e6036a488b071bb0e64c762c010877eb820afe0f3d9b46405fd15c99acb400a4c55be9734e46dd4963459bae8ed79a1289741555b8d9533a13a919072b150421dae7259aa2ca5fa4e83375b121299ec39e25059cfc938310b7cb282debf72b65f723761850f9f6157e494ff1a35b6bdf1c8760587172cd5f44b597eccf610688741eb1c61b5b06f50c29c55040fda745275418d5db0141bf461f3c544633a401f568ccc38d671efe99cda168a629a076069a8a72522da245554862c01750304f15d8b909fc1900570a8d11405cea55e149b30bd8b00fcf1fbab76d4bcf63ee02af1b00cf2aa0710b07c8ee0503f121a9ff9abb3aa662b1a3f0c00cd13da776338960077998dc33237cfde6b999930d418b6960ec5eab18f638546014e5c8ed3e69e3f47467002e6c20f3c81b322619f0e6d7091a125a588c384822e127a6f992cd0d77ad8dc04ab49889b3c4df6004ea0f7bc5295b0d0875968822c791c6f107d25a8e2ef98a0ffc4b91793d07921f7c4be8f8d7e5577f6dae34ec76f39a48dd458c77d6de70185093eed081f63bd3c59f065e2c2526d154b23e2f2456d8304a70e6bf6f716b1a3e32602c9026f9df2f956f073d3f1e5ea070c126af09e25af1387b84a861747475b4a6c3f8624c8033f92570d8b0b2c81393ec3d3df809a19daa8c12be6271c220c60a1d568a73a7ec074082f1109e3738d268607e3e12f070efb72f408032e446944cdbc1cbae6dc6d974bc25c25f717eb261c410bf4e160fc0219d3ec911c4741b719710a90bd70bf894cb3ba8c9c27d1710ba7be864bed4a6904d80fc3792e6170a8a1f8a44064a7ab223834f05c70e6827f82f150c11247613e4b2bc651d4c608053e2451d18008e3114dd45ca0b81110b36cf7d0fff1d4fd60cef8110bde7d8b11cd4e9426b62c431e18d09f3012abc615e7583c18186bba0c16c0065a642d2d85130bea98ee28b0f23b8785805f670195ec0d8a374303fc15a10666d90acc4b035bb8dc3b26dd79dab4224afa8f81366d020fe379eea71a9977946538072c1241ba36d7e310157d93735fab7be7c4307b9591e1ef400ed496e75d82c231a411ffcf1bd4a5159b76d2551eb768199324d18c0d52c428ac7534e0a6877140f86566b5f0c377d7cabc2ed4f3777e9b1387be23230535dd1d1024042bd71b73a08feaaa1295b17300f9ee0ca9eb1658c04235cd2f27189802ab64044571eadd00bdd03b00f0fb3b51449b3c0790a73932c6f450926ceddff3293fb5df662fec7bc90623438b9871ba550c709b53cda4c55560e12d27e85347c04fc497d3ac2b0e914590fbe41fd85b09d4bf30a7b2800c13cb0d1ff503b6b884514221baed6283889351d3b802cd7c929fa4b2d9fd619f24286d4039335a65b384a93ed31a92d4cf53c5a8bf5387c795d33ebc151b93b957e7609006e40a299430dadb01442b59f6c0e41afa9150b63980da41761f5dc426128d7f7f83a4daa8d1947fe194e292e906de95cecea4a369b3f580f5ab3721b157a65aa679193319612ee44f4f977263acab35ce30c16016ed491b62e185e55190ba992a8290e51ee1b99cd5361d8465762d9b62abb2ca7e45e5d24b29eb1ca0137a5f31bee7befe642828f7727d6391c8410b1b9e97c6b5c2294ff7f878bcb7120232ff54a0b6d60bfd857c5e9f7cffecec29b209647d87b5650a6a5454dda3254f724aa044bdd7d790031bbe95272130c21373b84334569a273916a0f30ec3bdcae228519214fba8120b421dbaf4d19f3e1d5cf29308dab0899454c85919fef530e400ec95bd5836137d3b3cd7071b66fafac11ddc850b1a5e3ec737f74fad0529125f00c7cf2f3c9ecc7e7b0418b08d1906670be587d59a84b7e589b4856ba4a32f29d2a6ece3832be0fc4a80adc0f02f3e397f05454d020a098051fa8992959865839f3662e3c00c5aee55dc3c10f777c2b1dbc63a5c57d151bbfb3fef89eb80df24f9f56f10d0009ca73eafe4a359f1954802040e321df43c0a9e50fc77d7b0b2be025b814bf3086292748ca53f3b190dee6c74332af3e832583c72b685bf6a3a54f1c7c73da534ac18c7abe2c35d66c708c71ebca3049754bb06c9a4124f60d42a8718606a21d45d5e18b115aaac492d6ac4724676feab6d69bfa07ac1af847536e52361c7586e7a7b843f5dd1de15ce588c137aee4dc34bc023653d98f1d581df8aae5d40907260a8daa6ef79c27cd1fc8cb291d6b436d4d15a60e0d1e6890fcb3449297724d154cbb035235ed451111340afdd8d1e5afbc942d4bd922009fe29cd85c789b5859eeadf3afade76d90ebf4328749890a393802adc0d4dd2790fecf01dffa7588a60edbb78e8336572aa0f5933c85cdbe154b220105a34c1679485c04ad4a53935eb0151f2154f4c30b0fd6939d48ba816c146295ae851509e6d5b02328687fbbf339791ababfa5c8e22f0d70d9942e12ef481400493f7493eb39a41b819c2734414b06eef342a6cfa5134ba14747e41a0e6c3d4989d7bf7a4787f916fcad84b45e8fc1c4b62ec8ad9f014cf3b867308f0e32233871e1eb06d7aa1be5c5aacc6e2bfda515c7de6216d1e66e53ac84ad05dcc18a4ddd1e841462718b6dd4700853f54d1bfc4c12b84ccfcbdb0ae36eeb85c26c5f867b53afdbaec5575b4c4b76b71d1c480f6969f4a642ee03b41542f4c65e93bfd53851d2f062577d50eea821cbdced9598903e2e4db4618e74e2376d11780f131781939199e09bfee11c4dea1a50fccd383fc1ae95df5a89bc84508686348c1ccf26e046118c925a6a98d813c4ec7c58695908fb1c1e61b943af5806543698ff2b0cdd5dd8d8e0f41db4e9d8de50d55361079d7c2a0789b8d6b559b78dab5a975baf406cd404435a76b15169428e44aaec9c10b27c3183a0c2f99fb3d416b183b066fad0c7fbbff4c6258fb6e9656ddff6d96c8e89c2e74ff29b8b55e8166e2146ccea18be68ab9404508074a56e9f0bbef7c3ff6692a9c5a686be3f4ec7c3aed88c8ce9f5c7b956699ea2d47e3197e4a09e0bfae95839960ef7fbcdff10de65d9181113db54139e02417e5f476669bac8b776197db6a13862db9ceeed26114d37133ae6f5ccb74cb71fbf9ea777355f5f1c28a059084895018519f6b85e66902d02ddd2fdbb0c4c8f99ec186735c17a0f83da4d9a6e03081a2202c5a7a4b47ec8b0690e5d3d1eeb8d5d56ec8c7f533fa576ef04b0ae9bd5ca308fcba943f915599bc753679dd907559abdc570c59431df14941e7e3233771df532850b85a33b4838434c1546881d54f0b8fc65ecc513c00157e7f225d207d0c0582cc8a8c460fc0daa3e911bcebbfcdfa3143c3a76f53b5c57449d123ac55a4e42bc87964143de8f5204c7803c1f6b848ac8f10e104b8f1765b4f857281dc2e9c887360695663f179403657dc5e7514a8192a4bfdbacef125e9850911424410c89595d492ecda3ba3486fcd1359ec47b4c486dff23f3593b68e916ff00c9b6a26fddb1eb4697966eb4e0328a1242dd9803adbc69cbae1be3f701bb6e8533ce7e85b2fe4bcb2202d6c87af1e40a2905cf86f53e2c7f8a19c5983a6517598341c9631bb0833175a47124a3fdcfa9a3e13a0514ea0d661238e817a2b1efc297ddf40e1acf7c8d9640f2188401f8ad13273fd27b158ab55cfa083203d4099036d41b9b8b55a88ac6b2147f972d689590e72a600e9e1390b06348af2a2578509f4cdb6ac081af4c30b32cbca56d2c277256fa784d339fbca5007385db6445af62b53e38733aa62185ef48c56802ac3a5eb7512406a47a26269c05756c23347c656671d19d685f13161a20470003bb3dc64d05e0b96a79da1a3cfbba0b6a4b7da518ad992a20d7c7d3808f9a4a973d89249d4c7f8f4f0b56008c7031d9d66dd03a20e147d39c7d81f8cc33daf7b0d8a99f07cadd35e58fa735f64b7655500978216b8aafbeb4043591ed24c2b835dd69b36027e1f170bdfd53670284d1c1ac8e563969017292e58aab825ee0d5d1d8c6ddae5e7b4e632c70e11e0a234a67f555fac13ba99e021bb7a204c9c64a7b72f01389273967b46e6a00b8be9879947ebd918b434ace168e8abf4413c7c05bf0974265f148499dfb0df3b5d344c443f10f66770cbe7cd649bd458cfad983be20a8e06db665548c355bcd572cf136ed371c5d64e5584aaf75e138a233658f62f3f9973b722e267021d9b114ef53ae264ff53df21131499d07a5353fc6b4e08a3a8432083008341db94c40349a844035d26883e8c05c45b5355ec84590d88e2c80160857d8539dc2aca3579e306b71c74a74b0dd50b9659f0a0669cd9d7b91ea5139070a3f71d185090b2951329799d61fbe93d1f717ef4b97134df6b8340315e9e53efef62379eeaa68e5e7b5efa463c65caf5c5e65a0c381406c8a2096c90d95eabc61ad8fbdaa3ef52c331c2c3c5a6367f51ffd7f82d3dfbae828d5ec9997f2baebf8a384ace8cc08b209402edc913e546b7dea618196d6aafc11b94cde2ad877a9723f90215e01bf6b3523e103741baeb6443e1f5887c5ef96b4928f81410a83064b85fad32338ef29504a6ce5081614f19d03c6aac212f6a4dca2a3a24bafe7c9110b2d1d302b30fb2a52a6971acaefaa07536fb3e314afb5dcba0c160f51866dba919515a3b782684c9bb266c5665604f578d40314701d1a4233cc98853e2a18f5f15eceb167e61210b9fe83a176ac2f0022a39b31f370ace4543a3718ad10c0b2deb6ee09cfe0c22268adf21f11a995639cc2031f4014467a597686f6d2526d0200fab7868a7d1cfbc4425cb4bd0511380d13136fe24248603205a707ee9ce6de3b54a6c01c671fe9485d0168cdb111d9a00ddc0bcbc0daab4c2300afe7430b4b305024a2132c7b6da32d1fbba2e07818e1d87897ab9e0a829da0c03d1a1d8f4dfb5a4cac983ed038d4652d151c950db4bd1fe7f8b1212685f96fce4ba27ca077938e95a69b669f830c04767ecc810b9a2ea15f74eb2f2afa8de932225833349915a4df85b8383f009d56dc5200fff05b64d19c15593a4c2dc91c0cd898254dbe2b3b178862d7564daf513f0fde0568f12e05a2dc5ad65a607523abfbd131bb583f246d9eb1a5613e919bcf092f3e588396c9cc9ffee38a44e882f1d97d61191a9b68c768ade5645bd03f1044a789dca43909643a2a0ac6f775021de277feafa94440b1301fd29986b91d4a91c0e8e79154d2071e8213218054a950f7522fa2b0542b755b94b7746b7a2ae1574b306a79603f2b0bec8dbde3d611b4ed27e415ca335c11d4c2885c7f3b9d721c83e8bf7c53f9b75615b958a3df93682c5b1c1ad8e918f42539b92172389742f008faf2b9a8244a099a17642ba7b3e5f6b42d8bed1ce88d878a4c7937d98be22ee1e2cc6d7990bd40ae33cce6f3270450ab68bbf020546562433100ecc17692e674e900ec57e8978ea2b1d8dd89efeb8f1b1319780ea35ed7223ec6b5d0b53e1396428517cd115599997800da3d46e83e197a54bd8eea404ee41fd617d89fc868f025747b6cba84f5a7a41ac50f2ead04fd3449e05c92d1daf0fdaa97274b54c5eb01ed4a5747c2e8f989bc3f81d4c7a3682829b4a633d8a0357d4452cdcdea2028986f391df27587aacaea9760e536fbcbac239da7d92e9b133bb68344c658d92bef58e56072cdd4ec2c1631df5a3113753e101756e9202ec98fbf06f0faf5249a038093ac8310c80230050a32528dd2fea21dd1f43426c6643f1f5cb1b7d8de3a032e078462ecec15bf84392dd290b07c45b52c44f9c0b86174e8cefb2819c9f8233fe8324a3045e0c3b8535684107db229bfd3a0130fe227eb48aa6c4b2eb17d52188f5e1140c7b222578ab779d4ad0695086f5db9341beccf93ce4a25cc9882adc19550c958a60920e24b5ab2c3921bbda5ee01afc9562f35eab8a8e87f59e9f9052b4ab098bc770ea1dd4ce91bfa376169d50cb4862fdbb00a7285ad2fc6ba025669a9a3e26862c17b3b775a4bd7899e3a673fc0722f34d43f7d83ae3bf460b7f469f61a4b764974dde522382d90b1d41d5823cf04ed62fe640c91e354b132525c9e8e8977d1a8a875bada7a02ca03b8872260e64b2ed45cccef0d43df3f314647c21d2ae0f0b5b732b95ac79b263fd6962f65074280db9a60ed92fc12b1bb1ba6f4a3f8e24ef6304f43ef4170225bb7d4712d7202162aeecbd6566a7a214ec734375ce36023de13644a25c96abe53ad804beaade4522acadaf67ee40437e4595c5de10760f865c07652774679946fa78a8292753f5801fa3e0e05caf140f2346d72b4cd078af9f828bcf58c7ec76abb90ecb566136b6aafa20e98d08355879e0b27d88726e82998ae223ae28828c5e887e83ebf666a792bccfafa246b97c93deca6229d0f3ffe55ebdc2c9166c5a5208e4fb415229d40f59be519ee28dd3f30afd1f32b4e2257249b804f05f0c07c79e2db8ee17a07dc5224e4d866728e696770804b958f577ec75ff9158649e4ae3d89044a23fae4050f06a912fe37146cc7f2aa3124ef4ac13d9fd17037bcf96312e625a71bfb054c4669b0c37a68b748565c73ad02395d8de420c67a4340dea1a399057844ea36437dbd8c6e1cb3303054a3c23b3043e35bd11b02f06c9b7187605e7b4f82fd408359053461557ff71dbe34c7ab05fe836e32c28b5055eb47180399dc06cb0c12154d27d6a4c9b47c6a8205743e613a36b8d4e3807a1ee4aef9d4b9e8229efab9e914ec37715165299ea48bd29accfaa585ccb8b2564c1167ed833f9667b1a72fd1d48f0443b62f53f039c27bd6f54be3e25e2140280b3d7dfb025cb7ba608f934184365f84688a78e90c59515059de9c65f8ef7be8c87515c3961e8a7b734d1d69502c78c3347fbab1a34131050cbf5f047fb5b202357d9a8d13d8871ca60b6f9358c164030c804bf3bdb8e11746706723c9cf705960e7f2fdefae1f00eacf95c0963f70d6f427c5c77817d234f9610e0be0eca2316293ba85ad9b16daaa7cccebdfe63a9aee710abd835dfc23795b1b5d31b5499a0686414c5ba122b9f2590a88ae0cacb9bf46d4eb6cc125c00235191b579781b51086d62f1bda4e1305ae53d0cf0245dc8899dac4c880c24626b211648675dee3cfe1bd3c844630594113df491bd510c4bc63c230abd718980265d5a2abdab1f624954d6709d3054c95d35d8278bace5a070a9b0d09108ae2a01dcc3a15d635be66dab78f29738eb42f4f8a26d9fe739d8802b41204ec1f9a6be72cf85683f4fa0e6ebad003a764ac5dd70583e458eba2146d0554a01e0527d01422186590539389198f327a08f6143b36323fbabb4d7d8d2792e4161679cc2779bdfeb6b06417fd5173687bfa02ff802b72ae049605579ad7987fce8b2b1bfbb5e14636b8367e2b51d65976e99218405058c74ce7f299a07cf12c9e213ef333c94a5de311f72b73af4c285d3ab383f76ae3d1b2cc7f43b5c5679e77abfe8f9a1f3eddbcd858af4766995b3db9809782fac44b5da880c0c2e2d00056b81f61172d2338ae4a33bcc1c305f2b59f6312ec237c48733eb72135360c8725216be5e6468fd65dd18cecebb12690f000cb6b6dd6d33f273b01ae434d808d2cb22fa922ebe16b026ea119b8d758100773a8897b95a701c6bd28599003f59676d775734ed5c04f67a40d418a30124c8484fdd7614dd2612f2c946ce3e22233987554bb746d4249e4e926ee64380db68ac38fef31972530ae0970e7e2604d83d036be6b597e3767839aecf42ed007fbd2c91201f3cb3233aa4133f253488856c54c21542fee5611e353d26c261cb9456da002a0c5b0e7b593050e6427cca3c3a0359f70307bbbf481151aeb981fa983ca364dc5a7e58401c55251b2debb464931e5af9b05256f6741fba55fb2472230ac177aa1157d7a9b40b60da8d06b80af78ce324142344122acc4a8ad8d5948cf32b1a062c97d14bda015fa7caeea08021663180d025c702eacb37cd5a42943460e2d3449daaf9e512a1019e86dda4e3da95e9dcf5ad0c5f0d0d331e2d39dcac57a10f284ea0da4d1e4b987bc9b6a609c287f4f738422df9f188f5a9022395496f2a220a79f3406a8b2382871475dbcb63df5e39e162430a5f0a452b37632732b21a8ccbe2a972ebdc3d0e84c7aea5600d98307dcb76536750dbd2431a1398251da4966f1a73469e9cb1907d2d52152b669344f3b65e0eb3091f0b219f4fc861545cbbee44dc32d839e1e330f7017880adf4bf2958756b048c05ea0fa5a841a94531cb37df5eb2388ce5f084cfbb76c0d49d62b6fd0b49384f468e7c7be1849ce1f4d67ec02e6ea3f9e7e22c8255e839c276ea84b2b1a55716e261c41570d2215b61524c078486d5bde254d88fab74a87d533ee2c711952c317543c8438e4d5feb3b8dd331728c84f7dc43a9449aeb55737b40946a591d143be4a0267f6a0cbdab5db8288cec4d20f88842cfca51bb10c6b6b154914710ae3d864e860414e297e18193f73eec2508a89fa149ec48b6af1b3c8e27a58c794efb82911f460971b58ec97119ca0aef28c4e392f6c96ec9cd7384d1943d3166228ceab996ca18512a1c859fd7d4cdc81cf8f5dc0604971ea42d250a374a068dbe06d106a871b78e426c4140e3424c8b6505d4a54cff694ef9f9a90cf8b94787cb661b760fa1262967e06e8b1a01e2b0c8994fcdaa45097d505f16551a8b52560c2a642108a575c854140121a747d5ffcaad61c11aa3d85a54ddcfaacd0f45cdc32aee64f3c1410e8761458f75bfb7e6346ce5e6c73bf360481ffa7f243300373e75dec154698921d6d4e69d172eca2457c027a1c7754b68b27dbf6590df20af3961a419cbb5c56d6911c1969246cd726a5dd8a6d4e2d782c94ac5e0e522ac27db67af68bc6ba0acc3f3370067282d4ca635e2af39965035600f98f2f85bc932d628e4d31fd5fd9252bd008b3590d56706010992218dbb84e430001ca35481ae92b6a653899fe8ce03356a8eb4581c8e3fef1c5223df7e8b294517d40bb92dc09c69449c033b1fff064a2bdd2c1ee943b7ece5ca748b7750ea0b3d507e24944cc6785c83c50290aca49e399261e3bf4eddbbe9feed74ec9a88690b4e093eef5d276061ea022fcf07a0508a9ba53d6a19cbc9512690a082d2d765430f70c8f3984c782db718f199636d0a0fb4492c4632eb6792f20fa529694cd0b2ce9c3f91467922962151f19e165142dc076fe41ed42c84201735734b6c4a05e5a8c1a735a25328cb5d50a47bfdd82e5c3be89921e4568a6decf75e615af3c47977acc8ce543bbecea56dcc50cefc296a1628d01221b624d766f0b8f9b50fabf42a05748757a7d75bafa0a2c4bafaeabf9d2c4e2531c9b6c6d7a7bea89d5a1b7140d91051e4eb5db9f22cbee01bca8f77252c4419cc7a1bdd1f784d7ac77bf14a9d44b73cd14c3f71acc93ea0339baa94a897dae5d174ed07b415d36bda80f5a4027e20022db71d3c119ac666f484dda0d77ccadf4c1f620fe5361df7eafae2cc45408fb690da5ba6a86b016fb1249f7d1b3c6c585bd7382d0b9487270054fbed0f046e3e5cc438e91fc1aca4217164207b8fe207e0bdf0b59ae38928db967bcb6e4c2a445ab65e598a64cf47c42d8c3c69511028518916ba753210194cf6a9ca89bdb64247e77a3c6d0ba8283c002b000c0d8bbd6df76542a20cf62d78612c0141d977eaa7c5cb9bc723c3fa52b42fd99537dae2ded6fe4b40e455064ae8d12d1168f90e62d4434e9606213a2e193bf488fe8e65a53ebd23bb0cb4f2c7ead2075979361b26061801dc6b97bb2a011604af9856705f072b05b664a4f75043c9c931cb0284c4b7d1792aac7389615d129aed11e479655f1207667cb6f88032bd5ce14604819e51e4d2815c837aa85c8bb45f177a6835ee2d9660eb35e82e6d29da22673e0d943b10f1c4a5fb6e24762077c03d4fe09ea60d56b538aa9f0a4fb601200278ac8ebd9bdcd46a9c88fcd7189a2fd38df6d8b1ef4947ecff7e1dc6a1f1f8ffb3c6d6683ac40005c473b8b265e4a84e98615b1cb9c9c612adcee42a0f36c7bc7af54d8aef7ad59a65b41fea9a30576b9ded1e037be58be0a64126251c3ed87af261214be9a4261cdda81fb5805734f49fec7b78c4abd0eb2682e02b7de03ddfc9bebadd1bd75a79f39398c52e4c1d6357ccb02fc0974310dd952773ddfbb474eff14d9197946f7c7a631aed6e6812052f74b5dda2c674ec9f82fb60ca0be357904b7e4cede59c3fc375b200782dd782c9b93cd373fa563b3446194914007998f0bac245022ce422613265c63dc07ba289f867c1d0225c86d804493a26abbf2e9658094eae697b24a3073ca28487f9bd7e0713cd142319dfaa581ee237a0cea5b1ba548791e06b1f6728d31de1a0cb6a3511970f5480ee3e90f12bf20b12554e2168d1d7421cc11a5d01f88f46f6c278d28bfe99b28968254247c7212de088bc15d2e5c0d1c1f3fef7b40a4c225a042a19f9f7be014efc227b38c1f90e8da99ca393b1a421212edec3990adfc863602cf7bdae2414c3a7f244cfae60888232d08ea08d4a8b9696aac14da4edfbb468f852d4ec46ec27ff9a9b27ccb085908eeb961dae9cba3ea75b23d3dbfdb5c1cdd9c38c78e6bae5e2dde31a12762f809ffdd0dd4b2932575d66cda7d68b41f8c6764c4863b617eaa324834ca8599a34eb0e8abe7f55f5c787fb74ef42f57c0681dbb39aca260bdd23bb156d0dbd2d16a28bd3facecba2eea2465445113762b4ebdb786775c6c872eb013a45f609b23468210eac6d8a92d58db6bb9d8127acc7245f09c4c288de4476dca56109175aa6a9c06d2a8a56c2f877c7651f033fe6f38ecccc3e51f2c979752ca7a905c9d3bde1f3bcc92642f4561bc958c3ecf38152aa3231f9ce7d3efbcb5524a3edcf75da4e0b7efa0a5c5842956357967460f77976a5d4c651868369b44827d6b98b8f048afdab7ff18c07753a49defd422d9d14a80dc86a14d10779b1d91ad33e8b31d6fc20ceb85e6ac70f38a007729850e47e6658fa31893e296a8b85148e3241b4b92b1d4a169e3536d9ea1741d6b8e7769c281be26d0f1c49e011c9db7f7dadfd8cca85f3492034ce458bcd3ac18d4019b3b7101ca9765c79f14b901868c2020b26ceb95bebd30b922711072b6b7bcb3c508fa0dfb7e91c85ed6343fc1371cad72263cf2ea9c43b0e07b3cc32b7947f696d5a973de5d964db3702c2549ded7e84b715031bc4293c5ba4013891c75f5413256ebbd1621840ebae00ce1e197c269e7df3c941dd27b33cfcaaf10316ca27e7c9f33f73cb1a94c02846583cdbd06c17b1a3553c6e47ba2b2936761c3d9587059358907f738ba5d14d71345784189b2b178340eaeee4e5b20c25c23eb75e42547c599835ba8fddd54358ba73c12658da85936fc052f4c9f86c6e0139f896ac5e46538443d32904dec99093512f7650f1149205af00bc05abb6b17d23e076d10cb013799c0ad3a6eec6746b50137c3a01f44985be1158fb573daaa5eac9d58436ff3d48341ea3c585137923d81bc4d9ae770c46570776703997a772de630a7009112b4c8d7159b3b0e0b9fed47a7e937a219c5119b879509a7a7980c71c1a21b3dcaf4a8289a2546bfb64417ae25e4b8d23c9d45d6117a4602d54403570d4a1f5ce524f05da730182490c4a4f8eaa55414b25b8f8ddfd9074b6ba23598793d8f67c70040412e3bd295a3a98b500b8a682a3565e188bcc6fe20a1003ed3635c083c528877904f3dcc72b448b61deaac5de552d57368b56862cb39cd0a0192995b2b599a0d36a7065c16af8f072a5f8fb429e0081ad12dfd1a19b4002dbe70688c2e2fd7b6b3d145464ae94f729a491783bc1c158c9562d2d09548b1b34a6dd7b71ffa035841ee85dc5ae2ab1a94ef22d14136b0a4e1567481cf1cce39ef128838906d25a2801d6b74016353fb25194b9dc002be8f2c05f8574cd59161f468fd92cfd17e3a6675bfebb03ea8ec4f8d727ddf0658c2a096d0899789bccac1c2d13d93078947bf2aef40b1af1480242bfb98cd7219de66b30e3124140c467ea989cdad6a1517db37f208801842d98f9ff6c6faf2110da7b9c8db5e3c62ee3f205a5b4ed1b3db07bbc79fd669d85e65e85bd45231735dcde3aca8bfa99815bec953e06fa6448f27c2ad29e9ad43039a0ea6fb21ecddb0ac6a9384345fef28998b7b2c34e2c2dcf07580086fa91751893b825e1bb7df32c4fa83a962d69fd374486561ceb9192c5fa61c1a9b6e759248720cf0d3af2e295a1d58ba465531b5831d8a1b914a8c1ed0e25cda2d4bc2066b8f350ecacd463329f3e8c0714b7a2f330e82a0dbc9a7b4f2bc87dba1ccc0a73f92599135af1d76750479508ceb74be7fec7fe9ba4dd8e1772b4893afbef0b71829bc39cb4c5bb8a76c4ec6346f026b80ab4791d9c56a95d607982ee5837c481218ab86b0b6238c34eff0522f4487b6d1bc403bd1c37c0acc42cbf98fa361464c7207c45858a0f74064a580ed9aa8613ae488a8bc1f401130a531c85be80acdfa0e190d068cd7202eaa148ef1c9dbfec336cb8ae3575c1a063e1b56c3a1ef1fc0d29cfe267bc7a54eb642188676766c2568087cf429d3be54c459a49c9e20a2fc5e1c0dee52635715b696e65a7a3b62a93c1cda05b73cbdbd7a0918fc3cdd21334656818ca1fb5f3341b80bcedc3a16f77f66f0ee4aa30c4aff149fa3197a43d4b5c30e3d1d11bde10956feae925bb5283a5ecaf7b0506830bcdcd1b5eeee50f61d28542cd4614abc20a7962dfb42cb6bfaf11b26e4ee5103eb7080e9eccaa4244239436c6824498f4b99702b160e5fff77ada3d68f4fb41a7470e312131f72ce901070563ba1fe9f282e5303601e5623155f2481da5a1a17d91c70f02571eb659d1713abd45923b041ceed76ad0fc6285888f99c6e34a90666230684863bb18634a72d2d6d2d2bcf4109774dcc4977fa0c2bc66ca51acb16abce184b2c666a0c4a492d6eb5d350b574541c0644970d75772d077ccda11bbfe6dcb9878b4f8757a6ca13d69d1901c8d9329490134e9d40fb23d749ab3538411196292730fcc110655cbeeaa3ded9851a3d10d3d9b1ffe0d2e092110b4c4d548a9c19fdb245b41ead35b46b41a9edefb40191482830c92e94e348a07f218d14a5f1d5824bf42875114bd9265756003375a3ef953b7631e80652c7a9b266950996bb8e4c8ac66991ad40752e3ee247b54f7edcf565e12d221fdaafe5e152a041060b93c9d4c384936c0ed39d078afc4b5e268cbcc34d18c0de0c59afa8bffb9fe1c4fb962bcd9fa2ce80f68604f5f4da2cd7d1bba56c55a53fbbd7420084362e957a5d70f697ecc88d114f9d04c86d26c65ba121fb33b1abe5807eca71965093c04d9e576080029cfec09e47f95a3df29d30725fce274a9c5493250e2832a2b77d9b620671e5f7e5e90dea87544f888d689d620202accee9324a1c8f68088570d0dcf743a5f8dffaabe6d18bfb07da6ad4a6a60a9e1db60319257fa198c8a1875d41b169ee8af9c0140d1c98712991ba356a92046ead585b87dab195fa681490227ce9c028ee3b4b840514c038b0bfb4e078c98288afd862095ceac265cc2f4a8ffe7437d50dd6b80d24adc286ce7a84a2960106e56ec64dfb4bda0ebacf46f2f4bcf7bd925607599d2003f86fc1001ef862ff1d1df947682c35a0af309395d8c61799ed4708ae99ed6866745ee3e0d598646b311819385145cef1361585ae41fe08faa5cca47ca9f3ed03cbd04dabae0ffdb5ce00e938c5cccaadc4dec13a52756c9a0ffa657c60dc5c5bc14626bea2ade2f981b0fdda1aaf1442586911b7248340575fdb25b0ab32047b003f6841c704fb7229d7c24082ede377dc021e8e5d81c497c6401fa423bea20eb6be231819e4b374466f80caa3af5bfe55613dc1d83aec5fcb6bbeb50e6ba41f03c0c60485d5b749611e0d2e4ff64ff10e0863a19da84be9a70e5e72bdadb5ac931f62b1b5f02c40cd0eefa39794d656b851aaac32c233a1ed84ac31eec33b97a8f3b17374df3ca94b52af0604008fd05708b9292027965cdb7dfd711a14ed4df15834d940a44f27a69302013ea10a47babbb0162c2493e6a21092bc41bc4725823dc16c69da7f6d93077ff6b1337a36969e6386dddba2d0f5b335ab6ef2e9107db995260411e0bf329c544f0ceaf304eede12892337c8607ed5773c9df97dae307698c8fe9976edb6899e799d1491866e4a9132a9c1b8cae9325b64a65355a2aa9c4a01f8494402c7af4b6f3327f58e23ca78d712b3c06b92c5f8e29ad57da4498137360ac6e2ee6b20bc81f400c45b3ba2e816b4b51f420d3a043876b88299cbc54b5ecd2003dcbf4e95d7932c89a0dbdf445a59c9de5ddf571901c566997fcb6f98f3f8ed05b7024bf944d566d9d2e54d78ee53dcd9e0c6ede698d9073d4411c7c262b5a57ba8e06f7d638dd7ad07a532a1958640a715c480c24b481a10f7b0347b7c33b6d0128b05303a41dde49b7da8aa25e6faaec261d9fa77826790d1a532570c085ac04142a14410c9a57e500622a1cde80686100ddcd48c581f769a1b1f4fc29f123cc2d37ab48cd00c0a7fa16521a6bce57610852438a5a41b5c74c0bb46c31134ca53143dbc8560ccf814b402b2c03298b8b4eb0cf97769878e13aea57f64f33f5ae4be83c9343df6309c642fdd18b0ec5f64fb3ba9f8cd71113fa415b917b9d3521b85372a60eb5c443a9498400d83780e8a21e0160aab1b603e3e8167f6d52648e48398843804df3ffbff7399d81cfb2fdfc0edb81d6b536670affb83b38bec67e088076e6dcaf5551e7a4489ba4ef976b95f39bd45dae8eb2007fd6bf1d67573add61ed93626755342d4c1a44055056d021d6e239e9f3dc54f83be10403a70b6b8753b45bfabc71cdb5389e525f68cefe0e014f250b6b93c271fa4918b45721a491f3e1c6f3c5c0c3f4a951a6a22734475fd3486326d73d9571339a117349d433c49af19157d1247751e471e5595a24d91bc437bb8cd34c00ad737fc1dbf3fa5fbc7e0740dce264654be5013a265e4b49081b832a9de77643fcfe3af5358a3a99d7924b6233111d490632b71125828360bcc49c140ccc5dfa4ca4a0e6b90018092b58631af0c1c08a4e302e36661ad5c933555572c6efbf23237177d69af8cbcf445682f05bf6ee248523a99d785ea4044c8c85eb04c3c7da68a0751005fd40b46a16d4fe82f5d97aa57b7052b6ce60519242984d7aee7bf5f86c04fd7e409d65fb9d001d7d99aa036d31c239d15053a83d9b4614800e1d7456811c54530e0fa7c31a549b89694fe5c93818bb4e3e0014b73f0bbb23ec711a941f2187fc2c38e6fa032699d1a03e30ed35a3f90d89be464947c2229c39480334b229f6470007ef50f88e3e954337406c4cc9710642dd079f699fa89e03fce75349c27d87a77592d8c8046b8701349d9d102c3d79cd9bc7201051b042228089e7c58ce5e8fe1e90deedf6ea5c94299b4c4c71bf938c785c6bfe2514fc366b7fe082c230d6fcc66cb18617d552c8ce9257a415cb42211fad918c7e526312efdce8c3b7e9dda8fa9c6d6883d139a9064c857b6f72005f6a5c8f78ce1ac0a83d749628175aab1c50260fa232db9538e695a47c2b15268de29bcd233587214c1c5e96ef1b1d809812ca4bcaf02cb05d0d0cc5838db9f3ec3b558be6264b68e92787f1d762ac150db1d0f7791cac942664084673a77a427aa94333302eac0ed11b248fd6874e988f9f5f5691c1337de4358fad0dbead55607a6c33e332d51e9e23595180047ed7d8ae52bab5aa12992ecfeea93d90ad07d17dc3839117f79c498e1f44c99e3e225f4b341170aac0c633a45ebd07259ed25382a070ca47c744da457988fc1153643aedd081af0a34df731e1df4e92f075f661d0a49a12eb77bc8ffb2100f4a9f531ee130e23567f85ca52983901840b1957c405b2ef82dce2e208d76e35743418be58416ed084ce21e68b2aeffae948c5a71713c0a688e1c0d4a9d34e25488248a24868cdeaaa8333d0c048434eb6565cfab7369faa0d92de2a83684ac3023b39b18053742e479410284088ccf83ad016cc2e49b7207dc90331850cf754915f4343061884a585c9b0182f5cd390b16ac098714d3afd90378b7f59d1451c252130f6f80eb51ae5b8c7eea1174a34c5323d1a6a7d056a75c73a3954f9c4ca3db5505385f6bbfbcf040b6260a3f135ee62fabb62f1bc0b05041aa536e9d7123d5f24d8530e538b0e8f925a02c54000d66b34ef7f94b7b8983682ad135fc33076adcb3e7cd612272b14618b7ea3b5550418de4ec9e3cada5ebbf9b23ab0c32363754814ba99b8e5eb8b57d1ff423a382a4d3c76f27fed77f7b2a84ccad3de1bb5922044e1a207433040f5102ae247e1a7d6b52b0b261da426df64a2b4b75e6f1ccc35c74983a54280c87b3b1914920103c404e32a06a2ca79315b1e22ccde9ea64bfb64f01f7243894e5d5194186d3ccb091a8ce0128a584332c28d5ad1bff2952d10a974e134c8c758f491f00d979768e6fcaf01cfc04a8feace6325f1e2ca716e165d10426676a2af3cc6ed67e83fe6a88628378b7ffdbab527db6ff5b88fa0cdf6a82e62e44677cd6068f14f9e7551103e02da444b84f172efa15f18b4871cf06ec0c4c9a1c9db18307ab0d2b0a56c71cb9475c1eb308235699308ee7e0abeb017db96663a55b602bc1635d80afcdb9de3d8f568a3a037e44ed9466c6d331ae3469a842bdf36819f80f4ffbad664592898b5dd1fb0cbfea8017080410c9575e0c25fb3c4c06029e526fbb6bbeb989d9d2ee761d6011e6936241f82246ada35ba4e8c1cfee829632a947be7d1a06188f16db35f45266480f2f6efe6eaaf90e2c50e40ef607d447031f1c4823c96fb01e7a52585afdbd6db16e756609bf3a8d33e08f497b5a780087aa6338d09f43ef37a6284d3bf28c5360a5c9b72280a039fc95d75aa2cc6ad31ae8ec4156e7a8e45a1b9c2c8bd006cf9b144a6dc873af687c5fd9d9c3d2665b2cb2a01e1da87379d538231c62048a95c0253ea30884b939b0802a815998b973fec783120b4fc6d359e08511ff5bfc8ea456b0068e0e4b7388924c8b59a247a6f5ab60baba0568f3c4cfd029b434af48ab3d9822836da8600e3c3856d1a4df27a7e84f4d49ffaae15567c30287adef92d518f3a8d72d231c51a607c812d79526fbea80236443e81295bf3eb2ae737c99898ffac4e9e90228b4b64351695c73682816f368b16d36c74761688f19f05e4f374c71d517eede16555b2a33dcaed7096d81c5f6f05c1985908ac4271588b6bb091478e843240ab77890b8ef887a3462c4b4f63941141536408f1ae0aa749d732173c9edee1b17665bf51b606a5171dce2d1115784998c1e430ddb86bd4f33a29d550ff3daf7e04cc4261e13fe676951fef2f2725eba5feb9e4e7d2e17f32bca7d436f47f4589faf0ead5cf16071e384c3f4757733308794e749d668d01283967416866edf1bcc501fd2a89ed6a8866ee43461393f0a5a579232185594749b415c6718557c7ada3d4f39d7e803e212e3efa1306581d12411bf633b092c1d8a902304b6b1c6c555f8e48219e68cd39b69c6d7232714938e7297288afd38c588024dc37feba27ae070b566fa58e2436b4cecc01bd3e05d6b91012d8c64901b4e433e852b68e77e06633dae4d981c59150001cdbeb91b94c403887a30939b769ec7cbc266ce1bac41a86f353ef4d964625eed3d15682c72050fea57d0bfb1e7226510a18d4ebfacdf90395e5b78dc05809766df5793b157405fc066397969ee40fcf8b4d08fdb8b8f89087b7b5f81c07d6778430df7e63c8c1d9b1a27cd9d1315c141b017c2dfc800c0c4ed194f9f46e10bea5188d25415ab2c2ce02a29662579a30e53dd908ae8dae45938f1cf1a257809dfb8426f5fd6b4e83c6da0d70a60943492424120ce6baa86fb511de84e978a43044267703ffdba5f99889b9ab254358342a305c656e574740d93833a49b79ded793b720d623104e9fcb3f2696d6dbe2d981e2f3dbb1df784f1cb98e4e3100b490d2b413c7c69cf6851ffca3f28134a9babbc509fef9738f8bfed3e535dbedc607ea0294aa8c207c12b0f3d1e72bea6d385f10be94cc8a8b96bc0c8cebc69cd16ee24314daf4079678944bbb12867e1b03f921d4b88ffc28c5e3e7b631fd23289e050ae6b50279b90790a5b830142388a72659e8953882020ff3dc6d46e65c16f0b397c55c5a035da1d08115f63a55466a1493e317e88be2f4c2189db688c37895aed10bc75045596299e65c92c4a8bbd22b5d74cdbd17e1ebb345a2f91ec29428f115ef9d244c45610a067477117b60e4410d7907bbfd8fdf145c3ae83429c00df2e62c9aca7d282c21cb424cbc86431804a29457b63b0d223e8c3884ee05861ac5ce23d84cb102a48914696a115999ac9b3de3dbf8b56a72c881ddb8f790a3cfbc0d7afce47d7d38b6dbfece5dd70ed12cd81845bfb3a7329001ac4584ab5788c22c833a0f5d7ae3a31eeb0cc246fa76911cd2fc8990584f6635cfad8c4ef831c1b04d89c181939fd5128fd627be407ef1cc8fc7d4f97b845b8042e0a7f8b4cef2c87373c8689bf8f74570b94509e60c1dfea64d69aaff3aa90fbb72aa6ab203283f72626d6c9114718d4e297c96767591611128d12c9281047522e50f498c209303b19640da673aea6082c6df8d9a8fdd5246a00d2a15c8dafdeb1b067ef31bb3f084beb02286b75b70e1131f7d570142241ae28c7cfa1ba7977c4208d02b8cf97b8eed1ae452635d92253f81e37f8097f698141a0645ebf7a526bf452ee84c07b575c4c51c7e748579ed3d478a9fefdabef598b6222dfc7debd8589e30681cd5ac9930687e7199ecedbe72d8ffb2b41d1405fb5b61262567ee0edb5a1b2bb69246d2d22e89f4051d1cf29d6a237c456749e40307e78a8ca9f65732d77168f59133436ecccf1d8350b55beb1c97d09b4c9b80c0ead0d384b0506526f8c40ff3456364dd1ee10bd59bddc51a89676002b3e90730dc6c54e6b1648869bd569676a15c03754439e7cfec75c1a7674c1ee014c766cf8ecc3368024e17a56a03b56923edbb8f8afe18be705d8321b0830915466cd0df8d7cdc288a98437f51294896746d4f1e08a27b831155e5345143d4df5b5e03f37ed514d7ea5080461790429a587811494217c26729c1d53d4a22b7c3693c439b6efbcb42171a77a80b639438da0800545c4b518b5cd1c7ee1ab77e08be63b61cac396cc6c3088d2f164148a8a78f91bf2de3dae84d4985fc7b4ddd706115d77fa188adda61827e9e0974cc0a24529b2a032b1c72b60580b6ae7cfa709a91a644cdc057d437061532402c601028e9faa5c44da5f2878983691fc02937130826d4569cdf5b405dce0470846f52323c9a3bea78dad4b0a1b5ae1e05371f81250f963afbfb08eb41e16e4981f609406cd8bd578e0fe128351c51956db83f4466a085a88a99f596d5eb0d8d4c57cde1aa3f489c22572d9261b024ea7be5df6e42fd595c0ff146c865dbf888c72ac9bfe8503e6c4f47c08a87db980ed1554c703602464ac8a303e198b6f95e3c23d17a718237e78db4347b918eefcd4b2a55c4da365064695120951020d7a6b0b5c5449202c2ee3d91ac035774e57096e2b56e2831fb77b390a16dafd51daec6c40c0dd210f14309edd1a10cd83f15cb5fa4e213baadf4848967ff6a9ce97d503883d4a303b591f2b149a2d539ee5cc69c783549757be7be9a962f4864caa6d8295c311800931c53e85c222e3279055e0a22ef732cce0f44dfd0e40eeabd1d859e3b351f0075e92f269f3425d1beabc9adfa57910b687eea16ad20e3b32d4eaa368d3c01a5fb408108322d21e053e80f25acf3c4cf301f20868503eaad73805ee9b607a6d709e6759f984a83226bb0c15720832e3eb36ad088c1f8840a0d1083181bc0130a906f32714bed0167d53e452f870f716bb8213cabec020803a2cbc32a690616c5428202a78c8985843dcdd97214745fcf8f0226c42b8d5129bb68ae0095d2e2f70e7c025d67948f9f84438e0f8bfb76b057b83fac774468c804d811e1016e65dc2ee9a3faedaa362f20b42344ae1f581f4724517d19a53c0b1f109534473ab9e79f3f24925b5895034bda6f8e7477326a3afdc974e80ebce78f87f70e475f037e3b7b8cc3864a48254923553b65d64c051582058171ca5a7d35f412b6be872c0b8a4acae8386b740711412ea86cc2e7d399606d20fdf0544cbeae6d8dfeceb7a0b87f0335f7925aaeec9f5813393c9b138c666b0cdf54b9b7f4349c0dd23bd46b02132b6ee7acbac61fd44f0fd669e3890f7b811178db9286b769dc4de16bba63c21fbd6e0a4e8790133fe42c22fbf449a2c30f5ee348a62665f5595a3c8fe5d9408f73503dbcd22da63a801b5b8b6f8b798bad81bd290fe1665fa1fa386f0f41d83ed7e453c1df6e4b0724fa163ee5d1a2c2b0041930bed8a89a997300445520f38e9bca0d2dc9a1e4f77d871fc3f57d67374a62cda7c4d0b75477452118a9b240085dcc3e0f0ca2a241989b3b8dd9957423d160badf9d162c7a6def77bcbd0242d15e2392f8532335534d9fbebf7fd4dd7c6a24d8d9f2c35a96f9258e1be8f8e8b2741206ee1562144610e39534f58893bea1af153b4987494efc9afe39ebf73ff5a6902636f43ed9b5c6e03f46aa1875fc43f1d17e43ecc0d4389a9722750623b6c90dd834509f7fd1a58e42c47fc37c848863d1581ba815593fbeac3244c73242c06e810b55e9a733d47a1a7e6a07f467a14341e2e9008950cc14e22d1a73cff5e597e8bc5925384a841cbee470a0fc773836167ac99ac876371122eb23909ba4caed2519fcc762e2f227e39e90c2169477ce435f3bc453947981b61e87f69cf80f3cfd074b46033571b8e7484512d4f6fe33599c8206c6ea49396572689d81833d0cd5f8d85ea1fd334485c3301c7fadc09f44776cafe8d66083ed6d54afb0c77f261831e04858769632ada1678c271228ed89f036859c2af0c6efef13a01201f2b5d2dc12763e47a9e8d2c7b990caf5f9356a05a1002958042b7a5cdb7b7107fecb483337b1d84681a4a12838c4f68702cbf7a5249cb13885271c926c3c41945260af0e4908dfa2e387e0d8e23e03a767a2bbe6160ec1fa6c9cda0529457e921c4289b21d451acfa7af0a8599510f652e377291c94a7464d5340d982b0e85ddcd5ebcecf33ecdc12f24731af75a795a6862843215f58d37c6c80e02c99a24ce0d023524aaa0f07b8ab211e9a198408392f6740aad7e07253de860e2082a3628252d1e7f4cf9d5de6149095d0bcf9d829b53895749fc3eaf5f7f0f5a162841f43e520a5af114b458533dc52e04d647f9861a45482eff6a577f9f7376d1a98d64e572be1091ce145928ee548cf2ab4d752c726460ff0daade17b97c2e91ef9d718986d02677b45b50ee6bf95ac6123d97383395c1fbf20bfad7887f25a80fbefa7d289da6c9c056cdeca6e24b763cce894cee0bda816f6df989f9b173bfff706694346b830ebe15c0d1a910c553041929e9819d82e01f271b4ca8c481eb3305c70e10d6a02188be4bc0b99e6d18b2d0f70c0f8930dd4d43fff0365d0400b4b280e5e938abff4661efba48725c3e571a514edb92a74b3a1b0b4b44a808fe802870d0d5fcf84e27f6fc8c7e6bc1d742100ac893a17fd17dbde95e2c82152842709fade47c47da89f8be8e2c6a4b5a47c6b10c07b86d14362fa7128c33be0bc9b339f45c22baec05d1e925ef37c428c54369bb797c718ba0de36a0657ae56edf92dca98d04e16b24f9aac0caca438308ae23bd569ced72c424a0316d0f8b1509eff2334cf899b31aea64d0200e2066333a9b8a80edf8eeab22fd0bdbf30cbe98f84024047e96a8fe3105ac4a640b8ceb648ad7398050f348975c5fe951d0bc2db834df01a00b458f3de0ba4940a993d8f52b54bb76cd9169babeb959d9f26e8e197a0297d98b35f5bb04d40632ff213e271f6069212b97f8618ce5f215c112127688a5abb34d4aa09d452f805b0d4bffe4d598a187b526588698969670f7d43fc60a79bdf2cbd8276edbcb528018bfb4c89bd19426015ae0ab45d1b52b585a2a06cdb6368b652b60e938c2ce79344ff2cef1c6f646cea1b223ab4be40c3b3e99171d55ff3f1e11a4ecbf04a40099302b853f3505ce79f63c9e4d659ba2c9712147e995c908db5899f44a6ac6b3968ec1d1e66ac8113737f1fab807b79a95db646cddb4ff908bcd90e155f53fbbe32c98ffa6003c6bb6342dcd4604c3dff9e195d40f041e51643b7eef36f443e6e4c867da88e450762bdfbd98b3fb4c86db8c73b7a386c7ba7c6171d1bdc3b12e3aa39f82922b434802ba951037b195695b4d49e1b31c479f1679b44da3d8476122a8729dfdbc771b7720ff95ff2bc2d3255c7ed0b6124b935212868b1c80d43f4898102de3ec12227ad36b039a0bc73886dbff0b4e1dd5fbd2a4850b2b5401b20d0845ad7d4602cd4b0fb8b033834d2695a2fcda1d848fe40285a2085218ca92c2d9d09a0ba3b7c0a47b0bc3019e25d37bd865e35fbdb4ae7f1dcb3bf5958e6ea3490ca1d5ea21e0a0e579bb2462a606187bc6bd6b0f9d8c833308c945f8fe37000fd898c567e9ce82520d8b670e312b04d52f0126fa782684964128bf8e25d3539ab92e824e762c8ea014d0c5f50284278bbabf685d831b4a25836bdaa19aa28f42bf4312fad31b3fe9a5432454bfad8464d79a220eb7201c71704e1dbbf37ddc90cc4467f6de2743c02f68dbcdedc80780f090fce404bf70cc4f3075c4da5779f112b650348df88054a881c6ac61d4c58879a81b63b930a92888943f8f09ebc7ac41e82275916dbff987e4cfcf9e0a207ea4adf433b9747924c7acd8818b4db2ce8adeedf91f745333be9c9022ffbafd81c22a271d0884c5c8406a44b1ca801c721d0c37b2a040d2698aa0b11f51435291f3ee8355ca0a3ce17951f14f97ee1420fc0987f10f80baf1279c1913f08049cddb3dfc0946778a5ee55f4532c35b4e59810e5c15bc92919f302689923af3a530aefc0495e0d8414cf0c3027051323c8b693ef861b9171a21c60ad7219b0de2b777031d2d1909e779aee709b62bfd4f930f0ebde7e269cb10f15293861a517c7634eaf095e8e4a010d0a559866bb9a115aeb5d1b23df5b80dadc07ff78bbe16a6de4a8bb9c96dd45222f9691dad32089a3baa5fd2e3cd02f708f5dfbf16ad704485893e0401cfe41d9f5b8fde1708b764b9dde8937c10218bfe7a7ce26d55a197fec0b8cc122056011fce12f494a0e580f12bba8bc4b383621566f277472378cb703f261682568b769a30d127a5647f4424abe1fd6e95bd1b0c8152b66e050a87c23d36d3a757087a93fc4dd14b58b8c3f5a3bb8ee8f6eed93ec8355068f2d8edd51c429a055041de5d1e9ccaee8e9e69e51911d3cacb21f1c8978045e6e91147f8b1680e00123efa6d43833ebf308307a3ea80a157228c885ff219535ef270b9585c21018603c31e061582cf235a159213e8a74c27fbba6d1b0d15be0097b01c727acc3590e96a125aef25614cffa125211b2c953fe4ed2e8948544084fa2d82083f05d15cbd9875538eb5c21abb7123ff3e6b1fd7bc6ff468cc3fbafb29a8d9000ca8021571bed6ae66ac35813dc1b4ebf78fbed67b573ed5d66d141ae4d50a5177467a224345a5687e31a41e2b179a7bbf372d6eb5e83ebee9263bf75fa2bbd35aa22156713578bebcab2632057a949bcee59d23d9e469d13180b3f28fc2700d99a5300aeb7226fa041963e1cf61eb2d6a20921fe53b3e8065b45f5d2c16d52036b5413c54b9615716aebf07ee577565a3064a65019d69d7cce451cfbebe8317d403f1c3349f09234ab4cdaff2b9c3205c82f0a4240c715e313c89f93bc1670838915b2f97b73e744029521bfd9a318adb9576d25d290a3ffb804c8b4eec73a1a32dc140adc3b8352f5323200fa604496f6815cf19ddc60315e95cf131416445e09e71838d105e5e6467bf374ca3151acc10bdf28c1f4aaa996794bdce4094ef6666a65f62649e80b3408bceb856092f1e7724915e8137af0ab4116b0d55b044f28939a3be786b660470cdc43037455eff53e1810a1e20cb47476660b1b87b0649545573ada15512ddb6d4e9922b1533a05dc5e87c9384fd9434806a5b1912c1d3314b5279d9e55e506253f3795e9bf31b0694418acc33e9ea731071b9045c1c404568afdb9e9634b22ed85a2160e9321eee1a8d6cabef6cd2dd4f154030c97c9637f79e0792271f68e972d02b239ad549e1a0d8695b058088788793e61ae15ae4b67861c8f1bb9ec398a22008d241143042375e896993773f3c0b60dc2398f9ed09ada86a401f495a5df9ceb5ffd26fea8dab0b79d57be335e951c64c749f5d59b9c8d7be17bf418dc90dde6f6d8637aaae3167f696d026f538219c18a0afb0e7f666e9afd46d7db0bfd8dee2114f98a49fb14dff5afabd7fed441b63ce64eb8e8befc1d7e68df20288bac52db24efb5b38d62f9255d7bd94ecbfa9f1cd0ce67c3d412b46b0d3d2148df98185207529ad7b6f6a2c332faf786f7a90af049f768e320ee7dac4b61b3595d1ace1fb1ade0653879251e12997646bb215f5d6731419d48b264ec5afa4fbb6f46d5aa7d7516eca527419983ee55acd27ab79da35e97acbb86596587dded598bd4a57ac1a278dae8cd7f5f7d246b3f657cef3fe6a3463a6d9db79e66e257e1454aeb3c51e35a929d050742819159e3255ed2ffb93ed6495523f8dbdd24dadf71c458edb262fd5bb795dbc6d8f9717cb6b30e6096a84dc4ce57a91b14f6810d8ae5ae7b549dae4b297f9041acd38d572cbdf6c1e3293b5efc9d354465db3acd3cd64b195fb465a1e839fb020a85ca6f61b953c424381e6ea70daed25bea16637ce351e9fc1633479283114de261e23a1c0586824585d1ce7db5ed05cc6b24657eef3f669fa1cb1a5f9e2e5a8e2bbd647f01af78a4720f3d313d82b79f5c1d1ea26684769d8521992d041e4e8f245e371dcc0fa6fc08a50807677f977c3cd8e1905ededdbe28e7454b9b4387529ecc312b9ed96b2293bdd9c6bf48bde18ed74532c34b74f6ca0c225dc09ec6895d342d8eaaa0c056a7403945cd5f61fac42f84036cf2b6617da5fb01255be1961a2612a55c7799b428a77e2766366e1bbd6da563dff9a0d2fd08d7b722fe07e97080828f60c75a337879aabc444a0bec4271e93304c16b0eb894f201a4bb22af72d36c480fbd21c152456ed966069c8b91a236c54ea7a8f5db18038484286390fe962b3e27138c86e28809fc72ff320fbec63849bcdc3a3d87307968e1d31f60c590649618849588bd6a24330ac3fabc6e83f435ccfe4c92fb79764d5e17f7114f46fae82a17e5e782a8e26c8f96b390b9f75f68b63f5d2daeeb497362dc3f16a79485bdd99e3fadf7e20ee1d6f9ca2d51f80a4214d9e7aad6aeffe0649144bad7fe9dab6c09be4ec97ed29c6eabd724925fdb75a63400142b238f67c558210cbb77e6958a07053270c3d90ab57179d3229a64d9e48e7fa3c6121de0e45c6b8ed1dbc84f67b6dc5725d5254daaf5d4df0058a9b40adef361d4ca70be3d068a6f7afeb2bdfb0b1d632e563b5865a90d3efc739dc31bb5ccbd91c0f26a7ca3b0e4b316ebcba9acc4c001cb44b6a050e7f972f9a46288b6571f3c76fa41b4171b864e22c2ff39d10f8d8aeb03d21ce4ba8c487d43f32340000fb26a42075abfddf009d002a510a30619948ee431122394f68fea79475f7f0f103dc9f7dc760b902e61298c6734e9885150a17faf0eed7fc1cb81caba74e43fe29c9e9aed9af569ff3fe3fd40ef48eb5626938b34b36b56bf79cb53058e101fdc65789c0a3d374127e9677dd6bca82a249f8e00020b9684e6ce94e417a74183b9c6a3f07238a6a24e74835ba28f07c3ede57e05c19735b9e7ffc6997745544f197d1bc8a9c03777d5d629fa91c23c15b42a49084c47380243e227d1985a35a7fc510968ca31dae5904915c720f292f7019b34d5f060e7f22a3ae1794f12de2eed64e4fe4b47fbddc9e11528c539298fc97819560b2c4f68f39cfc3d66dcd9457afa15d9343205eca96559e99c8b3671abb2e4c6c1bdec6ccec4bbf014b4eab71cac3d90c569a0a66ff8870d054d741a3126620ffc4e187db762fc92a8469cbe81853e5a69acf44c2ccc56c84caaaea426b544b1417e2986395cec5accfcb0e3410211a34e482c84faad8d29a341e9e28d4eedf57cd569d50116b499eb0e8f59696f0b9a706c9b2208b9fb14be8d33d844ee5f2204c8532e0c1cb754b50dc18ec8a5365507e30d4da5361164fc3ba61f8be71ac122b0713354dae71070bf56116346dc6303a1dfdabf38cbabcc7f8381bbe7a5b34fedeb2a6cd0e1be4d350605fc4d620815f570a0b35e06359bea2385fcd67221e2321a2f80147c44b6d8c435bd94b469c1d6995a14c51a31622854b97d0648cb745baa1b7914d7c29fa07a7097d9f06115a1521a545ac934416cc6c7a5df178de0dcae655ff83e63b4c4ce4118de308cb2efd5f554e60399d22dbc7201a837eb48956b0f8e85d5bf299e4bc01848cc213046755421b31255b82278821c03a2329611f6726421f42ef5b8d6f8c1c440103dc08360cc6869a1664f93e19532291fa6d0eb0c3b83645694c3b878477ecc97833a2fb17fd45a5352f6e387be7ae27b25bf767d132d0ab86ebbaf2803553fd88960578f9f31cee0131ba8a877911079884819423f52e5350abf12332ae67f1fd266293064c2a93eb29ba26d226a8fa6a5009f4b3026aceb95e6050901d710e47d6ba854efec14995ae1ee7fa3cbca4c31e5b99f60143190bfeb2838bec5efa5f08f384db0760118f3f55af72551c6da0a39edb430ce0181a2508a5b100b43f7c44678d5ca2f8e93021a0c07fabdffe777f6f91bd456e29a5943206060c06b105f7de8b6ac1877b5235be1e353549dc1e363e3a7e66703aaaccd864d4d022b09179c4a001c144605c8b7b88616a1bdb01b3a9d6a29a7c34be1bea33c6e3865e43e923ff9471a15a6e5f52bf608efd1acc61735ab19f83b3e69064800c6a9f7fdf4b73fb77efbd74850e750de6d89f418dbfbe8157675aaf9777e74012c8f1ad63d169daecaea7698fb5f05ba1c1dd2de8750ed47cc5b4b7daeb690f7e1c073390419a16de51d755838966a0219d3aad9d39f41eae1e45f4b4d649acf3ae87927eeab1828c839de281521e3bf020f28310fd74efc598474fce596f3ca2703d6a708e9d7a69ba47941e34d87cd810f381d37dd87451f798a2b9988f1ed6da7b392154d3b49c99701fb66ddb38cefa88e2c389f723c7ba623ea6807efce0ede88fce0953dfc67cbcf831feb0f9b1a49fea0a04027d1f0f273f860809d9a91ff54747950b92814522d0341e19c80e223dc476c0b69db4346148136647d9434ebe19db31db3104a9b48389ae32e26aee9812e341a3c84ef588e9f0d1e1a4cf980e26bdcf980eb2cf988e57176faf3a7474dcd0a94e9f3fbf62400044e410841830c6181391430e740e3db8b8073244d13a339e157ca89eefe7bbc1477e3a3d8f42f719d369d2c58fb1319d034a134a69ad35b11c52eebd17631cb37c9373d65aa7474c87049ae3b8bd7560311d241da7604ca7a79fea6ab3c1d6aa237460e04086941b3e9aacb84ffacd41418d8fe48362c1e7832f470e8c24aec783c60caf2ff535ada3a1aeab596564e80cc65496a8d231609f76fa52ea16009d76ac54b77fc18e05cf13a63ea5dc82df4c89128061cfba593347ac2b12843d653bf8b42eea188e1702c80963c22b8b090820b1b0a0e8338663d6c5125e9870696151a550a71553893412853e90d7f1cd6d59c3b90473565a5f3012857cb0e9cf580e1a28a5b5c67094b11c26c8e9a7baa2f596a0a200e4757c739bfeae0c3120720440bac0477286f0d84c7272c0c018e328b11c323ad7672c472bc7d6543c52316a80aa810d88f004558423504bdca08bffcdc84117bfd4a8039492aff619d361073ca8f97f145b9f311d7c5083030d574e9f5d7d13aaaac725801020288211362f1834588189c8e146e7102307193ac6a9285a8725bdeb33a683912e7e7f6dec9e3a339df844f999d2e7575995c9d13dbe9d13920a8b61d2e757d74f9d61814ee9b3d6cc2a8d7a339f96145667e838522623ed19a993d18746e9f329496fea0c256d20690e497b903b24923e7594efe734a5a6d360a1ca68efe47b4e4c26acd7013c8a13cb47aa757f95d16ac78b79766024cf4ece7a07d6eb6f24b737e71c142d141fce3bcf96200bc527744318d31c9778716ebe2f7473737a7dd1758d70ee0dc65b0c96a2e113ef68442a9962bdfe0a8ceaaa2fbe18db4af1de255eda268a6b7afd15dc3a61d4fd49dd54ca569a32993a167bc5eb55569bd459ad52e8a9eef4faa8575dd98e86aa7258300b8bad9405e3afb22a53ea1604754a29a5b4ba3e0d6f3a6bd75e958a5757759525f8f5b2d47659fe9465599658d32d2d5a6bad35a93fcb699b2ecb9fb22ccb922461244992a4de7667c204b7a0a86fdbb66d9b4faf63eeb82d7fcab2e4ca72234918499224e61d283402416ec1512f498ee3388e6341735bfe94bcb465599230929396244970cf663eb3d96c360b8948a653eac4098e5d314e7ac5b2fed32b9eb2e9b22ccb92849124496ae3388eb399cf6c369bcd5eaf9dd7ebf57aadf0140ddf29c5e2f2e1083c262626465cb150ced9388ee3488e244992242d29a525a56549694943176e17edacd4fafb4ea7175775b5fa3f9dbeef643fdbfbc23921ecfab00b845d1e7675dcacac32db4f599625deec485e18e892de25bb4bda4b72ba9277bc37dd1ded1db93b6e77d477ec5dcf2196d5d5acca683eddccceb8d936d31a7f51d7abcaec1dd1beb6d7ebb5432cb32d5b536730e7241616142806505b345dc721960da1b94c5aedc55a76b95d044a4ab7189a4d95c183244200c30b6e68cc6e78b08b19abb1048610ecc7dc26d506326010e16245071e354a4ad8c4a00811b32a2f70113b3268229c2cb12ab0b12e88f001c35ce08fc9336ce0f810810d1e6e7650a9818d9f19aeaabd3041ea090c4be8f8f84182270139047991738ec1072d2da0268c25a2f333a464ed70ea985283222061a768f47b32e407633ca4ec18e36b87f4401ba28322500c6a223c448480413ac5880c41c4e706112110598207064f0d3c3af004e1f18127089e2178a0f014a1488d2237140952842cd282224d4650e40734187161c406233b469418618191205041f0122d60d8800532b8e0494f1044d8991a1ff9c5af055aa573fb6b07b9c7a13e670579df20bd3eaa167ea4a9001bbd82fb9cadb5964e9bbd1c5c8877e615dcfa0635308339b850770cd2cd72da9c34c4b96b608abacaa0ed7bdbdbd49c277ea06b9ddabef7e4d5133f50c1cada3686db2c0e3b6f63a0df70776d4e8ce7540159d547b2eb5780fefc1a86b3b7a07445165374550f1c6cf81d7471d5ad1024ba8d09fb8c09890931d2c5ef99a07020244a17a2040d8450196233e406a5c490130061c88f2843900c5932a4c91019082a90aa990109c7d7fc53f5824e167cb58a17e339356dcea97a7d73e2a01855c40e0c5dfcca1d183b35ddd4674cc858c39e2844d1cc4fad8d4c75316ba60cb5166b13dfc0239ecd6aa96b8f6f8c15cff00ccff00cdbd4d594c178c433175326cf982bfb36dbd495cda37db1aff5f79d4e9f33b96daa0c7e61e21978d66d4da7f685b9a25a7f5f1ef398b5a764ec1d4eb70ff2d98ceea6db54998e86b9faf928279f8fcb2377438f9c30f6533af842211008040281c6f0beb4c5333b13f2a92ff69d689f2fcae9a7acba8867226824bbfd1a9ad9f844d0788178e45491df5a1b9b8e069f3a336b374e15f8ed736bfb7db1bbe976caff9ca27c3e95cba1064e98da23da177a4ac9475fab945a4f6cd1eb8bc64f466a496a496a496a496a496a496a496a496a496a496a496a490a084a9fc51d474c92a014102c52407c62ad6549922920b4d640b065a4ea728d442419a2e3f8cd3903797d7eea878f565995e9eaeda19546b3a60dbbfeae20cdc7397eeb004b22b1b07cf7de171ac4b2214fc13e91443b9ad9efd49b77bfa3092f147a2d6799b4da8bc33a532bf8445d37a73b1696d2a9e26a166abf99395faefef4d5b4b576bb978584c3cf9e7e45c3bb3b1698b334f4eafcc39e73ce396b4f6dd223ab785eac652deb6dea8ddbdce61d9d74f2d97920eecdf9a009cef9a1595d7535ff47ca4f098bc17a64b0188ca43774ac3fe5f481c24209d5ce12fac43193d66aedbd98566befc558bb58d372d67acb7adb386e6fce6dcebbcef3409482e8474322d12495a669858e48255389d2b0ca08a0c3c6523e2104d101940f08b9cf5890257a6c4a35cd66cfda537dba7d3bb3d73ebe55a7e654d7c59a5642b7dabd9aee589adf6dfad0cbe1b036bfbcf3401704b29582f80581be8f5f3004da5fa86389ec8f46fcda2789f80537a96391f8b55fcae9f6f7ca89a32a0a752d4549f9a935b5f5f353c6603d32188ca43834c7456fe8f8534e1f1f2dc5a5d1ae58028b6a1d8b4e0de68de336c739d7f1dd791ee8e34021916824e2246e543299564cfc84e250285b290ac55750a9942ac5595ab896165b694b0b57b5b8b89870e10f7220682b05358a11462081047e4100acee6a652b5d85fc3b9a0b9ee858b4ff0551ec137c848e453b2561934082ad94044d47d0b4a729752dacb27e4391fe7c6a01fb8a3962cf5a73aab55a3b22b9f7826e8727a7bada41081fd70a693244de38da3790483a4aa32426d9cacbc9e9351a8d4624d20eafd48b8aca93c1f2e1b4783a2e7c08901f5a380b0b0b4b4b0b102620a7600c089410089513a21b201d50f013274e9c40810248931d12ba2000c029c8430c569cf2708397529f311e920800772100548d019c74360138fd4f899d4af213fbe113fb71c4ac23d8a1e606093b8400c60842ec700379e3c40b66089fc80077d8018ddf4108314cb464b8c888a1659c81e586192a1d37a9243750321aa7979319565e485c53bff7de3bc477fb8cbd88f0a2429231c3086714e9cc101a42e303f2830c101026313c205040d001a15203bf6163eb5083dbd978084206cd430c6ae41bc488f190440d415cd0b8416a88c006d1c1a9414819689015d8c482d0a0e33e63416040c29204d86b696a86cf884ffcf7d1234656c1c70941c9c007d827fe0b1f958f886ff6e11f44dc1d2ff852ad8fc907836f052ffe1f851ea28b1f637776b0d188ccc03fc488f110e2de2afb216b77d6ee95ba60cf4aedb457279b803cc2d34476a43c0285e3b8bd91b43a24385b0f766a8969ed4c12ebe23d55d94774349524639218eeab883d91187b929f4eff43cd1e707ad099f667579ab487561258929d24407ae041f74004cbd8a920f03a519432d94a28a5b522b141e244ab76465bc45083ec87924711391c5981b556c7f60442ccb0dfe9237d1fc655098c287ad4670cc98f24396eacb5d65a5a7f1663adb596beb514451129246628aac5af225248d4a0d56bcba6e6666cd9d4e016e5d9c1304ce217e6c13bf855311e716e725c23cecd584af929a74b2767e7e5d2c97159aeed94c1933e391c34f4a97f522594f4992bcc077d6af6060e7d3e9d295c3cd3322e3586827deaaa629a11e746cbd15cdaa8e16837dab877e69c73ce39e75723619b26d3621aacaeaa46e65c935b5aa949d17eb452772c53b79fc59e9c73ce39e75c6b1797b3d3ebef17d7c9a9abeada38e79c73ceb9acaeeabc2e9d1c1797653cfbf4fa5d9e79b949eea9ab9a7572f48e7e6997d6d139bc63997a4dabaee69ca1e65b975d4dafefb5405a8afed125cbd4b7dfb36e3dbdbedd645b6c83d555dd48cef9c91a7169e6a2954cd2399cabaeaa0bb78bdc287238dc4d5d558ec48df6a53ee566dc8c9b71336ec6cdb81937722337a2f0466edf773afd7323377e276ea49c05531576d2cab22c698837d2ce68d7466ee446726dcbe88853ba4a9df255f29432994c2693510baa409465ea59bb5ed3a52eed4cfebed3e95f5c75aa618df7e5f4cfcc29a5ae6b419692e2106d6aea3ae79c73b6376b9776d9192ee3daa5b5eb6a9776715aa69c86b552fb74287e99beb86d4a29d537cb643299acb4604bcf2b34674b29dd3acbb22ccbb2ace4b2be9ca629dfc88c2da735bd71a835ccf5b96998cbb86cb64b7cbfa60c6638b8912ab1911556dee855bb8ce815c53107ce8ee213a41d8313d31eba98baf53a6ea9c6711997512ea35cf6d5b5ea9cd6d6b39de53ab4206ebc39ebfc5efe8ee7d06e9aa6f19fd686b9d365c61ab7a1385be032f51df2bdb51d62cbb3acd72de4ad09b3c35bbd4e6bf74bd71ceed77eadbab85fbd7e76d97ab3eb66d7cdae9b5d3714ab2cbb4a3b535d3ae5abe429c932465afa548a6e7d36a7f171463b43635af63539516dd4c65e1fcfe8e3b8665467565ff4a1e8f29b524eadb769d999184d7eb1538b9a4cf786a6deda404c83e173c10f8ef8415509420f3e185f0cbe1c7c475ab123321ca99932172d2b398a76a642c1745b2aad9ea801170d5feb891b30b1b94d5f4fe4c0873e90d7614fec00785a31954823cd133d10be09971616552a7be2074e84e17da1a04fe9ed41b1ac02f7550b2875fcba8b14898e1f77a91c7c5a0a07734eba699c6ca21049a8a74f5d5345eae9d372aa503dfd4a4e152c4fdf8e5345cbd3b7b3a9c2e5f5d38fdbbcf3409bc6d1b97701ed6cc2b880f75b40d2b380a5954f89961e8275fb2de07d16b01482b1f0174537ba7df0be0a34dd50752f8a8ce8f6efaf888c48798f024f9f1a0141811eb55da7ac6ba5b2957e02539830f45740ea02693961e897c04a92403b4e18fad314fa0b72b20963452f52ae356152477ce2768df2768d445826722e00813874ea03b12ab13474fb64bb40b2a942efedc2a4160bdd2868a12cb3aab2a98b2ac5cd061365b7f83b4abfebc2a7f51bc05fe8f8f38bf805ef35612cd792815a13c6884f2491645345f798c6d4477d7b3155a65c13a6e44acd3e3155727513aea902a74a4c6aa54c1bc4a54a318543b7af4932ae255e202613e595d1425966b6aaac4dd98bb2a7f03555acf419ce176edd17933deb9ebfeb9c112863529870420a0f60d2e3e4be481fd797525aeb0f6e4c0a134e488149cf8cf4b9eea5c0c5380213884d32450c12295dfc0850808509fc681e93c28413500ca084871999d991f471bdf5e0440a4225594e242e89939492e5b479c042844eff5960094599d2f7cbe61cc5045746665d9cb397a962f6d5541133428585232d2baab15345541c1d94523a448af561f3da41bb195bc7791fc9f10de25f17f24473ce39e79c7386287d111d4d12ad3f527e4a580cd62383c560241dabc5738a2554b1844e31add5e28b359df54643f7e636e71d0df5bcaea3f16868481412896ca52253c71aad9c50a6504733ea58b47f9bc44b1d8bee692a994cb652d3e9afc6985a4facc0bdd7ee5073f7de6eb1b51dcd4acf1d0bcd6d39e7cce57c73ce396f3a6b0c8a1608b51d65689475aeeacfc73645fafccba322d39ff3f73604fc0217ab2e9d8bd9194f0ac806bfe8955e6947386c43f04afb32729565af6f82551319e57d4e4eaaa927144d4c4653ca2a837faacc955265ac86f3e542ae7258e6952059e9fd7852bc29563655ccbed2356d2a9398489b3ba48b9306bd8f7bdc95822e9d1bed8c47ce97fa5a7ffa458fd4b4173db205b57aa4a81c911ed9eb9b6e4c6395b12372448ec81139224764af3f1ac146b12aa3591b131963dfb71ba03f69acf5ac66e72c46adad345e101dbf40ae1afbdec9e22952d817eaa5a8a05eedd767d9fae1d7f98586436d5f42bd7eadb86389543468aa1a9f783ba957d50c5fa9d7af5577618acab7d1ba4dcd79f65527dcb7cfbab5b6e8b6da2a7b83f0abdb8e46eb3cddaa5ef8f6d35dabb576df7beffe8d390731c6186f4dd3344ddbaa181ff7791b679ab463995da58cba44ada58ab175dd6fee0455172ea0d4b7d6dfa2a3c07f7b167ff509b3a9f877afdabe45efc20bf090c6850bc58dc625876228da3a35a79b10950d950d950d950d950d950d950d950d950d950d950d950dfa3434da933d5188a51795a934c43a2b4f718c29f322a6d1e963574829a5e206649dfb977da9645d550cc45cd58de2d79c2b4dc3a205f0ab6b1e7cf7ef0a680237e598ac32ff18881873b5aaaf4229c67ca90f9ac17cd11e843b1629d4bc30fd8b95df98567b27f64ca8a59f2ba0cafee95bac30812a1baa1c60fa955fc1f42b6f7f25ec800f1baeb0f2a7b003a85ff90e9c4a2790762c54303eccd24a610bb44a2fd94c1576445f14023501cdecccca57fe73ca9c98abfadfcf2903f27e25ebb5db10db58122896707afd11289a0885622986eda05004cda0d7f740110445c4a0b2e4123720eb16c02ffcb2aef992718c7922639d9e7f0b45ddf3af80789c2f3967158ecfbe3d61f64b7b50d243e945aa1b08d1886dba5eb9b9aa4fbfd70fbd9f8f694c3cce19fe13c79807a01fba80814fc433fa7cd06867bc10cf46175aa055acfdbd2fcfc1b9d1ce4cebdafbe78a4d3fe7fd86d6868f389d1640b4316674fa9886d08c526a77e51974e9784e6ebcf7af4782c6904f9da93db9d24a2badb02e72d008ba01e15499fbf5735865a271abfac8abab7ed8c809735fa5e413391c3c8a9b179b2a665e1017a7df8f4d98fba9275f15399c0b72d960e3986a29ed4eb8ab957d61ddaff5decaea50e0b5db36dba9b082ed58f4d6f957357e226f7151a8f76b7827cc84992c52bf8fef65897a7eed5f6cdf0a5ba835ee58a1908674c2ccef58f759b3df3085de6e77029735900add0a394c11a6b02f5b77e77dda3160f6bba9905f83400ea77dd162fa7c3a69f5ee37e05e80b57bfdeb8158f4ef6f5bc7e2fd3ece1aa727e7d9afd267c7001cd6dbe2d6ed62cfabbff9acd967c89282187d634f6cd15bc8fd3e0a2dd02a2015e68a9a17ddf37fb19f7bdaadd0d1e7e1fc15f6d8e7b3b47e9fa5f59fb54a0d5952f051d64acf5f4f3d5b8bbaf7a67a7e8c31566150d3344dcb1d8ba5e79c73ceb9a567150c9f785fb35959aa60d8ba05947afecd6927e8f0b5b06b14b610b742dcba008d4bcf4fe3923590dac7345aadd26f886d26cc7c6ca3f50fdc16ba6e19e016905ee7055d7a0a7606b7e64b7dadbfefe4c357012bda17b10d35ddb8166e71ad1a969e6cb5fab90350d0854cf1ce1ffd6dfbad850fb4baf61ce8825659c1fdd6342d7bd9becc02d89aad3a61766bf3aba0c3957db12ff35b74dab12a0af7ebb3eed7bd7b7d6b43157eed039cc8a894ce76f62464330300001d3317400020140c0a44922cc9812c4d73ed14000c5e74426454381aca84a15896e3300a83308818620c410020428c31c81461011a0dbae69e79f17659752ec7cbbef4c72eca575b70c437faa021233300faaa6b7f52e26b4ebca99421522625938182ba4aa00cd2bf81d20fb0102d98bc9a735b57c1db113660cab6072ed6ed89ed836dd7f22e8a511a0065d91527dacad612db98b3522fd06a21e35df8b550f09f2fb2e2ea4d7dd04941b3e8b49b50d72a2f2e0a3bc4305cb85e26b18f84128bfc0606052389661e32304e7cf44acf930e56665cea1833fe98e6335934b241b9ded17e4fa7b021f43b6fc7c1ca4a452f562d930dd9d6bb657def1e6c304c8ad0ddbb65c7700989ac4ea28ee2ba56d345f9b7c76e50d77479c227277cd48e1b3b47a8b26145d5851b6aa5f92971caf2228265595ba9ff512a476ef35125a31844815cd2cffb48fe38fb951f9eaae5c48518a8452d149b8a68709149eba610db86c7c096060c0bd4d8c2988a77c4eee4ec8a6f9f67547d4976c67975eeef214dff2bed7a47218eb150e5f1abd474641613eb7216006f63f15d0090420c61b7228f59b4ef09ef3fafda0470cd9ab3e490e3d4eec2ad2795cf1eb2c8185aac1755992af582469cd22d959efccdeb83e61eb819b182ea6b0d9f8d392d019e451c37ae1aa32588644bae0ee0329425e2113292c82c680356600a9c5cc5b3aec12eaa2c9abc80b380a862fece822af268cdc27bdfdb7554c3a01d19705eadc875b3a9830c49a7f02ba701a2bb6562116a00c6c05905520c7ee02002a820f21d1424b525bc9714198590b9538df67143c99c0398e208828616dd0757568755e0d6a10144956b6710edd23bc27df7e4360bd04fc892f44f146a67b6f10a85d99f7eb45c0753b78c7a70369a382385b1c358c3a8b27a20fcd404513f4b1fa50855a0bcd26ffa5960ba4b2952ce9971eb318a3a4dae57b91ac2b32e5f926fb7ce2a48c01b1025ae0f0f32922a8f553a3f8a57071e900803f8a78ee0d5f383544d4cad282d8e2fcaaea7f108dd238d74e2bf5621707c8b991331b3963d6328786861835f3f3a4ca491494e12528f115ec10534e690a41b5d9f1e93daecd423896ebd46f9c44d360b6df87f9a375e19d8995e72f87cdc2fd1da178399599d01f41b79aa831039337c2b4c18947f3d089e4e35120f2a10afb10e3bd8021166e11b00efaa86317b2232529c518376b54bd423b3d0e29e6b498ef217c10824080a9dfbaf361f59dc2a64c4f191a2e1b9039a48f105b95a9fd735becda31175abe956f87bf06f4f8e60c70ae6c2900d275b2f4ffd52cd802991bfa75fd8125c876950e4c4016bfb4fbc52b97ac98e06d417457612fab0bbc9e57b2cae25dd16a3ee3a2e8c1ba1d701db8960ac537e84132a03d613427ffcac5f76ab55c71c748145ec1851856557b9232fec0edb5c4d53e1e9152022b4830b3101d1b262612f2f33ae9ed11610ed447666530a79f9cc8ddca2e10e6e242fa80c17bbf53d807a59a36c1389e031d0d7de34af9d582280d30a14827e5b440c79cbf2a83f9a25031bf8c0a220c4c73233eec5a043c6931d9aa45a2536ca36021192dc042257845e3f112b84fd2d194616be80890a1854d4197771d0ab1c008fc0bf7b4e262f870dc3de3ce8bfb652277a77c2981d8cd7041abac6fee1d5e3b631b151fbcab687ad60a25dca8d7b0e32a5fb6e1e1245f58463198723a3c0bdc271e80933e3b353fdce93aecd20e9b873b5d4ec444c4b0f41465b05a53f2418f38a9fdceec2f6630230ae743b6ae486c40147907a275c4f7367db99010d9971943c282e17754e0174926cbb6bc2add4401136485df48ace8f3e0db15cdab00216192d122e70e9f6e1606a721d73d3c4a537417f81fdc54c4cd911976e2815cca2f9894b5b464206824b990a329640a964413d72a9b22fc1d4cc379ab8944c69bc3ae15215e474604a4a14d37a73cd819921580d5a23b810ea3f444152557d328f8b47f7bc90df67cfeed284fce02c3c14ab3adfc9ea7f41346ebbaf4a3db14580823ac15ded7e2d270f6c908a9e47835179bc8aef33190ba27a7100e43d808402e97c49c0703430ab60dec1aaaf56e8ee0772898ee82f2a2c0e16115a43140742da93838b1aad3f046f179aea094b2b356b1f420dd46f5558ec0678a67c37729c4e4425331bf19d51c4986b9e7643be7cd3cab1a33980d09a5c566f9b54d10cbcce3def8aec993a00c1740401833fb5424cdc45e4916c5ddbb1ef1147b48c0f7b94d68218a0c4e8c2ee51a0bf573f7d28dc8fbfb952448232999c3f0cc8adccd6da1283f920436e8ea28ee9b80d35c86e05eb7e592cbafda465dd242e7528295946d559e78cec0f10d39065360bf1098ccd543c779e9346ce7633ba5232e9cb3fefefe7d94b9c6e33e7dd6c7bffd2d7ee7edc3c1965463b84fdf2b673eeb8b4d434470e966cbcfe9edc0c38d64f38ce44c7529a5700f812d7aec9e667aa00416638885809beee962d408b8f6dbb7bd8b7e8668b425deb60c1994ca6e54d0ddecab02138395f5b66dba3345722342a3f8739fc01d781ae1ce2ad38cd7e3c9d8c3848f11c5607af42e4a8868d43f130343a3a8eeb9dd2934482082965960f65b3d4cbeb8467f4a3eb2557c7173d1c430ec83d9f7ffeaf223c059d15cdcb2c487a634fca4e8e1f706b6a7371883d51f731d3c58b2db7c5e00a46bf980d3f324862e8b2c505108ecf90c02a5ab994d03c6e67ab0fab40c6ee682511c81311540874387764700b5329ce713460d7addf12bf2a2f93ec73b4d5a19ec17465774117f4aa163d1fe27767b7a4b7c0c63584e7278d8a9fe6c32948588d2f35aec7d4385f5981befcbaaaf74022d211b60f5f933d52d45b9ede86cf881b4bc4501f5dd73f48595694421f22d564cf5a61dba0fedeca329550dc2e40ceebebb5cecc575a6bcb364e765c9fe5719b5b846e8212e1a8f0c9064442888fcaf596062503d714784cbcf225efedac0f5a2b2292658f159e5e3fc76aa6947b74a36283398505eaca6a63bfcf201c007449fd6480a4149205728cc29a7ced86aef03bac486be23ceb425122b9ff138e2a376e71b8fab1a2adcab8035c35c9fe836dc9c5d85849f2139278875a8b71a10ff8324bccfac05c509b1a303d5337fccc8d93f307fc16fa4c2c05fa6f5c91157d251f4d4a190f4d701a76e518d010497cef93fc287ed88c7a452b9ec4706a11b7417ce83a2251713f07d71800af7e8b16400ea1bc39d974a80e65415900d7a07a2fbfb43c5dff49a971e37e10174c3736aa5675bf639682c6645c9a6d8c10b5150e8d2cd0657e492e148d71ee4914fb444be878f9a6da89963002ab1768a281d4c9203462a2bda41d8b74ce40b544937c1836a6058c04abd5ed74200050bb337877b8ab65af950460312818401f57cc23fe13ee1e5ab920e5a87e6c4ed3db5248b4cb490a85a2870fdb7360200e1dd38df6225b0a8cadaf82251b4fd1f40441406e298877edab0e40f51fc2d3efd25f75fc957e968eb954b33769c304d695c8629ccee482df5964215d27a4f8c2c122015eab7f9778e222a7363b08cd13d8abf61c81308ff3d9e18afa9f3c3e08f7219998c2488cf85ec0e2446a7ecbd13b2d9d292619a1d0dc1bc7c91288dfd5788be62b75fc62ad1a616668af3a1099c87b6fde597a4f2605fd24af64f8ab190e13d918e49f819964ec6a792d32c460c55a6aa0886c3fb04d5b20cd122b50f100e4aba3d19ee8f1128c52cdbdd51326f2be693e81b05f870724f3db9258a5fb478a394cd2232620c05ea204f7d7811e69ece95410d637bb72732a7fa1f8850c0f110a51206f07921c8a4d9575e6f280c37d001b67e8e48160aca07b1267e1a88058dccbb58cebae1e5e03ee31d2df3f012a777127d64eb73d7c14c983ac287819d84f493cbf9a459cfc7bc21c18613bde8bc1b64584225d4c7711c5d85d89e9a4b9192c5c27af24f01f32f5beac27afe0b8fa178439aa84092cd4dac53aacf795a6a45ca8a42e6155354b697acff3f6e3bbab524107c5b6c3eccd66024a3f0556b59c19f372d8a9a8737a99e63a4948c60189f9c1cc31850147f088fd1c789d512ecf0dac36ceeb5c9606f76904d042feba387cf65011e00044381e60281a27e6c433914c61149f6ff0a71ad5675ccb7ffa7f2a56ce67d0eb057217f95fab2fb1868335e55542a4f0a11792de9fb3eeeb990a42b74488b0f7048185c3d5bc2625c7acf2ee61807a5f22b4c95ea70577d5895036b68b46a3c97168015cc38a994cd9f1f322168dbde31f2673e39e30f1a648edefd8198f0a242085e91a0e907c9977d5ffc1604c02e997dfa47c8ee45f12788739c45d9323e1e10c5aa99e483a9f256b45aa0b32cdf4b0bea58cdc64e6926371c9861ba8f5e03f8c42b2b6f121bac12b76332e6034ccb3034ad119180c7e87233a04acac4c316f363eab40e2fda9a04b12e98992cd5dd101efef6c6c29064c242e8e2dc61b18cb62cd100ca98bf418e47da956856da8f09cb55269c508776f2c2c7d7d62b794ab7c2399e279033129b9040e4dc437d27352871e645b0753fa8961f9322a6be3c2c5c6687e4588e4eb803046f28114b683fd241ea0ae15e7e5c2c5fe17feb36f8cd27bf1a2d8facfb559bc3158737806698970c8e9ca794ead76593db244571d3a01624737af9811c5de9bc9c07229ed08fa6053d0e8bf2ceed265eaf4d0067ae37202b861bc0214da145737b234e18c5e8dd04f26144a30549f7117d0346fb39dcc7611d0ae9c70fa54bbb81b8483cac0fdc8f412d6627c4c5073c68e03edaf66dbe7c63595480b3ff9cbdf9aa2f53aae0c31dc6a15e3bca8105d7e8738a74610fb2c91974c3234967dde2cfbf7ef93042d6452e701f4280ee5d8412fd7ef1c3b59211f0ba0ccff95e0d9032e07cacad072f13c357b08f371c674d8224ae59fb20930169724c00b6887ec52a86c2a08ceb9a9d7e0aade88382adb61227dd5d64658060bb08c50cf97256263d979b1f23531fc235460c40bf2a2de78324cfdaea05d35d926233d5f39e19de063221af990b62e4a648a4c5769810fb12493e61b38097d1895b52f1b16809dfd3be67c18bbc61bc8fcb6d1408e8406f2d088859bd9e184f735e3869cb1840091233aa7a4d398fd944a5d1208a17f96033a7274c1a137eaa865666739a47b63a78c39581654829d7068ac241e1e1d3c534a8565c709dab1de78822d46c52cd0b63a030f710be8488280350db081cd44f1bc5cf7191a04a0f7e87402d351cfa14f95195ca19bf870be6f8d0cb0f102f67ed07fd4d4d617eae65bd1274b93ac40c2e61d0ec4a3b6483c3cabfc49dc314f46030a59362cec515243c903aaa0db89d34ce12b6284afc923be15cbd50b2018ce57c02a840953cff4f0025f5611e9337c6d19364569b1f0e0f5d332048a807a34ca37f921afd7031902335c670b0449c2739e511d5da37ba3dad2d00739eadd90454d02f1c73eedbbd7e537d7fcde8db1b693a6d0a9c95858eafef0770a972040233e65431b6440a40dc45a87c5315cefe3da1df4914ba20af44c6009b09b4e5807e22af4a203d1de716d252ae34688ddbc4658298c1e0bada913f060037415d87777439b9c8f0ed097ab1c30ffbc8045c0de9b27f11d76c510d4e848f4c33a29c3ad51859d4846abee7eb134931efd02c5381edc815a35aec21bf60446b90ff890c182262767edc32722ec3704a936ebd173f063a0111f8258c5dda7d4869a3966e59ab90e3f3c8d89921c7bde724219cea2844bbc6e84c3c940b000dfb5799a92c42387acddd361ee0e4f62fd2eed26e1832548a9f94bf729c7610581b63e89e7a3907f30cc66698876dd3321e5c0abfe363db16dbc20663e2fe186e1206fd5d32141fc9f2856b34d61982bff58febcb14357dc0420e218a0072788cbe7ee3598ba18d3307ef42fbec79cd16ee838988ccc9f636032497a7e6bc1353a6f158ac285142cc3b49d9bb224580c28f83f81e0ff0a8e91c23e65dc17d128f7b951de106d1cf391f18a88c33dfca9a4b752016f5632aa1f826b0c210ade6fc654fb74ee2f33a73ec7810e81cf5b98b41fd099fb419740145b1ec187b00f45d1f012d0775ec76a01e353ecc20fc381deb5ab1fe4770dcf448e809b99f9c73402b884931e63bbc86bf447371eaaac3f5ae3e512dbc01b227e9e796702146b4b3f433be046fbc31cdc31b368b3ac7d7e7eee527ca7fbbfb2075cc5e143f83e16e659c2328470717bae1c2f4e7bfade4b4e429ecd8438e21f04d32c85d2dffccca2bcf1742ca29eec2961182e9d1b0e3a2906cbb8174afc9eca1f737bc600abbc221ea425c10651478628ec5bc3210cd2a44242dbb43abb746a2bc4376bca964e0530b9063bd0e0293591b764181e5a5fce998cbb07a06403ea070ee32405d16f729ef3b2e0c34fccda1323f50fe2fe2d9bc19186d51023da40eb72b054bbc59efada3ea724682e10aee5e6d23c0fdfb4f77cdc0274c6d59935951b6cdbc68d0e3cd8d75e35611ea02adebe5c9c71688726b7eda7cc3b8e6ae83604035d8e6cf2b55dd9c449c4be5254df3f81d12832466ddf9e1e338be7002aa6bfb67d26b020bd9929c3227344ceec1b44f099a4f75a6fb79b852c28c34cb9cd671276a03beb6023bab825139859af07e1bf11f90724e4ef610939e9331fdbd161273e4a0a14915c05d4e143a1b89c163e17352ff1fb04572bad38b0556078adfbfaf54a7675b7e42783afcae549c8b588181462a078270cd7119a60aa828884133ce832070d281fe09cfb4056c4fd83ed9621b758d4c32e1a50f22d768239f9403badcd6a225b71c1840bdf002000c0778b0e4d35c28fca82f090eb82b8417aa67bd099dda7ba07e08a92640492e79d599c27de90a76f1cef47b2895beeb9a1b247615415b9783e3971c9bf17b7ea676975f90dd0ce24f6ff0e79ba8161d2eae9cbb03736c1b395be5d1d013f2e54b9d69ab1fc2865f27d30e72202131ff84025a1212c815e8f9411dbaf0eddaf50424ead474e39ed7f4c8c55a862f48f173b3c68e8ab9903ee59c49f3e78cc7a828c16a3ec83887209a31f06865282351a12617362d3de7cc3278a2a0442013a68fc01ee18dbf8c385a2118bccc03cb08d924f075c8c75ed1e353733ef149fce4e0d258f717d195410746931311afd48a6c30819f79d933ff176ea646356a59b17de0f6212706f33ca73c27e34328bd9b667e8b96de9a745753270bf459755a7f8ce814c728d055b827d0de80578a0278bbe6db8a46472239b791cc930ad3d341985092bfffdd5d1bcb497525335daf81a0af42605c4db6da0e7c58a6507b355fd74c54e1bd1152fce2368518e0023761e5c5f16b3f8c5c8c3d0edbdd1f6977618d2c529f6f400bac0d8ff46ac7ad380a271a24dcbb3655ef640e3d65581b942d85b39d822479a0dbe3072a2a61369e4facb2e382a3fba49370ce991c39405a15fb9f620a355580aafb95ce91584b1ec2da49eeb68e6ad7d451d97069f0a67eff0791fada3d1ca0273ad47214f9e900aebce0512fa52e6ab516db086b2fcf5fc54f963eb89b46c3c11623caef5841a7a366c4848cd3e854bd977716a067c71ba68a8d2c625dc7b35a7b167599ca9b7e89d900c06371b4580b4fe5fd2e235935754ff5ee2401576629b0686ba032e8ff22ad88425d65b9ce9cac2295cd1473dd63b4e1c6cc4fe659e0f9c12654b1b33e66532b66e572aaac9059c39e958f623fb942f2576cef77c62290d23aaee67cde8ca7cca5034f9a9e3a24647623862abe4c8743969fdf7280cb54968166f57e310b49c917bf7795a88250d84c6b605dc730e4c60411843596198e2182a8c7fa86446c70bd9baf37d2aa7502fb8c3e656a0e88e148cfcba88a047f0d985d6c3349dbfe54b27814ba1979f615760e9e50fc174a3f41a0df5b318f27119d7910e0c71b7912731b311c2b56b390c9310dc9583eb9985fef88ecde85c812f5fbb29164373ef9c9b4731b6bfd2012cff7d987c63cc2489c4c643404b37962df6e67eeca5dbfbbf2202a6c95e2482228917fa7526b8f6a64f238c9a30c0ee9f74cad9f5108bff3887f5e36907d503112942fc25341e9cb9531c8461b2df82308e8372cad97d86642580efc95f793a9b155f720123f801f90d30665196a46dce95212d999fccc82c6791743786afe19af472988a21b419a891f4a2e71e9e7de86136d091eab27743b2067f2d3df9bc1cb25a21f3569b7dd90c9fa1a4f1902e396b7230bf37d2358526c93d0313be479e52dd054e6afa7272c8034c6d9516bdb29fed6b94e2db9e0a6756dd6346f2c7401adac4bcaefe11af9c3383614e9065e5534b8f90a5ecad1381fa212d8101ec12dee331e97536cc6526bc004a091cb49230f31f09184c3802d05ef82b816fbe7e53e03c13646eb329204eba985052b7d10bf4e676b29a5017fa6327cc3313b2b44905f484c302b6d607df016e58d0c5f8f766d4a2e7a028d050b50d6dcc7912a274a4cb54325dd1229eeb41956542e97fd15d6914634ae3b29e04468e7ea2302a28419eef458e5125c2266319e0ceccc4ec34719f7b861a845c205fc668eee06d84029c67d19b2e9a1d8c362d2e09cef7993b67d8530eb2c21d77916b7f528caf91f0035ea340191bbf3f178a46319a11d65265b61e9d5fa7657a55dcd29c2291920dfff1ab1a8509590da597ab61e5a180bb329336182ae74935dc198e4abe20519f7f3855dd6c6a63c5e362d97d724e1df406e92a26ef82a5ceb688e3462342d4b09b2198b67fd0e0ba0e46599c37224dde9fa2a0ec2f36d68525f5d3d8471183a55e013dd85cb44f9e5595223d851d682e9a8e16387a52a8930351a34208280ae78ce290f4d441e071467326265a6275fd89ca6ab7b9a1e596f5695774138391c550e3bbd54d8d43a6bf381189cdb6cd051f83a41127c295553f6ffb972a9bbefec3b502b3d905ee14552a8ef4d383d4f26ce50067bb6b49dfa07077826e4a3335908d961b8837026aab2c0643dc607f26c6797d33d8a0dc8d6b67105ce2250f62cf33ed30a6f6b23df08132d1d0c42f5d5c3958b103a6ded41e4e58421ff98aef1f93e4ceb546753e0113582f1abaa84b577b305074b849c2a8d4105e0834653514e7e868eaa8d3bbb270bf0a079674a2e50f2c3fc2cdc8bf9e96159794aee662ab8d5e894a39ed6d15a86d9e1710477e7e11c894773946beb4aefc9c08f9c75d9c9d08c62d6a1982577420a24d75f6255d08c5ce56d0f9d6d8d99c7fc07428c925d009f5b14ffce237355e1cf35ad726385ff71980582196fcef11c1056f2928d0b9381eaf1b9647456246f804e7fc95c91670a4f7477cb08e1fb74b7658ef1bccaec04b4e1cac3ce1c238b4cb2416143afa50e87a8942f77f143affa4d0558a355690266a58c1abde240ce418ec54f455b60d2b79da417da1dc87f7e3394ab82c5041d7f3c951f48ba0d34777bec011f45c28e517d9e165cc2c0b9c8dfdaf96eff8171ef67ea9065832dd3caa691333461f7fdf71a87874c61bd3b7f03b5222d55b650fd6e76f3ac597b3a108c702f427081ef7f3b70c3dc5929eac1c97f0a74b4eae80bf95ca9748e690f80b14f5b362a90352ec4e0f782a49d2968779657cf228d5e13af10f79a142b1e7118be0667067c35a801c50602230e1a2af4c2f631fa98acee89933747321c5e18978a450eb3b396e6e94c4172816f5658a5d5affc62612b7d9a211a199a0a67134dc7789e74d7dbba781781152d5e04a22dca1873d83e9ba14ff3f6059ff3a77e0cc760b1bfdfe0f4c3fbd1f6410eb071460cd29601f063164abb2808ea13aa7ac81cc13da58769093d9f21777b432b7d9452b79b03e3adaec28ca5753a558dd98c320097e156abf19b5c1ea9e8d0dfae2c48a771fc925045ee101ea203b23fdf86c5f3c3606b543cc6ac35a4d6884fce3cd5aed6610382365a3136e10aac12cd9209cc6f9183b132b964123595d32bdca46ec27f8bc253b307b988898be5c09dc465f82bffa3d9f67cfeb63544db0ead7d8b3d333aa9f99f47ffef356188ebf9fcaf78279d9f3f01f19175698f49f4ed1fde02b4d02725ebe7419df37a37c008b235985c10c9b20dec48bfe45e9daf888a3e2bb11f92de6a1e4984d6d46be78dfc5a17f9bc9dc4291ed1477ae0ad7842f0c6ff65bb81e39002afa6d7d92b01e2eaad713d38e9001eff708505901c398803e9394f127b4a3741917e2e0aa3d89620ae53b2f4790138f1edba7ddc725cfd36f20128866dc0cc4bf516854f3b25eeb72db808e321353da753b772bfb1b6d28361c2100d14e2019a442faef1240c5dbeeb5cab7f2b9e9d859413355ee36f819814737d2c62b85e6e6011ef667a144c93c581c79694417b32192a00061b3c782aeda620b32f6ab9f7dc472886d5fc3f9eb934d82b9d65bb7364f166fedbc785c87dbd8976b6a44aca66623e7573cb44c22e1d7a5f24b259b576aaaa6dafcaaea1348b43e7e431f34259f3a2d026c8e0d15313eee9bd5f55caef64196d4b3584837a574c6cb45aa07776b0ed1875468c9ac72cbf2116c237ec02515216f734a0bda1b8a56c70e939b33c9949e07ae1dcdd6cb011e09cb6d61b16da1470013fb4564a894b0c9913d493dd84acf0d0f19e04f9a202c8abd2f4f4e267b4cdedd8588dc646bbf89052353577a01a98f4e085abc18d2e15fd5f236758595416fa558d93c44f794df224b8b1c29e2b006ba1bcfa4b1c884586ff01fd9a554baab2122afc1ff0231ccb71b9e6e34b2d5017636b47eefe7cd6ef3fc429bf16c31d3679de4fc2c7806ab08c50bfe10a439bd591822fdd6a12614fa6f076f249f36b242b73074da4f17db0b7b9b28657ac028551fd57183f6a93e3b0cd16217811bd7f936b2c79dad926e8155295786061781235d8c267ca7c660e9eb8f7478d2f2078050cb99fed4f0f85655103ec48fbc2ecf379325e28264fca779b2ed834e84887e203580e92b5ac973330926ae27da7718bfeb0d83022e1ffca5aca645218b5610c17be9e4c9092299eb42aa37130fe0b635b825d330cfeaaeb19408d4161bd75fe10c0ed9e9a545c05615f460aa017347c84b2f7c3eca142846f2aabfb2302dccbfdf08a11e78d98d09fb6242176f017a8ca3080b610529978ae906e8d52d2c015fb09877dad2288798074ab2ed2d7d024cc0f223a2198d2fcd25d8bd3d3b1b52f853de801cc0740273b95e11ed0d3d2e627a75f40d4b3082dab9d6b0cc5e50f6fdc004baa3f5474dc02db8be5a343d149bb0f83c826317fab687fee6f09cd45d42596bba713d8918cd012ed633ce508e3188d8c6dc31fde0dedfa1170b08162db6df9c6bab88d6f82cf26e5cae9f3071e3e2fd881afda67048f5982e0fe78f9f7643e778c4b68fdb2113242fcffe951bc73261cc603fcf68338e16b9b728591fa2117b658291371a718650c331a127a1ac7cfb5da8ca7d6baad8fddf2a17bfd2ea755f0cd5579fcbbac46f652deac154a89aa0fb7faadc18e8564bf8da256ff1b629db58e3ef1d25067397c85e034618b4bdc5a92f421d64796ee01300d019f401fbdd8b927f39a936b77af225f3ff194fc84e3ffc1c9394d3849080319073b6fda40da2bc1392c1c5bb5e69678bcd5007322b16f4a8cd9bf1224412b3e45cb5fa6991c3239a999d68987c6245baeccab33129b63072fd630f243a6752dd2a1eff245bee4f26c6ffbd52bd8ee2d815e4a65aafb7e3731523c6a97ecb437d8af15e24533e34c2d4ea43055df3fc00a6a4beb46829c1ca4c784fa9427a8d592ff8006cb19ef95ad94167ddb0257739346285de4929ce21d7e66a17be567fbfd346b15d4fce5f0338adb5fe52c6a97df852e84371cb19c505949cc9a6e137771cd4b5d086eefc114ffafa31162abc4178fe6332ea39b1bab2602736bc68fc813305926c806c20d8d5779a42b17bfa9d0a10860df9f2c541d0711957b462f67e2fc34646343a103c548290b9b9ba145f0ac3bfb2f3ac2535682b2e836e720aa2ff62e3fc9194cec2127f92e1c894e3e037d9ff4c2e25549d81045316dc6ef8db6cfff6829aaf3be6b9b653b18c64fbaac676a6211c85483a4f347e856c39fbbfefdca1dd652c3468ab653f93c58f29fc1ac4ca6c8ca4ca0f20ebe56739542ca47910ef27e642d3b70b8a63cf83e44bd89a89632f4b46c60b127b90027d2242ff314574a1a6d21c778ee72846e09ae369df6b2535ad741fdd0bfd85a631b1957e44ef0f20749e0315a1a35f90ed3374327a319763e8b0ee60cede64cac13196e84af4b972fde5b143b662ded540b70ebd2fcd5f4075df76f66a22f61272ec8f5764374809bdc7ac4781d2243e37cd536097728a7d20e6b91243e0de242b43e14770dc9ca6b82279da21b24cc135c551a0983f39fdbb079b275f22bf242c09ef1f52cfa7e06cc305dad8968a8a0943241fc4b97eb6209048e9cd866ccf8d8a7f148a130956e96fb8279e1ead2cd5754d57e90068366cd5156af6ce2077b41b9d50de9c627cbaf59d50214975a279d6d2d50c659f2444ad1dfafe8b85f22e2326f1f936795d94317433a67da5de7b19e41e37672a6e29bbf65d6e4e2995a71889cc2654e602a02d4019d08d3c9acaddc33da6714162648a0af68f67342e267c89ea37e41355194907073e6f5b674f11e292886a8fae67f14a9187a290b1b72569f8923129f8c3d288dba2a91785e14c5d15784d5e4ae14b2f8fe8dc1c36615c68a951d9c2e4b94ec182fc4a5efed5eccbd1747a7408272b77fcc172387d26cac98b00cdfbb08e2acf80cc91153d3f72f308174009af66ff676d6ecb6761e6fd9984915228ef455fe01340627a15417a6ae704600222db61d1fc0790408c964c43674794b66ecdaecdc257c818ad6c25267fd9052b64a21f37c135c111f4adfa2fa766c5a3878217422bf3ea6e9e15f3671f891a1f08ef6cd04400e1a4090c1ce1bda68c0ba71d9cb358f38939996d226810245239650523807c19c40d804e539f8f1f2e20d682285d8a052b77ec788d9026ce3b995b931fff8f58866d8dce7ec432b35ede1ad1ce254e68b2c85e0ab7d5c0a0f379821dd878b7b09e826ccc02b2c2100aaed94374667ce6f7588be9b2937b91cbdb2cc9f636e3327d36c959926dde4c1d82648498104fa228de436463a47e9ea415a53bdbe7c885a654456611440362df69dcd32bb465111c449f6fd482d680f8706b3a112078a6b2d16f0bf9a15c6b241d47ca24061921d44df47cf8f96278fcb9378d73740052322863f6c2d41ccdfc8d6e50fba6244a9fd011d2d2f25ad44c982d5deafd312958c94ce4a98f6a2c0385aa0fbc249ca014655b67d761c6d7ac3961e17bfce9065ea5b3a16c60cb8eea681fc9da89b9c6d1d4307b40c6c4194ff4cd21b9feee56b823b9268b17d316e3a3c66955eff83b1c545d26a0d4efd6599d41711f7ca9a95865630544e63033338f0ecb83a7259e54e2d30c5184e2669cbbf466b16e1d37dfcefd1962d6fd59151761c1bfd71f79fe0ba9f0df7289d6cbfb3e7c13ab184b0adc018e426f674ca454173d2bbe2e70262a7891204fa0f4b14f129d1e9319ec5eaed50dadaa4648fac596f12ba07903ac18bf11e3db8e720b20e4701c4c7bb17913eff9ee036d0dccddaa00d7e18e22c587b993e258050fd585a3708276bd07bde4a00ea3ecf1da1277ebe072807a84f42e0199ffc1e51e2b40ee866cb207f35420afa11b89fad9ef806212a86fa22c224606998716d3c8e442c25e05d67759630733196d83d665b9d3e1faa43a130399196260d047d36474861e8c04415536c34ecf1092ba02ab4f8d969b79727859c100d2e7bffca0d9648d290ee01ff2bf8a440fcd0a8cf80ce6977a1bab36bb5a982886a59d10ea8eb2dfe6e0b959cc83ef35b744a9ba1406f22d3fd96b2a38f3420d0b80c19a38da06fba5db64f4d61654b10f809b37ff90b7155a649d679c7e1764284a70b4a0d85ac13cd9527c0b01a8ff3eaf294828c4e70398f480ca6a6e3d07b57106a6dd2e5446f5b807acc4bd3ce6ce6e128efe90528ad1516ac457b69f2b2e0e52a10392048fc2fe02c79f2bba9bd16f2dbb5b33ae09efc273b541db74a70b34ca4db844a5e959a2258c7d52ff7ca807e3048a4a3cbe92a073d4ba55895d643a64265d4925fc9bf4d808ceaf51dd4b0725fe0b8ff1e6e1bec914ae14ecbb99ab538d775520772a4fab287716c6cde0edab76e32c46ae410aba69d1e4098bbb83883a60338209cc8cd61b0b293bc0eb5884facadfdf70c1432e41bc0d0507c26e090f1d36b7b4d5c19d7f1427102ebe89c612627ef0e965ce8f4e16609edbae4ec5d4fe2bebab944ee265b5201f346dc5f4bf3ec1e747365a0f6f15492a66cccfeb0acb3850453e01b10bc038206b31b313f529658aea1b77f3365a107ab0ab9f4de8b1f90ea203fa919c3137ac8b25fa2870468db1af80d946803fe17fdac6d490c366f83a952956f6d5b538ed3b364d02e5d81496d8811a69e6b2644ff9b73e8c74159ba581708405237fd3123c88d3bc84d85805e32470072dd5c0e5ef5cf603ae7bd3ca91b80467b5c8862f67eb351d1afbe3949a948fcf808ea53b1aba846bd422a40d4e0f28b2e93f387f723257f62cd0607da296b48f8d8e0281b37eb9dfeae466a08dde99f2c0e8660ca0642403fdc1161732ff2b7200dd8b39a763f8839c96212f119b9222632573325af1ef3250c590458416d79a3be361f1b8f60df0c6366f8fcd505f714d2cc69f6b8fbfecc3d4a6edc8c09407eaa9a9cb1d2dfc03d0090e18c49249393f75a7c3817e5ad52586ed79d7ee468655515bc964a6d27dd08e7ea379aa5bede7e372bba94fb7e9a5d4568dbb5d7e70e489e6722911b2ef4ff21afccf23514bc2e9eca970ab04c0ed8b33db1f42875d27c664df46dfcb0b077fd8dcbf890d48df1424e9dca6bce83426242656ff94ae11ee394b59df48ba747911cd3dbf88e5357c01536a00486491692b07482fd179da6933302c8950e61eb67e83286fc7f68a9acad7d222309d0111aaca31388c8d6487b05c00f05a1cedc7f8af399d65f3c99e1bb4d8fa8e9c710210a081c5d401a95377aa6130fe0d683509ee04245c38e38e0687e8577150060e40c44bcfe21fa0012d826cdef82ed8e6a5cd7497b0e4569a3b7f2b0716fe81be286777232634aa0c48a3b6895cff1ad089b8b8d00a8d69aa0811d7b2f73911752435762d86dd698671b2a000b87001b5c60fceab5123451c4085f0b69a6be16fc918808d40bc10ea5989f5940ac5d776b4bcbba9c46b31054958610924fcb0891a921fad900785edfb2fd67b2b87a3e15dc3615907628af5ee707ab130039511c8032eff1522d3c5a6e43046eb5ca16874068a55e25dc848232e670374e0e31ee83816e41238a6d920bb3737683b3a09b975259e00e0a4003ddd3608882f7c11258e285a717d00ea9f921907773727c259d80ea26161a615acf9f7b807aa3f416e19709488b67c34c97ea6c2da3f2897cc48e1d27105fe7768009c83f4ff31242b654ab4658491711548281993ae3b16d4b8c4d7ab3f9ae9472e106a25b59030d6d0f672cafdb90a0e25a062d937d531d31ad43307a04513b1ebcd41264c1704a173749a357379719fe414cf16c9a1e827d219113f5ba24f8521b9771aec2629ecbdc8b86da87656df56cc45b53a606a82dd89c654dc19b9620e8e6145712bb1fb7f7c5652b0161b3a2dda86ef34d8174839560ec030a93f0ba2e76dc9b9f779b2b570a69cd12b4889de27837d28b72d38aafeedc7cbddc5969016a7677cec7508651183a6d85d0db25bf088f282a07cf3cd932fea8ec8831e8fb98ab828e3f5f753ebcb072a87b7e8f9e24a7c88a10405b9c39cf676b6d46e171a407e182c7e55dc2d882247052f1f2adae0d409d44cb327403bcf425f265e34650129795a81fe4a007a7a638307673454dcf7c62ba65bdb050ae3cf909bcb07a5cbd5642a7cb3370b7d467ab38ed1e462c93748a2188c557b31f84a80f06995e90f1cf48ae7adc40704e975faafd89eb61467b940ea010110da6f00e7b5a64180a58bbea514ea924068a52191ac73dc8778e85ceeff5e158aaa3d41889eab6f9d73b123a89190b92b1d0f96b024e9021bd561a244e172d43a452dc26c59eee86eb7438409d3dfe2fa3e2e97b918dcf5ef2e089acea27b0dcfca9649a5c413572ce9871d1fe549d8185fef092336204dad872215ef0d81b676d3d0f2dca370a990bb055943fca14490289d221ebe400baf331be1aa061efa48d044278dc1aab38cb5f513028e2a853a33065f6546de0af9f44666caea35fbfe19608c30ca14fc0efd9eb1473c61481beb2f33b302fd49d423038c19ea85c4f933265e602f89f164ce5ca05e1ae3c99cf8a05e2ade97519ba1b949651d4064aa0cf54b6c9d339b832703515e999cca9d81aea1b2e5f4ab9f44cd8154552cab44875bedc1dd5b6f06cf5c644ddecd4d96bbcc1a6edbdb56ce2d83d2db76d3ceb9642bbcbb1b5cf6266bf8f63759a6aa55ff356e76ceea9df3ce8ce58ddc489f9d53ed3424ccb28cff35843a26e133eca4352bef2aabd2dbd89b00fe44b7745c4258edfd43124a597533543ef9741f5e10f64a365bfa245c4926c23bbd8d2d6dd22b7f5ad02cffd59535da1a4a3039c3f6e1ffa1eac0834e7ae1152c94aea0b798c15c165ce621e4f7f7db8cf7be5453fe5bba0af87aaa085aec7fb585bc446dee919d5275c76def0af691267ade97c527ed73d148c8fe3f3c57c063fe7fab173ae26edb069f7acc46fbaac53a84f34128319ca489b10b96e16c383d6b458197c20fde18d3fef87d7c79b29ceaf7f3905d09d0900b75c4fbdc6727860ab2acb21e6df4d5aa1fa148cb36393d546a276da1ac8590899280fc94a0b3f4b784ec0d6d57589faa2b86d4d43b88fc10e2c8fc20f334ffdb233d5056d742b9a20b1f51062ba3c9c3bd5bfe9280986fc005736efd9d799b35ddbb1b3c7729637a763758e62d866f336e0396ec8ca5b4655fbd0090693e3b1f8a0c84e430330a50c845c88659292afadcf156122b2d0e4b98a6e921bf50a5e24188fad95418ddfd76b0977f2617910e7a9486189094744234691356e7c4579cdf0006ead460350a4e83f403a60e467958d20500543c5478dd2e93aa9542bf4d0bf0c64ad61f588404fb1ef818edd9f5d020a5c4ac10830131894df952a339d236068e28dba4a2936fe418782065c8519f5ecfcfe9743f07d2101246266f8591a71217cbea7b0ba807220931a6496fc8d94f914297f15509cbbc79b45a423d7f120430d44cb0d43112a73909b53d1f993b16ee114e9a5dadd0b7cbd7d77a0621441e32c8a51cdd780c0492af02d36a392197b34da3f98c790000e83b4ce820dc07902df5fe401b47bda0a40a50dacd87d6d1379e273ceef5ea61c55e4ae7d50f9f9de8d647984d6a308b4a7f740dec529abba0a5bc94c687ff33ad6433da905588a3c48a8d0d04de3b9658dc42e6f0573d3b8f559582518389beac34b6df1c18164828d64f8db3e5025c01cbb411fc3e6a922717890220be8286974b36fc3d2e185be6d4e0c7ba28d18350ebaca62393587a155780abd6be87c32f6e1e17ba6b61641cb61e6760512865f1a2c32d5dd993c1415fa38839a6d7fc28edbc98b9522cfc528931a1f79df63625bad143dacc77b6d8043989c590ada2b14adc8aacd693a1d061deec02483c50a7249c50ab47005031a3d7077991c014ef20bd717cb94e67a3cb5c3f4629c446059523445661bd67b2406d06ba1a28c8d3994dd760d5cfb03c3fad6cae453ce4da1bc9f9895d06dd95039f6bbb4c7634fe8f9cdfe238071b892dac6b5c23381c8f20c59854d20536b2aaeefa249f564fabf9a602a9d41dc2fcef31ac5ab934cfd8c6ee674a1bf32c6e32130fd70ec54779799e8a16eb44ba2299f0710e5475682dc97001f0ea9984e5561902dff8a49bfc3a41b16a7b6d7f2c51b3f96d2c8b56ed5f219478982ab12824d4677ed5d807ebb140d22dfc7e0ba7ae1cdc17c6c7caf0a19fcd94cab439bfdd49791ae4c1a33c9c1c576cf43aa93f84ea1d0aae4a8a523c6128af737f076a8ae1b9767b5471310f7d457ef50b79c2533894dec063988af309cb96118cecfc333c0e51db0e46913b9859bbd0928fabdb5515ebea1935f6f68000d21d6620bf32f557d9038af9ec038bb6549fb1b3edb2f60642778d3d038add1f1babbffff69c1c5a69efcdf4690948765561c2d346c77111f0054266324422d1a5be518cbb59613230f09f4f75b79cfdf7cb727e443cc40d8903dc9153703cc3d5d58b169b40d1257d0cb915f908624761c539bac4ad944018665ca66e0e7f28093d0d540a0e31480531fd8c533349f621e6e1d410d1578a5a336a134d8d538bc866f2680c744581d7a05acedd93284a85ab85547ca1fa53fec0a4d85e94b93f455a37e83e2b18376549c9ee1a81ba169c98bd52ab9717c4e610d62f7ace0610d20450e57a42e1de7c770e6f54b6994cb8f8cd258de56cb3155cc2795e8818f162d2c56a12150c39fe0dd7dae44ac174ecace1f6146251b90bd861051d38dd2935704a8218688848b7835942950c39993dde21216ac6e25bf31bf2910bcc3e79aaee751ef4e7cfa3d46707b2f96814e84721dbb3849c735e11a9b1347a9b011a403fcabc67954603433ca96ab412dd63474d1f2ed97f6d576388c8e7129a8c1b40c1d92a031dee22c6cd5685a15d6efdffc31663ff11bd641a6ee499a5c609f15e0740c106c82b580b3adb616564de2f9642f39b7caa92da00dc183c63cc2be5ece095b26dc31454ca6016c26028641d3ddff373dc253c833285f49f089c780bb15e992c9079340757b5035a6ee3609a475dd0b02c1c1f9b61a09b2d2445799fa21b28436f5268c89ed4bc8096ed25cc1988af914758d7dd52e25fc63486d3e868706589418c4572f15e50dec6f6535e58bf79b049cee705beea23e5dbdd96322baf91262c595578bf0cc2b05b530731ecd721bb867327b112ef91f3c33785cec30ee8ef7b1eac3bfa811c7a73dfacc87b195a5d12af43a989dcab10ea917a179aba645e6d9ea464457e5e43d1157948bdc55055fd4dc98b00b136f97e6ee851398c7c5a0f4f58ca18e2d04a1d7cc7b2f4cd54895c1ca7be85dfde32a1aa4a1bdb7ad3b913b8987addf434466762433eb8c564040197f8199ddd70dc61f5dced430d827e73d2c3dfad6370baac4f28a48d4dde6bf882bcab069d40cca0d1546cab50670a76332743b09b26e26c2b96e0aebff22a5eb87fa368befd2af57185d9af12f4918da4b750d422ed2d60408cd6da374c47dc6ee615aeed45631cd9e81d9bcae435ecf2f18264e2f0f72063666a66ad9733916c4bb4b9ecb1af9ac83e668e52e38f1b544f165340545595b64a571002e82703431f7fdcf5e6ef366bc6b9070e4d5fc1173fb72cf457baec27f440f4f17cd9e473420504636f8367fa1c02ecf40ccc7f922f2272b4dd4a966ab7f4df1eed2c60025edc0c55fd293be1edb31065c80912ee955731d2709b481396904f2bc291fa7c5a69d799b200d45b2810ff0eca974fba153779cbce85b67885dd171472b65348095908707b2d730ec2ea390839df0705a4713a3112edc73fe105888326d56ab37123b119bda02350bdc7a4640953734ba79789d7ae0508ff17f51f9a95cd398fe909f4b8393eed1d25de995ebaf30607084ab1955ded2114d466c77c5005bde0bfb629c863f160c15ed7fd462efef558fee13ec6910f704dea32a666365bca16abde86d2f10885ad227bf6403a207e495c948d6b3ed9975e0a8b04dfa5f00247fceb91f2cd261190303bca2ada4de10804158d4f16fa1de261c85a8bce0e8c85c8d4ed6c5f848670d9d9c053000bd56efd10a9f719315b7d312caba6ab1aa4d2d18584399ff5cd110f38f3416e053bc9f652025626e40ced80bf4255637ec793260b5cd778025cda4cf00d29bf2cbb501fab5a3c1093008c46a73f5d03d9de46f3e011bf762061d5d2ad00354f018c852401ea69f6945f6f92045dd7baa1ddc31cf1437f113dab424cc6acbb4340792dd232cf674cc202820417117091415d61634e9e48b2d8c537b3b65204c85ba29bfb95d19933b4b285917899c1de5b6afbd032c8d1d73c8ef0e61e6e29be4efbc2048814eee165fb532c9696e65bcc6fc78c7ceb51a555cca41eea888727050b56612cf6e3bdf37f76c2b36b746e0cfacdd6eb0844a9e402426aa17a646da5d4da49feb7fce2c37292141682c9ff5863d41bfe68da3b00cf5011e89a9378c542c7c32472c501229ffb7d718a3a6ff70670003086685e63ac8a70bb66e0464434901cbbad964d18b8cf0345a0ea88b49734ab14308642d4f934817917216f4a87769f97a3a043450e66c551d342b22d10696b9160cff41dc8f2f4604350249033a66a44bcc7883964a0766cd99c1b8e47a1366b150caf197760a91206c3d7677c447a71accaebbf385543e0e28bdfb96414a8e1efdf0de37c44ac2d6079d0da014cd99baa34a6420aaedfc48732f9f76f2f33c9f009d8db30afff7a01a2951970a316c2e83c29820da6dc02fb0f34973e13c74780ca3f378e702ebdc5e81c11c943a66673d0ec19b5a2fba2e7014b99b706a7a78cc7c4ea08214acafb03586fe0e53a2d66838b9a2f3ad51e6110d1850ab051a6a8fe8cb5ad6c74b508675659e26be192b3ae5ef65c0cd1fe8bc962ca3b1c8f34a6e490dcfcb1088f9890f4b16662258d61264060f51a393ab1a9176c51ab17dadbf481b76bb59e014e6d21c3a980910c6d6ad3a180ce1eaf2d5c42ff7406756e4fce2cca8778332ed8f36a1880d3e2ac6ae6c856a8c3a09ab36fcede2ae07c134aad8eef599b99594dc6e028067e4f16bac3cb77b1fac5d6118988c0b728046e655edb8ab98f97060fdb665e624459dc9858c52252ae7faff50914a94c03b1754ba11a6ab1c171f8b164fe2c7df11e488bb65e46b36369318d8e10d7ec32c52d5a7845d3e7fceff99450f9d5a937adec82878c2a26da36825458a0e9ffde70e8feb2b2c68081685b4ee6a0bfa6c25dfe8d776511824b8a5b5f000e2aa1b4ac7221de7a7e37f70330d2c600f1e5fef51e99fe7c962fe7d52ce7e2f31ff9d1cc08a186890a3f7b794d6bb3c135daf939e5bdf5efcdb67631ce570028692a05ab576169b4705dfa773d472d87ae8c01e1fa8e31d43998898dcce76ed3bb77987142eeae1963fda672c27a71fd5ac6926d84844d15a2d0e6a0050cfd31ccbd610310e55a066c826270b736032e7051dbb678a531c6c910d6612307c31e461decbe91809d163c61c7fb02099cc04ab33798d1d62e6adb649397d7b46a26dcdc1b927271cec2ccf890ffc5ecf3ab9a66d2bb7fa7926de006db4c796f9eeb23017b031078248707d33f7f86414594cc9bf023016a0ecc0fe8cc76b82d66962b6a93b7d02a6b19d12ea568e006df93e19489dcd198d3994cea630014ed3799ad66ac348caa94daf762c83f9437e4b642d0fef222562226278d05cc0d46d3295049b1abf2bdda5ede566c2fa1e678e046091da62ee011accb6e1830b859e0980cec4c9bc076e9a908fd89619103022a90900814061b2c555b591e95541a2662413055db6dd094213c51c1ed6698891498da4acdb60d13fc9a466f5cf9e1afb9913d9a4f300db102863298f90bf8add3c400b29994241c6a338b04a812bad24ff3a8d7aa84d6880eb8e841570bef98965b8573f137a8fcd9660579766ab1d7ee6067ddb956d72d3731827efaf7b7fd989c1be7cc12344cf99609e7f34a0a2e85740bec526d54c730a0de28037dc0821ffa3b146a6dee23878bea4d525e1500f512f0e1d6cedbf5a4ce5cad9410c6f1fb778a23737a3314f19db8b8e90e5ea2311e34bbc8d9f683657586e8b678414574084e654341cecc2c03e3ddfae21549341bf8b181cfc10b80c64c95984b4bbecc3bcb40bf922d25ebc22824a490d60b92cc7a094865956853694adc2f1e34fea8eeda2c31f4aaad98178fd46f03ba1f5001948ce1825dcc8d22563f7ef0194d11cb3965547a7da8dfaa1a9f96ddd69b1d5c22ed2f9afcb0db0df47160f45c56b57127ba5130bd97586dd08b5614ccede5b6362b34abdeb8f8d18dd7aef1278a8f3762d4c1448a6019a8900c857ae91992b6c6aa59426395e2c5f835bd50d5386c9dc359dd85b201742f77f92e1e69fca1b10d7825ae5c3e76689bec6ba2ed47fc4197c0ddd34c8aa3169930111a003889fd14c086c5fa197925c16fa322b385feb6a8cfc39713560b6a0b9f7788d95b1a2516c24df7c5b60e2b01720554171be4876d807781e2f85cfc4194e0919f3c906dff895a91ae911cb17dd66b6fb5fe8f5da2787e92dea6a83cd22bcec383f8d759e5b3adb75e08c40637970dc3e9348deea42cffc583c61f22b915ab89156697cb8d862b35ab1eba8c64239344103f63826b71b5319db8806e99c0016aefa01e06a8e7a58a46374d5b8f5764b6641d527114a207ca3430b7975b6d568a5614ccede5b6362b34abdeb8c89368bcc084fdba8f3df79e8c9a2c2b806903b1ea05bd1cbe4f327b1394124a0ea23029bd05beada2f91763a124a500a50bbdfa106ed4c0e9c202ac44032a5006755d5094554d1ba0dd506fc6a7ba58b18ce2fba28a8f733a8254adc0b0af56ec932491f628ee9a9234e261fd0ebb980908e84886c2258410022036fa5879e0bfa2b15374953601eb11f87fa3642519b0681661f5f1768925929248647777ef580711073007262653cacb6bfd095930fcd9e3c0fe3ecdb08dcd95978cd7cf1c965e27049d97f9f5b32dc6acb3eeed45e3f56bd57aa4a33be5d8f652798d188cf50773ce39e79c73ced9cd69619c73ce7befbd570a0109e1f89d4234a54242b5562124d65a2ba4e4de7baf10131d1db992ab9e9e564b881643934193614e914824ba775e0d880ce777b024df84c242065c912b9884d165175ce090e360cc1608210c1852066c1100c73b74551b79e4aeb530f03583e0898284243265208bf9f447d7a288f76ae7bf0bfd597b22576209268e50a10a4df83861852b3c01c54f8d42a6860ed8700387076e40e5f8000866420059a44bdc9606b2c87789560490457eadb5fe902bf287604450909004e03db27444967c64a9f6f470d973043805203d1f604109a28022091d95c61e008922881024c870c5f4b42c3940081c4418710322827044006a76e4a094520a84c5871835416319c822bf844f59d4daad01a5b9422bdd1ae0c25ca19fedbdb6928268132c4ad06b0fb2a0fd9279d5eef612b1cd85d2c7ae966d1867135982af6d2f2588a9b6b5eda5041f52edf1f6422964c95bb6699f350d37803ed61ec3db83407bd3b4911334cc0562143c3efda185eb828c8e11ae1f473874f58088ab0746eebd2326885690c57d131dc822d394756be07420cbac35d48a75b822f87c0cc4ea7531a2e051762f48c8b98c7a1c7ee9ae310631bdc23abbd71ab884528677fbdd0bf7b3fb9063bd7b217bbcabccdedd0b227ea594525e990c259c1302590151f1501117101d406e54199e55c4404db0d7323e8cf0638c31c618638c31c618638c31c618638c31c618638c31c6187f4609ea305c7e8c8c0548a207352493a7b6453ffe9cd95ec9977c9f2008d1983570d277f9848aeff248f75d22218da87c44f914df2987bf3b86a9ec8e691676d79d0a4d4af1547cca6fef460fa4ef5898ad396766c123fdc8b33cc5a5495ff22a3e679b8b0a8ca482b4bdbae291c5cdc8a39c0578803e55dde4242f45c586b2d479904baec28390a5247216bc17a0dec5ee48fb057bdf0b4ae9bc941f8dbccbb79792c233f9134fc447249736f992474131313129f15ac0562b7b146fb6bcf9c39b2ecf763d74c9e3f74ce4eac42be15d0fed4f3c92d689178a29cdbb138fe35d0fadffc403f1ae8789c99f781b1745930d65a964dbcd85e4e3d6629278f3698749b4005fa0d9679f7df6d96a4d1a9365e39c737b41fad06304986da9c8900a325cd153c870597fe4435360b2384cfcce06ba57518bdbc752d274c2e5635ca6339ce52ccb40bf25a12307e58d358777b6239f39f6aa0373016e2e9ba885615a05fb1612eb992d10eb89df5540ab4cd5b797cbb15d72d3ddd0bd4467c5e597e860a9c96a7159c223854cc6c4362df75a730ffa0c1a2da123e7382f724904d34c88f02c7e06eaf3075d15e1d84bba3ae97ca03bb6379045acbfd5d7eae7fab87e86575105057b9de3c1e58fbb43dcc1157f54561032a5b27a14b2c4d8834689cf5a2710464aac5831eaa174450d76609304156c006208337021013cd0418e9c235778810d2e20037aa0a0e3430e3cb44260673ee7d947bbd30c83394ae9cfbd3bcc8fbd38610b0e9f4f72935f88bc5b80d7981c06f4a2873090fcdc273fb537f9b97bc9630f839f3ef6eaf340c5f19ff0001543ffdc9dc6fcfa12a3d8f29e1bfe0568cffdc47bfbcd9b2f849ebef6fa0c3a306c3f77c7fd7cfcd4ebb8cf4f3b6ebfc09f3f3f7efd19cffc1646e4dad30f6d924bd38d378cf6dc8639794fdbf4e485f8271b8a768dc9499e3ede7dd3925d6372908ce8751af8c45ef6e21663722c01cebddd626c30f4edf3e34d65a9d7981cb43b07f89c3cef6d73bbd3af31f1e4f3e59c51d073faf8c0b9c9c0d953afcf30cadaebfae3f682e39edb1cdc5e74e8398ffee6cd90fe6ddb5e6f3b8301c7c8367e01866cc6c741f070fcf329eddaa31a00bde5f931fe197478e843dbe3369a9f72df41fb62fc32e4e9f51974ba1af4fc0d3f0d79771a387ef85d8b3cf320c75e56819e0c40175442d1811f1ea7062287a20350f0f8a296287244c0a18340e5084207efdf824fcba7a54410a81758d81ae2039ad371425b251871e388d6075a3b5a3db46ad0ca6905e183083e92e0e3081f4bf8b8424ba675c3c70d3c307dec00258bf80022c4061f3ee05dff10ac8f1b364c1f37481fa9948f9507a6407db07cb8a00691e78dec061f291f2b1c104208a1a651e210baa8cc967baf54b11e95db8b00b847aa7bd62923ac14443b8e448672095d05ad397401710408205c314629813002441108598e80d240d04268206e6083052207ab9c79d7313fdce009403a20644812a2606b58011128b582118dfd1ca177b0ca09020431a708a5263949f0ae7f02a94ad04074e6d095634465a5a05510057d7182680fe81ee81c558eff15393ac8cfdc8b284db4520b2dd0186b8ca5b9f22f99bbe042b59b8ca1ce7fc9bcbe643e37065962cc248c12b2b8cccf9ccbcaf61279d6e08c1983e8d74a27764339f932318cee2e867cfa2f7253cae7c314a43473317252bec41871631bdb91cfbd7790927631289d3464fa99a37476b6c61ceca575e259a3bd32ce4bb19a599c69ce53c65c338b6fc6b49b312ddb30e80328ede2d425c6af5be3cc159ae9960ae75e241a9d672456c369dec169de81d3cc03a739bc63ae6dbfafd6c92bacab296765551c4ef308aa8eb1c171ff719f8ef643e9fff457c3c54aa2f587d2ffcde80f06c485386e7b12ee49b690267992ad7e27093d365b4c3eb4af7e923721f91292d056b3bf14a5512314eaa3f9683e9a8fe61ee1d2e171018188a6dbb66d97da6da334fb8daba1e728e5fe94a2fdb403f7210f06f49023e1b8ed43dc872e3049381ae242dba85f0ae29e7bcdd13fd99c6ceeae2c28e49c737275abbf7d34dcb67da8edbf998d036d1bf7df0c57b36ddf428236eeb9dd3950e8411cf7daab415b76502889428d50a88fe6a3f9683e9ad46d41113bf00170e8d2f1d9ec9c73826eadf5a576529d54279b6800fc58d370d470d470d4fe94922da6861fa4691a7e90f620a94990b641784aed374f937fb239d99c6c4e36956571a0d9f9a1be996fe6a25020540d2de79c77aff1231290bd6999f376c7bb06bddf87a5f2b4f3ce396f8c8d7b4a9d6aee69077aaa39edb8f75ad70f5c40f87181d00308339b66826519efdd63ee3dd9a0e897b5428ae72f854dec4be12fa55fee7e3fcb1b959f7b0cdbaf7d686b2090e6b21a945f2dcb9b4645f18be967d9a43fe347f3d17c34a94dda1afca2f2a48a5ac3e2c329ab9427557652f1f92e8e000e5d3ea8f901ce0f523ccfcdf503192e000e5d3ed8e1596a71d34c7e5616c6fdde6cf778b239d940b13dfdcaaa3d2a4ecdb1f6e4ca2715cf18b3b692a4b598cd1fe5574c72d2db7a83a203b7d33e84d65a1269c3409ff42d6474b96fbdca3a31d1727b515976774d2b2bc6c62975aaa1a71db207832149ca532affa9269f766412e96433ea48ddee92e7938a5b4d49a8093da1b0a2208beee9c6f1056c779735d0a37cca29254dd8db3fd558294faa932a931e63294425291fb232db5eeccbd0b87d9d4a7938511e4e9046efc945492de4a986dbaf9db7fdc8cb1fff7ad8a778289e973aa564a9e2d75c999f6277ec64774cb44d764741096d153e7772d62aaab66ab5b5722fb717cbf16bb6e814d651546646712eb3380cfdcae277531991dbddfdfc3535bfa4514a5c85e3a0ea67bf7915b5bde487d1e82643e3f94bb3a5e61082cfa971f8fc934d3ce5934d3440fdec4fa9795271cc5a6b4f36a21687008819c5144ce4708d937ccb0737780238740d19c25d4376b88838e21ac2c397e299aba0b75fedd71dd2b4aa3b48537efbf5a6a2668bc997bcc55ef6f8e3ad39e6166383860ff549ecdbb17930dad3c023c645fb1bf69be43e1a98edb5a83dc9ee926fffa5b8fd18b726bf471b23ccf6da5b6b6f8c0d0cc3be1dbc5fbb517e1ff7af865fec4b7d1b86edfea5f8fd1a92cf96f9d863bbd7a0d8f78b4d0cc342dafeb68f5e7fbbbbaf3960b0f63f9434e1c7fe9b8927cbe597fa521c7f96496cb127c1b9c4839304db3d6ed8770e070cb3f6b1d6e279ab76b3946f9eb51a96853cd0739ef6f17ee661ea651f4a966e11eaf7d8e14ebd9126fd2a1c0e5847fd18b3ef2d2d3c5cc62ddbbe7ff3b56d7971bb6faf41f14720db86b1f82f0a6e30608fafb41fe3ee320b7770e0b5fe776b50be3df7bd65876bbba22aea4d3c3857b41ab465875f8dfec037d086ea5c0fafffd1c493b6bffc1f2ae72fc5b1cdacb53672f861262b90143d913b13cc19e75cad28a5b3d65aa7b5d6da79efbd377a1d122612e64ccd946cf5f4c4555c75082312f47c88d12d035964f46037276908975c3e8c19b2650a91c3e54329e5ca089b4b882bcc486d0d9724e0dd04be80743d4899821035e80881438810581e048942909e204c04e111a4479022d00722c8610948b021a2d584110429626483ce3c80f4c8394a0419c110417208b2023b0a0190201c8810204500d90192042046801cf1bf628922f3468c110559d0898d6024f011fc44be9167720d9752e2972c75426029f9d48b314ea87dc8b5d206481313ade9df174ab3c77e46f65886dd8d61746e5290bd29110c9b955639271de9444abb97baad0d19aea8f6b17b73bef7de69312274c7f8c910bae31e06f4f9b94d0aa2413b4359dae226e5f673ceed29a574fb5c3590576bad75fb6c359067adb5d66e9faf06f23a1dad7da6235775d5d3d36ac5d4fd0e5ff7efb63b1d8dfdfd6ce33ee3fc1db75fd0f8b67dde187f0c8f01fafc2fa0cdbaf9e106da1de8b9eff2c7706ecb00da2f447cb332fc7ede2f441c6fa9d327abdbd0e13466d6114745e80de18a9e5b94d627b9b4555916c0127df873255b6c6aaee48026bb92a5946cc93ceb035c49ada4c9de48cb0268b2318025fa94453fd7550ca08942a8007b43ff469a26ca077bc32908eeee73a2f6140177799544644b2d2257e8172962c40812481ca1b4cf1ba8b9eb4e2784eef666d4ed4dee8290d2627c9d2e88eed8567fd25a6bab5553296bad6db5eebdf76ad3c3300c9b9e8ecee6d20dd15dae7a7a5aad988aa90e5fbd85212ea420fa65caa0208b0c2f4472479ae8eb14e91886611816e9963a58892c2b9e81cd15696212b5b6012bd68bebe123b8077ef42cafabd98225eee996d0bdb2700fc6812cf22bc6015c913b2a45a00c8183e0b2e6ac642a0ba216dfc6289c52271b27642868fabd4480166494af801630302c7b98b964d1621209990823dce3d045c4877af8d97ad3f54ceebb1d135a7bf9d8eb158531bb2515aa0e490a5407b2789c9c96eac715b40eaacecc912b4ad278715a3fd487fa96c8342a12d6f27052b5843033c445841cd710565f8a240211e65245a1125c4225648f3b32d78f71e615749163f5348e8b0ce394389c0e64916fc283a35add1f3835bad7d5ea5e9d2b9052a4142985d13bb1b982daa979f7c5b0ac678b6808b8225f0786c3dc5d77dd42e9ba85164f551df0be0e1c70d041071ebda6200bec7eb636a7a00b0a2395a04dd573caf21c2795149b555ffbd656eb616d7b31ebf642d3b65a5bd105bc9b14024db50ab2885cf305591112e85e738acb2c7e26eab9321bed60c61965b8134c20438c9174439c9174439c9174439c9174439c9174439cf7de4bba21926ee8e921dda0e3434c4639ef8f67c00d1c1a0eed6b6aaee4d2dc628070a5e6802b546b144639b76d6bbb7b611fce39e7cffa5aae1ee8b5cf9aa6695a7e08d2be7a96571c69ea95c5359ebb0ab7b6b2e6ca8ed5bcfc953531765933bfcc8ff367f9b1fcf77bddb17ccb5f71a449db3dfedc5ed0cfbbe2c852fcbcaf576bcecb42a1aaaf0e097d7924c2e517a99d154838905f5f524841f1f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3935fd35ef4ba7bd560f2d75a9feeddb3e6410e52654c9f33714f7ff793c76028a1db8b9eee6ef2982c4d2e7ffdecd99c3f05fd92d0539d5f6214200acabfbdfe9937e82d25f9fa21afcfc00303e8e9ee74f53afddad74eef17f9b57f2dd3aefdcddb936c924bdbcf1b667bbd6152fcde291ebe8c5b8c141b9eec1a939774d1a626bbc6e4dcd72ff13a0d9c6a9f3f674fcb346b0a7aed3347bfc2a06d2a4b35bec6cc959256a0e90bcd8ff157fc79d4ab8a8742311cf4f4435abfde1a85c5495e6f245ee8413fea28a00fed5e551cb4b1b661f067bc7ba634e7a7d5eb28d5037d556920f2d04baee53c030f277992dd69c0c8430faada570ff4214f6b4f7290d7b9ad7939bfc6d33da129dd5ed407e1dc6978f184d6b28a6f1bf7b0057038cc80ce0c3c7ace0f18e1041e55f303461851594698448810214284cb32c4bcbb26b8ae09d20a8420048e7bbdb7bd51dd35a129e5842084ae099726ba2664483251903a40aae1458c8277affd8cfcf871442ab1a963acb5da7fa1bba27645f118e5a4d55eac7342cb9f4e640ca33efd97ba6bdd178851c470897dfd174c45dd1df6d977f56378b665c0f60b1575431639e326e7a494d65aabb5d6da7befbdb7f3d1f2e7ebd5d3e3a3337d51c1ad0a4ebdae7da042109e28e2c53307e786d100f654c34fa91be4c975559894d65aadb5f6de7b6f15b2b9bb2a6c2f30ea9631ecae329b4a39af4ece1a2b6b5ee8418f437731841ef43342f8413f43e3e73e474a65c5a6d52f906b7f3718906bbbbe1663db4c68bc7bf6127f8b49437e8b692b9c33079f4f038dc17232a187d5e3a462b158ac53cdc9c608cf4b966a12ac2458ac1e383860962a5249f1d3efa39f792d2f4c77457ddf8777b8e178855358c56b37858afabeeffbbeeffbbe6f0a5a7e9da9298c5595c82c560f1c1613b21374afae8cca285746b932ca65249b52b9469a6cde9157d294f34dbec93c9c52279b277cb28ccf135986c7e5e31aa24364a7c82b774cc82a8fcbc7354487c84e919711976b880e919d22af93cd694746f9b8b2cac73564e7898cca33ae8c3ad99c522e168be53ad964560622c315b4eee031827e7b14ad9b8031c658f7043d1fc356b8ae3a23344cf635631c9c835bd2f4439a2c1e8275a429633f7f67a70886fa68eac63cc8d28d2cb1f00d6649d38d190eab6b42fcecfbba232abe3142476c879bcac3c4f968be1a6edf45045e619734757c5357377c3ec62e2266f87c5c57f8a3a91f6af5d1ec8f0ff2b61ee35d7d34f8a5e5d82c08a46d191fea9b49d9ed356f8b315a5b6be5360988a62cfed1fcf0795c6baeccac7daf3ff069513f5f93b0696d5dc9d2dc814fcc8b2f37120edd31151e9fe274fa43c470200b15100f6481fd7ced093c7ef698fde8d95edf6e1e280e6499cfb9301c3ea38d7d6bfd7a81c9edb79056931a0d6cee98a061ee576e2bbf7f5251cda4d2cc92255b7b701b6316e32975efcf2de3de7bb39f5e16efbd11a390d33fa9a4a9fee71ce9a8d5c36da49462d845baa1addd24979e36367dfab5ae302898f03ad9f4f0f89c54469038f23ad9e4ac74cf2acb35cf2b9e54324ea953cd2975b239a94ea9930d76aa39a54e362715764a9d6c4229d6c926bf42a9532a7ec633a37b7dbd727e0c215284c8eb75529d6c705a2e9d9d9316f6a1c369113a45f4e0396a5d13340cf695d39734c52f5587485324e222a940f73cc3e99354a03be6994274f873e81ae206bf31a6c754978bc9c764d0cda5d6da624acf6258861f0af24af3c5eb558f72f8d1e4abc1d9922bae3b7e34355096e2cbcd8564d38e755d8291e4974b1589aaa88aaac8d35ce2d5482bddb58c5e7992570f7208ec19ba864f159f0f90a5a9656456d28402ed8a5a0af4bb88b626c32ad124d9111dfaf939bf66e6a9358a76ada26824f3c8d2fcfcd264a469669d01b2341f0239a4a0ec151acaf36080e2cd45f4f8d5234dd5088f341d91261f6992bb7a9a0e1d0169923fdf021298408d0d4419ca611045484119e5534e224acaa3fc8c944741f994944fd93652b40c47411672b6a4701bf71b4acaa3886aa4498412cd8852d294c2ea30614116f22d8f9691a6d0cfd737a449f4f3354acfe41c3af8cc2f1e3eeba7d4ddc580f2293f03e553b68d1eeadb48799419231b283faaa28fdb8b4a117298b020cbccdff34bcb78fa8646cdc892d452cce875f251bc2e06b967a4fce867748ff2dda3fc4df1505c37e4f5181eaa0fb790482412795dfe7d121bc3492e8cb917204bf32b0f64999fe2d51ef8d2282db3842ec9ad6529bec6b8ee9a6b14aea7fece1b7928a1d093889ee44bbcbbb9947c9e1bd531a1eb87ee7d9148e499884c48fe927c8b594212fa1632b4b15e5139563387a6654c7ee0f33339efa6504a5be902e68e48aa1802a1fc88437bee716c0f7a0ef4803d07b4e7de6e0fea62d09efb19da737bc6f6a00de78a95d8d3083dd20edd356cf78e098d5f3e86bda59f79311cbb2dae2a5da87cda44862b7a475ad5a0610159a2ad131d7ac29226c933942da396eee1ebced3e4ca08c36016ed88aa7612c2b91dfae49d104e08278413c209e1e49d13d18e68475444f412f1889010f5887c267475bd6bbdb0d1f14a2c42164c5a6f022cbb2370f2e3c425b704ac8bcebbe7d1772871d4fde867743f1a7d47ea9e54a589498aef938b1e9ebc88aabc8aee873475f8ea70baae254d294f497ef40a9db04e7a9ce09ce448137e2ada5902ef211cfbddc7b8907677318cbefb19a3ef547eb4678cbefb6edb50f1a30d27c977d1cee8055968c977e873c23ae9e19de0c8127dec9de4c8129d910137545ec567d2091e307a16fe01dd9338d0c30c154f7a0ea8ecce3e0b3f7a169e032a7637770c2cfce83bbb67b0b047dd8cef9eb4b34cf332d5503cfb70d3e69cdf4f5815653ffbed710cdeb2084c09c4ccf23269870e7d664116590a9ea4f86973a6f3c26dbd5e511d13da7eb7377c061f6d3deda717c32528d33228417d062e471ef729bc3ef9c9ee35c715b17a5d95785d93787db4044e3f847116c57956464696e80d59a2dfe100aed0d7a103071c749072431ae86865a84569a4558d27ac0e07b2b09906da992bf4a5bdc93bf341bb63d8b6bbe632ef6495bc83034effdadde1904077e8b3011b3228f9d44a6f44ca418fbefb3e8112fd6ed48d6a74cf3b273bd2248bbca489070969eac93ed877b931593291a50925a4588c1464edd6b804e0ece95e27f2919052ade0cc24f5435e867273d93e574d6e2ff821c4b964c3398364d71488dacd65d35abff43a26b4fcfad1eb33f850eee1169f7a313c72da83bcdee2e25a7ecdcbea0c3abdb22a4e652da125a6513836b137f160c5bcfd02c9cc2747e7d7346a46a7a4a9866365199434cdc455d63eff0ced737e2dc6c59d9e8d8f77e77ee0589025db3da7b28c976f64549e91a52ca393f14e943d51febc14c3b0aff17a31bcceac59433269f58009c0e8d0a5a12b46928a64021d35797dd0f43efe1817d8dd5d0cd9e39f913dde367ab86f23db312eaa0c4823d01dba4823d0fd1f3001180b80c10069eab0086d419a263595624fad82cc7aea0ae4048c9ccc6cc95ede3cf6312e3ab8b78d1ee0dbc03edb70aec4dd5b5e3330ded0058cbb57528ec63efb9ef5cc16e8423e7703b4822ce2673dd27424f3c99e70a2eac0bb3b4807ea0468055964d6931dc97cb2276449667a65255d41ae1f630a397b7a68b5af170b9c9262408ac10b22183386c7592f10120f120f120f120f120f120f120f120f120f120f120f120f1e788001e9a6071e52509a9072d076742d7c4196c9f1e03c9005fd69654a8ee073ce121ec832391c3ee38c5407b2cceb552b5ba3158f9f47241c342eb916c6c1381807fb149fd9525173257e2aa552ad5612d405a1b923525690452b45071ebf7347c494156489d8a487c71fc5ec0559e2ef395ad11ba880cc80091549875a493a9c5227153fb94ea9934a4eeb7da869739d1f4ade5a6fadb5d62f95035686711c8655ec6b94917bcbce47b365d983344c638ee33eff08d318b739aeae76f0ea4d0a6acb0e958fb1bf9bcb47130d203ff3b4867d7273c1308d9402fda5ac900c576499166f81439790142f024ebd9b8ccc638c5edc64d05a238fbdb22476b2c959c35e3fa5409d06c89e6cb697cd25d656fd214bd5655ffedd5c6e8c2414e8932a6eaf53a3c0bd58be4f2af931d3ab4ae8aea2a94016707a96774b68cb7b8c98a0ad8717159c33e6bc9a9a2bf77e943163e8a2b6b09c38ea0479d0c588948365f00d8c92a699ec06b290af3d5165ea0d1770b64889f1ded9632fbfdc76cf78643790a5aeb8b67b45d51bb254ff7a30db4e7df8bfc42878cef93bf5f05b2ca58d9dfae0542627145966071ae300beb011cc8391c07287cb22e0103088528e34d11a9f4ea8544eb47639ebd4cc000000004315002030140e07442281402c8d2541d41d14000b8d8e4864509b08035a9203290821070c32c410000000022033421a8100f24870c83a800ce3eae86d3d0f7e390d2ba27ca400b8423a61000c8de64282ffbb893e3c2e61384c521daa958ad762ef023a760035ee6e39162cbdbe5e07e3830192e56b9228429631375c2928c2f5aec630675f3eb28457664c49972935545dc4f73ca61f6e2d2333caaa7c9cee6880d1ef7d0b88423b35555004fb30243118aaef5406eae46b7a7c6a805c54cf8b2336074397cbfb201bb70946777f8b5d418f128d27837e0ad2232fc41d7137a5d7e2f0e1574c6de0f9548f3e9a67616c3cfd6ebd5c6b82f4dda89c9295ada9bb354e186451fce7e8018882bc3d8e129b52f8acc03d36de6aeeb783e8b51da540418174223181182135704c3d8a416cdd7ae95d74bb486ae45bd027f49c46694294a01d3dc3570458ee48a112d9e166876cd677ab10523ea293884a22e35b51ab9a2c38b33d25ea6819d3611e512ae38d7e31cf37f0b5a2b8c46212455f501071332e66a61bcfd85c03f94fe2817adcdc607d1388873e67eb71f3712c12dbf20c8a8570219e3b1d21bbcab5b31b16591c6b41bff53aee49c2df445b0c1cb7b33b0d111331534f108e935c07cb8c4087e0fe6113123043b8d575f58015a120a29a8dad9842e3d7d50c248db05cb884f10ac07441f7849877d2e850804359b43478c2f9721381b81fdba86620673f88e2e924d8d363c8a551f34666b08eeeb219d929a175d43cacfc4b7436dff678cbe3e5826f77a24826e1536fd751bd99b7d309744be385b6403a8f1bfcfa4264c14597bd5832ae3872c19ee0cd6423e441765ee69ce84fe5c81ecdee23e2355363e61ed13e42bf890127b4b4504d792a93b623f443e46d9f9233b5e2c8fb20228dc10634fe8689f170add37b479b1042b35e8cc596cbda64a5a215a86ac4aac89d883d86ee0ee72d095ae5d44d071384b43dfb095d4660b9aa2eba053565c727126ac5b33888651881aca877ed593b6bef7c4e93648308953e22556d0d33d51867fcf94bf6c8109b0a063fe9d984d929b07cfe32fdfcf10169c057c1164da5b3ef0c86368904ab48fb82f6d47f83390ee4db0a2c9507aa01a321bde00658d61150df1862e3a0a017ced37bbc442529290640034c341a2f0fe93a6fa431413150faac9e5a625c2ebd53d38e9adbc83757e7b35c10a45327e308d0b69094b7e86f97398c7111ccd5325d93b88f3dce36583e94e8601a0b7eef98906c60ef1c6a683649de971a3fff4f80c42574e4477009b206b43dc50cd71f0aa1d9c8e41b8645479213f74d4631ee1561216b1da8628f5cdaccd041a6b7753c1b7446f423201273ca12fa21e9191060403f47585c157d1ea07d3612856411d26cfa4e3806d4509a03d39e488c0763ea84f6c3d000203e0c8a9f2c239801515f84976d78424cba8251294bc322345c0339706c643c37c9d6ec4f708d98316a21e2680c1430491f4cd17097f2e535989f392f41573f2b5cc6140b6e4be674bd452cb99087ec87ec4341ae264f8002353cb2ba4b202ef904baca3d4bb7c10a3b57df78c368ba28b890380805b2a93668a931ec6f3312deca0aece055e5242a763085c4809fa1ef6f63d4823ea2ecce0a8874aebb52702598074bd2f446840ccdec9bf23b6cb455d1866113caa03129d28641a880062903acf1e3f0cc81a9df509ae138374b896fde35ff4d788db138ca5364874ceb285c75ac54ef4dfe24104a3be822729c3e2b13b407471ea50a8373dbb039c47241f17720dbd16c4f6f2b095a5fb8852e17b035ad69ebea0e9062e841ad311884b1f81a01b6b59d1661eeefe1abc83037a7d22e1009c6c5d52941f0f19eea1f02f36f1437e45f0905f6d42adb5e18d08b1397a7217e252d6e399dc02cab38f047d4b7e21915c9b9ae530e196cf567cbf62b8fe6511e01399e76ea8050f268285c30b674abec4a5d59fa3bde556cd9f950435c920a9bb5801afb382b3016fab87cf94db842c3b86d963cdca97ea50818fd9f461e3693274594ac2b8c8ee317dd1fe4124619f19b15e9409839f7f0257bdcb87abc9c3ffd380578ea43d9366936ea4f2828c91f87211dea219bbc57e2a9a9815c74e7d1104fc22f8869a2959d86c773fd7442e2c206c433ea7c55add4bcf309e202a0f8330809f4261ae00aaeca4e5fa101d2fa6844093cd682dfb368f64d7d00f0be59615965b49091c553ce8f91bc1143825470f973e600f1a95abd2793898d1949c2530fc42d91804e63113813b4c43a02b148809cb34a1b87b3008d90e8edb9c1aa317104fed0311a13fb4dcc8d5ac1ac062a573782227839503295a711511325533462ee68f423a9f45bfdfd333438d7ea2b68ddb6db82859a6afffba9e6b36e29a9be63203faca6c4d312d999bc9bf0204addbf7c45cb6c7cf5e35364ceda9231016be3fee620ae10e4bae2889469a37d0648d0ed44e3dcd69d5bc1ac42300766972cd11b46fe04f665d5f99186da0f10d6c1a8ea21b2b5b07e71a6bf3df408e253de73659207340bb5893e63caa4ab020c11ba27ab59715583d3e977520766de65c70e8d83f39c167cd44fc50bed8fce38feb7c84ec0a840af48ae22959392bb1a3f872274e55fc84a9750c271049d8bfb3cf80365da4f2445c93b702f5ea42cd44a455ebbe098d64ca9ad0ed6ed2d7cd87f0bf70c4ec049495e5a29f5449a299b0658bc3b49fe6ee41e75f44f63670b61c71f20aaaab8a710a1ff46baa4b4d8b601c860d8075350f244c7e02d09e4fed013a5d093e3495d1b9da0e13840fb6653ebf99eec24f4570bebc7136e17f33105c1574c08d4b3755f7fd997a3db24f4d3115b034095e8b3dc88ac781b382aeae234efa9913da93a5babf1b44c7d58c93f7634314cc2995401fb996d8d60e8833fb692b295a77b3269224e052e7b02da755afcaa738be2f301331c677ed22f7f5ba21cf60d7d7d107cea5410082f43c60cf358efe78f4cd09bdc2b82812e44af024db2d0b4f17fb4e46edfab60363203583cc640616ccce6edf9d75df8a6dad824ee0d9b66130b691a10168ef34154e8558c4bf98b9a0b6cda58cf3c4d8e1411b441d13d40589bb236b40ba714116e50d33d2719d3637ddad84c8b2c061f3ebb40c8c549a06ed9f0702a72e2b6c41913180b29b1631109fd080851b54872e157ec01224ebf765a5bcd37aca0cff4dd50b7f9afe164b3679a7130dc61d0e4c35a33a46b7604c939679d58b664da91cce0f8d7185b8d30d0812a8343b7751db2b78bca6108a6ebe9b6929bb580d969d492848eb92327a1b953ca9e7f25899830bf9d5f0921205ebbcf0a4d9ef83d0b1d9c647d7977ce94fe976357f9b21c811971d2ad1b916815321841ff58e110f42fd51262c27b98a8aaf6906172543e61fe423e118869054190ed5efda12b7996c69bd735850150dbbe9fd88ded80e55eac5cc3bb6a1afeaf86e3aee8153dc551525c7451b2751e5ab9c3d85d8ee01f93caa6e33cb63146719b3a77cf216e1d1782012eecb8595c5cf8930eec710d163e760c4d4909cfd1b13c9707f813c73435ebb0b4565514351f48eda35e603af62ecd45df959a2454bbd5152b6de39592426db67e04ee0a4d238ddb077040257dab12748fe5177ca428117cd0a3f2d921a817c12c352b42a79a3e18ac7c200aaab9751fb72f83dbdf49db92a910fb829d91fa085f2f2b812a04674eda97632b36404d1c227f62f0abc10f8e4c885d39f000051488eea7188610c0b44a51e86002f3a7679abc0fd1538cde2c7b3bc3c92fac772bf1f9d99e1f45c77bd1c450b4eeed7b83f2ef8b307180a8fc45905b2fb83b59f1a28f2ced05ad6365a5097f7fa2bc82b109639f21567e17d8e39899b9fcf26775f07d52481d46b12d2f519729dd0ee0076b191f0b044e5d3ea6b29324cba9cc6127cece6eaa50675bb767785bf88952a1a75c8c6123872ffea352203efc93a3960f733b589e8854333c0acd993ae2e3c93b72bba0e8d3976c7d716d5cd93f90ca54ecfa095020061ff600af0d3841301502f0033f876d9482f80120721a4d38c3ff4359c7306738851e83a9ce37c1f3fd1bfcfc49b420d38169fb617c6bd5be7c4d593deb014f734ee20929c7ab4a8221cffed113a41a6ef870ea84f621d031f4caa287f35b572105e9884106ecc8c8af4a873442c8339ebf39732a5f536e796d183afcc65a3d10d6700a088b23396b8b92b53129ec0841f9ea69cb13789d21cfef98a8069df3f65cc59a671a3c17d3177380c775f8da6a5576532af04b7d5c89fdf5a4405f1ba525069a86bbd6d6d0d50fe077726dfc4045a5098693950e899e5805a6815a2f5b025c1560a127e6b8033540c5e027b18ea225d113b161e8e09bbdc15b118f48acab48c9f4446c743af0e66feec899ea37e28801ab6b8c9e408ec488db4f767bc1d3acd5a44580b8c56e6082053d03dcc7139699c899aec9dcfa069749695ed20e03f2bf447539556039363029559f4fc50d33a85554b8721a14648f04395389bf2b9a0322f5a2a2b13ffdd0e0c74064c207cb78832e8814c0f5f4ce188f3af689734591a12ab82a156ebd8006d21b504128f3c728b332890c2082073cbe9153bb82460f08bcb9818dd462bf5cda3f6dee01c4be6fc7ed3ec84e8fc228b5fdda3de1a6587af42a5da2f325b2e00d7417d5cbbcbb815209bb65672718f1ded6533e76ad53205005901011627b612b025d21cd526dc7b8332f2ae1a06b1a992fb9eb1ac977cb968ccc3d91d90acf995f34e83372a751cf46a6aa3426ddb637627116cdfe8bfb2f19918dfe6a423536ce4b27bdeef9ce6a9b5e5c7c4f4a6ad9617f701dd911f92841c74d25fb20d6013f56cf28665bdfdc859defef172667ebccf0bac099081ed5b408f1b0da070591a8433693935dab7e0206e42c6ce02ecd6e65ac5b8897aeb3e76f73f1358594a09012b0dd19ef22bd41f8675933cf4835ea5bae942facdbf2c061e61c9b9f6420e6f9af2514a30ed9b5cbb43f6dcd813bc9ec7c0336ab3a76a330c05e560c4d2984c216d779940480a0412be82955504802fb02d9ec6d3428add1fe533c219f2471ba88213c0e122bd645fd4e9b9ae0995d68cf42d4e43079fa74f364eba71e88f053469c4cda7eb017c478226aa5f91ea89406fb5ab109f92817e3905b020243556df1f8c5494231391f4d160edaaa1e2dd3780a8cd75a65bea95edc71536cb6692c61c1506fe99ee99678230d82aabcb9350fac6f20b5b05bf994ea7706aeddb48cb869367a13aa390ee4bb8f8185e43f2dd4252202c77d15ad38e05683cf597ad0914519d895c8363fb28b6449bac0c85191df6a0ed7da7116388b0eb138ebea52a6c59f95e37fb76298214478f65bc4f99cc9c1478a607931e799595e08c6e7fb424393b06409aa90a225407a1d6d7e3ab4f332da04a26be6112172ef3e33ed18d662f24a9003306bd7b4fcb0a8c3a866964bd2d2b0f8572f9e0c81b2f83849c547d8577cb7539b2b74d560fe294f87ce818d989f5db96e4a6206e3e12a2ccc3ceb24d3adfb095c7d4e418de8e6ea0c0e234ef8d98646774c6b314410231113353bb473c03539465e4e689f818e485acee9758f13e960a204269908a7197d4d88081af678a42ebeb424354c6426318a0e850f042a49788b1aed07550fbbec05f6721e3ff7169c12e1fa6652a8e31c9079b09dff8b9cfd74cab9ab8f56957fb6db283954c42e51aa730ff493baee4ddc40ac34ca160c488c92f8cc3bc2434947544b5f74dc27d43d705bafc0ab5dbabb2711befbdd7051cf6012c1d9a6feb6fa8750fbf484893292de7e3ed34eac260d79b247db4d09ee28ecc502f02d0fcfbfa32f1d83850d736596db528a2861516ac44efaf31304c147863096875c7d6e9139e23e1beed013e8c942e4f2c8938ec65e964a85918eec632765833cfbe4e18947dc03c7a529c821c7970b70a87b9d3fc5b0be66b8d1b0ff6f2381a8714c91cf68d4f3b120203aa46d2736613a48f8a2a71bf1b8ff4e60f87e12b6e98e4be4ed62db28927d8449216ebc5f8a47441188a9f3be74fcf4a37b3b121e19efd2e3736c36bbc3d4bcb079bc213d8e14f4629101878819b4d013434a1e7f2a3cb863109dc3f9cb649e504b399819075afef27975a68c926ef972bfce2f448c2fdad88fc0a8700dd995b4e62d86ef6bb80c6b1cb0dd1c2a5186b6632eeb920afb3a797cf8cac9e759147926ca6513b2a04c9418fa89f2fc2ce205c3722c336119166fa279d10ac5f59529d4725a91f4ed0b102745c55de0ca88663a8a42316a2131795a9b00006fed79125fbdb1105458f5ff6020b753f886e705bc356e5f2cf3acd33c4e8523dbcfd0a7114f450b1c19defabd038ce47187ff9724f7dea9f7905815bdfa489abe786b334d7b533eead5ee2982867d39a088dadc913a226aebf2420cbcf94a460cbb9673dc7ee4254c1b8ffd7136ed113450d0f03ce4e96ba5e5c14c525d82e73508ed07c8ad2e122130dca15cf2302d4d021bfb66ad43f99cf72cff69d69d5f32cb62ab4df271534f53270b49d57d9614808e60b0e6338512779a4282aa9cae392888d421f748960d71df8ea546b9872f7530e8403fe722d69f258a9322ff13801372ddda838e845f88970d76871c5f1e9b38c4263582b657c978732d58fff0856ccfebdaa331c195075783fe1e3ec4042b43158c599342f23e87eb60f483748f3b20b95d18732fedeb8b29ca0cb7bf1ad61e637119021439516aeaf0383d8537e621b758417299b424233f2131939bff467b37e109954e36e8e1f9a6203e9c48dc41a46311fce3d4307434cab8f5220d4e413fe3275cb10dd5fdb9bca2279ffadc36d72b6727811f78b1d5a4e2b6a4ca0f83d713c49b621f8770447b4c40eaa4019f564bedcb164bd250556f3f2db40bd60657966490a0e346231e4b970ec12f0927f436453096006eb32f5a588b3f34c89dc110900113d3216e27ae658916290aa23a74c86bd9edacc79e8ae93e2ecb403e9cd7e63932488b944c701f7b7f90236693fdfd7d62c8cb49f2a8080a8886f93455b7c9837cba29aef606f8e3f2baaeab0909372272bd52ebec7ea5bd5102d3a6f6c69e37b90249f04ace36ae69115da976a3032b41b35123a989f42e159689c96540b752376153e0d7d2f02528da091e5280122d837121a32b054e5d59bb3667a95a01b8d37f73d47aa997d31b08f51047f90ea9bfba9e8a28ce5c4c3b308e062a0b92120aebe8b443d6382f83421a2613bfd8db48fecf9060c313c3619bf7ddb4dff44db0cfeda870031e5b50707e01e21cf8bf3bfefbfcdb0218b4f96ec9e8def78ba8e5ca5a94eb8a1ea64a6c45bf42944f7bfe7c8b8e3a99f8627f23fb3f3b825835082536aeb1390d135c355ce3c4b299fe4f601697cb6efe680a38b8b7b81ba8c096a9c7ca44ecddea909b68a56d7a018e1aed574eef09ed44f4ddfec9404c19e362cbb6ec6f479148cd880eb81946f1b50a0b7e7bbd154f20895d85bfbdde8e49289c7a803fc74b7cfc650845323e2a40871d228aac00f0043eedb2496b331981153a218349572d14bac6cba0328604e0d04301734559ee9036712ba7e11a96e85b41c4b4b8c346ba4d04a1b0d02502136b5902a04803b950fa313de0d026b6a5539d0206aa3014dbbd12473bd5af89dbb74251bac3adef63baa08a39d4bd5b897aa70ac58ed11580bea2208a0d985ce82a5e0df99dfdfa3ee06054136ad2bbbbc10f1b065695ad263959c9f51d29fe019e6ff6ee021b936a42585d25ee71c0e3c9babe6126ad0bd714b46bb74691eff21abeeefd0caf6a59f995f10a9e04ee2166c0ea84c6b360eb50197abb33c843a6af6d90aa83f932fd06810b1cb35c3b2cf791e16e8bb301c348cfbf052c218c891139b92e20d4704a085085f0074f9adc99220f79d36f1e2066dcc7dfafa00f25b117584bd38028a35a3b589c28f38ceb6c430351c35d138e63609510d15d7f20945b556697a0a333f660eff6c41e9252483f6793a6b45d8dbf8d5f47ceb225552702dd99e18179381d5695854d485b11337f1e09f492f946c60d846ebbf54a5e2c80f976424acfe5bb978682f4563b260c7e242e0c9c1950b9e95b3eccfc689f9e985cf53b95b7c959838d779baecda6ea7f51b7f404d6b8332ca425dfad1ba7f4bec83198d24572127fd59953363d05617d26bd2fc37f08607db82f9800ce3db769b7437c9ed51efcdc880801b97bb98a005595d0c29e70672c761c5fa31cec122dd8408d3862994072229dd0e5cc6869052e81ae0997c462af0d5ea93017f56fa5c4689626bd075fa54fa4cbc0d4dc2d863289708624173c114a68dc6835928fa2ebbc024a9c775d0cabbcbc24e9d6be1ba3460eb1183ca5375a71129d54f8c0d89f82f508d3b5c9cd9b1623f04907d76e0deae22327b38e1f390059f542a6cd4650fc3518ebe053e7b3f6a71cb20c80dde4df45d51868ff281f91a69e463dad4aa79ef48fe475ead6481f97f5d8c3785058a781c00edd1af9807f73c72f3509962691e49426dd15c5ac91d64a9b57445c412819f882fde81968f0846defef61f4473669bc41f07154a3416d4d04eed4e3cd93353e3448e5025c8acbd6d45c80b2e01ce1e1b52f8086aa41e2cd31cb148edb8205457cb89fef6d4a50a6b5cec237fbbd8ccd9483c174feca8af6f80b22e3b3c6828e049114aeeee01b7c2c109a811259b9c95976cb43c9f1ec13d36a04e1385d2253fb8ce0983fa6dd54933dfc19070ba48b33e44afc47e904ed14bb0d666d510551faad28462455377df3ba0b68d4c132dbbe20c2d62ae1e14ba1e75c3ea2742b32a902e2d1145b25cb4a0005f66021834680da4450c50700e9019f93c023bf2d609f4a723234811bd3125c3114422c497d3247a4f2b605f6cc85dcea86de4dce8d1f4a3b4138341af070a4727857054572c99cef8700188d37f2088072e1fa4b8029c7175b50319f729208d8df47785b67aa00db3a00a7dbd331ac87ea51e1b8e50540c2a9407826fc3c51d9bfcfaf1c4001a356eed516604ba15caaf47a5770cb587ab7a446b3d475b06876ea8a12386e75cd8202df8733946b0f302a52148cac9744c9da62b8a2af351ae6927c72e69bcdf442eb65ff269f8b869525a6e79f129ac5bfd38cedadb6af9d1c94beca6d4c17c3d3304727eb344ca06131cd262ce848d364166998a091751a26b0a4d1641a16d230c9721a26c482934ba38facd4dcbf2b18de6dd20d4a764e8343cd53baa8311f9a66798670113279d567fe14f46ba1ca55b034fa3303f5d30e8e0a8282be5d99dc8ec4c50b1486d15e2601c84579a25a721a0bccb70656f7e9182378bd203f6b2fb382c82522b417abbd4c7fc53507335a26c6b1e36b24d866dacb14d2644f006b6ad8cb8c0c94a17c50020df243692fb3732a49398f9a1c848dc3feadecfd1d6985ee7a3da999650971d109087b997a12492f1e3e104077c0874d622f63b8c1b1a574c141e0ca4c1eb7a680031bf29543947792a17fff94e05d6671a640d469abdcd5873463493b882bfe3642881707ba4524ae5e32dd549cc970196704c49ef056ce12fe9a9f52cef4103d870c53f81425c697435ae01e2e7c35a9ef356c05b497c157c05fcb8fb37910440e4b5153d12309f0f00eda6d2f73c79c337f43e52b39d4e939620ebf10ec8261a69501d071dabacc368df877985fb36974eb75971d2d6086adf3c2f332c6bec24e89b40495ae83eeb0838cf2aa5ce89c7fc95cc1bb36238cb9d498975954443a5458137c12ad109c64f96f96ce088d38eedb4ec300e59470213e2fa32fa1194b76301bbb6296da7f8f791953f10a5f0a69593b5dcef1e665b030e924a8841f278caa2acf705c22129df180abfc5a6194365f6434c530fb26c3a69335cccb5cc330c76b9e3a5907119b6fa76b788ef72ec0af51afa9afbc11116da9220e1410df33a7676150ca7a720936b6fef6219e612e508536397f617b0e84cc3aaf042d92782058bccb072ca615feb692b1141618c69f9749b1c2ff04785a28ea89b79c25c648019f92b12e93f573f5d5df77daee4de6f2c4e749391024abf9c2c92a1b2b03e2416e736465bc0f675556ee89820fc6dd945f22b89691967db79895d76456309afa4d56e7e559e106acdbcfa66070e39c6805989a6f9956fc0e4435e95b2c540e183255a45afebd595c34bb9a5a99a337842541970b6cbfe5a05b0e40106bad646c476c4594d8cdb495e6468c5b516f79b25b5ce00aa349f38d65c5ff8adcafa29cd3732840e04031237a685911715bc4d4e93d1193cfa23076a3a7b0132c4492c63f56e11c8eb6626784cd9dc81114d1beb902d6863bcc6f3628a25b1545e88eb8c5a8f137d81f19e15ca38c55c8bddaa5c3c2c5fdaa3f7d7be5176711ee61db2e1941fdf84258459bd2f1f9b7c3e1abf0a295bd78b0fd5e7010d51c15e1feb06d921b295edf1455e9c94c664ac8eb8b9f348df4de51bf46c157e16a05fc5acb35e3ce1120f286087db21777ecac39419ad264fa50dfb666c8d0993e4a7e7d24104aea75c66b43783b0855a8f1443ab08da9b36130e299307736e429400a085f805734e448e4a80b8b73202102ca6568177f887b653b317992319ee090e914557c2383b530aee5a1bd6c75f0d6c6b4465a247c880cb626a037da905c75bf7a0a266258c8a75a26075210fce8407635193459c561ce5ac401fc608b65f15c306065218866295e5135818406adc84e78ea59f163ed25a1e566a2482348414ccf88b962f0c521b21dedfcf65d210a6da3ef6fddbee3e67957df08539dd19b13dc3f7837f97ff507c6943ffb051fa6883e437218bbb9d81f4e4e37cefdd4673b7be29e458ece7038dcbb22ec0f98f758bd07e5582f30fb9d8e01b6485e2465c5c85f92f71c586c42f71d25ef1113a2def41aec95bc843728bad23291dfb9e4b9193c214133ecd269b762f21cef28281bc86cefb189a6012994e8793bab503479a349d0044da7f0953b72d20ca397463988a6bac9eb0a9331e65ca872317db9e308fa558322d46a1463808a657133939b54e8f3ed3c290e5fbbca0ad7f58b4294b7352b4419b27ba2269d707a24da8707ace94608aa961fed202d3f2e9ef4b965995a057ca8f59e4be345c995e2d11de7583b7b76fd805eb20a540ec087cb42d0a5a18b4d90e8e2eb7490bcb230d3084173ce5a53985810ac7e023ba5392edba452fa89d602b14569e206f32f0bc017c8de6524d7b306cfb87cffaa10bdc2ad63a45df6f1c2930c604fc06c59d410ed5256d17c97996f201b6ef6651f4f999bc60632fad1e9db0db11f0d6c3b204f31d61cc843f48520c5f28b1cf0273089cb55e18490004c81a741687567bf450ba780a8535ce26f3ee56da039e58f9a5bee20f40c439e842ddbdc5fd67bf54f0bbbb75a70dfd3ea58a5c95ff7bb87fcae14fd2f31b2cf5b424870a20317666cf57632c657318a71423c91f727a635de52151cf7772f12fe9d62dc2d2f88ef6ef98e6bc9a41080421f832967f189e07b0781924208f2ba3e194c7525b1f861f9b0fb0672a6cc1e7a6d252efff31574bcef1ae08bc6374da29090ab7607e3cf8c17e1aec9b68b4a259e2fbe128560805003a6db79291dba057dd22a80c3313cfb196e83c05da7937906847211bba8e54e741acb88332e7654829c2672a158a72f2e13f1475b87f8658020ce40a31410f3bb665ea4e8d4847d27a6da53ef8ef98dcdd30fa4269b72c438e5fc6587d7603e356792a856366fc0b20e6375c46cdf3d38a6c4980f0b30245e9075448f2864a61f40ea9ae240bee4818a60ec37e21a23f4b11930607ec9b085393f312e2be860ff1fab67f201e8714a00ece9e89d4de27784dd7169c720a21e178bb6ff5738344c35c032c89b2c1c728f033837675bb994d91df1e1b4574847ca57c165e1b4e459182c2f72f6c9983865bb4228993b8652d48555abc1b368e6e80239e7f55d0d86a376c815127337f347ecb7bfecea3f0d68bf4092df5b78577c8207d7542d667c9a09931b1d86a83e3ecc1ff62c30dee643b46c8500687bd2cad45a21839f63c38df0d946f2f9c1971c06cb172f7106907805125566894b44557823ae9b011bdbab19fee5e3c6e11ce737a27da640b6028e3f8232bafb3654714b945813d4916f4d755d3e25e03bc8d9f36d01f8de8e01cab9045e632e686687281512865faad6351c10a557cc6eabcfd02cc9ba4467e3391a05c0920d94be484aa04685b4dd5d59544844b2e2ca0ea1ad5b4d2a0c8fc11f1df93661f615f444622141cd9b2170467a5cbe912a3e75bb8fab0a20064b45f7756a6f034234187563b6bb2d577b29db808ad40a9502ec1bac79c593b649792ed2b940e89810b791233839e0ff1a5b7ab21c56f8e4048e5304cde8470e1eeb0308aefc213f8c4d0ec43612b8ca3d0949d51f57cd58df209b85049961637c3b18bc6d0471e3431908bdae7e298e4047fcc8b963bb0df8ba5b78697236655fcc4d1258c205bb676570e94f0ed0c4c6973df7ff7d40c452026ae9009d6aed236da9cf10c0da9e37ba9f67cf705b7d3c7134d9e65ffee261a69212d702e6ebfc32579134bb10ad63b5705bba50873f4a4bb519d253f1e849d3f8e74bf96f25ace1bac47aa0afccc85fddc879502c1396e30f5306168e85bd5d16b094fff41e338685b2b46df447c2d2baba22bcd3bd93f1a758283cd5c5b6948ac2e499baa56814a406c3daa5430a864133e14d7781fda4bf2bc5ab03ed965a54ed2481943fc52a0346e5043cc170a53bdfeea92ac95940badc4dcc5c5bd906cd9f4e46a4919eed01d2151c50072a02d51bb787fe933ca5cdbeff6c647db5a0f6f470b35a2e6fe258778c450c92c5bb303af1ecfefb80bffe894dba2287804adece5706f3bd8da6a67de8992dd404683ffe61715b70e696bc2e0be19c2c06af88569932fe70ec687e382009503882b5c68f8dc3ab3fda7619e69aa37daae006066adc7e763cc5f0498461df1eaf1da5fa14a4c2a5e42cff5fdfc3beef50e3828f7d62710e2811b2b583c122451ab92c07ab2f341eb5494b68451afc823b213e4c9462e97aa7cf2f10a75af5de44b3ba2bccc18803d675e2570be0ebce1292aa800a89839cf67582267998ea57f73e09b70228bf8f3cc9a2db9ad1f520c4734f6b6e901e259e4fce4cc64c0f321b5dd86e4c28a1709f0306583812cf0c07fc137d7515e95a95f32051771641a8f8b8e946335b992668dc5fd02a7a06d9cfc44f9696e702a7d014646fb7a7b3f1eb35e49339bea7443902a36f066690bc8c352c949c3c54f21f1730cbe2e904228cc7d66d067ae7be4cf1d928f00eb9cc1e6d4d334bdae4345c25735491b20a6b8694491038b1d9815ebb90e00851115b987fc4823d2761281ceaac42b15232a513cecd56c450b05c7ec0c746bcca005eeb4d05b164a3e3c639188657058ba535445fa4e84d9c759f73764d2e47ead9860f6c91c2e2bc741ad61b0b366d22c547b1a6ce230dc6e4754af9009de310c611084baacd0e66989fca25e9a9b2714895d19209c0488300dd6d2e21a79437523e1cfcd5dd421df05e95fae3953fe3222fa11ee3a38320909fe44b072dd525161a8488e6ce59819c65361899b058fd11e0038eba548aa1206e0d10ed77aca49c3facad615bc108871ae13dae2e45d8a31eb47ba8bafc3748f2dab22c9965d656d9cb36e56cf40821d9e23923e89d968a48ea17354e21085e3de4a8460c8828c2a5632a20049f4272da22e636ac4abf5975f5eafb4b344b4f59ea9070b3cdd01e4f42857306d8929f046b3654064554c5dbe928d2e4a63e6dcc0d7d3ccb267df36c8553163fa3981852f6f5804bc22c581a97ddde395f864f386f91ec8608bd82ba979d5bc2106c7d8be35bf06ccce21bf1bb31b5df0fc5c462f896f0d453b184a2ed86794ee4ae338b9f0a3a572310066a40210204a96643255b03b1a29fd0904224ed2140bdabed7456de88b95fdbd4a06da65875a11bff4a068474d2ed6f304efb23645b98e71ee16260fc0e7b570c3b0d6e39148d812da645055751fbbecc57d82f5fe6e5b7284692c9318cadab108495a01f0f07faba2dc9f64b713b51a1b2512c92951bd9af78f4808b152bb9e89a826c5e056c43e4e03bc684028d763c6c60d2598ffb35371b08384cc9615245616febe8d1f0e7011d260352dafe16b5b837a02376afdf411f207023f7d19a23c02b8717d0c1ad2ee1242d165244bb181631e4e0551f0837e7f4c860a89d2fc0fd5f41a0b715a0ad34830ba2e51014420718215ae3d9df6156b441ddcfec5030d14b192dbb6facb02558a63846b692ee5e91c171c25e927fd644aff5a3725355fd0d2381251c864612f19b56b73e5d08f306537f0d3b652c717dc001848b9da20f38c223ecde262d8274f077c2f61ce03fb9a9df1c00c0ece437e028b9b77836e3a782334ebb23ee9413d23c1c938f42c542db34e018ad5eeb510ca7729013f81d0ba305f88ce26e6f007bd07a5f21efc484b32a8ba76b98e40264e0bb6c3c314ca457d4e137c61bedeeb5aea062051c191eef31027c85aaf5fbf7a268b67412ae70bed65e1c918e6a9a03b8ebdcc2c157600465831605cd608d8be9f6249407480de003294a070dcb7a9f43a7e9230d46552025b0997d3f88eab21ad070dcc65998e540cce0719eff415f6264d8440bc66797579dd9bb7ef96dfa446160ee4f69f4046aa859bfbbe9c27a37fbcce37caa3f2b8e825885c5cff8effae9dbf4d12a2b1c19652da3181b821d1efa3c75f05491d7b82ce038e04505f0f8f33fa58c86d269420753b843ff6ee59c259cbea10dd0124b7594473e0edd4e86c79f8723c4558dc9d9382a02c781cfd4dff31d8e52569545d6440128d47cda336ec29c4a3d76796ba20d5df761c9443ad2a0d1b10dee0f1d7a1f9bdc67e1e20816461bd8558d7b80d88d7d367fab10cfbca25ce2855e27b380dd0f297a29e2142c1d0e97bd0d8c34cce68dad20c79dd5b1a9cc5b28c8ecc708bbd9def7e0f4a1c636229a106e8d66a6e1d2e210972f7c63c16d0348090b02f191f771ee755c916f7c77c8f0777e48dc78f552671e45eea24ae762fa3cff8cf9f06700f954a1912e03bb557039502f00b4bf432ae8ec78b78a2514acb5935805f0a29b12c1422d03cb20f9a26047ed12cb95391c14645c7bbc6aec54842eb6e6071403e316c1d308587e6c86121625c7544285df1406c2f29e631543e4073c41c68aaf74cc0d395c0fd21db9d2a3b1861c77be3227d333f10cf6a7bf62814549c7015eb5818bf04b8bd8903e7e5772428e50a4294c92eca612728c1ee64a0ddeec6b54b2d2724a0c7f6ee2003277aa7c841c6686347aa42a53c16cf1d416e2aa55506361469e3bb0903043727f8109fefa31beedd767e0192ee412606ebd1996fac58d10460ef70bc48a26ea89c72b0460865e04dcdef4ab763bdd7070b182464e98f19cc58b92958675e0d2fb6324ee26aebcc6847866465870976c249116f53c98d1f8ef19c12e3499ca08f7f873789932256e1096ad9ae94f75f266a9bafec1a3a41b4a0a949978289befd67f25683a3ed65935fed7b823ad88272abdd793f5a592d0e5caad0e8603223edf4e1c7284145d742a920107d8893835b10021df40025b8afccc79ce3f210b274145ea3c279ee3b2c418fbd16a3b3c47b330bf1b65cbbea95d2a3c47fd0aadb3bcb2a7a06556c70e0a6c1cc0e515e56ba0a9fdef1cd87fb492bc0c8010d8d144d497cc1c1bed103a110d3bb273be956a22266e98f88d90739637e0c4a1866a0024f5da04c6162ed1fc137e72de860405e81ef99d708a6b3edaf1281dba010647953e8a0b9d6b78e94514c2f2f94b07ce782e4a85c9604aef884684f77d9f5e1e8fef8fb017962e90d25096f41a222dd1a3b14c496debe099b437b05f1e0eee060eb78f1211d04aa51c611b81af462959dc36aef1d5de0481e9ed424d0409491da0e052f8cb7ce9591c47c22ad69523e602ced89bfa48d96539fd45581438dd115d07aa42bdc05e2d0fe03e5dda21ab37cde094755db6f5852f452c3e054d7c038823c3a68f10c09aff05d4ef6b145407a03247ca1562c64b42928a25f91c7406249105307962b5c49ec181f4da456bd61af165aa5d10e5944933a9768088302ed22ab9d1ec174d96c9c3d7a743560dc6acb167b160ab3cf82b17ef72613a8823c10f966145c71d72845006e0ca50542f4315203d97e93812cbecb4fd89e38889101abe8cd21619b256bda7ec84b81c2ae784e9bf151357c30e85074e2ccb003a2d5b99368e3ce4195fe470bfd10164fffd85830dae84244aa3b50e5bb2b307261a74b0d159708a250947fcb5ebeed1cf3d7f2deec37bc1e64480b8b79743885e9e38faea15aa061cf1a1ebcb907d2bf51f913051b67bab6d2007181ca2e09ffde0adfab4e56e6fa5b916326459ca963f5f793fc3d220dd3ce1cfda6a984ee8719792c9486d21421ddd260b7cdf3c5b031cc2090c595c18c84441b75263710a84fd42a05b0b56449ffa1bf7381427f69a75a1f2cea5ac1129464778421f98cc9240d1425edeea2d7d0d013dfaef6e9a6fd98868dcbadbdf450b9aedab8f916b66d57d3b41ad8de75b23ff938ed84d0eaa665787b800450603a8b5a6e59c4d8ccf3c0657dee1612a584f702c80861f67a57a67ffb7cab12a1520ec2d41b4b74eada2ac881a235fc2a5ea2b1f9422d945cf459a5a3cb8d119df56c5d02910010a0bfa13ab9e4bae9a75253bb7af30c22b96497908957746104982edd0137ae413910e39788cd839910e31427a4116e123ddc7c8166d10e3975a32dc8fb6cc29b2332aaaa889c3b7f14271b0fbcb1c04dd53023b717e97e494f2a9e5f08e096edf993347f2ff0f9152ce6c43a4d459554ec72761b38f7a7372dd2d80d2d8a9d73bb3c69f217bd6c61d949b6b35bffb9dc58b75068b0707dc6f37ee7207ac491bf057cea94ead82f7c167aec719463e2e18f978f5a892c60e91e951da2d9eaa7900a7b13501d1cf27b2d1c466ea967ab04a2f257d16ac43ea130f2c560fd54cd084370d7e88fcf204d66a20c7424ad5f2ba007ceb6826c21235adb51f85c4faefc0173151689aff883f9fc31ebd2fc5efeaf5db4267ec83ab80804cce1933a13013228f6e217e8add79db589b570001998ce85673a1998780be7ae8642db5330d4db58999ab142a6bc91200b09f6533bbc9b41bd3a230a5e1821809eb77613847347d7fe52446c639a37c5ca44d5cd8f18bcc24db7249dda7d488655f41cb688fb541e4599ed1878f93dbe858c9e017594eabedab8989e85c30b106e40cff524b1f43c6373c261e5587f7cc7370a8aa8245e19b173bb8be31c12d0a65adf5517c968484e347ab10e0eb51a0ac5e9a2e082d37f874daaf40fedd4833ca334cea0eb1868763eadd0eae8aa2c4a34b0ae6e871252291585d7e2ef11d3e0aef58447b2bf3117981db2292e1df34a159e631575f4942585d8c0df4bae8f90de0725e07dfbee3ce33b7ea5a81d93d64afc5e9276a846bda1ee44e176871aea1fc3ccdfdf9a0902f469330c3fda8bc3e1835464127c5f6c3ea597b8a9d4a86cee83a3f6741117893a3a9742e9b54b72f7f017979134640735672ad5cf68e05ab3935fcd7f4a68478531d53684857e80c2738a5e9a91cdc725252a30f04b03bedc69eae2da6887dfd38eab537ce2f01b1ed68a28ec61365df5de976970983e55c4a9bbaf0a06f371f691a8f0e76c7ba4f8ac82889cd262a7baf6a753598b15999466957799af6b86d6c6976662c3648623aa3ea4061baf5ae3e6b3022367405f8a773c5789f3b38e459bec2b8d4c78dfa11d9dbb642c824905e3f88817adc48c4468b18a67671550bf9adb1c4cfc55c282c12ed9b09e4af2083e81e91a4959eb746c5019b087690eb7bd6b05ee9cb3c928da52121245de083cc8fe66823ed3d89d9fa11d7923d7fa6ea4a182a79367bf2fe279370d7453c2a0d24663d5f8eba74afa994656e50909cba6a11bde747773d4541043fa0c7c159702d5d65c16b1fd0eb5b73fa717676958971b102610d779d4ecea07eadd23cb8f11e00ae78bfb323c565cdf14640931e30ee67c4368c1ab7eaef3a3865d8c303066d9882b3241554fffd70a3553023b39638bdd881fc55cca09ea55736c518d4dfd519bc9f018d290348835f06eea85984fba211a6a4b11134f4117d0e848f44afbc675e6af1cdda3dac026adb973a49d379380744767f1d4369001e5d68e39c962b4d4d67025c5eaca270d7879f0b4245f5029f28523e0dc628c7f03da68ba20fab0468a1d2c386206cf8b9724bfffffa11274e9d5daf0589c42ae187f46861241e43b83f524a051bd94c585cff5716ab637291e910c5a28735643a52b56b6cb9431bd104a360f164aa9f4434f54b444df935a7fe3af1e13b22e42d801b48167a3ca76c205901eb86927d51ca1212e0a648b074c9682fbf74a9d169d565071d66423aead2a339176875f98c5bd85abb4b9773ced3419ab11ec3e2cfb40b97f6e35b76a29bcdda27099a8df880b1150b0e361e82a2669379033fbff953bfd6963243308b788dd010a0b132b54c93e424d1dad11a3645a86fe3ff1beb5c197a23416bf173ad14ed848712f78782ea43e63ed89ee05e6b110497c6415bba43afda65d8ebcdb309af509ede742ec0d3330a068eaf2023192f02dc3f44b7d3e290156d3910481f112a3f9b6ca4017881633d34d6a13ca35d812f1700bfcccf2f2e21a6fc31d2e88c26a6d9b9bf44207197fca3c34fae97f1a662d0d7f0c4efd298c330ce2c77c248904178df04694c3a930b91a8367fab83f27f9028a87772417b4c6259c4a09534793b12cb1f71fd9c35b9c606e1e6971c997fe6515a7d37ac75c3847fc8f88d8f50ac6ce228283264c9273455f420f201ddb6e408f2d475f710e7cddfa84088430e0c83ba3ad4bbaf3db17a0b02c4f6f91dcdc9f67a4f40cb7e64ba646dc6de0297bcd01b8512301046fe2258d882618ff39c8ef3a73f5cb8ffb002322d528b7c48a563391c5a91fbfa9aeb881f953673cab3eb69bd66496fc194ac6963d5e40715c07813aeba28080aae1989076424e028984d07eb70ba2bcd1b3ac71a07176ec03f2097c4f11833af49e87ac39419ab4db4aa1bd74095901b3bf22f20f914bef8230769eb0c2be2870b0a0a4625dfc7623e246aa5a821586eb8d390a2c2a99f7147456b3729a468ef435e6a405a948e41889022f9ad7dd1a0f498183d825d3348d9150f9a0ee3eee5831909522cef64c26eba4db4cef52e2290b03b65a6f0d685732d482aea397e5a58121fbebfea84ae7551f932b9d95f0cd18f28b8714047a20870de5dafef6aefe265d31bc7119456aa1cf76bdfd6b2da47da0847554ceecc3030a6c33b5997528e4fe7c9036780cc754cdb3b52e5a86fa9135d61f0940ee36db9c9d665e0893ddcfe71d03d3f0b7d1109ef9ddeee35c7cd58f83fc1f882acc38a99aa90a8e163c779f1cb938eb8eff2a7075df85825d28d768f66eb87cf6937a86a1babb5ea021d269775edc4fd3a5f8fd928d2decf81de734bff9ce5e5ed2a7dace1b698e2038a9b182ab947a7f147032bcf6fbb4f378be307a235167d9d46054a944c4f550a13b689b2ea3c60aaad88559f682c336fd11c70764609624da5abea892c1954a07d3a4c5121f2c8e95131eda5726af65e83410f544dc550ad2b2d70226c56b1e31af684533ce63267a067b03a5fa9a883d524ede9f098c2c5fea28ced50b81349c8b1b775cb7baea4f2880f6a2597ec912b3b9a8956ee96713866a23183f33ec0373049d4afbb78ead371e14f13640f285c837dd68b3c59b370031ac462dacf62c8c697ce1b426ddd2e7189018bfd68f8fc2ca91817906249abc98e745a41638e10ca4b0336767465c56932b4f6e401c80f3bb90f3c87b6b6cf0be098c19591eb09ae2dd5a27080b4b8471d4f7d7414767d5f87de5285061c8603990f85cdce0f51b08c1ed412eddc06a5280d039bae723e730a5d2a305be9661224d3073d7fd081cee19a4299979cb8b0e0e628788fd865d1141438349929dff5f1012a2384907b32180e20e5c4d4d08dbf4b53c7db27f7823b92f66fae137c38093ef536db7caf7a693bfa85e70cd0eca1ed54583e92c7dfeabeb24cb86a8a9b15e755897bbf4f4ab2a5ea728c759d7bc981f32ea74c343583f9f033190758343afd1d42cb03a29728ebf210faa338463232298361d9fa35c7d13357de3de897f241376a9fd90efca06201298930f577b1c2197db9444e83b9ade5f202183de8a9bbdfa75e5b8777a682e2b3d4cb1f141aadc6562fdc1da148567a5615be6950b19cf8cefa69b5f53a3cf5b38e5c83b537a81211919366f4cac28d94412d1fcd81592d72196ff8e460adc6a2681a46f9e208b256c7fad159ac9943e74fd2b27a6a46c8ac6d316cb82079b8f9a4ca5ab4151da9539b332d423bb25d8e08eff1b37250f0f498adbd572619b78299a253b088f3e5a88b77050062c10ad1decae70ed0285e09f4308a01ad4aced9f61a53d17be70f792b6ad475d535487a5be8284ff5c39951687d0411ab96bfb8e073c875ea45d904673894b7602de62109dc33b7960471cf6da48e100613b515011222f8e598d01c21d2d7191dee29a7011627d378cdab2a94e7fdb4e71324f498cb0bbf3f0370949f0ed09a465a62f4f64f767d88543cca617adc8a4e874c586afbe9348b5951e0a8cf84bda5d5e920dedd6658b2f2fb3a2d776cd070e740f58dc94e8b196853ec21edd113d8b19d966ae0b49bb0a1a95a6f2067773a40dd3656f183f31681567326804ac809ad797c57c8d9bcef327aa297c9d72a308a7ff608a1dc35e6c2938df38d8d3db4b5fb16ea773a601b86c8eb425a87a0342ae111defa84a0a0fde144355eecfa7323b7e71cc353004eae3f48ff01bd90419c04c99e2217a1803d1933a6a71114d451aea169a08b8fd2c5f462a2a8512e5513b28f348381fa1f0fa731e6227221d24853d7d0431af2550f228902cac41237f5195bf50ec6a063d6bc5c8476b302a042d74b812d4b316d95f582dba8697b009e4f12ec231f35948856d609cd21c2923e7c6c41b8eccda152f5936119cc956669746a714fbe1d0261b73cb6ec27470d19e62993f3cb90479430d41b6c48da15a4976981ea4c6ac9a4ee990e74457f837f182140d127be12bab170f4e48204df8c36798acadb4b0dbc841a3f1c0923ab831479da02b9ba70bc6e83b45a785e6e4352858fb54c462d5c2f5a27a11a466fed93822a2af09bb7e0246b6fff73179354f231b039a224853d22cc520189364c1e2b67b149149fb94d28b66b5e6e04513271532bc9be8ce92a6446b89dfcc71c9ed328d188af2a531e18efd9aa28e8c92001639d53792163c96a0a125ca822a7d563100a302cdbf6551b1070aff09b91dcadf57c02f1f50ce88517412d4e06c4b4470d1cda4ad539ca7c0cefb7fb178df9056464285b2cf75bbf3894068fca9d17e2cbbb47941efad78832a31fa6476afddbcfd5dce1587d60b1297e49068304baebbc60fe8a8dc6f33af8c6ee5e764b3a13e3ce71715c1a23452e82346ce0219263fd1f43103f8b34cfe29debc2bdcd31330cdafdebb852a31e4c0d0019e6e05e36ef255ca65eeef9f0878090019727db1e9570304c109870d9b18e92c79ac16d1defb87edd95789167ae10522d2bdce3accb115ded55c96a0be802ead0492a7bf8346a4fa116e56725a1b9d216f8ed3db0e6fac942894b6cf13bbc493e157def8770f197e3eda5de62afbaac6b9c605fa188aed34240f6c3b9fee357c384aa0d00ac4ed4ba3865f608eaf283d5ddfe500e28f04085f748d669a64abd8f0ba0b2295f17d7f7e0d2ad8a894e45322b636f283d8c1f0c7f21be6905e5124ca5b5b91abaff7a485e533eef37c47eaddbbfad1c1de7a2fdfcb3bd47d538f6cd9707999c9a129be54a9ca062453f403ce1893671408ac4747ed5767f7c2ad3c476482732d927e65a8f959d2a3a8f7dd26111ac212af1f7e0d7b3165504ef6320310e6f822d10d72252d5676e9f75a439c8017c4a78b394d85f1ddbf15fcf8cc7433162806c2ee48812123f090a8d1d831db465c69e1a4cfd15417c65df6668004f0e892d685406d9187be9ccad45ab218c5c5320f0153a36a25e463d55ce82055e2ca70208d40643a0475621c1215388b4f2d29d88a93d7a6a1128e0c98223a8161e1f4a936ce9fdf13131694d33fb0b86f7ecd224e0ab9c7fb8b450102bb0d8dec9f9317c4afd1607cb4fa4162e72ccd868303a6a6778548d2217a4a43dca935a45d310d05b863cdd475a148821b568a76bf2861b7d9cf92b6a6f1d23ac125993dccbbe119c7fc821ad84cbf9bd57386cf7ae49ff97e6a741bcb5564409f8a89540d5451068e3e2c93997dab8c150b78e80b3e5f48ba4810a02c6d661342a70b1e53dd56caba6523b515e2c3193a9f72d2843d2cc26226385a6cfdd65f0768bbf0dd1bfc7db16b56a83761979bb852dd6a1b14cde6d51426b682e23ef5b30ab84991741702b80d579dadb648d53d72b328f4d228ed19649da107be1ad17d3fdf181af095f7d41f07005ed01423efe0379c088d493824680e09f1364f66dd08e89706f6cf1460dae0bd863025de417a48872d16786e8014f0516c6c9ef0093e101e60d1aee21bb16de53ba5ebfcfca9e450df4cf1657ed50d9262a2e875e0e8138ae0b6a969febfe487810d6a758ede6b4ddf262828f57908e230795e7055157b34d408ef1af9b1881450005b7f12799bc487cc0408201e408e57516425d3fe057a2d650190e9e964e7b03d31c8c706904ed297a79c08c46659165305b9e1f3effc9fa171fb0a7313652630c06cb9a775166c067ccc79370b627452bd4f669b90786eee4ebc0c1072b87acb20a14bab70d2a6dfa3ddcfa2e9dc9f016c746133b06e8f7a04c64d807961490e51f4de8a1aa228a31196f27f4ad3392495fc18538d00021c412749fd724d61a6f1c63332ea8651ce8e085bed6850dedff8643bea03864d376565856b6b815ceffee3e1e90ffaa81aad988922e8b5b5fcef4ec39b4148592126cae194b66c27edd421946a614ac9482a08eddf2399ac610430c902192002741cc33f5491770fef460aa971815d5e4ea706213aec1591ca89e9f694729ed600d300fccba63dee126b69543ae57f9962e3645502cb6808ebf36d495001a4c7824b8db67115aa3647c4ffa2a57753f443a0d604437bca7def36849c85b5a1b2deac569dd83a3b0e2c66e32fcfd0453f19ddfef417b1a298fe82293dbf8f1923e6007e9a02f113cd11cc7a2218493dbe509c8c7a715a16f012822bb82429f3061b98d57a07e3268f413ea21e5d99b4fe812fed56d89b041d92e420efec1bbef51cdc1321a1de1b4ce29aa1ed64822d52320e0a4318079ddf74230f929db67e39b29287131ef256dc4d600ddf9e6bb5907ed4bac1478374bef38907970b9a8a57f85daa3a7c9e6d330613405a5bf87608ef744c8a7c0ca83035607c6fd1c50df41d35c1d3c40ab01bb14c3012065e9feb86b8c74873fecaffbd7092f85f5e5c57e1cde2b72a60dede0227da67f62ab9d0045b3a3d01281e6f09856066a59a3353d371ce52a45a1a4890244cde40096d26f933d38004c5df5b7e25fa11b8dddc4a30187b18ea2a6ca84d34cf61ff5ec60668111581534c633f08b8f37fa16faf56428eb6259556fb582b456c5be7506ce5a3d19ec43f6cc5697e419304da8bdfa372daf8fcc0089f421d5ffc0681c1fc37718de9081ff5f3204b34bc3e84aad09f7fa759bd9c0d29037c99560b9a307710a8a29b251a53e62a417157c9c71c0c1d468cca51d03b9f51c5763bcb05e2e52f19372814a33f43da085d85cd7ea4abde2357e5d5a614e32484a1d497353bd2b8dfcb3653a9633d87648660bd10409d33eb27b6e51adb2b8d459805dc74daff73431062f4b056efcde442bfc159ba713e5e6ec848112bd8453d1f57b6422e7844dfb9eb9ee4032317795eb0e9251a13dabc55c80d370c48bea8088d31f68136bc7e1ddbc21f5e2dccea4898267ecae494da99762c3deb384824294b4f8d9ba7bdf17f5d619bd3add91879e60aececdd2da236491cd84e55ddea3b01d3ecce9e06ca793c3383cf163bd533fb890f8abed9a51d3bad1cc9699fd23487bb84caf4c888510e5f1232d790568839a976cce9695d29e86480e60e9f98ca2e7eac26855a179978fbb5cf9d35c09d89f5a6597c1535b801f1dd83667784a1a5b271743419a3ea8fe7a89bb6e1d8693ca1750d3474c77f1756d3baa819560204783b10c951b0a0d2ad6db23bb5809897879bd2e1798d806971d3d1c61a94effb7736ad7bf1fe1168d32a08216d1be6d9e184b51079b1a5ac70c68dc42104869bdc0e416137da1e88eb8055893955aab9fa0d364b855ab6352d6a2b56a54369c303100ebd30c5e0a028abeed97dc501498b34e5b24ce0249995a32c9dacda26a2d225d06bf62a10cf67763ce3767213e59fe39ddc168b22bb046ccf2de7aa668868aa81fd484c546097e12a4c4c70907dbec9599b08e1d9062a53898883aeedd7a98b8f248f055f9ffe45a43de8d0d236c89c19a054211121c260e47b32bbf085a5fe7afc5fef6146f8e71d22f376993604824baf867ddbe2c1dd491fa5f41b49736227031f9bad0caf6f15c3613a0e938eb4a15b9469ecc02c549c2b7908a95959af747a6d725bfbc605788184358c4243cd16245205586359970e9175e5179c3d077d52a7b8581729e0f7d17b7cf193591ae27ef3bbb1517fde9df1ce5543431123a7a45fdf2273b6ab44ce076ffd4ced7f8661a886d45f7afa32be6401b1e9c0e68d8d5174191126cc89d415fb7ccb6a8764e7ad21b52e09511afdbfd064750a86de6f16899dbe80a630d2c2b21749204726c68dd1d1a264a8ff9887f42a0cbf6e798b3f831b2520bafab3e514452fc99a12883addf3f06a30f574a8204016da12fd00fb524ec79ab247f9ddd857fd41bb62a52e15a85a552303f237c065af18d9299de9d34f8ccef424e667a86cb5d26e54068ce60057935041d37ef90279d8e77db9df238923d465ec9a451d4ad49c94d34b5d1af52132cd2879c86b6e0e09d88fdd4c79b983a7e3f1dc0c1bde04551a3a0431aa401ef23dc6923902f87880dad4aa23dc399b735c5a2863f92d8e69d9b4a883b27931221111cb0f8e28f1c9cc08baa1042d406010aa894399a829327f94bb9d98d1a420ea7f812453cb1086a0dde1e60349ecfea9b8ce464125a4c5a2f2b3f5fae54ea2def977477ae7243a5a3c1afb73608bb4b64607d14ff50a059048660d53ec71d55f072aba0b830999048b057f8954a76e46eb4a1fb01629185eca4bd7ea4c4da27cda8a786c6a7745d28c732164981e8fc8b49d9fc41d244ae594ddc6e828bddbd6ec452ebfa72ea25def11e02dd39ab30614a72954b298e1143bf409f9b3952253b51d242a786fbe655fafee859a783c1491f22eb4798579129390d7aa5e51b861c467c19a62bb1086b44ed4798618aceace778bac4921b7d81041bb386aebd5c8bdf2bf163aaf4566278f0f17a6b276c0ccf355ff130e0ffd58da2adada8b65c36bf529d2cdaca694b798dbddb2b42e8fd6f8eb4179747b55db8e841e78f3fa309beb4cf5bc21d23d35ff2c3ce498b46854c40fe60ed3e2526e7642659e33f8db99c91b027f46d76bd14a327efabd85ca9b8c230f0f381000ae12c7bd02b6a0437d85cc7285ef0b49f17a4cf0eb735ac8f32b846944e3c91f947528d6e8651be710c6743587c25ef141092798b32cb5425730cb944c2cbcfb98bca1b1133486e205cc5d53a20d27fc59ddf9de35ceb405a8485508c624650e059e3bf40bae7e85e570ef5da31bdac6cd3a9fa64f117fbce10abd343ef777f58b2c7cadfc673f5ca79d597e2afe3d222b2ccf31e0b34fe67e6ddf8f517ef22870fed5a915874a342d498d548cbee214c7a037d90c3de8300e49c62b3500b049354f0f3c3bfe561dbb68fb0d8d548495a28b41fae62cc153aa194046dbec7806e1156dd7893aae5aef4a5c9be3baa29da92fffea35869d5c7ed8665a1748bc2721ed9860e65e32d63df71482eab890b4ea8e5950011395829faf2449e66d66c2bf166501544aa8659c317d6b9ab137e202ba0f5088554a4f36bd576282eab261ece086ca3221459138e492e42412fdd72417af58a65ba479bc5acc5bd1a929254ed9164b43b80259037c4e2f9182e3aadc959428f6e2ca0081da2f4054b5d44ba784c06190e81170367788166092957c4e647ff4f981638e5ae11410498b11d2ac0e0c2206112b81dfebe057f79e0b80d9544e6285492b3640d80d1b533a71aa0e11c6c2922cf59005bfcb0c0e667b255d9aa31a3d8c8f9ef612d13213c9616e0c67f5f7d25aa13efe8f97a652c86129978d1e3ce6d7b0b9ea2087098d1dc8dc0e02f3a7c5cfff8578eaea64f754e61df41bf774e44721580858a74b45cdc6c262d31078396401efd00d2d66608e59d245db467c8fcfc8761ebe238cf998f312319e2ff9f3d575c7e22100ecff7304a1ab5979232d06d015d5906b1e82dad6fcc7dcbe66e4d0fce011d81a766b700605e014fc38140f5d4060f9458fe618503509006ff174073a43c0e853cfd24f99c2b8a5e5a7a8dd26e481088790e135235d029b952c62c040b23b7ff709d4112bc52c94f9652a38b51515852bb24b386a8277b05915a90bf1e0370e873c4a2a02d218e8e0b94b9879ef06905a3a34d0c6dc4ccd549446ba11acf9c1008087ddcee77926d8c048a146fd12ed2b770b494d4f02d384928caca3569725ba305965adde2b4b011f74ffd4248c1ad411ff53ade707ea707b70861a94717d13e7863e6533ff67deb462c91340f6390f29c1db16edd386183064cd9ee5100252252a7d300dca921181b2b7cb059efee3a128e21706847c496155cc2aa7e16ef3d621825dd1e6e37bba2518d846dc18d01f8996565f622519bf2074c0c388e08628e81e8b33f81a4a17d5a3cea374dda3b4707f15c4115734f38adac72d9af245d8af7081faeda8bb0b3086b8487243941b9741c00366bf85203b027b1063ac55946642c9209f1149602ef2b815d044c90050e6a85eb11561058aa4c3a74016796193ab7fe616ff8f5f757ff0ccbf5c765a54221db0636feade2fa9212b4a564dd526e514b4248da9bc84725d8b208e308b55fc72d0922c24314828611fb1c61d45627c05ae4de6e018408d93b051f11bb10a611b5b446b17fc2b93e05692c56e27991bc5e51362cf1d0eb15e585a20dda8269d5fb57eb31eae15311d350b4446a39fc1998290d437972df862576f2c47f161564a5bb9d3cf16ecadaec19975188829a74fbcff2fdb03e14edeb509450ac892ca7ac55b2335a952d12c509023d0048aabb39850ca1250408429ce8aef653362cf1749c8ff6f5bbf19f65212904d941772be956102dddfd4a633a5d2d46c1276d5842d1ac28665c698e284eda14f83310539a6e05290ae202d206101a0079019030802400c80dddbd23e430743c3c3c393c3d4ec3278a13fcfca9689e54f47ee831ebaed3e1dcf8677a695e74e45f9b5ca7c3e1fc1bbeeb74383d374dae3324e430741e9437621af5656b9f3e17c5094ec7b59f721b9638d79fe59268284cba2f24f4a5943f029f09beff758a4338592c6f84c06782bd2121f09978d956efda9837858f327e190d314871a537573d994b72862752b6f67a9f67c650787c42283e3f4e24a87452f561f539c050d3ebf57a8d6055502924880f52983482523d560475aba74cea564f4e164b9cafd7c26e3cd38ca3ba4a5443b77878449ce9f8b45a5a295197a9877f6db5331a9eb39c6ef1a4b0e3811db1a13cf13c777c7428e8a874974bebe1b59e239265e89366ea39f7a9beca2a9db3aba1f3a10386ad987ede4fcdfcf92cd3a9996be124ea964e4c4749ce1072b43494279e9313d26ac9f26136e778ce9df86d9803e628e5e4e4fa38ba9533030d3f5a30979316b34868480287f5a15a340069284f727eb8f1430a284f3c630b7a8e93271dc625266dc61e7ec65f4af9fb4d7ec4ece816ce173851e0283594277e9444fbeab7b4323a5aeb78d2a6877396a45b373118d2ad1b296ea27cb8d1509e78d51c3d479c6506a7e764b1c4e1e79785a5dfcff3afcc31edbae5e38aeece47141f26743511cfd90a6660c00c524e9e74a34fbfd6419ae76873392b0bdd9a210619c668284f6495d626e94e9e7438df084a85f5a13e97558acbfa39666feabc4f73fc9fa4bb57e8960c52c890bba13cc999e13973274fc879b3d739d2298250323cf9744b069f31a020062a31dc74f7e13c7ef29c30c9736ebebf659ed3659552cd99d732568633191d897ca2388d3e9fb5f41af4e8160c1d8041cc79519ca4e784d49d3ce94471823ea930adf3061860d87a3ca087548f189b0a74f7926ed97cdd0de58987d4739c3ce9c20fdf5a99d744d884d94b3aa6f5a9eee73aeb7d2a2b737196752e79173e49da1bd64418c5d892feb38c4b7b5f566788934bfb23cd36fbb5f492e1fc3bbd52bfa965548769a573fcb026e2d252aabfa4d7608ec12992f7e9e712e68fbd76bf94e2e167f0c9976ed9d4e06a7477cc7a6dd21cd31c3c69e15fdad32dbfa2bbbbfa0ff3a79a33c7515ee5dedddd8fc54a183849ec31eb53e0147d6272ceee3b7957a9e3d8db7d476ffc4b8ca9c593e67f77baf5c2190fd6bf1ffbbbd4ad17b2747787a7087ee836cfc03a75fe1a75b78f6ebdf075773f8b348683ba175ab93e16ea960b5d74be4f55e9f7f174cb852c1d9e1adddaec78ce94bae542d0b5311aa3b97e48bdbad02d175add9dacd26b634ddd8dd4ad16b6e8c2cf7fc92faa05265a40ea70c29f65fc97ac7a7f58a69dacfb9bfa5454d642eb2b1defe70ffd61d847148f2dbabb3b5c4ec773e6b570fe15a767ea0f568a9d3aa65ea45b3caa6a6963feb09967582d89ff5e0bfa1375b753b7787857ad0d31a5790d4714e78d579af56cebfd4a63a18bee6e0ab422be8f4b17459af1c5e5041fe6e1675beb04a7402bd6d27f16c5025597ff47cfb65e9b27cdb4867492e18d12aab2454343a2388d9e5eaf21198d556b846b508ea74709098da0141da9d2d010ce8dd0084a0d8da09450931194f2f929878886946816cba5f0990855d9a28c3f5441062a64e970a66eb38775d29f659ba730d10e2bbabba95b3b7468756b07530a6e74f797e20f31acc45e13f39dfe349b1dbfacce19b86424e5b53aef94fd755c7aedbeac5ad16dfd4b4b29ff944200ba5b48b752b84147b75228eaeea76ea1a04677385f4b9225f6cf75baf061f482f8439755fa30c73466ef2ce709d25a8ea305fd61778a25e853146dfee9160a3014604ef8c1094e9c4034d3ad13804c300348b74cd8d2dd5da61eb3fee3478b7f10a996da5c13f1a4d57e645b7f387e1b3aa633b18c61fc20586227f21792a826a6eec339566b6bf83f35f3387d2c475a35c79f658c5fa4b35ced6772fc9ca7e34cbdd2877d5573b44c5d4d1427cd779235b15abfd66be2e717c9d1821e82fec9f0f8f9fd59fe19cd6535acd4c3ffb03ed57b25ea3cc773c459a73f92eebea15b259c20a65b2584a004b2841d78cec05b924b465239b53a3d463d47e7b31dffea7453985ecff3615e9ba328529a576b7f963da7ce59a6d78e1e4bf2cefbfcdad84c56dafa6eb393a5e7e4e816094274f7ec16093732748b84956b4b7f588a60a598d218cdb6faf4f04edab5b19895d1bf4f65b1ff2cdf8fe13a6f5477c374cbd5d3dd50dd6ac9a0bbbd5bad0d74f754b75a50ad5777c3baa5630c1d3f7437d82d1d2f74b70dddcaa1821c5474b754b77238757754b770b871d42d1c58745e9be40ca4339a759b2b7de974feb0da5cf2ee3f56b3d9c3c7a5d7c0faf796a0ff2c8f9fa9677c69ac3ecc6d769dcee7274c02893eafd363d689fcf5d5eea4208d7d7dd8e73add4d8f94cdee61fd0f07a7eb6e9c3c27d7bfd3e9c647eaf387794d142748c95a7651a44dbc9be5aacfd51ef9ebcbf8c3cf75ba2523a912fcaaf7b04edabc61cc9213fcaf8ea7d79f9a5914674ef8b52c67d9c39052d94b62eaf83fe6d7c63cd3918ade7de367ea79ffb12f66fdda0c3e957ff8a3fee11c1d53ff90e26a3dd71f6b93f4ff245da57366b3fb686fcc717e8ca7ff68b1e76bc9173faabb99ba85e34877abd02d1c3e5a387c74b74eb76adae86e26ddaa91a2bb7b1136310ddde66b3d4756a958ced887feb3287f7dde0856790fabcdf1739d2e5bfbe40ff38ccb257f7d95cae8b59feb7438a563ea997c109c5e275869c61ffaccf5c1bf9eb11dfd67d963d46799d23cfcd082f5f39ce59fe51baf96e2fb54be6424e51f9bd8a7e787e26638a5eef6ba550343e729a354f34b7152f9f7d5327d3ebd5aff706ec87969b57cbdaaa5996cfa3c7c519ce0068ba17d755952a53ec9c9293254c471aa427a9363aff47ae5998c3edda61c7b2577f7fa6407af0aa9f7b2f0bd2970deec40e0c2032e14b8526428f6a20b1045843cd7d2824e83d717bd3c93d1eb85a25d55a144b398bc889171e8458a38ce4d7db1032f5ee2f1a117ba592828a15b3155f487b67a2d93e377f78f6ec55475fbeb430bfa8bb03903e7df5a7af8f7737d7f89b3decf951211801ed789898fbd48119f752f0b7f4a773be9164c168d6ff7a1ad3bff37c37670b534832f8a16dcf989853e4133d603e4f33383c4603d41c02140427a80fc00f9c07ac009c680262c28c6c33377c08ccbbb8343549211911391910b795548fd15be4867ec3ec6b3fbf512e7782d53f8599c483fd25ccbeb91b06bef45f26219daa59785f416855f694da2b5304f56e92d432fa493f4fe635ed824cf64f4695eae4fe25abedcee8e597b9d70381fe9f5fa6b412fdb704e8996f448583824043e93a1a052087c263e3fa50b026cac26cd3b9d70a57306ce3b498f84e1703e92cf4f592dcd145bd2fb7c2d39522f577d9de18914cecff88bbc8c1f36c31369dee934c373e685f3674c53a0158beec3c6b27a53a015615e9e2c21669e475fa7d2e799a18e7ebc34562d889f96d4ea5cb2362aa4e2a4aa49e18bf3a9f64ac08ff24f24ac26e1af530987b5b4b05c36e579bfbe8c8a3ef8374fb19697aca517fe7d2a2a7ee8653c454f9cd9e65ac61f8ad6abd4c3237e7a737def7e6d8a7fbdf0c33b697f6b19d6af54f6b02c96f89f66609e24a6474c2f9b18ffd283d5d630e9eb540aa9f7758a1fda2559a579de279b408a6751779bd0dd1de8ee26dde2bcf1ed429196309eeea7f3d1b1b14a755e9c20def9f109027f082c1c32c44708087e8fce68c10e56ce3295d56ec654f677c7caee0477c4095a71e7e27227fc2aa3184fcfb6fa2c4fa7fbe17ca44ab375aa2e9981798e982e656b9f5e36afcd5043e19324bd19bf463c6942dd8da33b2668334aa15b9bd7dd27746bd3d2dd998a24f62fcfafbbb76e6d45dd8d42b7b69cee26a15b1b55d58795ba38a9ecf8b708be5d68c71df0a9701cd31baf2fba903fcc43b1b433ec38dd2dd3cd85ddbda35b1b0bdf2e8f31aeafbdf7bd4e0fbfde32fff56a699eb9fef8223952cf74deecb24a739ee3b5319fdc4b77f3e8565775b7ab5b9d4477d3ac18bb4f65bd962938c909e2db814fe5d1e6dd012fde01ad28ce9dda9d1746c5ee7659b1ba9b3372450515a8400d32296c5105ce05bca0e214830d44c5be0092831a11c98dcd0d82c02881d6b5c1041a4ca21052c804f5c079a2078c125418a25b91f828062351b000400131298871c11834bd85152b44bd8a9101169ade1183c386739a6d2bc2518507ce637a5829aaa97119981996cfe0b0e1aeb0bcc6379b2a32be713238bc072b364118295af98ccd152c5bd1ca833052c462390e8f5af9b615d1d8e0c0e133348e652b9ab952734317c95ca9711cbed95499f14da647152ba2667cf32a34ce15cdd0d8e06021098cbf4cc1f498a2c6f94b8f296a2b371283c3a68b686caed0788ccd151c1e8417cdf886a38795d5952a3cac7ca68795d5152c5e84c3573872c06153858795d3f4b0b272ee061c512be7b8191b2c5bd18ccbd860d98a649cc6e64a10468a661ccb5644e3343537b01c87e7b0ba22d3a487221c3daa7895991a9b2a34453336415821c5088f0db4a4f41b442f3da6a6a8713e458de52c5fb17003cb398f5a39711e63e3c4f2c6e1e42bee0503459b0d162cac2b58583d8288590151a1c203e72be761739653b182ca152c5ee4e2417891155132eee23cc4f88c770f2a4178914b0f2a3cbcf84c0f2c5eb472991e3cc4f47071981e3cbc6ceed263e5ed3cbc6c9586c71631cd830b1e1d68ad705c9c07095a2c77a12917671d5929a16916c739c7ead75601168bc5f26ddbb6a92d4a8c6f3da4d05089b2b90d3dbc388b0a15e72e79e52e7e64e5b272a162430f4431de63ca65caa587142a44323da6629c731767f55845e17c83b1998a61b156ab156bc562b158ab55fb8643890ece9b1a40d32bce8686c6a55d7adcccf2971e549cbfb80bcb46ca0ea229ae4713cdf490420569238a91b22292e91185e55b0f295488605e7ce52b9ba9f656a283888bd9382d6878788086660b620be20a162ba418d93c08560f2ba418215a796fd14407912c449268972692858812449870f9808dcb16ab2cadb37917dccde62ccca0b5f90a2e60ac805cb66c588cd136ed2bcec6250bae3dcb4a082ee8a2055910b9f8102c323e44c6dbb96e98971887e9215886bcc86c1ccc8ac5c2a2755828a3c539162e58ac805cb07038eded1d0334c60a68f3e6baddc5379724b81b9722b830a18c13ca78a2070c8c14ad8d68f55246bf24b125892438212e2b226c65b0ca681c10614b194f74d14347190c68456975d105e73a6630d345129c239d80861adca6650b0556442e3da250178fe9118524e266449caf10654a19445c8f282b24ee66731e0a6845d99ce06eaab89b242bee66732a4a339bb7cc8b96558c6fbe51605b697191a122251585068c1930886468bc20da1cc666052425a74d4a017dc3b98b102d64d3c2dd60a971ce8589178e63712c560f169410713d58e0bc0722e768ba00434b8bf318b81b1a3056389bd3d86c2eb502a229638543e3456f0aa02901d1e6db1944db16345db4cec6c51003d1c6e389d68c1aadb3398f245a9b4779d982686bee460d196e86091dcd7571e4c505c625c645c6a5cac54547100f05040955c9b4609a8d9766a35faa78d9b2e5654b172f55341a31dd458c90cb4bcccb964dcbf6c2da02f3b2650b11c769e15a672ca015c59585e31c05265e62666ab6319aeb112566d58ae9f1d223ca0b515e7065198388f323abcd9585a68c1e2830d13a1c0f0270393131313131354374d1822aba6841132d28e2841bd70e2bdc4d538c8c095b092ee7fc08091ea5b7206ab55e8eac5aadf626c9f4290352b4d2a44ca03240764375f7d82d0c08a1bb65646466b0131f6dc6a5918c8ccc0c0610d07d345bbfafc76970fce9d07c0a9c30c79836c19e1f0abf08d6309351246ba3c20f8942b129fc9fb824dde2f09fa4420319e84b234b0feb7bf6515eb2372a909266782279e3e7a4dacd158905bc689f9f10dfeebe3782559e0536264c846fb773adce0856ed8c60d54e50104c08181bb203030261130603d203ce9f9e190ec1afd7b5155052019ef65758e994e7f8ebb5c4c847f59b88020bbafbe5794c4d49504f489878486a207a6a8a82f2bc1709ba1b4ab720800309cc98b6b4a0f1f7f99da40e3982553b78076f29c016da16215b76babf8fcabfafc93b9c1f3f7c06523f028b34b41c80069e3782559e53b5f46577ce8c26040c2076c7baa71541687cbbfb99ee7c29e5430f7caafcb8889087746419b18a9a25b4a39b15d4ac9d66d95851035211578146ffb55596e4795a34a78506262045d31a3045f7d88aa057e59f953227ad159bc8cc747f67f822e89e671299992e533c61d3ffcec0fa3117e7a4ea4d8719b6ee6d691b92a3846e1d74b3c001355df5dd1d051195d2197b9a691592d595212727e8d1be6e417a4bc28034ba1b8a7b917c5e9f48407723408b13ddddc4d7dd07e86e03743713ddbd44772bd1dd05e8161555b4a8d042809a01743712dd9da5bb8fe86e01748b8a272d2a9c8ce8ee2258dd44743705ba5b4ab7a6e0628a1ba6c802df6ee75a708a25ba3b866e4d81bbbbc37ffd490b62af147c2acf9b9a4f7bbdc22731f84cc29f9adf84a7a7ebd1019f4a14e758974091239da2511549941f0ae9a1702992b7840a6b19fba75a5924ab34142dd2e72a244f617d10ffd17cd1485629b6a21111395ea4a7fa649311ed99c8f1226570861f3e51131faa1194da4a90428d0ed7272d9df7480239ba5b031668057477956e49d1d38d6f977f077be17fa533708e3a3bf8a968a623bda42833536db54d5e89a09890b6d6577b84896c584285b55712d2b084eaee59b7a2b04177cbc8c8cc7432323233e1679c1d7cedbdaf83773068439d4ae7b86369d761d0863b3b2f4ce63cbb81e2c47f1625232333134516dd8d67eda7bcfcb896362c711445babb3967b94e7a27957fb54651a2388dbaf0a53811afdda74262c312aafb072d5a40e1c4f83969b4b9ce9993e74141797c7c7e68f3294caafab04e9ac5727cbdf0ed6054b4618977763e8cfdc48082767ea610203c3c3306fbfff1010224a6f379de8c6125dec1b9b43b99ca74b494dd6eab03c0091a0cfd38ab900d4ba8a7a7270b5ad036391a41297204a5a0a08c483ac39e0325746d12519c46e2347abd665e2f0b7ad8ab1f8674e651727a247ebd62e2e3211b96d8c76766a8276906878f3dcfc3a5588e2538f47a0d815484954e244964a3c25adaa2d72b06c7d3e72d8984e62de7108ee7f8fc9437deb5516698c434752d2d7fb5e1fe084a651a25d749bbb6d2d1fb3c2fe8553afe38eb8fb37aa38dd5a4b0d2a9fc5320cdf83f86abe688e44558698fc24a953c59cb9e5735c7aa395e4befe79a94b11dbd3cbdaa3986d41bc1aa244f456543d5d29a24043e131f2aa111947abd7ea8c297328695ce999147001749720ea08c6e004c74e10f20684ec773002d2224c6804d1d24aa1a679c298cceec259108eaee30b54c59cec88245775ba62c06c882d4b5bc6e33a561ea4e302bc2c823d4e8aee5c57646fd082cba0b7fca87163c628a94552ad219cd8996ccf09c791f0a8005023842004e0430c4881c18e14538af8c2c7342a24cd26c44018c30d27d7646fb269933966138499abf9cef3fe67dfe1f230aab8555cdb108308ab0d29d08c381dd7858c3a79a339c791355440a446c414415226ebabbef739b3f6c54e9d2e7e18f23f530acb6a8061a7d5db5fe54f345effe6808371ae63550d6ad217618828710637477fe345baf2c7ccf93a8fb5bca66323a93555a6b79318d257538f8c663569c1f5221b47487afcd53142de838374e452fac16e685d413e2060b1bdd58c6c0824537a658b47c89ef3b61a96a2c4e5dc592aa26799d780916cf5f3b4a722cdd798634ac1374dac7dcdaa8009cd1dd0100220048dd1d762b08336ea6efb539e6393305cbf0ef9741f410c477f7772b88eefe3cd2def0fe2cdf3246da1be6d80440140070ea50b433fc7796417b49276dc6ee318baf3ce9d6951fae0475775ed51c3d7204ab3205a94856bd87a395f95359d8f4eec712cfb1562710460021f4830d7e88e287f107a5ee9a7caed3794d1c4129728edff7fac259f4b9ce92911436ea960f32a0ddf2a1f42186eeeebeda043ff4bc9a383547eff1987522efaa95d94bfafd8c67ec3ecd8a4ed4fd0c9c229d5493c456b0e8c63e72a0ac2cb11264a54777c7bad54316fd79ddccf3e8cb2f6ff84a711ef9cb753afa242eb1cd1e8a36c7acf730eb41051e76d0dd4658fc9a4bbb5369e7b46424857f2cf13f0dcdf0449ae1390b1f97d7defb797ab93ee661d6dd9d38cb90523d0f47a6ac5739a3ca960e46b14fa7a52724af4455aababb4b965e89aa7c5d95235dc5715925a6bba99441658beeeec25944a5aafbb3139527b3e8f5029feaf50a33f6486c73387fb6c3cd148a1d4f71c3698a1853ac7447c7d9146f4a4c7777352a3ebf6831cc7a6dd69dac16d4e1d26df6199eb35a4c775745c5b5310be555566aa8f218cd78284cc238333c913ce7867644e5032a045039a1cae98ec8e98889e8a9861aecfb726c5e30fc9a15c90f3de7c13a33aef4c35847e7f3efc3168bf33e957559a5e1e3d2f3c224ea95587079249fd1dd7df9a5143c7396eeeefc61116c8177c04e380973b78bcbc4cddd5d6df2d717e6fa54483a5cdea78a597f7d9febbc70579b9feb745fd37f8ef1245f94d50729d57da8a1212121f0994851a3fbfa53512c858aee4c27cd31953293c233a348229058745fed73ec21f935e9fd758a3603764696985eeb98ce281b6463ba73f74a6b1754b6cebac311679eb11bff6651754727abf4f19c8d63d4603e3dfca5b14a07e73f56a9cd37db1f2d1e837ac4d14d453338bd3cbd90fe7bb1a69ab8a3362546f7ced493a99728178862447777e21c69a5a33f4c3645c7b24ac3520469ace2dcbff1fb39d31156e23c67b9c8bbaf5374eb5856e985554b71cc56d922cfa37d9d791e25bd5ef7c912cf3c432fd34a8786923c274a48c8861ae8166d44add09b190a663fcc8268a51e4beaa8dc5eeb9586759616366760fe98db7c2d084e4c7d7a2d46ef3391794036ca5288b511a322e6f46c74932c6d2dcf99e4b33cdecf5e694d04e7256d2e6ff6896947b3758a7a7e5c5a1cbc76e7cd1476a7d7ea0c61612dc15a9bf3669cad2dfa29fe87eeeef31aac36973afc6399c589f4415d7e4c4335ba3b31dca216155ae97019252ae4117ac60f0b45eb987a14980538c309c33bc33a33d6a9b6e2e92118d4853f858ab0b0521a6ccbf7398c00feb23b45b7366a083fad9a4bafd7d0509250f8d76628fcd4c3f53dfc60b5f7ef8730da7cf2a650ec5159d2ab9ae3ccf3289c8f14ce9fb95b32929a40ba5b32929aaeaf8cb695668f3e2ce8c704c55f5ff6914bbea087f9a89f77d853a3bbddeb4204875eaf2821f09978b4af9e10f845b0961eb3d3698627d250ae3fdaa5d72b8a66ab0e0fd0a1091d8ca00cc103502600050645e7c9184fb8e8befcd8bb2f8675cefcbd6a3fffa9995faf25213dfa3c666fbc67c479d8971f2aaa367dd332ddf897ebdf9fd5a4ef0b2dbdef349623ad74e9abc1fc61e438337e58f651f19c4d7190d64926f97dd21facf63dfc294b55e98f340f0d85499e03e5394c482fbb330f31790e9290d35f324c82c2659967c69ef77f63a3bd319b9fb4dac9164ea884363bf9c9a18ceeee9eac6571569aa4ab167cec42ba958396ee0e07ffe730ebee8e742b07ef70aea55473f6304c47bf3686c3183836df780885c3143848757787b1156f2e2b7559a53947487209a3613ba3f9a411e1c063edab5b5267b414152d4e4c6fce546ad62f96e1cf404ce54452479a866e49c5e0aab9e4e1e3f0c759999a8cd1ddb49d265474d3199326b4d6f94b16fddf9847fb2a5a0bf3685f5faf28266a20800901981ce9ae36c5fb54762c319e9e4b18784b8bb3b577d6746b8903963c59f2438c281fa268885a41a5008a0ba80bc5c213174fe3534e370cee5dc697621ff77139ff4e51d1332e6d709c2f6fbe71f27fca3fd779679993f17cd1f3acfa5cbb4ff58ef3589cb19b1c3c675e1f7bf3456b75ba18252908d575607ecfc139f87eadce1a8cfc4b7e2d6d2d27fce936cabbfbb01c9cef4bfadd38fe3c67197b2fc2a6e735b1da09e6fa3770e0062b3710714ac3890aa72bdd7dd9dafb39a6389ff7e3bcb1efc6738e5f4bfb4a2f692f494ec7f992c4996dd4e73fcb168b531469177e1ed6793f8bd32986a6359a70d0944417da59fe110671ccb3cea9cb607933f65797eba479696bfe23cd320c1902c5c984620a82e9bb1ba85b4c1d0b96ac2c2d2dad94b6282540298bd291d20b4a4480a45b4a7e50c2440909368411a45b3638d1dd8d45476e6beddaf147afd475ba29cfb6babb38c3707acdf9f0fc714e5d4bf3efa9a8383df27fcafbc25a8a33e3f2e8be4c466fc6612d63fee4d1be7ad5be5eb467aa4dee2e8a34f630a721761df7ae9669954f5c9b34f1f3ea04bdbf25aeffb98efbeba92bbdaa8a38fc99935ca77b2897792ec94aef9336479c20cdf4829e6dc5b9fe58caee3c729deeda0cceef1327cd9566451fddfdfe6f92cffffb1bf3909652a868c3cc06a1eea29a9a9ebc0683d569d43d089bb0254fb85a3cff4e8156e9ffc6c2fb1fab3fc5de9807623a3e58a7388beed358d253ddc7ff14d22124a12a5b34cb982a654c456f8649f9a1c20fede8d9b096f60e85499e0355cbf4da592e8966723cc7e8f59a6458e79579b54cc559692cd371b4e09010f84cf083757af8b3a542daa2bbc3b59ff2913af691a95bec394f45c5c75e7b25485a3a27e90c239196092908530a5a8c2766426ad57eea2966ed256b7052832719429227924c493203922f904c4182d439f8c95af6da4f55ea38333c33f61baf8919fc4b71ec9d75fe5813c559e2f2c6c7cfb886f1df309c8e7d1c2539b5e0c31e0a3f1d5d71944477df74eb483ceae9ee19ba754463240223021881463c8a6ad0ddf72bada9f64a3e7f85f43ee99fe96d023b729d0fd75e49ae7aa6cf73be585398c424e77be170fe13eca88ac66e7048bdda4fbd5eb8f64a5eafa8cf89bcfb707a8c5ca7cb555f69aea567f063b1cf3eaecd73b4e0c370769b2751f7e1da4f7df8a6f653f83194386b54edda3cc33a476c6335c9c62abdf6def7667822bd5e51333c674548fd243967b5a9e82624cbd757d4ddf32f48445406396931748b680b5196f64ad4dd45dd22fa21d2ad236c7477c7e4da6b8d4471821409386fae4a72448bec96a4bd3f45a7da6aa45b47a4ba1b2da8536d753c67340f430ad212eac88e86d53782c5e3f917fc906645f167512d23491871ea9e961fe63fceea3f8b0222a414450abbef547b25435f8a93c987161caabd92da4f0d396068090cdd1af2298286774636f45cda221928a2a5fbc3e9c1e95611b1bb331d7feacef1afeb54fb5373492806424308591122bbdba65b424d4245447c406401448ae84e14cb9863fa377f13ef6af7a972c2fa64f7e1801f5ab0c7753a9ca7a2b83aa6af1788e9f87a59ea91f8732c8a13bcf10f07eaa6e9f397cd3daee3e5c75e9de0e7b1aa0feafb3eb4e02ccbea8bfe197dfef76734ff70a09c0637ba69fa5ca7fbd0824e7b222bbc4af0c2d2dddde72996a038c1794b10bc1fd6d271eda760252edde66cedd3f56fe23f7efcf8d155d1d85f12e73b33f63c67798ae27c0575b7ff2c36d4ad216a7477e4fc99631fb9fe58eda554f5bd26c2c6c79808f64d5e36498f596fa15b43ba6851a44a8648d1dd8d9fe94321198a022969f3e339737a3c6724be3f96b85a70e67934f30cf1cd014e5c5eeb7083f617cecdcb734171c305658cee86f2048adbfce4a65b1469cc231f632f97f6b1278a74caab31e18602edbae140bb6ec068d70d0cda75438476e194d02e1c15da85a3834209353dd3dd2281d62e128c68170952b48b840bb48b0412b48b0416b48b041cb48b041fb48b0436da55424c0c0c09355a6cd12d2dbee8961633e8961638e8961640e8ee9a1250d8414bbb76c0a25d3b90a05d3bb8a05d3bf0a05d54647ca8a0c20a2e9840860add2243866e91a1d42d32bc6e9151d52d3294e8161911e8161924e8161964748b0c36ba550609dd2a63a75b652c75ab0c1dba55c6edee9a1472c8b8a41c699714a57649c9a15d52a4b44b0a10ed928244bba43ca05d52ae6897142eda25650526d4b4b040d22d2c96ba85c5ec161663b7b0a8750b8b20ba858512ddad2305124e7025e169571223ed4a6243bb92cc762589d2ae2454da95e488762591e2258517a6b4eb0520daf58210ed7a418976bd604577d794b082eb8b6ad7f7b5ebb3edfa7e68d7f744bb3e0c74b7cb4c4d8e191c2e24d0dcd02e1926ed9281b54b466c974c0fed9221a25d320568970c14ed929940bb64b668970c09da25a38276c9d0a05d3269b44bc608ed9ae1da35b342bb6672da3503a45d334672e0a8a19991e92e8104574b478c1752313238d882c5121a6023033dc80c5d99693ac3bfda28ce065713026c56746f556c0e18c006ccd011e9bc4ec43a6c2c2fe8b8243d9b2bf542aaa56ea47e79a14867e0ebc3d11db68b8909f876ae25653cbdb982e3fc9bb13fbdb97b636153810a9c1b7cbb1f2a57141bdd6ddb15d54337be9d0fd5eb45b60b8a89137cb40b4acae582e281e38cee9e81798e4e5b0d9eaa7822c013d99fdf5fc2f564e4f57abd02700315546cab1b82bafb862dc993e29444b7d3c7d138c5506b3aa3fb05aea6aaeedea8d81ab0c3c5d4457d8cdff39ede0c446b179391ef612758aaa2f3974db5f48b969cf0d7125e9a4d28ae251abadb8a502254f879d29b27f94ff9a1b055cab83c0a9f66c38a44098a921874b7121faae65237d28cdfabf527adcd3c1d4fe74305c5e4ddd4df982c674261ef6a62b5f8fb70f9dd9965d58af3731c8bd90fe7fdd182b92cf2eeabe23e34e439d77384a084463a8322e79217f1276b3bb8bbaddff7217118dc664c8eb3ea3b9c692da3704d7a2a2a1291ff4a644c6495ce3f7201e70349053a0d1711306e60b0712131a11b5f7182b65bec1680104745f4743d3ae2741d21b98e84a8a8521ab9d1fe7a6a7a7a42e23636363bda657401230b1839e1324aa2ef7b77079722794bece5782e23d28b1429d2bde560d463c4a3fd65e966435114454ab88aa874671a7e919322a4a222aea21d38de8dfb2bc75f33afd47574370eed22aaa2bb63888ababbabcd5bce5b4ed7911d5c477068b096377b8e577b7f0aa654f7c323b88820691e2356ba69a6782c8ad3db969022035b888cd4f1a4d1180ded4884de6c69d56f0268ec35b1dee94f6561491f5aa6a2a3a737cac33a5f2fd8585ea3de7c701569e17b3fd32180d041084bdbfb53446ff2c2e212a281e747079f5a9d8e7fbcd39d5c449ce8f6d7bce59cb79caf23803d9d4ff7a3037e68419d215756606273810843c839bae00c5750113f38c06680250a90812424179006687600c48373f3c3c48749f7758a5ac2f95ea488df125c4d9c9b29eb61dae160a782e3790ebe99818ae7783598e775b8d224e19d20a647444980c400c8d7fdb5e1ebf539f93e8f59d089bcfb6a8ffced1468452a7b5a97e78cb6c4ffd23aef30e8986a620feb9c560c61763e9eb479ed0c93b362c7b029ce8c3d27e7c230cdf9319d653afe8cfc8e8e1e3e94ef73325aa8cf31c5e1b535c93b1153eb95c82fcd503e4cf17da7cf498ccec0f91eb30fab16747fb905f18350901c3519bd5e9e283ecd0914273953c7caf05351199177a1f834369396c82a25c95a51f84e325a646d1451b64c50d93259a6b02e71dd2875b78d910f7be2d7fcb2af63629d9e8ad6ff7acd99de3ba9cfc00952dd87f224a89ad0d729e6fa778b19583697c26a1daed61f366f49e4d726711146717dec93864b5cbf3eb633d02f2ef3bc9324a787f692fee3c7a47d91779834428fbce3810987820d160ac030460bd98e504198233f344d815609cf3c8f68c01105e989ab47015c3d8268f02f4c7ab216557b2576e2cfabf6bbf345d0717ed90cbcf3b1d7eeac1426c226b6187b267f0a7c2aff984df20efb788c6b3fe5e197f85a3a7b98cb2a7d0ad2d1560b7e14f60e5f1babbd92f008d75e89656272bd70a4bbb3bd4e2e1e136829601b02cc09dc0a2cbc24a047cf85155a70a3050db47085e7853f8582b37e122e1e2ae8ae1403fdfcf4505cc3b9eabd79cb99af5d1a2dd457cb14c544093997fe6f54918b474ce7c73628c20a4c6c4b74370f39331e69c6b59ff2320cbe0101b142a7e052e10b0cd5dd13f861f3c18a6b871b3d741b1b0fdd1dd39b946b074f774fb952e8c0ce0fd50e7831145353529411d3121b3c29a2256fa3d2bdedd0bd4de9de6a1bad7ba3da72f786bbb7dbbd49e9dec8eecd766fb57b1bb7a9ee2d4af746bbb759f726ebde625bd8bd81dbdcbc0dcae6a47bcb81b54935d5e7e5c75f37920b05a9ee62d6a8dbc885424ecff0140ae707b94ed8d23b9fe75623d51d86444cb4a73d93cb0436da3f6fb1356122ce4cc5129373f4ba2970c26a3fcbfe7d8e6b12ef3208e573f2b09ad8e1a9e45d4e2dd35a8ea3056f7230ed93581b952d130e93882c53f8d9325ddb85af97cb45e536fb14af8ddd2761dd4bae1615dd983a0dd556ef7eb654427a3a1e1d1d9776b508d0dd38ed6a4581c1f374da5759a51349035c5431829e80eb25470cbac0788a46efa48108d8e0010b70c2e57245bb72acc0cb8fc36a615e0dcc8fa797ebe74abd199e4848f722996a4242ce4b73e1b081bfc879696eb3119e4ef83fc9ad4b9ea06e10e94c4292f346e19f9a518fef87b5f0692d9c4b727d2822178d105c34b9cb9af739ac8f5d334d4bfe96f5a1c21761b32e49ca96a996c911c93fe170164159a6906695f0146895b265cabf942d13fe4f922d135e529346b0ca0beb6397cc0cddfdd22e19cff8431446b0caf33edbea7a21d2fed271b94cb95c965c2e352e17177c3b10d37107c474ac6ad70a0dbc33033fd732bd93dcf13caf483a91f06f19fbd0a76b05c60a8c6e7fbdd1ddcd556eaeb4e8f0e7173fac492f0cf0a1f3d2a493557b69fea385f20ec34aec33b0ce5bf492859225085a8f858fcb17272eac486897d0a5896631110420e0dc789876b59ff26c566fb096340b09d04ff7e61303a354ab33b4dd5b4ff7c6b3ed746f1d4e15ae2ea37bbed39ea99f70b514958a4c32e06aa5ee49fb746f449b4e376bc3d9d2db0a74c045b7dee011da5aa7ad56acc1fcaf0e1c105339cf0f6dfd5eaf0f656093ee8d86eeed8716478c1004b13b006a24d1dd6d842b4670eac6095f0737c6687c3b7204abe658999055ba15204bb5b44a119868225b83e758a6ad6aba956db53b0c9cc6a10d345a6d4060ce3c8f7476701b3bba2b9db2e9b896d78954cda5d72bca87bc6a8e4430a3fd25042244800855fe753a8eacd23a6f3630886084084de5feda5cc00613ddfe029f8a0db1db5fdd1b114340c110ae1882136ce8b0e1021b280cc108dd3bfe0a1f975d919016790d21d61a82549197876184358ab0061afd370eb50605d670a2bb49a3ee8e8110ce1002098470c51a6b0875db845e13a1d620a1fdfecd35e808816c7fe1fbf9c77927298a36e614861062ba7129e5f190500df645109cd8094268c316a215841df8763ae14b212245b4f47a011152facfb228fa781a116ca96296487ea8fbd932f198adc13cd471aca4443496f8f52261f3e62a247fcb2c8ad3e8f502e9fdfab225e4fcd90b7c1257e5a8d70b2be1030bf8c0097ff91045f4017c80e4839ceeb6b1a1317caba2c027a1a6c09f1975cbd20842396eab6e238d2b3c0d265a280da1c6b71bc1aa3476b4bf42eacd3b49a61e64d18446e3c118dd84073b74b7e7e5e96159f5f0edd0e0020d2aedafaf53f41c1d0f538732cbb409a6b3a8d70b562239e9ee9b6e1cba8546ab7f3a9f9e8e47a7d2ec85cdf09ced000da48db5d1a8a07b8a9446000cced8b283afeb33c1d47490bb33497ef876d8bb4f8234ff68c5b683629a27aed35e708e4ee4ab9a630c2ee43855738c6147ca8d481ff41d97f2f5962eb6a52d07afc17c5b825bf5c682eecea15b3928a1bb3bf0435be9cd69f4a01b06dd313863072c7c7a33109f8e470716ea3cbd796ba17be3b1b1d0b91cc3dfcec04113bedd2cd33b773069433a9dfe93544b3b6c3349c1498e5424c7f9b42f7c3c614e8e254c9663a1bcc3f7e9cf68dff739111c1a9c88ff701afc3fe6d11b2fe224cd5e7e91080e49f30d284ed02be29e5fbc3689efecd09c8ccbfb7d9f773598e7e09034dff8148a756ae29d221dabbdb14f9ce3ad96cafe7aad96a4d9279e1966dd66ffa8becf2fb5b60749b38bb3cc9752f5f0cfa5cfa62f53b11c89bc065dd2140ae5d485d38ab5498a73a4495d48bd06ef4251240a69cc3a3997bcb3d5478b432babb4739c0f572bced977ad6c8a31ff3cc3b10c5faf1a382f68c70ff18e5fea3f66d1a777f72b6d7a4db44c5fa752d2cbee54b2360a27dda75fa752ad28fc4f328baa4949ff50f971c8960927d5398bc2d72e8dd74645754b0667b4bf64800515edaf289c1732c861b70c5a32382283d74fa1b8b3d93d064674770c70447ded3e9505313dfad8845a5a03064374b7ce1114395ea4fa4a484491e888f64cd8e7670992f8547b2534cb14264ddd39decfb309395e248c3fa4971c41a90fad91d37d27b096b65622225c7b25617834f33c924d27ebf422496f948d0a97e0a7f7a9487e925cf52f9bb24a27d58bff849d329e4a1f5a232647a194f128e3a9941faa064a599a4ae4084a4d81562c32cad822652b421925c9f8c5eec136c34603c185052fc0b70beb4f811326b43d114348a906aee869b615ba7b0ac544b038a926c6b79be139abe5ebb50213daf334ea15d10a685361dbd18d69f65e0bbb254824fc70fe9d659debe3693e6150a182234ee253bd1269a3c438428ff626d1d119bd189da56004ed79fa97b5eaebebe5b55200450aacb4bf3c4f9c2f6b3f75d3ab03a420c7fd4af3bcfc18df0edfa7f74ed8eb358255289809c38d30d0082305ed2fd0cbf1fc8573fc45c3bf463f35a376701854fe0a43060c31c2078302feb2d91d6330a0c018d2b9cd0ee5f245eb8b2d7a636dab8ddb447182dd5be73a694f45656fe0ff18eeee2374b711dce8ee22fc386b77b741043686308255ddbd8610ba3b081908dd3d811ff8a0bbd5e8ee347ac003234a6065099e5424022969414adaa8fc501fda25fc9f243f147e11363f5ba62553a055ba569cf83e15ad4bee7cd1a8deb2e8a77df0a28aaad799b79c5e5cc1e27cecf3a924f217c924dd1d96504f4ff765b3cea51ca333a8119432ca5548e62d89e62d896cac2639ada0bb55204677a7a0bb51d078dee9b4852008314475f716821a7477579180136ca0f1440846c0b4c4173b62a50217495ea4104194143574e8eead250507d0d866e06e46a0421b02f088a8ddbdd5800924a6c400830d18ba7b83820634b07812811636e8ee2d059956c680521b61743707a345ac0f6a40001d74f74645140d702a41035d0075f76664004e9ab20881802cba7b2362072fe05c17a1077437a784c4880d88f041c410ba7b75c21160f4600926b2404177bf1ca0006c6c62bc8e70a4bb3733848004153796a8015077b39af8600c3023411432ba7b1303e603822746488901aebd92150142f0a4bbc300a35b0c670b40e00010000102b25b6707ef8c60d5eb855fafebc1ca99072b673a2030a16dfefeccab686c48c7433ac95a3a1ed2f17c2d59f5fe32f257d35153d4193135f0f11fa168c9097631f19574b70edd92c095ad6c7da086c6b7abdd5c7f879c23185d83715f7051d5ade3e1fb140a47d562345ba68a24d787caf5a19284b3289c45229d493c20d5655b978ca42abd16876eb148e4dd175efc7d3e2995875f136be41c696d668c7f16e5e183749cb5168295c83becf39657b41656cb5467da4aa913f96a3d4f77ef70909f204184d8ea347b658ebfcfbfa9a66fde3aab384b29ffa0a5650f6bccea54bb1326dd271f86f394fd95c9a64379581fca468da054388bb4c0d2cd45a0d5bd227b15a557517c74afa0ac8854e85e1dc9828deef6d79291948ed392919453735278129960af6490c5ab93552a52ec5da53e85e2570d4c494c4f444dc811949ae19934c313e9f5aa761c2de88563a5d3eb25832090e47cbdbc8943f0c3ff0b054810214066603359bba0cf4f88b31571b622141021650c723c929caf9747e2213d4182f85c0c83587707f9f42c8941c00b8ae87ec11ab34c69af9747e22617a400df2e5358904f8f87ef93e2cf7c7eca209f9ed205df64d4cd3d71d22dde8b04b4a248d4020ab85ac0638c261aea8a6b0c202cc8fd2ce8a2bb27b953cb3948e1fb19974f2e7becb34cf47a757338c070593c5690868d0b132e45ace048055c88a194022d8404f1414a8113cd002b34e8186ee52908eaee2a9e20509045a596f4506000271faad76b68862792900cd7a6f821cd86a2b5a07767de5856309c0063c717547c21009f9ff20b16a0609f2758ad5198f47ab17002a7e4f46a9ebadf280a1350697c3bf043194cb0a3db045b09cae86e2f22e4fefa3ecf789254e11c0288124891600c1230d1cdddc0393591a0e5c3a412f530a13dd308a2bcb881cb0b26babbcbf865b2123f59cb8fe78cc90b9eeea2013c1e8fe7c384c7e3f17a98e07f12452210d3a5ff242f412e1154d1dd1ff30fd7d2a39aaa22bd3ab59f02eae980743c3a322b724b2e115c1141958dd524359124891ecf9953d4eb750508d0a0443eef5aef9b615a69cc8bf0e56ae092b4acd29ba13238499f9f7208e3297af7c9aa390a35793c61433e3fa550d51cc519f501db5d9b4ef871b04c2e2ea4b823467a479c2f0f3475d7759ef38b587caa97f8542f7aafeebf4970fd299b716d3afdc73c5c9b24c653043b30d58d6f37c37336c373b64516ddf9da19766bf3ebf17daabfce151102da2208df2e24c2812ebaf1edaa773f536f7c12ef804fe5e24015dd3d010e0ce9b07e59e9e8431ed69fcd9b6125766d20025a00753fd2d09050b543deebf5f4668fc49e0c8f33cf10c9e7a77465000c512c9358a6fbb3dc34f33c3a9a6af2f92985f494a2b5b08c69d57b581cc2f11c2caa9c718133f0bd40d50fe110e1f8fc94a094d193328616f80aa4c0550121570576a4e1ba424b4e0e5138ff299cff94ad08f55328544d22c78b6484841c2f52374703f703a7dbf3a078b0801260a0022351e4c0065e50d102212727bcf4105381195705be40c2353085ab40b0000f00d4000b19740040c900365970f8140001575ca1f3831d4aec38810a1a70c4030aa286282283176e8609e448e00ad7162c3819bab918381b0e866eae878d2b0245b8222015be0bdd5c0b1c8f22acd14d81d35ecb340304c22e3f46528300cb8a2abadb06bbacd8d133cfa32ab2546142773f408cb0fecba693eb012d74732ba8d0dc8eae322ace9f42712e6d6d2a199922866e35ac7c0d33c234ab5945b686d1b2852eae0da6756c2e286c39b6181f1650af9260b900c3c5c4b8b056dbd629705d73bdddc032b2350c1197d6f1b2f5b66d2e2e40381aaeb76d5b7148db06b371dbb67a99c26ddc06c3a1f0b46d2f1b4c731b8e6ec5bdbcdcccf8c6e23856968db56ddccc26046e9369978dc5ad7edba270dbc6c52ce158e036ee85c56d3be0b6ed85db6ed852d8b61517c385cb0a26c786c2b66d1b37843b2166b52160e3b6176edbb895b771ac1919205ccd3614b3b9c4b02ab2c1701cab6735c3711b8e0e21db0eac1e9a242b27ae59cd2d6063ad6e582edcb66a97026c34d89aeb56abd55b6fac8ddb7ab0c5703fb68d73e1b8d5b6fd6c3b5bcc56c3711cf762b4f9e03816b7f1ac3a1a156266d87090b002b7c4e6c2a9b0b1b6d5d69c13e7331bab39fad2fe6d46acda868bad8f84805b6d2f1b0b66c3b1ad98e0b898d76a0b5a6d1cc772ae46e66673d936181e56cf0b3c1b37f312c36ddbb6c16cdb6be3b817ac5e36198eb5a2da7a70e5b6ad7436191a6e8b81d9b8239c0b9c0b5c0bab5ef5a6637be1b80d07abb562712a701cb7bd6cacd82613c346e3c26d2e5b0e2016b824181a196e83c5d4c070db0d5bccb6adb88db5216d2d7043381e1c0d07c3b96cab8ddbb8edb5b5c0d17030ac6de5b2da36a06db5dd6c325bcdb66d443617b89915cc16c3dab86d7b6ddb0b0a9c091b8bdb5c58db108e665b712e6cab15c7b138d63684e3b615b8994d668b6171dbb6bdb616b81998d5c68a616ddb06e4db8e1f31422b1a5cb6d526b3b1766c32322f1a272cb8b0c1c0da38ee8583f9ad75020f0dd2b6711bb76d9b4ec334d939f4b0a981430fda7180e20c3070b031038d26930610583283323acac6050d0545180f35bfe82728b240c0938d6dba018a286a384d204794a0700108489307cf102876ec0c99391e0034031c3100d9cc6c4266b01941c8f7460284f811bafb8ae082ce4705975306036c8ef3fca0414b4e1a2f7c5ef382a740426b29014a7f2e48b4b380682e057cbb972b333290c00a8c0c8c0c2b478c101899550b35513e30f588b97999890962d5e8d858352f1e8bb6c2b172b1c600e200565e72703032ac1c1c2d0441c0ca0c939a909593c3070e080b2e4b58db8b9007ac14513a7201c1b166584a3843b072831f7e80e1c3e6f272bd70c4078eb5c24a87dc6c865c685081959797179cae9ca0a30800ab1a7c08801515649ad4985063c2942427903178660d2b4259a6866f002d1899150e9729961045f810c3caf1d2c2a6e3c7071c4421f363055762d858220747e372c4053384a5e49d6cf9a104979b99243333bc3c61fd8019f20306a0a8e107071c81428be70a0e5069880f58a129634d0081c347c7c684c78a088c0a427c988119f232139363059454c3aa8599246b58998149c2011583c40292243332483550a11006aca4c0ca1132f3f22a01c7cb0c0d921e3a30c0ca4c0c920b3022acb8ac5a2edbcb0d2f332e445e7e0c15d194323e62905e666054c0712413038b4926051378ccb0020a3f626850f234830f33311dcc0f8e1fa02427981a16cc0a2eaf9510991a960f3f02230333c3da7151c20a3ab2b9b0b0b27141814726065c0d41426447cc0c0a32403e1831d10089b961c5c08ae1c501567ee4601db9d0e0e2824c0c2c1e3a7a562dfc60a5dbd956b1950e6be5b2430f1d08b0015b23000130b6d81201074831440f55aaf054ecc14f87273948315902e5a46403d22be8e76606196070560840f0461a68e0c0c8900c3d565001468b094a3005036e4062e4d5c20935342f1fc8220356503185140a80420b0296dcf8d8e99a384014d41b6e040196431a3de080675d033882c68688ccc0508144162099168cd1002a5e4384a46002cd4c0c0c0f162e6081271f3631d99094044902042044004828238816118080037a68c20448c80e13586180010426434584c8c0bc4820880c4c200a250840c40e4f2420014734310d11f151b31561d506c7064b0def0177060b07dc0c5ccad85cc0b1805b818c0a6ac4e0c2e0bee0b2e024b08a0037c58ab2c5b0bd10d3820b0f1c2a702970276c26b84a702181736d2d560e8ec66586938989e160605c38d6b6dab697c6a163c5c26a03565846586129bdfcf00d46083eb41860c5c5a506660617f8c082a28795428d140f7819c20a4b490685191e3b80b02283032b87950b34f9a52626494cd0cbcc8ac88e1917125889c1c28a094f7c90015a21e0073564587179c38a4bcd0a2bb052937b6cc08acc8e1c1c0c11971d9724b09c40a3c2123fb08ab0a2c34687cd4ac7b513b3c3f5c60f2e34c404c108ad74ac8462a4b0b25aead9799979a9c2ca8ae66505560e4dcf6a63d5b0726692b8d00083c3cb0a2f332f516a4ca8314166870c0a3038ac8cf0c3cb0aab2d3fb87461458628acd13d195a60bd6a74bcb858db4a6765c472aa49e185836902c3020c93cb0939b6179a950bab66b55a712b9855cc4a6686076b05b30486041d4e332e9817986d05c302c2da616d312aac58f041e605970758c951850fae17160b31473fb0c8f8a187e7fdc61170d08231c200c38b2e4a191412599014192902646b1a3dd8f1d1d21103e3248726a6374e20060a5e38828789258e1c800c167c21020e5c200253ec74332851e623f015820fd480810ac40041057ae041872739483531d590e405175240210b0df4100108f050c56b8187ad2fe420430652462b6f1c61086b3c7192020a2e168820041de0c0052c208123042084a7030e4d9a9892be3841084ca00513482f70c1172200010736c00029880000103e5083052ae0c006b298c0152b1f262171e150c3066690e105083490812b1a8084111f7a3a3c71d224090991178e0bc71727f002014d2071e5431d6c484a8284c82b070e56dbc08c2f4e3082106820035748a0010310c0152836241521f20202d28343828bd56fd8c00c198cc08b1080400319904003068084008cb842030fca13233b9d1b455052a223470c7864298208a9263c51184144adca0a99375647e08ce05204ae8d9807b01cc035809b62f3e17a563c5b47a3b3a261e528bcc0f1d858805961a5c2b68395c286824c092490b06ab174d4e468e158a146051a1e332e1998981718eee5c5c565b5add033507c5de925773eb420ad250c1440a078d172042d637c7ee3446a77ce19e8530b03b444a12589ee8f8a18c78b08f94d1121d7126ac1a13bd76050baae739284f4b2024fb70b911e2e3e9e10e37ece93dcb9f909249ea082f3840e4f20b5e799a7e3273e016b24c00cbf36766709b802dfeecec0f1657c9099d2fde5cddddc0ca7a34b801287026702a763b3410fe9f121bfb7047f0c191234046888902141860019f233c46748cf109e21438282828082840405090212f413e413d413c413340428080808480850102020403f403e403d403c4043840409011222444810214084fc08f111d2238447c8902041418082080912240890203f417c82f404e10932044810102020428004010204c80f101f203d4078800cf909fa01fa11f213e407c8cfcf8fcf4fcf0fcfcf109f201f201f213e417c80f8fcf8f8f8f4f8f0f80ce909ea01ea11d213a40748cf4f8f4f4f4f0f4fcf109e201e201e213c417880f0fcf0f8f0f4f0f0f054f13c025a65ddc9630c8a93999c9b999b2a5ec57770cf99c999d9c1ddddbbb912ba3912ba3917a7c38912f88b8aef0727a89c089d50f27dfe9ac9f93e7fe5d88bee331f8ee7d88b375f9122456cf0732d1d4e9ce084099ee3c387e749eb24d1e87e35e145130d68c7f4cba56bef4552d4c495eeae6b224a13603711d4382e24e43d37ee00d7016070802d77aad23bc3b4afeb004bdd7d2d6c76732edd1cab9b5bad8480038ee3b6373623746f6e746f4570c26500210304194000ddfec2a5759b3d7cbb1e1d2f22e4dd5b1bdd1b11ba37361a533f5a756f2c267898d8d11d2ec146b7b7040cba1b8b74e60fbdffd8125d74db585d624b7727b144ee6e5cfba9277d7fea5a9a178bd9258e2c71d378899ac64a04a15b0918b4a74409669ee1cc3f2a718513ddad4411ad4455e3a7472811831235dd1d7ad98ab8004328000c6cf6d0859c26b61a4c6892a4b7190ac0ea6ea09e8e47275b7bdb38c2b6861082d06da8d0032034047ee00335b6347ad03d67554808b0340013f400a454bdcc054a989e9248712111019b106372dea8a2f0a792885f369dea549a791ee1584dc2384b159d254b16b1bd56c25e2fbc4424fb88315c4714a0bb7f160aa008dd7dcb9066c5184865560949782df84fb93e1592fbf7a778d5d611ac32a20d3bf33c2a22462b62887016155143440f88b082080674378d089ceebe7f3f871f51da354496114f1a3863d53221326306edb241b7cb0644dd9d423791fed12fd46047bb6ab0d3ae1af8d0ae1a64d1ae1abca05d66b8b4cb0c1ada65860ded3263b6cb0c2ced32a303edba0152bb6e30db7503266e808176d90007edba418e76dde006e8049925ed0a8249f7f64577c76c5cc0ac58249613495629cdf567ce0f95ce0856e9504dd98e8eebbc301662060b1bfeaad6fd052be70c8b969ec2a294f3226c2241f2542d93386156ac4156ed6df27a05202700ac6e57100ff097ac520f66c5227c3b990b005274b791aeeb8cf84bc7af1d4129ef876ac948caa1c0ac583482524eb613746f2628c1f60112746f22184108bcd844d0bd85a07bfb0008bab70f74673c959a667822d5a4703ed252f875c9959c06820d207a00c40a80c042c8dd6d06820820720082c88b0cf9fd9c1fe679d2a0aae65287c599b18fbfd4da19cec199e6e0bf3e4a5bf3183805ceabc4bb70fe2cff38999cba4fe7bb641ebd5227ef3e9c1b9bcfc519523c65ad92ab871d3c88dd4c8ea9f3d0060f3d70f1b045b78b072d3fc466513c0875f3d0eaaeb245952caa24a0bbfbdad8fc0fffebf8cbc62af50e8f3fcbd9daa70d0b1d0c008574ed10b583936b079ef6d7dfe9b467729b1d5898c2c6141e927e0a85f2a7399e589c454adce7e729101f9e1e3a6316a422ac243d84e1bf13d441a2446404f55328eeaae69293ff4a6c14eeea9c91d7bacdb6b4349713c433b01c1d4face3f8ef675a69ec437b65977e376773d634893caaa3fe1fde26eff03b9177b09f9ae30433cc6916c59c0f7f8e339df9f7e1506c0a1faa26b9a43429469309e8eea176915f7552c85fa2756242f2a17abdec19dd6d45603960b5e4f8cb5675b7fdac52fbcbce689e637f747bf876f73339c3e9d540572deb97e78ce6d50986600245b8c62074f774dfae8c5be019c588a55bc7a8d485148663ac81114b70f486f851d11d9718437717e21a8cb1e4c848109efe42071e3340d9f143912c45ae2733a801288ae886e971e8f09f5e14a992251f5aa312ca15054a9420501406dded1414040aeaf1b49966eb947762ee91e7786d92a02018f700a748fe0d0a0205e5e1fba8a109eca88bd9199e48e1df38f93f35bad21468c50ecfe0decdc8d9f7d7c66ac6b9f1c7e24ce2dde7f3537edf8fb37e195bd156bd05414ad618fd70725eafa89b6f863f6631ad7306e297d597893a7926a3a26390664c414a1209fdc4f97be33e33a6a27f435142e3fc1bb33ab9b4b656d922ef742af5c9c43a614abbb944e25d0e9277df07e51df681c939deb877f865367b2e4971e2e0cf3598577ae336cabba3a41f2713f82454928dc2e13f1368a38c8eaa65b2f773a8964914a70b7d72bbb71a2e6678ce7268999c707941d4685ee8f29a784e2eaf06cfc7e3f176ba49eb3832dcf8cb771c4706f71c19fc455acf91c16fdc5f390e25a900a8c4f028d7c1a205194334032000000000e310003038281a0d872362d9a0c24db50114000266c46a9a501bcab3308a31858c31c41000000000000000303310004a1258a65ae1fed656b92aa8fa7122590a3c8212b538e3c31596bb447c8664475bc7ed782249f5a68e05e76d66774d9cccb486ee38ff5359e6e36035c9f30919d01b2c4e0fa3de2438222b1b7e828ddafd2ba4ba0a81ca1112e797fc76118335a2575d9cdf0af84799e148751d368dc35f349e26e2ac7015aee966c83fba18828f9edf0104aefaa901023ba4cbaaa8718689eade6759c374e4eb597e04589bcf17667eecd586eafb8e4adadc92fc008990125a09072b2626d56d69efad456207deea495f5e3d5a8ede3d31fa74d80d23f6d4cf8516c40fedebde3decac7d149e23c293bfd56a36421f60e743d93272e53a4567fa7601c8dd45cb51b68b439923871a362e55d0bcd496f021b44eff2390a67ac10c34b9d397b5436e3b6a2557f0def6c14a078cd9decdfc330d84bf0583760fe8fbb44bd8ce495206085cdcc9b860dcbd2f99c045a8377e146b452179c9e08deacd5e3c9107625165aa07d1f24b025e77bd908345623fecde3f4139dce2c66423c225742b25ccbbd3dcf8a1f45e2cd16575a0ce2779da716d8ace5976b2e4cba11c4c8daacb7aaed68ed799852be7dac30c25e716e681d831ae6f9c2e98e07e6701134d2b9034f988e62a49edc5e342833bc53da718121f24244c57a417fea14333491133cda33534676baa9b9b63ca3e408e97eb71d93a807b378fd5352bfdf79bfa0e3f63fcb949f96dc94cb19da940b34d7a11e5d2fa516d0460f9b0bfb4d979b9939e2550b000e26021c77b059d667fdd1977e73704757046fe0dc5f795b78b5107691e6de409f60f95f77c565606f0a677d136e1c064c05a68fd3f83cc80f00fcd327ccfe0f6b790a7d876bb9c7fd08f479ca113aeb87f0cb07ddc85fb3dfe316d3b5570c858fea0bfb4ee496ff6f877c9b4ef0ce29db76ac6634334926f0ddbef4539b15010aea6158312df37adf287f73455ced4ace65580982dcc4c083447d90c33a0a73ee8f87002854c46a8be12a319f0756e98cf8a6e1b66522d243dc6bb780645ae3861a1e4a2f0fd2d577207c4ca2841e31b3d44b6ebaf55a7dbc2b77d52ccf3eb75595cf58e938d967f3c816c2aff4c503f76a48dd0f1e412be1d3bbc51a14f2b95c6213bf8fc30fe2bc7bab310017f8ec6558e054892fa3f4e8e76c11423d155d351511b1e09fba87c0f1af03218dad1e938e48b46dca6240702986aaf87f1e6ed677dfbfd6f02596d13d7b08cca6414f0fadb9996715529aa3ee41f0b8022df34bc90ced572de973a3a93169e2af9c00a7bdea762b3527ac60e1bbf6e151d9fb222282f3efab2e26217f1992bd565085ce91a2dec2179045bf06159c213314d4d3918d7bbffef312207804c18adc2bf75c951b5043d043a48c15ab972363bd82a52b5af6ba57e56227374f5dfde9b243990f8451b6e9ae17b1db5cdc4abaac8c5c5b26de5a0a37b60486c97d6106b546f14264f63ccfa8fe59ad2bb4a7d8dc5d507a10f45b5f5611210ab671725bdd12c384a92e0f7ead3937324a860586cf61410b93ccdb0598d5ad92313807e41685ed7b8fef46aa6c4a3353a1e05fc2f2ed547e2a5918c6e620463fa334cc16b0ef4d83f1bc4e2c54727404f10b62fc9cb10b4d6947bf6d6bf8adc9bb2971f0b2f8bab7437127656b0d3910346eeb2e8d1e89f07fd532e5747e91aff87aab643054219cdb7c44a6fe21eaee98f86eb2c1a59d25979a4868dd9867d396fd39675650a782cbcd5763cbd2ff26db5beef635cc6afb6b7141fea7cc94a91adbf42da21ff3a1b8ac1818233c9ab973a62d913f1b2c8c7e632e136518b9e52ee60762b68d91b926b5c02884d44a566ed714f6e31d3a0defa549fbe09c55ec3c242715b8016031e325ba164b38e2ab3c39086f29e2fdcb17e61f779f88439faf111d5aaa5598c27cdca7beb35a57159a53ba32db3b8ec3154bc50ec7ddc3b921f87e7695ca2fd4957e41033aa76d24e41ca126f72620152073bc4bd5b8b7d52bba935fd2dca770aeb7f90028754cbbadce48d9e902f184e984233a1b02ec1d548a5ca2c2c2a6a5724551f80411426b37e346ea35e0f20e1d1d825be9a4e055f0624dad4a042f51d075a978b279ca72a519ee7c9cb06f69e0e37008dd5fdf497dfb82af085f3f9df588fbf81cb5b0e02d55ea7546a1431a6ee7ecae2c70c2504f49b84380f8b887811fae7a4e262888768642d056b599a8dc4c9984d4505da0d1f3af4312e5d5eb36230413ffc2f49f51ef39101a2ca2b622f320b7a9e8ef7ced64ef2b41470e7c91c4ba1a55ab216035f417d6d18004d66b89e0a0198583cc9cbb1acbda48972c675043266900a0660db6e3f1fde9e747250328aed91360ce921984b78e81f9e8754da1d1abfd6a48d40b8400b10ccf6690facac4f3af023e0343b6eaf18bd84000fa779abde680550b00b5698292415aeb4b1ef2b1a39e4848ef9ce9c55be7af319d379e91f7e881600bec124f408bb827cf6347ca09384bbb51843edc530f8ce9b3151ff93ebf353d6b320e3a6f9fecc71907ad28d01e7eeefb4b8224a2a57ff9d7f9afafc717c0726cb03284121fb2f04513806742f6e82706fb6d643bcc5e8319d61898d5b151260b6b52ade976a3f62456f96ac9c6480809a8d681d7bc0fea10870cabd18d54b24889eede32dca9f1e143fb5c4dcd1d85a73920e743e08cb80d0ac6bc4ce834b168d1369bf5b717e81853aa5d77b05f6d5b108048c09104b17e0bab907f856788c4f1fe5a8f9d866652aeb1b9ce72ce5eb2ffa19f8955e6088a43a5125d6f00f969a5e44e09938c906f18c898b211edafbf8d8773edc637219d5cdfb7d0e0e737f58e1f56b05cb4f58fb5b37b4f45d86cff5e762a016fd2ca918c13bf2adcd191be108e61a4e791c44d437b990b3fc429002f237c1e20fda79021d05a01687a5a34986c75aba78371e6f37435cc713c7b43e9ea3a8764958bf5fb3493c1864a46f5708037131502ccd5767cdb0f5983749c8c4e74e6299c758508306b65c2bdb622d276903f1fd44736cecbcb82f2e3c6922daa41765612e3c8083123c63fec79813586ed9071736623805c65d467d066ce55e4a469ebe7ad3480e16e0f5fb37fc9dbc7dafbe5ed6db9a38e600edfe6f73301d27de01f0b6d320b2a4a5051d45a02e5204eec6b70aec865e1b97860ee9889d578da46fafb431f7115c9db85e3b1ea6558cc5cb00204f028b93929a38d6bccb6ef3a3a37dfef28318d79d63bffeda9950c4f721babb6f38f44adf96e3019a33db8146aeb3a589499e5432e0d2e2670add37ecbe32f71e740ebc4e360fafd0797cfbfbf36860f5237ff5faa0f21ff46d2e22fb30ee000f798bcd04fd6717fe46e1c06d5ad0bd8d12e6e2901e93998cac6c386de8bf650dfb93b5e3a32d8f3a1e36f4d5b11be7a57c06301a0f3dba88513efb4b4dfcfb77a8fe31acfaa0fa08d14364be9b0a1ecf5aa9df76010e2f6d8aa1cfe3a400fa05a530f657880f7bcefa4380b4b770d9945858c0cbbcb0555daf54df8e79c170f4b31a86e10b92fa48f6cb72c389aab71dbf92c20e33677e40b8ebb590c170f355956d9e16721553db3d0263ec6d29ca297df2e4a69abbaf1cba25a51992ab06315468ba32a8687f81adb1794d18f600e6ae567d619e56cff603a22de8548cd732c4eaa49485562f69ba7754703624ad0445aee788b83f07afd5769d1e4a06eb296061cdba35073616df1e9e0bcbd3fe8f66797d034b8e79f7b36eda3f382e34b0709182d63f8a321f3a7aa62e2db69e48f0073bd7607effeba7c4f13422881c60fd6993b478721f9ad26488dde4e308e5e7a1acd826b4f14473566dd203b1dd93b5cc71d1c7f6d9a5e7b32fa5a317e27519fa569485fe8d4f7f432759f7d98302a3eb696ff278e653db13cb1675909b5794a703ecfed0f839bcff3a1175869b777f5d90bcd33ca7482a1f7481d5302229249ae6fc8cd12fdeaffad9ef18090f33bfb0771faa7fd657ce7de87ebc481fcb52c5cfe7315c03212634e78de87952a8bb4d84da82071e9072440dba4b3c701886c98e4bf24a6bfb7c91fa18721eeecab10dfcb6316088afcda1c50b769b17b16399d0e9a71641e780511f381a71954fd4841190b05156780e415a78c5eb381fcd34128fb6183f6e6332e25ecb21a77af403a8c0381bbe9249df3439932d449b5c9bc418351f0f0d9e150d07e31d28d01e8981e2afe390e4f1f1a446a268b062f0ae4093837e9f1f4cf45d4fa3fa0158f0e8d4a41b1bbec2f1153f79ea7df68d41548fc083373e3ce38c302b4effbc457ebb0b2da8d580f7ce3ff872d59b51970583342dd5cb2aeca9e46aac96b4132f2d4b41f3d73dad96ae484a129f7d738f3c3b7c13234147cec35566ddfb51e28fbbee35a99079adf0193444c65a3f3829901c1d9089119f6b2b4f9b0bd837b326eda45826fe576f50f41960aab72cdae75231030cb82e7113685734f64cd7430df605c93aa07b76139c35509e6c2526eddb9be6f74e56d3884902c71fe28b86a73f92825964a786683f90eeee947b7cdb52df56ef88b2ef26a1b81fda42046a845e8da533b18dc5d1066976feaa51e93bf1dfdf2d0c903722ed2887c26f4fc5333ce25c5dde53549223976941478cf84e18fd41397f5b08f163d07ddb09db07e32ed9af13b4fff35b8fc2a0a40c41d8bf0006b7b9d5e83958dc4ee762467ad71ae47131cafe6715f44252aa95b63304c2d27524a9339d085769547ddddef7d1acd1bed0b37e64a448d70c2ae4dd8cccb928202eabf96306b2aea929c82eccc55978af5f95d4684d21e292a92ca5945e791ccc6a782c56f711384d64e57a7c72acf24291e7570de231b755aded5184a89b99186a0f1dfba225ee0a5a3114557aad479a056dee4113aa28b12db33248e233c7a40e1da4f0146aa9a76882c2307bd41dee7a85fe9c52c1892b817e8e7a059a4c00d21eb45e3b9a854aadd54e4672e09c4453ff7c6a5293d7c2cb98702d8e5b77c4aa499f83569215482c838f9f6773bb6dfbfb1fe6795d7453632a67d1cc5e0da4ef73793ebc7e0024be421782c713381cf9cacc82bb65214833784a8bbcc9e013509ca426e96ec1957d3bb86920a570d92d3451d0ae1372bf6cba1a5d7d37d927f0935f9a609842af5e4df726eaf7eaf5b400f96a30a0a9285b7005a7006303c43b34cb36ed78f3df647693f712328b30b603e4f1b7c853e60e666b73637179aed678d2aad01c0dffcbf978321709d711f4d76c35f1cab61ca2a7435193857219e4ddebadb8a47882ec11752da14f3a1cfc0687ea18566725e68a25b45a50e75cc270799aa9c14965fa3da6bea0e540f47ccfe27c062b72b88b3df8a7e45cc9244f382163e62b354930d389dad06980bfdb9d6fb2c2bc9c486abfd3c84047d8e09ec0f5f2a921cf9d0f7c76ccba18db66fc5d745557a309ceb50543882af0ca783a10a93171bbd64fef5f420cb1f4ef9248fc30ca0abb9ac184831920e7102fd843c2f01e5fdefed39a1704a1ea08b5bd723dc1bd5fc0bc1b835d17bbf4876012e32e6f5b28c5429de2fb7cdc72f3e2532d917ccdee16223f4dfcbe85e51eec10a8075e04dd4b48d90607afb54c7c41807c194d3e541022ef104e16ada1db3eaeab3f65f01d7f5520e106fc344c9a95a7f44bb79aa3cddf6ce36ecaa3878c5a02d42b6ae0cd8613284c2760caa97221d55e07a5307f0e27c483f30462c20389a4dc2827df90fb9ef9f09afd2f8f18d1f8bf0575968ce2001e3d919237974009d8c9128f91408de8f9b401c547e0708aa1a6ac9446106f7934424c3fdcc84f156eccd8433752145a96b72fb63cbc2479678891ecb6fb47e61c739e4fe62311b2c69f053ffdf86b4c82ddcb11203580276c1eb4504016139d59905d27b5acc5ea17299cf7c87ecc0f91606abf8aa2211b2e3a0a0a3e857fd479751ea95b31f0ee6f34fd8eca0956a7aef6668cd660227d603c6d09172eb5c3c20e3202e880fe3aa04d582d275306c8add9bb95ac3cf50bc5d61df88f8f581f648d23e00950b25a26e1e644f539005d2287b3e1634fc67e54cbc6c180239db7e79bab9baf16afbfe438650e5ae29696cf3fab9275a04bcc3d1002f3a3cc9426c378d1d017db34336391215b8439735d4500ccdc21a23fe6dff469bd6c311c0768ce9dea2869b20e6cffe4f7017e3d29176c60e0654a4a3b001b70888e8e1be3aa579030c2119f813f7dc1bf1e3d707fc269ce9eff2f2c9ad1cdba6ad35ab72974a2a7b1340285458005c68daf33e0cba1c6a1aad06c376e20621b5d2ded619b4b278ae49a82b88ccd2a760f0c404ca0f307ca5a8052da0ec88b757b80c8c74fcae636cdd86df2889a78426d138a937f19a2fba1740fcb7cf143f1a8580807ac3fead17ef433b15c6bdf5ee54691fcd2164ddb4da264b50c05181bece3ed7fd472e64f8a081703a6eaa4f633c24e64c9931f4a0384f97fc48ad40d7aec7d2e55f57cf0806b4651a5623adf15ebfa447c382ec181ed654390a9dcd893de46f410f397da6bb1be7f45056be80066e96a520da4f0c8dd79c74661288df174ef82c0b1fcc9843fa63c1139572617e8bf756c8d24497e3910fc1e9c40f41e3c7ea0549d86e28bbc0d5e0a76dbe0fc9f05e382623aad788beada56ce601b8c1abd689f662ae95560862a9e424b7f2447c0c39ceca047fa31701f8c0ce50cf73d750c4a50b0d42a3abc300c6eb47681074a14207927d04cf8d7f499c4c577ee9d88c158ca87d45d45d2ef4017ef84c68f2dda0c74d211f496f33df24e1f2d89994673ba252dec361f55c15f5b99a74890c0b5ed3d2f1d586f7acf21bb1ca746e73d16b94f3a227298cb309db343ef5733d44bd8adcc7aeabbb089312fd76c28f124ef80e6590f9f8824f87575c265f614e3590934c349d2838c58bf5b3dd1f5c214a31283c798a1088ae8330e506a98535f19220049879799ab2f8e507c48f9920b356d8aa700e75639ae2ba0b326ce06fbc1ecc4afc9bc94a13fb832d45426c8b909c7bc08afbc1bbb26fdf78f031e06f52bf335ebb35ceb6db57214db6ca8bfa028077e935c048bb17a41f2bf5fefec156a7a32ebdea15bfab21fa2d6038269d37c19a6abe6245b946ca51203f2bb7cde40cc174ab44b279f142363e0ecbc88205814fb9361ea09fb1961c4e3c207e8ca85e4a1f74595b26f1b6521d6389fcff05f4318983167dfb8b8fd47197c3bb81a93de2074123332951346dffb9632630610bc109f390a83e3c3343954a73829239b5a1a2148bc7975044dc27945a4781cf0022a2438fa7beffef1ba0578c11fc6311e3e3f15b8754351a3475a6db93a2fe40791d2ae9fb8d5f0cd9c6c895365caa72f6b8e3f3f84588dc225408a0116a01c32760693d54d81832a1f821d1ff9470920ba879ea126ebf29e8e950c6c24fbcf373b6fc9d6c9305f32aaf14743734dc32e9c927c49fc5c2467288f6c0b0e03540a084f5bdcf0d7a9b702d327f9b6f23f6f91645c6b4d2d10622a0756c6e1191ec6981b653db063dcac0f0d85558b40a6ab732a01082430974516ef704a8ba86f88c9114f080c3944424f676b00a1ea8c933ecdeb7eaeca67c751275993bfeb6ed55d08f8b5124be225075ceab64781417c7d1c4974a54e019914a1bc0e2cb7b411928cc469e2c76b0505d53ad43149d58e58dbac06ab342c803e484d4c7d5876e91f1f1ac6a04387c44c48f1480238b9c67e7b8c4824e6350dc9cde09e59d12e583a5d460b4af37968537049490a55ffdb21de4b7cd16b1875a3c380731abcf08dc6f77b41906c918a91e9cdc7b6b5cee5df835c9aa5e01c3a8cc687b74bced277916a53de521d051bd9eee7979bedc92dcd02f5f37c3f1d9f1750f9a0609719d105bba4fef047e3e608c9f248cc63f0c015790772c5d826842963557593d6f190627a7a0ae3e7115659e67d3645b47677804ce52f5f35e6a5181ef5dd2fc293d07da4a05b34d19e9282c96e2edd203d3badac7ef0f9e47b77ba243f92c121257af9296452c67b54b69830ce31bc0e0185242818563c21445064140a7570c64c7e4f0378515ce828e6584a6909ff3320c6596f47a4249672bdb443f341a8098c5fe7a8bc59cf964ae59db3c97fca25a9226f4cb81a3e863319ef0dbf09f12fdefabf0ba3d72e15812ff8c03d0e83007c40171f083b96a00917fb132690b533ae2f463e5634a68b726457c7983fc8c45e946cb7c93e71c0846c410d0ae389dc345e683777f7011a984502fe309ddd8b20f92e38b74f6aa1bf1125bb5fc493eeb9163e5275060224ab267003bc89ce8717e6e46760df35d97e6450a6da7e8d4baee93f4c40f5d9484b50fdc57a75ffc6f3c79dfaa8f45bc02f1789b562547805a49e8bf29196d44f93589a26d8e4e7fa3f003160aed360b9d5229f5bc81b3f388d4327f45454a889072d9527026b38d4a8e4e0b81e873b80367c476c9f0459a319b9443ef5121ea77552cc98172044fe97d8e3853b81823d1b570171bc5f26f81ef28e7c36760a12fc3756dde0ddc98554cba682889784dbb495b5e8fe4dbb292c3840275e052b8df1a134d464e8aba11c95463a3408988c0687dae6c3872ee67eff3fdcbedba7920c2564a6f988017145cb542d5e8dff767f51798d6f9a2ca41e51ccb45806e069172624564cdde45fc2fa5b0217918cccd863982ed6dc6a999a8fa0140dcb0d409205a1afbe034b568a520e49a838cecaa87bcae147c3c8f728ed440b730af11dab346c8c9759c3e9d21f416bbb2216f66a8f66a988b293cf747f0effb54b50de0219435a3e5da1dfe4a6279810fae1f06f12f97bd2e413a20fdb039fe88e784aca7268ed7d60cb00fb5cc745139e29cd6c9df3a7deec9470239a9caefb43666c40e087755ab2f3ae02c273a0f32329da955cb81318b73ed598abd7ed51e797cdef33c033b37fffc14ba7c1873c75c8317412c251911bf0389e105c473e66f4de34711c340bb9e30ca7bb735225425f2a5d1cf183e80bd222bb1aa346eb07da10d82327e4850c691df2a7559e0bc8740f23ea0dcbd286f756d052af27e8d88b272e1828a264a332e6d798a768d222e82a212a581a6e98ccf930c41914d2b49db1baf2cfc68b6926b0d3662bba857696128ecf6b4c8dbe3b6ba19eb177f9b016b9954dcc536d20b36ada01481658956574eb5ac4f45c00a671dbfd00b7b30a12d83ddbea27468f964ab9eaba902193eda9203164c3e6e12d6b6216467c1e92e63d361ee31e75b68ae9b75295ecc0581e81889cadb782058d4ec2ee83f1466fb3313fc240a010039045093e8b09a8ab20547397f47cf04c39b9c11f269be59c7b911dddcbe9d5714f54d8e6c48ebce88696587330c540bcde665f538930b2a1c1090991a072170cda2ce0995d2f643435643181036fa8f3d86690f4452e56f096543d48ac1db1bf09316e48d6d4ef614ce6da39ce9415b0eb95731b88cd9e6c50d75a151971fd787a7a0ab667dbae18745cdf2505c4ce7dd71de432f614c7f5af75c1ed48b67c062ed4bdf7808bbf6c5bb4f6fbbc4667efcd2b7795c5b98b5d50e4fbf2598e9fb03dd99ee9f0443a1bd00243be667a9316d3fadf79eaa3f0e885288b89aacc71d0cfc4c7c83e4fa6cdd715fa1f36c0f55062eaedde3583fc8b452acc2c31283139112ae19ed9c524cbbf582360ff405b9fe2f36a38ce47873a039611b29871fe87b2f95c9c828dc937bb5d355925a2509c24e537e10799d8bfe1f0486bd7d04173f6902bf53086dbe0cbb6672c22aeff3bd986feb064ff887cdf297efc868eba833d67bbf9d15ee97a53d99201a18005f6b788abdb631ce43971ef6d9a83e77a1ae07d5a4ab2cdb3a2154ad0044c2dcde562c1f53caa66cd5c8bfc9b5a1aec2bc7b52517f463c508bafc5f14f784b9d7d4deececd76f63244cbb499f84b3dc31b585298839d1ad84b9fae73ce8f7b32be1f2bdd97c5b0d42eb9924ae807d198ccfb94986d682da4cf159e367ff38f6e5c896cb5f6bedb6227f041a48700a654d1c7a71091f15c239a030461f355fe9b9fa2a43ed704322898646d1dbc58b1676a5738ed952d072dbfc19473c5955b9edbae66e621c9af2715516d908504b448b358c9060cd0b527c13074278275f4ef06817e413a726e333705f94c060dd7c5b60e833ca5dfd53c92c5d9626ee93d0ca556a0c51b7b42864ecbf2621e43c20d419d07d91fb08179e1d92d487a7ec0acfe1177fab2d89d62c719927bdf69c8297c83d46b902932b9b3b08092f211cc8e48555d505dcb8fb40279da7af25d36ec0362a9a2bf5758b840d7b75ad31da4c9ce700c79f652ef3fc11691f1cb85cd5cc862f276fddd6cddda9c2acb1fac4db6d9f91cef800c3cb66674b6c574298c86517e9dda37a708b5626d7cb3f0b902d5b79659598d08e991f474a2f408bc71ec2efa9c8d353a61963438ba57e01819f861e102cc04def7824ce28fcc9bb362118d23e7da605b1a7142f68e9ef9e6f07e39ec6f7cd408ff77a5379fe85edecc851a7fe4e5437c8762928fbace3feb7dedf961c5c1858dc91635025cec7521803e3529b8474fa910b2fa2163d635442d00d20f08da5a4eb716d89b67e348ce0ad62c299b3a3e7cd05fbc153b887decfd2c278dd3a3474dc25537d79ea2dd2d89a5a0fe79dd6bd4760a5cff3882f8ccb4a265cf850e4e04e0a9ba86998e1fbe74e6c76139968baa21a4405e85e30e8082574b156b8e129dfc40a11c42f57978f4a6cecc52b7d0d36203d5fbf3e0d341f2be0b0a16aad93f882f7491044518e251c2f3e11936b6cd04f98de91b8af3e4b85c2105c028f45bc7289ba193d9063a91f01c6a51b4094235c2730983cf749476e6cde6ec2c589f960aa3f8ee24f18eb3919e6390ffac207ea3e5c5a6b17ae2b840c265481af94d72221f95f1400bc0b1b962607fec34c43e8cf582dc2a4a82de61f8f2de2cf872bf1d27d09647d67dfcf7666dd758449b22a20cf00671c1c7e5a5a678688cf9d10bbf071c573253f91b8594a6cf840424b85445f193c82c94e6f47f78d91552b3e824c5de53cce4f807f36411f3b3b1d195216f9148825151690f386cf75bad108dddcbf86f47cab83ab5652bc35d0cbf3214d8c45616ec8c6474360addfe01b33fb4eb97f085d95fd006be1a0987686e0b1fcd6c961b5f233e033ebe5d6d3ade8a5ed4df5aa18dfff697b3c0d441413449894f7751f54bf7a0623923f6aa9129523c73b99699697b1347fc09c50d72e1ad006cb796ceade633fdf0b3d7fad50240f1ef15396c369f259cd74c9675ef83cee0fbfab9bf56fb5ceec56fa43789ed9f24f45a37caaa398de349f7500fcbcd353913795234299374f16c1fed17feafcd0ba717af25fb93af79036856f170ee18e13771cfcb019c7b1b91263fc6ede3e0b7203dffb62192135d1c0074ac9ba4ab1126b8271a880444771a4d1c9243030e029a7c636e327df4249a1b37b98c43c06269fc720bfde292617f315ef78b6ec67f32f034b9fdb3a12fc5f6d3977e4662e8af6941c71eb0d474321a7663ac6c3f37fe2ceb183383ab0c5701771b99678fd7d6ba7da593b783990f95af84d1ca6cb95d0f9d764a9be731d518fcdeaca1dd1a5f49f352f13e7172f0d273b40f77d2ca8b47eacfdd9d1c27125f661239ff1e254804a95ae757ef9c85dc4dd3928ebec8e9824f565a41d14d783d61184f199230d64ef95d27b15dd5a14c0b4db15b8a6df7352c6b782c5dc57147538ee7fb2af9096e553fca00ae5c33734d9a36e3e2c0ac7bbbd5600b5762aac6ae395ef9139fc2d3890a02c66b85658087388f3b2399299a7cda76bec22742ab01055ed1e8388f632f39fdfbaf80eebf8ac1b136fec7aa02eebb05ebb331f0e01e34259d293a7104724c8c7828b12635d1cb3ac0585ac0ecb4a6aa69152cb2feae0a43f79b731e73a79bf6daf6772989873db3083794faff695a140a1daf7fd09ad41c5f0a3dcd689b802ffcdb4db0227745180c5f6c6d9418092ab70d9f875a51757e3a6edae7c6cd56f75909750fae1ef8c771e02370e5173f6c1f019175908769b76853c703a9635c26c8885da3aa49eb02b99327d8627eb8e2e4729095375cd52fd4360f5c5ca9fc5ae1da3864439a76c9ef433a51e854221a7aa746bcef38912b41872815d610e5ba10e918777a84b6703c4860e512167a55d5355e2ab84a0d41b312927c31df6cf048069a96552a72611db810911b2321bd20d11c0d1f8f25c8e899c582c1dc8a9291c3f055010676264e46c27b24833ab8a6b8afb297c2d9111379c8ac34757aa912e0c13319c1f5d53a9fd5704db5a05ed18a90cced579fbc87c3e04c125e5ea79638486aadfc6baf71cd5fb8ac0a21245843b95a753a5c6c8b2cd1c0bd489cf0e42340d19bbc997ec9d38deee799e3e7bda8dba8751587b67deec40f6f361bfe290c841107368bff267f57a0e6ec87119b4de23f622e855f923b7298be61f9632cde9143252d7f46441aae9e41869f784bcb78a50c909a0a2dd498264462f7846d37cd1c6fb0ff3810175a8331aa0003730f2309bbd18b6b51e4f458a641c68dd39abba7a1abec334b48e3109bf424401aa850dff99c37db87ca6e995384ec0a1707d1db82d91dd7e7f3481fabc50b45032bad4e84a27e26f5331febb74a71454615823215dfed37e99bc301540468d8057b82e0eec7d919775770f4eee54cb9c140fa0e6e52e0d020e1b9a8565a041f32d519ef34f41b7ce9dac62153235b3f040bd2a5f2269b2295ea8e9c435bdeb3420c56a81a1f5eb4b2caadad246ba70dae5c9ebc0f6b5e3d52a49cfa012831fb8bc013b912bc372d9b2dda211dd7e7cddba0b93dce3252097378b623267eb22eea9c492b5195fa6c4b2b24a03b7618a9a44b1ee017bbd64c747ecc672289141f46fbcbccb7132b89eca23add6375857936b7e8d1b8bb27ac63b24cea7be5be61bb802a28a982a7f7e8975829d39313bbbcd60915ddc5364c72eac7274c9471f869b40be292d903d0b1c0f573a087b11f281baeffb89eeed3107b86f05eba940bf256a3b6d97937a3e1d0135a5ecced4b1eca5a5c650ac5867efea45a565f51150a3ba256dab0c35713435ba74634d0642f4463cf00ae09978a37d9ca77384fe56c8fa9fbda312b8e47393c11800f79e9e67ec01fbe2fdfda3b3f79edc13bf7b7215481bc17883f26ff0c2c3832a36c348a4b0d82e82d5fcd1692e6c0a47a6acbb5cb95e6d796a8efda32b5bc43c250d28f3777335fb78f4c0bf4b4ef82b0cf76fc951f4b039906bf8a4ffffae0ca805c55b31b1f6927e7ce88903c323ba5771e261d519c09a0cc3285927ed814ba62d0d85455603445995100fa27ffc8cd17b73a82329c322351e0459c460ad8a890c5b7343c89bb3a286b715b205eb7d131cd2852e13db7531d258b87ccc72e823bd1f42faeeff35840230ee7173eb30c61fe812dcf6429aa1df1e63d7825ce60e47586043d0db7ff2bf198d92b017123744c9ee5243d3593addcd07e81fcd2a4fcf9a50cc1483f00c87fc4c401ff3dd77ff61179d383374e28abb6afe392b8989dd27870fd6fcdf3d4ff6ef48c18919dd539ab00782a6141980740e381636d9f7fb65cf7b5c0941efbbf0cbe3018b415bca5f9aec59d187f92137b3e88482d8560fc1229637402b1285b9f543945f9933f16041e926a6a7d5bdbb16b2c3368f9ffd82d10d728631c0c39e9c8c723f732af660c5eb1234889230a1bfe00a272966b10c744d81af07230df97d6cfb7eb7f520326385e6f3106a1a58e4cf72d7c4199c8ebbd2dd844420722ba73526bc23acdde2cde7fde4e3d74580b00bc320aefb7cb248599aa8f0028d19b1ef8ca811132b0625167e4568dd4e2725c2bcb8a80633d4b06b9cacd68576bec2f8ff83093f49a153e9862832bdbeb5e19bc6049309b7f65e37f14eac75ef52e627d93b02950c7b66e61ecd47fcdeca6780f6764ac54f12560c77f5d8f44f325f7cf84baff2fe71b8df3e8727e430368790eebc8350f7838aac0ce88a66f719ad31a4d38710d4d73d39df2e08bbafa8dd17f1c6da7fc54eb6151b2b288a08621d7b3bfdcb9b34fa29c5fca6446f3f11219a5868793e7cb95f333c355ffceec65826f970241b1a243674872c814558d36ab1e88a2497543bc3097a4787f815d53c644db2bdd666e398d8fb60837808c83cd4b21bd7047a777dc4572f713d571b532fbc157582304a16cfb182c218960d9bb0ab61915a6948858b269de959123d86245310c9d026888fa471f8f1a7920c593ee5154171cfcec67cd311d3a969f31c44c76ce78f3c492487e0014c4b9205c65bb44e3df5e74af32fa3dee324eb2a50849c831baf085246dde094df04e16b248c3b42e53f9b56553e1d939579fe889d7c81b9fb19920352ecc4f72c43bfb917ab98598f5ffcb2186827269e9a6250d3c1db83d4329367a80901244440e565b5d367c6aff9813251e8f21be50c8c78033c044f4a58fc9411c2d468d4641ba41916944a0a0967c63a542b7a9141b131e78f49afd28e2b3f5c4c9cb681a199f9e45c69da8530cb66fa9c611a2cf6374009b1238c51faa8978bebb3412c0120325d7a6d94cbe44e1932e79390b5a8c27cc766d5ec86a78fc034a2a9d6e43c31f5f0d7bfc3a777967f5071923d6f3c6e6ca0f774f753b8acfecda3d54e15108b74fac5b28e13b10b49b52ab29b6e45db67073160c4c04b87bbe9a92d2b1d612d870a53e8c1fef9bbc38868f2dc7f3b30e663003a90b9c9d5871169904934f394af82ef3b3ad22813f97975d8162a6e9beef15d52436f694164eeed05836ba3b86684ac203598a67b0a9c081be8a530b89da8b077ad6e760713f5228a12b62cc6c8efa95965d236e30a9412f97525795635a7ad9b2d5ca157f907cbbb0d3f0339dd75b79f3bd9272ca0c1ae4180ea83eddd490d8a248c9dcbcbd84328284abfe162ec49a903af9e61ddef46f416c0769f319b762c2976ff426448dc4a08360ea7f63f393c8c54996c63af9a2557b61bed7e243475f49d6b020daf72cd596f158ce4fae517b821e2810c61a6561e0c67c58a48c1e8a2d65f3a42be4b4884c8ad35a5298215d9c78c37399908f914228283f4de9ff03a47ef7c7d66a162d85ae853920d20abbfbb0e7649166aeb51ffc17798e7b8f5cf75a94756a30b5532275d5768d8dc3700847844e707acf2163b18d161d77d90929e2ac1643425a3da39fea0d211ee4f52ff74e0b602783a8559cbe16e73b65c900cbf688a4d452fc87a1e1b36811636e5586a37e3ace6f32714970e4cc67d86a50fd5a20c39e22b19346d520461a466d6b4fa52b2fba29bb24fe6cc4a2de31c8dfbd6f79988d34736553dc2ff14339ec63858cbfa7f693ab5001e40846172fcfb6059c8fdd3dea8f080804b27ca2849dfd63c9781572cd82c09b40f067adcbb41755a8f6599d419a844059cea8e6f8fda0d1e597a2c52942db7c6c59efc33ef3287cccf2fb8746b4905f7f40c964f656119dee42d168e7505edaf543eec29f1a07927085bd231cb20b6f45f3bb6f4d702e8db76e7478edfef609a7e7bc6fb36556effb5dd0ea68232782ed5d006707fa11e6bbfdd7729bfa8406e7335b693e3a4e50ffcaef90b3858384cd85b0e03697a254ecc4bda7ade8afb2b2605d7bd99f4f1e9165745d6af945d7891d3f9fbf26ce664e13082c7bf7975c01b17ce3d29fd889e2b2cad1ffc6319e825c8a020fb11bb63f5a6d38f5eba0f30853ac0769339f56b04d38ce676a926e0dfefead2cf7c68e6831d5f93cb9ad12f6c6af902dc8b469c16ce59e8d0be835efbe4da22f0fadeeb0f63e2a763f70f09554fe4275d69faa030ae4674dff352d8455007438e58e6749bb712d6728091107d87423ddd6d2a6002ae14dd4247b9e53a6c763b02609c026687de250d051c63e28227e2702da225a32a9e7e0db499f51a367792e6d3603c2db04ebcbe4bec7ed197869ce4deca40bf5d232b54f6763d88053ffd30d85723dec5a3bbd7e6fe3accb283b267141dce8fc5c01f6c66ac5b49001c3c7a5623ae8774402e2ae8c25860b9c3e8fc957f0b876ce8fbb415d6fbde3c296e37bcd124fc73ab907a02e62ee00c10c59c4dfd50dde373372c1050dc93fc502be87ee0a4816ca209fbe7f72ff94b875ce7bc6f1cf23742fe9b58b0abccec3d1f033a3704b820d1657eae2e88db7badd8b7d3e3aa0a8ea294ddd5fd84b49c19628bd74156365d47964bc6e6688ff78b4798049bb425ea6d1867adc613eb3d95778a57fb6b31bbc842fa238596cef0393fd28818e20660698407dfb1bfe2ef5b9c63bdf51b0caab9aac0ba0f0ef4ac6bef12ec63dab7d70f15ed9f22fe27ee31facd064900a2f3344826dd7a17463dc0792addde71725ecae8b373745ab61f48ce160017a64710434695c4178795fdd6a836dd1bd7eaa3bd479a941d08a2a4b02ec1ccf75b49804087fd8cd17e3286098e4b3ab4281e7e4a4c2e0747e95b3d7b19d9e4acf5aaa40c9a2e96122e3683fae7f6716b7cdfc8fdc87662d023b8a847fff44d02d437eaa9da79c2f34c25fe4b8c3fcc454601190fbe8aff704e71492bc22f1c8a46d38bf079d4d7d9115da029598006533adaaa4d5012b44559cdd23ad52b5280ea763ace5bec179897f26e4bbe487a15384d6e597d5e2af5bbc5340895b2a9da29f5bb34bb148d38ce5adce1a64ecc1e175c7e711aa1bb2616b2a052edfb267e95ac5b78751e9dac6b54497d739d44ae546b58306326e5c1cbb4ad03443fdbe01b9c2a47a63ed38a5ba7faa248b75596034a1fe14b541b3c10491e3c7c2fac09b3f87f4bf73524fdeb815e2afe5fbaebda600d808f669b3c3d48da24bbf20bc4b4cabba180df386185462d937904fabb724df40424f1bf5dc0f73ea1a83ba2825127908b40d41b699a40011423011ad3fdff80e82b178bf78d68892762482af564bab8694c0f11dfcb3b56d8527fca1bee0fc5fbe4f84ecbeec2f0728f76fc32acc1ee8ce4e28d0be2cd118ff92565b48c7e1efe1e2c7c2e2777b3c8c26379e47cf0533cfe8cd1a9762070b996b31515b5cef7c7883e306a82d24f15d8d158e425465647633d2d56df429d0fe4bbe021becf627ede6173c37b3c599ffc5ff91a1c898805d5e85c3615ab3d1fde84703c37b9622b53c9d661626de44a7f307387be77a61c8744dd466217c45e1e44f24f438e53ae73b5707de9feef0d546780c38c389369993d70021c58c01e2b8cc09d97cd3d7b47cb26687c0cbee2c98bfee08d49283021af06752023f4f523dfe901a1d3509916f3fe31ae2ae21767e0d11a4631702f67c25361afcbeb01368da6b02ea98bcb2433706cf9bcc5f0b4d50300a5d343da6f4276e37e4ca57d71ef41cbefa9940b34e5435192a9b4ddce937ff9125511b7ed760b81cc256cbeb2443709307ff55e03127921cc1692a85eb4d0e32a727cd7e4c762c2701bdca85ac3840b3a19139f997dfc5c5570e5fbcb6299d64c537addf23121772e8f46e18de100569f268978f5704c7032465adff57af5d35db80644a465670416c586a65e696de798406aa3ac1999ab0bd814d41917c3cb9363ad738787ce6425a8245882ce430f5e3a3d97c6a065423eec70f644364dc53fac7747b027af5bf860860ad3f49ec37f4b5e166abb2a6648db6a52bbf0d7812b85f56ede61373e6123631692235c96af8e3f6a1568c7e4bb5b2a27f7c7d63e1f91078b85bbc235b156fa637aba45c4e8b7bd1f78fba9a00f98f37732428e0d88626558eb23e628da1f5cf766625daa75602ce83e6d5d53951f6191863e704c6bc26a5d31ac759cb4875d6818df37c48611f0e03c8d90907092bcbc8e3d6a49282dee176808614e099e589ef788c82f53a14ac55ee8cd60b38df2296395467b4b11cc4d4365504b71e9f4018b5bfe44018b3f403953356d01d1eaaa720a89a2f0a8e866e6a402369586b00fa8aed914153d87700e1c9269d6e40e701888c4e3611d92f6f407c5651e60438e1e20eea0f09442cdda2721025ac47135e35ac25aea5508e1e6d408d8704416992d3fff1c6cf2c75d1c34120910b5214bfaec8e310d3606855225ac6de33ae44ab80d301b7650a4e57950dab7fab2c04cf29323ceaa55aa1d1b71b15c2161ebfa5bce88bbb62a8e8f0a2008d95cbafd2f58b13f6b53ee0f5f8774226406fde8b9f2035a9260398059ec2a4afc67ad42a43a03939bf0d533afe4537fb3982063bbd117b1869a537541b6146faa08c5b4acd8f42d364ede60fec7ecf381c54cdf20d941a8f7d3dce9af9b6fc655b4788b191f18456af233ef58683a49fd26880af91b5a71d5ac4b5a58a57941101e8bbb6782d2ce1756463f1161f38accde6ced09505c191d3192ea96959ba1d0cad1b791b07436f7c4a7edd7d41eb94a4d1bc88cdd5a005b6e34f2977944a31b2d166352996544fd5500a10bfb71ad848f29d7becb2e264e7d5c8d69b407604fda8f62c976745788a9590241ac7e7b6a78990c3061978adc607554338bcc9fa96ca7ad94b8b38556e1ac0c7b0b374612940d6be83e71bb44099bb9f473c17489ec19dffa2bd79c97be167037ca18b96e7cb82496cba90652b57e9f89a45091269746590cb054f406fc8fdf6a1681baa54e6e113e4e10ceb49d8b4addad784ca4f3d303a89e7ea8e4bbe0d544d6d9c4896980818e0350d3433287b2408a67356825f8e31f864be8df246643e351b1849b2423b9ab5f1a29ce692a4c2d5041770e81f2c69ece00eec55d599f8ca1f05e284d7cc2b905049836ad71a02ee020680025e4091f689623bbbc06a26d87afba09dc54ab46cbfccd44dc26258741da5c524a1c4c35f32254a82923ef500b14471c844da25b15968b5a327d8d0524b0860dd55163c0b168020216cf1658025e8e36a2821e67431f95ea9531ce7ac7d219b5a9905a628a209e693c28b511ab98d790b835867206e565d2475fad2886006654611f6fa2950a4e22c98f311290b9b357993774ec1e999473c3ca9674f34d7194733fbca5c9a91b3ec5dcb1c1f310ec48c74ee8975074cf7f34ab49feda228e10e8cfb927a2c20b70843618b71c3f39b265da821546908daf1357c680051364f6fb59b1ab8aa6f51bfc909114fb119e3c3e9f7bfa056051b651c2e4eec061e9f48ead5f7edf62bb4da28d489e477ae9a964454929d2b9b9a98c356e2411af3bee2ccc0cce9e3def257bd98dc942a61d5cf20fee5ebf6a9518ca230bbaa48818b098e211d2732383f6386feee8fd193b8fa1eeab98ceb218fd02f9ade5ccfdab6d294356f8762a08d2e8935e2aa124fa4d66f3f47165f35f69b030918313cc0fb5327f28d3551b9e4ef341adbc064a241c33642b071499cff9380b5a53d098cd453360985a84d51f8720a04901bce62a73cc97eea468c95681cd9f09c75f107b97787d0a21f9b076021ae7b0f4a8dfc29b8db2ed7cbf45410d0a2438e789fef09a4b707f80f523ea689d13c4ee01a72208ea974c811bebaf3951e928ce22cdd1dc42933630067771df34dcd52b58037a8ce7b6d151252951df35a66e89feb1ba988e9f7b71f0fa2b3899242509a5e01dc4f01942589614b7dee21b1a42d5d78faff21fc785cf785648ed9ce752a1f7096db6c7da2facf57f4b25ecb257174d34f74dbd82b84e334b8c05878e5427fc6835f550e61869423ea253cf233b4385f228dea20fb93c0cd370dfaac5df3036797d21af38e2514d90ef0d7eeceee4df4c2432506c7e1c730978a079b1f57c8563f13460a802337aa37ec0f38a2ffd72a36e1251e99febfb2d6ba6392d8398dfd3bd974776f731e4e064f5c79cb2246a38b97b17fa7fddeb8b042f8bc9e7d24a1ab807cc32f51062afafb560caa39f7cfb22d10d58d0a6a6b48eabfce3fc4792a5ac6c53993a07931a1517d4fcaee1a8c326671853493728f336175432f74a5e7d7bf285abdbd1075863f8a969bd6ae388a59185a17a0b726c87a828cde6859cf19a610b1f37ca1fbdc08b00350a4ef49a8e1507d4e749c29c1b580abce411a5a80d663901598777223f2d0069a3104ab6edbe6db6f127a72cecb7102a759ce2ffa3d042ebfbc287015eafff100095d586a4fe9a57164c9d0404c240ec5b7fd2170a0553fcf8cbda0ea4bbeabf0fffbb9d608f8f6035ba32da635991ea3233709b764937425a34893bb89cbea9940fdddea0c006e0692613b8934cc7951c7d08f4d83c9b9a72f05767c788076432f653df342832690cb98ec03d532754710d792bb03fc41f48b48e0f38efa0c2cc33343ea13dbb40e05d44cb7e777fdea8ec6977c3939ee07cf32a389f7f01b4b8d391b0d54712e032bb2abea96152b3e0900ecf977c0532266096360ab566956bbca81492914319582fe7d893d72470c9a31e6093728143ae30392366815f9c43747da68a5f781dabcddceb1594dd636726dd9bf7dfc7353fbcf6039106bcacc930503c598c3e198eeaca833b99cfa000b0e5f70e924f31a4b9b06fd21a4579a5579e599b17eabac0ed9490e6a21511724c39a7e668d062d2742f041e32572d491b719a2b0a0f3f50e7b79bfa4b566941fd1f5efead09283bce3d7a696e2748a4a6a148b8616dd26227a238496a1eb8d5da8116e7a3a9deebcbb3f91ce7e69cb6fe39497ddbd1e73e51e7a3de9cdf5aca1f64b1925ca7b5af52de85bbc8c83cba41fd9bd358488467313b5af30abd9a7a102ebc69ff007c1343fe0b92f0ed219520f942b18101e22280f4a2cb4be20ab801e683b07566b28947461ea255685468d6be8da8bd749ef31e8f72f5d482ab35b0e3e2ed85df5da3c06e21ed149295054cdd983efbdcae5aeb5dd8cd29082eb76e5ace2160cb2ec66af26cf8f57be14f2db909fffa2857f33eb4f49c485d5bcfe8794efcae8d5287542077043597a7c2ac88baf77916b64058364d1883a10b35081ebd75bf589f56df211bbaed5238a52a31a81bf97a70a02241162b3f188c9cc46fd8812bfb38fa212ddc2e7e0f0f3236c3340ebd7f3d22e3c59381c7f283bfc22fa185db96dd0b2a8548560a4463556d8d4347e42e264e03d1dad082416af612f782742340a053443879453449bbc22500c100e07c53e1010c96b7bc310c5407b827c6fd9306c401e8a340c12a816937ad8ded72ce0257aa2123e4cacd16998df3798d3804ab7bff5a8f4c4dacc76fb794cf8a71105833ef35805c7913a50dd78372a61f79d163b7e98e511dbcb5aa347c80b04773be5d1ac2b0fb9b46c496bd01feab63f44c9731b34655a26e81dbb857a323db801872330dd39b064c7a6187f0d6f1a804de549e6336bbc137efa75d29946a678a447ea8f69bd4c0371ab392b77c45114616b5c8d5132ecba0d2b3bd6debb9c60c60dd72cfcdcabc3bd52df44380c692def3003b041224be775e2f25954a8531b8e02f9c6d7a23df1370dfaae590555f7452258ccecbd471ebfd322b0c27e07605573424fc0b3d857e2d4463cc2c398e3549bc89a99f6358ca97f2e9258fd6e8cd8e66dd3c9132220b1dd214dd74b74c6e3299c6547486c8bf75eae3013c60975f547ade016bf628eaa6625736f1816284bca08dbf8deba2e5aa7973bcdaa599510b2afa7a4a09069686a75cfc97490dd159ba6bec4ba574fbcd45a533103c99a632f6baf0d84613bd31fa3d542bd6aafe273d07808721ec4c5a938b5f3b30697e3f979fbcb76cfae5181d66824a83d560cd5c98d4584725bcb2ac53cf01e407f7f646a3f267b0bbb94aeaf791f357854965e3a574b16807ffbc9ee17936e7576dd025cfbc125759864657e6c4d9ac330efd23f308b7112167c3c899ba9d169ba2cf84e395006a872d7b5a628c49529ac1028255b3a7ed3cd2f697a3afa92676182ef59b2222618554f16432116068b7e7dde2a6e1cfa291dbdf8989647868b9b14419049700d8dcdaf867c794387e4dcb1e272f9f49b8251d3e7552417ef0fd5807f7ef38720c5161ba1dd3a187c903f6ea0ae50c7a700d4ab9b3834c9c7aaa7ea78d758df7d8e562d5ac16b0695ae5563a3b6329d41dbb81af17587f00333f6cb27faf3554c300c5a5914930d934b3b5b79341d246f4cf1a65f67405b3df413a7f5bc475473214fc5eeceae7a918a3dc6a53e7b55315d5598d9b0a9479d56aa143516223ee3a052a7c711618af67547680fea3c278432973a37a8fc56e12b695aa1828ef8bdb6be00f89d787558b4e9597546212ecb2a6d72239a9463c93ec5eee27759e1a19be9f2cfaec8e54c625a9777a7f9589a9175293c05cbbcc6ad416412d6586e89d4e9c89e74e28103620a2b087ea3af1cf515077727cfd44ff9fbba9b50672a3e4ad96dc749a6ec8ac7be298f94b90e9942feff41fee050af15ca978a4e7ca7c21b5af31f7da83014af797d4d303b99641783ad43166a2b2446ac234ee4aa30d54fff9f9471862bbdbcf87323492da19a71bb3e82093341be508b92f2924329a33a34910a034c9cc05ab53e55b33dc7425793d8e6631917fecc28d34e1dee20f233b03c69f518f6d27f4f614a661ac04e2e0ef83ca521b17e12a5aca8dca0e0dc3409a5b6c993f037a460443717762d9ab06cbaa0fe07283c0c0b4863226a8f520fce244be3c6a3297d10b9c3fcf696ed231d79f232e10a7183d5cd804c153b68b4189f9de665f3b9c9467647631fe7e3a97ef31e6769a6324056393420bb3c6c13217bf4bd34187238019b6897e3c81a6b47ef7c031a7b7d884717f18d0dda1b99510f5b7586d8562b40cf1a671acdf209469fc303957b8f16a5ab8d95ec968feb227226060fb504bd75254d60a027d23c5f50b11691351b6476c1bb2636a8982ae17ffd594bf1f2bcb7065ae6d5c0ae89268971d84fa5f7dcadd865b813a2528a88a70bdaf347cab3ccd25123c221b5b195c5fba1c53b2cdf57f8c7aae4ce3c313f5563fdf7e42e6ab7c3dcf894614c9aa7fa3cb3addd1636c8aa49a082a7d2033d0b1781ebea0f386899f592a36dff1a1ca453d041f94f64d58ec403d0921a3ffff117a727dfb9f124a67f06aa82575c3acdbf619a409461367fdda167fdf9b753dcf2d567242bc743f7fcdf5ace48065972302fd9b8eb36d9b00f804ce5b8b994b65d72ce2ca8e77de8a174fbbc15be42856d2b3c3c1b0858c71e1f616f0d565e86ba28c3adfb108dd52546ac5a6ab90942daf4000247d8eec984d99bae444c488c2341a1a84e05a9f82cfd6d3d706eaa314d4cc675255c1f873d10b2f1999f3071f3dd384e7003dc12e429f027be1b3eb574edf60f18d8d93f0536071b86d3fc29cfb1c0ed6064a63ca4f76cc5c93a1b7a6817d25ca82dac442bdd0ab4a497e6289968d76c18d3a9da7c909eb8244eaa7bcd3a9c8ad4876ff292007c76f1975721600343ba831f1175ad02929a390eed0fe3ddf3c40b28a3f485d3a2c7d452629542518d9b270f000252d9428f1c593fe22cc984936ab67f36fbb0a775d51f59d01e8b604fb7d582ba41cd7125ac875f14fc8f2384c33f196f8f0a6a4c5b35f1e12aba801021a1052539fa40ca0e8a378c8d5aa9f5ba22628179ecc701d44430e751b0f47890c5295d2913e0dd8f9134aef04b44da6603b4758d1e4da7b87db5d1680756669fd0c4238d73f3ee62a9e2649a5bf68b0b10c468bf968e7700fbb558f5607956ff34161b22898b03e57b6488c75b1f047f5c87752e3a3c8d36cfd2d46940292c1d47953f257c321e912ef897c730cfffcf7dbbdc5711335c8386f280330c7ce23013ef3bb48220cf97d6253e87626ff8e07b74943571d6a973436a47a8a0cd47826779419d8f1fdd4507871fb00d596026c508b3dfd0f8618c63308fca03b76d0378972b127df97e2c892837186822239c6f719036d9e761dc6d99b01cf86446a7d2d474ef085e74254e589065a59805c2e8042c17568a75f7ec3d949ca3369ad779248d45a9fab63c59330b7c6524b734f6354756583c378741ea65c6f661e4f76d5ff8acb47546e6d80af278f2b8ac20dac53ce8fc22588aab7aa7cd6610ca6edec0c5e4f41ff75cb1c58864f5f593c591806a2e98a1376f1ce68fa028e163e4fa13dc4c53977f01a7c2bd10b2601ac6498fe699bc31dfefc3af7aa4f0b145362b95b718bf0b06e57db346899a53097c4f90f8539b20d0483ed48ec2297183787f30c5e08a78ad1eb31ecabc4dd54f289a97ef806249a3e5c0a4ccbaefffde76cd69135309e42bc310ceb1a703a0df8b8776f5bef09d32cc58c4be8e5462234fe51aa2921685b4a8a35cde03a37ea865770a075c79a1175091748e5247b8005aa179f4f4c282c46208f754e32a989603f6cf0c2112143ff5d9c98cd7b8438df162206040dc7fa236a4d7fcee86dd9f2d91adbab205f9f56c028dbff65ddc45464b9aecb1315917fd07aa402cb46ad9260f8a65e2284c6c5cc28d5f0b791a70cc053ed3d288af8377a15d681a5b3d4fdab8f81932b1b2aed73ec4aac5b16b57fd4cb603038f3b1bb1529fa9f303fe71714d74d559a60941f8bdeb5a135449e0ce8ebf17128ce72367f9cbb048245c49b82c696d96eb984072976608961efe098cbd092c465d8ec12da1cc87dc002e7d7109b47a7ae25953ce78ea0fe630371da2154d643487cd183856fcc6f4efcc13e2e3a91ab84491cd7890f465653c61f09f88f91da25dfa443bb7d0d47e326122fa4b2ec5d013fb80e3b4872f9ccf137b8fc6c58c1a023591065f24e4617dcf7b5f3ddfa40b24297c71149473766cc7d30fc04a4bfabf4d4a33ed232cc2e7bc65e16116e9f3cd760c15ee0d571954c3449c5af7dd0dae273e4bd50a7f8e1d3b381f2baeddd3ac8f7e89e9d5fe75d538205cdc08fd3c194c6276c2f488ff739e4878f72445ccb5091a3142f60a59e38665a7a1ceb3f1c7bff0cf047b6f7bdcc66aace8f3bc47e25b0d4f3fc3b8f995fd1aff93079019b7dbd6d03f69620d420c9f541f9e93de3db5d6123e1591dd6d0e4b7c2fe729f1cdf3940e31b8465d2212b419d4efd3c476a3793d1d7eab55bc6a43f7b513f83046f9ab9efad3a403de765b29c99d3e66bcab5924451f023e3e4e0de3850ec04c3f7da647186a72950b9a7c4b84122a9dfd358c64cd06a813988b5be5d71454b8abb8d415d73796bfe873f6f8c65c7bbe9af21b60a72452716d14b67fcbff2fb26dedf31eea88fd09c9b48ce5788e2372249b298a22f39052f19c1f4390de2b49b4dca4df450d84da966fdb39aaafd2fe630555a4e216b4d9000becb8499da87db867665a01564dddbca5d7913668672ca526cd3fcbdf7d76c72e93d7c5ed03d08e3abea7a06f15e83de08244dc4f52ffd39592f631e599612ef83e9f48fe3601e3f5a63d897ebeb92f711ab311bee64a9cb9eb1154f078f580c96331679eba5253eb7180b8dd2d59958952a7163c3ba42c12400593dee7f192b9c27aa559866a070a6af2b3375af3eb08caddcf23351c4c6c9b987bac5e88656fa8c868b1b3b80e8f43174e3809109dd880abed5b63cffdab5927d417f93a3c9095268d72412f662c1c00c9a357e21ede9e2ad2889cbcb6b2a19f8ced00c9cd34a841d5db0d1b9398b5a055f34e22fc9138390782ad01ab2bfd208511bf8a4c6bcded921d00f28db6687a131730720b3865d9215ebdbce37a4bd3c4f0d44b3ab7341dbda301072dac7293d54aa59827a30b719ed3aaba611b31ec4601c3f7bc55ad042bd2ff863eb1374930fdb0120c6f4c7dd722af182493d3ce87968ce58e5cc68abfb691d343b6b4bf926043060b5c16ab458213521b2a88586be3670c7a82ed617782cca56682793be9cc02b48c1a24e6183c0e21f58b3c1a44312231d12ae9ec3ad3c6020728f92818c79e206e7583012053a7650ce57c836bd52cf1c19c2d0882ef102e676c091df51f8f8d8b5aaf680f06b3135236b8bd2ddc77645af084037c5caa4c4c1cc9bd1a9af192964810b4b3cb78df6621b29798737df05d27876452b69e82785b5999ed098ae6dc58ce30c66606ae7e5caea7f65022e7767865f1d27cf816d7fd7b623ff40fdfab4913e614362cda63135fb9124243854ef65281264f23e390e9ff1de2e22448a53362ec4e983c1729c0538ab83373804879e8a3a479ec40e4ee939729bff5ad83730a5773a84a83407d79c403082a69ec826e502585835a442c51737eae9084e17473aab8c52d346b4c6bc5a155fe978d8b2641e6a694782e44aa68fc5b3e94965e41c6673b3f7a97018549b7b018011a136e8ddbd99af677c5798c4f0f8fdaf92c896991b2ef76e36b75a20dfa8236e79b7073fe6343000394822ecd0f39e9e86e4f6902d3508761a283f7c486100f6b065537099e38ff8e8c3bc67cac1fb0279a6b4ed0b31df53c081f79e01d1d874a51c23fe626cf5fa6ca09c6f314aa223393cd842e4a17e64aa0b58a675433c02da79aa18c573e3ae9fb226d81d4958f1ae931537df44227939f017718c0864b8dbfceb76e03b847754cab646ee8dc76985adf5bcc259657c1b27f8b93fdd6dd834a1d877c81d308743a9e080ddc2759201bdc4a4b04626f45ba465a255c10510c954c3768c4bca894a5ed8815e602afac554a4fc859c9d1706b010113188eda3cd9e11d133280746e9dd87d7f845c7fdc96bfbef7852324ea16f472da5affab71943ea61ffe9c05561852b23fafaa1e4febaf206f7fc4f04e27a32e5d6156a73ff423c72949c65963035bfc702b6e2b7ddbce9116cfa79d08f216c5b6901e92a9b8bc138d81f78d7698f2398b426cacc89a3e11a636a0d2e09ba67f4f15d15bdebee2dbda501ec70d37ca5db2dcb11e073ff480e9d50171488995e46e65a014e7ef223925518eca9b4af239deefa98ffcfcf55b6551700c8007c371b23f81bce8f700bf26ef12bde59ef5768fbd66e3acd6bf8646465e5d1fc94fbf81a7fa6a4a8aa128d901f8620231ff89c174289abaa51466f30e4065a6be8c6e15e7d1583e01e78e48683de11416199ee6021e0961d91709a37c9ac4b8d3940b3ff676f83030f2182b135820e3cd3a40c06b89c10a8d622347961cce941b91893a1327308f5b6ca2760012a3957901336e6a4a853eabc3498c17b09f4e09e8bd98e297cd9279162da51608552f2d2162d1fcc022daaa4f4adda9ed8bc8f47e2edfd6e2fca90bc9ab5d23377f3d0ac40e4846cf9d889d5289644cd94e6ae23216cf59f29a8e2a2e07fd24de6b6514cd97750539a960b712e93cfb33cccf7f45860a9308e7659a90578960d690f6a5256c01567f6e7e31961f6ce79837e35fa23101544b9d40a7ea2e88bca180c33add2fdda685f89ad7fc18f558768ebd97192064b9d54b5e7da1b256064b9df8304356c10d62251ac95cf5ee30118d7dc694009409472b1e7598a59cea89395513e97032c2062bfa38979464a51f18ed961ce5b52f307455f75c0b5ae5c8a0d813c5ca7adbbca9bc5bc13ae573b9bcf5eedccb32703c56b0e889742cd06114987a37fad8de4f6782c14a7976e23e36410af7d84c4c42e156da96c5f53eab8782e4f5a87f45de36d579c27ef434028ceb9ab23036023744abbe1fc2108c1eb7f0e08d32e1b0b5e9b99e2b94874d7c213e883ef5e67daa17a821af25e564fefd75f9003d390492193b734548edb4841ed27221129da0dfd343e9d3b525ee37768da966d74549908f6fb78851a26fe594839f1224ba87ab3ca7d500b7278fffa2aa18dba8972d4878385d57f480d6dcd4fc5ecee98fab82c48eb0fdabbd1ca8175f5e118500403b5ac7b3c3ff1ae04cb81eb196286194321243a4063b25ac96d3990060a8582309a389c8f8272ca13ecb6d7358f4e1ac96501cad925261342e86b5464ed9e9d7b817f3b8005e382603e59648a83aea694e22a6122a0ede7441a0ceaeebf0d86785119debacba6bf634cb2bee174c8f85f45bfc5b35fe7d961d8ad4eb007037d4b4c83bb8cd1aa9fc19e718c075f74d0622d9c4c9e0bb5d0c2a459c4ebdf787d40b81e0a1e216e71db8de8707cbebee401d8f9d722f45bdc8c081b1ae91929a54ad99a88bbc4d2cdb31d38bfff7aee2b9f396ce16b8721cf95ddd73aedd64e0db0fb29c5427659fbe29aa1fb05bc41044f33dd369a9bbb7a4b134f1e8876096371f8031c089e02f788d74bab043517e921a8b123f8cad3d20d0ee575f38eccb05ddee368c46b87cc6a0eec07be4244078338d308efa1ea34bd9de0341efe9ea4e4ff5bcc7edfb37dfef540389ad557d3e03318d716d8f7ed9fb7074e1c601c21a78b48df32b941f6dd000eeeacf88488da287980380e9b61df9d3b6f483874156ac90d2601ef3b8d0cb6a877970918c185ade6eda0b984dc74600290f10af74a1619f891bf40c0a7abdd04c279b0223a34caee25fe0de0229e5ef37150c2e877a468b11deb816f001b849ad021a635947c48f761d320c090ca8aa72e938f028043b4d32de615f1472040e87cd29e428376f2316831d1be6f862b2598e0cde0f1298906248325b661177208240df3bc911387cd495ed4c1f0b881f929f65775f6e3c83b0000815be116ea553c60ce9029a9278a1047090c5ad12c9cfd5722278ea8bf969de478bcb5a0095bf39a477fe55e3f7b34cec6d72653f5ec7080cd1d023dc883a701149df4ab1f1307ea889eef64a654f696258795a55420a7e43e16c0171aea9a117706de0c960cb061760843bc8ca372aefa490513d15a0c7c7deef70fadb405ecba1b2c3c1d1d3c5ca0e7e0a92fbab6fdd537d87d368f4087146022fce61fd263e61f8779b281fd25c5dc55da20990c6b3137f57156fa372c83e3c0aafcddd17d4a8e3cfc233bcd3b2db43cc3970102e6805ee0652355105275ac3c0eba26f259a683b3283b805b9b8cb3b1c2d8b3a42bb9d5465b8dbee180badd26c515e77053a36d21440c011ba0931fa89bd3052698ebbe4bee39feb707d4ccd1c88367e7b6a122bc3da71b8902d29989d6deecdd6ab1cddc32f661f3e831c5fdeb30f49241c4af2c0dc46205469eccbef67557500cdb4efd0e097e914d7ecab567b5b3ef409d87b88b6dc9881225c0cfa3069bf7e620e24e099e1eb2fcff3acaae477af9affef4f499cf5eb7cf7f7ab24c663863303e8e8504b4e11292602c7a4dd8340d93c3cf9b7ce9dc753e9d8a1ed92fc38a56a2bd45340baf701e38c2c5fdfdec30f5071103a77efaf0faac08cbd471c0db334bdd134fd90932dc59f3afd4bfa4ebf4d6bfed32fd767ea97e132f4e4baa87dc2df5692442e07b52cbef9a73d11c7ce8226fa8992784591c431be580c83ed240c214662265fc28c4baaa11ada9944da37b68e13a760bd6f33d6a3d0cea7e1061c66490f37c4a26d8b6c391716dd847952a42a4e6ec2b68eeeeda913080f29c18f703aa378f1f824afeb95059fbec00d785bd9737e5f08ea06cd593cfe8b434dcd1b7dce08cf8aca495002f0404450ea1a8779d177766802058f5543bd0865bb43f47d936eac89d41f605b364b17607852cc9a83f2cc12aa2ab7a92725dc776637eac5992c6eb9c42579da095d7b2dbb750747ef417851ca5133bb72c80bfb878e2a3e39af9e8d62c6be202d00592b18c44806c13b944cd7cb14fe1d450d1be0bb309e271e4446ad37a6e03d35616cb7bbfcea08347c10233b47abdd23066fa0dff50d8cc34ba55c71a7ac4b45d62443a82b68f7b10161e9b52bfb1f7b1298cae63158ba8d817f1e105418f04f4a4d833a39b911ac5292fd4a09f502e7fa596397a6b395750ed46658f2272e3be9dc4467cc74fe6937c8dbaa6c5e1d714ed0ee4e209b99c0d93177ff80c016f0ea2be70d4011139764187267de6b973fad135865c07f41741dbae9a097870bc8bb2b3e718de3831dc803d68c5f7797cc3213c406a6a2bb1d673ebb1ac02f25146920e266edf6365d6362fb1d11b7ad280cab3135d945f125341754caa05544350c89674058c229ceef75eab7978fa786710cb44fc127736179008e03705254e80acc01986490732437593607dadaf25a93a661da2b2158ce68e07279c677eeedb68bdfb7789c416c113eb9581c0220f1706d4532bea0e0151a327ef352cd573930a85af2635f4ffac82f8af9cba07bf27d60e5e9634db266237c82333231f1657f2153a8a7c6e3b417ea8c758f8eaf05b96588d1d3f4551aee0a6ec9e95151109e7029d3be7ce0ca31345564cb3d369f5ffc140af23f9e7b9a70b13d619f9e9ca98e8521d2a2128a06bfe8e11195291eb0a01ee42adf94f98674cdf46299ca86885d89c652be99092c72fc6de1d746f1e459d2e1e1176c6f7d9e8e7099edafe562a215b9e17aa7dcd34963ce20b1091b0ec5b5a41e7c2dae3c03a1ae3447f52c2439222ae764b26b42007c9f22d80b8772ffa437523147a2dd14d249a396e28ecd35023a53c8fe08db0b1a29b126b3b52b9f584385992666bb12129054a2a2a4cc62f55a13bc6f248337659f7d8c2dc8ae603453e851ecfc29c57bad68ab0d22b16dc22f28291d67c5c70cd1f1c398b3fd5e591b4dba953b631d8d8c3fcb43d201f6953919d55eb7904b4fa506410824921c43e23ae9b564c7934220cd6220523e5ba1f624518cf0289d8c6892587b1eea9d314c8f861f4d549fe35fb7988cb6d8a63c3e16b9bfe7fb807fa9456075a2bf37d351f73f4f4de6d9e67baa79bbe24982517e3fe936b3e607de35ffe98f827209421e31aad2eb5b2f9f5a5efaa97300906f1610b2ab2a18544443d4a965d9e69eeafdc5db36b1c59b1b2c2b7d5aafa7126d6a7cd8367b9bdc23d6299cff4c26ad0ff504f0175844687c0a71620d5bae28ca63382cd631e3be0087f1bc7bdf3f610b9e9dd375f1ec204c4b845710d854b58e66b455ecca7544afb86cdd1cd492e5784bd4102f24596196397e683f7d21ab018066f5e2c4d0ce654bba84eb7729b6c29076e9b5a900892220fba6b722de7ae6ffa3f4c1e0751f70fac51dd58f60b21f4e188bb25cd9e027951ef2d796e015579f444b89384644b2383ebcc5a418f7700fa751d5806a833d4d641c0f0075e9c4bc828d31923e26cb36103a2afbbe967743b880e8f88eb4536e9fd9882b63f6835469ed0656ab86fc335f86298ffce793f429fe92df6c3d10b8cf595c15aa78d050bbf685268fc1b33a939ce3289bd0bac499530c3382b742482be7544881e8069e8b9301621e4ea33bb1c25fffda97bb516b9985d4129a6ba7d3a377a326ada8dd09ca6a55f88ef188cfc5ce652d3d831f741c4397cce1d9f76c00b43db59de68e53031bc088b2ff34fef2facb1575736cbfb74eb832dcd03118768e4dc0a5e0ffe2fc6d55421598b2840d79fd304a638c531371dd2d8ad8e674528c0eaeae678561881924e6a4b9cbc74374a5b6e5fa4dee4c3c4af5b8bad8acdb263696a91ce5d534bea8c523697cc8923c885d1bec45c69c87eac855097848792f327e95164ff4fde3f13097d0bf018aa382dcc2c344ae5a537155d2ee1f9e15507af3700e281159f16c785571f5be05b99c47451803de32a942799547a071435de616b7779e2ed7bdbd8209dd91c0779c002ab24061610795290cf18a390f839239e3f6dd8291d621e3c356b554e3fff36048ce7780a1eb5ac2dbefa6af625b80accc3e45b4ae370f50aaea458dee878c01b13316091f4d51daaeb99f50f3206d09fa98d82b91ed44e2f6c3edd13dbd29f600584887ae71a0479eb0d5b3f8af98b4a907ad742dff3386a9ef162e72bf3cee2f00e71fb6634ce7df1c3001d3f72eee0368621d23c7b858dbbf9847efcd71c7d18b970e3b4f2d47a7985914e523480974baf4301c47bdf19d8de8151dc4a85e26fe024c07fce863478a02c61eed7ffff865b89c3ce478194ee90a77cd01ec201334e9f81c77bb2cac8394ff8870dd5296d8999f94155176bff8a5b965eb34ae40cc4a5c1819c48fa612f3640f7fcff5fa1e6ea30a49ed5dbb8502e50d5c504788b2b60b2398bd23b3759d922e4e98bc9edb304116bcc10ab7a3fef6828ade783c3601efce59bd3311945bdfb502a31ffb8fd932d1bafa0f5de377048d86e29eeec4391e1aa6ce2e9db037bc41ffd8d1e897078c8f9f182a9021429a36fe62a9c9ba18d4226b536ae49f301489ba75fa3f58e1a205c39160a4464a315067b0a52e721e0aedaffc4b6c4a8228aaf1a539d98173d164fe142d3813b875db9e70e03c4f2181ce66481972d1414cdfa09c82bb43efc536ab6fdd21b80501a08c4bbed74584ac41de5f2d6067d35ef959f995eaecd3e5ac69ee77eeae20ce5dd3cfe0853592947c440605c9ef0b9acd7973878baba569de3582d83a33136e8e8e1fd9cb24f2e5bfd802e4cfd23ad807fcf7c63a51d7526f95e91463ffb18e005a387adc60a13ef5778ba34ec8925e8ed3ffbe310d1b4461b351b4c141d14d1222db2c253b03b190cb23a04217f156c4e647432009a28e3775679fd74ced55bec35723ff04c50f6d692c170e54f76e716dc1fe4aad5789894277a1df2636b1bbebad92dc23b61362155167a381de70de8707d1b50fbdb4aced8406f44d4033c520199157346ed71326d76b30188f143819947488d738cceccc487a6d1e038a7d86565bccc8edf7b6b3938ed15f80d735b5e8007e6c44d966ee237240dc21a5197eaa44d92ff72b03eba0b6389d6539ff9499a0ccfafc2551e29b0fdf4705c4078f1e268d5966d75f95fe2e0456f1fba49aac440a681ccc883a55e5c19ef34871784db70a5560a54298e76e7b06745cda8863b3f676c15bb6613a7c915c2034af3fb09296624f774c04ef722e02f3ec8a2364d0d9fb20567a4f61d9335282821110be8936b829f53d2e6e3508300fe28a3644caa3224f47339b9e7f31f36fbfbd4c3a7be00e3d32f9ee6fc32836da0041918add57bdcf05e4e8080610d70e2a1e8a20a802c03ad910f099678e745e525ee7bf1540dba755454b6597c9d6a75a90a02c2bb327ee7ed4ff3b7aaefbe50e9157259e7bd77d7df8b4be0b171f7e60fcc9d81cbd6072d22c592c988749a2daea53f98a3dd8f7dde95e4c755d7a99f5c84a05fc923511e5393c06ff2dac0bbf237bc4e4328c029e0d93efe6565df99ed23e2f082c4586539c2ec5c5ec4d4f0492744dbd3714d30bd45b6b3334917ece6a30c80b545ef35931d1e7fc3b4fc26a27eed764bbb65b2c62dce814e3f2614d2a875c9affb8ff76397ed06720e2accdb3baf244928eb1a589db95d5ea94b24e6f1999e19ae6377dc9199af089e69c0e9489a59efaf617c20505c6e8fc9ee03a6ed90c9e4e8628cf7be9811411afaef14a58f02a262b550e492a45b1823ee4e8cb1df808caf822fc97ab434070dd1d0b12f344dd01789394745eb40302107efa54886c39998cdc599429dff7491a2a993f2707cf24bc4cb81a1220fa83eb75cfff8cc0673db93141c58cfc986877a913b7f988f17f9563ae9913b4ce33f4c74eca3135f417bf9f436e84962e36cc0c509fd5ef7fde12e62b35e66dc4dac93ce56a1488e21a0b89886f87b8a778f6065a94067eed84e65719f9567614bc13da7b5f5b9eeb386f90d214092500167ee0ec7e8b7d719cf29ec547a130ce3ff94202eb77e11866699b0d7d9399b1d571938528b182b160cf85d798b9df06270bc24f691ed4738c94b68fc3b1fafa5790e5358397bf086ae51aee074905607ee78ccb53835edb97037cdb4a9f7241de0eb293d1610e1d1b55b00782b5b7befef625e7f10ef7cf2ae87681e80472df3295ab0675253a3c8f36b1bb22bfd8d7b04acaf76bb20e38ec6dc779cf5491ee0c2c1263ecc247ee16c69fc1908a646e369c40b4ebf12b258006b6156e564a2279d11f08f704ea837d944b7d42350bb35109f0fd681698697682733dbc8e205e5e49fb12f2bf7de4c6dc238a7c45d76a9c9c517b07c4c8e20b4ab6b1567a55e10525b69c36dcde8fca80c734cfcb8e8eef67d13ab4885d5b53c89584effcd40d3f4a20fb5c2c42dca73d60a56f2f278b87d8cf0eca31df28a0414728f38df8039cab41d2cd2471de220d8815a4cae114d759621ca99b7877c354ec44e1fa87f81defeb2f5002a684a8957369dcb7ed84d0e6e8d81a79f5969f7974998212cec03dd6b6b2bfe508d6a860e8740ed7f5dfb51fa4d0ea63bab8c2d12ca465a1885e8212225f6125c65cf826c6033c052ef9240db05cc9fd7266902412e1a456d948117611e43761b880c1be5e54186ced75a863a01ca7c0983d082e1bf4010f00ed952923b8d3a07b0112b3fb27afbd520bf53c78bc664b86bdba554390bf3a29683cd3f316869d8e0812b78c0dead748e92f43e2ed1127d4dcfefc9c3eb3539dfa4d18340bcf6268423c2bc2757cbf30ba37a8db62bca57866a6354e810a6fb850d65d14ef2c9c9ef3e45d36c79d31872338dc56b0febaf48e083c3fe7ebac7786db2500640acf0546c4a4b022e2e7f53705324d2d7ddd2ab03ea4133507c192938deac4b9278199a404e3e34ac35609f9338833e934dc31896799447d88032f43871a2ff4f040292bb874004a8ac36278b1eecdfde8f0f7fb0dea7fe8637e9470bbad00384baa9f87ef02ce1355e89546107598d78bf60b23fa9bd5a1335c2ac7abf39a8309fffebc52dbc77fe3ac0be30aca9cc4c063c4d1ce27d4d32be430c4c922db60d6a8c7641458229f58613fb109d803e0c2560b6828d00aea5fc3de827725607a14f1d055dd251131914b23fca8826cfccc64929ac81658f8e0570aff2335d6c43f77264e0820e8053516d17343a26173f8a14e3fe87a26a1a18d395aeee80b9971828022d97773a500e3c0c53b4734a47dddec72b6f180d4967bc473a3dd37e0396b8ffb1a53f8606b195bae7661401a5a881a743cf8ef59a075637327c97891a1a17d3774c6b75f616ff3c6f803e63c3fd5ccf4573361a3bf9df9d1bbecc730b90f82048fd96079131f5ddea17c21db6e7f3b7b436f815aa2dcfcc8012e99f656681ce33fead2dfd914ec390429940ddc71c0326385d0f955f9826eaf72de18f2a3f9a8a6493df9d868f437c5fd39141b6e9398bbe0890fcd799319c8de0c5b2a377cb1dc860526ffb60469624c0dad187e3affd2b43fc06ab59fd58b511d1d55b97dc212c7ae59b5a1562310b372992a2fbd9581afaf7c915fe5da55ec136698f5e395466512deca25ac1fafeb37792e5e2defc5b975ef7bf370fba64661f4b43dd260b5573cd62e1854d587106157858cf90423c529e997309da2285540d2cb01d7b5b883b9d7c6a73c14c39d78647f957e33fbacdd5a8edfcc7d3f36e3269c8fce1f0aa2c702506c21c059e80207f40f99abb320ccdb75ffc509f34763fbc1d6a04e524e68dbd0471fcc488ee8d2216ef1feaf4321f0cdd08c705df2bc6beb16cdc1d2571ff45f17b143c859c832076a4bb5705042a54eebbc5d3eac00c5b063c8c97c4f7871edd7512756806a59761fadf09d0dc2325abfb147719ab31e942c8e6115ca0ec4ccbfced57c82f08103e4130b5198722743c11b5a658a21a768a21e6508e4b9d1627a3de02315ad3364dfe8f0a0ea3b5d2ae1a5d87d6dd0d9101b1c553ab2888826c0bccde7535efa7d7756411da3a12ff0ed1e5aebc8b2261b3b470d6c5e900a2c084865b4c8bd7aed517f80e76bf08b975c41b124fcfc6e86c21ebcfd270da0103616874a8a9d406f5e036c939eedcf817ef31eb361863c5f8de0e42be05e4585b563787055bd299bf31a193701c18d1a0eb9301f14dcda9ed33e2613a98b31be60da8b9ad9042b59ddc1c1c41418724eb5ac9ddde86d9ef2534aaef0f5a1ddb77a3bea87d949cacc971c542f5698ae1b57f3127e784227ad879273a99aae8399ba50950f579227b2ec2f5c23197645955eaa3cbb104fa80cc09c38314c6f783c8c22417551407bafb60ae35d4abdbdbe6b32ee48695ed8ac46e9aee54d17a507ad83df2c53ac0f7d4163445b4819e40fb923540000516bd211e5ca55ff262fa51d635dcc23c27fdb4c7014e4e06dfd5d3d9218dd2c3d7e91e00dd1e5204a203055c279835905eaa87aceb3966a0f8e65227e70a77368afffa441e7e5fe50e9d2da2b5f010e6cee3f52c40c9d16b0dcc09cf2941fb71b084f588c84d58a4b19ac42bce31223e3ac8f395ecdc6ec821f727fec50118820f3e860c1dc5c783139589e8cc3e00d7f74043c3327308bf2e1afdafdcfdd0ca34a76eff71583c6994e6ff82d504b914a6a69f09ef6b94112f142c6afb6375ab6dbb8e36589e5f0a779cd72d5df7bb12d15165e6e88fd9f1f6efa0abacd8df27ae021561accac2ab45f624a248386c4cccf6d951d802ff96d0835421a36b05407ea9fea1de994d4550078ba3d0c044190c87056160a98b14f87b298b71e30bf9d378f0e9b6581afe3dba208b9da52f1525b83b8cbe8d532e6e5af41d6bfc471e8b7ea413ae676b7da23af550b9d07504342fbc5e6b639e7cc97587ed920647b222a5b82a16c90134b4e51bea6c8691df182afbc613f3e269fc053e30c350469f9586e72a976deb817bd605df989bd28195ecfe243a2433cb85aff7bceed38284a47a8d153e5d2eccef5f101524aae564f8609dd9c9333416cb377632473814398d54c48802de72f5b74c9aab19e8bc09fe89bbf17a2566361c7b4c6112767697bacb084fd7b2437fd0309e5ead51fba5e833de354e72e0e1226841c000ffea771160335ca52412012ecdb608a4b124503b8a037843bd05f71398fb965e1e9ed0dcf030b8dd67abfbff3c622162c97d36d93e2898f49f8dbbd37673317367bd1e32f7b20c55e51596b2929f6c1338511f5e149c93db7bfba9a6c8bc0c0fabe08582a7474a74e52eb7f2d2eb93b22358e4797b40c27400b354efe4fba63db6d531f298aba6f9b6e55a8405933d2d18f08edffa25e83e28b08bef93002c94fc28172002ca6fbcea451a864a243bfe5d940591e24b5754a8759620ca3aad6d4afd88c87721e2cc8a97d1289fe38a89a44d0062c03b3b15eaffb5d09d869cb8d19a60ffab6024195ee84caca0686373c32345dc1a04fc23318133f55284d5d95299231b450daa6a950d4c9543b4298279624ae51aecc3428ff8fbcd4e3983af02d1806d7a9ab2c4dca3e4b0db55926da73b4533f4145ffbeb04cfb1f9f8ee5cc24370eeb04fdda5a29393b2300c3e1dbb7a6917729f4eddf10f7674e4ef040114b19ead03ee1f124d19c3da030979a2d7aca08c526df30719feddf121b573dd23d2880db8b9b0d409e8c32ec89e564e19aba9bbd5553f6d9152679e4b4e3956c6b588561527d45a35391a7868d4edc2c6fd546e214347a896da2ae1dd16487e40789abe3ad2861f4b37c98e7275820756da386b0bb23abea32283faf3da7ffe06a71b365c0abf781f814e0dfdedcadbc5951a000f3b151c01af04ea12d4377351761df7759a03c46bf19023598e62696900a29cd6b26dc51a575f3fac6430a24f96de4cfe48416612df77dde00020bc485dd38892339c87628eddc5bad472ff3fd25da31fa5414d12710f72db9afacc448ca3cba05f89cf9015b14d3351719cb6db51063a22b49c9aa5244e8f209af9bff2884ac508605d0c7e3b112d7192ffba5b073b4568b97d731522683306701eaa0be0eab7fe313769d4a5cc6c40a0a62206af1e8b2c7de4d2e997f8fbf3487431f0bdeab302a9df0721d0784a2b9c905010c80409c3517d785ba1eed50217fb21b65b6b911b40c7846c2dd23072aea7c2bf13c2cc955d5f91c0ccc0d3cbce56c688d4223ee7ec9800de00474f110b4e38c617bdbae4431e6700331c25089cdd4b34c3cae8e424ddb87588f31a27ca36ff913d809b317e642ee5ca2fc3122777003d3bb11a851171bc1a4e123df2f813b1c84912ae89bfc5cd3796827b805e5644c9ed323dee8aa123b6c415f71b40775d175744ff57ab4ba300c45c54b45e960f6c900ab5572e4751803e395242acbabb8de239f58bb82d13fa04272b0e80fc84d8a3ea6e4fdd6177d1b1f27828472673dd2fda6183bd59c2f4c60674348e5d840a0b36cc6097ee3b4fbc237948b6edb4d0cae735741e50fad031266ba30e68d4c2661feb8744c2827ab297302ac709cf0c28fbe6b07550fbdaf9f70ebb2c7eab754f9b16ef86588bee8e53cdd6fe3154f720dc34240cc68f017da6af0af99bd51c1b9b6977c681a71ef47fdfe0208c52340b9e400387708e570cba31ad368001edfbd3c8f817cd67b1d158115bbb9800f0d450352ba0c21df5819d9f2bdf67ec8bbd9f300e3729d7e11005fa9e4bc0c6df2123f4695da1bb2f84cc28d861439b9d74d24551b1142e029560a9ffec296305e9c8b4d0ae9527c4bb02bfe8d63c1d29539a28dbecd283ee27f4c1830e7712b09e29e92402a29891057e10e7d824e733f849006d191086b071bda629a6835133c363e51087ad6262a22057de8c2403ae22c5270e3410b8a44907fcffffffffffffff5f3e10bb37f8660fad4dcb94a47c02f587fe533dbaf5c330a524a54c49c21257b8637d33b388042b10ed0cef0de7a4f58518328649e5d0ac6ba79f6b1ff48d2c0e8d627732a9b3aeab0987a6515a5da78e9b7e6f68789731cdcbfff5b3dcd0b46d8f16f9ae4f7fdc8666b3b713f639efd15d6c688e17229ee77f4e676b68b21be7b7677f54436e3534da525d75ab22a6f46968d0fd4129b53dcd9a8ed1d0ac1f237ae4bfc4c56768f8284776d4aaf6a8ba6668bc4fb5f6ed67b1b696a171961821568ab5d915191a3f9f4793fe1d2746636814a9b4a8f152ca9b1f1543e349f5cf3acbba216a6168ba35ef86e90de92a303448a1f31d6debf4507ea1c1c68cd1f35254ac5079a1c1fed4989ff61666eb42f39ceeb07de16a55ce85266926cbb63a2d5fcb690bcd2b9456bac6527975d342b3faf4a87b6fbe1a4a280b0d2a4e6d5743a5c8dbb0d0a0456655ccd921a37585469536e6ed126ffbb542d38abe7142c5985061151a96f4507a65aad8d9935468122b578dad86ccf4fc141a3ddc0ccfbb426fee526852fac6e37b8e324b2b0a8d42ab699d55efab5a43a1e9948dce41e85061524f683a35f59d74d4add5894e68d02995fb8d13526c75131ae4f94b35b448f33c33a16988e997f3d3d3265d42b39cbdcfb75247f4a984a67375aa37dac693f092d074f3a5ef8749e52324346d7d5bbaeb8becd08fd0b8f7ead23d2c31646c84e6b7192bbc7e45be2d42a3fafcda72543e97784ef4543ec584fd1c267cc9c464af071c266784418486e162a74e1fb45a3afe101a66e66871a3f4bcd2a7ca0bfaf1230d855b893084d01c5eb7166addd62fe43bd1fb677131b97b20417ca0bb44109acdd44d6d3bcdb871eb13bd39e458d5092034a8499b335c452855fa13bd39e43069fd2926e8dc7041c29047fca0b955dbc952ee62ebda7cd0b86a85baab19feb6ef1e342afdb4839db859779707cdc9db3e4cb7fda83a1aa4e16baa2b7f118f37ab945679c1a930705147c3ce3a4d3fe838f72c3ed1fb38fcd30a1dcda3e25dcf0e52ed7cfa895e1c2a2872b03858fec7a11c73348edcefb85d1953e7d6899e6a2f0d4a299d47bfac192b5b277a29fd2e2d2672a4bc2c1f6a94c4a182c2efd2a095ada1a764a99af9b73469bd4a7e86a99dc5ed2c0d1e3edafcf4ba1af31d34e76053eecfac3ab55c401a3fe4868829efb62979a5c13f46d610d1d9e4532acd9f6d4b7da9d6e76df9a3e1cb94eaa447b848179ee8c5a162a2eee3f0a65f0d374a7894b8a0844789cbcb1a990ccbcbc1d23f5a8f4c269361c1397c5f5141e92ec40b29cd31c4aacd6eb1e34a884d6eb5204773147a95941bcb4fb516ab1e70982c1d34ec10be42c6d8527ed03922a034efbbbe3b151e75cc53550f384c7270d2ac4c7aab09193b7acb4c0609713497a7b1e653aabefa596b14638b353badde522df5cda1857850ab6d6afd2d6fd4ba56a921aec34c9759b37bf2ac4bbf648d1d546335b8fcccf3b0272be76b3ede83499357a944872a39f64a67cccf05396810375c2de5b2df41c489c960d2a474c40e626bf162e8bf9f05ec051c348dddba162a3cd538d739c5851b34c9113b5fb3be45ebaca791c9647ac061d26cd09c57cde8d4f54a86d41b6ad0dcba54eb7b97fe4a9ee068fe1fe531edc496394a3468be61638eab31365d95de6896e61d5fcc12a35d3c8383c8981062b42a116eca6cdd78215ed5f6122a72a3694d214da98eca4b8f0e083268944fb55cec2b353e0a65322db8269748f0d1ac5aec572b6b87d4728d41f3c708d77b3bcda3f2da68d23974be1df59cf4e8c3a059be536ebea6b2d7616c34edb0234fea0f29d3532f4008f1494cbe5b74a9993a427ebf183adcdca349baffaa5b4b4b9dbdd63f0e49b046c3922646b752f2b49cd721821acd294a4ab31d66c99a638b2ec1050d2a52281b35ec764cd76d115ad0a84b8b147762bde69f5685904683cce7305e7f0b175b0bf22ef0010b1a64c6ee7ba58b5d3a27ad4912d068d2372166878cd399e2cc690f384cfc8c86d1a976aa354c8fcab369b657d72663c4e5f93ed05871514923c3c272067b2031c8644a7ca091c9b09f2393d1bc1e709884f1861534298f2fa4eaab7dd6f1440f4810172ef181464989a797921e252b5f4a7c94acf452d2569a4a269302e4074a6a4b0a901f2840e0d1bc36d6eb38516adb963ad10bf272dcb5047939f02e0566347ecc91f3428c7d6bfb6534673184be51395377524ff4e6d0121f68949c51e2438d921637f492c9b91e7098ac4005cd72e6e9bd787e7bef6990824635e26b42edba31c49c062868146aabe4464839edd113340899b96a3ecda9d55d0d1334ce487136f3d13eacad12b02274d025aea653874a6de6c71c292999668f72bedd5f88e954b98004cd61aa7b7dba23feb65ac6f1b27e05994c467bc061120737cec8fae0f274682de4d656588d6d702554c7944a98e998e42975ece748439b6eed5222ea46da8b77a26782a75c7eb454aab9568a8c1953aec74b4ff45c585605a951a7197fd9d23c69bd3ad133d1450d6adddba971267688b113bd3dcde6aca4946e3baa9d6c9e277a74acb0c471880d424b1d645785da7aa5277a2c2e2dd72c6cda586b5bd91a259fe8b9fc682c83d3286632bf624d193ada133d576993153f541a8ca0f17e74b835f1ec33d64ef44e5a5e80a8324a7894f828f1a146097b37e8e836f834f580c3448d4cb3dc7c3ad3fbef3686277a2c7dc24ccebba0b0cc209371f9d13299675961337079f96172520f384c66208246ad27e594582dd5523b27ba2f2567b45152e2438d1213151445161720f92c2b0cf580c3e4042168d2f95ea9d7d97c95923ad1f357014173b2b1a69c9fbcdb3674a2d7e2ff2d262e1f47ba121f68b474c9c19792672c2f2b31682393f9b1e22acd92e9121f6a949820ee018749184af88049cb0b8b8949043ce06fa2127ea0032cedc2010e40600311d0801cac574acaca074a2290810a6000021720a30316c04005244081091c0624d05c5e2270267f6262c25a507e4c00024851e00175acd0e1520107a884643460f14cf0e5e89465d227643020cf0238a00074595919c3fb593a90801020200e0e1ce05a3e608053000f10800303c00c08c0440301c01f2bcce4594c4c4e0e951008fb1605c00973e965d201314c4c32b0a38efe61019233594931894305258e3856522030f2a3022267f22ccd8465c5a52710424618676262e252c763003301474000118108e37fb4ca080410710b020c00a3884f88a20ccc15ac50052a4c410a5180c21398b0042524010947304211883004210401083ff0410f7810848e395e5c5a5876006445e547484a881c3a58980424420a980424c217221051c200308ae08426cac0842015128000068309a3092050050613878a4bb798a4740b4ba6452402180c060022101803043618c3181f6884c803441c60d2000f78a1640c0f0c600c0d58610c0de4608c1233f060c9988c9101398c91812f605a3c0d44ab6eada4982182803130c08003881820e4162205b8000bc620c30bfe03f06f09a25206b27ccb0bcb037989c10ff646082b4404908232839494323cc414188c4800fc5f9092520606230280160c46440c959786c188ec7094345af12ecfc2cac06044483e65a5872d648146302b22a22e48b3bc42240483c10cd22c2c65b4603021c100060683c159fca215184cc82b7c11031f2d28c060302fc08c118143377eb03af25ddee553529a8a0c52525ecef894d52b3d3c658505cf039418d4d16bb4342bc06042780164854545063f503a85c7d7d16bb4fc9fb1d2a35959f101a4597cb0075247f33fba471d4d4aff0a567ac8c156d458e9e1af22834f59bdd2a314bfd2236417981053e80283e969a020958b202f070613828b8341de0521b7b045b3bc0b52d0f01494131e4152545e80c184d4c285a581603021b4701496971436309890593c435971a385e5d78f5f4365e50c97967e355cca5801b2c2c2864a9ff8789695353c0d1459b0bc1c282a2b6b603021a6c03429cd50544ed8fbf83950e27835521a85a1f84b0b7410c40c0c26e415184c48296281c1c8c1b272461033fa47b7bcb8c055dea5e567d0c60c18ca8f97e659564e5a9a870aca0a734131038309810506830979852b78fc606fa084b42225e5a5070613c20a0c266415184c882a5211820a7f1f798a10537c4003648ca100068ca180048ca1000260424a410a0ca6e5599e05f706be916fa037d21bea0d7d63dfc0394840821fac8e16cc394840029cc35778ac20bd067b3750b0d254d230017b37585654507efc8f5641c18f1595f71f2b2a2d2d2d9e823203149880bd1b2871a8bc9ca1f2d25cddbab0341b417cc50c179606e26904f115335080024c1360cac0a5456585071921d817132cdecbbe047939907a7114cc97311090301b300303042514001384039cbc220c5884c18930fc10c61f0c6088114e2c0183c1a48119c3006f84840cc2022948c2180590420000b082310ab080304276817e410097428c31002708c20061008317bce084246092b004231ce1082c287029000683b2460a5e05858c1220191a2043e5530e1927b800192a9f9202c0461961941146026c71025cc4c103180ce60d180083195b90c20730184c14306c60dc484104c610a311984f590bc5fb59907a19438c10cc61420213202d63ec48c5183b3631c60e4578800c1284800c12fc0f141793f62c1df041c70a8f967d61ef460b0a90325a5080741c2a29407ea0903c620c92c5a081823146ece0873146d068795f511943e4102d3e5c3e06638808608c10160c17b060863854509460843076f02c738c817104a60c7900f22e2d72b4904186fb78202f58e911c6ef8065a58520000108400004a0d26604716141f9973212100c04860400c305f30b1f8cc117bdc06034d0035fb00083c194a429f4c20c2642f0410f78e10b97766909c14322789172070ca62501bb600383c18cc10e25ba30030653872edec0605672e1065d040043860a0a1975b84a0b4b026ce18404d8e28d04d4c20b188c4ab842878f97a353cc48e98fc1b3b0d12cdf2c4d4a29a594104208218410cacccccccc4444444444bcbbbbbbbb3b78f0e0c183070f1e3c789099999999797777777757555555555529a594524aa994524a29a594104208218410cacccccccc4444444444bcbbbbbb3be79c73ce39e798999999997777777777555555555595524a29a5944a29a594524a092184104208a1cccccccc4c44444444c4bbbbbbbb3bc7ab2aa1c45be3471a181a24601566c06030cdf223602832586179388298b1d2e35156e0292f2b33a06325e5cd78977e161ecf8315963342cac0f2272e6d060613428736567ab484cc01830991030613120795151419b411a4d58043c81b30188c1bbac559d3a0b8a4bcacc1a38565a5474bcbb7a15206cb0b632b2a65a0cc81b282567921e359fa517cb974cbcb22e30c7f153a1a480b1929fd2d2a2f64a8b407e85869f96f413a880b4a0aca6a95349ee5c5e5a5b1bcb82c324e5c585016194d864a46a5fb57a790d1d2749491697997159512c481d24246081bd680c1a4f4cb0e48210b0c26440d184c481a309810346012400a459ce155567a60302165f81f2b31c06042c880c1848c0183091143187cdca081238d1898aca059c10b78f4684cda78411b6d34268d1a3258c10bd63079a38c35ca507939567cec0b0a7ebc4b1a71aca4a0605fd278159438541a1ea3f881f140073061102085250c3588c2074196494b4b03097142135c545a05e5070a0b6b4171327ebca8fc8f96a6838c1516c4a182e2c2b2b2ca2023f364b088622404e5048369c16042e208692bf0675961616952daa5cf6028292b7aea7857e15152e2438d924ca605cfe4f0f620228986d9c2f3ebc591681af2f5eae7aaba95a7a751c2a32406253c4a7a6432ea9cc98940a26167eae0797514e7f5b3d14619256ca85182d48bc8231a67b4d27752c908b1b5239af5ff67fd4e713b7f97d2253ed428c964708e4ce607ab834d0ee7c01fac8e448248239a554ad92b5b2d75f6c21317143a18d12464f68baaf32cd2c6269765105944a396b75764b5b90d979de8398a499065729065c525064da645e54d80b49851c2a384054d26e352c76732af8272c2fa87099016114534ca3d2d74f2945aeb78221ac765ac1da4ac8920a241942badfa4bd6147113394493db5225e59799ccdb440cd11c55bf7ca93ee920b44da4100d2a6faf4b7335b76a132144e3abb5bc57da5072d2263288a61f513bbe87b59592361141342a9b615ba8c9d6a536914034e77ad0c2bb6387596a22806818e725fbe176a8106a227f681aa37407bf314d07fd8bf8a139ad3f1d74902ea410bf481f9adca6a919b11b43a82fc28786b12394c919d9ba4f2fb287e6702b6d0cdd674b782fa28746a1bef3a9d787d59d17c94393f637217dd785cdda45f0d02463b6da79e3c518b78bdca1e1b54e3abd44b8adea227668d84aa7354f2b694aa55ca40ecdfbd9c37ad61d1f4b2e4287c68fe26bc7095d2d45179943e37dad4bb1b6cb57e82272685ab6f38628f1f612ba481c9a4566d4ca7a74659f8bc0a1b95b8c3efff8ece271913734e99a4aa550a6f3f5c644dcd0f85e6b4cfbb493a7c644dad0a4bf86365762979d1a136143c3dab9b36eb9c294f099c81a9ac53eadb2b61e2152c544d4d07862e322968dd8e1642269689252e88e5d373d499389a0a1416ca9a37cb4a94e25133943c3780b9b8fa162f86d8998a171d5ed199ea7f35e6d8994a1592c7b1513bb644cb5254286e6a8a52e554327adfb5f22636898a59f7699edba8d2d1131349e89dbaecc4b89a95e22616814cb961843fdff077b8980a161a81c153abfca0879897ca169e7e8a4fee784bc778978a139ac879ee9606e7a5d225d68be57b6e453dca5489708179a4f9454753f4a8eaf96c8169a45cccee985e8fc795a225a68d461eb6dc9edd662698964a141958ea357f6dc6be512c142a3b6e51ecf45ab7e72895ca161db504bb8ab1ef9c9256285861152dd14674ada8d4ba40a0dde23c6da11b1fbe012a142738e42881a429e0ba15b225368d03384bfd43d2f42b744a4d03496da59cbcf3763ec2c91283427bb1d3fc751322e6f1128344cb795f2d6b62c256f912734ca8ea6f647353e8a598b38a1417d16d2637d52da632dd284a6173b84ceb95696ba5b8409cdfa9d362647dad46b8b2ca1698ca5c4cbd6e142d7165142a37f9e9bea697dcd528b24a1f13beda064ddb221862d8284e64fb5830edb94e9075be4088bb926f6099d1631427390393badbe6dddcf2245685c651f5fa7afb5e767112234d7f02ca7bd5cbbfc2c3284260f37b796acca1b3a8b08a151a86bfd619712525d1c8c467d3353ab9d4b99ba19188d3adceeecab43c9dcfc8b8625869421b6a4946db32f1ad6f658229534e5dae65e34fbecdcaa55fc9fb29917cd41cb91f269284f9f79174d331e3667e7f89833eba2698a176aa5c75a7d53ce4593aca15fdb0d1db3a58c8be6f4b5745a35bd4593cbe8a4e6b79ced52b668923b524a8f6a66e6a916cdadd2dd3cb95ab79568d1ec62e5d4ed3429d6d02c1aa47f2ef977624e45b268f29e25857b786f21e25834cbd5a536a62b5a448645b316ed66e21e5e878e5fd1e06a9ce8bef3a4e7b12b9adc6d681bf3a3cadbe15634ea96b9a385f215f2c3ac68fc98972dc412faf9e15534b792fe3af47e9cf9aa68d63742ee4c8f8e9aa7a241db961fb1d584788e8ac6fb39cfafd546b6d8299aa6fa30cd7594afb596291ac4a3703d537e53bc4ad19cb60e437b2ca953b848d1a8f27bd3e386eb648fa251e82c5fedc5705fb1289a83ce62aded97526c1b8a86315a0c135a0ce169bba068105a76c5ab0ba544693fd1206e96526173c4aea1f544d316c354844c29bd46db89e6ee56273baae8a86839d1b047ea96dfd7699e6837d1a43e8b560fa7f6a9b99a6874fb513bfb660dd967a261db9efa107263c58f89a6976ee3eaba5b88fa124d6a5fab6d9de5cfb22dd1fc61fbbd955ef51a57a2d186ed29ddb9b4ed4b89a6d5ee42d5d4612c914ea2f196daf6afa318e3a324d13063febb2e33df1945a269aa4c9ba975f6d22148347eae5c111e274799fa88e615a3c46ca9734a9d544734ad907f15fda5bb446d44d35072be1e474c6ea78c68de8f727f7ce5aaf5e9221afc86994d9d3faafea8221adf758469d94ae8d8d1443499ed383b6d212adc8688060faaab749ab35dfe8768ce427898f09b4fb3374483ddd241aa4cb5f4fc4234cd384f156b4d55f984681a2aa69a3543a74ffe201a46aba92e7affab664134b9cdbb3b75912dc58168b22f61aaa49ecf9001d1b8fbb6564409a1bffd4393e9ce26a243abda523f347d7e0e63b244e54afbd0a463b5f05a9d2376ca87e6747abb46d4f6cc92da43838db5f7f9e56fde49e9a1d97552766b0bf774239587c6d3a63c6ab5a6471d5278686e25773fc384d4375477681a4f1e2b5ae9ac944ed9a1c17c3e89eb3067e81c5587e6f0674a74c40df9353a3487d569d8687526543e8726253ddefcf1974acce4d060fa498fa89952e73bc5a16185ff978dd939993ac1a169499dc59672296cb8e90d0d9f76965ea1d669992637340b25452bd149a90dcdf1630a51f5a9bf636243b38cbaceb0394bcc4e5a4393d8aad9faae748d9a1a9ab5cd2a9da5bc16ca9686a6e54988d9f718657b3434feb7309dd1f791ff0c0829740d17a73743b394356dc48b78b1fb3234b75c9d5d8d2d233e8c0c0d3b5608353c5fb6878da14955ba9479fb93972b86c6d96fa56f0b9dd92d0a43a3bcb629f2cd4c291381a1593dd7945971ee6a445f68fa5cbeb344ebf030222f34898fe6762bdae689a80b0d5be8affdb0dca37c880bcd29c53e19d1a12d3487d8c9ec74b2f5d6b4d024434717c35467f75b161ad55e2d3c896957aa85852635d60d51d79b25b4aed020b5de071fd90fa26585266563db94e99ee2ad2a349d30752b7ca642d3502ad2c67fe99cf3141ad5ae795d420b93429542b3db8a91a5b4161ed48c42f3bc8bb999b6fe7534a1d09c7674d43db1f3ad2a439ed09c6407a52fe6ddaa94214e68d0b526638aaf511bca902634fd4c7d0fef37a59f19c28466179da1968f907fca0c594283fa8cd62d2f2a42cc102534481342e950ebee3bcc90243477afad59a3b68efd3204090dae6ea52a5d7abc7419728466e5d2c610e2c6baa1cb102334dc2ead679f86dde832a4088d224c2a3d3f716378194284a61375e6bafddce31f328466b5f5afe7dab3a6b3102134ee284f6a6fca0f190b46d3b0912f2164e78a17309ac67cebac4bc713e6fa45c332ada6d3bcd1170d4aa88edcb5d9f669ec4573d82ef50a5d22b633f2a2393f7becee199e45c65d34ccf0f0d2618ba96d51174dba73d376d6c7912be6a251e40891596ba4582ae2a2396c663edcbd12b3c45b348de770bb53fd8b37d1160d72ba1fe6e81c6699588b063156875b2e3f564ca445d310e2d656aba6424c9c45f39a7011fdf94d691165d1a8e7937a9db366481163d19cd6ce41bbe7202c9adc65dd74ef204b79f015cd2795abbd266abbf0a02b1a55c93c175bf78ca5d68a66cfb2e3f6761c1d1b2b9ac6ea5a996265a7aeada259cab3b9a1e769c95f15cd263bdcd94dfda6f4a9685affdf3aa91d6c073d2a1ab69c756263c95a433f4573e835ed375a743d6e8a06939d6e9b9242f98d95a2f1d312ddf1835a4b67a468b421fb4c557c84c746d1bc9e7f840ebbb4ce2d51340defaca74429f57b87a261ac8d1ed7595bed09140d7ab6aab731dd279a3c98da417dac3155749e68d8d16f7a4ecff539e83ad1ac5384506bb62e8fe571a2e16eaa27f5c9db44c3beb6754288b821e369a2e9952b615b8e5e2d759789c63b71628fd8eaad1b261a6cb9ccbd1d53e8ed976854db514cd9627dd6334b340b7997bdc26775d8956892b1c6162d1e443f4c8906a1f48bf6bf5bd3b69368fc2c579fd8e96fcf54120d5ac8541e23f75ea79168127accdca35629be8244937c0bdb9ffbb7c6ea110dba46b88c37b5b43439a2518f8feeda37e384a9118deb4a958b506244c35c35d656a78d5bd1221ad6f7b9f7aba13fab88c61bb2fcc3ddbcb14c44739f0d1f1d64e58b8988e6db59ec0eaff6c4c54334c7f6587a63e6eafc19a2e9d6d431f4c8d5723c278c42342ccfb13d95b2f1b774277a2b2e4a7bc061b21206219a86d86aebf2f1305bd7133d35833006d1f8f9678cd4f714216d41349edab93a9d7cbdaea94034d79fc8898aa9ff960988467331869cc8cf3556cc64329937520f384c4cc2f843b350725b6dbca7574ae487e6ba1d47dcea64cb84f2442f4fa111461f9a6bdeaa0f2a56f6c5e7439367f1d5bb42ef97d4f7d0ec26e5a94ee24b295dd24383122d95886ed7d1525c5131c943a3c75d73b546d44b2d3c34abe7ebb0e5ed36d569776856ef6af6c71a35e6b243b318fa86cdf41cc5e97c1d9ab5b72ce9598b3e37391d9a656c5c8b991ff75e7368569e2ebda1be44989cd039133790cca159a8fa903f6bcc280f311b48e4d0a4c5acd75ab5e7442f0e8dea65ea3095c9bb39d1895ecb1d81040ecd52ec4b9d3a4c35734b07595a32994b4890bca1c1ce3bbd7aabad422b4ff45e8e76414c5404891b1a54e44c39a3e2aa552c0d246de084d90ef6272df18146a281840dcd713e755019db6e26446b6432990c620f384c42a040b28626af512177eeedb41ea9a1612ae9b5a693c78b71b9a8346b371683b0b8a87c02d23fd284240d4d6f2a736c75772803123434cb19afe63d4a216b745c417286c655db399d548b47d5cdd028e3a3abd4aec4575eab202943b3b787f9f8528b2574cd64d0999cda0b0509191a67beee987cf2a8933493c964de28e151b246098f12377eb8b4bce8c0cbf83fc3dfe5e360691f6716246368dccf9f7c4dea4efb3e71aca8c16420114393dc4b255fa931bfc6380c0d5bcd15eac39eab8c080c246068d63ab6b7128fc286f95f6812634e687db2c5dc9761e085462db56bddb164f5ea5c179ae64f4a1df4add805122e34671be2b6ea9cc610717281640b0d2b964eb7d4bfaa399f13bd964f612a2f2626aed208151148b4d0243bed6e442d65ab55277a7b253ed0500949b2e0781afb57b94b2b418285a6b923c285ceb8fcf731ff407285e6dbc9f4fd9cf4442f4f354162854633252f4a6795bff19fe8dd5982a40a8d9e6c8cdd5bca46cc469050a141dca4eb92bf96f850a344b5132453680e62d78650ae1ff35e1e990c2948a4d0207677b6d51ab64ecb277ae85e50e2438d12974c06251e8f92d37c0a90171f256ca85182ca112451685ee539e647b49fba0b85e6f417196243474da573a2f73c40f9169606c27897ee090d3a8f18624ae764428b9dd030b59a6aabd2d9156b3c51a59ca409cd9f3fc7d4d83b6bbd4c0109131a4495dc29b13ea8ed1a2dc9129ae7c41652e7d7254b0dd91b990c0a0b1b253c4a9c4789e28144094d6edbf677850e6ba83909cdda5fdbe84e42dc4cd3895eae9514339e750a1b2c2f2f28e151c2f22e2f2b6dac951433322d6ff292c9e48104092aada66b79da860ad321394293d02364edc573b61f19a1c9cbd4b9966152449f2e244568d09ef549cfba456dcc89c0ac14b55e5babaed2428164084dfa323d98fcded7518b44080da6773fbfcdaab94783d1b0d53e5ce694cffd0a1829713a47f51d1e949c9d241617202c23bf6892d7b66fc4ff69ad947ca1dcec4d2f55156b5f2f1a6cdf8e2b4a0cbd7ba11d4678a1123b2bb55deea2c955aec88e129fcc96a35d902ed8a99fb572b942ec72c18b1a75724bfcc81bc385b2a4bc592b3b3cfdb7d84efb7a5073aaa39a2d9ab5dad9dabed56ad1d873b795f451f918a145837c09757bfc832c91611dbd46098f12951794f0287115141794f028f99794c60bf22c5fe2438d9273a90f23b368a84fb174e89935a2238b57ebaf7c4aa1c3541d144662a158a14c65e55d857a0a61faf9f973529b8e1e3c34d005253c4aee531690fe61728e65c5a5390c498cc0a269d489eadc1a9de8ede0b1c4071a253b68d8c86480fc602d994c2693477bc061b2465ed1a82e26a610b92e4a8b277a26790ddeaa188cb8a251e9fc5cda9550e7e279c3482b9a85d62eb50a3d437dd4133d4e3718614583cb39efd0ae2a5ba9595cea684a78f86732990c43d964c3c82a9a8554d75178bccea94408e130a28a462dbc85aed7ca83bcd089deeaa5a2f9555fd7706dafeb93277a2d2b40120c23a868d86afbf37b4a15ea4d277acf0204bf30728aa67953bff2e3d344279de8a9ac6c19464cd1b45c46e8475142d53e65327726a7b0071c2661d061a414cdb7839e71535f799b5c0b23a46812ea5ae47d7abb95d251348ab919ff75db96898fca6144144d439898cc556a33466c24144d76dee333a40e5b2c9f0b23a0687cdf57dd337614a1fb271ad452ffd5e2a6546fa6ac34e4d27cce138dbea76665a41663a45bc2a38447890f354a32192028272d67a4130d628aa8f0f8e2f5ef8d134dcba5db3ced9ff6add8269a7e947017275cd78d5713cd49f5eb67bd895143958986ad2f4b747225539b12130d43acb93aa52cddf15ea25187b025a4ce22ea9396680ef9f0612ab1b3e91c56a2d96698bb490f4b541796959673cf50525ad2084628d130f7b3b9d83ae7da3b262e1f875e890f345c1e8d4c66124d6b8ad57a4e8e68b1f1899e9244731a3dba8412b7259480a0d081828c44a2f984a7eadc713ad1a3e3559e2521d1243bf68f8f8710634b859147348c547afb4d67644d4961c4110d3366ea9f6db5df62e844af110da3f34cf1266bc694f2133d4634a7791cdf19cfb97c1795c6288c2ca2b9839ec893bfafc5aa262edff22c8a689672c6f2a88349e562894e184944a3c98a7b1dea4c9777be0511cd299ee58b15f59ed6d641268c1ca251958a1551fe2de4aebc841143349efabc31cb6e6fa710cd2e4aed526a5a84bb16211a667e7892a673766d4b07d11c96d85108216ffe6b2c88e6f03ab1e47b5aa73cdd4034fab95063eecde57bfe440f104d77b66c671d62e3c650452161e40fcd2e63a82542f968b552277e683c9dcf3c6afbace6dac808237d680efea75a7576d5b7b52d7c6890e141db7a1d557a5a0b4acabba09cd061e2f271eca1e9a36db166c516d95d47f4d02047e9ec0f9b2beb75f2d0fc65befac56ba8d82b3c34ea3bdb497498327de2133d24c2c81d9ad599d8695596f2ecae13bd2384113b34a7b186eb51adfff5d60b2525a59b0aca09c1481d1a5fecb3bd79f377eb3cd17379f96182c218c2081d9a5db418e69d75d8fcd989de7293963ed752c6ee1c9a6deaf8a0b3ed7bcc288726e9fd694a79392f557da2f7e3958e913834dc58ad9f555dad31ba133d3834d91ab5d4d8f7dc3fe989de1c236f68f6d131dbd59e1b9a3faba126c4d4cdd8fe446fdbd02c4cea3729fdb698149ee8b97c1cc9a3840566ac60390b4a789498b1821e7098b48cb0a1c1fea558b1d6b2a9ed5f4373bd7095d79d75b299a9a169688f4f21ae9f639cd2d0a8d47598ceb2b510a273a846d0d0e4b57e236e2c756aad9da1697cf6a9e52de23c8c4ef4da25e53ddda3b0b89c113334ad1652bb776badfbfb9dc9a953ed018749187c18294383485dd5f175e9b96af509ea0187090e46c8d0e46d33b41c1d22d4f247c6d02837d55d7aedb6d5592a28325871514923f580c364062362d8a5bb8a9a1a312d6d7fc29ac7a3b0f84869b6a24626c3a331c39f3590180479171c1201c5481856d16126e54c4a0f296a5e4aa4c8f59b6b9ee620ef82939666010f3356b0862a538c80a14188971b97f5e9d61add179aa64e73dbc98656db1d37329997353299ccf23b1617205718f142b3def4fc1c725bce4c65c52425a519339517a89c91c964322dbb2d4056c268c248171a7c4da48dd462ad8e1b171a86160fb76a2cf52b565b689a324fdf5bbe2969a733da28e90187091a235a685c5d57353f683f39337d309285268ffdbab245074f17169a4b9d124a47b6cc98d4151af6abe8ec99ba745c35208c58a169d42dadead65f85262d7574107d6b57a731151a6cc51af2e1c59ecd7c0a4d3aa850e169ead83a9b149ae66a25c5149d8314b68d42834ede22a65b2a9df3ab072350689a33b5cf9a714a858a4f68f2eca9f566db6c931e6b1d234e68166a5a775c4e9cd2594d68d6616dcfcee57a769ac784a64fea6527adf339a5c90a234b68b41962bf2a9762d7554a6892b35a997cd562bddc49689ca1e6dee8542bd5474283ee2b134b756bd91f8fd0f425f666c51269a7e61123348b101f75566eeb883c5284663f354674e5e4c8db23446850bab6fe2845fce8ac73a298dc181942d316f559db478e7e302284268fba662344c7f6dbe7fa402418cde16c448b13b35e0afd0ff646528208301a3ea7fef652626de537fc459388ab1bfddbb2be6b3c10f14593945da9e294e8dc14447ad128efa5b808751dc4ca8be612f36dbfdc8e1da713d945c374f9af57eac99df111d145b31cef15d3e695e9acb96856fbc595b0bb53ae4c5c347deab86dbe739e62768bc60f3ad45d0ca1ffab75da28e151726050c2a3e4b051c2861a259b02e4078ac9a70079713151b66852e62ee4e82065cab6b9a0a8a0348ba3b403915a348856a9d6a73526e7b9121f6a9424ca21428be670eaf75f52a821427ea2174465323c4a80f41a778ef5c2b883c82c1ac696dfe1e47a6c99d7109145a3cb1873a6986c33a90b4462d134c7b3f21c7e7a7afd444304160d9fb4ea346d3d48d762277a7945107945a38bcf5fed518ce99b277a77798d882b1a64cd6c9d2a751823446e45838e6a9c8c1de35b6e87e320c28ae659d3bb773ad4c39ec9989c5a45b3889e4f1bf2afd474a682882a9a7667113bceaf2e315c277a9fe228262a2b9a86ca0b3299163956564ed4214452d19c738b4ff5aa6aacec4ff482b0b8dce96d0f384c5420828aa6f5781d64b71059b79de8b9faf12e696432253ed02829a3c4871a5e464a4aff884126938906915334adaf7f29a6fbb984365920628a46a12a74eb0a1f2d9e2d61438d12ad8148299a54483d42d8da496b5b93a2e1c37416c3eda6f6584f74930d4446d1e4e9ad6c5faba14c4c4ff482b0b86cfe58613923088b8f4c06cd20228a86d57a757f0ce5715c8bd90b22a16870f55e9dc627f57d51174440d1e4fae1a30e367e3dbe9f684e3a6a6debae526d519fe86532253ed428a963c58c4cc6bf8e9585760e114f349e4d5ff11c6b224ab8dc89e677f1e243a888f7ac7551f93938d12c46ca970bf13ad153977a886ca26967a48a8dd16e7a57eaa220a289a67fd5f961685b6a4da1828248269ac4923564d98d59fbd530d1bcee614e2df5bd6a8b41098f4c2693c964140b229768d441ba183a4fbe4afd9de805592698b2da5f4506994c2693c9643299cc8abf9c18442cd1e42666d4d452ccd5732342a4124db34a844df5524a34dfabadf5c55653aaf59ce82994851099447318d3d57579d452148868d22ed438b1a5091dfa9982188768eea866c7955aa8473db6cbcb0f93202c2e8668d65929a14edb8ca83dfa979476232521885188c6537bd7fe4fbd0e3b219ae4549c69756288f5323888318846a1a6f2f570dfe2769a209ad47e165d1d6a46ca59023102d1bcd2a3897439f5aa76e94ce6553ac504250d4e3688018806711bf55fc25569fdffd0345e4adf88def21ca5128ae18746d5b7e663086562a9d9895e8b494b9006723048b3a15246903588d18726a1a37ed95f5b8ce12b3e34de07a58514366b2919fab813630f4d63d7a79eada76f88dc0531f4d0e4a52e568a29ea85d8f3d0ac4bdf9673aa4e8ba9f1d0b4a3d466ee7a943011dfa1e9834aefbc72d5562ad9a1c9744c9f35865a2236ac43b3aeeba4d7ed44fda743a3ccdb2aff6ebcfcd61c1a94129d65f477b2a5741e253c3688187268585b940bf55a76f6bae2d0a4c3f4dbee13c3a1618a5aeb5f87d8351f552288f186a6a9745a5a7cfadcbafa8b186e680eaab6b6d8f5b62f4caa458c3634adc8471b3aaabd101b1b1ae6497b254ec7d4d8d1891eab408c3568ffd2c5f5ac997a931a1ac5f92b17abfc6b4a511abab143d5abfbd52ac5b262c2f22a741c6c62a0a151ad9d9e530815dedad36b811867b8634e851417a542c4ea6c428c3164e88c4e5a2b0331ccd0b4671f32d5d2ae765ad528f1a146907781192b284373d459be3a35c7f4ea2e06197ef71d21eed63e86e6da27d276b8095f958ba1d984c897fe69af545a2b0ccda94eb7f4153ae70e6b3034d7dc57b66e6e5b8cfd85e6527b4d0c55f2ffb4eb85a6a9b7a3eb20dd2e34e9dbbf51ea7667d9592e34d90e2de4fd736c7bba85e67ccbf4aa55ea3ce793161ac57fa6981fe655cc9485a6132adf27a50e524b11161ac68787f9e249a452a12b34dbee94f7b4cfd55d6985a635a657c67d56159adf7510623e9c7efe910a4d273d28d151ac9aaf368506fdeb69afb6e8514327850619b3d377b2f936fb281c3fdedd63aece891ef311c48042c35023c4f47cf95abac9623ca1414e8a7aed31d46ba739a159558bf1a8d5d38faa6234a151c438359bd50c5c1e0d952206139a4fb8f87da9ed55e56d098de3a6b58e735a4a68ee34f29ec3dbd865da2434cbbfdd793563e9741509cd3a2e953a91a3a2644768da2326b6f872e51ea58cd0b41ee5ad4e357b554c318ad0ac85ea09a5c4edd62f13a15989f4acd389adb5a11a42a39c21d5d077911842683c19fa53087dbade96c1689a51a985d251e90ab10446a3b8a957ffec2eb1f6fda2598ae778a2be45d58bbe68903e6fde6a62ea45c329a5a66fcfe76ea99378d134cd66b91ab7e4e9dbd94583ccd662b7ab4b112fa4ba68d241290f63ca6e78efb968d2ba6caa89cdb775ea295c347cdcf87e6173bf5ced168dfb1e85ab2df7fd94ca160d4b78eb7c0fabd334af164d62f46a39ef67dbf4db2ecfa248b08316cd5294275dbba2b679d489ea193b66d1ac3b94b85242dcc9519de8dda960872c1aeff354dbf6b0c5ab3d16cdb9a3d8ce6928312e068b26bd667a3baa584a7a68c270ec7845f32a1b5ab54d4f2bd5ee8a261d53747fabfb646bab158d3ae72c2e6e2a74cbd00e5634a94d3ba93e3a799fda2a9a45a84ee15985bead5baa6892624665e7ac747ac8a968124a8b52ba86dedf1a77a0a249c6558a2da63c1b32768ac67fe9ebc2b392abbf3245b32b37a5c456cb9cc18e5234275ba9955a2d746d7391a2f173989a2f5bcac70b768ca269a592a16445cb11fb124573d8b9b5964ddbedf63ad16b3945d9118adc018a4fecf044d3da5ffa94eca43ac9ef3b3ad1ec2aaa73ee60a3b57fce496107279af4bfc8923b52f69d7c134d37e375548a5b2d4bd744f3a793fe5187a931de9189a62d66b7f3a48950ea8589a6e1724ae7d9fe599f2ed1ace6213f8d696ff9594b34ad7a7167a25c8968a94a34db1abb547ccf76e924251ae4a7729b2f3bb6d0c11d9368124a8ae1eb7d5b695b9344c3f86b5beab73cdded23d1b46c68dd23d5103711128d1fa6f8dfd977eb86fd88cbb46087231a54ea91993655d456423de03051d9d188e6da1536c5cf9c88f932a259c5b61b6abcab2a9d17d1a46e8955733f53aae84e117628a2f1c37d92265e9988e6e0a926d3b5981dd648b1137620a261b498adc6792b21c5ec108daa46c728213a4dbd19a259bcf99fed12dafff38568b429b5c856e2a3db9013a249766d17abe265424dadc9e510760ca2495e5f08fdcf265e8709a2698cccb7890f72ddc4dc1188e6f3371fef1a29bf8600d120474e5ceca4ea5bec3f34abd7b52bdd463cd8e187e60eebc4d61bca6bd9541f1a4666e8d4fa9ea3c4898e1d7c6818f15a9dd2b94b906572d2f202845d5e80b8bcbcc08c1d7b68bc8fc267cd5d76c998b9430f0dffe2566a35112a962b0f8de7fa74b58e69071e9a63ecf93c52678d1b3b30ecb843f39f8b993a6e2825c36587e6d33a4c6b7b7d1355d7a1c1a46e71627c9a52ca76071d9a3feb0e7a960a1f39af0b3be6d028942c79fbf6b4f8abc9a149a64e53662a1e6c763be2d0a8374c0d19a5cdd4773e5ce50e383822d373986e1576bca1e1f473ecb257bb476c3734eccbb6f79d3162e8dbf0ec3ceb2f527d454fc88626addea58912d38e355c6671b0430d3bd28018a53dcae954e59dee4043a38aafc973537f2a43699c3371c38e33348a5ba3c487cea767eb30ed3043f38fb78e2bc66bdde1e2512283121e2569b874ca19998ccabbb8744a9bc28e32346c532dd7db560ca16b6468f47493d96a4d2c1bf33134fba9165bf4eeb77689a1f9b6bf88abd6f39b79189afb85d242bd7ffc6e0743c35ab1a6c465ee97e85f68107a4b78d48f5329655e68bc3921eed9e40d25b5bad0e0b56245de4eaf5b65066107179ab57a1bf57262e67ed6169ad3b2b5f4dbb0531f590bcdad7b969c88193184360b0d9ebfa6e778a55a6c2c34bfaa4ff71d66959aafd034648735c492f52a27b542b3d6695ed5847499af2a34ccda4aa1d3e4874885062155cbb1bd36a5a7a7d034940e51b6f5ecf62c8526d5a7f3d6b510325e158566ff10e23bacf123e504854653b2f694fe5be7624f6850cbf587adfedf3c8a9cd0f8e75a97db966aa7994d681e9d2f5d479b9ea68d09cdb7a69491fda144ec71090dabcde3499debfdf4a78466b1f4ca1a5daf336f496834715d1d75c9fd131e243487546bf8ad9b8cd39d23342d25e58ff22826950e1ba169868f58bbaf3dbd6d2a841d45687c21cd4dd44c2bf77407119a4ccad62ef674ada572a9e355501aa5770ca161ceed5c22b7d656e7ce600674ec1042b39a9edf71b427bd21142065047139a30d14209d61f90549301acdf3bf47b5dd7ed92b37cc306159692629ec1d48cb1ee4061260342b31c6d5983ade164afc45d3ce3e1e74955453b1fba2e1eec4c8e8306ee7d2f5a2c94baa1ced6ebb7b563590f0a251d5d4a773ee6eb154e90a24bb685073528c3ee925d6551e24ba681a62b5ce426fcbced97e40928be6f4af85abe9a4d4fc5a144870d1a8b67da9cf396bb5ed160dfea152ecb076c850d9a2596788b7b49ddf5baa45a396d3a6d5faa7b1859e16cd69eb101eae6bbd52d92c9afbb45a1d3d9fac375b160d7b7adf216b47553fc7a241dff7a9f697f594824583d71653a79571a993f6158de21f6d4ed7da75bb2b9aa3ad569f642cb13ad68a6653774f3a77cea16c56349cb8a87ba1d7a316e92a1a4fea2e295a3e6bdb49aa68ceeb4ae8d3e2d43d2d15cdaaa6ddd0596cc7bba86816a2e7334dedc732d1291ad5bef69558d96248a5291a45fabe4ca1b62cbf95a2498c534bdd94cd37252445b354536ca85ca1b5fe378a26b59e5db92a316a4945d1a4c5f6abe99a2e43e947aba0121f68dc310249281ad65c29961697ba735a110f140d62b716faddf3a9eb6b0a249f68ae1a2ab47a8fb594cff2d2b292c24c165352143dd1fc2daebd3efa88d0f1133d4447b7010c924e34ac1aa1c4848e997ae7133d96202c2ee9509ac587154838d17c62ad1163bc4bc3e4d160924d344a2f35f4fd9ea9af3693d92d9068a259d4a79d86e8d14a9bee99ca8a4ac685470b8f202c6eac81f9921940194832d1a4d3d44a6bd73fe6e362a2d945cedcd55833f5d4279ad289e4128d52ad3973942751f942339058022bc12f24946834d367429a10d9751fb1b80069836412ac5929cd5327357432992693f9c10a0b1249206aeb9c6cbd105adc1b89bfb388e8e061a4f44ef44a5c5f4a7ea09cb464e62859fa5272100b09245ee5a1224fb6cb6ed7e5650d9533121b248f60a4e820428af32465454cd58e52c9f3936a2c9de8a5a434432a67601a248e68d2422d5719bb1bd1f03752a738f93774589e33394634dea9d269ab4ce9b376248b6852b1a2745cbb21e6121f6894005961594126936901b2e2031245348eaa1442f45ff795545652786432afb292c2039244349894b1d139bfb8946a3de030c901092296236be94f7fbd9d4c8760988b903362febd18211d9018a259dece4b37a9a01cf20d480ad16caa93986e9b177e734234eb273fa9226eab55ae4134b9e8907aba86bd0e6b4134a779ba32314baa99a240346a2185daa9e7b76e2901d160a29eefc48d57299e3f9c956b53f345dce9288390f8a1e1432a9d46a4d82ec4b2720e7140d287cbd441c20774ce5a3b77c8fe5142997640b28726756a4a1bb65dc9c793440f0d3b7dfc0ebb323a2ecf3d90e4a1e943acfdf9c66ba594961e48f0d09cc6a81f21cfe40b9ddea1e165eee9503fbb03891d1ac68a54f3d5de3a34ce2d1d2db7335ccd6c03123a3401915fa8844e0a15711c0c858120880110844cad1605b31400203020180f4683d134d1b4e90314800340545ca432281e14c822814818108401613020100cc3200803210c03411005ab24748f0018c71e4670c790eed24b1fb48aaa1a8e1f3cd090877c1a100c3dfbf503705f9e6dc341a64406d43a71909887b6f5c682ca2941074a15a5ce31d139bc22973002545540e6dd5163512b1ed9786adb4301d8fcfbc12396f764ded133d31af749400fad43080f4a8b573dd02bb3e3030f42c8c23dcf373609fb14b6fe876a81f2d81e74686841223dc84374112845e848ed67a78481cf359745eff5d54f81ebb57cbb048205fa283723f5d1efe08bc051611da2e5be72ea98e23930c73456c0d074c4e3209112483a02076f7e506c2c19cebd05e483559af7dd6d40d51cbf8c5919ce0f0fb0bd48663d31200fcecd25da915dd549f0a5fc7e7c31de9eb445d4e0208cc55b22e5c56c458f46ccbe4ce01a595fbc15ddc51190a63d123b4a633f6a7e80721f01125a230303f107233cb002a0c6a7ec04bcbdd00bdc63dac32775c92da95ed25ac32a8206f09cb17114030fdceda98170467ed2b72009c32345011773793328843812b5bdfa448ec210116f804d842c5187b5e97e737df537ae6691931ffb4a456b73c8da48c2bd5e901fd53dcfba553cdfcea696e6c460c106805d8d92bf1f2f40d762689c2980d18703a877681f2a0a4a70d4451478d025ae5e4cb2f7287774549430d405286e9426143a5058448bc3cd5c68a1531654fca5dcac0cb1ed76a01561197884818c500ebf9ba642caeac5364e6ccc4d47d99fc1089eae784cf8761b2a7c1c9a5f668bb6318de360bd90d5a0bafab6e251cb509a8fc28e13a1f13e5b0495b60bb85db828c62706b6ea2fa6960872c9740bef32d92451b1d65002d803331a4047b7df2b8df91415347d0784f900bed44c5c4cd5e57e9c80acea22be1f5ff5231ab8c83ef07a34daffd1b85cf0f39484b1e4e5a185e4410582e5ed58118cc889ec2280d7cf8807ce743b509667b469f46c661a439b94c2d5fe8a780c98b012592298e29131d7bbf66bd8debffe0b88c8a6e573bbd8ec0e4b114e003c147b57127c1118f2ea0bf29fc2a0abcec126679de0b420e8075a9700951f8001021b30c7aea3ba6a58667aa6e0e7c037db9d230302b742e7282692154e77d753c9c19b9c45b3f65b2a9a61e4f585019870c7f608627a7f0bb2b728c3c2880d7f88ab091a4a9a4d24ee9aa12bbdc351d30b3065da20b39e9ee63e984808f81776f5d6458c9bd82e6525abf2ec58291a83d12e4e14c5894ebdecb6f9ad0667afd8fa40551b7c25811cd4c9a408a78e2b24ad145c14ef1c8fd2f99a5f6d484c23d2ad60480d2f0eb046b714b11326325775881b91cab5c7a433b808d1118d42cf272f5fb9e75d6aaf0d7f169388552586bce7cb70918a949cf1f2a412693889a78280df1373de2cd1a7f6e43f8ff05fb99201c9d31bc4690d5b0c0614cc4a16d0ca5153dc09161288d8e103c8fd350dfce83961097db2f9d4082f6d5082d41216a83f5d0e527b1b2eedc304816fab3309a32c60271180023fa020925c737eba0f9bdd005e52202d947e9c36d1eeb204ed5082c6f8876222692fc3d83e3184a708cf2fbe32b4b0625688f80bd3dade7d699bb3c87a98a614848d27e83343cee06fc0c752540c14a2dd9a00fa20f034cb0889433337ddfc2b9543c28e07aac0dccf6ab776dfd8688258f1467f16779100c31ccf9032e20206384726edf817acd7845ac1a865e03129b81afa9a02c6bc92640c3bb09863a102eeaca0057cd0dd4dbd63e06caf08c3be10ed1c1ed8cb9314053788d197148989d9eb9ad63d6eb0d510a5563ea370d80e6e4388e3981c5b7a2c234541fe337aa4d4eed36907a373f3240e98619d2ab840db461573e7481090d4b4d856556fa56a7a7654c9265dda0c714658f1b0548eeb861996a0d401c3197af0fe64f7dbbf0767275a7fe51dee1e747a4e9a7e83234af723c8f53860e8c880523f819746d2a547a21d7bbc48674f74b37baa63d08bd387d5b88cee79ca7bd97a1d3dcbe14509add1e3a8597b2d6f57005de6db820bec436dbd367817ffb611be02c9fcb12008a7518b302f1044cf201fab41bc1e4dbf9c40113d213ebc183c249f377893778ec6ff28554b7faa214538929bf6a52502f917322dec470ccd94460fa9a3515c2b31fc7742d63ad44e9847d34f5993aba4f2191721a60eedc236d83e2dee9cf4332798f8d503e7c4198135e24082e6861b7cf314883e2c606649431f3ec95010fd0210a41f1ad37307aca193e9e1936046e81f72bbeedfa5ddf12c4a6a1d7b3772b385800d32d9f7af8065739c5f98d90bb5feb6531fe091864aea7905d1636a506b99a0632727c559f9b16cdabe4c44f7fb8a0a1a21fc7c86d17d94d67e7ddff97ed9885fa270b8c2958fdd268f46fbacd4a1eccfa5360fe0e218c1484a80564ebfa93f647b15526bf515763b10305d61c5ad05965e649599f7a3fadd2ad1bbe88cbf7b3f098b6e002da739eeff3799bb4c4d1b89a74d172f3d874e64d2c0d46d4273120c65f109cf546b692e1404d3504e56a6b8a1349af99ca246059aac3981f77441aa5df07e6b260141fa11efd493ad87e2560882f9294467ce2d1283227f8f5ac12d87ef4008089c5cbe257683ee87770bd7ed7aeacc61ac9dd87d7d8aacf607ff5ac6929d5f215aeae5a4c64112160c3de2d3dee43a5c750437c9c1b3873411faa85441f527eb2f7a4ca871d2089457769d5380c14e3175365813bd6743bbb6e117a9a2c16596a4c2617337b5474caa260cccb7f985b0d03b6970dfa743e942267bbffd8be83ba746b1a964a766c7c1de36241d390f2696541f2551ea070d4c18193f0b85e9864061940883712387f6d50d1a01f1b54e47fa71dc5482bf15a1e15a8414fb7953156d7a2c8155250d03d2aca6a8e9ead0f7bc251647846ae92c8799b96db1a797aade3bbe4c54d641fc464aa92e7574f5b560bdea20a782332aea674833d8b8525990853d5d1b03a21f78ad9634838df2c44a80ac0e1d9d7ae790fb6df0b29a43cd9eb4cb41718f4f39a566240e0e9940737249d65d224de27b4c6d27ce051c6095f47ff694f086cec30642819f15238693c7e29f6f65f6389e7e2216c67d305157922e1e431f392580d203402df241aa04b0f5b88811fc8403d3abffdad202db7ec59c8382fd0198a51960083c93bcdf07c13944a1d785c86bd178001c1a2a4198a377fe73b8a1b1fdbcad2c130424b22edad3c40724cbb4c9a56d4923c89a6523eb2eabb1c70a62a10210c5b3b8871b113369ecf7e9bbac61b5abe4a38b65a87d83492e55898825aa06bc8703df1bd38535cfbafa7c895d2adaa8efbf480eb69231a92a32c363bc14a2a64884be8b9fa4ecfa5407979336b99661a238e14e676d5e2277ebca3ec0bcbb55da751cd489fe539e703675f4a7edc7ffae6cbaff4c74feda80053d3c7ec0edb491cfe4aa57d349c45442c955fe39cc9904e06d89014f2551285c525aa1ac58ac5302707744164ea189084883d748e6f5df8c2188c33df501df67468dcf5005ea5535659ec3ece5c257fd773bc2807e8de748355cbfc5b19d2f12d376c4bf561351b81663226595df2224a786cf3226e448a726938fef6628a6eea4c6a1c6996627bad48e3ba9ec7cf8c7496966d40af2e70645165a0af2cf8ce886622377cf1a2e4bdeec9007a831a7a52e5fc6baf3488c4c01b27740ea63e223abd6663feb02602a1e18ce1a244afaa56962a6959278f94e86d436fb763f2acb73717ad938e52f9de2d3cccbe553e5867093d1972e31add23d455a651e89ecafbd3554af60fc2766015e437de15fa1973dd102187a310f2bce2171e699de3831795d75cd6200b2f7d8b99a0be0870bae49cc21628a1c8f03a4ec6afcbe73d9cda0c8828f27cddaa158e1b7b2e6809e2e741f388bbdf0ddcf64fbd203e440b9b96a0677b1c53373e3eada6e1512c28680d1b61bdf6f05d8d15ad9332e73b5cde53cbb6135b5945828ea5a999c0ccf1713f1f52191b35bee472e6e4b676c172f4e2c467ec27427e87d424fc7496cdf4d8a3537e0bd9f33ffee1e486b58e79d3ee91231e9986f8074566080fd510c3106291bc85931ae3d34412cfbb6ac6f7ae49ee646ba463e9956335621dce5e93f05cb734956eb91ada35e5b63f086c3a27233b6d700e4b1b3a1cf96352c1c7564178239297d92d82c5d1384390cd58e3c54ad042273a941e9b08dc12edf5605814e0f014d7372e2c22dfb546b99eb4a3b90f97680eb83dee27dc585e3fdefa340e14b5839b00ac75dccaa299b5965a4b4b080845a6c6483bdc14b83df437b828649b3c4de650c43975bacc262c17d8724bf44a61ee4f37764bd82cbbcd48964d71bf2153776157b70241a25763a93ab63cdec06c34d9342c4375cd8a50f94c1981816888cab43794246b16cae129d3080f4f9ba6205d51232006199fd038d2514c257811dff569d51f85c96dca32d87932b6130a0899b3ec6dbe0dfff95068d443f33fc0c8230ba22fbe5ba0ab0437a3444c527368ca444171c6a055b8c23e56ffb29f2b4d347bdbd880997f3103d8c0470ee00421588f938140876f0571780a47a51852d8f9ddc989fc50266fb6334082066845573de490231fac8dc5eb44907b73de5528f147e386eaadd63c2321d0eab51d4bfa1aad91a94ae6364a41d223418b1bc9d4ae078b7280915e202c3889e933e5a479ca5e376da80dd0d1b5e83611d78284598518e632eb8b1d5e8f7207a1301e0e650833d65fa64b87daa72ebcfd1dd45a93af6d3266b021f199843d241221fcd17d46ddecc9d458b00248dcea895bf3d7e769135bbfca201626323b166b433d42314bfd6aaa1e1b2ea6ddc7a81420d9a5228d29af619d7f50e03d8184ede7e41710f418b8bc24fe644375da5c4d7d99f5608fdc327f8af3ac518a7d1360c1b93a4080ea5190e6edcde1019b4cbd266539784dce06cc4b91ca42411aac9870bf0f47af134095855a950cb61fe85811b32029cde562b9541ce0962c05fafb074fa06608c8623df6f0a8617ad0c097d4d0d3025b15153b1b11ef0bad389c70d10be48d133da692c233de24ae16698ac57a589e08f4f49273da52f47548556e81a496715dc68aa2778d6c7979880c53445094d42dbe11f4b08724520e7e50bb4da220a461eed50bdf038a9c10e1e7ec290844c4d89819c23c928ce4d56feaa0c70afcea2c4255977aeff8897e3eecb9730e4b40054a0f75eed020932b1c6b03988cef707e65fef0192899cb0d7fa736daf5cdb1e12b7dd675c85f5be0acfdb03c4568cfa4698fd515255d67f0105646b4a7643bcaac8d801d0b92660b3228c925b791eb351e7b5c17956e4fe9bb42b41d64bc8ae8ddaea1f2b457670a9e0c7084459baaab6f473565a9754d0112021359df84ea85cc94f4e08f03aeaa157608a1bffb613617d639395f3d8ea9e1729c0e86b3ef0f98285a303e4474784c496ca8851c1e4500813449dd589d2578c4a49f3329d82af02a54be2b736a68c6646ba31e98e8848205135885fc8581179f1009e1e29136a1d69a2c2d377782e4aa48336fb098341066b3702b9b7d8c4064a68d87de482e1a63f6fceeee1325693c25d15125474c59ea6d19b417a021c698bb486e16235cd780e9a6f40f4eb769d543e49d08aa01e04ba1cce65d0793624172414164c0488bc2aebc22068f54f5c58223d6b7e5f01868e98b6f548d20ebf9a799fdd0364cd86b7f19225abdd3407798af49ba8c55f2bce9b70ad40a87816b588702101a6f7e4406f187d28cb68ad94cc50e172deb040b489026431e09727d89179d5820c3acbed2f139b9dfec96d266a656b00ebf2d95527b79bc30baafcc516fb1dbeb577b1e609de1f0d23c58b0e54834aac5b8251ab4285b24b298e3c322fca3be65579983fc142569347680cce7877312848ada376597a6ffecf4b7892eb537a7eedb8f64b8b672dbfa14a83f2fb380e11e8c5dc29ed555daee9b6d63190b38c345b87251d4d49d59fe8507af408bac9a4b84f085069d20a7da68afb56a5fcdcd7be654d16d1c557598e8c4321b3b5b9824d58d2a6b52852ed76370831c1f91dcf8ac8359dece5278849eeba42df21ce5b20dfcb96d7ec14578948f37be46bac93500ec9b78b82f455928f7f349360a557c0e89d058578e85d37226354d21a0ec2b10936aa210479a48d1a7a011f2fce7857deca58e98eb80adb9a7f0def8d61654a83241a422ec1c00d521e61fe42c64e2463f9dbc46217d2123a491264f4cd2d4ea1901c39114581509c026e74e4018b34297bb75289f80ea4d637fe7191a05f32eac527706f7c630186d6f8f156485433c9c08cf21db67d51aa04e14b8874096118c5d08dd5c8ad1f23db160c5d9f8b722a1701100c905080c2f4451e7e5a891eb83cfe382987fc98875c599611ba1ceeae04ffe05de95de61b57adf2e893f04c7959911d0c24cb803358d3bb189a6a2a5c9947f1cd8a8a1c6b0b7131b869dea1e4b905aa5c92d612e54384ca3d021021e6c6a3fa8cfcd709a2d0dec52fff6d5e3917e92154cb59ce7c5691e53c0e48fc3501fd93615743b9cc99abcb0daf4c070aed760a093c04c8440bcf463cd8e0c2722c10a8f95bc8cb6dd7e0b729bf4e5aa2ada456a5044d89092a66b029c9c30941177c98a3ef1ad7b08de27f5370bcd7c9b9b192579b21596b5bbf63a54a37ece23f4d2d2c477bde18fa3974b9dda3e520bfc121d4cced09dd34a5ef06b56d3d3b96bc6ed60d1582554f6fec15d5757fedee1fc0ef4d5c57d4c82f52128bbd778d661946556a3b982ea568acbfc165b20313b9463d9e0a97bf205a6fd99dd9ab44547ed486a2dd2c1e0e1e16de73125619130b2908e3ec4d298d801b96e23a9017e5839b4454bcb011cc0cf01bb8b8a70a3260b02d9f412305cece6f2e2c9907e37976e1f811e9641fdf5eac2389a51602f87dc4a21f31a21d0d0fd0517584a5b002323eeeb68c47aa9656c6e03c0c4cad37d8c06850af8d2948e6b3a929d172ad8989725222699d1ddb5d1a380dc078b7052a97d2d263d9b3167fe8e96a7bbea99455d57563771e989d56458a321a344cea97a2d4ce09b2c728c2be3f1f968e95a367edde6a0fdb9d4c570356d89fdf001f27d69817804819e4a6c587e69c16370469cbb4af546853d5dd044894543a6329f3164c06371791477260b9914c66248149a892a8e485438c32f0745a06453da338f438493a94b460880fde51b8f4e7829239ec8c727a90ab41dd4ee84bb53c007c41f1d534880b3335ddc04fa0d9dcd4131cf998c44474a88fe69ded30cdce3760cc2e8cc25b02bc576b1103c1145145d41a16657bb826456cf5785b29a2c1f5bc82f645aab96aa098c7091f6fc826488e4e984ad564bb876ae7d28da1f7110836926e80035c8a06bd4468b0047709466131a59aa16144d5c3d9b4b2e8ea25256e514074495a900201ed32dc5f94e59db4c5f40cd07c3faa96dbdb10f237b3734232df47629c86a214ee87299412d6a15d83568d3ce9edbce6a2d8b14684d10696fd7d575a96c33bb3231d825bb5f07c8006e347a7ed4e510c6bc94cc65825112f70aba5c35dd0ecb66d77b440286d49f685e758eba6169a0f28618a0a1b2bf439685f19c4985c5ce890e158f30f6c7d81886cdc9951a46be0b0192058bc8c19d580588272bb3122da4395357a3304c168669a1787a877258a47e60dcd12f3d48aaf0611839e4ddcd5e2ca52c85359173eae81edfa4f73db927414c6f3f925906f86f2669b88e66517a418462438b29bd06fe0d629e6192e45a99de236bb2b4f0c84c02fd2f843298265588d7cdad21e303256388acc09df6f364b2a651a39cacba0421f4686c132bbf894e574e208b917bde9d0381a8b1f0567ec5872e53f36e1ed9faf1bf4f127863f42a5872c1b6e25e0208928b4554e4b08a30f0675bb6bb82004027cfa887937abb6835f7fa1e3b734aa56c94038d1279065bf7a3da7db53c9cb32803c6d4e3b12381a9a246e649fae618e624aa59fdc042a3cfafad44ca0f4a73b2f4ab66b186c36d40b7f20d46d3135ad7b80928cdf6cc406f0a9cc9620b2ba654a0fae8507bba6e73f41642e49a0cb0f5c9cbc073b05acff1347c4f7e61c6d05eb012c71e601d3cdabb61ba8e550e24ab154a57abf51dd3f3a1612221c061177ee8c37be0ddfc543d0ff81ab0744fe00ef119e25f3b73feb6e64691f2c424e550a60fb2b24a446a7dac88268c80d1b2840c2d0573ed7f9edcc671978cf8069511b45e509b27d55ea903124aa28fbacb5b37bc10c7e6957ae4c77d85377060b8e38b1e8f2c0a4c495f01c0004a17ca6c7d01e1f8e2e3cc6f99d123d8583a0337662e6ff204ea6316ed0c369200ceea19b98217d2407c8d80dd54937160678a00687413db82933d047e0b08cba413b7523c0a007d7a030d023373103f8380e95a137b4136c240cf7a01a08437a701364988fc541337a0374e24687a11ea82161a0076c5a86f2886e949da61936064379528d05022638c243a81392ca103c124ab0a51269b73b933ca35e94f3cec13d0e439d62c91c21106062220a14ddab78003b9987dba37af05e4927e34019235122f4484d810802e95e681cd623e5e23961cff02876681eb50764518403a925389240d01448397b4a0fbd47e98038ac97cba1e7e41e8987ec80bc666691e88822012548e2a2f415cc33ed41191031a0aa64baa2e7fef02871e29c60158787d2c538cb0ee2734d0c9d72bb9edda3e8d2984d022438c243a891b216bd85b150e85d4c8f336773d4bd94ce1a5c2bc79cef28dde5656609498e200eecf01ca4613fc5066a3c1cc8e11af4265a4c1102017e2c8eab76e55fa7c5f029cd920bc1a79ca48af0883441110064a66a848644bda54b03a905919e88fd42f6229ec80ef3787b480fbb27e8621c574fcae1e7e81e277e1f99b2fe76e990ba521e2b16bac3e15b4ec613767170919eae47cdc139f21ea40371ad1e25a79e83ee465ff0d789e4ee593698404a7a500fd34cf1e7905cfe72f85ea42f119e8d110837aa0dfa4eaf189d9688580b4a2ff8bad4e0578aa4b0f0aae6ebf016eac08758a88b269035d3db60d9bd44001794626fa7af96bb9800a71953ecee17c8d1daa8d6a4dc857e4dbd266bcd88ca24f605a55091a74cda9959622a273952a4c4af6949199531e12e80cb58d566fa944e0b50f892eba2d768d294224a60968152b4a9b4a20466252c4e97ea42d39253e682b64c97324519353b680b75859b5506ba3e0a7257dbdc4c04290f14abce565a9984b4f25774ded69aa901c21204732c2f6818971977536ffedc66a0ccc2f7d2041d00cd69ac3bb5e747c7843b4eaf2b2f306ccb7daae670936a9e6180338177950e88a2df59cef3b86325696aa9233e1c53a78fb65ff4c1e90238c672d3147d1a3e323d91b9859cfd21f3598d934948e61b70ebd5ebb8b4b04226551e7155cc5e5215beab8a281feec5bb86f39f580abf0cc3dd5526be93943e1d2343d7025d1d7145e7cc6adf58f8268715e4c2519160a809d36e17d7dab71f1929fc2f2bf47f16f82f0afe070afc3705f93fa820f2bfc23d2b65769f5f32ec4e1a2a496a6ed244e104c3fef0847f592707238efc34bac0bd062ff552cdad642a27fc25659d44587c7fc445178472255a48ac0bf85b691b0a5db65fd9aff0a28fcaf0ac878efa4d1779aa279778845bbe69cbb9dd614e20bac9db813adf58ac7a16a37b5ab0c5e3f43fe71bc51267338b3e369b40dd181488ca8edaea2ed4fdc08e8e510a20585ac6a45dce827cf0c1d52aba30f978d1a284fda380e41ba61d03c2f68ee9fe2a3cc7f5bed70e73daff39d49b6a1cc84e69419d90f837719c6459535f53dd19180af34d81267ea6cc0687cd436256ffefd211d06a3605471a4aa748fca03168b90748e1574083c3c2e8360f83e3add23fa205dabef7c688d4cefd88979fcd200631a0dbe4794c160c4ba0878056e35dd114f5ea4a0d891b1819a998bbe9374f3b5de1b14bab51432747e55aed408472ee11347f5857fcfea23fe46c6a850b9e792f16f14b128d2e13fabab45a42fc640d15717974a4168f56ae70a11ffc3f9a6f472561c492d18e5386c2e887c91e157164b68b8031439010c14e1285aeb9938e47138d0c2277ba3d81492bcc445977b39e8013c65940afe7966af6f4b12770fef1cc66e0a15e0ca737d85e47f1e6f03c7aa893aa57d134fb33b719d16be5bfd35e59542ae463333622816f66929ad5ab07de0e9aef6b75ac604046839760be1093a0242edd12d05c675ec38c4f00876499f0ecb232340722e989f8880d078c258718e8ee2582f26b36c0a360075f9d09da7bb03e4f640350385ab3c6164aee53ba608a193c18cc77117c0b5064e538ff8d1436114c305a417857560e1f1d0d499b2dc223d49a731380859b5420b8f2326ec7ffd2776b14520a1f6720c399a5a5f9775c639f0b1648c21664b7968da606d0835ae904eb7f2cb8e2e39c5cc61506c2067a477dc60db8338d35f8a5a2d64d5b81891e97de1916141d7850dbcb0a7a33d0bd161e47eac9762adf72a1a432e2473c8d63f1e6947918663add0f6090ef5147eef1b0c326377a649e01bd14bfe620b6b1e33b76a8a02a6ebe83de695943308b8a788acd338cbe7a521671f82fa2419b8283a4c28bce24d4743bdebc18f144f7fbf0afa12d1ee549697f1b18629ce0c4d3d43738a3cf49781e0050af012ab111d8c141c19da5db646003645fe7e7b57ecb660ad38d81a1100bfc09c0c09b40221c2e32b6ca8c7432f6e09a17aab0349b97ff64b3a13aaa48af34877a5d7956baa7132d5ce201e635695b7dad9cb56a7a42cb510eba4bfe60e8fb6116b3402b7bcf4d65afaae9bc605587f19865b9d567c331533ddaa97ac9a0ced0d8aa07d850b2b1abd1328ad871ca0b3e66c088a3b9889bf72daf84f06d9a1a99c49b03f371d0ccc4a6f6570c7a5b40c85b6b63452171b0febe55be6b256aaebc8a9476a705013accce50e08e117177bbbb480ca6388912d05d3a9f43f45db3018a3de9c2181d0fdc6d6cf11c050a194a091b0905198a440d89051985448d89820c8584a684c20c4582a6c44286029998c66692196e033d7ca4fb5eed594d76a7b4c5538bed7fd0a6a65c743138edc3a2b04fc1f69ac2cd1084c92c06076c709cad6acaf5e3668616ba6393004b056427a5754737f4561de49b8686218de9621d38de4ee2c3b642c14a2435b63ef1746b9072a11639f5607849b84583f0afff0466ff3e7ccb2fcfd65516a3c0c5390024c2b0ac470560f99aee24df361bce2bc0bf2eef1c50ac91ac27e4eb1c80e963be36c3a74b19564344dfa4773b1c148ef7b4b7e04d1fb1e5f4a27909a37fccd8add1b4aee0d239925fe4333138d3f7f0b16a4a7921e29e131af3b86d235f03f3b5e122aec8983407e59068a0ed2ed98310b595ffcb40c99a9bd72e13d05c30aef074e24c3ffb269000c03c0eeaf17f58c03479a024f0c0f6f56d3db5dda6b3d6096c8cf12fa98b65a9f1aaec130455df908377090bec771a6c66e09bcabe37960e627f9531d57b8d2b05a51712604481913d3852cb5430932a5f978863c25958e13f6d206c722eebe148ac973d721c39ffcbf0ad5e9e9230c1a3a05b10c1c0e1bfe5c3ccee13f3fe4fa9545106bb23d36e3557f8f4f742500416adce2386b1a05dde61d14df9e9cfc7ef1e14fe29839161073cb152bea52b88409cebe7c2ddd27cc771c7ccfbe49ab7897c254f0a8bccd1c8b14a9cd4fd336daf1765d73e7eca7bc737d4fefea406f6c48e4ef3f3980dcea7360a24bfe07931fd7c315b926fb2bfe0be755d03edfab00989acca377596b2119338c0b5cd00de52abb9f51ea8ca5d9d7400cad5a790eb1eb4e51e0296d109b5716e10df02a2cc5185a3460baf44f7863f251c0a7e49e26a7f11613739852a7650bfbcd5cf44b09883137a736030e181511e5ab7d92849237ef9ec32853f97d17cdc3212e92f782c9018b7d7b033cbef6a5a752ed77385da624d1d95719c09f307fd12f2c370ad6a531eb5b12fb18881f329c0d532878a966495c0beb33dd426cd6c706673d9597d66b81e69926fa13e3684a40786fb819993fdfa9511a95b288e406e0ba99ddf75814ff89f25b4bf64a3c10b198e7f91e21449d62c747479260a2355dcf7ad89d800e2ee3ac4d4b54ac3e5c2030382f55b9705aa3c6943b5eef963052a5af766ed6c179abc29416e03212eaa1e0e24853a541619d86c42418dfeded0229b1c3af70fb29043f1df693d557caf8546fefadd93b7b22f345cdc3e7008efc9518686db36ee6c5bda34cd101dd5d0ce1684e2c8e04019cc0cb603473a4c70b33683e74c7e3811bf983c340e1c02b4ab4e431fddffaeeaf333981c7aa48df50ec73bd5487f9222945d1749e24e33fca03c25e69350876f06dfe78295e3dce8d2e24d523de41e82f55060a37140bef6c2dc1225c4fccff95969d7d72459d5fc9908dbd68f2bd0a774e6c6e87881a8c8db930f03912e54fcc93ee45a4cfd85f4df93eb6f6fd99cdf8322cdd0cba4692f1485b3fc08f70f1e0e4971fae35bc60e6c76d5d6c5541e038b1748feff354e2d38290ca6b2d3dec8e4b76d2c326c75bb1dad489bd02d5286600e47d08be9a951360b2e776850c79c75e68ec6f3c6aaca696ef67df33b7490d496f983a255756315144f2aff5660741ae7e68ed772a461f6ac6a6f9dae57ad1f05c6d6ccd8594f120ffe31287426340add1fdf31f351496a9551413e034593b8f71e5768a00b494d527c30f734c36243ee03436eeb290e47e0f7584396c9b94abb1e9e8b16045f86017a0e224bdf84e2d1ec80b0e14b27e44ba29199e281d24b5edffd011ecc77be7eb7cabcb2b24ff6ca6a7ecc34ca93b5bb8c13f4e4241f2062afda83eb045bcf59767d1371d6a65ee2dea83d31c0a8adbb1fb9de464adc6bf1706121f139243bff61c0a1e34202a61777f048b734131c880ebac12fbfd06d99c6726305deaf3c30a5501949dc56eaff9a1efdd95d7b8aeca63f04fdab772e80f6e6e72080dc383ae65718b21e299780918e41fe497c31fa8f7b3c52d080cb04a617db6e0b9fa482b3a2f175ee6bce59152baa730be0b6d3066205d14aa4087927cbea80f4bf1fd9f53f0c4b47be469f21b1cf2c60cfff68c794c924bdbd18826f0051c19448b4d3e4678372adb90dfd25295967e419ff89ab18e79c0e56c639f48a4e49e169f3bab387d0e3c083c5e0feaa6dc9d187f3af0f0f1451f2f721d32c1abdd576520a65ec0e6b1d09e048d27d7bec47027a3dc47d761bdc5c67e55d976f661096310a8cbca70e4bd0a60f4e399eee73f1dc929af64d5ee495dd85b057dc42e06ebc409846e15ac56262d7b85d6d6587a2807cdefcd9680c47604bd6091f850987bdb6b00dd8fda31d996e7efd7c700b0901c4557d7eeebc1f3821f9cce264a398e35f5ac211dc62a0f2efa120debe8d2ae604b78705e139e0cc20fefb4b3703ef3750be089ec2fbd585de8f988140ea8dc039742a0be4906454aebbda54f2e4b5a7397ce3d0fd9a7076f50a21fdbc426d60fd064d2faf5fdaeeac72c85c26234e7181299685f1ef65d87b710b4a231d5ba2c778b1948ae9c159441ebdabe6ba63c9e6bd614b335b6d9aa192ccde364d71405b7c8905dd1dae891b2e05a828d3d5146e161f485d23810b8af72e601fcd6aaf4cce9d04185abd04d1f4f1cc7d2fa3dc9ad6789db8b06adc8a6a0b78f66f2d9720659a9c2e65fc05e133057afe4c1732920e3a083ae6b7fc8649f575d15b275503038f542770f3f496a4b1bef55781b4ec4f937a6d242e7f0c23fdc425dbba2bb72dca60311a71629a7a9a7d072b50264588e1c20a517d684ead354421d03b5485d7f75dd36ee7b9cf4aeb3dfc02495cdda71d3ba20f9311c624068003c38fee488bb833575a41fc44abf144793b12f09beb84f0465a38ced1e1ec8fd8c6a61b1f3bea169d67a4386b3ff0a21613f31f8c45cec1a385da41a153ad732a3f6edef4bce747fb5634ea1b0cf4ed2797742b5bd8b303ce95e338c60d1fc879f36ffa89e23748cd9d90a398701300b3c427732f05afb142fb6b7f7b9db80ea239cf5aa48f35fbc460bd9737bd30177d27aff771dc6b7a7cdc31fcb307857f1b42c03cfec849d2994c6aab3a8d65f47ac35776514c07f061fc297ebf5f7affd7d837d93c15fc4e47b151f829f37df9735192d28baea173a80670c394cafa56a6fa474eeb2b989ce885f40d8c9221245abf32ff5eaa4917d8bfaf5bf2932c9ea464001f32da26adfbe14078dea6b5056bfa882da78be6a558fd63c66c8dd3be829bce91c6a2978dc199be861f3f8dafa3129efa3aaf68c71a8fd711af02e0779542dcf0f5443e71ca39c4103d52e42683a7b2108eb98b399e0f3bbb0094ce7a8c41fc9fd034bcb18b70c577e821a29186a4f4b49036a012a774f4a094143013636464888d1a91114364a02a5a16a868a3aea98e8a4e0270f324778cc898311a314446a6c8a8211a31454786c888111b31464686d8a8111931446386e888111933462386c8c81419354423a6e8c81019316223c6c8c8101b3522238668cc101d31221fddf92e6fb764969b20db8c69d336db2dd8185d13d79a31d534a5f6c06675b986aa52834a89464d49a34a49434d6943a54443a5ac41b544a3a2ac5155a2a1a2d4a452aaa152d2a45ad25051d2502bd158516a502bd5a82869509569a82a69a89469ac9434a89434559436a04ea3945c13e90ab9f2d18de36aa34bc6358bae060fe251dc46e09c84f288ec122fc1e7bb7cb491b5886ce70f72d8bead922c324ad14d651447a92db89778140e2f0d513bcfbe8a55d6e172b1b8f9b961f61045ebab554bd637b8cbf7f17bef62d88cf21235936f2a3ed0134eb5cb7057502321cd988f5d148de285cf8d9ee092e13e33e03be026d362a3aefd132b4f9c540c5af3da01376e542a9633635588fbfbf1e0daaef87ccc6fe6c6abe1c49cce7dd9f912d21f081bf9aa7a14a9358d364efa8f76173ef218b21aeead37849768c62fd304c4ce512408171749b07118512ae336c452728787ddc46d1594e511b47b6d41bf181abde65a78b045b40c637cafb07bfadbf5669ad1331a7a77972e571b93104416a682f1238df1730abf98c03c107eab5e392252ad0b94d2d4d5309ff01443ccd5b8219cfc3898c594249c0173a7b2d32dbbcf079ec36f2d4cac210f2a538b0bc0d2bba2ba1831aa24aa01c3c62c138469f682da08abb10d7a18736244943ded0256b080d8e7baca4302380281b687b558efb619368c709f23cc39cd8f82e8503b1f653d202dcd9dbe295a558da37679dd0ab6f3383850e55dc4b33986642324ab31a3a99e193dc83167833e9f16fda0040fd42cdca1cdb4f4b2ddd8835a922a1b4205d0a689f43fca527ee736021865ba87cf8b69e9cbf14b424b1b4dbee25c4d2f70b0f444844c822a4624c87026c7ea7b28167afdd38a411c045ad0f4abe6b5c0fc944c665dd82c78fd201f3d97abc9a9aa99cd5bbec1d7f1d68977ddcf7d157c4901f85b3d26c0c67972aaafb5a0be8610759f64d3d9d30138a64f025ce3ec9ad375eeda65bd2029b40ada5ea9e3947479ab996fd004672bf696c709d913a46f62a79e860c0a7f0ef4d335de7de54739314a558cfab52dc43202e47be598d714bde4107f89f72e90e248e0b296b053253cfce7c330667e606f66b590deecbdd163bca6a7d8fb5e32be996599253167a0dd26ec054c6f6995fea8655992b20db313b53b38b9940ee61ab4e202feb9042a0c3550b4960efcffffffffffffff8fd244686bd9ef2f5392b2a61591126b4929c994528a743820001000000000000000202222c41f0c02090c170c0b0c5becc1643a247921c66c26fe39baa0408efed163d8420fe6b33cd6bea78336bdf2d0bad211812e6c910783ca1d4f3e288df0eb6fc04e8c568105b6c083a3f3a2fbeddc3cb45085e18009e4e0220704acaab0c51d4c9dee3792c8ee748f71095bd8c11c45fe7c10c9a3ad4550d8a20ec6945157977a3cfc29eda8e2872de86090379feeb52eb7c8f4ecb0c51c4ca3c387f233df8f0feea825c416723027e923e455c89f4c7a8caa7c94c1618b3898d4cb4f8aa4f0252f0c07e36d7ef018699fe42819c0001d3a7c6cf106a3ba57049d3836a74e6e3089a9acff13a73618b4b8084922cef8ca890de66032bb635932f517b406939fbcd98c4b72923b6a3047086f274d64f9c86d1a4c5e72757dbd4727ada2c1a0d69f75ea84c8b9e8198c29c24276fe94ce4b3583d9545f9fd2749f13296530c91519c9e693ad9f4706435262ab4f8e1853790c066f0f992357e6455b6230cce9842bffc26056ed6022bff7e3ab028361ee529affd42b6f7ec1a44aa8fb18ca62e44740b085170cb27b274982124bc2d405d39d4e62f76d417cff5c3079dccfd051f62d182cdaddfce9a4823c212d98b458ca956eb162b959305afcc8a7d4f9f2a45830482d1d8b2d75732a573046b44b0d592167e78e150c3f5f61173fc41bbf0aa6ec174c352f8cce592a98ec43f8766d9d54750aa68c8f93bd74be2aafa5601e9d2cc42fcea99da2601a4b193b4925fdf6612818f44ecfe811a523c7fa04c366ce7f89c41e9d2f4e30a5f7795ed3fd4967130ca77c26e999f48a21134cd52ade79bcebae5b82b16fff848a97afd74a2598931c555a240879f161120c3ac1c37eb44a4ce59060ee8fe5e1737f2cad1fc1fcf12323b26d4630859df095345611ccf2f7b91ee5228241ce442a91629cd0f12198226c5ad07fe679ae104c95f54c07d9c92358648b2018ad557362f9bef53f50bbe06f0b2098b2cbac499cf907062176467ddcff4f9dfa1f5d0fd8c2075aa6cac60493ec25615b7b235bf4c014d1b4bbf8967a522169d88207c64bbafb84503276cddf80077a5c40033a708b1d18b584fcee68a6683f3918efc37274f1001d6334043c1046173a749cc08b044618a8942d74609e1d61a7ad7492a8a61c98a3790ede262388f0c1c00b1fdf630716186044c02ab0050ecca73dc48c08b57949f43d90025bdcc05c2905bb53297ce5fee2eb74172d680d94b5a07b1c5b20043b26b0850d4a2d61b19273747e98a38b07e4f0a24717950419b53069be29ed901523da4e0b73e75c91be7448b1f0ccc29cbae5d963254b77280bc39b1a9daaff218eae7868f90ef6818c58987330dd7bae5fb2ed630e64c0c27cff932cdfc2f456765e610e11a3e342f6ae3058eddd8909b9897e91d10a930afa63679f9583387968a5e0dfc70e309ec78f1d160219ac30859988b4bc5b0b1e0cab62ab307b9aaac975478f3076b4a07ba8c294266be50fe1fb61d74f5559a5013252619e207e62c8656c299df7a24717580019a8300425825bd6085fe15d9e818c5318438654f5eed71041640ae38c58c926a4b5677f61fcd8510a938ea4cbd7e3c5e90b18450ac3950c13dd4b93729830172940fd63033d1a5046610a425ba8505de915c51d68a454148614654384f959ec80d15f885195a38b07bc8761011d32426190617a3fc4962de98e307e1806acae24200314e6cee946f9470e717579686d8e2e1ef05ef4e8422d10821d2a90f10983a98c7c590c997561199e30e9a9d4baedb9d89d4e984ee81cf15349f0893127cc1e5288ae3a69e949f681dc8439d6ca3b2975f71e154d98d39d70b32b55b284ac8bf3808c4c98e7c6534a389f15a5420cc840960eaaa23b549bfe12e8021996e0e4e536dd735b39ce436b8c82289051094ee54fc152a88788d80f1f391ca0811c6b1f904189a2e9e753b773c9a72a750619933056fe9a7c3aad5ebc5e126689ee153d89cce89423612e61bda3f387f7ad17122699a9264b4d93f108c367899267f1ad217747184fadfbb9bbd5a7da5246230c263e64dbc6d404198c30858e9e2348ca49e79c8b30292529c7a57f8a30fde8e01d614f2da85322cc363aa493747f7a4a2c031126b12a351d26238730ea594a3db2645dd25f1c6418c29c32747a0b7f0939c70a196414c238a223899276d967db4208b3c58b8ea273490fe19641c81004b636f1476b1e5a2de81eff630c31541006ca2dc80884c9c4e6cdc44a223c90010853cea94787ad10e2fdfc83417b749892b9b6162e6c90e10783960769eaa3ed3a731f4c4aadc95342ef259955a541061f0caaf5463e598ab463d983215df987eca972d6577a30ac964cbe8f97112a98077387dcd7fe99f8f8919664e0c130f641896897be834146465facdfaaa4199340861dccff412d6dd6aedcf475307be82c4aa9ca39f92930c8a083d1737bc8cd074f72467330a88e7ad63f23b276922107f35e884e592f280ec65b137baf24f408b9dac1c1fca7da63e992fb89d21b8c9e3c68f7ce311e44fe61e0850f93e106435ef95037e2c243ab0b0ae4e0c2cc64b4c1a0477a3ef59f6383e1cc247f7213eba2a20c780758ed283ec85883d994c9ff6ea848dfabc1944c049d2dba9d46c564a4c11425e5522288cf1a55cb4083e9ce3d45fc988d561315649cc120e48775ca3e9e935da220c30c8668b9e37e9809292459190ce6397dc6e54206b3c7307d9f5354f590c33b051963306955aaecb19ae35b8bc1a4f32b5d9d8e7c275d45c80883c944cc43c9133d9d476030c5f794204cff05930a7bcd13394a38e1f182296fcc688b746b9f2e18462d5cbea7f7e439174c7ad4c5ddea6c0b26a1ae2b37cb3fc84d1a21430ba6dc5f4224e50a1ed4aa2508195930c976b0962c21a7bb601732b0603c4bf791d7cc52c298011957305c5e24f54f63f254ce18492920c30a86f49f391aaa5288e92932aa60ce0a72ec83fcfc924c55195430fa276dfb930b9ba1a71d0e46ef3803e3021cb8400e2e722c800b4b195330e7aff07229c8b7a519cb18a98231c0b81f2a4832a4609eb82563469d0e72291e5a581bd0a1e3bf18230c1e3e4a46148c22aa948ebc5ca253100fad2ffaea07188f7a3c069454046440c16c35e66b1d6f2ea4d2130c2e974e6ac8fea03ae40483fa129654a99b60501ff25509152c4ccc4ca8ae547abf1751ba0a838c25987765bb834a752b9f0c2598642f7704a9ff016424c1d47775e91dde420e1b09e608218af2cf1d65613a82aa1f4bc45a66873820c308e6ac60a5528ba93eb38b60904fcbcdd311a16c2582d9aaa2882482aaed55866010d253f420528460b6f41062e95c42fc9a413057901f7dbce7fc43060453f2349fdcf574e7ab1f18aeece3a4c976a32d3e309db20a69b154357444460f4c95425d479a24db4d3b7efc09b01e208307c64e79547ed83ae51db40383af2757b1f8b468b30e0c1224b8a80bca64f3cd81f952bf62a987ab4999063270609c1417bc7dc526dde906c6fe136b79ab61417c193630e56d4eb2f83f51d76b6150a72b5f6fd2c27c1d45ed47521647df5998fd36547bb794cc8564618e7f22273d6a7eed736261ecb6ce312d419cb40e2ccc75bf9eb5cfc944f015e632151ea9c7930a49ec0af3842442389d52d80f6d2b1c934f9fd4575cad9215e68c34723ce54a3a865661f2ac1a953f4aca3b125518b75754bddcaa481aa5a274100015069d2bf97b9e3193f9398529b7e4c85fedfee1318f1810c014c64f7ee13572ea9c4a5e0aa457d049b7e7fc713b29cc973c9bbfc6a57eedef6314e6a8efdfa2c5aefb1485f973bef1a4d4edc8974261d2493e88c9e5e4f97f5018fff4ea88542ea7843e61bccb6f59f96641c9c713c68b783aaf2b27136d3b6152b9634e54e4701da29c302813b35f56694caeb9098367d56c7ca74779356136e121cffb526cb364c2a4a183049d4ac44b121b430c4c387ea7e2fb7e09e345089b273c5e626e09739d8a31e955af84c133e227b71c4409e36ebec4512158d88a266138b97212f383a6762c097386bef029f7ec5d682361dec8394d547d8f1f5b4898726f47cb50217dbaf411c6f99422c7a9926b5f728449a55f9d2d936b32d1469863559820bc7ad75f46183f26f78bf96f8bb42cc260dea696ce53184b4a453c22bfc42a7122d07e233a840e1b2622ccd9c4248beaac58d23f847dc1a298e5a5d60dd1ac7eecb1be1004af969093162546680961d6339542458aa79db2419833b5624cd7273fcf04618cf8c12f7ad2ee1d2b10cebd7aaa0bb59f0b200c29e699befd3197b880007f209c72895939f5a6290c04f083692f9d105912d4a71cf6a1eedd915ad5f3d00ae7fb94ee1fcf83414727ddab3ba9e55478307dcfaf65adbf305bb983d192dafb77aead17e10e2bd0b083216fae7b1a1547be8666a051077366c8fbd22b67fa4c63a0410793c58f26ab9fb48d4acec178f94125f5fbf1de4459a0210773d2d193645fa42a21e30bd0888339f5c7740fd9534759c51a40030e26d349af7bd63911840e8d0c34de603629e6f55ba64507dfcb0d0675f6e7f3f5222eb13618a47b4774f31bf523d1a1839740830d4611e94423e6285d527c038d3598ccea3ebff64e1ae9abc1a075fe6c24e8ec8db4b181461a0c36334186ee130de61095a56584f4ab129a1c5ce838832988f853928288194ca2436a4921226f86476a4715a55106e3b56675527244830ce61eedfb97e2a564cadf917ca0310683f89bff5127c162e479685989d13d3ca043c7ee8086184c1b629d69aa84cef1941fd00883797d2c7adcd32977950b048106184c6abc76278ed24281c6174c4a3cfa9892f792a1f28221fce86cdee7b4ab9c2e940e24d0e042e948018d2d18f269778972910934b4609668a92b6ab759305e585491b5e6a9fb724fa08105b36fc44a5b1ff28bfa2de0051a57308748b1b81c618296489221d0b08279e2e5096d42984a9b106854c1fc793e63d4e477bd8d0615cc5a91429e143f29ed09a2310573db7bf67435e1fbe2625230b99e4c492bc931f0078d289854a5f0b127c46728090f2db31e34a0602a11969eca5efd12866f8241e309c68cb979b724eba28d5ca08386134c27e2f4464499a4e5eb1f3e920b349a603635fdd0d2aa94c4cb434b8c307ef8c01eb6051a4c30d59bfa16911e2ba8022ffa0b64a6051a4b30e9fd206ded92107a9ec30ad05082390451919024bb88706240035ce4c0c2458e1d2307062890c38a0968248106128c138258380d1d635455681c818611b408067b1b4d1799a03ea778685d40870e30c2200279db5464eac3c78ff7e1a3abb0406308468d5cfa3dc9503a4751173484608895fe6df3771dcf2e3b018d20143d724a96686152a4981c0e6800c1fc225e6f26ee851c45a4d64640e307c66a0b16497e3ba4c555a0e103b3bf675f2eed78feff08038ce2a20b0a1481460fccc1e3db6d97ed9a52a2c103a307115424ef1153a61268ecc02474105a27f9f98a2d78308e1c5b20043b0c0d1d9883299dd9a9f47869e5726034697593ceb332a08103b3e8c82167b4898d0f8d1b188436a5e742083222a86240c306a624e6b293f2ab8a6cb760462d0c3aa6df6fd797b7a96861f0cead6d1621b3307916895bc28434b9932ccc695b945aa9a9cfdf53e0bde8d1c58f19b130dfd8d97d52cadac73166c0c2a442f81c32f711fffb579864ef5dbdb8573221628110ec0063862bcc27cbd6c37d8e3265f24893c08c5698c7839948f62356982ce229190f397fca41ab309fae5afb1a4b156651513752448dc89c53617ae8c8395d825061ee0839e8c8c9729b883cb45e10468f1f3ede9502760a43b2b822b4bd4c8a1e738117894d61d27e2a16ee156f455f8a8256f36f719314e6586f9dae735bf58236c0c3474300edc7fb188591adcf724893ec3d4414067d51df57f663bbf7a130bba54ffa2397f604ed1761ec500ccc0085552ba3b6ce3de9cd9f30e8d415319268452d390fad1e6180e1c5056678e288bd9b9743524b4add892e881f4969b42d3f831306716a6172def85988f098b189f4551023a2dcea46af89f674c8ed91b5d2bd3261f0f2dbea0ec145b28b896b62cbe5fb582f61fc206f6a415a4a114e96305aa8dc31f7c278520b0fad84c172a7f7f653f75333254c27679d54864a934fc27059d9b5fb926b972909a3e7ac96f3cc29494ab3c248983ce89549a99d839b1812e68e574a4848595e4f7f844188b4a5befcf7cc5288596086230c162a05b9b9a712ede4a1958d309b0eb9b27c4c903f59469893564818613d42646711a6760bf2b47f99297915617cb7ece53a39276d61224cf27a743c214c4418f746c74fa974f2adcb671cc210fb92fe1a8d1375bb47183b1e0c2fbe00c30b84c00c4318e4edbb87e4bad5396046218c9e2ec7c90b12b7e56206210c2fe1fc6737f27778076138657943b28bebc4490a660802d57fe766999577185f94198130c8c58ff9091f2fe469158119803075a568a1e3681f25fe3f9877c4ab625c2cdf8ab2482d60861f4ce9fbe7fa374a379215c8c1458e2e6030a30fe6efb8ca081e29cbad1000c50c3e987445bcdfdaa5bc153ac18c3d18c5940ae55d421e5a5f7cd1cae38718ef7a305c888fbc48931979309aa90ff9435ed05f8cc1750230bc48011b60061e4c2a2307f57b97f52346abe0b2ca1d4cfa2b7d9712d926b3d9c114ac735410fbd3495533ea60ea7f4b5751e7629bc6436b7bfc0f2f5067d02167cc61861ccc5a396b8997944672639811076377d0cb155256795167c0c1ec92f38752ca6f25a56e0b33de60fcd71b51325d726c871c61861b8ced975208422e7495dec3b0c08c3698554689b8a69692aa6583d143a5ce77b9b5c32a6b306aea08ffdb486663a9c134124345cfef21240fd3609226bdfe6e25968aea0e31c6d8918230c2f8422d0339b8e0c2821968304baa7dedd2f39cdb9dc1204fc7529683853495c4436b86198ce1c1a25b4bea524ac943df8b1e3f4a1a04700d33ca60502e622968e54942725a10c68e307e5cbd8761017c0f030cdc1964305dd5d57f05bbf41909c18c313c9773c510ebbd62a118103977234208dfdabf0c6684218f936c5e2154a947c180bc2c324fa8b1f81e643998f185d37cdaabd4d11e39c5c73e0fd488d4d68f3154c033bc60942d934942757e112a35a30b66ff90ef2a82cb05c3683b3d4f49a58821ced882e1ecd63cec5f08c9453b5c8bcd0c2d18d343b25ec9bfda129330230b86116d975f647cd384b06088974b37e2e5b4a0b43e7cf01961c615cc292b2fa9d74fbf6d6240a9da516733ac602c79212fda45b7b95530fc8539935dfaf99ecfa082514db2e412c2623d4c664cc1942d64cb5e6af647da3cb428c087195230f7e4784a29f9f2d0225681195130c86abb30115bc3f4050ac63319212dc79f139223b787194f3048aab3902bf68356cbfb77d4cd70827172a4d42251d4ac844d305af6ae27ed9644268909e62b5f8dd75695f87dce58c2936cde2ff22535f3f0d11058eb194a30e648ca4155ccd57d20c04930e9882d774f194ad96501370309866439e7e09d9d83f4a42398edd22cc9c75fad3b19c1f0be9ea6efa7e39fa908a66c89a7ba5ad192e88960fe0ff1c2c4c5d0b1fb2198f65ffc2f485e0826b1b35f7b661ed22908060f739f74ee87650f0473c82d7651ff4377e8072639213f7d5a1493a90f0c923ea759e4f2adb007868fe149c64ede08f1c01c9e7368115e6196f31d982adf5e9b3cb5934f3a3047d07341acfff3b51c1844efabbf4ac8f3e2c0ac6e71cf2c04cdb881f184a4b90a6ded16cfb08179d443103a478514dd530bf35b4e6a42829f577968618a71ba15cbc74d8a6716c689dd72e9e15c5c3bb23089603e4a9dd0896f762ccc25b224b5f3d3f21d16a6ca9d64e991941fe4af30f78afe882234cf3cae30486a17253f4d7908732b0c566917fe4a2d3dcbac30e7fc6d1131cbb398bc0a738fd23631f4b643c2aa30c75516a13454bce5371526931472a689cffadea2c21823a382b29238c9db5318ad3a462a13f9d34ea630e9a06d94865b0a5345acf83029e49e28294cc2af634bc6e910c15118b2670d993f15563c1585a94549ac4f217e7969284c3df9949a0b6a494da030643d0f2a8e48aba5435ed03d7a74aa608b4f186342cc9724d573fac513464b2de6b9d5b4b22f9d30e9787dd6a75b4ae40b27cca3da72c871f73dd86513a60bb1f5a62dae989e9a3079ef5e76d0127cb49909537acb73212795d4041313e65035fa921ad1f9585ec22043435fcaa152ef474b988212a3c3695de97fb112268bd19d827213d94e4709732e91954724ad68f74dc27442a86a8705a1937c9230a79b4ef210dd9fe38b84f1d2847ac92374763d48982babbf87ee24fbeb1eb18523cc964ec77d92f47256234ca795f95d935b2fe41861485aa9ace65d7bd54598a4e99db419426a8798228c621756a7c487514f220c5924fb44ef9cd3418439a71cb592b4ea10a6b83db6fdbf2130b768d1cab4652ead4dfc628b4298c462686df7e4217f4298b2f36ba6a7ec41e88330d9554ace88be118404610c11eb1eefa9f306c260ed9f5288cb90e30184e1c64daa8f4af1a0fe832929b77822abe513d90f86393b216ce343f0601f4c25d977d24e080fadad2ffa2a035bf0c19cd7626fc9c512b73a021b10630cff06f88b3186bf7b21c96e11aabeea409892a4cf95c27d99970c08a387fdfacfa9ec808d3f18e7e3db999e117152d80fc6512b41d59fd28e90b5d1075398de53e236964a5e1b7c30885cf75c2a555ea98f8d3da80d3d707da2e9357b5b29f721860fcc43edb08107a39c8af569215a529f7407f36b956c086d32b2e67630dbe7957cb724d359540793ae11a363a6c7310bd1c170d967d474ce44987a0ec61017d6f4cfe4dc2339985c453da6a9e4af4fc6c12cda3b3fd22d870a271c4c6ea2d3be43aa4f267c83d1724b529c921b8c274cfd2aa90efae2d706b3be658a8696ef7431361844947a902a59e6ada4031b6b30a74bd515b265ddb4bc810d3598478d7a88182e3968cf38b09106f3564bca3fd34b7a2a34983de49b901e623b8c08d7c0c619ccbfb9f771eece54fccd600ad94dbb29191dd6eadac04619cc95fa5d5216b38e9892c118a632b2bb9ece578c0836c6600ecb96a6c23d6c5b2e068375ce4f579ff27ff684c16c27534de4b7486c0b180c29d94ad00a53fb4bd9f88269440a4a9bae3c29d2c80b0693d9cb49cf249124dbe88221e8d3b92a42481b03c0680ae05920043b04c0031b5c30965f690d35ef0b36b660b6f84bd331a284d88ebb2ed8d08239a88e3bf92b5c5229f3d0ba828d2c184bcb46dcc7a460030b86b73d1521238e7e4f47c1c6158c35ff93ecb5c27bb06105c35b5aadf5effa3979158c112e5f571cd111ff52c1746194704bb2d61d6c4cc154ef9244a52c6a44dca460ca9d63c288643a5de48e8d2898927da55f4890cbbe8b1b6c40c16ca962a9758ffb2109b5c1c613cca2a39998e71017d725c286130cafa124774932f1b77274f1801a848d2618f47a7256e4b4f37c79c106130c2aebf396241f021b4b3067b5701be25ffa4d65430926ab2fb125f2f9ec5406071b4930874bb4f291905227892a6c20c16cc983becaa72adcb54730ca0819da1f4f6eb6564e61c30866cd097a2c28d3e16ec74ed82882e932237da64f4eca430483d0718b223957c94a1a82314fc623850be2eb7e21187d7de4e71fa525ea41308fe7ff5c8b1772e10682f1f497f7f787e07dffc0944e9947b20c6556a90f0cf7ffa5f4b989aad90393940ffb51279ef55578600e3ae8abc85de7ced60e4c6a29b21ba29eb6441260430786fc25324d2d89f853ca812189c5f270e791431c074613263c999459b7cf0dcc95533f48089e8288bd0d1b989388e9d74125131ded5a98821c1711b2292dcc173e3e632605152a9d85b9d3e64908cafc52d80e0d356461cac92d59529d42895cc6c238f23f4b4c5de888f70c356061128daff18c0d91ecbdc2747f21f8e5b8bb5d21355c617ebf14b176737bd96e8539da5c9c52e22ee5cbd56005aec22025fd8e92da6fad630d5518fd629e50322b5ce42017c8c1450e62811c5ce42015c8c1450e42811c5ce420355261ec94e63ea79c15cc54cc891aa8309dc4cea7972fcd5d763151e314862d5117d47a3e1d3f4a440d53940e52a31446519e8485cb5022b2355d440d52983e94480c4b4945cee5086a8cc220ff743edd51ac4c0737504314060f2af9fc64a51437b3136a84c2d8ad233c9a8e6fb7c80f35406152a94285e8f727cc3d238450db1242f6747ac2202905c95e4955feba1306533febfad71c696e066a70c21427c95219999750631326375b5f0f8f1644eea0260c417cb0f3a81afa3acd436b47187e2ba89109a307f1a02fa50e8dab7968ed08c3338c1a983076e970952d992e97a44b98822993913d755dcc6f0983851a2f8dd851d4d74a98e3252d1d77534d878d12a69d302a6dc4348dbc9d1a6a4cc238e9e255565216c77c2cd4908429779afc9744867512f9682fbe58c00ef6448d489827e424928ddfa42c491e5ae97becf8d1e359b09030799824ea4da4ec11e6c83dee2647bda5be3bb40b351c61d0ca15614689daf945cb0a351a71253f4f0b2a5c8f8c38c40b35f1c36a267a8be8dd57d5b47fce3f114594725415bb2f11a990aa4a7b88502cd353d8ff1085899ff99fc2a8f01f43e47d25b372514d5d0874c364f6bba82c5912c20fbbbb11e635dc710230bc7881935a409a8f1a83308857909c277a9fe993200c9f71a376b6235523100659b14d29e521b4e41220cc2329d9087d3b0fadabf2c3c79fc00b87408d3f183dc9e7acd7c9a427bf861f0cf2438e5fbe776e8a3c748c1d7f35fa606a893f496da808419438f0450235f8604e7d2912846759630f268db8a5a4a907d3bd5dea1c467f7b97f2605041c542a98e24d9e478307d0e4aa98f91d3bba23b186c6459b724353a2b6c07936d6c7dc841ef8509a983c1d25fba588ce5ad4f07738585dcf13f6ebdef3918c4645d0b2a6639982ec75badd23befd6d5888329cd27a145298b58a10207539c754991b7fe428d371875b647b4fc93a8bde8d0e1e328a1861b4c6adcf256e6a98a9e1ca3461bcca3848b6aa76442ae285550830d869ca5a56657164d6a54a8b10653ba0dedea295ff6fdd460d02952c652a7a4c1204987cfc983d6aacba141df1271ce822829aa710653fa17dbcee5318371eb23c89972cb60b015d5d1a1cffcfa440653e56c5a3a764ce8f0180c2baaa2f5f54e344737a82106d3a5093a554c8eee12660c5020c78f0e83d9c24248ebbd81c19c845ed39e17e3a179841a5f30e41c63464c701731a04387116a7821e5797499d04a6bc1645564a8d105b56387d2bee173c1102496659bf42476f9168c9e62d9996fe4104cad854376a73bfb4bf9beb42c98d305616274f47fb1140b55e30aa5c30a26d5b1eb7c474948f252053e5356b256cacb7c4549b2278960badc22d4a082d92bf2fce4b97851b329983fa5f797381a5f9efa1380d11a10420d29983abaffd789b41e4e1205539c9febbf514a95447dbce027b041a80105e347f30f2afc4fdacd0ed0a1438c56810e1d359e900214c617e7460d2718429edcfaa726c9a90c6b34c1543a4e99fd67cb113213cc299cfe976012215a5ff658564309e648e24ee229ab245efe512309a6dd52254109a1a3e85e3590604e3f9652c3741aeba41a47308cf0fce822549660790d2398c3943cbd78b18b2554a308261549a9ce69259e85d42082c9c5c35625e9fd4ec21a4330a7fa5fb7e8f1bed52404c3c66a4c90e272322c542308a5e3d40082d1ce7b4cc5532a7f8a357e60aac959412ca74f9e92357c70ecee94535918199f7bfc10430a357a605017df279f9ef9d4411e6a8a821a3cb843e57c715311cbdbc13bd6313ba88935511ad4d04171418d1c88510307a66c8f1c793fb40bf8418d1b18f4798610f149c408196bd8c032959044899f6a61526d219cd887f34e39b4307d8b94749f2f7928ed2ccc5f29a9fb791031f2938539477db43e6eac592a16e693eb109f4c0e0ba397c66caca577af30dd785df0d3ce0fba55dd4580862b921eccf572fe051aad3056b2ccbdf83b2b0c7f15aa553b82aae8e1a145631566bff0b7e6f91e3e3f63c1aac298a1efd2451116fd3ea9307bd5e9ba1211a97562870a9375a8a99e9eec5fb1198d5318eb924ec943b6b7a417331aa630871a954f6eecc24a4a611ecb6184ec6adddae4a4408314e630757fc93d66466314e68ed9d117f7840add9ad1108529e51443e8493e312fc78c46284c99dbe152bc6edbf3663440610e796742dfaad2e5cc687cc2a41dcb72ca17b2165c331a9e309eb7c7f95f4ea576e7a1e56596011a9d20a94a965482a809343861b8966d5b99d196ed4d98fd45ab4f142d9684ac09f36d89139f92b6952866c2f02974592abd38359f0e1d582a402ec0020d4c98e4cb78773e8d147fbf84d1840e8993c2a3e87747f9d0b38461de45e6d4e95c258c992a736b55126f4b37d0a0443257497b27cf6ba0310983eeb4086bb92a95bc2561d0b1f3ed2676eb7838122649eae2fa76c8e1d4dec08e2a489824dabe48fbd3262ff608b3e7e748c8a5bc52cec411a6cf351f7354bc202906038d46988457b23c22e5f8acce0853dab6dc8e307eec782d15305a80c622cc239e72f1d1445ed02ac2f46a3997fc9c589c9817341261bafad04988b06c723444182e49af546d9e7f6ff1d0caea8202398859398d4318d645296dfb383be91bc23c9e6657475dcc948846218ca7e38d105751b4854d8310860b57415b9d059b5cd31884b183c91e51713ae48a82307f325713f39a8796d1088469b44b082b4ac7497e03c29423929022973a4eb834fe404a26c3744e896dfdf811060b780234fc600e793de269554c9b8f1d8d3e18b74e88d46a1f7fdfe5a1d58207a30a8c30bcf0e1e30d41830f9ddf965c0e41630fc64a9782cabda4603aab071a7a309dddce019bc011086375be09c2e2e5f4541c8030a8a94f1ad9911582b0e0f8030e3f18b4e55c7d129f2462185e10cb3e98736c52b2244c9f0e3e0f2d3e1894f47ccff9606501c71e4c4125996bf9afb7a8911760b4189738f460ca214b563b21c3d7f338f2f0fa876fd3bb923bc2432b056184c163c77fe15e98e901071e8cfb5a5ae5fd29089df2d04a1c773004131fcff9f6a2ec45d9020e3b18d7945e7b0af2e27b9c0b1e3fbcf0808f2fbe58400e2e727420071739b8c881a4120b38ea608a1d3b9f78132a8fd938e860ee94d7741c952dd5e870ccc19ce358debc32eb969d87d68502871c0c23cfe47dd0b4d57d75e8f0cfc1450e1ee847e188836962a54913bf4211e080834159c95b093e417b2adf609ec915ab457b4605cf0d06194ad693de65eaa8b80d06d36954591cd3fa79ac020e3698f5ee5324693bd1641fc0b106c37d2eb7eff7c997fa0570a8c1b8ee6f1d3dc56930c44f7fdd71394ea8af1801071aee0cacba8c59f96b031c6630f676a54e2eb2e33dc943abf4f821068e3298e33f47672df19083c943cb8a0ce6f289ee92f2eaeee9c760baec6841f69e5998470c260f9f45857db174931406f3ed78fbc689892c81c17479b9c3f75daea4e62f983bf642afb576b78d5e308c8e5e9eec635de04526679aa8b985e0f23d29f7eebd09511318cf824f22e0e08231e5b774db27b568150f2d1f5a3b1c2d0066c0b10543dcb0ff8d943c3f88f5f0f1c38b2fe0d082d97f634e46ee20546a5930eea458d9977416cbd233e0c0824168a410af48974cda573004892d419f4d2e11210e2b986452874a37429b028e2a182eeed4f87cf01cdc5275051c5430bcc90b1df9c29d88f0053fbcc0038e2998420aa3bd7b443a79f30e6270c0210573b797b650ea1d4c7ba2606cd912dbf6fafa161d01071412c96582889254c602f3c1f504d3bf5e9e7e13fa20030e2798cfcb249bf768fb7013cc6dc244b057bd70cb61825975e24dcc30fb9415c7128c6db2344ee71a49a2027028c1acaa9fa14b9cb0a0454930bc6aa8acb997bc9308120c49e9b14b713f8271c4e81479e2295cba4630cb9792f536d1502a5804a378d4906e7af31b311c4430afc52a4b5bf3ecb09c00c7104cee979428bda767f4a1031c42307da914fa93427648bebac0e8d001801de0088279532d8a8b100f7000c154fe963db4ee9e109f17e0f881e972ee0b69ebf2b1190e1f18278ea8c41c3da1e41c5d50e0878f3030c0e387171ec0d103538d4afa3016ac1ae0e00141b887705d591203c70ecc7f21e9ec974efae752a1000e1d18dcfd3474597ea7c8171c39e0628498267227f49c827f1f555fe0c0816926b589ad6f15bb51318e1b1827c8d5a95a87ac52e1a15506c06103e38fde7aaff4ff29be3cb4c6b8510ba3a8a9f825935289d87868ed00c38b13fc51417f8f1f1b58c10d5a98b4bba588e59cd5646916e6903fddbe62fa4f88b230ef68675519c98d58982e46a77c57e19d5f040be3c958efa09a57223daf30c7fb1ecf904917ae30ff5a5fb0bb54bb176a40870ed4e3462b4c3a459193aad4b845f0062b0cfa2ce877de5925f1f801c621e0c62accfd27c2786c0bb2df21b50eb8a18af77cdcd253773752b1375071e314374c81be197dd97451252e32cf0a374a611e11bf20ba43a43098cc52ea82a6a4d1d95198d383daf7cbe58628ac043742613825a9c4a2f7e7704982c2a0ce4479c8122e2995a9007d80dc27c80d4f984c6427513d4f3137e4a1652cb00adce88421cdbe28f9d7f710373861d4dcaa34b9384b92db8471e77264a96fd3679b268ca3d5745bab4a9f4a4c0e3732613a1129287f7933a14a4c9837d46289ec2de3a69df5e1c625cc5521858ef99de52b5c9630e68e7a8f5479c4ea540953c9b7dbfb5c5a41d3cbc30d4a18e762b5c40791f393d024cc7d997ad2f38787960a7a9413dc9084313c848e5c2657940445c220728cbf5c32ebb02a0f2d30c6e8210642c29cf2e5cc8a1c7c84b163ef5ac4d80aa9adb207a3bf3874c311e6bcd43941eefc241d6a8459b4edeacab47fcce70e371861083ae4ef590b51bd2a371661d2a1bf1ee5fdc24f754311063b9ba0e9e32a62d1449874e74e9f438520ea53fde206228c225b9f63554d7ecfaaed8d4394d2c68e9df9824fc18e33dc308469bca4694fd2f4c23b7cbce053b0238c1f3bf805370a61aa105dbdd408c9a2478430eea7393913c7362c83307eb8b11326e5c2adb225083b85651b6d3a57e97718146e04c2bca2729e902bfd95e7e306200c93c4a4d17ad192befcc1b093b446bc89a62ecf3d6ef8210737fad0c849c94f6afe85173c10a93c62850fa6d8e9bddd395cd27979282afb1b7b30ffc4ce4f4179486bb78f5223b8a107538ced7753177256a5f3603869123ce8cfa36adec30d3c98f2a5a82c3eb31224ae37ee60b438bd3fc9c24292af1d0c7abb15f4e55cb64e7530c9c4d8f2cff9e154420793e7abba9823962f7d73307b788b3fe24675e30edc9083d9bba429a5c765a4e8821b71308652b1ed52ab3cb48270030e867dd36e413b84879606da7e70e30d66d7731777316bcd0d26715742769df2d1561537da609cbfef77cfcb7f9905000737d8604c59cbd31e4c4810b3d81acc579644540b22e7932d0036b8a10653d851f93de64e32578ba5c194da479965734fde17c70b34867f0fad2ebe385e9c008c31920e1d358b1b6830fbe8d8eb9dac5e46050e37ce60c8a5239ea7860a752f1766308f38e9ed1523bfbe2e8369c6ee4d8f4f0653a820da4f88aca4463e06b324cbed693fe6e56a31984f54323d3971295f895a7c613007efd87e4a7a300d37c060aabfcd76d3cf7dc1e839beef4c8a1fd64230dcf082d19384bc2a32d205839eb0e517be6b74ccb860aade4e4975fecefab50563687a78c96551826df26e68c16e64c1d815d664ef3b744be80616cac78d2b9815ec46150c228b5cd21da2a794743cb448f9e006158cf3d5b3b2150fad2a37a6600cf5a3e48ea74e88190f2d07e37da0140cdeb5aa113ca98e75230c5020c70e1f5c704172004fb81105e3aae7453df370490f85c00d281852aaed98321397d3e3a1c51cb8f10483eca518da1d5fdfdf33860f2718d4e80b3adf4216251f637c21468f317c20066e34c134e2a183a9982d413b5ed0e38731c1f469e184e7f2d991a0173d7e8c15ec08e3c7120c492cb36394cd432bed86120c5fdd6982e90d3ba51e430c2666379260323dc923d77a07ed96c3700309e65a13526cc27878b8be70e308c68e9ddda35a2f5392cc831b4630efaf6fccbbfa995cbbc7186d811b45308ffc9490ddad93badfc1f02255750f30bc70800e1ddd638c2682e9eff358be7ae43cb6176e0cc1a09282d9ee86321381e1058f1d0f032f7c70136e08c114247e07f5c9a3e4f575e840c28d2020227d10c93b8909714725226e00c19c4f5c072b1dc45b528270e307e64e963ec792c70701c20d1f709d346488cd7c490f1695744ae282bef5899c1a6ef0400bf974678b33cd93d7706307a70ae592522e8d5a07565232f2eb599b974a0ebe3c72f1a24725a5180e0829a74a172265b871033cb5522ad78895e55d417dca5b6e687ab8610373a4583b2ea9e47afc550b731ec9c9a398704d1be5e02202b4281db330e8cd7ff4b17c604316a6ce12f9f631e3b3cc21d888854124f1756d6d9e4c070b634c981341a508512222041baf305e945339f121c9cb88d870854185bc973284522b8cf676b9e73de928e6af95f5c0062b4cf127f5fb4af4e52aadc224362de24d50a6ed3e5518f743fced47482a95a7c2906eb46a2bc4ed4841a8308df0604a4ddb4e544a878e1fa8c550010f6c9cc29cf19e233c8e1ad52553986eb55228d3a14bdd5f0ae3e5b22dd3b1233d7d4861d0ee921627a79476e9284c71ede53da8246ae41485496ffefd778d7b743114a6bc91f1b95c038579e62d7b50af1b11ff274c6b61912b76ef0953ca9552af9f8ace8877c2f4134b858b1693556c4e18dde267dda7f0a5abdd8451e2297d2a5a134e4f4d98726765d5259689ed2bbc9710db0eab63e213797625749ecff91dc7362e61d2eebc9ec4c52d61c85d722768f70f298575e898818d4a182de4ec5a22ff54f6a7842966f6f9aec8995e7e12a6a4245c6775bee62f09f3e724928a3f972174381286142b3bc456b37e0943c2103d565ece9c6727f711e64f89591e62e37bb28e30fde6d66f87ca766336c21463dd744af91861f42b19a62cc4fb092dc2203e2bc644cdb128170b6c28c29c53decd5f8aa5bce38930643353f1aa15c29b106150e9fd73def574933d8730dc8a4a5a627886786c0873685fe859901f9ec4b3510863e609d5c86b9f62458430f99b49902d6e1a4acd432b8c1f604420d9188439966a9e9cfbe42f7a4198637e1e8f53a8147126d348240c850281400c0231403cae00131308001834220cc68201896034941f1480034e3832483e36222820160a8622e138180e05428190200808848161188ea15892079a14f501c6a2f519398c78796186fd2b2c3e7f007a467d0b940f2b021ad7558c038d5427f5243e62f8995900774ee2ca7050d677bf8c9c906668c6a1714616f173a00d2b8f40a95785f23bb8941e696a4aba5558ba746aa1d5a979722babdc14861332299aab9a2f7c494beadba88fedabcefc6d8836338b8a8ac668c92cb21648aba8692ccca993d8961b6c8e911f0179e031b390ae523d2e379e87b6119fbf7d561b01fa10ded6f3feb170ab79afd10d9ef11a6ed8ce89e2574b971712efa61c3ab6cff3c52bafe198e349cc1b8918d5dde356dc023a695ba06ad9c1d811bae004b58b39d41cdd585bc8bd086ea0739340c7bf7c9c4175464534134a00f18756293610741a96f0ecbb93f282e294a0153b854e2cd1aa973b470fcf9533dcc432901be6026a556e5b571817cdee946812a1ffe7b19089523a3af971b8e4e9009f8299f6e8592f2fc841a655b3e1dce6f1f75d6712b1270012639129a85867adb5e7dbda1e800a7f70bea32b2afc82f09de67555a47d6bcb09058a63dd245e63a9c483dde4e2a1e7166d4891d183351c3dc6b62dc07a107e67bbe57099571ea32375d818a93fa065aa52011d07f194e0d827ebc100998a706140bbf03a1ff48a8f7a9d1fef5520f4321fdacbf171934d808ad120e023194d94bebdede1b4bbf31ab898d069fd55ed0c2077b6f9ee35c3b029c9618406bacda6e3c94837af848a3faf6434008aeac9b96799e5997a64aebca3c880cb808f4361854c2e2f8efdc1e0f9b649b6c253fd0dc7a4a4e53724eede8067958c9d3e25227248f2b4c9a8fac49bb6ab103c36778d402a2e08205c1d5413b88fdaa2d28ca74ead38b212be1050db2c7fe15c0b684ae142216a05a1a7ae86e657116abd3b4d283acb782a5f279da9bbbcda85877eb057a772e97ed9510e2fd2b93ab74cf4a26072e355f5851417df145c3c2a21075034b7606f3710da2c22a3636aaf8e35091bde86e4a2b1417d8062f22a0dc13f7bbf0cd20079d7e137348cb74e03d9618cee4bb7b8df0923d36dc415d1889380a59bd3009c17d5001aece633dd64ddcbdbce1aa646305b483d9c0d1b77a835e30aa6cb81e50318b3c4d873d031a690f970232c79530b05ddbd521eca2e83866508f2faface52a927892ed8d8095e4c11c98747203dcb19d122981e404ff967f5ff064bf9611c4811690758e9c65862806612d9208248a61e7f875875b41c26213adf60d26c876f4659b381d209640215890e1b0e4c497606167da13e093233d6a7c082f284ff4dcd8bac671465167c1ed2180d1b4372241ec9ec763a901863cb72c6e3c8c0b1df05b6c968b45e8b1ec64208fe4867e09997377c90cfa248f105537183a71060783e2d165a8f2df0a07627deb687a3f8ad7acc3be1a05346e55e842cd32f04ecfe5836cc26a9ecf10c320f77dd2bedb86e80d50c1d1302934064f219f4d363f94d46911c3bba80199b99322e7846808a599d3a232a0347025e6c5220f0445f45d291c9ffa092049e01bb1d82060eb88ec741a57103388679dfe6ded55ea7fab8fe64d2eed799526153fa7423cbb3360bd853c1132f620ce410e36301685cbc6510a5e744c05a5111c990a68f51f8e1c94db7b54998d9b2c56cbd39e3135e87145e3df3f8d312c1d472c07dad9752b94280a785c80a0799b1f314166f54f760e15dd34f49036a04c2fe1371c52ebb294013aaaa033e69686b9f33927d1c3b2fab922236e055d3fff42eb2aa9531ddd2e4ca8fe0e142397195e977593f154b7050d7e3201087e0e85abd68934267ae0888928a1908c8815caa2d2b97610f900a64e4445ef524306dffb982ed475cc9844c8160660ccf114a179feb8e8e151a506a73b706cf7406a53d8030a3f82b0a49c272885091adb1e9e72b8a9dc964093d105d19077c4d6a033f297954408ddb2981862dc409bb0dc80fadbbaeed1ff563620081abccad6ec715efe4eb1dfb64a23b3667859d0b98f90489e84d769d5395d49bcbe4e2f2bbeb12ead259c6d99c69cd4576614ba4e9bfa40118b20c05ede01996f101d8ef3979de0612368521b4bc5e5654c8afd73dcbc09de96573d6272c85a97ca2b2215a1486693579f7e8d3c1c83be880a4bf7008e0ced6bb4aeec2eb0c16ccc0d2b5633ff2b90ee9c59329fbfd7ffa6f5f8e7f52a86c300782f9d9cdaf96a043ae6101cf5c2a15632c54ae923aeb76552ad4ae9e9ce784a85766a799d8b11b443aada2a1da736a3d1c464157f60ba7c8eab410c190a9db7a8ce92b68808217647b9827dc3d6eba98f472eed73307c7d062f649768fcbdb1e0dce21ee2dfa4d5e2066b67d9a6d0fb64261eaf59298a2079c0152dd0088e766cf807550eb286b53c6282a95ea650ab5477ff809d8cb06bdef8080e0074a3c8441bdf74ce87f482100c8b57fe367ceeae49abc1f55a300f65c189e201f75c5fe642102d46fc83d81a82132c532f1d82d8d33635f944906d1f1947e969ca4c4d3721440ae373617c2750376611c1152699c4042c2f46d641d1985c7088c8c69408299d2d2d8b50c498d3edf31c27b3ee66cebfe4330222d9f9f339f8eb243a98bdfb868cd0525e272cb64efa92e4b565d9471db5523e82e4e144a75ecc7cccd9833ea54172c024437f1177dfb0ac20098c4362283155b7faf23c3b2000e7217b2da8078e5bdf311a160b611b94614d652e62ee0c0ed54c7a7eeed36c1bb95e08a59f2f74c449fb26310e3167fa861ff6a14421f87dd6b59f23955f603c4074a9db9cc07220af0cdb56013be214839105b8314040268a4e00ba412af21b23dc8b9b485688486e6885dff4762bbc6a120c04c1e4d8350be5807b420290eda2bd83d19624091676f758109261684e5bb3e5d0039c4cdb2d3bc074b3604983f9b43b8714ec081a80ea54cd1384010044eaa8a233f344b0700025981705cb7763a5584606e146a2fd01eb9a6d1e5d1dc27a02fbfe02f24208bc72ee84d599008bace6e9aa1b95352def3da04981a77c8956aac9939a78282ab601f4b40a42a7db3183440ffd3703001964a33df5b59ff1df0ea30f1b1f03a590557a4691d067d0c7665bec0895511c5fad4194ad5c594688b05129c6be2d872877ff26b1ebc7be0bcd69c9a06c867b2f63dafddf2d6b911b0d32d2d917551873332493351910839f7bcedeb9f63a41e299de4e275801e1a070a1d3613498e34d72312a3612f77233a4a7fb589a5adaee36fdb7be0b80d17b09fa595d564302518b68c6d62f57e7e318de3d5441d12c5c0ea02eb67b0cd09c2d13fd3b81c1ea41121cea34990b227ca065e88c8e12e9f223eaa731235797cce0a882b563d4bd194cd34dd87b5cb5a50c04ab6ebe381bf116180e505f93e31dbcce7d9eef2a7b9dd8dd0255a29c3ea1cad640d1387b8c63a923b2020744a7d00d21c8b0dcc1a1550328f285f81f976a3a35b479ce37087442f438b760d8d52bfb1ba5df3767b7c367ea07076cc81ed9c0ac3f5c708463733c800929be84f0d4194f9776ec27014a560a6907e79089a2a996a8e005d02b54ad34d87587f9dce654a7e744fd39439d526bcabd19a609bade44262e1ec029b56ec39277882bd714565b1ce843869bbc13c1b9332d7632688a5ee085d0a909d96f306ff9349210fb9aa52fa5d3bc7d21e3da23af29b2c34fdbe3b695cf942b763d49527f576af05d81ea2eaa28ae66937c442c62c83d6f6d0476eccdcec164a25e6ccc31b48e006ef92075615d2e5718cdd3df4244533920e3e2122827cb6098771ed8f8b8c7d51c6ec4766b3a964203ef1cc90f0a8e8a57d68e463990acad455221ac690ee8589403ff2c2153868a178c89439857c19b62cc99091f4b9f766759ca4dd9eacf4466bf22a8e8b4340e7d044d54971d1cb0c1db4e00219e83f50ccb63f1171870bbd694c3ca837a0fcf12dc7139597b0b082f94046ce53fe1b7f82a265fb5a43e91f1aa64f4368a17d27c3be27503bcd5cec03a67991367a3458ffc8f71b13fb5e290d85686c001ca3e0fa56a99217ec00858f0c35703657404400db5f3b5206749d4072394c0b884e32828ddd358272b7ea161eae03af361e2bf786cf4a459888d4af907544e046e3aa973c80d9ca5a434fba5035008c4c958f21c825b68cd057954538ba4d20d67f2c17d9bd7cb9efc8e5793942418e45efd937cc7a556119854dac110e2ddecbf3c3d1201ef5e6c8ba4cbc10730fb3521726ac57018301031d58aa82e648766b4049be4f5bab40868e4199b560ceb3340d5b85037f49e07dc939f320052e6d6cd283d2089b0b3d7d66eebb15e3bd50413f302f45ca704359c02ffc92e6d441404d61656e406dce4e0072be89558d38d4dd9455ee9ab5666fc2971ca9a0ee72905ed607cb81a791c263cd9bfa451958e446a9776aa3e42c1b5f2cb15ab44f26e8688069c860591adb8089b01a831451703f37c311c76357e868f0ef9ccaf236004d3f9c43ab6a07b9895e51b9ec2c7248b85a9cc63a80b189d1f2a3807b350846a85c958764aa67541bf24a7a8069cadaee7e571b292dcc80c7b4ec12276c91ea37a635808325821f04a903f50ea2d33cc868e74a0cabb201f5a16503c86a0039619f105dbe608941ec405fc15345881026ed054040d41a9ac97e6f796c0eb990117bb03326f39c5d6f95f85cbab4471b0dfcdeb5ccf5fb8233e4d71a2413c76fca2694063c9629c149690642416a8432729bd6087527bb2824211e40aa40ba422e11485df6505bebf8c41c149ee91b96c6da85186a256e2e50ae906b0ffa21613952a552e294f1b5f076274485f4772e0ebe5b2ca381c69ccdce54d46829b407ab7d3485ac26617a08ad59a28ec44c27c1f214843434b98338761d2073d2b50cc9a0864b2860f49d56a92f1064f9f3bbdc6fe62a3397172899d10a74c2873cde3f259230d57a4be8cada11e48e8ab66cf5f94fa33409c5fc1f8f6a252d4083d0ff66b1c692e9f794e6a617d316586df3ef6863a7d41aa040407dd8ce20a43287af36cf7625ed400b8d1db14f0e7bda32418aa03c8c6b714cb4c2665ea00d3ee17ad218f5a64fc1aebd835b3944f43294c760ec59a971d6b5e9956269d470d73692b137797401f4eda22552bc11d83f5641a2de431637da6b7a09f83332c2cfd55d4f8748bc39931fc6bb7a40b746605bbe7439c2e82589135d54e4f387e212f39432a856f24ee8881200673e124dccb10eccc28f3622f257cb70eb8d6c28e45c1e4425ab09ae90c7c5bdb6b99d2050a8eb16b72fe096f52ba86019e7c0e041fee1738907c0549dab4e352f598d1f747223e45f0e7b133a0ff8d5c33b946e1c3b503a4401cf3e39defc84c02add5f908698d729d173a98854d630480ef451581907eb5833a549ceaf4ab5f662ce4ff6d581cf3bb200651993af6fc125d44b415e4b159c3c24797a13aa8264aa96e7eea360486a8f904503c2b413aafb5051971ceca39bd6a9dc25f00662e7d39520e12e33e029f2b936fcdeb76e79f211be94076c687ea3dcd4a91790bd556d8159117de70ada5f96f54b4b133fad902aa136a8574584b9d6b62346018d85a460e6823850af809adf4a3aece520612c4cf0bff3666bb92aab50515b74e03ead83ea6e1733e5e51365346ca80295886a75bc921cbc901165a2b0bc8581cc02b1c12503d902a698fc37fe3542c6f5db9b052d79b5baaa9910bd0dd3b93045c0ee6634d041be23a2e4ba5e62aaceec833d3b0399afeda153c888ea2404fa1f9f5a08152c1582386b503d87c57560bc5929a424daefd06d3d51f984b9dbb8a3305ef50a890c582e6a013d91e171cf283f0cb7e3c3e4c95ca688a00ce755cb8e15a39a63f8518df1748cfb58329a74b48a9f813441517cddfdd8586113656c94363ae4474b9b36c5af7b77c00df0e1d9a8940df9aa007fa063af51d68a472afd31d6fb15d574fc675bdf2ad4cb34814bbf36ef99070369a8513a470cf507fa88d85c330740bf2868560439aabc8d8b13a4efcc9fd0e1a85e8a064c961c8cf1f5880c1c65fa581f14191d87dc43af7eaf79f3723e6030e6ac9af9b4be0881592c0692c3cb17cabf0eae3e2ad15bef69688f4c717be1d70602857c1639ed4740ac7cfb0febcf90b7989556e93e1778c82a0f189a92237d7f5bb00d7aa803339424740c619d185ba3d2d6cfe72d3fcdbb2473d3214dfc18a32f6237a6172a2ba329030a93e6338d8bcd949933f1ae8a81f340af9b06d5a193a8abd0e2d42d2fc1e12d39b7d4414aa90b6dc467c02835e0320eef37feb9ae39e53003c08445b2295742c64a924042a1ef1f326628e9bd6150b92e96997bfe356495f9931c72edd79df8abf8eb55e91e22862de1058541936a0ad4c4f3365fdae44a9b59ddd9e467ac0c3293858712fbb58013d129230234e1b226afdc3d176fd56039ec97ebbac14a44fae56c90dad8f93b1fe318c10e23f38c2d3dc2badd5e1d8c5be4ae6c3dbd6c3023c7559e4b61b58ea5241bfc96fd111d6ed237b8b4c82d4d662a25707f9bfa1b6050ada6d4f7de28ec53063c520072fb28615ac1d1abb600724213eb012e2a07805922ba6f49c6216b0d507ac230aeab3eea6fad66885edfc15f4ea4a67edd55d3923fcbbd4cb0ad8a3c661b5909d462edb7c827b3db005347987606f6edf86d1cd6f7a0657846cec2cad9ec923c920596fdacb9973909e75c9554084f1666b48f6c70a115a4d8ccf8b1079d51683c890510c349012f0cd04ef7ef3500987bc5d2ea1c23d7dfe6a7f9db770629550f5fc9089064c52cc72e70bbeeec9cda1428b4d5a7ee5afa2d8a28add8e2552269ddfc634ddb685363aaad163d669d69eb0f71c4861c435849c5c899d840c21e3369fba5dadfaf7688678f6c7145124290f436ec8977049213b5d46c7b7fe9b4de7565600b1ffa452b3c581d3f8965f52b6d7a51b39d30fa089ea8c1f442950cb50ded094d059451e21725d1c7a4bf37e5876360780b475768197f0226066ac608e60da49d3018e190d729b12069001bd5cc21b3780bf481bb6b4ab2dc3d461c996d02c942692d9b6dcc4bf707dc55c7967aee310a4248af4904b3922f9c72d6af2c070f2bbc304b81cea7ce26902905285e6b242b92cdae67b2a7de1e856d40363248abcd83f3401e713717c68a7cc59b1e18b6e4e87971b58096fccb2a0cf3be02225633f353f177e339595ac25913ccb8f4d36b0714ab4379273521d00079cdad895ebbc9028e5a0af09bf1270f0b107dc67033db1f383848679e7f909138bcd068dcca8ff1186939817a556144e85f6611325f17152f13ee1602bd530017523227ff21d8cdc1b22f561d79524b1683de58fe7995641b713369c98826fbcbb5dcf926b0ff514378f5bc910d5fe092c708b85813c5b0b580d7a494ab269f8550ed780fd1ff4e2b40051da6020906b1dca60c49aa6dc00584f7e38f600860856173e1e102f76a9dad8f9204bf318ecc8f73324a61864de13e16e1916c91240632fc941cf721bb06a74450f0399d82f036bd6c17a1b4d5b5551d0a306286ad6d08928b7e04d076ecf82bc946c7e4e68447f6d83380d11b1a70c7036e47992aef952411b9d918c46a8f6ea2baec4a7126ddbaede4daa5512fe28c945ff874f96e419dda5ff8cf9121f64034629012a17377f072bc8e6703b6ee4cf7839d77cff5cc1324ad1d51f907388d409d491c7c790874ece362c909cf5a09eb643b047a459bc523d03752edb2ee8b6afc64698e660d7f95d8b667c9e8e8ec90d456c6641eac26f4957fc6f4d08dd0a9f9dcfa25d205b1b62a308b682cfbbbaadc0616a63b380194db67221ffaf194da3d19094971a7d5f7512dfb99c3c169d728cc073f00a5548070f9607d4194c8e9c1e3faa87b710ca97c62906004e9fcf70b668d311d7076e312c89291e49f54320f5c855d6ff88ae78d3a6c3100031817236c3b8fa20fb96ae91bfaa96488e087bdda62b2cdadd4a805c41e77be0b0d0cf4545d0208ba1979f0e3570ccbd8562dcadebfd7848687115613b553a28652d85f5d58974d0d569bff5d3da4608107e15b344abcacfe9308149833a955f4e691fac9225e06271af96af3d0972514a0dc50b4d6ed3ecaf65e9556399b62ef29a3ec459ee686efc4d4ddf82abf38c481b4f40389206c0be26e56a0fb8e9607fa70c39f468919334c465a40af198d1921aff582c3e9066add5fd57f7966bc0ef934c310334589d5b5c0b6161684a21ed08408e80a363d614f89c3eda2dcb7ad95809ca0f3cb085eded98718da407797b9f8bd530f7d680639e1e7d7c8b20319fea5fba1707e3d9d52bff6795104343aceb442c7a3c449ec20127a8ba4ccc1847d36221683bbc5e3e2a5ba6d87c93b506c4f6bd87d048576ad89b1ea8b241f82387ee7bd612f970acc85a1e9e309288c223580306aaf8a886095cf5b014b4bb833ac896acfb55f5962f378786cd2f878f86a1aa761f4e18dce6d7b08d2436107a6228b2d899156669f8526afbb4424275e33dc0e5ab79945cc1ac63595185e6ce0f213a42877d21e77430cc600b99fef2ae1af29ede59350104ca85049763698f9d2caadc5c2d29bc9b4a60ba7455238c1915c89d99b73a7c5514a3b2401d4aa426b603abfc2003db129fb15a7e422f436d16e3698e8b934ff45cff62b38f8244395765811144b9ee45eb878b1d92fa3a3de4249b022bac18bda8e1beca7a35fff2b8ca18985446b70c72784a822b2a28c4446921f259b4b77286419066c01f3c1fc5a820c059c1911855c5188f8610268b644e0e23c508545ccc3f0ec027221d2d157f21109280ebe52fa04f8fb7bd0515cccb03331cbd530f4fe1ab46d4db8be9bff99959b806841e6cce217d3abc6dc509685a025e6596a89a68e61910609120bbb94401f82223ebf72de42dc8264d09f793e7e4a564ea7da27091a83126811195b7991da117ff524e46abbf33811be055af00cc1cc873df9ba7c57a818304c5d624b67fc15d788f26049de2a010084d62a9b1e45b09bf3468c558c74181a55919139b33c73a26d073ec37be0d7893da7285a174340d5188167d5d3ea02d0f86f19664cf4e9f6fdb9acb79672605e597e8bf485d1b8a4bcb1a4012ace813133a4cb8a79f73055e36e623aee1050638489ae582268bddbdb1d09d692fc03c80ba4ebe1d7bbf43a1645708723f875d236833b2bb0091e9ce19c3f5c1ddc284699937a8fc52246081cd3280271796d7b8131b8f22b45e03cb059b26b65ad861ffd5b0e8dd73429edd04a3d7cf900471e44bafe85752717900e6fb21e2aa409d215d0cb9e601f429480708783d08e682d8d6a4472ec9e22eddc55321845c79e5f85b182ac869905ae3612032485c5207222bc410a937e831b9d139b128020ca00ef10dbfaa188fb9b2ba4ca4d29a344cf7f501b8766e0ffd9ea9608faa2014d50b3f90f2679d322d28e4dae827c9038d593a6fb8fdbdadff89625f9b08e6dd83b77e50619255ca22892ee13b30fa452dc36703c0672c0f03b42554a3a4b24cb693872c2b3a191c64eb802c270f39a24e0cbbb52760c34c5f760a25ada119485d05e0143025dbf6ae72cda802d6586965fa14811b1ff9dfe7aa6099dbed3d52e30b4d0a45f89cc85e37e14b29a3451b0d322a255f3ee42e8ab42ae1f0f7e4c4b75ec38073e7e9f40fb45b100e7ec1344c52f4094fd58b934764e7184fd6454d2cf11d2cb427c3097726a9b8ff1534ca5b864e0f1094b9fe3a5a4d474a197807c828571b7efdb2471351b52464828c81259e6441cfe0081868fbd2be03a5b68ee970e0d04c3c066660997cb3dbc5f4d9df1bf9d8f92267c05fbe77e428cb21fd4a496a16f5db1dfd4419f27b16768c5ace075bb1b1ccd0ef3129def9413308a47bffcb9e803a06095f3ec1e8180f3a2205f70633501295ae5edb84835f637ed5e27fb1a409fae135ecf230855e9ebd44d41b2dd1c7d9dcca4041a8ab1debfa670389a68f12042e7bd24b2c987ee51f6542bdc2503865e7862c48520d8422f24790e57432b27a48e801d41c63769967141a164b0f2e14ba6b185f0584a9e9bc35c289443a0019d4a20e543211699cba0809bb2e121d83efad3c75cdc6466f6d7d7df8b58d0e400fb392712cdff2f2345683ab8a196f6ec3c6268c954767857c30a5a022a4add22a3e86deae3a3334b4cfed0203362c16112f26532e656b64a06a054ab5f66ad95291dd992146d2ad17a4d54bd2e7911de2d9d5872c2e1ce51e2d27bd5efbbda96a1f35a06c98d4572ef7e0ee2148ec5d34e9fd30cecbefd8bae04feb20759e8b371b997184d705d16b021a837fef13f886446a77500f43d30499040271006facf55a69807fbcf42f5db934aa8c5cda5e3d9f54e4ba1934f014fdc7b97639f39e69dbaf5eded8c9707755492dad4c7e4fb093d9276bc60d448ae4b496d5ca1fbaecfd9b34d5487400fb19a943653be394d9863a99bd0624938490331cdeedc69d02422f50b78775b12812cfd1e5b0190ce0b05489aa5ed55a24238d5fc195b8ab69988b7665b0561e9ee1e221a428c13e41ae9bd2a2a816b3c48f92f54bce8a696ef0c614d635720e2b04f6e194dc304587d3924de5257b248b276fdc75c94f65fb6cde572537c4cc6ae22dc0935699981c82c0313c9f9b38f7fa1d06aeaca90a35c16501313940b0ec26b086ae78ceaa622da0bbcf2acd53bc47742eec94c127181f7d7c2525681f6003bd17e3d94282a48b03631784cf5e286b46a04d5ddf98b771a36311a809f8e61c634932f543ba94c13351b4c255e31ded150fec8570c03c387fce3aa88af3c6d1614205babfcb3e202d24e7bab24b1c61c142245bd291b3cb91fb265c8db76b02e72410e9918d9552252ae44c1325cfd75af25516d1451a7979a0107877be6d86a4c0cbb477570b385f26a11ad30c0ec25d593075229f71c01eb6b1fb05a9d9fa95abf55bc201050f21505d3373c092c856182b3b2683859637edc2a37612d6802b1dbdbe954a9867f1f7ca853f224ec5271af32641641804879f12969b47ca5018314bacbe5c7c766012d6b381267f8a99e540e1dfae35859b2f929bb57fae2a0b33c8fe559a801bce717163979e6893e119c595b393d9a7af9912c7344c16578013e4153757cc5bd7961ae97c393ed461b87a8df6529624dfa178424341baad881cf3a538c359e092bc3238cf1c09aa1e6b2618b49fe188e45bccad7904d6ac71fcbedbb7b5e30a2831fffe5486a51b14bf234af6853e6fb7676fe28410308687dfd688567b31e8ebaf058b41eb50bbb41ade014336179446b4a64c825e092be164c64bb83192286a0154d7be8b031a994db818a4a2289930a47fc138e603f5c1c3d6ccbaf45a50c67a8927466e12ac9db5aa9070a87bb64764c5da533d44b0485a14a7fb34ada2929ae8b248ab5ca8b3b5f4eabac061b825506375619965a0c6649e5658cc5194101e65cc73a303919f7dc8952ba717479310c2b0223ef2d1ac5b904d81505a85bc43849b0b2749882cf99f1f35472dec36902ce2720d74b1496907486e85c399908b70a1ee2063eeea2efab3cc25033e3c602104b20905af43321e2ad6e0f3988728d1021cee45985da080daf4685280eb64f01938209ba9b0ce41fedb06cc7c38afc1f678b18ab03b40fb1e3f6a0bcc6e9aec80857b9ccb7a0e44cc2eed5687304c9f6701f17690e6799fd3e24ede9368427b35673a4e4f2af439eba8efb17347c7b8890ba80ac1c1f0e75ee6217565490512ecdb46b495168c06a375f53a1c19c3f06969e20abb1d0dd1cb05b2b8cf582b064c779630e7ce86a761d0bd8c5581dc646b3161f3a67ad22134ed3f28a8352a58c1499d58661ae6e437c1db441ee6f2fb47fd1ceb92294ec198dc9cbf1dc39cf27faca9ff02596b610069dd2548d7b5ea26a49c8f06e161c02100cf9771d24aa5c2b9678ca16d93ae9d4b1991ad3b7e51d47c5a6204f7f4ec0f82d1631d770f1fc8eeae7875ffb725fbac188d2594ab98c2e07830d01131d9c30f64de216507cd1c7e9391a9bf05b059728d181cbc081363a573ae9cc039ec3200cf49f42ea739d4138bcba7359f85f234690e2882addcb5f17f0c4c9af923ee792a3e1a6f8b9d63fdf93304664f8de0a8511264590ebe0d6002f21567f9702190195e0b89e5b305d3493e5197223fc008e2bb7e77f1a012b8250e042ce8d6bc84fe12cb8bafdc93ddd11a6287a914a3e0a750cf980c3f2951c7ae9061b0c0ba4704f708938b4aca37591fd67113356e817e5fb01f01cdc7d7994dea21f4dafe834e78d63dc4de1adf234fd89cee5d5d051cd0462361408e3b72b281bdf5be084898b62a6267226fdca86ac44800a48bcef7743b327c06a8e089e644bfca0fb44a3c8c01c033201391a6f10f037885d38aa102e2e5ce86368e3c4620888e9690017fc31de6db63af1ad7f987aa3703ee240ba57fa54ab3cd014c3301b357d8f2f502e87234d7b0e0424b4cbafd5bce856d41ed1b654b115916d826f2f337596d5afd2ac59fe1e1fa2217eaad65e181c3ade97cd99799612dcee7d8406e97f505d7861c468075d4c40ba8cae028a5c80f50fa722e586bfcc7fc369c735a7d128041ef69adf3410c075342848f09a8193176330cf79d0aee0c7f8e82653ee31a7fe159fd566cfd4c31f74c60308b16c378e2877720d8702802dc651a1869f48bafa41f4f00377d91fff74b8be07403b73cda08f788f7579feb2c2b7115a7597853ab2ab6adeb3cea58adea3affbf58619ca8b782411d5d3ea6594bd6a2f027b438d951b69c1609540effc53544f9d0c066f3805ec2b7647f13cd8aa87814b94a7b8de0081aa860c342a547a1c9a1bd3ce29af8fe3ee2303b33477261eb19c7c691f4e875a0b177c4d08992d86762dfcbd007766e970d329c1f7a64033ec6b9b5b9d6bd7add45972fe72e438a5dc391c0d9e9ee1c11c7761214a5e09b6f7232ff80996850655dd2a522c75f9c992138183c84394d15da0dc1c997d2dd3712c716ad9932a6e4c43740a62c152f77ba28e3bd3189d8e58bb54a7263ddb81c44ba6921811384d1404afac4e8b82a986bb8a35c9c0980cfaf6629be05354c3049632240c98a4dea67e6da2ed6d3a3cec35f3e13c2866c429c3438b22e26743019e41c3f9e2bf018c5f657774a38b7e10ad415c71c6b68b00b015dbc23e9079fc396b93363df87f1f21255c518f2de74e46a6cbe506edff1ea4e9bf83adf86ea5f81cd926af73dfefdf926c4b1f4fe93d2e2bdc81840fb4753ceeb2c825da988b208524e805632a4ae09eb91867496a7910a4fc0f3e5ab0a807d137a07d518744d59bd08f9c64e941a8d2741a6b801017c5bf9508aeed2e7f7e74712773c192e71759a5058daf0a20e0f4d5105c615d9345f721fc371885e710fff258859bf3c46e103f0c8a2e9a8ca6c83020747985200b1ce1c9ca9822a18b4122a5d49d1005b4bd9111b66e5231ffe8c055b0d8aeae083d5437d00fe4b6d24d656042d86afb8a29b709a9c39236c532237731ab5b7c6b33f0092c6116d262cfadde1d592ef684527efa3d3c9660559c56f1b08975d9b6ccb3686370d3901b357b9ed50b3fa562602a6415ed91b61c1757b677be2c7ec40c36513218879d100a979be29a535883e93bdfb358f6afe3cd3fa6595afb8b8e865f58028e4cf7761ad289d6a96974e0461099c5265ad8b38cf866068459a9d856b3bdae102a3d200e35e50d09c64a000bf55e39e0d3d873549fd75166fe6d278494bf19070dbc26ce7d04ffc1719a3f000a14a732c33ad5fdb74748bb183b15f43f9b562996eaec0dbda70facef0fe0676274ec9121d913742d47807838bbcafdc981602b7c858970e454fefd33e3f889058a36cf6cd9ac60e91adfdd731e8dec1d1642c49ea28c682ee7b6c5dc26f7bfbce3e53f6d9ef185f97de64ee004c4546140f3955a6710f9dfb2324c09eadae806da625dd3e077e8061bbf1852e434527ecf84d9ed6a91200ed468265448cba43776e39ce05b144bfc8b9aafabaa650157c26b00a8bc52add26e360618072a6ea8d70d4c9a42403b84f4d9c02b48e4d4d75e44f76fb4572b5a8924fcae9e449311c16238133925eb1dc3484057209a606753f5ad0909f963d36712f19b4c2ff2ca74ab425dca4149fee51d52638bd179d594690bec195d248df118bd0e5722808af1eaa82b1eb7dcad864c3affb88d82b876438450286ffc60dae416e1530d4c66755e205cb8018acd40b98d03c28130c904fa7c064585b640133c85d812a185336ad03365aff4dc51d04bca15ff7e5ec6f1e7a3a09e9587bd32da6db5aecfa58c4867f12b679a68c3ee9463a596a2c1a26d00b7d3d42123135389c834fc397748e22eb1cae4d4b967d086a1370121afd121c11947bfd73557a31d9d0b0665be04562b1baff7d84cec6ebc38662915d88a446c8481c5ed6161645977d741dbe6ba2ff5d731b2226e6216ac956e18d8abde4285e35744d3179458a021b9e5d63e3aef0f699fd900034869f83b8f2043e89481dcbf6a06c0363525700494a5ecef1d13103b58401a8c151ede63cf5cba4b1d12a394e1e5eea6cc8570d58ec34ce52aae51406957dcc3442d1e848ed3b4623277569a4a3c425b0c3dacd3c2eacb1b71ea01657c965295ed274d247100a7cef25acf460e35e98074190fad49eda7fd0a66008bb09debf6588f6ce330cff38d6b188087c2bd2021588838cec44756699cc45bbaaf49daf36e0a6144b5e46b75a1e77b4a9fb2afa55b9ef2544c485500b6487b927681f4ab81fb79bd1eaacfee7b017ddc9d8449fe2c4df4e0d6fd74b8253ac216c7d5c98848ad4c6da53b8c1d4914d2a6d287c6b7aaa37871701d592be3ef88a45578f4fa87009054337a5f7aba69a9add5cbd0ca9ebfa9bfd0e54dc199354cd591d3c6cd7528882fa9696ff20cc63f26f13fc3b197f0e7aeea78b64885272f1b402beed550e800418294f71b4779bf5554c874eddc5b86c25f20bd163b97bd983bd7c0fa788b3dfddd02fb60715d1b98d67c46599a934bfbb05482ea93bd31f69fc3884260bd35e89c750f59314ffd687015bba4c8f9be740e0bcbdff595e6d39a088dcb483c7132e3b3a2c41b1060889686afb58174cd00dab557508fbba2fd7326e75b3d7ebf055e56833970fe303988f099508efc28302842a13e052101e0b80a00435f392a7101cc280638029dd0d1111a3e9233041813608942b20b09e3784ff4c0cf087b15abc0e2fbf050b8e141d3664b6aaa975e0ec6616f065a47901684d3cc2163507a7031762ba3eda4e5bb2f911c93102b231981df4f20960e752ea1bb42ca18e5a32950d5d3ac0694b2486b0042aae2a4ea4625d6268ec5e5ebea5da4c0114b59ad46a11e69eda202b1468de880c0339ab0e8ed73148bd3cfc24f01bd09980972fd1780ac86b215d1bf7e139304cd827a9241b2ce9831ba6b8ce730c7d8c6dcc49071e3becfa9767c8e678d410b9af97355c4fcd8f27a5a640318d504f8f85cac08e70ec0d0e19b14341f0642268d0c5dde98541847cec8be859ee8de34ee3959c7f8ff66965d5a045f60303264b86d391d6825d608dee0001bf8c987949876a5cdea68cdfa0948bdb027056bdb54738ac457e68ae9e12d00ae15659a9c5dc3055afebccf6f2042255627583237ce64ae15bb87967a310797a8bd1d8b0ea2af40fe129f3c013c1d031e9045480e3540b0a6d0013c0c3c0c3c0c3c0c5c7536dffa5afbf85afb32c94d060328570e91524a29a5943c5dcfffef2bac5922fdb89d60df01b8d70e220e120eaa7dfa5e075b2efb2063077a400408652df9c3437ba61326ae821e3ffe0565f418418e1c39729061461921bf28a91d599ed6e194b43b437c51ec13df84ff7079a344ef4541c6dfcf744d6249b2f4e351f023080accf8471020c88bc2dff6781c212263a48ce7c1e6a347a216460a38701fb28b92fef6091e5ddb3d85548c105d144b26699b774509a2a71f8f7ef4b80b84e4a29c4cc99f43eb68dc871917650b9927b7c43a25590695f19981905b1447f9a888f53be2b6289f52627a1cf1e4c1c2329ec7c8a906426a51b4fdec31f5d42a95fd303a125a14e77478f5d14107ed263ad8d67e0401328bd266350d6f9fb36a92e8e011203bce5c168531912509c26c7d67d4c1a88c27e375f8303fc6503be39058144f0c5fd3237b93a9820081454147f6dc3cbcfa8a8230c1eac3678792724b57943fb47d8ea7f4181dc4561464d8cff41373e97dfb9415e5ce3fefbe1172a49a405651f2f6befe7c2f41358223236398711eeda9a2a07a714a5232a6830d191f98232415e5249ffb8bf87ac90d1e2aca299ae2b5aa1b3beb3ad8808cf44069fa2308103c4541ac44c6262d1de3634c5152f3eb9d3edfb9c51e528a629dacf0cfee9b2d7421a4286c12cd4fb9ae8c1a8ea25ca7848d90a5cf84d1340819094551da1cfa32b4da63cdfa31c623e3e3ecc7070962c8f8d16303de21a1f864588d887bd867668c042123f50642409129993bcc2cccef1dc935232de4139527fbf168824c075b88278ab3a159372819d484589d28c9e8239424c937e531a4834d5160d641c8484881104e1493e416faf24267f670246d13a54c1bbac9947479d2e9c89420470e203f7e8c104d143eec37779c641966a065a2f499c6946a5cd97e8c1963fcc080eb085e30d282104c9c5fda29337facd2d120e412e524c9a8485d0d27bb4d20c4120671dbf9d6677e1e414825ca194f3b76d0d4655b8e0069a34479cb939275e44994be63fd68d4bc31ffa6834d21102289b27ab869f54e4522512332960d89529eeca4fdf45eed731f64ecc0904714b3e9bebdfcdb112541aa8e96eb2487995448238adea722931c93e825cbc98e324c0972e4e891cad83112c288d29796937e639af025c9224a9fc39d86a83a791f3a78544439dec4cd5d33c4c62582188424a22c4289a33b98b618f172e4e0c1e39311bc60c405218828f5b8565acb9c9cafe732309023c71965989043943ea8d53521aef1b91d3f72a00c0831445648214a56aa9320e5cf444fa703e4811f2184c04b63d6c636d4adeacae498d94e4a9fdaf977f8f81d3e7a241b384118f623880f31840ca2f0aba97dfb3e89568d04420451f03539b67f90a3f2203bd2488f20231e080944395a674e3b52c3067d1eb380104094444d62706dddd3b1d23f943cd7b86e585ee6fc506cb913ccf47dd0a793fa50a93ce93bfa766d0721d4c34d10c2873c3b45d326c1e4a01e7b40f95b491f7ed53e08f5d0c335fab47a34eb4e10928782ea38aa041d7d90b16304fd0fa3034873081efe127feaec4fb44a772908b943c174897651c2e73023cd410f1e3c8c0e206c1b6207e6c4b05755b6996e0f327afcf0618782903a1446632cef9c33c99d355621742896e7581946891e7df23818e911046d0e25cf7e9a27747808598f243b82982040ce2c440e85d71393febdaf83ad3300e4839c7174042f18b99038b49539b9f989591bd7c1962347081cd8d6b54c9d7b2f07216f38811b4ed0860a61c30e1f18b09035b0400d277040481a121082869104849ca1472ac3033c78f410438c078498a101216518d9e10303090821c32765f4286364870f0c7c52468f03848c010121620072c6db40012161d8e103033fde063f7ab080040a0801c3c89bf16698a08c1e3bd08f318649c10342be00c40b0908e9420142b8306280902d848468c106490f1e3742b22012828500845ca14688154676f8c080f96106066e8454a160ff3934489bf524b33ad87a943172e7215428a8bfff2033f6ee29ad0e2ef311bc60240221532846b7fb12fcdd7c452152287f89d29d674fde54734814ca25c9aeee5df7ffa5040ac564428fc649f3d965f384c2e6b251ab394e288870f3b10dcae3c5d88462ad8c8fb9ca8472978f88273f3107cf9650cc647667adbf0e1ef911c447f5f8b1214ae0a412f49d1a5faf2c0c31c2383463032708e3f0109284c2c6a4c2834c9adb84db4b084142b9d49ea9d2a349a89584902394d4a6ca5232fe7d5ec8084513e799d9731b5284f248bb93e4d493f3ae2342c96a9318d38cb4d7d72e6408e570b28cc79c124e65fca2102284e2b907f5eb99369a3b288404a1b0664aaa0cb109014239e5a5de096fda2d55441abf28ea8f3049aa9a81f0a0e18b92506277b2eaa917e5984faa8c3a5a2d76bd3bd0e04561b3c77df17eed40631745318f1557a5a7dd73ba28967abafccad1bff97a1a68e4a21c231aea63f43393a33470512e133e64dea8656738d20884c62d0a52739bcef15593c9a911207e4174502c880e7e0488d9a2f4354a9fb2d1754a5f8b72ba170df7cff1b9a145f1e48534bd1326a6a75994459ae99fd3d8eb709245318b66508d2757dde76351cc66235fe53decc48745c1e784d9bed20df9a15794bb7f477d6c13579494fc9fd8a9ac3d666f4549f2f38b4d67b3a298e55d4eab7e8ad9781505dd3b193d72d3ed5d55143ef73f5e73fc9837a9287aa5989cc9dab9754445b104fb34266c788a72589aace979c2b97ea628beea499fc4fa33d973a3518a729e3a41c896983c428806290a3a8490494ebda97a0d8d519474d04992a284f909cd588086284aa579e4899fd7953385a22449d273ab869fce290245713c773825d3bac712fd4449129f3c9d09f1b77ba2a0434dc9661ed74f4350d0e844f947abe95327d6bf361d6c3b6870a2984dc9d5249320e222db44f1d53c77d6a07a9d952a6868a224ea097b1fda34058d4c94b4fb79d0d4d472f3395ea581896290a3aa63a8d635d5250aa3fde336ea8312ef6149d0b04425cad7aa495c9fd2a995fd4801236850a26025893249e718861861fc6fa0470a120e34265116fd246e08a1497a3691444166936f3f3d8d3e31fb3064208d48946a738ee341d490286e9e5ece8ce611a5b036396d7a53b2d9ec88921276d6c24abcd0db1a519a3bdbdd64a145c830a260ba43986cf7ffa44c8bc853c9922335bfc9194514e7e3fa6adba6e69c24a29c314d6b493f393e5f4454e268c9703a8ceab90ef1e892fa3fe97adc1f0d51eada20afe5468b30994294248f25e4974c72de3809515211e557e2e98f3af9411493cc993ff66a2a258782e8a4118892786ab6cf7793ff0b8882f85ccd74d61f8c9b9478dac3d74b26f143fa33b7c91334bd8c923e6c82109eb4492735a4880ff99a6ef8de18d53de41d547dd4207fd703324ff6f02c4f1ecec3a984f3132c9326133c54727286fa77d82ded644e5ae2d88cec7075f579272ba5c23a1c575a6ed69a63b3478792f6cfd983e59c92433a87c7e4a0be04d34caf961c52925a569b85b5e75c1c92e4bee764577127dd703079c9fae1bdf469d3bfc19149892f7292ce70a51bca6ea63a32747c028d361475e3f7743e17b91d67366cf206cf915ab206affd8365c6d5500e6f93ae269f864cbd9594af36254e101a8aa272f4276d910eb63ae34110861861fcb0f661c8403d434989571d773766889598a16c93b379b669cf67cb50d0e973bd234c12255528a04186720abd6d629f5607aba00c129c21193bbc0634c6503ad14eaad03822f23a0ad0104331c8ddf598af3386ea0a136884a19c4f895d52cc35ed361d3cda020d3014ec2441c67fd198748849e30b05d3b9af33951423dde485c2270df723af6e626acbb0a3d18584dd6899f111b53dd21fd0e042a9e4a04f6cfadb123637d20399a5e0d0d842d974af75de2eb19a4b8c2fd0d04279354c909a6fb7dadd2c6832886ff64a071b1b0bc2484108c240dc010d2c9447bdbbaface84f2756051a5728f58ce9d64d9d95020d2b946468ff8df953b3499f2a147feea3c6e6e4a184860a2531a5e47b7e279d4a3685626fb0d3257c091a64ea051a5228ff28d750d1dd156844a19c35c99fa36cccb9dda20185f2dec9f29b5f76477c46683c01bbd2d8ce8c99f3b0de99c49ee7ce55d17042d935cf84f97c55ddd1193f82f80c6834a124eeb6fed4989e0906349850d2e92b367fc814ab5b1829e08006dc0c349650de9ca1f3263d269c749786122ae962ef36d826061a4928a767d2f8ab3dc9f33c62677da0818492d0ec229b4b64b24f9d25681ca11844f796101d0e842146181b08430c0d88d1041a46286afb7712eff7cabb9350a05184c28b0e9df33cd98ecf3ffe0cc3c36910a124e9e997ac26dc7e85348650d03bed31b27f6ed38910caa9fc3f9996ab6c111f176804a12073f0123e8f9538a6a6018462583b39ece90bf3c7f330c374e00d60fca29cfdd2539f6de94f932f4ac2bb4ce79cab4e8d75b0a5200c318e191d684080d18b72525a54c9871b13d3880960f0a220838f9293593bbcd43ad83a0818bb28af96ced334d1a4d2c9d34541a9ca49933ccd9acc80918b52069904f5a03d682a1d1e407e60e02c29e30c2029013070514cca4d5d346eb078138c5b3818b638306a513cd9d489f7142aee01e95182325ad82c0aba57832675a19545316d89acd2eefeeea95814949fbe10ea049d1f755894ac4b694cb9b19bca1cb90318af28e7572bdd6d25d33cab030c571443d34b79cc79a21db7a254828b792ce1d921305851dc68eb1adb2a3c3d6715a53e49f7efe44927ea070c55946284d23741f5a928493a0751ab38796ca42360a0a29459e4cec987093da55394529334355a3be76d638af2e5a893bd93982f6f2b45f184e6b8499c4f2ea35e1bc0204541cc56bb283d3289761a45b9dadaee9360cad333828c9cf123c89a000c512c4aa3499ab1444351ec93e7c49a0f3f9a732000031465f7caae8c615927e7e800c6270a27a63aef7cf67f4aec89b29d0e2274909b533ed589f22849989bc991effb79303851cabcda326b93c963b4897297ec9b2e596487de780cc0d044b15a3608f3f0373a9899287fe60db2b3c7ed9c8e063030517e13e68395ec5ea2583d2e1a931271994b33806189827c9f11677a9d94772a515aadb52e71d5372ad7c1c61d008312e5ed93b4fd6c5a0d623289e2be8d36934f575989e960d40018922869ca8bd36aa34894ac3b577c29d122e5a3830d12a51026b98d90a9a233bf07301e511c351142737c3ea78707301c51f2dfdc18ce7b3580d1886296fca074775f3d857ab829c0604469acda44bbcd227b4d74b0f507ba9ccb67adab5d77d0c618caf2fa2786ccb93bdc440ca5396df2e77d71fd20b51186d229d98498cf26c55564030c655fffae38a165fa5a1b5f28962969eafe3a86d7a00d2f144f676c4631a99d7b75a1eaf6ea5a3bd3d777f36c3519a427cdbd1a1b5c2896b4cd541d5457e36d630be56b5bf5d9eb7427c936b450923cfd8e1e1d93b0496c64a15c57922821e63a84d06d60a1d42708bddefc31a7aaae5034d5abf137a73655cd3052c001337c94e18122d8b04229c694da69f3fcd3b58d2adcb97a57e9dd5a726f993d87930d2af069eeb1f76e9e3b1ab69d8d2914ec6c839254e6932429fac086140afe717233224dd235f7c046140a9e84926b44941ceb046d40a118546bfcdd68eaf3af53b0f18462f013cf3ba6be1d061b4e28092dd2aab38d8c60a309c5cf9c93248e14a13bfe4db0c184d2273313757479106ab3847266f393e35ac8041b4a28a589f641693bb143466d24a118ad3549a735886803092559b2e9ce66e308c5adcea2f44b6484526d5475df9c63a308c50fa7466af97c8dfa2c608308e59e133ee893261a4a6d6308e593523ef58369923f2b84622731998950796b82ca4610f8ced6f39ccfd6add7b0d4517b5f61bab5b70184a2e99bf693f1464cfe77357e512a69841ef3bdd0bb9f20403e8809410d5f143d89ba116969f1e1ce408d5e14d4c92a6d552ee273c90bde72ed3bc6526b57d53c73f896899fa7214fbb28993e49899327ba286719ef20ecae5c145f6d838d4cea2f931617a65d59acdabdd6ff7f0e4b137b84b8b728c99c34a9f7d059735f58a8618b92f8566fe71ca73afe558b725a4ddd7a52498b7267979d24e3cae745b328e7b0784d82f664510eb552923a194394d8c4a264e23cef53932c9f5a58f0a1966e7a3a73258ddc479b5f517ef3bf8daf9de4f48f183c0c116ab8a21893ce9e744b3f58a7ad2846bb784d9e54cd9a9415a5cd51337afed64966b20abcd5533cdc524dd47d8fabfa66d9aa28be271bcf9c4cd852515453a22b4d7083500315c5921337c9dcb6b1733db2c38719791f23232378c1488e1aa72898acbc933d49acd2243c927ea086290a23f33b425c4fbc453ad8c6e8c1033b50a31465cd8e254d3c792ae63052c08130c6e811025270e762b6a66de59ae26dfde9e4add2129b34c6183d42e0a3c70872e418a3070ffc11c4478d519476d3e8f7b9e98ba8841aa2289776cf41e7dc77259f80181d25c8918347ec8c1aa1289d55674fb939a5f230830ce461860872e4d01164c70f9323478e1c3f6a80a29c4ace41b7484f4ddaeb60db1a9f285b9ee0267912ae1a4b9e286f14552354f6e3675ea313c5134a0e9d4f9e70a2984bc97662f2cad31ab38982c9f93953be9588ff3551d0399f204fc59ca4eba4a5502313853b414f5be68eac7c5a0313e5986433e1e33a895fe21a9728a60dafef195ff5edd4e167895267e7c692e3677b95b85e332f6f533ce698667abda9e490b183478e1c35285192c3e836e9f762afd21a932827496e27a983be8ff149a2a4c43331e8e4d176bd8f44594698d6300fb2447f1aa80189e2c6d028eabf47947396fdb928fd95dd1c5154fbdd5a3bd1333c6c444179384f4ad4a4bba3c508e5e53d6bce3af34b4c74eacd9e1c4335165152615d2b1af4d566aaab504311854f5b6de7f107627888e156a8918892789327ef7d7ebb3f39c39420478e26d44044593d86aa3d0fe27d926a1c8213d9acd5135bd37dcdac33393658be27916b18a23c622ce3b7c504c80e32b210651531a1a3efb1f24e6e508310a54ddf1bdc3db4566310e53969fd41c482484b12c46f499e06a2246892348f58b1104dd5004439e99b4e72d021c4270935fe5052d95c62b0d9d4af6e0d3f947489a6f7e54cbe51a73e94d4c9b0cf1c7352bb960f25b3da3c4ad548371dda43b97dcc2ead753d949350b5a99468cc1a637928099ff583a9342d4a8cf050d87e3ba533d5eb6f77872e3b6e67eef42cab4b9f888f27c345678792c8f1b0dfafa635b735ea507011715ad776db734c87d27b7e4a3bc9f7eb338782edbefba5a818519a1c4ae9eab13f68a546ab8a50230ee59834cb427bb693dffe8f123ca1061c4af2ee7af814ed7d9c918228d47843e19458769bba947423fb3823056704393794f33b08fd0aef31afdb505a1b69926f920e430d3614641833759ad3668d0ffcd1a30442a8b186626b07bd1a3da9114295b602316aa8a19c395b54fed788c8a9461a8a71cb24e16e234e526eb2a1061aca4947467591ee19ab8a7186921cd38b6caad2709023471a0e30cd508cf3ebac79728e49496b94a1243d7a124b289dd7f417d72043d14e95e7969d98535e8d31944f507be7e124d94eb4108fdfb1811c3980ec19414e0c35c450da2fbbf494e272529d23478e1c67043923c899a146180a329759a7114a867e150c652b0bf9ec536b7ca1a05378bcff36d5f042a636470fd1cad4e842e1654b0921636f871a5c28072da332aea9eef8921c6a6ca170f399e4244c1c93458c871a5a2849b132134266dae7910f35b2508c322fa784d2e7c14e5828fa8693ab1bd1536258e30ac52023b654c9e24918d90d35ac50def0d4a132a8f6b5be46154af96579a1f1438572ea2c1ae4dc48fd0f03a9318562101bab394bd0ca0daa2185929fa7075d4d1285b257c921f4492d75e2040a25258b87be9dd3573d3fa12c9feda4d3ac3aa1a446e7f42841fcafef4d28f6be08f73cd9cdf56742e1f96215eef55d192a5b25bb79f3a4359650d27a57ef5c2efb5f76a186124aeab6a66f99fb246552861a49289d896b7afaca78e23e861a48287fc9b9eafc3b4c3afd166a1ca1a4faf2cf32a9129ea6166a18a17499b3b64975ea72826a14a124cba9c91b4463c5794428e58c1425f3c86a0ca11cb4c9204bd23d6a6d53430825b1171b9d63be8d3d0a42d9d3a62769aeac9390d70042d93edd4ab7067f51cc9ef2a21e76733fe68b5b4fc4e3eccb73357436bbc4124f92ede3ec45c13a3e7abfd7c9f8c88600031920410838b02b10e145f1459e072dd9a533b722bb286f8a358d266af64516d145c9bb4bdce041915c9454643a41346a27a51a115c143b28712f9a31b710b1454988ca3ef7d3afaab1482d0a278618d5e826c8911f115a94d744d3ffa0bcd6244f641605df1c6fef9a41dcc322b22849e599a4cde56910b6482c4a92b0994c899b4404169beca7aed8655896b0179bebb49a38b1c82b4a3a8a6e3465a2f8cfc90722ae487baebc1c3946ac1322ad288956680751e21a1aff6158041156943a06b5394e9f876d9019e931460b4164158517fdd22ee6e1212023237eaa289edcb79d5aa743241525c965cd74fe112a0a42959df4a6e323a8ee14652be13597f86eea93ea603345a9d466379363b092252e4579e36374cf27b36f57f923880f142145399ef2f313fd348a527ebd27934c1a0d22248a92c996d93e4567b68642518ec1f7b37dfe8f513fa028bc0927e8e85ca638cd278ab29a7da45ba9c7917ba2941a6c94951ee5bde14e14f64f7edb0a9313a55e5355f725353dba9b28868e874d5a35dcc3d5443928a536eaf5a69b8966a298eddc94f43998288586be26396c68e67989a27ea6bb93632c511c1de232b331bc6b5889d2cb69dafd690e271f258a9d04313ea7425f956c1225eddc57c2e5e9204e24514e92541e4d9f3ea9eb4814362693d4d656b9a74a0412e5de70f2ee8312b46d26f28892fc983bed696f8f1e114794d7e74e2651cdb74623d28892709b84df4e4222106144d1d4f8bfae2bb288c2ef69acf44f4af073e408f263e4c89123c7f216441451d2f5f50ea594c7946222ca9efac4854e7244105112e466adf36822872887ba073b9d476f3b6c228628659f3a49eebdd8cc26852875fa7832932094ca0d3110440851f0cf582aff64450651f4b7ccfb6492cce132558808a2f0f72a4ae8f196d1ad4820fc90165af3af49f9990820942d7d775517b17dbfd7249edd5d913f94ac9369294964123ec9e620e287c268f850a2271d7742d68754c738dfec2912e143b9d5c74caa07757a9f1144f6503ef9564ae37c7ecaa88772d8d2f8493e8d7703913c9464bf07d3fbe99e8411f640040fc5509f565976927bb57728c5ef95564f236f366e87c2e84d63fb5937a9491d4a4ac9b3a38489ce76ba0e361e3c76d8c03108227428069325f36492bd4de7db81c81c4a726cd11bc79368750910391493b0d97c4e9949f6771c8a9e641a319f4c506d62702857cfacb69c896d7dec0c913794547886ccaf1b7920e28692186972095be9e7412ed481481b4adaf309f7d023eab5eb21c286a2e8f4aee29e25b7d91acaa794b89576fcef4df58088a8a1f41fffd48c06d350d09a3127559f2756d63ad87e98e791341a0adb419618c694d2a7752743e40cc5cc1a4e89d87fc9138f6186f28a6dbdee5599d4b9ad814819ca799e756172d08f11203d74b0a5a5d940840c25dd21c2323c243286828bfda6f8e630cf256228c63a31a677d4ce1e5f2fa38048184ada2553dca4d1cc260806ec562be5cc62b5432cb62cf4846cfb75b00d41e40b85ab6f0fe349690d9317f1424969dfa0f4d68348178a7a92984f3e4f5207112e14c427a5acf6ba34a46b86c8160a32cd97eeec1d996346440bc52d3169d45d08a5633e0bc593d74ca82d9d3dc9712c9464aa321d6ed36ec47d85629049a9de2ae13a976b8552c8776a129d44e89645aa50f8fef64dc2c7dbb050840aca95ebab756e8cd68f9fd3438395660a65cfea7af71ecf4c9459109142699418338dbfc9be795b41240ac5d238f95866fbe5252250286e36d933eba2a39854e409c5f02432070da2d96452c4098bbde75a8ba568767ef024767cae838d05224d28dfc9d0f4983e3eab25c28482eef876a7ad4d2e2528b204d3285d4a9be791881216997bcd2c570dbdbd73cd5d6ef2d9273e20104942b1646e977529133a65224828fb65feb8b979cfaa9581c811dccaf332798d70a792b7d7bdc79334102942a932eb59a92fcd77a1138810a16cb28e105332bfc39a224328dbdec751cfa293b9688788100a73a2744bd21977bad4664482e0be28251e8fde52527b1213058f65e61fbd4431abc6bc47c465969628fa89901e2ad3086d254a629424aba84889b227eda6e1af9d445946569a9cd74aa214a7d47fea18c3c452240acab48508dfcf49fe9028e8a4c6a43449ee3ba14794e3a94bcf49e8fc337244b177add395a0f7d449234a61ea644db731321f4614335b3fa68f413b7716b19d8c8d228a9dab27e9b058cf9a4494f54fd04d62bc28d511510ca64b752961d5fe4394776be4fec6666d3644b1c4d4497b2cbd2772210a2a4b47477487f84a8892923c87d239c6adcb4114b38a9e31f313538c8228ac491936931888629e8e507bb127eb01a2187e629b66ec0f653969edc62df5434ac58850a9497d28df9d59e8aa66c9890fc5bc59b7f5419352fa3d946b43efe4ca2bd15e0fa5fe34da6f72de1244792867265972c7123c943e937492cb9de67eee50f8183de67327c94b76289c7a7528093a6e87bd9bd21c1d4a82ee9998323987e28ab9b7e9590ee50d9f31fb6d4dd9c6a1a04accf6591a4a87150ea51ea55e3a9db849d0e51b4a1d6cc4970e1b4c66e986b2dc6c99a9d998e5b7a158d26a791e9f0dc59426ea8c97d41aa13514939c95902656434992739ef4a374e80fa7a1e0b56a56ea4543d9ffd53fbd9e3cb9e2194a5e16a349bff7cb8a6628ac5bf99d32259e3eb10ca50a1b37318a9c0d1992a1bcb33b26958663280926a2a4289d97114331060fffe8dff7610a4359c3ac08f799bf180c2513cc3e6e8efa4dfe17ca7b15f23f73bc50148f93fbbde942e184a651928ce142e9cb4527311b84d0e92d94d6930ae5776ba1aca726e9f5344a3ee12c94fceacc7c64fa13652c14635de6a9d05ea12cf233697a92df3c5628c8f4aab249aced74150a32c91a4c56a5664fa9503e592f67a69d42b9b74d34496d470ac59ce25b69265128effc89d9e40c2ae7048592ec7f799b24bf13ff13cac9e4a0d2c3774271f5b4e6d8ef617350138a5aef59e999b73188092549c9d9bdc64b891a2da11833a9dcc6cb3d494709850de2da3509a5e43d4928c7fc959a1009052d934e8a1495df1da124d4a4fbe4266b2e638482061119ea2776eb4528ac6b78bd7053de39114a32e769f21f5af4432808fb354929f9df0409a124c3dd7732f14c49128452f95b670679257e2d002094b736fb4539853cf132d442269df9a2d872c2e53de83a99592f0a5b612137336fe8245e143d56d77be7ffbc41bb28ef29fdf9544f99215d1493aa2731a8925c9474b66eec33ae830e2e8a9bb398c96563759b5b947a84de289371d7765b94f39e70cd2e3167b3b52879385fdfd8de9ea745318fde064db11e6a9d4569749ff027d44fab2a8bb29bcc19254db32435160569c2df9b1cc2a25c3a356692b145ebf78a927fcc1853488d39ed8a925257b2c684119fb31bad6893741dd3fa646fb0a2e827e3c858fe9db8f08a70631545934f860e2a4e7834f91baa2859c898da16912789592a8a6e5f1a5b63f3262ba1a2185b72c24ee7f4fcec8d539463fcc9ace898b3be6d811ba628c7369dc44fbfa519bc1d3f8264298aaf1e73cca7e4bfa8cb468ad2e7c93efb5892ec1502328a92a4a3e8b7159d288aef1e5f3fa39a8927a72e14a50dbff52553846992048ab28a2ea94978dd5027fe445944741ab5275388b73d511ca59359099e84a9d98982d89339c99daae644d1e48cb1303957687313e512f9a267f34a125113057dbde2ef9ec944c1443706594df54cf906264ac2f59ddca55abd44499c9c5fafeb74fdb40e364b149392b6e45bc9df900e5ec74825fa5ed7b87f62debf7e8312799bd7c89ee759b77799dc984431b675fa32e1e4830c0f9c910120404c09529023c719c70b372451fcb5534a0ab976a434e2810d6c0088c9418e1c23772312e593242df3179e0eb65cf6c00d4814842a41644e9f27f59574b0f523ca226a7d3fb77a8e2886ddf71a4d75232ee3461463369d37689eb5f50d234a331bc7568468857e802ca270a12419364bfe290f15518c49db699bc79afa97888212d95c9726556c2e35228abf3147d5c4cc2e9d3f4439c6124c8ce96eeff73544d14b2ae94d46934294cb4ccdc4b9124e6ed98e1064f4e83132c68f911100dc1844b92a53c6f5fb587dbb0e36327af44005dc10042a63470eca3023e4462074f7183d2a101e3ff2a3c7880f4386190c6e0002d3dcacb0ccb355f5f4ec93a6f73aa68198fd4329349c641dde417bcc79f0d801821c39fc502a25ef8b528b11e1b60eb64ec18d3e14e3bb9992abf7b0b9c387a25ae5fc897d6298bb87b2c62c1f235be57d4e74b025a21b7a28dec5c9e9749864b9e7a19ca4b01f6166d2c19656821b78286a3a7311ad2b49d64a079bdfa120caea636b4dae8913b9dcb043a9e6f575344875b091b11fb85187b28b7abb92a26412b74ef9a34710e31db8418782095111b7b9a39e500437e6502ce147094a85f7891305321204480f1d2365fcb8b41e3b467c00b92187921e0deb414bf81c5abe118782124ef808cd682b7a73030ec53eb58fdf4986b9f974b00121a3c78f641ab8f1062df754656b7366cc4db764feaf78c30d2599fbb37fdf080ff7abe0461b0a22332833d119376eab83addb8c0d9c208c13dc60434134febf9b2e25a9cfaca124772aa19310f1fc9d5443d1b47b7eb20eed92848c1b6928c858aeb3b525a8d2e90d34143d4921e623db3ee94b851b6728894934b5c2b6549f243e7c181f3e0cde30434916a19352f239e7ce77190a1aa389dd194f6428c791f1e327a54dc6f68c616ff1d05611cf36edd97553d7365b622868e6a8d56d174a93347ab40ddc08437154d53535980c1094bcfee006180a4ae99cdf386b31aa7fa124ffd5485155923c4bbd504c5751e2dfe69efc71170a3a423b4cba8d339f03e106174ae3b9f5eef7744e4a76630ba538cfd18afb9ca2365a28867e87b2ebdc8d2c14639364daa49a49f74958288f89b6b0188d665772857218d91c83daf9183369855227bd103a8e0c42ba78a30a25ff9c9aa4bbcb7f0972106e50a12c5a4d8e416fc9dc69fb3f7a2443b83185929ce039e6605ddeafdd904241fb55bb4567df52a251287c3a9d3adde45048f646cbbb4ce55a5b3c4df24e7aff130a5abb25faf9271d5379a020478e203d78006923c20d27144fbcc4f5a079138a9a653f36af857cae985052dead5ea7369fa04b4b687674ae5d5b64d75ece549a2c7a3e4a28bcc979d408f3907d6d8e1c3972e4c861e6a67a3f80b0f96186e11b49282637a99ebced6b3d4642696b77eb745849a2ec4728ccb996ec1b5e256776c3087d887d55c69b8a89a66713ef1b45286586939f537f76d56bc30d229433345756863139cd98851b4328c9def018e3c909f59a2adc1042e94e4c93c46f1d11e16007420d789f3d8f63460fe439821b41282941a91813bc648dab6f00a1307ea2fc09b2de3ae62faa52abf4b65acf50c2c5456b7e744fe28be2c6951bd9bca525cb62d8e8454938c947a8dd79519239864fede31d73ebbb28876aecfe8f7126e4ed3e6ce8a264625b9acb895b576f9f99918bf2c546cdfb9e848b74b6dba4114aee1645117a7b4a64ce924a124b1bd8b04541959419748d6b9d7758031bb5289cf465720c25aed6c11e3d0e0f1bb428a8bbba07a1ab55c19f338c08ea82ec28634719668cfc39c3907146c693b1021bb32869b3316955d5f193b42c4a2766708f311b3b09828d5814e39db6d792ac4cefb4018b92658a698d3e7ff41829e3c77b80edc7efe811d87845d9c438f357f3911f625714f6a3fd0893a48ea2cc56946263f9f68c859b88e935f03ece48012b0aa6393d598aa938edaca26cfa64cee9ea94e841aa28ae78e7899b246eb63b15b99eba6557b9d5556c7dd092dca369b612ca12ece0e103053f8200715414bdc4bca643cd9b1cff5394bbf4e829bda17394db1425d30cba772c53ef88364a513049959c99924c38d9b5418aaf2a7c6b74ca4651369d44a6556b703de908624a9023478e3382181ba228cee6d85aed233378fc0f1fdc364251b891f9246d59bffa988e20a604a92388f1916704b9b4018a92d906a194d850075bd9f84469dd4f9b6a135e820d4f9432fcddf64b29257f3fe2c390c11db0d1896250824913d63153e6c7a39da09b13259d04f139e898be57a8830dc88e36203c760431a30236365138c94eaf28f9741aed68a27872c998ac336c23139fb0a161d54a305192c13e7410be9d45852e513a21c3ad7cd49628a83f19a2f9a41205ad59937c569bd7e450a2f8357a4549523c8962a912a73c7e85086949a2e81642e6a4e7c453491289a2ae5b5a8fe820512e0f26c7c599127465361ed1be698ed858cdeebd57965646b92fb5238ad971b36c652731fd37a29c94741d5c7e3c67c9da60447946ac2419ee5579af8d459404ad6fd53fc14d68491125d9bbfcfccd67ab631251729393e7959c464449b3492a6b36eb246964e3109ceab6da8b9e8d6b8589f66872ba7338d98e0d51ac13f4c8cfa5e111532b4459732e3176c7698310e5d6da117a948a2f31d483482cbdd4dc6c4356cf5c3b66d5d0b9eac08fcf418f1008a2f45ea64cde32abdc0e44b9e24ab587532a44c7793b7a9460cdcc06208a39f234dec91e4f96c9c61f0a613aa64b1f53fa166cf8a128aa5f746430e9ddbac3c139176cf4a19cb9f3c65f494a8cc91a830d3e143ecf6e9de4f61973d9d84349aabd31e175194c7b65f4e0a187d297f09a5de6c943b9ccb4868a0ec2437994aa66d0313556a76cdca1982646696f923a953aed505e334912bc4b5687a2d8c9a35465b834bda143616feb57545677553d87526a38dd417e954341c83f5342638aaeaae350dab4bec2019b93d7dc6a11b5306f3599b653f69d2e49d2df903466fd26c7f7dc5038f95373834cb6a1a0b94fe94cf7a649920321c3fc3025b039d86043c164d331a64129f5bbd460630de5283a961e5e549d12b3a186f295321d72d28c2757cb6ca461afd0af716e2b1b68288819ed1533d9632a491b67287d9f8e7a273663fed8061b662897243a5f6bb50799dd46194a1964e8a0839824a3f636c860955a590139cae8b103c88fc7c1164af59d63744e42002d94c4df9612ba3c367790005928f76cecd9ba888572d05bf2caf457289d9a29498c155ba1285a4d1ead331696e92a98ae65efa9d76a27b3accfe654333b158a3f6692e09f1f1d6cc93c0ff341802914839b2a175b3731c9e12910400a65cd789fc49c272310200aa50d37d6be19d642e45a2000144a3a7aba047842490ee9a145f5228013caa961c4c9f1a975aa2240138a22e49592846e72550d080198507a2bf1c326f5d0213e4b28298bcd5695a5839c93004a28e76beaa8e9f312552640124a55823439476acc512912d4aedb5bf7135bf3e2e3356f8e5010b712630444af4dad2bdf44636792732a3d32ccdb042842417d8b1619a1c35cfe91ba1ea90c0f201e3b7488e1250601885012c5e42449d031bc7d9c0043b8db5637d62d67c4abeabefd327b9600422846394964522e7b26bbbc2640100a9f5409df1b94080084828aea53d17a92ba93fe4551e54c63f343387c81be12296a73cc467ef4c85e94e237ec7f7b6ed0e7f1a29c447df2e0f1ee9390cd00c72ecaf562aad499b02e8a57527e925c378effe38394f1b9288ac618a366f60f22322e4a72f36ed0b8db27681be1b845f924dbae6a8bd338992d0a6a6b5f3e99fae0a845e9ce4a6a9e5c213c4d5a94c3f8c98ef92143c87716650fe3ad77f2d1111cb228c6efa75262d29a7fda58945db64c921baf0c70c0a2204fabab9f92ede9321d6caf7066dfc6b35d67f32d6b43a606b58e41cc84a280c315a53953b1ef5d9f59351cad488cbfebd8fc8f51468e1c45041cac28d98fd6a6f1d8e5225a4539ad4dde3f11ff70fd781d3930db030e55f4d69fb7639c8aa491fd12ea327ed81415059d214ccc1d99496cce294a3ab5849e485dd1ce1587298c7b7d95b3b91c4dd5bcd798376da3a414c50b79c2efe6838314259395e326e99a9d18846314c5b34f92a0e4524c795814b57e7a977bdbc9a955699abed1d7d7ffcce10845b17f93be12ddf94f058af2a99226e636fa8992c7a7dd18ca4d535e1c9e289b7fd8eeb53f41c486a3138cb55ade6ba8bc685a6da6af8aabdd4e4d130d3838515ecd3ba51f4a5b897c1325df4c620ed14e937b6aa274c28e97307a7a467b3251b2f8f1aabd4d279828e7b8f02a41b8021c97289b0ad9b761642c51d8e41b4f3c8df4dfb212c55423ef4b5a2f49afb653c04189c247cfb7b0d23bb6e5248a1d548b681ab59d4eeac707f1000e4994b7f64bc66c8dde6d3252c6f3b0eb008e4814bdc4357aa62cf16489063820510e7652dec893e151323ec88e9133ca3039f832467ef41831447b84d5b5b1a697ebb9b1b39b1d229e65745e8b7138a260995b2676f0924a72510c1c8d304354354fedde45c746bff3480ffff1931007234a1d949ff892741c8b289d303d2d25e38a2886acefa9e7ec0c424e44f94d8365ce4ed2e98e21a25442a8d995f02e310879a200c7210a9b39675b6c8b6bcae0304441a7fce849289d73d4288e4294bd4e4c92d45163d049c6c3ace028818310a552f95cc266cf2769aa83edc728c3fc305ee01844c93a6a9242c49356d7870f330451ca2e219360d95dba84efdec7192960038e4014845c91969aff613509204aa2fcf8895e727f68d732643e110e3f14fe53ea9a899d6476501f8a6573d965aed94de0e043b1a3680d23437ecce2d94339a85d97ed111b81430fe52a6155a3949b879220aa4dce2e27e72b0d071e4aca6544c91e993b94bb432771e4afd6c56687826b6efa18ab318973eb50d22245fd7e1cb9f9d5261c7428e6bbf28c414f83c93a87d2aaf688f468624de670c8a124bb8db9aee98e319ae250d816a91e47753814f3a6bce79c6fcb32f78692dfc953b2ef3987c670b8a124dc4916da3d9824fbc2d186d2ed49ca37ea95fecc1951020e3614a355dfabc7ccbfd55801c71a4a21fc641ca17e336ef02336485e47623c8c19372838d450ba8c3b213e447e92e49e8662f67811a3cf33556627703494cb94a039ee99b89ebbc27186921c17a162ee53f5a87f941c39cc8fdf81c30c05d5d94bdce99ce2f383812e4339092d4f9adc838e6fb8031c6428dda634f19c4c5daba80738c650f6204aaabc0f3d51e9085e3002031c62280953edbe6dd2c618533c0c8e30143629419a9453214b4fc9031c6028851e755295f97ef00be7fa6f90ef24cc8912fe08e20387174a2bba3a8f509bcf634e178a69a36abc4c4a8d6f0907178a99420831da4fa5c7ec16ce552526d37ba25a402f3dacdc4e742c353683072d6ed2290d8e2c14d427297d7c93a49f7c2c94aaf39e2c62629a6c325728c6f5cfd74a4fd2366e85922925b697858ca30a25e17772dc1e9f0ac5fd919ee4547392961c1c53288926493286d689965e38a4508c21333ccae7d9d4a6f4008e2894379d38b2bfcf0437792814fdf2e40f1d6412d4c99f50924b8f677c4eab3c2d0e27946b4b1a15132253368fa3092521dc4c4d83fa68d77c193bceba0007134a629e549d543e89db0cc7129c0b5713d7ee345a19942ed9c2a184f299cc67b2758ee2c1f33892500eea639295e8bb259be04042b154c61cfdd7e45cb763e03842956e753532377799263f3ae4c7549dc719388c50927be4546decfc004711caed59367d94d21c5414003103071110abe93fe7e5a46e087cfedb9231239349f7c021844e8b6b36495e93e4cd0d7004017db56aab105715dbaa7abd5c311945642ac88e1f2cc89103b10d7000e1de705a9dd44b06f08b82d076777192205f944563d0a57ceb45b9b3eb0799ee74a650f2a2249654254aec87f81ced5c30805d14943651f2e37e12d446ba28afc6911ef5e5e742938ba2673e112afac6c5b29fda7676765d1fefd9791e93243be7926400b72827cdf0e99d648bc25a9aa93ecdf764aa45d9940a2db1dad3fe6951d67e3d2b49dc244cd02c4a264c120d9f74de389145594cea8927cebd4a271605e141cdbb7b92593db028099e35c624d8f89ecc2bca353a1afc7357144c3c49fc98e35733de8a624e9f847ccd243adcac288bc992f57583f610a755144b9e26556206111d4daa282799a7f7ba4abb9529150553afd9849b2d5db2848a9209ad35a5b1748aa29bfe384aaab98c5a3245f9325e568e28318a954a515e9b0d3ffe69e20991a2e41993b8f7b9268e925114e375de64a26a429a88a27cb27fda8a3331772714054f4deaa70414e538a65affe95e73f389d29d5493f4aee7774f1437c79f4d999386dd899258790de336270acaa4d2609d6ea2649b94f7d57da74613c564a2cac878dfcf9928c9aba6ef151f1345d3db374af83cfee15f42ed1eef2d51703b497ce835f5f0be1285edfd36a143d693d853a22498127372737faef69328eee8bc4d5286d46c9244599390395afc7350279128e529e162c30e89c26752eb41c5b9fbfc8852db2875adb7a249eb8862504aecbb96ceff69234aa324a963caa0c3c91231a2b84926b1775a1fb7448b28dd0731763d2aa224b45d88889a1173224adbfedae271e4680f11e57ce2a7eebad5b20f51fef66cfd98d14365c81045d1fc181db5d4bb10052fb9676fdc7dd42744614e36f9314906514c927c7efdbb208aeea7bf438938b303510c2703a2d47a5f2fd62342c87f288edc52ba42f6434912bfbc24f93dfea40f852d6dcf6099be36c987f26bbc7433f750be0c15b277b6e418d44341acda4d305d928762f61525849636d72dc143d13a57c91d8ab1754b57c865a8c90e250d1b8f569f7468ea50cef85994c89e0e05a576d54d08cda19842658e696f749d20391474f3b7c589414925270ea5f0b2f62475e050526e7e7d2665936bde50ac534ad6ae6f5d3714c4ce79d6d84f1bca39fa6af2c86c286d87df17359ad4b86b28dae76b12b583284d8f1a8aeb3a26532931e84b4f1aca2b27c82446068f221e349443ba8f97a43e299d3b6728b78bf847abaa91a9638682dd9af0546f612b2a43499630daa762b3930c19f658951ee43c866295cceeb94b12e4d76228091a7ec408f3246c1d8692ff5629a964fdd03018ca4918cfd93e1b6412fd4249466d936fa25e28fa69f60cd32b4249174a27c5c670a198352669f4c22d14559448357552cdaf85922937412de53e4db2502af14451935f6d355828dfcceddacfc9abef0ac532b9844c5aee7356c60a85d7a4c49c9c64af4d158aee56bf9f4a5428e924c769ead0144a199bba94870f3e1b29146cbe4bccf3d6c9a4a350924d909bbf1e37970c85823e93bd4fbd4f28e83826991ca64e72d509c5f528daa48ea726a64d28061db7493861a99932a1fc5be641b5c90d652ea1282a83e793cb834ea3128af7b94af949288bde6849a1cbfb3b2494eae4a968d5b3123d4261373727ed79fc47334241e7d6104a30b1f0cb8b500c258e66927a22a084934dce984e86504edd8f498ceb26a78c100a1bcece72a3abba1e84d29ff02567da030042d9f34b38b1a75c2cfd45d177c3d97ed0bbf9f44541dec9d7fc1bb327d98ba27e7cf4b061377b9017ef8d3e310932d8bb28e5d9fac78ad26262ad8bf2076dcd11ef9796752e4a924713e593122eca22efd357589aa6e91625a18465c9e9d8c17d5b94478785e887a9aaa816c55c27a98f661e4ac9a145d94c30f7dc2aeaf43e8b6210428829e9c34dd46551ec187563a963515ccff5e92e4eb2b56151b22cc176e7571454f8c8cf86de24b32b8aa2be593ac656949349728b79ebef8bac28c74d73daa33509177915059973e8a0a1e38be75815e51332c7d6c4fba0394e4549850ceaef3c4645c933a52625da65b68e4f51f2d8d2490e2564ccc5a628c9b959ee73923dfe2f456947e820ee4446358814654f9df7e396dca2a351945a64248ac2cccab7a8d8fa982414c592e76b545c448a09288a57f2df4bd0270ade5a59da931c6d1e4f147e7d845092b727eb74a2289f499294dee0f1349c28e79ecdeacf31e8d437514c3751a77afbf1744d9453275592fb9c89627637058e83a8444ec5e2c1682c148604c2703014081e5f47003313000000101c108682d150382616c67d148003593c22463230221e1c1018160b8502613810060483a130100c0685c2a13020188cdb5295d603cb054c60548c0784f6397345e10bf91864179e38dbef2d58da42856dcd9ea57a73d4e80c2aa86d9d328280fbdd0b7b708d041d5df71eec76da3fab5abe9e45613bd4dd24a75127a7b8710dcf8fe7744892e6289db296f18b342ba9a637b3b1703bd23fc4ede7092cfc05c6e54ee63193261835cc49728bcdd448e3a5653a4b1d3088ec98e22fda517ad7f80b9c7b960d1a3750dadd9d3df8d503be34d5c5d2dcc74f63f434f29c0f46e353849df0017656ec65e9d30df0ccdea32cc178e77fb3a333266f23c9b994907c4889390fe6e48001859f89c0df5757c2a15a652573e9b8985ffd5c61a76f6d0d900f8e743232c176301f992d92489c788707940f79bb8481876965cc59f015c9fc2a947568e3be9f058baf0026df1e108be8c0faa6124042342fa51cd46c2654a0d319b6612fe175ed1eb503837c4d70570b256786337bba13f2a07eaadce9710ea1ccbe3a775c976ada286a9006199c7be6fc04d7767bbaefc726a1c9be22f7d4932f4ba423bb57b3e77b3c0ce3ac808f40d8d3de3da0e541ce80ce8a1b40cd2414f119dc587e9f9ba3cc0061620e9a96d92ede4f925b9a35a66f7b2c89b02df4af868a044f2818a8bb5c77b0a83dee9a3627c8fe68a462738bda98c65d3dc5d07200de6fbe26448f37f167959a25187029e197aa84988b31c3e6a30c04ca743cff0c58d7151e0b62f562a352d63271761dc5dae7725586bd9a7c8ee74ad5000641c547e032b7332bc9054acd42bbadd3c05d130a1a69659cf8d75f60784f3b88445377127bbda39ff9195eca8041a224325026209eb57d1bf251ea08e0654849bf4e8b3d47006b1b1517623c22505b1747c33418254420fbb1aed461891a267281e16fab5d720d0097309b934b31a8e801c4402087069983f52767331ac1958e93e3c267d19eaf0be92c434c5005b409c44260bf049aa01b0ecc126e09a3a054062258260f52d051afbc3cbcaa7dde100647046526b4b88ff836567e9195b1efa6b64333b3c12dbac33514521be0170b38ac5ea4aa86d1b8448dc868c80049c56b9bc07fcbed8aaf725927d0bd163bb8185b16dd4003259c428d1d32dcbebe03c2d2f1df069fc501f522985be8ad2c680213c56aa2d55b326529d7bbfb9f525739a1af8c9f6966d23fa9eabcec7e9e893c56a2bd07229574550ef4987d6179014d2844677de29e254a529f096aeedf460511efab751a0e142f6453cccf8112a9aa247f10122db2e6a8aa60b90d5e86600fe4a9c14d7ebd6d8276940b2c55a8e4654295122b6729cc1e2196aa9016481c9070a3a8ca5d82f17f709811fff44af5d02b6e56cdf3090ff16c5bf1764d9eca328254a37c32993b14f1686de8c8fa3a2672532eb7e31a10b9e680afee4127fe4455375925b1eccf17fcf8fd94af1dc95da2a778a8443647b725ea6874ca7be3429a368320fa59d7900ef85eaa4574fc71ffc8b8ac8852e1527ce95b4615b12b3ca46a6c9f33ddd8ac95b5d44685d2c885212c26aa3131166caf2c8cd09b0ae85505f150eecde26e9ebeaa96656f6be158a5503f1c23d1e8bbada6007a8e5596a696be729ed99cc67f3f2b6b5385df1af9d18966a8f642d0e1c84a8aeb725d2a14a1b00cbadf04313d796a5c9831088fe121552d7315d02585a78797c290f7eacb32204c64e1944de58bda0ed86d2dd1dd8b4026f52c937f081c7fe40e73b429e7a3d718e1ae4ece50f06af56f3208aa8e22bd0207545a74e9811e193494adaecde40824e3be7064762dbff8cbb39577e84bcc6a7961e3798ed3246c57a829883f20e9cde2f3540341078035a33be392278bf9ce6ca5b70bc72546204e9610d89117dc09709c87b66b2ef02d935776edc44076c48597feeed42426d0141ddbf88ab2994df92ca05b16d56456036d1377623267f43840f512052d630a23a1e758c76a83f936d169b23c638517413871530e6dfbed776e859b013deafd00167cefe00992c3530466710e21cfac2b111e8e169786636a0630e3374b2caba268b3580aba762eea38ae21dc1ab40664c5876ba656e1aee31ada063bc47131e5448ef2466a0458441be0bc34faad5970aa8ddf389edbc3ded4aa5d207e6c636512b07a4ca0abcba09fa71286cb5bd6fb305733f78594c6863776c291c3e0e3fb4e6d59c0839e9ebde149e2da2fb7571121eb5967b7ea5cdf3fef29a44ba52adda0e65aa6e8814314cce489691af69c2e59c7577be0094d531aae83d1ec12019ae686ced959da7074c903f0a985b6476984be61c283389ad39dd6cac2b209469c18c4a9829eb10425c1b8bcf78d2dbadb19e8d8dceba490fbda756185e9868edbdd15306f7d2f920d93b491081511307a25b1d2f5ea84e5c8462fcf4e555cdb9736fb2f8b5378001cb6b3eba07d0069f4dcbd436aafc4f5b02ac44e4d68ef17fd14c032f6e44fed56490ec8d579cbf03ee6e3c49339ed33ca70c15311f3392bfc1ed699abf4c6b6e7506063e4854815e2f4706abd832dbe1fd69684a4910a896fb5e276d85a27c63476795a5fe047cfcad28e11fd7092e60f674ef28bad8270e941eedb535a17090440ba08000081aa98643102cf865f7c327d89d07378c3126fa1f463fdb299bd88e57dfb757a0f7e9198db22c69be641581a527362a74e665c0f8d02a4d25ab514a16b863528367fc6efe83544c3daff50dff9f68b85a52a2a766cd32e12042a4d8442ef6693200702407449dac2e6009a1997c5ba128f1cf428bd19b70317c15bedc745cd535001ac2263f71c1dfd4cf4e6bfaeafd9f0e16c88f12433df04a551f123b35ff4b48f28190bd07b6abc79f733d71a3098c5006fd3eb7a545c09b7b3339b7f692403a7e346758eb1772505d4beca73f0b03613e90fd037eabec8144498cfd6241d8ea4b7e41e1a96dc680ac3c98b5a65a2afad8207ebd1f3d61ca087e36438985d4463defbcf9f2abc88577a4b35ba053bb3eabb01539007ccf0922441ad6a3d1ea8c116ba40a2952587c94172d8dfe68a1575e0a0c1397e436bad36f4c6a3cba4b7c4d970ce0e542ca2e16c6dee9e691c5600f02b3dcca96d3153912ebe48a899a20fa88b8274ed68ba56795717aa3be4d07b4c4fe92171d03041f328e54c67d69bd913711b6c6d89eac6be598e967be58b10a80861e9687fca82c7eec58d29b7f9d5cb2832039f11ed0c97c74938c80e5086bdd58460f0dbdfa21c23ec758c634403039811a8c49f23bdd7b25a1d8f824cc377cb51b241da53cb6811bc430699f1bcc345c8b342c3ee947266394d1191e8264b8e848fa07432631267190ca3792e4c5b901b7f4a7d5342132c53e286cc47022dd2088d13651f051ef6387f2b20e1cede43ed239cbfcb79db0e987da29c530047bd686b53e46a20f02dac2b5a664ef796138ab5f2186d03cd99756e9f9743c901f3099acfa76a28c649a506446260ca1028c43bada59408dbe4fa0710022f880b15295e5723b75a13a40858c0da3e07b7fc71bfab6d9b49e6bede56342cde64e79d47b799782a81d5202247025fe020c594cfd8bb6b0ae44d652e7604034dc85b23b8817fd3b7aad82071a056ba745affb326ca04847c864e185a3343b5a9af082ff5093738a2ec21a1d4c211ba64f6c1ce60764d93cfea225839998baa2919d027fe50051ed5e790fb1fd5dd840183dd00ff5923a23cd4802a50d429213fdba14b633fbfc1a4a804d5676a9d7957dc80186d5c6ebf1d753afe59ff985f31fe4ec2e728ad0d3c9383513244ce0eef74ce7f86c5b9e7bbfd811500d809aa6c5631f4af84dc6e89c339ab95727065bee6588eea276f86df69b0686390f690231c53eeb650e6df1158d355bb5bca6b1a26754d82b4a3d50a9190bc87e8196de44ab6dde5bbae0625212ee4d272c203bc8a0801ef7050b30e275cdd84df5dcbd66a2ba818e2d9ec818a31bfdf92c28083dfadab95963d4944262b795e8dd7a8855c2fa71767ae9996b03d854985a23adba0d9399231cdc1fc6fbd8a1a3a45ac13c3f11bc3fc0cca3f239bf5c72096840665c6b7590ec5c3192e46339460daf2ebe6e792c10cdb5bb5cf698c9c8194e6233a456a0d9016be74ee70ddf745bb6caf820bbcb3c14df9008a87fde04e77611e5af3ea1c5dfe7b0ab280af2b0da0ae4afa78861a05c36c02e8cc42aa826bac64aa4ea8464177d09f56faf311bece6ffee3c013140fa7ad8ba888e23af960ce34cf1d9e0fcdcd0a8b5bdf0390b57c9531843e261ca60fe4e9df97a27b069a6354d816ab5a4a8d95659593c3053a8b85c65c8f5fc6ac40fca13638b815175728905eb74a49575ef8c1392e81085e0974c230c6587c48d108b3530422d7056ca17fe9be29325be06450023c2081b950ff02c681bcba5584238267b17543f8d8b6c0be7cea95f7995e5528d67bf545cb0ab83692ad4dbbb84a0aaf4854022e64b07a3dda75b8e541020c5dd9ee09e64d017c578b1cf84253d60cc0292d5e6fe79a50613033a9f870e7db394249065548edb6de5b1fe2fb2605c4c3815e88d786d339c128808e18b5d9d2ed752aac942118122127bb5153a13a2301b080c72c03f5c92953d1bd8ae1da9359a1d162665bdcdf7cfa600172d0219a2fcb43711e71348e125a12167400ea1b631c213201c473b487fdea08dab0db5ebe4ded91ce8a6e8d0cc923c052d29f702219186008973bb2d487116d3b2086cd04b685cfc5e0303927ee26ba3580521cd312a2b73ae7bcb0a06458d2ed5cc4608cdab2a6010d95aa1b20143c1a2cf6494174412fc711ced275785ad3b64f1dd6548c0e31026cbbb0c156a4c9f20930ca7455a47078aa503fa58a59480d8254a9432c79201be7d433a0949953de30520b738f6c91aec6cc03644418a98662ab0e01212def4f64128a598ac16e08428e8532464660bc7a92cd908170543617062c3b476620692f12b627860c58bc984c8248b8e1bb893407a81564773a1ae494e1f11190450aea1e44814aa36e21e016a735733a9ad466ee4bfd2cac5c87c47ed2140006bed8ef47e15a100f344004b5cb23fe9d73dc59a1df17aa88f2c41aa732ba86427600d54304911359c9220e25302695cde96049b68e84ce4f9a1055cb75535a2961ec33d8a7728b1b3516129593f32f31c51d58bbdea7380b09490ca011949373afb67b15acaaeb3b6ffd701d769fb754e270e75c6b4d317ba1dc7774064482670aa671b295e260c1dd98ebd343be1916d7809791fe3778e23ab1f86bd22ca69552014c49ada4c9e4c00de074b260b4eff485dc48b02d7573ba486bda40b03502e441566a017a57a81976b7abcc53de6665831e5f5860701041b6a0e5fe6edd5ce47423e60af0ab05cb1553480c66a7e34aad39c1fbc1dcd82129e5ebb861b76898de449336ba6bfdbbb45a97de2687b9492e5cf3673de9d7c340c47907434c5fb1caa8fed036637abf78eac6e720b59185e4f6b0480908e6852a5ab6c5ae39d3872638f1af4b0c9a65809eec978e5a2e91b5971950ac72aaa5a8bc54fb61e5182d56adcb3163b869ba6210710b0116bcd4db5cb2071b5ce7684a168274b118a4c4d9b90e5d4544803501d8e871bb12b8a25dfdc1e920f7e014588c834d4386a0ff0e8a8f3806ccc8836a7194fd774d13c50475dffaf3a06b6fa0c47e9127f7c2ed15ab5773cc6403a0fd2e51a90163a73c6325db2458508acdc091c017d916fc29e3d500392f4e94cac927867007b3f3bee4070d7e78257e22d5be9282ba2f22b9aa6281240d56b0507b0b6480741b8e538da61249dde4726300809979a945b41146b730b2bdadd00c8d9e37b7e4882d55aad762348bbe76c58bb1211c5b648099c805bab360d8f81dc22ac09d57e8400b0333179185664f3ed22e84fa2c673a2b5b732948cfd2ba67d3f96d28a11da54f9282ee2a264fc55c4e4be603926e40cea5c6b853d5d5316c8986fa7c4ab571b00fbf8fa6c557fbcb9539d3e59a963eb07acf74279934d6514ae29300c61d395c25d6f9abe3cda2fb941f58d30b97882cef5a099c6bdd919970f0962a8441ab6425a44cd9c969d982e8d8626d5cb801cae00fc1c6a62e46c74ec7299352194620747dac03d50c70364570eb86e202a6dfd3ad683aa145bd3a27d143a7a9019cb7530cd1a6a4f5b3c5cbce1f0a985078ba130c23026012b01682cdd8ab350eeff95bb5f11cdae6311c840d4eb285e03ea79b0b099af3cb34edd89c2a246826e040d7c19997fe8e002424811b0b63026bc0ecc5abf22bad8e257d7c7baf7564b4856f899ccb8995283d19fa6162b8918c3410734e8df454b18d944548f410136136842f228abe2fa7a924167460d84963c2663cd66f525d92caa7c159a426d309fa71c454bcc99b05ae00ee33c0062d196caaf390a825aae77837f21d4441e8c39af007bc0ecfb8531ac56f537341028fb582cd2cde7f8942cdb48cf468b263a6beeebcdee6626bdbc423a12c24ebbdb50cc401b3b58e5eb52b63fd0f1629a8aa6aa87081c3e62b758b2249aa24a3bac632ad37ff9e7acf4315ad9a179c0d8b35573e77a07137eb401f7a13156e344834324ef3a6699ce28d9d9710d42fb158809f572aea3920a18e283697378fb04c9d6765a17a34bc1a420330269586a4b079a28100b4a9c9ed98882e987e1b55ff098b101159e2663a778c0af8fede0d33ad13ec78d52eb3801816f3afc7132358e7b7fa09c82e59ba89f997453c1c3b67e3b77f792f22e37e0a8de8b55f7056df7033343dca32fc95f7a62bd450b0393f2851dadc105fb1fc5c67da77ef6cfb3a056543933b6fd41c4c9d7eef1f821c3c88a03a9024faf3731db97c88ccb8b516cffe1357704139092a124055776435940ff9e1a04f2b24c0bad9edf1149d2964848b9baad0ee1c9026858f137227702b9023547a0180949c1d0f0dc7618617d12c383803a7a104d731be751cf50ea89a19b801886d4d88916b73c85ad16785b9959091f437de398426731992b523a4cd49ea274a3554296fbc909d004b6915c9506a80fb9a3e5080127a2abecd2a8454ffed3ad1543b48738fa08cbd73618d83b5a82e695c43c5b075ef9434d732de4392ad52b5488126fa473254ee765d61f39ae4da2d0165cf7b1c13cb0a15310b404f2aa383ad87ca319fd0c088b344eda9089d0e903e28d42abb6e943efa6446f3e700d24bea07954e8cd135e462dde134effd7c3951666469217831228d891001b738b095eb5ad25795114dde1a8a708a3c81a468ca88a41beb520895181589bd8b8e5411890d3ac5d7d933159fe9babb0c220c3e03c750cdb3819a87818fdf44e250274e456d691215b9294f002c6b84b2bdbee69d4ef9e228cc13192027716872134c32277d257260c90fe8a462f59eb9a09595bc9b23038dc0ea50cd589ec99385139e96b44c93a1c9963a7c4a3a92142300c91aa158c80e00238c34a71f27d08a6f4437b0a8fb119d4ce156fea6d62a62eea7634624ae14ff20f1e02850b16108a794cf17ed032c1f61b99ca1866349623ff3465c64641e845a513ddb27baa106c2683948eaa1446ff2211e45bd336fcbdcaad27ec92a099805512cc2b59f7d9f62be97f80cc92253185b43c65e1212118cc8c46e742d6ee50b29ed987b04b3408c0dd690be384fb99be7be6aba37c43f9290aac28650d0e6a4f508dcbede6cc92a75e79127126aa32c75242b4c97d67692db4d2f56ee202829501cbb1b9d6a82ca668684e2c231db61819998ab6c765fc6708e8231f76e5e9fa75b7279c5c2c4b3b52cf7b482faf2c711157dbbe358d0a5007714d5ba2954f44b40fade8df1d9b575e5c84b6f1c0d0998a8a79c547fdf17de0899cca7cc518cf139188c40d26f25b2905d683428168db889d1e01ee6a20db8e713a56594bb1cbeed42d37d9543786ba324f0e70cbe6cc6a191b8382ba785dd2777904097d87dc571ffd76d91d421c01e4d9cc4541a1ee54072d8ebf384ddf51d026a4d917aac523bca0065f2d9a94a7dbb6ee35180e58f44d82bd7c023eec65789ad7df23f81b84477b0826283398f7f164f7613bd187c877feddd9ba6d4a520a20990a02ba224bdb235e8382672bec92d713edb88c65532dcc52b794edf49d8d8cb0d6586d84be627caa05801fd1a7cf50e0fb16793606102a2e07d49314506e294f31facc52c31ae4aafe7e864e1f67c7836b0720a430edd61faab9b1403a9cfebdfff10aac1e10fcf122f5e867f195d098d6599af3186347d7b83e935e1f0301b7363a2fec3a5ad47260861df5f4da2c87f489d27cb658dd4d6798d85adac7a10a0301238204c966e185ad6c7547264df8c830e6062ea45049bd736eaeaac294d3daf9182457a6e4a8b9709d0a24259dc035a31a0810346bd3cae9f5f79649f70abcd6dca2907799c0ff13fd1085ba38dfbff7f1501f644b34c2e20b7ea27e5384eadfe3fc4f6b9a8425118eb982a329e1eea3138dccc583d9eb8877e4fb43b248d5fcbacab1b7b7558678bff0a099981aa74b521d488e02ab79a4bb80b5f0d92ad85a9e01d458ff21ca064faa182875ea5753196bd3388e1153cf0dc51f80dd903e8521b9a670bb4783b7813551b2699910adce52dde67c4e0d4d5ceda80197d6ae04f936f8fad80fd41e473f0d1ee48220c05d736d8d8880538e0469177a8807a0d937fc253192fbc2e518f289a35d1d276f136b66b126289e65017936a596b01187507abac4ad6b8d77ca992e5753db05fa1742d6448123a17976c6898702b2448f723c7267a66ab0c205e53d021fcd91b13f606b616833f2082d57990d70e11c4026239e2dc23af80750b1217fe2faac2a1657e987fc88d42db3da429735fdb8a11ce8927ef0821894ef4cef893730c49a214c03c4eca8766aa6db06df03d7af98c87386503e1c2461ebaf0caa814168b09e267a77008a239088d4c41e3c0958e168cd8b0bd97e2d7dfa9e14cc1ec60963e1734248dee4db0d0572515266c50420ed52b3107b362a58223229e33bb8e6f47e60a3d20f2e8757afe4adbe8299ac58f3ec3ca7155f93305d06c608f08304ee50e53013f23f1ce717e0f9c698d307801ccea2a40f502eda7e178770891f08b91fbd97c2398500c56856059995068ddb129642c4c8fb90084bc829e8080de5a96d3ba148b33e5f1f383573053b0fd25905d8251a6cc4ae3dddecd7d077164ba38285f05587b84a01090a45cd97db5f11b622f03721ae7e536ee8d77791551e13b2f170b4cf63c7a84f8e1c9e6a4679f9cd8116f52f688041ae4fc98068060a807b9deb995070897dcaf134f3e971dd98c71311636a9fd923472d99e1d7919e325675c9cfd003c4718170ba0e3477163bc9731ea15bf01776a2d72c31d9050772c14e706a49e58d225730306b6610b16bf17018d37107231e5f55c3229c81ad4c402eae4981547596bc7b6ed925c1e4383bfe9a47a754d31a4639f7c8c8ce2c12c645a95421c03cacccbd6b0c918c76e258e03fe30ebb0d8f43331fa16d4c55874a3a7d300a9189f0354c90f54d271b016e87dc360a7068bdbe4469850753908021b747f94c7f2d481a7f4ff5640f14c8701ab62e6697a7a24d199762b9f91931052edf014d4c6a44237cfe790810df13f124a7a905743621d2c8b7bb35b17a9b72b25e38a91f10255a49420a7c5164758bbde64138e5f5036ec9314fe4160744df16060c1a7043b3ca52f8dcbe6b59184a760a2da591d8410a3ec2d75349b255a200bd0abc33d34fa4a4ef5b2621293b5262c94e26d4c1aef7d6ac248c0217a5671017cf7160224f1d761c34b9f0c4cd4ecf64f0dd624d43ae31533f318451072620cb660f0ed7ad5467c8e23bc7bc2e7073177542cfd64d81d28b6aab35020efa3268a63217a239dc091f9455ae47a487cde2d9df56d1d4170b28e2ec89af2cc9b2655a75e0285165cdad94c35e3155309ce6036b3a4c7297b7f5f38b662310c4d033edabfa8b3087a39015dc25df6d508fbf619e17c2444c56fdb7ef20ded043ce60d4af863c49660cf123838ece9e74cf70084280864cf3878122ec6a6607ed6055fa13a54af3219979ec318c44e9496da351243400ffc07ebb89e0d27587328aa49fad8891cd4ecedbca5e17d8c25b63c2ba0104430c1fddec594bed3d1126b68f34836b96ac01426c6e53ba731587ccc53c8f2e01c6524bb44a15c9be20ac6fb8292fe63a0f46c2ccd2c64067d3e72e4395e43bb743e230e797491cff49bcd6b4fd90443305874705238e626448862f2d18da370b468d99094423afa6e443301ef7ab80bc9dce2e65fa1e410a5be8dd9d8fa96eb1f922485ad6987f30308cbd1b73a6940cfe861f6097eb8b71e77b20df91aed65cca2c941cf75b079ce1a08e3f0348229925f6c447abf2baf358dd0cfe8b7bc2c521ff9b593e141ab796834855d7f51daccd392a1f148e5ab0287cca014ef1e4b7872b2bd683ab31d2a93e3f311556235fe623a942234a94cb936364cc35fd2b582b8026450c5b8c2f86a75214b3a38b1010eeb9b05125e484a5038c7c0fea9444d98d0cdac0e8ae27cd85701f552627b75f0a966c63d39106b583c832e4c2058186214c45a17b8f3084270b382a4ac2626f73a7033b7e1927f51776d1cae845c1aadfc628cb6a02a70a1b38dde8ef69c1747f301ccc08a17c37315ec8b845d8d7c62703f1ae6f22da59cc659f30940b05e61d97b8905c2e394d314c6b2ac69b44ba1587e29a67ccca84cd582c348cf4ff7ed95d57a5f26376a8d869973038346e09921fd111532f4162e88d2d7afe389390b29a3293d2dd0da9f92610bb050aa5790967a053ac676c537ff86b2d01c3da489a1d917f4c2716c9276e5e095b40d9ea88ecf12ce4e0e797fa31c851aa5a436a32cffe85c1294ee0da8ab9c0d72b927b06a13c009f4c9e9d0c48b89b8bd7e1c34b1daebd214aaf20cb3c6ccb494d7c75a6e8c12850c7c3fe35073c3a22d1664e66c51183dfa1a506242091d188bc4f7f8a954542102e779f57c924669818179616f212763293ca7ad133c467ef5b443aaacd2a2e2139bfa2d2a683401873ec4356da588a6f976ed07e2cf4ae18df0b23e583f9cc67cab8dc4887c670c0698f6957c22929e1e1126580d804e0e9e6bd41d7460db7c130df0b4f82410a8b06bf07869fe6e89ac2c376d489f488fe5730c603454508e4a22484790b568eeed2e2865ffcb9e20b3195cd1f961c49b2f558c9870292bd978f5a75a77ea1d18a5b7f7170ea7d8aa5fad2ab4bf3c2c01329469508402624649e0c2f5b599a1612b8936b3c44efa48128cb0da2ab508c4d66ed129997c88efa1226b00fcb384ba1e2c91635f49337e04e339521b57a63a2df39704e3e516b0936a69453de0d4fcf2cbf401390caca759b283ce9546b3955a31f9bd14236d7872377fdad8ecce65d1b32275bf0d4c3ef3f47d90717b59f59c39cd8a25872634c96460c9edbd02cc0c6ab7e417dceaad3a0c9e340a1b6da0614cabb418aa5700839576fa625fe919f00395ca4fef86c7c7b055de446e7c860f2e563c76e9917ccd8933053b20f00e0796309853cddc82d341f776fc6cde1e44436d9f00b8cbc614ebbdc48500e9b9842567fe5adf2801f6e64f97e3c0e64dcadf2f325d613e617850d3591f2874245fa39422643c228565badc098c640a2047993c8f76113d883bccf2e34c58fa537c9843dc3fb3d6aec58aad70b3093316c416d8a967c0eb2eb10699b2f87b9b32c4e7458a94e962d1508a568f4ebece01cfbeb7b28acbd9463155961be79de601f1738cb1de129d10e6a21ab35841d555ad259a24226d7461c26b97e3535441ba34d19c499d703986880f28682fb99cb7bfb884bb826030566a11b60671f35a257fbc71aa5717f34a008c2e853db4c7c7944f585da294679852d517397af33ca36b0a2ff9f01b69ca701525e19be7eccf49247e0853c810ac762cbeddc7d3cc51b208b7a04d97b3e561ece9f44469747d7722cb5a17138211c535995f18ad252f818f82fa5e2d416de1f6fde3268e39b4fb89a28ad7b8af9990b1cb49677147592d490b9cf8a00a8d74510cb8ed09ada98b02bfbaf114edf376669a871bff3d8d628a6dcb0ed463d9005dcb36af96cc1b3d475188ef65111b906febdbbc7b65896d808b1448a7290f34deeccbe3cb6af8defa8c667089c65b62320123daf89ab940d3156d5fdd5c8fb8031c7b4acca012aa4a95eced7744848882e0cbfef5a39ca3c878de43e06942693e1d40ab73da48f683ddf5f34354547a85a882d0520cca4c6c4e5afe0921a2066089c24b7443e9199b72fa906849cc54f55ed22f865c622e61c375c0c5dc9470084f6eba62d5401e2ffd4f5e22b66999f61d00632493950906f7d4b0aae5df82567ce622fb2bd383f2e0bb691c3dbdfbac835e79f19eeb0dcb1b6f303587a3816e914f58be64025d81d1278837ff033329c0701833ab9d57bdda5f720792a107fff6a2f80902f263544254dcbdc3eb7351e76d2f762655c7ae8b30c8780be2ac2ff7dce6464f44f7c1f3606907229234e177b39bf6f6c53b9abafee94a4b179fba40cfdd73fef0b758d135b7dced05a37022b7ae3bb1ba3bde3d0bef2ebb7b6e4015b930e9d6f7bb7511f053bc4f784966097ccf79963b87d261880ccdc14b32cc54d0b9eea14ff2ebb82a0dcf4c345942ed9644daecaee4f780d53d8884654b5d4da2ae0623094eedee9189aa04202907f17c57979840f1c1aefc28f3464811a5e2c5c5086b060510ab4ff7124d9e41cb14e31b2bd011db226cfb14034cf2abd1134cc80ef1f1fc54673f054c7a9d9ee6fb0ac3b68108ac8cb59c6d63f9f21306b3c56529dc460c6a620ef72e8838ef8dc45aa1cf16ce323f230585ed8a9c7090a63a4fa0943ec4c4aaf76769f05806b4bd255640061f8068507050261547e2561a20cd680ba18d8e169b51f799c940be7a6dea6d2278d6bfd525f70397f4955c8c19ad34d905036042904042d6406368412a224feb310492e0dc1e2d60686f6afc2aa29b9ba14f0a3ba18de19709eed9f15c60f2193e855f724319298ed82b0832249300d32bc9bc045c670b478058bb23b0c861f763984aafa14d4df9f8273026951ea5a2193810b743badf459c94663a1dbf601b882de136264430014a90a1e3c7ea2eae8f20c36c40efa7b3b75a6a5218bcf5fb7e075a6d173e226cf6766ef39b920dfcd1cef0e53be293b63b1d9d00c37ccc76bf92c1b97bb7d3b5e3360458efc00873f78250071d5df87e351497de8f93aaed1c62358264eeda8f2360e19e6524c5dcc8970b4f23a65a6809e675f308d98aaaf2a82e330a2905cc15e5fde17a27d404b5c104dc32e1ce98e7f86738a9212331d79dec3dbb567e002f300b8503877c69258034849df17397ded4bce1edb7b6f51bc6e6aad1b03a33c954411d34bee200565f0c45a5be2b6c971a94316f28cbf90a6d6014c783133ed5c1516fc0c4638762caa51420ab1b435803e123adb0a7d179927b4fe401298dcfe468000874138290ff4366512262007e48002d848173e0a8adb00d0d0ccff1a0ce864429bdac1e0779eb0b1bfdb704ac5e2dd01f26bf6eb03c89567880152ed36224572f9b85f23e298465c7158e8a1a888f5a6ba831716ee662c9c0ab0a1d30a1455922f90db1ce86542b860bf3ae5078a84445b4441de5e47e55dbf632161cdd52605ebdf9b765b2e62d4b30a5b442e3660ec00e7089bb516a6d3efe91239f779d123112796a36f6844742a6a0709a075832b380049faa2e0904af1feb6ff50d482bcd449e44a4a190de608f44c081ad415421aea3b44c622dc05bc3da4dcb3ab257e63ac2169cf13624d2460fdda13bc7256e3287fb4a4b0c9ac8fdd0d1c7e141cbe6240d0698592c9c2a25a8a1510c0f87c10423f6e6bbb66e5875cf41dea3f88c81de1173bf7e9f8231879f6a9afa424e721ca4f17dcbac68124646a18e0c11a7247acfe9171e07fa5ed89d7db4c907ac22b127ccda14fb8945f787f4ea6a4c69f580a8a93796e04ecd14d7ae9516f9600ba81cd1e858c57c971064bcad9134cb2b94eaa438b8c6e8d1c5e20617f5f72154a5f44e515cd4c61bce684e38d2d58d9938a9d1a2e03c6741250282d19645adf095bc0f4fa8aa9591c51611dc3e53c02529e9f494c8a0b860dc42f24b85d7134b9ea50a72a68a0ae0bac20a8fb88192ee59c6998ce2b959bbec44805f35a419115458cc1ced294a17ba30392c61842716d16e027ba6700617b7ef8c11c23c7141d278b717d53bd922205ac3842ff070536ae0e6483611c9524d6a1239a23b84b9c198e4804dc8003f816feb6f5078ef10952aeabe5dfcba45d41f155a8cea52145458c5aa0ea4c0e05f39ff2cccb56897478ad6e5df441110490e7448cb231d9b5d5be9afb4739441b5010773b8a8578dca4483408a5f0862648c3dc2dc3e6ce97d398aeaadcab60c769ca58ccb13348cf9c3dcc9e401a408d017558ff4495c3d88d7f25aabd51205edbb4c7cd2837a2505024de3ce145426fe0d7fb45e64f402c79dbc0c4a0e0faf20009379cd4a64edcec883cbb90f3459a116f288f24b8fef6a15e14520eb9c388cf7612c0032dadc55b942837bdc080b65512daa7efa1da6d128c6ab3f0cf3475a4d2f985d25a059c591582bec0414df49b29db5e55a1f2a747483cd03fa0b2e0f5f44ee07357f413799789261bb617f2e18493cb0418c18866ebce99360b8a6375905bde93de807210c29860ae2ccb1e44a2123930f5f7ea46367a486af04d291a3e423b63481d7a87ff0393864f32c82215a0eff4054491e1171d2133b22904b0b3cd996013f0055f125491258fc96462c9a7fcf4ba01b5e8b4c5d46535807c3812ce9e9d4767b9e198f53f6efd3531cdaa6d85343b1dbead95dbadc18e517e626870bcac0f2a6d4ceec704417842ce79e4b841bb1742a10ba52aec00a80c741e3757502e182d0f7c31b8164b6b804e96a06dd5cf52a2ee3aae7563ca8eeea6c7e82f82156c29e43d692f90d159b7374f9550a48439f80565af1dbe565718fea436d4a2801112cd6ab1b27092a5b1885c959f5545abea5f07b699c2df23714e038a4acd721a2ffbb9ce7d5bfed0442ab39f6daac7c9040cace6e888e1753885591a4c48986a96682cb3917eaa75c8276cfc9d08815de897842945491cad19fd9e77157d2ec6d254f80da46c24f55e5959ca4f7d84d5c99049882115b479aa42276d13e256d03f1ec3615c87190336646c8cde1dfd7753a864e98ca3d104d8abe3a1c2735b2f35a18fd236aa5a3d5e518017ae6d94e3750b024e9f3ffffffffffffffffb73f03f57fcbaa6f2d4a59fb65da8944d5ef7a807af9a5945292292535adc8eed48146180210c7d90f0fcd04b804bb043930d8886a0511d51e5604c18129a88ee8ce2e29778a6e61cc0e3fa9593aa505912d4c26e8a8242f7ce7b4502d8ca32fcce65f88160613775626e6e9704966611a5992248bec9a51b92c4c52de0b4ab224562733164651f9203b5ea1920a2ccca9f925ff69e715263f694ef45eb35caae30a73b410bf22fc6e85717ff75450974fa974b3c294727e3f69292f5db657610cdd15a1c397aca6b62a0c9f3c4fa9b6b0cc512a0ca3b5bb247d720e9d46854157504ac8c896942a9fc2a0964d343997f2944d3685e14f3b09af914b618a562373e123c3362685419d65cd77d372e11f85a94fcb522ec93a25b4a230883613dc7cb4a130459f5b8bdba2fdbf0585c1aebbdeae4f78f9fa0993b8f112bd4b3c61b4973f5953564f693b61529742af8e494bc29c308d2cd5b7e6269c979b309ca4e414e646fda8144d186b9409da62c7bdd93261743ba5c4f48612e5524c18d743a7a0b7d2bde41206bd7d92fa5b3313479630c9c9d36739a92cfa5a09930795d6b994a026949430492a98a4353fa5982d2761cee1525a923f5b9f2449184c3ca9663929132a14099329492c415d7ee6af903028252c589e571e61bab85b26dd2d8e30ff49b29518a37fd408f305b153d9a45c7135238c5a1743fdf6d8d58b30a97cdecf29ddc3a98a30c55f117b233b7b4926c2e4f9979d4cf65c628588307adcedca265db6241dc25c42a992666135e4378449ae0acafc94a082c70b61de92a414d51f26d784307cf6a4b3a7a4648b77109f248ae59c94f43a04611272c2883ea9b33e5e47208ced96fd2cd72a3e781d803098bcdf2ddaf1f9afebf88349ca9e35397fadd25b871f8c9d46277f2fa5fae2d6d107a38a907695264ab4a475f0612d49f2a86aa3edc194dce7f4da45857cf46014f99fa7427930d9bf7fc9322b9e82d58107737a3225f907ad97628da30b1b30ca021d7730d58e651b79d28daa708d3383049fd810017f62a346c10e3b18d4cb829026d71828b83a987265b760e22bcf440a74d0a1b4faacb41d9f765dd17ecccfb5d4da310793fcd78a77d5d6bbfa8b37c1c7c7177f430ea63c3d6d82aebb78d566ad1d7130a95ffa24c90b71428dc8011280e0011e30c103d214d1018752aaa0f69682e5aab16e8d35134b8e8fddd8e90d06e9c94cb419d31adaec7083e1c28485d94ebdd0d106e3e757faeb3a134c996a78a0c6c7078ef71b5ed8c0c10683eea7afdb9e3a99710ed7603c659e35777fa4c85a6a74a8c15cea3b093725cc4aeb1d6930760e1ff9e5b26e227466c4a0030da6fc567dda2a7781a8e30c0671d2f66a5aac8b52fcbf683398925e7ed51eb598178db1d6050dc7e4c60874d05106831a71d55be9c6b4cc186b33f87b1588a1830ca6d015c5ce4c9e54aac73106e3abfa7dca0e93dae4c458cb917e4689d12106936be8242cc878d1ca6c7484c1143e946b5d8b095d79cae80083a99312daaa748fe58fe18d8e2f983aa83bc94e4ba9138cb41c1d5e306da7f4b5143bc274ca468e7619334e20828f8f62f633109251a3a30bc6ff9827ed725ce6ce1b7470c194265eb08f224abcd4b760f49c534990935544c41d5a3007937faae64d7ab2307764c1582664c74959d34fec3bb0603af973acd3a1730573561115de4411679d596173efaa32b3f4626a1645e856ee58a9c4f3245605b35a9838974fa869eb686083031f1f34b071e3860dc43be8a082f1a49ba59c7f8a9243018d16952585314fbd7fb41247a17d7b86cbd576b5c77b66d50553a1eea41721a2308d3a0b1e772c47694f284c232e94459384e7eb2008283e615263e22f25d9669e4697104f98fa724eff29492645afccf81b9d30eba7ff8a9ee54af42cb231830b183564c4c82183069c3068c895346aa93142c93000d9845a39b32d879798dc9593e4a6098367f595cb7f501bba7172c090811a8064c2303aeeb39a9c3e3d39709c19850993cef1aad6a22b077209b349258bc7ebea5cca4518104b184b12de74f2201f3f59953057b9df875c0e29614e523ac164359dbe5e9a8471cdc38d9849a1c47c499892641ba271712470f3e81e2a42050983f6399da6db7e84a9da040ff2a2234c694eca252559f600d20893b5e5b973b5a4b3fe3b4698835aa9d58f16bd362ec2ecf21fc75384c1bde4ee1d5dd2c929ba904498b4e7fbf5511fda468761314c90dc18419af127486a7861630310442c725e2f676f2b2ab3e5df5bcad28dccf77511904398a454fd418c969c32ad3b4398c2851df74e3ba410265952760a5b32e79e12c2e8e676691ea247251f3208c39a24b78d888230aa77b40ad7c1c273c80524101040e0073282fcc17aad39fd491a75e5dd00e207fca4916daf2fa40f06f90e9fda4609840f66ed183a27a5ef41f6602e13c2920a262607a207ce5c35e336cebd66ecc6e2f6bea46f06903c182f77ec4acc0bf9240f0382875665e4364d3353e5d2e99c961c2c873e3d668c85dce102103b986f3e7512aee259142da40e667f936221ceb6e3c5e960981d3b2988fb925abd39984c89ff9cf23b440ea6950bdb2a5a2a9f4a82c4c1a86b96f2587d14a15c3898df5e3e4ffdc59b4e7907903718566f4edeefa9684a47216e307fa8ad272b35f9d678006983394bf612f7923fa5b18f081036581f749e135eca5d83d9c2eac77559bb92e58d43023560ba4bd7a794dd7a1a0ca26f46e4e9a89ed92068c8cdd4d52e5cb7659a9b7b8f2ae1562f8f2067307cb4a484d99f8a0b2066305af2e416fc833cf9446530bcfeefe574e2daaa044206f3e5205b4cdef2929fc76052a37d3d1e34e3348688c1a86fd144fa6e8e12475b0348188c174dd2274c4c99bcbd0b08180caea17e57b25649dda7085a00e304902f98bf4fd07a32aff369442f205e30b9057513457b8a5a62e50b48178c557fbb26e7564f2504e142f24dac928fc5da93186bb702c81698b50ed5f373fbe1a40573ea3fa58352313c9664c1e415734c1ce963c1a8ad5d7a74ea573078aeb617136b2b98c6241d5feca29b7cb80a7ad6b8ac254d8fedb62a69491ee11e5f5d1840a8608aef31599d84a995ca14ccfb27f7eba9acea5a918251bde453a1ee954b08a3603cf1f54e8b1a14cc39ce86e5d7f9fc0483b61a0d4bca8238e190259bf006a40986535fb2bd6f564ff01c01c2049310a74b7f76ef7cae41966092847e3dcb7de97fa64194600a276246f498902498f357f07827c9a6764a4830dc8efb7c1c1dc1a46f525c6f7c50af18c1681e522d8c2839e73015c1ac323a071b5de28d4430c6a8efba8e52fddd0fc1a4334fceddf5d5878560d6b41f5df766bf571204733c11da843a6942f44030dce5ccadccca6ee90f4cabfe73153bf829a1fbc0a0fae4fc7b1c417a6032e5f317e6043de141101e98f483099526277377116407e6135bffdbc4835b164174b085322d2457588a2f240c7a544a3f25a5f826fadd230c32dba6041d3d098f9f3b47183bd48e59ec85b7cbdf35c29c66a14a08b1aa2bea648471d6d3c7b8694982c7298216c028416411f6918a30e60915c6fadff4f2788930e8d2654ab55cbc31f1106110f5112754ecc509fd0e611ccf155bdf4bcf8c8d6708c3de98dcc9e3df8a2ac12b847d1c218ca95eb93e6f26e860d4b05103060e19798330a7e55714154d9b247f2708535ebe6a575341977681305c05f7dd5ddf8ff7f10061f450529592e28df707ada2c9d85a18eb92d7f2d1f220c3cea43cbd88f8c124f65ef9e4545e0921d207939c75a73b07cf41590731c207f3872bb9b2f3af88e8ecc1ec3958aa2486a6589c64b089e8c1f871645ec9e1e46f74711f88e46105113c984b09233c58524a8d6877309d9af1f8bab61d0c16f43e3c7e3ccb35eb60d47093dc47ae5abaa509113a98c2fdd44627c152d49f83c1b35b44e97c729768cbc13ca7bd7979b471307cbffd9d56090783d27fae960455e40dba99c6c9aaccaadd89697625bfb05a8288ac98081137183eccd6e4bade30e9b7c13ed4236c30fb5cb2de9392246889770d26a992f8ff257f35184f4a4196ca2db5a1b3481a70537331ad1173bbcdd4226830a75cd62d9e44cf60de123cc4a2b7d696680693e5186fa6bd8a94c1f0e5a9e488d08efd6c840c863d1d4a9d9cd25fc25286c818cc77d2ec86b84a5391188c716a6a746cf912ec240ca66f533a844a3a184cda757445498b279e141c44be601262d55277f75c561bf182f1938a1e23c7bede928b23d20573565f532709251be18249f0cd107b674ae7186dc164e1d2d55aceab33fb225a30c9916ac95b4fad11c982e943c4e849b288b9e41f0cbb1944b060d0b94a6c4e52929a14bec815cceba574112b186458f83119179b1ec58b54a1a895c62abaa6855669c5c837f5aba7741ca182f14a6b9e78934fafda8c84c8144c616e372ec7ab52521129984e38c9e4b55c6d498723513025db4cd1fc52d2348582293b33a4f607234f30c75fe7ac56da7dd50f224e30d8dde97dd2a5ebecdc4813cceff1536787fa2b3339c204f3979da57d2e3df1cc8c2ca1a08812cc27c529a1a624c9e45125c1543bcae37dd43d331d120ca2845162a5ab8cc8110c777bf9835b122fa5ce8c88114ce2478449561f2d0731094cc0813343a408c68b9e2ce90f675174878508118c15547928c1b38b0cc1b42588144fdb7b4acc63ac71062242309678267e4a90be732119448260d2bb24a876b2731c9731830f87a5200204b355763dab4a4fe407262578ac94fde492ff5368d8b8e101ec42c407873d3d33f28332d20363a509b1bd4a4a4e1131c20393a835153f5fae0d4476601c15948ae835233a30fa9a5842d456bcf8d9480e4c9b66629fa0dd54504f0407a67613d7e4246af49a30e4162679af976e517c456683d8a24fa9e40ba416661deb4fdbb67f75265a98b4099e539263eac50e4166611eebedd1c93b76d09185c184d3e7c1d2f4e5edb1309f1c42092c4cd2df099e2fe7786a9757982de6e514eee49b38b97585e59e844af1f25e32af1587adb7dc578a6bb1d41631bbf7c9533065b1c27c15c6c6528696d3294280acc25469ea24f171559893ecdb7925e8a4c27c79a93ea26254dc953a94f6fd8b0590539853de2e29a72bbfff92290c4a3b49295ee3545fb414e6edec766d12489b80d904eeea1c90f6204e5527020ea8c18c1c31b890516302f5b1fa6110f01c38bcb8518000d4004d400100c881c30b13102000cfc5f1828b1a6706020480e3460252d081057800878c2e8e0202d00900e0c0813e08208093e3241f0508c0c971121b373e0e008001342001375e067e72e080016301000800030e60ac38f3ae0e33c6f299176734fe068c2f64243092b7818c19a72d470d1925f01804cac87123068e19306024c04310080306023c0251832e008132727c2123f9431734dc0f07f0e803cac891d8a0e1050c1809f0e083c98288f07e17f5b1d53d98564e70b7d01e3d1894f7869d7dec2a59a3f134563df26070d191db26d8a8b9ba701a4f43693c0dc45143468e1b3f434617346c787ae021c7e3a0f1340ce07107949163460c1c07068c0478d8c1246fdea64927874cd73dea6014b1944fba5eedac241e7430b8575f5abf246b29f939986329f1e24b28d93eb57230bf9a5d3ce250b2f1b42b79391e70306ae824cfda492de9471e6f309594462b08932495f2a181ebe10653e78fbba35715450563ac212f7058063cda80ce1f3f28398c5b540627078c19e7ac051e6c3088180ffb1baa3af529cd630d2639fba34b928331d6b6021e6a30a5b4bd26a898ee114a7028073cd2601245674d13c4ffa90e3f3e7008c1030dc597b53c6562a7dce30c36f030c395c13ec870ad6338317018ce030c7785ca655dba979d6dede85c5249269e7eabc4587b191c14d8f0f88251dd4efd72b78c32255e308a5b8fb78f55504914048f2e983e69f66abff8bb29f1e0824909a567743479fc6b6381c7168c27d2b2456f71cb51d5c2a2f55931bd6b564ff9e88d7713c4ee910583fcc99eaaf5ddb88e0716ccf771b2f33dbf9a24ee1c785ce1f0496a1d932b556e8542456bd3d2c557c5d57ca69ee5ad932f7854c1709d836ba79e50c19c644b313b94b833e314cc6fd2aeabaff86875a460ae5c9e4b7c1ad1ec2b0a663df973c8311f0a264bbf21272ea5028f2798e4b6ff441de17db99fe539c160ba72580a7fbf2709c9e0d104f37712af24ef4f15ecf66082f1c45db00ab3aa173d5d82c7128c1e6c54c7657dbe42237828c1e44149426e554efc94f548027a2001cf051e4730ddb8c7f44fb2af24b111ec051e45307eb59ddca3abe7e2c687e0e3e3091e44c8537fceccd7368d57e03104cf3aad644ba8fa3709a1ac8e97042541e8eaea2e6d78a5d02d3deba673cea13ce50184f5f881f94c4527a54e849b8b1e3ee8bcded2b344343f8e89631d4f4f25c6dad7b81998ee82867bf4c0245a177e540e83c18307e6d6d172ddf7bb73238f1dd8470d0f1d182d2e659b8c8d12d6f7c8817d78e0c03ef416678bfba8458416c6f22c263dcb9da4adcec2a07562da63c57afa5316f64123120b8585e1444f1b162fa556669157d8872becc3059156184e4c344c0e79841595588a5517ab2dd69cd2b3e079b7fe22b20a93877b497aeb8ca8c2d4df5ff949d653bb4b85f1c47ff5e92b820ab327134b6d07a15318b44e304b734fc414e6d1b72555e543f4f752182c9a3e53fa7d3f6c8c90c270f22de5a024c1844ba25198c24d4c2a21e74fb89f43c6f920220a83054b424789d4930453241486ad115baac2fddda423a0309e1aa5199653d9c51df984e9b3f7e32c684f26ab114f184f734476344148ff3fd20963bc55b9ea251d3bfa08274c2572a71df224d32a463661ce525efaa944e3eb8a68c2a04cd6df7811213f7432616e9354b4362915c18449f420972f27a14b20b48c1425689f6ec83824f8f8d044c4128995306585eb2476f696f88f12264177f6abe724b953bb9b84e104a5255c5787f5b8ee24613853274c3bf64e30ed2e1266ff589df428854aa853b75196c32808821808422086e56b920e8313503070401a8dc5e271891ee9fa1300418ae2e07030128d03e260481c08410cc5300c82200cc5200cc2300c637005d979bc62f63130b36589ba7ce7d9e5d1ffea47b4f9655e35ec945bab29af3e23582b974ffd70e05fedb2f3ab5a225fb162270aa868e2bd37c31c2663ce99616128361c10c6189d2c9370d89adec83512183e68126746eb68fb7ab4fc3dd619fc36c34b9af84f34e5c6cd4490ef0b0d8d962b530608cc16214b72459ae77cb9690d418b3d870919ac409a28199d9720a235191a58dba83f9f2814a7c9d460f19783e83e2b47e7ee75481c3a29ae359d27f4b108ead259242f3342155c8f4482da07897c9acf2540d73f748c109a440bb18b4f717de41812994799adfdc8571e7a9805ccab9d0c9a604511c0fdade1c95c583460d4fdf1b3d1f5cbd96a79686106babbaa2bd0f9cf706cf1db7a5165a52454a1d4447e8b82c6f816636e9328dba0cdee2f3e8722b7e62201b611b10e85a597eaf3a9d1cd36558b5fb84c70f68b38ba942b49f3549c6d58a16987a247bd7894ad1b29c3e12ac290baaf36dafc3fa79992f4421ab7c4cbee943ca64cc3af2e11c46aab63a5ee6988ace3f7eef0faa488c7c54d1debfa0f67776d11c8612f93b296d9cdf1132d9c1a0d733dfdabbd34ec0389553de28ed226bf53312ec50da6c6ae8823fa6ae1077f8bf3004658bae8a612404f33b1ca3f4c6d09d316252c3647101c3ee0f340a30945dd1a1fc8210ce8f7bbbebd23e01b60dd28f9e0eaccb0f072fb86561074ae4d73012a1cf81309b85d963591bbf0a274f40032fc270debd1d4eacfcd79528074251a0cd7173a53353b2bcd9e2a2128ffc4881001ed63ca6efb01b90ea5553e0031de199944c3492af3719a43026b5e368fa41d96daa1b22b493f722fb5247f09c930862f32d68e16c56136352b88da9196e46642207117e23ae64b48cbe1155c8b8ade35785ffae8b5707524cc19ec4c915f4ca13499fd526c93d2d342f832563717446e8979742c6b9911d6367a8eedd650d746167f409f2ec120945b1dad143da00af9b0437c00cba6140347c088cac92549894713fbd4ec03447e7dade80ab7a366242a71f4c27b826c3bf6412cd4d62f44fe1a9f142cb3df33358ad016ff86f3730885f12c108f6f0ffb769a2ea424e68ea41ecc8093fa76d880e81f0c240f551762285318bfd3b7836ecafdea967cbfe0bfd07a83293610602a056e0325df26732b78e44071415cb607a1109d3f336317c911e77cb475cc5712c75277430b6261843acb318c4150a8bb49c3e4b8018b791175ccc7d3d03595aa33028bd7af6af67e3b1d2713d1b3a56217e0e287ccec3f24031591178dc550848a1163e17781dc7186303b7654f184e4aa8de1aeec7f4b2f84c7b006149ca47ced69b453aee3c35d91d493f792e84277f872811c000e61df99834b9e0f6759468b2417e4ac1d52cccb9f596ea12b7cb9c0b7bb872a023a21434e2896f80a3b33f4fe1e8b40f03b0e7c20fb8cf64e32b32fab86b4cfd18c7426e65f3c139ea0a15191ab53df5ff07912530e052635f6b0d0308a1bd2f824c775096dd5905f506ca115a155807829cd8b7f5f66fc44c44b221308b1c8613534615acafad3d6631dc34cc9fc4a2086cfa2ba232e40732a4ec93fce6d1e0254078f22f2fa74a62cfaa69b13aefdc2fd0a4e9e2d2077d03ed255644f2ec34fbba5f0efc96502d2b6bf464833479a9fdefbb8c4ece33e20352e8710b667ef796e1fff5b8177278eb97c487c26ec80084a0381f3ba2c4a505ca52c56622b4230c2f54381107046f82993d725428c70d5799c44f5167b3b319a5a5f5e45be28fd574540e46878e433a6ca1021481e7e03275bacf10d0ae107a8058c408aa2f4ab58caafb1961880f794a7feb5bcb59931fdd16c4b6b612093b3993f0b41c1d4a2b175d9cb4aa568534065fe604fa673b61bea5622ab76ce0334e77c870a026a7d74eff068fff6b7d3ca28c462d69c665114f1c78abf040df6e4cef31bcee4e4bb9c62961e4b2a70b592acb5d152a26c9bab4e1168cb27fde9c174e9853fbc11a92bfdcfedd69b004b6fab98f70b397438080bcc61db579a24ff529af59c64735ec483cdf9cb304a5562910303b3226a71df9ff171369c1c6b0e110a7c9fe52a7c4909340aa065e1b96e21fa661c51c6e4464044a1b202756f2adc2bb366612925ca81d857a2e7a72ef57f72a7e5144ef4019d17eee8d98c0b5df9e75cef1db150720f755ecf95ea614b4bd2fa6262406ec2283314730081c43bd3a982b4c5fe03b5a205d41e8e0520127cb650df57e75725a9f12af4645f1f3f2def1571153997f8858cc67890a5fa3d0be27f15444984a1a6090e5c81f89083ccefce6356253eb3c675157faa8ccc1696cf0b2d52816d3568f0dfd8f5edc39f4afe85259e10129d3c86edacab29cf52a5c40f9c417a80c7c45782737bcc8b2e4524deb942c328035b52a22840cc104fa33fc2a0e9d4f1104df37d483a30a7dae084d405f424f7ac98b2dfbe00fba44bd0496e05f88ffc4519b28a3b7c7531c928d7a104357098b80f249f454b6426c2b291084a7fe1d2898f7edfc988684b098b8cdf473467a8adcf4ca7f279946c302238ddb39585d64aee16ccf01d34d52cfa30b3ea19c82295dd17b790d64ecd54b88300e7380b756d1c1dddec34175f91cce3c861a6a804941f2b4c8e1e123211dec5c105ad05cae072402ce47debb0969b7338a9593995990bdf2c56438241cb4d5719074096461cf2c02b6e9eb71502ea9378becd5f11b8fa4bf0b31306784665f13f69391be27e12062f1a0ab4e621791ebc9bb5f95763d1dfb940053910a9c51e792dc1bc71190ca7286ab62045d90449a4601286ff5391c076e8290bd93631e52618b641e0599ba6e9507cc5777b72fbe0c4889a1495758a33d0ce825294a36aca2c4493b2d1e510132480f4b2c21221e1a545f87e3f2aad3608d59f554c9713bf74e9cd2857bf4f0ef5121ffe7d8e34f5c0765139745447d23822236329d9dcbc3e313d522e612946a4ab0d65b5c81a3ea1188d6b61dde1da56d69203eb7d95dca060d02dd6ab89e336a984bef70176c5302f4b007f50982a7a37ff800d753b25674c14fe514f116847504991189561bc39425d2de0a353a43381211bcd401182508d64d5e99aa8cdb1960788ce4e73ea04e0d34cae4f904278436926015f1efda4fb6a4a6b7f24c6ccddecec9cb53eddf8adc55fb51f38a84fedfbfd402d241ed383e097338465cc006f9b8c2c54b83b5fb11e2ebc0fdbb6bca99dc3514a489bfea47b95a96dccae4532096855db5cfa9ba136cae012a03c74205446b79eb7bad806452a9a317fdd9e1c49ae80f7412241c6d2dfe5b05983808e511455ec09de62dbd40a957cf8062935b30013698af69884e1d6aea6b6b40325bdaaba115bd538301c7c67f19f2c79b05e1f265399aaf61e3dc2dcc106df34032dd935c2d3a44603779f8973bf1b08a0e1172420c532ec1e8e2a4997ec2ef58559c8391d837eedc5e1833e96be19c061cfa7975f27976df4dc4adc315e2c8455910e8752a6b0df326b0e51d4be038d0f808f53ba94fd3b5d7fb31d7fe5c1fa4cd08e68451d436497b12a34e2f08bb7191c7607a64871e03b70c11f4f95d6b2ae163d36d2edf20bfa14f19a3dc97e7d7f421a41b7083da1ed9ed973019202d6a3df08062e41100202578d21dbd233641079513bb2c1114ddb88eecccf278965965f11bf4292ca1bd89b68cb1096b11ea23d828c5226c54b2ac7b1dcad418c6e8e5dc0f8a66caaaa3020617f6cb970be5ad79723acb3e94c29a9e083745843c0c433374a610837bfb287c7e81f71092f85de62da004e7df15187f3dfe9170ba10f1d6368936e025758672b32f6e6f63aceb840bea38c14224b12b98ade25d6ce5a2a7dc4d7a9cdf15059682ea533112449b1ddf639b7c7ad38798e3029d1f85e8246b82f117fe920160938909ab37221eb4f221cc5d61dc85065dacb58970948602ee62d8d67b1568e90a882d8f302bb492d9e8d6f356255e938b9ee3b3b2690cb4a2fc684a85908520b6380459343d4bb13bd515d13713dc6d8620e230369694e03b945a01258811292adc93093fd5c9ce59e7bc2340d1850f46998ed94fa687d75dfb717e4b615ec8768e1ac8567dd566d87a3a60f401cc5dbd906ea176ce7663c050d0504d87ec4351f051414d51485b7a784dd251fc54ec61065b76a129ddbd725a465a4670b40b4bdae02b6207a49950094812e368cec46b1007e34ab8d25a957cda15e9a01c9740174c2252ab0c9fee3cc8ef5a63ab75e66f4c92582d6e045d3cd05b40084cab04435ba291a1798b49d53ca7bcff080ef3b72e0d0482795af2d5fcd75190d9f2a95f39e05592188011008bd8627b6fa2437d943024da2629f674a1453dbe14020fbf2c7776136dd083178a070459c198d58b3294c3312138d375657fc22e9e1f0ce3840f64d402c0e694381eb95901d33cb95a2670323761d7d94472360752625fb59167ef1236b07115464bc86cdc625e165b1c42665386302019c3d333d8ee701b3fbb382902ef6194c3629919599efa64016aeb24ff80be1cba9450e7cbd5ed909a2d50e83db096a94ce681a3954073e5a0649b7ad3e04eed4be2995516f199008ebe36ba6e45444061fb10084521211aeee0de2647a839c64739802987538a9e7c8c454a85d3b67c0a648f36700a81b5de56254b35e44bf95c19ca62017b2355c029e1d4eaa6524139e32ac8f6d02987d3331ce73d4401bc672686e31ad570f36c5c8bf611042c503690e31d14c4bc1193115f6d003daa0bc29ba08099bf21548124adc09d5ab4b7d8c7a0010155eb6ca7f75ef2950154da89680404e50084d806c45d63891aa6ce3412ff96eeb9336ca17d0d6f350f925f91bb262730b3255a91f3ab6235b124a42ab81e3ecd1e2efefd3163cf2798874b3dbe0fc7f898bd9c9a3ab9494bf8214c0cc6f90a339a43fa8c8cbf8310b0ccabc66323a5e8d9b3838663282b27df5ac041f764323d4b5fa8a5cf9e6027fe1f85d11b20c4a8bfda294453132a311026c49861a20c9d31abeb2b2a8538580f522820e86195d7aa7acc39213c42a1d64acbab3146e22b9f4f476898b18647dd9529243c95edbb07e1a695f73a9df83ef16772109a26a38fadd619d4a6a0c0f0932500e9d868a481c061f0765dc3919ab40b6d274b8ed680d93261225397dbfccfa33ab1aa60bc1fec8acb6b0d54af50632da13523e378cdc0838d282e6a2fbb091ccf009a8ff16136de1945afcba4b97455f8c3b28b1eac3ec6558d0ba13fa978598b01241ab0df3a92741c56e16b495080fba5ab33b2eea3d18fcab3cf8eaf7284a6fa7e005afceb79bd5f6edca8c1600c3687d6e2f9b801007b6be708055e1a941c3edc5c97755b8bf97e46489da9033c9217e20395d3c788ff57308cea45a11ed8ce4222a7641c1f5da012d892fb6009020606bc3a4b89552b6bd6263a724e398b49e31389445f4aeb814", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0x88fbb13c02428a6ba0e3c362f503d78c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x9ba1b78972885c5d3fc221d6771e8ba20f4cf0917788d791142ff6c1f216e7b3": "0x01", - "0x9ba1b78972885c5d3fc221d6771e8ba24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000100000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3401bcd1e9f3885b9b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34": "0xb0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb381d03c816fe51e89926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227": "0x926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ae9e7a6969af6726a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20": "0xa8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d6668b8260aeead3b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575": "0xb8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500952b0337fcbf1d46175726180926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227": "0x926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195017c489719c28aa986175726180a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20": "0xa8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195026ed82a0e5bfb6c76175726180b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34": "0xb0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502ac2136394fc85866175726180b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575": "0xb8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x10b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b8d9d88d2b1318a098588380c0bfaf43fa93881fd212f9c70069665c3f6b7575b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34b0b0bb7e1c48209d1c515c54dc6b106e9dc8764697c67063a3df2f1cb9abbd34926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227926bc7fcc360e0e37ed3d4527e4c55d448318bd2fcc17bac149cdcc34b37c227a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20a8d37e9f0fb7f832fe8ce4b130004e19dc201f6741d816b9dc4108b0805c2d20", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", - "0xe81713b6b40972bbcd298d67597a495f0f4cf0917788d791142ff6c1f216e7b3": "0x01", - "0xe81713b6b40972bbcd298d67597a495f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf7327be699d4ca1e710c5cb7cfa19d3c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/collectives-polkadot.json b/cumulus/parachains/chain-specs/collectives-polkadot.json deleted file mode 100644 index e17958f1f683..000000000000 --- a/cumulus/parachains/chain-specs/collectives-polkadot.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "Collectives", - "id": "collectives_polkadot", - "chainType": "Live", - "bootNodes": [ - "/dns/polkadot-collectives-connect-ew6-0.polkadot.io/tcp/30334/p2p/12D3KooWLDZT5gAjMtC8fojiCwiz17SC61oeX2C7GWBCqqf9TwVD", - "/dns/polkadot-collectives-connect-ew6-1.polkadot.io/tcp/30334/p2p/12D3KooWC9BwKMDyRUTXsE7teSmoKMgbyxqAp3zi2MTGRJR5nhCL", - "/dns/polkadot-collectives-connect-uw1-0.polkadot.io/tcp/30334/p2p/12D3KooWPrJ9VTn3GEs2e7GQs4zoEFiTFcjXFNbQ2iDxFDQAbstQ", - "/dns/polkadot-collectives-connect-uw1-1.polkadot.io/tcp/30334/p2p/12D3KooWGFYW6hJYn3pkpJawyMk6souXh7sznK8yvPmVQ7ktfHbV", - "/dns/polkadot-collectives-connect-ew6-0.polkadot.io/tcp/443/wss/p2p/12D3KooWLDZT5gAjMtC8fojiCwiz17SC61oeX2C7GWBCqqf9TwVD", - "/dns/polkadot-collectives-connect-ew6-1.polkadot.io/tcp/443/wss/p2p/12D3KooWC9BwKMDyRUTXsE7teSmoKMgbyxqAp3zi2MTGRJR5nhCL", - "/dns/polkadot-collectives-connect-uw1-0.polkadot.io/tcp/443/wss/p2p/12D3KooWPrJ9VTn3GEs2e7GQs4zoEFiTFcjXFNbQ2iDxFDQAbstQ", - "/dns/polkadot-collectives-connect-uw1-1.polkadot.io/tcp/443/wss/p2p/12D3KooWGFYW6hJYn3pkpJawyMk6souXh7sznK8yvPmVQ7ktfHbV", - "/dns/boot.stake.plus/tcp/37333/p2p/12D3KooWRgFfEtwPo3xorKGYALRHRteKNgF37iN9q8xTLPYc34LA", - "/dns/boot.stake.plus/tcp/37334/wss/p2p/12D3KooWRgFfEtwPo3xorKGYALRHRteKNgF37iN9q8xTLPYc34LA", - "/dns/boot.metaspan.io/tcp/16072/p2p/12D3KooWJWTTu2t2yg5bFRH6tjEpfzKwZir5R9JRRjQpgFPXdDfp", - "/dns/boot.metaspan.io/tcp/16076/wss/p2p/12D3KooWJWTTu2t2yg5bFRH6tjEpfzKwZir5R9JRRjQpgFPXdDfp", - "/dns/boot-cr.gatotech.network/tcp/33120/p2p/12D3KooWGZsa9tSeLQ1VeC996e1YsCPuyRYMipHQuXikPjcKcpVQ", - "/dns/boot-cr.gatotech.network/tcp/35120/wss/p2p/12D3KooWGZsa9tSeLQ1VeC996e1YsCPuyRYMipHQuXikPjcKcpVQ", - "/dns/collectives-polkadot-bootnode.turboflakes.io/tcp/30605/p2p/12D3KooWPyzM7eX64J4aG8uRfSARakDVtiEtthEM8FUjrLWAg2sC", - "/dns/collectives-polkadot-bootnode.turboflakes.io/tcp/30705/wss/p2p/12D3KooWPyzM7eX64J4aG8uRfSARakDVtiEtthEM8FUjrLWAg2sC", - "/dns/boot-node.helikon.io/tcp/10230/p2p/12D3KooWS8CBz4P5CBny9aBy2EQUvAExFo9PUVT57X8r3zWMFkXT", - "/dns/boot-node.helikon.io/tcp/10232/wss/p2p/12D3KooWS8CBz4P5CBny9aBy2EQUvAExFo9PUVT57X8r3zWMFkXT", - "/dns/collectives-polkadot.bootnode.amforc.com/tcp/30335/p2p/12D3KooWQeAjDnGkrPe5vtpfnB6ydZfWyMxyrXLkBFmA6o4k9aiU", - "/dns/collectives-polkadot.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWQeAjDnGkrPe5vtpfnB6ydZfWyMxyrXLkBFmA6o4k9aiU", - "/dns/polkadot-collectives-boot-ng.dwellir.com/tcp/30341/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc", - "/dns/polkadot-collectives-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWDMFYCNRAQcSRNV7xu2xv8319goSEbSHW4TnXRz6EpPKc" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "ss58Format": 0, - "tokenDecimals": 10, - "tokenSymbol": "DOT" - }, - "relay_chain": "polkadot", - "para_id": 1001, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe9030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x1010b8483205ff2e3dd48d4d4ec691d40d176926a9371c86ba497128450cdb7a404ea63b50c3023d2eedb6796866581f3260d1f6fca2c08399d3889ff6cd904220667c31d014a1f5ed7bc867583d264062d3c7b15dcf14d487b976cb15292d204cc42c67a21ef4329adcf99c421b72d95e4b5a90e24beb0a9b1c922a33a3b45244", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92db362cd71122f9b5aa50a90539ae9294ea63b50c3023d2eedb6796866581f3260d1f6fca2c08399d3889ff6cd904220": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da969add5569b86e6a8960dba59f16ed5f3667c31d014a1f5ed7bc867583d264062d3c7b15dcf14d487b976cb15292d204c": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de4784f2786aab645a9a060c6c97877310b8483205ff2e3dd48d4d4ec691d40d176926a9371c86ba497128450cdb7a40": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9fd8ed2cc49c451026b79bc1ddc510b6ec42c67a21ef4329adcf99c421b72d95e4b5a90e24beb0a9b1c922a33a3b45244": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x29912c636f6c6c65637469766573", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd005844d8023a5443ab5620d0ba4a075a9f151f05dd81c3978c0677fad5133d27a7814bf49e9d61daa9fabb0e7c6c761c13f4eed9b4fbbffb2c93b4b961bacff04e6f9db0e7fce82bd44b87e0b37d1765514949232458fb7b6f42e4de32c99452cd0bbb09970a5d74aad0a9a273858e153a5f74b8e880a143039d2d749cd06942e7091d2674b2e85c898511f3a233a593450c8b8e94ce173134b1333951724c104b236704392488bd11bb41ec2ae646ac8d181b3133b135626ac4ac626562646268c4c6c4cec889cad12127871c1c729ce4dc90d32487490e54ce921c253949724490d3430e929c233936e4d490c343ce0e3921c8f921162606264646ac2a36464c8c980d62596235884dc5bac460107b416c4a2c04311c70d0e09cc10983c305ce163853e02481b3040e0c705c8023050e11b0387092e0d48063038e12581b30366066606be890010b032303060646051b03530386066c0b2c0b18169817b02bb02f6034809900f6034c08d80960516050604f6040c04a00d30176032c0758131c305e66bcaa5e6fbccebcc8e0a0f12ae355e585c6cbcaab8ad7d52bcc2b06af285e53bca07849f1bac1cb8957921712171b2e33ae355c6ab8d27055b96ce0c2c295c695c54586ab8b8b8bab8aeb0dd7942b0cd710ae285c317041e192c2f5844b062e290084c0645869260da6151ee312e265c34b87570e374e806440344027e00d2e282c38624aeca860470a48065886978677860d0e2011e010ad273d4ef41c61e325968567c6860bbfc24ae3e68c24e2e60d100a59826d0a1533a5f8526083022f0ccfca13c37b80c1e1a1c12a9827b891ba89c14c62270cd814ec0bac0c8e414d152e12bc6aa8a102bdc0ac280a280d6e9a68219a88cf0ceb0b96172e275c4d7c3f7c3e7c623ea88fc9b7e46bf229f99c7c377c636a588033e635b573a526096fccc7c407859760281809568289e026780a8e17dc0266011fc1427863f0101e158c08d612638265e051b02c312a5e81eb3013a34609cf6116c60303220195f0131f153088591c332170c8dc488133c543c02e6018c82a66542c319c093bc126988d5133a5e608af8c1919ee04070997c00bd39384a7702898168e438d0b6a5ef08a83bbf850e037300a6a5a30bbc22f984dd5185183044f94efe04d6627e009014bcd58c05138053323680fde971692d691960dad12b46a60c50172692581598925a1a3050b0a568d6503ab069a86c6e1dae2e6c9cd911b263750373fdce07063829b206e4a7003e586043740dc8ce0e6861b1d6e94dcf0004a7113821b24373bdcf870e3e4a6879b26e014a01428033006374b6e72b84972137523021b343670d89c6135792df182c14b89d70b5e2e7825f19af242e2d582d7112f235e2c78ade0a58297945711af14bc50f022e235c44b88d7095e516223c08192637096805074045c19ee0c6e0c8706fd8123c3b1417de0acb8366265bcb27066e810db1307c3bf3817700ad804988497c085f020a818d40c3a066b0c1c2158606ed2b890b86a140d7ac6fc610e319f4818482a72896f071c1e3e1eb62536273626641152ca26033a45bda059be223e2c1e1b5f163565d48ca909e32a83ebd223c69706c74a0fb165d9b6e0f4106bc213e355b1117c028e0296060c05385fb014ac2fb120c02e5b148f8c0e16130dd6191d1bcc32f20699837432c9380f128759141717134b4d2dc6055c4279d0d9a2e3050e125e991d11b81a738aa7c60d14730c98e4260a0ec25b631686c3c05fe0556225e0243c32e418b20c9c2a3a586240c076c0618347873e01e8835422f6c43383e585d5a5a7065618302c2415a721c5708d000483f5065bc930180de9a59580506417161a2ec36a301ccc0417315b308fd8aa6021008ff89289c40d952dcc14c35470da904c7804740a4d226605ce1157028b9a67dc3cc140b0148f8b6ce275016d006bd8c8987de1798981b1951123410c0a9360013c14a0420a46094040253a80015e47041064c2082e2fd38d8eeb72f785d512a9880f0e1c0df181f4c2d151c712c812d2d1516b86a9f1233f8e84b4b0c443494908029a7e20292909410000dc862da294e4a30909c81112520b20780d2ba485a5a4a30e3021c540e42869486d5a4282a1033e1ef05e5ba41f4b42968e7c1c250da9483f968438a0692906213f7ed41e990688901f48403a90716c910e2005392a52a403482b2c09492a52044902a1846367481a529990823009b1000ba144b3484d3e802429f990e1082906a41820300120482eb8e06302009067b648901f482ffc78638b342d213121bdb094f4f2064b492df0c8abfd9154642989a9c908d2510794860cf171c4840444292986a2203f842815cda41b0bc3918f261f407c342135e046b6e18124251f494d494b4938928d0df2438812078e909a62f8816404c925cd2c1293100478728d2d8294d494c424e485a6187cbca41abb2424a9c907530c408e9a842815394a1a527d30c5507196919438e0a3692986168e9a7e20312501594a3a3ad2894d275c142b4d9ed47dea56aa56abfc2475b67935af7808738e0029a544400264021020a54400a53953f62d9a73b666d3288d79a240dde76477a734a7ce94a9531aa5514a27754aeb3951604add9d2953673a9d3a6d4ea693a9bb333375ea3ee59ccc3d594e9d67fbec5dbabbbbcca2edb3d54ca9fc80d256cb5b939dd6f8646e4a27339d9252cad475ccb93cddbbf68e9b93762d9fd27d6bb5b8065b2d564dd38e35e7c69a4e67bb579e9432a59469134daf716fb9b740e0d6ec11da9d29059a937bce964eddb935d9b9bbdba7b733738b9d76bbd3397d8630db9967f39ceeeddc92cc9272b76ce6edd9744a2a67cfdea694cea52da6eedc6ab950c7ee0e76ab6b58ade6c056d7757436e7d39936a5216dcd39a9942c4aa9a4947600034cf9416bca16a535d37dce59809d947e925267dab2a7f40fba5948484808047db27bcf5dcf73e79d4e1746009d393d97ce5232b3f4c9debbdc726eb5585d63d3ddf29ed2bd351b9ccc94e63e5b73720ef7d96a7d9e3bbbefb6cbbb2d4f4a5160ca949d4e14a6ef000104f7392953e78fbd1c3c9e730fbb4f9e01b45c870e771deb3ba72f77d4d979bbe93d999777636fa7b435e49aee1fbb33fd5ad6b45a2daed5cd93993de6cec1cc3448b6fb74973d5b3d73f8746ff756cb855ace519fb30329a5d36b9e3e5db6eceee63866f656abd56acd56b7d7d4744d4db773dc9cad5677f79c94ced9ad39bbc535d73d7db67c7e1f6d9a4f8ee338a639d8d963f779c23481190808885d0025903029a5bdec4074fa0c726766a7ee943af36cb5b85b5cabd5ea39674b3ac264e600b83b7b1c737ff001f5e9be5f0f33730ef7c9ec72669e944673ba747d7a7bbb7f9e3bacd50cd422b8b38bd0dd72e6783965a6cc0c007739cd7d99ba7308ad9f6db578d23c97b3e7f439198496b77c4e77a6ceb5fbfa3acf769fdc07d30573a61eb88f334f760ebccfb9e5eec5a84f67f61ccc2e864d29a573ba4fca94dda7b333bbb3cf9deeb3a7773d9bebd9edd3ddbdf329e974caeebeeb3d60f474f91e23484096928e96927cbcf0a3851684880f0489090908939023a1134a404a626a0a6161e0250189a9852326214d3e7e085152f2318321a969290626b1a785a6187a905e386a5a4a621a72f4a348120c3310603adf4e901f3e38a0a42424840e7638e080039dd9ac5b1292d4f4c34791251f4c4d474d4930c020849623f6f0c09690860cf1313341a8c78890199a38103aa184998e1248382a0129880f250e1cb9b094f442111f2f3c920c484a47467cc0d001cf92e08210a5231796925c704188928e009494928204ed140141674b68122284265b127c2031e52005396a3282b424424e13920b20c49684224d45928c208580b32518496a01896948108cc90792d28f2324177c3009692a72044429e9851f474d4a31f8680109c84fd7c4e4a3a90808259080d4e483096909c905a6221eb8b6042048458a20310d8141c88f2326241984fc40623af25104c80fa4231282089d50c2901f484586b6177e34f9e0c0d10b459296925aa0c9b084246f9684a32521494598906438ea400b494c48321c0d8084134e280108d29190a6211d60fa71d4640429870c4b48f2b5dd0126213020c1b0c9b0842443f8a668777ae2a493f758cee969ce27a7eeb1ad1eebb4393d6d4e4e4f4f9cd3d313e74fd4c9699ff8699d9e640f272727d9e349f670e21e4fecc43dd6c9e9c9493a3939790f2776ea1e4eece4e4247bac9353f7787262a727d9639f688f7d62f5d8a727ae87133f710f27767aea1ebbb3c713778f7dda7a3cf1f6d8eef1c44f4f4fb2c73e3d3d3d798f7de21e4ffcc43d8c641bbcbb0c43111f1b2fd4f9ae24db29d24da4352d0b907fa44dda3a95b96c6349465a8db22a7f5cabeaff821ce2de457e52e58f4a6c65c603b95655c7ae3d6171748aaafc1c073832d4c856d5ddeb2e90ff7e10e8a2953fe35655175b89adaa7f87d4453002b28813bb4afec827ea0d0ac83f76adca5fab3a768d7a205b51b69256d22a09955bda66a87f7ff6cbe9fd5bfd657f77ffc7a35f8afe24999f38e8ef3d44bdeafe05e84edd9ff3e9cf4dfff929c03d9fcfef217b15ac3ecaaabbcf7054f22aaf87a3e7fcfb1971f3e7bf1f0f173d0ac264dc9e7bb3fd8b6e7dc6202a6912942b87e450a714c4c50b7f7fe677e1eecf48abf3e79c33a8ce2160f5194483aa8beed44fb465189c150d51d2aafa7315d24a5a59c9325feda3aad5a495b4e2acb66e3d4ab91f6975306028933ff2bb8ef3f65381bf7f863d7bcec96de43c82959bc50d89ece6228c1303e41f4139bd06509fdee4d5bd7d4ab73e1d535056e7bf7ea4b97e0cbaf951c756b9dfbee342ba541fed258eb420973806e9b811471dad07c591765fc312c7af23f8899e4cd6892d71f78752fabbac1f6595ee0feb29abc7d370fca6adce6d6ed5a3eae678da9cfc8993b30b314ca8d407aafc09127fe24fbef80fb46ea24be1c0b81497e24ffc09957a98ec9bbcceefad1bac3d5bdc4222ebd3f36f8ab26e4ad910eb475ae76c7230acd009acd56a35141d31ff6990f95c8f1be07cdaedf4a001e76fdd5e7e46dbf62960b9f2c7638a9ecf91863af7e3e175fa66e4dde4db6fa20c5ea7875ed7473af1d3d613889d7af9fd4800ef47134498c17c3a48fe6c21d1d2e607cdcfeb66d00c9a54d42955e77e9d3dbe4e75ec67cc6ebea4ac1fc1bab57e7708943f4db3cee7c480db6fdfda9eb53ddd7a547fc9c2cfba719b0c334888ed23ec49cfb7e72ddce68f3729cceac664cc6f05ea2db45374eb33f2144e047fdc61f36309353f86f0fdf8ddef0eadfca13f82756e3fca3a5fdc2130dc1ddecfa72bc4da1dad9fcf8b02037884a5a2725c1890e39ea84139f48020393484018c023be111e483a00d5823ca3e719475e208d631a8527113c7aee35ea9dbb742aeacd097367f881ca2fb335f3e3b61147647a0ffb26935d7aacadfddb10b3476a53f761dd94995ff0039c451f2473ea53b257f46d928abe34e55f99d1772e5a8ee653210dc9f91d6ee475a478eaa72a7a83306ef8961278ee206c23a8fe6c7e35bbcb4393f1e5eb7ef38deae592a8ebc11c975ba542c15536a9856c154557e4741708455f9a3570aaa01fa8fb47ae0828151efe9c956c5b15514b4a95334d234ba82bdf23aee15f5c0adda2aa6caa15b2190d6ed6da654f9ddc8d57f77c77c17474f03f47717e94e8f1b20a745dd7ebca9f23be9adfc8cbcc5d1c89491cd80fe44b243256eaaf67bd8b33a458e6a81e413359f01f233711d39aa2aa7cf6d1395b8a9eab4eee7fe2e2e7153d5668a64d2adcf08eedcfda638729defbb636b9275fed230c0f9fe44eddf0a5d37d11768fbed89db7c7371a4c18924f7f2e5d3c9cd2936c9ba719b0c126c32baf51957aa4ab069b06e3e8753369be148ab2c3b1c956095fbd9356d3e8723ac4e0ea708864424f744bd1c58e510287f3af7f663c1f9336a717caa9c387295356df4ea7c7077f8cff9de432f7fe44f715482d5f9e00c9b0d70fe08aa006b9afc29ca5e0e05c91ff9f2b7853871a4b59b1e17caf80b6a9a7c07805ed3e4f38f4155fe7eb469d2c30272e721d76e5bee1a177d81e613f538ebfcc016eed2e6fb67b4fdce4d1c69a8febc557e3cbcf61335d8425b95cf855b378e1395605ef79b22cf0afdf3a7b804ab2ef6af54dd1c4f93e70af89558b592aadafdb2ab9ddd4e8f1b20cf0afcf2e5f3fbcf979fd15c679e41b72e2a70a59254d559572a49545dd7137301e69c73fe7c6a66312477bb02b8df029eaa3f51b3f8c49c000a74db42ec1ecae7b05f8673861ebaf4e4a702577fef50b6d78eba6eb94a29ee7736449cea5e606786cedbb419cadf2f05aefd549b3b97fb19c9276a0f99b6108f8b2970f57791368d7f86417aae44224e957f94df2c6ed3b891ac10e8d5ab9dcd3625cb97ef7353a15f3e516f0bf1a4d02f5f6ecfef2d34ce0f22df7fdb9eb6501b6d5e256a96ea7605b0b3f14f82a42e8bb469fefe9d4d1111a7eaefcf4644b8bac8816e5b3eedf7df16f2fe8c5c3e7f0ad8caf5895903ddb6504b8faaee6f88640a0995fe9156295fca97522281aa524a29e5af8f8401cc912b47a2be85fafb692d347aed7e9f16e2da3670a9fd5e0fc9a2aea308b5eb38abfddb1f34a45b571870a56c00a2ae54ed4a0075a56a98aa1f51fff6fbde42dcd7fd8e0bb76e21d76e8540aedc4b8f3fa38d014fdc77fcf1d89e13c7edb7effae301d6edf7f3a6f9ef67349fa8b7df4f76fb51717caaf4b970a4dc13492e1cbd72bf9f11fd8e0bc70454eebbfd58e268a4b29e0bc795aadc6fe1b84d3332e4851e17a8dc8fdbb4f10195fb715380dcc2adac90884c9326cd55dd9e0b470254ff8e3d2ef46781ab1c0d8970751347ae9c4884d3a44993a68e4f756e4d92f9475865ca324db73941b4ba758901ae540d5275a475a56aa052f7bd1ee2a27d590bad54edaa6e1d67757f7d96a85b113ae4ca21576f21feddea2dd4bfdf71c71e7fd7def20d0f28244ddb2adfbf5f7e462deedef08072d2b4adfc1e6ed33ae4da1fff7e52f4fd8c68d37a6b875cf773c07214ddd6feede71ff7bbeddf97fd41568afbd40c818e9f43570d40a91a551dbdf6537e4a570e6dff8c60e51fc1eacc4064b79452ca5ac85f7e27e74b9f53f4906b8b63bf1c023b9bf519bff66f0bb5107fd8ad10b8ef4debe7cf68c56dda488db669fd447d02c8df2f6b211972055ba81fd6422ec3adfbf913355173c8b302adfcb4b2c8b3827c7ef92c367175f1a53872e527eaf56931c8d7cdf124999fe8b6aecf08d6fe6e5b68e497efbfd3e306c83f7ab5b769fe2580fc2cf00791e236cdc591d67d0eddaacae0b2618fc3ae525586edeba4b7bb837f944f5b68e42a7fbf932109a0fcfdfd54d8a68d5ef7a5489bb64fd49df43894f59361f3a8aa0c5ecdee60e25a257280cadfdf1f0b5eab557efe7880b5caefb5d0d6fefd7870adf213f5863e2d0601ebe67892dc61baed6e7f40fefd65751b00907f7f59dd0281fcfbcbeaf8b785c67d16b769fbfb4fcc38dd4ad5a2d4e5bad501f2ef2fab070c76228e255a3d597ac6e899eaa1d2f3440f133d2d98d9d053ebb18107cceccbec881918b3256649cca6ccc8cc5a3073c14c899d33b325b32333243334664cccc4cc68301b6246c4ccc90c87591bb31c78d0983199dd306b3283e23963a66456038f193c61666978c8e0896316c5836696c5ccca0c8e19169e333c543c69f058cdaaccaa6666cc42c09366569bedc0a3068f183c70f094e1196307cd2cc94e1c3c5f786aaf253b6eec70d9a1daf1b2d365478b9da91d2e7656b043829d1f74c0e88ca123860e954e183a5e74a4d009610755fbbbcd63855bb485aeba5df5d0367f55cd0a4a5e45d59e5477a8ca3f7251aa8b3d6e80524a1d3dca959534aaf273e1ca9fd19f6ca14d0553476944ed9f21b83b66b2e7c69c2fb5895237879364af69d26d95ca3ad6dd89287f2a6c5454fe294a55d6d134666f5b88bebf0fad855acf2f420bc9e737a185baf73c5184a6b542ea35ad5faca102f277d7deb69009efd300505f440dc0127d68dccf90e3880ca9db73bf1f0fb0528e2302562a8e4366c805e17efba8082dc4893c7f3f1536714511a40caafc320439c9553df9f0c5136d584146131e94180a62aa07294796b8720515212b422019830c2ae068e204234f3c2089c1161fa25460821a9890021d8e20c1151938944c11809136ae585245072492c8e282128cd0c240b1840b291c68f00609337481a2c5064feca0461041335029e34b1c265802c5ca04232839628583551146f46044003c29cf051e1015a0628225d41023268e24403833bc66d82c56664055a140c992232200a165872b6cf0218a1b006064ea8a2c4cc8e088114f3409c188074cdcd0851753392cf99161026d10d143933367a4e00b6d860754e17215458c183e34016186a71bd0105104972353cabcf1c1185692cce0055610c102280f6248c820e1860e6f90c1e233c39a71a40b1914c4808c1ab420c7134d6c50c20609d83862073188323e0c31954409c26011babc00f70a3154d49bba5798d145955566a1d11bc1ea5c5db63dd43f8a50f769fc19c98f0901cee79fb5d0e853c7292af9541ac70e3cad2fc89401bdae54133167c0565da92654dba48b26394b9da2a0091664409bba524da0d8c42648e000ab6a32c41a4d7ee8d280605da9264b3c28c01c2b2f09f87de9c264ca09d0ab2bc5848aee056057578a491346303162e510287ff899b968f4ea9c524c4e50e77bdf50341fd6435e34ff7747abfa301a2cca5a00baea4a31d1a11507f8428305a8f3a55302a460cc00845dd10203fc9ca802bf23bc1a18ab2b05f5436b0910a7ae14940d95bf5506f8d5955ac246e507e59017314b2d29a37a759755a2266a198221ac7ff8633a805c5da92561d4aeaed41231d587a7133fb1645d8122451b5d08d1c40830a27823ac229644d1a0066a8819a38319f60c1251643943860b17553830f28113b8c00625980a02aa4bcf0c4cc6c491e4cc1b4bca283333f224ca1448a8a2cec042043c46464852658c2ba60c21032d76664840185a5ca191aa0295864e1216f080450d2eba605181cc4806b264d1061333a4be3822270425620c31c6042b980195d80c4e362023831a7001a3a50b9c7e6ac205424cf1e26a8d358c2882d5116436d2adcfee0eaffba37fad56b3a188283604c83f9a50f7570ed1227e2a87b856abd5a08af8693de445fb4b4139546408328668a2862790a815bd6affd7fd7a7db8999be8564a91549ec8a8baef73e3a8532a9be9c6d1cddb7029abd579ee79b2d9f36579dbeabcafc66b6a6473cdaef7ade76db8355675bfabb1b1f1361c656dc3b1a9eafe8dcb5d2ed9ecda52f7a95469291da56b1d655555650b159ec2511c856b57bb45baacda2ae2b85295bba5749f9b6f9b6cdeb8a5749f73e39ce36433e773db388e5256cb5b2dd9dce2288bd56a759df7f9f7c9e6afd579def7d5d4d8800e82b219fc3caef1d8c6c66310f4f8c6f5f2d74b36bf5cdebebc856d38821b8b799b2373994c36cb6e3c0e5d1e87afaffbdd0b06f3381c83ea3ecea702d76d5a87e37118fb54e06e733c274736e7d01aba40dc365d36e3d01a2032ddfa8c5e54edef2498a6b5acaa2da916a87fbf07d0ed975be490ff166d5125550f715cfaa71f4cd5182b33f28a43537b7f47da43455399bc8eb487da5dc45dd30438fa545e9fa6f18efc955be48f147bdc001daa8e0e55d5cf51c9a12dea91b3aadd95bfb3b14a41d61a2640de2287ba48d66d9a17553787f320dee06b67d36fd401073d339e1d1d594e0c07f672dd8036359fd7b55894dba6cbe605dadf8f08a7a945c8276a5e5efe513624c5dd1ffefd5ad9899fbabb8b94521cf7e7fb8ffb1f0bfb41a694522e9be97685dc65d31685fe71bfeee3600176dd15b80659717984fda76616787b1647ea4fdb9d86ebce713f15bd6efff2168ebcfdd2794526af4db28500fd86071418f9fd748ef3b769eef37d36cddddfbf6bf6ea6210b08ae3e873db8f9472949b348c4efe8a23aceebb5600f6ef50612b114e53a97fc7210e16bd0b3482db8fd42b7dff8e869412f5e6321c95605bfc571cc1bae2c8cffda43f72cff173df9c7703b07ff4aa7caf85785f3e0d5788fbb139c4c102f4ca5f83f01335e7fccb62ba9fb435ba305c9a0775fab782d74dfc059a1fae531aadbae8687899793233f39c1b23516273c2861326bb6ddbe673dbb66dfba9c5b662d050b9051332bcba890ed534f9e014f5c0add2b17bf4993fa3ed25d7e23817b7906e5bd762cd9f3deaf6f3896437bdf9ed9bc873ce27164b333ac92f59e8e7ef3864d19b269be8a228fd7ed441c24f589d7aabc3fd282322c019a007ca88e4d005e48ffc4fe689a36c3b9628b505f42f85ae9ca864c5962a7f734783876f9300046063298c0d4a6d6ce49c73e3388ee366dd449a4d191a6d526143874d6e3e43af1d7bfeb1e02f7f0ba737f50a526ceada4f44b6336351c51866666c86a452b831a448994e4559ad8d4e3ae59c739b2de7dc441d330a1d3eeec34da7656ed6a3acaa582dfdea14bdf685616565c567ca584937984ddd44234d934f6b4b3d7097afd86ddb422559ddb6b96d1ced8a37cb642ea5ab9b2b8739bfa04bdbdeab1b0d3f9b6f4628b74d6ece8ddbbac16cefe1b6f1f6cccc2c829341b05bcf3f238ec5a2bfcddf9ea322f71dc782ff0cb9f7cf8893dc26ee96857f46fd735b17c7ad52fd69228c3eeeaee4b340ed537b721c37c57d9d9bce078d0ea4600775d4d1411dc1caf500ad97af430ef9d81df29ef5bb42fe43e49027726dfb8cbe1ab6ea9043bb3ab6f7a3ca3d7deee3f1b5fb8e6e5b27fa13c96ef3c6adaaf259e1b860aa7c1a8e6ec489f333eae77e9b9c8f4ff5a6b9b8ace66e406b66e41518d20c0d50f2ea4a5e815e9da2438135702887a21e7875559dd674a0544ba98c0abd96267ff4a9fee10a81ffb42e2f2a5f268774c81ff95447955bbfeba84e80ea3b05d236186d994ef102373700f9471d55caca89e37a41a334aaf90347154656799161fafdf90660d55215ba3a4579b540aea82b79b54eabaaaa73544cba6034546aa151b61fbd26e595ac925b56caa1aa64f3655256657594d54d56fd89541d1d6aabbb40a39107acfc19e5161a80a84e4394ea50c0918628dbb4298e343ca9fed2c35156d5f91d8e4a0e55fda7e89ccce24f467f0205553d8a133fb99c49d01ddbcf67ed0e96f705122541457405301f097d255fd46a39b5c26d0530a95357ff8ec512e756a777db26faa4e1ee09737a756e73c963277e9aee3574dbddb3bb7b4eafe3bcede322e8f33781afd56ab55a1115b9cf683a1ab65aab363c90fb2de45ad3b8f7df42dfb6d9ddb37f6e38d23a371cbdcef9d39bb63d8744e4f644adb4893e4546d2b40903ae715ce3b6722bb6aac1ba8b23adfacf64cbcc23acfab685a357ef24efeef6cd1db737c36e2eb7f49a5da0fe11567b6b7179db96fb11acce7a5e181b2bb44b1b6daa4d1dc159a7485b20f9366468eb14e6b0994615312805c15146e5104755c603b744a18202f21b20ff7e11d8a2953f23ad54b5dfbb8b38515a2521ad681da595a49254dc14124b37086c24d8a807aac066dd3759752703ba83f39b5b9fe218dc6ca6e598ba2fad786c55822ea9a04cdf685f716c0548a9d75e9359018ed4c6fbfa08cc46069bd97c2a70056f5c2fd7eb067cbd5eaf974e0dcc88915636c091d66eee9a6d1aaf08aeccc0f0b71b65c336badd70d634269c6be7dcf2371c5d68806b851727445289a8dd97906168c5891329209d9501f2afd7f1b76fb4e595714695d5b8e2b0a1f2aa42854ea12099ee96920a753137665cd6b45695358de3388ed20e8bce6bb55aadaef32648c49c40e14d89721205889c0d8c2b740af57e90f9151d2792cacc15b8c3d595729266cacff0784d36eba2e0a0c49d4c6d607854f4dc5085ca9a168bc56239393818413f23ba133c0b0b0f8a9055570a072c5e68440f8c076e417188c2a10a9d2f39b6df1728072e39089183131cac9a82e1e3048cac2be584caeb4a39b9f2b02b3cb8014d57570a8728603630dc890f3c0e55d8da710bbaae156290a83216771728f4056a4d05e52095039533a8d0ba52374cf1ddb13b56d6b4300c43518cfde081e7e3e3e3e38107340f84cf88eb5a2146892a6b1a081f11af207c4644384d652d503f089f0ab46f9f43ae1b12e134959fb640fd3bae31e04add0086b53be8ee5879e3354dd6b4159b04187816cfe29e454b992e5ddcc1c8e259ac68f12ccc5eb45861f6a2c50a73192b5eb460b1a2058b15cfa2c5b36c995826162ccc58269689058b4f2146e1593c8b7b162d65bc787107238b67b1a2c5b3307bd16285d98b162bcc65ac78d182c58a162c563c8b16cfb265629958b03063995826162c4e8567b9c18b96325acaf8cc32bdf02c65ca94914efcd49ec38630c24801ac3210a7e8767793bace488bae5b2eddfa8cae5a18709c532dd90a70e33aca6a75de576303deb85e309c58ce4ca6e3ed773b3cde4e95fce9ef6645301555ed2bab99d7e3f1169ee2a91e0e64b0cfc88a83fdae838f7d88c354e15681395c87e52af2a7a7c852cc45aaf6777533a505cfccf3c0c5fc15c151e44f3f47a99a54f20a19959caf089ec2537a38f8e0a683f7764e4daa0fbe2b10586eb0acf6596bec50d75867bad6b5497585e8311430874f0863ea38a9bac6b29a54e0543f03f1e4c977e5e381f779d5f2e41e388aa3aa52e87ac58fc75042f024959121563920171cfb8ae05a0800d0a28e93aaab12a64a1700d8ef446069e0025b80f4a052faf95e00f226d0b4a6f5ef54edef02e06d0b496702e8d0910022290634ad5f844f014debdf2ab5bf1bc19343735a2d4faafde5a149c53ffd63d7dd217f7f8ec1f2679c545d6b902cd00c8278be2268342912e134d5d504e4ef46f0180a18e44daa5ed2b5655981a9fd7d6487e6d4d83754593353b1ac6a7f57f2878b39257b4e7d24781c062ce14bf35d7d6776886535d6b08a2695fce18265c5b23292565d091e97010ac0db9106d5f51f9ff65d81e05704953f53df951c9a7413a73882558aa3acee7c29789d545b40fe7152e97c4578530230a14d38814ff084bc9d616a3fefd0a4da9ffef96587be2bf9d3df3ca37e575620fff85dd5fe8e67e6aa49cfb1040c186ac4972f32287cd7777cd7414f8b8e9432e92e3dc7777d9b316e8c0d47ba4b0e463d4f0b3fc1b902721d3dcfa3e4cf3e51cf97a785a32c178b725568d7baf13acfb94daaee04af3e2c9ee7320b9b2add6557f3b9bbfbac52e33519c751a92bb300f9b74f5ab9a785fba62b7d7a950b9d76bb3b5abeeb2ed6cb77dd65bfb78573eac929b9dfa6f102adb86dd25de67c89cdd1a5bbdcaa7ee678e01520bff45d9f724bdd9758a4cbbc294fcbb8dfadeffa16b4a3d33c3bdccddc9d474a7f39f3914137ceeadf7593d5490f043d97ebb56270532f983fa9fb7d0587ab52f73be6755f8e4d0d087a71e3c95c372f8f757060b170cee935d98e275f6e95e128adeabec402641e4955f77bd6e331071dc8f7e4f37695e1e873be8ff2e777329cd5eb7edbcbb0eb36c3916bc781e7614fd781e7e1c82b1ca03bf4c4cf6845cfc36f0599264d0e6fd3a4d9e694524a39e79452ce2dcce1815e80fcd3ddc519763e5e107f01f27b5d7cf0010820d0dc9d26bfa3f1ece8c8726238b097eb06b4a9f966cdc3820880200b0c0cc9df07e59014bf59782ccd35cc6d6e73cab748361fa172687611953ffd1ef26c51177959b6b7483e81dd4e5d38cefeaf762b999777ab1983d47d9cba329cb5c3b13b975740fefe8cf6e5f3c8c383797878ad56abd5fdadce2a79ac54dd91ebd5cb67df36357881e67c76aaf2999919062c738bce9d7fe57e7b0f4d994cfef47733a4c99f7e991c32a17ffafbbf1476aa14839ad6cf5a63b96b76aadcf721af7f7a360538ca6acb2111faa7bf694c689d7bf3e82fbdae946cd9060a4d9081f2d2250837b80c600a299498220656f0e8dce8d51d7554135ac89f0b5daa56abf95034ceeae653b75f39c4230495346590d00283a9221d75dbaa70b245dda6c805dccaebb2aed4122e606fa98243617984d15d55fef250ad55e5370fc92b7e8387baef9775e1f2cfc843cb3f2d19963e325546b73ee36b4a1590b93ab47d2c709508a709bb96ee6da11cd33ffd5eabe6033df093a2ac7275e3eeeefaeefa2efd399fe2785bd8edeee0a9bb63a74af92098e3b17607ad72777055d29773776c3bfcf7ca435e20fe2d9c5559e5fb0ad1974fd75ba1f972687b49af24fd8c5c945b9ad6cfc1014a33acaf6aa1312dd4fa7e69d5422eb6585f39ea2def991ddac02a3b9607b6108f3f5759a57c2a87b69c33c4a815c99f379f919caadbf7790d823657bca4bc9e70ed3a722f205e515e4480b0d76724c734addd5f86239b01e5134919ce7729ad9ad6b2aa69fdaecf486e59a0fede021ce555edefb6b4505745de6087a8bcda1d5bbbbb327653b57fc76e8b6ab33ffd72cbee586923d3503924aff6e78c77c4eb5a2cca7d35527c4d71e227771711ddfa8cdd14db80c5a8fddc16cac475e414beca22b765816a00abfa87bc7ff8b700476e4b6dabca6de16d59d34db1986ebb8dfce7affb86de4292fb8e86740559e75323ae27ad5aec8f523e4be96ef305e4f75d2abdfd561c3f70354a2c207fa8e45075bf3fa3fd76f7ada37c1c2c7865f37acdca2dadda3dca64b316029f433a058e146ca1910e6d5c832d24c5fe513e6d5a8760d39a3d1972f590b5407481f8e553af87c096adda519cfbd11d070b766ed16bda6ebf237fe49edb9e7b0ec26d2c5289e5084b17fd9dd1fcfdfed17b7f58d3fa3d6c1009d8fd596c096a34414192e7f6ddbff3b96fff514956b9a74b9ad67ecac9c095455f92d54d0ce2ef4bb21a44bed7348e7b49c7bdfce6ede78f4db3f615c871a20cb36e62902952b19554e138407efe52b0a98ba6ee839d444c95e6953536deb4fea1dba6b10805e47e8602fa6744e766b3cf2df3331a9079653b3a33733333bfac6a8f7294d2ed6a7681f63f2d6ca2c821d68f5c1529517ef4a8baa3cb9fbd85359515b6ace44f15192239825fc917b19e0b39294f68075559610b4d9fd0baaabcd10df49a6cce2d046be71e5b013214f0a6ee70535c95da4f39a9dacf45f5102745fef4d327fd4cde41852d34fdd3ad2b0e0e70b489aafd63ebaaf6db00d142a352540bf5d042dbf7db3cf18d4ed5515e49a92daba4b7855fe5a0b66ddba270f19a315b8d55eddf6aaa1e5043257fba73d2b4eea26a17d54175fbed3ef37315203f91e4d07f432569556734e4a22d7c55a2f63a28f9d33fa354f6b69690a8646a982b23350b428866466620000009331640302820120cc7237a202af20314800f70944e545026164623a118c86118c4400cc430c6108008300419641c6264360180381b45eca1e095fc8927e9af412af5625bc53816059fcb725559bcc2904e5bfaa2521c68ba2ae94bcfe067ee4c820f64d6d1e31607446acd0360794df23572b5192353a9bdf30af7540f389a1034250cf8a4f37e499709eb22cb633536f009c042ff6c043cb0128201b571d654b8e3b53a6da8a97cbcd4fe16d8fa21277cc899819a8220285a2f6bde2b48cb3bcd3d07c9a2e9b56ec09bb28cec8af1144acc58d42c7511c68e8840e9fa1f8672baeab351cee973fa0daf2ac9f0a22eb95010ea73e7f0f776e9d09174d6a25af5c6aa9bfeaca2b229f84e07952ebbd9fe5fc86774144aed8f9601d3232c267bc27241eb81278fd9a6dec4c4881f0f65b19c17c1b71d67279970f44341f8c44c75356a308b64da7b7107369d8254a5307f038f4644cc8cccc78240bfa1ca9fa2a3995b1eb8db5796567aa1db1b1b177ddce219e9b1db3af69f5d39a6f29dc5f6bb0d8f915a149a1f48099719e5518fea284fd4dd46da67ff14cca4527b9b8de8eb56b95fb549143de744d3a3a9dced50cc0e6a5c12b250a60202e0bb0059a5574f94f2c09eadf4fc84f587209a04798b73acb72bc0d18b4bf72609883b7df704933e17b92659ec2a27744d610c3f32bf7803c2b57e4419d8110e4b54b62c5ae94d2183ae48780e8a7058b19fad4d3f3f1bb25eddb585a216d63c4a8986bd2d45b3b7248a95a9e98f06e3e1bccbe3eb21d32489c1e6369fabeb6b4a5c8a1349cf075224af9c30965a7693c33f60ec98a7c19302715205782fdd39fd10131f907198bb2d5ea04822a77284f0a44d9126531a7f8303cfe53700e7f32fc18bcbc4e9459436a4014b4ca9b28fbf5ea3a15775ffe6036a99e5f01725653daf90fad96838bd5278739b7c501230868f995edc7d02c28a2db5c3846460c8e34f444c9df8ad25d5410152968805347e1bd35681758d86400e499d76e639b3def4bd214207c16ca9cb5f06e933bf0c66d10e261c6ebc4d9ce10dba04f069e39ce03c1f89c5eb159d841b8c896c91cb59d801b65f7e357a40f59aa823c9168732d0f11d22e52ac712873a88d512189c786227d82623a4882ca18aeb26fbc8861fb4a566c9cb05c8801188092e0fe102578817d2135988c39f185e8905d25428739851dea35e3647830d7d4300cb735692a19536c123f317bde7d9a9342b1db66067329961b9baa018b24683f0679faeaeaad7e49a1c4b574dd52b9f331a8a6aa11d0bcfc0c742779fa0e3856680e83d414fb9cf1064174ccb440e1fdb007f0e0ed0c22d8dcc99c5ada785c44db35dc4f728d4728e636f2dd7d1673471a3df16f0bd22cab55b19d86f0b15188a76dbd282a2c45b8f463b441361429d21a0acb44339e5f0270ace1c48a1d266b36303b853a015f4bc4b48f5a911a4b932c26b427220c25834fe5c7418f64b525f7a3cd126373c2bf7612ced6724563a3814851cc8b23a88067b19ec6f0b15088a766df982a6c45a8b861d441361a2ae21a0acb4433972f8270a8e1c4a516967b36203b829f035b4bc4aa0f2a911d2ba32c26b822a2d91a148ab5af4ab43b2f2924b43d4fea27ab2af230f0b516c546af8a82695a5762470ab2327eba4aa23934e28e6753119bdd163c48798009be4ef9c1b02a958fa0568df8a5ded06b3ef43b01c958e9e3b2d9fd1839d71eea3edc967318a70495102e4e2ca0728cc73f968ff71ccb05bb60dc3e9f4306a1bbc746218d0a89d8010b369ad34a01108de190dadfa2b246a74bdac52257579fa3ab6226c24c7f29e1be69926bacd4ef4ac41e9650f5e7db45077d0b1062f4d64e0701407e77316ae8204841c144232327a5283d5f8c530b66bb5c10cbedac3b656090db0cf2a2b9491165347a60f1921cbc7b9a362560a7f7ea989835e202ed4c49c55838d38d41ebeaa7d1fb08188f11783a8af1a2d757028c20b89804c7b5a908d815534ed131ce9a2d2583a9af1b2531ee54360da9ab04b9f0467047986c57d4e00f8920a68ac4483a4b48c09c9b89410004fd9537061f007da58568e4fae0ae9a905a74e1a14ac284bbc71297f165ae1ee4bc170d96381bb4df59922fbe735450b6d867dfed1cfd9c7c63cded7f6f548aab414cbe5ccfc5753b36499f2990b8f1a164dc30f9ac8a315da00bdaf3f368ee762aa520cc7ee549f8d05fbfbdc1fa5ae1ecbe6c1e36e69bd8d1ecbf283e21f55521f6fc3ef11fefa4b2dbbe0c3c805bbc5070272be5672f971c6e08754884aff3f8c7c233080add570b2d0040969f6d2759b3b52802925d5da40750ae04ee6868eb477626fa9e2e8e38ae58eb938d2a6c12a61a4b872f949d299f141710f1a62a2cb1d5ecacb20b0aaf6f91c002b4de1b54b612e9359d1025af0c9810ce56da523fbcedb9eb630a55d99b8140c89731929c6fd753a597dbb16665504d755eca86c10114bd0c9281d2b2d57b9380a54251c311659b3c67d2416313857cf5f44de444518435b3c868206a82c977146984a589541269d1ad9743098fa89fbf9474e65699161bf046b6549d2b3a81c4b5f7351341b11d85a8107767c7ba3c9a06745c5b2d1c127faad728c85b818e3028bc82c8a76eefe5c60788703d1eb89123789ed993242e179cd6637ed35c94f47dfc1532ee25e0e5e5fe8e9bafb7242662fe96a8d8c1a6f1d84d14f2d252261df16e8dec0d9f53b73cb05a29da9e9aa7a647cde4f4fd8de515d1fb902a6a4dff0cc8c749259ee159e18402a60c62a01e8e6a11ab7917b861be113f0c222f1ec1e9317a4af5aa73db23cfb9c13e0d1739bfc310842806e78d5a1a5c1dc05017a33f18633fb359a285d0c5cc8690ebb43740d6bd30398198053a8660515309afe0deeeb366f8b503b2095d171a01ce9e066049b0003d188a11837ed1a60995cd8ba78a63172b28938fd081bb27b002647c2c5e9250802923d06e5c6a832728dd32002a754418cd43f173d13e326748244b9c0e1faeb2634fd44f010bb37d18d24fd5af921e9e463b8aa8e64627fd177430a43cad526942f1854b95af0b8da812b9b3b2eaa91e5363980c0daeb24149fb015f79a6a7c448de466a45ecbaad48a420a745053b124ca5722e70c778e781c1b540e3b3e796fdffd66de3fe8d753e07a1c7feb52d1869e8c1bab1379cdaeae7f180dc2140d8cc78cf0b989534953edc20ed92801aea59a0f07b80a781e27ce79512e525354d539e9d3079a113dc1e05ad35c0807528d1b2a17a65d15d57b2141b257efe4e68256a73e19b01e01453aaaafc8741a183f329cb87302907a9115780ef0644331548b1046a44057d991d6786c7e3a5313c22bc3e47ba06784133f85819bcf6b3630cd54e82ca8105c869b85db87e7a8f71325ce83d465deda927f78491fc6b1ffec50774f0a252817de5ec20b0d224293511ec751ff6347a01b6619bcde9cf7072657e9c0a38f4139adf428ae9e6bad76e0d583307a2f09aa4b5a087baeb2b699240bf1d3c23858a289c833c26ebc9f38d5731bb61fb75f5a14db69b6f99f5aa6749ae2006575743eb8744fbbf0badf62a5f856593427d1069ea4cce7dd1da167f6c89be17b62b935f0e039dc3eb60854d55042857867560968430fbb36f9932ded93f55bd6fd00e1f8573d8af6206469e2ceb4fdc5d47ca3bc7148daf847249aca6281dd7836fd01ab902e92c48c2206fc888e38fea2f8a95086ad6251eb478e5ad058049f94df0651752dd004452055a29cd3ae3cb2f93216b7d08d212f48ce09911397ec07a782e8c8b58ced4c152422b548c1e49c24300b21b0ccf8854e7f703991496f2785af6ac06d0185d198be88cf0cfd9d732da93d0cb6ea7c06a802dd9d889fb80c7466f9c5d8c9a547a149b9d6a2cdd209237c6052be0ca715b8170d8a28137282ac72f2148b7219de1fee3e28ac7d5ad8e0516e3f72a659a313e963d3efe59d409908426b8b0cf40fda5b37f369dadc7b8f4ff59bce7672f6bcb86b85b5174245a8ec60ca2a74ead222f52914906d90d870860c56ef368841c5ae0cab5f273c8767486b83603c251d92a03818ab08c6edfb9e5ccab1c22ccafbe953ae988b6e01d7a884ac92f6ecc426eab2b49f3280848fe9ae1b7b4e251c8379e908ec38ca5c1fdaefa00d1eeea6396c5fc51aa042d9ceb1268b77264cba71dab64eb47b19661128b81396f502acff0107781bbe263cc4015e83a7c395c14d5cbe680f63ea480c2c2e95cce656fa519cbd5711196f8be522385843f173a8d18224bb4b8c2de45775f156ab0a88fb73730034361bed4103fde435dd46c26b4282495fcc7c1a7c06e52a1c25593d79d6980c07ddfb981d8795edde21f958e98d450e2174b4c3801bd924d7852cbb586307076a29ee268645526170709c52c54d0ea7094733c8d1078961afdb8deb8f8bacd10ef7f49de2feb74c7e8dd6073936c75fac95a2c5da108059e8a0c5b20ad4e827149e74b0938231b270ce9899971077c075940c6ae5788400c17d56333aa20b5eeef6f9c0823e40b10056b19e0ff0f45784450ebd25bc1361f6e0fa76d39521cc18e3a4dd60e6d1b24ea59c13b5845b4d52dc0aa9be62f2abffc1d05d150193a98559c6d2904e2377a22b9ce6db42da50682640e2e213050f1a371d0f2dd95d5c5bb4aa610d811a898b6001696d0914b425d32d49e8a4d9ec62feb6d89a05adf3c643bf1b94740253f45dd57909a5db71b5390e75d5ee9f6570dbe21fbcd147977701871f0a080f611784a6db6764f66a2b00332ea173362a70289cfceebfa4be6dbd6def6e4eb919831227997bd8ba44f370acdc5e53f951dfd30ec46f7f830983e6537d7cd6b0ecd77941c30c103a57995859b97d6b310b082ecee9e858038078230b4800b83635ce98205df8ea5286d037f6f896b2c7699e69c81a104f07d31189c4f5b8d6305d1d8d4ba72b9959115709ea7f80a8acbde05cfe052984ebf90ea17c507920b146185ca82c5abab68a4a880092a332a79017b1b5450b453df9cc4550620f91e6872994fd781cd84d2425107b7f6b234fad59419e9c008192a42c73ab145a271a1c86435c1511805eedb9b4f34f12612c2a6ae18b59e7ea26dc076c1e3b504ea8b568ba4ade91cf7aa9c147c458bb06432c507d8e41d3ee25ecff9b07b9554caea4624fb87a8543470d72ac2c079c0235007a6ad0a22725aadbb8406bff6ffdc46246ce62d51455c5455084f10c5a4e442b2687a2ba673b03bdf1c41a823c9d210f4bf09e16bc7582ce6524a18006f4d9c3dc355c9904d7a77c2716c6a7df9d1fe15db3cf84275cda6923b50842332ad8213a6d718a65b877d99744b3df423c1f630092d32fb0be69a21eabcd5e483bb449ad189cf79d04dc8133c14d5d219575ac5aa14e1d5ab773871e16358782aa63d9cf024195c96c096d66f710880670e016e19c049d16f4f29053361dbd5f26ca281e360742f572685ee3cac9f8e14f76c7f2fb16b6b90bbeb1bc6a48c88e675f15bec917bc5092a1b4d01eea0b63328017051c511681152258e737e20424b53dda9b0012e28e2edb7767fa9de29bb74acec2253d22d19eb8cbb1eb536c1512e04ff1f05948baab44adfd0fc7ee72b8f52837500d67da737223a92c63484a4e5e4e1e1812a78f9d5bf055ebfb400d5161f26e60ac81955ac0c6c21d0a4cf6d31088d1b9738099b08459e8bba7212c02e8fdcec6b499320b82474050f463cec74560327e4ef59b7507563af859eb2062c7236b8cf42af8c1bce7f16e709a3e42d6234352dfd9b6f5f58d3a9fb171bdbb8427ce81cc5a1774d3d7a01fdf068f8c5f713d411b08e2adf2185f4032966f600d91969f0f400a4c450fc240966f42ac9bc2b101970b74bd6e868019219e3d6a90c66dc888f2d1e08b9b1188ce385a312ee0916644e1dd1fb39ab78a8960866744a56aa108691b33214dd8e5cec4dda4824d14cfc6dc987d3eac4898e1c251efabb1fa19d812d926be5bec1c786ce65bb875a80e0525753b99733cf25f57134287593c1095e31610dc4cd22459d77c278a457e23083494ae318c1499d3127707d0daeaa890a7d174f0e57e80f20dca951cebbe1f6c0e823b2ac2541e1e232a33e45ecbbae8c82b10a3d761ea2dd1f12e32f8b534922d83172d945b0376ce32f705525c706ce70281fc8f8d72d5b449edf2fea405db0b7417802bf60c8483fa171fdefdf01fbca21d2edf811a7f689e012396f801724eb44e1d8348edc27eee4b514a00a92fd03f69ff1763d00a0d4a8afdcfce92a60916c8dbbaef0d3b6118da2554092cb52b130fe190dc1d539dff7e8817a4b21657571d78be7a785ee2b4e72b077a78a1ec9259625b732783869770e20627d4c0362ff78113a5815eaf6ae0b1aced869183cb18c49af3c1a15b1d3cc5b0c69ced2de7611fe46ecf5476214536820d60c6879f5f67331b4158f82ee72f812c079a22d9c65502927dc23db45f3d4b9da6de2bea9afa1d594b7fffa151aeded3e2106c675c1f029887835d68aa9cc7c0df29dc36d367b4abf810455a5077863a4ec9611ca25034fa41dc30fb8397d69a7700938d84e0f9e1a811492a562da33eef51c57430c7a855dbcb03d39b8dbb1372977bbd81bb6aafaff4b03376def93e011d7f3fd1bb1f5d36e9c872bdae50ba71a9115fb7f252a342d2059b4ab063e265a7f80f1a98b872822775c5d2d165c4b960782fdfac4bf18c7f12066f3f9b0b94854f1fe73295894f8ff60d8e5e2c664be2668f6e5ca9fbdbcef7eb915eccb65bc5a69dc3cb2f0289c3e12de7a555322570e81a5b1f35d79fb9c766443181a97565264025f073d77f26fce32232bd3b5c83f75e67270df5c0d43b2e9a4ad097e09a4ae2668913ee45271edc88655485ae68a2d459f7dcb9646f56b0c4858a4bb16202b6a28ca524c550648a33562000aef2fc91cd434af1712a1ec49876d2682c78e9bbbb77f9976876d2a056588db66dc8cad052c74d2aad45dfedda9aaa93e784978bcdf2eb43f3d15183ca07d6dc26369433a426b1b2f1058f94fd380094ccd05e590e03632e951499ea96fdf31b381eea5f8802a4afb4f2ff288a587e904f3a29f71a736386d0a64b2bec0b8fb19af88027a6ba0ee85bc3eb623a03229ee15bf2b5a05618bed9bbd6152cf17de95a01b0697bcb573d742a2a9f6e9e357618fc610ba2a2074aa27aad105df74a1c29018674107d440a82acc9927307a578a16d7d59d67bed095d4c51f297324cacdf4c2ba5c9b440385bb7fd5bbcd476a119360072d761dfc13d5e604ad0c63ddc805810ca0a20350c21144d804e9f39db5ace41957378ed07bc83d810c56fe88538e88aa19c4c10df334cfffab03b85aa08e2b6ee386af05db79ee353a02262c7feb3f615bd69e51c9a696eda6333d64c556ad6344e0231805e0daebbc1a104ff3227c2c19cb83c2090c221746bc8bf41f19f84b99040ee6a04c893ac1103f59a310423036a5d5e687b02d453c28dca2c82425f9d41e83afdd45e2c52e5ae78968fab23667ea9a164445cea43b64bd100b2fcae7d1c719d45426c209476e313672b2b03f7a1143bee9ea64682ccc1494f0a01f2e55e225e76278467f153252a21c080a45855984a8548b56e3eea584c354d84fafad84b9c4c49209bcbd3273402b1e963d2af5214a656054aead00c3ec28c3472cb2f04f1d065d44d91ee38388809254093df84ca418e839308feeb9acbe6aadcbf80c8335c8af92e7b90ada61088355efa7db2f1cd261a2bed36a4e524a6efe11895e10dc39caf7f3a5c4a0012fc234b44c62976c9daf7f8c209d378c60d8e7b2e0474be19834f8c5f418bb0e72454a0b41d8812fe8899ebf88de834ffa8132123e065623a3f99fbb3b26b7a3efa4d6475dde6574db7ef4e3d3cb2f491f10de0555b8213f09ee324e8189b2f5044614583d49881075d9cb1792a4afd8876d872b13a9f7228cc389ce7e9032b03e1886827261ac406a0de551082e90303c7749b5873a9c0abf77024b5d3487da49e4955fd5b0e782d3cfc61bdf88541f7c092e7f907fafac62fecd2a1aeabe5d78d7cd9796b659b1cf14a6791255b603fc5681170dd29ef18420b281f7c4b6324cf6b6154064d44ddf7b217d94f1acd7f62a1581a9e25a8b8a628738fd78900ffe3b68256f2c6e2ccfb4076f7812f9f3cfc41c30f46d4c876060e2ba14fd9288998f916f7d0c6fd8f91361082baa49c4d2a20a5cb4a2b2f90f228b544292d97687e08143b0aeb3b65112f95f6aa2976eea94747960711be3a703640c257473117607c8122252c810e13ed09f6f123f09aba11f6b4b4366eb4efc04f22ec7db3b17cfa10667ecb18b205f724410fe59fb7e1022a43a6e148e3c8e1c1af5b96e8a4e1229449c636c9bcb944570189951c612b97d7da672c26c4a5d55bf227f589e7e034ec213c7955394ffd7b155e0a0ba79ac0596f87eb77292c5ff4b7b93729140b968381a6b3aa82c39b70d21109f320d9376545a781517cdaf425d0ffacbcd82f2c9257af26425a2efc8903e3789f24cc5728db570b5dbea9aedf2cd19e644bd680347e4647b7513b2ff5d26629800d9d7fd8349f4657c661ff856633734b9021e9aed6ac68429127fd7ec819dd8fb44a1b265795c0b49f24e88a9f5b75aa20fb37f849db1f38c7edce0954a6c07927411ad901078277b15f29c89a916ee3fa5538d684f183909f09b7989a215dd11514c8d5582ab953b9351785465b3b849abb4f6ea3394c86e2bdf3760a9e3a2982114e6981d4b4e73295a4a6e1bf050e1c46819d603bb209bcaf344392d62869cba1e7fac8511e634dc616e0cebd49432e5b45ce2680cefc6de7d4546bf49e9ce8744b60e50fef3c42086a10b5fd97b6e3b4a98b2e1655961947c6ecca1f95977695a274442b198c785659e85b0e13d9c609a105b37f0c55515f2ae221d43803450a10be23b0f533d3195ba8147ad1f03a89a6e2af491acd815319a6d444309870044c8fb3901da061f80959f1c5d006ecb5172f17d31a79512c430a28048d0d9abfd7b13c22dec166c19602859fdacc515bf2783e7cc8252a7b605b17b986a0f7f791d5dd7f2a817148777ab44a698cdcb083297385342319280109e8a8900a026c91bbb80b0bffc3b73ec4b17ece12e50f44fa4e6269f02893ac633db65a004ec2ad0a311cbaf3ec4e7f9fde2a493745a75771e3c849418360f9300851097b6d2edef534e07ae478e7e6b42d0c560c1036b9ac855fe71e8baa1578cf4da4b5b8bddc6b97f685cbd2761366449ac16dbaa4c61cad8ef9c4778f2022858e49d9bd5b465b6f656ec283a364b75195f2afaf3d109b2210758f22835e347d1c633e8e03572f230bd912c4857e8e62623bcd82d038c2d63ab45dd163b3a42f85ddac08604489040801106b1e629a0cf5776e0e7f96230ee16d34b8bf332b2cba988c8099e3a1fa2b5fda77853925543d7a306bbfa262977616ff1ff12172f9ca0cd260d05db3d3fbadeca1b1bef3076df4cb72cd9af42f5de8cd2823501595d58d5d36ebde10afc5115ad7c7cf3db9fe89b10dd3de5439f91f41681cfc0b129cec510edd6f03b3efc3420c10778ea8aa997ca39b2074d806251cd7b83050ddb1881e36b606607e9cfaa64b3d5b373fcd9d8fdc20fbc781a409f4907e035003b0c82707d4338c752a1b91b3f18057453edac8cf199085ad937030c9809d12995e2d530a60d7ec7ea5fe98615c90571e1de8c09b2256b2efeee6abaf60d4a438ea6c42764e6a924214e3a9e79a61ebf68fa8c6cec85f15251e2c1be537f2fd5f5b7ef582d8cfcd475df5eba709fb7f0ca4324e62d2d0008aff0d258c339f5c72939573cac01821330d07b0b9b0be8e429b6afb01e044701f9d53a8c0d43d6ba8e591bda0201429761ca347acff0399e042620e84ddcc8879767890c608218fd1f977c8621e3702edcc474f7bb8c023d197accaa02fd2af80b6d4d6d846db85e2df5eb5ec81826d9d0c33d48596672d4de00eed76e039df1fcdd67b65f699633727615ad719b39e9b769bc45a07f9ead0750c5171dff7d601ee05cfff7542b268ec27e2b4150da6d67743a55099d46b1ae99c163b1129d88bf294632636394139cb34238af412d1c5df0245f6e8bd2e383ff9d487b53ecb210f9bef468732d28ea067d1ba346595fb1d43bf92392321b0baadb2f23c9e365542d15cb12a6bc2347b1566dd2822d607617174048ab7091d62995777ebf4cc3c144ee81555e980d0d9f5e58f03251208f7e62dc88725009425ad51d24fe5ba5b4097267ba8dc921695c1ead522b4048f844c0d873890cf1228f935e958fda65b2954d3c0422f7f88ba70fda89a38900bacc07ebe289a75656beb4be40606152209106775f9985085e1eaf2d73d15f7169666789df40435f243b8f6a0d91f07386787b577b72997cdcc052e9610da51cceb343fe74bc1e3fbf44ea41adaed572d0a84640c1a4b6b42680346fcb70308e54000d5a6c90bdd1f546b792790d33f86f1b0e45e2624f0fade9eb349af0b367e6497388373722bbd523d556aefd7467ca786da5e7d6edc74f0a2fdfd46e981c484edb0b7e47bdd86848d5274fd2405a30f12f150b35f09e28cb7bb334217a56d6fa89d15df9f816a07f58ac8e0f2a207ba26a70fa6b09c70058414e73469ecbc90017597657f1c9dea0ad14022c766dffff4396dbb6576cdd932fe57cd88b69d4ee4797e50c895bc216f446b6e5a629eb021f48358d83f39b8a14e985c6fc313a4f2e801767fb8cbc5bf5b68b84af4eac81cfd988c604e6cf0c5796683716e2028c7cd27a47bf3f758aa5a3de1fa7a603c7387ea0b72f081c8309ed3a8f8c7f4c482644c2d1a99a40376c9e1d1ba1f260b06138d7bbc79c744e237de699f2587bbf4d87fa6ad18954efe5ea9b93fbc48a1ba1940bbea00091bb07059cbb9c61b97295b6a0a57101afa87895cd7a0aab2b3c1677e55142f83eae920538266c2a8f80b13943b20304d52d1c34b44d6e0af1ca6672779b521b469d2f18a564d94cace60818508a348d45e2a076368c89ec0b3d0ba45bf3c424f952244d94881b7f0db7a39c9737b5f9370ccb9e7632ff79dc7d7d6eb021003c281e116341060a4025a0bc590630a7a2859dd6550e0936830142f3676863ac09f34eac5e0285b7d1d9f240abd248cd2398fc1800f06f928bc8729bba81aba3d2f62ccc3468dd207e43a5c8faf5ef382e1b93f9db7b61f5087b66e93fc67a4b7cc6ebb485934020c9e9e667744d80144c78e62e47e9f091da519d5103015319b5f94dbbe95906a306a71c2435f0a230e10a725b5963b805c2decb285efd0b32732458083ecf4ab9f7d528a53810dd14a9ce84bb4958c989bf317c751ccf3857cc23e416970cb2424b2412b80d32a67be09475a8e4619a817736fea25473f709f59e4b32b43b35333a8e241b8beffb95ee8197eb6f414345b0e3520f0254e58a6138f841a22e2156d463188ceacc1afd35a36b7e9866517403e6a23b45db4d41f213e02c4fdee13e0a3abc38d2315e8d1200fcf1f03313164ecd036647819674c31f6624dfc85d11d80b8af4951f9f68d144caac28faf97fa2d2c21f06f93f540cc3579f29e91fcd563bd2e4e5d7c784286de5207b97827fa023942b625b213cc4ea59a175d789faf1a401249c53ba5030df88eb92477e4409b04b113491bb3a5aaae346684f074fab67f20e9778106eaa19fd9849d56616230e5b2ceec70f5620e913d0edab5fc166427ab9ad43041950e0e334c38e29dc95638485030e4055a9e6c8086cbb90a806a7ac19454ab9149c3fd377b23561205ca390ad38f42d21d8a08dc36a5a0dbf657c9ed49bed7a6196d70a01d1808da5212eb746c25e77f8c388a2e3207ac81fd59fe3506c02c7c5d846dcae9c1b637bfa559fc883b0fa095fa60b5cb22837b63c1e4438dabca0fe6aaaee6ce69cd1a505fbae4d737a3ae0e00636924a918d351bcb493cba23629c7a20ca2f53cf1f2447f6968bf9ac662dd749892074f74e8b2121d9020fdd5ecce3212f7b8f38f1b090e00a2aa2548e70f6aca6643dda8fc1bfa13f3b46cfb34f76456a151523aad8107090c5e28c943cad75e80d0eeb27d4e98c0f60d3477a92b83bfd716281e1bb4d2982f2fcb82b5f0001afe734f6723b890d642178a3ad08f3bfbca70ac789fe024f54e872e17827c5014c2bf781a3cf2b8a2810ba159248fc7cf26e999a7835f356c4a93981cd6e15cd9f79f6d014fa6e3a0ae4b4f043f5b44b043b484c169489f2dd2767a77b2e1915ac084296c900e695e98b774322659e692fd43147a5fc8be75a16352ad240fbdb08a680c6cf42ee016ede041f67dba5f2797010e0962db3464cd722a1145e22c05b0168722a92da98337e224bf4f1d64360363d65560a572b4b1e5c9ca42b824651fd8687dd3c881aa184789ab56259dfe03e78d8ba75c64637c652ce375a1864a6edc14dddf5b6a60f2a53d9a648ae7723723aaa47c89aa2330807d082a9b3246684ac3979a92f6aeed893441be27777adae5a2b310ea4f85ecb88e7529b814ef73aa5b5ad8ec668e19846df1af292f86627ff883c9243a1d1c47d4eca472aacbe23a86822230374e0cd21a67ed29d77103c407443f53140cbcfb7cd06ca1ddd54fde1b104b97dbe7fcc1ea89031c31c8f258c3af09b5d93f11a4c4036000e95373b983b2948d8e6e0ca0fd9e9a2acb6e279faf0b182f25883ae5c46b021f651c28c683270bb87e207410ee200f94c1c98a2fc96544ac5088f4f37d0ff0136e7f553a5cb6031b44010a0b0780e4b7637423dc6ae8afd0385a2d3fd4e3826a517375ba9ff6c914a1d06038b4d96205b3fd72d52bf47b4e1ab1f7f5421d6a95b02db676fd19ee5d28855d0a3dda563a6c8284b3ddf17ba0f0f9f0860f1ffff854abe3eaa159773f990dce9e15ef942e7995f907f3549e412a6a1b6eccbae712fa3729e3c7463454d24e880835a5390ca7263984a186d4d30e1ef76c152a88f6589bde4d6f20454fd42652eceff7c43ee6649348a813211083848a621af82d2d3e12fb987a509829774984bbe0519dc74a0725e995a51bbcd009dbfe952b662dfc5f80aac0b5353443986a2f355b307e8d6d4792be1a91afc2609448e09028ca0f7034821bbc99ebd5cbde35f45664c5c9d25decf8f71587e5e6e89e3196fa604221987e5fb2a11d8ed4f5dcfb44f2943fd6132e52f4369b063f45620343b7a1ee743639d60ffb54abc82585b307adcc239ef29886695bbc0a91b927032845ab01766d003e768b204a3b2bd92e92ae49b9f8669810f5ebb3ffecc9d62381c463ec141020d3335686f1c1ddb3c2d24b54bf894b0da99ea01169fecb36365f7fe7d86ccd275e9d282fab4d8d914305a93bc0309adac476f9755de8bf1369b090f1247ab835b7cbde6c031dd2c57c201eda0d228aab80683a0487e46eb0d7c5681a6bdfbb5a18e24a4684b3680e60b80bf59b78e066f69d6f21a4c9f43322c7d01f16d24ca1aef54223f538ed818b04ec5238c2fc7f25d163c92fb094dafda6581943ff9b585dc8f47617238506a52ab8ad036b11b7a1a40657c47279d7cf39ff50a6d892b2d2b20001d42f75173b93de172d8ccf7d248ae435326ca0e67d2b977aec5211706fb1411608dc02d14bdfe961e4cd589a3ae54266c03c7860c1e3915182e7c5f348951d525e8601c62bd8126ac7fcc6d8deacb292281530386a1a1d62ed8622f63412998c578c8cee102f6d56913ede6e135876efea8a329b12dc6bd937386752a136147f846d68b50b23cef8db29f03331079f6c3b48cf86711e1d2fecd65b891128d2d244fb50dba8778428c5e0d429044c1ad884c19157aa09c1ea049c1deec6811dcbea257c776944d17e0edca581b61c82b628cd95451e5a36f011823d58065641a279118482621efe3fdd3e48d155b338b522c56fa3905e74a6483e780749d4422091e2730a5d6dea09c41c871d3bb0ed6d8988a9be898c109e002b8acd43b939f830c90150ccba212f8f1d00a99f00ccca55a65082f1923b2016e5ed396cb5d25d6d1e1b61996577fa2f6dbd0d6e2862db2a7a6de056237b02db4243dbaed7a0af5dc19b75050bc614b2d100ade5fc253848167fc3d4b073d40450f3cdd13140e94f98220a28ff5571454173a8dcc120984a000bebe00d340c17ce7ebe8e8add89511329fc5e7cfea6df37d853fff026cf0f114a0e79097e80a63ebd905fbb646076488345f00d153748045c752e73a5241abd70134d0e7f72321eb7233585abb9bbaf9aec16477575b489352f9bc8924d21ef45ef5cb7f4b825b9ae8baa150cb5ed40d2a64826f69186a357ba38a9174c5a0a9278848482e3269bca0642220296860dbc6adbd1cc3aafd039c706d01bfb0ddc8cbe368cb5c503419723e22908b181e703586cfd233d38b444c69bfc16c5e4c986174dc55692538fb493005144aef7d97492367fcf623a3d23f4fdafe64a2e7e0f16fe4c18471fe28fb91ccd4dd259925429a6c466b1f319119f8523792d0f7e5fc86e86d9f79223670601c81c73cc2168369ade2f71d211551457a528c81dbc9209d765e5448904a45de86ddc2ede5e623292517aa64656526528b7eaa96986c69c041c830870a11bb7b2f7bad5237b91248febee9314edb10b7e3e7f97751d66027d8642fa3e0669a9a636945c614009f84bed362100354063c0300c92a0ad49d35611b4224123ae29dd6d705abbd65c0a412ba12123ff3a4c59340409a8e02d4412300d998226859c30c2c06a0115f041ff8755453d2861583ff7f17e499f438768f74df3c4b20bae24e557e8cf872572301f028f82c7aea98d6e0a98a541c469dfe8061a78922d6fffe1adf093dd583700586e6f6099dc1a01d3b51764348a996111068e69795413e1acb8effe92dd3f9c81b6d0a4ad7dd829e84ba20fe3352b2bd0c9f2e976d1ba0a0a41d4e919ec9a826b5228f5486937254452240a02343471db59d656aaa9092977ab10ee5825e873c11e0e85d5ff2d6cef6c594b650ca05ea861942196acc1e64c1a9a57913f73d73aa260740ab1878af5e949e7d79e18c416a5c25123bee3b7436bd8fce14284fc2f75b29e8be0129e7ee24148f8730ea7ce955b814667d9e4b067c8255e11b3e99e4d050377311b56a6e0cb2505973fcf9c42fa60f64c61215423a4745bda23f06e8e81f9d5b50c4cac38772b7c75097f8f10b2c4e7d02dffa5d6a9dd7d9859e80a72a2055c50cebea48cb131be5d45779a50dedc230b170cf09da3561426fbf5d5efcd83f1abd2e43faf85cbea6ded7b977132d3c5da7f63cac6ad9fbdec24a9a7407b4ed11a0213c244584e67ecca9d0d6cd5bab19eeac95874b493bbec72c640ae53b4c3340832137d8b343823a0c4407eb1bfaae1f4c734a5ed2a96cd2cab110ec3858b1ae34e62b4c680c6df26252bf10c88d34db4dd7ee2cbe818b1116a5db367922cca8393f15c355d8a809c937309980e3e3859e765ffd0f067019823764ac496541302ca424b86a01db24cd44bccd36299c2f980cfacb70f9d889bba537974ded280ee3bcd9b122cd416df1087744254fb77e6bc277725792374bd327dd214ff11724a07bdc1af18d50addb6cf91ddc84ff05f93b68325d2c096a4ae4c6a0682d76d34e9e38dec94971e3397ffa5139dbe117a03650ed6e28a591f5dbf3c56202ed8603d3fec713801f12bdcac0c14726f75c67daea9af598da2263554c8174e454a0ec2ed2e02c11e80c47cfd1c7e96a01bd180cb3cca01de058c9c23c263bd81cdec15b332bcb086a436c963cea3358e930f2f4cb9d2f2798102b5267adc5f52eec9d0b520b07002069be6e369d6c46cf9a08caed4e25f91237bbfebc0519d896b2b85ef363f19bd6f4eb67539248e962841d481111663ff4ea37e9d3e2b068fdd1c04466d60c9c049ab67c5b88e507b4a6140b31c44c2ad300094e60368fe3f15dfad680cbb8a9b8a4341fb4c1ecd380713f70e1687e96ff53ffcddbf31ced7718ab17db7c95e2918b78bdd25c7ab9596d955b70745896607f4f3e657557515250339c7ca6e2606115b725f4a69430d654609397e5b770e2231fb74c652ec0faddd4070ad9108f71d2bc687738bae438ead6f51ee75874b02f157da5f9abf95c21cfdffd9eab1347d002ef316c1f675e5f32ecd5cc6c3cc3b9217b5e3c69ae91e402167d904436b96709aaefe7127552f8a5bb8341c8517b4ab5835beb175db2760ca9243156df5391a640f57a03d5074506c98647a22673872d7d1bf23b53e8b08d1aab173ce2d99e1c1b534331ed46eae780fdab4ad2cf9013ff420e291bc90394883b9e2d847ed7a262ae03dfc14d7b3b24487cd3402a307f91a4afa32e9dc2783c38a97383753c4f5b020203008b4dfade6355f3f7ceeacdeac855948eb776a357858262bcd3749bfebae9abfcc37f5dcdb83d3295fcfe33c0ab88d9848878439eeea4dd09121a5112c77c7f5343c74be94b041db7be6766703b44d64783604911b40870a9ca4e2197daf021df03ecb1e14f0a730c8eaf2974dd7dfde4c02e81f4ce9f3b5246fd6b5e9252fbd1ecb99994d64c1f0245cc65fdd09b6de60f603e70b003490e523ed034d5472e10b2acd6582731080d755e79b3e73c5c1dbeefb5d76a0b35b6d13f0608724ec088e8a4d2cdee36df0cc9db9a67841367d42c9328ab783984705b3d04a81378366c0c962a9c676c7b67bc35370028a4412db7042077c2b3c859dbb55c26d3859e8ad1ea7ff0bc7e093ab258cc2d6e725c3aa3f00cefddc1595f752674ca4573a070e3e833ac362216d85a1302f55bcd499c1b519866e9b33633f957df578660094964a828ed40513f459e52907236a942801305b4bb46ab5d7cd3e879e13108521385883feda5764ea4813b5680633fbcad7829f3bdca6399e634644da70a05d33055014cd7590538d761e38ec5f99730c9019364679afac5dad1e60ebb540e8c09e718919d36d4df647085f2fa0b269400c55b165597594032fb16b2e576bf63619016d6147c55d5989fb3c16d28d4c574c75c918b093f9ce9611500f208fd50a0baeb254ea3c8563ce198986fe6aa606ed62ec2668ad211774114b8894d86c42b212136c437d3db933df357ded62b002fba300d69459f41a17364b3551632259e5b85e481904462de20e5b62291841948f989ad895108d10ac96aa119954416cd0222aae922a6b652f2418e6773bbb030f5e918deb68aeba471fcb8105238623842aa98b4c6a20127fd5366efb62a39daf373d8d527500db6ebd60d808b3c70b2fe6e2fe4bcd80593464e89aa43462753e9b4957a14ef249a1532accf949ef1cd5be12e44c1453f6a7bc21640be6d4e9db27ec0fd46f031a4bdba356209e15a703695cda02fa82305b44d0b332a943de4c57cb6ce5209ac25680dc63e6d2569c26a9969b35002c7e1da0694245780f78129d6b7e8dc0585af7e144eca8444c4af00cf238b3e2a7256defb626f7de32252903f709020a1e0a6013d3a503f072312e365d9c13ba30a62be5a751005e94ebd96fcacfa35c5c6cbab858ca8f4b0f1a48af87694ed034cd0e9175f3ce7a5ee722111b40e9a3738f43debc3f1fa3d855f9221a229188f4fa19021a9a1340ad8996bdb44334df687f3e462f437e6708ba65419f15c0dbc99e5d76b2b883f4eea5ed190e053d7b2723c1e48683d69f4e21873c38649b836f9676a845edf5d7a326756fde79d7d5538d890294bf390b87ec31ac22d92b33b237260c3d7b3dc6b04ade481bf939489bb03b7c2efcced959baaeebc2ef62be93f9ce635ccdb8fc68bad653b992218829f62c9e5d64af0c109e3d646f8c0e9e9dda1bdae0d9397b3d06cf2b902678f66629ed75791361d8c11878250cd62b4aaf843df768eb599d19dac86de5ac0b29a18b2f97a5f5ec1d83b1df7c13d92b5fe45d27f29077a14ab90da07c910fd1945c941fb261b1cf0879c8e347130263ef45f1ec77c66b53009be0603f44f3cdb5d20dc03b7be20eb46edec5cf0707f3117ae9d4af1785a671d282aead09784d3dae37f5f4a03f7b220cdfd9f3ec334d4117c8e166bdc9d212492d8ce9dc53e4d2a528c485ea90766f6ad9bbeb954f7d0241051172918bec90908dcf75d31a9f7a1ccaf85d1392fc054dbb324fa7df98a737bc3e2ff8944ea7344698ed824cbce69b77f2230294bf6d533a27c51652e448d17a36fd36650610038030e5f534e396fe865ebae45c4afe6284d944a0843068e1630c6f067edb2ef5cda68beddb65a266c96bf7e5e390e9edb363e2cdaa55f95f8d30407fe95789fb32db0c5de4016cf6c99399468d20b088f643a4b74fe93188ca2b3f9fab145e99fc9ede9fbf1a39c56eaa91532935720aac9153f2d6fcd55c7a2792214532ba7a6b26dd4c4eb77ba20989ec45f2229f35fec42c060080d40d5d86977ce49d0cbf3ee3a7dfd24fbfa19fd369af4c277b5d9e7319f6ba7ca0afd01457b1269b62634ca1d892b531a6487664a36745950892a792887c3a2b7f341c14bff9ac975fec9afdc89ca0f0e724020510ee2f929a97b24794483fb591e371256b1a8b014ad734ae611127d209f29d879cc695c8bb520d24896aec947f74ed441d0c43d1a9addce62e3f243a57998889ecd3316a9a04a526656bde334a39a7a52060f0a5bdedd363d3f6d93e645a1a466fc6d9dd54ce969c051543e3b63935bf3db539a78cdafcd98618b718639c73c6186344c2dcb8397b72536eb6264173f9c379a6ea23fefc742cc2684ea37ddb34f91cb745ffe0c41d34678db9cadf498fb3b7e635cdb7fe79f6cdf9e6a7ebd4993e67378c7b9ea05fb471dad539bdd33d3eaf9d9d9d9d9d9d1d276266a1cc63272099c691e18062b25950b7fa66676767676767c70919191919a01d19de388777b8c7e7f50373b95c2e97cbb5b3b3b3b3b3b3e3449cc5599cc519e7ecb4269b05718b6f18875d2e97cbe572b9646c6767676767674716c42d7b7c5e3f30201973b95c2e97cb2563322663322663322663b2877e106d8137271c7785397287c53097cbe572b95c41aee75e312b6616ca3c76028a37be18c63086318c610c63587c318cf6aa29089e4eee61d8324c839be75e4556f42e8646fddaf1c423c51718ac5341e08c7af4d9d12a592deb950d8fe7a2cfd9bb09ab9e2022c778926fcede5c883b60007c2d441e46cedeb05e713d9de2b843a8b99e67873d77ecab9e87eaf65b0d3040cf372779b77d3424cff34e7a24cff6175bed261c86aac6f5f87ca8ceff6a7fc121006ecf44fdde46b2dd64e327d56e1261a48fea1345c0e7c24b6f2d441cb6ff3a512582a4f59ed5e92cc78d3617d5cd762cc2480fd5f89df45ac61deb94f4066275b3f6e69c73f2b75837e9d80e37378d33431757e028f6ed9386bd354fc3b99f5ee1e031e7ce56af7a67e2f40ac6a34f57af6ef0e81deb550e8fdeb25e851ebd67bde2e1d13ba8573b3c5e992df6f2363c2c2e1e3da657385cf3e8a75eddf0e8ce2af718e30e28df5cc61d52bef964550ddfec6582bbb2baa36ae3a8319d92da8bdfa8363c361c04cee2b1bec5bc56ef6c54cbe279a88afaeef3509506aaceb0a4d383409ec9047aa82ae3bb9287aa2b281eaaaad4b0222f3895e2a1aae93b9387aa293d3eaf1f1e23222b070aca4e8e1b3cef46c5435594195d270212c5443251a984831c4d01de8e898050b5f4a00c0fe766a767e4330341916809a7da6bd4f6e1d09b412f1055c1ef4ea4cf51452fd18f08d6a91387d3a92d886b71381a996ad4e029c00b76333c541d3d0e55e423c35bab3638dcb47276463d239f6d569ac5be0f87daaf96da3eb3f573a2e1a1eab7e2ed3754ce0553399c518f4fa7da79eca85bd04e37c977be77443ede26bd469d02e5a1aaf72c55a725478ddd5251b57b96aad3e22ed5f52a2d386ad78acd3c8f76353c540da12a4555ee6bb0b878bebd566d78745822485aafc33516dfbc86772c7ee3fb115fa66e54ed73d491ab53ed611de574aafd46b5f18013ad56abc5bae1394c32200ebb2e47dd82588776ad6eb34eb5b314e0dd66ef281c383aebb9549614bfedf3ed38aa28a853ed5e45320edb6f5451ac8a8062bd8a3cca893b6ca2d8b773084077a7d4c5857a6571179a2387163f9a1a953eaaceefaaa7d566bd68955936aa8ee6b6fa36eb95084804d43c624fe3dd4a1b5efc286561b1f1d16cd659ea8bb37c342fa91b9eba612b7dafd56dd4f8b6c68f9fb5acee06cb78638ebc56d76a64b5bc702a7543ead081c373a92c8eaaf1bb2e7e2ef6d6bc8ba350bed5bb81a0df9cd63b6f5ee47c03a25cb64b65715a6b38eaa3a981aa3b5a7c478b45326f583c2cde49af46a51f3f169b0355452fbf1e21971e2bf599a651d967d4dbb9befd546f28a35e5fa937e6efa6526f8ca95ed1ecdb53ea0d51ea1dd5eb60bd94542fd7faf6d156afa8c9b77bf58a9c7c7b579f98a27a4d7f45409c479f517e349c8ee6fce9dc384bb34838188b675656f4f88d621f6d20d16a18c9acd990c89a131259c334c717383f6950a2f1c69ca4d463ea99000961f00cd3e7a1c615656d88b2aa804eb6018c33ba8ee4813ee4afc0434307c0004d51506ef3b4c931c2b0e5d66c9653e2107d86b5982dd2de368e0b79d0d0301412893a1a230f1f1ca214a40991449df7bdbcd0443fa9010cd15289db4adaec12974a25094e4a3566cbf2cc92794a9f779aa46c8d9d432111d72ea6f3bc8feb057db0a7893c11897406f0c62e7e70b80577b4c89c148c302a80b7878fde799e9c11a6f3989979cee9fde43abd0f5c824f9e348d68684a2812858e6ecd8f21c700af177d1443ba351f238cb671f40b7da26ef6c772c4c919ae2e72d7915620a5162c994e0f8a1e0ef6446e383324cc9c7c90cc743a6d36e866a4537a92654b709a36209b2e31a404e5e6c9c290d5a04d9b4a624033d98f0f904fc80b8d4228a199ecc707c8473277cfb985b8a96d1bc7512a0a7d21100ca5844e2119a11baae862189c93ce4423b98b8fce71304abb510bbac9cc2c995932cb2337370864efa0ca4a9abbbbdb4632745d94520cb90690d7d053e34d3adb8052ca34ac01bc9452d12846185a82ae23c999ce5d8802227f888d09022f7dd9f302f0462026cf4824a144049cb8d1c9f3f098c821b5377ef1ec9ddc86689bc468084094528ef94b65422dca8174a259b16ddb36a715dddd564c59ebd9e70f5675d36d52ef3533d31ef290bdb23ac1612814aa457c1480436e16910e05874582b0aa9f524a435da3748a9cbd0bd22bc99a5108121c6e4e38c1210779620681c16011a60a397b017e84a24c13a71f32e547335d56393d073a3dca9e03c8aae638ceb72a39ce27c771939373cec96d9393b14792678fd6ac87e15f50b6344f0b73b6c44665a8d325647e74e0f39383255a8c60c9eff8a8051538dfa3070ed96594538b2167ef7ef44ab23a6e9b104138e41f4bb08afd89f93f9a52106c5025d303ab28a53e2b5764fa9032866a366abe7d34d5e350d32c8501f8c4fc0b7660af24cba3a2a747c54c13e14c21197b04c6b08a411004e32c54852eaec09077b36af24d9c027293648bacf8450b96660052bb61c1a7fc66d3f6583c9bc76f8821d2d99d79098e1837e366a42e485e908048b0d6730b17440a0337e3669c1352186400c1e5c68514e3669c13194070b9910104ce0bae0917e38038a42d971bda3a01c8c97000d11627c311d3b4c88989410378e3ebe6bebce732279691170306c9494ac440e1490e39244a0249a41a72b0f2ce1539601539a95ecec959a29dbe7ccb9b9c1b65f1b5d23a260719cd5eea356739ce2773fcc2e299d3678806f0d2ef9c2984a317736a73c7fbcb39cf3b39371c52c1320911c04b993265da39a2d02cb6386979d212f4cc1ea8a20a49bae2b91d8b676f528fb4ec812ab624323dfc808111c3aa6d234950daab39f528ccfeb60fabe22b0a4bfa270840bdc5e63754c29ba1af715825bf2439ac1a39149f93ac685459c621c79c8338eca0f86c9057e51772c6a10c8a31254bdaa77d56edc3dddbe61b18edc3213313c02b6f3c79c32a2aa48b55343bac42498fafc924cfecedd32b2562ece013f07a7f39f64d2ac7389449ef64d07f01f4976dd895e895bc61199bfc9575f64a9680de308a44d6682db202472905b8e04221ce43d44321ca51808b6deb4e43b756610c496600afcc4808608ce7d7a444a7d8edddc235809f7f4870c8af2850f1f1c9c7d7135adfb127bf1e3ce647a37d4ad8d8e779fc683aaf86fcab7cc35470c822f76aa7cdd377f5cabc0ccb9007abb4f77825339b3967ce2239b17834cdb59aefa4473203c8d3413140998f46b31e131e6bb48fe6c67b6e3ddf682f2d7b7fe3cc895a8453dc1a090164bf9199d9bb2535aa832ebe5c098b404828d9b92247e2709ca422ca969849b412d34a9f297d9ea54fa734242e4a52f157a2648edcb98243f6697afe68e4eb08e08db24b9148420956c9672a5ba2378fdbb4573e2a887ee9fdd25e140fd4cc6360fe908fa6ed0c875ca79c524a4df319a79cd15e275e1b327378761ea3184c27e411c04bb780c94e0812e73b92e7a17a5f3e34996b91df23df1d18a0fce963fa0c7773cd893af6a4a83951f85e9c2c4f4d4fa94fea9155380f7627b217a4fff2d465125c102ecf858ed8a9cd800b2ea650b5482fd2ab53dc05f0b6ccbe652623870423fdb84cf1ec5ccd935e97f47a66e23205cb56b927dcb01361d85d5aa4178989cf1b7054e1b52e8097b4f3a41d0ebba5ede5809cb03c91966f79e92e2f2d8d309f0f16d20d3b355e5a122cc2b06b2800493e1cb25f1d829e9d0423f9a85a4490b47a1cfa8bbcfbd2cf2f38a24eed0d025140424e725288faa5af753ec3db672ff89b67e3f692cdb43f27e38f66669626d8ee511adaec13f243a1a83df5f8f9a04e048831c618e3a94505f19bb54b70d85ef39a0567c415139c6a6f5fa257339d6a97360078f2ed37159d7cfbadef7e3a510aca52e490e90c87edb334adf7498e043013bd1ee531baaeeb4c1e6ca35050aed97a46d1c597abf504e914a701bcd26606de184382c66ddfbcdb6a900f80353fb78a0262af5452f31ca37af4732e9570c8ae840d873c6f9ebf2298a5b55ce08db12042906095dca28cd3a28298d2d6fc0ca380486f6f7b6b3ec6a79507879c06f0f2f87e1ea419a55a4bbaf8e7b59e6e2d055d54894e50fc76e4b7cd769c0740f9dd49af0920a594f6e945268e73caab90732e5f1fa2b6019246ce6e9c6f1cd73d46ccc78060c8bb9e5e24b2b79d7a472bd80150bee41996df9cf2bb7a1faa43dae7956fa23e79c539a531cfd5174eb166bd8d6e967218a37553d175d16fe7b705caf7e8a4af044b7ec6c7570960df69de5751403e1ff9c8de917f5ef3dd68e49c8f4695ff63ea5e6deff8ab3ee28f46f663fe7c7cce869f4ef937fe6cc8137d3dbe1a9ff253f75e7e3d6afc4ee47df5fa883f8489cd3fe7fcb34d7c349b8b3e1ace451f0d751f22efeced9cba7c424618ea45e6c708439dab433ae7bce7e5cbef220a17c0984518391f3ffea8b3a82036e79c73fad1704ef9934e443ef3c7cf0773a8c6f7eaadf910bf57e5181faa1749141f6a7d8826d4f9acf1bb4a44febc485ebaa8829b362906e8b38d12879a4f6e6220800b203e3033c5cc112e8040c205089a68356126034db89971820b0960a0091a78820b308908448c31c618bb79f6ecd9b3af29b20fba18638c31c618e5133a965272dc41d7dd8b438e4994524a29a59cd3b54dd35ee636a7895f9c46dbb4b96ddbb6ad01044fdc130cf0f2882fce932b00a5735f112156ec94b4d463e1509b736a939e3c11382713de34c94e21ca6d5a37bbebba8e65248d6ecdf3a5dcddddb23b8a46f748d75b84454fba18638c315aa0ebba686f6c220618bd8bd5e330f2f8e8cca3238d30d1a54c032131258f72e0c4e81e38e4c4006ff4e2a3cf6893e050f2a8fdebd1df5626c244cfe1c64f8b92f6bec8d869a01387d22d4a49278e64c2f450bd3d7cc8635c4dbf007889e237f5b2be9cf1529246a697ce79ec95c9c64ea1d8d8a9dbc36fde95aa7cef558cd1a3db1bf2eba5135849a34a39dcfcab1e879b7b15e470f3ae9a38dc5c546fcd8b5c6b5aef8cdf9ca5eca1e76c75b2e6434eeb353d05bbcfafe7f90579207924f9ed97d27ed5abd43def64eddcabd7ebce450e829d873ab0b39245f5d2274a23cfbf4e4af9a5d1e7795554e383f589911341d27ad03d567dde3949e49e77a18fa693528e6a8c305ff56a8c385c295fa435cba851df7cbefc7ad0506dae464d33b1787af6b7bdda95f876ea92ae38ae6e556a4048245d33598a814edaf53af1ed52457df390cfda691f4d68d210b51e8753ab2ca32d32235356b1cf1a2a7905244e49bfa6edd9b5e79eace2f901f089b98da4f6d14c4eca8e3bc452e9c4e22fddbdb09cb6a9b107d28ef36ee863e9a5dfd2c7192ffdce780979c4c89892f2451fcdfc64dbc8aa18a227b8a2e65b2e59a2c4f52445b4aef4083865a01cae5081062e2ad0c0b5c516f2e5dc1c0781f2356d8b59a24994458055b429c7711cc7c9980ac4147b14318c6886982536288057e2449c5e510a82a793e3bc382e28e7853383cd665f90cdda66e6c9ca00fb64b0d917727e46813383cd66b399f78528669dac9403f076305919609f0cf67ab92e3db1e5c5c5680c6396e22cb5bc6e1746490a013dc3aae87ddb21ec9ba380018caf157cf1db109bf392e79ceb95ff11117d3a6f16d51e593df0aca8f6f9252d80fe17dc3e66e10127c42c7ad083f822ed90189bdf1ab658a2795784ab1cc781af3953faf1f44af378c3b682551c054f4e70e85d7bf1e3accce1100a0e398e611c07fa0537eb0457a12003c815b150ac38d629cd6957f2ee9e52fc82f6966ce4b0b3310eb5bf1c23d94b9f4bb1177c0ec5ded3cb9d4e69ceb18c55b19f5e316c732cc00bd23002c8691efb905f9e495984d15ceef44afe744a73cd5e5ab29782f682e0cf49f36f07e0f4cbb308f49c4be7193be120567dae79b7da86559e6bde37ac1ab9e68dd38d6afb57dbb7d855da71d68382434df3191e2501457e69ab5792a5b9bc915474de858038ac89dcd75bf39cb4e150bbe916875a0ef7c40cd51b6a4eeb955dbcc6b52805c1d389b3dd7acd9d682858155ff327802f9a1dd224e94de18a152479d2c797eb051f51bac88ab375a2f747d3563a47db9a0ce0164bdad6b4a823246bba644d7b84c788c8e20092d884655bb109eb8820cc320d39c801ec77c084073e1f5f39f8e2a583264f59155f3c50f2a567ef48ed5d9b78f24cc4262f2db76d82086ebdb44db4450521dbc6266f9b884d5e36f959173bd9de35fe74ea3a37ce0a9d7815b293ae244bfa895721971e39e459593834712875369f75726a7a7f349af4fe7a70c719ee4a03229135cc44e8a490361c83e67a303735682f68e7507249e0bcd3c7c88aac927e5f2e8f1e38d52eab0c873e442fb33da1328631217a3abd740fc32e44c166cdca74aa725a8053c6aa1b67ff05ab6e0c7a277a35bd1d0a8f0b3f3f2fe8489d824e41a780468e0ac02ba251030c7007c4d9e9544b9bdda4f36622e23ac4ac4d9a11053d7e5cd7d97da0df669262efb6cdbb28254a6ce4f1f3367e91a86b3dbb2848347b76aae45b11018980508056ba601dd8b99a02301412752211e7f193ddf3128b97de499426285c959674e3d51150a75aa399ec5be124b8026390e340e7c0100d8568884234b46d73d421ba89b650a8c9b37728324ff61c7be4a178e1f1ebda4f779e7db472c5b3772b3ecd44e48508e8056e23b96d1e0d795d0518fa36bb22e547b3d205870c45cf879e842a131c6c0588c315180d18700b56603460404774ba9c060c3caf53008e7c86a318d463f7674488e5d9118c04e05d81a10081b509271ab57338310605456e7baeea90a424b99e475de0dc3cfb3792915a200a10b52318872c4c4440222f443114a05e919c7d04430122d9110c4502f08a4e5b57ee6945c941f92a4af579f6de793d3b0aecd963cf08c66404237d343aa218378f3a37ce12f90cc7b803ed2cca0e4b11c08b32823d8b8050be8f66b32840a3908f3e1a142f38642ee45c65a26728310e190588c31558846101784730a0671fc558755760cfb02e4640ace29c7de405ab2e139cb3afc0e20e91566ede043d7bf77d74f434722492c9e1a0a2d31c6c02d8c559327188921e933084d9b3a3a4edc13f3d268108b16f0f79b02abe70acf8e848448057b427be5000bb91498ccdc441c1ec6f84d94c9ef84a81093ece0a640a9c0a448a9c0a440a25aae8d14156451c1f3d3a0ec9837c913cb04726fc6529fd803754f9a84514aa7869afccc7d0df901fc8145670183f8b1e6ce14371d61ee83a525711639c72d3a28cdac6e27e3a9922c79730746739c518230e4069afd7557415336e48a6d309043d4aa547c1d97a09437796e81df3b6d90876d36c1b7b008c1ebb0af076108bfbcb93696a5a5701ca22e3008cf6769398e649df6441a404b94edbb82adbeb1380d2fb03c2fdcece47bf8d45732e7f7baec5f406c439b93c27fccd2fb7c35b17eb601dd016dc0ff73323730e0267693ea3a19f9c9d9ece85c5ebc0ded5e7398ee3e689eb397f36e3007c6256ed2f173493fd748a9d72b11e6e09a798f379025e520ee77305e75b0eab3625acea1d566dcdfd8055803bddce737739cf5c8c31c618638ced5cec947c9784c32fc8666fc7b81f8dc361d7f39d3b5e68a11cafe5774f386452d08f664938747515e0a57f3b978bf3b41a59a11a595ce57eda742e2c5c1cb22b0875d1ef388fabbd6953fed436c93537ba17f818617a5c70baf8721b274a58dca11461a64fe7c16bf5aa8675c18f37e675fd63f842a4c74e697c65ec279f7efa953030c24c376d0194b0e91268ba8c4def9b29653f65d04f6efde49b9f8cf3935d3f39e727fbfce4d74ffef9c93020d94f0efae9dd6928205bfb6651736a8da355a17bc26bfde6f1e5ced9b777c1de5663174900c2cdc724fcc027f631093e3adf3d7107698608d3de5a84a0c907e02312d0e0e43bcedb2a7f280d726e31e4ed32885bbdf2bcfde58c55ecd2d3e82724baa43ddfb75fdfde3d5487f3f821d1282122fffcb3473c2b631625e44867a5ccca1a560d6b863bed3b621a215921941091d31a96b7f9f6091139b547a88b6cec94947dfb95b3cf08c9e23c7e454856c89e3a357d86c34e4def668feca06f8f5ec342098947fa25a38c71b25ea136a71e59ed72d62bd46683883ce491d53d325425ad1cdf7c7ba90ba07ff7318b0e78e0a735b10b7cfecaa06fbfa19c459876d316c0eee9150a4c054d5aac8eacf67eb54f59af980d4b705aad562b0ad60f90c8091bc0d8a2c5ba1d6b59cf3aa815637fbb67a405149680d362dde9fabe33e7fb095d4081498b75e7ce771376f062ddd9e3f3f3ed77027d3bf705d1c918658f88c8311e054473d62ceaf42ca52d40ffdb3de0c72c3aa082d74a40a470c261fc97760edb5d00ce6a2a03c8af56ebb90bb01cb4e6eca30d245ccde411163a3ebe54f0f3a325e0f8f83a4114be2b82ccf1f1a58218bcf7f165021efc057dcea40c3025c6887ae972099b4fc984138b0a722468e2f1f1a582333cf8f1658219fc057df24ca4448233e4daa6692faca273e2e0205603d0eb220920c8640d38e0f9eb63c041ce5fd07b808311fcf52f80dec7170ea2f80b7ac8ce79fac9c38697adc821758fdeab49edc9042e017c7156cdf9821e7f197d7cf19481270c7f3d86d344d0c55eb147a79207f943089290c3fa01278b19ab638f2b4a081ff1c1e6c5625bc3ea2277c7d0e8d6e0400523b45848584ee074aa4277b3ec9b9beee64905cfdb3617962c5f72374f22984cddcd1d86a75357a1bbbbbbbb793a77b3bc024bdebab58d35d9dddddd2fddfcc2967bc6599c6926939461186551c6c138d86cd6b18e9d4e2f2f55b8b9d17ae841d380888991dabc993772462691c915a413e9e40a2d5b3e11e68cd3355d11280231b7b6fd9c45b61ed289b8cc28b4ec8d8bf4cb1ed289c8313429a920935d210c6362a6262b7d13ff80a483a4cee65d8bf4d374108b479bb6887c7905cf939be4298017d4bc33f10f4864583cd2d9411dee6964583c5bfbfcb6a8205a93b20a52fe8812e8227b5f7bfc2a1120da48c7debd79bbd4ba393f9ae64fb35302fde814fb4f90e9db83b85cae76cf3baffe400199be391428209bcfcd4a1b2b5b4248d7c72e7b2416d287552367974b58c5bd98c81fb9c591903d225bac621f55e9239930cd36b59095d44a1b8905874ba4e9bf7aa515cf118852103c9ddcc3302686fe6095e7ec42046195fc1eafc7ebf1ba598881091e2c0b3178e16f7bf13c6933d04d8c55977718c6aa988518963c3b77c1aab88513feb217cf5cfce526bcc3aaf862c115ac922378f66e4a669ed327f5aed3ca245553c221d350e9db6bdc217ef7ac53ce61d87eddc74b10a26f1b824800b72779fc689ee896aef894f6477379a72f2d797b4f972e915f8675121808eb55645116e8f1e3598461ef9c1e35012f6fc1ce5bd020a6454d8f8fe2d44a170fc02b5dec2875c691d35288763746d36ae7602535cfdab5daf957675b1a8632f115d32eb2211b8067bfbc922e4e314af3c8434cc481bd2df5f62f809beb704e5dfb82103db5ee2fbce26c642dc43cb756c1d216a0ff07b8f8b657ee3cb35ce93a71c87e9a69d3fea09b1e5f2e2ae7a564e24e264ccf795567736a86219f73ae79ccc47f4eaffccfe3f70d69ff2ccbe7afbd73a2c8730fe15c3e13cfe43edfce9b173f203139ea0d8f29c2618c16c0f61b3e8f1cf586c7c8e722a2dfc04133f26e547b07a0fc06238c1744e7239ff5c8741cdec51ec0f892c1cdc7079d468d20b048ffc8de9a1f79c982258f1f8d4e0ef776f12ea28801c6970c5c3f7217efdad3e611c091b7388a778b4ba7496892110cbc29b2ede30edb374aaf74782a65c6a17432026dce00de58903405a8c353507ce42e2e2ec156af8e48960e8b6af1c8d2e13a2ad829e92526a03fe963165244e16dd4000374f1167f79217d3f8658f191cff04b953fbf2046ee6251418cdcc55dec90154b471e676984726971930dab4c1ca25c6c0f7e97919b707a65d3aaf8caf9913fe3a59b6e4c2e53925594c22cbe6400f4d253825c5a461588144a5cacba602b09ab62135ebafc68804c61454b82ad0f89d0532ebf23449eb2d3a753327ef6a084e0f094a7ec91d9d329e938bc86d53c003980c3c3b9d3524b61451d71e38647567f3dfa372e40ea7ab9922de962557c95e08b974e93b02a3e4dc2e18866040190c5e571015eeada3e9a91e3a891d5dfe2339c8455232b9dba585572e99dcb17a58a1ab9fc91e7a8a891a539acd20cc014179b22e350fa04028862238723d98c30231b39747be77b386a648d2287a0bdde7bae0516623fe3a31658987dd073fe790c64dfde8d8a3a22fa117a2487b742ce811c1e8b88ac90779af701e19cfd468dae7d4544cfe137ea05e48f3cc547a451c94b5eb2773ee81d38c31e87a0530e41975fc947357e6455c9820e5aefa60a5006dd893039bd92aceab60a1074fe8a08b1e84ea7a48faa7c9ad3abc8920ed6ea3645465de0055bd773b546557efc7cccf75c11a608a0e77a49da99fd7402c829b294598a13ef73cda5cb8f08ce3f1b390c87606f1bf309a18e3a223a0ec76139303d7a64cd3447568e1a59b65e2aa35eeaf3d24973e7a5d77aa98d7a414e67f38e93a6daceb50767f2192ec25ee8d95b84dfe46d43223e22a49b9cab139cb3abc8545c3a17e1577193153aba08adb8d105151c4a2a7698b64851c1aabb05abd8aed8ec30e930fdb0eaeaa43cbc61d5d5c981c3aaab73c3f90787b75d69a9c0587575a6b35db94991fd70e9295f0071e9293303b8f4142741b8f494a017979ef2c4864b37b5ac4b37d954976e72b1ea06c07db8745312565d00788f1c565d1a5f712961d52d80af24e150ee20e00a237a8ac022888f2f7171e9a6578b4b37314171e92620565d9613c0a59bbc60d59df177e9a618102eddd4e407976e9211e1d24d5f1cc0a59b6643b8749313215cba29a8e4d24d4fc016c966e462d5edc17d48c2aabb83f390330025322e5d65875577c5a5ab5cc1aa2bc3a5abf4b0ea9e5cba0a16acba335cba8a0fab6e0dff5cbaca12565d16f75cbaca8b5517a5c2845597860a10abaeca572e5dc50b56dd1c5c0797ae1263d5c5c1635cba4a13565d18bfc1a5afe0f4eac86409c0a5abc8546afc2e7e2af6d6bc8adbfaf2006fa99e84936a8901def5ab463824dc860374d8f002e870f7a1c3fed0014447c986bd3fdceaf0a1a3002d0ed0e1f5013676b8f7d8414363007baddb08a2d2ecd841e3363cd6de1edc0fa7b146a80f7b69a80e1f3ddceab0f6be78d561abdbf0fcb0574787fbd841a3c30bb083a6006ec3d3c35eeb0678b1b77a106ec301ee2d3b76b4bcecb0b1e3c586dbf0b8bd3a3bbcc5013b1ce0a3c78bffb0e140dca501e10fd7c509608dd0d0860701a11161c943177b11e02de10f46941a103a4a122e296bc37309e06f8dd05b7220806871972028ef405823209802c26d785aec2580a358235c0b4a110e84354211602f10340c42006f095b5aec7547095b50dc86a7087b75420f920222f41fac1110881f5abc08b717c583b84b03de5e02b811a99293ac119a7a92a75c52f603363c6ec343007b7552fe0d28a59cd40002bc3b025cdc08076bdfb0363c57c895711fac117ac387d277007b1b24f97043c6de0478c91a016fc81c005c00e9868f1800e6b0363c9788cb03f561087b490e5a239e10231f78b0d7071f000f6ec343b257084e880fc01aa109b07700f4c6104238e90689646fc94737ec076c784823b7e11162afce0d1fc21a010760afcb5823e00064dc8647087b493e44c9de910be1e00288f003e4f081e638c0e7a51c608e12e8363c44d8ab93c30fb0001f72380f0bf08107b7e1f9ec2d3911f6827e00f778cc1bac114a85acbc9e5f1fb1b246c0a900219f35c2bdbd9ff774ae46b8d741c2c3616d786e02ae0e1e638dd0558c378379a583bd2b8fb146401c3ab4bd27ee089f316f7005582374ce3879cf6e9ecd6ec37384bd3ad36370dc307d068e981bdc86e7646ffb897d867bd608f73a3c642480be0e8e15c52164c565e0b057867bd688f7f603363c9fe7363c09b05707870be1b1b257e7c659385c076b04fc0fd8f0ac74701b9e157b3f5f9161afe7327ca611604411418838c01042046100203f7cd400788f0a00a7a93878012a8c13a0b2bece4896001c888a83ff5061dc87da030f75076609c007507170990ae3abaad2a1e670a45902b0363c01b02b381c4a00d8152b38941e5371b03a3cfc860ac3c3aeb83a257d47c5e13aeaf454c5e1619d9ea3e2b02bad4e49bf51a75db9e994f4975ac36d5416b715e5b5d270af35dca5b2784b45394aa5e1a55ac3c1cae2a48af251a5e15fad615566cc62559ca0ac4a100dabf28443e92a55f433ea56852896e0e44f9563c28d1576f0326aaf208a1f32fc4add4490c5ac0bffea917d7cbd8a4b15ab22638faf37d5f8312995c8c83fcfde9af7bceb95edf90c7fd507ffe8f3b65cafcbc9b4bf9bfbf66e22503c77bd4a847bce7984a34a448ef1edd922fc1ce7449a731519ab545c2a4e5482549efc4aebaed894fcaedc3c8adf152a5eaee0bc741a359e80dcfa980286184af76aca186228fd33c34b1fa5e1a593c278e9600a1b5e7a298a978e52630cafe90329b208237d86516afc528d0fd6f8a41a7f54a317bf04051070f197f6bcbc348786ad7328bda6cc3a255d646ae11c91ac14591797f0ca024e8b15aacda2751b410e2b7e34415264a525807e53642fa308c35f90e6bca44a38259de670289d55da424ee9631621e0792e8101f4bf29b2d1c72ca2f0e2d9de94a097293254ce0b1259b321a1353490748df43e045dd300941eb92eb26420289d5219a9a43d1dad6d737773b76f9123478e1ddbef89fa052f6df790bd9452dbb6c108231d5c02c8595b02bab9a04caf4a31d5b2bef44ec11e2c4141060481ecdbfe957999b8437cf9310b2954f02c787d7ce5e0c9113ebe56f0e4756438ec618643e95eb3643e01ec5b87b465e2ca484f42269e33a8e44bd675510f33a6d00c08460000007315003028140e0ac7a3b1248f036d1f14800e7f9a4c6a4a1ac7635116c3300a840c22c400030020000001323443430502809e240e7b273028cb9cfa7abafa8f94f3785a5f7f5f9ae4c797ba2f0a9ee60a11d611b88f3e380b77fa10ca33e5b894251a2eb17a3c88259c1adae6e7be465a458356b07cf87ec2535617daf6b7610201ff417363c0430d1f8a9dc8314f167feefa4bb8151f98804770a3b5012f4735bbefe1909f351f981a7aca3aa99a0c471daca85813d10a2702048d4dd2bb7d3b67e9daa4b65c3c651237bbdb19746fe966fde74ea7dc13766e9d6deeaa61aac924e3518324cbccabc37b230a35c1e98b912a63f89e2ce401f842ec44f958bb25e1a9c4ea394f81102312a6d7efeba2c288066c269e9dca8c58764a3b5535cc259d404fbbe5422a3a885f0102d360141f9b7030a79d2f1f7950d9ccf08015d6cccc02876ec8f18c26a814480566cfa5d90646e43d2f1f54f8243d2f9aee120034b0cb68c84d126750f84e801c2fb79562c031cd6009429a8f731a27c1b1b9d6f9f8b66d330205a252c488cca63e20e3885d84f7eb5c765e332358a0e4b237e93aee2505fe8a5c6c702c604c1f66ac02eab6f614d1da101d71cb98a25ac075e27410ae7959b0b6ec15bf59793188b1ea47eaa8747f8a9774083a04c6c6d0ed25d75e4039ffb110fab2f1f0ea80398104958d9ff57bbee2a01a830245a47f1bdc877a3f8f6bc9fa799f9c461688ee06ff133f33154976181e4175358147691997bec5c9630aba5954866a19e20f1124bac80f681a7ca7bd6d5e77a4c2ecd97e3eb7e6e3f72b0c9089c42390a4a9eb0c78c9eb23c2b42ecd2901d610c0acc0fa0b3f3c4cc02952760fb27a972d28609820348bd6ad7c797ebeed80237a255894e5af12e8d7529b8b4de731fa2ada1d89f9588aa68e5e22075e4ef7c1d3e113d31ecfcabab4a7f68198780f51b3801665125f5b14badce6336f84dd798ef4c14de5e1598ab35f8b09d03b519c5b7a2ab92baa0912053623ea139a714be31341956ecbf25535e83272ba138d5722e205eb28e9a5ae1c83e1275a31d35038c9b4c3b59cdf5480641a10bf11991f9059064cf7817c7ebd68d541d53e1e1fd60be2731910be8644dc47228a16947e330e7e6e9e0993d0e64436421fcb6d1773f614e8c7dd61693e32e818eea52e81bb1c38aadfc0605b5a2e29db75098bbce0f616ff1f0eff01c6762e894facefd7d58860bfd10bdad0eda62b80fd9260091489403c9f076c65d95c896efec9257afc9cc280a3f09a247c33fb99c46f70e5343c160b5f9ed4c41094bb5f0700351294b20a6331e61c23586bb6c6d810f8fc58255c5cc06e6ec2f260c5f418c3e63c9ea94a838e7316e23a5640ec898cbc2718bbe8b9b29b01afbb8af625763b0a3a8f5b0e783e8383507ec38b8c94d7fff2c50a7bad38d3011de1b5ee0454e164ae1184d257325e57b424082935ae0ef05845329f749c5e97d62c69aaa854c96affa5810d8f3f8cc640400a1bb2a7315e72233f490753dc523495ab60e7a26114fb087c63b45d69acaee1b08ba77c8d73199f037509c966a87c975c5f628c5e6acda9c5e488df01f44428108f738c3063f2910434537d3061d139af069d6770cf98b860626a53ea3a267f35a6aada4ba60b3d4e488b4c569b9ec77c03d8ac1afd38e29b731e780408eeb2e9d7771053e71e5534a06d944f261e291c64a7818b69c35fab0a8fff76a6a43a542adbf1780ab4df2e75cb67fe2b4fa28f2ac19aa259b42f93ccc665f663bf244d356ece7b0afc64921285188fe156459b65cc70c9eb565aa47d674864a6214ca41f0903efda5ce8ff2ac08d7b03c245b98d57d80913552433767388c0b090a0a64853919c06680df1cf0ad8a97956536549bed835791015801f7a6bd42a20eabfd73e721332faa617a5c732ff3b6231f3462351483c1e04e51a783d8ed7399686cba38fb4a91d21f093ae439f75ef99caa58afbc8061791376e2005b8418b6d5eaaca8ecbe2b5f5bd0fb1d1fed9c1a57e63cc2c72a03c67174d43a9860d18438f1a600c30705bf93882097fe66ced31b0d01c6133dfb52d6b4203dfa7c86d11acd54c2b80079ce99ba637de86f528cf691b5487a3e8538be9b1e0d569ffb601928a6609a16e55fe7fa918553e483cdcd6bdcb8756d53ecb35ffcc03620cab5fdfe8dd44446fd387329bb355967edfd058e0147687b755a130c461745be0d32b2a0c7a114a040947a621e18767b9bd5c6981b4a15332ed5a572594201dd962f21df160da67c2005ba51296c003430214e51cc2091a7672d976c9ffcbdfa67302cd2ea098887338c4628eaf4bd35a8633fab1d930dffc3a9957b5432f91213f778f3b8b98c7c7a59cb71e10bad2717ef5a05a18820012c7f35338cbf16e3b86bc89be8df7b93460e0b9e123189607f91214ef670aa6f9cdae21cf44d313dc9eb369fa111d7dd6b1777e7ae8dbcf36400a151b66b415ba5d12972a560e35c93c664a24eecf63bbb5f4fb7d73000c5cd3c344854c2441a8724a7777be5e1cb62d7e1cd495b8f63fff6e4882252827c697c937024d8c20a4c5100f6ea2e0933258e112349621cfae133ecdbdf5cbd406493cacb4d28ac1a6805f949f7694c88608b4e10de64fe69c3c99a323c26a4afac079df3e15066d950dbbc0ab961bb35048dbe1c7474e3b3fdf286c815202f5a34526215cf1cca73d572f5c3a810ed0409796f0d68295b893da01ae464f7757adf22a89d641eb5a18d0cad4ceec072f64b6b07d60d99e4ecfe61edf6b942fda110f7434f5e8a24081f1ad24c4bb43019e75a73ec70fb983c2ee787ae0e847316728d4d0fb1fade96a6778daa3311fea7ec84a4d265841ff1cf393742a578b0c6a8175edfb833a5136da1d32070071eda7302611b6e1e318b5b5ac5a6fa5233fc155e71bbdaefd73007a6e6ae5546c489db6f86488c8b33f7220ef218d68878c0339e4b6c092a904221938a0212c10bf821b559fb5e7bd7867e2d2cd19cef70e44ff3c6c072b16dc20100fab1019c48bacd007e0b81f5757acec2c1882759a5459bdc1f7a2e0a58974229d67ea4cd5b891deb660b43e192647e9ea3b700a5af5f1a218c4fe6c36214c8a947249480219c98dfcb5361200f4dfa8684a09e911195cd7cdf0eb190ca228ff4395e060185d707ef066909be04ad8e09cceed1f5c067338902f187d46eb7f3ec48f2fc81317912f62846e0ed3c6e13a6e696dad8b11a23c84e8057b9c669f3ea607f493a3f2b8f99649bc1ddbbb3faca517fcf293d66061ea88d8430d62ebf4716d6e5c524f7da675abf9f659fc67cbb52125e1fc41a8057e9ae460de41c895c7ab2e5f34e608c89cc2c6ef1fe23eba42a5ef9ff0bf51340d89fcc7e5174d7ac6629e9ba98727b9d090525ad8ea5dbe04c7ea255e21ec7121bcf5f92d678345b40fd1fcbf8992a14a0325ff2d7ead00b660dbd9921204d6c353e108ec8f3d6187cc8e4a07a0a7e784284777f4a34e363d0c77ad694e6064b4368503630d130aa917d56db09408f54cfa8b442898a04490a979a8d9e849bc444a4af289e6f7d3f91b958fca8b22a5f5dadd4f537973a08e101e9925135cd03561cee159f0c40cb0880ef0aea12678e62df434751e4838630d5a4735af0624417edd7ed0e2e4ba81371e77393252e9952c7c06830ee722f9bea2b87603723000dea28d0e02bd4d9d30611621e43971fd274f8ddef6f39916a9adcf277d9a3e725dc6f2280c6a74130c5fc4804616e5d78ea55abf0294fe76570cbadb890d4327dd72624ce3e21559dba363e2b72c6ba414ac3c66dba807152216b41bf4e8a07a19ab57dd6e0b62f5e9b9d9381a33e14ea797c10e04939f219b7341b2937c9732759e00ea220bacebb588fb49c2214d0c9b6e0b52ba300cc05364d131911f48d0ff35613d8384bb57ea8c98db50a4dcb1f43a1a6364725ef284bbc2aab752564c3a3ca9cd47c91ad8de805cfc3dbae548766f94a9adf8e9cb52256c6a2ce0492bbc79ecf229735668843b58ba5d28f1719b65f55f7a48eb48501fe959af661ee79b842a2c62849bc6c5c6dd0eceb0d5c9b7d9bf8e311d1614e489ce7d30745d6e06dcc4d6f64f7e0580b3ecdbf5f7bf0f28a61b5f08441917ff20b0e9c16a14a20b007ff2d7783a0eb8ffe54a1ceaac6c94dbc50d742db975a2c7dc51eef145dc4950b3f7504cbbd0f19f8fdbca4e0d818fcdd21d3e74a60dd643b86bd96a694a73b2d713062941fc4d1496934f0f83ee1ec1ef840e780b300b96e250466ac817ed2d77ab8aa6aa9c7a4f995dd4d44014a25c719db18db3439e052a5d03d70eecd11a47effafa138df44263eef0cbfde85f582dfdd6f70f152bac1286f7f55f8cccf61cf72cb123fa47af751f9a32d2c0db429e68dbe4342f40f46b0ca8c342228e44d213c3753bf7ca1c8031604c7d528456b3b06dd14f54ea31e5c0a26d7814db647ad12a0f3c4cba34e563cffd7fb3d882a7ea906cdf754e745a3a7959600ff5afa9b734f27d83842eca678ad1ec622ccdea8823c3f3176b8efb7115a05e93f0ad50fb7bbdc2e14895624dd18aaa35a7982ba641340a46115a234cfc353c2f3ab336c6dbb235179d2795823391c08c81616f4c1562273cdcc3953e44d68a3ac44324b9713975a9d9666018db023b767327221a197b372351a24effd980b2f79843c50ae1aa0a8973b25d54452f0b5e32d2c4d255be2e0826ed19e6935fd1a5f86b5873543097bf1a29f4d57cc30b8d8fc7dbf267a0ea907015b2de5e74da2d229729db0a126756aa208e4aea62a10c6002f7cb3d7ea953f9be3e910181139440cf6efa64bc77d83ef51da0956b0fa8d6a78ca2d1a881ae2ef19a1ddfa1daa0e0df668541cd1a610e1abaeefb716a6c41a5e91d1ef766b87db8d5c984873f21a4a2e3ffa1e70dc202d20c6e057413f53e0e3b165a6e8feaaa5d5959e90e19533512710b8ad009060237fdfe9ac1d18833c6433fcd360c4defd6216e0488da0d6ab156fd23c411eaba2a67c67daa8e61a82dfefc82eb6666112106d5ffc12ac5947ce14afea363a3dd18587b0fd5ad4f0864d038248e836ff29ec94eb42d1145aba7642f76effff1be747288c3bf95325e68c0d8db37e235012f0594144fed435d481c6e6071c585c515c2b7c52eafc6617b1c311d0e7e712907e0a6123b5add121b6bef703510ffc581af6cf215b6cf17e6312bed4ea02c502d4098e382062fb1e76ab251fea322a831835bca9360252b327a2d74b92ca0ce5b9e361e7b5b94f188a6c8c0db6343b938abe5ebc2393a56cde099717257df680af80bda3a3c137026753674766a877961d68df95dac7ff740e1b0e8c04d974be7a3b6bc26ba89c2e82ef09e16c943e505eaabc79f41787dae76b89e39fe537b18a2544108d30269339c5634cc1552b23bbfb9b305d2e840621c48924aff6cd9596a3f9967b038f4adbb4f56098986f5ee3c29798c1221c3d785ac70188b3469da04a8433aa4c7cde3a917406fd3fae23ada1a48f54656f79b39272e9739aedfb458deded0df9262375d4d4bd2ca67de5d0605cd3ba88ffd93dbf61acd05b80c2630fbb080770cb2f129dd642e9a0dcfe8a38d547b879454120296ca3d12c61ec35581988846555f2b083092cc13a85ced8bda97f6bcb1b7616011da6778619ae78ee017fb0c92b3a701a33043667a8e24d78e152325d1cc50141819436286990b197292fce22a26fa396c0828c486c154ed1cda8e9ae76b525161d05e0c8a00f92bb87d822e38d2b8e638966aa6288bf478cc802e84d1c0279c3284c6e2a33d93a8b5dfe980d1b17dda7bc8182d1afe2524c7736a28fedac880d3e2a8672d5e98818fdfe2dd2bbc8bcf994050363f6f2c146fb6286c408e3c7090c3d513eb82d687b8f244342ea1b1c72eb41562125eb46f73df31d05e88c8229b38743c801665012cca49255865c14aa39a95a4146e48aceac6453064e6dfd03f04cb075dd6822194c68336bea0400c1d7178157d5851ec45b2f17470978d022ff3f7a05e2e476bf494a79928509f286a1cae8876a8e454b92cae3564232877597626300cd44083a4e39b8ee40a3f388c2123f3e0db90f81f4dc16cd1d6463229b0e1cab1e10dea415a74e9d85e4c27edc97c6978eea14e94d413cf18646d82d19f878fa2578e4a83f562315e5295ed549d5cd21b4103a24b291f6d8943bff8752025c53baaf59bef097a794e50d07b8314993f8d3c8a394ff6ff45bcfdaa3855390ec23fa29a4351621a57b2936e411d0bd25ca9a137e1fcc8dbcd782f015bfa12daed274287ac03614ff1d7f2625e21c2a13b2229b2b17ef07a7ac77373999a8c66702ab970e927d7827f23569319de6813b7ce4f281ce6230b78758d8f40b1798c16b81b08b0cab9bc428b9db4e0f7ce05b4448cfda0f86ea49fcbbc64683e617115bd2a77b138e597a3a3c2112da629dea33e01577c731d4565292e9531f27afa3cd5f34ee87bde77a8d395b251f828688ba4bfee7a278ca47a3b1fa1bb0801c4edcea6cfddf3ebdb54f7f86ee04c769c3ee5a1af821220775aa1d710567eb8f5eb9bc859428be2adf4d3b15e33878db4af91a3352f1ab3deb99afcec144bd581a7421accb999e2e07a7db1d58075683b4e9c6a1df076d4a37ab5504be94a0aeb9befbc5c28506cabf43088ddcf6fe345df9b40666ad3f9d371b701e4a067160501ade5fb513119c29d91cea6233cda84a00e64419d8422f00e9ada659d2a3ca0012028a0b1da824eaf56cb4208d769a93fc346136ff6dc3515dc39f1a96be2fb81fc51c139d49f45455b0387e77c4df82c9aa60526bcab18f23209b163015d577364ce19dccc1adda7692c67f62296af3815432995fa87eae8297acba443292cec3b6693e580b5b757e3f9b905d4394183dcee753d5f33ea83128fdac645a9b5550a2412e163d88d04b326ebe7ac61d0e01a94d1bf7b5a1d0cd418cf7554031c8dbc874eca983d83735c5472c99ac4b4ce4350e6d31023666504cc97b908cf8d852ebc339b16dcc5faffdd2d1b021c4733e6a9c80f75d7f2b09990337101d522d2322da98b4686d59887d60b052ca1e01bd76ee881730fa8b012a1c239b74d71ebb8bec23225ebe3fd3adfe6f09b6f7366653003ea06fe0ab671622d4713990efc481912382a0f8c080dfa73b28b82b9b2545b8fce8ac4185c51321ebd0401a9588e6649d0b190e1601480fd6471c4b4c2e17850f72b9e81de177c2fb9058ae4c0d13f59c22c5666b485c703810e07a2b90e05b3224ee286f59bfe59fc8016a1434dda2aae7f11b364083c127c73d71f85b52fdcbf76f59796eadb974a67e81219f101c0cd734009baa7a8bbbeb39897c37648eca284f063890afa16bb556d97afe0b9f5e2b995fd2767a936a27220192684821976434a4bffc4d1cb87fbe57239a0e82579c565824f06e753233a990b2e216258af209262059a978196f54a3bcaf375b13f0455af40e410a096b020f032046cd22be7ca88337d2845e2da2389dcba5f093c8e45b5e5f54c2aa08c4766080416576d6516dc19ed8cbf4694b1905414f4a249e754530d13e96239b1716169118139b4ac9372372b17321442b7f3e007ebe031742c0d71603171e1f19f92368b1490a41addea0e659fac700a8d9d06bc8b384d576cbf1e6439e179e23ba2b45646b42181647bc455f878a66ba255a26cbc09b68680928c1ac6b6ed50e55c3a47a240efc690aa5a18b30cd5b265500a5b405095a75d626cbc742813f2d2bd9efc5f7d44c13bc4168772333d92acac92ba6e6a14c994838d5b4c01840751de368b344037c7c654a9a2b5c603028b5004f9376695ae9df52355432759bf17b7e90c478578ab33745d587dbfa7d960e234235dacc518511be34ec5a087afbde203b8da3a9d5dfcc03e3c8bc18bf36e97d182e0dd53aa1e72ae908f6ccdc3ce8f760e34a98dfb585ebffb211cf7c8ccdb3566f120caac6007e1d753cf3e0e3ae1bf11c5393997e62e9a84598363ed991a89a28c3b0709167c4b3e8395112b174d8e74cb3c7a5b7b5976791ffbb064ae1f4f68a27a30d5144f03af3fa5b41e14b080fe2090448d1c287f4d3d12f00224741df08135cdfa1e54409fb2f6bc7073dede047201bc66ac74368298a350adb1d922dfa76a0a908325a4c48c2942e838a875b55ba589cdf56a712fd2ffcf90e2ad92689dcd82bab0644db5c8e32b2350957732a37debd1431686a0789f5d3c29661c10bfc40a6ec2272787eb389b1818669b678f0cb4afa1ac610ffcb8010cc0f2b64b5f5de43aeaef0205d450e02b4bdd94cc47c6477f981d8556cfe77e12b8987572ff8fa4d698d297300231ae02a34cdd374c8d001d93db26791cedc04780540527f81b439e4491a983c6071692e7a915efa82d3175d7cb904ae4c80b3701a56ef469aaf144c33441d6b00dd61325513bb468e47d3fdf1f79718420f2850c04c0a7a8485d955e6121e57da7b5b8c9b705535309c00ce9fd0aa8a4239183e1f473b765a2b51646124863cc5a393e41b39bd6e261f66ed238c3a8adc5bbcf567fd42abe68396008ca25caf4281e7eb528910bc1292e8718722177566290cb728b5297f219486e00ae25c223d070379b1cbc31735a72a175f1040416a2e5a69537d86d1364b30b42dbe45aa2ada5804c6ff891b9a406d2ef5a622deeaa719f0e2ff1590953a4c9b246372de2d82f007e458d9c4dd1454b7f0a7bbe87bd08414f73fc20a3fa3afe71dada26bf54512093d3fa45c8a660020a8be8ae57236756c20e2bd9638ae22017dc6cc236d423e40758ccd85f87105e6e68f17fc8ee137005ca53eec5e62d1888a5d1e03ecf52c72f6128a1393ea257e816026d9eab7b8822979e6e4d3ca7d603659a90617610a974ed219bb8c071524b7187999d52ba129afb43bcf0afb5d7704001c0888d510981d8a1ac1420ae88159486c549573f956965442cb53f56612cf721f2e2e6969295400287b686832b81be48df362b3d691f0083a0255b4674b7cad2ab2e34d312d6d3322fb66e45f7275630cf85b6230e1475026331aa24118ef0877a4b5c48ca051ca6aa0df3c21f673e513d273a22cf139764db390a67969062d9ffbdea4c898010e1d84a18fbe20375a28fb086b1f90f69377741ecfb50d4cdcd2f292ba596fe5c5c113ba0e46dd4d854efa804c07e42b002e730b8486ebea45da9e4f5f4fc527afcf05cfa928ed21cf121d63076c921bd191776ec7b881037aed4a954b37beab1c32360ad18bbe2e1c11a6b000bb9590b20b6057738cfcd5eb0588204a3f4fc1d831cb550d4064b2ddfb150ee8ce95459fa3361050407008e5b3176ac43380b3754acdd8da8d8c4f474d864647367242ac13ce57724ab33bd822dffdc7607008152fddc28d405cef33ca9986df47421e3269d3a8f44a96c594df2182393c2c21c2a7a13ec388977a0e8195d39070f07afd812079f957865e361c9abb7fcee4680db27ebc2da76f7bf785a5d4b6ee17718db3e8ed6a3001edc00ab36bd96e27f1f34ce3bc21e6fa83cf4f543f2ca9519a918477a47c0cead2e6c6feb0ceeb412ba1bb32328cafe3a49becb488401c5fa6e7edc7873276948737904403f2f602dbaa8c8b847cb29cbf92e8ca105b83de761d4b5cda24cc79b89b050f7d6758cebbdb26d2050abee65872c1c44c34b81c28a7e246db610936670df3deebe3b3eb522c78f940b6eeb16d3f6bc968cc2bb0451634e901c2943ebc3163c67a81002b3d838d310e5ba881ed830afcefccf909f77825736d7a124614a7ddc0353990b88f1583aa58f2cbde201aca960e1ca1c9b8ddde932cc5bc5d051c38e5861b876ea7338343e02650e1b604b8ceee67420db0efb3ebd2daa5d916880160e577ef46df0957c66708e92de6f92bf720dbf9d0f24dee86c784cf52d829827d2fe5788e17335c9634dc5d3296bb810747b10430a6a5841d868d627662902af3cba5b85090bd0308e5708e82de033ce1b06819bda6228526ed24827cc8fb61c5b1026588ce4923ccb739906ab80cafe527c4935afe14a1398c54938c350478ea7bf41e10fb65e7549b5c2d7d58cf616dd3c7794ae103457ad3921b3edae534faf54c5fd9e6d68ddf0f3e4b41b221a8af34d08924fe3833ce88974795a2fd801d369b9db7b7ad53a2f8370ed11ce787acee7c43025faadff46c721d22836fc53a6e1d3b70cd20a30bf2a07f696ca1d798bab37bae6dd94b137d5332bf06a8e186447ba56e03987ab91b7f1750dbd911e099a4a69b42282f6d01cdbee7bd97ace855f37cb7c04eb2328421369ba2bae7936b6b72bcf5014d35ad97705f008e3bde60626f207197bf7573501c2124a451d225c8c6b077b81c5eb82076c2ae7967ad752c3d177d42d388b3d31607d86e82473ad1d78cee801a50873080652cb6bde701d7652b0a19e69809181ee6d05a41522805a843dfd3812318b1e9d5bae0369ecbec7515882f2e42043cd333d3f46aef3e4c85b4ae63ba797c891388c7bb2420b1c0200801c8a451cb06d97a3f5da7bd1fb7642da1e52805757dd168f2f588e36e20abde34e1e9fcb466895405933a73620626528d7c331da979dc7afe18af33eff5843c7afbfd0442ec3d0e5da81384de5df609f4bdf659c7f66e29646d5f148376a17d3925b55fc00f632f3184f966786848c01f38cb6e1c02fb3a9825c6c6fe171cfa031ecf3e656072da1b4680fd626fa937870c8d35138b56e6532e279f20c7abc4807f33d34a26443ccc8d9e37cb8bbd79fd599229dc5b2e450ddd45229fb408e99c2ec7aa598e53733b7bb42d281d40dfab01d20961db416cee17b9d0fa4a97bc8ec17d2e5800bcc7752c8ae8a6ef3539188a007bb6515f24946e1d2f1016489194f534e0355a0cc6f490882fdcb896c2cdaa2b719220c814406527ae1bb4af44bb98745cd0b5982ff28bb36bb5a103f873002990fa2540e922249670dc3f4a89f46dd397c62f20e2509887292095dd9324908ddc50245f3e777994d501c603f47abfda16be925a2fe4c9db91100560722bb5a9b9303befb010b72c0cc6189d7160f8abd578d508011d6c0ae87a3d19d7f13541f3e50037159bf5c8286604edf6f442ea096ec0168eb253eaf5410b39c30a2e04bb8dd4144a10762046821569055fb539f4208d0feef2192659f1734abd03277892ae29455a87cc921a836e15188e1fb8713dd24e12568449929ccb4b8608d09b3c7f6e8b1c73e1d05e59efe19c082c84d760235fd4131084cbe1f04ee4053769a0f972dfe3718e4d8464d97277a4c441b21a6a0cc502980d54cde0c204071417d4b16ebba638fa048662e4e08bd6d9c40bec96f184df22388571c28b51124839b63d9f0c949ff6c3fed24c4edb5555ccbed5af1c8aecc1952b30261df1560988de8b62ef2e217de28ea80a712b597a66b022aa12688c58f6d4769455b10ae6df45e82e9edbd034c4ddff5001df88df4a9d210b30c6ff9fc5f38dd5dd4c9c98281f069829825806344f2ac8b22325eb313405491a3d39009defd89e9c6c974f46d4f9c687fcc0c10470005e972d266604aba4c13b8dacd46bfce08c5662f5b0324e502e700addaa36fb237f4765832211ab8ff3adc3a4b4d00bcb0fad674870c4453c643a88e9969fae768124061ac95c2f81f647a7e50f7b249ff621d240153bf9bd40dceb873c62df9a35d32af42e254414a9b3a332f3408e8c811f620805b8c8265df26f000558ff1c8c52b51f1dd1b7ec194a3fbb8d4a3476802bff922677957446926381e7151da44185e4d374a3d7c910515a07fb573a3a8f9a42efce8a29ed22bf6d735bd5b7452b075edd79ab4524514944999ea9d6a027a3cee93c050e51eaa2a06c20c4adc83da7f11e416478aeeeb1bc4e22ea795b81ce195a982dcf4329a5a0026857ecbcbe3b65b008b2d3a341681b61d145729bd23c22f330f091a46a0b380c72468de105c13d7e6daea26090340c8c78f838ca4d154a2d02dc1471974f36e3d18d98a1333d059ddc60d6d86ac8b300f7c4e16bccab86c6560bf1c04142e1949b80c7243dc60cd68fbadb110548fc81ac943abc4befb33314e6f66f52cce6709b86b68157c66d9f4a28d4ae3e4b08bedf9e3625d3ca683386b71f263d5fe0a26b07d518795518028e84c107cff0156780de7245af19ee30bcca1e34cd34c5d5fde9b9a2c443e59b24bf9b543c3e9390f1b05a47288dd1a8beadab6c53fcc95de41736f3910fdba79080dc76c779de824738b40e88c0a8515f6e3493b544d4526a2451fe47b3f6f8543848185696918f6a372f97d0c4cea59360d41a84ad7c92680793e35bec91ae630d57d7a62128bdc79c82844535cc6ad370f3dba3332d3c5ec388204399faa4fdde3c41efdc4f30f09502206a7d4736959841bd68dc71fd4baf97e6b3b2d0602c0f78c58bb4f69f7273eff8fa59868c174d84f71204f186e4530aad987ebc5327b60bffe9ec1de5565f505d230d6caddc213962100fd2060616a712dac98215bd3aac9c2c449c49af7e44454ad24081b3c5879375aed6da3635ff5ac6def1088b75144732ed7a3037f3176e0f466eedf032e80dfcebe5a8e4f46213f0055b126141f1cd4c1009b9cfd9016a7171d0e74fdbdc8747463bfa4031d5dae58ec79ca46c81199dfe66b40d7a644d6d539d51e00d10d1e2a4b971a354321e09a27dcae6d3b2842448bb1a1711dc0c835b4fd6e613d370e13bc424340d9e24179a08b0cf68a682f9fa3b581bb7a15dc245a3b34291231752182fbdeeaf0ad701b5964612437b483291b8e5031ae8a7139ee1e9fd95ea02b5016b185c5930cc14fb59a6557f3d9656b87841a9c73d2631e41bbd626e98b474d7c05bf6cb2bbb8d947bb3c7d0a52e2433f24d5cf8cb4c1c25c291031630fb7d24cf9f67ea31619d7bb6ece7128151c8ea8dfe20532cde6bc7b94609dc15a6c6b14f438cbccf54048bd6bfd43adc4711066f2b12eefe784e67e74e04f412891660db4e4f360fbe2c49c037f166e74fc8a6b591277c7ecd498fdc3ce5628ba49899c440d74bb215abd00f6c990b05ee4f66895e350329876195cd02abd3072ecca6abc21ff45e4d1d7de028774edc2d51a1058185a88810f5f510f03b67a62268d03b0129d2231896ecd5f7be7f2c141cea791b0669035ff18098d1a824323f2af55336fd88dfae17afaad8fc62cd392b2a35d13f74c0f0c3bd413ede5f563a350c8d2ebac46d9ce49e8639c4fcc70ffc90734b9bc251489959ed79b6be7bb4318700612e34d4d88c7148ca13a1ae03db2f90736be5c922a05c622c27d67f9b6f55c1f91cc56932a36b740a8781ed3466c6179db00e1d5890edba24898d06a3c8d5653b395b924a8dad5b95195938cd2d84e5e27fa6674d44c71414b53931f12797c4090d90bb50b11fc6370d985988e0c476a135f9420c5d912f9137e4eeb3893794e3482684ceb560d3e372caa872231ef913d1291b8f6416a956a2bd10ea9c424c5b89e471183f5f8a9622db77643de0dd76599497e83fa8995841e455775d8e82bade94975f89d91040b206d420a0c9cec19359bb6f8b42b9fc39989278ae3d7e776e0deb6ee6c02919909a4ed89da247308cc15884ccfadb0698b1cde69a521025106363c97bd2523f9f05739982eb0957d5e75e8aca63897a54637666ed9631ec5854cbe97655f2b033c28dc6c76a2cd1ed651ade8118b271ecaf34896a1ef3222c344a06c0425c8d52dd20edb8344be1620ddea44beb80a39e66a6203fbd1d6bca57f503fd98dff73322a2078832fe09163803cd1410b1485f60ea3bae971f7f7001b0614aa7f90f838f619a382abaf7c0822da6857e2efb4ee4459ee2b71998f88821e1739a5e2960c8cfeead96ca798531089181c8061a47179090b23d1bccd40dfa7abda93d09281c9306a297e292ab0795a5ab069d1bd246769c1590c032c768da33028e009fe37895f443445e076b2c4e83472a3eda0a431245ad1115c397aa9e826651531a1066fc64e0fe7e80d2494913a7b7e1af0745ebae39c77e30e217b3481cb4e0f80d88f44b1b64870a1bbb920484b56375fd2d58a42016a5c3f26d6bac4939456c0945224b9663115f8a9bda32d189b5d0004325c85647155e9f8369686300d6fe49388e9d901e94608959232c6607842b82aaba4183ac9b1fad93876d2219c2a293f9658835eb7134e8483cdea2b6f64ac7e047439a10c2919e32ee37a00dd8152c4a9bb38d8a93b3afa6802b1debd8c1db9e8e646c1e6c225e53f99d9b3d904aca0ade3376fd9fb4ed7e8b716356ddb8f0906e3d7832033a41b07a895c2f49e18e5086f8c3caff827281a920850f2d130d967df6b11ca699b83f3b4a794718d1b4812b60f670a36ad084c675a19715205c6d9e4534e08a1bb529946afe6332db92c1c2da84cb46f0b148f27c24ad7355df3004eb080ab245484bd63288b4f45194954b390d21364065818988638b0387e40711775c62052b8158d55cc04e40f783bd901159356dce33c03776baeef32d84d44e0191a6d0de1f27694bb70498694bf83fab9cafafd570342026c09574fda25d4e14a38d3de76ed27f794677c44d89378b2063e56a5f94c49d080e0a880e50a5df8b56753d9740194c8d86bd98c6731300ad0d441d08407aea4d39d541d8a6c2acc2442427a8b481f1eb7d8f62f3022b1cc5b5ca82f385161d32cd192984dcd2ddb460003c0272c1c3a1a3ad2d7a1bf0d279f6198d21a8ce889d0778867b56e0749369abf441344e1d81f59be1a88ff6610a757deed061e524fb6720b90eac453de73abb525c9ecb1cadd4f1dacfcb097e6654a56c1624b48e51b5bbd5221e1080795ab84b6e248d7f1e3013b2793f7138d479bd49e9916d388354d1838dd7e2aba8e6576483d1f6df894bb62db5afe3525a9b6722b01dd1a2963995245046b1df8f4ee0297d051a4ee9361d7a4f139154a92aef26cc0f149e38bc366c64e743e733f3b5028fecdd72299a92e74bfc341f17a2e955365657b4ab4d658441dd55f84fda0ad73f4a913c37e5461014038ebabe42230f5a4b576f6579458db46ba4e90d422a8966aec45b15a86bed4a1286a1eb4f0aa22dd354d097ddf8e477188ddff4537efa28b842872b279b987aa7658f1b007d570ab1359e2503dda199158148c50340764e020385e55448b35ae0f662b4bc86acd10c1fdaf13ee952d5594080c1cd73d3e94b9eb848f6772ae0fb8446431865832727ff775c6dce9014bf79ac8074fcea82768bc5be04473e828a91c31ecaa9b2e81278f7a09247a80117b63e4004689b4d526e7be17f5d244b7923a4f8f3f713a850f7d6d3fb7904d5996c0560713c5ce58a65f76410481e5008a3b4013149864ba2967bae630b88610c5c6f4c891e5089dd7f73b2a58e7316706c5696938eba65871b07f1285248076d5d9c3cb512fb7fe49c785b9cf5118a7077580cfcc671468488c03cb68900f784a746910072022d67617b1dc3b8964851beb6dc2530c80747b7ba4f6a80ad5977abe350b193c8f7177cc0a40b0198b27b8d86a996eeab8edb8040a3b58252ff156bc826800fc6ab0224f1c81440895efed5148944c07c945aca865e7f3a80340883878758830ae7d72b59327defe294278616c4b919b88c5e7eeebd8bd6d0509affd48b83985fbe0265be456557197daca1e1d2a3fe0a033afa1d018c850b522d8067123ae9c5d083b5a0ac469ef687fc249544e24d748ab508daff3f074a30827bb694820af853f0816d76473f730733bf088070782f99d46dd938ca897290ad7e35078277208d2a44fdc686451293bc8d5d606784d954780eb44a0d02a86cf979583db73dc08ac3117587ec40c5d9c6ff51a092137070e826b480a7a1a3363857812496dc94387038a22e90e98f70e0c3878c0b007023cda36e2cf03bb9707aa4ed71b08c66006ebb1e40971903080ff90943ea8bdddc1c7001d5c7dd72fc3dc922c19b94943c80c8344ca00aefca14a6d327b0cb16ab903867bbf3ae67eb952304013c72f12c57d035dc5fd653206b9e40540b5c4b718345310d40c696ca1b023b3cdcdec6149257cee1e116865e0e7aef98492e8a6e82b6b22c28ed0a98541e18512a5a0a8500c454a4d7d760841e66fcc54145180c3aafa08f2e912b809c2b80d2d263d004419f8f1fad5e038bfb05ea1323f2146abc037e8adfe133bb1d06261302ee68599317bc83d30fd0b7612208f5c798ca94f00b0e0136951c1505a34f2aae5be9fb687de715575206c03366ccad3c67cda76fd64c4ef4b554897b10c98906dfb54c05d8d706d4dfd50a6bb11a88787510ead40d2d46eb7aa131425c02719366f0b3e0ea72ea0117892bb38e891aa7cef30902d09bfdbdcb8315dc7cac6f53319dc2c709f86f27846a12860d2f7ef20e9f747209066819ce2616848334556f60a59b98aa0212073ae8cef17087e5a4574548fea56900ac470f6f6584462b7c6288167f55e75378702d7323dc0098a1acebc0289fe3b636bf40a5589749445e2111e9231d850eda0bb3fedad31baefd4a5be0a52caefd4b926edfad88e7756d91c9d17fcdc3febd09df8938aa85c7aa73f297b9a8776ca5c6bec93f991626aee9ebe227db78c8972254b807094bb7b80423843dbaf7edc81301cc14400943da6d148da4148260d4a941b1196632e2b0d738837a9dbe8af36e13f8434464b3b625a926183339eb0fb10b8fc3187d03ec48cb48dc63112984fa9d6a8df2d7bd7c2a4914abb2aa9625f311f8e92a5427d0eb4392875e420bdf4f9f6f355a2b53a8acdec346d67948e906dc9c759bee3a6056806629b1df60d4c1b95be30489b66d2a201fa1696a5c4169c71c63193f26da6278340d928d380d739ae9f37509e3e5c087c411b64f0327fe4be62ce0f9d6323086f31e19513d6374494f8fd136b015ded1a69a59264b8b1845c723fbf0783122b40127ac3e148ecadc06de4aa6d391cced588cb60a3db1b872372f99c6da06d98a94d05676ffaacad59814264b96297f876695b085316da1137fa40bdaf37acd846d7945ec6e667ad67cf5921269fb89d1493aa9ec9f1c66584a908a03b7000bab0028026817119842b7dcd70d8ed32f02106001b7e1880b6c1c1007c51fabbddb270dd3a79fb97657597ae1e6a500bdc5ec4c8ad39589f27d343915bc238ca11c8f69e369c8e9f92d0941cd64a977c6ff38f307deacb4991cf17947c8b55193698c1f1a199dc22e186bb91d2d25c9459a03ea621bd1d31c6950161b023c32cd3bd11f8235e1463f2702fc0e00bcdbdb361c6845dfb8f6e89c991226e41d12aeecd86a60fb971d9fc57b4c5a5415257cfb677e0d47ace3f12458aa44f3d1871c936489658625044dc375d86f98c0f08dbcb7d275f52c75c16a00ef19e4560c339d4e64fb74bf6ff8e92a60cb52c7421eec975368f1a3a3abfd40b00333133e5048b89c403cd780f265f816731ebdec1c959c484fc79bac37cc58f28d07328d351407fae051d765113edaf60d147bd9a8a1a9f43e662a17427a4ffcd3fdc942c8a324472bea4c3cfd3e6b8af7085d14b56902d9e9c0bfc8baf0b0d7877fad178fe2828e85a7ce5c7005aaf4433e8c27cff05675d5ed56c431bdcf64736b35760fdeffd176eeeedf9708ce1932ea88b3eb3df486605f5da3a37d40341a716531a75b98b8c15da97bf729024c8beae373a58bdcb2f0ff66c202ef5a85e8e1d548130c79a00d9e4e1b5b823cf181c6b55fcb94b569be477ff57c69f36f5c45dcdd121104c12c320fb863cbccc178eb2fcf9e7de88a588d819f143fc899b003f07ad06316728649024d6fb2d20982fac8eae314209301898bade65b5f64263241df98f34e40a26c8b4de1ec4a4215a03a92ce49a44708880fa0d7165fe1ca47100ee52ba009d992182c1ede62a3a22881e6620495700015bdf1d3a3f911844a7239a280241b441c52df96b89d9aa850889b4235a97dff5fb1ff38e41146979f4cce975e1d48a71f8bfd004cee8599d39195e4ebcc2df8a3ba1f0a9ed019f6a6e9c7b20bee73e70655f43164f012d13f452f7c6c819a4010d36bfb8711e241c05baeee036405881a54be8bbf019f0f65cbf05845cc6ad07d7f71168247bad56c3d2162dcf88f01ba269d4ff8dbd560966e7a2282df5742544b79d0c9155326f163ca89afec3f6e86b18f55ad48a02e2e8e54fe8c90e8c7806a7f614ee3a4e73fa3a37f7f1d7a3798b5df46cb869e85399c43c7d763dded14e130ea1672e8fc02e0f71408b0533fa7c4ea81cd417bd46124b8e7a91d0478d431bf950db6804313ab1be18395d218f7af332e243fa8ab3315b6f86afa6f101bfa4843d9749eecc1597ea7db800e639d7d90aa6456081ca45eab1509040c1fcaf195d89f33b949d40c3f265bf3ce3cf7d957a4dd208a798f63c5759ff744d766d9c69122682f8c07e45d3c2c728dc1401c2933cad3a69fc0e75e56044102e3e098b4691a995637e4344a10c4cb7a1663161da2861395b4cfcf2e36d4ede5030ec36ba703da8201bd93f067a1180eff2574f6afb306d1755db964807886a34c25e5b48fe0e5fcd744963c0b66bccf479d7e965e4fceb2553e4aa05cd6d26d3017733ad6e766508ad313ed1981e45330fa0b3b70a8f70b31ddb6deb15719f860c6f4c90653eb4eee8f8065b73bdc70e10e14e60fe462c214ac85af9f60e900ad70e10a89a2ca1b9438c5ecbfaeca0898e7e8ce5c581dda9ff9cf6bcc5de8f11b4f9f27249a874adf6cdbf5d687e77a01d0038fc7274322cf90469a91316f0dcaf0b9e19540c060bf6a96ffd6127ba4c7440f2d4e32581070360fb4ea5a3d4cb0066d2ca31b7112f18fd32111a5b0ab600fc171fc0a3bf8e048a9a865d61e67a8ce1167d182472b9ef99424f6b0ad007747a1cae5d94bd8f44758a6ebb3046272621b2f9ae894adf0ed458d09af395c58c9730f428000897fcba520bd50ae2bd6f341cd5e32ebf7a0e21818e419d96bf3de2c1261406c246678b7d43bd6d6a8235cca04ec61c98d68b21c4b6852765d2a6852c17d8963c0d49c32318a518644463bed048a491584cf46a6faa21267ae150122bda7fa070f3587f4158e5714017c1151883b7186278385a5a76c48042ecffdcb2361c454ed163adb55183b52c8ccb4cc23fe05a067d6de73d5e8863038dc72a62be3e46a00f14ffda0881cb2e93685bb80b9744a3894b242551664a5e9cd31153502f3b8439a73134c8de46f1c36c2ed5a6754c0d875f4f15c72d38da812f9a528fbd0a16a94dbe214f147e87edf9b3aa94afb840d011f47fb2444c60e675f91096fc00d7021bffffe3f66985dde6d247e288afdb2c989343a8e4f8e126be960f30dd4606a8f80d50c44a10afc91d8c25bdb06f60af4f991eac698f67aedae0b043c11ade3f02431de9f9c801b8775fde41f28b39634d8bb9572543ee45c9d3fa722f2788fb9cc64e6db5d19904e723afa51e6cd7db2f86bcd303738bd08cbccc55f0926b4365406519c8619aaeff0294b68d52d748482c72fe6c5ecc2d2de8b390536b00477701535b97326a721966ee047b2c119c319936d4f145e2a21b13b6ac84813b9693026caf8bf277f856a8aa0d23d187cd65864a5020089ad8340ae1f152420c1782269798b675ef9bc8863da0208d6cb6e8ad5d08aab56806839ae2d57828b794d2d925a001ac4b11af02e4c45ecc552a8f6e5888083fd87a0f35747f2dbbfdf8690ec2186b3ef3354ee9312908e2ac9a65a6cfaa60f37de3f9c0915c94a0e7e3cb15438454592433f049218937c3cfa1598bf633c01472a373b96ce2977c8e7e9389161b7680549e41003782ddfb856c9962f66fad75797cf340f263fc0d8226eec440f2b2f46a68c964503fa038060887273e2b5964c4c867e59ea1ecec2ad4c912a7578ec6b3cce5eebd3bb15e8b9f991e36d4551c2417c70dd85f48c4c124a60ffe10f6a70887fee289b21073f88821837ad4116262e002c609407092cd79725628897924528e90709961cd01eb81d77773d6d5c06704f88ed2eea5ee6960f667993e7498e42f4c61c51545d663f7eb36e283f5e02ab0fc6871f4cff867a10ac5994fe7814d5035805f3ae4b61f0520a125fcf55c76834a8cc3c106f668cb0b9f6e13ace8871f249e819220588461a60748d6ffde284d015c874843771710446738f370644e16691c5a275581d949b25dde575fa33dffdab7d84f2066991b1f340abf3ccb5cdff848e799b15d2ddd32ff11962e94019dce5d5354b6052ba34fc8e458f9ad8539b6636dab8859ff32988537a46c1f8494fc17224647da507716a6a28d33e2054c9313da42e06208e2ff0aedf37fd103bfe20d6a188f9a42521e094e784be0b97695f9155992029ab7c3f666a2bf66cbc1e7d67a0dfd2538dec3b254378b333a03f384e3bc1eb167e7774cb81a0356c93e664587079eb2df28716e64acb412703e0d8abc6b7fdb535efc3875243f0a5fca2dc8172c728c18956c368c15af5c9a6f549717310706cb5b86111d3125bfe524425d0df92e4649436ce8610553f3ac871c38492df453c8cd9209e3073f50081e288201811f8424a3e5af625124e82587bcdf17a2f0c8a80185e882a572a1a6371a54c822f02e7e8dd4bf31ca132ac067d050ee59f93a139c1e848ab0cfbd4a9f4bc2cd861e52f9dd01bfc5b9114a5fac22f8b320f207b230de0b83f53e07b87ef67e96b0fb129b85a26231e83d85b0d6d341bf798b1a12a1d7bda88f555062f4fa5f9865140518d5c7ce606fd4b1b7fd3c186c03815a7adc436b00df54724750d40246c558863ec5ef91eaa53175343f74e27b212744f1f7091af063c76b367d6dd52349b3155559cceffc506c51ae888a59e7383e4505eadc8c287b8a90b709e26318f23e08f28e4f8f0c1035a48f91e98b724aed6679e6372c54c226f6abfcd6e9971b0ed1f3d309bea5f311545fee3bfe09d59cc395427b02ade9cbc6a213acd6beb2bc94b3cd36dbec33b638390c8a07ba11002585afcf13b55d8de881b3fe86882c5a288f086b062605cfa3c308987c139e567bf26a492c4851ffc93bd7e9044454dc42ee92d853e23633f9de2974f7443ec4f240ac1b90ef8c0b3ce0fe7f6b01b7e5db662ecb8b413dcfd4715b08c2ada7f8db45f885e3306868fe489ff26ebea1b79cf158f8c2c2d2ce36d3d9b398e14ccadb9032083a7f68e3872d465991b57311ddb631fab97ec7a77bf564d1729bda6d347efb460d159b206d2f3c9924de228955179ea36fbf4283c3a7edb8b458bd8532bee74a5c4665b94297840dbae25ceb1e4e1420fb4b263db4cec0e11f213bb2af13a3d53ca31a8a2372d4c668f782d3177beb289cfd2e3b6ee39d5ee6861ca9fc6cd97730449a8a2abe09e9fe8227476f6d2d4cd53dde3c83cca6c264f1846b7208b76cdea7bf6f42cd416a87ef61cff1b43493b199f7c0c04e19026e3cfc889972b2e58252fab0d5ae78f35c4715982cd614ea4cbf80baca4c6f16a86607ec12ee2e509b92339db3ac69d76ccdbb9502284ad5855f0c40c60ea4b1708daa53ab2dce1350a181a234b04081d40b5bfa060dcafdc45a2e550e33cdbff3799fc0ee35c8a89ccda0ea134832a18ab427a34d93cc431f93e7337d255597d7d710e1cba6630231a081a543403e5c73a300776fcca85ddf4a55be2b5a920a9425956cf04828349847a15fa8a12b7f78795e6b921eae9fca00242af27060bdf1456f7d383abaad85e4cb0db80ae206427d6f88e0263cad27b9805a304cbc925b020a0fed33f341df0fcfb3ee59106006f74dc164a9f80df78012dc6f0c34a3a932e5d7ca9833e86652195e202cd65ced84076729588be0dbe43a55cf77eb4054aeeb09701dce436e0e682ba95545460c1903245ec1cfd321efaca98e8cc5f27cd7ca34c9f781a48f6378452a5cb17e3c4f4191ac329a4199c1d67519ea255d7f5aff5141ca3aca8d280c399fd30ff751823c6f44763646c4200c1e083b091da7a67e9c514566eb02c0772ad402c7ad0c7f49c4b697be890bb20a241264ebabd300dfb340d89d7a8a84945b4568b6c2fe5f21d61f5df95a69316436f670fecde4093484db9bd90e5e85cbf9a02d4512a92afffeb7cce1c1ea22a8f256e87c5c06c218d166c0c30d06af34aecece1ab08e43e754b3de2932b1c595b3e3549072bd8f7e4bb249490c4d033f3bf19eb130feda39b44882ab31996a77a6776ddf645b6af2409d5340b8331b060917d622564cf17a0d7444c913f2d434a03987578b62ea9dd38e7ac20d79491a3fa726077b3a70f330a9d76005982db370cb27b818a8f21cc5968f5cfc1b2714b3b2fe71730478475d55c1e7c128d191d060058e5e24ed2873261f8cdc4c03ee88de299c5027c66784470f30f44d50f021f86170dfa7207057f55b57113e1a4bf09056fcfd866b6f67d39cf6e18f3d5ef4ed1cbe890477b91bea9c7775221b130cca2df48c0d394d7762272660df433e656875fe927be677167fbe82bac7220f747c7c24beef07b02f93ea411302e448c176f407e65dc4a40ec334891f9b3cb96b16ae61bb0a64d52b359ed546712081f5f9c9c3c9f06e11405b40da9380ebc900511184c38f280fb10b57035eb7c4bc07598013b805a4d13661c14c5c5a801c06557876a89596d5ff588c57b7ef230d8b58196a27f881d8b28418e7a5a61455f39b75b9896c5066ddef82856155b9fddfe1e5ebb156129fcb4df838cade301d73115e068aeac04bb63254ff2e8367e0ca160654f02a2a6477060ad15f6bc87b1d9823a97d103302317b2e8997f147c633a337c3d4ca2e9509ead0f097709890a2df0ea9e2de2eb5012e989e7fe700bdeaab96320df63542ea39e959e0c8921461adf5be8d8b9899459086b90ca6215574994de68247723022f84d887e51038f2a79635140b35393f5e40b2b20d21efebc5e9c7e2563c595cc599829202e95ab9f3ee469d51f9cf120461ba28dca06227b217248b043c00af3a5f9d8cfdf2c07b546fe1e4cd8589b939b39ce6e40a84ec5d0ae09e4e9ce0262f8bed37e26d33cd39d1c04bcdd8922cf970b62bf0578013b9e69f6e7aa8290dee2702d27a267f932e53076c68eda3e0f2051d88b9b1f755b0bec88cbc6bd0c334fa8a387d54792e5b02b0dc8ec577be888423ea456609fbccd4e35908efa7114f33625404715768906012ee8a79a0f8be89c1c490409663df32cf6e94b11c06831f5140eb7a010990d1951df883800b97224fe01afaaf1d00f4cb090e9788a75061d3bd017488ec70f289c7c087a57e8c0410d154095df2bb4e302e879a04b9872acf3877e01b3ce5368fb9c4390d91662655a5f1193ae066c6a4a3e4adb7f83760da01f821dbca6059a091833eba2eb17454816813eb1344bc41ccbf48fbb8e857d5ca9be2dba03078bb585a1805d04349ba746dd8c7cffdacc658dbf305f60cd18fe75c0d92d650242b0bd08b45f97f9ccbd46f00cad29b5bf7866035080e2bf500b716a2f994e6e4a2e5714e055b12c20011f0e9fbd0bf6470346b3046c1fe605b0eb90254675c9b0b08fcd08b6b0a9aa5a0239aded990c10b924e61b49eadd55ff50e0d4d421175d31dc88a52479d3ab603e5dadbc3ab9b109c73bc4f6b2de2e6ff8de606c2015ab205434ca091b46bd6c0456d573595185091b6bd1ebe44f19eb373d4ae54e127547365c70030a208dbd1c615509a7405ae3364c7abcc90aaeb9e1a6f5e7a1655164d529d6190a17f55b8ee198ec3ac03b9d6aa149fc88a527aad1e1859067eb125eb1087988b0bfe4d7826072be941f28fb7f46836bafdca0b1051026cdc972d0cb6a70e7279f04cf97ac5bfaf19f541341cddaeb73c6dafeb6812032a5ae3d87bbb4613ff18e5f65ed6c0bfcd9429d4208202d8f49e0a6370cfc295071e4b37d2767cc21e89207838c9b9d8497090cbec1507c8468dc14dcacbfb70a1e607c03c952d45735784b64e54eccf8e8662702446f3122d43ad075e81a61d2cd022045f9868efcb87e1341a8cade330311eb6178f65b0cd7595813e102101722b0270b2a29348c7e0bbbb0ef3cbf5caa03ba547d0aece59e12ebf2fa7c7ee56d83daa261382d1a4d2945dfba625e139ac139873c15acc64c3bbf18c47a5c2440238c09f3c7f41c605d84276e8f5b5e12ca7d891c552264a3498cdd7ae6119431ca4cec134427d11983dc2871bee8dcf42b8e6a99aeb9893bc639cd672d50f77b74d17ccbff26d075a9721bd5096430b25bb3242dc350d6fefb8b50e52660d1c78dd37193df208c9bf6861e6355dcb4482cfce8c144dce4dd70d3feeba794ee300537991eb8a9a84377ba7b8cdea6af972c95f2367de775ee77fb5392a109b7497486dba67b5fbdb46d6ac55d34bffaba2de85da04e41db546e66519d62b669dd44a9060aa491ba714583fd1963e35e89770e2a0d8866e0f515788c0511dbb45765a42bf035eee258d1fe66fc216b09af4deb75ae4d57851ef5c4370d61b8888e05426b537b4d606d5a0f84d5a6eb6da4dab4243666cb66d8fde23a885e68e23a52ef38c2ed503dc5d141969cab51fc87c462cac9e14d29a77674267e6bcd1bdaf28c3a3453eba71a822d6e8a48f61d8c5ce1163868e47753a6e5ce293ec40f89beba0df20c3f6d784254ba02d9ba0dba8813d616bd6ffc54a1b6d800386e3609f0d6911140a825ec6f9441bc8c1babcf1a59080cb2b23afa8f1e81fc2673170c0adf6fc2612ba943500c46ee72ca27bc489862f0132bab73c8b68ca80743659860f78fd9f08241c6df41b4ddd93980b4c845816e2a1143c18d2eb6c5e800b41084c3b693fa6770a5686e24883bb095d9f0617ae32be09560da1666f6705f4ea8d8f75c3d577ecf0b6de79464546d4a61f4548260c0fc3551fc748b6cf570016c34032a80c27b5a405616a50305f48768813b4ef3aa5156a5e2337c1358f2cc9112ce77c0a385543b3d16d3859678af08deb7da49b063ba00d341a4201f197aa8d3184e66b900f8f08d6faefabaa2a5fb4e5549d78a5648237b932df796292599028e078f07d507de9dc6921fe4f875d6d11f140ae5839220c6f8752567fcbab62e5ff0c4afbb904af02b860a06673c945fd592172816bffd0328aac5ef3621bb9f7949fc017e5d65d455e6c4e5821f14ec60e502221c99b2a3c40e3e4ce951e207233b0052220546a6e0b89060b021744f8a8d695008e193a140c2bcaa8450423645024005531c61f2854ce15575c4069a12497a551df1d1150a85ea013b12f418e62e18e68e6d1df6ba21e0ac8c22893952676574083b2bd3bdb349d2a05028222928a282a7646594497c2c0d272ba33fa5868214ace063bc2cb8bdaa54101479a07952cabfd72853a8c4bc5c15e3d7b51744a63153433d7496956c23bc52f3449f9d8487de3a7826202c03675f81a88730d56b3c747d683c549f5dc6436fe8edc5f3e6d912cdebd8d43d3f69fa67f390acc7c190ab67da16f22cb43d15c6bdd754ab85b61a3e412ddbde498553f770f7740fef63169aeda04b17483db5cfe699347a6a1e36fde059f53603cb40bfde75595a5031440a2b2da668e3e10b52f2b383329416543821ffb21e50cd96a6eacf4387618041f35ffc54283eba06dda10f1d48efccc0a676e83fd8e42c031dae1ec22f2447cb67f73cf497182fef9e2d5d8145d6a438d881de606c49552df879a840541ebace0e7ae82d05f66a761b0f1ff478599b8f1f9494a04307b225e841b6a43a80005b3490ec1aead5003af490ded0934c632211a2bfb749924b8e9ca3279130ddf1fe5d3ee3d3f8e366cb322443b7599a8b9b3a30f76bc3b8a9fd25c486b79943106d5b6239dc366665b65fae93d6695c553423ddf17cc55c64cb2f9021b7d96ce4bd8d4830a30ddb4422d7168d448e8ddc666311462e8a1247caed18a60839aaf2ec41b644da5c0a191df31e5bca9c1d862d859c3d7b3954be5de4d9d34623d10dcf443d90a21746a3d93fe2a6740888bc25c03490dae2abb5f88a7c406fb95220ba09b9a50249cab45ff6df67bda9e2c87abbe28f462397ba437f34f238dae40b234e6ed7deba43f307b48f5cb4d1d03ef2ac31bfe12af281790b372517c4e545dc6c0fc17b91b38c3691b728c3b415853c0be95b66d1382e6ed8d6f1a59d1d3edc5e9afb4162997dd71eedd9529b60581976d95c0f34a43fcb87fd3ce181ce1be0f589193cd6e5364bb22411a48fe668801edd664541843c74b67a62cfec96f74603bb10237c39660e3914070f799ed85b1e12424ed2878490df2b7ade304ce450e442e622e7cd5168f1494201859193b6b4bf6e03b3ee353d60588f614daf879f18d5af773ab6b48ec2a845453e1e8fc7e3797b7c3c5473ddd248fbd1c87b4b2c3e1a8db6a52247ae236f5972c3dff622fdb93e6f2f9273e1f1d09ffdfad847cb7b1268e13ec0725772a4edd466473dc816dd2cb9e14ff480961b2e9d657b69f1f72d0eb3ddbeb4b428211d0ac90ebd451060ff003fe109cfa26d723b7ecc12b75b1c48c8cd88f5cbd1fe36ebe5688f8ac3726ddb6610eda35bda58bf80712f0f7881aea717e8fd90f7e9f0206449828960229a208299e023a867cfd459565207cf74ad58a6674b16d01a68accaf8ede167fcb7bbcb127bb8053aaf8057558e95cf9ed649545230f9e584ecc3268c6c1789203da6b6c3d9cec876cc440819773828e47afb8c3a114912c8f1e5b3e31c9484fe68e8f8bab2ddcbd981443fe66ce96d171b8aa3b3181275d860b2a5795d893b5b9ab1c8b37344623d1ef3fdf6cbf17c39ebe57841521e71968b38db3d1e91c9cbc11e75b65b6e429c98b27cc6d4b3db6cd461f278e8b3f6789b4282687f79666d4ba25fd1a39135a5b60463929561cf1edcfa638a4d7d628f38110918d2f9c6eb131eb0f819799e596326e48cab5f3d2f9128653b8e603cbf5e96d8935dd98edbd88e21b01e519b7e2cb2a5e517dd40b6c79e2bcf7eb12145618b8f1faaacb6639f4ec8c93e6b43bfcfb32f177bd09033eaf43c7bd4e1a8f32aa5e258adfea1443f368a43434048f539f35dcc962c4b7dbbc7705ad02d9700a4c1f2de2e006ac829dfda60b43cb277ef06400df97cfb87b5395114d91886612c3ce68d45aca3f38561dcbc386eca6fc8b9caa8b7421e55552f004d8daabac793d4dceceef619999b72b9a832ea107e6ffdebb321d7afcbd057182cc1094408a1065758e185f64311af73008085f79a2db5f30fdda11c80df28bffe5ae879f61f355c01223f2c018c25786042c56965fdd4f1ec4ab3259f67464332cceb3fd5af95e351a57421c1608d757392846d2edb9991b29048c523d2180226595d4728c1481f0164f56084357644020a618295241752129d6601cefbee6e7f497058d924434998388279bb7333484c48ca168e5061bea21b4c927262bcb6d8ea4282912e49a47e4a8f5cc4d2e50aa5612f86615a1132f45d122896d17f0bb6c774332f00af2a9c25be5f552cd8e128d9d26cb73ab6db758f9163a4d952a4e19a2da9dbecf327ba81db0d67d966901b1ec3dbfb87e42579603c2534cfc9cb793c4ff5a43c1d25a5c9343a585028cc221667871b7bc61c99393247292564890e3b4003748d85c5339666699666e9569bb554758350130a5c8939d56e4a232e4e758ffc3a7122b390fd23cf58935948f823cf5a9359c8f723cfa026b390d78f3c0b6970d33487fe9a23738c9e458eccd16fb4b478d6b2cdf82dd26416925fbdd95f3a3aeb301328bfce3e5bd2376da87576b2257db20693e59d58afb644c62f1036fd609955e87f5c476494b2a5d92b55840281565b52e8d0a3b2e939fbac589d53af6a92796ca3c15cc796306f51130dcbac631e2586f913dd609179a53b5efbfc45859cedd364a849b68fee78df456820fcf6194724760289f9120bdb666c1f3659dc0be63ebc53939790c760f9f3e8efb4de3f6c7ac13c87cbd517e35e42dc049e5b1ec3cba109c6e5f0dcf21c9a442e868bd31c2cce0a096920f589131f5e426ec68bc8939f209e2427f8e1c4dcece24a871dd21c9d70c1824c62219f0e1a0ed02091c16b61bb90605e6ba6aa425996b1e8a6c5597433f20f64fc286431c618b90e79dcde87b897ccf71fb08f826fef331436ddcec533155160c8113b3b1c81082d9a84d18393aa0c0a1e37170e852db44d211f8adbc4e16f702e5b10ed5f46dec2c929b92deb85fd112773a276996b2644b435dff0d1bbcc57e4a33fe49a61ef490d48149eb5ca3466eeea39a361890e34a7269d8adae14604ba454308f8978c00bafec361c8097a6f73c8afc3ad874c4513e0a0eb96030a12198252e5e0a48af0b003ead4c390d39c79d655099e77d8978719089b9e172ac3eecd9df1eccb643cfbe33820a4de4ae404b9be1d3b36456adc559f91316b5f166cde5f9e4c6366ab6af036bc7f3e637a04c171e2a33b3607ca0219d901e37927d11ddbaa259868628934333333334f060ab28f1f330f1f6122580bdd34de1a59c65a50e13498ca8d2b725f554c54f9e7ca0224e895d32c387d92c1e40006073d40413d4054a8f8a0bd0c9602af32e4736e35d4db55f8141e8597126a86d96575642d8465da22d18dbaa68d0a82a3c884c969a8655956e7b04c3461d8d6485846af2baa3686157f222f6cbedcb22ccb820dbb68264342d8d3a825c928eadacc6d596c59accaaa7ced48891333804ff41b6265a21bd8f186f839880233a055a6b5c0283d056c12290a845c4499224a18ddce517a8730bb5811f47b55f9a077fd688f97c41994ed36ebf16165aa1f190fcb50d96e812e20dd8185ae46d23904f8672209e0991af5b85f149b80b68a0c8ba1c8bd2ccc49c50155067a26bab91cd620f211fff21ba2177c64b4e22dae9f4ce7f2914b62a6b5401150648937ba9b889aae2ec1ef8aaf5c2b3691385206c4a61dc8cd3833a0e6481c869cd74fbc118baccca24c59950c48d7925abc1153882a64401990e9fae1eb278ad5f543ba7e6e441462bc7e3603ca987f32a018593806bd1a60a10b11666eeee6e71a00921700323794ca9c1c35c77835736bfdb4539fcc6fbbb5325e6faacc7aa1a00bec8a16b66d1ae86ecc82ecafa143f6d710725f315e6170707b0916ec7782ad8313ec30de0d7659af4d65d663d464336303a32231bc1cb604e055c66770eec654659eac4136e4784384fb2c36414b2fcdba2ec8b3ab3e6cbafc39ffb0c9f2b7facbe7398865ae1e36adf7d5733df34a4f4b140cf95cf771508fbc7e78d989ec8ba7dd5ac66a37e4b61e436831e1db0baa0f42d6b6d3c7d6e56a41e6e2333367fb226bf7c22064aaddaedcded0c800d23432e47beab39d21841a912cd32d4df5b9f12fd84fc6ee6e3a8406bab02c9fa738a043e96eee063af47b8fa70be83d5cbce29e9e229357abaaef811c4b3170760c9cdf7d108cb7a17f2010e4dec5c3d3237797f5674bec5715178fea2e4e23f1de3b227db00603414e1706e223ef4578bd177fd0578c266291db847c5cdc1ef3dbf7debeb797cbee7befbdf7debef756eebe7defed7bbb2226fc03fe8100885c3f25cd74f9fea1bb3b0b2056df58d40008dfdc8c5c109a276d3725ba9060a44b93315ef4aa6a72839fd2896800084d773c57772e82e8e203f2472fa30d2c4b48816e6db37d5edc3146bf9883f07b832f649bd1a7e598c32d8bd84714ca7ac5386dbb86ef2acaacd55874c3dc42669bedd46f2cd1f1ea3b1b26cebcba0bafdaac3613328d795d5683452b54c326203c5d228ccefc0ddc680cf9208c8e611816319616c8f952d9f68c6c093a0ebc617160c9d15edbb4ed8cbc140fd2450261d30d5780c610811372bed4105b9acac6afaf3e260298ed48a4e83dd8f4485a84fe1e9012711a97cab80c3c8cd0c74bc5b8bf1ded85589003d5dfa6a21bb7144257058324e595854e0714eed8f4723872bb5b13c40a0988922040a4b65cbc1c36bd1d96d12dcd21a331e47c3baf09c5b1dee2444e0512b2a5f99a0012a409171964bbf59a7d48bace9d040424ea017a171ab13518a879ecd4865bb861ce8688dc18eda07732fce6da41851978f6e70f42657fde55a72093f18a2c73915826c68b6562a9d9821036c3557d570dcba86356e4f3e586b0dfec54553b96511f01413e089b5f0c1dc93e8befb21ac2b6342d69f376ac3b9655777725cb687c5513f478a9f7ce218ffda027c3222682a82a8389205ab07b79a4fea0632ad3f2ed01b83d958913fb160126f211b1edc530ec0a0f104d60a0469322b42864cbabaa890f9a0f127b55316942d6830cbdaa981c210cd9af2a264458435eaf2a26404c7e62ba19191ca1bf884f3a4df482e5a78e1da684742503259e1d13dd703c4d610119394834a97284cfe8a78ec9c2efee9eba8c6719f0b03dbbeadcf08f66a08a0191df27bf1eb58d01945f77512d714485df25b909d0488309448410450f4e637c0ba4dd4eaecf6845ceae639365829cd3731a36ede9b90d9b74f574ae78cee279c4448788ee370c855093a5e90efd8529cd6193c5c1149733616af48a03a6d8d4403492229e8578f609719e83443f188865427f5521274c017154818c511c54c8095340c0163cafe0190aa1f590b54c81e49f1d13f0ea32ca437b39ba9fe9c69369d7e962ed8d67aa7932edcf213743d043f23be4163705f053eaeb2c5f6e72af3d1e197839daf76b9e89c5db33f0785cde3e039b583cf3103705a039e4e68d9f2593c81f374308f8e73be5dbf595d62d6e723f4bdf07d01c4f14a3c6c98c23f58a6e966578cbdf363b910b214f716fefa6522ec0879cb505e95c801fe23ef09e604307e9def297e77d396c37b2bd3ceea5da5b72201f4f3bcb95f6a7baf69a82c4851a995aed2f96059d04e3e455d8a981121d5eb39aaa6209aa01153f2dd82a150edef211c410db2f49f989399825917e388d0cdbdee9c1863dc39524466c555045ca48155b6a6713b6a5e524a0946729ba23863b67c2543b54c586362882da52bbc7cb821d2f0bb6051bf60ceff24142232a880351dbce33d481390f913cbbae5280428376280f0bf5574782f17f8f857c62ebd8629b391663cc307f1816a1e80693c08b97635b3fe69967d876b9e6578c526adce521ac4f97b3e8065bd1cd25f211fd71ba81edac971f91652cff963524106e86ed2c67d9425aae31164783065991d9a02e24fef39707a85fbecfbfaf2316e84bb2a6a8e4a13f245b822e039b485192bcf3519feb39c9ae2de7a19295810e993cf42849dea90fcd43f290f490c4263d41d8d1d4a84e32b00c5c433e9eeda05b103acb164fa53113a29eddcad68a36faca96fab1aacad650e929afb9c0c4f012db970ebb6811468b8de83b333a5880e2dcb545040c9f294f7e5e775cce7e7a3cb604fd821bbc4ee0844777406f61fff94ce421bb302162888c8e3e3dc633cd72c5e102b9c3ed0c5de371f9c7303db3570f5bb110cb1c0251377640e30309acd8800a2cae084a82133c08da7f2de39d10be7d86e68a28574871b511a921462441032858787185052f38b519aa2baea8225d0ef0aa5279f1a157d5154dfc948e840cc60531062f382d3c36b07e3045e3014c4e0b151614162da4ba5edaf3d9e8bd78c5501412beaac6488112c628c2af531083089f7d3ba9ddb734f3ed9d184bf8f6199af69a2d01e05b258613bebd852d59df3d1e23060fc458fd741a4b88e8bc0f88eed01d0650a180768587c31249c213d4490706a84edaaeb0cf640d1e5c39e1f0d458ad56271d1090ea58ebed2586c6417148e1491524271d46ab53fb90d3f544ae30e3f786838e299814519d70d0e1f2d999f9e73af411785427dd1526cdbf7e6a91a1043380564a76390b302ea4d851c268cc4249aae1062a724a31e4d4202986d08234958f0a88955fd764c8409595114fcaaa678b1ec5b1de2a1bedd9b99ec8c74d5eb54a7d567b7674d5f3eb3f62e8d50ebdb3a5d6791d26343aa0b493c656202d2324af92d5d91cc53101c9a6f5fe61a03f4dd25bdbead52f1f72f27951ee650296438fc172e8ea90c3a189723140bf38d5e3d0c3f3eb434e434ead7385d4939eba058a637db6ceafeb0e0a6c23d93a4771ac5f4f247348687226cde7a458c6f2819c5d37d341bb16109107caaf6b2498191755fddb58762049bc4ae2fc97d0bd15b1bc5dba702b6bb3fbe0a76e57587f3872baa604d91591be2bacc7d8005f866d31263d430a2498e0a050a89c937654a4fe748bf42aa3021452df2fd06dd35353c3c3e4d759c8148605ad7171498a21c1f0f5054dc783f3eb33d22546c7eb15d65708393b26724ab9a4653839bbd9fd7633daa8164411d4d3413244e1d303069de282f3eb3333ec6f635655cdf2f9d915d6338d09525b829cebb33fd167ca96deaf4809393b28884dcb1365072d0f9b7a0b9559f7e2978c5f576e79ce782fe8e7fab04ad4043955e5f3eb362d409c18e5e5f0ce4e1455fcbacbcb794a9c288bceeaf06c0f932db1ef6c15bfaa97b3b32bacebb63a3b90cf5767db9d65f29aecec8ece76fbb6c7446777b6a45106f2e1f08e64d3265999f555f270648a091172c68f1aab6011b2224dac667eefbdc7a9b7f3ebb6db15d6ad27e4e3620f6698961c39492498ae260a25dd0c0b2c3ab2abf9992da9d34c167ed9a583819c24128c7459bd22a048576e8822f5eb38440de61581efe2c7fcf8f10ce272c52b5ef1baae8bd3f606548f9c519423677c38cd84ac880f7e6ab8e29f5d01685758c79220e70b122591ddc3a6f6d40be29f2bf3050559d9924a612a6ca50d23e45c2bdb5d79418ac36d767dd8d48fe31ffe79417c6aae7bac23e48cf00989c6c7637434fb8f4be7dbb57b778c0a3990d37d9c4d2a84215daa90d3a30be474274fc876373728332bbb2a54a85055593921a223e4d4a087ceae579ea5413f2f25143dbfee52839035ede91581814fdf7bfa9e3a5b6cb1c5cc0eb70fb06adbadc5cd87aae1864ddb10e244cef7f37eb634239535396a3d6af189ec9d344664848c48daf8f990cc45927aa99d5f7f46a206f386f8242115c8f5456d2fcfd537e78ba93e3da040f2eb302818eb3ef8a99d9d46c70c49f6d6e3c7aec0ce4c243ba74f9cc0f9fde1152021e515f0aa45113993f4351f2314a95fd74830332e4d5863963469bb5d611d4691ad6d8b1a455239729d95fc135596a47a22c9afc33869c3b4a7f51953e4a1d8cdf839b1e8f91055bc907d10f45b2d3e822892653e82c0e1ec699bb325ed39a2c8ebfbf841c996b4c708201f41e06ce9c5471038ff16894eb14f5cfdfab40f4cc121d684ad9a4a955f572bbf3b13a27ebda758f98d57309493227e4223bf92034ab2422ace76dc43e46cc74ab6e3cbd5593d6e27d56754d7b6b3f43d0ee22095617f5a547eda3a8da4713a67923a07e7d93b47674bb393bc922d4dc9e4b99374922da933077150eff868cc425c6419c932ec2d50e4f3e5b21fdb313f7ea82d2d17a3e4e89bda1eea15d98e9fefa658861e363f365004c80c4130ff500f15947a45aefc3c23cf33c823380c8eb59614e9032850a0a0b0eaeeeeb576bbbb6177b7d3482abbfb54aa76565577ab7840e4091428b06c90b11732aa378f649625f8f1181a1d5ad339cd763fb4783f550b171e8ff5158d0c3d316ca947a750e9e9a1f353ea8f12d243ed1a0a347c1033434de45a215777639f578ed019e872e8d97b4ffaecd6a2389edf981df87518373ded3c74eebad1839c51e7e9b248c5e18117b9207f9f4b1b18d6248360520f7766cdc3284fe03c24fd447942899f0ac51f4671f2f373e6a1f7db170a9202e68cf7bbbb8bc6a3d1f1de7bb1d79f947257eebe87ed0df65e0d0d8ca1861ff98f0a27c376ec8ffbb15d0a4c481731640d3f376c69aaeaea07b37c2838c6720b712f6f9fbb97afabe5ef3d4649cb9fe534bc18e3736c751d5bdf8beb41b31d7b67e344ae33333333abcc38c277196bb2f97975987e3ddcb2b1b61ecf2d779bede11ba305b71e36dba16678ab7dd9a647e72246f73553470b5b9ada860e1daf2a33aaf8497a22083fe3fbe0a7bb530c3bd59dea54a73ac526766f772fb176eb93a5bc3a6fa125d5d3dbf4bb1b45e38a63bde110082fa046d2a9eed475a575875e5a525d32b45b6f24bf382cb32996d915c8795dc9ae24ebd96e2ec4f7f0df8e6c70e185d77d0353294ba58a3b3ba3ae2227e7fcf3c9394040bf3b7fe58a4af5522f3575d5556428b2bcdfee86452f30f71487aeebabc885e5d2c876e45b02dd66f987c9602fb678ee71e8eb56cf4ffed9e2070064fce41ff9cb5efce41f7f3daacc978a835e78ddefbdee0dc974ba899c97cfd5a33896899c57cf4585cc76da88a4ed2c18f8fa24f5825f48c6f5faa487347eb95963796733fce5a324e424bd6545e51502335f7f4b32ee654fbd3296b7fc48b77838c1470b8a241f3281640fb95b334c2791ae6b0b39694b21b71c664537a12744f402fb071af09ec4a677c22c7fc1b06ec6ca5b2ec306d6a44ab05cc7965435c694b72c9ab7d65a1c9f1f5eab6265d5bce558bc2c2a6fbd65693710502a5613b24ca315cab46ecbb2ac1717308f1e5dbf7b091227af0d6e1987324dcb4211d01f8012e41402ff05f6ebc505f6cb2fd7b7367dd2967a5508ec35babb6384ecf1da5ed8d75fd8f55755571130a4f07470a738983953e1cd65def89ba6d91ffc9ed96ebbe70761777f368aaaaaa30b8a0bf0dfbf6daaf0d6e7ee6e737f27f73b9a010c1776bd17f782ef716a59584368c5683e9acff2e8665e216b96b56f5f0e6e0839ab21b418428550d7b2a06575db4108a1c516b42c784d219f776a6857e4f3b62c6859b06ffc30626646ad2fb1206ceb8ab0ad2bc2e0c7ba42d615d9801db22e36baa1854108ad2b5e3064b171c10b862c51a689b4acbbfb82218b8dc62cc805a69a83c3bcfbba2ed1cdd511f67b8f61731c49d2334dd3d8c8b6df8ba427fd357729a76c849a9bb9864108c39c2fe7887968838f45aed9c0960028c8d49f03cd7e057a1b7af4cb01519f0af4563fbc50d7e8606167021ee99174ccd0c42023f2d99174b0c2b8a2b61ee3ce902f033598afc750e360b8005fc4c9a038d675446eaa955f8b23e9e86e68611042eb8a9615b564cd5c355fc3323b26020ea0853218daa03fecc85dd6057d6e37b32ba3a6c5e822924f7358ae560e0fa3e801ef31bf2ceb75477d3c9ecfb534078c37ac76d02f918ffdb6460001fef6eb290eb83a5c9816e22bd3342ddb8ba45d8c2d1289b0bf38ac64953ae92f0ae0e2417a39d62714b1b0886e206b2b910f3ec6c5083fbe1a2a8f870534c7ba15ad8201c52183968450bcac90461e40122fe842b5842ea0f8291d8b2e9a8484d005123a90a2575517385da462ba198fe102c94fa72922eb2e35b7b01d3bec56b7385e4eb9a94f5e9db7d4bb3cd4774f2f87fa7bc5a1ccbc7057e7b6bbbb2b8178aa3856b986afc507971edfdb9ccf46faa3ae515221c1d0d4d8f4f0cf5bd8d28d7fde03861864783e03901abef8e7426ec02185f352f8e72f87897ffe946c29f4cf9fce962213275bc2fcf9e351f5bc150fc0d81200b634e551794012b0f284173b04e1044ac0e2f4fc5dd992f6e09f2f4a892d05e09f6f6a4b9a3f5f236bdae73bc49644fe7c916c818417796f69851789442e6fb0c48bdc458403d48b1c664b0678916ba21b91f3913554274df34c74a36559b64591cf74f0d916627ce6305b8a9ff5f07ce621d14dc60425a85328e498e826849911fd12dd4416fe8a52c45f6e896e2e2df95b10bab625251eba0bcc22e8a1c3402d7a4a0b8062e5a1aae96df144cea97b4b915d933b7876178672c4f316362842d57451718329d4a427d1cdcb79d10b1169288af891153b6051250135904fbef0020b25dff3450869f4e1ba823d11a2043d4f921871000f489ee800e1801d524f665002d4932a523f4fa0a41c80ca7922e587d31356242ea20b0946ba4841f253ba88093421c6ba0d29a678118423a4704216320ab144b2ac208b25cf497f3928142a8829764ec0036043eaea150b31a8bc36c515d91053dca08b29be908213e365c1986ec60a357050c54fa7b172541f9de1a8f40cd7653d2c15d18800004000f314002028100e098522b1503c4fe5ed0714000f80984e6c5017cab324086218a410328600420c00048000c00ccdcc28082d636b65f9deedbd57949df6abd2e669f4d6fc3305bf2addea4b43cb9def4170a7fd56502dcfd0435c40c3ee223966a3be56faf2c2cf296aebd855eefccb9cfb8581d3bd14e8b5e56d2d1db7b39ca3d93a213709bacb5ecaca3629ede587eeddb6209bbb141a5013c4e59a8db1a6f82a92546ecc00a7fac64b8655cff8ffa5674785ee1fb1f7331aee93e2808d8738968c725d25aafc3ac3cbd6cd8d67ee5e4ff822c620e3d4bdf9e9ee94a4fbe40e4f3ae81e5c52d1cabf0182f746ac89a96c20f91fc05fede07379303921281829b312f12476f7c8f6d0b3759d9367b0a34c9600f3ba83a8d6e3acada0d4d3dfe60ae48fb158a4b19d06a3c94ba9505a1d4ae8af35a4da3d8c682cfeeb53da5433d6998304a18a5f11dc3e16f0c040b3ae21f78e72a022ceea207d9d0606287ab0c0adfd59d437a095a7901666bf01b2f4085a94918e691c7e412bd85af0d2b0c094e22f9958e7715d415b226c3857172006ae2d4629f391676605f5259d37c83714c7286bd324fc38a10b3c7875d78654d86cf292b62cb0888bf1b01ad514b8d5000b53f1ebf564de95c0006bcd9a3004c2f74bce5a2f18df3348083f7e18ae43108844303a7cbec94d30aba69a0859af89620b81adb7ffd14461a3196300dd137941684ff304dce8996130fdb805a1308f79e155dac436d86c79d25698425379a4dbeae8e250a37167ca4e3b7bb9740242907856931ad74c0f888856a9b24916541ab016e4ad04a424b7a5d68cb702fc6fdb391e8f3fb50eaf440585b14da5d3dc582e45e93a02eb0b6c0a378237a3fcee37af7ee021d9c1836df6ef08e60ca81390869b97a558e705de492ebea259d4adfb50b2b321e1d42222ebbc855a856508f88f9b48c98faf925e0c6daf3101c0ae03cf967fd849ab690225e0548dad435cfba280959d28c4c8c9e93363070eb69c804bac7d6da8744c054284daf9b9b7fab428f30290d56a332727b0015eb5a26d020df72e0d0c058e721ba90bd9177cf4f7270e3f946d7e973e2c86a24def7129eda49725ca5215adc2c03d23cdb01c514a2750e08a4c687a592b996016275e83454b2df232b8c1cf1ff6f2341ac5c370dea8277f5364c508292ca1a4c221ac015e90b32af0cd120e712659b75d293da407770a88f5e6e87b03470b3a77f83313dc9f92e20149e851e4d84b60722a01457c14ead2f9bd3fb3f55e7af60fb5556b3497044f5bda72dc946ccf4181b1c0c1bc6e9e8ae70a16d14aa8c4a20033944be4b100c64cad09bd5a768f88d0b19a27d82b575aae340f02ce3528b45541f0bda5f21538ce37dfab9cde897b591c4e4a035dcbe95203070ea79b769d1f132b68b2c473c4b842c58892878d9bec09ade2088b80bd2b143a41a568efc5f6cb6523c1b69b8536fd5954cb2ae566412f854b5b7875b06be16d6cbbb2054823b086db67413b8cb8dd35d0a890cbc245976eda2afeeee4b8993941a546a14d5553b2bb66450dcdbdb1bf14ace27f553cde422bc6fc1e859a4d7ef5678db0eb1e8c7cfbcb77e64343195e01980c391312a66f182d7365e422c19d5cb82f76cf7c9c7433e32c9fbfcf93e9d4be08c1f73c4cb34b0c5420a7ff89cf2ef2e693160d15987571ae068fb281e414c2128b459ab55f34ed0150d149c10dddacf868aec849596a4e709e96176a80b68f2cf0f4aebfbe38d8e963fd28eb94bc008151164decc5db5b3289309237b7646fc5eefc2a152bad2944336b5ff4bee614e93ab4a1a10cf72b4f676a73a63e79012b10e9e72d1e5d238b751ed2d0f9133d9ac3b670aff6a8a788d0784b782874701531e29e8cae834e7121d23fc9368404235c27d6e59f85dde1626994c294dc483922a6392fc8656d3ee550280ea84bcf6e27043b60b9db66629123ef175d9891ab8561da92943008b078f55e8c5dac6290b0ef45a8e48746bf17145e5a79e2ed0de6b12567667fae12c2f94afd2951cc8d3e1a297e197cbc07ee0f5936fe143a584975b9d5c35b4762f748cb4736b54b853188f7c15249d2ca4b26a43f2c695b565121596f080aaa25d596fdba60d59bfa67846e05c3ae643ba20e9a5769d0841679dc5fe821b8e2bb77aa31fda565bcc9b0770fbeee65ad28754df0bd1381738aff807efe9e7b273ef8de9f7c3fe6ad3f4ddf0fd601d7daf7a39edff115ed8db47e5fe1fd1875c9b61f51134876cbd21574fc21fe16f3dceaf7534e4cb9357decaf1ecd6307c0424eb81425a05c13170b40aa25a0bc670f14d90a05ed839877312bef5cadb75992e690941b9ee96be870ac99dedf60d4592a63c2efc4d297caec35f7f926e5e784e10396e3faa7b8fc306727c86a771b87e795768aadd05d0a26b9ca7663deb50069b72d5a6f1ef78a816b76619b82a5b67e98f2d31885ce538c26e14b1981d3d3f9a79be5c9435ea8f4f515202228c6b2c981375a40d85941516e3ee14713fa084b5a95fe56fcd911c4d6c52e845b5af075792598e95dc24cf9565ade18a60d9833f664f02f7a657077cfa3e12f15f53a63dc1026502fcbbb5a84dabe9dadc8188bf824e6bd8d91d25f0a909fe09c7db9c7bd19ee7e8c3175f350212fd08e195f0a6c9541f12c0661eea5551dfb5dcafd4ecad3e5379efff3d5f6caa5e5b27d9548875891bc52a6ca694c366a11caab7e5fb8025e7ee824145c6e35d2cc73096e11880e80f2212b261e2c0759d91a209b654c89fb478e2b93fd0c5b2c1abb093e83d92d39a6828bb243b57db980a4d6e66fa6e1d4a9a34b8e4ba9db89c699dd812570e8a91f48854e91fb670b64d8964ac8c9835867ab82ade6ca10511d888180a93654e77ab9b638791b1f79c676d9eb0c042ec65d568f91b7ab729022f99f5d252b2c98d03cbbdc319998f8f6fa2cbf208f3006a235573b5d944c926affd3e31c17ba797714c9fafad8dc2a9a1e28edde943c0182f385bcb02c27efcf510584ac1f510eae09852c6fc7fc0971cfebabfd50f385fa72cfe52081e320728f682699f88932cfb1b72ea9a2b2652a4284be50d263479e7fca3f9d812556f68bec0336f1968401851197146033e454acdce2dd1d8fa17cb77e75cccd4dde28c69174bc550e21a4e568fd64576bbcc8bfac8c780d7d79af70431155dc8163fc158e98345e38d9d05fcbeb3a2e84576370558b31064ad107fbf2909949d371bf4fc1b277d708fd850e40ef05f690fcd7589919423a101fe965ddaa90cba2b65899d9e7e6ffb3c99ad1bdb6a8182f44c840a0defedf3f98eda1ebd1e945ca95303fe9cadeef14f81be7168d9fa2ce5176de1391b42315091c28605b0003e86c43e4c2223e254db08f581132f9ffca84bc10864bdf667bed6c10c9517f8d441a12d60fb4a5f911dd889dcb5e239ff06d93a06599f2ad8cc00cb7327b63caad73005d0415d44037550a890d20d2808f8e62adc42a76d02b167d36e890ff30c6da8ffa5fc6292d3a1a0b360343825aa35d657b641e5ceeabeb3d7bb964515be0ea8518fa109afcd30836940075bd0fa71bffaad7cfb280be22ed8e8c2314b22ad018436ab1867042ecc835ae71a11d36b9f76d1cdd005f384754a9079a009ccfe3b5fc714bb64b658dc4215ceb05e598583d995add72f7b892215f70b117ccb40c3aa35cd0286e98d0f09e34ca42a52e9ec016d260d4f7cb4161f97b682f8e7eb08ac5446460e8cda2c0b487515cc6511226d676a3524a2b785dd3320840e121c59bae2f29f4b6a2df571701374cf1ab840bbdda64f4da172e1da645f272118f03cdb9314dd0d9860980a3279888e394df6e29072d1ea211759ab6853e046755ad961fa9f381cef5d5827ae84f8810565a36529e60582f42440ddee7e0d17a0a566022faae8e2cc7f01f32a9a3c277613f627a124f2c8311b48cf09274f2ff15894a396eb20c24cd543f9067715ea65b7eb24579a4931e083e8ea8a122070f57c0479ee537838ff2a027ca4b9ea7b651acdc983ab27aac47f9c376103a8755784f835a4ff5798f842ba059ad315342bcadbe3cbed77af7cbcf576aeded3370615a7fe445b7262b536c9365d46bc37b4a988342aed0cbfe9a92bfe990064ca7da006e927e4308a33bd485e8243d4a10b8d47d7a773d35bd750b1ac84ae520cba9168ec43cca5f128584de6101e4a72ad34ca0bc514f481195d965fb8bb82c358be31a19a74eabc882678640e384f7f8ccad5ab6b7c495d75fe4406ceaf4b3e63fc6f552b7873a39500069c4597684b80745bd57ce88402afc27e6c71a6ffc295d62b96aab337d250623e9daec6747a3b874d0a4a6ecf7c6cb82247fa74806be67f72dcc0450744dd301adaf5769e66b637d264d5e3dab310624817c23661f52ace288bf53cba1d71c70cfb68327fb3e5b96bc947d5c1a024e3babe5c70634d83fc1ebc6b062e015835e44243f9aeaca0f18949fa8729929c211aa4dd77ba6fef5e7e19f7234d379b3816e8fd27ef1fc89abfa29e1f2daa9c67ce4f227b0463b3fffd6369c2e743993bfb6e2cc8193ef2b0aaa5d4c6dd54ebeae8f3170e674a3c8ffffad79b11787eb2c723c9f846b82a922cfc88676d37da014413ff12193c5e6b6fd753cb529e7470ebf9cbe67b028ae33d52314c75dbe79c5ae2d2798de5e5f7bd7dbc67392a235e0e4b6ed60e0f634bbf9207b9ac18d3d85bd63e8d5555ebdaeb6cd93ca114e0c4ecfdb248c998919e2504a5f9c2439681e0d9b135e202494b382bd36ced7d969fcd3c225b9345a1ca825a50ef4a9978690de31d8e150364f66c9773faf6a8c0db442d9409a6b16507def6ed777f3d976dfe9be4b2085729c79726003a2bd239866d8173c86137b75d9dae520612ff924695ba31f390ed82fd2e389785a03c4d488d2f65cf97658672f291087d907540c70b2fc979227db772bac7b8d196370440c3951921535183144c4c36eb556eb91c519cdaf8e84ec795713f0b4a3d0e4be5e9ebec79c17f542d8a66234b84451d47fd027b40f13292431ed6c7c2924c0e6e0a2982b20ea7f6af0628635d6826cf7ba749609ba4d0e96235b71fefa4c2c168d6bc7cd03b97e151d6b788672ed239cb02802f2560a84940cc811b4a05b95d1663d38553d598ed70a254869d19c5eca0d52e6534078bcd6d42b00613cc9592ce9c8188322985137ea98a64b3a264bae2e291e2cbaf905a8578875d24c6a8ec22bbcad4add43059b51453517c5daeb3827f72756c915df2274511c818b2c798a7a5eaed70428a8e5e3596681644c7ce5b3b803d28c5bc72c2c049c6b15932d857cc96b86641968b11c92ebc6ed0d1c07becda4fc01bc66a493b9a20b46c3a71f7c6a3abfa214321d78c461aba60858054668f03336373458a865b8f804df505afe53474c340d8adae4c9cc617413a10d0ac46b53472b4e0e81afd1739a611f8a881955f2631c979282332ec93a51d976103d7da742e89e7f882304a5cd3e4176a807eab17a527a28bd6821112b80217d9aa796523c8b6553fdc4f47bf9896ac069415e8251b2c5f45980378ca0374c78537862f74709f6e35650eb7442324a19ea2fe0c0fa477a450b45038eb18cfb0a59884589f58929c738cb008dce9a0b151ebfc05b5d70d13a38541bd4339283108efe1fb3adb91216a394028b203dda64f074dc184c2aa587a22daf4e740b341deb3e1432599ae3200e96c3be40358822cc523e4e00cd5167f7e8e9430c3d01be53254b7a62927640b283c8eac709c219da51cd806ba79266129c0b42ed6736c85f5cdaa03651af2a902ffff684c6f280517a2881e1538d878eb837b8ca44ff14c1e5cf100d4a7720e900585560ff6c97dfe8915545f3cb106576156354ba8a1b2f1efc8495a3c59eacf36914915a3c3f5081fb2e4a80c90a6c76d8300201862b0a41960c5877e2ffb83438aa56e2cf8ccbd69a7a5abc890f0626220c6b4fa397e191f51c709e2f084a602913aae19c4ac7ef9a9f5bcb9166fa1a8f89abd59c8c7a52358b315f54f414d7e6d34575201bd1a4a640f9bed2d2b54d33ee1642ffe777d4d059400fa7f2b50acb5e732afa16948a2aee3231475d67a85d72a052f1a51563e4bb641d562bbdd5a636b3c3c750119c0b11dc5110fccbc43877f9d853b836d206b766d969cd8270d6368cf828b3c87f8004bc7cd674e8b739e8a5462a874e4b0ab0e6797e9b9638219c2423083e5111bd47c173fb266ec8a02ed32a18a26ffda3f317fa6cb505bc689c6d93fb7113827fbf0d20a1e5c46148aa6eacb96171981a42ffdf41daf951bca5a7305ec14d00595d8d5584c5f395b5bfddacfb55925f40a322c5d80412cf79b088305ae52e8e782e862a7d707d6832e41c6e8c984f804e88438641704812ece4be3532aed6cbebfe0b1367bd83be0ab5b1bad84abed07be2f85d6c05c5dafbcc3064052a46ddc964fb86aa298c197a1dc1e16eb63cbc9da1da5c0a3b2bb8f75f59894d2b00619330b649b94e9fa0e08bf437e43f48f14409f1152739e89b154dd70af1d08b2cd777208d0930b3f2bb3d45929455ebe5dd3f8cfbe9b99db3118349b7520173b0e0e51c5abd72b88eca207fcb941daf8b89f8521607730f49733704899c39a683082a8f972ae331a7ead77e6360d32a07c12435830f6d6c582b0826e64241a324413e7cd498b38dbefef8dac596719d445bf2a9996ab10cee8b384f882c156e59247f2f9efbc49330513e1df6b61fb20222da2841c020a8a60ac6649f5807b7890c53b09fdb368d606843598e62b57601bf91fec5c7f347509c44c0b898ab00a3241f249c4c4f54419c526aac30143896814c88f8ab94ee39952f73ca8ae235ac251f8d1760e97d40bc823565e189245e8731c99cf877bc0cdbe4e3f68270a4335f9363c81580bbf930cb7086f5dafc0cdaac8af3d233b99b2d1cd276e689b031ab92566a8587de6c426a7f9cd6513e18374be575c47598741d81452b10652562915256372d18cecfcdd067cd004bddccf1849b846bae9e6f4f55aaf6669626c4ef74cb23e028e767ac2474def7e2b1ffe30d13421fe0e2004e7fab82355c1cd6d73fd10dc7e932d3bef32b70f5bbea64bbb462cda93cae13c254331e9652b61d4b51420dcd1a3491c9634700403828645dc9eff36018ad4fec30193c1ac1fab12e03d85c46657fe11abab4b4b1a4f5201c3d9498052e5ae554d21854ea14161c5367303d03b29adfc37478577841ee51b90ec64703d1ec225e75100bb8cf8a7f2021086dd8912ba1350c9cc744857bfdfc09e7d4d624768d72eab65928c0436910a544e8bf8118d93616b03c80636190bef6998bf1d0abb9f1aa031a6e94a9b8a4126606f41148f31be3837d3efa207176aa6c63ef180fc1ec6e8973532ae7ede5201519e22beed58e055ad0fd207af04e37c0ed40a3ffd4f1b851c3a0823b62669335d8e9e9f162efd86111e994e6357db66c5f888297b354c3ec9a761258ed21bcc4f7d83a0a601f46f5d2314b44c6c261c798e802a9ccb0856655ea96616360a3d89ee057b9fcb0f0e48505e8ef0669e89eb143bd3266c6230cdc1a2fb724a7cc87d2d5edac572436c22ce6816dea436dfff3669e0558a90a0c14546754a72ffa3619f272bda7974c86316601a97080318793b5fae067fa452913b5486212f6b8d2ec53c885eeb505d1459929a9baebeb8185445e67aaf220ab15e8188643acc570e09205d2f1233ccb13b7ef94a55aaa226d5438a6339b2afb9e14d10b64a64e3b7b9630f757e6d854066282b25db01946593f16fe5b743764871c091a433296f706b44ab97a1a0b755ffc00a2af384e6440c2258d33f11885f442560a884647199ec34b0ee47e1ce7e41044488b414605ab685125a4f2da50a70e73b395eb767e6ecaa044486b3cd72be14d27de408990c99c53438ddedc623ba09698e7fabd7f0fab477b0f5d44aa7738c5ba021145cd0d99b9ca891ecf2e3abbde09f7315a2c0b3d51d103e69261285e7d391ace595a4dd130c264b0a608904f389e6c0787ae71332fd7c7fc5943ca2b98f861c467e7bc517871b9a42de1683978c90e602dbdacbb5b5ad02fa2df31c7c7a50f83a9f5566bf26687a1aa49d2fb50d593795935c9540f15cc103756dc1093e79ca5de159d5a226c50686a40a35e19731296a6be8c808bc447d20cc389ba245ace28e0948e60e3024d6ef858ed3d0a1ba18a5373b90583ef7a4738e512c7f64146cdee440810532bce069d63e317bcead1adae1ef912acc720abff667b1c8631e6d798eaa51c3883a78a61b5dae17248f2edde92c22c9eea7ec3bb0c3f8d9d9cced7890d6e8a706950891ddbdd09780f1fe8cefa540af291a646a46360f57906c9cde32311a83269b4106c64aa8b1ce350c2199fa0d353be3ba41e47ad173fa6a98dc765694939616ce56da7e3e3ee182ed3dcb9afed410f30d1426803e8a24d4cb0761b79bef18637982974e303aee6bf4a8f9805f1c9e606e7a723dcafa7d8b7be398f1548d90eb244bf379aa8bdcef802af2ce777d494deb2f1bf0860b6ffeec8e5374fcc7240a22d351a55ff3ea193fbb6dd2af0b91d842d5f4aa0dcd5904ad9e4ab89ae9d70e98896267b51f87779dec0e4dc51d8f893ff1b80dcbead8def971f1b193d55f514d1f5e54b680542648428bd06b47461c12063272b498a4919a8e5c90f8c051bd1055345dc164b97ea33715668f5dbfeff934ef2b4a62c44d6c60b497a614bcd6df20dcca1a23af93512707a81f7a550322ae8b734cc3585fa9185ee81a1e67281bd430c638f20b81624dff320dad5ae20a0b8651972ba263a6cb4f3581aec95c9c8af1159f3bc0c6b70c6bcc9c939b51800d1ab09f1ef524f320560e0f6503e645d855232c7fab30d873aed6e526a58d47797f85d5524134dc4ad2a32027e165c2dc3698e0b3d427e02492f774b569373fe0f2fe200d1727a908968cfa53d22e0f620fff46a14919bb391b594894ec6fe8ec0eae3a695b39661139f2eb1aa22bd8aef38fb16d401eea1149c5da2340e0d2ac67dbaca984230b173120be04adc26938e933b971be79746641bb1dd8481d6a221fd28c1e6b84c2325c7f9e2c5e30a80441614cc1b5a1d35536f283904d28c3ff33d3cfccc0bae738adb53817a0c203a938d03f45e95a9207b9b396d421a22763507c6bb070a8b051acb1072dbe6bebf31f7707ccd99fcb171124c640d3df9a11f3e08b28200521007224d300db92150d953e7e9679b187e41c24728b6c228e0f0faf4c3af0dc330481151bef0fb407edf6b557e1d5437f9df6e090cc8ec73196eaefcea2d25f3392c4d263c41fc4fc7ce0f2dffa706f0938085a11fa646c75854f072eed0c5281efcb94d4b29ff967c50ccbd44d14ba29bc8ae4bdf0609d2e2c364f7df162bdde8e408f279514830610c391528fc11061d6a3c8abd6a288d538a7d8b78495547fa452bfc27a17021d15947abe07079cd64e8716b3d90caf23629af0e23dcf3b0a21be900a3a15178be54d40e00a982e2f5dd7d70ec202f1e77044df64640f5a10a356f714b57b8e8cb2de1df0e82a21a79570dd3ac40942acb1593592ce23ccf1834c622b0c70366522ade85612e5be99efd0f4bbed686760b7fa8bb684e362836490a1eeb3297f94e74f47b07d7314543370129026bae7fa244d3c1c3fd1f185e9396382ce1b8bc1e6902bd7850178cf405d48ed50851a392faf618ae1d4538e4288a18828cd5816b32f23d33b86c5189d362ee726e9d465932ac72f22bb4c30898d3ae6c9d57d4c6ba46e4dc2cea145e129481390a0f50e1450784ed1064c5224a0cc3a6d55877022568dcf8b3f41c2dd76468a240556d68c2938240b801f3b2ce624591edcde940114838325b240032b73a0fdb1c0ef7ec7bb00f13d0c2459152801305eab725eccb3391e778c2d7a1eee9b161ae28443d1c6c7d4c13053bd9782fa3f2c01b91d042617aad81a1c6845f950073c714e2ebf7b645e1a90745a7c9abfa9ee4fcbbbd37b4f9072c8b8135ca27c170677d0cd8dcb096d4e4743cb023bdc2b7b1a3ab8052875043ddb08b25ea8b1a429bd012caf6f99fca7442eb60a9b0bfa4498c70ebf7c1df7bc3f674742d338021ff1c7d9182298d60c1da6bb2283709fc3b5332e89c521b8ed8a83301cccc670458e427c20a1532ebc1314b4001487bc4391c20dc04585c9f8ab90742f845cde27f0799bf0b446316fe2b27d29d85c081b410309675cebc61c6e651b8d11c73e8b4ca97435a51e5cc5f4515b6e331ded9b8b6a5e5fa960b7c02b968a83cee0bf33b0e78f3d39c72c10e20ddcabd758eb08f2a167c1de10f70289e26708fc257a90d6941435385f3e643c5a7890f7f27d0a0cb6738f3b80ddae380b53858b41e71e0451aa135d1a16cf26c2badcfef89c75adaa1c385f4db3acebf00476703e92cc2e15bf02dc18f1d4a97df4cce5c51bdaeb871b0f9b10a7e8842ba32e3cab45e71083ae88f2d2b4585423364ea0c0135d5ff6f120d1debff8966c1919c390e3922ca323f160e676fe9005db4c81bc81c1f094a22e9f04954ea7f44ff38c6b19b64f9199e082e84ae18a3c2e1f7c8ff873516d382b6dfd6a8aa07173bb7685664c308152e26b84a838d74c0b41582f2722dc1532e147feefe724baa04642b384ffef511ad1f9e3bd31987964148b6619647fe10a5cc2c33e469b79a55d5fb8d57cef34d3ba4445d701108d1c9977eaeadcf8f1165e111d1e441f77c38629596aaa97db17952e9af73ef49409bff0d588e97e4a3ecb229d7a3a951c00167226e64f1edd719cb21b3faab93b017f3c3297553ddf833c3b9db9ff32a0ab599a164fa74425b2dfcd3c07650a362df9c252be59bb6b582fd867cb68e53141e8b8c6e5e7955a8fe8039a1306bb5d1e8e82c82ff5717ed8ad65456ee26991310cc3459f44fcaa82d0e1dd4ed15e93f28553a474efe83e0eb5c6d800cbf0d27ad520b48926daa29f5c4a94a8fafe9238fac31bd05c6c3126eb4bd8fc761a712c754f27887f54a8f546edae7b99e85a9ee1f1278ca88fa576aeeac4cba101f3b8be68c43f374fee1957d2fbd946f9203334c1fe845a2dedf40ce077571e92c06a571e38cc9843a0e2d81dfb72e2affd13abc1adbe59da3f9f65b03f866b27c168aa045540c2a6fb00d0bf2e6e67872133d4ea5af7c206fdd3930398eb65b98a26c8878f856c1c4f9a4377767e32e665f99797a617784a8432351f2b053ce6aa1a1eab752dfc56b0fd413acf48efdf19549e80688cb2f55ab222273f7d85b3633d56e072160d5202df7348de13f5a7e485a9d4973e518d8f15fa0b090e214970e46c1669d1ec0fba48c9498e20728756bb4151df1044b7f9063c88113132ac016017c2825984297695db30fe422e0b4ecb784a0cf234dd530b385b3f889d4f03938db0b04641d45f746fddad7894156d03b949808f04a3ed0593584a94d004f1858aa9908c720060473d462841b7daacab876741eba3ae7952bda29b44bf987164e05508fe0f7e4a5c9fb0cbe11ad2c06d30892fb74ef0008341c1415bdfe2dfaa52c190a5217d9a3d0418521d5a02cc0878b7c3bbdd5d1a93bd0cca63ec4e196ec909bccca1a791c8437368dd0f26f8368be5164d9ffc495ccb4d3cbac040bba30486d8c4a415c1e7cd053e9688843f817393c1f2c2029029c7c9508d70f82c64e86b972262908ba30a040c3decef16a797d69a3fe89efbc06320e91bb9f6db3dd7defcb8902e029beeee9f081275ea82e88a2401e529a4cda78ce32965b3f3ba64da14655b6725f3e92dee39e171c9c05eee486a0b971b12dd408ec7efd6033f22d3bffe875c3eefe9f0d5b478fc1cc111a4397c7bd92c284d2ac44abe8d9a1cb0f3bfeab315976995c56d6a39f4fd806e068140884cdfde50501adf9d00dff533b14ba273da2b31fab317ac174def4dc57556cf7921caff733f080327ad36cacd5e1a068c0a8b48002a4b8e4debc8c58f7d24fc804aba91402f747211af62170cf8e5b7d8caa3edceec3e44124b0dfb0d0394331cba99ec344cf2e47ca3391ab5076af2ea320f765a4c04c56d56f00e58479441752e26dae2d37861716220f73026645dab2c68570a039540bd7ac8360a091f99273d9346e0ceee49e731015c6bc381496bd830714dac4d1b4253aa533577d134f49cd231fa522704b5011d06e71713d2fde8f307b4e077a94103ca230806347c640444860630b18f44f034bd65186290e9352b0a157a8e2450fd575ff48104f8a30975e0445b6b68c68eb08dcb8b19300c3a01a79650469f29b8653fbea0c954e3d591d15712ae1a015688710e7120359e094cf18d4bc5299840bf6a58a80717daa19a1944eb4bc923329d92550bc79e5802cb4d1d300ca9abe8ec99868dabfb9ed150d93e2b5345696be4de50052a35b3e2396efefc12c50799e1298c29a7e7d67a9df51179db2f19a926854bf7c42fec93a275dbd80edf4b8acb0cd35603e1fd4b540346a1a81d363aa8df80b2d283e64018efc08f3d3af5dd11355426d014a2ac9f4ea4c54ca8c440adf0578fab9fabf955ca16bd054e7de6bfce1b29e6b21ed290300114bd0c2404966914d696ac5f238389af9e7a22ec20d341518a063dbb2703c786d0d8e46bbdd21a349be27bfde0f31ea77d8e9f97acc4f7e35485e285cafa8a825e1d4befe43959054b4f0b462525bfadb667e675accf11fb3151d753b729ef48b40f256323600bcf53d4f4d0ac28689cbfa8205cf97524f3fb1f4fdfcb1f12e1badc02d796c3645771699551260e5d173fe241f7a572b0035339e13942bee08c0ee07cf1fde6b4066cf471268dc90d1d3236ea709a19382dbecbbd5bb731781b6c6873e99f0735bcb61a911b475a06e325d0845552411a8eb89cb499f49a48baae83bb471fa617977c9f40daf71238bf1abb41ebc015b3fa0f818e6203c1f2aacd9427d3ab207fd56f5038b858429f0ab556c94035c9488284d08a78fb150910729f3711aa360adb29db85eaefe8c596a61020eccc7ff17cadd054e621a87afbad11f87709c77472240e3176ce1579dbd9920883dbde10b70f8d180205dc10dec95414c4fc7340d52d8945eeea3ed08806e5441e2a0ca6546e6cccc104432153d67792498a678ab0d511b325050d691e767a16642d243fe54bdbf6585e14cdb29b571820b8b705ddc7a3e1de5ae16a98c9020fff0386582e70393233e5bdea631a28d47c7190611bb11e0e634c651e1078a4760c624babfe3a6b394b923b8060d9a7e479d47f88d8c754411f2efced384c34bd13dde13493b74926bfa69f22e156406159fb36c6e1bb668202ca62f772f2d077868d44aee23bd4a1a2498af8b38874523367d957bed2e9ceec8c28e14bd43bebeecfc207c0c1d2ca5b4effc7421e890ede6ca22cddf3683cc68e64a1b2dd696357cb5379c2dc56e5bb658a5ed9dcb9f0fdc5896a704e0a3a16a5ddb29e8922ba0ecc217481d312bd686440f69740a342140ef1e3827dc490f5a0075c431619c2c81b21b3e68f13372bbf9eb3c83b1b0f529455a0e8afcebf3665cd2c7bcc882ef7aa02bd26d97fdca88ef089b9a30c5a7ba9179e8af2b4d58f5075df584d10d0c9722b83984cdb5996dd00a231c130f1614b044b9d38ec58ede7d993e507f0deda011a9d49943f81cffba678f403078470089e669631b65ab790202e7d616030d00400e48387a479fe0c270b1bf3e245af889c7a5f464c36efe63beb85c354e329786a095541c3a87407e82bded3ff8f5545d5b15fd8199fc9942b7e3ff704bb60ea3fb5012027ebee2dc645e16017de79dde8d2fdc3451d0c4963a0242043b161b479cdc4e9c9c69b815a220abc9133a74ad47077486e240b26fd4ef5ea014ae8200d33d10a5aea61bbd5df2943640cd8be40e13c0617d309771b8ac56a5fc40d4d2b92ae4dd2bf6f4a0912a761daba652bed351c7f7fb77d9015cfc0d11ff16c6e7d56e994b9d3e9b9a535397520b7b7eab3536b8ede81af676206228703101126ca3856f6d15d37a5cdc8c60778a16ef25489646f0b9cfc01adc5e590edca0bd94b65e8193873f502fc8ace70d48dc73c48dc356bf05801b1ac67ee81775cb9c6d405490dba3dced9b8a3392e0994332648f7f8c76830ccb6089dd890192c23655badc4ba3ee73e1ed4138a03da94fde87c24721fbc46edcf42f087d9f57403818c5016844ac6f3af66455b24cdcd8b7d9fa8d211ab6e78ac914cb249e91087133a0d9d0ea77a3da7d507a1112531e33337c34d2b0da4134feab903e33d7c536b43b1ec6d3750512b7a85832641aeed96d511df3a30dd4652ff20deec72bdf1cf8e8ba7838add156d5303ca1470ace055c263ef6ae300b1385e8fb9cf1c310e33ba941b1f8ff86f1aecce5be806185c73b52316315d3cde00fd9909649848bf3b2b11234bed850b286776e0a608a2b0b198f40320c8b14c7707675bb6bc8fddf39153d024120afdbe88164384576c705d2a1efe50609b7214b2684e8d22129c547daced52ee9d83bb5172698233b91c0215990880a3fbb4ec4a45c205a347c3b5d29ca45ac69ce7805270e3e689adcf9e96ad325f00aa90869e41804fb05873f1cc2aeb0f0df693001ed075465fcf042e2afee73f2bc133be8bd2c63533f1f31018870e66b17dd45beda74b0ad8419caee28399c7c88eedfbfaf01e3dd37a1f513867f75b9b54edf52c36980214206d8f01a87f60524ff51c012c2882c1f5625a9bfaddd4cdd2be07dfd7f55cbc22608205be56b434cfd26330ae385283d5d1f10be545778184c74a77d035211dcb0b42ed8f444c8442fbf332b9e5c1134bd773c105ccff556b52268fdef9afc654933abbaadac760434eee14e4030d909c1d91a330c5136afdf420faa09db4fdd2d77ffe89fbffd5bc87dba1752fb82eb61c17adddac016b2ea3fdf6a99ad25fd81d302b472d200acd436875cc3596603bcaab41a07c1c2b374241b32f37827cdf8bdfbf14cb336935437ab08e718872fb036ea0d913fc32d3d9d6e56661a539d4daa8e1ad4ea7c95c032391f5a4158dc32a59f5d2bf0fd88c58ade5826db1dd8135094468e6f1ac36c08d3ed9ce2c958e6ac81f1fd3e2296eb1d9fc882ea6e1f6ad0b128c11fbe9299730ad198a31e395d43adf92e324d5cf4fd141b16e697c14c43fbf6d22be6349836612e770ee0f70756f9092707c3a5b4274027289ca82951b560946ae6e80b3ecde60b194f5c2ff292b1d0bd986c0ffd96e5350597a2c40be8f24020549ad8705b2c0460a1c533d512c3138a4f846473f93c888708d591d14d94cb94750190ecc3f17aad80a424075ca435888e14d2b60ad8491135eba76b1e7daa6ec87b8f19e597b8b1f78719444723759f2a608cf3ec59b8b7584653e3311fced03fc61805884b3d0606a618383d5145e9a30c085d9d482baffc3476131f933b63a1b88f8f7104667d2b28457c42fdc34ff23e23e36dbf1103deaa1111b72e6832a3461ce17cd020d64809b526ead509f9588addb2b8ffe9eb51bf8b0786f6e0a6da650f6960b129f001a69bd499538ee0ebed6cb585d9eb1d56ad194736f3e21389089bfe72b2b1f31d37541ec2bbded7452fc083413631def304422655986ecac19555c224b1b1b7c0722ad379d7e7e15a8d916676e70ccb41c78c22b6c69065e78be41f532bcf7b204f8e9802a70930cd24576be5c0dc89e5c23d55b141318b71d4eb9ce369c8fffe5ec01826c2904ffc53e8d46a471c800274a29149b6086fa8d8c1a0c397ed685282843fc4a35f491f70a9dffe2c4f8edaaa808d02d984c90c1dadc3aff9ebced30772c285393329ca4cb79a295ba6b1c4834dc2ba628f981f712acfd98d20dbfa1e97c5001995d001d8a840a60fb06f3d402b26309d51b538253fcf5f1ef25949c90890b847992d9aceed4d1522807f5dd539d902af9d13c1d4103cf72d45059d9af2a6a90139860d3e736c52c542303d7cefbc66797066a6a4532a2c812155619df5633875c325efe4a557772f023bb92ea72c4a44b12c1934a8c6e1af196ffc9d7a434f1457494e8a567fa012b7a592a9809af5dd51ea307495be4031196b6afbf47106e5b9b3073e2b4ccbea232a913d08382d63a0362f03c0307e581c927d8594d228c6b0a2748c5260c0cbd535685d3ac304a2cef59b8c0a12a7fd77be35276d30e11a0ffbc1f3d09aecd8d29f4f7a01cd0eacc2fb0c52fc250283f3e877bca7ac813560f84e2789df495dfff0e330cf9dc66431d3a1f9f3cae6091e8810224e08c3bcdc1278ff40f72904165d901bd470ab01347e797fe20b810d3aa208a426d4c0fd1a61c169bea1e10ae4465894bfe5274d4a858a170e572c9637688ab5adb641b96120d2616815f567631ae4971c8bef7ac1378651a227506047e9af2f32c1c48910f8a258e2ebbcd2058a9655bd56fac6381469715a67f8459c501379bb47d888ff8453b5ed1f76d7cc5adc030b1e81876806d4115af28210580ea51069906dbf3e40cec3925e0cf4afc5f76d88eaa3e2503468b46986aee7105029e98a02532fbd086819921c438d2db4bb193a5b054d91256336484a65c048584caee22f833e1421cce20b0e13dcf1f16927625c9fbd1cdf6bd5db47bbaff3b3c9989cec607ec3fa049e5e2c4c84a875e287f87b62843c37555294dfee16c9da0457d36f3b7a48d12d765620bc2462060efd479e5525616c990e54e3da3406dd3e0f7afa872ecc4d4f50ff09f798148ef4f5ce2d9dae0ac96520f091b5d5a3204c0502e14ac617c91c51027be55d2b96a1077739b8ef88b16848aeaef2ddae67058bf45f053f0138da7bc5c0b98a244d740f49c13f927675f5bf3bde3fe7ce502bda68096fe7e96f8b3b3be09bd30f7c9f4ea1f538dc3cd8bf2bc3536ff9d172ec4df0d0f796bf92c62ce3de1d395b397d623a5f2c6e07e9d55d8f73a1a8a021f4f7e7c098b7d7b5b69eb7944ff7248467918702efe0a4efe8a460b60eadd5dbc8a262c8f959a8460dcab2520a450b36818e1cca75890a177a64c1b86f276c137c533515076c411c6a1d11f7f0c049351a45be1857034b35b2b3978a44907485f9a4c1bd1837fc74f0774ce4c085c1162df02451b2483a9b3394d249c5c63b75e7258d02618484ad5673600a1f0a0c60d616e120d325bc599101138b4eec64804d33e1126029114a17a810ce98e0f34c07917c0521496419de8687fe8c886ab734ed040502c960ddb27285380c04607c03ecdc9413c2ba40955e58aae80547cc382b869d23f15ab07b8b29983ff8819616eaeff5ab8168bcef231435a772402240812153bc21769d1854d935a55014914119f74367aba18ee68cda88718f9ec49f74bc08be6ed85badf19948da9e891c1cc4412aa29a2f1b951a1c3ba42e702eaec1c855504b29fe874295afdb38342fae937404f58d3ba38fc3500b628fcefaeb44511390a0ae32e2283ee95a5c7a853ab759fb0f8c5c8ba8a7047c9f08311930f0c1e1c46d049bdf04f737161e1da288bb4def1f03684f963d0d5aafd790f674a72e4a94dd6adac625e67779defd5e828bd4e2cbeae9712d9b78214ad953c10f7b77bb21acbd400498ab6af7adefc7cca990aed5e9129a1c21518df1df3d2c262580d1e575bb37ccf354b8d104923ea88be44fecab0282e13d2858682124594ee5371ffe10ae4fc21c0805ad8329118354769b9710967315daef3c217cf2fb0328301cea49a352eb66c64a6503d3881993b42a9b62c8f5701bbf235e0053310ab64f38b507e41871f6089f4d558a58279e1a89baa6bec99223d982fefdac35d0ea42080d2b4714bd201b837220c4b819557953f4f7683a2db7e035771f05bbdd94fc2162dc3c330394fc75538275d3f9a658cfb99c9a4661e7e5024501616654de947a2d0617549085d1851bec328396f55c126a3b0fe6fd502e555d7e2805a62a51643e0d627eb47c3565142c1bf01424219279a0bcf6e7ecd9ffec13808edd86931c2f09e8f428e7988b0c2d7cd4c7a6d24204f675f723fd37fe723502d8ba0d2c09512c8d1f5f57314e41e7da7c4d9b6c24ed9d8bd0ea95002396fd0bcdf9cea01789f9a6f8d0b78da3b4eff744b2a6e10aa21bf8457a883863fdf1d65d5a1667a7aff59fe0e7a1488890740f797a9213e402b47711f95a82eaf7a5e89c0fbc42fa68c73cb83a285c181ac9ff3e3a086b0a8928dfe9e9f26aea0a4592aa33fbe835cddc47be8f2bd8a490ff650fd45d83d2405fd71c8a24bb56151c2c97837d6e6efb72f54c910d33d59650245566241a3f4b8272ba897949ee67c0af1390d3b47f4c9d5e3e86cdfe138a64cbe830e0bcbc0625e48f204292c6729bc1ffbf2384c37d8c16fbf0b336b30ecc78c23facd5560b2dbb610ff06362078d700ee66cf3013321d385a5254aff75b38f6ec958c43a5e2ff6039b67e1e6649b1e818060dae458b7fea82b1ac0898a289db506b2a4f66fea9be7e6c1af95e164dedde469578b6728ff369265a3e07d60b0d36af569fdbb9b0754796a793814618304d567fdf4dda3ba20162c4774769fcbe92495f029601d33350c9fa8f2d6ae92654d331b456e4a2818b30d62530a30fb5449bc13495612477091fbb9558b2ac1c5488fb4da526853e1a4a9baae968e4bf07809533d0beaefe5008246b4ae649d6e3f72400219605d5199f743a3a9983011ca6a1c4804127fbdd2596c981f3c2b43cdea466f66497f981888a497f827f02be17c0169da9613f23b524aedcb06c5c1921136276f6f6c1186196b567a929eab674adf6795bfc692a5e3b665a2da03df9ccb894f4f0b3bd6ffb639d70274bbad3d2177517ca0b2714a046e7e49ed118c869f152cd2baae5f692dfba7a07e80b8cae6da0c5dd8541d104a56ae90a72207f5145719c88cdd6e6337e4b8edb39cf10b0a01dc858e4de50a5455669447d96765ba47982330d834a1809d3a61ef7f1490c84f8ee55d4af9599d53b2180467e4a289a9acf550e497a47e71ea3141672e1a3ff3401841f4bdc1bbc62e3405a4666affd2c805dee24a1d5e4d5a7fdfa666867f3ceebfe78ce1a926447d15de689dc7c4fd614660dffa5ac982db37428de95af6c4317a7eea3c3d89179759a0814e19fa3e9d8de1cdf41a43e162c80712b5e47a4dec3a2b96aec3a45d17166ea24242249b48ab0904b145a71f39ba14b6b8fc2fdc66b045c407bec3af451ba77b0d520ce43261b95b34f42f413f4658f6f95fad04e71647e5017a4e08dd501849cd69cc961e242a6d496e48bb4561030c9e0e76d20d835626a3de74f5f9f26b9cddec9af5892612625189fbd21b7d9a48a961c26a7e9420c2e5b289c66f2bf2080db0c4282589ff17bc4ea612a2c3a52da8396787d71a0062c6c54186d199f235d98a96a317636cfdd31cdc6d51645a743b7e0509f587d828eceb349591951e049d077cf0ccebb31b0c3bbbb0091c049cf06bb5a881d4c68e1b7481b3aec93b2ba08d2b0c96da13cebc5a6849a83f8ba7b61d820b69f391481c24fa58192b8dc73b9caa715731037d913226f09242ff7a357e75e5696447590a2e191c1b51a08ee15b4e48a18d4138630765a7da5613bd8b7e4aeb38e91f225970ab5a7f004cd588842cd2ae191bd303f5fdef385feccd8ee713b43dc68434448e234eb9c3193e63efdc77af2c07151d26d0fcc102b3c15c40e85c5fc939bad9d617cd1f671793ffd8a0f3bc70cc2083c3775a2dbf6ef3cd92397319aa263101c0a5c582c0402b19710556302945fe2dcb910edb4eee09d387cb3acffa21045c9c6f136f33702adc147422d59049bb094fc3271b5699305af2e8d27ee5dd521e2dada916a607f237a2574bb404c4b29be8c88a157d96533b5e32610d61980f1c2c4839ff82f047544b4f98a5a144cf6d2eb8ce8e1843b112de12dfb6571ae1fe0e42a624ac51491a3dcc68a105f059575242e6166f0c018d91a9c88ea2d7b5522439cfd7a21429107b5d1989a10b72a5e0aafe364eb2d689cab1b690dd724bcec804d187859e977002e18975fb3d13a4be88dc0f818f0c21014af9ab66ccedb29740b6d47233f3419e008c577586f8313a38ad770bb684b9beb6f5f5779198be549d72ed3759d1944bf16993caf70ad22f119df3393b90210174ca727cd8a052791e78c66765b9bff7ce70ed10b19bb45198b62d10dbc0b69730cebc8656ac4cba319d4d9af85ac80ac83456c395ce0a582b70e49a5296b2b2d49177912a21c834ec703c81b17b70610c3848c83dfe3d81193f3b7e35086a4ae0d6f5f3086210a6c4ac70d946c8646f7855ebe1f02f272d2921934addb97ca854db09ecb607c9650dc615a49165e9357984dde4436ff96600c887212d342e55f5232c61aaaf43125a3a9a9cfb52d062340cc9baad7f3664b867acd1e891f203a3520a91ce7f5371eb89728e71c2977e243b4a011e4bdeeef627898adf186728da2b1f9be9938354500c84a7c6232e9e7b4df368a6f3f6779248b03baa8194fe49715a17b5c3ab797eaaf03ead0a92da8381c279bae8acbba02be800e81abb1c586845a1c3cfe0513a688ee8b774e95dc7988b53f97a8360a2394b28c8997faaef979b97a3c9719f57b6dc0917518aa57220aabb8e3a1ed5708f09a4df5341e7e79b703d595d81db8e5abcdd869962cf5e9b2b4e7b077db67e4f1efcf5ce82599d0a40a0b311873c72a2853f6707f1f20be872eedbddcd2e22d8c1e9bf8dcd79254948993dfeae8058849517459c1da16d846623548bf97d5d696af8bdc0b291f487a70434f6d94dbf9a5d0c13127f71ef07577026a1e0119d1605446abffcc53a045b49c837c08349187a6b22f667e7f34e2efacaab56aeb3d57708656497bb49e238539278857620522920674b5315c1ee9fe35b6879547d484a22b2969d22aa5e5cb5765e726052f0f945783381245c4a5cfd05bf39b7587755e548670439d29e1e7d3bc1647c4992f0b8cf5218f247bd8b5f5fad8fe2580b9c27e23629e35235c46541a6421a531ffb12088af0087401ab708b7b3ffc4ee229bc33261808e9da6a600aecc5eb3451192705776407fe9daa5b488c841b0b92dc369e798ee9751dffc1753a1d169b80e4b49d1b6111ace0d20e6bb0dc3fb24a09a99de86db468779e460347adfd04204b30e6f78010c2fdd7d1563b42ea3f315474f807b1b2ee89424c1c7cb8a1cbffabe83d46488175e944218a04d099db51709a7adc7f0b6eab5ead2eef51f6a30ffd0aa1f90712053be93a848d5a60177f2099bb96365086b0eb023cb6f324afd931a1d24d5b843fa0ae177fc286af452d8f916d3b9aa24ae51b0ebc99405d8d6cc9214bd954db30ae65bd86c2fbf407e661fe9507302b4ea5c5ff6d3f3ae801b92e257505558325d06ab3949db258a5a054c9520d22b22b5e0a5da479d5d94499e1e7f32a07912e0f2e1e73cdc0d94782202efa0bdf60721cc17d7dcc6683233d2746d3873ecc3c986f1e6b8301dd6287dfbcc905b04e4e0d29cf5c963014c5fdc8bcc2937af95bb7a7b7f262a284c0d59c0cfc2c88d23661c542482f68e7d723bf8cbf41555bbd2fb269ad7d0d17df58630cb03a6a7e0b0b6fb2ec935ef3f409e3d2e7b4b7042709d12381fd2109c0bf7364c9e9f797cff9353257a73b8f1c9e3f2d6e7e13cfa7a8f36d205c01a5d99c852b1c57565f64fe590bc5a3160d90c8141bc5cca32b3482231c4878a7b9de71ae7857765ff551401f81cb5be6469de481593fa519b301b9a6b2ee0a50ae58748dd4b3bbf09315ccd8df881322ed05988da3f6ec4929687428aabb260537e869466ded336e61a0be87d6c34b071372f5f069517af468e805a47f38f48144a0f2499545ad8f19e36684d9b400826ccb158a6eb4c2be6c4c9eabd0937ce73f99baa2128b034d394e69244d64637e1f5efcf3be515c606acb6fedd79d8b2531d236a1cb9a83b01521233b523f3fb5a56dc66bd40a3cdd3a9b247f28c42b31c164a04232c811a8c95ef38674dba740026a2f3c7d4da4c21240514718aa73bb088f9cb7826a7a4dbe72cbe49ea9846181f112c61de114868c50c70b1a56b68f103d18955c85a32a28f0eb9ed80472647cc4f25de499d61b9a5fb12083504a71d4542806cf2a7fd6735f45094de6b44cebee1231d764a09697aaff0d8b259ecdc9b4575009826269ed69939b0354ae14aca08c535cbd4dfe08b9230044a8d4a6366cac13723ce91a5cf50b8ac3274ee31dd16d5c0930cbf495a094814ce91ac4e2b19b2bc2620d3b0037ba989915d089339fd0fed473c95511610a1a7c976eb883a152c8f667e3603153e9c5357a4a4de1e8818fb1507dc76960baa5370c21719ddcd770707c3a7958f2b1f3e298691bf676c7a0061c4992adf77fe28d53064cd0c3888a858481a87d89ea4edd8c36a640ef87c372a52e9e853c1f59259087e7a3baace3dfd6cd0c1f081f6e8e1adb3bdbfffde6ae2a0d4b8aecbc8ae6fc9fe83a304b655ef8bbaaeb4b1ece6491c44fdfc9733c08d740a01075882d1eaa5aeabc05aa6577aef0116eca34b3e1ced5e662d0b79ffb9deb5d83973255e976ffb2a81befb51a8475b5b0edd5149c51fb2a7ee063e7ed1178947a3f9729675fa0aab071014201239db158fe056bb3e34ccd5af9e9ec81a6920b240a2c63c7ec1b9cf5615282ec6fb5eb6c6b40831f2e4990e897fef3d1d0a07a739ad07464efc6fa3f8ca9a5375c4daea4b1ad758c8d45a882753944d0c893e0caa55fe3a00ff2f763076c08243108b9b6f1f0e41620309525cf43953fbe056263df1fcf11bd06ffc824388ec584bd49414eea8ca4aaa699d18e82ffd5215f4c55b0b9a212eb2c93d71880ed5447c90061851f46d0aeb55a1ec4dc0720b92f91e8fcf731c1c415fbb96919f5d99c906233723d1173efc9a346e0f11975956bf2387933fbf732abe0d3a095e1191bbc939380e3c384a3733f5481faccc8a81e0133f356317a0cf0cd20c15dfd25cc993b96a942a7ce90e338aa51f7c5bd280f2b3c982dc5258b37ca7ee23be4302c2b9b90576f4f495b46a5aaabe688e79ce70dc2468ba64901985589fc3422843bd7c4f0b78b56113a8eed389485d605e3df107aeb77dc42cbab641ea66b460b12c2946e5d5ba9af5e51e130908efc8ebebc776378405c33247c30285e605a66da7854834311be1d0b508f21db9766b0dbc8b92342075e0390d75964c8ee2cf38e19b0f96ebff928c10af5b7c358acb18cd0cf65c2f07aa2e77d56a9b6f71ecfad343463e875651ec9bbefc86c1ee59e6941a2292098c854ba2cc6a0cdebc80e01a462dd412fd977743d556ea4226a7c4416a45809c0fad55ea9fa38f944cb2d52832d0f7243bb2b523ec38891a14cb5a1392044d71e859e50383cd850979c35155c7ce01ced8dec8615fcf20767a8b8346de9dbe978e0cc63051b6be72c89a488025c6442552df2c20db1518be4279548f319bc178f591c800988c493fade7abc8b3953216dd12d58d4b5cc1369400a60651586beeec192ba9c95e5ac2b86b9315a3f4bc588f0aae42fcc5dbb8c20d505471b0e861be1b9fd33fbc5848f6d1d2e8c4f38f96b7e597ef9b601cbffe809631c1cc3f686a83cbe7d15a7af982bded1e9342958e56d8b42021f02895d52ba86317928e01fdcae84110c785604f011e0d3fdabf4dbf7c6220634f7e7a5d4e507d79414326da7567a7e246b28c4997b65a6254b0b2608cc1c5915e99e2a3972031254a8b673e8a12972bc15d6fe3ef4f2ed929f16286f06976ae3d03a20c10d821b398deee66fa16d838dab9e582529668cde72b13a7be3b594cefb47a2632c7505d32776aa78d84ccadb9d5d090314bae44bc1c10f0eca9d2dac77f08712a49dd2383e1ca4c7eafa354846101fb876e6068f00190d39878dddce6959e455830e05fcac1be5599d3c3a5a4dda91dec37beefc6a7462975c0cf302dd5141e2fb5017a54118c152eb822484230880344bac4d1ce6ad5121ee0d9c5f1146f159a0cc433a24ed478b4554f1d9efbb122bfc03059b03b87cb815c89293e1063fb21ab3c83b49c643409094be68e084d4d8a2cc58ed2a0fca6af9421d16b103c892dd43a41d33dd18d68831975f369e766186a2ced63a7dcdbcf47100df1f98ed0140d946b28ed3654cf3b1cdba4f0e07e2932b6b10c9ef2b8fb3c6d01b0f840d2715d90008f9c0f30fab068409312a8578d2062b1e933702bc085ddee30bba042d93e9a95e6f320b365ce451723580874eeb31bfb9def014787e96ac2120c730ec95f13b8f63bb9af2dccdc21938bc1b0e24dacdc7ce30b3ca688665fc1b68f3f3af7377bd5a86611a073010588a4ab9d23afa199b66f7e0a85f333028749775deda278d84246b681bbf9f59af6c93c552e8f666653129c781f34efa0b8515c8b0cb5b05a43a1039217fbc75d3ceda6b19121382256f58fd88f4a67e2fdb2dc10a6dfa1cb976f313f79dc80c66fb672b89137b9bac937bedac45444d8330ba4e9b59569aef83df01cf65d84520262a7bcbb2802a2f634a928c2f7d634fa80069a5768aa0d54b0691941d76a616f26535448ab11a45b49959602ccaed9806170a7af57cf649df5bbe5cf67c905d89084e48e31aa189af0462027079727b8de519b4403363d0299b84e95a9cebf06a23cc3821d8b71222e05cc168564e3c0278f2097fab095d7a2ded0e57ddbc69ca5029229f305c3e74c6c986fb855682464b46264b9d6e29c1f62d6e0b4f1334c8b7c1fa125321eb22bf01a601b664846e41da6a2f0bd7045dc99ab37439113f103464dfed1ccbd0b21c12008664b45d9d3c2741c45544e3709e59714f92b4e64cc723a9c42fec282a30e10333c0517435c94c98e2e991a107d0e10bd49f482618105eb3707615be5168b5e768f26da75af8b8edca3f731b39b7b7d95d705216576caa88a842fbd952c3c050c36ac3cfe1fea4fee1e0c2dad868896e8017e730474689782461ffeea45350aa85a296bed8c754c1f33bcae140e9e401793854a3f3272df4c38468026398ed83ab43253857a5f908aa42fe699da16074643c59ac9abd645f6ce56ffd387ce9425bbdd0904eb964535ef0264baa96a761127d9661fa9656b01dcedca5403684017c3cea522b9d0d7d2c1c5ce6705b3a229ea397ebbb6e739db9a633bba95245b066d97817abb59f1a2d0ae3660624a7546bdfdc595f569eff56a9092f91fb0174d3668c82cd6b7bd000b459b6e85525a13051fe79d9600a65076e8e6e8401a09f84d98a892cea509dbcc49dff007165c56a9a3dec4a836ae8cfe3a79d75cb9ea42c86cdbc65a02395f28d9c40d4af37c7fb230f89c4c7214e0ca64ef3dc8a1d018585af8cd37f1b3d02133d6fe80bcec3dd2e46bae80d079e19905d57755c19ef48fa631cd0ca9dff2ce59c3fbd106371b739ae23c11d2e4b5050df3aa57bc3ab110091e8f197d7ea7f982d7b6de1431ba17c016eb5c90c6488ef4af55d1c8e90b036442567f88cc22f09456b5392c1a01d7906f9c1ba1c60d56b02c32604b171d78d18a66c427a762bf343848bb470418517214a4955021b896f5c2491aa420e10ddd79d73504d43dc7f3d3a7cad4ee8800b79799c5087280eaf581739782871d9bd011e1bb99e680c12fc8ce5ec622805e369b70f9d3fbde89356f20134208bcc53f5685defc85562ccc6ef8e563512e2ef3903f69b351b27917cd40cb4755cc025b63e8ce8a119934ddb1a05f892de3104bc0eea57a79a1d11fd8793d3402519bcd547ac86d5d08844c8e0e06ed90712219973299ec61efbaf47fa228b9c3ac73ef0bdf392e8af9da1670deba8422424c79a1d409a36a7b5631d6ef8ea610f8aba85ef148444033a63aa785b4094aa4d0739ee113297af9f2e38a86863c0cda75e0178488e1f0af10ad4547106f833c1a240e531c6992493711981d1e786d5bb9f038b3ecc0152d0ada8e31e942f0cf0f417d8b27dbbb0bf8645bf6da146f6de5bee2d534a32054e078807ad07718a24a8ac4e35d890ad5c2724f16d609dd60909e8434a2ac2a836451c164631aabb4afadbe7234eb348ae7bd187c34518c544b606abf2a35fc832a8f20bb9882abf9083a85272922a9f3f10f83ccc0ba0e7e76f06ee41bf357e20f0f98e430f0a7d91089e91118741c94c8441f99dc738f2b767148392816022aa7c54957cc3a07c94a6dafc460b74aa7cb95ba37ddc9af91b72010db787046ddaeee9913df263116bda45011424a821e2a0ca88a4ca288320629129a3922a5feb9edb1a8ebb491fd07d7ff4f33131a01f81bc18d087a32a3f21ce3ffe9a27ebf4d644450b448a68f71702912306e5279f3f0fd8bebf180643dc4fcea344a0dc73fbf984b6aded8d4031557eb42f8c55fbeedbd35a7eac1f2fd6ee38d73caff2734413f6f9781269665f3857850a848cb0a68e6643bc21fa5603ce9f8badaab2732754c3f6c5438119ff971656c365c35b0cfa8750347ec8ad17f8b7cf33910b28260cd66d07872b843455fe9c916767fca59cdba679231fcc495af94b7630420d294fab9670fb589123682806b3f9412c0aaaf1bbade91ac3007c386afcc21b996a0a6e65c29943fb3db0f2639135813df3636b961475d8247caa8c32a832161183a8f243435019b8d41f8cf6fbe30330fdec829c1ab20b722ae8e9b603560ff2baf6a674f9fdf24340d0fe8ffb42fa759f03b804b37dac9c17b37924d233287f7a320ccafdd495228723d5bfe652f693cae0fd588382200fc8034a1918940c4a1918949fede0035cc23e199647062eedcc9947904740df7de8b7080d252a74048d01ddfd843c1e1bacc973a4aa4ae984d74da7ca28a5942fa5941fca9b2a41f2773048bebbfc8c8aadd9ce932829a87f2851b2c89a24a84a9632a892ca223a88aacadc89e0541c4911aab81a341c3915479286a7e169c8849a4d6d7742e3735c435f42b71a3acd872a7c0e92cc8a67fa99b009a45101ccf132a4981ac61583bf42634d31f44c89bf68258b2d816a7f64b2355ef9b78f44060d8217b5579f2bdb75615b118cdd22b268408eab8c0a30079762ed975fdc00cf740c0cf6c715c715a80d1ac6d59cab5e31d831b256d90e58f1f402bf7f51090de36aa5f9dc69a96a485b3b2f43f384e30f05424b58c2129670920f033d223f77118b7e6ddac3aff77500f300b4a6ee57f7a37b94deead89f8f4d4d7482b3fbca259a67accd2c622ca574d17159b9b06abbecd47ed9acad5e6c466bacea8b2455d6d025874b61a693e2521872d9e18cb87811a45d9ee096d09943d0d02515b2d953d7900d162c2d2b389d26aecf95e9c453a6d3335750fed025f5a2e3927299c19a3e5b13ab73fc7c2e337091a287bfd0c58957fc42171bb88484d4eed4ea4883862cadda5cceea68cd25a569fe2e2997255c5a2e52d8246d5c923869856c5c9460d97481225ff318b2d1417129e47242414244a2c70fead91a1d6ea74d2e35d81997d40a60d0680156f13da8cde9b8e8a036a753b52f7411c300994bca25555d74a48bc7e5845e6c382170f2f7e448688c359e78f4d4170f0fcb8d1323aa2f9620a20746aaa8ee921edcd425402a3192d455854184a6ae2a0c226a2894a186daff2055fad88786ecc343d334eeb70f79b12e97247dfae204a5bfbfb487fc1008d36f54b9ef2ab77db6d14de46d0d79b1723faa1d9bfc4443bfcf6d89d2d73e3d486063638343a59f8b72a0b16a8f711efd0d7994d2fdf0a0f43f3c44cf7527f2b40f79f497f364e5360ff414f4a19fcf711f1e73034dd03743df323843212f9ca18f1f1e30a1ef0559e9d3177da2a7def460e8c74a7ff340de11960f867eda0707b41379b1863c10cc173d17f234fa212f9c55f3b8e9710d41ac212814480d41ffa3abf42797b20f3df6ee516f2bfd3a06f7073424d598df3a6ec411a92110aea1e7bef3f8c3a37bfac138602bfd16b6d20f46f4337c38ac501817e8cfa73f5ff4dbdf50b5077921900afa9017c61a7a11f538ee42dee7f703fa1d1cf26ea820ef47573f5fb7432c00f79a177ae57e47efe0ce5b06b9c4a5ed4715c364b8cfb7ecb5e7626758c79f1cfa257efc44209eb29d6c277382ff841344a230db7122186c9c8ddb20ff1c08069bbfb05f47e4d73c3d13b6cbb5353c432e97941b2eadc904d71456b6d357786c5040bcb21d2e85345371290c654f644a42998bcf2082f6ef8d1cd6134470739b676bb647acacd5d1b3679abd6c75f4cbdadf5a98325653e1d2aa9abc6a7f2b48ed7eb984a8a1df04f9a8b44852639835948e52c39652b7869f63cf80f9a30bee4c83a086ea150424a89e469cbb433972e478d3cb3e1864ecdb47f7f7c3c020f7ca0ff77dac5781656d05b8b41f6ff615e8676f1f1568ec5b81a6b9bbbb979b9b8bc0cdf7628d3dc48f5e883d7ffc48db87747eb83df6336c7f44fb65d01ffb648f8debf61d41fd88a9e6c9f04c3ffdeccb413bd68de351bc05315cf2f78f1ec9091a7f670776638c31464dd334ede3b66d9ab67da1f6db73da16e316372dc6eeee66c36d62c01c342008e658ef4953d0102435751ecedd7df2cc66cf4cd3cc6e681b224733469565685450d190864605368d4ebd83d97bd00634fef66c17b732fde9a1eb0a67ed0af8d8a131f49cbd72b20158f46a7564c1711b43c590494854aa0b798486239984447121b9905cb04ae53a3af283e5e44c29041af64ddf4821700ee7f0f0e8f4f4c4ba1f1e5208349c73466c092751343e179242689c1f29c4a3518cf9b42071e0e2fb73214927b63e4e984bd88f5623d60e68e8a11f68385a71464509834ea98a41974568485574a5622f7b79590f832f5dab1515c0388423d60e96445eaf9ef1cf5ed844d13073c2a0b7aa3f334143ce49e5580c66ad393d6331a8d5112b7a3047b6cfbe9fe315c81d46ac51cbc553dddbd3688b1117cec3c7e8a667fc376f84d333feed654fd09bea2db7994374ad51fc50a03fcba4a021246874ee15b5a021a77a557f4ed5a6f8fedc6a6bacd81af9fe1cab4d194b455ded3ed0ad612aa4293466b4e219ffb0eba0b0ffece828c603a9e8a8a77a387ad5d18a1f7baa6a13f78d563de3bff117cef9a9ea8e56a31597bafa8f98702973c2a0ff68c5259652bd358252fd69e675adf6f76cca4b1dad98069406a7c147abeca533472b3984eeac0eff5e3955f58cbf0a86071a8e56aaea3285ea3fbfea8ff99c9476c6eaee248a0aa1ecde491550f9dcca8deca0b927c776577bcc0b7f681af63b18c4a2a41418e1688bea591db1aa87590dbb56f59741e8ce5f1d4e228d9888c0a023d668151242e387a3558ccdcb116e6578fba6713aa753ade9a23ca41768b3af54746dcfb4a128d2cde38039383145f30279de456a5116cd0add28d2f7cac3a0f167dfc470858c5b9cc3fbc23887a75392c73dea489ceec198c5a7e8c93032543c454f03f56a75c48f9f29dc9ed4d8ddf83a4fa8bad08b869edaf155f525fc890862d1d0534e7c8b3579103b6383357d56d948650fe2c90a5654a691a2ba13957142ae861e44e5946421c2ac8b98d0fd1cb0233484869efa14834b30c8aed053ae837dee2bef62a4781c53a833e1526a629f7da951ed2f85fdb29c547657e5f86d751e34cc27ed5cf4e2ca911bd41024af13d742ca70e2e6c479c499e2879e1327af48b9784e1cd652a20aeac4655634c941eac4cd0e4915d5090686ee82d545ead4dff60cef6ecb840723784ed159090e043de4f3f7f01efeb1d741e10db5de10e305a4440182390a81c6df6e66fe3c0f7dca60e9c18af7ee6eaf826e1363bc76570cd4b6d862b2e5fcdb98d4613f67ce811052aff8aafdfa54fefab53ae27f5c743f73a5b8fd95e911cfc48f1dafe87e48a30f1b7f77f6ddab48bf581d18f6cc7b52c5c822846efc361603c1d1f097237128dc091a2f3f822371278ec491b81387c2a1702338147e0437428f6710a4a19191891d819e9352feb4c0a31a468f8961fe16ba475c1dee2308d5a10559f9b985afc33e2d6012071ae3078715cacff1d323bca1720b73a706e297677012c37c7db35d2cfbf57ec497bbbf96caf65cd97ef38064803a6b1e10d600ed5cf5030c46d7646cc8038ee0a288114e48c13172460d49468048c2430b0b29372083085a182948b5681acc476ed0284910018a22a87001146490b164082dac9e358e14016709393c9f23a891460f4aacaef062cd18b9b377ef2ac075a8cc472a1307c2122492ec08c1c50f7c3885b47a193524557715aa3f0bfbae0a42aafa18dc035d056c39d4ca37e03adb1c0c82ddbd9fcc19743f16a19d15bab1633066d9fa8f2ec676d13041b1ba2a284e94a0a0251c9228ba1f2877033194b80225896d099d755550600006e82ed3dd8d49c6dabbddd77d334c66187bbb77776b2ef213dabb7dbbbdbfe69f53bab3bb3befee3a80c1edeef66ac60283fbfe3d0036237591492c9398ecc0c8366dfaa6cd4c82de9ad7d33377776d76d632759bbb3decb21dd0d8eedd340c7eddeab2d47da95bb7bdbbbd63c750a563984f20d28acc867ae06062f56a7f0422ab7f63b51febc0ee0b6f89c9b9bb32cedd53ba6f5d7c1efeed855d8e0ecbd4e8d576c340dd07f4e99a6cd1644ad904c3b0d9750c8934b5265846837ed1b61a390d8b71f3884da009f60102b732bd18a8fb80bc4f17b78e93a151818666c76705065798b3f36454da8a152bd77ddd397afb807187f4316c1f17be7e66d731249226b56e99ecf3de88411aa578f708d56943b3cf0b73a34c29fb30c70bf73e3a6edbb6b176766adce99dc6be27f7edead0b6afe58e0e346218b631c88c38dd73400448a264309f004149e5cf3e3cd801537ea0c2065d98a1841064643a90d1fb832a95dfe58d4f0d55a8417238124bee2c3f9052390a1de808edf40f825404d4ee700895269018c2c80e7690a2e5c0437ce22ac9684b683a9666858a6b45f9618e48ab6d5b556eae403d51014ae7090f3eb06085cd939c223a4f90ecc0f344072c60010bd693253db0b06a3d0163080b57f08c48314e439140e30228d8e0a25059a4864f73a8fb5043fa6408d1451445703950aeae2a0a2332608e05a11451fd73d0a89ad054553eb7597f86715056e0d2e142a7a7e0cc05bd779d33758f4d7e5083575371c39c04029fe72fec7efb1d1c72fc5ca47486b0fbcf03400f24d68e7a2d6ca5229187c34a1843a5dfc61ef69b0744d68e7bc871011f512565d4ea9021dd1e866e1d318a921894efa61018431f13e1fe96674206a2caaf4d3030f4873ef4d5d05f0db1c9132b38a71a6cd0ae589d5abe061b04803af5dbe029609d90803ef4379c628b077202e487bcf782760ffaf0fbd3dc43837f18c5608be435fcba3504dbcb8c446a83eba4cf0d086d7c406d80426d84a83b2f284d4045524a2912b14829e5e7b2b308896e741b2296918b74ef916ddc70e9641271b1688312915948263c99cba6c66d8f4d12a9bb6edf19cb284d3d12a160983b2834435db7dd32e7de55c452d7bd06ef952a6361d5f86956f554aac5634bd753e3a7d79b2c657169964e1ea1a1a75aba1bdc6198a7a212687c1a2ead4135ee462793a06b42473f3cbca77a8ac90b3387af41678e6cd114dccac43d2d6bceb852ca133fb149a9b2039c2a4930a9c2826d08f4061bdc16f453846e09fa7175395013ac688252277ea02c47a6a80104d7841a41362be8bcc201817e8e90a2120423a83ce96840b5ba2a2a2c2aabcd414ca3950628f2c4293cdc2d85c1293da572bb18acbfed22b99a0aead1e3d8c23a328362efd664317236bcf56c3dcdfb21d76d7563f3398d0620b3f2eaf0df7af3e2ea701bb4afffb1e79a79d1797548d91f258f64d181462c2e836273cb6f908a7302c90bc9e6e405831ad247e3d5821b2f22dccb7075552f1c6af83458175cdccf0e0d339cfd0ca7258c94990e97648d9f25a152e367ae296c8a3ae8644f1c414a8d384c6acc76b2568d99941a33cc71b81466a91a9758824b292e7d4604971a50e36f9819a9518bc8f5d01f19eb5b2bed990e6a9443e8aaa6a0bec8d9781127b038468e31f627c61837c6b8317631eec6e82d7f268a8631c6b831c68d5df7dbc7996270b65a5df7b3d47e61b644a99bddea3e9014900be4ea960bca05c5b2d32d908b65876587bb61d9e16ee604750be4ead6092c8e070e4710ba1d9dcb692928ce0897e272fa432e277e5c0e779303044c8d91ce9ee1010d297fc82636e156266471f5c7974268f3703882d010843de8c5257feca3c16bf652f7433fd010f46271c260a6245ba91894456896b1b0585a42a8fc908515060da0575440accc2344e58f12f4f2403d2dc8cab2434316160b8bc5093f77d3261818643cc90f06fb3dc9bfe134f903bd4054768a5c4025e901bd7468d8b579482e8c859a9be728af7bbc569bba795a41b884d52b6ec325e998ac2f4aad78a8d9d444a957b8a48016c216a0c7ca96e28298dbb4e9e5dd83752b0bdb25b1efea0c06a1923122b8950907a0aa1345f7b9dedd0f0fee254a0ae9fe70df71d1658c516e1e7be86e1f7737e9adec6295284a6de8f6994acaed777b6a43a7b6815cd486621c113464517d3cdf1466827e3d29d84814e55ea050a1fbd26270beb8a80df5ba363493281a825e5b0a3da480e25256670a3aa419d479449da1c8458b35a130c1a062d4f9b99851e75324a8f6da872eab14502eab36bdb4e277a379337e8eecfc97d60b14e65635baaca2cb2a8a6afcccc966adcd5c5ce2e11247172cd6f4f17c3c5dd4f9dd8747e46eb2cc49d6ca5c2caaef0a0974ea16a9d01f19ab6e2fbdaf87c1ed4bc1667e7f8ed09e998fbd68f8f5d4f9f57c575c557e8b4ecb8ecb6b6b3e55be0b152ec597efd263820d97b84a16848ea8724d2fad9d99bf55f9a19cad69a952baac3220ac2905d44b943a9f6940c38fa7cee73e3ca41c82862caa4c85fd0e8e91e2e3014d90abce9797168baa4e14747a26260a1a825e7208ba7d8882eb01f223151a825e753e8867fbf920295ce27efe4d9dd5850983d365c5e07cce65e5b28a51a5806ad3fc4c55e773a3e0c2ea44c1d533f3b91005579de14bab4e4ffb39b5cf65d533f3773013347459d59902aace5f99f9cd300095093b241a3f9ec1ed007c3882891d7c38627573043a240a4e0067a02abbbbbbd0022268d8a4a6a096b811fc86bb0e48aabbbbeb547e9f441852f93b229091020ff632786a0065082ba801a84330c308d59dc7cd68a2fafb6393827248e2eeb2554694d5a28c15f06027b278a9fe534af5efa49851fd476428a95e45f5ef501297b2536ff0f0493bf72bd57f05167c6c4d1c637e5284a8fccb599994d290133d7447a44057f0c0e17cc668ad601b9160a004064c3a1a6507cd088a1ba308452612af6d0c368a64a79c961645080fd84906aa1925081da4119e2cca0b70fc14831d2c4a133ef4c9884a4651826224561e85c90aa2112d235c340a182ba045a0ab9d90a069b046a418248071a305ac699a1290a05a420150578584233624d0afab42020e5d1114852859a0718510683831058d263628d01842070d225ea08142c32656faca41f51f915c63bc9a6883f322167185739eca79cedd91ce8644c77a9a39a9045303cbae90f2921f30327d051ffaa5d484a0fe3c23436d3051051355b4c4b216ab99c3404115c6903d665bac4809eacfb9f698a77df6690147c5b22deaf68d7da19cd5b1fd0e8e4a6818caa9dbbf6cbb3ab60fc71ad435ec632827fb5235867270546eb706009f167054f9196b6b70a050e3ab474c9538a4fc160555f370d9c708b2ef30a8c36033883f9859454ca8efb80e83432808b60acc5fa602839d6519cd0a0c760ed7f12498159406a755307fbec320d8998eef80edd9ccb22ccbb22ccbbe797e649e49af9b314250703a587bc6f5cabdca7e829cf94f4f1ec13e62ae6a2e0b6e7269270fed9f1cf7ebc9385c01c098c2e6b432b46350ded01f124575319136ae2538c73506c7725159ee8c333824705cc45c08755601650681a0ab8b00850a0485ea2b7524111a663a9de93433c85f7ab1eed6ce9230c8d9ce97e9d87412380e5bc235d86e73941826e796dc0c7a058dfb72bb0a1658a85458f0d0d151a9b0e09193d3d383050f89050f4f4f8f0c5288142299482162d475ae8a97119514e3bbbb7377777777777777e3ee2e1645e4b88b496f1548ac847dd84b190b1043f815931826a5dcd14cb16f7f5daa7f40640cb0f5300cc3b22cc3b2176cc48f51e60e63969344cabef9fd0b4efc52d973e86729a5bc8185c79f9f87fbef588d0e054bc80a88ccb59fa34c2c40c791ef8ca495997ff908cd0e1e7d414be1f7b373fc28831c4e2a6b386ba8fd936292277d712981b62cc1a62029e8483ffde17144caff7c44a2cf8efe78f4f9e3c2925141df0c9fdfca61deaef102326ce2a785971a5a15415922d1872da97056d18bbe503ead21a7fef87833c8076d3e50d94f9f6b0f069e894fe9e7230bca2da9e50803833e188c0f039b5cd53ec2ae87d7cf176231a8ea1094eafea13f0241aca31779b12e60c70e061b068e85a585f3b4efeeb9b259e0a64d9a181514e2662751b4432d18bc0714a725d526ed5b765a9ee012fdf8a2e77ab6a767e2733da15568257a6269e6a439b6a60654f42115795b475eac212fcc6a185ac996548b0d6afc168f85db96d4d6446075445761134217c060e4384f8b2fb8920313506dd23e827842df12bf45676b441fbf250997d803551c415c350cad4451f4d1296848b917799d14b4496dda9e5d155a513a8a1347a4bd48f4346dda5ef4fce1218a128011bdf6379c3e1f0f067f2d0cad4435706abc542767d11701ed145ac91818d0cfcb1ef9312fa09f97aeda3cd789212f6cd9094db889009f7c9c41439a05ec885b03ca959bcfcd19b5f821169736e4a49b78826a26d8f44cc76d5ac76d5a134c580cc6ef3e86536a1db769b1326150c56054c26094407f2c80bd7f3030780d379c385742e587cb0aad56314150aee18656ad659960c360dc534baa67b029d4556de2542aff9e36715fcb36a746694f8def49e8729cc76d907c6770da6c271fa33168d8926a49c56fd189dfb2137fe48a2daa1a5b5835b6b46a6c71d5d8f2aa717453e308a7c6514e8da3948eaac68def3df6249a423ff217d296d48bcb6f887c03673355e4efaeaf4be97dc2cb95d2bb73e066ccb26fc433912373153e67fc1d1c3f18893d0c5a3cc1c8ed51b0c90f06d3b4978f022472d31e0548fc8361d3bea658f6edd819feafb1ffbc0080c5e47f955f38c9c0418b092a86d8220cd629ec6f051a156822e6030d571524feb6699f3f6367429ef004a5377e41f4b75946cfbfc30797b2978f012e69cf39a952864b6f7ce11c7d21583fdff2859fe80b7da0ef03ae942a3fb9bdbfa6691fb5f5b2acab59f6eb81a0bb24b097aa27581df2c32ec116a004ab00c6a1caf7a87911882a3f437d48b03ae4c700fb92a0fefdafd337603d69c0ad4c88e5548f71524a22fd8320cd8721415731b4699b19b0edcbe289616b3609f049faaa4df2a3e9197fb0baec9156d6245bb2676be2937aa043240ed53ff324c027295b6d9a33942dd9fa0af68c6f5f38b3cf77a05c1c41d7d57a7457e88e6601eddfd511ce1906db1443cff8fb8cda871d1157adf9c7d0fd3d131fcb9156b8425ea2b6b814469c1a597c6235e2f354afaeaa474955f524a929d455ad31c58b9b7a80ba4b9c40b1024465716955568870bbe273a1b89f175066b1222a24692217868440e4d7907598071afe18d58ec11394508ea99d89aff3da51b14d188fa05837ade83a22040de3111abc1e91efde479c48049be4c74ebc58234ecc89cc129541bf79ec1114d5a656c59b56b5c9553164d6ab6e0c9bc5ca82702b137239d59fc311847aa68a9fca7b40c34cc53553b589dffbfd331697b8ba2771ec31ec69dad48fed601904cb321583ce35cc5435478b1f357bcd0b47557b6ece656d5773f9e01536bea6c519490f626470dccf13bed8d172a9a8fe1f1efed1dfe54e517d77f7c3e75d9a287949fddec49c118726599665bda33ad6ddfbb5bf8db14977b7dc6119b127f1b868e8d260cb01ea2f1fcba2a1a1915ee7c2d759dd5d62f1fca34ae7189ffb23c52fe8fc90c61fa31abf968bc707377f7345d3b5e8ccb8657bd3eeb946539a9de1a795431a1c5728cc0b0098a1bf86fdc1b850637f6095c1a2f41046116affee60eee2d758c272811a62a8a0ca89a9340065842d7218020f6c10441a2cc3ab891554809103173f9c18093ba0e1a460430919b061847413d83042c3c146aad9b861c3a6864f837519343402f814d64409f02f03e600737cc454703a43892ca0c829220934706050fd0bb5ef074d7577770fd5c066eb41159bc55440c40728dbcfa76ddabe1a8eaa1399d4884d75ed833231c93455a860340ca9428732525beca0015661a3fae7a081a9abaaf2a462755555baa8e1d7986950b65d57b86b5440fc69f7eeb8efe4264955ca5fae7bd3324cb6e4a4dc304d868830e766da625b47ea999e19ed9996717560ed5d1759d367cf34fd74bba63967d6ea1916cfd04b2c4b552ceb342bebbb4eb14681ca17d1bb2fc277777729dddddddddda574777797ceedee218c57299d3ee1296d328f4bbba091fbebe813e734e94ba0f1fd5986d0f8f21329c17560440d0ceabbd9bb6733c3aea0f1b11019beebed3de787ee3eb3afdddbbde59ae6cc24a645675c72df959815347ee7ee180bbb62bb3f56b02d9ecca8a46d5546452b158d8800000000c314002028140e0a8622a140280dd5791f14800c7b94427c521b8aa35190c3300c4206114388010400000c01a1a1a1e10401e983ce4a612bb7abf4b571a5eadbcbe7015879ffe8231666ae0086786053be3f38aab5257370cec2c695011eadb50640a97db3fab45c2045cf27117d8e43aaebf24938006dad624fb9fae99f6da2cf83e8583bc05634c1bc8adffd1fd4778e22de9b3d992d02631d5616977f525a6edab730a66003e5237e1d81414fc48e7e9d0e18728e5c718bc5edaa06bb7e23043d7bae8773e749086211280532662ecba64e1fb9a9319e8016e651f525ef0e62ecff85ad35a7eb5d14cedcdd668db44d44352b463136bce7dd7b641c5bca20481af63947911301f3e79c234e011a746a08ca48b171d2a0bab992366c55ed6151514ccc429fa8d3d99a3aa2dd4d1a0747d6b38790970ed1400adafd438c3e8e7fbbe1a172cb5aa5d3262b86bcc46a8bd548b5c037f1f04808867c92ff89fc5fd9d0ddf096d2ced9c33b6f8f038c5f5592ab69bae8881d1a416198029dc8672db87053c7c3aa30f90337e990caa2482ae7c32956d0f88ecd735a439e8f2b9c2853763b2d864d7b69ae726e2402b0fe968c5648e0378c863c37cda40c4fdb06e31a2e922da6186fbe3c0b05fd7282bf0f32e519c9bb1e4db1c9eb1a4b2cd74c0e8816673def172df64e8828505cab8fb6f9d44bd584221146948c9e64ae6f1e20e933b58825ab0939498fdbc91a7597a068b97fdc9137d6d2a3cfc79b1338f8fadb2d1b714a1309ad6cb366423df74f024df94aa5f2dbc450b1059f734962909002663d22399265f405177194a46f26b1347e7d189b543619d296f1693a600fd703092ad935dc1610e0519230a94dd80b54117bafb884a0420588997905b7a7fb71025c688bf6158ce3bed5899b8847f67f9f3b6591f2e4d66d58c30a7e0f47fc3a8b0b7f9d21ef3710ddd035999d290a6019dbf12d61c2c09446315b51571778d51b72f3336acc41445ff004ce046a23dd83f00c25f0402ba6bbacd4db6311109d94b302d00437f22dbe635a07a25a9f4d72e622cc4e640148ba9c39d0477cdb3f467090a260dd3b8fe4f73995f8181da62b96c74c913a048dda5d6ebdb1a412e2196ba7996b592f24045ae40deb859ed3a108a884e0868fe80881e46c32ecb16e576cb6a2d57f827af8454260f120ba075f2130b713e97c9588be24c0f74820043265611c30e8ce6ef221f67171a861c667d66db6a671571a4d7c8976d8cef2ba3619d248d6148b64116c7573e572ff81323fcbbbe9e969ae8620c0b14ec4cefdddb7ce8cb5fc61681c1a6df5e1a94c0a3bc7da83422ab25e5d4ebeb1e463703971bbefd202455f9d2decd6983216f82311fb0c1662e62c3a08167790500e344e8cdfcdcfb01629719df04811d8de3f1f2f42f5ae089ea5b6c8e93722d424740a23a92f85a34088b310a560ea1aed6ab8627945099d3969c70d2113c2400d1ce03418302a5ff7a094a7973ec890874050d80ca3bfaf0de7e6e5232610143cebfcd4df05c26fc7d2e9be5db5a7486629f9a529161f67427adcbd0d4947e1cbd83bf3414482bd562c2614d2eb7c119b51a94380502ab7987829d7d08afa3f3069745c96c3e60a239d63bb3fd1a011e684e4c99a524749c56aa5ebf023a7a0084b2d24b7c26886d675afe3c36bfd4b515591be86d319b00d254d3312568041da42d69f4e598238f5eabb8e224c90f574e961952e927a42f37d0331e22943bf67634915179befb1bd85e237c937face06f4314109d1e51931fff3cc015af25794d3f368af97addfa3d2c0729f90fae10f62cc22c342999243d1f20c43468bafd77d67850c39155ab685374f54042211e42f255e6c36f1fb3e919420d3c79f49f181ecfa0f9716be10d541736f5e950d8030bf7bf92ecde92e77b184c718450f22329482cefc344d20fff924ae289e0ce046e2478c8f6aa454c86b09e733011fc0d506464d04ab04a7e03a2a9c02406ce431186d3a655539904e30ae73cdee548781ce5aab0c0d87fdefa532610c067ff76d37f2bbe0fd8231e014dfd152580a4e1d1c84698eb3cf613cb5ea78e32c4cf3b101649096efd3439a946e7841cce35451f012d13f5c433c80956fcc4de55653dc3cee9cf84118cb42af4c9e48fcdca52891331ed8a91baf49353457f119380c467c13f27a974195a2ec5a8b190ba26ebe7264ad7a1016c04f66bf1200b3b6ed7e38484ad1f16fd8b72c546c025170668a1f531ba6a05397cc157d4ddad01d7e8cf4068d47617adad5fe3eb552fc22e71398cb824a888ce8c24e691244efd2e8d51f0709af78f9e04e17fb5fac8e78dfc85a1bb9718cd96b50fa76e2dcb65482af0d771d7dbf2a6ee11e100e45c937658339c834cec723b2da0f29e2d807a4e11c3bf5fac0dbdbb6bdb9d47a2376d6c9329c9839443c69529e2a3102193e2191a43413599b842bf1ea8f225cd201ccf1c6f005cfdbee4f91e106560225b6ad437135e1f7cd075c4ab8721ed112fb6b7b1ff1e8d22ba7a5a7b8e65935b0ea13b71f5d17d4618600ecdde294a9ef2432c068ff6d21304ef9fde2dd20e039cd0adfa7649afb03e4c9f6b8fb6d53a1586490d2ed7c4746615ef8eee200e532dda1ecb58ad0544c911fa46aa7c4a191fe72a3b5c9b093c7ca18221e4c39b4adc7f4a6f448af8921f0624ef2f037e98beef6edb94eb1fb66017d54610aa9c32c4bf4e05d1dcaa339f8dcd8ee645b5605a150c2c5bfae162064591ce2d5f57fdc288848b25f8ec3552cbf08b4d98f0e6f120fad2509110f1153070769e6617409fef9868b8b538a953f6b9a029e61b1391af099489a927a1a60eab2b2693c38ba8f708eb8a0e7e6887e0d7a13aaa40824d73fcb3875fa0c0dda95eb9ecbd715c5fe46017e3d2f3b3f3d2c99faf4a27c08662949eb81091eec0520601a8c3f7146781b7e32cb09bd2dec205655d05586a07a3f62806a870a466fc3e9cffaaf4080bdad0a6e9cce0dcfec4b79c0d7aeee25ed6a7464a130f1b4fc890aee223f44487fd354a3334c6aa031af351e30f366cee53610387e7476a264f8a296cc0b439023b23d3c954736444ed528b61c938b966b0d1861bf13557be668db291fa8bed60a537355fa2645a9bb3d05f2fe771adac4d3c25384a961b424fb8086291edac3dc3fb1fcbc2c7f5b91e880715bef623cc7079439f8f24de79009efd72356ecdeb65f24fc6fe8988cb80bd0c2504873231c22e18e590069143ad198c7ae545b3052e8af26740f34523f3a7ef348cb00a8d5f94dd3db892b23bf4c96790a17f8a191e73fcfe845a5a32ea5cf617c6bb6ace4c2f6e0d967bebe8050590a24e8392b75b3b297497463e418a79ba8af6af1898ea83aeb9ae3342105aed0a1d528513182c1138c5346f3f7c5732cb0be92e5d764c04d6059452bb0f5035d546a8a0354c0898397a00894461c3ba3b3a713d1b17cc771638e23a7e15b4ff8b529dce4e6eb8d10e9485a399bbe10de375ddae7f9d7d3b51ebb2a3da2dd8b3d78948ace0aefb7cb6dbae464a96faf2b280d16833d355ad70a426c59f10ebb1ebdac95827fdb50e9c83d1295b0181a3a25aba61a41f407dc1c1d53a89bdb570b854def04ba892110794dd3557dd51ba752f47acae29974429b495c0e7c71caf1b75f36234c5ac932bb32663b433f9e4822f8272f0b126b31f9995bcb10db2614d54a952e0c2a53d8be87a20009643f208c012cbf5f70b5b3c0b416d8179442b7f0c06b49a47bfb4d383a0fada0296f5b9592ca44ddca15fa1fd1982e61277dccb7d6de92aceb39878041988da1dbfe7a5911ac4be44679757d71923d3e92c838bc548018afd6828035022487fafbfe0fb6023c2d4067c77222621e8e8450fa36b546071a28d4def58309ce5ef0caa0f586230f05ee9a76a35348fbf18b1b8092b912765fcfbcd5b735fc9b7130b9f84776cbe5d5ac753b337e2a132f7e7b81aff8514becf81128417a6b2fa618c16c58b58163b25c72a9402da1b2ac4ec97ff4924bb392e33cd130ed6f87c53cc9796493a497df3c1bd7e818333c83212f92b6106ce3fcd563a4f00097d5c0131548348810b3dffd4bc545a3106735c9849ea51d4e89684c85912748d653d463e7331c00c429c1528d3381f397a776cb4185e1bd0da327e429e38ac727572b5ffc99d4d14a4c50cd452982d40102a2e7ec569ddb32b06e2e461ba198cf9160f8569b6d7bf886d6c4534a90c8c359b16fb8a5b0b95313c6b3ec754a6d71c3fded2a2a34c3422504cabcaa09646cd38d88856ecb5a4f6bcf0cbbc8af96cc49b9ecf37fdf733852ea52f2270dd774c093da7f1d5638f17360271e82347cce777595923972350c4fa609a666dcad1ab8ff5bd5a6d53728a7d96ad6dfcf6b62e2ed387a6ae846d33f4f41f746bfde5eeb9ab98ddf9901e4eaa19d5e2c7c3bba841a2b6d1ebda30d9e56aa1ce3440578f9123dcae6de9d38ea8b663f720a22ea795fe61d83b525ff0b4e09d1365807c3b342a400a587322e7a2df44f39eea45ec199b219f7e42c1a07b81c818ffda263c6546db434eb16e46ee479ee718a76c70f1a17fd91c50809ba34afb264e2cd3f3b0b67ea3b2e6f8552507ad558587d3f98320fb0d15603a85cab8e84c507a39f6ea6d52cd48017fbba7c6d3979daa97779c64bb5b14eeb1a43ad55c7814db431714c371b9a02217e3046f707da3b5292285aabb9c1681326424dbde4901a1269bdad18270f48521f8d627161790ed92565e55b02ae603dc4d07e844f6df358ea1d4018712c737cf467bf81ebf2ba1c8a0f891d83f2fe236cd8c6825d6cbad69ad64b8a30e6a64daa5596cb7d6164edebc744889e31de316322b2e5bada3e12eb16702e8e058f9f56c0034fd6646094aadbad86dc0f1c676b22ee7ff5cb182932d649c49e674140925fa59b0fa0fe2512ba3173426b62b0e062e54dc82d4de7b18f59ea364a44eea86bead66ea0d4edb8d36bdd72da5a0cce07aff9a1e1c6baa45848391261f294c9de95b90678c40095a0a197af1a49650c4b84d5ff26216fd90bf045aafbd09e21e149ae844745328e38635a1c825caf8b616fa76279363b09b0d4b6b3656dc76df3906c1b2699de32db3e41f234db3f834ed7869ae4cb675a712187605c9077f3c8ad8e96a98cb3c527d610a3ce964f739c205af6f8d52e50f4c66cebc912716b8e37739270f244c74e68a49eab004c3d27ee36fa3a10c084902bbefc7782fd0a94917ab34ed1131240bff2ddabda8d68217547257e39a4806e4cd82f4e158df5c701a79d847b6e931c4ff9837dc6710b929915bdd0c33d2468414ac5d0e84d653bee59b3ccfd9f7618419ff68763153020666a7aae1b6caf11103bbb56abe1995ca62145591e288e74e6b2575eefa46735473a47ae0963581acb042e176021ea84cbc9ae20aa0e5043da79bdd74260b20e4e3723b3778875b7ce126c7bf9e2c515d6aea2a5d0575db23515af83a76d2acc32674b8a0e554727d292c5348996cbcf33c3f1890c3f3f7e06371de462d29d8da90b6891310d2ed5323da0d235fe3518ef135c750e282492a1681da55dce8ab7e8c6595c5ee7dcdcae66e200b93e1c3f0e39861d0f9ab1a464b5e4a352701fea36e854728547420b281b95a52375450a6715d2a8811e698ce910403277c1b19a24cfbe71aa8ea8fd5d41219541bb88eb82bfbe3cb1f16714c82d7e5a6ed8eb16112055bf0d722bdb595672558b4c3b0f8ca8878f1a8365fb554203a7bf62f2cf2873eb642ddd04d15d7ade6aa728a7f5a4344339896ce6e2fac5d8db613f6c469b0a794bd402aa86ebf0a3c3b1cc6d7456a741d2b5082da36a9bcadcbe1f494df4d23820adb0325b80e7134b35946dfd4516f0fa8ea8a511c4bad8af11c656abcb1b7d8677c56f56000f46565c2a392da82c07f09bd702a4c0a165be362b2320ba9060faf2140e6414539e923b6097a79337861534f426b52429698e3757634c09a89e3c44027a27fe08854b634abe7dda607c8a725f1ce5ce61bbb526a1574f2332c2e91e5686d094f06e0ea255282d48566f548ac841a6ed628eae9f30a7f348b5798ec716e1e63e146bbe04ec69a5a92b70691821e4306dc3197fedfdafbf45d60a7d540b7dc06983562a254f91f3d971e0d461838c4f4663e5c48803f7ba934a7feefc92df8f723d771af2881cc0044b5182b1f094692343589c5c3ce6266b719646ec2033452631fb81ddfa735cadb7b5fb06e4c1ac46b238362c2f74b29161092031c1ea93812d64392b95ec841cda9f70e85d9afde7957c8c67c1b7ac622276d091f163e318de860612ace18ac7250a22dcb1ca3a6747a9d6d577eb625cd0d1864e6ac8bd917a17b9211c7e6b8cbe0b1601adbc75e0d37437e1b9f6fea88374cf954b29d057c45c1f599e78788e96debd386871dcf6e3ac77d3d952499c186ef771925e6c145b117b2947dc579b68852680da0cd5d210cc2dd92a535bd98998dccf716d512f41098ad9dfd6bee39c028ad516d4b864a352130fc2a390bc2ce6e28082e1c5d631f544ec6526b86b10a86831662bfaa3f4b6fa8e6a7d078c0c6c615761ad0610615a0ab913901fccebab4575b6dd5cdaaae089ac29779e3e7ec365cb43292bd57b18d4ff63953331587261a9a43628c81633da2c6c1917400293bc1836fad3d25cd36d1e4a6bb00d74134c924aa50e47a0d95557059560ac886bdf7baa6011dbbf4fc52d830dec9b9fa43b49f593d412e885b8e762b7871f856907ee0f5f13fb96566ffef0d718066111d112a813fcf6495e28f86b1b27fab02ad3402f7e94db45fff46e04785068081d15258251248b59ac3b61a8685a457a28015e3a25f3596b2f4591cee02ce02e55994066a2952dc62b0d262d02673170cd3e668e706fd68ea1bd4f550e6883891cc822be931693c924691d1c1e1d4f7d7f41723c1734502a4adee28618fd37187cc9eeeb3769885db90f15077649de0ad8004ebc9c7759ae0b1631e8b4342c45013b258df5ad9a70004c307e4b416c11db374c206c4cf6b138e97b6c8f1ed696881f03a4d929c8be5910997b27fd6dd0abd1c324c8b711eda062958e807290b1232b35591edea0458ecc2930c808f38f337d8b7873d07de16e1926859cf88397d263b74f85dc8fe116f164fbd55c7c9f0648e1efc661a58a182a41000247942f93a333a81d70b46f1dfd4dfaec0fe6e96df77318443d636818233b9a1aafd8a0918124f3968280b5e8db6d68d5fb76d0b757601591861859a30b41f7b864311dd77d64ec09e52b8a6200d5b96483ff1a08c64e1abdb53aa4c189bec174401364027322b1a594c4171c011fd9acbe685d13fafd1155b5d3731348744189c34c5a868ea5034d5ab76124a44453e7ae94e8b716648abd3313f2245fe75a518790ee6bd860d4110b4620ef99096f29bca515ec7a8a7e218efb24bcfe250e557a1b160daa4e839ae821299fba3c346e181ba6ee54ef50f62218191c2e646110c7fb9552613a754b6ef50829eb2c7acd6d7da258b980d6b79c68202992a525964545cac668f22201ccec1875d17c5400f6954336b07f5f6d9448bb4a56032916054331e39ff222329fe615d63d029c43c95b5b776a848f77b552177345d3a70c51132182a70b93ea3a35b5db59d93a874cf153ca06250b83d4e85ac4fd21f48f1d964c003d899cd06e67d868b910092b56856fc4beb8aa1d048058def25e544fcf0ad42edb2390f8d8b386be9ca38572f439313d554e0a644d818e801293250a5752568cf06bdf9d403a9b2581581e2b2620cef6817e2513d9d236062c4c7e71d47a2cdb96e2ae515b6138f6b7eb878da5f8f77bc3a47d40d74fa1870786a6d2d5aec1881e9ccc1b5b5382c61873206b30aa2de3b1cd2946eb9155a11eb75be095605a36fe24beca3f46dbf8200076565936a9bd07318ef951a56840d2760b5d3f06f5390652797e43d1804382304ca9cfdc1a520d2c6d16470406e7b00f5c1bf2ee865e265b57933c07e7ac49333b57ed6d2e987bf0648c3bebd10568f594a54fef63bbdd46ae06bea6c02e1361b26425dd313653747476642519fbafa0ca5c619ecd0d8d30536544bc764662ff785e47da3df2824bf13d3124000d93ac62b01e378b39e44339b14cb3f6f19e8de21e0db5d25fdc9f6b5425f0de23f7b133b1a0c2796081547af54364e5c780fc9b61b3030a368e0f0742a59ddd5ccd2db189427325b4e6108d824132fd0a0b23fa5eed64c0154de9447d8081e891ca74063a0f1c6cba14c6f1d01b72461be709b4225cec100126bb5b8cfeff18490f953011c59332fe5002a225906bd62bec6cc01ba57bb67c947405928ad1d409516e6cc2111a7f4b245ed93e33157d7aac60c29f5ac566a04a28d8ae912095c09e1d8a717195eed3400fa6b2a33857c25430d8e25cbb485a7734f23decfe4cb0136246d696d7bd5a8f7cb27d9e0e9f88e3d38e217f0932f622aabacbef167c12c5c2f45b577e565371c1aea455600e61d7746785dee841877ed4ab20ce73191eb755c71b1b5e87860bf360fe885172148413ed7c284c178886462c6c9ad96c36f9d58a8ddf4e7db5ad1c414036d614ab6706a055bb10b1024ad7b0ba9c09bc16855ff0b6a066a04116da4bee142b273415f387ad5ab2999af931fed38d15a5015c51e52eeac9adc4b1460e10bb53430db97b4c95801a6ee0064f9f4e04cc9348f17849ca2d9bf7fa0e54eaef7573a32c0759844aa6d28ee7c5ef3820b3c29d312e928793d14a8d767fab1c6cf70124da423957d6998b08d8e70fd1e9acd0448d62c4ec4ece6943059b5c311466988aac91a2a6000e0cf33c32c2ed938b24b688a4f47ec8f9ddde2529d0908db7ea33852b9508ee3df6bf4bafd63ca58c212c3b7c9c5dab7ee926103b0ff86755c750d42554a784b67cfab4149af0e84147862ecb33f3c2d4e6cb6d3f193016d57f9647e9f72632fdf109a9a03e6f33102644f2936bfd32c36132e3c732519f94f183439145d9aeff32c6b33f1f6d9ddf2782c7ff7cfe8315a58d583bd1da523b74bc197e425fd347455781657d21a604ea2d1c6a61498e7795011fb7cb9c9a0582e61dc235de60aca23336dd7c3919c8a60e40b2278759087bb27764f8ba442cb286006859b88895afa669777c957970595b0634849a644d3abb20743687f6224aee60217e063a984ff0041d3cd96427aded2c134c177835c94d979c500c7ebbd45c7e298c3024e87f2fae3cf9b387df1aff2debc4c36266a35abfafda06677ee4aed45ea1d162ea4b07ffe0d896b3251f3fd6f8b4ae8326341c22c80f67e96f8b69a2605b85f9c41aebe7c1726168061f9466f741d8dc2c2b9c7419afe0ad1ede1c63589d7ebf3c7367cf0e989410d99b1cb864bb89e530cda1fcf48140603b4e951025008a02d7f3f9fcbddde94c04116ba185ccaea1b612aa3b4e455c6a4313e25d355f1f19a4ebca2e838295b115369c9c29250f19602f14c6b0244e4c3cb24b2ce00c941a8041e75fda9162cb1ede9c952250f2e490f1d9ee8749f6a125c14528a91335c3586361713873f476bc0e95d9c3e63185597be638b303e0dd98410ac0ae2123d103c86f65a063575d65d966a1bb4f3989255a66f416e4c24fa0fb966400406cbdbe6f5c5e0cfcdc27aa29cac46a271ab15ea0edd8082bc2fe04e96a76b8de668367494d6faacd0f599f49a1b663b9b6d788d65b2a5d50806c2b61f14ad00e7109af9ae52f9e1a72baecc97105978cbccfd285039611c331721a1c5b03ceefc1d462466cc4c82b7118388381beaa33698df33dea7705a72313a0a11b1794cfdd34aa5c5193ae19d430e266f5d44b75e90d8687c5df4330b5d85a7fc2333b1f4de42e81f4010680e685460ef1ce6a69059c23cead98e7389fa73de605378ea7be2081e644893be419ada6587a5c49e5429ef3c71f9b5db7274a10e5d6395b5ce7a840fdc46a1dba8809ac298c9ae2fce712afd061268584647a2898d835c9b46a0a12313a1104733787ad0c5d6802643b91ff62acf2c82d77ed5132ca3285625090c1e8dae7eec8c7de3cd1a9fa2bb18e2fef8e027c81c605442e72202d737afaea1c9238d1c50e7a9521401a9adab010825ba62cfceaedfcb5caeb9f21d40698a7d1962e7ce6d4408558f08810790d35b41d08538af3a405f1c74c11c6fabc5a1b7873471fbaff66082cea7f23a77f0ac8b2750613001fa7b996e2506e68ce1342aff3707f7bc4121f1f4836702d2f9c2f72b0a3c31f12815bf6d85abbf801a1e8f0872c3a15949140dcf51aab5161b952f270a767bb4028b4355eb3c5df3ea566b519fae499b336dbdd0034d27e0412cd9bffa2e104e5ac111fc0af6829abe99e0dc69ace021fbde38884de330553da831f514f9620980d53bcc89e6fcb3f7aa069f7274e4d1fc423c3192d0762f3026d8059c93268166a3ed3226d87e8cae95f521d717d476df19c6c32b517928a497981816204b4da97c49a43d0df781361e537597294c62ec21b80fa33f0cf943d490cde9fd8caa75f047cc2846a06e3b0590bc61317cbf74557bcca8c5c1927917fbfe544ab58132483070fed596a803f145812c8451e061a0fd1cec5be1e0f3ea6a4eea431c73fb42b3f6e92cd8e6026e1c9e1d4f63b5eb577cbd1c4caae1abff084adc201354d66aa480b5b5ac09de92bd7453364b4d02e202bdf9414f209319fb9783bdc67dbac2a279d0841840224fc9f36e85ad20ab3ee48c4f727acca6d90c5e3e08e7f1c0d434ac31992067e52589bd70baf8f2bd1bcfb4cd05872ba2b8115cb4261c5d4f8561e99ea37e54f3b5628e0eab2c010a4be4d4e092eab06202e01b5d9fa330b80bebef90a93601529de5716a3117d6c21553cc7831f5d625c930af459030a6c6a6f19cb629730a10141ebb17f079a22695cb13b7eaeca37db1fc789c74e5dabf39d6f3e241bd10366ff7aa30c0adfc24ace38952d022c989cc49f3eae24ddbb76bbd5258308b788d5b514f1f55408c1a082f3228999069891d4ac10c4443dce6bccd78e2c0f922c021837a8fc394fb3d3dd276ca5761ba6992975a0bafe0921e02059bc8af0af858daea96088a5d8b705513da8abe3e195ce4e735d93918cf241bd939dcc29b0405342e14138ed38395ab5b7f11f47c2058611cd78fa78316230a44a318ca97a3c62ce9f51ad3567f5405537983805ed53a43263f8258a5c9a4bf4193aea2100516212dd099a17c8df11034c1c5799c2c3bf58965c0f698f2eaa5f7112e8aa3406fe720e24d32aa87623608bf199bddb26cd1ff61206386447a7ab103aa8533f7e85d82d8774d45b98490c49533b533e4fb07337c233c8b92713d60a399eb8fe2835fbae799ef466705fb509b1685db18a03bf4aeeffb3b8789f41fa07e582b62f09849afcfb38308591b8d039e06199bb7d379da4e00e2ca53a562d68f968b65f34848dd90323ee0b662ff43d96a80ae1836bb5782faa0ca1a85d764cb0b160fb1e52fcf4c9180e9918d0f592390d22d15c02e13b4f479c5d5cc7bbefc54516a0cd42c5b5c321fcd2e4f2342f6c2f23e372e2870049a4a5c34ed31f9681804b87f4a0d9a58382204a7cea0340052b2e04e79ab655b2c33e439aa1eb21440bda954b6299ac24ea2c2acec0e7a25fd946597a417b6ceeb362445101f3c1aca876831b90ab82f7c54f719020c339d4002dcabce40e53a0885c8ddeebf7a6076b20067d441abd189c73ca658d03b0ac75b8eeee3c0058cff9eecba2bb104f2dc58aa28de0b948f70d766c2bdca580fddab47c956f2ee0e7320c0f7240158e0a47740cac8135253114c320f0bcb5dcb0d255622bb829f1d336807c36d80300817fb4bde85e5b8ca934fc86761569d600868172fdc812dc691d05c8771a4af19205d0b2208a39817cbd4f27fd5e39654672c7c3dad964a4ba81997acdaa0da28b09d24e2edfabb076ea51a57db8f62d5856622aac54779df9e772e1950e7760f4c6a92d6097547851bca91341e00083c9f4bdd38ae9c0e35ee66c3a782c57a33ccba9ee290cb6d419028bbe604c94e5b3376c74c8674315f677cc3fdd9c911135be6c851c69a849b412aa9431b2df2c379161043b07958a2504981216c88c4a19958b24f12505ebac44a867e372b25564c8c6dd2bdf4107aeabb013d905aa9d8402e2f240c71843b3338d51bf0fea21c56384eccc21d851265d5b153c629fb42d61a7c44acf4a775cd51cb542092f1a7d277c0a8ed8faaf6ca757907baf79c4d27bc59dccab6b8aa013bb33e935aac0297b7ab84c3ef8424a0483a0514c666d4353269f1f337080255f4f6988711e7ef29540ae26fa8b6ea3e426b7fd1fcbafe8b0b9f8f32df2688fd4e12dadac434da654e79ffcdc7840f941ba79780e1b26eebe4900f90e568eaa00b4190b08137781db84e2f7e054b622d8947fbb61d9110ab1fa869511c3ac8fdef0ab9849e713c3afa2698579f5fe3fb00cdf675d01097db1e5e253c9ecf4b8865f26020b493a808fcba393e7639c1ba8823dd8a2544535ff8f631fe109b6e93e2ab866abb17d2facec2281ef5a8f44d4eaee616cc86e898821961d5c087ff70cb129e21d1ab9cd0bf2aa5f266a7db9773fc56941e7bbd0e2fdab9294b0017607d546ef1f207ad150db4d55bd2b692a6267b60060080f3a744d370d865a551f622f4cd33f30c41e4fb7ec890af5eb34833e2625bb6e6c6cc3731dc9454b6649992891d02b37d9e232518f9be80964a5b5f507d48f004c2572b691494912209bce16c6edc8a72c09384770937090c304a3de453f1068c5de2a46f5911e2e65b263beab8ca3d21eb5f687a182399c6dabcbbb5c7a606f61cb1ad273c12ba3193f6a3555b627e9267b7c8d54d4564357096134831a58b456c2f18759e5c30dd4f27ae12419711f06fed87f5e6373a97371addef54496d8a0b0c96f6ef3dbfd8fcdd996a38b5c28144ea25ab65d120b50164f271481de311bda1f0adacb7099c20b8f1f867ae79e7d3ef0989b95c00200ee8ace2b262f8e8cb24aeaf79236283d16a6046ee47d60910dc6dbc74986157c9dba197942cf88d1a4d67e834ca082254c518b5ace8e699d6a27830a9e4598b4bb8b847e443c9167cdd3d5e215d1fb87694655d02026bffa14c702070a35513ce47185dd84bcb2ccc312c86b138fc017a04047ca3ffa1cc1e04b0471a7df0cecd238f8b61045b5b7b85b2778e44c0400d26bc63e793a5e56dd818035414a8e1d1e9c20448b0285146a5ebcc8b9ff63fbd1eb9a18902861af74c263b495674d326d4f1b5ae24dc04235d6a5871e282cc6c3ca117b0ac0ab3fa9471a8ada79b98f6a7479546846354009887cf5a2b780c46c9e88fdc6f4d260b4f6bbb07055fc12f563ceb821d24a6001bdda50b8514b830dfeee4c0febdd52e3498ccca428447e7596251fda847449031dc08be8b1f11f31136b1f7c892d119ffc901369d78e4775486dbb1f808fa9a90d74f60f35af8b1ea6e30085cf5464162ff287a3cd9037db1309ab7e450ac951da4e144b979e7afdb6eb3c59c3e42c3c4eb4b7c46810138a84dad981f10fd45b2b0cecff61ca374e214391e3651d174f963a3c22edbbc2b4762be553992d823064aaadfdace5e3383e3342f7c28e790621370ad7e19fa8b6514dfb04afa1770fd3f625f37d92b42a0c2ac069fd52cc9ed1a4cc630ebfb903fa144e45fe2f2f269c9e42994e7880b660b6059b2f952316c952d1320cb2e904a6095fc03426c9e33d750fd49af5865802da8fbe05bb61e10e59e64ba7f22e33234c233067a9c902da28e705e8fce2632b2234d762d8427875ae20655a404e5189fd0c32cd198bd1e67cbe65776ec541f75725fdd595c0a38d819f57f0c865bdfef0a123fc932ae652846fb71329e4301403fed976f052fb366908101d1420cb5ab3a2e8a008e5b2e8ab10f7b54a4f157930783e4ee80b3b4e8b4351b7d96b1ca512a52e2777dde069aaaeabae1415234b755bbdf038b4c9c636f1781e0c9d5702619bffed4b1ee09ab492b2c2ae486141478c759ac8fbb8fdd708d88eaa37b93309361e14f149e8751b6e9cf0d21aaec2a4fd22424b030d1b711373378d3f2b108205bc89a0fc22d94a6caf89130e24a4b664e6482aaeab2071d7eb8447991e4998fb0a544ffc4e2236bd7132fdcdda54d5d287473e4d92b0a0f01ca0207ce22b5959845c1a37cf08a7876ca87a073df705bb6f097abfe25f69a3c0d28aa85f587235563171dba4017b05be22407833d8b888ce31ee2c7c49b70dde9330715f074d7fc99f13d2d4517dbfcadbd92d1a08e9de9c09894dcba5afa9a8496fa59c10369d02e1fa85f9cc92ab9a0bb569bb10644932719f5bdcf58f59b038c5f00844a71b212c983244e8e4d2f89992d7efa1e525514f8ac07add484109b0b505bddfa80ef11366ac550f3cfcae6505d398897e6e9774e34889d7e29062651a18dc9049de8fd8f728638bce4c7f4034f87af9fdc8f5276d7c92b95c5965370be9980fe5013f7deb40c3c99156c0140ffc692660e676f346d2fd250e891edec77a20d6ac865af5e16ef8f2d5c29a60122e24ed8ac078ce6a4774a16453e6c3515919a19e9a082cd38a234950bacdb7bb65940f5e49264adc169e6dbd166b9ebde956c105ef3eeeaf18f3db1e9fe6d01c8ef5d021fc6a5327a995ccd897101f80cbeb40403d29ac26c1238757ce5a1a20d53862eb104bd175d6a784d29452619a3df71509de1e6f1cabf1ac30c824358d0ef11de2bd2e1a4f622388de9359690ba68eb3a64ac585a6462100e33a8547e289aaf8dd0caa1f46a5d531b4bcbef302e3b89990e61bda4ecca0e8b21a04a14200b3bedf0bdd84ba6c8b0b555f6409df77d275a220b8b9ec24d6221ff2a41ab7f2a22e794074b32aaf49fbb64fba0d638d9a898bb53cea21a4aa0e9ff84b16a683a09b813d5806d77e0257e3c25e24403e5b9dfdbd085a0848d39bf06488230c2207e14559d14d5aaed34b2c329e2e976e3a89871c6e99454b47dc74bd644319ee318f16086d529ad4a0c43cacba8588dadb42787e7350346c1a756f850427d29d0ffdec9595d5c7781ce1bfb0b162d2316869d3b543797278f1b12fb4008544dde7b50f4037123fcce415959a57069de6ee7798652b2bd880ffe3ef5420a107ebda829520ae1485f39718f1e4c37a76c0f89d5ddb8c0e0151365c55a882af011f68f1ae2e2c234ab47de764e1a4f0e56d9875fc1285374a7c932a148e19d07f2b166100373d7cca9a35e84b853ab5a466883524aafa1ed5658def66d2c47d900958a0999aaf136d0dc2823c844678758319fe0ff8cf83606ce97803e2a8f2e17b91d8a32d578826b569971ceeb4ec02ee42bb33cc0e28dc11c31b0720bef887e1d5fb6ae55f4eb868cb08bf90af4b177cb2b87372d05c8a8e4e36b41272f5db78f588a00c41a03bc91cc2c36f99a34289fa8cf87d79849b02b65f60e86a86f99564ed68387b13dd1bdd03a46182898608e64a184cb5bd6595cde5a7640fdbd1bed3f31429a13b670c2c5cc560094ab5f33d0985d002c2073b4d6708a762866ac31e59cc85688880200f7b96c3ec3253b3ec0d4cb473cf64d086966c43ea795eeb3969a3206e04aa27c26b78608b792d58b28b6a00708f411f2866305c1366ec64073a9279b897130ae54d0c6613659337c18e24f898e5764ad4d0a5969405af3de882a36cb9db293fa708f06bd7e6ef564437495b323a059acbb6475c61ab6c790405c2b73d44b7e36b3817d50c205e683597a635e046dd05c7ab7f5f78af0bb56e20267a61588215a7c0747783b33c163c6826b63d16153a7c69bd85b0a0a5e774840686ee3e16a40c1c8d988141d38fc59961dd4ddbd070d2b6a821d5c2b5399bd5282a254991490794b29885002944bfdc2a5d20771c16e2159a1218245b9dce9fd7cd68e43a68f6adca3335f95d8f4f039110e35570596fa1bb337e5483c07cea00464c0f6340f2b745176a1cc27b1a1e475554e68745c707a7b1ac7d52d53c3a75cf473e373008d059e66a6af6e14efef834deb1e49c8363aea50c3128860a73108b8653051b7b1e92db628c0911205293157aa66742ee260d84aa97da890659795ff8fa3ea354233100f79661c877002a330269667e22abc6f6f402d03820e72b032dffa4176ca95388544e597ff450acb3768a3a6ff07a2ee61c022b280008dc3341cff227e82a92a48b73d4f1d6f94703bb6f6180ad372da8b700cfd304e00c673b00ea4c97d71207c3f715829bd40c52de64a26575c97194d987472c6bb0c0c3df644584bc3b2b150562c93c3e28e7c2994da751cf6c2e24a9a47299ee0e81064a86458fe45153fdc55ec7d0abd71e6041b94c968fb921e379638866031bcb6494e255086180486a00514cf3cbc211ccb7f9edec5c9b3cb00670064e2620fa6f7325ac078a723352b5c9c0aa3ca05bec01c8c0e0e4cc2bdbc084d97d202022022c6da2f0cfd9847b83e42e8efb1caf1bb12f58aff937c8b7071affae6f9770b294916f334f848594f47f1d80cdc5a8aa8066cae49ab879780c32be8dd184955bec8ad84c6314f0224bf62b8c273b4780acb813cfec13e1c2e54f46aae5b88395d0ea6ba0ab48a28fe254591e152981f6bbb7c499156f972a225890122309b26760760df423f1b2ee9a8c257355f6de3106032dfd3402bf5826624b21fc5f2795b8169d430b733828dbf3c9bc5058243247b3fd2c9ff7e3578b1ba42407a8ec77a0a616280ae656e2cb30a5602b9fc8cd0f31f05e81127a1ffd6122378bad9b7be1e5fb6d3add0a036c05d05cc8a7792ba6e393586225161338b0c5e73b1a8a8ae82676c5d90cc69ea8b41a7f8f622a419d523aeeba319ee25c182e84cb0a876f46e38dc927a6607249472599449c43cad37017edd06c44854f32c6a530a2ba1684afb5bb7f990683c25e0af842773ca1dc544664d9ea1a33a9c34d749e350437e28948d25fe8bce22205e9e64779965a90371e83f18070a0be16ca1c52a9e0942389612e78fe49197066b667bff481b5235a034ac3e20ff38397c234c9639b011580640fe2fa70d9d05b07103d48f5db969bb6ee9210cb22b9288894f5a1858c83d1fda6853dd465cd8746e9ae38b76b3ea6b26a12c807852e801755a3912eed950f8e9e6a8b2942811fa52a5694cfe43ba71842108c628c75d8e76d1565917349dab0f5de87d07ada48e63a86d5873d7041e2544c040addc9e4f24547190a1c37ebaa53f1d40f74e070affde7556a8455ab16f110e175c8c012dbceb8bf6c4fe01e6bb653d105c4a0dbbc0077f194fda64173a13b16a16285c322486a4686740b10f6edcc097de6b01b65a96a79e65806f1851588146f64c1147e91697e9d533f67659563ed5f532ef74255f5a3f0fb5d0fbd90c8df91f400f3ce1c0ad5d88b30507b91deaceabd55e2d7829e5cf48eadbcaa6049d675f187d54708400b6e25143cd806ae541d4ea1d75078e2629f8af197102a8704802f8cda3a3bbe9b42e42e42406afec569b68da2011f0b26f270771d1eacd0e1c51864849c35304f3b3675281381949c71af2defcba6573da0332552d5ab10700b10df5c632b44807397e502cd30e4453aaeac10a82bbcdb6d38bf6664d7923d161c5fd6893c1f27fe55ad050a6a85cd2d02b3afb01bc95d3fe53c8364cbce9f999b953b37e37211bf006a221b9d5cba4ef87cf1e7291801cdccce8151331ced351d958fe36157e3198df6f7006c0680c7c543c7444b59f1466620081cd43ea411948803fd2676471a475f185535f742f8e59ca83014c7e29a0b6457819cf97e58e2ee61818caaa0bfb9f91b9408421b3d52bef5e83b5cc09d14a6a882b59338c54387f814ab5b3a05b0350113f5f896e6b45d9a237bcf787512753835e730551328fb8847a3854c05070d8cbc7bb8d010678944c2cae247fa84a0506c6bb94f2b9ab0587092b8a0659a98d7746884568947620299e044056fa3874491c000a8f5565ef4aad64239eebd058661a007b3da4858b3829d328436f4c2ed70d4d34eb049f43134eb139e3721314321e05c38c7e03885225716bde74a31f1c1098520c43c16ce6e26e64b2bdf0473d2424a8189c56e5c775c79c748a0b262e6dca406946198cec722c2657160bfc70f5cf9f0842de350ca281c4a834a00e7d48243e10891d41236c203d409cde66bdbe819b14fe2ee1472a2081da8e12ac5d3649929042f7af67079de41709f5963eaaaf79e9f1594f165fffb4a57d045888440c94d9755307aa21d54f019e27d0c8216e3ab4bf117534fa427c7f1446312cb9c372755e2b66083c850e9d2001cc60aa974793f752a42b4557e4ec03640c22959418c919d3821fa258fc174ce09ae7250109ba504f1de5f7e79a37a52f914bfa5a7e0cefbd7154f5d0889ba72ac6aa4964d5bc9e58f48d3562d72b5297f64ff6750e123ac4e6acd28860023519840909fb43fada223b66311d388d094404322a6d81752ee818253a9475a2fb0b6b2ae3549f32b2811898298450f86ff0cb3fdc48f53bb8230702f67e12ed94b7ad29b8c917adc1306050403c989e093c80bce848b458a84a13f358877bf01f884de93e85512e2c7153e1ad916bf64c1df46668851f33a4bdcde32062c47cffe8a411aa31293889b08094b2ce29617d72e6e04ffcb778e5810608d2775c6788c49f3ccf212632cc670202d8cd64c836584edddbf866d5a0a1bc51401eff4cc7f351687cc147b15661266053ae7f6c8758d154d1f059bcf321eb6727e4ae69830d0b043e9d8f75ea822d4b700d0ba5e5fdab12608d61963078f0078fd33cb595f1300aa5ea9ce52296a2e039553ba9d8991e8f27c20e8816e6c1fb57e3157e301ba114ef298cb44f7fd4bb61d338feb444b042b57e7eedfb53ee0a3ab66f535a028bb72844cef7f5a0b8c22614c858bea2d218984b811260a63091f0aef29d9eeb7a11815f0c2905cf5eadb94e33714d9886953569ac27a6fb49e10f57571d9bafbb59e0a5d5621967e02475a8c2e75bf1ce78830441babba6eac0b78749ee37e7f0d68a7730c56dc53fe8eaa8ac4f48b90f7420ffc94eed65e7298b2d9fcbe137a03422cf1b724d06af5551c167a9f7a53f8a590381853a2d9a2ea00d2d50c025a428b41463159ef5cfe4c7984ba8db0e18d69d9cf0e72f6dfcf9e917b8febe5142629084316c0af9b2eaced12e01d56e8fd3d44f6e52f55936e5d97d6851ca352de91c81493f91fd0e64d93f3d6c7daf0a656f602c4b8081f0528030b13d18456ee6464e448f8c13cd3b331461eff815ad05d282e07149ad290b601d055f8e0111f93049a2954da61346a0fec500c8eadbcdfe0e0526d191cc2ea3be1fe87891c06b944c7b0b125a07fca4756f2baca4f08e4e56030db3349397af129be3fc727ca4bb8595889c6ec668213e8bc1ed7601ec83d3dccb74c98408e2fa004471da85a0006f66f129137092f1cdac0b76ebb385bcb05dd286d28b860576031f4cfa9e88f1048f3fb9cf46ccc22c59943d6d92ce16c059de43c51cef8609baccee8f78cea9af5a1273d3444b197fb00066485f965a7cf34029c64ee9f45c2060eb133ae04852df3418c4ea30864b06a977140c5a1c044fcfea0b6fe884108ebc68f7bccc8bff275ee807813e4de89913b1dee7782cbcf40ea551612d4b79302bacb1caffe4fffeb96de05a8854900b5ba20a5fb6bf1584be07c3bf0d02e5c812ad2d116ae18c23a1089e5affd38d0ac94707b71ef49fac74b0724f1211c6767ed483039a1410930a174526e59327a7f5e2f3ee385cfdf8e2da109c8d2876de7e698397bdf3850b84a6bd0016e7b09068f770f89b05b6a3dbba8e655024d92742890112a7b79d42e3bb80cd87fdf4175f1b579516260fc2e4192c67711a730a0f56db68958fe5d10bca0f12d0f76c9b1073818ccd3d9aee9487a7c5d856fd330c4fde9b739a8fad795cb67c55e2f12437b75fc936224bfea1f595484495d23c3d38511b4d9aa91314dd4db93640c24631901099ec6187349d5eb5a046337edc560176394477350dd4cfe8ddb7522552ec1e7eb27030b5d0eaf75916c871985d8a599455baea984c8509597bd51b0b394997e3ec15d0b8470f6b9c48323805a40d99ea0712ee671de2931f48d1c4ce2f678656c4272f546e417d4bb1ed47aeb9dd636f57e448effbe41ef4872ac6d4188ac656f06620d33684baf83ae163074f9c0b3bf89668a1938eeba77a9617225fa2a48f7d070530ea2b3870c738ca7d9f8d6bbdf50316c2b9feb501a7363c141db6f6f17085974c80a4bb6f113addfdb706abfee03fc750c0e7d5b839e99032044c39c00c6abff8630149cf357ef7e2e911688e86ad65d72623901887a88be3b5e57f352b2dd49f6017998e92d6f2293f96a9424dddac370d836728eeaa65b3dd9e291028da4c372102a4bcd78449a80e8a8065c9e1082af5c9822f7376f4144d2618735d662042b620d952883594c635fd48598c935a64ffae196a05363467158fab00ff2c46f0ed5bcb6c0d7694cbf3603eeaf4df65f57de22899fb2252a56ffd87334ea66c268fe4dee7691ff316bdb3e8f5d2068d03019e46d575624748de53eae6cf657e062f68b285dff153220dfbe8175298e486c8902c34e86a817486ab2b633665da1405b7e8049858838486c0f2bc9980a26dc256ab2b9b23f674edfa2fce7235d4359ea7658298f414f35cbd01640261e685d312c712108b5222968d3c3987024f1b2a13ed8d435b48a84964f13defb8c2d3e3298cdb00214e9256f6695d5e90eb07291830191623f0af066c90ee6d67e442f72d2b595d051eccd5dd13fea3f49bd8e59c8c14e54e07c69a4daf75c65d6a6d2fae2228c1b54becd429455926636a0ace266e5cf4f8858c594513daf01a9cabc4c0564558d66727d3072cceacf30b07f3e41001731226a910b6f8276d68b44a9d65ff07fe6bf78e6161bc560e7030658f74ca8b837e5e83bf40eef8f01580e61c01bc4ff4fb9331bb1afaa942c46aeca2954f37c91e34b09d336d8981d37b9f6f61b022d73c6b97a7974149990735b37f23909c0f09186d4158a94a58b36baf38f31732d504c915688541ac72b56c2c87b1a5fa209d10953532cada4a532da955deb38c9814f23dd2c1453f80c22f3c9c18b3421054ad533db055a0aae0e7aae0d5e951214edada2a811d1851ba1c8b7cabb5563d6056f5769aabe79506acd399fe2c875212435e645d02787b8e7d7fade0b24b4bde5b9e52b71e227e41d4b07f3430fcf261b8b99be508bea32967486ec4396a98e13b64bad948190c46aac272f97caf07ed42c51ec9776bbfcb3c4a699d73c2b80c885eca8e7463523a0b889de55d7185a86e9885e770afb57511084999f110c09b3c63a7f6cd78f01f42b069ca42bc9fa2d11fe1210ae06b41501874b81d31b006bac794b47a1d201387f46ca7e2e1167a5265b7f3e353366f14531bff649b245ebbeded86883ca460ec39f0860a5aa7281f847e09979cfafcf47f8006ad47d16524db1cbf1d310963ae63b1240d5f325aaa5026c4787616ac1a09f81f42c24d07ea2c05980f7c681cac3ac5e847e0414346aed0d876f7cc9c33c2a63c764e58fc93e4f7ae519d9b1974dced44df90761c450b14122b05f36092138d1aeec66293ac44530db8618f03d71ccbcd36c92d20b5e07c41e6253add0700279ef9b2d7cef8d4c3a923611012b10a89b80419e26544ca2fea672cc2c28e163542330a68908587ac90ac57adcc862c432134ef64b084392fb386aad160b4b703844c19d21804f2b98763f552238065ea0b7fd7186d1fe20f7d79f736ff1a05f9c2e06bb41ee331069e9404784803eb505bc46a8f24aa40338824c1fa000b77c9d44240c71d4d7b68b1ea24d264c7da65561c885d65671c103c7e56d801dec5127a3adb15e303839db0c82ee7ecd17ed56f2d0f20e06057ce49c57769103694b1010a433c147bd771e300378834c29198f197d8d0e9ffac14e907e436d1d8ae8624ef204eff905f469d5729333409bcfedacce25d0903d30ce8b54c7e76279adeebdb84cf8f5d66380a53006eea85a178a9cf05e129cc31f756f8893105df9953a6166a3c33351207e60432db7243c1ec41b3b73d601984a5a7f0ee4696610c95f373d4b8aa9caf945ea1791710abe924e452be6fc9dcbdc0b251f924bb820eb7e98833190365658e4293f1a5f6af0ff2f2e15fe9341e8849a4d6b70f2fc15a4824457cac95e7a2d30d39ba5560deccfcd58bd7a50b5c8855b769b5fe6e2c7b72ccef80220646beb053f334f22cf764e10dec45ccb17cd0c0540b2a97f8ea3741ef1db376b805527201b7645ef7faa321831c0b03d98259d82eb724e0cd2b0a138860b8acb35d5d9b9eb09de88b95fbfd7be3c1466e75bedb81a699c2d5889bb2554854abd8c9d1c189e6243dd99cb9d6c8b73ffabb7989c34b63b7887a3ac6928db3dca0fa63c8c56381a3fe0686887c0e47e645506c321425b54040c153e555231a09b9376a81e79de082b82a254f0a6693db3949fcebd7b1dbfc6fd33d321bf5f0d0353bece660bfa19d4fe1175da9f69e559682a219de1df66a5bab7e28a921014a9f8bfe681b583b0d702c90188ac48c1e9ccd5f3307889c4e2105e92fb2a0e018d613836e00e3571c32d4ff8f274cbc8a04c1c0904f06542e9336e08e1dc27a1519f1493dc9e73620b81ba39c593b322c67022931ac76765c0e6dd4a9940b9f59f24295e81dcb8d12e8a5863b7b54cb915579de039814d4c7adaf18099c5d668c724afcfe10b53132a61cc41ac3bc06aaeb1ee2c2c77c87035c1616fd62db4071a3d152df9a0b0d9177a6240975f44f56ab707943e36c17f189b5af8e73504a39d0dda3981f048c9ac48b4e5fc38a8d4176680e6f89069d7f71c789ac227b2de79c4e2efaaf1d1414787fc87ca298095c170fb3aea2f083818f3274d873b111dc7411d6208ead0d47d1d9be8d2b8076ce138704d7f60214f1d1daafebc96461478ed828977aeeb4204bac214d937098be2c02bcdc97bdbe28d6f46d4c23e9135a4a277cd71083b9159341509b3d4de4f0350229ff097076f753f06b1e66f89ca0e039ea6865b32227eb63b76c49ab9057873ff92c391da1ee4eefd8c029c51af368649cfcd8623e08e9fdb05055a838870b0abe6a4bda39a8aed0e5bb24601876032a741fa37852f0ef039bb4d455304f46c9644476b1d00b41c02381a3b9cc992b6ef9aad63473f53756d0537340e8d5642b1fa9e4196606c700fa70146945eacc5571e38c495859754dbc3232553d8f5c0699cfcfd4a5a35dd3511225cf8450642ba9f3321bde972e9351531e9bd9413844da740b8bf309f19e45a1610b4e176226b1169a670e826dc16d676ad84255e50844b413fc7ba54358fea8bb49d00625e6ca0c0ebeb282bb681705f83e8048130d6b18e91ed12b39dba076bc84b58ba4662e3a2e2532e6630ddf0a7acaf3910e9588875f7dda762d42824c8cb5ef7c91c72fc55b3da33dbae9e889d9b93172692ade1f5ce045f148dab01cc73776b06a7d3c3cd96da8234740bf7db378e6102309e6b8f0d86ddbbc4819bad68017438d0db7aec077aef7a0ddfad8014df250ac238a405e462996acc1a43d725d462c88bd1a175d717c1a6cf89966cdf1180b314116431543e5e4d40970fba20b1e48495278d860d9ffb443511023eddf5e048d6aca4a5272f4a6d592e937641c4b4f459df1330c850d078f8c0ce221a9f19b63c5a43c6b6664a141cf9ed8d00f23c0d37329b564aff1dac36a89f2d163327e7f4836759869728bba09862a666a3e05815ffadd58a714b00f158b87dc75ebe3f97282e2917ba40228bed2c9a203c042d40a950698de91388ea1c8a2b9e0d9033d841c033128e3ed30087cbd016357ee214d3e2f9514d6fe078b979ebda8c7bd24d56a2dcd4d6b6965352d3980705d8aae2c062e36b67a0c808b2ca59212cf4e8336e54804f0920662c18faf3065665067cfc5b082176fc9269c74f6030cf63ad2e2eb780a6bcb131f572dd14f16a6aa58862c7561b7c0d5d3025f54e31984535a99d7850359306ed70fc8e0c2e24d475a2552f3543c6b181f77a72b761d57955617905f75c041b9e9ae9db88b65e302844c1a07e888043ab5e2e9a78a0e1cdf373cc917b6b8945e7c931782a30da6f0111a1c1d90c94bcda1a77df52d099bec8402db00b8abb87b2b07808fbd728f9bbc3aff50260b602c5ab2af1324a9ddb96a52ef2eacc93801b4bd9a2700007c1bd444add0a132a0a0a0ba86fc5a05ca2c757a2a23b97eea31a38f80b07913250cb407f33b1baa77a34d92024cb275ee28e75903a3341fabdb9a12ad56308d0efae3ab4801f82816985621dbc7556f0c65aa6cd1586a9e52c5110242d65343baae0145546b39b702c4a1d569adb74e207bb743933f63e9413c512f94c64487e0b142521fea3c761813c05f4ebbe99ef18ca375a5fd5e04452779900d1c7522b8de91ce200fbd0c59faa87a81e548af11c18d2af48ea9c109212f7c679645a01332578b2d2242db7100a5eb8e0417f29f68fc8d164ff316b71aa416d9950cf7a29563f613e3f16672d967d62c24bc3b4c65b21cdef234a916ead7d8c1e9a294061427ceccca4d076e68e48e56ae01e8647b3c1f5ec022de731009d17f2813eefc80f16694a2e40e45b405b2d1fcd6b57296ddde3e18c6170fc189b8bbf3b048928ef7b2c601df936529917932e1e0c52a53ec169527e3a7aabbf1ad5bd99a37f50c9bbd59826c0981a4860e61f9a3b5368c3015b7b2637e451c1144b46997315ada4641ae75c9f17536f00ee9d1990d12db08d629a81c497f4846b3848eef90b9d7b67dd7c27727260e6a435e639d97fd15a07702654a0d1e831e8c451887b89ed8cf13f9dae7ff5566f404be0121650b965f0fb5c65812550484d95520764075359f4ac27497061432a090e94a0fc0ea218750d0bb567d8dd719a0375e0edfe92feaf5b827ba19fa1537951c905798cac56e09c3de108508439417fe50c3c94a08e63bce4dbe5a4d05b69d7accb6ad45ea35319c8b76c4fbe0179d380187c8ba1f838fed08deb2f8b202003743566e3b65c8d33c6288a8374eb0360091f98a642b48737ae2f6420da0ab5a1b1a3a6f19fd241716c56e951bf5ae5276caadfea6c1217dd341ca5646ce42734f97faad047be255d12ad393ea004e35f765c104e334ebb4f58dc8f2bb3bdaa20f2c0fd8e2274a1102785ee0bece23fd287fb7f08de82d8f227447ffc966aa6c79691a4b1cfff6c815fdb2aac31d6822f8d3f741774463953d2183f823b048f2cacc90b8aa3d096ca412cb493a83232d379b687b90c7614c7768022fc51845be31c018c2e0142122e4db06e546280327cb0f54b267516ae8a8bfd0083bb3011e938aaa404e3ae36eceed60cb012231528cde08c23755ab41cadf38dc00f968ff95bc66dc43e34ae366b560ba055b695e5b7f55fd76b38bc1d03583bd4198879a84f9758ee8c00d7414e807c36de7a2f1b0f326a01d41a01cb872e0ccd630c2b74a1f9da7d57b5d262152048d5352f15f535e9a9da88b6fdfc496440b870899a10d4320ead191deed54ea74da287c68e070d5189a4cbed827ebd794a0dcca362ad821a684b729e48bf08e6bf29523122cf60571ba80c3442d91c398fad4cd7263dcbc1cb2800f30a59a0da744a2cfc18c3c3436b94144e4f40b39ed86c524daa63669758c8a37c4e6ce59e6b6365153878b9c52c5d4308f04f761a5a17d3fa8491202d1fb7f9d3ad59695cc1b9cf7e6457fc8d695a8d56a9b7e7e00b48f9bfe7fb6f33c9f7bc9f1680f597543902a72e80fe45cee91102dbbb63d7985be4805a3ca15194736d14819c4e9a5d221acfe25677a54aa0a62235ed0459c7c8054ee379c0e77f7890dc8f5f73ad6b6238bcf4d1d4b6671a872e5c03e0caa50ac2dc316ef302825325d42e8505d842064cc2032889494ed272f680eb0b23fdee6fc00789772ea23c2548567496592a912667c9735e1c095f1f145bf52509e45ac1d8d48fda7ce244df0b6ae12c9563ef6b49c108573af7a268ba901c116fb399801325a5f2d1714746f1f24787e2bc9bfc9f5c5724f457dd8adf441f3afbe24b774d2056f4943caa088f328449b30c808c2d92511f3aec150614012a8ffecc2144eab0afd0d3add672a69dd8cc132451d8e663080753f9ef83222969b14c13c571d3b81b363fef25bb62d7311e8a9f4cb4f761e9c3edd77e076e725752be56b5f314d3d9347b09a9e96c092cd0f4a1ec3ec097d32ce72bd6fb68078730385c5831d5c3b0f8755b61be951e11546802a798a40372b4aef37f8b28d81dd4e3f168ca4f592c5f591ea7e4eeff1eb9e010af1bdfeb61bb6273d82d9557534c3e8a81a6370af7593625c017d34d00edf161f6d2e552c08773d73d1ab09aeee2f356efebd36937d22efdcc07e03f4e1c76d26075c03d72f9999d6940c6a0888b93c88bc4655dc77e164a37ed7f67a815ab1b9c70d976cfc2e031e26982cbd66748c4eab2d3b2cfdf62765b37cde94d7d2bac2e8c2d59bf9c529750cf3e78e7789f1de221757979fd9af9a1213b2933feb0bd25b5562d111f3c380d24f73c0ff63d60cee1508a963bb04b4e4e656780ef2b5b698b827b115f910cfbacd7816de0bcd22e2e6ef56ec7843d76d1e9a6c0f675f5679c6c0ed91eb91d92220d7b56e60c1598e124c34f0fb21301b9a43a5bd514c633e8600b73b57fe5052fb0028f685ed39632f0ee6f5fef163f051889171a1f7b87239c4c70c13c83f7f71adc86016dd486d40deb844d180cc6532bd5c221cd8382cfff4b2b44c002faf299625b408ec24d07a63688fad22bf043ab5c5c187ceaae8193f607f0691ba76d217fdd27fc45a196f82370fe87723ba0e012ddc817ccd51e8f2887ddaf844c49a1b45c0ba17ca7d2d202e2d465af90cf88a2ec4dfa93ddd6e49652a69452f805d8053906b1c2df7e761fabcedfba8f06a9a522ac1a7f9b9d7cad13227decb86e91be7f92ba1dbdea59b559a7b7a6f45864e8d76f63443d41542b465456b7a3554c6a6263530cf4b92e91952eb5022f9d2134dc3eed2c20911c7a71198c3a4352d06f675c53848eba44af9e3aa3ee101a195c38014d0b473c0c490146077e0d2d7183c2217ab9406f567587d254516bea0ea179d58fbe1fc9ea76eafa0158897025f8aadf842043747eb46a278b47ab9af5db25c6440ac25c2102315e2ee8bd2f9aaad3dda3071d4450c30b8a9e6892a676ac478c2d70c801cc13495c5dc65e41030e5ac400cc92277870359adacff2164f09b2bca0c40b8aa32f4ae0da337503301461051193166e08729181802c8e82c8b081872021d718750063ca583942872860f4e06a33b56555a7e1170d660c002d09164874810489255c9814456f28f5170080c4911f236237281c002c216141340350858fa38c1f6668a17ef46316395cf86051a424899433ae9e69508279e081e6af79aee567a5f6d757d1737941ded56fa305fd1dcac1ce258aa1df1a31185442a0c5c56f02878145a356c57ce8c730d210b26ac2cc42b7c2d8a57d0f9207c0d8955a2f45827fe9a2491a97f624c89f9e0a5484f8972e9cbc5cda4b2fb52f7f5d24683b3b3b3819f372695e6abd20f3b55fd7ba3eca0c73fee96cb8a027d4b0c0c884cd046f31cc796b7424b2ff756b2a04f7d61be20569150b09b24be79445d7b66491e2a86e96161ccda89b458a9e7afa22b26d1a8170d2227b5442ab360c2fef6e74ae8456b551152202bf18d60be8d7c00bfd180b6311837efc7a796bd670a5095f93f33e8a7a7ebd58f59b95f95579540dbed01f22f090a9b5208d9df4abcdf78ec725a59c7472a847996c389b5289a462a99a0b4f2655a9526302815193068d86314628e1151a3538ef52f2fd795cdb7492823f9fc7c5ccf3a7553d817808f19fde8e7b3abeeaf9337f3ac7490bb5f6a55b7406edaa9f6bcc1d76a7d47eba260ad440771387e2a4a9f49b348d407209b937837cd55dc3c68c9248ac7131ce19a18c124a19238c304219531cc9247f23994620b9e6901618e4ab8655a257a57acb8593c3130a7f5d906150c32af01b6ecf2a0eabe098a1f2359c3254be264b2610a20d6f1b366cd880bc36aa74643ac6eeeed831c618db3dc6f81d9d061a67ee8e31c68edddddddd104a8fb1bd638cdddd1d638c1dbbbbbb3b7677c7eeeeee8edddd1d638c1dbbbbbb3b76777777c7eeeea884fa73dede1d638c1d3b76cfd8dd7ea236b1db04828c31cad8de9e5624d9f3d998999bb999390061b53d22ecf138731532fe3c33c40d55cef86083c280a642a8f1a86b61882a9950a3d843f937c952c62e624c83cc0b8a000ca1c8c837389df3801a6fbc552e732398829894818f66b1d87db053da10421c14cac708ebf2b19563ccdcc5470a3e7cf8586ed24e384c5118ff8c78757776e7304eeaec66f3731cbc51e3028f2167e8b32dda2b5612a67ac7c12f8c857dea766286710f29ff639fba1ad4e04aef63c94ab497bf0c83cd4ad8a77320967ac33847e8c75aae57fb9095700ff6a9dda15ab53b34024fc29dd4ed04e3b3b807c949ddff8ca09cf83689cf83aadd6824ef650258c75c16f7584e00f770b249d4d9b5475bb55cab3c4042b76791b3ceeeb7a342b82301dc8341804eaa77340e19d5afabc416382861e4a5b2ea2a612465888c583540dda1318ef0a9dba98766d43ebef61fe753fb6f2a7f46b40a1b56293dad5461bf34f990af2d07e31ebdb59ff3c15219a82baa55dc43837888ab7495282c65e7c3bab5aee594700fae3e754dd0bb6e19dc5d3284504a97efd2a5bbfb426f27b60e9a80c4f8907d709a8a02a791df5ecac7d6f66c98f98cc4fa01aefdddff240c6e676766666666e631ccee0e7d32ce3fea067583e3eceeeeeeeeccccccccccecec1edddddd238450fec89470e8eeeeee349a803b2187e26e7748e10d24030251d4c72414369bcd24f3eb3884cf0e5be0fe106846b13973373373944e0859f27a4df430636294504ec8691ace3fea06758333e7e4267cdd50a91ee771d684628e296772f78f30caecbc516a63e333664076e6f7b6332216c528a2929824090e4551c427222c2a89b0088b4a6a9f02e21109da3c0e6a293bdc83a1b08efe662875cf745afff8aaff4bfdd80796d27194563114eec122581d3b700e2678cb5d5d23349f4d24b06b7a3b2bb834af4d2aa022f0540fa0aa11548ded4261d3d4e8c5159c077afcb231150d17e414ca20c182a231313082869e0a9fbebca8f06f503a5e4705e0d2240a3050b850c5071774a1c2d799555285ffc35b3c301c8922c4183060a14516176ca1c21fc242856f81ce8915c65475895e4abc84a81ffd325befcefebb56ce2f68bfeae351bbe1deec4a3eecb85dc98fddae4ad6cfc84e0810c76b9e108437a017c402ed3c6c3bc9d0afb355bb3d28ebe05f6f32e51ecf3af8b9b7fb8cd4dde19b5ef14e3a244647b9553cdc99d1cf4825b24f324580f424efdb87afe3cb35c21a2117f7bedff6b2fef24980af792a680f5f7a2a5011a2bd0af299f0ff9c52beeca8552c6b15ff9cb32be23197c97cd639cb9b93692d60aa54555d2d6060553b42b5e75408fbf3eb7a9f7b31bd2897c665bee2f79904368b1a5fd3d2398c926dc2c1816a20e0e840b5ff6610d26f91635310d2af0984203e84481eca57fc42d0fbf9cdda09c16fc1f7a359a9cb3e2d56b72a50dbd2f18a6da94ded4b6a7fa428e00f5f08842fbd1d085ffb1df752f1d7e59d77b07fb68f35939986d323229fb74951a8d73c227376df13d17eabe67dcc44e273add1143df6a6ce65eba762e0e0496d94a0fc8d9a1409faf563c1a0d48fbeeac76a1b1a40b75f22254eeaf6fb73772757a7cf8681abad1e2a722bcddf6efa76f17d3f7e45b68f1de94b5d693dceb8f9e611d9df4a5de9b7680221caf5844c2f4dd2132ab58f17553301d966073f76f3b90e48fce911d9f7875ed79f915a84abdbcbeebb01425a2f0564a68010716fa7b745b8ba79a9999a0febf4d68b2467aae67d1fbbc951129c571a46a9cd9df1050da3d496fa4a93b1ab8c5dbb602763086ae771efd8169fff87b7e6f3b8a6f647785cf0f763c7e34a5140fbf942b49fde0e152904a6dc9bd45756c0d058c1a17e5f61036d24271e7840bdd5ff3dabf28ecabf759167ac1276ed5a130841a6af7630417fb9b9c190a0c2cecd51347fea3a841036f4eeee7ee81042d8d0bb658f3c227b644f64c51d2c96dcc16a150ed9237b5ef67477b7ec913dcfff3f5fded264bedadff9aafb7c9a42777b8aa89f16abebd928437ffe6c5026f747e7e6d8ff20ded2f15517028c031750af423a876b1573d7da6d15d23929b0f3176f6e0efed9ec697aa2b012ddbb1d3b76dcf7dd85be4b37a7dd4b16f91be10c58773c917b895d0877631a8f3511aa6fee336a5e60bbb87b03e98d8aa1aa55436c8ef663574405c9e087346ccc5fa5f458d334cdfb1badf2879dca48acfbaa56e160175bb1a2f2afc760fbf855df84aaf2be4eb74e2f111219d48f0e21866fd3cb105ff174459bd92a117c48e758c00776d22d1fd240e7ec125ca2d4a39d557e71c1c2a6a025b608d58f7d2ad39c4f25a4739885ca437c4e4afd835609b5c762181615ff0c8a49b614ff8d661893edce00a3a6c90c6b284ae94d1c143317d4df0703d92caa7bdc09c98fecd18b9164189249641b372e8c2a954aa5da36ee628c1eb9771d274428922f3d944ab584721f6afaa38228e3a070a0bc055dfdaf920155c5b648d65386ed0f5ad59bf79550b71fa552c9d3f9a03312abce0f1f12a173dc7b9d1fff46e2f61cf3b6711b7f5f8d44fec9fa2963c03de9bf7eacd80de91c0d85627e9217a455ad692f04be6624d6186448b4808f524571a8520c343ef4a6f6f1db48acdacf19e37b989a0ae18baf793c959ba82da89e584c2ed94acf1b3397f8b7d297a18fe359b105b78352ed87ddce099be4ea37bf033c95fb8faba637bd29c22f6da9e3189f3b147c525aaa1408ba5520fedb973a22fedb6fde7969ebb852a9e4a54e4f84bff427fed2b3e9495fe36dab4c9cf7f97f806be9e3f3d4f9a56ebe4bad4bb90ce813c1c4085146fd58b568f6c0b3b7641a837e1522798be4cd923763f34ba881d5af06b6754382f8b036548c55ea9affbe964effa9aaac79daaafe42e3476d0b1bdbc2c0e26c07a59f04a82d46f6809257c2e67082aeaf50140a1a557bc9ec7dda7b11168e5ef5541979f98963280a055946d860614a4266aea40788014c510c4354940d1224104208a17b00ce70e952fb6f9a883e99e006910f50ed20d0a3040a2d4c00c5a70726b02708d31162d81f03644481c689155cf9a9f2037ba2ccadfc9c190ac312036001818a5203098c4d490a6c985f14955ad004288c930fc030225232d3d2f3f3e344c991941c927c10c68b879f0fbe9011c16085c9074746f5a70ad1922bb40ad64334413e241289442a23ebd59699cdd98bce60a8d9cfcf807ab52c343ed0e03be13413336364466666d6abad1f0a084a8406cd96cacfb1406dea0ea11153673082479a0e103e73fceef627d2120ae5f76f0e635b4839cbec7e6766a960cb82eeeeee6a4177777706babbbbfb023318daefdccc1dc6bd194ddc9bdc446c8cbbee857b052dc8bd68405b8a390e569830a1849929bab0c28b25362f5049400f689a8009fde033830c37498cd062742bac50e0282181e24b305814698aa012861831c89e22a8501c47b9ba8a10439040cc14a1218270c2675d5081bb3b6fd971021b5ef8c122cd0f6438c3e05848ef9b147a65a84851c3141ece60f941c9d60297fe30b59b0ba4be1fb4bb1ba165062a8a78c2ccd0172e7e6146fd761cd1d005bb59e04932d352032c8a0a6430050cee70a1769c0dbd49863ca986d09ae8a250ed356f8205ab436ad91cf2fd87c6d7de59b03d66bcaa7cad9bf1aadec476b05576bffad5afd2ec97fc8e798bf4f2dd49b74853aa5036336233bcf595d4a4bc513df99f63712dd0061a1f76156f7191afe4cf4929eaff53c9a22a532490fef4274f855398f6f2b916d446ea546881f4f477a89722e1f4f4a9a702fdd3af6b87f4d40b42f2a6af98a948c9411cc44127c8643ab3869a50533eb743bfee3ff2e5a4534b95ef5a8adc8b6cd352d272f3aafb1dab32d6393fde5a977c07f2168f4b3ea9e37179907cbf22a7f7a1b41ff8a23eaaba9dcc18b1557e39c60a808864a07941fec94f7108818689e69fcc4c7698eedb8d84320ab2319e3c71f24344191727a9fc373a6706a7c586f338db42082184ed9c9360db1b9b8c428bd81cf03f77225607fc8d39c042bfeea02ef296e9e17b4fb74c9e0a456dde86fa506f7d053d8752e345a9f08aff7490b7784e4a51a87f19940d0d0d0d0d0d0df10ffff0cf0ffffcf0cfe4e816631b9b1cdd58a5f797b738ef9b30420eb050f87e65484b8c74655ea9f0fd05f3168f0bbeffbc4bd90e98abf43ed4ab461e526f28d852a0af6db9bb53ddfb289c246afc1f42ba6563e806961ae329c6d8b74335afa12666eab74ea86afcde9c88a4c6ad5ce7b444c2232cca5bd24b51805d9b2241aa203d572c71c72d5b0a466685f9540eea6a4922ab5b731f9815052d4d19afeadfeef9120a7f738e4915d640e1a34c1458d7f455fcbec65265ae81f2f7936d7f6788a1fbfc6acd905122fefbf9f796ca9559a8eb7dfcaaf0b7fb4007e4c4f3c14f8550aad043e154f7b74b65d56fd3d4cfb7a3f1a2bd807d36a1f0b47a16a2253d75899e48a9457589643041dd4e7b83c78e9d151410f484914bfb15b68b172780b9a810d97e7eff8eeda06bd7fc67246e359d0e8faff9ed759abb8d33bd4eeb6ca78e796c907b1b6a4365cd7bc73d77a7e7d139a7aff993e7a3e66b5c1ce77d089a98ba797f230494558455a727a479ee00e992afc35f034bcde97f83cc3ba7183e0f138c74eb011f0c51fbb7bf8dd5dea13874864bfd760c7f84391f4ef391fae1a8cd1e0f0974c5892b340f94a424b695396c61ce5dcf7ce57fc2ca9c5ff4c7e74bbb827efc83b7560b132e7f2f0523b4d23ffde723a8ee4754ff1a63a0bf66b4b29df16bb25fa9ee4254f72913e63b54772fdc7fbec59bf81c89adb9d2abae7c42bf38ab4143d9134a09f138908252e1f7968cf9ca65cd10a59de6c2e6f03f751a0babc37fc2bca5f5f4ca6bbc8f831070de77533fed0573cda7460bba757a297095316fadc759f5e72f2a19dbe27625e31ebc3af8fd198ce5322b6b17aad78d9a36f788faf10fed1ae24a4e6c9c97ed0153219c2afc53855e0a0857f85ca1f7f1188155e89522815df2d9253d18e78adef4d5d26e81650cf9e3677e67ae7338044a68ff77a3f273b31e1356e66a9755bf412b492f49d7e2a780c085af294b4e22cd15b894f1a76318d943b77c9156d0ef4656217b2415920affa9cd26784bfe7275b78c1dd6d1bf35a494dea3fced0985011b163a9c000a8704f5a1b12ed1096cc04297d070021810941301ddbad862940466eba15a111704b53182238296aca88086418f7c41b9a02aa220c8548884846290a28c0c21e47a7a8011f990438908221f64d8c8104d29d304d1142e484034a54b1744539a989285680a124453ac104da902030a3ad95286d4c29824aa08832a2141081a85aa4b44822395465d221ebec0b2fd0761f0a7ee0d9ea81bb5bbdda33b3b843c81dcddddb51997567507d1b62331d4655a5d6f69335404323263e483ab42a4d7665a6a532fa8ca4d20ae6e46382f308a13080a94d059965ca894444d01ded0ce4831545bf69a93516d6de63259ed97b136d366da8c0619977d34c8b8cc8f220d32dbc19ec29c62b1d39852c9db707aa09fcbe877723ff299f45c165db6196d46d1a3d176b0db985e75257daa6d4c2f004bfdb6a34dd6aa9d920bfa4d2019a3fcd81581409bd10c286a314e206f919e144bcccccbcccb1ce366f49ae647da439fb96c33da8cbc3581269036816ea886c2919bb63b77e7082417c9db8c7cd58fd383cadddd519de4a49809bd09844306edb88d69553f0e994db619010101e11cd1ef143bc93a2716e664741ad3399f36e3228e344b5bf37293864c362b87387b42e7e6f013bc355b77a0ea4e805af5b339bc67be9a00ac0e5f46fd7a754fc3a2ccccabba4fe623daffccafd3903d9fb54a424167da51e7ec7cc140434ed100d8bbe27f260f602c57fcef0449eb80f85b19365dd2d3c2f4cab558ccf7e4458bb991cb9c8c7bb10a10b30bf06f37325941bfcdc8c88d649ca90afa6d469a0cf62079570f12ead25e7e8c69dd098b4580bfec4e2f5805f8c7ee44c52ec0df4f5e3687ffe6469a4c9bb999ea1f37a3cde16fb2827edae65acc0608eadd5de837b5eede65ad9fc650f73cc2a160b8ebdeb7b3fb3aeeee0e7721162cb8c8b62be8e7339fbdaca031df623640d0cf67b2ba7093ad7c017c41d876c0ff82d16634d705b47e1c7b1f945de414b2471e914fba4ce1821ef9a447f6c827f2883c22b9c8232ea0920bfd6637336f0a422943748b0145afd78b0517d1922ad57f3f7652dd7fc781aa3bb797a582b91041599a80c40a5fe8835e39c3aac356c14f0121114995bed43f4e3e20a0d4573c0479dae511db8c59942cb498619bb78b0a305832012c7cdc47782226030b1b7705d68f58263399c08c8111d8aa26db1cdd7e66a3593e46084f336094c5587608bd9772e1890266285280c2fd0766bf71d60bac6e5f1e2c16120a211cb212638cd17405e5871be37a8c4fb950fe58c423d3e03debce5ef507c1f966102a68bb9bbef8f24c81c6779918db16b252118a1362044c04d58f724a68d7257a9243551d795da227383c5992c4b6db9abf4d4fddd264f7d4dae1171f7ad0bb57689ed87e24083aa32ed10d68aa17052b8b940af7460b54f55617cd20abfed07f2e51fdb9ced9aa3fbd41356941f5c7f928d5dd090caa6fa161081e1ee8f49caaff8f2675870154ff2116e81296a8fe1ae81c0daa13d56045f52f72820ed5df48e720a0fa83a0a8faef740edc4a640397ea5c7ea4545fa0ce5922a034d59fa138d10d5daa3f47e99c9aea52ea32b4f23bcc601e2433783283a22d8c0803c89b788d23990251eda1f88c941830b1040c28a63833834d4f13e8f22dba683b60269b437b4df2f0968d5f9cd47fff3cae1a29e805e9413d07cfe3dac04637e9b4f1fd361c05fb01aadad7459f5fe922239c0ee52bed531bc31ed51c745dd4756c7d055d5478832b745da91fe22bed7f878a900dbec6ef50d9a1228483efd71ee5ed501182fa94b7f3c357daa3be86b74345488d47793b3c6a6ce0ed68d95171e075918a870ba5bd8d31e8ba36f875a1bc14003c135aa5bd4946658a1414f1f37ab94ef095f63656141955ada749fd68b5b243dda0e397afb4ef8e4403fdbaa86a2921fd1b7cff061eff6c0eed6fc050edbb48fbf6a27dc7b48730edd7db4803efeb59d56ebccf5f34bccf6133bccf7f6cbccf81a8f779d0c9fb36a6d5789f5fa99ac9fb7ca86a9cf7b996aa6d9a7b21799f1b550d6af204b92c207cc8ae72ef05e0d3045b07707777e1b6480f7f7a949e48d09b2357c2aecbdfb6737fb891c6196c27f046aebca809631956bee882d684d96ee0b20dd19bba444c864a46505a97884995ca440ad1cf955dc7d1b2a6006b8a280616d636537b06b57fd7668aa0b56010ef879721f3090e5289685f8445224540f33e5699aea874ee353531ea14cd8800000000d314000020140a8844229140241e57b6f10314800b76924676541a4b845110e4388a52c81842082000000300103243334327089d468be4be765352a73dd5ed262642eae596a9725c95dca7054125919e68e3a3cc940bc95f5c8f91f97771b40249f677a9e9704ecf67ed24ff31a3d784e96706897c95934c7360d6b90e99f7f7d9ae0cb02eff6d3be1b40078aa9dbc0ce74ba6effca33574d15c33ab308fb3e186b4120c1287f08388d6d210665b805380457b04bc0b0905a8b4127cabe81854421bcf39245a825a188d4f9e4ec79544fb6a8a239f877bb05dec2c5709a30a92853f79cd9cc30953432b1356a17264ed65cba4015c2f4f8954133b6b96d3072df603e9f2d399495755285072e6e1a409f314c8e2b47a50e56b1397a7203ff554151538c5ab50b29444fd23f53d1e73ee33da0631f7c8164db75aa10e4acb4fd5af6acfdc2a19aa6ee639a6cbf897ac9de862103cf57abb70112e47aeee7cd94fc876f49088b019d71b1a7e4fd1aaa92c88fdf77367de7512329aa8f60d60bc049bf96da3dece087041e8357e2c3e25fe6fbc96378406544fc50a4eeda8d5fe5df1bc815af362af772ec70b1cbf24ee92091edc1641fdb788d99ed7e8d3fd894c2ebae832755322153daff39ffe3de63acab2e4938b146e932cd313151bf4f435d08b0f7a5a1c5a56568cd44b702cc62b5801921c7dec94faa3065019fb4878fff5313e8602e027ca77481fdb354d14409322bcd95c582c87c34a4e6ab8075346a6c56b94c5f1f2a29703ab2a3ac0d397d20328be874ea0fac8c07b0c3b8195fa14c78da6577adb8233ab4a6e4c27dd34bbf63629458b4a5c7c540c44c10511813db558e3e3a156ad12d54cd1e73d552fc0e28c31b6f4e53124ef7e51350682611627ab8ac03e2a88846306e6ef1873bf1956434541a516ecc108f914115adb91abc39f88a8a08f8112c5ceb2fdb483c8c68455a9175d2ad11ab8d7ca5aa0c65d96c8a8342919aaa072d09393a986ba297232e42434329867ef7c962d09cc9f12104343c7a33dab3931dcd8d33e1cd4f5d292635a7a534dcdfd6d6331c01fa821e45f9935f1a428b65a58792614e2fd65add6882ad0bcbb590734e5831c672d8e4960832b438a93b933800e458dd8482cae12ea52f94bb8b8c55f49c010c131d7ae1d09f39d1cffdc45e571976ce4f06f1d67701295f0fa093b047949c7017c7e45a68c2906c6303a65ee58765a658719a529e85d843c735b03c12e310ef3c719390d6e2fd8779f0e5b4a29c0701d1ccad155ed83740b476a8f73c970dea7c3a4f7dab3f76923cab0a34d4afe7ef4bf13f371a44b14d655c117e3877516ad9e1b25c6be3f2e782867974b31b13ee26991353b2f4263f01a9c856ee690f05c0405aea9d7b1b325e5cf875ef49615517dc50e828b0d27b28c68c54a73bee3fb129e022508e0e9ec06f1ecd8981d6607fcccd9e41a98dca96049207b527c467f0c71f42850dec2243511683aaaddc22da60d7d04a54da83e6280e1bcd25ad3fd499c966e0813bd2a0479ece3fb115f503c9900b7a1a329e255471b5ea55c29fed3e880c84a9efeb5c33205131c2d457581d6f9a2b12e523f6552d19b68253833bc4e9dd95240a83ac8c387de693e6bddffe03761595868b4e3b2c3b5b7d62fcc22d69591c8d1a08f9db1e396e61ec8a0b77234ea2aec4a8f43118b18b0ad36f6e68e90731f22e694911fcb9a9f675a36f2dfd9f06e4b629aeba8462f26175f1e252c71714ce67e30cb708d5ee94170ddc782c537d1d8fa01dd5e0495a154e45a8cb2ec513f3312c5932370823c4852220a53e4072bca48bf343be65217b7f6fc15d542f82d52f44ee7e47ad0aed11355bea84c924373565adff25ba0945359bc3fc6082641321dc25c42ded3eafc0ea668828760731d2f32b5e4ea95123752321d39a6972bcfdc92a8eb434e2b23090b90a8afa6953ad4b40ff19c11daa36b77e3667210fbc2be744b64d0e24d926ed184607c9b471e83bd0e45027a9650df2bd452bdc24b1064718257c7fd5ff7e3f0ba56a5bce115f0023c270b98891b72b444e5ba82df42e1820c2c0930392d7ea4a8a84362ce5a39c4896f4dbc30210997fc674fed0c25996c5cdca64683600f4fa9634ebe690709aac3c13a3b3afbd7f50a6e7e06ee61c10710cd0f97de0c55b73aa02b2fcc9bdbfabe47debef3e27a1a584f5b65bfec08814de69633117bc3f11ff4b149b24b3d3082d3c6c5262d2b579d4479209d86c01478b47a8575e99d7c8b2563bec376b729cdb46d164f4abdda37dc6ec1071ec5d523d0cbc68e6246945c46ada35c8a763187c899c189c82fa0f8ad01e203f566c73ed7353051e0df45762ab5c8a188b6f67fdb74e4e6d917e0a44959c804b84e3ec19dba0a6e989193e664735b9d1c061443fef0298dad56a0704d5f54a2aa92ac7ce0b8e9dfab15beef972da607f8f0a600d674f325bbed2a4298c376d075a578ec6d0907e66c0f31074a285caeee7f0986beee279a715290f4963d68b8786691fb216f431d29e950a4161402c15aa902d5bd9f82ca739e5d2d11d8011f8e3460cc1ef0e827b13794f40947af72266211d03e3f8c5c002724600cf0430c4270990b5d2940abec8510abe8eb803d9cf33d21a72c883152b48bdbb6ab6c15251bf22d9b79dd9c40887c38303328eb2491158c2df97d2bed738a37cefc71860f62df3bddfa2b5f154bbe8d5fe506d1075987eef2a520b6cee262c363ef5734515ec61da71af9c043273838c64437aa7a321f9fc516b1a1d23bb0f41ecf07445a153a5c11d612b66351087b9b8969df19ac7fdb18611c6cca5a9bbe5f4db9ec05aeee7add44223e077301f6ce9be123c05060a528f6d7c54a160bd6f4a655deb7d0addd87c436deddeb1f9491d836fa1418e5ca9000456318106ffaba28bcfa945b866d22fdea8b21a2e343a465dac29c3fdfffb2a3657339d2b486cd3c490a29f11e225c8d65e1f9c75fd7c291ba7dc45b911c0cf0b8a4bc0820ea2019d0b40d8d0582038acaae9874085eb80fed52ddd30c5b3fed91a7fa1ed5d54974e691edca8c4e37eedf4c0c0e15c6605dad622fcf712ffcdcc98435e4d6bc0b9cb25be4f0680bfb68fc54cd0e61acd3d497565ae87c8dfd9a4ec204af576c1b9843ea6ce86e607e948d5cf434cd307491117748721811238aaa101666b135fc2ecc5179692eedf5b603be39af3ad305e12b8eb51dec118b3cfa84d1b7f06b4d39d160bb0a960e37031b6246fc0c7b880c45e0a4b9a9311f508008e96176a504328e878fba0d20837c4bf2f1e3156fd8d0680cdab23267ff44e4e4e4f5a472c2e684f4948e6469731d5ef8344feeea350ee42297a492d58eaecfcc8c0b142b885cab8050609133ef99a6e33d09c0a2f988a8181807dda500fd86a0127127b4240e643cc623727c0592608ec9e6341a75b04e6c50da29f92d0da2bf70fb8b157ea924f807f9ffa1c1354769d8680d19366cba8f1d2f8ddd855b1d9a9f039189d086de3cc6cb16669e364434a19cb682c620f3209f610ec31b7fd57a284736806f0809bf1072c3c57285654a793c7300425cd96f960c43dbe4d90e0e335de4e26915d408d1af0df3d9e42b6aa76c8993c59345aa8bfa8b46d875870d20eeb6ed6e30da6c547979a46bc61b7e5136391e38811ec43cb51c715ba512f4f251f145a1dcce0807a1e8ff2c58a7ef9686cad3d52068d6950fe22152c1a1ee86bd682c5f140fcbe1825dd6dfe1b99f90aafcd2cd9c663798806bbd563466ea4fcd466753529d35489d9ada72e593f6750ddb48dfb7a4a61c50fb36afdafb9dfb694252e8834bbc3a10e87d258a6f5ea33344583039078d056dd7f0d8a08cb736a9256678b7d0accae65e4b1357520284a2c9caec892eb9a0d980cc938196fd779a4b034596c566b2b47c62fc383da106ec6a738fd0e7f29fc205a352fce1ebbfe698650f0e4a1558c9237af033d6ac195b45dad555db8f62abeddac6c16ab5adec672833a5cd29e529dc903b6c788cd46edada86c90d0b6ab411492185275b2c2ceb48f6462496d558f02d37a444f7faf4e7de9cef057adedb94a79b44a162c3aa59c9190b6fef4b49ee2e24e78fcabf03b62e5633f955d3a0e1b33b38e84a2294ae844fc0bc1d7ae0f9f083b0c1ee8e1aa606e5640ed2d3824ceb14091e277bb60aaf66bfc8d9be00348715c64aa8eb5776ceb8089ea650d875c5e31e83d4834bcaa8a77016d8ef5e354383c96e464d0209a981933aa2b0cb72679aad1180d493c7c9949f83af251ab334545c3a36825071adeda622ad8b2df044a6d4340c944a0b683a16137b9b3f18ea8be3649c267388b8e831433f095e9da76c0312e9324432b84ac7259b23dd90212caf534a8346810e5eeae484b56d76b508161713dde5f1732bf009e17dde607d6fde1b13eb22fc181dcfe7241150dab927d341c1d694ddbe8ab5d47f83183d2556c659c0df1f635f79581ea9c83263f72cbef8f9ef6e0ee9d36b9c68f8f05b95c071555ca7f8c6f01c14d506ead5c368ebf446216883cc3d42da9d131d10ce2a2d4cb7adbe1e039fd1c3c9034ecef011d695cdb43f4310da96aff8d6843ebe1113e57a6e1274131dc56174263a9579017dcb67b58c0092419ba81b0efef6be03d98da4d2431b5698799246325798b3cdf9e57376b335dc8c3be458c46147f46663800aa4e4a237c5fb322644ffd0cc33d297156a967042550a9bc1ff65c7f6c5c0d7fd81b744be7358c253fc79222ee95d6dc1fa6ed875a4cec9f008945d15e558c1366cdd37f5884e3309f0ff38a0bbc793663edb01f2a47b1c7af644a12c6463344a471eea14fc053bc08e6a10534ef5365a635ea0a04c47a62c37299f2c31bd1865cf5ea07a034bbbb83bd884756e7350af0f5fc87da625c47313149fd942e1d0779246264855554586ff74d2c56d0abcb66efe148bd01c9852997e48a181fd0efccd46802749108710fff4de68e8af2d1fc5722a9b4e23d89dd5570bee57b4778ed5038da229fd839190b9be1ef8bda563a8df516e8de8288f9040587b7b342be5f42f4f8e7643eadb5b080f7565a06abf9551ccb888c19e1b8090a836e178e4ef9662a0630f79b9915793fc66f2fc27ff96f27a955f6a79b5cbcfc1fca2f16b86439664b443a4401e1084f7fff1afaa5ee9da7fe080b66c5f4923de68a7ccde4647bab9691c4dfc7c34a7971531a24f994beeb5a34473a45df9491b74ed750a11866543ae205a039a8f54c4f366cfab291e4252e134969b0ad7c99c678ba23172be2afb7cf4962ee73352b5e1074c193212562befa44f635dcd637063e58651b45b91d13e158cdc54987e4e1717e37aba0ca64f8802d837536d60f87fb12510e8859877c9c53ca04b9e7f1e3152040831fb7a1c4e94881e34499c2cc0b8211d7b8a42f3c894213c1608606f983e7b25a11091bd3b215210ed49923be2e0159deba1806eefd0a8b640d6df80f008a83076fdac8a2feb30eb3e624f04b673de1fb8d500e569423a253be543cd3a3f3fe64934c4dc98f6e43be1f1075ec559e54f97bc0014cdffb2e3e7ee166beef294c7df099b6ff4c8a44c76738535279dbc9ba0e593597cfdb20c8618ceac5d118d4cc1568e9b3760e89c7b3495a1bd1fe1bc5684800f97d9ebc742b2ef6ce320057c4027395fdc1d4356e90ec8f00c998039c19df618a879f377f5175eacda8576f6a299d302ed0b26ab58a89491c0130a945c77e8b70ba28f72775ebf08d5045c99958d2840d1a5152a74943d676e5dfccb54781ba9ab180d84817f6733467aab2e2675d0a5e7d881468f6c3af6a2c963d694d55c5a07ca96fba427686315c0c54d661409ebb5b658a621baaa5c6154d87dc7a3fd17f0a8091f77410dff36ce6872fa830fcff5b506a07eb05c684a739d0a0826089b9a71cbef2c288adc1e231bf8a6452e33b1893d4cfc3ff3cc9bf31ad2deff8c219236fd87ac2c25400e8ceb05c5cf52f30aff99db8e70389dd2dd8ddd2874a0d7adcc779ddf65b06296b6a4dd14ce722e5e7a6c95e0bb6846513232522cf9aa242009ab841ccf203502cc1774ce9d864eedcb689f5fa870081c0f8fb588f5fd0c12d97c7a94dee9cbfcdd0e583e43a5e1a8f53430a6057e6de3c5ae56528428dd1d70399f8c02039a6a52863cdddff01224587e16f37152d9a5204be9c0d8b705f7666d8d96c29fa6340d9d284353ae925b04dd92e455d30a17489c8dfb9d9918ea48a0d26431541277f344d6dcf6abdad4c7faa07acb5d51c329aa412122cad1424cc6a7e558c5f1c423bf06b14cfcb947d5a72e4ec07781d4123c17c002152a98d587db1b68dc3f65bae2094c843470546ec93909cb644875d33fab9c7ce442e2e7a5d630bb41342d470ac3ff76fd561008c6880b2b9d7b2eea6b07fc40cb9995363511d9d4cc557ba1210bef0f820a4d1c60fdaadf7206f7fada7aa8dd0243c853059b859a211d7b056ec68e13167876205dda4c79104423045d39998b639c4dfa167a91111c0a5161fbc1180e57d44eec3444ee6151015ebf8b6bfcaf0f51d05e93901854a49754b512031d008f5f846990d4cee1bfe4d42c47b126c41299e4783c992cbd977b96ce54169af2436ff3dd1b31d44ca9264ca42662b33313e1f34406fa6ca76258d441557268f14f1080fbd1ac2a2cbe31d5d2e83eedd4b08c834fc9a3996fa962117f906a4934f913e71f082583e67ce22b396e3e94d66d5e01ba08768ace1ff428c9912682ae49f3b4aabaad61d16f76dccd8f11bba92684ed34e76406d921766571212de25357189e790754414bbd63cb11bc042600472688a27ac436f68dd5d9235c9c1e8a36d2cd20d05b602d4f6745455eec19cc8e7d04ad88f02583719e17d3e19aaadb5025f4887ce8f2112d2f67fd9950e4932433a0915cc8fbffa87c5f2135230174924b9159ccd3b0e1fe68fe43f8183c4ea1f7c300b2145bdad9db0ee04459ce13ae286d2f0d3c006303854e0a8e2b81d2cd647e1abdc5661fef8f4f09c8db663ad1899585ebaac986e4e8e9b245ee3b30df1fe65c97a8246a01b339953b1754e908b1550105f9c35309525aa81a7c979916dd7e53a1128d44bd0594c827069152d27d3f670abb7c9e1a2c7e3bd2ee25fa82e79022a23fd940e015180d09119ff8d6bc650152b6f8e3633e52ca8c8f714a5906d7db9bffee6f4b6f5d374a8868365bce4ec26e7532c385f5c99b17d113ae12a414178d8e7d2624d67f8cfab050ce8c983cf143b9c9784f414b3b5e3c467587f86db44a5a6227c5d92ec1fe2b1e921c46911dfc8606a5fe0c274963fbe8878aa0cf624e131907fd27ab385944ed75992e1eb0c0266f309f89b1b31f9aef24be994d40ce3d3839b25fe65de12fe5c17b6013c0bf9ba72c8429c90b80cf520af7b67c126cc0d2a163b9e327420a7c3873a1487ec4cec3830988e5306279c06b5a9f79b0b47484bcb3c8a8b81284408b079a1901ef285629b89960aff95ec6c1a8329fa75c7b2369704eebc5affdb0418f7ee3fbe319759cd648437e9f3351a6281d1185df1330ad052492923742a231beaeff8df13cbf08a72a055795fcb09b3950aec024503c258133c05276b620ae1cc1eea1e4c226112238a3c4dc352c9ff5a5586b38bea9c9286ab3f973bccddb4c1a9cda6609b730ba69a3fbddaa1ef086e8260a4133f35d130ed69857cc2a93431e08614659205b41205c2f54359bc0d0b0d1294954890f6ab886d022e0d609089ce27db349be210d453524a56e0a75d296b81c2d25fd544f9264eb82f3207a46e6a426a2c083c0ce8ca50da08e482b7fd84a90a21e9c13d8219f88bcb17a8180fd7fad129601b3cb1be4ec9b77fb7fe2734c7e852ee4892f3b1cb4366faa77ddd59e83d3b309d3a81c3835e4270d5e961c17684a455d19cfead64363a03e50c78f9f252184d9013dfa47c07d1687ab808c2867668e0d882390346dd4e4da19f178744b86a8957ca7ebf60c00b6689ec280146b706c86b60fb991b282c21d2422881c1ae605bfa7f0897b6de9993d860ee009eb06a25f3266b8363a710f4a4b9bc3166482e36b5a54b9efa7c13a7785d3d6d89beee61436bee22c1687b50c2da168b10824f86a9e6e93575b782d9597e9f0624f544779818597dc867422b85d5c7b7bf3a8800b14cff05570cdd1e654339fc404943c16dbe5ee1f1d3f45dfd5c1875a5fa94dd6971c30931c2a77be5ac3591cd6beb8446c7f0a452d4aadac2f486c21e482f356a21ca3f30f1621b41ad34250b21f2cb84febd5840a27d56532bf022fa668d7bfafb08b832a8f3a75dbb543c0458281bc3f197eba1b1f7504ba073ebf6eb34a8f7aeff144bdf595c9642a88b52f492d77e9fe9c3ba54592344813e6c0bd80dec7a1ed7a40090170778d0ab7a73c53f3140eff586914f26bc102a92a2ef495dedf582886103c0846e4516ad0090b307e4d4a84da4a102f137e2f357226ae100249e6b85481c3165ce9c1a0b16d2e39a41fc3aeaaf73f48549c49344103e1e6591fc6382f701d6f95fc01cce112aecdea9a36f191b60a824ebf4c76d2b601836a5a23b9b2361d7d1978138eced9c7d22a85389052296b0b08d8f8bd3ba33c415dda683ce0df805bebc85816c40e785b9384913f32053b4afd8827dd2020a60470a3f7da2f23b056662cb6ca6853fb1f3296525fccf321a2c3412a7114dfc7f3c47927f69314e165968e4dad23c1899a603f3c16faf65b608387aff87a96de8b5461cefb854d57323d85dfa49ea2ed62dbe90bcb2bce6449f890e698ef0e050c011d481d659bb9bb7be54365e47a3163e2abb72bf21e0cca328ccbb68037ffd1f023c072cfcffa68eabd1586814fc0eab93b3ed6e96a5eb3b9aa3f4841724e509002ce09a29c5099ad13eb986c24f334b1fa49dd4c8fa2e17c48025c3e7bc3b4a69ee6ddafb508006733769134d14028cf2fb85bcb384add6cfc707b67620b5d7bc252c2468fecb027c295254d732829a8ea9018aac16303719536a3e0ac95c695b965a7da25d8337d9721d2b3a4ab6aaf9a77475177845e786b789c3afe0c0fa02a994925d345f492ff8056bc4ccb4f588fa16b58f2d497e4c3aa5bc2d2246258bf9f534317f5745b879c85b37aa6cb4d90ff01e7b950e0108163cadebe66011da4e50dfbfe02715103124a067870a5acc8e4c721cb1882d2a00ee81888a93c737670f7c9cbd11ce0dc284dfdf23d8e4fc676398598608507889ee357735770748b1656b65da0bdbd9636570cbf4b639df5f926032fd3f6ac04fe1e46c6153020edf0cc1bd1f5534aa3187e0f33d08c1ea7f01e197c60c781717daddd1fb656f3a5ae291e8aebda3deda97dbaca9a16817e4b0f6329d83b114bfd6b9a59ce364b215bff3a7a3957a6d8348c13396280bd5da7c42a18423b361ef5c0debed5eaaedfbccfcb2ce2912eec9cf115b2dbcca61bffe31e79f402caa492b2f39c2433eadd01cf15a601d634d8a2f3308a6596291a2dd5e428b583677c14c0fa5411c2f6228a34a162e3e525b275a68ccf283d1cfdb1c671dab75dc41afc7967c3da7f6f1357335377c61dcfad4ad56d2ed6479787763a7ef7537165858eb3f8f1e994597d5a0647ac14f24c5f1328974a21a53de7894a15926048d58e2dee9491b6a3c07851c556955537ed5e672043032cfa2456b2acfc5f96925abf273d2ba158d8e0e78fbe8d3cdda6ff3787778e309f98229ac8adb608f244cd8dc721fceaa7f678487b904ad98fc03bae7ed439e439838d4f78361e05f500c7cd189f084a4a4df5349291f4702de37105e4d0f2d03ff091ba8a74da3033dff71478ba6999745a35c13bacfe2c7808089e49b82be24dcc7afb193da0012a3b7a9261f318388296d461164e0b53d2296b6252d18cc4860acf58a8389e9d60e9f5065d0a16d3b04f816a07031b82c39179c8b3740eec5ffc5a103500c14e9367d148e323a619c75c24b7e18e630a8ca09101434b392c04f642f3b4c30f563d1205f184c130afda38e2c0a9a14037a634cf061cc2d164eb62992ce5b40a2ad86b15a142a5ca42fe087a9d5d391646127e432ced972ddd23c16236bc52c7e31862bf10ec710f1945c33cf104ca746a1defe9a44d1dab1c20f0bd27ad86e08867f2d37c51854bf743f85be48337576c5fc0389e05574f89780977e0a02eed4e0f4819abaf43de761efeef438bc038cebfbb9d6b99d63e323c97257b200fc35bb791ad7c035c2386cd3a20360e624e0d8b60a8b5d59d5a6d001397ba48df653ccd072612878993d4fdc72b39649c27d7dd02057145e42c78b137d5f7a932b5e145c7a5304a659d90bed42fbf7173beb6a58324cf4daf9f3e514320e756517d45cca23aff9af3e66e45c35de69b71df5db0f50b85590ec4d81e40ee067e5d75badc30a196c48bb4375c6299347d2f06b7db72300c0c03ef9d93eecef89019cbaf9024110ed22527f77b7bb0ec045e2b61ec435239d3fb77d2023e7f1e3c6d3b1cf679342395047ea2d25e064a75590535eae5ea7b105e55221fa4fe612e0752bbf76b42727429d6b0f5bdad01a4b86259c17c4851a958534228af66092a344fb64ad211e699328de8f65fd2591d19d86b0c88d7c003366100dde18d43cc66ac58ed6e3423c59769a891fd2fc46e806cbe749c3c715a03506336d64450ea32677475a86cafca67efc479d4cef6fe308d9ff80d4d5de4ac0e886abba94da86c074b9723d268434d3bdbe72b8429f65313e66e65470678268a1a5b1fb5a2ea6330fc7fc8aec927bcd2d1b9a1ae814551129dc98f410c7b38009d4fc566135fefbe4ea7cd62eca8363eacdf9e386c9959f0fd49ca0c27492c52f4e05d519841610d780a831efba7966d781931d84be7a47cab132a7d18291399952cf2d45c556004a8d8417d1166803d8e9a240810c42be041101c953de5cc43b406c695729a1210c792620afdb8ec25a526b07efda13f9850bc738f6427ee2fd3bc037d6ec49db799d77229e4b114f2be8bcc325c46fde28df6c6ecc341dcef1ac6279656e45b431162bbb806a88117247bcc78aa9b6d0ff6c6a0d8af3f2b43b61ee62fdd6faea09424fbe9bf0f403d429d94d24fd9ecfaf3cb71cd2ca04544a007519ad06f25c6a5e2fedaf07eaccc92aefebd9c45a69a162aae391893db947a6298ef1488f8eef3087e1e7abcdbcc761ca6a62dabb64504dee2ed57e0c272b9b4c30e7d88f69a5d34eec54dc3ee4e2d1adec1a1c374c441ae6307d3097a740c8d340609726b0d950609b6f762fad9048ae93484a2facbd02168d97914a6aecdf40131d268dc5fd2a5a19dee6ebd5fb76db349316603ea187dc4a2f97f77f1e3318dc8f1b13d09973ebb27833ccac3c134e1931a7a9e86b60c50bd880e9ab9586e56e70f373ef5f762a2e13ab10119086e8fc8d9fb592aff4b8b3e2e9edc575ff9b51f160e13ff207b6d5eff1fb790fb6e0c6255a6c028c51d1564523cca4c76f6e9486d99d7b03e126974f2ddbe8d1591d3e2eda566ca7c1214c8e4dfefd5ec3e15fe4838693db4a19a639a84001f6fa08f702b0d9f2691a8003307885f1e51f70337c23ee440c0d91f0f53e9e6046efe9cf610cea878e05a3ca828e3e17d4d59f7a07bf927f62c40b46cec9defe93c5360ea2e2273d0510d8b79d16a39c9d4c7867172cc3d24c0a2c1a76c3af9093f77dae2533b632d3afc1245044fb7ba6197fe7e205d098b68291f39da6410a7d45c4921d2346af9ed1ea57658f6a4283d245af6b056cd0a6bdc71ac3874d629177dc0e80b6f849dfbf3ce1aec3c798740fa1f6da3cab102aa7d1ab1eb539c2dc0d3691a255548c7ba4b103dd09c199485bfc25a45d903e9a81dee701d9eefb2a5b88a7473c5ae8b6fdd66678a45f42e86dc808ef5e7f300e3be5c0a3ad3e9b071490482481b6ee260da3c1eb0caec37f30a892e2fb95ee7b7c284d2244baa78d9dc1ca58932f416993a2c12a73ed89981754408b3edd21c5736682a45c874ba448334a0e97c0a55ee7bd890d595cae60a13cf36e78c0512598522175d6086d3c98119a19eb96046bebfecbf018fe9c488d90b13d72a8c0b9cef543462fd1f7c45d026174ecb58328d2895c14fa5ce7d3df845d30ae43f608313576857834bbd64a2dc63b6cd2566ff35af0853c50d4f8d9999d0d577b3e25461cf5854a053e6ea518b4ba1666847a649db99c0e277a6eaec35f4c9e0b165757bf487425c0de386987b8ec184adfc1936e561b425e951f30ba98d405cdf1f7a15931a0f483e6eef6739b154b6ff70f73567680c0ca52a5c3105bef34a26f2ea287649b6aaf8f789289344893a071eb1a95b9e2b446d647a9fddb6a948a1aea010aca943f381771f4132b75341426723265bd4c659e71af5f50e47004bbf6b1ac45c5069e75ba9e246d44e138615b33731cc26290bf66e760c8f81b714218b3e2a9bf38798fafe4f731329772b4c1c8d9e03d98968644304bc20ce66fbff20eaaeee63b87615cb0598e6474e3c40d5ebd84443d1f3111d390a1df953c8af788b6591590c908e70dd1df12855cf370b24cf9ff068a89688b0e811611fd5ed25c7eea59771412333368c0c54c31827c2098d71cd5d8ce8c1331fbd62f79ffe3091e8e71cec8f3c2755d093e3e3987b92a33196ad12f686d31ec9f1ccd91b19dfe84d18189171a4d2ce65134d86268f95b2c3f86b10ad9c33e7aebc544bdabd15c3fd8471fdd3a1d05b317c98286e25d5065634f690728b502d9fb460636f226847feba1d4de1b0c516ee0233722aef94332e4c707526e8d5e581b956d957877efccbcdfa90d79ae373ca481bacec873b70776cec22a0c78ab59b4c1b6a91a0a68d6d45d0c1a29d6b61be83cda63289ed933a1caec5fcca387c3167cf56de52375ba0f5686eb0f7a0531c1725b6b1b01d922a041b127a7a47e2e8f59b9751476fa3a2ad7083966dcc42c8e9c97d830b8b94492933519af3e0e24b75695e630f30750235179ecf5ecf215c7e8a9d037a2d03fa7543f556b4855c302e0e16b5c0b6c2f9f0d3d4c145a2e4a40c3454023e2eed7834ac55127d765073105518097e12ae00fba16ee71669c6f1b82b03ad6098be244e9280cf2c9d21eda4dec39bc279b764a07ec6c5f786dc6743feb1396c452f8cfb8aa7caa1630a0f980ac66dba1ced129f0291081e9213ce34c08b187505e85158a20259f38bb05241f9a15f612101fb729f499ea646211357b13d09f7206f8b8ac1bee12a76db95c12e4da6f1af1cc85f4689b93dacb23efbf1d79f9d3594120b5fc2c639706f7b951622d693110080ee39bfcaeeac8d9eedd059bbdc489d923a6b5bf65f5801e392e71ffa5838cf0a14d8b57e7a1a4939c9fdb8f89b9eb3f796eb8464055947162a9bae3ed48f58457b197439aff28523e2fc240a10fea6083da94bdbc7e86786d148763fcf4a84599a38adfc9c2a2dca1ca2304277aefc37baf6577b19f76cb87b2107aca6a947f6fc1b10e1ec02fa4bac77cbf9b83db74a47f7c367de1e6be77b41ce5c78d1ef599ad1119de2e13a1c7575792306aecc1ca7b4cb52eb44137ce1d20f371689aaa2b000687f0be373ebee6586515cd262d1507e7943d7ede3deed0c7c545083c8fbc9963ae07d85b2f40aae9c9e800faba05cb144bfd0209dd01f52f541132ca5e1b3b7d4ee4362c666bad2a0c8dc5a87c6a8b87c71930052ecb0d39dbf8c037211ee5bffd1a3d6d15b6015559b67a4acd1e9ce0fb2741cf0a4627838d752674470fdcf5ffb3e8e966782ebbd259b75df8ca5e46d157e5241a3944ca8d59623935884f445576dbd4f971b740647786727a3a504809b739186eea5ca0c12f6c7dd586f2ef70eda801cee5984bca8e4a399c772252dd9092f6618e8ebf44a132bb2e727e9c07fe56dfd093763d6a0c0218adc54e17795d95abdab986a2bca1d5158ae8ba2b04dabecab4fb68ef017ff321315ec635ab145cd0cd71e5706d78a555c8758c401d6affd30de2ac3b2fd70fdc97f06e83cb4ea7d5e547a0bead0e7f83eebe9620895792c6970fd47d8dc3a4141bebdeefaa3c97c02a4f85a823bd6cb183ba1b9b871cd96681a545c23f44733efd38ab8aacee93e7fcfbf2a5042434134d625caea1a87966937424ffbe3a5fbd25f933c293b5d20d3c0833f737577ac1327f0f776e379c19469c12e8d042e91faba6cf2d67ab89dccf1314706b87e1350d5ba344800b9f8480bbaa34567302a490bafe8cbb6d4855ef312c54ccb92b317a4de15a3c45c9dae8083de461643c8091c3bc9633043cf00bad89e76befaa63d217213b3ee8348dcdb9d16e4f9b953f06fe4f8db292cfd38bb08831194058995cb869a230178b364afcc12c88e0f8cd1be36332a7333ad98f12bbd1bf81a04ee63eadb78eb3707329982f9a4842e102bcfe0f394440487a82d4e57e805642c29ec283dcbe2e7ce7abcf7e44226b1e294af8a4281ec68a1d0608e09827449ccf84f5882a7a0711af2512064fefb5d96c09857cc01253b5eda9065de8afc5f4315d917d2ad0bd3af5d392b425dcf9bef2c7443ee3ded224d7b114634c302f2492fc606cecf97e098b651f7e089c12a487064f183d78f0846bf59f5072286a41b5342c46fff63189730e9a73ee43c282aadaf352563bb127e391b2ba311c836782108dcc3324df0bd60e2a69e0d5aa600bf1e8fefad47664e4bbeab7b955ac495d26653357d795747f9afb50a58850cf87ef7f17d39452a27dcd6fc4a94d497beb9b37d12d3895474400caf9bc66fd4cce470655c645e8bb9b84796ae1bae03e8bdc861dcf4d24ddb6838668f13b8ec3f29b56bb8cb337c6d9dc08dc7a37cd390e234e44ee03d9b31896bc13022b03f10ef0317e81d0dad119693aa16496eed55290b4e7228137389fce33c416aed94ab3cf95908f3a92ee2a07dd321d4a72beb7468ecaf738ea32ef6bf820025d5d79d67bd275d58988c0ccef5a409de74216e99786ff36853f3a4784c173bcf8637ad95720c69e54e7aa58180f88d00cb06dbbc66faf7ad915d22ac4b88347fcf487c7f7663dab296cb56e14bccba4921e32dcb69fc7caeba369bf20c5867389d344ee610176c916ddc865cfa332b28d2cfe911e8c1b16045c40ac2d6edb5d766f3a631cc34e23afe158ca0dadfc548c7bdbbbc224e3d101f29d7382a2a11b1076adfc1a1a6ef6164f5d6ec10068a1ef63c5050fe08f66de31a5d4d980379a7066d3832874de19babfb18b46b8f90d58786a58bdb5ab39a6fd9b82f228a36e7fadb696a4041e97a891a204c3e740f224df35796dc12a997ebe60a14f4017b13bf80f21e1b3b8cbfef513de9dfd18023e749dd9a6254a25516000d42b9634db7d12d37e6d47d89157359f4218431dc574147382401c1af2cd8e1445d65d33a1776e093b613a0c7a3c7249cba9405839e8d018b1ca50b720d13cc6a392865e31635b60de9f4f10ec40eea42a1a0dbcb2abdd70df909d2bfc88eb1c8683c78ee789fa33c74be264c1fc015b0da86122daf394162ed9e6e2e39539e4ba017a631d3709662d95b1a251cd2c333858e735db5158b7f4952ad06459712208c316b91a401637f68b88d1926fe1485588d71fea67bf78194c89e4c9c24a4b798015694fe84dccac33a73a6710cf42517b54d424c8a236f174f9dbec5c7ce9db1bd0166ecce8df03d116ccc6183a8935c646a67a704b98a2f98e67130343168c378c933efd6ee3e9a92ece5e6371ebf9ea5a16fb92e87e32541ae8b8ba31202cbeec7821be798d60f496a1d4307bb3a53c9e14006aff2117c498c341ab5466bfde49c46329089677e9d1b7e8e01da2c4439b66e44a119135d5edced3de7f2f4c231f334b04bc0cf6818683dde76ab6234a30bd20cec33f814ae38fab47a35fcecbf1d0d774497ac089dfdaaece168f2ef98ed4c664a2bd8e410724697a0122f38473b49ed66a6745a1ac654678951827d5203e862a10272188fc4e2308a326ce097c9e6c23db6f8f96bd55bda215f21c9c91472f887db5ec9e0471c60a7c4cf3e3775b760b3cb3a71101b180ea9ab5ce4387e5dff2bc14912fc6ac3b9914469efffd98f69cf1f5a9c4220805673dce33cfeb568ed443c92860e512c2f9ee11c189fb261ae09b07a0f742b571d08b6ede5d9f1b3c43f227df798561aa17db5b2dd0c5f4230e6fb6fb2e0c4015a59cba327dcd7f16523149f0cd6784eba4995ef0d42628d3a60a51a646c4741cae6f2bde451db8a33be0245c1a515eb1959de0d794651ee99580ccccc7fdad0b38de275c447ef509a11ec70b9fb09247b1a1e0f16ab605cfc30bdc95a69aeb0cf9f6c0c692ece0db1b66be74dfd99016b63b82c9d6a2a794a225a666275b0a21d07cd607a6d0c61f2901b83b0e8f74b815605db9b6a0d1b53866854ea78666a85f523bc2e8e061cd9fd632172a3e9524d47191c564ce264b9e1f589f58388430e5af8adcafbe2be09b49ca73275eb9d53ee8c5ea321dad47534f48e3f8279607007a679b9064b3dbeefa5da2fbc3ade63ede1d7c44ee414532a7983711aa43e57ffa855265f88793348ec8d2f515d83a16883695def7a05a2008c20a96028d4ec541b064e5ac430023c8bb49d764475058aaeed07da2f7b42be21b1b9fec700e5b2743caa6f75a45591dd92c858e7520b6d19fdbc09b00125e5715e3e96cf01912b786d0635745f28db22ab5f71bb1e20438497a91a92c158078658f09651e68fdd828be44e6157f579082535d64ba565d3b87514bf54ca10638bd0084b6e918df243ec0e86dcb8ed76894a94ea4edbca73ab8178355f7bec6ad86062a865c488b2d4e347a5665e6f25f1b5d8eb513d436d900a459adbc3fae92fb5aabdfff1f25ba50b0cfa24399a2b8708748428f69b4c02fd84131e7edd8c6f2428c0c1bfb79e9c32942d5a82b692d4928769ad34b802efc78463add301124cfdbb3125eec2c5191bfd8ca9e4f0c8cf2a3a7ed0ccb88b6339a25b48a8ba4b2e93464bcd915a8e1d1c5ced98312476c6d4d9d14f234c3144689b86310f2f52a91a9a180edb4f054f8996c6087eec83943d2991112945ecf31cdc41ada670b6e3a960b60b44105bcc57c11a769ba58515634557248faa9c0f2f91c214c0da67b2ed2ba9db0c9eecaccf145f291550d8fcedfd3b8ce8e5bc2820f913651aff08a243095c132933ec5f9d5cbd41f5141d9b85d8ec01c3899ea8c4b6789984bdbed8d11ed995bcac2cdc2e96278b5ea0bbad0a296a0c0adc84b0daea90e38d90c33d11597ed904e6bcaf35439f82247359d80b8c330a42996c726eaf76955d438f6cab109fab17c3d7b89d8398c174e52fa3f24ca1726778866f8d1ed996dc0654e755b3ff15eb12cb90a9ed26ff0f27fc92e22aef8c9756167c52415d23620d6a5e7da33241e81ce3a4bda7e31f33adb016d4cceee615ca0ffd300e5c82a982a01bb36e022fcba32345acf4eaa76c3168695bd3724a2e6d21fc4a6711a828cbbd9e0264092a64a78c85f8216857f53e8ff5c75c5a389334764627ae9e890793b1ea603c3382ab6e9fed04b5139d6f29285c7a5def72df4aed58591b7b8229b0b58780e5043465b59ef0caed0a814d129eabc66c515d227766ee28bec6dc4bf4be57f5b27021b556d48a5eb95cf29fdde9fdfa64363499908bb6ef07d5f0189a5f2d6bf66f3728a5d88d494fe7988532b82b7014819e2a18dff44d2c89b4d39c2042a8a94dc88ed6ef16737a814854225d216e7d720a211a3bc4cd9cc446b3d2d80a01e24b40e65ba9d31d8cdbd942b31de500b492a65f0856c8448805e47c3556509c3f35c1a8cea1d7afbfe1402ddfee41974b3d6e75a41adb360e67fba9d27bf93928ad88b1848a2b2ea136aace5460b8ea52e49c4acdf2c7591d328bb2a200d67b417114cf980b4453ea57380acfa45c72ea23e1443ee9bbdc418ef9524fa308f1f8222ee5efc0111ca92c8022218647c1505f7c3d6ac6f7dca6575ba498cc0849f59d0a7b5f80863c2ad78bf36d21207e8409f7fc13d06eb93052fc5c1973da5f18faeea53639f572bf2153aa19a49bd856446f6d1c7dbf38e4cb60e09711ab52b6aed8d7bef6764f72a6a7c0ba6437e76eff030d7cc0bc8f7c386d1cc191268527332f85adb36c4ece43183a40933e276ef87ec2e398f59ea3f75a57d1736050822df9e1d9186d4ebc7e9a28ceceb8e4f35c40875d12900e05fbbc10f0b2cc758240b4c160673e4567f04c02c603cce81bf8495b010d0efe11c6d36fda7759dfd981ea02225e96250321b6706d7084aa85e6306f398fa17513b72f48518ec4e1c0110c67040c8970c1974897f27ce53b884196eb79510a18210c29dba34befb05295cfd854a2cb131edf78959a05f25837278f92ee45c515828c3105bd1321a71de532051a42dea44c1f74e27e1753863f27122535947ffe5c99a3a10a2ad2e5b014adcdf768f9882c58de56d459445c27b6bcfaa997a77bae50b00c125ecc2055f38b715732b62ed3f7087f49e118224c676244ea600fda38ba018a1812b066ae40931bad1c2da21695a5b869aa7a3787fa4e6e432dc3b8b3ab04b1116fa7629375bfbfdf241fb087cbc3c8e31826ca3beab1070a8819b60efae6b41a28e6b21b05866664197d41a9c138572dea1ddfeb1932eb9a849511c5dccc2afbefa7b18b2912b50d420c219c91ee472830733ea1aeb6de150479b239f5514e15fc1597b6fdaed06dcf31260a7300bfe8b94e450e76ee7e1a596b7c42bc3919d341f33ddc53a8f6132b9b4369944ed19fb05391d62acdb66954671edc873a33b8aa93ebcc4318615c0659100a51703287fe3993420d8fb165e835898b203e215aa5cb1a0059bf95412c18820f13f33f34b8d443b5d307b0e27c6ac0182e55204021213ff0b3e586b227121ea8346ce3c222d7a4c206c90904d04401c9a7f0a39448209153c960d09f8ea8d5d97dfcc10b021c786faeef6b65f17dfc448de6c410f0fc7c68e1fc8e268e73bdc2456d868a31a91608188e8911e3ab8a1ae75cc2bb2e088259561cd4a35e55c28e40fc236fc44fe6da1da41629e6186ab8c89218f42f5a6d50e301c4349069c53ba9865a599ccf67756059350e759dc6b4b6d7546af168c0dd6f1d50d90bd5d0c81cbab9a065d6fb6443a215f59355a8dca27b65b869ce86bd408635287683d5ac8f83120cf5182a4b12d7c5e06676a19b401f953fda10d1d934985b286acb40dcf45f01cf3843669624e19458006ba54c38a9a7ba479e375c5d1a28f9d865c801203fe5fee8e0ea739e1cbf53bb48018d5fa38af8e04cbc909dcabedc796bc8362e645d7f551c46bbf94c571cd859e2b23d80da3aebc0b02bf5a6826a9d269145f142742e500b808ca8302c156d3324c52357ad4b64779983ec905dda34d8417880f1ce4cc4fd19200371bb856af42cc509df3311627ee9e9cf21a9d49f02c70f0b0b4b62073f4526cc14c33557b95485153d52c902607ec428be07ca7bc7123ecf6b684368c6dcaccb8c4f7e8f13aaf5b7025a73c1b9f7750f2013b61126a0f4d1cce1181c27354da901dbf83ffbaf27fe81d85ec93b97188ed8850a6c8303a14e1bbf1c0ee0d1cb4bf7b6b36bb28e0b5f9289c2c788e3a8bc50d50a6c03d0e4c3b75c8678342cf7b671a09dbf7165f8e1e7b063acbfc5bd35960e30221611d9f80bcf3038c0a787225fd3038f080f48031ce7039b86d31eb7aa4a9b701f9d44a3af9d1cf45c6d71b6d8e42b9633c8d1d546b5a486e7f9ae9e24d46f0ffbc6f6c7083889471c85ddf70a03283760eea35a0307f006720525967a16bd9967a1ef8a1fbcb4593b6c9030116fd583635b44ac308128c22ea6fe0f5acb1465124e001bba8191edd183194289f5c52c33ac4967f92b9967a2d202f76c1f2d5b9f978651b0d8dc755b5302d8670865cf3cb69c9e478b4d5bc670e551e0e4119a3781d5128be2546c9e018f0e6e40d8b7f734c2857d4d2190caabcf10df0164d08e3ec8625f73c69176fed57364bbd0d309251c9ccbe1e766cf30861b19829586ca16f36cdbd78f26aabb837607d1dc621140934713460a162eae3999113ed960096c050c9462bf68ee3da9beed52cabf72408eb85ff08b720281aafe234970a8b76cda24cead1605c8b8c8d3349cb41ec9562b6222d7976452995b9782865b86e96312bc8baf9998842a6d7ae2e6712cd9204e6a0eeed08995992c0f0487b648677e1d53ea3515a8fa90f7fb0216de20e8e6e9f57434bc0c818c92ccc2e13dcdafaf4052d66a5c6e48790e521ffa50b24be82d3685b00bd58231fa50a4984a577349d83ec93079bcc7d32c08bddf0e719fbc79895b22558de3a91a7c59bdfad8c4d24e4a5583d9464b30d388cfab0a3183bdf89985f916535cd151e9bcaac6cf31f27cd51b0132845a316845df20ec1b5df0ca2e1ba53f2c43ac40dd304a568f19953a0c1f867b1448f64838c3511820f5e710aa98a2f69afb504cab7fa786bf0bde2f1af52fcb7743632a23a5b66c4c0ce6f1f3c2ccbd6bf08b11cda48e69c154e9d47c15398d234dff854c87972dfbaf4a97e56a5e490020b81432add31d90e9fde15a359217d8745b133b3bf3e10d07697c4c915114e4709626722535fafd76e6081637cc17525681ef8fe6582d2bad4e2b8052c834c41f8e614219c95a33dd688d4b364aa43bb2a8a0623f777a200d4a98a18429a2a5a356cab4b7c3b2241d8058c830a118d0776d875332e855b8d845c9ca85307b4de1d9402411bf1a0e05aacd8fb9c4a8dead1f30e75d648617424e63c44599763aa7035174605344ef88fb06769f4f485fdf3b8d00e6aebae784d4ac8f72c24a036b3b7104cba00bcad7edfb1e4159cdd3d8b10e1efd23563ca6ef9461196a7d5649959fb545a59e297f60d75d00280364a2408229cf177f93f6b8fbab62a082a0c2cc269a1642f68bf11d02f0b264976bcd5528a1bfa4074265ab68b1c575e96cc3ace7a88797aeaf5261b0ba785f4faf9b2f327aa05afea5e7d576a64c9fabe20a3fce15d8ea80c5a4351d35bd2dd0e2a4a43567f1c097390e075c662d968b87a1c3e29aaa74eb9a6163ec92012d51a96bd008a3e16efeb29dcb11c93217305eb00f6ac59a91960535b822edde1e5e7b12ec164f1a65c6ee87a2593da49c6096ead7b50a4c866a9083904f4e94a0d6886b8a00df3466c7b64eb2902da456241c48a237ddeb9364f35201221ba86ca39c9fe4808f5508f1680040a261d128949eccd6a0380d559a7ae170bdd39025e36873ef5cc9a864aa8334bb50d10803fd7f5c63b3fc31d6317cd4681b61e45c2f89e499d37d424344017d77fd0bc1eac4d394f7ae76cb8be61f72c0c4aa2ddc9605910346c676a440d86b9083434c03768119d5a520b61f8081e5858a526ce37ab7f52c1c59aef26779b36416afb3ac36cd1e1478915a372e034cdba610a1c7610affaf3e300876ddb017c1ec01bb0c049bb0ed432b34f54a8fd523d1fea8848969d5b02e23c4b232a8268c74ebc591db4375f516337d8cba9e526a371f300386467d0a51854f997d66e824d5432263d1fdbd2108a1d6a5658229a86f30afca70d9631b56d5ca1a1b29df8b72601675bd659c07ea1312b6e904942a21d14c8abb96b41317702dbee9692143d762057fc888e9bdbc9cc4b5cb3e79c64ee8a0b810938fef5d0b011cdfbd5fbab1d76cfeae85e04f9b887f5ad46758da810a8c503423feefc651824a2bc1fe3060e8055a6192d1bfc74c6899a5daf93fef91d12f50c5420dfd0d10f568ba816532d33648d1476a6cd2dcfbff53b91e541e4f9bbbc0ef42bc0ae82cc9ebd7dea300ee6de1de7318f2b17fb6fed5055ffc430e4f88b50682080caf3c10007c3559e806bad12d0886b786018195166ce9846884600913b035019e3a29025d27f2f319deefcceac033b3431b8f49fa7ee29b6dfa2eced5100e944e9dd1a3060f2f924e73a6e6f23d4e2861a2955adc07bdd9d9f871502fd4435772f94a970b3066b626f5bda72902ad5f0cc6be7ae0b4b295706392109af0c1fe67fe52e2e053f93b6f53d5e8eeb25fc52e24ff97ba71b3c9fa6ae45baf77ea07acf182c6a46b80a4a0a3e1689773f9121c6f32110f8f1650d28a02860a3b066d5b021bddaedf8a524c7b1a116f7b58717ecd5afbd6eaf1ed960de901fe6bfe7b7802182b4b109e248bc80d09313fd3c43c6404f3cedef94fab99bdfe46ea098e4c4168d009cfb838215951f15c475f5d2e6478157bf4e1510e85c98832feac05a6725e8f7864eb2cdf30e00b318cf45668bee41dc7ab5e214294af11355e729e120de2b4b8ba01afbb2d0684d2b8bda823127c2742f51d3cc998ee55e45b60cebd45dff0e0871b5ad3d6f9f71040376143a35a043621cbedbbe92b04155f20c316f3a4846b069cb90c3a2559eded7dc5f6745a7bb467bcefe5b15dedc58eb7e51294995468babe80068aeca0ff922064dd4e95672afe5978d8c71df85742df558e888e2d744d2ffcd01fcc2a9889d91888e08bb0ded039170c3c3f719930578b4cb0a031e9ef0b5f7b594403467d3f0a8271934964c20f0de67be803c17ecd4ca8e846be89ffbd0481ca27d76b2a4ed1d7af79de0d6fc53ff2b9132e159cd0c8b9145d691ecd6f6c037ab49335260ac1f72b0dc49e543c8baaa4805d7061a3398374e8c7b9a00e191e7b7d2d9d97d6021251f193e2f841b03d5cb8385d06afcd76a8d0df43384c5651c59e640296ddb8ac7bc2a57fbfa028aa0739c13fdae4e07689c35582faab9e3935596f37975ca3febb31e92e14700718c3990c225c4f598e72449c2c37ad5f4116a35f0330960f374b2d85fd6ad045af70bdebed2612f139923bb074aaedeac0f6f95b0416dfb34ecfad729fa15bab08248b030a841a7e59409cd1360791e7a8662800b870566342397e40615c999f390da6b31194a703ec42183a8e4f3717c77de90ebfe85a31bef7bea5ed2fb0ef8019e4b3cc50ae006a9be7d2d95d74e500bfa71ab073aae3e56d77f7cade32c99464b707dc07d107afd2a4d9851010e48a8532225cd36b87fef9c87fb8c85724336797992f717e28af1a0911121f096e306005f2a79d7ca1052b5d80105ecf43d20508a3fb6150bb8c46be43769d9d20f6e7952e3eb0dce9211f78dcd979885dace721eba1d1431eb2b534e79c52ded01fec3fda46d2e0976f80dbf7f4827a674781b8d82e5a318586d111b4421baa718fbd0deeb1e7c7b0d7ba1b3c68bf3d96f91b3cf8e001fbec39ee7380e6ecf4b4566a58a008459ef4f61ab6bd564306bf0d4d06771fc03efb106021d07eeb2848c3f991c1bf7d0e503f25cd8f0cee647c80e4b3b7419275377c706723fbadbbc143e6b9cfecdfe0c1070fdb674f42f239401bbb21d9945c619f5596071f36b8cf3c0fd96fcf03f799eff936b6cfde4646c6ec3eb07df621d8ba10643a393b5c47bf0d8a9668090ad6a3e027d21105e747fb06d14f4a10b6a1a2f9d9be33191eb8e1c306f6dadfd83a393bd786d6ddc83aac939e0516570be9f12da4c8349c08e3d005154e66e86bbd7671b4f6cc589925581437350708385a39b13891216eff8f540baa0827c260cd717549b8f2d17da421fd414797df63688882b4857e74c7e5f79652d66aad46c33d457e14140ee75fa3f191384753bcc13f9c010c2a900f14141f89a34fc8651a0a729bc78dc73c613d4fb9fbc8437e0b05db93039b09d31d9ea2f5d4fcccc9856a8a291dab298ee338562d8acccab5cf5dfbb4921644dba1a289b45003a2811acbe5f7eeeeeebf4a7206b326ced7a1a7383ff3f903196876576976f82b12aca77d97b52f43632ac94fa791a6f80bbf0b7194189322d252ca4986cb9fd937bbd3dd457eacf2244376bbf393c87a1ef2d0fcf8113eaa4c849eb83e0a623d3f8dfcd422498a6d759bd212a5b444456a8406690aa4a9e9364ddda630b7e9e9367db9fd945b32fda6d682427d28bf9ea35a98d947281d1c2567b814e4873e812a394acee8928ba4a5f670b7a915540ab7dfa353dca6abdb74e4c2cad9a94eb0b4761b9220ac474b4fbfda69614b127602b4249920126f8f4af3436bb5d60ac17a34bc7d67474b46686907b73dac47bfdb4f6d40697081909e1c482a84fc98064d611cfa5b0cb7db57455c4749e799e1af26ebd1d295265af2509e38c9c51f34c57bdcfe76213414e4760359dd76256ed3944b4bb4c4366c2b6f6e0bb25b4a29533d7be35daa943ce166feae82f5ae544acef0cb57bafc400852ca6eac2fcf6b8b39e75cf9c85b66cc34324717398b875ce5f24f664e7e76b5ed3dfdec2129ced55c59447023a7a23b152d90c5085b22bab23e6b858e56cae5f7165bba5d9c1f17893b64d745cfef41c80f950245a1449e593ea45584cbd6112e5b515c7eeb06f2e3a72fc80f15511839a33541b03eb07670d99ac1657a864bc570f9bba3a88c184ea8cb6fb5582afda12498feb8383b627b482c96cb6fad583bac141a43c58cc95292383f54a4d1745ea5a4cb1a6b5d2211cca76237edb67e6e58d0ef32fae59d0ed31c8691d11d154ba2607dd5b9d89ccc683d2ad20113ae10d2d303e929427e3c9c1d11d3f0208c8317818a42242e4f39a3af48cee0cb926711d9e1e7a21ea13a2e8bf22413c47ad4452aba4a7336a1911b6416b9fc9e6267cce59f5a5cf620978a547411372ae101774d691fb5b7dc6e96522b912d9737d9b57eb02d35b7ab3c6939c5f7c25c8dcc12ac37479e23fb117e6dca98f33a5d637b52fa53552f2f282686f05f42da23a56062c8e54b5c0d41c7f5ae181291299b378d6577e6a539f216b1fd5a8b56113b45d9dd39a6aa8865c934b096e6c89b415da7f65cdcbd5e2e0b097239c875ba5046b84e9925d8d314278c569281ef3ab5c76346c3ed2e461516c695529088dc0190c15a55982f89740f2f1c0ed8870be3f2a614ae24d1b21b38dc4495d8f72cf800035cf9d26bc0952fbdcd95af611a4cc3eababe19ac4a898387c476927b1dda96bce4d8921e8c2b5f566b3d3024a7dff313393b3136afe47a1a18d22300c9e937919c7e18d7d3f4f5b6929737d3c819f2b634e9d01e9212ee68c8eb15200024575e9e172fdfa33fcc9f2afe29680ff7fd27a0df3f02ebfb3320694889c3f5fd25d8800e72867d4f6a21afb84eb8fd62dbbea493b3c3249bcc4600bd006dc38f558e8779269dcbefcd292ebf8b70f0a56da1eaa83aaa0eeb16b1365cb25e56edd86abce36e8af2a4a76a7642791206cb8f79d5ab252e96057cdf446333fc91a07e0410e0f64ba6313db4bb4180911c79677783b09238c8eb790db6eeec480c067ad1ebadee869d9d860189c716d6e3dcbf3616886e2488bd43c1ec88dc8d009ad3cf59c077fb456082fe3809023f08f50f84b89e14adb45c4f0eb9ddefec40d0a80f1bfed4676732c839084ddee0d90ba469922301f6b5bb913df60c03928dfa5977a33930d8fe666e5992f1647025b6a90fba3612c49be638e06f7528a01d73f1da5535adf655350290f2c4fb8b811b9ea383076c9460012875c69875629d1580bde1dffbd5184c2a2ad0c81c452396961913124b2a2230aab95acd18d36b5e525f867679735535adbe87295f7b6ab8fd3e9a9ffee140fa23bb709597dbefa2a96d326003d188c5e3f9e9f6730f6ebb1431bada57eeca4ae6678f82fada7bb576727ac9fc7e1959f5d02646736464dd0e7db394561541a4082235a040a03f299b0b11a58fe4c26585e56675863ca53dcc83dbef9a6f9313803ce1a79fbdd6f1c0bed69e13eb3ce42157c9defa8d07f65a7d0d6458e7dde9a741388ebaba90018d9910b945ac67229aa49ad32f482f46d6aba16b60afb7deab41a4894e2f7e90b2eb3ab5975159dd0bd215ac679232496554262f48a28caa065146558328a33a852c76bd8cbf97d13180913c7941b2c260bd397e477a417225ac67927a4132314999a436224a72054a6c16666ee76ed9c6f9a9d55acd481a4923c9034eb282ad55249550a3b812c5c6c6e0eece52cad56ad5b29a1f0741bb04286a2a2867b40f213fb487ecf46319154ca5c0a82c18b50546512b4cb1a22e4fd090867609d05732fcd0151ace0f5330a4a53074410633f8ca8725ec753d0741db623d47adc295cf1d1a12494818d64c1236150d290d698a12f9d1b4a587dce67e81f1a2c46a188c17d696683456e3703014e69e355c8f8638343f315e6ab6e4058c189dc3404179c1e194fcdb2eece4eca830d5b5a243bbcac5fec10d5442a01b38e4aa085308817c587f03c746c50e4220ed716c50180204f9a8efd9316cfae3b6a540443960120d7b60a58b1138b81e0d2bbf8339c893dee866d62758cdec70ecec88acc6f477e0e7deb91a4c3f733d6fb227a1dc06c33eeb64f0f365eaa1b7505247c3e6d48e8e3a0a5a1b796d12d6a394d3c06ca9c15940c809c116faf4d20e0228145ca121257561fb7a34d480f461275783051ee610de5173421aae7250390ebeac92268c4a42c21f234b29254b9652327b3747231e0a79881261ad6f1087628c34671c6ba86a21f291fb0835a4e5c4129a5e48406ebf8f46da388ea37134ba8b9aea2fafd1383fb5cba4c18edae3612ab75fce089986bf300e51dc4aa1b8fdd2a3449874892a5c4ca53de3fc788f3d4acd8f1f919dfe5410e368dc01ca93d24ba9f472e9888e2a26d2be0cca7a73d421e7e841ccf1ada9a9cccd19bcdc39ceb9aa9a355a96252d29a5e56f6dacafcdb12c4d0aa98e75c442ec0796828db01006622dd887ed60296518862f1d4e51280a45f47a2ea2948e1c8d8bea913a8a44d8113024dc7ecc0767909f6a9a9d4dcee022f8180541b3037b03133603509e68158673b17555c5e6c460dffc741d41d71184d86204f2ea28dc04e0cfeff25347f3f24d0577708d612c54c7e654538d698f57eb8885da93827d2a4c8385587b651460c0c2f5eaad638f8c4315cd4f75919dfe2942295851aa2679d25fc76aaae36d4dada3c692323d489672cac9cc73f2026ef09fd77aba8279e76f97c3c9dddd30ddcdcda0041dd468acd556dc2b07e747823428281c8e051dd5dde027aa40831408471686201f3c3b2ee4877efe83a5a3e434a2a7d9b1f8a9c73cb81206eb51d1faee4a7ba6383ff5fbe96a7ee87747c5f9a9b493c1dd155d832ddc470e360dac47433983f6d31ef243359a92925082c4011cb9ba1df8ad7701bd9d83205f9982f50ec8d0d08006d73b8f8e2cbf3d1e9591017af9e9e58e43397708d9e93fe2f63be88d726114c14519ae23d68b718d56918b0c171926382778f21716d3caa82424c452580a4b6129cd2e614bae87a5ac9b92339af9454dbd80b05e0d61291bbc0aeb3908824bd817d7c35256c68b410d35c7c3520e56f136966a4e6741acb0d929c352b73f1363bdcc74fb335467a86b79d85a4476fab9b8fd476ebf8e2a56f1f6830e3a98adb01e6a18cdcdca42ca6eae9a236a2acfcec839ce51c60ed79d8f5dee7a73cc6cb8b3d348d407b655a3469a59d8694356bbde1c4180814848be172992ef45aa86118c9c915d5a9f609be004190579f229c88f87ae0afd8a392747e37c7d66a89f586818a42f2be4c0a57b73c8de216ef1864272d8447a1c0a1f72797e5c09b2e356480e09892be172d536377078172513487b1c578a04f2d1afd56ad9553464f5b0977f76036da3db867503484178d9307a3dbf8fda43bf0357c743ebae972067e90ecbb89eefd5f90815a2a16e1a6a0f0f2101e90f8a48a53dd28525c8651fad5ca61f1d4d11cb161c4262c41eafc25c2ef13b4b85694f3f7f370db1eac8e5e71f441aa2a1519d56474644ad14a556eafaae1d16910e592a6bbc542cd13272fb294b2965ec905dbaaa2ba65058b75058a629cde168e84ace68cb922b2b75f9405a67901f2f5957901f4dce983508d687bc8aa0d981bdc135038d182e687dc1ea42b582b5de9960adf7bc246787350b85add7a32bba32b2aa2b0b85a5efd115e831b79fc248f1da60a5accf09eb5925ab346bb5d66282f5ac9497da235da0a0c5edb786584498865396e634a54356a9f9b1a0b56a2323d781f9cd3838a54c3c31b252d44add1da2e6a43427d41c95dbcf56ca4a854499294418cadd9da594222a7a612a9a1f2f79898abc242a75f6d87bd8080bd29ca64032f6eb1b79315af20e3b61be327968e468bc2484b52eaf3c6c74a5c93486db4f4dede13f512194312080e122213d3cb011d370184c09f971945f011ba58830bd546a5fcd0f0d820eb13a62d56345451a96b0392d2179f2390a6665870f3ec250dbcae9d49e4e7911d29d22723ab16c8d3ce9fa045b4373633d6f5cc8c9eafc5412054b3b0f7dd49cccd8df83091bf2d1a97be37eb2629c080d0d518d5445746626919cf432c771b43d52cab9cf51cef8b815768eae43ced082fcb8687652ede1c2234528893b3f623d1791f8c0e72673ab102b418d444a174d30854017f01ed673d165ce7f6eb2d4903f62ff75983a346feac77f74a7bf532ab6a175d1fc3813b2d3ff447599e23a29487fca539eb24dc04220787a6131ad8c4a42c21f20283bbe9a9fab7390e47abe3232e7ca411ae2717b76be92c2f24511e15028c2082424d370218cc31140aa843b95b46706353fce457fff0fb71f058277c75cf53ba9b9b81df435feebba2ecbb2b04ccbacccb2fa7a6cd68d9702b99a62c7cccc3ce7b451d89ed7368560fb22d21effc93f55dc0ab84b8a58ab9ba306e678e97cdecc3979724b645d8821b32887012ddbec12566b294f5809fb62a294d2d108ec1df2e4c5a218a6041636e73125dc0a12d3654913568ac2ed77eeb070f45120787848cff571151d310d8f71151dd151bdace78bd900881c08213f34343b4c83ae70d7a3a14f86ae877d5d528524ef418c4f1aa22b211aa22b25ccc41b164a8c1c70a54b12307703bd7a931812812b5d92601925b1a3bbd2a5c7ea6ee37644ceb0be3f0669e3388edb388ee3389fdbc693b36f767a2b42725af256044cf6cd8f53213bfd5e645281917edcc83cc967a50c48b5fedaf870bd75bf5edacd8d1ca0ebad8d97e35a7f5d9d0fd7f3c63baff210baf37598d75fb5762dd98fdb9f85cd8159a934221bce0a8b01690e368e77a3a9b894c5c4395dcef95c12c02f0910d4aaa5d29cee3c4da8393d95b07fbd2d55c3952e3ee0e07af6a6e6e7fa0d7c0e4a0e5e8ceb69a91e7603b5d4ecf4bf771ecaecbc1c4abaf8a2b875a5b7517366a8607b3c8c745358e7d5d47b1aeebc67e1b4dcfe4d4b5deec7edd7b42758d2fc6c5c4af5b65123619dc7edb8cdad6850b0b40c7605bcad34a72f202567c372a1cbccdd16b3c1c8c26e23006861b5980d1c723770035d422157bab4946e01ae74095b6ef6cdcf16c3a5886e3f0e4e5218f149f183172988285176154ec4d285d772cbc2c02a6c4dd521477c1ce8991fe2543851103f951c88f3e46a493bbd34a7c7f450f548b1c7a5dc7e1edf83aee7a75746a1052cae766db695ee30771bd89ce62e83b27cb9100d9eb81ef7dd760957ee36863b6eff16c37d9c4a3777db116e831105eb655f78c78bdb6008b1de067e2f896ce34a7f248804c6cea7fd95ab31b36f7eb020dde917525fec90b6b2eff6675f7bf8ad0d068403d69708b12657bafc0085cb1890e6f4db5081580f9ba20629171be70763e916717e301153690eb60323cd4f5555d1ae34a4fba9b6f1a6b85ceeb6cdc57adb665a6d1bbbc9c698d41360064fa5be1d4ec4873033b36ce6176666beb82d6b9c9f3aa43b0c43e48652f2c48a94944e92cd043393524e620c89d0e8323733333333f36c905b48325cb59ae77cf3f3a22ba9d55abb6934da7ff699fc335dc182982874f9e90f2129286770c54a2e269a1fbe44971f0b61298d7dbdf18fa4fb329dfb0ff273f66f84f1959b4efcd910736de66889bce21e5dbe350182a71716d3caa82424fc0182231ee09c9a4aa2c37a58c8fa15b80229490889240404455812b61f4896924acacca552a9343f3e1a9546a512e9d61f13b0328a5074e95b234ae9eaed74facccccc17bd38775e9b15b05dc2c2b89e8f463ae4a79e2416fe119a216c10f5f443146aada26641562fdceeb6b8fd3466fec7bf39d76b418ecbc13697d501fa562704cb9e97847432eaa9395dc285c6be3a8ea252ad6cb72634510459a61198b9fa56e6386573775b16a7d828ba042330d26da6ddf2a2c4f20b0062c020c97000e862d40ac35a128d0675053b42f5c85e5e0f46b1d1ecfa226c0706b6673ee360917cbfe84a3adb791a922e7344e5baad7367f60bd436be63e3a2946984b20823798ecc37115b8d63f82325a6bbbb9f626188bd60e1fcf86824676428d4fcd45a2b8642b5f4070b61426e63416e63406e877eec90b2b91d321e5d8f85349ec542b71d0b2f4b7b8c1761adaaaa5be082f442d5a2aa54b58b4bdf473e923398623d3026b0275c382c94275868d171e415a7450deaaa050585c3f9d768acadb5566b359a7f0e0705c54925ba23055e4a612e20ec849140587fcd512f97554cda46868dfada6bdd8df0c667418408ba81830405921d011cb3082650fd1c20fa4d61f29110162ad00d1c191a46201ffd377054c004f2613d8e468338ce18af8295cdf932d0b747b74560d667595f2908dd4155a82804424196cb6fc9a65ff70ba97442c9eee6a4c456b01d2addb14cb07c3d47592d28281c0e4943ca24cb2a20a1851308875b710255fe419e30f65961a53ca1ff5d7efacd5a5dec8df7fd19f63a4c19d6f3b51eab9dd5cd113463baf37df388ece858d110fd60e847bf119d991e76748729223f5ababbfb3d0cfda3d49d524aa97f9e12f2904824121961e75b545409f9d79c6efe986229974a324b29f92b4b13b248817064529c403e98375ec5385aa0260adb89f80f47b5b0b7733b9d9d8b98f6901d7e264a46ec90c913feed0aebcd718ea1aec07c0fc3b0c77ed946966859d9bb08b2b81198eeee7e2b6366abb5382872d75d1c633a14a25996dd9075679c6d366b73939f86901feefbb5f723ee679dd6895ce72192acf348e618ace7a653738a7031e66007d188f59c546a4eb684cdb2ec2dcdb2322d47965d9b5dc2721a6f5e09aea5bd6b9de7a6e6f8497bcf4d41b4ce4fdb660064b0d96bbfbd767135b62d7be634c069b859a93d1a4d6a4eca365eca3eebbce4225fc6ac1216dba4e086eb0e22955ca4a2b88db48e81056e9eec4edcf6509bdf4cd184a1c8091aaa717d7d154d020b5709e9f125a46708e34004f984d054a3b0529e58ef39d5f1832a08d510aa504893a23264644193d76048188a3418151758a448912cb2b87a90c54664923249d9f0d9b0c384880da1db6f32c4446532daa062229a18a119554695516554afd18df5d8c686acd6524ad94d231768af1e58e76a4c3ae96b4cb58c4ace689a510dc074fb5126abdb6f926acfc52629132226a209cced3751ddc6b0f6c1d2d76162d8d38dc990e6042b27b455c4ce5516aca769e135ce0ebf268ea22692a85823e205eab66ba076d25e34965ed1465a4913a285da8fdbef607b1c740dbc50de7956fb1312ac066a20bf40f5e50487ba8c89738a1998b16046388361cebecbd9ca656cbc9ca55c6eee97e983e470888afc6b0ee683f43810241d10b6af958f2e206a91aa05c9e1e7310d974f15c882184610fd1c208d6e648480a66a6976b8a2668759e462fbe79c734e0e73d10585f5b0101602356eadfa5409d6c3444c6c8f740143eaf2672a4c03a63fd9b38719b98cc55c7e2f4b611ce65fe3fc641da64376f86be7613f5cbeb0202c36c4e5c742f2845fbc4cd67311263663224f8bdb820c80ca8636b42922f647db164bb2273bc4966c905aadd568fe399c17bf359c9f3986ff359c63a83ef6589d366c8f75d910b361c52cc986cdb16125b11502d6900856ceceace168c316da30dcb6603d3bbafdf57a5b78fbed88a574db86b6a539f687250db19554c3e690d8c0cad9e11028b2a10d6d68435e0540c59db6d9c4756713d543af5830b6855f54898ab93401735dd0596bf21d01f70006b8ddf58dc75c675e4cbb91cc18579670b409cb3f6b48f6e7af55d46de3a6e0992d2c07e14cd647adcf2a5941ac1d4c62d165067219bc4c65778f66e7a5d60b08abf1a4a3f99955f3cfe1cc150feba29d0c1bd70d186313a38f7e1cad43045d9f03a459dddddda26f234193e3917d06653deb63427ee8c8325d7ec2fa2c1539835eb64874343fd657e9e8a33f803db86c89b2979c075cccf8e926bb17107b45613d2fc2e154690e8bbee65c461059dffc30a83bebb3bef648fad8d7d761caa07f599d0cdad11165b1accf4447d6677dd7b2be5e7126f7121f68f2068f8ec01bec0035841316d4ea392fd29c200f86e841b5d51be60266762d5189b0b9b4d260fdd49ee9298ddbb81958e6ae093b6dd57055689e425206da83c5aec88eb09ee790148bf919e9b11282b8871b984ab2a9d0a3082a50db60940610e481020b14e8c60c296248201c5c0e8e08635c7e49335e8eebf971041148561f16e041c408925f9946bb3471bafc020f06973b17ccebf284df7be8e1921cb1389a67125a3599ae7741bdd87b7d2d4d4ac97540fb6debb4b999779a6a0abb70f0e800ba20af8ead0bc88b95ae37b3b719b67941bdd74fd3fccc54ca3453a62b65df6a52f2e422d569f5c856b3344b72069940a669a626cc3ccd97db2f2f66d6a0501a45524754844038780c4288201ff37380bc56310a4aa7ec73967575da079490f9ee6e142a8fe06accc6b81afeb3fed5611b191a0adf0cca9a7adb1a35274fde6c604fd2dd2079ec35924d875d7fb3d33dba8080a32cf3bcb9196f025cb6b92e6a836b930229de4b0552bc2cdef9940a49dc79758d9a256bbd374bb3344b93fa0b1710ac3b64a4b09e8320088a191486612d6eca90b0af39a4f9e1c00c89cb90b80ce9f667bef9e14ab3d35f355e9252343f6e32611ff635478421224ffa839c6a9b325f0fd6c344d7e3655256dae371a5517bbc6dcca4b42763b2fd1b1aac877d5c89992bddff76930913b1c0af878930956de4400e09d9058e082f704548ce08e9e13f03078e1c388954b19ff341c8585d6e19ea126e9b41a6417a58235fb89ae4490d524f990ffb2a262aa59a3328d728a594d2d7e866aa8a88aca504eb49f17635642d89419f7653d59c6601cb1379d28f0202c954b5e9d6f6b047bafc60fe4d8ee626826be101d60907380f05542f743030705ef4b049a2005010a0d68ddb410d0e04003387c89f3a215757c6d86a15b24d76e5a8e0cc96599164365116b240f0f462b198ac9155b28458a1f58344a2244aa22f94dd8a91a16fe42c6125cd8fd76aad46f3cfe14c14140f641f9a1f064921493dee8fdbbe91973a213fd6c80a9370db22494145f2a49f44a5b0403aa261e8ebba916103fb8a7537b2901024108e4b04f9f0cf3a1f6707740119fd88fc786a764639833541d81f525407d89c5eb146cdf12cd002ad517b249802575898065bf447739a020149e0fc78c9024b6029864a22d7297599a24402491678639a63c4022d90c7d09506a013461328a5b4994eabad49329b7a6885ed4ddf306c161d31e59c3d5b4af98282c2e13cc949a5d2a925c8ba28a575353f56f79fd58a595b351aab7a807eb353e95b4fa728766f5a68a29aaaa96f472512aaaa3a622a55ac46b4203f354c7d8fe9b86daa47c2ca4558e4f612f2533f27444900a588c2ed2f59d94f19725353bc2151534537555315aca99ae22aba8ed8405b79c94ba2110fe240dc9482f1d34bc9457e34cc6cc56593924b3d88212e77a292c84b5eead56505e6ee9e1ba719f8589a23b9ab2a2b8acd74dbd9e90eaad2ddddef52a552a924ea2508f9f123dc35b5dc90c6482d06196c7fcae7b9e9b6a7a58b114126a8dfa33bc0ebc5b81efda653e1a9e670483e8545794427d21c517bb87355f3b0aada55842293f659f3b01ff6243cb0cdc37a3eaa7f49fe022c55df867ed7cadef2b07715b7a9f55d40ddd49eec5bcb324bc3dee34f330ba3f5db6db89eab4435341923a5946f55312cae3677c1865687fee6d876335925845cba7357554b29a564d933f8e589ddeaea4f409e504076fa8544f1f32301d9e977f170b8fd33872b6cf3cc81abc2cecf21075a639abbbbbbbbbb9bbbb9bbbbfba59bfdbf49d2a2408a09647d0ed0ec48dc61b779f6f4d5ec5827d8f6808bb3d35fc204ebef62735630cde99829ac874880b072763a1386d54684266fb0645856cf39e79c73ce39dfea3979cee91da248a8248e5407450bd58800004000002315000028100a874402a168442c4b8afb14800c7788448250a10a644990c2300c52ca10631c3100040060448066340a0280c7932054502e9c53bf2005f3f61a83cf1d9a062621cbc7dbb7ef09e3ec809cc1dec87e692b5094c0481f981b0f1c452ef0380461b1dd1ee04993023067948ee0663181101e7b5d9b09e33b55f7e15be30ddaa81759d2713b1dfdbc0f50dc30932582f06cac59ed6205eafdeb8b31ecb2800a526f42d309cb80d0c90fb3db22242d2df4dba7977c9ffdb1a427554cc580b4ce99f244be8fa45e8ac58e5a91d5a6c0cb5b43d9a4042e9749c8d7bef6a2ba5398044c0a28ea75b154eabb8e528487c3c24491a9d9b754aa1b279125286cbdae3e5ed85fa45ec48d630881d3f9afab62744ea6b7b330557dc53a2a5a520d995a812de4b8ec71f1098b80b110435c9e0e6f64832f0ce81e39b4545dfa2a0f3137e6219741c24933fd8a2e4c997186ca730f9bb5003af5bff8ed23746488156ef214a25c74791750ac3459b5d25a247f412ba46ea244305447ec6ec1fa75ee58915a50bc0208ee884dd709a9db262792cc455aa38e1c382a2bdc4ffbd74667bd07573bb928e2e459bf30d49e0e10464ebc074b1e1aa4bb01fef825884c5a8f171fae7ea9bbf88c26426a0bfaeb832166e18babb2bde5013b0a2782e986b98ce37523e8585f362841dff01085944994b14af8e62a4c5ac13945b63076e32b9f84e43a6a1b5be880c63d889f7f1f2022646a7598ebf08361d1381143a3c5e2319a11335c052798c67fd7e5856e62c9e666ff8714900909df056aa33cabc84a1cd53900eeb50f70e8c93fd0f692acdc7f1d2f4735934e8b027defa87aa68abe9bf59c0e886cdf0fa1552527301ef5102a1ad32813c8d6c3969568a91fb1d5db71d4ce6d6607c86771b13f6bf37f79306013a280dc701d7663971ac81e7306247e3a70a833edae80d5f78e9aefbe29d10b7e982e62b1b4761fe1a7f8e04b897e23e59c1c0ceba41b79d65da923eda41a2ecfb69badbcb5844a88e2b1fac6e372a866b4ba848b59b7bc8f9be1a48608a48c860b75a957a1cb5ec8681742b8d4597a50f869d0d3a3e0465b69689a4086d472b283dad138a63ef7dea04204ddfa1bcc87fc8b3076680a93cc31d10f0410643de8d820d15a2c5a70f9044353d9f9a00583003da8d034e81298922bb267f589279aa3b0d2333cb532ce42710035df28370adeb68e0e04303eaea1951e4825be4fdb3440ca47054dbb578ddfb186c31719459dfc9fda806b0e0e55b5a5774411463c4243f2f1eed73c8a77a9451ed794bdede391ca92552c877994eae22a39c7e36a9923711a259ef7b589f80b77128f6576938bb5897bbe68b62f4c54e3381b6b67ea850a94fdb8396c0473df04d66de2e93a8a4ad9e39202daf69a9afc72f974c484c2c09fc8662888006fe37286c2f541cdf436149b62a0756040db5a3e29c8c67603426c8f19a332b971811102d2bef48575959c3d73613d17535fc79b28f6695a3e31162a9dfc1a98f785c7b8d38edd3ad6b5be44c4184c01e174a183f269872d8d25bb8da0d54cd684668c5e34fcb8ed6226c66d4370e7e7f4da31a996d868470c7b26130b62a2183af2b678b719e9c697f6c8a3526060b52dd59108e976e24a9bd128a0dfd4ca3d7819dffe740abd0533102cc988f139261ad049d790d67f28a34c9cc655bc69bb793ce750c87cbe1685bc3085b0a0f71dbf3aed5e4a333c2c74d8fcb969cb10fe84c2ec3452119c5aa6281443268bb3172086b9b4e4e904985572c7b9bf72fadcedb01982fd682c3c531e97f4e848f8c14c8c7a8341a2b050b895d4ede4ea9d2c0f49a36f4d8c5714b1b08ea6d254ee3fa1630a2464c6ff817c3a2b13aa3615d6055a4633502f2789b063e32d3edb21f1cecee3f9c252873d81c3a44ff606d6c6d405df2ef5a277da2d37ee7f044c6ed967dc58663f64d974aa40d47bfea7cc0d1e6f4d79379a362ec9e868b5bfcb9c02a7ab74256a94ec8548f5a4baea3785f0996ff65b9f99c55077b7d11b7f921a1368cd9d3cc82321f9c2ab721f270d93ef0ca8082f859d9748894f040896295cbc148fade996cb808954eeeaead31677f5d78286bb60d152b1ed6412a0888c7011eceffe55363df5084a5a850126439bda71206ea3a96a355200f9dac53650d1f9a5e3e12e238f3f5470b41d6fa2867b46c9f1b2e362a7b0e0a2ff445e7019dd4a9f9e5d1b18aa33487e987be0302148817c29ac65c47da17d0786dafafff0d0eacbc503880f0d432d02b682c5cdfb1dd5118714108ac92ed49762c3670ae95ea8ae9f3050e28369b97daa2832be28a815a165c36427d3a262167fc7069d3a9189bf5696a64d1f21332f0d9dc8b473ff9a83072937645f47291f8169f23ddf142e73a86982213caca7cfef6ab801f91d90b7515603e691c7a086e805fc0bf4e1eb3b162b7e5bc65a95121ded129a941cced0757611b6058282105a682b11116da504a61fd9fe3394eec22df8172091ff40060c162942fc41790d9bbd8f47879b4e0588e6415ecb02beb0f43f22d449791eb8b1e657cf3573d6566ef50b1a43863b95e3ae2e2dcfc1b278c8f56d29c5764c9d5b9b9f0e0944c990842986259e6b876a9752b60de1c4d13316afeb897c0b74ea048eb942356e0d46ea50f53d8b6d46e2021c122648fa365c50e628f82a2d880a565f4cc63317bc49581a156d250c7a65473aa1c05c433df64be1a604fdb772bccf6d85b477666620c998ace9da13e24aa12aacae234e10d2622573dedff0fd600525c6b295137c52450f6dac5670051bece81dfe0f989240481d86d8bf916ef17b4b23ea2b52401cfc2c78fca489d717d24a1e6c3ea20b16216795c16dddd471dba6f2c1c90503f68fe7deb8ba973ff439f138cb92ad68ce1299a5182b577c57499934de90080a623819861d5c140f6148a5f2e13f546e60f6154cf837bb8aa02616f66f5ce6064f4d4a35a9e854eeadba012405cba2bcca72348e2b8e599a691fc73641f8df29d3f8d3f94de6d213773e335ce46efd1781fc061064bcecf4a435d6045a383ce8b0a01e784c258f483bfbaf506f42906c8630e27ba41c229958b483d50cc531ef0237c87a55a9d769a597418e400fe7c81dfe96748cf90d5cdfefc591b5bed321c82dd8f6c94869442e7260849941b52af5e5ac4666625cc8343c87daa2a732c1b50852b48992bd7283254ef9f7dd5a4f0a18a053cb29b08db9d02e584c2c33b99961a400c65060770c2dfc7bc29c382e0ac90be7239c37c83d8fd1e5daae09b77ac622939c57cadf356a4f45153199415326eb9ee26c6e6f51cdb7c701fc5018c7c45b12e12b6ea5ef5741e2fd10c82e1f2774e5fbfa303db9228fc1d928cea3c8c77801ff24c271e15a762054842cf5dd623d60b12b0ac9fc7874fa5256fba58ca398e991cecbc74ce8dffb123798772bd14ea427f009ec59ac33cef4d999dca50aa4bd54e8750f54ede3998108a782958c53e99a983596c1ba753bf419ef110f23bf79f289ba54747dc86c8e14e9f06d38d1dd72b70810e25ff2ce136b50bf2890d290ac7af7469b088a68e51c513d6462b2590624217886a685f14bd36aa4ba11d4d0e06ea6b678c27f68fc9d2002f4b9dcd7db065586e4530408b31f09d131204891c3fde482221f385aae35e908f9f1ee501ae162c8c8d0dfe358f3a39d3d922ea54782a028522b6821a7dc76df48c009ed8332c3f9bb799e922679129d851070dbed3f654ed4ba2f8b8066343a6cb207767d8e02d4a90afa9735885ff4f6952c49fb3876ae6306ca50b1ded14dd89ef58aac8412441e94beaecad23704aab68103d2c4c8ee296e33374822668b892b976e9ac62c8dcaf51b06c7f4c29279546df784f527c22a3dd461792269d5c8f7a17ed6e4fa9ed2af9ec15c81d7e3025a178874b121f1e97a6432a63b1301c33bdbf5f965c09d0aed4c3d56e19f61cadc9f1ba395a7b9e3fdf4e0e53639064a8cc017943e84e6d0ef19b7d2288d0df6f64fbd048f0ed13e4e1e5a13169c6f34c15c9239ed6527a1ad2f4b0d898bd8e503ecfbe3ae6abd18684b679594b075b1bdc44b9c4d8845489d010cc7ff8d60262dc210be76d5a2ed192e04859e30a41d0acb4dc488d4456b16fd06a7591ee15ee862ed9c577a2d2e9ecad9d5c836b69440a484ea556c644ff5bef8175c4f067d6601ae00dfa7e2d36d22626608e841e2f9731cc7616b6cd143add933d793efa8873766757407ec74714ef507e50e82464d8c3332dd699526ea11283165f35c87828c2a7d7b8d515de78a281231138740c300bb7a289dc8ef1573a66166877efaae5bdd5b4e4bd23adc2d3071ba9a9792db486b15b2a3f29eb3e4284272829d24b742cc448aa6b60109fa087cc470d71a8d1fe760b3d5d0158c1176718f4f35826461b5491c5609521d1a6320f6693a7fa60dc37bd99705f00e16bea46b063d73abae6975de91d3d49f57cd50eb9329779fda176e75ee74bb5f4c8bab2a25a1c630019d453b1a5c556552e34283b98c9ab295356304bbe4cb97c0de7281828944f06653fecdbdabb21d7e82cec5501cc3239c20e31e258846d09286195969a71bfe0605e172de10aa4dac9c27fdaba4b1128b6080b39520d04fc12da43a0c49ba22b2b221cee21f1ba2bb417935b9bf1b9e7cf297d4692a91ed633adc46549d06c93959d621cd2c6f9d17b32d124b16042ad079ce27a10de7fee524bb80bd904ed8d24bc015f952299ae5e61714de645573f20763fe08ecad1ced315300a39a4e0f1efe216964347a20792390a31f0d9029019346b68b40fcaa35bea6a82eaa21f6075bab80890cf8d400e4b7f5042b2526b58083a94131758adde0cc658ac8b091c18378d81a4ffc56ca5a040c2df74763b7f3847b5ee69d89291710fed33a0a28378381691d6e51fe4aed0ec5e293731a15141d8bc8a8bfe069c5e248c849a340a7f348814b3f3d8cef33174c6b89c1d01789b825e672033474ef380b9688172e282f70186c1b704b40efba1a588fa684a812d891e83398690c0aa2a2a533c77db44c4678537d77612a1a56421fb7e69898605c51c1170112e2b541d275db11a1ce3af90775c95f0729ea791e23e3259b4ebb81aa876e90755b956f22a78e2e7fe8e6acc275aac7c9c251c0cd4d8057061c8c88c9a03493f5c28e80e91a57b11b77cffcd2d4b89b145cf8ca15752a5a2648388a92cbe2083823825101220815a6a9ce5cdcf15e9dcfccd18010213b228c46c01a72f2cc62a58447b40a5a65b5465a2bd6af3e2fe5427322296874fd6e7aded1210c28c72a505a23c6b11ca1e63e79910c5a86ec8c4258463d61868e758ece0b8d392903455e52821c2eb33a1b26728c6e1dcc0d0751f3ff1fc1585792b159e4f164c7c3724ffe547f24e920917758ae503a1a2535c3c939df55aa2412435cd56a7993ee0f79b0b85e86e9458f331c5a919c48f5efdb7548e2aea6c09a67334fefebde102bcf2e17ab8b8e063201de840dc91f3bc70c9ad166a29e544499fea3229253f44f09af95771001e68aef4456031c031288b46a6dea0310dea586951af28aece5ba70667070256128b219a4417746d550e52a09d125f1220de0fbf14c6b72c31da6bc48662c2089ca193d50feda734239abfbf028f9541c1e392fb516895ec43701401034184dcadf9c972366cbd9f00298dfcd03255103a96f3d769493551082ce5e4ee190b4f1c4fe0fccda07c54cbf0cf4e2fb57191358ddcf09a39e3599db2401e43074cee9cc312db3060c50b65e12bd1558d2fc0459241139cc951d92b4bcf9119c4dd0676bec2f720ba6c7f4dcc586c425250c2149e82528ab2139a4fcb67f09b7e8406a3dda7bf89e28117f486c9381ba640d133190bef62c236a2b212049dc569ecea9a7c18ff600eee857eb637173984c962678c660028035d119349992bfc2fdcad5e6adff068b85230d87875a69220db701b7c70fc9aee8b0454168747c3aee4722c993f62a44a5f81088262c9d1f5d0b88547a43769a5d92c535743d1f9a893b5e85fa649d23edc7227ffe4cc379615cc57fbc041676f8809fe88fe7a69bd86692da91489e80c866a1cafc99eb6724fac5db86ee9f4a6868b58fa9fb09307c63d6267e4586caeddd6bd9fbea9dbf464c4ca7a50f8c83855fef853430b15af87019510c2925464fabe8cbb823a9e9462e30343c44f02247ed064170b59612ab0f9f5b3401b923158fb79a4e72f4cf0f330187fcdc4f099d5f76ca67aa5748140511f0642c4f0c9a8f3457b65bbc7c7c95758cce948fe25f450c4f7ed8b5ad4b130c44445b805a755951d72ef8987879c33222d033231dbe57b9442a723b055cbe8706eaad13b8ae4ea8f2cac5035d5f8d962e4bee97b6b0d4f1dc704ca6a5429b02f68b889e36e78ad57db0679e17e0f9ecce49d6a75f1eaf3de7fd9e0d9cfe2422d1b54eeedd9a323b02218749df3ef5de03c1620f8ff141540ad18640b7a063e06dea00c4fe7b9677e6b78ee8ac0e39eb4cd04aa4c75b115c1bc899bca4cd76b7d2de5a78492045bd8ae4e7f449c2ef464eef27c5a121c11f216ea539f5ab73b253ea70bd38256c2b285bff62d54b1f22e025242f32422ffb8bac209a6fe2b8de523d6e68db5809168453a88bf5c70a63a52db8f95464a7068ec6919c32a2688f48d9b5b091a9cd41e445905362154f8ac50d9543c906757be7968c973a6da85a184740b0a0d598e5295948d1547c303145aa33cd8e0235083e5165bcccfe4faaf55d2902054fcac2580dc58183d5dc80bbd21f7b1cea5d01cded894c0c35f57539713e221c7d37e34ce468a78f0785c41bbd711cf497824868450e1dfaff98a4af9e70b5ad08e446a58f63e1b4e3f510d0ca5a4c9fcf6b0c1a370e641c2a1c8986ad63ac7cc72c8d8114baeb5f1b94af02ca1b7b2289af8bebfb5756fd48186143f0f3ba73908e38995b26c68255086d3b4cc4ddbeefbc0e51c075ac57fb1a4f2d7bc31580f9e3dccc23b9061871ed07a1f3436b775fc826c291cb6fc22a2cb1be8daa52903dc689183f7a4a4148052970498874bf237449d2260688e2f839a4c2e323077cc75d56c2ac0a340d0f49921acf0ea905695dcb44fbac700badf74529ca295dc0f3f18e7688291b3edbe5645213de3dc17263b542b2e807e0acd6a2dc40b5ee2844304f4e9ac71d814c58481999a58a47575de4976d986eac463e0188901a44d4f1769c5983839084fa53c0651c831e8f2871894536ea45081a459e0d92122522e38bcd70453c48bab79fe7137e95e24b6d0c7ba7edf1e2c80f497ee369839eec850574d0aa87ec1c24088d5f7ee6a939fdd94073e6b4bd6b3292ae3c4580fb47ef433c5c6db538d460515b6de41577f5c0690e2027c1f246ae4357a27b7e3f8f0e7b0db4ea3f7c286e9c14849ff13b9273314f494b71b02f9367ed3d72bbec0cbf6d5ec404a554dd323246272e16426db9ae9095c750f6b7a52faec1bd3230190e13575730919837b62640dc27e520cf31eed00080c8d1f4df44c44a84929f0ff94a28d2ad646c642170e617572c6b638e18e9dea2955861ca29dbdc224b6078f60fb393da320d5af75d3764c667fcf8f23c2cb56ff699e751e532e77c5c9a70ddc9ef49f7de620a9e42476bb1b8b47071a128ca442d2a46c258114305d0dd5c9a05dcdbb025df615613ee130af9f615a7741dc6d48a571f982c35b4b2ff45300c2288c91fee834538fcc6331a7d0d8fe0eb48d1ff8910521f3635ef664e72b00ace4d4ae5e7384eb7b84b6ff2fc5a57a2e3a8d196b28c0236520cc84c621a15f4018c8521c4d56a45b30d0836df17ece905a52143155fd872806328da1944f6440273583c0f43cdb1d83a6666dcc73b4842de0916adae873a76a86e2695d3910ffcb16ab58b2b88a98fc35743e479ffee2275c025888bd05a6ab61defdc2e6f68268417a14a4d885340cd198b0cec13e8e869e53301583b7912f5b5c06fea5f3a4cf9e533140a8485b17140c1174301753133da51a86539fe46a1724edd05ce3948385e9b80ecf6eb8e52245958b069161197d5c2a5c6596e3498e55cecc723a9f306ff1d14bbe0c41e1a399d2545ba01548880bfe18309671502671e66c62f1a33c5ab067f650fc9c405c6346636ed89133e03dad7e96330185557e8bce471a871f5ef088ee84b4786157069e284dcbc7a56f6ed4da959737ca4c6e998f11c1212c8ee8b16f5ddfad1170704994a19e64c73def64ae671d3424956814f0192afb7793bb941d867b4bdf4d3f56291b7c29366dfa72d37cd506b4bfff0a984423860ffc87909591ca7fa710def943d891a824170b9802e1b8b4b20f0e658595f8f5f77880e2000923e9a3813b200e0e0d65f5e02fd3ff56adaa0e6e8ca19c7667f2fa546cc6249da1e44fd8a3eeb00682158135abd98c44427112dffc027c8612800b32d95a2f8fa9fa6f072ac7e23b8d270f6533f5e816c0cf0968e77856c4888af9e09634ca0f64fb1d599b63fc4cd9787c62f6863579d642815094dbf24ad9404cdbc339d7cadf6b36988af343def6e9e4f4a00377bdf8228f44d1f00e573fd7eaefe17c12b051a42826d0f5706283b2a93e087567e44a85937a7950c41b02fdddb9954b5c7dedcc48853183f3c7d6ef8a5586e574e2d6791b0d55f420acd2572e0ea96e7a4f7c17529730458665b793a90f6d3d49d0d5b951813ab9a2c359f3c43d7cc3ec1d3157e15825fc26ad6edac6aa499b881637734eba8ce23dc27eed681da6d0c787f89ddfa72b3220228142388eceeff2b7eac9d586dae3b245518bb4b37a14a9e536942718bf29194900ffb3dce973bbebb018c86429840d84556a73504de138500c18414b9f0b1e90bef422f5d11924f846af1b9e89906b1ec10361d68d8b4d6676bb22558ddebc2c87e453ea08967d0d0b5eab812c0d33376bb28ce6780fd1b55bc437efe9019aa22056cfc6ca70021e7b160c344409b2c990aad06850d839098d9e6c759609d90e051dbd895cb1160ffcdb8261925a45088b7a8d6c22580f974573b0c984ab505c697fd8070fa78b536ea65410b9138db98f701d90f6874458e5f97e476194b0680e49a4724f305f013bc1908ba7d7302ed01c3effe395bcb706d2189dfd6ed00fbd2de0dda679032b63bc786b2bcecf12040cb1027c8ff6311b8c5f33025a80b2d9659e032bf2465546aeac3f2fa93ca38093b1b2113b5e1afbc40f0367311cbaafd93847d24d0a00fb431cb854b0a6a7a66e94a6e25b8bfd9eedbac48e2b2e09ef6a94ca33d42b5392953e5d635e2bd952c3d2bfef7757ba011df15f7380cb31b318223b6449006595e23204cb6dd3b16935d272d564df49b2fc4f8ee54596fd06727565ee1570593aa3f9454329d6962e44627fe549bccd296150131d17b7406bff15480ad41acc0d61e9d27b94844c34567a6841a4c7077b9279cc6547591a9b8a3d39a0d69d5872daf280d59fecf9e940d9c7d12e32ec52051046a66e74436b57726fff955e839850024f77c8d193862ca460b74c7688651b873962d00ad3a50d45ce53cdba5f9cabce181de0bb44f574d4a7a99e6ab0771aea3242981f4368d15c131526c9603969a3bb2a777aebe2b05bcde535860fca20835b30079ead7b09d3bf66674fc730f978a40a5461345af20fdb9efb0439302402f16ff7dff49eb69f18e84ea2061fc6b58877a8165a6922a8f6750eee686c618f41facb9a36ac517c84be2f82b36425f80f1a26ffd77d24c109739b63457cd3de2ce89096e04e7e2304e7a3427c5ec841eabf419fdafd22622ae49c832d83a40f27ae7db0485dd6599f6f5c9fcf934fe0871345926f8b614c0cfc6c5e678a2293fb03cfe7416100c81aa56e3a11c9acd5bee81119a3416736f73210e9498031a8db72405f0026c2a09ba4d9e49c9aa8d973aaacd2f4aa0d0b77088d06090a74cef71634f1554269d3157bfda94ff6cfab437e676a2e17576a04e66bf1590cb02a5f0e7f963d7625df4d2a8a7c5a28f5aac40824764c174c5da3205e68d36be0c0afc2b628184f50ffc142952ee56bed54216b16ade1c69d2664d971dc091b993e5ec56beaf17cf0fdb7efb9eb233f8e1e39f1f2a6798400140296ec3c1b4b53b93fa6848c32e9534b0c2d72f91b900679e969d56f396bbbeb2e11d0e7a7217c9b83a86e26d021930ea49d9df907da84380f51cd61801331a55f94fa725f4f906b033865e63674691dec255f8e6ea42bcdc8332c86ce6d5f4c2c2d96e7f8e8e9d2b2335368eb2905e8d4f023b6811321b45905f2339951ed7c2eecd306822e155bd8db9636a8d90af5d82658b2411dbe762a058a767b9b0d21e3ba62761cdb9847e903c7bfc215129a5acffcd5b190f1bae8c245ffbf7318ed3b32fabee93d84055fd59f5d9b604b04339a5eebbb30f308c3a4f2d6653f60a5479a13b2a2f7484381a7bf2848355714c78a370bcbb4c0fc01b622363a66238227b03d0dc408140bb8b6f44149e7527311ae500207dc7b23097adb6d03cc5ee5c7f708140d504bc51438da64cc673731af23470ae7cfc3dbc41a24ccdfcaa43df668a7a1ed68d82b2c48cf68f354ede69978b15895e42dc68d0270e5c20facde2d3104dacbcc051222ffa6b82ec4f29bc299552f2ce322c99ddc788e081880cf94cdab68f0203a5457d5062b0e9112b0cc25b82549f2ab0ff261678005291ebf608b93e83d251fb9e7631074c97b4557f53ca5b1f8d4298cba41cec8099827a6dd5c8f9f1181d90b8e69bd520b462ae6ebfa73e712d4dac070d8211d0be05d6e84ee3e5ab7ada98537a9afd701151e94153134d5f7e76b45431c63a72bfddc84e0c289c2ad1951c400689195cc3a338a4ce901608c0cd8526a5c2973172d715083e896c52df0f6c7419dd4cfff461d6f2cb8d6df9f7423697377df78f84a1ef35c1a01952bac3c1686b36c6041adb74fef5c9ee474d1748ac4d3821eeb33935e3fe3b98a65b42b96561effe8f6e7a7ed8cdd74bdf02faf30a414ebf3c4501a9bf2e375750735ab797e6ca9ce550fcd53eeec930e7c9ded4620c07aeceefd85fce80881677685bceb688bf49bcc61515e6533c8ac534cc616a8734d3f6b572ac1417c0fa0a62fc311592bb143c41f0673ccc6c64a79cc686974e5102bf425212676e85c35e40bec86802ed186fe77b5eeb37a2ab1b87eff8d0e9d7a9d8195006bac7786ba1ec7773f6a90f456f8108499d1d3c0dcf36946314ddec2efde3c248e484fda99cf4b3fa87e87c4493291da8743df52c924c894523b3475855b8b220ac1d1ff3c27e3cec4226f60aa313ae436527c75fad2a1e7dd6f04a121b7c2c681f7c9f70ed7cf19aa413a4e6f02f1f19d9cf972942db5f9aecd56d13f7a6db6648fb35e4f45c6d3c648dfbda35ad6c09ed4db19db578922cfdd08c4126a2ceaac3898546d8b1871182a657f7a42ee86dfb19957b82893e5d14b0946b9d5692ed314e3d53f53f88aa49c793ecd721f0e364b445b88b63ec69af54388e5e56c39a01790c2b39349e0e2fe95d039429db0b0ef5bbe7b11643b61ef887567f5c9caf6d5a5388470900bfb68495016e0ed65c6a0e98a0968a0d65fb95d9d02494db6858eeb7b531464ee5bb8da05624bdc043d00b0dc9bd95f76a2ee68a58d15958ed8a85df73585d96670afd4b7ee23797887b435c736421ea8d6811bfe78bc64ed032fee46fed7c552fb48639a1e1e8eb5dc32e82530911f33d14fd0994b413423443c2d94d7ff13ea78f6f499c01cd6bdbd860090a2bd11334c5e7ce9f8ab35fa560a81256824ef38766796aae0f95c48df135b6fc3572c11faa029546389d5349752304b0c08790764433c24c4e3823d9008dd6468889fa406f01828e81bb4aa6bceb7fc8505b5f7c7520ffc91b08985618fdd816387c431014c950e4448d0de443cd4831502cf2656173bbbb667bc14a037cfd05a88ebd9f31e678e38dda0cdf3838099cd462a9fd17af6be9277c6872f047d07efef66b2ea879b3c989548e0a63e0f7faf3959a39a8ad910b755d2fabb8627a743310a720bf32e37ea4d1d0c8b8609ea7c0fd8e79ed084de7926ce0de3480374de83686439284fd513b84cec232a81754a8f8ea8c1a2f825147213978e5ff3c5ab9fbb725f499c455240900593634c3e421581d2e386738de9d2fdbee9451400feccea51f04275ec6a59a59d73b9336ce8fc61e1c5465dae2e339637ffb6a91641260427b98cde0792e819de2917d9d158904fb3f1769e1858813b2037f5a0cea192deb455ecad19dd65d3e3e6b4f877f1d91fe807aa07b8cb71662bf9bb24f65c6faadacd802f6464549973983637a14fed8a74715e60d9dc3d4d67c778cabf50f0327a2a4bf9e9ae2e5fec6810fead6e9ef4c967352aaf69c76cfaa182177cb89b42549d4d6400a3ad0a89abc51b43f5165e88ce0a04cc62be224d3a408390f14ee3cd0019969c74f30b298b15e146ee81f08477d67d027d6f92802a564297ae6b6484d5d08797776a0aa816927681b2e392b45780f3a5375dec6c493523199081752a54fc973868b8f953d39c6294ee3791ad1d8508fd8b1e31fbd5c32089b9f9561a5602f51ce108c12e5688b4787ab62f094af760bcff2372ee856011eb0651a89ecda4d45c4be221b9bde38d7b49700027bce48c460cb398101b0f47d7139e868cf4243d377b8b4518e62a04d9b7548f9f0f938ada9793687ad7cb66d896b68c0907e128623525a8bd68e7059a136f8d2ec7122e65de0d1ad11ed93ae8f76fc70a351237ebcd3d4df3e055d4bb4c4b52d3db5c891540bbabf8e695ef4eb0e113f10fe2b276d32a6cddf16c70fbedcc860e66010d10faf5c5309eaa92c1643c9e21cdf8aeb750566c2b106b382535e9b4f7236ca06ca20eb1c0c415da7df7ca7c6e2346308fe0573002cade0e7b49faa157d9c271ac76816434d32ba6686e516d1366d11e88f03fab9a8210fe11275080fadb8f30dd44149b1663af3d2931fed191b00bec84c4e0ed4d2cf082f075bac830115e9e8c17f7f88260766fb37b839729be6a277fc3203ca8672543dea7484dcf06f8287bdaf5d7a1aa87eb8e1ebe140eadd8df2e2911cd10186213d3acc5c1692a352323037d2889c882d814b010162e095cdc069661a20a5a297229f715749c60b82c9ddd94d381a281a2a2a1621cc083e829ff2798d9ebcb23d99fe197e59be675f369582130bd7a878202100ac20e6d0a7076e80102d42cddac635f3924d03da009091f96bb27fd0dd19b675731a690f6b9a275228d145cba9bffc3bac6674635e0d9b016b8b062dec647dbc0a8340785b720ad03a435e6b0e25b8d445ff0c8ff5d815d5c7ff7de261ac8bbda01e0d83a837f02e8bb25bca6b7c6bd061d20c208b448474c4addc1983312fafe5c32d10b6696acf51bad3a0c3acfc78b289f5268e5668f35b8b6fb9459b951d2343b3b67276cfa3e2b1baa5304b51713162044deb617be95bbad2fb54465e1857f227efa74f4bd529635c2f590ebe0deb10528870d1267dfcaca2477adeff0b734fc2a139383cfe3ab7e94ab04e54036d11f1c532e09888d73f29c1c46ab20c319823614024d377544cebc075d737540beecfc30f77ead54a5e7c9c833f651934eb24aa9037661418f9c074e5bb803f105c5577dc5db00b22023a57334bba66535dac6016529018ae030b2bd9a72ab5d37982dc6e79653a4b3b82b20a08155c268f307c4a7b0b9e91cdd26d61d242f0a02ae68a953c71d0ae662f1301eda8b05873782b1b6ba8ede59160d2b38cdc74639187449f4ebfd936ca32b11b693b4cdcb0358f29b891c206a52e94f3f18d749dd7c555f4c084c1bb888aaae6e15d7428395b91bb9825f45310a0408a43807e5a040187f1c92954464c6118aa557148c2086f2c23f822172ec8ab852821ff726cd3316db3bf25326d547666ba151fd09e147b15311bd49111233ecc0966a4165db0c46d841f61f40438af241daa80905f42fa7b044d1188e62bb81250445a41e4d880e1f8b077c3537a054ded8f5b09671c1eb88c9ba61fa6df4fe24e63c80e5cb33cc08e923163f66bc7c45ae200636e19e8aec4e1645bfd5b8a7910f2b5610c35896e65b822f93eb79161868077fc2fd3cafbf1415682243e2f8ea905dec1d53e31a300128a1a467768345049c6b0d474d460a2e1ac1474000a9cb2327b3259266f8bb508d5dfee44feb1b285c0858f8bffb703e35d2d2a75f5ad20cffbc952b93c9e8d77ac4ad742215e5263c83a3df0050cd379743a8db93f1c6335e1dc63241e7e7faf1e3b1f10f3a611d43b9958511e29997265565a2b5ebba6a118e71f059978ab4685fe3ee8bd941e5e2b0f65c6764cc2915eba4fbaefab9bec7172414e29673d7293d41e8f94293a90de0a7bb7f0142c4b34cdf7f69b50ef175f65bb0527b356e46daaf18b4239a70d7bb572b3fe60a815ec888a6593a12550f3a8da6c5a6b9504381b220c40e051bdfda7ccca63fd3dc126141315cbb23e5b3990687812dc76e8a682e4ab8600c453e2b4596f0decd92f97ec24ea0a2473eb2e3d29e6e62c734a278682f54c7188cd4d2a4087ddb8c9f1c88677f0dcf5dfd9f1114ab440dab4dbd02a561f511f94324c64206a55ea83ab6e20b05ce66eaae89aa89c2dba92aa1252b2489f022820a948bca04313cbd3b2066b56e3b74991d02a6667620d04fb0a2e8cc3053fb45278d7b155d6d25272ca1e1c048b896391a556a5beb0872ace2ded7ea110acd2415fb372e58a132149c35b472d1af3585f94db518ee8a4211a3dabc3c9d1ebb628ed89165385414d1592219ee00459c83832439425d5c56c67ef744a9e76b96d02fbca4307ecf6dae1f96324d2ab17f4ad9f72bd4289ec623a70073a612b9f1980aa59508ed08bbef9b07a24a744888e47c2c91b89a35f9bc41515a65869eaa9834e7bd02ae173008586d5cb03a29b8687263810af2da3f22a865b729ce42bd8d4eb4a58c0b0f9a3704cded78010898dc3ebb98ae2e9368a4773449b8c4ecd0683b3eb0c841e695aba70019965b8a46dfeba64f401720c1c28b93d032c882ab46d19536c40719f8c2c9966476a46e7e0e081d4ae8a5fbc0c6b088d35c320a6e2a3d5d0b52aa5935c2e77793b4b4326c73609ffc2de7ac9965efbf7321fcd56cd7da12e3af2a3bfe98d1ce7588caa96cd4265c1c9e5a547f94802a24f6f6277b906a364c529ca11d9b4e2e5916f87e6be721750e638a23bf6b0980528ccfa2cf0b0612a59ec3385f6f464d103d91ac8b516531e8eafb262d8946bd58a79af6f36d7d2c62bea11db905fa2470c5e5b0a30661c73d629761b7d2dabb1515c61d00ede0cdfa1efc3ff0ae1976ee23efdacc0f4bebdfea2e6214840a7d90fbd6fc5eacb474f2eb71180a2b3d9c5c8405c62b57c6778ee7497e74cfc514afe82c6a8037123a6cf9ef885c5f6241aceb646a69f3b8685b418228f2382fb580a67f0685ca1179decb1afdf8839f77b56165b385e40c24033312c914a27b365e8eb5299ee86b29262ba154bb51f61cafb06a77fdf6f67d44b9df3d63ef1c16a90598881ec5780de659768df2575b6cf499394e349a7ab6c89c23f91fca7174042f489969436fc7a6a486dcad7d010b2b6926d66798842dbb12ff74985593d04060f65aaa847b3fde62a893651c52bf532bd42bc4bc8586b1f6f57373db4973ec92ac7593612768784eaede420f1d7a10e038352e950f727fbc34df22b3318b69a36ff77b7dff2bfa4bce0f0f8cb70d9bb226acd103ee1ed40607c5f1c2ac2626736347f3e19f2c6f88dcae325b998189b6a3034fdffdeb92fc94c30a41cfe0913b9b4cd223aed55121661887b6f81f75fa03ef6d662e031e7de5952b9bec1d5b54a612cbcc9d30d9ea01878f1a0a1b88d7bccb3416f400b1e16c4f8dd356813664ae0c14a454c6c41697a4349810ba89e0c4f1c16e20b15b229cc5ffced28256471299d43740471be8007801a518969de0156ef0a4b02349bb5428e4d15c8d75c37fca3b37ec636977a52e1b6a9071c9ec611895b748e203b8d04aee3f02e4c8e25e49af60565968d2fef5206b291b46d096ee8b87a7de26410d6c8ef15ab142712246ed47bd0dd16e88944a23aa480b26b6d84c43b5a58e2628b37a8406c24a4928d2528c843edb7f70f306104f36b512bca1f57d56f7416ffb642f80a7e73db0f19c38a9e52d7c349f5012f024b88dd29e1d739d3fcc5fdb85339dc5bc24cbc9f84646ed6e86b8a2b97e7d84ff085ee6ff60e15b5d85f44930fe43f2f9f3f483089ac7d89f8494072962d5f71851ab019bd678eaa1f3760af050c268e510fd152cf9d8168fb0bf9415f84362932f6aa7066eced27535c6aac149c35f1e6a920c6111e64a3ad854ed9f5401190bd9ef29ab6975139e7aa10cdd9d76c9af9bb5077620ba8d1a1a7470c0996f596ac6164004619445e9869b77b485c32188a918cae47177295a717e80ff0c2229713211352d163c08f23014b2a078b149ec3573c05011745dcbbede69ea7af389ee7c6a44763828ac3fafcc8ee2f3862516c0009d33a093881a2ad4698f4c78d6d2230764161e53091fa57cc78ade606802c2417c4befe9821b03e5ae55da657c13f463f200314346ad8f09b3376a821be1f42d6980f3c77d8127d31580c428257c3692a7a20bf0f7b51efdaf0617bd4e260646f7dcd78e4f3610b4110fb529350ac6b807184414029985a95ffc52a78e6014554da8324d0c9e1bad8678a4473ec734eb0e83cc85ab25470084cb46756b0ec3b20bf0920024f8def5cb81b402c17407678215c8cc65de042599bc4f7a428aba6e848f03f29493a81bd9a0000289418c4f61eed48414f2e590b84e9490e75bb139a3720de104fa50e979b7664be282bf97b98b4b450ae608b9beb1dc4084ccb2a45379fbe2a392bb1b2b8e27d24ad196116006a8990fc261835a96e33b4fc0f568ecf391da586e5843d15de7d2a8c46fa5d775ecd179619e68a119aa8ef899b7d4862a30ecee2833921b47a7dbc4d82ac9f5537ebabe4fd97f827aa4a719b9c1eb081bbda1dd2615670651ddcddf805624e9ad21af152a7fac0cf7ca8770ea9be7edc83b2685581bbf42762b82169dad32c25b22f876ed036461acd23ad19a0e44d604fb3dd4c3f9071a219af9d03e7476ac473f89efbf3c6881ac65bfde430d251dae088ce2794932c7512cdc6072a45c0f88be8d65e4f03fd1068aec290b05effa38e12cc23a56322f55e901192851b1f43dd4b1f25498fa80bc121896908082be096145c495027c8d65ab79b920dfb06a50175a6066c660a25460d18f96b4d4e506ab8f83f5030654c1bc3aabf67f46424923aac1a60d19a86ed4ad432e380d21af2aa120223708910b307e92be48d1d150f15dabe3de78bebbc9c92169ee1f4459e77987e8270e4ad90935650c9e18a01eb5b6dee2416415f26cf5a62c3123c4af2589cc6d9ba23907d0265d771b6408c515452e71894ad906e9fc32f702c437374cba687c0aa4526326226e8b783b4f5fb735880a4802c23bcf0e1bf66f2557f12cf9e6edba500b6cf0833c855e8b669052d382b2ced3ce698b53a6476878d5fb5e868f27cbb6a509464da7023699d72c091f80d32ffa475cc6cc7791293d16f9201c57323ebf671d68ae4943cf79921caea7cade607d1a04cff152df2082de7694fd704e2612544f84a5aae3ba5ea43af36b25b6d60f0c9a671fa6d513e0be1a14b12be0488cd2a57dc2181916286dfe93fd641c752b9c9c4b65d10f39065ec3762af099bf1c5e7a27e05c8215a9c95695a1596636b39321fe68128d1635960d354df1f86bc8749287f0a61ac458af7bbdd3f4d03adeefb226dac4ccb0f400065fd8b74ee88715dd0686b89c686ee10f10a6bcb509e6a0f6c8285c23b6bcb166970cd6e707eb988360dd72607b9d15a45ec2a44dd03e28b0db1f1a207e028aa7fc80376920e3c49ca245a07fb1b33552038ed40090ae622a933c60916dfa51f1c7862630b76a29693944839d324c52ec074506ef8288c11211321a0e4614d39edd5dd7e82a568c5b79d59e85e3ad59832abef4e3e46974636ac7098ec49626041d1ee384f0d29a72a5e96e1b3fd8025a02339669ef0357decedf13400a3cd0af3f937aeab230c73a1f2fa409bc87a8caa6dea20259edea81877c350ef0f20661dff4ffc10c4c1379a6210fecdc7b45f1b456ea63720978a0a6062e44a97e66dd850c5a36815bffb083b8a77cbe572cc466f31ffbe6bbbdde8a6403bbf2d261b7802fc5405fdde21b19a3ea60a4b14383e068169653d2d09aabaacf192f259894cc2a797af6b928d8a3a626edf5578cb7f7cc5f6834816643ede862f2ff296794687768edbbc5870381df081f102e65a37f7480300815f06e8685b6fafc188634a88b0019ef572d351f82a655becfd0100da5c4b49f5df9b7d415c2cafc114255219585c8e462014e18342734396642fb6179ac5b0df4be49f2b5def1b502b354ceadbbc4190416c3161e5092787cc84eed4bd894822e74568d092cc9477d802aa206fdf6775263586ac80d553518100df07b6c57e1b241709da65afdcc7f99e7cc9c5ab4482e0123e2e1088ef9bb3b2973d29a16ba0adb70dc65a7de0dd0d735d3c656efacba83ef3006ed108370c499241ea3cdc00c2b93e63e5000767f7bc803a8c5c68068f02eccf16742e5f56b25025332a639e04d0a2048e18cbe146a7535ce9c9fdb48d8034e857be080737e1014a50309b5b85174736a2750c3ab5fe97e64d8009219c134d587df3d77181d6e0dac4d67c7d70dcb5262f9a0d702c002cdb8e698f91e4638d3424a81c625b6b39a5164d487d9758b2ca5075285942205ddf00b93e250d1cfc951b579eb591b3695c2ad7d74a0e80ece92d3db9e8954a393949b4356fb307d02af0f711622ab37b3a09329ad5fb9111fe84ba7cdae104d401a78134af9d5c0995c8182b0ee6692b1278d398259257eeba0758b487376f56fc3ed3b4b19491ccd45f3ca39e79414a0a69965a38b7e0f98ef5f656c69ce92bc800d7dab7b29971adba085c15f80f4eb801851365d601ab8faf2f2be33a2eb6b02d52a632797eceb01a863f335f217849c80964962e2f12cfd400222287a4ba98eb0e2ec919b19a3f4f668282131cadaa2a82f0bac1751a09fbbfb7e83dd940e932b0368e8421c7e4069a4759df359858d5fd5ce0107d331c06c1c3441cd0264073be21cd1f995dd8cf0c190d69f32746fe1a68398a88541ba1de2bc71ab3a2fad5fd3c28f4b4484068bb45f8c7be2f61d1671b9968b2fe03ef195fd219d891f89e51b1c785c3862d568bf19d5e46df0058326f01fe97fc736b639bb1b6a9053857ddab8d0608e7e20c2064452571846827e4a77d3586de17d89876b1976d5d328242967bd110a0b2342b453d64db85253ccca562a603e2ebab1cb781bbde441e1e3d3b23a19148486f94e9cfa786623d0a30c49baf8932d244287d31e125f69f500ae80439562062081bb16e02cffcc9d3c30f766146c22d9f4f106cf50b1297b3271b2a886b4e31e0da8f76d1baa3ce0bd4f1dcbcdc59a81039885398eb9d76e0e677a0021e7df3cd70adf57ca06cfd78b35fe2ccab1becf37c12b5d44ab2b751cc1d0560e7e0812960406529e340884da26d2f8d84ada410c34281c2186ac8a110b603ac42895edae01c3576910459a95b60d4c7b46113041eb3a3e68849eabf75c72ef384ca766a1610603f773368ad5cb19d2a0080c4297209268a24e77d9ae5022fa178036830b57474305f30a70ad854f7eed013743b2430bad7158640dcf8fe625f976b66bae118242ab70fe56cfdfc0513441a144f5fda125419881955bef5e96bf29e6a8e88883eb7c84bbe9c0d29691514afd93213d14aff18363a05c8e46fce73f47cedf174d276bcdf9e343bac213b4ca3738bc01b36054b1dbeed154c46f8580742e3a463d180fe79ac7c36bfbf9264ea7127bda6b319854c0bc6404decc40d7a8079b2fe4491b69dbe75c7a0048295272f18e8c035cbb5a780539f73f214dc07b8afccbb68e89c9648865aee048420bcd9256700a8c0ffa23afef661281caedf7f4244fad1e60618992801d200b222307c02b17116a41882aabc71959ab4178abb4900443dc0c133dfa43c43cee0664612df23d3a54929a780830e0af2c2efae20a097167ac12561c7a3c7a226bfb7d068bfd88c1109384ef83dbdf9fc4f4824f13a68f101f7fd9102a61702bd4ad99224e0c5c397bb5767e891044d76647769b77512e5e28c6c0770ce3eaef4e6ea9c2916d02caf82ff2a6398c327dbbd519ccc1403f75e721266c4ffa14a93d93b6bb064bf53c1f24bb51328f046f1ca3404229a12fbb0210dcb37b374608ede7ce272aa687e71a47991dce23f60e040e1a8e86bb596d40edebb9e7d3d930dcc37c6f5ecab19d82999a2b580ad072c282ee51e4258ec5aaa8b6911e4d1239bcce4ebdc65e56e70703c85749456ab61b02a276db749d907cb5cbf547b8b9df00d1c2f5fdbbd7d1883c1d79297bec550beffed378729c059d783242b118e1b00dbb2c31ca6d1a4e8286efb59b554829c1772b27b1e6335b42175486af92b97b3322460f8ff75d3979ab8ffdb8829bb5fe4a84c1d9f611c3faf4011ad6ed630750489a3cf17dee3643c422075bd8a304775f4486d88e62883f9f7fc740550a13f6fc4597d6de0d2faf040eade66649acb68bd1c24062a45c78821df8759f924fd428f22db95d0d475b6415953939848191ca3d928855a1d3444d9f0fcd4d3b0fe1265565108b7136c91debbc0b8c34fef8cad3bed899485380fc55991adb31f272be06f4556617a032f3a8eb4828b0e86989012ea3002b36c1562822ded8ced4a91eec6c8d1e80b21241e8f6de141b2c7419987e85d5cdeffe4171462ce827e10c84662283fd5e2872fb33d1d967f169d98ea7eb9a0b63199b692d412471e0f9dc0a30b3305ba6e94c5fc01357250ef2bb9427fcb719f6b4c5ab463996540b596504c8ede3899698b32c06f848ae17c7b82da88ba915527d29594767e08442fc25874f9c21296869498330619ffc1d948fc060513a162c46f4238f60ba343342edc608d92473b52569b6ba75e34038c926a92cc46cdef91db8b8bd9e35aaf9945664a9792dfef9bea69011392ebee119c8dede5f4736b83ddc24e8d0fac291bf9bc57a79812edb44f0ed70775be212de2aa2a966e2163296151a0ab5d2f052661ebe846239b8769cd7ed0727af63efb619debb0c5a86d4010dff2a61b11911768c132f7285686bc8dc961946774fe92c9e082cc04353b961592d891194d32ae29e08e6a1293665e85c0f2f719740f54df025d2ab46c346d5d98db846c9e1f262cecfcea2e5138831c42669d4e77a1eb09547045d2da81d4fe48c73b0a565a03e980c5c3477dd8f9f01120c25b611a5fb47f8e81303fc662d4a18c92c5054f64cade6038f82d5d5b4588428443d1264f3b3a9db1991653c2322e6199f241e5fbf1e9e3290c871d16535be3ad3f32ea5e0e4853a7b8abbb0d7718ebd2947503da0c7f3bb6193886cd4cda0c197070aa10bd2221ac68edbfd843c9182e47cb53a48181a4978037935bb7bd656988012de2f6a447f4f993c1c5dae449983dbb3775aa2eff174b5c3cf64fc4745329ed7a13725223ab85df23b136385b1dfb0c3dfb18a7c3e3c9bc73a2e64dd83c88d388fdbf674cfc315dc4a5517dd42d14230d624c759c20f72614eb403f754831c03bd13462698503de338cafff8fb7a0f6994935ef6f78cb16a3b159798cf6540970c9e14a1c110b5b2c4cd49a8b54a700d73a83f00d56f0a92cdd01ae4e6cacc520286a893c0d98e42c8c094eda002b4d5bae3d71200d4e2c1566857e4b031d52d9ab88a5a1abfc738460ac48b6a84a5ed6b8c6845ac47c04da1c03d7f3297c6603824fcaff6cd38d7ca2260438398800705232f211d0e63fdc8bdc08c04c442d7ca65e93044d7d19c4c495d96730cd263c82ad5810c49f7217cf707021b04450445fac44d73f5dabfa1936eba5963d32444e41b09591718834ea810d40460161939941782a004df83ab58537b8cc30a5d25263c6dd49288489874c3466bd3a63b3dacd8325a8feaf08380ff5b5fb91fc69d4e34c87b873479c32405c9e5add7384020ee33ca5d214db9d5d316b85f7f0de99d6dd59f16a83045c5d31ad7505fbc15784da7a946ec3203a46a90c214754d9478e70294756eb8be9d7f43aadaa00f494a0b7c09853796fbae6980e9904cc6b371ead79e09d22f54585150e2e4de9966ce0402a01869aae90a54f5409bac36b5f04e6aa8962d5680257883a5c3f2cb79d980c4c9f646a09c05f2df8160b2468e2ea2c7b1891c0fa11d612ec339615ddf5b1b0a5ff27f17c98051ee75ab19b5210d1deb02db70573f9c4fb21be813767e1538e22288e21dbe5355b92144b0669c260fca5e867ff31d14aaa2f15d9478068cba8a1fb934e82a0f0392ba702a0494977c681ffe0070ae317f9132f5a4d66818d9a60bbed3209fca10a882dc54a6c623c75e33bb7d2f5994a38e782f612c17482dd669c26cd2f3503a94095407e020e771e125796ec07be4c66927f1d4863d542cc9d7cff5f10c3b0e4e20144611a87e15bcaff67fac69ff6d173bf5a7e3da7fee73a0acc87d90927b61a5066f362ae1bc6f4b8ed1fd56111480d5dbb00a89b57edd6f0bf1f82e7996fa4d037e64494d9a170716fa199110050115d8b8ba4002680f6989aadef9c8e4b908b81f4b8f8d27a4647c208119e42873928e75e0828ef878a63accf42b966871281a4c2eacb01567aa8ba2b39e3130a2925514ee40a6dcf659b4e7dea79d4b3f1c73a3830e690424fcc2cbd1274262b569502a8f1db501361a959b8f687cd2587a3f79c072b7af7d70ff8a33e432143cb48e8b4c8cc4564c1822a4f77750f2cdacb0e16d6e32e4370b1a1638575373db44a98670a885cb9fc2279e40a86d89e505036bc950c8577f26bf831eb0854fab988de76d44c221d49101ed946e412a1ebbb166c0a02288bb9e8233d0b232acbfc3253198ee0a9096c4ddb8ec5217b060c7e4b559762815d4222c435e25e4e0d126080593af1229e3493db5112fb44d0352c4869c2524bfe5d2bb77d82b8c3a31e107027870f428c5ad09f88da16baaa6a46837a80313f9fd334d291710a30f5398340db6cf71b949400089b90ad892fa05dd601e6b6901553d341f37c8232982d3c5f1b0727e8c4a72a6d3b5960bc2e35a7c5576e05eae19345a68df29dcafe0747f36e4d6e7fc7ee73043df21da6bacf908fe72681f86e81b9a0bc7878bfcf3de804aac6b5e8959c87f327a46b513ef633d4a5070ca221151ef118019ce03e10767ee2fc385e75a830153adc0b29f685da8688b5244fd09ed6994ddc64be7cf9b9867b0aaa88b88797b2f064a510fb63e983008ff3913636fdeda18adf9be0c8aeb7182cb749b0ed59ae4bac29779f4350fa7c6065ce35fb950afdf334584c1c409bb8abd708f0ab2ee65e6792f182c43cf22fb0044cbe86dece4cc28348bda35cb96098cd135a9217772c11e04f538fffb253f77520d812e753b4d862f2001679e9bac034215dad532be0dab578ae1c29369fb246705b2765133f7d14d9ae82f5e62e45cbacacc22c00447f98b81a73e0802efb96ec31c10d988290a7651c7a912aaa4464ddf75c7e149622e2f61e11b216ffaeb2534ab674f9685880ea3f0b30acb420f31c9378302fc6e13b0912b5d92d6e1a5d46bf7eba01661c3406ff4fa9d631e73df184453c60a5f5d3f42e7b7bbf05ebdf84bf3fb9bba87d2eca34b0a8ed91524c9a44a7a59fd3da59529c23b405bb6bb91c41354740203c3ae0fbb7091090e913686ecb3e12214d9eaaac0a2e2e2a692dd8d1e9a2890d26534f5bfe4ab190c6a818bd7a514323249657b4a5f675c4bbf29cb437c1f34a4d4d008684bbb9f45830305362d05ecb2b3fa56a6b61a8649ae7df05ffab0ef9908cd53d54f33f8ef141880751af10888bb782550e162f9c892c7826b1709b5c8f82b59cddc6a0df89346345aadba4ebf291f61e20a62d326ff22f76de17b08f3a20c9cbe38f7d0d080efee4fc05074601e278db09c3a42273e44e6c458519f386fca2e24279823a40a183ffc12ab61cc91259f5bd7d9111e69d77282b0293e1aedca9e24f2a9dac227e52c49823f2a6874164ab489ef24b3a762e88f9ccf47a59b09737b71e4031092634b2a083f49feeb85d73f9251b6293988a12bec48cc7b912472f9b00628fd40b2f4e2a35ba4406e3958ec6999dbad17740aa918f03ffc922e2d780e4e22631e656672d8008d0d34d14ab5a7db2ca367844c8035f2b856a07e0ffd67ac0ca32e10afe74c6ee1903f511a581f0f9f94f13eb0a9b778ed47ab97362180bcbdcd882a87d30e164308cae82fcfb953e73e3748d9d4622a229e5d8f627790e021cd9d413760a77bf9372a5190410bfe7aebcf43f2c0aa1583359222e8d470e784290e25b75268deb5ceac9d098d46b399f5cfb1c0fdb421bac2d121ddea38a7988500d3dbdbec6f0805ac85b429f51125664d4333ae1f252cae9164438231016e6128e20beaee1e0b780819da8a410ee456526aa3422a3d8ec3c318adaad50882951ea48c5c9afced15a99a50024b8939a34cbe09a674a159dcc3f00157033e09a0a15f786a32fc63a0d3aed53677c2ed2532251a1778df5717a4b2a4a93e74c27379c798fec7d96e3a0194686def323dcdb695199af71bc8d26dfa00d8e16fd6e35d00fc4dde4f255a09a6f6eebd781756b34982d7a2454b1a81972550ab67a89fb7ba804540da22180ef4c13aa650ddea1ccf979df9277aadbbe8903840401e1bb86815a54837888bb847853450d80efa68373e2eaaccbd206c3c83d18c8489ae0748aa406671f4c8633670cf837332fa0fc7b1cb32bfa0298f2472708c2b1da1c83e419042c694e388435a5b6b4719c38da1d084fb2cf66198668fd28ded77b9162c6cef92788ad13f6e7233ca75b0b4ba41fe32750f7f05cd282b8e65cbbc51d5f196cb98cbe88db2ce75c11fe677e198f2132339ab844d1170634bb8fccc4e832c40e36804a78c4ac58cf05e5fd8fa14c85472e744bdfc6529a6c4c495c1e4762b06e72404ff38d0b960e6e1e211febf24994fca75fd5bd448d6a33fa318f1855345eb90f27f3e605ab166d7befbc63e6ceea157ae2e70afd078b5e903e7dcfb52182631d1b069ea255c8403b05f6ebfc0bd2315b5e2551fcab687e8c2c093214f12ee71e7c21ca040445b5e8e3e9556ba1b5ed5d49fff41aa844ce782cfe3ded80bae4abfc70cf2dcf012e9281d785d81802b7f7ce8a1f4f84e866839e96a1b002384c888029fb79fe463d1a4b3bf414b09f76f3fb4c573cf6d7e97d881bd40d791ce3b653ea807da0cae78947e854b2292db984c42bbd00216ce2270a935a6be8bd63d377e71e3c6eb1bd90f996108606c1bf8e07b5d051e0aecddbcfd2c419a5e6e06c2e8aff994aa8cf35d38f28d309c8ff59c2a375ef43570d10c899024ef55c0094bc4e0e7ecaef2b1f8ddb1d256b59806716ec66e95a5c45e3285a25536a0401f159337e12c75e7e542c90e08f6352b53564537ce80139d8f975dcdb3557acf60304e0978b1c49f61596b23f30609dbafe764928559cf914fe1df68bb1e27789bcbca64f2c19128f0897764929e1824aa5ec1dcd6baaab500f3e61bcc723a20f47b53990e9de7dda2d32654fa10cdee710cfcddb96df08e826cebb4f1b6d210ec05089dbcc033579b819b90e777d6efd57d7789860c459b5a95e7971815852fba5222b19c4dbdb326f17023d076c212b2285b0f6889534776c0c9b22bb01370d9378321c08ac082219b7258b3b59a907bce81d54d8c56c6cf67aa32142a3853ca51f4fb95de59031c5db7998e06e68f4bb08d4603009fa3f67209a80cb8ff17a9109fd1bb3cac7f8a10f5506332af402ccab34deda91d773e8a7c1bc0815eb25ce3a786b611787db51829b5eb8b243b037660cb6267fa72a7e0e2cffcb1ed61e4f37ee3129546651f0da97018322b694ccc7f3c48caac14d608badc58bcd5d50e30537c798d864411c69945770d4ca623a403fc455342ea2fd7913b406ce6151572a442dea91505917b6d8aa1477139ba26836876c189f30e7f7a8542e95f9692b723c8c5008f82fb672840cf6f15660d5eac6b652d511b988b75d22bc072c6b662e4e8def5059241d54f90ef114f63c28a4c34620fe1205ea90aff98921899aba0cfc397aa8ab59903720f33f903082cfde8529d5152428f7b0d158ecb5a88a14fb0f9348dc08fb3d5fb8cb68e77906828f59c114c35f32ea132af602f59b807a98a569b4489648ad9ab8d39432ed2c8dd23d179ed18a4ccd7606dfc49b66815bbb44d004cbb108083e9bfc257fa614b4b9bf174b0d66719e466d7db1fcd518ed24a07817175da13b95d61dba7bfe2ae8bc7eb9c676be04cc4323ee582fbaf959b2d3976d33321a8a0de119942c23f5ca882136564a12004596a453af46ff8db315e10d0c0d31f3c438cd61e792287f9a5d872b8d42c81a74c32512f21458bfb2fcc6431e0ab29ce6b96c8dd03d7a767c70484e063744231642803d0479adccc6cb1a8d247d338db605128a9650c0354f6dbe4294c08d61867d6f6d541b5e93e5cf3440df4232d434c94dfc4924dd05b013b06e932a0a5738e3c81c31835b3c7cefc84574efd7f44ccebbef905e946e69d02319b91f912fada3f46df24cce9eb63bda1761fb2ede049731c0f26f256929e9193dc82f3c409c544c5015374193af523694336c1952383d91416579e143786469aaccd060e0390130f9416d5d5e9fefcf35196936d28f82f189e347de54b596ab05e112000c85c4b28a1f005be0ca21a0fff7fcdb00a5aebf7af9d17fdae0d87dda8fbad2092da619a9fc4c1c13c9d5172e82b86608f8e8c8a0c264bc5b6ebac7372cb2082f7bea2c2d9f577bf96978997c25669ba84e578696c93e2e08ed62d3b14883f4e77dca15680dfa5447577a0aae987e5d95334c37fc432a1c196e0cd3e2ca135966c6cd150e2cbf014f6d5980a36a0163e0dd3d8157b155a5722e61066f211eb66d2b6d8ea3fb82c64f0e164c42ec40d945f517a114a8d8acc75d909154aca6b797ec1f7f9c7e8264a0f2cb194fdad5a1fd84a5bf7901a20b656337899af402d33978706593e09832c987892e09472138d46853c910a4e69f08bf0e11fd81c5a3c3271b099c85160168736e27c2612adaa368f8aff23c4487aa65627733042a7fd1c89afd2fb4967618908d7b3e07419ccacaae1765894917a59830a8b6c21a1a7551e0f2b5e29c0d2698ec3aaf3ceabd069573330e7e35d9992ec5578b2d8d0d7430f88dc25923fb0e4b20dbd0adfac0deb62305850fc32b991d107c4cd132c75459798e7803e0231b35193d3b9435b4307025b800b153473c09ba706b9dbc660f1abc42227b24374cd8ee497bb3cb667e68a35e1e130e636a8bd04f74ffc4899c4019af8738681269a4ef7e70f26b7e6c1c0d1b4a92c5b326575bc30bff580943c5ed8a9b249336344a6075995f8584da2a5e0056110ffa596bf1d48431b510160eef825eece201875b9b3e4bcd0fbd3faeda7fbb19dd06293bc8ead05d432c25a8bc1644beb7e8c1fa185f07f8f172b642bc7f3b35773c6422bc721c406d8aebb30b6cdab86f3fe46994b5b258c09eb2d6f441ad7946ee2fa43b20adce6b807031a97941b1f1b76977ea748dbbc0a6cfca7b3c2cd57a29ee8137a0f797120906d68af395b7dd4df0d6d4689f66ae9296b966d9ea1cee4d62227e600bc73629811619889367da81dddd2118effa81b2061a57b8f1539f3fa5134f9ecaf1653444c67200c332f64a124baa85727094de60831289783d998cb60d8aeeea253d705d1ff7cd7bf9f3d9b37db35887359e4079523eef70ad618220b1fb2be97002600d19a899b5921b488d1720717d9a4c2f1ff5b982296a6bff9cfb1248b846e5a38741afea0d9a1334b94c270b1265e8b3392a7c5cf5387014eb3d9a9439ef818180d3cb5cfa32a063851222879b54dad096144d10976f8f53749704f8fc615ad952049b950be11f06466217a2f3035e612dc4fd0333300bee1db01b2bbfb7fb08de55cc37a3c067413264ed61997784ac3844d67c5daec6d8ccbd98c62e5b29164e4ba751c02d62d2ee2b89095d73293e8843d58d2ff6423c909a00a56b9306ac6c58f5226c0607ecca7e736058f4800fa8fb1bcc58661867ca1ff5d897ff00239525eae547704520f0c112fc1c90deca5fd070d74ec22d6c5ef859082f82581a303cea8d3694486d8322193c3921ec4a57d601f260267fb9067e557adbc77526f4202dc5c2e2aad0f0926ecf7ca47ad36122a3713b3e0cb418a8d7f5c57cd62dc9463537ebf32bf9fb4377078a2c7e9b54f4000f42b67ecabcda6ba1b66579126a8e2387ca3878840edd0260363931ce5bcf63a105e4e7ca98969f4672a76a1cc9325c090142b429f8e9b170a1cf0ac1450c99551ed63b29a48953905a9ded680f8c6265c6034de7049bbdffd26137a50eb4e85fc16c5d1e6e07c0f97be7da6e18d2a6ff5475e66feb53e74dcea1fc575ddb8e49f614212ba425fd73a734fc36a669aa1fad223052f232a9f16e81aeb1d4753b658cd85e2e93cd008870cdee912cab174844a44ab98a9321e767b844ca20a2cfac6662660e267e4b1088262bacce3b37db66aaf7f94a0e12971d8eb3635b9f3c03a89a64ce49c903a03c3a1567dd71cb6be4c9b41c11fd9db93e422e303592027f56f6b2e86cb5b7fdd01d3b33cd36c3fccfc79fce947fb05afd25f867c367a04222b7f708023fcdfa6f01cc9a86c0f04e57ce4e23a7821589ba0fbf9f97ec2384a9e4f7f87a454459d4ad1b29dacff28fd7d29c3ed202fbc6799fb99077943220fee02f65f4ea62fc5612fdf51ffd0af367d6a881b14249f8c52df3a343383ffe74d885a6184e1e9f4d772b53a31d884c7d0e9df2f179ad28f5e766b1f010b201dad16399849db7ee080085a492691f8b34fc314a77aa394046f62aabb26e0dbb1147c641b7ff38f0bff47c47ac5ef2847b314ea1cd28107ab046c14a6a6f8172e1ddd3e4e30dd30506d52a4af0a1cf059eab9606739a17794975a3c97d83cdd77508693c485adb8aef239c1a56b26cb6db8caac6f7f37b2d2e3388c8651f6c6c73e8feb1963ec5f116752c90590276c1d0d4479524075796900fa176a633a2b8dbefa1ce2ddd72f6e78b0183fa0832ef631f48e8b8f5e435900fb7fb8f514739998006429df444ed609c2efc576770217be0c3ee1d5a4ef5fa9260f18b5437a58d772fc1f0e673cc5441c4289f26bd4debee1147b4901946bc9e8717e62f2b2333b3c2a5a7270c3688994ec09579a7013b8b1804a442e9ae7b0ed45516fadee5187f8da19636ea731f9c7478b640df28e5b70ffe1aba3d9da4496671c9a3725a5e4c05cb65f36e0869dcf54186555517ed0b8114d8e7c07d092d0038b0af3a3934b5038a685fb05510402939e955bd76b5ae70b2b3f509f747989f603fd14e0e67174a7eba8f6e36bac9e866e3bff7c7eaa71cad5b061e728b14dbdbfd44e2f60e2e318ae082ce19ba73023d72aa73044432a4d608516b8410b2f79632e20ae30a9a0a4b62a408d1209d628ea385e5532c38c6aa4d272ba6e5b36a33c64242424242eac64ba19026174996a5c45a624d41e3d032281d49d3f0bc7ed7631269a5abfbad989a9309ead8f9ee1f072e0162554af2d5c900c936aa947ac28857a5e45229d12b6420aaeea6c4cc502c9fe2e158187587d7b85c2e97cb1546cd18abc6aa856114ab1646cdd0037b59350f2c85fae118cbe34004c135e425b0aca8cdd80e0e92af4e414f224091105563815195dc76a23752f1c776631229ad4a898564e5bd6621495816263ad3c3245e9717d765b9d14e31c4ab5232e286cd1526b8a28857eca61079091d88cb8788c37268198a5bc0319552d4a15c4cb4fdf51ab866208aa1f4022bed8e6df4a94a6e65ccfb35a18e57f188ed237eb76d18e2cf136abb3b69d94ea5f4c27c373e69bbfdc8e49a6c53a52461ec8589d84818334f3ae5326353b22c266aaa64b7589ab5d21d5139d6d138484e1a22e9aa708cbbec8ab0f2dcc832a8479fda59912f493b122fc8443b4304996e4b31c9e93420ce71c78cf2fc05b23ce7afcfed2c73d0e4d7dcb8046621f37c4ac476d844ecfc5421c92d6d24c98df91888137d2ce57f2d276de176851e5be772bd24d327392e8defab55e8aad93b64a7685bfe7b49185572db1d6cd9fe66c1cb7a87ec1c3241851868c0e18723a42d4b636a6ca0da0b0963d523319fecba05baf25a00922f9f3104b310efbbefa084ad93b98691ddaea42d272db8ea279ebecb70850cd8d55f12f6ad40ff8d57da151d81ee93279888df9e93f6c6d972cad91b8b7b576f06c62122f235c442f379c4fb03bd7a4af506a859d4052d67d42b2412c4de97fd40f07bbd8686ac386652f0892e4137369f9393f7c536d442547538d5ec4f1f6c7bb4f57abd5e9ee50701b2f7653dd0e5fab7253c5537cdb4b8a9574fadb2c820f9ea46026af3e29747bb7fb23deb75e3eadbb8117c200df2aa22f690af97cb054ecb483c58c87b136e74b25a200b3dd55e2f19241f44c67a0a7c35524fc9d718622b6481df8aa562791d8bdb286bb264339116d5b1e6db802886f0b10d35444e63e6c8ceefa04a6e79e011e7132b5881135e8fbec2cb3195c646bbb1097df7cd8dc8d6b39b9b1e29c41e5cd7b5ed7aec9eb088b7a5d43d754f4a3d2cb310bd5777687bbba71c33ca773f2bcfb4c8f69824e908d955911f6f4996cf762c9fbaa14f948986b14293f2e28a9ad29634ee40b919c38424add49172bac28b521b0121470623449ad22b2cdf8b12354a430e54d3982c485375d8382d793992465172ce342565b1a3c3130b415ede642866a16f09104bfb345432026d1bab078b8fa912dd92c61d2837639826d2b45247cae90a2f52491aa52107aa694c6769a4291c988d0a2fa0af9b016de6eeee89ee1d944cab6465657799efff580e5fd86c8f4eda3e71c25cd80e5fe86c8f1703962a99a11295a51b774fd67d62e9e994dc746339e9ac0c39b043245d88a49b33f442256d6792ed4e3acf74d279e61684fd49025a7ab6520948596846b5659a659ee3b61791648303529452ba75146906c53aafa3b419c49d688326c2e14497dce8a494524a299d1c06a43a29fe4629a594cadba07d9f9b9e944e96309e21199339ae0383638eb38145ea9bb3674a0a725ba7f2561fc802bf70ced90a9170a72c0639ee36a8702a109be3388ee34419ce194302ee39e59c66a6f783679fe61cc19427231f28f66c44868642568f0d2ace4967d786cea62914a90deda6ef39e99ce2d1846843e57c5f8b0b830b83bb25ed5e205eea799e07522446810a01e84ec11db1cc6a2527a51ca4839dbdd18dc324a0f5c41450a419e3b25061058e81463348b20a40a319f368a09195520a1854b3f08b11231f28f66c44868642568f0d1ae4f512c549f37a74402810412e0cf1321b76b2d7a3b990a8a048ec44916816a6483ea1682344b2dd0041271b5244cfa3ed20821e920d293e06ba4356b2ddcee38f4ee95009e8b6512a670f94522244ba31d19f7d296976ea36594e96f3b652b5ad040307cdc731e2c2cecf3b4c5888caa53c579046761b9b1027978438df89409cb349bb37b1189f8b2cad346f46cfd51864bd41d8fb845aee3f4b5ac972db1c6f107672dce8a465b7f10b65a336b23368caf9ac197376677d721ba536fc206134090b4fbf5556c541c2b6d3d148d8894345b36d8e3f3078978fc1bb1c8110330f84bc378a9e4a9c45b3f631225f2b900ec91711f9a2f7b18578598a9f6c90b01aa5f44ca89c544e7aafcaaa3242bc2c65c38cc9d31944dffd749d0d3824b51719ab4c3d3c597ac45354d2cd035aec35c152914ecd223a3b321c17664e4eb59281bfd38d0de5efbc422a895e920784ea57e438aee366084315dfc671dc6ac5711c37aec083231020f85300f0e143f04c7fdcaf0996db42249c52c771dd83a636679d773a998684cd918e912f7a0547572042414141c917126592b3e6846a63da98a2ea6c671aaabdb0dd92a93b69c628a5928985da1bc522448f858678555bc648d8a552504cb4bd3df178545b24ecdb104554b942bd402229a97b4a26262ad5df682cd467da681c120b3979e1c5c6b43149a5cf0c2a61f75be228c76daf292b4869be6449f3254b4dc304176ea31e1addb2e91a2bbb9b6a6b3abc22de2d694b9a4a9a76e0b0a2baa56e09ca8b6e4c988ea973eae4744ddd155050505050505050524343af175454b7c4715242cd98e789a2cbf5bfeed09c126ac6c44bcf0c134a332082e83c2e609a89b92d45b0b2f51b64e5d82d55db49a8b9a4c35ed9dd755d87c484b41476d8db4169c6136f3fe630f45ef65d3f56189ef52482dd12cfa452ab5bfa74e8584262eaa492845ae26a12d6b158acb358ac8ef52e44d2b1584bbab3ce12c61ab926f992507cc55218daaf5e1922e9e6b0eb464e42754b50dd52b7c48af2f98007ac2c1dd194c6206de13632eae6c237e2a546974d29fbd4a88d8c7afb82529ae4c54e9ddeb2499692627672720ad3484e9fa474a8945419dc78585cc2a9a5ec846218cf7e1cc731333377283e215eeab4596a027a02ce82a90a9892a12dd8b68d632929f9797143c9ca56cbffb45a524a59474a29e55bdcdd341a8d46a379b4a1a1d70b4a8ed18c716ba446f4b3237e69d068348fe6d13c1a929ef116d91e513c73ebd765c5f1f6b7b35aa7ad564f55bd916cf583922fa94475956afca2e40b8a3869494a9f54eb4cad35d2a68fc6443d975e78e618ebe0f7d50fdb57bda78a9559486b4758c17a45578fbb019484c991b1233193a325cd70db26474754d1260f86d58c1b3d9a944793776e28752d3c524a29b9ddcca98bb4eab01f07c54c12f6b364066d1165e7f8338b2c947c45214d0a45c7801e85a24c509e274e28cab4854aa06e06ac93cef6d8b2c11a3383dddd7d069190be304b1b1586d15a5bc1afbe4a9c502faed3102f558d630b6cff02591006ba2cf8ca300ac5af3e08de9bb179f067a2efe0489daa9c2386bfd4692e8961124a5577907c4520b881971594524af02a9554813f22655589508838e83f0f54854ac2835f5531f25f58291b70a44f3ed050bd0b91a8a47ca24e33e6cd566087f25fa77a6c35d22c14e9055050534af6b7a65634f3ab5b22752c2c0c3e6ddbb66ddbb66ddbc6b227c8ec46aeba70cc3b3fdd8d690363e5bb53a619f3c62da91b936c4db254cbd2972ed4686539645285c8e4711cc771dbb6c99944b7cd7b5a196ddbb6b1e8862ed196684b51d3139758e8486d426d524b53cda98dc8d5bed1f56d6c5de9a634fa3344a4eeb03d6cac6c266c481b4dbe64eb48a45c70903c1d2b6b2e3b431a45ab7d627c5f57258c303a36619ca0abd28adaa4b68ded3458e79b0269e096ef0e7824b963b3b111af2737e68db7d619dbad26f9ea4f6ab69a66ec739235db9fd30c97b968522fd3b9f5721937d4cb786ca8b7a148a0dea612817a1b0b04ea6d2d0fa8b7bb38a0de06d3807a3b8a1aea6d3334d4db6918506f63b1807a5b0b05d4db7112506f7381807a9bce01eaed3266a8b7f1c850af8462807a259502d42bb110a05ea925867a659701d42bc108a05e19050cf54a334cea95695ea85762e142bd528b16ea957158a85772b142bd924e00ea95652ca957e251a1de094549bd934a927a271624f54e2d29d43bbba050ef0433ab774661eb9d668ed43bd3847c02edad1364275cde63a21f2e2f32910f26fc8626fcb67a58664209bf384af8d5b183652510fdfa20fafd51594644c22f10127e3d08621909467e858cfc0a1181654662bf4562bf3112581683fd9e00fb058065194c4d915f5eb3846545da10f9e52c6060199137437e19ce0c2c1b3267845fdea206968df08508bf0cc60d2c13618ca15f26c309cb86cc10f2cb6858806542d408e197f34061590852847e7b0a1596091111e4b7af606159102340f8ed23b4b00c84243ef86d2e5d58f6c11241bffd050ccb82c4bc7e1b8a2858f622e3c16f4f6186651e50d1c16fa349c3b20ed400f9ed3558b00c481ba0dfce420b9601bde1e0b7e1c461190773c6dfde820b968d5fd4df06830ecbea18ff6d32ba0c96dd8c1fbf8d46e361d90f3536f8ed3c5058b681141fbf720a1596f920a2c7afbc8285653d8cf8f995476861d94f123c7e25972e2ce3b1c48e5ff9050ccb768871fd4a28a260998b8c8e5f39851996e9a022c7af4493866539d4e0f8956bb060198e363ebf320b2d58e6f3e6c6af8413876537e6d8f8955b70c1321b5ff4fc4a30e8b0ac670cf1579221cb60996846eb57a221f1b0aca506eb57e681c2329694f0774ea1c2b29008f0775ec1c232d088ef771ea185655f12abdfc9a50bcb564ba87ee717302c5389f17e271451b0cc23d3fdce29ccb0aca382fb9d68d2b08cbb9c6ae61a2c58b6b5a1bf330b2d58462fdfccdf09c7ce382c9b7ff29662bc6205de518cd7d5c39b69bce7e10dc5785f3bbc9f18ef9093b798f11ad1e11d66bc5ca3c0db89f1b2530eef26c6cb4f137883192f43e1f05e1a2f4735797f192f4bdd3713e3e5a91bde4b8c97efd8f0f632de3692c05b89f1362d026f108cb79120f0ee32de4e7ac05b69bcade4803797f1f65203de1f186f33d5f04e62bcdd44c37bcb78bbc6803712e36da705bc3d30de7e52c05bcb781b2a01efa4f1761402de478cb7a50ef0eec0787b6a86b711e3ed3b32bcb38c571a19e05dc47825ad006f0e8c572211e08d65bc32298637d278a5d200de57c62b9704f0dec07825130c6f22c62b9b98bcad8c57d65e785719af7472e13dc478e5530b6f2ae395502cbc69e395512bbca78c574a05e02dc478e5d492b794f1ca3b2abc8fc63b8d94bca38c77d292bc3530de8984e40d65bc332985b7d178a7120a2f1aef5c9a3d88f14e26fb0c8c77361d3910e39d35001c03b25fc00223b3d00f9559c887ca2cf4a4029559a8071e2ab3d00e9559c8890e14c801caf6278043931b6c900092ed4720c9f621f08025db7740039a6cbf869aedd3e064fb0c580094ed2b200152b68f8003f41ddb9fc1c8f665a0d9be01906cbf00048861c9f607208026db87a166fb4c9c6cff05175a88b27d165698b2fd00c83bb6bfc4c8f655a0d9be1224db4f9264fb485258b27d14986c7fd664fbb666fb472ab3100064f5845668820e1c25fcf041e401101284081989158901e004126c1fb6464d1adb2f92451b2c6c9f089c375ad8fe902de6c4b1fd11c0f8820bdb17818c31e8d8fe101a669461fb42380fabc1786c3f84295284ae1041c5f6831c610416db07814b125a6cff832f4b74b1fd2028c480b1fdd71464a2b07d0fd05061c6f63b58a3268ded03c9a20d16b60f04e78d16b6cfc11673e2d8fe08c6175cd87e25630c3ab67f34cc28c3f67f749e56a3f1d8fe0653a440b17d1f5788a062fb3d8e30028bedff7049428bedf3f8b24417dbdf01851830b6ef9a824c14b6af030d15666c3fc71a35696c1f47166db0b07d1f386fb4b0fd1b5bcc8963fb36c0f8820bdbef21630c3ab62fa2614619b6df9279a41a128fedb3a6488162fbe11522a8d83e788411586cffe3928416db5f7d59a28bedaba01003c6f6bd29c84461fb1d1a2accd83eb7464d1adbdfb26843e1bcd1c2f6e71643ee9c53e4ce38b6e70a453f04514251532098f8e43ff964bea5644ec96f4b43be0c956c2d93f0e9c842f2df94538e3f49ec9cb365994f12f13c4b29a594a2b764e72513f529a54be6ec46e32c8a3eae1e5ee7796bd0e819b42986145ddc455589d199d7d6f33cef2d7aa3e779694230c77a9ef5c68b03901802371df86eb035817845d1c7d5c3f3bc8e7a51789e774fc23cb0de453cd653c37ae3edb88dba449f28bcb0577c156e2ca709e36483584e13c592f5e6276b4905b641248cbb096017b1df4306cd4fcfe50346bc2f3b5f4333c6cd6614494c4af615c444f2b6ad0c0fd0464646461b730c9f04a51c83bce46bfe96d75ce9396b92098f773c3a1e1d8f8ec7ef6dc7e3f76599d8afca21fef9f17eea156d6bbc380c0d316939f4ca7129608e712864c21b3787a807ba7a6c36bcf8b61f8c8c8ca058fa02e288f3a0d9820c346aa0c61a7966e0a3f44c4ad18cd6cdc0b1fb28e8495813eeabb7eb2c964bbae48e7f0df278e7ca6377fc538d975ad5b472da4eda4e86a763375e15ab88c97e5d1e1b52f14e3c3a3ed911566621d578e5c5775574e29d8726aabbde4475297aa2f7eea2eaaa8baad109f5fed363031fbfe1a3d5dac047ed512fb3b1adffd4cb6d6ccb75b63acea3ba2e9e43256d649985768cd735ca8b52bc0eb1e88ea8ba28feaa2e5e152e5175e7704967a5ca765edffb38442293f05064e5e99d84bf3f3cd96159bf1cb250244727e16f77f09449f8ee54beb3e0188539e876a313d6f8850a7829cff1f03407b30897db5879107c0e6f066d3d4343dcfeedde8ce500738c545c3329360e8e54bc99141c97227290fc8d4bf1b9949e4b192f0efc64c5fbdce73ddfce1ce4ce7f3f2271f854d70c9abf51a5d818815871e942468b11684ea0340b82a196d490e2c68b376b8899f58ce20c2a62b2df98a4c87a6fd526dcc35b64bfd3ea230d91f5ce636ff8ee1dc33ccf76d849b9b1c670fc02826310fc3413f3d59f25945a5a6fdb2712b8453687cef630ad5422efa4f3e459e25939feacd05dbe1b5b78d27635fee0d0d927d34a2624bb411146dc5ee0b8f1963928f282e0bacda7ced79f35cafc36cf560251748b2afd9c639479ae54ca299b76179e846ddb397ca1c9f67dbd711dd771455bb7755c6d22e5462de5b84dde2ba594f45bf76d3bb735d7719be43aaee36a130ee4ba8d485aca711b156aac3ebdfee657dff7afbdd70e5e0f6dfb9fbc6ab552ad56aa2d88e51e843b1dbdc93acff03c41d5bb1d53a5ea542a4ea51a2fbd5e585df65f7fb55a558e7b87dd65a55bb7f23eeffb5ab6c7a9549e4ae5755e5579aa95ca6ba2eaba52ad54aaafeed5262a956ac5712a95d78ddcd86408091aa45183ee3d65fb2b288cec376e755ed2efc6eefaf5b70377fa597be88fd6798f7aa7d41b0a5fa856fec89c54b65a72bc9e77f63e9b27cbc9b4de832499d61b3d16daeed540ecdef60e71ed7ab689ba6f4f8189e437eff78755a9542ad58724acc7c6b71b91b0ed5f4f05e52bbc8d2aca576863a4f215b2eed5db95ed138f93728a95db61b3ad7a55361cc16fa4f2f5bd3b8847c242ee9dfc42ec73f317e26ad5b28f30d1b42da1705d552c54e45527add0f63b597f56904dbccbb3fd3e0a72d88d5dbb55747a57bdab4d3c097a3d4622dbed294858f7cd93e3a5f649db6efc5932f3e4c93325154529a594524ae9134a2fd7eb89243b1fc4c844c2ce3462d2b0735e9f5a10013448c11370ce30c1a6ccacb758f921cecad339a21802519442bc9b9148b98897be40bc34e96e462d2868189b977e42819da71b6dbb9802bbdd47c26ed86dfb6bbb6b4b43c6d207769ef3de344143249b0d28e29d51e29c42ec5943bc52caf6c52b629845e49a702889961ee8256343f4ae1ef47cc50e49a20a1292a8819df791302076ba2c336c8211b99ac8a1113d15885e0ac4cd880323decd88ce8c66cc0bc188e1921866215e0e43644919d923725b7507715ad0c1a11b08c974a19ab27c7a837aad061faad1f8da32edba9847e3c20be1cdbcdfd606ddaf2a94758f79a685c8ef7d1d4c04da78ebaa1b513acfacbbd7a24d353c240d1791b751e71b1e22dfaa5f8d8582cef43c636537f976601987ed2e90d5c1b1d6f93f9888757e084c049e2f844bf8ceeff9e497f05ffdd27a4f9d7038485eac738d370b3f6bb3ab346fd66a1d45e93c33ef42783315eb127c09dfe5aabb3cb7ea64d5095567ad4ea73ab16021f25d3d12e233e621ab515569e2ac3b871dcd9b75236fb5b96603dbd701a77b166d9c87f431d0ccdb6c77b643db6d429bd02574094dd4444d4293d046da48c73ad6b08675912ed2449a480fe9213d428fd022b4083dd4432da48574081d420bb55007e9200d4283d01ff4071dd441fdea577bd01e7407dd410369200dd440cd4173d0638f5dbbf6fbfda37ff406bd41fb681fdda37bf44fff348fe6d13b7a47bbdad53a5a47e7e81c8da371b44ffbf48dbed136da46f7744f8b2d76ab5bcd6a56871d36d8607ffdf5aa57ad6a557bed75d75d73cdf5d65bd3a63dc7369105dedd77fd7f7de8467ee42a30910e14785f86d3c0441378df86ebf01fde466fda1be99dc4441150622208bc99de4d4cd40026aae1fd767a3fbda1de514ca480f7d4fbcea5d125ed12e932e952e972e992e9b2e9b276e974f9c4442f5c465d4a5d4e5ddef934faa47d227d267d2a7d2e7d3231110aefcf26269abd3f6b4c64df47de00787f423191ecfdeeeeeeee86bd8bbc89bc87bc47788bf01e7a0b7987f0167a077983f0fee01df47ebd3d7877f006f2067a73f01edff5fdf78ff7066f1fef1eef9f378ff78eb7ebade39de38de3edf3bef1b6f1ee798befd69bf50edfe0fb7b77777777997ad4d9de8a58a0b6fde691233f32c32397b0233ff8f0273c3033df4eb2ccccb7a12cdf8eb2ccb7ef5866e62b932c335fc96499af74b2cc574e59bef28e65be9366f94e24cbcc77d62cdfe964f9cea7b0cbfcb64eb83a2cfbb0fcc33210cb1e5816b22cc47211cb31cb27580680e518c798db588671112ec244780bcb43180ccb23f0082c028bc0433cc442580887c021b0100b71100ec2203008fc014361998ce5292c5361f9c56a2c7bc01d70070c848130106f61990306c3f2c82357ae7c3effe01fbc016fc03ed807f7e01efcc33fcc8379f00edec12e76b10ed6c1393807e3601cecc33e7c836fb00db6c13ddcc3228bdce216b398c546580e1964903ffe78c5505856b18a3df6588de58e39cec2f2c69b05ce57b1accb9cdfc3b213cedfc13213ceaf2c2be1fc2096119d2f02cb48389f04961939dfb22c76fe1296c1ce87816545ce9f816544ceaf816543cebf8165239cef8465229c6f01960d9d859c43380b9d839c41387f700e3abfce1e9c3b38bfb560199033d09983f378aee79f7f9c3738fb38f738ff9c799c779c5d671de71c671c679ff38db38d73cf593cb7ceac7378fed4c232f0fc9d5767d5d93b7767eebcbdc77cab479de7d2e85c3d6a35de6bbcab475d83771af7ea51e379d3e0aa7ad468bcef7c558fda8cf719ffea51cfe06de7603dea32de3278588f9a8cf7d459f5a8c778c7e0ad7ad462bceb5cac474de71dc67bea5183f196ba8d7ad45fbc61f01bf5a85ff0f6e23ef5a8b97877711cf5a8b778473d473dea396f175c473dea16bce5dc558f3ace9b05df518f1ace1bea3cea51bf79afe03ff5a855f076f31ef5a8b578a7e03eea5167f17efa06f5a8dbbc51f01ff5a84ff066f3d7a3c6e26d82d77ad46bde4e1feb51ab7997e01cd4a3b6e27dc581ea51a779577120f5a8d1bc6befa01e35156f12dc837ad423789ff9ab1eb599b7081e548f7a8a77d33fa84741ffe020d4230ffe7a907a04e41d5ca81e7170a087508feac70ba9473ffe0fd5231fdfe022d4a39ff7f808f568c7797c483dd271d789d4231ccff122f5e8c67d0eab473db7f1583d6a5dbc917a149e7512ead177f044f548f5d54ba847ddbd9b508f363a6287e01c32f17c20f32752bc0251bc07a6f300c57778e24ec45c8730a78013cfa1894f00cc71587a932fbf4cfc86256e83974b40894700048740973f40e90ee0f2067ce03524711ab69c01487c011eb802b43c014947c0113f40073e83119721cb0d50c40bc0811300cb6340fa00ae5c001b380c449c8995bf50e52e0cf116a89c05da5798f20008f12552aec2d1954479120d1c0994a7d04647a1320b157d56998582c80010974647de798e1c79af61df6a58fb4e63f6aec16cf6a6010a6f3c28a0f0be93c21b8d1452789f81e46d0612246f3b49de334892e42d0325ef329428794fa9f026430515de3158f21e63c992779d00bcc5084000de61acf0a6b3c20a6f2916de60b0c0c21b062dbcbf68a185b7172ebc5fe0820bef2e5e7873f1c20bef2826ef2d983079bb0086f71c186078cb11c0bb050210c09b050378c719c000de5031bce1c410c37b050478bf210001de6e0af05641010af04e8101de5a18c000ef2719de59c820c31b0533bcdbcc30c39bcd01de2738c001de2640c01b0b0420e0ed9480f79a0424e05d0205bcd5284001ef2b16f0b662010b7857c180771a0630e05da3e18d86061ade24a8e14d450d35bccf34e03d820634e02d82ca5cc4016f330e70c0bba9321779c07b8a073ce01f40e0411080c05f11b8071188c03b90c08148400207b2e11cd860c3c71b5e6fb8e1bfff71ef3768721f4d9abc070effc10187f398c0774c600277e5701d39e4f01c14380e0a50e03e3afc860e3adc8693f73871727187b776d8e12c1e1ef2c0c3c11efef5d0c35715b8aa0215b8f7e4dd9327457cf85639eb03b53efc3b52efd4028b2347a1daa7506747525178929ac295542457a126f992aae401a82a7c85bae42cd400bc85bac25da82cfc85dac29954170e437de102a84c3e800ac363a8023801ea005e801ac30d500970196a013e4335c00f50653802ea0ccf40c5c081a8177802ea01ae808a802fa026e00ca80a380d7501afa132e00da834dc01b5863fa036e010a80e7804ea032e810a81db5023f01baa047eab0d6f526f380ef57e02b5c973a8389c027502d7a1e670279502dfa1ea701eaa93f7507778052a0f7f527bb80fb5020fa202f1a29a81b7510de20da516bd3550dbe81da53694f7516d0dbca5d48ef216a2f6d17b4a6d296f5a6d21de546a4f790f519bf6ae529bcadb4aed21de44d4aef2de406d2bef2bb5897823d5dec01b4bed2b6f0ed4467a17511bcb3b4b6d0ebc8da85dc4bb03b5b3bc8fa86dc43ba97607de5a6a1ff1f640eda43712b5b5bcb7d4f6c03b89da48bc3f507bcb9b4bed24de4ab53ff0ee529bcb1b04b595de4ad4eef2f6521b04ef256a2bf166a2b697f797da4bbc976a33f10653fbcbbb89da4b6f276a837987a9ddc45b4c6d27de4fd40ef386a2b6983753ed27de51d486e22d456da63799da51dc02f587da656411f913641132b5437000d429abf384cab31f2a5b0bd4b614ce9b22521691f7a15ed5937a7b7accd87386d82118af672b50ef8e1eeaad3cd41bb443bd22d44b820ef5721a0ad4cb58e4502f6b31817a390e0e35f6baac3ccfcde5cd0ad6ec4c8fcba4948add67cf0629adcd20797a6f498a526eecbaaedb3ee946f976aded1c7b4c5043438ee51a0da6a4b024f0d2d49a07e9b65191167d594009934af2352fbdc8a0297fc0b3fd58ad1f0e48c27eba53db7dd54a3228fc1cc3f1878ed725c508efab6016ab6e0553d048affab089f2468e9141f35c954c634c3aa708613733dc797074a39ee442ec3aa674eb10942b7479f2e459c352d03583e6b72f498996d3cc41b268922ca771419375594e3347c97e1204a9e7f5202db7c922fa4297274f9e3c96ca1afda0f8c033d007d630499cff56bfdef779a01b4b6f240519f3948c8c8ca0cc689a336c2ca54f51f60e6d4a67d498c2c97edceafb2ab310f755bd3f30adbe74e76db50a917ce7daf7de40192ae9efa09c3d19645d0c5866a1ef6c3dafe32af3d336676f7d1922e919aac076ced73cfde5e863b367f33190284a97bc7c31b17cb6419af45ff245b73be1f89ee7799e373ae9ce8d972f0f8b2839a43d6e412e8f4eb8dffec6bdebe5f78f4c9e3d3ae9c62ff3dc38241ab9bfaf8d8920403d7c449708413e4c2ce8646e67ab8a420f44d18c7eab17a04ee6ef6aec84e8d9f78f3e0a1041e499d14b299ad1518af76f54051185f3cc683b66dcbbeae40b3752a1dfe848bfb514ea92b28de20c6ad758d4dddde604f71dac6137dbed8b028294d27b65c4db48361e0b6998e2eaaad65dfdbe6c657d1d38437a1b97adabde23fe6bf560c5eb60c573e802dbd6088415c7218f8c781ac6eba9c62bb6c6ebb2977bb0adb767637ced1945c9c4b6c2b3dd5867d528e081289ab16a94f04014cdc21104c177f5c06d030fd6f9d50ee4c1dc23ca17730f285fed7dd543970c6145c27ebcf73d2e810be4d836f2e89221868858a5d55459b1d1c4e65a0a47e8112dd48ecc22e5919d340d8f899a85e4cc42e575dca6f23a6ee3366e3b521323dea6d59ab24c6d63b630148a9fe8c6adb1fafc3eeb8adbb8cd68dea10121d16a4e43947bba91c6c7407753a9542a9514f1b692912d3a7409d4c87c1a6a0926698b122d4899a6eee9d261aa36caa9c4529930536dd464e7e7b72db2871509e4c566b14d5d421926329a9bd7711bf53a6ea374a31b35236eb449698d7545f471f5a0947a513cd125fa8822162b4e3d96def5571009eb869ef8e26c451350525df27881c414cd82125c7102d55f07fab9296ad4882237e002099e30e3ce9d1a9c2d3a4e098628c36d407f05a9c5b1d495a666a62686bd1fe2c6f8a8881748ca095296454c230f0a51fe05615ed0d4815d3391eadba9f77d2a90c71e32625f4e2421f7237282deb9da6db77faaea4407cb2ce4852dd8102ea1efd1c9e98ced17e86d902fae6377d85600b23dd2d056be4e464937f22563205e3965e5edbeba6cd25d757939c544df89bccb7f5e75d25abdab5f6deb852fa8ee39a971b22acfbbeab6b32429f516f9e2a6dc9ab26e916d24f912af8f9ddceb77b9362903dd81c988462b244e4367caf630f9c7ac4d973883e4dc7aba7355b008830b7b452b3f44640e2da16285e3daca197c0cf435a5cc3368e41f913da5837c4929a59452524a39ca518e8e1b6b4972f5e4eb229501d7adbe6fd5715b70ddeafb561d4746092fc65871d0b67a22b9aee3c0745cc7898053718d245ff20c400175f1cb63bbfa54dca6aa9b9d96ab9283b6772bbb6d392c11adf76f82aa2a2d77014b83c82039be7ab85c736b8134c80da28f1b6f7e612d3aaee3622075a8604804372052a739226b0b9bafcc17a74c1565ca38f1217dab8debbaa61903c7aea90b2ba35a085729bf54973eaaa8de367eb5eafa6069f3aba7b7cd6ef6e7c641754d3368f3d264e55d2b292dedcf8d72e3e6492fea8ba96293c23870ec681dcdc9a339755eb7f16b3b5755b4190b3968bbbcf75d6e38ecf6db217dde8ae3d7eac9fc5a0eb1dcc675ddc6417553e98d1d8d45292bf148b26179ae6833a8a3cd8e36c5710176bee9d82cb4c9e6cae24666a1ed1b1de9ea89a3ab21bed0cc102f065f23e594f21e0bf17f885c9879da59fa985655acd2706006ab27c4d5192b17889f186e4455175f1262f7b45a23f6a079126d287186e821b1720254a24c14b48b2162d308b4cb07542a88aaa65ed44694ead5f916e6c73cb30185d149670e49392a7070557c1ed42a74d32d9618737e5cbe1f57135278d4c86e35db30a8a28509c698f17dc6886d025b3482273450a60a0bd8ac51c1ec6e4a631877a6382171c1040b668d0513519bc3cb3651fdaeceddcfcdab7e64aec66d49be7adc94eae66509f131d967e161d8a665d3c262b1865879169494956729cd580e726a543ad0e58b1d373379d69284b553910792d89440a9060225dacce4596bac3cab36639b07a478c1115348c869c14c9e55022bcf7223612c2bcfd2c2304a87ce162bcf4a62a211ac3ccb8a8c51cacac232b2616dc654f040133058811431599a98c9874e12d66aac7cf8346331bc69c11466d2cc19c365261f4249585f61a54bce0698c2f880185ea898c9875212d65658f9704a3eb42361661846cd983963e5c32626fac0ca8761648cd6c2a419a34a61d48c51248a48a34d1d341c5063260f4a49585761e5c1a9192b12e20e0bbcb0d140131318b334563e349ab1a2326a8e88828402178860aa6b563e44920fb348581c86512c148b1c2b0f423151909507d924b9b1f2600d74b23246c41b33ea8051a74a9e993c4893b04663e541a41913d28239456cd1040dc07862269b04561e549a3186928325cf962a63c01c3193079724aca9601a03365db1f2e0990f0fc3261e3c694cc9987887895e961a7961e53fa5192bb2a2f4654b124bac81e68c99fcb724617d86e7542102323cf0e48406accce4bf2609eb1158f9af3663498cb278c102355858d1c54cfe7392b0168195ff9e68dd4cfed3c2b01927ce16183351b5f2ab3b3336a3a23ea3556dc6363a5b8e58a0e58a193833f9959384b5991288a001ad882eea8400895947cd18c389521bc2898a1564916626bf9292b09ec2caafa6244c7e6547c2cc306ca65985598d593531d1adfc6a8b8c4d2719d42b2f56721a130cd18604429cd1812a3379d51d09eb32567e653463322c45c4b1435303c6163332567e857486955f6591b1d54c5e158761b38b8a8dca8d0a8a897e587955d38ccda525556dc968c6188e16567c61461a12ac19c14cf6182bd988096304493580b26606b30ec18c711d19345144194a6d8cbecc5a0a2baf6212c3c3c3b039a1a451c78e84f11d26dac0ca7b5033366993163583b17559794f69c68a8838e3022b456c91c3549b31cd18d7ba68b3e45403830e9899bcd724615e6dc6f84d15a82ba4aea0428b9599f724619e1b2925e51949d998d7c4443a248ce53b3bf249a963c3b98162a21c569e9392b03b12c648302a9b9ab85a13b7d9b9c34438ac3c673463b6042b1043cd192bc8126626cfd124ac9fb0f21cd28c010983052880228618366c662dc6ca734a3306003370e2905933022a8e66f2dc928475182bcf3149983c3746c2ba19934a4a514565c450a38a295d98a9c11a33d94e5816e30452a4d0b860cc0ba6ccba0913c038538416a53388e862d660acfcf68466d3c230094542f1b19246db8c588d140ea4408a285290e1c44cf69265039441c118a42eb8987367d65fa6c8d891b09595a76618d65ad02626fa6caca1644b29edc8c3654d1934a820a366c6849548f2348b84d98075970935d9c8582f2db9e9a66e9a35f96934634557f07c9962c454139e2a66f2932661bd8495564861c419222883036b2c31939f4912d65eacfc549a3119cd0e9ea9139cc942652695b0f29309092b3fc74818aca934953ad2ce1d269a5636529384b19384f1931ba8103603c7d962e56592b4226334cca07e5416db77fa3012483863e5bb36634fb2e8428d242e508caacc6483004a6a4a4a8791316f26df63ba368fccc03015bffaf2aa3a8b84b5ac7c239dd1c5ca211584200d0aa0349569c14c2a59791d666c88121825bec0019344c54c7261010c2e43c0c00c9d28303329caa82943849167032420a2ca4c7ec0ca1384e00b284d8881a2a993b002089ff0a8a44b17094455889899010100000020000316000028140806c3e170602c8b5451f70114800d888c5e7046170844698cc2300821848801060000004144046068664600361bc90fc54ccc6f73f94ded1658190351bd2d5a70dca9c95f32f0333690455aeb2b00490be5b8980e8da8013d086950b11ec2e471a7f66c39fc3c46dbcca0647e3cbf1b1f34b6f6565bd91b3c7f66ecea2d2c8b2f680b11b2eb4337b4f931e0648a0f49b27d26e41aa33848f698a3cdd8a3f57805d99d11401927edf2c8b1d36e40052338c93c0754aae63196a18730b4acd69f31e8b6c8057186fa41b6fec2bbf854408c3382ac28c0a73a9e806d0093add63d7d4e27b82615c27c5136dbfb6d5d8eb74d21b4ecf7fd2a97c95c6258c528f6981c36d8e2af66f2d0f3d67c735cbd2d7ac11bdcbe67cf8dd61dcc8de4e4dd8947d0070bca6ad858f2af22194f5da6ea15e323b94e3643fb46e867f7c75084c5c3cca17248a923221892c814bc74cd5c0ecede8ba6be981d9354e56968dc9284c882aa93c0645def86e496cb88a1002301f954b71561f5e18ed002df49e27bf41782400b86940ce60b6e32999a4eca91a938f6c187973c86160f77af973e52ab90b7d2738b73d60996f5d852dfe60ea0116c90ef9dd15c5ed42781836203f821f20bcdfae753dda56904dd721ea8dac9d15d985be90ce8c54a2bacc3784364d4e17c16e8fda9ca534163bd870e8669861d9d99a717fa022000d57b4258df0ccd5451977943ca696b19d51fe5653a8fc6be837b0cd09cebd543eafdd1f3e3d6aa18359cc4c5967443fe1913aec4b28b6b81ab6cabdf6e6d36f24b563717ac0647b3f01f3dd7f5080318043f990c643a2ddd4df258ee283ebe378581455e0366b100dfbc05e895ed2cb1212996544e900463e0541281b3d781380a000414267fb388ab5aa9201a6aaddc73e8728ca33ff365f57edbd8e71eaccdd72a26848de3cd0e0591240510088006b37ffb5531119dd15bb68e7b760efb5921a6e8e2b4e78e911c1971136015a13be2e380a4e598ba6f0b49278bb89008ca85b9249e54ea3b568a1ea1023b632a6203b040a94d8216f4339f7664b41ae2587f49b0a0f6b5ab942094a1ec49e05260a56103f474b20323f417ddac61582ee55c5d42df8b373afa591a104ed3730a7d5cb4e6fcf8143f7f5e199755b2c3a3dbf4c60eab2017713416033e3e9fe7eac72edfb6f80182c83b089a261ac3b04cb05d602a29b5cd68997a6ca14afefecefac56b876adb73032f341205eb53f62ccf2ee4d0b411e3df5f31d0d7618ce276b693ba387620992fab45dadf370b9541c642ac6e129c4115b10d40789dc232ef233b732e6b1abea3c8721cd6154fedfd8a04c02388ac3fca5a19e307b70984cf008a9ea221a51bd2d57cf44a8339381dccc1b4c7123a0bdb082497dfd74f75ab1b8ec4005def07ea5caf507c755e35e074c5189c5d1d5db3670be19e3743f2894316cb7acae04c605038f180d11f794f5aa18a27ab8bc3670c9f7b8030340584b952945acc4dd0d01f33b99cdc2a213049a07c5eab21246367b806bff7bc7cd457eef6d3105c148dcbd1252827918d207ec0aff7ec9df93420324cd83fad6c20be12bbf2b01b9bb595788ed6861dcc0c8414f0a4f64c408019cd35009ae0ac913248386603a97e3c570c667e1b347c222be962566d9881fecd576b0006098aad58393a044166e15ce0378712d600ce033228da4ac2661279d67222fa0575d71a247ce21a6361d9a5e3c8f5fefcd332e58aee1571b1a52349d2cd20946bea39ae0ea448aaf6b8a321f60af11e1069dfdd4583a8ca68a9b5f4fb6d3032ddd35b641dc9e3a9a65bc783ee481cc06b030e56cb73c176f0511306e529fed41b913db13e11959f9ba75f54e77a04aec7c63fd91ab67587777d0c6483bdc75dd0fff083bba9f51680dc69c2f87d990f229b62670481558746859b24384a3d9a99d7b7daa59deba0bf6649eb6a8296ce95bfec8d539d3634dbeb0b085552b7ec18d14868d248ca46b8afba2af3812a488c8f142349eccb5305eeffd824231230f202d35fad30d24bc64694494e2026422901f9a718d7ece3c7f6fd08157401ce077b0e2c752cb53d15249cb72e654bb1caf3fe6178c235e4450e68f6b0415b69e03a74af88d253b1dd64023f9a03e6b517ae5e90adf489aa04bb82f571097d1401c7a218f692335860981c135cccec562970358710f268c66fae342cb7baf1e8d1194b27bc7429147a366d3123bb556fc0ebfe0887d384083b000a0e2dfe38759638a8102177109117088a0fbd4c6949c13e83c7dc661bd2275490569695c2ef2179f4b8be02a221b12c69eea14f3989c72a7783a1076de9c383b82db80c565677088adbbae745bbe509e7a45104ec6c987edcb16374f1167c1ae657672c9a90c6f780fa1443b616c1b5e81e8b69ca1cb43178954b55e2176ce541db81c1348b115415d300eb8af82402c65f3ff9485cc81cb723bc4c77f7f8b95fbc51675e0b1ede5ced55ef4f0c01e73134ca230a0fae9a5e324fcff84f6b2df8e07e237ae9a9c87817b2da642a6fb4d321a73439a45342d0897821fcb71526700ada0963f0d2e1694349d70be3fb2493cffab09f14547b13b8a72f30d4972bf422884b2cf921efb9bd8151445a0326e8a6f77549cf8fb67418f83acd65ab9bf4eed3007cd32650bb7bf2430a674a7ee34cd9360d3898ed608ad5ccb55ede1a88849f4f69c55888de418ef52c2ca3a0c2532fd41a494705290368b37a5be52aebedcc312ce5baaca8da39bbb9b3e0118b5d5a8dc90321bfa164c5827497822be7116045014a53d01c03442122a0db8006454d4c730aeab1453e776bde500bcd05855045e9f84701d73c34270934a1b8fe262ba08202e638e3080ecf5f9146b20ee02642bb83176152eec5a203f4dfeccded4fe0c47e893ae811f12980b0c750ab772d3414688d8fe67df95d2591d95446e23e79d3b8a261da3a215dea57d69ca8a7b1b997741d001e97727e8c3f4a74d52501ada13684bd3509adceccda86b21f34144b2a415fd8631ef86a0c4d0d32de425637263c48ec9d06fc3441cf36fa642101777b18199e49fa732bc03996acd81402c86fd5761d5ca01530592e4eac0d5d058840a3ee83d57d3d2c1b5fb2385ee9ce7d3f2ef2fb84b41400059c623f84caa6e43b16f25001cb90534c8275ab1ab9f0fda87db940f4a429ddfe05baa88ca24061f427a2e65f652334f5f27eb9a0c2ab0372ff9764ff787be6706c143ee8e143b7e9a05c89d7abeca4531289bb8fdee99b0f3d0a2fe914e61c353228f48634a6194ee78ac2739da4765353fe4daf891070c048fdf0c989d2eee423fa4716cb1408c0ed23c287f7d79208228ec084210ee3887ea85d6e26f043801c0b4b1c413dfb79936e9f1974a85c417df72904b1cdbc3679f104b6e9917eb672478433f143cbd70f6a9cdac6a63cc7be4c19d4503cade1ded0b25fae22fa422194154fe7db51caa829368f01e51f228568bb692d341aaf0400093fbb46033cdcd5fa64fb01984ef7a0f1196b9f0e9ac356d9e2ecab191a653595625f2a412c717f873c9b7f32f4195b3b9fed5718dad1606f50b53e716df61a16fb8576e4a6b906d828c575b251d88d1110f3961b3fb7e74008556ed50233bcae854f78e96837bb9c2777fbe314718d4759463e0a1d136dccc4e054cbb8c889b1c72846e6abb60b69ab3623c60406258b6469cdde28832b060e3f541dc24171a7c2fb9a4eb2f40ef628b79ad5ca6241f16bac76f4c8c6d752b0a3144fcd1b62a0db0fd4fc99147aa72e81650174f4d2ba19542a2ef2e5713874477722ba0fc5ff81cfccf0885b3a015ec400b12b769e2f469bbf5a78314af64f4c1f0460ab7a30e60f1e82bebefad895ae45a931daeeeaf2d0c519b6816c090d1bf1f373df338fdeca5bc567e5575ac8e1e75273afd52adc609b15b0e552fdf1b01ee6ee32f1996453eda38bb0c0c50300ed6866dba9281815000154fab51f248b10bec2b643dc32fc967c6b48fe21bd11f592b3851de809e10034df75cd0538c0ff178be88fcef82908a3fb83a8ae88e82b9b455e44311d9cfc70d0d9c9da2bc65fe53f054e98b8739860b004dce1ac54a952430d3207bc26c653c055b191a633d4dfba733c4e49418d4a29348acdf4bf79bf84e929bbf03b3812533968a3a96d9aa184172e9f8adac2af0a48a59f6dd7fd00b22e24858f36a0d9ae026d9e40afbc46f701a9aead557924ac6ccb5e1b4f5617d9fc9cdc3113ca6950d9068d6763b8feea4a98d39e009cacb1a129c103f951151d05a96c6267cbd8c1b4040a265f428e070a0e059025fa4ee733436441e4c416071c474cae3a839597ac7601da3512b2693905ef8fbfc49372c10d8935702b0829d46806d75d74dc59ed6ab6118f3b1978e79dbebf3a705e7ebed564f48e77f838379e9bd3c7b6f093b2a91d08e1230c88e10fdcd4bf28284091de464d6c09b5578786c1d07ee3e9104ed48bff99fe9e8f69dacbcfdef5f94c783a748be18620c1bf2c29d1d06909c6701c83f5d0d30a0a560762b83bc3bd362d83580ddc8500a622663d11eff243131ff48545fd73cdfdc100876950259222c9bfce8fc28f70bf04e2ec11964148439a2cd064b53c12bee17dcbccc7445466ba9e7ba2e9106673c9898d2e95dee0d645d73e9418e0d7258edbafa079da67a4ef663fb4d1168a977b01b85d67ffe36e52865d430dc2786c378487ba6e846e9bfc0ac8bb6fae5b25dc8a6e2279a3669b92de64609573118b10c051033eaa187a273c6ccc8488641b3119e9434fe17ef719b6a7c2534ae1847a8ceaaaf0e665e5fb3e1902ef303cc28526ccbb86bbd85ff495d5bc149f956be105457c77c879d66760cdd3140efe14bdb00c429822568c74bee0a5985038da6d2f7462a506a090ce637fcaaa940429ed3a2e7bc67fa04e065893954cf0890eff1b9df22f93dd6d1b389cd9d0bd1c9db58323785a586999e4401de03c53b8f9fbca20381aff7b6d5435575a9d6219a8428623460334fc499fc2db46d0c4897ef9e3fe5d13dd43209e6896752f87e846a3642515818d533b848bece6786a6a342b6074e5c23912f9dd4d38912366bf0baa8b085b1cc8b7100f68550c733d2b9b412c8ff9031f29d884fa33529b18859e36e89709392543fa31e035e4dd98b90d1c128059dfa572cbcf897de0daefc91e3beb0422ea402a8ad8324ad8afd9f96fa023e1091ccf58848c3fa1fd98eb0287d40132ab6af31c444aa56a4dd404154c58045fc3ab2100fe398341ffd4447725a2db79be6b5ae8ba4ba265055aa8582a69abf241c5416faf74f537a16bf1ab45e99ec30d8a8f78a4b4b59e6a4c00ae6dc0a3b2181b3dd707b2262b81230acd56b0a6a3a11f734acc6c044e2ad710b180ca40c493beca3b78ea2b3e88503749fa468d7bb89445baa167178c52f69802bf08ad7c0bbb711cbc67242ca8bc8e5e3b22400097af79d7171446daa115138a8acb9c756c4a4a9a0c4c0afc1ef70e7782326d8ee14c1f873f6d9a0e27ef845660f2354340317999aaba7c72353baccc05821c29829af1cf36e13cab2893e7296413c667b4fdb9e247c2de009762c61ba0727692cb0f76f90cecaea812add80aea8d7506c147798938c657347be5a1c8c40a3c7be480e686bbd35110d4209b07fc40a24f5168fdf85382533f27bda9e0f70363380ad823cec60db5efd9448af601c801f9232434ddf261a3677a73ce61d40c27535aae3e4c14eae0ea93386cd20031e3836bc27bffe9acc556972afdc523afca44562d66c1cccd5fae7a71ed8faa3dd3855c527623a934230bedcd390f5f38f03f15fd18c456e5bc9840c72db92d7c331f830fd180b7d5f22849786b9694c414492a87d27365484acb8a0f511cc54a39292628472dac94ab62b9c28632f16994263129313ee2282f82832b9135deacade795b5cae318751710dea6ea23ee61fc5014bbb384cfcfe531e0e67567b152667c1465218642c9b8f08909e357d029a1d200518d5a430d5baac6a68e796e3dd26037197d57e777e499329170d8e56bb119f3dd7dfeb30e9e22b76fb2bfe30e3a3e01dd8c70b3b90cf29a5ee361ac1d438257ae2b81b2f6638d83502d6e3e49534a80d206284501996253e351257c4a568ec617a74730219a69e2f80980d33b407ddba9be169e9ec67c2ad6a7734dfb7c417cb3fa7f1674c51ae3312352a1f390f1c62199a879c8a7371873d7965360e95b76c53a23520d1aa536aa72c18a0bf85dc414c4d2bfdf44815fed07306a410711cbd735383dcc010dff3a78ebffa88f755a5c82c96aed69efec07ff3702190ef6e619f299908b0e54cf68f02e5719fc3656374427b8413fe3ad39df85f5f75e42bde3385486a60213c025c122dfbe20bc65ea228696919c59f69b6feaa95d58fbd290c8f6398670599f40689a450e157096903413a893d41b7b08594ff67725f55bafa2703c64788a72d827b95339c26cf6ce1bf471be074f013b97b49535a94cee7736317de496e7a2a1c3dbf5b70912fed8fdd14cf412f7e9090d440973c744972a4dd9516bd921a57d3896ccb396762c294e484994bf96309476866244cd15c5ee05c1c53975a556573e2fa236a9e3882b91e75e3e777a26fe1b99ed2125559a14840c61a5bde10807d4daa79adb4ff8d08c8483735e3feed1a9f3946aac120f13d63dac04b0ccabc403c03b70ea1bbb3da0188d9159c2c6a5b78647d5e28f1bd0ec47ebefcee6862ef30537ba7d9b9bfcefcb324829319455a173d6fcefcaa52e619efe379808073e8a822be124c66a946c7a33683c447db4cab8783dd31691656c94d56114601f8b5c4b50ada84971737a0419956b5c251e77e9c5cc414170a00cd2a36e64109baef8aac8d39dc9da209766a40c9f646b661c5d9047788ef7a857b40b4f6437d818b5dd7882707de9bb8ff643bd7dfb3756a998442ba1ab438cac53701903f06b8122e8fed93b5404b70b964085f4bb2a5460108481e82d303ae214ee4d01596caebae0445281d4abeff00a527c275ded3579414503c38f7a82189a0d582b2e9f42afe3b84528c62a25a7e418b63c876ef84f3fdb1186baa986b4ceacc63d8226a68de07daa2e7da59086a021387ff4c0c9bf6a4746caf7a2334490cd475df4aa2324455b698095b270ba1dab491751c29899ea85239296e60e70124e274d5c3f7a1ae4aaa158f3c00bf7f6d13a7ece60316b1fc3ccedd87897f69c71cc3599948b322e653546594a926224114ab72fe51ad827df1d22509112903f25f5aff5d21cd58342f44bd775c006f88df50ffcb90ee5f8952c18db9cd39c168f83f0dbcb5000c08d9e1f60a50cf20d22a153b749e5b174adf9bd17fb8411ce078d8c84c22e2b350bef04872a97b49aac80ab134a809495f4bfccce32ef10a83d9fb74765e41c0d6d4b15fa50f15cd23d9557c2384e0f696ec85fe96faf1cbb58fe9c72ee0219999797b7c2992abd30a793ebb20b49b250e7a54732d72d0cfb411500a35ab32260ca0501ee27a04f8b081b6a04da0d583a0f17c6d4f291658dfba3085e022e519a1b17ee31c997d3874e48cbce1566b32174dc64b587eae45031acbc12f5b5be332ae03c93f987570d10dfb30d08ce1a7f2566aac08fab95d7900ac5cd88d0f703aac7342ac5917243485b2421dcd7538d8150bb0abfbff32dd93166fff91deb4b9fa0d7a8cddfa8e4dc9d82892d4c3db4149d87bb11f48705d0628ba9e409e80a15c991acefc05ed90bd6630cc4bf6358416b9e5a872871c8f8e9a37a9dff043dd0bc055e7033ec715b9ccb16dcd9ec190f4213f58467e50865e85ca358cfbe4bcb2c28cb174b5cff0da6de42a73b6d2353a605444e732f8664a81bd5b3571ca5c891e6be6b743b4f5489675c025aa9785e8da4a2d6ebb495d1562b78d0b802239e683c5188510b3f15e98ae99ab843a7fb8d467c85a036044febeb01a40212e9877e99e56cdbfaa6fee4f5593145cdadc8fd64a17904abf963e5168b3e51999510d4a2ae1652e5ad94989b8f3e1bd31a43376c8c9e4e87462fe35d0b51fcb580d38096b349617eaaf3d2bf3b2a09ab434eafe4f56b46869faf2024a493c5d1e0a34acead44b7142eeb7f924e239cd9adc458c15cdceab6b8e595ec4a418e75ce4a532bf54fff27c42518b2cc55a8f42d262a2cf183951e58d741e79c0853ddc63c39aee43a54151a48d1c1f1c270d8fbc0a288ce01a23f3c1aa84934291dd0c53e1a0e259968bd4c9319c30ee3747dd3653d3d5ad4537c38710f152fac83257ddf5ff51b82c018381d65f7cdd1ee1932fc2280e24f72f784d52ff1e577f69f477d48fc4b17fb6d10184386b616bd4f939c05d572511beba4ff5c7ceeac8a515356d22955564a16c21cf0e2a769d775d07c4250fb883fac6a101a04b6c80799253f598ab55738b51b160a0c4653e503c561d388a9bc0081d8fca412e1d018a6cf1482744b0403749aa93e6d0411a2d971bb870400a5c6490f2615295762689da1c9b25303088e598bc50b000aed5d66e92c00c3b45e8764068986860646bad696644a2160f3b34e0b450090be4b0bc42a518cf45325e2b1314c136904e99e0a068814a77dda49224483e17d0f29084a8d103e4c2a56afc410324793e5b7061010721d8b1f489128d00814f11e4556c7d7b5238df96064220644912d5791486811a35e64e7c648baad74e0bac6d1dfefd14a01a9ee42fa328ab4a68e547126e970f7cc52d9094a9354291922b952ea2f4b3cb925eb7497041540e06662fabb645af966aa4e9abede9ad66e9b2aff4d3f474e2b8f4e856ba7bf8fa795b3a7d2af4f0f21bbedfc40b9845059cd504c88285bae2851d0280e7a94e58d94189e14f758ca6a963025604aaa8ac06db1902d1b97d5900f7bf9699f3f6e31e75defc0153af10a6ce7a104542eb706e18410f40b7832debd9d4e6e9fa7ebe8f079b91cdc5e0f97a3ebf7723a3abd1e4e779381f841f806113bc688408584d729b12f9908be4e381a8a31679bcd446a9a8018a899480797a622324ae15efc3b231f9a0fb1032a10f7fef80dfbf05533f6eda04892199977fbc9d908baaf0ec00addbce3117baf2d621f6186b2654122c199008a48fc2c9b6c8e44a461d34449cadc26c46912e1cd954c50f211471ec994f0bbc1f1cc4a56df4ca065c9f354a214e312a62f31e448741113669518d35626fba65d9e4213010688b9d6e4cd83f43bdcc425339634e2a44adce10aa29359ed4e9cf424e751977d7df2ad259b2e409967502cdd1c14321412cd769f4491a1f300218ce2f628c957393724c52e0e873a550a134cb1c67644379b62417c55b5f314be503197aeed432acc985d3e399585565c9e52151488e9759b56716cb0926b56c84c4bbc205b5922b952c52b7fa55bddf02b2e112c14090baf77ab0f8a653d79ab65c882f6fc78d7ca528a9ae59b3fcb6a6f6a98e5dcca5df0f5500c50be429c9986348e0de17b3b5cb13c3cfe0651d20db1568744853e89cdbc13033a281a59f11161db478ab516491e84a41d49641a589161e847869ed0a8b0614992d18d044b4e828f3c9909186538949415e1a92c04adb23c109649305986a16f590f91cb32a62f8361c04c8516b31e77ccd2786626a29c59089e66186b95346358c20564b9eadf720133ce03a32ffd40eaa4007fa7062b9e32d8f62420e05300d84f19a29a4db504f53a701382ba50148c8652f012858251140932a308908d0280825406245208f24941a052aa8074a901064c15e03585c06eaa05ce53118c4f018043a50029aa0e5ea932584ca5204755003055034cac32f0b4aa03fe2a0928ac2050b36a80a05500db5630d05b69a0e9aac1b2ab04e65e09087d15800bd6044758167c62b500164b00842c0044b27ae09795606556e0a56b4f05b42af3a5bd619cf60497b50b34d71e80b33de32cd60454b71430de2ac1069706345c61d7b33d0ae5aa983ff794715a08a47551b0b02b766ab147e54943185911cd7804234dda87970ee24db202545d444aa944d5049b55f0548b1ee682897b6d85b0a3c898ac54560b3b5325a675a16b01e036fafd0d0620b7bed01d8ceca433bcca514fe9cad738fb85dc01298741984be1e27478764b94fc70b1aafca8708fec1c2803174bd20913e2a6b939725e17a5b97432796a51150eb7c37f37952b6554a1ac08fc13f065bdbb5d9e5e5fa7c3dbe7eb76bc7dfe0eb7b7d7c7e9f6f27ddd2e2f9f8fdbe5e949f82cbfd800b28f2764c9585f4d7a5b85a20dc3e0ba7a0b6c03a690746f18d8e6ff216d6e3cd8ce1c036c962db41d9802a4bd63689b9f0fb4bbf3601b660cb15bb6806de00a91f60683edfe3ed0c6cdc3ed9831806df942b6815140fa3b0cb6f1fb503b370f6c63ce10b66516d80e4e0169de30dcceef03dadc3db48d1906d8975b601bb0a140253190af32949b6f035863429e912cf2f45d6997b785981346b1b0cd7ae02a643ca15edfe7974a4ecfb731a1867af9882d805449fe826839efdf8a1c9cdbc9980ccd723c431a5eb93098d852b718ea104527810797a21072a0d8061fa66c32e309bbfae1bb665acba2ddeac65eac90d275499bc0aeabc87b07b6e4155b1b52164c3ff1b349bc1ddb7fb110e376c8fa202784aa0b418d7c802e3edbda70dedb1bfb66177cfb3563ddb91fef9636dc76f7c5bcbd13cf7e6d9877edc67fb305b77dbdb16eee8ebb4f1bb61defb63f304070ddc7e7d53f87c51d8f4a1c6fe29498c48a1f94d4fd5d1d268009f93121bbc96331df65f5fec4c2e2172719a98c4719f50870d497d2d57bed439dc03bf54759529cf5a652c54ef6a14600b6590089384af8a34ca58a7bec45cde0f7e9891a24b8d59b8ad53aec47f9a077e989e20471d6972295faed45a580f7e88d9ae4f1d5931a55bad98b8ac176e88ff2a471d593e21576da87228176ec9fda28e8f74abd082def439148ebf54e25c668ea454defebec498d24a3e98d8a6438ea4ff9aabbec41f10077ea8b2244f8eb4da58a7bec45cde0f7e9891a24b8d59b8ad53aec47f9a077e989e20438ee4369ebb5f4a58ee2abf44c118628eb43114ff5f6a652c263f4464df2f8ea498d2addec45c5603bf44779d2b8ea49f10a6077157703e8960d09a0d11b4e93c399239a68eee74fd4129cc879b59f790434254ad51a278295d689016b75374f74e97f9d3894e44bc4a7347d4cec4bdd17c4a7443e238e4aedfbc5ae04be222ea5e7436256eabf271e4af21171534adf26f625f705e2292d9f11a352f67df17e25eae1a38e58b13213c8fad98c4f40f3794bd2f062d77c3484f6e15afe7328721032e9cb7df1527a6a7a985ad20de9c3371be0f9387ab05185611dc879da7b2028bd5d9e68e49af4c367556286ee33142e817608988a5a8d10a726295ab31430c7de54f6811a6b22d71d54fee78b4fa5524e0810326d93f5991af62eae8fa9ad05e0d824f15806cb652635da6e60d5174bc6000374f1795f98ea65a912bc77df5e3dea0d1adfffc808ab330d878aea1c1d98a12027d183d84a6f121d849e2432a30b022e82395d38aeb6315bb4258126213af38a855a6e8fa5104c2ab13278422ee8d1a80054f120053846e6fee50da72cbedf3644783a25f4c16ae12059bb83710d8670cf342e4ffd105c3581685852104873a32046c140ca9fb60858720e80a22eea06270805391b0a84741cc618d070ffeb21e0ab66e26051b9a16d0b82f0ce06284efaae5f3d00d0d535498b873d5a10a1d420cd488bf3b10f01a022ea07a7c807b98d0b84f51ec63901a89275758e424153263724b68b4b4d5f92aaf9f2dd0e1471b31744f884fcc6f612aec318e1ddc983b5782ff6a777e8f7e4d613349df7ba758bb013ba27fb2694312fb4c639dcb201564363c86b95bf2417629950bac2ec2f897fae30c745b905268e3ce6f93f449daed8d867f666fbed18d620939acdec110ea645cceab8748d48aa3f5bd1f2fbd4b5524884bd5dc7f19f7c902fbc338042798c1f18b476d04e963502d14392834d48e6bab936a8a21560b9c71951e3b916b7167d5b967a1fb9f815a2cbef95a5edd0f138bc32aa4fd1808cafa0299518f58413d3e2e23f29da2391e0e63021a9c3e088789536fb69b877c30bf2099bf46a5f69f77172477b6eb70bd74da74482fbc91ecc7c254a0ed764c22f8f603c2d9d63ebef619ad59e78ada5d2d14e885c5a38fa0001cc380ef4c863e8cccd490037ef79dae9076aa579bfb3bf566d8b53cbb5e376dd8df4ca920cc8981e02f6b3de07079806a8df9e4a4fe4baa16de681a470bab6fd38c14a8c2e51fd211f0b765e04a1dfdc5d32e4dd6bb768d5382582f75e9238e99082f5a41496e606a20956e3db2a60e8f6f163b592489b1c1a89fe780c669f66556d01ae76960e21358f732be9f42e0c13f54bc93524bf6abd48f5101ae29138a478d84060ab2d6d5bfd2a994688c980ad382faeb983eabaa29e5fb1fac29c6bb941524103ce6d11be19e19a47c43ceafa194a670aab581a4f42ec66e4427742ee48e022055b244c90523ae9e88d82c298b810db5dc93dabad90d7f38c2768c1a2ced262a3869f9c01c6ceb08bcfb908ec7585c218b13ae665d00017c04661be2149eaf78c536c1fb11f0f15163e52b91a84a92c8617dc5f1a51617a67e53fc75b7b1a08c89942acc7a2a4855b64b8315d3438d05f46e2f3286583af2cd46c74e907a6e8bdf19e6b652bbebb25e25b52bbc90d9cc1e5bb51cbac50f51d7d873391d40da8d51ae03ec29c73a5e6ed79453d6902507c70627d9cd21c7257d3774f515af834bc95cb397862f285cd6ae45ca75489e0cd8a9c06d19c806b720a560c9c00fa74e2216cc40fd1233f6c9c525477afb997015b3d3fa20a45efd05e4e1f572470abc87b14ff418f974bd6dfad1491fef1fcf79dd07516850fe893dfa930f89d9c0ba6a61fc88b93417f2a5eb81ab79be5fddef779428f1b80e6f1adba3dfb410137c50d54d23738ac93a760030d7914767c851e7a8197a46062860e56a169ad4bc8d3a7414cbefe653701a15024f7e10153255bb097e84fac1a2291b5c8749ed90497d6f6ba2ef1d5b00809c26626cf37fdde48b6fbd5ddabdc28231fa3aab18546b5bffe5fee68ba0574f9fe703857195ce1365a247049531c01ce88bd8773259f0bf3a8e020a1ae6d7ab995fe632edcb6d87cc3e8054375bfd28a79514bdaf9e77c2c3c65501633b82e60e15c8ca691c676248f31d2e2d0be07960255a45b4800d093b2d23c35050259996252a35ad388c8afd3caea1ef8899c262b3185b9c25d2155797f455156ae70ac3552f8b01f4af3c121a0cc672a41aed59b57d02a1745a24b60316ca9dd6f02e5cc80d98ec45cee12fa86a35cfb9468f9f3bb5c3fa245a9b84f4db6ad84402570ad2c03c31c5bd8aabeca94b200cd7c9ec61f12922e29614045b1954e39001a74b202c2124417f04a04aaed8c7c219458f946890f2214f0e55dd73a30fb26d665cd83b496ab3cab83a9e8b4fcc2488b9ccbb66e070700c377d9668ac44e4df1ed689eabb2211c9c050e139d01d7e5db66e4eeeee01a5769165bf69dce06f31b50ea42658d453f2311e751a769232e7ecd68f90e63d2e60f04d395958287586ee37cd7f7a05b0e9e2d67085064005a2a81fac20a0a92036e95bcc1875f3b00d8e11405d1b921ae804d203118c9df4fe495106981f9e49f437d646a8dda1513ca3ad71b7a727a8869ce0d373e13cafa9b180c0a94df546d14dc8a5e062794b5c8857257f6bc035cce915f45a58c2394951a00a43a397f872f59f10f17ca1eec810d185672e26d6c6f3133f4f5e93f8c7355e53631741fa473b411b1a8c448c4b9b66c8ab95945d34b8a26898dbf6d5ae2be0e09030c27f69e9f97e0425083fed83f3ea34e007232d3799364f214cf30fffc455d02fe86b6ac8c5f437e3290e712cd336d2e2415bc0ae8ff492d1dbe98d043f2af4320b98c4182182805a45a669f370c0183321e8631d2b76a5958f144e379e48a955ff8c0533d4c9d54fb8efc8720d58bcec1a8a57aec326ed03d05b2a5f657735a9dbb1422b0032801b7ca82f649dc2b99bbd809a34b94d801f7b0d6c5eab28ebe5472c3a9ff7ac6ec91b2ee6a8affa968bfd1e9348d6fd319f05264fa848942c7966e45b431d796644e1bd7f1f3b721aede7db50c0fe7897c180e161c567e0d99ce26a171f8772669897c25911cfe0d54405c17a43cec60e8fa5f668149880d2ebbd2825e3a58cc6cdda8c6d10dc84c480971cf7d2415a9a9c3fdcc5ab2455ec50335c4115226aeef01154829f7841076863aaa7345a46ba8f2cfa0bb86cdf8b7fedb5af3141797572b8c74eaba3ff5ba3763ee3ec8f623fe10b172301a77dfab931c3f30d6bf2bfd8dc3cde9acc3b64c3f7df54888e3ceab3976a16d214a716afeaad3798797360e423dadba63bafdd586e5d2fd9d1bb011921935b24a0bf2a1835848995ff527bf8e593e01a3b80b09388bf81509589558ea6cd947c5e91517649f39347db76d47da0eb3da51d56c98fd2fe36be3e97a9fd431258e39023c3443851ddde026cb76caf8a780909cff3c556d7392b04e3f5bbf709a7953406b1658d86c3e759372da61e36af940983583504b7d6c9c5aa91842752aafd8d1a0482b44612c4a94162f5918a959baa92bf015bcd1cd4d66c40da0519cf87985041963a8a56472c6d5d966b8a497934ef279f052d420878c789d5700da812aa779d8406044ff068c8762492111fd62b4bdaa4cce6070c1bf979161cd5854655442111435b9d70565da6bdffbeb4fed996da58a46690f4cb336f49f63009f688a8c2ab318a28fefaedc8ee48ad4ea90ec8a36945e3106f8387941d2a8522b69c783d62964dea30cdd183a2df8d122d1c8caabe834cc4a54ed02c549d51d65806f2b25a57701ffe3af6084b3ff998556476f75ac59103558f2831aa73c6f052cd90ebb31252bcd1b5bac82dd16fb526a315d6cf40ed7d8f5d7dcbf178b764ea8aacd4919df54bab883dad176ded024a8a1dab5a7bd2f217806e80ea412a2bc6e8ddc9cb709786cebfe7133fa7417ff40ac8f57209c8083eee720ad6dadd2fac083eeadbbc0c2dc6ffdbe72748b72fc4294f24e0653bf2432ca020450717ce65f2a5f35d95ade716b2d547daa37a5cc3a7cd96b112e3064922fd043d4886f0ebf7f47eaa9904cbbeff230e2c2049b2123a0ddf57caa3afd31c35dd104cdf78db6454d0d4fef1b3d5fd206cea6215135328ff37740c2141be070fb2c5aba35814970b4839a345cbda187555c76c0753cfbd229f4e0b6e2482e125dad262ac51090202305a562a340dd4e5ab450bd72161fc8d61a899f5758ef50f8b5d9d5666b03b86d0ce8e6a0555ab7c157611085eb44ed23c2fa90df5799b7be69d8ef3d782a37e5c68c1f7fb987fa0d529b3e7afff86f1ea908b9a2b8dcc215bca87f03e06a26b01056ed13d04a2cc31192c65ee0e3054203b7c4be84bf0e88e43d874ff46607023ef425d0c60566dd1bfdb362acc3433aa690b8b08ae092aefc1623794498ca4b9d0cfb71d0080d031760e52d5c1d63ac067eff13224ec391dc16a2aba684da81c5f39a2c8c01fd83631f16106516d62a0cd0c9c2e176dc333ac4a81a293c756db166aa5784ccf42fe8f59d999883572993a07039a5c0282626277179a3a01e01effc84204f2ef5b02b26d2fb1a5a902f9e1cc7402f4cbe758465c2c0666d1ac1f6c1cf53cd47d394656854e59ce25881a90348746a2e5cd5346f35170e6b9adf9a0b714d97af39d89e67d2ca5de1c74ad00558dd5682708181add4dc3e9f4a0c04d156fb50ad69c4e078d3d6752473a9e2723ff30cea21741f58d7d8bce03cda24cf90316254a090f5b5ae71e308c78b063a08c299c2553d548975e100884afa9b8a3c7322b8d1d4ad6ce99a8551fb5e80309542840b4f059eb9d115cb3a9efe03a891260dd5b35edb0f8123336d301010bd362f2a5ccf72fda11d6a53b861c9126b40492573e256899949cc12b1fad906cb73880f6b6a16d6641411a5388d8e84a50bf8540734151fc9f8ac909e87233b6475981489892e32052ec5ca16b4c38668ee9eac990809ba0a252854800422166e03ac324429756cc6d73b1321a5a0e3eef8540d8750b57423e9293954b8daaab775fe71b538d850b9ea6ff426de4d45813a5313c621170a1a662964f2520c764b0531d4ea20ebfdbce53c1c4d1cbb352145d70bd51e95bbd9e93620111d121d6825a43e3174a4f4119af4c2a2819c46906d7486a621fe0946559a9847b65c4e6d0a0fa72ad46dab90172bf00d3c6c440c773e04b1fe97a8856eaa5175e8f488610320fe37b7babae768ad899cb9f3d07112d45e10b48b5e2aa37a74b34ae6fad2f11dfd4bed5fe714485c27c44f3f38a5da983df7f005433d494ba8a8cd095ac796154096dfaf1d9206429e9556b11ce1c66233e1f39d85e2363ff4643b772747bc7e33ce93923f2b075d954e5b8ad0d1cc1bc78884d45e0231dcc4c3011ae2c4a45129cf450940b6cab3f9e250f8a70af0ea69e04e85ff395d8f50cc3a53ec229fd3dd2e0add0caee00aad060a2c81d16266c428068df0bdc0a2f6530a6022fb75e46a676ef435123cb6fa3a4aeff571d8d256df8556a98f935d821a16c880fd34dd620006ad985ee7dd1cf7f547c77729e01a20db8e9643f283a5d00a79542d4c465dbad0b2b266aaacd74fa25d23268da5849436a0aaf6cdf456f3f561a8b2b8edf7e9a1936aa771852d7c47768ae88b0bd1ea96c2f8583bad27ade19a7482d763d371d32d4eb6c1ac951cb324d5e76820472ec26b0b86c2fd558e6eb731a1b199cc4dbdbc8bf4093baa52ffe367988734b306f1e72632354db70ebd7a98c9471507b6344e4cae206e1c68796853e022e6432f6bfb6f916537db46968543d6d0796d9220de2f723e0a7169a7bcccf6c63a96f029ba05f3b67fa567e6a98b9199bb23c80622abd2cc0d9234bc2c49cf67e1f922eabe14a46204dd4e5f378191f6f82e0e86bb51a6b71edfe2c449210031f6e4fbbc9cf99f6a8b0a96bdeab57c65d3365d77179d6f93b9dae1b193338a17e4d0a6f86464499646fcd3035075123f867654e6cfdb43c5db9cf4b640a91c94df7e1d6dc3275eb0125b8753633879f43ff6be28ab445b840b5f647218f7bac84f8d8800a220f045a1b7382f1ce1659d8d26dde52704f10f0f3b4442b74f135e07d025e82a8d0a283dc257d9087adf773567054f932bd1b241f54b22ee3b5220e7a1ff7da833184a5150a8148c4a6578d3db732de024b03e7edf77dd038284073416d201cc58dc9476f7b1ddb771cde246012a252cf909ab331de3ed67a6de273eaf81d6b84209ab0a779b7f4a5047603bd5d4a2da10d971a7cb917ba55f3e2bbf4c65ca4ad5f0efdd724cd4a01d9f5737a512fe155366d42d555e6fe297f61ba981fa6d8799529e7446e30b19ffdfe6a3409e584381b4b4d4042286b001ac114053f307fd03666efed038af32e1697786310c2e0e5cd4136a87423c9cce3056928351636f7aa77b10a3ffce918f4c9292b8ecd68cfb2f215594768e212d4e0f52d50a229ccd01d8fc7728acdbb56a2c27d011188a58a5012d685c064a19f32c2ad762e16a33c0f55c09f2f5ab7d30db742a351c0fbd37723a9a007d1e715420f5b577d45d6e7014bd8bb9b115b14c1659ceb6c29e4419b2b127cd3ba61bf12cda19009841c21db53cfaaac52e4f3e15431c64845b98758341e60cfd80bd8d61a50bb5851639cc86cf505ec63154f42a523f74b568422b11d72fbf14708246a9621aaa5255287e9db6f47c40a710df93459d850948ce90cde2f799f6c4a27df21474cf3111904750daf99dbd320f68b83ad02e8991f46465de9774e6cef2ca557a50eba0a97891da70398e309705a0ac2c31bd53e120e7852481b8c83bd8b61e238f5a4f22ecc14288b165e220e44e0f1c06d3421cb32b6e855eea59908c203ba3063b5332b47c3fdc79575ba122d6834bf3f52f4e131d0a7ae0faa90d5fd251e087f003a503bf47a6cb2306f9ed13abe804f558ecfb5606f44bb9cd81e4ffd0e94a7cca5e82c1dbd94eaaa0997e314ea867570a4416f1ed66888df1cb597612bfd4ad0aa3304bc34cb50fbf419393112803497005224a8d3b5fd07ad515b4d09ff23c384a85a8ec8855d8921ec92282ae263b0b3b12263ad343df9f532e2bd7c1048a7915bd39d9ff88172899fe09a3dc6505645ac482e368c8d781a73c4df29e8e0af6b696e2a918d1ce0a6134043f8f5ef8b151c1d856b68f67fa8733715c6a7b1b44decbc45f5feb0922cf8dda125209faae65f887620c63b7aceda27d1c03f56d8e43cbbe3d0486ec6fde318f8a0ff8a7863a19ffb254190f8cda86724a553ef00990ee2aff00e525346f5a96241ac4c8ca4175b3260f3a01293e207f7d5fcfb76474f0aa8266238fc6f4f88c818357490fba72d20bc9baf003587bef4e97bb470d187127882cfe95005389a6cdd77181649ad869f83256604d2712507c353ed04d3c3130a46c88f00adf21cc5d4c9018d0d9a77d05242c9b9f0b0e67012a3017baa6bdff3691ef4bc367e303d9141169f271fc4098222ecdbe5b231fc60ba4c9c4a5e193c67dd7a87da089f75f121949996fa1f991bed10551706e072abb0bb7d4f02ae70156913924a71b95f6f6a188b6006421ab3781bd001219660ad1576cb6ae70ce5ee5968672bdfb5b04926d125e4655924445837d8d171813894e5bf608543e8f1d3853c40bf4dd3f6dbec614383101fed99f5a01ddfb063586fd7ed0b26f40fe54f8e023ecaab8279ac15ea8ed63046382f279d7dce47dd5b8d8e56d9c99c05f427dc326c0b9e5c14c826489e5b6218af154f833de7bed3758f57dca67d5629b05889899225d2883e4510db2db200d9c4effbdd64b7b2771159e5eb40228bb9e37bd2b6e34ee7610f08c6cead879dd0c61420937b117d3dce2c56159333d595b7c2d78f8c199535c9f2126d402251aa5115cce52b3d30e12610624b6e251e7c0e9cdd02bdf137f96c9e1dde78f94cc4f08e3ad092501006d03aa88c27dbbd235a6ac3e94f730f06f8c9d1ee3bb9e1f37ccef4391b7380ebb379d7033033d35a6661110537a0ffd434bef75f05f80ebf89f5f07515111a667df964cb5cab84a402541d3a36330818b4180831f9ce72cfe19c8ef8dedacfc96cd69344b7d5a8c84aacf9db0f224718b56543b2354b80be9f8d9dff9fcd06af2820923967fa59b4f2d7e2a2381fa80e0f46c63c2f8ed2181f64e9e99fcbd836ccca51afdce3df244da96aff7955b0643d29378982dd8a6b3b4568799f70b790e8b54976cc709fb2d21cbf4562d3723a9879efa245709249129e68a2e9778c0501a47dd10205f2b125dea9e4d54385624b481b25a61675bcb32b7bc9ef3b864ed43fb2e8d77f089de1c1978ce72f2eae37e0e4d49d0ba7790bae58d18680b4028c9d28932f73fc685eac7db735e9ac9238291482b9c089b78bae73cb37a93fb2ddbaa8072c37367259ce6f10b492fa87c6dfad183cac987ad0529df118dbcd8821f0e479612eaba49c8ffdd94666b2eb773e1432d929183667d44ba5f80aaa0dc37e0518db51a80b55ece22af2d77f868fcd0a506c20a67eefbdb36b70974b8548376b8cfa5f3c0f13496c3e7a05dd919b952a8bd3cab308e8f0cb29cc9207c37df990619b167951a62a41926e4057432dbecb766650d5fae9004a9ec88d11544bb0064ff07a5665f3faa59fbefb57e610115618960de323f5d3bbc534ccaa97850881003cdbc3d21bd308cbeb1dd1779a5581f63bbff6cd9b9c6f565027615e285797ee6dbdcaee6e733beeeb59f2c43656e8552a8074303d4165a214fa918fdc16efeeef9d950363db441764122c60343c93a31e11b634dab351e35fad2f2d01930bf1bd037d738022a93fd06f15d81b275f79ccdad1555047bfc6cfcfe862e19d181a95c0279ce83e080defe46ac71a3af4855ea4ddfcfb6344a53f3a2e4bfa29648757a1eb9e5c9c52c1f40c7fb2da5a025cecf2a06c023fccea567fe521d8d9978ffbdce122923d63504442a6535f8c86a4b19f5d8c49c27076a145cd9bb1f2f80958fc005666be5751545624d5398b0fad8d191cc89a05396fe37b142c003dc77a076eb0e9ee2002798720ce66336d138d17ce5d6678177c8ad6f52a357f50bcf22c5c071ebdf0b268c7cedd61bf57a2ec5d607dae30efcc619373909684cee288f236a68b77e23c1680ca5047f47912a4dcdd848886f1dd118ddd2c58295a05c81b2a500ce8dbcfce65a6704bfe6a1f9094ae7c074032017ad306dc550960c924d74cf50887deab5c6ea8eef44d99043b3d53142dc42d8adc722263f1d43d1d0e68a233c25b97f38b61b68b6ee715e4874d03e70226de0b6b49c3ecea5fb6210e64295721453538d187b3bbabf2d974d8f7f38abb129d0703b8ff4ed38fec434f3857ce49db3d359030d633b02f219c0cc751f7499904c74185012006adaac4131de844287bc2e7b46c80a4314c5a9f61b41806a2858ed8e665a50d296358c39f727466a82442f37fdd556ae07b615720c0e9e7f4a55241e4941ca346953fd2853b6e8014c9e9e1b78be4a568be8480118cf1fb559c6f0141a54cef4311b878b7b41733ff64be58fe136ab9821b0953a2abab81e1a51df19773bca4930e2d267b9fc9492d257028fb72536e0d61a9f2dc1f5283c27e668e07da533857c9e2130bcadf6b23dabab588abca7bbb35cfe4ee59b768da6e013a2c11c65d2de29532726082339347db743e70a0d7ab17c28d62715e07bc451106c5d6555aa4e2c359b5e057198712ba0a9ed149321f4bc4debde59414ac18240255641069b6367ab9b15349d4f09bc1f6d0a927c6a4607047d45d454c23a4599424c70d3427dea15b496889dd5599b1085ce83b1e99af2613e38a7bb46e879cd35dbde6643535bf2ea61876fb76d72d6755a82b1615370aed8ee6b99fcd36645a4dda77045556b16683be759685af4be6a62a38d156c296f3b6240ad8e34080b739a5674b6eb3ec97ae127a6dcb41f7392392726126716e9010c2115ee8bbf6d0dda79d7d2d2a4f7fc7f45c6382f476f6a45ccdc04d6a1de030a50c4bbf9b67e43d702c3b5226e421e9f35e374c5d909e158ee34870ae37d87359f4be9ff8895039e8d1a147e233edbe537f1393119584b7c5ea40e03af700df603e8e5f54cc09cbae0d97a150ec56719ea421dd292914b9cefe90fdf331ffa20a9f9a7831d1eb667cd035acd5e360f4c6faffad8da3da9b0554ac0b1a3874a69a6e35135cf284dbe95b03d716a08722a1b2643b2ee895d2e8ddea05b92a7da6020d482064206072d175f9fc2d4098e02baff4f0f29bc99ed2b6615cad1ceb265bf55778d623dcf4078fabd22062da3d1944b81f35f40f7c306264648d1bee689f51e8a4fb8f0ff6ba2d92e5d1d20e0ec91c515a13a1fd591dba6041ef77b07c9c363d4006b01f10b8a025d6bb9c5910e0dc2f111f5298705aff0aca5894310fc5c7b19722b78641a7c16cbf2e2b73e0faad6f6a7b0aac997dda79a008f011dccecdf3dd607bae52aa895c74bce32c98b5b70d0c9b241be7d3cb0a0cdbc88b19001ce5d5e17356781b4f7fa3530184f084f3163a2398ada27bd966b8c6e92e46203a06edc8a8adb28fc3f0d70c54a41e3c14cb53b3df28a4b2556fcdae169b12cdc2609516305d5a6743f19955e29684ed910f600e6562700f5db7b4594390067f075714d94665e9ee0b028152108df0bdccad92cb5b74c1cc77e58a662af6f0e56b673926fdf6defc2cc1b2c8fa0fb8e30c1b167e1cd33a512a70ac1e81334006e6481911341c33a2741e59d7ef69d467b982f3017636ed6973b3e1581218cb9013a447b02f62813496a388ffb5c8d477969c867406c1167df8100c7e393a2799c14194d68d6392673536a4c3bd81a15c757cdbb64a4605a8d8a97cd7cca863f1f508451b1a505464f8afb9b53e793a9977e01b22f5a1ebaf1b4779753e315ee145ffe1382155fe760241a9b57dea5ee50c8832b5a4a91f91624ff23b416e96526aaa5f1ae2134e17f269a8dc9ced28e920c2f0de0e048661a5b1a4606e47344b37450e02d782d4780fd188598f12892f9c166809a75f082a6bbe5dd58aa59198d00d2599d84bfc1bca31186ae50c118569049d278cc6e6369f54bcc7216411a89cc942364097f03264b79a366a5302eac2de0e3fb04bc82123709da482912d8ca3661be1e3b4222270b0c742005504d47a8ef873434e5e484b23e21630ea656aea2960d4dc2ab907cd896a60e698aca24c4fa2b8d48bdde92fd93704b043460046c25debfa12e4a7fb0112f0325799c6b37b86c5febcb72acb71b155aa7c5ab582505c446464e524e2bed3f5b209697a0e2a40a835fa017192127a93bee1a2b367721086c60b0d68a86005e037e6aa0732b204bde4ebc4877c6753f47e4a2fcc1386b1d60e8bb6d2bd29329db813ffddd9a4924d3ece011487747904848470988adde7db9a01f98cc811bd23f4d323e1fd2518020079df253d0dfbf2acf39db5ef08bc32795a80862d7ae0d9b2cc66155c76c492b5abbfbcfc517790d5c2830d88206582a5ff711817d85c7356aada9eca9ebed680afbe535ec50ee0290e7d0b3476bf8e046c187c164f3b2eefb15f38b646f9dd4c1042306a765fd0b1ae307d37d152673a88f042403aa9481d14a8f54576cb769434bb24090c913ffa39e0a6d5e0dda80518c479562ff55c313ce4275835057f05d0d21f9770c3b19c00dac08ef2122531888e9d8438e53e017ace408b070b74baca8869eb4225a97bb3ed958d2a0ae3500fdf4531a23d1997bb0fb7923b7bd139fdb3c5a00509c121e5da12c44d1829c1067a42dc3d7abea09b2142d0936457dc4637f8b5bbe31e27b5a919aebf4cdd77e843cd932e2e4d614268b4a0d37d39955dacfab19c605a2764fc758e08b73078da522578b554e7c17c8c83fc45a415987853ad991e2a139eb789fef1fe61cb7d95a99b72429aad52ba1f3abe267645276009f4b54546f04413d0dfe57c4a544bf18021417a8920c355eab53953eaf7ee65a5db3370f194520abd2fb99584156fdae8055dc892e55fd72adac4be9fd457455b66d8c8f371d9b3a46a86f42c061dc5b0541b858b8e31ecb57e761cd1ba01f9aaef345ba33cece53433bb3c8f835242ba834616d06c3b6d75969756624281eb6059fe3c60683ca211358c8d3c8f6399d720588490fc59e3c9178397c4e2cbb7facdb1666f7c6eae04cbb08edbf8b80b86263dc99fd7e0273269a40bb6c44c8fe59e95024799fba17a3720d378103a7a002d68c99eaabb23330b586f5c2a1331ecd5bf799ed55ef49e770d4070884a2f7f28bb7e4720d4ae2b49f747090d4f04a483b137ffe3b9f8339426f68ea39b03b4f71b27fd0e6184c0ba8a99e2c800cfd6a6ac818922c0f8b65aa175826fc317dad0b1e4f03602e1ea331a52e3d6fa3e69154d223b16ed8e95df075fcb6e7b11dfaa8d261a8b75cac765c81139480087d02c6e66ddf58dbc86d2b6072136d7169804500c0f64cec47e84f315e1ed4e15c44b01a7a97773fd9d916738ed06beb897de8e8658e199bf6c3dc3cd97bf767e79a7291b937f22e97cb95b314791e992c9eb325c32c8ebb0a81f5073cb783548755cadf758773fa6eed12fb869ddb4176dbd74c9a71a46c44a88a11bb7f23f279a6e2919ea6dc03325413ced8fff3aa66ef7ed61f64af0a73e2cc1252a7906a7ec29fc755df1d74e8d1ba63dff436cbf53d0f148683da034d88baf31b682c51b9ad5174c1b9603c7f756942ce763ecf557acae10200ded9059d9f2f337bed276055b28a20ae621797bbd57a992db8961e8ac8df332e434583b3fe3f9848a6093d58279348fbab0d6215485e6755cf11c6cff5fd928f30e67f9b908102f7fcf7cec99bee70233a6b3782d58d3cb4b553e73f62ce14a15c3c1e826ecaa61148d3511ba1084db588c10aa385b7b877ac572e0162226b64b11bc4ed455cb33819dde332ad2ea60d26b349fb964ca38d87ebe7d49ca94f1c1057c85cf35f9c6ef31094534a64e24f561ab9fbf706cc4164960c286bcbcac5d4e98d2d19475bd2c7774ae211a01f93de9fb664b5b301a8ebab9f62158138fdc32f3b2374f14ab136a3ba839f7f095942ff74789b7ae0dfdba0b2db177ed7d651ed3b363bc96108cb108921102e2b31a93b1d6452c253188f923431013a283577fa344dc500b3ff0f1740d1022ad282d5a11e86bed58683807c97486f258cac3f8ba08eda568aa3556335a146499bccf78f34d5721963a08f3d000e380d38247a5171cc67030b73b12fd16642fa01cf1e8097f1821ec9a6e0b88757b1df42808287419b862f25aef848c45daca1d03d0e082bca82a1967176045870f008aa64bd119bef934cc987747f608e2077dbe13b7fd8ad6924fb3a5a22b9f5a770883a4521c7184d2e0e0c25bea6ff8d0f74ffd2d6ce29272ce6339db953b3c96d02a5c1d0de81d881ea3bc703c5f12d0f72606104964397818d50376053d220e1e4009c0d3a996d43a20d85a7002c1ca91915101198bd5735e794221267611d59379d5203ba3da6f9b502deed70cc930669ba33141e8914c000e264696886134b63651c33bc30130f8eb92671229ba7cfca9255faa55164f667a1594999ef477366833429fdbb7f4070b6005ee6fc73f3538c4882694f5bac8e7e3d5a5e74f5711e348479e16fb4c00b4bc9083548fa381d4c220f38bb53d0b540fde9b746a7e5419580757c78e6ed40a83385a442ae3c425205213fcc9b62721b4b2749bec6d56993b23c597dd3db0de52b7a6dfa22a39cdfa8713211ff1b98b6d7cde8aa776ba27348a7dcd6218c28046cace6779f284b5d7f352b83537e484b00bb3bde41af46b105fff152a1400f0ccac7ab5a340428b89d4db15f0790de0a5866933abe5564ec7de4a0244991fdb05a2b8006ac4cea019f36e42e8f160c2c084aa8b71ca41f5de42aacbdf921c5be7be8fc4919c4bb7c56a8f8519e3fb08dda2f123c8b9dcc80949b9c7788b503ffb80ce41df866f8516bf8b2ea2722c1632ce0854c4d7af186e40e8e55962dac76a5977aa920de7327aa8fbdc29b31aa2118622e17d5112f1d0937432a9b9aa639afd5441957f76402df3fd0c47b3dd0163e7021ae659c12ca6b21bc018e7b026d1bb406fa75037741976b19ba2bfdd83262a7083341f1469b5e6390604efd157c9b64006cbee9a9f6d11d8f19e896375a8e75f40d6f3e447806119b95d4886d83228caa97359b04de5ad15793802d29eaf5379ca51aa51f5394f8226a34fcb729a61b7fda493146e6786f916e51e08f503ee0e25f76c0676380f0d3cebf4708fc7644c1928fe1b2aca6bfb0bf405b65de3b28f381e4d81d825dc0c661c01c58ebe274f2b36a3212e2ab4d4f7fb70f5877484fd83a1a563cc749916dcbce5890ef6314aca041c88ba1430d9c79bd7ac4362da9e0baa9499684d6b6f370622bdbb65ce879db96898e56de8afe112c75fda7ce797ef0e83cd113d8b663b00763028ccb2a66995e9e205919e46e9923ef2da929938102dcb538aacc1080ed2eb33e62abf2c4eb5e2a0b1cc67b47458a4ee9d20b5578076af8718f96fbcd42c4453c79a6e6818241fadb1bae032bdb9da1b32bfc3aa856edc5d6e13a8e4dec08d1d98fb03df2f711d269f3286ed394ff8ce902edb91435e0d093f01007e00fcf07bfb1868d5cc41b768f06fca5d56ad3c349d082d34923763de7478401152887482b80662ebfa9f6261d64fb4ee8d46a47cea5e5c5ece50320e8ec97793a53e0419756b500d85958cb9b6c93afbd8813a1eebda4fcbc5121a7e5928d0ddb707b4df22fa98f29ccef861398ab41b8e5082a5fd85f0c634cdc28598f4545df39294b3f3764babc6f0232db5c9f0aaf3646be36da3bc453d71ac40a11b87029b380af08dd38b5e8772d4c8a1611f81f5736a8a68aa9cab234b0f428cd8bdb6a5475582d2be6457dd70769092c3c4d7b1a6faa023ef7f8e4d06b8621c4750656abf5552a87c1bf8a1a4aa501b466254e7326e8c6555aaf39693495ff8f391f63ea14d9bfd36d047d72c027f2c611b10f7e3548ef8cc2603a5f21c5feee0ade5048b17235875bc53a50816754bd0340f0064d7ea128ae197e0ee1f2e826f9ec1109810adfb2cc9b60490b0876a67b4e3815d43fbb9d2dc753df9f228e1a0645e900acb66f45de210172890a936975820d8039f5e93f4bc8c3897b2b66e0e683e49e282f37c0b17b5f406b2a368730e26008f6355e9596c764f64e3596dc9b8a30f135db96e24a8e5919cc85803e380f35951404f987876a309829d00d0a56612e27d908b4a6d233ab7d0e84184ffcc4051a52ce45fe7730e480aa17fdbe146cb7c391b8272f41f7a031f96e6502c1ba42655d08f46d3883c6d2a6768a9927079fb8a2cde2346eae4d257a8a1088fbcf7596c9e4cdbb1ac3266885e0c17d4da268e3b22ea3905888ab84fc1d80b244539f1a8f0d3c68dc5481d611ff4f28cd64b961db2e7688f5b73e17a9ea187d019a9d1cafbc84286f65d0f3ac5c6ced68449e6d4e16fec6451c5e706ed6005ce47eaaf23da6bee3f0e85b9f1feb2c560c9a1cb150df69cb8f3d08c6cfe8d060899f1235b2ee95d31ddf2c1409fa2ec2fa67ee65d2df26580a344c133a2bb111252e825401c86a19722001fc800e41d37780828acc73a1375aac2bfc56d02a1b57c02cc01fef234472f397f81704e3e082abcbfa6c6fb106f9a3ff093dd603f086c2b80e987a6b45ed690e2f8640ac2eed2d0a46106b05c16058999bc0153bd64d84c2592e6ec714895a973f6346029414033a5ec2765c40d855a503f9594dbcb836f0f782ddac1138a3a18c1ec762a9708a0254efe4431b48cdca032c42687673731dd80db7da7b8fb08de5cfd0bedbce85a3e316ac65151741f14ca5d3750b7b3d3b3ec941364424d97bcbbda59432c9246545076d076d07eed4e7ec76da0dbbf1a8bbac3bce786473f49ccdd9ee6963a3208a7eec6677a516e76e77977d5dc6c002430861cced22cf095ff017f193ffcd77779f5f37a54bf78fbabbfbe7d58010e2762f62423084104e3b63467d4a39a54b4f3664b9d309e784744e3827d4c25d3a75af743a719f7376d09db8573a7dbcd2e9844ea7d387ce4aa713af743a711f1f77e25ee9f4f14aa7932c7a832b0869a0d6ddd229c417773790efc72bbdbec71871224e0c41ee586154cd3969751c9a0d14c9001ccaa6676f2f19715eb031e0f0102100fe9b17221ecd0d0d45744ca744707062763b9ac873333bef686e349922ff30d20517a95123f2d88fd25247459c488371b8a3121c196188474017fa69129126ea401afd5107421af26550f512102c4ee53b8a5fea134a7ea90183846c73fc1c32ece8d3fcf8341891e3df5079e0845c97c8f5a926536d027890e484cad3499e109e0e800025ac0442c210678169955160310692040653b022891d04f9011640db155260a1891318d1f30397ec4a2015b900d97b8234911d89a4a1a1a1b9514205d995c8fe36c32513cb6b33b22fd1823c82ec5f23069806e49041872afbefe8136422fbd340810a04657f0cf409cbfe19c8aec411b26bd9957092fd7df46906cd136afa24c3c648f68f4222cf91ec4e24e230f143f68f44f80e1345c8fef1489f2015d93faafa047774b0939d07d93fee4087ec1f95f409ae6ca61005b05304d31113c10bb6ea41043ab0524230000b9c22411820a4a3faa1a504100cb022478a20543b3b47e081015704e51d26371b102f1fe4e9ebba749040a2029c65b88384121b20d113041254602d24b4600112449949aa5f9c60c2091dc46f5142933dc31d2776f2f72fbe046c5c82f2a58635e5902e3920840fd31290300859f6cc4ae594db133866393a13824eb7a6bf9fb9bbbb7be6d7357777f71b0f8766edf96b1977b1cb56df7a7066c30524b613f9d18fbde4b0ee87fcd9129b73ce88531fa6e79c73625b0ff0c72201185353639f3ed474603fb18bdb80add4660e755bcf3a60737c538ed1658c5d8bc43410bfe5bb440bd0e05afca4e4f7f603fc79053cf61ca2ba0fe1e3f8d88a04ea5f3f837dacfbd16fffea7e20d9d16fff87fca22ac678d9ca792cca89aa0802d82613441ffc253bc6bd48177716980cd0205dfc2d97e3be7056baf8cf280305fe609107faf4997c441ad75153737dfd1aeced5f1d97f380dbeab5e731322aaf2c306129c8c1dddd8bb8aeebbaec13bc480e16974cdf1294bf7fb13f5c38e79c2f35e6ece67c88b144f5d349e98c10876e497361cb676346e196f6b08fd87d98a694524a695349ffd2c7e85fb652dbdc1605a52b37f4e953f1c00628c556a2fae9afa8401b6e71da9da07f3da3407b9409b18364da20c8346e1163ec9baf712e6907264aa3ada41de0ebfd8340e567d3690f94f4255703c7445f85297d687b7a249c144e1a7bb04ec7c6c2110a888230d2a845a6d18a18844ce943dfd11eb51cfd4a03dd7c80bf48e9d30f864f9f3ee893e9d33e457ffa1006b4319ffe4513a5e5b9b00523811b5b9100fdfe1964fffd19e467df7fefed951b2b3c3ac3bc121f7b18d3dc4afceb614cc6adc4dcb658953a6cb5b556d833b8d77ef633d0a79f753f90ecb8dd4afcfb6325762b3ab2bf9f753f7c2099e107fdec7f20d9413feb56e2cf0712f3c37ef6f777647f3ffebd3f3b1f188c8131f661cc8d9a4cf7e0e18098fd7bc86caf63255a6e256a72e376b4077f5624903dfd19b2f9f77facc4b74f3ffb19eed7eec7ececd39fa1fefcd7fcde8cab924a18733918036364062ab035815b16484bd7812db245b6c816d9225b648b6c912db245b6c816c5872d97077f5eb63c38727609964f866cab9d254f72e3219fd3f81119e19779b2c52245fe5a240bee4aff4a7d9831acdb767dfdf5304dff93f6d3916bc7a388c308638411422881f4f41ebc61f6ce1173d63972b13bab049652ca187470e3c3dcdd57a7bd588772fc89f507d2e001c7d8c187dd156285f5d825f89345f5672872b27583ebcf1503351cfe4bf027575a784c937680e7d38f346a3aeadf8d8579b42948761064b7feeefe96736769cf9f72d3fd371ffcc1a1fc9fdd409f3e161bfa144f51478d7c6c2d4ec44418ee0c81a6a80918ee0065403af80918ee00d5e4fe4c052b77770e86c01a1d13ce7c209356da7d25aae1c84c32b6c0f4617bd6b637bbac3d20b63d6d663ebda1f3ecffe25722b224a5ab22507b92e5d3de11b80912d4a43e4984489fbec892421a15573d59fe27877c9047b64b93e9dff35e5ebec8e2a173ce3929a6efd4622ba555d92b7e7e32dc21c24ffe4c3f3ad92451912732d9a28585504927083d19ee04611559d147f6b4d792c90a509f3ef983aaa9ad9fa1050449548c41d5d81510689e340a45c5a44f70470835b93fb2e894722581fa14a9c8fd72d52b198984cce953aa4fb2a64f387da272c84d118eab3ef1f409eefc0c2d20c72947b0454a295dca77e9b78656ffe272b81ea3f47a88713e80c45c22904077bde468f7d979cd4ec6559fe44fae79fa34bf27fae4f8d36a4f36517b32fde407fc99be6ec59eb8aa0f8556b266b649067d8a45c83093b8191b9e9e51cf903ec52c32cc989bb11972836f88e85314ca308fb8191b22724839407d8a586498376ec60628082588489fe21519668d9bb12182938293a44fd18a0c73c6cdd824d129e928e9530cca305f6ec646c9cac54aa84fb18a0c33c6cdd8080dbd188234609eb161d2a748840cf3c5cdd8b0320c8d47cc33362c4803e69821133228cadf2c923348ce21e937eeb3ce5a5dd2b4d7fdc4ae74daeb4f02a6dd1775644e0df0d743f2a6077fb148a232a12189ca7e660b35ea4ad22e3f1275c59a2fd6c8d6b401b44a90a0f21a470f17f68936ceb57dc2d6a2dcd66f0959da718840ba65eada3ec5f852e3bd5abb6fbeff857176b3b3300688e3d0dd42dd1d21b616356dfdeeee865842d143c9880b03a4d1859e1d3dba30e505694c1c305b48c37d4eef2774df0db685fdb31c2710ee67e9ee0d616b71d3ca72c02844b853600d0a95265e9670af2dda5dba4b6babbb7497ed03d3bf6081ac954e57c97027892664cd1652ac5aa0ca8114383b4811847429bde7a4b0096dcf8d81f6a494d1bd2d36c1873bdedd33a248414a395dbabfb40767b47c52ba944e6d85912e50ca39a3e5a56bf7abca775a650b8b108e6f290cfee1185d802fa5745a91707777ace4561e1c1fd3efebfe152cb998bf95977ce5cf5ed8a71b66eeb730b6ec763967d4cc7a73f59a19f77573df7440739fcc2d65e7ee43e755e9bca4112655a062747a74f7b087eee3fa347907572d355e7899e18de8acf5c2bc5620d7f7899dc554c2d65daeebaad8e5dd75612423346e420fc3deeb3b867d20d7f70eda3aa90b2d299deed5d238804e298227b4c6455a2d33eb2f2f642c926240e8625d489c478343efbad7ed3e0f4078f96031993ab8c230ce192f2fd478e8e2d190b1cf3407d44cf1d6d9eec2302eda2bdbcc5ef6c22e369a257c1b3ff43cd79bd18bc445e8321a594da6e6ed2fe662be5b06bd656f783402d239e906d9757da4117ad7fc805f344e20ba0bf247679f693253dbe2d792fb61a6c9441bda451b21edc5547628bd35ea910e6dc22f5194e0c67fa9e1b3448b5f0189ca400a92d06471850f8d504c1c821424d87c986418608042d9e79c514021cf2676a218c2b4440e0d144d703b501c21cb67e9d3ff00069049963f8042962c27bc541c2cc1081398700fa4b08326a46864d3430644ce260410d7879406031eb0944da6a3c3f5c3d05dc2fa3084f9c0099b9aeab9a2008207561182e08166c70752f86107d50e3ef4a052810f3fdcc8a007213dac1c603c14b5e98994b52513cb8b1bd36572c410121cd1029d236ad08323928826531234785989a5686a2f9ae28c3109bb24071fae14fe4a570f76c9c5c3c5c375dfe1d6b2b21ddc28dfaa03fe60900ced750fb434f8832c1df273f429feecb21a3bdb9e8c4cda9391157ba280e3b74aa8c2c9c5cc390062713d734d66fb0b3515d8441556d8c4f8c0a10e2949713860d6be6a330a21f2448bf438502a5431483810b3cab7d6d7cc224ee9573604ff1783646b3cb0c701f3b57130df1b3b766e4d4546e53be6db19ed7c888a237bc8f5a1e3401a54601833d424460de561fa5a087158913f62c5d4a118d2fb58911f853842958a8142b0620a3d313820b1bf229f1269c5d02439311fce17cb02e63a8330d5ea39c0dfb449f9faf3a64f285fe7d377f1b3e4822bb968751231393fd23c4aeadb205cbf53b753d8d52929b38fb60afc491a2dcb324de67ea6c9647f214ce318ccadeca08f1fd3ce476472c54e0e7e1cea12866290d807121333b78028c731fd474110a3ce5686f1df24ca75163d01513aa4c8750e21d72c72fd89e4bfc944ae1307b94e1be4fa7307386dfa7473fd2904da6817cc14cc207235d518b5d65a697d98aed3a64a2d20ea25aa749fc94180b7c8f521d45e9890aba4b14fe0d8d3e483ac1de8902ef53bd97d266d06fa920673b011f0d51411f0075bddb16fee4e665128d7c749602c7f9fe1bd1ca77de894cb20d7a79da2e29334ac692369644da3f05b8b65181733fd5490fa5e57906b77d306d2a86f99e0942c6a289fc2f940b223e5694a57739055a8420c92c63ad5a751ae9f4ac763a63b7f1c307bedd5f78fc1cd68affefcc1712806b557fff360744038b02efed4875c11dc434850e0bee9547bae835f7cfd8b5d7f43a3f0d7df409fb2afaf43a25e74d346bad477d14169b18b428ad065fe9522dde43a5bbc19b1e78cb153b97a8e8dc2e180f92a42ea6c3e067717e79af62251d3a69ab0ff6c9e3ac09daadf43fa34fafa4d24c2d05fb5975aa7daab3fe27a487b55eb3e9bb32692eb5b205c7fdac8db7d164359df716afdd6220085b2fd6879642bbfa6cb932b93c0f13f8701fba32e94aca1c6eea3f9ebfbc7bf5ccd50bb2010f3d5458ee6a7587e91d9f665880b5b3ed3c7dc36bac12c2f51f07548d415c30b996a38b05cbb8734e85b26d83b1f4876d8bfde07921dfef67d5c9d8f8a8325184113633b1f56bad0f7b8440e4d0c8c41d281993f165adafbf6e86f51c0fd2c7d6a18247352f609ec3f9fa55d647ca1013b684caca27f9309dfd6419202cb2e4707d3de16050cff83aba6c209218c085b20ac075729b2144659a2e788d50c321d3056a4c80aa6d00321787a90cab907362dde8c276e80b8d7bdfdea68bbdbdb9fcb90060eb95b59eb25b6704bcae8044465a52872472625a0f68ae476f7e720aa71a27ce73eefcbe2d792bd947524aab7fbbe56dbf540d7bc05101589e29322727fb437c05f479ce8b0b7ca0dd9e065f931a8bd51965d048a114ab97d386455142e18b3d1e32771f8af8ffcc1a4bf31289348230eff68347a12f745a23c7a38eae28b92d193b627ed585193498f474fda9ef4b7667595f5e417ffb56059d470cc8f99f497c47d1130e93f5366694ffe0af0e75d425e9a48f2ca24920e7e4f3d00772ea4f31b9526b8861b626e826bc07f43cca4574102fe3cccb512ae75da9348c0dd726edded91bacf86489449ff7d2275df9eca73a80a531d686334e262a647d0d15f6c7447a36dfbd1b65d2ac0a4ff5cc77388720ada8030636f53570ab0e3b427df7594f489f4f27d056d6c2fffee901e937efb7b1f73f4459b21fdd66d2e9ef4518b00e95d5cccbd702fb4275d745e7bf431d7819871b7a33de944da93f123a4e63a9086fc8b08fe5aa51344946126fdc5b218351992cc9c23bdc67d9db57722fddbc3f48b776e7ba8911ea69d880be913cca5ab922ef2efe8e5371018bb0e0b2c984c18a7a08bfceae2257e59eab88bfda3e6a2b3c1cb38df51e67d223d894422919e8328d7812ef2494f8a21fd9531b694731b3de662cee48fb84ed29efc9195d7933c0948facf974879fba4cea6242aa5939d0c01c65d0da4c73f92a4c724eec6087776c4c12cbbcd1c66533d3c57d7e9313b9fb1e36a3590917421d476659f10616c1995706b90409c6574efe4c7517c37411ad663126e86329d634b8b0669e0689b1d47a75d191bca0d768c4410aac2c72f0c05f883ab8769408efbee6fb31af2457ad9fd62dcc6797b539b9172f6669cb767b1eba2dde740727b758576387fa51ce5123778dcb87123422b514876743e907c45fa67884ab0010f68fafb070e1d0e7389218cc4c88ea63b1c64bc809412626b51d4be95d259bc7329256c913ff16fb09a49e9000b2515c3300cc32e2edd8744fda45b2c685969036d408b311c9f6b7dece7df4c9399138031d7df58e4faca15b937cbe2e9c6783527c309866199c52c8661d85f8b59ac5e4ca85dfa47ba5c2cbb1986610fd3d9c55c50a4e6c3b5c3a5835d7209b155ece0c216e0071d629411c935611d2fb91fbee4f89dc527eef51b2d16b831eb19324a01e3d070fcccd81b8e1832bc71218dbddd780143f72dca282e11d825b60abbc42eb1555c422e2157cd25e412c155133b06517385a0b5e8337a6619e30f2a593cc950890c77b2d0c9376a38688edf9c0c2778ae20f798993e8134ba9b3eb123c0df4633379a3ec51b33c78f3fee2fffcb70369a1804d322498b6891cb0e4a26d82ae02fcbfae42581832496dc0bdbc32e8b5db6b978efbdf1c61b6fccb218b3786f37c39322fbce3e07b8fee7c1ee8e306b82e5d7bf90c09ff7f13d89b2d6629be95fdbb623c4482ded5d2fd046f6f46fc623b60c90e9bbf680feecafcff4675dcdeebddcccb5f2881d883976182703675d6509b56ba173090ded41a07cfd25674366cafa61a4e4a08c96e57b88ab04a3f855c8a08626a60019fe17e0e98550c2bcd9e992092c8864ba592c9bd483bf2dc36f850cb717212004b164b803049e3c454d863b44e849c97007082d558e9255fe0c5749d4206baadc4264275dcaebd2a59cfe73d659679da52844c621f3c8cd24929b883c6fdaeb160b2c14adb0428f0c193f2c2caa95151d1595a11831724ca6201830582f5e0459b970a12a957e52525a28283d24d20dc639a351d0b6e1689a4e96adee1d823660c61ee6191b16b401f3f5306f43e0cfeaf8734decca32b12c2a447fda6b0a944ba6773b27a63fee348832c18ab027d810d60423c286b02649e0ef0ec18fb6be1b1424747f80220c58939b036d9874746c4ecb23b9adc5d8f4de4ba44974daeb6f31657f539eb3c392f08898122810b5a0d01a72c29c42d29f643417507705b5e7c43dd77ab1dabb7ceecd6e184d91e5cb01333301cb975f69b2ff6de5a629b24f6e72669309a1df0297430b4f80395b784880169ed2f92db4d0420b2fb9d9827b0b2db86743329bf632211609fcd1564ea6ad3e7d9745d4a78f1ec9fdf2863229fab01e9f211963d2278cd5a7ef0ef9441884f4a907da803f9e5b67c50acaad211974f9604732a6b24fae9e9bef0eedfce4641a19ee4c5194e76cb5f864eebf3bd4f2274abdb7df03f8cf2480ff70005a7f2f9b246097d7d13dddf1d32fc000f86b5bd2e56bb4e7ff5f3519972e068fc3a596440da0fb4c02e85a5d005ab9bf8593e104d3b7dfd29203b66476e586771d03a50b8c0400f7c155c77d574deee7b81e9e9ffb6c13cb240bc96e3313a4499f22518699056e264893d61443f9bb433b5304a1e27d32849bfcd92128695464925b447d8a4ec830afc0cd04212aea229e3ec526649865703341787a648f4f9f221332cc2cdc4c109f1fff39d2a7d8ca30af7033418ea8a62a499fe21232cc2adc4c90243a5447a84f510919e618dc4c10a1a13a44449f621232cc266e260811393607a84fb14986190637130428e80a62d2a788840cf30b6e26081316c60aa2a44ff108196617dc4c1025415637c8ea489fa21619e6123763734495a97cfa148732cc29dc8c8dcf8ff6d3a44fd1081966146ec6a6496b6bf104488a28a288228e1c3972e4c89123478e1c3972a488228a28e2060b9b8cf3cdbabb1e6eaf2218b6a7434aef0efa5cff2b80ec28f786a125bae0ffcd6ed8d227fab33fe6e624f4688b53da929bbb628065ce470ee678448b392fc0d1a62927c3099e4fbf7bf69cb355d3c89d7fa1500d1310f6c161624b98e56bb93a38d265e2d34d4997ce9ec9b4719167f526e993567b6137d3b61126a1acf22db97801c31443658545c60a2c3cd765d97fbe2dd90694e7b7f8b437bfd3645a2da256006e0032cac97c53d6ae6ea502feb2562b236a54fdf9770019e53c93b82f6b65445cd692383795b55aadb8a202feb016d6c2885ad086cc1325aee26adbb62dc66fdbb66ddc6fdbb66d307edbb66d63f96ddbb62dfb6ddbb64de5b76ddbb66ddbb6cdf4dbb66d9bffb66ddbf6e2b76ddbb66ddbb68f495cfcb66ddbb66ddb564af98dfeb66ddbb66d1afe6d236d5fd264b66d658518cf828c182e8c70cfc20a3256626c294660acc480b1a11861598901632319c962c0d8326c4425068c2d1b1981b16577336282b1655733e25b763d33f262cbae5f2331bb1e31232eb2ebf132925d2fa55cd9bd7465873ae5b65ec315a8bd799b34a2d848c3b8a64fda4f9b9c5d94213779aea00d8903a75192c5ca61a95ebc7cf9a451d24ef9b2a84f2bbc7cf9d3287719e472c8a54f9f4a2f5f266994bb54e292c725932c5faafa14e3e5cb54a3dcde609c7c4279f9dd84a8f5a4256b86fa04a3a751339562a57e523c7dba2fbf8968d4b447721225597ee3f4c945a3a6b5c1f2e3933e01356a5aa1dc6ad2224a79f951a751d4ae704fa6964826e24896f425f6261b1c6972a3284bbacc37097d32348ab66ce8530f3cea713dae917a31b1e0d297a16aea5ba44abacc1ed9cb178026235759b6242ac32b9f9228acd54ab552ad549e188ba562a95813c31c73ccbd255198b5de4a49d4d56aa55aa9d675cd6b5e73b224eabae635af395b12755df39ad7b4ad56aa956aa5541265592c154bc552b124caaa542c154bc5cad3a6a4cb7c6b53f36b4aa26a4bbaccb716e3562acf7fc1451e954455968c9fb3aa5855a562f9cf84ed7c395a216bc96059e93e93a9fb30ee02b0955aa617ad52ab458bc132bd60955800c85030d58b12a642c154f3bb0b034bbd286129142c85a5f27c0ebbad124aebb6642bcfffcb05ab84c2ba2c399f051b55a64b65e7af5053ae14cabd52f24acd974169abd59af98b3cac186462759695e7afe460cf9f5c59d5b52a6955d4aaf06885e8499e44eda56e4ada14b5a9cb55e836843bd79644612ddb226d314aedcd0da85de66f4279c274654914d6b2b8b2f206c403079adc1dd69a4158cb84b530d6caf34d5a5cb537ff2a82fd31cca74fd8fcac2521bc1ea6b3ce240e66b9ead3b7b164cfec2c79286762613f7f03ead3fdf96d2e378523e79b4c18e3e469b1e9626ec455e8f56f5c8f986fb0b95db8336585e3733652d90267dff7592a4cc01ff6d75f4fbb1eee4300ba5591e77f2f99ba64fa1c446d2c4a23849700b26b24c0dce86b9c8d903c9f729187a54d37ae567165a170537366ad3ce9160544d99f1b15797ee46994ed6a079b499eacf6e6f7f06c4380e54fac8a61838a524a29a594524a29a536a0f429a594524a29a594524a99e0a6f65c47ee8f52daf092e1c796a13d6b313699decbd146ef0ee506587ecb90d90ff2d488e1e5056fc67f2ca51ceda11881539e04fab789258a4f32ac1192e1a908b6d92b8a62d6df296823663e58130c9169d72366235fcb8c79b5c4c89594eb95ebc76ee5fa16e8c119f0e45fff059eecd7a87d7bb1b5eb997495d8a7daa34f9dda10e0da15917f41148cfde1700cbfa1ff9172e7744ad617da853e8c44754abad03799308c91656ce993fd0a6d263519ebb27b21d5b7fed65311861fa08dfaf41b0878ca9e7e0b0151dad3118caf5315bad8cf38093d6bff72f631ce7eed5c6bb00e497d153aa5e5643891f269ad37feea5cb666b6e4c22b8630ccf6b6b438296bcffe37a04910431b0db35be7b2bb645780cdc7cc68796f17efee9632116ab3237d78be3f76ec514af944500dd10aa0a6699aa6699aa6699ae622e51f638c354dd3344dd3344dd3344dd3344dd3344dd3344dd334adf49af6a55249d3fedeac3519cdb314eeebbcbde310d12cd43e8573d17d316f9f524a29a57cd44a2958d3344dd3344d4b49d1344dd3344dd31e6a9aa6695f35194dd35048afa19034ad6a339af6303d1f73fe236edaf6b41f7150bbe11d6c0f4672306b9ccce436f9020558e8c09714420a299554aa2801f747f9f4bb5bfee4788c24572330dfe77b9e1dc88e8023507b30c2ee39b7165c6849105fc6b7a227b764b863051179488619ea7c963f3599197daa5fbb18f451089e4f236bc66a6d700d37c49c99a876a3338434a64a16f8b3de3c6013cb67d97db86b987f43cc157bfbf2bd17a08dab06ec2b02b21cc54cb508d4a79d515a1fa6aff91d8879f6bc50ce95fece315725388ff5c93106e812219c027f70f53954601ad0279f9a0cb576769c8c8c2db0ff0b95e1c47d46b91afac9f4e5b72af7dfe883d8d334402d5e149d39a8842c99aa82d4291a0106800002d315000030100c064422814096c7a922fa0114800c799a42725c1d49a3590ec528ca1963102186004080000000111a9a51003875e8b5b2974b7b89aad7caa94fe08db58213cb46cfc7ded1e1636de8b9d857f45c6c1d3798da8bd15eae562f8561dc1ac203a5ac6cd52632a0caa91f725cbe89c4ec7744e94b9181b89dcf3121fcacdc56d09830fc4f190fcbaddc8ed2f9e9b4cd009e49ea545ab955ff0fb91889b37c9241d725cac10d0c4be9354438779d041e52002c824a42718eb331150059d20175e5a70f22d18118d36670a4f035ab2056f5b1cf604e6d3aa16875fd2c2840868bf74419770abd730b7e70fcea5f6e217a44a4170d1b751ce76c3006be87d6d47eddf4528c88579a0ed4eed84265b24f89117a0c1a89d3c76360e6678813ae4e7caf3d3916889011f5a60a05df64607d21c83b29c31a5869529c9838e0685b0831df40c630a083d64e788afbde61f0713c18939e07f75c48c661fd3e749700579375511680b3b928c0c0bb7c15935a6b76a603c569739eb8072675ca71037782a6a873808c7a91afd7210ab6f7c25d7557d2d28600fa6fa2007703eee346ec0abffcc68191012032e897ef06898a680c74f545dca4cd1595baddfd2042627f3912e5f5fe4f1067f064b1077acb2da7dd3165e100fb2e3d9ea88faa11a038f4f017dda67eee82f807d3487367a6c00723f8386e2a8bae4544deb21fcce77169068f9771f97712e12d166dc38cc76a97488fa15026d2404f8f620dd2e467ee147c58444e66279648de65e55d2cbec7daf758793feb77b35cefd52cac9598215747a64c58790feb77b2fc3eebde63f51dcec2f4dd6b3856480d4170e1ef39d0c9433c1c0b19ae3122560ce047a19bdf69dcb1f252045c2699f83d8f151a38447173cd2575295b63283a4c63d7ac857a1ca08aae320191584f190f8a962935cadc2ce6638f80c2abf8f9e6d87197b125549d05f288fdb8c285ac325592b3cecf12f81182871ce3d0d0eab2386ae48a5c21b37c2c5ffb1ee6b489802ecd60984d5f4092d91079aa256fccbe57215c43d6f75a142430cf47892036302c84a8b2ec14a48a383b180c62a9986c0b528d1813004e441420f785a7468894991715c7efe9d36b5161dc14821a2164307c882822b5e13c8bc8293ab98c5ba75bb88660f50a8588463e654e9111af822ce1bfd8a28a04709c53a4c092f339a576032462b917b6349668ffb8fdbf872ce18c2ec77db9b9dc6328e17a2be74eb63961507c9933e8d75949ddabf2245c6d98e9bec92168ead225edcd3888f16ab99075f6715fbf937053e492bcb56152fb9653d0a9a34abcaf734ad87ab0d0bfcc3168ebd624e5e141f2abdcd12bbd21a8e554ab788fcc0f05ba6c3df8bcafbee03e893c90db80362520e8310190e0b015de98a2a1f17e6f54becefa4e4ce96e79b24b4bbb4cc4952b773ed36a90a458610d60969752135a86fea6947aff89af25892a273e0def14ee419cb9a9ab236d50d93b42523040b69a41f4460c8e88d80d648207934f9e23e2fe0a7fa6b2f02e42ca19a076adaa0d79261dbc86068bb036797921c58bb89599aa1d4039d930a421f6d9a4bc2021330c61c0fb0c2aed42e4bb680d5dcc0aea3e211d929941b099517f32a07271697d76fb07b72c838acb29810f22cd2ab3045c7d496640d1a3b0586741b75905d5a3b7496f1751ef22404d952e02f72cc14fc1e2d8d16807e78221d56d1f91254820e2a90c1213030529c298b76cace6150820c54081c0d0015a8774374151af1b8446f016627082b249b220dce6319f4c896a93fc0acdea7c438cd1cd47ba4a8486847517948422a8870971f2031402812d2042b019cda08d58f137c44ec21de9d8b48fd6d60409efd82c9a2a043202a369264f567ae2d44d0874798e7ae903408f30c5b3492da78ce00b0eae68b0bcc67da377889dd128c625547f60ecab455a24c30044afbc0ce50094c085038ab63a3d0677b5c52e32e392c635346fa5c712e4afbafb4cc1ade4a0141892d9650bebc2428d2a4773b1d7713797e866ac4a353eaa9c17fd54cf2d7f61d8cc85e3c00116972d7829844138073b7c39873958470be472622a9d9b26427d1ac89ced710ad5a2b495eca08be572b7c7ed2445a6f2fabcde2a92e27fc1f9a6219e8a28537af6ef23407876a5bbb93449e833e8f63e2ca4edb565591c0c1e0a0e8505a4b981648510e8eb9f4e471b58c089a84adf2ebc34108697747de3e696dcf7268d1ef5852164884312193af5fc413ddba42bb7d2a59054ec50122470260e703645a4f366ecef40ab6087ccc12a22863c9310824d715523ae57766572c5f5758475336724b9496127301a4515e01c8390b3c50480a048db635b21d6085dae4baaa93a762a511202681128183fea6b1634e589cf3c32a04f22e6da3d88685422cef206d70cf631df2b1d7a926992eb1d6c0436a38a5eb84f6005733584f9c380bf6476e4dc390ab45275c1847452932742c5ba4a08f58676201f04033ad695737d935a1093b012ab1745f5cba4037def88e52ba82b0ab15901bd9ad40ebd2caf64c09d275e953aaa35164e31cdca18cd29fdac35be5246a843b0b837296a95d2b10e04e51ea4bc6cec1657f05e4064f5d14b014b28a89fa5d478f16aebac00ea736b108d08e6941a5f5d3800dd0ab79e3c3277472170012963ce51115e8c63f4993e6e6dc90c9625735a9b4ff0a5f182a2e36b4c9ca42bbba0b5ea7ae2cf3757f53c8ccdd7b1d473aeed93f73a825c794d3bb1a7848a50ef38e2421bb1e7a9c117580e7ce16b0f1a2c0c680fc088456395faa3acb399f9ac3ac15521602a8373d9d820e903536acf2c31cd1121471d35494fce596cbba005becdace5aeec793f2b0b3c7aac556f89505c2b44986ae78eb41b3b8558c8901a44916fd3a9859d25c67648032abffb15379a3bbc5adab3804e0c90d004c4e54d07b90cdabc8253b95c769254f86054d01160b141316ff0709ece641ff18905c70d7d21640b12bc2032666cc588cab191c8bc37a4df83a2f8d734c2cc2ee51d1df8544a08f72028e1e6f93560c90f69c0a08c7db49266a5f431f6722510da77125141fd9b9a41ff7851173e8c7ec3766d7a8f203fa0bed45ef4e14f39c7c3ad93c71ec5a666376058fafb52a62d3a5738f2b84b0ed525b5137752430f18cd2695299300e1dc90c6cc5b6fb9a556ad6ce1859d1d44bddb6c0b0fbd4b217da8c000db9e6f9b65c7690346f66cc10221e4083758b00cbbcc915710bc0e1a2fe3984717279fd2dbf85900cdc6ac06ac8057fdca00ac44ef86a2bd5bfe2f53a251f7b6ba0bbe27a6c55fabbc306516f595fb754015907f37dbbbd28ade57f71c6be54a26a59b360b66adda8490e3a8af70f06b71a914c1cc6ec43b3d838bb40995f41ec44d42876fc42bed1e13f9df11f786b6f88f7e870b3ae356729ea7aa6c656c9f8e498a82b62d05567db27e5a20b39e740a0e55a019e793cab698be2dcf72e7cc105c0b22d907033df67a46c46981fc0ccba3d6cb7d16ce470b24d96b083c6d12ec72504ea205b22d825fbc082a5e4c14f277501f6ed91467c1b2d4662d91ffdcc82ebb2b994ae061f04c0c5e335381369822ce6070b265cda044ad1aa425a6d8d2559135593cbb2acf1a0d4284688e6293c34135fb0a12539b8d23d111cf0eefc7840eb8f5d47deb8bf7fb00f82958345fd89e203f907420b5924b92a21fd7ea7f4b8971b7bd853bf10e1dda2d06c4ff979617c17431c84a072391221de90b82563ae28557562148a2544370100e0f17635dd980b36f6e7f64c7f9770328488afe0e4f297fd3bd3aaa93a88039913c1e375ed6749d6ef3a5e72f1ebf2f16130e9160ed60265830f2b2cbde5b02b6ce628ca0cb262785205c2f00a242f3b517ef9caba4ac75673d10d6d94baa640c9fc69d6975d4f1c5efdc7b37afbff91bedbe1d6da5c49a1d5713e252a65ff867847b02bf0d80b1b495e783cf7a3ae0e0a1e736e0493602663ae257ed24340f03a5854b1be4a3c2033a9c891a56f1a3e4cf1ad5e3f4e7335f1732cc1ad20307208538bcb8f5e223488f4d20030065ca79bdb2f8db7bd6c0d523c282f34ed61bc14268d3cd74a0487836560a4b70d34f8c03ee9a5d7c656ec76dace14e6bb3a5f10830863cda5cf6bc84df634b0a544a1ab92d86a577ee4f1ee7ac7b2dfe4bcb2f99731e595a420ceeb66e7f1c21709610af928b2c8ed957d9d3e82b8867fb98cd985d5a7c4d0a6b688897c6397aa5f3d2a348836eb12211d77d755f43fb2cca819d5983d03d83fd6d5ad54c3724fc0fb896ad3c48e0d6088457d837a3d10d50b3f243849bc807575da6747e8b8d0e53f7b51904fe79e364efce4336a8e23317bb07d94f4e651419db5e8db2c3e46c6a698cd9af97430756abc43d0d55e734015fd2c8717df232db19821010019cba4a1f2c4d2d7b72c5c05bc5482b0f427cccc902deb475d1605be639ff9c629cae0afdfa8d4cfedbd4d2fd7e076d4549ea2ff67f64d617a8232e36d6a9bfca18ccc8fa0a7b05a0bada8931cebd16361cbcd626131df56c02ff6c23277b2140cc2981da1d7eb87ac0a9693e8de4f414cce08b88d4af5428d649df1ab71543a1cd5c58bc4a0c0e1e15c6ae0eb49676301ca965c872a5f49051e2170a71008aef87a977bce10697e35ba55397b6bedff7c2bbf1756d5e72f82dd79ac96651fc2e20c02ce8bc36fd7da6853141755a88469d9de9f9abc0a66b237722cb1af929d756b1c91d19aa19efd49df1b590415548aaee022257651fbd080c21d59b9943b57979d6c471832da50d708463882495c19ef7160f8272ec8f9f32f9e9a55c08f9ce88d5f00e923b3d945b7d2de91f042620c11a14e16861a50c733111b2be5bd67425a7efe46bdf8751ea16a0bbab0604f73c0206375c00549981c74b46de4d23a87ca16925ae9beccd84c35d60721e5490949d2c1e3c845c8616dbe029290bdabc13be3ec12257f21b7f18ab4d52ed69b402259db5b02bb1ac6fd982c5fc25f7a724a5f16d52f4438d5f004c573a6472146e77ee02ca3b129db922dcd0f458bcb91d9c9d6920ed79bce2dee71ae997381c6d2de70e5c9bf727c402d236c8fa61b4d92350017fb09e11d6e92086ced57cd7aebb6f492845c60b8a32734d65e140643511a754c8c1b15fa1a80f429b5081546cdbed54fdec2c5aafed643b744b0998dd87f8519b2f7b10ae3573100454fbadc8a4fbb7ed95c28340e01e60147a9719a65477878ca1241deee04f77916a83b52370305ce4b3876290268211b57a01a005595deaaeda07e2193c9beda4c280adccd224a407dd0211d253e8001a973fa4f6228d9fc0559d4231dc8af50ef01ed4b273c04b374f0b0fc7923684f740534b9735b06558039db9b83d7b7ce463a2826b3a79c98412fa8e000940f5f95351c01de81ab25a263378ee93271c350b90a0bf5d52db93ba78e0e21c64f5780a052e01485021c115f4abf86702b6cb15a1d0213da3b2bcfb019776ab1b01eb32d3837002c873e28d10e26ccaaac26369899f0a80c21da782fa452c12203c1af3a63d9f3100bad2949fd361c69ea5784c351b63029cd0f5f2369d49710719b9e2ec0206efd580020b63368000c093cd4e1307426d69262d84ca2e5e2a20b4d9009f9a695f3fe76125cda0b2a61d8b7fdd8083a98443f3e63272fa4a4b9a953cfdb7717cdc5713f4f172837b79b8b479087550222a05b255c856c94ef1b1a05ca62578b9cf7f083e8ec8fb9a3696228f2da4f624dbc55449675e7cdb4c43cc6f4ec8515d14a44a58a3ab03b87a04ede05de15abb1cfb9d409a130fb0ca321dd67954a8f89e08eb3efe418552f9bbb50147fdfd76efcff9e10b069298747bc1bfcd74462b69a3007ae92489cb6fc97482e8332a37e0631ea007d2f958b4865a6b66438c834aec9bede07de13cdcb1a14e72f67c6a3e497ff6f08d2b8e493412edd15083e6dbde28cb7bc86acc8ffd6700f948b7cef31bdcab0045bcf6f38d0ab826c0d906ce7acd450a69af131d064afbc6ef56d4e64d99f861ecb946492a57ba93a75688b3c020af5d81a2490976197831221843e416998235e2a723b327db8534bc659ffda1c3c7b786da4e25406891bf905c317f6cb6a47f06564b9beaa1b1b474203f54d7938b96dd67b641484444f13981d1cf003e890e2a4028c2f5b1f34f5307c064de18020baa5fdacc5aac3a4ac36e3d4a468b725c79443d9f94b777574523af3f0f9fc8e3719863cec627044f95a401c858bd9187d4499b79930c0b684e8c8d18a043b43a6be97719de5d4f81f314984e74eb78872d0b4a9cd03de5aa77faadde10111f43873afc026d31ab54aa0e20beb16c28c91bdac953134f94878ed737b00799816da71f05130ce285e9f258cfe58ab05d5c9d91126954244deb3c5d0ae3c8bc61057afd97fca7e4fd08b0c407577215e1d88e3ea5accae7933bf100fd711a9e37879cd8ce180583aab93f26e10af65fcf1d8cdb716682138aca457d78c4be525a891702dfb0113b95476963d9ea1445e859f5e02e0b5b3d3dbba0498176dd401755d40b0156017914239d6af6c7d05e4b2250bfb7fef593b9b8d69179c0ad3f7111ec0dea9bece9f2148862166ce702f9334118f7c4583d34fee60e26c08f1f01aed7dc21d56b74dbe906afcd81bbaf08ee00221a93fe23df212a018d18d78c2582ed376d5099e4b7a80824563ca18b723d520288dd7470c9222a8535530cdc7294e6818344b950086ef8c3a7208ebc53dd88c04d7bd8d9b47c0c6923b95a5775a59f55fcfcd39d9fe3ec2a30a0e3a64e610c935f2aa03a051f6a51b2db6b32cfa74ba2d48c002774ab977c6928fc930388094a96a6b10092149e95b6672ff3d9396331e9d6cf6f91809422f2be931a31eb13172a60dd2409aa4c6cc9786bc8bbf33d38892907ad4d69305b957087629e7e811a589132ed99220a2c912cdab8dc58a61e93e4400bb43e062625734f44007293cefcd87133d2219c944d295b888a646a19d27a1a8fe6b0fe98fa2c28e04060c3c2a460b0d7d0e4cca8b56eefb7841b4dc57c828c52d827c29f710ec0f0b00af78bc5c9db54f0deaf2dafbed2750e5433f36348feb8cadb1730613e1b7c0eca577e39b4869c7fc00e141f3acd97f12ff4e1765ff8966fbc04ac2d33a34d994057b17005ef1d9fc6e51637e623feef253c37a1112bcf105653e766e14660168b70356e2ccca2b10b644ce66771b4ea09eec5f1f96f09a20d08bcb4cd27abd7b442a933a0c2c2177621e6dc1f3c52552d5aa54d8add2b2902618571e023779df1d22ffa81026c9e6c70eb6298ae13703f81339d4e188ae2e71a85e7577aea2ab8be3f8fecbcb74e1425ca8cfce472d9a465bcacbe9ce2604a048a831af1740fa9dc7129cea8704b5a7f10ada12b9d9214ab0459a7e1caad30611644c16ed9a901c81682f1ebb92caa09f56bc75b1233b05cb0628ce97645bbc82587f161724816bb0940c19d83d497a8ff0b77921343e430034f07c2b223b60777a5d86bbe82924d5803afecebdb451e2307499990772f37f099d4e977a2324d0f04eab584c051fd8d07d2f04c9ce55218529a6f6bf04a187c2b8fa984217d6fdb7a56dea41919613ce43d7afd499c78349772fc00174be9ec7bbdcde6dd27d57a218a719dedfc892cc5745742e20de7a8d7397c6cc13c739cd6b11e360956178329527d9c70379b81056eb85180f5e8afc7922c70c929d55b051010732309a808325cf2a3b696ad3eced396cd5dc8a9764be5db58e71c0408c3d492aa31447e0e76eaf1bc2b49b0e1e080a89074d6ab915898c03cd65f6ab2a78c38b30fcae9ad15ed27a070716e5c13404d92a41c6cf956e42c8d20c39e30b221da15259a6081a28b9faa71dbfbf1803bef12c4256fae6a5c3c3f28520b34887da1e1648e8a6fa0cb54273760c09d8a2cc234966f760c1ecf002a95e7f290b5995ed99802f3a6a2a6bf64cf546b876eb191693a0bacea08344435ce13d516b9002386080b239230e385ffe36c7afe470086d92418618205b6681f65e71e61a76c4f83b289ee98656f5fc903d914dd686c16242d49498fd679a803fc88e0cb4ed0a8e54f86a9d9b25c1be26f4d6cf15ea8b253c5d9cf6b0e3b75c437e3943b1cc484ab72d37763cd724aa7ab84a3403d6e80c47d87b9715df80a488b68588c6ae01c0f9ba5578e441c192914eb6c1989a2c14699ce0de770142be3d5b1eb6e9399b1ba35782250162fb7abc3531e850104d9c94fef3253cf35b364813ab248b090b1b62220af5b18e3fc945f89cd482bc1e133b18fc4aed842c0a69489c919320cd70949d2d1b5e1e7f901fe65303e4bc7aa7fce219a8ec318931132a0059b1c6db649a5367bfa3a1a42c21d5064b5e18630de7f56b331783d74fe774252a6ed1daa18339563e114e8235e044b01b778072d3ff1b0773cdf18c122d39ffd515d572e998581935b320a0f059a89c57cac9226311cf949c8daf9825e58b941abdae3e28dfc958ded8d786769e64047971582d73fec64f6d31e294eccddabd3eac505deebac6de650919c67bfeea4f73f4a255722bcb529c795648413ffeac1f676850a70e07b2f4a230f729775ca7b6aeaf7686903f2886ab9f79b21c87d581b2416b1054e43d34c2e46c992a221ac71d3938343f6f65b316bd14bd2258cd14a7abdb01fadb6cf647a1dda352e13274a28f90c9c58c8102514b0bbdf8bd7abe6cd328a1f0f1f4eff2f06d87f79db7e939963e3bad19b6cda314ebb833264f2eed3443429ccd19854ae11849aacd1e94d3f853bea4fdc26a5ce67db4d3a961555071fe67acb462428f2492448d0923b47a6e860b06338cadd10373754e0de18bb016f33dd8bd788b54a1f1b6de8fb82db350680a954234a0d51bb8817ad28ea53d294b444f3e44d6e9d65a1153949225c5918505d3e3c427368631383243ddeb958cd87f679c280ab747c51359951685cc6571dd35dacb09ec46ab5cfd02a0d291df8e92f9d48b8039f769331fb8bab898766374218a458e329ac5181e5aaab9ea478064393e297bc48da25208f1735a4544ad31bb6507f98c7aae00106575be7865747d0f3ce8ed9a95cb27db298f66c7e0721a9566beb48026a90b4a4588e83bb50839c62bf88f5bba0329b7b6fc30b70a0159f4fd585f170e07ba4cbeaee74f2b8bcb531339bed6bcab3e599b955b907fcf2e7e1dabc556e0109f5d34c6fdb39ed956eabe29a1253817764fcbbf33d8324381a33552820a36c4ae909415006978089b999258f6260656db2a468bd631b67a815a457993ce7e158faa018a20d18f42db5512b4304e3c39b7c9dbc3ba816373b459a3062b5d51ae36fb10625041738aed873d4aa6a506162aa0be670e15721552b191f9194c26554316cd9512386addae77899839a1049674605877f38a68d40eec3cb36851aa4e4e6bb8308d316bed512f4d8136f345951e6bb91fbd65f0761b2208b537d01c71c1145773360bd1033a3cd21aa3dad2bec46a4afe9eb15c552bc7f64b0d47fbce7f0f3fa161158b8ba145c9c2737f21eac133ff230c8324da9d3b59ee3ba336b1170fb4e2793aa022484dfa41b75bb4cabd0bb0de6b53ef3f895e9c305df2e64249f7ef04387e34a20c116716ebd3947e029b3bffaae6ce28fbba7f8544284fc7a472508237e8330072c103eb65c0b4ff678eec8b6b849b64ab6c349bf1258057384d25e72fab8111496c46a002bcb06c900ca1db34d8f6cf983f8b20fc0860362c8ee3ab7299ff79b529961a7ecb4c6907dd22b1ecfa4a5f84405c0f1981af07663f7aa8930747b00311c731127bb83a91e00fdf5c96b773df0cbaf1d724b8c7d163e0af701ad35e52a711c718cc318f2ac0c7299a7e98ce368b29306dfc113630de2d0049f0dbeb2c7d98dcc4984150e9f7b67508e868790fcd1416fe634d9f13845d6e0c12be044e8411984e0df836ed6f1ee237882b0fee166ef8c0ca43004011bc455c3b955485019a93904fc77a6ba91e852d079ad28f915758ee6b5b8216603b5fb3945add080041b86cd2848c1ce09131108ab9f7448d21922eff4899cceb00c1b760742a7b2a9f71a41908854908bb05eedf1995735ed7813e4d88929ec6b62e0de29377683a28a72799514c5035418506dafd33d9966515223a8a76aef1bac1128a9934d1949f7f23b57906fb000520539b0b00f1e8588f94f94d4c1f55c9a2d92316731ee2d087c0e833520c7342782b283f0f694f7b6097e75bf8c267600f5cb575ee2c435c007f98256c4f882c4229c2589c686ca58eb0a844c6323758b9fc35479c738d006efae84de0a2345c72ce01092c5268b721d3b1e45299cc41e6887f7374eadb26d610b62eca056f5310a23d7529f6302d1c031bb45830fd2e4a0b1f179d07a67c6a3f38b4281ee089565b4694172bcf9e3611a7b037c00ea4e91e0792b7ab539da0582e8bfe410df66f10f1383d6415a3f71b7fba45363b008529336f01a252777932928d39b60d7d5185c5c190049307fcc81821275865288bde7cd2dfef52dfb4726252d604554fd82a9fc0b4cdf641e8d0001b2164111b4b47ee322f0b51dc68d0aa2f010c5b4452d8bc014bd338e82d8c80ac3cd51d825b7974560786d9ebb2e0c21a74ed498ea64e4d9f8dfda4eefa38510b0d0a8e5355d158cadb292f5ea467fb4192076521645ca24aed9b30a70e7cec7edb954f66ec3de65671712479d398c386ba02b0bfb4e59984e856a6db6a649f62880e8ce3c09252cf8317a39fffd69977d5ed01b526fbfddfa7fc7eb886e35f6252652dab31a909fe8a303585521b1c7cf5ff4ac76597d301131ff67fefe15a63832e513b05010cfa352c734064d9d68b6e0cd26ccdb2e5a0e76143829f1999781bf4a736c3b7466814ae64e00ed7e3b8e121b1da0983ec4893b6fad39a5f0b459cfb379da3f364902969a163f50db1a90dca915020c1904ce9d8f78a34929109fd8cc126fe322bf005c5fe49fdf63dde5bb9378a8906063aeb8f79e9f9aa5d440faf3a63f34339ff4786274b9f5f40d1e223358f5c8531d424447c418020f419e0fffd08e1daf07c66008e6b2c097126ed6510388f43cda197b1192cf60c8873e269f4d0b17fec3ecdb19bd14f322e569341830bdc7d5d311b1741a276b4c6782e96946ac4caf4bc46915c132ed7d4e0b427420519e6b0f6554d9a484ae389465c69592a4b228af2913a594c1a13c876d94aa8690725d6ba75de15d5b052e24a00546afc26ae3872dd9e5ca2c8a412c1deb1ed35ace47559f865dbbe5dd5c0a839d0facdfef56e9aec2a9cefa92d9d52c1ff7ec336337facab46241f6ef8ae1702fb9942ecac0db2c291fe2e5a1eee708bc0821ae408476217841bfa82729adcc3f9a83598c200ec5c4ac9c0206113d3b244796d10a7ca019abed7c02e3a03331e0104d9defd934cb60206738108b642e0dcc8b36cfd656f78d08e25a1968fdf55b5dd6db78e7d345436263e65be2b28223afc79acb0968bab1a85c5ba68ed7a9800fd6bdbb8b3f602f82aa8fd98e6419e4c86290042f7a23c32b2832f0b2dc9f2005f66af0504169d331ec9d195a8206fc7c85e99146d845ec79cb279c5c8c0981e3f8bd76ed6b98ba01c4adce425336a888d4663b6508c09a6861b8012b368123e16b26966b8852a73d6ec26f9964ba10e0795cd50323e0b79ae83ad40958a21f0f552d07791c1157ff315c0c5e04617f3e1d7ed6b0025a1b5ffaa7fb35aa4bcc012179fdb6df006a89142c668e093fc98c95b0021e81fe2075794906769d43fa097e36a484f0c0244569d33dd308732090dd8cae7a158e17829caa29da62f12f1e1126d29720597112fb511e285169beda042542d507e282c46f49889cf89152b0a3c4bfe5147f1b2133c62d6b26c128ec3a5554bd9d0183182a01e715f9374c584e66204e7b965127c03f9ef284b5098b2b2a1ff866d4bf37f260b955cb868dfb653824f72b0a96256c877f50c8c019d37ec7a958443ecd02d239173cb1c9acc45a72f30d628eb5b8202a11776e2d9e8a4e95d6048410e3b8b6287f1e23c131c0229b7871dacb9e982884407e49ad09b1a3c1ef15b7bf2c96c1fe55773a0c2eb54b4e8ffa81cc416bc7fbe6429e329a0a470938e657f7181873397329fe5b4b5d06f0d14c6c3939209b325489c24a37181a53c1109cd1202c449650d2de506f74574a3ba1866628b86a726c12ebf6259d699ec749d0eede4bbf19f67deddd5802dba006aba138ad3c25cca227e871b69dc4eab5483159a32d3fe51485f5e6ff9bb660e62f67528974e01bf3ce3ab9894ad24627848a804c4eb54de8b965509a706394da0c885e188a198028134ef27879a413ceb8dc21591fe3e0664d595ff1bf34a360f407d1c695f44fd74d38799d124835ee8526a0e4765d68d368317efea2ec568b198029ab42a85bbbc5ac2adaa74a0c97d00b4796d534c4227a7cc71924a730a523e981545e401a938da0ffb5232407eddab0bd283caa4ddad0aebf6a917b910473eb9d14d163c69d1bc7c7986c9c945af4eea62a965c640148b4c8d30129c6ab85f39e2a326d84bb295ffb85bba4adf2db17024784cb5e6eb5ef7e3178b1544b2f7fd05bd366705258ab378630f7eda5f0a246c0467d2c4b5d278932fcd824c0703c6ccdd67701ce923217b71ae9bbcfd2447289690fac045a57f4b906a04d279b34783266295e9ecdbc3992dc14e248eb84bc80ba8f6ea19dd0db83188330fe52b1f082ad4e4c001658ae03ee0c09c927da102acb9f5b51230fc48c58f7ab85bb2b170039fc9ba55c3959cdc7af8698c6adad6bfd5d796380200b6cd946c9be325a8d611e2e890c8dd5a2c6f6c6648dbdbe5cd52d62f62bd7aebdbab0ad7ac095993192c5623bc5f751a10138c90dd7b57f0b298e1c70786a390b6c67f210d92c941bef6635acbcfe490287fa717dc259218dfc18856d98a450deb9e63425e8f001875f6c4c47a2c04398e20bbc58da12844e65e9414289cb61c202abe9eded57a89661c69c26b2ecbb5192f3c80849918a71ac9f2fde82c319565d632262f4fabaf88e60dca3bffcad93783bab1b03c84adb814f94c55fb7a4f82d49f2878053c84788465a8c0dd58be9b3fbf6b53f58f695a986eb9e33754adf2bc4920d3bf6fc76527b77e49576a4ae02d186c491f3c1e000e20d257a1c79b255b22e4f9b061e34ad2706d5e3e728161a0b822ae1a2323f30ab6698681f77854a39ebc8797a40b4a4d15e1eba63eb7d49432943b3cf33bd3a9c8f3347b1404ce52480b339ade2270802805f5bca80eb0ab8fc3b1e3bccc3c20038c148c7e0270ae73151d078936ffbf092522f10a98abb89487b79b1291b88722bb10f4bd2cd80d94fe75af0279483fc910e23defb27c636826b9aa191abd14c69e04aae3998b7ff95c728f41e1205212d001ea05611200f030a1de11e60ebefdb83521203f5af31f1418cfe4389d9590522856e52a58099c19fd65360a7a4e01ef631c9ef3b1197d1fd973009f55a41477605bc42f41928a3b8a1e2f885478eba85b6c0b4116a5659d4d47f0a22c0fd21d507ccd76132b1f4e3ec90722876f5edf4050650cf288d31ade7fbef0933e3a530006addc6d82bd76c17763871cb188836e55f90f953ce010e30538f011606f5ab1f0252901eb90d2180d5e7f9553ee551eb4cfe8ef5307071118c87e0aa3894a82d894051e2b5e10dece4a3bb69cceea908cd5b169d35efb67e8fe4d64fc20b216b31da4b8df9df529589868e3dc8d68d698d1a6ff214deb8a9fb35116e34dc1ef249ef47a1ef19475d48a16eff2d73c0966550712a5fbb20b6d23effe869965855d90ffb0bd84f445907377b245b821081491e28a6b9571d407c5f2f45d8583f155d94a6fa6a34342940428a85a739c3e07314fb34c4c660db8028f0c50c3686699adbaa7d251c1a536b44e9f9ae2b9f983ed65cb27cac4757f0095571ddec284e37cfb441d2be2c0f7a489efdeccd271fa10db6b9c1d31adbf65dc2769c3a159950fc67b751fe330877f10b91127bb1755563d352162695d7a1494724fde4e2ba5708f133cdd3b0866986f9e63425cd20048e2a8736a930c6f2ad0de4fd705d7cf97c9a02493a44ced2734b8352ca6846943f6fe5546b7287bcd5a8547916832c228368c476036040279437ac4cef2e56a6e990eb906b25f1ba3898e09644df5bd79363076c571ff98df33240fbc4f5e672511312c14a9d7edb861a5cb2756f235f9075031a6c417b2c092364a49091c331b519252bfbfc0e14cdfa21d7aff5bd69c99182583279f15abffdeb030ffb68ee2553bad4eec1aa6f4eb18e3a978503b438c0bb79d22bbb4101423fb30af8ccb0a14aa1a4c7b33ac3ccba055ec310defb2e20c5280510f66a9caaad541d6da318b477239fd679cbb80ebb4b551f0d02cbb7e414e089779bd47d9887763805105cd3076bd46c4e39a107b075ee98bf8807305510c771f1319bf1c77417c4b430379087fec2f872a21e333fd2278c33798bba846bf1984da88a94bd533f227c4ce1f6b089b51ed370f633240c17818a507b705ed7155badc722c2e35661910cc1bc616ab07e9ff2050ad5ea3b0508537617f83836ac15cba8156de15b0a6b55aa19b964d3be159912263dab3e8f9d4f16473c5c4900f5e8a73a332785a9edef217b3196df8a05b75e6615edfb905d0ce3b7d2c02def5945fb3d0453bad3442d0b0547fd9fada8d7648866124aabbe6e07fe9838d1e97b3b7b268048bc0a3ec24c747ab58dca2c82952aef6d809f512716f2deee46a6cd55d1688b4b5b018c4eb3b63b7fc422deafaaa910a6f405c7a447fc952b3806e7f1d24b4126565660a09be3600d85619b1f61011d1493c06d6d2e012507f62121b2481f4145fe3f88422445a36cbe2e698301508c56e265d0276c4a6a7f7f456bc89b9bd04565a8704e6bbe1069c19c35426c76d505a9bb800a09bbb9491bb255c02e0050ce78f3e855860c1686c1dbe1e66f2de55dcd3c49556c827a245888ac97c531d76c180fb9a6868263e2c013f3e347ad8ff80a8c10b5bf78d01436cb9356a07ad258776de09c67fa57297fcec20d71951e5f331b93d4a56327ac350a80cb599b7fc579eaf17622dbb1589e35e5b2b1851697f59228b256861e9bfb41bb5ad963b0c5e58e150afddc476ec2e81fcef15dc6d47d86f4316a6f1e7123cecf542d3ccd082e4c4e6d2b212450e493975ddb89a29cd96693e5322da19d218c66cd54ba9ab2d28125d21cc644b78c05458231e2354cda7b9b48264a23656725f8cafcb2c3fca34f99d9221d25466fccdab1d14f311d2b4954b9db7fd42f921dd789b44a23b98bc24d950f15fe5105fb2ec2f098e9fb13804047249056cef2776ca7464d94ca4d43f11df3d35164c2282e0d8b2ff1a76cc2bcb5c59f0354ae280c1f7210ad1517efba2ec5719534156c9d0b0224f04833db4710049202bcd2896da80103dc2153c15e719644263e0794d89ff72c2b3b82a4b014fa4026d6e1ba260e37977620c74ffc864c319af1c04682b3d1219e80ae8d6c37b122cc6e6986e2bb75cfa0fd674e97b2dd8ab9600f50eb46e41f131d774b8de03101f7c8ea3ef7e652773df37299701c23804a5419ac188837415c0854ed3f0d5b9f50a710d7f0e55563128dbf9f3291591195a938c77bd0f91c9a311845e3169ea8876936e811b7fa672c510a29a3e04a24be0b09f823513fa48cd091062ee43ba6ab004a3dcc89cdab8fe22efbafc7bbd6b9f929b6992f246bbe9b91970c06495730863ec176a45b0bb0eb3f86fb11cc37b75d109e9f8c9d87be3a156ace227c711961e4d8a9b22bd2894652c6d1d7e4ef53c798b2f062521fcdb1e128f46f5d097ef1037e3890a148fd78de95105b54505729425158e4cc2525ada19f140035abddfb7cfe21731e35b6f8a13ecc215521d33e7b8c08f6c805722c046eee62f4a3f6958ea7c1691185ab6ea1a4600919ac2f08aadbe2796054353124027a8b5d899aa25168c8d7a1a26b3025332f13c04f5a8925b74278b337fdc852b4a8f0c22783d8745c12a3552693098ddaaf20e8b1a18b58159493914a5396828d9b061a59b004c6f01a9c7e5edcf56b7a2be8ce1da1e524a340cf789c2c27c80211b9b446d5c64f6f05054ac8edc0dde5008013bb22500a4258551959a2450442c0a2b71294a02c4d9d44305d566cbe90d34a1cda8ae7475634215d08742927fe7460836c66cba4aba249e581eaaea098dfa6aac0779f9250a27bd2f7270c2e343c7508873259f84c28d046d728286d1c97c25dfe0b9a80f45b69fdc50e4151febe9b459abe536a4198b58a1aad70261af924be7c3895698b4bf86aa1b6c6ad77ac7068c63cfb03736c41330370ede7a1f907ce0f7023ab49ed522cae580309cae92461d6cbd0e415a95009eae266bffb6e09c406e19a21c4e37ed32475245e1df2a9a7e883d5542d6b1271836dcbed50078202618c05f41ac48fc8e3eaf911b9180101d5fcb40a0c8c8b479257ffbff715ad22e68925b41ec301753c87044ed47fca7ffa74bcdbc40bfd989f8d75ed28f7794d0f45db7d34a9ebd54796942433bb40e488b813680f92a5a27136ba0c4c7a6a4821e50593e0e5b6780554ec2a548a0faa6297ca19bd846fbaf63ce9ac576013c22b3493810a7444164c54cbf5cef03d4b1d72f0d9025e8ff4c445bae1531d3efbdf2f3f1065d82d1fc16763c38bab5a8507e5d6007fbaf2fef33aac7fc22744fd012ec318d0adf87379bc74067d07b1e23070d047fdda82d471a26c395b9f63ac1203458377c4d74efc0aa48a158c586411992c67ad81dc7b3b10b0c2390a59ad5f4a45cac782e885049373be84e14c1d4e08ec237ae717793e13304047aec0a1e111e7194ec147edf14c12c12f4b5455696bc44f7122cfac12ac12d77b06ba92b69db9f96930911bd2846b39d427507c789c7692aa38beabfa828b4caa73360a42f6570c813bd609950d8bf73051b451b97eb4f988185adfc28931b3fbc51ed893a4ede7c77f291ac13a22aae28f5cf6050da3bc67a38aac63c3a1e56a933e228fcebcec44ca4ee92c6e777878389d8d42876069244729955dc15741568357f30bc700ac96f76eb4a11d40e5c882e22e6ed157fe5310ebbe53e439c2a4a9283718bb29bcb647e630c54de26358803895c6b1aa89016c14169bc11b2d0315745766ef75709a9fa1196830e445a5023e0652241d409934cf0ce6827639e2359a494cff156d2853817ea1d576bdfaffedac3aed08b5051c9dec746026ddd0b51564c5584fea1e4b820a5721f4ab6eb52119aca67cce3683793a25cbbd30e9670a17071eb81c09e419293dd1ae0581ee1e34b96128f1adac46f391ae35330d3c241f7b5c7374a0da8c85894d144d2767c49f140f04e6cc0fe968b87d28fc49001009b1d157dd41c362c9af2a2dde0d538e3b8089301d0321f87467249e2810b4358cd70681d62e59a47614719754de4eec593f05af4fd83031c5bf5c53b9d293d2bd59503d7b26a0ce4eac2ce2b821f4b022d8b2fdeb9ca361962995f8a6b1bf6993139b41cdfb75a5e38f6a145521feb7849e57dc0b9d3ec5a2310f4e1755540e6d0b1a0202314b6f408cd1ebc9074e0e0c85f978808b1eee0815a9b10f88c8347d070abb6089f7bb1636dfeca6e57acd95b63bd6ebc8f053560250c2a88cc8ae96da1afa9a90f2eccea482cb8c506eae8d92cace4a047f72aeb3c31dbcb0d2b47d454b286c8978305c93f44c968a298a6ff0c61586fe8defa6541eb64739dcb7df5d04769ab86edb4c005cf0eddd5ed6582ad551115b80319c5d41218aa68f57a1dddcaa302919f9ef9336b3873465e25450c1df1e4b91f45ae8b96e6c26028afaeeed0d4a3bb474e53c2b4f02b026bcb48a23ea0591da1dd00f0e0f812d2169be9541b87b6655448c2c0f321e44775d38ab5068b9b51de9f92a91909be8a2622d78f0a28566be2a437b528f253ea61411bfc3b05ce8170f8535ed4e8bfd26d059da2717c30819b9e5374fb630a0143b5850b8904ec6f1275cecd6b1f4fbd89dab8e63515c3fdeb68f494ba8486c9a72d94d07456080a9b6a53acc37bf444dec6afaaf20de0e4a12cb875816c0cb8fa7ea83b4f24d06b5520e8311121cf29cbf9585008a5665deeaa5bdcf5a58eecf7cadaba2a92c62d8fb9757f4221058b41df7c47aae0039e1aec2d7aa54989c250ca62a038e3f5ef60b48806e3a23e7943e92442449137649f87ce99133a809604b8288de67e1bfe7a9d92844318bec8ed31c5b4d999249a2d8db19b414dce408541dbb2a2499e249d2397b97a4e13ccb7e2e02ec66f094f6269ef84a741652c3af0c6baecb94e4cdaa49e510d342ec3436198ea0f7e8c376cf8d3f9cd4ddc498d1e35ae85b8c21db70c5a70f6ba30dd383682fbb4392b4fac7bb8e0c5591356c57648ebc09dfeaa88932f309b199963cfd4bf3944db74048d1819f19ea264c48ab5c4795085f6bf00e019a7bc5daaf61ea6c3a6a00faaa5639173839f4805175f6473a5ba97448bb26c596f5363580d8172d36ac7335a4471d4b0055097aef591f09c48984b81d7fd0fd33279dab6827ddc5d80a7023fab7ad26b8c3dab86f0cc0879b883858f72f664389c7e1b57951bfa63f0d4d1498fdd346530408ad758af8516a8a572e91633a0dcd716b08499b7442e0de97131ac2156a7a3671e185d48ab1f22130e8cb5665bf66655a10b1afd6d5f318394e8d84768bef4f64ffa8932d53486ab571f81868f073b164946267b97d465fd4bc89f10b0914f7191fd057ffb83b2796582c7b2ff4fa883ae1cc13b2d5c6e1c30480a93e6b95cf9574dcc238eba8b65481837cb08bcbcf9a219fbe5b1f65fee63e7a141be0de047d804d4c274882608f421bca37bdea909f1e31892a9deeba4a500f1cc8176d727685898c185c38e13ffb987323d63d47ec9555d873a73b82302e3e12b6b291701e5b4f8ed524da791c9ae9b9a0649a008708d37c4a4e14ac078316c5b357968ffa6cc7657d0ee7bc7bdfc829402013429013ab8495610794c88869d91d35038c1518cd1d50cfe2e5c98e696586920340eb7a9de3b4a12a46e92da5983431584a0ba42e043f70e6cb19586d778b717b432acd1f3f663dd611c1bbcaba199f995b282389cfee63fe80ba276018c4a52b1e88aa9eca544612eda6fb347978d872e420fba1862039b69c3247956cf60b905d259b6b960d07aa96cb9d59ce110ae728da9c1c5b26866e10e22cfe112b4850c1965cc000b42a0b52daa7bc341602d707034c898cddb755f017a994e1a33dc6b4796a8360817c042ea1b0c557d944fecba66a4bd9ca07f682ffc0aca618970399029b65b6324deab1e5bacc90f10ad0bed90514cda481da16ddd95d9f3b982c38c90022fb4b873b13a5956c8768aa56c17afa4bfe91258a0762c21fe6f4c58762496e6aba168c0490a947dee009601b4f627ed48aaee0195fb5f5520d36174c41332d2364bee2c738244b8e5a563c43dfccbd1de620250e9bb8fa1d13da5fd4307a049769a3da8368ebfaf3feef5d94796f288fae9c080f280241cd8932ceb4e6216efa22e896f151bcf0291c8ddde81d0587c959377d54981cd3c8c78d0ee4ba8c4f7a9ebfa98c184829b838e3a3505b1c4dd8238d71a846b225cbea8a2e3e904b251f6d3558ba408b534971e404839597c8d258cf9bcd9e53855a38d18070ec61c3495b3c4c86c4db3eb8c7f46f03b1d0f0d3e05ff24926f4d761390d7919bb799dd8bbf46325ece63e2b0718fdebdb96995294a69e877e777b5e4dc0388f0a806e8f0f4c7e05ec46f4b93d6377f2c2aef7ba517113219099a839e97523f311d0795beb2fd804d6a34747a57367d94dba901e92b96178472503991773735a1dfff33d956e3ab09ef0c66d0fc189d9b2e4db319117f86028bfa2e1c90d789b8d2d72ce16c8f9dad8689ca2fabaaf1a41711e8997fa29cff8984f592066dbd1cc8310164eff1bec7114b3c2f0efc51fd6793627371bb0e7fd282c6ac8bfc18fbdf0f6b42bac8cc4834bc5b1ca47890176ecfe01980d443adc0f57b882701a38ff065ce1b0d7c2151bfd4a9ef0f6a106a049fedf1211f00c0579208fffcd1127dc668fb14880fc02223feec403292676a06e746c9e8ddb53929d77acf585944eac7ab6cd8c7d2a24ce44a7a76d4d99225859e5b9bd3e53542b4f9eb72fb4ab0ac59958f5683b2f930856843cb74f58cbe7abbef32ead78be5d1f004b34a2e227977434c5fb7d48ea7d68818644c644d2454f8e7ca72e394322052c218763a89423c918086e0e1299fda825dc1c0408c65190758e372f8a8e31474157ab438ac6863ba2d17281c007639f39eee998ed49c719be8223ed71f90aa92eb2fc39393c5d1036704053f0978506c08b855880cc862940151f174ab2b60689c7dee7bce5349698026010fbc080b24c34bf3cdd4478c0ac08fac758bc2b106ab9fb26a9c998a69d15af84f61ae87bec1e8b9bb749e788eedc62a15df9e05c32fbf96da6e2fbf6586ca4232b5041445c1e5c4de2d77c6b14a0884e487481247b96bbea488e1805d5554389f8702169f39136020768251b6df481bba944594e6d6ff108764bc6ba2997bce48e301bd20389627309600f55e099395160162cb0b38226215392bc91fd8969350fb2d2c76b1f41821bda2e91d4c33a8c796634a9c96d7857e5f69ab5023db4c15e92979f7ee27a79979beb6299ee6e52eb4c6b8973e2c377c1f6bfe4fcc7de6ee94edd4e1175b691814d1da0d641d97e7560decc04b7f455bbf122b38e698ae0da89cc74d1a278251e57cfff494143b59998152caa795c7f3002879e6b1b4c522b01684a2028cffecc478fb8bf1d4640fa112b50d8729f7749b71fc357c7d85b4266ab51986f394edc65c40bc46b500dc407128d1903f8c5a6005a9321e3dc6f0632d00e435348ddfe1157d2a310e712a1d9fca90623c8e5f6a7a3ac1147c594e418b645ae5d1d3c1e326ce67c5921fabe9b1443faba441302c49bb93389c59b5ce7d328f72a0d8019e95312996ada084caea59347e6e1b625e616c1fcbb5d69125d1e4c679fb87b5bd38ab6b61c76ab89cb243ccc89a2ea8d22effa0e875d74ab2cd79f9b4653f4c58eb7e7854ae5759b8cf47c60e5345a98914cb151c7508e0630662346db2fe8ed083e982dda421e62d5b3d78f1fc718da91ae0bbc60bfaccd92e94ba0fbc9c4d006512add2c14ab4881118d014ddd0ac428d9aa225c5b28b77852f4ef14929102264ad60ff6566641c74390eceab590f993e76ae2fd111ced8be203023e6d4ec6fd7592ba08ee008340405db3a7e159117e28fb7215d2461e0ca47e61ea59ba0e9f54ae5f5d4fb137f8e89eeba8d66d438f27b00321c18f94f932195d2332d2410fce72b4f538c930247d2ce53b0a77db6c7ca284f3cae0f4651e3d6e7670d6c7b2b7c37994a5ec4672e07f1773dd9b49936cc62ed94428b4417319f5ab9407a78188b4720c4357dfd910ff8882175d73cd1d9460236da97b8e2107ce96c28ca6ed250ddee897547096e3c49dad9d84953a40643499af8e99c71ed89604459b5c8ae72dcc6f10899ab486cbc95da258c313b690dea3d3737c48d9548ccccd4a689c56c35a66004c2a6cbe89482a15bd438e351f2ad4ff21f85956f9d89241ebf3f0e06f53a091e9861f17b559d09c610aa0a4e896156f43c60d04ca539b2530c360e47f0392df0ddf971865bd0e1c7bc19316cca9e0e8de14ca239aa1ace175a8778c12595053065aeafbef499e9369bb21f0769986d0eb27bfc9f64023878bb8c33decee8919bc7cbf5a49253c4d9839179a4bb8a2da791c5c37e5979e1261f8ad04f00e4079c2b4ce1f76d2b3a9dafaf613680baa60594eb0c6110c62aa65decde9528c2d6f1e60527cf8cd3cbdc125b8d0f9265d984862b5b2bc565f7326b512828326219a453193fec1bc47500a5e788e4861439bdae1e87cfffeba9684cab09bcfbd921c8851729ce0aa15ce36257f0fa6ee02eec83ee8f3da877019af2198ebf8f085c6b9190f4cd5a076e3841991aa385e3128fb6aa2d6e38001094eee9a87ed1a7169148193ee121fddbb9990c3475ecda5000611061cac99669c8095cace984dd3cd9c7f19cbe913db010354e90ed5620cff1374bd78ce2439a65a77cb60b565ef5d64d87847119c4dd0e0a9a52d90775f48da932e11516306ef866bf1b142200da74d18b2259621e5fcf3acab4603ce61a3bd718816f33b0532270a0e3a0cda258e2764e2501da92e4fbf7cc7f1cc1e3c07319a161e471389c12365a685ba51141191f2b0f07ddda158db3d114b47383b3996eee3c4e246718e9271524038af52ceb05a049d44f4f76ea5a049c45bad1685ee1ba50e17ea566bdb91be0577fde0e9226b008ed099a37b2b4ce0d9ad26a142297f1d582734ffd9e63d96c7460f86a014570be4ba68244a7a92ca0484ee52be550a4f985dc460810d555b5df228ce8b8a8c25321ca9928259ca96dd829f31882f4ac2270a7ae0b7d445bd6e8430200c9ca57d28dfd3087f76c8fff0a5abc399663f7990afa37a5b7295bd4141b4e4bffced78e98751b642c3b7f1b85d1139676039c6c13a4a3795e086bd4b4f3cd79d6384cf421714bd3d97762f9e4a90422f12b4893d45f9f56e2ce78120a3fdd298e76c10ee36c99353a23579044b01f958ffd27e3b640f4289829f7b9680ba3da1aa2be7e156393542a3f3a006cd5cccd49e418f1b25779c1daca3c681910c4bdd55fb696b6980b9f14684ff7b6442ee264a62d5dfab72beda94eb00caff16888141e4c6202de5652c574fabdd698430e1f0a50338d61d341b5b23933c48966e81b7eced292e76c38da7ce4f940bb29190888ef27798c6ffd2e6a51774cc2b429226e0f845c2dba12612bc8140b6226eb8138e136e16b9918f13509bdd7a3c11e96750c391c4d504054552d66dab88581434d92631ea89aa83e7bac07baa6cbe07f9b703c9a91157f40561220903e61357e9a29ce11f7b2f80e270e39216a59cdda6f80a5d3ffa7fe8f191439bb87b4f97784aedc697685f2a41e3a897e47e1587877e25db50e951b7cf700568221227a7d01ff3001312d21b8e80caf70d5e99524c99a3105beac641d95b28c4e47380f2201b06b0c9415258ee94390035e206919600751a999afe1383d5eff9f5630bfe90b09491af8e01a1ac00472165294619a7db903616fc1c0463e21a5409a7edaa15511dc2d0b777fd37a0b40d7505a447c94869d4ba1972950691034aea6c539ed080344abc923a495827570601c44b64dc24e13f934d9838aa30f804435395e4fdb65bc911f4c3a43ca891cd4c33abb0630605866e8313c8ad88129b2ca7ed46ee027edb9508ef084e190466c2de11869cd9701b89a7a47d0a99181b601f8a636bf3bd948c9c24173737e3ddf3e8db25eaf855c93b033026cf8f00817e1439104fd114dae352132d0fba1cc3b9762918e4b42c59c1b615cece5338591450de8b5f77c92e765f1ced225c3205b0bdb9171babe3a606c539034eaa70a9a2221cbb3afa74fd5ba77e798b897d1bc524ecb2b55dca0c94bde51c96d53f630e280adeb7a300ee973c883bc5ddff5e8fc5f0f88aa720a454bb55e5cafaba6285b0a8ae2fb341b8b69906c26f8b1e624a1933d5b901a5365d4fcee7456517932448284bd3506f7ca58e97cda26d97e69d243ae09570f04d34bcea1349cff5ef12da7e728fbe69b3c1a96db2954eef79874893cecca13195af035a091c66efdaa386089983363e748ea6fd3a35b44f41f2eab35b308c87dfb152837f4ec3c0a9bda5134f9cdd6266aa3b3432382d79393efffeec16d96c6d412d40d9ec016a1ee1eb3fdae36c7b2556f4fba2d5fbfbe094db0475eedc4bafb5eed072788ade31689c9819049cfa6ed39edb548e90f183af1c16271aa7b547547578bea11a80149c7c2dd906987aed19fe33ea2d047b9e81c54c6995aac2a5483b46771c9d91505b2089c04b1cd65951b978230cb525ba41e204b267979aaf993754388c429b4278c96330288178531fd78b1b8f75d317e2b812ae4956c877b602344f753e88de0bf19b078b12a2b7d06b4a11d104ffb798b4b5c11263a34aba03e581f650885eec7f24835fac10d3ffdf132b7aade77addaf2228e1a2710bb56778d4f80f1aef1b90ef374553d95eb9d293dc6c021aee319a72bb20ba782819bc43ae1426e5ab79f02bd7a847da10e3656813ea6514cc9b355f25f4858f0e6f1606863761401517b7822a89c747cfebf148c7d9ad6642f2f77db3550bce82f4ede12c3cfea27578bc4bda2e997469a54c4c8bd360fd5f05b135ff286546dfdd977ee8fef6856f439a80190990545e5c72ec6d5456ce7034de229d6c47f682e6a8a50e555f28e8a43c6b6da29ca36aa8651fdbb840c5117f86953b89f9e47551a8d8811d97968ed51cbd9405df88e9049c17607aec5d1476957d23622fb361c4efe3a85f6b053552d6aba5137a65f8bd7fb69e1d3de5f424cf87ec1466dcbd84fb90dfb32e2291fa932f9b7c610005301d34cec92e09e1c0cec95e12cd4ab10da43ff86502f383074e3ef041396be4f77e6aa41ae11ba1f2f99cb7e8ba71ec0f1c0a854fb0c4c24d2a398e5340c399461649423a7ea7d2cb804d86aeb120bc6e2421a669a6dade65cb2c7eff0044999212b64e018c8a2a7f76ebd073428f2b0240425cf363fb7331ef79ce3b98dff307e559388443e252ea4e45b0d3127d04b5f24ec193b3fc181651dae6c693ea9daaa7112d1108fc2ec05fb21345ba9552e56cd0fd186ca96e9a5fc313b494025afef56359405a554d07c8bbbc99b976be40a95760b662685c32a1767ee038b887004852f0556d59798b989dc4fe17c36ec47bfa87aad6711bfdcaafa4b16b6a2df769f94d6f2596b064be974a70df5ef3f1ef55b37bef2df7de52a624657e06fd05f10551878d404d9ad1ca7e68e34f175fbe88df4041b88bea247dd08159c650491e7e8c0e3b1e48a03562925c52105eda9e9baace4297ebb71c70dbee5ab4146ec48db811f872fde65cb4d209dc36b7c80ec2977855ae875876d107be5c2f1ac7785d97ec78f9753d29cb6a1d8d26e94563ed4af8223f5a89a995389bff1dc3699e89102cd4e04c8a134e38a154d9d124f8fe432effa670c40c6510c2c15088d00f2ce136618c106758d881a110a116ee2e42a8e1f8e198c2a27164e1250a5de47bdfd96553549959b47816410891cd2bdd26672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276707424a6750a1102886301402c58ac80a02b984a69f951f7a89006882d98fb4b185e5111c1f5bedc0524c25b02ecc13c61a038e9f1be339519934025faead81250545c5c9906bad8df84a1c2b4f35b0d420c4d293828262234ef11e282d15272736621541273a4dc3f2893e8e40558b15d94ade307c13493339c4091cdfa320554f481f74e0eca1740caff4913f6089c5073e4b1c0f7c963c1db8e1fb650ea0c987213ecb1dc09987252038f0599e36f059d668e0b344d9ef773240930d213efb14b8df5b70e6c2521119f8ec4218f8ec452ef0d98da83ac686284053a409e2b34b2108ceaca46029d658e0b3f754e0b3ff50e0b30f617953c49940d7f0fd6e034b5147029fbd47043efb0f087c761cacf2fdae04344520203e3b0d9c1995e290199fbbf580cfbee387cf7e8a41d10234c5223e7c6e2eb0e04c0a102cc521199f3bc8019f9b488ccf2d448313d0d4343d7cee277ce08cc90d2c750d8ccfadf3e273a778e8ef1f1d73f2a6c669c0e7f6019c51f1fdcd03965a87019f9b6687cf6d8377744c8919a0a98174f81ccf7004ced4152cf590057c8e2c057c8e430978ef4d5dc4c5e74805159cf982c0520f993e479f99cf1108011f53910968729a08e3329f230f9ce160c96b4a9fa38f98cff1268798ee5b7c8e3330390e0e58f2027c86470c7080cf9106b3e8170134395084a929c2069cc1603e4316013ec3d50b10b0e443dcc5577c864e30799108e3eff219fa08e0b38b017c6e81fb5740a7affdf5a4cf01c001f8fca3daf2384093ac89307006963268923611868597b00f78e076e0fa104d189108e33f04101cb839f30ddc5c35706d4413a6120216c15219b839c3c0bd001ca289262c28889bdb3194056ece2a5043811a9c68c2782680a3e3a5ab25019d08e8404007289a301b20802ed58c210f18f2439168ba8cf8708b60bf321937670eb83168a2e90aea81a6c64b170ac6cdd98b1a1e6a70a2e9e269000ef6d96280ce0e3a5807289a2e1b1d80b04f95bb2c6088028624e01689a6e9a28b60ff1ef2d24cb94b344d2f4dc789a669ba333757045c191a5caa89c9a1a6058e6cb90b50344d9b0833c48b4493341261fc0fa063009d02e8b00082b9794480fb7257dcdc9eaa89261994fdb84d34499e08e303b82e80eb72493737002e0eb7e5daac3022d1e443d80a5b612b1fc288dcf0ff36e21bfedfdf87feffffb3834105876fc1a1e562aa51ad59a6b2d75e1bb1b5d65a6badbd2a2d7f43cb0d37fb916b1bbf6dbc61a9a0540a4b05d9b0b2b26223b66165656565656545c5fedbbfd955180ae3c150180a43613c2c35b0d46023666161616161616161b92aff36bc0d373b4f0db6f14a0bb369b55a988dca6834b211ab8c46a3d168345261f91596959bbd466544a5521941494149b111a3a0a0a0a0a0a0a0a05c9595575951b9b98ba4d8c623db78bb5241a9d495ba8268303131b111d360626262626262a282f22394d1cdfd83238a0775f19ca8385161233e3939393939393939b92aa3a76144c3cdfd43856d6cd2ba6c5aadd66553526bc425b5d65a6b5539799313939b7b87ca884aa532e27dde6723f63ccff33ccff3ae8ac997989434de662a28959aa92011c7452ce2388ee3384ec5fbead59b636aa226cf444dd4e4e948ba88bbaeebbaaeebbaab525f54ef8b8e8db956abd59a361b866118866118865d95eeb98ebb190ea98ca8542a2354a394524a29a5f4aa70bf71f74537c65241a9542ae892f292524a29257d8cde178d493fee124dd8cabdfdb76c66d98f97b276c92284c9deb3ef2c832f59673f2e329f9cfd04b9fb8a1ca0095b4518ffec073bd5a9fdd82afb59390cf28c5d017b0b38d309a04e3ce1e6169848d6f9a003cb57c530d48b847620c61a30c1fac1ed9f6d5dc49f22511ddf80e1cd36e2e9468e37aa86b0841086000408102040800001020408901c9c0b97d9c6d4de8867c02588ddc71b51aeb54f93e00b4af4117b74cf10b0f7209064ffe3be91b8cd764f93b0ae7d4a3e7ffd3c127536a2fc26097e33b2a934d979e43e82b196a2fb52bc69172cf718ba318433d9e73642f26eee225f72730b8d2a26c2bca7373750c9639f899e7eae4f3f4bef8eba18f5e688b8e4e67eed450dede9f700b8ed2191235135002eb34eda6eb49176f3c265d6f1cda5b3836f3ae651ba19f2fbc67174469d0c7b936ddd135551d53d70464a16c6be85b4100c978deabfcc567b732d6a5a7f0eb9bd66557433b4ef6e0e4de52a954a2557703c18fb15384dc2220dc620bc34e00bd63e2bb8ce4a6b03b26ac017ec4300613059b3dff8cd0a9621abce798330e962c83b8410ae1355dd63850b9d077b932ec67573444c6f7669671dcf9f9a168968128639cb57ddd3249f6b1d8dde5518c3d9ad803128b24c3f760f24b99af6f19e7431e8cdd4a49b315f8b249608e72c12bf0310f92452f69b2bd47e18fd35e29d5776282da766bfd15472487c230ef9fb8dc41886611886612a954a9559e01ee04c0d4f77b36874ba05ceb4fb07b1dd9bfb876812e6afc2be76312e0ac391bcd43dee823de97f84f55021354794350247c5df7bbfd91bd187e873e401aedd8ced5b24ea646cdfb9e469d45a47a312b743649f8d54802fd87b364e01c2603f2d89ed9eeee99e9e6dde20eae5ba187d73fc96d921ac1014557354d1802fd847159ce91e7bd8d9de81b18f538847bab8c2988cefd158bf62d17017cc6fda05fbcc65267565d4f22b52ac503354ddb84f935eeba13df5fae841c0b6c7fe51503caf219ce9ae4a0e89b7bf21c2db6b9f6def7533e8953922ee6eeecf6274dfb7467687d8ae100d5541083144cfcf10d54a4814405800180a89c207f60e86f654b3d1078e88456d451a0d129bd9cee61c5c68229be1173066a349d867191a2cd85ad981e5fec1d8b74fc77432be46261feb60f4ad416ff4d124ec7144dcddd823050aecb18fa88ed91efbd8a3637c744cbcd9b69b0dc3a1d102f763994f051a05c51b2f71d9ca6805f61b013869bbe739cb03887c247e87a8ea1cb0d72c8e88653c9edfef38ed820d01c2980fc63ec39e2018fb2c83311e8c7dca176af6d7ae11d271308c7631fcf69536629518164f0c832dd8ad21756a0aa28e298960c208491081085310415e1faff8fd91a5c2fe14899a5760f99bcc3a1e369a3dc4fa479322f48a50513423c903cb9691d87217f959d00116a0a97b4418f95956518002a9f9e59f5d0b583ed7fdc0755d8cf8975f1ee36f7fb9bbfb8a2679f41574914fe567cf5bb053588ed41afd8f21ceede3f60decbe991235fb101fd231415de2563837ac226d04ce6cf1bbfbdc52907cd7bd6633c9edae96e33bca87f770ce3a4ebbc847a5260cc79df22cabd547fe4ff2234652db8a7b1dda575ee26e77affc49beaa89d8699ad466c87e5a653fb9100dcb59233ff909d658d94158deddcd6aa10e026a1f1c644bdcdf1da449b28960d929f8221f06b586bf0f91ef371d83d3313c513a13767bedb279bb397a3723fe85ea62f4c7f71eee83a766f98e92abec5a70a10ed2d7c74ec54ec54ee5166ae934dfd2bee2fa473f6d9de6e918196dac8ff5950bc117195b45b07ce9588030f2a5943c6ab0949f5b7e0bcb2cc017f9b975e0859a7b958233d8cbef23d4e89e88f5c718b11c11fb8d36978d3ee4536c84c4f2860a8c23d6e015be922f49ffa39a92fef1a30c0267a047d9283076714793ba0cbe4879b38d1ffafd5e7fd92f0835ab71a3860bec5ef0a7df6bec0ab6130c3b0caf942b600d9ca2e63a7f7a3d82338d2f17d6876d8bd0f6d0a4eb61375f879ef7c57c7f9f0fa5f7d0311005420b5d6026b196ee4e428757454209a1aa6b015fe284f32291af4343082184f22ff872098982e6afefa16372f561e45926b19a42862adfb121178f1fde9dc119f9fe5ee5dce616594608658bc7203f7ecc0cc60e4663ad070c3ffa95d1860ceeb62390c1f0d6884f7f8b36cbe0d837cbc4da24ef21841042cf8a60bcb94f2bb95e1b3238de9f339e7a0067e2cfbf80101d93a30f9e3fb3c49b94579c1368d224fd8f46b7f6a8f183b0f361845bc6219ee01861e20f8499a72ebeccb89b6dc8e0d1142adc525a35c79f4363f8be0ffb1fb0ffb0ef7bd16f9fa8c4c4e4137dff5dd8a4922b7a1d5a45fef5f23dab22dffbefb74dda29330307fc25009668f8f9322ee08cfcd9c2a2e2f389cca4812ff33f3b4f4da2e14e25a0cb7c1527f33494e7a9a505b8e4f3f7f4374f0555e6a046fcbd0e5d628da85ff29b5b93a7b666dae069f2d29adc796a520b2eb1378ac0dfd71e799ef0fc799a349ff797c521717d179ef7592743bee779ffbd0e7d79b606c9e3885845460beebe7bed256bbea3a6644d583f7b1a3a18fe5996d53aafcf01c01bfc5e5aef3f9be5671fbb1752087b37b76029ad8d968aab15e1287bc097ec45b85a921609aeb60bea70b59c0e87abdd9c66c3d56a2c0d574b7d28ae366b1f19ae163b82e16a2fd585ab9d3c13572b638dc4d5ba0df892bd0edd838b6e0b7cc95e462cba2f544622209a3a08d33fe714614c1bcb26f56f2a5c5f574d7512f4600921e8d4744c2c12051168848c34f1d4a448c33397d915e50542e4c1f2b3ab65c7c479b2d12e72a7ce2b89930cb09438d826d2748c0e9a788a34dacb9025af8799376a929c71c6ef9aec081d3a383ec4b7c6f6a44ffb1bd86713cc7cf706ccd17edff77ddf7d585323867083db16b5ed33d5ee0decb7d7727cfa3a78f4d5bcdf65f2f5494c7eabd5e4b337b0cfde7fdf1d0ff2250f40f865813f0a74ecf0e2ea7880f085850c55f426304a5ef49b892dc938e05872ff06f6f9fb1c8e817002ef80f0eb7e8fe85e7eaffd67e97b19079caba8e3ee096507ff4d6bb9915d20f84dc2ff88b77e87709766413cc30e402e1aeed24e24c35512a31d8ea0e125e9fef2083fe288ea2e5e8497e4ad3a18de80a5a075c42962c1124d34b184b851d7b828e5f51cf79da669de57e9514e8bdfc5e7342d7b4dd3342d6e525e4eb5af7a4d504a29a55dc6695fedbc8ceb5ecbb8d7b48e8b9b949753ad2b69826a99573f8d769b4697a05d4729a5947ed5ebb2fa79dc77da679a5bf9979d9146ea24a7ce451aa9ab384efbfe94b8c5e8947b4da34d50aa518e524a29a5dd129da6691ac7957cf5b392ac7e9ec6699ac6d1cf2817b5295ff328a71238aed3344dd3bce4f344748926344dd338ae2bf9bcef4535fbec7df67995d2cf344ea323ca754ffb689a1228a59c4639fa1cd5a8c74de396d08926adebb2ab1d6bbe846794feb5627124dd3b47b9f7eee68898e466936e467cae9fd208315da252eea2d7755dd7755dd7755dd7755d97a6719cd6c1a0b4aed3b44e139188ba9e2c48057a52d791681a1755947baa048ea39a96691cc7699aa66954a39fd18c769c46359a699c0d9d0cedfb674629a594669ca6659ca6699a46356e5a20528b5e0aa20e293970848c59d682a3971a937dc986b2493e553efcf7121011c6a5cc70025eb76963c7ac03cfb9433ee1737ecf0b6a4648c7810da009cef4631f691c85723f39993fa84ff51bc0991cd551d1441f7bec461158bed6cdd8de9f6eef99cd810358ca321f8c86005930867dc7d69119f69687e83e508eba4e92fecc220f9cd1fe4ccaf939e299699aa4f3ca0b7f6cdb748d13f5e6c7a4dd8cf92d7fc89bac9331a7a3dafd1ada6cb061150205552250e649a40e9232bccde4a84ac0d0d42ff10623b510432336a4bcaeae7b5abf44f42dfaaafd25a5fcd6beebf9f4e76bbfbd5f42aea0c2f43728582a275adbb7cf0fb6c1fa4df69b4ce495d41e47d5e4eec9b04786e47317c15813e90ee2fce692dc7b6f0d1d0f7d43bbdf3ef76f37a2b2cbd2c5e8ef7efbbba292327a12cae84445f7c8745fbfe4bd875efa27f1d25fed66920d17b64b564390ca72b7d744d9df10e1ec7be56679923bbca572b30fe1940b516e96c1d96f4697869bab77efc9bd26b7bbdff5ea779f4bbe23a1df5d961c7dac7433ba17ddbc3d7d15c8653662ad7de08b8bec69a0279c80301809fbc748b547f5ef98c2d8efc87ba35a4d1555c74c22ab944e86dcbedf6fb24cd3ecec5a486c8d3c55ec311eae058b0d61ac881069a57ad2c86f7ca43d6ced6a4d60edb32ef98dbb60af691fa1a97b220cf699f6392416fd0d1116414cd2185bb990dce12d1f7228b25be1ebf6bee4e9e7f6f96e4a17a3e4e688d8f371837df7c48a5bbabbbbbbbbbb471d0f2db234743344df77c3c1710010a5f6e12ed35f351a527f3a188d69e85cd5042bc0526c792b3843f2d34796f363cb4bd715fd77453550f4dbcd5d033c5f23113d89c8bb24f73bdacdf0aef4cf647ad5a4d6e3d812b5ba94286af6d56ae5590ac7d9883feb73a393f21c4098f9d5b6d00e7ae0495a795d688173af5c89378314bd821d7f9c484b3c5bb4ea8f8c8c542fe22a1c5722d1ddba19a27755c7c0950cd195a26c9565243a4574786c2c4444ecc15508a0cbfc58238524864415fc90e10b8e4bec4f1cfa812ff33d3a81091006a8898c6688ba17f3bac837918b44ed23bba93aa3d4ebe88874747474b4d7a13faeb60e0f7c893f4cfcfc34918ec213464e2001cf7f51a3594d9a42b7572dd43ade369b27fec41f1d1d1d9d1e327f43e1361b71f5523716a04b579dda854c8ada66c0f3e711783e8d1470af5a08becc1428eafc1c5bb8c6f5f4b75b43f438223e125ba2dbab12ebd608d17bb7165ac8e698c251b1e85ba7079e3f79463878fe8ff9221ce0f91e6d80e74b4744bbcce73223bd3a8267af268d4a7b842a93648826cde71a471f38a3dd17f4e288f3331b312b650f493f003584a7fb753d142cd56f9a3cc2414897a8928711383258b3651273ccdd5dbabb4fd6759a2cd67cd61658d1d43f2f9eec3a5d3424dd8cebe577d74bec7a497f7201966018e61478badf489b796c27f1cf761c69d97242f5ffc9c2ec6c9aabeb93d7386a66b70176ecbbe6dda6938161d864cdbe9efe45b1c6b00cc3b20bcbb06b88440c4c5862094c58428cb11d93355e3548c0087d154651a84f804ec860170980a52c86e39c020c4f92932d62b20e96248b99b16e300c8642b2a0c21be5289d0f5710ca547f7799924158f00b36e649a652344a4c463c227da2469c65648874ffa8a68f2a48c6f538e1ccd3294b2132d5a4994ab1583e75d654cf10d1e71984b32248542781005132e52829aff2d083f094c192c5557a69694ebd68240bbab05a13aa56190b4f2028f353656458c84097f999f4a954ed9280a6c923c2e48983e7d3a8f4f2eca6b20ae1842d4f652aa72d56866522969347344939925284bd94dfd9efdd6699c23278e64a8242a1ee94ac08339fc747378f6abd19aba5badaf53c47495634394f84999fe249354bd5ad542aa552b55a1be57c62e080fbd434f27b1a5e6a958c97bae5a89ab55027479d5037e219b4dfa4f4bc0feb3aeff37e823449665f7f7e117046f4f3a70b9a078e012c45d60be03c4553f38830f37700a1b5033cc4039224119024dfb30d80241a3d4017f971c7a83594ad462a5593b4fbd91648927f91785ade62d1ead1a87a76f1fc705ddee7615df779988a57ad8af7f2bfdfbcfedaeb138ca68133decf6f25604b61ce39e97bf43def3f918501b1e8b7130d1b228834f10868062952dfc322be9fdd0fded3df3e6bc48ce13dbdb4d6dfbe2abadee469d27cfaa29f4f230470a6067def331caa3662ef6678ff79ff7d6f632a0ab93148ca166a8a172ac4f36d744c068778ba9b11bffb41ec4d25a00b8e147e3024073f34e8f9e8df2802d7cfa2ef7eeb44df3c05e1c7700949e0c11bfca650a530c43a300b15c511fc3d3685ea331519df7bdd6f94eb8e074db3df6f1a27fa29faeeb5df362e7630bef73eac93e1b58844572546e3ef7380400786f8bb39624f64bdffba96ee85f7dd3c6dbc3b4fb547f53eab76e338918dd8c32131fda6f15e7a2fffea64782fbd97de4b7b4384650974e098fa1e47cc3125b30e9c6193e48d3ff246f99fcd3c99c872d13c66d008a84656098939371209a110a110128b796a9789a56290a6e1f17e3707e0c526e2e81315c6d49c4880a5085d681a4f222851f09e90a7139367c7fc31a78d37bd875ef634e2842c1b15fb2c7399a2d49250db51cbe96cd46ad4526a336a316a2f6a27a536a8c9eaa7308242650214f25809ca94742fb613eee404f6c907cf27320af239b990c9e664c19407f14fa6be4c6590264d9962a466f7201d935bd52a38537fbea7b269535be611929f6f832b431870b722ccfc4cb998b3fadd5c47a3ff2cfc60128642b2e0036fb0218c9284fad4789a9f912a8b914ccf4f64c29341e69c382b21d24573f13862a4888af4f35086c5361a753170c0dd6f3d324d9aef02be4cf9d0c620cd7d76d234699e7c525e9ab30849e8898c82f07ca01489f43f1ad5536a6ef4a7c6204d9a1f534eccf9f3656abeec9142f0fc4c025892ac1a904634392ac2cc9f33982fa8842c587541f154cd084000002315000038140c0644a3c178288b535dcd0114800c81884672663a92474192a3200e0308110000000400030000080464860c00f15574c39282b5f117c87c884521baef4cd67316a23120203acc43381a1707cd4ebdff2ec356b11f98f8bb54870108f72e45faa5756116341a717da3c9d55f27fc7a2f2aceaf0df9b692974f426938c16ca663cd5f4ca4c56468759f92fb7abb801c47d1e8b4a43e76da9a72cd70ff5a9359fcbf7066ca3d845788994ef45a9b877cc2946109507e67876f59599423f3056b9490243415d456f44296e75faac4c4ba7dffa1816bd722ce29a58ecf9eae4391eb8d9e350d4e45348a915d86e9d1fd7d825f3ea9059a2508fbfb4ec901015443765a1ab8307b276dda42a338db62b9eb72f43c84b216790af1caacad850e8623b7ca5a146553aec69809828cc9e4770b857573223298304f2b1e600d12ab9a367c9254b1be39ced81a0e04225e6e0fdfe826ff4fc1b0efc84deaa3e6d6816b28b8d3880ab41f47d049b5367d03ab74ea5cf767cf05aecbb3f8cdfd0e4c2c85970729d663c06750bd946ea1d114f0e4ecc169a8c3a12bce618de48336a3624b188b9cb35bbb1ded9dcc7c0bfe23061eae79b3f4a3d294004b686243a9def891f9bb771a42c847f4edaf1d12b59675f156b87fc59bc0f575756c6054c8b837b5759da4ec37e7e2de5db361ba3fbf047bec875e96f20b9ad80e8e7f25f4ee6cec6816a1bf835c2ee5457167c0f7b2285b3428885444639aa1f4893c705058339ffefeb7a79b3e56b027b703459203b52683a83a0f75e9eb78e65c5bfd7d763f8f157618075428364bf79b1289a990db9daba20d3f2a0508272f78a5f2913f7784b3da612f4de8d2da67b8bb763738909e44417c523814736483e6c3c0083a3f469a494b57a0e88625844d5b2537ce115c309c7cf88ded6da10b53d0475686f48ac76194320d9adfdcf3f4a960c06f4db75c7fe1d0d17d81a2a168fdc799fb91ed22617d2b6833c947395aac1ddd6718fafc77673e2e5d5ba48cc57223569eadaec40dac37d075047a2abc4fc8c9d74d40c24102c3677dd5335533460c720517ccd61ae6490fb20de8cbe56bc01e4e84af591e3002f50532de8e34a8e4918d74a19e0f21d03352b60d24cd5fa36ef510a4fef2a629fbe4f4b4085466222212b7ce817bdbee963ed7b8fbb35c26f2afaf3aa02c7acba0517f1a811535e843f79a76d7c682e61d44219142c2420047b7885d429cd2fed3bd144f0e63163a33787e2954a373248afc0885e6c86f3ef8a1e16b7cf276119b81aedc842665ee1944418adb295f67b3a157e5542673d6ad0db6416fd0ea450a635798e37670c75e181ca342984a664e0ae883f14cbdb67951e6a473180acb8d2110316b89963683741b4f0cd10d1eae58ee3a34a55afd3eb85ba8625f2939743f496ad8b69fb4c61c12dbed15c13f1ee17bbc2f258ac69a24e77eeeeb7c1a6145729f8a157851a25bdead6186d0d855ac26852756910439de2241d3ff47c6fabffeefdcd59a2ca19a3041f7cfd6a7550077f487979d6c56987804987ac7067bb7965844b57c97d10266e0d6c98c406a98a538dd54c7b4678fe4ca176f939fcf027d38d86a2f99ee458988e23ba27ce11ba9eaaf02ba0dab4f621feb274cd7b61bf60ea510f4567a078dd9c517be2f2aee163f8c5f0fc2a24a0f3ab7f698a407c10895b36b01a5317cd4a1f44440e8844dac8ae1b92d7484dc387aa3ac0c664c9a6713652cbd799ae84b6307fdd33d854c37ece5a621b66901af377c3855c1fd109141a192bef12571297dd11b7393a5b7ca9c895ef746044c379cb468d92cbdbfc2505ca33b9d87111ee51da3b1fc42e857032d939e6073d973209f0163fee8c5e6b52657e4eeea9eea0539a88e6ee612ba73cc6061043cf72e125db9d123833d95686c229a596f2f80c06c71109e28cfb54de7fbe19dd205f697a9c0cf9133619d3313c38cd442051d05730533a16d174e0008563b4b84a9fdc6dd04422f5b0606b05896a142a63506cdb4eefe1bc55a61c087bea2bf01e4ec06f72bec2db940214c19db2fda092c6c8cf88a78837ca71eb483e2b33ffc5ef3ed2ab0bc0251b943a85ec18af93077a65455c4d05a19f1e916d4dc1d67302a8b1b7b7ca322afe4b4ff16edcac5e0aae3bdf3c36fa5dc93a4ee9fb4b9bf842d8cac7967ac702ccc59c9f27cef29ac1fa63a87c220893f90c4c2408425786b6812a21e32571b1f9298a74535a7b18761e054ef524ff2ede3ce4610ef34ee3cf529bfd97ec88d6514e1010861d643a3d937e15de87d6734b79200fe63716b64200de9a30d4e3bbeb9c8f5bb8a33efa876a4b00033824f5bc1f5f4dc8539160c8ed7850633d8ea346e43724675581fc0b9e66df1fa79b5e4d211672664f9c5ed49d383c15c2f30da6995a75d78f196dac1f2067dd73c84510f15b24301071a2ea9da0fd9b0937ab7e864faceb467b9ac13709d5b25086ff70b9886e46546ba96439161ce6b962ea74115960cafa01baf856c7abc03fde711141cb77a464209d8095313b4a1b52d5d06572b1dd95395d2514ba29f2525252f18b6baebb2ae77367ed75055af6c8e1d1422613e80be3bba82ad95fede01bff96ac4363001b980f5dc2fc097a266f64956638a5620cd0ce64f89eb2a5c768d99cc6c033b984540eef0ecf1f166adb0eae6fe094cdd6a56f25a1941ffedbf40c6967f0d56615f4191904974a1fa19a275855fcd2cadc306b50a82566867232444155d64cf1c9811e91f3118bc153fe50f8da3c73866c5cdde285eaeb674c72b588018e42ece0a2589db63862d71aab912e7786e6d46b1b5b18a1ea98ca40937a6812f050e74a81a0ee48a51c8b7cf1c4051f85373616427a307f23b7b892bd14f28c73778dc2801a8c97c2ab851b6f68253dd3c5b54367f21344e528f247b76846161ab81896570a57be2f9c0bbf7c3bddb0ec68701d78b573622d6df09a8e9e6265142994e285a9f94fe54479096ec302a05022903674e00bc557b6d2957f75edd734f82c020fbd7dbb9cacf967996c2f02ff98c8684aa45504fa3fb95589546c3095cb26c9251f11d82897c3c84b09dde6ad1ff43ef65619d9246d1c4e1aa8f58d3f0ef6c2cba0721fb5fa9a0109b179e988b6fedd1366da724f99f0f45df55f5878cfa4e39c52422be250485c636c12b9c6b8b4d140dbbabeae0583ddba0e7fe939a9c6345135f798bfbc675a97cc4fdd490cacadbb790a54a62db0f866c4b58fc2f950e00aa71c62e1a39d6d3b1d3fda1aef7e7dbf841a2a26c72b227e831c6988829b3bfc2df03be788d5183009510a01da47d123dd1e2762de0a22a3f399e400dc39e6da837d0e0afb94172aba35c7a16cdb9327d29d7f00b220fa6aa33eddf9a7bed9ff319fa9518cad20eeffdfedda82ff4f498877f4134ba4dafcf505e90b69c84bb78f7ee22f599e1382556fac8fd9f5f7ecd1e1ed39fc78228d79734f352f303500b3f29d2b028fe43a709ce96332928aa51ff7ba1dcd3ae1bd722f918a49f2965d94a67738a917dfb9db517b00fc4686ba7ac9b34fcb7182835925c26a03b6948d556568cda2d2badf8241b055015b5befa7bec815879a71d3edb348c26ee9ef659c5c65edef46f597f04962f8a74f31a64bec72fbd15f317f56fac8ea6799c72c744a992cf1e71f5855445516942a0417e136c0623b98e93f7a1ccaeec13a98ea3c873240272c97b12d14103437463d731abf0883fe71751f6368a5ab79f1f8011f33a6c9a4f6ea7fe4a65a0b13c7f450012657e75b0c29d23ca6ea182cf4ea94d2c07cb285c6b5eb667ea8e0cfac72077fd5cb351cf6c71f7c5909325c04a6e1f709c5c0c63451f120e0c45671f3e6f2160961e94ace87c18eec93633003ba2befac7a762d8282bdeb93774a49abd4761f28971fb2cab14bba48acd72b26acbcb5a2ec65db7a37507530f9ad5edf7a4516d8b42a832a0a507ad88b44afc08cddafb5fdd40a85e9ede0d9ac84e45fb33299b54c41aa94e9160e34051bdfd9bbd2670f17f622cbee8a6ee5738b5f165498232d2766da020bb07ee90d6fdbd21fd2a97080ad741bbcb80b64f29f418f60c62a6e7559e6448ab4df93a2ca045eb8c6ba75ce4a8e71755a0eecd4731c088d32ef89cc8e842cc8e615ccc04ed8e51310be083a52231d89637a121918503c3e8554bbd590843139c2e521de80d8c3da09b5eda2bf2cd25bb382b7acc3525823df6e971894dd33201b6a1e32a22d7235b2e529d743db841e98e7bf7edf2c4c429b5adf666c986ac2373e4d0b1f22a383c165aedc8b777327ceb26ac91b81728956ea783a538e040738414691550bbc9d5c250fe02d337ec6f32ee9a5c31866016969a6dad665d109be622704a2cfb362f2036feb59f0fb515e3466ce66d67eb6aaf658173e71cbe05a1f4fc73f90b02faeeebea1ced5d284019b2398ca1bcbfc4c067ea1c53f2f8eb34ba05da9f09c65ec139afacfd76d59083916229c84a276eea7e18e74c4a9e8ce43efb60543c4affcbaaa0d681b442bc809526282f79c956e68b5d5a009f557f6db5fc5593cbd124d0fbeec4dd7a530ebeecae98e7d82f7b744963018d394f366e38f3fa2b84457a74c911fce17f31471a9b3784ee91862a41c5cd09a558a1d186258c06bf7938705687a33024d93159c0b6f4555bb69806aed278eab7f6841292712dbe9edefdce870e66200a8c360b69858c7a4bd9896f401fd506ee45b553546ec89ea376992a44d5073af4c261c05a5111f7db4a847b95f77cbc3bcfa6a62a00b42121e6dc959ce32cd6c1e92e403e4dd1d9ab055dfd520c095189be2b2215bfce3cd6e8f0e576ebfec4e0ccb5035970c7988faff832b42b48faf936e3ad39ac12157b6c7adc6fd5e9b61079c9c91f14319c2b88e1aec790edb2cadec2530d16c31a4b6036a0040826bb06bbb0719f1a95152a5101e8312ba6eddb4e6c56403195b5ee817bf9551ef7cc1bb34e2a284b335ab025715b84076eb97c07ed7de576452ac51f06ed23649ae0f82372cd09f3bb056d71519a763be286bda420b43de0a8c51980ca7882388a846742d7e41d28a8fe8e152505fec7a8a723a8c3a8ea0f2eaa173e0100b58e3a147b608f8392713e60ceca22acce80454257295f9910a51618e3ae40f80d43e4b8c32f61bb3f89d7833e1816205a85c2b430dddd4cd38a46cf09a08b12a8864a18cae7cf8ab643bda57c31a71f6f9795a4cc0e8db3f2cdce80ca3b634039099cfe0daaebd5561c33c74698f36b3d8eb65d5317ad4ac958b354f5456c56f37ac3bb5f5457850a5c5668c6253122273c66f9713178683622e2566e185fdd88712a7a8a31d90b19839a8824edb57c90838c93ea930cd6444819ce346a19a3b58b19c42d573396de5c353983dcaa672c3c8ccc355c130d6ba4e17eb54a22151be417c23980882669be2f624609868903ab09011213eb0b3ac807512a0e32005fdb72e829438cb583ccc37b93402ec4fa0c0037bce6c4047644f4f5927f304a9e63145d4358d0a0848d2fcbfa54029355b885f4ff14068fdbb1b50f1311278836e8695b482fa64852d26e6a7116b3256d138ad986d34ba680b67a6b5ea9247c466a563c86f4bb0b535a323fdba89f3820d92fe06bf70c39d20aa079d074022fef1af042381df2936d2f8ceee67c1f36ee5dc7e2e7467044a273717ac78128dc6b0f45ff761620bb045de5ce14c022a75bb11d2db01ef710eeca04e05eba1562a0ac7f54e8c7c25ba27ea00482d4f1c0cefa0a8a930b6fd9886796717feff002e5635dd81602c9899f82b97cb05e87fb0ee8ceb52e75126a07f4fd4625dadb21cbff17f8c9d19702206c7057a82f47c502aefc85db4bfed1738ad0e79a3d145f031c67c0d19137aa52a690d0972e0c81b9aac918f89f84c246128cc0347d0851435312755b954367bedeb2a47c1122f196a55e4598fb628da19c5caac755e3987a1a9fed6672a90ecccfe8f39ee02b76d5c35334f0e2d7db30365a5feea4b85762eaef96672daa6ad137c4b047938b743d5336798984c4eee56e50e4759ba12e5815bb36df1672e083321fa00bf2f02e4cde9385f186abaa1a2724ca607aefc46b6af853c41f5d504c563999f3ed6015f0a260676ec381d999ef01b21c337ad76cd64681c0b36b6ae88830d1587c80441a899bb71aa9d783e66697927ada2950807b2013090340340c2096d309cbb7ed7f34d9f99a742415ca93e7463472f1fc4eac1e701bb5287f758ea6695d25b46fb44d840f2ab8db7accc145da5ff2eee7ee1730779d47b0de739f5270b8db1073b895a236a83c4b857b94ed39d813788fcb82486ed4d163bbd198cf4c3f1172fbfe2bb0c678729aab0994b53ec749d008d77ea1c9153dc71d7b4c61911ddd624b33bcb2f4897a82c7d6fbf76aa4843e25ae9dd239fcad4c451446eadf066504e7ff136fc77fef01bdc259a937637fe53ab632efcd3bd662e5d008da1e2ceb6015ea1606d004ae49089b3585c47f758a4bc6d5ef6240915dbcd6b288c64931cd3c2192e9e69617164fec8c812d4bdf22212867c04aea13e610edad3d316a58f7be73863ac1c9a7bdb545974443c01e67d492cccf66b1d71073aa78d9539d2059d8ea6b6fd8446693978227fa808940cd1e94eb67027444b02ca6f2e071983fa4e6cbb587ae0b8f9c52a49aa22ac4c1696d91e3684cf26fd32c1903d4a9e7439c8868748bb0ea29aa858995f3194698e6dad3e244bf7522ede5f8f69ea0f10984f2d9130bb22ac8f33228b6cb7256466f7b6b7fa6ec9dd74ef841f8582514cdc4ba51c6be2a788ad48fe4b1cbb033cb851f4b83e3d4382be8aa8d0e0e4be0dd5420d86a30d3a5e7575beaf8da06ee1d2465dc4e39e6a1df59ab078c0a9676ac189c589aec6cc7beee4036350a8ba37162adbe8dc431dc033cfa27b9fc5d4332d65cd59d63fe05d0e3c56d4c01f42a4ac586174f4a83402f3710e6807ce9a551873e9d255636318e5de5ef56cfd78e0192ae5f77e50f887333042112e9bd71f738c29c9507f83e25b3604a91fcbe31701c789e4fc544c0878646e16be31c909b316c152cb4fe5a6521493fa79af62d053965c32d464ec590d74532686a29b3687292623a25df38c4c8350c008223c2cf9a8a52a4b6e5baf3b2c56c9d8075fefd2d9da2262d0a629b02cd943d71a6be97e9579325d37b0b27b48413396da17f9e0a73b3149369be21cbc9f68e25b45a95b053b5ec29f9d94c42be943bd973c0a472a27d6725471e720ca8cba4a603accb9d2fa6dc58f8b52473510d99ee2a297e598d7b2751f27c3a1633004c1dda161493a616d224d3c994d136fbada6b4253bac3dd60e6809d149e332819e69526920190ddd801d032882a28e3f28efb9115a94371e0bb454fe4f6ad50671c84610d0069421aa3790689db7bdd3ec4c0cba8b1f3335e4fe285bccbb428d0eb6372bba73f36704dc25342dc6f07bbe7b314fb0bdd5257c9194ff2178a27790ea5a4f1a484902afce31217677b8940fecec37897d5cc32407f35fa3bb4ea148400338aafdbde323ac4c61d5608f8d88b4f108ae6deada15cc1f4791b4f5531a48926cb02bba4daa64281efd0173a0cfbe595a369ff51c2a4fec65ebf7b951d48279162af4d8889d66b81d0f2328e0c94b804e2c7362360ffc1ea4d95c2c7fd526a6697306f412b702df6ba47f5a210e0a9ee73dddbc49fd1446064516defa0e96fac6d2e5bd955d2cec0a7acb532fcc9f4c948be2d245e8a14853e05422437484137b8eef3dac68291ab9eb35e8973f42439f3b0034c9fae498f187a1e1966f34b3724b036c1b59eeb0f6a6bd806e4510186ecfee30d75bdbfb4abe33cfd4fdcfea1ebaf6f0cc8a90f726981d7e5a4b5df386fced8e422fcfd70af7ce11c88063c900f1be3ed01dfe8521a2a7003c10ee2cc5b221ab6a14404cade73e77bbe5cc81aa95778c4125e90eeb84b62c0fb8f7809cddc42a112cf04c955ab2af6a63d569b341fa5e437f61a993bb78c0c904b5ac2233286e2fd5b342567b87d1558195ac9e3e324eb40401a950bae283f3ac7e4699fde24b16ca38be938c731da8e4687b53d0fa318da4ba202bf44f5ec4f14ca96166f4b18e9160c3234a532fa3444558fcf39766ca170360fb1417626b4213762bc15fe53bbb3d464b77367bb79b977db313309e8a7f25083b767a44e7d45ec595e0e9751c460102b1081eebec6adc19ac8a18138eb066a8b1337aae87080defc44628ca70d6753575b96a3e7234999369f82286902a3c0526b3e725f6fab0ee4e147a10139df3f3dd45799b5cef0a187f7eb312ae9164e1d0c08cf37f0840370e334ae1bbf21627359217885b298a04631282e3a60910abfd0409452ca85aba2c835280548b9a3dfff84a1632f399af96cf914e6d5207ba21bf70187c8fd7395dba36c951577eec6559cbc49500042ebaad12a2b8f1d15da14bde7e29573e20a6e22a32dbb7abd084c8cb59f02a912e37c28f3cb46cf48f40d667810c6bae553a963279b9a917d545e28b55d32aa69bb32c7f2142a4bafd58e6a2e338d6b928d01334f78bd2c02959e31feac74b9da5a44f42605abf24ba647c117335bb3452d62b75e52770cb751d1ad2a19fbaf787d94ed3f94db31d693f04555ed3afbf0bcf85594c44df674040781a5865e04e8bbf9f4de16c27c062b299b130b80ea3a89c2e51914441432f76177702f95458f90f74193ce1ca69d5993938d17f39332e0745a1ad6778a081c754071fcdbc7e76dc7cd37489875ccbdb2964734f2c41ff0e6fed4277afe31c927ca140cd41a484a4e1866c7d7ea0ccfc31bd8df3eb64abd9d2575827b2414076c4f497d0a8829a57fae97b806913dd12105a27803a1b0a8b927d840f83994cee873e971ca699a8799a4619327f96c1f362b9b56c3d8547ba92459069390efdfdab9a647953ff04a096858f5ad19ad772fd0caf23ed6f8b683a3b14bd213752daae8c4b81b3adfe8345bf1d67bf3ac50016ae1cadfe9816f77a7da3f578fe0c2415ef6bf019b302cb97686dabfb9554225dab6f6b7bfd74bce05a84dbd49d962afe306505a07b434e999631d8e2ff8c15d8ca2ba86848095ca9a0885e3c7a169f1ddc10b0f4678369817eb0bfe1bf7f297fa0756690e2a1d9713d8d1db0d25212f85638aa742a2c5c2daed48a42d47a36d804207bd38e4259372a0275491c53816a4a70df953e9ae7f09314889290fb40a9e1930e21b00136551499c6aa53a6000535fb6de3138db560b855bfc5854211976db5e9ca1e6c92c1dd564bc4db09cc597037b4a49fafdc7ee6e6afda63b12b18a3bd63a0739947091021d7fa11d9ee0cf9f2ca9c6c3c069b8dde0611d9943572ff37a7daf2d812d59dfadf9cd25e1c5bb61e3268f54214b445693bddcfcad4610b9fabd6f14894c01e1d1da3fee20d36d1471c058b103d51a93538a93f42f9164c2458f1f4d9da519226ac4acc5d3e8e2211a41add6ee86eb33d0eeac80377c203d7ac1bac48ac56272bcec40fdb60218b74a49c799c6752b40af944840ce53b78d89628a92ace322214ab4187fca0745043d45849d73dc81ac9402e0c1c84a91c628a76096d65a82bdcba05b94a2cfab8cb89627ade6a3c3daf5d130bc1284acaec4fafb84345b41089180775ac9f61b909d30a842ef5e6179977bef020785365db17aebc2eb6f942165b3b374d092f552a3e72771a1257ca4d80e2717d2a491be1ec63fd623fd45a8c827027d1d29173e20812c1ef54ed075c2d42160155a26d565539069d4caca77987de3d369488fcf8e61d0c4c306c666754453e3256aa1aaca40930a2b454f5040931405280deaf11475dd14e6c5c6b7f42f9e72250472e52245415ea4ed78be3997555d0138c68d754a8ae9935cc4281d21b44524388d9cc8a654f1e88106f5fb7c3228b5e9f08bdfbe7ff934ca4b57be7b8e50bf3696cd00ff80a7b1390b9f685ed81ae97d7f2c192d49059026c2d31f55a26ec672a005855edea4cfe7728f271f3603a20cf188d64e772a9a60f489ba8b93f4152798289643e6bd41893c9816d5a4abfa4811cdb536a238a2a563f3145a39e328454a3a6caa85d164b7bfe6096d05740367701e2cc0a087799d8298ee97f7534bba15935cf5cf73adfc97a86c780f77736cf89a9a0cc62da5387457cd860bcebe58846af5a724c591583911e8e310298fb90948abed17c6b9101b576896aba07161187194fcdb7658756704429bbcec8724a108cd2124da64ddb392ffc09ea84b698d3bc597ad1d5f3f0e40a1d150339fd5e58e57717deaa7feaa646099e374ac5b8306be4bd2981c63e8e01661833cf7963f9ed18bd65b279965fac8abcbdf59d05330ae0f80e60621c5357292e47625226445d1d1aa31361acf5caa413b0635b675ac60c6fe2caf56f5432b9909e1b1c6ec67508c47621718f186dd42531b317ed27cd1b51298e3ee7cf4ac5008f6f937a8673e35cf3e73b7fce4c85e81a5491d1be85aa863d159147b0c2b0458f3c7d79e44954fc4ee4703e57744ef685b7349e3d654a25f45631de496dbe1d46860cf45220410a15f0b6ee12d4769740c8d8df9c1927414d2da171f84a0d6157b1d1fa59e4b4699f3651ff5645b521066f43010de5c90477e0394328cef650376a3fd99d69592d19ed60ae5e69b0fd2c1057ac1efe9e5ebc8a5f19ed6f31e1dd751f08ec3617a1f8762625fd41c5e33fba4f805c9109a2f8d72513a44667d9c4472343af20f896f223c5bd2989d27880366f5bf565588972f54197d239f546d7a595ab8890cb728c79fa274260d59a6ee7515a5cc8816eacb208401192990f2fd7f8c93fe6a11a89ecd0c5289298231282e610de805483da9a1cf819301e5a6f32c4a0604cb0bca5caf091d1b75537b7425e6b7468059a7ce3628bd0fd97b7fd628743af6ad13a2cbbc3b0679c2c8964696fd7200415eb59f25caaf4dd2e6baaf102a3486a243082f627ce82f083aa9c841324cd5add0c04c25260dea10b33649d77688ca47b795d219bdca171529d82f503262d210e509723f76686c04a965966d92629582829c240aeea0c05f3c124a362cbdaccef1b5351322ec4b92d59647179c790fc236168be90b36afebb3ce0fe65947a2bdcb4d4c0ce89a4408a67120a97218d20c91c8c969785f2c9674d468db8a68e7eaa0faff20559f74faaf7eb4e0950147ead0f407ea9b57edfe5b58ddc721d6df4c15b719efe2ee2bcd10adf0f07a3d911454354621f4132bd14e68d42c7767494a0e7786094e77555932db49ec0b043647e10fc665ee75a6a8b3f10c88335ce30c7224870000306e01dcb03522913273be1d750f56dcc384506c3034c6f9d461b65fff35778f09f3784769848972b952f605c7f4cf8bb317e12997267f190b77801ba54e8d113ac4b79ea8d714f846f6730c8e28924e50a32b9b8123289046204df779453341c9a05e05813c494b23998a228dc9aa498cb098b912449b3234aa307af70d7f9005afba312a4fa0512a69cabf305b554ec6e48fd497fe9edf872037e9a59b4414e1394741f8054bbbd4641f9642dca08049d14e7247e93f24012b9da9148bf3551f6d0200063c63b7d83ae04763085454e8a237431412d3c3929b028e28b668f1bb281d7376b21f6bd4181c7ca674fc4e59ca5ab200d1287300e88d0a816b47fc08f22d2a262215fae07649c92fe1ed383b92b310ffa1ed77c42b2b68e073a88545d7d245787fa55989f54bb416de462455d10f411a98a6a7cf24f96ff49b6d06eee9a7374964852ac1c9cce4d307affcf6252adf069035b6af568cd448f44d8aa7a5954d8807343f412a61f84359b67231de282fd8f2bc738bde6743fc8800741da92961da0104df4cb576723d4ee1a5ef241e27a349739d595188425f480c2ac9573716c606966fda62b81e6c2168655a3cead19675ce6099952facbbd70dc1757b8bfaf3a894a11fce0b9d9899065720f7c4c79223fececb3cd086cd934427564ba8c269f8d3a31eee14629d4bd70471ad80ab18f1421c50324ee97c9cbd8375ab1f1899e74db4fcda824e090ec6489b0a7540131895b3ca11461b2dbdd7bc0d7d8f039326871ae66fe4074bde6bf41a0e06367e25c604bd2603cb6b8234228188f9a71d488a7a50a74d0eae48a90e15f5ad968f517888265f16a450a64ae684b9229efcbfd3bc6b9d68ea91859fcd6e309223f889c71bdea373da2550dcb9a69215ddee73dcb0b38a2ba878959e603211f140d03431e01e4586877c832647260c22f639d34c75b3d7572d472ec7a2846a0a69aaa1437ee76e88502947b71e0b97109a2bd75c4619c7fc2d557a2882b17e9455f80a160bbf32e0acb3c22d6fe9ee88efbf3836d1c246b5c9731d94a196880f4e4c09c916b5a40a3897895b7c7c4830532b035fa5479ca6193c9213fb8f529795f309f4078d476207f33d201fdbd832f2020063bc631ecc00d2051fb1c729debc398c75578576e0934cb63e67f182d43a1cf19520bc4bbcff0f524f25151a39465acbc87d458a8aaff218b463b925c892852fef597866c2086bdf4a36b7a8fa05d23f38f40a5642b96bb97f8c88388a0d638f9c6133979b937955f22dc7582261d92eb1ef40389ed4f2c6bf818ee5c60118d0a179c17e2dad7bba8e685f7d3549df6e729433efa240156624c34f71016f2b7e5479036b3209e4d4e0f03207f35a1fcb16b8a67410855a1579533d6f35575dcb19444fd1e20a2dfa927424641df175c8a29cf695826202685a3c53b8346e3449f894c9fa6252bcdba92285064012652be64e3219ab991db436ef4c8b72a616da81942a5cc4933b1290dbf112383ca5a3666fe0785a2ed96d2318d27981ad2e01d6d9206016315cf08e04a9afcc5a2c9bfb020472e1a98bca5017410c65579da2019aae52f78cdd0cfe5dc3e66458617c46f9767588657e19804506c28d51045efaa90686146e599e02dae1abbfab0e087147244348631e4230cff24753e24828600a3149947111079831d4d78b18edf47bad25bf44d8bae2534c01dbe7d39845435d69cb7acc480ce3ad017a9d36f784ddf898ee3364d1c56c499313cc1b26fde218291c0ab0a0c581024d8483f585af7b8e853aa3dd488cd5db814452faadcaef1c19273887069b7f19aafbdb2446ff15b0872483deef982c0b69085d598a59d574fc7ebad6f7736095f0fe0c4126639259baf8a122d4f0f170025f0796c00c9a4541c48dbba94b6f3b80b2a4160daffd3cea21edf5455c4f098f76c1b90905a1e6f06c0ba36e22f3dfc70a21804027ea825065df2be8fe0f4eefdcc313dbde9ee467344b17dcc04315ed3c50990a9879b440cb8a7bd000d885e5f499da2440c308b5180f1f6a3049c3cf4c63fdcaa0658cae59cfe4c6fd8b5f28a39988517e0a13245f2563aadaedf9bb213ff563c425f5784744054cfd020a38849f261794abc30c5fa0ca84c21541437135506f8071906138d3d2abc2fbb6c7ecde8a26423d5a4250d1afc01ed81b7515c4c75825a84ed1737346360f3f2daa1adae99bc23d3bd38f1a45e346a6a388f9fd25a14a237f14709d79ec8f0c5894cb268bcf90896b8f2dc520cb2e9437bd00fa6f767cc8cceb50275a9eeb399dc35aa1c78c1eb1e4ef5f72a1b56e358b14465bf583a1befd8d37605e29355008118b7f18d4f3954290dc67416f39557580ef42fb9e35f24d1d469cde6b17061e286c5137099a82f3818a544d92619413e8f9cc15cd741199f3633a82d8977a5b52574f65c90acc8d65763505a0b943289958e2a8a708632ac415c2a9d9deaca7f2983ee1ca23ddb79bcfe74b11f8b3bcaf729c0c19f732920e6b864a76d82865ef5d1506796b518f0e2c15ada58eb606e56b5d133e5d5c31447087d01704b32ce0d66da1215a9747df1c4aabb29c2bb50fa2128b004df8b96dc96958ae85d3dd52743d6036b897da4160d67303ebebf58dfdbd32f0155e18a5d490ed81370bfb5dfaf9fc5c45ac40e1dfbfe6ed60acfab164c760e26328c68738ed7c5812ce9498ded59dbdd64f425cdec827e009fc15c77325001035f05c7b8fe0f9c74a62f005e59808cb3cfcfed242e843a4fb5b83153f016d05b7b9363a58505dfbf0e013ea9da9d2e448d8cf4b4e3fa9f6db018f22979a09671c4091690b62ee3e3da0a36a969ea1ad77f3291186b5347a308229c2ebaa609548b071653bb58ea2f5218480d57edada859dc3c3e6f092003610ed1e9ea2ac49537541fac198424c7dfd95b9c153f329045421c7ba24e86d37c19bd4b1589ad778e2e29b46e0615763aba4f81032e29bffa9674a26af8f172130bba438f526b8470b27b0866d1955a561b95b6012188de32aa42cc956c9d5f50a14e6f7613c376827174e9ce7424ff6f80be46dd7fb85723bd66f20b54b1c54044559454b0154f25fef75993264effa23d6ecf65dbd19f23db0f3997974c4298822c241efef7462d393e40d64b83286e44d65e9242cea185ab7ffd17e2361ee08cf09593f875a14f51159246040df2a6567c60d00b02d661c3d928fd859ea59f1b7ce5fd9a587e139aad58ec6ac220d5c9d8ad7b0a97ff8095d98b8328683393f7948a716dcb9090b847239baacf70659d113d4fd6a482dd97b2aef3eea4e31d71c4fde1f1831370b67061ec94ab8c1dd8ec0478ea090a4e4be01309c149012cc521107058e2a594ab4672ca250987402692f05255483b920204f0fa3c4c7e965b01d20c0382286ce3c6a9de21c14e94a484a18ed6091ccc7d43c58602b2a184a3f189f7470a15614528d20276d8202b45122d1404fbdc9a3c80e696abd84702ec54cb7024e5b32d159c98e26ac8f9c46b41588fe5498042a49734a95ed558d121e53400e0662999b0a1c93627f541eb4a81429d40091e24a9db45df10881e3d3c10c1a424296ff0e3c4e246273e0797dd31fb2164082af8ae4f416b13503c912b738747c1e83c40c4a42114dfb55de2e58884e50069e0eb1440d7de7d625d8f974488d34fc16cef8bc9dd01eed01fc447dfa378148cc4e23202c5774872cf67834c0132398f4d54b4c8fb76d17a46e32fc50fe891938afc26406aca3ef41c5060ad8ab9afa817ce9039e81471bf404bd5853302602192782fe27533b1228c94beea393cd10008217ed18fe6420ca0cb38b0f867a80fde3ca08bf018426f57a7a175feea45b4d6cfeca7296195e3017e9751ad6ac53aa0a0785356aa093c81b65a35aa06fb6e09f9725e0ecdffca03bf2088ac5bd952659db96cd577b8a6c52e0e6c8e06cf2bc07f4d0b620b9adffdb411ec2fb527b84677c22c3b1152328ac7ee4ddb51ac4771a39ec1920f71b2ebbc73a69fbea37e208e6507fc656a52f1f8beb0213189dacaec9ab779cbc411fb70d63f7dbcbdc906502a136e8aa0324e4b48abb3627a6a087e118777c822fa562aacdccd9f98349ce713490bb5cfea577cc10e5ae633a010f7d30437a089e486224be9bd3dc8e0b0a0baa60fcb85d81427a55322a996ebfad86bca9d145ca92a749c8abeb5ce75f20472f6e3cfc995e3248b6682a99c1ec95393e7ecae5baa430e9a6c41207932df9e60a9ef964af9590d13f9c9dcb34f40b7956f8f3685069c6c4c22d1a65087fcde6b6cf3b5216f0a5d707cbd8219a2e77b5075f380e50d03a261bf7ba0fa4ef3ce36a23ea2a2e8e2202f401fd0d4d896c2f95f29dd384f11d61c00c23290909d45324a4e92602e50c06b3b253e33c571bb1d6f101b6cee388c991585813d2b50ac5c45d3b11b1529353091ebf27b18f973673a099e25544b878a822ddcdbcd25b6697fbdaa0d4aa88706c23a38b0ce6493c37063d98585b78ab90dcec9db55b4938cb67608b946356e8c8589e4230766c999e2136811b96fed8b46bd8cc367be81fd0918d41549951a0a2a7941685e0e04a3b485218e77009a63d2160dd102c32209163795c27a297b517dcf5295b251164c1838d4b41b827a6ea558abaad1011ddb51d1a06e061dbc42c401b74768a61978db5b7d0a33ec2aa5e178a9dce0a948d1ce0b5670f9adb23afe554c0b0d1102257f30fa149204b449a8ebad40c88cfed556e6316753df439ec24aa14184ada382eed8875625edf034d0dc0dac76a22167b8ff62713250606cc27021a7fb6e7f84483d1ad0a19c8d48d089ebd8feef0a39ba045fb5ff97262068ae27c13131293d68f8d4ae5a9b64d0ea68833681ce0c8ddeb415d4a985a276d1a4d368c9681bcb029b5984d311da69dca15700342d9a0e9926d06402921972637ed5ba21cb4cc50ee25660191247d25574a27f1234818c534ba543a2c559b5e29eea0b399453a5dd17720dad0dfe3af7e10ce839d86b111721dae0b50f22791f965952a49793a71706221fb331a0a55e611df0d796efc5bce2dda8684419bf441a2c23405efe798a02f5d0c3f1672195225f7d8b012356585c6ac0ad69c64eb9712cbdfecf20a7b5c8756f04c2128066218d8a86a96045084566bd278a06bd0085f88d037dd4df371ea79930bc8f5ebbc5c365756a886e562bddbf8e867dff9f7e1725b06de63567ce786a284205d2b2864d1a922c77b2d7694a6e1ffc7279027c3188448b7509754e1a61dcde6263c74aa05c608e0989a4088b9348ec73282705fae615c4a1d8dde603b6996711dbfa6b3af5fe25d29dada993d9cd437a845f4bc00c6c15b7381a624c76f2a67a0b860dc8496a557c5c86b795e1f38f9474e239029269d6e5e2c8c9d143b51cac8df4b8d54e1fbc0d876bcc1b0503eb29b2b5835ee3a0217b8d1617992934a005ecfb4548a50ac02ebad1401b38809fd50b454c713d6864380cf33dc3822300a18711d538041c91a3f244cca3c076b74970088335d5034192e25c76f50ce81f1f8f685f4e5f1746d0e0b9ad7ccd115ccdbf1a98e1f03227a196b3a8ca5fca32171d5f0d4bb73ce9422da35e035401d9eec1b77a73cd6b8b379b87640cbb1ff4b907f2cebff9f19442f33877e858f11b815a602dd1d345f94501f5c8f22ea08963f1cf0fe6901a97a3cb333fd2022915011abd02e00be9423d80681251cfe9ad600d1fed5da7601ad4d7e7c8d9760b028d883f1f88e0a04222083c7d68d63d6727db25ffd2620d7295e0dd51b934d53d9f8010324c3569cec8f06403d06269eb9cf00c67f55b07b12409bda4476e747265a5f669ea7c7c29bcac658a6775cb8f41b6a065a29cb2d7c9729f1333f03c44b5549d269cbf1042519ee8126bae30597160d9cb260fac29f05e85b09a6cf7e771fedaeb1a31aa88e4abc216df535e6686c07a86a2e0bae76d80725a93b02e6931a7a5c34a912268c477da2818f0ff7966b4e6c8a49c229c2cb9907ce2bbb16c630af0677335a7a9c84eeb59a91e89e3cf2b192512f6b9b3f858516d7fc00a06dc239b009fe3e7a5e4ee7ce8912ef29398efba8ac4df4982337ed38c4f69be20a02ff95db2ebf999586e733c9b577c11998481ac64585243556cbc722d8091282efd1caa19e355d2eed1842ac99d8305b4870e781842731b8f688c87e26805680dac6a3504000e025b350d2401cac23c34824906c6c2e1f94523ec7160717240e46825f98e6aaa4c0ee8e229a4f5d0e0be1bc01c2acb387f4d631ff72b90d9c68783f8ec1abd4d769adc1688315572fd12960f31d60561a9dec5299b750bbd45376730b04a1a31b85d1a1eba9993247a243447fa804a125da0704497d024e8241447fa014d127da0714497d048d027348e740145129d4071442fa148d025748ef4015d2aa87d1a1eba9d93247a263447ba804a127da07244975049d02514477a014d12fd4073449f5048d025748ef4014d12bd4073443fa149d025f48d7401dd31fa187a70775166f4b22e1032fb0a8e5c5619ceca74068200460444b3da334382f14692dae483901dccabe3eae0bd31ddaa9af93596f8b5fb7493a0cd99362728251fb46d235d6c6871808b4910b162fb48ed666de3232c24508f918d6f8cd4de2c3179117fc0c958d60743b04e0c8e64f83887884a23404b2dae7f9177f05e322114363a216622c210e488d399d348988691394a2bc737a3db871a564e89865bfd40593a645023e475ff2edcbfc5ebca98b020a54aa958b9e2ba28e9cd01d73430772ce9c529992967820559f592d8b962bb29261c24eaa5628d247d949b24f581da2309df0c6543d443aa5d43ae6b2dd7876a97c9c0e711f18abf4da0bf1022aa4506431e40eb239a593059e6d993c7c06e371b21b17371c6b3e37da0c4895cbad783f19cac014c86f04b78ef075490e73d47633f084d38b4b381e899a8df1ab9d2f0750d50a81819cbc20a6de9c248ee7ea02650e8f2a9d5ccc9b0928db2f51dfe84a6ba19762ca1a2a17eaf014224ca715c40a564423000e5ac80f4b185c0abfcc0c4b771afb717149dd73057a42ecde5a82df8a9622294e3e923cd1fc7e6a6d7575947b8103492ad547d2c7047dec24f142e6365997330b278fc312cd599f1036e826834d075eaf1a052aa45d28ce381b275aed73f5e1168b06b518213858c38754080c3dfbdf34735c746d5ce0969c71624ba694e1db5507991367724a3e5adbfb5d0ff1c5f5802c7602268f7ab0454684b2f9dea80cabd65f758ae3ea27674cdd6874b4a9c241d5a82db6d16756e8ecb5c58950bbc5c8f9503779e414c78b0d81c6f9188ac79d68a05c78c3a496418a21ebda9d00a91da9b3d5b868c15a0c6fea2b303648d8dc2b5e7284ca01695c07d9d7e71c7158ef8755a945732f87558b545685078a3092c4344adfa66d4d035de30a0b8ad15e8ac869bf18fb18ed668bc49654286538c77b3f035909f6b348d75f4082028ef4c233e64d32b2e623d54d3fb17620704d0e316c16798cde9a4a4d8cee6a6e45ae239046a018497cedc6ba931c228b0272498ac7f10f0c85b5e3a335813f951aa48a7970c60eaf820573813a8e671cfb35445063f08c05ce3560f47ea0094d3354d80296bf2059c09e2719a6db3ce316ee0aafcf98c65c0bbbe32d4956ba23f20df2089784c5f9dc7f400c4cbc0d41648ea23768956adac880fd228a8e6379d2278863ea3ad7c008f2f4f6bbb553c8f153805b36b0d9a202071dddd3ad86d89411bdc5b2b1d0f327ed38bcd84d8f16c83a435113a98a9f61ab32de88036c078a53ac959e44d4786afc3eb9d8646cb05c59ae9a15c5ab4a67037a39f2ea484cbce7c000c3b3308ef51ca0fc8aae72904c8ed312344da1a025a61cc6f9fe3ee7df98473389531c0a7ad4c0227416fd30f9ba47a28d1d85e4b10a017e1389b9ef1c0dd66e0ca8f27ce38e0fbdc29b28ebb5d20ae6823be8d908d977f860dd369d1351a59b5e36932acd4cc5c0ab4f2780be91caa94e2301ee68d994e4a8e56332c3a40d9d4965e9e4b2506c7b492fd4c09d5877548692e56a0e6ae2b75c2b7e29bbc753bd3d146c5db5b6f00d45056ed8f823ef4b3335ea09f8543ec244431ac8f6d08e266b69333a269482285221033a8bec1e37feb9a6d1bcc0a74dd0103324462082d5d49e08c57119472df01bd1a394484057a32f95a7b5e0ab2f3faddbc35ecc31df755420c96e4144d9d2a84db012f309676b36562a870417d5b61c777d8180b2b31492367cab3bc8afcb83a3449a31fd587e5496249a3da2ba7cd939f4e169e78cac5f450a6b02022eebe8337afeb4e1831e1329369724a3dccabc0f3dba526156ea270f1c91e8e719d1246c2244e6ac6999a1c1df95861d9329b27861217ae27d3bc5d396ec8c0924ca5a91391695e22f9897c3900948b58510797610e70801cc4f3d35df952025b9ab5b774ec3efc73b6ec44250e290b728305f170e96bdc79bbf0120515bc750f0dfd70b6e4761d2f09ab9f4a9522a4441237ac7ddb8435cea3023904a9294d39554b57be7ec5ea5b544f11169a1ddfd52983182a5c54df5af8f13b6edcb19f1ee6e3e2bc861ac8075e8b5e2a7d016bea1f85697fd7c8500defaedc42a423f3fb93463f1c5a38539da7943c0ee6fa6b3b4b28f1689412018c83040222e3eec3b87375f5ae028cce2102a2bb2cbb8628655f16bf1c529f531d715cf37509ebf817a7cda8b07f5093af9913c5c153583be62d12b49d796dcae1e2c7339a656270e5f32ebc719ce38cf38f2bef028a7725658867502026eb691d165da29fc17002cb454387baae42d0af6d79220ed6c3e019712e5283edc4c1ff610e06aea4b2573e97dd0561cc9be8b019c416a0e5c1ac95cb8e2a11580ce6e3633d9a3d18f4b7415d31f4bbf5b29596c87cf3a9259327e1bd718eb43d34429d965b260c3871623f5f22b7426adb8c88bf803c5428903f7a5d9033795d6466fb89125a59bcdc16817f1687d540049c329e08093f819ef1a732598c490e960529ed3d327c580451e329230e34ca1e03b133bca0345230b41401f61d60912d6ac062ae71926df895a496eb7ee25c5ac8841685b4870992d50309c246284eb4fe681dcafb5f97a1aee85f672bc2f14f94c0463690c9c77749491a814980d6db5a1c6b039466347cdf249eb002578c4cd9ed26a840f59db547a699218fc3028577cc3bc5631bb2695a82612f4acf72c3e6951f040d8d839eba7bdf94936ab1813b149a5cce6022d5b5cbf09bf149558a04487c8f81008f8f1a4a334de9a3e188ff9aa0f3a38ba37d4d47a9d4b16d30e454b5969a74fbe7ae54c3a3137750d45feb377f31ff832a0ffedd36d45a4ab367751c60bf86e6bd9daf72966427b848113b8df0379987b1f78eca3d416ed70f5ce9eb47bed4e523afd4fa90577afdb095323012fccc031a10539656309c11b5c509d9130914c7b78e9b62e31c5596cdb934b3b85d8a94c5d7b95d3a37789af12d83a8e80f031033dd470009c70841d24d340cbf28e0769466a8914ffc568edc4b7dd034eca3511309b5c8761391c8eede01bc09da0880085d18220a90f201bc940743444182173e1fbc4b708895284c39903c1bd219218b9f9c735373ce20a8385ad9916777612301f7d4931a322587710e98438a39e65f9279b3326fa49cf147a4927d41842df306aa44988305b06545063b2ab10273f85037f551cf464f7ca9be903bf145ee4048c5e1f4aabffa24178f45d279a378e9095d041132042787880e4f8fcf8fb401723304278788ce0e129f9f6803e426480f12b8037520911c1904df84825cc868c80acecefb193d842920a31b5f098d9698629e7a474920f866a96649470749179145928e44961d4aa9a5d28d14648b47251d69477a827444dae2e5905e783ec02d1e0b7c232aed483a0f07dc11890e7da1b9933c32a89c704f338e5e268ac23814fa47234944fe50f8060f8ac23814f2c1793e3870483c4561dc3364f60c993d4366cf102a240689a7288c85f008813c4278280ae350e81f8de88a742381c816e9e6e6e6267443511888a40344d20122e9c0a0ce4c6d297792c88ea7b9934178368c50fe4c3c31e24871889c3dd4670a993991522412da48373bd26cc1007758ca9da45355d7d436d2a4f18439e77b46706771f0fcf9f1c1398d53c4fba097f4688708cb87744bd7bc44dd8d7436d49d19b0c5994b364e6489395e4c2216278e2c0e8d22b8a3904c247bf25463c02973c23f2dc6f0623f2dc6d8c1965904b50f9b65e310a4e14404bbca1e72577789314012879f0d354ddc3da6bd811904cb845da9955993c216517f3a22f0c2a62eb3883ab7a7d7c9ca6cad615397797a7dd42455cfba7a601b3ed3dc1df3d311c118fbf1d042fa1012783b6fa7879587a3c707f05a90802af3136577cf2714750745f09eeeacbd52e9a86189ddd93d794868c0a338a2f9f90c111f0e1e707e6e34f880708a28b9d9d3e238f17e6e98983869c0c1ee60147bca881359ba949cc8d28d884496ae075b45647945acd89301bbb346f64c892cf01807ceeb444551d484b1140ad17f8e462149e39725e08ea22c051370e34614648b09fe3255a2b4829c3ab88336ddf3993611fa002f6fc19787472b1535fdf43ac61879aa2f70076fa04d9cb480bbe7c383266e1fe803fc0fa9064aec83fae07bf0c1f7a02449f230f790f1e7d9d8c00b44204e2c1147b40a0c3f9b4051894ea79fd59c3d4e84e2a801510441438e0f91dde103a1d241f5d153fe2a831030d10226625013821b1bbc20470c57d8e0e06546110616610821348327d4208061051880e1058b83ef7e45c020436502a6fb1501430c9f1c93fd8a9841087bee57e40c61084315fb4664818739d8508b3044b1e17b48c08687a18fe2e14d7040cda46cfde61458ee57240c2a7617da46c071bf22614cb1573e23b4b2b2e3a978fc831dcf85644b07747a7eb490061468810811073b8621c58e3fc4996798dce06e148a61e840da905211548905f8fd4d55fbc1338e322560686dc0f0d93d13f65a7bad33515955f5fb775c2d6bfd5e67a25ef7d55e4b7f6f7f5fe70d9000a92255a8fc4b2aa549527a792aa994306aa1be94ee3ee04d165af0f3f2638a81cfcbbcd43e20174ae022e7e50715061b1105e8756af003212f3f261d9e178985289e40f2f2636201901ea2955a4481294fb588029a8a28305dfaa47df898fa07b6f332ff4382c2e7455ed23e7c50fd63ea7999fac503fc90aa8807e8ecfcd43e9ef6f1b28042163ef2352fa1788029a550e1211658fe3d092504824d09e58c17bdbf0d9f6da69e0d79ad8a9622601ed287cb34fab47fb1bedcf18800dc3e36d5433c22e0c3d0a65f89a377896a30d49722658cf70778f9ee03deb671e41263159c40c4eaec7429371e6502e2685e078d379e8df9996829253411714427d4507b4189a7325fc4cd401c4d1f1f48f1c0cb910295088243f8c91b0f87dcf3a31e228ba454ca04009d520e91141b471294a474490a3d23e2487a1c4977891d25c54bf2d26110192bcc68e0e52002fa205d7a061e0eead2b1241dfeecf844f8ac304178897e0a2901f6648b09ea99b0aa25bd526762a2a6e9b53a13544559d4ab3d1395adafac6ac9faea2b457a7a76a5e2e899953acb38e98c324629e35443233502154638811b86e0063758d6ed2d7bab161187c41ebc16fce29018840d0bb0e1bb78c4b21a2e7968a831c663b96629574508425df885ee833c4d440c859ed61d656922e2c83ad5d106fec4d161ae401255de8657f044cb3ef9f36c34813b99c39343af439dd9839363e4e1c86616db35ed37779ba6e7906c0e79d7c4f9be641b9e0d388758dafaa1288c6548fea31f9d5a11013f49439ec9233371e2084a114790da483987c89c21524c1c4a79201d892d92865ec02371042d4bcb9f6703cad8d3c09933adc8e199604c336ced59ee81edec2f775aa6eddd11ad757963ac24e0b6af57fe9e3212105a3a2d89232889c4117cccd28a6f8a44acb20d6e802d93a79b22984db040c6c1664ff3084f053e5a3d7f66ce121c733a89237320754288754bf7907bca892cd62191c862e111b9244e7f4a680617ed3e12e125844b7ee06565891359a014d10b1d259105ca20038e7a87bda5938032514729340ddcf630486481021ac9c9d18a3882531c1271e2a887c9a6b9f476897108140f87dd367c2cc18e9610d66db46c9ce8f52c11ab9f17d3fafcdb32682cc15db5e7e1185bd2883384663dc451f66b0f0f8fc01d982376017d808f38356c9e9ee521e2e8fd6608c4d1e3614f0fed09ef38244af170dcc34f1ed92221056748771436d15dc8e21c26afa4b0eda99b3c286c7b50b6e7b23dcef6988d6d5f6b6c7ba9235beae1a63b0a675aa5e62bbf0667db577a298f60882dfd6dabe64592a448c4b6bafe6d6b04f53e6a5eea69ee6ab27dcd4cd47725a0a5c76c754759b9fb80cdb6ee2225090712744bf68fde485aa9c8603e528f88227c449647df211027e0cde3cec4c66dd8b99b203b1338c3db3913686722d3b2ec9c094067420371d7b673db14f6dcb773d7fe560cb09f7cf2492fc48fc16777295cde322555e0b57ca9026ff3757b982f6bef755d6b0f6fa5b5effe502dfbc3a43bdc85b60c85a4d4d46f9ccea0c5112db438a2c5112db4000214a090050563d3197b7eb050cc172f391f8c5707827d84110a53bcbd7b3c3bef5eef1e110c4bfa2affaa94550970079fcd72c4c97257c9ce39afcbebf2baac56bd844f90197699a51735c350150e85ec1876895d561007062809d49148e04ef60e72b175aebb03fbd4892cd9cec3f182c03e5fabee64ea69e0c69f975d905b78396e279750f8072e893654c4f2c46a8ebbe224a87dfd0a9468454c8d3d7bc8f745185e0e79fafb705c3650077b7d56b39a7f98c72e19189d93461ce905676b864140c2c516458e304346c4c1c1b9aeeceeb82e83b8ae6b06cc1890bb9ed820118c27228fd4912a546eec1f852e91481c7164d4c15a86a223351d88a4833cf08b4d0f2f29df03db52bf5f77070ecf68848138e22c16d99824f2f0749127f2481da923039f6e45f8f7d931ec7a17da1826c23ae66aab3b23f674ec3a8581ba2cd3978e6919d0ed675236f62977999e49d9a0184d3f144d23b7c9437a9e681ab9b9d3cf2b042784c9f4cae5ee47c572866176ba9e1de3a653ecfe503f4d99d51d9d303a4d739aa6c9be5ec9bb57eee0be8e7367c4c6af2fcee042f85ac67670346fd732762eff4ad9f49426c0451e031d8838cab479f95008e3d89265592633d04ccaae7f57cbd4db0ce76e26e5cacf25debbc4ecef66d63ebb745763c44ef9c6bee98c4d8f8f717f9125b4e510b7e941d82905e9ed5cc65363aa9dfab55d2d93dddaec1604ca31dc3bdcdb6fee8cd8f43acdf75bc638c77d73a7699be5ce7e03359bfe629d113bfbcd3197c64e7307e9f15d6496bb99149cbb1f98b67f33299bfe7535f52e32c327ba9a1c235ecacb1420d0925fb93b625fc7b4acded2d6b15b6fbd47b85cb7f2abecefdfb3b4a6b37395c572cdbef269e8a42e0f92cf5eab94b2ea2ef42704e8326e97da4f2e75677221b2eaf7d52f73bdf79b94070581fdbeca568bac8bac5fbf14f5de115b6469acbb238e9036775295d6e5abee7a7c2721636fa0665bcfdd77b5b5beba7cad8ee5ce828076ecf40201b7f64ad31003bf4ef04600eeea95b255c66eeeee314d430c7cb5575a463ba665b6dfcbdc594d43b7a6e71604fc7dbc319ba6911bf4faabbb13a93b930ad2d2da7bad4b37666ef9eaf657ba31d25696eeea69e4ad32cacf2e60f9ead40e6b5bbf993a96bb233666dfa3b610a635cb55e62bcbf538eb11b582bde6b86fc63dbebea7419bd67417baf7ea8e864a6d6919ea550ca5bb1a1789659b65eeabfb776f55fd5addd57447ecaa830e39e44083c68c1922910c192828a1d0c989890908c471dba669598631865dd7bdd6d66a59d5aed596589d76a5b6cc28dd49bb5efb96dfb3a1e94edaf25796d97b362eddcd5d8fe55dff1e0bf62a6beeaed35bccd232f755755fbd7bec367747ecabb16c59dda5a59bbbaadeaaf7661a6dc0f0eaa8b77791140db5b9fbb12b1abaabee7e745dcdae2014e272847c529332c68834dba7b59be6a12dcf38ea1e45edf99a8df1676c8c1125c6508c49e8603745d150140dcd8c9db133162514638c31d298b0dcd02df790499e71445133d6d2ecfbed4a1a6ac6ce581a6ac652d48c9db146648026461ec8bffbc3be4c61b2ed00eb786cee75cea91dd31dd61d8f3d7587fdba8bb4f6da9f39197c38adfd8bf6d665eeb15b989d5c7efbea6ab61225fb25c0c89eaf60a862cf676f80c74ba2d8f8274fecf94c8c25f67cb5ee0f15d5f1d83472cb649f577722ea0a51a7c9657cea0ef4174732f831d6a7c58e75d703ef24441bffe60e77d4be5a04c4db568bb8cb68b7e7b4bd66e7e7ef5d24cef856eeecdf1f6012013a8ff316c4764c8bb8cf631117b588d340bc2dba2e639dfb659dbba5397d7ced36773c3636ed2520e036e9b06f9a861818d33b4c8eb58cc9352d73723c7387699ab94df43d09021e9fde9813fd449a46eefa7bac3b3d419a46eeecf7335e21aaee60861d8337466e8c81aded987b0ad1d977347267ba030165b3fb43f5b943ee794c4fade9ee9e46ee29f79d73ce49c11b6355d772c7636bafd8b153b125740c02d767c69e652e77297bd35dcdde8e758777a432ee19a7b95f7ffdbb31b2a336f7507eb185bb689bdfe6af9e97ee686eb58c75632aed22b5dcd14c4a880a1fde624392aa692c7798470b4a4be8f7dc51f28b2a9ceea88dfdc5630fe51755b00e74e9268f37266eab65f0ad5b7f3706df02e2a4da72c7639b68bfd77ecfddfe24cb687ac611f77bdd2467c7f296e5b8b7dc81f48473677d03355bbbadef46e06d11f7ebdc6dde7e33768dcbd8efb1df6fdafeca3298c63ae4ae686696bb1fdbbac7f7f857cf38c28eb14b773fb6f55bffaaae2e2195bb21f6fb94bb23f6fbecf1928031a00d4172bb011b80ace1670b60bf224ac2d8f11415638cb9fbb1a7ec66ec443bb8239e660b04fa00638c6d02fa204f0f03afdc00ccdb13e66da92728a7986f9a12ce19d1dbd4eee69e3f2b9061041ca4804314fbbd3308d9efeda82f523cd567f5392d94940a159ad1c986e6e0b5c02451253ec61fec481fdc100c890438fe559208e4a142a8109b4af374934d9238c236324a39271b0d79e228eb200f9038bd9b4cb0ab4f9bc8b2446401f270bc202a2a4f9a8a238a2707d51ac1934f3e09678806e8522ac96803e60190bf48388ee2ef0658c40d50ecaaa25edd7a8cd986d586f207f8fa666657561e8eb8a9138181c8224f7d008fa2a89e0e01b848f7b6d8d4a79438a20eb37e1c512bd45724758ab2288bb2e285f9ae5ee1ab2a285515a5659e0f1582942def49dd419b1b0496c4dc53f778f23dbefd06c0454b8b74e9723acd4b00a15e32106a22c18d97394d9388d243ccbf4d047ea11435691ed04767d6ce20a784f20b778929d18a08638442ad94c4f7946078e9105373ce19319f2d1fa6f3f3e35355f3d527b2c4fae3859436d5278ea44f5db2e56914c12b41b6942bd51830c502dc551fb944f54282bf4c01a788ef70a4f086271b52a10d639431db0db50d61164dd18cd9da10e6f9688067433e1fe0d9908ff96ea8835706f06cc816026c31c222e340792b766505aeac502b2b06386226b66c4412b0537d8edcd841928448ad3f4aea12ca623e71d6799302ec225ba87479295357fc0fc7ceafe505aac84b2cdc98c296ef06b0e5df73c296ef549ecbb3211f10e922437124a7684e177907c8f3f0115b3421af881a866c29a3942ff3b29b91227bd832346f661830fb06fc4e51f31d1ecef72015a74cd46f9fe051f9a894543eaa8592b189075160489ec4f9de7b99daefb5502929276d93466515b6b07ad97bed55310b5719a54d9bc451d03491ef9dc4f7a09412e5bd88129271c9786da11f182a155964506418b21fdc15a3228b0c941dda2792c906a9ccbb01eac6505be2f6b66b95ed5aabb53263bb5ed7ae9795f9ee8a556c65aebb6675b353b5eb56392bf3b42bc8ca2ced7a524faccc73d7909559ee8a6267a088645c7b7e60c7c3d1f4b1638435344a2ed4f7f26695f2bd37df9bd204f3cdf96484efcd48e3881ea955ca7864d3c42d4572ca8ec8a6891b3e1b9ad22ad9183f19c1f0f15d4e31d4f9a81d60783a299d53c6285d4658136442c2eb8953ce291fa501140e0e121387239afe424f05fe1d85250f45e79ca45b3a4e800bf928f5a8f7e8ebe113c628d497f2b9236a99296df07c8cfac5d19334cd738a7b3e781a8804bc28c336dc6ce9f83f292bd2674892f42d496fc722f82b9145fa230bdcd253546c3c1cd525eac796ba1b94ee01f785af6bc7ebb02bcce139e4b0e319b06bec5cb6c8fadb325964e92016b0a9235163b32b2d8a59c002767ccd12b64847dcd345937e7b6eb85d229114c0fd9a208632ec501cbd07611745c2a0024218631131928460646cb9136db694e87b3670090b56d410eb3ce2ad436bd344967bcb5ad7b2a2bd4b9cde7bef5959c9cf9687b0aa3e1d52aa7ad411c61861ece6b4a635ad39e39caf7c7680bb077d78289104f6d0602003d1c632428cf0bdf734bcf548c117df8b2fbe0769841042f828b57ea664f9544aa03e2267e0f160208eaa30e0eef1c024903a815ed772376331dd68f64a2f973b586fefed8ad05ef3cb7ecd5fec4fb6745b965dd755b3b5dc71dc86bf280bc213534a08d0a9c69c09a5713dcd17c330cdb2d7dccdecfa6e0cd5a2ebf4dbafe8baf65abb992dbaf486dd7ebaafd4d29c840e7b0335dbd64aa30d98aacf72674d9e9d567d2f5d39bb726692d5aa654c9e6919ee98c52e13eeef32a25c3d4ff02f3ea5186358c570c5300a630a5b0c9b79c8e4f8d564fbcd9ac968dfb8bb103edc214c03694e77185f8d6118762fdeaebb6d17fef44cc3b6cc5ebfd95ecb59c5b02bdf77dcbe10bb95da5737c371201d5010973bb8398aab34d3dc69be9452a8e1c360c7dcd67e43165475f7bed59b1d06d3d9bd87a91794bb9a0d3acd16a4bb90bdae9fd89095113a4131b1d82fee945edaafdfec6637cbb4c3604dd7ec4c8b62b46787d174a66bf675fa7b9dcb5df677edda2ee9f457aeaf15db57f6ab9dbbb88b1361ee30204ed76cac4531dcf161388db54d7f6557d534c4c0d7a565b68b72f73a9111fafd8562626dc8da7a59ecbab4cbd24cbbb22c5bdfb26685a81859b0eb0e6efcdf7b0f39d061b28334b7b9d76c1779f3769ce1c6d7c9c9c9af8b60328d5fb32f2d8ac17e1de6e4fdbad996bb194eabd5b256ad377733fb1e6bf74e8cb54fcde4d3af2dabf627d643a0cc85ac139b63b40b6f1904ea4cf40c57bf819a2dd22ec2e75eb3352d025d59fbcd57360373c55c1a468bd1f47bdb9ae13611a61de6d274cdc634ccc5d775401133744a9010e83d86d5ed945a78755c1abf5e099d4ddfd1f4bc4cbb1aa699a6b926e76a1cbd462d4ab5d310dd7e727a6ba5d929d63becebf1af4cc758fd4a7f7575bbbdf8ba747a9c31acf3216407d5227c7a2bc217611d437f9fdddb5a3f6d186b99ed7686e6ee6e7a6a4ebf90c9899e20ed573ba5af1abd2e4c31adbf8e35fa6b9dd2ab5e8a29b52ca5942a79f6375bcf32b9fd827e3512ee26af5cbeaff5d9a871f93aa6e92eee20dbc4c26d02ba9bd616d6d6ab95e56e46f25cb55ad6aaf517e7eec299861818e3cefaf4ccd65aafeb196671ceee223b4b53b5dedb9bfdcaf6183fcb31f6bac76e7edbaaffb12f6d75f7a39b913cfbc26d592e112aa104111f42a8e4799942fa703f600d94380db26e734eddc9dcebd667b6ba9a7d35f67a8476ecfae3084f8cb74b77355aeef03cd9b2ed84da3eadee649c6428a14d62b5cebba3defab55a74e9986ae9f779eb5aeeeadf1fc0599875ab7dce5bb7c7eab15bb5a56fb538cdb2b40c77ac6297b31996c938b93d8612da6eb7133d5fb779efb42aa6375b5d6d55dd59ccd6eaf7f2a84eded96d6df6ed35e3348b5dcbddb7bdf62f5aee8fa30d74b96d07e51955b6bfc872a2b90dab5aa6ba55593433cb60b72cac629835b906d2ae9b5cd61e64b156b50c6671bf793b9763b6f76bb57a2d5fb7195f59ad37d763b9e31153affd65b1cbba96f55d559f32d668329342d342efb63d9fbd1c0ffa304d3eb94fd0a7454d6de50bcfd768ed9cdbb6d5b9dd1e66b314c3aa4f8cabf5f3301584ed27beae1cb795e1a6b48c06734c6ce6ecf9306f9267287be53228e36763d6f9ea75dee27e72abe27ef213ce823e2f8a017d1e06a4f1fbbc37c3282dcf3cc36ded2e3294bbb8a3465140f3fe30e7047dcef8bb42a044eea24fddc9b8df7e8ffde6895daff8f5efeed87e61b88d6118d63a6a8e699aa669d6abc358afb26cc651566f4d8d9f8d3ae7df8500773c8f9dce09a2f6e6aafa767877542d9aafb78e7dcba279edd2a2a975d458fb9a737ec264530413bac96bf6bbf76ab7d6eff69012bbfedd395f3f7d4c2d8ab19f87b17a6aafd9170858717789db7cddc17d6a19ee58cb9c7c723b7756cf70bb1e3b8939d133348ddc28af9fba7b7aca805708d0e7df1502457770834018db6937ecf816a43b10ecb9e9aeda4a59baa22e51eab3aa71325e6f234be8f5f8e13879053dfbeb6faea08c61331b7b8dd5565ba909877d33b9897e7114b2f6f530f604c3afd8b3d7ecb841196e5086dbc21cb5e6ecf990c9c82f8e6a7694ec35944fb2ad15c3b0cbda7aee56d7834247f9bb18d7fc36e8dee4387494a3dc874e4e5e0f73f27ab5d7c368d724777353d583a8b6f567e55a5f71ad87b92a4c76edd6e2aa453ab6edf530db5571ad16572abf2458dbdccd70bb5e97ad75c3b84fc73909b8b58a7aa5038e61bfcde0dc511b7fcb1db5b7579b453ab2db3f1b1626d32fc63ae8ef5ed7b61de7cb3ae8a0ed96d5221dd7ed4531d7ed612e8d67b8cddac3607a666fba9be1ec6b76cd7dcdf81ab6e5b871ee383dc3edea52cdc6aff5e58ec259a4e33afeb381f5757c984b635db3e5dfb5d7b7dcc12d0a425fd7815f2f8ac1af87c11a3f1bd7abaed95a1483bd1e06bb6e9de16a2afc9c29627218450bf9cd5bee8cd81b07d2f4f54ab30c7ddcb54ec77297b2b1d768fb4bb5ee6a723686e5ed76073e10717465f4baaeeb9aa66bd34193e6b0119bd23f9ab7dca5ecee7d2665c36759a237a1e730ecda746eba09757fa8d344b953149353d043a7ba3be14eaf67bf4eb74ff8d38e7bfb0ba318c52846b1ab9f7e9fae8c7dcbddf5f707806e1f01ecf4d2f42b8377c7a445383fc01309a669f2624f3388c29e24499224c932811ab210c448167040c5a8a212c513555e0fe58391f013555e126ca28a64b9400a5f245183185b8cb1c4132f533cc29eb05042135555555535954092a42bc2b0a5699aa66942810fc610853158a0862a9e98424e16f8ed4495e700387414963ccf72c2081cc060640d4024133749783f2bd0c7c6c64605f0fdec87850c8efcec945f2300031a3a2a060ae042073837325043183b30021435f8e8297f55c30c8a3003249216b219e0116480061c1c0745c842054cc8c1633c01a88a22e010e630a656f0a2862a0871c20ee0d0f38648042e88015f6ea1bae05d410842728ad0040daa708358851324c801a4020ac902054ed838d03651b6502f73ce39a10a6255821eb614021250010b5458158d5fdc4895b729b5aaa989699aa698c489699a9840862eb0a0820abe427f10a7143c306a9086244a78820a2986c42134d1041c5010f3f3042cc030053604b98942b80289a4021d4350029227aef0c5156010042ca008d2840fa80842922445515f4ab7524dd234a53c8e6c0a02508630d83c818a230cc10a384e00810977092eb050640c2a7cf4944f2e3e7aca2f8de02131c2d304164780f0d1538e3f8120052d9e20831b98810652885498218b13a0e1ff0a9cb024612eb6cc17e9972449a2a6c7b5200d516ca1041a6091c58b04842d499244351561a033a51b1b1b9b18bc4ca7b8c8627d9aa669fa0475f663421750ec4967bbc42a73388e68133b40c282306e50248c28c429c8c0041e9ee3380a7981a577589a58aa4c694e4f4cd3b4c49eb09841177bc2020e3a7b92e89cf34f7faee058926fea420b6b0082900925317c72a818c7e0020e950be8c21a7e5ea4f86c508799d23aa6431fd27f4036b420bbc8d7e13d51cf2b171121f978b2e6c5455279c9a6e00eb93b7a9ad9436e4af7783541bad723e5e318638c31f37ae8a56ee6f5dc1fa8b6b7047573980398ca40ad5317547c7a8a9876262a68931636adb1c3a1a63eb2a5867e5165da41478ada0733eda45415dc29f5bde9daa54f3b9392e987fa5014f5a14a66a63e294f39f5a14a262e5ecbbc99b0b0e9e4854da7316cfa97f2144d95c428e6cd1373881353486449f97bad962a8923ea431de7d2631471f4a3840d946ecaebce64b9d0a7b1aaf4bb6ceb7728bb9b76262529efa69f69c9a64296d8d4c8747fd03edd1fa6a7e414fd0af3acb40ef84f178807754a1ce917293ded4c5dd4005bd7d6544464e9a29068c444a4e9b7a91805c614471c1c1c8baa2c3ded88727811304775fa0a58e0b1e81db61a1bb56dd7155563076d551235ed58afa60ea75e6bacc2469c69a767f2997e262fe004c6a464e29992d82186b8346648b18a2ae2441ce97556184ed9210583734e1d262f269ec832934c547fe69987c094bc6696fac4910dae0f1d05006fa971faa8135976220b8a1591e5864ec4080070c48938b18a98436386d6dd8ca5de03db94ceefa61d1d4e51941ee2d51337d5129125e5f41510d9b2c341d444326f2add51738959311a339e0e1de24aa80f8dd3ceb433753121d994c68cea2959ee90e592a8627224eae468248e6814a2a310ea7333bda33ea2e70c441cd13fd3c0ad8386c0b423fab433ed3c1c4a7ea625459c9c9c9c501acf21c72a228d2c9aa1bfeb8e6c2902091224221d7142efa61d94771167c2c2d44564813b91e54e3bf69685331741d3ce344d99c640606a55230a6f58e1c01ca88a082211d8835dc653299d883739d35de20473e2c88a9823cc1145ad237eea629e391a45a12465232903b2c5e4a05f930cca9434bd2974f24c8b37b02756f12e8600b621349d6849ba74e956866552ed0172443c228ea8b5a83ab3a80214e6162e23d7352190c802248ee8e98fa82a49ca7044e168430b0a0ccf5dfa133d63782df0e68928240e914e21fe067b1e0e2d65d308c5a6516caa67ac62534dc4cd1ab6f4a8d8f482374c6ce957dfc081a2b4744c7731041702356f47e99914238cb18838a2938e4906ea23a236e2ba30db0306263d8b4e4416098b5a04a326228ee893f2c47f45de7044e67461052462846620e44464e19080f197eea8d14a11b28522a20242b650fa4515498a44f6dbe1c7acb13f608d9c34c07815b35e6d4a4759cfe5e188db3a0668228bbcf5fd5a30b41e187b3ebcc5b9b01eef12df60c57e60ec57c40d3bbbc6a7044e7082503e295d9625fd15718315bb5bb10c1059acdf70f9ad6a67168a6559704667a34b6499521c1059a2b67ecbfa4bb1b40cb491c4b05ea925ace0a874198583430e617b127838d4d24e54e11ee1ac2419873afbc91d932e0716fd2e4a22d226c283a670789052533834743a8a087c4f12912dd28e2489549208a56aa89dc8226ae1419f075d4dad8f8cb0916d45aeb18b0d0377759758493b5217334b3bd5ab39458779ee485d44967c08ed0ed3060a37595c21fab4912d5348c8daba235b54aec3437fdc55327c2af0a35c5dbf5676da84de611b7c43b6846e3c2eb608bd22a1d973a3278e6e5822e470c59c73f64c30de0b71ba43c0a673d05da8d23a84b47d48bcb8b6a75bb9eeac55cd0267b1c5f4c2c4029e3d130c23189b9367f2c4113ded60b5666559eb2344880fade026b76dcbfa0db80bf984e2e8068490082cfa34048597c5a6576c7a51a62084a2d3cf882cf9740d1bfe065d41c8041b3e135d44a15002753793b24549cc0ddf03db507fee18a0bad649c0adffae0ead5f1c8974b7a2279238a25d60988c2fb045025c330ba768fefe30f53cf26094933ee9cab9833bcfb7fdbdedb3eaf0aef43c1247147339fc15818315f3c8cecf92c8d2cd6e26d93449749139bf9d43e6e268876fd366d3eba03b4adae1f491c8428447b6483b3b3c7a87cbc727331c474a36e5818787878787670708af89634efdae127d3e25b2e4cff7802355e88cc3fb038d87600e7d7a190f073cbde8b1e4536a83f006bd077ad6551e651ef2cc59942d12fc36d452a5e31b5216de1fa628d7989762a7fc71c0d939bc7abd281c690707675eda99b38767be9390cc6f58c90a82e18de01790078e21f54031241e78060909fc4215a92454105e0be4a15eec9e1eea0854116a8b4d5f419eea565ff6600926d19007f2ec9a694284682d446bad355543080e748d1ad73beca0c139e7d44940ca0a2291651aa1b29402278ef2679eb06a5bdea377283ca8a8e8e923557468a47978d04faaec401fde1bd5989e4a8d1aa7355ea3468d77df2952a2c21b4957787307e69076a43300f96253a90b9b4e614e61d3b8447c027ae1b548359ef22e3ab169102463e041c3a6126c43ca6bbc937600709708808da330094cdc5977337643fd7714ce8e1c5ec1ab035ea6d2322f8e74145a0618709524b2ec70faaa47b6f0f093579f36f99a077a00645923cb9c38a24fc9d28a797548970106dc491ed97349cb484ae2887eda48153a370ae7e1989b9eaa821e4639e1a397fe0e590e09bdbbb197c01fa824c324d306663d29f7197f963a641ab873d032898cdcc12de3d2a5704480e167d4790a87ea8242125966782155e8512894099364285d88235b42149e7a063d8563a923e044960baf20aee3505550390fc70be23afcb42e12e5b765e4b75132127077144e677717a23fa8348cb7b5454d15d58c000000b314000028140a07c482e16840ca2259f60d14800f8ba04a6e4c99c8c22487619432c618630001000000080080d0d0300020920a5694c3a3df35811a3266c07df9a64927ad46db93ba48650db7d00b97d9251a065bc4d39f0b9bc78751861155ee7172885b89267b1aed20da221d12422fcbc1f7ebd2dfa891fe21342c1a06150d62fefc68d6442c0d35346cc626ada7c341854b0b4dec8323bc66e620764598da3092af118ac061ac31970929d1bd82dd0f86096064f6d521332b114b69afed33b330d2bacf489e9cfd4289bf2ead9bc58d29230bb9fef87fc094c7eaba5d585e46e97d14bb594f4e55d4821bbc270e0efbbdadeb9848343024aea0bbb051b290ae3a375a71edbe65f481810f5f8ba3ed019760b3635dced0110b439b0466e99f9bd638dae9b61c8cddd5629303feb992f63c32ee93461353b9a1f14f890f35e713bab36088302a27adc00c62169c82519a9fae4e169ef07f4e4c33ca4bc57b05a33092e60b524662783db3cbb12408589af2e8b5befdeae0a827f07f3fb4d351b1399f845b1965e31abc854ee4b6c1f9160d441cdb18e55563b90423d4b0f61e0e3fa0c55ec646340bea621571fb5e7791e17e6d970c2daeaac587b5f2378020e52ac14c26b800f7fc450682aada486d5bbbf30c4d48ab8c5a64bdbc947606a76a69307b8ee283dc81b49c42e2e60bf19b1125dcbc3c8816825452d1acb6705436d4c39361939690ea07e0054c939f9df0de4adbe7d7fbdc7ee05a2a858aa1a0a18a6100d0c8fbfd892c85cdbee36b7ba85455b181f96a2d1ff548040181268462a4fb560aec65e0c490217d1b35f8180dbac248d3f0d76bf403b8493ea5d5b8cb884c708a48d88a66f94eba0c84a989f69c05c175d5cad1afc1161f3ae06b838d4289b0a3dcdaf3c4294102834de374b035c93e324879c43e26e9455283d3f3933e54dcb0ca53abe43c5f19862b18bd0d1905b3ea8732c7afbb46fa5a42fcd1d58d8e672c11c9bbe99e9e57b397cc20a41935d33feb61346f86170513ea996cbbfe3a20ef1176c5a8555d98335c2b55e10cc797cfd5cedf0631be9dbca84c06b6745a3ba75bd0625851e428e3a25f0165ad43b44d50a3f138d9025d3a65de0b26ac10a49321a73da809d7a0cd91efe27468042d74a3561837e68ba878f5a8f5184e056484268d2404eacf80c181304f874c7ad9b84fc078d10cc951bf70abede43d7d94a5b3cb2bb1ca02d56e7a32aa4cb06ab5d50abe77dd890d5fc3b11b97e477a97eab0208c6f9e10d5c2d004d2e253394b83f4c27dc2f974c12929b8952ce3ee6aa95f68f5024666ae53e1f7189a5692945ec0986d04bca0709f0c734d1b2fedcaaa3c4a728abd956fff45d7e6961efddbe42051c0e9718c8fe0ce34fdb4165cae2954ad10276ce7fff9528d78b2a70838544b39e3bb665212ffb10cd222ee5cd81515eb98ab386fce9109fa41e36db731ce8e7ab14f5b045adb3ca673c214ad0990f154a1cc9c14fb69f9613ba828284dc5c070b185c610522c9e18ff67669518fbfdcac1bc789f3da9643707b8766c9786dd6b57fe161e5dea173293280aef45733101a54f79d1aa34aa97fa81aed9eda5cfbabebfd374a652d07a3407069d28ae3f8ffaaace3b3a8c1f88a03ef66dbb63604a56e0825e64b4a53e10340d149b84bfbdd6a63efec352e08d71c54740249e42c6b23c85fd934a18c500a659f3bc121e8e68400857c905dd7ce0eab0461306fa70ccf6085873296371291883ef97eb01a2cd49057720298b19e6a1dc60c6b8baadb108722d9e0582cda27c5b021ebfe8607b7865cc10b1f63a01990235243a55ff87c00968f92130a29caaf260cd6375f83a9e37f62b4a1e55d6aaf9efa0db30a0d1f1b45e3f6063e7a6a2b68b7016086a12d947c04a344a079242068089caf36a4bbe93b1effe9e9da94b5182e5938478c2b31529967e6f615003b9462cf9328edc8c6f472d2620ae52dc4eeae38902a196f2637d0d8cca94e265575bbf7e106dc9e7f4351ac20ba27d55b9afd0f0b37f1e690a1298cbab094793bb8e01a9b637c294fcc264add20f7832dcd518b0ab64a96dab9df31efa5c2f079530bd04667ae3002995c33fc55a5e2c62164367b7756652edf00789885998719ce3f3f9c8443a486a4dd9668531d9ec1e54d35044819cc66f61cf6759e0b23e41f038c115f864ab3142bf7c00c2ccfac8978b38793436908d9ab881415d0fdeef6bc409197dbde424729fda602015c69600a97f73d38e83aaf4a3772dd06513f129e441a515e0160e127bd6e5a42aefc783d2a4e7aa222fd492f93edcfb62d569957352ac25ca0cef54b8423e2393dfc809e0f4e64075bb19c697afbef065c88e7a31e133ffb533510126d18ccb353f98841e16efb25aa87bd74ff7f0280b7f5898336bdced43a3351bd25710310a4291c40972e6d50f445e419f77e687c0e9f10203b259804a77c0c1aa3a018e48de56311dd2c373100adc6516428f55fd012748b605f5c44cef2c0126845ff4163b9839c3a5b3be58a78d47b6c9270fab941cf8050fa99d5d8b23339f6fabdf576202f96b8671f4ca4368f71942d476e98fbfd04068f43d9ad235ebf97fb2120691e15a426875a8cc0af1424e5bd4232115a24c7078e9eac15559e2f35219a714c2ae44d72a4f5d7622ab41e9bd88c1fb1cd1d3f6e99cafe47abbfed2ab917230ec642828f329509b96bdd37a07e240285c35957143e71fc7bd68b5294f346c5f93306f224163c0ed05ab53a55bafcf7fbc700977762b7a3e3310b433c48afdfca237b741beb1f0c2a30b8e556a373c3e63101cbd1601cdeabf3306f341a0f9a162fa7808daf4c435836ddcbd8edf17e2277c167e315e819c11b7f9dff5ff7f625caa1ec3b98a8f55feb9979522b600b67ccbd1c9f3791d9c7eb49b3421c992473f48e01e1c7efdf813c8a96b04f0de2dbc7629cc66c9f5120df7a8bb0534370c173417dec3e02f2abbe3012dbbc6a3ed3aeccf154acef74fdb276f9e890f9ffa5911fa3c310de3c653f87670e90f6d36cb4ed4085e20b6d66819f7569e3eb621cdf0ad170a22ac946db667f2f48fc46727409150fbbc4c39f169bc5f1bf8c353be22c337f254bcaf8a5bfcc58982de5112f665d392edbc63e74839fad6404990053294d1ab1112c820c3d0d574272bf7a70109f13dd0b346ab80f5fc20dce968c31097104e12d37021156627ef862b959ef0c153643bfc2227cce898f970fb86184cf2d3f10ac99f8feb14db3cf7f0169e7ba65bd6f109f5b6908dcbef609ea01785345c912058a436d5afa6d6a6f3524de829b96a7f655b2ea494e3e5ade2dae4da0ec3ddacc2dcefe6b7e78bc2deec026afb4072651e3227b3058537359f93d4abda60f5901c8dc04d0bfdd42a845eb495c0203b8789eb762ad8c8ff30378d99742c6c70efaebcbe30260b73246dc7e0b4dfbba830023020af617a1524177f79109fc9c3fb342230dce8431eb402650ad9593f31d969c6402bf9e2ace952601a75b6e10b7b25f4d5b99ca6f32e42efda58971f793d6d808f291d01e670c458df55b595cd81774a820449d94ef1984ba427385076b6563d491b100604b4a7bd67ef725147e0753646646b58d588b9389ddc0a55f2a131bf3ec82f5201d3d2b016c3d1381765504d9e0000aab408036a3a50a504ba906f07e33da343f0819405f742f111f2b75f7085784e60011aeedad6762f5b6e8364264d7dc485a48332fda5774bac54155fe47f647b40a91a914d2e83b81cdce7aa404cad8c954dd4897424ee9d4953ab01c53086b67d4d1a836033024b062a01b4f451d89bfeee1fd8ab9bc82d2cac6fc93adfb29cc3a812448625707b1c12981ee272c4c598ee611636075b97509178a686e845d39c65a2bec1ea0a2a34aa3d56ae30e19e82613c2f90a20ff6c4d3b24f61bb153f82c97a4eaa94e2d846e0556aafcd7cbb364393bf82067d8a69f9ca20c4e9892f1d744a5cf882a8101ec6aff062c5d688e43dc38a0b67f56342380ff98441c5855a6f547985cf87b0e5519b96ec9ff36df807a222a852f2a8f0771f3cf55d7042862176cf9da2cfb860b3e461784855fb7cba045ecb35af2cbc764e6edb55a31d7fd56bb0c3d8eae05cbb2de18f1d3ff5716491aabb23ae7f6dc87c0491662003c3a60ec22e24902a2bd93c701a70a89595a9baccee05a0c9020a84a1f8b8a45bb9a8cb05a24bfc0f0c948fa9b01aa6e3f2de4fd2cc122ded37b2cc191dfd5fcfd74031451f27a2e03f4769d021e407880426729bfcc66ae39eb22b03d9d7d73590dc6dd508132957db78412c5c6ba0dc259ddc5f6e7b210927fb3e069240c6af3eed610de34944ba0d400af8842dba19414b755c52a7a57aad8b7e05148421b16f80f792f9cc7c8216aee864c1cc43ce5fa1e6acfddb8f418b579d86af4dc06131e90c74874b786d87ea29bb462beecd95dddf61226f8d66752bd7f73bbfb215b494676351afcccfbbda75dbd8262fdb09d16ccb89201cbe0126f0bb44c6e96287b00848cfac648fd5c21a2f2532a2f65373fd1ab44a62db6120f66e87f75e5c2406c364092536b652509a8140434b1d016fca18317ee34dbeb09798b510876e4a5ee8e87777d6e55735c5c1585a064408a71ace37bcdb5d13a03ca5c9a897818825ecec936bf85adca365c6b0c0577f60efb218dfb3b2eca5b6cab639cf815b63534443a31fb0a4cb21379d1a22d66f3876db500dcff96c9011408405fac559e477199e1bba9ed368ee13f4a421912a1025a91a83d78c78e1e01856f54513ee1fe56332b8741b6572929368a1d7631a9cc63357efb70edea66e3b7a8a362b73495e723e4c7196eb2039455c8d4c9a934dd13fd374d00a3ad298b5d9a3a1ebefeb7cf48b43714c8e430419c082ba32fe947cee5a17a86703496aa4cbe2e855bf17e3a652c7a7df7c09997becedc3d8a423c2bb889cd63e2fe0cd031053f673652d7d69c0343685f744bf4d07bd6dacdd11faa2b9196aa4f2fc4d2a1541bdcae5d81564b79fbc499aa2256517bf6b40062479f1647448872e00b4b6ac2e0592190df582baa70930d1bee0d6fc3c1027e6a0e25d8e695f9b4ef57dd3c3272a6b6483212a6d8fad039b6208b8b2e3eb2d7c5cacd54aab74221def02f481c49a03925ef402404317338052b24a032e998cf3771db1484c32b961d04776c8c6a07b9cd5f868fd15f204f64778fd2e7f4f98376cb2c2dad16e9b8b7a95119de18ee3bda617787da3ed27c0bd0d78e3a829c00c39fc4f2797f3fa24541bf659995bd9c39501e51aa9c3058e6dfdc3df33e5ffdda0c752ad09274a9a52f0cd8a9005fffbf4022e8b53d2846851c8712bee422101546c267bd3cc763a8ea66c8c14ef3bb93a8650b640b7220736ae9061f87c907b4c4498107102f68889c3844f55dce74f2b758ea60b0129a696ec522f6b2a079328507d5f7bbed03c9a0a5aa9f6875f5b7caf7fdadb0a1698e3fd866eb506388bae8ea2af4963bfe42aa0c35bcf0d1d5e958f0b9b5d95076ef2f4e730a622c06adb93027ea67a67d68a50f42b71451a5b285acc3a577505e9f2f98c97e44e4d5840574ae0d7069a68d92d4f9b16733995e30a8fd4580871b9af5ae166d3a53962ad5304c288e151194ae352682ee7293ad1a88cbe3ee5799cdb44e571a53a4bf4a47bce41656e15719258797f36d02efa6e3551936158291e625ffa0813f14f06aa11d5636e4ac150d0e92d22ad978aec4aad20185570e6a006faf20da9d807baf2f8a7dbbe465d4f03d6059f115fd0790c756cf04b421a2da7d9bad04a2e07dbed8800fb754a6a18ef38aeec82f4f4b8bfb61a7ce2b78abc8f8194800af27d72ea4012803fc6d9129e3113b8bc19b85dbb26835f34d0ab80702b60dee16df9dc40fce30e65733f417e1154489a7582a6428eb787ec85e81e82d42e970649991e3464750c675c3f09e37abd8cd743c42fdd0720187cc051523ca294bf993dc54a9af491717901607c6be1480ce904123766aa2d865aca3737d2ef23eb7ed81a8cd21e0decd3a4a071274ba84a1c248cdedc74cc909569cbf6df039008320fe907102ea671b889af2c5c85aa0a1010f9d96cf960c132234b7843065a0600a55185ea0b9e6debca01b996a361ec5e907f7fee2e080de0fcf2d8c94611a6434a2533932c6b9135e29b088ae541faeec55a3af0ddb3ebc7f87e77656b7048d11e15bdb97fcee02c1e6289fb8eaef470320ff3cff4c40611114309aa0d3b60dd6124a490765bef5ee8235cabca83fdab3d7b72e76061e6dd6cea0ebe037fe53e6e89d14c803ce4d131ce4356ff5fcd2cecb8d208f4f0e6b3512e09fa016382ca1da9f2221bf8f759d8f88600124c6209f0862eb3cfe93c0a911152c9bf41efa87246ba209c7a2e416ac41ac6edd493155c7f49da7595aeeefde903c63507824ac2c1a47452b70a24cac17d8fef0116c7b95b5470730301417364103327b8234aac8cd1443c71c03a9d16ef50aecee4998db2ae5181c05b11c71e360a1affaa0ed0f6c8b43c192bf047d7aecb81248bf5ff87508a06f8f5c542feda21a672881595860c68664ad24752b680812243f0b3c5130c8e655d294dc8e3ba8dd426fa61d6297fb506f7f17c30e5796d80b3ad2a9d1630b9e8954402abb23f5cd96ab12767f935301f5144c76d0afa90ff879c13347cf2acaba2a058dcb585ec22e0299dcd0184b1a3cf7e4221562a2494921bc726978f60c435d728c5e5371b23b447976f57b3bbc1aee474981fbe712c3917a82b724afd27a13ff47190a23514a9dd48cf86415093ba0f08551ced409505a11a3dc416a12e2232151eb67e5f01a70e94897f483d4a6a098e007c73830850fa428ccd87943134400340c9e480cab0029a0f981b8c86d75a41df4b95c536ed68596830a96ac9aaf85e785169e868bfdc5167155e5bb5a147c8071bfa17dc99b6ab02b0a1e3684d5b8ca11e14b44cb117b1a713ff8cd2373a1e6d53e64870081b612acc03eb32056ab28b5a26da4ed8985cb3af51c0b6f7951d482adff584b6296947c74838a1065c4696bf0efdad4f31b75fa0c51ed73ceefd5391dd9a9bdca06be520f12ae3015f5d427a43e84a8de6303100b381aa7cb72beea74523eef111d3f33c0c1a88b631c995e540f9ba6a1189ed0693b8359e7b65a42bb52c02023c97caf64ee96afb83992064987737aae553544e84376c5130df32a2803b70a92287dba1a5e4bfbdcf59685367c913aabdb7fee148080d83ff5880079d013c8cec2e3f3a831de10883e160b2261627370789dc8b657aa43f1e10dcc4d4374c0081c8a4225e3e849265ab4c824ff8ab41080e2b8bf2e32940aaf411daf4d5b30343dc048e92e93cc48dc123cdb455220be644a1aa6f541d9829aad75a1d6e6cc41171a2fa209a3be2814069d05cbedde23ba19ef669761b6bc061af86d26f75a3b273dddf7365a908cda5b0ba97bdc2c612d47d8631c54875593ae5cca13b08f80619280fd410c818d09bd9b0bb8b24052c65c1f6429073852bde5d4d7cfc971906f2ef03b4160742a9a40ce71a1387812d44ccb4b58121a9d6541400e85c07c02c03742e3c7738572c1abcd5108a3c9dc7382339ef5ea6962941ca1e708cca6bb1a08162639ac5180ca4878fc4c7af7461bb05ea87ca17a36f06927fab9980672f2a73056566040616fa082ebcf8522e76cb9261c4cf5df89a4fa59bbc3b1082347ffd55c80fea1e1223f8d861251cad9450efc63d3254bd8234769cf7aa650a558f2ef8b6ab726aa5a66cb5d33756c1192048f305be0d19789a8806cc7ae39ca4a15a1036ad3a13412a5923cd73df0963cb89e9cedfc849041a838fc1199738db0e9323224a05de1d45fe4c230d30a0a7ec764e99551cffb24c62609ca8e778e926b518e53a78282fc5104bdde88f84ab28705705eb2600c9185a1fc2d8431cab96859e686c62476297c3f8b09ae58a0dcdb5362b018903ad26200ae76a685c49c2e281a7c085c6cedb2fab92f20b36e69388ee3adcffe32258db6bf1155a60024b7d9fb473937100fe3e1cebcb85ce86580e24cc259703fc9bac7b13e471af70344f8c35ccc02f410dfacf8c0c7e05154a35182998f693b48f2302564d67be83e045e0e3575e2970b3b03ab16e5d80c9900e2d18207f4e5a3b0066222e0c18c8c60e6f05d6d089e11cc800d0fbecf378d096267c348f7c4604e877700dd211614a70c351207be7e75e86b8c9e1ca604d7e1388d8190cdcf1f965b0dd9efea6516aa1c91bae347e8861126ece4cc5fbba1ccb3452fea09917ef829b809dc2536e04b05e74c3ba901ca2f83a420fa2e194a62068a008587d182e0d9649ce0462c3509365f4a6e98e32b4caa7dc13bc6836e2b707b4eb869ff698bec12e35211820f971f80bf42b9878384824df4c5b324fbf4edb48f52f26bc04a41b74c0a3d2c716edd08a821d40613560aa5fc2cdce3ccc4fae560c416ea9d95d080e83f326def8c9d5821a729f06c981320dc1dc6fc4c07a0c90572f3ac2c6cc1fbc2a9487eb91b8414b6fc473a816aa3c30c8753c87a23227521e4cdbe9df98e2366d67d72684712bf928cec970e89f99719e66d52426813df655a9625d935ca644abf974e690958ce834b2d0ff9c209d4545c91fcf31496bfb1bb89d0d3ef5ec81e5a148a9d94d92ca2d83eda6532fb33786b6bc838657884ab7a7d3bbc2b7fef6214707392bd5950ea2000d392bad4d170f7fdf12f0e00feb95a854d1e0bd822f1b08c62eaccaf59c785508b75db03858db4c34c2a39e83db654cd478c3e5cabb0e7c73d4a9a8208a04ac0d0d6dc7e6f871810f1a445f16e02e763d22b7a1d7e4142f7c362ee60e183820efe01fd0a6243a7d310ee819dc1d244b3cb79712e866692503466623e0c9820d1ba31d759be0010d4bc8e732b905af195a8706ece40dabfc5e85f2347596a03cc0d1be1a092373a2e5801e90c93371abdec861e3df4f3ae35c5e56ec3b46aa6882c9360076742129155bb19b584711951efda47b0281d58945e7c6b3f74b9b5483b2e0ec339375996190c6cfdb9d56dcaba0f5409649521278fcec896f154d45bebf5df3d8769c79452f200316a5f8c0b0cfc0046eec4c15f5bb90945e6a0e733ea49c6a7d94224e703a1a73e4f68526b158cafdc3ea21457a70b3c449cad3df8a07b2ff998179522ce6a6e0e83c1622a40c541f60f403e88e4d658f40581797a6116999a37d6c57b5783443b7f4c9f1b4ba1c4d85424e30cc7f4d88b6361efbcb9413f83d6ecee174549f0d1ddf95e7e48dcfe8449dcb9f8c3b07d50230355ff9dfe4c5d66e9a03bb669df19c7ce3cf9b3b87cbd33c655ba67b2e2f2929421a8afc8387d8f1bb4da114e4bb21b94699b6363c800e49a3d084608a84a227c21c891fd21c067420ab908605ead1c7e5514111d31c6802b336ff7353dabd52e0de5163ddd60ec0dd511befb7f494d3894456741e43ba55db5eefde71493dc177a00aec08cad8d20385cb3a1d49c19715614bd6ba1f9abb5d880ad04996bf20226d2c25b944f16642ad756a01d54bef4ce8259e532dedd0fab772911bcd0fa6191344beaa8e2c5a811b87025d96a18c9332d32c290c12fb832b6298ffd0b1b8b9968774dc3539ae9ca66cd36396e558d71a86f56e369a65fc6dc624fc6629a56d5dc1f286345b98cd033a7ea5b326c1b5d1a95c69bb51bdd1c7b4efffcca3ec7bc741ac9f91f65d3ec8fe001904ac0060e1158d08495bec70cdb6c11dd126673404ed2e752a4998034100452c4a662a46f5424305c1e7a5069f8d061fe6b962941dc3ee0901c6ae60233dc2b4434236f9426a5b5e21164effc0484379ae9324afa2eeec38f4201a53fbf50922b16c686de1ab2b2e2f25895b5992e605d8a299803b25b7d1555bfe98223fbe47532a212c3d9b7269e98261eec614114472cfdda39bf23eb67200f03572fce11534e2ca68ba9d2e1da1a59470c03daee802d630988d10e36d280031a3cd69f3ae1ff12b9675da2d3d2b1359dad3c9d9f30355aa870d43b2f3ecaf70c32fb1dd480cc7f2c974b3131d9fb71069ec75a47424e90e92c662b5503c8ca4e109ca7afb77115a81ee683c89249122385186e8345f2bb6825c0f515ca77d5c8ff2489294ce1f5bc8091039303a14c5bc4f067203a180464acf2be2919fb4003f36845d2c855ab605843ac77492ed6cd240cca26828f50b8ae7b9e9c2387498bd01499d12172acf5567271dd639937d408ceb3f6e9fd858a519479f73788e71c8001e0482b32afc397691001db4046bbdf7b3241b3dbfb4a9d3dfdb63079f2993caa9e188f593399e76d3f1b382b5a3b9b79265e2b8606725634e7ca18d89c4baead8c7aa769bd76681b06fa5bd823a6bd6843d8dd3af49e3c7ed537141e5b7006d10e066d26e562095b3116e6a0d36f4b147888ce13cfd66f433ed45a1ff83851462795700fd707adbb9b99b802579ec7d55f02279781411ddd188c91d36a81146f4574da6346dca06a15aa4334358c19096a01a8b6a994948b03289a405787c3e79f230e6abe716e79de25f6e834c3bf427e4d8d1763399364fd80092d8c7ff2d1879461c58ae08086795e24030b01c34d4c8ce2f18b4f28b6bdb8e2ebc30018309105bf2160f4e318f9f40928b7f9d4320f4ec471988eb53bf17ef6b254b523d94fcc12124ed3602b7720e99901d5c9941a86b57a8169b017d50c1fc3be03e5748aa32cb1639f35b8ce6e2442885b67973198172bc3aef85d11531a85ae2ca6deb7975e6d8de1fdc2651ac3a45c3d2a2e4246213dd61abd343f015d05fe8fecc4f7a592e69a041abf698bd98462268a79a008ade3918495cc8fd6cbcca49bd7ea10afc81d9b1e016e4321f4601ee422106e2405c3d6ea6dc18eb944df77707c830250d9c0e871630184763070907ebd624ba0518720764f6f999828b5c0c83b513e31d16a4103258a82c74ee0e15e3d8182bd1e2ecb593d3097d9d52d0c5ce2e6bfaaa061c17455784470922fd9c1df3aa8e37e98e671603064dcfb269a164d5e78bf6be97cb73339145ae6fa17892e5aa96b85c8758dd42a23cd199b11975277b5730a5cfa4f7e9b103f3bac22735578207a88024f60910576fed52f5ec394b5919c917fe7fa245538e926d2d6d4342195c0dc867a08ad0497d91fd4a0017fc30e7b992e282e25620fc861730edae9104610df6eeffb3d120895a1f755d0e350b09f74d79e9c8ae2e78b0cfc3961a9ef25c62b214136a656f3c9b058eecefda873b522399d750071514a5c4da1e4933f91b2ee14e473d0886db2e37328d094329dbf8fd606d3d6938a827cff5cd232e1d6d148048267ba7090e49c37832c631067829d10cb9c9e3087a9e281e82c533fb0c39c9f8865eb427b6301054cb511e688450cdf622b6d9a90d9257f8202235f68556f30ca98e5b71fab4870b68b9069ca3c3a446a9e67b240122cacccca92403931952b691c4592ecd23314a404627e424e52cb7ced7eaa636d3fa7f63aafc7bf65bf062d463fa22427a1011389371123e4abdaf4f09d698eb90e6b262ccd75d2f0ec680d502e7099b6a3f12aaa4389cf75aac3c961a1e7432374b4d84a6fc4085048ee2c55023856c3bd3793e9abd812d7e47595d66620aea3dd0c6e2195b0756e411ed1d1e2e8f456b44b7be31b847ea6f24d50d551238ac722ff574cd08019133c8e7c4aab3904e23004fec37bbfaafba289e23ef67663a0d1de1028739138217910c21f99f804f607cf8a4fedf3f09a01866ce7370b9def3d5ea618762f7084a12406429162590c56e7d1aec90484e518c2bbb53c61e64a472ddae02ed622c99468e80f9e666a310cc6cd9b28386537f317f933b8701c2ebdf7601624b4f6df79c4e06b1414615faca754659cf97223e0327d6191d48f486a5ad2cc24f5c6e0f89cdd1fc00b288be987443c932c745e5c245af448d6a36899d0cd60cf03f3107f7bceed4f160e3b8db1d0b4e15c1940f1058146c4611928e56ac3f01eec005feaa953393ae348918ea3cbe46d8c6a24f291d1c7aa90c5df32a3dbe9c4787458eb0620a411fcd9235524ba7d4f6682fad06e48a540c2e7bdff635976cca3cf90de85f6d877d5eabf94a63657b6a615e2f455835eb78b5766b22baa85e305243b50f654b70bae68a068dfbb2421fc96cc306cf72eaa2362122d3e125db542d977089c21c66ea35be3848e875fc36b10e3164f523854f38fe89dbf8232b291712e66fa44d9e27916db1611f822d1b3d5207a4fe2588ac1b2f187ee1da14f8c2f7ee106e40edb62600f70fe90a6083c1450947162e0a44f6296b9e84c0a03238be42b09e33db996cd02d6de896d16c9959c27c71192f748c90a8ff9f08961ee2b119e9e663c54434d0aeb170972e4edfced661fd3a27096b968b246b694c8c4e847df94043010df28037293012a1890dfea734d14179185899697d07c164f3df509827ec6714e4996c25b1da418294704e4b11353b2e2a328a614157c3642b4939b837ee0b6f64a5cfa1498a542222a3c3c9c4a5d9946c114660fe31959d5a21d1f812baeefa9ef20f015817345eac7d9b82077436424d7952d2b90bc031b2f6be67ad26940616ce68ea70b4bcd48aed597420d76514aae96286a2e0ffe9f0bca8bdf2d99f8a431f8706930c219f5b34c1a326be9609a38a4e736ee41923e1f3202eee17fc472e8729e234140f24f7751fa43ccd92ffca960e15024188d0390e34b5522f124586b3e0ed1b6648292d55d3e63be05cc38650a0de6ee462e16e04f499fce04f63439f1d04d48a9f36856d418325a1fa22bd4fd496394677988c675f4154799c9a2850f2e5288995106b24f649b80ae9b10b40c67e4ec2263ad35374c912a154325717c41a7820796b38299c1e43a02121f48acf3326f99031190b65eeb623b8bdfaadcaac8ec0ad974fc7189ae49a07b25831ab2f8bb3cb43145fc72badbf77fac217d4d55cc12e807d8e6d4af0fee45518489d594ec22bb76d7a321b897cd43a65b223c5f9436abeeda099b90d81555a1c42662b7f2b632b9d5587b7947203932caceab8c7a434e7b29276dfe55cfa17fb2e0f744983880454b85ab5c32bd14683f7a496c4c5bfbaa2d803c533d1a6b695fb367955fed964c01c9af8772b1b56444f7ddac201b348e8a30cac8f0cd06c92b258e52b47dd7e5a251f636c21af25f0f0cce80661b32bfcd020b5b3610438ad9b4f457905bfc13a7880832a07130ebb23e6cde5aeec5cd345da94b18be456ea5a128ea9b38609062dda05ebe2df9d25fdca442bb980a2219528ffc7919ec755813927ba61b9816e266ce4a85bb71e6675acd2899a5d2d3153107faa96fd7f760cc7617db80ce6c625e28ec080af0270139c2e0768c99ea484438f3525c8cf9c3911c64bfc235756b989dd1e4db5fdecf2be2c229f94591f0b7c6bc7408cd6c6e8f8117c9a0180e4325c1e0ba08dbb3a9958e628d3078b46da148a857731b2be7b06014007d79b7b702201aa277aa8d37c8f6aec9252f9f6667da52f8d2d813383f13604963a8b13e10f34def24fb2b7dbb612214f6fc96d12ec8c2654c0932277e20e39b7b7d441d2d421f6911c164cb4821c949fdd328cb9968300ac342d9074953fe61f119c4df7db8092247da7e42510fa258b4ad6be26d2f8e3eaea7fe1e6d195b9f16bf6d2429573fb874e85fa242a6bd0e8e064d35c16ad5739a91a4ccdfc3366619a8df80357d36b45cc6fe7251362cab354ab5b9b3278165dd9938f60648114b7ab0ac142bb01a43b2375f25b77f4993e951acdeefe7a2963faa1509534c3e2793d4865821f52314049c23134e554b2ae4589b3f75c075d3259eb9d3ced8baf811766e40fe5984ac1306da55190a99b3a0adaf2c25895ac5f897b4d859211e4693dedb3d9524981cc0cba6e96d8f179ddf1e9f57721a585eb65080a55969d1a22a3c0d61e0e46843ccf8b20249d341c67b8b596bbd0bfce8fd6eb921ae1f46e0128e905eac4beb8fcd675395bdc4d01522af95f075ac7e2b8e85502d1138c766f4fb5008f8db51b4e451520bd0f3f36fba7b0ef43d4a73d98d6d7c30b9819cbcbc9584bb574beea53eb9eb8b9980c65b8629abab9dd373c1b16299df106ff42d681a8534fa04de806d06f6ce694491b98f1e8bbc15c26b6c7022188e058e1897ed659c7e54392f6d5329031ddfabe912954645dc477932714acf8be2ded944bfe7a03f084214e2982460a6c9dd07eb7925a1c5d40e2b4ddc98acca63f8e0ab14cb1823ec56e51b811fafe9beb94eb8a15f75d4caa2080b8263754e21281ba91ee952c6ac7996828a70208d0c742dda9142e9c7120f61d5e2714e4ed5c862787217a571ad8631c24b29a8010405e82d587d3b0bf127065a8c39bbcd068a14f702b5adc7e2a767417a692841400bacc8bf520c95d3bbd44808c634fcced027a06838d7808088a50a9cd68f1a16b1a1a2bcfd6ce3c1dc4d179e4a3e27f6004d0b649a35325d2a5f4e95d7d2f6f67ad4b4606f8940a8b8e41d33789959e53fc3341ad36115a25ab943edda2beffcf4c13f83055069acc8b7afae750f3289b986f8436f3fa61b1cff73731cecdc8465d7f789f7622e10bc99b08f5a990ba8a4b870283db66c357f061a8dc6315c1c9b211739ed482a9fa15e4407938cca5b17a43f439af359aca317af6837f359a64f45637dbcf3bad9c1ca189c650783aa0693e7345368906407fb57bac86496423e64017e777ff301a26d28e4eca5f0e27831a7d0cf7c015f6e5612f87d7b329961c46aa2c70d1a55e46e05163c416e0db3947fccae8052c9a272f8435a10d3433318f34f4c2e3f061a5a858033f36bb60f622f064c2c12e9dabc6e050cbb1444652560ebbc84d32434200ef7ab8a5706ca6d6aa52ef2c462a90ec6336a5477cca9d64a0d6bc3d954cff06a0586a3b09806798085ce567af0351e58974174028b66c73ae727f5148998d014c7879dc806647faf5d159f45ccb88a54d435ae16834cbf5de97cb17fa72d85b0b34f8fd7b2e1c08ecc6c8b7a7cd176de4e76095ea9842b9240c7411811cbe824b0c5d205227fd69acd8834d053315b706b2cb0debc12457481cb75cb25300b0a1a311f50624eddaad7f2b8733160f97385e12bfc9a900e13965c675005c05698fcfcff0d1a97f485e66a3a7d19f810f11576d130f8b6b5a2094a70830e622fbc43b46ae9fdc672b8e95144ebb374c4263cf5251eccfc3a92c1b4bd21db2267bca6efb68dc212386029e7f7cb8ba110f5b385126010a32d0b22a9e15a3d727829cfe04bfdadb6de92209904017d969d4f96c07b900942134093f69a3147102ee824688baf64032d5f45ace92890cb8e7e40a022db35952647ae17ce88b36b71110613ad180951dd3b79c7c9fb84b561c2f22cd03436380897ff15d7e6d9dd4a9ceea60d6ba5e2e09b6e66b3acf93371ca830929240a8f772c9641c85235a377a51b3d6028d077d559a449e403940ed9795a54d8d38e9dd2422b1130c920229c3e731874335ba0b51d152aa6401d7107d81e39c9c88cefa40df024fe30fc2d89595fdce6ea1af1b3126a33c97168fc220497eb479b829dfdd0f2bb6bc9690be1d14683ce95cbc115b3a2a09d49dc4398eadc5f3caec085cd1958814a4bf4e9ace923ee9ceb21bcfbd1428fa33b44bdc5ef225bb909c9b11c0cffd2fcbddcac0c7a5eabfef6386a8a325c5eabdcb6046a25e5784d735148d91a0ffb18e030acab7aaa806d03e9109856647f9540a9af6a878dacc2f68789a347e3da5b892add4b802c2ddc4fc0ebd7a0e22c1a8e7587dcfa35b99f5d8165b44c26ed984f60d014fea2a5d9521ee29c81f699ff66f4c1e2e939e0728b142abd2a82aea114abd43cbcd57346cb458392d8acb208c010a8d31c74fdd1c1fa3ffe153b43d22c43334f2347f7f3e49c34ac3b5566333fd779463b16f7eca5975726895900b194256afc825ad61f9ea69e8387ec666b1ae3a6735069f3a9ccc110742a38c24962be7ac40b4321620d1890b248084ea264ce60882d49924fb2bfb99f4424cdfb2fcc46298985f5c77928983b1f53f74c5e6f70650b41f7928f41854bd5102ba8639a033f7530636862025e9a4147a16502a814078d40830150e9063196160660a41b741c0d66804935d838341a00916270636933011a947c51774560d62d39483d1ea86eabb744c6ab2132c088206af153f2fe3a4130dc71e95354478e745b0b02a8eaae439b11d16b2f146f3aae4316f208f12b61b139baa8972016e5c91604408c82ac7b726bd19e9675398b86d39c20752151c48cf2f7ae61dba23bf1885a5deab8e2cd40c370a473d59c60e39ae6c4f612cb3f9abb082bd91f3d9446fd59cec76e43e5fb30e7806616227838bf33fafd38986314d469184b6ac06bd46ced486f2ee9a82ea3bb1095ae6f9a46030f9986563ce3da45ea533a2b5106cb5090c85e0d6d84252a6eefe0bc1a15b492dc37ad07145a51df64597769806b84e54131fb1d4560791118201072e6dad4db0b0611cdccef7455122d1c899868e8b032278d995c982f0357c12a94c926d030fb82bfb743836011c1b756af696a9b4f6be5310b025140a09946176a18a4f803d6e25c348973e33813924c9881349dcec523094304ad34abd2f7a2d92180b6dc219c59b1232518b4c6626d651272eeec13f4c54a99589fb92826ff438a596d70140d8061f6223b34cdcaf72ed66f65a5b52247801e6817d029ff64aea0361edbd9589e307c59f1b2e541d661b0e0819421a334b30686001fd32b30ec89dd2d9c6c42b3e22d4bbf8cef0f84055e2738b13bdad6d389155bf316b9f80a4eb06a48661b0a469fd6e292661d4516c9ef6cc988700c0f9054f17cd6f1ac39c09a4b82c9106c329c52feaead4d80000a21a303a62602b5097edfb2f24ea2bf4ddb9cad8f48913ee0078d2eb28a13ea7bc7d1cf940c9d8728bf92fd9b6479779abb1f5a89e875fb2c7ed2af699cf265c8d41822b341780c27e83710192ce1a982e1d23ba47fc84bf3509471bb929ccab794ebd530448310f3933c0a77f0188d019baed0638a9876b324978c34d426b0234f3050febe941c163493863c759387221bc76d94a376404ac9240d0a18babbcf072fc10e76a7ad0082237f0abf5284196e7058061aff7c0f7b632c786bdabe68e6652b1017b62465e9c4f4e18870b63275dd902243929c65b7b7c738cd580b872d002cdc486903e2780ad865daedf76ebf621d45c3738fb643b52a2d995d45665568d7b0a21af2a83049613da86a254c44f15abad62ca174e41847d143ee797641a03ec4f85f1ac79d6d9bbd8cc0bed6866ae30279609ef0bbd2216651177fcbffb6f136e6037ac49c402800960a1a46d89c99b349e7a6582ab39003395a5f09d4023a99dc4426d0373ab825a1df78b19be206358a20ec18176c2816416c82865e6e395654ce88f15f3a1d6798d1e299890ca1bb901e0fb1c7f7118d05b1e5ffb55d380ad1fc87edd00eed728b5704ed0ba23aab1b501bab02ec3a71bf92ee50018f2dac78e8ca7fa003526924d175ab947af6ecca4dc5d2fd2af587e2b6f3afcb85543c6d9ebfd2413b043605d4406cef7bb92534bd3e2496394aad1b69356f36e6f6df83c367d1a88b213257ff8b06a70e3c7104a9b911980b0acbdf6c32d10174d663d77a97c70e70bb9a79d99f5be2c59a502b57944a4da8c4b10396aefd3ffa5b9055ecbf1a94f30a3ddb0ec1bfbe0202f1779d1e0213d2c31d727e43343beaaf0981fd5404449f7bb3ac3ced9250910cf0d5418f4f7e83772e4740d4b61a5965c85546571d01bae97201ca1c1e8b244e0936bfe374369f18abccdae0fc25a061789556963b852f5cad31dfc2072a572dcb8100e4bfb0833f73aa8ce9456282110764899be5a6c18302f0e931bbb4ea274f9adcc5637f7fc259e80d63375f5fee307e6705d7e45288c1b1643648391b4862fe03f165afd6489d013521869c797745ad75aea64e1e9859098c8e7fc46bf83453d21e200732004a5d937865bc183f80c3aa6aa061fe7138f66e3794629a0171c765a63ddae13980afb746e5c9d8d2df47f5cd0734fc045aafe1679d53f7a992024127bcafd1ddccd112c0bea3d7e03ef50ea71f6025a0a4b594dd83e405211cdffa97bd134e407253aa66df9490d76b2e844c04c45d7dc4b7c95d70532f50f432c4b7c6ec0047f708c863f4c538c73c47a46716afac09d5814b3c3726dfce788cfcc62ed09b01a29b8a620f2b338db21c01a207d6ebbd10b03472426ccfd9aa3983b1998078cae17bcd38386cd291206a637bfb9ffeacffde949464c91df15b6ea21ecb7d99e7fe47f0274374efe092dda2870727093d3fd6de405ad1c367f555b125a387ab72d7b7c441d54c595c4ab8c0057664713db2fbfaa8bbd18cd3e686bce993a66bb931b89e9e4edeae687d557f265a76964d1a65576508951bfcbc453b43287308f5db17580336d1c2bffb2bea1f8dd930e11c31b2c472fc3afde0e5a691e338be346ace794b344663cfe58b029bf6e5f929fbea221dd50a8362885d120fafaaa0b3a595ef5d9e454509564ef707a899bae4ad63e23d98c7d702c4385afd890193f67386f6a2c16d293ad0d93bfae6eac401afcc2eeea2144fe67a0aee3ca8e4d6c5d99f02e067a60e291bc64059e5f92ade00ebb86d319215400fd6812010684da1607e4562649306953b8036f210a8006e1019bad049d6c8e32cea469b3ba33bd9b39030c8ca9aff1e9b36763eedfdc3029afcbf2a1690c73b7bf492c3143377997165426aa44da207f1f2eb54ac21e8c37c020a1eaf515b9e6fd2fdee74506089366aae7d32335afada6a29c6c259d2bb73aaed2397fc19acfef998f20a5d361052baf363b7a67b466f43982bc134d1d795753fb6244fcfb43991500d84f68104fe77d99ed11bff8f7762674147e7c078b51a81580d5de685133ca4ae90c6a0e2658cadae2d3d4363e5e384696c2f4853fa0bc0786a6d2f62bdf45972a629025d731184ff32014c4e8df21dc5565999c9c472fb26fd637a12b9ddf05c627c8209117bf861b62ed67ae1ddcb29709d1042f529cae024c8ff1dfa56750449f7e173990fe838b3d3defa80c4fba2a85110e0975047efb1be6869eb459e8be8b49d215ff4d88a5b69eaef87f396ea45d7ee44f89a171d4ff8360bfb481d0e77d149cf9d319c1eb65754c78b0eadede220683a6cf8db1c256806ada5bceffe34f446ff0c8a2ad989765d53a83bd2890eaffbe411b49bd602534d363c4b8ea4052ed80ec448ddeef519900018efa043453f0dbacacb6fdff10bd373ffc0f47e16c7dfd61de1769c87736d386671e294db3fb44c51a1b0205285101454a119215a1f7a4267f496086e590fd23f718dc89b25cdd5634d6cea43615e4212de4f02d2fa01ab29b13ea2d54e00e7d9aae1ebb9bd2098062ace70ede86d3176b8ce78464123d2b6b6d233805e5a8bf6a58f8c84d86dabf3c7ecb782eb0e580c0a8187817580e455428b95926d6d250a92b6d5d7c64b5a46da5f892a7d82de41c15399c7a5392e7059214ae9c26fabc2c55ea6b290301b3224b7b6faa5c27b374bb24878eb8755dfe656bdb4fee324e70ca2544f89cd59116f26501cc2b994ca19c9815efb28cc5b8cac36913ffc62d05ede34e44556ec9697367d5a6662ccabd1a8a9c07af1dfaf272cb26a22f4730c8143c7accaf693cbba07e594d2adaf4f0a0f1dd170a21090d0509e601e2c767988fe5102a14a1fcc897f2ff4a8fb63b96cf6e8e6d7a09fa86f044f2820cfeef57876317b0d67da909bff7e80389f3fce385d2e0f2a2a25397465710278685f1d9c438e70940f9430b4e386be4ecd6f06a24cb49b7450d409c2e287a8ca90c9d8ad8aa23d29e0c8642671e2e2340b57df6028d25118863927d08fdcc1cc0ad07afaaf1a9ccac118ea99832ffae9abadd17676a7f2f0ec91d832dfc21caf2f4f94157cf2d07991d9c9766268c96d26fe249c2bb7df044d7443bed73c3f7a1c1766ab562ac921889980106f7e89ff4b55e2bc4937da4f621f2b0ad4e6033d7b47a280e6ecb1b5c46a2c013df9d7aeef11c07efe437cde5310d3a792d467e87b865ed093069b1ab8506d95e7a1fa0d24b74dd1b17ef8d243168857ad5cc6cb559fa44239e6fa097cd4edc3e20e3dbad52957d8faa89165f2b35504cbeb37f73f215d76c274858f234ef4f130bb8aecaa6121ab807ee270df145e5f008646eb8fd605cb399ba8a453d08a0ccbb4bce83f692a769f081c3e48927bcb76cf598ebca80892cc69c9743150b7925877ce1c6c76d8ae28c642d91772c21da09b4ea6f70c85353096f3e4597295158fc2b691d871690552b3a89068e366cde9e089019527710385943b2b9ee01cfe114741f2814dac82c91726e10a262f18ca28407e6009af207b81a53c05e90393710ba2070cc229805e3084154b40bc8a9279f306dcb5c6d4094fd7fc64083b18070656c0af692778125976667548f38c3caabadbdfd077c31eb512e4a67f8ad765744dde1907f185e8b6bfc7058a26509d243c4128726931291ce14355c436e8010b585c683ebb572414d89819247d1b22896e8904960312f1a05f30c1447eef358cc66f78f04657ad1e8250cb866cc14b933a2499b938fcb325a42137c699780e0ddd9afb86b20e82b79f07b823fafeac01674b03001ba30434ed8e7f18555f0835413b6b63c74374e602aaa102de5895ef832936c508aaafa069cdefd819c983e13532f371d6aa145c87e34ab9eb37e90712b931fe268c3cf129a58eade43f3b323e77def45e885314c937b9fef9d6c72ee3156b0ee833d13f52a434d3f8c03f94562dd9cbf59361b4f318cad3a91bd92be336878e55a906202596371b08c17b8462d2c7e553f5c56e6c556531bf079a20001268ab77ea5aae020cbdfdc2100c3f39faae4d6df8cffd18382dfb24caa59a288b370785fb54107e5405b0d5982bab7ad7e0592900835c23b59e960e2f4b54a6db9a01483cff57d0f47b92eeb6458b7100d00196e20021ce7f45a159777d4cf021280562d2b24356d913c7252a165cefd3a81192c5fb3f57e3e72d39cee7309bdf13e64f4e5622eb3859b850b0838e63da483f481a68f3c85ea3205f5c67fc42f0eef0e1933b7810c9f0e20058a566a5afa2dd7356f7b7b0eb9b8f7a17cbe04cd821749c76b0e8647f55aa370cebfcc64d38803c19f9055d36dfdce46e1cb4958bfc2bce9b81ab9ba045776dbc4101385dbdd99eaa6800cf14b021e42e71dc49d20da3a4c5f49c569efd6cf0d5823e236efcbae768fd0129c8b422e72d30cbbd84855eac84280dcfcf90577ebd6100b25600bd0323b113fabdaf382203f561592ad71d01da2bb08c8681085de230b456709a721a0f0189dc004952932fe86e9dbafeeb55f6ed9b1981f1fd63bff16fde0e689dbe24f241f0e1a20839de1d583daa8c56f26299c6cc1f7e981a02a61e89df640c507685acf14a179abc0fbc7df4453f00cfc62d9b684fa0e1338a320af9e305562c112d6a0b3f3e49e0a04294e8ea1fa1b91cb05b9c9cb323c43c380555854ffa7f6e683037aed8968e41a3640494ddff34cc9f38a1511a3d1a6cbae863c3b1f43789dffd6fe45f5480b71bfa25c9f76cfe02932fcdea38a0d167886583d9ba3c87edbea42c2c25e0e0492d8be527e4c475f5ae6445bc66eb7fc42f03d8ff5b468560050bc62da4abe5eda5227686c07d65ce818d756407b72fb898f2f0f90e73f1bcc04ba494b9b085fb4b24f082ea656b545194e4e8c0162a07e2d5f5edd978e84d579c98f038f1f809f148d101fb808beb361318c6fd89b61861afe44354daab991907bf41199799fff9024ef5c053b9b3140641e13d1b94c731e8e5811c792c52adcf0c8e761abb1c2fffd78267c1e31742eb99c644d3d2c514664029834cc8442632939530b2990632c8ccb2b8f8c334106a8d36d8e560237f506481b05e9aa49197fc7681028fb8f813c5368a94de4ea0fef29c68fc1552d360b169a6fe108b0cebb19275648fe2cf398bf7eac10b5035804235e6ef72e3afef9687308c838b89a2c40e099830ded4b968df01b4a7fc72f774323549147861720e9b1ef40b7f4aaa9c939c94fdd96d4d2a208009193f840b953032f5dd46e93b9f10d6bc48c66253a65152d92c93c14338c5787a2c699e5805fe020e0cfb9a3f8800c723492adb9cf455af7461d489d5d4ec57562595ed1066e4ad90db773ff97485c56bb95eae0ebecc831a2cd7e976f189470aa2c821c3e8f4001dda46bd6a47c4689f2220e71e4f230ff0f8e48b86906bcf4e0737a14dbec02b8b0113921cb20fec2203a535ca522e9997ec80fa50ecb53f41c2b4c03941723ef172f3e7793ea3c7ccd9c2a536f6b9d492eb084280e4967b76ef521126f1042f9ff6e8f8e6f1383904cc0b7c8adddb89bddc5de71f7ba006afaf8c2e3e9f1dc7749115a215aa0c79016f47e76387a8c032245f171b2d8274dc699d28ca4cf3a420d689f5e472cbd1a79eb275630e8d414194cc17bd1e73962a5f6996dc32851b4341923bfd7ba2ae8559715aeeecad94e7967b6a25ff6dcbcdb09be4ecd2114c68614bda6ac96fe5a82d644fbe8acbf50cae16744268482d122028503598fd18c6ea7ccf6eff6006485cd816080bf41efcee097a33672e5caffc874496f37436c91f59ddefa1d1d7e4bfe2852069c5d1b8040ee6c6c0c8056eda7162e0c1b77a001e57a54e1533128fa85199cc6ff6a906fc802400d15efcf872df2676e769547f805e50006bdbeb0d98512a2585abc67b56971229bfd3218e4cff9bee3e0df859083b8c5929b695dc4638371855ffe90b3c18685c772335fa062bcf916fdef6541a8d56b90c20184282be13df15a3ecedb1c62560b8945723bb95e7c1c3baa73a51a64b60364778a9cfd72a84dcb45aec05c68806eae7aac47b2e4029492d29e192d62736124ed451b2e80d867af56a9f74cc4da55927dde5fcda818edcf3d350aaaad603a60ba21f2a875a48a717ec88bd77871f7c41503f9471430d9f899f3fa25082fee6879330562372e082723b673f1be3e3a3225f306b1f8f8482a71389c77946489c0ce6330baa080c6bd6dcce48721ac7d06f19e6047fd78143602f7782458bcca449547f14ae01b7bfc393535950f5047dd049c1ddc5c337094d2ab6be6d9fcc381170ba78ccc19847fdc662db8f35d1e8abeef6a64d90d5c333d9431bf8039304d10a329b3268623a720fe8eaa28a2c8f0ba6e95cf9832dfd884e473bacbcef192b37ad012475728d4bdee82c32298e77687829a60a1235785de445fc2819175e2ff0066b7386b18a830d4faa13d203ed023e873b665b8ea1ace3cb90228aa7bf92591158aa974dd2ce83355333fcfe4da09f6df628340b47f0da85c04c70a6c3d6b2b5bc8893417b2e28c9890ec8473405dbe198eae208485d7e78d91ccf56647c30c32f03a6bee7868ffd20fe8e222221688810049a28d3b8d5e43aa45acbd337f66a8fdb41da3e24bb5544087fd4516abc1742c8fb1ab817222db5f808779b78e739c45277e1bbc0a3e5d7dfcc71fc96b294659b994410c03bf1a4e0a981c96182c8c4d80dbe862c8548944c9f6a770524792007d2c6a88463790b0752cf53420a0ca470b61d8bfc00847a21332ca8cf76fa124ada93933c2d54814d348056a9af2cca2754714357c9d195a31feddee3d9abb344ecc4dad2a65d7aa738d3e3acda45cc187f56d21b1e6c57264ac95c6e605277ecdf5e40cdec56a8140af8299e44bca8fde84063b343489935b21d99dd17b78962a9a45ac3e3fd46cffebe2c162bf1aefead779494cfa3b8fc35e414ecd1d1d4f67ee43431ca84545896de472c5b24e8b7c40155dbf7f6921555f454c923fb2fce14e2712acfcccea6cf6891f24bc0eb281bcbe5bae17211e38fa2935a87cd04463aa177d11b270912eb03efa615712b9bda797cbebcc4e1b4d23e0f158e7b94ddc4a3a572acf320f66360cf8614a2385d55117ba538a5e19be307a98e6206cec407404d441fbc0d330c4e8696b842b8653922152f222ac8cbb9f2864be58542daa02874e8db448f9daece7abc674059ae57a4dffeae30094f458d985cff558c5d0dbb45f2cbf986411872c868f1269c19b7d2ffdbdb843f4b06d387737b4ad6c93d184088c9afd16577d80c301bb582d79c140aad9c965ce8b62eef0b8cad900a43b5cb3f843b422a056361a1abd3acd0d64b7df644c6cfef632e9e0b86089f40773b42794b347d27773196d39e83a2a2904669aaa460465db41c354172491048a39caa70d188223dab6bdb2586043511258ff7c04badfe908517f977eaa835238ab3a1e5737100321aa3cb047a28245436e89b032ffdcffd8a75023c425197ee7cdb4763f11b13de513aa2f4b390271097e994b9fa47aadc96bc77200d2bd06799a0a4d2fe30fd66ca0e7ddcb57042480cab26040f6e849217140d9d7d71104495101746c754307016b0c30ea5a4f1a83447a7aeb87dbdc68b98eed9ad4ace74873a53a2f82f8ba3664045bea119ef457d1bdff5b8bf55d00a0b919311374fdca44bf2abca042b6f753530519bca1e83b65e2ca5d8852e0bd6b3ca73737f579d16910b40982d4b061052b8d59de564546728f1cbc77375d3b362adea7c4f1f83c62c5d9c0d4ddd57255638332e98ee8965b47e90f58cdaf03b9438081e62fbb73ca0a6bd164b4ff35e94d061252360a1b63a3f58cd785826b3d4fcc84023ccf57f62b3cf61e485c3b0a2bc741c09e42cddbf0f2bec85b4765ece041f563035b41adbfecca3c888caf6a5108671a26cb320242af1e9ccba8c21a9f4aadc97b0de7e5d0a8c3153a7c0a654c69db04893580dc00bc8dfae4e2761697c5379511e1d13425888270b466b8db0f44d92d4075c505651079f18af5b7573182d7f5642a88a32130e8531a5c1aae12d6c5a3e142d3ec24cbe4cbe44511403a37ddf937d5765daf4a85db34d598ba2dd3520216b0b19499f644fd2eb557a0b9a038fbd032ff121057d76f2ccfdd9e491169faab107f0b2ae5fd5889fd2bbae0cc5fbdfc5f734b3a7d5b5a6c6329d634a9919fde1815c601bcf2ec6590879550d5eec20a41e88bea3ffb7d46f68942231587aacd90f0e2efe9d0a5414144d681b90da30f27e5f3255167d0a09328d66be590a7d1f69c1ab086a7e451ee7ffba814402ad97002d42a87ea3859d1c58f23bfc66c1efc4fdd3dd98fbb074c32205c9a6dbd630bed5e1f3e50660c39d15df1dea191f5409669618ce4d20954ec5bbc2c0d0a81c12bafa71d10ea881118fdebb10949475ca01b5eb14bf67ff47a21170188b82bb90db29f29e8b9e976789d0a07fc6b2674186bedcee515f76828bd8fcca2326d19037afdadef6f2b0ed49d9849f21ac7d2c6e8d1f824bcb81b2e94d06c5f3f6ef5441f245f75326309382ad3c2f9ee655f0aa1081d02a2c0b3858f83083fe06a2fb376b106cb1590087aa1bcada0367f305282baa43acc36fee341b63b522eed1a27e438852b9bd8acba91084b3064a81b5f06e625d964e2f56047dd9874c2d565002c6933573917d0d2bfc0331acd8b8623228f5c10e857ac93fa927dbd3968169d12cce40745eede48d88b7fd5d5be1ec6ace220690f9514c7ac4c610141d790f6635ca61a83b6c6a900f12b604537d5a94620ea52615824799d3da22751baca2bcaa3fa17ec34ae3f89fec0fab5aa2dfa3ed553ea05bc8ae7672b991d4ada6d9b2c1a96ea5aafaeec39fd5b71617f0fa9b9ba435f03648e626b94d2ff7468353a52ef9115cbed71dbc1d0c3eb9f8a0237caa3de0fd18deae24d997b5818b210222230444ff5fe563d5a4f47df62495961a932585a2e1f01a626a536d935d4af49d9b862ec81a0281abc9c3d6b05548d534be8a6a1fcc933c1283c9e9b9a9e11fab7acc0a9c24db1e06dee52e23ef9db947ac7d0c6c915e01f2796324eadc218162ad124308d96fa96f18facfc959ccf34422e0f4c7ba0c0b4f521376f4a8f3fe5915a0263e3d34d733028d831f7eaba9b652d1b20bfd66325015190da2751f31f82938b48d856821c749595cdfcc064643eb90b41b9d6c067dfa47fa6c96a3ba14fa9591ba2a5db2466e328b745c45214807dde0890a8063264158a8aed8e50344afe501f7404e397c3efeffa3c21ba5877a1a0472b39d3d79e54d50921fcee9c87417b961454edabc0e9cc6573399bbfab05b2614036d6a0343693e622bd613f638a03d7a19c69347956378b8513fc1aa2a7285564602a6a4d2af0d70cf530e451855690b1d33fc18794d33231d6328eae3d9c583992594b438ba2147c7689f56009f4133c25cd41603da9a93e9e55cec95eba50b57c35212536c4002754bd9c6b4310adecd0d77252ce130d6a56c299eafe27a49faf0277721d1304823d9ed904d4c697fb86bdc6361cf38b503577fd50426d525c3a5eccd27dcc0987c362c415d9fd3cd6fac5752f28b203ef7e48b467e637a51b6f88ee193e0f770d207727fba5b4f9322a893b6e2e3dd4a21c55cee233ecbe7f60e0829c5669e95f57dd4d80bc49b594891f222a26b772336402171ae90c3574f7f85bac7709e98c60bdb54a81996ae217ce60d3a86da1583c9e0f72d38c0630cbe73223cd000f716cba5555505c846a1c719b8da09aebbd0751e013bccc1ac47b5330dff49aaa985a91ee480d887c88ed2dab7bb29289638c59761603cedbad646f64ef314f1d56d886a095c360089eb6ff81c4220c019902a2f5669bd1377a18254401ce0aa4edc3d4dc93bfeb743ff7595374c9769de505322a80136d3b390067e2033196bb98d77ae8d4c578d9ef8a2e11447977812c21ac339a85b2070909f3fd76b68c7aec54301093569b8d6069e6351a619a8c15afb4fb94d8f13cd294723aa5d4270b6e1f5413f27111d5408aeff05357ad81476029efc44bc0e644731b9a6f56297ea52cee83d76ed2e56d2b639da124269f7a5dd33f808150ce708ff5b08ae51ac0579d91c7d1cd13fc7400a9325d8324e7a4a5c4eceb115b13aa23607f62f743c24d4f349a3e380c7c12e3cf5f14c22173c4cbf987f210d5bf408492ad386b091836106abdc907946373e1c30105bcdf027aa1207ccc24beb1e4d9fb341be01b8d922bd3d03c6c857072674654f268364ec0fd23e3c78035c2715e7baa1096096451e049eeec904fc4970b41ff3899584cd91a82eb1f035e2cfe03c83e7461fa3c059e45a8d810d3c1706df5a2d4e609a800889f30c01b3cf8e3fa3a36b53eb2e4783b33c18c0ef39675e0379c4b2a58e77cec8dd04f5c9e6ed97b67765f6a2060d44fd4a87c82317335ce4ce6b353c2442d1987da5139f550053613331aca8dca6b0e79b93a7638085b55002624bf7f26046593b3d2a43ccf223a5d062de016137cc52e78d030927519b1f2ffc9831dc4b52cdaf1c3be91b95192317198152094c8413a2bd4687654f0548b43ed71d0667995a802db5d5b02f7204864ea2beb71eaa53c4a168e89adf7ed4e286d2fa5a51682f3520d6f3c0eeffdd05777fb3ba717d84442b2ecdefa9a1e97603648d27c236f6684f800b23444c8f6db8f312c7ed6dfb4934329d430eb79690a34f7beb001b1f226463ff98f4bbf221848286cc69f87d2d4f6eb5a54093b6b5b90f94952d1ee8ebc7d1bc3607b05172c6f8d7f18630a7485236d87357dd1f8eacaab692ee03a2a4bb1cfa9141267b0d72ce82f7a4e1eb98c4908fb93697f1c889ded4a7504ca77324176f6daeff72c6afea9e7d4771db053fa01fef9ff5e41d63df31e7e60cb6cff1bfcc66f16762dfac4ce85c1515692915a85c48e84b2a795b14252099de34ce9b978d1e32905de7cd12339185a54b1a74b2429bc9532b8ee4d2446aae10db333163f35b0886652ca52e94613cf1a280e3b908c79885c9f49d9690ea38de3d04733d0243ccd1b998680eb1666761f82036a5659fb3c7366fe281fade80ef78b9ee0c431ec84c5d48cc46f2d98a41c78e816c313ce4953f257b877f5fa2c3f7cfdf1aa6182567d41387ec5ddcbdc1212aac2502278ca6464d3f415706cd565c9e5886521898504178ca5105c80894732ceff3d0bf2cf351e23d902207208aabec434832b56d75dcb864fa8f1c02171d37205d1f7b254565f3c0aab954795ac24742d9f569d4a0df1e2476ff7473819f2271759cd02b8a139c484bb78f02ea8d0f84fd90695aca143431280142155a859267b5c71c6846d57ee83f9d2a051ed15f62ab1027ee1a46965a8141372b1202597114d1b05b64e8fdbc42a4914d6f61bd4634749ef8d72102759840288728e210f1876cf3b1dc8e1bc28f581befb79351a0d94b1bb5080cbedf3eae33750897d15e458cae073e3cbd5b2870f423601e09b955bdd65345c5d4dc1d80dabdccf77ad0cdbd8a3df074a0178d311cb26b6d47fdb9e574e8e51c59603e00e483a15a9290a730798558db5b0444dd0092788ef86617b279042218990ddaba4d87c7ac5d0a7704cb867ddc93c804e530c93b4e68daabd3d0821cf5b4a45578c9767e627647ee8c2d5ba34fa2bd71f0a7db9d78aba5da0dc474f01dd83cb5d48d3d7e2ae104152bd1843575dbbc2d29eb59ddae1153d00a08bbb6da2b896c4a8640064e14900fc3a4c79d59a2fdb86ad18621b03a11311d04587a1c4a92c3a413b4c8b5ac69656a9f4a8d203d5e828874a70b08a99eeee874d0ac03213040c2be180f1ac5b5cd2b847f1900606e41fc16983b6d77ae8ba2be0cfc278d7a886ddb7ce168b3e024e2dcea09a8122d89f5d0e80cc897b49ebcd5ac053edf7cf233582018384b780acefd7e1e03662dc88c7e8143fd74929921eddd3a7655435ba6555bed9ec754aac4e34a06e7a14375cb78ad55cc61ae00bb68c1d458e466c68a10f710f0956b75616b0605ece83da2f2214dfcbe8ae7ad5ec0c517877ced107f39e2e73bef4b2c7e99f95a447edb954e689ecf66f2b4913879c1caab883814222ea744a36afc0648102260e3859fd040ea2764f15f91231f3af9db4fc533d2b30913ffb072e8e318106880378ae6961134548dc28f3d788007f35ec4f36a519f3fac893f87c9cc4b25d4fe21fe7f833041e2966978c34acc4c7561e74f67d02dfa7365f582c2e22d31341784f255917fee069826fb751fa3ee1f8b6354cc2092613eb6b1e1cc42497d39e11a0d9807524f785a9a53222533a2ee302cf54aee11f966bd9118129beed07010bdcdbaa1ab0a15c51ea70c28ac3ebc957959326dd3c29f951bf96cb32d8d912360f0585900ac2580daddd83b737000a96cd9c0e42f18474423dbbdef3fef52fb3e8ac949b80f674fdb1e11216c76830ed706c1b036a9a6d75752fd0cbbbed274ed6829cd4fb4c11d846201162c03438260821501bc064a0f4b3ccbf63a413b1dacab5ffe1127600dc4aa02424b935074b0f399023e37575984019ff95319e1ea11940a6f2b8b7bab0b949c6262407f61949c16a4ea3d71c75aac42ca3e41cd1bbfa192577a5ad29fe7b1635224b98d730df869c849f34d2ccd2275ed69a4aa5c40f363e45eda892df7fb11b0c95f25ff9c46b3faeb29c275876e645ba0a6e65107e4fef97034605fb3d98c9d1d799060c89f37bda31a010642dc22a3cdf6bdada1ce8bbcede7ca85ac58c11c0d92e6544eefbad59c9e42c947138dc864ba873bb13e09e4ec242c8764c83cdc80a31bc76fb361925cbe987db68220383e3bf8cc439be83c84784ef23170be0ce92363562dc4dd240128251f8cd2c5809f7787d2110181f7694fa71aeed7b3e18a0180cb7d1f03026f3766420a46df839ddca64e5129428c6a315076130bb525502c967a5456a18514687c0b037b2a3321ff6d2320c4d876a4c28ccad81de4d6c86428e89f3dba6500eab9745880a3a2f76ca7aa6daa9cdc11abde75ea33b9cbb4583123f65dad98894b1f17097758d9ca13a195af8428c639c2e376b624f538a170709329172515e85973c01a7852a19531291532ddbd7143f85167e722ba9dcd65bd563db281b92f519e5c2a1185b9f4ecbaf3406eb63d4f4c6b180b4263186cc6382672131f0d4ba6177ff71d6f96b191c2007fe4e8feb59f2a3820b97a6d747e9a24e28fc9634af0ab74f583c0d3c09f6a93f81b4a8e46958eb9a7828c120b7b7682b0c56dc62ab0d29c0d1c98c80450999e87eed87e9c4b86fdb270ce5a0060fee3b952c11d8e5f6b40224bc19e3fd973c3664557209e539c84c797003e7c00f0052c89da95ac0250f79967f3ff1766edbe67a3d10a6188aac53a197118daeb9677dd0e974c054f068efc3a38a202a435011ad9cc2e54800e2d75a69300d6c428a4363a71d38041ec339a0c0cadf8943a1340024d0808d2b0a5005cfd4b8445dbbd354cc7309873149b336e97c568361364859baf5f43cd7ccdd0bd322289284849be0ed93b25b9b7dc3be902c802e1023b83fbffff3a2a5887bed4e40d9d9d8dd7985bcee9611d0ae4c809dede7fee29f43cb038b229e311e2b0e126803c80485e005d3d870f5183e7004a06ee7861e81ea5400a648213c0ea54eb4193c0a0a7ae10345f31cbab3543cc790001bc12177dd336add9103486b1a12f11b16488309c44e2eeeebec45475a8bbbb7b0adc1165fc901094431f294ab27e66b00b22924c2b58cfdebaeeee7e345475289b6194bc62b0c40053567ce012247e5ea4f6b76bfe151058501c99203e56702a616a5627ab9db62e3807f42c18a377aa56b9bb679d611dfaf6806dc78a60dbaace73774fb6a8719dc5c366cf9c72ebcb4aeb629d4c80be9d088b9a74a3e905a0e402102542a6931a21ad169a3c34f5e89bb6691d800fcf8850a22f864112693b694454aba020030c02969529473052480c9626b120d6b3bbbbfb86b7ddd06b3700db0dc176833027000a06c99a34b42c991e15923021605c5083bbc5fd0932f6c20f8bcb43b8e148a4932d9ad71089b1731bb7b7c67177777717d6b3bbbbbb6f3039dbd6dddd1dc56ef3fa63cc3fcafcc3dcf869def6ffbbbbbb6ff0aeffffffa05fc1d48093e6fc8e28732c7730d174ab81098608c0ffff4f08f703f02dfd903f667f550c7bdf97652dbae891aaa4e8665e3a1543270631ffccd25cd44a1e2d4df883aa686a6c35bf97d51054ab4409d9534406bdf8682c92599d1e78498f80473a99b408093833b357ac339bd6376dd35ad51baf22009cb80ad7b78e41fa90fda429cfb6d794b572c2be3bb7717b7f071849ae15967e69451a7c447256a2429b5ce9f953fa62f4e803a6efce4da74d672c6993a324948ade7825a9fd8b71cceaff7f074086d8ce6ddcdebcffa9d423efd4a68129ac0ca108c97418d61c8d4e889ca96e01d37cb560741137be28d9b2d4376dd3dae31f02b0644ab2250643ab288d052f888948609ca1f0aafa30f369f21a2ad64a5c70e0091815876508872fa2112522f6ce77f61b6d1ae76a2c3e901157392c63236758c4115292be699bd68e041c5151f4541dca66a809ac9169d357faa66d5a3b929aec69e6bdcb2c4820a694f9b9333d7cb2a2c82a66afe6042b6085876b66577bff36ffffdf30b10e6d668e1be7edc3d0fcbeff29d6a768e2d18438c39d4cc7f55d7bff36ffff2f39b10eed587ab25adfb44deb90ff4fa3dc77eaadc6c07a7677f77625cc75cfc109cc50ba964368214c6cf8134d124953c2cadd5da706eb500e9d1d56bbbbbb6f750d21b950d13c77ccf77d7de9d3458f4fe2ce6ddcde3fffffff424321a25051c828a4f45c6edbb66ddbbdc319995b4947007d43254c81b5501213e3039ad3773db10e0debe83a7b3bbc7aaabb7b075504b3174c19b01666364dfaa66d5aabab8d564fd876beeffb43c35c14f973bafff9ffdf84e9fe1a82b6583691264f7ae3d564b71a09719b256b6b561f2e1ed533f084392f487cdf9706075d34f996045dd42899e13dfc5350228c8c6b85b2175e1bcf44e24362148044d87e0c2b666a988cf07204637624666cb154d54c566115d0d513bcc1bb5588e2d7459337409c5be59b55447832fe953ff7d39214744628f5708a604c318d9c76b5f7ffff7fa451d5a16ced48432b009e060eeeef1dce39eeee4841ac438543e20652d14308081a69b1adbb3b8a2ea2bbbba325b10e455bb2684efa86e63cfbff577a621ddaa114c66aecb1731bb7b74a9241dcdddd31fb71f312b175e7366eef2f669168f82ae2eaa4c147ce9a4c8dcf05fe9a5159c166852d302caa70f3cecdc8d0927073dbb66ddbb66ddb5665a9e2a422a582a5d2a5328675be63dddd3d86eb3759835eb1654f7c222baeddfd667377f71243588726d9a576ba496dac5c17d63d4789310b8c6e06b8a61143cb3a9beeeeeeaa8b012ee2255b29afc9c173b636a4c7d2ce6ddcde2130385013c809f4040afbf4476f958a2b8d49e9d5de5f63188475e870881d26f56de4254adfb44d6bbdf1fa536bc99ddbb8bd7b1d58d130e9e0bc28655e281211b27799b74b71bbb9731bb7778df7a166d3ffa2144f5587b2ee03b6731bb7f7ffac90b1209887000d9209ca96488c4ce91cc99e205e90d87714c1a2c945774f77aa0b4e490c53dcdeb98ddbbb2541857c48af8b55c4cb8bdb1a40380831a5c365f204b3b5f12b5260a762eaea017559395b64ad3dde891325b8963ac7142a965f3e1d52fe570502563582092ba5056be7366e6fde8801269c230994c0e84189b20f4242ae9c2c0c038ac7f62d25d6a15b4c76aba9b79cb73da2e234719c384f9cb026ebd9ddddbded6074dd45925a8c2dc82b9813c4607262ce663e70e1ab9311365ec35c7fac677777676a3b98b4bbbb4fd58e4fa95d4af5b69e7b26a4a950430c4a39d1650574ffcb7d7777f7ffffff9e047088262fda4c89effb92a4685227e8fe375d8d2af7f54ddbb466657c8c6898bb678008621d2adc0031bca9383fb8aff91e45479b8c9c0fbf60aa01485383afb86b10f930024d7e9408d72767ee84effbb6fcffd7982e9a1461baff4c3739b5d50fb13e2900c521051a3a7a541134c404a4414c7cdf37054d832e8a7479d3a087307f6ce02180ac11a6039009b99e3d58f34a6d569e745e462f2e64e6bad4376dd3ba4a8196a8a227d5cbf3c0cfcc7cdf97277dba2812c6cbf36be7366e6fdf8e14ef97d65c7671a0b2c26d4e1ad2a2000a0d4c51cc4c0b67464d78eaa4b9d6dcc9545cf73585e6e30cc41717d20dd0ce6ddcde05ec34703b24f5c86d26221215898c444a2266fb39e7dce6d6ddddfdffff7fefbe8cb99130674c9b6e573c904b8f981f8b2c291a2b9a2dbd5794086492c029549902dff71571776f952e7a6c61cc7577feffffce6ddcde1e5613cd8c3466df072d5c44cd88ad78e049b14cda99d9b3697dd336addddd7b9eaa0e655777e7da4bf29424831e4047271b8e51b82e258151da02104d98852e7a1c3b13ba2d4fca7fcefcafc2fdbdc3eceb6b912529c0d79425200b151b11a66454889ddbb8bd0be0a5648ca4e0e1aa0398d7d61146a9b9845209aa3a94f59f916a08c3a6ec664608e5f1e5317656fb97136356faa66d5aef4b9f250821fdaa8d940d964d571b5596af8457c32be255f1ca68034b871c8e2ecdaebd7f9b73732737839a43faa60ed7a921ab05d40a6a09b5865ac49c734e1a4a4a262d939c92a492b05cbbde2b54eddbcfbef6b00e05068543cfe5b66ddbb6dd3b9cb75288d9e0a55534f195c2859886321d169f14392385cf8cabbbbb94ebffff4ba5aa43d9ffff8f9a61a9f1a8f0bcf0d4a8380ab29e5da74b674c07ad6d55dcdd89caba766b1411b733e8ecdcc6edfdff3ddbdb8c6ff24dbec937f926e7dcffeb9bb669edffff8fd71e20d75e85bdd09aeb8622d68b75680f186c3bb0843995f702e3eb4902433660c154c613238b61a985082305c2d2a01615dafcff4f74c23a548a8388956b2d4f29dd31ee287798b790ffa34cf306ef70ecb09edddd9db7c43ad4496a8387d5eea6c8ca12840298934543bbdafbffff071573903148a98398b76de5eeeefeffffcf02da72f6c333684830204d444d162e6fd26564d7b267dbce39e70f25d6a1cca6f3b9f111f6bb8c11257dd336ad599430f7414e60a820a821a824d412ca094aea77bbddedea2e5ea4514577577bee9e1e812829748f516ae75b3b5b417a0010b212c51f15cb09221e06db1adac242932c869e1a6bb20125a30b1727558b07fe4249a24af6c53a5b7e840131a30ad99ddbb8bdd51d9f3b033b9f7ae236eb823e50ec8583fc8873e58453458f49af93ed016a90509bee9e41fd79481608139062cfe7b54c85c3fdff5f233ab9fffaa66d5a9ba12f88aa0e55dddd05f0154f9eb8bd731bb77786d8faff9fb6d367e6786a9bd6376dd33ad81eb9882488ab98b2f6f2dfa51adbfc33dbb98ddb5be97eaba2495539ab75a8e0e444a5c3d2b2e889cb28009ea1ba74b68abc99d7737d001f934911db3d0994fb3bb7717b6b0089284e9c59ad003e01f196d9f1e5b547a9cffdb6be4f0e8ad4fb553d7618b3691ca41f0b684840421ead3118eaffffffffffff46a5c26cfaff6befffff1f8ebba8542c5faac8041800431a38040d8481284e049761031480091d4c50485e4c0c141a321c044443610000040380603018100000c180701810060693f3311a1b60225d48bb007f460bbc8c335c6466b4154565b464471169eb99a12bbd2cb476ff31f63d89cd9d90c7319c1a91d85a3a11d00273a1ca6ef73834a51f1efa1da1e2a2a0cb5bf19a0c946208c4df0f9221f7e786b92fc0e805b5d35295e8a11a7e55dbcb13aeb361c9f6af8106f7a1144990ffac9357fc5487352972b5d53590fb34b9c9741fa1ad9e83686747cc768ee45e386a7b2617adf0e2cdb27c5e7886a8bc6e75b20d57395644280e120d470460c33594433983f7648b9575cfb147bd3b5a4256bab73dd4ec2378da9d6a73931ab2143124770163b69888c11543795ba2a7fdce8513927fe36ca73beef4d32d4cbf941fcbc10e4b078a29b5deaf1baac2ed5fd83470ae53ebc8ad968968209f29f6410d2548dddf37346964bda5487db96fcf5bad3410210e23fc1aaf541f339463ffc2e785c1a6e8c4989e5afe0abda5c2590e8d40a043be1ae35b44445b9a8410071dbb5cb7adcbeab9e84659a07ebf69c68a9699916f9c0a6a5b2073dfd8c3ccf3821b03ab57a2356a30e84b1d98063b172034662565f6056790c48027fb7c9cb1095efc1322352da156436fc07d571e11197ce3ee2ac2e8fa40c3503957d4b7b4aa691a8f45184b3ece6e0447661b21b05a7b5d55330b9eddf5bbd87684078ec8fe280d72f6306661e77f1bef30a6a7232f704c8ca62569cfedd45c25faf6ed512a8240df29f28c9d581c20dad6fd3e54f1c5cabf1df810e0dc414fb709e3327ce28edcce4b3a97d0a9048c838e15028c67dc4e6f3b44fabf6844895c98c4f19b683a1968d6855b302461c6606a3c57d3105321fe022e643868cdbeac51d001df690e6473839c6d65adba51676bfd08641cac2ea6a02cdaba485ba0136b9c65f8b260f4834e3c2c9e980fc09305f7f950f0782c5206dceff97c61ec4d8db865e7c938d2f4e7d8dcaa3104ef37c9adb341e474c0072c1a780728b1d0a51e3fc1bcac09019b70f35e2b52c408b561a81060a45cac722e4d31448ed64385180702da6e457ebb6d98b00d09c15ba19e4eafcbe1bfb251b8372b4ba8f1b19858d189bc808260495151f86df2bc49b1c69fc5327e528518ae71c1c00ee0a24ac7ec84e2fe1810627091c1848e7e8edd1fbd7c93b76dda3bd54175f2a3ab3f7eda2d58285a3b4e5c4f0d19d4949bd1ec2230f8081c864b251924a820f1a007ad83748fee0b7ec70a5a0fec408083ee0e2f201f99d405ae16cd192273aee038427891b72d34ed28a892029b541ab456f716d8e4d4df95bd39e056e2e172e19c47a83b71ad8d9468ef882e2cc3e784d912e22c123d3404c7d31e8427f16bb6773c09d511544a9e6e90de15395ecafd027a7c12f9324971a5c8f99deb260004942950c8f441292e6d57124fe9d311b00650a816085b5272ce85497889899fe35bd0269a8f81b5f5a58b4638ac0a0bc3c5e987bc0e8be7ee0298a2c1ce0b7a3af960a8f831cf4192fae7470a53517a636787b4c45d81e5c04e29ca9ac031b2f1a63b7c7a3d22feb114679ef441d46bcbf906efb8fc4b33df68958868fef1c828dd64da2bdceabac5e4c0a7fe3c1897d2b72b074dd1ac2e8802a4d321a474276327c4cc02a0a1c709eb1a2d768b15fa3924ec5511b2b2efd06204c7e74b5e335389ef1146028e7d4799b16ef1c7e0cf1acb0519885dc7fc3d2a9c34235a18d5c22e1cd0f5f124810d7b1a5b7968e19bc14c422d6828eb2280a3d20de2cd6b9a5954a98dd268c7f624b20bb4a0f2d7f4378026c4c5f09d8262ecf184282a89836ddaca1605e9c5c7e9b2a2464de2f01ae6467ed088b5a77630a5bc36aa30b9495aa9a45af13e4d70c242278995ba59728a846eb3517cf8709eb0c5f082e007181ce3023290298b8c31dc75760796d3c3c6352e34ad4d0d4a9bd06add15aeb1cc1d050d3c28fced3808f1746a8ddf57ef64bd2a7cf47dc1034c5af05fc8589e3ea3a53064527de354170623cc8a25e50b2875c7ee08ddec50655393d6046ebb2e9cfa5551cc0421fda8fc11e1378ebeae28e39f53b86bf3439c4c69f1bf6b1bd77590f2fe915c900aceafc4e177c2c51d103ece852aa05f8023c211b242f7f575311291384648a79e2ff80bc630c9b3da6cc0b716f04145bea9406422a8b8058f91fed0e680e308250f4c13d79047675f031a530724c999516e6e887904341353af413a4f7aae7f4c6c8ec8c59ac5ef227368f663dfa4f938bf3fa58d3a59dfd626958f160fc6cf098a80712536e3db70254e63cd46f100c1cb44cf64e81f2935913aa87f4340e234535b1d0cda23ec008e68bf1d5981c96133f3885dbef64a69083f6611a686ed20da7ce9f9a100f1ec925021a8ac569876486113ea0064c60443c24a77d08fcd2097425410ac99f0e5881b6da292b8767e5396dcefa2cb1ad6502ea3af407c76d8521618b0039ca842b2836a0b1ad6033a81d3390757a1da34cdea03f9ae71052a4f301db0af967e289d79099b410af4448096b5aad58af48e736b67c321847760669ecaa4839a28217b2e00875ccedec490207f1b63ed8ed99ae0aaad9e4ac727a4f1d7da471cb6a5b194587ca25803b6358fe2d5520ce961aeecb4855f3becebe04ba121047da6d8e728993fa566fb870bcbcf0c149270c1ad6431bf569d31414a45c6d3baaa4f4da248329b4cb53dd885ed51dfe674a8fa316e3073ebbd22a3b8f4b0003cc3e3d2dd9bce1d17df3c17c812452d9ea412149d7f01db8395c5eb952b0624af1cc145f206b761ffcd312adb4dc3f767202fb0edb414b4f2fa04bcb72136ccdfbcbb91ab7ac39442717049309b3d6d6a2c0c1e9842f22892b1af2884c4848cb46111965c61110ae246e0762c06730b0ef04f9edeb30a9f64e082f76a4b14fbe3fbc87327a2eccc49444fd23964659a314e500ee08a23924d53087bd390424230093652251d7702503c1e6cc61554a168c39c3833d5ff7e9527ae6ef73a07108eaef325c35cb680927783e396cbacac6940192b93a0e3ec2fc4d63cf8163f49346a2d092f64ef9ce4a75a2c06f1c0aa933cfb46da64036acd92029d10e05a19a0f406eae8c4d176b613ffff071df56646223357257b90ac16ff051ea700fc66b5ced6619bd73c1b1fca9f4c700fc04788f3f5b805b3bf8ff6e0dad63c61044523374f0b44f247fa411095892dfe8b6d1af6325e7c4173a8e8ac86ed947783f8fb54df503a6bae6d3a5deb74fb408747aaa52e01b07b739f147c264993b97e44f6c59e1dc466c9a7cdd4a9b560dcb84698e19fc1a3420f078c4b1204e3463e7906edc2a41c5aeed839ccafb4fb98434684482f8374e6a76f9e92adb7b65ec52e02b382edf96dc0c46ec97258c5a3417210a37f9c48dabd2dc1b313f00c65f8c8f6bbaa1dc17f79ef28714e726a1a3c855c8c3d2fa87f3b73ce4b39bcc138bcea9177a98a7c8bf9a753fe4d14e52bb7cd872b6aa6f910e91075632e77485249fce0e56393fc19dd2f6a6541953b3e6a34d1e00c413a99a9e224fee0da6c3a014d36722f15f666395b8267f4192eb20e15d6431a2f245438fa5b548718f4a685c90c2b00bd737ad562c7f2559ed27259559a56be59bba61d5a68a00dc57a0fe93b6d26bba24c796b0dd422e8d528f2287065644e7eecbbbeb40b5ae4049a005943121a7124ae37026a08eafc11881417daae480f538d5bce51aef037c361bfac653c62b6274aa78656261880d6d3c6cc76ab5fc2561d268752b1b162500c7fc1b58ecc824c28ea9943a5aa0f3a324752ea9d11ce8b62a8e3e2b46cb6f7153cbe3356fce1a4860317102d315b0ee69f5798c694ff4a3c08266eb44244fe6b9f956b57bb47364eba976415112254b084ad24f7c15709357c35bb052d3d28ff231b79dee77f41c5cd02fdbbe6f5635b2c92497a57483268ab7c6fd9ff9e46da8a3e2f01569d9d6377ce2437b01a0ad61928432245fb5471407fbe9c72b9ba6744b4a2f205278335f39d3b06897d710d5fc5570fde0c50e3d81ba530648492054eaa9106665576469210b956187655546ef9c96088930c074a619f109fbee26663e39916d04a08c44684f68f23e8d2adeeb810a7a4406c668d5cc02207ba6cf853d792132f025e7e0b962c592b90bad91e2c03ec0a703373f534c6060c7702dc569fb5486f8c93d499aeae5d5b139899319b28b689f4e002ad7a197c70552d6162e09829aec9c23d63e54d1c46162ca542d5acd671c6c43a8d36f27ca6625b65d24774bb598722ee9e9730ebbe446ea9419422c4eae17e4412397f184c922fc1591bcaf0731ac29177b44dd1b8d805dd5061363d35a24693c71af798da75887e23dfbd7e5f66116089b92f2c21665eb26c6a072a3c3923c6fd873692cca612013bbdd9f568d168c441d645e21391f765c4145303b14764801b71b56a993183423b4f2c3ad308521fb9a5e510431e8df5e0990bf25171dc95cf08dcc8ece1c5e268aedf92c76562e847bf994ec6e3952d052d82445d5036cdd2a9c9e8a4ef5c55d79ed759a1aa4d5d8fe6297c8d91d6d85d899c0c8cacdaf19f2ae1ad8b2c40d4cb89903f249e792d25ac54126dedc8b08237eaae067f381442eba1af18b27f125dd8b44682ca8f604cda13d830fffbc203dda5dae0158b8afb94e15cefbef32c1db52a4e07657914995491ac3bff1151ebfc81e162f1f6765f047e31ab866bc060882ed7a07f263e6aba08c86ab09036775e5df9882dbe3b771eb93756b6fc8e0c70a85fee556ea63dfcd7df260834780ae3747f6c358ed097ca2b50f320fa686a46419c296a2e0c68d9d800858e2a822c283b7c55ee7d78ace683666ae6651f5269a27b11c494a040e7db027c7e12179c86355dea436e25ae475c4e3f4d5789e7006ce084668511f1fb74af68e1aab6afb6a8f00d70eccad0ac494b53775bdba1cd2e2a323234f37f82278c21b0893c993ce1248b6ec99979431558155986e0ae828f26f4784a6868d4fd32d1a10ca30f779e2c2d73f9a82de54752696f99b3363788f3bbc9d9e679f293cb03a0369011d1ad101a75a9810f76465225b81ce584712873f81a74faa91415919e4b5299fd51a87c9014e5ec7ecea8dc164522bedccb6d5513e1d518f6ec2017183d8834b22e308b10d29d67fe41f4a0619a759c654d4bf23642fb2de11b33e6d782dac356a49b0c6b057eca70a12884fa851913dbc29b5905c5d27e34c41b42014a3fe9c201240e8e249fb56f80cdd23ceb63b5a1aa69cca15b3a44620731b926a717d1355c84724378832b93c687a9614275a2ed0290de6901317a0164f9d60b934c2b80ad871f315cefd954066b73f0fec33b4ded139788f4a3c7f07cde01aa7a44542c7ded8b12d98bb5714719a186d1431ba07a2ed4da1777f784f193c57e087e12c480739f8f4274b5d6c29a6cf9f5063ea69550b741c3bf71082ca7b7b43a77a82e4b552e3808680835ed8c5e909b4abd9a18d9cdb79bc74c566f49ff6f4d206679ee1d43b8547f5cdc3fa266c4c341bca265857b1929a1ad99b75688926cc8658f5ae6bd0d103605244ba67aff3c8189840281ed3622d14c6bcc418d44942f25ba8b2e744779b28625148e1d1e7ee6c3040277f65194ed41b9a5de05bb0de663a3332863ca96ebc2fa6eaeb776114a2eeee86cc50a242fc0840c87564d92b10a96036fd48497ca0ed2b29b0a19eea2bff6c324c03f5f7dd7405f935c654d5d8c094e5ac757ab9ab850ce2e33ab5cb8ba9bfd59427f3a00ce67e7894ccccaa6621480b763ad29cae2a2423026e548e93077d51767ec716a935b580e5dc1485c5567024346c9fe7942a7b9339925b5b6dec6cd784c41a82cf921cb58c7a8cfa1e33108f20fb5eee47db41e90c14cbdbc0f6f9f01617b8b65f31669a92d047d1a68861096c2c3de95cce055971f7f33c4208c953ff9cc56fce5ac32628f8bc06c660ac3bc129e7e138865c0f17a3165697d8cc0594a3606f65022037fbcd3fef494e63dcdfd4049673d5f056ba02a323439efa343103e70ef7a1e1d6d80ea2544e6b06201efeb631cdaf9616b25be1d868d86293725fd29b9cc8cc7fc1a56d29af3b52ee129a7cd2ec3ccab9fa1c2582a3a4f77ad9c47e782729856fda4ea24ecc51440377222218875201c85acfbca75bd259af9ccebacf3ed51014758d29f8a306a098304ac528a43a90544ff396bfc8f4d3c3b8d52487887631900c269dd86496974f33c84d2cbbe23ee358b906232035933108303ed9ee5b8a48a5b76d0450f4631d6fcda3ee994cb5f757cb809381018954ad118b4bd8d44f647c9d29d453981f7bcb6d6d06d08adc163e82ebe9a75c239d5cb29463bbfa3a3b1491049e03bb0f97c6066e025678af232bdd3f46c7814e6b22be1e62380351d63f395f5dac4b789513c075e0bb6bda20a855505c323807e03b849ec5ab48e9690244d3cf7bf79915eb3dfd65c97fb1d623fb9bfc3e59a14d30c435cce00fcdce8517f6896f3fc66d68aedad7b3c0e81173eb8c5f4505d51c6dda72700dd4962e1c71502396f8384159ac4838d857f77ddd5254ae5c40034272bea5c11cf2261b50c99c5467a71f024d86591d47fe08b0a9a2ebdf413c4610b6bb652c8eff5331c004943dd2212656bb2127ef1306f28b1bfd92ca17f69cb1f39b124632d0cc708556674bd2127af2633f8e377c2e9364d4de0a2e9cbbc21d52c2101b22513bbcda5f04c3cdd17497be586c65c27108b0caa7400b370dfa13b87ca9733491967000914c7b21e2767dd2e57691065e4717ad9bcb80e1dc13e78fd03cc2b82e17fa50f9816b32b1c03afa737633d95348a27671de4686369303d12a44998f168986d4a51935c7342e2f06d4741dce067f4a6942fc6511bc4c927453214344beb4f24e4282fb231b40a45600a32f67ec9478c3223d9b45041f998302838d91f87c8463029a140be38ecd024548b41ccc4eef0914a7349a11943518fc71d85ee4293f8497114aaeda982922eca5a4fc904f40c74f5f68951a06537373774cb907e0618f6fa21ad7aca2b7a5b5ca77fc37da56e68a9b9a5e04ea66739c4361031705c9f79f5048c836b803412c50a5cff696ef324b41dcd9cfa1e1079a09edadbe1f2b5fa3b22d6f74943473c250686c1a6f4ca970b9401614494443b4112fa6a88256d42e53ad1addd3bfb70b808fc062eeaaac22fd3f07d68dafd329e6c9ab876226a10ffa78f1e8a89ad546b84162ea172faff5e0607d4addfd943cb38a00b695761a8c9534916f10430d158555eccccc05fcb02289f32f36040e7dd13699d95520bdb9d356661b3db0c363deab0bac017441f3ab010215bda966b3cd0db158b75df585de6fa6b0d1d62953262b60923d66744ab6dda12210434fde85c4a16df99e5d22064d1b16140874e67474cd22256a17ea4743b7007965b86893d2060213f5dd231f77eaf7f97143bd335baa05b14d04a354f17d334411c823a4a461ab9dd979d6630b8ef4ce32eacb88e585c51dbd2d3e623022b0755103c0a27042ce24a18b64c847664bc15fab1467262d7f82da92a63fd60f52e3e978dd58ce4072a5dd2da636edeb67aa6648728e0e40fb6306783cde4377b37d354ed4cd692315ea159ffe7c9d1ebf803c64469e6d2da100463e094571eda2e33813572f7fe8404891e6c0dace225e4d7fce36549a71237fc1b0361a992be2603006eb721c7b2a74fb32c5138ca83c9a29f6005b8477dd3c5e35139a3afd2384d01b1201c2d0cf6bd07ee4849c84c6c4050f947798758f115ea5ccf62b10274cdb5f01e55e2fd004e79f36aac8f102a612c744529b9171b0b4c330c3b1d07c3198112d178086375961be363d82ae3d41ac9c5b6c3574bab1b7154fe18c39cd0d3a4c31c468eae45f24a13652f8bc66192d9cc078dab9e017acd8e6743344c936a2bf172da47ff99c63ec4779455d6a7f551be6d84d4d7287df3f365ce2d7171e354e1f4facce89b272f693951394003be555eb83a8badfdf7684ee0b7f647bba157a89116b42292c391959460d32c858de06a94de3dfe180d6d7716dc7db3456fa889682333c758cb364c4888dca54e4705ad8128c43254bb7457af7c4117a6b69de626a83b0d735435485f018cbf8ec547ca9792aa86e6f6c9261587a419dccf908a1f3de6a664b338308c580cc1cce58a3fcdb068dc4bcd822a8fb294240f30a3e17b176b3aaa5309094545194a30bdbacabcd7f34e1ebb27fd54a58e8c561c9dd0f54d25823c81516321eb4b2c4dc2a3e72fdab4ed49f6d170a7eb805be699fc40f8dd638ee254bfa358ae105ffb0f5a344a67fedcbe4b3d7e8273547c99f4ca255b0f75bbc6749137e97e250e94938fe812d21541d7923bc99e9931111269b43a61b531a0157beeb6b5a610e7427d4d2010e35a0f0886f12d8897042f68bde487d3f82f006086e569b033ce7c7c0869b07f44cf34da36686e393c16f02ca58ebb814dc5369702584af2e47641fcd20ac2cfa81c1da3c44df0e2462f68d9b3d88cfadad330e75dc2a5e67a3b200d4bf9cb6d40b125368106a9b273c12302c9a2eea39abb8da85603eb9614d933b814882341b21263ce2c14712256a9c88a2136d48d42a886c6f95ad4ce2b769e8e296f0ba9a8dc69e5cf9b158bb04eae415ba4379f53d960886eaf4fbca618c327fd740e02d9078c20f1667f88912aecf5dc26718fa4276802f128b8c0a812bb22368be9463d1702b689fe46fa33582104c32ce792a1d7c7027c72e89adc68f6e79613588c5b21de3ec3890652e76bd1195339d17fd2c7f55931ca6d6f4cf36a6da12732766413f343b825b7eaebbe7e944e166752c5642cd731e5c765622954df9086139440efbc14a1c1a4ca5b6a8074949eaeb9921c14d8a3e66a424fbd8ae7d5641567970097e941bc6fb52c854fd3043ab3f137bce27694d34e3725c8f2f3d28656b62e68aae35f838e4262f48bdaccc5602a9f408742722e8962d1a60c432cccbeaaf9b28d422e93f159331ce47b4d3a48ccce3f50e7003ef9404a999e52c0b8837c0246d01744b85b47eb4bacf532a2eb68f6e333d4146d3e2135519c354e44a115b941eaa57322f5495e626b3494e53bd7bca43de753f4959fa7caa20716536c44eb4c1dbdb76517df03d457f347a5bd0b2d3dd1f1338a254da1477dda7dab4a67689ad181e4fdb51d843ca2a42880d4aa3eeaf48f90ce6d8e8182915f035a26908bb561508aece85f182d1abd584bb13c858af8c1c32fa14dd0d4fee7a5a8703ddfd7a672b95651aa70134d623338fccdbd3f51a5eb6f764991128191c90746524f7eeb56f1d695453026e20e2c60b2c8bf7f0b11bd8b42309d131267ecc7a975f55d9ec430dc721510a38cbb2a00b94a3af705c097f26e7c4304c70dbdbb8b9087b6259427ae47b1fb205c4e3e4932e9bdb9a3dbad2617646a82ba8af39a3a184206d1cd88833eb9ef4ee34a68f2edaf6782511e017638c32187faf93492e7b6e01b3063e70c3e1f50de7c8bba0f6a15ce904431b080968f69e10c5e9315738ae030a7e974303b99787d1863fea97c732373ca51b4b1c36fc5503403a5f5e5542a2342e097fe7fd8fced48b2b8402798ee2b48001ccbda8bcebaad5585669aed4b498e6a6490da28bddaaded2b588294c30e5d27874d6959c1f6813f2abbed091ac1812a9c78e40eb5178692155b5c08a149133c4d03ea48fe74592054ba4a070d9fea5354d55a7d86fa9d6e743ec04eecca6b062288e01bdd6810363e1d75ada643f41258c7eb45bfe3cb01c0404c003010683a4a34b68b4bf5d1ee61258feab8b578df351da9497513b17b6fb2e5de52a624536b0716071b0749add3dddd110acfa46e0fe7184e6932f56cead837da4b688c68bb8202c11584134dcb05e5e582e27a7224b53961547a0e67da43bae585601fee0c08a2093c84d06f14bfae2753bea9d4302625c526bc3f06c5b0c0203f41e2392a81b16d8ef48db121e4e0a85a9575a9e1aa480927994828520a6da9d4353869dfe6c067c33a5c2bf5b831320b1ef6effe662f44be83a12ae73d0c4b4adf6521f15b763f7271ec8e6efa42e437281d5c1c3c74b6670251a7bd974975836f300477ec4e3bcd96caf4eddc764776a279b40959cf7c81e8a3a209d13f6d77a2f4dda5339b3ba767eceb65fe9bed66ce9bb1532f4883363822d435b239c71851bf35c71ae5ddc92437b1df320edb28976d1a47fb3714a76d1b87e2b8ad53a17d511acd36e24081bbb34e5b67ae87285f94371de5024acbbc497ba4dcd6d14137333333373703b1ad6743536d6a646c8c7bce293d7f8dc6f88573ce89c9754cdafcb099dc2d846577638c2da758a5c531250d176ce6fcf53c30e9eab0dbece27840c639b1c9c36a972636a5e61a1960b08c0193c4874e050c13e90273e4a5fc40a2d6d1362d5f5e28d717a7a226077fbe34e580365c505e5ebe500c0b15642193831aa8503a9ad23118c0045ab69812250b235e3674cb0693368694524aed88173b78a9491db8ca0d5fe4804d97920c99745111f3f4d745e50b174694846e20a34910cabc645006004a5a4a29a9bc94524a69e5d3240e3d4cf1e249b3416af306894d8d0a10369a5f972b063f7f5d2e25ad0bab088c295e8cd1c310af222440c96a5555ee39a08d9803dad8c088a9a16abfae265e966affba9a68f1a1c750e7afab49175410ae26574c9903da20a189d24bb751491a9ad480f31cd5d1734a3ef415b6c4084f95254934f460c316621081daa870401e569c9452caf052d6b061c50f4c689aa66935316c112386a120235f14b1650745ba68eac264acc061c98a18603307b461238a2c2a1a5168f995e728f124fcbaa230fad0579226a5bcdc5005cc114ab872184201948c39aa81115b8c94896285100650c69532420082176348312508043022a524619d681882a18099a4605b2f4518020c92e081d11141f0e2a9c8c88ad017a22fa880c1cd8e2b4e961842073165e80084295e34b1610865305164a90b4bfe00a7071b18c5e084183192680289c53e78f6aa62e7294c32d87278c2889452da38e1c18992976ec37f5d4d86f0a85f57133278a09152cf8641579827ee4bad62b8a81b0e5c61a8708549728599011357981d362aae30457eb0e150bb2e3620d411ac4025551abfae2d9eb052bb5fd71646bc742501866b8b27dfbfae2d9c7c589d896d73c2ac6aa9fdaba5ceaaa5c6aaa572d5522507eec71cda258d25e2fb53233bfc8c30a8cef30b7dba1e36ba1fd04bf51f7a423bee82c4a6c141edfe429f6730fb328120026f7cc8cd6bf74c47513aa5a3b676944b6fba07846699461980494fc1943cb2d9d90119470f77a763b3654b1878cc8a8cbaae208e3e540551f42155e1809aefa3bc62d41332e2c3d23ee9439485fa683e73cd1bf2615147794246288bfa900f4bf36dc8bb6ca79e0ca2fa19c4900a07b491bd09528f791624fbf9b95079f0fb39b9994e64955829684f8194ae812e53867d7abcd9cf87f4f9616059f2eb06635b1e6e1ed92c7f85c4e71e5ba6cc6f7c666620ee1181df8f088e9a6ff7605e7be6f1c0bcb5cec1ed39d13eb9e190c77c9dba00c48f7d2ff4afd7bce491cd3262182624be740cc3b0e901f13b91fdf94c525f755d4c9edec5e4e8d9f75fbb02b7582e26452e26442ea3a79bccfb26fb5460f537e4c3ab06a5b31afb1d52b1da31efdfa1aa42f6fbbdd09a017e3f272968cfc1b2cb94e1cdc11a8800abbf6d9d65703b8b2b4ae69b966d5176fb349a124c1d0d0518b7ad20b52fee0973051be0becd37b00e0022d420fb447dc57c102b88c5d23f21cdabd0e6db3a28000ca106d9a707eac77c837eaa10b4a124d6f560c063edb38bf202633dbb5b7633f47b81833a93738a9b385d2e31b7c7a5255298b999dbb7ae80d89a48f4028985f9742391158503994fff6e12f0621149c08b456996aa776b1ffee05c4b983cf8eb02828c0b08307e5d5c20d9f975fd8083af8b23fe2aa9880829784862cb1856fb0fee235724755d3f5cf1d297a328d9b67ba260eefb2bc813a45c21b65aad16fde2ea48898267fa1d454e29bd28b39b52ca0d0c4509e2f32e801fc4a29a07896584a81b8912c4e7815a015e18a403634d6f5f7a21c330bb1e353f2dd0df8e75d78e512fca0b9c75379d33d9f702ffc4b04f622d7fd8a86f95a49f4c397313e2174aa6df2ed85980889c3c5830bd99aa1c7d7bd077a723e8dbfb0bf99b66bed18c7a8645efae02f38b3650d99679640cd265c8b43e4897291377674ef656ebb32f2e3857f002f390add6c74f08e640f48500d59f1ed784c91ebfbd5dca17300ecb3cfb82f407619197baa42b495c92b4480a53830fda0e8c6ca81edbb58485942fa80ccbb439bb286a9da54d029151abd5720125fab592840c11c526866118a6b95a4a1ec360b0648474583246107ef032e6b130ec544488c716104674f9f003158a4d8c5e216a9da523f40f0d4fdec41619142d2886a02082a2687a966559e6c36755556d6ac5b0225602927972949c9ee5d10d9670f9d0b30c9bd273401b4252a86855559b5a2546b76aa3fdba948e7c587d32d1aa3ce84147460d6dba57d7eac6e8c690cd5f74b126482675fa9c52dbb32a757ee13649e92c6677a4cbf6a49192ca2eb32cc3329ad18c6659967db2481acd5c514359248bba47b2e40d27e5d14b8c683ed96088b2fe45faa2e2c451c54c5b54887e3ddca5c89dc3addba876b9653f81e5e71756f0b7f2c78a1dbbd90929d81727a0d0ac8b7339d1456c8ebd2f06236fef6eef723bf3e4c99399f9db8edbbbeb13a6ae2351d7afa87c54d7bb1eea0d8d0ea66e4e0c8113ad8f31726143816dd9294cebd9b50328cf1f10ff09540fa4fae842949416474c61a9ebdbeca2464f5da9de6da0bf1b7679b302911bd6fc6ef8f3c10a6205b1b28f2936f1935214d31a22523a424a526252b50e7f345c28b5640f58f7c365ec0e7bd864ac095cc473f7d2a825a6546575d8b9a908cc0766d43afc335e6a288ddc08fc10337237525569443f7ebd3e266a7b8811f19cc14165f6e8430d31277e550619fb22199b81165f31f29ccc2846318ab9f9a35a9dc1a2fa1711e3671775fb38df3c88d579102bfaaa5bed4ef4f88a4fdc8ad1e8082949e9233b7d64311f5ffc34f4b12895a5ce5c5143fa9b97a2a26edf0df71131a18b95166bf32056108b3df6e6754054160aa926ab150a1f35d4a6793ab647f95639c286df4ec7f637d3d997698a57398391e7874393e555c489ef2ffacc0d2af37480f4e992729579b45903893ae75785500f0243eb51ae494f08507dd9fdccd9edc83c1396c11a4b35945f51ccf560db9c1b3e37506072f4b17932cfc993b9e5469b366ddacdcd5e7f91c90785cc9829495390a2d1bcb29286070d5c7e997890f2f30b57ef62a20926a4f4512da3ae6b09321f765112a22e629e752d91e4a3b792d8470d6506358c46dd03763e542140f59b8718ac09d143b009264d289932254ac1d8c3302ccb7444dad15a77c13082dde9e074b4f41c3cdb658d2eb5bfe9399abd7dcc67f743bf9b1ed3d9d9e7c731e8dde998cef3c3e12fa757333ac068780c91e97aa899cf80a972d63067c7d7f3367d8381e8dbd90be3ab8b76277aa7a486d1a8a8a57934ba40b3b46f570cf6f723be4a18e26d343c8e2861d0d5c4ebc368f4b18b22528cae269844291fbd8b28f6eacca9cf30e89ffeb0671ee605f13228fb03c2e086ab8fad84c155f7c41f5627ba104b7c5c4526a336ea19a71a067dec78a8db4836483057220953a2a8462a2941c50c91126350aee2c4cf9ad8dbbb5b81bfd609877cd77c0c22808f2b10f31d0e41fa1f59d326e697b65a343c507bfced7aa8bebf2f768c9bbd88588adb2a94f04102c060c660ce8f8f22a93265ca1481654394d44d1caa33283787411aa2229ca26fd7433e7dba5833ed0ee6ce60671485cc4e0d683e3f164cd7be1c7c036c1de972be740921f4d2e3d06cadeb28cc4b9f709d7ebf0871530e124988264f33cc73304f9803fa609ef0060acc13810f77e9a5d03fe0439c0f7d5e625efbf4d83d07bc8123dda8064bf4ee67e348ab2cf7761329c9cc719275e456a95c655c62b72ccbb2e99d61986318867d2186c5cc0b390c5b220aca5833229e7cb76f29246a749b248a7c1be0db51dd4f53e6498199190521869620a1450ea434c1457806330d4b9e9999190928df2e291257bedd86072d2e295ed4f876dafd34187568015143123dd021072dc39125d911413cbb9623c6f83c3bb6557434e820ca98c508323a443cbbac5cf70c56bea5777777b7cb08a26767d4d014323830b2238e304d31e254e50609e46094650709103db990b840228116bc6c543892064c5413a38db8a8210c09450d4d6c488cc678150d946c5438ae20c478f9eb4a020ca7a6a1295953cea6458dddfb448479427008838b433abbcef6ece0063c7b7966a32a7f7fa46077d877748f0aa20e3be7e0a586e78e32f01852326477587e405a6090999999a5f8528deafcf93173a5621e356fe721e612b2136b3197a616bc2cec8b5f0b3df400db433f46f229f9f610c767ede102bebd1ad57e21f2431efafe6961775a4c0c26d30ea9c4201383d3677373734f2f1229112d2561b0bd88884125a5b8d4c2163b4ac4adb43b2d250989c154911a4622249ec66ca881176098660ba78cd41d2d84477dcce5e723f3b8c4dd4ee3458d4c0cb6cb2f2a31d81ef250546ad7b6272ea5ffe57700b2b71e984708ca39a76ec45951fa4b87f9a4efbce6bcb82644df3c57f52d3a207e2fd0afdc03287ee63f3a4dd3344d437d1a55c50ee2ee1c6c9b6382b9ed4ebbb626344bf909910e445fdb9dfe613781f702bf34417c1eb2d5d2166c6f9f3dfa650cd22f3fba3b7dc363bef4f93fbf190b5711423af6a56f0e33f8c3607bbbb4c1b6399a5cb994524620361ad4c80282b5ecee55eafe646b4ed6267da338d29756a9a1bf6b58d4964d3de594435aa77d2275ad1ac62f4dbb63440d572947d434a21ac6a6a421dd13370e3d1119a20de15239259a6153d20c9b72ca293328358c4d2fc43d7129065d180113850f2d3247599a06d5abd56ad160448c6eae6a38786e6a3d3b3539dd7c53195a54a1e5390bd79627af7ad6b2e4d987468d235962b65268f1edd85661636487387db230f976496f08e207658cc4f8608cab8d2c938f0f668ebfda37b05cf976aeb3ecf0ddbe452a9aa5c148ea091554ba5cd1210057a4d800cb0ddb2bd5d0c8b104adfd5595332d5176d560c9f36b8a17fc17cfee39ccb3cf5314e19977c6a015a50492ac889206450ed811e58264fec4c0947de941166152104106fd33c3d364dac14818362a19907e6448629dfd9056a61e92fc083119f1829f22435e9c6c543834609aa9e1862447434009338413ae21aef8d07f552486dff670b56a5ef1184a9243ed7ab41766ca20f3159cb10f611e21eed92cbeb0af40f4fc92a2685d521409e0c3659191595720ba00665c01c960e661fcec8b99f496b2c3989c988872d0b1c3a44fcf85b91d8fe8f443e1e7e4326cb2185e7289ed62125b892373a48d94986c0ecb322c6e1832d32486a293fac47c17fb309b4afb892dd5458d55c69591e59c2d838d8dcde2e0b7e13caaa2474f79a90b4edfe9b139599b2e387f027d63b18b907229875df2527b7ab7d7d4baa02eb8db1cb5a0bdbb91599873c608343f7adcdde5311bbba02e09a9dd9aaaadd3d505b55d82deac9648e49c3e59a0fe32cbbe70cea640b3bb2511765725bb720c52398bb86ec3d2f9b679646ddd9639d76d996318e5b62c433986722b4f508a4279e8b35a9f2aaf658e510cc3be0582c61912b193ce3f925be89ecdd781740fe7280f7d2adb705f88f35d7316874639c039ea83e146039185f2c8427d431c8bf321c91242b911ca8aab00ea9b1759dcad2059dc67a4488a85726651cc23eadb5500e5aff29a5b79e231aff29917997dbac7c767b502417795aab7cad3202a8fade4b81d67a59c0db11181210abb9434547d644a575d597e41c60d5a2c9641518bd545557da4dfc473290aa21ffae840b1b5a552f0a464e6f639e7ccbc54179a9939f3ad665f08e43117da65e6409e7b4a6f7a0331183f20f9d837040852bde9c1ee57aaf75b4568ccb7db50c30502c43c4388ac28ad2a953b08ae56ab21622aed1ea0d7ab22098178d917cd13e62fac7163e2a6ed18d536c9c9c53cce40a5437612f96e23b6df95524a29a56c669eec5106e59c524a3228215c495b2af6eb721df161e5a6700d31e5ba9e44179118b1a394c2c767716464ec4ef45893626f652f1b1df8e4e81ddbb462f6b54fb115877ca2513c8a483149a9c949aa16a1d2b8cfc7cee3e298711acfc1130a1a9fb129f9ac4f3bdbd0f090fefa0ca7e1d978ebb3ab5f5f9d755943e3eba57c464dcd07843d8d73a783c669bc983d3118535ef6f20c1083ba23049aef64c859ecebd1516008f0ba1b206e06b8598f344dece1b04e9c410d9969780c85f1ecc53cdd27c730189d260772bada31f96d5bcbe9a9e9c52446e94b4b6988a9c849c999767d3c2f744a6bdd2dae8705e9a74104d0a930bf50f3cdb7efc6515e90761d8d01614f3f27fb65af6c0cebc4f8345464af3fb2c4a7fbcd9ae24421c9476f01887b56cb97149044a1f80589c96f4d607c949dbd9827b4c9c6304fcff0f1667d7c80cc0cfd3a4b43e2b09aa2ede50f5555716ca4af16872dfa6fbbdb1b9d73301106dbc7af7e3273d0ef8f1511065bc7b639987dfafc825ef3ad8428342ba1881ac697538faf9e73cbba9f49998b502a3be5ba1f27db763f32eb32b0accd87a8dddcbe183bf6e8c525069b881aee13a651afc72742b19113917c0b7d5715e8abf985a0fc92be9d7d861009a232a97b139dbe0d83219591dbc1b639dbeefad649a9eb5a22b302f3b80fda9479e63e59e6e00acb321b996fbb9b7959c6be3b99774fb2ce5204121be1f889eed43ad3297f4fddddddfd45290caa544f4fdd138d589de973faf41a1045a4dd99461051a7d3117b189fe2537c7a8a43d1697a08fed1d4be2cf384448a7df16977a66b55d41947d490b21185b24d1b0cce39e7d640677526b83bd3a5b3f00304b135c6c70a4d54e560f77ca00b70b2b03bd3e3ffb26943355280f32637e79c4d89a8ddbe69393da7e654db77b80fe6f1b183418c8bda4e0106311fcc83b90f0631e76ed5a0df1ded8379760705ba1fce786c7cc59cc8ed689d88247671f322120631df4131251f9fd52a0441fa85eed917aa5418e639dcb32ccc55388eb94ff72ccbc663a1ca732d91798e796a6cd284b06d0e73390c4e27282f01cbc0b25011f5c59ce9bd4abf01e6992b28fd7420334c8e1418dcd9dbd3e70453bbf8e9d9e76377a63fa9ec2d198653aa42fac1a044428a48dd2382a49731306d33a04491483212750f0bab135d0c7d3d11818079a44b6741aba27ec15cdbe648a9f3ab23b51d7c62cfb2e4929897ee433aed171a7443b8969c5eba7743d430475b9aad91d33d393ad3e12f3fda1da5bcc160af186cffa14adf2f9f02f36c1460a07c3b0bddb3ace5f2ed2558a9eca14b2868ddf2dd735c21beada842a68b152bba40f104fc4ec08bceb0526ad2497bc71d32cfdc4c0244709a5966962c3166995966962c185df29931a3c6866d80e08dd5aaa6c686461c1ac18810b0905824162cdd58241689058b9c554a508212d01063cea6d9d441c042629158b07463915824162c5129525444c2e21131861149caee34143a183644a31fc684c4269629b1c0229689833a513e3366d4d8b00d10bcb15ad5d4d8d088382a159649022c134b1c01896d73426e6751c76db1a8757e9c44a2a3d6895c1546f3884c8d9e8323d23cda388dc89027a1562b22e9e210d77940ddccb62c73cbd2b5b062287dea54a81f91acac0eea05ade3417bf4d32feecee414971634d9b03db368ce17bc36a40d6947f4b538a6b3d4868aa6124a863eadd0542bcd8c59c43c9a43cc8d48514a44a200d28e19dc760f4645eb797474d469515155f8cc985163c33640f0c66a5553634323e2a85439ee364c44a5a144445a1d7624b6873e4df9795459a85cc4be8964c84a0db5a1210d09f74c28f36804f3a8765bd7714d349ed8babb6777cb962d656f9518bd65efea88d213ee5df10e713b1e59486597d270a0bcb954126473727163772867d9a1bcfba2721dcaeb8692d29f5948f7a339ed50de955119cb32546f43ceeabc2609f7749db775eced9930e8b34d725cc665bbbb7277e52ee79917fee0382f3eaaa6552354a3715e4d8b41a21a21d661a29a560d370ae5e940755f541fd46bca8bbfa166bcc63011b56bd570339add663463cc8c578d109fc09ea21fd6b46a5a3544ad67af51c23c9913d524611eced96b8a6ad634e335e3a579f2eb8c373db3e66d5f3d27a9548d66437fa3c1655f3d94173d8975950446692a2e7ef59c6c9eaa297af699ae26099fc0de753ff2ab212253c3cda8868809f3600ea5763a502fbb326ab819a980f3f2db8cc294d177b619a9105f3ac79bc669f1f726dbc5a66c8d6e1c2bce4ce61ef72500e0a9665a5e48e6389f7dbb3bedd1eb293faa65349898d154a6629a369f1aa58452437c42d7aaa9969612c2b0d41083a9d68c31668c81a130f619632c0ea3eec95c1a15b50ecf9b18b26c358dd28cc3bc88426998f4f5288739d9bc3d9a31e1138ef80476b26d5d336190a56c97de8fac293bca8c184cb5362223e6214ac23c982b49b516c74e89d9a8bad9df9e93cda927b332354cb5b8eec7c996d10d531cd7fda076b50e5bcc0f39443b0cb4976ab553c68475f8cb8c1864c751aa1b11a33477c23ceca3978551b1ae5517f5481ff6abbff07c7d7bfb1b51aab565a9d6971926a2fe885a1bd146d47198a7cd7098477f7a290ef3b29f9e879a584635d4363343002ed84af0cdc9e15c73f6341cd77ed850d636e7405f52fda67afb082e696a4c4d39a1720b24aff3ebd2c197df683890eea9b13aebebaa75badba97c34a5998a92a0a224acd7f0548dd5320dc3b039b12cfb280935bc1b2b06a5d3f0c21f287cf42dc16b23eacd322869eb484ff98cd32c49faa93cf3526050aadca609db2ca99541cc298318095e3dfe08de0d093e82d3f06df332d73c1ace79e12ab9c0cedecca2da2c3d331106a503910be4867a83411630df5cfa063ac03c9c97f972d69d6fdd77a3a3db3ce8352f94210b5a0ddf4ec78f0f39e8d9fbf1280f687e8d6f01395ee591e009f9a9de6304a73163e3d578a12a8b495e3aaddea6d8673c05de56ddb302eb4897f206f72c8be68baaa15e50c37d819f4f51c37dc524ae7d7128741d34fd72f9758121f3dbb66dd7835d73ce738181743f9b77ae79dce61df785ec2fc4e77cdd79d3985dd334cd993d2006e510c99cec7e2a0f15257d0811f6d88b490cb26b5e07c93ec33222e60983f8260342bf9fcca503310fe612937304a611c605060ca63a9d37e9ddddddbe5e9095eb3b1aacbd5d60d6581b60ae7d21a5fc852a30663456ea0df529a5d43cc99ced609ed960f7f0581df62a9ec180ddb32cb963771864f2f2f20b7d9e5bdd548b5086b2c1d6017576a70fb0009a2d4d50dcd0758ef36ef3056d70f754665ad2714b688c48d668183a5854ffbef285ab88491ec418b360669ad16c4ac6264b2925c693b9fb6129254bc9bccb2d999953cccbbc748b8dbd1bfbd9ffecb5528dce547a573567942ca594734ed93342d41871a87be577c6914f57831abd2586459459763d90858afc214a6e777168a836a4be9cc58734c2c8c4c4e013d54822416bad5425552a5ff9aca28f8c947b683333ab987906183c33333373f9f6eece810fdf517cbbab6cd0ec0c5c84581c3868f2ed5200b4c6911a02804502b468fa7600302961063016074eeca2051009f8ce828a6fbfe97eba7a42634ab041162d40e10634f8f61a95060d64bcf876a9ea7e9a32df8067985986309e9999892495470009dd4f6344d840079d6766661fa1fbe14e480b0dd0498c6fb7e97e5a55e48a9a053821e100a718be7d46f7d3aa2d90fca0ca1128925899c286eab4a4a68eba14b185a6fb61ec490d2916313c008b27545d7678769cea0898e28a1fb608f13a92a5069aa1279b9ae20a259e7d2648480a27a7262172e892c391118ae0b05ced6c704510339ebddaa8703c07b4b1bac1e5cab3733e1c704268074c18d1011153865243aedd14b0a58c2cacc86205971f10f0bcc5cab3a3ba1f5e059e3ea8c48d36653d0a11d10000008002c314000020100c08842291402c20cd4171fb0114800b779242765a381287d31c876118c518640c2180184000200688313544c441005698e0c6b33aa5cb3dc42b0d2e9319bf9412f582b028ae05add4b65f46f1dcd741ba7500912cfee1b48f2d60f5e83360c5e7cb9e68c169390e586549073e5f21dc83043ad8bd2ee6a5176725a5153c8d378dba9231fe284fe409715195308128a6cf96924b2be48fa9470c7a87915e34ea3ee4753d3eb0aed907bfa131d6537ad18b78d5a02b59e347c9048f105a9438fb9b528a09ef15642e82d1485620027a574a03063aaa87e6688d6a34e5a2602fc4b30c080f1ab0bf205e218a123203942223b1930a3aa1d8c44802264dce1e9e0d8a3d3b5c4297509f2ec43e1e2cb8732d0e324a898a877db6cd819fa4515a22ed37b3dafffc972937452bae41ae0a9d72c62ad0310ade9a29153dbf8a54faca692c2d8f5902b2d70a8de91ad2b29c5b43a977031b71dfd2b522f6a3343c4bc0d5e26b5825df4bbe68515a6715b4d581f307d1982e0af42718e02c5908d58ad6a10664499a293cf3ee3f56b1b2f4cc52381560c5922e9cfe07a60a54287e3deb07829e6d9d714fe723e9a297631cd787892b334e94e40696c1139597406a50b80b9cd47bc83a958480d073c51c862a2c4a45c97cd9e2706f4fc6d380f73a169b362523724eecc48a38a111f8588c4b4abe605cf6c24fd94eb3c130029fc50011b6734bf853935979254c8e4bfbf4fb345287e9b8a0711fcd7e8d7eb1219d81f00b0c1eaad288f409c56731489d680745329ead0553efb7cc72b52eaf06f65d4473b821c5ca9bf4afa23a839fb2320e35a91e2f354273dc833795954476a8cc24e5cc9c3541df169b6c9429cd93d5d6bf85ebe7f07ee4b3f5721d79c2b1b28a614073e5de1fce7316922f36e89b51dfda17880617a953d36351fc4211eef837fe54c560b33d0b78670e57e143bfe8b13dec949b1b53e9311610289059babf6536294d5d0d4c65af6694074561129612575e8fd8356479051859c963e785c1293e020b16c6f0b6a23455c0b9d08f886b123c230803d5cb1d51d7e926c0954dd47b81ad86ef383b5a2a86a0d326f03031870f10778fc20d0d880c9a5fd17ff4b1309388bc8b8c29f164b07865cf847f613b940d4c227752514648c4052bca7af36d5c9a3735d3aa1d8a664aed3f2da4e959c056855f0315fd5eeca1b5693d5bd02ae1d74237a35d5a0497e28f0eaebfca4eeab72d41fd1378fc9a683c0f243be1de9d7fc17f0e9793e64cd86322288149a552b98d34ed2b2441b9af7a9199cd39042e3b98932d37aaf004f7a3b4c7f57421dcb32ae6596ac84a6f83bce91768ac6ff98ed351a0616d9aed2d2027c1b37eeaee1a186a34ed04802b117bc8beeb6cf5d00306b344174299c3bac90cff12e5b7ea80616ac9412d91050e2a1626c8ca50fd254cf6344f03b072750d7350e5cc46a474739263243d17c7e64a556debbc9875ab8e79f265a4109f21711c2c23561175aa5dbe55204b60c22cc722d720308b9ddcf67162b1bbecda5e64ea354176dbd18a25358f76fde2c3af50957b4122014534d1a23a4b4df20b7e36155eaf337df7d99c5dd0900343a9e5631c668f26b2566fe67c4d630e646b3e3389158c768835c08f733d034c9d7c30d4c04a6d088f1820f2f5930f2853e3f8710f7ab23bb7da8713b60a7936454c8985a766dc4b67ac4c064a0c3307bee7528d31c2ad37117ef470b54ac4e4a4a29239d5b47a2e52132ca2d65755d4917700f6d038b6e9cdacc136ed7283bb15762c21944a2d0e6fd8d62582457d152eed950c51e319032fdbfc708a13d54f340ac87a0504e7575864390ea752cf5d9e0eef0cda79473ae70cc9199e9aa0ff1be854003f0efd3aeeab92baddd6d84b4cb7ebfb63e9a5d5a057456d3ea11900b3d6126420bcc1b1b233c49714584d7fc42a6835a3a17872cac20e0966972722d5bb57e0f5b6f7555cf28f5ba79b718819d9e075b3532b23796da420416e6925a49b9eb11868069439afa97fdb679943e071d8e3662a922b4292738181db779aeb4702276ef77f9387a3cf7843ca3595f472cb14703132c904a85d24c83e8daf41438685881f87c60661c54623e69b54c89f336e00205b93431a15337a2110d09e8d25f485d8040139837d1b975a87b76ecb64f291ebec039ba3d01da00cd3b06fd55fcdbaf8def5c41b7a5f31335b682a25cbb647d92022a6973a73d01fc5fe11a1faaaf6dbfc35c390561823225f4a884fd732782732ab29e45afdad647ab3b9479fca70cf21fe326a2e1222c9232558c2f60991f460a04d9906d369b2199698f09fc701c9d4744b379304192faa60d7c52c68b5e131f73a3ffee16ec7d18d1ec94fccd76ebf72abee30a64b5744a0d55b320f0bbfd4f3667f7fd85636e236f5bf9f4d02521399b41b6a2a54b9c670cca72410147e8fe90a8a9d7e89e7b43c4ded644a6e2e03415a54040d8283be5252a45127b0ef4fb7a95a4d2d38d1b03982711e4b510b97e22c238a68bbfd25d0a85153fad251bb7ba76b4b0c7b3377535066d5ebc612853c618367f3b28c1bfe26f334fd30d96feacd75a8266ca9fc1444269ee9565f10696eb9119c1fa4190cd72c3299f052189c9dff2f7735720c48992a173dff4cc3d77fa9fa2f20732f711b31d37108c3c4ce4434a9dac8c95dd4c26aa5ee905457f64882b300846be113412ee46b85205eddc8ba08976caabf703d3ce8290495c7541474772c2da76014756640c45face25631d16f1311334dac102a9c9561a799be91f80e244bec9bada064efa309a2ff208beb956bf2ec423a433acff14aa74efa22293ce3dad979504d031e5fe2a9ea84be1caeba4467cc67ff8641afa963fd097de19cf64d5480fe462ae9443334e42a4d08f73252833bbfb9da8afa2f2a6b86868e6d3c2dc65e0834b0d5b9a0d52450b6bedf28b0329ef9f1c36d085afdb03a33a3fb424a3630bda050fbaa942e7fc8601a3d1f24f85ebc000120db80887aa6cca2a3f5ddbee2aaec431f48ad26afb29351273f068dec1a80e153b8c80301dc2cd9a1f5ab92491ac6aebc7a459e68b8f91250be6e42df3a978830c0ed90871425f79a879ccea0b501634229cb21a985ae00f656db127d41fa291cac9423ef86d1da25004f4d632eb8c688b7398b492dca06cf0e65692c79636bd41b593dcafd80a52f20aad6ae69dae1c32db6f3c6f215d6d418e3d82c10c6f7176a47004078fbf8382d6691c8188eedaf7560eb2a97223477d02afe33e9da6969fce571ecebaf860256684368f4f236759bd91f755cafa1bfce1e633327a8533b624854cd55af1dcbe953ece624fba5de3168e6f0f10e36e13b380d3c77cca6e589c8a2f51ca0e6ea70148984fb637a4b1b7d66f065d7f139b5736ef53eab444f9dd7699b6b90ddc7aef141d7a5ad61c2663e68ba3f21ccf4c6443d59af9cccb2c69b4d0cf595910d9782d1ef2bd144e1f632ef606b4766eda86f768eb6f6b7e857548d6d9c48ec2851cb2cf09ea28e9bed262addf63c170dbbc0ac57241c31b72b36b2121f4ffb5c1a5d7ad6b2026837c731a77d72951bbd8ae0db776fcd5022b2557ed22b8112b4cc5631df0037f5eebd235b1efe56709d8f369eff715560e4b2a1ee7624b64cc1bbb9b487e523ada1ab2e4ef2c92e627631d32aa4af5dc46ea14227ee92902fc61470290f3bac6e0d4c25f74c523e86ef77cbe8fd0c28b1d64cb3fb4103ec1ca02b3e76e87fcdaf228cdead443823d89e6c9405c23fae75c0a3c7ef4ef10544c1cfd64a11a2f8c348b95c95bc49e929825c6979d33f10bfb627d9e6c1d47fd2197aaa53567c2e28efa9970683902b82bb31788ce830cf0ddefb38941edd5a57c1f04313b1e95e6074883c9292df6dd9b846fa962f4060d03095bddbe3fb1c7b18ef29930bedae2f0f956715fde037f0b9e2628dceec73e77569a8a1fbc6f20d75d6506ede4832e86754a95d6721165927901366cf35205b1b407d0a648a2e16a214183ea4ce2f5ad8bb1c33a8066eef3d2fa0e72e019a9e5f282c269cc1c4327a959c48dcb1512e8dc2d73cee99ad81d9cfc28c6884a76fc80458b5a5bfa8a3f50fcea49479baf5b4465ad6b48fa57b9fd3dab8169e28e4c42b24bbc7857096520e69348a6be8e984afd2d6cf7ab439ace9f77a8886262dc6fa5ba3f5532aa230c21e7ed83a3c91c2f7342eeb14c68782b6040fa6128690c005f5290e5aeed1a1427c423bccc2dcb3a8c8091c12babda9404b7c84904c9d15dd86201deb246a0f3abac6421545d839752c294c3f7cf2e7fb1fdb45bf34cee68bb136bc50c94f2e3c8019e8456d05e54b5722b51f52f75ce5e6994dcb98d4e996494ce5fcf3a98b87ccf696dc204ae1fffd5350818f71aacfc8b13792ea9fc568603ba0a6a7573c59a12a35630d8a1ebec439109d02d4b6863225461e53cda6ae8a3cef435b1018da31f4fc593d1bf30cc626d49b4493ac8f4e8049628001f044fe9ce26e3a8ade88bd5283c5357c00324bec0c3984d18f662ca8cf77380b931c55a0cc5cc975ae19e4dc7621c836ba72b3862f7435b46a301cf53dd22fc1204f773df9690b6418c10dfdbc202c4a73da8adadbe9c00b7cffd40bec32b4ad4e70fdcedcf159a9855603176174f9a788754cf7a90a217bb70e90c79407c32f121d3c380c39d34998bc9f75548ca2e23cad8f7fa64273a0d21c83ff4470d20384ab53e1b4e04c6bb596c95e8e3061863268519c952a67c55d0ffd4a776004dafe6d75b48be477eb11984820696655cda5d5b0a35fd4808230da14bfc67666aaf44de97192570004b243ed5c87943ef050711fd3269b7df390758167f90277c4a6925ed95b63d5e894f1042482c615a4b49b68a4779db233c6b5f4a1786b511cc91b21dfc8d506566a3045bedf7de0790ad31ce49ff8850f8fcd7719b04c890e3c832fad91eeaf16b304dc56a35fbb7da24c192aebdbb6854df704442530168dd836cda519556109c3205124e0a2566cbcc356b29b999f58d2f83d689ca80567fd675495e64142bfe500585ccd006f5f0b37a582736d1951f87fc97926c678504a3c120d82963e80956ac685b4ae3b9c16253700844efcf70492964a797905eddbadfed870a39490df2fb41b6c1aae7bc879726f765398f158b7893577efb9640554d35ef5d4d0d2c6697e18656c4f2972766a64ca39d8ea7f873de91a82bfdaad8f99821ab881aab4326c3aef86f948e9cc9f223c0e18d5a108d65cb311a3a261b5ea06a0ff2a2b2b8658b752ac5d96baa8235e1a07a673a79820eb353073624bb7da6a7227c213fb0c3da51f1d2015abf3ca600a367635ddb904ceed4369b87a65412f5f3c9f6cb6595931e01515d01fd749d6d48e03cb02178d30c6656717d86476b3c747b7ccdca7fb1a0f2cdd961653a1f9516fa54f4174429d9fd9b353466ef1413b5d8614618d392da881065cc120d2d6966af6291f6770ef2a243ec97c73694bfac19a014759c5b6dbbf45dc21bb5d1eec5f3b8746f53f9224412997ffbcbe3082e6fd023d8064a88dbb199464ba5eb33b2f60326772cdf104a5188a0b164a036f5f3fc8ab1e8d14019537cfa3fd5d3d420e1fb8aeabe8a123bb092f9bd1ca8462c2cd9b00b11ec1934093a74c094e4f86fa1795125d2ebd9570fb7196030963d1b91787d61084d8e486150ac8c6e724899464b50be22d664f541dfe983149fb450424e62beb2ef138ed5233d8b5987cde37203155482f5bd16c68c29204b3e33cf8748a97054bc0160be961233655b11b49edc3beb86115c81bb2e9802c1032769a76bc2eb9f736efcf8e212a0f2f8954142cf086e716506a5854d0c8627e312490bc27e9100929a47719091e2e0a279b876923e1e339fc2c3c7af0aa864d312431f643b9b5605ebc6344213c3b13d0bd5c336853503d7704356b5a5890f0381e372c180e86a2d5ac814a5ac19a50c9a23029b8fbd34ec80440c6ab4d8258b3c1c739202dddf8d585b29b187f6b4ce8910fafa5a6cd558b84145ec63d2c80eeb68d046442a2d93d35e844c23d5244d99d264ab2c6d80d7f8302ae16905ac5a93260d9c6b5521d130917adbcaa883c068f6e64dc0af7cbd89d2a762309eaa025c94baef6dc5bb5f2a490dc7e4b2919e412c930b08f613289350c4053e4582ea79d5b7d2e34086d670a982b1f0aaf97be0e126de8965c2c70500af628778cd37de65bc125532177c78886a4d3a533a66376380b2f4eed778b65e6bd009c6377f0972d2b86aea947b754c8ab3be5cdda6524d5df71dc28e2ba230c9b0284750e5806450eb782a58e86aba2da446dbb51807d2f4bdb89a41c2077b3349a0a949ae5fd5ed4464aba7ca855bef53f02810b8137ebbedbfd815873a0a75ff811cac5c46fcbc0e3a2bedb65d583eff5657525d0f636db4b435ec0d7906bac067075c3dd55c1de8b351a0a7b42b4ccc9897eeb56ccb724a5320228f0a1f25c7122a5317e85edf05ca6e6423f6a7c8674e4c78609cb35ad41d2957a22328e6af3332c06c935bc06498835d8218768f9414e1a6f743226dbef8e3d78fa58b930990b50dadf9852936c899853f75a52e75ebdb31224b765b986b8801e97607a13bba229086daa1b5fae264a16ac9f2e9f9bc25343b9b35ae3983c97f89a481821a3051a3170b53e8cf9249a9c1a0bbbd101da5cda591c033604204222395b6f294ab90a884aa274b814dd1c1ae48606c74804dc59ce885522295aaff4512d3084cf02c9f12e423656fb81efcdf52c55416797a705d2f1b1e370e142073303e509764e95f35477d499d56b40dc59fba9d2471812a2e2931d3d39255f83d7c27529938b7c35de342006600514af6bda777c1136e261c1b51101055eca559c9e7a65b3bc52820249c721b00ffd5533b9a25adb83f4e23b808aec7cc2fa01a0b07acd0edc93b253e145edc9789c6834f3c2a79803b1ac45645f1d15ceb3539f60e7543999bc6e2e7950e38e04026731e300ef2b6efa91ea67527c4657c7cc299bae972e80931706782aca42267681acca41a5023de17f52963a9ab45b29bb51c9c58b064b8a80e00434e7291d05459bd0af3f5fee0200c17c9798128c9d97ec58ad3f1390ddbc1a4bc318a7c81406103639e31133e33dc8643256ab571dd858452581ad08d25c79ac5f0a6a54a860be0118829d87b14ad838323ad9760e0db91680adf55ef890cf053a2b2993ba4b4dab1223bc808f758183aa8daebc1202b204b55118e5cdb004f6ab3ec8f306527ef59ea0a1477de5e7d91f111e3339ae8abf212eebd3cd56c64538568f6009744fd2fab377ee50854314ec53659f44adb4bdfc8759e9be4e7593d142d1e2e971abb24baa56da1ec09399655f83a3f022a9a5e28927272fc099141921a819bcb70a0164fe8de2a2639ce3b5b1adcde900fc1316367c463034311663920e20ac275eea534d6e7c0cf9b0d225a1a09b6bd4300b502eedf8211506d5b9167a7976f486f374bc698e2b961ba043a62b7f536aec0d080ba67510077ea7b8f6cd585555b063e7a8526e23fbd36c8afe18bea869ea15a597749d50b5223589923ba6be0e6ec086576c34267b44befa27b4733edb37b8b686cad3efaf284df6b6e0016688f9f0cc6e48160d33db2fdc0e1a0d62a19bd681ffd2f53a7e3c36db306a5e04c9a3541b3e46a6021b975b92f5465bc767176be711cd09be540cad36efede24633cdf194369d457991d0daa57ab7b827d37de796d0dc7e7c33640cf5389a6874ea0a0e4024d70148ebded2e00e763a2007f1a8a50b1f32ac30e7f4edd3e00462ad1dd59d4641a160caec19aced3792839720456678d640b586fe0a54e26fd6446a3d98e6c91fc0dd40677bec04ca65f5e1262374d4919cfd5ec49d2125d06c169fa348fb0272645de60267c57e9750660e1fbda2f2508c94aac41879f27d9ec1126f647344a082fb28ff41672b54a9e1711da109322a0a4d40a37f08094fced5b6cf026f524ba8242a2c55e2c4f7224b7f9ab12a845facbe9f3cb5aceec0ad46c1f20c9cc177d9f108f7a1a7497312a2913a4cfdecd7aa90ac63586c217fbe084bf9184909c138e0d34e44bf782b3a1bd4ea75e05945da8404d0dc2a45b3b644341237f4385e5da940662257784f37344faf26027e02e64661efd94a8990e1fe6f93e2333a59cc69f2ee3a7b2fcb846a0cdac1a1b46e65a97e2be0e215f52b9325eccdc3da940280e700d09dd948a5c24731e2a924abbe95d51c9bf227291dea5d3d7b515b5e45605ddb5f2326d3bf35952f47bf5937ecb04c27940cdf01d4a737ed4b2419a323797265b148630a4c03e5145e37a8f17bb7406d8472d1debd5c99a8aa4278d27c46a885591dff8a89baef31319fb1e6e6cd2deb0b9e8659b0fd0e128c7c2e469e874fcbf8034af3f023dd0b8288604834f2b8b4dfb913b827c636a10970339414df97df99539089d16468144effe83c2deada7ed052b3ddf7ebe91c7080ea93eac2c376ba5f85aa3125cc7a9771890fbeb5976999df5f4e3feaed098e501a1ec0f19d4c0af262f77e60793e7d47990900ce5d22c63339e4febdc240c218c887c3c26fd9ff6c4930b967f4e3b488029f16b28280da5fd5bb81c683973f79fb06c8fc3c5e200acce4e2aab81a8e7ba909eb77bc33e9007758acbc2a6dcbb404d1a3ca05cd82bcadad1196377391b4d90664411cad309bc463af7f68745a2c24f683fbfae9e9d145b2ff1ea7322d84b55955f558ba19c56e3285f94dd81a0eb433f4aa877cfe8da4e6eb4f6e9e77ee45c318100affc37b4c4fb8bd54ca90c7acaa618a756151e22360e54fbef451f38132f22541fe0116f0a7f791e3c41d70a41240ca6ea7f1bd9ff0ebfeb3b976311744b12d1fbca5fbc252922761f48a6bbfbbeb7d8782eeb8fdf71272273e912a5ac098d07dc0f0b3d23eb289771f47adbcabfb9108039324f90b64a0553ed8079168482bfe99f3545e4d05e1dc5f1c22a52253023324b59deac3ff058a3e31115278e00b3b2bfffb0d53ebdf3c4a28870b9fd63b442c8031cd89d90a0d2cf76cb037a1deac99d75efc2f96bc332451256df30be07f4c5cac10b790e250472b4ade3823a4ee0c63034efa5b10ee0508284b7cfc2d2d7fbb1df10d93941552ec7e3429b79bf9aa941293262a11275eb22a95f472124237e266bd3ee11c81c646aa956fa704bfb3385a921706fcb6b139bcf312e0f465020c1d735a7cd6833e661ee83752ca6c81aa10e0e1f8ee842b916db99a7a1eee1b9a2ff53430ffdcfb097df25bf46e792884752ae8f8fbf887b6427ba117173ff62e10c4b4b8c85b8f1f173abc9acb89f22ae1e558d326925e92ff818f3f13cf7d70bfb8701bb3ea05dc63e7d44c1e75a854adbda6e836dde30d8aad80d078757762f55b22914907fde37c02d93f6c85614a5c6ba13608f46c08f0daa5d5db5c9b6562ed88da4377f8e918b12522a8752921bbbce06d974614aa837b603717450f19b1ce72449809f0d8925d14aedddcf3ec6bbe9abc2464f5b63b1b064ca660c984271600de0f499dd449955c087a8fd5fdea13ffeb8c1799fef56d426d17bed8bcdd8734c70a68ec616a4701164d959983f49141cec7a41d6968a6f9cd26f9bfe1875d38347a3c4cc0cd4efb8e119d63c0b1438d38de57b896680df65feb0094068fce554f741e449a871a4f86eed838ca486c32c36761e0b0005149aa8d4383ed8e8b8635a47b2ce4d0604bde3ca29e3e23aac4c4c7757924723c23429aec53d5238f607516ed62d3086a527889c56ea6aecb138fa0b9fa64a5f83825b8eca4a379acb1ade2386194803dc05681ff6aa397fdf9c0c646a666f252cd0bda0b8093c3dbb0d3e1cc8487ebf6ce10faad1c345abf88715437e50ac6e59ae3569ec6e9ad9d6f257cbcb02da5404e751be6e2b1f13ca2ca5c88c888f45d32fcf2522d0f607284151ae745540df86c081adce6305107893d96ae6e85af9c85674857794b47e4bc689358d7ff11590d178175a3b866bbece98649e865a735c191e3fa52b83ebb62a275b9902a093943da53f33bb0a6c39ed7e46d8f2a4abd66b676491119ee676456bd635f76ab184209adb6dc268c1b6708ceb4c8d79bf9574e56720da20da5d43e7238925b10bdd2ff0c2edadf0733355f139a94452f9aa789b3df7d454cfa5d31aa3288fcea1e8dfce527f81182fc77e3f52cb09332303a56ff89f5e832c9db9ab03fe8dda02dbecd5f723069e8aa07627afafe0bfa4e6a1909af3d1621f2193ea213dd88dd66a4b3cf459d12072836ba7fc8d704522ee7ed3cb1601ed54173c6e00e25eca7581b7c7cd7e17afd1b4ad36014cf4c3711fb349ee933e80ca75614201c1b890525ca2fa78e5d493a41a94ebd04a0dcd21318044ce650dbc7568914fa45e840c8cf8c801860f32f7e3430521533a07bf609eabeab99b01a4cb61cfd7b18db09e6c7bf9bb97b1d19686e253144a07de514b45af695cf0f4488f09ac138ce202bf0c1f0a5f5d57db717872992052216f98fd61c5910869ed36127d312e0d89b29772356074e450531440d415dd33dae8b1308ef1a73fe675e2bc1722c4409786f3c72ba63968c2da5b4bc868d0c3b7876ddc9c2b9542670706643125d6c560f7322ca1607b40e22840593bf02ab250f4cac7f769be025314b326b8992fa8550faa9cbc5035062c386f08ee4bab82b7eb13f9f3d9e4b31fa655b51f1d07444a820321f6b290e4cdf06f1728e206782af0c93de51c96198ea75244a77d828f3c0025b2c9f0fcc700c1e704193d8a9002c8567edebdb828780586bd4c29d142348bc33aedc3218bebfbc0524f2a566e87ada9872f0dea7060e0e404d9ccb32c29f4ce50ba44cbe70d1cb0cb763f65679c93b7a9b2292e17542fc028734eea7defd438a41101e413c5cfd7b1bb5b22f27813783976d3e507575b1c77499e0dc5a86e3a158f813f990b58adfa3d497b3de41dd13a1245be8e2952db660f511e513e10e7a62044d109e9fb5cc81a12e24f062c169a41face3110639c955c9374a130b1017c5542d5ebe9ef58a6964bc2c6958fb121fd534df230288ac1cfbf436f0694185475c4724ac04009588360f258e0b6ab67dd4950d15983919d7e33c1bc53dbfa7e59e1de258a5766f930c56f27dfb8bcd325807fc491205e5032de576593f9014c3dbf27d35912a63b27dc3b5fa3a78204df24194f0db9c84ba3fe5c62d9b4e35826a1898de814d5e8342658d8e1c889860f54c7fbb3470e720bbfda7a30f902cda0b52489d4e3f33a0bc7533fccb6e0cdaaffc0d6754858eea665233fea1ef3652c2d4e8d6560b516be7352e311f80803edb22e636f40382281334b90cd90af1da07e2cd4509bf0ac981d917b0373d393de87db9614eb786d00c71c52c8c53d77c3bc1ef8a9bde6fed6bb8a327c21623900c25e08760b05727cb03bcc6f0370e1701c27b5e8e6c96c46252057883605c58e473c1ab366cac6b8641d1949301033a36345c0ccbd29fba6e751c1b40d1819c282f9cabd3d25c9c95a662dd3ad4c73bab19eca7f1553642010f44227c23dc9600e62e76509b0564d9a2f851ac3e18c846986c7f1053089c4c5a2a2bcc29fc22cdda20ea47ecf3ad9d04d4815af97a96124a07ac128e0b25fdb6b6026f2d64321a7a8ce0c42be7c92c8c113a847b7d87b6b590bb9047252c400637d12ad8dfb5b8896acf86bed06957ae9aa53dc8d97a946769cc59f84e33fd417580ee9c4e8f55a8d3af754a985cfd4497af501a3b2874fe6af37a2d9cc880f1f94a80315c6cca3d16d7ef7781c5d8491946761f94c64e2ca4cb8a2fbdbb8880d238c97561348b7adaf839268fb9ebe1a635137ce08767d20e43e63ef63910c20a14bd5198070690f5d9f92ab6d9fc6583f04b313a370e98e7d6dd6d1a6712fff4f175085af614f5ced42e0457d4edc295c279b971d8522a50bf246f45102f0c6f171966bb31ab8503c6c181d6243f47e7f637d79ddb87f15fc9305d1d2b029aa66c58f0ad298b3b9d51382c1e45e3c42b821a92366cf4a46920726d30e035b998364f441ab0f404174f2afb845c8631cc99c32fe470cb260de33464c7293f60d86999de5bb6f4fa6760f14853d25f798759f88e4d0a9c3709565c54b87f05c38e0539fe399a62807d48cb73f7898bf56f21e120e9d2194a955e3b13f281bb1e1c6e5f15e4a8f87232271ae95725d181e078012660061a93394b40d24411e2b8c64c13bdce0e7a8d60487d7ff786bf19ab287da4887fe0426fffb37d3a5c0f29f589e8d25a691c4209597316c3f8e01a4383c6d6f1a196cd457157fece3a81acea6bb98e263c02293dfbaef49a9a5caea0bcafe146a08d7d5463e6d5940bbe20986b2cd83d9df32d9e2837ef2e0aa729f2001249daf924f8784a74dc2db955c81305a80f03506ec2dfea9fe8b928dbbc851980406c7c57482708d757551aa5279ad527f68231757688371af5482f90af33dae7f8a22048eed5dea5013cf3196a4a0a7bf9aeb103b1ac09c0df5f9879c81e8ce0a1c786a12840249864b1bb07e98bf3275a3a5471f708c461cce6e8299f4196f18e81e4bc4c81a9c140e8ff623031deecf037795cc5d86f719020c562875f6b3e53be2b1efc96574230c7ff0632e71b808897b9e4a4452fc4d739f65da69a233f08773483f82cdfd58d4e983d8efc57770eab510848b99fd3375115c8377e6fcf665353ffb0fae2ee1739a65c20a4438608d7a8a8691032daeaef82f628f68b3236f9d4036b61cedd569816b2311ef022683e2f0452393722bf43f026f592523a0cd056bda47dd70f0deb2511ad6e628ac666049ac384e6f7bd832e29a406cd56a67a3d407cf39231a8c45d39f8c56debae37446b720649c696612bc4522f446be4d4f9ed9f74aed7d882c29327ba70ef5e86e82acea22a0f7c3f3dc8c8891ad53be3d4e539316dfb9791d074604cac094c26103968eccb67d1e06ed947299bf55be1195a6cf5952843ea525d3fec49cb8b0fd44dba07ee0af7a8547067a39cd8cfa8c5b5dd11e5c2baa16989d22692f5fe728bf864e49a294b0d1a85eefc3661677d5b225f9eb1b94eb48d9de05198f1adc06e71b113860c30020d662c53b7697b39b15ca25545d4a60e5a9d87378c6f015e3d70a1ffa4e643c8e852dca007dc2c060250a0890cb0aa291f49e97bb74e59a0a3c42e4ce8884495cd6cf7a379012668db531155d3a84e706dbf33e5ed5221cdd1ec12be8c9a51e48451b3690a625eca7c55b77750d331df13ff7074542134bfc581d47a68d58d156e425edeaef011c65908aeb9af58d4fee7f717e29091376fe1a8fd3638cff02a8600d0feec95dc16a6f758df6ebf2454d3c72985a17174b868a218b168b52c36fe7f1f0a992483d886b4c9304de0231df356c6c9fa9a353acb455443b26833ca4f978428b6db0c0790f61abc5941c8dbe2a6394d3774dc6fe1d07388ef4b67fceefce2832cb5975305af0ea0e8dd3ad3836cd2385260d4aeb8211f349b52589bcc108656a6d3e337314c6f1e204ebf12e0adacce0d707387d6beeb4e3855810567a395d30c1791af92b49322f9c1c9d3ce1365b689b3e250f2fa6667d11600847515333abfa1238e956af046a9b85d11f575614451d055ce012714c7ca7a1e575d23d30cdfb4e7d67a60fc8c85552c7d64325dd048e0180fbdf50661e43f0eddc124db337f13b252e49545f1bac18480209614d3b10839766e0df6b60f15831e0049bfc3b1e6a4f87a36c0c224a95e1599c9c1b2ed91ccba5e0505e953c867eb098c57f2613d1fb594a85e08ad41fbdcc9fd39bb7fdbac31336680e914aaad7c79fff90b573c648ef282539fcd275d1d0f1927089062fd11e122da96f6bf6458ccf2f5424af20ee6164cf960a03e775313a29b02277a94571aab5bc01ca1cc62c88394e6c032ae8cf5e8cbe856a3d92088d50f45ce4e1f0c02305f14d2b59ce3387271ac28a03a49da1af1fbb4ce90c30b45ed85da61db1679c83a26df00c9491b683e184411b0d8b1a7ce1d859f1bf4673cd61575d4a75957e873d3a057561b3212a51bbc30aefa5933b9b36572e2ff66e30e007b92e9bb1ae93f4cd7f53c9035d454262a42051e8c031fed6c6a64ab599b5b233a29573efdf44eda844906c97b3e42a1c4dadf669c95b3be739ec938813ed183e902143eb66d39d3eb470acc4bfb12a607b626ce65356cc2a8f5fcaa382bbe1501fecb084bf3411a0b5e5b1768e47352155746bc21c360b356164b29e5e8ab61894fb39d02a63d53edfa05952c110ce3b18a6ba1d21efb41e62ccab407df86919fbddb939ebcacdc9e1ccb6dd520256f8f9075661e3b086c55550a168618c7527524e9375eb90283e40dd33b41512a6a49f4f8128286a558025eafaabb817f8361f73c3cab45d99cec08cbfd4384f08a7a9ed8356fb9a539b4081789935cf1cfe5eb2a84de36a0158c1333ba465fd4e0ec2dd0afe1b9d20c329d4188f072b58c546598730d2fc734003dac1d1426be39dc1b98fa113b87fde7ed24037166a116de0fb050b71b42d764e66ca6b85f94ac8b3e866f1c0a82e5292793d8ad4f5495997f5a12cb3d25ec6fb4e264f6629156117ad6fd81023c175a40c12e22927ef303d9dcb94d9dbeba388b3fa84e7d7a04ccad28b6a250f656cf4484967271544b2bf0c80a0a244c75b216224306f06a7a121ab2436d472483be67b460e466eb680aba05aada28099d431d776bac0ee22ba6f66ca14627ee6ecd22c6f3fc2d227f0374b59617d01d5ee7a72ba0cfa82190b03896319fba673822286145dae33bf6c82820b557ba0ca348362c28670ec28dbad559bee89013a9797816646618c72c142433f992e1ea091474fb34613d09e0bcf55566861f17ba4d16f020c1739b393afe71887c8b728e71124e88c1694cfbb046f339ee0b349327dae9cb8f694144fc0986bde1aadd92679c967f51b0a0403eca694f8c414ffc0afa88a3aab1b2a32a132297f427d3a8411fd0614c1d3a4781b2b583f4beec088205a1a6c8374fb4f637bc8702dbbe4d6a065aa9dcd5bb1b3fbe500519be8dd1fa9876d72ab0ca5f287a8cee695e89364b9a24ea883081ccd0709ff4646e61102b07412a241824fdc681c9998fe74085db512e1d4084a5d029fe025bf994c1d5873e1ebfd3677367c801b6761bc8161e3d3becafe0f435367da1483333bb803f67485b3496e0ac71c44455a51d85f54601715bacf95c9ed71aaf36b5ddd45c95e86dacddb9f41597d3d36f3cf6dc42a2c1001e33d06e9b8e3ac623dfe2ade676cccdc68f0928a36519716f2b694d26c7f14d149cb7453db35480439a2a53bea4a21318532edab20f52b9e13edca8398a620470fb8e3c9c5bd737bc5098926738c3250d89f984f0088ac6c4ce61c657c94594efdae3b6a3c8ac02b60eff847ed8c4ec99fe2a927e65605f05b5496237952a1d81960690789ec7de7ccc07d19f136a34a055245df5ddee97650d898f2ab3c2e9ce8bd38355c9439ecaa66e7ba35d0ce846b171081b74f78c73f3f0dc6f13063a3aca4581189601a127c733865d7089905a183210f771c1aa8fe804038057598e448da810400576dc75c140f40fcc7075442b511e78fc4b6afcf297d7b08e0f9d3f1a3faf3931315817a3742af5a8abf78218a4617ba9f8ad7303ba82051c055e9ea77aede02703c94f8d8fe8bb67586126f0795364ce4b77ad6decf390329c712d2f3117f5f59eda354dfacdaafd7369ca9a5ef054614e7f19589d4dc8a77f153f1d521f77e6cb251eacb7830ec7f374e9bd2736f8568be36591417d82b6ed1de3b6bd3ed8f8e247e191a3b9dd6dd32e30335e908dcc33ea34f193947a4b0da279e6dfcc0b74a1462783e4e602aba55da0f3c1ced86c8f20b1fd952647f12acf0b72806e32d40f8746c9cf9cc582c5ddf48955a803887328708e6096a43f55e44b0081b54dd9ceff58fbb74b334eee9ec601e0dd5871363e9554edcf73f5ea05f03dac65c8c051d2d65a28ba9e3b39453910682f0796fee3c691f63b6ba3587696c8c4936ed7583d9ba878b5fab4806027373e69d35dd1c3d6d986d54968ba10d2f2af6208c8279b9b0b0df1d9868ea9869f327fb598066d9d3da49a9933e45c2354466373f03ca77343ae403bb68676968f9f223ae5d93731b6d0d05441ddb6342facb349d2d077b1c362d45d66354b1c3a6b8fb02a8642a591d7719842e5659960a9e2c24ad468f627cee9054402e537ec49830bed83868e09593ea34160d285a275cbb9dd80e7b56fc936f517dc8f19274767314b390bec440c925fa0ddbe2ea143871a8c8b7b2c971d2e438ece11cd3c9515b23e2a7a8b7f24a42d7d875ae8c7a3ed17047c702284e45436ef181890e440e6b46a952f400715c5699915f5994a37f15e65abc20ad2a0ff46cefc06aa95e2154d8a322cf4f156ab47b6b9e850f7c3a16b38095d705fdb2056bf8e49e0d1dc2f5c7df9b1616120fed21d032c5a945449e9af294ff1426db42d2e7939545cdd1dec56d86129a82f0cd7e08c97e76b87b044abb3e8e9933e69fc39e603de0d1a0f135a693d6df900aa188fc1648823b5efe00c41241a26204c9be3639d2830eac732445043f533887c7971798b9acdfffd5a77cd8994d6efbeb0d31698df85d1226076e1b115839cbc927b2d77d4ff6cf9f5bcc37427dbaf5adba3d89a516ebd0afe09384187171672c2886b571caf8fae8cf18000d75a984835c037cbec110d00ca5f0587394bb24d3780f1a618052ac29ae132e6367031bfa7facf22e1019f78a8d4a80ca043f0ed2a0a62e5444dd6f184ca4adc81d8f5f369bf2c2785465149f0b8614c9099de1d879ae487c677c775546e5b337d5eff3cd8caba598c3a2be9be8e8b7d479f6138de94d5394473038601b601be8dcdeba3f6419dc2ea19fb522319b519404761a12ea8b447ec83e6fce0a17b5d1213314ede26217c59db0650fdb1593ea61cd6c39da15ad9275d977a7e8a26566b08f47255d24a59cd3dd0fec2857cf5d6e510660033177dd40e5f124ef849c137467191ea0e8bc60b308087f634eff261d9c0c198be68f26c5c1073e05bfb926d91e8c54b2b2f88587ff85debbfeb66955e115c9b1972bab2e0c27eebba0de07fcc31c565542274602051b7a63270a3a95579a3e3fcc0e9b3fdc7742ec3ffd6e903b0ae269565e465decf7cc509e862382cd224b596d4fd99138f9d542e41940a9f77a83192b5ae9a98fd8b1ecbf97872a4feac4167fcc2fddb85b835e2de05255d1d4333ccad2802214bf66544847e5e511f8a5c336458656aabee41c555d78b5559076311a16ab4d9408950bc106964909e485b5f56313c55a036f1294d6163fc7a113df7aef7fd5335bc058901c63995844ff3eb1d19173861aff782edb57f710960dfdea85e36739e3ed577340f57ae22f63cfc52e765455eee96bed8db70b5f0086d1f4e98aefe6a34b39c914eedb597ff65244ed01bc5ce137330655262452a9bec8fd7cb2482069e950e0c1d977c23c4ff52bb6edc593399333f47774e3129281829878991ab8d273e3bf74e63d64d18b1e8572975b29e08f30d3aa39ef8b457c10e277110894895934f5210856312f65e0d2b524365934d1f8c93d64ef16f260cc1d6bb9588fb38fe8222db84b12e167bb39d3b8f0680e74bfd64d87afa5136857b19a3db7889445ebd9107b81b1118016f3f6ce905c2646bdd9c2cd656f95c92d5119d0c04e09b4baf568257726e07536363ae198a6d85af0475adeb20190512321cf9a2194754784334ae420ece1ce21b42240f5945dd8311d3d0b15c6ca06e0064eb5d6b9ceecb1ab2d93a8e367b733362e31f7a51eb99ba024d00dd63385038499a5691653e2f3b7e61ced6c8356b3511617cb6a34686051140d139c98dff7aa8ed4b3fc8e5e194d300bb0a0195b7ab61e154b742af6e2f31eff3e383e104e2ecc6f54278bc8b37c1218c65b56c07c620f3ff6c352b52de3c396e4acbdb814f663ccf11417fd94ab7b9b6e8153039dceb56ad850caaf99efcaa1936234a2654f37de936a8ba62df22f10a8ecdb54db27536c4a3f55cbdd35ff282b1d7c385b4db36349fe66bca7cb9108ec7e602260a9c63c87f42213cde4f532466cae048fb6c06d5a8e3d6fc6585d47970a5b937549bbbffee5a77498c029a36e37de83a6c2189a0bc2c23f43187a71da475a854c9461a2beac4f228148b9220209d9b4e4f556d69ece8e69f1d331531414fba3c5bd11a4cc5eef7669a4ff8b5bebd545c55b44f5e1ffc5de951cc5d3cc14ea1acb355f538561dde127a5188c12fa7c65ad109a1130d8925d09f0f81e33ce0e83d184b51fec7dcbefd7767a500fb47c3d0023ebf3b1e36a2b96000446ad4ae48eb33e7bbb9c49886d0739587853d0a91548220ee032eb6185c325a215ab2b84edcffe46f280e199417d9baee47b55d49752f0b4574f4f53a5332b27d9198211fef8b1967901d65de7e468f98d7fc6580fb82024e189b220af85d2066fcba3513fef00b8b067c690147dae67b786f58fc25c400c5d1c0c2520ddda91185d7c33a39febbb984169c5e8c1b836a9846f991e42172614e832532087a8493970261602b19ca521c145933413c0dbc99b6e74b5dca38e46ded63226814ec815c795056ae2572c2d06cc143aafaecc6dea3dac84ba1c793101744b0e5ad59bec14c7f58dc44ad8bc197cb477f2a682e311d9c355b2eea3bcfb0f33ac5b87767908f31d208aa96f76e28ac7bf7576306560fbe1508b5d62eaa2b99dd97145aed65b0b6b8cfa37fbc9dc34a4d020243628f7747ea5b0fa85c936b44918aeac077a8f6b392a88eef88f0fb960ee0a4e0ff9a68182c67f5f2fcc7c45cf054735f1691380fb3f8ff6ce65db1313781a20cc5ca475eaad2401ef343c90888ff0297641dd82dd35aa1b25475d4c48e4263a34ffb9c2595555f4e795e9c2e8c74660af84e6e8f669256b40f9f8721f50875ad014880f325a03964cfd99b6225982bf96eb51160470d04ae65f51c9c036333f1440b06e7d3da0a96a65472e68fae3c94d411d2df3d047accadb6a2b237b15a6f6da859fb8083f32ea2283c95541fb82e139ce43c07febdba8637411969c264b124a67cecc0474f927fe8224c2d5bcc1b28a93ac0d6c251341a3d53572a1dfeeccc4a69c483bac847f27a0d67ebaaeaad3db0a3fa1ce6374713c80120a645ac77d157e7f9dfd16a1c27870094a4574e81c6aaadc196e31c5ec494eb452d45ecc9d34e6f7bfda3414acea42c04026266b269a6f17ae0926f8af06910edf73162d99e9502fd81064d5bd318a5567a2b10389d3eb69ed907eb6edbc71d8106b3ddeb9eb67c147bc0b77d3b24bed39f9f384b7a9b2ca607f23e0fd49a791b11f3c83c7da97c9092704b3255a5f73420e461446dd44917a95d45b54702b1547791f2834eaab4902ed2cca159b78c391c141c657e1ad70a84bca15a31eb4c052d9eab2f5ff0f336d1fd58ba903b0a5eba9ff03e90845319258830f6362ca0e0d68eb2118c9ac8dabd3f8666bea29d8d501a58758406c727189db3cb418f343532ce1604e486d5593e91e7b6b7cecdfea00514a72f3bf23e1578c73c405471735e9da9c697b56a8eea6f239586a19c7090939e4abf0ac9d52126241cf6ab2a3c230886cfac5f0479893a2201c2e427b2290fc11a08190f057078d4bbbde9e246f20148c753facf197250a51cc3b133d369f2587fba9fac4c84b0cc802bbb95e62ddc0554f22ea4e12527a97820d2fced949cf6f7d051004456c562f18cb7e41b550648fc8715fc212c1f51b2764c4b285a12f8a6091c85353bb6ea1422b1c3b307c9a5fbec6c749c07413b37ff96d7a28aa67622f51b0dcd730ed68738b3810d6fb4c157762b1a6d403ba5d7095ef8086d0043920b4b68b836aa8582809d1767e2d6ac6e92db5aae7c32dde51ec476170c424ceacffce30570034dc10185af1d6ed7446bab546ce4be2cc0ca6a570df373383fbf843847403ba9e87c29a0667e74296be61a12802eb12ea5a4f502bf5b3310415a93ec7efc0a277b061454626d6d4174cd5273cdbbc67eb74f53a601f535370f605d601bb8e106813b65a7a2cb3a058e261e485c3fb47c217c7c50f7fd94039cdabd943bb10a08286a2182fb3a08168c694b461b1c58b2537acbc2643d6f4e8026cc5fb073361e3d8062abb9eb9c22541336df217122a5254375742e30230d60892a05130c0c789875b3ea182e054fe415e9769f45a55a06b807fdaa382c73eea2aac55e9e128ea7282a5b06ea867c3d446313910182baa8671d89c9f6364e93f64427f88e6e297ef25ca15306040974086cca602a7942f6105493afe943b32c72ad2a87899e10e23a3f7d60f41f7588f38ab6122ac5dcb154bca32add1e340129fe0fca8a022676b6fbdffc6a20ebb43c7b1938215b14af31c1e5c671754bd2f0700588837d87a1404aa53400f5745f0bf15d03cbc46bd56e20bdd3d16f78252ce53e5e2ba339155ce81170842585665747f587abe8d0a97c72041bc4d93b4ed7304e5f64dcdcd960be4311b95f6c1a44378548f156a6d4770ce2d04f7d56b6edf8b007adae472212e9d2029d88cb617683b953164c1ae31126bcd3d9dd7668579824a30b8a431510f035d4d65151224c83ef63c5b9bf494fd762e401c95c490f4ac3687bd09f6b2b50bdc7938238edaafa729610f46c12c2d0020090780e3a955c00a74f76e9e991e5d5ae4828af7b124ea4c4817639e77251fe5765ae584e674b1ae12f7e83147a69c61c659ac6abe1a520d3bc6509674e147cd7b965bd7eba2a11366c1531301dd019ad87bc51d39ce7154c3f94629c9abc174fbbb6aba6b0098fa1ac8d1139044a87da492cc7f7e381fb0369824568bf3af57f89ae743c4c91abd5916bd25863c47b7f21d0617117cfc115c00eca01ec8b6f6028cabb5f715adfbab26e89042a500b24358c603f1e4a1c4e4e20598c8c3eeffea8bd0f8d62c891ba7740b8bf7e4476764ab973ce66b0c32be241f48f27a95bca3d1527ce142d8878c0bcd6442119f1cc7b3b6057cc9c125defb2b747a39f0c7194ddc5f03890adc82c6e913333a0adf1a9d0d283aec91c746b2af76137bb740661b22e159ec59ffe7b667ae719be7062de8a06223060dd3b554500835a07a16ce4a478e5380c88e28cc0ad2774a085d6c884a6433322004663a221d1d861e4d1c84e546feb62342d660dd0d4c4597b08aa9140850dedd9461e8e49f6c5d6072ed137e26a88de4ceb5e35e034c8c3e30b91b578c4d47e87c690452385a7c1453c21f2d011680d6ef5f37ca91b1791f2e9cd0563a4a6c8531ac784268cd741c326e47b71e47f30b0c0412209442c6fd84dc7165428ee30d5246c17c8ffaf2efe1f9a0df552bb3ae95abcce6cecb784c4e81cac7715c9d4ec3b2e8565b9b20899440f42bb95798d4a70408c8c5bedb918317eb03402b5ba35e5163a28e9985feb71115a1003ef1069394228d14d70618a649ed120b08fdb4fa9649de556c2c2c4941e232806fef7ad0151d0c9fa0c6074927550a21ea10cdb44401ac400211d98ddebe7ff5617c334227183a9c2a5dda03fb4c4fc4b21a05aeb038ffa028cd11d380681968063c223f82fac6399199a7fb072fa41d0db12ee99dc9f1723eb4b61a0867eecb1d4bc3d589536ea2aeb548a242fca8d912e2a8443f06279a806df39f4755109e3513a72e8b0d1c22d8b76d426bec434d0bdc284958f9eeff0c45d1b9136eb28a1b789dbb3aab5550fad0a68c27b98845709283673f1462dbbbae324830b6e4db38d8f916c50b1d697630dc6af4298e26b025ef88c56b2caa806c5c8256609f8ace0e07f18e35a36dabc53a006033628d278deb58946b28a54c1b90e61e12781169c27fc6348ca74b074c814e868e73218b702d6784776ad663c3dbb777ceebff3724f6e95077703e30ffc479c22cf0f297fe3c5bbfe285a99741dceb72f62ed926c541edbf1dcf674ceebb011d6357fe29a034d6e456f92e99c5de59d66aa319234ab2023c404c7f3c5b82617866fd2be8da834051404b9feb5bf95b81c8caaf552673f41c6206170b61eb69cfc8453d6cb7360734486c2621f17257ea4cb72b0552d8067eaa35ace7cf0160d8874191b8c5deae470e5f33fded98e5c017ec817ed36aa7545ef1e5739517303fb9628b87136b9e602df81860716582e1421d27a3fea94285a4bcec9e841a8d9513cf7d181b8fa71c032aebc82e58be3b24da3df573ab31024d4e0cddf8c870514844615218af1a4dab2873189b77c6eefefb4faf83821b2e19763b51ceb03709a4b94c1a715ba7c0655fb8b5f0eeffbc0edf59a39290c64cdb4339add5d0dfee39441acab5d82162cd8c2b44aa2f7f1d61cd056ea1dd12e2a14edceb1cc2cb0a01ba49304abdf02a3f0ef091a2d55119a12c46c30b9940efe6565a360746216793668c042e961d8d18e211ef190a766b6fbbd3e34f28bf5ac457b427d82e2e06a2ca7ef202877b032c528c0b072fccf9d47814003c17f11a6fb605dee1223bb9326a424b46c20e2941ee3e5fb0229f0d2adb1d7cd5fed0d1ef517f13f14aa8fc0a5eada639b41ed11ece506ec7f2cdc1f01bb5043b6d848e1c6d4ab90263666e115017eef34dd2e9a5f2220e6eeaf6e0e036c85fabbfa1cd7f2b0dfd20e2ffad06ff38f5e18905e9a540cf95316aa69e4ead59ce9268f19647b053ea9d8c70d184aff7a2991af53d80f6bd9c7d9ee5a808a2ff07eb06d4a387cd4f376b08c24fb0b78c2e2494e3d095ced0ed552a423eed35e66c10f74cf2659d132cbfe09538b4c4b6085bc56c1318a5500a9efbe89defe6b4618700cbbba96f5884adf51323f104b44adbe39ba9974028d472aa8962a9a47fa410cd7157537c11676105838f61347d1ae518ac7a431f110bd28860026de997fd5c626b56169df06396ea86958ed4fa30c56ee7656c88d98ad541355e1c485aca0334ac833f0f37784ea596aeefa58568518423fc3de9fd6fad2b7e8e1efd1bc89278ab3ccb122013653467dca6dc9ef4a5e43b3e0f4618b5f745aa18e9f162e4e4ef62d14c27fc7f443725f9ae00d15f91c11a3860f7219471fda33c12adc0447ded50662ee53c57a631c2312f9095de63692cae441024a4cef2414376b623e783cd30b5a63308f6dce5c6991303099a52ca5a4d2e0f2c46cea1063b9466d80b408bb873685e0e77961788952492473c227fbcf777fe9173a4e9366c272d256848588ff12aad3fff64ca50e45d5053d4c60227cc5f4d672792d6e8d7379da051484b83937b820f44e704fa4efaf2a023d4e1d679b82633203e1c9679cae0ffaf3509203b6b4e248937c0868caee391828de0b7f7091781eee4785310df7ebe6c2507b3a3731768cdb147a91dcdfeb0d77ed77f349e99a0c619513f2cc13315052d2b90abd9c8127910a0676f6dc736ca437c3b5af3142d8ce3f7f121ba186fbc56c62129ea81992b23f20dee7cf3e60e9630b9f2eb24abe2a6323262a7186528a288e241034121479328e684fa4176a27e7d873676f66ce466938e0737e166a776f230527ecbcbb825dc69f29d124e39b3b1f14b587b4dcb20c6d354f2c60b06901a5daac173192c0ba1cfa3dda8d5480688dd16e1355eb059287628aa8dcfd8fd0ec831905a91eda0643ba535c519e83a1471643c422ac1088f79b40d653c5d4aa22e0c447eeaa104021abe62ecea694560dae4e4d2027ccdd510a79e375a0c444bfcf05ae68c3efd6452921190a7fb9c695b60c6104bc61bdfb08fe9af0039c5af9265695f1697cf5028b3d12f23a65dcebd13dfb3a9b81744490ba163b139ff8794f83decdb357decf40130c8050edf5750c8a4100f3630e9b3a88138c41352ee4cb4d1a15525354fb4ce377443beacc7b0a1d510af29a6a856f30a5253356cccc0e2ee9fd685e37acf04d003f572082ad8e53329caa832bc047c02f8c2cf841b6ae3b95034a41ee468c6b1fea845b25079ea0b72581e70d7b2ca25d8b4e2783696e7faae82428e2b531cf69457f189b390df400cd1dffb7fad403854a1235198c26f2e9673b2c6b9906fbe38642b7d21b6ed8d48c38dfd9df5a6630b5c83e6485691783363bda965d9eed71707407079d34cf4466e6520911d91a0af3f99ce1e9568052985cf16733976662539c65eb4671a2f9850bb9cd6bb81c19542c60c60a38f929dce2e48a364283b876201d91106305502e9e02cc73d2114f7c4ae475f793887a01c3f54f27baf09e5353128b11c4681da57a4c09071104446ce84bbbe4298dea19a8fcb28a17e1ab3954498c80b4959aeb2e9c2e442e4636e4eb141cd50f95dee9a020845d3856a028efd1034f2b8c06e8ebdae92c62abbecba908d1ed0cd0d4b5de5993563e28a77859e8a2e5f99dfd4bc64f7a4c9dd5fab8dbd865bc549ea04a21807b19af9cff45ef11599b5be4fc99ab4a5458bdf62babe710dfa7f8d07acf3b54508b8278cec39fc7d3500bca0f5357a51881014d5dc9ce1d55e2fd2625ef195c9d10c0997a5a9e5003fbd6cc681577c55333b91de98f761bcc4f5fef12a2548008c4d956344b1f59b15e02aa8d6ea55772e916d47a016b804be5c3fa8e9bd37d75cd80316db53468cd1b02c613bd4c85289357667bfb2a77060bddc0087192afc13cbadf4a76e725392b3c809bd9a4922cbfbcd5b494945a2ee68b31659a62a3d48a195111ac4868e7039f075cbe77275a566aee028e73fa007a4f56cccf5dfac577c4a84076e884a56ec18155c3dc8e57395504160e2cbd86d27763709d7084d181bfbe2765c9451d64bc7c10fabb8a1e326c542bcbb1903ccedb39c63d0355fd10ea173e939d2989c2d0c45c23562d6e59ace68a70132ae1d9ae499c328a964c28837565c4551e1480942ee989dc1c11ea57c2cbb528309d74b93e689cf42e3b1ed40cc14f3f38b1cad0972105b32bc0ffff0cd52e3b5bee5c24a0cdd852f81eebf22f0de6d9b80fea8bf9d19528a7d6f9719810cc5bd1d5765aa9e57e87c34621ec33d42976310943ec4b2c4a666233e12d8836373431c8eafbe91a365c4420cfd822e45fcc39ce0b11484807d58780c5822c307c0302a2540daed86602d82f0938d45a6bc4f019aba492861cefa1c247b412d49c9048190309673d1036719ba1211d9ab2aa11c72d9525f9046cae48804c5ee7b8d6a2ed82bb77c657a1af2476b08fd67c9b66c28eb6fafa076a5b29299559d2ba8716b19f661367af23556a11788e90bd448456c84be1f8990f5d1a3ae9615e7c632bfb78342a06f59ebaf622e38f393e6d24429e18dabc156dea0c86ad716cd58cd0d22f2517917b5c419344ed24855668b9fea9e23ae89dc2aa2e6d2d09167b3caf989098bd1fa49b057700ccae3d783f9619eea3534d23cdaef486d14017017d3dda2794af736d869c2f34b9a1e6833209ed0b28ea4aaa802fc3c6d26f6a082b1604abe694b151474cbb15fb5a7a2074e3fad35bdcc8e3d9f0521596d4309f3082a8ce82c858fb6f9c11526a369ccfa266165ce1d026a1d8be0aab1bd452530b9de3fa7ca8e22e58b672c4bca72b04a1c75ce317cadb7b29a083002a73570828c84aefd424b8160bfa5a564de306547a21454d1ff46869208335d1f499aaa400d926b98628e134d6f97c6fee5246a5c3f261f613d33c4d4f05df4aed6275c9cf2bffccb8689d49c173d145ab3274dba315cd0c98a5e36d09afb29fafc54b07fa9a61f2f010d77fcf945da7e737895c15f595b848177316c13ff6ae1c3980b929ada4eb81a6f54808b0a691f4c239d5b510e27245c56470ad39e7596ee402d0d1d8265ddf894c9052521cc17920e6d858836a27fbd3d8a55725a4075b5fa8e64e5f5a1621ecb0b6da8feacbe0125df55d8e3547c366a83c0bf681d8d0f3284d834cc09fedcb2b3231cb644b037fb018c11c2a6558bf67e99b6f74763fe070981c88eb7eb096e7e834a81cfb90570c478482b4e9770d14891a30d494ef260c3f51707c7ed300d7212b78da16ab956fb9e1357fe8bb89435db63f42957ff05e40dcb691cc2e6a079cf50bbcfb89c812b5dd172bd8ae02dbc2bd108da4a1c62681b17a0780b33543b1a013b0e3f2626b08c6035bd5ab442284111a8899fd4f8c58bfb629cdc7d3862a681658703e5f43baeab754416123e79fe5065e0b592c44cefbbbf94c742ad13482e95e594268cc3726b00874f1b0f1a7eb63182c77b5d9658b36b14eae2827c7ed2de5ec21b42dfd9885bc08cd98a667ef6fd5f16a59ec829a23973c8dcca04cad40bdbff90e1a5d3ff2b9d8302b2adf318cefb1e9d5d947a04ff321ac835848a3bc299f042e82515698356e1fd57aa9a51f0caf04d01fe1bee01c61dd369ff3c482233648224bff9524d6d33df8157a0ef9a7bc39cb55b538d6b4120965d209d3eb542a0f6a7d4b4f347735d74c471eb99ae2ebfc347d595ddfba0b98df35ce39f8215e0f3eb0ca3601f929808a90a43c9c255bc0d5fe3c3269cb8cee7ea7c675a697869bc4d4ac048753f7c3eeaed6085c82715905115224678baee9c39de99a0fa62f5ab3adec262ed32bef06b26c30190bd8ac68bab2619e976f4402db2888b63178608d438fcf51e4c9f3f7d2bf211b7c53499fe22e9567b81646c984a682d24a565cfa882071bf4c19e9d907c77db57e5b3f351ba6e602a87d03c8578e75d022243b14d50b3765cf920da0326c542b082c03ada40b172237ac14ea05fcf91e9abdf3bc7a9158234b41d839653ba8d2048cc457f822cebbda45124c7cf9c00e162d117f4d8d6e9190e89fe4f2b9750243bba4af66c24ac6c72f02f12c07348fc99f88e4e409ec94ad42db8112f84a241e77c3f4ba655712fd8c5f7b0cd1d5b7a45b5a2e5a490d1088202298163b4e6963cc2a3ce420c5a2c2dd6329c24ad7074fe2c176aafc1e3ddd48146c3d432d40de45c1c8e9a3ab376f42fbf2e7bc516b7c9a55e54f5f75be5677508bdc3402db1ae00f235227c17ab536cd239c8ed354d0a2dcba4f8f4f9fd7010493a6db5534f5441ec3a9a49cad89e682553ec00be925236d81db80ab060da24aa6d0cb7a22b9c50d3802ed15be8d3f2b6542b87dc752e4964d4998de3dcdc95c00479f03542d3e15b276fa36101282d85fef76096aa9d662de5b1edb568861daf33ff41ada7ae7761b37bd4089140f1acb13b71a1523df4acc2050dc379317d2b96c20ee2e4bd005b6bd615d079d19de0053eeeaac643baccc0accc147f85368c3f45bb8a7023517571c9f666c7c8f7066d63426ee5408b80a95a169505d49d93013220dd18eb56f25ed121f59a50329c64043bf2085759cba1fb65722163468cd90c648cd695e6207915730b5499e4ebb1b37fd779d90fc0ffa05bb0044763199a06601e25dd9b3e9084b733ff78e2910b788fe56d7e4be1c73a859ad0411938f1143e6857f1e249a37061d68cbea2f323af6bcd4b774aad346715aad414376dd22b68227f4b9f25da29038a5ab4b35007f37bd81c15118e3d082b50d53119786afa15a3153255bacd6af860bbf940906e1140ca8234001645c034a50267359309c55a5038d3c5fa222d40987dbf50913abed0841f29446750a566eeaadbfa7ea238f5d3831089170b6418d701004910d868d701b7f4f58c3d425bdb7fef4d347cdbc5b06e4d25b908d408d104224d97b6fb2a59452a69464bc06e106420724894d38992117f921b79603763396d7470cc6947689ff22840edd6a0f210d7cfaf3bb0c52ed55ed9259fa9166b6e369a9d31f494d46eedc2bca0b21fc3ba1635eb790c5ac08a4ef498f550ef5e8570ed53a99633d1a8d6c9aa3d12229c68edf4d22bd0fae81fdec6c48b6ebab4d0deb38314bd3afbdfc0e93764ac99fc998f5dcceb1ef71e5cba27d5dc6733b1bef6cfe6dba01f1b18fe9965c97ed5c97d26236d3e5b434f1b197dfd56418bb0ef131395d4ed8f215d8006dd664f04eabd29edf5bc75f204f66752e94f165a6c33564b623e5ce4e863d299e3e7e57f31d8c59fceea153fec9421f18e5679abc1af76ec72bb97865d4302b9d8b7109e48149b44bf41ec8e32fd0272b712a4b2ab7ee9cf427cfe93fa9d53219adcdbc5afc66cdd2c49f9a6466d6b9dc1c65f7f8f80b85f033f9f3f27736f36abf699f516d56ee419bc93af34732a318638c31f3c136480a4b8ca2849f9bddd3cbd7b905b8ef481641f74816432ec6449a1cd5eb25db5e7257c6452efe88e3df4adaf618e6a3d1c8a69da3a1f24d2fe7bb7c9fa393e9a76cd49f2c6ab6c9f44ee34fbf6dd776e2dcf4905bc7e3f6b3fd1897ddf6364d63fa1eb7b9ceefe831ac93cf45b7b3694da6e33beafa9a9e37cca6ad4d5fd95dd36e69e49bbe6d67e3b6db74906f327d73fe94ed66bb1c246b3cc8f9dcb73b9bee98a86a364edf96a6dff4a453eddf4cbe83973b1bdf341bf269a6ed5893739ad80edeedb17ed476ba3f2ee6dc6bbfcd45f94c9b0edb30fffa8d931fe353ca9fff206f14eb6ab2c953beffb4ddf4c1353af97734b29db4dde8d9b28ddfcdd2581e75cfb6f12b5ffee4ac8afee8dbdf5f209cdf35355907ef68dbb1c14fb3d98e351eb2cbcfb23ddcacb6e2777eb3ed328073e7639647ffa02633bae2a5f2d24e0357fe06ae7c29ffd21cb03bfbeac13812b5842c7c8a96dc2417c67d47b4883e3009efe91f9675b8c6bbf16374bc83bd3fc36bd3ddb4367de773d4e2e70ae0be235af45c4c66acd960089fbf6cfeb27d6fdceb15dad564d9a576646bb20bbfabc9a06b3668e463b6e3182a4b6a4de6836b5c96663e7cf7cb43bc32eeb00fb6813f6be80419e974861eef7c520e4927c61184a387238841e897c34c2ba294b9371a5d1763178d5042d873f93b87b9fee959462f1963942d8830ca8f178d50621af52b492d528b94d32fd3b2679a26b3c4f5f49a17d534190c8e4654464aa3bb53888db4a22a5d687425b7c4f5d329fd4b93a17123e29ad7c5dc75a98cccd14b999b97729323b1989357724bf8478aa4be25fe822df1d6edaf3caf069e337c2147e0a3440742081fdba1cb44a624f51dc122e8a61a04d893d112bdb0e9558c9fe14073e2099ec1fb62a4e38e381befa27eab18ebf449f70c9ecbe8e39f6845c0e9637ac5e4e33f93ef7a858b7c6af794f4103719c7d15e618f01eca30d1b0cf42adef42a6e231d7f7927d68e84e013031182399b08d32b13c7d2d2abf818186287773328aa535aabb34e85dddd3a153ef6de0d2e98e6e229dac3b44b248d4630fe1d4b8b85e95551acdbc8f20fc74560f7df2ef29528d35ce42f71b35866b1778b3ddb8e455b0036ca8868322817b31ca457f19f9603ca75cb8cf1f38d81f42a7e092a74aded255451ee3b8205910b71b8b005cab83005c63fc07d05b8af06ad53b9ef01003290cd0229ca2c177d110b8c9b9aa8ddfbb9b143bf23582871e3eb88ef875911d52f08888f6220fe422b9da96a8b807092a8f58038ec275ec09e8c8e427805e12fd7c36725ef067ef8ac85f7d23dfc850b9b880b3b041736111ba383437a3c15bbc844af1c0e893dbee23cfc8dd0a7933e439c352512b5833ed2a721f4814a00e18153e014a924a8feef1941c1c714952ffda2314629b3f854be94111a8135057c341ad9eefad7fd75c137a5f5c8d9c4fbde6b2d30a614c21863b4d0a9cf688132deca7bfadebb9ebe17f9d13e5f81d51d1261517e37e79cb2abc9a0f580bbc7f7de83f0bd07df839c09de7b0fbef7de7bf0bdf7de7bef3df81e8431079b01c3485a4b6b692dada56da161416b655f684a6c8185d7ab27e1bf7b83c3c220e42294e9215a165a4b53426b694a645f645f6845d9175a165a11db1338c1094ec8ae10238cf1bd54139ad0842d60cc1c238430527ed90f4e428d1913baf7de93344229af18e57cefbdf84388be36cd26e01a42f0b589d8755d578c16c2499de5d684072184451fb7ac0ee1bd1763ac813a32c608a1bfd2bf4a218430c6d8a54ab54d25c64e995b51f9a14993791f21845a768ad155ba78427c42c4a8c4b226c15a6b94252f9512c00d3f4a6b8aff4877cbeecdb29396c5cd1fc6e8ee5dc55030144de6c5f85e15a5ecc4543aa1321413d4094a96d26452190a06237b314608638c30b40c86bf5b3725b901efc8164b5cefde0206b7bb572b3a25a7fa05b71f15b9149b4412b1077f7178192d7d75dbff11852c4e80840a44c861350b6e7fb51db5352c77d52bb642c66a46fbd8e28816c11648a06a95d147b628c1650984fd6b17c7febbebe96393d29fd4d2eb3bffd1e8aff7318e4de73aecdfe8ba14fb1127319bf56ac63bffe28af88b8e454a5ff7758dae6b74494ae5a4f4a76b32944a3929a553363fdf3a5e38e2a944119f5f54fe15f6e47bf21ad9ee1a8db0f7eee8d91df33eec7afa9099601be0536efea4d7755186ceed23864444315d0411918f1a940fa21f47802c2104b8b9e07bd5cda5527af51a658b4145b9fdef3a0a8459af1a087b32beb97e7ebdd9b7f86f45655a8ca8f051f735e73f9ebff8f0aeba14972686445023a3691411c5900d307ec8c96fc9bd20b05b72af05dac4396daf4c50fd9959f13108656cf85da368faae8c5ef5ffa6939ac1d2f26e4a5c5d4ba7a8abd50d6ab21fb8742ba05be342d77f6549119b6b46ab5771075dcd23024291e844923804843be69ddf6347b6e46172eb8086160d2d1a5a2b63a0a1756918b2e2c5ca92953154e112ba84ae2a2ea13bd2b9947055c13b3b3b3e762e17d1f1d1dddd3cb7bb8bc0828970134ce4721133c14d683c1a8fc6a315a1f15ced47dbd18ac022dbc97676b26ce76645329d97f9c06286ce0c9d193a333ec03644f9908b3374ee0c22337266b4667ca00afec37fd0f01fd78db0d0b80263bee0ec71258c7e052bee00ee3b5205255a0ede9caa9f896effb831edf0658cfb601b283716d37dfad3b7019f5a9ceb8e232d0d9cc81cc59b939952fa36dea5967770eee4baf98f732367e3175af6e14018f6b2d309aa9c4ef4742a3d0bd730f9d29b7c7c1a5cc38462258e7e89a3a512a5a5a7316ec2a9a89c4a4f836bbc5b7ad6644aa7120ba5414bf474a2416987c3a5ae0365aa4f839ee8a39ca45c46205009f7e924f8c69e2b59a2f51f2394e78f271fbf1b7d94291f553160d8aef4a7ef6a8ad5a1b2312c0cfb52d7eb48d9ef67311ca809d7997cfcf737d1373dca7629fa27ce26de93c95eafd9f43d7d8742ad76b234257bba5aae3cb136dd8d68d0e01a271d4e6c626dfa62d99768649106db10e324cdbfef1a4ded33ed5f74a0ec8fc996ec50ea66cfdc7c1d7ec9b8f2754829252f407b99fd831ce5b2ca92babea271e2a724625c02b9e04a3ac98df14a2ba56522269a2fa9b4d134fa877d499a4c26abbd69c524ad9b6c973dfc371a914a9c4a1715b3367e47a487b6441fde91a521d9d1fbd2b54373fd6834db763897a5a1d49aa4644ec61823954f29757901d48d9686fee86f887ce0fc9c724ed33391c9fa60661f44edc2d30733d1641d1f443ca70f78a58ff9a3bfaef7c76c87bab4fa8a937ca8bfd9ead7d315965c975d4a69579ffe131111f920f2116b105c7a16a780406ea4255f5ae4caa7d8531bb505f08dccb6ab6feade8fbe6aef1b655a7a7afde9f4f4df753dbf8953e9a2565b935d13b41dcbc87699651b34fcf09a2c4db526feadfe663b16ccdaf4adf2b989fa261d4cf3646dfa966c87532d0d7fbc7ed198a6111bc9c99199d9426ec7fb22a39945448a4a524a66826b989e76367d3a9978908f514e522a257d19e326ae546a8252229009d944d1a5dc8331c2d8726913314a8b4d6ef417f76e6d1759df5f48ef1ce925b73da671a4afdc5535fa92a3924a29997eadff6aa5cfdc8ef7c51231cd9a0dfa1b2471f32b773dc69974ed5993e9aa67931bfdfc2a537bc5931b71d7d3a73672449a903272a3688a02db385031148c31c60919c2676e87cf0b6437daec8fa88ec5ec065e31b2434d866164f115d77818d9f8d8e4628c5326c6b8e43a9c391febc0e71dc8dcb3109b198c96c55fa87d9681d1be1f51bddb6f6e7cc859c93ed806f830c623ce1df5b01bf11f17aaba1418717465df8e79c6fd4bce1403464a3f868de69c7394c5388a3f9ae1794e151a5c237b9e32a8c860bbbe934a4c4a1d99ca4f154b335f85716e9cc5dde776fd364da33259b2700def58e5fd69700dfea6df5d56fbf7a44b972ffd25b536adf2f2bbcbfeb8ed503a948ec395b66b159577cdda74cb658a7da5c136f00c56c5aab447fdf31316f61fdec9f0edacf2244631393d0dae21bf3beeed0cce32e8801463f99ced5a9e7bbd9a81860c9a8c6373cea96269b00dcdd29cc2759d7aa88a517a18b64ba56c8cafc02fa1d82e9532b128fb7ce5644dbe914a3abc6d2571cf57304abd69b4b4c4683b9b18af166d628f5eb6e7302d0db6c13b9b761deedac7581ab1e57636b1e58ea0a643d3346d2eb1691a34a0ffa0114733750489995f4abbb49452be941c3b8b367dd9d2f0670f69c38a4a5d8f3de6ae7f23089fc2a71472cfcdbec7850fa39467c73c4d314b333fab0d61d75dd3f9d97735990e19db0e721dbcf2470de01cf821eb5809a3d4341ba48796067ef6194956d8411ba41ff5c8c20fa6a7ff43357de93721b09ff4f54d9ce94bff43b5aa7ed43f16e94b6fb2aa36fd0ff54fff83e951f6e606063f92b458a63f591e424c5fed8d101cf34df626fefc1bd9ab2ed9e72b95dba29c1487207a7c747894e888811982f9e11e5492807ea2505f07ea2c2215b9fca422ede242bd622ba250bbd47d56f5e0140c821ddc9e41eda25a80dfcb3f85862e1371ae6405da9667519d4b2ecf22d28f0bc94967f8ef6a4a86ef49e19ef7f35cfc1938f9327027afc2913e853bbd8a3341fd738f85ddf0e79ed210eae8b1df822acfe0bda4b8a75d5cf05eb2772770709d8138c807665d8fdd9869cb3d303ea619c02fd27212ed04979355c03ddc93d2fecab05724276c94cf00a76090be9ff624d1b3495139c53d56ca5f585410fe4481f06f4e2c24d91cbee22fed0d132e085ff1477143f88affe9a259c5806058369619923f3d42edf83beed9d9fe0736e33772f8cb7c7fff21fc057b579231eb86bf3c5690d050919216c93e16dcc12748887f18e8fa1026c23d33377a75f585d3d41484417803c23ff90ee6fda870f453b8eb555cfd189ce96170d8a7b8d1a370da9f70d93f0d7502218410b265f941f543faf37fb85e5a1ef2af9ff6ba28fdc782cc3d0a21c3d6664e2eca975540afc087d6b245d1e010c2ada6562c30ef0765f219e01b4f6c4e4e7dfa39a6bfa2899596d2faf432fd85e2dec52e4ed59453b53d3d0e0b33519998a03e46014317be9c0c4152849015774238c4082bdc2c08090f076ef7b870a109aa53edf290182174e1c9de947e7e5b1cf22f7b437ac983f4f42bc743080e527dfa3c4a2452b5cf579ec43d16c6d96361dc636d8f359393a37d0e16e18d4cc3380a872084dd63c369b8c9a0f97d806eccf84b0af7b068cf3a2a5cfc146ebe8adb3e0647fa140c0d05857b2c8da7e786af385b18965203cdf972cee72181261010d00cca9c7607201a3c875783f769ca9476a8de877742b13939dbc7cf216d5254fe13f75852568b23be9c2f5fda1b92891302597ad5d2a3cb521ff38c856bb44ed45433f27d782c6955fd835b7105137c81c90c52f9f471c8a7dbcb6f8bc374437ad3e3b0a2e92b176f6b3b74e05b7a1f1e2b7e6b3331857f7ccaa4f6a0f6ed52dd83fcf83f987e3e2bc1a9dace3c56498bca40d8e7e43bf699c979be5252cda03e7edb696faaafa09e3e0eab72f0527f898f42fd0967c265bdea61cefa37a7477db53862b4b087f8f27f882fe7f338d9e72bd1fe30df6479d06763daaf666774942c192a12ba0134c47b344ef7c0705ad6211a45f5dfe1065480db182328b9fd949f60221cc56d46c2ed26c06d8a0adf816817fa8d53733d26e9b72623c47cfa98742961075a4a98903032112fd2cf45fc011f36c285db2d749bb768e2070b4d345016825ce88cc9dee4c7b86cf740f4aa26a54585b62a913e97fd9b1f8820fc855945e08ef785cb4cc4650ec1e5572423447cf840a9223154bca80fe8ba7dd4a7a5f0dd9cb3a3b4dde468abfe7df7e9e8a87cfed7edaa5755541605b48b3f118bf373243e46d01fc41f6bd9a6a89d44cc0d7f91c157ba9af25d4ae5bb8ff1dd4af51d4b07f3dd4f7c1938f92adcc9a770a88fc1a9a08a53b1529c0ac2e054aca7691fd333708f2503f7582adc63a5708fa5e21e2b06f75830b8c74a718f85a59ce7afb785616161ed9feafd107f52cb83befc495f5ad59b8f557a427d1d315cb803246ef77e6652905fe4bfef3296d13e7681f6d1604ad1597a37662382b603bea6a9faff69289c101f1e2b657372e29f7c8e7cd4639ca1708f856d52544dd576665a55ff7c1cd6bb38a855b555f5107f3e8ef8d3de0831f99b136b6271c81b94c561993821f11fab722a48e25470e372b2cf197d0e7df939d8e75c9f339fa571efc2941bbee25c8b0e05c57ceafda446381c71b807c5699a0d79af993529c8560a887882044fa0207aa0025cf820073a28c1149c80c2054f80e0899d931f4c1081144ea4200a413e50e01770122609600ba86002841042cc8b2b9899afbf2e1d2eaee0819f287e8c20a3c91650c42088b0051e58d193c516a6e02dd86208d97d47b668e262f71dd9a2063eba4cb763dc6e5ee97faf86c7eff5eb870369e6b03bf63fd8b2b9bdbdbddb8790f0fadf6b8e8ba0a85dea3227b9dcd1b0526150221beceeeece291f72251cc054fc323a968cdf7b0f8893fb4cf235c947d90ddb0584dbd9cbdf5927ea15cb707d50b9db0160453579c356bfff75b067b88d52faaed6279148241289f44fe357033f89f321edbafc590946df9129c6e567a91c8b7a07be67379640e3f9717f3f9a87484abb340a2e211c70cb619320db19f2026911444c14a4b3b92ecf8cd60c9d0e40589399203a13813508e26e55baa8424f83806ee42d05b583b7cba8fcc8915f8bbeb2a457ed435c8f34b47a15774c1ce8d007b13513a4c34410e5d6413bec6666d8318b1981c3957b10b79f631ad6a46ef734024624a29c0922523bd609520297c829bf10433120d06b262806b5631dec5d5b87135b2a55604f468411c612aa5f54bb38aa5dbad76edb0a57b40fb0289c18c1c006981352e8415683273020b40fb221a03841834ec929e94b18e3d54da8f006f0be2018485989acd042176c104208b72c84dcee57d11411463806122290b8fd19929691db0f4393e9540a09263a4ae014155f68e1f6a3d4e08b242e7cf82729f6e99acac1065578210b3e8e104317acee7d89dbad30d8ddddddcd25a8ef42134dc6b5b8308a30e800006110baf0533ec88548f0420c06b8f0595a60c4d0c4858f434c08a87847c660c585bf43bb68327004821d9c08008622b7df14a476758911ab0b9f664b7870e1854bc670e1a7b44bcb85fff065acbe90830b7f06fc82186e022efc922603619e167460fc80c21852df85b70b2a70b8fd5548173c48494128a1078ca0c938145ee8c2edd77ee53a80187b4106a914349971c54411ace006bb5ff6c68aa9ed689596056fc4c8442fb46e07e0f64f4da62b075210d48521b73fca256a576314d08522ae852610c2874a11800ba9545751eed08f16471811c4470d5e20830991f818c113ba82a563d9d161e9586e4baff861f876cce2303154bc602ec8e08654bdd85691aa35455b3b9175842173c708e8233b2e903081b38a002472618315741091a09f20a05e7917a6b820c211f04712f50817581851d42bcf084a7ae5dd8ed625a8540a920f083926f4c415bcf8c1086650b3fb8e24e9b9dd6341922871832437c8742abdef48122446ea76df912446187d51e57d479258f1823abaef48922b16f08120d47d47b0f002241fe88015b02703875e5149e90e41fc078912daa54b3111b76f38a5b57a4baf7a09689dad10e4c0b5022d1ab2407e2b7ff694afbc2a1972f43dc81d89b6a0e43e243b4566dc77640b462e4662953fbcfe2aef686a553f75c1d097fa5ed887e5bd786be6bdf0cf8db7fce53db743f48a67b8dcb2e2766f49bb8eb77a6581165cf83998aeb8b0ffdd1c3980c008126affeb098df40a7ffc429dd45bde7a37f013af06ee874a1806437c440b565cfe16d06556f7ab96cb82dede32a203c433450f127c9200848a214a20c2c5e3c265eeb8e316b4e0ddd0cf0e839deb3f526ee72d258278ab889129627095b89d5bd1add5edbcd5798b7d18880f90219c8222f9917d0891d60fb786682d192203ef064fa2aa667e567e5433f1e7d5d0721de7e9f156ebc781822e336ce95c6620975ffef80abfed9ce7328e1cfc3f58f00fd601075454f5a17f5aadab82ff62402e95d2ab540fef0647a2aa5ec6efd02eaad50c6e154b8b02da45058343dbae7aeb3afc711978b0f79c5222ba70dd629a0de6276c55bca220da85ad8aee782f3bbc95fed4900aa4bbbb9fc0c37b49c1acee7b265c87e9afe9f9018f8d15b7ff75c793c4ed7f53c6ee4df1887680c1ed17dc4ec67df639e03de1f6f56e1062017caf5783ab7ef0c73e65803deeeeae9101dfabc121a352290e3519523f46225151fb796cf1c748b285a5571dcbfb793fb51eae6edba5dcb74151bbcafcddfccd1b141b145714341dbcc7457404b93c240ec5cb0f044fbff08f9f1a252effb8fcbcb8fcb11fe4de0d62e4be7e43ed2e85a79a9132b4a445ed7f5647af80e815f7f773eb75da055a869052cb3adc62eee7d6fb08d906d12bd6d12b6e6ee574f3c48e3c95e945e28303fc727c70f93d9eeaf761ee9a4cd42a4fd5747840525cfabc3d7ced33bead71292337026ddda2764f284704a015193b15efa5ae663c29ffcd39bba7b69313f294990d57305d0b7f2311c10a6e97722bd46c3b40a16474c7afa3a52840757df641083726d487cfbeba5551df3d82a0776016202c3e294230846208a108a584de4f0a275fc5c58fc1d187c1cdcb84c39ec507080c0b4c8e991b4240da4d09274a160a43faf893f4716ba1d4a784522d2464d2342270430bf90372089d4c5192b64a7af81aea336032b13939f465b7c0db6de21e8b512429e9cb78e284c0d7b8d347cef4a509f8e7785fd082e6f24f8f43fec9646f48af9ad92ce9b5e8e0e969e9e48061e9150b0ff790922405f408f48a4936a4e79c768121942328f52c52e7e44d9cc9d32aa7aa63dac43d56cd112434946348670892c5808e9298a3a4e3b797dbf3306d5eb91bbef2862aca1621c02f9be59d2b9e161c021d7f9e82f97942a03ef5aced207dca3e6d07caaa5ac8c9eef0e1b172724e3e7e8ec9979e64b71702bfbea358491f477cfa28a577fb60ea16549904af53334039ca2f897530cf6a0faa5f2109bc170ec15bf1f78fc0bba1dfdddf17d759e7d5e04f91d4f8a57faf86d39bbe3eca35d5ccf63e3cd6666f84e030f9ed6fe49ffc666fb63779d50cb53742502c8ed2cfbf39b12af8f4da1b135bfa98469dea6fcfc3447ab97dc9f220d96753787e808610f101d2a3f3d3239ca6252afc700ae32f0c43a79532f96ef596c487c1d14f71f35138f926272813eeb150dc6369eece3c30546e13068583431837000c0c899a3613cae6e4c854ca7bdb4cdbe388bfcded377b234b42269722e3fabf544ad543fced7fa06ffa611ada608a7a785eaf60af5a9bc939bde95b53f5b06da5bf39fdf6258b83f4d2de989e44a29c4952cbc314a364a82848080806e682da901f14294ad3a99670f873917661a9bcbf219837340463e80d696fe8fdc8c0c93f811123b53d9606036488ebc831836dd474aa946230303191c77c2cee57ff86521fd351dec02fd10221a190c227a0e3d5e028529414e6fd00056d2824f9279f13df848442a53c313d8d4f7a92bd31b13c4c382c1ea6277d89e3210487c9aa9ef43c4e369fcfa8146ef66439eb100d0000000000e314000028100c078442d17030cb533d133f14000c88943e785a9a08b328486114838c418420620c21c0004360680a46ab200058a94c6615efff580384dabe2369e1b2f1f9793833fc1ce482b9fd9fbf693cae090b8e2bdcca7b8da570da1cc8910c942d6b96a3c8ebf3f12e1b9756310770a95f49881fbd48f4de0fbea466f076015ff961e44a74f62a3b6ff82abf5d6316edec222f6921385655e72653e354d987a4e85127e7c064a2519e33eaf90a97d795e6099861ac23dc964b4b6e63bb269c1d104f9aed8bc7b104bfe4d92c82638cdfa9515285cb9a266c27e170af4fd73f6e765e10334c2eddf90b2b0c9758f992b80c0f40d5fef28acd44531b79e52cff7ebf3805600c2b307405b21afb09657e31f157b5683589bc2f285ad043192a7c3f6154f2120aa240945cd06c14831a153b5594b56bf01c79a3fad2610a45621f78f3d8c5d71d6312eaae31a9e3c09901011a88b3f0dbef8cc0491d546a95cddeca5b2a42192c49fabcc42c65788a205785411ea7b4a8e6c02556bbc850e093980dc7a4a38515eaed460588be19a819aa3d108f4bc7456cbcb5551a6569505d3979d4849a0dd048fb193f37a33f9d549f8841ac4439f2123ea2a704a642b2ce180b8ace6874db99981e220691210145fc53efa76ea1dbc5ab0b4577bd1686d147ec4f70bd8c11e5223dde268d7e0fb2b77f44fa064794b75347b423ff3c431cb4cd058d3101d4d21cae95f562d8a8cfc4634266a70b91c240b9b838f2f9c8fbc839b2518da640e7ba2d28533685f2d072380b8be37b26e54a6957234d40aa1d156519e798d050b6d883f8c745ba3e8e94e51ef6c42ec1d952900cf2dfd53c684c399231fa60269bc86cd3581da3d568ceccaef62ad608530f98829d35bd7593699ee7cd9639ae74e9619536f2e16dcea9a86e791bb06be03032e82a28e07ead6b58190fc6f3efbc1b5cae9d654bf8c6c3900ca60c32d8df4c2ca889676abe67f81222b3765d42c7aa686f93a80130f2f34eba06fcc850a876cda36322386bc7a4e6d6e22c1f65cdee4addad071a6f9c7a4c7f7c07c37caf795693a53841a842a1be57dc8b82a7f3c45f3ad95e3e02b77cd4f842e87bb0abf1c44b61b240cd563942868183dc3b84983d2f69e6dc5a5602b9ba6ac245efce4c722717f64c6e96de12fa4897258dbd6c14bc1a1f3b52446d0f374b2d7ce79d5bb66f97ce1b1087847a1f1bd01598de42fc3dfd9b0dff75ac7552a252c2865cbe59d443625ffc0de7c0c515c980293cc93c3bdc3d9c11bf3caf71ba131665eb72a40a18bfa9fe1cddb56306843a493fd6d7a86f202b58dc0b31dca21e4f6561e06b3f5152d364ca4ad80248af4336af98594cdf8b026082e888f2574755f922a767926f86271011d129ad52d84833aa453752e8edcbc25a2b4924c75524bec891ffb18a2ff7c0da88e2c60c8bf7415f96d4bb8f73ba09f6b0c7405fc7d5de49223bad30c8739cd8cb4438ac7aba1f421cf6db29edc8c211cb88e33741af8ed9941652637b59414439907dadb17b5e7621c7ab276738f7e4e00d5912e9397056adcbe7f3bfc905ef365a0c5fbd4deb640c25a8875babfc266867c9dc776a3ecb540ee0b3027250ccfc59af037f7a86534c0e1339ebf0d2a3e2466f599397ac30488d1f49b17b3018ba7c1f5dce32222f21997e6703d56a80bce48ca3970c97f15ae3f337dabe0ce630804dfbb6234a1d900725ae99c77349c7cc8a0295c142dbbbfc6877d3ec0a1eba25831fa03a202ab3cfbbd4c13dcbec270d0410b02601b80d9130084ed5c5ebc8882ea0e211e760f05d3a2496e8ad7ccb2f6315280efb00b2d3113288ab5f8b5f3deb7205434fd05d834bcfea3062f41baed06acbbb747aced3fc8aaae3116e75699800a0a4080cf3bb642045d4c48a6ad77eb50c09f93e19249c086a187c4b059d0734f92f13a3bd65f8965cdc902e34ca716e7ed19352b2ad0cd1ff23756ea52be58cf51734aa1d7c005575f0be275497bd04163032244fc2e6697c3f438551455067d01843e1ba5d3cd6aaa5e002aa3ebf57ec65334c89c34cfc2f9e86b96dc0d3c0e0c41f365fce4962e28f436f1b7dd1d70ec1b8e157c79198594631807fc5b142d983d7ea8bda2e927c7e8d74bd402052d7eed0b1fd7824e026c30e49506f5dc217e5ce4a424326cfa7af2694e20c0e694e04102e8b49de14f947e7823a5de895084e589fcf50ba02a7786a69b843104a1a10ec4a2724d2fae2a41042ff493f539b2c0743889d4b5ddf8823ece20379c7c31ccd3a5e4683091c03889560195d9d92c68c704a426675ad9fdbdcc583fdab534c3455c5ada471d3ca8f465315d1b39e653679d6e3089bd62355348161d1a2387485a511d7588db67b7952edcca1e5782be21fbd1d13f5311a5e50de59d1f8e7a430dd2664e87ebafe228b4fc50dc27ea21d7b7b90de3e1c3151794d5dcd2f17ac97bbd03eb2bb4d6d2ea72860cf66875ac9b004d7752fbceb6efd7f3b926cf50024dc9003e971bf9749813fa23fc9261e8c34ce9e79bf8a7162c8fc1a52bb008cfc8bbba8728430bb6db3d43ee9492e5c69ee24c513f90cfb387153830f99127679ea76898f635487c82a84008c4ddcc7001372a5201108d6e36c4491151b133329c28083926930ee9a4b994d44a3529bd99b93bc098a48749b8bf805ebca66b83566b2436e553452b43e14198a609f30e47b0e5b901f25d447b3f7e069878485b385ec8e55f0b523cb3c76f28b36ebde6bcf7ef8c57cf35fe421dab6307aea233e9c020b22a02a5e90176e6e725a78b0d85b72348b6419161684e035068c2bb0c09b2f5d9461ce1ea33dcfc897de3e57b2846b66a7eb6d87dbdaf77090c81b38849d2bea403de2a8e0786d83f791bb01391ee310b7c68ee220f054342b15d92c2e374a0a7184c1f9299763e906c326afe2fa405f27d47be3e2aa813cd69fc0c1bcc641140872a5d4196db40609313ecc1c8085c4b0df65a4a12d64f36f270e96137b1d2bd17562a9ed4ee4f125a444fa38b15976d11668a3f2d0fb6d94b67b3d15009bb5018ee3d3df03dbae7db052f3458dacfaba2e213e5129109709137e042b90913cbd30e6a70bb753c118e00266458efe8e0c10d365cec09e83e7f675756b3b3215a77a4d25d748aed06fc32f8906b35c6da6114e794d0990a50540d7a53521349dd7b3359279c13dae4aa4c75308f451606cbf53c21be7dc6eddcf665bfb2837c5642dff9d7d91268613e30b32a3dbc5e2e6b47ed45eb9c7a0045a93a32a6a4553211493f6085dcf8f9ca702368d32bbda871f8a4b29c52301db0e6d494d1848f27531afc5b5b7843b57f351caa7a6482acfa3b50aa8c72a4106d0f916acfcf4990e93e6782b5469073d4b00a9adfaf1a765760202f2f7a47f060ee63b208a8b67ccf35cb302b344e14e545218cc42fdb89a0814e76f9de20650f13ee67fe3bd7be0a967b808ce0f8b3d962a0ec91ae79b1f887c4e676f3c00a221ce749f9514fe21c5f708f16fd0b0dbcced8214097657862be86678be569ac13e3cc4379fd1194394ac0234c15dd415b5727a5b4c17451f739a6b3c04f95aa324ba33bd0177a3bc6b11a258c59e7024bbc3dc5b28028722676861671e85381154a6885371ebd84ed0c35b62159e86bd89440d64eac39e83282694155c87c4012e0ea89e66e7972272740de11a0811bc8a1a83de7ab4bc6a533d9d833ff1faa6cd55df89141992e480be7dda1ce658f966eaffcf8bbaeb253d2462c13ad0944bd353a61afcca21155eacb85053da036a75d59181a05f21027e228a166f3034a8334f1d35cdaca74fa83d16c40c44b528adfd0ae1ae63f31446ad6e0a832f3aacc2e04250c672dd951131637423b0b2fe645e9d1ad704bb3c31704fe2cce19465e78d294f4ef23caa4c635710342c757273da01b7d3ae92447d7ebc0ea56ec381f71af563cf034e6bc1269ea53769e0a0764f7915ac6c08907c419edce569c5f0e5fcb40757f9d22f4a8aae23317dcd6414b21ff7c29a268c1d76c56b59b8ab7ea50f03ee1009f3eba53d3e11a255ca26c11e06caff4b3188d25e33eb21ab38ddfc11c8ca85fe5791148a483daf0b6b9508265a39e8e179b2084c4de499d7c0732df7646b534361bb9f4746c502335c268ad1c981ea4951bc8f244855fd92625834a9bafc0673d2637eb82e761661bfd83679b0478f115ec8e6d7cd4ba7de483be3e53ed11fc54409a3553dcd4b08cf8193882d51dee7528273a3243ee6d4b1bc3cadccac9284126f811d2f033c8bdcbd3d6b137f2bf4f0e29be28a971ed268f03d35e62a0773de442c3696b1e09e5e3394d87108e8625fba125ee2e51a7a85f25c4820d33769b4dad948c0bfbcb359ee34a6dcaea99c5a6b407c74db29e2fdee281866f8ffd12e725f73df4f61ded2849d15e3a9c05ac435730e83faa7141c75232e8a909042f9bd101a55c613ded7da971826d0ffd41a24e5469cf04e0714e3b998adee3bdd4102d15e4c3eeeb4284d6b4ebc8958b81ee9af9af3da8925d632f772da5f8c7253b5c7bdc692f1d7a9c9e4f67b888421a4712d49e843b3e42ee8082592f8f032e73822c06689d6fff4a843cef62585a1741621d0487d23fd90b144521908f3c0270a7cdeec4024f989dd150d6f3438e88b3f7a5c819af40a2be098999253862023151ebdc872e419f98dace0e76ae4493192f3b4e087202b5d3266f073b4f8bbf41b7d535d5e6020705ddd30f915ce78c8050a64c184226bf93c3ec8d8b0ae026734b2a802d413b53006d24d80ba4e7829f8998417cf606fa161e066008a6862e72cfa74efe55be8674a99409029b8fdced6c8f8aea84c7fd07655e86b3f566bcf771aed5fa18162f098e101ed8d0640d7b72a4b7c6a0de4d7fc7edddf78f62010ab1a19f0890c9c10a94fc11983bc44c143a2dee7e51de43d609383799b8395e22878b1605e9b9dc3f0d5279b9463e9fd6f5f2b73c2bb62c61033c8203436b07266e5b52f61c63529a80be87b9bd151918319a63c38089af684331ceacc08aad79586861a3dd39c894bf499c75300e71f37b8aa3ebd575b398d1d13dfd6e634e9c7eda8aa0c4fba4f21dc201710d61aba387a719a39e63f770ad90d1fcce0018a0d96a5a3177a84a08339e7115d4b1185d1bfcb1eacd82bee100c51c63734fc05ffb9699e073b3dac35f885f93a72d14baab08ea700bc025c5a1cf72ab8f99b99f5fb47103d6b1a82d86ecf89e64ef0044c033261e15b86bbf090ffa0a253df6cca0fe4075dcab6334ce586133af109978a27606c37c5074c44e6f3bec842183b6fdeeb4af970b9db335f631443926b61031be2559a09952552047a12ca8a4d5d48a1f65765677a93261f346921c935cc0542b31faca90e113bf2fb3e3bcb2fce30cb97f553cbd1c9237a4d6480eae8f132de54f8c33b85f456f8e0facf57493b712fdcaef292c8eb5567f0d383ca1a2abeaf56fafd0d088090edd4fb26e7fa0207fb03c05c3fb00ae2df58c54b638647cf21b6ef02217cb83bbbc82362d2e4542500bc1588700563a61f226135232a39844e7b0104739a2535a5a3b783e70b3006acf3bf1a9686ac75f6e2af6de374b2a399adba4cf0ad25e633784634ebea22ad3ccd0ed2b7319a0d44494498f789dc13b0ee07e95d15e91f71308a02b6c947491c9fd2ff1973622bffdcb1ec246fc2c701e9108b2259e359b9c9b1f7bc4954a340cb27c3b9ee079603feca15013b2008809bc96ed71f9243d5c10637b0729320dba6f09c505f6553244b39cceea296481a155567390d8448e8fb398d808b36ac0bc3d78b396724299abb27e92fb153889ef2e0f6db4cd9d672b87af9ae5d7bc7414f493737f1a699c588d6fc2908d8b18604e9a37d15e8bfef3050df21ccfa4a70b6f2656d62f717a391ae3de27c07120a3712ef01026d5612666fb15de203e90c192dfab65c77ce65201f1cc3625de490c7d2253d9ab7a7b5a13cd81f4c013058e1d2ff85d41b08671a81aa59292a66df5cc4f70b78363c656fa1ba8808f4be9570da94992677103c0390568813acfc70c4bb6eb58d3a7c8e46d45cf8d10481bca766aeb60ad3715351b42b566492f77f7ef491225b0f3dc220c56ce341cd82be4e786aec65d4cab81abfa6fd2b4239f115986473dddd14b7a1e6c052a0bf76dc79fb4c92496bbc476244ac91d7e91460c796ea8241f06c762e726fa072fdb07179832d39e37b14aee3d51de1cd0ff99603ff3b1a9a16a516fca19b7de8a883f73b3b91314d9fc4b84de45e0a894c9a382a79b65c9effbe3151870cb5c65dc0d038fd6127f643fd43ec533d8361ae3e0ca0b5f9d1b5149297447b6a812db9de51b94d95c924b46d29c93d5a20127d6e1d2534d899bd19e5816835e01c5cd7f01e0278554535f7215fc54a3fb6c15757b3f178d1fa50b0f08531c65fea8195bf8d0552034cac996ff8ad59c31f6a8873a0fd1f92c166a0550ddc376283fbb78cf01822c9a304d8b519a9730fdf058e3670bcb1a25cdc43513e41826cdb431b084a94713a19e65a3f5c7054192b47a430cca16edaceb5ca3ff69b7e8a0de27bd9802767bef135c6276ab35039136325cc9f601c4cb9d2ffc3618974b863f9dd40fa168597519aee1f8d6f427f03d0e2ec25bfffea39d09252f5751b5f5a0f0e160a4e67767a8ce1495028ef0b755ec914c8b7ab00d904d4d28a81ee1326d7b3cb52d16273e77bb3c1afc28b4248835f81f8be241bb5b3e2c5105f284c0da0b7ac24d2b6fb5963193cf99b8af601d04626d989fe0f3b1887fdb8383114e8e7cda770e16b20c62b33fd626a51fb74d233b17ec21d08a2f010f5bd41f18bce88b754125e6ff139abad2c08c059f2e79406326d62700a9da8d2d7673e42f07880e43bf84319e6ac74cf39f7e48b8593826780cc2a4ed20e389e3df4b0c0d6fd3c9b18ad2b271b4f9e620fcca152cb9bd2137255376cd3efab07b1159aae35ae066e1df466b01cb29dc4824ba865cc9fe0d268c5a7e52d97b65693215b244f3ce6f9ab2b33872f8162afac74ec3acb9fae550de179c7ce3e1e005b1444954262b012ee85981f44f4b26f7f6a74e5d884791c77e4af1894009da4bd7ee15ae13870c465a953b6ad2c4acf144bc9ca9028a5e78a085d4566454a06740a653010b6408fba1b24bec52ea1bfc0976faa2ec3481806d026ee0ee5137a6c624b6cf64fb7345ab90f5c466dcd5c4e630aeaa8e59efcb33d9c8b369cf08983d94799e8dcd44ccb4cab7877157cb0dfd9455cd4d707321efb4d0fcb376c229f6e5994aabae7e4b1a80c3c29a305e62affd4a14c1f109a862953f924b413d9e1256c5f3e8704c483cb92b92a832f33d2949ac9a69067b38fed433cd33345172f708484f2a106fdc22e7971026a59bddf900f33aeed3e0f21ba7d61c4b1412c78c911982264123c1410a51c34401be71ae56141b5fe3053f63cba098743c9f99947df70ed6f597beb54e9929321a93dedb3aa32691ac132bc49cba816c4662a87a56447d552c831faf3b29386078537ad17850d1f78defc6c21cb241cb01baa284a75b40ef7b8de061c72999a3cd3d49a8c6c79a29bf29445d3f196f831df2d844f7b40e0b1f05c0865c2b3dded0fd5010839b4cf99068eda27e16cf2501d1e1080dc106af4404f19164979fd575f9c48893fc01c1b12cc9b176e6ec03680e58ff8a7777cd558544905e17ef57297ef2c9bbe3a634a06ac14483b17530b4c0486fd0151e4985feeff420982fd29957037cc9920081ec1265c0b50dd53b76082cd679a5d2610908d963130ba3a02c26a68035aeafef27a88d072e268618049fd90c45c9cdf111954689b433967d85094a4be261143ae9a44bfa16ba3ce6255f470c5f819b102cc1ae1a4d810652279bbdae97dccb6e6b81a969205940c06eb451d28bb12c0a165f12512af9d7ba211fdfa4e7e806f1b079097fc20792f63eb6f34c9b30979687d2b1a227d46de925fa229c0689f111ebb108302f38e8ec5ee012b33ed7d32feceffc722abb9a0a9ec22a485c1a205e38806c6017d77b926eb7f2971ab9f44b079b676edcc6ce252fcfa51b236cd790baa405413e66e5c72741705bc2674206b9aa004357ce71874ead70d9512bb3072545a138a79430914355da8ec7636119654f9de0e905c0c5e5d67d22c1c8421cf9d695e619f44277a46ba3f2b54d5c53993355fa559c122068eccfdc2f610aef7c800851b7ee9c51eacf7f943131b6a4b974f6a9fbc21a85f386cfdd627badc57881e278813ab100d276312ae24b7d48fb61717339d42fd6bbf87d2580ddc77334b53d8cf65b4c5060e1262e846b46432fdbdc5dc449a4070bd5cf8c4ac1d1b4218f47964df4465230f25c8cf54c80297228d6b0eda2a9a36fb4b1391cb72d3356f4823f22343491ebc35570d0fd4f3830b4d441adb886db418768aff443d185c80d3d9fbadb5cdd03fe1447c3a867de6b341bd6c7c120d0166b1a6f7347f795f52aaf5273e6cd0616007159bc0935a2bbc0c6b6e8be400c581f31436d0c0ac803de55b7a0a1b3f2c68f8950271ebaee887e758fabdebb0d78384dad2c4937440fa810103e331c72c9bbbb42f2cc519b3b83e8ee83812039e340ccf23a53ad06942e30107fdb3f7cfb71da168cdf9484898e005aa92fe8bfe0df243ec92d792151d52ead5fc10c9daa3c6c4c0834b095a2458b3f1635c80fa55cc0c5b532cc0e00db4565ed330b7ef89aba3e634705b62da68252020241e769e99be36391f82466e92673552cf2412749e290904ab9851efa6f814b0bcc39c62535f4a72ce9f993dc882ab51516a44e405bff2ef65636ed8bd5091080a596ee205399e83e637cbc56af07d0ecbed4c0c8a0f2cfae91c90d6a12ab117584fbc4f44e4751d510c0aa0df09da42b0b957cd1a0830f3469c2d8d3c1dd2b5870b3f051d63b33f707359b9f6f0b2c56a4955872f651d4038c7b495189cdfd38221f0b528a39ab2b8c1c2e0a28fc9b46089822a0552bcced5d3e2c343d7c7f1ac8eb9540565144e4f891649144183e8b86a282e318129a0a28652ead76c6ac6344828805648ff5cf4367118f1eccd5d81d2ada8c2e011d02177b5d975a34e3b2a1705e4c9e060076b350c9e9ba7401bad57aeed391fbe9437fa74ff946440918a49866cbb4bd9d8fe148c9c3716a937bf1b446c1a7326491c9deb8f9d4b6dbb61eb5d056e6abf76eda2178cc5bfd85c72e4fe71233e63b62ef5a3e9299a46cb8c0981cd82c8b2f4dfd65e59ccce54b8ccd43457007c601f20d64dccd28b46572495d7a8026d0100794400940e202085d639cec0d61e6f98a1f078dcd5ad77bdbb98b46aef7de92a6c84fca34889d50bedf1ea751db9803252e0c57c097bc4dd6617f4ce7311e5b7ce01033499f25eaf8bc85f1694766db53b4ec9886157634df4806b53afd40dedee22f4ae4bd3a44115c156e79e743cf08c12d12428cf37fba37facc673305beb4322bc0370e740c7a02436246fc9076a4a76f8f4dfb08c0f69077aba97d8a549c0721472ec2f5665ae4e83c88cfcd19789490c8af21ddb5722eb2ce21d957612857cadb6b2dee878da19a371e84440e8d4c5cc36f0c0a33d5c719a205bac5d8defdd693d62c9bc4e8160ca40b95e206408b1f918cc900cbffb8198cacb92e568747890c017206ca4370ada2b197ddf4e843c1438f5f7d4996b4bf4f4df24f3dc2849a0c021719fdd9996ae87fc9560a817d0adae360fdeba1d81231fd4047c907982a30383b30ebcb3bf37f12096fcbf114a616faf4f83435040c1d017af3e8f5e5d8e11ff8787d5365e8f62bfd8301da3491964ebdf4e2badcb466bbf751e7204c60ba918ba533387ad5526e86738c941c427ef4fb5e7cfb401cc90107987cd1dcff077903cea60d642bdcbc0b268263ab58f386dbf5ad1abff328ba5996cac8bd38b6aa81387e3b285031f5826fb2b6b2a98e86fbd581040548af97425eb45fedacb3c08216994044a33c9ecea129838ae57a025ef2049748f284ba9fb039c9a9382735c213915b6edc3c96364cabe5b0fbecc5710dae181f357157fce3e2dbc10a0359bd7e04d0983416c3aa01e85b88b887d8687eb7d4d198ba711896017c0799ee2c83486b32458cf33dc9828351c5264975e9978f12cbb0999c3118da6bf590dc27aabb6ab1ed721948f653204b5b05713095fbd531d241ac7df16a358d1bcab85519e6035d1f846cc005f224d53aa4107a087d596bf291df8753143944737eb8ca258ba4d20910ef20d6bd2197e8bd1d164e1de2d7c50b0b0ce108c9ca64ac98c59d1943685e766923946943397a3ca4314ef70531fdacdb8afe89930e8be54d2481f924ae2709131026143b2143b1c1bee00a2deca44ff42b1db5030ccc4742ca6519cc881e21f699379a0d5f14aa480003dc3c0923da3556036e53a3e93b1664e4cc906cf0c4c43a45adf2cb717a94ed4337df6aed8e270c689cc32cc65aba6c2f228280918fa2f108f6b36af0c986fce05fd3075657fbbd174c9b0ce58bc75224e26990561d44ffabd839e594c9bc8c5a340d0ed96d0ecc61781cc164e3891e6cc2cea1b191b387c6600e7129a2a16e0c3636076ae8179fef1b1c7e46912f66126ed8bea43980f53dd24b98caccb3ea4d79e63e40c57b4b0dbdb20a30394a53fba358e212dc39ccfd2dd96653026e4b99c05c99a7278562746c3e5c90c104673a1778df455a66ed6a9b6da230b98509f901933916055b4b09612e6e01c58e5e5d25fa4ffc8ffd23f7bb54af56d688d2fd07f48551959c11ca7e64fa0cd2231af9a1610660e5a8af0bb68699c01aa534626841a7ffe462ced74cbd5f77fa2786665459c4be725045fb2479440685031d7f45011c5148bed003bc37e891eb1bab3c4d6a980e4324bed881d73c35e2462117bdbcdd0620878a164c5bab0bdb779bfe2e818f3d540d229f70990867da3792cb12940b1062841ad1d0b0bf5958d66a51fa645f54aa0fbe57e1480b9214aa4924724318665d0b379537c5768b2eb076ebc89610b2a8a37609e9fd5933b0076f38a8f602d536e94a96f1f87c09fb2053f989b1dcbe706a920301cab438b7c72907a9a0082d36bcf80d85f68314f54f91331e51d89cfdf5b1aff4edd1019f7164f2460c3ec16f5bfe6487752a613857f53a2aae4b28f89bfd16b568066d5242005c5df99f39b9a0c7effd2e6ac27eec6849cb69ae726402a882e6379cfa761fcb2e12437aa281c6f50ef326919db05cee753479f6e7561366c542262b185b6a0d5b149a751f85aa321a14fea16776321d598df5b40c471def14468c4532542152f0d37ea6c9fda0c4d399697ea740dd94fbad975675fa44403853865df013fd26452699b8fca2174c5d089ebac8281754eaaba475f3d8f3f42ef9789f076e3d29eca7ef30385ec617bbff7d8f4d6ddf05845829986bafb72bef278be1c644cfd0db6fd9b9f3d18ed16aef3855c3bc35c8362e4529d625cab141b7402f0ac141a4d4a81605930b813807183aa51c0981bf92662bd83fd6fb99911f1acdb9485160b00735f8ee7769557b668ea3b53fdb260d6ea68195fcfa2a6b5b7996d5fe856335bf8d8455e6cc00cfa929f445d59b449b5a38d27a5f389133163ff7fcfc70771b79dcc07c002666c63173a2fd1fe233f7b71d1ac80f47896017f1c777f341d9908b8aca2bf61ebd56f4f19688e246c93148c5dd00e20be2530713d3ef74cb34c63ad4bf8ba5824d7602edbb227bf59c73cb36fee3114d736f7410fe39a5cf3e02261178152f12219e4e05705ed14c4a57f5f5010e2501640a0f959c8e1a1a47b857ee91ef7a6bf1f9ec63011ba1882b464c89861aef7925b5fad7dcfce7d20498deadfe2591d4a8f24438bf495720d1973f321d144a3313e1f22ce484188292d4c58200674ab0bfa549003d2834efd22b8cb6a4233846505dfbff877d7df63bc5593119d99371bd8d8a094c5879a93f64acd2c28596e7c9e6cc161e9c9d978afacc5cba940f78eb095d38dddc5498a0a869b9726e08820c2d1c629651ddc9b80e0654d992c4bfc420367eb79b7770bb0157e2d41c76885a85170d6f487069038488b51665de1fcc463663340c6722a55e96e3d5c1b0dc1cb1a993caa1b42df3719c53b828ee54a96766f5c53063864765143577bb428bc1e2e8d44f0ba466e87c2842ced83fbfc5e80c6b052c7e0479f92aa501bb3601b427471d449595f1a073c3a5bac877be313785d2bb787744248fb4427bf07a061583126eb4cb25a15630ad7d00240436339e2f8e6b499ac837b23772dd766724e0dcf9eb46632ef3d681c578a403babebba450cbb2c60c8a4db191dbebb2261ad346dd7b8b331d101f9dd048dd14a30228ec4987d70f68dba8e6b1135179f9369beecea0f47c64fdf09c19409f7131cbdd455d0e3b5503c3fb18f48087a5a3601ef9ea0810fb90e14cae0b50a927fc6b4f20cb47136b063fc1e6e479877a60aece116e4553d19f7c6ddb19c4541aaf7553e52412e8854c295a11da78666f545619d1d77d751fd798d7c97d71fdb940ca8378c8912e7c9a57f0bbab79d8db63cbdfd1a04c26e3fcdc17429cbdaf4d099ec19c871cf1e4b07f46b9fb13a961e391c02e51d62c8b7cb6d7f5f3d0c961cb8968fb2784b719beb8da01ac590c7d5588d62619da50d8bebef22cb23a3ae0f65312abe9c8f5778570d0bbd2318a7e8100654f8686b5e1bcddb005e33637669c330b513fbd834d286393129e49295a8c11210a2c7accd1b8f25f583c38e54ea128542e5a65b00b48295d7a28a55b2016d6273b41cad2592a77801b86d6a85de5b8eb515eccab64444714e71289386999a943b1eda6805b530da328b9893b6ae0ef7a8a71d6828990e86cc59c01081ace9bee530e7d4e8cdd42acfe5aa456f1e1517f7965c1c4c68ef20d724b81e6ead753318b9e922908a11e44ba97fb7aa1ea722d0d28d5e7bf431df3bdf38ca22cf5f6db46f757cad655ea0d39a1bf2a8c4214135a666df1e6d869c298349c8ab1b40eeeb8f7dc2b1b9500fe28992af92e7fd2e4b6a9991072789f1ba75450b1c24be3563a1b7d3fff935cd12a29f7e9f0d05092824d657689b09229a6cb7622812cdd8d6a2ebf8f2eb5734d7e1c80e4a3c0146db36eb87b916e3aa9c7b9e680d4bd048e01fcf366e02b94a600f1318faa267e878ada0d724be87e92bd0035042f656638fe45ecca489cdf32ea6a64d2ff397d39f1c7829b6f20690d8c35c7a6b2b24d0687af63081454f082471ef55f480047a95be36ad8656b0f70a7a94ec5542af470f65d758bf8cbd58e613e9b1cfd6010e7e562732b94f092025aa6702b3b1c0bce806ceb55bc6d155f32946e1ecd9f66dd59414eb420ff066e2f63935ca7c8459e76175065dbe18b07d2eb0afe11169f39cf28adde70c656c2f1c772c094583d464af9983ccfd4168dd67d11d0914ed3e62f541efe90627b5a71a51583baab6ea6cf3d59511e07dda7325641b12bcddacd95347f8eb993e5dfc6e33f5d46cacea898b7e2f3e17e48fcb7ab50c99c9fb893edb00b42ed7b53fac5d719cac4fb1f05b6df67e90614f9801a45ddaf8e6ed6e21d40c7baeda87fbba0c56e7340c5c8774e5cbb027f5937671151d954b0b0fd88c57e40098e27a4a3a71989c903e0867d87344bcc0a4d81870f42762c211889eb1c81021e24d8f83d6b28f726adc694c0691d4508a9f176962293f33cbaa6a06d1f749badc63771223d41580b7d8c1b20cbc05cb97e9e397466ef0977af0d523a7129e4afb2039904f2b1ab50765bad2dc24869c315db3594a8abb041ff341d8ee2671b4e1931fa0d78cfdf01718aaf0c780b98df91b8ded5ba73a13fb23d91b501dc13eabab800883d4b08ac83a4b6b1d1356c450c3274597780aa7395c56797e434c5c9b49c10a15460e7a291c138004b39bf659ab9266fdd910a345fd7f19412292dc3ed3099458f093c857f2297a22878a2a9cc36686a6649cad48ed77c97cf600a947a7980691e284488b3b632ad625ef547e2c3ca0b7cc37352ad24f78efd83dab4deb6bd4836db5e44f545ff77f5dc16591964358f7204896895395c36f349e245a8fbf485b003bcc8d47730924fb4966e726617b867fabc304797518bcd8a7182d2754252b255982e287e60f4c757ba99d020a743fcaace752c9409ced5266bb89c6b60cfaacc9fa75361f677a232bec74a28a3e0aba25b6b8a8edcb8e7e290f94d834cd4e5a9991aad3ffc741b80c23b58d65d7a39012631f692cba3c9675eeaa49e7a0add0c5c08a9b9c37fecf5e95783dd8cfd576abcf586856ac053dd717c514b959bc748421d8d407a46b030eeacbe4dce12d0f49dde04faf2caa7eef6c58c7dc62a7186a60c59ada310bcc09068c5075354f88e9e2141ce74de466201663c43ebcd7bfaed2a22cec67e7eb8be55fcde240896c58c1da614faf3cbca328243cfb1565af9c20c60f766f91e98439c1b5bdccbc40f16b0b2864dd2d6c4a6d121329d7cad65919a12c75a39d7b3417b9dba360fa3e94a3420c3899387bcd5a8bd958b4e6a2012c3f793a07d72b22610fb7b931bb017cc5a3a3a11ba952e29ff0e58afc19853ed15b1ca3e8f07f5cfd43a51ca7a9d2865a8a4a5b732b3f6f9131151892a3a56c7064b23c09f0f0c3131f45958e39a29aa2cb2dd1f5a5764d80e8d28fe76f2800eef5f43b9ad87d29423cc6fce3b4d80040253bffdd87ffe55a0217312147965d1e9982b465c31be81c32796f04ab9857e06140470d8f669f312a0b9fdf71251abdb6c51aa4def3e402ebfb809f1bf246651b3e3bfa555f3318589e6d5e9921fa8c967a1e0f2f662d4f121cd2deee62f511dbfc41049bbfe1cf75950fed989dac5e2d926fcf507da855bbbf38435697f6c167d3446bccbcd663ec18e355e018a9444d4a22f670a15fd7aa08954a146825b0fc9448e803b65475f06081d3e0d5ee35c29b95c3055dcdc5ece25acaca2a59ee52dc9ddfd22aa00dc81d45b92e9cb816a5bba4cb41d13508e9e2c220f2a170a9b8b46d953f48a0071a1f1af06ca991d7a4e656340566d7da1123bd0181ee643485e56356102f7558d81705082276205e2ef102559474acba29c35b4c8f4d55f16305015c3a8a59bdef11c0a9168a659fae6b42794a96701a2b6a845dca0aa142659ca2ce1e86c36b3bf29da6b9bccdd3c3feebed10a01a8b4eef5c0db07720c5d944b3f3f195a98e7a2ea91265e825400b2aca234956c08eb1913d7af2f264f08380cb61c952c62bbc0edefe697b987f1fd57b43996ae83901458bfbbf470155fae318ebf23962b015d6775819d3b519a8328b525e83a9f2c0425794b5040904ae7265323e3c6696ee5a1dbf7a5dcbccad40ec6f9d1fc254eccf0968b4b0a3018a52853a38e3d42308206abbf4111f0c421586e1290e94403c4b5bb2b9b45585a45c2b75c471842f4bd6afa73c0f79dd5811a971444c88f0fd24e5434a1d779e0f3a3b6cb6ff742d53dfd9636d37828ebb5d875944a0d16b31a2f7832a14466bf307f4bd3366073330d7916fc4a103ca9d5ce606a3a2505789cc78e63a7dc10895aa53f47bd0e8263ffaa39a1052945eefe81ef474cb4ffd214d64a4160da5c43b09e6b4cf54d9d89929e9da76dcc35b6bfa00b61b4c815255806e0f0a50365ac91fbe77ca986abd12d2d0f85b4b33eb41110a5d9dd840e0cfda20cab6ee62a82641a5d47795c9f4833e9488b74eaed9f8eaa101bbed67a8672701d0a2e4dbbe67f6410dcaf8a1253ce7d9dcb0a6470318487b4aa7669f1dec280b5f090e13b911ccfd08cb57ea802215b87f7c605a16feae3cd507d95197afd4966088105c44d25553dd5dea00cf4930c3c85e20577b270b717f77f0f06a12b3ea22997d28f3505ed77c03e7eb2945ca77c07ae53fbc73885711bcf5ef92bf26db071ce34917bba36e491d357307d3c5324d7568c734b852af42fd569b763a13e00146a4c3d13920ba981d104a0ee74575eae16f57b6b60e28b2c9079e1b3f4c1b2c2a4c75740e6ae47b11282746d4781508985683054b139ad1ae5c05730cccb40d163b2a593e2b561f1234ac45896c12ff3fb3595847d60da4025fd1ef680882f7514d08627296b4ef943f433ae67d188706a8b71e501650e358f2fb4f975b8b106ba5de4fe1e049d545ed8941910101d07b3e886af0f493d91ca2022818bb6c0baf4c6d7513dee7e66c33a13bd66973aa69e846ac3fe72e3d8df12faf19a804d05b41774d6b4f52cf6866087f81c603507aad24dc147342dcdd818610d410de9351f5f1a8b38b7da63a530286ada80795bdf00e49184363d617679c37668d1c8a12f0e00ba7466e3cfb326907ebedd767459589ab7ddd7f9c8a59796437b8329e40225f70b6df13a3261f768a39f6f9571dd8b4b6df4bb5039b903ac214d20a1abfe69c324f67eed39c3753bc948475e04d7a27a15cf2a48f59bbd521b0d058afda5102914a63c55a8b44e329dda3227da0ffe252640d327e30d25b62773b8616062363d59a26cb3193494858ddbc89471e21eef9caeb5c9ab844223e5a89703165350f3b21505ad79ad09a304afc1fb5329de49c13e865727be49c3de54ccdc905c0a9b1ec19abe634cf4d21590bca40a01751b4c5e508589a0c4290e58d371fd32239a4ac41b1f1dc1b14241a21ca26e13bd1f89a193e2e2b06565ee75f7209d3bda5d26c1df98f81acf849954bc6f55cdae38a30c3283c6583acd24397636b460b0847e7bce99943177788fc3fe1bf53c163194c92716c3bf9f17036183d01208fd106d361ac08d10391f34114fc2b8d80058748496b58c2a6d497354864dcb81ca4631aa65729cf8f6db5043f225c98c5eea672d4ad51cf632d84127ec9bead032a774c2865b9fb3385cc03f113f0dc457050cb02493c1fbea785c8c8f16d418ed75e088be8f7313e68bc1b88c4a35fc39e503797d14803a01ac9d37870e952a90dc4522f63576a015844a99cf74741704e8749d945229cb357dd4e3ef3878a68f46a6bf51ca529d77c19971ea94d7e9d1fab14c031402cabf07aca65ea57b9d59b91acf91d7f18b7685781fc6238a626b731d13237d63666773955a1dd41571f4276ced6142beb74bcc15c57a0615c0b3b3e7ef3b3edc511d9da98836dc086b8e3077e2306ce37c8d3f8b8ce369a4f4505d2500557a1013ff431282ea858725fe1fa6f3eed49d52db8e72bd58bb16221c24957ce2c1b550d52647ed0f758d69dbcfd02c64b559924ef31bb34459dab6a42bebdaad3d1cea54d94725478f955493f53a9709e2a411c4ad2498c073cb14a426d76c3aad6f08459e22a856df1b6205ed613739d44059f9218c36b765c5991819811bea11aaef1ba95d879432f929d7b03762d106f5bbf9c4abab2c18d73ce8ac87fd40d7121b844a4d72ed2bcb2230013bdff42aa1fbba7c887407d2fd44244c178b01cb4c262313e86ff6ff27c53dc071d51ef96ee50360eef0631e31da2e024ad96c80337fd1b2f27ab847942befa32b191491a51d8144c4b86b324ac121275796827685d954382f662f95b39c0da7643b31396a6b9cb7181f232ad9e7283f7b24ca139cd3e35c4da865ba8a74c39a66668f6a56e4c0a4b75fd688e246fba48d9bda0ce41ad79d5d03cc2491b6015628445b6b9b2cd0acdc96bb0bd9de7d72d2e4273089c6029134b6f77fa5213749105456ed713218c144743b1aabc43950e4e03c087dadafd67fcacc0cf6022f639bf0eef14988bccbd125fed4bcea1a62a096a69e462a4a940f5e993e0ff7c82cad95c020aa67ac5dabf5d2761cdd313d2e6f4847ad6edbd383850cb853ecae5db125600c7313726a34fb7fe4fe2d9aa3be282729847a4bfc79dcf1cde6f23c323a64d134c5ad92c252a2f552baf014cca39a8ff6faac19c9b48b798f1c9c73650a3647bbfd596537a1bd9ae8163e10d83ffaa127df605e00e3fdc62b79863fa8e393d4f4b4ac281facb1fa587dd55c54466880cd459801b8addf0f205300ff31a8d9c3df5ca4d55040153dd1a25d1e734b51d9f446731e5bb541825e3a19af5a23a87d6a8c0c3ae55bb411ee5a5ce96b47a6c7eb7197dc184468035a9fbab1d6283012e6255594b45e56bb6227462bb5c7c4090a37702027267200d81ecad1c8ea5f3c47d9982851f86096070398ef503a69070654dbb82693b46372924730d74900f2c7fcf3763e13fcf645055fae30ba3e815bbd5e4897ad6e45c309576a6faacddd2163e9d10d0df06d21606c2df12f61a2e2b3f7bd29018e395d0a692c3b8540d3b142b847a30f96d0f319e820dd1acc98580abe8509a7ed409e467e753bdb69dcbc9e684a09ee2732f10a541212d1efa1d4208c17a42ad623f4eaf6abfe45c901015f97332d2a878a68c60095a6481d6ba3c7123bab0b1822be7ba1685d0c2bc1fdc1cb2be451c5a99d7476c67b6b129a600933e6e8851388fc5b06027b80a9d8949d4855cc5d250f832c9e01f66592a91af40403e79a326eba3c3810799e438a1b66c1fed61248a2444155b69996134059f4deacd0dbac108de722c1d6e1a50d741584077a12834c0eb76f4111f8d3ae85540539485271157d410245e6bda8cf483809106603ecbc633b4ac827b5588932fef68a4270c285e4d9b1c19e73455e5edb3895c2e090db2b1699e79d0320b1eee0be02bce4983a72a593ec7fba45bf1e74138b4ee4e3dbce35d5c131267b14d4ca490e2ff92dcb3f50c0190b18e0d96616ae710d31a073970231913c546c04047b38d08b0d0b393aeffc750b8970582106c749d7c021a7fe096585d2eb4e0ca28f77b12910fdb030963f7b18405ff20be2ec76e75269fcce4e458c93dbec1500e22a8361e9cf10f22f91171f0c7ba7e215b139ae4640cb405e8bcb2cc4fd9f65d80f3b7004b4e1a52490389c5f19681eab8012b81dba2ade793a8904af18d5f9ba6163550ab0d80cb3751dface1561faf717a8c113cc14f465b3c6f08075fe6eb4b41b6c8911a3c93d93dbf8d5df54dcfe6a9cd17550461f3d0a49923390dec98db6381bb31f5bb58607db3c404b809dd7cc349a2efdb0fbb752853a98741a4f33f92f30f20386547c841b9b9381e06eb002a4e5194cb92934d6349c15385adb5549ea298b564828bdc708a9fb0c263927dedc4de47dd0ef8d6752d1e53b2971fd3623afeb66fee73a0d1a666238701d1e746e1f9bd95ca5c7520c8694370073dc483d12955f767d5bc58c23f1151611528eea82c3d50277b205835016e2229c8616ac8d37feee01e4aacce959a21998141429b9027b088545473e1be1a0fe004815882a1a929857eb63937c839166e9a444919242aa1ff9487882c58a4a1c6058c92745d9bf4ddecf8ea1b40897afaa492c2ae7b72d618fa083017ed2523a07cb2a89a229f458a57586a4c0d9ef04cbb16f0a12a93dec5d525a5d52375f683e9305fc04b6e1e384d9c9e48363ba8dcab8ace1a89c69264b8a4905c786498d1f69f12c21c3b73a93b86a9c9f1d21a5d8ab420f7b42788978dddbb6e8407de23172d0b23ca99f2ef25755f82bb70f3501aaf6cf775bb6c34eeec5b88a20d3a28e613aec85f4ab6313d5f2238087f1f1c93d49c4e59bdc82b50262c05a75210c4fa88fa28599baefa3e1f14dfb05f4479c0b0870f5ab9b8a988c0c88f230855f822fd6a3a70a65c225269b37f185517fcd9da1a6993ab9810ab2f4e70ed3f0fa63232102a5e7a36906332715a729c5a9c18788a9c8a3b32e5322ba792ad05d2322b5efbc3e3f96bdcb14d61fadd32f74dbd4812bf5783ce0cd8b0f85e771c0914ef60da064c66122910f435d5ccdabd24a8f74085a3a90e950ef68ef8624ad063fbdaed262c029615a386e0f85554186ed149a13dc90bae864006ddb845f234f082fb36edc80db1d91b665936fc066a375990b0ae338cd9109f7c255decefdc6eb43b34de4149a23574d678fac01c0d57a673148c84403aede4e6d36643100ab90edd499b7eda42cfb8c16703c89d55a6d3a74992cb307a50b941ec9dcfe46d5ac96e8962911173c7e35e0bdd7e20d70d9254386741c246e31959e4917177e0fe26e0ec3a358e4f4fdaeb7a5d80498b7aa52aa16025ea553cc0470e759fd98cb3b439a9d33dd009d0949e88f6d38f80305b7a2a125145bf07fd43233312018aeabc9afe923713c985deb577c8e8201a128b2ceaebaa86497de491d8f9216fa957faa946741226e34062a0e809ba2206077dddb422acb36aa7597f05072cee1d54abaf7bba47a123c6c261a3d4fadab4c51143329c565d4871dc4d1c97c436b2ee80405f434cc1044a377e06e9272f7f3b84c7494b984b1ef3d0dcc38b1e1ea43e1a699e89a88d66be2223b80fb2d9df2e757bd2f329c719aaa4ab0fad47e1cabb8b030928bda52ad56dc478b1c4e281ad1ed306ec1a1537d68de8c720e5793392521cc28a009ba2a1a1294794fa213ffeea27118ba1ce92cea9d382354d89446f168b88948685b58e90902b736795eb9eea5b8b25d12db3604dd1fa69be195cda27b84ed51f0b49e7171885346ae2e184aa195d97130e71c9dfee70ffd6af293a9ad378b2e8ac6d44f38ff886d8dbceb83884e4ac4f4e6414286f90d24c75f810c97a778bcaba8887336370d030debfb443b12eea31ef3e796229c26514044c9efc8ba215f8eaa150bb83561087e0cdec5721b339942ab971d5a6b9538186c4f042b10ddd6e0233d63b4841cae560ec74c0a0dca4de251c567412ae3453d166d2f637cdff9ec2701d9d0f48baa0a6081c61ac0ed60c16cc8261f03ca11b7424eccad0f36d3662ca6e64970c2d63935b1aac8bdafe4743932b45a4aa7428f277335cb4d043475364c6642f091add0716ed37c4addff9644cfe1d919794eeda1acff0c4d0f42af5fe923404dba1f46b5e0dbd1f660ed0f1ba294c5ce4634c2486915efc4c13c3a458a221a38f915550974609418ac9a1f11e0b7a8f607462528a890cf9df3c978f3d95037742976c97bab2a1a6588c8d45c43fc538441248c7dc11e9ba0738427f962048be456c594c112079772d6dec4057cf3f18ac90bd5d2b8f260c3e2080f095d2e2fb01618192ecf86537ecc58e0cee204cf6167a33de1e0f9b220e5022fc618ae4ef57f0ee72a85e031cb67b7d31edf2e26a1ef57f93074e6c09e69673ee13680ef9896dbe496878796357789b6601d030de44dc6b95cd70bcca1962f6f5caf7a871624795d3945ebf7243a7f961936d3636186e265ebc8635279979f28c4a56b2f0707aae1ee7469417557740f55590bd49100e4f87bdadf54d8bb51512f05db42e8dad3e8e5a9ad4e1805b997b65df625a29b77719a06fbb05de559e2c7e8cd4be8dda79b491088eb7f56d6d845dc9f6a90d5c036c5ba2e46d00c1bbba98e57a9d3d45c7534cd3b9e18a00d8201003b66daa1f454d77b062f68da5448c0489cca7465469370a891681d3bbd3ad259c4a8f62a78fd7f00dc9cd4c04c4273997ca352cea3ec7827491c1886111642a94568d1a7f4cbae9be3531ab83e137dce3787967cec7fd6f2980da7adbdb888b1dba7f85fc440b1f4529b497188701887e7d07b6ff641602fdcbb50c9c916cc41c980ff5ab23a5b7214f4d7a1bf82580ad0f9db7adf19823f702143da8e9cada1290ac467d72d4dc86eb860747039c2dca0a6ca2b5b5f32dd43eb9e04e6c59c1b03958690f1773036a9f5728de58e515ca786bc1aa76343ad8cb0ccdeb9aae9f7694779f7051d4e015bee13107e36fc7eec298573402e223220536e3a9929ce584211e1a967d8c6d84b8b72f5d86ff8506b79c4c44cc64378e04718b2b532e8f3a00bacc8ee4e25963dd914fea107f57720c7ca89c90c9f141e3fe9b7554a72f545a892bce72a50c4f3522cd0749e25428003420c6c1db6bd162dea40ad516a7a883a14bd1e4a1c63df147058e1105f902f557807f57d15302c4c681c9ad9c646173324c7ce25caf50a1c1e9e1bac27e5c39198602029a45b3ae0368b6514169789b92fea2e08111256f96b26996aa95b62709df74fdef130441ce0c9fa86d1e683daac925ad62ff126129c4053353173581fd5d87e62769652d689b7478502b080b0e06401cf5c43f588627d1fff42789c3a33235187cd4d743b69551e7591038c17dfc8eb22243dd3a1818c82c1228a548e0b075d3614c41f56c453c5a706068adc44063342c8ac7d167785a24ceeb68621a4f68c1a290ba1a0ded9055e08bcb822aab7e1a6e52a8eb57cb2b698e2f44bd9f1f819c7aa1fa9f7e436231b69c8d0fb9c972482f475a569c08d210d339fc8ab4fe80f265b9dc5932f6ecb40649884f8ac8c50cc0599470a883f30edfdfba9f11cbd98daa113a603fb7d70357b1390e055a9236f907eb026bdc6f4631dfe129aec14c9d69488ac03513c5112ca5d42acfa210dd2c0e5e83b52f09e4efddc01f53695599f7bad5b9a8fb2d193526322ffffe2c70e0fc5c5c3c6d32d9cf40f01d00d30264d5168125ada8efdc0107b6259a65447c1ae53838c04ac5bc0c1bb3b02ef0964460b470de4230da456c81c4731908762b42f50c3693c3e6d65e79566576a48cfa381eec267781052d65c2fd5863cf18fc6d9038691fbe2e721c06543cf4555b00df5dfdc7d790145c1c344a565207bb0d4f57cb0a7ba2681f235b412b595e6328ec29e03bb55055ce753876b94c03a9b706ccf4f6c9a57b4d402b97d1fa606f3b0636007bec6f06f967bdcbf8bb92db69f73129f0c5ce19bc350851f4d62a87f4982d77285f86cd134e0047b05ac6ad9ece32b5aaca6a687cbd9bedba659199c12ceaab28b37f5f3b0b353e2b816e2d6ad0ef0a0832ca5c10871128ede41e486fa168e84797c5040ce9aa0698a9e5c12b35b76c27d722ac20895b3654ba039f91411f9337552bffbe3ee1f2df241c49bf481a3c5c7010862af380342d6bc8d65dfdec77bd90d01ef8067144b21caa7b0bd2ff931a10657a79235136a2a8cffa60b1de1d21efa19ea20ac7e30be43fd1243cc5b156252564179245711a9fb34478368a031396d2850d8868ee483ffc945799b686d51574fcb32c9782d3c15d585623383bdfea9549c958cdca53698f6410677291d525cb6480141ff1de03cad8c502c05db84ccfff1327527f7f77687bb1a503657877e37e5e1ad4f492813c760584bc88ab8e35b83216bdda280b4f3ffd5b416afcaae531ecbf68d54a2f78b0829a87114a54a69129cfab053653c1d42c9f4a23e8f869f6040fd4987ad00037d756de340d73e9fee30a8113953d515120875c6e3444372d0885be939454cf9aa93c49e93f227d74e1b124b6aca84a2e84140ffaacc833616930a4c1593d98d41c5ff3ae8817c9cb442cac52245bc4f021deaa8b5d1077b94baa0edd7baaaae6d15df935c8ca4f9d779fa3506abea693be21ba1422d309ad08a5e2ed4db2d67065bea67ae907240eae4eb9f40c19383b6d6c0c93ada661eb5c34910a50fa273179032fe9f035a4d328a05edfe515e4b730577a4f30bee8578a6d050e3d346add7901f7eeb345a55fd035c785026cd8786799f82a0892e0aa3f6e3a432347998c1e3ae791e5e8a0e5bfd048f5a43f57f81ad31485fd06fc19ed73bac8d9b8847b5969e1bb4c6ad0ace222aa03b5b963361bef3ed2ac4d714665597e6aff8d87573b73407b8908998a410700cdcd594a367cc51d1f449ae9d8bb2d7c39a007d3fcac4f5cd0aac262e17316016c7ad334e4bc17bf9bf540e8ff1364060c8145f88259d9134a8f98113a0d1860bce19d92113a52526c714de46ac09682e8d7766cee86c7162c7cb2bc42e58f3cb484c159f84a721866c9a14807ae69332026b5e0d620072b9ced2e1fde8d74d5bc8625e17b58a8227f3109d632ba07375e0606a08665e770a0dc8cb29cf17b938d71d205d8f17546208e4f65ef771dcc2483df9b46dae4f81295d97181427e3fe83fe0f7c27662776514379b23bd99e949ec0f8b142fd913bfe77cbc2efa9ea5c6be1953fd39d0f54a8bef8920befef2df5f50f2bf2039566e2e35323ecc8ad068e50021210774c1e318937b527b147d9b97e755bda925000753f6ce6e93b28f9fac963cc9e06d602ebe9641ba01336aa80c71f8ace4b0bd40ab6bef7a9f0a9496d0933fb186e9e6fc30401992873c5828cb687d10585ddd06b47551968daadeb55af2746ccd3281410adb0664b4bc4330f3b3609f725b6cdabd610509907c5c9ecae789d322c9e3e29e0d43008642ad2325823ca198ae0e5de17458aa258893e898756dce7dbba463270cc3bbc4bac557cc32e32bb760655e297f716862250855a91cda9194d08a864b4632286b450ea107f3916532986e3c80bc6b23390846884880c03e644f1959d3a21a9c9dc48d4bc8dba4f2ed35f14db3258496870c5cdb198e20ce440c7a7dce589a945601aa2885a513dc8c1e535f795fb55fbc21ee18332989013a30f686c8693e41a97c1640a1b0990caa0050868610094e6d11a86617f63b3674eebabac1301a6e5abc2f972a86f91a9bac1da9774055ed3b81d86b98c51a7a3e4395648b6bfe09e57038cc8057c6ddde8b94aef282bfc4e28f8d306162123d266a00de11e43fa9cc6b830ff592a71520c4b522c517e380bb7ddefa6bbce4028b63ab0f687f2f9be0a9895950932a7dd29032a2ca5932c08a76ef5412173bbc30d1a9298d5700288cbf87cba32c6c682eb7e72c592e3b05063c98c36f00e55b989eb2f68c99de50b869a7700d459ec2c201ee5c4c2b4abc8d3894f9979585d5786cb2491d508d54dd89d8a9263d2075368dc22752266d9883397963f82f35ad74ed316d8dabc19e52a4fe3c2cfec96edc0200ac9977c3f2d2740d9bdd9f26c22bc2ce6f12955e295d9db57e698bbf2c7117b2a5a1f513b5ab0f21cd4dc05e3b7b8233a16d336b2898df1002ec4a660544bf356236781052df20350194c2c36d534b66f9d03792098c030c97e4c341437c26a79fc4ab8101cd2612b8baa5b9200bc571afd60d414628b48fd48b5d6a6106855f4832762df3c390465feaab675891becea58952aa44573a1dfe522362e4da160d6ed8680a226ff443bd57a49c5885813d91463e8f6bda4da1d2444c444c9fa34e6ac9a3067e2023841bee124b9c50a9a44ba96fbbd7d3a817510b96d1dbe75d30dc7b887f43704377cbbc1e37d2a0ec7c988ad222a2ef6f5ea672c354b8c9be09c40c264a218a3633b2e17b809aee1fd158a2671b56b51e0cb4ca0a7684fa8b521850777b1a03087ef332bb9fcf9b7f33957ce24c25dd22b939c34db9519a098fe09e051c39269ba4ba2991b3d6666f4fb2073244b98599a51efe25b8ad896f6807d592b6a9d9b2c7c3b29198e01062a72dd821f24cea2abc039a347ccc0176f7678bd0cb1959e4b8c631a0abadb2a2a4b74290f7918bc50a57e4f65fc9ea3dc0360c256dd77fc96b2105dc20c811c2db941b8ba4843765509eab35b783060604b50a3b9d44193296ab7dec2c3443d0ce68c7dec6a21c768a472766b1c68251bcf058c4bbd1a42da5c9a0615f3a8f1e37eedbde08513f6971bbfc644237ea6bbc1f4f99209fa73f573c53b6d060c8423383ab088a06d1c8826361fdb16ece5cee32351f56ca1335c7e1404d7ddb54309ce291fc7671a90c65ee5bee939c11db1a846f0907547089d7a62b8b636b800f5e1bbc063d02724a8cef5db3ddd3eb10134edc649def795114a78f46944b25625a12048ed57d64f03305d157218fc556f2b844cc5ace5165efcc33ce5e592503d47d69ce6bd749791a7384f9d080155a8191cde34b1d297628373ef93f4de3a1a06c5554babc8a1c32e7f587749c11544099034abfcca898270e8536aaca94610460b28d52cf01272f7ca12201f844a7091ad2b1285acf009cc3930a76c8b82e2e43176bfa394f13a82d70707cd51638b2bf960b01ca598f6d4d012b217ec9247621fa9d75894aa8e856f6ce9c30c9e1f8cc85dd383178853d84678ef5563a5d12d547213507a2c3bea3dccc5d377f5b630834abf1306c380445107f1af497c04fce0bff060f4049f7c585543dff5677c4099c7e71ae715b17828649d13686bc47614aaa1109cd9835f2c8a2c1cf2722e0718b54a427ecf15f07d65640f7c96ec3e43181e484b206212530c3ae1c62f37b36d25461f6d57a19662da52a25d41b31e2248c347eeb98e4cf3168b2bb52cecd132aa7c21e9e454ab12f920c1dd3a2e746ebcb08b5f881afc97b32664a3ca969e02e78aaedaab92c5308331e03bf7822a29db0f4be66b75da2ce863f9c48956818a9a316dea1736994a0a101383d8bfa21f6163150919dcbe41dc30dadd2f9b0ee4c0a32c6c2e53c7d4e0cddc11ed7f365a60a223113330303b44b4bcf9024e2f91949ac4dea18727b1ebe4ce3de1f67d263c5b292b1b8dac8494ec5aac36f0d0681a1b9ae59c7fabcb498b0aa76a082f072fcf12811dc01b8af83676a00df07a1407891b37ad365b3d171d0bbc8dab7a42aad54dedc173d5731a784143ff6ee6cfa449c65e14ac2081e2f0406ac43ee40dec8a596b27bd4de1dcf542f21f4c7de9f7a0874b792c253494f0e0a00e1efb8918a17d4b1e8d8f9af826fbb656a71ec637541cfdd779d9385758922366692355f5d1a7f8979d6eb2a75c0bf00481d7478852f35dc3740190511e76ae7ca208f6a15f5328276eab0aa57d0b4e7f1c4c2cf7a82286e36695797f300dd687fd4e782bce2070bd73fbf9ce9093351f4002ea07b0547a835a55ff11164701d66f349169eba69b0e09f1a7c76af54d591037d83f68e1d893d8e139be80423711fc59a2b1f6b746fff4518ffb5c0c359343c37998215d8f08a334869c25d4d8a15ece72699321071c46e807bf0b944140d509b7ea76a265e5c33d88126a5991a7d78e002876093963ee76faa6616a2273fcf77391364eca86fb586f020d0f3d917b27643ac42bfc5d8e5a0076c6e357f9e0dba994b3fb0cd3c59592c1f17065c32917a67dfd942022554a5756874e811761d77043c0909a204e775563f89efddfabba8a1403aee9f67244053d98f91898b7833746d99a572423d6cb1b1129b4ff87dab854f0628f5d9ef43c269359cf2a18b6ddaf91dd7aa940f9d9b154dec92921b3c6ceb6d09746fb4e8a13bcd1d929af3f892a38993ecae71778d01e49f0b5ed1f9ac3cef7324f88a384b0f2a578585f321b9e5d2eeb84b5d7995b0fbb513ea377334e3155901d209181b41942ed8df7d3fcb144adb5ac8d64f8c824da1e27076d1a2c908620726c77475243d50b6c1ab26d785df9f2677e649e1ecc1ce7a96954ddbd3b8e6c24a8db15bee7f788d31197ea3587daf3906d38e7deb16ebdff4574af0bc36efbcaa270d3b57bb0a424df436c4101846f342b4abe1ad8de337199f20c31d98e79bcb6e2534b7ac8c1759586b31008dabacb7a7fd56ca8b11431c836415ec9d4fe49593e34cd6e06d565d0be96736398728f77051e936839e335208b9c6d7434859e9f8cdda145ac08ede05b5a922ae182a78a47a282247d1dd24a894fc90023a9b9bc5e94d21c7df0d633915f73b14f36815acd92557902b81f90afa98af661fdd085c5372a41907d4cda9e150aa5262ab03cbc195ae64305909dc70865b7a842943cb7468c365d11ba97b10289d207c8815e6d929436449a99853327391aead437905588811d3b7d75fb4c74e4eb0ffce43f96155041e1bc204e899050ad03613a5bffc678a6dbad5139ef51448c7c648bd748aee17a4d7131557b0632f5f8292b471c69e139f5788f8785a2b12836d0d6076d068725557bc5bd174e153437603c96baa4f912a8b904879cfbc87d829cc759711d02fb3ce7d7b09a4a734ceba2cd85da9dc275665a7dd19b4aa94a5c03e38d3afa803ced96bdfa34eeaf691c236f80d16ea409b30d4550d36bd56daaeb28163be792e77dc5e53b151464c8f0d88e85e593c4b4637231b921043f01784dfbc3a0d394d0041582108ec8da12b683690591d368fa976aace2dd36196e24c29d0d0d0538cf5c77ed6ec1ec6e28c5009a73145e6193431f060515615b61429bbead88e009926abb5ce0dc1cb948d61ab06444904338e218b36999c3411d726ac556e65a8254a5d13b7bd11221844be4fc9e7dbb1ad137f9aaabad6d8c622d1b03fd2ce64445633752a2a8c30c23d7c56b7d1d9b1f94f53707d23074ba887f093ca9da867ba9486b6cb9c8eed2b5e69f7d670c006c53dc487b27d152b3aec4b5d1aeb8d1316d388db5c568ac4dbff707ef0521a14b8d55c09ca3189debb1d2b1f8fd7fb2577e2c4d65badef7a65441eeff65c9015eccc3265455728a7cf5ccfc89e9fc75fd5c4de38474551947f19af4e04ee2c2b6c48796983273a1b7994fd68d90e8c32b4296d477399c8fac724f24198d2fee581e7e36032a4859bfa6fb88bbcaa78526ef937460aac5e03fa71ba7e5c301616a9037a5025507ef2ea23665adbfe6908923c526b7e0e6535da22ed7718f614db3eeabfce623b152a8f6f51a79b0af0f81ae6ec38c6d27c3da1a139ebb12f89228c88856b17a9bd04015a5843f94d08d9bbc9967b4b99929401a607d907c4076088086b9b4c2bdc566baddbea0e82d4bf0ffcbabb6d6db7ee21d847708f2528128d461f88473bc02548514a7ca31f30fdaaeac72edeee207cdf488bf932f201d3b723c0a5df3c4a8f72c093d672ac05943ef5a7eeee943aa594babbbfc0bbf3b8c0f47d94a1554dad0c569ca1556ddbced02e3bde8b7f2c397106195a5593a10233d8fe19dc855a05da45a717f485788e6d8b44088e6c914b6cabab7e0d15309fdc116cd236e02ac0dddf52965b07abd3afe1e62e85e4fa958e73f678e7ea3acafdd218a05f2259a995ed8358a5c40a72a9c3e4f506120d483608f92489dd6b395b695a56f83817517289493dc06560fa05b05dd7756fefbd5cf7f7bfeedafadcb5b7b39cadaa92c6c9fdfe4e0bffa28aa9fa6fdda80f24022842e06244442e716dfdcbbd5305c5dd69e1606fe8a0a19476dfa150d7f47e214a2fbd1ffa20de7f546cfa7d437f437fdf47e86f2814facffb2f44bf344dd847434f81c0337428e4ddaee36c15b1e5018d149a8640ab5c033d41203f2c305934ed6aef41af431ee007f1c0af2215638040930e7a1f04f4bcf7017a1e08820bf81e656895ff0fd83ef7fd27ea68d2ff8686e6090d1936c6b59da27bf906e9082e80640620b3a65216d0216e984f9863f878fe2ffd027fe547faa10fb2f2dfdb770f9cd346e7cb02b3675809f2fdcadb0fbd8f95ff3ef433d3b1c7ca88ea8185e83c0c1c71c09fb0ef6dba14fd0672f28cf701779eaff254fcd133def218fde84ba816484f1f7500d2d3e7417a5aa294e2d28cb16cfa9e8a28fa163d49cc009d221adfa60dd026274daed872d2f46ec28f7b84784e576f113c9f7e024260888a48c1ee744649fe74f6b3f66af2698b780b6a4fa3e39b2108babe2f140a7d5fd27cafe38340bbbc226fba77ce2f3f7f2357ea66f66efedf9fbee7af82b4f484c66928ed502804e6649bf69edeefc423ee971a5f510736d1dc4953ab1d94eec8ed8ab4cac9c0f7bba7e188193cfe9ac1638ae189f99a73081fcc9afa0ece1ad7410ee814d995c88e64ce785f017f74c6973e88caaf7c90195f7afb313860be68109e0d5b08055979950f52fa196f1fd5df63e555be47e9673c0c2baff23e56461c243d54481fa5d18511a76b02073488c1544613bd81123d3d7affa0ff7d87441a27609abfef75b4ca0f40ff13fb47e20ffafdd4661ab640f3e83f1ab6909379803ffad1381a512d887ef4281ea21f8d2f73451a8d9ec7cca3f1cb9a7bf4a1cfc958fc9e7e2f1243a73cfea2c149ff7b31a6a15de0386bd899359512f1dcf3ffbe102d4279280fe5a9f90b91aec0776ca9a27056355777d4a10dbaaee338b7550a8d2cdfb889a15d1aa0b4092626cb5fd48926fde94fcfa0186aa0410ae67e6678c44783bfbe918686864728c7e003a631b8e0f4c70a1c04498fd07b1fe4d69d4c803c81749a641a76ffdd1ce02048827c7fbfbfefc3fb100a86fbdffbb8ff8d38487a7cefbd8f50134e282206fb469726e009f3121c61069b30245d48b45102642ac9f46d6878e86895d3a7d1d1af1a5a5a4a359fbac2fc6dda35d2f00473634b252203d3af34db1d16dfc7852a154363f939f46e32cd39c9d0f7d80afdcc27d6605b3ada45c723dc7168e8de346b42d9bd1fcb23badb420c70cdf443ef893f3ce441a7e40cd029dff398f91bdb1b4bfa1ca0d97b2e24dea7ddd8d2a46b81ed88af480998da276aaa1bf567ad94ab1dd785375d73ad56a95aa5e3851e31d07722a5a4a30d8d8d116ead88afa3652a12754b4451606ab34dbac2a44d5d93aa6afea45dfd940655a1221a129fc584af373ea1289c326d02f797150499d61b746a0e99be7fd14518b3c6366b46ef4fc8f47d8c4c7d4aa6ce844c7d0999521723d3dbcca3b7699148246a95e8673845a2d7e637579e783bae432af9d4d1ba147cb55f1376a9756b6bad96eb1cbc5fbd5a02696e863cdf5226a6f9d3da5aad73b7db759ad3dad92a5badad0e1ee1fbe60c65c955afb5863cdfa758968098f27ceecbdafd5c9bb25b6b476ae39d58860700c5b27ed9dffd57bbee6b37de12c40098ed0804ccf3c59203bbecaa5b0ebce14d67ceaf577ab9c5727a9e9d5b2c2f0dda63e215d75ac7daaab68b00bea152598e9b007ef9e73acbe456265ea825c084d2914e55b5dfe9e06b4f07cdf4ee9fe9b0556d5703bea1b21cd701fcf2cf75b6c5d4dd5ac2def5c0b5b9b199d9c73955b4e2d4ebcdb9aa4fbb31ff72806f9e40398811c2010ef304cae1c937060ee50994c31640395cb1c3a89a85aec0a33c81729805619c27500e3e59958311275f5437fe2587582ebf657130e7a7307dfaf4c962f2aead2c26effaf5f69eb3a67d4ef790404b1312309d7e8ba86e9d21dbad9f46e9ef1813727f0f699d767ddfdf44fa7ba75db59f06f9eb27a7091f173c6189308c3cf101d6fe8212e4ee723f35d2230619fa6768d74aeea72188dcfd1ec0b92c1d96d82181143818b20258bb0b723fede9c27573bfa8ca10430b31be18c10b6244602dc8fd364ce47e039832f002db11536460451753606dc40630f79020729d4043a460d283154037f8a025cfb9c2ccdfdff0e6a3b79b183914fa2ebc09f51491690fc9ad13a3b723b8a4b7d38dbe0d4764ef3d1aa55d657d2f0abd512851ca4aa7927ce774a9d472575b21e021dbe04a60e0f26ff4a68ac5622198c56230fa559cfefabf22dbafed9ab9898680cbcff46f47a338495f5547d5979f6f4ed2131d4dd194ce59c779c7952aa6b70a68a53cfee8be9f1b5108680ef4e8fe33b471b1945d9c403bcc728b3494f27c2134a7773efbf5736039b0926c364322491151cb0de80723d8ee1334d0e78925b3d91345f099d12008081bde9a40020a26ae48c2c3fda2882783e28b1d24a0f86249121d2f566357f8849124766bcf0d9c0645134320c3f280ade83b188b28f60684c5ed4682da039405122eba271d0da807273e403d34e1eb012ac108785057b329580006adf37c6430b00149b6439acd6444642e00633399144a84cae049215686acf6947145282b438cf945685034b1d337289c88d5a05862c909f27c7056b3a26fb320d86ab320dc389f991070c8f3473116d03c66c4909b0a7450e2062f1c824d797e0b913c5fa6d9145f0c99c934a60af2fcd2bcdc146fe04dadadb37a0f152328307deb95ae9d9ddd82bb5f3ab5eeb6549a61ab9b46eadd71959bd5ad7badfe396dffcab9dbea2d15757f6955fdea5e3d95128c80307ddade95f30a4eced6aed60af6c096ea4b7593833ba8d5625bbf7b7e59bbcce5cfb35f77f7ba312a7530080cba6010a6f3d6f75abb7b345bf585d76aed8de2de7b6f28079f10e0eddc72dd15e27a4dbcd00c85beae3a570252fa3e0b5e1a08da0fbbea1cc7518eda2b44d874d62a0a45ee391085c224dd3636527c5f2772397ffd39d8899e3f0b7662e77abb5027f25973bb02cc970c55c810f2429cf74eeae06f4d5f2f544d2dff122a012995461ab8f1bfd539376127b1705f7253c1a622edfe0b81dcfd7e865842e21c2bfd4876b40902d39fb58ae85cd9cf9409180a85ba06cb60c2840913264c2865e26f278db6d73ad36ae9e89086a65ace5ffe6fa8545cd752dbe561d5410d47adcfe9a0cfe9d5a7bbbbadd3badb5a337d4e6fd508a800434abb26156028e9176dd7a4e20b2bb2dbd9aca920982b7f777beb77efe3396eecd1ef8d38383934cc5e90e146b3a9d526adc77deffbfba43184e2dee37cf47b6310effb47141704c585df02c31107ff1cdffb0ef793bcf771df1b8384cad603c2079f84228d9e88225d118fa8cf8c5869c4a1b21e1f596c468f9d599ae8c54ada33a2b8cf81adc8ee88e2c61786d078d3e7c06afc84e12fa98fcad39b93fe8f43ffbeca884343a11187d2c61b0e0e9d39edf328bd599ad8224af416251a5130f4d7ef416b5c1c8142464f2c061bbdca23e981bffbaefbd1f7e87e14cb4e1abb1bbb47d6b1aec763b55bac763389766669882be27492bbb5be793f63a5efc7dff9eb1000a6f2a31107498fd197469cd28ff08f469cd2d8b81b71da07070a53e9d957b6cf37a2489f03ebd04f58684491c617864c27457666694dcb8ef24161dd535887a4c7e843281842ff7d8f90e871fc433e3d428f471c97b9fb8cc69e99d76aa5cbee1804490faff49e26c08278234af4e0877f479468f431e22041bd709f011376471f5c14132061882196c462309f39e98fa3d3b0ef85841e1c513e3ad40bde5ff7c9fe2e64e00923dd891d9460c2e4492c069bb06f0c222434c6c21b921dd0a00959f7a5d3b2ff8a12f08e21b33cabc8a5d76aacea38e96e67b944bd101be519d6989dd558f6b733bbc4d2fcb928fed3ad2dbb73b1ec9c4e764e96ddceb27346b2733ed9b99fecdc6c4950e69c5c8182272c04a3b9f45b8ee5090021ddad1154c324c512401039010f38d0927447945827497431250820f0c0032328c1ed6044f757ce91b46a403902143a2c11842b909044b8832c9cc2faa046173d70420721ccca10e23603bbc30e4c5031e4e3de6d0410bc1d42d03742348aab7246cc1bacd005e3075caa54a616ac6ad788934d61018913cc8e48c20f4020051254d619c132f103ca12426881830c7820850cae0e40589942092540a243061547b0c1c76ed13c981a891a0baac1141cec000832f8028b18f8f073854bf7678d773f2109b38a1a5a5f45a23470d5d90c42c187224c21031290412b0306a1eb33d332995a70cbce76a8b13222a28b984ac89125c10230c0c0a107260c41628bbccc7ef79a0828068204b12060f013021ed8915c9a5e757be7360b68a99a99b72a014fd8c5a6b781560374a53a0089004a7f09ce7eaa059dd5e79cd3a953a77449a6ddac083c9fb6d3e944a67fe7f8a3c3d3fb814cc55bbf1aba304b4b2746e2a6b1e4c69ba9297b1eb57b8ea5fd43bbec585e7b6ba6de97f443e3a49452dad9daa2acfa34bcb196526b29b53473dc674aa79db6565b3fcad99cb05f494f6899a179b92b56b1fcb8f73cb14559b6b3ef2de05aeb71dc5bcb79997274baa8abd77441ec2fd91251e7fb8fc952045cd63c7f8b911005985354066d17be22d305da03154bad128fe01efb8b1bdfc96efba26a171d9f76f7a52bbb37e1ee47f75f7aa3eae9abbaf9b3edfcf9d56bcf8d56cd1fa3847ff4f8fb5fea83ee71c0e61f21076cfef06778130affc51ff8492a6ffa9268fa9cc2bb7c795f28903e051105714e92c6bb88739235e6a39e45fc311ff5df6c6141892d2c2c2c335ac672b2fc0925b2fc6419af492c3f976a8ce5bd78652c4db9344922fe92887f8658cec7b8069bf1f8ad6ad34bfdfa2f690bcc8df89a4ca63a8642684e68af0af03b0f7852a05604db340b807630a26798a6351202cfbeb767940b9218b89fd2bfd786d2ea73ce49a977d581534aa93b7577a794fa53a74ee90bb8ee47cff3ba11974c5d770b1078761794de3a0ac225c889a2c0a32bae37da62d4035c964641a2282c773ba765e006622d17de74a696735cd775375a2a105f10dfefbb91e77fb3bbf77a5e28f48537fff2228c7b04c39b6adbbbdbbbadbfedecb5ee95ab2d5cfa40300c455654e6e4502a2e67804ec9a4cf5ca59a8430348c34e2a4ffe866bab5cbb3bfe9461ae9ec52132d814bd36df5e3afeebf99a098a2b4abc6dad543dac57a7f161d1659bb5aefcfb2d32e199e22ed2aa25d3246da15f3fe2c4758926817aac7d4939c8a1153b55450abfc5b62ca49abfc5962aa498ae6f203dc4f533401fc5804ea4ba9fce0f224abc94e3b7e7b8c65fff246ee87f95ebd445b93feb46ce3ffe7770f23928c38b9126b39650f46ff1b4dc1f4734181822459bbb8d5b3b0bce9e6afd548d69af417850cf06030630a084cdfc69727198988b9f25f892423b7c68aa9c43243e54442b5b8a09082ad236f4a63b688483d73e54fbbf1de6cd6543132b571e30d5103540062796d882526450d549558de0088a5d75410cb159eec9f124bd24ff67f11cb959eec0f00b14c6991fd47512c5976b2ff8b650aa2ad4c39c9fe2e628b587a0d25965ecb25592b2f0b4956924464ff1a62e9371aa22dfbafb8d4b27f89ac9145647f95934c0395ac69a0e6d2742b7198a2954e2bbbdbdd29af4ed753763f993e6957d9414eda65dfd6ae59bf24f564b74fea6997cdfea42266d99f442339e9570dd291764da0217ab27b33520fc9c82cfb09a2c8256949f61330c925a9497692adde121a2d28a85d6557cb334f49bb1c08cca537f39a649f5a78b3ecab9b4848e7d8a874c78a6fbe7c1d386b66a61fce1a064c98f5012e6fb6dfb5fd20c635256e95fddb2a9bed7553cbbfa8fcd599fcd58d2d32824d2a9adc7223db1618023b7320f784b3200882604eee7e2ef4365d83678fe3de34c90e193061fe330c6d1d43082541516cd497b9aa7594cd7931aeb5d61e6774bccc52f54612848c0a2354cc269d2c14a901174230e207082aa6f8747aa82fb3659e11a480f822f75393028cfc2c81032448e8e20757f20dd101228bdcb966618258ce9127900964f508ee438004083cc9d9b6448540619c0c30007b680b01f6b4734df09a836ab1b09c165caddbe92e0870497dae678417a285be243dfef3813e788884cf6bb6e571db9343ef76deed44b52568115b44bb8a5cb7a2910ea6d1cc0d1556bd40356bb4273bed9935f6fd65a86190de784eac4093fe54948104ca30575b609e769557555fe56fc56953f8f966bb38c0e51f134f007c3d5f5fcb8f6628f2d774967fb4edb694ce48554c2b07cd8c00b5566f9faf561e337bf4d6eadece556be79cd3154ed5ac3e57eeddf59c7d29cd7789fbe52de5d24443d0f2958b7f4588eec7254a99b04b1081942638dc0a032078235aabb3dc4bd7755dd73d7d3a84e3387b39ae765dd7d9207e3c28ea0a5010537c4732982750103d950302e8072279023921ab224fa01f8a64d25c810337cf1a0e98722d996679020141c9b5f4402c16cb35986a52c825187635775fbbff3ab1ac23f7271729d8c71ffe9d67eebe3e37fef0af7ec7f2be11ddb71746537069ea4fa508f69f43e052f572c39db3e30dce0041f3058686b9cdc9aa936f5d147fdd5719a2ff76230a705973ad95b3b5becd5f0de386f8aa0d8a53971812c6129890d00d33e8c1a1439810050f4cc8d442466b2d7268d2036b1b644c88c1be0ab6d84fcc800735d867c1163bd683430fece3c016e7942c663218bde5a0841becbb3ec4c007f679608b738a2634198cc688111d188e10308b1f62302414a7633b42d0603842ba16cc601e111d536e1187862146184b6042463411d822ad82074a7a60df086c7186f1441536d8874798d4448ed468b01c2aa4db4dd0fdfd1eab55486713d21a62c80f0c09ea0034273b136ab62a8455860f4660b37194e09d619040093db0ea220e92eeb9c711e23121fe41848c31fb762c09a19ff6d3feeeeeeeeeeeee6e1cf4bf3973cc0a223b4a5c266013b0e0c6c4d3324be446cc49ee1a973da806af653774b2e8ae4d99abb5044a88c0dfe275efdc20c04ec01c57c71ec82836c0e505e241f902612346ab11d6d63999989a62aab24ee9280126b5457bce169369daa6258c5d7e3fbcd5bb97f6f1c3d9b37acf39a927f21a86eda775bdf18aa41a0af148e5a78a2844402877dd83ffcd2ebca1ffa2fabe8dc055c812afac658b3ad1fa4972c12492fc805f60faf32529c1dcddeb3d4d4257c8746c23702bb772d724497eb818f090e0a7bc798ec692e6127cd257efc3bf57349634444028df90c70d6f385c6a95bf29f4e10d47b92c0ac59212c916142ba5f4ade805a6449cea70bdefec87e1023e310c6f3c17aec8e5ce8e28d7034c05a64bf2fcd9edddfdc4d5d55adb4d96a6dd5ec7ee2faad7cad95a395b6bf531878fb3f6b9aed556f746f2957372d6ba6ff1dd4984afa35d296d253e0f0aa695560ac637db45bbbb85744e6dfa840e7ca803d83c9fcb73a473552715b9fc8db8fc4d6af39c739c5ccea914e79bb366d61c4ba90b3e1e33cf39e79c13680456985af544707fb24e70d70b7e5796727322edfe8a654ebe2038a27884ff037c7ff0fdc3b79f93a9588235e4d07f6248bf9c1c128180d91ba90ef4d6596fe7c009efb9ef4bcfe33c8fbba1e7aabbbbcf27d37598f3dde7fc2b76f33bfac4ddddbd4eb74c8c9a8cb2681b44518cb4f8685a453fbc99e30f94c82dc2e88726598cb018fd204514457884ef1bfd30d262a4c58836d2e2f230c262449b5448b18218ccd61e513dfaef1348f003ebff969d618e5404fcb9c4f9099c04af00cf6f317402d34a97409282270eb6dcf6e98f6618e5ef24a54da7982d99cd327d03f48bd226fd4d3f6c62d6aa0d9ffd46f5b07f41d2f44183c0a603eda024cf9087ffe046d401722320380a8e02a3627961eeb3f6d08bf952ae6ed9df3ec1250dcafea455cefd87654efa9f3249c6834b52cf9c1e66e07be23625d7d04f73870830e51e493d73d52ee33af1c8c8e0b031c02c012e2c89a9332d96141997cce3a0a11173b45aaf57cdfb7f35e2ccbfc499636a4c8d38f38b469c5945e5593c84819e644bc0a54b2da6c6d499168bd562b172b4ea4c4c4a462419211d79f9d2a546836266646aeb63aa8c58b6c69866b5582d1c2e19968b25c362c9e0687dff420f1a04826266aa0539d1e6af93cca5e6a28991f9ca7ad789e72493f92e5932ef4af180ce578a36499f00f8390190a291ac6f962d0525152525c535a3828e0a4454d811a388524428e24df442b4a164a8408a960a2279c85a090839c3b4cdc4e480d22e1cadd7fbf330e008b85f6439c94e474eb2d3cec9e7f4739a9d949cace81749762ae224fb9f7a4c3793946a0baa273a2a03b717e2ad5d5162de5f9432c6469d76a1627ee61cef3f126957cb76da55a4a75d38de7f2c623cd22e54eb35e2089a11a9cd4523a3c2734e52b5d1142cfa8f5e3a5dd48537a9a054939493148dacb9b4ac288ce9e634d3cda595b02a2b0aaa6d0c69978c0e111b3bed92b1c163a34811ed42d5f1d4733a1539f19c764e2e647992a1a80e254292ab15287487ca604493cdc900d8b0640fe953a326dab2e9e77489b6a9f237919fa2a582fc356143607e557fc71bf117aa8e281858f81def8385df310641d263f53b3e08ccb330fad8f12c3c0b6390d5ef183b23301a8485dff13ce274d2fb0197291a0b23cac78e877998df31763d4ec2882e35279b559bc5ea8fa2c0075056e4c87823428755dba5468570a9f90b660533ae6618c36aec8266ed3a65fa5fb792494642dc174a35a932c0291aa5618a667ff0ea61fe043132acff5a64bd0b172d1df332a2cb93b2b66246971a586b95cb935639abd6ca1a5d6a2eb656b9ed018b38739974016da110cf4e11db6c34faf9a9f96bf5f43d8fc895a568fe226b385dcd49fa302b91fa38590b6fc8da48b2c09c1a719224c9efb1bc55277f23d0658b1dbffaf2ee1861305e8db3bf49b2eff17f86379d13fcf7cb14cd5f2c3ccc97379f4ecf82986ad2a4cf2651789811852fafca8c9c3c5d50601acf12d4ae6eb175f2081495dc884b46e2287c417479e26253fd0c5d6a270a5bf171d205f0a54bad24495f9224591e4d59324f1965830054402cc4c80718557ab2a6123e160297c21646f9246b5514291d0de503e677fc8e31088aa5f62c303f61abb1a3754e6096209b8fd5c38ca6db938cc2e3ef1768b8dfa58e544e2c52f6276b79e545ab2ae9711d5982589cf48bc656b6769da2acbc68172ad62acf55d6ae51f6afe249d62a16607ec7d3a834768c2e35afa24fe15d6aa43a7ea5d797c29b155eaf1ca2ad569aaf6fd3a39e1a299a2c9335951f7f996e4ebae924136d346fd3b6099eb955c63c8be64b201ded6389a666028ef9cea5e9c6123bb7c4b23ecdc7d4114847cb35ef3f67cd74bd5c2b7c3f385d39be43b956d40e98f5df7591b5ab66ff0f05024c236b386056f8295af8e549b61a5334940eb8146dafaf2290aa9373bc4dbb78d12e54eb499e71a9b98b4d34d26a92453a9ee6a6009734333333332927a9a0144db4a5682f1c3968441d22298956f9d788a49f56b9fc6b851c2b2be10d4d8e1747dac89b9334723c8df08626c7b3c4b2e673fc0c6f5e6fd3a3293870fc688ceed6d79a61cdd46e36623322796b95abcebc3f09858cd2ae19f2898c487a31339236991609858c42d66cb84cd16c3c46ccf138c49a9ad7db740e9a170d1a34421e3493624452123f4eac9cec0d78f5304f3f4573b7f136dec697a64c73b24678e39a79168eb7e98fc6cccff0c6d55debf8a35fe63fea3232dfa3e916c3fa94173131a21a14276258d5742300eb6dba8aa61bab767777d7feebc2f25f0567be431c2f239633acb1fc4014d311b068aba4fa658ad68af99417ed2ac95a6d8d2d746ea568a9262bd93f754b45f15721a6c2107f1588f40b4c39a965ff54ad15534999ad5da568cb4fda4580ec4f7ad1ae0985d87f9289362930fd9ec1f1363de3c26162d55a59312ca01d0246b15ca4b4cb5528d6d84267964bcde54911d9dfc586420c051d7f0db13e35c8fe28c8dab5d3af21a32553bac8fe2814e95795b978d1aeb964ca4ef677b9b1aaab5cd9b2bf2fc9ee54645fd9da55a66807d06127a85d1447cb4c8b4c4b4b8b098cf919deb4a8073919f3a22d26e671c4fc4ccccbc4c4c4bcc7bc490a9098f78f69c5d4004fa71d56ad56a7b2582c11035527f7f8a33eeb3f96782a820a6f5a1fc3faeeee66354e0f6b2c717862c41248b543f0572a88c4e3af54edc433c39999af228e77e1028fc6e8fe6244d7b70c4b86f5acb7e9d10da76aa99b8c98aab5ca534d82524f52b676c97c931b993115d41267ae9d63c49959a24b4cd952b428987e49ae7e5a5fbe29b37eba6873d21ff541646d358a367fd56f8de547c9f563c6d274cbf559e3ac38c6539176b1c67266045275aaabf5fe279e76d527154132d2aa23adc23cb8f4b0bf503d560ff330230eccaf46dc63f53023ceeabf95e82d71d25722cc5bf101ab875975340ff81c41978481abb71227ac7b0339b947cf8a56cd49ebafc409bbc10d46f2bc810db73c803c6f3044083994b1b0fc67ba91467af496b07aff1696a096c912d4f2d35f2c414efab7bc684bd1da3580f7ff5cc0d194d11858646981010d83f99548612b25ab2573359babd50ff984b49d7e8664edc7c90188fd302285b104cde8193da367f40c295232e94b975a8f2226b00823368c65a755ce12e4f7626c32a158829a64fc0310c95aab7c35ae7e9c74d2c75fe28f9346fc3561e2ec273b9944abc89f0e9ef0a804ee75453d0a15d108040000003315002020100a86c562916828cd34598b3d14000d7090447658381408b328c7711c848c3186004200200610440819a29a6d10004073909c42480e7050358d50263a604c452821075c940437322dd99952a46a7484522e6e3200d29b0df7a963090655e0e05740e366b5289af79631aaf07468595ac7927e4b575a12971cde8a969a13f1d21a0a153f9e6f7cf10d6ed03662e64c26c2412e4bde605ae0ea2e2cad416fdba6b2ca8ad934a71c7754ca6505392dc5a8830aed8bee6440e08364dcdbb69903b22a042fa578e4521a25465894c88b1e98c5840b85f713f3b9a2f42d2efeb5f9a956b46934f10ec496c742584c8682b408e455de00a20edbde87ca3d622ed839f1b550f250b06a30fc805d5e2e55c3c6619425a9a0bfa3e0cb0464add7110763111e76e6f3a0a7f2b7ef4dfbc959a6d061ea396fda68c4041eaf06bd9912627441458a157fdccd57ec44cc83f3d925bd57df69f2535c3f349240947e5ea4338fbb9f2fa832b9277bdacb5e1e412a4fe9f54370ac8e6a794a8b12fd002dc5782f04b1c82895e57d18b8b9f92853f44fa33e137edfc685ac1dae082e9e9dfa1c84897d9f9614e645742e0f5285acc4323248baab2a2c3c5958f555f0d6835ccaa8f90aa42633d000a7c1fbf0b09a31418a82e37fb6ee8d6428acee2e4b9ed5046288514858cf3b2c26b07a8d06d197ca44c917609d4d5fd6d1f771708bcfceb3747395965a6078290fd94871133cfdb062b512ab28470bec4868610a839cc3b02ea15ed6079b4b8b61bb50ead3d666f765bdac3dc849c2b3fa9537d6b4400fabd86a568d1929a365b9c442fce702ff629d1015e782f6a559658dbd968f054c71fc31e9c46fd8933dc0a298fa1079181b466b3e47c6bbea82ec288fe1b5c076d586fdeac96be81e31e6377410118c3190c20b56835b1ccfc42e6d2183b3087494c1068610883142fab6352a8bb0fa48c9c92e2696e93dcfa8000f837418589994793f0a52cdd9570a3343f9c82a19b110b653e0d0359e00056483f341c98319d6daaeb6612c6326968b9b1407aff42c47f5f000bddbf13a8193cd5b1984a4950eecac403f6658c730639145b1272283b8ca1023c82e5622c34f2782160d8cbc30e96daf07dc79c10bd44681308b2a0b0007356d58ea1d47eeda68d1015b1986348a481a59d0a9dc18c1a1cbc9de4ee6624b32be0495519a15a471c3a42f045deca40ac0a53b629611b0e1f4437e058bca247fb32cc817fcc9a0b1dc6d7af41b22952f04c40bf9e84e476ddf7e9974957e64b0c3d32722a2f6b1f77e0c9b07c61664ccfbe1e7542515179e133cf954dee11c75ce261a3045f3a56736400e8a1cbcd7e64c1375298eab8f5459e85d4145550d97ec5b16c697eb103f44dc35f361003f665d62daef24f93929bbd99d7f9ee682b894effe52f7f1ab90c5e630c2e6fe00c3c7a8b4cc41e3ce49c0db3bbd9b1c59c62c48346ac07bbe9e0f2d228978d4754b5ee11d2218877ebbba08ed3c4719f78769a4b3039b0fcda94fd3678ee544060df31de564d82ffc53180915c0a1632c8230067ba70f874d897bc249749614effabeae8ed9d459af309617e31d49ba26639cc14468cc00c9e0da437b85a9c4d7709fc9a72084697c8fd411a9ffae66d9f5c192f906e329f46cb88d7482526b704185f22b5208771f86b6069129548dda23eab522fbca092d0a6bcac4908656449685f105b0e302e859000624e45b865eaf22cb744216b86b34778b8323a042933dea804b969c4b0aec4ab28235d083236f647b394960bb92698ec8ad05eb079eb29d2064eca3b54ed825af95a8fc55c1cb31324c72794880ea7fef1e64160d9c89b577e19254720655a0df6502896edb0f94eeb1c085bedb45664b438ae86a2aa89123219d8cdc28e1174aba6a16cb513936f73a014b8f2eb534ee3a0b2a2ae825b6a22a1bba40cac6beb5a0678bae520fa37331632957f9378082f19edbb35ac2e9f2adceb54b0a1e6040134c5f4819d4d0d708250b7d460a623492782ee6dc5d60e1be6561075ee963217badaaaec0f6b429de902347e94ffe035cd36b293402dc115d011c444a4bc83dbf129a6aecde7d89acfb6f72e7f8bf5d7a6be461bce49120ccafc7856a470e823b581f805ba8a515bb309892dce55197bfa4a99e44adb4528d98fce830ea4ade08bbe0f4dc295b2f9db8a9d9850a084d4d548cb9c35ae2e7143fac1de9f1cda5b7f561a78ba86f9357d43552d685a119defe8f4a5c8a99749b85a0a7029411e8cad61f117c2f7aca5676c8c64be5eba3c5225f9510b8522476d720eaa48175f05f175137cf327d890c9a33435c97e9f108a9a3e003001f9d4fd19c89a1df2479d2abd1253c18e529f4e0d011758d0ed125ff1b3006201f61f01fd64db4511b50be6674d45270e1987e703926333a83bb7f510ca2f485176b2d1ae4602c3c0ddfcd6d7607af623ed96c2bbe2e4f90dddb8b092114e874194bd919b2fa5e40f9ec9644770b0e000e2bbf5c2d12edb288c8022f56ce168a650e4f4ff9bdf1e32c292186771f8c0d5dad02dd9eb3895ae7075558760e9a9bbd8b4dade4f9ad8a693edb3a19061812ecc4d0355d6686d2c7e0f6610dd3399f13c8395fbe229d0d7246981319c478563cc79d6751e9926ffeea3dc40e4ba88bb9c0cc84d7e2873fe014db2576fa0fe9b2cec44e5da2a31b2d0c7f620f6b0f60840a0b4b20c03f28a767d04b918ccc8fc42370c2532bf20576d09d772fd02670e454934174d1a8bd2052b0edbfdeed38a8499498a41c65a6b5e1fd1ed11eebb1e8b676e10de1afa77428ecaf5bae40bf783f0e4b40cb53ca0a61de0540e68b98298a51319c7f12df8a54665ff6b5e98ec99d4466450c00df699fd340d7440bcb21827a042f488208b7bb2ac0829aac46fc9ca7daf93d21420a20b7884b83dc4222a25cd1db4c0df2c81df681febd2dfccb278331deffa0eb34f61abb1cc50af3e9a98cc76ded2d7190f0cd9606a266b6d72b39875f0f0c90b64d9123f68f7c1761dc3531a7bd1c4242d34bb296d4d72067abdfa6bf55eb48a92643561ac15ec9d9635b3000e2fea34744c1be592044ecabe84776f87fc69ac80317205419a6572618e20f47d9d243009572083e374368c0a8aabc6b356d24476dfe9a72446f4b22d08bd1e3c8415d600dc3f5ce32a0330e75c712d165524725f7df22c7c5ae1939b8fe565966e28e26ec3208f041ca06e7d193cb4fc93806e8830ad3b124b6d43b1e2316e994da3c116fac25aaf3d213dd5156e46cd5d0482d8f9b6fe0b0cd9f733a0614ae3b211a704151bec7b4adadf2b28e353096ec68b810f5ff77f4869e707e44149fba50c44fd14022370a35b7bcff292abfc596d4c0c4d1b0c9995b715b541eec2ae87a2f0208b7b6dcd15cb3df0c2a1d3dc123fd8fa8511cd915310da6467317a98d366ac30c7802c9f9ca4802fa1ff73302d60435211f5ddf2f9b2c4f1f858e95a02a722cdb6060bac65084e13a24846d5d52cda797b8228b4983934e64c4a618fb27d8f765104ec78652936ca9b65a9cd490af37483006907d92c2bebb3746615ad654a47b8361426f9cfb66de600a94f04953cb3f880edfaddc123d97128760170e4430a8bf84a58ff67058263755a44ba97f985446cccf18c644c04e41079672f00333cd4d5b9e99b4e9452d708c9a7f8849bb289129e916d4d784e42b3bb96f632476b96088ba7f78b61e0b9d81dbb7c5a23ba54e14ccfcbf2ca49cd20787b2fd7f43a7e6cc16e37e60eb740b88c4a8a8714979272bb9529b85342132d971a34a50f44c3a081cbce304adef5439d6845bceb99e7a250356cc24850b8ca91195213fd651d94342e24d67466c1533000e160719c43133c9816533a416aca3cc0af53559077beff520b32742e7eb8c2c71311e9fb0d02236dc03c13ea11591282c8fc04654fb6799395ee70bcb7d0292a1a8fb58a7f529cc8bb29e4133169e8fd8562ea622fa94d5bd3e1bfd045a819a010b331c2ad4e80f399fb8c328c988058db70d4e0bb62ea60ce8251fcad69c6acf3fa31a78f052638a66c90a3c09d568306a6b74f1db6861be2dca50b1421e1b79a0f3f118604fdd3b695441c344065bfb1d83352c0e1812f1abf18544bbd829119cda894ada195c12708de21ff26ab61b91895217ae1fd6d03d45acfcb8e26d8e4580921153c15a3d9c1664d59142706941e1a654fed72f7c0e8c7c82109852feb68e291ba19b3a6224ed77cc41e1cac0e011124857ab6e0b8c1703c588d898573d064c93a859ea2cc492a86f227274452031b066be11a58b2c6e9fd2ff7d5563eeee6f9d120b2624824ec3e269d5e7875ddf53244222f7ad07cded2535789b54db7842030d19436df1a141947db93aa6df76e0a19f3248aec946e3fd6fa217d6dce50564c35a1a4cb70c1c94c31a1898009a0a7698f5d099e20b37e957ff578a316d9fe798b20200132725b5eb72cc1678670c5408e5a73069fdfe0ebe72136736cc35ed2b72639780ff5e606789f622fa821390144584627cae9e5881e6fe059ae176785847215f1a8660c68a1058daacfd1c10c8429595039f13284ab64adb27796259fccca76d246ecfccd6ed3d7e91623e0d3941fb5ad34182ce9d415ddea6513fe5ba09fb75419f005e0ede853e360b9c0a1c7ce01aa8d13d633a955ce63386043ad73f11c170c2b188cbb722cbddf75b2031817a73087245441a4e784492d6c3cc70438e66ca38167ce29563796a7313e48fa3ff87168d8eef320a226af199b47c61839f94aa6c610694b33fe165831721cb65c900f342c7b383fd4a34565ee617037ae4483547279642a9177985695b7c992cb1b45e3781ddbb8703055879e5784b6c249e6255a0362b727b51b6cd1ee446c2032bffd70e73c913cd87fc572e7c087440470292f404643d0ef225de91d892dde0a53c3b872f57144835b5d6d26916c142024784afd64d3856d6136f30923eaeccd00b457e999cb2d960e516b51b16d3806eb0cc5842bc591db8fff717414bd64e83e8250bea75c4967b36c2fd92bfb1026b18fea7ae6aae5a9f899953968d682eb5f49618116aff151232e55a3664f61d95a4b7aa1e9eefe754568fba65b785fa9f7a47a28c44b85fa7b54f52b387fffff1a379b2fbdca6f80cb62157fe9eff175fda5d99bf6997d9598b97bb13754b486e8a4f8d498fb6ef571e5d104cdc7965cef444eed8b4ad316a79c17196b3c9fa7271d90a671dd661085994737d1385550b4360b211a30478a77b68897e083a3b139f2504d25ff1f655510614c4e6d465a695de5ece8c4330d77ec89d71d6349a8c2ddd74d00d8ebb4092d79c38cc5f2c0704c51423f608650dbc7c115af9b7ace8e718f81f9283d9e1c00dc13b9452de8fe290e153bd4900c5819d752c7f8da1efa27d7983f95bcdfbf433ccf55d3719df6875e47cb7d90c6d6d9a2490f0c5747818c8c5a62b9cf70543e824b52378f444066712daf8e1278ab272c6efb08fb7d7ff4d8589d7ea52fb2523092afea96d24fb642f234bcdb22bf5a728987b02ad58e781b5c8bb6b560df8dc71caf792bc08ea6ed186a876aeb2fdda5d200f75caebbc2b40133119959fd20fac1555dccbacfdc05ad69b2865916de46e7018cb7e633bb2a032a8a06d1166872d77c86b73954d1f79ad939e29dfa6cfbf8199fecb263b056301fccf7801f75be6e7ec44b001f370a073a46c3b1a579185e068b2a097def1866324f48ada1a415392a3dba08f7b965b52e87a51b00e5515c1ff50c466d3ff5406c937fa6f33d268e7e6c751219ded92485ace895d61d3d0c186ebdf7e1e926a068d8ec70903bd8fc25016db6e67a9d63754a9e797c187c761d0248626da4f946b3076a50d4672bd69f8c582873165dfbafc1eee9b3d508c0a52cfc9eb30634db788785020b80e7ed580c75064f9cedd6010e39e02105fef8531050bc4763a15e75c32c030ada15b8a14b4b9b374a922b2a79b66f7163d5447e6acffa37999df8115a083e54a4b0af09d06181b3c9b02266fd17427a96c724599caff13d4ea34b4e344b0576b23422a1f35bf081b378c0b1a38d20c1a00b5bac1790f4d6f5e4d5417aead3594dc3224dac1610c0ab0f691353bd733a215c685ddaa6a41a686a3210e8a48ab38c2671a7e47d2e1bf2a961426c7921c7a89755755f6aa671ccc9bb38ad2f2544fbd2ef5040443eb40c8bdf4ca371a649205ec8d44970562b2dc34bec1597adf268da01329c7515a5a9bd2d9a5281c52e461c51dd2a0f11bb8c6c974fe843e57f954a90fa10d13cf129002cfeface06c99a04b99144ebdd4bf73b96e5cf8945e5faea2860875185f7e3a824ee6a4bbdfd938d3b8a392fa5bced4c12d1e5a9249df1dcd710fcfcec34c168feba3764b76ef2113f151bd2f313458335c2e09a10b37a952c30319ca50ca2d7ca8002df4e632be9fb2460ff3472993d2da63d0f3ecf36ea92f3b6e834bab4ee1d10af9ddd1e40b90958219054e681470fbb690dde969399472e97b464c226687b58a6ff942f2fa1563ec63b4994e031ab822b6c81bb279be1c064b29d0e3769c957583ce8ba301a839cb1ade68d0723b5d436fde6e2e27a41f62a3612ed0293e99fbc32ca746a4f46e453cf9099b840f4b3dcfb608551f78b5552dc8c7a2fdf9304033eb4cc012cbd53b11e5c1fdc63ca86b3608c80b4990e2379d7ed5df36e3379c2c6815ae91e7a483044183e9b5eff18e4445b46a300238838d0aabef355ec183ff76c7fedb742226f0c0bf4b345f22a417c112e268e1d6fb19b9cbb75a6d13ef580108afe137d674f76b0752fca7bf9efc2031a297b1f788c9b521fc2896733c01d05659a9f34ef4c638c79ee545ce76b24ea03ad644ca1ab9259b38112578029057d3b966f03e5c5fb432795c6025f254de749ce5503e41b03330597423d8fb79fee7d672f6b7556c119cddf6aadf3a736ac60d6edaaa8d6a828d978a3d27630fd9513b34fd697d8d561c1ee39a7046e353ba2b14654c7dc0b942217345344d5487ebf8ef141e2adaea080bcc58868baab41c966e77ad4ca0623ea22e00c119687932dc471dde84af7e43b06400c091d905ac1af8db92f92e44101f028edb0684dc5263ff3d53884b8e92bd235d051e880a7e8fc97412b18341320bdffb759d124b02191b8df0bdc84e932a699164495f8a4d3fb5ced905ad1ca08b5cea9df995d775730c59dc44a92a4704ed1a37524a071c5d139c7f34fe0e9eb84a8b31452ea145ac6ab82c5e40e20dcbbc0749bddd1bebd44972afc434a3b01945ab4aad4f6a6b3df616559eaa5d124cd4ff1b1a8aafeceab7d9f6bcda397ccca7416267fe56220dae93e11561426846069887624ebb201623bf10dc1466f909ef8d13519f2b45d985375a4c096ad1c8a2a705915e00e62561c8707aded80fd94378d7a40e8803cc0d719805a8dff68da3bd4d07aa0a5e23ebd393c36fcc9446fa5d30e1d9ef4f12ba423042a6a9f41135300b2654cc50427556e9d65ddf8b3d65db2e6c8114be263274c3aac7f43b7e8c03bbe47421995be5200fa031f22ae414cf2b4e99d6d7cb08368a030d70a42c16ec37b1c5ddc150c138523cc224fa08ed9c5cd2221d64b2a2c7a68dc836ab2a1cb6f241e70f64a28f23471d5e4addc6e95be603355957c55203c031af0d7d6488d62116986237874813ad1401c52322cb7e46623f8cfda906253e526b1c0b16077bdac8229cd4cae958aed40e9b7beb03810476186d27fbbbacb8e9f73be0c29242f9a73d941528bff127a839e1ed30e48640cc063e924cd7e80457faa7319f8f3a2710d339d5a3df04fe04ad25d9c112b6f2244dd2626fc8c3783712a43d5b44a60af1b273251c8b27113dd85b713c5df0eaafd4cc84dbebea96e4f2308e147173c4a08fbdf5ba51b447d68f7d6d41476a841b22c71ebd61275a3964ad75c4150868b365a08bae31fa48acaf59044649af449f115400df1414947aaf0552e6896f1b673f0e5db2dcfde7a860aa57922296ccfdd0640eabb1c1d146c35e1ef4e21193257376c2e21d2ee5f27614abcfa6fea5671705d26ef224203f78da8a1edac6297e6b3f51231068660c3ab51e16198e02a38cb90529867e9af334a1f59649fbfbe348bb0611c0826df3a197df280742d8f0ee2c38e359c02da806011d61e4a1a508246df9a079d7b7db0dd4c74a3786145763d48368df5e4323d6894ca5fe1e06910c1171eef5ca954fcb4e9bc2fed495029185d1cfda86ec6794633d41df568c7dfc90e1d87c439368d850a7b74d3bb26042bff3909f0198b460df50ea8b96a14ea2ad8bfbc242c0b205e3ba68b0b35b62b4f44c13290e78850f32a17c60949a61566810b5cb322c192352d94d9eb7fcf395b8d9484c7d6e2e2020d11e14b1ff7b54ec559192975a5691fef489adfae4bff62e619b0b55b6fe635cbf5d82131e98f1e052fb14dfabc4a12625728e9443e6a6887ab3b5c06b7ae4e9183271b2e7bac3c68f4f1cb933e99543f4ad74ef85437a5b661a2b7d5c82183393031c1661b63a718d1ef3b216f461ce408f02603ccc77e590492564f138640a133584942f7d2d20a3b7e7f2f94bee67173dd5e3f9b5978d5a4a6c742bcd9dd2a56d57d26af630ba37128d73d7fba39decbffe94a9d998a988a81cbad609595215f6d5fb23b2cab43e6ae3e438633bbb8b39e09e0a05f071c7d579eff5db2a5ec1b7972893d0c87a35c482da94924f201c401131ee6be54b4c693ad835c3e414b563f3fa16080d71f2cb0a56a533be67bce6c81dd56c55e0b628e7f0e1a02c26c4fd293eea94760d041b0fb162c1c0d5befb878ee43dc7a583729c265b0eeec2467ed0f5122093e44e721aba0b4b2b79c3fe8ed2ad0da8f890b85b76b03fd7b5938c568230735b9a80ec06334af580e0221f09d74775ff335fbf881db434bd0ba5a53ab55dcd9d0a6e6f8f0b538e00fedcd3398fcaf05229e67e2d75de8da03fe15a1b08c55ec32fccfb1e05259e96852280eebbd2e74d2d997103a7a104808de6306879321d3c7cea5a5cab82b5a8ea53da65c769b6acbeb9c60aa290aab6481751d14e56e47e5814c0cd4c2dd78b9667090669595eb298b421154b25325a8a4495b9538538fc4c0d0032208f1e08c19c8a0902630ee14cab9c43012f0cc7ee453f69954cc6a3c56250b31756654d7765eca21cca66ce6f17380d2821fcd4f0e15fded2148da36011394d81fd4896f8d9e923a8e4df2bbbda253e0c59d70ea389ed5a8b7909a5e144baef00699daa1b5958f4f8362b11bcf21e8baf4390dd1d3529f86baa030a8a7d7bac3d44d919c4ddda6b89604eeca56018f003c1435e0b24df985e693d78e19c2977df667cc6b1aecf234bdc142c9f9e35306e603b3de2ce2ecb4334901aa6801bcfc1c5591eb107507533ecc51431d65fecd8c218f0b59bbbd9e44ac3506a7fdd1ce7203e6d956189283cb4a4f73f80c7572f148e6c5376b0202b70229e25d988cfa6a681b6c255273efcb33597f842bca0eb5404a7b66a091cce2592d068614627a2f2b521737a7a8c3b8008ceae9b494f9efa17d957fc3297ffcaf42b7e53620969aa6ea02d631cd3c2c423439ad7194bb3a86b604c69e58ed55da8a4e39434fc404fefa2641dd86965128b5e7b29ef383c2012e3c820268e2c4a7ffbdbc03d734039ef18534bbfdba8d80c4f11683cdf2e69f6469f3321c607c2954e44c6779072caaee60a9364535ae40637bc4136b92d2179ddb1c95fbe84c2d1fedd8e201cd51c07574d0ed042219299326f913f34645159488d45a04b36b04682f55d04a386745edcd15213d7f35be7c26ca6fc447ac3aeaa37b8564267208251c00af5f77d7f91a2a72a51bee3e23497efc387fd6298857178026962cc1c0411eba11d8cf692ac789e6d9a62906afad386cb79ed679e5df52f00f9d7530c051510fee5b8030ad871936c64cde71d41586ba9fc3a4bb6ac8692065e0e4944b89f9d540ff311600a536f53e45e08c87815cbd7b876e0cb4da4a183643dc9e492d1212c0a899debd028c783ac5bd4d110f618788e4d423d4955e5240b5d6547143a675fc1f4132445e0aaf0b07fce3e9324199b645abec9945c310c270ad72d5dbafd63eda583155e0f3d445bd56ba2efbd5112fee19d160f2655ba070c5847d3a191d121d0772df27f37c175a1977dacdd85ed9909779748ec33e1450658633c50ed265cf342f93b7d95dafe95a28452b3bb9a1535869e49e4a6280115288caa8b04d4670675f7fe1f92bd94403c08fbd5d7d2ada20c8398813b3223828b15235638abc28bc992e5094580de36786463b02fb7753580bcc9e62360621c384c93704d70c0622426660002e318d8c9c7be4d772b62d4a10f46504f345d1b189e46c9368d715f31cfb8de231c6a1907f6488dd6e75764d761f51409d2872e875e3539f22b1959a7c37d2a81f42702daf0ea9d4cbb19f50421c3f3c1b526d8eec89ce52d3e645f966ee06e8b986522f0531d6dd5b844ae45e3118d9df0ea1f214d4ce3c554fb7308ff72e33866035ec9a8217ee7c7343be5b25c694f3e9ddce704cd811139fbbe370dee8f32bcf6ac04f4ff37b22ab5b0e35b5aea9e6162214b3b619834f208693dfa0d8cd6dd630a3cb35ba4c0b50d551ac332929448665d04827f732830ea1023852901f2774383c3630c40a1c17690b748c0cf4a5cfb7693a20036c8a47826a9edf3744b107e07d420cc56447198d191072acca2405e5fbca7ff2a7454cc8506596da322a8489b4572f5563822c331880e5db4dfdf17eef23b767cebde091b480567ecaa69d09e6ee0c3c73ee706c97578cb6da3f88724e87767eb52f8d0f13cc526ab7a515d8261a724cf621ab7b4ea0dcd90121861c7c4d22c6563b8961ac724c5c7f7a40ff09e62c0697dc5ba805a6f85706a752896645d3bb8c0457cf160a773505743eceffbbcc4c1701bff752fbe933ea82dfbf498184b38f1456cd91e3f42e6116a18d00b414a7b4742b6e33edf48c6398c626202d4594fb2fbeedb0be113a22c128570e1dc732f4131b7e99887be2068559c8efb4a9af38da85a8db1540881a21d0fdd2bea0e26226f8a94defeb92ea61b2289503fd38715a3354be288e2103efd0658681a2bd6f1abcb8c0156c39d25a1ba96ae86944474418d8bffe9b33c1a89adb32ea009ab2e5af3f848680a87bc5fe38195bff8ecab903347505773964651de7d9a51d0035d270c50a8810695fc1a5379d0165bd68dbe0ce579aad864585774b0675172e805ee4535d2071205d609573df91558f6b2e7d07c0a60a2911a43efae6e4bfb5000c3e1316f09b7e300c3089668f0f2f8abd7533cee57ec64eddd807972f87604f3c205a0e031db9de6a124be1bcd3461259b6b8da41247c87ab73a70a7f6927ef2cd738647d3a9f81c983caa4a4fb376234f60a8d098bd25e843141adaadf7450b2a346a60da445b8ea8b782c0de0ec7ee0e774854dba29330d9181a0809b765f946dafd344f0c7f591bd37ffd1d636858821092841f8a57c21a0316b2e0062f30868670f25362686767fcf3985868bc7ed0e5e24a89488c2a495de7b190849cd832fc9241c4222a398e7d00e496f41cfc83893be7ba276eef46ec2fbb86fb7174f0e62909e2f6c48fde9a521f47190be2ec1c91bc09eff088955f4d7ea05e5439932bfa8fb85c46ca9f861ef420717f07a7038c0bd26df691f5ac564471556af3b3912b05487484f086592893358998e0cba259db0a7de0bd048ac1d09b25a88dd6f216e5e7fa5504ede726911a0a8a6def3c4e8b31b3e0666ea5636b8b6c9200e974aaf36610942241f635277b8a50a2ec854cb285d98652971b1439f8fd7ff6c9f1d5ff6ffe17f500c1d44fe5e13c62a45013c7330de333559985baac0525cb96f7e93a464243b42274f4d92298a5b08357def17e445c89cb1802031fa4b8aa66117ed6f505d5498c1fc8b20577c96768ca732b3a976fb86bd7075de85444d8c72d0ced2a04fa2580f8c0290418ff3090c26cf1130b53f083956d12213b472e892aca5ce29617861637c74e192f8c05983729c61f5bf115eb990475fe89c629fb59953d836a1cba2f086489d619a2b67945bd5466bf26ac87cf50d71361633efb2c7eaf2c9070544d7ad64c1d376423f45f5d3eab0df48b0c14d09bb9589ba29a2ca00069bb91fcb93f8d389755cf8d69313e583eb3891eb3fe5df45b60e84876fc86bd6ba62ef03a8e83b0a7a116f4689ad217edb901247d68141d1d6784a92cc76482b43b94b4a06736f5b404d864c0b18cc610b343ddee0733b4c08aec432c947150157155697206e90044de9a024910fb2005753cea7d096c69e41a5ae9e1f608715e263a52fafe8b148018e0708763e7319d86150f326a7dcfdcb94374b180a337864e2eebb400c0daa07f9547b2fd729abb465f9b01f655bb96535041ba142852fa78e5b8d3f95242aadc3f047c02a8f139ae1488bb9267a5cd01c03547309628e6f43650af34138ccf3a79b937618ca71a365bdaff4801148bd1f3a226e76915d0fc55d28abbdbed32bacb3c846a85e0aff43be98b4d77b33d6bd9613616d53ed45cb8b0a095b613c30434fab03ee6356f1a22081c9d7ba00ffe79e4d06d4b12470514d0c086d3bf0344f1a36bb72a4c4f7ce3d567ab6f2801406caa2dfb7f90e04100552d91bb1efcadc7038cfa750aaa4df2af972845ae750472c01eb71a32c82f5308f6cc7a1ab41523a3f50133579f941b761620c14afbf0163df16ef7a0a733660027d66d2c2fa3b079c0d610621f99ddae9d1fe1c91169faf9cd511d42b88e1732627066128e84187845656d5011e4a358f06d48be741016e0facde6f2e80e95d24564b716588f21e58a340c934b27be442479d70d7ad1d082a2f4d00724561028b634dcdfc5f195e2c190aacb61a3900d1bfb53fefbd8b2a11530bd28ae838a42cca09d645e941fdfd64cc9e2c170ed3e12308855bee598ebdc411233363201fde284631c221984572d3bc689894eae4024ac19da97c303e744114ab66e46b8b6766d8d3e22a46d5b12b9a79bb1ad1e144b1d9bf71fed9b448ecbcab7a5722e08032f550eacba884af3339121ff0dfec0f08e74eeff251ba2accff1e2397f09065c9d52cada3a4ffe9a75a6985115a304d47b21307795428cb8bac3cea5e8d45bcb98cbdda4818d17f6d8c90dae554e6ed38f5464287965aaff2b309611ae39b5867d53edcd30d39a762bcffa59e6909e3f42e78f5a1cae3ad010c2af504d2bc59c90ed8cf7b30a6395aeac92572ffd279ae1d92ec8e55dd4a68c461f1d926b20d354369283c8e170d09898286d464fc76191570a0f85ba43a9db64072a9e085691acf8fee165889d33154fed87fc9fb1ec3e5bf37c4714804c704b3264003b865ad1bf58a0656048d7e679b33e7cb4c57704e2f87d96f9526f0418bb24a9519dc522c1af940daeeb9f9575985849077f33556730f18e601b66414ea6c6985179423198f4ed01b5be4a50195f09e20e329b1ab817540a019b371b5f7fb060d17dc0055e687714593825425650c041dc351511e37b0c3a377243a8d121d09db5491c0fa0f1ceacee61e4451bba722396252ff310c66bd54f1a4326e316799b9b8a5bb9d76137096bc10b36bbee8a62144531bd769b7f3b81ad67de498f1e31a7e9a7a2c1d37e948b5572e8c109b1e2f6143482d07bb60cdda2aea3500dbd3aa40d2640bb0f97e094e1c164653b02760b0c6485a56c845c98a81a73d7efba5b5d2c6498ea97b3693527f8a3e33ecdb55324a9034f95e4917e8b4d2bba5c85494edb0bc6fdf34382ecc86a4c5d4aee8d1d390418f0a84a7203b2b018f10cbaf1ab47bed374184819b880f16a84689ee08fee0e081efc8dd44a1b7f7245c2d25bfe9639f91475b5421b39517f72a41557e7914b661692a3304afff1161ca735164eca72c22748eadd2023bda93685e4dd954fe96c968d1a3e48e019e44c8aedbea7133be7b184081dd3299af35f472ecebf4154116ac2d3a241bbbebb04ab4d71d1e0c96bbd4a06817392deb76a2e702cca2f3f222b8015388964b988e63dec3879ad67b01b4cc7b7e7e430c9ac8628eb0d1d609a93be69b967035161068e33723c55df6d974631ddaffb806f374de9d18dfba03ad9a7e479d194f679fa12d5e327e22ca71f02e9e18e382cd5557f9ff363dae8ffde1c09a834803d655234a225e16ebb5b46a3ea5c650c78c2f8bff30e6210c1ce91b6a9a6bf1d779b1d5aa95e709c2bc0c84a783571136b7b465fc9e0bf1ffc88a27e40f35cdeb0bd3320e13c58814174d913763d3f1fc0c9539821e130e8e3190fd614499eab795e03af46aa969bc8c9327049f0f14814c7435c0332421447e8d9126fa63ebbb4636d20423a8c5c2b8c94c2b1ff3f202c8ae68dd18c3e7f58aa42f1dcb2854157bcc4d2b639a950550fecfd75195a343d6aa3351c695df3753628225da46074e5c581239c230d09c1665015cac65c63aec61c86070add6622e82e0fa9c41b74c4824a75608e0b5fd3bd1898763899e8878224800a97c0151a1459a9d11ad8d8405542f4baa151d1d5670aacb20634bdd27a2db4ac96520667e356180a8d138d6826b7145063f45ecc741d828e8c5247e88c588b0df1b24a51ba2f0da5aa2b7d14c6e7cdf6e171fb5c53d82c9564eb135d278976c8d9afad5d92fe01e493f5833cd4b7f85d57cac16ebb31e23988a4ad358a7959ddd5f7a6d84a41ded0a247a0a4360effd77a1e3714bc4c64c94daa6bc4db6f88d608f59bc2d312580e6b390b2b78c71f1c5c7f529afb999b60741091a1282af4b091dc2a2759d6689b8c9263ea5e29bb986bf430bf720c00e4285cfbc57a2695bec4b675c86f7b22a0b87ce9bec3100b907758f44ba0c1162926d19782f393aa95518ae781f17f06617aa4fbaad710124d1f50ee847e978362def2ac339505fd0034a484062899a499d726fe38aeab0f4f98fc10049aaf299ef8aa88d0294ec4fc27df94d43f2aebefed2a20b9b2f246cb57409e97c1828139de4c3c90f92bcff8f6f2d16aa454102b311f889682547b55863c75b12277ae5cbf232c085b5b3543272dd3ae2a9e590256cf92ad4a14253842a265328a9e943804ea3a9851e00b94023d8086956f07b1db35efd187a5359acd940e2a34d2530e4dd39c6b73029c22def05b38508173b7bb3748542e91dc083c87825378e594325142942875091774ece691608c70dd89be55c4b69509e310334d38a8043ae26942b017b5a258c17be01763e90a848ac47c0a9abad890978c7f2a441fa30d51f795c370eb23a6f2be9499c38480eb1fbbc19e4ff59402354e2b77a552ba21dbef0fe56cf486a59cf351d2b47cf1c8717b439861eec22af05aba902df4996400852904c15549bb3d0c8366be6a3cd524d9981e132a9a42278656c3daff375a2ee045af3477af5521315b688611044a1c703bd0871af8c3cc10885e851a046f0151a50c415f553e0288d4121cfb840e4d2de6a1f849352010fdef91eb364e74be78cd8998322f07b54e9c8a0d4ae78304b7f83738dae4a6beb8ff134016bb5f85d802b45122e4cb3b4e657a0b944d16dd908a9af7f76d7894b861e91a25940901d809397b431c26cdaea90f625253f4a13f730e3a2f35c2749474181e66a56fd6227b1ae931bc8d9a4147f9004de831f6e2c75d88b731dc5050c50461b33276ae56ca202e41c00bd29f913b0770a5be90dea1116b0d3e3f7d01f4593d66f114ec51998f3b84892c2655915b5e87b60e61fe1dfc33592fbcfb0f4402ba36be5a32a21eb34c97c53574e9e1a6588d4c28f5f507d574dbddb05be9318b7eb8e8a590646addc2802bb6b91e6df4648f15169cbf98ee57e3a17245c407cf2ffa33c14cf006dc5ec9afe343dea7bbf50c3db047056a9b37eec6cd1b02364707b679591033010b006a547b64750cbd529f63dbdc1288e6869dcc26da66e1c8ce49930f9e9e165095c0d1a088fbe59b74516611c5ba66381de2eb9ae29632c9ff81d5c41ab19838bce6b1da513d6bbeb0f0350cafc154ab86e785ea1f07b22f842fda91379eeb4f5e90763e0c1a0e4be23081256965f2d7d745fe66198db4536bcb2ba8019454453e409a1c40e70174e053d36a3510ce479760fbd4dd046498ae998d6e6587af26535d420bd96882e270d3acfaeff8b9d2f1d430918dcdeb252985bc3f314c554c64463ad992f68de20ab0b48b67770484039a87110fb4b9c6d1926a88212caf281d00edf6c16239e55e675ffaf0db4e536012224387a675195eb1291919f06dd7f620b8b6f3b52881d1375f2df1538c4a7d32d4759895a2f4754c6d10e4c581bfdbd5b7148e34da03f0c1fdc32c379fd1a361314e37925249210a5b27af8940bf1ed39ae84b380d39e432359487a9e43edc9d566e3cf8896f51b037badab19a1ebcd4d29440ac64378601fe7c6879d23436c0dfdf5fc07ba0ebc2a2e237da33dd33217750a2827a25d59ba95e6f558b2455ccfbbfea1671b1db145c9eeffca3c9bf1158deb9f9d8e91bb8cc0cef6ebecbfdf958128250f3d13b7dc4e50cd330b1c95499c6a6b71a6ba716e45c032589ed61ae099c8464a2a50ca695fe984cb0eaf294c8e2b96691e1b0d96d595387d7be1547a0c571da7b1172cf3a75839856b262640ec73974a5d99a5488ede4f1880d641a07acbc5613cb5d783aaffe86716a4cf0fb632e432416f7896470e4f6f87f3633e3b4bbf6bfaa8f44054d966fae13ada011d710912a2224561d7ee4d336ba082bf0e69bea0d305fa15912fd2a4ed7cf27292f17423149af4d000b43bfead2246e4246493c85d6b0032112ac16a652de04dbae02c1a54e3ab58a4b9428e5caf742ef770123f1476ac0e785c345eba3f8d17eacef4c54dd17767be09d34d37898f6ee9809ddc07c4ba24fe51a86b9a7690723403fcb00ac7979a72e1c48112dca911dbe6cdd3e73b640481169d1077557e8d79033af1dc2f70b791f9a115f15a49102bc95ae01048b3be07c189e038d57274f05f44dd79aebeaf1d2324c54dbddb75c7f0f8190d9b6ed5ac56d1dbd38bc38118f9ec4e77d4615d58c12acbcaf50f19e4df0f904669b2df509b4fe2a31a6135dee7909708b9f3aa2d49ef0f61873be29c0f2122ee1476f32ac3ab6e19c4b6976ef3e1fac3d7df84f9c6d3720d0364338c1a778d9c2d2c879a515a5cfaa91470805148a28680d912facd7facf193a704d6cd8e89644f68f121021da47a73e20df14dbbc07059a43cca642338051b429e8b59d23eeb59a22ae346e7306beaac18aa97c8e0ec2933450fc9fd82345b91368a5a75fff06ce5c6cf269402c53c99dcd9bf60dfa57c14435d719c7fd3ab721c80697225e22c47d5ecdf0f6c2bb13d2b03856484a876f240d0ff01ad984670e54b4555b43491894336f4d53615912bfc0559935f5385781b47395a31cf05f36b3e89b615f7b8096acb415ecba89bf3cda2f2f16e66bd53f7b3af73cf435872cb166b4373a6cf0f08cfe31995d5ca5fe5e367905df533834a36191676516e8b5fb43330c1cf0a08ea9006e67d17a6391ab6c084756cc04a9acaa5cbdad9188e68da673279569208394669159cb76b1f34d435dfbab3f18f901cb3806e7cc645005207915f4bdab12189943a6332f26374f8525aaba4b64aef2f3e4cf0d77608c129aa8209ff34a1e2fb68415be3c2b82dfb774134932d796e9093698fe6374fe567e2302f29629598a0897e955726427f52c8605ec80f8a63493792b5ce65814904395ae63d04a8901c5197be45de6158622338b419561ce8f4a135d6ee296198315517de0649ebc3d4044d9f88c9d34fc509a8e15ace0f6ca2089f746f942c89e9624c77f42152e8523db8b482d6fc8d9929ce7f5e4e68ab6ad1ec6d3c4722b9bd296d43baa8fd91691d1c0803e3ebb18e3e4af0c7aab568a652b21b8fd5309a59036140436d5a4c73269d374aed2c2352fb2120fd3413354c706f49e23aa47c755ff36b8974af6aadad20f229c889d2e55b367f1951511aaedd76c585ac7b660bc6f113528078b057fb0723c0328534388c98c70f3676126573f386a19afdc35deb21910c567cd182d4beacf0c8503371a74ba9b4ab33c21b0c6132eea1c4c505312661555e97f630ac1b6103b857d9de70ba38185af39e76c73baffb22018790ce0a440c599bf8b982cd165800a7182d6b27f2e91de7a02b24d2fcb63c43b273ff41a8abb55c67d6816b230f2635e14d952ea84568fc9d5bb47f4951416db3d02b57344fdf1753ee629c413c34a66ffbb2e1bdc7cab0bff167eadd912c4c133f0db9410c4254fc422818a2f828b4d9884f654bf0b241bb4dd439b110e4e8c0e2a075152ec887a3a472a5d4b87797f3ee666b4d77d31ff6bd2aeec7a6e81df581952a56365085fce0288c9b9852bf167f7f668e60fe36d6e0f53a44824b304331d9380958da38f1c25161f0136faa9fe09561443001f6c76be6de9e28504926958cba2418b063457506b516c910794a1530674b718007a9219043cb9d8cd222804cf9ebefe1d0070ff7a05acd435d6078ca510b1b09941dfd1de267b8bfc7d8bab2ccb528eb6d864d3570b3804d2c6501290776512dff1ac5e78f843d6deb472e845b98458caf43a58e4a01bebc8a31822a519f24d5bf48acbc559e041198f1985082205a9ba23b46a3d833a1b82cb26c9c3e0e6ed35dd9daef704f9e21e00b5d5fa9822bd0252c636ce30bd368ada58d33facf8521e2c41c3b621864f55837e037856d9d0553db643863a180a710bb27095f82e92f464d351598948d76e2af268ace5ec194a7f5dda82479dd5cf39a764e372536aac96cd24997b526fe62c26887f456e9ef3672f8060ad4fefa69a250c5ab452520492169001c9b10a4082ff6deb9a8b60a965111e913b4371bac49daec591446b9af1023e0c299d96ee84d8f7c7e865f2e5ed0d7169f2fa49e15f158d13af616214c527e55c6c8b15c3a7a7692ad2fe5f6fe3f546b29389de3da31b5db06a8ac868389aae1d20c63dcd564cf33bb0fb9b9d8e700ea9a94b59e7c0897f3451b14e3c7f870102110fd02acb07947c2ed38109848128acf085b0f98331160f974896113310d4f02503615592f15528f165dff16a8f4b705e6664abc6b9cf6618d0e3ab7d5f00745b717ebe30085c2eeea6f5ee1500e8b3b8bec03cebc5815a1ec3701bae34f805395dd60ffeda0d22c433117b64ffe24d97688f188eeecabdc2ba10fafdc3fca56d69d0e16d95371bdba22a208906b361bdeb333813d6ecbcbc107744cece1cb29ca8fb51ca38bbb267e247b40fbc387d2e64a1ac6b37a0965dc441f26a6415581541e97867a38a581fe7c58bb02b32063dfcac5922439220f95937b60edd46d9dc393faeccaf0ba9cd4a2994a1e41b7e0894bbe0fe657c88916e60e87664a7dea4276302e448b8381bd09a9cc7f8294d8c872e9a7c43c32a438d311c9b8df729db41b6cab1a5b76aa3c6d5bab384df71ee0ce7d38db19496896e50c8b33d288c67125cab9284d11683d5cec0d2297bd2a1bc92d2ec3541093003004daa0f72f38b1a8c47276d2b88e0fda5f5706b1af0c6f93ed8c92b5c8d69979613a6cbba17ef335e0db6e4053e8932d3538a1d245c1af2264672f4c2a5441851ecf4cea07bbbe2d6d955f40aa0e1d164d88562b146eb09a3f3ebebd53718b2d030ae8a07acff115b21b68fce8308ad0c155a8c701951020975a38e8deda630ce13e231982b2aebbf62b8108bf7823f36119fb36757ba358e13302152e3a5360451da0155c9fff84c0345fe004284df2b669001856eac0865c82ce6d27c067808ade1e2606542ccb15f0a17c4faca777f45b3ed4718176f7e1786ec4d3d74629bdfdc3e12b390416ee9b85c24c80ed84b09ec3bcfe15e1b62e735a4c622fd0914919cefd22aa53f404b88b655735cbcbe6444717d43c2199b14222e1736169a227906c19b7e382dfb11d2eaec292b3360c098c63bda8436368f79598c1da17b8cb5a4b8cd9a91d22d8b4cfc87d69f76b33d10532395bb280a352e07381230378565d7161b23870853537a1158dc3e85d6da56dadb0b52d3199e59ab8089bed941b2cd06174406649a6a607b477855b22f70832205f3074b0e7eb70e61ac1e9ee4c6eca2fc3a020dc0ad215ed1eb7ebafaaba61df20e3cc10df39d8edf4f03814af84b07f2102ea0cfd54d8f2d618d5529ebd05ee7f3ecadc47f015feb0d44765af2a8848568e74060f9d51bbc663e4efb089f2d743a773d1e6df84af24534fcba89ae8f10750ea710f43bff882cf11520350438b8f030ec0246951d4c6b7206df5d5203c8506f0919246c92a92b7aee0bdde4c859840f54ae530cf73f7abf042c99b913fd8b084e0d02f34507fe327ef9d124b338259ab3a09429c8b97179656c927d972940be11c2160883905b4127978be1679b8b6eb4ac07168b5f3da129d077c6f930883ca7b9b6e8d7c80113644008691b458c884625d20663e8665a31de85369adb2ebdcd1556cb1e963c8e767445dedad4a5d78d9ecd7430735a6a6495489421a11ed94f713644ee6d4f4ee76585c906932600c28de680521eff20713cdc703a5b28d40d876b8053b8b92cba96fe8371133cca03af66f9e5618d9ea6ec5cd08c5518eeabb12aec65fd40fbb3b1a7b87270db43fe4ff8309a492408cbbbf6923a597d92739b51292feed5cd66fab2a6c44da38e8c707b972ae6b6744faff3e3e976f54d35c3a31f9d7d2cf045844355132711af4b0da892416c82b8314d3b57871413470e8efb6da99094c65e59b20849b253ec845c92110619f9a6cfa1ccd510a3a750fbed6a2c64f3d7ff63d99496b4e0d3105d84d3cfa9464c66d5d045c8b46bc8eb2b816d459d97a18564124f8aabfe5567d83f919a17971fb7c296d0edcd0618822b1902fbcb628bae0e3d5ef6c912c47ad1de134c88b894413f239a09b7b60d46cfe220c45b158d55ae66628d3a28df4c11c006c9898d405fb4bea36b3d0c2c0a3d9b5a2d40a721fcef176b29dc5ac869843959f168ba7d4709f97e3442e85485736368002cb6c7ad18f297e61bd3a492cc22adc59016bdfef687eb39120dd511db1a1cb8ff66df52f71c695b08a8c7f69d2b95d582937d1869aed7fda4bd33249206dafe150e00f594232e7d44f125500efad69a7892f6cf6ff00e6c400353630fb5b04531b92ade1f15f019efdae71f850a92a96becb142458b005d8d18af359bfd35f4524f2c336e28015df4e8cb78b28b5a1080c3d1b629635bc4dd0c7d446d6a551a50ab58ee647e59a8658f9b9bc222dd2707b394b1b69ab7cb586d54c92253a3d73c7551d88441d8e359975c31378418fef7d31ecf4200584944ff2324e7fc68ed800606bfd6778c043125d2e3af6011092da4c91948ee0267807bd9c619111d23f8b5a7b3e67b355b759783ecc29f5536cd0d747b91087763de961a9a151582f7a83dad5de5f244b0f5fd0f5a062efd70b6c22efeac744fd3a90ba15c856cf03c8dcc17007ba15ad4fba7a43651041f141d58e4fa1ed3b84aadfbf18d8f080161f15c9efcdc35b03222a5ae26bc23a889254b209e9752e47cb9a0479bb694e4f1a9214dac04e80ac112d12bbd10d9bc3bab61a5e88775342153e9273b84462b1849a2246adcf231b927a3450d6a3dad8aff40ef59ea467a716e26f3ff80fc53731237666d3439105d37c4a53c57cd84aadc90c3dc5504b683f6fbe8cc3906571b4c2b952a455d564c19af8d265d42bf906b9d46fc1729613160234bbc50465681c92793266b57ea3d131b0d05bd130bb1781782add9990e08f758c19939f4b3cf250e1736e59b2b07dd2af953dbcf2aff26db22313439b8a11653e235e06eb1becf72d3d16a328620d8a339aefb929f2fb4c93bd7d077f6a23daaf8e2f621a42fab2a29073ce05df22e29f5c84afd0c025d3020d27a198a112884071cebdcfc2d8318fadbdad4983745873a557b0321bcb7383901ef6e078d71efad65a1231d1c08129079f2d97029f8050dda7ceb689c663ed2201cafe0b46a9010d630996fcd2ae6b56b407a1c615b2fd2529a40609bc0aa048df2320b44e13f552aa64991c3090d8f8d2b71b5df7c8a8925598903d5af72283cfaa2d3efad6a3e2c5dd1ea289293189a509e3940a60ee8de0e0f43400eef90037539e0ce65cd7e50e386b053fa8db9db67c79939de77f6ce40202c56444ca16f0f4f97dc22403fa7e51c4d76a06735a4da167084125e3aa585451b2b2e20590001606352f8d10be680998f51f28299078473ef399233e5f3bea9f32502891f892977eaab311b3edb016200f774a39246bb45e8e9623678024e7c0e2a569ef1b65ed66f3fb685c33e1d781b5adf60690c890b3f8e48f470e063238cfe4e3ca932b7a83f906ea1ef1cb94ecc75e96d3f906e5adf65e92f0a9110855a0ea8e8c76f6d8082b73b89fc841ff4fb84c4ffdba3033d84a841fb80892ad661ff1c0f2d1fe9ef6043dc9c16a4721128c01fe78c26ab0d672641eaaacb24379ca94cfa0a02b72a2b407b4068822942e7b3c34f3a55b033b1bd118c9f98a39c11516a455f7487466b8663b5f37e3814c3934297f00ff43f620b837b4a98d03dd9e90cf0b35d944ae887d259c81af86fd0313186daa59859d4afe9a8d0ac7b57e3a49325ec7f6d9fad7ca555066b8e41579ac0baeb139255aec8c3b9c79e933dca824729bb83210eaab9420843cee1650320c7542290c2f0931098ae86ca864c002f8cb2bfc60c721fc6356455b6aa9f0b038519088ed4cc158f61133c0e3c9a31636c188806807098e21b4526e68e7e6f7570b9731eac1386829332b2e598e58b2d2445460702d7f21463ac026c3ddef92e0d7c236322eda9ea015a2fb06e16f4d1baa828a68bc9c7e6e873638ffc442084036320cd1c42a4806f94b024ff4eb67dff0acfed085cbdbe3f748b43eae9c4a1d8bc4d9ba7bf85b71c8bd169ed002a3466cff33f430792fc05d84702bf26df77c6a26bc9cb6e58b4de1c1c071c4850d837c173dbda0e2c62682d5062406cbe18ac397243c76da40dce2e036ffbfb83b30302b68b11209872dc75eac7c7d950cc3421bd7abb9e8b19032f0979aa889a703f52cd1c7908171ec50cb51b81dff3a4e8546daadc1c2229e823172de89d80f119f211d33e6499d1319d4207fd164e9abb4da04adb0160848d223a93359722d1f4acd8664965386c3e0a8e1349ebdfd5959ae25164d3bf15caf50bd11a93e090f80b54adfafc2036dd056c883160bff0b8023aca6e8e165c49b0aefd36086e97ef469c286ee45b11b104af5d1db4190392e557b7575073c672b97fc7400881d0940431a10e164e00a8a1d5fe1b41e0e278e9d436e7f5146a047871c0d34c6c3078a6c8f2a69f36857e1873095a4fac6aadb12685fb9fc0ef79cd819722f19895465434f3b401163467db1e0b6dddf4d06cd5e79cf4ca4d9409967b8e64ab12212d29fa5a1f88d623928cc98d28e6062856f643e732a94c1afd9289cd5f6ec5953e9230882f06488412e40479125f396826a13fdb01c38acc580e5e929328414d13222f3af2e3e34c4c51265411573849a865e88eb1af386a343b3fa8d5384ee38b4013beb462822108d87008bbd5d75384456411db3fe410ea92162d3cc11f46d5381c56b788352af83a5160c27b7b106542246e11a26432602714d1fe01f191bb2f54ae1309582f2481791077a246e94165cc733eea24b4e1de4ed412b6a3a625bdaf0fc49daf90b5ca18b90c405da020868e99b64cffd983ee11c0a7cac4853778b69e21a73341e32610b5b56221a0e12c3be4b0c7926aada337321980e86d13fb33a992a1c4bc89e38b24892b3f1b019b358cafca4d2374ff8130cc6cc6a68aac7b3e1b06266e80265c4513cad126564f4c782e3af7d44064d6d75035bd5e361480fcf7a63d0203e9197736fc431c27cc61ebfacc20a251f4f95f33dfe64e889b6bb789bee8e5f30909de52aa2e88bd6028e5b84add62b7e0f82627e556c6a6f8e2b8408d5430e4681d9cfdf79402a0feaaf720c074268b7c384a03b4fabbdb1afd3a1390aae3f37e88214c25a5bbede631581365f6c6b5802591e84449f05cb5b5ab7f0df4494ee4e7fc6b70ce5ae59d09b38c30d07159683515f5817e7fc12d68a4c8186b7e3fb5a6e61d6b2183523d7a1d08f9105d6fbac34dd403f50a5845ed0c3b343469c0ab23c00f80a0f458d51b67333afca2b0efada0eadcf77d3f26889b61d0fe514626a507e741643198854fd6560054082238dd1d17b029cc0b55d50a50cd585b7dac431785503207873db0ba66cdc01dc4ea3dab5acaaf0625ca8d41417e5470eceb397fa3d17a506db22700ec07eb0da3157e01f092c38127cead19a2bf0937f6a6df241c74e01e64e21f360550403a5da87515d46b9e4bec51a0ac8b7335fc9b45c6dbcf90eea6970ccf5f8054a10ab76f9b88f54087e7967cdfd29e0c85f30068549d00b8175c8acd6145731ab7808b571fa80e40eff0ca1d20772289ae4804764b2ed04159a6e46fd34edf28cbb60af8a346a0b3bcc826a2621fc5a60e5e8eb57615b1b204178dfc60197685d997da6a1e80d3fd6d768934bcd7f464669e585938ca68d64dea0e2b6be8ff2699738631aaa802c272e5f652321cd9e287cbd86a96179526876659a1a3ec714692c7d553969d8585cc2671fc5c6a1233f142f50c5bbda6704b51b53bb9c91c61aec6bc6f2609803ea48a169c4d7b711e89b415f3c2cffaed0c55e660732567c238c677406263bacd47722f7792544cdb95b1b977b34f9715e60162d0d87fc3bcf67df51a7c1264d593bc7cd62eff9b4a1856a5a7976b1571397574185f33abefca9ed6ac03537fadb5f2d74d7414e29a0e01ec52058bd7964ebd642ece8e38d71a539097c020ccea2b4464341a12fb250143e0a638028651e0af30f43b4d56668184cae3bcb2fe7c7f4f8b262c067b98418ffbee00ec3a8fb0f58a3a8955e29656c7ef720998db9d2fa09b3de71e944a6f32b3330f83259bc1f3d746147a5bfa19a638e95e81844fb09bcca391fe385936c360b8030a807a1e9697f9245a3ad76dad85c10ff091fd1a950d5f705f9b708f6b7c4086c8ca096c832ec94c03616d6e5f2a029103165f37333507fa9b5ff829efd2b9e62fb826fae7d5d71e967659fca3e7f691d570a2a0052243452fdd0ce097ed2dc83fd553eef79b67aa19b8bccd908787a0ad69f4049028cd208329b169d4b48f4b098879265b3a672297a5b13e6e7cac89b1e5986f1f831b693b7aa033fcc1ce59066890059d2af5ecd11b4317c895c6d9ce752176cf6413a4e2903912ae044418a309971e809e6c09439354da8a29121769f64f9c7384b55ca4c6bc691c3e7093e1cc1623a43e2a46dd172f95fee511db2d2fc84f7e3572826d5187cb7121a42df2f142e8f07d76f7b7a17f2297990f7701542374e00ef67aeea3294d0293adb1ad83a898de1ddc86d2c163c02f571b6d580d052161070764609bca58a65ba76386a9c769a18e4dd0092bfd375149f785b4f196a4b36161eeb85d5aec93a204479b072c93e436e4bba3195f694d4141fd10a2ded3f0b5dc1127e4738b193161da1f02bc4db056cc0268c420d67289a62f68e882c1478706b748e130465247aa0b359fd055e61e5ab5fe8b24d5fc1b457ae803c890e778cc0e8e2eddd2954298480cda781e82d1e54fcb15cf5b6887f36ec4bb39773258c75b0b4da199c2f0dbea3ca99a39458e80f832a8d74b886e4ad25fa5f61f8ada19df7786677593b7ddd6b19c40e44063c19030253abe9ca6535407f569c08557abd1350c5137db3f1c7c38394f49065f317c12a073b6e9bcc5b484d8856bec08a4ddc7b005ce3ae1c4f78b000c68aeeb1d18af7cdefa031bf7faf5050d4691350e8430c9003195b165713fcc8fda707d696eab22cb044036ff0004f9fe18bd2ba0f2a1679d60a49ca5a1b01e37e248654dc4df0b2286e0c424b90457dd256205c296b5243c10686b506c6c456c5df704844ed1bfdbfa45e6da646a04c0624a41180c25d8b5309ebd39b03e48d1af3a7d19318e30a1486f2663ec0af6ce7280c3b26685188285bb52dd243e3a57249d849010e1aa109a1e0f401a03cf679f52d5051e908ac08ff48c6927180ba09d47bb8df74271e1a6c5c4476006afb0b0da1838adf203f696f4e47ceea324e5bcaa35fb4eaad8bf03135064ca38f7debf6ead8768dc442e7d188040fa316b380d4ac204f15bb8217e2b1cb73e9bff5958aed53b3cb7eeec0287a708c08028070c1c87ef6ad544d66fed881da23d04103e35bb21c6f12922b0a0ccf680408e9458681ac2fdf7b8ba7e7c8868236bd6558e01786a46fc153133af0c34b548e25032a8e3a62d34b3777879002b1d0ae05a3e41b24444e788ab82b3700be9c542da8cb31091f75b389025903807b435958ebc102a48bcc741ae972098044b4bb8e24cc889cf9b1e760a2337bbd59181431bd1727f9259cf86b39ec5ea062177211b7bc94ed3a67e53653272525aa8fae66d1c2dd39c4c9ffd2d5e4345d00378276e80c3a5daa4d538467a9df95324a669b9a09899f55ad30cfdf1106c2ed4f1d02c9253c290f2461ecc9e87682b4951529172317313a4784151200ba4626a8d43ea3e3c8f08422b88d0707e70e146ebada575ea958edeb5728786d62a4e6032196910c869be28327654230bb71efe0af79709e50b1d2067d8cad42de94d108da355e2534a63461c8a9c61604421574f35d1ca314c86064ecf46515c8d6865370cd566117abdbc915a527ffc0491c2f6c176a231873a80cac9100fee0180b06030a960535810545f4685c15f0f4bcb3800d55500e490e608fd517e54f1a41f893048460f7d548f483f0427b6fffcb871bd58f083b602b7a7494226cea5a1ab354368c4897bcac7b88f58be38497c82db9b1d93713841e7aa8e73dde1fee7f9c26a7c933ce7a2eb27b28cc8545904029796c87174abbfb141ad6a3bdcace19a1c9deb3d99152bbf40cc7870a19cb9d6bfb46189cdf6bfe3d2e1a58c1f52a81e5e9c81f63f0dd02b935a77640e9df09088db85d54d10780d89a60e2339d44a5bbb09f28bb60225b517462c7a311c9d031ec28b0158ecb7ef26f900b47e2dc6a231845be00af0e6924211a9bb59cb52ba23a8e287de1dbda08b0512cb426c49d2a7d841f47c83df20f24516672cfdd6b92c1d52a5f138850378b354dc0609fed98f2e0457d8619006cef528952431dce4fd5be8a0b7db27c12a3aa302382cc390ab9665a898b9398acff823e09fb4f0eba4d0fae1af51018b15ae90e9e6295a52eedac22b6d9ce0ada48d3ca159f10ab590e2a3f442cbfe54dc3950788d3d0902e230a52611bb2cdbc70d927ebfabad9fc348e8afc3c84384b24404bc042f74690b16b992e71d667153cac471c72ceb1a76be90de09934e083639b584065cfc024af1ad615c40d619a7032ee93f588bc2b951c6019761daa4c6e0369ba7ad6100fde2a2001070906be43076a3b6bee9e30d1ab047d7e6959f273ad2d0bdfafa4534e64ba91bc3b29933d00b1d665bd877dc80dee28bffd2dade7b6f29a59429c9143806f705fe0591e40348882837becf1037c86e5419818120840d4c77b4844d25b9dd1fb79ba641fba474f0dadd1dc38322288106545442c06926bd759f000ab7bbbb8b60b1c2fd2a01ee67a38f275c638502b8fd35882b6ebf66493e4588dc862288276ef715d5d6fa3d13536bfd010a0e309660c1fce084167049582f400041a5d0040a061044707881e4870302891b5c9ae84901082784909c68bd00628a15b42441b90021041d5868d02201d1041d569058794b25f2c33eb16221821a3242925a21828447b46259224e72d894001a1129420eda133a22225aa0322774b615f080ad863419e070c5aac48c801216890e7589210c0738502484ae2a56306990aa506e904be45025a02036013465f08414f8133f53065d04a9b5564e052e80b7d65a2b1343fed55a8390c1ad2db0a94f2ad12454962b225a92fcb99f7d02acec8cacb16f9474523ab51c2c8ccb3e2cc02205f6058e1636dbc1b3ef830d9be52c892be2a30890e934ffb6c8a5da9b4c42a084e0c986b09a133be89083fbfd434a7d74a8e2d22036f3b21cc9e3525343816d21c2155a643fb65ef6d1a10b8c0896da80c46a41b426ac6c410f3d0cb1f1b28f901f341e4b2ffb0809828896cbf0954c840f1f227eec604104cef5f383939e1ca41040c3ffa58c96ee5eff9c0fe3fd0d8dc8606c781f8c7c86f1672645ce92aac6d96ae11159ffecba6f3bc9663f77cdcdccb5b9bb1d3ec3ede7eed3e4fb77b4d3a1ddeac5a64af85b24feec68f0cb77f6faa5cbe87d6c222b423e84b08b37cba447bb7a33dc7926c1fa920b9fd4f057b06ddd3a17993f97be991d34f8fad3e0db0f6bdfef39fad65c4c106b7a1c321af1fda78c9ed1ebf79c87890f6f7c124c746844c6a520d65fb60f710eff22f46707338bc4f7ae08ed607ac2fb597e861ca9b09c67454eb02c7bc5fe71085bdb042f8410da20ac3fdc5ce82b3dcb311cbb222e2cdc02073e495450fa627aaeac355766b54f302e474ce544f2a4b807282a52b8990fab49638e8947b5622a525424d194b449925857be922557be8c26adda24935cd28ad473e51320a4b423218170724a3a2377aaaeece15a7dca48296ea5e44a8e45e269932472e5cfae2fec7ac61895cf10251e67d0900b8e1497c9fd48545c7cb8470aea534b90ffcb6d11bab2eb640f4e25e145af2b83d1d17969bfe8509f3e8b23d427d8824ba21279ae0c48aefcd4950f434d62e373aa6e75e5cf1c6be33ee2bbca69fce5732ba7891e90b7a80004fb71249e2b3fc6047c2205714c8ed3b08d555df9a4568ad4e2b99284041f3706e7ca2f46e7ca18d4952421559f78e5fd5b5a4e5382d18b5e4e683f3e0cf6a35782232558f1d86d0bd0950f4374afb2f7b5fc5cc9a93895d38c3c1818441f3fbec86b69b94cec481cc72191cf0149e1922cb9925bb5ae7cfeb89f2b9f3f0eca84a4966c394d7cf9a49ce8c1c0105ff422af044ecaf148382e23bff2dc2fea64aed53e7197e326f40311396356a894ca75c0d30327481cc6e86540d990d3b08d779990cb64da9039e77cd869288d47fb6c68761a9194913ef135d226b9693c7d620da50dd17858afa95c463ea79a1dc76a138c0568e07abc0cc865e4f3b0919caa4d726ad96b4bfaf49184a6a6adfaf4d2fa813212f261e8cad77ab46c9284faf4712a52167df21c5cb9f371aa2b5f53554df5654b8688b486729a6a233f03f24ce5346c6344e309ca5a9eadbec883f5a173a5b6d595fd666030b98cfc1ca7a99e14b2fd5453f5495ee9f382d495af0169529ae6c2d192f4897d78845c293f6d75a5d6ba52fbb9528372a5d673e5d379fa6a52514844399191c89551e74a8fe9292589c10f74ef20d39c3edfe767b3fbdcfbdacbd133ba0b902174e71e3d04b1502c232f60ffbdea8a85c1353343e13e4e39a7ecc186b6dcf4e9018727953be794d17296e4038322c0e0c9fdecc71b64dc27a9c1cf606ec877fad5b5b9d5cfa41699051b03a00fb71ba519f2bdbb186f946477b767a3679779175f76d12bdd2c6a33e358afa7b2e38fa5cb9b0b03b8d373ec61273ffb20ec3e18b719cdddd42ed3e971e92b9c113d0b039b037ebb13768a9d62a7d829768a9d62a7d829768a9d62a7d82993893d823dc2a88a1d42bdac148b04fb91ec116c9451151bc546b1519cd828360a0c0e10c6ae59b4db98f705cddaca32c8a1c819698531ff1c47b230e2944ca6ff18ced942efd34655ac0baa8caab4b4b4b4c000c20e7dce52ba941e5972dcddd99da5a4ee524ae9d5dd99ddd9dd3577cfa4f0677fd2b57649d9adabdd1633c7c487d78d9663b8bb4b0959524063c4202d020f7ef4e087949107b28994b1073236f9914d66f99169b289b6450d34711b348f99d00f1d020acab9fd798b06b966a7b09431caaaa9899456a6f7056f590568b4e3a6b51658c164ba308a65f372e409a2413428d364ab564ddbe2cf0b2f6c2eb29a96a97090c2a40708d2408809caa587079dcb3fb8dcb34312b76b0093237afe5ad80078f9610f963fc2c4e8cc8491cb8cb598092297817a94b81f073161c5fd388be890adcbecc03dd8af421da1956a09eb090096a0e2e30325977d7cd0c49dd1f45eb7a301ef0e588527e34881f68ac8df72b0f10447e0cb18d9bb49a589956a15e2c0326b3527bbb0fa55ee1982aaa0e6f9719d49eb45ebc73d435005839aa77f26adb30e41150c6a1e39a9a4b3fbb86708aa82e6c7af0e4155942e87fc5950cddd1c7b5850ddddcddd5c45976a099614434b7812a0c48f14523c21f574104bf1518158215c875cdae2548d899fe32a136ccee73b7ab9692d85fd3ac7db5db469cf3bb05fe74020a894d5bc9721363ecc6c1643197c20cd8dcd6ef4d2838dded7421a48e7b449bea86b9d36b18e3072bf0eea13b38e20d2437d625611496e53b9d26b210c5bee2da569d8a6b3b8f2abfc9eca921067c69a462fe2362d9b1db15ef17038f7789c8b161358513a88fbff4c1d74e52711741b70d92789212efd8a83bd3a95e3341068e6a773feb23a47f33edb3d99f7cdc8ff4c6de44a08e4fdd5391d0e8e7143df9d5a283ae7a6dc7f66fe39ce6f4ad77b600b928c4b5feb5cc951200e6601babfd6f5d0febab68e061e369aa669da43da7d25c0b954fb7eadb1ccfb3679292788c746c8f509d287a192ca8bc28743f23ba7befc2089957432207c1df9e31d6bd3c7216977587758774bda545215b6b0ee53645c7a29a2e3534a6b866159c5bc1e9847af8b561a3d5523e491c59723b1848359902f6bd7a35e577dbeb3d65abbcbfbea9cb5ce6f856f93bc997074a3c762028acb9b8dd18df1868c4bb606f6b3d76d5f209b9f75edeeda1ffd58a594f12b918b80cb5138218bda7d3a90f030cb15967d90e85c1f243917be021a6e37b1934cb0f06514ecf5bc61e07a3964371bb555f6b35dbd0b6ef539ea20410863f47ee6e31e0803fbd52be32422631b8e4840694991237344163ad0d1810a9b693a299d198e5db9ec73448f2a6c0a52aab02e3ef0c16a526048ecf64410ac0a3e3461c48e0a8cc88962592efba8b4d842450416d8ebb28fca0a2558ecb28faa6552b1be54c4cffd7e466e91c518678dd1b386588cf2090b4b377a8cee750854cee81ee710dcdddda7cf4be36d4e9692e7cb8f33c638658cd13d466f0cc6e859f4185d13f58b1c32b619904f94ee9ca316f936a7d4643684c56b4e592fba9285853fe59cb2d37e64b669bcb9738c7506f9a59829e59c730679e7943fa79c536e1e277655ecaa34ba8b341a9d46ef39a594524e59e78457a551c239e58552b329008199994b52426f9fdef1bcd2a7e672def851c3649cd97623218dac6da2915d19d9159616927db1c2c2cc2d24ef7a74af85f4e2bab4b05c49d25cb61bf94e7a713d05935685bb7bee234e83e12577f717cd9d2ab1f0e58d0d63575a7e24099a90a009845a40a805845a504ab9a094724129e5a2499338251667cf9cb14762b3024d68133ac50ccb45eb552994d05f3699ef229b10b1f0659315ee898c4b1f9c742503315c58541b02fbc2858d449b569150e537d08383827542cde04adb4234b2975da92b2c9ae93b1840178e0e300d5cb94c3f0ab82add9e0efce118433676129031811a76bba92b2ef17a8c8ba9198e1a0005ddb887a38536f58f9890620cc7b27d9b3a966d6686c5855fb87cf1752bb0b31418b6c849db0d74c1e11cc7fc385c361b9f820bac7f578d59b61bbbb202e43cdcb926d868a1d0cd46fc5c6d149704bb68c101df037d6221f4642ee4627b20ab4f2e171e61c285a30b1ffec027303bf2e3664b6e76648a9bbdd6a7b79714351ae05223395cfa73bba1f32bd3b04decd300ae9cc10fa457b92d7433389560dff2d0e10951aeb0a2c8931358e14d72a20cc10401375f3feb4a4eb37926affe57ef8684fd6aeefb774d9f4a26d204faf47d0d53e9495ccc4b1036b6a9be7f5fff4284bd3cc6300ccbba529bb0dfba1edb8f44a28c061e36db6bdd7775a2df36afc7f65727daba2cdbb6abd33cec65f4b7092bb509f36aabc085f57e6e492232f61e6c6c130c95b1fb74cd1ae05cf67102c82dc0659f2440b7f6a908f6fe5ad4e8261f6ab3ab0f6bbd2952036773440777e35f7773615e39ebedf89dfcab93b77fd239e7c729a5bcb4a30d4e76266bf93c6af0dcdeddbde38bfe9f8c2b9f07c7901e8c8d075c7707c00300001068914814809b653cbfab5cd9c9ed463ec31cfcfd371e70dbab72b3d8dccc7d353169bd24e6360a5fcda2286e0e83005ceaed0840b6cdb07707149af1770704c2a08cb44d40a7a6519a65d0bba001abd46d86df6bbb219ff246019a790f3ff3c79e7a1f8f76e2625d8efa7caf2e87ec0b814bbd1d10b814c6f6280a415f11cc1bf25a42364f6029c03426ae61834fd200573e64d52800d3d424e0cadfa0b035a03771ecc75df9f283782e6b770cc35c83879c2b7f04d047d3c4ec3074e5262554f1b073a95cf9709a6ae4afe01b0566109edb37905e4572fed966859691dff3e195bf62042b93f0c16d1fcb3e4f38b9f3bf19e6ed8773358a317bd8c595df3caef655d68fdb8df9b00b9cfbd560822b9fbf1aaee67db07ef0aff7edc6fcac4a952bc33bc8c56a97837a3037e0e581c1c621631d108e7c60f96538ec20902ce3748c78084ab9dc4f80829cbca0845b2dd4ac305373b94b709b41d2eaa783bbf065c481e54222c169dcfb4050dfa3ac9e83e07e1eb30c7f23b81f7fdbdb1fe50ffff93fe2435e007fa48113c01fbb2f7acc07e0871b0d786de20d789b86f8feb2ba0c3ce232d2085a651ca44879f264c99224498c186181e2e3c4902b9fbf7657f9818c4b0f33d127fa391a59db7d3c7638b79783bf191bb2fff2597e71be3c1d1a3f7bf7d18757c43e5edd77c5177539e4777f5d1e86c58b7e845786d72ec70e1a6e7c1ddacdd1cfa28ec2d8a8da14fdd6b197833f7ebbc0d775d1af6e1ebc74b3d194fef65dddd77fb9c07fc9cfa2f7f5431deee5e067a9b197e38b0f67b8adc36df433cc8de718f34c876cf4ecee33620dcea31b42e1bed1f0867176cefd1bb041168b51153b8575810d1a55c182db42b12eb053d8292c11ec14168a25c2ea9d0197bf035c96b9b0ecbf4be4b1bb4c562b66ad7bef32cc02fc9ed238bdcb3db63d193e72707abcbda18eec782463be2e266aadb57e35d51905e418a00130870dd0ffc55001c8e5faebfbb2f7e9a831d51f587e1a2f439606e401733aba317b3378068f186ab5d699b14e852decf5145e32c85a63b3fa31d4effaf5eb021cc0513093ee2744410671cfe2d618bc7ed7faf5237cf6bea8c421cb9653f4dd4b12ec176f658f39467d39822d92536d5c462ba04f2bb4893f0613ff54feb93ec47ef4e1c7900166818b50ea719b8af8c72ee76dbc7940d75ee0f384108c262a14f11285aeaf0956ae902763e1c142161e602c626767676767676767676767676767676767676767676767676767676767676767676767c787f8f991710942202ab7df873a7ae7b48f180481dc95dc7ed9d373093472c5ebf2865715c1d49c35e79aa11fcb66d0a2a67943ad8a4080615aabb716188806bc34e06da14d5d33d2b61b19e20ad72c2d25d24603dee8125d5cbca14b15710d0ba5209015f66b179f15d34401f8fad3401d2434e438dccf38ca793ce52a5ff1d329a3d7d4d4d4d4d4d430c3c83416124c81c0d6d4d4d45420db415c0bfd900967ca542a954aa5baa6a6a66685a4bde0a6d050e3748e909050a75ad5abee6956b7f8654ca552a9540a042cc4422f52d060c048555dd91e8ef52dd34f0b020d551c9bc3e93c8a6726050453a9144c090d354ee7e8cca062abd56ab55adedd40a9542a954aa55e6054d0a28de3c01c863c178542a15028aed55a8e7b20b8823d90055bf00702c146a15028140a42a0570100da8c89b39555ab7d136aa606b65aad56eb51d7434d94444594a302a0592bec6bdd32dd19e71f06ea56e5388f7a9ef45a9e535feb34d7b196e3fe4da6999919d7f51c8eb183e7d40b14e1907555d8c2565b85b76e905974778fdea2c2c29f974be9312b42ac08319f4b73658819b18f1df61c7327e9cef9991096db24f21982916b1bb68b440f451e738cf995dbbc8fb39ae759378136f99b38ae46fd61e37fcceafa729f34981bf6d2b797de2814877acee81db3f83ab89b18a3f434b8456c1a1ff46d781bea1d91ef9d3ff46a9ba27c1ddc9d2fa79411bbc1ea90654341babba11051f65982e40c0d0d3573b70e6f9618502a82750642104249d2af69c1df03ee84c8f56777772992cef4c91f9aa0a6e6460376ce7e137c97734e034439df67bb9c73b6f4da2b12dfbd18af461cc9f20e720cb657d8affab8f8db6f91cb83610f86becd111960d3e7ae7a5fe97166b867afbf7f0d3877868ae37aa9fb080df7dd7d50a8f3e9f12efbf80cb932ea0b7e4d423ed3ecaccb7855ab61e5352081dca28fc7ad41f5d5a07363ba041b006fcb8134fc22ec325458f8e4c687397d8250e8ba57b3b07cd9728c1e16d6232ce1238921444164f5847a1fdc584a64719985e4e7d65c662961e4b252ab5b80cbac22436e144256d69bd95e88581f767ee571fdb4a9eea0f7aa372f32b07ceb853dc4300f0e69533fcf0b11cb32c49eb88592213cbd82cb3e370012858f164771d9474992abc4081cbd24613bc6f85da94dd775714b8bf3e53c922d5d8f9627b1b0b43c935ade5a966f69f17ab4bc772c5e4bc7dc22bfc5b32b8673fffa5ccaaeebbaaeecb7ebb3cd03be3d773ab81f89362048458985377a6dda5e90b0ad62e92c888631c60845f682048410d239e9f47a4cafdb3b42870d636c27d90b9297232c63ee43b6471d5c9b7cb489ff6565fb3f48e5e248c82463ffc17db031cbb8f435907d96e29a8ca422faadeb24dda3a44d70f58daa161bd244db4d7cd17623a2d77643afad06c31b6327a9df28972b52ae3cf57ac531e47f6f52524a690dbe9b0753bffe25ca44bf19b176b4aaacab6a90d5a8ebbd4675f0422316eb48a3ff2ce416d597d159ede0854152245fc8174ab7692fc3471d4bb7d2c900af49e260af57a311e98e7456149ad824819520ecd72809b449dacebe0d6f63ff45fa4ddc6e6aad32da3e0d34d86bd3be5e6a3b1fb517402b1793b5767926ef4b375828010b57b4fb4cab3e5d2faa2fc39d5932449304fac4ec411da7e94e22a5903e0d8110c28717ec607061b117fde821aa42213ada853a45f48a33390dcc01937fc9af50671bc27603b58b92ec4509cbf2244695f58fd15f0525cd62cf25aad1a71ba514fb09d0af4129a54f3f66ebba1795edc76aad15ebaeaec45b26dab6abcbb06ec3bacdd3baebd234ecca2a56af4a5997f665af6dcfbf75a5365daf75dfa6ebabd3883c93cb5c3ff290b0713481ebbaaeeb495ccca8eb5e8cb0f1356d7b51d743341a899e6f26faadd3bad18b4422d16bdd487b912612699b56babc1cdc5a12059218634cc246588a26809f753db2d7bacfb2ac83de573be30eca8d1f57504a5983efcb11db7c2f140a859228160ad52cc85a25596533ccc2065728d47cd8737d9497077b56ab4a39f873bb81b06705678cb00e594bfaf4d327faf161507c0214b34d835eab4f166539c2b220cb4296758b8a3ab6a2ae8e8140a02b3d272dc86a537c185c58f928d68d90ddb1c11229238c52ca28a594524a295f4a29a594f237958d2f656441c61e83249265c4ea32956be4d2aeed26fb6bbb710ca39c6570bba9b5668f751ce83c30da701461e15fbd69da76d3dd35f8560fa63f078c2103dbcde55980b7ed067a37d8f8429ff88536c50e7b199e75d7d7380dc61d6b568ab4d0343eaad8686fc3db681fbfa64fd856832f06b5ff3c703fec75705886410cf3664c264d0135c32a7683fd2c8e8c031cbbb05fcd8db76fac0f3b1999d7428d5f849d9ef470b023cc171dec679db7c8c4c63611c1f5697efcebad5f735e33e288717651ced95d75d63a699c317a560c71f8107a1cc7f0df8cd0e07e88824cc6b4ec8611421e64dc34d1da0048675acb6c1b1136bec7e89a111bfb47846d2b9d9eec68a188df922753eef85198c00584cd31a243b7a287ca659f24aa99cb3e3580121fba7b1fc7299b399301deaf063a0d0358267e8c31be6f46ac7fafd0a61958d30ab2fa9aed9328e37b89ba4ff417079d37a8146ed705b1746a06000820007315002020100c0804227140208b535d157e14000d78923c74549cca8349920439885188188308010010030c10304363322500f82043d765e8920cba2c639764d855197421f3ae64d6b52cc3d3a58cba90597740fff714deb8ab2a2e935dc8a82b997749665dc9b86b9975a18c5d91a9cb32ea9a0c5d7e32bd2ec87c17024b07f48f85033adc28146b1d6de489383c88c993bb80b27c4d2ce70504171a77cee98380b0e67af1c9f5325e3f1ae49c52d542725fe0eff8ab5ab60e8166cf5c3a40b119a552ded9f65ea2d0f6628325ce62f6405307451ff7c447d5de0caccd649849f1a41c557bd23ed14670cae9064af6e8cec6250fa488e7195144186b6e29dba106a1cd4a5d44e48d68668affb2dd1fb036643e12f430d9ae4544d9189993de02ee82227b9c1b18ce1cea5a6625da8f95d6fcd7a0c13c15b5addb89481bb429ced2cc4d848b0677a7d0fc1235c070415c58d00860baf7db2614e597bf15f1de5958b142c15d8adc8e4aa3146a0956f2c4e9cffdcd8d4ef693e3a4b1d8072337681d1997569404c94574ad9c7e48110463a34e9ac4e590fdf17e85d2304b5586720f3c62257c6f07afc8cc995ec592d052929d6d7b28941a6a7f613fbfbc5f7c57631f9de13c8a23ede9bf13ff578742fa4a1ebe5ebb18531b0e6791e04c4f7d3cdc18e565498e2e06adc75bb372b1d72c7be1564fb4c3fb27e72523fa7f39aa78cac8caecfa5f6db863eadcd68215b22fa7122663fa637b4442c4bceeff10f82375d0ac8d2eb18ec7d127d1a55a523eb5a3c9b3e6d1d1f4166f508953c09298cd65825c56e7e9e6cc3de5ad2de2effd1db9ed7c18ce099826117aa2f39ac7c33ee20c876689c1304e17ea169ea650b9b9fc45d35fae3d82407a7ff03414819c117db6f23febbd7041135761bb74c3d41841a0650aba9a7d226007468876388ae8bee26c55e0683df9025706c4ac0481c747992adab0a5c6cac5cce733d9e82616f3cc7c3d8fabec8ee3e6355b95686de5b369ad759a6e2aeb3dd5c54217e6ff8f8ecc44cc1ae82f1728469bb26365225eb556f4b6d60150e12378856a6895936ca9f88e8360ca442c43c1cb065b569b49b8f9a948e2a0816de22d79811b156d2f7bfa6b5f61a838e331a9c0924c6e50aab6390704d1cdca06b6857a2def07b08d51f4793322c60f2b000165d195655c6504eba71b6e10d6ba01b2e37178a44478b4a448dc8eb5c1e758f87c8b0ef750c8b06e3b9f20fe0bd73b16405a6da4916343d3c729aac7822929cb0cc459eb6923be3f45664f456e19824bbe4bb5d18305b4f7ace884f8660b37d53eb577be91e8d304ae91ba4f906834bf4f4a536a5b780d0657daec3704a692c7fb6f9afa927ec05af25346e5bf450377cb37a391e5c02d4c0ce251b2c87a76e484188b1697e017ec9bb97f6e57d56f157eebef3056512d455687d484391902f1b929234cb453617ca2dfe24a5760a51a01b4e204885cfebace24f7d99a008816f12c05e8631f700c359b2a1e1a087a652ba6378d9fc0866e732d67408c80837dae638214de6c8ec5ff914be5e400d693b84391ad59c8d2ec3283ad0df0009d8d8a2ee51fd79589081a7ef782aa012785e96f2b5a0881aa77b68505774046c92ae5bedd43b1d204949ef21199b6234b16c359546bf72b6d18a40f28ef90878ea449f2bd1d87ba40c3630edad4ae36b1ac69792cba883b513bec4b6bdb9c708061fd1a1c5fec699bc193b62cfb99eeca7d96399a046fc0b9b2064452d59c50898564a7ab03ecc0da9c1f21dd4c6debf604990d51ca90f5f460ced2d98338f3390a777c441187b98f84b10f80b4be5c10c92439d22222b49a03b8e60ba10e0c13fa95b9223180c63e2aa122de0cf82c46b7dfecae4890eabe21fb624083dc5a68430b1facc00eea2eacb0c26fe76a32835791f4cb37cc0a9c9ac332c105766abbed9aaecbffde61d3435081f478f8ac56493eecc460c803a0061f52109730e6ea589c731d27589763be69afa2e384cf4554f8ed9b1dab874006a9d8b48be8091ce6c3ca001ef9bb431d59c4b4b4befaebf8d2c0c6a63126fc02a6f9436f0cc4b1f02c7fa292f1e69f2abe6917fa9565885fc1506e6a9038aeb4d9021136894a9be15a3b0f088a4c6d4a559cbc3de8199894ce4d5d14922751623f5224a58b27712a94c2b8c9a44a748c28198e2e1e6fcbdc649368f48ed6360628e86170583c0ef6d4803492f5de2481095e586c2f23a56660dd911ca0a39ebd461d012ac2c9a4a26516de176da08db514d7c5d1f15101cbe2b5319a8997114547fe72ebad0eee21460d86df5065cb6ad84f4af4cf648ef0d5aaa08dda5a8c6236c598cc26a4f1ef38bb53df685a14d04ffe081f940c03b550784dcf9de5bd2628d9df99832e455a57095d341061f52080a0366d3f40ffdd8114ffeee785c6007f03c162c873c9787da07713851dd1871d326cf7611432a54004e74903b3a6bc73e5574ce4f40942b4e876a5325582eca8cb08540a1429d7ab0947447af4aafb1f4176a4ec1724a4897738d4bd612f2de49abf6eea630b05243e7a4ad355709e20e31a8a77214afa2d4d85f911043e97372d68473ace0a011d7d9ce0f749cf3d2be510033f3b4b34914d26a2fc3f1f17cfaa35a1b854aa659e83dedc6280345a973ff511635b795164f21401edd2db3ad90efb81d91278043d16bad540f759a8b19ac8df0754cecdf0385a33f46ffb250afc7e5cd559ff23a004046218933fd885c8c0fc1bc35a1f934c14379b923475cf22e6755a5ec1031dc0fe286c88f749357d888bc7eff6d10e84f0f35d87ea5830c7db4955e45ac27048689a3d1cfc27cf56055b00e34bf4b39158684c0fc52f7bf27accedb84f24e174c56e052fe5c54c973b1c7435e6f96d4e320b5c02e7d81b30baa77884933476abaf0cfe63edd3d64e49f41a7a86cf803f2e1d0d0c1712c58832aaa176afeecce2d2343494cde36ae52ef9a1e1542b25c55c08732f446a0be9b634af695e2f39567aa558f69ac1466789327c67f4dfabd00a90ba5b81d1fb99ae809d9d93590cba0056c8325d11476af0b596509dace02bbabd50682ee6d15a3ef34f1d9f8ab4a0fb7d25a93a504b3fdb040eac786f7d30cfeb67d44515522f8f6b74ba5e40425a97ac28536677cba367694840a2a44f672b68e2221ae672d59d36338f2aa32a72fd73680bc5d6c50ef9e1a326efbfb8220d525fc76f10646a56314feca396054419bc493d6bc507aac03b8b791720a2b37c1ac48844d244182f85433fcb2ad118c938fd22f0d1f28de221d5768383abc41ca98890b814de6b13a7da84e064d8bff4296e86ceb2f9aa1821f286fd6c4d3f9308c79d5ba6c29ff889412fba53f1decb0bc7049579b813d077da2402e1c5af4f53c39d27a664212c3ef6d2c027929ca1cf6f695d3dbc6edfdbfc071be665852661ad506d135826ba12f20659b30cb4a6c43eb52f404f93d1c32d8265ab1b728c27d8028cc05740997237b254160a6ce4054bae2fad5b4c588de51ab20b358c650efa41a96a3d54ca16a120f6798dc5f8a462830d67c4ca53c9525caa08a2d8a01506a2e2a66a1bdcb0118115bdafa30b6d949957105f5bb2fa05cf06310dd92525e506f8d3b168ad4cd43558c290cb02a50f27dc6e572bb60d7e72a4605bc788f3aa640d76dcd215ddd6c5b002630aab7b219f33e222faaaca6db338424b426a2706cebef345c3c78d36b43c78637d588b7775d54b0414e4a86bcbe2aab0c0d34ea3c6fe821a79c0860c5d3eac3c41c8c5043224486cf7f0d614623a7cfe46c40558a31e90e068e8491cca8032a3511fb0647c7106d5d70f61d23d3a99b6446246ffd4fbfa0c6dd36e0ce56738ec7d100ec856eaf454614429a2e862811d59dcd889cd29be398078e3b37f9e9e82cf1ae39fa9267f28d3cbb809d974215a2fe490282e6ae23910d50ed96d861f49d619a8662950db973a651e1d0f7301bf3869ed4a6748905aade15e87696f8db03517a032fd8dc596f4bbed334b2643297a845b48d0313797a1c91cdea51b6626c5a4f2f1ff4c93bfabf05233b7c0a5f82c29fc26414c87eba695468275b954945c3ee22f3bcaa055bff237e3f47768d6c54bbd8927781811cc8c14ff162229057b239e38cf70443b4a277907601cb840f0e2c4ac97e4028a32003560d9aeccb38b51e951c39c986e34d476d15b2e02471bbf31a425aabf8b73ba823e2ff03fecd23419bdde5721015c0cf3af5eb7e78b5e7939a830789e06bb3ca8f024c43a42c34ac12432830f691891ef728744ba766a2b937b2721a723b4aeae7ec45ba8d367bdb2a347bef5ef60c26cd8712b5d6c1dc9fc486f2e90d6e78ea602aaf67ad45eeb7c539bd2b16e50304ab52eb4851f401eed4c9db52aaa0a4e9a5a9d92155ff0ba47f9cb1c42fb2b531834e1910d473ad8324ab892b4fde66900479e035fbe019ce0f9170e119757cbcf469872d4ce21910ff78dcdc298d0a78489a4653eca822cd2d57560c12f68b17463125fd095bccf511754cad37371a586c2904ea9266f610a747dec6b47fef184cafc63ef5cb252f642facf34fcb739791b84da688f2e3d6dd9d20bb364d923821e18f52aad7f9b01fee798da74333fde46fdbe7eb71380197614b6db0201212280956de32907858c27b4961b2ddd5c74be0dabb5f3b49c94637ad89f65b4f3d32a3a9bdce5583abed2441b478fe0bca1ef19954b79e33282503ea8c6f69f926d1564ec241ec40a8ff93a8e59fac56855dd9c6b65596bd72d6a580228e2400640b026d1d19c41e8c425f61402e4dbe8f87e2064b89f2e9308f6a85da24287ae30a83ffe5e3c4d9238d13259967d45b30ae756e25ac24bec55e12bea306ea21f84852f5cfa1b4a2477d4d2af65c57a665ca01fc283486ad40c1c096b92ce7ebf00da4053313cb8b261c5df8512fd0647b3a09906210e94b62d233b04507c20bd98cf812e162c233da8476a137545d1706d5c73be4f8aa328d16d87678495296eae3343e8ca9c70e43386a5708b8e40c2ccfe45e444c587f6eea4ff9c963216a73a714273a919f839fb3ffad546acdf181eb27cc35ce7267bd0030a8d994e28900262794815c09736277a2ca28e41c18a44fc90d9cf0f0eac84280ce01235ba5ffe269995fad8612c1cc034016df7abc4c3e7566264d259141200782ad4f8e055cfaef1adccabe283ec0267ed02c6e070ab8fc547a6e5f1381c012e4f62a28ed33e248412c231287540739891ef79a65c5b842246efa89d5592e158bd54a2304be2645bd413eefeb3f22b1a6074402ad057983185a328679b8beab3210377c3b64fccc1dba40dbb36648e256b14f64c6d82b63d168d1109ab1c0bf307ddf8ae135e4fbb17a56041794d37fee36c238d9e7b5e534198677828381923cc49089164e74a29495b2c6d73bb9b7f3655d198dcbcb40e810022cfcd889e89c11c9b69f707ab97f5a5ba115dd2e759ea27881118e475b544a1a1b5b32f6d0e4f9327fa699ce631554d2b097e4f0d6bdd472f9bc075ddd7bdef1f4e94adb113b5948cabf53e039310a5ead42aa3e42083c79aa0540fc2acf7812404b1882a8eb4d9fef6276a80e8f67cafa36dec28086d15b7476e439c1d41724d13f48cb9de9e5fb33ac3e87135e7b794ced663c3adee6c9a39e0d3d4f77d6881a6e3ed5ef2062cfa3b60989fdb38b1a627ed7a4785b8c1be90f0cd4ac259f9183a2a90b8c93c459378db286b3d606d76606bec2a40871a26b00190463a4b9d716bccb6b72c727abcedecbba31275f00aee4e09066a148cc3337e562fc8c37bff4da1ed322f9cb72fd63a5c816046fbd3a31f01b8679149070b8a80081d7db37b75e5296c3adbd8f478a4dfd92cfdf476e149dde86d1b41b0c0863b6fa5ad5aaaa8ccd8dc09d983cd2b955ea3107bfe36637f107e78d835784ad42aa92ea8117351754a5d6ee4a010097aa0704723286bf95c0a4a1e64e1978370fb22ef483255b9fba42f5ad3f3b2d70508f862ca5fd7937e0ce55c3b8214e0990dc553f104ffe7af45e53fd5451ab40eb50dc1e2062d38d4ee02c9a6f065edc82c46ac008bca8ad38b0b4a05c7291617eb9c8c0fae9c6cbdb4db186304c6dda541858768bc170bcb62ddbc4debbbdd2e84f1d4b2c09fcb623646d11d4e5ba47b17baafc4ee9bb5cd6916cc994f0961a16cc9feec02f3f21557dde11f1017f969645d941faa17cf22d29018a0cba3993dc83cac81281fe50d930b34c5782057edf2dc793fe0a0f0568f4b65849da4636c5bfe900b39651bd835218b5134e1cd537b928e2063b235cc99a27818c0843af181edd8e0da5a07c969f680ed0156c8063ee7f2788e013181daf43945f045e34cc06e604ce36c7c6bf523a509f564863d01f3ea5c6bea576f0da9012ebf065fe4d098979f84f9036c3fd3f55eb7f9530904b963d5ae07f87de8d81b7ab77b56021597b390994c9523e0b0f48167284184aa154ab47b239f1b7226a778b83d541e71c38babd50f8d1ac48807ebdd15de3d5ed2c6001f73392449909aaffe6aef3eabdc29a3173a8a4d95fb036503dd23bd0ff4fc824596eda9be12849d40864f00f73843514d984ca2fbae00d4d28673a304507c31730ab91f0426e4d2618a1190a8ef6c6657579d9457bca8fabaccaaaf137bc8054b48d1c79756a54b3a45cc66eb4a8b8284ba12413150d0425c6009e513fcb9dc63526781ee479ba96c17fa0902d990446b5a3742c4775f213f00f72089976da2e06a96840da61fab624ede72c67dff8c859869c32956a46c293ac69a9955257ad9775f2f2ac72c721ae80fd2347e7fc413d42afb03599a9bdb05ba35b5b3d52e4892487b1b97fd33cb613a84d8372e2bf63d112af7532be8c46f189ed4495aba8d44032398b31ebba236611f2f7e84df7f1e12df87c24a59a5bac9776ce0c3b38cdf86ab6acccfb0c90585cafaae2697493313f191c00891d16d13a689902e7db52f96dd9ff40f1f266435caac5059671821af96597fc2675061587ef559c6083348575f6eac6fd3c75636f3b2dcdc7593973f20012a66cf01c8f26ff95cecb3549f8956f6fffae1f96fb865bb1584eddade0704dc9afdb34441cee887f88340013b9b8008f6d5013d78e0123bb83b0815e2335bad96129f3f68edbd1c86a1dd932ddecd688c59f16d0ed638008439eb1adef9dae087428090a05715d700e651b8e18368dfcd0cc4ebc37e0e33a48710dd97d0976e8da4573d8c8a061148a267eb3f6134436a851c2a873a32d44c21c33b8be14b26263e53157a4fb420b1d86c16fd1015b704383c41d6643ed09748b7be8baf573fa5d54ee679b7f9f6c3bc3d3ec37b868f3988d683b4132c5ec7cd7de8d8a4a2e25dffc69f02f96cd5d03223ca6c6941138932533960148a7c2270ea313dfdb87251bf9980dc582143219410d7bb4674691ff41f9463d3aabb8ef4a868968d1e95687009609822de09e603aa9d92aebb52aa3e863c23b5e5e4becc4146026ba84e93991316558e5ccc26378f262b64939e2279f8e27f2e3b271b7c542aac5bc0a7da6c7ff230738bfd877b92b547b2c24ac612f15c61e3294406b468e610e3f15ee1e475871ff87619037caf8a00015cf93ab1b7ca0f1ed6a2659a488942516c4c54ed823ccb2cde2332882e14be95d271b389c49abde45b03986704b642a0c0ff562b01bd40aff44bd4f0f31a56588eec765460dad4c9084c86a461eb04b6981571296359160cd6ed507256ea430cd97e74c2e67c67301a7d0b4191c7c4196d2de63ef9e39cdb2625d361781e0813fe9c2df6a3eb5b66bcc6a9fc807e562b3e94c281510afa29b18e7328f1385021d274977567522425a790ea80dcecc8bdddb88e8ea448b7ee22fb2b0a3a698ce017daa99dccd0fe123c96083ca83863cb8cb77628ab2fdeccc75f1a8ea1a650c90dc24ebad70dcea84c3924cc0d2e52017b4bf33ef0fa807c3a970b1830cbb96f74bbe5ad8c3782a8453bd5d8eb19d24e2dbf13e1e9b86f63cfd7d45ec834395734ec44bff8084bab5f622730d5f380daeabdd879876abecd74f9041b2ff19b681aba9c8b08275ad665560011de534f8a811905949e5fb0192f6532a4dcd17b1f1a942d39b5eabf2b126595f72b30b39e79d247e423c7aab9f391e28f4bbd33a5ec8ecb890a049fa9997cd2c4741e61bbefcc6c9809eaec12dedd12b26ac06370f87be0d945314d19c5fae8a0a591aaa73507d6ec44d22ae89b51fc5442dcadd891d1b2538ababe6a82625781688470338ac7cd363bbb45c3db1b0e4cd333317808f51199a88d430e0c93ea162af453c33eddfac419207e8dacd621b623a8d08f850f2a16abe7863cff28d70849cb147d7e374701dfbf945cdfc17e0fddc7bbad49c038caafe496dc0397f387b830a28bdcfedcdc4f831d2a6cd5f77e442f71937fe0baeaa343ccb57cdd131b3662f1f50866f9140543a153afcdfc3a2bc69052db2cc6f8a4b41601bc04e061b721188d1fa3f1d99754c479b0c5d99965d77d4a3411badeeaadb34c8ec2ecb7043b2e429c03e7fcfca58aeb5479c6eb619bc92c6a77e5847eb2966f379d96a8735aed61bac8a5a39ad554e570b91a394c109d403f152484cc32ad0e88c3255fc706a5cf12626b0f29e75b8425fbbdbe42e8bdbab3ce585532eb58026b692c4873526821642d606d2243da95888a08cca434c08e3f67430998600901f606056ea8627d082b40e0a6480a5d983d82aa4e5dc44708491363bd3fb9d60fab54353c9a80f4b8e74a736f8b76d97e9ad58f773f24f78919bda0a023431c351d091770554f6dac3429c578be6187c00d7d515f253dc394d45e48a41a14e6324e856b80a7682d15e13739fc26e57e18e4541d00ac3d0e0bb9ab3f7a3ffccda0d606f90a864f4f214e8ec2bc654785c158b43d43ce4afeeb79b13ebf2c2453b00749809e72fa2787367759dadbdbbdcc7d7cddc86ca87de27692aef5230b726c557fa20534029fb759e8361186cc6ca2c78902f0978af65b08a5ea87b39936ab36db72377ce67f427953ac4c5a8ad4566bda105f1be1774ead0a9e3382ae2279edb4208e20e3dc9be4426cc88a29340e37108f1998c30ccca36310df42b6a9a3fe205e2249c56d3f2b83ca40778239195e19bb60a9faa4ecc52358ddcbdede8878872dd60843b4501bbaf64fc6a1b0c478e505dd8eae7debdf1805caaa3cce117645ed9ef6ecd9900b11fbff6028835be25a39b53c4acc5d035c0b6a30306cdfa07a9efcadcb9600eae138e367bd51661382aa6bdc26ea4c2265530e93ab8697201d545e9d2e7eca7e008875431cab97492918929166e6a5c81692959afa220a6088c4bafc629681f4b95cb952fbbf4436cc7531cbc9bb22e1308132d3d62e65f005314324012e8b0b9d3248420e09d7f44e82a27672f20aa8e5034e2d2fdded1dedb77d7ebdebcc1cf980ceef509882f0783fd8403bb5c849b4b1db788cd93d79c4fbbdc3820699972349f85dd1649869117a6967cb320b4ba334e6c0ecb2f4b81eefd81ed12cbb893f3e575ced747aea999a5a9e70382aebdc4b285127d21842cf83867908fe737277d91968bd3c755176224f38173381cc54e5dea180d1e26432d8c1d704662a4398dc72e6214727bea01540231f4f785534871d2da971fad875aa88210b22c4df42446c0dc992c40f0367c251da215500479f7996318f8ed5464ad5b631bbdc566425ba70f71f7aa72b7a89e62d68d9fa0a2632b107ab8e7202e96a1e417d5ed60eee7b80f1c51baf5b4ba450942232c7fe18beaf5adf1f3661d2eae6c5bbe63df3c37a9a40ea57e7e2cd36d03ac6c97e710a8ec9552dad596d779ed49b4fb4852ae0bee82a354497d26a094364b2515624e483007069010429c20ce32748ef23404f7b2f92a139b8cb20c9503214694cf88239acf1352b98ec52a111e87b5e0cdad105afdcac0195f21aba59c900789086f95383b0ec85aa382bf023bd476f24e573c8d8c82055856d72d0a42129b3c799d3052b03a4bad98b56c1dfc2d872d11f3659799c8da6ac156bc3fd3e0e804f206e9cdc03d4810b97feed2e9070e2d4f038112abc0dcabe0ea0d9d9e89085138791afe44068782cbcf2282d0a33a2ebce6682aed85959626236fd72e310592b2230bbe1a5897b11b21c08eb85833ed598aed9e04dccc5ba8f7a891a8eaf565ae4d07fe503f7c813b4e27b0e9e5bdfc235dd81d80d72628ef50c0446513016835029b1dcf78f98bfbf23f50e438d40eb90161944cef1b3a2f8369329f95047850987a9c245cc3d38b4f4d4481b60902c56afc9770ff580c0783d972d346e59c7f95b9ea3bbf7ade64850b98ae572fce41222999f9430dcfdf4f4f2bc36046ee8bc0ab4fbec288fcaa5018d54d586df759e18e2ecdab9ce6782e33d395f2238872d0efe87216a76400ef59cf20aedb2d690655fbcd94f66dcef75099f0a7e9d330e3d41ebdf9f0d538b1fb50fb736ee35ca261c0d89f430b3f7548a42980c4231bd7bc2ff517f189ab3d07408e0afe1edcce90a74a79a019bbf7d0d99659731bb8a70878ffc55d86d90bb3436aad93b13c17850a42e8da99bbd33928997067bfae214673d54d98ca17ee03b652f37b00ccdef7c706c111f6ca0b5b4ab311b058335f2d90dde68c2e23d24f2036f4aaf54794a267e2c5ae4498ed33a9590f427eb299a48ea2155f2d7c69b91ceacf4a924a911cd29e0007d0c3e0eccfd7c439b1ed909b234817ec34f7d561ae375951b59581a611ff0cf68ec91a604a3ac1325858d9bde4504307214dd3e787ef5b2bc44244c733ca4bf547062de09f1dec868bfad9939f086a9ce405861cc6ef1508d3513a86d9882dab997883543ac7dabd215c20f8668c8b444c1cdde856d1e3795b11603be7196adddeea388b2d5c1e462424eb4697ff3141787c49faa797223f6c143d63dd7a1620b0b6b908966a55e4f06a82e37cd4d78c5d1ef29b43c42f4902c040749b95d602647397db1098b6c8514d3f30e7c45eddd4c99f0f0537629cb4e4b121204c5190d6124ed347ac0e3703d64be57578009607e26eb6a8680685f90acd6dd5806399da46e69dd2273be3e39be21119bac329ed22fc9b34e58ebc95ec9672933ab39beb80df85740f8ae712c81183a318463e5c4eead8ad1db87f10863e98a211843377640cca0d8a19ed72886504c9d58c2b1c5b171583ec198ba31046213c536e2fc4631846208c56e7d0f223d5df46de91ad3a3a087c6dfddb70d23d0ffbeda5dee1d5643263eb517f4e06f9b5e0cfc050cc49a4266e9bc509be2c46674d96578b7965700bdb482c723cf3d286f7e91a065dec6d1cb5285618ba55f07ec201ade32da6aee99e47c734bd5dabba7b354c4e8a2ed1495837bb9046f4c146208a397f67d93438cdeda4859a2b2b968a19a05a922c5fd5a540a2b66bd696f1c29ac2a1028681ff3951fdd4ba1acec145c55bd5f98265cf0c8ff1f8c309999d6f8e916df1213f653b1da8d3a9665b5f1a2219305e500c58c9e1621aef4722fe190d66c43dfb9cf405a67a9f046880c0ab45620249faaa61a3896d262a5285304c812e62ce7cd9357742dd96ca0514c62516012f7f9c592e58c28c4f62b6ce56f3688b8e4ca273cec2a330416f0efd8432d3eb5325abd3cc297ba29e14ba411385a92450b07af86fc88db655fa4e8595611b94fd4e070e79a9046e910d2e9a64710f436fe47ff6b7000a3808031950060a20036bd80343996298846be4eff84dd15c5e25eb200803803acb8dbe9aba603d1be54fd2d17f7d6bd8110383c0121692aac5059ff1fed51393cd3418ac28ae6bb7600ab71ad53a0be8c6e84243af4165a3afcf12d5131e1b2990a098ea0754320b0232104989239abd601a6ffc3bac6dd4824c5cca229e631d1ae6761dd25de5717a4e8ea9444b7ba21505607a25b754e469a10921a091212d9ff6210e9c7d7a7deb231e057bd66d91214f5dda97ad74dc01e9bd47b48d5459277f2026defe05c2d3da15daf1a74f76e25bd1be0f1c0a35be67763ed9282cb5771d1a6193b851478559346487f8362a180688b5d17b24ec3d7b856aecd6a430f7786305169f130d4af04569b3ebbce4938b67488f6e4d24a639129b43c321d05bf1d9c8a98276045f138079709dcc23614171ee03203b746ca73454ae88a545deb6a1457ba1c6d2561d2b8abb72b35e46f5bc5bc6b4d224bcc4480d8c1bcc3d3cdaf65ac7ae7c552719098a697bba3e9bd2668990b754c4f0e6ea3c00752de768a6b8db8e31b72b2acd3c84dc0c9559d99457b885e251c071d27b4e9d00a9d3567878e34041a9b59127789282207e655650123d58e4d899580b029ed6886da5a1d86ae76a3b5bd951e482a34ed043e3259e9ca34572a105da1d49a54d6374076d4cede9b7dcdfdca1090af706453596112be98e73489045689a74b4e5d3822fa34eb9c845f409f7a4c816dc6909d04bc3b0c95258523e1053c15777530a48abf1edc68f157c94290d8c19fa8ba0818fddd917f0045ea94063ddac47302250ccbc4164caf623b760833d7c1f65d45141fd50320542119c4cb0f47c8f3f75092f48adc3d4eacd6f8f5ae794db810b11c060b717c4c2bc485a2aa3ee659912412a48bcf5a55aceaa1d7177ac3d8e4dce2ce418e17c964e72025c42026e48be10e47b8c2c970b92c8b1a89c22634d2504c6c19066f2e7adff0f258d809600c86fe7b66650fc086bf91f9299edf432e8e9651bc4bd57ee7c1d8ed65e5941e3d3a4c56661e0112411963dae7cfcba28a6cbdb4dad488db4d566f62e82a0992293794d954104a821e9b98befca0e420083e9943aae07794e6444f040d8df6146e42f5877408e01bd2c06c44528d29f7803b76f33d5e143826224810c3a59019619d8e4a987f106af99dbe6314c61dd2c62877e3d1e9de4adeaaa4b7f921ef18711789138484e47b2d830290eb02362d78643663028e42fdcf544ef266c9ea645e7c6a39407f4c9b1215d9a30c188fbabfb2b6046b6a13f26861f1b69f221cb8a790a7ee2be6cbdba84cf73d08d1c8b58be39d7957f145ad87db8b20a5100bbe938239366bd3c333baabf55153fe1b26e30e2bd17b0544d65e266c7454b2c2a719656f9f0302af152210692f676343e71fc9695e2b1e9b6ca0bc00abf970c2dffd2923c005a30fbf1339b27383d8080b3942b8ecf4bb57fcaa468306e1ccf28d3442033b7682bd7a3cdc7a9845b27b18b458ea47e86ba5bf1786395dee18b75c832836349815ff249fc956e94766de967ed477046de403d91b92f8912337c98cbe41012deba5fd2c67630dfc8423268a4adc860d5c273d9d2f3ce6ae78080dc4394faa3a3fd49b1b574fcf95dc589063cd460a7e57b8945faf83871d6575c017fc5c876f42b75e85568ae271ff4a1d6ef2ba43fab018c4156b75d50c5351d9bf3897dca7329b84f7aa53d1f2134ddfd70c0694f9a6674ea5279d06e15522ef12b5fa6e48b526097f10c7444c10f054bbe17c6a110a1b466ce49415b6957b34e6c705cedccc4ec5e0904fc46062f67be88d979b6dda08615d16395879f6190436248dbfc5fed736a628fcfdc5b2f166b3638bafdf5019e64051b423da48c0a113717692fb3857950976cc86502d287f650f8bb0fba60df83a5d65130753a7f8e4004ac5afdef2a98136afdbeac96916faec8aa3b0769111f6c83a4ce9e831d821caf1e5980b3f1e34e46015f70012201cc42cd6ce89e8374cd74283ef07adc6ebcdcb458757a838a0a7ac43288e0a6dd23cdc145a3caf7ba4cd3ae833fe6461a2a465efa66d7c081b70f6f48fd1565e1bb7903d07409f7c78dbab59f96a09bbdc53cd6f6df4437c3954219f0dbd409d5e64ff3b128c03c3b68a4b8fa9452d544435bac231b6f51978c161e66c6b4cd9ec901cd4f31c95fd686466babb304f694551dc58d3a17f0e9908ab65deb507d9501d127d9c43e81a1b9cbed079bcd06575e3f720d0eb7d32a1b41591e3673e19e395e29f7de1a2e871d1108a797d2428cb40f137e2622ea16cdd5e283e48cb2e52d174d32f65fbea5fabc1b52f43945dee29310789e59d36ba4194caca65977a72e7d8517e4e2aa71d5119c78d38cce6efe11bd29399aad4bf912c5b0a6ba09fb4d4557e44c029be002898c5ca5255694b5af9f96598e5120a0b73797454bf3134c6da5fbce1506945bb435de8bec0a93db53020e0dc6a057f949e1668e02520289d4b3ed5262e6f25bd2ccc6c3d3355e08f96267ff22d11fb492626831b0dc805571cf826c778297693640ab5530cb1f06788af4e8bf95be705b98ab8fc43ff151549f8dba075fd808ca2c9105afce4e08dca11086451af22134bd748284357f184de2c58e70d50ffaa230d075531c254c76587f59cfd35f780c81452de6dde4954e3879a854b6cfcca296aad712654a61270e3b588d54c4e224c02036570c942e5c083d9cbda0d8326f67d3567259bfa1b3c71440dbe05625bd49bbb036b2d5414937b445f7c29e3a3b6b1f8141b015d6a736428b77ad898ae2cdc873113861b518057cd40560f7022fd76d24f3e610d881ab3be4b160f75fd8326dfedea11702a0cc9677dda844c9b63f5f67bf7814166da1c9db9bd4288bc65e2fe18ab3e8421d82118f0ccf9a3cc82690290c8a3179a94c84d18952a5697270440646d31fbe216c5308037b59b8148a9915bf965684973170429b0310f2f011ece2772a6ea7f98022d52323e59ad1f72e28453fc04521ebd13bd52a50e083ff39d685e59535126d375ef089f436de3619f3c4f7800da49f9588655ac47a4da87058745f4fe80ab14567cda1c22b3996f67980956a0ddb27e155ebc941ea0ac98d822c5e7662677d301d3978ce2b40855728ab23cde8fc5d59fc79aa3911dfd455db236748c1d16b1243a14bf162b303ac619f27819215843ccd8647976c12ff57dfee922c28e828e9975db833ac9084255510cc45c088503222e4df55878923323a5014a1c10ca6bc14a73b4b56137536aebac35ac75aa19ba2e5e37ab1f1fc3b06e0f0de988a3cbd0117e78557e83660aec544bff5201c505061225d8caa459d1b8d6a4b5a4dc9a7c0d23ea669ba5656f1cea31919ae8139fb0e584d296db804b030791813125712e94a17358810164e0d96a4cca6d369db8a5e553c3eeb1087b0c51c22050448ed208e67b591a14456e51c6507636d89a2560eafc5cf138cab807c93c0f3132fb0a12d25c1acd42027c2c3875344a3c0ce38a6d02ab1caeba29118916924b988eaecef87eb210a61ed3f3123622244b00359ae60c6f521a91ea1dfd03708e16b39e555a09cbb471e4651deff60f37e9e96dd2a0ab67df36541d82ae1ab39c8b30c6e9bfa5e89f8596a1c227215fc642c89f409a0acec05e7988361c170e89b1e70529e42470a13d8d78b42a8cb32db83e07ba8439e9062319bb13b6a78ddd427a485c5b3196062104f563f3ca818828fb1499165e1383bbf7c3b367319ee4befc90853f7e806433a3516e3adabe48bc5a6999a41dc1869a3c480d7b4d845a8cd3a9374e2200631b73231f10a3e65a15d5aa33c6d42fbaa2ecafc1c700a32567a8523feb2f4ee02f23620a0969b1e2331e62b43e59e401a91affc199150cc3470c75eec565ae0800f72a3baee4c3f692b14c5796f0422c3522d2c517bf92fc4c0484e4ad22dabf6b946d450210fd3d2c145174fd087e577ed435ce7382c5fbabcdf2eab8e29ac7ac2b435d347f41fb518ecce82ed109cb7ec6453c1fb90fcfe00e541a19dd3d36b1612e5161c4db01157407422a6f03756082bc8c38d87c1c1864076a42d6ef028515ac4212cadc484e14d9abe753e945f18ae9db64b4ebc5950fbf00b6ffe63b3efbf854ed8567be0c00b6c2483c60df8ac138ea9cc98b04c4ccdab66b50a6821227f4410677e58c0fa960cc7fe88c2c8d3ad72396902736504226cc0714ee54621eab632b6bf5716306b3cef924038c9e55f9bde12be63bb37fc0c67d9d884e34638f900199d80263fb8a044620df55f0c83ee7c0b5989900ce45b7931ecfbb8b0b78209120a1aff4c6ae8af0a8a1e5437c955da78e74a97053b4a2b309d8ab9eb367fb03e63250d6b5f5ec3c40f5658803ca0d0dc2392dec1c660941824c8a9b4d869d3891499560a2d6243080fd0190a41535199d0139cd1e5c196a709e4c5d794d45127699ac2dc5951c3af313654152b5edc798d415ac885918a66ef69799e2abfc86c6c446e64685ec8114d1aca5b0d99631fcd78d55977560ca480cfd0076a4ebc20228a1829e292aadb2b010c7a810dcb331fd0424547a9734396a7abf34c9b740f04b44a35f1d65235b3a6cdcb801376bcae724b306dd2ed47b6cc3eced671c5f40a11bb8d19c24e4ad592ab33740713ab69ce3da4938995b81443940db43104f109717aa7c816a93b24146232a512008c2238781587d2480e96f840f5df8d24d2e8e2aba2b34674c932566764a8ef69132d93e0f0e1c9328a984503380cf385e3f9b1d52f0afe8ef4b7acd50a54be9cbec95dca352ba01d072409a5322e1e121f703732e250ec1c928cd2aee94e0fc3d435b6780431e287e18010c9ae463ff2527da24384f8b0cd50a1ef91f5c507f15a3255cd739078067e56425fce6b3bf03ebc15467aefbd52e71e09ff90fe6785cc5d59f240e85a044ab408d1e818f3518ba6e2e0ff2c84a0e16731459eb7d155e7be02590efba8bc2644012a4088fcd03966b57fe57eb968f8e7a208a788d33e776de9b5226f3e2a1a3ce5d0dbc7f324b63209a3fdf7a9cb70c33ecacd1bf036d4b42dc71e84b39ec4bdb7c526e3fecd4e42148bfee8947328d181bb213f4bbae1495d3e465ba4eead97c114ad6b5648baad9cf8be9213bb701045db4b24548e9a27418cddf34cd5711ff873218bd2c1074a04c2b0a4b2fd03a17d0ebdbbf73901fc035d86507b78ece9b72346351b27427d3df29531292627d724cfdbb3208521f35725b07319633f6973f09645bbae8b68e4a6a1e0b4fbe271e75bde76ad058d27d488e4e19936c18e7f8e506246426cf6ef08213736ccb1d201dfa5b2f4bceda7b7e1508a8f90052ebff399ad9b923dee12306da6aca77945e372713470e8c40c4cf873020a54e6f39fa7a9000e0737b4c2a8a873c0423c37b890d2fb5cd8914115f0d703016e409e6f5f544cd6bd0e8c6ff9bcae1fa3fb5ea98e26512547bf574e1e6eb469afb6e791a1ff44e5754df31da557c180363796b6f81f33acb2363c770fa33a35519406b57e2c33024b98947d046b6030f3be12e72c4232078c5c55effea0df508a5a6a04fe58e0093dfff46ca1bfb1cfa8cd8e3ccee3b226c42d5b0e3e27c7fc4a465b354c061854f31e3defad7eee894426ec927b3ce565fa15d90240b937c461c6b8895ca648c493f6d8ed55b7c777fc120981647a2177bcd04dd0ff1ce427e545f497bf20006c08145fc6c96ef5ab6b6bc56d9d11c10cb9aa313212af82d79edc2792c2755461987a2e69c6fd3c1d433162d3adaeee6f3d12e374667505a55780370e558cd625d3405e0beecf100c8a9f57d2941338058f2fcf755d2efe41eeec68b1b3b624ebd9b3cd5fa523857ee46fa5373df87cc6d9d292ae8b295a9d8fe9242ef831b0d022fc350cf05b46ab8dde7d3d8aca5803839f22da26bee0d0925c14f83c44743933aca6d2a73b852ed672bca1e5a894154f8de42ccf771645f545360a5781ff4c7c7288a6ea4b13799639af8afdda0d768eeaa3183bc18bc3041900faa097376ef4205d20c71c4747d40ed3793fc29d290eb06d73dd8683fe21dfb1d902f7a89724649d23b78861bb8bdc427730e2542991cf813078b051a185768b8c879a95090584fad1c9101479618b2e8da024fc36401704b4a1870dc2c323018d225b216b80bfdec73b66c981d8bbe9b7ac77c8440104274a0428decd2a206a71e19efb96854d2688d3de6bd36a3fca41ee4cf69468fe4c6a544361ae0f63e449fec8e0fd567b919daebe85430e9be2dae4be787eda986417ef60f1d66243302df2c6dc0c118d3cf7667abee61852843ab2b85a5bd9007433226f4b856c63764a854882ca74e740ab8ffa364d62be831845bf194c61e149ec203b9ca1e0f796956206a92349fcba2a948246f80142e1dcf32c9913da750e6e3754fa0d54d2b1f9510154ef363276fa050725101f9490b1d6834aa316d165e818bc0a3e35afc807ab53784c59ed61508390a3c2146494c2ba4f981533011fe70d7e39965e141e1a1e994733f199ff5561aa004764e6691d94468fc6596d2da1a15f197e4398a881efe6ea9fa23764abaca0bd008429f2522e530f1a31f625d35a4def44e62bae569235ae9807dd0efced66d2ce72ce0c0e292cee6d7e4941a3aac6d64a59a57ff8f0d9775a93d68eb759341927201053dd445229016c0f1c5449879079b31598b73045f82428a14707aa4c4181b584b07df5e758f06852f9079b056cf5698b40305b90401e2fd658fffd3ce898bce35ea4bd4b9e0673fd7b914d1c76a4058c4a14132631249824f1c0bbb98db257a535e4c831a9ce5915e376b5135cb19f5f141114337223f955572fafed871ca4ebb0cc2430cb7dc0f735b516221fd307d16738637cac806a2c5c30c60932bb63db54b3fdc7a37edb9abf0d9d892c0d36f16e485e12567c83aa0725b8d272098935bf6dff3bbd8eecf6130713ac4300cf351fe2ff0d27c61c6b17ae362b6cc83d509b356b764ceba10049947aa05ccee8a6730b69dbb968e91af44350ead56b63f3d60daaa92c1772212f0adbf7d456a9759ea90af49e313e572ba34f9d24403f801a469510d9f7770bfefc75c100e4cec77c957ee23194bb8c1fb63253dcec90f89b1f01dfcb04bb050ed1bd79391aa02de8dbf5a9e82fefde4fcf827a9648f89cc3eaae7a02c9720d45a6a4144ca0e122adcc4a411e8c213f05b4e614e56cf8b10f0e79cfce4e00df884abf3851842fc62235a45a6388561405900bd91ce523dc244c49298886c1a7d34ba5060080f3b725c344ceb5fc0a4bdf61c5c03b4e4f309fbd6d8a6962b24e8174640c8e288e5d85294bd743c6175e6b966aa7162da743c5c19a0369d0dcbb4d44f9d610fa789d3a0cc80d785d1ac98c5c4d244b78ef04313a3015d8c4f9ac7843951d63fae39cf89801142e7fac128a43ab0500aab071cdc47adc253e92073d3f11112d4a11efd5289d6be8ed487c9dfb859242d7ff4d08555ef817d2f21fd667058eb2574510f794a3f753ce581f420d6e36306f2692148a48d1facf5b320fcac8aa00a42faa8eb3c3fa657faf9a83b0e94be7294c815a3fcad9aa5af33e16ec43cae6f7556aaba5d4776b13217d7eb24aba6d4d7a5816cd594f6ba6dd57891488642dd727f05b21be458436c1b62095f84fa1e7637e189c86bb83a444c521cbc4d91142ffb9d2f2384aa93a051d434ae36fe2a469e670cee8cad1420fac438ce542a3a9e31fb88e8ae2ff497660f205221408068dcf33df52d103160fe9e7093fede8eb686f7ab4f649543a85d43e681de453316deef984047df352b08ab3e5221f2c591c022874883e518f67b39018ee0f4ffe0e308b3eb7c6c85e55a2f6676c43ec995057b8e4feabf3e5c75cf10199394b9c671c1a474a70c63105b501fd0a31b12223e332d7984cd82588039176380bef583abcb5a3c3cb3ff43fc50adabbc552892b44c6226ec3784583cc6a6b2e3e151c8f382cfebfbb81cdfac6d2dada15c4bad4bac3069cc336ddfa51be2436d7935c2eb05526fda8759303aecbeeef0ccbab79f47a20b9fa7d04350855be72e46482f2dd98bda1077dc32464cc58bc7c45e4c1b38d67dfa40d46aa8f8d1de046e16f0016d2e244c23295965572ff88139f660d1b56ef640d47445441991dfbcf79262291e7a42f79b08a2f05461fd03ec048963667a0ff598435330c9e22151e5734413a26e8076c3b124f633fc74b6db0df9f0293a688e32fb2ecd23b09897b0336ee5f9c349a81154d11ce57e3c1fe4f6e2e47559e967a9b36a843af9b3aef54d6a56c0503500f8fabfd6481a874e19ce9ddb6f4bf193b04ba059af210ad023e2f882a4772bbbc740f8135d75664f899f04f17dbe7e1b53300aa1ba2bdcb68dd3957a9c562288c0ed8426c9ee557ea15d2f9224ffdb6acd44ad25b3a269fc528fd0476ba5730d07bf002268b5aa1c8de6cc4de1b1c379274860a9966ea11e6fba105adc31f01eb2d101db0af66bcac1c3e7960bdcfa32905e40a2444caf44d8f0067d861afe5b107dccc54a486c771e45de74804e18857ac47edcad8b0466fadb2344a38d5e709d4a5cc8397da8ddefcb9c364f3a8cdc160067a5381217bb3bc4dc293cd534c3f92dbbf83fc2794363a86692cc133eba6d8d8d27c4199bde4915c743df102cdd7164808e06c723b038b5e59b8c34284cccdb47c52c64d0d0d003cfa71991d09d8c70d75cedaa664bb2ac994d665a948da465e819d9213cfd322fc464e418ff7bd10f3daf072855e79437e11a165cc60937c56b012f9ef6e384d3a50625873d36bdda5fef0905309e07205d281aa6f487dc2529a93f12648ea0997d9d781ab7e18c76b331f3a8d2891627f39383869049c94f62bea207912c4af53575683e6fc363312725b766565f8ef0780d378768364226e1428c7f4d1694e0e89617bd455161fc871669391f792e22e40c369b098087e83d75da2e8d2b3ea43bd18b70b56101d58c31de84bb644d6874e0e6049cd0cd476566c6799fc2d5e7bff4f426945b4df284ecdaa0cc52d4213b0879adc1c9c209871b5ef604bd8c080cf557b210bab92df0fbad40b9a2e233f106e4037a7c72e737b8c2e14a30d87d835a38e56e186ec490066cb1b916d66180eae0398ed4be7a69aa0f518daf36df8ebe01f382f453456c3eba6d3907009a3b07e77dcf149fe71c806a1e646908ff14caffa9010508313444c027c2c507f57ad2ca4e45149e7433960e70957f7a64f72aac39a4cc483740b5ccf911fa5384ca4f6176a90354f9ce46e257311a6faa194505d4c90761f8ed1bd06acb7f497a0219ab6bb86c806bb99347bc4951c53969765504a2739c8df09fc2355e72b3690fb09a796684f61516b78419e93e40f974567e881194a85a7d979014f64cc459ed8126bbf39357786c136505e38b92f167fb4aaa34d0b615e2bfe83cf89a7d66f4a297adb70a39fa57b4f1269b597480f58c7323b4bcd37976df2846918b9df6592554b2e6b814de41d1374e26a40f80665534f2819cc506940ca9a310e43ab97f1f1db0426c58717235cf9238b1118d8213fc2e6a5f2671ee4bc98e76949e191676240bc5b2b63d2d300eb0a92073b9a2d97ac65b6819f17c09fb6b737c30eb0e6e3a469498fddddc1b6588caceed1d3994b9c3786b48bb91dd75c23ba7b59a5919b48599acc9818a980acf2fc1cd55990d6c7d801f1c13e36cf15359a12e92b3377052b1049cbbd8f18cfce5c94c56800ab806033fe769cac9942c20b22d08a93ab69e1345d92a2c80b2b8e111c5fb30e1feec6e70698a1d8ba6ab732d88b93198925d7af63bbc2999899a863a3938d8516817b37232df30dde743d60a45be8a6a12a060f7463ad30f3578d517e5271673fa7816350389fd439693b787ba0688486f127af540f2cec7564ce5aea7bb8ce8aff1df44c85d9a995485f81a04b9ef9980488e20e871312e034aa6d51de3620b1f31bd3c171c8304d06a67531e88a587aa8dfe8181035f6553f82e5189390955e5f63b99276abf69eaf2f29d5cd25465adf748dd573c65dc9fccbe215e3245bc7d987e5149fdb2296f271984f12491f48d7eb9611360afd73ccdf5df8a9e11a4387d99583d1ea2c610cc880ab6970d395467544cdd64fc6c85fd0f7b6ab28b65aa9412c01a7f23a4194ef8cea2952bc2235ad68f43b2fbaeaf31638e8b774da42ba16fe02d4a3337c9c4fdf4e98676cffcc963d092ebe8792469040f1df5904ea51e76e5d1a12dd0dbe0616414aa7c16d1e35e390c4c28100d1f24fb927cc6a627c157f2d1ac2a257afaea7fb8c3c55527348850ca631ad47d3a3fcf70a1412902add107e57b5f961cf871ed89206ec6843b3eedafbf1e50226077c8fe468f991ed6f23a03311cb52b54cd03888289f48746375671d5a649e12940bbced132ae744f858e1527b7b6356a4714f3a298e642891c2cdbee87ad13c2d46d1df5ff4943fce65fe08cc8a75bbbe5df2fd2970cdf80309a97024d04581f2622dd60310966ee31ccf59f37c8cc31ae40ce0e19869c77a3b58226c876332c0fe2109d4ee47308eeb6e36bc37493a4bf5e46144d6457b1285037c3bd1c02f944820bffa364fc6c1a03e86002a7c1ea7abcc7dc0de9003927fa629984705d609079150aefc7e5fd6ed3699f387f75a80411825a6a89c449d73292eb5de215bc21e3178d624db699c9223bb085831ccaac639401c19dfbe114d720fe2126eec7c990a113ade4c5523eb7f21e55cc8943a7716447e39449e395bb101effe5a2db3e47797f59f943d91a0634d20b4b6f1148a5a2409252113113c51021007c8e2c1bae3a8623681a6f964a5e6b8ee5d875dcbf6f5444ed0cc635eacd2a04aebcd369aa06a8fca37e1ca3ac36c220964139002c952d3e53130510d07bbdcaa5287d630340f5086d5c3c6dd876a5013a6b65f2583a076937514067004c055dcc86e2b98021d79efeb0ddcf2a0d1c6c28469c3d5fdb12a86ce5de09c8d6b279c8478c1612762258cac15eb7b13530d83f8cb21f09fd461335cead4eb477ccdd3162389b1181c91cf343df8f1f6c6274c1004ef8317407bfe56fd2958e62b332b1402391a6656cf35b8a62238e864c065f25a8ba55a985ad300def54c6a7205ac627aba697d1ba059048aef38865a6de006aee759aee1ee97afd3ad3fe855a8da4a2341339920e8cdc3568b3d07d88124fced21881b98deeeb0503f38fb87c7dc7613614b60a14641571c798d4b2cee3eac260d0e8848c7999b56679e53a1f32df7fcc814448979ca4da5235f65ab4387cbeeac0ff6e42d2621fe1a3618b418d54da9ee4470bdcbc7f50cf63aaf431430c125d1da0eec25c4a1b341a10054c09f6b4414984b499a5a3032818eddc83a4938e245a86b9f6319c9dccdad22f55a047fb066cdf9d330b71e88995cd94970705208ebf7f02584c818a9e3ab66e5fa61ea07a087b0561a40511598273f8db6a9ea3249ff26972b8c339d511b239ddda549f69ffe6b6405d737ba7e49f95f7c817c235ff1ebcd871b5ef84d602eac2ad652d9053c8bcae4efe046c52d1c9e13de1c68454d8d4f7d2b6bfe5972f56fe4d6cb65eae2212c6d99886071091e42944bff35c10b291ed47bf3799edca33a2ab90268550d078836364f8b80c003e177479644aed61e5d674355f40faa8fea05dd8185a67523676e53eeb9eee27b7f4c32df466db25bea3ef051b7de22215cce1d50bfec28a97c8b8a96dc44f8ebf1f3e01ae09a9f084ad489f9ad8c0d8d3ca364a08ff38141f444f65b6f42890086a49e154381895dc38a2f19ccae944e47dd85dc1cf3befd10eb86569c3e189c88af4935052323dc36b3f1c7f08edcc6e723adbf5bc74d33c612ab747fff81456498d4e817c17b384bbb811326c4d615bfac949f693e341afd87c95db6d4dc65081b35930ae1d7e88060233e547a99735a639b4d13ddd50d3a42b1cb3e723e3c0ca2caec8eeeceecf648b008e721cc72011dd6e312a708efd891e87dec71e4540db24ce5cc8d7815a749d3b15e37f7b43fa7968544b4202c81044009b13213452165f2cd83104d5bffab11a3d58ef1b7853c142a0b793ee7cb788c5a1458256e20372ea497488f56d68391bbb6ac70cb42ce2517b3f32d52027d49a28f09056fec6fa6659d342f1181b3bd94c036ad8af9c046b0fec41511dcd5f4287fc7b863688272596cd47d3524e1ce49353296ce6b4544ddc5b25391d28aca6f1d3f566f71fd226acfbe3990544df1be6ab500028f301843899dfef38d658746eb8006d895a487e4b65f969fcaf4987b3b747740b3487692d53243ecc401b94ef8b060e707cc9b15da17b3a42c2e471f4585a6e605c913e2abedffa1cc3639de0137284e6ebabc9764a1a7bbd8c2e48e9abb71877f195584fbc04d00c3d6de691e5e02262de61290eaee5a290a8ea3c00cd9ebeab478e5da5d82c4861ce1e144e069c055f961088c9a10a31ad775de30f6ef57ff8db6fb011d97faf16593ac42bfec6d67ef03b32c69a2156266a1e20da19fc9d1418797db7b39a509cf04e7d8c56686713aa5057343cb4dfeb32acd688a768433dfe00a8b9e3897cd686ba49dfddb862ca84b73fd6c26eee23e430c73694dda8308912594809560af3a082ffcbaf6b52824f4c595a95cf87d12b3d9a3614fb6071c884e196262cba657bad9eaec0962126cdb43bf277a590d2e2489900b63cf3974edfdbdc1cdb9635897b36228dabd495d27b93e2f9dac3d34d3e10b3ef0f80d305010402da2ceca8ecfd8117f6cd94dcc4756d5246895822c12c4b04e51b3c6762751288d663ccf31e842955e1e05f0da7213d6f308ae029e286412143d309100a5e06a2ea083b0384cc835ac509b04be5b1aa8f7836df236a7814b3944763d27c6a251049c82e5ffd5c93d30576fa9003e141187fb8a352ac8fb69d000f66762faad0bc2dc6db16805b9d359166b40a4a4f4baa4593165806edfe96f3aba7e0e20043e000349d6961f01499dfe6e39d0c06857d82e2e9609c6ed9a407a82a1d1c27c63edb32f78ddf9c4d4cf2c6e809afee12ca30bc3745876220077e4269e59f34a9cca72a13384ad5d08ff90a04743ead75e1d061d16ef1dd824d3f8f7edebeae3c251b2ca39ca03573ca710b2a63528ed40415dda98f5cdfb0af292e177c3ef99534958f0f777f6da2173a8572cdefd6e03340c5c8e4900f64d401ecbd0c01d010753b6c6dd02184a235bb0ba21fffc63537912ceaae5f3c047474132f20bcc8fc3d9c2f19e232ae54bc5f21928408272671b624395fc57456b2b93e47b724f2af24797819272c984e0274d06596221d6acd53d5e9bfd5c4a05b40dda2a5de6fe33b018dcc9e0aad7881aae5c494f524cdaa6d68e4512d628d4960222c0fdd487837a15936266fd679650358330dffe9b7b55cd0c5465a3f13983909d4a578ced5f34f8b90fd6703665c29b7517ee590c2c24f5a05b9447ec6f836100b3f67ea78bcf07336f35430042dbb6c7223997ab9860389e040700c35687af662b0f09373ede7537c26e89a072c967914ed859f7021993987c7aaa52de792a18e2812d75c40943b7a7a6ccad5f8948b465350020c3fec9ce5049fd560200aa500580f0c0e0c2f84d95ad3239a745009751fc7ec9c0cc8f0026c438d058e40ee2c933849289e1f3663d4ea930fb17d7e056ae02315f729bf4de855eb63dc79c84e37c6dd94764456141149c44cb3547c51c960487746a6f30c41b5b31200ef631915bbb68e8b0648dfb9eb0336db419e038fdc6bc25b805dee26f30bff1fa21f726950995742ab50e478a0aaa1ef7e76da3d1cff5be8c8038437221a32d4b587a858d48833a9b40a366083ea43370916f8cffa6247c1cd4115a952942487a2245b7e4c45a05f2cd07f3e9a027c5b00a6b1baf2dc223d139b877f997c016ccf014a21b5385a4018daa40375a44dd18862cada6c5d8d12c5adde8e64ae353f3184da8fdee79455b008ebbf8951aa046cff2efbc4f5669d2873405d83aafa3f432d90f1a76759dadb03775d8116f671351ecc945842e4de644bb2a59429a52465610374036c03586a94708e0738f519515d8e153c754e593d50c5cc1757d765f57bef59d18a6f4610b3207961aa2b94df6565592f5706c4c3821056cc7c71755d9feafa51b7203195dfe2cf6aff79cee42fb899be71c1bdd4e89ccd0dcf7893ae6c2351ef1b494956b67d9f3e39567b25cbf292e52577c3ea13cfac8da6fd934894fab55919e7709030978c82e6c4b65ad8f67c58b5afdad6dbba71606b8d1e5cb71feaa8be3ab957638c2bc4aa2cd6e8c1959f2b67db0fd5faf96c3d4ffa96186254eb2f9d16d4f91c46f556956afd14c3fa29a54aa5f5fa19aa2caceb0a5d807e7f8fb86af593826ab09ead677eebe7ccdec22c10a8c76cb14055f5a2ad662309745b9b6d12fa05723d7d110eebf7a78509b9ac0ffd856daf5a2fa26fd1b77e6e65594f5fc78aaeefe1d52bfbed0272bdf512e4a37aeb23a8c79591b220aafc8db44d2c6ca924e8ab9b97aeb77e93381cf35d090dfcf3e7e82d8c7a520ffe99b9acd6fc9585915c567b4de57802f4fb8db33240e65bbfdf372b13413edee98b5abdf50f4443f5568ff9d6759a2fa3ce9fcfc2e9d495bb31bf0b7a7dbf0c5bf92dac2b837c5cf5fa49b1ca8a29d579515d8e942fea9c51adf005dd5e25552b7841fb374ae45520bd825ba3e5b5360ed41146d5b9303a5bdb0f75b4cfadd01608ab303a1d00eab63632a4956d6db6769b8f81921bac8b1054a67f0b52b96c0f4159876eff3b823943595ab604ad91a7ef7aef32a3086018d9699d66f939bdb02f6ccf8953b7a8449cdd8f01f3f38e4118a3fb3c82cd24fbc2fe94f2cd59720fd235ec6abcdd27f3d449513ba78378f43bcb098ad92c852c506ca95a403cf843a027837aee09a326d6ac26e2a246c405a420170e878b35b186611c7361826e16cf2c59582c62614259e874ee8162166b569398dbf130581b7beec6fb0fa642255a01ed7fcd338561f63f18634ee45f201e91a7fa11ea9057b7592255a225b4be6c96422fd82c9e2a9fccd22cb93021ba71389cd50fa348d5c3648d34aa87c51a3d4608a9267d2c22dac49ad5f6146b9c4fa792e50ef2d7a1101d8d5a66cc2331c624abed2cad166bdc8d7d1727d0cde229d57dab6765b6585397e70b0b8be58495a979b1a76807f63fd191220823d35da12c6b85ad7cf17a6557fc5cfe4923d2487625bbf4a269eff22e2fa45016ea5cf5a873bbbb6e9d732e94856ea49615cc79cd1013cf091d010e218c112e6cb2557a7cf7a4d2b0a424e59474f9f948ca69f01863c718b321314629e376bcf276df7bf145814659e5bf9763615807ac877df0b537e441e80f427fefed2f840cdd4127af766cac3ee85eb10b2050b9918359976f07b31a91fafca1d0d16394517a8e85e177fedcb520fd77883f1159dddd801aa8ef3973a7ed530caaa1abf7b0d51d7bd6eec67accb47edd7e6562ceb5f02ed68811bef7de7befbdf7203fcf5eb84712295ef2119004747f1e79bf5f3de7dcabee76381295cebd75a2de0137231d4ccfca5044d0115477aea4bae3dc549f1f8cfae99e736c39798d83b91d336ae3ace62feb1b86a14850b7e3fdd63c7d6a9ed34e4f8f18aec4137ee4a6c76bb034f1599241ede11b9c272bb3f5ce133df02ed170eff0cce9f9eb01e56c48d74deba1f19775a3e1ae6e786514a67f0e163ba89f7f3f173443ff8ec915c718419f18c3924803fafd1cfbf049508c918a9410f7fc10a30cb3528b5fe3061779cc8c48d71af1bbc6186ac427d004e8904fbc86ceaa084150f277fb3b249432ca08dd31e76064dd57f1123656eb8f1e238cd0dd8e1d9267a49022f5bd101f5eb69893fea7f45d64c5379837ce39aa85a23a24d27c59e71ca45e4aa88366b57521a0af94150901e5a7d917ea1d4639e71cf5123a6ca355c26ce3a15212888c3fe58bb01913d32d44ba8e9efa39c262306df49b5667183910d53ebc1da1506f101e501e3210d0d0fbf04a27bab91e19bf2afc7e915722919cb3aeb75e5b19d20c8dc68f9ec2462312455134b08d48571a3ffae94675f434fe57c084381a3123124565201a44ff791d4bc2bacec06af8f83cf5b901f42a38e683bf0e86c9a1a3e7df9791c978191b4d5d6dc402bab99e222bd3f2fbcec11f25414719bbd54814ad14c5b657c490beb08daac1cf82cd0b744a32c487fff9fd5d6d65dcafb63d74a5322032abba3a16325186317253b79784677450d2f6c89b0582970a6569f9621cccfe6e31fcde7b06e4fd5797d5e8f1957f5f34194804255734a1f2ff4b075a5abe8508222425d111a51aa95b70e291e828c7ca14566eea46df89705c6c1066d4fd5f2eeaae115b448144931985912af281208713135270454e890b19ec602dea468bc4d030b608c20554d484cf1468cb8e0eaa545137fa39556c306a62225141cf082a27558ee4505942dde80f818a954a1b7abf683672a62c9143658bcad5e550d1024a81c07c3b335a987d2a23e0490256b2f0000a9e580245158a26298242a1aeb15002ad9b89923084128851e3c5079c500131b3919bd11574abb0a852574ad340497777c78005168afa7477ffa83f36949445cf88e4e2c4cba2e44180c2031d19a6f4e45c6145ce94253428a8441b16eabed4f981a9ee8f807044dd20d405c218350733f1cc61bdeca2306207b500d5e5a0c0c6c3a0ef9fb5cd684c256de826eb7bc18443d04dd601c4f774ac8381b09f83810e62a0f6bf08fd04ef70f8777fa8a8a385a164ec7ee89937dc9dc1837c30c807915749ab6dcf20ab733776b11a1ea02f0b651dd6f981fbb7fb1c40a594324a29a38c92a2627bcf7c10420879a18c104287d06770f5dd8d35022451ba1a7fbf7b0833e95ce688a0a47f61d8d1c5bd8ee5215d21bbd8a80cb1de205575f7c23cbdccd17d70f5773266cd33f237dbe037bd6218665feaaeac266c8e9b3b3f10ef7e66eee72548b8d9cec82825f77b7763e98211792610bbea8a81c0e80ebd63101428c928a54b8f2ebc189f9d1633509fe4da831b6aa0dbd9dd5877f77537f69903f53dfb5acfddd8ead3f739d856377cc2443a1d2913a0001b68ac9c78b088213d077cd54a826e3475c642826e4ee707cf2860c6e170fb9824714c798b79ee765039edbddf341d0ee6b5db78a8ebeeafea266cd5a4f4f292999999999999a5a49444fad7b4181a1aae017d921b67fdc5dd07c46bc7965bd8b56a864b6c76188293d4b9ad480f59f11536304ce261527ec484bc1542dfc7dde585d11d7ac72168980bd8798043e8c2a323e734af9c745a105ad59709f161bd620288582346876ddddddddddddd08e2d1efdcaef57a39a3eb5c1e0692728a8214f48aaa8848ead383a440179094a46c60a03e1b9a746802e835284a32333333335332b67330b462201ef314327a8c3042a7a1d1018a824a1ee3bd689a0d1c7470e15111a373aaa2c93cdf1e9377d934e320c20eb80ddac65fc64819e3420e4172740dcd698a9598ea621c09ba359366c255db34e7e0407a71d46544f331201e4e9cf433a8065a33ad025f0469c0fa7bfbd885e0524affe1fde046ee10e4d5bc2644de112c2fc963f28a80bee5a89b0bd586454724979db99eaf189eb1b21d18869f6370f087c1690740c0670d50f761702de4886119061c9b0c1f774903c30cf53defc009a8ef4924f736ece0192d6243d7fd9171932a594503a043f7e811ba07f2715548c357f886a0f0bddd7d0e775fa2266ead98e2caa95ed39d7ab0507fd42d883bc18771b66da054d77db7df4f7165a70aa0ba29b6c0a9cfbd6d82be8c3a51f71c83392fd112d112d112271203487f37a9afbe1c233c51e17b676b0413ccb76e2d977d5278cc3c78df63ee292559265b63c3a33d894a49a24fd23e46a369826b767667955825b060c1c179a557723aa226e846e3654476a9a77a7ff8f98d79aa33c0fc8d85501d11aa7b9111741ff4c12400b250f9fe55853df7aa0a65026ccc03b9ca9dfa43a90a958db3780a13f243a9cacc49cc76a2e5dfee39d82a9c6832b33b5c488eb7a8fbce0293bba090a0e305142a0956a7f305924a729ca48a1e1ce176dd8e1d6ce6f66ed7ede4eb6e1e85e8a885db753b275d39a0ef9db999fbc551476877ced1d83e627e6176ce5176ed64841445511425638c31c628a3845142caa9a65846296594d4524f822ce62896138aa264570129a79aa298a296a21e45554f4a45514ae8a28b2e409510dd2daf5cb932850fa45cba6e574de976dd0e56eedabddbbbdddfb5bbbbbb7f77bb77741516eeedde3c655c4abafba73ff250ee036ff7fe34533026fb8c47102999953f3bf7ccbe0f64c9484177772573865cc82b2050506555227a8544554b8b68e4dcf3e1101226a51f12c021871891a8655ffe6d685a4bcbe891a49046ee8edb7d8082082e7ac30d3788c670ccb362ee930cb3762671dc8d7d51084442ccaa79682a0a15056445b1fa87047098a24305ca61e79a144a1d8923a378337d3a499cae02fd43817c70edeca2a29676c611c2b94f51422166513b0be11c45d44283534c4bcb686d68da6824e34591e1ccccac423b67208a73671207491415b6858ae6b7dc5535e79cfd404f8659399338a22188b8eb39522acd203bf0d8f0e324011ca6e890c3ce943812e74351d64b32af199a229c3ed5a04fed83ee9302280db5c4f9c4a0e3093b2916664a9c18501a86592731312251cbbefcdbd0b49696d11bb990fad9b9c491124708da4e8ad5e4902945c6b4113d618059a3477ddd97cea57341b9a05c502e2817940bca05e5826232994c2693c96432994c2693c96432994c2693c96432994c2693c96432994c5040ea8848596f87a2282583b29c0809dd6844482811928f08c94784e42342f21121f988907c2e2a44483e17159f8b0a4c52371f2974aa256620032a4eb0a0b4ba1c2a2830019520aa1468d1a305162d4a4dd0ee6e6f8e81ad3d83f10178dd59ef5cc27432cad7dccdbb458ca4c11426950614f4fdbf8c511988266c029268a814ee598412b2190100002316000018100886c30171402c0a1461973e14800e65863872523695c8237114865118844108c2000cc3308831c6188090428a30ce06000b1e6ad3c152c456cbfb06f53a0f340760027c6795e9f1b79008d4d2a33f86830072a59292ddfb176bb028874a7c0fbf78a44d2a882f1488f356fdd68b06c38ad8dc336aa30b8939218825b27bc4176d91e7e3723826574741b76bed27485dd349cff550fba504b8cd6daa27600bdf6663e892c0cc5dfc5262ca5674d88371bd2ab9d017f2bd28de5bf73f3ac5bd58eee2d0f5c4db718a2b7c06a3d673e64b7d738fa3b1601e85760918cf6815709d1f508b8dec2947ee5b8d3a6897b2d91ebec6d1f0802a093059011b35814aba52465a090c72dc6bb122c544353f5ac056e7115ca2ba142bf727deb807d89202b4d232c75241f32173f52a3710a6782f656661a79458164600a6bd11d4f71910a3ef950956b6f904d888c3480adcc9a6d2b79d368b7c75c5a7614747f08a06dc1fc01276c5235f60ea44d0cae1bb41351839ce5b82d854ea8047f1c4260275e6e61df1653c4dfc4cbd9bed34b47c1612b6a5a7526547ec25531522a4de00cc4fcde5de2132b926e9b41fc7659cc9042e689418ae32ac8323625846a4170e63b18d5baf1845d967c78eb84ddffb993f3e610dd1916c82e35abdf781815efcfe0cf5391fa21d5defa0bd97e09c461d7fd78ca3c748e0df267966486ffa22056d9d135cdc21fdc3e4837e06fce52f8bf2b5d80e168b91a989002838306b58f8c3e156fa10e0784eed31a348dd1d11b251646412805e6a81a52770edd78e20f76ebc7372f0c2ac69c5c39d6053cdb1531ff70481312bc8e68b863c492cc7b7a2c03b26c43a07c9197f63b48db33937335d6c93df8d7d3e4ed5d8ddb486bb5aa34563c2f6205d4398771a79f6a997abca081844b4a307e43c62e8579d0d69e3518a8560e79aba6d83e787690ef012275cfb49ba5e38ec833d91be282d177cbaf872467f643ef223bca4a54f6723a31b2125d4809c79377e4483c7803a77e597b487146bd4b952ba81d92699dad499bade164151ff9a934d9d2d6bff819122233ce6be135679972c843bf8bb5b2acc938b958dc217a30b1449f6f9faa7c870fcc00431eaf301197d74d24dcac8347cbcee24e8d907a85b255a07d5d181779cfed6db59959653005b0beae5edd5aed9d92762865a5cdc992182ab020e5c05048030b1ed2dd4f8a02ad0714506cdbdca8a690fdbe60c851e2b3f8714c9238645cf92317506dabe543cb799edba22795c8fc10202d5a66aab097582ad01e9a3b4c07eaa997d8d2b0672a9f07d7c1ea1af93fc11845354ffa7a031af121407d281745065b9a634729b3d02134b95cf21c1ce91d0e0409d26a273e27e9fd88794fb39adda4c0885c68118c7f6149ab2e577465f93e9b2e23f362ee626d4c581803c53dce55365bbb6a815f9721d4d025282b279793d44f708de9624c4d22000260e54266130f4aac81755e9491ca8dd9ae185b32f256eaaba91a860172b26b579ca8553e6385724640dd057314c6b83e5855a6b32a8a9d983a0079558a26c9c438fc7a4ed26e733533e0c875de9f1505a5600da7d0e76607b50dfc9b7ff42c5251d1d22f78cc40e5a36484ce52bbf41561b85c168cfe85542f8a02d3983587b96602aa69a78285616ae2424639974c1ecab661ed44e9a960717765211fd05491f5cf141258af0af8f8930c050fbf309a8e991e0a34507d611df6ec857f477a20fa228662d19113b72986aa34335baf2b3d53050ee5d6f721926e9d31f44ca480e077b18798fb3dcc5b717d099b2cf5784072684bcc352609da3063f70d96f3dbd01b56767ff05c94ef3fa7c6246b03864d310273b8471e619ad04b4880f8d192cc7dfa21cd9eeb217297207350965bf1cf2408d04f3f7e4635d2fce580356d7dcb00cb8f50f8754ee9fa03b1259af567d84d4e6e2a9617d5181de2d11419412383d692d51636a514fcbddbea4d4e9e9b93012300e1e340d7e7bce0f24777d3c6614c4b62c64c6484bea7093441f955ed171292b37274479757b7b9437ef2467bbc68c8d6151c6af3fc09e8764248ca434a7409e956d76e443a33c57a94c4383dade8e4d33235363a01cc44283275d49bcdd07966b57f8f3f5c6ca6110e73cc3abec14d4332a52a2ec709a29e32ae64173960eb5e31027646eb2f3f082ebc13e79deb222adfae116cf364bf34a57e2ab384d53c3470876b633023c578290d9673b91755e8bb872a4b9cba210d784d218f616c2697b31e7fc5f0783724dcc1f51342e0629f3050a6c1d7d64da4eb5cfb60dc053060e0c3b0a4774018b30e807e95b66bb6d0f1666308fd325eac5cbb4189373fde4a8651a3af1a058897d31da930456d593fc88b5b30e4aa3126de2aefb27d727f6cd22a38cba469c617267cec363319a808d8a7da58abde289e89d6b797b4b89d9b0d88b2e5aed849b00ec5b6470552352f43f781c24bd901d0498223b0bc237e4c8ee589f9d055ea6217776601ec2a6b6d8a93fa762a2e2ab8a9c9d98d64f650e17fb2adb592de646b35668fe6ab09e11a4d9cfd6bd930b753a8aafa562c6ba9c6de9d425a806a578c8f03dc57ec9219d10a045ce2d776efbaf312f73ea18b6a5942daa3e3a49fa3fef7c72ee487e4d1e3ac557b8f2af7811256f9210329772fef1992b6884e916610d5c19ce515d5dd913125fbfcbfbfc0a7971e69b1c9db137dc4cb8e2bf6e00b5ebc2d4366fd0536d24b6903209068b7766ce43f90cc89d1648b0e13a73b58add9f011f95789903866930794d8066ffe9826f334411f9e2b46e90e7b2754c24d4e0375101fd4c2a71c1a1b5cc023b289faa458f8c42e19713fdc5444cf9de4ce1b6ecf821d1219742fb26c9d0f022be16844428460edf9db2d6f818715f3a3e6530dcaba848f909614af1a7a62a4c4cbd255c815414389370cc1fedb077a3f55722bbb2a0b1d287155090ce6facc981d0c155a04d2b3a569dc4ef2a2008a76e060a640741029e7651790b1e116fa5952daa3f38491540df4581a4fd9229707f35eb27725a016df4eed95fff89b963f49dca840297c5d5f6bd51a058fad606990528d015010956259b487684af5597c0304f3ee2ec3f91addb7e70c8ab53a7974b2ae25b350f0c0863756e92a5879e608e8e2425eb413934b049a2f6895badcc12bac39547424dcbacee13121d0794bdcf7f05f912ae90295cd128af0d211e6b14751b726ff62d524f82cff72fb6ba76338b3972ea395becff6bd2aac5e7078e9ebfe90187d29425c81e4b7d0e1db575cc3a5d9dcf5f9011ce725caae7b5fd96d9e2554e07459b0fad7a939608e1868eceef256ac825a7082d382a5125f9ca00b321612698fb088d1485b37a2ac00e2540b5cc9789286948c86f1820e021fc99cb11090e39c7f7e693161cfb6e8622e5c398087ae43c494fae76e296937c5a1a64575a784c45826a6326968c04eb106580a21fe6fca54a985f20dd6c8e719831e59c4dcdcdd40e0b210409ce1aa88bb24190dd75761790b3a288f6cfac3db21cdd48c92e572fc6ae17bf74518984cfbc6dafe8bd4152fe6ea6bf709abf28cc572d62fc02402ee51b5319fad635b5ef7d750f2118ebaa5c36c38498d232827c4041be2b563e42019d22edc7c0da849b88985a5e408934f727c408e13f5c0ac05747bbe0e120c9faec524c38e5cfc1ea6858c18718922c2b1327964227e898231f017bfb9047d87b9c958b1beb1f89e9ffc192100f6222e3bd929484def8b476779955c876bc2b0d2f81613e496bea2ae7c26caa9720387e8a112e09c989b8e96b755cd91da41f2c2f2790c41df12955a1660df8d62088dc1edb08523f3e88e629cbe87372a64b3dfb098d2d458caba31b5319693a1307ef649e5429e82d429e518b90a04b4478e636e8f931a5fab047c0a64b1014e99c069b6013a1d2353e0934ba5382d0222b0e778414740ec296c80423ea8c1e040de109eb5c044e57accd69dca0dc84ba184305de6f31d8fcc31e31fb3cfe8ac0626cf66021fea515e277ac3601bb9207011259c79b2b781094961bf100e20ec29eca451ac6f665736949ec202829e5364fee441d849d60324e8ed8b1ebce54b9b25a418a6045947db36e875b8b908ce383572ffc5bcc663c009e70e11f6146e2501f2798b78075c04b166583bb5fd4cff81eec78e1f9e244c6b760e785e7142730de38d0554d650d570f767fb3ec9bef1dae2c7267bc1e8cbe706ed12a63cf3b71d8fadcd58a3046bda75fbc992b3f287abde5c26d7efdf244b1957542a8f56705a3dfe4de7d7501d7fdb551f231f90869223fde7b97264b6f35d22bd5da977ef05320ca3bee59b31a430721267d595c8c19f9f4f2a4eb718fab9e50ae4f93704a3df9271558b572ff0b885c7f4896f508c8b8096af6f3f3463374d52fe857be6ba09ae32b33db6fd30c03368f2cdf05320d96c00b397c3c9676e98a0afbf40c6ba00a9b60aa2012b1ba5d9b8707322812c32b7879d740cbdba583078d25658e3fb72136649111bf9a8068dc8cc0bafddd6540d58897e1bb904d586de17e32b567411faf050fd201c7fc52462081e0ff8883f8bdcd0d1c7441d230a9bd8f892bccf3e873de10e4d300d456ee9a67878e80d55cc0013b09dc27f0986ca5fe81b4ce323681bb86ac06981431bd4b5138226e90be4e720716bd9cf0bc07c72d12020d7642b4571fedd7cb8d13de65744dcb31291c92e0b53c9a4e31eb7aa70afa61d3770645050fe45f074205346a95c416954753e7781ebd063feffbdbe8d813cfeb13c097763850c6abe634d6e71e6a342cb50e77dc54613c376402608cf036d26bc4e8dea2b0aeca06ede17fe8ac02611af3a09b694d58803228b83ea15b3e328aa5f9e779408555a4f890f0ea17487e069a26f31b55051e3750d869dfd70691005663d189c8053ef63a9e6a2d3d5e88873ab1c18bdb45afa142a9ee2e961752207dba9ab591024c36191f446ae3e61dc31a0e3274a76c71354b9c107a55a7e4836b5ca767d3a87ce69c3e33406f5c0d01cf239621dd668a359957c2636bb9b1238405699b3e759d2cf558e083eb7b1ec3d221f9ab7deee958c66f2693f211e2d58eb3d2c7ea5d5c93cc0fe2d5e3a4038c8507aa5c2a402e4cd6d2640ee200c1f58f1439e88784fd1b54120c974e3f250fe3d90996373afdbce406d79040afa82caf936d8bdecb44ff44bead8e5402c2013675bf2c412284ad2e79d7ee26d268a1727039aca16916a18a1d15a9593009e9aed14141b648a596286c46b7d71eb3979d2b00c99c2ddd0efeb434296b1d13c2bfb33c2763a5e0f266e73a61c2da4139cc2683534c1021642b45e448f1c7ca0d9c1f475102a640d7d447d0145e174c2928d678e9a1d9c0fb7d136b018ed12c4229c2176e3abd795b37c735fcd52324e80249da0c0cf04e21803babdc0aa7856c35c07b477f63de7376a004eac7bd7e6de4897bbcd0af46c7a031dffe3e1ad02b3a13b174bd600b576f91f3b7433dd865f6914364858e8f64a60fe45c81ca5720a4d6da5f5f866be280b17ced5fb2a08805785668b33beffafa3a4db2d0940f4ec69c44707e8bf76648e88857fcdd0893682b311ef0a36fa329138dff017a8cb4c5503eb835088aa653f030f51f9deb5388f0c1ddb3f46ade36c80afaa25dc301282ee37ea2f2633be0dcd38a53828570366ea37a17a3ad93e16e6fc9407f07a40cce7438bb1247fcab158b2347e291070d6f497f0b6dc6fcc4558165a7d01774a6f04e8badaf8397da5a8ec4bcd2ad3edb02d0dda08c4bf2608c5a92383afc58515b69503ba0f8d2e7e8f04cfdf2ea6eccced1855bda71b51117c711e7565dc4bfc024043e21fe9381c26513a66f12b51de281767941b856a4a59eb1c23a01a5b2da21180aee64615ed8562a9190b8e96d4cc2745284c4f446eafbe40e401cda55fb26997bb912ff528c4ff3c363e62c35bcb3a5f718ae6e27f211dd9c7188422470097073294b4c918f8fda5330ff8c5b132576dc11480c5cf818fa06a326a539ea632baa03ffe7f7cd88c8b165bd9e15830785fffbd349fc4eeeaf906ea4c7d8397e577d8c96f5d67524101fe724b419ece99b742ed4e7b07eb777dc55e4472101881f636d67c266229fddabd50c5e60da04eddd7446a7580fe411cb1979e2165efd0ab144c276b2e7492e8c12e9b75e5d2a1d0c6eb015146534a54af00e47eabb56a97e41555b65ba987bb812838bcef2a8e52d9facb5eeaeaf48e05ad333f80f19ed15392e2e03962281bf20f20d00d144873a663d4d14a6b675fa6ec7c3ed16a26d8664111f44c4477db245197748182f6c7b340399eb27f34034e67fff6db5aa1c7d1e2f3895d32d2fdcec58e9d02faa787f4a377ded1c893747478a7fa44425e59102b8cfaeb2eac306edb2d67409f35f07a3ff620e1192d66fabd80a688ea72d4ad8f5f4558667f28cb0551a66203d0ce731991b07466e0e06e346c15c10ca6336cf88ca2c36d27ac24abb7e7f84cde80728f0f3e645619cff635ea3ded2e1466a3a69e809748db27deb87fb180a5c51d4577e61b21715603d6f7fa85f8d73bbd58dafe7b27395c5ab26a8d700ccb707249664fee7d084612262b9d4e29f301096585247539d8d7860eb59fe9df2197d294c8501ad5419b6433610100a891511e73578b7252097998fe08c14f010c34f68c01115a0fd6bc7826fb9ae33b3f440bc09c43dca12f7f7c91c0b5850bba11b78c8408f2b92b928c7bea86171c56e5a6d2b4ef2bb30a07c94da98892a3ca5c86547d973236039711bc279d4a604ef41fec19c3e83ab905e27958e1445ded925b519b96ec42974bcda62414a9db9922b08114ed11039ce370269e6c75b6923a087e9fd8f37e51cc249dbbeb88c49b88541e739dc1b8ee93446a51a51e890f179eef3c06169e6452733e28f4b2724f4dc133f86d498fb3891be566e0016abe8e2530d2bf5e6a7d318ef5277a687895c6ce6890027cc9679ed7830cf02b4699d36cac1ff1f61dfe5b2a4f2618f36424d51d6956cfd350c89800bd2476cb16c4062ecc66c007882c90e90040ba201e99782c78438bae24813bd72b3e4e0440e49c29ba4ad01cd0112507236ab926a48102d05b4d1a4cead505dc84d7c4b01047b7c2dc305ec9db54fbce96da3c3820ec168d9cf65771460ccbf79943640e0bd9133dffedf575bda81a827b0ff3bc0bd4b28534b1e59762952537bedb891ebc7d85c5432ed385b3e6da970e71488d83cd899037c7209efd13da0bcc26d7a5718bbca341cb46628bc71d5e978667687c0fa59fa86d9040810ac7eb8755547dada3399aecce9462b1d73886f19cfb0cc0d23295ad22aba5a89f5d7f362051efc8e3f2b69eb3a595ac765c378e636ef0e8f4a004da1341400fbfc63b893c5d541e35fb287280d8722f46edb0a2912545709713f5b4ac270058ccac71232e127bc76595b09dbeee3bf764602034a8d3cebbf1dd3500116186417cbf2298b1b87b876712d782a076770fc2e7fd936360ef2830ccc25e385d36843349cff0cd73f97871486d8d72cba082d4c77890bb9535e9c60f9e5574f524336bfa51bf1ebd59321914d9750ac33949c4bf44eceb48ea52d215c4c69023ad090e29d532859afb176efbe8d8924d51be65fb9395e0dfe89ac8de5a8d31125906e3312e6ae3ac60feb58bd4e32dbb617c7398d47fceeaa7355b1ce87235597e49bcdce6daf906d777c3648ae357030da96f43fae3eeaa3004633115bb14d61754e213c78f200763c5129563731905be9dd2473df5be1f4907d5b50f3022e938b118f2e734b108f5310b2c8f253216ba9515eb47f5cf7dcc0eddd513897435429c013b9f01f996176b6368022db0e4de38548e77b89ff4bc5ad162cd2cac16c8cf42aa147b91b258d2a5d77e564bf4c95abd0b3f26409b1818974c87b86c444b68e49f1c0aed97cfbbcdd16903d38608072008c5e55f65066bfd6168b37802c086a711a62c4a1c3153b689bbcdaf07e5ba5bceabe41188333d7353fcba4132221eb8fff7ce41aa4b88056bb7dde5db10d26b222b06ba64c2ee1097373af5de8c7720f1af1418c6ca82fb8621beeb8f6f4e2251810850431670d12f62cf1a7dffbefd82db908d9e4d5c0bf59b1f429ad79811d20857b90a1047ad14d979c0407fe94ecfc469b14585b607b4dc1b469ac82ded0af100bb5670da6816f65d0f9f084ab8d717ea678b6e96ddaca608b9b44644e66eb771e0fb0268b31dc23ce9f146a605fc637f94befec9a14e0dfcd153db84d60e75c268b47017a9ecef45a16ccccd0b7c2381db27d08926f11cbf9c4140494c262db3a3627c17800537a21550136214af7ae987a3b9248dc8d45ac161a1bc109b73dcbb662a4333972159b549bbdcd54273e6f7e2717740be78d7cbb91c9487fcf8d654194c4b1358ed57a7373cccb1beaa035169f64a09ce6371c94f2be79ecd8ae1d07f9e6cd8d4ff81c3e3cc3872d06b532b3d648bb1970ec95c18f9236c5fffcfd85106f856d56d4e9d3906ce5d341cfbfcdcb2dd2cd8ee2c51d0af69a68c1058e3b03b2c35499a941994bbebb1110cfb07a4ad499b1f2ba63ff8b9173dbc71373b886430f1ac8a4f330726dc8defbc53c6c5e00d011ee1d8c763debf6e3b8a6b46f994cea1e03686543e4a61665dc17b2a3815cf993041bdd7e83d84502c7981998ee157ae3fe20bf344ae65821382ac1641b3b9004434874817b11f9057b327bad99a04bbaabd3b650b13fbdce48489e9bd9a98cf3ff9bfd32891200037a52ace7e8fcf22dd38a5a2f9557b928958cf04db50e03c0d6d440885235c7452946c6977f40d951501a6a32113521ec3114bcd462f787f082df05eb43ca812db34b76fb83989f164fa3212364b23e7a62ef36356df682d40a11ec2b22e75d1e3d0b4499d0d8c890142ebafc0005459d5940ff4290de4e126a873941d24544c849f47b98bfbde1719b6461bef4126f76d225d6f54fd8d26dd0e84c8fbf58a540d33b7cf5c912d74a7a711f6466b7fd17623b59bd0025ccf927cd48ec263ffe092ea5f0090429d98e3b07f4a9a003dd31180cf38429e268eb26e72808c73ec8883b07dc198738efff35e22083cf47d78be4a8a02c4083d89f1f670682c78ba4cbb87cca8fb05c6f17e1d4287c5817ad1ab21951e2404c67feb88b610335c38bcb3cc628bacbed9e02cc03d813b714278830886727cf6b4124d05e5fa5699931ef90b7662b5e61916db258153e8bfabb3a1a6ea16bc00ce4cdde2f6d21d08215d4817c00d2f90a76b40e3fa5d5b6985ce33bef84f7c1d8868d697bd8693da6988c45e2caeda3908123ee2e32422922dcca87b8807df20c403d7580c88992a595c6b1b6a6cbcda7794fd7e0607b57c007452b2111bcd02de65ace8a66f42a2200aa9ab1cfa80649aec647746d7fc30e41d715f692d4a92e73cc589e7330cec21293fe554f7a23ac1f4333e1936543a29452852f8e94db93131ba6eed8a048615de319a891a69b7730e804195264b6e9960829ca62bf4fa4f70fb989e29aac1d7523c6db2867cda869bd738f19b6289a754fb104008d9130cbc4b5c0cee599e2c3d737ec3433e700a17c60a590e90bf1e1fbf0335818567b985f32a32b2247799464aa2843ecca2898797730287119e45ebf88bbdecfbe444b9f985a62176481b6965be42423272f9b8a810d51c11ea9069f0c49dd67f0d3754586f309cf06cd0473c62106252c3a80a5dbb0ec641a3416dc0a7e1613930f82968fb06ccaa06cb246c4b4d8fbaba278291711423d59a49aacb310163e37467cd88de9ea4f77ccc41d329c31569f0100eeb0bf4b24a269ece6c1e6360d545d9dd968e8dd8fbaeec1b07cf22031e026c07c3fde4637ae79b2f84904e503f1a37b715f2ee72a75262aea108a207cd8fbb245b5af107236e3f349fa6388728cf79a5c2bac1db7ed0e007b1af9ecc3712a9d09f8de2c47352655169ca81c644b531d74a1b10e644d056eb939fc6bf8fef015ce3bbdb9c3dadb493734e7228579e99071d52c08a66778570eb8dfd127879332aca0f13f60e8d9b1cfdbd3446bcf138911bc2c8c9b2d99b046e19173009b15b9789011a581cd40d97e6bad18de104b079424005521c8e7720ab3770cd6ba0782162b9e138160086697653d5ea8e07c9268427a5f64274e8fb7d41b290947d523c741c540303ca625601303235491a06ddbf62dc3036d6bbda64e7400ed0348f5124f28a4044afb8c93e3736cdfa4240611a5c0e8857072ddfed0de95dc98b636df7e4817e8eda72a35e00c7b7f76ac8f13a3db79f4156bbd8eceae50150fb1b97a1bda54f9320590ca29968e83a609c9767c40961f2d46c5ce5fe53b4d27f55f544a7ebff37ab51a457aacbb258c26a70d71d19345d398112ca0a6e74259c0f0120de47538d7f11da0aa77c8c4b80cdb958541198c93cdb6ce37a0e94d912704e0dddc55c086e6c4ecbb625277f6adf9e884322899be688c3d20a257c3d9c6d803a33a99c09c3dcb667275c07adb34b0d2e4228e2fbaba6499acb4b13b1666f124003c20e1c11fd308d475405d068cba213000eb64b58ec89131788ea5e23cb6e4e8fa552f66ad549feb08ba07c03471231a482d751cb758b8052f8d1f27e6231ed0622a01ae0a5f2c86739490210c4141020c746b53abd37d99d22f0410240b8eb50b4635db152000e218b01e5b0e3f33da0c6fa80c2ae02ee20c7a8ad1ba4796f531e0872c761cec756cc098405f27b47810980a86bcaa2d48907ce6ae2dabddc65d1b8a95b55120b5e3eef73026c1f749497317ed55df61b9f1390959681b52817e4837e002d490436bbe59c3e2314390950104005593155d96d390fdba5f79c6cc91297e3d2889a026c961a3340208c691ce76b79170be9467ab0d3e1efa588499c1d767c300ba22a8f769c0f8a7b35ced877558bfeec86e61ea1ad42fe9b2e984fb3662de03747ed83c70c4baa1a01a07950f852699255dc16441098e5554db6f77d8a531304a40a3d56513cf0c7b8ceb96c7187f80e536c6f8e438963b39bfe4c43ba1dfd0d0aff795088d0bc37b62c5c9a205373ab1a16fae31dd1d864eb1a2a079acab1caf32ea240fe0326d279057aabb2a4412b37d86c7ea322eda1cf98563bc8f2859389f774590fd9c6357a9d89203f9810cc117551a942897eb9f516f30bcbc47206c00770e4de999e589b3a3f5985816f5067a6d9834c94a25db5c8e42ab6ebfd2cedc1d993cd1cc8479c8e46c94340ba54095f0823eea4d48c08a29b511117314fbaf5fd603180ed6e17e7ce4c5feeca6b13086202f47dc96be0dcf798e4adc925a856bd726ba130c2abb3e019dad99a60f4c196df8479d200fd694c5590c3efbf3ca330a6127e5aa80d819d412cb79208ece2c62fa11d8ade40b9ae83b8e35a8884e885d5298168dc1cd65b4476c12c2ac7b9f8e92c845c47511a2ca2b3baa9ac2f894bbc777790f8a320c8b697d1f63a8250d30ab600ef319aa710d221b70b57e50047a1da992e94fcace6037fa9c0692fdd45c58bfa4e67e6600ab12813c3e02cb355a64815edf82af84568854470868598b23061230555238e5231385b0dcb4c237445658ed82169ccd96592e42b2317e02cb40a5cf7c6887a3e72fa109aa57e64cebf27fc30f135383103ed05a87745fed569b3938a336b79ded521cce3348fcc3c03ff53b25dd8b4feae4c6f99b1dfbecb9241cda63d2816adc18f4ac691330ddc0e29eb08ccc5c3cdf68b1ff86932596d8d9fa10f083ad9bb4f513993653ea0a77aa831003f88355dd854fbbd2e5091cb04e3a8312f6194286e592e11b87c7202bc8743de03489232cb1e537a70a3e409199035a7a9adf39d45cf79de001d095b624f2b3c384edd495705b043f889b7cb664cf798c1728211110b5883ad56c4b9ffa2dcb3c11fea628b299c7f9362a93f0653fb060354db6b20f37ed068d0eeb1d019c811ceec8488af0e0ec738355e96b6939aea5601d76175e4eeab2574a5975b1a83bcbeadf0ca5ac5c3df406cdc66f059c76aceb2c77b081aea0c2c69e69c612a5f181184c8189a64c9056d4130665a27ff1712f7133c9b096e6e4b6dd70c156c531388f471e357e6adb7fde65b152747857a9689f14ad65dd9fd25dba9a27c821c0a1bd3bdfc30d1ee6e74f5468170ffbfc7c55cec2df822c196f4fecf00225effe6d4af35e887ac72237524a37f7ef163a3e0aca7b3216a77e7df5e6798c38f456debc08c1f00cdd242539ff4441f95aa714f4d68b083c8470a546362cac7611f240a391ddc6305f75e87335033024ea8daa200e031b42d438559622a3b70b73cb1dcec66735170883a567fe413c430ddaca988c05d3cd56661f5b19d057954a0f49eb6cb4b74634869a74d47c22fc0768729df23d80e7e4a801c762e3c41488a6bc10c028bfce5a992c6f4a7eaed6b2695653048b0c8a2e8deee9ebb8c7f1c5e764c500eaa9a9781eb0a64c7b620c91a937468a2f35618df8df6b23af4589e5822f9446372a0f2a944db1babca9fa938eca9848b85f1695ff925af04ff1ea5405af2cc7ec2f06fe821028dc393a0ac5c6dff562c11beec9d603614d0d91dd74766d383ad38cb9799dc173783da5c2439bbec895c328baffcc3d4315c83bb5451aa15f3c04e3d5988f74fbe158f17b8a16ab19d4af490571a74abdd6b94f2f6b124d05e25c52a862c3c545341726d4dfe7d1129f8d3e7026558d1efe688635ffa37b4403da3f073dc29f47212e630134ea38e8bd313e12306c6b957e261ca4d64d897405924ac08e74d11615f840d7fcf817c8f8bd5d5569197e876ce13c7c5ed725211261bea0158cffd7a06023745b0ede10b32e74ef393823b23142ea2a29f690bc03b05f3322f717e9b90fa1b590fb38376e0fddd7f97d1c3ae4b85e8ecfb4b09988fddc7f26d4feaab48de6073e9f4c5769a75a9a08666ee2712f6eb5c7ea8cc2035f55a9941c998046f3f8a270f48b6c3aa06358112eeab6630023577274ec021d35f2fbe0f68d42b723804d573d096ceb49bd03cc694da8d7179420f3405095f2a0c211836f0a849ea1d24bd84ed56a50c2c92e674c3d4352c31966f54601dd931974a59767748706c64e101ec9774a98b97096cb03c25502c2c817e3b0f309decef3215b3abaf44eba89907094cbf6a98498cb62c9ecbce9cf7f64abe07510eafd103020c6af7d6eb716dc7dcf2be5c476783d868c3fe7258e0f26c60fb419dc15adf3783adaa2b33052eb0665327a5736e1434c9ed62cbb9a50afc051f811131a6b272538533c17d14d30698a09a3e4165840a81c9b44d2af62077f5a71885c4f3f9e313255dcf387bd16a34d1a100f1b98b03680d82198d0e967cbf90cffe006a66344219d408eba31f59da1f32a4743070ccc865ec988c76101127bc06210f02c8eeae415f23db25dd1aadf81eb2f684a79adf84d1f10b4d71617fbce58af49533b16e14e890157fa26c9f28c76eb8e30632e7d355dbe81fc6b592f1b7c251a246b4b4fcc3dfc907620e2e8f77d895b06ddf6faf408d09cc509c015ee0865ad8f06cfab24c0fcf28a4eb2688148d01abc84ac1d1142283e25d331659d06731702c9a4fe4b3f57b4be48bb657a9a55d625ac9a21ae5a16b3b233a925c3f31cdac7c3a1f906038c7eee2ed427f200ebffd3658cfb5db042ecf0de4aed58f28de97d76c1d87b2b9530da56742026659c500c094cc2100071596534636b02bfa8814159fb5ef6e480cfaf089a229715142745740755b688edf122542ec6ffa9dce1725e87aaaf6f8b72a1d19c15323bb688c669d0328d67a33b00881d455a182122e167cff1364767efb5d66162d9a3d6f98b8ec0a145ab80e341dcc4cf5af2e89ee78a9d30d08f661f4d40693471e45918e6d18afc8052d03137040253be1fa6657e2c8c20b84ef178e325a2fd619071882e8af4f99f22543c8e3e136f4b4090c179574c25aad7843e698ff6505dc27bfa9856e427acd080becfd2b738003ac4068e32436948ab3104aad6ba6ed4112a1f17685c5e1617dce630cc8bfba4bb021960dd2f3c6c2369bea077a57f056458c07651145437f7cbd7bb5b835ce99dc8a0efc197d38fc797245b4416392b2fb71bc540b380f488814fa1d4012a534089cbe69cb6b77e9e98f6be3584570a620fc6c278c15e5e7ce51768360881530d35af4139641adce6cfa6b16a0c313ec601613fa4dd51d63b2aa63a29d79efeabd0bd8999e40497f823abe006652f79dd69337ef0c11f2e080518f5b8301044e8e4118e88f9506004ea50a4230bca65ce47812e98498d6ebc55ba8e43efec17a30f7515ba62df222710f72c84f3d6010bf1bb7fd5f58e713d86b35e8e68f83686550b75ece386cc47d7bf566bba532c3bf6751530580b7f662f6cc57756dece9be0cdef4d3a8568c2dcea52985e737bbde7e5e4cacbe157459d10bd9ab9d672e5d96072ff544e7cca2fc1aee0efb5ef53fa49d063f3af9784e965f3bf5b9b31709c8140a63990c4df6622b4ca64a79457507969561cd644bfc894ad0bcecaf2cbdf2f6e31d98345a28b6e134e881111c0ae465a92c02e2f75008ef22df4b774f23b0c7e17e86228f405c0b76ed656fd649324667f5e25b383e8535e5ff0574fc192cd267e9fe125a73859de9fb94fb706bacbad2f29dc9fa96b962efbc07b6a43b35a7fd8b0e59f244eec60953c44257d4d1397f947776e40e9f8e9b6cb835859c6d103db080c77c9c430bfc244b29dc033e1e2a6a09d050e09fd7dc0bbd0a467bf273e216d1b04b04e41a4c274f6d76fd1d6e960cd0380131f8c637761943bab896db2bbcac37a1d1e575b7eacc15bc14d8e7b5fa157e587460f4e20c95fd63c3be0bb4ec6d7838e6476b802c58ecabb0cc4f1d1789ac49f3de649c610b0f432efdabacc4ed2aba93a4da3623aaf28c99e2d103f83f2d5c65d1babe5503e9a28380229271626ef9b295c0c868b580451565ff51ba75c9b2939643d22333519a077f4255083c5174d7f1c3f82efb202e09f4b122bbcf71e35d4f170d375cde629d6e72480aac67527b5a8d87b3f1ce5736c00d7e1350813fc8412bad0b2a9a96a9e39282a25abfcc4c76983207f6e88b2184b8cd4683e97bf23fae5237bc384a5e62d1e8dcc7c2cdda42dd72dba44179429f408289de04f67cf566c922e54ffaf2bbb3782c9b40a2bb48483466b0afb97411e0e5ed22079454a86f056d7a009941a95c9d43785981bac1de86c9643a28a71260ab8553498bedb611d22c6f7d5a9c3b2b1af1811c3a83a14e99b616e05002dd748b4b3ab3f43ae90cea2c5b16cd8037d8e7efd19460f40758c6dfde88a756d63bc9017a68da9c0d2ed326bf75b298d76549b159a135e6227f39cb08e9a2ccd705f811a8525fd316f8a147152fe2772a3f3899ed642646c7abfba0f01f993fef6ac3e4020dfbe81a0be7d7be40b12c0c45e5ff3ed3bee4291bb66f8fdfc0548f0d8d1fa8e7fcfc293a86984ff98492c0a392dada056e88880a586bb5b8fa10d259ab4fa8e2127a6e96ed4a69c362544c15212f03cdc6db86187e4ec242f4ebfe95bf88cd0012d0a3f42fdab1de69432c40a529a5272905af3c96afc5914bb9a01490035620218e77a68bac0ee08d94b006d29837396872a0f4f5023eeba8a660df13e8a5d97f04bdb30fb16d9e4e7d1a6e6117819095b9b141b593bd8983d31c78e8d8146083f8337c7330bb481f86e511605090a048cadb7b4a0e90c4119253e640f36598322b606aa06145e034a7bee7e5b3052ba4a075a6849a309ef8d37911ada8af6325948295d4a6a0c6dd9cc242340648bab09552b3a58400fe7dfbd5b4a64d175b863106390ab5cb0f6d801ea4337a8c48d02e9f5f09fbd90fb068d180922237fefbdb794524a99640a7607b307c307d3e5925d0f5709622f2ed70bcd3c751944687bbac277902012be5927ba50c5e99d19845da8fe5c004710091f5927f6c79c23f64413889a9035ba0ce5100948e08275a13f273281a88967ce71bf10c87ea174ea9c0ff9d9fc8424f8f6d8d2b5c895c0e3997384eded3c5afe446f5fddf40e175a9e7a1c7d7292971b9e7af4bbde6137e38c33e218cec14e1b40d4c4b78b7370bb9e391f7da79727349e79c974a1d2058918247d61e5c31b3fe90b2537cf334f74592ac31863c601f9634927d9d4c09c4cd3b40ce3ee2cf6d269e9b7e26f3658afbdf7da4a7b8aa6dbe41d160b35df34c77cd3b66dd3325b691cc3c2019d39be22fb58528776cc7df8d999995d35257f7c3dfb32cc3b8b8f7df79b64201dbdf4cce58c51b5b2f1719879733e9aeba16961864d2a9d7126188d71428de925ed9dfa592c9db3592519a50bef92f42ea7e9a3c8e8669ec839f384d22a9fc40596ef4f88857ead06ac333344174aa62c328bd462cf96914bda12eb48e7a2e8426d49b3c255896ecaa5f959f974079db5a2597929955847bac65479606d5b8c3182dc3ce8a20fa53f1e084bce399b67641d1675e2d2b6e7d523493006d299e6689ecdb556611e7295f6d6927cfbcc9a7c7bed9cb09f7cbb6d24be8d7cb75257e9feae8bc9367da2b553d9dbb3023aebd2db1a6cedc3dc7ad7a717b27802617d873f7ef36683b1e98d3eed2c10bdb593d6cf28f3ca6a45e9f9cc35137dcb8f0522a208e40d4af939d6d37e7f0ac56fea3352689c6e8f34c609adeba76bad44859a71ceab4d58a7ba36ad75ce3a676302686ce1d4423a8d4198974e33a7d42d75bbf24d0b245efab65ab98dcceff5242d45cf543c276911c56b02f0b89ecd8542d818ccd922ef1040a409000e4eca6d709c5b26ede37ea2b51ee783730bd2d0d0d458afaed9388d57e3c5c761ad6b3ab5d61ac781e3c6cd0d4d8dd358eb98ddacb5d6db579bdbe07a363fb93680ad95c8d5aaeb6aadbee2e65183b556a6afbef2701ef9807704452fef5e7aa7230ad2a9970aa677c2f08e1fe9d4535f183fb4e129af5a7a27b4754bef00d95a5d53713f313b21739ae27c7035bef290a4cac3eb4892875bb7ab639eab5e83ebe9afd99ec643d6531aaf711baf3547bc8386579f49f08ecdab6b9b17747a1bafa1e1c5477128ac7c5bf9b6f9ca79340d8f9f3f9ba0f8d685ccdf3ce8f41b8d6f9eb79f3e2105885e74a7c7e6518d962e9c4540585aacd1828b76441f7b7296e1268d67bd391fd6575ee3f14b2e287e8d5b4f48fc9aed0b6df8e695c629e70354e3366af559d43b365f68e349efac3e201bbef2ea134aefd47cdcca37ce878d156b8bbca30768f31a2d6e0d0fbab08dcca31a5e81e29cd23bee1bf793f9758df311bf5583d469e48ccadcae411a1a4e7d0b407823d278ba857bba3da594fa507bf93747794231ac3e7c7519cff2e89a5a8df491de915e2b92cca95eeb173615ae36f9e91549f2541f3867ba0ac25594ae0ef1d36d45faa97d4754a4cc2321ba385bc90cef5fa6df952368371f3becc75ba7b752ba7db4abe88da131ce0fa2a37c0b2d8ff2936bbdb19432d487917efb4e1ecab3251d13e72177df4ff4c139eaf3e9d34fb31e3ab90596ef1e35e4bb2a1f9d3a8fdee9de42ca67ae6d0106db7830a077362b16b56d5eb91e1bea0bef95f372b9f33af5de4ace27e37cbaedf342ea9c967128748f3a7d21903fa97c82e298476928749ff3901bd0f60151713ddc4f74da930151dd6ee520eba70ea0f6ceb61a29bae940de396af30f373e7d9ce78ff2e26fdbb64d6ebb9b6f5ecdabdb5ccefbd3aed99c5c73edd47d9c17c6e722d703f5f530eb6cceacc3f909f3ce93f193c7bfd9fc709e79e6dcb67d34bb407c6a356831460ee32c67adc5ac732a7c3f1a8c2928d13df6951029fd84e20a422d6f852ce639bb428398b31ad48179c8f211e1d30182de60d0e9ad83946ed1512a6462200539aab9b576851fbd63a5ccb77da12afb7444a1e63c1d1e4b07dd6cb144d0d152a89f06f9704a23f609c51f0dde06a9cc922efba142057a07dbb80fc382ec7b21510a0d4615ea0af43ae659cfbc20f3b97f60a077ec2714bf7e3d660a325fbab07b99c8350102882ab014155db1020820aac0d2489fad644ee699671e9bd23aa39606330dfb7a4883998ecf62d34ee25abc72e79d77de46d260e698151de635469f3de433975e28d4034b5603fde2528399c72f2a3598795f894ad4336927364517eaf8cc1b49ef64e1aa9388f9ccbb49ef6416c967be9a7e6fd76559c638d907d448f64851d1152bae6bcc3632f9d91f7433deb879c452b71920baf0fed5a29638e3ec291314c7f4cefca216d762155dacb53a5383d7312c9df5e9e1653a8a58fe7a7c92d520bf08a5c1ebd9178b1abcde55c4a22b3179b129ae96dee1242624feb65f8f5c2218fa85dd6d2495ca8d3b3a4a0ea790fce839d098a7cb81981c4cf1da69f64ed8421d0ab1cf1efcb590fc803e1f27ccef631fa1f8debca213eaef911e245da85fba507f4ff985ed5bec1848292dd37b595ac93c27cff61cb0cffed843573b554b29a9ed06992ff5ee6eeaa4934ee903cd27e6ed01494d66ce9ecf67a33910f5761b1fd4dba9b5be7d3785eb9b43e0bad69f4dcff4761b1fd3db7da6f7e7aca365edb13d288e79671d79654e0b66864091310336d6a3ac51560cab326c46501cc332da29c39ead335774fdc2b3d3af6b3004b9257adf53e77676da9c09444dc8f662d6ae79e6f1620eb479a879731ce79c8d8fecb32fe88472c6e259286f392d6519e9d4b4b959cf9c76ce9f7941581f145f88507fe7329e4df78397f1fab5ce3c6e7a19196fbe6639b69cb6ca9cdc8c97917f92716d729c73ca9cb27c7bf14f5efba0aea639733e3c7a7225f0c8689665aeb9166eac23fd468e1da74c5fd14dd70bcfb9740df3247772291f73eee43232980bd597712d3ee69c1744c685ea9f9cb99f0b7c07e1c082e298680286b973bc28fb750dd6ef7bda591f68f2e4a37abd2ead5f6729f95a21f1ebf5fbf9d313ae94d24a29a5944143de77668cae9d9e6ca4f7b5b65d7a2cef5d01030d20ca719d475f0792577a10a1ed834810aa2f5daed08f81bff763ce213bbaadf123aad132a1b1446dabe9da742d727c51ddf4aaa4a0c521d97c873ec6f64834ad0d87e690b54136b607c98f41f30b85fa33ae077521dd0399ae173e6c0fb2625e18f3422e90d76d61bb10fb4177080c2f7c1021f5a30bb1cf02d173f50ed9ab508bf9e99f8d8f88f4d22352e809e99f9ca3bd56e71c0de0383465b7330b41b206c9972efd0b1aba4268e007dacc96ae6592b844f1e1fc8e317a0666b674d1c3e7bcbc9099ef477a2195dbe47342eac6f4423619de1124ba3e88848f284c1783d1a64b0f89bc2773a94566c9eeace3e37aecd757370db247ae07f3d8832faa6b3024f2306f7a42e2875148cca6943241f26d7ae4638e7dce3aecf1af17744fb88e7dbce266a276875e9bb2c306c8a0a1764cbe7c39334627bda55b4fe76b18a9c72f287e25c013d968af68ed335e3a20eb217c68bf78a4b738b201de1184f546ec44cc854767fee837a4884e8bba91542bfa54fdf49a1b62ba10c8b3b6f83184ce74e9a60fb1773287a8c54d4d58f0030b8e985cae1675cd234a20040c4130d11a5244a715dd48aa35a448b7aa1b59402b3af58c2ca035f443e6c81cea4351787c435152a01ebf219739d3e9c7320789c7904106465fd8c0081d5cb95146c72d221da260c2891327965220468b5bec212b0577b95af148ef8480640aa131ef085932f33aa787b26af1f30b9263c684179b20602de17520444978f9fa5d0fe5170efd94de9ce286bf9f11ad1ebaf061f4b03a10a2267f41a080214820e029907cf570043fef0702d6f2f5fb01e50505c00206930b95bf794ee2e2c31b0db1bb40d4a4658d5c34384822061eb85c2d3672ddb061882445418456602d6fe42a001630700951c010a4165c3c0592167b3882af9ce485152f14df0806d6d2b29f8bb5b4f81b627701044e80a8c10b625c435cae167fa1f4e62450002c9c182301940e7040c419318c19d3e212542f3f5a913439a717eda5d4a55fafa3b4ced8dcd40b15fcaa415a29523369ec523ae6b2faadd5a594b206efa09dc4a41eddc6662a61ebbcac23db8bc63e29ef88223448bd307a960cefcc962e73cda9dff40e751dbcc359e7769d7373569d739dfaaac6532f8c7c0d0d934f2ecaa53f27f100ccdf3478e3751b6b93e4c511cf495e14f1ab06afd7495987751869051acf4cd151e79605d078260a6f678f5c8f479f335e74ecd5bd76aed5bb7a94dc09957af4f6fa85318c99e601596776ebcc27602d0c81e105d707c99c05a20f0a45f00333c63c0bac0425090daf390b44af7d8c7d3ed9d75a29a5734e29657747d6b994eb896f29d7c3665f183feb09b3cce6c7da16de025d0f1afa50fe751eed61e5d1ed2789da9e93bc28fac94e7b302f6589407d1586a75b7484a7d4b7de892f68cc91396e40e3abf2a3c864bab55d3dd471758c605d051e6079eb15689ed9b2bcc455de82d171d33becd92d118cb7ab2facba8c6365121acfe8c0a5ec22cb4bc9f303b2cb16a66f1f1ad7f0a1db8ebebd53ad78477c125a72ec6409282de5eaa2c7e73e003bcb308d163bd4a44b4fc9b7e7681ed9ea10fc2d76627010209a82c50d53c2d0a10b2d35b498bbd275d216a5efeeae776418f1db9e93b6207d3ca2f1cc0ebabe9b00349eb141d71e3d287e87b1e4b339f5f65888d847592788c7f46c9e65af7d2158bdd08abadcbcb03a75ccdb37c75cd328e651274aec673ae69be6d1d324f7733dc6fe304cc8158a44357617479e3ef1f28c26ef4fcd10f31e149f3ab34ec84963aa7cfbf46c7ee81340d1432134a44f277a2134ace0f8a64f7cff3450fb8cd225a59f90f6675479a17e295dfa4bcf5f487b2f1a374f0a4fa0f8d0e70c211f3e14727180e9432124aea00f8576a0f4d1c31098e0250513d3472f4e3e88c78c39e375c400c6c71e334b5da3e039a969e9bbe839498c290f3e2785b1e5b999a54eaee039a90c261f919e93c2dce007f09c144686bf2ed710568ac2827d21fd1c08123f62d1c910daf5fd7de47a044d97abcb7318cf605ea35be57a38cb67798d69adb5ceae55c65aeb0565a2bff458ef4224ea9651c830d19e93ba4002c60b64f8610b2b46a0404a8b398deb21247fb68fd9e0e58b9a0d0ac9d7ac6631cc76aaedcbcfcd33b742f231d762739432b6f32e778e74f0e6f90bab4b26819b2f8a6389dae4fcc2f84171f50ef20ef9383c48a762e64a175e9ad485916fa6939ba1a28b8ed342349e91415237b946e3992a3330e82fc27cb165061a6f44b2861b9cf1427e91d20597f7a2f443052f5364972e927e79723715303064b66697308a4af8a1020656267c09f3d345681edaf2f2216301e3adcc2e93b27eba8fd1f5234bcf2d218bc53c4448badc708222aa28d1458b567b34c23cdb172e20038c1e7cf0440ce621f261075e3871c4888933a4609e0d3811c28a179223a868221635921a363f447aa51c226a596b3febedc9af6d74fb51dec13b2479de12534cba7de84266923cdcd4a54563a3ca5add3a87ba54d2cdd5948e2e806ed76337161ae384bc319539d486c524468373a68b8043e727b8518d521c218ea720751054029ffea03cbf90860fff10e867cbf4a7629de8ddc660f41b41554ff7dd3f690a3f1aa4eca51ed1b8b5283828f1c261895f35e801160f2cd66a87d58a06896e1a79e6c2054530e172658c2996b4d899c6f4e2de6ce288512acca904f3b494cea1545c702b8ee6399d3c174eaea596e8c23e9a51ba8f1aeb6eacfb0804afde478da597e6d13c9a52e61111e6d19b47534a12ccd3f512ed44cb00fba6942eea269589058ce2a9df2a4f7d7ed8d1f5a106a9b7a082e499453227f611e6dad19604efe83eea234a1df3b0979e660101eb9ed2474f7459f5a24f128f8000c22c6a81c370180ec361384c9c31c6183d471fc5e8de3cd5c0a9716b44afe19f27f97a38d14fd1678cd1371c3abe77d290b21d1d016089ca0daebbbb070429d811081784d39c20d0584da42af1624f1aa4452ee834bfe10070e94701e0c171eab37700e0d4e79c373c9c730660ce3955a939e754a5e6bdf1b08f68f89c930693728be43939751bd3e30d008e2a358b6866d12ceaa33e6a293d459502e1646f9cdf5784038757ae8f523d74d1ddc33eb2f1b08ffaa8b1f452efb853ef2c353335a89a1a9f1ea786681f7df4c8bf166e78d84700f090c3f41253faa8a5f494c7e1f103c0eb6e3ca393db78dc601f59cf86176e1ff6d15110fb212f09c5a7f199d02075956793faf8b5195477faa617950b9128a3200daf1baca49c4821bd8e84995c5e47b6bc6a10f3aa614b6a895709965e25509a30bc68008382c6adc52d328b94e262520ac924952493bc9209934c9e1223cb96540f5ddc22e78dd14b7be412b7c42d914bf4325dd58a967ac16495f1aa61e931f753631836b1c6fc48435ac5d884c66d834e355d7a0a8b2e3cfdf4d07fb6c78ebc8365a9b59dcad285fed67639c0b794525a5966441dd0a0a937f9065da75a492965cc62e2a00bbb9f9d6a524a61106b8fd415ab9bd0c1afd5b7dee9ac8dd1c67ac5adb50259b79f8d0feb4d5975efbd7eefbdf7621876bb8949a9a7aae842771cffd8b5f28086293f80e7170d47b610f3399e5f33283dfbd2950ec7e41a48c00a0b50ee9862eac2ee29a51b09b4aed3a20b4fdfddc72c40d07cf83995832e3a1b60bb0d4a2d13d01887b914966e426006a4c7797e19597aed54edb4f1413d3af5f8b5cb9ada810c6480d2c523524ee6a7c47427eb73d2f8c9fd8c4fa7ac4af9fc72e4007b07483a582368d6d03c8c5e8d1a343e3fc74999d13dca83e27f3154f97d41d3c31afee30b9a2ebdde1a5fe347e7abaffb1adffdccd63b33422d3820be1c5ae1e31752a71f10d603054d0fa30b916fb48d800b9a1ed2f8c23b31c7388e732299639fd71a5f10cd67b4f9fc6878fc2acf88f314e7d20b7f7cfd70b4cf888dd6f6cdb039110cc38810d91873229b6b4e24fb3a99c3ce3911edcb7c05c9c37d2c19675c47836ce9164f1eb2bea37b377cd0596735c84eadebb8414667fd14016eddfb09754e3bcaebbc20f44fdf0a355374e19d3daf7c1951922f2356364fcbbc49e9acd64eaf934ea75a7e3a4f4a27bb6089aa4c55994d78474f23349bf6fee136fb8a3eeae82fc5c429929a990d8922c3f9766ad7091e5fc6db6e6456bcb97456d2329e51e75c87f4d2d3fc657c4eee04996fbbd46594a452962d128ceb8892274754ac6061e2d22f7b4814ee723fdf6f3e9b5f46a63ce7db8facd2a0ea3b752ce84289d48ff9e47a04f161eb3eb15f66fb69e79cb91f1258e91dae7fe827ab34185f46a07c7be6dadca2cf965638ed0b8ad20ae5c89152994b82bf5f5094581af4a1a91fba502221f54e95deb1d23b4c91707d6130533a74d4a564b0d6d9e08eadf613eaaf42fa67af00098b8564b5ea8e148b115a518cacf7b09536451263dc0095ce1c731c01ab5bb9e38039b010fb1ca7c1ee066c49075f1ec3300c73c66e0ddc1b04efcdb01a300cc3bcabf298afa678ec0b81b01c741ceef92543101f3a4b0ca78e4c3a679122224aa46cb8f7da5be4defbe4af77477f5f455ef0f70b6d6a86d4912bbd4ef5928186cf9e5f32b83eecdc08160d2c165796d181acdefaada1efb3e4b95648fcf87d20587dfd80e63665903265e47ea59fcdcffccfe6a7975e44a0f8f0c713a08075fa4544097d7e1131410f3a4e3a03899fcf2f22367cfbc693f20e7e1191e1570d8a5971c1e5db6fba0363347db8f5a0cd50d16df439e90c2a32674e0fe143a24a3d9c5fe8c26bf1f53372b64643ec2e1025e1a5453f174f812484d722731408e1db0a2a7268dc3c321e5e2e63ae93e8338ff3eb11bda6699acdf553b8bd0c6b56d7eaf4aa694471c3304cd3e46bfe329a5f209b9f694ff6c79eec750dc3b2afe73ae698162c3f1da38e6d7ebdf858967d40d8c6a1307dfb306cfbc2a1dfbc7ae1945d84d900b13544c68b301ba07a6cf1909b1734f453ba8cc72ded7a3fd807c479a8b99cf50b39d73e1bcdad5377eeb3d1be9febd5af572f730b74affdb9f6fa988e7d6175cd351bccd906fb7aa83f1855b4de8032d7aa6fbe79f5f8b7e67a34d73ccd79c8c8a331b91501c61129050d64083fadac5156761e5dd99bba741bebfc525abfd50b360973ae34a0e8aa4b8fb68677d62a420ed75446dcf0e6d9466be3cab7eac3af837562ad4a7095af000ef3cde76810e7994550c58f7a0e967711c808cf3e5792abc81268a1ab56f45e672fbaa65a55e7fa711009daec0944c78d140b5b6b259dec92554e7446a89ce8a2472e342dbc1c399cf44645e9a4743aeba8a2d05a69ad5475441727956e29a56429a5e4962e4fa0dd59a382d285ac766128b6a80f45991e9d1915fd3e8fc6b90165e4e156c4811155de9f5f451891f23222865714d7eb08307ce3b7e1187520523bc89779bacee1197f4ee96d599abc8ed0f23a02899711625e4660791d71c4bbdb27addd7d738830024e5fbe5fcf7bef8d7c335d30c3bdf7429142e7aa534121a3c91226a922401c9068ea420547f8c03483300a03a5862428265372707224060a6070e2c904c2280aa32c92a07490468c88306241927be2611619b98c6e48b2e405e50a14268a9833aa9ccc39a7e482c5ea5625583204181b8e9e48e2031430349ab2f81acfaf27494ea60f54523f60e202197ce9820552e60f7cdd71c01c20e6e13898a3c4510d465cc03446d1fcaab0184378a1a28a2523a61ba60f31e0a6f2b112913774f9f2848821b43c19e3af6a09add43a55319973de996436b9c20696882a2f22a05025512da1f17aa23d89e167be7cd8f913960e2cd60e93c98fa0090c5f927eb0010c0b54bfe4196906527a0073c58b932a5aec4c2307550eb3e6098cc609b8c3300c0b424910506e1784917baf4c0c6590818a810b20c838c5000b23cba2c510b398a2061f3704a30208268098c1bdf75e1b6c70d9228b286890a4071b7a00e20803c288060577062a1b8a907ea84275a4338267d084e4c40d5e70a484134a8abe283203c3300ca3474ea002c51048621c3143063c146529d2412d821529155da19281c6f34b88256384b0c1bb4eb5bab9f6de21d1de7b5f42c0f0f75e55914e6583cac6f32b081efcf6fc0a228b0f3b6fb2521959ad58aa1958ac1d1e051ad000059227a0808196163bab706019428327905051658c0e2c161122447866eb56ff8ad42a850a8620562b29552e1c9c186bb052c5b05ab122a61ad275cfaf1f9878c7bed70f53884cd50b734ccdf3eb07275f9f5f3f28b12ec42babfe84d888db988fdddd3fbe732d723d30acbbdbbd970f605e3e209982c5911793a5d79229a92f2dc42348346e8dfd5afb854058777a767a964aa7b355b00496d4184d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4da931524daf265a5261bc9640498191222305460a4c2a0c97a452f44dee52bc5d7c8e8dd65d626e459ff706cc333ba7bd372d6e96067b498c2e8c4c4bdf41e6b773aa874ec615c5ab07a497121568a7d412a925524ba4bca4bc748acb93170f499e5f3b4079eda043aa4a8a4baa072f265b669720b524b5842887266ec0050a5e567c21c4bca185baaeb3b606897f9dcb8779e67a0455cc63a4214ccf9c35a1b33ea79c73decc7bbb6ed632a4941868d087ff5e5ae566b55a3186e2219dfabdb4a9ad3de96ca50ef503c3e2cf19b4d2aa4395d64ad408dd5dad68a573529e2c5740bbbb99b15bb1696bb593ca6fd2d9524ed952baaeb34e512aac6a6aedac656614c6485aa99c93ceba444a796fbdaa132a85063becf6cecc386cbb71521a3ba5225a69cf3c6231ccf6c0543228131aece6bc97bb5c6d3da3844631a0c12e9c7f6fb575525ae984c16446add01d979873ce792f4a030dfa703ba5d5da7ae3663dfa9c35ced9f40b2786d16aeba4b4cea4465520c3b42ccbb0ad41332616294575a041cddbdbe7adb5c6f73ae954723eaa67dfbc5da582b69414a5c2a4d3b5cbf598b5b677d6da681dc3acb591cae8734e9e74f67063b17e91527a86021bec1a9c7332563d9e714e1aa5bc9366c90109cea1c98a09e93463440169b06b90483af550a8b919b7f95d798f9e5f49c2fcf32bc92b49d1f34b0723bf7a7e25617aadb79694ce3985e49413c592fb9b52b49ef5669b4cc71c917841a2458cb1250d923927ad3588b0d65e8c86892ccb326dcbaae0384ee654b3e8baae43cdcc68914aa5522a1a2f1334d1d0d0d0d458cd186a361b366cd8a8b141c97063bbe17adcdcdc703ef1061714c77cf4d899e397095c1f1f7b7ee1a004c716bd170e40d000226987213a28799d9410816118d6052113a58b112b66e8f2820d6800a364c8bdd7060d4444dc108549982e6614399a33f040050f5ee4b09920070f527840ca21093cc0f30bc9099ee6f9854409142da41f6d7afa9f7a3dfd92461b1fcfa5d07de4e8779144e0a1230a114410a177248fb4020a2caa7045d1428a56fb8a79889228e1c00a0e2b50a205575aedce3c444c9cf8e00c2c456028c249ab1d649e08d04003248ee0e0062d28a3a565f28efaecd45e0c673a83d235ef8641e999b76215830c4ac9dcefe337ab57f5d27757caa0310e0f06a0ba549c892d29879bd6cdf5e0b27f017b00ebf4365fab1b23c0008cf3dc391c004e00e6ec21f08e8bea542a2fa1049b99148f6d2b810125a46cac8d4d1b913b33dfe6a184fa4f3c5cc2c965be70e8675c47efe8a8e1218bc643d06b3c9cbce3864ba7bce3c6a5d798001b975f08648497cef234e9e948d2491f11740c619df61b2f12619d761b2f16890568aff16cfc587d2158e3a3f9c255d33a039516d5962512581084120aca48c28915b4dae316e651804b8c2a9088b2640a16ad761e0ce89d948c534fa87f4b99a0e36f54e745979292d20f15bce8a4a7c43aed29283a576c2496528c91ca0c5c48b1620bd7122f584c1254aeb88e2881d214feb203122bb8018a962e3eb01524a8708939820692db9c7a6d846a1e338334c8e63ee66f2e157e44252c514b548a51461ebd438b8441460f5e988871a28928071ca078a10b9752d1510a3734717112440e8428630137602106941e6e208613ada206a3d31a9d8c332ab9240fb78c7c885561fb52caccc3bceb49d6913a92728ef41b1e68bc94aefa710a0d462b1189c6972e9deba8b42d1685350b152a120000001000d314000020140a8744029150281826daaefb14000d9094406a4e974743490cc3300a62083286114000310a1040081933345403445a04f33c0c1ee287358498db2ef5793266d3f48fa5cee9e013a9bac27d0d0b27c3107243f447589745d5020edbcb65b57673fa4323511c0c1e8bbd32ebfa2a2936a9f5f23998f9be5dc9ca9df374cf84d1b15702c5aa42b39955f83fe5fc443eac36533b3937676d52dd1f234118c032182a387c96eb0427ada3f169671f24cf85f3718d7f2f84da7740f5c3f9b196202a8fa47178a41308468360cbf00a613fd89c6e14de10d6959b8a80af0680116b508f00f96047b184f075540a9cf9dc7fe6210577ae874d160a75b7275b01ba365568cbcca1876eacfe7cd1ec4ddd422351521f4af412254d1678a12432448b45d9eed4dcca491932e9979906ca3c3c8b3118e60e0d70fccffa8355f61b13b09f9d12d1d424f4d15ffb0cf6add121df60f23719cafea3e22765f623c9f627f7540179cef6022e913b9cca2280110342cb48ae7728abb97b5d9291c8a7139eac6174570a6e5577151e83f7259d9c74acd3f2662d0b9572b4754906dd0ecf87c22e50708d0de20f932fe63b2bfb84eb8c3aee4390ec9e40696aaee828b075250341bd65f47dee5d51967f4f6b48584a362bcc47ea6b5c9657523f5012984bccf0ad608c910f70cdb7722ec7bae0e10b20a3a609c9a3a1458c37c6941656b383496567517927a35a5c8f02291523fc28f87889c40ff67ce7f7e2a557d5b59877ed608781e761ade641da164b39fb8944874d7b90b911625367504a860e4fa21d526ec88dd745b815644852e620bc50aa94e0532e3f1f2cf9657e1f1807271f96ae701c84d8360e277e489edaedfe1197572f6fd1ca3023b89e953b5ee7de79590d56eebb0e9acae82df5e1a47acdbd0095d49d2be1900266280eb50b81f3071ee4819303fa67557dfbeb2b07d83c296e5c519b54bbb6f0b6bde88998ac284f68f5511fdd0f9dc01eca71844958741f72948967a42f0ed97e2d905dbe4596311427dca822744f6f67ee4430175330d6851c8d3a772c297a0507ee58c6963bb5a4d31b745b032a603253a2d7f6a8943326ed47eb78b7badca915109f8c96612ee8f9ccbfdc364a6e7cc4317dcbeff9f9607e427ab067250d391689fcde257094ed789a0848212113b8134811e242ad4d591eaec96d3371f909cad517d568e2425f0ad1a00794697fa0fb9adcab668feaedc2014406f0f9ea9aff94e750268792ca1ac5ea3332f2e5e7d4b32f48b4a16aa2844359f41b31b788eac63ef8c99e3700cd91215251f415d058f319f1b0e362499f7c9666b584cc1972a61ddc070f2c3bbfc7f56f27bf80b9c2bb8b3ae17a229097f9d2f3b42677415913967eaabf941e6e1e69146ef3f8e6b48d42e1db60c56ce98a8e51738b6aa0214dcda2852b1e1aaf84e6e7fd695df16e1b67f63df89367d6971dcd36e6075eb0f0401a3a267a6da4c24dfe06f99ffe84ef0dba5323b9e64e128e4f64b7953f82c3d40f0e7f09ce32f9e345299ee45920a4b81c396321830bba951d9cef80e6c1dcdac2c47697151827de0a8227608b4141fed5f1c230a165fc2c7663fe0c872e02b1829dbb19fec7018be77a1271abc058b2fb89296da1dca0601fbf63a80c0bf3b6ba526dd72a3134e0d9a7197ea83163275e75ae4bc6ac5f4bedb8671fe15268d6a1df12fb1786246c3fec86ae32e1f9ec46606379872de85fc60f1ffe22b9978b084df804626994d97af79d594184b52ede078b61f77fa81f122e797f8d750721b9915f064955eecc6d588a7abd7442df869281d4581dc1013c2f07f0fdb375001903b99e9fa66cb152f952f17a2f0f4c6758ffb3436610749e17c131a0084a73d9904ceb157a975951c49adaa4c322426d2fdc7d8bf043766b4f21a30a68d8a82181eca87f97bd0c8429e7eae0e8c496388c85ab67ac72a825533f4f38319ad2eec8c7754d1338a209a3d2e0606120068da55e635b96004dd889536ba296ed19ccf73474f7cf8313b6a5dbf8313805fd95ff82d830abede56ea079b44ab7bce7ca5458d8077a65102a999712924de101a41668c95809c1c8c63421d8aed98533e305619f413fdafd71abafcfa840b19c417a67d61db44944c266e220e8e0c8c4301d8349ae0175b6eeca9961e74882bf060f55d79a7a55e904a3381bc4906d1a232315f5e27e1825b77d596f039d8430c21a9713cb0f7c2256f612304182b1e45796580a40feb9a00317f69924dd79ffe852a06bfd77d3ff3368c5a012645c1db990ba0ffb222950e506d50f6c9539116ee5a379cd1420a42ed0fd34886dafcbf0dec0750bb003ef4b568fe4b57a1c40316a8e1366ac36af990f8c55f38555ac741b5c5664f594ca22c2519b7afaf6f21e2eaf28f8e513e656618e8ba4fbc3508ceaa84348e5b993f1b10fc2fa65d53f255cc999b5228c682cc25fa243023d8cdeeaf5d068512f9a9b61882245fd45a42fd7f001dc188c880fbfe40b7417001ef12d9f78f2e7824aee5940f199bbfc5cd6f3d4e6017954ae5f4e1d7b40e71ed484c4652b0d3f289b504879d46ca3808b7fe02998e0b50cc2fd06c33f86261ea440b809ce81012d49e2d0d6ecd86cb142d0c4d49659847d8e0db7c2238f949031bb78a316880471c94679dfb260b3a36400ce0d36dec029be9855118bd1de8c2f221ebf979b201242e20b7ff38f4a5af132849863008bbb78473c367b8608eaa0adb0c96d750331219faacb228b69f46dbe17b410c481fe17622dce82761acd2ef213af428036dce4db4411da64b416002695527107760708918df6e0443b543ed05470f8a97dd5d2c79abf5cb9a41458ae386359f210185e4d1af50b10bf286910b554665d2a66783abd025ce6dd0afeb3f74110416685f5f55b5779434d12e89154d17562b7588f8d42745430b0cb62b0cb3c47428f43e52342bb81aa49de95f49fe495e19093954238233d265d66d126107ecdbe47e00621e4ed42ffd7f783fa411b228aa1ac177d1ecc046f4a73275fc5d76240e8c0f608bcd113ed39afd204ddd72b23790c0caec9417a4907d3b1c141bf0e5ef5a87182115408910324bbac99eae7ea4f974c3d553acd43b4f8188c24d75a1af1546fd6a9b2fccaa39171046ee309a2e2aa8c0125328af4ce47afa4c9271dc0912b30b36c8542464e54b691b3cfdac81b40c6d3f4512223d38d00ce50a11d53718c44463c3252e7fdfc58289151e72f9d1b75feecc751195dc1d7f70c293242f39f283d22dc6ec459d939f76d328b3f689fe10e00278b8cb48ec9d79091be9fc1d48945a669e8c2659acb0a276503402f11cb6eb4b1992b32c2fd0538e68539fcac308cdbabc1a4bfd862158dde0518dbf2e32881d163795ef18b9eeef32aea3f07deded25a707913af8a19d1b7183d9672d8c02aab4b9962a7c34cc1f4af3445ab8a541a1942a0bdd36f8e8cb4ed6a26585085457a373b9c0e0858a48d9d93c324ce7d85ce87caf295bb6de3b47b14534f4e133a99ea3b69449a73d4e1622edccb24bc4c10aed4bca2bcc5e76275456a6f51f7d31b3a705b29595ec027fe0e57d935fec3af748deff1283d0deef895b9467bb0e1fe95ffc63bba4aa7e1399cf2dff80eaf926bfc475ed91ad68361930efa0dbd57b9fc8468efdcddef5ee9d16959b12158b959482fcddeb6c62533c96a776ba527f8901c07b76fd7a076f3c5e9622f1d4773926f5a0655665c9c4b28a5316ad78813af5b6f653341bad923d799d97aafe1cac180e132d9983fdb507191b0be66e6c72ad9e5d038d0278f8336ea1aa2deebea1affe067e235fccc999f1d3ad38e755e641d710a234d5c9c9dd477cb774e2f12b5b046ab78dc6f4bdd3686c39e4ca54f00bb2c133471d349ef7f65a3a7d084eef38fa79b57826803545b577ab1d5cd4313876e859b300deec7a48968c638da5494631c6f3edab80e9811657c874c8c32b6c366d1ac318fc366a3e440bbcb0c329406e9ebdc85f8611f66cca339862366511ecf41b3a8c7edc06414e371643eba311d01266ff4b11df83a3d44180877d9a0296c11f13869f13b07033f18fc647ed4e31c35138d318e9b8be23887cd4719a70326a28cdfb136fba28de110d3e9234e40784b263ed0c3b774b8a50be1484ce503537adfdbd64c705789447d5f3690158475a4f7ee87e2d802750ab8283581551b00ab86cc90abc20d1da340ca9957de6922fd9424efc9c6d5111b05ed59b69d678687b5e4de6d2d05dcd80bbfc1d5c48daa4affab797e5ab40df4804b1ca463ae9dfc63313c241c7dbc8d854a4eca23e01f47d127e7f7b65296a5416fda9885ce48d114f27ad026efb91f2c966c01f28737386b2f46b6cd9b5aea7454df5e5667119751ddea298583388f0dacad8b5acb5617864767bd9a7b2839dabdedf1fcbf571c5d93cca58823df18503499f90abea8a41d1be00cdd5060aaec07e5aff3b29b8753a1d5161b363b0878fb23a96b1f5ab3e12200cd09258de88faafefa07a1dc8da5274bd7de4110f7c30a51d2fb2c3809d791f9e2102ed408fb15689fb4997ff7088ae7ebc84215447c809b06f4ffb6c2f2cfc8c2f5552233e41bff26961d79b5c198b8fcd8497df459caaba1718ba04d8ff91aafa0d2aa989250b5e06946f6a31d7928241e5ecc089371372bdf7b02e7f32a58fa5486f0200000ad839c6ff834e5142b18cc22838d314c43b87b6de9a1e5e40ba1095793251e511e481905420ceae168631e63ec373bcdb77eb32101c0b00a83bafe57b28847ae0fb0db1ecd66b697b00d1ca9352d40dce5be33679f86ba977219b2eda62119463e564acd16cf14624fe3f2bd26974d84a5187d1d4fc8d06f08f8e27f48beae5388b2a7020e7b6556fef95e051b5933b149a0d546b3201c7681323be81316578f740261bd117978f35945f2e6f25aa8281531027ec8055b08f228dc6c5b38011393f3985e8cf0bd07ed155f22861301e8a7cd67e92cced9a8b08027b5edb3a63b456b1ccf116bbb2ab9206a96f62715c99ef28c867972f0e2cd1a01ea87dac4f69b95a4e6a2b57c027b0c9416fc6d7e2a4e584688aacee56781572438cbb441345628dc6e99b860fcb559f76409ca6bbc82968e67684db412b4341950b2a8e6f6b59501be182e72508635d73b2e28272e5a1f152b798383e11e4934de179933304c2f2d3b2659d001db58795039545785560496bbd01935842435ae57d9b971699d765a0484aec18a05c0f27ba9893a0c14c1d7f310cee030a118d0419d6ba9635739532d071febe662c2b50acb63b832c73a6e1506f12175fdbda28a96bd24e048732a9425b2123213382dfb501a9467e90689b6a2f70c82a9b85af1665df16e093c42ff51780c7ff757b017e7be0cf9973a806058bd09906a7ffba130816755a42f0fdd48150de93b36ca4041c04e54d65894183b52a9534aa4848e5e0614632f713c5f883a7ccb79657fd999297b1d42a38d179c123274dfcc9d13bbcc26db9831ededeaeb0c97c1bc09547945cb4146e5f9d60d6b983dfc8a7a9ad9c6debcdaead240f212f1984b53aaba6a7c6c1624b0d61f416ee44c0bc1e5db488ef60b4f53b900bcda9c82ce66d14891b676e43539f3a95ad70442fb1cff014d3c053c1667bb4008893c1043ffea4b03c3a4ebdcb1ae7f75b397b8bf867aac36c7cae813290a1e173f8a3bf7ffe3fc69f32bd1f1e0efc25a7bad9601a2c5ce53a457c2f79d3534c04d46cf4cd16bbc2b95d7368f5a7c11b6fbcf597a7f6e95055fd015d2a2a1c68e25e4a060795d9d2b3b993b28ee56b8be2188d78a2ac9dd8d54f4dc247a206fcddc6910bedbbd8665ea8d069516b0dfaa32e7ccaa0a0c17add8fedb38c31e5574715a2f3e5cd2832d355f7dae50d0a6fe9814f78248880b009502a99616a1c8c475a65d2b0f6ad1a0d3684fe5e0c5fb6441a5dda5c9b6346b44ed25b03de58c507f3956fb02ac241155413b78d0d3c0f54137643909510739be38a962f926084b0b01522aa35781a83e84f70f89677f2a26653a05c00575b437a875cf311d5514b00831e52ca8b7a7e598505f631f34c333338edecfebe6f041b98f69675900d45619e0269b59af076d2a3485ba4d461817d6f5c716868e49cc51e661222913bbcd2713f7763b5bcb35d7713bdc2646db90ab285cb49d58e5aeed345a6d8d59740439f44e12000be562fb0c51ea16103864b0a179417b7f7949ec7463f5640d5f4d5a46f81ae314a49b6bca2c31a354c42a3e1ec1eb8f1cc149064196c97426826f3047122386c8ebaaf8b2abbb9b236778e818dcb6d79cf5b3bd158e1e80ac7369c2acde02121e66d889bb7be48cd678ae8a74ecb95dcde35c1d79b8e9ccb35432b2ad91f07045573467ad7f6bd0936b64fca298f3e91b703e5074a8a992de7836cc6c9235a40107482430ad9c30719c7183867657827090ef041e2290862dabdd63d44248c50906dd67e1bd2bb2d5e25002ba742e268f4a900e0314357c40cb8913b571381fc5b3df696328c142a131ab8fa45a94a2e06a93bfb62a1c31714dee7f2c30031f1c889ad167f9aa77eacfb7303b641c1e57a1b65c02082c4a41ebbb02fb1b240d33cf4ecf9330ccb8609023314d789ac024100b06a85f524e074c7af2f84c1f6644a613ac59192b111fdd3ab27e6d468222ebb88ead33754e9dd5e975acebc83501d4790510c5ef5ecbc5c01dd8b081f87cd3730146bf76f8f94e478e2adc22ef43e823213a6cd307b97ca8f27336ec688c09898f59855d9d53167d7118ea7c356d6029f395455f767ed343c61f94a6751815244a56e945ca08a5d606478d8a00b81aa6d8c01226057b19ecd7e0381b2bb80b57855f16fe79bb445f0a5ec050662b53e1522b30cc8a75253683a8b40251212240641f46b50d8d2a2e7000be64e3df4a5cece9df2c6f5ed1b40f9741e9bf0763af845c6ea142b26f64d8ea85e596c55eab7d66cab97be7dc3cbb9044ecef97191a11df0f2ca08995148745ca9c4385b8e2dbca9bde60119695daccdc1246f7ffd5aaf27a24c2be76b791b52584e1934470149f30010f09fe0e00f453d288ef327b26c0a7e5f1c857efb4d94d776ebad3987702f822e07398285ffb5b781eef65b84f86675a0e42849e41dc86999d9925d2c5cda8d1eda336981159b1b8b8a179da2ece6a9f1290f50b49cb1173c955f33d11e91d0e3e28943b1f0f42cbd0a592abe87773e72133df574f8619a1c89cb34c779061c2b6d396951063a58faeaf4a0ddd84a8ef1e978953dddae162470416cd81456431b6131d1f41d866438bb57143570ce9d9d83f1a1d729fb8e56549f97a99eadfce35ee8c17d2d3419383a9119c8326a8e204dc65d642db2842ffd02244b8b651cf1ef7c042fe1416213ede84a7d3fd58a34257993e65fb05058238c16edd69530a56721f77f3385c749645f91037c1d51ea4cbd0c27da745e815f760621c79649dcdc05437ab246bc12ff154389144bd8707ade87311ed09bbbc98955fcfad7cd0c43e20062024b9416e6f0acb64c7f670616056da7181d022198e4841bd8a07c8f1b13fe5e9b3089902f3873d5e10b410d4efe537cc701fbca11cf5a42d552862bbb01d4cb4ff8a473efc4f37f20348616f062f427ea5e44ca8f813652e178efe9c73014bdebb7a8b22c2a1af23cf21a252d170673f7cb2a2037c509eae537495cec997b8c7edd2d16956a2210fa6c7e9eacfd3ac9f70ffc8c282c0d2c645705bcea406be3072d4e8a7752f1d74e141ee3ab1d41333ef42d2f7c1625d1dd6041dee00d1b7aea1224820e3b32325f33028ccac4b2ee4e91a8dcd78c8763ef2de4d7731917c87272cd6e2868e0bc4c90d8fc3dd01d8143f2caa5438fa8242eff2054a7cb51648065ead0bb497add9b95885c15c4d1ecdd954957c85e861cba57e7dfdd914f1f03c507c39344f0215618a639dc9b663e7e638c5366fceef2bddf74278eeb92ba3c30eecc8afa3d8ee09cb4bc4c4968fafb5654e342be5b0e62f69bab429513efe5413fe7681cb32827767490d6e1bb4946aca02eda3b0efbbc2aa62020b877e322065295ee049574d59b71f01b0e4d8e4ff1c58b8ef4ecaf3a137d5c2aeaac69079bff7181be9d4a3b10aa9e9e5c245092e995296b0770f08b8f08a52f949ed155e8f3b876f5e8457e1de9614c2a066df1fa1ef96f2dd49730394081a97d128ab493469c6c6cd68f95df87944341cd1e17046509f2eb90d3761085314a873d64498b8dc3c3eba1fa51b6ad62b1c6315ce93f0d2f9c1d8f6160bbc6801066ed765a7045f4a33ae9a04ae223c9778396d85d39aa8fc8f3b6c51a84a1173a8c5abeb7a376862b07b54083d38c12097276a0ba738ab799b4076e553b0490cf160b291abe0af05ce83150c00a49c66662956110b6a575e14e51ee5952ecacbca28ef5acf2445e1ae49191e99b17c9639b26abeb59be0b9cc1d79fe50bd657dfa19807bd6ffa6e98e199ff7a6e23feda38ba925388da01aedd6000de4b65ea5db78ad7e3b27fa438baedbd98c7ccc1863aa30369a4c9f14b736d474e9f80a6c45d3e88b85abb0eaa0bceb94760f6fa04a6b064644cf855e6577862529673829b93032b55c5c65e25977f71f11d3f87655398266a44134e89f486061d4e6b408e15a97bab1c77209d0323f04d9c9d711ba1d28008d7804f88ef081cc5c5841292bc88ddf8a6d897de82a55f938b898e4a515b42f7970f13ff260b8e539a54ecfa624ea4a8c2ec1534ec00cfbd09c723c60ab8de78e3f2d0e39317957190f8de478e0b6d2a739bee858f6f55d65300ce598db0f2b541114ff57c6bb4a61d4007d7bac70f678900b2ef119535c1592b810df74551fe4aa2e22b302ca22d3b5c7c64d17fb97a317faa0ab0e3587582cc04aa945e7a3a906a9243ab844fe42ffb889d037c34e5f497a385d6e4461b9afaae8bf03625d946b4e8aa4f1c1736b5cd6de193aa37a06ae7e4f5c934186d6bcd21895c6bd114294a04c6bf2d0b64b52f237c668171c86b859cdc1207f557231b2e8f24c3710b2e2ca28253c1e8643532fe22b5a64ac7671d4384b199835371df124603c321bb9a00ad91e2655a627c5ba5fd48a7f87b7b1eee12865829ee8d0cfcb94932cb5cbc4d820242f05034aa281295ae89aa6174c96c4869bc8391001f4e9028a212ca2fd440d2574283f81a06cda854a3fd6a45863fabb0e70a4e8f63828c38ad9b8391e11c1ad01ea23819041664b882e1f51e8dcf8a4afeaf531dae637ab75356e4ceaa6c705292331f106ebd5b853c966640283025b39ce808ae5734d9d29b03e95195b82d591f7d515650ebb0e1f82b9a37bd681f5caf8bc50627ae17858bea5673caea7b7ff0213cb2203bef568916c4145fca543c8bbb4bff756573a99c92e6eed047862fcca742863e201aefd0b71e9d5ebdd50e590cacc536246d78c0dd10aa343682cd0bf630f3a1f52b861fe5243fde480513a625ff32478c1f34864c019f44134aec444af7aa6dabcf0a3a41b008f34c2ca79c383309258b8603892617381581a39dc012f028f83b0fd003bdec556b302924ee6ce0e0c4912a56da6d3151d270331e81a19de5fd1fd241383afa15c8b6ccfd3a979bc21021ad84d44aaa5e43d345e8bd8c51fd861a8b8cfb955cd8019eff9ecd5cbde8d28f2432054903e8a2dc7d3a20062e60bd31c6ce93da7dac27c1d4e8235d6dd2a650937b43d312b0a064b87d4e5809f4a6a235575890e0b8530908a0fbd9616a3ce558a20c3fa9bdc3ac38784b95a8377b7fcc0b1501d5715f08834af2f4177aef75a8a7a6e9d4e999475f9ed3e18fc345f4b43d0d923da3359dee309687d59eab6faafa54ccf82dc6e575789cd6e035baadb1b42f55fdf60ec426d574a6b9691310f096ce92c87d966323807033c1ccbd677a9d491009243c988281a73ba548c9609d22c65424c45435bff0d989f540841916cda246460d202380a1919436e0da079604bf3a67c82e982ae8668387d94ade5d82c440f864644ee3f06b6946999f1f830a85f4b0d8d456e8e8519483dca40d458daf467afa592b9854ecaa52c0db85ceb342894d29827665033a127c96e1070b6d56b69a6e222f2fcc36bdcfe5f7a2d0d026e21fca342efa2596b412a4818ee16bd0a67c250bbcdc485a9d7d249352b2fdb8c4307c090bda4a12bfd58d10793ae9089907a2db5bafe542c5a238b5e4b8b57284b557d3b46e61e6122c3d8f9d72ce56a50522cfb72eb31298e8be94cdd9f1c6811b102582438f2fda8adc7627a887a2d95b63046462401a9b3472b0b33839eda0a8e20596741a71ebe0e1ac1fac2d5ad60cc709d39ae031341043210860932362768b05bb263280cc7b5b4bc350f5d690f8ac2b2bad43431c9f4985f83ebaf95aea38e042628a9e23bc56b69919b90b36a192dcc5cc4b72cf26f44591a734507afb999696c1611801988be336e15ca8c277bc89ced923ef844e874c34491e1156c62774bcab6c6cf1be9e2098cfe13381776fa438647c44aa70452d48b8289d7d2d29f0c210834eb5ab92fadd2decb575ab9416e6cc825a58b326a24d987d1336e7a63ab561f7d391af95b458348f078d23c6f75994f02afa592bcc21639bbd6d7502caabb62e81181df05e8c76b8c406ea9e56aed7758428b9071d52499569c702970c4b6bfdc1ade2d2d351848f93a06b0171ef263f844249f26df0129d24623589473ec006bfb02122e1d20b7d848d31cfb89bf8d4d7f507fb7b4990f90847d65e9146fc273e0b6cd9781d02d358aa9c0a1a81dce9216f25a7ba582b390079332d1a619c510734b998d3b915fe6625e83b5b6e35ba61d07ad6d496de92b75ffb8d96f10ab7766e596cefd76fbe0b7a52f785dfc39ae097c2cdc36863752e596facc62c38c3b7652bbd9109afbec6294cd17bad27e30df7dd9087d08bd2809766a9781c985431144c3beaae0ecfd899558d04964284eebed33696705aa8713545453ca70875937f29c986dfa2be368165060ddfc17f6462ddda3bcf877f1b72f5a899642f7fbe1cf5ebb61be39852e2d5b0763e68193ee211db7b0923c695736c1bd76c765062d5b7471dfe1cfba40a3244a223a98e721812c5d63c6c4f0b51b3dec2ce286f972517267338c1f008916936fb9a114beafc4a764ce4187f19b741573feabab72defcf8bd89e0546fe8f244be76b9f14bd67ab6e80277edae8e471d49f2b51b5a91703efca7f59c4d1ad71661a98e0f68e9e91640f5b5eb0d4f70fc2763e9c14ff13bed361059f9f0b9555d859066488a53a6bedaf832abbd80844ec85ac546dcab7edb7c56ad7cccba354f43c581be29edab0d5985a1bc578bc0237d821845945c63d39ce3dc69a52e280b13b213bc5651607a7cb12f7a32b53c56a5bd8eb00729893b2355982193e611345e6c8fc79dd804e4501fd62629099ed8416b5d4145aea1a6cae02c4c7bf10dbb1a26c7fe3535b94dd3eaef880e85710d0ad18977298844710ad23a1349dc3a2d3dc8713bc065f2a7e6e8652e8e172d7bc05342f6ec5e7cd90e459325f38878db787b5b60097be028983bae5b668db448b5071198cb42617b1e2118160eaeedea2378bbe6c1664a672b4ffdfedfd992a5bdc39be69242157af1598fbe35ebc74bdef2cf3d749c636240cb641500480af28496052ff4b1172f86897ef25f580c86a3fa9a581fb5219ae640464c30e7e32a65eb0b266c723c2289c3afddca4630119761b941e5f4a7ab28e26b21a95843e010c251556bb7fff0f0258de703b56d12d3356b1ef4993fa709ab86edec48b9bcc5d4d057054c2327e6bc03514929e582116002356069ac3ec2baa620b38d60ab49f6dccfb04a94e8174d481cdaff0d5b900c199462d9dba5468567f23907f7b7d90980e659616c3e7110aa2e13ccb9224080bac0cda9ec6dd1a630cff397451e5cf17748f2ea16d8e93e4cf839bf015b5d504f3b57e3785e0fb1bbf026951511a0c6d373d14dc022c36f3fdb96c8bce069210b12ef3572392e6f305872830f4fce3c06f1d8e2de288f12ac85477616158c4e7d8cc875f7d99674de1ae1c6883e28207431b9577824cad219d27866e8ee06aada1114bd4ad599ec811730a494370c2f18187e4a1fb0a684a59aa2ae7e871333a6ff64f5db8142116dad6e9d7b0be7e761b6054d6938424bd110befee6743909b9d301a14e4982b2d299ac459679a77569f5c64c0f5f23e935398907b966c34589248cc1c4b68db744ca0c683da1b585fc8648507abc7e07e790a70f0f54d986f0c89dbdbd74d4dbeb9260ef7b9e649f26d51fa8343f0af2c2d79a57e2f18327a7ea02438ec04ddf3de23ec7b76393097aeeded9bde3c468cb1a74ba848e97514248481eb2d3a89136847abdb47246787202ce89bb36360167353b42bda449debd3e2a02d10d61a7f55f56898e2641567cf5581efe94fee0bbaff7332ea39a81cdcd4210159fc55d57f8daaae082bb3ca6a7c2bb7c2fc561a0bc08905371c10fc0a430ad3f3f2497a29ef9f4d7f1e835ad9ff31650019241f29b9cb7fe905654833828a12863554c6c2cefe931dd02ab84984572a08e010af963f6c2dd5c4d49603cda4036b3fb1d40d6291183a5991e61285b93ffc18c5cc18e83abeb7c3d12cb103ee50c4b22b23ae0c833ffb2a3d3ce0764163db187164575d4c90a675ad1d31b2e6e2643e87179bedd927a74171c32be03fb437338bd801048e9da72f5af318b52279e94928413f97ddaced1089825cc552de32e34409ae5fba6020d1e88769596febdb1aec2a686e7553ac1aa42d22e6f3c6c7e7618424fd0f4353ab9191d878a274c2763d6d121870ca81bb64cd877ce656fa778b6a0044dce5c9a507a19d217ed706d99e25f51ca25260c659942f01c0d2866adfa9e99b275a70229204292c62dd532b483b644d0dd8c5f1804246cdcbe99980870f97afaa32815b7b0a4fbb0948a048d59f35fdf2a3db0e97cf1ba3c5ad23ea4c8418521bb9da5c3a612c4544e6cd2c47373df9e5b10dcc44987fdc8709c25e789132af86f8ff93935569088e364e582c7e175f18091591c2ef1557984358e9ed6560523b3c424c42c313b2968116bdc9f82c181dd0eeaa4c0199bc74b4bbabfa9dcdf01b8340b9d023926e64dd68569611732a5155561cd73223debbbae11855846c48855fde0d0863224c71c9f4e18694371d485523233a717b3957ac2d52bd11b2823f026b023c7893628cb716b0fc4f20d11adf14c8c1aab80c9c066731ffb8e22a61da26d105e4bc1a73add08d7233e7812d94632946939a321510b1cd19ba45b570df10f41dfc0f0904211fed88f1bb08514a2c4a1b57821f78307e08262753c74bccf67e934c076e593fd001600931aef5127cb60beb42bcbef9e36035ac2553691e54e44c7668427c996a4d68a2296440825dd052ae9214579c6906c774b86bad5d3eda908ac4443080f013ed0efebe7d0f20f54681b6e52153cc7692b28db82fb38d4e8b168b90aa10274668274a3e4c9cf59a91f20f891111ada7c318bbfa86feeb7ffaa5db2b0dbfd328c3d453f92a63715ce6a03dc0a2c6e4fa366e1428298a75b0046b35117d6a73d59b95b1e9a6463eabe9150388ad4f16511ee80846461ae56d58a1dd9ba333cd7e5204c7637bc02eb81d86e5292af50472b13cd10e0bcc3b87ee3cf9f8f2884d9ca98603dde60c278573507462a23a862aa26ac798f6d9e27d84026ad1ac73196fdbe0a66a3a48ea2c23b40b306053da06b438a795b2e22b13d111ea2b0a75e17f9d8994e62d3358f1adf9317da0a9a2830d85aaa52fa737b771b77c95efe3cc827d0c9711e3f3bff9bc584fcffcc5e5a14fe58a8b6a27fbe07911bfe23d8875fceacd768ae3ae8cfcef0c9a6427dc0c1bacc2810dfe2d954b45f4cf070cb38d301e0cfa917edcf96c33e8af1aa9e60261a5f5513fcb51cd73a7290557daeacb93129a83ea1c1c176b49c2dcce70dc28bd6eab1b06ef86b5cdd7d21a9105dbe59aefcbd505fbfb9a64c38ad75cbee79fb302ef4af528168d8a056d1c8e55294bf376af7781f1111f7db507ac3a284e0aaa2639e54e3e2bd9a28f4b680ef4ce101a7bf4d876fd6a3b4ff5f047ce7f2c40b7d7714d75c62de0ecc84f21b1deaf8795cb6963b34738c8007887a4ce1828e920bb6b28b885083261f6cf38901fa3514d4294a8de561fb88b21605a1ae047f046504fa5c9f4956a98e9e4179399dea9170b3b7a6c9ae6faa0eb4f998a7dc4c4386a06213141f5b6252be7f0e401b0563039a79c3d6d42bf6cbd334366771665bcf28e6abc051c873243d283d900eb3da8d243d0d285cc220af3eabc465e415b295542745fdcd42b7113cb4c936e2359061ca2e813815d33a04502792ab953e0962daeb32cc3ee6814498aff7b5af7686ff4f3b1a3bc1386daa1b05408597f22a2c0a59c0da0b20cf1456ba32eb7fd850bb64429b8671c19dfdce0b159b0950474e02685eac871d52d60e33d25a7d2cb369587c1b8d147bec2c2b7d6d0e71b45037be9d392df196ccf839e021b3abcdba538efac37574ac56376da4629b5196d44b840e7557bf764b94546cd523fbc0544af4759a7561d8fa651db72c3bd16c59028ca0a5b51b213c696c97eb692e977438259f5cef678e104a09d48cb0a9512e8fe70d26130aa278ffff1906f240b241d6703ad69506441c964d3d63e490fae1aaf418246b5d6764b17e262c563be67588fa57d9f22903056cc6a865af857d228781238b5732647af0635ed133121f710d8b1e1616f1fea05b5ff0112844c18472c262381e6d3661396797ea3f225451fb43f73f76755044bd0180ec40424795c22551bb25b4728b4fc5b176cc20cf341579e4f3153f4cffee1ea18875d76234fa77ee231b20ca8eb8c36bcca8993c5384c72c9ae54f3f83e9d30e3059d8d0f2da08f454217337caec8fa1c0af17b1b3c47e47bd2986b4880332fd4fae05918cca01e12020cac814a069f98fe2e14da14ddfea6be27a282d2bc60671439a12306fd9945fc5a1c31ae4c66049c883bec70a059a42442349cdb4bb406a32d5ec0fe7cbd1d82d8652a85017cee5b0c844dd572bff36eb9b07b04210660524e1ecd90f3d082c8eed4eea446a43ece7e9d024b602f02b689f5a72874ea86f08be1e4a1c85bd662e606559fd059a67942757672b019e518a9157a564b2e9022c68f165229778159249888aa85492e0c651613ca1f4fd4d4e2ec6f48e61e49d8699a21e3aff671e09259785f1689638abe20360f73eb44b4d18831c3298081dee1fcfd80d7309257125dc9c9871bff5c7959ce2d6375346f772429e61f7a7dd7ed8f6f9bf322a9f5e7ab3f67320fcf775429a75af88eb6fdefc3a0e086964d250f770c6505361cc145828dc8e0fc5fec74b8f0859c4b239aafb87e0cef567b8600d7ae36d3ae2f74821f53dfbae5b077120a0af8f74231ef7ef79818a4264297fe8aa8e4fa1822189f2654cd5909041120c3f0b515f6c59cfb856acbdca8e6421c1446c682258d7dd6c70569d82012d604149ca163afbd0582544f3368f25ce6717d3e98a22ef6a52911b64e4c4e65191393914a2bc77c6c2e88e880cf1cd1ceecf5df5d12cfe872aa65fcd8b45d67f33bcf53aea9ff11ed70a6c47fc892bd1fdf370a25ab1666cad6a18d694cc60dd823cb9b37fcc3aaa01301e8f40617e7ab5905b6d0b346442701d64dc254036a1d675768915d0bdbf9a316e89bc063124ba500148623c7f1dc1e7fa31a024444518f2453ec60d3e3718697336de7eef26bdbcd3d18b1dc0d92bd5c72e5e26a790f2641756b7f3ef7c43c3d3eb50475e436ae586e0f0c17e01c349d2e84bbfbcce17fa253f7a3d9f13f87231e3377760473f72ad62a109a4c05a6965950b1857fc1f1c83ab5682ca5d166baf8cf817fcee050ef138974d803462b2f21406df191d06ef7bc3749947f9d3a01bead17444ec79db2951132f0c5cae574d1bf7562fc0ff91fc9f46552714fa8b8530f9d51d03025e9a9112819c65a12992cbf74f5a116684011bd57ce249e6250f13399fcd415d054f65d2346431a0ae7eaf29f91f70ad98e174f77c370d082635ead62ab7188257e43100a73f3761e3fd42a6db23dde509ea58c1cc45014da470da2d0cfd42642ac4cea32e09582e7476589d3c9b1f05ae45b34226b20247ca36c1b3684e1f960d5598fef29cd1e446bbd29e8693313be27f27c7dc851e607ccfe2a83523e2640fc462e8718c46be61a3a0f8eac4d1cf3cac9f1b7d42b20b9dcd69114c16ea75c59e849afdb5f8ac1454e8984b352077f834538ebdd607bad33243dc43627fd56e4b95fef9b0db5012507c70d4cd05c4b0644a4a2989f36c2786bf2e7138ef1d9f4acfd8cd64a5f7c07e0bbba1e3cd2d432db1a7919948e58ac4d02d7f973cb3a1da68bdf339c2822baa3b5542f29b281ef37297f4db23b96bd7f6ca253a28f15af26e302384bfca4039fa89ca0362ea5ab4ed1a082d239a53bca1aa00f8bbc846e07ad0b2223ea04bd492606daa0e0240ac4a45d694f4cff2b98c29b6d5777d49b35f7d8b4248d7533573d2f856077ed7e2af460d0d3f46655d94a4bc8c6e102ff253909429e607c4946d46bf7b2eb1ef718a245b32941e8e94ebaf2d86412c561549ced05ad1a67b47f8799f211515805580d41a384494165e480f052d128f186b930d5c0697d7ac9be852df6098e1fe40d54a8e06b71681d5dd886ed7821f873e609aa2c8d6dc5fee11deac1da18ddefce5d5984d1860fa799985e07a01b7d5d3632c24009863d405ef8b19de4e9214126714f04073f0dab82a5e32d9c084187d16e93db35a6c577e6f1ca96199fa4f209b2dd548e1e7412d2146920937f044ec4e07567aa7f170d3d22382ff2cb0c841bebdf565491e5c3e4421ab5ffd9640d927d10bb14b2a31f8a827f5e29a6a8dbc11381fe26e2651974cd0df383d80b19cb1e922e75cf65dd973476902e6843d9a6766f74ea1f4d0ff67a0a2348c8e10c9f6037d12a087eece0583e9ba7d97d7ec421c97211133364fad0348a38e85054c3ac017f01f4bc7093db2a8828605096473f38d6736e1cf69f781022950f103021495c8e950a97ca7da8bcc93194914006145135a7fbbe28cb2b1c6a0fd5da15899d43113c7d6c641caac053627418fba7954222cfa59f6e87d5edc9b4919c4136c99b8b2c432ccba2a3bf5d626bbbed4d532921763e69659a7171cf8fae2cb30a86458c3eb4fe7651695404e1044dcd55413712cfe80b9d97ab622d5965abee04fa85f99e1ae92af0746ff7b86e2167fafbf18deaadfbc82c41a4211d36c6d079c998b754858cd0d94cdbae933fcae35b5532c2766a5fc14123c0e23cd344c5a28c5f74d683e429cbfe146fca72473a4388da00f95a8a98f74eb5c090f0b6f3b1a4ba2df4f8b8c2c17539957a12bb6be19f80813814b6508515a10a6a00ba0f23644520630541ceeec537f0c2bb2669c598a0f8008cc6aecbcba4d89306cb2a6885e62c75c4d7361f1957ab56c9e8eb042b608b15de00b86a0bfd73050acf7d2e8d23a3be037aee778f5e2ae2a892df36fcd5a41251ef71667ecd336424b48d06fb8f00fa88966c72610813fd84b9c03fff437893241295f87cda2e2803cbd215b29fd23bcd54e3ff86b6a012a5998524bcf9673fabd7a5aae3df6ed660978fca7543b86e35570a1211b938722d17f31f161e344f7be2b522f6c6620ff61e111323fe61d13dee240329e9f7b7576ed01a560086d416ec6f5cc404ce3768d021a1458370405d6d7ff70c13c3d60ba41f21a17de241905acd18b5d28e63fadd37509c18b8361e0fc971be6ed51ee4de2a6adb2a2afacaa43e32933443c6928a24f76eac7fa547232c6828ad01ca8e80e4dfc675085d223c48a0ba7199ff69bdec89f5ad0e734fa032d2b8a4dc63ae16a07add9acf81beda718f5de5487aa84ccde4e300809a0d1f502179566e114c13fdec26cd4eed858387b87b4ad1901382d15db4d30314effa6c63459c8d016314ba4c9ffcdd26cb806415e5efefd32463e7c4d56d0acbe6170f72789e5acbedb8f6d4561fde20f7bb5120225eb4b2ac98d1ba22e7a90dad3d3d012b4daa3699a55bda8db8fddf45e7d4a584bbc111713090f8e830636c6e6007df4c9828cadd93ca2848c9240ae6709518c48bd65148e0e21c654bf6d6751cf23241306ba2283aae3099e9415991affdabf67b1e4bd88495dec3cbc3eb13fd6f2e242ecc56f4e62048bec880174b23040e8e7b52141424f8cb88d5d1f91890c61dbfc4f8d69d9208fbe662b36b0db2dda30a232f2e805c2fd1feba65183998d5b69910e7db7885b7c9de13b9f91f4e3a33b8be723a2d58e18cdc11a54ee506fd83a6c76e1f497e743972d0d78c466c909ee15decb55e24dd4f9d6ca77830885ef1535f79e58d1cfc4e5440338e1fb18c03cdbc24718aee180b2290b545a5b7cedd025f79b955738833f12a7a4a9b7dbbf0996fcb51a0072002eab143f4ba79d44c797c4284ad984e5da2828c9747a94b8d9fc8ee3e5f07f4fc5293bd3d97d39bdc4d71f1708897a389887d5f4f8cc966c60110f3be08b06774fc82b8369bfc9ed7d9a4c20fa5a76290480608137554c86f431f5d4c710df1ee11786d1548451a1d97af93370f81c654be5a84b7c1e085404c91069f03068cd4df29920becf0654c8be5f06ce91337a2b03bf730032d78d6d11c00f93824d5f44de8e2eac15a5ebe40dce76903bb7913071d7ee514f80787e23aa4813d738a1b724079502a8f57339b86febc1ebb29565783951a3f898268e0e1fc098338b924b1ae91dd58cdb9dd24140a0494132a3e0518037ad2631542809e9141cc151dc7e9989c8320d0bccaa07c71990eee5294a0a58d2deef7fc68b66f3876c969c80c55cc86675f96576ad7377abb704a786dc3cfb409db9198001e8b2dc1395a7188d39ab6e5693af8f656f77ef9334ecee14bbf98be763007444de1aa26218b5af1350f23c70f5ab44bfabeef23518cff471684800eef57b22209a094032a073f8a7892275ff77ee27416b325b34dec52a61df73b8b954eda104e4a09d85b08adbde6a01e51375f952c66edc13cffce7991a35469eb33e15edbb5e273d9fca93e3c7d859f7b5c58c18339e14b66d949d257a98f44b6e97b124f5b035864232c8a5c48731f9d73fc45de54e6be314ce1f0d98212816d7bcfa81a6838960f0e3de3fcf7563149dee9a0f335f005e2cd9fd7a6368b80820ce0c09bfa28d25173fbfd8de8224902001022b1c096c67f1e2d807a5a59ed21918470514436ceea27d25bb17f600122e8d7a8628881becc21a9e341db577886a71d17e25727141d4caf76f7d65726d131b2b70d5a765a2a407da2ffb1224b80209d7be72ea4e86636996e712dcd912251710a08cb2a54acdcbe5c45c3146c89eae0462464bc683bb77bb339d89af791ec91680700248df16ffc054722649abff22667f510b3498b73517a251e358bec101146dbe419891f6aea7c261e17d4830d4056b8f7fc4bcd9e2d1cc91d3f1e664ed4ffd613409bf85f39b2e483755f0b0cc922a8656bdc82e374ba54717479f3be3e88f79419d05332ed69910ee2d94daa2dffd3648bbf5793992884db861b7d9835508bd53018957d72c30666e817276315f45c354a8741f6206020cf723f374e9d4ef430ade860f7a5f5ad8f0fb9ce1f0b37253fa6bbb1ca80429346624c6181e14ef307457c6ee03982aaf180b6fb02628c2a70f0e7f124093b346cf84afd7b7d15ad44754493c7ee1fd60f5968051bbb89225b7b6a173955dc1d15f601ccdc87e55bff853a9961cacf9d9889842000aec8ce84b89e901912b38e217b56064341c0d375e49d00495049389581dfbda17020f4403abec0cceb74f960faa1030bcb86653dbd154838384120e4cb211a315ca1da642678a328c351fe0cc6a3b8df7b70871ae2c090f72da838fc4e29daa5e2adad4eee1fafd3eed26782dec9fbc1c01360ca751f7da202e41204858f4f928c55e34bca9a9ff1b408063fbd7044e34ef1491dc0fad3442c7799f0441951bb9d1e79eedcdfe65c1d93829979fb00a2cbc2b9f227f601764a231b8497b79e62285203a2f06b03cfb113ae089ee2eecc2dca0749f705f259e3c9801c03ad5255ab772994a34db5b464b7feb53540abb52ae2abc7fabfa90af04e924b1eac17a6c6e996d6315ec8ebba72a96abaeffc0bf5f1c892f058e1b412e2ecc20c9dfb7cc439099f98f6514e4f4a0d4f4d3720e8e5c7583af8b92da7d4c28800415297d73a5baae81cef339297c4c482b0471e8a7ee74cc10efec988b1b7783b7cb7167eca1dc6f27173e516cbcfc1d4433e7471f00d2bf236e497d28ecfe87ddee8129ebebff21e94d20d9fc29607f1de89f9df991de8aac71b7c872a45fda9c9407117ee36fe119687d862ba9b1d5cd552073247e367b21658ef3ead6dd60b3de67334edbec630815ed6ced8ff2ad3afd2f646a235e470b828ce7276c7f044f6bc9a6b84582232c701907f9cfc2ad37066c5e3ea64ca61671e20fab290a930c08aa0c5acb4061acdb2944d379b1ff41235185708001a4d050ea34d711362548e0881b2e50c7a423e71c09267cbbfde84c5b38319e17b6237ac14f175557bd5c7ffa71e5a7aceaed77700cce76242bab5c676a6bb759ed6c2c217fccdf01168e92b448aa265d09e82ee39589f93e00388ad65712d1d8fda697429a753b99e244e0e64d97ebc010b0d65dfb9b85d5c0bad261d761143fb6633a66edd4bd4e72e16512dbf4195af84eadb689714ea480baae261218ac8f4791479be0f7bacd9aca58f654af31bda89d5e79a4645638deef0d46eb8d0f0d21445eb45b3d815beaef8be9a1b0f5114a6c7ceab2a735a7eed1f62a02456b5aaebfced217d515a55f980c218ecadf0771890e24618b627a91d9d75eae61f5bf3f487bd9a68d0119864d6fe7eefe449fd07394187340433baf4e262ce571ba5d1852e0491b330f8a907648192e31c09fda2dae4d1b24d63cf666c0774698a4b9aafd84fff2670f83dd1992669d6cc5443f993745981992e837d2c59fe661ef77b94f2025f8c2f449957123c343a567e8275304ebe58d36a0c69e7c9070d14c0edb5db66c2e8a549ff8db1a64d67d32d18c82b8ccbd3b7597deb4ea29589208ecaaad40c30f167aace242bc8356704d0d3b775a66ecd640ff0f94fd772fb7fd0beb742561a158e79f6586b329da65b2e6f8e2102e6b64f2d4d5a6605184b6be2b857ea6e45515d17344780f2ea291b471d4b8c05ae21533cf0699b1b030e3892e7596b370127ed65d1ebf80fe47fc3baaef240a61af0bd5131836d4de92007311dd6b0cb10d92e2b05c6c943fcae9792a3e70d58eab19a89e206086f13f808a963fd3f4ada42b0cc3d50066e66b9a1393f89741df8e30251811d7215044dc45c23f780aa6d0c4271463108150c3c69aad4a97618cbe9917e2e82e29d2f57703b902888240ea38a2ab6abcfceb1984c2c3625d1ea8283a7c194a17a71319a5cd7efb313665cac0baa5fc91aac3dd8906db85b5084c9bba32f91ae8921a929ed9eb0a5f3470e0242f70a5abdd26017ede3c92ce3870252a361206324aeb1603daf016464270e5a0c8b9f63b46725cbd9ce8b20bcf317924ecf098a7fbb47c765ac9d745c64ac719691f13b32c1e50b8493f0b24ea616017063289b4344001c61573ead0ba550a9f3310d8c5a2ab64a7fc41ef9f1d2f269c1ceb2f47302cad0d9939db26a11db7cd4ca17bea6c28ee1bfa0a2cd88e1ed868013268fcd697f818a5f5b361957df573f7a935fa82023ac9e30c2c5d218edc72b9863e89fa0a083c30e2846fce84d59ca5aeed217e7ae524b29c0eb6af3b07a81366c090f614e197e19f5f47237f056f84a596ac13d9e6e307c9b1954be0bfcc1a78c5a78de4da327023463d71707929592a3d35143dc849972fc9dd6017533939a40d740270a5321566e666cc20f3532a86a8200e8cbc4babbeceb300d2434f3c525cc41fa8d49d5064c0815a94e247a2b4cc28dbded8ea078e2ea85a44507228d2fe1a7fd862c173662ae4a3b5b1f9d05276d2abd118c9f3848b9193bf9cbbbc1997eed5ba98bd924990a4a56048246e057505cf84a3684f9bd661338ea81fec30d50be4ccf1b36f4ba3841d3285d691a8178652020dc3006a87a16c1088617c3d62f86a96920e045a78883c16538e7448b35abbdc17d147551c2bd4022f84e92149234976e610d5ae032ef3148384ff9196dd9ec7457b3b5cda904206ac3bc376842a52764c156d850405557d43ea0b1b5b3a1940610b82a9c05e2ee4daab7884d18b60617ed010742fc479c49ac338c729c19c86f0517e1e3c68d4faf08cbec1eec372b136de459b61a525901833899c14ccf27b5705303f6f49e79e94f740dde241973179f479cd351bb701a8cf044bc2f9bf57f468806555b38c9e55eefd437acc8b1cd9b2ecfd9ba2f46f77fa7378e218256ad2e9ad40f509430220ecc6ab6f675cd1c28fef0e8c99d5f63dfc291527724786d1cac26b68ba629e917a7cdb7398a754632fe540b07d1d490c233f4a20896faedcd07d0e69565cc281962f3e6b05486000cec5d4132e809b3e759b547e0a005557aeb09d5e87727d812a797aac86953d71ecacf29730dc3cb24f408c9bb6970f168cdd9e63c0969c80babcb1e808da469069c6a5e1ee015987f04abd7417df1633afc9d0df47f9e563783d0d4e69ff43f36613fee40eaa1f8b5649b756673c59707e316f51fd378694391a746a22c72c401ba6b2445bab824f00f69dc9de8e7b8ba115d80e8f4029d8d8c6a7ecc94daf5924761f0fc00921fd6dd492ec52d21e85205c2dfda72ed09acab46db2422a94711989b394dae81c2e604633e1028de65e01a12fdd6b5e2e4f2c1e58e22c0304c45b9a9490e12b43381a32a25b4f34cc87ceed2621fb45923420193481fbd050ac93eda9982fd0fcce1b332c88041fd41e88859f04520e6bc78b63120629a0e3a5f9ed1702587b00071480242e44a007e911d3056e271bcafd03cb94146bba9c5ded8b29711af054d402e023feff6bb498ca1324c01bc223e859a988b3e21f1d9ad1bd8a7b8b82593240f0464641a6a586b9d2d4c93a2f47752ace9e2ad5b0298e33c4bf96f208045c00e3e8b63b6ea41efe851070f99b65e375e9d0f4975f3bd4d22baf4f2e1f8bda2371964bf0cdb724cd7a8c4a1a5157c2e8254d72d92c7b6adb48d5ce64a6f21b335541930abb681f9529118196047276f3a876e1b9c2a50912d2f3ab3471ccc30762bf0c3f0c9cfb52a57878ddcf2494813ccbfb0fcfc1fef336feced1abf5a1acf791fd69948d8f9c2dfaa41e621726306ce04a8e5b16e43cfd1aace7fd45730f14d324417c7c40fcee22240308ecd8c065f5dab86ab83b645a56f5666d209469086fa570ca3eb2e3ab4c947d69dd44ed13fa55aecd71a692c978642628c3b5424bba500ffcf28cb721fcff08fe8c573dd97164dfcc3048207f66e872e0d6b2fc8e013d789631e3505a5ba684311c1439bdbc2c4ad852b4cc0ce91fe6302d9329321aaebd480e4faf2539b7f11a569396f56aee7c6a8825501af023694dede57f995809fcfac82c9ca21edffe009a8ea344574f778000fa28f429778e8ced69fc830e0b0c73b760dd1909ec36ce2e9856ab43eb38f6d954f15d567fa7b62bf8622c57871d73f23d0a647420e548eed81849c1b1815b40fbdecaf095d57d5956ed28a159c5497790de88b69f78b51bc63034b15515f94128bc9133b3c687123cfad3f80103710d22be745193d1e32acfe6803fbf7d014219cfea985683d69d57b2b90abc55eb7ef64214f3155b37f253138535a6e2a7c2e8a22f6e22f4fa1659e4be99dbf4e97225acc60944b48b37ea7e55953eea273ca895f7b1b6fe2176ea71d73fd8529e6799e0e9b1937d4654e77bf1dd2e18d7f2b3ef644b23517bb34cad048aa2ba3d27faa725d5ba1fa008fdb272f77913b6f43a789210ca5c7980969eeebc18de0cb23369fe57f1ef99ede6ccbd342022652a159e1211bd0fbf10c931997fe18decac6bde0979fbf17a6c94675e586483a0fcdd535dde3bca7a19a0c9dddffb0617927b7ff28a6f619c4388ad19549063376292146df6f4203f8031c9897794b1381e44a822f180722c2781f40aeb4e61759582f42636667af96682ee9ad994f73475cd5a95230fe502488d9ecf5853416b1eb223e5b5d959778c7e3e7c049787f32f3d2955269cc210dc5a7b5ce683118566106985882e5bd62a6efca0e2f27b229e0b0e75508d46c6293ba9b2d79b6894ecc5a7b1954650a5cf53c4c309a3cee3c3df3099ebd80441bf4bcb69a824e0bc60c9bdfff28e6173ab5da911e7c4d15eac1effe81c0e1b570a50b5f7f432f48124a1a6016044ce33d511c292452f9d508c8f72ed044b46c4dde9dc52f4549d944d620c03a3887596c6b4f5fc261082498f595e0de231bc61cd9e989a1948721da1e589345a5698981ed959d0ef7cf811dbb740b07475bc5d1d2beb3bd20c6928e68772dce4ea5dc38f2048f8c149c3195a83020a1570317978afd6c8f3b65d432448b23b0e67c3642f29ed9acb145108eec8f87e831d324cd8e07bb790540c5f3b3001b8b60d38cdfb8da403b1de387584e1d537c8d03c2eda837b0eee7086aad26097f0964ee4f7ed84c48acb6f6b5a1a17f2a4e65a93bc42d4f210843166644366baed011bc4ebce8f39c23e026fe141d792ae41b7e087492883983a4ce6fa9592a92b01c7589e8d5c0d26e8e017f983dabfa9aa54b033f986cb2561b7a9f1bbd28ce7030fe21670335dbb18538fc569a6d8c26612953001d9ff1d7f2796777203f1a701eaea00b3171697a13768a44dc14c0a339df20c124717343169742eb56f25489515f0729c4c99cee8f64f9f48eb95af8e9d1aade340dfa47489958400e2830b0951d5c6d4cda29da882841c04437ad833d97d82f146a9f365a44df1f0a5cff66cf72f3482f76691676a3542be3b0dc791ca4a39df39e96e29e872689bde07f2d001c5bef8247927d9d487ace8156a43054a74abe1e4ee8d19c46e918ab6119ee5bb1727a8cb47ca37dc5d36050f999040a95bc1702594d554fa684c28d6677f366d4e777e3751fbb9662fef840a7eac45bee1962fe085b6cd5705bd7c6f003494950a32a183a8d9ee4bc4a4702a0d5648fc6e9bff9d2ca30301349497d0c2461721db9542a5bfe825015d8e5ba259cb06266581f94896e532ff3fb8e87c76c81b42bbf3d94af92b36b460cd92c0e791c95d996ebeb32a9672f283099484623afac60f73a0ede4e256a1dc6df6e5a8e741a1876324a2e22254a2d6f2b724b86929335c7089f3ca9d17037a6d836d69c9b5a8a4aca0b4edfda9892b962d807cea1c439324c1bb8959fec5732666fd7a5f7b69eb19443d7ba11ab62ede751ee155a2a218f30cf13718faa0eef3f538e2f33f4890616225652b305bf4430eb3b31efb0794c7c0090653df6c3ec8f22e1bcfa128d927277c35f5b330e229826f766ef93a14ce2b3c306a6239339c2151384444d19437067c47ab0b8f09e2dffcc31daed5e0247cede14db87a48f9b82ff8acb14307554e67c3bc0cb0d7c9d1d97b4e657a6d11ab00f3d3867f93daddc659048f90b8bb9365a79ee05001ec5369fb6d00dbfec7db0d0ae1e559e2bf4a29f4f19eea507ce1110948c1e9bbc396c30055a3673899593bf27a69e9b8bd12e4148989af1add1ef9972dbaf3c19b3dc9f616f36dfcd34d0dca143ecc923cc16ee05f5c5861d8ffe89892f450d2927fa62b416273b7987a361ba3739bb1477d528d21abf98cb0a8467476d0756fce2b3e40c8d2ccc285f67b299d7d46f228040c32f304c688d01c67e0cae4b5786f0ca5aa52e6f312d0ee9a15feea3d290dc2ad59c97f3db39220dd1b58291bb99610f2fc34f4ff44f56ac3e3a65184572d1d4cf206e8e9ab6726231b6330328a6883c9618645ca3bf06cd2cebff10391117178203e6b3d6a03ed93cf26e0c8c700e0327eded34f473bfde7d97c31e04c4d5ce3d307f6aaf2acfd7d19c5d34c24c5dc9fe1512bfaa67b326527f7b37dd3bde6d7d58248a1ad6ea465468be95072ee3855f92e40bab3cab122a0c4ea34140c066bfb6cc70ab091061423712789593db376786af79c4481f4b34932a77c1181745c81461e44b57778c887ce28809e1b42147ac1383a48896ab5b6acc16d38c67abbdefd74ce70b18aaa60ff07a78020864d7b56224cf8600f92ccf39220dd1b582916342a61b4eea9c5f7ef593c2e5a9dce490066baef8bd6b0cd2f6237deb94e4e428f2726c67e841cf617a33fb79cdf0e6b140bfe350072b73d727065ebae7011a8da948bac7c73223042d2adf210945fccfb03b2e8acf8555ddd9f9efa174a04afd96a703c9e31deed1920877323ecf36f2a6a835fca033c970dfeaf3b35768394827c5e25801ec37f76f24ebd1f5ae54469279a2896ffb618fc28d10069413e1a9190ae42fd74528ee75d8b7711abd25a305dd1b0260406d07fd8240ecaad612e521f479f55a20f951c9471940c7e61825c99f758ce95ce6457d1455e90c17531baacce11796f23fc405a0733b39953ceec7f0baf088005ce2e6a1a3653cb2468ce033a4a4c31b8771d1925f786ecd3bc98afea23a1fc9b51da33e1de92139375ff8211a6fd12bbcc94203034c555c5508ea728b67413f04fe523574604d28a68a5ad48c514d6ff310553f1db5e7db154da6c6570afe112db4b84868cf4ccbf0860f75ca9ca25f00fd77118ec89e1f9c2a6490242e310e69eb865bf6750c62c77e8ec96bbb15770c8236d84a302feb52beca12be7388a72427d5ee86d6fb16adaa98c3359d707126925a8469dff1805d29c8c1cfc65e27fc7afccea150165c3f3684ff3abe93040e479a4945f8845b015a150b00bdb8caa8bb0693e34a438954ec8e0945252c687d475ffb1f80a6ed94f502854dea6a37db9d65b9be428ded687a6e0cc4f84b669a5e7b4416170dc4e9e686f1b9799e0d8a0325b9f8ce39b4e898e86926c1b4ccb51c23607dd83b7a3e18adfd0e68697202aa1d51721d4e4777dcf13f1d3c971e40026938c2707084db095187810123b669f383bb6032510dcabd49cc0a7e04f5aac7c026bef1c1f9222a6665630212810f49da702c322696a17dde5abde9301396625ea1e44707851e8d8b9d9607d39c87f914ca5f9bd00d0dc419ee0ba46b7c5abb1d83077a445e383b13d625a092e8aa3955d393e030ff45913be6887eb8c4fd0ed815da6a2159e77b7550f9a2b17d52169242b9797f2ae69a986d59323cee2228095ee378c54822e104fad7717cd43883a8d3e9f134b7edc26a27528d8ede873246439c2a93575280457fa453b164717d4c7239d18804768f566917eb14c0154ed020af5e5655d300ed24a07d28e18257f64caf7b0dac85b482be946e3c72341cc14fd5dc6dc63d736870d9fa1902d41a303621bc2afbd08956128846b74ceef88bc84ca45876021bc5464c10130175172b92f1b76231c7e9384ecbdf796524a99a4940178067706ef052f84734a930a02a54aac8a97346b523bc6ac88e00b3da1832753a8286285128e5a7812a507fcaf77fdd72a2b4883af094f428a3021e4c8891529280f5594546192668def18b3b2829522255861058512acb83bc6ac0459a314c687342b20f68810179008a11243971c70a02ca822a44a0a693255baa24a0969d6548162673bc6aa8081c90006fbd47c9f0f5310712b7c285364850f618658e1c312265841bd35311f8af0018b3d4283060d9aeac3931dbdec18eb010a7b53fee0afdf0206e6095dbb7ef3357b66cf7c0cdac824cbec48b738bd27625488d832a96801428a9831307440494d0e6960986249540aa63099c2c3cd5ff672e6b216b28c264d61614a0c4f984ad20ef353232ebe179f6085fcdd4b8504fbde7befbd374c4eed18a342444c6c8a9a5d778c4d39d3c3162aa11a080948f1918278f0883f3507b6fc191b9e3ef383a4d458124d2985c8b62cde98cc355f5913d9bfbc77fd6f643c1b82284f9b466162d30ce36b6b0b241baa94995282982a8068932955c829503bef189bc2d405e60218ec53e2fb923c1d794904894d29e26534344111030f452041840a3a486142ca982ccbb22c3b42068dcb9318285e808cc1b12ceb0163dcad10d3746982099a294680f09283941aa4243da5a4b02045862731af7701910394233151b44059628cbb90811d6e58220463b4a449a23844391325cd939818941df6b6630c8a92a83ddf5b2287531271b0f581fda15b1ff85b9bc3293ad3e73ffe53025130fb0ffbbe492e0212e88748b0ef5fa926c1ea381510ca295bbebf954edfea56042450eb03fb0e731667b29c5172d298dcf1c996f5e77fe0f347fd49e7dfaba7aedfcaa144615567ef896842f0f101fdfa1ff8d7cf513f761fb43ea83fecd7568efbd8470eac8d80ae8ede23bf95237acf1011100940b1d3d1b23a87fcb863886af7ef43020673b966f5907072ff4d15a5016402bac42f44c490d44cd99c4e22311e80c478388ab1200496d21bf6fc2895d43a9d06159071c2b48b622a28b2a7d725cf77d9cf58b2f6716b2fff6a3788caad7632329ad9b8f76547e3a5ae0606040cf6c5be6ffac4e933df6a8c2db6d8628b2db68faf0eb238f419f623c5d32768fec5f75a5b2ba5ee73d2d0bf3ec6189c3f3f7641f3dd9f26b1c548a5044a428248d2972200ec184b7292a4e463cedec7e37d3cde7cd52a46377fd9cb39a359966519959de92bb8e9cb5ed2d1a5d40b2c662fb8884887234e78c195353b3ce9b0a4490a9a40c9b22ccbaa0a2688819035406a302a13842a6932439324576c93169ac070a5e9f5aea42245b1a42027ccdb044d0a4b530c69e284d7a3264094b0d4044b90a5a658132e9bee186b9265c6909e90c844b1c5d9c4040d93225e30c617e32018e326449a185d6902778c2145417272c39473cbcff45b37b694d47bb0620506b3e25971b9aac400dd617126468f31c8165d95fb0b723a7ced9b776431c9da67cfe197f7cc2bef6f3cbb7b8ed3dc9e52b61c3009f2806dc901d86f60e8dadbf621cfdebee973f35bfe2df5db8df72b30fcbdfa18be026f3c1c9cf7e11b477b600346255c98f774cd17c6da4b2d63d4f763f896d9a83995c1165ddbbdf75e7c6374da5107ddc7dbbd110c3dd833ce38e38c334e8f05597b5a238740b7be3152a743b6e8f2a044fbf2f35690a1605ec54a553ab14939a73ba5b5cad82c27ff7632bc26396a8f498e96871cbfa6bac9f946b59ae1e9137aad3a628fe108db5d8b01ec75a595ee3ad145a5434e9f3acf7c3975a7765e4f070bc2235d2f07c7a92fba88df63d32842b4628cb10db1906f51dc123ac1a11e42af3d9be4d2d46174dad303ea9247848a50d29d34c04bcaf263b4b65a5bf1520b1564f9f3f5eea5204beaae3d2959be87030f1878698bae942a620ca305e813b4a1d4e66717124ddf9d6c80d2eb07c6ecd140b9552990c52473efdd077620076ee07687e5703909b2ba93bfd83122073ba20bf9fb05a3c5f4e15e7bef79793ee4306f0ecbb089350f57535665ef915dc6817277208b494ea538fff13caf878d83317db2c79fbd7f039cfc6b6cdf384ef3f0802ec1ec9257daf5c3d7377f6a784f658d20df67b5905937e4398f28f197457a58ad6a90c524d7d81139d8bebea794c30805c205a60ff7b5e61e42218fd7960f983e97d3616cea645c2d44a593e882c52487f2e8084b7944a57e0fa16af5f449327d421e47d3e7c8f4b15f5f22f100468c8a358fb884e9f6264facf5a3d235da28e7e1e0524e2929952da86e6da4d7d20be280936c3168a5b5520f76d494564a2b8c0a783bd4fa723dc9f2eb4b199366d693ec94d2fa6195533c25edf0c9f6f7624828b9b6bfd53a8840b43db0c19e40f62df8dee3453d22c89fcf7a92a3f77898b78b403fa4da031b6cf9f25da9464dd3344dd3341b58cbb0165f04a28d27e8f9acf3a9bbfff49f58bbd7da5a29759f130cebdfcfb2d7344a3f86f54520daf46b266f095ab00489223b8c4a4a39b0ecd9b49a825ee0e75fc9e90a4cb64fe4f07ffafbea893c3f7c49a7c09c80c19ab8f8de1b3bc2867d2f13348aef8816bc04382b9265d9921392d30a32cda986cca904d90985d41735dc97289c1d634700d9e1c3322856517841e30585a8cf29cbb22c6ba5f065872f5bf4172317991c2f2b25160ef8f1cd5167440a4610592d118513d3d6d931e60483ce0802ec70044892154071668a28464c15196a78e107234878d9a20bb667485d73c25e4a2e2c2e17e7c59ff883992247543186e98b1440f379e2cf43a5b042112d2aa0b0022029a5119bfb36411cfe6d0e06d19f5ce73f411d34bfe5da06d126da4e9f9b60cbc67ce9208ef95287410e06d19f74be5fb1ada4c8e17ff8c977c15e3e9eaf4c399ab3e3ace4054e5a9cb030b18ac229e654858925a0603028a8ef83828a1ea3cb21df8bdc227469d5629715d8f75f99122a37d898eeecfeb595f6149139bc4ac281749181095dc070e9a2e568c5a58b148cb10973c7581728be436c6df9ab2f4d514d25188131be26e01f36f6026435c4170d768c7589a14b0b3bccaf82fa62be5c7e8475c9b1857318df0f298db6be5c2991a38ceec447c4f7c19860b0e84d1a2fae2ea0b24a292b15a3fa210169be9c14a493c6a32d30d89659575ba6cf07dd10a246410498bab9f5b7f689f6563b08c8355b6aae5b2de5b9b7cb61f00336564b99c698bb460ef0fff51b20d836e80eb25f27579dd618d3fe7b9e4faa8eee4363f4193b9831fafc187dc613d4a744346dfabe554a3f8073f5a77abace3ace9734407c229713862d99a07698b7071e54415365872ff68cd13eb53671beb8a79ff7542a829ae1377210b53acfd72ae64f564f563cac7458e5b082b282b2c261b5e487f9e4878d02ab64b2602d0b638e1809f1039216274056695b2e4ef64a490ddbacf6e20cc759edc5378699489c66b5d7c6596d8d686452984ae38e5109cd8cab2a92cea774c627c232231363f45a6badb6d6ea313a95814a9f2bbcf2e81e698cee91f2b05959278dd1a37b5ce1e0eed5dd7d8554bd56a71edd635512a34b77269224897131b281d5142e2c7049e15a25f9d1295c5088712982c97fd7ab05be18df1e32de3136841a2a4358f179f9f5ae21a8d8e1c3e6144794c0575286b8b28760f2c2102fbcb042015d2979b121846c89ba012aae6ec8f23dc4f2099625a7b4566b2fa618fb941867d5da7b31ce2ec659a66d38d3b46de3b82e954a651bc7755d2aa5ea5229952a671b7a73e353dedc646ad03861590a0306cb524a95b38d0d963dff66e9c697ecf9389ec4a39ee7537a8e248acc0c23e774a7b466cee6e60607c7f36e381ccf5bad58ac9c8f7e9f4ff979dc8ac5cac9f93e9d9cefd3d1d9d969f1501e1e9f92c77576765a2d9e261e161a500d34f02935884c3b5c8bc7795838a88117d180737003324fff7dcac7e2d4f4643a9949468e641e9940d4a0710a0306cb929244e2541ac9229288f49f617408cd5774d221e774a7b462ccf3a0d6000080cb150001500108c0a71400b6b9c1c1f1bcd58a954373727cca1c0c009cf297d39dd25a2dadd6de8b71a6514df32935ede22cd3b48deb68d7f9945da76d1cd775a9549752a972b6b1b9c1a138383e250e4eb6b9b9c1c1f1bc158bb2583e258bb562e5e47c9f8ece4e8bb65a3e65abb5ad380759b09ccf419d8e86dc3c3b7467c7a7dcd9c9525f74313f9cf25f45c971be5c6677a8092c896d51024366e524c7d816a8d816262d59c0ac5490636c4b524c0b546ccb123236d860c36a8658961c5634c4b2dc90454996255968d8f5c8cdd404595c58c9902585adaf50c1b124794ffccf2f389aff7ad70bca7bfeb34c08a79d655996bd2fb6648524e71d6342601142e9d610449520a6ecf061f8668940d000e2de5b83ac9c92a848a894209604c1e4098780c6100410efa956050b0414104e94000918dc2b0c94042438ba9244092f5c693ae10517ae44b9b2835c89206b3bc6ae2ca17105c95d8de0f5aea5132cc9b0c387113152c5d50a6668fca0a62b52b42482bd62613ef17d93aaf07dee2b14be5591efb362081543f0187c31b6122688153045415629ac4eb0524496ec7d3c2b2094523c24caa65409cda63ac469aeaddec7e35909c28a103466e5062b33ec3007419ac6db73253e22187f9f8b7502a52e9775efe677ad2930c4a9d46b291dd29d7a9c5781e16f1c2ec5b22187af17f55f2d60f5a5fd0d48e74b7b1bd09b2fed33f8d185f62ab00335199ab62f73e5e64bc9ad64a9c34ce767f3b116b3ac026563736deebdf76d3430fcad69391f7e5be3d99af61eebb5f7a6cfeab5d5cedbd87c0cb701573b3a3a3a3a1ff8009005c6f9b2f915c862d2005049ea61fe937fe24feaf0b78f3a7c6557e94d6b9628f32a450ce9e63a90e2346c8554a052406e367b2ba15e4ecff461a15487de9e990ea5751a378d513e738be822c79aac018c730e13a15e4ecf04833a9891400165c4055fa08a9428628771028325db6887cd76d0df6194bdbc675217d5de8b870524cb8f30fc44bf023b1cf494a8919c52ce59ed04adc62e1793f7b96a583f564db3fce9da5107fd44a5f813c444554e2e3b58254869c482180c88c49c9001ab496605a151af18b1a6416cf29d78ba3bc69cf0b2e7734e2c394166cf5964db549352ccd5f9b2421e058c991d634d346d04ec186be2051b840bb81ccb60ed90e37c6d19fae3a74332fdaa310b879c43c7f4911dc83d778c350166d34f9a1ccb84ac7dc8ed1d1609323717307fdba4512aa55b1fccef5e02f3bb27da1ca881e1081b673f3a5d4ffa1097dca21641caf021c16deb7edb01e9eb80f43dd04196917dbf75c3ff3ecf5f192d0743ff1cfa31bac0efaee50ffd3327fb3e6d22c9e6de7fbb9ced64b4dec16fc3913df7ae43a28ec67dd66720eb6fc020ee6f3e839ef72bb0d5fab8756c1e83add6ef7cdcb1a3c13dcf73cfa35b2d3d8368afbe7563e76d7e27763982482022311e00e7b32cfb9dd57f600e1874f33163e990fb6c057ada0562efa97f0306656f9335104650aad335d3f8673743db4490e0f62e14b5b510b417b27b83daae377fcd3ffb58134bfb3efeeb17cfc0fafeec52d1457d0ace17bbd6bfb922e5778939edbbbbcbea306058779fb3fef40f6f217729bfb084b84b272fa644d1a8285a8646ed8a849289b48c3432326222890b7430da5269c775bf8e75cb067efa34282d2304557a8af1b3f771e07c0dcc14c4db67a07cbbbd06e6e7c0f99beabbedb78dea905a7087bfef70b7bfc3ddfe0ef72319187435f7fa99fd8cdab876b5ee6b462fd5eeab2868a3bb90ba535a6ba532fc116e2f3483ba27615730f4bdeda0a13462bb97db4bfff07ead1a6bae85e6764dbfdbea7ff79283c0b5adfbf2b7faf5774c1fab65adaa0fa591aaa361bfeaa0fadda73a1cdca66feb6f54a54349f3ec3a1aa1e43a1c1cd5a14aca904a7b73bb2fa595de6e7b22d200f56b47c33efecdc61ddbcb94ecacb49d0ea2bfbdbd5af512055d43a1fa9b0ea29994990ee5b4b1c9a76fbbaf5fbf769ac5992ce45b6e5f3f7be2c0e83df58336ad3ded70705bdaec774c1fa38dadb5ba6624c86c6edbf78a640927506a369416a824504f7bdb5cd474450ef247a51a9e0b05508e7e074e07b3d7c01a35780dac2f77de82f341f80d588438ccaec16f1b77efbd60906ae3389e9757c5d132b283ce55be71aadf42588fb5d65a9d54a7fa3ee4f122e4f1e2d341f7556f3fa22112fc2999aafda99a9c49cdeca0693f2767ee9ca83d250b9bf6ecfa5127fe8c503f1c70569d13f27811f27891f3f543a159674493e323f80f7ee1bc715927f55196719eeffbfa1304caf3bf010bddd23950ee6fdfbe25233ba05176871bfcfc9046edaa83e4e778e5d13a3aa55b2acde43c55ebbc06e0175dd84f7534fc8354a9efdc5a6c7fb32cb495cfa35b5ac7e5a73ebb3f6ba57d89a3e64c4ac663bcfc4732711fe6e01a38bf4d0cff9149de435fa5439c94b399fc4786f11efa4caee9cd8738ccde87dfcfeac3677df882b90eabe6f16283acd7eabd0f4df41e7c7508db12fb8736202d8371cedf575d873c5e481527bfbe5f390295f7fbfe5faf11704eced5da69191e2f36f7218f175bf59ad0dcdc87748736835f7421b90f52713f82ffe848167a32c8e3c5be2f5a4676c0d13251b48c3480d57402a94429d73f7c69becf8a504a19ce7cdf1918ccfdccc72b5c6024892533208281704192159a2b9e9a36dd31964412f95287922651b45bd02b7bfe7b479f969e947684514a3fc60ae40e081f5fb0d6b0d66cf1468d136d29a5acaa6cbb1b730604ba1b16d0e00ea23febc4e193049b7c273bc6ce1ced173bc66260b47de41c636caa9899a82d34b78fbb4568516badb6d65a6badf5a66cad4db62e1721d1fa5a8973d925d086ff82dc7ce1cf39ca5bbe5f8454ed87588baeeaca39410e3f9e77bd2cf52c9fb0cd901bb7eebd17b39ec8b017303ca037efb055f5b7b95d84e43407869cbda834a16c3617214dff22a4f843fedb6e90a839521a63d49e8b90aa1ef240df54009843439656bc83280d10fef62accec183b43a4003bc6aa589a2de6cb9f35831cbe5e2d601fdf4aad84c6ce2cd9158cb1334ee6d4619b21b7ccf16e33e48ed9bf0849fe9007425ae5ee86cf5a6b9010f1bdd7cc399243bc7110ab8979647ff325a59cae654ad4669898d162e6893ad9e274313cd06b2bf539cd149911e7ec7d3c2d885171851921741e31c5e0c4ce62200391212aa8204505a61b7808c31443d6f294b56c0b8409270471d2449813c6a0e0062e45a8a0324411154ca8a8e1fbf27d302718ac09066bfa3e56d30cf2d46790164c61668a2147102142418a2a94666892822e2ad02d54b460440b62524421c50c64c822c55394145aa4208325cb8d129b22710426040cf605f17db1588c75250a48142eb096581881a989a72a98a89451d21265c4aac2ba32801d63514ea2987c56be0ff6030ca60483297d9f126c0a0c46250a2b4a1156024919a8288a5c9afd8fed07928e4dc73b84a423dbb6f9dbe3681da9773d243ff5d977cf224db6397bcf7dfa58fb6f93f52bd6733f84a4c3fbf94348ad08484a5f3e8ed691f3ae87fc73748ed54b3d045b3d4baff4500cad87a61e7aefb9efe9fb38f51db86d7a08090747ebd03e755fdbf4500fefb93f3fcbf4d4431288369a2ff5d010920ef9530f011942d291bdd44320643fd4bd0a963f02dd7c04ba361f81640402d2c00874030e21e9d8de460f49a0edb9cfe08fecf1abc01f483a322d9178cf7dfc3f2250c7220da7372d9390ecfb2caec8fac71092042210d63fea47a05026edfb19188162501c6d9d1d635024cdd47f20812a905422612392f4e2c0ea818cd198242c1fc824614961f530a6688c0c31e00c110366873bc6c43ce11d63629a6262ccd013b63837fa3ee2cb2a750836b41c9b7e08ef4392507dd8098966d8f4a5129bea185db80cafac224f346df9f1a9035ad07710876ef9d3185fd15b98726ed95e9ba57edddd350e2be599af39e9a44edf411f0c883c3edd65ac26a0fe298cb9fb99cdb2ec661acf177e7b310679b8f06f9b04af94944a1f0cb8af5d189c06992ea8a56ad9eeb05ec835fc07e39cbfefb11c1d914ba68fdc1ec0542304f768fa4c22ac1c72fc501e4d9ce7744d9f0ce47e8b1d966098b7fcf6ed9e5e99b7cf787cfbcacb738bc0a1ec7db782313c03abb5b682747e943678be24b7428e2e554a5d675dfb0707df2de78cfa9e4fe59a6c6ad87cbdaeb49b460eeaa696523c9f87f3e60f8f377d78e6cbad4441e4206ecab3fd43a0fe39ecb1b399b93de79641b96d5460ca661b0786dcb674dbde47dcb4375f5986f1b46004a38ba6e65d618bfe03042884451caa48dfff93564616921cc2b00b69a129f102ec8734c4d66e5672c0b583e44f1732cb088b868c67a5b4fab36ce0a1f9ed0c98a27a084dbc244fda23852cf70d89e876105bd09b3d84e64f9e727eac2539fc670a33637435a49452c2d8f463a0907bd03fa24f8d44171cc5a90ff10e954ac78ef9ca315f527e1fd3c7346b609cefebf0f582ddf9d3feec600021b90d0963631a581ad9f35948aca21c02dde1e7d269d47c39cf95d153df7c4d18dff765423cb1b4ebab3cc87d3e88fe7d1bd7856cc07cc9387d62e4407291832a5949b20bc67cbdf0a082fe5ce44004ff8b31e843aec1a0a67d96dd17b23b0b41c39fdd8f9d03ae0e6b572386ec6644e7a28b17d14598da52868de8427e2542d57159b66defe1485d0bd53ddf070326514ace2b5415df9c7959e420b3cf812cce64ee33954a0b398dd4fb487d74219f033d2559a3bbba9d1df51f0ab4a1c09a216329ebae0f5e30831c80edaa8360b26953d94881d9f3586ffa6023dbbf75237bfffc18ffe67d8c2e7070c030fbec6fc2ecf1134eb6bff744925d39dcc9b09f81dd7bdce397a1f7f3e97b87c3dfd3990e53dcec64bcc4f918336bd94f656ff3f96fc010ff7c1bb075a37efefa59b7ecb76ea45efbd46baf653f5ff5415c9bc0a8742d3845a974886800000000008315000020100a8703e270482898c6ca683e14000c788a3c82549809439120c7501404310cc420080311400c20c618c39c72c878009e3a49d06b239f4e6fc96794c4007ede770ffc09b1fcaadb95003a04b996ae8d0baf0977c373246d66ac1161ec605bc92043f7d8a4035843593d1aa5860ca9588e6beaefda424f6f9b554961eac8568a0b46adc95e8999120512214d29c8b1aac2f8309859aa3a49863cf3b1ce3f6358dbb7d4f40fc95c9cab2779e30eafaaa72c6c4782e48b9be2f833e3ac433339182465060eb76accf559521ed0d0b0226c46eb9bca082550985091107008fad6f59b027e52c1646786578beb5a2e97eb0e08fee0c24640195be0a26b2b898d4a396952d72571825e2d818bba389ec1bc3dfb6a1b0bc7d7c6019cf4486af3a10bfae6537c0f0853db4955f7b8efb6d80bbc79c5052f98a2969faf74c9a8b7a0ab83b773d8388c8014a87effc74a6c4ebda745dd59e635f045ce9a89f4c8a79a2cb43e0b3c74957bf9d39581b1ee12a15d81113e299ab0e905b5a0f994e82b359fedee9680b7f2d9426b7b78852656dcf74c9666b539e3742e564db2433602bb7ea33c60f036a8e23c442665922247eaa738711599a85a2839de3f42dce24b12b8c8c233a7cdf23b273a7227f664ac0d5ade691b789dc989212728d3ad1ea250e450b90f20086aad042cb3599e90e24d95a465ade152b632247139de59ccb8511a875b27b4bb66a314bb4ffbe7b21e4a3947b5a358b7abd78338bfadadf890366abd1b36b2abc7384b0b4bf606195eb949645c9c937fedf650ce1c7ea4eb6dcb3636001c0aca08c1200812cb2f3efaa2282b436e48c30af1b1df1b1d86a59cb18454e29dc0a4602b9b20f6508dca4f02a077f6f7eac732d06a4fac8d97654f2e0bd63eb7bd96d68f30c6142f093c54fec4305ae8470593bf4812142cfeda5ed362c53ab9cbffd0a1fe46fa6039dd805c96233a012b3a606fb9498384b10ccb4d46ccedc28e70f33c185aa7295905047328d50f08965be34b4e911c99f2fea067817ac89352ad1ec55a4a56a90fec443ad19215bc8c83810931b8d82c64dc599bb68e8e952a0ad4631b4e554bded344e9ac82ce677a9945ae28e09a30fe9a7178404112632e6a05ed5f7ff96c25ca8a373745a5b41bd402138d2288e108c014df897c325b664c9d37ac67d6590865f431774242bf91bdfe89afda21a9c2e0b5b1ca27601e0eecc5e594e6a6b236cec0c61a4c1b196f7c2f2f2ab3b948a87382dd6b2f45a10236777cd4ed93d572b1b85fe9a11db6a7d3850c5983065a6a6691cbeb3c76ec37ca9614101026ebfe7434b4ac730264ebb0665191a7b003cc0717fd9a0edf607ffb75a4e81c4be5065dbfdd18475b4fb407508d4bfded94cd11bee42e86d6cbcfd9d4438acea487213526c877d6650ee0525060523cca66236bae5cb3cb618e585ce7985e6cee6ef4381088c90d1be4e8302ec90a688a3bd417f9f26b0e1f74a94752d8e2eb1c5d744186d65007081b2239c4e1244b21d013c35072969058735232b442184bb8b1d0d1117b5976c29b5b5da8d7b35574fc181d6522762c40e2cf14807dad980e5e2419845fbc22b0be2bb5e59b45742f9f1dc36dab6bfd3096a04be62ca14b7619cab65e2dbb1efa6935d333099de01f1164654cbfac39aa1c80cbcc54831df49d3e3f3360f5615c829ec4514297ec6e886dc58d762274f3a63a11c78d34c0e8593f894f509a4c86af02ed161083c4655ef64eb31ae50325d6f4d3b03ea529f4666480d97c3c588b29053184fa9da9c779892f3720971415307b9e1cfbe4f39e5695c4f0a020d4791e1fd30c3cd2ae075151c5a561649fa2d8143315fee20d256be9908c280feb60b764a1c32a7dcc6dab9c129bd1d98fade83a5c363fcd413be3a605082fac8d618afa0dd3619c983cb57d8f4c48882f12ac4c900aaae11ec72afcf48922ac759983881f176ee38f5363b560cbcedec7a38d4646d4087b215f3e85d988dc7fb859187d19c6bc501b0a887c153da50a89dd6ce0f61804a1a5e35cd2cc845ed68b8f238b198610954c60f618edac8587e57e3dc4108c8f92b1bca59a6884d21e5a658ea887e94f576100da9d70121fa5ce7d5236d590d42be5bdf7121b423d5ddfa63f3b42610fdd15bc77ee53b78fc8ecdf7f34dd45d907e210f439162543b19cec88d00562290174558d166d1ab5240d229e0226e38770e68b38742579947e7542b64e1cc836fecabf2b943f584b4e61d6c4213aa40ad5679b54ebf406a921aab35db28b332d9f2a23d4bfcec65e3dbbbb76a506d3a9996e86674cff1a13beff720f054260f34dc476d93ee8319f69c863c24431ac8b6852b7d806574a6992fcb8280df933bb14ca9b0a8e883b124391ed3444d3a9b548f274c807d141503a907340a43d1ce0c0510341e1188879d4f2f224ec3b22a49a893e5e4b59853baa85e361cfd4545a53b3b5c4445aabdc31a7837580298e98e6e434b811f33fa68aaa76c2523d42374af45dcafbcaa65c9608c744206fa8c6d46c025d0013e5232db209b3e00a0ec0ef7ca71380673010ef2fd8877a4f0bf4cce566338b107f45218a74ff281b14a135351697a08d1a72ce98a49db45f5820f4905f2b4755f916a03e446ce6094d4ab029bc03e39965f5ed3ae24164a252609f56c820971ca464928e297d1fcf1b7e11336657d652693b2844930277a759cf54bce1dd17ba2c0f181463294f8c86ee3d79a25569e736d6c57db1cb58ff2a3f060a56252de31f5e188f0a1caf05d9945d085d9151a730e745a2c7b6ca7af4e9310091c49e062b999cc9b01e41a8eb4a90ef324a8aba37a90993a4b8cae5d4b4d832a17e7ed540bddd6f91d9878fbdb169a48b29b55769bf45d4263e72bcdf88dae08069d478eaa2b1fe0906b42385d81d84e983bd28681532645639acd4a046408dc77701b4621f313bd0b47c52217155fa3893b0109a96cd2c5c26e58ced380ebdd98284d1edc6ec49a397b66616a142913440c7f1ec38d1384128e3776b317692386f5b60be00caa95f14356c383f51d207f19856288e8c1e93cd727cd5e8b3d6f000231723107257168fd15a7fe591706d728049b1d18b8f90969a6a51cb6230c15501a822f0e02f5e2ea481cbb96af30a8ef34905cee87bd5fa4f595986ce0e339716408576e1d5ca05ec7f845a8aebe9b24b5177c6b208c663adad9ea96f122c902833496505b1ea15185fdb4d4d7616c541b5248d27e7c23d61e194476dd8c087dfa7c017b8605d0d33c9a14aeb2201709c24d13db449d41bb9f6bd002b407fe39158e3877f413538bd4d8d712a3df1e06e13865d18a0a6e08ee22201c8f46b22a549e1a07522125352e003573658e93d7aa90e7f2af9668e9378ac8c050f8489beb744efa75698e0802009f30173e102a3a4bcb29aefb2c9521229e89d1549c4d3949202b4f9446edf125d82800329408548d1fc2e60da39be98e48cc1046875476c2940b3f82ea5b8bb70d14e5b9b232a0bdebf4a7545ab5579bb00f9fd8e6ba9724747950fe7a330edddccebedd1a06ca51ee039cc0633d68b9e6ac028155be29e1a86c5f6accd2c095413ba36e23a98dc415199e23fa4057e1c180a848c5d7b6a1b8918808337f725723802a0a30873e6cd103214310ccd228ed7ab9f788a36d5b1c89de2c55153e9fd9891408700a3024e41d4432e1472867f881ed98f7cdc0f7d5068c65e51a5506fb0278fa57a9b2a09b1ec3f8512aad6a5aff93444deca039a67c46a40eff7d2ce1c3ef4ce080a12752355c37c9a71b792184cc584235fab2504ab9f4081c046656f3b03fc17c4fc8a22f2ac30e0b142a6aa00b4c3d6879cf185dcfb1d7395bc23fa6848e78e67d1fcb427492a38ab4828c9db329def85dbf98f60c13bda7cbf8233aec078945a8cba49013e96790f8c7010bbea3e42c59ea58ca7c7db9ba49da488bcb08df31dc7773b4aacde56297a82dca57cd26588b6a4cf542c3e005a2560717a8f07e078c44d6a16a4c1334e04dddd9cfbf0e3c3ec64924c03f12db8b7890d48d99b2e3a6f7b3a92214c0dbbcc1e9e1eb13bc6e966fe57cc28b20205973b0e365a31a9dc0c3281984f4701dbfbb4e401279e26b0f0c30391776e07a482861ec3c52f5005f58c27153585fb8460831203afb76812fc88d7d2e25660839e80e7fa26ce0f89db362c8c03da6d054914053519c4c15bb56503221c647936a5179743e1300e08405292f7bfa901776f32b9263c0c5e68e6ae6f2f49a5e6e20add4dfa1ca0c0bb4be4a6023d134420f341a1c98d166e3ba63e60ad7d7268f6d5814180154f4c8114f4a091ea7bd94ec7e86bc503fc41d7fbf474906b13935d897d7137d7700ebf7d509802258adba6f9186bb0309e3fd6480e57cf09087d41eff6822359f4fe1f6ff95c40703fd153e3596f89a591fa9ba07d3a9373f2d3497eab65ddc6b7a68473978d34b4ce234b6f3cb724bd87e42406a4c0dbe52af90bde4cd93aa10bad2d8f4c4556714594bb167058aa73d0d33c85d4a262471899b102d0c03ffb3087eeecbf180c0d3e2e92ac60cd841157cec0a170e850753dd24f70210c5fc21cd8394480d777206617e9b465422861f24cb6d104f69c310c824dcaf9eb659c24ad0940a021e5adc73008230eee4f4cbd604915f7d5da2110e0eb5a00cbf02466406022c2574d3dee0be3cb58c545dbc899138f6445139b463320692a483c5f360ae7acdd7b8c8d57f924dee442c67ea7739318cdbaf7c101f3cfa8cab89917aac6e0cd29771d0b773fd9935cf91fcaf5dc47d7ca90d93ba8a4fe23a3d13f3e7793070ea1072d97462e093d1b37550b15806fe41a4052169c7b0e447e928e72a9af63a05aa3511f71a8a132f18968a189b3427dbcb509eb34777d6cee9b5c43baeae89379ee85f1a470363e613666c427974b9fa5a2aeadf286c998d7ce2b25c3608e86a07c426e0d309423dadeda397cc0d2213d3d07ea638edb75f17a10234852db46dcbf200442b6627a67819fe61f614c19071dc7efb0cc3b2bd7f87544655c8762831f8a29208a45b22eb3abe440e54572d48a23f5786d9d0e9f779d404428992bb9438f1ee14985eaf20c1458ebdd9f9074d08c960a0012f2143925c7a3e6ee9b016f606806cdaa66c25fea44146fce439ce174e52a7d10906795f7cddca5ded10ceb78fd2c0fce16a94f089aa81b0ebe31a48f718e5eee96013262d132d73646ba57064ecb93e8c07aab53a831a578a982dce273391f48f55ab6c0cde71366eb7aaadc0c34b54bd9e1d46234a766c130161b0e7d2cfe411976177a58d552c58a3a66b5a57f0a285540b156a9d44141fb4931b9ff333a4445c5a4083730b902b6d0bd35f76935a03d0a3d4ef6e58ad58089ce8ec1f7847b9628ea5f51abe816895782741b3d41bc2b3d44aa31bc4340736c61a776cd6a063d15b28326f43d6232a12b580df8cfe7f9c4eec0beda98a1872df102fac440057f12d9643c556620bec80274ffced8193648aa5b051f15b67e20621a0f8b32387e1e03b48b83e4a8de77feb410f4d02de5adad155b8077516c614c2079bb7aa730d58ecf3fd9eb2cb952d14cd9bf0b7e97b034c07108e0f6004cf093a27ad64a0586657c64578732ebd896cb530665740daba5281542b66794f000c593546b89f0409b46d5d4d4be4f1f7cdeafdd6145c19c6afe6aaf286a62e47ba019ea3f840673e85c824ae12b69ce1a38b58f1c77843769a4078dcacb7ddcf5c1ca9bab2e893bd4330afa4ce4b2e966b61056ea3278c9de879dc2c3b1ce9c57b9aa57149dc9220d8ad14ddfe81285f9b6ffa9550147bcd7a2d79680e9ff24cbce045e28cfd65ff34fcc7946ac517a243af5142accd4cae01e735abe13deea7c001b96e2a6c57089abaa93a3b671e9a9253c88eac49236aa2e097c5effac0f92b1ff484e82b3ea08ad47292e8efb71d80bbdc98a235cc847ae4d2f6eb52582978dcba61d8333bcbe9fbb576aa00e7c1405159119f1c0af8134a18d8ba80309e63dda8c0fe05d4ea8bcbc19f034a027d7f663dc3422a7973edbc341de4e40d6d812fed46a9022c663fc10cb2275b45f8da4af80b08163c4c72dde40f9d3e89032f1823b97a5b975da9065e0dac265ca8be6d6a990ac47de172e61f529c9a330e24c4d461d8155032fb8389f370fd0cd018cd864c1aed51355f2f777a0367041c7c6ee223f3d9c8a266040c612b37f388139a8752da2084ab1d5cd78ef60f1aece08e894b55e70f411300f86829363060754fc09ee3a39102b879d668aac64e19f9984f6de80883e6cfe8dba28e56605e2378c0ea689c9ad5b1fc1fdf782da0f54233771c2b43425d7416d9578f704045aa6bd7a07c6b6b9b2b2d87ee056788b0ecb43be8afca4569383c2e269f2b6fbbeb21661457264bebecd44ba6fc8f52d8757e43663108429c1639e58a3d8b9ea0fe10e481b1d77d0fb27756cdd104cd2b96c31467be106e5b371a031395f94991e7b360c76a01710e1157f49ded9216b23d003fffb76b87d31e45e753eb6a69656995957f6876abb37032f2d9e4449e2d575e1515aa7bd1ed5164330a411445035f83b43c53149ba2ad61edee20064b7cd208ce5ae0e874e23fc405dd03041b5b7bd86db449fa159f1c21b4afc538a77db44543c27f4b6ffd82c751972664312f7729f8ffe058e03ee4f5b729f8366e13d52a31c7a328d4ef086e60f6cd01c3d420b22d9cbd63e9c0d224827779628825f66451e58db502e611edeb249f2eedbfb3bf232f82596c2b0d66461e5c2cb320f8e3bd6215a33962e8a82bae605284a565528af80b0825781bfa5837076092104425b8f6c22d3929f844285df30b1262eff116ecc7d31a0b18d5c62bd7dc138b5462fed37025e14a8c5cd52f6c77d5c0577053a291070dd604f25316048410df82c74b79aaddaafe539b1201c8216bed90e31f24e851df926df50ca37004c94515c26c7175146a1c8d52a2a2582918f75723ddf27c61dccf6d63c50eb52badd92707d719c8d575bb6ca19db761f2f874d573147eac19ee263b2baaa214b54855a3342ee3c4f040deaba1eff87b248223bfa1b390d534d233f1bfe2cea30bfbee52c6633d4a23b996b1d9da3a440f55876d4d7bfa43d54a0f2450b95004055405e5133eab9a1db3311061fecfe2dbf9d91c4b4e694c08661c91611f156a7a360f3817f6f15a58798d1ab10de163cbb22a5fd9ecbd741248ecf9a37fd7c1516738ffa48e05eb42cb7f08e5757bd005954f431f1bebf49c2425b16142805bc31a6e5c3647c18b38942d7320d30d59ddf9d1ad149b3a7aa9fd14d3d69e1189ce1f03bdf091b62fb9dc9733adafe7bcbd68931d222a213c34bc031ff1d47fcc65b98c7ac72e9c806bbfc921068003b71d71b2086b121ceb5ae40af754885ad5b89ed28170c66746276a00114f31b98b4b08cd1e1210860698629511e3a2543ef3886ed118ee2cce0e9299b545c3f0e2b121420e4fec777d19654fd912a825d199764442d9693445428941e313452c9ad99f0532cec05e45b2d42ae0439ba0c386be20e7b6b6d7e641ecdc1e03594353eee90f57a5ac246fddd45eb55dda63ef112d23a4b9f4eae580078710aba23f607cfab2e1ca64581b507c9c20c80488f14b003ea5b64fbf9af249d7fa43047f6ff127d1b64c15ba20ac42480d016bd32507ae731f895506970a40b3990e8a0fc8bde0ced26725d31972d9817c759068fbad8a5545a9c43f09b4330a8462889d164a10c3eb8ceb36b34147bdfb5708939dc7a65ce969993b96ff25ace26f345f0130ec5012dc5cc2d03b07ac7a8168752f4f05c384d5c29548c521b8d5ef8cc78ef4c8090e86e28bd7ee74417aaa14891f1309b4eb2370d00814a784b452ea2763dc380063662ba282b13ee89bcce724bbccb5b8abbdf65e066ec1de33acfe84e366f81dac6aff808360c81b847a2772d5b5ae13b1937ace60b5f4385ec84b09f839472e6f946596dbde1b08fef3aa44195695db3be31bc72442d22506f3273ad9dcca1d65d9360310781f08e7ed604c6905e38c41d30ceba634383752f7d91086a7aad3d07375be0f3aacb52deec21dec0f2c7d855d9d59620e2d37106bbd7487a742aa1d23cd851751933e80de3af8300a83074a13d1444312f8036d9f2e4256b6579bebba7672d0de46849bded2f48170c77b530312324b0249d2854ccb7df5e1ed697eb8fab4102090bf48b103dce625149bcc154849f751e82d03209c7188c306c7f4328ea51729cb558d1200599b5690079b6d5c8b6bfb69c9e009b1f16d41a8078dc1df14c8f20068fa246f75a7ae2304ace0d447121b83197e328831b953cd39f9344aaa8c50ffc806c70aefdc0c19d385bf78c0d29a9c87a94b3233bc6882249f81275f426e268ddc045a0f4a9ec206b61b6ded41b68ce8eecee4a903ab51d4cc7dfab9e87d5659b3b3d010034124ae467a363a371a43f7762733ea6082401149d6b68ecf5bed99c6e952716e6a6cffdbf7a3ccd53949410662549f0cbd5d89cdcf71534e7afbf6acdbb403c921c35f052e99cac04abf12767f02cc44dde369677fd1ba8ba95d719ab3d2afe300cb884a2f4eb9d5f835e072da4e9269419e03faf2d397e07bd8ed5dc1dfef70e2d7c10deab30114fc13b2c57e2394760edbaed8976e887fac0723054f1a3b7ba29b10eb61588a3cbf2aaefb3363f617b40ee0443b21c4ba5825749c78dab0209ab12f5df184df5ed6f8fc788816079394a55269a19457ac99f86bb8da5d2766b1fca1aee6ddc2b9decb59961e4a0f9925b9f6839fb67bba687128e4a1da3783649e6443bfde3f7d6173f32cabe3d2e335f6cb1ab970eb37b9a27ac7499ae5809aa5340a63aef294da64886b484811c351f5a099e63af2e5112523ef24fc0c3058d2cefae1dc53ee9edf0156d282a58ce7026c0d108c93d1bd2a801b1336e828d5c644054addab07eef509a662dae4c891328f17fc7faed91869aaa6280eeb16a4558bd6d7b85267c23f5f1cb1e14a34beb98dff0a3aa9642e978864808af94a645df95da37de95dab2ff279c3b313074531010907e2c0ed30da51fdb7b6e97c532179d5855c7a16bab1718bb4c09dfadabb30f4e62b949971ba86629f69d1fb9ebc601299698de33fe1b9b32ba3a3657f9a9338d58fe8c6cea67a8c4f3bec7320d306fb5fd022e895cdde67bace28e631416f0e198671d91ef782ff012efc9adf3998ffd554940003bcaebc92da7e6640f0e316a0617dd5a7868821eeff5af720c4012e686818cedd6bed7f23b735c80c4599e42ac419c832490bf1f60f12726f4b5fc626e0debd9d438a9e53a61e129b836b9b542e88138225277a692221ab4eb10d1e4e249b70e3a62691e64614e00a8aa7328c28f022954ca2bab62670ec45a563e6203f24ad0ba1cce71d8ae81d225b2019dc7c5cabfd94ba7bc2751b5b9d5a0b6705ece4c118ed26c9cb5385c8ad5f82b74de51e35cf9aae607ea47853f209352742c8a4656a5af0eb7fb81b088fbfe36e4ca2335c5e3248e23c6aedc34a683079288b3842550c611a0e526da7a050d1a4fd9fff28259b0f12aa1bec6895bc82009d36908aa3002b0a22dee98d66a2a003a8de487612a41d5ab31283d558835e29d8dee91de408c00419317939aea041bdcf06c1a8de43cead5ad0107d382fecfc4ea5ba8466bd2bd2a9b9912efbe9a202b7a8009340a5cadb59b09d1fc0109bb47d760d3393d962187f55ddc25aba1be53aa56fc1b08725ec9e83c156bfc0a1fdbc40d4a653b6f07621d74537c1ee8a6d6426f0c7f8e0f351bed1a67da1b9130d07ac0ff297a7ac2ad3fd3ab22695f75c26ded60a06ede5f09f44da195ebaed6d4ae5f614330703ac5ccfc9e140276cc84c62e9682ac5bb82e8658c180e37929c882e46c4186b4be19792a7bf0860e5e90b5614fc15eaa85c4d8b4ddcc394104627bd7dd5d5b53c3ba9cb9ef8853f47d2a055711d5f5c49668d95516310008b5c4f1f36e4541e87b3a2b9de45b70b4e6a5202e5af4f14a6519fc5ccd1e77652467b362f3938c37df243383cdbf92c3b1b2691e56d93b69be814e859a7dccfb6c3233a8f646e47d3d2a033b64f7f9dc427e43bd5f3b90b4ded87216fe2ff05ebe28c613836cdf30b71274e015b32ae0407ef1327c12586a0b24e4b961eb3c09cd7a364e999815f49d8870f21dbe35312b5df88046528cf6c8ebf4e5a86ee6ca3cbd762b16de2897362e1520016549755c8f4ed35a5b0fe9a5924e99a089a8ac7ae897f0aa438076e0503aa0cbd2cfc064ffbf741d3ad674464eff019e7424e229ab25083fc826b83ad606cd5a65471b7acebcda11032fbda7bea4b81e05b649983fe2030202fc94537cae88be4a6006b8fea2ba96152b2fc048c83ec8ccdbd546aa71a65847e8020621737de63a1616e35cbeb78ea1081ad632c2aadad5262edaf1fc8afeb28a02efe4e8ccc4e2b32caa57a54cded2b99cf48d14efc53d896fe665c79232f92034735bcd09828538efa9f40d8f5e0238c1b5c6c2bcc485f816cacb387a1c18f538c299ea9bc5feffcff3057098c067d6b7cc522208a35d92997a40a9b658e19fa775b90f9b7bb02d05276c185eb20b99833ac0f06855e39e7f6cb9e3bf9d689ac92fb1da4ed527c82e343aebc5493b70ccb0e2d0fa268267646bb22dff0eaaec208bed6606ae2d5a5aacc523d9d15361f3b321c30a93aa7586e549e84a5b62add0dba0dbfec5c48ea8c522ff3871759e6fc7e38e0c2a3d68efbae4f6b78414925f294a3eca1b270ee7888f9c503925718ff15501066d5cf596b90fea0f79627c22c43f211e1a1c83ef5e25a4fe096df4f3174ecc300af0466d4ca75848bb9b309d61310a38701f55d47154c6bf0318ab1f12a2d0f6917e7cbe80a0e60880fafbdcbeaf2a4d2c68ee63c43415304e925a87b48d0257b6eacac3688e6316545dedc7fc04d538ab3a99af405b75fc00dd71a6d21e58a15cb8fd7217362ffc44b9c7b86d2702d8175241f48e7b9e015767ea60e54b193575620d347dbd4fccd995bc36d9002d84c656a48eab359cb09295b3676f2da9b45aab9346af02ec4e2454dd060d850a8799fbdd9fc45df8110b6090d41332a3eb472332336c14257237150633338348ad092ce4bfdef00ce468f0f0891fb5fbfb6d727ea4583e148a79d20e772be98436a7f591eaffdbd293a3616c84ba323f8efc94fffc423c8c194c029e2a9bb6a86a07994f4f2514834fc09ec7932150a8bab55e55f3f78dbe88f40cc2453c97b63b6382ab2a959729815b3008d15d6d31d84af7dba237c0b44689bf62cb66e92aedd882da966a94e9dadd8a4ee699cdabea32bb16b3941085aa1cd77608ad4a244320af799509ae97435d021dfa1c027ca9f6374028951cd54ebf730f67608bbc3ee8a9b03d59121107e0510dd633b88654a1ecba6286b8e11cf6181aba45a3c196d99809b9a2e1668ca2ed0382b4812b5e3d7d2cd4fa890a3c725db5f90d36ab91e6d60df7d033cb344ccb8f06c33ad8adc5c94a67dca7553a569a55086a376e0398482aefc17eb4320caa90263b694efa0380a558155c8ad78468e384e5ba1cbd4010b61a335ca7b3b0eed8358ec2d5f7b96af7f401f3279eab9861ab938b56abe302f44592c19540b80532c0dc0284e151e5208b525c01b55a71e2a9417ea23d6edb8d358c70050e8223a87729d8ee6a05644212f854c9e2570506cb29405975d026af131cda706ec3bc2fad9bd34f8eefeaea63e6444abfff5d5ca587635ba708df63ac989a596767262573a45cbf51cd1e7ab4996b8586019ce9015153daf65b281679aa2c1ee1af6df90a4bba060fb33eea1999bfb584fcc1caeeec362c91907bd50ef361f7a2b75bd95e23f0a4da1509d8eda3bdb9f6ea64cb95ce3e08607ce7602dd0b5900f7d93fb984fad9e481ad46dbc83d284dc12d70ff9b693bbbb6dab1839fa7f7ce025584cde5349e2b3d3476812e6a2031c83de8e3bfe881b821825c59b03cab6ab752f06a9a30a7b65de4ab21336e42582e486c8d48c2da06f1a28ad314d4b177cbf51856e91580e8f4212f8d6d1334d709fde222f8181404b553be5a2660601c71a031bb6151b5e03d44ffe32937e9b8446826c5da200bf76d4b97e657ec5ae824e240532fd6dc723d3ffe25ed82447275cee2b16490ae89fb63e225d1794a77615d0ff743003c1254540de8c828e219ef227a7d556b51f9f3fba54bbf4d0081dac5f9369e940b9f31b2f4866580a50dd5ab9247ec4189ae0e401d85516a2534e002082702aae996527744b7db7a13e67d5d639e0c0d084aa323ec8331c75220fe16205411482da3d1e019827ce8fa109158198857ca736122193e8be6e608869dc76a25efd2715a31eba1c9118bf84d61f06f23ac6971d4e809c713ae185f6c4c3d80907e17098b739e615f0c8dceaffe8d346ec9348280cbfaec969d577aec1845980a3801a01b30032b52888d91a89c803f3d0fdaddcce2508e0452d80a71d28793d856d5d68e192b650a4f7a8006774739d203be4d08401843c0e8d974e6122b9ddf380ebf0c6f8d88d74619053a3a61deb9b9e14b170a88fd0080668e0f4518dd19a45671bfd6ba5bebe79bc486296723110693d09a35b3987c2c24a3c811e48327c1d68b7817dc4fdb9bbbeb1b3761262039a8dce37b52aad64b281dd2a016d6f60fb061173698dfd8d141859a3d896b9bf3736334600f23476c5098feb64513a539e5c3b37d1c7a739a827118b2dc9c3e0784a9a8ebbd4d33542cff285eebb95997db777e237138aebc7ac1cb6c5328101fb96681d2a2210ef63190223d909e2b1bcac4790ef748d5acecde4e0f7cbf243c3772a37b48c64ba6d435a47ebfe4fb9cad537fe49d4ba07b24e51fa1b0f1fa15d304773c41b422a893346246de80ca71bf3e91b5f968f6c9951419ec1849c92a86bf9fa69383019a11dc9e7e5a240d66efb76c31decfbeda93345b0dd395069d54d50a0a24ae401bf5132d85f252b358219613d4cacf7ae0227ec9aa5c32c8f304d8bc38124dae220e6ac7cdc14b17b44b1f1df61526638a1cb9a289a3578cefa650173c594f8eefa99d20f9447748389574108718098969bc2f03fbb94e3ae0ff6e26ad6a774b2e606f16f0f5eaf6235bf1adeab6a898100f1ef08639e018353d015bf9430f222bebf6bdea7625d180fdbc6c159ec2e99ce2b607d827dab9aca8d82d6db302cdd23784d8002d50381a76e772b0eda0952d8d943918ba06a22ddb3028217a07514dee8d4926486994896d31b334497da11aa28aca62499ac8d20fa0181672e057d6ad4ec7d5e92dc4ccc5d5168fb69ed4927422597ede5a4a1bcbdf6235f4768aadee99972e5c740d82784c1268735e830001033345de1ee965080f35e6668047b215da61b228af3955d0d3b2afe68c4a1c2d823e229bd0aa41568f084571eb4e175003b8b502390b628ee22102ca746a05dfbdac3b65e0c9fe3ef901935e3662f4223e432afffda521d27e39fa585e2bcb4de3ee496daefebe35951a642f22fbd06915f7f3d20855e89891656f95397582e1b8aee9aec7dd095133e45cc0b246e4adc52f71926aa0df1fc00e221a420e7b3e3cd19743c55514331e034388cc0ed3b66ca00b8c4cc573c5da5c0a0e29ee675e55006fccf03dcb4603c595f106c3dfe1a7f0c2ae038a936d32baae170d13716b3dc99f14b73f8277eb01b47ce3295bcad7cf25d7a549bc1187cfbb639dfbfd38392f6a0c425e6e0ce38d4650176458fd2cd6bb9a7041c81e53239d723331bc2da7133fe43664970341b52259c5e78e498e91fdf8aaa3094ef26cc0da971fdc4705be042651b252e5cd9faffb0ec4fcad2ae5b27147e723c9f079412aa69eec1863935d95d89203e3aed25924cb82e023e94b9a290ed16ecb0c4b6520563d101447413a2daf17b139a489cd7f34fbab38c811013ed83dae56fb7a085f9ab3379c86799ae0f84115853e7f614d62496d5bc29a62e3fc4665090244357176e5c65770ff50766962e886a72811d7e55cca0c3078c28fca0393ffc62988f58ba5745d72eee1fea3ebb22f1e83f40e712cc7c6305079ea6ca14299cb8e7db69ab6dfcd818497e01082d3bd4095e3b449e44c9f595383e3e1a42b220ee1bfcefee013e9a79a9b064a55c0e5ae851f4d2717dd6a02f0e27a2de44d8d7dbd4a8658a10e6b5fda32dc96a7d804d7744982be6e022cb2afcbc84dcf03f50d0c65d36bd4a7e665ca3ec52711c39599cce7bf1b03bd4178a6308efd531556e0f9d0fd7f74a487205e40090c8aec51dfc793a002195dc2e6188508362aeb34801c9bd3dd972ba1ac8f35c8ef334fbc293767ad0e1db06b69ce67691a16a1a5dcabee11bf218e36420b4935099d3609f7d7672ba95205b9c454911ffb7382db9b6ef7dc89d140390d24244106e3f3cbcfec265125fa15bfab0885025197b3f3c81b0f945810bc09d6f9393b30765cfba890030b4b7a00081bc068fd2b6f7e8bf9f971b50d036d391787e1cf8f3c97ef463e80589ec0155d48ccdf58608ea5ec0358e4a7efff6d7f7bd947cdc184b0fc9c22723e404ef915c035766e379cec645e6333ca0e2060e9eec14fa19655c6072c2130a6c64ca7c2a32c9551e5dc6786f913f03b77111f524af3f02dfda3562b5d46689031250778bddb48453a623096cdc0f67f7b4cd67cb95453b7dc622beb9d12d1f3f25410180b732eb9dcf6cc6c6d5b51878e476be95bc87df06d91728344e23897953a97414796f275000b9eb7f11e089dad1e3230722aba960128e47289563fda6d4ce1878ce3b1d8d8b07e95b76490370b9d45374ba0fc60dba5dea6b58462989af71908d794cc1d186f8808b077b1f4db582849812cdd38fc88adb81e86caa723eada2214179177c231e4aa42f4feca9629aac4d6fd45ccffaf145843731acb4113399c828ceefeeeca441aa6a2d68e8935282c02d903989393ee3067c130da2678a3908636bbda463f9ecbc0aad564bdfc4a460f5c9216c5699904346eea36ecee92f6bb1501a931f1ee19ea1152ea16cc4696e914c169a1bc70af06e169e05b99d056867aa155c41cdd26a37ee6e66ec4b53bf68e4fabed90932d7e240d1df92de2ee8926b22f4693344607207ae65c9e1ca986f7989eba6becff6d8c9e037e047fd95c7f5c77a86842845a1ae7c7855d584d72978bb094d8918b8c8f8e223329cca9e9af5cb4bccf66cd7215042a664041795451e10078d9d2cf735de32c24a4e7d6b1771962138c16c967a578469c9e0e2ae9b65ba095e4e17d9e44da139bf5fc41963be7e3d4419a30e954dfca49feb01727a710c4c82535078cdcd5d0de29370b1b4a5e242c67a6bc2cfb9f67caeb567fbb59999e39b9f0d6f61b90f45733c5ea4858b149e7d9a32c65fcb338461445820ae61c87b9364787ebe329f9b404850e1046cd380b36c7202226b55a9d2229c91808cd1679da2b80aa73137bca3535cd05f239a5c084895c29b23a8943d9d00eccddffd5b4859054c6f982e06bd4e8002795471c75b0363bf64e91a0a1d7770660177e9d90a7edcfde30bf721baeb5091173484a9f95e38e36d83acc9739326575cf70e4fd31610a795d55c992182fca28904b9594a09ffcedb4866bb2a23ac601ba1bea2f6a827bc55b0357956e750f05df09621dbc407c3dd636fe4607e1ee22c5755a3e3f83750f22592be26932cb32fa353670421922e4997e0c17e8bb1a606dd1607e0ba3600b8b0452080d6ddd1a6095bd5677790d8bf9eb103a24c22b1ad41e77b67f4ffec11c917ca10917162b34b4163cb7e4deedb6a674db396b5a5e1e54a1efa8f389da4d94e7eeafb7ed6dc694c04785ed5d4f8d6f51bd2643c22b20600a5a4d06c0efa8b4c3a1356a8987505db433711971d8c100a1f143c382e3b40acbb3f4dcc08061fbcf068dea547840c01c7ca885440c7298deeea68ec73c881049fbb517578da74d8f09825f2f55576da1f3fae2585bd013904e60c20b1f68cfe42d14394b90d214efab774964f57c2235d7a900c4ef0a26c5ceadd243304a9a8f773bd92c2ec5af7248e36c39be141840c49a37c703e98ec6cddab97ef15e85121c5677fe4454b940741cda6595c4ca762126e0ed559ff3789f986db23866e3f3d8f1de2154ca45fd30b31928a48ee18b3918b60b291cc232b903444d57d667ca5ed09433ead018aa31a3caa41e610e66d75a9e388328a59433e9b8db6cb8e0adebb52f91fb3f5848dba5f05f45f8d370c746399a94948d344ba8961fa72ad3a580c45e5d4ff394f293518e3308aea2f2f7ef2ab82a0a9a19e062f95be60454c83619e6e997b00b9d77ade6ceb7ab1f889af7a995bf77d03bf6880309b81def61f05d965b56f89d7cd85b82a7c62d7336e20fc17ed110b8cce3006921b3843e1b189f5ec328e57cfb13099004433d2ca48de41a41bf70ec8a986771a45b70fc16446ad2775cd3564f896845b151177abaf2aabdde14c0f7a12dd69d7d350e52d4c8e3989c6edc6398ee36cd8d2de624eb2a53d68d11ebb47641c347ac13e5794b54a7a3d719c14158d13ba424217fead28a72edb4ec378da6597907cf497ab8a7f78bb09ee5161916eb942c30c7587ef0d9564114fc1a1d51d1fcfba0836f7bbdc9dfed63589c48b2e9ee7efdf07b95486cfb8f4282b119a2f2f2084d4b97cde54c628b75ffe0e5c19b3e74383e1f89b4dcfd194677a3c6fb087d9b2b4de2ce384c39029c9aebdfa60b8635ffbfebf007d7ac7e3e4c86e94a67bbf488830e27bd08377e0f252706df0c557a7d78fb44adeb1bcb8489fde21ebaf43678fd28f7e957347d180efc1e42cf57f9e2099e8d0f09b5653d053ba8bb25582f530505b834c3f961d8f9b8a093d31f78c78ba8129a323531315aeb5b65b433ec95c11ffaf901077bd0ae21409758cb2d5c499ab2a861f7cf1abc8d663b753653cd7f2dd523c9f81af131b3e5ab8fa0b1552d7a7293004d0ea9d00f7e37dc82033a53369cdc6014cf51e7d9bbd769060e44f27669c466f2d241a6462895dccf6883e54277bb32a99c0f6625ea82b2eeeab5636d25a535fdbdbc333f024e1e8dc516f17128c3c69f8483db83bf062fb748689136ec437e589d58026b2f536a352a70b5920ff89e92bb964b110d7f1467588c9f6ddfbcca98eb3fa2f66c2f92ed4184bf698cacb29fb088c7a8e5274d1e4feb437eaf6d3748ae99429fb8d8c0e758599aa017233db8d2c1d3afe60165b57a031417dea11a0d0ee9ba3d70af2797ec130ed1d2c0955f5f12e72fdb830d90c9022d5bc41839182a39c9d980764f56f2ddda917fdef9009d2e0004bb17fb5bafad869f2be5e92d4d893b0b7661ab3bc8764761e4ce77e2d359e317600bf18dae87c0fe5954eafe0bf96621b760ce3940028071e2dd1f927ad766abbe4d3dc50cef5bb8a385a04678e0037fb08e7c360a03f5a326056d623232424f78fce65dfa24f13665dd12ca1177d1b74b63b4fe98d485dfba385a0524beac389dbc33b9efc7fab9d0f67cc07e598c3e42f77dfb0b0376785370ccb7df4a1ed273c0cf72729dd9b9f538099555ae882a3fe1b06e40765c632242163e686178fa517d029fa2051da816d5e11e5cfded2c5b7796802259c1a10b620658eb9461d85e0eef133db967d914f05479dff0d555a7237c9d38ac3d4b35135dcb67e6842ace1cab9f0321c0d5b178663f49ed65817be14a2c07480fa4895623e73fc816a4595a7f440a27030abf6d8b3047e0c36186de872b9246f71672c6fa4544a046e4790a958d8aa7a47d458c2b09a1089f11091a858a513b17f454ffbbd6dd3099072d2efab79885d5d46ca74b50531d218eea0d35ba4c30b400bdf3bbd21e4cd149e171e4ef88b45fc2a987aa801952db9d8007f4372ab805f07e4d0510cc4442e8cdf477e12bd9879a7661d00ee207e1fe95c405644a450bde0e2764ac4f2e4d8426af96a81faa1f78a8a54d164da04b9a5fa68a6b8c91dd04ce835ca403fe4fbc30561b261220e9c36497de1e735a58da203edfa808a1d3d5fd5f6cbfbd234d75ecba7a04ed314e2844479426f050f7793f6fa0571b4fa9dbcb50d251b7dfebe72cd0c3d6f0009f7f3b2e18ac6cdd09e1ed233b62216aaaac170d3d86418ac9f80b78cec8478ba57bd83e7d98be276bac7b48f092b30158ed37893dd7d616b802300a54ee84c6bc391735ffaadc808a210f30aca2e140306c171e85428fb85165d00a896026eebad59f77ae78ca7420a6b0b509505914ce4de2f6e49c574cc1ffb45ea1f198e697976a1f31b417b91e278b04d161d7e2221334e97f473c842e2e3ace5c6394fa49e42d8cc01e3c8208173740347b751c083bc6f51cbef46113464e7559eba343c73c46909f343c2f42b779c43bb5dfda93180cc62a1a37e07b00cc2305747ef3c371ab27015088276c6e71f4c72fa1b99fc3b34af8582aff0787ba861d2cd959269b8dbf9d2eb4fc513f44b96e1eb955b2ea93b84301199321ad575e9aeba6d1d9058dd5d12818da99c43047c6d38ec3cddfab03d190023a256981e2117f5845b4b980183491ec30c3434779e602619a255c2abebebd8d7718f8605b1a59416bee0dd78db8b6e9071e63133df69ff44ad9da466d8a50d4a034eb80869bec8bf65b9d4b97a8e04cce82860bcf19dc09fb3a00c519911c07ebd7fec10a7c0ed32d76033d082b053776b3c1a9d80db379060ebdf27ab659a18925b4e5a76a71baada13c698c669b3635c0ae1a8c1afd4318a60ebeb469bfda54ff16c61b981ca8ce1f621e9e73b40d7bf4bfd71957b7d6fe82e046b081d9158c4892de7aa4451337dc7380db0e54502bd5eef258be43f9fc5bc128fcf288987c003b83d0cb9c2618378f113f3901742a4e3fecbb682ee39834224f30eb7277e5a6514546fe2d454e055bc2e04d8fa0784da5c5957fa79846d1fe7b765aafd554c5766790ebca2a1f167f50f6ef411e2f9c60041254bdffcc8a4fb90b230b082d733aaacc97ff42e28fe33bceb00d7c916bf328cd529560574ea3c8740f51f0e21c365539b861a4da12a5e73927116a96adf7ac95016542dba9e5446b09a376d068db2b1b60da2539ffba1955061700782cfd2afaa72dac2a9fa4a7a4ccda5ead8daecee2b3214b06ca7bf9c8eddfb54a987783097241d2f05a47f327cd7bf6eb9eac9005df6cf0012fce5a1820f6d60587f921af7b0e5a1415d08c334b49e87b966ca3ac7b51719d658ad8b4fa00299e6ebca315c2061dc001249cb8be2a53a3f3cd724c20c451c11559ae41b9b391c831a360a96cdc574d7bf863c907397055f6574aa1ad02cb88162442a8ca6b19dfe244db4c63e3c3d71e246a572d8704009134a3cbd6a5c8a54c89ce300af9636373c910034762efe80d2044bcb16b98bc9ef3075e73e902453d2d951859caa553b905558b7693d50a9046b4b5174bab40b8fe88168f627234bff79e60e37867760b5c46d0cd3cc2ece7271a9b62f3a9775d9c6170d867b33bc1fb61941b24fa1a84e5c9da3fe10f3338f44187d2c3f3faa93aafce2420300cf003e5c0ce81d5b144e4e1131d624086fb212f5195cbe00a28f912f42843d2db70b5e166edb355f2e5643f56be8a17353cc1f917d7614672a219bf0f9c84110cd0ebae1e6f40d5dd84beaf594317962e1a95f627fd2af1873a57fba24d5e976cf77ba3016d305cc9bceaa7ec5f397ae12343c2bcb249631582680b3beb2a4f8967c80616c3643871503307577000ee16561ed64a4057c321e21ff258a797952375f7f052eebc4e67a14d6412c000e25c4f42d3ade106ae7772ae38aa293a78c6838f6c4773211eed8a53de7d30a5575209b8e8b8be55b409c03460733c53907bee0c8af473c79a3df9c134851bc476fb4ff247046c2d3c51506f91ef113d42e90d7d9641e52bb28b9639c44666c526612410c97137b31d4a0ef5b02d92ad195037d27403797045335f685049c4659babcdc0283c065768057c23a70ec5e0af87a4ac6805e1d4814a940f91ca07a3bdf2f05a36abd4703d770517bd4289ed4550f6a8b3bbd3a2ce40ec055c37422be3203a38e0d48ac1c0413ae74bdc5d694be13a9297d192db938789b3a4e6071eb395cd2a27f3761ae38da3e3a21124f6fe7ec67b4f449dab019a138e5c0629676af46484f70ebcc00ab40959815fe7cb3677d122e2239ddcb82081ad34b2841c5453231ef6b3b44aec98990b964848a4b733eca97c525f162d615b563e5f7c5ec63cf274ecb9bb54e3ff873883143fb74e49ac0982f566c7d0b09d3b8ac7d70239edc109da148868a3fc3dd44113c0d6704b3143b1e315cde031a9828ab27da665d35afdf48747ec091d33fb3ab43cad11bb2d8c59c42218369ad1263358c734c46e8934b3c717b526c3f8af06714fb37cfe1bc8f68c5ad4b6d4e8aca03c34d982431990bb007e3dc09e167dfe309b4cbe79d728622cb9fe6e611b251af214f7d0050359651223a8659b019d6e106ebe776e08b6f3b07565f9c160b8b98d7635c7bc9b0c6d5ba78023dc8022716832121e01b7236be5d8d9adeab3e46c2f34141efb2d9c4ce92472f92a53981c005f73fca32baa6b06dad563c20b32112fcd0c08fe08474aa192fe22350b1334e81b1fd3bf48bfae520af1f2589251e9829180646b6be40a8425a17310e6aa3d63bfc22fad3229b994697b31aeb74714028ade89cd9ceae04db4aad355383fa46c9f14b19f687972dabd46827161eeaf7bc699909ec60d5685f91ea8de29f26a64e8dbb497bd10e3c054526a170ca890f53b2127ea6eb289b8a3ad2addd7ba0f689cb6023eb5f0862a8b9a7c36bb1241cb97dee3e5e60eba21a9ce38ce4e59c8e939d91cced00a3e056eb43a3b497e63415c318a2deebc68c24faf8a5c039cff455a68a4e5f9be83cdbef03189dea07be516e353ef99d22e1ecc9f3a28ceaf1d1289e3094db1946d3b34fe426ba6600d75a0c198477ea64a6613ab712f8a6ffa4ff97f3688e12d47cea890a1db4f5045d715968120cb6bb291fe9451908dce6f404768e309f4fc776e25d2a9dd263105d21602178f5c046019de8543fa39492d0aadc672927da7c95200401bb00593e442aca1b3fd4c9637992e99d3139c776b6daa3dc2557e078c7b628dbd526b9240b8901404c916b97bd390590d6075b2cef26643a98eba23293470eb2e542c4f6bb56dc39a9d88d19cde1e410a111c5f6e646a1886c01100e073aababa56e2ffa8a87296d0f6a56845a3676917801b83a2e8a1b3d895e37d3f9d59ca3184949f15c295a85d577b2e9e5625fe9f1a104e6aafbb3616744773f48772548250e9a0eb9f5b3084a5cf26feb746a822bb5fbb7465d133e3435c614d05d86d574e1fb7c84a7209361c5e4c9335e1c53619a6066b3beadec2046e9e9a60aaf2e16f349fa1f693b44ed4479e68d211965ac643f8d2e60fd5dc00d5fce1612289fbe0e7a00e6689df4aecddfe453fb1d3a50d304c8b2f4c17223d9c85e38979a7745f119a9f0e71d6ea9120d2e6fd7530590e50891fc0514fdecad542cd3baaa7a00184172552fac9749a69bf7f6f63ee34f4c05c342521df69bbc34a0f4f7def17ea2f0830a55872515929f4605cf3508cc8c48d7960bc49f168cd801f76133c2080b1cc5be98bf8644b651fad74ab6c1a8c4b2cd15596c720641174f5abc9305e8f51d7d07e3f0ce3431a4b2df71a6047acb28a802ca2cb54560066f60f93025c87dc41a29744838239e116b25b351010c482aab3c05c19d4593604223fe6f845cf6c22d6ce1e2452cbd1c19163889e4b3f1adac55af085c1916cf7286b6681db47f53172eb865ca039819877c86316d655fe17c5544ad3a6902c46f333851252c9e57033b220539459cc370657e5406d34490a1c5a33cabb0fdee41c8d387cf643a60f1d52b176f5f1031359faeb2b29ea9220bf1a69c127751960ec80b6dfc01e61927e2854e6af457b8e4273e8940a2d6944b8e5711c4c7312a8a204174ddd5c545a3b3330087a3b4f11763e7ada0ebdedb90ceacca92ded66d828542d42f916bc79796abadc63276763d15da9744311fd4ec9e88d11b08a7105cb7962ff109eaa695b17c0ba6a9988290b1941a15282d875e2cd84651a77c568283bba4815dad6b8a76ac92279a6c7f95cfac51515b3ad3811a8209817ff523e8f81a3e3626fb66d96da1713eecfe534eb7cc42af1534779c8acccda32fb5b4078825a45f886bd9cbc7bedc6b2944c38d603ff75dec371d6c97c081b579de215e541ea5effa0c1d59a2a371168848ff6d9a6f80249c4016e700d17541a87e20abcd8733f927c44dbc5066ff40c68dcf3044679f333b9b7353234dff479d065335bbe9f089d6653a73cfd7c86744e546f64593858a5a2b5e2f42c4e24f6deb81bbe32938aef92e45245a1cf5aec8a85f1f5b1134be5afa21e3aa345b511416de19e32f8d17ccba3ec432a8894f00e75a14c7ae64698cd6ef91b7163d3888705ffc206336621616d00846fb5b41b3a361b5916f3822b24bc1551242192a2e91c176b2ba502c68386ae8461294da7524603d5434aac857de59ac5b59c8d621a5b2673af10e1c19a62f1213a9bb8b1aaabbe0d651aa3639868bb4ac4b4ae928e516731a829b38eaa097ea733bb1fc7297bc1c72c66027306eac99ee305bd1f52a6a340f578512a38d2d5f45811f1ed4b80769c1b2ee67607c840a631455ac3f21f880e2c22a2c1c49df475b83e2524c869bf155f8adef1564fbaba5940bbab3774a299b8835a5e4479f26a148e5df77314bf02ebcae32b8bcf8f0940ad847feb42f397227e6a3d51b562c83baaf8e5c038e87341557dea23b082b3f5f04f432b275feb46c00527e2426e90a9d21e86ff9f29290f1312bceba49257111271534d0a18e7508f5d1ad8bc3912e39da6ca36a8024a03b0376711301b6f2253f6bbd9f19002717e9b4b7c27f04bc7ac2eb9a55e80ba76b208c7a4807a35063ae9d7451bc24daaa0a752128c29c40880a9297dc414d39dfbe7180f5e18b26b1bc1ab6a8f8ae62086397d775f23d3495d979e04d9e6d4dfd50296a75c632e2b5246de87f6df2b8b0df35a038c72e6eaa1878d337dfd514fc2e2a7af9d10bbfca90f7925b41317eceeac3260093358c378f06af6f4a92a5e833b9c19963fe1587f5bb23e2c054e2fa38e23319aad264ee5af38aa7a8353eaf3787ac40fd1bc616f06dc9a362726a503abc2aba858292da11af494b2ddab8c26ce59e724b67b07e14217ac8bf2d67ed240c1582e18d615c6009e5c72d6a8ef82c86600d36e40dc971f0c7ef2dc88404d38daac2242b64654bcdbf862d9ff4e9e836666aa9a76f470d1455c4a8df81711ffb5de7f5ab475eba13383e06bfb7652d16ec7c37ce95270ba8710b68a402adae54498fc5e6e90f87e1caaae6becd217149af1b0e3d71ee0d60c4a3c0ece0b38cd8048a510f63c31f3ab9eb55fccef56c600d465283899dd63f042950d0a03b9684e98ad0162e07ab5d2afcb94c25b7baba54fae4295b097a85fcd740f2ba1d4fdc05e61b36a0910f313101bfb2ae1d201882274d4065c7b8aab76f0ff1a8219f4a05e37425b5761234842fa06b2f4ee542e93e7d8f20aecc82b792698476243e1856fedaeb8a7f5f152a2b0a2a8169573c3f4a0a0479595bf4111c99a8e2954ebc9b60e1d90e14ec83a2ec5e78ef7523dfc98507762cdc5dd7e78dd6190b818040ba9d2f01401fd304b203cfcaf3680127c65e8eaa51ac9d076c02cad8a8748197774f3e4548c33b7e586d973fae53a4df9502a543082dc8bf01e24b6d11a5663aea5aca6edf7a82d06c1c4e57286482661e25d865463cb6162268426da1ced0790f15f06a030234c3fcef95582014d6211d3bacf5da8a8eda61786189ac5148946db0b0c3902c3f680fece487dc6973a9725dc88f6c50a899d1336a46bfa59556848452dff88c108eb7be8ef802cd26664348cb097cf4ceaa7e9b646a2ce0dcd1223c2396f49ca0e82a0604120cb068bea222cad16ab6243bc533a4fe11c07a5b5120ed110414af8393c04d3e4f5ae5b29c4882f68cc00ca94abb18684ed7eaf766d485aec99e464ff666ab9705ae365e5c76a9a9e58da902cb091f313ba84b9a4a7a1882d2a65ff7de1df7418055f4d899513f214c0cbd7e262858de1b45940f35f39756e381e79173c34de8156fa87b627832ef63afe9109fd91f03d35270f2f4aca1116931372ca85360ead62cc29adf5a067c6eebcf47f8ad2d143fc75249c2c25f4b0d1dfb633e3dafe01649d8b456973979e23dbfae11b834e84605ea1df7a3402835cf901126f60abfcefc52744a1bd7220b2bee83b200c7d0892aa491befa37ef704261a29a81b0fb8957843f0cd1247620460ed7ba9214dd09b982dea13d9d4f27a23890065e074e6216807db2836a92038c6491c1941c3e8873e98690a29da5639670cb2d450debb4e6f5c1e3819f9cf2d067ca6a606be6ce0c7d6a5b57555fed45ecb002c541125958946bc029c3e392a2019dd8cb4cdc3adb61df303981d731cee39587116afa307c8c5b07812f97dcff6d59f168f2d78951e31f07d4d4e6d5c83ee534eb8e9a76a07081c14c05bcae01fa2a094060508c694d073258b0cac25c05c01967486bf61e6ffcae842eddb4f7dbff6e99f09daf1dfe75811d9582d0d1cc45772b51ec6e10580fa30000000044c8301cf5a44217559ab0fdd870a5a2ba08c546d41db6b52ada425a93b29bdc7b6f29659201260456048e039bc65aad564beb8c81a9805bcf965bcf15baa222e4e2c643240be2eaf3c6e3434422d544e68ae8027774a7664c75d1976b71a782a668a2904f44b2750d8e0e5bd02d6c174b7d0769afcfdb4e1011898ef19b559fb71d1f9dd5e76d67a8931c67079c14eca9ea5cc0c0439847109f1d4011869b0f939b0f944f148f50df371ea2bee7057878bcaa2d566e3b4eb79d19bedb4e922370521393c60020aef08928882970b47e801b9686a85e382a62443eb7a4b5d62a99735a1a7b266f0408389e791e3fb09ce32b2c30420499b36ce8e4b119819b62f6d85400fd0cfb2a09ca6f40cc6d30bec16f332b5f6191885ef1cb3b9d5ba361a47e0f0a3843b0a40cd2ec540412fdafc28dc8099c74ef8af1d79a1a8e8a277003685192a8e99afd2e13a845292fa8d5c0bc90c142f93b6c28b99404a0a95d994da21250fb22ddd37c5272b52fc645810a9411bc8c911204a4efe031a6dc3556ed996655d10a3a6ce8f15e6ee5ac024549091755b34b6d6a8418250d251101d482286f78212e33886610d3896dd53e8409e57dcc2ccf03131d7a88617af119b3844259a69c824309abf54c1760e408da11a6050f199052290750ad1fcdbaaeebbaaeeb3a1eff03e8811881809a0fe5eb306b78c00e4a254ecdca9772fe60a654408d06a47440cd05116ae616aa2665046a38ccf038a264e86a73ca4b9967861800cb016a7fe386a9728a812a19500b9a609094260420c99272872425044c54806725e6abcc909194b876653e4da9b20035a372c68f13aae01083069825495e18e93d9aa2f450fe8c0ba4e810228b121a12e527866ee401e5ec4cb928235484ca141746dde8c8938fe19316509b4d93872c357c90a166a41cfa1d1aa54d0d0633a50ae5d4624188da87f1c8bc15259306593997d4cacc1cb490a1928254c9a4acb5b0964329a2e67ac156de1917d8b88490c2cc8626193e656674a3b1c654ce3035d4b6b450fe0f0c2505784eed0b102595d2c9d74e285fb5149ca0754035eb910313a232555ccf14956e444259c2e7544aa0c6a25641ed6ddcd4e60bffc3c4e2746b40ed8fa44cdb192148509ce7f1744fea4b67adb65686e7793b4ba4a23e089518a4138568dbd1104cfa6be500a551ead94a27fd2cb6521f0060467f65599e35f81cc09f7382167682feb08f769c8d1960ec730919a63e0300ce39573419bca8a2b149e648ff0e014d726ccd9021f2f3e64b5065b92e6bf05f3950b9e5381637d2bea27b9a039c7409199e9af3e19f262c8d593b8ea0e3fcce7559878ff408be779cf3f11c05b5cf51d02d16e3fa7d5acf0268ca672531a21b79684373b40bc733a905555b8ee3382e64317e218bf92af0119000377af2d90d6084713d2d2880f9d14ac700e8e7340260057a5a10d358c7c352db686e03b5d65a6bad754408f5c66687489adcdb86dfc444e8370366e0bbb8f5b42100b4e62981fb700b7cd4020a819a9bef7b3d00dcdba541007e1f8d0e4b97cabab7b77793a8ac77fccbf9cb63c7f3ec4ffc489260cc33cff332adafeebd37cfaceb45dc0045264d451634e5f3c6d227429a37a2222d2276d3e9be11f13cf971449df65702be6b4a8b4bf67603861b2cd818938ac70a3b104902c60521dc0d2929a9aaaecfdb8da539ffe7ffd7d071246dfabcdd409af373fda729f4cf18ed355730a56bad1c05a55d174b3f127ff9c8fff951ae5a1859f9ffff7fb56bd27a73d6de6e04756bad75bae113fab8d1627399126de82eddde869c86985425f071702ea8961a6912a772fc4915377de33ce03624a4d73e6f4327f4f0470fcd24c218a13343412a0cb5d853bbca4b98430fa10e39e80065d3e064db600ab9a88014642b49f2d1218e6043cc51c21852f2cc40b50398b02a4b68260a880d3f326c2c4a6847422d436a9020c28eeda4dc446a31c2a89a4f7843102910838316a51d361051f68ba63069c90f0b620d14c41d20418e786e8434d8903165e367039d49610cd50f3b569448d9456ac00186508c4d29053b8709a10d3c421f70e8a021c2a801b459a811c29e21153e750965e041dc818308e4b47b9a84532e84608a8835a51de523449223a452838a906c4b09ed6c13ca84247ce981e54685e969470ce10a49b6cdc81321210b235015ed16b5ed038d99e882468f28a32a1c214c68820f5ba6431194183483f8e2051b565881080a3ff617a34dc290d40c5a0f335c943113a60044105bc45409c7dc008606d1e886a48532296c2825402185588836d28c5d838c17473258843190115970d9e1cabe61ca2e9f846498882520d9b254e484137a846144d85e8444192d28e4416b115a99da495ef6ac872d398834284b9cf860aa4185a320e12da98a0e3336c2c480b193c4e03142157e01b363c892254a880dfb8a0ce1192544fa1e7941df2122cf8f0dc3d1e681481ca211be300b0aabcc76f614aa2061c212b48c50c587941e4f441d4d760ca6adc54868648828f4a3c951988588050d2118414360ec6c2b545dc28837b4ec1eaa389122f63c097968121261125b18c131247cf263473932220242630fc9829ac876c424aa508530a14dcb5eaab289a4883d9ec0d0e40653e8c5c86632a4851fe109479b07d1121a620841413b84a01d17a8c432cc9e41cbfe51450422255c7ab24b68b261308960048521a2093f9c8ea410854c686c324041bb0868274c01151061b696304a952629628c27529a845798ba18d94786842efc08a18e441c443f68fcf022489cbdd8a1412523cc0e427f5a764d7f55441e53c22350c21f64d8429688346c220945a6fc08e9248e0c3f7a98e407a993383838b5d6fa83a3d75a712a025aa0a005e5cf3fa8fcc71122f8fa1ea0e307b6ea7f80c90c2aea45abcf9b4f969eaaa0ce850f07c30ec9aa9d3e3c7c82fcf8147111c46e5db3eaf3e663eba4e64250b438436f1f2da375a3872388f321c38eb1fda46fd30baa7ba2c8f4fe7aaef4d818bfc97dde76649de438d706b5dd77cb7dde788afc3fad566e3c50d65aaebbf154f188e91bd623eb1bc491697cac562b10b4f52cb56ed3c37aa2f43f1868eb5cbf31464a46453ba4b0f406f479db41c4abb5e31ed45af557f9ecc63a33ad7650fbfc3868e7f3999f4f1d8ecffe7335e7bfb52399853860efbdf7fbcd351781b9089d53707c6539a62e9c31c699e316a594ba5c2eeae22c976b246946dd62d18cc1d103afaff26ceb5f91ed55a2946959966999a6f47596525949785a73eab978cdbd2359d36f9953c33f1e023629895b039b94c40bb677d757c6da9bcaf6ceb33ccbb33cab4a9a7a4c3b908aaa8ab67403f4792b4a5244a43ba0cf5b118ba2eec1488b659d7cf2479276fc7d23fef9139f4e071ff42f83fab57f32f2470f2889f9ccf813d1cac9fcb2a8394f1b29c5948ee4ffb038f5f8d36a8e8b7be3c7b5a6e11873176c5212342369bb66b1bcee81377b9f53aceec59563a03ff18d3acf3dde719a3378ee75a30660e76a91a6dd982334ab1fa86e3938ab9af4e6e056d7d6d7e93adda7d7cbcb20e5bceb74ad5ca73be53e5da85e3535d1e21d6df2bab17efd68936d82e2e03ed58ce4e7a2b94ede85fa0be55da8fefc5e1a9afbf4259ed626d66bec78e55eefd17cb0dae4791d0f5179cd586db6da68c6fbb4fab94fd76976562d22b114f526140bdad46b4e2d2afa5b11ac02293dad74cfbb4f5ce6f87daabca8e67c45f6b134e57040da902aa6951a2c9ac632e740c5b4529b2cbf4f7fe2efd385ba4f35ca456d4670516a5b515a54acfb7fce5b755d47499ad547699dabd5d66a57a3f5eaf7f18f4fba5a511925298e8e613a1e07a15b1a4a31a7980aad68461dccbd1aded9101bd48c24a594f6728d765c61ee594edace76e3881506e0cdc0722afb139677238a4a734ee1e276c47983bfbce6f5e2a44d41f306b8538ec16b242da5b3ffa7b60e62d8ec2b4c29a674e55118957d89e71f07b334303a8be9bdf76a35f598b1d53a96efcced080fa7e66070c32b4eaad85f4eb1e23a78bc2b8e41c5b33fb1ba239d7d098eff533aab2bc0ea9a92c4d9bc740bfabce958d2f1d3637dde7244e9283b9869dd3675fb48fce65bf195868508c1bd5549ab3749d7f33cefc27432d7e2b8cbf1fbdecdb3f7ee67f072aff7dd4f6996d18c83d22cfb13340b557083cb29bd9996f44f7937d6ee41ded1aabf766fbf3c1b49ca2bade6d82216a5619b6534d33ed33ae5ab157d8da4aea11ca7cffdf71dafa9dc2ed5d738922ab6ce334a69b675f0decbf18ecb60e559b67ace16dd24d5a4b74bb668a9e87e77e719a59cf4c0eb97d351c5ee39c35e5f2aeb977e9e7d89ab625f4faa9334c92e556d9702bcc23e1ab318539eede77f98b70239981884aedcf29b58c56295e65f0f590f9e0dcc9a31780dcc3e62b5baac4a29ebe361eb3724a86e39de5d0a8f3e65ad78cec0f7cfd258adb15e0db056b0b6480c701cc771dcf3f8e51f5fe141ef3e8fe43837aac0ddd62a20cde1f6cb3fe2729d8ed7cef187d9af36a1f457fc7b0ef2150b966276d6cc1db0ac9104398bc562f18ec53bce1a3f3e5774905f1415afe817a662f76fccb3eae115e0531deed3c7711f77c7112966bfe3e5f672bbe295afe81c8cc41e746f767ce6baa27b3015b8776fe5cba292cb34cfb37154c6ddcff2eb8d644d07c12ccb33229d5bea5f02f1790684ad13017c6b4713502ca3318f528e13514b6cedf8d5e3dc37daf1e74bd84fea1548a7483456f997a2184df9072307f4252c87c5e889237f4a2ea24a1c23b5e1ef075b929b932627283bbde86ab3699bb6692e365b929b932627a82c54a12ad4942ccb33305ad76c9b1b1e137fb8dc05a375cdb6b9e1312efa6bb6cd0d8fe55916b2e9265dc36d49b42dcfb24cdb4a5db9cd56a90d83b6bdda3acfa29680f685fa8ff7f38f355a6fc11c7cf047fce5bf5aa7d845eb5cce75f29796a88915f778ed9c50134dd40438621aafb77af3c0ee35b0fd3e9024d82b7d123561f92b51131fffcbbd123501f2cac52dcf2f7747318cfef8ece416bbe8ef36fc2686833bf99d1c318dc63ade413d73e69603c727919f74cb21d42bb749d22b27ea75de4490ca790bfc12c63f5fa2837ae6cc5e922dd51c6fe9c191fcd56a5cea35a9e6d491fc3a18ae4df888e6c23fb874b93897cbc5f18f0b972e17a6b95c2e2cfb1fedfa1f8d35cdd769b44bd3600c8481301006b2658e9cfacbe8f36664b3e4ec977b718cbdc7de63efb1f71e7fc174c88e7f1c84fe30b2768cbdbffc3fee690c5b759c97f1485aad5f98bff4eba55f2ffdc2fca5398aaa359f1debd748aee8afae356f8d282a7e8d28280de62c16d7af166f751c6f912defc547f26968c696d57cd249f548babc174b73974b734b63f5f3d6e87116d600ecab91ecf8e52328ffbc8ed3ffe9a0b5386e61a056abc5f14f0b97ad16fec1b456ab8565ffd3d23887d5d2b3e6600c8481301006f28e20d1fa01fabc1d59e9600bc37440e8d7cb59ebfc91b6e7d9bd5c5faeb3e6f9729dc98c4307e4f55e9c39be6307b56b1284ae7339c867de00e499a3a01a733c5259c7bcd3917c166bc4ad9c716e699b6e7be6ac91d63c858df61bc95187221996e11f5ce21f4cc3328c8b68ceb8c5bdfce239e7170cd30f9108a8f44b9a935246a301000843170000280c0886c342410e0421164cee0314000c689a365c4026250d23511445510cc3300cc33008820008020008c02010c61802723d000a6a9b8dcc186e4bffe3fb4fdfaf9bca47bf4bcd91320bf9f1d0f5f159fa5ad8101ba38f2655d947b54f5d5e9ed3ae7f46cb0f7a3d2c5ac7158a3e99e2c1489b2f256d0ca989984cb813f5fa1c3d8ba414903c4d52524125f03e21e45c2eb89e75be867eba8d3541ea07d1ce73dd85949fdbb973b91812de62398ae7091aa09990b5426d1120221a3a707e1c8d8fcf47c239bb71105da9cbe53dfedd9f28eafc73b801ad076fd6b188f75756c702279fd3974351200aa8ef3361ea1263f4269c9ff05427289479fd78a3e321899542385a781b8857f42b1091bbdf6936d9d9e42824d1af065bfc393cc0003f66a0abac4d51d9e3e5ca8b0d8beeb09b027c1267a0a17661621a1b39a45f746aa9942c8d284597a3b666cd37d71a97b19699878710460018e6f3f66b9d4a384589404288ef7438ed1bf4fc85ee145c911a6c771876aa64fac9ce98903af46075c31cd862b8b1b733ff4de750b87c227894653dc09248cdd004af27ef299c81fbaa3e98815bfedfd1b48bb6f0420682e8430af8b953dab3406ac809f71525eb24213336854504be296a4e76dfc2799702a856e6a01114aea6e2293a1a5bf1d55f0b7b92c5a0f46fbc2319826ec663661891fae9b195847c95839e6036b081b56669729f08d34f7c822bcba9a91105047b5280955ecebfe43c2e8316002fa1b1646a4ed8e107c79e1cf0321aa517ba67f9d19151b6c46dcb6c8f8689d877b2f9bc69a148799db2e71b2e2d59766feeb6651912049309fe8e903016c9cff78c4ec40c19cd473ab158038e012ad1f94196475b1fc4469fb5d6718c3b9a0b7f02322b176a5f05f2d47f4ea038c9565a7a56c7077d2241eea8b4b8956b15ba593d00d137e744df6b1f11677877979614e9db64095adcc0cd8b9ec6121f9f37bd870b2af094ff4b7922cb67667951cd0b121009a39a61ebb8df0213196a6c9feae3f749f125956b92eb944edb2ae4fea8740273d78b7c1b8f07db27dd667502b4807b548a67fcbbc3c76bca12f6b6e5bf0998393c5cf0b42abb7b9c3f409d87a09703ed125e8b21a6c794aa794adc63657f3096f0301e3d2a307f035b0f099a6d8261e1d1b018513fe2fad02518982a8d4b5a55425ed685a4cffff87592ff7d9e5e53e1acc48705bafbf117d953213dfe9dccd4783a19f86cd39d5837b5ad6d275bf8a6f543ed949d92a0186053588ce380363ab655bf01d4501a8dbe8841327b1b5e7cd6829f89aae5cfb4985693f003db4b096e6408094d8aafca98d3c1030494a8d9fe0b9ac08443a78e764b7068f97ae767aedfd174236c6895c5a3adc79f261cfcbea4908bed05aa1ad9ef5a6e8361ecf67412baa8fd780280789c9daaf834a94a3b8e398745db7cbb6d338c5d589170423ab5d7d7063c1e0ea3c34161d7bea59afac356102d409200cf4a51537098635f47cf340531e732b96b8d26437c504b4c7ea0b7af91000b6bfed34bcd724ddffd1266bb1d8accbd94c952f6431f335d9a4294b9511247e73fc91b4d65446308fa67f1068f2283e5cd4ff2a3cf84671deb422ddfea0a916cdb93651553b33698954892afc1fbeb76d7cdef3b6198aff353173f59bb14caac93f1c2390d62206a1c8276bedf510cabc12c362986f7c90a8457e666a54f65bc26726ccfef864f4e161004781b4aa4aa470c5553a30879eee947bfd4f05f1cd383105d4a4f471f853818c49339d792e5e297c3af0826da51fc440418ddca167314e778cdfbff1ea1b5d4790d754a5b3c31a07bc4160db0b59c849efa43eaef11c3a64d5b9b3b1a4dd18e36927251006c4eecb92c762935552bc6c1de1798000c3a89a99ca518e094c8a589eb428b0b6e9b0568a79119d0502b980f0d71d584f2f693570621e0e0e448743d28fcce3182bc7573a4fd1d4099589b2f475443f5329b3721c41b18e8a53311a0bee939b4b0a3d978ec54cb0df71d33eb4504ad7ab0b983f6d28326b9546d154d0339b2467e890eb5e765932af06c5aedfd3de27c5f3bfbef8f7ca57aa2eaafaf699fbc89817cd9bd9bd47c61fbc623e24689d4f899b649dd31f7283069d4ee65ca4b1d4f48460dec0c2db0f38d3429809ebfa9456f60ef0287f58871575a0938b082cb7057bc1282bd981b9e9902f2b4577b88d017b13ebd5d2c377f014de0356a6022ca19e503f8818b58b895f5588aa20d33d2cd84cdf0e112b1af278bfa0186cdbdfef40c82139b6e4b5b0370f04c2d605f8bc70a541cc3c2e4fb773c24a81a6e29f556c8b1d3423589ba10302d55724a0e130df0a3676edbb73d4585155013fb6d58c8197733b8e6c2d6a39fceec87c70970ad58d404ea36f5f998242b9d6d8046745631dc84f0a77d7496f73ab586cb0e2855ac4fd4014aada02ca73f6f2bee9724345c4384771fccc976cc9e7decf29e9fdda1575b26dd05401a564f4a690bb971ff7d66d5ff1aabe0737e7eb7c9b4fbbdf8cd12dc8f060672e89ea2b46260ddfbff7a42e84f0cf250cd46024b30d1e2f5b1e21752b08e03877e4a88c1681b9b5fb7f5bb8282ac90f694b79345c1cfc15f13b87688a30dbe84ecb856eda06b707b8df589e6b54d4c2d51939b49fe0bce30dc4a899e79ef6bac3ee8722353a99ef01510f0d1dc4b5bd5ced8f6efb50492f95ddb3ad0ca8065ee4d17731fe4a618a83c1151afd8eb2476f99e6a621856477b804873d38f60e58e5ac03147388b7b63aa80017317421a1a8dba202db9fff721436bd18a5501a068c87df9b72819fea6e87aee222b1100b9a3b50ee85543b9d6e38f96b60d04d25b8841dce2e68833ec68c358ba953ff3bce1724fdf561405193df4d1571e32e6dcd71d51e706c69002dd98a7cdbde2243e9c8eddcd12334b9b6286c7083edd27f2648e3ccfcfbd8a48f5ac89f9c70f557a2a9dc72e8f6630b8fc0887e758890998478626bca34f7520bdc26110f8b7f15759476c8a8f6ddef1d83a242f51b6a00935230d5e77860b62fcdafaf027bc8ef430f8418cc9126e5aed0a0a934aa1cec7471a03e71bfe63da8184089bab18e7f14bae240428f3cc57d801d24395d4ee20a7239e59d1369208942929da3a8936e4c490fcad53c17a40b8c87f38706d64a04b922560ae86063268ba4309132f121b6490b32be37d0b8803641d396ce97656a933634f8201076a80ba20b572031758af09b267250e8dc568709882b29224db6907ad046bb45a03488623742b9c48808323dbcf6085d45611d8d3275d144cdac88cf302be21ac4ea61908c871e96022041ac067819cac2160469b3984a464522afc5ee4f80cd0d2b2a573450233a10bec21580f0313be0c02cfb0b6e346acf24613c5dbd2a9b64f64073ca05540601ab118e81e1c4149bcd64ce68e267268c96e3c5b1688c1b73b2cd009ff71bbd66c39777921cba5cf284cae8f62073115e21a924156dc83a385e4499b44bdcc85843a70bcf0a28906288294c79294eaa11eda3dd594e04541e9cb8a44f206a3083c2d9862c131ddf97029a53deb0008d4dcd054ee09500ffb1c08902d77ebe21888cd69a9d74613d499af2f110a1313450113ee21eaa1d805a7ae3feb4bc9424403fdb19f2d7481841fc213a1531fdfd0420a5ff8526e0f11320b1e6be37a1927356146232310fe9139351799c08e9a1475f2d1b5393f809a8f70e1cc85a610c523470024b831297e77e8646fe4d25d7cfe0f1aa83f0294225c7c2747f0e0db7c7f3ea2cf48a45c16fdba2540dd8132626e8931b88fd0641e3c306816c6b78a2d924e24b342e848798b68b0bacf741f42e0b831b95860453d1607778ab4ddf95e5cf42b11778a306620dcbd64b6bcf230f44da233f151efe2fcc258bed0668635e5f7513c45462f587bd4f645d657ac6f30e31514044dabfb788afdf4c4eea0de145abcc19dfc764eda1a715241cf2e0ab045fba8e294bb8a6c92160ee79b567a8c75a1819a9fcfb1f526958fb362ab1279e3921a46d360a56e41569ffe46ec7c8ca638747df6c25cf39e35366be10d81834602b2f516cbc13d6f54e2ae8ab1abe53e81b1ecf5d6cab6114fda37a60bff3693542ccafc88bcd7a02276c3397ecb0c682dad6c270d90008a0b8e3ca759ffb04cc827c135829772637977247a37e9dca834dbb683bb5b353b3fc240bdbb4452750113f960b5cb5057328779c66d416a0656ec6c7ee4720d5efb0c9f0faf50cfcb08987d035cf89c7f67b708616fb8ab45249de58e56fc598ac96f5c4cfb915ff9becce5bdcdcd1a1e40d6f0dec1e4c2ef5e52c21742d5dc3bd3574861c18aafd3d0e428e5ca33cd530f1a7b54c9908295312e5160cf002441e2f0b4f5398dbc4d1ca668362b96bd3277d582159ad7f306920fabeb24013de9c5c18eac2b286172908ff52aa78a7aecef18c2637a396ff98ee0735fc2fb144b052fea8b6b1805bdce0b828b682fc851e576bcfdd0b560472afc80b982682f1a03b920bb3cb2a4f60b0548ff90c1f1a41f7d4039a8cb2c52129dc061a68e91073ca020f1460ec0fb6b7b472bc4275567031680327176fc67961120b5e057c8ac0b859b032e2f22958e644d2fdceb5eb000064c36d00690bec8b08f6ca55be3be353b50baf84473ae7b1a8d32df8e44c1fd754fc33a3910b1aa5231003e09ba8ab826b30beef378e38000b8d6bb21437986684941b6524e7631f45362e31c062d05d8ad075b8cc8780491978a9a5164bdaa9c7394ab010b3d2b7e497dd66b9373fc8fb2ffcf396a3f34b00d2636e867b9600a06b2bdeb888d11e06f72685e3919b1819bbbb8b675a77f1f8cd95131d41cacb37fca570d6fab714757ec419ac71c6ddecb1c75d633473d7798a7e8e93d6b88544742e1b08d3b78b5860d52c053695a36e85c9163a095f5c60d01d31a3419585d394a18e0d6488e6eb776ef128df541bb1976309a760d342ecb2608ce89a8e957dc701ccd58504b7e7a8f5bc4452e6a76b11a171b4b5e1a4736daea1447edcab95ac120cbd803016a2e9a4f3810093be3665029c3d1a5f545d88cf069fc19d3d79cbf2d5070d4c2f0c25b9851625af763ef578f1c2480c96becd733a0d100f2460be854abfd46852e9b2aa6f51aec5310063dc99831e1530035db07a20102a17919e5fffe46b1c06b9720af43b63577a15dedc472c2bb5690a00020185fa39668068cba2828992290e08afb2f2b47b84e0b267b21e1e445e8bec2a7dc1c89005e5aa06e0e8eb030344c28a820401c6848a1001aa839b8ccd6b979efabd679bc85d92cdab851d2430230f9d6cb950c85e6095bb53c2ab620134434040608aa73af85ef8ef2cfd6cbc293fcfa9f14274a89973262a7dd61f5c11f3b0b7a899e136351aa3fbab414359cf59251c37c62362352e6fcd812f4271dc110d0cbf23df41fcbf5d828cffc0bc556e1812dec335eb17f2683a4af90795188bbc646c9a9613db35a545983f311ca0fe768bab1f9e418fa4708d89605afd05702f1ed081ca820f9602e9d42289fb6ef238dd08c2b6f30b52ed54e2f4e0869915e798f01c3149eae1a257ff54ac1d075dc88ca768a2881e0bc38712b3d561d883e5b0b9f1af543640ede3cbeab58a951c846cfe0ffbe7867a4119f7f1b245fd988d3373783862f9066c2529aabab0dc9a02454101d88f79cb4d5f60dc32cd907feab74acf441012288d9a5128650ab576bcba1a3244c9d92a36d659f33a1a8d90e7decb282efd121b7afe86a3110c7d66f5b2c9d95e89db185baf538b8de3d21fc004ad5437cf7b8b97fb6fc06ab91a5fad80d1806402f9b3a90f60ffe8ca0507f9a3265c680f40c075b2802f487b65821078d4f98a07088f980e1151439e0d74e2b6194b2a08361502b4ab49361c914f2029d3b299c21b634a7e7960c907e0b25e34f4448d2800f6d27e2797dfd40b9c766257d3c66031f4bc6df74dcd8da04551b133a0a757828c49cfd98e8325e8787fb7a282defd0f32bb2a1ceda2b2e8b60f1a3890edc7844cf25dc50439087bb2fe790e82a7741173d76ef805ddc1ba31bb4f88a78c0ddaf8be0e127f059c3bfeb110c1fcfb402d7126007b425a1582c40e1e110341721eee38ead5eef1e6f1db0bd02bc363fd0a8f0756610a792bb96da8f11f91b2823e2e3b3f2f63533b66906bbc7a19a06d8f72a7a0a854c60d21245de2fc9a9bcd429c166587d5f346019a418677e04cf4cddf01e3c1d735ea237133297a86bafcc7f29a1f12b9968a885b4d0c141ac6a209cfc54683ededbee3d24d2f770d0bda23947e82417b43f1a874f63de8f0ecc3f397da24b0842724121dd7f309d6682909a312bfb58112eb7a0880c13b954e01f2763ac06870acdfa7c7fbe9cfe91328d85d33cda84611ea3a7b8a4d0267856fd0926b8613893df5850d4bac7c50b4966f0906cb56ad42d1b003a7f2bd38763c2b0bdb65afa50c6596fb2d38c31af8a099726e5d7c79054251cee9f0f949fe32b908ff6029dc1c82624fd2f73f563631077810637cde1240d87197908613e843fd6901cb4deb42598b2be0a0ae0371167478550f8701ea63415c214a9031e383d4a3821d3a3aeecb3a56cd2fa5e3bc68759f6828961f32a684effb617319f289411475f2465deecbabeeb1789ea79ccefc05503c41ffb0dc1fd85e831cb6d793c706a8a437c5a935382d5fa1c09fc1658f46d82122a9f310e154037e0851b68fcc170c08ea2cbe77c77fb2b56a4cba7ea2b6db61770c400ae952c83478c5df3583e69ca65470b36ea9cace60e91d4e990b0555df73b08b94276a390374f6328acb77bfebe018ed981ec00297f792c9f851960266bb30b67481e89c3420ba85ed22025fbcbe4f8c5d7b795633d77efe41db3581efc3e4f063c880ddafa299f7e7da5977959a56d77f050b7e8533e39310cfb54721a6d08f6b24e72f700e8aa6f29412669eeb87bfb94cfde97634930b89d4c307014a56756b6424ab15786394404fd7fa027f96cda173870b784914ba0fa506cb8b8c1fe38c55c74dcbd99094f5ce9828d133ed19045ce2b9139f2f3e81ae9eb3a5fd022a7c7715e1690c7e34582995a554c04c946d266b5ebf5ec21270c235f2079c8c9a70d4b6202ddb71e50db00f96c6c4c6b7398dd4325d1f8769ca18cc71f64dac6e92b0b17b7e33366707b4606228b37e1cb2fe67f1bfaedf8248d8ed6a8fed3a1bc03c4871604f0fdb0338e4309922e80ee6b7c9e7a307051d628d1d297ebaef1a9b837f8ce758d894010b56fb4a9c5dd19c3aef1d94fb8c41e369e2139ca750ae2b7e3f379dbc0f2b84d6fa1c3dfe51aef8c0ecf96c6f8ec7b68fa509f413525dadfa1c1d46fc4971f3e63422ec469c68a4f4b59ca06587201a0c649ee38f129ae30d71120a7b74fe2b09088c00b44824ff7a10821ea3269f8a9794ec3905916d768da784c1ed96bd5a978f05f4e783e7c229aebeb55b0575428d9f44f3a0a832acc97cd3a7da4d2f63daf408b51bec6b03010e6d8f0b9140b34a02b0782af9f52bde144ca08eb86982f7d274e5e85cf45e480462501096838872a7c16044800dbe0c53c43fe5f8aa5f5c2228c3aecd0be94c75b2fa1dd64fc8dceef5179fb20921fc05d0d43e10e62b28f736c8d1c3830f5b2df3be0c7b49feefbd737fd14b940af7f8718490f0be2222810d889d4103545f1b1b9d5533c4178c7c486b3a0fafebbd7a740b0e94c0005f34da5fb807c87f9667b0bec78faa30239d88b1365b98099b0360201a9da6a1ad990df6209471c8d582a468625cef97ece84dbb1a34135ccc2f0fbccd88448f80cbe5e885ee3559282348adcf6f3d549a49b05e054cf963d0af5566902a1c2184645134a479219eecbf8154cb6f6c068c365a4989da7d8d06aee6dee65af5cfce5159b8201fbe90eca055fa2b544f964df80047877195ebc0a33804b4571339014883212309ab378af90e9cd86b77c3cd720e82da6f8935b980185259f9d068a3649e0ea01cc4c7a3e8c756b20690bd39c7ec972f8620809146ee58af297dcc31301d36150026645a433f14ef21d7f465d38c2883b2c4ea29400d10f86130b579a51e5f132564d4990008375b1fa1677ebf762943c144547172148b34a6904b8bdad3c5a02805c4e5991e46ad05c860f984941fd509fa40371b534c91de018e68ec9d8a592f2b32b7973916fac2fb4702eb613cb2a60b0a3f852fa78942e2fd3fa16028237098f769accd613f542ca94387185de2a647cb758310f69c93b6b281f2315a47188d5b9d8f16b3dbe04ecb4cc53fb6078be38992828a64d7aab40e4103d2a656da24bdc0075977ad8622f82011435f050ac8f9e947cb54a6abe89af0eb0b9f654d2e7c2cc660fb7f3bc2e577c3256645b27d43544dc0086c15df556f2b97c97107d9865c3a0c13016df578182f24ba307f2c5079ac087c36a588744c23a322a7ebe4a3e4c7d01f7eccaed7daacedca4e01b47c631d84e9e9730b789c57622501ad648a2b3d48385bcdd3534f456300820a8457f20051d84b5cf978232d2f0c71a9d173d89c71a6cb799a3ebc7282516fae5cc7eda21ead7edac638437c4b3027e9f8387d3a8549363bc6b8ee5b59bba7b5094cd6b2797cc0b47e9f03385478fc9de48ae2b186bccb8ef2231a4192efc559423128cf85363bb8ab5fdbd508358223ebbee8303a78be23ab9b8db77de115b75f21cd3e1349c6fdd8217b208bbdf43a5c7f57c7c4a5081b4524292149a8179bb39a7ba2716b37dcaf58a844d55a70a898648d5e8057988ebf9fa0dc3126911d5eb1b8b1a1cca7a469420981b56d466164caae9beb8c0fdbc90496f33395ab4c3de7a98565282384e192812f66adf1ea04548d8e32a4a0a84b8615d6d6301c701af539357955eafbdb1d82660c47f9792b6a999e3fde7f50d5e4a7120b708bdfe9f035e322ca3bbe2554a9ba62c52d6553e83d9adaf5b311b857bdbee70048222f35ba6f219cc6e7dd5ebbb03eeffef75475131f4aeea500f7271396e728bf0819dacf37500b4c64df73d1b9867d9535e6a290282d6ccd272811dfa7d435026eda4325f956a16b19b4d439408139cd891248602f9b07c8bfa5aab979e911a030899de8ea7f17410b8cf9a34c6683c16fa727ccdf1e8389e0db4a6fa3787ac5c044772b7386c531a394c691cc71a4ca07405953201308723504489e9edeef22cef82d7e9db16b3a8d91ce6b030c2e05d35c7b7050b2cb5376e507f13b39f74d9edd1c2f78093b0b9afb96c5c6ff44fe038f7cbcd6414bc1a721181d59e93ee8b3c4e56da0e5abc8906ab03f01e0ebbcca990c473ea4deefaa3f25c0349bb98df20becf945284062b969d18affd93b1232b0ab5c44a4db4bb89f19ff3fb05864210c0566a2696156006232171408e09c0320e12aeb34f5b75b09e3dc6e637635cd357e015d7ebdcc50e23c03b4b02bab5e42e074ed80ce550982842ddccc10e5a843a4cbc71ff982c210f7d386f60f0ed58e3dae42389cad953aa67fe4e0b4ffe3858b6a6352af75ea65a4dc536501a6d79088f43952a1b52c37d764141affdf03c84f956e881a0fd783c2029dbcb8216437de99a886cb044dd4473d7cea2aeefb07f377b166243bf3e1e2d46d0d4c2920906d3ed194fe33f11a185e230622856118c0edcda8236b37fe10d41c33574d51a9190f935c3f7a5d927f804a68f6d4e5439d38d041bbff16d3c9ca5d0472d42ccd5b099822551c5365e07caa7774ae615f6b09942286b621b1fa8ac1855d66db532e0f567d0d5f49b68ad4b1999b4b47c05088eec0c9d95e5a770ba9abc954117c6674932d6ee67234e50e074e00814614a3d67f1acfb69a22d662d2423526b89c2d243485fb48ad42e0e13bc5416ae0c692007994f4e08676e87dd4b6bd655213ca743fcc6edc9d3d3235e62cccc4260928c33cb591bb390a160976f800d1991b18eeecfad9b411d96306b7a06891f0cb6b7ed760f76421bbcb11995b15f4e0368e3c32e3849137003d2af8fb1a2f927d28f306b113096e71f0c8011c1eba609289319d2953d7df1e37e08a150d9f3a1b6ed64a8b9fc2f248742950bfb1686aee6cd612088602a67708cd6823c6103b6ef3009f6746f830f0b11ee2899a068522660d30a2c2e1756731ae62338a7dd838c7524b38d7e05e5111222ddc61c815ea31ed593de09b225fc6c14ff565de4fbe97b568addd63ae123128aa0c359c2e4eac06565dfa06e44c6f89474508499b578a978903035e2e53627706d78f77d9c45570b040304c029e0e8771da083e5bf88506d4ebd489aba9b21aabfd4588c951251552a9cd1608141bee7d4e62f7741bb9b6edcfb50a70139958bc23d580c03697fda6aef932b363e621c8eb12e078306801a4d0cf172aff583423a86dc213a8f0561a804767b0d9c3173c6305df725ab41683d05df6cfc5072de6cd3d2d651addf5e76a8e8da9f28756f237a77741435753e9e887d461eade37aa6940e169b093d773d111738ab6bdd5c971403002f5f49662e7db4e9f3c6ef946b6690381c62bd42fcfd3e9c94d098063a5f81d438c5cd322e05d0141b818a645b26a94afcbdf91b0ed8d716c1f8b184ba2e527e0b8661da6e0d6f8e1464c5cbe50adb3b370e8f610a65427d741ebbde65c4e01a48c8f4c0ff62dbed149b615ef022b90c963b9f438a33ba416a06e4499d8e53c8589638a9c37cb23e0281c28f42384e36bd1eb07b731cd2e264e12355af1796470b72970487234dc1d8b4875a1173fd35876c05b91331f0d8aeebd57a677059cf9f415b8b1c76b0a45d1f7147f286052351209f2d7c0b5a0b34f6a42b370e48a468b4a73a12a2a95b81bd0a1b1c5236b868c890e2dd6ae89088aaab34a7487757668167b11b8b0e362959b37a8bc1f6242839db23484c8def2a38fc24757754e946bb4d66f1bc528c366dfdfd480c9bbd0af4a78699d8b1aef05a48b1ff2684ed476452a3d195442ba5b260e71f99859191e086b248638b4488c64143ba5883ca4ee2d57457fc2dc616ab16288b050b2e15ee5a744491f06ffb16bf85b882629162b1a4c2bb253564e8e6a13f2779b99d85c858745848f7eda07292548ed01536d824437637ea24986b5d516b71b6d85b70abe85401a9f0f45305dc32374f47480e9af20abe15a22ba857a0592c2d3a16af05b48ab416260b9d85755a74a41bca57bbd13c1d0eb9a4953bda026a7692221b079d14e75855d42d9a2d90ae85a1a11bda721a15889e4a2226e906bd5106254cfa9a3bab627731da57fca64154df4262b6c016542ad215b4a8e0b4b809be491b1eb7d00224647237f624e4ad5ec5bea2c3a21e0ba85124ef358e1d12841bdde2862e298936a805540b297b378e4e92ca41cae27616d2271a478d04ee5a2cea15e62b7416d56da1c68b7499c6412485716d0bfa9293b66cf159d4a8428dca24674d6905df0af112d3e957fc1635aab0414972d0942d9a67d1214662deae6f01b59fa4aac68126dd3859159fb3f0544bb2756515388bdd58a4a79d94745db778f22e29b9452b2e4b5e8db798555c5be0a9a8b56055f863d1a97192321b87ecc1a879e1713d15332aea02b21a2137685e2149c6e0f2e01da17a4a4cd4c75d4220507a9215f1d8916f284a72eb78317667b5605b8b8e6187f94a7e7a1a0788168fed7f3d1131c986326d0db4a21f761c9149b8b4859652f246a782fa0aa8b924636d7605bec5c6a265f1b7105b34c5e2069a24e0bcad40c1428d6712c1360e3652cfd9cee2c63fc9d72e0d34e9769bad287cc5530dc96e9355c0b1d054c1b2f0af1859545ba4aaf065491a27bb462983486ab89d159f85b845c52265e197161d1c2418dd537312796d1c1cd2ad9a0d14c9ec5d1a72d27fb71a9d24754b5b3ccb621bfea475933269b959ed0f82309220a2414593a08deb9093bc699dc5cb2e416dc3cd305f4742724db7e8d893906f835808f69ae4d5f88a9aade0b890beddee2d3a649380e94ea82321ba7a85eca18d027276d7989584a68d83fd5e4b81cf1a9914426c6ed60aadb509b6cf0f772a10f1c1a332a30d15dd0ec3396877cfb0224d9d5f05aa16b54f2191a071b890fa9ded4bd000c289b87d3dc9f066839d945f9b7e851aff24950d5d45bb0adf626ca9e17c5f61c34752d1d02db0aaf02cc41694168f2a750c1cbe2c91ebb75d54960babd6d0fa307015aae2bfe80bcd4dcbef9545ce8d82d2f9780f5cfe02926333a10bcb883ddc716c005d7caeec8480216844abe5c1dff28dd24b1dc4a7ce30c6eae0d02184106e595ce952ff17f34fc491ff22b700e8e77539dd5f4f42a5cfe516ca700c7cf6ee5de4eacd224949947c3a41143494369ddfcb1d84e93fc6f9187baf5053b5fe42c820e91692043e20ace6e0761081bf8a536965ccbc79ec5b56f921e3744bc46824c710fe6b801ce303407ef7f78835c8f0bda98c4541c1ec9d9922df90876d5a03b094d5388002682b5f84988a40de5c8118c44162bee7a13467b4fc81f3e6da5a587887923445c2fea0b5983cb1a141fe2e4717afc59a13ac3c5ffac785653a1a0eea9f3128af83d290836c588693cccc699939e999c2a457fec8f64cdd4618736f906d462a3f607d814b5f81b3f13d66d59c0d2f1a91d402d47b1581cbdef453c6c586462161351a96a56345cd4077f3750d9a45a43959bc64fe9bb1d0a0929358a9871944cc804bebd2410a4e91acc020acd57ea716fccac0e79c284aec52f43dfdc42a01a334746429c49bae726a347f282b8eb46eb6f51f54a298e72a4f213e7b80a10e80075330fbc564f8df3eef71a92fb20415b902cad31bf4553a84c7f160a1ddeb1deec17ffd59a0117c33d2df4602b111c80f95309a284960ac0ab6e6f6aaf4daf2ee426c5c6408c1c87c05b24421a481f897f259fe1a9e72aa87d1682203d6ed190953217041754e9092af5182c74311809c27e1be9a67eb506b5b74165cf173755817819e9023aa5e779fca90c7a8c3197e3703a750d5b61e0514bf0ca3d342649f0ccf69386803d54fed7d90858d77b2a87051b40535cb9ea3b544cab124cda817ecb738bd04c8d8e50d6ef0d1229ee3084b517fd40b89ad2829f18bdc179f82dfdf2692102091c282df3aa0841350eb3c71b0d7b2089ba38928a1d3e2ab076519d90666079dfd41f65469a0eac9e3073d6cb3539dfcbd128bfcf5d218f40bec2545785a498910641dcadfd6442828c9847741d6ac548724a509efdf950fa603362e126cad60c78231eb6bec6c0b8a52916358a5244abd7078940abde6d037730cc6f310f113bca2f0ed9807a5bad2237f6da1c266c45c1f2e4b693d7f49d52afe4c672a8d7ed506ea3d1918a122c8561816374d8abcd98467c95ff22c43a0ccdf87d1e2044f400e531fb7c2e2c32df694c96feadda4c79dbfad6645731b3677775ee846e599ebc14874aaa5f94c1d21aad8566b2a405c2fab6abe603a73c6f7341e48b73052cc376c1fe8e617109daf7378c653df7b6b8be8f433713c139d7e66305a241828029bee1145465de43e5308ef2149cb1909a55618a700871b8a767f07bfe08ea5fde832cb3fec1dac4c1d58ab8bfb416b82a96d147ca0ce8b45de704ed47723b8483166f748b2adfb4596f1b838fa3d8c0c4e03fa215a6a5c4016d6a60d9d35c27473b419ed92b0dd585d575cc045bb3b66a6a966ac657422f1f607453175ce6863968a35c7bc9777f1736cbdfc80543257a998c6c1e70b2088150167b40dcbc088ffb54548c0426b5434b196104224b27b73e50e7e0694068c06b387a6ff6b5d39ede0120ded1217e4025cdfde79e7bd57c313fb994d3cafe7b3eb66d98cf69fcfe769a0fee49493afb97ff257a7f31ecfc907777017447b3a09e8ce96656fc3352ccb762cdd7b6992f82023205965add5567949979aedafebaa15c7482446095c1fef154b75462a670d30100b707dfbdb7befcedb81a2684a23608661da73279e9e538b5dcde7b70cdb4e7610dd79bacd743e45c6d7dcc7fe3ef6323e0b42447f6474309e749e871b3ee982e84f27018d3ddb964d6ddbe0679d0b5fe0cfbcd2bfd4e17ca832778841a25792945242e8c15a83e8e936644627a57452297330d6f0532247d3b711640459e263cfa284c408c402ac816280e13f9e0fa36108e6ff29a31094524aa5ec48d99112bf863bb2133bb2d3e9c80e9d9183e73bad156a6bbf73e7f6747d1b5ee3679226c9c1c979018e86df115ce8794416a84a6107ec435fe1362cbd0e4499eb2b110132ef0ba537233b09a597836d605f82a406488aa0ecd390c9477d1aa9ebcc6a75ec7134c006ac66d96758ad58ad17eb30c730af8efd25cae8a061b3629473aae786ab972ed41fa5e2ea412932fb5005857535488fc2482f3e8db4ddc6de6a31cab7e106e952ebd3408d7d2663ccda6b91ce2bbdecb34c6615467a18f695824080af8cf35791527635a3d169b41be7306b902e1bd7fa344a9610197d128e066458f658d623eb2a50c56ac9e751924272d329722252b236241e44db0f1d7a5400070ad8e00d3f56a6693283b244b33b9d73c648639ca50f8710b0a4b6f9670f8a19f6fe11cb8cdc8f1decba1c12332c62d8e390731c026569db7248c44adab36c843764c5c741cec49fc1a40d86fdb015c0210c1c9a2f6d0858acea2727582119a2a3151a7e3350a233090a02efebb307d7001cd24382443c7d8898e290483a19754087fb2e29e0374060fbd706e0e8c131e007bc43299e678c9dc7a6cc3edd8e272d1f66dd0c9e0e7e0f6809ecb903dadfc8d5237f2b9ccddde98c13e74ece39f3f8f46d47a40ef201d3b7e12fa11c66e86f3af3c55eebe836a3514ae9e3d9ed1f7a8a74e73dd83dddf6709b50cfcd8d5c1fb11c922e565e1b3de07d658a3fd4fb3acd349bd97fdb6143362b64816ffde4071664f271bfde4eea0c440df2017bbe87a66fed3cfd3bafe766cd1f74034c3f43e168d88713a35896659e14fc359eb78fb37dcff541f4bd9e4e0ba2b7ae87a6350cce0dcbb3466b43f488cf25def8d70f89727ddd66eed77b6fbc571663846f7febb2eebad16e3331deec6117df6af76f47358c30d26d067617c2ace3af9cc10e34c23ff4868ff76f950cbe6639140d6dd6304809de346a682a3d4a51e40bc4d765461878c3148a7cb1e12bf4e96f189d27087bfb0d506511c757977b3dbd386e246156d870830622026fa892807471678900e7cb2a2809867f63fe0f89a2e908df6197b197298375b75215d097f5af6b5f7615d65a3fab7546beac9dcd3aa8cd8fc3e0388ee38208228319449a734e381d44c2fbd290906a199d9041f9c560a5e10783d60703283e1920f1c9c046d3344d73bfaecdb9cd6079f7d0b40eba600ccb1a6e9d7675d8a5fdd651ad7136dc068137a7df632086fe68f8c500474b193a82446e33f1b71b20206a56b5209abef75ffac578d8c7b285d005d7c7d29335a39c00cfcb04064834fd0f06456030e46297587aae49cf2776ecffd2d05c83d5dcc79ed28c37c7cd88ce494e079c9c5b9b770df6f73b62c9114a7c5fbdd1d01cd8cbefa8be179cfa4a971ca4be3006662cd6486cda1bf5674c400e516bdf74c031c6d0d7d3941cf192ba6e396e1735d6499dcd8c074ce9eb33ecc62d47d431cf28b0cd8e5991417984066805d8aa6c33d2b7fa1746b12e7c81ef753954b12d90b08746350d339419a804f86509cb0fbdceb3d3f303514a996be4cf0932018610c226b0b4d045601009709e3106159c101a68365a53024a410689349b2f6c401fb021c285920f054ff85280c447448c23454040a4a2117b8d5ec6d22ccb1b890e118b44226e3b24667c81771c423b0f72c5e3103006465118d453f3872254bad3f02b020993f6cf20cda8fc48b366236f0f9788a78b5b176d641cc91952c03bf6a05dc33dbcddb66dcb299dafd99e7e677bfa5bd57ee8acb369590f4d63d9de0ca549935e850caa641804c201de9e9ef3358cc26d1ad8bd7f5d97e76ba847765bd3527b0cf374577a327bb86941b4d6f5d074765f6236fcba241f018889983140829ac09b0bd5c0cda06174cac614f0e6e07358e54a803e106d4c30638c93870309992e60c2880d0ea49448f85c20c6870228ae26f3e1cdb2ee422d035a481cf9b2256f24121803b5dcf3d2e9d947d424193280e25b52848a1ac74186a3e7cb1e7c7abeec014acfa73d58512d7651673be4cb07e2c36a4dbe3ffd8cfef061f5852cf1bd6e3be84fe931de8dc77c99c3214bfcd9c4c69fa025607f286be83b01cf8fb376d85f9d0f0f9677bcf62b8d3356810bedef592cd1f1ab121dbf2e19a25fd0f09bc20bbd7fc4eb77fcfbd98d353e8e51fb5b3f76da5fa8c1abdbd7cfeb3331b43fa7451acfd7f7749db71df6377bdb798ff6d78df88eed205367baeda8105a38fd6b4dfcfa36ef48b71cf16b9dfe90c6da8fdb8d1ad283ff23d6f0e1d1f1e6400c225a0a9b8f8b2c96488144e6a9215d760dedb30d675fb36e7bcfd76e7bcfd6a968addb94d6ac5a0c080dfd83d3dbff981a731b0dee4296ed6fd7f9acc39fcedf4ed4d8b6e37aadc3b61df5f3dd519fe60fbe301893830f0cd4f73c90a92bd5326d47ede87b687dfa9ecfe85f4a61e729842cdb67ddf59eee3eedb6ef742a7acb706e3bead5a477a1a6144b927d363abedc018d5d0dad4686fb837cfd0877d435f2e9571e33d7c41df165ae21bd28a1c085ce1a7e3bf852e80399da87474f38afcfae88451aed15ff66a8a26b4817aae918a33b087680d2311a7e51883185165350a1614c0ef12164a95ff30ea2b7fd2aedd4f16b85428570d6802cf099c88f39e6dba79937a286f0696276887d103d3390c883d659738d4bf943ad13cb344dfb2d4a6cc62d4bd9344dc37ed3321df5319a1a5bdcf811b57dd011f09d7fa3e022cb2696bd16b128e3bc91a23d90b9b38fd8bdf72f1f71479681c49981444dbf6e9e6fc0aff18ad1d68f30ba10e4fb14565abee7687945ed1e180335cc3448b2afac7947cd6342ffe9f9ca20f3faf0a4fde716252dffd2c148fb4f28723cf7fdefdb8d2605c8c43ec2f7e1d130675f371ef46ddecea33ecc40a2def573c8817506e45f6faf9797ddf57fe4141d7ebddc41c76e6e39e67b9e578cfa6e3e3c3a03908587f3907f4d2071bbd9e61af9b986fa887ae68bc579832cceb72b6dbf42f1418133b57b31e6b890f44258d3108f1874cc33804061e010132c85f6cb090d57fc370d311ac4d025be5f68e9c663fefd995d0f72e10b7cd129339028a50b5fc418eecb2e47fdfbbed9bc2590b8e347d4b326c9a074f111415de02dff0289daf39500164238220858d090459321543431f283228e788208fe44160ec2e2cb8192cf092620216c35c8c125e38915dcbfb30726c6c8c20745aa9002264432d791219e40c1133f686330410c2300b1e4cb8115a0205c10164f50f104147a7f485be29e6409668004245418c20623900235c25dc171ab261cd724146ac25dc9022414911773202aa80b54bc1af231f739f18920831a680a1cf5c3f7dc0e32c1839ea1e1c784496754dbba941cdb77b24ea7937aeb6860a675fe99dc3a1aa8cd4ede9c66a3829e7f2bc4b61bdb6b52c7ed06a66ddda681baa647fdeded6ff902f52db6cd6c340eb3bf1f738890e5fe8fa92164b9f6958c74d4df0d7234d459bedb8cfdbbcddc97716a710c7d757b072139a4087652d319f59c7b071d1fb3f302b95a66185b826cb14e21c48350880349c1712dc0411125251d4c492595b17b0a9a02cb5905863f1f04043c5d36fd0bc65c3f7f8331765f4db9a8a9a53536e5661d0bd0d4d25f80960fc7f82620265f13453e269280a8c0842802153a40c2a90a4d44461441f235c104e80331f996c8d19a86df125c44110a45c171d1dda3478135e752baf41897c822091531c627e2d76f41d79748ee0de00ad4dba3e943f88223091270056a28700b1a6e392ca0a3f46d86cad8828e119492d261266d2449c3995134944158f9504212b49e5554b4195be00d3f1c11067e94281e65a7428385c50c26ac804a12bcaa70873db68d113e9d50bac0951890935a457a51b4042ce5298efc45832bed1d476a02cb3edd482279f3c6f5ed6f3652c21312356e94807764e9f83b4299f831caf8a194a45468481b1469b305f11e4b075f12221f8a043370dce348b38150d220a474e934082025384eea0c3404a3462bd8b7888c73043de88203f503f4a0deaebd0a385e4425f12607c6c41c0d7fa5e187e4d3d0090d3f258668efb074f11b604cd4fe72bb01b278763c2975779f3ea7bbbbcfbc64088c89930ae805cc74e9fe6eafd59c9ccf90e3e754a807f512221ef9a016e0a84142602d640efd968da595f4621645e0fb201260491a01de1247e2482ea44b2bc6eb772c7935429757458063fc8f713aa8088e9a158378b51b51514944c51bcfdac7d66694cb769cf4ead7bf3aaaabe6990677dff39728133f3483b5d7aaca5a63487a1587fd98c3f46d46be0713bf460d3ad6f7fe6e41e93a7fd2dd8717bce0052f785dbf5b503acf9f74d757ec770bc420063188410c7e30e6b87fcf832d2d28d87f3e9fcfe7f3f9ddb2427769944e463ee93e9e0eb26c1d4eb672028c24b630e20a98962db49041c3cf8a1b197b70495b5abc97991dc9aefe65f7b55744554a0f302625c7189ae62d79c8141df3a996db8d4bcfcfa609fb89844d777d0629a493529791629d99e708b278f6293d6099c3c4ba3d8b6827ed79b367f62fd74c1bd2d6afb986667d95b0eeeeeeeeeeeeeeeeeeeeeea89bc21fa75ab1704237dee94d5e1ab96ac5c26979303ff2d1bd1873dc3f942a19599fe5382d0d45a452c9643a9d6e6e501aa6345cb134841042082584104208a3a99583d362e1ac58aad5a7faa0c3b02e0e6e7132e7378c76c780349dee0d4671a9ff5aaae9a7f8ad538e8e7e92a393249d6489ca4496bff8a36e0a7f9c2ab258baba2c89ee0893b8284b27eb5235f2975608c763fd8a8bf872f839ef43deedd86ca4ca5019aa9041955d5508f87d67f88d0ff09bd3d400d4d334e42dbf6f017e6396df5c8ddf4f80dfde00ec8af5ac006c006c0c56c5c2f0fbe6dfb8fbcdfdefd7d7d337a4ef45e3f5b53d7d85f415d2d86b0cdb5863107be8218d7f7b3a7b9d71d9ca5fa6df0b7fb819dfed150dbd09f857fe4540de17cf9037e60e900d7065b83a94a7c857e45f5c80bc31c79237f735f27e8f00797b03c83ba475907f57f2bed8cb1b7302c89bfb00e4fd316495bc437ab67c45fe8521ef8b73de98ebf2e63edfdcbc80e32ff4e42bf2af0b795f4c236fcc710fcafb6770798728cb57e4df16f2be9885bc31b742dedca3e4fd9e8cbcbd95bfd4d027ef9087f3f6feb94ede9c56b393fc5e8c39ee7ffbed6db9456f27c9f857ba267ce26e1ee5c94c11a5222aa2222aa2a290969928bf17638efbf7bc1d9a32b3e52fb06567cbce969d2d3b5b76b6b4cbd0d3bdf474e9e9d2d3a5a74b4f5abe94a12cf9a190e7fd731cc6176569995af27bb15ac22af6254fef5af25aba57c7ffd25a7721cbbde2dfb8d2b1aa642880121954d91a49bb15260dbf2a78d003d0f0ab62889e3ec0974bf2398231d7378142257173e46484898892764f11e273a3b9f495ed25b5b478de3fc7e1f936a47f294270fc991202bcb31569a4fdb395ffbd1873dcbfe785fc9de42f33ee4b1ad92bb45f293c60bf7a1b991a894a20f07ce81bcd7cea49afbe27bd5068daed019cafd4e76aa534b26e2e808151b4b52a74a3e1a457ed461321cbd4ee3663030f21c021b8be427566350cdb68aab6d9a5691aa66d1bcd46a3d1cfb4281d4e8a423fd3b48d066f345706d176a3d1f6b30b5e515e1dfb347646560804f68fd275901babe9e5ac17d3228c22c628e59c935221586befcd02c3b02c1bc2b66d9d0e0b63fcf91821c6181fa27c4dbeaf89164d92a0254a1819880a4d4c4d4a4d464d8468f99a155e80209b30ef2ab47f840289fff542fb472d80f8b09a066491d7cc368351a280f76bfdd265a3a878d23d8b5fdfc68d35eff67dbaedb81ffd47a40fbb1df7b563ee8876dbb1ed883fb7990b84221a42adbeed229d3ce2fba34817687fa00289861f93151324f4c4999c3e3aa0b7f3f0809e3f8ba8f53131c448a9aa5841ac06d3112bf615d36e482d371d396ebef7e97dd7108a0b97a4e45fff9b83da94fb37a496fadeaff7ab2a0b2ea6e06f6db4fd6bfffa53faf573f2f9601928db8d98d2f7ea6a3e9b8e782fae34a7607f1fde90da7e26b50db7186a9c4aa8061c37e0d043071e484490481729374dbb2e0b1a7d5973dffee6767db9e9881f1322dadfdac772dcb70f377cdd48b3cb19a1d34eaa9353858eefc50f7406371df0ebcbfbd7efa8f7a5adbe1ed357760ac487d510b2f8fff0616fde7207b63be8083fbe9441151a6ae8032db2acc3de359c61d97f5eb8c67f7ad43e3cd2ab4fb37fe6f9c2b9df49725543a5f2d148499496f42164894fa5921be98244a2a412d7dcb3a9cd5cf8a1f2e6fabaddf7a7bee9f09f28e92991dea5a2e174a821a5a13fb354223d9923064db3bc919efc2b07aa638eccf117c9922c95cf0ac380670481cb5cd7e4bb5fb1c27b4f862a420008d100049817603415365c48e5608283c6e700950d29aa08fc0002a0d5047c80c30c96057a50010ec7c7120cb4d0d2c0143ab0007384f040b482c80729462823213e920c12113b289d948c88c2f4311dd1c1099f9280e2c67393e4095407e5440e525b4a0a273eed63925265aa2b9a5861ab58042622eb8aacb8050e702e4e1790452a69d95604e30631a7c61c214b88a8c887247a3485802c92e42425608c24a2244b368031d208136491358031f20864912f4fa016de92c50a578ca82428144a060a85ba99567bcd155064b868d6cb29a594525a6badb5566badb5d6de7befbdf7baae6b659bb9590dcd4218cd539ec49338e24638111abe0b015f9c04efeab2300ed77a99e389423e42a5be297292936826d54cf22baf1051178ca8568b063b08534478fb37450a5899eabdf68331ebf7e61b3f18b3323aadf776d1fab4700b6b5d2d7b73ee07633630f7de5d61e1d26aa5f06f05ff50fcc3fc73ff26adf6c2dcdddd7dce39e79c94524a29adb5d65aebbdf7de7bef9571f2c10508f907533e7221607421b79045b802bedc6857d2a43a9d4ea7d3e98442a15028144a2412894422d1c5f2bdf7e5baeee9c8e9743aa1e0e0e0e0e0e0e06032e2cdcdcd0d2a090a8542a14e74f049abbd3f4530e6122212894422d1754d5aedb5d65a6bedc90763d1462a954aa5523268f7005225857422491247347c69047cb121ab34e1dc16cee1443ff248215942a53ed5ea743a9d4ea7d36ca15028140a85b2015330e5163e41cbf7884422914824ba17c6ba3eabd56ab53a1d399d4e272c4d2693c9648a1e29c327ad28187393a05028140a75eff549ab5dad6aadb5d67af2c157d661060d762e11c7244b42481fa4103030f8710bf8a283539c9b8bc229ee7b95b772d6e9743a9d4ea7d96ab55a3a5c1b8d68f91b2a5eb5544bbfbb9528128944229108bbe1dff77ddff79d8e9c4ea7d3dde44aca38f1495b30c6befcd9c56ccdd66ccdd66c596bad4f5a4522914824a294524a29ce585edd7c73737373731359f10a0d2313299cd0137e4c02bec49b3965ea15e11147fa9267a2acd3e9743a9d4e3757689a37fee0bf6e2311b47c9796cf1ab1930fbe2118ed445997c62ec61cf76f73cc228cf9a42718538f9c4ea7d3e9547355d55aab4f7777779f73ce3927cefb8a44379b4c2693c9648a38110746a3414b11d5a049533c4123221150080da30f508886af01e832f05e8c39eedf8b386e8b80b7d85c176068f9d7105a7e96002d4584efc598e3fe639e2d8c05638a405994455994455994524aa94f777777bf355ff96693c964329968d062b414119671f21f8cd5128c992fbf12015faeab85bc3f9f1933b26ad7d29c7664473863d973cd1bdbccfa9b63a694524a69adb5d65aadb5d65a7befbdf7deebbaaeebba12a081c6c03156c3c8b0d2cdd0f0822f9e87efc995095c91dfb9eef6c1da8cd5aeaa956b75f3f61eb48cb9aa9280b7ad2a140a8542a1502291482412f917a38950b375a2ac12680c6c47f762ec76a4adae2a7fb97756d5acaa595594524a29a52ccaa22ccaa22c3b5bd7755dd7856118866118dcee0559ae6b2b9d309a7f17d23882e3db140d7239c502755330e726e298320f0cdb03ae4ca6a281182a9dded91b0840865d777636070440338f6b8185155064d4cef6c0ca03e0051768a4806c67ef3080154f0001884105867c3b3b88ce08105fce11a484e19fa6fd55c36af7b3db712ca7f080218dfb46a33df5a4e730d33fab95baf6d9d4bc6a557b6da3a1da671567f0eb4643b5f699d5ae4bd3a457b5cfae866197966598a66d34db775edb681c4689cdce0ed2e9b08d46cb343617c0c0da6f345ade6e5c0f6a1b4d8597f63664dc720a10b8e68dcc8fd8a6a1f7bd3a65978002a5962204d31aaacc5172c025432fcb5762378b687f6aa2d5a6ded044ed1b85a4fdef4613b58d7694142178e394486f8c85ad46d8a37294930ff6a8608ca5b9341e8db6af700acac40ecb4b1d969b3a2c3f75587ed361a13aac548795f2947c85757170cb53caf1945ce429f9a8e4248f4a9e503c2a7923c3a3429d7854afddf3a856235f712ccafb4958c6a38c47ee2bf795fbca7de5ee2bf7955bb76eddba75ebd65530663e4e394e394e394eb9e314b6f2421eb6d238e52bfe598a0deeb05625edd153b272254d2aedd2a31a69773ca21127de4c5f4d195bd24e6dc9736cb7714afbd7141bdb6d6ca5fd2b944149754e9a64584b7b8a10bcad29e5071cdf864c1101de765f6bf297f9fe79db9376933561ad784371561f4a3422954ca7508ed77a1c8e8557572533a1359d6e50290cdc8846a412bd41a5e22ab252a211a9643a95ae54b94aa5ba1d9a8d4c87a9e2d21a6802680ca581c2d097df2d302673794f86972618a37d7c082f073d027cc481315b0cbf5bbce7f005c0ef160f761cbef1468719bf5b2008a6401ad005f802e47eb7e88ff7faf3c1f0f336600cfe78618c8c156a48400c0d302f79b7b82060860318a025d45200961a2d0358f104108016151872f72d2fb8402305d4d2d2020b8e72b24287727272727272e2a493936ebb103abe7f1225fb938e7eada22aaaa22aaaa2fabba5d3fea4ab6fadb5d6dadf2d28ddf6279d7df9f7de1ba28fa8d46e97243154430300140013160000281008860322c1609aa639a22a1f14800d6f8a546a58389288c4491083680c116314000240440000640430180501b8b2935b6114a098675414a452b03a0b9e18d70fb96bb191ec9d658996b6ac4f2cdcff62544b18c96e63ef707a2f08fdd292ec19ac8f873cbc63be8814209b51034ae06241c526b0cdb929bad1e04c3fcd9d14c3b37b991eb48c14231864be600a5e8318863b747faa28fd6ba2c7e7af2ffde5e5727a549c939b7bddcf80af4b4ad1651a2923fde6e5e7de1224ff86fb9b72c63b59dcdb174d061a943ffce41816c6a4b6a9b1de67a4816b577a99a59aaec28750ff8664e90a2d272a119532cb9536eea7f1ee3708ce6cbb974a6c3a19f771dcc3db92048016d6a8b7d2121369baf5be992c75c92ed197f805774ddd359657e6e5be7dac1ad96acf34c28aa8ddd94bc303b5937f68d245d5e4bd4bf1d662a1c4ca3a04b10c0e2156ad21c412339458118626dab7504226e5866dcf88a8e1f34a713eb926820f1b9cf9e9b7047d5c8330c3e9cdb2dca264c4193530e1c74ef4345cb11d6f2d097e29d298f00bbfdccec39d34c4e5f4c801ae2fafd937f08dd11313aeb92b0dfbe3662b96c15cde2713f047a812088b894cae7289cba7489f0af661f348c53fa02adb2fc727c51e714a2fd6804445cc261434ae421641a0ecc2bdd68cccb6474389569747390d0ef146bdafc2acd2ef012a7e1a6eb8d936712fe9927870910590ff096634c566451bf876c2eddf0e97054565235918e76406fc905c1505561b4a4f24acc40935398376901b790c120e834be5133ccee9557670a21483f7f32921c69b2fe18920cb52c6849f29cd0f302caa57f29aa2cd7afbd472de7689000aaf96e533ac99914fd5801a27c4488ea7113da8cd7e4ba5a269a1dad664998e1c621c4cac2030a4517d2c41637d7516e4808d3088c80bba387fa411acec3b9c104ea30c4682d5252272838cdc86e04f72434187462e6aa0a10ba62759e681066bb84bd695034b8077bf6127c98689f3903548ff1eb375cbf6364df2c6668885e1a68999017ceb24abc9041cffb177020e08c98902c923c03485993a13a1efa1ad3cf5c50814f71e32e78cc03bb43d43932549a9d55d0f2b59a080a4c304b35e8dfacfee6cc04e0f570d34afd0fbb03ad0037eb06fd11f9339a999dbddda73ae7272be654a302d0a71cb419dc1544a543206258eb09d04d31a4cc2c9341cd030c58f2ed1e8be1c612897fbda7f1e6fe4fc721d967e06fa5fa38a5c246d17d83dd591f7c22456ddca2faca6d51b824194bcc87d188426d68bc50063b36e95515e2ee7a5dfe4c790bbcfafee7732482ad7eb4902aa68f9c963ab740d504ab092e2a1e46ddebf2f7f3db24c2b9c66bc7157ee1eb090a681c58f1eb5205804d11092be56d55bea4206e4b00790a6db9a7b1c153105229c71e4f2f283f8c491ed6c0f0b0c475f393c7030384ae713577df81156044bd152b3166b2582da72c8dc09a471e6a49330645ee331d591af04759014f2edaf9685f9eb6a3e6d57d0c7371054482adfb1ea77fcf65e0e93d93a00c80926d245369449b29975b2d11b654fab730a5bd973ca2133f3ff0f1a35e50800b0e5e98468a7891908d0dfb211d93bede1c003ac2e7f821effae34bbc3f12e86242a8758f6dfe12c2a625be165ee50ef158b1637cbd82c49fb3c0fd191fabf143405f141042448595c4a82324e694a804b3e3da92f426df221e07a6765ce34d78be2c23fbd1d6fee39907ce4d9070131f6b376e9c5ae0837a84f8b3d0add3f232568b5454a9263c919570156dcf1f276bf25d1283603c67e9a4df2872df3a704910634363de75eebd5cb23e4f9bfb2cccf3fc2464a7f67587b3fc79a278355b49615c609cc726e288fbc6a5f514e5096b9c1f3c88bd592734399a8139c59c2debcdc5891f826ba6361e97b533f160dbfc5362149fd2ddec85a04b82a4bb6c535ab6bbf7839ee0bfcf0394e564b61c46a2db0acd64093d51a68582d266f1af8de16514cd3d98e5c74c60cce3431f620e8ef99959d76beeb3b955632ec7b5991eb0230702673647503bbd22b541df854c61936c6c1f9527adc5bbf5a66f7f9701ea375450f8c7c1a6fa5418d6d3e8d74d2bc97b1599a4cbf1ba475356cd36c7935f556862ec3d2e532ac34ae87bee0eacf82ac7c852e5ae182bb1ef7f364fad7014a389d025935e6f97b82608c01a925d6f8a0c75cf9fbac785f916143e98434f166fd74e68a6137f8ec97139b4ede4d7e3e05d26b7d71673d3af7d553163bcc6dceeb8a72272f2502136332fdc031946690a86c4ada129c922f089722b0125c4a12fed7b559f6cb5e77274411b7e0e1d2cf1fc307c4124239805882dae83ea834757a3a256cd63adece2c12be68c900abc504a4ad2ac8deb20f5e562dd22a43ebe98921ea31561608a5ac52d341e312182f12f0af84788d1a3778d6fc744d9a67c23fa9fe4c518533dd0fb9d26191384f200f78ae6433d31a5a333740a4f7961a79f668897612e8d2c8c3603acf6ccd3041ad7293a687ef00ec0c7b41a12f074ec9913e8e9fdb956b722eecaf532e80500364104ac00c428981eb8dd7970a84ea85c6550700650fc0dc63fe8179dc01cb8f5ceadd4b664d85a7e26082255b0b6f628878017c714d4cc71bcfca28d3989665a63bf31a1cca06a28f96b0be8fbe6e30a61500f99c031c9e58f554725f18bf6cfdc83e62d9ed6fe6f347b25a08170c2573ab8ad77ce950323e4ebff112743cdb9ee9de7c46d69dd2cfc761921607aad3d4345d4018cf4828dd9c10070dcb0a0736c28cae7d545cdc9e7b5c8b9a35357fe7641fd63db71956f5c044886ff92582c82adb6737d2eb23b63ad0274db685ac2a2d59f641d9e06b5992bd50999cd16db1a79fb102cb5997fbe53106d04e7ce57a62c8941b62c96117442aadee7e7b3f7b45135156b41359d55235ba3a795fc1dc86a48cbafc482ce73ff694c59990ce516cf9691529fd754d5630c3f285c74e80519c575d02b0b63515a991ed13d3bb79cde84e864ace72334939368fe1c2cfc068c4383d2871c7c0ec65a7042b504979496bf4ada18f8d0be97aff1c38032bb00abc905694f33deffc4b04a0b6e3f3e963a03c8d467ad4041cf87749068c7d70cd39090f844cdbb2517bdc8d1021c09193458e0cf1d39193a51d39f06a51a4d96d9ddfeb704108696661330649adabf924718cababb11e716c53979b2bf65f3b1e21f54aeeea638faf2fb0f6db6f388775c3f2cc0d8cf6bde546963558e3ee0447376f4333728136ba2023a90e299805e0b8b0a0623542a268dce5c25d8e10b4750a9a6bd5acc434e6b0c699d742b14dda9d4daeda58b2d355313253f9c0c20219777360304f088ddd074460141a8bea90bec774eb548b37abc94a69059d5bad41aa49db72102b5f508c2ea6d2a685f3cd4574e1aca29bc7adbd0c5a9c51422a0318c2510a8e64ff4a6618cbf68ccd74944ee0795a16cd849e3658034fc82408bc832516d788845ec3218f764d15f6f35e637a6ace2692c00a071fb8b78dc50bc63eb489affb0823e4a341d4d8ca97797eeb400124e00bc1c6c80ae6457078742a71b672786251a6a875531aa0d5a3a0f4fe1ea797b7f0134a786f1b42f7c64745804b408dd86148be7d8ad0d6d44390e8cc94247b3ba5627c2eadfc94433e314ba32c7f4ccad0179837015e82542bfa911740f26daff0f92a9368e3d4682a3bd59d90075878f6a24a0629e140139358d0a5e629ac4178bfa6602bb0cd99c5e51f5c390e4e8a7173752ed37f668c980ee44959ed6b286fc8d3a9f56907980b33b47e31630fd25def6324cb01a37008983dcc1f20c71de13cea02847c5db3196b172e51ee01e998dbb615a940d3dda7e04319d6d0602d7115d8d2dc8e910aab471be9292164dcf95b655bf98450fd219ad3501d9300246deef30da25c5d2b51d292a8966bf55405d5927c289572561ca2126062a6b24fb00e955a66401cdb8cbd34fbeece68fdb2c1be7f5371854da80d3532bc004c82558f404091aeca805e7fa3288fa1a9463d3c2f38b863d5111691b66eb077241a5485a49eb184819cd7584dfb8f6371fe19b7841a4816c46a1da20e2c79afc0d5f11981fe20dfc8e3fd9f7b07fe2dbb47056fdfd941c4e8ead7d8dcba9423cc555e182077caaf220dd3f2f49a91a4de35116fcf596e0543e9802229a0f9507581201dca996a755135f9aadad3aa2c5fb13a66e90bd6be00969a2af6e77a36266e861a0f363593765f7f23b0d07f02c3c01cb805caa210c01661eefc7758f60e496b833fb2f6eb597845d42f8e1c4e5e30c90023e51e39c067a34cc388223650cc483752fae0d7f8f133d2a735a6634652ae4673401bd0e2cffbf2bee506ce2658739d40c8ef2e9db156a135e50621bd77d989678fad991b18d57f4b8d2c6bb4c6bb0986686af376f4726d77793612dd6f4c508ed0867a572c01cddde8c80bd1e5270664576484e6e5bff4841a739f70a30e5e7364e187bdd3755a978fffa7049cc994ec0004efc2502f5a44a9cd402f3a8340a0a738ec38c3605e9428f4e9a178050253501e931d610d0a06ec5e14f757485ea9ff9d1abee70d3f2cdb6887639a8ebc54f9b04fa880ce3aa88f5cb6ab1aa86ac462eaef03d2f33efef8ac5acbea9366ea2760de5310638340639cf4037810a20a38db16491b471fe4b79d1eda17697358fc20f4bd921e5d510325d47fdc3c4ecb1305e7b95bfec4eb21899f9f73699f9be0b938a31530735c152d729dbd1e2d0357eb6e924fcf999a21a577afa9abb278695e82a6b930758c8f64c08ab7f5da296031b82b0971c4930b476c8b84230e1a1cf1ca65845760e5084880e5d5957bf3d45457f5ce1a486c9a59d9b6493d30020b682ab96d1308d91a1e686f00e51ded26375fada91dbf0c5dd25d2f95008bb0ac619e4635811551ff251dc80535ba01a449f53fb9702eace8ac609ad0fa8e04d2c4472bbdcfaf4d53a4424daedb56a4bff8739c263e810326a4c4776c499c06457ecf3a515a414b7e48310bcafd156ec4624aaad277009e4d6f9f8384a8dac43346eab7cd81b25046040b94451911fa2213ad354d3a4e27e76b379f0fed979ee48bea59df3e7e6517d35d68ce1f88879a75e6a50669c1fc1c4b7fce5000d0b147eebb7638ac95671b613c385cb2d60e0073c405ca92ee4162fcccb5f4532aba7fad621976704a96930705c9bf77805f2dbeca71b996c3edac5dc724af3e0deb6a6829a6ed6ec97731d345f72fe09518d518fd6b8c3a585c73f0b7ba9aa2a56fd615d19adc6e66ab2d35062345dcc87a7228c1d28aa34d0451948b53a53ab6ea47a0efd84fb81f3fc9090b8850e40e601e41d87f1642f2af1e1fb9d78945fc91bf237cde3ed63129e79bd5b4410ec3be685b86bf994169284bb7e48b44e65c62fb1ba8fe97dde0d1ad45b5cf7ab3fd851852d9ec873c9a991bbb3e519066d0f108edde2da17cc9096e204c1c644675c2814d6d224014045f9e4614b350be902866238313459082eb4c752d0ab8b306e4f62daa81a890c4e07373ef0ce8ae720c5483b872ba0e672d9c270e26a64e7b791ccf3dc86d2ccfd1ecc14ba3cec519c71789d9dfdbc1555aee88355b0b40d3384e88bd7cc6f0318e34bc52f137c7157718bd290fec98f904900736d81b4ff3fb389ed7ef4804df1c5f7762113188986ab74fb802ca2934193d3e2a1048278f6cfe82a148f07200daf0b8774030a0d7808c1eb96ce18db254ae8eb2742057e696c2f4226c0999b56101a14f5fd21da08a4e07f20de41f9652bdad33e1343a1ae47453716701cc88e83fd609724ce2319193bb2ba129928ddab7292110083409189b98a272a5f9173ba0b1b9e60371db2793d9820737bf2c7e56bf4a62fb69196f73bcd9b392e5a4977ae5125fede1a1d00a7a44d24b541b831b728dbccdb6940e843111a2bdcc7d9c18c987f7b89891cd04f670fe303af0752a7bee1c655ac9bca4e0859f8289f57a0d9bd5ad116c5f3561d4b0997e466ac6dfd3d47ab212bef4cc36b403b6d47713d86424874a19ca11b7e1ae1f1d5d10c1ab8df55b8fced81ab944339f7ed889f3345eec2f78579278ee781790db847f723c8f58c0f29b351a0ec0e72a96834494b94e04d18a842f0939a0d6a36ad788008adecd5ee81a19184326be2195946934a4b09fd29c844f2b5ee846bedef700040b00478b6e27549b038828b38cef5aacfd6b9461a429ba3e943e4ea025cf2eea80c5eeb04a053156cf252b7c6a421f801468253a70ca5cb888b6887d2248b35240e11c1f4dbea8c1258bd3210d4ca5beb45d58c1f042a5de9d5473d05f1902ed9383dba997b29cc264f6d8c54ed6610f083fb37b74491f1e6b83f2ad63ae9e5c85232ee8d4d8272ac25daca99b8ed2d366a6ade6c6f3cee072d8772a0a03159471984b5683574167a8e9e466735904f8be3b0a8888faa8f37d9d53c660446cb596bf672881343469c4faec11340f5a5e575708def15f93a4f7fb960c793d38bc960814d71c908cda98f4fb542f21265fff6961b2b77a70b8251144794741e5ce884f2a7c3f26f1417359688827d38558af784e29340676f738d4b753e496f7b213a80f39b910082d756e9f7dedfb64f5e0b6607f3728eed42964d923c7cedb4aaf7e412f76f9c44e22a70d4defc9fca35a1d3d2c241a517914638514d1adced6978707d8aec77a0b56883e9bc2a68a186429b807dc6a5d43b6ca92d674c5c0a4f19b0837fe3e0c9ae2fb9cafab62ff2f6f92efb88c3d2e6abdc3dadb91d30f70603882f5f37f4152f6313c98248c8167de28c9e899ee32ac4c01f60aa806dcc6557bde7c90222c23e698e105ae3edc3d0e798ee35fd650f48646b178dcaf60c76739131e03bf79dca1ecb156e76341a4c58a6998b16ada792e78905cd05b3361e5659533ad547ea7956438129a158a2db4a523c932d4d133e93e43476063f865570dec50fd1730b1719cbbc1aea08e993da6f7e17e6bb9bf7833e815c4534b40d2de069f790275f56e2a5d0c8b9299ca6ef5d9342e304145a138aed156975d86c9c0d185dd401967ca5359f902f44eeb9e57e5e850bbe24eb5e0a7a03b6902a822ccf621d94e7bc44d6e3cde9fcdce1b1891464200c1dbc6c52f72344f5447006e1ae437fe8d27b52d35764e6a1f29d04d82f4d52c6b21e5d2092946d538ebc18c1a41a3f0811148150af970f804c5289dc0ffd32614a16502708a43dfaa06559f0d5ecbf457e9368f54e64c9c54ab47395493190a867be40f4ce3ca68e044dc88fa5135791fdf112ed3f49620ddf39e3304e9d21756807b74e92f4da165cf7a1efa02e0ae87a894fe62908e68244bd901287451efc8d2363672683943dac3895877b7a9ee194c779e53dad76ca42c01721a9d6e8ffd8260eae459ab829ddb94c59d3ca9e67ec1bcac1b29cb008e4647c78f9f533075fc8603fae73ee5e071eb9cbb8424eb278d2a4b06a0b2a394150d75515d951408a6cd44294895768ede0a409754db8692377c0750dfe87c4a0cb53c4d76a13963447f81196860a965527d2da6d61d76e000e75d151f17869e2a199423aec14e87d555c185fe827b2a4dac71750c2b0b400be505f6568a5863ca0f2b6bc416fa05ec538aa8063b85528da316fa2a8ea3836121943ba8fb900307b931a614d6e6cafd4ead4a7427848624e8a9de7350fc354062fc7e780521cbcf93431008fa39f205c2ab9f9b6f408cdd73e703889f46f127c1cba0ff40a5eaee21a04eab4af7221da76354fc12fd4b880ad28f4c4822a562201420d4d293e065dcb8546a3700d2d6edff4f9d8a3cb54ba080b9a22dd7ddc8ea918715c5ac12e06169fc36259ca669cbbb58e717d432ae95ae14ab19c24a8bae0919d764b7090d9ea63148b3ae1eac7eb8e4aba6059c9cd24684ee14341f23b57399ea0c5317728d5f77435d38c071f45ad50d153e4045763bdd303daeca4d554fb0345afd00525256b01dd0c4bd96b9cd760795335e8a081022ecf1d78e2e491629e655dca554b5dfad6eefa3ef1ee45e7aa78d217269e93d8c6cf217a5668d19f489b1f51666c1a488f35f61871522c99f71bfe035f21a9abcf53afa4811f27d99b646fcd0e5fe207d4425eff2352ae42aaeff362a9e9b8121880e6b5bec1b65ea12cb67e5ca4e686c426229d2254aad44fa5d69bdfb3813e95b7fdc69c108453a3b3a15a248cb331f900ae980f2822c6d5d1917d5a55c7670ed97f87af322bf57b29ed05947776016e2d2c3f22fa8be611d521732b9558ca1ed3897075c81f89756cb61aa6a85400151ac7ea92c037c5f5de43022a252e39dc21a250482a190b2d946927a38e06117f95c5306f734c8b0b7efbb403738c6bace37fd089189c61d7cf8324a6a07108c81dc49858d66f6c19b529cb82c650a89f948eac71cc0fe6592f24f752aa25b002c7ae74859cfff9d9160bc292129f627d305cddcebfe397bd14bf482ba9c56278869d3d4345b99833426660cd58b0c4a8952304d1e91861387d1584f1e2c6479b2509179bccec089cc7c66024b500b945f2890df45455b444b06563c17c8dd9012dcfd10ce3e825c1da14ca7080e1f1111c121006a31a43a0410376b65a778a6820192c6cc47e85e7574572514650c5a50c7a1de7446ca289cb87d0edfc277e02683235de381212a1679e79316e231eb2bed0624a2a92c2f0532e4ccb796c9df48863eb1141ea88d6e22d40740d2f535153319826959d4658a22bb901874f0743d1269a8b9c8832a68b81aac9801108fee695c172f5c5ddde72aca9cec8ec18214b5b0df8b866a91156d27ede32c6367fb61dbccbddb9dd27d6a3fb822d38593c2723f6f2ca44ebaae772212d86e7dc84c3155dc90260b24c26d0aa8d5c2229c14b9165025c279616de7d5e8cebabd3275c20bdc2977b937e3dea9fa14742d0d025f1e6f9a790481c4a933cf3dd3db40f3c94a5181d1545c74b3c734b5ef69eda9a9a1b30fb201fa4b9f4e1bf0980be6a4041eaf099c5e31f045ba75f003df6a9520a25cf303f5e6e918e07412da37b719d5d6d9f2c68c5f022d85be6d8547fb9e744540d75bdda81a6453f73312b532b260ed2f3bf198f0e0118afc0686daec710a18225009f5384d4b13085a64771d4c4398e1ed319d21347afb8a7a84d2f8a644692c80df6ab1cc2ffaefcb8374ad14ae513b3da4d994c7002d1c85c790887a0774a078d95632c9266b4c82283d18801b2228d5ac576fe942550ee9fce8c185211000ca06ed0d31cfd6d792ec28a6ccb3b2de0a2caa64911f4ca48d5ea0b4a7c1f9cd31cd990bacfb84767ed278ce5c45fdaba8671bdbb78010bde0c263e9e9e845ec140ed222b6a4f3cf48d2cfa53175d3195d0b0b1fb9002094b7a1d17239270cc55e1771cfc373658b409294d5f195be8e8968de38eccfa74d4fbd3bd270190ec6bba79c9af64d258d5f1bedb59e493ee4a602519c7ac0a91c44686a8c0bcde257278c95183415ec99f51bbe8545b1a1bd51e313ef5b8dd9205cb4e4927c73c7952fca105fcddc7a9bcec432bb744c3a993408ae4e16830207818df2a87e2d6fab70319bb052d221c4072a448116b2e653340ed97371e936000fa9cc0ca5510027037c9b86666f1b4b938ef3e0fdcac5bb95618291be1257871758001b2dc0055c22bbf49dc279a11d0e05f6e8c812f3b4def78492b29c010e03767e67b6aa671a114db11c739448a45f280acb09e9924963e9f3ce31aa465772499443e545afd3c1e4134cb3a5ebb8bd75e9b44b253e19ea626859be5479950df1023de528f44ea9912b0587307f441d4d59377169c0b068350151f780d53be78bc6b73e9c90b3279b6d6fad6abed65dd21f968bddc59bf5d0c93e1ea9933ceab3849cfe307a0bd901a5b459ca14954a8dd8e0a5a2a1c720f6a10e3c1ac8530bce6bd528410ec152b981deec47bc57c38a8d54b889c2250aeee1060131884360ab4ecb7d10394324ccc7753a2c62611d62c30a51bf16aad7203d8682f262647a23a7cd7b7db26291bf8a947d3fe490be72326944593c43928def31d0554c49cc8ce240b48ab136d5dc735c872cb48708af447f5f7394e488edaae3e253b54bbf4192b33414c4a0280645d186a281d1b23a203dd1b507acb8f134eaa32dfa3f02017c36cad74190ec0dc17a5863b457d0dbc8e5c1d5817c015c0d00bc7cc1f596cb767f8d7b53b9d5dfc01adbf6b883b74f1e413c83c90c802be4c7e1357bc5e2eb0bef26e330e2010242b3d51cbe5242a355029984cecbcf32493f48874a43716bb379bcaf5e84168f56397e3a892d89d14db75bd0b8ab8932212576346f55399447ff01042cda16e132c5330709a839331ff8806eef84082c08e152996d9a9de69806d5c38918f93d5aab5dbb922e0b8a2cf826a1fe04afa0f26c52b3afb534671e03e4cabde8d99bd4d242a1a00004b49b50b31a8dc5185290e3f5e1242c1b6de1444697773b27225a5619481b67e291761354754d6da30ed01db5a8d355dbc5b4b698f6f17416c5fc167f4fbf7e6b1b53c5fb55e6e33cc99a4285b37fdd5706e0cc3342073a7943950dba7d00b64c8826e3cd545d0f38fa53da8cc81fbdca0ab04c0fc078b14b897fb910ca0dcbb6fd8e401ec6c14ba507218fc1f02ab3cc9de44bda15c7ad62f340d40e8f372f6ade9723858883acb9afc4eb60a4a0522acb5e7eb29fd20a0e1743a03a9f69733c13e4a5cbdeb5285813215060f250aabe37dd954261bbdfd1d9cd88b174b6c505abafa34d261d22a7f947c4f5459111eb5db62e18f25c9592a5754b49eddedfd7a3910281356fcf0cb9688bb4d331c6ca6303f7fa8108bfb5dafc9d57f0bd679a8ea30dd66865fb384554c284a51f58992d3da2dc6cfa909b623d506e52f287701d89ba8095d4bab38846b604cf487fe607e540ac6cd30c1d17d736f1548c4c608373212b71dc963dc586d06d1a72ae0f5a11010f8f38b0203dc11b5573acda71298ac9b399704a231050fe29fa088645fc300ae8b4b8cf80295a4251fa325fe519f23024c1b2953d7abe8ae4af27ddc5cf7a4e626a3a15235ada78d4c0dc5800b5eb4db3d592ecc9e3005d3aaa34fc0964b847e3dbf32ad872e6d7239a4082f6146a0e205fdfb8e7d2a85bda4c7dec9c10644e5bc349b407b7cf152951054b610822d6cdcc3a3f93a3c3e4f1b7c5a1e94f1e1e41964060c1ba5f3fe9e449bf30cf8cc911bdc5ea9161adff801f64f37cee571dfcc235109dbf2f061a6949a635bd9a5a9609f961e2f2b55217a1a87d00cf4455dc8d7502275f1970e66453cfe45639f99d120cbeed50cfb10c6bf5a0a8dc05ae195abf5187c16ddc889b71636ea7b8e91eea3b72050b4d46d3070a811307b9917ffa0478c0c0d95cbc44dd050a9dcc5c79392800d701c7b8e53b3b1dc2872e331777a38a52b14ead0fffc48b8b659d7fba97f152108d80867a1f2e8a47508ae2fea00bcc84af8fe55081abde8fc3f13019050afcd3adb290fb56b954ec5776e1db782c80c45686d35dc315a92977e10cc57e5c1a0f7890989c4eb75f4d8da35cbc352bbaf07cfc6af093a575a1ee101ce9a0af8f6383af1ea43f44b9c9955c846d97fcdd13401d01cb9191293b77e2a82871226e7ea92aca5b3ea20d64faf5b59d3f0bee2d2c1885c4bc68d36a9a800fe4a8d4402cd3270c4f754cd38d110af840af80a6d182e199e6bb1aadd1c866ceedf7bc2e8166bca2c8578e645098ee7a843623c14a744879e5fff2171fc08644628d02cf331e735e9720d18538e00c831a1b73136dd45b8399bb57f7d535c742c695b66286584f55807ee08f0097cf3c9090b453d5f1c9a21c3609d2e483aaa6b51952f9b9ae3be5430118b09cc1081ac75dccd144a9e50f8837137f07f2d98c0757e09136b7ab2f06853a37a7fce7a6349966f7ae1f39e1c3d1999405939904a5d64538e92f7d62284218dfa766f910e9a128c37ae643fd851c3a005f74396121b18098b2653e01dfd165ed2569c7d1679530ea575a6ecd47a70472b19a0460c47e57f903a3d2670b0ebe7a901d6d43a1a4857679a42f0aff0c51905b72f68ccdc6934de3cf2554b0f5045aa603f015522a158bfdad225d7bc2dc8b52271777855b9457b20bc1cbbb763565dc0a9055e572866ae2b2a01e0b246b882ee92ff459d929b32e430e4324eb2331f0bf927e489de282639d8c5752610baf597d6414610a96f59e465697b4003857313d4a5a3ce151d069ba17f9c44bbb349ee41ca853767adcd6ba3cde0579f76560cbe7303a8912e321ebab312524009b165450cb4b3e7eba4a7ca19d548cb09232446cc68df41548390fae45991231d078de707388249698b5a8e7f54540b7894e8ae173f1ed7d786eb2d81c0849c06af2d2a35d4d691c65499d51ad16735d9d8e66db88366ab15d72b26d948b9ae50ac41f680ff61780064006cce98f60f70c8aba881950dfd6de0d5fa03d855caab097f59738ea4976ad7344382dd37ce82146b7d4a78e611b4a39717e1a064ca9615b231ed32e5b01d80ae0685bf4719ba23249c81477fc559247672ac49b61b34a27067eb0d452b61422f3ae1bf77aa7b42d8de02dab2f1865afbc943c893782822bfa67f9d8f416e8621dbbdaefcfa43138dea3a45d06333cdf44bdf573fbe66359381db6bb5518e7548b5d01b4eda74c1d6b233a2d0047aa715ab40a309c00606d5364bce6b8b23163c953610da36171dced34bb58ca390c58baefa068364e66dcc88df569146378633a5d404608a8ab5d7f591c29c210b9cc554c21877c02d917a8c2bcbfe59b6e69322ce67fb181ce083414dfa56af112678c348261afd39c8272c40e8e124dac519d7f21ca8660d24c32695da0ed4301cd57bccff34cef4545750091b1d08f8b930023e7f449a8020415bb4a526e7a17f4f55e43711d60e30da0e83bfb43995b6a24e9748f4214b13bc7552b47ae0f76a48600dad9289d7c9469867fb3f58b86c46b5c96d4890fa728086604ebe03e851989f012881cefdf2c0665f41efc5d1aa7651be78c077916d1753397d3626961ec85b1c76796f6c9a9ef4056ce294a2e0b6ee07bccf271b1516d86f5b33244b46c587334e57545161ac67c305bf34015c86527c4e21c3fb2d44351cda5684110566bf72166851d028189f276dc64270af9514715b8530b60b36d33048404878d9c56af17b243337c1a17d45e3eb7b83c494cbcdb0d9210efabcc5005b50edb853847ae3251361d89b66c542cf79217e7c0042e08a4147034d4e83480a916d15e686cefdc0691313b49343fa083bbf8129a184639ae037a75e200c632d2776aa3986b64ad077f18d89344f2c4927b01228728284f3caef858f62cf7fe2ca73fa929e8eecce9d8c512404c75d032b8e8e5d5d89cf27f2d67bde1f748ec854483060c60c7f95255a5da00ca0e77d026239c26d10ef055f1b9469baa67ea675cf2af359b97376d4e6530e717e5a7f50ba7a0b414c2be2b0dd9dcffb6e064d6fd09242998d48a3818edfd1579844a8e6f90490ce6ea220a675bfbbcc563f02300197d4b668853c6ac9a35d6f21d546f9d065e1016d6aca19475607deb38d0c2b8b070cdbaac03ea7ac7c856431810ac798320634e327e25cf6ddd3324a0b9d46406f874809469cee2bdb21a712cd3878e751463b51c12a2bf152de95dc5d09dd485a42ac0aac1bb89e29eaf0e1a76df6d8047acfa21656610b5347bdeb76e2c756744bf444d2797f23a6bf4eb188b020eed71ba87c009900ebab1dc364af103b2fd5687be36b0eb1441d8600a55b4bb600f55dc8c5d4908b321c008ed817c84302c7654fe2aeb4c44d8909253dddb457a2622a0fc55d612b6d700cfb197bf8bb2cca1465833eb3e2af6cd4267370db5d2e7fcb4d9e7b48d66a29b61b29df95f86c27b48555d3f607337ae007d9145388fa45b3d6d61f7b0cfb08e066e9a3bae105d0cfa1fac0c34bde32454ec037c9b84c86787dd8a908bf47d4ecc1352c01582e57216c1482b9249c9547fced42f4e6f1b0eb157ae92aca29919a8b344229f76ac5abd16e811dc2f2e676e7d79f5e32ac2020398ca521b5d1389b2b3e1687ca4752ae0a951c389d7f91219c3d30c822a0d19f0f2b2b09736e9d5b242f9091777e6c3648b9ee3e14ded94e673a44d57f83f28654df0259daf57094ca0f1b7900855bae439f16848468e3d0c554c80d4061ebd48dc233d14c9deca9a266a573129a90353a015144300247a1a1961e3593c8758158605559a26a3db8812e8317d4ecee7537601de31528f0d5dffd9a6ad6af139ed6064b6ac3a19214b0283b87890c503e6821564ad08a6a5f638d67a628e42f7faef00534a2d62e5dae1f63328f3b6ae6b5844538a960442df15bab7ea9d731e20452835633d6a94ccdfb0ef2d7d2555f5224fc2b5b28376591ca0d60e6e4a4feb544d11924ae4b8130ce0bbea47e64bd7852b7aa5f4763aa6a72f0c3a2d43a04ded6ca3fc1cde2376896b5ee9e36d328eca74f3fcd9a9ce4bd92668690e879d6a48b28bc0b037c004a5a5749ff5037fe3bb4e7d387f1d3a29b20d1b20cc0998c8c3bc901e5dea8490de551f165d2d888db4b9cac9bc14d853693da52a588ede37751a877854b0814d09884e9a1e821d88fe4a9369fda302d7aeb6286a08734e77d1f3b47fc3fad29dd3b37c7111bd3131c0a7eeff1893ed00852b3f48dc754a386dd863f80eb2894ec21f8597323977d5e4efebfc5a7f8fb6d7f5e85bb8b0734072bc35f151d8dff16f5e60d7fb0f73a70a771d42411ae6f000f4f0a02022336d7501ae24e405a1d94ca14faecd9529c8ac1178e5149403d1578d65f57aeea6aeeb24f09999745ac7c85b8acca6a14372a2ccfe38bf7b2337deb6404dcbc235cc9a462b328ba13dc80bdb6b63ec45a5c83f11f4188264c95a57693cd3b0757425afc24a47996264d681e26940b34acf964662667b436b155b6ee9e6e2101a5601b68bbcca5174267e30331e8f62fff2364de0ebe8ba8330b7de4fc443d6c278d2e99d3f784e8076d28ce65c8c3acd00bd96b0fde1eada652e99cba830007d8cf14a78c8a4f653894513882afba88bd1526e873f73c94c4b0a5d1df615a0d14ff0612fd3d0bac14c4858179830f83596de989ede088055ed45501d5d0c239e27aa1971774ca0c2af8a9f54890c888587eae6aab7cdf44801443be6b5ade03554fa797c50c32f9a5f24801d28acb2dee21e0920725338a542baf9b779ab0c59f6cb91e652dc3fe03e50d43d49cfe0f364760590a1a8f2a4252c57631b3dedab0790135be781dd592723d933670aeea084c806091c2a46e54d1636ca0bff1b27fef158534d5d4bd4fa476e4f3d8503e6a61eb98a72a83313284573fc25d0c9c9ed906dc9e177251a6433d15d53b918b6ccfc67dde221acde358d88725ac384944e4b7c69ce84fec073e37e704418b0c8bc0b544375f23c4a47a9f44f633287a324acfa53b4e3c1e773ac0f0781456099124b1967f446c08c085737fc29de9d0d0bd19308b3c1dc3af26359deea17b91241b5aa6f81bc080ac9daff6b6503ed111e2586d2b89f57e0d0b84f4b3ab5e09172f5a45c24af129c172a97d5ee80b9b116c4eafb82bf2b4295c9e95fa3a35285ee6215751e04c7971d01796ca29625736517494bbebe44cb0630001952bc08d5369481475562ea14e0d10470efe601ccba8b64e00d8cf3da27eed162a8edd4c275e72c1ec24f599038ec39e79eba331d87b6661b8b4e65c2cda2c1316f97ce66068f813c2d41971efe1e9d4d3eab24e1e21cef8c09bcba0e250f71dded47bbdfaabe82321ae6bb5172ec9435abeeba8db46bf4dc93393e112f955142ea85ed7f77b8991c7c67114fdc484dcada16e584fc3bf610dc26cc962fbad8fcfa28ca2804981bdea9ec6235767dbb0e5ef12a268513e214cb793525382536bfe4c24c6dd5ac5c5a2d89db413c87450d0c8442953ed40574b12457e794a60bee336740bfe93b90dc6f0c4e0fbf9488028dd43e24568c9c6f30d925213cba02d9930f08e4f840fb1a87016de3d12cdd57c04ee8db1549625fd1c4c94080512831cbcc062302ce5d34524f298bb8237cca1cbb3dfcbc0ada7e7286985e45310169217813e5ac2ec3a0a086eff738540c34d21bf689538f4406ae31a3d58d1cf23ae0c40561325f8f2246123338403156ea237f3fe58751a044e8074bcc07a88909bfb6d58f7adf3681249e9e083b549e2b576a2f828845e0d24fc248dcb7861c685e8e376782069aa3313efe597ca6b9d831cd2c929bfa483695592bda123fa582caac07c123de39e686e5074e28a2066023a79dc9cfa178b18e512c3b8ab68e76dba277d6abefdaa0d08e2a63a1bcc6c1c571bf39b380eaee26e80f718b4632db449591965bfeea7e2679871176786386fa7c42aa333a8fb413f9e84c4efb625c8e6fe9d35a85ac46af99e337c7798546ac22995141ec1b833e7e4f208ea4dcf03029b2965dd7e2037cd98f239f71e890648fcdd118d75e614c313c0e5e609b2592d50e7f1484aa8e130bee0ea0b7448234dba773b15815a9e82f4231cc4e4cd736796890b1ac628c9d1036699c689938eee694ae16dd132d3a4c2c0168e80ece61d33ffa0d82733ea06478e5085f7c87f5eb47ccba9011b05bc132ece5b9ab8c7bd106ca769fb91f581745f6017cfd7a4bb2921a56751837660e192bd4c7407f6962d69f731c39d88e17beebbffbfaf5f9846ddeca9cc5bac43036a3050fdbddb7d3f76d1f6dd7fe1f5c2940e189b1d35dcc2708baeec122e2b0aadce79abfceadef858ded6fc3883f77133f84122651a00f7b6a9b6fc5e5b127270dbd76dd5ed00a95f906c400a08dc58f15aa71e6b51c77e507f44290714c4db8f6a7eb88e17f87861c9d83b8186698c937f4224c4d29e4246eae1512b3aa2e201c0ceace12769d769d71bb62febf11c2362af58e87defb4f2c0cf5b5cdad1f30be3bb637783717f38aff0d25cbcb1beae0dab718f99f954ef9b9ae4a04fec85c73777a42ed2a90929fcbeaf69399b7eb120a85a47c00b214ba78bf9ab10273530d781c0064c7bd7c8eb70616e8c7affda2fbfd7f7644f66fc5fe7f799585b75a62b08eeafa4f8edcc76f3de33e380853687d467a74d38c6dc7714f15b12ee675dc5affaf872813938955d711f8308e09864942e2fd2f6121941ad227567f804f2362a1e8a17de016cb04445297777bfc2eceef7622408a81f5d6d8b01aef73fa97819240e90d80f01beb4a43d7a5887a1f3a974260bd8f3beadbeb4d09bac7258e9b3beb50a4bb4b972e994a8216bf644d4c7c63e90dd03b6c5fe70d9b9d38e2e5d09f7776f97446087ad95bf999380935de9add302b08c68487bb31dd6445066fcc9e84df98330ffa13e5c83d667d2ce7305a3ac5cac47dd4654811d661551884c6090b8a902b13fc8e044c37ab40bd08923ca0ad1b1235cb122ff84e5b54dd1669716bd2e00d12c535630f3a7276844e96708ce1b846d96ef112aa00d89d31975ba3454e386da3642ca1a732e46195d1da0b8e46badf475155e6ce8af436e6d51463be0a43ce8e7d629e89204af9b03c2907bdf74c78708b916f35dee070fcc9b945c3fe1ad75399cae361e2c03b25e58855856423da2974b9c3c0842d81b61ec057fc2d2462fbd2258610768ecebbe6464c78b9177b928148e496b84b542ead516fe00667c8ceb0226695a9edbb2f13176c1d1605895e5cd7a04de012cf640a247150dcbd464a1afb67730bf3de0b32b827fc1b681fd6f2fc46df2e210eeec892652c46ba4300bc3f63910bf7648efbb5fdcba0f4ca5da0cbfbddfedca95262e4a8c06a32038f35b084c3428a3ca055c18c0058c20b5bdba9448fb76c914b615a96e17c96b63f75e4f574f6ae0784a42e6583fbfa292feb0e8ab91856af2843b01c405c8f189ca71466448fab481a62daf4a1c7041bc2b28418c4d55f6ff2ca31e94205446303cfbf695549389a92d84f11c578a146d6388d2c4dbbc1a662e8b9969938c5f3ed3a63f41683a30e6e487a3fd2a88c23533b14e4ab98a3390f01413ee76a3cb472bace30aa1f760c96e85543ee002e585fd87115f1c7ec357eb7b76b8f03d27f9666b7ae766140c6d4950eed40fc80e531a4f221d49c13fa2c5d4933e2c5326ff40c9d4bfd583f7ecf4de8e94ac158bdad006dd9c2d5826f61b3ff5ec5fd30bf52ffda3dd26c1519df8d9ce528dec1d8a8edcc257d2cb149301aa669094a0f7d981d9eb9dd3f71ff801aa6711df2efbc7d1efc902763e61ae8391dfb3dfd910ef1bed27f517d3cf2a37ed44143455544939ab69979c363a5456b308ea3eea3792cafcb133a38623619114e207aea126e451fed4de103cd1c59b52ad46c3a64a66c94e1c84b5222bc5eb2907142b18079fc730ce9f29866e956d0f7b012fb1a7b6e183ee5406e5efde5b3ea54280bff65cd013224c059d61ef4c0c2559150a1e35f3d980e4f82e6ea65c32ff3b64334ca5fd93d06508c1cc049280f746cd2065b64c03c513b937d1b751feff8bd2b93ee8de12851a1cc086470967f4a1b3da2152c783590e21390fab330b1a0d6e11dc3dca9de5e9bf151167ccefbd57c1925e12077e2ac2f2a7a090b24a4c363dfe7fddbd7978e1483520c19ee09495b5972dbc397aec4f1cf8c05662c87ead5b4934987e4cc6109649c03f4623c8fbc5ef29382bbd0fa0e63ba39393f0132435492fdf7e17ab52116e54721aae96ac930692755ef9bfe05cdcc98a8d753244548dfe5fd88204d2f04148615f94d7132ff9e2ce88b3d5d8db73b7c95dcd956d1dc4d83ea65073194a9ec82fa778729b0e8e0e2401db88fb85a86198f16a53a01ed2a8e4f10d19d51622ce1a71ccfd00a3ebec0d2ead09311b7df06772cad4f271fc3bef5b05c13e2b93074503ed5a955d1c7c4a8f448a4ae8a1258d05dba2c58451a4e1ef3296421e85c7de5e86eb42a2896bca3da7f9eb258b8f648855a9cbd167fe464e632e546733d91a784330f94be1f452aa7c29eb7006268ba6171be7ebbf3fa869aec67604ed3a4757a2eba1a57dc0b3ff26304ca276c52197f18308c773c032fb601903dcd003bef629eee2ec0d1d31719bac42071f57c4c97e82a6f651ab4f829381c2c698c7a10ed629e8b8c9f06f0d09e835a71875ba3fef25c57157cf5d8e98ae5ee69eca3e74e12ed899627e1c1036699a0c686d688f44a2a45de0eeb4a4e25fc557bd99bb3261cf0cbbafbcb93c5793c924ef2fbf297b519e768e4bd1e58dcea9150cedeb625fa93c8fa82114ab97e470dd19cfbb3f68d5da12560107ac1c4b9c70d72a4eb8d11e112a18f9cb141fa8e5108545e73d004b56260cd5264f20c5b71a517eace05a9db7af051e6eedcc6303330e05a45159c3143e952b9279d582fc7c9c334856c5fca0119ceedbe5e38f324c12854b33fff7c09b8b281aa3cd6ee6eda174b7ead099757282d24c0b87f6e434a6ac946ab583741f350a382e681fd7dad35afdc9e829ea50fbff638008cc4dcad550c46e83c36eecce6917f4393ad671cfee03a976596a4f0e7e7b93f1262927e7f8dd8e0c71a961b69a387fc00eb5b1e35ed422a4f974a95be6148463f26c19aec5d959800e89e1f5a27ed7452b9736d7c89c0945e8bb6c378cffe7f1f58836b8c9e9a7c043ae024171f14ef27bd47859373eed0334983a2365199c567080009436eb9dd6ea5f0428a4c4e5db683cf92ac86f0aca11c71c026e09e4c92e348681a714b5d974f00f10636f689b0c141e1f188959109534031631e098a02fac1516a46493264a138483001a1272d165c0ae52a6e44f9ae8112b9ceda027fb93a232ea42c46b580aa8bdf084f7e50ddae41414c5707dcf8463c3dd2396e0c8d783c65ce1d7b87a5599ce4c230564b8b34a7994490af7577e1f48151bc0c862676248d242460ce75c1741d6022832a3d6cb34b5d5dab51bc41581d7f554930006cb4987eaa56ff4288a2361cf909066dc928488b11d47ce29f2ec52df659aae58ba9c93ce910522a5d6a4daf3d6f82049df8e4e322d99f25767cd9686eaf9d2ad7c6261398290c20fc64f171da5e83220668f1715c09368570a12a8b35e01f39e8591cbe815bd9ca3e852579da56bea1af22bd196a433b83d0bb837506f08cc8c8a5f99241de3637043acd355255d93b57d7a0bdbd79dbf56c4d76363dfd42a6cce1b3643c2a1369c6562197fc4f3ea33f246576e1e0929aa38da16d8fab881516a3e6f23448128c84c1e618ddaee01c5711ad8675b30056a5b3146a8695e7e7c565d656e03dffd66b286462c6f2ce7dc13e1e8cd8d7d3ca79f2786210ebf5e2db9d71635a74cd3af8938659146530e4f9cbb7c3aaf8afbc52059ac2039013878541eb9894ca35804c5fa0e87c550a48776b422e207d78923007e959818871b7b2323f99b9205836f3c29e0ec753affcf831272f2a65cce9a04e085b041c5268ed7226080e7fd90b1f7a3e82e7bbae24ea1e4cb163d1015905bfbed36e3674883341dbe22bdbf29d7ef7b95a42ad63b84b71729746477933c95bb52feac84506995a0b88e47e4afcae66ad49b712ce3a9e512469d9e614245ae62434127789f7744861874e20872050fbf949c60d3aea5823d5a53a76bd9459d86a100f305d90456f5e505a7a19346866a1280622409e0429fb3202c9dc65f40c1d5ee11c8acc52c13766b28e2ddc2b0a7fd68cae3363136f2faf9d8b6bc76473082e6f606463d21742a935c1c540b7d02746c4640d2dc15eba963826bb5c6e199713849464299e70db4147ef8605ebc5823059b242821ebc3ef9c10330bd2864b1821b351bb81af060bbbb186dcbb1882e0fc938316754c36b8e11292b5d641bb91b784b7108c83183760f4e74191ca097d8ea062e65071fa7aab4699c727149531e2f42f74b39c2ac0d0ef747d23291613f6bc9e8b5e20e7b2f18eeaab005d843a1eff1782bac48da841670938d045df3a7942c5162fdf4f2b6f80ba6c65dab20ea26170390563fa4bc48dd3c9f0ee14a7dd356128c9a55305a60dce4fcea95d841cf78c126509ae3fbafe9493f5951898762ebcb94cb1a8785c49f22863745741403def0d9dcc86e18117e548dc6baf8e14601f63ce92e5870e529f33652355def93f7bf3696b37936dbca80194fa61866c1e7eaa47057095a4a387cafd1212fa79ebfb15b3262451f6d74badaad823722bc51486ab74714c5b856d9ad6939785b0296b86946b5601a05f45722caa778b65a5701a6f78d5ca2cd26b87391cace01fa3fd17f1f9031d0c17ef706cc66ffefe7f7486a761984fce0a984b75bf6db86f9b8d6b0f36ca8e192e97a853fbd6c48a8e1d5f9d23d03da2100a636bc205957aa80259d1da33465a60be9c09b4bd5aa6bfec513c6e112f7b8970fd83ef0a7cc5729c637f3b0af22a2e118e35ca8fbc274ec70c5fba7e4f71c571d4e11c19a7bbd9375e581b598735fc8fb6934e1f953cb78ac6984529c77c955eaf359820dcba5c3031a88141e338f7f81962828dd58204cb8bcab9b058aa76f234f3488824eaf54435b404244cb6df0c31b28820dc8307bca46e321817b8e5bf0da6f36d08a3ff54f85af98293cc784f2a70893ed945c5fd24ec83d5db7346a05df76b83ccd9d5c9ed57b78ebd01938c923fa63233c58e34153026f09b65d3bdd2c2a6e92b24a6ba9571caebab33925352ccca18bfdc904b11416924f7b8545fccb7be4b570a56e3228c41283238a6da5e1f2453a2706538f64bc723ca12d3d62c8c08ed223bcfc758c00c64c0d302fe76084b6358cadc38dbe4b9d998707b4b56acb70b37574242f602d7f269361e87c40ee8409e579b19ab948397c6d398b62bdcaee159f293f771a0720bd2655d50c67c292e8d0674a127afd07641652b26aa1461ecf927a3152b418a066038dffd2e9bf3d7854420dc1e9a23040fc4fc1d81f2c55c51609fd5cda0c8d4aec9489f640902585816176acd564ddc6b80e5424bff2ac339853d5059ee026f0e0d719d405b2935108389fe46104efcac2490ffaa742d473512fbcca325b3319e1f98eb3eab868a7a8606de71bb59db82351c2eb179bec0d604193ace31dac48253b90e7333bec911a83357f52a5984bf38867ea69de4d2755afa09a6dacfd96a2bc5123bc662af22144ef8477e7e015d32caae045955df4dc8d3f26794c1b88fa649375ebc1f2cab2c1cf5a36105cd254b0792ad8e4874bf974ceb04e2888ac03bf3ee76d37b586169faa939654e293010b94aad986c4ebec8e47845015a41e28879a89b52ca6cecfb8215597464fddc096ee0e2fea60cc4f52020b56378fd898aa8b36478f4781b512565d3f46e8bd0b094c39e355ff21e5524e11cde4c42d1d2bd802d2a0e6caa2cbf1d9a7e2dbc980e88e8259d2de50a7d510f887b62db722771ae051569448da7072397b567613e68b1183c3aa42cb38f60e476352b1b458cbc74764dd7a64da2c56cd44f0e4fed76043daae3a87483751106a05d1cbf010116841f79e5838144f713c0f6191d2de376b6b89f91f4990f9233021fb542ea78c660f0e6026177a969010182a54a96b207b04104fa9892dc488a097adc65ce1da2ba21a4403d0eee579315ffd88658aef34b73724c4e03b23bb22743f2fffc0d827614042d11ea35bcabf3a32c3afe568503ea01a3a2e7552801195d39213e1c642b4b23c70720332dd9eec7eee08aa6cae79a88502818f782f285740824a685c8fa34f08e1368ae4a3e6e2601c293b17f5599b2ce826503b5d737012367245582b045c4936d81549826253e1a9b6aabd58ab226b23e7802124a9a9823e409c9142cde16f48206661a97acd04647ac6db6e10964ca9da7ab6784e16e0801f9b45694a5731057070aada6fd414c3a07f7b400f5b7d724d9208755794804c724c321942adb6b9262ac1ddee91e849600ee3959c660fb6c1e228fdcfc543163e59d3ff671d7c09072ae630f06dd106eb83ca2d4484498ac4167343db829e9db12003d093866a0a350005592d575f6b3717bb818aedcd756a9b73e77abdc3e5bbb3f1f1942517af3447c24a6b90968934833f9442927a157c5fdd09bf3a40992971960c7805e93b656e9d78aa4894ce663c6adeea73af3f79447a51442a5f70680c3b0b7a1b09abb3b0a6121e8e8f7ed8037c1104ca932a73073ecdf6217f038d3a1391ed750e74a1bad8d96a4874b3254741ae0ef3edd35467dae3dec20e26a9a8e02254a6c4b739ea73761a464389bb244681051635ea862990ee6f516c713e539253c951fe394174c30e8a294a49be673d657a4fd4657277931b58e515a994a1a8b991eaeffa6751b5e7f42f89c644fa9067d71f3ad435023002bfed92bc6af2de5f6b1ac3e63ce5c226919540d3d53e487c29ec811327b9ddad96c2f0706b4f65a8028e63713d0d1da3c058bbd100fe01e39fa71f0c22278ca5460486bb705a1e77736268ae1fc68b7747e8d5fd127207594cb294eaae6a8cee9683d0babbe02492f71e8a795485f836b94d57940805291e612ca8d9f88c1f9eb5308cf01876b574577f90526be4565f4e4dcda73b6232deeadc53eaffc05a2b30a4a8103b655da00ceb526a0b4a21f0bd63421eac856f4e1f99f609d45c43a4c78045337b7a52dcb322e08e8810d19f09f969d7260a8e0dd731fe8e7191a118b5b50aed28dcabde0f140b4df449d8fb6847281a4c971b7b1234b90187ee6c165db11c730091e6745c969c66721015cc0616a44798f5211c886ef56dc9ecef9dcd10c3630fb3d00592c1d4634bf76dad52d1247d5ce4d1e8eb6db1df1d5ac492bf6f38a4a8565ebc918e00cc928b1db275e2bced9a173562ea336f304695f767eb27d63167377423133f7dad480be22e81ca91b95425b40d2c5eea57941a7326b0fddca94f5e0c079c600313e3ca9425c10671a798349236135b505e8d8025894026a864980573a93dfac1daf70748b38eb0297f5854d003323d5cbd5b1729401035e7e29098007d18a1cf16dc9676e1835d106ff3638621b072e7ca5e231382e8bcb2d3df044fb8b94face986b770351558d3340d4bd4f47207d05a3492e94b9098373049cd0aa54a94b254127c6ff5af440e30a0432d4b8edd51f0bb7a39c9eb7979fd7c6ada37f629fbdeaa4ebbff44c714837b40d016f90aedb789f8263b6c3076431d262e7f452e566c0a0b68cdc5c7d2b2676c5d920577a524030c9f0c64fcff52b264c9f2e9fcb979ed09cf0451fb543ee3fc185c09a19a6e662e60cf982e41f1ff47ead6c45f661d1c542b33372c03506071269b9c19e7560e93af690ceeea83a4d40ec8647312332f1c8aa7993da4461f28bd589c82deb66eb107ee0e68b87b312a40e3aa5d359131835f104ff5a6bf69de2158c149d337108c4a34d734805b880b8040571554853a91c4f8b39bd3f32841d708529b0e036617d7459d55005d8f2a89b95017e3a4da812748e5cc334382913047daae0bb6e6da1cf06307b49e79b54a551f7206ea5b07a7393a883b2b5454654392437db9abf09a746fc2235e3f1cbad4d582009c581c37635ce1eb5a73344e0672907a21f92131935b337625099a73b4b19b238735b771531c91718be21c918468b65b859700e8093c44c3cb0377708eb0dd9cb123e7e2b069803909f2af5c56019a0c7be49d8c2bdfa2586ccb4a3abe01f8744f5d1337b02e5dd44bf880c580e3dfbc47564ea620d9cd183a3e73b67a6c3fa6280089e87ece5b484f3a7e8bb3713641f9d2d733fd32af0f1a622f3c0568e09a017b25ddd8de2f5ee62875e81d72bed337d5d37c3d28d434a889d068bccba6ef92a675d2bac1ae7a43598c254a79660941d1179344f50ad4b6f578530f32109fc00f44c6d235cdc2cc6bf13d24bb2bd67dbd425d411721805e293b0e286123cc054b81c88689cae25213b24379047b71602c9855d8b0084b2b7d1f062c2dc71369d67091075fc8ad9e4c356e5a3be5ee4e2b0ebd409227fc5797221b3c2788092d53161fa472e8201195c288be2e4e98f96c8560ba9d99dea13b098fdc5c35d98300d9fb0bf82de521f02d3507855d800d23a5e431783e092294e97b72e9fb23c2f460b548c95f225772e08bacd631975fa64f1d32acb36ab2b0f4d0f866f579b61d6ed9090278760b6762ccc0c88898646939e9b520e6daee5bb118b0aa7e5f32f89f9b3e9f5e9a1f406cecc6b0621d11e54f90303cae686c4c1aa28bf690ddffb0f4965ced2c5ba06261a5193dcbe2568f6be719a9aab54a195cd4225f31ae92f9386927d20d4e86c464313412932fd6486aa54626d0b12cea25859560e9aeac4f13b0fa71001c8916593c706628c05c33598a7099c8d50a70a1b2a447f41a7cfb12710c93f18ac0e8f552985b5062850172dfcbfa76dccd8937d26304751343e6c4a533ed14122288870d333f012609d1ac17fb3fd06d4804ca85ac3d51261318fa16840cfb901d77fe93cadee73870f93f73c2c450746122e6a6a91cf138d8f722e8894b1a5ab91452ecf661e26ee29d6b21d86b44f7dd4182f4a832d9a3b41aea4132d8827c792c62104f445c1024493f3a47bd7a15d2d2b637675a1b97193c221fca896b45eb5015155466530ab80de515128837c469a1540894f9fc09f4681f365eb17da9473d3121081d4f88da3399be5eeeb2dc3872cfd29e27b3b5bd5eb299d34898338b9f1910f444fa6dea1799d62f01e97d0e16563818fc3b76536d96f728c72ee9254195ea4c85c00618ca204e937cf789bea8110e07913b047110da07c1e732bb3e5263aa05356c2dc83360e0225b39e95dc84b94c551da5653926ab7c9a6d4bcfb9299a0804f039d4a400e73d6ad494e7f3ec67b78c47681869f7e7e0b18b582b99a521c2c081d0b21ebffc419b86dc2e23d24551cc9f2086ac804ffb5a2a739a895bfc01c8b960490c7f03e5831ee0072c88d592c4ced204ab9df5d4f10e15a0615f31c9948c020eb21d007b717a478634ef7051504ef6b1201750799d7c7c3a9b46be4d633761e2d08ff7536d350196a166558b86a9fc51f830066ce6459670ff41ce6e40413feed238ea91fbcc69303352e92b5e40e61afaab20710f6f39713113fd349a10b2ace7f0d26354595947f3a368bd3094ca1c635e7d041bc4fd69d4e22fb6639e085e4cd3bf4aac0761fe2b7c6e34037ea48e99841780b6593ec7aa560d1e074d2a324534acdb20953edc1a6a8a30d6de9004a772d0d11ff2a6f06bdf2eabf28b692e7e2b1be24805150aedb44707427e64fef2e1dc206cd44bb104c9c4cf28ada283fa1540957f745e65d9572765fc2a310e55ff1583ef0f34474853dd1d163bbd2c0e81b88cfd4088b689695da0c3f30d220b98a75cb317179220c7c7e21ebe6c71ac947455c6aea11404655b6e75611d8d7095b78bbd7aa10271a3993e89c912b998b5041ddad20b2a729177158a1c6f5f4742ca783b165217c4814a474841d5b20acd4d59bb44bcfde204e1c4f6a6f87c124be1b2f82a2d38b1e82ac5b5c6fa992bd2a151f4157fa2fd146dceb84e60dd84327bc72d80195930ef7a2f12dcd6e7be3b450a25797f84022b5ea904d860e44a8a765b37c1928a611766fc7c7e93e6011b57765595edd63811f52da96fe91491df6988ba2e772490f7cd500ceef92cce111aec704ba55b7e2fe7695988b5cc4628246759a30d5263a6c612377cc7402595d7e42431dd5986510e3e124691a9e1c36305c5e6e84f1644ce8e3a5544b37b4e95ee8e80e3980bdc19c89cdb1b9669bb1647a2bff771c3819a1abe1c53bb6989915320b71dcc840749013227d795ff080e398694071152a363198bfa66c91eed344855f25111d1073407cb1ea3f2adec049b21debf9b4cb9c38bf576c411ef6859bcdc31f543ed8cd2ff4ecc56ea2094144d80e1444dfb396dfbc38e64ccd62e5dc10660c06fa21d64af86868e4efcc540895a4a3348cd0720920162615a892d757fe009f7f0501684c2451aedc8458d10bac20da535dd4d70b89c472c5530deaf7739a5763d21e615edbc540d33a2cf7c0ad3118209a2f7182855590a7830acea9fbeb7029b1c30d7302917569e61bef5ef8600722fc5f1db9af88a7ebb02e75f7e1d457d3992c0dbaa2bda188ef82d5752a2dd31805a2203d9d881838acbf5f76fc3326ac447c9509cb026d7188dd4af17aa0808b9745e8dec2dd2b0f46fccc08d25018c19d831144fcff3e81955a29b3c68fcf9e0a94dfab12bf8da41b2a1fd0ba74d14ab59e90509ac03869ef2c8b76e00d76d5ed76013112248142d603e1c0397be2dc150c283eb75acd89cd7f07359c70b7a7b299040aa03ccf04f659d88752ce7e3cfc80fe96d8dd3d92113bc65f974ebcfcdf128f0e431d50e29928bdc04055cbc38f4f8d525702c628ecebf5e12c2dbdb12f5b485b5af969447c12bc0f314a2e4417ec6ed2c3c29d89c7a729f1e4f8f48fdbc9a5e2e04cd2611016061823191beadcaea2b7e6ba475a3b495bb3c48c0a7cbefade57ae82209aa7da9c4279f20745941130f0e6f3385b69a60a54000ef0d98810d7a31e16ab0e98f8c1deea67b78158dbabe8a30f8ec9dc922aaf6f06b846c7e0c55dc7299a09a177f8624f96759c89a5b369b12882ade105f9c43b08d88732a152dcbf850c39abbec719944fb364a98112f25f4e9cd404c2399cfb0fa7f92048651f6fade5b552a73803bd5dfd7d1cf2fc9eeb21135a937951ed0ae166aad5ffbeb4aca57b39fa710685ed2363765297083da179cf385f71f3933d57fe21e276463cb3ca262892aa88988b13aa2619a5120a976dc6e821dd90b35f8b55d10cb628fd6608524e567d2e7523a2c9c60bcd6059b0a462993ff0d60b554002b4b43d2adf7505be7c0139ba834b4848aeefe3174a3d1f28caf30659b23a77acf77439056466c54521bacb200989a5e3ebec72f441c87b3dcc31f84bbbe372c87b825020f9631e7854a43f69db9ab61f9d5d66318db7464b1dec24ca80417c24242d96b2f35e546e719c01606ee134810d7b4718e99a3f292213c8cfbd57cef4f86beed349200fbef70ec645246dbf70a267b82f335e81b6c5e6a02db6bc2e710662b290eeca9387fcc1abac9985f0bb00fb7022f598afd81cf672d04e3a8697276565d5ca1a2f9b1e0d4c5b6e6157400bdc037e45213807de2979a776a48a3716003b7642d57a57dc1d7ceea907325736d4d71d240c4ae00a7062fc377e267d246b36b3e8af6b2d98cce012c1b7175029c9cbf44b778389141abc626d54e1feebe3357ea6c2977a04a2aa04d0bda1cc7785ce51e0a500dc4cfee0b565be31a75f364f0b08a94cbb1360acd931f3ad78334da363c8a4d1441c4d6ff4c01deb102a51bf04a221d828b19efc8361569f3f99414b929f7cdbed412544181e8e7f1d7addba4a652ebd1128dd9c11e9a65c1f994025b967afd1bd1d6af4374b1dd750b57bae1fc6895ed4a034dc9694574f25550fce2147e58450ba92b6a0a9a3ae0822365024719ed09c4f8107f9276b6c0616e8202b5089f65cf9f0c9762a503dcba82f0408d62b0df6b656d480396f12f40dbe41c884ba1d8485011ae6982e55809615758dcd43b0791007985caeff8f7930a247763a96d171fd03771cc0825f391d4cc3567b24dd810610e2332f87a8ff2494ea3f04535dd0142bc25db9017ee85125b1a4a4215fcf6fdc12bb9bc894929452ca1db702940212031ecce7eeeeee16638c31c6ffffffef2eae162fd996d3962cd059ed6dc78f69341a8d466b7d9446a3d16818638c31feffff7fd78731aeeeeeeedefa7038738b16414c8434c3e06816aab990e6d793f016d20c6b2117d6858b4aa70b17f8d4e549ab6dd94e4833ac565d74fbcc1a27007c6ad925491cffffff2f93c964325aabb5f7f6ffd37f7981f960f27769dda5d12eac61d561187697f8ab6b71f9f0b73efceac21f5d1f167fc2bef9315f002f607c0574659744c7a4af0d3b1a3a6bea40d7b27a61b5abaf66decc97f298ca81a4acbce63a2a9ec36f50192b4346a553860c7cb26066117aacd27830d634a0653deb1d2679a384341b7073ab0354bef9b2e9584833027d830b694ea0898c4fc55493024b15ab26cda5a1b195d2d0e0d3253b023a5cc224c8ca3f55beeed280429a597e5858aca090e6969b24a4d96bf9ba97cdadd5ccf0ea5c1a021f6e3b764f92244992a41d478b046dd934d53c7695558a4f5caa5298094992a493aa14e85f69b4b22ccbb26cd80c7fef80ef71b575369bcd66b34109696ea9f6f64f4f81258c11484006c984244992c429d0deee6eb01b638c31c615666117e6d28f3dd7f7b6855048f34bd00b0cccf7af6c8df2f72f1bfb13d2fcb23e300b83553a61307cb2e3379d756559966559d2d98c0611d29c31f6ae7ee5934c48922449f253a56a2f14655996657953edf8bbbbbbdb4551144511e30ab3b01917bf2eb0309c90661732173131b49066002c10003efcb2b1b190e600eccd0bfbe245a5f3c50b7cb2341ff659eb1c0390024b3e33aba986644292244992b384a22ccb52559629b054adca2a45656f3beeeeee6e777777ffffffff1438e303f8fc7581f55e7cfe92216560c0f004f8fc653340921836468c4a678c18f8f4dd4047036bac31ffc8d86ad0388ee3388ea2288aa228fefcfc0830df5360c91b7f77bfdadb3f5360c9c96a6fffe31458c24e7f062e263cc018eff020fae136221db6db102e25ae2588a88551bc2ec6c6bbbbdce7a019ccd9c4b153cc0083f93f34976edd03347f5d1353031d0134e33973777777ff5cb2f0ec9205689ae1359c71777777b7e9048238151553680e7ac3964c4c5c37934cdbbc09cd71eecc5a4700cdb89fd58631c6ffeac26e74fcddeeed76bbdd4a184c0c72b95c2ed7ef9f62c1521d898ce3388ea3bdd65a6badfdffffafd56ab55aade6b9640153a3b55aad56abd96b55d6df3ec618638c71b88ac3e170b813985279ca5a6badb5222896c42a8a62adb5d65ac1d4ccce66b3d96c468348b16dadb5d65a5b8ee3388ee3288aa2288ab5d65a6b4a754bb6d65a6bad305d6d361bc618638c6badb5d6fa62adb5d65aff4e39d30cd3f47ef6eeeeee81a94f456ff44948f38a962a51486ac4c2277aebe69c73b5f209695e1959581488d228103af3ffffac366bdb276ee26aabeab66396159515bef8de7befbdffffffb3d96c369bcd66d471c9f37f556a1cc7711c4711144b6215ad288a258fdeeaed76ab364cd55ebff7de7befedae561445511445eff3db0d964a6badb5d65e511445f1de7befbde3388ee338b6ebbbf7de7b6f5b6badb5f6aa3ed38cb932cdc01863ecadbe9515568b8b8b2556511445511c426ff376bbdd66b557956ac72c2b2aabc76f5db2a8365aa1f8ab52607777779765398ee3388ea378af78c52b5ef18a576caf9e024be3388ee368c7711c478b44777777bbbbbb3b49922449628c31c6b82ccbb2eceeeeeefbffffff18638c31bef7de7bef8a6946374d1dad6fade8b15a5aae162f301606a6d20903d375b4ab9ded463a8ee3388e2fede2c4e28ba228da2134dab3aca8bcaf52548ee7cf558a2ae5eeeeee0e96aabd7d9b567bdb31f66a6fffffff7f777777575b96a5bbbbbb638c31c6f8ffffff03b74891cd1ec9f99c7d52d4c4e218a5b4561c5b1ae1dedb6d34beceffe392d1cd94a3869dede806eb74b47314833dcd6e771454c424348a62f42406f59d4ea7130a75b4000b45c46b1531738c4c8c189918fe3214dd72a501c16c140bdd4196b788c0d2083e3a36231b11f00b3b9b116e083c859ded689604f4c2ce7604247444cad8906ec20f3bdb5194d026cf94ad23b62224477028f2e9a9960ea140f308094daffb0e3f39e408f16e14502c129b0f3faebbbb7b777777b7bbbb7b774f0f0839d69da7bbbbbbdddddd79aaa8366c361f34baef0e3faa8dd568022949121a357cf0820e4341e0286ac1a7fb4ecf38438e90128a74dce8ee3288bd3dc0ae4556d8415a1f78dea0431045717777f7eeee6e779e3c8371a8eedddddddd3c3c47b3e290a1c38d9013215c5062490e484c501b3848538070058d1e383d807a8696b49125eecee8a37df4bd512c31654e50f2739301881bdb13385c115cfc60042ea6038622166e20aa517b547724361f66c811d243e82d72ebb1c3dd57d841be7b4ff7f474f7f4dc668f904475e428da61050e1551a008717f888afcc87f6d0c8a1a55f820c3121a78d8704b2aa2862b8809585c21850ab9216e0db72124119a4867babb3bd8eeee0e448312da0165e2d3d7ddddbdbbbb9bc773e00fc14891cc861e1c724a8e7c3044c28da2dd799a87a79b8747083d3264454ef7f5196a2188ede93c73a7781bd7c8123b7ee4f8edeeee28c21ee2eeeeeedddddd3d3dddddddeeeeee7906fbb0f0a3babbbb777777bb7b4f9eb144f3de2261671085db8e9a0a8d5b0e3e46e86e222082d4e86e433d41de9da77978ba7978f24c89b4d17d890c2199b3529113391ce4f420c3e28e4ba628f58d063937129ce881c409204cb8340cdd28019bca70839274a3bb83288acd347677f7b6b6bdebeeeeb69e6d724cfe9bc19c15e8c0c80e209c5c5104504fce79e65b8875444436b0814511409c48826788051d28dde919dd3d70afc288189c2881040f280ef80ca1df7242177239702969a500b672b8bd40a46334041210d9d201b666201147dcb884326b05e62c936370d8d9885022b4c93348ae256c4b481b114e025d68a90b0778bb93a043170ed0e6df447988b71615a0cd875fcd315c8ed25a5a58c54ae3e162b9fa8961ad2fd22805d4018779b70aa366970da0cd1713431b1bda2f16d6fcc5a80c4a657c61ed4c3535673fd7595108af234d13549cba536bf5c7a7ca9a44c9e1704dc849abb5f776fbed76ffc7fe8f71a9e4e152c9f3becf34bdef33994e2754974fb9130aec3a4a76047499ea00fd0425a1354a7b426fd058ee49e92314f4e3431afdf88cf366e24cd914bb2ed3da65db45d09d68add6dedbf676bbff637f8c4b25cffb4adef7994ca713ca7442a1403095528129952a2565b5525159616161b15a5a5c668cb0cb2ba69a19caacb0b07cb3cbac2ee3f05a117461976bbab0eb26ec611f6a3027035ecd852d27e0ac945627a0cdb769867f5528acd95b4ec0cefbda7fefd451994ae9a44b3c5c3873474e60636373279c99d668adb370ce2ac33589926b42567b6bdabffd658f4d35b8f42a05799fa9e633a12c0a55e944fde9339d6a50e02b8502533f2995a94695b27aa5d028e1cc2b9a5ba9acdc8493a509ad511d0a447f68104da24369b927e1a4b12754a6e349f9e32314e4431af98cf366e24cd9a44d20f3668a13826baa99a1ad63557bbbfd1d974adee7994ea8130a44a55429aa9495a94626c50481ca0acb0a0b8ba5c5a5e56bb95abc986a64582b045eafeed5c25423e33241b0ea5e30a69a19be7c39b4af57a5f3f527983f7599763e3b241d91f444f8ff4352ce060e481021b401f3121227b4c96012492b81ec094222217ba841068536790689073008a4015c014c1aea4026c72089a024d647205c9c07168a161160528e9b241d6ec4841a188947ecff5f067648230d21cb025740a191ab8343ff501667d6f7591ac3ff430de6ac46781d4532216421f1a094d66aef0fa4d15227bc1613aa14666a870e0993746c520e354928e9879934e438afa5c42bb9de51e342d63791a0b0d6de9b2456e1eeff4834a41fa5a41c9787d7c275266ae37a5ffd5751312d54c22e833495aa19a49f875209a9a98341c19839e7cc5d57410e944fa8748f5bbba101048000a3190000002114858138cbb25049d80314800b26524a407632202a3a26924802413a1063281061000601180418830c428c3184652d72b8d54c76d73db0cee0fe7d9f5d3fb5f3e4f5fc1dbefcccc7088a44dc784af9ae9f93e91b5017e84586f0eca1dfcaf36287d334ae5970484ab91740695e20571ebbf66ceb7424ba793392972f06bec0345e01abfe02d3d7bb6b2365085b06a68977d7c64d39cca07305371076baeab87989577fd434dc15cf8fb36315afeda338d2507a11c9d894e12e83d07dfc38a652c59cf22f082444b417ad9cb4f6d54d65586b4cf8c649d82cb6f21236ebb2cf1b62e20e4597ae95de774f68a6dd0735a988d57b251ac2573d16a331e125866302fda0856d7242657c006bc496adf0f6c57188b34b23510bf7c0876730a56a61e296e166e39691afbda3e42d28821a991ccc30c091e48fc0f7244eb259220f8f1a35becb84cc05c9198eb70aac904474457b3635e8d13fab48d9749b43e16443d3651413f2c8d626632d2b03412803be32de01a7049c941af3013c9b023ee0413952759c383a52e83e1ed7dc28395efb77f07b2ff7c533f4fc0cb910cb2aacfb528361180834b4ae8dc30dc35c62b1f167ff3a2fc6379a0fcdee69cc221b41b3ec552db3babf16564c96f762a02fb7ae9bc4c26a2b1feb7a30f342675756789ac6a7819c08d2c44a99572afaecd952448328744eeeabc731ed8dad8a9f45bcf80c31b228f34aa83f198f8975edc23a88c4bebb7163268ef818856251f6badc64ecb87fef148f3bddc414222e5c6e5ed14179634368c777af519096a9a90221ea5ddbacd2712c28360ff2ad8fde90ee55375f45feaf6117cd5e43f391839eab58dc27c80fbd240568adc1b6ab0e760991fd0f4062beffc0cf3009bfb5647772324118a42fabca70bf468c3f211568851f52ccfe039431ee3f70be4cc2ae1ad91d18491026e6cbaa23bcad31c34b480552be8cfec0ad57be6ccd9171bbdd675eebd353387fef188bcb2fb3d4ad8d55976663a1d9324c29b8cf4f788ee770a94efa2af265314a32e294cc912ed546d8cf17571c35fb0173370e72d6d9b2f44861d4594f12baf9de7d14df111c80fbb92b2bf4f617c3bf964a9034de1c98b93d4ba83830a25499c571789d21d77f3cd8d4825a6a735cb6ed7ff3f44d85b42dedbe229e57f7f45bbbf96d25b66543517ada592ce13cb0197fd06ce12e7d15e2c55600c23c1d73660d357c9a9eeaf492205fa8da7fbcd3b71a0aef5c698840123f7cb6876b9ea82adaf33d76cc4632f4d45deaa060687068dc754c0bdfb1eac12c85050cd5a154c0eac67ad9f2f52842d76af6ad4f47c4259b02bea2697b5e5bc1cca882ff7aa29bea8c85c833c0b4e5e3259806f2bcd25a45c1b0572ba5eda7f823b852b5f229a57c261bd2b08aea4a1563e7da12b701fcd822f31a2015e7ef4f11c682740b93dbe8e3770d9b049e96f98a856df9fbed729833afbba53d7e7e966bf9332eac970a4d8c135f859c642b8516720779c7eae0acfdaf76c134f081322c7b859264eb699f48e1d2c93f4dfe34551d5ce2a35b803e50ed729c06309ae2638d143afbdf5ec23ab02e9d9e8372538eb58f0f918cffd69b3f649ba7ef1cc258d7fff7d3615e5a696bcbd56c966b42e085c8a8543dae4d8d7e2c81293db0bebddcda23d8df0f9b62806bf9a9c4dda6120ea71d990769197d746061a653afd40700e37d6aaa0b350a4b016db159ceb7288870d5ffe657a2fcbab1a9add1ecc624f7df44f1cd918a56a40a3f593b976ccbf85d53f131d4993c00d86805275a8133fd21ba1d451923f945f8141ac2e3ff2f37584a2a4850504ef6054758cad51f2bbe75a5a0192291c08cf1e70decc9a94cd3bf40812589585295acde0cc9271a32d5110b6cbb0fd437b2f25d35ce4de3e73ab1b008e6903b3bdafff65ae0446f1d92fa345a10db3564a709989d108d1ef358026eee0364699f0839554b3d07bbcd4147cbb930d0a86d64e57d42763ffd708fd96ee35b670831a4ff54969c538c7d1f8b9c8c09886ba94c9f9be09248997b6aaa3d35308c9e70d9df176f8608c455af51b53e0d2374f17eda6ae66eb19bba16d517ae213c85752cd1535ff6079867b7a2b9788b08a17d71862611478fa3c5d78a102c33e09ec504f3f46280533fdc15c54d0360a43afc384317548a85040fe6a7366fcded381d3c95940fb430ff8604589ef0c70f807f9441eb2ec304c5787ea00039575646f4ef6757564ab7399595fc3bdbd2ab7b2bc370de2a1dbc1bde5b1906a2737fabdb4d28797983ecadd2c409fcc452ff58e5399a1364dc9601388b2ad8f02c733eceb0a628722001854523d9a1c6fd99430d8fd99efc6bd80666f54bc6b79d6116f2cbc64a7c6eb8a11b93bd9cae44a6139d73e0c30f63386f54ae5a0144a0504fea498612942fc051141cc8e2cdcfff992e846252e50c303b99a5aafca1955ec7827ab9e0a7c86791380326673227692d291ada8add0be650b67d1f312793c656716a04b5495a94fa8aa7b8cb806ca4b6a3c7229ed43c1fb0a9161a30831a6d1c000f7db4512d4bdaeb73420968012fb84738d37cfa187a8b4f2e5edae4f01586a1ebfb4cea3a113b772fdda99e319b8b9f61e8892b1a09bc864064fdcfa54595de4fca517b5ce4b8dc1667d79929f23271e7055a53cc1e29e4d7c8ea0935ffbc9cdaa532e601e10982676485ce62ecb013be71653fa13cfc17acb6a05ff2752b98ee1a7879236bb32385bc97965a441355b137b6877db345a946d79b3d9d5112cb225ce4adb5d41fd46831e425313fb8afdd1290ac0f51c9b88ca0fbb709b8b9b13771df0a299cbf6ec7fc767d004d2b410aeef7a8a3aa281de8bbadda7aa8b9e23feb59acc1c07c4427d697796420d49ab71d0df60360dbb26b9efb955d8136ee04120e2baed7d3414fead29bc40d71af1784dde8878cbf58f1e0e1b350b9b618926a65ee2f62d337bc1e9d5eb1ea86495700665cf63e347fde6755e9fc51b799bb92c162ff9985c7734be70182c00f062aa263d9970dd1dab2279554a9ca0f61d675ad65c0d76afa2d8645c0b1bcd98ae42368e2a7cad669995f959be8bf5e1fd28a9d3dc6ae453646e3eb82403746cd446743ddcdeef6d2c96c586c1c193474baffd2059b9c00db15c2d1176a13d6b7726893cd50c6bbe93a6477b4225d6b872a140b086d0bc7c9358a39f621d1a0e8760571122e47586eb51a519adac2a1f3281307a2795d94f77d78a80712305085a12056ddfc081ee38bb83e12a4a0f25472e50f832d0c2feb2e3c37d4e2a7ca95ff7c5eaca6d981945008798022288efe93bd12ccaa01186a0b3d8a6aab59cf854d64f1861d78aceb3be76b959b0ce81a9402074a7ec74aea0908e900b8276c4645bcfcc1f59ad835c77261aed8ab7d2c6fc8352cb59b0902050754eaddf7a602d2390428757380aa3c4bf4397198b64e3fd13c6a4ce19f1d471351869a8af9677fa9b66e2bfce9b75a98a403b929a9a6ef91908fd8bc800d310853db1310baa37339bcdd775c4d92fb8461421eb451051c8893e22045ef97736de3eac8ddcc8c6455ad822dab3d0320051b26c7755ef77d095f064f3e56a3619ce1d47306dc8492e80d02d6c4ad485fe0a3f33ffbaf6416431b3573306ba190108a9f33842293480fb1194c750fbc6c48242ecd3b8e9c06252f0324b142abe57af26cd8183f3cd7ede6ad49b76e03f66863cef5e489963e6d49706b274f048992a05adf117a0c06d5b792a8a6adbafbf4aa96d60885afeb65dbeb18b7c70193ff3521576047eaa8ed57258cac82e879a215363c0b5afebf88a0121466ee2a13f2e6b65344d0424c9d3a52e3480161214f6fcb62d8af22d4153b52f2bef23a34e51c350b98b23168e152e3940c756200740d45c546937377df52d007e7b2bbf13f8d5e995d3313d11113c201b657350cd22c2c2e1edb354a001288e1df45d1862d822677aa0ca0b9320da2612d4710ca229632133de4e777c37f3bf868b8238c73380a80a26a02a91c4f4ccd6b260df9a8baee05da9b60543b6100e94a05fcfb33c65a9c2df7dd0293d61c288dcf7a7004a7a163e1c0f6489616dbe781e048ff1aaf73f676b3d3c67eb9996cac5a8bb20b923590d8d93d1581dcccc20d6ed1b86db26d2a8688199a341a33596c0a6aa8733faebae434ba27addc2a2a03499dc2827a71687d60e77bcb6bc0211c698d5ada47a4a4455365360842df58d26bcd0d71a9f52e500c6a8a2d2a091914e3faaa29f534cd782bbe401946c7f762795d62d466a1cef8b5f509fd8d41b9cb2fd6effeb87be5966adaf34683439aec99046e35d25e22cd5fb6f53fe8c41d0773a17430ab640ade5c8b8c8d4851f2fad6498585cc16a721936c6dfac82789b89060149fd04aaa8babbe5be2d5bf82fabd3865b395b1b9511ba2f7aab0ff23d9b86d6eb9f1a3d42490f57b8835f34b8815820b19704e45586969bfe92b0f0bb7480d2be1327cf261b2d3cc2e0bc341a2edb2aa6275b1cd89b8c43d2011501a1f40471e9f16208be9a52156751abd1c5c7e9cdbbf20d2b23d0a9cb88c64e0ef7a1ace61d111fd2916a428301801d1ec00e7c64d1e5510609daf634ab8599e19674c33d3b0b743146496524999b62455020c3a2db264bec2273cb7be9e511706e19af04dc3da2f21eacfe6788516ccfb0a47ba16341037298f43976528cb6d57429885f03365554cb64de0640550db9ba7fa71c1183c4b57a8f909142083e0f7d038f2c9b9b84cc7ae4e3c6116ffaadd942b79e5bc75417030e62cacdbec41ccee065ed39debae0a41e85192c69075fe78ff286a6d6cc1706a2a9e702a4a9f0f5db6079a3033fb80e24a77f7aa96e3c51bf95ab12c79e7655dc79ac569714f76e93ddc7baff6aedfdfb7eed01312f4313e38116b4dc0eb74b2e8b9c35e714635586b981650c2760d91341ab6d20cd0f78305c726f940b48965e53822eeb29705e018e918a94909471ae8299d3ca92b91c473c8e24aff8249ebc3aad4f9e0f0493b1165bf3f0075ff052d9a676eda94bd239145b32368e1e609133326cd142488eea5fc931cba1dbf3be3912bc29d8b5a28768c1d39ffb89e1728b813f7a245c40a73e30e7251a96c1149094d9946b66b91c50efde0ffff4f150f4f8b962d2b4961147370ea922ded5732756944638a6d49aa00aab6260ea150b2559f312a437b35634a8322627a54b880ead39ed5ecd2af41be46c19f9876be60208c97b21685858c51b92b4136d6a081f50e76bcd81d89e3efac0b009c23dc715083cf68671421112524a8501b67d16862c6b23d5ba68b3e92ae2c2c94e724fe2dddd0d41f494e334aac28292ba28a511eecf88ed2b9a4023cf262f7c23ca29a121bc8c863893bec292c28cbcd0e9a5580e2f58c58244d56ac1253cf36c90da245acab2f1131975d16c01764c3484d4ab8b197504268214b402ff9a1366666b54008f9e8b290172190e1595076140da26af688e19a06a9e51bc24edbffedf9d0164ed3a7de1a8f916091f585676262bf815665284dc3292598190ba6ad5c600c19e7654438112706596a0ab93a373ac855ba41ca08b3131f17df474a964c047cd077267a14923828f667876a6bf9b746cc5b5d6682e4a0315578357a62a3bf020e484f531434c9ed86ef91850ec3b3a58fb854b9ef121691cc6a9881e506feb3d8cbe54a9b07d9d627f7e41d10713776dac6230ae71f42bf6144f7caa0e1226454ee03e61a6627042a5026bb5a1eb8f902765d27dc44e40325610acfed099c243c1fe3e676aaeaf85840e99e3e35f82abc9fd45f658c028a0fea14f6dcc365ea83c5c041e26247f4a0a67e7df12c63e5eb6131cb6d92e31b5a1c41eb03a04ee6f04bdbe6352b3d2aa80ff3bce79c1b8a86dc3abd5d745a7c5f9e831825de1b1542d86f4abc0f827a5c9d6476c18dae75222d28aa0601a3b97092f4ee33db579f5bf838e5745930087208d8f833cbece0521d21c7ad544d9f99e5de4a7fa1dd76942e1897321dbace50fe951eb7874de9e129ea6a6b7026339486930bc4ab28eb9bfbfc9d3cde069494ddcb78a3fc8301cfe3eda03b8b51c01c4702bc0d1686f1b4ae858b0505fb5bb37d8120644fc2892804c76ea462b28fd60c8b9687fcf615a4c5ab4458e454913b0d8994234d519466ee89f9e24490f916bb1ac4d500491463f6b880857cde93151ea22c912b15e206554f1743940a77bc9b3868c491d3b664cba8def02ec12dd05b9803b62be7a2835f625f5d449e6aa987d88621cb63ab35a8d4b8ec9689d95012d18935b1dae908af41c62c90a90d87c2eeda951217a24901ccbf6b075fb5a964b9180d21517c289af6e11cfbc209a33a430243d6edea10da9b0651c3cc9ed10ba8289554fce84fbcbb86a270e410709d71405cbc8ad404e5a706f785a504726665660cb59ce406273522d64a6c123f606db9501c8e12a5ae39e27bc32b04aa46ec7f492969729d5acfc880d8b4597b5c0daf8aac10a53c5a6aaaac746c91a1cedd86ca5bc3aaae20f37bc28ac5f043752f1796141ece9c1a3d811a234fe4413459aa8345974393c74c4344947b697a2ce0b887095c4aa24296227190b000bf8a811a433f92481d3dc0c9c535b4c00751247ca01c7b6a71ca450ea4061742943de46556701174400ea0eeec2157646fa6696bb72fa79bc4bac85e3330638a2da6a32edf62d2c868d015adea3e697066109d7ef8eeebb02d4ba04a3556341e6b2877b8f18086b52e4caa5a7c3b1a1bc0e13d46ee78a87317b48e75b1ba0e49a0995e1257c7a37e31bcae94a0472f949dfe25ba8317785ffe6e52cd195402b8d03f982a3a3ecb14bf5186869ae102bc80c27b2b7227bae75a48103a4282018e4028860a9d0f840f3be54b682a67bbab0c1a6f25cde7954106f253c5a26e65d3cbebb1446e075609e748a1d87281efe5a3db795bec00c0d0225484b52ae46527b010de2d165a935608af9aea1ef5afcc13c5e9d0875291e871557463d361707a3369baa2aa2f4032499f8739879521544f482a7d5bd0d473298f24587d8453b7a60fdf00c092f87818783e073e41fa136687c85a70c3cb235818171d08e1f7c2b5d3f7ce7b46d23587b0cdc6e0c11981c06ea1fc4a20e8eb6fa2a945c0d3245a9a21360fb4e9275d11e3ef1e28da7eca8c419f9453d06fd39bb5f426213fe47909df7a82b1190f0b51dda427bcf39eefee73918721320708c8df87d3958fd08c7bbeba2f8ae4603cfd6935ce1b7c18a9010e234006736823b837fae44a848b29485d79c88a880f1dc168bed12b09844a0ccf7d8b1124b88de288e0bca8c6efd5d02b0c852d0d668f019620535d3a5bfa87e80db55760c206f163168d44485c6a611429a410dab99b62d1752d8540433674562d333aae380d0abe0c29731d7c7e7a0dcb98d4cd27856e28961e01ad94fdf4753f211242b02aa1733a8f8255ca7aa0b5a926c157f3535801c0f8955559858f57265731812a1559d93dc678bdd76459e0a7650a13b9427dbeec95b847e998693a1d414369470ca4e111141439e650fa689868b7c525f57b9a07b0e5b32903d70dad878f996aff6c7c1929c3d78c3ce67489acef24a52227539dd5744f1462424a0611821114c38cefa4c72901a00bddd7d02730e34756a0ed3128a4feaf37e9bbc6703446ade058cbc3618da6ea6f73e5bec7b23840878d4b8fc7cfc620d1bc3e65c0e1e8fbd2b3f078caa165e121f29b02b5972dcae2e873164c9460b20122725c2a9d3bdd9c59d8832b29dbb87f4be823ad31c0bcfee18395b2562ee0a5a39c7a64510acfc8555b6383493d4b9f8ad6a909915698f52a659b80d3c9ec8e82b7f35b8e707697ebc4fb68e6e489f793b7c403d50df148fff9117af9cb365efed098ea7e2e5e3a560e02437196e9b26e58dfb99a2e3771cf8addc25bf6cb42459c67a66e6daaa1c8f495786d166cf23bb77b0eb6fa5063b9baf973e8649cecb2367a3a09cdb324a363857943a74ec9a735232ba23da71025279e23851d2730c7f0a3695a2b87ef0898fd292259f03b2aaa92cab481c352466966e902bd575a83ee263efd4f199c1ea64d1743da3ba1f93bb23dcd4afcbe24f0eac366d3774b33595d4f66ffe6d6beee6b7f839b45db8a55d9eab6ea0703ac2aa61b26702d865cf07b590763c61eb9103cd47f429a3167654fda2bd7d5743fc4d5d4404a1e537993440a3d6209abb76a6cd2c25ca514cf2d620a55e1199a74980018d49957f2fe1147a50054262b74af08e0e65ef1a92b70a26eb5ad2ffa0eda39269c73021e3c0353186ac812e4cbe24ef25cce85bd34e9c5b0efc493fb2994258986feca93d4360c29524de17384ac1822be64281c3ad7ba7fd4a12505c309605c4b5762ecbc6a7d1e7883f7dd9d2bb3fe8b8b5c14a88d2d3aa904648a147463a0cc5e560afe32161524d845428779e5807d4a98389027a2979ac3f1f7c15b081d8a178b0df2a12612c6a646fdbc2e84acfde098e041c9df56c78a74d570dcfad2ec3a4a883f6bbe2af51c81b0aaf4f821d5a258caae6cd64ef0c041a109911cf3465c08565abb8b8d27382e0b42feee4ea7ec7a061184594c89304030866208a34a000792a66459a1ad88e9b7d40250f1fbe30ae56cfb41dcc7f86f35682a4e9d8fca836a9cfee623a1f1d966cc199fe661a5b2c9b18aaea7159ba9f86064d275a84e7fe7feaad4fdafc86be2fd1276545150b87ca956324097f22081164593f5c754715821a8090ee5c5c363bfbfcf6672078477438c3bffd47a03772cf603443cb2208850af4dd06b458d0f9357c405cb4b560a6d33a0a77a905e2bac0a24610621452383f01165106644144c0da854d001234a79e3e6d6a650aa232d13a3222ae782fead859eb24aa22c0db3d1861eac866e52a21b768028601595a6209c578ef3b4801f9aaece43244f58cc539977bd8f71695c20544e62bfcc51a5e56e4c71d7779e114d4cffb257e6f9c5026098c78b23a68a75a8aa12136eaa188f135572029e8aea244de5237600cb85901c477c826cc55c9135a3e735d091cf531add507165c58b17dd9fcc3c1bd3fa6fbc054348ca5ebcfed2f7af3f1e209429da7731e169321888374e23c6327e8995129e98376b8ae9e2ac98d6881643e957846bea6cf7d2ecb972c39bdb3a98c6afe5427e70f7a5fc4861d48d671d961e21445f6ce45b64834d1b510906388671540c998d2dfcc6accc6e4d309b8ad7ff775d00be77709a07e06470a96630b387a9486626b3bef45d8bacb1b3f8e0b2df4487b6df1df828bce6fd17ef82859dacf42bf69c76d6e3bc63f432b21e696b6264b6a8acc4c6f14a0def75cfc2057f21867f3ae18f86920413ff140c62122739be9cfcb3a6c8b3228a4c6210978a4ac99c80d25fb7c843a69f00fbe88185242fda1a175234ad6b24eb2873166224849363516b7911c2098a2afa0810ed24ed27215886b7d83128a98526e756cee491936c43c5c4b38264b9f713cacdc84a32b7d077f7144aa496fcef9b417e29b29fa4041e0a599bfee344baee935c57091fe517782ec1e4b0ac9a92e937dd27f40243b9adf4941e6016c359caa4f9d94b9c1305cd0f1356c6155a53de0f111a0a1e2bc5e1a0eccdc0a66b74a09bf31529c237c3e77fbfa4461381fefd2fb9282a2ac0c018a9b08536e85b8c070b21a2982653919ece341099d2f33b47d18802e3665e6f08d8a17e36199099bb31dfb82886160e8baa77ffdab2d3b9036fd18a4255ba706b3d46a3108314b1f468939560e4720c957c1afc995932bac77b5db7622bd5d0d54991a19df281028d1835e756295a14496761136b18b147b8a4ec9119cb1e8924003eda88b81f13d3f88d224922e16c2cc42f0980c6c4c9133571bb208d6c2d13964ca46e76502a626e3a089b32843d980dd8c372d1f7f19483dadf01742eace9fcd183c21af755f174b7a52c8ccf5a424c2d602183cc9c48baea3d63990328ba9e9a1f50254aefa093334f07fa3928e32ad0c9fb5b9bb83af31861c29b20c1335eea2321210d8260bbf69919f99661e49809f36596f72527e5b5abeb19dc47c8024ba25a50388a0b340977c128d6c3c817409de217f8ffbb1b2b19f8f90dbf5728187599e1138996054af99686b92a9151827ded7c4118317f8ea948cce8bdd186872550cfa5383549a0e5f333be428a28e424c8b73dfbe50a20c2c612f16a10e3b61fcd5b012b66d6ae46fa29000245d357b30352e469c4ab013d7f50ae09b28c5668611544dbe016817520ba497730794b5d2d221580f347b5894175e11b46500489100c61f8a155e196d37b63f0a421f082c5c6cce44b9267c8ed5599bf50082289957a4c37fedd87814c72559521d309f569ce3cb416f785890aee6826d5583baa4290a8a061bca81f9e18be205aa5fbc30ada591106584f940d2c26bab64047b9b6df8ad1ba969804cf6efd38544b1cc8a61c972556ec11560127b2955a92b9b1b2ff740b0eed8f6598ed4d16d99e96d504e43076b52e90155815b3cc9c481bfe8252caf882af526adaa14e06515d60a34aa08bb59a7d185f22caafbda190090801c4088e9042fd2783e34967162afa614579702e06f2329002db756c31a75827224ff0cd05ad858ff6c0f8aeaee39e6b9dae75509e2d156c54ce09b77fd4a8836e6f6745030d277170469ae1f6508388d301554d56345128d36a61c4a6c81e9b0275800de30705c63d07799d6e91f7380c816e83cda2dacb7d7c9ff709a822a234b6c35b9c5b1a04919be37e31f11089c52cb708f2e8ba3526413466358c0ab34ec7efce588ac154b560a89da766f65d23ddf28710a34140943cd2e5ca46b955cce2fced06c3dd480da279d92f25222cf0fe7c68ab85bfe2248221ba4881223e43c0ad0f127e2ad0f1847dc097e16de66f118c0e9eb2b1cf6018ee8ccbafcd45164199685c73dd214fba8179f8414f40bb788c8433290a8e06ca0095670f7e32e4aa39a09b7c46bcaea09624df6309ce6103060d870ffa3ee7e79a69700411234085fdda2b73541748efb84d031f45a0192a469250432299de9db5f74c6aff06602759b6c182b3a483c50966f29981d474ce842efc2642d0187463698e5de5b435e89940151f2ae042bb8d02e8d11da12156d533945f18f859325a083727e2c8942f1416b48389ee4eaec6c93dbc4cee10b0996f42c9e192380ba6ca9f9923730a135ad4f61c3be1e42103bbb6858f91fbf26cb67ec69d9fdea5b3cff49ce3216b66b5c500a376ecf7bda06cfa3d8aca5a39279dd002f23b7105cf7ca13907c893cb4b7a9f514c58b2b11257d06840c9b91d329e43664683e8dd86019a7e6a94812d83fba878a86de648850a4867afd6d30168a0532ea7022996e50eb1f7ffa52ffa9239405f195681f75a0ad798e5d46af1bd82891b498ed736f5024516f64301b218c1ffd9f13e8eae41c2583cf98cd53f8990f138005d133b77a66218699517e359a1e1a6f8cb157b72b8ccd078b357c892c122463f7b404d0fa634aaf7ae5a0174cf9324c73d6d9ee83fc62faee041361136bf22959a4ea14710667acd8d99b17fce732ca2406b1e44c0ca5ed28a947d7dce5ec1f949ce107fab84868b5840828064b99e2bf24d26a4334188f8603f4826540fc28f6e44e01cc4e1352224410da3b70af91d5584d1f5d8b61d45113b0a5b580d3a360f4d2e685e10a13ed7afd800588284b1d406a04e5aa1d461d0ea81566fb89256e2d1ecc7557695b0cab90ceecac6c3e168f87cb25dd15c896e8ea5c5a2e32c5ed7041d6f4c4476b50474574a407791047ca5a3cc6fb6616f9c1b1247693451f98f6081bb4ad7ac16bcd89c97a61cce01d2c5cfac00740f42e6ca4bb624dc099c10ea7ca608ed890af2fe0d2f019d286bd502b4270815d7379860815f8b1378c26c252fcefc506fe71d5f99aab7f3c25e3998b7f34eaf4c793b5f0ee7080ab5ef04489fbd36a915a9422a8ef20e242f5d1ed9be3eef62f06f444557d58223ddd4d4bcc0d6199e66ada3e8daf9e8d8bbb6d3897d302a6d3a69afc8fe4d99397380d2922fbf5651b5e039774ab6fa27aca885faceb1a55754375af706b44e15b9e9fd896af73fe319fc63556a6fcbf3cd10eed733062e43e3f539c06c22ddcd1ab9deb645da4d22576e68a3dcb635a936f2872456d8382f60203e59dde9b48e9a8aefdb6d42e15265febd82393c680785a534431eafc3b2ec5de4acc789f85b395428efc97311552726d9dc0f0f0533675f9924d7691ea6e1b9dcb410fe92a2e8db8983833927173c27d2c1b336e2947fc8147b2b8fa6592d874b7c6975d88eb48389a63d64d9512411f7df45aa8ef8d34e472113394444510a9e931e82a8882abef95b179243ddb8cdad5c6dd2c0923e0dac6c5d9efb394d66042a70504a66d41398f874ce4af8bfd82a8ec49709c99bc1f53216c372ed3ececeab6d6f32b00122966be2e3115b1793c71b9ddad14e038b72af2ba4b6c903c99451030947f4023f403e991736c9033eb385ed94a157372c1a3af2a2cb177f34deda91ae1ab524c0c47d3bb87e22cc1994c29f14ac0e6de0bac104ab3719ccbcf260e11d09d34912e0ae8126374650bb2fa3c4cdcd3fc9e788e0330ad15f62d3eb185e48adff71beb9bc28defd29a0a0ac5c5a4ab43b72828bf4a5fa1805aa2ad79cda7381a91d1794da9f9421f70c66e6380465b2af6146b3089d33544c05ead5de0d514e5d5fb1831ab78f30649a438a6a08fc6c27aea81533f4de46237a8f7b64a859887c2a7bbd1502804f2318072ef88ac525615f91cf06cfdf6b36d0d34a70564a7659451061aa9865950aae695021e1773624490039f312ee8fe91b434fba38cfacdc0e09f36f61cc441beae399435d0aa6e78cc4bdb6480608957597819e029622cd9cdcf4d529711c544817376941df57bdd4db44cae3f0c0b7f80320d720f7d85945910c6030a169aae9f90204cf6a8644983f9644e10f305b3996cbeb1e89840655a8c33ccb491092f009bba4fdff85e0de78c16c3cddac88fd3b179deb4b51bfc14010551dfeb1f1716e9dd18ef790fa8e1c771b14101bf2b39fea98d63151d05d85542897f13437a75ac8cf80f21cb3946986394005f069c9289b748227dc1903d1ea03c70874007ebd0deccf9481c14117881dad4d0580c1064c8378ab22a5658116f7d59720a7e5348845a2eb72786f912c42c67f54814be72b2cd3c51058f567b135b2af70be79d15f543000e5fe735a7fb43030001096fa66cd5d950a43ee3c5aa04f07b14c1939a526e818bc8abf574edc595c716034e1aa27065b9b42fd78fa32c64f15f5d03e1d414efd852c0f0c33052cc9017a0b89365e801211b10ea8bee70d8a94aacf8ae8ee4e1ab252b4aebba4e42ff3799e001077a83de30a04f416639d2c5a413367dca04094a5aa11466f29b7fb1c06c5bb4f5f025706ea503d0943b8aab0f78db124b54835701bc5c02fb7513699a494014903490362037ff9a992b02fa24057129a0cf777dc7eb33077d4b2df32992c53f77661ba31dbe2e82fee877d11988eb13386d8bef16e7f7143b00e28e812bbf7de6bebbd321fd98dd716ef77ff7ddd98f768ed14465b49841849159e1747ec1bbb116f11232ce4f98e5102b59288000ca2ddf19b672c094916ddf724d9bdc655ae0439dadde96c184c37fa1631b218c5b184c58fe377ff4f8ebf7108a87b24f5dbdd7d646754117e0a23c6ef10418608498eb15a15cacb194b58747fe20a228820429cdfba311489445b2412eded62ba11138944e077bfd9809f01372009d28d38d375a3dddf582f4df71d69b7d6546ede54794f9b8a303ff94a02d85af1dc4abb7a60b01b0dc3842ad2a0ed5b1c622b8f96004ecff3bc8df7791ef8f6451abacdd78d9beffbbeeffb3ecff33ccff3369b71fbcff33ccff3bccd88f9cff33ccff3bccdc8fde7799ee779de66ccfce7799ee779de66d4fce7799ee779de66d4ff799ee7799e0792dfe891dda8ed28f88007a04b088890c30e7c40b9a0e4c4070cf8aea80f17d89c5d511f549820a28828228a8822a28828228a8822a28828228a88d203f1443c114ff0756c658c0676658cb1851d3b76c78e2f76c78ead630739895d1f104d4413d14434114d4413d14434114d4413d164b5aa2aa209564deea697fc4c31a9a42b173dc84903409de9006e3e534c2ae8c9344dd334cdf33ccff33c2190d6f4964eb754a6699aa6699ee7799ee7a9324f930a7a42d994699aa6699a366553299b32324dd3344d73059282549f0a51fa743a9daaca3d6198d6e18340445397d8b50078d9fc371ff1fd0b0281808c5c171cc3b4f6125814ebfd10b3602b09ab85121d43f58f7defc8258a40831837e286be7f2dc702b6c98b1bc92a5692ec6b3521bbd8c5d86575a1f81e78f3101da3319c65d8414a38f7b594315105e3d16a8bb92a091b97c70df96b80fc5f57a8dbef88b12a36e1856b47a5c8047df106b17ad0c40f683f85f245dafed6d18e0ee8d235451b74e9a88996989842d7c7f5de6b3da3a5ecbd4ae8810225b6d9a59e00b6ab0e9d1446881d2242707036e0e775fa12c1e7755a93e1309b966157b6300d1e34190eb36919cec0952dfc43490d569f5271006b30141f941521dd98050a43051b7f00404014c6686750bbd4ef3d60ec3588b97b03b6add60a0a2693c9945de414b7322aab6474dfaf79259bb295e7c52385253af38abc22d7905dec9c6bc836e4157925a7e4151f9325e268a2344dd3344df39971c82af99457724a5e91cf7c86962805ccc599a8a10ff42e9b3b285005aad2344dd3344dd3344dd37cba8865029df9747c793ef399cf7ce6339ff9bca8c78647e59607c9b3f210798c3c4a3c693e3f387c583029f3b4785a3c303c36b6a7e58678ef81e1f1c1d3e251e251795a3a284cc2240e91069dcf7ca6699aa6699aad4c2693c904aa36251bd186b44101a6600d50c5a19e94c7b3baee31f228f1a83c2d9e5467a29ed4e7fce0f051f99c3e2b9f94cf8a8fca456ca863a393bea8f3828d6527d561b9a0db41852617b1a10e0ac3b40ec3ffc7e4947d4dd4503ef39966ab2bd561c8c956d98ae4f25b8e39349b30ad39c8320cff03551ccaa196c87a675aa00ad33a0cff412011a8ea4cffe84c8c8a5c768c91a00a7b522e82d1abc390c49e14a8f2a44095382289237144964f1247a1c93fa78b6012a67518fe8340d9189afc6309baf4a452ef49ed16b2efa05cc4519893a5d6982cc3f01f04eaa0c4917fd86c5f3b6f0b7f5cf8d6ac979f8fcadebefca0e5e7b47df959f99c1f93c5d8f6a45c380181bf46b0634305e659c0188b1bb1de6f355b395feb19cb603f123ba80eaab343c708df6141b141980eaa7c8f2cb10eea737ecebac23566fbda795b78f4a1cc971f175b7ff97ef7a7868f0d9600dfdf07096b01f4e73440f959d99f94cfb9afdd9f1537c4fb8b6d70cc2a09cdaaf09ed4c44afa0c5353aa624a612a9d862f02894e2c459b4295176df4a2fb3e265d4cdaf71d75513b6455b0a18203965d778c2d2b632be7ebc2b0ecc2b24cd3b60da36d180cc765321a2ea3d168dd759eee3ceffb4070b3e17070846188102236186ce43c070706f3c0c610185649d0a0b1169ee41f1886611f9a442c53805f644983be756771b4ef93fce386a61169df0f4d7585d12785492eeb9a690c965dd124882c8d5dd124a45ba9f493f7757bbf3957a28550a4211cfde41ff64515bad454254d5557e8debee6525748e1ed6b3f580270bc7dadc60df9defe26729112169d106f7f1bb9088b118f012cc421dd904d8acdbc21e0dbd75217114574bcc6e1db0f47cc3f6cf7dd08aab017998deb85ff56b76cdbfcda6dcb32f7c71ce7a9751075d8154575d07e9160fb0b0299081dc3ee86c90e20742986a18f54d2926cdc8191d9ea18b1ef80faf72b499273e8006204ff7d8d4b00266d107b73f7bf306012bf39049b0d626f1aebd3149360cb8d5cec7223ae71fe4d635924dbe24672c6fa9cc90e17fcef2f00fb92189cac1f0346fae3b748158ec791baad8b1c714367d2ba206bc286ee357143d7dd84872ec61887ae655996151a73ce39e790355ed7755dd715ba6eba994addf39e696a325991155594145de88c338185ee6f9a8a4b5a98458e64926457ceea48407eebed26d99563219375b3988bc71ac2985423b668d1e2c2b4d0db4d6bcb0e2fa8022143c60cd6daeb2a268cb19565a0649caeebc23219a90c95a6691b66c6688688e3b84c66c68c940d874d7c81b5324ebc438d193084b0892d7049e1e2019719760bb65bad55915427acb5f7a2334aae2a552fc226ae40f5427542a9545433d8e1059dc864c83206d4c0e4860e2728d016a18c879dc1b8b4cdac66df6698cdb22ccbb26f5774460eaa16c020460d13c458020862a44388e10415316c902006104788b152890185182fa80c0e6c6e575486e893daf7fd74939b4e4a5d54758c2d2be7cbcaf9ba30ecc2b02cd3b40d9369dab66130dc86c1705ce6acaa8aaa60b83425f2e84ce83d6f29bda454859a50269b624b56b4b2d7b1a5c160d85733dba10b035c3b6f0bfbd677872dc21b2c01fcef87a6d014b2ec50250b4da18b1b7261bf309b96751f462499a821f0054cdde236e646b419711bd20605b80a4d9d0b445267762b1d87822ab006580374015f3658e386780fba803f80353628c014acc1a15ea8c2c178680255a02a5b752bba925bb943bb94ce943b95ce4577822aae857bc96777d29d7426dd8add9ddc10ef3b936e04dd49e7a22b7527397f21064c71677a3ecff3ecccceecccceecccceeccccbb17027b7b81597e2545ccad5e0509da9a5d0567c4e6e855be174c0b16c6ee58678cfe980db01b7c2a15c0deec4ade49c73ce9f13ec4a1ccab570292ee56a70276e8513813151431cea229e148843fdc37128877228877228875e0d8526722bd54e8da499a956d24eb41187661c324b9abd642fd90d0dc5ce5e6e88f7d98d0c0ad98b76a289b29734dd642b2d8546d24ada8926ca5eb255b64ad3344dd354c470a77d4dd4d0e7fc9cd90a94add2344dd3d4d39cb355b6ca56d92a5b65ab6c754d01bb7e7511ebc30f2f15b96efb22b55c1066cca1bbbbb65376e9290c463a6a83d62ec2658ec276769576493c6320365cdf5a6b6db5d6566bfdb15fe213ee0dfdaa2b78dc1cb67a512944a02205fa8b010ab4dec1097e3082e9879406344e208186c9d62b3ae0346e90e16a1a39386169a0252094061168acecf2417a7010901d76f095afdcdd1dbfbbfbe5c1c3c3dd8a40b87884473cc840d7a0f5aea84b8b8b0bcce5052e2fb0cb0a0eb4cb0c2740efe1a242754206ab2a8d5c44bbd47f826518967900c358c0011ef80045097a10c2583686852d282c9a853eed0bf40cfada159df172036d037d997ea083a04df40af48c140dcc6801831cd8ab19b1fe3ad93182df3ec946807f7d3b03a75abf44932e2f5434692ca241713feefbd56c9a91872a3dd4b5628de8755b2debba36a919d94033b222fec24f1724b2a02bd7e97a8131a764adb4ec9c5bc8d855ad940b3624ca40677f65648a9dff4291359bb57bb3e6ee59c318e3ac5996655959cb39e79cb37695dc54a572ca3d57a98ac91a59d169e7bf381107396bbf69ae42233b1290fdf523d985daf9affc24fb00f722f1c87aaf1bbf8047f65ebb89b76aad65fc99cc39e7edeab0a11f8047db01f92bb0c21c068f5c04e47080258df92806413b66fcc0918b5ccd7390a3cd2141b0b473876b6387ffe6495e443654398e158773fe009763fc5a3ed50569501a1eb9c8adfea13f864f93e27c302a08749ff3dbc564cec407a37edcd7ec503fee733487f3fe7bce6f1626e346dcd01cffb5b08c7c1ca486c3f98f436adc840d6d326f398ed5d8e102fecd2f00ff465bc0e637d202db6fb69506e55f6ad4c6ea1fe00cb47fb9ad368fff43b9c8c696e1b62bffb8dd6b4e2e827291edafee204b6c6b2d822c5db5cbed5ae50f419658cecf4196617e0eb9dae4f25395b6dc5615586debbb725b6d4f77b97de9be9fe158ed1b5e2254f50f6d2c5fc0a3ed2edc10261d35e284f6bfc87a4372ad781462e1255c146530dc4b0383cd069aa57cc12d39b27bb35b6cb1e1addaebb88a98ebebd7ec2a4c6f6cacd64f1597b070cc5b6309063ec4627b1638e52b5fa1fb3eea27b7a40d5dd9b2175bc7999202dbc98de47e1961c3e20dda5fbc41a35ce486f055ea9041e3bf4a99bce4551a3b36a0ef3bd6d2abb2951871438b3a9410894ca69494a824d22fc790a91100000050006317000028140c0a44519885388e04827c1400095482426a6a38134d4471398c433186c418220418600c200400cccc0c910902919c1103bf40d0a12b72231362628c88420e07be6394428bdcec76158e1eb20c8b3c85649c37600d5403999316df13106f3719e503945c14072a79aa864c8a5ed70b4ae9e74c125f9a1e03e7a75b2b2c833b987ddd6f534aae089ec40930cafa62f5cbbcb0887a5ea8bd4411e2f8c0653f06592e29d40e315d22498fc186e4852830488e5fc9e9ed08d661f638d1f230a7c63413ac45c82ee43790f7a008ab22990ecef63be756104db94c971b1f8cd2bbd36109d1367250e1d2275cdfc7753394743c4430ab6549aa4111f43d2ce0803fafb27709692ec1d3bda9b3e385e062f765068cbd35bbc58dfac10652110cbb9e2caa6ece72ade85720860ad45422e1212216cba2ef0b286326f604af0717fc3e5cdd6f186b91a26cd339d690533b27af8d8ac4e3022ead05976b6ca0217d7b703d7f883873c95821f4204572d8d856b985039a0412151ff815e7678cdea1a438974b092609b6aa6a722446b10aaaf19e4c6a52d5c587d6240f0de50148888e0cea47f982a704460f4bce7304ec6579c9c1ff136d973233c4533239e889a5b31e04700b2469c0d8af1cda264c2ba4c13ccfdbdb3ae85ca6b71e1e314ed5f3def7d26f59e900f5dfd52a6635977ee3268db84ab26b66296662543333c29e140096615443cc71e20aba947483a7fda419a39f4f76b91d9239ead9a3a16de772e5ca88f89e3ad483e8b500330f94d8d27e5193730d64308d9fb5053e761b466b21207a8ed4d6a16a88fc4ba2fb94ca904695eefedb982ded61e2db8be0353e0014145f70fd7d0e319d3344515fb75e5698f1e1d60d6e6882ebad5227a271f7b4fb0dc79db5f86b74e4f14635536864c9c3a46b73a30e8a574d4e16ce65ebc5f6c741a953ef82cb9dc07fa7d677ca3b12ccee7ac11d70fb0911ddeb05aa462e1debf637913267e2d49b476dc35eda3747e6d9595aef602b843f72449cdc2ae0a56e0cd85efa9a8cac959c5ee75eee0f7da03dbb8459fd1b8569d59b8de01ed6f68834aea2285d10acf0d300c36feb716f7cdaeafcb3dbd07fe6fb116077b702d519f72d9a7dc407bf232e4f5a39096597441800eeafcde8453fea85ec6ea36372408a809eb4d64dd2d8d48434cd79c5e6bc41c153c17320d5d2dc3480e47c83747607b598d17e1ccb5869c3a254520d12b0d60068341b4400fc3703fc49f5ab49581ff248fa492d2f7e297976a908acd85b9f292da67776c32160c78aed53581cfa8e36e6d969d346c08aedcf2f655f4c2e695831be9401001b924c5a436435b45915f556d7ec1f0f9f12ddfc0a937ca037667bbc96f02112279eceb37aa2df71218d8c7e6e4ea34281ef24b2e0b41b060e7a3602918d3ae53461d1b335aa558dd2e26c7f56b126ba867d2300459836aa7e60317e1aa04a2d3e67e596c322305ebd163066b6c59d277eb63a7023d8602de81eccf91577d0c1c8e7fa55561e2b1239daf424adef0743da9c1d0e117658a923da62085c2c052823af76e5b0eb2068f96ddf8264235d3018293068663a40361256c976c7a2cba100ddf2dc60cf4b04f3c8849ff52c24d23d6f5adc79bd26d51de2897ea30453194fd6149c22d1436cc8509c4a22b54d26d818560b1321906a77db7e583b93b8c8e7a35ad10217239b04d37c912f47b5a2002e402619d248214abe1a7556e89b803cb2e44936392dd7c9a84d3ebf84c8264f8614c9a03ee533161569e19778469518eff424bbec91fe04396cd0421b5325caaba019e46e26845281a2fef431b6890026d837d19bb756c082a83d16475ade722a9d92c6ed49a32f6a89b18eb5c6cfe98124eaf17db09d72882f73d5f0908c3a2e7b289faeb38e6a67274c6b8d7f21bac674d428fb75d020f4f1a23c1970ee2253a552de6c3bb1e1887d0b3c7b8f6030cb1abdf3c60e5f4a0154294228318eae9c1e209fe9c84887e871938481f2d91149c16813a8c2d4aaaf9c4b6f22363fb3f0d619b38f6c13e32450a3221413eb4440500eb4e59bd3c462003ebe991d7252146975572aa17b5b1d93fc8e4ea63309808691a901bc8cb2087ee7bccfac9aebbcc653ad15d1b8d82b06b392994b138d8c3f681c053f4b7ed4aceae9bf80408c0f97fcbba7ef31b5e008a88fc3b7b1d7cabceb1449c8923010c63cede7fa8bbb20946629303aaf01cea64b4f363f195330cb5f57cf1e039df23d6731008c9007828e4ed8cc2aeb811c95f01656d9c8a66e23a14787c7a0f440a529afa1369756eb33b5114c36d4208ebc867260def48394efccdb1709034de4c41f1f9c016b6d108e85561712c5aa8348e3dccde12936747da8b47ce3b91a1a86b941cda95db949453382cfc4ec8217703ced06d7d26445d2f9fd6b6d2480a767502256c1c7fe7a410d6be8bfe0737bec7997886608fc0e134b8113a7b63a540d52285d4821d4ffc253ee711a3f2528b97010c93e9010ff4c1a580dc22152b332f28959bfd2392c1c503f972eeae079303a742036bdb8962df60541aa394398432f4ad10932c400f3ffc7a54e89b47740c2a18034d396175bc75a53d045558c279375e6bcbb88a9bf4d95cbeba85f1690112f11dfe7cf25fe71e157b97a40f58b4e26f854f3625728cab52b2225dc25e209b3bc8f82b88ed4a52d8d44b6e6fa40b2d5c55d66c91ffc3132063196c44644f3b74b778e08163d1cf2cecca4a43eacef9176eb478694f8aba419bf924ec3583b5c8d03cf670043ff8d4ef674c0e0ac2d702d6b38acf18e5a81b752cd954e0c907aaa8c9b2f729d9a763c74b9240c460ca401b8fb3cbb388cf6771c5014cd0068fb4fe776822a0b19fd3fbb8fc2b45f39ca8718841ad2190cc4614d050d394d4fd4212583cd8363edc09f6dc6323e69e09064b312e3e434e4e6835f6896e379e91c6f6daa17c5e0eb63f4f6d015e8783080a111a78b2313e5660aad138419df54f6e77709a3622caa987cda8e30ae807ab3ff5489d2660e4f6f02099f55d6e140793f0c1f146215356fdd92c6dc79ed11708a8c76cd6aa468c7d4ea2603af0542ef9f5d762132b86975f11cf6f8254bed96812282105eeaeb6e852e98a0b81b4d1cb1a57672f9933849758b12b4c8422be3c0de9f0efebc47a5cc4d2236e335be99a80422efced1cd66e12c4eba521d9a91b5ed94ffe014f4fa0241b1d5b657e65e95c42e0b9a853a5f54de691fe363d85aa96eeea85ded1543cbc0a392daa0fff4782619ca7a1eec7807b9e1c63378752defd9085825a45ebb9dec3a332527ed3818037dd3e18197d5ad9efe304a47ffb017310ad0ee6f0ca15feab5adc60ba39aa6e08a08d0a6497833219b9bd6dc1c180c9bbb6af630d6b94e343eba719379dab1220ce88964211fa232210bc7e64a928af9f9662a92d918760f60e61ea28bf71025e384a62029942356d56c6c4035b83ba353ba53b007e17a9f5a19f2a30ed55bdab0aea864e0acad6c46621a7712870edd0043c6c7e4b2fddf70e6d81de9d4d548705e2ff1196e453b80fd79cdffc81c3eabe324454efd3974a71e159c520b53840010b06a9276400cc7acbeea516731ce4ec7c8440681a2f5df222932f9c61811596455075f480a090bb413c521936ca242c871edc0a593f34292e753019b1e7c09c6a2685956909484c5575311fa06db4fae0e9ebd4c14f7c0228e13262ff9b90805e651010d819ad7f8311a6e40c7b0942f36bbec0affa3fb9669a2af6ecd49363ead09f1a1b3826020337578c962c80e934aab906bdd74d12aacd89646677a4838605bd51e6f9b52a0752c56b854610be6283a00106940abdd9de3089de7047949469bfb7ab94d5782f659e17eb995706839827450b20a2f055bdf4570e7ac3b32f15555b183b3f2cd96acc054450d62563b6488f74245bcddb36bf31d3495c7896cd4526785079d15468d91487588aed8908db13ad924a73ff216f164615678a5357ebc12bc34be93e7ca88e2b9c77f2937d27c0dbbe39deeacab8196fa95d21db94310346c57505d394da9d607b06d2222edfb04b4cde1ef621313b2dd1b33b0f8d9ef9cd5e50965fa3d712cde2841cb78c4eb811a05b8d57e1dcf42bad02b604c645057f8d63f139b8a64f46c81a554df87d1130af26da85b9b4284d183c321b60ba382ca92b7659f4fbd32eeb7911cf387d213b82950c994bddc9b42d101c346f6c039afb6bc476158d7c1d0703566d2825ecccec71812a15c33fe47a2034e229259382e75d9f69d1c453d5fe6f8f5a154871730c49cc719a770f2f0cef222fbe507a9e9e6ce9ed973d37b0081e403beca82a756953a35a5eaed56d437634c56d4ddefe350f2eaeacefb575435bf2b56096052f7097637926e6058616fe028e70d89c11b2a4eff4062807f7af2801cbc85fc74946395c778a429714820d7f303fa272f3eb41e29ca819a730e1e38778388c27473df01f4b886b25393527aeb1eb772f03360dad3e379c5fb84767b7ec3f7db895b0e72cfdae78d7126bae225185cb037131bf39cefb3ef9d89e1100c980ae6c35f2f151c3fe0472a2bd05924c44a6860bec559dadbefe55fd82ef65538b4906fe46c83be1d1cf8aa062c7dbb65fdb3afc2358f447b055672b991a7f3c2350a1de0fb07103fe31560c9ef569ea6fa040681245a2af0a5b7db65ba2e3dbca79e9d8d5f1b243352012e7def82b01bd59f3737a328fdfcf352a5ad323d70658eae001c134f6b7f536d3961567c7506390b1b20a7938754ae6579c5d522bd672de0d41188ebcfdf7bac1bb59f649d932549a5e2f54662a4576b55fdd7416c8eb5c643481fda9b757256096bffbccccce5b6b208c2f055676a3cb1f2ed3f52eff948233031c108fc448056885bf1b4386e8d8d465b686ba16288b7d580a57d5eae6886969024b27423460c4f9fd2ef94c6f17584bddc628bd689d685679b04f4a6f0a4a4c6a08afa1bea8a3ead8f5834d229103cfd4d32a06c3b9daef7d99517077509ec2d975217438987c4694247e1a9336e5b16cab2a21dd4c1cd289b967e1dab063e4c163dde0d15ae82e58039088e9e0115a2b4c3421e7ab734550dc51eab54acb73cfcb779ea04c289050d9816dd4a07d70cae326c94d1a94ce41fdc471f421df013c2f1cf512a27c6cd82593e0d9703e7680a5ec37db067267030d1dde8b77bf188864203bf6ce3e1018c8f2082bf8b5db5df3f43eb7df38f60cf782697b520389543b6794d189a1945c1e971004d8e2eab3d48cd419d1024703cb902bc442396830c28d69e04dde4c1a6e8ecf925e385e68969d5bc50977473f0e9304bd5d1a031e9d56c2963226742f12a873ef39a3073642c21a990d5f364c3d958b25dfb0c275d3b23573fa8a720a9206038f87c23febc7f5e34cc9053fb4c5a769b2ff8191e94095e8d4e3192771b055e6f3d006dd375f54b37ab01e69d714ad4481b83238779ee6292295c1c78984d5f7fe4fc8e7d8b91d662bf0b170d5a1f43d92790830deee6be57cc76bf8b6dbc838619ab6380059c4fbabf7ad5cfc0566c9cdaeae071f4a53eeaf12953955590d03cb27209efdf42fda66929098a0a1472120d04cd339e65e7cb8f3b22be9377e6e5aa747f9f7c08d8e599fbffcb4e0ba58400612405455c3869e3bfb8ce8d1a2543ba34cd2736c4dba1da59e3f360630eaabcd694b7e6e80a357b7dcff18ca909bd040062bd1b4c692685b56ba552ba330b509deeffc273c75b8a7f1176e428ce9e5e8b7f112054a559b43acdd647688ea6f07c6af99d734f4e7dc9bd99b75348fbf689491d7315b2fd7c50aabf1a9157b2b562499b87b927e4ec85a3d46744415dc5d9537d9790071b2f6ec41e8c021832bc4342e62c9fa4f2d99a08097d0a2b8bac83c7ce7b3fa2d76cdd452284646a932b687e4ced264a8fe34a05da65063d99be1902cb7a0d36792263fbafb0d06c88a00829b5520fa8f35ee5e2ba135122f23b9402cbfb443c82d892224117e61aee5dd07745a19e8436c80cebe6e99f88678f36c1655e8b4e84e862c0956a3817e04205c2594dac5c210409d287f043b7409f709192480e589c08eb2d48da62971545d4e372d501cda3fb60bd2261d61d41388bd3f9abae2a81b5b9d4b29059c5f32699a8a923e924ad0e4cb2cff35004deee0a8db20418396112862e9127603e0d1f5d71b564155911e8d395df40374a49e5b73351a328bb6447fc4a8c20de92a822ec786c43238812981d595948e75000d87173844318ea7b3baa6130a64f1a5629ec07a66b581db0c10266fcb1638dcb3ea5fc10d9841fa7004b861d656d30b2a1ad8b1cfa8781e7765c41dbc99ecfb37ba51405584f700d465a88c8a46b4cff0cdb2ba9bce346c919ed94bbda6871557fac406847efb28bd6ea44548491bf26c27c9e7c8e7dc30b73b1c259fbc564507a22f9c800021fe091314846921394d45b852f4b5437058dc51de6cd1b84475f1dadc289bc66c023d1c51a6c38a8eb6491d2fa90af82fc82de31cb7b7f962f66acd25092c61bf1481689219e19c3e8abe18d58e978ca5e1288f692a1aedaff6005d3fa6816a200df50a7d313cd34a808a717ba15fa2aa7a0dcc63462502f83502b4ca12b3543588e435154884248683e0642ca820f72d4a7be9709adf9b4c5a7e92daeb571329c10d71a8000eed555f6a8d3333e3fd8617321d9b982eccd67f0630a9f1df0f0ae150bebb99a2acfc91cfd63dd0919eac9fe8e6326481aa3e74715d4d1aec08011ed0973a3ecb44fa8e8d1e668ffa22ac000628df61fa582f30f6b683f79e4cf96ca796e53ab7ea4467b6f961a25197c2830926dacd35eca05dbd27412e90721f1018526edbf361ebab1dd481af0cbf073daaf536e92e6e661aa25fa845843320d063de8dcc47d015be36449018b45b7321ef862785eb6923ddd471b2deeeacf4802b4e7935b05fe5388abc437fc6ecd43a7af890daf0cb6c6b2a8232b91430ec6f3aad930015b740a680ccdb6bd2f100352e4af861770fae59ea71cd9c8a75f2d96deec8db657f20320d7676728dbfb2e0e74d946d74460a8f107e0e8fbc26cc522fa22c11eef52b7e788b6df908f041bf8237d45ac9b1d8236b5c29dd51586bf20e1349b90f2da2eb1d2b021741e0d4139dd7d5ef8c7b46a78946c95d0f5221cd984ea082c5cfb65688891d0b0741bfab0eae8911896d267e07dd500bc7f83f0490eb4945c3f84e31b2c7b8707be4ea1d1654801324005cd7cc8876cc933e1942f52963fa9317f248e0fbc19d7488aad0c2a74cfad705f6101fda185f02a175a68a1f1b98631d2f6aa925328412dccf7d75d04da303e5dd0fadd0b382dc2062994d887616a36480a9e7b0f03dbd5282404d281df5018ffe25542afae2d0f032a7747cca7621ae2a198f4a054d49fcff3610e6740c6f725722e99d525b0d5b0f5abd041888a28a2f60d7c1031ddc30847e12c27ce308e848420db33923f4f1fc69f8c35729251ac141fd58711ce39116b34e06150d16cab1a027c98d4106a5817084054bec8344a3fcc8f92ed00be7d122a0974e4f630792e26a42f2302fa8c1425ebbb874170c3a20df8c624f001a3ba3fcc84c926af6cb21a2f237dc18871e9c03bc9d14e74da39beab1258a071cbd0af28ff24656d34b86bdf0c0278989f59d86176a12370fe1ed08ec80c528f9e9a19050267281334f811312f35ab666815917f9869feaf23a6445012522161dd58b33d97f7ab04c353a0099541dcbcf423c6128fc9e69cd7a211c37531e04a359c0b70a182b437d98f6c576930b4d2c6904af0766ce2f26431622cacbfeb6ea0df399da785f44ce42dd0687f86567c520345f79c99e34ff43ed1211085176730cfc94d2807cc31581c181973023705a16c19b72be1c3e646ad1dcfa16710c901318e2e6765175c6497f3210165c7851d2e296601050d97ee5ba562503f03ec852671321ac1a13483c769a813095a0642c89174c539ebf4a5af494179fd26c8f2389e3356a0d2c0ed3784db1f23eebddab8782772e329cab510022a4fe9974415af520af6cf57bfcfd50469da442874ec3497dc31ee15cf50b7fa475024817ac9e4a325dc3679786ae69799f7fb85e893a12cf6b08cce0248c1136fc980bffb8784c09c3c8dc2809174afa95b6acceb76a791ed62c92e6898099ad9c96de68da9a6a9d7c980cb771fd023c91131f8ef170d40cf25c7760e04179f47ef9103e792a15fa29359fd881f5c12416bd0a9d9999a53f6854f4eda9c2e4e3f94003855d736c3ddc72f4bd6f422bf743f45bab3a484c0925932d11b03ddd8dc511af865f8e992ad61ed04cb4d533b66da07185f1419c8423cf8c42de12cab44e263c98a26cb8f9dca837ed62bada1b641ff411b0dee22bf440f4be6f35f76d356e58af0fe3615042d2ade51480a1ac8a7aa816c6a137a8e3f27d2c036022122e888994d2a341922883929a2ea61bad9fb8b9bb32cdc9344770118ba59929a2c7f0e9d04ce2ed564d6e9dd72c63a35d6c8a14fa51975f71e69191a99e6468eec1b89e81c9bc95a18273659ae8518cd0d650695603c6f898abb3059423013f51736616ffa61daae2a8c3f41c6283ba46a531cf70499ed1628955270ec8f09e30d5cec1cf138576cb116b02191ad984e47dbc49e03eeb5c4252f303c7ab5105b2595247cf18e4e0589ea9b2cdd970bbf1f0b644135ce705964b08d4db861b862d683a889a70dfd88a6a60bc65b9798a45d74c277d98c78a15e246919089523b82bb6b55a0fe2632b3266f8105c9cea36c309cdd1b6f4e21a51782f8361cdb3c3ce5710037f482c5ea1580ba9079ffd837c9a0e16ea62fea85b8ea92f813482a4b2b1f1696372332d781c165e7d03649292ed4ffc1df43926b3088a0daadd096285b70badb535f7947afc6bee56c35de0c4f53d39f1f885c00b651e0ebd1e7f126db97df34891df7299e1c9659aed345a128239fa8e245cf85f5f2600ba66ffbfcc79c656698cfd6dd3c309c3520cc4d7593ee61330f99d740b32c52415fd1062db3138b69739c72433d06eb10d60bef27b345ec9540971996ae03428eee1ccd499f3cbcced66460c1be7cb14d356885a6a45142a2cab10e2a799e2bbe0042ed36808986c13a5d03b6a21cb2f53d4c56ce9a38bcc5e27b1bcfaf832d16c18bd615caa84becca8d1977970a2c90b4ea1d2cc430f3095281ac8903c1e0a5fa06bdda0245c66d1309b080355128f9484a1e62c950aeeda7fc10d2ef307168e3ae0a9a0ffd3face18f13c775adb7c662249503d2aa3bc43ce1f22feefa8572e6766739014520ad00b5a8dfa61ec7379044d46434063bc7969cd4c4b3ca6cd29af513393eb63a02f6db8ac024309da9c59bf82f82463411f690b2a613eaf45ba2bd9c84c04dc643535e207b8e3d746976906c489b33f5bd374c8a6facf645e32d10c2867a16a14cb9d3031c50642b555863921c1542b54a5291ce3c29c6d16844aa371f6070957360786acf53ab198e807a866860a062abeff81b4ec67f272cca5e78a57486453c80f82f2ffa52b5133656f01421e6106234faf6ba97f320179ffe1b41caf03b61945361964fbc2493c4109de20a4fc0a5b0d3e5bedff020bdae03572e8006f809e12c58242f3d4d6a8af624ce4aeb80d201b58151050869560bbd08e1ba1c64d3a08b6029028892221eca48800ec898a502b7084fa4912ce9325a86df80c756956949814906d158c99c61aa890e016037089c1cb4be93b19763183ac8319b8010b42e02af4cde3cb70e875c2441dcb37b3e00a911834fa26cfa31a4cfe111af9ac9cfc3065fa9fd4f259a79f092ad08ab7d6fd231b1e8ee8dc0dc221814afc2d2180cb0e10fcd31269ad9dc4124ef69fbd2457d14fdb665606fee21cf5c9508fbbd270682285a7c9a337bf0249a7e15ad0c1f2b22091ec942457700acf2245cf60d3f37325b60c3b58c30a93ef0e0d52013d3a881ce9082a49f215170a5307af3206924303e4e8e2e22b8bb28587cefe4eb911ebfbbddaace48a5ef89705425e548044e98368e7fc1a5fa008a2dc66330739748a9effe2e571ccc091c35ba1fbb44ca322dd150b051edde59a0ee1908d3c6a8b6869598dbb0769e999e00fa385acbb641611a74f23e198b02550453c33d144b34a7588b09e87937c23767635e0889c977a3ecc36e2720c6612683de818a1bc4839135c6ed2edcd21b5b765d5e9e2493db9747d14fd4a3d02025e9f365ef8455f7753c98b21d604e8a1f207056b08b73681aaafb18245d69b893d8ca2656f738a94651b696da5f6fe3b3220b01da67ea07a7a5794dc2605502827d3feed0a48df33091081fc82713fcd08347996970e9c5a3c9ba30d5b70f1aec8a9136caa5413eced88b1151b003290a244d45465e7cd8239fba06e84292af205a86ab5f4fc717d2ef26e71554ade0839204b850f4a0c06e347ca5585a92d838f1e202f9486caa607eb7804c242a440287845e5203d2aa86ea366bbd6c8eef1ccd24d2f0d9c78c0139bdbcec3c0f33146fa45bb003eb06fb930917a9ae8ad36f78d6700b6d283413f7e704a555e117ce1a61a69853dcf3065bdd6555a9792da241566ccaa65c11e06c4ba6209fc1afc01c03bbf946b9c2ff7c1877d7dac46286b90b87f0c665f54c88e39abc40b845429ea2162e30801d6687c7175f16fe759928f818461e1922e6f2625b3836e2ace29c0be533e4902f1ef06405b0df0db6a0d2e9ccd7472673c0d8a2b9cf8f7c7fef8dcaa3fb9f2ab7503f495c8d50c2615106028e74f2ff805a7bb441d3c6af626d9bfa82785eae4c3e99aaf0bdc7eabe1b4969dc4fce6a6ccb43a24ba920d51535e5345242be6b5c37f485f025425056d36c9cce42cd939dcf82528e4f7d513b71685a8f6bddfaa4493df1fda26e13e2af123586272e7db66a4dc1887121937b6e93e1b2ff951ee0da5a0b3dae17eb88a1a4c82ae5297c4330a537d3d7308244f84dae6e5c56087d4bbd2b1696feab1c5d055e42272ac9217690168f453768981fe3e1072165d8c83ba22d9681ad139efc72e4b7142c279941fe21362c062ee55f3efca2c9028b46b884d81d8161541b625204b37109b6bcd09cf9e2cd2fac356f370ed8cbff061a30c49931f7fb4eeed9c98c41a982f278f5f449d1d7644bb59d1ab16fccc64f8e86635c7dae1dd72d8155603da553c891316c1135c7882583b97779dd581765447e684453422f32ecd1dded579ad5818884b08ca9a3a2c1b72b71e1ce64822726d480c44174ef060178f10bd7b96e91887311df182f624e6113bba5ee5336cf8934fe16e3c79b3de7a448482f394054138751d7cb6ee00f1a215b519435690f0a703d1b6826a0116789f8026fab499bf3a8e78adc489deb7e4be78ff2ea48024e2f639013f08a78814ee702189229ee2577b993667ae6611b7cdf96982ad5e261eaf1b253c88ac9d4ce037e931268278dd2891c7bf044dbd78b4ae4c77425c5367a3248971428048dd16dd9d95bfd6daaa4ed8be216a171dfa6bbe044834046eaaf6a86516c5ae044aae00c35031563ff088f72a5b1d0adb39791c89b43b475154af4801ff80a05a017483f0cd28c56fbaab76812db6a9a1645cab29dc01bad2534772d767a415c8182ecca488b85d14c8c2acd802893159b870a1ad84e452dcfa3aab45bbb2501f1cc0a6412d3cb23f6aac2f1820e35896bd19ec8ce48d72ddaf88e74700d5c772b4660e61c42fdf00a38d4229bf9ad109f1f0dd9171c373927a670d8082f99abfbb72ad18ced25af02d12fda57b2f1f57fb37682bcaccfb92dfb48896ae331cd7a8981ed97fcfa29b5434589d400a69c09a18f4ed1537a8d71290f3be1b1fd5472e94610b65b4823cf2c30c808955a2f0ada249af4b2543ea6116ffd30b340e4889c2250a1718a46a5980f88ca9531d18be332083b685447c33aad61bbf67a89c27e5b970f073edf53ff639afc0d250940fff21199a99e1e94f5271f860a5f5f22e610d301bdcc862eab433fcc77603fa5b95e3a9b94c745659c685e609893de5b64a6ba81e98086130e214d93a81839f889fd364ab570458f32d335f4429e2028210f3985ebe23f5fee94597be6ede50426fa319410cb05a193cce49af35cfaf19e601471f80908345e4ce756765b808df961388fe42a4c02dbab5f9f201c9fe83a7112a43d4fbc308e8d7fffba56be02cce3714f7744ca72f38e8638f560d23143b4a7f1927a6103243f2408d1249872c06ebdb5e01d59e15d47089fe582fb16605aa4f4c8a23e63db7c5ea6a2f893a6eb44a566414ea6ea60c228d7666a09bbe68c607056c6ca27e02a522364f9b3afd62cde94e4eab12c9d9f119632e97f0aeefd16f2e636147bfcbec0985f1cb7171028279639d0e9661992023d2720edf5e15a82f93a7321232085d215041a87fe680e0113f178445c4f665be4f2b5c186bed1fbc9a390b4312c43add649359fe3b7cb866b34fb0bec239199905de27435c017606315eb67ba53c6a97d1b86797fa19edde0b7d89846ff5e2000f0c523b71f1e71645c2f6fee8c86b1d91b31b6c42fda69dafcd78f29f400e32b8a44db9a8893902f01687cc78f0c77e9a1932f3ab874be6bcfb922c81ca081668cd30366ac46fff003116b1e81b3a785ebb52f206d0d033cc90c1c395eb0e11f207d0d033c8b0a1c319539f7b04dc18bb91483cdd782b8e3d026f8cdd48148f6eb8957913a837590c5dc346034cae04d2d53f60d0b0d18045a0697c9d838679b0a28f45e1753cdfa1480b8428e863f50d11871cfde3abfc353d9affa89b8a54a452c97769f45ec469bac875df1d7517398d4974b3e48e94927929335a74ff9b3a12ddd86c92f7464b808cde38287892b8a2d777c8241ac41306e169ab06889ce55a04f88fec4468b12098ee466ef967fe432a00bf68779c0f1275f64cb1c246460a132c2561db3c483967a92568e814f0f30151c6eecaac389c479f6802a9645432c4c9560568f423d58894e240760b34dcfc3ec967b4857a00c03bef2642968b0804cafc8dba5786ca0c5a1fb8514dbc03818afb6164d5a1958fd4c7f80096680ccd1c71fcea788b61dfe960c11bce1f95633362afc9a4bcc3185b8a4bcf7c7824c510d8e6c3f78590783befb77eba5418a6d5ca0146f4d4a6360205c4c133ecde2dbcdb96ad1d047353b50ea0185389d05ac130bd1bb9f19ff98f5002fca2dd711f4cd4dab31051615e8b0e68a2609ef09158b442456851ccb16c4203faaba3d6f428a66a37766ce85c4c752ff4eace96599829109ffb900dd44dff1f56ab69f0cd69d51bb0958197df855d29d5ef10020f49d8baf6f029a8b94f35e79654098198d59ad359ae390b107e5645d0e63dab89781485970cca44e2aa73480fcbab9ef2908896a06f92ab06c30db8bad02fc984d5ce87c2d44842fcebc1dc56987122c4b996a8a1c3c00225377cfc2291d9dbabc69ce9c35276fc6ff0bcc80329ac74ea71dcbb7955ec183c249c4f508f15166a49bdb668d912b7964b62ea5caa8ad8327b40cadf1c7d9da25ab7085b46f3dbc7bb6b89f1c36be908e4b5acac2e7d16e7db11cf14dcd1cce2638f0e85ca2e0eeb39e6513db740dfc571d921c1246f58053b261e92d46d8066154fae49971c9c57841468e2e81b387800744b81667c355a98172c47f0f4cd0fd896b5119055b8c7a4a98485f3355c0bc3338b2208f20f08e7a51fa8a73eb04f7aa09ef0a09b37b50c4853194b266fac1872665be191d4a900a45ff351aab7fa281194fb2809f385b79c20eb693340a1408db5c15386cc98668bf7ed0d17bb4025789d3ba5f9329bd28150d30a66034bc9eb0c9ea91dd8c65abf4719eb1d3e64d06060d2468874643a5df63d9d5cc7f142ba3f5c03bff071f8163eb95affa49c277c826ade8bcf2c59315d169e444cd6f4bcf9c4e98134982475e37192d43ba0dda456d3665bcc2ceff63cfd54df60dd9e6e3064f6e4131a409278abce7aeadf3c622ca092f25acddd0f430645b189547306cb505fd062b6a2130393cdae8ca7bd6c8b30ef27bc5671d08e4c9a1281a2708de63f63bc7ff0eddbd235cfefd1a4ce98dd95bb702275c37ee1f66b47c91e1dc1a209e26399bedb2b49b1264ba8092757d792b177b44ab5276d895c41cc65348f76b69208efb1260f090efc23e603c6b1357bedbaf39717a71e7fdbda71da0901d4cb8dca27e45c7290f5484700d3c268f88043dd7aa681208446aaf0011b473859e5e4c8021e5f30328a1cd98ac66e2c24c4223a55b5388283069ccd39a1160bf48b3a9e7adc186ee5c9de33f92fa00b28f1b81852f45a4a8dc752e943e828bdcc14084a6bf832758352324e4c1b1d93386a66b9c0a8bf9f6d8cf15256185f7f37f0c0b5467432af99dc95e84b75c39d75b12e8a2f61e6b0ce623d0017dce3ae1e858bb24c4594df4eac802101bb28b2cd89c764c12c7849d0bc72a010ce7604debb764cb760d217dea3030947e6857ec16e05b0de9b464f502e65ead0a3a3b693759290aaab1f0f604ec3e51bd90e1a0431eb4560894e786e9af30acf406e786301c6c682448d56160908dad75bd673a898c70daeb062baf92386b01d249d9c65b083613cd46b314e0a7a206a1d30182a10515388a992bf84f9de058095dca759cb14e4e31f471b4e299265fb86b39018de0ffd59b1ad71a371c5ba266cd7172e31966f667e0fc415fcde5f721cf594a244bda3d768bb16cad77c01a16d94a1acdd1ff327b13ab69857c30015f8f9b1e4907b5e5b5ef56047c7938e73b43eaf12a4b70d2387f03bae9d2d7b54f8a4bb4ff08185dc500ae35bd334cf06a8ba33449683101c02c8569be59de4d5011882630b9240f8dc0b7e8384d047a48a2afd0d6927e574c570b65add898e2ba8833df977f52e961682f61487cc3f99587f4d3e1dee086378a3df07b2d48f47240ab1841265f328efbea5dc5ba01c07e1ff7fdc4856f7f454dad92b064e390dc41628e4431aca29d7b6957e9fb953b557067276c424909b92be8a4147bdc65525fa0e01f1fb135e5d5a2b6f8fb5c5bd0aa876c7e7e44dea99a8a6dc282154c8ddc6139d59f692932e78f36a532b4f5b719d1ffebceceaf643160d3e00af095aca2c55329a5762eaa965512e9257222b1b71716fef6b37ce9adda889bac9e8740fbcb7ec975a12db7ea1fb6cf0dc8cc27c5a11a484efc90da3941d6e11071ddefd7a3d89f66d01af0d6f2448c4f9d22ac24b38898e0277a8b6ca177f8e8953ea380a4a1c45e13c50cb87b406afd7f04d93a917a6392c65ef701cbabe4c27d151c259b4c43219f751ea2c5a8a1c6c6ce1908db2401404fe391bc7d10f9dce4cf729521edc01deb1e40f054e08e89d8143d72e59029c158ff32892044f0676471161bc993c91d230fc137c43e69aa986249006000249a933919cf8278811cb7c02079960c5728f390019f443b0151307c988a6c1ccd75feeba64e646da8583231372d4f4860a7295318684c2fc2b41fc2cfcb18a92d20f12974d8a4217e4004161fc41575c3efa51b62fefa6cf0598ee9dad1886f63b02fec52af0124c1a62630b0c6d59f037a74957dd1ef5a13041245ec27cd263193c04d00fe80650b1e2f003fc10ad5495734f4c506c09f2a4d9898b54600ffb81265078b1effd0ecd3c9bf2ddeed009e41c0e8e8bce389f63ab747402bab861565b7016514d1b389217d7805ff0c1770b6062ac8b96f00820ccc07ec8626830a19401239c97fd48cb87fbfbeb81f24694d3f12df698d0b898d00cd3972da234f29630049cf23b2858e497a532c6052c7d33b39b88904d2485b6e4ca1da20515054605f649a27cf8171140e8eb65966599d691f2ad0750daf39ebc59c815142dff661dfb9d0d7fb65d2dd36b676fb76d5fcab79b8920609dfd7d12b758b8a0c1e6ed425fff2c1c70f47bba6d0ebcaf38ca15f902d26cc8aafe50840f628cee1ffd4a45dc545555515a844d113bb2109c7a3875301d8a23780a82a66918cbd3114aa79b13121f1e1e4271f4f1f1f1010272b2911efa958c8801c32d4288a6841296144c84e85732c20aa24e0700187a0840a8068fc1501cc12dc7126e0eac2807f85ee79d88fff03b61d2dbc40e99c03a0f015047fc4ab10545fc8002187c3082500cb0670845dca0e0e305451c51c40e1650083e3db4786250824e0e58701076d08ea04376ba51c13d2191028c8713d81798e08a9102ab0824a84a300135420a3a544658a1053347d783ccd1030bfc55f972d4c0258711489063092ba51c35f4d4af94030a2139885470947e9eeb14f0965dc8961d4ad31978dc1b94037ecbeea601bf1d47c56f3fb9691499303280378aaf7ffb0bc96f8761c06f9759c06fa751c00cbf234e3c459477297efbca489431402c11e063cb00de33e97700fd46fa6dfceebb037203b28abc3101de005e3cc5019c14bfeabc2b4966405e4056404e80c95360c049f16bc508c81b87427f80dce22920cc2c459802e4ce5344978ac653441b142846a3ff5008e318b28d4d75f214be426150a0188dfe43218c4fb5621c0afdd75cd7dbce0655c8168fff489638127afcf1250f201f5feaf0660041791ee663f378cf56691cfa4fa886260ed9a0309d134815a8f071edb1e1507e71f4d99e8e3a0452052a40fd01facef6c93040196f387bb6a755c8154fd172dd9f7745f6d57d77c5855adba0c69a7c912f2ff245bec817f96232994c269369b6cc96d9325b66cb6c992da5d2cd2cddccd22cddccd22cb9788a8ac649f13b97cea573e95c3a975a310e85bea2a94e4e8af4549d56aad329743a55ea35d46ba8d750afb126b880df676f5faabb6c69d2114a13bd89302d3ac6d95245983d4b3afa2ccd134da7a3ec24cdae68749c158deb6cdbd549c7eb4d700153986cdb1446c7bf1bd4efdd9c37b49bff650077b972a39f005050b880d60544714a72422a954aa552a9542a954aa552a9542a954aa552a9542a954aa552a9542a95faf0803afb93dea303d4a0a819e1d75ebe9bd51f8f8fdf7933787c947152046900e4e3873c1f3fdfb37d3c68ab34c8c767dff9dbf978fbd1f9c8b34383ca5019a93fb61a7e733d26f76cef9d00e9e4174720b1e3e104670268831a647bfae3c693617cf2cda0ede94b634f31a3957203d05f8f8fef343edef3f1dd090f011bc09a096f06fc8ed3f9e8369bc777b64a7b3c1effc75f8f0f8fbf1e1f1e263adbf47c801ce7a5f620c0fe0b0af97defc49601179d27eafbde09fc9161773adae3734119c6a7a2d9fd9bdf3bd1d9de8579d56ee329e275e975d1d6ef91e3f88d1ab7b15e83c2bbe24c2c7588c5ee0aad93d55ab1ec66ffbabd0c633ebdd35d40149f201d32f00b7613e20c80820296f5984d1c39c05f9004caaf9e80a19e31daabda7cc915ed5badc14a71648f84c04a3afec84738058624f0bd68124f216b9c14670dce8a125bc017709436818fc997359e027b71527c982a4313aad1f1436a705c85cc180aefd1ae353a6ecca4e347eca65a55e8747ce9f34becc0da8db6909a2ad4d75b9baf7f5088b2827a05d3d6bbd12491246eecea60d113d330639d14f0d6503abe86a2262745acd3119312d41d61a1c718e10aacd54c18f1301347e0ed37464c59d58882268ec01bd78ac92e64e208bc2b366285891c6fc20818403d9c4ea7d3f3017c27dc1f0b3a58c815ed1e442e8289214c98620eb4070cfafdfb300103a1030e21e0f801870f100710f10720601ee028601c2d3fc0f142ef47c1851ba51b3537704a374c3f278e0e85a32509fba20e6cb003981b2fd03764a0f7a38853c84208bce2d0e169018916986fa8a8946ea8a07483458a40eaa96dc4e8ab349c93f44ec424dce8f8f684131072292cf0bab895eb026d2214ae573eb1b495374aad9c4a0857282eb024914a824612337401f42b25d19255b512e928a5282d4828524a84c522a14829919489c25bea57fd16e96aad740bb1d56f166ec5af79dbbc47259dd9bfd666dfc96cf616672bb398cdfbca27525b39845d44944b5697da69caad4c9fdc8ac5add0fca813ebba6467696a59d939154ec56b7744121dca842aa15e502d3b6a50196d45910ed67fdbc611ab1e6b8c22dd25d2dd571ad9bc5bfef5b36d64a3abf5781b9dc810118a859b342d6fcbadbfd6e7cb59b849d3ebabf74bbe65b97c87a41c528ecbe827002b2b176890a3e156b4bdb0d749968dda87e987d88b5510a6d00cab3284f4257c492b2b9b482c7bf89c8a35ad8c6656b5ed8b613bf34669c1755c8ac5bdd0d7bbd0536252cfe73a2e05ce203f72957503c6a9c019b2af629c1ab7a22b8bfdccfbc4cae25f310257954b44aee352b8953927b7a2a1f6339bdc1b302d5f836fed7c4a4ba055d99f4fa17cae8b2392a3b92e29a7bc32fa5c0a8963b2258edc6dce594d28a5cc5ce729edefd85394a76e7c4b9bc81ba0d581d2fe9c0a9ca1b2ac6ade1bb094de5687f6c7b6138b53e154a00cf3ade73aebe55d61712b9c0afec18e148d69d057323b84d8f142236103091948e8d05643914e67367ec37560badd0ddecfe0d7fb78f3ef6cf243acb76ea3b5d6469a5555fdf8a454b559f6b5da14f4f4833da8669f8f55fd6493f8d8d3af282de8c3147d28c2a2f7fd93f879179a5a128a941249b9d57e1e5e4b23a5f924ea8a7ef514f8e9c73f89d9a4facfd3df778b74fa8e6c34cdfb7ee8fd3ca4d5fa2d35a570b3c825b0877fad1ae89350f549293803fd2ad2514af749dc229d867f6df896803eaf81a065d1bfa017edc0d73de883ee9bd4bce1adaaf5dac6e256f441f04928196da3c668f5f4739f948232d0af6e49adde23a1ac6d3a2a8e78280c0d3dbf62f561c5ee572b6f520ef57cf51427526e98b349659fd2fa968e4a1ade1a2efc0ae612d66b4fe79372e00cf5e989d4f0f789d4f7b1dfa392d6b2680766719fe24dab8fd17b034643ef2ba5e767a49cfad8db27a1ec57778515e9f435b5655549ca8132d05c339b88621dc4837defbdf7de8c38366e503a4e1342392b5a51ebbd6a59082f8bdd875d4dc39df71146948e930c1a3635326e6ad4c8a081d15dca392b39ab8ad25a2d5a2debbaacc52e8b61f7669976334dc3b8d3f1783c1ec87b3084000107582687165c90630b39bca062adf6de8bfe830c9ad20c87f921e2b8947356159d554569ad16add5b2aecb62d675598b61d762d8bd59a6c51b9ee29db7380b8c4008a16134451a91068828938a2d5d2abe441f629742cda8612acdc0b1519a510359a04c0cd80259e0caa3f1503a9ec906c6e82e258cee524e39ab8ad25a69b5acebb297c5b07bb3ec669a8671c7f301813c3c3e3e40e07f507c401e09f08851d3e27bfe7c6631cb9004fb62d8f2457ef6d6ca1d92f7f5d79a64f8baa4cc9ebe99c76bbd7d09c0af54c40b2dff53448a0e1dfa7a10226c68f9181134b4fccf5b4b31782300b57c1ce567797f7cb5e1f3526aeff1326fd0d78cafcffefadb7989b3bf4aaebf36cbcbfe7bedf1b55d577665dfe9dcb79f7d672b81330dd7dbcedb8bc43bda93444f16edc059662157b4bfb289f6389b806c72db99966f06f9f7d23fb2bff2f6c8329fb8c63efb786dc0fe9337dc2e740df6afb7d766af0bbbb0960faf0dfbbefd7de21acbfb035ad6e0dadebcb33ff12b6b29b365a513b0943366dc1b2e6d330fa1a193374adeb8a4457b1e7b30c6375f355879b3b0c1d2013566510caa0af9f13d6618d2632ef118eb0b6b5f8c1686c14b5f3903f00b5b763696b0d66dc4917f7daf114715f48f12fbac2512bb7c085d4ba2b6f8b51741f6f7e92d3101fcda57006b15c8eadfecf5ad9559c7e0bd017bfb170d98cd6e7a27ae2c6a018ef4eb93f8d3f4c4d2337343687f1712c58a3208b5457690722bb4aa62fec8a5545c4cd1f3655ed1b58ba3a9021c658a5ca92d73051607ca29af975576c012e92a4b56524e6bcefc293aa3b4d11a2ae3343a66932805387e0ab09bbc86df546a23e5b4c918ef60315b02bca50b4c85912e1546bab060130ba6c2d41855a6021147aa2aa3d6c4115b2a0961339772711da7c275d587ea525f5ce288fc9738421f5eb3be8876807fcd2b5f26902e3160645830943ec817f9430c18194e8563a92e71644b974a13477675912ed20798ea4385a931a44b85e154aecca5585ce7c2a96c1c502a942e9c8a8da5615f0c8e33a1bd4218eb90fdbd591591006f3f790a6a72927fad58c403355d6aa235e80db51147aa1bf414472e0a95aa4f4a411950a49c4c85a0a58ddad0521c914f6de2087d684d6a23d2c19a96a805d37fb424e201437d721d8ef2944c5949d15b40e94d4f1a278e6c5af2d349fbbb8eee8817ed4f85a0a638f24a5ba8e1276a22e5905295843a698795422bd7bc71407198f7f6132947d68e3a0683b7a21db009fda92bfad5ccdc0a06aa2a595522155cbd77a27a92d8c55195626b68f9cfa44f589ae49287505a7342e85c47a9bb731d9d93fe9c16a494c29ac2a9702bb4b6685971dd932da2237055b568f87293ef28970bac7d188494ceac7a92484241586155ded3a431d6524cd5c3ad82b0d2b62ca3104239453a38e753ea35da453a6093fa73eafafe189aa875d70c445d4f71e43a5c74f573bee884270bc7d1f5028ea351a938aa77b332165213868972e04d4d222330f5902da157d41447aa0885ad6a3b8eaeefa9ecf5afafd5d268b74cda3f93f8dc2aafaa696b2cc774d0a1dc0ad771295cc7a9702b9d0ed7712a9af65c8af65cc7a9702b7144e33a4e05748210d614e864e2b403e8c4a978742094c70ab702d2014a79a4804e9c0a4b1c4998242401ef2a035f88380ad9c4910c95de09f9a013d691c24f123194968fe9d0f2f1163ac5510a053af140ca8a464807e844a3868d1b3a7e8081e15464d7e2f262e284c958fbb02db81c81041da3bc35b8fe885b5c119f84ba443a10100b3e7c128a9422a1483922dd24716bfbf877577c5c978dd5e3adfa1747aaa7f19350a41c6cdf754bb1e7293c2008e67d222fa795465c41e9c35ca2942a7521a52dc4443a6013f853ebcf4d1cf998e208ccffc18923343e35e2888d3822ff631347ea8b54b0952e222170f62221f0ae2b5ac2076d9df7d83ca21e60a8a5687c40603c85e7e585c17c6c3cb6122d4e92dad6525afe6703a18923f99e0d04660391d112fb8dc17c6ce248be4807b82ae1a2650c2dff6e1b4486968f7d6cb4fc1a2302216386105abe65716991ebbf7b6d149dfd24a3fc122f2ee29d181118be065fd3e06b58d328d6264a0b4c7b128a94c2341116ad83f346911eed3d22299ac793e77bbef3d55380be93f789c45ae73d0f7292a743b146ca21e59072483911458b540b321af6a05f890b3ee00e7c29b9171d296987fe49d4554e94169dce73291de9e974b88e63e9749e247a6447a3f869276f68c9e75438154e855391a9ebee8ecd99cdcf22a7827dcc322e258b5a9663e4bac8b164c0b59861dc8ae537db10fbbb619953e1543895ae1a42176e74a1465bcddd5d9b73def91723e59072505a5c12ea3e29754558b0ccda4828ec3591947bb1ab8974f3b5acf3998675e67bd51b07ec318c9443caa9f4cd0daabb63feb0f2870edf436901fd3de45ebcd716b563c1a1ffc3110581e116f221749c2f185a18514954129544315c6affde461111b0b6d11a27d9cf4adabe7d0d48ed3871047b6be7a5378bd02b401c6c739c3872bfc2937e85aad67aeffdf8d66efb95753d7d59343f15960741f354ed506f67e656240cde89f82f9b7c71c15bc280e58584c143c0d372c50518ca952a1387b02f864d6b3269594f4544c02a424438b07ca7327144060582d2e8f910abfcaeb87faf69bba9058c45d171cba41c6bdb239a3a7f73d38b614a5f827d1f2222025716b9a259fc637c51776dd15b761dd4b40635bd1344687101deb26b91126e2b5986bc441cefe1eba146947d31bceb04583e2efe03fc41f171fc076908a1b5bdea3dcfc1da701c4d44046c59d6c7a774d39fee36427c80440c2456b48559a47b27fc452bc09b6a8b4deb2dc0d87693beae9f15455f6e9a55962df14684027fa1a3f441c78f21343ffe14fd20ca02dea35a310e8d467a8fa0ef20f2210810cc0822071ad10b4439984002103140d9c92e4503b2a6bcebfd45607dbddebf0257ae80b5257419a3acee1357b74462d5969d0f5132315ae75b6bde50fd7cd10eb0ec42628864e08d759296666666666666666666666666666666666666666666666666666666666666666666666666e2f653d5af565a4324832549b4a13520f5f6530d1d55f8298e447d8231663bc0db4f34c42812029e5f553ff909ca171abe48081886bf05a20a87ef4f78efbdf7de7b3041e4f0a27368b1f40b2287141d44a723888e8850101d154a98a044032525250fc2c0947c8c2850402f8114f05b12a534e1255e52f234ac443588100a3131313131313131313131313131313131313131313131313131313131313131313131312f86a93d864d0fc9db7ed679bb61dadb3ca7f674a6557ecd07cdbfd67e68fe9d0f9a8fb55a79e827fe8f9f797b7cbd365cfbdadbcf3c3f3bb6c47e866512b79b7d0ffe8edd2cfeecabf9d6934b747ebe2dd179ecb5f76c253a9906fbd8636fdff3989dd4e24f66e138f86d36c1dfc926a1b7f6e7b6359c65e8df4bbf3584b4b779bf2c3df289ebfbdac76bc37d509e77621b66a7edccecb1b777be660396b34ededab43e5f6403c791dbbf30cd433c79a3e4dd097dbeb369efd9eea7d3f91deae4cdc271323ba7b53f352d7b6dcb5ed37e87f0d3ef78b06c32dfdaf9b6858bfefc276f16efb12dd3be3333f69eadf3dad6d938b3709ca9bdc55c4433c0f3336de264a21960cc3acef5247e529271d14f45741cd9d1506202f4e55780bea438383750c6eaf8e16f1f423fafdcf4627429a59c73caaaaa2af9966271a394525a61c080010386dc44302c18160c0b8605c38261c1b06058578c7705847185fb0a29e58a39e75c51555555ad10d1608588063737a7130d8d8806d8d69a95c4d869428b63967543768b4e7bdef72f0bd3fcfeb34eac2b9fac3936b47f278786f6b7f0b19c191a7b8f1c20b4bfcdf941fb77a27d07fdebbce7eaf1fef19ff7bc3dffe25f9e1dc3015e96ff85bdb66debdf43e0e3b5278912c0fcb12dfbec6f2ea1bd3ff6d7dfad84f6d6df125a16c90063d8e3b7b6dd82c427f6f1f7b32cda81b16cf2f15a36f178ccd2379f58fa234b8f1abcb3b3f4e413d7d706fb9dbca1b6efdb7661b1cdc21cd3fcadc7b2bd7f6599f7752cdac0fef1c50b8df17b08bc346879a364f7493cfb6bb3152219e09bf78985e52b9bd4b7aa75f9bfebf0ad9c146dbddf1632fe25714cc3fed65bbfed161d7ef8f8ba2ceb7140d1f72febdb6ed1896480fdd270eb76219201de2796c6f276b14fac0a4fba0e74bb45956e7d06dc03663b443610bd886c00e332ad50f2c24ae98897189f0663747729a59c73ce595555555554857cab8962109808a8344eb576b1753513000401c315000030140e878322914092c469968d3e14800e838a4a6c4c9749a3d21c48519051921062082006000000c0ccc8cc2611004d78b15e92695fa2c4ab911704f200c20f008b99a4688ce6017528ba74e8ff27f705b50c3db9bb3a1673d9ea59c06d02e65aa872dc27152c911ec067a1e8ef4ad0f5f083a97d2861aceab3e937365e31e4c96ad81701a0d3792b23d6f71c7924c8872464e491c20a1255e491c23fa911e9086625729386f85a5fee4f30b19e999ead3b64fede7816e8467ab3498541db33fbd211e373d0a0eecf3b454d9ba6c3d5a3638820aaa867f040d20a102458c714ee37889964bf21c35c56c9239b99e682c5eca24ad59cd3c41bb5e22f70a33f07ba8a8432c2201e5e25941f930b23bab0f388c4b8a53ca5f673d386779f10793269e0dd7ded17c6a9de77a1ac43789c5c843a94eb9b73c27960ed922d6d04bb47dd5816597cb7211c4bc509189217475a4700a2f3eaac684a7f84b8e50bd7f1c3fa7549ea8578ee172e1075dfaf3890bf0c7eb6c47afb2588a63c879c555b80e7d80ecc83ced46304c30f659566c818b0ac00fffb2db32a4326482f6a6f2ebbf2a05f5626449f4d2629e64e82f2720966cecd32ccbb6a4eb0a4d693cfb3e40847f1e1f38c4495e1565814c0f9e3184f67668734306cadb36feb8e59d7809678695d2cef0e09e393d407c5f07387751f32996425c9dc623b60d6c36c050eca2d1e78dd0a9c656680bd1dd98d06dfeea51b5b01cf9bf6e59f8c224fbb0ed4500d85b4c92c7c3d1531714ca095ef78a9845293e514a49a22cac29cbadeda5a03e044a927c775472895b663405d83a6d83a68e7cb4bf61abec5364141b3019f0fa9636b8d299f73646013011ab041f58e0e0bcf5de8cb912ab661c1961c570ca0e445b4f77ee8cf93cc9dbaed2372861b3fee3587d26421ee85087421772f0f8c8d8520e474a8560d01f767eeaf2fd95cbdd92ffd29903a4f172a9de3d0b18c9a81532024daa579a6710c63d8b971327cbce079d4611b080bc0b16f4070df22db5e5e799afd29a49fac91b5607203b7e0a7b95de70bdcf6a3a8f0c5c397e0fcc5a889d8868e5de4bc06ed9ec716ea2ae5721bf2d732050f4d6bf9f3a0e536e5ac0325c53e6ed07a079333986afb0349d37d5f01c0b8231f114335be3d2728d1813ef4bc2410793d0500e65b3d891af07bbfdd5aafab04f598a8d0d993ad39e9a70fbf3b48deaaba662cae422463f891d466274edd0945fcda48e685eeb0a304644dfaf8f923bef6d68cc55a7d6e802fbcd97690eca7ea4756a86ea601e0b67d39e846a9186200aadd5ccd94b32b83a7eb88791a4a3e959bd9408a9bf890084e57dc1b2b6c1008ec995b95d691a66aa18935d4770d36df2f19bfb99a76519aa2df288a3f6d70ef67d468fcc35dd69db0cbaa0c9c202d82e504d06a92b1c0ec39d0c7a29b53ecb30ede2fd4afde790c313d54c70cd2b9b2345e49a0722be179ed821a1dbde0ee0cc6687ab33d3a6de9d153ffb73d653f58997523899a062d5ddae81a4cee1ac3f8cd0a4be946b128ac4cf65c488c8a3f787d5a3531ef3b1802888d180cd251826d90fa46d087e0395b5f8abe67fc6f0edddb630bc003dfd8484e7e891e5ec9d9aa94d22abb9e5735954688239be7dc49ffaa717c64ed204f7885b7372d6b4f457d20153f788317b3acf114dba362a5fd089a00f7403d646d3755e238218b0e3c26f9750883c2b7000c7ff6263a0bbbc9490a59eb3e79d20f83d2348caba181b5cdeea66cb9f722b5475bd94549e44c412e2a22d9f9485776bcccd303c84d30d4cddf114ea26c2d494166765fda4ae27a644aa4e178bd18724e4eb97e98899f472f72ae965c9f06dfebcf6ea61595113d562a009252313fd13fe14ef71b3833676a70cb08ca3eebc8bb97edc3e18b251e06f1f953bb8f337c9cc6853a425a81444e8b4c8f988bba47525debc531d49dc69d9fae015e66b05f9675422d2eab615a4695c0c5bb34d96fa2646124d7b36921ca10cf133190fc3024d8543816a84f6b549d354284bb3731028e0450b2fe2a9f48d6f4969ea24cbdee9d00151415e4d2664b960bc4c8b48e974e857bbfb30c6673c053d7707d19d3748109e5cd4d90ed5b914cc7ed364f7537fce0198649580f3e699a3475d3331003acd3a1048c48d117ff04bc94bfa42a9a0fd0079960865fa02955921a6b28596545056bf62c5363c39615ab5459b060cb3a4bca58d8b3c6ce262b6a58b366cd8a0d4b61e56248eb3758062c36099df1c2058f2cc5a33252dc76e3bb0fbc7b033b9a91c6c58351db84d843e137784a20ae8ea5afc90f317839f86c90221abaf6eaa8f697b5ac344a9a56a2d210efcade284abc4e3dc05c71da2b50d30922cee7f751a202fc8e62763d6464fd83b08ab814f4129e0eea318933beac9cd52974dba00753461dc01b0e9c09fa8125567fd8826befb50b9a005651e7345028fef554965de6e7f5495a2a4a2083413f901248644663c04daef8ae586e00fc5946381405cb8ebb2c9b676726b7cd21008ccdc5e84a4ca3979df020da2a667941c7c0c835b151ec62ebe3a1511f5236d3a069984371d4907be9dc2ff5a601f6bef788fbfd8b071e1b05a515987c05f38671318d513e4d9c8490b05c91174e2117f1390168eccfa02f655e000ed63ff5324b3ab436bcfbbe50b6495a8cb60064903ad1d68a804942806cd4007c3f9f355fa8acf30dc0070662263fcbb102aa01d82f696a5c5fc96e53b9cc4d0d7b0e5ba43735a27e53ab3fadd6b1eb724827811303504e3c7ff57249a22e70ea1a0f2a197343b7654e8d736be644c4d200242d225eb4b446a44e2b6a8a2969884c3f3dbd74a2534a4d315d3ad1d3a74d2925757a51534d4b253dedb49e0617e371dc07d6d6f582353c4a3eedc2e2eee1e0e4138dd6c1b4b01018031f34a6f125e165019a5823ea879914ce8f7e797b06083ca8eb9c45830b945f822f05d5fb0165c737683ff0c582fc94c5bb338a6968c3385053580abf401012a814aafca6b3fa7ba751685246ddfa1b7ef3c5604b62ac5159d283f652f8c2d04fdc4f37692cee1a60f8115269fb44772bfcb28b6b5a0f774c379af511f9c70406692a7f6a8fcf33cc5154ba58c01a841a03badf8d0eab1c255b971610439f531f95723df996084dab904fbe399e130497423efb33d53bc13e609c8ef7d1d6af502034104527d8a357682fa3ee7fc5c38e74f418b967b91d77ab125fcce7086b300aaa47845e0db8e1f4fefd8c40c4e192de7a20d759160e4d1be0db8e48be189f8ded17f9bc57a211b3b7b313810f17cda6617b9708e023ca5356fc27e3b12e5ee74fcc5296f787746f76e0b4245100c02a98f0c560d2e8052dfbd049dac9676f9f4cc986fc08a40320403399f6eb6d327fd26913551549b8aef1fa993f9d20b8fa4240c581a16438b05a34014df0372b049058f946ef41f6ff13d2a2c3fa1728af14a60d018483663c12cf9797986defd07b81db5fa0118dff64e34a34febecb6721e22b246a8a5f67e930475d54df45af8bba7c0a48b1949b5fa037b577363a89e78b41eabf40776daf4052c8eacc9c02c586e04d30509e457727c8ef748d2d92638d5be40296d4dc9700be5893af6bfa15e2dad20ee7bf2edae76b0e2755dbbbdc99b13b3f906de44f77966c27c9d6b973382faa3623c99d691e32f454e3ceee1ad5ff6d883bddb7cdc167744d6f3234c551bff5cadebe9de4942c85dbd98cdea02332a4ed868298d100befea4b6bff9f0ffc8ff6cbaa834183fe1cbbf6ad4a7dd56d93f2b156e916704364ee30d4d3ec45f91271db8385248a60d14fe66459e2b33e2cccaf8e5177b1e4d621579f27a082b6cac39fb1779562f9afa1e3372dc781b35352bd3248b3c5391331442043dce93e23afd916ae1a5cf65231e787e07ba19bc41feddc90360456fe20639094c11c5b1ad67a89295c1f33703b479d9ee19ca0b1e30ed10aff92518a5568d5fb7cdda859c3161ee5252e71530edf485cf57c340c9e60700bdaf9cdb15f1c4e66006867cbca2ef7c85fc350245cd432f0aed5ad0083fc589d6ac990ac42e926b464c6767d7102ab9204540282070bb7852ac9e7ecd3bb2a396548380051f5dd0e8a366f2585b4a1115aa0f46fac835ec90fd8204cddddab49c8250e97c628541c76119eb687d83b0e4c564295329453fe3bd6c9874857d0f6a434c0a65513783b0e6e687f0c7d84f3ac632b35a7696bbf7f3da29ac1ac8fd25d41daab049f9e66983c8984bcdc3e93bda1e165d3d439a9d398fb541508a377620aa20bdb9477d2ed806ec8ffa74a9c3f65232e8bb4861110e9685751d1dfd9c048932fe111d88514177770c2ae2cc4d57322e67541eae48ff6b0cf4a8c2cd69743c7914c075e49e7c830e320fb943bd69a6ee1c4afc410ccffb032bd390934c109fe011132ecc83a0e9426abca49bc61092deffd1ca4a928f0963317f1cd4e10ad61631fa82a8a19094bbe6dc2c8aab1b9a474b67cd83f6c46c7fea0a6a9e45ab11cb43ec57b45bc6bf6ec51220dd11cf838c8562dd45f465fb54ed7fa3961615c8726d91a8abc220b61b88b1640909921d9f8cd6ba1b5bc47a65de5457ec416acedb5460a88d054e1e0f8116d2d418c37d0af2149fe5b385323efa9f4ff8679907dd820635fb493e453d64da304c7cd20a5dfab3fc617c23cd95b14388185725a2ed34bdfc109a4306f19b8e879072c93e5f3dfa47757c0fa10dc72ec1bff86e12cd7ba4fbf4788cc3291b836e3446b8deeedcc2696b8cb23f5ad5ed11daec3f84249e444e7960fee9015d27092f9e7b8fff9d0676405d6ed6a7c36e6c8cae6461f49498e2f890c2ad20d84b8a622a0051759ef723289aa3b8c36f88ec85a54a9ab1af8e08fb0bff297155c7513e28ebc1d59b813e781b648fc71cd9764d08e09ab8f5dd756d6809c1eca0f1ca029bdae99e79cee6afb09590bd11ca3eb318e917da0b25d14e9ea3c5de5ac2edf66e98e6236e158ede180da7b9930abac58a8a57005a3ac94816d5534ae9b106b6521ae10e2e1a806c661d90fb4a8ff5fff78a4a2dd8283228a1678209b255392c48fb5b251a47a503c28b1cbd3aac9cb2dc03d1985b3318c42b29425d0b80eb7d63efbf30ccd14e2684b7c7620c7d239120a4e961530f4b863fff41d75a51865fbcf946a23e4883812d5d2cacb072f2b31efc6164b20c921e222ddee32cb5e53242fdc1d1398507dfa5b4c76d5894ed926ad8ec6120dd08d793711d2c65427b397d353528836a042819e17bc4fc30004e4648bf650fbd57f7f867ba0bb8f39d4a6c978704767ff6773d6d24741be9c535636cde99b234cdc364b651fd10ca4105456d9c135e3320b57628acac2ab6fa3f8be4416927c19e4a8d2d777e8b5de8fb455e0419d5328a92466c6c02b3c8b566c7380b19c753dd6324a474277aab9f7827a375f521e34fe80907b8f237ffda63b74416de7bf41ee41cf3e372c6137eee11138f2df8c0e591ed71bd35420fcf7171e9ea08430931ca00254c4167dd6f2a4dc7cf4ed910a60af9259577e90e23ecab5a9413e49010bad336cbf2a3d89cd8bde392a8c25ade42720fccdca48eb473e0c1d49a601bf08a0612a943d4d1fa8c2bb919cd81874e8b5e400ceeffb5c2de362fd8a009565e6783d7dc89b91b0ad76eebb4df81a4c7de733ce0f98318ecaf002f7211b43ff1bdb9303072adf12f4cd3557bc8ea931236955abb701118343bd911cbbf3f40e44d2b06f6d3d6ea9544a9d27e18d6a78916fa8ad39a287add458cdeb71cb391a34103aab56fd815ea598d9c13bf736afaff9330f695579575df15b981953f985640ae8fd5d7803042f68deb7ad130a6413889dbe37a8bb38de5156b286dc51a170d71643450bae2c58fc6d67e81f7cba615ac0c0b5792d2350b3ae7bb03c844d1c1aa7e6a603a12907d0edced7fd99f300f4acaca03912f6423b9b9f05b28ad66282c4377349aede4a49ba1a0d8d7d80394c735d518edbd4278acce510b71904d52031a5193a9311a3b0ddf313e6cdf45766c5a429ede090023d9e5dc5193a82a72cedeecdb3b01f7b260abcfdcf28e16a34752918054392a7d24a2f99d3db94705e809997d4b6320dc873d363dc2317cdf293e45c314e31c3de1ea0c251a4a96fda447119da5c54d467d8f54720da871f165966f77f63ac4adb307dee735c53283235aecd7bd1366f1dabe31f6f34425d1ea9f07fe11667411b0f790145d7efc8c4326cd9eb4b47d8514c9c01d785d6a762b79192357e32aad1420e5a0325d062b66e8f1a50c86caa22091650f6cd014c1c290402be5e19893f616e878e0e083a872494f5a7d1526e660666a6697c0028810c3d9a09aaaa35a9131cc592fe66f7994343aab9f7dd6060922b6828c73cb555d9a2892f05211d616b5361a4d6d243bf3fa3c94b7bd6a49619879ba7553454cbcc4295b7bcec03844a3cb6a7c44553fdb8d320b6b96cf9c329c1d30195acd4f898722597f1529a5a54d45fd4ca4f2d83968eec4126d5704bd68efc355f8337a9209c6dc6dad51186a26440359f71d6aae14b39733e1eb256ef7e4738dd64174a2c2df58bac9b8eae991de400c8508d0cebc0721e3b3ffb7c9fef3cc4fbbabea79169196ea616f6ecb5845912b5dbf9ba0c7170cac943c2f22ce345d85b2ad45bb8ce9ca5dc0441d09106d665ce8b9b7b34d695400fc0447821cfacae8016a44e5fdca68da6a5ebac3b2321a9255466f45abf5f5af2c2e2766d9b541769302a7f3bddc490416f662dec2d14c1da6599612899d3a2f37a38f10bbb11a470c6da79e0beb4e8d362c481a4dfbe1809701313572290823725433d43efd2740683030cacc0185de351abc49379f92180114d804a1786fec7b98a569d575279df6362f97779abea567d50535cafd9513cfc8e207ae7119fdeffe6e44b76d3d895b626cf932ea84cab42cedf1d5a3b92da7398402defae46507a05fbf0a7dfa0e0c4508308dd8004396304d98bc846c1ca247b359fca79fe18ae52c9448d24dad1d0dcf9646f4b2149dc68484cd44b4308e1bc4dd3c901701fb61db76669352b46fd1e6cd9bca498ef888633235a1c2d3616de9d53837270ca539d2516b07a13bb9c753c1e875f4ccaf981614a24814446b7c584625ead3534cfd1454b67630b8871a9684e11477e8606a922387b9560ad1f0b9d99544f1d69eaedabe3d59cb9d7924f4fa844a00991c2d065428fb748b86536f9739dce0a4451b43d0f06359ae9741300972301813e54822e3d015a8f0f00f4c5a42159d2b54052d2a82f097f465152c6155faf1b53363a338a6b87c7977d898e6ebebc7048f12a5385bfc7709f4d97cbedcc96c8e45feccd24f1dcfafab804e62b2633ac43680a8a79f397891dd11e7e8d3d44f202113b1e0e94a52ccd09584064d298fd3b039523a5c2347c1049232f18cc427831ccc5e843b174e80e6388b20d352585f926445dc46290f980b515b5802b59f26700a8b6573eadf58253c189ed76e8e9b0db933db77ea61556d0fb7ddcaa4f223a28153b493073cd0ec5977a43638a1bbabe71302c34317a9341d3996d055d84d1bc9cdc1b46886929e91634e6eaca609c1071b0cb3d1abb0f44daf82b4971932b0d9ec8332422b3309f5b9bc5cf9c8cd8c3446585664e14de404b938504bf2e0bc5b20302e225a8e2c83f086c4909c5b7750d3c77e66f4b93d740c31b3df9951047213dcca252808217771e1c24ebd7f297e6665e9dad1a5becdbf9a27fa1aa2083b55a1d92cdc5aeb661dad86246bc4fb9f778b7b6477b47e510af18d3b04d246cef66aa44c003347a82fa0c7a7ad612fb3ea50ca904d30e95357cabc6a5cefbb8da2cc07c974eae77ac3d71996456b6c41bca4250bff744ffac7c7d62a1847018d10e7387cd373462c7b46e2f71ac515338f54814f0797f41930bba91d804904701089dcb7dc0a0240311ca86420f500157ca9d64fd96cd25a8d6c28227748c8f48d0536d39e5149b60c123be407859efeb0468683a7afa73289dc0c032467c40dc6dbb71391aa58f6630258e0a8bd4193579967f49ec10bd4b85d02eb11924ae6f592cac92f6797568716502750d637392cffd0dca2145781ae158ce427a787ab466fef6880549dd33452144dfff84932882f56a0fea439b23295cb24f3789873f0f561b38f49967a8fb042253b2dfef013c322e30ae0bab6d81d1bb190db0f074eeb2f61141fdbc2adc0eca65baccc085c2948c22013c0b923cdda082d1f9a79484049008cc87a5651e5edce0f679a98a98d5a13c2235faec9387804239a0ad06b83eb89639081d553f4e228a2ace32fc35af03b54aa9d0c5951a0347da145c6934d7ac0f436572756d6901a62877faffb031c0d5d9d2c5fe61cc734f4bb316e14bae8adf2e8c88cf765b92e67b4f3a0d049d2ab9f09efc198f2a96fae9fc3cdfb05d9090ac72b066da5495685961a9816a9371672e93ee66c5a3c5b40d49855f2c121749c7338a5b484a85042386847e74271a7ff483964c64f7b2b503844ff6fdb8303845c08bd4213c7bcff8bdb59fd803aae6b1ae106b9c09b73ca05c280b5e365a8c08f5294d602d71fe8de34c7945b27be9dd50ddf1c02ac52fb7ab48f4697a35acd30a4fd63351b3da996a03157d13b601f73f15a000b185c09e952e5d6666640642328da7a3de822c2aa264560bcf101ba561e55825c521755ad07261cf7828c7a91192508160e0f573ced51a7237b1916c36515c911ca3adc91daa39af651b72e7c4428f135b79b96139fbd18b541343e906ad49c9da66ecbb040998b2aa2546ee4f7bf10a75b7cc55322961d6a44d2541ef86d27bb266e25e9e13ea9ffc825a172e68031551451cf6b7726cb3ae3a61626b13cd097eed4da4c5f4c7b7333681a6ef459e2add8ef11bdcd9d994010566fa15e7f3edfb2938dc6014e093e4b8bffcf56ac57d11d317890458962128395979290680fa420a26110f968ecef4b9f02684d6b704fa2f6e0ab9775c34ff58d9fac57d46f9b3b9e81b79fceced2281b380a0d28c094ec0c7464318eac9408dbb442e102f871210c14b520455b35f378bc13f2bb98575ee8ec53d9c5bc48a29b53e43f14e04700e450f49b3ab71937890c4fbd1bd30da8326f9e97ce623244fe9de77d0d3d000ef542974b5a48746c9bc91e4ed8772c7726465b2c9175e9d7158a475352634e3ad82bd479e10b190b73a13074b3c36909850af5374aa1d4f93ce0e5628140aabac52c07733d582588861d87824db7036ba26f857db1cb1ea9df1851b6cb827689d92b06e9d648419e817b3501e85fd9454977e442636020d8e56b9b92956932b630d11f2022bce958bd08ecf2842ac74918d3527de0afdfea7519203464bc2e171766e275b92f5705dc11a2ab35f5e4bd3c4b779cf2d532085085765d06ff6ed68bd55d65ed6c7660ac88d60142ac509d955de8cf0bd7201b1251ebd2b8d0ca55dbd9b3ed7ab4f2375170455e4a5fe3b17008fa9878cbf1b1f9300399bc434557e68b81efd7659600f3e0ffbc0da836c1d4027a098f10f4340b8fb7db10bdaba17a6c3bcbe99b166328c26efb7fdc31732cead76f5b550fdfd94a92e5a147f9467fa81c3323221e757b2872ceb25987a157efbe1e9aa9d868a5e02ce06b55977b285edf69dfd03c9fc55150a9f89ac5e0a06a219899cf2409cb3bec78955bbf4ee45d011ea0bc2d5e7cc1fc65838c059decf8aa0a13efb23e9e3ecea4d5c55f9e28c4ac8fe1b263c72a6e539ee29a4d240c83ffc357413567711afeb2ea94f25ffaa169418a6c25a6f1f8adf7cb80ae37f95a6fba5f3e397c915d9d1fa4ee97f994aed665946619261b42cd3541d9e386c2bee10252ce75e17ef99422c9bdb7ef7496ff043583c0b532fc7af87e8cdaa3b5e52de5dca92a986fe251e1375797eabd44181a8f1a0713549fc83509051b4a62cdc7771e4e243eae9269e18c9f3f65b36e583e9180570ecb6061535521e52f3eaa6af3a17864d13324567237e88bcacbf32989d407a97081ca2f67ed5b194933f8c0f38214dd53bfc3a0bb8ad63b2b75ccfaed73c5e554758d2ccc327afe06f486de856a8a14ebbeee1f7bda551afedcb54ad4c424ecfde40329ae37d1d8723ab7117d2c231fb7af563c6d856bdf603de1206a6802441cac410f9727c9c588dbdb8dfe67e34b06684d1e1097833ca32a9255a67a415a85ee3c9fe3ae250bed6ca326020eb1a4601994655326416050d1482b72a693c96b3f59a69b6bc070ac3c67da442455f6722f08cbc87164929e56552c8bcd8ae444cc999d309a2c47da8633bf1c1031d34c8e09fdff10730066fa513c1e553ac40c567af24e17c0285e52b1f983cd748d0a0066262b69c436510cc6f22c6adca8ed0ea76709e9bbe5311102cd5d585242c61c6d15f5d534579d832bc44cbfc227a2ce1436f5c4029a6602e18610f5e067a9be245f36729753607d498b33dff35b621b0c4a153f723192ce3ada564139c9d9a0d4002d77402ce43909b89519b8fad074b0da627389494e6945c0902c738e99acbe0ec981935f167df71ea5f0a07c08124a3444d5017839e32bbd858058ac54295520f8b1484f26635fb5f9703a0ed833fead453bbc68167c64294006cf44028bcf1a9d787fc0160c3eec6e0e7c0a3d84e2c5af9859a98ddcf2e5a8cd847a7997ced2383fbd3c6046fb0a8a99e5f7b64163e0aa46e33d91484af0d58c8aaba5d0c86040c5efea77540462e6a544df4cf307b563612722c739efe73a35a4f9a556973d42dcf3100d6614f02046b809b67c297723423aa0990efb96caa878c1439bdd6e4743f2d00ed2c0b9e0a11053690f25f783a3b9d743981d47fd21cc3ba0d0d6f3197d0659b4ad662789ac50e11c9b1937f36a7bcc741a35e088b4fe81ae96d2d57b1264b57cd0cd1cd45805ae9ac95ac7da749520c1d4bba71002d5ab293ea8c43c23432d4b40c94317d30b686171fbc0ef6bdf051433127e232ce8e8b54cdcf5ae6f7b7040ccd30bb56720a572d7cd29400c7b3fb63dacb1330e1d7ed18eafc95677ae2c1c7f26db6b9c6c1f875a454d4cc899fc5095a6cd2e6591bceef8cbe6ee4aae41e9f6a80325919b24e8e08d4b918862686258002e73c7f372fb4f09c4c57bc1444ffd82fc3b5620a399a2e0c484fd739cac22c71fba8a390124c28be23e1e93a2143b85ee9752ce537c8bfdb6c929feba56f9619ea06d1c79dcd337e992cb9d203f4ce1b408752e16b316e1e84f1504256bf606392280c6cbe7858e76c60fc3e92a8a5c79ec14a205de85988cd38c661a3a6397c36f5f9543d3a95c8c8f39b24c0dbc53ed4ef143f5855619713e4441e4d1ce87adb639583a1fda80b459d25e795229815511076aacbc28aad3ee56a37181988eda023103d32c831ef5773f195ca7aa22ed5d133e5014df5481789076df32c893f2fe1b0ced578457011bc4001cd3bd75233ca4eee5021d552066a68d4b64e0a5caa5b492c21488b90775df796d812d43ee956cd7574ebe06623a9f7dea6f6f71ffb08ac26c0585ed81b6795f380e961b7d006ea4c3eaa2a6135ce8cf9da40f98b83d74af089ab3046b082f25b1d4e324596b0289da77d932e5396e39d0ff2ca0f40a215a5de9a059d45b8e20d9a88ec64963a789ec6788e9450a11c322b36cece61d72e8ba3a415201306623438ced4742827fa575597a7a314097110d71f746d8d631317e7a3fc2d5380baaab5be556abd1486c06d34d36eaf8bf64f8fe8903e80ef86e1d58440e9457a72a24a512e3c12a2aa9f9c27488570c2c02c35162639d8996855c39136719b69ca2837eabc399305e7b9c70564431386c175405dbfb613790a7b08171865c96979d9a857f5e12f175b80809a07c53b60f5b49282fd726d6e363f66b2ae1cdc4f37b0e17e5723c9ade4f0f82cd14c09d60f8675636c212a3fe989d0068485fe6f0e7df908e6bd68a56136a770e17fff2a87d271911a9d307b5bab8cd3ce41919ed7d0993d188421a41a0d9b3f745191f282501495ce4238053588bac0b0a0079c5a95ac43c2171119b21590b06a8ebd982de3131449a4e37fc4b48bbec4dfcc67e5e968254e13bd79e3f666fc2e21cf7aab4a4862107ea7563d159b8b1bcca1ab127d2934322dfa40926b42b06328f40c7423ef0ef1513089818b63b779d540f0f7b63b8a5c5a87f06705333851935b294d23ef26a510800ef43d052d0b608af50be48f271776aa78ef7b0d66ac95f88d8fb61d14f7c745931ee0615bbd0424bcc4a0b6af270d80aad4278a1dcceb1a8403308c6d41c8de8d5e93da623c4a668d0749e3cb8c899d80dd8a83e501c546d8813009983601b541c936314e9b56143a841d1a39b8c697e2af5d1318a56c831262685d47dd65cd7332b02ef1695563baace442043efe13cc907b93ffdf2b891d3a3834be70f9281da2255179d1248cada16d634aa72a7c94949cc5819d0919d6eba08c5323332ca695723a8c37c36336801eafc29b55d19a59739c43952863a81b439b0600f7170d72d604ac8a1e696c86ad4278159b7bf6afda5d4983d1afc166ef990246e1a9466bb76ec906ac027fb67e0341f3ff07271b0cc1b83e7daf8781638ac842dbb2da1e040ca4dd427d0296b29ea4fefe6570f62031a7d050574d66fa4afa783fe683fcd64d49c1b7c691c5ad32f76eb971c46fb8b94f3c3ffe7ed13997291b3e98f35f34d7f8dfc813a045f992378e2c4e5da0419b5d718ced10cefdbacfbe5de2bf92b9a516197c3578eccbf009269e083042aa925e03d2f81b90d1c155f474f0fffae7786a065dbaa43252734f19ac7df282826d5c583170303a4c4bcd37f7a85248e3a60cec54807af17202f0e47c2e7546262206f1065459a249c05100390997998ff34667d464953cc47ed12bf7fdb409180f4afdd72b9e36f7cef97f94535b2f28f97d04c8a658e5f86b0fd8d914c1a9d5ad52ba23dee8b3166e319b47aa8bcb91c990faa0126f858a3de779603052042ac7c17a7f96af2e826550b932c701cca41bcffcba05103e8b5ab8c715f398b512259521097a31437ed5e80cd2c38f2cfc8ac34c41010107fbe943e5355e8ca797dc42345fe70045f817031f306587f7b0258b77259782abe9c599c5ad380c11bb8f6111f0a28c65e6a30a13c8b26a658877e897485e2248f9d50f76bef27f9cb61b9558e1139b2ed0ebc5ed957e5a0486aa0980129cfcf662bdd869a599546e060da1e33f873aaa27d0e01a25d78a929b7303a67b6e566b5829e505c429baf0e04148da1dd39a901bf6c95675e964a4eb976850d6353aea033271c38b4b5ca190064e8aeebf5de832957d2da8b2f097a26a103777a20846829f7f8537d69cd2ae580850fb371e0815fbfd64f2e3b29574b84d2ccfa05e007529f51d1f24757317c24f3bef3f7aa16049f9b9aac980481cf82381596c674cd8f79d404627f934c4800e100d9b822e0a30e6223d2c9213a6f0cf884c36ec7a0fb3511ad7794c2cb1e852a82b59a7e1e80aa81e5b91473981a1630905844832eb4a2d01a6369ea5fd5a71a8881a561fd5c4dad5512163cb4f56bee0156c4d47fa3ba01b5ba084c6bf027b7f19a7cf97433cef27efab79f2159999b4001551f06e957d0f156030a61eab7fed9068113d0d64253b74786d53be5fdd91bff2fb56aaacd393d606d8a8395a0185e912626d564d06eb3e0f93f6edf6c003dc9bec134de55755e459337dfcc515be361cc6a3b58d54a934bad836bcdd4f86b5d6a93e027b5444c54ceaf1c5a6d1d57fe5f9acde2a7c4dbbb2b90f1c89138c5845f965c97999157312318fc86aa0da22beba22fdb3fb109f821a6a7b3f528d94ea6d631779a8ba85018387a0bc53da295cb01003fc4e49ba142f81adc62069e27ceb4b4658230b92588536f1cdd4b3f6dfa8d56fa5d69656d9dd8d830490323ce65a438d287a10f74e6d22636299c110978c5c66142a1e9231eaa289bade1b84427ed115c2deb45ef34413d80656392784527937dc63e870f68c8a45b39c66dd40374954ac10369b471493869afc970b31a893c19de5e8da00bb2052d9a6b1e11c48d4efc428151b3a479bc6ec9688378ae294596ee435bd78f058d6361ac5434f33e67da862efc65196e8ebbb1e32b4dc924b22b0054f27d0c12576e8c99e3003a5854a86461e1b895ba0b57006ce65b2347fcae46c4a686f8d4650f59c4c3cafb2ed294f33f605195338b9d02c60d9993be7c9746181ac23c51c6abf3c393bcec978ef001903cd26c65a55470f315826427290e829e236d3b0e4f25ef108b1a6c38e2c33440a331bb83ea3b39a7824d6e5f2a6d3e87c918275ab8be95b9c21149d45e20462865e402e2c893cdb0f8969e0d2df8084eaea639eafec9ea514ee3d2593208b8a43b4e470e0a9716d7edd7bcc147b12ac44e025806d2bcd63a4359c484ce1072bc0fa99ab145f31c6e73e5020242b4b952b3f58410ffc34252dbd25bfb836d13b0e61730019c2b698a4ea53cc779f9dbb8d737572e3e690cc82caae315f320d36122e7762d2db5a0a9e7ca823cc176073b64f6f7fd1d813020f647159179ce24142804b5accd9505eb59da5ca98512fd46ffc1ca94dd1cd28dcf49a2525a3f93b4ad3c8b29deacbb90fc01e449ebfb1a960d2abdc8e1cac63dd0b81a546a062621bee2dad272c37e05dbf069d74e868c3fea0fb600ca34264cb80e9a17c3cca7b8751dfe105802ef1f3e253bc944eae316009b17d7198f206494d09c30022e34310880f69840577f4a1a2f2c810350b117711ba40385cb3d56b292c604f41661c125d84ef321a35cda215844e1bfd54b35cd132b626dcb719eb2cb224ec1aa70684c79e6543dbb9144ddbd10cce1f6b25b53cd42d288d1c2eaf16da0e345b5f4a371d4953afe63b11e42d4ff1fcc92de1377ee5102866c105a556130232d3fd7b356fd5b949ccde19931f36d02c45499a24691dfaa7e7798a67d2a2573c6827adf589987147f5226098b52ed7754d9b1e8556755b49aaea4594079de038bb850d6a1d9844bd51dd632235accdc92ea214c79a56130572dde142f31a2f89b3d02ce6dee2fee809fc3f88ec31fef4b8c00722a34dfd0216b0f8c685ac266bbef4fff79c229f156025558b007ef0c98354bdc1a249f735aa7ed3c3f3aec6ef8112a7c06755ecc3a12bc6dd544458443e3f9c12583c12b872b3459baac3c16107fbcaaddc26ebca9b649c86645d93cdb81c455fe8d5d73f26b5cb5c237c8834fdf1ae0a97643621af102e8df1793d574ce9260cbc75c12a5776c4c2b99da16f6748719f9c4c68984cd99b4ee250951207e3a7aec247be86c72053c9b6b8bc3e3a6de2c62faaa2eb9c1c8fbe58638b9f4effd134c064472c0d9b8c2c9fa398eabdae1cb6990f4d3d5c0da5ea15b3deb56b11f61511150c26068388f69082d18aac41cd338aa39e561a35cec048bdcbfaee1a6ac7e871036c29a8b51efd78a75b495549b74506ba53ba601e28d768ac5900fad99313c23843e76e294ce8443bc825e7e7cb04eb9ccbced3a821fd6d2d10cfae236465428c2d7bf7736b9b4667048a6c10d176ab3ed4856c129dc95cc70848ce00d6e7db3381a4330d391de2c8bc612dca5b3d28c1b125382b9804be14c32f02952d66a4085e5ec9c031ab6023ba3e11c87cf3bd9f6c6d5cac9dc48958eac422da20a97d81d724924531927aa714b822bc7df4745ca4cede2609a1e35f2413d8bea6dfc2223cdbb327130d6de629fc2b8f247d116b634724086e83e6b4175ccc4bb7eaf1725f33de02b80888cd9735ceaead8044e34a1244e25603f9041b456a16e98ed954362f32b26e3e093e20441be02c06a8dc2e324d652598650e8aa324cf0706aacaa82fedb532a981be4b52088534459205255404cca9584e20f0c717d159894757e30097cc7c1a4210df806931a106417068a54be69d413378e03b156546c8992524284b5ba662985d10a26692607c9c2c4f1ab95ee5da48e891263167ee76ab528acc483ab95863152bf5bad4c9591cad156ab4f715eb5400d69b512e401e4b46d22be8a28dfb512bf99a442ad95fc19a953b95ad1a79152786a75c55a068341ad34312669d1b4d27e237533214f3c6d3e916a15ef182936aad5b772287b51adc230d62014aa95be17e119a856b4f918ea7f6a458aae4c93aad5dd2f0c78e439d9514818a75a1db3cf8667aa95865b203b94cf9d3c9e37e48236c7e4130d98892bbeb3f92f1c6018f66dbf2362e4f3829afb670761ed56974c62fae4cd671554421307d2dd131b413798b2d7241db0d91118a45d04d855dee12f0ed8237b7229f76f9b429f83707bd46467a1e8bfe41393f17921b03b6f58a693637c7be1e44491662a21085b3cf2a448c0bf27ceaec80858786207c01241357d1da4acf221c676747462722549fe1aa41210aea4502cd734728095e808905b495fde004fcb1170bc92fe3647f73e1de6f25d41e1fd8c8308065849c69ca06864a86860257d28014653218060257d32023c293549e54280c9120404aca4ff7e00170e08f05a491f75005bc207f85a493f9e003b7f0f80b5927e96007f7a0f90b5927e1b014eea1e4096597d090196e01e602db3faf3012cae3dc0ee4afadb0160d06fa646ee9f716256d12251625654e7fcc4ac42884913b35a8ddd7d9534b0af8e7a56eb0933cfef33460c203b6407c02ab3caa2cf2d3418566615ac048862a6c5b756924207186a9816f7aea41e8402d4702694ad6116fe7f9574369026667555a697985554413c312b2a19ef57490d6e6a1a809d72528279f038a8be1d367230ef53ea67f0e0ebbe97d567ae898528e403251d781f5ca9fea6559dd581ed038e1b9aad8b7157e1060530ced82b81bd97d06cdfb49cc831a2b674ec179c6994d267f53202cc4661cb75d9cd4de880310d260e5a7f9c180c95c2da16862b41253b6543fca9a7c8ff7059dbaec0c896e1c2eab0b382a8c35adcce4d8b8b223fb1ca4e71d541e195dd9021ac0c2457e1408324450c0faa2647347f598c5cf65871e1782d0c68582716117cd9b3219cfed048ac192a312ad91215ea1dddb67150a1dacb0749d55c54f8a1881fbcd6bf17847a0f22e7b469539ff2a6dbbc04e7a1e0c0e63168441beffc11d63cf1d4058585ef023e187aee2d37f183cc0b26355c859c17599ae018c7773807ba93b14cca2499c8bc8c1e5f99e698c0fc268fc944deac967fb3addafba9b19597f57eb128f9da710f6a8d8d4480ee5c4957b3373d944293fdb16a55fcacb490d19b74dd4a29f9265b587881721210ea3a8281ac94be341ea948c6d28b2700ca36f38b8ea730ef7e24cd0c8925f0f70fd7a994c794ff1f95e445850b55e88330d2b2250bdd954f975934c550bc1adeacda19c73dbe8ab87aeef2616a9b45a583735088c5532c2bcb6af235e213c67a9ba5b7820001c1f0739b005d3044748067794e365ebf1924d36d8e57565306fae7c1869055a8dfd48d34e48b119a1fbe7547dac3bd256b2a4a7798e6ef90e30f0db2250062af8fe4fbb107b92bdfcb6055c28047918d81a892d54fc3d2912c996d57a484c79a4d88db05684a27be658d7a90c4fd767973c01d18f780837e2d4f0726b611b0b2852114a2a7c87eb7a5958f5491e559b5cfcafad7f4782cab6371dd378d7dd8b362f1abd875d3c58b846e9a977603a3ecaff2003d8f0400903467f26e9296a37df1aea8494a3fa5913c1dbc36a73e2c383c1d3751d0f6ea0a7e7b420b48d4ef1327591d45df669bbf7ae0e8dbcefefc2334cf300f5e1f2520bbd0a730f484f4d2907ff320a4f569a5de70503131f14d9a4554aa4b7afec590dd1b05477aaf64fea36d28d5962d31517c566b564be7e36e7201e4df195ba8add8598cad82a75aeff22ee7888829d6ec088fff38b55c58a2f0ab5c10b8b3525e3d4b1e26e9cb701cf166721788cb155c1531e1100a6a33a86ec76b9f10f2f4f27001857077ab10e8686022582b3cce7ccd48b1b4dbad6a219d1c5e9ec991a3c44a44dea58848d510bf10afd871cac3ad7668c2bac543f230d62b20cdd75c04266a2555c74d18bb321a93b2cf2c3dbbe869adf28bc5ba6923c6a4e2e2cdb3512826c2bb31f17e5e63eb1611172d59a34cddb1e2ee09ffac505ae9166afac41bcf6be664f08792e4757c6155c89248723c8fbf40314c6ae09bef63b2c46a76832ded8a639e16d0d4d03a11dfec22690805a13a5bbb37c7638cf934323ad7096f2419fac7c9ca7a905d4ea6c6f3ed38b22ace8a106a6c733ce58d1c4553f279411f0cf9972e35a48baec55d24cac87c5f1b77f7329216874ad4ed4c75058f204684482b42fff8cb38781d5bfb0c2327a80f4352b8c25ccf2cf8cad9322244e16ec4507e59cf67f459a987fc1642b9113e9901bd3e90994f1786746433b889a8db63b0d2d419625fb1cc42336e97bffbf72d466225e6347da96345d66b2f410fb3f8535a89ca61ae2ac819c2d58fd5a2120efbe4c4639e076c501eb7362d59462ded4405e3d6d56af3989eb23bb1bf816ad5b941f67c85c60871d6ad078d05d40ade0d575a6e17c779345a12338bfb9790cdde60141aa39edc125ed0dce46e008766ff2a2f58be49819c05d3c3fb22aa34d9ec60d0ab0b0631e005cb625583e5af174cefd8649b6b5c79eceaae94013c3ef0f6a593f5d57bf1c8e71a7d2314bd5b68fd95d8c8f016ca3cb75ba6ff0d0ee1dd8840fd3d8801daca7b268e0fe0f2cd58bc24f7293b6d83eab70445a452bda4041d6f6822f3a36073d05f63cbf16d5a3ee0e21f195f19cb0ca05916e1941953df97c222cde9634a2149b0d4a73adb4ad79cd1113505aa253ce7f30a9e42d37984cd0e54e286d3bb959f0a2ef63ec0610f9a216ea751504ea7e0e468abd93aa8c487977482ced5ddae16bd4ed3c3224f60ce034b18db53d030d54668af72f59586b638bd484537fdceb58728bab201f092b5c22e25975ef53960501228e2c51782925ae0248a0a5f95141ae288a7c004973ff100d450c285de9848cbd24a6cd898086c3175e498f01f0b56148f09250403726c96a38d14e611d22dc8435bee90685f4cccf59760913cb66d1054b43972082373242e42bdecc643bf76f03725c7e210b6e951c5484ac0790fae98a854549021ba6348aea59e67cb6f898c7828f8fad9bd3d6de2a9547b833c1f6f68e64a87e47c7a5f9d8b0926bd909abc27b59fe2f7fbd42c7a3b8aebcd0c7c907099a1bb4af46ccc5fdf3a9cc09930b6fab39ce549450b9ba7e84fb8ca6546bd1c7a72d6c8daf094522a38e349a7372f61e70577de8ad24b5ba4c79bb18230637d276f2fd53d4e2058b083c348a8f55df5ec078ec53c4e141fe9c7309612a137bb62b2e753313f5094981c860e0f10395e5311b460dae31b188f13f7abb39df76f748852f1a337e049fbc6f4d7e3e66d005f5208120931c07dce29e9a051c85d65825226881614aea76444b2e09b76a7ac4e8b9b61c472d62034e765d1c80d9289644d8b64c227bd474a8904d52471af8a3d2a1093440a0ac725f828b8868447999040a030c8ba7373e8383193804549c03eb0feb68dd8c7a3bfdd3fd1878b04774ded80c0c00e52515947f3acddc2a08a0e23c1a897c2e57d248fc86056b1a0a3d12d11d8c492d37f57ff31f3d8230ff441e0c0b475883db19117b7046178cbf6251c0b22dab56581454e98173a8481fbef68a2ede3afb8e0c1314dc1d038569c3cf50141a26b0e2e265b880af3b554fa91db643ccc86f70dc752347ddbb4d8fad141f0d8c0d8772c23a1bfd3b18e8f3ed8f10bcb7bc052d631d0648a09fa5821f17b8143df1a6791712c41160f6af14d40df679a81637a8c5d7472da4b4e2d61c724964ed0477521edf333150212795c341ee31e617cbbcccb8d5ad4213c9256ff8084fd547460c5f99cc8210d316b023cc19b630a734b017c09e80609464f0bdb442aea6e0b9eefb489548c5a582d1513695b08231b527e673f97c3f3eb2ca272e1610225e9b7612e8b5ee2e27705b7109cf14f6ad8cb7e88892b5c470532419048ab2a88ec33b7330381fb12318790b560ec720d59510f71a5a53a93e01f1754d7416d2a5fec336fde80aca50a05859f0f74da8470bda7e0bee88dd946844bea112d11da82cb83602c10c515e384709604e739cc8500b93b9e8f7c3c0faa0f3456ee86a8aa3fe3cc7cef5f80c0cb6846fa4fbdfb649eff15661ce4e2d9635c3221d7eab8b538f79b09ed0b5414eed1ae0da1598faf631cf98922733fbe86de4baa972dfcbb908f6bb14fadd2d7f2fdce28049200bb1bf7a8097409d1f77146b012564c33079cf9033fc60763764310fb9c5e80d9983b4c64baae31be209b58164413dcada85c0ddaa314f4150bd1c42ea99d5539c1c4f40c706c795a700c3d289e270422c79b1086fcc5df3a3856f04b85115d38d2e04eadffe95f273bec714e2c011c6eafd09247fef4bea67cb66e0f1c43c0b15cc0d76f97d92adaaea339e44e3d6b3f8b30022d4ac2cdcbdc54e272a50e853b83d5e427644eb901649a042e2f44b20d54107066351d800341213804af51aa801208e32914855229a72804c1711e0d2e61ed8436b15b4ab22de5f65fba91b4bbc94d986ee9f081874b267c7e5fb5a5756afcb632d029e8546022fcd0f83a26e65ab4de64a7360f380c1c0de20fbd117df093849f29b6e4f7bcd17dfc49f263eca2cd1bce3265522dcd607933ae3ea238797818b55a237834824dba15d0dd39dd7153baf3d1b3e62da70ece2f8a93d4e96eef8e8b82337e190d5d9c8f7d26295dfe2249b3588e1ed6d216d94cd0dd47ba2b6de96e1cbae37afcbeec4ed1a7dbec4595de19769b3d7c7a8774c0188c870e1d3d7cc4660c06448720030079c4e68f1e3d401d80c08080af2304127b1f3b7a04993a60c6e5d5b9dd2dd45de902f87a302aeef078783b58f8730da6d3834710f007000b0730001e3f40f077b0460b7ab07296a9ac7633a6b2bf3a567627a8733f146909d3f9d1ce74f2b5b0d9dd32babbee8ed1dd32f44c77cb74774c77c37437aabb5f5ea6d0e8aee49da94862fff2fc6474b771d12d4e9e1add6d5374774d775b13cdc37d5c6977c3e83ed9d832be5e68471df08db6eeb6263bdd3d4377dbaabbeb8b2ec41fe6a158da197695639af2a30f2bf537b2e3df173969b84bb0eeb6e96ee31a5f2f8fb16bef7dafd3c3afb7cc7fbd5a9a67ae3fbe488ed4339d37bbacd29ce7786dcc67e9d4dd3574d748dd4dd35d3bd1dd342bc6ee1b59af650a4e7282f87ae01bbd68f3ea8017eb805614a74eedce0ba36277bb7497bafbc499babb44002958b8c0050580a941050a150c7cf024680935188a11c10715664422291c2904a9328386f2c0c0c4163fa2039c800992a302c18e2a33687880c791b807070210211d31029411601a2045a6a94489e26a0ee6015374dbb6335384112577c98952f2cd717a4746c651322f302687294931b98c6f3845a07c2ba166a044c14182003b9cc3e04841da76384782003b3f987cc68738198fc1e99d9919878971a46d07468a0c4a8a8ccff88653048c6fa8cd8b8871199cde8189c199b9f1e204701571fe44ade42e335262dc0547ca8c23e13b30becde444e17cf32d474a1146700e931385938284efcc38070308ce67708a3082f3989c289c977e18e2bc34038383b4edc0380a0769db41790c8e142408b003e348db4e8ccbe0dcf8c1e4330e04e732ee822305c504cace4c4e11510cc5f8e645c0384e1131be790f9c0b4eefc0e0e02011c5b6f385eb25a7e8895ac99fa899dce4dc8d1f4c4125df600499dc4f50361717149ddc94d32e28dc660099369d505216a080ade425d3e60299deb6a2cd4dcee16c3026938948c961fc05657a8131712f2f309c6f30a89c22ce64329938cef48468330014d78b0f2677796254ca1cd19313777a823ae564ce005050ce9d8a4e394425df5038452f272ff9e652c8949c3bc178fb707ecac1b9d9e42e39462577f1138e131b57918bb72b26c7c913178c97709cd8b85c7232e782f10d8691cd85e25c303944262742e53879e27ac9e1dcc585e35c45ed1dc35572d456ba01aa7b67c3414232494142c20605ec94709088c209015c4898a42045e18400aecd9130e544e184002ece9b8a8b632283e2803c796244c939376273938b3f9182e43ba721183fb911288ff1ce798284ef9c729e18e1e2313948bec3394c8e11a81c24dfd98c70d9fc94c379bb112e5b95b161013644b9f902c5a94e6e0303b64d0817db16ba9294238ee00ac021a1539b73311c12623ce6e60b27578ccba0bed0c5784c4e4c0c872587c372a385cd63884c515c31be798c0b8e09c9940491498aabe49c9b904c51601481c9312561427a9942c965b62ebae862ebe2a68b2851a8a0a28b2953bab8e9627369d1420515446ebad8b64d054b74443578134e4c8181e2742382ae51eeee2e45c90afdd22fa617d32aca0a89151211ca944429d5a6244c4c2075442629b6dea294548dea128e290994140d40828b23b2bc6871712f39a2b8bab435d72e2eed27180540394cabb6a8c690230a0c220d8383c2e1b44099a234a02b39920d0e4b49d59eb2c2844a59c101d9bc9d2855c5d539375ee84ebe715abc683955114247b449b9094257641b22e2380f924207c565bae1e3e22f4e6c378a70ae17df9cf84aa99294520ac9758a92a523eaa4cd65db729e389d4c505ccea54aa9552945b472955c2bd429ca4d968e0865c5490a0c74513a2d3a84d075900ca3630adde67af1514a959c8bde5c5a4a3f5c72885a0b14aaeb6c6cdc75f8682e4ea753149729474b7321840ea565089d1657898b192d5c6871e5cc68a9428bab8483abb4a1b4cca009974c8cd28c53957c0be98242a15059665110b76df36deb98d83627b6263ad031d135f1f282738a42d45b8e7acb4ce4b09480b8c0f8064513ae2d36284a279fa1524a9576d09ddca506e9a5344325277440f795522517a2942a6d2eae44e5880312850372f2d2290a1514165412d1cc0c9528418204091224488d248e83d142c94ba51b2a74250ecb1525202f59945425d722cb165ab878f1224a2fe12a212d51da3121e1e0da1a07242e07290b0724498babe43741e8362ff58c125c154a5b89e360385329e70859b2dc4081e3361f1c81c50747f4c007475001a493e10bb88201493180f8cd0eba195ee38e330367a689192a34b849896e2d112343a6460ca7e1260af40e319cdb5054361714150e08aa0aa7e2505c0d1c193132dce4362e23c365626464c8c839b5aae433b2a0aa7040382dadea969191c32575aa94a5779462702e19385c5277ca1443864c8d19a6d229c7e6031d0c279a69829b99320345a924030d8d93175769c6899929a514374385060e11a704171a7088562e6eca35d1f84c13251ae77cc6899929353433546c9b8dcd56ba1142131f25a7d2415895525c1057c955723591b9f94127d340e84a7e3ad580b273c36b7ce886d7d4f88d9c52ce500d7ec36fe43cb9e135e440d98911c4c5d5f80d270ae22272259628fd80e1363887aa12a4f42386732ea487265036e0d0f806e3c589669a082204460e0e37706e94fcc66bf01a9c1ba59c1b3fd4f80d5f5283dff80dafa901e7064e0d0eaa03a514876aa294e2504c348b3351096252820372c339140ac5255141d5e050e92188063a0ed5440dcf28d70c9ca33a40830de71cc50467e3338ed240ef60e3dc4c13311e84064e0d1b35bce434d000a3060d354a35336c6cd030d3c44c13346c6cd030438d19336ad8d8a081069b276a7c861aa7513323088d49868c1c27db174432706e36d0999ca673184e8303c5558281e2808bd31203e35c16130e1cd79d6c6040e686085dc965ba534e11510cb9b80c5ec4c963382aa7081797c1512eb3ddf8e1e4311c8893c7c801c2c5517873c538e785290ab7a5591c91f3a0e3b6e4984c318e42c5981cc6e42893f7c0714938a59713924ce3406493749ac198999999999999114d45332e830c3ee325199443d9e1bc3920308ef2211847c170a59ca11a8771989c2730507664500e5345e9c7e944c34f369cc64d584c3549382fbe790f2513161a3438262ca55416a6241a3082a4dcf4a0231224a5c669f01aaff1225039373847b98ddb7829a708989c1b5cce8d1f6c1ce54b6c50bea4a6c66b72aa205243a5943a79a9868a669dba2494141c10183f75326460a9a1a2c4838ea84b72956aa8e080c0c040e254279f314326a76b9260207139449c16a28ec60c381c0c2233b84c0ce7445d928cbfbcd4e0a0b84a3568b80c0def819b0187064c0d0c4e4d0e87855395905c307c860c2213961957378303c363e06c527236a42d4a2945840e95e43293d4753636251848441b0c24170c120c2418a49a18278241828144844a4225698182794125a1925e3822744435495d854a475493942404ee492ea54e47262c594a3f4a2f38642975326551fac17992ebb4856b564a9d5ec452eaf4522a954a3754e85e9c7bd9904aa9d316a5943a71a746fd50da41e5a06e96d06d2520286f189c99920af5827323848e0806e925c70585eaba524d92094be9c78b277157b8883a534c151d110c120c52e947124cc04c29fdb8513ac12011c174000669862be1dc044186a8b3eca043d9c092e43a113d918253a14e5e93a445894694d28f1b2514514d92ebe42f2527e272505b14ee74229a71895b6c4a314694a0702f375e70c1c201d976fa250ba7dafc458b6bcbd22e3336924e377eb0e1337cc8c68c9c214ee6b4256d7e4384cec4040c93121ae8367ff19817295164948b468d6fce6591512e1aba35e31c127a871abe350744c696a384ab0667062fe1b8b868c031426d6e6363b2e1b628a54edca97b4bab4ece995c3538dc169da281638472cd90c365e9d4c965e048e1b4f48e9333c088283b325c869b0187cb42038e11ca6593c369d1a993cb986c70382d9a753a39e784d639cd701a384f20a17666784d0e97e5c42535cb756384ee0443061964f0120e1187e566035dc94f1d0c37c580812ac12002c329c1c58812941826981cc898fc460859e8665cdecde1cc70eed29dcbe42ab96e6ad0b58b977eb8985c870fa219213139352e1797e92587339db65045072f53925ea8c821e29236e71cca8ecb9673e30793733e64722ee74914a61cd4d08c9bdc94f3c4e4333736e8aed0716e9a223345e947bb0c14ae928c14a617177fc11284d34946464606e766039d8b13bd547932e5e43138505cdbcba94f2f59e0bc5c514abd6039bd54e19270701002e71ce72693e948e987c94d28940b8753729d70da7583838e68e626075ab8e478079552dc02b498895995bc942afd184311ae1b24742eee330e65e7e59473e307199ff121199fc97912c5c99fe40ce53c91c981b263c2d2b938e735a5944b4ee73720e860728c702eeee2f2e28293e374429d4e279759a9861908ba6be29ce370724431f550fae1d26466e448e9e5a4a3072fb970701fedada53443812b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb9c1e2068b1b2c6eb0b8c1e2068b1b2c6eb0b8c1e2068b1b2c8e707385152b56ac58b162c58a152b56ac58b162c58a152b56ac58b162c58a152b56ac5829c97407dd10a16b6f1e6a24b938992a64a8c850d12cce6f88d0d9b8d14129c60c2a382031a890498a219314432629864c528c18fe22f3f2f2f2528a913423890a0e08979494258b16a21949584e319238153723892846928b93499a91342329694612a7e272886624b938ef1a495b89c31283ae944394616e3cb0422ac116979b1874442287e5a60339a2705b38184ee3e28292e19b0c2f2f3164a0b8c0e1b6f8c9a55d2ea6929f648081d3a1545b3614ca73a06670b69c19207439a2a8c68072140704c66de0c4c00092b9f141f7e2a6ada41a831125282e9c4b0e641a48d70512175818508593c941c5c8109313e328183ec4b86662fc0546015e4c4a2cc1449f4e2e3088ccc89c4e2ea7189d0c9a538cee743a9d6464e0d0c4f02e46c965885921f112835482412406c6f4836e85544a41e1c28a18d38c69850417e3a7182019574c4e0c8e8b8be3a2f423c60b33ce6d51fa3133136306870aaecd61b4e0dadac509aecd5f38174785ac5c7fac4df2f51a0206d8bc5fc5d2a8d2577e1cfea5f8c3577e1c560b7bd5c019d2b04ef0953195e54a5f6f345fbc7f1f885aa6e2ccd72229027fc653ed63d6b5e4bcb48e072de4bc34b779f2e8de7ee0210abe5eede6fa3ae41c75fe6f86e9e06a6946ddfda952e4bcb45ab65a405ff8347baf857da618f64cc4abe4c13aa928e2d28a25595e10c7e8d1dd0e170c08a9811027bce51b1072d4dd13c0e9070889d13895c6789ad6ed6044eff076b0c46a2f35aa3fc3d3c8acd502e9fd70be1191ce2248c297d53954bf680e3dbe1ff6d4c2a7b5705625b9be906b004b188010fd0abfacbdc06b637f3f16d6c741800c89e2e4a985f3938ce0d12bac8f811ca1035265e5afcfb6a6bad34105edad6b635eadce97cd8c1de320823aa6abf0a7e779ffe3d1a3fcdcb3d9bf888a347f9a7b31ebe38fd7c62af5a739ae0ffef58ced288a4f733c7d754beb7f671eed8dd118cdb6867ffd8de64c145dee39161d9796666bd191d2c3bf1f525c2d8884a709febeda9fafd26c2daaa563eaa1c72c129e26ee367b8f7b2a519c9ea7e31db84c79f824f9b04bf18f34bb77e9245df57d1efe2ae531eb3f74e0e13cbe688a30ff59ed7d700f93f366f7a73f1bc29fa738ceeab376df8848f7fc5b95fc2deb0b857f3f8bb4c88bb05995bc08a33ed9fe549af1f7d4323912b97606d6f949b2ad75f2e070ee544b33697f421bab948575741461048f583a72e898d101828e0eba4b32e81cc1d7cb475f299d31b7f98848778f2296514cb35822c1f7e90be1fcb23b876a319aed0f6e27ddad43771e108d133e3845f26fed0e858fadc813f684aef0b35d12be8f87316c52a3397b987fb6469ec572c63efc4ac7fbf943c7a4f8b31fe9256bb094c51efeb5197b77c6dc62c7eec92ab532ebf8b35de21e8e4c3d467d35c37326ce32832ef7b0cf9fe139cbf68722f96c97d4c43b89583b848f04c9aabd4c382ed810b4b2c10991e480841c50900313eda9527ef458957277daff18a996e2199e46c6cf3eb59b2b91eede418e1ee47822c712f87a3a16b75ad7be728e592bdb0ae6f001da23932ea932faf78dac5097a33b4856a908a3423356dda9aaf0707dd2563a6fcf0a72e8ee19bca0bb71ba7b04dd1da5bb9417f87af975f02b7c1bbe911d6162aab5d8fdeb8b9e676d8af78d80bcba52479a478ff0ab8c0aa5bcdf88e6f9835d95ce194f6d8a9f045f4f07bc983582473a2378a4e3031604880e1f03d009f23ce6fb781d42203c62417ae8f0c1baff1ac1a36a297ee18875388e747b2bacb4c857def2fbb8bc4f9642d81526094357c8e30a5f001ee86e01dc04804a7777901fdf4f1168c59def9be169e4f3d5f7799d2e4ff5630748c95a4e61eadfe7d36755566b53fc90f523cd4147138927ca2ac5fe342b8ad363762c477a34c798f5547dd153a5bc1c9c478fcf8b66feaecde02c22abb4fe8ce62b5cce86dcc3f4e8597fc94abf276b431f5867c6959622e93c7ab8acd2300c3f0ca7d78e2cf978ee78a18fabf645fea91eac539c3ba9987d2228fe88a0d8c81fdb19cdc7cf549cd5d24cc3707a9d7e6d0cd31a88274c55fba294d77e96e73886e2cf3cd7d28e329b7d7527163f743c67e444e29e3fcef627db9f1761b32a11c9b2878ef783ec4f5895d48eec0d8a892f647f5eafd7ab468aa11d5ff87a3a00a80000aa177e069fc47fa9fb9316c45ea95f9bc137f2e931ebb32cab2f0a0d816ff47a15cda7b55ae19318fc253b45f3993c58edcf7dd8f8e32b3ffecfd6e8b1154171624bda4bbedec85e929c98863648d11da4bb277063047cbd114f1a3863ac6abd7ed1cce25ca2530bc3597b7a642f894b3bd6aaadf3258ab4e873fd31834ff4377cb096b6d6f9aa1dd94b7637b79960daa5698ad084a6294296a629c2154d530424d4f044142df8aae1eb6e2cd2993f7cfdc7ba1a8e74db58adc147773f586d7de55a5a109c35d88416fcf0c696eec6b52f7a554b317efcfaa4be5f742ded158bd91b3aa896e6d7e70945e3ee9ed1dd0d251ae7faf7679576378eba2b8dddf8fa55134972763782669ee1cc3f7637821041c51bdeddafbfd175b59d0d2f1a3fcdb4e4d3d970a2b391447787af6c45dcd920a2bb6f7467e3e5ad901ad94bfacc33f45c92957a3877f0f5583a5807cf3b49911ce92bdb701689967c812f8a16ecee1bbaa3c18a760f7f86a7883dbfd46c8eba3bdf37aa1624c92f86699e18bf0d3d87a0cb2a7d983f59cb5eabd3f125dd5e708ebec37734471c5c88ab8ee688838e9394481f741d77f2e1eb6159a5b3fcba4fd2fc63dba0bb0fd09dcd4c77e3dbc3fbe1e960fdb5e02bacf376b71041749b82d8907457a336bede2cd33b7530695529d2da9f566b87d1fdf002fdabd51ac1a3f0430b56223da15025428e60935c5f084978278d5452249c3be1dc11e92c82f1836029d4ddb3ee686c81818189093f673abe07e13f1b82818189c9f58d887818094f934a5d56e9686fccc3774c3d08094f93fc7f63229d46d3f3d1d7e9f845586943b75874b9f77de1b5e05fbf6ff48ebfcf2735f2f0bd268ab3ac73acfd2cbb48732d9d9c636d66ecf865610973f7a3397af8e13f78f4201d67ad8558b437570b7a09e2ea72afbe1195f9f44a737dec0f734b276d3aa6fe97fa97373ba62e5a0bab328abd96e9b5f492ac998cce7c7a581f7f7d3c41afd443c7d477f86a3d4faf54f630c7e21cafad7e6dec07f7f0f899ba0e3d74d0e1c7fd3cffcadc56a7d92b73fc6389f1f467e2de07f4f95704f44d7f98675c8efeb796c9117f9e20f5fab3ec2b71964e1e3f48c34addd2b28f7bb9b49ef11433be34e62fab74b4e0c3c26bbd526755ab13facc3b83fc3ef930af89d57e9eb2bf32d9f4710f835e292ef3cc421ed617b24323d8249c3b471f561fa070ee643ad223f78d80badbeb8e26d5ed2b52a4b348973ae0a39b63c279347473acce8aeef616129e26ac20243c4d5c5629c60fda1bd4dd01e82e11b1d1bd85217c27be43f81997448ee70eb54c8eef0febee9b6e0e08fda3bb0ed5edc92a25497b43af89b9be48b17b5ea9fb1361bd55801f9f9f242e26dd3d761723020d030313e3e5174518189818950e0be7fa468f411bb22a9da38ea59e87411beae8b43099f32c35040ec2479b71c903030313d3c5f0d1dd1e4871a5371fbdd7298a13f487799de08bb03903f324310d739df44e23ff6a1d573a73b53ca23879bc8f66ebe77f6dec61feedf01c1c7ffe77922c717e98ebfcd1319d0db957044e98e3214c67d92bf5fcd8a7ff7ddafd59fe1913f78a402bc262d65d8e671015a751f5c92f846b7522b1766826a346ac1d0a3f2c45b0fad4c2f95774bd085625a10814fe8360891dd7264d9c2e8a94e6efb4af3e5d56e90c97a45b8c63d6efc3c6b28675fa2afcb09616e6987e7d99df277d622afacff26682f0f39d19fbd3bcce5976ff6b479f654a73b2f4b0be671c7582fe3497555acb4bfafd1c9bdb94eefeba43f13416b6982dcd8553778bddcdb03aac5f044e58a533708eaccf33631dfc4634d3915e327c5bc127f1eb28cb867c6468ba6b300f1f7f321aab96e7737f5c4ef061ee3fcb1eb39eef241d530f62912378f4e5974e5eb814cbb1046388d0dd367417b3822e86ec62e8f7b991bf6c5e9bb1e7faf796a06323ff3eaf74ce405605724ff59e23cf6474cce13390ce6829c7e2acf773a58eff4e11fcd07d025464a1890d3c015f4fa7d5c2d5525c3f1f7dabf51a3fe31aee6050d0edaddab57986758e1ece9dfb46f6f52035baffaf113c0aeb93b8c4a4bde158e2bfa16867f8ef2cd726f8e12b83f466fcf725ceb2d2d7d11c5fe4081ebd3ecf902c8f869850fcf50b003e295404fe8c474747871ee0f40102d1d9c163ea00d203f411f6e8e123888e07c2fa3c6fc6b012ebe05cda22f067a04ea6b2568ba4337ced2c97f395af25c912b37e9c37d66afd48732def4b17daaf8d5d191ddd563fa2034fc02f82b57ce5c7dd6def13e135987f488d68e8367b26c7cf797677f72904ddfdd3dd8bd88daf773f539d07a988ff5ad0003e4644718219dbf195e7ebd2d249019eace5972582e2d7cb26c63fbe8ee698eb5392827fef87f5f1b5456a775290c6be3eacbb89bc8ee678df88ca6e77f7f4081e75370ffeb0bb77321da9f8ea6e17fe8f75770f04c85f04d2dcdd43707e8c679ec9e8d35ef77534c7eee621a4afdafdd249770be91d5ab82aa996e2fb4b1e462f8861a51039d229f21cd1b03e49baf20bdd17c33a8dbc102e45f29642612d639fa45a9a4bf08f88d4ca1d59a5a1688d7c9e34d3ea23ab73061e11b9f65e2249c2fa20fe9e4a65f402ddf9228fac526c459ef033f920e8c25f3af924f54920f16b9d331edaff90e33592c1793f86ebbc438fab25f127a9dd2f7f083f5f4b7e3c7af80e41ca2068d08180090f6f87c783f5e204f10cfaa1030f234354292123d8640850abd56a8de0d1b5f71219c12641cad0e703f4033a3c90e401a41e42085fadb258e29a9831f51cbe077878a0460770d001b17b08215621ad962ca7cdab3b6d073c0e8c8103528034cfd1e672d69f0d71c0080e040d21c42a0821bc3a853850da00141b68d2dea7f255e8f319cd5919fac376f84471f27c1ba8a1812d3d84102b1768e0eba9811a98d802131d58e13963e24806ba30820c0865a03100457b5606b397ac6f54ef1b59992371af26c228c696f49f655cdafbb23a43552eadcd1ecebf9ef2d21bffd6445c5a8a69f58711c1c0033a0c34e99e4e9260e006064cdd3d84102b3c69ae0b30e10253f41042e472d22e90800bfc2cb1a58710c27b7c5673a47d1dadc59316ba96c8c1122358e248af42ea4108e189e2046d7d7dd1ccdfcce10ceb5c8286ce0255ba8710621584102e0b4cc002b8bb957467011b2a60c5104278487d1584105e2ead87d7fa2af44933f5556dd6c2f7e93330cf31f40a90dd8d597f2b6024d7c715e8308e8e0254bcf0f35ff21bea2870d4f4fb7c880241dddeb5310a787b147851428aee8e59af4d9adbbac293a6c4874b3ccb943aa63bba53c2bbbd5a9da35b3bd44d204b7b0f4e008a090c757f2c56c2c049628f592f02a7e8139373763fc83d95acd25cdaeb36749bbdf768caeddf9f0d75b74d7713587577507712c8c2535df2887a32ef53feb3a1214386a852438688e2e469b586e09a90e3e94342848c6093e7d1a3cc74a447866021477667889023bb93f1874c92a8411260123f10d802010f40c00210e8a183c04c777bd673fc68718e176b628827ad9623db9ac33115cb18c62eefc339da0a7afe59c6d452d8677fbc9a284e9aef24af7d911c6578fc6698ba579717fe4a9cfe009cee06eace01561c80030790ed3dad26e63bebbc2fab56745b9374f70fdd215d00a9eceea2ee9062904a0d80a201430de8babdc77306de9244c2d364c5fa6cc7bf2caf3691780dcc45985ecff3615e9b238df97cb54a96bef2907000123f90481dd1832352d0ddb0ee8e3822a50bdd0d7627c502527ca4d4d0dd4dba63800eba7ba83b06901d037c58c016cf6b936cb1bcffd824ebb33c1e3d62d65ddefa3e6779a91d4d6cf64fa5f2bc94af523c9a7cfe301745cac43d9c8fbef565fc6158a7c72c39413cbde2ff55f8b52cf17fccaf8d7de367fafa8f7d31fbe10f53ff2f12de49bb16fb0218d02d00c90286747792ee14b0457bf8fb90f034f99ce5618a84a789c7ec4c56da3bcb3e41904e51b4f98888028c1490f266209dd197d579a7ecafe3d26b36fbf422ec8aa282281880324577b3ba8b42bb7b4977516674b717565f21e169d2fa3e6779d9da2448bcf57dcef25433cf592a36b1d0105590d25741ca949087d5e6984bfb23cda2b5b017a637cf232da3c596d147b48cae62092da3655a46f368197d04080d1c8eb36d465459552107dd1591d4b53a63311afa0cff6beddaf1c769450be2d26b30ff6beb9643f796a366cc79868f29f84cba3755f796da0240831e9e5069b22cb25644d26d84d63d4935bedeebe9cd09e0e2e9cde3fc9bb13fbdb97bc3b109600b80c9012624d3024c504c46984a5997001b9dee36d25d00223480aff779caa8d1acaa1411473c979688547713f152fba29664b3afbc35da1bab51d1ddb45a086a11f0969dd17c85af97c919ce570d3cc2e2884a9e33daab4ef088088d0a2f0f874fcbdddec2a288319e22cffda07b89140111194a52cb4646f47ef8c25314e70bcfd70ccc1306623aea80988e47dd953d5867067eae657a27a9e3795e7f3c5f247d87f0efcb64f4e637a2b87eec439f65aa2b53ddde42fd404a151828d0a091c680d4dd4d33c593190c0f2b8200b1c1f2c50d9e69e3ebe197acd2abf3a5930f5fe01b75a99666bb9400878b8e0b134f56eda5f98f56c83d0c2bf10cacf3eeb82841c91204adc75ee1e3d2064e86890baad40b539cee0da77bf32e5e8072693f53b7d857199706e8de00d0bdd9b0dd746f35740145778574f787b6fea5fd0f086ea562a5feb0eaa1ad2e83cec9146f5e1bfb5aadf02b0de843fbf309e16a29acf0d9d2dd220c46eb86640322a75af02fe9a19de51fbd06db3250e204d0bd5de9ee21ba236b3a0b58580290eecec21ed13a03db8d2e6458509510131f3b0f423ca4a3b7f014613397634d0dcad6deaed6cc8c58c629ba7b06e6397ac651371bdd1b0ddd9b4df756a37b9ba17ba3d1bdd56c32ba379aeeadebde62746f32746f30bab799ee4d6683e9de50dddb4bf7e6d2bd9d36ae7b2b756f5b7fd1dd63e86e3174b717dd1d86ee0643777fc10bdddd85ee3675218641c4d2dfe734039df844f8b8d54a42ca37f30c5faffcf8eb360280ee8aa8b4f7b794556a79788a96e8199edd423a9c3f73b207d01535be1eae4af21caf2d42fba389c4c39e692d3dd52a958ad91cdc8738419fd73af6faa41dfac1e2b43f31a05c02e1a7d7669ffb950694ed4fa596fc910ed1ec91a38924fc6bf38495988a349742374ff2935425a150c6f648c6654ff8341b5622310fc46ebe073e4713493d72349178d5d2f0bd267ab63fee79e47f38165d4bcb5f75783a3c1e462f14fe387fdc0bebea71f853087bb5ee628bc810d08f7b35b15afc7d3e1d3f2e71edce0f2996552b4eff3ec72b1c8bd90fe7cdf8470be672c7bdef2bed018a701f3244c8ccb3c75737c8574384b45a31f185848c7426444e24ce83ffb559c8dd13e0ad96fb8b941c2d68ebf77d44fc06f7aacd5824c779f4feb35c624c1d675a4b1767b619d7320d69e984e6fa14a4b15889abcf1b51d145fefbf06219fe0c14922d2132bf071781f6c8ccb3e7d60f7d669e3dafee758517145e56ac56defafc17ac36dd9dbaa1c6eceee5a36b5ff4122768c56e09b40310f084ce6b048f5aad6ac7d182affbf4de0943400d773cc493ee577e6c44c5f922ff8b445146f18ed70bcf17d8322104d0e5080b9fde8c613a412c0173da6862ecf4c065e90ea95d725f14278f4552cb54a45949cf0836e119c126414744e62d5df3962e215710b6b1ea2384a5bbaf1ca1bbb1e8ee2b806084eeb652842add4d842174d72ebe59a746ba78c407ebe4a9f6a7565d07b0e9c6c100ddbd1d40064679b05a808205aad0dddb1411982068c60cac00d2dd1b012a100490120ef04015ddbd41c00a0050dd9310147477e90811024401023820e085eee6684ca00a1632c0441556badb650317d8b25dd11a430fddbd69d105059e7891012800e96e1307be170dcc8040d484eedeae80f1d881101170b2846e5c7b1f8460cc3c4377eed42449b6e2fcdb0d44c7640adabc3c76783a5895662f6c86e78c8912d967781a316d32587413e1a43d904577c7ba5bd28489a93dd0edcf922aa1053dd7f7960ddddd80ee66d2dd4f04c00f2df812024c07a1bb4d40e816c5f24714278f0e0d8c18c8d8ce7aa340b5747be243774349b4cb16c057b58cb991fda985f367d3adcccbde6eccda4bba7b6d8a7fb726422ee8849ad03d679e3d9d900fdd5de9944dc745778e33b03ecc6b79bdb435df61c887f8d11c439f57922a49729004a9bb55a9e9d8c8552977cf3fcf9166fc6e731257921949ba083f04e9c6e2a4b97ee9e4b1d77f5a7e980f092dbd1f349623ad1489900b564a84ee7e7517a44477ebe82e280b0d561b0e91e3cc38ba0bfafa06f50479bbafbcf5aa95b0560b2be92eada0bb11d01d900ea02b0065d101c90048054014f0167e2a8a936645f163bef216be31f7d2d62f9b24397fd6fad102e3eb7d68ab0ecf070f4f070b16b29ede8caf87040ced79d6bee8958fbeb65a488a80448af696e7e9aa55ed8b52cd6da0bbbf3b2441bafb024b74ab523c96ec58a263c9081ed119f45fa45aea614cd20c4e72a4fe5424c7f934cf25cc57df57ad87e458c2bc965fe62b2be4de47d26cb1381d3f154972fa7dfa335cfad3fcc14a71b63ffe7d9fefa0cac177f01c9e83ffc75e34e53c3849f32bbfb8838aa439058a137cf1e09e5fbcb688ebe8f85f5b6574957179bfef73cf7f96a9d760be529134bbad290f9f088a5935f14e918eb5bcac5ced8d7d3f9fcfece31e2e417182532c657feb574bd22cced9cc30eb36fbf71f7b7d46dfe797626b73489a2f35caf1cf25395af01327d097a9588efe1f7397fb00c0c6aacf0fed69ff63848702d0a0004bb4633164a85b9c3853b1c47f49ebe41c5f31cf88d6c4cf93863f8ef4fb1cd7e93f5ad0e622ee65f0efb520ce437c471349ab158457fca23fec431afea519cf23eeb9ab7c55cbb496e368c154f84734e62b8a695fc4da2125d9fee0d0274f0a5a8c5df627fc24d9fe74d1dd39baeb9942ed7d087b42b0ce12631f71663b8479f45012b3f606656c8dfc486fd0cb6650b6a25058ed0e4f488ed7c8b5e18bb089690fed7fc46969123c8fccf034125a1ea10f2d4f7ea190f6e09e0fe9c5e11351bb6f64414c7b669e3de17c23f783f0bf582629ba73bc9f271372bc46669e3dd5d22598878ae47f917cf43faefb8fe72ca8d26c4ff84a92643c8ff02809690fcdfe7c9e59485669aed3e8c54fd283c3f9464027489c8c3d19cf23a1cf0836f9d814aa7f048ba28b8950aea5e5897d9217497a87e695914abafbd45d0f2ae86e55773d207183e7e98ec7c778ce9b8f88fc2df3ac322a84ff86a1ab24127e55f2b2f78978555bc7be9302fa9ce591a5e792f46b551f0f17e2a90f7bd73a0064d000a06de8820d36a0b1e1c8866b430ddd1d035ae5c039f0d10c0a4a017939fc46a6862b6af0410db8061d35bcdcc0e2c6076ec4686ef8d0d8f0c2091b1cb0c143c316342c4143830f5fa0b1f981cd91cd0d3435aa34eec1527d3b82be948b7446abd5c9232805f4b9efc4807a38ebf395b752cec3593c825e3647fa97dc11f47d8c95aad4773e1e419e83eff01c7ce7969f0fe7810757a586f0e8510a69b562f6f585f36fabf5b239a991f3b8f7790e5e98c37fac264eb0c4d5d20b9bb1796dfd988f17d639c3b4d298db5c83d5c831c3173433d080668618ccf03433cca0a165c9e71ffdd8f497dd390361a5907bd562ea93e6d1a0c18486860f355da0a909024d8d12ddbdd3e3397c2eab34e8fb907c1ee439f837630032b2d0c888a2bb659a46860864fc74f7a96964f8d0c8b8c10a342da001010d0d066868461a9bae0add1234dd0368ba9d18588881849aa689b1039a18962606101a19a44023030fbe5aa77d0d45bb6306cef76b634648f01784f3a70a72577da63705f4f9ea5321d9e971d61744fbeadf8f2a7c168b8559a168fd43f2e3397810921b6ef0c05ac3f9656219fb3bc1af565dde101ffe82f09fe55c5a07a9cc8ab259e768c4fafc67437e834771fe7aae12b27c856288fd7fa4e183b4faef78a57dfd9ce591748603d7660debe3af4d1994a0984686264d9d46061ddd5e28838d4703438b07c38aa698d2c060a2bb457068884dd3c00062c88f1649ab3544b37506023309a099b98146e68a0868642a4023b343230323860a9a981178de971fbf66feaaf6f32f9ab9d5fa3c6653be63547daa1db02fbf5005fa52eef37d5f0de673cef09c91d5d23ca783b44ed27dee93e11759a34a6595ca2a8d09a289f15206a3a56960a4e876d1c090210d8ce3681a9496f6b0eaaf1d535eab13c54437100d2a287fcd572e1a54d79ef86077fbd0342f54744fdafdb0962e9a97284dfb18cd4b93f6ae751e2fa86e98671c7507a771a16287d246c154a443342e41de8cc6c506e6299d4c1268c810212607d0987a684c291ad30b0d4785ee66d2345c0568b849c3cd74125f793256b5bea2292580a6a4034de98566eb01cd7644b3e1f0d5fe783c40a4803c9282ace93e5f2ce10b157c1181ee0b295f00f9c2c462a9c4f00031b8bcf8c215bc188217485ee8e0850d2f640843953070200c621870008311c020050c3f80810730b87c61055f08e20b34b60c610b145b685b6ef08210bcc0022fc0bc00c30bdd85157421d68556175e74f1042ec52067a9bebf36e3cf6334e57835441042eead9d1e67798e1c9ce68f51d171a675357ec62d96c7f23eef6801e9f838cb5309c9ac9802fa523e03ef7cecb53b2b157a917504041029a02f6605e0e2acc11cf4fc139a650bf3d50ae3495ecbaa5689b3bc4f258a93c77370203c07175a8914d36a81dcfb767c5e135f9c46b474e2cdbbfabec7655853fefd6885bedcfab29dd15c9572dc12c5077ddcc31f2e45d257f4f396f7bdbe1dcef2cf6336463d633a7d8890fa339a10f097cc6b6dfebfb1d1de98107e71c1052e9a206b19bf382b2de271d1c4662e7070010bb6a2e7d2ae7209e30213cd85a3e742eab790e4a9301dfddad816a6747bdd16a2587bb7d083a70a539326b4854e2787eeb480c5b53065470bb3c62e33722d04e9a6332d5ba61629b440c0bab539a47dfd529c46add6d0ff8dbd685fb380832ce42cec6c81050d6081070b37ae60852b28e10a0fb8428f2d94b0c5115bf4f40dee5ec697621cf77139ffbaeacb9b53fe4694fc2f72b7d96bf78dde558fc5194be13973519caff9a2b52cec79607e5fbd6cdeafd55983917fc9d5cffbb095eafb927e5efffe17d5895f2fc2a67bf5b7e8aca0457b4340404978bc07614aacb084155c560052052ddacb25cc595ef8344661e02d2d3e7a3183f38808158e40051750c1082ae0c852258b07b20865e92960610a495358620a760a35a460450a2590024c0a3851d8a2db1b777adc56b7b8522067b9e3e9b549f3ef0b6b29ce8ccb9e24df8bf6f5556dab45fb9f0ae4d86667b97bdfab4ef0f539cbbd95c42bfda8c6ecf47196f7427e9fb42b718234d35bcaeeec719677ed0ac7fdbc28241105044401480b2fbc1bc431cf3ccf5b23cd0118c0008a3cdb3a87f8be207e9c425a44408b1f2d60a040032818412189b5f7734c555fcaffae9e66c56b9de6e3d54452f57d292f31a6dee7619dffb7c837bd24b85a3cff82988eff37569f087b63afff58486ba238c3214f20bdfc582cef136c54f8b14e0a0b39c18abed40964f8f9c50ff187ee851f3ac126294bbb92a4486ad29d645304d2a2266069c294226ef390ee9af035a107af09364cc072951c49a2e4081398604290f7e1a389e4638277b635c912b27c18c9d144f2fd2cc18af696d04477376d094dba9b2e41c7126e1653b288d2dd338ba06e2f0bf169cc6b5324310d9550a53d8ca9387ef6518212ddedd9ac84991252fd4a8091042ada0b1fe6d78a4f1bffc3247cf4e6af799893a0a35b86842dddedc9c292c8436b656e6b2d631c48a0d29e2ae5a1572468c0e637a20d19e2e3ab212131a0f1b38f10f0978494e7c5f20ea989e21c224e6cc921437c84601131161ddd5eb51e7eb64657a2f0832b2ab842b637946dbdefe1f04e0babf68a91ee6e91c8159bf17dfcef39c2963e8214dd4710bb08a43e1cc13b820b1653747b5eccaea8af7cf5d54471be3e7f6279736961d37f0916140beff6feed57af268a2e4be4f6475be968abeb8a2c5c31c5cb8ff1d74c9978d888e6150cd39e2b1a70858ef6fed25ca963ec5466842c2ef762e2e38795424658c2abcdaf85a1cb083eac70e1857f2979f44ebf0773fdf1f54654f63d58430febfc4bf35f5f4dc72e2b505869d2edd1ac28fa0c3facef78ceacafa65bb9a15b2caff7f8f0b85091201fa77d15af92227cd143f091ddc113fc2545004011ba0a145586aa7044b88208503a2218f13e58895fe1cf6fc563470e0f0ae7675ce9a762d5d04b5bcb60696be1b36a89ebc77cbc4eefaf37d6aa0dcbc7a4873f84150c61034358c010123004030cc1c653a5f07cf9b45a439e03136779aa9d1eff0ae42c0f87f36ff8cef2543b5240cef25ed9da242f7fd80b6114828d1d04a116041c3e1eff592e63f7692e8a1fce71f585ef3303f3dcf97e96ebf4951d720f8f25782958a97740800284cfcb6479338e6a7155e2fd40053f28e20702f001161f28c007a00f6e5891d41e8f8a2705f41511c5c9f378eeb45a93acc170ca3df04e4c633e9eca739d19d3947fad5ca7675b453a45d15ed1ce68a3cdd38a29f6c78a285f14be1541dde3e3e18f876b5fe423758cc3888aef430fb2f84ab33de0a107347890041e4cc103920742ba1d74b1832a7ae5318bf3bbbc0fd7bee85f680734e8400b3a78810e22a0031d74d0e5a08a1c7c0e3a1c24e12005dd5fed7df8bc1552af7d510b7fa69709acc759dfeac3b5f7211ffdcfe7ab2f0614fad0a1cf5b389c9f04d6e32c4f95c2217dd5bea8d5c2b5f7a1d51ac2617df243cfd8824fd6543b789ce5a9667866ec54258af6ce94acd2e918478f8f1b3dec33f8b1d8ab70aaf645b52ace213ba365b17c3d0e52dddd0db2dc8005dd0d8ebabd59a6b4af37e8a1bd9a98c11bf8a4b9a85479d98bd4885ef2f31427889f878a1262aed6e69528529951493595eeae36c0523bf2309c8e147eb6410f8ce3c95a9ee468c14a5d3f7694435aada1199e464471f20c191212033a726477447182add6500d64d0a00a1a34d1edd55be6dae7fa63155734ae22a79b411466d08119f4ccc0a6bbbd3c65ef35d5f7a5f0a5d5ba2a4c4dafc190783218c014627081181489814b0ba8f8a8f8018324181801060a80c15077e339cbdfd02b1ffde72c8ffccf594378925e13efe7acf9304a9b247e010a5e007b4190f6fe5d507301ce145e98c20a5330d1ddb83c3a7a219cc2def7cd4f14670bb4d082285a208487abfdee5b16408005cf022444ba6301aa5bc10e562083153859410e5250410a12482184142715e8a0bd5690b3bc96cb592def739617b31e13ab1d59ad20ef13e7df8be7ce37473a3f92cea6bbfd5be632c69a612ac2caa0144c210529e8528094021f29d089228b2882104519054e141c1452402104142e284a2898a27b87cb2a45e22da01ea0212fe613dfcf3fce3bc9d538f10ad3af8867ef13e1a1a5f7491d75d2322e89bebf384a5bab4adc537ddf8f13af8e3e2c6514364e4cc3cf591e8c1ebd18b3d9ff8d48717a6f6459def77d1eb3993aa63458aef3ce5236c37f633ebdd2262984829c1304e104b413f49ca046777baaa0d46332470e2f632b622c8aae1c39dc7b11462b0dfd67f9ab0d3d466976e6abeff31accadf77a615a9588f3ef0c4f23a238c1d90c4f23add6d00ccfd9db58f5c1a1cfd0ac4d60849c7f5d2648b53e13d427c939f30a34054bf7a4b9a64ce9ee764d0992dd92747b9f08561dea9ee0c2135474b7b7e4bb9647142748896470de7cf4459e803d81c3389fe81248e1e50b7e083ed99520fcd18278ce420ad2526848ed8b86d4de0721e02f11450abb1f547b1f7cfc283fb42009923ad3f14990c4892f9cd88213217042891342bcda7d23d5d76a59fa2271ca3f95500ae8f396cdaffcf85527f879ece813fa843c071f81134690c4081630823b821f46e089208b7ba258c6fee6b0beb7c3599e2ae59fe9a5ed70967f3c1fcd3f158ff77d68c12ff621ed3b1150e96e4f044988408a088810c1d74384f80d9f6a470ae873d610217e835774e7f8f78b261211d8747be4fc99631c5e73c19ec90b85c08a982b044d74b76cbe5008749a7042131ee8f66e09827fef87b5745cfb2258894bb7395b9ba426fef567e23972e4c8e11dd1d85fd2070c52d266228fe72ce8f19c9118df1f4b5c2d88efcc339c9748ab35f4ca2569ed7d0d191202fe9221414a21e02f098f3eac43e8e03144a389a8e4efaad7a99e059d424423a2010200431100203020168c478462d9704a89caee1480037ac85c904c9b49b330c729440c41c4100000000010000084410001d4430040b59b41698cd39138229bd43c3125ab1b7187a0399ae379821afb001729652652c303328dabc4df413e69ecb0b89e51127fae4883f5fb04ec9952bd58b11dfde5609c2ecfa7c0162ee9312791709cee7e4ad0e101ce8d81e8474108e19169e85ebd5ac9972f6ae5d8392aee7c27730bc707ee12ad0c876ff670428c7f13f25a64e6b1bffb2ff8ebfca1d9c75c26e23e643e6dfca3cae320781fab8735f630b4bf75fe61907b2c74900fbee792bdc54b827b4c7c82adf64a82f1a595abe05d9be3829c2d4f18269c20ee4974ecd0bddb5a56188a5b194d46896994c9e4f041e98baa91c6b01500afba8b323007336cc45214391eac7808591385b5a906526455ae465445279e2a298dcb020b37dbda388f10d6201b23eed9089ea264c0c422530bc8663a31ef01381b614a9d344bcb8b9568dddf3088fc6779bacd8f1f7bee529ccb2d2ea676ea1da348621d2112ee9dd1dfcbc11c58aa6f6fd00f2f502eff5bd07db3102a04c9c46ae5c765a03b7024630e9c712c4be8fe2dd01a86f4bda6a98bb439d42c3b4b8167e3870955a26153f01c84ea8e0676c8614ab438d2a65f7e7dd4cc4381b07dca81cc6725f13654e688d05049414c9b1e08c8e2779c2cb765d82029b1e2e1a6dc8119886a39c21bc819302c9e588c856db05f91b5aa08925b5393d52423c3ddd3b6a8f903632ca34ac30a655ce7b07e32bbfe84b43943bd11032128014947fdd2f11f7658845ef1fbdd2b427e7cd26c5ad6023255e2d65b37db9fec93e08c4c3ec9554f153952802f0eb316c3132030047880e8f66e39829cd893b4f43f175d2f5934fb03c078332bcf8137fe53e90286252545af6142610ce025d6e9959bdac97e77bab650124b6d51443e55e2ec608371faaeb44ce4741ead369fdbe1656e8e865f35f7af61ff189ad963ae02d4bd99bc5bc6c970f0fb4f22cbc13641cee172597afa3f15b3ca545c667ec432ed2e904ec43493b4b0b010ade5b87ba35e869a5bce7ad27a215c67feab1269d37bd59d4355c8ae2913095d95f89984c77d66cf209fdaaeb92fd966a073540477c1f0996cde4b6703e180cec319d9f834c73fcdd1d0347ea2e709c03f37a8de3af2f82922696117e9b2a9f78697c568c41d05d9c5ac9fe431df029f667d0736e7396edd91bbfd15d60def24406a2f5f136ce4a9b4c2e875ad912b949f4501d428caf180251ceccd1f8d4111543598b451d4564d7d21c7fc64cd4af6c834aac34ee021862f1fcb40a4cca07cefcbdd13a29740df9cebddf185a1a2726cded036952996199763ac01f53a40dd436c728c733709701d99d3a300646058c5ba28bae1d39857d668e775ed2ac3638a61aa1969b28d35731ad6c20502c775ecea9efd4506a70e84aafe64e493b8d17b4c41aeb49377538b615a1476c11edfa329ea5e94991294eefd8770e80b35845f357f87f0589798aa0e63eb84b4ea9203f65591d66ce78d9c9eebae08ff157e9c8ae9e44aaac45f814542385b3eccef02de7c2fc975ca4cf95520b89fd5fa7df3e206519ad821730d00c319cbc0c65086e1554de67a02c4f462e99c968e6cf8cdc683c013ca0498489fccd7b8d6593661638598adf0f2fa729b812c05b34d7589cf4f3bce3898010e08e659e4874a7bf61ee7bda68727c952abfd072e40221c9ce8bf0e749724de524cb08f96fddb6b4e1a9686bc43322da7bcf1591e605f9090de95734edfc9b30816249561d2d11580dfb9d2a3936b2701206fc146d9b60a0f9585031e3f1c1dcff6daa6ef08c199ad26f4e30fb99652f929a076da07ce47b0d000fef0e50f00b20b0986135e25239a5407921f1cafb08921ae9a0cf282889544163877bdb98e668211ea9b8833a827abd1211590b49036b0fcfc5f4caffc13a9faa0e70310b24a036ae97f900ffb5b9d05f178936e67267174125260af13ad0da4d6c70baca51dd0b988268c32f936cc33a488ac9473d5c73a7318adc5be55f58cefadc996bf9c03e72f7ea9f27a209e48cc9d5a97af7426e6482da73acb5c4da8cbd91e4f8ce700686e13c119b73bab30b4c84e3ef79a3d883c501957a56bd0ded52c08bc9cf4b0a7819bce8d75d5c3c5def229560d0c09bcf99188fe0619e63975b67032ffa3fe03c2f267dde6488b33e5f4dfa65474a78165dcd877788c9c30d6d9c27eac92e38838bc48d5560d66dfbe948e1ee313a543cfaa9af3eef17f313f0d36910051713a80e52ad2eadead110a3929da5deedad8214d20a4a49ae9bede14cc43d6360241b44585eb146d64dd47e3b9497612849a5f51122002783dcea407a6bbb9d155587a1639f7515061aa8d12a1888d3228f54507c011dffc6e1823ad15d5b7409ce7d36f6e822464d09bfbfbb7cf925caa68fbb27ec4ecdbec2ed63150d07239527babe0367c36026396fd49f1919204f78802ca55733fb043a4bc76a9b401bdaa660c8457a50876f6357acf3968ffac192ff0fd725490363fb70d5589a6c5681df2ae8bef667f3c7c45f64c0ae08f404e504c3b6028bd4a9a7de4fb0a0b7e52a1af52261f4cab4f66ca740576da9a5d4995fa958e973eed1af75a3a03daf9ee98d8f452eced374c0756a10eaca34d77615037d7b569c97ff820d3201d895ee1a588e49f1d342c3ea83cfdafc1a8422856471433a5c88e8e4bb53125128b99240818ab1330c111869805c67b701cf41bd8ece0a59b134e3749f2b2d06708dfd72e4cf5d9971b9171b77d6e36c3ad2ee2ea127a111fbee1ab7ff751fa3be05f91bd43a0c9aaee47edd80174ca7efa44e192f8eb4327a05d4891437333a4b8e937e73c223b8b97ddacd20049a289a3ccc8f1291698ee6ae89e23267451b8f112836d42b962ea9c31f90e7d1690ee609cc5f8bc90ef2811b8c70cbc3913fd92e24f78d43718950b8550181ea53a5f79a4e81af012a2a2a9a55e3781cd5ff79f118f8ca435ca3d644b27ac5d9d07a68749e2cd84df9d78e6940b622e98bd92269f53a84b8bd91dbf19f3d3db55b18303edfff8d241b14b8bd2631571ba60668066769684f3aa598ef43925f7966498acb0923c1ae60fd3f08b197231421b9373e0a60ec5e5d3d155d32b601655b8e585ef319af6c7d5816c78c043eb88a156051881842574a1121072263163421fff9ca25d221b8ee5baab2468cb04cd688a0bc989e707429ab4232dbfea5614b6fe348e696d79a9d33684f31496891233ad336bd515954c6ad0fbe8355e1262cdd438b8ab79013c642ff1a6c68d617cd6a3453e9b6f1d86d8c24f692adea1eb4deff5dc516a8c9159e81d8ab35f99936b898383a4a18fe9f17fe631caaf9247e77fbdc20be8f81519215fcc82fb97a567d5db9734fd93ae4e3314f4a86b2a77ea32bf5ebdc59a10780ff88ec7dbf126545aa981272106a335769489af2f1f20c2e654dbfaabd60a95cde7b2dcf1c62894b8d16f11716048c9b7832393d54f34e6dbf0952c3e402e6e8b32469fb134221ceb1a2f8ae4749e3a3bce35aaa713369319a7b1beaf36bf975c2c9c85d01999be8d6e9b217f49ac1da655896bbb95f7724770875db02cf144f6f62aa73fa3e5904522de89bf9cbcb8aaadd5cd8d00c1d4ee89ab4d296001e340941a290a77de10d97c41fe90ab1127eac089b6be1a7da138715768d0ce3127212c194086801cb8b28ab3750f62dcf71c9b58b80d6bf13c048d0d8cafaf796332875e8c13bbf406027674e7b4dc17e855749b426aed7622b21158d91b211f11904c5661bb9b21c6dd8d96755900ebb09bd7da6a8d6b41dfbeff9b174117f06cd22594623641540cd86a5f8b635121ea1d8f279b26bb62da52dafa01bc8267e85bb592985269dd12b5324bbb81621008b2904faab1cac18b947511ca9272758ca414737f66fe0f6f67c9afd2e436ffa0d7349bb7ee07f242a0a0a5345cbeecc43d61dc03d1d63340fa0e7591b3da4b23408d7f8068e840b21a08be617ce04adbcb57334a4c90b33a3c8ef4c38f37bae2b309afe12f4c5df8b50388cdefeb33c62897c149c48b735fa80ecfd0074b9e54f1fc67dcd6c49f7a3a22c2c59e1915256ff04d7b79b64857d61a4b8493845b3a8ab905320f4a4f20377e1c6beb27198977d0112ef391ed7d540f748260696e2dcdc6efaf952874ef71c620bad516a43a0bc57173512b09caf1f79a62957cff04d7d9b14d3fce64a51e35aa9b549e1bc4955bc420108d40b7189b43f3ea2f6b4f3dd34e4ed681887216d6e48d51466f460dac63fa82588890b386941c6d846e9d7ae642b6d353a52d104a5190b09120ff43e8eab3125460f1c50247471a269c629679ca6865ddfc50c06ae1ae8c79dd3657986262ded226f9813b6868c46056c1edba61fb71f5585021c59cbd219fac94f9a520b707e165a99607cf493fa3e8d15f4be03b97fea6c3c372cec686f4d1c76cef25ce52d99be7bd07a0174f8817e200091ff33e3fd09e675a52e1727b52f64c04f21a1b4019505f8f12bf85a8ccc8aa407e13764b6f63c14ec5c48872ba456cab454660705da1d29f07273a56b4d384e0eee0e98b189d25776440e961319c21c743341f7dc21c697d074f0dc9b0b3b18125718e34b49509538789eb09c284e5322bdcbc64d181be8a09d7314d82366cd85ce12a1abd687b7e83f801588b76d0207c92d23f1d128460ba8cf83b107bad61fbfd966f50de177ee290b21741d2349bf7137577e2be89261b6709014509ce72bdd85778159cb83fc2f3909df811fa57d19ebc565bc3d7387b605c53394cddc1cffae7649279b1f4c2c158ba7df20262815f8a76f061d8db64fab80d147eb2c20b7a658c9f606d1b362821bb2cdb027fa9552cde24ca085640ef475469d841ee1463674be609c58baa64d673d9d951878b7282389b67792007c38e55eca9cd9a379b9fcbf2c8e321c1ac6566b38c0f5b99c7f087e1e771800deb27e41c4ef6706470b4c7af0cb98dbbec7c8993f5a6ea04277b37c23be6656adb134303a952ae59a9b062ae31a7cdc365c8f0dc949805c20a31028f6730aece9c32ea533d7f26a44d448288e70b790d99d506c4cb03dda40f27442f740e56376f87562c51e716c2591e0f8013f1fa82887a8c4b60e78501f7802fc2d5b4040c079fb008d91aa8b775fc6e8879829ce9e6623c745607ddd36dfa27a0938b3e9c49a92d1989b07c11850a7f0ad67a432c4701f3696d6c5a502806d53d836443ada7246744fcb0354441c392bc26214341b925257b11116978650c653de232d0c4b7f4839934cebac619b4641ed205415eb51438c40d36f54e8a8bb166b5fb73820c49dcbb7e063b43e4e5d5119eb8e8492a92773728c12937e45cd9e1e2871f4989d9996dd3daeae41ec1d3001a2f50c1f4caa8d65f59e1653a0482eec5a3779e9c1f05f9efc5e7db0b7ce216a076333bb663c3668337387a0139cf4d3444c40bf445647d3b2ee0d236bcc289b8d0365822adc69a08f39f5adc97661e24c2516fbeadb0df1cbd84951787393e7ecdacdfe941540fbe8c0c4255c4a1fc041703980801eb2260e2fecd1159740a4a340e52da78e0d0b5b7204806404dfddba3140aaee55128c67d15f7b9d359004a46c15f5a9024b3c5741860057e1db93050666561419f21db971e3a6458757b0720db74d083b6fc3f677cd943e5ec2ea050e203f2241d0b8651df299e5d1d0a25fc938935ab5bef62e80ebd50d080bb9963ac46c5f086d360d193913293601d18f8e2a4c3e1dd32355c92111df445212f937aa94a821f108a7f624f730400ad3d4838d96153c518caffe7b92d0f64133765e6f04cebd97a64b80ffd015b656a7a3e7aeb2483bf8bc7dd4f5f8986ae52c20c999dc9edd573c9cfb516865907f6f5fc0c4176cc1a159e523ae9d67e771899bd5071f68bb97197c20a35d35491cf1bd460a1a63e0dfbab414086dcb8434b36a94c36ba403588cf026179609cf38d68cfef94742a34caf07fe0da6c1bec9af700b26ea1db810baf7ff8a2f0fb26073ee41c6a6657e4ddb0b766204c4c65fbee3a329f4d885d9e170116cce4e441ede7a02a6345d46c6580135739b4fd9ecfb2fd5f861787cfdccc5fe1334bfdc36210588a8e655e14fcc6c8df2d89c88b162e22297b43cde44e2dd6c07170357733a3814e08c55032a592a85fde5e9b16535444dad3c73ada77dade134fc90b8ae3dafd722807c8011ef4a94b3e8584c00dc36174d234c57381be86cd7cb79e816d3997170a2524fde460a8ab814bc8d41287a2d178b35434448c8e4cfd9291fcf83e58fc56d86d4ce30882833320ebc003c5cc6230f4b8847ab175311f43832537ad181734181c08dff18f6eb0fd689bcf074817883f64b3cba0c01379a673268837749a7c05bc3b8a1696b67561ced492c7cc8d3a6605434a47477581927c8d49b07bd0ad50a3104b2bff4687688db972dc6737d372d2c9c983ff27e4d80b92ab8cdf30170eb298d2756b30f79ccc0049d9e71632b1b32be022d0a08f4948be36673d9f7d88f2ab23b89b345ae959906fff400eded03875f39faab7127233dd8717b3a705a8ec6208aca66837a703939f26b72331482b7e1191ba8db3cc32be857b5db7d1216942b348975288f619214b30dbf62e84bc5ca520c45c145b44201b1d7c420306281f9c7017093c09c8515f6906c0cc776ac2d64d8f92e010937f779e6c9853415c087383553bbe8ab8ac29ef3daa83e0ee986e14b070d035b996725a564429f630acdbd4ef87a1db09b71fb4414a21ce76123f647ccea1598407d21bc5fe38d3b16277bca8c5d89dc9bfec63d57d02d851666a223907c84135b23685949340fc4b3e5af27492884a20b24536fca8eef0e41744fa9ee87d16972729d6e53241988e10ff09ee01acb9dbbe91fed3463e8fd5bec61e50513d2260b543c23653e0cdfc576f3f5bdda7cebe6d734e14b173860fe334ed7e3938d0793216ec646029accc668c67a89c8167f7b30e69cbd1b668c775c49251e087461cf229e0f9afb65d38460aebc5fc4cf75a0d149117bf61a4c9c1dd4e4a45700aa1d3d74ec9be996350f988a372d3d7e2cc5a71247b46d6e20f9e59f8d0cb9c2e745698d356c5d5813fef4f499d6af61b03032ec65f5b479553d1a267f08763795726c71139d0943f0a7feeeba3194d1218dbde799f4531c629c50d90efd4849a616f131c0a4e3e3b4aad86e143742a989bd8aa19858d2814e0356047967de595fafa6877332b66695feec06932d05a2240296b693c8a3eabae29519214261146ac3a427b38230922b129de48ee646ca4c601c9285f69737fb56c09dcd221f835210dbfee0395e90e55e2816a152024073a2df0199da0b7720c738bdcdd6c536f9406fe007f85960e10f5aa63779b5cfe45be0291e7a3cd7299bf2628bbd0538aea5252018569d41fa58e3b563297e37198a1c1211a5931383a01e090d9391b41576568353379cce2eea6a959bcd31a6d0fd8f51cfc5bcdd919636c966cb821f4f523c706eac5dbaa90f349e3409c5bf18b4d93e31833953b78c1979da46a784c792754423df2eea1edae268f27a8dc4622f5ab17bfe13d9dacf5128df7f41d4e698f41fd0d8d5236e6ad29b161124f821bf2dd75961762618b786c2eaf896afdf3f4fcf3189199d73f2dd274582bceb3be997ab8f12998ed9d9ee5b498f62654a69ec2ae05ac4c02750049ab699da51cfb00687ef245d2d92b029ae6dfe719371371f9dcb8be203d9df49a08cdd2486e54c650c74b7018a1c63e0e7c068277178e256460c3865747d6ab61c9385200e7c95aebb87bc9f7904ae198d10978ee4966697ffa54bc023320d492780e02e5139cb7f2ca9dba02f4599b11b89b4c583c27c830ea745ce7ffb4a23acf35efa5b03dc42d59ceaea691f3d9cea38e196f68bf50bf76169f313eef6f294eb7c8139eed09ff597774a496117110f7a7a52d42f871dffa2f3bf76957c9436e4331058e97f065137bc371a901bdeba5a0b5d4b0d84a3ac70c36e893531b5a4621851e3d2933dce9eb234854ccfee7c2ee6cb77abb88bb155a6ffebd5ef426dced57e8b34ba3ad7832e717862152a0fcb0aeba8823c411c6637ddbab380a9146e74f157b456ea55ebdf9bcc00a03e98a6f94be77e2920e9626e2adfa4702d789d26108f4f105f23075135abc5467de298e22e9e1c51b891e922c7afc63154d395ad9ca93496445ba613e2adda63204588df54fa2f6095f9b2e2aab68554c053c29653357e6f80a0626032f48ca6b5f2dee62bb19177d526db3a95655804d610583f8424657cc213c9adc9b2c851b58ed0f5ce2e0155d17b8735c28b62da95a7c40cd17a10c8ded6030f67bc2fc1b23e3f9243213ed14b1e6608cbe1f272464728cfe81a1249efc4eb025cc08d73eb8c46dbfbc19c7ddfd8ccb98bb726bb185c85027c41a24a091ed100585aa0ec38db61dc6a4c7ff676c49ce591b7ef8cb2b61de06bafe28d1f355362ac9b63352fb28f274d5b9565c07a714d13f2b2b0a68a1c9044e69ec70258a29d3f66fef007f08391e934219f3581a0ee402bb1c3f873d6f4463929ef87151fbb9de98a79f8925f2f9974b180555da0b1fd1c8d13ff40a40f3b80cf96ecd065a79d06888e0cc9ecf067d9e198892f6f348c8b6be82e8fc1b104198247819841163db7b415f737d11c698b791cb8415f27d5fd1a014d5105bee3184eba83f921f35e72daac3d9941edf555eda16025d5d13211fd77fb23ed0ecb5929fb20da1b54064b44c0216013a062222b49ae407274958ba9f6417b6df1ee9e12197de3f4b3c20d31ca697fed0cc44c2feb80e40218335b2bf4322e3a895111a5df6728bf30e51bc34bdb9669bd6ba4c673144e4290925ef9062ffa6b456ff604aa7eb9965b974b0549e55ceb679ff85802b8df50654b82f679997b5736b58d291807e25520dfd90fb6ef9ec236711bffcb7a3ad7f6ba1db1d6d7e8351e426bb2ebffc64ce5e12a279a802366c0db559027cf84f5c9d53cc2ab09e3da5b2de91c734b7224a5239b69f8a956e9ca8e513e58b6eb7ccd9a206286ddd7b1cb2c37b0db8688a4093c0989f537c1b45401b8a53fab88da9148493402c044895799e3ce94734b0a1501a3eea3b7110c929ed51a0f05f81fec98da8b74713cdc14c3fc3fa415c9c4c765853f1a6b7ed8d4791047ad9c9151c9ac066c9d09ef3d1ae4808273f391f78eccdddf81d3f58bd3eed7845b9243e64c456196479ead7aec5db9b456759bcf6eaba43ffe256216913ab5d52aee391ea13e9828ba078e70c0e3194a962505f69b5deb58385e8f3c56c29c78127157526e317354562dc779f4bdb8d0e62ed4c8ca89b1cb65e18d497b09bfbf91b2a1868e3737c9f5578277537fc9714a6c53bc9378e4cac16fa37ff7e9df7c53320d789f5070a455e5c660c352957a871c6f54bc3025d0c7708f3dd80c2d04dc3b8aad5cb6281e9a456e635dbe1e315ff42e75053d9b379cb9741cd42c2ef112ff7566e407912faf7dffac2026b64e7cfcbe7ce627be4449553a9a9332e7991443c6fcb46c4e072b9d83277b81fe1a72c3699cb4180fa7ae51c186d16fedb6127d5119587cf3d4a37155cb4dc57579b118ec247bfc963039c108061f5ff728e014b28127946cc179c4da2031fe5d3cb13cd527aa21d0b3ce4a3a3ddd6256b6ee869842e9985ccb3e54f02ffc1a0c12fec97cabb2e1b306284a7d6df906de5d3c39b8fdde23047341370f7922d4b41039ccfc555f486338f843bc8379c934df4907a972ef49a50d8043483bc0d78ad6ae492eb632fb06bf168a6720077f6a7fb6c314f1c8cc6ee1e8cf3a4a03410e70c6162a23c150c7da6330ee64bba23b58253c598419a8fb4ff5589d2cb328fca2b2102b98535b720615ed05e4eb4758da2398c4dbbe87a8e93a7e87ed0af4f25feebfba1e7195bfeda4cbad2ff81240eff0c157d325063ae9b21719d20ee7f1fce780cecc1d47da53abddaf33e95d756a176db713cf73387e2db7919707a711b57677ed79f1c5e66b23127cf36a317ad1d7e7eba52ef4c0f7cbf5321ed2b0cd6a60f39b76aa6c55300d159fbc8c3ac4879d70d24009a28882eb8fce680939e0b5b88e8949259a0c74b550b05680a088a0c3dc5ff19bd3f5706cb426669dc7b7a1a7b6f59d03a5313303fed6486d3f0d687a38de3cc2de2b15f859c3e3bcb3b686da8757c1374e6c5964fb6d17d61c1ceb31904117de7623d342df9c09718541119cc160a914e1d5f28c88bf9352df9bb347195306b8743e1ab2d82caac5c70e56212f0fea09429a08fd0706348fa38f1558d26f672d4d14c2d9e415a5d0e7015f66e426cd836f2fdde7b7663bd80a0bf86b1cbdcc27761466fbcb36e15d7cea1d9fbd32edd93ebfe62d9781e28cd6f23b578e2b9c3fd2ba054178c2f8ab29e2854aaaa9e789d95c2bf4c254b4f0903001b00823e79caab894c5720e673f56e404bfb877c82872bb0eed7263dc3fb96abca3bdba817d0538310290c98419849c60950affe4a6b84d37ec5f58f5815efa12fb524798af56c696e435370fa8c723947c7d5e5daaee86507bd908082a67b868867d66f7c5b4698802708fd0a2d00234b1fd3d3c50309568711d4be1aa831d05061c94231cb88a112c8e6cb4c2026fc252b39100ab2d384e54b730b137a54d018e5960ef4d0130cf6231c36e1910755170c77e0fa67b71d71500b390062ce8511b685a1b8a72ff43523d97fc56f23000c820fb97be4b031b3e491e9ba13edffd4dd63d9567e718ead717f7e9f71dec372451ee22887b6eb0e050fa70d04a4bcb9b15d94479c1fd80586ed487472e6532ace0626cb7f4f11c4046d76c6d107db8a97dd61431dae824e18299b43bdb3c2cc4a721ade6a007b7b5624357e265595cd113552c9525ee575f39bd2f6121884b378d48d50af813e8f1a98418061d670aaf2a9598c798f0e4a834056f964318b4f0f305b0ee6283e960140392c5022d3d0c73303fc8b34e355844833ad01b5c1a48db9025bae15946e0b19a7141df339b9650a80ce13b47bdfab75d7ecadfbade89d8c7de3a523dd437600848d990b6db0dbf3d40b79d06a7bf876680770b58eec7ada595578cb1e1c7d4f327a61eb6f928784ca8f8613ea50a25ac54ea7c3c745f78c1207c23fcbf157d7fb15ae6924e995a1bc101dd046c63cc52e2ff9eb21cdebfdb688523fa07771f28f4cba6bd3fe82f80d34379e1d017da5cedcabd0a88b14a6b76e9cb41fec14a72c3230cf4e41311dca7b5479a1c98a8b06bb932b7683893c802c275c9002027115a534509cd421a701892300ef3f07a8ed78bf240186155010609d39f87ce4ed8eaabd15297d0af4fa353b1ccb8a68348f03bc73f7f2d9b8d9db4323b3e430a3f4fbd72ad70e10fbeed6553b7c499ae60f4122a6777075754793d058f326874cfd341f41e82029bf997575015ca5925d75717427c7d6f84bb29ce5bfebf1c2ddcdd793a2e92f63cd5c1d350986009879553724928371c60306c4d0562d8269f6e7f86a8671ed7fe09fb2ba82cf4e955a4fed8426d6039e9f4495b72804cab9e557ae41e8b2840d815bac02627a317792b732a6cfae2789c1c4f222e9f5c02b3f0b60bb02b7e3d70325fe50008d2f69561862fdec58ba68daef3644c0f2233055876f28bcb0f7ef78b41b9233a39b6557540c134c6bacf8a333d6415ec8a5334e1baa0e0cda3b0050e96091a34abd5c32475dde1b426a334f8911e561ad650f0e2e53853423054ae9810ea5b8395588941186bf4e497768c255c9526b800e52ea7d58b3f83be564811f01564aacf0535d7dbcca5ab2ea51f5e4ee7e9c0d1c151ab75bfdef0f2cb7ff43a6f2801ee36b4b9aedaf54caf49a829cc45117a00a6d0dd079e50893d6197e7f68a66c15e3926d8a9a470f6d5350a56ebc1ad174732ed29122588c9051ab1c7c13614398c164b9c255c5657e1e827394e4806bc62030174bd5f1bfb89a125c62b93ec992db0e455ecbecfd09617559bc30de041567c90fda6dfa73c7b124dac044ccd7b2637ca69e5f1bc4c2c703e3e8b635b85624e272362a773bf38eac8499911c0b870d0f7e267fee8cd7172de44dce4b26a7c6ed5831ae5cc8f9f8654520ae4326a7699339ab16b5ef4ea5e8bf4cfeca9978516a8b784b374eebe1aeadf1063f929ba5cfa02e0f6a680d38da0a48fe65910321f0c68d4ce9d99c034dd4a2fc60d887b332bf281db152eb39907ccc6e7b43b794bb7d5ba4ed1905a0e0732f1be980f84fbcccc23ad4e0c551a263dee45c7b1c66193eb787e8ad8d48f7a97edab4f8c008910623e3c524bff9d2213bc26e37c5a6ce24b88c16dbeb80208e72c4ef27358c8567000a4ee1a381aa7cc2d990ac043eadc9ef8626afc5942b42ee4572a89a0f1e5f6aff9a88cd80632455e5c7a40b17f1d73d8ed45707fd4c3b72df429da44b2e80024622421a096a30a9a0181892ff11b164af4f84ddefbc2241600ad833a2d6de7aabeb1a74e5aea47c19e6d63e7c0d205028e446e805653a4daf627e314eb3edb93d0673a63728bbf635730e6e618bdfded5d61159a2cc6fceb2dc7bdb3db7185f920349eaaac446af16c820c42132988b8bbb800ece575b47c14f0e0875440956d22915a11952c059f82a9d4f3aa4f135451a02d176621d1085b030a212f164d5f56f3f707ed963d78407a5d8aef7f2cf1d570a73c6303e9c87b9c79ccbb85feabc318486b8ac06ee1fb90adc90f2721919ca1f3eec41db8a072a85d00c1a3cac6e4369244fa38e69c6e75ec0ef1d30f05f82be2bd575611e42983ca34436bca095e744c19706f2d2b1f6c1c42a28a8129775810ecf0e533630f1571c7be8b49cdc441734ebad2aa65656450e4884e16c2ceed88008fbc8dd4ff9872b5c48fa23931efa13fe93b62d687c3318c83a4f6b005f365f30f5eaca6f0ce38031243445c65fdc1be7ec5109fec0efe4503938a3a0c8ba2deb4500299f748993735cf944020ae13be4c05c126cd074ca414965d008908ad92711e2030653e6443dfee6f3d4b10f5e8ae7c57a86f672b0db659b40d0878170d94118e44e8228a1979d08f94f3c88bc67a66d446c1d12a1e196f138bd386b066a87da434ec4b5debef30d7856e8073a33d7a76ce6be64ec02437897fdc4a11645cce863c6781b831980b2243dd4b36e53f04825bc83bc069acd5ea46deab0cd9916a34a544138835534ab23fd931fb26f0d4e69abe6f9a6bf3e347dc7f9b7679da15a4a37ad2f7d8be7f6e3fe4aaab5e42b4146df266373be42447012cf2b1210e757d179a829594a310b4c4b590ef5ab9be3467596c8e00bd5be0106c0b06da50aac0cb1450ed13fde4a9f3ba7ab6f1587ee6d1a611b169e175b7d625c0b47633081f7b6cd910381850482b879e0e6f37a64bbae739125e502961ea457963ed7b81d6c8136ab488aae71801cbab8af29dbc54fc1d9c761f720a1216f20da811ccd16c093349275798538608b8677b9a52ad956cc3a41820e32e112980df24ae5d75c853f71602dbe48febd55e29f416026276168067f0de10f542fb84ac68566eaa2b2515675be0b2438763d83ab29ce45eb17d8b1c8c0c114093d083839db40184e63b500f3b457064456e3307da9b91053112b90c07b33de3a0e3e0708f4887314480cfecec9e29157466055f10a33062956c4da531fcc59f9cb58a071f9da5f1df761bc0829f9525b80d3ac6ecf8eb04a0b2b58285b1407bc2cd3202a8a76872dded71edd1589f67ee46b574b7434f0ff6396ef8bc229b96ef70148ecc7fb9cbf3e47eff70ccdb5c0b3b2fdc77bb806b7cc2dd0f02195f6d8699fe18c782b386227fd85f1cc7202e20ccb903c5c34f51e46443840c2d24510bfac9da41f0fd4461736dee27b4579f5ee19c859678ac4b1df8b7cb1fd410f3209a10dad99f40286237fcd4f45004a1139a044b8498ad71a5f6820eba8bb6e7e8f18c912d2ccecc072896bc58e853c4f1380a14645a84e51b2b3bf98e78bb11fe8148bc667b1024c0f403d202a353e9be2eb93c1062c4078de3430511bac13085e9f29fe99706e2d71eb38bae9a4c63d2cb85a0a82d91497a3deae27ba3a8040a774fb447ce3aa9bfe38c4fbcb489323fed546945f499c6a297b303e49a5a4a977f44db5c846c0a85bb6ac697e45f92b53782f3020b21c55a85c88553830426b4d19f92a3730804cb4dd8c1160209e29c756b23ef3dd023fcefbede10104186e69e09f88fd60f6fdc57750293134399bc9f5d9e6992017c8328467df1fa224c24aeb969024a099deac706b66a2806d95c94efe6a89a098311d44915659cd69aa710957ff59914cb15acc9bd4435d92843bf7e547888c11ace521a18dde38b8128529c1d4790d24c1afc603f3a488991b9310a43049c264c5db23359351c9a3cbe7bde063dc881be092b89063059ba85d8a57c47b722fef8aa55c8ea3e360428f9df8b61df42fab37be627b98928cee76a2828fc2de8dc97672b7d43a60bba3d61dda693d0b7fa9956984193abfd7ea6ba373174b3c37ce63905efc4b9b5687e01e507d115e9d9749c381564108da740029a9bcef1d6125b6629e3904e4ed3bf4910e69104028acd87cea966629773eaaabfa13bef59dae42e69297f3de5b9a0e1208fc87eaf9deef96dd1181545a69938efbc70612abf2db344c872fc428eb0f4905c8defefbf85304348b10a953f94c28a390b093e715e25fb9014a14111633948a63366fbc13145a0b3421c06f53a7b1a45c093b0be28fdf36fc7baffbbf346abb741d1fdfc68fa1d38f21476f574cc80488b70a8663992f3aee1e60b2a2ce460085725b3c91edc5224ff19a9baab9c6ae191b0831b0ea0397682c583a0e107c7945f7d033f5a11f98b98208cdcc7ad5c20ee5ec59c12b064e4e1fcaeff073eae9d44e7e0bf2d34344845da36fb134a37eb039e71d0a8b69afe1ce6548487a5e373670a2f3fb6596b91dcad415035e39e83c76e833c3b4f86b58b2ce47cb97d902f04188cbe9e227be99b1a1125709f7f7490171289e388a09a2da2c4f709c79cc4bfaebc4089a7e3bbbff4510981f4f117e5e8ac95f9738b236506d80f6536ebe5484bbc8cacb38cc310ca7e974c5d11dd3410f918ea93478a2675eba9f71e1e2f39028289c932f68df5118f54cf5233431d364c6f56106d687ee9414c0bdf1bb4272eec16faa715d729818fa7487e1d8c24bb9b160435ecdca71119609a0e05d827b60918bb43a435cfb96cacd45ff9fd6f6e738641d836e74f11765f68ac45e81452ab0c64f0f0aaef4868692ca95169bd5d8c6f5579732121bb9afafda46e016fef6c749bfd42b669ebc62fbc99b4448dc611858a64a8b9cd2192731b681a495678ce4fc6bf85f15be7148fa98a863513c4e8d2cfd8a4786b2b0a37e62eaf5e280a5ac57a5366a5c463ef10b9b3d5cd17943786ed1cd370140f4f8a2408bdd3a1575dfd33449cd4c1b5479609de5f1787a0c7cf3e45cc46eb4c32ead5d33b3db7ecf33a996e508af8dc268725c107eb4d3e391c2e0019ef539df631b0da9e1802e3d07da7e4cce69d61afe548912327701ce3b1b2a813f19e001f8e698e68960092e6067931cd809b5c6b4ce71677fb2f7cc2c2bba18a302cff2fccd23e6a815f2646c80788335abb67f9f19c4cfd18af1424d2ffe25b15efaed5023848378aa2fad0c09cfadbc3c1bff38c3f8add7e1320486bbc89cc3694ae101f32bea26ddf52a5e1ea4aeaff6aebfb1e1a4aabf1c91f049c632ed57e7d9410d0e823b01cf84f46ef73561286786c1f0e87d86301485bb772024bef67c93a4d467e1ec24a227eb80e782fbc9d8e1c9369bc04f4ad13874c4920c7a4e5fd44cd811243aafaa7937d7f176bd20de91e41a80985aee13ee4d9cf776519bad2377a26ec35d4f6bda3240a67da315c9bc48f528222cb607381ccd37ad9b566a38011083ffc433d070eb12485c4aa55b3fe871b0b9704a7aa46adf36613701920bef1fb71f9795f7f273b87e9f205d6fba74ac44d6084fef0c0c79a9ee6ff555b016638e51569684c7e9a3d13d3a6337bd0137dbd8875a6d811c8e98d33487865a156bb93cb1a86137ddcf921e106208f28ae157e35042640d73f15df800c54d4d9dd78cac769bee700a05dffc269ce29dbc03a4ef979374514bc61a8271045a50bb5d5cfa7bf2ef3dce74a903fb6dd7f8942a7e43b185aa8f3dfa390c1f47dead53b021dd1d29a12d2e08c00b6e40191cac476ffcbef92e6ac22562bc0f424f826792b5485e43708b0ec78f6a61e52dc6810ad81ca8b73a82f20359d74833835222dd353cf481c8ceaf0447d941539e1f3b6a12c367c01c28ce8b4f9c062d81effe2280e20d266589c3c8142eb263dd7907899e28642b4ba10f64f5e4f0dbe0c8253c31553efd0e8f09371bb79883d6fb868967ec869f8f4c9c35e1c62f8c78c14902cb89c3bd48cb93244ce1781b750e51c025c592c1983a1e1b5c2fb2667c03c6d8d0c044fa4e7d252182357a823ef590196d2be4b1f8e994b996d3bdd431ff603e6c956fc986a59f16cbc28690253f3a84e8e7a2b4557a2c457c3d442bbcc52eef637572a17101349f68b434fc7a08f78499fc15cc58907eec415859bcff419a3b824b60661b2f14b7734c0559e86e5b80fb83e299e0766b70361ad7ae6210c19a1b7e26d7d138cb65f413b5356204c46d6ef36f91329855f8c0bd041d91a4a9d8249d4302f901bbdd3696eb81d6ecd9a79a5621a5d866dc1175d9a9dc20d47922c6add36fb5fa24df5c1687237de27486e8f501851d7c1569ed4c08742972e124a097c661e5beb161695929e2401c79e7cd49e2d082da3ed04e401d7cee4a7ddba81029007e931e2d9621f672f832fb0c60d68fef7ba411c4a6f0d0700be2d0a092e7a377277de649c698c8f99cc7050e23ebd4820493f3cbe76be637f8023c8836ca6a3b62255ebfd0fccfe7792d8ae16cf8b03b1ce82ebb9add6beeb3dafcd97ab2370740ba7e5e71330845ab4e9e7daa3a58325e74c4aab5c587eaba0527b0a6f240d7263c523d48532f20378b3a6687c3bb0ef64742fe43bc8124b06001dd565dc236b3137109ae96af2ee6c4dd409879c11b76e5b581df40dc0d11951e9acc86b99a416b7e6920cc67f2ca783f2c63f9b5038c4869ec68823ea13a7e6052805705cfa75bfe7d184bec2197b9efc31fd1b876cae8ed1d46ee850e51134ba63524df94327e5b16840d8f68e74464c93cfbc64aace6ace0755dc2afae946cda1fc3496a1e88f485841b05abf307a0c2a73f6b166c1248bc9f1a796aefb714025869ad6d1e72075ed436ecc9d9865e1d857eb8c914b9c9671c8bff33e73a7917e0eff939c6f25ffba07ebd9d9384175846fde9b99067450616275d3eee6c99d9bf8a0f99a504cd0303b981bb04488f3bb036b259e74480bf1332393a33f550baf2b4194c2de60c23f88b079599f255927fa65021e97f63b64fb95185bdfff9119693fc5ab998f6d9a00f9081c360e49f55c57eebf0f50feff983b640a6547af1931b967d915db39782bf6f950763006100eceb6761f416e5c3e7ca06ac6e71e789b2d71e5d29b63b802254800bba303bc8eee9d1385580cde8952101e201a09d9d607e6d38b7a012a47f217bb9d2d5b758b6905923046c47b5a569721dbe0d7d287d760b570c4b4763bbd3e5fc2c3140d45dc6cf17e0387ebc5934669d23bb3de377682b2b97ffba5e123e1b8d77417739f9a27df2ddd3d0b53cdd6a849abd1676933d7eed1c0b22623de842f89093310e3814d422e0043bed77fb1cd21fd5eec4e0558506c9bf38beb059f6f86dcf3132033b61451a9f103190931a2d88191aabc22a96de279cfb1434afb959c07274922f3de3717ad23f25add0c26bbb7826167eb8376141aac18ecf7b164018d116ffcc51a41145c8632a3bda1c05003a50238415cdc475ce941150ccb063ee178e7258afe9020e1072653e8c2e83ff63fda6e5ce2aa5d1b804bf0b95e1316308671ba5ad7d3d7a97a543c48fcf2bac8f5833af9f9a5d16ca2b3987e85b24ef71ade239f151a7540516d5e74148e6cb13032d72493ded5a8289cf010c147ca0d978ea3b614356c4ee74b81d92fa6e88142da23c18f498f215d6f61ccc43737c1831f47d90c325c01d276a6ff4961003176b4972c194be3c8eb331327e93f59c8010daf12eb00662f87ff1f1edb1676210e47ed12b9af234d580a79fe1b88682a94525e4d6dab7bbd2f0c9c0d618051b9098a13fb2967ecff64cd679b7679fafe9e65c8f3cc9ab92d32b01a3684c74aa151eaec1b2e7c324cd0ef95ff305683df46160ab2177010682b9d623996f414133b7a47241afa932a8f2aaef1e71a27967dd7c29a259155b84643e13884f58bd530f1784866e866c26119023f69000c25597da5b82834ed9d95499faa45367488ffabba35cf1a3845575773a08ac8679c8ac25fe3ceb206f71e63ee66fb8be6445fa8ae888a2fb736f659f2aa0d2f61a9d6f63e46bb23c7a28dfccaf41c31e66dc2cfd679c4f9407e22941e2afaaad138a876214086674ad4ad06db4ea26fc56e0bc9d0f15acb6e12f1e211cd7c798a3501cfa67ddf5b9f6362fea32b04ed88ebeab4ab230455043b9eb1c5586f3935d120dbfc96fdd93066cea2765ebf0332380383fff8d2037f41ffcdae059cbb90e9b5ee6a1c015e14bc99f14e798abd74ae6075f1af84d7fac8b3d37598fb4fe9fbdfe5689d1cf8674e5039157fcb0698de57bb4059fb35b5c4516b1ca7fbce564527529d10c191dbbe041de448a4ea1b813eef3ab7064a5bc8848eedf7189a26b2723fef1b5a99415d97ddf4a08773b6e339446c6d68b862d805dec0d32468bfa77d36fb2e0f3e015016b6709a608a2977832c85b9bfa3cd524df608a50a4460723254a90f38922e687f52471a4c370da07a79bbf192382364fd81fca3f9b27ef2dcb4ed8fbd50dd993cedb58374d532d17298214ccef3042db7f0e5ebc7451013475affcd04d1396c17090277593a7ae3614ae7a12172a107168854a813153d8312a6f290966d84a389829684d224e88c41bab0f98b0a8a249061efa37de28018bd38126e1ba90f61736ee8be8a2ea128094ec5804bd33a10759f0421849196037a30142f1de77bd28cd2563edd3da75a761fd73b4dc5aef1175a3769383590778337712df93e46b832ae40f63490534afe946b46a573af9f13a298377ccc301ac86cc3f4bcbdcc168f381881e1773f120567f527570ed15a8c6fb18f757f2dd6d008aa3d41f2deaaa01eaf24b59ad53820b91ff34d23167457b5847d9af62fa105357f298c7da198c3e96851cdcbc9bada59e4ab40d3c0951d198ea00c3908c56ef5174e14c84ac08dfe91210f2de94fc3312c75acb9acd8c2a00af89313e675dc24b377bdb382049507af6a793857ac651e224cfe2ab7fb5af5863cf3fb89f73a33443d5833eb71994a7b1e1b340f32fc53e8c5549a74780c4830549fbd9d1f63a213bcf4bec8c57a05fa79c969aad1c1082bdea9b188dc619205ce98b245c5889766670d70b08726b2150787f9ffcbb65642262dc4053e4b8364cccc66aceda35675ae213f5d2901b2b73cae1c9afb67260f0bafd2f84719b0dd08e1ecbc87e7c413be6c660b4fd0a25ac5a6cc84f2ba6e329786ad82eb7206e39acc2c07e7c18b1ad50e2f3619107bac81bcad6ad8fb6ba61fa5443fe849167e7c27d13ae8223a0ed9b579796a4372387a0eb0b1dc03119255b626053a360bdee8b997e84d4afa7c8ee602e53c3dbc3496466496e1e9d8fcdc0f2f0ce552d86634bc1a465f111e5853d87e67aadd2e9fbbf8ca2eb6c91b55db61ddd1d334ee4699138194c554f325cfe22972a2a471695f18714ed4faa4a36b3c02dd541aaa0d747cd49fa256690e4ee12ccf4490e4ad84951aa76a9b910fc9c17fe6c7a7084cf14d661f4f9c9b7778472a99ee42b95c0b05774b2fce073e9602c9261029e7d0e0bd08aa5c115c06eaad10f31bf4248086e25a2a56393129088dcc02d34e2382caee1b83cc1cdd2f17389141692ba999a1510128ecaea5405273098e5472d108d8e65b8f3b6f67376088d825fed8b7f3fe8d180f568e7dfe5cb2dbf07d8670778271cc27c1df3fd9cca6abc3a98196e5a922afc640917fc1f19a9a48f7a772b6cef6c6e51305977034ba8cca02cbfc1c2ac9acf21a02fbcd97479768f42786941326c9149c7eaa9dfdc1bb241a0805bc78fc57a2952f8896442d6a69982f9d02a7dcf1eac840eecc11ee61eec10c7218cf19d9c2c26c7cf95e78ab2a18a9511311636069307891e7cb88a9f3e49c3289cef0513bc643d16d0f447acc55323f283750fd2537fa2d0189c57a38731dfbc4787578f317444abfcc606b6e61e10296473457e230c24336e44e6a19248b848881cc6da9f06b5b1538a3ba8760bcdac4d7f95b517e5bc12afd2f67425cb2b267a4ab97c31cb19ce9eee1b5788f0e91fa9250cfcd092fdc294507396923207139704dd3f0f9b0c1b0fa92bd7a1cf978453393013bd56b6041c5b300da1e38751aef1f47fff0469d2206a4df1785398e5bb79be613147621eb92dad92aaa1d23f4b37c042e5a0dfcf200c7de92a21d2e9c90714d8e138cc2822c65f16b2e8c82f2573187d66ef4e1a9e0de534904f2837d208fe8aab42c7ef4c7f5971418caf4280e2a98b7632bb5fdabb96b313d36cecaf022b7d9d3aa845b475c0c41a64fb244fe14cd5c07502e7ead5f83b730fbd6c87f1a5779e668e3db8e371760fe6b5c87e54a367a574c3b99d8a81030ea6711ca6de76c7e24b3ac3d2b23dc8691613aaa878338a9ae154071dff797c5d385fb4a0ddcd8b4efefc795b4cd2d9d37632f2084b61a243245f24a34b08fbfaed18ca2d4b5abec1990f8144dceb923eec16dc46ca85ed4062ff46271d85770e672a2d192adae02023ebee9664904f7c90e617d390947a7bbc34eb00212c63ec2c42c13bcfaed0b059d94d96c469da7250e782908cce5a0bf0c063b530d2d6c1dbce29716cd850d6a1ddd391e1c2828b6dbecf82288556b23cf67ee41fdc4f38a8858d0b2f112551c27823546f862dc5c60171455aa4a03f5173a5b046a968682ba0553ef8b9777315408a42056fc857ee49a3defd683b14762dd2a1a349839e65ea5bec53c729ad093e334526a9b64df952abaf71c6238485a555458c89f5f4b7753a334b6925f22ba5608a5adec6121463f2d8c9e5b4923202d8a97b966c278e205639fa511c4f72c209a33d4cf6e78a5465d90b6c3195912c29349398517424626b645be0e81ed2e3c6dc1b99f1a78a789a240a3d8a15442f70d285d89edd8787785f5dda367f64c9957bae68b96f03048889ac0eb2a51666e198b77c2525ae6d27d412ce8021228ac598f3bef7dce9ebf31b032abc50131be8082ece720cafa4d4a0292c944e5b593322e533c9c05c931f3c52c2ddfbc4539adc74e01fd61c719ed5ebabb335bf6be8fae63224edd60d04ef5cd8749cbb1f4037cd124b338cdf009fddc0951cc3094e51ef2b79943ae3583a92ab9de03231cae763610edd8d8f432615a3481b1ea868122a9aa06860649483c0015b69bd2065eb694f887ead3eaa29bef13f86e9c1ca23d846d4cd118ed198b34c00f0340d92621f66936aa65f8358bdd6ef3751b3f1de43b96ef7f2ef91c93b6427b44609edecf4b7cb2bcc2efe5f125bc1ec447acfe9ff923dc14fa26b003019c70d7d18b48c3310ac8e22ce2c32c61b1f1ab659bca6d02f6640f4f3f9cbf4b591f34ddfd90c3feddf97373971f95d9e63faf92cffb498de854e0b029343a838b3e56246eaddfe6e9ce241855977f1cb0ad95371118bc231a1b11e9f48da2a007a1bbda9fd30c75bcecb08db3bfe4778cb85ab33f7a9dc2e01193002f4899b38c97a936a87aa466ebb21c4c9bf75ef08231493d76142c72b39f88fd8fbefd580154fb0c020c61e7b774c93f20948903462d8159d6b22de56b60f9dc325f6d0eaff800b16008cef50c8bdbb2a1a6c34a01a87ac5e4898d540c8c16873a2972f0eb0fcf7ff7c057a2eb7db318da7f42ae8aff8c4fffd6b573bd0f8583908039091ece267ba0b00f10f0189e5a259898b0c134cc235f722b074cba41ae2d8c4841289e0eba6c9620b44036ae133cd3780968f89302bab6004c6a130768d2c7486c188b89050732bba207b46a3a31e51bd9f66a33771c738dd136bfae35f5833e7e939ad34cf6f5be696ac544d50896eaf96f0322a1dac42b1297ac67ebeabebf4fdc7f0167d092842b203b4e0aa38558eba1cc7b498865d3e21793adfb49114e7fc6c655560e05ceb0b13136a6574e14e1edb23cfe7619794b366c23664ecbdd80f35697ddd24cf8d2e0c8a7a50d9007a19c609294ac70df450f68015db6cb6accfcdfc0dba386f6c71385400318c21396cf74e4cc95c219352a15fcbda656b646370c5fd3f124f942155e1ffed35b098669677d76eba7a93a015f5d9954fa0adc3d34f2f4b99fab8563e7af73056af1e27e8f41e8d0f23285da3027f496d0fb653f7206bd98b50fbf76b280fb9b7faf681022a8aa558857793c17096bd995216f10ee82ff6e8558d9d9aa8ffc060b4a07d7fd7837f5ad5af14e03feac52c5c693900baa040349fb662514d0f2d9da6985654ef542fb682ad4ff7588808745a79171d544a48ddfed98586d9b15ac3ee1233aabebe1e1d038f812a1317ffda3f88fdc0e968b5955498426c8115bb2b3fdf40b3fb108372c3cab8d839222a3ddc94ed7fd9161060295df476c4e74bca499c5fda6383e572832e425bc517e36e97140525a336327c8f16edfc23955c018ec4bf0da5026aa4088709f400c598893f5e89a189eb6c7b8268ec114c932fe2fbcb34b36cfe1d12942815c67f49033d12f95bd89038533beeae62cc2505f52556bae3b3cb89eaac18cdd0c03fea04215ae43458380306605b5235a2189d8e81e252ab85d8175faf27ea5d945c20217ed4b7a2cb63145e700aa338b3f8566cc1d542b846646ca502a656f283efbfae30511863fd3ea677677a2bb8e3c6eefdb0b145ba2c5f42556fe5dc17cb0b35dfc0ae4f829a982e3645206483ebff8869f996545fe39565e29a05d7d9e285467dbc621fd9bdd18027025db74b7d1b6d3cacabceeb51da8f476a80aa9be9b19c55c2dfa4f981c8c0f1373480d1e6a643aa380dc317e9decb632d7c541c3339ef39735a01af7a43500a7ccf250fedd000288fb651ff158ef4ead3fdd75479741fa687887edf05492fbf4c36ca1603008555ffc317fb6fe5df0f2ffe67a3158bcc81667e593f4aaabae605e18e3c2334cf5e5352e657da5275cde2dc85d1a734f8bff392bc7ca96791df99b6f48e3feb47b6a7f34d10a043cb789dfd5fc1df43796f5c9a7a03fafdf61221c97251ad805026f45e6eeb8a2c2c5f9afa416156506828806280fe86f0142f41876a9b126d11d3c891c494acc046f9188dd8e40edb71e8082f5e3122152faec87a5ddc3acd6946209c70edad638dd49d73be015093591e7f2786ed5a4b414ace50b8d2a541f17de069ab0fb26a41e408c44ebc53a0665a871274f866c22146ed8d82bf329c6daac78a52407a0999c21e38eb94180cff546c1df73ebcfc2944a6bcd212004f97fc2ae4db5268ff23a144885e823cfaf3bd556c40557fac31ee423a50967d13ba4960d0228db6b678fd9e391ac01fc94c6c1c9abc6d80e16b5a517fa4a862a86e021ed5bc6b525ca50fdea6e37458042002c743b0107ecf02b6ac837ea5cd6c5fea2bf352fe9cd4769d73ef8bf390c1b12046b8a8b454eafbb3a7b457cf0720438b7aa849bfcbc6cffb12230a0a2cce887f1b6c4c4d9b3864a8d839bf5e75bdade3a0230e53e7739c5dfc19851cff520bc1826b988102c5298e698aadacd37804f59b4e0f61407373437f60a79e2bc67c9f0184a2ee055553d24120e379eff269abf79f90f477c3a630be7b7bcd2c2774454df0c0b2ff460f3dc0406d0e4147187f23d66e66761f2cbe9c22a2404945aa172a8dcc634454831735719a2bbd322f583549fc8c0bdcd3ade5b49956532056d381aaea2617a3f48b4f76bd7e3129f75216118f79512a5b6b705381d300333e516595a528b37c81f5cdee7bfa5bf39a860fb0806e7d4ea0252cdd7ac448956d79c96d000cb65b3b4c05fe4de0c5d7829235afefcc5fb4f3d693134a53c9dee8f9f9f7c6584edfd3ad8447ef01e026cb92aa255993a590b73118c8df5625f9f192807b67189b64f800f1af4b425f9a38c47cecdd69fe205762b2e85bbd4dcbd39499c755737ddcf8f27c4bcce992711394ffce14a43fd7f191460d0bf6a22385cb1e4a92b62116db90babc79cb15ad8241f7be88e659d9e4ef59a7339ee338fbb4917d81eabdcf26573f279f7ca06046099c65dd78dd5ca1b520fdb349d73594fc3d01f5f7f0e07e3c516dbf977e60019d469d8008133dada766013509692aad2b1aac661cd70b857d5bec9fefa7225d382b475c9e97e565e60d8e1a85db2bdead22c8c03661f20ee5c09d850b642051aa79b7868eda4c4176be09d2fb2c5217e9a4457ab7b1dede5252308659199a443468cb538cca8adb27106a28f6bc9a4cc5be7a92769f8bcf13a23c9771729894c1e560c72c6701e9dc840d3c403d77956e8206421e561b426610ed38fc7eef24f8142239b425106597b8d3278dd373a20131811bf9a68e82eee1197ab8dfe4e60f7490d98fa01280c878cbd7b0f583c43bd415d67777c24b6fb6bdfdcc6600af5cf860a0f0783aa631323c8aa44a21ade3fc5cdb5bd77216d2b954227c45b38a2214ece129bb33512889d520d810e8ec9e8db679a47d17c3fc87c4e27963bf4cd2bdbc462cae07f6d724f1c8d1242eec9e5495be07cef1044620e677d2dba749dab7007f735d93a9bb355a731e9d88d49d173401aee0c43bbed7ffba5c2813e673139a7a4858a50aaff525ff61ee41394f1fe4dcf6f991e338b81860fa46480003a26d6cc6a313e897b5a7c677a1b18944f5e6f9726c0e1ff17f4137689cc778326475ff0be81af8c0279bfc202c9b8b7784f0cc4ae8506f0c25cd67c6b28939da85208393ec742b9ca9461680044279860caebe086dad866548b01944b6c476cbab8b484f584595fb2b9adaf9e9adb4e4a4c4fc7eceac0bbdc10ff62312d8377206290122fbb6af42d4e974a82aa9ea21811aac06b144ead456039ca2188f04077f666d5e4f18e946ad56952f6411db4a22e91956e38ea98be44e048a83e1280e0caeb044c16da93f93b5675a49a0c05f6d110764ca6d18afef4db07818f9b84b927859ca33937071dce151c043c111d9a07fdee6ea51c072390034c9bdeeaa47fae27ecc5ec3e2065dfaf8f53fc036a24d00f442832405f0caaa833ec116c4a2b6d7a3ea3cd044a00a4b70c1257424776f89c328d0b2475690c6c1359df432038d99b5fb23e7439f1897e98c02516a3f00ad32b63199c017339c6091c52d00b4edfb2f19f994b5fc780027126be061dd073353acf6b0484236004a1af20c2165bda11376b73613115fe904ce3a6f39717c7b22058affdc940e49e0798bbdc1ae822104b63ccc34b4a2b4a5c2c655b0bc03721169b1c6aa976d9e90b193c548fc38b393be5ee275be4336769e6aa42e6ca224288c741bc5eb5d518ebb36b4b28395f28ce0f35040ec90ce90c2913163e5debf69bb1f82a6dcbd2ceaafa9cf0fcd4400ec67f48202740681fb6022a5f1c08dfd44eef7f993426d100ec838e9b637116880c4b5ac7542e92586260570d2191bef0bd18db7760bdb176265b29de7380e8402c0c512c6e7c4b68bd1e6a3ed27775210793026797aa5bd5dbdfc414f21b8598bf569cd516dd43b4432819b329cee45c345e015025e51cd134aa540105d6735b72a5006663f0809f5861804c5ba02090531d8f5bfdc99935c7445f0cd2be09b1e7f2a828dc5fdc51a06a77ad192d4b3870b3696f94c2d6fa0389e096c25f595259e93ebfea6f89e673c16e73b8327815515d47d28740858f77eab1c540981562f433cf60e100b32900826601704f3ca2d389812b69fcd2319fd5502a4899823e44db0f74110067807a495b6f28c061d2ed613da70152e307b7783b2b819cdae5b3bb882c0c8a2f425b94b5ca445bdd70d6dfdc272f6eeaa1b8ec23f9ab2f3deb390445427419b8c9c4707a5b76a38bcd9a56ea3229c86871b35843ad5f065de791bbaae5115a0d3a22b3408e569814ea763f8d34a4a360b80fe0095acb358e3da0a4ec0cc7e2f48eb5b056343c414c2f2b3dd900a2e599066fae103127fd007fdc69488299f07c256101b024b76e8cabccc0c931609796dcf98c19e875d68f315065861b2cb077da0137cb75f2ad29135e2163a0a636306c26653c79c244ae1bc95bf304c84a0cbc888ea5105be571a3242701ef0b379190901917c9f59c74a089af13e83bc98109cc4d74a07e0ca57809487442422a1de0bbb2925a673d9a6f7020819dff40238ef845e6d0c0e031c67f4deb8ad669b2cfad589ce9aa723d8d8e337b144606e58af341cd06f22fb21a498f4813056bd39363a7f534c21ce790f3aa047422b8768109d48abae397c4e17a89c5b1ff3118727de6d56f7a09595fa61525204b657f5aa340d87782f350038a3ce0cb97721ae8636941cc4926ab15f0a31a0017e318299e331afbac14bac071d74d01b8212f3aff99ce37e6a2ce59cab996f0b9a2a50aecc078907775ebf4479845331c2d17926d55b7cad2481117d64c2a8164a28e4bc101b92d9d4398b7cf6455b9401f1a0bcaf501e0492309aa70a3e4590b5c8cd67ee51ace4039808a680359274ceb3131a627cc5ef46b822a5301d5604b874a11535bcecdbc40c2427eccc8bc40b3448ed14ec4e185add980868cef413b8117abf41587b69446b655562e405d52e572d362824d1c86254749ba9d17ea16f708b0a6465db96cefa57e0ccd9ebe726b1ef2bdc334c79abebf20d3a66e67a4f3f2a3d6fc60dc7e843372037820c3c5206fe4cca07af3daa37647acdfd50d17b5437f45b7a5f9dfdf4fd6af43d6d43ef3b105d29bf9225a9c90168004af10148dacbf31eba49f87815f1c877ef1f013568a0b7011b9d650f71cf0c75eefabf7bfb66361cf4f7a294194b59aa614940c1077837a01a6ba65781ada2a1b730f5c3882a71009b54485886f107601bb21ae334ccb93264895000830c81070ef102233acbc05d91847cb3005dc16518c47deb7d6d542717e2a92fdfe650bb1c22d2fad1c8c26c283c86f4a4914367fd17a00b289bbacd7ebe6e2cb638c0004df0fa705bac2c9af65c09393f17a00b03b24d5b25435717e2d56e7d814b00edfe6a5d22e854f8679122d8adab75d0f2b5df3c108b71b608e84846f4eec492016ccdfe40b74062fc15cf6904d056b2535468075bc38c6786656ba8910efd2fd4a4502129eeba3a6e256510c8256731c0ad18a0dc4b69813cdae4e7022be15a34870a1d5c8cd2b2473b9e22403caf07106c0c9cdf914f0dfe3c1c1fe41ca916062d5e131027c504dfceea166390b70f48e108256f7cca7d50b086b90618066825b6790e39af8b0be8047e2266fc85c301e23cd1b91a62219bede9e899a8cd7aaf33f9b3916fd9c35cc49a9d1c2abaa880638341ed0263ef5b3fe1ebd06b5b3d12e01ebba2cb47ae4733d4a3a4b97bae6e4ac4f3999ecb4c203879765046a52311020f95143848f8e0a1eebdbe10f7833b40936e3695a31def5bc74417400d45597e72e52006845f04e24ecb4d95a1373b69f04b30146ebcdaa27f1e102752b936e1cf0ae074e9fd1a0195fb7476e938f7e2c917ec140e0269dbc5fdcf29500bcbcb5618df0aef2835ac41fefca280d51131468c82586bee8379d03ca52389a6d0300452192bfab15b9fc9c50854708330b6e7531042faf22155b89226252bad5b3ce2183b9dafa3756a09e23ce6b05f30d1048f65a08e35419ef53aac74d6fa63abeba3481c2b6835dc15f5fa414e3ab881fbfae8dbb80a009f6be751a0a51c931190ccdf2440ee1fcc54b8ce4043d90d9e8e56e26621802348c6afb2f590db40a316bed4501ac056546aab32d0ccd6d4485a711f1b83c74c9ac03140f3fc71362b6712e10e0de928f1b34c7826cbce047d6030b8c805b431104c37814023bd6b2a007e8206d81ac6d2f5623678aff9e467eaf1f0ef555f6507b43d59e48ff24b14b4e022e5cf795c4c84887cfd0c4f129a3dfd6bdb3f98da93eba9f404e45f31b66033b7b79f5fd35d6ee8ec95c9078a31f9d7c50bb5ecb1a3da93c5a160645c7c8c2e5430e858b218acd2e9336edd981a7ff813a598e8fbb23dc298ab40221484b1c074def10beb70f39d51d71e83bd4746e731d9bc1043933597cbc86af2b26644ba2a4f8ee3bc444140a2d3b208963c63e020ef69eeaeb912a0baa48724594c6805fdb98e6e9de265cae550620778387a48899d337957b722158a2d2fa1eb9739e466ef78f7057f4fef156202bf0ed2fb690cf64def4849080c5679838f80be3e3e50bda49fb4849df623533687fcbf42b39bc8dd0815fc527261b3e1d2b4e80a6b4f2f48e5fa30fd49a305ed179f329ceb159eb640110c1da06603e54fdebe48c931c06d7cd1f48f1f183628bed66a1832a7a2e6c23eb4c7383b7bd23f91185df28031f756fa8f284500670390cc24e1122704c0f9b4c3419b7aabe237c196a8719bff50d7ac053644dfd96240bd14f5ebd71719614bb5339e5475d2b8a30d8b181b51d92f6785fcd98942ea1b5cbaab45d53af55b036186abcd5363811e23b1901e2d5668318601d120c6555ec40e73e8f45038897a879da857b5d0b8b2104a25da8084871c6ab968607c756896f1f122b332a7e44be3ffa3f012b319bb78254235d200d978c0ba246e00f3c44a3d295399bd9ccdcc385bb51d259af310b4734473db012eed66282ee277588211a32d3692ca564a6b595367cd23a92573441251262a210c2fc75cac78432a16c727464a2edce7588d470849203b13aeaa25355899e579eee90b017d9c6c0c56bb4914239279cfaa5896c80f9d130ff1152ad43d602136c835560854be98c8c0540d5a72b829d052ba92bca4dcf4d9f48832bcb33f62a396f113bf0d0db340eef0a2784672ffa3d71fda27cb842c3318ebd456d41cd8d24b4510a51fcea83a65ecca131335a80573bdf558ced5c0369045b2984a4110a031611156686dae224d4339196a90369b17c69570d1afc07646591850446749a6d108d2e9ae96c021e1be5bd591f2f5d62d5e85baaaf0589476bc5473a2c905593ef4820758070907b1c1a1122be7f6cad640974050626e3d4939e4e81acab794045171460dee07b101e10cd54fa35414e32f2b6fce386841dc6d8f06b849dbfe7b2840588f571602bc07d6ab0c6af92324e2f8e36fc9e337bfefb3d4ccb8f488992fbf012e096aa03db03d8c4ff36f129be939442bd1276e987d0fd6ab4f1700864b3e42255bc93e24e25731657a0916a9038255ef2b945d296df8766d035af39c9a3be40b8ce289d07411c1492022c8ee0324a12ad796c9c3f67c0ca13795329a016dfa60076a05b88161facf3bc879517f2ec4ab03ad99dc209afc248db66581e7f2dedfd0f5b6de41ad2d9f853f84680d3a5bca45304002479d783f42bc78e5cf8d081705c60bfafef714a0eb4d096d545c76236e84c68097ff62a0f2710a9c160b371bd31955c119d57b23e4e78103048a4807796de64f3eb174c29d576779ea97d1b9bbeca53f8a7f118b7a2a605f7142904197cda018b218b5b011a7991e00226fa2ac49ecd15b3017d49c2798f184eaa7f5bce32aa5561f800af4cda5163c7548296ecebf8b36f8da7659b6d85f4e23e86448be4dc6035d54b54ab829c6423b086cbdf5ad94dd43b212ccf4c66facc3fe4db9b482979da4fc35ec1ebc9e167ebdd2bd8b4c0c944c4f47a02b2c436e1d5637940081f89fd90975209657bd8e32cc39b444537456a570574b3bb9ca97458a5f8da924da2b5c377b8c0bb0e08b0b6218c27e58f0a20d5190e28a70c886d424511e4e15c019739446ad3ec8ba8fc958f5f004be2c3732e6c62258aa8b6082f43019d48cdcb39cad76c4a5e02af56ddc47ab2a4fbf88031ff0deb1a20f504e07594a0c91e194d6afb3d17882ede30e89d51acd924bcf613c4483f21d7f2736802bd723a29cbeba1e0c1cec920403760f6f5227b808e89b4bcefdd03926ef96e3450eb3df8ae94833078f2c2fcc8ff1f09c59945cb2bc57433d9148b71bd4e6bf47f07ec5f709b32b12efe1c25b4b8d58c9c20027de9fff425ab5053b389231e71832312b3e0b444b24faa459c4bce057cfc805ce8498efbd3a86aaba9b6fcb7494d43196cd3a67e6fd72c835b2cae337e6070e7aaf2c97d662b9983f7d99e956e4812661226c476eda0c82b76b69e0c1f8427aeeb77b0ee8891ad6c5945583e014304fd8a12067616cd55e88c48b02810ec8e7f9b91ee937971280dbac797c1540282773c973bb067227543fc0cc43f169b10091c372e1a408bf99f291fee8898f840778b36d24089f13d2e709b72b331d56444929bf16b3472d82e4c43b0b22a83876a38b11887627d77332ab6beb64fbcbdf66734263453b6983e7d07bcd5d58c9bb82aace2f6aeb345ff64d25912375304d9c70cf119b093d0acfa5cee20cfa16ba3aad6e69ffd99cf7b2cc27b0a292f9981fa4a2ab6a17de2021acf20ddccb73e655c59a8bd680556fbb4981fbfcb50b117d211690e3e4e8e1d715478599a9ff4145d474651474e524dbf3e7039d46d1e75c64b0cff146f65849dbd23db8e6104f414bd0c8395fd88dac2f0f00f115dd7622d6cfae44e2e94a99974c32380f57d97865362e401bd9d7786895ebf70fbaec09131644e92c5088f51ecaff35503761ecdee105266b64c28ac3cad35dabcd2f5b21eeeb41661dc5616383ac42ba3a38515814c72ccd288ca109bea6b57143b6d5d8212b984c160de6136328065c7d1b78d977581dcf437c5d11b173032207ff1864315c98400b761e790cae372a544f441a5027065d7fcd05c982b0b4377b5e40f1abea69b423bf6f2dfd773e5893313c41c24ce88cb3f36dd6edb60fed086f6e7f6c42eb59100ba95fcae70bd30c536ad5fc462ea65e382765660b347dc61a23b7d97adaa24f487c30dcbb32670373a6f5fa72a23195606405c32e27ad1c51b5702f7b61f641fb3656b8e772349d93df74e9aa3f175ea3b0395c9341a363152c173bcfecf462b7af63a00acb4e3fc6637fc33e617e668f00519ba3203594e616227f2f79090fbc6702ec6f27b76afb474b54a4b1ed9cf98c65360ef2bf758abb10cb4eb902528c30a4fb3334a9bba165bd74122fed4d4929cd24f2dd5939b12c74c9a0fd1c7a9781a345fe25a6dffde5685fc987f1042b145edd946c42b411a67d617e4a84991f709003ca0fc1e04815f1be81ce8199a0f19476a86c84f22aaf875e9025299587cedc17f68e6c8cfb2b4acdbf8aae7eafa8b5dfabd46e8842bc393791d978757a7e21a8b2559dbfeb4810821384e8c94342e8566f89a18390804887d4cdfb86104aea92ca7a696506b682d5012962c271c645e7a07fdada3b0745da42c21be97d748fc810fab636d98fe653794ae4312799ba9b0f4b1a8b1ed1c57e3c3f4c7d3e94bbdcc2b45cf588f4f37494709916f0bfcef593dc9b26c448394d6f9d555be23db2998862642e182561f56466686eec99c2872733fcc9b83d99a30fce15c43e99e14fc67dc4461ff04ce1f370c362d9e7e136cac43f02f7110b7f32ee237694897f04ee2316fe64dc476ce483961d80bf7f54777df7064b27fb09c70766cd2dc9fa7d6b2727d5b90f22f4ad6631627763f0729d5930c9ee439b9311154f03fda0041a90891bd0c8ec999e93043fb0a875ba5e6687f93bf45e0d69bfb314c4ee957e742fce3a45792fbd9d2bfcad31f6481955b9300a260a730d2e248ea6fc1f13f38767d9626446bf7c8edf3871786a3f32ab14cbe7f88d138767d9b1c514cde1fe5c65359ff62e83183abca13be94aba5b4f27bae9ae3947ef799dde5fe1b18b63d982d68be91dd3cbee1c50057977453496137b77d2b226746ec56a4917b4a633b45513fcbaa76d1520d1ba0e27a690e27782960aa85fc72bd98c7e844e4707d182c875b4964ab69107732941c18c1dfa88020c0fb54229aaffc09fdc02b91fb7798ebf59999b4196aa02bcb742662f2245d84012ef7f46ba532075402f919127e988721834b99526c25a656b0efa38a3563416855abc493c85deb74542cbac892a3ac2458df96daa0b7a49a8cdd16b58bc5791aeb42328b06e89013648da1d352061aea0a025a1b3b0727a492c219d27eac781e656606facda8b71591dc5bced878ec102ea4b8552bff43f6dd3eb06b84225e60852541f99738e50e2039a98fbd3bdee873e68bf920e29c9e0092684fb72c81714f479c56a444283ac63353ab32f99ab68fc27fcaf8ad43ef46adac4ec5c7c98f0381cbabad4ae82f58e38cbf3dc3a666fa16b1a9b4e7a3d96dd454474c005e8174483f804e39452fabfc5e4ddaf5587d8b98dacd4d6afbb7c9e6aca6bbc0f7e155a6a79fecd2b1a8cb549bd79e5fe4a717a148f15a679c895ab20580240d2dbd8dfae5ca7c2d669d1f97fe435b816450f57be587af40f707837d46ee21f53d78dcd8d4ae12d34061b0068213b9dbba8f85e35a1c197cc4af2afebd6d64eca974cdf02d75c4d166d45f645803597e480d669f88264b23059c8817cc9b5460f77c01b86c177abd58c4042c59db5016433264e111bda366ae19b2c1aeca359e896624b41a7ef19dddbdbea1c9e69b85a0db2630d00a9e3d4d3bcd225eff724ca94d7c24a8b21ae2d7d081c84a7b4d6057b7d7539d6b54ef7b73e54bc3baf1474209987a59ae4b1fe71aea8aec7c04047f4ef59396c19787af9575af41e62bc4df97c6ca010c84f1c65f3257b53d26c19b3bb72168fe2a746928417f091d7b128a6f70403a51320bf35082a425573a280d4da047e64f95b327cb036541fa134d6d5c79d4d57a56cf80f1785ea7d381b49dc62060246523df990b9c994b11e2b1e316b4006b125c0498fd268dcced5d57d2afb2f1cc891731dae907aa2410f58bde0ffa1e48e3797b3092ca35e788d4e84b72864eeff7535cee8a155d40a76f996198d1ff39b04b49fb7a5555a16c9d13d47bd8e141d8a405533bf00a52ebeea4b65381341f0ff963f1d773c35e1c5f8e59eee99c4ea6624c334ee1f6aa9691d47d140e439022b282a86319693acb8ff9ae0dba759da7d112d104211665986d2ca17e968e83cd4f8f4c89da6e52b53b646d7d87c7e3e6c494486ce044459045e0fc55a105010705a9303003088e5fb06d14304648c31495b2110e8924ad162519917daaf2dd96f48969876449d999929c75bff7bf5e52d283ed72d5aacae88888888a4e87aeac337fc5af0048a88989a594bc86e193b129c12df0d7244d143097b7be861041fc0e1461b6bcc60e543650b2d98241902c9d5524d60829121342ec8c4281180283b7be0600739d8210be845174444408e37d890810ad23043034648403c60d565c16d5270021e41e0c10e602082270c208025028025ca4e114d76d06106194e608227cc28c3000528e5808396daa10539e260e2a7cb1e7a50610a4b2831830ca33764100316a8208d117c200b2c125012401257a2ece8b0818318dc00055e3801c20fd8c0810c60a0821464e0020ba0420a27e0f1060f5490821380608a2ebeeb301905c1c38e3ae45803062628011a646c7185ef25012ca1c4151d26473222a3206ce0608d30bed8620adf0560844e132647b21682889e1d75b081031ac4c0042540e303647081c514598cd0417224bb3412113212bd3deca8230e1aac11031898a0041f20838b2db0b8628a2194b22c3184115216b0f0e408175a10020e5a58b1002c576005ae584010170ff8d823a4c795c70b16ae2bc87040b4818b8c4b0396bc62085aa41f45424284301976b870b06e88b1215483458368064b061f2f081112a211b910a4059a203600a9e1070e33231f31323031170ccccb4bc87acf0612c0973a6d2a23be6bfc945a3da1c613d440821a2fe8c16a30ec8471a7a04debf70aa0a9b1a99152a3e73d0cc90d5683e406d3924614d4d8410d18de7b5dd0ce42229194d0710263431a17486dbeebb4cac8d6a5a1d37842648934744843e6619dee34c6613a238003e3e2bb7f7404633c6e23191901d0083ab6697fd31db7bd67e9f19e95c77b5616a860d92102fcdecb11c3c1b66dc583c819e79b6dae99e699658e19e68c31bed8e28a299e58e28821ce17df7bedad97de79e58d17de6cb1bdd6da6aa99d56da68a1cd15d75b6dad95d659658d15d64c31bdd4d24a299d54d24821cd13cf3bedac93ce39e58c13ce2cb1bcd2ca2aa99c52ca28a1cc11c71b6dac91c619658c11c60c31bcd0c20a299c50c20821e402b98df4b34a19e97e7e1625666c6a666a0a801500230086d9ccd8cc10c0bac27b9615a8804614b0ac8d9e0da0210134ac40837bef61594f0f96cdd8f4f46059f73d0ac3667a8860ddf7a89a1e244890f08006942798cd90215adeb3aa40053466c842b04608c8781877f2286e05254908a6788f440a819610f451083a11ece6068b35980e365f14f12c18aec4d0c40202044bdc4882453a4ddb54de1fb15d795c705b7744c3f6cf6ae398c6b892d6a54ea50e34fac0933b7e70c60e1eb7c5b184f72c25bc6725e13d0b09ef594778cfbae38dce308dce58c232c27b5611e23883863380c421c38619aaf79ec482c0545aa5b965c77b561d4418021d735872c4312a438bf760c7adb4890b130fbc74808a0e901e7f6f0d32b4973a59d1a4685d476998dfb4d3160ef35bbaeeb46dd974ea8499b8e6409ba7824921a3c87bd9064658a729e136524fadb25269278a0e95294cac9498149133250a0f955229e3e24b7a5be9317e60757101137ce0c8cf09e3f496aefd1c09ea543f5e9fb64ea5755877e2e2b1f05d102ab5691ddfb59d244bfc69e3c17a4a67d9fe596d4aa0d080d6e9cd77272030f034de88bbe08df80ede88cff1463c8f37ea33bc51cfe18d7a7cefc9f0020d0d131f1e0d93ecd13041e2d130e98f86099747c3648a47c3a4018f8689041e0d130c3c1a262278ef0119f53c9a91f66846503c9a51158f66c4001a2133231b298fc6863f1a1ba047637380476383c5a3b111e3d1d878e0d1d8a4f1686c62f0686cde8001080d4d10213c9a20763c9a205678342dbc3c9a16468fa6051d1e4d0ba4f75e901684b8e0438047e3838047e3d3c5a3f1d9c0a3f151e3d1f8b8e0d1f8d4e0d1f8e8e0d1f814e1d1f860e1d198823c1a930e8fc664e4d19870de7b2ecc2024861ea047d343c5a3e9d1e2d1f468e0d1f49cf1687a5af0687a78f0687a90f0de73818699f75a78011bcd30f39e0f1bb6e86fb405f7465b58f1465b5ce08db608c11b6d818237dac28d37da428e37dae2096fc4c5cb1b7141c31b7141df880b9e37e2c2bf1117406fc405166fc40506de880b34de880b19bc11173d78232eea78232e98f0465c48e18db8d0e38d18f0e38d18f003cc0c58e41b6139f2465872de08cbce1b61f1efbd1f40de0f191aec008f06dbe2d160603c1a6c8c47837de0d160277834d80b1e0d6683f71e90179e0d415dde28c88a370afae28d82ca78a3a01abc51901d2d04792f427ec4fc68a2118f26627934913f9af8f36862138f2656f168a2031e4d8cc0a389207834f1058f26dae0d1c4373afd319fd28a508117a060059709d0b862c6bb3440e2d299563e18a6d234d4151f33240ec33addc4c70ce9e747e31af35bea07698b88f57478cf92f2acfcac17903012038627703095e6a52d3e65c1f7ac1c0964e1e174af529db68ecb7e38bde5e63dcb07ef5970583dc8a458847b20144aff70160fa630d9411bef8974d0c6b631e9c152397837f0f17e2c37da78ef3d800d6e234920237ce3b89486100611ef89c2108dc020e2bd178130addb561d437129bd759bf637afc2c000c2c41770bc6ed92f4c0f08a30854e17a611401d8b34567814014de3ba1a8bc32a680030230bcb7a4f79c1fdfe974af859f8ea0923a694604a150395bfc0ef7d33b4fc5a35653b6f89d2e84d045962e601ea987e3a2a170d1507e561cc9a3b46df32a128742e590304e777af3c1525a8a07db569d66da92839d388ff29d0654c4a7340ca54f3aa83b6dda00f44f91cdab561ce64d3ca8243a6da707a1503953b49ddee9ad082ee749a7ed703fbed3f149694f348d87eba955939eca59624450d735ad882b264e3bb1d2693b3a49ca039d8ae8b49d9dee394e4be9b41d6b678400d316ef3d26180f29ede4936881079669d1012dc8d0c28947c270301c1eae6841b18c07affad122940514b2b8e385c1e5bd770dc962e6f994b6d369da941516556071002c50232cfadb7cc90896756f842bd96091048b225886751aeb3e752afd702e9ccb15565c1134ba82e7bd47a484d258963a51b1e28e97d2be5f62e2b4930ec40af91e29486f2bbdadf468015a16a0f352abadc36cb4cd37c19d804e5d8f040479af891387d22b26bcafe3bd97e58d1450e43dadf340a7d42975d206a0859fb4f4ae4b25bdadb4de560888c1a88a9e2d1da8c21ba3030441a57f86704103d438c093d785e58267b5a0052c78cf5a810adeb352f09e8582f72c354ef09e65028b046abc67a5a13bbde447e1547ae3f951381f2d0589ee39fdc42775e241651ac5888bc712811456785c6a5b75259fd300fc861d81180e36e588eebba6440a2aa4c842458a1829b852a1923aad3446e25ec561a8ae8726b8725c0fb852a192f2c14845607b0989fb9a89d34e3a6eeb38df515a0df78341217119070486914c3d5c47a406f31c4a37c1483d3f3ad563ea308d8bef52fca44afd1e2236353d26ce7fcdffaffd70a7943671ff83e9adf3401e7542f1229dc9e784f2499df8499573a379fc5683611a0ad683c373d363ea4e5b7ebca9fb5a916ea5611a172d09462a923a61563429bfa3565d4fad30d2e66d9c60a49e1e2a1889083744a57f6a308cc4f9af612a0dc5a65ba950ba26c5839196e8acbeffd13bdcaba8a474341eae7bbfd3718d47c99294b6a36d3e00296da7fbf7b2814660e2b4695b693b3ee0e28211a0c185025c1ac0e50a2e5370d1465c7eb8a09e4ac388fc50630423f20366f30396a934cce6072c558361990d87655162c4c50a971b22353a0b6f8b099e37f52da955dfa2a17e152cdbb46df34f32265374a79768dfff68547c4adbe1b172844a43f17ee349320242a150a75f52715cb7d23cd7a53c902f597bbc6b889513cf2a41ecc58404074b7954a9fb1e55ea286d02523c519397f76046d0711d438204e31b3745978815418284e47dbabfb8116782f792e0d1519223254709768371e9a79c3d5ede680f1fde680f1fc4dbe1bd21efbd9cc7cd1be541e58df2c0c01be531c71be5b1c71be941e48df488f2467aa4de480f2ade488f0ebc911e76bc6785f12c2a44607cf1b252479d4c3c7bcf8a80ccb31a2085cb8fb635e93e769c7e129a001224d8b6e23d446ab46825ee4422c2614e102961365c0d104e6036a5a05d2a91b8d429c4a46f9a73a725394d469a1d23ad3f52d7de94653d4af4f4605fe3580e463a2dd1b690b668d31614ead455d9b690308e71409ac37a4a6b0db535bf85d35bf4a69938954e711a87d21d67a3376f3ae9cdff7893ca934e3fd8294b4f8f12dc89eb9b96d2c148284ea561a91cecb4759dcfd2d3a304e6ff698b4f7d0deb29a534bfb12c53715886695ce39ce728d4290b9325519464590985f25b94c8a204e64d9d4d11cd87f340279f1c8cd4fd0995d24e3a558292742fc5e79444d378723a6d874aa7ede4683b3d55850fd1532a75de67c78904ca32eec46d5e8a0a360cde7b3c046d27bfa930bf7fb42ea54d524a9cce163de53dcb8bf7ac2eacb01c20c67b5603de7b37bca037d272701bc9f394e7385f2271584ab3d1db2a07dbb42658ca6bd9346ec5a5bce73413c7b695960446e236ad52696cd5b54d85051184dee29360246e88cefbf4d3128c14821e21bc2406290855daa524de1b32a44b796cc810ac7b2dfc74c4a6355155e136529609408b478a4025ad2b41a02922b0b210007def69ccaa42008fd318c83283cd03511192c50ad2a6c9f2e49ac90264c9752d01c633b244cf7ba4ce6d24af0497a70494f70280c7eb3d5dc71fd1e3b5784d733da594d6b3698fe218d7799f94e61a87a9bc16ee81303f84f3a60eb3e1ae602793df984fea74e2a71f2da5718fe2c1301217e48fe841fe086d67e78a15ded39db6bd2b686cd15247580c78cfe2c2d2e23d2b8b37baa21a5de91616ef595758565cc1410aca03f9272a8dc70a1caf9fb42a55c54a17ef6159136e64656764058eaa346154e58e52a9afb852f74d9cb84ef97731a08a8f01a44edc9d339eb8206e23713c537896f0641eec61192f9dbadf94782d9ac7caf2dedbde884a188fdb4850cab9454fe93a5c7c4f8da6a8a1002904300572dae69be8daa330adc3fec9c45957a45848bcf1deeb9e09ec089c0290413f9b96d279ee0e23e891071233ef3da8d21df773eab820af25c86b29711ba9e3951449b348911f8e05b3b9d9b426a8ad67fa49b39265a55229e57b3f994a27952ea9380e277aaed34b5986c34fa8bd92a252e5683c59e63bbd711f304e637a5be5dce86da5716eb8b772dab413c779ff535aa9436993073af974db77eeadfc702e3838446a706eb86849b2ac7b2edaceb29e3a1d8173c3bd954deb70a004baf9e158b22c02f59f55aa54eada9b4a4cfcf425442c79a4ae048e1c255ef491929ead8b0469949297e48c51922eef3d6d2709f6b8ae3bed9349db543933786fb5adb81c2d1e298788f79ed661a31c1e8868e3a5561ba675a72ddc09dbaa138a882c8250276dc7c46993eef49221b030440846433c311a22cb1041709640f23f36244c75ea704880c3493d9a694bcf49ab6cbcff984d4f0e17fdd353da1e2101c20889132324f83d5290deb2f9748f753a87e4b795cfe963dcc9e7644aadb613d7d560be9f90d460375edc387924d426b26bba07d22622bae6067b8fb4b123691ce93992433683f7485c4f0fa6753d5cea04a507eb21a534cc03698ff27e49a9a7b4dd4f3899eabd9749c9e0cb68f0198fdcc67b5c16a3f3414b74b0cce56129cd55c95878f290f75e0a07e19aebc6c5e22671f123f560454858104aff643d3d5811cea6c06af1deeb569a118e34c5f6707aa34a826ae222f6b51c8c94d27c3a4effcd6fd150580ec9c4b58aab33548dd7c3f9a44e2aade3308e36194d248ca618ef917a8250dd899f502a2e1eeb5af3d91a2305a5f43c329a3c8ce409deebd9bca9db565fa56d5d363192354fc990f88258c6283a79af47ebb08ed2ba0e89006330820b78eff53782437a48bad34b7ab04dfb53fccf8fa67f3acd57dd6fde47abb855a74b5dca7338264e9b8ca861a4676484886f4486c4617a8a132c45c283443ae3bdd791b8bc4752ad4624295ab4110993ba4e322a824711385ed7498a2ce03d2959c63d5096f58e2ba9b8aee3933a75cfad4a5de7643303ae633ea9938de93d1277b2a9215541080b7027215a10226614440b82e86214841641e88c827081881c23222678ef91a260590fb72ad283653da420fdd3d383719c5639e9da0369aa1217fdb3532a65c14420098a122c35783c52cd0d6ac0789c0fd252a39a5d43f388d46043ce783a673484cb101e4640ccf11e89488f073a6929acfba09a0ed31e15b489d400a10569d3b6cd1f0142ca0f96f3031eef3d926a8571dd69d3f429e707387eb81394d10f6afca022d904a136ed79463f48793fd08c7c98c123713ddcd7b40f08e019f9d0e3037e231f6a781d03000e3d2c61d44309de7bf98d7a8062d4c3113de4c0031078f8000f2b1e9c8c78f081d900fb0253614a603f7640c268870ebc243fca4d4a3b4d8912b4fd14264e787498f818e4b594b28c3b490c098e0cda2bd44f9d306ef7100946b6ac9feff8a5a7716f0d4d59d66d599665484878f7fb71c5926a6f75f426ad94799e8a926a926559c6a9b45cc4d22ef99491f62e3387d09465280de44b1d973a599b3ae7f51f4e992df65c4753966d3e25c4c73b6fada5aeb05738a529cbb8ee3d57eabc4f96e1609ca63225cb4a3f5a4fe9cda46fb8204adc6a2b956c2082d5f430a4fb92ad3208207e74f861d33a8d830f3d00e077ab1c7a88256f2af1b0e96e0856c30e36e810440e36e0a0c30d35d880430d3534f430c30d32e01003b539c0c045dbd2e9f082ad520896b154d2266cc445ffec40134b1aaae4933af9f868a81a5c98b0056e4810d9691a90aefd56f3c366a6f33e437c442e08190963628908cc9017090051e98790fcd178c96fa552d462ab5471cfddab5463c552a954eab878003c1da690018b2158fe47a74432609184f71ee7815cc8b8934a9780585400f9f1d6508015392f0a28ba3c41802682b86c015a75dcc6844a4bfda0b40ce064f2f9bef3ad7b4a02c8b2841201b892b8b05c41e28de2c0e38de4e8b14208f8f1d6a8628a9c2744c90b33a0c27b2f482524c97bef6dab4e732594e63612370599f72e29e474621041847745e18282134a4f70c2db3423428640809021ba9775df693e386a08c1a9c982908d9193f09e9294ced6a5aaa050ab26a8ad3b6da7a334274f7c13272a1c133c54da96aaf273d228255ee3e1bc6fd2693b4c348d47a5379eaeed08b17734e1bd4b074c70a37b146ab5f3de7584c72de1bd4b074a7891ca0fc7e2af33debb92808423f8f7ae3b3aea740565841f0585ca79ef2a0277d9915afdf7ae3afae9bd8b081ea5edf4f7ae21743ce7fb8e83c7c5773ae81c0fcb61630e9e9c417a8b43085b432541a1563b188b1547d4e275cfc429a5753aa58f780edb29e27ffc164c7f94e77ab88d04817ee08347a486935698088166402bd1ca0fe7f2de05c71bef5d3de0c17b7276cf4f9a156e6bd271da3fe972b489c76f1a94ae73d2c16382d2fc943271cfe3814e3efe094a9ff8a9af8c8041a99cf7ae1bec40ff686e75c400debb7470e540ceee06b56d5c6c4019e48fb8ce40a170f0de7583207f04aa888e3a99945c36e836ad7aefaa413f6d2b9494f72e1aacf1dee3706eb8b722235096c1089465100887888d9c59c675d4e94a479daef8a4564d52abdfb3d888376ddb98749b9612d4b524dda6555d27a86b49b08c2bbc0af25aa85df553d7d9f9d152beff682939573838720a3185117ef34e2216896562a1582a168be56279ef0201c6926511e8fac07bd719667049a8ec44d1e151b253c58812961c28254b4810382f0271446adebbca78efc95c1e78ef0191e4190001419e20b2e489a0105273c77ba920eeea0007966031e1593fb04e80022135a21d86a86248e74366891020aa705981e601044f0ade0f4e08f901c8ce04240006185654514502a6a0828a0da70b727a5092a45227ec88c47ec0521e0531243c60298f7aef0901800c5014904cc10c0f2481801641bcf7b290f2ac0c218487391ecf164d898ac32beead7027550e7752699f144af573c286c0f38ac011821171821dd8e83c95aea584ec6084101dd0d041c97b4272c0e23d5589c3210f213864ef85e1854feab48003707eb38284d8607acf771eeb6e5839b0c07b2fe55551b41dcb6fdae74e9b8d0f1f3e7ccca47492a06e3b61394268a8820484d08085ccf0ae0af850b790a1a68b134f87189c784f771c057e20000c6d9484c0e0440c19bc1a84bc80434a889036de4988901e2142b0f7b8f494080a5b7cea251720b5848d0d121c2418112efd54d37dff24cbb628ddf74f300cc3524b1000e3d24f25efd37de90d0d64e0a50b1f243798104d442a10e28290166c20a40517debb2020864f693bfe47a32286902053bc774de0bd4b02ef5d613c21419600e3d92ab52d3c5e8b462541e9151328eda96c52f4e6f5c6a4d65a6bad94524a29a594ce39e79c73ce29a594524a29658c31c618638c5042092594504209259450429973ce39e79c33c618638c31c6f7de7befbdf75a6badb5d65a5b6badb5d65a2ba594524a29a573ce39e79c734a29a594524a19638c31c608218410420861cc39e79c73ce19638c31c618e37befbdf7de7badb5d65a6badadb5d65a6bad95524a29a594d239e79c73ce39a594524a29a58c31c618638c30667c6da55346283f3aef25f1de1bc01312e2f2dedbbc117eda7ccafb54d1361f80a024da8e3f2de9a89576658b86f24994f826b4adc97b1704366fea3a2d95ea3ac97b971753b41dae8bf7def580f72e074c09d24fb49df7ae065c0c78efe2620bcd75ce84c98f126ed3765239db8a732d9573023a2dd1a9953fed4e7329df84e738cd75dcc96f3e48a33094ee522b229cf77feb948edf56ddc64cdd76da1829a531d48ad3d8d62812e78ff89c38eccae2bd0b8bf7ae2bacc8c224003a544a4b982c89a2648749694a9429539894983ca9b2240a9412961c28599693f25a341e8f5a750d0ac6f9f19d8e8f86f2a9934f8a89122c4c61d3760e46f25840e3bde7e35d0570e23d2235d67b6fb3c6b8c20bb88d14b44b1ca7555d4aa74e3fa78d73a78efdac521ee37e38bd05d39c70ef5d56debbaaf02ce97ed3b68d094a77bac97b179529ddfb4deb54411b97b3d36aa9156678ef69ae734fedaa0a516828aed350544a2a95ceb2928acbb156b97154c80096b18a4c1853b0c17b54c83ede53bdd114869c3696b1c46d5e85f226395758c6951444906525151745c97bd711a86d63c235142a270a4600c016852844210a50d001148078ef5179efd229e2058d9e30851376f05a183d8106ad3212d475dc6a0af6e3e339ccd469158642e564d97b9793ab08110e3cbc78f162851396e0f182d7842d2f8b9c4c20c1c34258890944308188f7b8c0032c6105a5d112c0580256c20c94d001291228cb704c9c76e2c3a5b6681da569bcb4994a3fab949cab2fe45ce1e015125ee0a86c0d95a433f9e1587ca7794a53d275b2ec8623c8f0b88d7452e9521749bc926755607487ea873b649e119c3032421bef3d0cc90d86653d3d58c76915e6794a03719c9bf7ae21de8583e48763e9a828a91cce53f13ebaa35204931d4ab0a38c9cee7f7ca7d39daed4f1c61bd581005d0726c21d8f8469227044d8deeb72ae88408720c77b244e63363a182988f349a495544eb4b2c5ef8c8680e9b8c1888e27481de77d7c561ca74d3bb0044bd20a2cc152b4c2f92928540ee74e50bc6f4285a79f94442bd04a96c9b93271da64e2b409080707db1b39ab745c4a5382d9e0d50db52bdf358e33c78ff71e0a95e3511a0c9603c87bcf7fac874bad4a405a7a4e5b9120afe5bd1b4994048bf868a87acd378aa30e19070fde7bda4fe904a154aa1ccf6993141e9fd469eba86419f75de372ae704a9b5771d13f28dd69dd0d17fde339bdb9e81f94e609c213384ea3b2ccea001066f0b8d3919ed2a6957a92701b89eb4e3f4580a0e53d13a74da61ff4bcd76d9a89c334adcb3cb77920bf5d1f6481db48fd880fac78afe37caab4f9ee54fad1b66f847ba0910f5446501a8e2d8f4422f1536a48e7519df69b0fc6a13c5086f2401e55ca9ef75b9394d7a2753fa50325484be17c12da4ed77ee382b414ef7f890bd22a8ed3284eedea8d1c2e207eb072f9008027814a3da0400fb4788f0856fa7eabe9c10e6f07637813a79de0e0dca07497d2704a59e64f5b5752713edc8fee74df917395832a1e0ab56aa2ede84e2fe15027ddf9255aa2c8b9d2a8124ad37689f33844301b36ea78416c2cc186e8bdc703376584032f4638e86e90850b86f7ae172e2137e0327a3668c3063d1e87884f3f6d3b07b3e93a37dc5b2122e70ab3917355c399f82931f1d34735c05b6840c60d6fcbd5c2688d138cd6c0f1399da675eda7a0744751f14d9ca8a474543f9b13254c543f9b93f7ae201790ebc77b254f6509187821083c18a20247b0638d317c70a3440c304fc8886066240236b6c04cd0c49582c20870a082086afce002154f20c0831641a403c240038d224fa0e10134e08007642c31400e781480240e98910c4ca3185871c5bc77c15ca22b34828113231838c90215485ab8d6366d0788173841ea3c87d24c5c60c6d39d5ea23bbda4a7fce6bd8f96326ac10bdef5523e2794f64d04e9270f8f2e3d2fe627e68990582fe6bd8cac98e782f52283d582252345f7851a20d221e692917911852cebcd7091def52c244443582fe6c8cbbb9e6559a1cb8965c558976585609ab8accb8ab9649862593056ccbbac20a4d0050353338359a2eb126961892ceb9ab1a470593ede8b25ba42deb2067059d62553e5bae1b22e18d16525e1b22c98cb42c29ac1b242978c0b5e42312d583258560c32214b0c0be6b2ac2b54b22ed18c0f7a01b17064ac171f4248ac98eb12c5d0cc7559445cb0160144f10704ae277a17062c51a846f47259a1f7e2006b08d6bb1e0d0dcdb39e25b22e8b0996cc1584655d2fd715b2ac6919b1642c20d7755d304aac21d725ba2c1822fda84106082b88101bae2eac97ab064b6485ac7749b9b0194bf4ae13ccc37aac2b428f0717588f88185c210bc612c55841ac9017d72593852c1cb2ae4b845d407cd4582f961503457107685d333032976559568c6565d67501210463f9b8442120ab876b6559a122968f1f972513635d445c3a5c3a5c39845ee8592e5830d7650511d18444570dd775593096e85b3e7cb07ebc5cd68bd5c2b52ccbb26eb88c80f9e1e3b2b60c9098cb42c292b1acd065892c27560e57be70b87e5c31d78b15b22eebfa71c588acd04bc8b2ae15b26a2c1f1610cbb28e583a5c33a1184b46645d969559168c0c170c96e8b25e4456be7e58a14b072b14ba2ed125b2f27559365c33960f4b467459969559395c3331214b2423b22ceb62160d41c8dc848478b142960f4b4483e5c347f643891b74b00020b2ae0be68af1164d0cf08713cbbaaccbb2ac222fe6a9de953d2c3caea41e66858e3bdab0428121945145d301a9d031c79bc2c30f1e121470c323a1d9785228708230a4f0a0458942c700f078c2830e5028820e1c60a6000d46b26e8103978e203e5c1e662c4b879587edd9430216d3e3917ab0a043919e312e9b3932a0d960300821c4b069c20e3d18901db019843c315ec8f27a5eb67898488af742efbd67ed71e58814b80133c5cc0f35e8e223464606666606e6e54728071f31a197500c4078a0d8e941a6066646068b80b8608980c42401a40b0509d1bcc0214504bac0b470c5f810d904c90197d165c60a902eb269018a8bdef0524564c1dcb4a00b92274b46525ca219d1132254e832c714d64b36da8108282e910da1223ce822041d5d769032450c2e24a1225404145574a9c1c715203044a04b93185432dccc14badc743e8ae8e18226c64728c88b165102ac804246340a15995018a1023e82e8c1143255e8a285ebc70b11a3982c3ac22b7146142fbcd4cc349901026609511031390a1250a08828dcc8c2c81441f81305bca0cb8fd5ff428a20d2052b8d2e355828666232cc8c4c0ba1ab5344288799263150e804a122e3e406264d667c380142a5df90a0cb0c221b3b0393bd100466e607931e0490812e33324e74d80be8f212a279b1609080997939021344ce103f563e86c838819989a921c8121f3e88767ccc00030e40d820431032353b538080624686143383ccab2325068828c686972c647d00110dc18888f111332332f27284081361bddc10e2e14506e843868732932334c8ccc8e0e342a164e70795a911f920f20166035d826841b4e44588171d7cf820c2c18518ca218a2e242356e8878a88422f04e841000cd0526694d1c60ace3063031750c01305e0c269f99ef70860890060b152858a94274638c9f0ac01e2070060a218c0608f2628c10843e0fcd0830d35c48871031b68200348301922cb2106203f605e70821278600c0d5cc0021410238c2a35438c90be88c01e5988c20e401398a08292c64516a78f736426668c2db4b83e7c0007196364d9ce00c38f1999181c6e4863044bf81e65c7089d264c24804502aa103247458119656ce0892b56aea50106911b6d40c10a0e12eb2306e603072801082af000062c800013908004b288b283736408100b0bd715ae2a88f0c09870dd2132c245c7cb1cd60fae37ae1ef8e001901d5c6e5c6c5c2708997169110dc0f2412687171c82d470cd70c560c1307ae145c835b268442d5c3f5e662e1f3232574ccccb25b2429605f382b810ba2194822ea22bba889ec00481593152808226035d5e5e80c400f10328441488a219805c8003300ae8227ae24386191c6890a28b8f24440108e9f0a3830122d34406c3cc848ed030f352832e326a74816109287cdc50184f00224797973dbabc00b1a1075d80743da4a08b0f1a5ab8628ebc187969000262f85143175188ace8e2020f2ef0102a32322243c3688f285e8490c13137211742373217e81282128dc0ccc074a04be8078c0d229b1f31648980886c669abc081193048c0d3033300300020310187cd0e043869824427944016343e88c285e66d0e58701887eb0d20f398832202ec08c4456a8484889484a101960ae982b3137c4ecbcc4d08205f323f42202120a85ae504c4826e46306075128a64a8c1017a4cc8c626062ac508c888a8c882c991a423740e16387170e7469a103508c604437c82c894214b6e60fbb0a7ccfdf6a8a65ae9e6bca533023dd5cc3a8e38f5a7b14505fabf6db62de21fc729f20ebff35e531eeef23d5d80411e359e1b4b5622ebfbe2590ba67cbaf9f74f66c3909348e52d67d7bdf95436ad5e071ff7921bfdb477b314d8376ac29f7b24e4f7fa67304bd6e6bf1fcd6eaceab9422e0f1cf8f35e411fbdc6b442353db7187956f0eebec2188b77abe75dd18430d3708fcecf9631d2df7b0620d7178ae0f60abe9cd3bd33eef9d5a9f41e3fef0de7ca7197f46b8f1a7d56218bdc4654ce8b7afba66ddb997df037ce6c9a3943552c8b7b71db8926b88b98d599a7054dab6c4c9c581eeed8ff26f196fbe7d6f00fbfa69d738eaebabd5990cbba18716626827859eda31b4e4f37e5e3194f8432d35b077dc9c7bbe2d9c96e2d8e4ca00d41542fa25fe1ec37927940b03145aee2bbd74e68ce1f4179810c67f73c4944789a3b6008ddbfe6e7bcc106abf6192ab02d4736d31f535e31bf3c7445c14c0fd475da7d5114eaf693565e151e226cb7a2e317a8c11e6bbf59f36fbea27c0a18d555a6e3b9d326209dc3b3db4356e3d3f853787b16fc630eadcbdc63a6330b096dcc208f9aff2c78bbff0bdeb2829fdbdea787704e6aef4677bff9512e64b21c0af8f704778e1de965368ca321c1c1c1dab8acb8b9c279df6f318ffedd3ea2ee8d7d1ca8fb1971e73291f702b85fa732c67ad5edf68eafce6802a35ecf6d78f23cc50479391ab0153c2497dacb45f79bfd5a62cbb18e061ef34767cb5f51bd7dae4e282620b7ff77c7ebdb9967f8b5b219e74e7daf5ad7d622db09db7560fbbc6f9563d955c5970697ba5d1db1aadc41e0bc9e59f9ed34877f4d8da2bfe9ddafba969bc73ce1b2f2b24cfd8634af9b711e70caf05583b758434d73ce3ff325fb914a02bb53f632a259656ff4ae54a40ed5b56d9fdadbc478cb909c7a7349412242e04c83fe98f3edfef738c5266190ef756ba2cd3c2b529cb88b8aaf0ffd238e1ef34f3d0eb003fc77d21dd3d6fcfe9a7918a3d6bcd9dc33e35c73573f8af29b8ceb5724eebe6b4d7ef995c52f408f39f3857af77be749bb20ca7ca1585d772d6f93be737cb2baf12171413e6c8618edfef58e3fe3d57976cefee734a6ab9be3f475396e16c6b8f8bfbc5bb7388e9d4512c3da2b6706faf33c5d5d7a86d1b932ccba34308bdbcd57b99a5b63166a157ff25c6d7636eebf4446ab00031c7197f9ff9be9d6348c5ba82bfd37b3b7ddf52fa3c21b442fd3c671cab97f0fbf869095661e62df1bcb0527d39a6b3894585ff71ce14c30b2fd4145f130e8e9cab52add2dbc8d9756e7e7ca753e5867b2bd60eac29688c7df4f17a08a38fd943296cabbfbcffc2782b94159ab2cc5b51a8316fbbabdfda574be1ca8282853f5b2fb5d5f6dfecfb13e4dc5947eeadef96ffba9d00fb9f72564bedc6f37a8d07ee73dba96f84b576cc7113f8b593434e3fc4945acf84deb9c6777bdaa1cf99cf25ec6e2bcdb9cacd67c65e9a707c56db2fe101e2065a4ac015639d7fbfbec71d234f42ef37fe18a3defe4b3b2d1220b45457c96bd5fbc61d8f10f1be927258358ef2d26bca329c27d61d7b7f19a7ce38e7db25ce502c23dc1c39fc1d42ee7785379bb20c07c72a4295995e9a2796dbf7eb61cab2034ebe71df1cf3ecaf87b40e3be3b67b570cb5cc986b22482a2f9793c2d9bbcff90ee1465c21ce5bd23971d694098b0ee9e3d5d6636b23fcf2fb3978a6f376fffdad36ca8ee5e8196efd7b977b6a2e7d1c53d75a61d493fa7ae18edf1242c7f656f837bd3a625f7910fccd9b529f798cd3fa798110f9b432dbed6de694caff03ee39e736f389a9ef965a1ff8bc2dfcd1f64dadc6757a0b0e2c6f9f15db5a2b9c51da37beee957f3e77ce50ef1997b07a50bdf6f9c36b6fec5e57cd03eef7f4b7eabce1d776df92b503aa2bb49ddb08e7bf306a1ccdd2c1b593f34d6da754e26abba05d32712b5596e5e0c65865c551f6cfb7bdde8d68b984ff7f18fbaef8661c93d5869f1f6f0fa3841243f9331b5c6eb839e5fc760d658f4f583880bdda1a719470f3dde7bec1e655db1c31957c6aefb129cb7088c02936100994eae754f228d5aa2b3961d9005b5db385755bfaada6bd06d4f3e9a7de15d6ada3bda61f6d6b32854583de67e730779c2bb69377130e0e0ecfcde63b1dad4be9d8f0dcf494efb830e15e4525cb726c6e2c29ac352e86725b0c6dfd5c67db4d598653ca62cdc046ef2da77142b8a9c7560637777e3bdff4525d7da6a62cc39962c5e0eacfab87137f88e7bdd5946538482c184cd82396d1d2ffe996389ab22c68ebb20c27cb7eb4ad49d0c693dda8ac1774fb7d97f56b4c79ff1836b1a962a373a3d2503a8d6a926529df751af537cb0595d748eb8f3d734a63ff2df0f8fb3de187fff26ef16781867a6f783f95bd437aff0a7aedd456ede1e774d7ee5550e1ed57662ae3febd739f0219f384d77fce27de3c7b14e06f278dfe4a197feed89f007e5965e7d97ead658ede04fada9965c4b64e4a2de72598dccfcca99efad65fff2681cc9bf36db98c9ffa5bb51a784fbc3d8e597b5d35d469f8bb37d6327a7fadfd368fe05fbf3df7546b4eedac5904fed22e35f5b77a18a9cc68481cf1c5b262bc33c63187c0cecbaff75cde2e3fec170496db4d319472faa861bf1fe8bee74c27dc96538af93dc3e28aa7949446e8e9dfd60c0c3dce7a53ea6ff6bbd73268b711f2b973f45b4a5c3db0ebd591fa0ab3f533d7da812e2bf47b52eb27d6bf530e7c6fffdcb66bbbafde7f6e607bedafe59eeb1c35f5930ccf7bae33d6e87b8531c252b7c6d053725aefc497eec9e7d440c4b3768c79cc1c76ce3310fb9e3153893b8d78660c70acb1dffae208bfd6585e60db9b7bc61bc6caa3ee16d839d22b73c53f57fe7705a4b7705b5f25cf36d61b2960ad95dd57796fc6f87e31bcb67dd708bbcc594a3f01df25ec5a6b59bf8e504309c47c23e6d7475d71ed1886b1e1c77e73fefda7df5e0e06e61d5ec9218cd75639370eb7be8074d36e6dacd3ca6bff34e11049629353a30ae2c150aa9fd34d9671252b5604aa965b62ad7bd550f7a94d5986c365d98e05816aa5c5fd66dba3cf5b4b532acb70b20c27894dce4d96a54e3acb36df9d6e5096171f676d37c698d34c3feee2726b6f8497cb8d71beff0137fe0c73c49d6e0f6dbf3818a7312c3746580ed059dae86184fe4f6f236f80a5516a2a2bbdd794655a571ac262c0a7bfde78ebac35f37ca329cb98dc585ce069ff8fddf7cb399e329ab22ccb9828b1b6f8596f8cb5bf5ce7eaf3d7627e3d619d194fa873cd3c8b5c37e7de5a4a3fd7ff5e2c2cdefbfaa9fbae57631db554e90a6fe18e10e76bb5aeda5b216bf5936f6a2ded58f205cc4cb7fc1feb5dfb9c5b01fefe3c29f5345ad8614d40fcda767aabee55ca1d3f022aa414dbaf73cf37c35ec5e537c7eff5c772d6c90fc0a59ef7d38d37e4964f2abcfdbc5bcc679f9d72e9a7f810c78feb867edf7ebf145fdeae318f5562dfa58e42533c27bd5ff60c7785c2d20dfbf676f3da2bcdddea02addf73e3ca7d94b2df2728a79bee4b61ef3f7edb0db0b3b792f3acf38c18db02e01c6bb670ffada7e6923b41b9d452728fa7fe3d7f02e08ae196f5d36ae7cdbd09993b8f98e62d27cd7807cd4bf3b5b5f7cd21b5984bc4135ffe61bdfacb29b74cebe38c585adbbbbf7103794cf1ee16674dfdfe7e15b59610f61d7bbf98f38e73db3dfcb4532b69d45ce49bfef969ed7c738937aef9f7deea0e2dae796a263ecd5c436eebe5f6daacca32d20aede79e6b0db156a7ffb3ee1939ced1de9484b95bacf18756565ff34fa5f672dda7fdb64af851bbc7bbabc7f7d24ab3d632f9b55b5a8e7196b9533c0079fdde1a6e6fa18614df93debe5e6df7b5167b8b4d38ce5e29d5d97278f7b43e104a2ffb8e79f3ba61fe7963bfe3c7fb4ffcbfaf72c6ec69b713cfcbbbdc9077d8359e1c7b89b9e49ad68d279ff3ea5f77ef31ffeaf3d7f6df19abc6d74b3d2fbd3e5b597d8fad386ab927ad1e67de4b707e5b27a7d14fea631600ce5b5e9fff8cfe6349b37cac37bf784ffde7e4932ef16d8779ef7b6b8d547725eae433d28aa9c51dd21c005ffd873cebfd3dddf92651359e9ace0de3aed2532cd4434837cd7043aee995cd29a5dd479c63ed724e2bbdfa6b7fe5d3f6da2d9755f2ae3e624afdf5dc7b1e5d719d17739eef8c9b539918e60ae7c6f157bc659c727f9ed06b9ceb95757624ecd47eebfd2bb533532b05df0eebc51bea1823ac304abf567fecb9fe1befcaed4eedd2ea4efdd5b0e72fa129cb521e55e21ea86719cf4aa51c287e7efbb7ddd6caccfb3cfd92d6959e705ea3e4f84eacb7b75a9ab26c87233abf14decf3be67dfa6e63c4ecd36b7a2fa7f6d7dca9df483a7c73bbb9a6f06e3c3fd626ae88939a2d9c5cc34eabd67be2de355a44b5587a1eb7f534fb5a61ef9a6d92ef86f2e38c21977477ddbb56996cba3f9ff252bb3d9498d62596ea98ef9697533a77f557c9beb2cefbb1e53b421ba5492691d0763a31be3aeafcabd57eb44d657320ddd7ca2a2db61cceff4d59a6d2b66e4304ae3eef0bb59dbe5b0ca9a9a475a421e4acf9f3cb67e4f243be4d59e6531a8a97f8a9d31d97654570e4f7f9dabbe7be5ed638ffd74add09a5e272904c1da1cd94d2ac71eef8de400be19e944ed9699f70e31c899a6ffa69859d7e9be534655929cb9464f45aedf5f5b0d70aa7fda62cfb21ff685ac9672b9564f0ccbb7eb97fed54c329ad29cb4af4daaeb59d1ac3bd65c4f59ba6dd53fa2bbfa5345fdc3d3765d9166df321d5eb2dd63163ae7fe5136b53966d1d4765e5f0ca0fef8dd4fb484dd9dc16f74879b4f56bed3f3765594fe992d6b36c476ebfb3b6337e9f7bc7389bb2ccc4ad54a54dfba52cc3c9b1d9a2a764191191660f73e6b5ef4f7bc7d394659b36f15296e16459f7f3af60ddea07889b239052befbcd714a9efbf7d09465387805c44d2975cab2ad53c177fc7c23ae31c23ab7b5d91a21c71c39adfb4b5dbdefb508f0e60d21c619431f7d851d755aed2cc3b18620b2c3c6cfb7c65df66f7187515447ceb0c3bfa594d24a4d271130e497438e31a77cfa3c042b33af3edbb975d533563a26febd6be9219e1a571aaf10cda12dcd3aeeeae5e75d632f0795f26b1abfce59fe48a1024471f038e18d7ac379a5a6989ab20c47c7e6089110baadf34748bd9c11f30883202dd57e5f38e1d41553da4504841c2f847ac30dad8db8a4f52ca21f780871af5e5bd927fd306a4025ad2f21f281ad5af7dc358f5acb8b79e77d522238ee8dfedb8fe7be79c36eb588dee0f7fe5aabef91e6a9af366559f73de835637cfb8757d29d6737659949c4831d682f6fcf3b632cfddf979bb28cd3543e221dc02fb3ae7067df4d3710e5a0de3d6def7072bcb5f6fe0b911b70de9eb186b2db9dfffe6dd4bb23e7f95ffeebdcd012a974ca68039978946ac55373639d216283ce5deb19221cf09b61c734fa6e7bbd4159868313c50607af541a8af500d10d748539c619b9b772527cbb10d9c0737c3d9e1dea2cebaef3860c510d62863d7ac871bfbd7fde6d6e3220a241e55dd7da399cfc4e8913e526cb6e2c0888d6d8d1f399e3e450e2e96d9e019f18664b67d6dad27ab30c74fef7fa9b69cd300679c33cebd6b2ff4839e7a62c838194374a2fbdbf2f8898f6ca3dff9fca8ca17641c694e39cf1fc15c21d730bf2f4b2ce8ca1b5d4decd827ba9eddfc72fe3fc98c215609e73fddef20fbddcdaaaa05618a3c591f74cf7d733052214d09be7ae5e6accbddf1146407402d9a99471471b79cd326bd19d17221344f83fb6daf75bbba7599620d3c933fd31ea183bc49304ff5edcfb84fd5fc92bdc6ae8fbbbcfb6c2e869e6719ab2acf33e5d88d2d8fbde3eebcd384a2a3d1f0196d8573bbda618735ab108b086f5737babcfba56fdd1b89647ebe1fcbe4e0bf71485605feb3986dc5efbb3f63775d21c170dc52615c5a6a74e47d8f8154a5bb1913206f9236ce2e66fc4108160525a7b8dd9eaabe7bcf60319c279add4d0eb5a7790d7522aa94467e4eda994dd46effffe549bb24c55c229c28a8d3cc2261e71a3d250a878d4de340788ccc0fc66cc7daf7c471f2b2f43e48149edff58e309bbbd954b539631014412206e98602245f5c3451d80ba7adc739d5d577d2f356559c6248a88037362fa65f61b7f5d63ed36106d60f60871ff96de7a6de6119151f3c4307f9c719c11de3d46c593c6dcf7ad7ceeae2b14220dc47d75d41fe27dfd863367a043c8a3941ef3cf75951b0392cb1f77ec5156ef79a6a20becbee7dd76f219a5f53f1b406481fb2dc71877bd258dd4ca0af04ca7b6b5efaf6f94b44721a2c0dff47bfd6bbeffdac8411189d1e9fcf8fb9af3ed95e2b94434810bb9e510ea4cabbd7fd7954802fcebd9a5dc764351183d762ca5e75a5e8b25c526244460507dffbcfb573c4d3d75fa59864345f4c5fedc46aafdc6fc5b696704f2af7b7b8e21854e8820f0a3e43d623b29c45ac26885c88b4fa7bf7073396b13a22eb2ce79464cbdbc14de9c653829edc4dd1840f400286ff67e479ca39e1e662a440ed0facf1c75ddf6f74bafb52a206a40fed556692fed1c63adb3e72930440c9097cfeff3aef14668e7e7c272b97faf7652bbe3cc5bcc1e21dd724b9f3dedb06bb135d752567b33fdf5739ec59f73d6bf7d95127a593716926ab929a717c66fe3d7574c9afbeebed77ba5fd305b01efc77d42293bc5b6e705d05c318637768da9b4b82aa0d36ae9e4fd6e9b7fa63401b26a7ea5c49ddaba7384088872d7cd67c51beb5921e6f1a22ab684557e3a7b9c3b579b6d4c9c76626361213a0085d4ef3badb53c4f1e21151b9e9b2cbb4189a8f877d3fa35af78d2c93ddd229a42fb291d254a84104931441445e9a4ca918289a038a9723c4f693988baec10da830bf25a7808e97152e55c89c243280f1f1fcd2344280b1c16b81216bac20d212b9470085501ca284485184253d0c235d4161292029050145e0841a17452c5107ac294b1c6d97da7bfe67cad29cb747cfc4e96e1e004712537555251b2ece7a4faf13c369ce7dc046d2b4efb8d47e3b9b9901072c2975c5e7fff87dd63ec3d1edecbedb7afba476e879a702bce344fbfa3e59c637db3448809d44afea18f787e6e25c5a62cdbbdf4356d93c224b4045ab1cc387e19bbdef87f53112125f48e21a7dcfeccbf97309ab24ca57fb20c27cb0e7684478920bd6d5a8692502584844ee795d672c8f186184b2e89d0119408ddb14346a83bf25fe58d35631d3fec382062a808d18e2ca13a4244b05f5fcb299cbc4708ff265273034343b0f2ef1a37c5dfd3e171f41042ac3b87b26a3d47f7d2563a73b7dc46cdad1c527f0ea9fe1c4ea923ae7174aa21d5dff64caddc740ae1c6d8adbf70e33e37a53d08726e7e3bdddc47e83dc74098f5536a39b47f6a79a1fdc19e15d70c25deb67f3c6350c807537f5d2395704269a1e7706c9c69eeb6c24aa5f711bfd16fed19f6ef2daf747adb83100fa68478cb4a6bd51ee61d81423bf032f32fabec114fae6bd581e47dd27ced96d5df98650e309f79cfbfab8f12568edd88dc7e0a7186b9db7eff6fc3eeb9e9b4f1738eb9ff4f84d8889ae23af1fef3f7a87bc4c1a6f5761ae3f632fbde6f806dd77dee19e586f3cb1e45c80653f2ae2ff511eb1d799d0808d5a057cdb78e1a5a8f6bbf34e8df434dfbcdb7fa1f235fe3ee5ee5bc5042d9f39eb83b119a41bf71e33bb3fcbec399ad0c4231c890db6fffa7bfef1cb9244008067ef688fdeeb3734933ec2f88bbfede31eede7baaf776419594c30fa5cfb1cb7e6f0ba09dd75fecb7d5f1db0c2d2a422ce850ff4d6f8497ce8dbffc406805b2cbaaefde924a6cafff2ad8747699a5b418c3ade94d41965ede3dabec917349231b2114444d6d96d2c21c69b5f082113a41c45d7f8ba5ffd57a1bed172113744bf1b73febde39a5df97a0da0a3dd65c768afdacd48b100966c774d27aafcfde66e9bb94075283f3a9a3fe32faecabad1789501a157e986b9efbfe6ead855984466073b53c632dffbebafe8c45480431d6ccf9cf9fd3b9efdf213472b47eee5df5fcffff5e4d591602ddb7a7f7622ea7ce796b5396a17a2a150201f435dadae9fd57daadad29cb362765843e60e39cd55aaee5f5fe7f6fcab231426740334265503fa3be77eeeb4d59f6c3b1f494a7622120e4811f61dc98d36b758c3a625396dd843ae07fd652e65ae7f7d9d21be200e692f7c92f9e36e7babf0d946203a3d8c01d1b08c5063ea9b1b0086d205a7831bfbee33a73aeda94653a213234d69fd3fd71acfdf31a9f088dd16ddf76e7ff3fcd77d36a80900636de75d289f7cea62ceb364df5732af594ce321c2da10cd0fae3957e729ef5bf369bb20c6715c280f693deabfbb59afeeae1054217e052ebe8fde6dbde5bfb3765d918210b50eb7da53272bda3ce389b7c97d23e5242158830e3d9b7a7b2dfedb72f410951a0df5ea3c5127a7ab1c4db9465abef242446ec36ef5db3bd38729c532bad88d004a4a598d7eea5a694f7da4d599624cbb2ccff947ca7734212c09f7f08bbf7dbfb2d51fd8473e3515dc7022314469ef24e88f1d557cb3a2f1891e35b35975bce3d2185a62c43e98d6f5e4a962d097db1bdb4956b6efdd4b1b1627344f7dda65151adba5f5252adbaef59968050046e9c7f563ef9ed93634b4d59562aa1b64e55e1220401fce7def7e73d799f196a2fa084ba083de052dc6d9d9bf7cb44c801b75b0db19f1d6ea827a5a62cc38992659c164d335955841a1062c04e888b1965af9d625b79b67ff7d016ddd73b6f8e17577dfddea62cb312d28246bf358553ceebb3fcd894657e53052094859cfd7fb879dc9ac20e61b7811016d9ce0a7dcd7ef69ffdb413085dc1f3a799c6bd219cbce70a84aca0f5fb0c39bfd35e083db4ce082d004aaae985d976ceed96500112ea5de9ec53d20da7f7a85002aea69cd65829dfdbde6eb59fd2f14564d94d014208a8d45bf9effedc7fcef5af2267da2bc697e3ccadbdfb0017c758bbbe515be86dcd54dc6abfe4b94a2d6b841b4f11ed95de6e59adb73bcf2b059d90e2b923fcddc61d05d7bd432b65c7fdeeca2d14f7f2ede7bcf0d74c73aea12eb5538ce1ec53c2dde7a47b64eda3a6d667e979f577ea51b18edf576c3bc5dfd63cb8c55b5fda71849d7e2ab3d033aff7479f25f6356e2cf43825ffd9e26ea39cf50afbe7f8a1de387adae98c56e091da6b7bee315b9a7315fad75bff4cb19c3ad70b772e2ac0aaabb6b6431a7596fb4f81c38a739cbc73b9e3fc5c0af9625d67b693f73b29e551b0fb4b4fefffbdd75cbd8642a5317bde71b690572cf313fc85fc6f5a21adf97b7e9dc039e7dd6b4ef1eddad28bc7ff39e22e398fd7fbeb6d132abd95f3b8abdff0636b9930af9cf6f2ba2b851dfbba045be3d73b5ea9efacb45725709ceba5fdda24eccaf9be9efb6fa1afb522816a2c219db2f6de67f447b8327b19edcf9fde18f31d9372eea3e658726da1a446a81566af778554fa997911fa85b943de71f696663aed98bf668f3fd7f84ecaeb9878d73a63cd90f76a8940fbc4985f0a37debeee2148e8a1bcb463d9b79e938e1a79fe9c66bb73fd1fca39628d54ca6b3de774722f07d6f9f3f8bfedd056cce3e8d9fa7c3fdc19d70db710babd9063d9edecb9df1c83c065d5f87f69efa79057205ce86bc5bc7a6b21edf407bf5beae7e7d56eb8a184445c3e88374e5b29c6345f3c778703ca8ce1dcd366ce33f4d69465a953c977fac8f506c7b766a92fff7c5e9af1d503dba1fef4d39fbf9f527f1e60ecebbe30d7ca6b9df8ef20779fb1a697672c65fe5d075957a861f733e22f2be539f0136e0de3a437f61d297743f78f27e7967fedf5cdbb8d4b73941cd73ce5b4916b36a2f7b6ef7e6b86146aaa71e03fce5bdf4f67ef5ff27c037925f57e6ee9e5f69a631b5cfb35bdde6a3937f5fed680c7be65deb577bfbfed970650f69c79bc7ac635f28db16abde1e7f8773e8359efdf1af7bbffeef85619c4a9bdb4355aecfdfe98c600eeaaabf7f67faafbce30f85142b825ad5af71af17cc1f69a7e9d3f9676729ca50bbcfc9c7b2f3bbcf963c9af16fc6bb9cff44a783b945aebec8b0578472971cc7ef2eca35f81edb8560d6f0d9c45a8347169c59994c328c610020061291a0100007312003048241e8dc582d1905cb691bb001480014c8c6ab44c2e954983b11c85411404410c8340000084186400214649c6b207a5e84a4baf2e4dbb773186425f343b46284b55f1c9f21b886bb008b38f7d08ac36da0b9b2ddcccf4626a462c3321d4c0a5e907996084247703f2563bcc669aeb9d820fc2d01f4f3d2ec45cdc4b1dd1addfbc9d4540101631ed342da08654c64a3cd2aa43f32a011268a733781105e54ec87e1012ea6a2010a35e4dc1e5f48590b21f8c13d7c8d813cffa9761380a90f9ade8e748b6fca7e817c810bbdff1d0c0574eb00664067eee8114798bb792fd313f41cc0c3ffcb6c0c88d100cef1dbbdf2e2ea3087dc36a3a3bdeb0e73c199b6325f1546c2864b24bae768e9372faf7db8eeb0265e490328516ade0d230a22bb277bb6ae45c6b4936bc946b895e379b8c516fba82afd5d83e1d4b92286c458a7eba4909414a92a32ebd161e74733df7192d49bde98f25774a3e18c401f59dea3ca4021ba0e18e660a50f3212a7db52534d9cb47584105ee9269629d41ea95899d4c0da4657b898e08f00f8bd7be30d6516a27b1d2a9d802ea16929b27f190cd8f2308d461c755516b29724404d358113e20573fb7d42feddc2a0d2bd3d3361896ab13ad0c8a1ee4fe3f8cb792ebf2ccf73c6f1b9ffffffeb816393df14870b5e0ffd1731d01b43925847d740bd3f3af2fc2ad08a18b72d456cf59bd09846a598ad0314420143a9b6ddc9f8bd0eeed0a8aefafcfa6368e8b13f762f7c810dfcffbae72e179ce3356119abd2beeef63615dbcdfc8a4defccf5da55f44efaff42eff60d9b7c952fa11b1f47f94f3db7863678a40c898bd08e76c595423fe4159475df1c41c4df7131c99b3202107efb1818a0134eee626fd50ac14c4bf2e88d5c4b77994bcc860f5e083ded4726bc2db8c356f50c6dda8bcdf70fccc2bfdcdfb0cc9b9decc4f9c71857f9f8d0f4594810f4acbeb8e5fa254748bdd4a12e1188f6f0abcfe49bdab3cbcf7d81aeaf4beca0a1f2872e326a95bce12184c68464aaca381a13d2a88dd9a93c9f4d388df0f93b14f5a0942a1df1af61d6e7239685210eeec32e95126aa6fdd07bf90bcd60faf29bdc2005231873b8ceac2fb8766853079d8884604dd88959a2492d67c44ce0a47b02975e59bbb62a27cd61eaf32e700e5be0700e621484a58fd100cfd1cea9845443f6d2c43fa204a10891952715d05a0608ee588e839ccc4380b9907e68aabcb40e5113f65b94f97a280a17a5f17613a6aab440a22f57b8f42b682d832f5c3bef15a77e875b65a5946853250a1dc18b94428a0d292026c066c91c2624b707e6a72a3f10cadf55e1b64500427915942984ab1c41997a2e3cf43f173f57a3101adc9c6e539efbcff33a303a9687038eb31a624a2134339de4d6a6b430666d1b5dfd8d865627031d26c678371bf463d0b0ca1fba37145a1b12d15f33c1c58a7c8d76d13f31e7c82bdf6c7b535c40fac7e24e1b3c4a752bf4efe2eea1b6b9f277e29fda324df57c26f6028e21cbc94f1cb8e15e27ef9dbe0a20ffdd4885ddeb81ca9cc7b9f0c4e515316f569a725758065e530691fff7b3e673f83288686d032ecfec2c4d96dcde4c8cf4e4f0094a6ca7c34bd45bd20e185aa7bc44d52f3681dca9af9c7eb68e54b0b60b99a07ca669db7a10242b8df6a05bfd16eb69f0e77619dc60968374c49c7da6877fe1c9208d1681de868345d851aeda6f1aba163c4dc68d6a6592e1b7354e6f8d6745ceb088e4e81919a03c1555d44ae1e8ca68616a2e3c649d11fac461f60ec5d2fc3d31c36dbbd9a4536f483440aba0681664f9e5147bba825305267770cd0af99b6ce0dc9617b21fd429e3644712c12e3183d09d848099612c4dce3fce6aa2da1265f0e4a0a66af8300368ffe9c97800e022540a822bb5461a2f8f1f474bd416453927ab2f25148b24e654690c6f7472a066fcd1de881d6898a959f314a8e827fd4ef6f0c3ee6c4317cc6b5b8806724fcb17cddfe18ae2bd3db821f2501cc04b9e334a6fbf5a85e73f03a84f9fc9f22601b5e30feb1fbfb6eccca6697dd3d7dc9caa2a170dd5569f913b3c14aec7e8688b5248e28796267978cb8f1d5d6ad5127968ccca20d25684aff17c3a3febf7318df70d4d95bec770b33ff58b1a7c83745e2bee8a71297009acbaf97e970fda56eb9f0ce6d89b6eca0ebdc6d8343c93b35a36c472b129e9b327e341cfac8dfb19a9dd01c09799411f36e61dd1ba06b936d180679e2d2e1240cf432f88fd4e45b932c2783b6b92256a49747f23185b9b4c8204ce65bc7578d1de21e4506abb690dc7160f788718a6a2c34707838bed73b046e50ea2394707299c139a34230370cc0ae85dc4cccd1a24a1c7ee6d51928f44fd86d2ac56c37917142f1d173bddb6b9660656c3295b27cd63824d3e6f1682ae81de04a80e9ecdd3f1b96378ada8903d1335d8d60c336f8a38416b2d8bbf11709308fd6b0ec4ac293fd72a4065432d0dd53fd9323003469b7e20bc8e7f8b85bd768eb7aa061914420cbc788f8f9495bba5783af4d6c111f377de5560e2958cf66eacabf1de921422d40d801d1a4f6d832acfd62e2cb19a10f7753817400ef10344ff79077d52f3deee9e8f82fd5255c3fa37237c5e5abb836263653995b9b7be5da891f8b8cc8a44f8e6d0037956ab689ff1ab6624564e14772dc616a48062f8cce7cb323b92e3bc8d14d08616b025424c7e5e600741c9c4b2e09fcc1f6a70fd9f3c0906a72d3975e0f182bec51d200051f45a0856d99652e048876622e0ed5b2c07faa1888c749ddb9cce9a0391d300c5e94e5a49fd43560c8c2352ebd6aa416765b58531628145da39a7bd322605cf2f0061efced91b802e63d50382bc7d0856abd4f017813242b602f534a1bb4f03e90b9d413cd984115931088e805d7c0be2dbdaaa90adb341ddb1d3e801531ee124f332f53ae841f701089710c1e2ed219d8e4c863448a2f67ac4e72634710422847286d48bef2366b78f606ef3aed1ee3f56c2e44615b294fda7275833991081c525e11c4bf6e5f1d9fe5f77d03f76809872de4be4927593c6b64d0f554a3630b2277ef66cafa8e39cf6f7702ea0add7c13ce53013d2cd1ba5c8884a7483a426264dcd4887ff6d7b07469ec651d060842b44afe989f25010c96471a4df8948ef043f3770d3a22f421d61687e40774ec0d452b537cca76e657f0526e956494ba992b8b485f6aa22f38168185d158d23156b0d916bb8c5d62544d67a09aa92bd41b10ddff32922af77392dbb4c1f91863141b921ed0959ff2b53d1d8846f48454592b27206a3f6a4f04cdc1a7e34206f68108c0fe73cff22f829590ef3e61758a4d20c1b64e8c361b2ad539d14fb779cbe4d921b6da26b605eaecde9f5110ad29324faca5cf79869035924ea917f4f69625f55bbed36ab94fb16800f3255f353668565700a617e378e578bfdb9b19704c5ab5f6b67baf2d84c12b49a736f1feae2feb7db3d462be6b09bb09d0bb18c871333de939497339b017d99946dcbfc94266cb5e6deb46f53b7eb2deed2f642df66f5265afbbdfeadab977eac94879ff9a823a0fd0b08c9b2beff20e8a3e947e29e0a69047b18fa24e4aff947ba1ccb998385d6423c7bbd07006607ad4946c8722d3fbe7440dcd28371b346fd4346cc72133c14c0a9a9eef6c10d3c3a0e91be86ceaf7e7a60143b0c2fc67094ce811be0fd783cca5162bb5aec0d205ab4b2d506c91926565962ab4badcba45ac71d28c02cd9f3f62681c212f8512314427e895096d921ad4bf51cee2b3fb2d8e0dac0673529ee29b425140d3904490761043a5a5fbeaa8ec53ff1a2b47caf733653af4e95cf98efe36553a723f252d94b60ee7495096518e8caa46ec2ffc67f6186dbc9b73ace2ebe60ef4e14e6f15ceef95534dd4201024ea757bd9f95e9796d1ae33d184e76e93b9a5da10ddfaa63cc3ce799eb35a0ff234db89946f58f31b0b4c4a42e6ab4aeb0e87ac6536d43079be3b43e32fde7467756cc9ee5c16bb3c375ac75bdb650cc47713ae4379c9509965cc8763049d4d475fe5ff768bc3ea77cc12275a91949787e2d3db165c9596cdb55d5eed1b171f3473bc80f3470ef6a0fa4c5d3cab6733768ccd76fb64dba952c95e2563990e4d442d2875fb1b48b5067973e0c490ccceca915e163804246ac9d6daa740b6e5eaea0a0ff08b2791e596c3d2384236580b9f39b1622c58cdfed790f726071c8cb872fde1fc83f5d2e0b57b56cbb216a9f17fe08a9569413f61cd7529876bbd6941b80a553de28ce35a32409d412b0507d24f63c66fffa65321caa79d3ae7872a56155de729ddbacf99f39b485f3451b618d689eb5ccf3d8620741166b41bc1da3406401c9d1024831faa2d95e0c6042edf66c9928107ed3ea82b80783ba585e56eb5592bcc04234f97b6729ba6050acb159a186ef2b5814c248c0a2cd346c728fb0d4c7fda47336a1e9f24035bfbaf506a2592ab3ec849db155954846f9135ae0c1fdbe078b4b34042cf6402e21d67bdce431b8be6545a21953270f733fdf6cd5950e1132c841290bcd96913cfa0d5fb1bda346bde371536ee4e44ae27c4b42e53817dc6f9a291c4c8743695efcb2ae4ef2cec7a13ae3d5df1414b19005dc13d56a86a8403119f195de5aa47ca2a3b3533dd58cb15a8f8edeed650e7e792751da58225887c046ae3daa29e6ee23aad9767029bbacc1a923fa2874be82523c4aea85ea5a44dc4defd03811863f22216d4587a43be03a1a41af2c3985676b39b31d3ad452f36a8f651337268229c96554355c3bc5082169f04bd3eba4cbe19a48988f3bbe2697407a2d280f0b3535510f5d645070ca24e1ea0c2c2ccc89383bea5a2c3e719b84df9588283ee8f049f08fa2582bab5f9fbec701ca3e96c7281cd421747078242635ed6fb8b5eee90ee20e45d88e278ec811c6e087b497adfa6f01cb4edcefcb4cbcd96768010e4896083694a81309234e4d3d24b735eec2f184a8a1d5e4c7617c3bded87014fed40edd08b43affa796b16cd7f789b6793c4bedb4e1aa5c5aa49cc1d0c3738d1d341d0f80e880d5402ed72c8cba15484a8147ac5d02e415e06a54288ca41ef90396897425e0ea52244a540af643eb4cb909742a918a212f4caa05d087939948a4054cc30f44a401723a4e5133b5c3dc42ed75e8202c804103340770a6962a84d103883082164e62075520d754119ba8542c71216613ada9a2804e4822719eee007117b28e53a207327e4ab653afafe3423f801629f5d80931ebbdf1db53c4788da5cbaaf221df02b05be8720a38ee74150c4404dfaf6dde58188dd6bd2ee54ba54d43710bd3511214cb5b4ba2d9636c94b6144210ce99851d56215e5179ec891329405aaad67b10b045f3b80ae79d7fc4583acbbd8983eeed4f2b5f46af105a48bcc2e035e4a7eb578dde935c0974b57dacc2bd661d7be4611dd383dccc5e3e3e45304b20fca6e30eb109b622c32a9076737c83a944d611639eac1d80d643dce4a962228fbc2acfd28ee5129c8229f7a0fd9a8291bc56c43ec8db18649399c4d204b50f68559db510e6313902538fb1eb271caea9b72fda828633bc8ba3e3540d6a3ac74a7506223eceaee61fd265e28c6a761145cdb2b29e17a3c2807bbb3ea8325231e105c9a8cc02e5a243cc89841d170cf89c25010e655178540dea84d3915efdaa6c74bf99af6775bb86a9e02eb96dfbcca6b27d4fc72002b3481c94015b76d551e4771b7586cfab3b0a5958c2c124256d170899ec46db059b04e87d358d6ce8441624895dca4c8e117f9c40b72549d9d1c480bb189584054e11b786b80d9e543e87d37dd888cf60bb7d6c5ea23a78c58ce1d3d3fa90ccb5e4b1b6aff0b947d576aef7001ecc9e014881119df5672e3a56ad1b1d4b541a1e8e44aa2c48c0cb75db46ab03c92b667a194a8292e32d6a55675f5bf9cb10e838348c16b4ee8ee31865bb0525b01c61cad4b7a4c00ca170db011f3056ef7d2a9cf1117cf17a54dd9854d5a75755f97ea5a012b5daff5403a9bb27a5ce52cf500fcc4209aee76e1e881c3ca65dccf0c0256cdc5cb33733820c1922cf2c0de74ad71439c7cc700ed365a9b80466b86ad788709f3c0df47df32827e3d43e0930066820e10ec62cb015588cb6d970dc63c1f624904208121fe89e5874552478d33c3539e5c9e384318aa100c8fe1377aed30abb984a9df34bfa19639d02e05a61804625ef4a4c3304cfc202c4f283a6fe10c2024a5411a8a5261a17bdbdbbcb4149298850eced821602a4804c611ec07f6bd22ca9151253c7999144aaffc4b8ee9d220139deb787e6e2397008f153a7f8657e063d969067f9870037f90a08abd891e595cfe3fe6689335fb671435361907ca5901c620bdd72e7f2093ae821ca231d192aa388f134b8fc65c0deb56416b3be01f314cacc52cadaf64de5e402d2ca1ac11d1306b9a884aac884e0c035cd89fbbaf220a149c78c18abf802561df182d28208ccd1965333f559311be7156cc7e6c115aef44fb982b369ced12a1761e43e6917b5cd7c6a8be51468ed995e42b4afb1c5e390bce4ca88fcd019551c533f4bc94ce907791d4549db1f2f69b12048d53a1057c2299354d719cb5d2a55a218e0900962173b63518f0ef214feb70474ea6c17c9903a5f95ee475074b5699c278bfb4f205450b70fc6dbecea019155a4004ca7d77d1656cac4c0f58bd6d17e6740c4970ea09baaad5f51a479019663732e40c079e1bee21db47d5f3f87cbf57aa99fd1fa37893df853f73d16f31b62051e17ef5e2422b7acb67dbf2bb897deacaf308d48ce93d0ea62bfdb13a556182d57399fb3e5f915d82b5fd243138593d433556ad2dc414c766b35439efbd778083b3015da8285ff019c5f8ce9ec1c5ac104701c3056052624eff2174b2efe57773a7f05d54d5126557fe2dd6e57d258184fe5161990141d84f75d52bb6ddcde9344d9b7ed5f51ad16f25ae67e15801a9190b9070b6788d0ed5a803fa4d0f04c2a6686c6eecf252560889526b74cf027ec65cdef8d3578d36a04d75ccef31d4911baa4aaeca9f0c89f6f2ab818ee5eefd6047e622efa3ad70fc7bd1fb47942a64ce085dccb5cb50a912262bdc48adac52005f50dbd3b1d69e08f6ba2653dc09c282cfa0fa19cc6065ff5e75c7e963a9add3bb78bd19b038367bed94aaf6fa7c6789ff77d0183dd284b4cba069e12efbc36c03066caf7241f1b72bdeeb28b864fdda8ba9796b3c6cc185e7a76abb46f4a165db664e073d29249619d5af5935ef9c9492154f82243a9f2f466212cbd030abf72cd91346a405fa790d131b3f763087a13e55ab9683d607802535a71908e6709cfe89116d5af1a4137652e9ecc374e9f2a0fb7bf060572caa0a0fe55d097367ecde0b36ef30cadbd3b0e5619d837a74c96e54e750de95623cabb2b7930db7231c264d41be6cc02c0d889efd9e7ebad53c0e415d66f557e70b73a6305d97cb7c9fe79e3b868c58991ac030fad5fd0e96e8e42317b0b179025e39943fe6226b94dc488532b99eb0650460dc07412af3213a4665eb9785347345d004493ced526e8a30c008e1bff16ca18b164992b1f275ac201c6d1e559fe9c928200e235c74b21b90ad02b16b284734f2f4b198488fba7670bb61997e923cc3d74760670df3563a2bb0a2ebc90984f0117bfcadd0b0349ba2994175816540bf429ba4dc3ce0fcc5c2a23a37b2dcad2b27a3c85e99ea2e45c878bf94f27d46809ca75c54897c22f2cf9146baf0738788a6ad97ac5d1bb975036e949e0efe2561c20d83c28800b9d1d3ca525aaf3436d387d73590bb2c4e3efbe79e233e7a333e50c639ba07f116fee5f6f20c1e9fad2815d848c89289677525fcb9c21a662bcb7e70dce7d688ab492a732500c526b47c7068f59e2d1cf60bbc60b7e073496b7a5633e301e18bdc2f9c1528b6e4c50bdce3d0699dcf6b50a199711cea0de8b060c894fc8173de47e4e9f39f8a11086ee6948333ed7a1dab80e7254e963eee0a4cd300279040c1ab65e87b748634cc12d95e90d1db63afdd4a2677c7941dee18c91f2d60b925cf036670d85b6cf70fb960d105ffc4851de55f05ea8b9553f501ee8d4b8ff6d787f32b6e9ac1a287f31e4efa31fe3b065fe8580d8397f1b8fe7a1ce09c3275897b64d10f86e82799cbe34a5030e12b46f53d7874360c6ca23fe5c94c812a7af117f1ebcf81c0ba8edccffe3fa11f304cda6141f274dca1cafbc92d3ad9d9915d2239e5e23ab6f98d5663d278f57a0897e2a44587716e7ca993638decb3a9b46850993c005ad0449168d7714cb4a4ddf8f21590d1325843cf60ed1f955ec0edd5cacbba4fffc6945f6c30a5e378593b2d291df7d47eb48536cda03903d8e11025cf14c31309850e69da5db39fa66486f86727adcfaf3dcfd3eebbe13ae3f3f40935fd0715ea8340aa8ce5462c2384d5bbd97380fe612a90f572ac2123f1652026d168277eee51977d8f9ec0bbef5cf41d7f0eba7c33a1bfeecc9a375e0d3ae7f2a87e82ced72b3cd523b58e7fc8198d5067b23f1fd3ce4f4efc39b52a71e527998792ff06a8afa95ec28f113ff82fd9e9f078bc2bfa1c2fbb35441d854a59ed4ed0b6979b51fa850c7bda0ddedc14eaaa5dc26f9ca8780dbb9b023eca119d1105542e50645f217ff00838f4d901d22cd8dcb00c5c9e8fd4b66a6a4878c5501232249d138836ad0d31b9780b2679a915a65537c2f564181bedd77d8a95c7d42a74754264f8a491250f38adb64bccae2778cb269fc8c6d8ca991dd15e5812b174e1ff9ccaa7f63963fee46c0e49d63386a16d850ef0f40b5569a1e931292fc329cadf3f7152e635a1ffc6239c3cb6cb8d67a544dca7d6d0d7d062afb7b050fdf800da9be294e82c50402749be5341dee9fe9cc6b71f98be7a4d6c0ab4eec780e1b6a8bf9799d540da005b7e28ac067b13ba017c2af50b162f4fc2406e927427fa761b67b6e15f3e7d3eea1d8056f61d51cadbeec76739ffa6b64d9f25075638fdf5f17a9fb9d61f208f580e350c9fb53899fc8bebf7580b788dba697b248a8119251f5061ba614469cb3335f63c1ea128401420610bfd5e211bd86ca202abfa608f0702fdd17d0804f5094782364c728001ef3dfe78d07ede11d6f1f49eba3fded30707c3a024e4fccf7b653d0d4df627aab87d6fcb011ea1da6ebf2c3cc31d6f25a9d2356dfcff531bafad9f9c15069e24f4a1b186f8d01e3446dd7d542a9c690e3adb69667def8f147e99c0f85452fc37f31f8e6a6622cf58f787740e44e7e81863e9bf5d3102b66292b23997a74dbc6f0d830cc221be41e81be594b153af73b58b34663b957db8f6c8bfc64c89a619118f9fceef93827118bbaebe17dce2273183cf7a5eaf1bbfe2d993649a7021755c302a74a2c134f225afb3d08ea428763efd5fbb3626ffddd45dfb59f6bed167ce3fd5f91e7a9d53a218ee3373ae703111c54404e53fd367e825b89eab7ef0903ad8bf617f877c3372bfe8097f9b71b643cf94c0f94671f3d36775a63fce5f36d6d5bd0675d9d0f73892eb9a04bb261fdd6bc3554bda6568a7a31bef3caf6ba6db9d4dc9759e6738e26bee0790a7250330f67f863e433917fd91c0b56dda19893a4c1eee01d683c54e579a79c39b7e377d04a21ab39dd8e6aa2afdeee8e7c0eabd50afc3545107dcc663d7a17e958e5dd194d8d38b582cc55693c89513ee2713813356da0b47d9043c38661a89c32a5ca2e2bbbc45a7883f9976db1476123f6aea99f5cf881c8935ddf4f6d1bf496ad94547c8bdc9d7cc74ad31fee869ef6efb61687e216eff660a0ed27ce974192bd7f0fdd3b79964cd919ec8b599cfc6f07a33f6d8abed273d51d533f6cc113b17b5b8eaedd2bc93d5b7c50c917bcad499eb5f31f9d26bfa892da3bf93f4b20b8e107bb3eff949ad23ded195338fad90ba13eae8bad4a0a541b881dc36506d86b341846db86bc6b506546dfca859975d42e49de342fb718bd17c15d1c75ce170769709b67a10328ff471bd764676473072cc5ab9b1ba0d096fc834665b3f1cbf938605dc241b64ff99584dd30273d81df52fe758e02a0547ec3a1acf1bc7e0ad4531fea28b3336814e326144109ae2c189e3b0a62db3fca2d921c67fc226b26f16055e537a5b88679c10633d0f8135143e9b2e8b672f30ec841defd766fa955685cca188e448c3f82ed5960e84aa9787e1145ba19bd97d74e76da1ba7fb9de8d0ec184da7c0f8a20ea2ca0a7b51d5a77786b71defa251674eb089401d7622c4befea7cef43d2d734fc2854cb30aacfe307cdd868fdb29841f48934db6ae3ed18d1b36c1c05e38049b63b87305e22100cb34b383b67f068d3df3b1aeeaa4153e451834d3bf376a81a8ddec8a8c82c4b6c6a56ff94c142c1727635b45004badb22592a85235f9a6340d8e1734a6ea432a0cb0e2a462f6cbfdf11ed7ac2e4a73553c304124efc168df4cb76c620dfe131c8c329425245c5008306b881bfc503b76e508b8a9d0255a72d64750b6fd2c804246bea28b440569e48ae4d776905f0f5381e4357aaef7b301e1dd5759551703341051804fef7619da525830ad1a6d96582bfbfa0e53e82778c2849d581b36867b8f5962d712816527ca2e9ea456cd5ce0834b1e818527140c59bd0bfd8a30363411fa39ce54f029b9e07ea1453bc94d7f502e5cd14e32f6dbb8c28b6e8779a3ac6d25c0d3c8cb4fd4453a0de6ccd026d1388702191f60512567da2a4c58e552e32fcd858c26c756d2855c721fb53707c3530399064d317894a50d51dcb4358a69bca0258a54b2d00298804dc426531aec7c7ec3d6db78ee680bfcaae892ecd827df6d433a9f3c020c83a8dd08c4b689f9e876aadfec7f0d5112836b9dc7dd6144551ff2257d12c54b1dfee77cc83ab786c0e1487eab50fb168965fa99f89c870f662f284915e8a92cbd13b0670b13e099df5ff408f319d6637ef77f945f7136de9b9793f64393a52cd0d2223e25c5fc3ba77bb8b343dfe81be7765206a6418c76988f1ecab92133ba458b370f572bd8a32b02739d6c070c2b01359171293f1c81f370523de63ff099d4b676d1793e992e5246372c4bd7324c2686f9c8d57b5262876855793ab2f70fc0a884c774e9ec3f35b96e3fa9ebe6174318839ff2d41f482aba8b65d5e0e7c0a8aa94cf89bd75e119adad3b68c0e19d3b2879cb1cbbf88f85ac092bc6d68d106b7951a049746513bf5df984b513dec29387fb919bade65b73b91aecbc8ef99dd2a6cc1dcca60b902d69378395b8ed8789a1d68240d794c5a6edb6039ac041a1ec5377b2140e2d17fcb1f14d219f6c07f7570d7ee6c214d47f910f8a978efc83ab8dee9c4750b497ff4e7bacfe14c76f39593c0ab0d17c452ecda0b4da0c685969737fbf789270a2b076b35f032d31235d7c22ef36b261ff522ee74c84fe7f61f0ec51da8b4e3702ced1072b16baa38d5fdb201cc8b9c1aa1027378dc4b0f78f8c6b4fac28bb45aef95fed4b193ef71f184ff4190adec898be568b03dd61532c8eb6ace2999b7f7a4bca5fd58f14bc87077191c65388d0fcc312b77baf78386318258b14bd586cde2e47110936b0585b9cc47d2bc7a7f10d92feee367b2fad110d74d3cdcecf0402150f3e59288e697052c0570565ce3d8c08025440e0f2cb318324f636e8ba9e36ec66d82dcacde64b6b85321523f4321fab13cc7d7e0b82a9cbc19945a40610d95b4395537ec95adae98252f7d24ec7a41ad42499173efa71b7232be33b010a64280e9ac05d0dfa0af052d943c25114029a8d741ad523bcd9e96a44ace936f492f549fa6d5ff1bce77e67d1543e86b18905916854f1f95dd43f0b62e46350b532b589d8338d7c790095956dab88cc90cd84674e03e8cbb904cde1e3ab2d6bd97e8f9da08696717736abbf2b3d387c6ee9edff09fcefe33ea82fb27d8841b6aa6a3fbac33eb9da8d9043906832dde47bff7bd4e9f00c47a545133e28e7b1d481c581147e3f5c4da4abae8cce0b849dc419b45d788bac1d7fe194b0618ce301a7530b343f144dc2bf177e3aaa03b811c72094fedc967da5de43f370e63d99b1c1e8860503d197967abd62158e8bf18bc1023b5471ddd8011aabf45694c8f08cf27e03e20be8e094eb04a705b7a8c6ecf71130b964e0a8b710b48200a6425236341820a6de6654fe30e4fd8cad4342df56ebf9bfbfa3b78c3c5615458c80298fad83a6084a5a807cd51f2e4f42e83f7d6e90edf00a961d77a4902abd108ffd84cd76a7c921c5fa730e74641ce40ae96050dfa7e466e1282a0d20da3782098fb905312f54e0b109521e6b9370fd0031a20bd544b5616f629885edcd13241d61b50eefa1745dd18c501966fd3b48989540bb5b1de25462cdbd45353a2fe7030b6fd066dfd0fb0d5fea33b12fc3a632f13a821551e5cc27a695cf89bc483e01352d094837b3c50a65a96ef2f0b1a7f4fe100179d9ca8beb1793b1a65eb4180c74b8d2b7c3c01e2a8554ace7b20613b24e4aa3b856d386cfd3e7318ea108097a8c97699d0def0cb8b62def6231170e8bca3e51c198093e7d9799dd2adcc4c35995dc0a39e66459bd5afecef98d85c86d9db7a82ca9eb340c8a318338f549769da01756361c6663105987f3a740694d2e4c822b180adf34a8bbe4099dc7aa77905cd312a7ab828a97852e2d8eec16aff44fb618c3bda8d4ab889216961ec4ca7e1264c7f5d32d3a26efaf424a3d9a4495f131720ec5050f54638d23442e5d6f136ff5f893e6ef3b3d28dfad7fd7cae8e8a0ba2c93a073851aed5e88a1f91beb8f3afbc0e92a180ac9f98e35696e67b88ee43c660ebf51caf729a3e771942fb8e819f9efb8ad3d8154d0f71cadc285010fa81baf83a014ad337944f4ede666c2d061ee766a7557df2e1b7b3928fafd9d0a008e31c6e10e1d3f3c95fc3fd009e4503c4e1f2fe2dcfd830be5e615e4c67d5f69355c58e230c97043abed702ab8af1788ca0d4bb45cf663ce00ec1be736ec3b43efc0faf79482062dd07c58d9fa08d6feb50319de6fe25d7be58d8971e17f7a2e0a11ccba66144801a7efb1c5b2ceab3190f23fab44182cdd0b62c2507569ee5fe83e8d4a5734979b3eef8ef432b2b66289eeef77e2fe8413dbd720efb20bd1d0355f70cb71e3aaf5e2b388ac9f5ae3e2b8ae9eb108ecdcc2f86c572cf5eaf80810637d2421ebdf80d6e63c064b1011dc59fd2c08343efe6f88f9d1133b58991a2a87a5aa1dbf76eb26be09e7068009d541b5219a3120c380099f45f3476463e06812fc5d820488a429f2385068ed054b2de1c7804034cd8bb33b209fa798f6acee6a58c66b8a846e4bf4e95b164cae763ea5cabd495c4147aeed42d9529754f79cf450a61aa2b8c96cdc5b1902b0ecb2a168a803f63d2569be96d9ce2f64af09b52aafa83f42f16180a590388014f600a19a02da5824fb8f66f86d41c6119d724dbeb7214f06baef17f889765e7bbbb79e67b1000f059232223d31517585d2f47d3ceee75d1679439722a1e3854c14550473e1297011d13040d610452861e39225506d2c777467f6abfe41376f7331870a9d00d96c92ce3d620611e142417d2ff3178fab844f90ec0eda87ac23f72144953b5f06962f8b027377a77d37a07f18739b839b7db41cd62a5b971f9be17f70faecb972332a16d7863165ce1dc43ea61d0aed9a5f400ffbb1bbaa83db7b615f7c240c59de73908138ed2946d6de3f144f046404349d7962f51b13ea836e712467539e8b3861cdddabfef56bc5d39d873eab759fc690b3ac8edf77ccd1ff4dd9f73e59853c7595c39d50a9bfdf096d2ead66d508296f37144b3058b6a534c40f935e24d35a11f3cdc98d64d8ab8b213a0e15ba223317e4f22d4e833c902833b59ca4715f55d4a4674c7aad7f00a5bc12abfb943942c26aba1e976742f485d4ba9c7e1853142bcbc945983d7494e7dd8ea060f364f365036c2e018b8aee4d42909d81d69b540a1a144f6691309b0f5bb999953c6b871b8b0dd573061975e91029a29be6f2bf50aae7e91d030ab84f7a12d40907b6e23481754c1cf5ac6abe763c3fcfc00e2eea343a0b1569207d884cc03d3ff1956f9cb52a3b25224bb372e7643e4a64a33a648d58b21a21d7bc2c4c6405d40ce609d6de10d097a68b541bd054fe182d6f259458bc43f6ea23e3a02554c26418a6fa1f267489e0e043578cc06f3facaf55c429a35c0932e21bc8d8051c18d9c6f3c6621f397b76a9838d6ccad4a0cf94bdd7b80abd80b9d7a6d597ffc0ec60296e6f66964eebb1f71320ec7164fc030535d0db177b3250f71c84bd360eb238eb543d3a007692af60535a2b5cf0939de66d696575d44ae5a77c31ee4a7b9aeff5b3d67023caeccb33ff987876dc0b5be9e3ca954287369ec39484a520f67e3b7cd8d6a75b2f51b81173d5e831f84286b82842a6ed27e993acd9c8da3514ff1e463e47a21e32b2d2e7cece120948531ef905b25be4d0972444884d378f9cd8d5b7b44c5a519c680fff3085e5f5dcb5a4a7376334f21b30e02c5e34928e5579d720b73da7c7c34e3b58d011fb5f22e8eb5b305605e32fc98d953c2746ca89de1a49d8107cd9a00e749cfa84d9cabc80427334ed6208742cc0ea67e6094eaa1c01253107f871f9a9acf20c0742c333a2ab5d5d49e547b96d68d26d1e1adce22bfb2b37bf5b1c1d5a7d2e4f038efba092abace9e3d40e03244468781cf04155ba0b8b0d8b239849e99598331f794eadf09eb721575aae1351d7c37ab7fe7b416073c067ccf111a9d483c26601c8408dc2cafa62a2a34d7625bf413a8b3ecccef4fc96c6158b9a7a17a889855cbf09a8634fe85040f47d2e1b22511db9304873c736d4b86824d30315369c25836effc136ec4062553021e0276d2c5620ce8ceffc3989ffc9faf94f5a7d563b43c0365fe7296b8b92823625b19178df491d6730dd0f40ee20f205d01a9b3efb0ac2796198e9393da8fe189fc759203db41823017e573be77e4c8ec3ddd76a7f2ea7c12bfd700ab98b2ce338941cc8bfb60103a40a3f80d8be317591e53ae1241f2da01b72715aeb0f39ba72fd13c30bbd41c1d5347d363a0f49153f2c7878d3ab924b3e43279720af7de1ede2bdc6af63cd57b6fa221e0d8704c79e2d250a40989645fe3d2c34155883ba69aa071af94af989a118ba536456e4a07387dba36efe7dd5207ff677682aca151f3d6aae1ee2f0498fefb2a9ecb075cb3f9de8d0e26bde5bcef9e87a5377e10e9ea97689f9f2e1c12b6812972a5099f1a0c08d3790dcb4d4ae199bd2cbc21e58d5eb29da4e12a941cf958c6598f2cedf510bdd6bcc4bcb8dc1c4cbb7b78db6e5f334e0a1dd054beed0ee0bde50afeeb8423eee385b3d6dee8b0f1a7be1d4b15b5b42ab97ded68dea7e009162cc7d5d904d509082a26445405eb9af5dae352446de141043b21962a8ea4fbe66f1a9d5bac59b27f17c03ab7935cce7182bf373849dae0ff59533eab4e295264e61ca3f68be245d5956536d16b517d742961418151bcc6b531d740be1b0b5f062d5f7bbacecd9d8b1dfa08cf99b9acf2bf0c98945981d78179ae8e26c580674b305be76d6c622d9bf2da6af5b8e88b5504e722fd0d9d02d24f9e1b52c11c1d405c69b6c65b09e041a2538b18c9b359b9a1645cf7fb648b657d4cc3c178699dda0789f14aac0f430f552b19459f8388784fdcec533e6f9c7d3ef4fb86e92a4faec977679ae8616d5c3be23ba8f141fa685667e36589c16658fa89c07d7fdde08c833bb94f95fc717a24caa1a16cff639d39049dcfe56fb424b78ad1e344b2bb7c3cfa8f3e9bc49d5c9e30e7322ea6ebdae2c5f05f4219ec019df9636078886f1a86e3cade0f035c618c091914d261db5c3cb5287c05f4703724058bc8df0b5c89884e7b1bdd72328481537c95d18cdee446ff399544651f1956b32ae3912f3066eec5efaddfcd578f1bed8e563d044f9d3d3ec292e001580a9a7ba92d5c77f8f32b0ba24c8c5ce4c78a1ba92b472178d7b94739c519fca33a143e4c05e50d1bf0264f46d628ca6786c674323e0989b76eebf39cc42897ea23da4d544ff8a0ec8a4fb44d4ee751522ed652de048386cdf651a655fbc67388707c6c03290578c837db8f79aa37f3aea33b4a49074665196e75c97dbdac9808cf29cfd53b1f1d59fe701aff68f91924a02f67c1b3d75d68964ad62dc71bec056404fe80e96fe3019ea81bdc337e582e2c954ad8eb852b0795f39c204af63b8570ad88d4eb47460b797ef2195909ff2c792ec8277524fa0b3f5f9ef5497890338f7ced30b856fefe3ff8606da0fb1a92416629d5ba6b3f37bb54a0271918ae5afd0faa15aca23717bc2cf5ef1fb06f21b901a422913be8fc964973641e57045cf1d6339298247dd4d9fa0c391579bbb88ee80488be360e7af9f68734f4b5fea9ea39d8a527434a46da78e5ebfc783aa59969b5e4e7b5ba459d832b491b59eab717f8ba1c227b562851e26cf66fbbf6b5e9c53f697c6da00686f408568ab5dcc415622a1cfde465fe9e636f84cc94a839da3636c13a24c0b216df6630e1333512369c23e8c208f27400de1f467cf8996be50d5ee169f02f3e90b159f2c3531030a0f57031e4cd887a4cde7d3a87d83d17616b0a9e2e6178447b23a80dca11ea318e7e73ff7085fc27a31da077b1500ccec6e3e634b939b0dccbdc7d1cf9e0a533bdffbeb3872a53230e20fe823176249ceeede4ae16fa1392badb1d732bd803a93e2d8ff8949781f91849dbb0146ecd276e8e9ae9f5bffd30a75b8f97def07ec1fcf93a446650fa02811422ecbffae1b8d457f7cfa738585f05a197a6eeb523ebda9d1415d7cda62b7bd9c917d431478e7263dd8713db6d8af75c0698ee476850b9d707c4b4210474b0ab0c21b2423800803eafffd66cb7fbbdfb6526fe452b19e0adb16826f5acb09a2e6a9b0a3e04d21b5939b8731deee4bda41e081dc4a0dce2a11388139a2df4ea33131d34832479c1b2887d71019fe0d548cee042625df4d47500f70a517eb43282f29b4821183942bc1dccaca1b889941cd4c214d4c209318b99ac1c71ac7424aee55553c3c4dd71c365d137cf4a44c5d5b93ebe3eeef99308361aa1a6a6ba59b132c6fbac66be21b6ab3dffd74fe02ac6ee42fae30b28b824892407b08423b1588d9451605ecc1de724d8eb20b54e706f23a7ac78290e4abdd4e579b601346e35838225c3af6b3d3b26a343419ce5199f5e8b7f5573af014f7a50e9cf15cb3ccb522f6bf0e6ebd5f3174638d1d206e6434ab51d3e219b4ab64f86b76b367ec0bf97be1fb5c79d21a349df2d93f11ac1b5feabfe7fd4c21d8b763b76d82f5dff6477ea539a83348b812030ce44816f6055e9addfb77581f4f3f13b687b29dc34bd58f8c48a1ba2f1f39737908702bc35c1f99325d4fe0a1f4a5baf0dbdc78bbedbc14754a144f4f6127cbcc91f9056aadf772d8896234d77b05ad9178f9080a49f5f5a27fd48d464391941ae7e1e44e0986efa48efbc6f80eafc2872af25842a3d16188d151d8715180832a94447b170b3c016794c19738dfb7146a568fe833b61886676ab1822073ec8a59b58b4e9be47e5bf6230321f1400829ff1b9ae799352e96a5cb05034c7ed3b83d09bb12c9528b8d84967f91a94fb5ae1f89ebdcd222b470b816b004884a53c2b16b6a393d8ea4f116705d4ba881c21e8d09d09e3b4c05b0015fbc13a62c7edb6bd5f2704efd6576ec07d422af0f40129c4c41c0144b29ee06e88e3df3760f86cd242deaca3d121a2b571a2f68db03ab1c6ea20f5163b1e43a2d4363409a2b335847a4e767e66ffba6299cf6e20ca26f94d41f3834a0e9b67f384a0d0370568f1c60e52d092368ea2aeb925fbdf25a4b73151304175cedffa6422fdfa2131fc5f52b0ff427542bce83d3c3b8378466968f2ef7d9c3e2fc8320b1c0e53c350a9ed82ff194955358f40e03a60c80dede2a8e0eae44a53c87847ec7f126c4fcc05f0afeca9d96109a322f4039abe36dd81807c5963c4adc28399fba5e28ab16994688c98ba357cce0cdb0c469564604157d7134a8293b4098098fff09910cf91f901590151cecbe964c05e230ad8d07c913771b32a6bf14ed71730993d6e420413de0438fc60764ea21c3c57dfa600456a96b52a2f8bc6afcdc3270d15fd6d3649641192f31015d344d5d68311363c167b0a60dc25911473a30a1da09e89c57282f8b3265054aa815aa3745aee48b18feb2bb205349097a9aa642018275ce4c4b0ef4395783b61d624f5436bd7cb27a8007dae2dd379bba0cd6f164a1f674f280337f4a9b5149a13df4b3994e4fb83c36c34c9dae22991deb349c29bf807e78bf632cb49b955326eeafaa9ec527aa6a02f59426f1107d60afa3df206f8083182be626609235dcf4f8efa15d8a62821c14e0ed9c1171b474f13456681cca9dfa42aa34c1f9f1bb436008467a1d025c27e8ef064b94897dc696b48871ba4a82b47b601d91a50eecad0d888d7b744d0e96e2216eceb95b3f2c90409aba9e8e469c315b4b124bf82bc12f5a8d37fc4e858722f94d5e834d8d6ce11f88c83d686a6d931e312db72aced5e1e4bcd39127aa1b7dbc93f6a2ad3f1371af0396ff30b055760c7ddd61865b1df175ba7ddcd27eb2b99bb696e8765448a580b1cf8f2411babaee0deca60b29829b63ad6d87485607005328e662dd611675cf4e67f69701c33e1f4fbc732f81c43243cfdf7735a138316653c99e4a60968ed7c43d082cfe2dc23f8abc75396ef506ba7d130346d600b86472c490662752309f2e63110bf684436b161601abe8bb8666e931bd4f3591d5acb3daed88fd1d8d431d2b98c0496eae4a4aac335a954c7a0fa4b8d04203b5a96188847b666951d09989b4facd3b42ea194a48511c40fcce9bfb69502807549606cc9b69657cc0e7aa6d9e2f328b3bd94d0e29dedc8904253ec9448e274185eebdb529081538e9f1b0711d53e88e7294f933118c4ba0d9243109d60ae5a3a0f1bd1a31f2e8eb9936d9c5b7c6bfb0ead3510c326d838814e16c1aab65c92c09b1d08b80e83e019bec808a8b4c2e365161911db588f6c2a50d9c7340cee58ed3a89959c43373cbeb1a667b17dcb4441b3945b0b0577460afa2c148b79ba2a6fa5024fbc95b6d02338b63fbaefa876b9350b4b528b001fe9cac067ed922f5cf8350708da5c4e2055d3aee84f309d641227d0a2d13b383962c1cb8f62da5de0d7efac641bc25da71ec2b56f1334203f8a26a6e8c47ed63c52326ebd90e562efe8179c7d2f9167c3532ffe43dfe755c0f92c71b0e65a932673bd13ae26dbc4b6a9d814f9f0332300985756c0b4ee5617162e09db27552dfb1c7372cbd637e1cc21b0b846c6aab10a2db9916b029fd03522db1079f9c09ff17a2c25d066994ef93c523f1a14fd76b18fce5f1696e52a6d0215fe838899f3272823608caea61844c109889c561063aab13bad762586975a49f980feee1c18f110657da1e38e74534fbddd26ba791e03687123654caf61600f9a9368327ffd4c3cd18c6aa58fe99e76ce2e6d33e37a8fe5d937648c5381cef53243fd8df8fbcb626eaea7bf10ebb383339584973cffd2e6ab0819c7341f94b45c04ab514fdbd5896cdca086f722f48b5f86b76814f2de2d08d06035ba3155e29046ae49a3350fbb0e2dece5affce0ac6a4aa01494927ce5f2f129c4d8a8fe64d7173aed875b9cac7b2d8705a6c373a36ee18739d51eb3209c811bbe02d3b1314e1ed2d3163af23a33aaa00f2439e2302fec29f7b399479e975edaa630f4dbf68da5e0e6dc5619ff02fff9332fb155c55699361eb2ed6960eae5d457d42de25caf41726f32de3241b3d9f1dd17d5cd28ffae077c342dbc18c5ede1b403d65c85cb1a2127ac96dc22dc7c2eadf1a49dac232cfdb1cb6ccacb55402e25e016d4fe3a875d423b310817a51a34031d5e06f23b98984a538789a3aa07e00d51002c535f1504760e42d32308e497ae442318247df1fa1a8b2780dac5c497bed29810b93b484b419c9bba13ec689c076c795b6e465921dc8e63878b509cb26fb2b6a8159c797dc8aa65ae8bcd60ddc4341b230e85561485947dbdf5eee9df0d225f10f1065ce1b3bf400061dfd27d80f14123017e4ced1158713387edfc662b6d1675b32b6af5e5e258e95d5d91bcc058b248da7e1587fbb17f60ba17bde7a80191a8f83eeb516301914958f11fb3aba753293f85973e4cc6095758993be2130a9c3a6d23196a6e567714e4cb952168dc392bb09842b13a0dd669efcb590ac2f45365922deef14aead0703da9932aba739b14aedff179e783a430d974b92e352eb9e46d7f2fba1cc4083b1f128edc57652ea92470be2b78af11eddb02220a62bff3c88a53818aa2045b7d17887b88720a9107fabfa621aa6ebed73af14f78ecdca0f5aa1e042802ae9d2d0d35af0b1b5232588a69dc3b30e3d4f44374781ea21154d59f77108ac5ff360bee8fcfb7fa0a7713a05065541df969af0a02891830050a15fec2b6016cfd05ea103ffc1bee73995ca5ff74b157bb852700dfd44b387c18c0812168f5dfb21c36e2b1bd81ab6047ba6df3a565a0922054c870953f116fceb18c8384cb00bdbf565189332899924c907c4afd1e1940c743fec979ae809c93ea24d3eb5f37e5e3f22950a3f141572b077b6053ad5daefa2280b53ebf64cfcde8f304f09857ac3eb61aef7fc51035c39e02491a54fac70e87cb51cbc11875f5a360b37baaf9ce4926bf68707f43af603b820aebe1f5e7d829a682aab01d25599209e6781c42b900d3f3938e5b48385213327be0b9995a8d84a0a1874aadce107b39d2c722aed8a51a3e7edc90487f800298b220958f8dc4fc030b01d786a62ad84db3f14926906bb6f1ff14b6107b91549012a5c3b009f5411cf8a0f719209b742174491df15d09fad72746edf9477d81e498b4a32755de9e77a7c7e0db35f4df60c55b631098733becd52f18ae3fcbd8de11ddbb7c09218650afc15c689110120ca16694b4c70148cd51de211b826cc42e40c5c6eea41adac08eeda138bd2c0462bf177421b91f667d8c086488729869a287f0beb652242321f1322cb97a88d591ef947f2cfc5cac5ccedaadc240484d59b80e42bd9977246bd9cd637dc3a25fb1cf7fee553c37a14173e46cf5314be769908b3551520596344984c6cc8d0d95572f1a04a463effb9fa6ab74abe0c3e5222c654c5be458977c392064159f1c0e70762808acb85b72a5c0be70eab5f78c2468c2284b74ff3b699be85ed1cc95647302821d437785c67eb4d30f72b9b87c7c42db51e92d2a0f2e111b8c7db580670951b925432a5972006a30b890558530971b3131f4a6be9785d58c6cf7cbc5d7f2c166108c04863337c6273fcb1bb33b062e4de86b3a99289265d6113679a02e9ace4ca72d68dcd514d4fe2b3cf9c67c62e2a33b5d64fd1dc615800c15001effafbc7e8135b0c2e35ab92b67a72720ee9126b0a1b12670576bc105fac4aca34d84f2a0a02b48fcb6039ecb0e1d15d7fd24563caddcaf83b899f80d4537fbc7f9ad46396fb8944c7cb592951560c30b0df312709653e22bf679576bf39a7d82e3d81edffd59534eb4b5c007b9a18e2d842dea575d580745a871c63d0dafc377f83d981d2efa2f1dabacac6b80697c4d8b61878385f3791524f866e6c8bd6ebbc9d242fb2b507d01a45081b903373e58611af65099ddcd6268f9945998e0ea1e07f845556ce20aafc4ec9a999602aa10a7b3799ec44c4c5228c48df3e608754523ed846a114387a23aab1add4458dc30c5a137173ab0ebaf45f12390ec4274ace4b3a030f6538ce3beadb278f1dbdf740760292bfb728ffaaabbc459227e388eeff3d69fc5ce865deb93c0fab797a9233046e9ecf88de45e31f107b8e66923f843cfc6c6f8cf039d8d89c823b5ffa1ce59fbedf48f2c49e556d11dbe7184a035d2ca9e8b2ccb9017a39171fda83b20279948d2e3b24560ca9afa0148268228318280da2fff54f7b13cea8ded014749336cacd9f758d283178b67cd8e197f77a7a34c0e9b9ebf2f3423b120722766ff229a0a110dae02a0c8135a494613c26e3d51f1e819536f88b28be441280091f5f7f16282a659a117501e3c2d3c522c3f3b4956a3ed64103a8fd7051bc9f8ba97bb6b57491871a8e2c6191dbf47c5a3c0c05a25c2a714afecbd9fa1b0e4bb7af9276333581fe83c6ad71a87a44c90316122af10876149a1c921fb5409bc1452cfefbda08e03441a48ac5387451d919572628215d06972573f1dab312b48499d52a2e6900c5b13edff8199e738eae2098b10bdd11db83e6f288c71e81a93f581af731350612497414d9f7a9dcaa8dd0eb7f0fa194802767a24bbce8f5b9d3376bd2e57ce7f26a63fd8cafb022b0a3ec10347109c616be79b71b4b4e162d3abbb4dd98ca24687299f41e7a1a942ea27b1581a93a191c4926f6858244a3f18c72959a938eefc3e1fea0e63257dc17d2b21af87ca65361c17ee040dd4706ed6c3fd70f1c91f059f7d269e2f7652279a738f040b402b936e18e171e00032777135bf0e80ece8cb70c9f6812ec652681d2eec7808e0c1aa84afbca326baf3499a413f0fc0489b92560e1ec09214957a7752da9101fae5794b3c9e9599ce606043ffb0cb00a56011a72818b69d8df75a0ffdb35918f40851d94a2dc769772a73285375a54fca8c888a6a6192e09996160604d53a4aadb0a876029aee17051f3cb80789965bf188b780c598c6ea8857a3996f82809bcff23941cc4b3f2b5d11eb1fe4db22deba363e44912f162a1e3e210b59870349c05908b51f88f22bb19706dda0b4279be8ceb240a758eb8cecfda00467f75da4c62f7bb09dd92099576ab28cbe9bfbdd7d67a59d1188c80aa514bd672aa2dc717b89ea088ceabe69208400f5eb7a4399fd5ec64e52995fa7267ae7f75ffaedf87d51046bd7c3629dec153579bf339259926ca4661f7a510d165c34c9c3b79c9c90c62265ca6c988ec065896dd942980f72ce19e0bb28ee57de41e905655a3633f9e8b87e3d85cf2b166beb79588fa2f71341a022fa8d204f354e68e7f80712d9fe97a1e14868d8ac80c015e054904f0ed1ca5cc6699e9a3e43385c46afc696b8b07d5c4bd1a74eef9f547901d971947f52a9fa95395f3ebcdea2e55c464a01d3f70c9ffc0d912ea7e21d864aa40e1fed0c1faa6722db54580290c6fe0f236653a7e52d01724bc1dcf5a9f9b4ff76577861b241e9c48946f465b1239daa496fdf588ddfb2dc835a118d4d3d4337ef096312d22a87fd28385ffb3879204a301b94240af5c1269b91ab1971fc9f484b26585630c61d5714c889105265752bfe75123db9b92194261a1c90916bb58e4443d6899018543514d3d0928d41b470dee205901b5ec3eb83a547e8a9b76ba8b1e5e44c1722ed5c185d1b966b58dd80917a6a64dd43d2f6cc37c4f94bb61330d50c67ec8059357ed93a174481d479623196181bb8e37393dc8a3332af2ac5eb3dc540b3d013fec2f67203f45dd0e3dc0c48d6dcbe64616c50debcc154c79808ad1b90824aa671311f1ff052edb397f934426102868fe990fae7dc48c932fb8ca48b08303d21154ef4b1eba804d8097383f76f24fa3c8fdf3c4a9d9676641cbd8ad37df2d48c615e998af5b4c5e99179df42bb67daa3c05157041a2911aafb623c606fb58486f212ce3cf0b7d0704d55e033a1899a37cc9ecf2f3f740a9ba223c4c5e7b380f452b189c6e2ba5bb0fe2611bdcb2fa71159a38c4fe367aefecea2ccea4d47efa2b83b9bdc23345b213a0a915e366ee7da8224fe1c0779bb1a3ad473e93dc828d8da0535ace7ac01f5ee4fdbf02dc3562ad30df98e90b463ba8ab84f34b30b64f838c95639a44d850943d80d5f16b1f12d0335c21e9f903573a0f42e8b940350fbeedeb899c8ef0df1f6e089c82bb9871b8717bfce6dc774f218715d86b9ce34fda111af8881a56ca37b4cee29da85dbb9389a97e74caf86c1020aba77a131636586d4c805f36db57655793ab43cf8475dcd0a973ced973ebf7e9ccfd57a6eb2ebe584f9de403e8e3634f8c02ab7b2a0c08e78c34b16aea9ad94f5740593a8d83cce98e824de7e2550a2d785be928e093678c99fea016b255a7387fa9dae875d144dd7dc7015bd75b43d9b115180b47082ca3e29be3f37ae3ee4c3c30cb93ee61168ee758f7668953a81d95f6793eaf0dbbade40cfe37453f825016c1d5a58d981ca1a6902b8ee00650c05307914ef3ad7f8b211744690eec2024bb8695851daacb51c6f7a6d43752cdb702fa3e54c54cecc778a06c6fb62de7d741caf816288396c5b0893235fc00021644cd68488a352e592aa07d764b1f9bf51bbd2f5f5f25a2c5e795872fdc08fb7f857fc70090f5c8e579f376e4962c91d68d88e63214aa2db3cb4336a3589b62831bd31aab622342f75a557736cc6249db158a200cd444da2ae46cc32f00639e32388df4597d44f360d20359598e1de992cdb4e036b3d08f77ff85e04ee8e026b8e684d98d0c4e5994a388482049bee6059642d6109b8b2a5a8d10fd682c64f3c7077bbbef9d0e0ba1a12d5b25cf9765c9f0c8e2002b6afc82640570832ae3eed0cc907479a60db85140a86132c182ead419a6b2798b2b15687ebc7985cfd4cc0351f41b1bcda39f5d2fdeee74cb67a9cd11757ab2f071db71c2e7c37782b3c9ab22d256b36b8b45dba9cd4f32217975f7247d272456091d5c118f2a15b40fdb7b0a23429f2ed38956d4a87135f1281cbe426709280af505d6b65f2b1c2f1b959e6a4f676d43ac422db652c4054206cf5da7b21a1d18bfcdda6b690596aa3ac6c79e97387719bea86cfb77709c72abb3ffd762460ed0f1cc7d6c4c583c95137ec28632354d31af19f4a71925f5b737c4c1bb3dbddce712d8903f20d250394ec8845bf06b35dd5bda0f83f4e19b26c8f9752ee48a95cf724e164b6a4fd9bee67f38826b9ef13cb8d015796d21c061327c5b20010552d0c1375a502b2d8ea6bb8001ceb829a1e28c32f31dd795a1cdeaf74fa448dd39525af8c92a060e6976f2bd0b42fc13828e844ee5aee7d1ac111b90cfe79e90d0f8aa014cc6373a6933c3d58aa3094e289521d06c6680edeadf43ef739d738ff2bd02232c9b6f565cce33294051c15699276c300e1d65b7baf73c43e0b5c791fe644c55d4a41cd11ed7fd381ba1bc93487fc8cbe7f222d48093fda4aa2f134aeb95fc625d32524167cb687e90ec12bca2af2550d5e0b8cca6de823b3c79ecdcdcec698d283f8b8e9b88a117da3f7b93c0aef7c555764f9604ea9bccf8e81aede2af2c8d8482301b92a5a2ca7f6102729e8e3dbc063b395769de0b0ffa33be1d998263591aa2ad41f96ec59485c0040064f03185d96b43ebc5ae9f89009f6f0a7b7d2b055b0823af89d0cdc97809c7754d04fe2713c7cf3981839a35eccf9877ae0df5225bd4fe0d3f37648894f8bed92009416d535f00e933cb84f5f2e550e5863bca9ea793aebf50ca0db1e770e8e3a0179e885035cd5b39ef8e077a0298963120c11c99e21c627f4e00351a670ccfcff8f7149565a1f4fefd2eb3e4fecd933228217032e0ab32e38f4d845056064a25948f9c7f199844d24eecb5a0573daeeef157ccb41ca6dd6fd93b1d57851d1455004ce84051a1551e298cc05fccfcf6d886ca286c7c05d2c44fa6212be62019fc268312390ccaf8f4c29964123ba87a28dc0203fbf04ec2fc1826bc8da6defcd725b22b4b78a88f7290aabb7c221157ea6785d26be66ee3d8d778de170437f2899c69daadf99c39e4038c5f71e041d76d17c5f507e2b4cf612e14c013f97c0943acda07302b396f23bed05744c5550366cc5df0fd7637b579503b241653bba0fef2dd2c45d0e873913f5a6db93a0d6a19368e9c1328dbbdef245bf0377fa2e338345ab4039812fd0f29b98af87c937c9b17f1541658d17610fb8e57e7b3f19473e533b0cc97770a46144670aafb2b4bccd220263d82b9d5f3d1141f625c98f8ba2ab70f04c4ca8f569605d943690645007a08ff373459eac7775f8d9aec124459e14cc3dfb98650ef6119ee513a70b455be99f485e7a32f43a7db2b6586ab8ebfd69dd43e5f383be27cb10fb404fbc1bcf216c2160448be361002ae27f61238ada2f5acf54e850519300417b282e3e2e17e96bc2c05c765d94261448511fdd637e24db0b06dad8703836f1a792678f19592cf5ba146fac37ea588af2a790c4d8528e1dc4121e2e73a6ab604f3ce46282df6fa66d1e59792deadc357228d5fbaae491447245cbeec3e75402cb373cdf95c6f77f6087118675c2bcdb70162345f65befe7f953035bb559af631387b7b8cdd779a0b278abc62c6fe4e916c5c39268692fa1a3385e80167fb3352f29e25d8a43360603f9219e6426d8ea9ab5bd300dca2635b5787314d836d8225f18c753c34589e277d9fd49fbd18bca1e2ad6cfb6a372d204c4586b881aa9c1b7fb3fd3be4b2a58d48fb1004423e4405f26658443e4acc085bd3b8028603162ea5c08cf724965e5fc909d09fa74475585118721077bac4099b5284eade909cececf46259fad55024ceb020e4945c70d3a50ac26c90103c00030000c0003c00030000caa38fe5ae8af5453999b32d4048828e15b4bbb222252eedbeb010087510000000040e207faf8f94ae50d530ecf0c8cbfdbbee4f796dcc51dac132a2a25d75bedc20ef9aa09bb1bf11f2a8744223a0080882eea606c68cb9a133bfc4542177448f21ad77a13ae559f4361ac4a081fbdce5c0ead85c9f5395d4fb57178f7f2e47c2997c4281cae72cfab1b3bd46ef60de8d7df9bfbedc966dd906859e5a2c4d406ea4ed68f9627d225cb86634aa973ea4e26afaa6bc84266448923155fa36a48be3c4564d234f49792bc78c50f9ea3c1387eb924e146bf3f43a59a51dae629a58f19bc68ab2af38fe9da32b49aa49f9ed4e9960cebe5fca9613fae9531e89a443f4fad9f534e0c6c948ee5515ecec44c182a494ef7e46cb1d7070327e6d42016ee1a53ca17ca315e94dcf97cfaf18252f729254fbb4064ac9d145f72e18ccea0f5e516eaf23b498c575151d782256a56e612f4cfc35930c378fe3bdd146c462c707218cb1b5593ff825730af921452e9d337875638577e5d93990ebd6115ccc15a3e7f7bfb932015fccd268931a6b097d729901416d04514d0b72d413c7488d51c14d064ab621f92192bf7046b273d364997a4cf7342d572d6d59bae235e13f630bb1a7bf19bed9880b86a7fd0ec9660ea5dcaaa9d4ad14d0998fc1d2ec89564256b49307fb5a4bc716f52352460d1bace433e49a5b123dc316c45fb8f963f6346e8a2084f67ff50fd1dd522113c394f3272a9343304c5634e45ab965f2784fe4555c26312e5b620183ae45c46e7e6990c0877a67872ca26a942ff019b33db1a2a8587ec03538a789eaa98e7d383f36b85da7729a15c1e745963cebffcd889ee80b173f7cf705331aa2e74e08d5ffe6e9d8b2d89c16a738eba3de3c2181d294992f23829b7b02d99a429f753ca650bedca66c53b66c844b5b83bddc6f8668f2e2d4ac9a3a6cb8bf6a4cfe2bd4ef1c5a2eccd461666aecf29a6e85c6d89857dc25d0aff5d111116764c8274756ebe8892904824e48718328844c6d80cd478c5415a4454fda3c5898744221b8980b1e30c1f3fcaf0e6e1001d3edc023b9250c315754ae26e5c831aada8c10aca6f442e9e28d71e0e8944de7d3c2087037414e5a0c62adcdfbcceb13da63b1a12898001011d35a8a18ad39bf4df558c96442e418d54b0255ff83fc92e4ca6432211303490030239c2d001821aa828d786cc91269ad0ef9ea2ae1e1b934eea5039690af62d2a552da5b4180f0ee40843c70c6a948214a3c043d3594ffae99b4614c6c73371dec2754c01c00e6a8422f17553c9b7b61f75058596735bfe79ccb1800e0018a1c6272c6d89fd2ad74bb3a1a4862756d578ea6693c95dd389c2529e596d4a1d6585ec18638cdd11f2e3057eba0627d86e9bf9ccbe27a6b6c70f1e168000066a6c82d2ac194d08ab8a9fa48626ec98e9fa7eee4fcace84b122934d6cee7cb060a2bd750d9b97798811021d3d7ef0b0808e05d4b8440d4bd4a8440d4ad498440d49d488c4026a40a2c6236a38a24623f83129b8a9a6e6ae6480310107e8f8618606784c20a406236a2ca2d512f914a6e29ba58a2832685bc8d95a502311c5a81c2b8e8941d4f388304d78fa5789f2546287787d73e668d9bbf79421f0099373905bfd300b6a14c2ca5a4247c449f651e7518310e9c5134bacdcf4eb778c1a83f0a2b8ab64e793b6e282c0934973327da1a261204a721a957fbe35658b183500a16a9b5c99ec7d8d3ff45771f7637c7f09b91f0cad49e8a4be163cc614d4e8836952c7fed01cc4738f851a7cd8473d57a6f5434c6c0935f6b06abe9c43fc8d86664e50430f4962728987fb6492d31fa891873298b45e8cf3b94d432211ff61c60bc898410d3c7029d5a9b34a6a491b2bd4b84353c2a64959593185ac0a35ecd0f4e55652d5247bee52a85187b2749abaf01257e2a5436daee561f43ef83bcef0f1230435e650f8513191283d50430e74be9cbd6346fec7ab461cd00a9da16365cc24546ac0e17b759b2e9dced2ef0d5be80cf5b638de41e306f65467f457ceafa46bb4e1245b66b14ed241d584400d362c126635d7256e4c768d355019aace374dc99ee2851a6ac8356515adbc79ad7c1a52eda8bd9e5575fd45c3a993557a68a96469ce807d68afed1c9a21399a6fea49c9b65f86a2a4540d561e36858c0cea6ec6ed939593eb312454902ccff1ef3c586230ef8579ff4f1d93fc861a61d856366c35c34cb92524120143f595a7938934861a5fb804fb0cff69693567470d2f541a9f66426cd0f12d241261438d2e949baba52725ad774a482452460f34d4e04225058d2795bca6cef70079861a5b48ee3e134b91fda84c991904f0d1e30960060f0ad4d0821baebd7ce22c2503307c682012d1428d2c30b5d9fced3ebd430b89445cd01ea2c3c7e0cd420d2ca425d9eda8465914b5c615b0d7d2afd0bbed5ba1134f5cefe49b2ad4a002dd921a2cb6878f6656a8318534e5d12445935cb73d07e888449850430ae61c735f4d4cb9c763c288418d2860ded697e4fe637f5e50030a9468d1296fd45451fa271075e9335e8adf4fe24ee8b2ffd9dac598627a9a608b49962a675e13b6c3045330a9bbd54a33787a0949874af24d57ce9dc34a28bcf4669bd9749db349b082684fe7934542f1c2ad4432658b8d39025956f99759bf522a8d902cfb52d26f6b4ab71581fed35892f09fe3844584e7a4933ccfe4b4c933842fdbd967d90c76292484c2c7e624b72597d341d8c3ffc5f78ee13d0508357e50c3078a4929c7ae3576ca9d1e741f3ddcb8db87e834241221a3060fb0a0f9df13a126577690581653a7d01a2d945e43077ce676cf1f32cd3e85462e8c5d16acc2ebc999352e4ac1353fb2fa72ccf12dec922f3eaa6dfe4f638ba36fce484f9e1fafd5624d39494e12b9e64912335e408b4dfccd3673f5e777165c9b4931a7743b16d516d090452925e1d27ca4dec22716945a8e31a578c3424d51e1f42a37afe65eb14699f45e9613d53257dc9d2aa5533bc992a65a5170cb249e548dff95ec38c3c70f562c55d7799d319572c380c62a0af924c798f8af59351368a86213aa636aa6ec6be791038d54bc312769d3c34f2ac916030d5468728eb7922794b8bf14c831811c12c811811c10c8b1021aa7388b7b8e4fa9ef593105256f9d10a6d96726edf13c2cb0230c344a41b44dde9a1463d27092e220e937267d70cff293416314873dcb71b9188b9e432211ffd183470e31688802078d50289d9bab57275f2ce2410314cb89f9cfa7de3dc6cd27145ffdcc24ff4edde9893b76d42c4acc61d247021a9d30d4b5e4e217ac8f11442261d0e08439875f5a4b25b48935ee4a98e86a22c9040d4c2455986587097abbf225dc9d137d736c2b69244b5cd9f2afbb62b831f9c1637b45f0011a95c82cf6844ed3944c3443223b7cf48844c010410e0ce888443a408312573e9ddc24fce5381e1a9330cb78ef4b49a2572402460a948624ccec294fcc2565cc6f262134225146aaeaad56925445828467e69f1b2a76820ad07844d16a2b25ad2ce57c0ac03880014ee08810d068040d46d058040d45d0488469eec3c66d8c31bc29400311748814d030041502f774d2c56cbf2533134293f24a89712f2a9b86c620ccd99a52565df7f9bc20deb4dbc95d9b0cead141231009e69633eb7aa6ab3c20124f0e778dff1f32a99fabe898b2cfe3075ca44bc3626325ebfac0a4c9861e8ff18154aff99c613487a6f6705e2a39689c8d7b238644225ba0a107fa828dfe09591353f2041a79d8c3eefb77e79c84b19240030f55dc89fdeb77127632028d3b981d5db94a7c5940c30e9d9770b15d3c6b0a0934ea50d28aeb9e4ffcac27191289e418638c85400e1d0028020d3aa07de9f3758aae3b7f4824e23da031072dbca84949e23d853c2412f9e1637d9841430e69ee89ff0d5d7f731c8cfd295a6cc75250b50a34e090bc267eecb4513473f60d5e4caf296a9f5b4327051a6ed0b26a2ec94ed0bb126d8321b63bc8863c3dc10a89444040830ddb98f82af723b2b9b2062e099f45ead2e57e510dce6c9a9c9b33854e4b230d7ab0123cd2c4bddfca183e4290830734d090fab5e7ef20a992930e24d03883a92dd473adefece77140c30c58275593f7f2e5f7b60c2629f4673aa66e7fe90634c8a0b96ef419bda99263c660060d31d008030d309c3f7d666ffc2c99121ad0f802e227e7e50d992f74e80c1a5e7893e4e33154ca4bdae982319464c1921ce33ae5148106170a9b243c63b488125334b6c0c8c7bc6692c40c992442430b44e6106bda9fbac9008d2ca463b97a62ad57d41c0f332e40030b6ee6f8c7f709a9b38544223c765480c61568588146155c4d959b921cbeb9bd9048a4c7a14105c7e4ca277e1293f7851f40630a67a63026a5d41d3589c18086140e9f3676c2a4dd36e117d08842fb9924dd4ed5cab11ed0804226758e399dc62017cb27ecadb9357aafd459e604b3d533c5e093551f35c18f3b29a5fdc5cb4b1212899c317abc8006138e54b79061272fbf4886185b860f1a4b30b4c6d85c2759844e4309dcbaa7b85021ffad19d04882a9726e975acbb8cd85b0808718349090099a83e65c5e2eb7d33882261d65762dfec48f1b21a1624ac124b9643ee700392ecdc861ccc861cc30c005681481061176135b356e491a5af107680c6103348400021a41f83fe5a85bcd133dea011a4060d2de3f8da7f3ef93101e3d7e50be54ef49fde622341a3e38555a3386fc3c29fd212fe8e123029148193da8c4248fdbf4ab05cf5f40830775a885cf10f1359592d0d8015b71e3a1639e336b34748006fbce396ab3975f1310402e12f32dc9d9a73d76cac18531a34ef6a64c6ff1dcc229c9e4d8e28aacf7db683e22732d0e79e15d726f86932ab4507ebbebb4b2ca49e62cb28bbd7b628c25e624c922e935e6243973b61426b110002c04f00a01b88205d00a0d088015b48a0508401502488500502180537ce97d29f92575644000a630e7ca5f17bbee5b3a1304500a2a6a89d93d6d3fdc8714c6e576534bd198e1512494247d3eb18ed9ac440206cb4244704314648893b3567a2314c9bf2a72952463ba68106e80e2e89dbfa975ed7336156e7c6257db8a323bb6e2fd0d4fa8d9e454b7624c78ef831b9df8bedb9224db94d0dfcde0062738ff6ed91cd221d64b2047182db8b189ff2c9b7caf5b060b6e68223159bc7ecebc6e64e206268a153e3e6365676e7be3127a9949527a6c422211bc61892336665a4b25df4954c68d4aecff571772f343771912898ce00625c850391d27cabb7ef8fd0393384d12db4bcc399d9329c10d4958e5a6e936da891a321c043722d17df04ca2152db74972e00624ec9b4a41a6ba3bc594471c5e3c76348f92a3578ea0e49225af635790971b6165ae5effd4956f75317c84c188677dc3e2a4c9e31713024604427063115b4ee1352f378a38b2c7d44b7037391cc68d44101773cc5167ac529ec5308311b1b94fe5d08df325e70e9159c54e295ac8acad420cb1554a7ba3194d9c4e62e046214af25f67cea7593f9a10225dd37c9672f01ced0ee2f99252123b2fc7cc193d7cfc28c3cf0604b1d494a8bae7b5212a2191c88e1988f18120e4666633fbee330b08a65370cbdec152f22a2412f9c373eab1e35b82a49884a1e38783406ff8e1b28df274b29be5b57dd0d32f98eb7d788f9a0f59cc8ad9afc4c64fee8cd163c71ebad160e772e298dc181289fc583dec73a9d3f2c9eb1e1f3dc4d821811b79403f3337be096b1d3e78204d67cd7274cfab5d88036edca1964b9f3dab520e936be0861df8fe4ec256786a125375b8a4de9382f489ffd9840ec96f551626f97bf2650ee60fde2587d73bad0c10dc9043f17e6d26b2d6d33f71c864694fff6dc2cfd52170f0525aea9f6f8c31fa6f703bf47eb4da5482d66e28a5d7d849da8a4a761bdc12644fa8eca6d5dd026eb0e19ecbdf1bd768b25ad6f07d9a4929c9456506dc5083ea9ef1273d5e564d1a742f57d3f893a65502230368f0246dd47bbc36537c866f2cc5985ed54f2e49cc50124d716314bfdcaa96e1ddd81ebf637bde4fc9608acbace9333a86b2bf72f7538a9fd712c37163a5b0bf7031a7948f1e3bc0b81106f398e0167979e562320337c0e049f953ad6bce78921c1289b8c0bd8c1d3c3ce4c78e0edcf882b57175825bce59d332811b5ed8f2957872f7e5f04b8544223b7cf4d82183edc2b17bf7cf7e57aaabc80d2ee4499efda81773824a6114e0c616b21832d55b88544bab853c34b3e7fc379e52921e3fb2704ca7e1a35c7e69562d70030b7bd44fd1ad98addb0b29632b1052c686682047181fb871053ca35e28ff781687808e337cfce0210117f4fe00818f0878e086154a4928f9dab3cb36d9d1801b5550baf28e5a36b73c2f156831bf8ab410bd8f86ecd8c1e3779051c6ca60c78e1e3f1670630aab9f1c3435b2c413062e05cc24fb244a499139f6904824033a5c0c1f6168e04614921b50305da60917a1ff8e1e3f7664e0c613384bedf9a153499eb71b4ee8422463c79655e78c1d6359c0430c17b4183cb6dc6802277790509d33b17a64c10d26dc58c20d259ce04612f80612e80820b861841b45b841044c2fdf44c3eec92b86442225b83104f3bd3b8973d9d56d211ddc108296627e931c9f193b69702308c6f2d499dae277339e88e08c1b40b8f18314dcf08119377a60f624cde5a5720b91dde041e69bbfcb624ea2a6ce0eb6e91819a74a263d764307ae78a6fccef6a9f1f390de0cd8c88517f374dceac8062e9270919fbdee16ef8ec660e561a756dba2b08a91c944d10a366fc0462d0ed5e513265694ec9191011d3fccd040056cd0e212e2374af093c284fb430c1e6294b121703e63351089fc108387183cccd8e17cc692118990e16464c0c62c32604316975a9db9e9e7d8d4b1110b7d4d2e7b57b8974f12c236606149ddf59b92c6eb98ee1318838d5738d5619697935cc173aef04a32f7ce4884c9263a6cb482f45b19cf2727d1666745c99394c4fd84aa4df12a3041a7a23693fa9e50c1862aca9f2f6ac650ffe5978d5498fc8413edbdeeb3a78c600315859f1426d2298651e914a6dc5a5315639d078b0d532445cdac29e5246795dc0e6c940213af429f249fdac8860a3648516fe650e39bad75338a622c495dd484becc4a083644e15ffc24a7f07413431f0a2af7c450d6d920d800c55127d97c7ed6d4e2f9c4ba49b03bf14f88aacc13d8894992247736f5bb3b60a31398249f61d26ac9f2b11ad8e0849a241f2f312729a5f36d6c82bb349fe424f5e44860431399306dd88bea1d453bc711d8c0041997eeaa745ba32d021b97a0e4100d6fd5a51d16d8b044b77e19e6a6ef24eddd462516559fec6c273596131289f8581fa3043628416df08cf48b89de7e125ace4a62926a743a456d482229b6e7d87a6a2412bd84f7080b736727244c93a2f74bc6558ece234c1dd910bbb5996704820d471cb52b977491ba49f47cc04623dadfacacf1fcc2b262011b8c48361d3bab4b49d8136d2c8253998a9e3ac5063614714cd57e25f9b2ab5d861967878d44b89fcea6346fd64c794824620311f84c499f5d4ea80c246c1c623f49f5dfbcf0f738c286215c8f53b1faba9048e4f818bc3e066f256c14824a23221563ce889884304d74cadb60523a4bf1818d41b49b2e6a77da915c1098dc19d253aa277c272412c9838d40e49b64972fbbf0379a904884103600c15d0a1953dee6b57648243206f3b04024f27fb0e107553b548c7bf199732e241251838d3e983eb7da56f5dcc92963830f6ae5cae57d60544007080020041b7b6073964c4bf93161333d6cc0461ef8557b8b99e3f2e52436f0a09a58e733171f0d848d3b50567da2e6f63289dd0e6b5a4fa9888a8893ad43fa1b4aec68cf8e5ea1836ac2863a970c4d85fc104306dd230360d89843a331ebf9427806af42c0884464d0638c311c90e30c1e1e011d67f8088387878471060f8f402462430eb5eb54b81cc3574de54005747c2012a1818d3860b51a2e45f794a4b1e1e09b10a1157f4363d32120c821821c21656c052236de40b46eb86bda6a851f1289f42883470f084c0003392aa0e30111d0808e336cb821b913f35afe7cc2cc4a041b6df8444d4cb5ea11820d3618427f5b374d27d9cb21d858439f5d73564f1afa332e031b6ad035564d65b7db24e521395c0c1f611c000c30c030669c1e1be80f4422eda35d041b88440ca0231211848d34dc6ae2f569d9cb7d340367380622111d2db08186c7daa45d37f6e97a66d83803e749ce71c16ccbb22311e0c186193861d5e4254de8b33d453046fb7941197ab05106ccc773dff6c364b3c950308ffa175636efde43b031067d3ec554af269660ae18b87c62ca90f11573fe9a60230c9626f32454c893b33c146c80e14e92a0211e2d2bb6f2c0c617e8f64d5abbeda33a25c1861734c1cf76ab4dcad9dd0736bac0e55c5d41f3dada2609f9c0036c7041ab60ba317b5432670bafbbf527c9c4132ffb5a3844a23377ce63c2db5960cdbb525d5fc6b83116ceb06143e6fa5379642c8f48048c1e7f05fde2d66ffed86d726785b29689491acfe93cba21111b5568df4d92e47052126c508117fbb0e61219d59982eac12ecdf799a8e1337cfca0810d29785615a6ff5ae3a5310aa5925a37e77c52563cb00105cc7e4e52936578f42191888d2798e25ae54e1d321e4320d870c2fdd51de3a794772617828d26d4f291e51ee59e921912891cc0001a00e30006c871860f07e38c17c3878b40870e30cc580f7141f71883cbb811071b4c2873ce98ff1ca305dd2ca16499c16dd317e23e1a6043094a96fc67d8601d3713128994e163f0862183f5118930c04612927e6663928dfffa186d03098d544e5e3c93332ce708a8f8dd05132d79c6d6088cb7c7dfb41053932bc26fa1e9b33afb4a36229cde9d63eb5ba3bc830c1b43d02c3bf5573e93c91662430895cf5ee5cbb62f4b1204fc7b5f4fade4263d40e0c4fc3dff52524ee50756b2d5b0b396cd261682367ca06888cfe96c982448ce43063d76f4f811892cc0460f28cf0ca231fd630e8f1de30515d0d17e7a404087dbe0818d1d242bf351dd21277e116ce8e0cb9f743fd5bc885e5210c6097454a08b5c9825da83c64b21b752d9052e700d97933019dd92a8dd22ed58c296c966b9518544223bcef0f1e3bab04561d5c49b4fe2769f36461961e8681f0e88449ac719d4452dbaa04509ba98c509ba904517b1f0f6de5eed24643e1a8908a10b58b051d32a87b5f94b61081837b881fb30a38c1e63740d6a10899c318373361201e38718eb238c001ca18b57f09dfd996eb129c419128980d1862e5c918a65e8f9e5e4317d4222111474d18aaf82a8daf8ab9cdc219108182948228002c00023b12a1089e8383d361089f8e9c12312e173021c74c18a2e5661ac6426aeefabe2934a4eaafd1aefd949859562be127b432cd78d0a2e57a9ffcc673af14222911bdc800c3142ca48400c6a50830a74710aabe3dddd6fc65c96fd6186064a17a638e64f617d55235f9e904824e9a2148d26f5ef8f19f3342705776327768ae6132a338a840f9bc4ec68794e3751541e4f324952ceb691cee822149d74f2ac39a549080f28fc112fd9f2b098be7ec29534b38ff24de1e43cd14527fe3d51f3e6effb30931874c1092c49164ace7192e72ec142179bf82f67aea8daf949fc7474a109339b27394e8aeeb55e269edfacfa312553eda80b4cf43219bf4eea52df5c7671097ff34489bd1b12899cf511468e1c398e0572b84f408718bab004ea2ee9d51662ab5309b3798c663a13de6f4a9cb5a48c269918273393e8d3e5bc7ddee5952e09c2829fef57ea8ba34782d318d18d1e6ffa73489865fc56dff347d4f9b24eae92c92eb923ecce27baac6594d11bd1650d993aeb6b680f23aa7839bf999492a4bb08cba3c9d932e528e292720e5652760c194f224e4d594eb6fa9cb53a8840a5e72b776bf80c9dc410d445217839e1624c5f25779a10dc455d3be9132ac50c828a5b9fde4fdaca600ba2cfafcf7ed63fed09841e35aef37fc6cb1810f466ac9c0c19259691c3145dfc81cc731aaa37e34c7a3f64959314f2efdae93e58fd61528e4e95936788d0051f4ae69a72fecfe99caa195dec01bf0c2677326d2f131241177a38aa7c499eed440d16ee220f5e5e8c299d184bf493bbc04309fcc49bdc7b1d4acb2e4d27ed78e8d0814bcf9836f557a8f41cbaba7811b11c92becc3194892726e1385c152be84e94a678e14088a7c58d4af5297d83926973328b7183a65f52e6478d6199363467929d8bc906e37e9e18aed364b6863c57789e9aa8944e0d59d0502e9e3f2c6d69d0838ccae62bd91f0d865a341dd70d13277e86fe84e8a0b219303196760a76194cd5f162c65dd4d764b8d4ac464c760ca5b3acb1af37e64f1143aa22257166189a92b64b434db58b6028ee8cd69afc51f7173ee15363b494ada879210b271fe326c227eb82dd31ee3c9a1c2e1ca3677e4994705372b6d085454fdfb9164c711dd367935f2d9c8537a7eacd9d0b3e3216cca751db84b7af9050b59bea4eac60d1b6c2fe6d1ab332b763da5538a4c6971c5328b74d53814c51ccd3f465b8949ec2a12e26b97b978211963ef8a978a560145cc9ae3c9ea79b0205b353feecf172fd9ea0c6349375374858e784322afc4eba7cd142dd04baa5424ca887db30c1fc239e935c1974f32550e9f6f25446b7aa84e3b4db4459dd6c7292c0dea5ff999872dc1b098d4b6ce9edabe78f506aabb5aaffcdc84658c3092e59a563f12d4226e639297126936b8890249ebc96d1b4e26708c5a9872eef6e0fa710c85062c8935d3eda41686743a47aba7f3e2094d3a498d2db89afd90f8eca29e9bc5ab4b97ca046c5fdc9f6b361e21eb876f132ebb6739807d7e56fcc214334f63bb85657a6e35fe8609335ff2edada499d5ca0677672924eae17e362933b861234e6afe8dea21c63665b0a3fc135b6c024317db8122e67ce5ab4714dfa2a51ae2e498b2ae3c7c2e44a49e52cfe0a62f2395c5924bd6b4a9ae7a7f4db58e41ae773c52496696e61e1977b999462cc9e6c5fb18929a70ee6e1624deb0a53844b7e2569cda26dc5a2a31725ac983427cb8a725f3acafdab4828b35afb348fba2a4e1fe39438bdf7de49c5e9042b4136ab55dea8f8d2e54a42b8f6a69c02cfd96b326ffd86d614f988895ec45dcc4b51cc94eea3bac58a2a294e9ec3a56dbdb87c14b8ea89d9da7f6e445164e5f2d831a148d67c7279b02828f0d44c89ce27cc8a76314fa7f8d63ce1cb592ebbdc955aebc47352aecf7a498a9a13495216b6263474b43651e77839ad1b63d094263ad953846c4e0f93341377ee910ff59c3d4d1413e8bd9fe5bdc52fff12eea65c72f26837d95b228f1119be792594f1b6f1b0ee4a3925de96914c5f9b49a027e9d55ff6b20d1b496051a22475999e8c4d244e9deef324a571ad8104be1f5f974d4c55d53cc2ac529e9d72698951e388c7522e3fc534a26d4b8b373e1177318c304a73b4624c29a26216c169ce2a12fe317e1a452856d14f1c3d492e691241459e96381bad5c348830674d3c6263a482e610fe055d0b4b9bbecf186289381b2931954f640a61bd05b30d99ecbdc41022df9872b7561233ff412495c999faeb926d5e10f798a64b748d863d10a4266d51df4ef51c406cc1935dce4d5e61ffe1dc5592497b9b2bd77e502ac7bc244b89d9e13e9ce64dde642c5a74f960704fbfaaf3a1325bf670add9bc7492d3f55af4506ecd9d6ea62c845af29009699595fff2a5b4e0a174c2ad56ee76f24cb9c3792a45114b79d5946287a724a9648b1531b3943abc51d573d91635540a1daed8355f1baf3386650efc2539a6d0d40bbb15399c7c3ebc49716328b11287ec376c38986622ee7ca2e2a5f206475ba3b362099e4d8a1b12e53c7f4999c136496983653e7e2959be127c36e8a296d2a1b3e9f66b48aa9472f2cf13cb1e3598b1eb19b2a36677d3e0a7bcc6aeff286bd140dfbdc87ace7c5dcfa06b4a4b8f922b4b3543775e196931c4322d4352d29885b9907f1a32f49e2bfd7162e63263a8ba93dce9a6da7411032756783ab91286ea84194ba2892e6a82818d317f542b49cc5f7e810e936f39eea549985e703b55a478545a13cc2ebc63a627bae16c73c98523bc444f15992c77b9857c57bf04ef38bea9d442f561d7fb399f2b6516b8906526f49eba9a2416708f2aeaf2ee15ce925a82580aabd1add0547c088d774284a70afec968b4685625ca542876d96cea58629284a760bcb8a1af29f22f2b8583a674afc66c15d5281424c3d726ebb2325048fa8dfe74e713e8ae0fbf8c27d8974e28c5cfd22ca5cbf29a700cfea1116769b263c2ab59343c6a6b32b684e463fa2737aa4fa604a72429c25536947c12ecf827cd9c1412d0c9d8deca749b2a3c42e639469b8fca084ba94459e59aa8131681d3efbf0e33e76e824428471f1793e344e7ce10cc5e62b59712c2de39ae256ace9fc241a0df553ac9d96b1b20d49be6c4f18a3e17fd41e246cb8d3f9f63333ed8a3a4a5545f4fbe07c9d9abfc53ab870f0ff42425eff0269820ef00d3949473cb0074a05e447bc7e482d02cd55963876578b8304ae5f3cf47a457778b44cb5393b01a254b670b72b3a7e82d17aaf3b5b8fa7a3d7e4e25984f0ba3e5bce94cc1cffb59146c73672fb563e4b230e537d5dc27168ba789c59818d7c302d1f47956625c65fd0aabaec39f20bb82affc9db3b5565426fc58be9c537d31566839c8acb47b4c7bda2a8cae134e8cb3fe699a2a8e2d3529b35ca6312d157ba82cea6296a4933454fcfb35fd3326b88a760a4bb8c88b7f82be84668ac2db4bf3224d8c9a9522c99fa9bbbc8c971929c8f1247249ce280a9792580cee1f991605bfa963bf8576ac43518e6a2eefbc63515030a32a75b1963de513fd9fd027ab498c26eb095efe643d86d0fa742231a62476855e8929e584e16c72fbddabdd4d987d2dd2cf4cc8531325134ec37b69c99bc944492fa9645a0a13d889299f5096ba441a4d70cd26799858294b2c5e95251a1b7f2a5589d2be539e74b245c915259c8ab9f12fad6b8ed524d2a896cf52e79b182b49e4a37133a5962459ac22a1e6fdb4b61a5c3b2b4824d6b947d3cf55b8ea11858bb5693efe4aaaca11668ff9ebab3fceffd4884b46fce24d2ed97c6204beaada15db84f2382d023dcb139ec2dcde4e8a703b3ee8673a39859d12b175ec4db9ff728c7142445f5b52e668fd191e3ac41661154d0e29b31d32045aa1ef92501722513e4ea667b28999109cacc13377ce3c130f62fbae901f6edaea1504ebbed1c4e0a3e16b20ea3c61e355f874290a88e592446aa9da96fa877289966297462ea87e483c6dea54a51e2ca60fd54b69e793e2e4d0f081feaf91f1949d97b2072b548e116b99b356f4c0a6f7d7cb394985310f6e9233fb98f7c9ed111e08b1084f4ba20916a33bdc298772f3b6d854911df8124a3d7deee4724275d85b3cc5f384c5ced3a14dc994a657b6be9f4382fa469d6cbd6c8e1c28f943a714f9ad76c7418ba29abe73b3d78643153a4ce72fe63b7e43a2874af6a72f63af1bd0cad99226f92d54d306d3a6fcb24cc29b56d8a094dfef5996341d5c4397525d2eb152a58b6a587a62d37353f4bd347c967be282c614ebd0a0fa499a4bcef9fbb13324f98e7c753a1bd5cce058f40e1eb6c6f365a093943945ff3cc12743493368b6e8bd274c6378263fe7b2b23a411283a59f83668e997aa2303c267487971018ce37e9c9c8a81efd021d97e409ad34315e387dc99c20a3992b5d38fa7e969c3f4a4d922424128941245286088a175c7832dae7cc5dcfafedc5165aff24485e5732e801811178a1054c36e9434e30a942be9048c478918524f1ee4e4e713273c70b2c147cc3495e76035e5ca137ef150b96b4fcf4b35e58c19b28f97c39e6bbb75e54c17c9ee52262c122d790157841853f06a98d5bd51be90989442211304040c6ba8f1f65a0c08b29785379bdb14b7450c00b2968c08b28dcd99e243937099997175038a355563c85cef5e6c51312cdd7976b7ab6b613f4fb0cd3494a4c52b49b805c745ede4da5a82b134ebdb2e994c6e6374b58f6df44acce4efc8a1256bf987325493e8d79124aba37ea1b7d766e44c271a399611db5acb62394c376e61e934bad848cb0ed6849cdfe9895494824c2021f4e0602bc2802b7dd2d65ebd5a31e193e7a3c1822c881811cfe8233c2d0e12ce0b11ff8f50c44222cf08208fe9c7049c8f28bdfb91743c02d8d055fb9aee4792184a735db889d1c56e57a1184e20510bcf801ff297ec66d6b133bf5812e9ea14e2a786d6a767848bfc08c1d60782047067494c08b1ed8e27d5207139354375ef0a04bbbde9af33d1f3a2f764067467dca60f142074d8613eba3e887ec7c2e38a98c9ec77f63ad8b8ba3e424caf79c68c6945b6472bcdacdb9daa20d1bf75765ac05e3ba62de31ba9294a28526c79578e7b652d1c20119dc9845f1a7366ceaa8d4ad0471431664d8bdf093f6f9ac92e3878f1c3a1cb023103762d107c98e19de24692ee6062c92eddc52a8eb4f89d11baf58eee26e3d7bca98a219375cd14ac5f767af2e4bbf15c7cb762764500b75eb062b12724cf8fb2dc9365b53b8b18a43977cbaf29bd733a707375491f579a9a58c27afe95424f5ee6a31a4c4ddcb0f6ea042b9f419cbe1aab7ea5360c95693f49231aac6dc30c5f973537d3c75faa68970a314e9645b55cc9f374f38448706cad8518687f48f2503004bb8418a1ba3c8c2d3ed771c4bcb7c0c972a5b0ef5c0a2a8921edaf24df6b2bc22bb0a0bffea30ff0cc7400e1f1e52c656c01575254990d24a5ba168d8e9d2d8e89c151cac28687897300fc9988457b145eb5f7ed3cff3bd2a38c1d259aed7ac686a07385261e8f0964297d4e13e2a3ea1242c53be4bcd491ce038c57e639a25b9c76d9ca6303cefec9c766592523cc0518a73484d396be7b324896a000729f2f7fe9099ab3911e1188517e72cc96b65047088c224af6e6b87d911d5ccc0118ac2c79252897a6692f11f384051dc4a9dc4d9df4d5a0103c727dca84935ebb2675c3d51de1bdfdaf06db58e0c31c6e8045f49ac9b2a21638b1e128978000727682f295696cb581c9bc0a109a38f54ce497f2978161289ecc091892d5e8cd8933a211dc08109bd4cd37f4c7125e57b89d35fe5134e3a4322114b9457e953856bd84e7748250a2d26b7be9a64c594c82ef26a723dc99b7242229110e09844e94e9e9ece581279fa2e79d4e2e2538c4462d12413644acc122b1c90e83c3579c84080e311e5bb90717b2d273bdd11c6b7122cd964fa0d7a2336f9e7ad734aa6c40f23d6d73539ff36774367115cdad4f09b62be30e11f3c3c06ae021c8aa0a44df6b0a7aa41d7445067219f9225c95b1a44247dcc90ad394cc54987e87248af13dde03084f92aeb55bfcfc478fb29c4a3596d3c4569876547f310430438087149f1bab47d5bf7c459b028c031885a4b52324cf41a739c17ac0640b0e3b88f1e3fca30050e41709234bf66f1f2d16347e20884f6212f7c2cc43b833924a0830c1c80d02ede3b669a0c7d2f878e1ecfa30638feb09f94a424a59d2109c0e187f373bb4948542c31a70f38f850e9b7491b542dabc684f0d881630ffd599a8a16935f923afc038c21e0d0c31996ba83798e49bbffe8d1e30338f270aaeb3013664bca193c70f19349ec4e276d4adf819eec246ed4ec61826b872ea989b9e4e3ca73b20ea544589adb998b71a343df57b92b6b3ea1de9ac372a29847e70c337939381d26dcd692cb799238147d3c26d94aa9f8e90f70c0e1abd14d1634e5903fc1f186b4d5a7eb3c555d7b379c2f553586bcdf5ce26db8eb438ce7cb6103e335b9712be4bcd86b387fcec94b32ac86e44a974ffe2ffc4a9306b4645d194d6d51dd82862aa3462ffbda7237cf4064ce7cb8643daf55080e331c6347bc9abc61234338c05186fb84794dd22193894e86c3e72c6163593777d6078e31e8d1296d86c9a5b9490c78ac3df1f2ce30301f63496ccf83a1109dbaae515267927cc1d1b7ec0e2727c13aa6070e2ff8ab2126ed962ef82945b18d492b896a73a1ec396636d94c1237698b630b5976d52bef3f593e80087260c0003a7cf4f8b122c881011d3bc0a105cdf6c27530694f4c380b76a578f7715f2cdc26a58cfa7f8c31ad5730495bec3d8f66f2c658a17829996931a13459aac0c794dcb7fab1a98c0acb487ffd7ac820c3026ac03105c3b9f5a6760956f24b61cbb549d00cd96f4f147e4dd27dcc490a27c550784bb47099dbefb1fa13dc2c96379bd8dbc5dc0975aeae4fb97c667769c292ea39a3e61ad992c2842a666dcf67e199525bc2995af6ae235202995e2c4acbf2c97a12bc98f559b765010f31ce88c01d702041ffcc9ffcfb3e8217e34bf95427d52487eca0030e2360e25710db8ca9c7f245782acfc6d774255b5689706c782649b70df596212476b9cf8652fd4c08cc091ef2b9673d5512178c610603c0123882b07526cfead6f17e7220e06b163d4be426b7f507bd5eb4f714199eb5f9c08ea9b72ae75dbd6c8594e1c38c761f3b9c0547023fccd040007c80a3075b48cffa13f3cdfd8444226398f162fce0e163bc60c7f7d8c13b660086057c70e0d733904304393090c387bbc0c792f1fe8153e0e001b266514c68db69fb71ecc0934377879aa4d135c4a1032a76c9b1937c9ea6d90e905cd826c6cde96ed5ef1f128924082ef0b5942ce93ba9a72cc82d92c7ff52988e17cff3b638c63093da53c911d1d742cb31f64b8e8e16e530265a2a8deb64726661d6a85462cffc981495c55272a84ac79458a4596308f36cd2769282851ea3a535ff04f20abae44e1ffb7153ec9009405c01d20a105680ac02441520a9004105c82996fac9b01c3d668c38e405653400c414608094a258e2febf8798564b482f045c0c1f61e400e30cc74048195b811c8f002105c828404401128abc5536b6c3562ce54141869ccf5eaadb96ee273051d793675cbff2c813c5935c67563ffbe41331403a818ee79f1c724ea3ee9c2889261fe5af82fba89b48b0d1d89be731e9a568c291da144f281f2413c5b0196bea345fa70e01c1847eb12693d093e1fab9c4976747bc4b4fd47c1dc412556ce51e718d4a165525d81dd5ac52f9ea634e088412d6d988d96db2501a0e89444026c149163c86cc1b13df21c60e2580488268eb97133f73ba135f22804422d14a480fbf2327fb8644223f0081c429ddad76922cf3cec903904718fe39fd4458ba5f2c0610479ce264dc588d39fb6223fe689a317c95a79493308030e298ee244912be345c6b8b404f1253bb9ebc993279014411b8647dcca82645893a02904498620ceb3985150411df06bbec9a673f2c05e410c9e7342a57aaa9cf0a89440e0f07411b400c91da9bd431fa335bce844422659c01a410b46aa7689f192c193b7afc0fa700194008b16ef68dae5ff2687856001984d9267f8a915fa7eb4e01441059b42bab09d3ce5169024820deac9dc47aebf41425800002d7384136f64c877dfe70ce187fe65556b12a7ed08377aca871e39c1481f4e1347671db57c7524807081faaa8d0954cd65793fa3d9483543e3359cee3ba7a70bd829d7eaa943d2f1000c983514dde9cd8ec612ee321a136675647e8c7fce500e40e9acc742739c9fa71317000b1c3fb61fba4d04a622e31241299001b40eae055e59cad4e103a244a899a69aa1301640e4911e5266a789cbde40191431c8c258ce61493a161952f80c0a1acc184ee1bb1b5f8435200f206d7f2c6b4615b71352606206e285efcd292b2a38c33dc053b7afc1003a40d85f1cdcc65f2c99e3936f82e25f6c965c9fbacc178d27676d9f897581202a206b6baf723f27f4f4bdc053c5e009206bc53467c7449c9c78444220d8206b3e8699de4c99bbe9dc1947e3b77bebce627cc20660029c3275d12b27e5d2a3719b202103218d2f14c0acd2dc90bc818e858e9ae28a152be28881812dfee927ce7b53e1648180ab99a97ac70fd11a70002864cc2f7cadd837cce1740bc60de13268074e13ac1a32f49967d72b8501acf795ba962c9311812896ce11213aac2f698466504102d70f1b2f63d4f867141b2b0a650a2949ce358af068285b4d26235de258d7f8f1e21631c319c0072854bccf4ba463a49621f12891c01c40a7cf0d9501136d6d12404092055389c97ed094320e487182328638c311c9023c78f19f80f1e3d2090c36320461140a8003285bc22bb722c5924dea40b2052d0d34a305bcf71b4fe238044c110f1d4e8fe4e6332047254200708744840082050a02aba5f6892077942bb1596212c66e5392700e204422a95349fc1739a0ca409e87f3a51ad6b10265426e48969244dc6f2d1a301204bc0b25cdda492d537018812eebcf6d1e9fcbf630e89444092d0695cf8b42f7140c78e1c3b725860092048d8d4c468f92b5c4bde2e00720453bd546a7f3a29561f041023bc715a9f3ce684ec2863cb7000007a005284f3f633c63d314eba730042043fdcf37396879ae8e10064088cabc4c50f16635516c2714b922ae6d659cbfe062041e88470b9f8525a524e56200708744840070d408060b2b297ecb6785a412980fca01777adb463bbdfd611407c70872c9352fb9b31411f80f4e0fc1e4f6e1e4be52b203cd82fc79f7dad0c901d6c0044075fe4c24b9e799f24496aaf784824f23d768494b115b82f70f1f77a2ceb183d54fc849801060fbeb84569423febc439045ec60f3124f0852d5449b7934d4c9249f39ff1430c1e3dc420c317b53876dbc9f406bfa045d249b9e12fe5b38e3f8c59f8f1e6e46a5b2ce73418be90c566924ac7099b2e9a7c2cfecd1c9e520e3e96db2e7c018bfea35b861c8b5591f9e2159c24ad5fbc6adf5a8e2bacf469f3cbebe49cd75678521a938b7812432d168851c617acc83be6289299829df059859ee94da30679b1d6bf50c5fe19bc5389713ec3938a524531b1824e9d4679067e784ce10b54f4f1ace4133d750add2a2739c85b3690a3023a92f08529088ddccb1e6fa2a296c22f2bb9cf04c993aa26457b6197ffadaebf4a4661dafe4aed92a74dce4551d584c97d710f453909f3d7974992a663a028e54c2917e261cdac4f1c196ea67f53fe9c224f6c269add9909a21b4f66f045270e9ef33b69aeac6acf09d445bf921c19ce4a7e136a8961334b43f35f471385cf84d598a6cbce45f045267091acb74a1d3c9e184c1c4b54cf0ea3ddea9613beb8c41ab6e4fcb1c4f24a1f147c618953a44e924d4e315bc548040c00f8e08b4a64e9a77c4b653ca59e12cd2771a66b2e7cbde8e38b491c6791e13486dd664612a54d139ba4892271e612f6faa5c43cbcef1f80c1179068bcc34b9c6cc8becc23ee3ca2963d86924d8c99a231be7044276ec133423bcd2d667cd108efda3f562b0922ff09d9d1811f5f3082fb8dbb8cf166ee2da22d69ca84b874c16274a9084df0aa9ff7f413d24ec479cbd6f2af09de6b410453a231bcd44d4c387ff4be800c177c7188c2e74e48c99ae77d43acde95b2654f32fc422853bbd6eb6f1d3e8448d3d3de489f24d919841fbeac4c644198bf76b2740e9ac30d44755203e2cdf559bf12fa37fa877b2e5b9213dbd3523ff0d1fab52e9b654abf0f58d5b7c9696ddb449f0f64cc93d462a7cad8fc1e6ebbfef0acd1831d673a52c46a2de5f3a0b59494d484b83ccbe301db649b57aa6227f777e8926568918cfb63f27658daa4688de1a87410230261180a0582a140180800886a7c2600831308303044208d0563e1a05cdd7d0014000044321e504a2622261a1216121288c3a17030141005c38030201008864381906a10e76a62e305d72d1b211327c7bcf8ca84c08d040e1ae2cc94d42194d2169d7c484dacfe9d0c211dc1acb9e826198e76c5fcf9113288c78850643b891854103900fa3a02b39628ec340200dfa098f060433e91e90e826416daecd7233056d942e0c21329155dcf86002ab254246a4e64b4a5ef1e5adfefc5a05743283ea1268afc7d1ab3177c72f54f51292536d601df875dc1dc97399480e956ba1a712319615588a18a904dc18e27617a90ceabc86568f6750091a4d555bb7738da78049007eb138b9d0e6a900b8f98603088353bef28bcbcb107ea090bd91aa299828e8d69f14c89679de6c05c0940eac1cbf23859215fe5eca9b1003d2eb1438500e4568ea26e24e451256f747b71ddb996598ce06e344e38395cd7ede08f7fc3bfc88860606580a52e4da65449c3303118afa58ba4534e9c5546b7d391e0a15c14cb1d476cee12934bc4225b1d0e49e733bd4430bacd7b732ea0c89d2f54cb8d72f8ebb9ec5e70b0e88e63cae9510bd123d2e4b2cbadf2cf8796775f60f72268121323a01d530640daa954d1646f8aaaeec66f60e4674e544bfdc8097793e17bf807eea8e8c6fde7a978eabea8b0fc3f6a1aecd434ba0cd30dc54bc1e5892bc2d35af914c130bac09ff7274835308b64ae16e0da47549690e013ac02184ad4ee00d242ce8847342496f6bee0576244e99af3373d976cde4e19a42185693368592e5645922c865beab82d1bd969fab4064174188e4769d4784e41c19b7891cf706e88bb4ef074d55908754bfb812dc708ac3e8a8267d789a3b8eaa314f1a8446acf90fad7dd95177a064887b30f7a060985cc2a70ecd37093b53f64623793ca75d858fd164bbe9445ec20476c42209ce07d99d8652d5fed200d3e17f5bd66a4369de878ca3fa5efe59e9b32d0e5c11882605d8e13fa04b3a4660534a82c949331f8380fca014f1f28dac9aa8cd39fefbee0d3652a7486168c7aa4c92a71efae6fead18b151bbfef42d8a267b70328bb2b140acb3e1cdfb61e231b53532b89aa647e440ed2e193409a69e5b122dcce2b93b34cfb9c578a69b4a80685d677d8e5638ed4e8a1809f4ea3e011c881ac2f29e7260651cf20eb2d887a0af2f532203750c1bce16670f90e4ae04db83f8e1df1c65aee0d177aed726fb7d8fb167bb525bdd992bdd39642d416dcede5b4b05eb90b51d61e203f840e462d06993d7cdc94560924d0735312f12ceaa0a928e112dece640a1cc13d3897750f18a60ad6aae10e3b090ac954c4d04121d631165cf07b6a321591a928314da4732ce4a37c6443cd4547d7fd6a3f864b373efdc78bbe80901b8e481f12d7c848378f19534e6fbcf6f26f8ea9386c8d0b538690979f56c766ec21de8d715a966e6a9b84484d1b1089261bc8673abbfa3399f9e276a09b88110a52f3b0ee0ef1849f6190dab540ec392d6d9bd52540e6ec70d9097271c9e2a8a0abbdca200e4ccd948a50d5f0391881a23639763936860c13978ebf162c6d8cac2e907f4dceb20b0e9b36231d29734479da57d4479d9632ea458c7a844b9a7abaf494e9094403e569557994330df13ca904a7a4e9a8534b5230c15ccd373726ad1df80331bb474bebfbc3cede504e0ad936bc4cf3398167beb159aaf66c2998264d9294fdcb4632f895f5d2350a142e2868fa0d324dbc962bd797ccb6a0f6b1fd117af1b57e426ab14a9055775d6b2cd68062af9e97f2e63e6f1cb0e2fadc98d615c9101df28ff934fad23aa05b4994edfbe2d7103762db7dbd328553add2c39c488af4496fc0177aa22483907dd063298587c7c37ebfa157e335e88da74c503d6ac4ee9dee63a4637d14a592604c062e0d9426982abe230156c154ae5262c2659e6b5a30861baafdf1f0c56567b58e10136ce7bbab96b2ca049fa84fe7d9e0701471696aaed3b47794d5239463c769887fd2ac4293916816d87a7fbce8855265bd30e33c6ea32c544b698b2f559b75f957b2963b9f4d707bca2b1f02985a8169b47b57ae3846124b0f67ed003496c938a77632fba84d8cb29e4efc9591da43b0bd1945852dc63da9fc02e98a04dffccb81cadb6023700bfdbb5c95d3380d90a329f2efc3bbf0f35163c6ef39a783c6e645aa8c629b23c586c35161cfc817d055ea29b413cb6a9dc54a8853610897674357f0af27b2420d06c1fbb5b35c671fccd5d54de5683b59aa3decd1f034220ac33e1d4d4ae52d008a2013bdbb07d9a8b99f578951316640e3d447f4cd3a39c7205a3c007cbcb288f78a4a0a392ae9dd3d21cef3dc9987e8fbec9708314ab025dc1f5e512f6ffa842ecf7da0d129f530c728680b06c702a24c75d51a9d75e03d67b4196828ac2de15ba3b655091392d6a0dd22319199df13e63d36d728cb58700898732dc9fe68703b3136f36c125c41633387f9f085a61e05d2b26faee98c016538856b2b2a13048de0afd90421213cefd0a40d744b15a5f5d2bd9064fd06ed1c27afd38c4c9b100018091f3337c046c99e2a1fe362457afb949514f03e15a40d872358a9f1237f1fcecaba7ff3219074317d01495732e506fb772e02c551cf6e4b221331bf0a50af3c0849cc6e6290b90d47f1c1e58f0dfe3e5c8226eee096798b913d4967d90922b0b1f8d5a9ad3352a6c6b4ce30f5e3bcf797b1353cc5b47f7423219c0fcb1c82ffe09e1d324dccc39536eff5255021b12f7ead9f24584a948226f91280912a3eaf7f1d812a150b2609b3201b23ab058eeb858dc9533a6098806fa74c0d5c031f708db012d5affe4ac27cd68d97e9237fc28f5239ce6999c397287f2f55a2174d7e19e5480bbb55113ede2a7d4f8ed1be0720d97234e55957f4df582eea4d036703239de1a962b6b33cc4c4fef6d49b0b75574f7558ee1e3923deac039e443daa0b88b59fcd147deb23cff83f31790d016b49850215bc7783e8a77a03bd6b0dd29c1c4caab1ccc93c5302fcb2a2939dbc9956d56ab4e14c1a81850b3656498e283ae39e4859ab8853369ede65ad57074ce7aa4a3acd005298f33d9337ce78ca9a80a69af86791840850c41e0eaeaa2120de120598f0382fd029f082fc2446deed69a4a14bf76a38bd61d80f78f7a203c13f89173a0d03381c5f78c740566da12f0d00f485dec61a1d13b86d8594296ff65c45e6a6a7dfc63b78b47909eb958151198a9d32bf3935e06892b4db3c2d56ae870d1b8fdc9e31741cf1255e34fb0c7e776fe1382cd362ef73249118119fa8980f7f0f11c37f150105650e5c465b971104768adad7c5c20a4fae3d10e624548721590e534a72a26ae95bb52ca8c1505a61d82de060e87a84d8ea3792936a390d22ecf5b0a7a680ed19284d58e789a9305034c8721d2a719040a99c65c9b0ec959bb917905211a5db38593c3154ecce7bf3e274864cba75a21271a5da42c1d021f355c2b0a8c6d4e4a48978f08b34f0958d9ae8e6bcf36c04016d3dd24c2cf92554f06d02dc910c49152da55ccf4fdb4ba08875db45204c18bb6634ac6136a1508a121863e862cfa048239922026fca18e2e1814670922a4820318203e2fb22d3ab570a99353e95c6a8c52f305b2021cedd90753b3da4227871c27fa741a4e2a0c7c8af45ec87f18ca751730907535cbdabce24dcb24c027409462f61536840981f8a0c44389f323df77880f4f8cec41e49a137d679fc124ef4a2d3e284a9740b8db0dc75917a7e04a9ab6f6e847192bfc9929fafe189e3f900b023fc6886fc29d868e94104307c86b0aff9028adc1d8ee179bed3f9abdcfc8303c70a19227f76083da38d99a0455b102d209045b8dd56b8fc04bc1c941b2f054006ee841d85c31dd41d152682952db8f9fc5d873defe0617f35d645e42b3b9ad73d08bb5305c7cee13668202874d244a114d7f0dcb7936d5f42f5fa61a13c47753c60999446d6d570addda33258bfb6c6591fdcd86203d094ec8a04b768222174422f0a3ac3fff19d2ceca51297c02f338de2e00f9c3b64f0f69c9d666c352db68fb4cfd4ab4c6b06dc19bf89d1b5f1229920912acf1540f176ae4c4ab0b3eb1740ffcc0765f35046b5b420a6beface53ca3052889b04d7a1417486befdb5580e33355822bcb1ba83bc6b4408aa61fa2e4119beb7c4b862cf00fd2aeb9a637ac9338de99f6b31ec11bb2d311737cae334b14f06a841e08788bca1b20e20714bd4d67029ddfc3a31046a61106ab071f76106c3bcbc6f0e94dbae823d528eb7259585e792990cf0ea8892d9564f63115e07774794bca301f7a905f6fd458106901d02e12b549282003d085c624f648ff63a46ef7764b451a65488d046fa4843a5f3b50b4672ad46ef02025b21caea5fb71470efa3e6b186afa3ac6695ce0ede2cc6e4c2de512ee928b078f9ca847be35ba67ab5156b92f5f6902199c5aa3417e9255e58f564029156f38f66c961357dbe53ea14f8053b4fff9acdd63ccd54a18609b98f58d4542b50db8eda54fa756796fcb44be9318d81077f0f3f229cacaea2866dbe9a69d1610043a3dcaf9061eca116f6dcfd68b4df4f98b41624d9766dc981599bd36fc5f4d3c43e1954fd4c310e583e47f2747a9ad9ecb0a01e34ca9d3bc6cc7343bf818cd11e3256f12211d38e346ee59d735dc49f148fe41e4f28d3b55c406ac94ea0a4c548339b225096cad46fe58b2702043852c0f8260be559452012cc3efb5e484730c0720134c6a50b95e85fc84da43781c2d63743eed25f7269d34a5c06a5a62903fe0dd70469929e1f3428d35896ea423dc50dcb9e0d724d5f894853bbe29a99bedd9a2aa73613d8a24e45ca358f2f107809ee5a98805f23d4981d01c7e1c0f12f45017a64e7faaf1f0b83ff0b7a8d235a149d424f448be62d48ab6701b265f3c04a994b002b169f4bc8a3dd1043b7cfa33babfe36d71905aba66ce4fbf52bdbb475b70ecfe5a574c280198035e012549fe8f13c35c24c98b0c15773aa207d4ff59d74917897bb2649e4797236637bb31be66d98aaff1d29b79d648ca4fae5a8cdaa37b2341b63669e6f3e1d32a73f1f668a2c6464b6e81c425e1ddab0eab07c065fdabd7c08cfc96df6366670910cfde4f6f4d9587adb610142a753c59e01df713dff10cce8dd77820c0e6cb7d7ba6129ef2236392e1ad20dd438e458febe4c97528335454bbee476210080ba5715b4af00359e015cbd55b62d8e4d36ccf502704dabb01d07e3ab536cc854ed3bd7bf348defee9125c478df615b6ebe3b78796cc974c81638e7e249338668f792c5f60a7c4e20770f6adf25a75697e168ea045fdba81f4866882837e9eb63c567f53524e353b643e686a63cb9e9b6207884a0722e53240aa1ff98f88c97cbe3249801d18205ee68bb866e5e12b53bc4214beeb766cd7509fa4735e8ae6d778d9488159526f07fb071ded25919cf618a08c1cea20b50cb84df45fdc89ba751489ca6c192b50d1ae3cb09285dee383dfb411fa20e9447aa935ffbec3bee8f151dcb9be787f724c639647e050d023b9ac477aaf839c0020f27a21f049f2541939936aa7454e39ee0561aac2cb2ca1ef8fef7c9ac5f7daeb6e0ab12d51c0d2bb8da5601818f0fa51f41835b568c1eef83c261120748a7a4e76df806031d6943661459e8cedf493a77d40121665e8406aff8c97f68476585db25c6b40879c405f057139c9dbc2a5524734d6d92049dbe777819a16008191ac7d6dec4c42a14031443557072d959a3056435b9e4d2fb821b29e2cd917b3b8732e7180fb3460fd2498daf67d27639fd81ab129eca6a2529447f9f96c322aa953dbfb9d1fe4a11033a82d2cf84c409347f3ae7f378252c1f125143c2f7f4b92606410da9f08eb301d7c21aec7d193aa98b757f7939c2d6e34252080a0b4c60662bcc9ee4d5d583920d36d257d4bcada6ad5531321f17e9962f198de578e6896794915c59826ca580a1cee5cb2dab1e8e508fb587672ffae77e8c969c68a996b70d4ab304b932ae8c1ed78e0a90e558389c43fc49c240442d3d9d38f73004598eef51a0ea443ab29f2be4a81317458276782ce1dc3c730dde153823721fe162decdcc3224402a66d0450c8ded923924640d37f7ea60698e46678cb6b31a25d1010c984e39aa0e660afade5a84355d2bc46c48f2aa1ec3bb13fe485c7a6885638881205c510f1224e1c2bd85ab19b637e4d8c38f6030913b73c99c9bb8ae73a15b7cf59213027d4db348ac33b42a4a18d0455966f231381bccb7d96ea5ab8fc4ac7670cb4218ebb8d357d1d257bf315632cae2850aa256c9edcfdc6abfcea5ff3011329dc1e737c099f784a178b03ea3191f4c9cd82a4b056b180e4b998e2d047c1032af3050245b5b9eeebe0ba9abe6e027f0609ef442f5d88aa6e355da4664b939466f0cba42e9020ae84024b982438ea10f93967e8a380aade9be8e41fa953144b6d0e58a7fa85ec24ce632bc78ca3211ae0c4ff32573a143f3aab00e93d7d761c92231b2a2a74c2f63ca797653835ca393419c98f4650baad1da2a56b194e1800ffc42092616728be0ade4874f804e31180b39925c9203d2ec1af2204011c441e3490151e13c16b7297ddb103a20c54d65a6638796d2229443e228b6ec4b0a5d53a247aba7021219375105566a25920912847839975c8c37ea97ea7b4820bfc8ca9d133a6fa936d676127b29c727b108f2005a3c84bd1fba200f9dd2be4bd74aa95a815967b2655a2184e5680c4c6045101c0d5270193feb02ebfecdd4355090728272a6bb8f03853565f9b604d8c5614cf12d3a669ea2e9ae1109f888a6b5045a3af05e2a418c1db031c56110e181f867d7707ff22186c2d0811a706d052a97309b3a95d2036a10599bf5bfab1822ee3e4c54a0191730ce141d2bb65e76022c7ccd3532d4764d5c4253d53babc01d0ac9c93f2c847a1ba9154593db78bac759a578689e971ffea31c4ac8d770c3a95385bc7d14f2fcae8a04b5a60434cebfcb8d1f3bf56d79981807e79b67de3a20bbc2072e47a878a623732ca9ba19f48597c249486329339c671db51e640cf0fbee7b9e01c2fc70a32d95019cbbf255dee825b49a59b0132f60a946545228b3e982b33584998aa99228a3334cfd5d6cfa69a0aae97d9bc9fcae8352690f9ee564917fa214e365b839b86b2033235ca087f25d8d476143cb3ad6246d2759e481f0d08401014db3ec54e89b058cea9112501f6d4e999aadc1d16726a3f9f4ae06c42ae07e379c0a2d07045926c3de871aace863b55f87a7676fafa978d0d0eaaf112f98e9e2dc44025fc92544dd38a6ca291a5a0d52895607a022a4d775ca030ca4aa59fe64780a8bff786dd77af6f152db82ccb96c0bbad7879f511583d8b6ab97f3c8c1dc4a2263154173970ebe3c5a08c6965605b1865293c6854b605bb4430171bc53750c0bde1bb62d08cfd010c7c1c9fcf4e443edf91616456cd4391a2803496d6f8c2e1f153729e7594346690ccdf5291aa0064df8d90b2913f8b0a9bd38b063608b614959846da0ecdaa119825cc823585f557044cc1a285d6f1b4fb77f8ad8116d3fa11d7fa80e6112d2ea6407fc3ed8af5cb434d5b3409f70f9e751e5147ba13de84a502abdd683207379583aeb29d7466971f2cc93156fe6434fd136bd81c33719280b458e30c7db439ccee27f5c6cb9ba4391032e5f708cc04598ce95ed70bdef4b537c76ed6a88334af682adb91a2876a9cd70db3c29bb0d5c833189215d420ebcad8ea0e0be22e288e8cc1db074b9372772ec54458d25b18b3fc8bdf7a4eca871b2355537fc062197cae18ee2f989cb89b61ab9111565543df92fb31ec9988b8637cc93286a454dc226e3f01ead2d24fba1b37937f64db88d47243dbea33982b31123d37decef124a862ce55810eaf5771b5e702d5290cf96ec9c4243af5da908e3919ce0ceeac5fa3b1efb22e6029b2521b4dc016ee52c9547e547759455cdcd21b148b608b55022808f990218f1efaea44458f3fd36116a4e616ba28069e2a8d97157265b330567f7466eaa93184cab6aaeea0ab4eee2db981f2c1e720b9f13803d2395e3644d321540c1bcf0f2d8b197b588e28cbc2f38344f40bd34d9d1c9b95826897c43dcacc64529a9791f8a4a494c1d8d1816b4daa1458c9bddff24ba29e41db7c1877019894ce8e8b086b83b5241cb249ba50cc8cfa32fbce8d085897be9ca1a0ea48852319c3f60981a029ec1383833013435fd0c71e2f448097cbb04460ceb023dcc57da6e449dd1ceda35d80060dab3b5cb6234fefb8c0844446e33858e83f5702c2999a82cc475b7a28a259d6374c2e2292ca2965c7292fc7ef12fde28e04a26281623166ee91a237c92bbcae19075da3045cfec416ba5c6000d5b9abd9984765a5f0428b2efef04b791284190a53b6c7ae94b119d65a3196f65574b05dfd29ef2ac0d58a18058ed0213fb840640b5ded6a06c8239aa66c987c173f5ae40fbae9aaf3151d0870876c30109a1cd0ad791af057090ad6d2bde43cb095f4a88e4e301c25cdcce0841557a626dc31c6e514a761dd75247b8c2f3658f32fc12fe74c89c1b2c3c189c1cfe64f1630e1917e6c13a445865884042b11e4b9181b79b1b2fdb1afbb66608296f48f98f139579483dbd3ad825f7b0edc332d9249830cabeba1e3bd05885a8303aaa41a8fe0eb6b7af862cb408ddc76910ac4f3cb5c7813ce13416034b3e0ee8131062b7dea333db3e9bea4fe47951c57922e89d403cb0c722bf58b3cc5b9b887aca5500396c3f3847c0354d102d32f27a4f79ed405939a3487bd2f58e02da52e238ab2621268e3782788e9ab5bc19b186130779a92003f92882b7b2cb14ed930509150561026b16f65fba791aa483298602bc331aaa45327e65b0313be4175ffd3f9509123367f8e6075878cd2140278d0037c452d0092d1b2c668688b3fc900e67b0e91b46be16cdcd7edcb86ab26a0887a5844508bd7b49b23fcca749e4899bd0236b572293bf93fb43a0177a0f01a15278cc0d1da2b4fcb08798c73e4c3c86078eed4ba6acb7980039f3edbfdbea3dce951c88940fb9b64e0ca311423f2443328be296d46aebb6643facadc209f4ce857b0f479750968865441090c8e743d89df0207dd0b589e5232e47223847e8bbf7bab2b8dcd4e9c37eb2234c247f9857a229ee0b258f45f0591b3e2a7427841f5a5c889f27d6db38b0524764fb8eed8061fd9736823af47f35f8f98bdb50fa77c1d2c3d4f02a13ab11cfe06f4eb8c73b1bd757b49cc07dce24714228afc9eae6d730cfd14c90badedc299895ff69b01b4b362a36693d307e3d5eaa8ab52d66b1cad28e57f011d2c9d6c146da6e1754b6b36661dda3f3b3921e249a348933eaaf8841c98fbab00b54a403e1b635a88b5fdffac9dea3f0a54f28685d97291a18ac167ded10b9e212dd3a45c34059b4765cd4bb51d43f53e7afad1633cf21afdd4b9dae3e69ffe9f83c5b2f1350414d84b73123272d36cccd0f78b5bff95089024e7421b632b9bade492080f705f7d31f018a9b3bd10da6daeb80c3302543d73bb118aa60f6acf24f5b016aaa12f99f660f87dd2be59c83394b686ef244e668c4a247ff95a0617d56cbbae0a7a4c791e72c41ffc419a0d0057ce5cd618bb91c85a2b19479aef8b9f54d551128c3d8d0b6b9973e65873fe9adcf134e4c8762b5bf0bd9e4e889b0cc825d710b899d66d71efca6897d2b3d407cdf71fbab5a72dbdd9818b4cf17ff74ec97f9b251086c3f40b7bba8b4f61f11244a5ff463322b409c1c58e06df8b9ccf7c25b8bc2bc92c796c71a9271490c395a96412c73097dae31e23e2803d427c81b8f167d2ae7a2bfbaaa87068c95a11eafe6cbbbbf28ab2b292b73e565119d499da812e131a2ecca369b0b1d2228d19c6e1357745f7d1278fc92b5fb7a42f95060a6dba62995268b5a87a8914dd11542e15f93cd61b893b639323527475977dc24a1206876e20f1ee57d6c8fc5f93edbfb1703cf69cba5c88e12e133a9aa1a615b7a195bf237f3354a6a20528b0ea8f5f02db0d2aa0c6eb9c090a0a4d4960c54e799ef3dc49decd1abf18a1b2bab65d08ab7dbef26a9c1372aef23041f9ae59c1adc4351794e2e0ba5bf43524cdb9dcc9b024aaff40fd6ba4d5f86f5957eba3c7502d9dd00507bfb16bbc78ee0521ce6e38447738bde91c594861947771b5bcdeebe88a2fe6155cc04e417f737be578503616e690bfb0061b23286bade1eb6e4dada902c8e87acf2d7d9beec472c3fa4dcb9b90d67a46db71f9fa861de1a014e52c0f1a5e943dd634c99ac594843667429c9c1f8bbb68312776a0831f8ef0778add4db9818649bf77e8e2c37c34b7656cd064c0721f9f0b7641f19f02a3274f83df7165dcbc3e4969d555db704c23bd1f3246fb07375795dee9b6e32d858d131c92e251e21724073435f99d93453549e5685921843d8e88d25e340649f3f60ae5513461eabd1c20aa532e5a4c7849429304b526315c25845b14b37444e00b6e31cf6fedf73f1958099f70413e694241c00f67c83cdcdd28f1f12f0b8ca257d6d43c8fcf24d5b869232dffb948f1a7fe59b944404761f677f8fa2679110aaa3bedeed5e3cdae0742600e2af488d9d162825d4da9191f9655143d4b56859bf4ad0991568054ae03ff548d3f14789b80907349f02a8b494d5aa09bcdda2b0d00ea74b48fe1679dbb0f73111eb562b2406ce09b45ba240e4f927165a35f1806aa8200630f975c052050ae1abe319d7ce6e82cbb4d4c53ffec2ca497ed471bafb6a24a6af382b52724929246935cff9e7473dbf5822c3a0a2783fb7a2bb44cbc5ff7896cf7600947e6dfff440174d1eb446b23feaf51079c09a45765e068b364a7c3b8c2cf8b90438041466a8b67bb54f35b9f548b40d3e7b5d7b56ad0f5d716f57a88dcbd8e9b2ee95eb5f779e3137336175e73d9c9b6b1b8a2f9f638f327d3fe1524b38a8b257667d9ac924bc0f52b36358412f0ee9356c8bba19c5ac2d05d9ff4b4f9af98427ef35d4ef8edcb3c9a7767e25408c1f31d0a27a810b51dbcfc61829620b68de893115215682ff61e9a4c39cd52e0c058d272d916fa05e90c3378a2625a0f2383b95a1599574b2d4c05170fe67f817c28e4a9263815983be184a256df4d8b992322e3ec95a94ba15d602275ed4c6516a51f0c7240bb266151e7b716c0659839430d667a683410ea27bf15056b81bd8018c51456571fac3368c4c9a5ff11158b1882f2e1fe99db7a5bc1bbdeafc5974e075fa562b2bf24a94cead0b527c918f7046d8520b2fda86e08a2464fa2440c83b82499eac1797cf72d27e170be1288661151a8e9b5ecbd44e7d82c182575660a42e7b5b0ccc79f081c7585e47990618ed0153363fbb2804cd88c87e84abfc95e56b7b75aaff53b9a3addf7592d668d08fc68ea5ee96fe5d4aa07573938e484add69f24629b79bf25689e79b4e9212644953e0b214e9ade55795111cb23dc0011b38fbe9d9c5aade80b1a199f01dc106082ff8c392be67bcddf72ea6ba5960209e44bbbadbf540ee48c3a83d6abb9830b0412bb1c135ae5647a5fb9df9e09463a86365811a12432e8b65b73e055c044dd99527c308b3ef3cd02897d2b6e78b04c7b5e4c499fb67834de805d3d44183184b1900435f39a181a5ac068be224f4875de34d3de6e3b880302a02280d3dca08179fc32646dd44e98aede20d1216c2c01fdb991b7cf45fb87384eee469549a59dbee798ac2dea2a07ce3741215244e5ecb57492a60cddf552598d034cc9b528e48c25096b4a32661060cd35b1c4b2ee54b1ee8b25a598dac2e473fa7958d26f060a96008f09ebd9dd96576f33bd8cd761be756cf78af443e3e1a4a6764caa1c4f2912016cf4cc3292c23b0b3c2d709e5efd3e2bd72cc46a6bb99ddd93ee59fb14785e9e1a1081ec2ec60baa1eff45109f805b606a620b8c9532a1b746e5fbae3cb3345418d18b6676c206a08c2ccc4dd7774996700935f76092e7a05813bb0368f1ad9152a2ac07fe5b5f1bb8596458a213afd77b054ce0091e2e23d2a4ddb38e337d9728d078baba585a92dde8ad7bd6d4442dc0b6a1349dda4552f1b8849bcd726bdc456d24aaa109e8ae37e3cd339cfffde59ea1d65feade892a01703a93768c7db699458c8639701cbea8304184b4fb957375636b64758777c21b5e4415aba5b389bc16b765ff9b5953f687fded40e645e58df53b50a2cf3d426c4735e35601a8f025feae588751201e8dfa54e6935bf1ecb15f429aedf59dfdb52322951c42c446dc9524995c995a4902f7fcb82c85c8dfe2530e44a8b4333c7cbb3acde6757db032e4f96f2614ef3f2857a244006b5b86242e591f66e3f641e5d83ea90f545007d080f0f9e7624396a1d16491576c6d16e158db32df903eb7f233e7545a237ed7cb076425a75c01c66173aa600d0c43c9907e88decc2a45a563168f21f31d7edd2bbec8a2578df744dc0bf99f7ab44b6b6c13462d44b6f4667dda86a476309f427570f28dd20e74f376f1db407023ff1285ce0aaef4a257c5855872a48d9721cad247925a8d6f77ace2ab92c93eaffedc12ea5e1c6602eeccaed87f3e064030c749456f9aed2bdd0a635efabb5afe4ac07cf7a4278dea4e91e1ed1737470d36541284b2831cc71c8dd033aaa2bf404d8825b75ac53e80ab0756f4f94c064abc224fdafffd8051597d3248bfc50ed10e68440c2ef999067072cb2a54a782ca966ca984654ae3f99cddddd244666e8a46df053d698405601a0cea568115375e221e6e7d66b27d40c1ac7c5595c13c179ba0e563143848566a7d87961bd7df4457c267254f27ab6073b46f7630e1e1b4d581c2fd5b9616bd9f5a70358a80b4beb242020c5806e12d47cce56341767350892ba764fb4084322a383a59f757f1380e859f5189cc4c402c2222b7826e82e6d5d7052a0006608c4de509204b87c9d49aa9a8193fc1f7a62f8b3017af83daec101849f052881922c02455d78fc3aca286b93e854ce346535740a6eda202dd77fcdf2394181bf6a7829f9051d1455da4ca360ede755ef0de4727356de37ce17cbbcbcaf8b8212b443742a7ae23296365d3c0acd6770121688101e5b353db83fad635a7834fd8e65c80a553f21ad45854aa7e3f83abc29406f714425605732434d4ccfa2eeb39e83ff84e8db5fb04f4991345ce53d560b9aeb6ac2ce5b349a1c8a441e749eadfc8f5e8f0fb223e9fa25753804489876dd8e934609ee4902a40a705a7503c63ed26f72f2ed4a57ecccf4916790ff46fe9f0abbf29d1f3856eaf2a6dc830ade1cf15a2a25264ee96de8b5be1c5aa39b24f4291aaecc2277e5a57625a9862f5b230bf2956ce80e606222869f481d7b1314a3034133239e8d71c27d85df2f6fcf662751c931667f732cf65139b4082b1d13fa7bb24869d1c7321a1c97370a8bf442a6bfded79b25c76295241a15d1f5fc153cd94d018e538055f4843a4d13b571f5fa3e12e9bb034f3571516961d82534f450940d64a015e2fc6af0998a81ab53989ada7896cf1682aaa056a2b15e975808f07a2b1169f910cbed8aa0be7ff789ce739b7e327e3fc1edd293ac8d4c7aee21b31334132695adfea88a1b50980d1de600b5441e5354a8e145d3ba59251586f6945f4d71df71a747cdcd532032cf5bda9225ebb7bef18a1bd6a70ebf3c6194d13859d89b439bf1658ce5de35a5fbc731e6d018d64a06eccf387497200b469c56c13e3936414d50bc546dd0f0d4f9500aa53a590afc147166439a9bd35d26b931cd17641703eece45e70e3440aea69003033ccff33ccff33ccff3d819df570409bd3b2525c105da07554b4a922d5b041502665f6003cdfeff7fc17ec2890a02040f1e0fe90eb7a7f8d57292ad82b45c6e4d51bc889638a96392b5a5f02737c54fb775269f90e27edfd2a824c928b4da0da2959e2d8926a248cc635693523ab3c95070e55f529f78c28509419194fd7163e53bf90b7ee22bc16dd4a429b1b5f304df29ca86f25c270c3a5ad2eb6f68cec6893e732a648354a46c9b58f53cc6d52474c91ed30463f11aee2e9a3e6399284cee4d8247a765fe60c258ea9bf2ec32b3752ef10966f9377ed2287f59028ff927459b58e16255893d2bc58572effbb4a1c4193759d60c4d52d4cc244ec93de50df929749024c1e7d7ecbf28126cab6fb63651f919125efcb04b52863bd17bc431e5a4cd4c56371a47dca14dd68c2d4f67298de054b367e6a8bb49533d326083116b26bdb0986c2c42cf694d2b6f6efe9d4644d2f81124053614f15d12c5b385e8cf662326b09108ae843949d8bc41449967492a44b8fec687c824e55bca92ae6bb035e0041b8678727e767ee4263e6da3109410a6a1a2c48bbb2c21f49433d9dd4ac8cd19326c0c620dd33995a6d08620ba92f4c9cc7e201693d9ac492eae6d1410e71e9fb012cc3f6471a2c3f32559cf4b16d8f003b6e7264a8d8d7d0567a08218a8c0461f123ef4c526f19ecb5919d8e0c3d21e3cbf6d453f49923d989b97d5c349655e1d2036f4d0257dab50211b794033d6f677a3b5648307b23cd3642bc6a5fd55f0031b7758ee42fa6fae6dd8414d63be212eec99b6a50e5589ffb99fa43a474d0727b453b666f09eb750b131077f63873c4b9a5672921c4c42f4c60c2d6f15bf387c1d4ed8b8794a8ea1c1818e31ae728e11b71767c002e80d36dc60a30d5c122646f3e6b021d9ed45d24c4e986b0d67eeeec890e94fba940d35944cf490e12e5c3491478060230d47669993b59c4ada4643925cb9499aaad3c619b2dd0bb1d5f9fcc46bc48619c8d20dfd17438d7e090ed847ca50ff966c455f7bdac98888480f3690044934202202840cace6f8953ac93d7c70a4878d311c4eceb1f3c466ced41964f0600636c4a075bcd0912a9d31ad2322223db01186248d7aaac9b7a413346c80814d5207ddf51e4d511e11110162e30bd707b1da2a4912cc922322225eb84f784d1542a225a61111912e24c6d5899292a6eb587ed8e0421d3e229f625276ce16caf7ca870d2d7897bcb2de7420592835763eb1d6e536577260030be7fd98ac7246fb14f4326c5cc1eddc9ce9ad3c367d464444ac40d709766d975ee3d955382bff52fce6cb19aa1ad8a00226acaae76aaf1e19a7b087abb9a5fc9ce4b4e3c08614940bff19c777733c310a7994a84ae9c32423c306140c1adc73cfe6496c3ff2843edc9d14bd2bad47d706369cd06dcce5e5eba9c41c036942ff296b7d762ad32440c828c3839031c2831e41dc064c286e2ecf2699a53be1c4c6129a1ed32d29ccf6c99a12dcd0be2979eec94193842cc51c353ddfcb62030989317322b222db38c2bfb184db641d1b46e03a5512234a4ef8b247c828a38ce4cd204301368a70c7f84ee37539c78ebb0d2224573e09bff898d0e0860ca3967b0be5a7fa5af9910b8cf1830132081106561574a292c99df2d9c3db8719272418e57a8a7f861e18e798a41cd54ffe40c82fc81721bd08e185f26ff2a99ce7924493110a8c00493ca081905d5cc28925e5096dd72415a28b04b98b3ab35cb35e2e5a37d7cfd86fc9a4181774169ff4702715fade62eba0f7f526d7d9545b98b1692e874e6932adc5c1432beeacd7b7420b379c695d7a679de5233d7e0439c3c70f13320bb32abbb56aeddc47cda040882c8ae925c5fa13377bb623222269ec06426211028b905784b862435a11c28a0984acc2ee0ab249b0f89f0c5185f14c5c4bfab2dcc13292000a4945082a424e814688295ecd954d10138db7d15228a751734a6d95793f529cc5834bd66dbc7e276414f5a5b01e8d32e9045f14bb585ba84693343f0f452171974a2ef55c5382025171b9cd49d27c267e22afcab424a7784c2dc413e6d0bc1223ad3cdfea44a27a995ef4138b17e644a9f6fe4c0e1d4b737213cd9f60172a5f58b7146922c136dd4c26e9e4e3434c08c984ee56be9fd54bd83862c23a7963767989c1d58284904b789ace53453c689a6589904a109dfa3dcb9c249467005084104a248d99749d3b7dcacc43266196b4761a57cb1022094bd4f8a1736fc9a1f6911e3e82f470108444a2d8b0bc4ff5a36b9721041269bc4d29bfda63087944a1666ee346257cea1f6e86191f70800ac6e881770e7cfce0801f421c4157aa2ba411079796bff7123b9c68064218e19669ccd5b52f2164119a24ee6c0ebe9f6de30eae10a2885776fdbfa4f4cc2a552124118a7d7dacc949db2735c23d4210913c79f7717299f82e1016841ca26ecb2d49d66c374f7520c41049d9ae3eef718f200e64032185e85eaec4caf4022184e0c37f884ae9e69f6c4444444484021f320863b54f73ce37cc07472a102208a3cbfcad5289b173de0c218170329649456d9afb5b0b2180f8f72fc8f59a14b5da1f8e12fe2eb6dd42a6a81f9e8b9aad3e635627e1903e14a531a685ae9d861cc287f3b5e3e6f857624c1db287e37a554c42e798b358881e12db37254146d334e72179e8d393ac5f98a44975081ef8a0a36db3b796ab0ab903eed9db3aa2834cdd217638cdbea264fd42ea90647df617ad332793103af023a6f94dad4e8a61c81ce8f7d02dd29229351a111149a38c32921e40c80891439969794633c571130b89439b1697763e262b407a00494636040ea58f7fd2a61a4744448090518390375c425bb887d733dbb8a1d8b4bda3d5f13cc85e868f1f3dda50c8dd74fe7d7fa903848c1036906e62548e09bf31df0308196b48b078af90ee4dbddb87a86199540bbf25edddbe232222dd49481ad0107286effe44347d39222232460ed8056e76300600c0106286ad63e47fa494a8259721137f47e7c2774a0d3d21840cdb9a984b0aff17e1a990319472f09d8ad58e6f133150619e34f224e1e4670b094352126c636731e14aa3400e3cc8074444289046f2e3c7052e30c6183d063b0bca2823c9410a4444c6e0410818f21aa9fecb8ff52eb220e40b215ee84d3ebdfc960ce942081742b6d081102d942fb5492a7f5132e573c02e9840481612a52f3bea4dbce93c1a675820040b8de6a70f15d3a9b4845cc1109784d0eb8d1742ac60a8fa94d258ba4865ad105205ddc35a54e3433ae44b08a1c2952dac745647c7306720640ac692888cf9da05da0c32382022122285648d0f711fa6902814f79dd35212337841cc2063a487fb800c203e08814272876492d22b7cc7840368843c41f7cb8c3dba9b463641429c4096a471aebd0412d204747a3e8698af0cdd9980d4beba749be0fded12308f7d6238918d29a42d085102f3ed7731e7e53b3133e000178424c18dab7f9f0f7565d24828b4956eb29c34c670861c813e394bd4dd9d98311462844a66b5e2971c327815528433b985e474524b8b0921428d61f0225fc96367c9adbd8630fabd14e2f2332549b082b19fb879538e72b125a74727a10630ba9d0be17f1bb37964f4d81e1410110182010778608c203dd8408d5f3026c45c4e72a8862fb2974ea1f15dda537d468d5e9c3bdd634da6943d2abca8f2676b976f7ec69c5df449f64ed0cc1553ba75712c2d9d3d399b8b3236bea794afc4dc4970e19ce5acb868366626b738f97ab424f161d93a5bac1e4cd294e44f397d925a785671ca520ef71dd3824f297fdae4f7dbb3b32879aeb524768c8a5522224180b80dc868326ac8a29c3a2d8917357694198bc2f9c7531f71040d203dcca8018bdfce4fb82454dce82b0c95842c131719d15c71cce961fe613352d30a2dccc7d206b3ff4bb362170dbf71fd24e79157c18ea5ad2a3b37b15e557492fcb77392bcf2394c85593448caa59a4be64105e76d62a6fcdd299a4b424acd4ed7254906354cf17f8f584a6531f6fca5e03f894977c57facb3a450dfbc930917556c3a2fa8310ad2635cede59a94f8c6d8400d51d4dab999677c1568a046284c490ecfba15f4400d50945abeaa43fc26f1e4d4f8440d4fd4e8440d4e503a9636bd5bec586b6c626b686204353251031329a871891a96a851891a94a831092d444ba6640118a18624f6f4ae26566da64d91a83fc951cd5c531e17755103129c144c37c9f7a3521f06281111111169e2d9a90008a3c623ee0de6194accaeca51106a38224d3989291e4f73b9d688b453ee2ea16255a78a1189c9ab376a6846cb7a11c9df3979acb81a3c4720d450445b5567da131583fb89c87abc5ceaf7d2e7434451e52d658f99aa3c3f849bc32eac5518e44762821a8630346612c574f3e45f28e0831a85687d73de6039864d138d8888384044640c163820050ec841102068dca02fe0ce817644d42084694cec3831f5f6db0791860c3f9724614bba5d1089f717a5f285c5ce3810ecbf5c4e1219df1b06847a593fce43fb07f2dc733a398931733ef183f9e73f675d3b553ae903e6e15d296a273109257c28f77b65ce5eeb6e49f6a079fa18eba71e0c97d3c6964f8b0d691e703be97fb3968bfe89874cb2e8992edd6fbcf10ec95172e2ae8ca787ed700aa3ba31c77392d6abc359ade4f2b687757428b7b52449960b96f23687a36b062dc14c7d4a8e1c281d4d169d6bf3421387672f7cea8ff54e471135e050f4bac5142b2656ccdf409dfe5ef59cd470839a236d354aeab49ea4461b4cf5595ede5683af63d46043521e9150a9acfa8daec1f094e864fd9d573c3524853c978d5927c7aab750230d977e2e4d1706a98106caebe54b4a16262bc91914cb94a379864fcf9a19fccecded6ca1a9e25486af4ece2147dd5c3c4f8634c4e76c7af31832edf49f433a35c4d06494b6bbc78ae57518cae1175ba72e5b8a070c499ee2c6ca1dcf2ae22f9c755d9ea3bddc752f1026a6a4f9a1eb266e1756135df1d0b53279e542d29a4445da735ae8b750466ecab1552d94a04616ced20c7a99fd93540e0b35aea0776ffd8c4911420d2b605aa9bff4a4d09255c13cdd5cf558154502420d2a9439256f73132d7938853f6fec1469c2a546470acdaa87e5eadbf3e0d68842f9a772379e673767a0e0753e9d12243fc8983cc1202e6dd5b3f1d9a1130ada49be14bdc465c526783f2399744f7e5083095bfe6b7e7797eff0975067cea39ab48347754a404a736d4837edb72d099f64be75fde726a1470216d2e4ff937e4e74b3c611ea24974763de566adf08456b798494a0da9a1641cf39dc5cb387cfd4d42082d993f867e6f1b373c34818cd6a2568495d0e09a3afeef2a974d958371889afb261ed5a32b70b8c2b68364b4f51a36f4502017e714cd1ef43b389871b7d516c7bb599cdc70fb9175675c558df60e279f2e2fbb2b6bb789aa9c75d74f95ae51c8d1c7f7847a62bc5c6cf4843056904f1437193c96dc9c1377797a30f7c9c56be7e8f0a39f860b4859e19ab9876da1c7bf83d7f925cd34acbc51c7ad8ea93d86692a8e98236222272460f1f417ef830411a3f72e4c1fc2589dd59a493a5ff100b2a90030fe518735d8e7fe61c678e3b1cf2b397c9e92b8cc7cc48aa90c30e26d93acc78b4ec249639eac05d69cc7d52a7a4961fdac11472d0a1d196eedb78fb54e273b02f7ed7cb4a98f8b70772c881c84e098f69ba973c5d8693c10125e488437b65659e97d3f2db09193f1216a41104004ec8018775cd4f638ce75be97e83495c3d4b927a3d794e0739dc70b8d470f91b1f89418e3618175cfea73bba3e9d830d468bd6edd3299a753ac71a887eb11c3ffcdaa4d4600c655b52a98935ab9221471ada541d3f68673641939820071af64ed9f2cf5476db739ca1d4246566cf7eb3cf7398a150e2e67e665a0636c53cd5fd52410e326421773733bd9a145e8e31f8d953a62bf9a4cb9ee7104362aca0e331da74f270214718caa3f3275766127e2b58c80106638808bbf7a4296cfa0bc9a9a4a757f1b024e885dc5376c459122c74b80b073f4f726bbd5c304dcc8e25dbb485eda2d47f6b460babe87a5eca1aa7269385aba412f37cfb58d0a72fe564598cefe71572dfd8565552e7ec94127258c1cc49a622f38c428e2abc25a51376f523324950c84185a7a44de9d672eee4981c53a83b8913e1c1aa3bf423e490829dae6bc28a1a85c7d324db7299030a467d84c49998f75fccf184e3c6b7e5d8b9db258605399c60fc6871c3757a23f626147f59fedc42b78fcb04f4e244f7d51b49cd12e8b0254efb4709870d1eed7b3e772a4b427e2362b27b7220e192d0b6cc9aae536d24c871842b4cc60f390da9241b81d616ad4d621bff9a1c45484a4153446b98f34e92830885878bc12f598671b4cdf321d91d6f34611c2a2a3387a54f92e10886337d2f0e60e0c93b4d8d8f6892022bc0f18b34c599e5b64c3a1ac7e10bbc354bacbdae38276f70f4e2f4a956ef20d57125bc28d8546d7cca76a18b5c58d9152b72bdc72a830317b5e999b89b7370dc22d93dca788e3fbf9b9b000e5b2c1ef65bad5dcd4d08472db6932eef475687b611072df0d09ea34952ef963642c0310b3b7389b9566a34991dc0218b47acb2db7a16ed13138b3eaba7d4b93c94ab05072c3431f9337cc6385e710e25aa7bbf8ec315e7f9cdfd27599279c3d18ac535648e27a6a0177370b0823e9988cf796bf53c3856d16cecfed418aca7c48c6800872adad87fb71aa7474d3e15c5a451a3d52d6a668f0a435b434d93a7e0193fc59617433a33835ad9a638f3c94675e6122aa64b517d8eaba74fa1bd6252f82997873e39c5e0d78e82d58e21729d4c12cd44145645fb88096928ba7839cf5286cecaa03074e56d30f5f268e627923a4acda7f31ccff744e1bbfaba52ed44ec446927ae227d3b6b0a39918b96c7768ef2dad626369796f3dead93324613aecc5b4c92878f3766c25072e5af31ed5462840942e5e4d0bb6b9a3e9748f2cd8d7a62b650a9e0b0847ef627c7f7084d15bd018e4ab0e9b97f629079cff944e0a0845d413bbab24e7c24e9e1c3063d80806312491e6d2d4bc5ec26562322223d1222e090c451eb6d7ff25373ec8c888804014724cace41d39af4320e489c2e7ea6beac1f816da8bf8bfeaaa5f650010e471cf216e7e67b29646e2401381a41e660bee2597e5f3d8c384ce8978eef9b9e7811be5b6ee40991f69ea308f2d7735e13e924f9611c89a04b8c1bb5935827443810e1874eb914e5b26a26711c82ceefef5c29da48a7380c917431e55a594ba7cce028447135524ee2db63ff3808b1866ad83239bd76a7471c00081c83484a57961d3fe11084d966ee841283ad25393802d14e5abaf83d169d96077000e22fdd64ab17c2f187b36398cf992b9f2425191111e9212222820b60a00422e8000a70f8a198138fdd2598e059c3d1872b5734263964a9a59c0f898916ab744f2ae9a4e0d843a12ca7bcde1a3de43f6d31f7d46ef4110738f2d066f9d6c8afb8f5141ee0c04329fa7fce991c2adc7b872b4df766624b0c1db4831dc42f8a8672cdfba9c32966be4c79f33d96659081831fe0a083b1d337a7d706c13187b3f689277a5481c8e19839899c78551cce372ee96ede36610207bd35697f4a162038dee0a55ff10a11df70133470b8e1a43a6d96d7e4afcb7fe068c37267dbd1bc43060e369453cdd6ecdf6b284ac9c65cce9eb99b031c6a783ed33b6359dbdb9986e773f7a675fc7cf2674444e471a0410b15d359ffb464fa6c80e30cc9f93b8cae6a5a4a9f0dcc505b7774dc283943a78c348e326ca13289a9c2e8a5c546444480f818711c64308a9675c6dce118035349b29b170f87184e5373b2dd95901a33053c00003de008c31b2f47554c25edf63138c070b44af99d49f6c990491c5fa063f273efeae0f002f62166eafedb3e8aa30bf77c56faf052ae591c5cb832677a59ee3f3b7f0b6f6fe9690c570b6488cd6da7104716ea8ecf9ff973ada5c281854258989e9ed1ec1f8e2ba02af1ae73b17a43c76105c64fcfb29c45255909e0a8c29ac757c3ba26cf09a9d0f69cd0bd11ff572e8e2970aa953a45d5ffb89e21e09082b65ab26d118e2898ea511e3be6bf4c0a0e2858b379f753e6bd7be7094c9da75ae6121c4e386bfecc61b358bcba58004713d0607fd2559a92b25c389870a985ccb1e5e358026f1be3c768d5d86f7d0087128ce87b8d127912eeb8122c53c481044adea9edbfacbb6442011c47a02b85b0babcae1e5c12e030c21a5334754b0f13971c018e22a89a32858ba99e72da8c88889c8b000e22dcdf293a49f2592a95ac4044c4c70ff781193ecc20c18d61e021dbcccc3ff355f087a7e0479014888898718630d6d4a8a466f223222240c8c8410f33bc8c337c7030bca94e727d7ef408188826417253b67db0724444a402377ea16ff46c9bcbbcab9b6484c730377c617bafaa56a5201dc32040c6a01bbd40b4ce773f07dce08599664dd812db7d539a811bbba8e3caaaf38ea78cd60d5d186b293d25ad73711ccb917bbf8df5f2062edc363d13ecfa6398f3c62d4a132e65373b19b1051b3a967fca96cebd47e0462df4ceb1c755a79294ef1f36f0e48c20490e7ef8e080dda045ed5ac172d608bb943322229286d0e8112407df801bb3a8b3491f6a4cbaba74cfa1d1c381fc48ce9045c952899f323e496d4e2c4c16d95d662d2c1add90a788480a446ebce2dc9aac69df9cac6a4444c415ce499576aae7afb9c08d56309f9dd3ee7db678ba1313888800f9e129b8c18af38dc9397b9fb627fdc72a98943fa93446549779813134704315775a4d4d92955871bb54b0b17e5377d2d7c87e046fa0a2f4354bb75a3f39993d809c22d1a283d4acc9259a670a3b263a95c6d768934ab1f9fe44798e592c0cb8410ab4a3d4e9ab360aadc59220d96be2b896033244447280861924b8218aa43e5fadfd122faca168df3a7eeeb6427f0e8a2ec646e7af389bd46232cc484c30060a6e7c82faacd935f51ae9f1801b9e385acb7555082170a3135db6bc6de95df3f8991b9c687d2cd4c90f1bf4d8c4352e3e3efa9319dd480f1ba0b1de3dfc8c8481b88808057e2423dc3e4682780e44447e24237c431387a6abe76728d9e7f6c08d4c189f362b225e4d9ce806260ef6b71afda2e57d342222d269987101119134cc48e8c625cefeb768e9e92e21e086256e5402336dcd193eab2ae41ef4074444c600c10d4ae4155e2ed555489cfc24961bf5a8d614c2bd95046a172515eeb9965a24ee709d41e43e3720d186126fb3a27af6cf474444c6c88088483b1967f8e004f8b8f188630a8b3aff18644c331c03371c818d470b6f4f722c971b815f7994caf33de9638ce8dea42ff32a7f04a11b8b286795d6fd8b4c25c728825ff1f97fb31c2ba43fbc7ff8b0c08d44244972af4f59f28a332142f78bec8ffddfdb7ff430c3cbe8a1811b876063995fb987fc88cb888888218e1ffb46212eb92fb4a39d1c3509bbe00621740b7ba23925837873dc8b26e7f9687249c10d412c97eee55f6236f94c20ec907937348e5d8f090a6e00c29f2f2949e55e103446f087d44c14f90ab657158d8888a8e0861f1ccb1a37952407031a1803031a68e7e48c14a4e12128c18d3ed0ae2e799e53924d1d72c10d3e7c75b939c36e492e5e066eec61dbb312dd7f335db52322223c70336ee8c19cee2db7cee7461e4c13d6317b727633ef811b786864dfb5e27c0aafd911119105dcb8c3396c0cefa61e3327d934829c9103b74353721d63349ff3bdeb40577e56ae7cd241ab1caa4c8acd41dd4ea79926ecdf69e8861c722bb9f1de2c72e98b4325a6860d7926ccb9950429c3bb0137e070e30da564e749abf10d377c52d2eeeabcf95f62d0d0816b600337dae0776987ece828d96783daa1d22235e6c61a4eb9b2bb9a50dd50c38d344ce0061a6e9c6193e7d644cb29dbf7bf61062b499efc2b1f9541dbca6af184a8fa3811c20d32dc18c3b9fb4dda37b92dc9470cca9b9c73c44647fa0324b81186caa662092b13972d9be1e30637c070ec8d8f3b26674885cc8d2f1451f6ff9943bfc7df0b4fb5a711ddbad44ab9d105f272ecf5b7cf05eea42ceebd4929bb06c28d2da03b3da13b92b1bbd4029ac4848eaef39db7a471230b495317a32feeb22c8f05d5c4d7943db4956dee0a64d26072fab415ee4a2579a26c974945c68d2a2827c9c9d3e79cde3a4a854327d3a5cb583d710a8ec9da593fa53559298514dc8882313753dee6f3dbebfe06149cd6ef35314fbf49f92778a2cd6613a4b5e5351bdc70421bbe2d5c93e6dee534a1923afce4f8ece7280a3798e0654cbce5c877557f099406ff31f9183b7a2b3794704a3595c3c74e57a2e2841b496037c71ee99833ef9c48f04efd52ccb91b47b8373e4379c865704d176e18a17c2d958996db386f14a1dbfc124e4e69d9ac45e10611f8fca61bf382d4758c8d611463e36ff8c68926e64b604318b698b0c1f2c9631eb30bb0118c4cf44da2a7c4e6fbef061bc03047d728b117e6669367b0f10b254aed848bcf0c367cb1947d96a0e341fb62bd3098fc896dbfd9939c106cf0c2c62ebacc16c74e568b6a1aed030369b40f0c7c09d20842c60f1f37484600e4035fb0a18bc4a4986e1e55af76511bb928091e63b2f74646066ce0a2e4399cdb5594927eb2710bb425eaf472a6d795b630687e12a6ac4247ac5a2445d5379b9f12d70c1a67d0c24cd2b47f9e9db8e3cfe2123d4d983ed59c722f8b3da5b7d54cf499d36351bc2c6a9f938592731c1689264a6d45fd15a5ff080fb617615157601d6156c29fe798ba159a3457da93ad517956283a3d9226f468b8ab3885ffc669c5e89bc3aae83ee9a73d53b1540ae7d2d6a282527bb76806c9e6d39b400c2a988268cadf4d7258f2814c4193342731a7735238eaeeac56a85220461452936a2f06ab984b6606c480022126640917dede997a823b55a24b06dfdd11c57082727963963c254d3879e82467ae9c436f2e0613eedc1aef2eae8f592704622cc198f1977365992f4948036228a1b95c9264b82b3155b8013192b069e9a7b2eb943f392006121e3951db132d42ee801847e8241f932c2b7fd6d2474444ce8c11fe4b29dd83234092910f885104c2e414b3358979da1e3188507f68b6ec713da6941bec18069ec2bfe9954617bb760863d5f48e413f3f460c76042339d2846d998a59f2c00e6024d5a6a67aff707d5911111f64fc62954da13a35469ff97c41a69093c352896ba301e9c59b42744cf4a25e89f2420b92529ea2df85f9c49fcc51297f49c22bd8a10bd5be52dfacbb06b972518c1f43e79bce3377a560072e4ae2e7764f31a7fe2f5fb0e316b5c9591f22230a76d8a20ad14e62945cf761ac45425748c9e9774edc043b6851684bb158d65a9659f0e927c9e6fb9c4b7a9060872c8893b3c6b497e2d7a223222235d8118b04a98bc1ffc711119113ec8085bedd939f43752a497a4444a4870876bc82dbe8947b7b5f324e3b5cb156a5358beaec68052747ffbeaa32614a9a15bc274d692b136149cc2adc143ce7a48990f2fa023b54b19418c5eae75374149841da8e54ac6a397eb92a6dc20415f9479fb4b14f769ca2d8579aa2597efafc233b4c91c9276fbc0e36268ac7cff0c14030b0a31445f52593bdab2c1ff4c18216ec2085b5ee6963a3edc939368a76ee3dc6cf753c5a51a4d939db57baae2e83831da1386eb45bd44f69ed2f65ec00c515fd042929da66ecf884531eae5d3bc91b5bf384b92bc5faedea44e1dad5517beca7264eb8276da96a98cbdfd226ced9263f54cc5b59464d28e9d942b9949948b45cb17d82c5676730518aa11b276a697e7f893cc68d4887966edb96c8a7b62cc78b924f629530672c299524c5fdd0d70e4a309e71163f6c1262ea1d9328f58a9f667dc7f8c90448b3df608724ee4c62a936af417c9491821cec88045be9e1fa2df85709422239fd8995e35faad1ea116efa57f8609289976e479cc44dd95d3732891636c29cf94ab629d94c73ca08358ba5e69a0a9f6e2da294a3c465ebe31d8ad86476c66267546e34115a86aacfa4911ff34484fe9ff251bfa4ebe41ec2b4b1aff6d162564d3184de976309262741d35f85e82ec604ed6413a20da71317173753390832675ee7a32aef5304d159a79f9cf953c73809c49d5a3e5ee5ce6459020873ead7790cfe81abd41b2d4e97e417f3c321531c93cb739db104801176f4a1cedfe79de353f0243c2222b203325a0321d8c187e23a347994f8c5380b61c71eb8dc6d7337a3f9bdeed043d96a5e5bab2978bce48193a4ecb29304ed9b320320d881876f43e34b43848729f0811d77b073f5bc7b9ca8d9230810347ef400428688089032c8088246eeb083575749721313b3a30e599ed0a92eb3fac23be890fc2549b1257bfa1cdd1caa289725bce4a6f34a1a415060811d72304c7928094dd36a7d471cfac8983b7c9c5360831d70a8c44d733125b1fac3fbae013f230d15243bde909b7aee0a99ea5ebb1bae53e9f4f9c1edcbb3a30d9c4b75ace01fca2c638231829051c61929a0c10e36987f3774ff0793ea6e0dcb493a65326fb1f36584033bd490b8dfda7d096bb9ef1d697866f32c78417a9046d2021f3c50810476a001134da235ed9ea124e7d63be14cb69eca0e33944bb69370a26ebc4f193bcab0cf9f70f163395c98c990943e9a82c6a8bb4ad9310693a6ce147e532ecb80058821b92bbd24c9e58c69c3a069b69d4c093b1a27306c57b95a99a4cee48fa92f982b5612436f2c417edde1053d6783c5fe7e9a3449c18e2e94d17e42bc9bac69cf327cf8d815ece042dbd3b9e9f1a949aeb670a8e4f1637ca473857668c1941a2c58b69c6b5edd91852429fec44af7ce86754444a487193e7a04711bfcf0f122222fd88185d76635254a70c715aad3b98b724952596b87154ce28484ce88f49c35821d552023e5754a3629e76431c37360031f630715b04b8289276a9f58139b1d53b0d5c28479d17ef8e84101158cf1c333b0430a76b2def124f92341121388888c0449ce10114923c88e286826a74d51a2bd67d43d82fc20e347901f417640e14b67f2d459563bb17f0236b6b9bc72a86a779d60ca8ea7280b7de76a134c6269d2a7de4813333b9860d4ce398bc79790b9099a523831f52fdfa1844bd6fbd974525ab9b823096ece326a6a61a2fcdf8104b35334bb5ce9239416eee2c5ac3b8c704927d2d93e3db3293b8ae0c9aa58bbe7e99c991d44e0d3df65f4d87d1d2f3a8661a53799198f55d5be30d679edff97cfa4a709465ec2887b32314dc2a70318a7dec7244489c9793fbf58a3e6eb94a7a13d73be384b344c6dc6f4c2b8be3bb3f73d5162bc28ad7430d7cc39475776f1fe6fa67fde3d6ca043172639e5c5b4186e628af7c03df0c379e04304a523170957a29ba96c8a593f2eba984ede2dd9a38a949020881964f830c10b74dc22b768b136560e95abd1610b74c6364c4a928e5a24eaa7d16467426fedb4305f38d1aa68ce22d9c5d2e2671232643c093a64d15b4b4989be39c91da3041db1f8734e2bbe17ff4349ea80c52587cea1f63a62c2d8021dafd893d4d9e5dd84053a5c61598a4e7889584e738c76337c9491011191d6818e5664e7ee614dee74b0822faf1867ac5b0517edd69d664f10ab55e1ccbd8c7e4c97dc642a38b3b4dfd984fe2c295478c2a68e5315ab4ed3294e297b123654980a1337c5f9aaa5a33aee3a594a8106bf28d5f2e82045d7d1156e345a8e68758c823651e53fcb736ed245614af6a6a4dfafaf6528bc1c16c37375ca12962fe80045752544068930c1f6b3828e4fe8d57652bd0996fee7078ea0c313edb8ab6659b1093a3a71e8306fcdb1a7ca541d9c28d37f382bb19a0f3751479f8ba72b9bc79268c237213ecb7d9889c25da3a768cca4291d9838a2d2c68bb28cfad925f00ff64912f3abc3126c86dbfacbcf76925702d3cd2144ff3aeea39450b4427a524ff7dcce24daf3bba0db1f163949a22c265db9bc2a93f047c2368d96d1ad2f2ac6464444120d15e880c471e9355fcc8c92df3fe264177276498ef9d47684553a9deb4f8a043a1a8105bd60b94c8a283933810e4678b6b72925fd4d696d1d8b60935872e5c98707597528a2fc49db52ca1546fd2411e55776d6784ef1b9bb810e44e8aab6f5d1395ee936d2a3471034ce30e3033f7c00f9814606807890343000041d876035bad4ee49619f53f7011940d0f8800e439445e236ee422f874e54884a2c0b6352d684f0d36f4cd00ff14b2beb18c45a312726fb389e2e17046ad179a29ffaa7e804a2b0f13cac233f2a3a80d884e9682949795913fdc1b1101395c37a820e3f50139e3506cb4d9a1a1d7d7883bf86e53c81a0830f7f5ccfd456ff2eb5ebd8c3626539c9a9eec434d38321b764d14a7eb731a4230f9698a162495b999227c18391d39d476fc6f37750f7cdb269882701a4c30ea47c860af1de1bb175d4a1cf2bafdc8cc9df8d0f1d74c03409fe6e3926ef9cd331074cb3586e4979b30c02c4832422d02187c2ef04b77c313ae250b654d163653c4fe1d60187dcd34b0531fb0dc98974e4dfafc30d546e7e4b3dd136944b74d1f7ecf46c396c7835ee7aa5d4d7b057f470129b4fa898a9c1ab365fcf9a4c2eee693086c547cd98dc1a4b6ea0030df49f986ecdae34a5fc1912cb674bd5dbfb2e378319d2fcd7372a8339e547ef4a4f6fdf92c18d1735dc77f55878633886cfcffde311c31e3c46ff46eaefa784c1d9bd0c9ead3567d7c05094764dbfac693fc45f503556a95e0e7961731fd9cd77ed9bcc2e70628917b25e672a2f174e51355416d5fa924cb690ac57dda7e8b4f054cc262f13ff1db42c1865a97da6abd4333ab0a0e798b2ee437b73c53bd07185b28a9cac494a269b9d5670a3735af5c77454813a299a7472ec091b722a1c2cbb47d405fb6e7f0a7cb88fd7ef8ecd572285744ac8cddb4c92073d0aeb66a5d9937d12e88042394f9e379b8bb22beb7802e5fd751b7312b35cd4e1842c76b4bfee7b2ce96fc297f2c994fc25ece8a8830979942df92fcfa03ddd40c712c8f1244b74e7752861d7d7b0304bd1aa4e7424413529e1729e930f9b1d820e247c16ee6249f34a6b8e8e23a039e57c4c330f298d0e2350d1c49336ee454711dceca1e56e96e43b131d44306c5efbaf96c5df358ca22e4aae0d353b8b0b038df9b7a4d82f912ac9418e60fca395162ff3c0d8c2a7cbeec77ed12529e755f0cd17650b16a36bae62de7b91b86faf66d3a4397b7841fe9414a34d70a4c7193d7a3020c72ed0f8a8a16312f1b09932fe72e8a23b4b492b06cf33591b393972d1586e1354fe63650f4744446ce043040700921c2073e082de4f5249d5741bd8c08708cef0410211111bf8284302396ee1e776984b1dcbd24573d882f29c6d75edacad5120396a81550aafe1db3d62de1cb4c0463ce566c7149390e5608ccd318b3f655916c6c8d03d6262b148d4e4bae7b9d5f3c9c9018b4d922db69a58399724af38e693e24c37f304b5b8824dbd3661b3c9c39eb48250fd18ab1262c5f796cac3587efe93ed418e555c59f3335af4c9d1d3c8a18ae32b7cf6e3829f89e64805e3b9baa33295f67415e4400519362649a2a4b8d9570f729ce25c9d6e6b533822228201535829946c314b5aa5284c878ac7b0964f280024072992247d75fffcc4b31b8527de6ef93d5fb25ba2f0fdd2a3753299185d288c5223995b2d57a70814cfc6e8191f4e6c3fa14f1c1dfc3ddbc560f1724f9862887dd92739fa4f9d602cc95a576a0e4e7819ad84cda9dc52d71c9b48f0bb8b96951ef4a4736822e9c684ee36933e939709538c716d23ccee5208136e922429a1c265bbd4e5b8849d37a6e76a7da57a23222219c86109357649628d86f020191772542231aa53ee128ffdd721420e4aa49faa6b7669ebde24083926614e269f681dfaaec30824292303392461d20b7eb949aa50aa03492331418e4818a531d3fa3266caa91c9050e4845ded486790e311c9e935eb976b5c474768242087233c7945e3c46062703d0a391ae14d49e273b27c962c23de984bbc8b551a4ae54598f249954a2e8dcd495184257476d46f0c0df32622d16ece9327c9d01444046751bda17e94408e4378577662509bf29bd110578e3d93a3618e42f0167e5359fb84f8af4fb3ab6bcaee7910e5143266c959c5f27604816dea4cf23d26e58fc911883b8949b25d4d27db09fb1866e400049b367fe57c6594918cf1c3004948ce67629e2499b82f1e128c172e2a85b48c84057530c011ac746d3691e9fcc28911124deea63374bca7b508e598a149efd55e4dce0044b0e494b34982cca94589c7300c6e7d5752b6a6931e1428050f6158ddebbe71a354873e18b5c9e6f961ce1fce031f65f81969a8c00a3c80d10965c2fc7a8a9dcffd42b5132c4b7c5aa2c417f89944a75abca063f5e24e15c3a69b31bfa0e1c18b4c0ae9a541db63f2985db496c33e9ce749db0e70c0071eba40bc2bbe89279a0b3e3479b4f11739d9010e7a7ce265f4a0000558100237f0c0c51e5bf9f2b57e63bfb760aa2ec5ac4ca5296e83f6e6618bc23c9c14c6c39a5ce95adcfb316dcc9f112ed28888488f1af0a085791bbe9652acb7f6b3f8ec92744c668e8888c480872c2c297864ed89b12809953c7cda764c65241e04880dcc2003063c6061da05cde37bbfa2d0e17259ce2b155676c52a121df16bd28a572ca4d27c7bd2342b8e177d92d03e7ab25a3c5661d558af77accd5a29aa28ca82492789e6c13b4ac18f2040121ea9305bd2fa94a316ea5378a082cc2785889929b724798a742e83e895679362e7043c4cd1f99f14d7744e92c49412f028c5c13b87bc546b0a7890c2b09c5c4b925ceb67192ce0318a74d6efc48b16e463c54314e8c6b8d1dc4fde107e284a29e9b7af696aca37280c6e65728e316adcea7ca2f91825d77f33a85c3c3c71f449aa7f873c3ae1b5f84eb895eecb56041e9c68bbe64b8a9591a0a1032f234143071bc0018f4ddc953cba790ce21a0f4d6cb697d9534a77fbf68888080acae09109c3d87ec7545c860ef6e081092f4ff3ef7e8ea5bb59018f4be049ce2ed9b721621191e4c7064444921f8e3c2c618a48cfb1f3b77ee9088f4a9c52f2fd9996b3d9661e94784bfe8edb966f3ec6e7318937f3523ef788fbb61de02109f3aad42a3e2ce6d79491e080472454fd547234314d6b89360f481c2a661ebe922421b50d783ce2e4bd494d7fdaf7f32309303c1c614656dc901293feeb22221ae0d10872fd6eabd7deb26c466452f29cc9fe93c58b1671cede70ba6e9e53a5085d3f45973c9fe2560a8f44ace1b76d3ea34949d68c50e0fd876bc043c003119694b26fb3436a1cf3108cda788aea3c0f435c9e755fbbd7fdbdf12844ff490e91edccb0241202bf247b39e7247f09161e83a8dd4acc79622ff4f43c04f16670d168521acbea7804e2fe9610f70b2556ecdc0c3236073e584484072074d5a041ca3e4687cac81fb89462c5ce704f61353cfc704c32d2d773d61f551e7d386a53563473d74f2f0f3e1cec83e668bf9bc71e0e7149455cff6292e4f5a0448e985c92f4b9269e07afca4ef8d49d3f7742021e782849a2749f749736647d8753ca4e2f699ad33bda81f4b4f694e1c2a30ee78e95fd7c729e685278d081b7fbf46bf5caab180478cc41577f8d79b525efcba10e67b2b9751cfcd0b313d22439ae091cb029c9c3447d4d55df9054d94bca54dd607cf16cbaa627a5b6c1d0d997254afde2c986d2e5c9a5b9ccc1b53564996afe5316d5f2a8818f9262d0a824da6ed2b05ddeea58f2b5be060d649b701f3ea7249d9c014dd24b9b341b3b496f862da4442f3a5c4ea12fc3971a9de6c49001cb74223195f9c71e439edba492832d06faa4bf15f3e849c3906435975ad55ae382c1e05d929463af98e07ee136e1c3f49e78819293f3af4e0cd5245da8adfc4349a25c602f4df95aa9664fb76065df94a1452dd815b38d59f4cffab2d05ed818dabb93760e0be62b9363c89c5f614d8bcbaf5421bdb9154c318728f1afccae79150c9725d6c9c4509939155ad3ace9a88f3e954fc1ece4314e27974277bff66a278cf5517034465cc7f2bdbda150dc94502577d1357d42257c7b9a984453ef84773b2e7bcae136be26e4a9c2a2b38afbc530e1dc714343a96d892fe110f17d1a53c241b5e593863a0966ceaa26af3412eec93131d453defc1f41df1e0d2a5e266f845f63f4a6db7914e17ced9bf5a6d5e2e641845bb3c74cf1ee4eae876132cdefd8679772164665d1297abe2c266583a107c912e42401c6d253b133a7c9e9fa0b634b8c75ee1de3555f90a31627f5f3fa077b71c99e1dee355ed4513585cf10311ddb0527556dccf36fc93eba404ed0ca984bde1c4f2e36f10f2755258929830b3e75852679e25bac1f397d524c985fd816b665779cfb88320bd7c26b69352997450ba43b9f099ec349a6cf2249f7d89c2257f496c51ed3668a65ca3ee958944b9a79ff1a169a5758bdb994f5db576c5d826812db4336ea0a77ad3b9c099ee2275bc109369d84cf3e7382acb83d65a83e49b8f66f15a7dcf1b2ea946ce5a8e2cce3aff1747ee3a9e8b3b2797a8e37372accd615fc63730a3f097dff1b53fc96ad95b1346ac894c2935e4f4e5249cc9d14c7a5cc6cf796a96414644e9bb4dedf1c912896b034ea256543c1b9540ee182c22a0fef9997a4b0fe13961021259b30efb1f64497c49eb314dc737c3bb17d25b1a24a38818999c4f25c37c14d6870d998ee3daa092a53f87c5666c213ee52478d63ab494c50f115cd37599e944c2e81995ad8d82cb713134b5c1a53e70953492c4c2a816fa6a8923a7fa52da184d17aae3d3cc924acf866c2e7c6d968259248b828a7bd1dbc629544a214c5b4356f98852881c4e9b3c3d6f343e32579c479ad43760e558249491c714992c8ec6876664ad288feab4c537891dc9f11c5dd7d5459592ef945b82ef9c1a39820db2bc2e9b0599df5c2e47c22b23cffcf318f082eaa93e5d12477d00f910693d64ef4114b6143f45d95f37c2f4f302944a9844eb9bd2666af84d8375a32e9533ab9741064d068db252b51828228eea6eb92f1fb140c44995f92e42702a28c7d526eeba656ef0fc7d58d3639e927c9a37e3086e6944e4ab48b39da8752c8145af163a129e5831fce375b2add43d1ae715275bc4549f550f0d4896e4b5dfae7218dc88b131e65dde3a16abb5fafca517abfc3e92a5253743b64f919b3c22495933a30321e1bf33c9ec4743865bff98dc7dc53cea1ccfa0d4bea52ad1c8c29ae899d581cf2b89649f02ce14057ba13bb6ec5ef936f48d2cdb9169d74839a73b1e2d59caf26dbd05e66f6932b9de529d9806a051337c65d8bf935606fdaf1e29d901557439b7df66e3f2cd54e439227fb77c74fa6180d49e9b35c48545e74cf605c0e65bbef51c935c39aea92ac9a512d4aca90d89f4dcaea7176563270f2d58b56fb5a9b632827df3f31c978124a316042ae499bc478756218e8b5fcb37a8260286627d1fb84bff31cfc82993cc9619b553c58d00b7b4a29ef27f92eb8b21f374d997c1de78227e47b7e5e0c7bf12dbce6d983c9e95e096be1338ba9e07116ccf338f9a931f99260e170797165df83977a854ede5bd792c4c84bada04b6aba5adead18ad02726fb2e5db14fd2515ee7acb65625bbcf2a6406aced5a999140ef73497648fb9b8a250d8a731ddda24a5eaa0f04875104dbd69b3b92798f42fe59274d173e69c60b23f5bfde89a80a70bb2da6f41f5724c70f7b563ab7c72b3dc12e83bc132c7e83af62b2151353e2dc5e46d3f09867af95c7298389723a15815de363f82c133272977ac19d1087e45d5467ebda67011123627d3af9c3dc40520422edd31f9591b466995275f2d877cd68491e49673ca923eada8168cac3f362f7e88aece8091a51426a5e4999ec4ec17c52ce127e3ed6bcccc1747a7bb4fcf7a51f0963e170f1a4e0e2f7e493bd1dbbf525ab60bbafda362c911e619d3c591d9b2c2d88a5ac672518e51375d5b52521f175cf64af2e632b3a0dfc24c3153865f8fbbb52da864a2d5ab5d850cd782d050e298afee569816c6a0ea9e2932ccb2b3383bcd45b6e25497c8a24d616376990b25afb1385690f832fd0eb5c222e9fd779592d4f77c0575629597c7c5acd315a757c54ea12f9a5cb602cf4d214faa7c493f563cf6fb96af9d5594f5f156bd957b324715969860a772f56797930a4fb8b859d3725051b67cf18a29795dca3945736e173e9a8931e4a648f079ff68dd936d97224d3d3e9642a39b2c29d4d01323a2427d4f46c1469974264645415a387965baa7a2190a73f0ef3cff28a62528923cf24db4f38937a5dbf0bbcead95270c935da6a6f324a93a91e07b69d57739bc8613fdba7f74926a137a6be53eb9fb3ba794269293ece1f3fb99b8644bccd4f13f1913d8e4e68e758973bde524e6ff984c5b2259338485f954023b39b7b8b1987ba68441fde6d2633389844e49decffe245fd64842935f4a0ca196a49cc44482fb2417264a875b8981c4aba9dc73a7645b92e61175640cf19d6282891947a826a57c1f45ca3c338d68cf2ee550c9ae2b6618b126693cc87dcc228c490a255ffa2b9bcb2882cafb17aa59b3f2c624820a6ad597a454f13c22ae93cbc28c09e6a93f442b955d2f34f64636c439db9669f2ca3172218c529aefb62f782c2184521fed34c93f26940cc2cb5b226a42ab9a2a08672f63cae431d2c540d86f9a84125c635e1110858e1bd314d5b73b7f48c8d47c9a2a3fb469fd4e73ba856dfa704a72a5d2d928f788f870e757d77429ad2ea23d247e5cab545c0fc55ea6d8a99097fd3cb8991d76a28f87a478b131f97f52fa3b9c314f8b77c94ce47638e6f7c855374d61ae43219e2646534ae1b374387de6c6acab59373b87e28b65097afbb52772787e35dac6e370b8bafc999c9b32091c3ec125aba26db25cdf9028a15e7d49923e9a6e58835898c9b8283db6e19452d6ab1c73d42a366899227f728ee953660d4fe7fc9375f52f4e450c351ccade73ca39bed9a58891062c3f6a2ec1c3bd253968a03a8c6712b39c01b1f3dc147eb2538f6298e19c26899a92bf568c9b11111131ca9067c99673c57fb1b0c9a077bfd5aa948c21073e7c0c400c31b41964f0c00c346c88118643c6ca4ba12c4d3b2ba30c3242700331c060a8310b16ebee9953231110e30b6278014f0d1d4d88c8ed9bbb70bedc2f612bc74e192ee38c1c7c200d0c0001929840052222692c10c4e00261c1b635bc05a24f52ab4a92f1cf820f708003cec9f3400c2d7c56d933d56d23222239c8021f2265a2cd57979efc0f1f41122cd89bb15212770ba2962bd47772fc93db6ccefc206858215963fa9dc538b1a902de1d0d8dc3a894cee2a1c1a1482c1007c481300014b23c2b004313082040541e0c0623b168246aeb1e140000562c1c463e202024181220121009c3c16020100c85016130181408878381e06a9e86b1a0f321382943932685b316d3b89deeea1e35b62da4872d44e9014be98d0520430115105ce06db4bed536c8ef4910ab4e10f1e807afad1fc2607b13e892d5f4104481b8cc3551e1241a12bda36798d7fd1fc98b9f0f2a575d9ddbaa20c420554b99f463949f5792a651368dbc69eabbe8b8c571dfb1c096859c1aec77036ee11c2ec459637e885c46309546ccd52ce75b2cde47d7d988b93bb1b0a224b305ecc8b1faa84cd0e98b79e108d649bec69b7a51dd360b737bcc66811ae0f7786bc828c1d6b20f56f290018c23b58b71976022a6f09155d347e34c17ceec6bb04da2986986cd07e154aa9b6491bca55797a74f50560c8e1f4777f7d617b082f92d223b3a86ce6793c9959516497acc9a095c481e9d8e6351b6ea75bf0bbdf4c511a70900e9b93fe82a165726269eb3dd43ad46ff6cae6913edc19d5598b95b83c68725e6d2264181cb78d2e57af7f017e37297be88babd721615899b3ce61881211bd13f7df66d7f9b7243d59b296174d39fd26509917f1501ae8c1b4039179cd18194a05bda0084a0e023954fb6601b16c0fdb905ba617ec722307d9d2f13d253501de36613da5a05e5af05579f1b2f49ff96f0ab46c3e9edda2b381b7a79f265248fb807dff8148db979409dc2a20538c69534978162f027a60c3d6d472c4352925ec47e576b94ac36bce049efcb0a16346bf070738a71d0ab9a87671a571550b3b4a7fd675a687c71855258513a29030cd57604df50085341e823d93d5d34bf06b8543ab6cccca759dd3ae0b78885a22c6bf25efaf0a9e49ca416f2dc6a9773d9b03396714495d0f46d8991a6fc99be59db4afa23e290d272a56571bc146da35eca8b612fcb2e24cebb009b95355bbb8a96adb2791e881150586f0da9c94e4b4c85dc4bc7adb08d114cc5f58f82eb33f413d6cb32daba5fca832f220df42037a56c182ef4abeae3b846ca920aa909c014b78aabb2dbc61c9688696c40c8e523f9d3a85ea0bfe8f4b9cefda2843fb27efaee86f98bc6a3eaba266256ad582716d8f7bfdf9c5ea8a94f51f1d690de0d68f14d8c4948ed510a15859d2d01a75fc559e1460d9cd135ad882b3c765159cca94096101fcd90a732e90b81bd119750fa50cedaccd46252e2b808e5ce76a65fdf3fb2573da98fd03bcec835eacffdaa68ef40a1b325c3b42e6f369830fc39b98d61438f4b627db962ace7d92086f46bc1797b03aae835cea9ba583294c643d7a22613fe32e9f2bc76e1872534c4aafe6178b11a20b680c6b5b3f2762cceaca53745b53368b9a35ac0ce7661cd31bed32c0146d924f897e26ab3ec257d4ea3364ecf05b2dbf4cd99d54473eb772d7df3ee3eddf46fa7651afc05b3cace17d57da7abafcb5e22ce588800d47941fa79ac12b13918179d040685ea45b224e4601846591a6c17dbbd0ad001b481cd857aef365641847a5df5321dcf2a8f722a36031fb8af63fd7e68dfa77edd587d3ad6adb10dbfd035f0d61d9201298689eef14ace8c635455913a5c16b767e754f3965447cc5325d4c1911420f81a62e44949928e1072047af35fef3b16870c81a2c0a859a47babf3e508f5d67033ed4ef970c19f276693f47cb5bda9c1e7d5765ce1dfa9f5abd27fd3fa75b5f3690c9ab48a75336a3deccb718a827394c4164faead868fb54b6199a5341cc0eb567b921c643bc71eaf6fbf5aec56ce3ebb59ecf2d2ef3b276ec267950c8f86e74d72aec633d34feb3db4a292590b116d11bbd5f2b4b37a567c5f7c5443b119fbd07d9deaf5637b3ef3df39e41a5f1eeeac0566c9ce75db98092c41fdccbaef350c715f63e76ba8be27c5cc3395364086ae92a55bb2fb9cd23d8fd570958772f5f1fb4c36c898e2772bbdb42fb5e616dfc0f3b67aa1470b48652e225ac41195ae5f26e90e4052268c569b058bc60175694bf3e0577874ae6a4e23568b6d717530ccf5c518d7f3277de289225dbce9886a39a5066cc51c99832cf1ea78aaa03a2cd5d28c073d39f9fe01ef0737e01901f1891ce3a7ecc15e0bbde6fbbf90ed34a541cb15222d6b954844421564a8c7d9e159b1b0fe035cb5bbc1b427fb8d768afa69f441022c976b55a1b37c766375226fef68be7cbd99652cbb534a0457123dcf9cc387b2c576d051e68e4cf32a43f6755832c8158272b1e558f053b0120840a3d8042fc644a71454202f1a3858ea7013ce79dd9a9b2e7f2f47e6fd2f1f810f328a805d44aa01b32718c610b7aea189bc4216fb308827a762cfb482e3e3567cc3116b9d8a09f7c29e06c82b86f71b75ae95508781a95b124c1f9c2aabd8a2ab96f64bc5044245c62cad0dfe9b07b9cc2da1914eb565d8e49639be1ec34a492577b4cf1756c60fa539da8ba06e25f5e247c7a02528e1e72e6c0426aa7aed46429ff6073571d4c9fb3846b50e711f02bcb2fc1d7290c6a8ebe56c99b338c06c0907ecc62af3b24abb4817e5bb7662e331e80c57fe53863835f579de8a09172b4e28c058927d3655f7fdd7ffe62983496c2af84250ba9ddc33200a914129b50bf4b1661796750d123086b10593284c6d7158b130d0c2aa6500448b263319364d8429051a64dac2218c281397563f807c5be4609c352029a72e18d42236cd4a58b78ffbe6e995c95bb56c41e600a3325ea8f97f6a4130f1ab56ef3d0e9f0d721d3d52b48f54168bb63c22c7fc4d4d64fe2e118f7ee66c1a164f6cc5dce2787bb83b83a54a3056841736dd420117c17418ebadc8462a71f21f6b0671f2ebca612f5f53e831ed58fddd9ab8167d2f46e9dc238c784b01d9ea59ec0b1db9732a2ac882a0375eb73136d3d144bd7cc8a21bac4491381fcb55e487d47b677fe1632cad7d315826b9f61e9f7fc7c0559c7156374d1eb92ddfad936baa42782325f5dbc31502d17453c54e6f53e64bce18b85065b8e0b99f9710d64e1d5216c8629da440a4b35eeed7c13ffc6b2cdd04056f6874bdb24e756847c9264ec68f86f27ca62e937a9d2c8832e0d4a40bfca4a1356f8d5725f7ebdcbba65704560ab35f179997e2c3221707509c387389802a31ae650e845f937339e909ae2f156bb2177109a51ae0fdecb61a3e8edc2b7e3c51f1c7881293c0c852be80631470acc57ad2256dd5b217ad8691ff58945c0c93316dc1f184a114372d9f84df4d2d38d99a2175139f6c73f9d20b01fea09c4bfb9dce858c913449279b126c48749988a4681033a0cd06dbe202a03c3d3e29bdbad81ab963d6ef2a48e9ebd53ddf0b8e673d6925624c56f061843f2c67f5c803f4fc83f99f032bd44d4f4baa1904e671af07e7bc689e3f5de2b675da8132e2e89399aca60782dcf6aaedfcfcecd87c9b09dcb135ec426b82e642d56a0d30aa7431cf4ef6eaf680ebf1ee68cfa54b66396596b86759009480083bb66507864e93ab45205e5a1616711d16004db07ea757c3e200e19b4aca5104301d4146ee8274603f061fdb2d6cb39942533a50a4faf3e32671914228f69bd301881fe9c676293af18741e33611b928d82fdfea88b043de9b1ed6a6d2cc7162178b13a8fefdf1c4b7cd077547878993299a873e1fba144ea00f6c34df5b28d24b92141df6e0ebb7e044ed92a3a1b44f267a26e780e9ccb3350ffa4371261572335a185e0a4b9c37a15e88ec422e0c3839e44a80f5a47e8c2fbe37f95aa1f06d217a6db2fa5008162e953d49b977b21be60bbf8a7924e4cee9a270532f26544d4ec8c672f5f952ba416e72207701edf7bdc39fa0610ec3a1558f54295e7db6c5af7beb6b58714d94d78f0e49df704e6d8d3499004b8a5fd045da371f91b158da06ecac64dcbe48327019fcd90ad3c73c3b056b8a53a85e0f345d7867b5e9e84e6b932806650e2a5247396f03ea0c8ae89bc4952f40cdfff5a8b1075191c72b13995ec82da97df58fea95e43c46bce9a64a363dd3758455ea51ed2cf76f34c6a69da0fadb8f8a966322b462eca1aa9333016592d77ec9073c85293c36b0ddd3a1852574e8fcad0c2e468a59c2ea622a359fc91071c63eb57073a91e2cc967f046ed7799cb26803ed3a58a341bc7cd7dcb1baa24b8cce8dd91a69e4978a16e89e06f7213c46053e588a62c03e3cab02778e8be2950fcd7c87e881580208d55277884d16c53c89f154a1d1e3f18bad42d3490d33063dca7e639eaba30d4a2a117c7ad038b9884ae77f6e62fef21c1bee81f2380821ca0d3ef188fd5a42459e526f2a52e61c59af186272f1b07d2c4c529c7412c2ceb6b6c25b3f6d66537db56b2c784b0c4ebd5f00e009eb3b54e027e5254095259bf0892a0113c36541aa89c33fdebfdc69865545307478cf349d4c5b31eb0252b143f8de0d622812d71b6820bc842fea0322b630794639c9b6dec7ae70e0f9fe7b901e59de24311d74939d52626b896e4c7698bddb2a496593129f15913927068a74beab69d42d248d0c2aef82d8a62b95a5cf085444c1db33e2dbb170d9024de7eb462772beb02a96800c22a6d56ff1172336520630d6fb9fd4b17fff217b8f60a19f5f5f375b241f7553ddc6c6466a84c710cc502778818e508828763ce867e0a8b514027f2e8376e3c1c9e7739889fb76e643cbf6326d2cc6a8d8a2d1954fcd49a803184aedd1fec8701595c94c6f2ba8140f5916e65a0047e59d7fc76cfeb3de3d31ff1d2a681c074978a3a8a0be88d13abe73d7d34bfd9f0e932707f6d3b751c5dd773ab65caf6ae34af8f47b69b6dc6f0ecd883c72eb25f31dfd6c17a3fa44034567d611870f3ae94177aaedbe0839fc1c6e0e6b6de1ce24f0cf067cbe6d1418f41b904444abb2474c844e1269f8306765d1ebbc2b7251f03426180d8894f0a94f90cf7789eaf109da85349b89b0542171878c36c00ff420dbf1d1749715510a6cdb3017517b8538bd7d63155c3cb98814970782cf8427a174c777634c8dc43715003467d00909a65d40affd57481e7064bbbf592f1d92bef2ec0fe8dbfbf92baa51684eee88f24cb6aa082755902e0810838bc00d5a8cdb20044f637d0baf132f5b1be80ff09ca239322a1506d4e489768c93e83339d34ee3674d23a9eee2b16ac050209afcefa953a1603048d4c25f46325a08ff610c3722209c55998b628cbf2d71a505248fa72b93a21fc6dca31496f2426d7c53301af819a7e2d6cee1f23c98346d2d9aa6156145a2c9a8e3922c99edbcdcf3582cb506decac35b7468432258e7c811c9ae17014dba2d0e747c73fbeba8f2942691ab52b9330d9729ec2391657cb12f0c77238029502d13364c89ce974f1b292072d80cc34bf6dc989d785109d0e1b7fe8e2f06785233f94ff3ddff9a4b0b81d6ccd11ceac07d54ab2aa240fa610a886567b2e2b5a5e6f35dd4c34eb19e39638fa86e8a1c378ae83e3bfddc5031ddac03fd01dc649aaeaee22a86b63ea433462a3e0379cb66fa294526098efd0cd0818d0927cfd7ebe4205d2b660ae719af7d2d819ad4081f1fa1999b71bbe8d65af00d71b94fdcb307636c77683655ad028507c0f03980055081715124f93e14ebac08cd417f161daa2c33626673ee936d893d48f48c23463a70ae552aa017b20074861be9d11a30754113b28c18c7abe4fd34f0d46435a73f9c1169e9b2241a80fb50cec0caf24c1402d04ae3f3152719f560306d322e8e9ea4eb22573bf0e3946409aa4b3c55a18a606f6b69e3a61894ef9354358ba52778f690250fe7e9611c9117dc76f4defa10e31f4d179f61391110518cb5cba4d0edbc5bc14bb5d98eae08d84c3bb552f99ac355e682cb6d64b01944ae041419dbe72f5d06a0ce3d9f3d4f75ca8665e90325473b2557982929629a1393398a381f280bc6903d56c30766ccb036afb6d20d8eb0bac41b6aaf009386e3984915570e515e5420d49fc5b0323977449180e4c56a2007bbd6b065e6eb1563406c29938564a3ec6d5c0b0cefd6b1cabe652f02c01a2a29392c97dabe98e8caf217d09f109dda2d646e1d5dce4276b6f304794282be5b8e4b058e6838a5319876b89436030ded2dbd89e8608269d4812cffb0358cc45bd600a2c5852d0e7cb1195b615deb7c5eb5bfb03d13b17d7045cbdcffe85921a4215b24348fe7fb1fa718429465e8963eb9a4327012ea7d27da92b54ded76397bd0fe2611632bb3d1e700ac02cd06d3a0fcb13137b0571f868cae00f636010f9604dc06e69c5cc3ecd3d5e0141dcb7db708e0bb55757c9d909627eafd0cf56b1b918c9eb0050b0cbc92ca461eb3bf4339bd03949010a88c5bb4bfed7943a0f0df2e9d2f4bc79f5cbd35a8cdaeceb4b3215107ae6a77cfddb0b36af22d4ec1cb17ef5a1adfe07bd7a2aa2ecdd60fc186268361280adabf0d6c24df43423add2e922b6a68de1b4246d940d5bc24ad2db909756e24b522b84ad23b994e98646f5d66d04ffe9d8e5fdc9231d1129621f6c069e90f67ea86481b77258b1218216dba4dcb2441141fb61216e1da3586d0a81430233ed55f5b416148b493e07e5ae5ff7352fe3efab7898c2815bba205e7c558033294750245ecdbb64e75dfc3593ac25c0150c40517ea9f4ebc23bfc5484b63edd4fb99c9a5cdfeb3983ada01baad3f003255b3e866e9d3755a580f0c0d80b3901070e7b06f736712b4ac494e7357194a5000e5baa07ba3bfc80ae082a923975742e8e35ce886409a07dc8e9f542346dc530c2563828806d6126e210d9bf8aa8fe9ac58ad34599025532ab51626f194931fb30542d9013626932613f8d2b2257f4cd228648ae5814b46b510aeeb8c0f4fb22d43a54c1ba99aad0cfd2c43524b2165e70e2c2e926aba958fa0abd395999eee886a23b1bf76b63aa77ec75de0df77e5315390304b5201a55b1e1e8236fde6da7eac4e9c7ad41db2e81ea380551789fbee867c2970b2952b7a060d44d15e717e0f6a557500d7ea60ed86662e409fff19042287fc0e8732f280161587972d33f8142d4d912f373a727c27565706002e9ee41344c0e71a8f127672dc5074d3b8be0c14c3b6f045e714f5ff4115a50734ebe7672a3c5f006c0630277a2ac1488f55a60a176de723deb14b51ad1f8ae2266234b3e81df4d714d17733aedb18586ec43810b0e59546a3ee7cb93da21966aa03db07dd1d2563eae1761f9e172d78fc56886cf711aff27407c64a59b72fc79f824cfb5f166ba8ed29b9d0a9a14e1c0c803129b69560356a52642b39417882fda1f02c9d3c8e5702c199d24339bac1f9e238604998820f07d28786d0f719464a6b8f18ceed641bc20f6c7a2d478bf3b387928b6bdf86a226f25f3458d8a2b72555d3c53086253f7fa87e6117b680d91f7386993d6e46cc73c6cf56edeb892856afcadcae80eec15a5155e2f4a3dd31ac822d6b990132f38e908d81273ebe6b26fae17b46fe29eb1dc4d73c159c23d3f83ecf44e99f1a4ca0fc12e620fba7b52765efa77f1524f60f5c6be2f1a6adfe12da3efcb06c8b6e43fc907ce6df7a3edda3c0bc831776ddf2a08b0710641fd99895caaab3e6abc3716f86ab52651e97cedfa3909d39288baef5fee2e59a370b47c2f434faef9ef0166028271cfb7a946e945e80b395fa413ba35393372c6df2968269bac0c197bab01d6b326d33e10ed0cb267d9ea6b042fc02307ece29b3c67802df619eee6c60ce7c0a2a49860306117595dd40bfb12dc9803b0e0497acc951d605404879ea263d02c57cb63926029bb0a1238b12b3ee2e99adfa7255a887fb9afc9443fb4e36d4cb7132b26ec02ed625832a9aa6d172c9f9f28d0aef830c35cb8c7a94a5c17df4db8df653e7c0819a22867d8366b348f4d7aba6e835272ff96af12e2d174bd189a39b6c41e2f5eea66d0ae8a4e238f81209e18a22124726d6b5e35ebe5576ba45ba154f565367cf6cc5627084787d2cc5e8064c6619f11b5fc0477ba02539f669a49080c96cc8a86fb71bc2f880a19242c6197c9d31d7f603847a5ea3b6056519a8a94fa6b41bc3af71712f81248918a9181426249aa5f3502235a2fc7e2643f414e091c3143a8679efa0c795358b9e53d86331db70f8db8b1489114169d8e23dfb5808af84a0f3b21f407a8a0614bc6bb8fc894bfda2ae89cbb7efeb16399d51b469e9ade7179b6dd05d987274d72a653b3b49997c2a073b5f2a9e834381f78ad8bf3cd41f3efe63d59216909f9f986fee309ddb21a17dfafce3cfe12e236b63fc66a0f8cfe4d23c8edacff2106174ef373022d4f20053e782910c3c6c270f1d6861e6dfce10a5ca23cfc22d06b4e7a5404c806313475baf222bc4a50008c0f0bc7b469f9cc0799f72b5fd15af7eeffb9830e571449d06d937ac1f1349196630540f105943ecc68aadb354624759257f9e0b0703981e58717be48fe5248393aa7449086f3522db55c97ca934a3e6de72e9d0c9a3628e808dabd70033f61ea619efcdb841b9ec4e9e3f0c7268611aef43b0cbec896dd7f10807110a8f2f3cf439e56948cacfe42be06851054371d809897fe1e695d941d5ad4a2b78f0bfd26a108f2ec975c05d7d61cde0521d579a7a2574ad1335a8bdd0de184d903d09aff8627410f081e52de49c9cdb15770ea7f98ab53773193daba1cf8db4383ad97158732c9d0285d34dc2ef0b1913e94cf8281561c21e245aee6dc6fe989abf390db4a096be5e64e31453d519e4372b13d990fd7435dc97953debdc7930ee5eda23ed4c9d165e0b9dc5b2304be7df81ef164693c0c2a94af274f62d928b1802ac587937ca735f21f7073cc673e0ec6b7357f746fe5902c8036e025bf390c73243370eced38d75a5e6adbd2a21464f41ca2d2a9b2c99d08c89fa251ad7cd437e2e528cce8a903859e0fac35076b7ff084caabac03bf83ecb975bed5d03a1971d1c7b4ae3a50b28e10b293d58d1da14bf1476075750b4833579acb027effadf2cb6933163f57b963a8abdf9d2b6e7f47a3c5a5e51f04841db0bf5b302aa894d68c87a7843c873f49869f8f4cd768e0c5255f6b38199df465cbe281b05f5b4614e630896e4ebf41f11aa055fb56cf4a51db8a8acd2a5e46a3d3e9009fb9c08b33284c05ec54f40f571bd9796dc2b83e06a99356abcb7109109a8b64abfdf8aed6e9e6f34f72118ced25103aaf3cfd21e6a0002223e24288df8068892a0e809f70d68dec7f7566f2fcd5d56bfc032c442554baf2274a60e363541c855eab1dd56641eb81148779a0e90e6ffa068d20ee58c5899476d8b19379e7299b9ef7568c5ae1b0020c2c683688bfcc92c13550522c4d8a1dd44fdfab2ad30306d14129e89be90952e5ca4cc8932cf0ba224af7e1554a0b55af4e2450a7d2f02f957611f8c8e06c6e63eb5f8252fa32fd56b5969b2b13fdc09e246425a3bb20b01659d7743cded222fd81af44d55292982f5dce496391782b5a70054963712025c495a7cf91629ce06d99fd448977c2f78313684c6cad5312e0ccacca6ced253846d58726875cf4d729c651c9818e5b57fd2299bde6428c432dcc1da190731161a7afe59c329d0d2cf2d0decc72533b2224d8928d68a465c557a0561496f3d1185f0643b0e883124a571cb3591f189e3a613f02f05df76dfda008c5138a8f264da2a6c57fe0df0b411209ed8e5b7e2c8c5811f0dc7fdfea97d5f6e01d39a633c70e662ee61b9259c707565618a7797e8e87c08eeddc48d479e3110a6921072a9a417b8093298958d54356de3716091ed587515ac3b921eba5f880c4001dfee51a01361976578458b5555d996506afe40a2c82ec82d92c49793ebc2d3449b87226b155017c801d0f01c01c2eef4af242595cdfc1ab37ed745c3253cb1178803cf31c11da30e5ff1abfddc146b0d368a2a500070ac5d9f12c7f8af87fef7ee2b127f9cb4ed649f707e30c72190c15dd6ecfcfb0dc50069c6f489417717fd3c563f0c4bf567d3a5e76f5b76a3727bef7d373af418fd98955b14b472dfc89c39e7ce8d1172df58383ecb7c133abaf6b408119ee703c02bebc1c4268e2e1202ae61c6c1a1d29f938d39d9450ee2e9f3f2d5d1baeeb5cd7317fe9b18fa7405a0bb30bf6851e9fc4aa68b965b8e4a6a3bd84737862d1ea725023d285b4ed4b14240260462bc38d59eda7c75484d4a1ef53f29586704c80e7ed07e8e8995d31eeded9b015ea818cda1797d4d40efef13ee1fc2bc14e7712a59f279a8cc5208a6c1943f4f2d807f8c63cb96fc96cab6f3bb91b7d1a451ee230c085b6ce9f6c4e1b70e456344b4785b21a19849ccf186ea3849988a8d01f98c157a45c7c2dc8012d09119148af7396427c3e554044c5a3d5191fcdc244c79a0242d2d7b8a695027df393d19074db339ebbd4b9ec56d2bb7904e62b467ff107a9f1aff03e8ec9e8d61d95d308a5efb8eb5b99effeef53a06d8594a4683f980f8fbe5abcfaa15beb49d26e42ceca45966548dec1b84f5edc4388e2e672123c09852bb80c4c182d1ba4d4324675de4422dd2ee5a03c881e6b7d16e9e5b99b2f2d035424fe75fa511b7d4ea4505fc3722cb19247c9cce9483252841e173b89030c0040ea1cdd74f4d12ba2703e2f9c48973fb4c70dd02e17e1979b9b1a9fea555265fc07ed863ef26a9201f128ef37c90f622b680599b0b98a335a91082c3e445eac51b0c61938c59a7ba2eb0082e12efc39326d6bddd467a7b2ad00ab5641352684c2fd7dd3a79184b98bd8698c54e7006662c570d4aa86598698dd9bc394d370799f784fa53171b0d71ecaaee6be62a6919da2c4dcb46b5437bd77c60fb6c6577962554f859fa9a3a1f33297db5a8c6abdac2e702c55ea8516d312ebfe61c1d3b6d5325c76cb3347a43ed9c479c53e25837c912fd690a0893d213bddd91b0baad71038c34d2e308a5c2b91659e9141a839814f0aca6353beb9779fb4e8347699b0d139964f2bc787a0b03127e5c0efcf3cd87f6c5b942e15f5482623beb44f34e913f15aba358d1787bdb2a8cbca3edd34e895b738a379a5757a1c485da3f191a7e286aeccb56a22683aefda49b078f884e762ba90c6de17706a6771822d6225421da829f976f5160cdc75ce42dc1a926290bfd84105e02334a1b4ad312e25e53c30efbb9a433da7414f022f71e4fcc5fa1043e4d6115393a262550c976f9ffc4217038927d21cd0dcdbfc69a88e6ba48d110512ada2f6d0cf5141e4a02fbb6cdcf2d7dbcab105f5e576c00928974defec736369b7331ab4bfe5828407ebb76b4e3bf289bde93d171358508270ab432848fb9da5b854d2808af650ee2ecc3b2b35aa839cd14b95424bd7125f146dfa12167701fda193317c718d1e82b4ab84eeb40e96b35c141cede4e96292f037121b85826f1b08d31ebda52e7cea07fc217b8e073415a81a892f051eaf2e07caa08787cdf891a40d9bbdf18082ca1edb404e67d2b311acb72260c63679a7cc5e81385359aaff1e94009d45c81f3dcb8ebda8f38e223950f8a9f4a296abd26ba2d4c45f0fdda50b3df123b8d96bbddea882c37d043ddf8bf89ec7f48b2812f2d1136e2f100b87f279991f257195e319d4fdb0f0726b59459f330a33935417f1a685945a9173c25c139f6796890cb423b3674688a0f5d8abd105391b2cd4ae378ffa9e84257cc56e114711003c5d4efce54ec91a2a785dde35821723422988ec588c5226ecb819ee808091ce1a442ff17e748c3b353bb55d13fc28a3740964990d0e38eee0983106d9a269e5d194bfc5ec3045a1af626748a3437904c19015d6934be8c5aa5cf9a99b2c14f59e2b3da5c2464a976ff7a64e422a2890987ee09dbf9dad1121dcab8fae93258fa12d1d34a87faaa8cf9141f54e152ec4a30ec83006ed462c903f384be5843c8a91e807fb63411d0eacaad772f5c87afe1409885894047dc1ba7d102040b1bb96bb991871c5da472f5c0ca78544fbefb0e0d8ac0b68cd9fc3a263bcce26a1bfa43e5042accf070ba83870e78afbc36cc0178ec42a30d470212452e3c20bc08c42fd3e79ae7d0eb97894ad2495f8ea086705fc58fb29d29146289f0ac3237fc1bb39f98f12d71bd99ad2b6c6829f961718af78377b4ae9d3d9dd93b793f98d0dd94458971869c5ed51d31cc4ff8ec2bd65c84d337bcc507e69199090dc3e1318ba512974117fe26ca53834484ae7ca235be57a46752ec147d90b4381be448781dcd2b31f7ee96fdd5b525b0cab02d56a3e86cf4f48d1d2a9edff5960572c3c1b751f6798c0d97c05839479d7fac9966b5a32f094970b90f31a4d58915fa96c4715f01b616b273d45f945f2af5054843e9772a64a2511911aa45c91b03499b3adec69807445a1e12637282fe9ee70923b4a7bea50a2510a272850d7d6adc3038bd5bfc612ddbe61003b0280aaa296851a3dc856c28beebfd79e01c0472d30c0b0094331a8388a87f5772edb6dcd7a8d7659200e10df4a5d48830bb7d05358dc4b5a6d692afb71dafc5b5050c85a3f9d6dcf39e0601c905b36eaa9bbafa5e386b9ae007e6f1063b128a278c72bb3e0d13a42150d1a643fc9a26cf38d82e82f9d455bf0fc1684af54d7a907676443355eb31a42710190714d86a22616f0742daff1cfcdc4eb005249eab02873345814df6eb62458183c1ac1e6c3a89f91893f9adfa2a679b4a9b8c2606c198c22c8b15d6b05e509ac0d29c2359162c5bf6893413fd8dffbfdb495ed9f28c43705e32012e5da2d22209f86689407f2a56498d0dffd5e2f3379ec1479bee109cfd313f34d2444b11b0e139cfa5c169db120bf46e11b5ba5a09d758b39f50cf97a593baea00fcb6b12f66e016ae4b78ee1edaab492a76cf3b3307e9b6c62267ceb12591c94a0686dc1a548ddb1cce6610b2c7bdec910a61a571d87859adc19f40d7b7c889aabe87cb115b3ef08df15597ae3cc7c6e91f5fef6509ed26ebe74e6fbaf1016d5b28fe28385dd3cb52836dfc9867643367127d0c038b3d1377e1654548aa1f7b762f6799666ccff9b4d68a8814900beeec9837e8a62c89fba3040ee17ab66d26bf4866f163ee5d92aaeefe94e7d8cdf8f70813a43cb63277e833b6159307851a5016c7cab263e221004f0797fe9eade7ed1eda218c3e1f02d17f1b8bf72f6710421bb2d49af0ebdcc66bb9a536d78bea5034e686c227aed950c24a4c437d35eb38db46388c01541a5ba2453f7070d7e92a69bdee32bb0f561b2c88cb40564402b2129d4e6ee1114453d825c3152c7c07ff256aefd35fe9ebeb1362b4a5f3e36be62c03bdb20ca7c22e8f1c3d6ad8d15f62b38aa79f5252a6f35c28cee211462798bee1399cd71ef0ebcc353190e0018dbe4fa450fc09e92536cf722dae3cceb50e0691b3792e942a40183a1e66baa62bb2fe9e0d8fda3c0ac9217476b9bb72fad3a1999e80d159ffdfc590904d5168ccd2bcd190239fd698780ec45c921ae554c9ed5a24050ffc6df14f8f1fb12538ef4cf3aaa446f511e42ab1fe7f94685e985239246ca51cc46f1cc80c7d48418e2e292396a41ee578c134a716442ee9ce8780eea6e3870ba0b1b1d5e15d6f4e147c80c442233f6f71c54f8e8ee02a0239be34dcbec97ca74f36f4d137c09e02fe7839d8d8bf9dbfaffce28a3cbc983f97653751ffd26ec449831f219c6954280d539c085c132ba24fdbb49ca515e6ae350170622c8c622f0e1d4386dcc235b0bb129211dbda777293e750e3182a85f4da0c0b3ef8a60c488d8902b08e86b63bdc858b3cde2f634c42c6da5bfad9bb65971b6fa240c0602d56dd2d9c65d1b576c0317b09d5f21c60c1d79fb56dbabb4edc6b698dfa4736cdec47df5b6dcdb2666b666e92032c451e573357b44d9191707be01d3d2c43d7fa130345f25d1600df5467fc2d2ab04bb2cf03032b170b859e57c022b5f53b0afaa68f5fd11bd81e6fa8f6a263f5e3d875b69fc2795d7ecfd68c32a65db2c6c930925332988a9159137497e3542953b554892922e351045278d088d7862de46d81675c7096a0392c94e712354e636a6df5cf449775756e8ace752f692511b5d2144dd0d4b447f3900a8977ef518698131513c4c30713ee2c47a6fbee02a53f9ee16626b096497dfebeabeb66c3fe2d588ff330250a914598d20dfad5f9a6b3157341ab5a4cd5cdb59c90769c2a86e7173629541a60b3c7118f4364caa8ed7fbeca00a4418125d980e1ef77c7988173d912574018c01a515015ae9654f3650ae24c901cfcff033fc0c3fc3cff033711f11fabf087d42f021735332bd491553804f49b2256da0528702c06acd750b000000b2521fef04ba04d4046626715f6f3d414a74001831b8e4010d100103aaf098c596924bf6e7cc24a54a16dccd5654f7f4f9eb138b8428d19aaf5b0312b8a1811b9fe3010b4a92c49c623c6be6ccd9a041438cc5f17845afa169af2aa3862bd0904b57393f7cbe8f058f569c243954b4606d52ec30c78a0183072b4e1a3d2324530cb7a4e0b18ac7c259464fc971a62ae3860a1eaab0fa3f336e9c5708cd06182710018e11e4b821c6231586f3ae2cef168d1f04a35d05220840131ea848772643bf899939666ce43845628979bae0618aafd24dea34887abc67f02845656a72ee4aba393ffa82072912bc35df945cee713119638c4146e7b8d18f512c7a177ab36c1b354e20821c37fc218a44ff7431544cd2b9651b346880710211dc7884e224670cd90f1f3ddffe0728344bbf8bd0c814bbf3893e4ccaaf62954992b48287270a636299bab935a5a5824727486f2d490ef331d9e99c287a5434d1040b1695df846aaf6e25979cd4414d60ad67492eff3caf990953d0d4bfbe1126ae9bbcdddb0b19837a094dcaf61534bac9a66e09d33c6ed24fb933eff5e0510993ece13c7d44094e54cac4564d92a4ca63125e4a7b6ecf6dc1f3e721898305fd8c317ba7bbf688c49b1e97c9ea2fff49f280c49db39470827f8f4760192bacb36f6ed5ac2334a9d28cd1ba182f783422a9d5a498b346060fd7070f46545b62d6b9fa2292cef1a44d62ac0873c8edc8141ab5649388d3b4e593a05142878e88ae844ee1ee2fc54c8287583ecb49fb39b64a5d0cf1e6d458d3599ec287856826632bdd4d0841774e4d7e39ea06eb06a1668a964a9a3b00c64310b7cbc7f5f84134cb1488dbd5c42e59bc73a70610c6d1df0e5f7fb96efe439549aa0c156366932c7ed8ede4641932e46a82471f14937d7783e7ec489f0f5ccee2a1f355698c13123cf6b08951299ed7bbe43c2278e8610b6e7782c48496e77958f3cf5a2eb94d755b81071e1893ae3be935dac9dde30ec60ed50db1e36f96b643db274d5f788c9c9f6ce070336e781d28ed99e813f3e692e4d0a1fbdd6cd1f26bffa30c1e73504deaf8ef97c3d34be470a5989864f3d98d593078c481d1dbaafb7c154f1e1f70f0734e1a2696f882c71b0cb96f7d5a75c2698e1b922e55366e4dc1a30d5cf494d2cad53668d058c1830d9ac5fc1a4226e3835482c71a8e7b13736c68aad0c678a8c1e851dbe0f2193c7be391864eb69c72fe7e678ffa030d6a92429574827b8eb939c339a6c4b4daa525ff38dc060e6a6ce161066caf476c335450f994e1faac94e6277d8ef43668d0a0c1830cccdc96bc7ffeff92338682d5d749ee7be11b13c3499a0c5d52f0ac50d50d1c6c19fb08c35125e512bf23d35609860a5af000835e1bf6dd15eaa5ce2f24c45efac73c9eab752f909db26cba2e78a9e7e24ea5f34d9a0e3cb8502c295e56aa8d75cd630b68b4ccb40a3b2945c9430b776a55f579ef9185448bafb9c2e4246e4f36c2a8a1831b5bc36fd4c041468d143cb040bccc796e8d785dcbe30aa906cf99c49c7e58a14f52e85509bf9b6e03c1a30a986852cdc54691cbd90868d0a8f1a0c22e7d9b647de557330b50e03185e432f9723db7d3461f5238442b25393269755751f87373924b9e0a145e8ffba49fc34fe8c3de87137895b8b87cc184b9cfa309497256cc9ee52e554699b069be24f9a75b476e3696c079672a4b622765e84aa8aeadbc2e7892b09ef6d87f2c794cd60712e8e990e1545ef3e8477054d4d75ac34f760f8e8711f892d4932465621a0b9111a7cb4a39a1323a5e71926437394a345e9e6ad0e18a5678a2b525490cd7b1abf740072b928412e5c3fd0995ddb30acf54cbe5ebf3ec2fa40af44f663ca5cc96fa549c26c5ca9cfca9e72bb4810e54a8a9f7c4312d217bcc5314d333db751f961f7698a2f23519cd34be7549ce6000133a4a719bcb49f3d353b92d292ebff93ad0318a46cf2ac6287a6d53768822b1356f787d4f22f293d1118ad54e667366b2d1010a7a6ed3eb7a7ed7f73fb189c1c46a37c790d1f7041d1927c473f892f44eb8599ed22594568a73c29c67d7621bceecddc46bf3a929b49a30fedc4f68fee9707a268a6a61a4bc5cd63dc784153bc6a764fc126634bf8de2294e4e5a428f2b556252fe1faf129f6be7fa5c0e25feac9fd4453a935025634a93caa4b48e24fc78f213a9155172249428b9bc820809c7a44e19db7b44ef92c12a87da11e5e98e0e17ea461c34ab7ecc9ec9d3cc8ce8afa2f53d851791dc51fd4493a02b1f459817523b5abeada913c164e731e1241711e615d1981fe2dfca9a2fbd1a22394ccabb2b16c21013a16653532124c4196d378b6cef576510274136ffab8b4f452a08fb2d443ec67d0b4f209455cdb7613ee99980f844c33b6d93c9b9fd8134593e78949824e9c40f875aa7b534dbedf48136fdec71c345c6c287a2cec97aae96e48a720f666fcc641dc674f37af05737d8e807f370ccfda1b44dc4c3e59f1f932396cec33b589b529d31496515433b1426c4d96cfe8f4b5887d33eaddeb86f3e3974a8a34faaf41e56639d03121fa6521a8fe1bd9343496343956b170763b40b5b7b2a9725070777531893a5f23259ee0d89de79b3b92a99749d1b125736964979f196356d30850f1f63af6c68beddbf2fb69e46cd1a28d97c46befeaf47a386e345776bde0dba9a4983a12a77fc731acf914143a7b9259d669c6cf719aad18dad922709729b194c3b3b6fe265c04a78b994c25946930c768c5bedd4bdf3958d01b1ccf41b24e7245b0c7745ad1e59933050eaaa9b4a0483963263cc5b291734c9172c317b5ecf2f66cf122f383e9f633a29ba4fdf854f93f019e6399ee8295ce8243fabd30adada295b2844b44e36b7b440c6f4349d2bdea45859382dac8d4509160e99b62544fb2fa5ea0abd54fcc9ce29dbd35660a72f9b468f67265a85928da89c581b3f27a9806487bfbbe0714e6e0acc05d1147a518714126c24742c6e4af2af3be88842994af2784f21952aff830e281027ca9af831ef78025a194ff64b9b0018a1c309ca758c5464dc5039273b9ad0c18424d30993f22671d330722c81f8f46f1afb9ada7d184a2854a527d3d42a1dc771818e24984bbc8adbfc31e30619387e031d48487386314f33ff6953560c0a741ce1fd91880cbe69b2f58ea30c0d7418a1a4595749fcf24f5fe236729c5186053a8ab0864afe5152c36db06654a083082531495cde3c5f72ba876066938fb4d8c97c7331cac891810e2198d6627fde29cd59d18e20109fc4d10aefab030849258b49db65f2f8451dd3ea2d8baabb770f5fd8e9225d729eeb3069048f5ea0e1b9c65f462f75c38b2be956de548fad551ebbb8a2eea6942755e3a18bc3688ad96378bbe8a50d7de4a2f19eaa28b936a87b0f5c24e6789876fc8afc718b2c79a50d936a52f09f047ec810413d6c51dde68aca38ddc04d4083c60d1cc73f6a91f6465d5ed8899f6579d022640c1af3c9278416488961f9ca4467b1c67cf94a726fd55b21b210012416b0784539ee79d6726833ad5c911c6761937ad48a2b93d499673e9ddc291056f4a2feb2392c34570a64150595cdf1495315c674aa1e3459e80e995474b9375af55f3f5f0c828a246966a5be249101e41497247adfa5e9b0b5e90b404c619e2494e593b1c8b24b29c5e1db969645eae53a148090a27c25cc857eb2b23e29096414095d1763196c656fae12c59d31d346cfdef51f8784e290f1bafee2cc778762000185b9e27e7677b9fc97b200e413ea746da5f1db24cff8038827922d33e74c41cf33a5a9139f69ce5d9337837002b2092cdc764e6f6dadc40907104d249e1e3e553bd826e94c606296c27e0a236dc2983894bb79cca5b1d9ee259c34d18b2657209658cc43e4475f89b42c57c52be973a74e892e6bb6e5543efbb5491c2693662da182480293bcbe82680793b5038944af9d56ce3abec694f2000289c2a6a5fba7cfddaa90479c2c6992a63479f5ac038823f692b2efe6587177e39046ec27c78a9a26c9887b4acc97c4ba642f9645a0277beaf93c6537a11b4014c1babbaf2635cbc9e38303928852cef09b39fa398020a20e71e7277932041502b5a8412bce9f9016a7284008f159dafdcf91b7bf181b350671d699c5ee70712aa5b6c310a304104120ef299d49ee61f95e110112086eaba693b47a39649e0910406c6288dcfb68fc97493b80fce1d5932c6c850606c40f6ad2136d54c23e247d521e3fc93d2d3605e18319d37a7bafbcc99f7f00b2073de421e93439e51425bf29b201c183a1648dbfbf30c003903b9c736e75ec8f1edebb1d52cf9da28a8c75481236cb895bb962799c0e59e8f4888a2beb1803990361c1e3d45ccedd4ecb618bb15ed163300e27b153844474bba7050207adca728ad84f0f6a027983a7da26e655e6ccafb8214912cd3f26614e9ab0da7099d54e795aea0c081b8ab74e3165b856ee3010206bd04afeac24ef9a264b11440dc963d147b33c9ea7c3b841c68ded0d40d2405aa76aaf244d0082863caaad411a809ce19416f45ac4e7a40f310031431992da6edfe42d91b21e4206c8186cebb4e1bf6290de4a0d8818125d56bb4b0806903070e2fb540c92a22dfb42c000f94279a1ba505cd0378ba69c53df85a62b806c21bd986a6fb4e2df665800d182eaa511755aa167395950672be4539746454e21806001720533cb4ce89f3387054800b1423a369a621493a4f8da04902a502159637378ac163285bfcb3a564796426e17f6a6d52858a659552532a5ab640e2050803ce1ab0caba949d6c61910271ce3fae5566c4c39be0d4813204ca82de36d9d6674057709dfb5d7e5ea0ad7a32a81fd533d317c2da7924930c6fcbd34594173ee90c0e5587cf3db8eb0fa9dd86e494393746284e40f13bf7b290299bd7d35931411ba9c625ab7d455f186607fc689afc76930110297efc2f64c0409426af197573ee2a434438060760f6a969320a2e95f70217652cce4b8bfbd2fccd123fb3fcf5bcc6b2fa89256b6c48af2f9125e247c8e697f3d8d392d1dbb384b4e5e483bab1c950e5dd0f2e9c41ad5ed0fa93b72c16564b2bc1caa64773b706187c72713ad63123f07a3e316b7adc64a79e5c131021a34ca18e33b6c410697e8d82d75d4a2cc97c19264a7fffc5f408b7385c74a6289155f9f8e599416cb4b924f6551aa1265726cb6c43413c522c1528ca35ea1f29b58072c36290ec0028123089442650107dfad92dc062c8022502e02156933729c81830001d001432001003023c719261840009c067b060d6eac180710400e1c8e801000e04f495a0d15c6e4dbd846963a83068d311c478d1b84716a9c30dacbc80102050c81566bc9b513db9dcd86105ec9cf49d35a5f46b6a180201c3e5acdbdee3475aa2800085fb0a0d16673bcce0c31c238836be0a8c82f9230ccb84118c717491866e0b091438c1a351010e985199e8317491866886123c7d6a88180c82e921a350e10d1451963e4c26f40c61863f8180688e0420765f4183e460122b748c230e39031c619356a2020628baa05d1c25861d453cc9b434c27099159c8a2fc14da396b0eb67e2c60d1a5e42fbaf18ebc22eb3acd952d476e1e5de1c6f8d3f84fb5c2b43393b369e878f964857ec244e5cff874f32abcefec361193882a5251abed5a64b92631d5082ace49c64646e3c78aef2996540daf1eb64a3534853968f4f446568af24931f26f6166831a214572852f3d8b98ed0f23a3706dd66f4c3af136daa2b03a653777e3814828f8b0494e29c5ce5c6e8e611150109b52b62d66f8cb67e4887ca28a2925e9cbdbc46c02114f147f27eb52e5b4942f158874a23359cb344ab4d7ccdaa04143239c28ed6f9b9c327b1ad76dd0a091914d54a6d3e1cae40fe6711b7c460e1a34725020a2894e7c2c2599bd31f9ae48263051976883594ad1a4762f899225aa1294988424faee8a3a13f124b81c890426e533296ab2d662c786db60511081c4236cdd76f9dc2ee2882b9dece59e3fd2887e93143784c4554a7236c208fb63bc799efb786917416d7694949373b4d6228a8824a22288687e7b3ac99fa9eedf21ead6135aeb73fb55c5109618364b86ddbb4ff28530deefece325612aa508a1c91ba236f37ec71a07517b0cb32fcb392a78362282403327837eeadc64171b1b8804e2be95ad64678900e20f59b01cc6c32789f8c199fc1b7119ffcf5d1f3eedd5ecf1bca3678af0a19bb5b839a4b9873f7ad0db0ea31ef260b88a2f267c46d87df09064272639947e3ea1a4ef60873ad0e128f2298a6529f1d099831c164d694becf98ce676400234c0e12188c4010e89de6ed67862fe289f0e44de60875ef5f470b2f61e379c2f69e645bc8c56d6067c2fa5937dfa0e138cb0c13895dc6c25165903a9210d8486c8192a628632d87329bb09f7a7f769329cd4a3df26b39881838c1c913194dd4ccc9ac5124318280206ef6ceb53c61287c817ec1c2f6ad72f42f28343c40ba709237a93267c5eda85af2bc5cdf868e32f45b8f06a063f29670bdac5a429e7def3f92007225ae0d4c4948a7b6662362359486a5bf3e40ff5151d2c982b76bb87c944aeb066bbcd293bc98b3e6205f77e3454599f9fe045aa80fa6f86fa4ae1c3d30815cef9e5be96e66e3786139129246d8594bf9770994ac110715225f554ce256d9811468d00ac2212053f9cec7dbf1e359f5c040a98ac9bbac7ff3be1137942ee1e4bdc4c594389bf130e9e96c455b619449aa009a51a66c2af989832c1d553df38b1224b20ca4b9af831e924d288129a7af3cd14522afc154982ae75a9a4f57d77759140c6fd283932ee5fa5c811f8507a62b96a1b11daaf2d5aecfe1a448a60b9d9ec9cf4c6d8c973c34f702244a8e4fb924eecca4c114686101102ae7a29336b125c43c2402408d56a64ea8dceafe34780b05fdcce296b49da4c7e51458f7ec9b8f645df06c4179a7912be2d724ce83ca417c48b2a2426f6c31b80354076a10bbc36967df654e2dd950b5cbc412a09256ccaa50f728b34d7f64e995cc9dc93c00520b6d0c64ed670558266abb56844c20a852aa833976120864110055110832008629f3543135080b840180c46c3012d91663f13c0c0ca42d170280e8a420181300c463110053110835010c3401cc44044e224b3ac1bd1a3b4bb7862d3e55c44ae5e0b5dc3629e52e2d6b0480673e51de4bcc7f666fe27e6eb55dbcbbec433741adecc82357ed3a223bb8e58837bad264dc261d956e063aeb42b33186f49fda99e4347facc4d80688ec7d7458350310a38ffc72578f8e1a0ef2195131f5a30d5d47effc3644ac31b6eb58195ad1185a9755032ce6b0f7bfc4854445acc262d27c52b133f126f022dbade01c257af5fe2a1a8cc3963f8661b97c2c1e868121a49cf74f8b54b91cb24ab63361549521f874232b81958359b539d7e772b98b28420ebb1fa2c423c16803213309f88fc647f2a3b8154170f2a6bde166f60b5c6e0d7d078a82c206352e9ad3ef357e30620b69d274447210d9e71a495fbb9e33749f275ff9345652e9715cfeaeb2ace2200010b6c05db6fd8ae90e95955d3334adeca76c4e7e65b46071f245bfb96df60b37ec7be078000c94aa8fdd7f8be270c5706361a33694296fbf49bd35abf59792d843953325e5d9558a47384f12856efb4e0eddf5be58b5200a88bfac9959c89da14da347287413453eca907e02d294763cda4b3f4439991806b804917db384ed08c1534196cead8e94ccd788d7c53562d7267baadbc3a9bc2083a3764b6d3a2e78e834b0b95038fca587ad1546943e04591197967abd948364862b0603452052202ebe8034e11035397cae42c8ffc55134e86663f6c94b1264cb5b5ecdac72076a7ed829a6c9e88516cbb02f0e2f41ee4b8451ecf9ce1b08f7bfd800c0dbe61b24700258c1fd964aa2df4af91eb3e1a44f5549db0730eedd8514a63e1b77272ddc9f9b0728c8c0122bd44579c7e16d050c109419a43b709276f0374c13870d20ebd2dff536c312ed182d10187fa74f71b1fca900372737603b03f8bb970c899cd1ac2de8c816155aa74143ded8841f8e4814dd4009b9bc0ad064677bb5d6f1af9583d9f4646c7512eeb5ef04126125aeae72875b78568bb021699c7f4594c2fd158c500174dea61ee981d689efc28037aa9fe89bb68517ed26a484c604edc3519d115193796ba6099036accdbf1894eb8720b8beb56c4f7ee80ba25d6c950c9cfc428f2a56ac3e28cbf8c385342497225bf59f88c3b54cb94ac7f33121a8a3ed55792b259084d9829e9e7a42f80eecc23231789c8ee41778331403a55bbd137e5a02bfa7d9f3b7ecd50e1ec4341fed85b965bb5bb86b1cfadda7922a51c38b01feb6397eacc2771750ac086cd1daca1c0ee53a4e4b888bc2a114b5c34fa4de42db36e5366854bd99f090b450bd92a6e42e61ae312707d17009e025370dd58237a87c6cb44a338b35da5a2e0e2543c8633ed395b0867f7bc014057317047e6cc792d00a59e92d9b100fcd73f04e9ddaf4391a45e3d44f9ebb03bd9d783f2935ad1d78c2738e1c668ad1d99b0bafc8f29eea804f90ee37abde857561e150216e38775e961f24914135c6e2a5deb43e264ffc5b994b40b35fcace963c0a63a47af32c683c9a621143a94d9a36875526f79e59ecabcc9dffe528fb76300997ae1464eb586e179546b54189fc8e2e14085208dfb6672507c23514208bdfdeb70ef3fb22941d049a23be02c96c23a7788e58d00a00227c026ffa24d6629ce3d620d2b07be1c609a5fc1a8d4963701592f2382f93e27111304a9e385354bfd026ea5bc45a63f1685649531398964f5efe05bc1062084b8f6911521c8d7cdaf473f847c0677191b55ca7059d4ed8799f96d3c9faa13ccbc9d93661da50ae99bd93e3c57cb21f4b26d58788cc4515fa6134af11a2b29efbcd5c0b33b29cf4e65c09526fff27f6882d1cfcc1124d0df15737a85a09623bd4594795b6aef8a370f5e1ca16da384cea5dc3e295d7c27608332b7984139a48d1dc88f54bed80e45b9c4c50a40b030e937883c5aaac241d11205e2fa5d9c1d29ffe37a2cae7fddc58c73ef5d530c32606cd21dbefedbdf774d68d6d9b8ededd24887cc44588b591364a605116c21ee81652de57834ddf864949b3725a51192e530ebee788de475586014797b51c45e59c15d761133a9abe65b3ae5e07c04254cf62d8d93aef9c1d6d517a4b379b8624d9343e6f5ef8455344ea09c81f2b3735434220d0a6211843de10ed8f247d4b539585a06d396dca98d2f11619bfa94264d182c0020b7f726897b9f98c5c49adf0cfef1926e23cddabc2a7f69eb3273edb31eb1d3593b4de0a33b7ba01b45372a2685be4afa4fef228c9c9e2b3fbbbba8d5519ad108c6d21d25a133f1059cb68be3fa714e6b26655df3bdb0ea85ad4b308cc07ae9057fc0285e05f513366081247a71dd9dc6dd28bd78c3873e92161e0f1797a2934e8b36e93ce213fc760d03e876646a252ecade956b8f023afea30b608be4f2909af8655e8f4ddbbdeb919823597a4a43a0093e4efcb9cea82f4dd08c77f57c27989a08ad507d8a480b09ee37d9443008d4836a7b887beab566d3a080dfa0f2f0b2265957553e6f9327a29b577e907b80e59e9ecb7deb6b27655b243c2b301723d728fa7546426ee7a65e35081c7b68daeedb32802a5b9df058f058d7efd209e8a50b6268dfcb138de5c324c65baa14e425d534705f885c1c9f2eef6eccdae34f84f48e4d58f6d69a4134c619c8dcb9bad4c51a88f269275b462c2867b4362204af1c9241b11cc1d6afb36230df62eea6e82095b5fbbe4fb708ec5f81833a0981f3e384a1837d01ab3f5844a043a5b4e8e2bf3a3dd40553cc1c0b0a0da81cab1a7fcf56e3a87150eb664ac5b4b58a36f76a53933c32fb1a654c2236395b7f753d3c8e4fd2072c8f0f1987de535083774c10d5038ca0d50f6049c8690bad5853ec4bcd90227d88db44fde2996570e5936415923a4cbd2140e8ea99efffd48ced8e8bcbd5c77cf1266d799b7c15654f131d6937ed9351503f1c338921b0f8d53616c611f8fa71a087d18e8ebcd389884f36b17194f6ee7743dca03eb195223b90ad124e0abcf8b6ca6fd0a93f5b06b6a0f040b0ec74a7808c417431d0abc141ca159c35a338971dbcfb716c9457a2bf751535f7f0c3adaed15cd0adc31696d55caebfd603cd7fa15daeb07eed15b9f867c7980d49d9c216760de9dcca87b3f9b7c3d5e6d1cde609ad521baed2abc0b70f9188749d70fc04e22649a24577784e524704f3446a5e8d9219fc412029152cae13ee4b81f62c2f396ac8ea99594515d5c4f0f786f1cdf9d4df6376354f416ca32dacc510514c2a22923be7ddf7b0d579cfc4d8b1a53440312f4e3bc62a1110b1775121cb50df773a58238510dd4ff1ad27956d272624d6223dd2c1c9b3bd0f038971b0ba84b08f1a2550743406af8812b28b770ebb9bdfd5fbbef8d5afffda77fe5358f670e8dc3ba342bd43e164464155dd2bfbebdf7ffebbfffa5752effe3a18a850a0622a4855e6e4317e0a4edaa639cd299f1ed359ff84331b1f09250f854e75676486b4b154be20cf78f9f35df963bffde59fdcf08dd3b5e154a4be0c47435fb295c35cce65ee9d7747b76198475df03405e848189413f80695ebfb2f5109877604de82a23d6ce73a6bb6abf718ced8184ed4173d8d6471d69a852216c4fdc95e5372f0ef4a5198fbd7e76e6c69afbb94bc0ef54e5a9335c12bc271c208fb1bd8ca1005e8ec51a13e203744af8871daece8b57f2cd385cd83edaab80e9916b897fa9d9ac5e7142376cf8c48cdcb4a77ed6fab607e605c6229164fe82415a5ace5a5c9135cc0d0533559e606cda733cf2596e8f964374d6f16c853dddc583236b6e359829ffe8b513e2ff7cc18a08e669e97f892f1067762f40cfa711673a64f2695791917f0e13bf2e579bdf6bb87fac2caaa2b8438eb64f9e54a2e401d2983b868e503ca5e8239809a7fb12e3fa471ac7cb72a5f60de7d160d84402b0c2c02c6a01a4290e72bf6b8c22fa3cb6a394ddde3cb792c6428a21962b7c62485e20b577c4762781e203782f14a65b41008d1a81bd63db67ef3e01983d7a5b06908b58f0e365ff6001b796498fda6b9e7929da8ce0e9970de7a3b2a33c4ad95def7b9ad20abc0eb29c68493c5e663ad0562c9845af588d86dbcd13218c4c0a552b4c2fd2f1ca3efc9e2568f483dccb91c2c1d04e8279f4528daa56656e3cf687393ac9a0289685cf39568b5ba31390b885867f312b5747e98651bd9f7f8af63eb63397f7f8f88a0605695a43afbda70c218b08695385d4dde3db5e55917a68d8d16e09282191e46252bac10fa8ad6b590ae1f42ffb00f6b4cbc3f291eacf537c42c4283652d1fba90c71fd96c6a09799204144865866368b595c3063871677beaaa8651325c219a224c071e3ca901daed028f547e8dffdf6d8c637c2058db85c87034bfe1bdd1be75d9c964949a25c3f05ceb6023d72dd2496a09a08ba7b1d2331a2ee5f5cc7324bf3b79e7e254102157b6639982ccb17f823f154574594f4c3330244c38ff78dda9a1c5f0cc2d36fb1fbc5da228532d67ce05b0b0c80e8609e33b09f48b6002c88189c1836c3285c949809076ea8690a106aa7e9716b1269cfbb6bfcf210b7547ad0a99237b6bf37228e586c3f80ad3f8eb7f91cc6529b5ea5d092c15f0ed43ecdd78ce3e0f5aad7172ee2d4a3b65cff321b28a1b63c97ea6fd2a52c6176059f448f10bd1c3e24b277190d993e36555b4a7c32a7770e80cac33d96d64055b941856cac552f25bf8ec695ef2fd05a93382a9fbece87ec3f4be21e0344235f79c33466a2c77f045b95bea6ca690240eb8bf0f89e9b426b719c29e599f283c0824c9c3f331b509906c5770ec4dd2a81c493647a8b0492066d8f5f8f3ebf9859aad890e5ec20708657a8299955afc5d9d87ece8072f4e0fc3c80822af533492ab56454c01ad0ea9071b6386fc8b3013944934434427eab886ede78d9a2aef1134d175822a7cb178b710e57b2a6110584db2ee4e0dc445594b5f2c153a5a820c8533c70fc4ffbca131bc08e30b21cce1102868f647092eca610529e6090a03b1c74e475c7db706b78634e1c9c7984b2ff55c0595226fa27f2be5342ae7bf13666c4e59a2a9c86954862d7b3bc60d6b89debaf0db8a4f38f1f9ab63f2dc69e88235eb22125dce3b73b9691278784b70a7a5a7adc56f89c8bf887676ef09cae8279d12a432cf1a0e9df6ba903e1dfd291746aeec5df864fbdaf006ad580003952ddd4220e08c26eab5516f596bc1e9c66bc628368e23ea3498e310d0b6cec4b04f386ab628363726e68c4a669a860ec69ad2bc23150447debdd3849e58067ca1cbe04318b4735ef31f0289df26b03956e335", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x10fe2055a032a91826e91e7548f965fa78014ddc062990c7c48acbb2cc0095f63b28e939d13c99847c1f67e499341c204d4d8d490363e09217c64da6f565f0f60318d1c8174a3ab43b525290a377844a47b5adb4eda848759022bff04235fe754b60264c397759099c732ad2d9c0a5eb550cccacaf0af872b97904954f8ffab60a", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x10fe2055a032a91826e91e7548f965fa78014ddc062990c7c48acbb2cc0095f63b28e939d13c99847c1f67e499341c204d4d8d490363e09217c64da6f565f0f60318d1c8174a3ab43b525290a377844a47b5adb4eda848759022bff04235fe754b60264c397759099c732ad2d9c0a5eb550cccacaf0af872b97904954f8ffab60a", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x913b40454eb582a66ab74c86f6137db94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xa42f90c8b47838c3a5332d85ee9aa5c34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb335b80dc19d29879310b8483205ff2e3dd48d4d4ec691d40d176926a9371c86ba497128450cdb7a40": "0xfe2055a032a91826e91e7548f965fa78014ddc062990c7c48acbb2cc0095f63b", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb35cae5b30ddee9d1d4ea63b50c3023d2eedb6796866581f3260d1f6fca2c08399d3889ff6cd904220": "0x28e939d13c99847c1f67e499341c204d4d8d490363e09217c64da6f565f0f603", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3b0bcb94a1a7d6a76c42c67a21ef4329adcf99c421b72d95e4b5a90e24beb0a9b1c922a33a3b45244": "0x60264c397759099c732ad2d9c0a5eb550cccacaf0af872b97904954f8ffab60a", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3fca1a7f44baada42667c31d014a1f5ed7bc867583d264062d3c7b15dcf14d487b976cb15292d204c": "0x18d1c8174a3ab43b525290a377844a47b5adb4eda848759022bff04235fe754b", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950074da5b83e4ecee96175726180fe2055a032a91826e91e7548f965fa78014ddc062990c7c48acbb2cc0095f63b": "0x10b8483205ff2e3dd48d4d4ec691d40d176926a9371c86ba497128450cdb7a40", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505392698015951df4617572618018d1c8174a3ab43b525290a377844a47b5adb4eda848759022bff04235fe754b": "0x667c31d014a1f5ed7bc867583d264062d3c7b15dcf14d487b976cb15292d204c", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505b19d91d16f774e6617572618028e939d13c99847c1f67e499341c204d4d8d490363e09217c64da6f565f0f603": "0x4ea63b50c3023d2eedb6796866581f3260d1f6fca2c08399d3889ff6cd904220", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195072e0da17726161ea617572618060264c397759099c732ad2d9c0a5eb550cccacaf0af872b97904954f8ffab60a": "0xc42c67a21ef4329adcf99c421b72d95e4b5a90e24beb0a9b1c922a33a3b45244", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x1010b8483205ff2e3dd48d4d4ec691d40d176926a9371c86ba497128450cdb7a404ea63b50c3023d2eedb6796866581f3260d1f6fca2c08399d3889ff6cd904220667c31d014a1f5ed7bc867583d264062d3c7b15dcf14d487b976cb15292d204cc42c67a21ef4329adcf99c421b72d95e4b5a90e24beb0a9b1c922a33a3b45244", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x1010b8483205ff2e3dd48d4d4ec691d40d176926a9371c86ba497128450cdb7a40fe2055a032a91826e91e7548f965fa78014ddc062990c7c48acbb2cc0095f63b4ea63b50c3023d2eedb6796866581f3260d1f6fca2c08399d3889ff6cd90422028e939d13c99847c1f67e499341c204d4d8d490363e09217c64da6f565f0f603667c31d014a1f5ed7bc867583d264062d3c7b15dcf14d487b976cb15292d204c18d1c8174a3ab43b525290a377844a47b5adb4eda848759022bff04235fe754bc42c67a21ef4329adcf99c421b72d95e4b5a90e24beb0a9b1c922a33a3b4524460264c397759099c732ad2d9c0a5eb550cccacaf0af872b97904954f8ffab60a", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x02000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/collectives-westend.json b/cumulus/parachains/chain-specs/collectives-westend.json deleted file mode 100644 index a40512997daa..000000000000 --- a/cumulus/parachains/chain-specs/collectives-westend.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "name": "Westend Collectives", - "id": "collectives_westend", - "chainType": "Live", - "bootNodes": [ - "/dns/westend-collectives-collator-node-0.parity-testnet.parity.io/tcp/30334/p2p/12D3KooWBMAuyzQu3yAf8YXyoyxsSzSsgoaqAepgnNyQcPaPjPXe", - "/dns/westend-collectives-collator-node-1.parity-testnet.parity.io/tcp/30334/p2p/12D3KooWAujYtHbCs4MiDD57JNTntTJnYnikfnaPa7JdnMyAUrHB", - "/dns/westend-collectives-collator-node-2.parity-testnet.parity.io/tcp/30334/p2p/12D3KooWP4pJg6pZUpxETd8Rs6GmS9FeRCeNtrBerqZhUyEPCiPp", - "/dns/westend-collectives-collator-node-3.parity-testnet.parity.io/tcp/30334/p2p/12D3KooWBbrBYhXxFXhdio3AiuaqMG26pn91SUnd12gJiVn2Wh8Q", - "/dns/westend-collectives-collator-0.polkadot.io/tcp/443/wss/p2p/12D3KooWBMAuyzQu3yAf8YXyoyxsSzSsgoaqAepgnNyQcPaPjPXe", - "/dns/westend-collectives-collator-1.polkadot.io/tcp/443/wss/p2p/12D3KooWAujYtHbCs4MiDD57JNTntTJnYnikfnaPa7JdnMyAUrHB", - "/dns/westend-collectives-collator-2.polkadot.io/tcp/443/wss/p2p/12D3KooWP4pJg6pZUpxETd8Rs6GmS9FeRCeNtrBerqZhUyEPCiPp", - "/dns/westend-collectives-collator-3.polkadot.io/tcp/443/wss/p2p/12D3KooWBbrBYhXxFXhdio3AiuaqMG26pn91SUnd12gJiVn2Wh8Q", - "/dns/boot.stake.plus/tcp/38333/p2p/12D3KooWQoVsFCfgu21iu6kdtQsU9T6dPn1wsyLn1U34yPerR6zQ", - "/dns/boot.stake.plus/tcp/38334/wss/p2p/12D3KooWQoVsFCfgu21iu6kdtQsU9T6dPn1wsyLn1U34yPerR6zQ", - "/dns/boot.metaspan.io/tcp/36072/p2p/12D3KooWEf2QXWq5pAbFJLfbnexA7KYtRRDSPkqTP64n1KtdsdV2", - "/dns/boot.metaspan.io/tcp/36076/wss/p2p/12D3KooWEf2QXWq5pAbFJLfbnexA7KYtRRDSPkqTP64n1KtdsdV2", - "/dns/boot-cr.gatotech.network/tcp/33320/p2p/12D3KooWMedtdBGiSn7HLZusHwafXkZAdmWD18ciGQBfS4X1fv9K", - "/dns/boot-cr.gatotech.network/tcp/35320/wss/p2p/12D3KooWMedtdBGiSn7HLZusHwafXkZAdmWD18ciGQBfS4X1fv9K", - "/dns/collectives-westend-bootnode.turboflakes.io/tcp/30600/p2p/12D3KooWAe9CFXp6je3TAPQJE135KRemTLSqEqQBZMFwJontrThZ", - "/dns/collectives-westend-bootnode.turboflakes.io/tcp/30700/wss/p2p/12D3KooWAe9CFXp6je3TAPQJE135KRemTLSqEqQBZMFwJontrThZ", - "/dns/boot-node.helikon.io/tcp/10260/p2p/12D3KooWMzfnt29VAmrJHQcJU6Vfn4RsMbqPqgyWHqt9VTTAbSrL", - "/dns/boot-node.helikon.io/tcp/10262/wss/p2p/12D3KooWMzfnt29VAmrJHQcJU6Vfn4RsMbqPqgyWHqt9VTTAbSrL", - "/dns/collectives-westend.bootnode.amforc.com/tcp/30340/p2p/12D3KooWERPzUhHau6o2XZRUi3tn7544rYiaHL418Nw5t8fYWP1F", - "/dns/collectives-westend.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWERPzUhHau6o2XZRUi3tn7544rYiaHL418Nw5t8fYWP1F", - "/dns/westend-collectives-boot-ng.dwellir.com/tcp/30340/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m", - "/dns/westend-collectives-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "tokenDecimals": 12, - "tokenSymbol": "WND" - }, - "relay_chain": "westend", - "para_id": 1001, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe9030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x20dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d905973883670b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62b447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe04367684c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da918b763ecdbfa0e9efe579ab017a80803b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f314a8c00e8b0528b8f220f6b1a0b6bb447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9784d118b107450ca9b35a386b83111338eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da986d8ea84569c9b399ccbfa6db93abd715cf3f25f6fd01ed667f9a977a21c7d55ccd118245b028f066ca98c34c442dc73": "0x000000000000000001000000000000000000a0acb90300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da991900d6fe6db15f208663354a53d481584c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da997e66c699225226d9a1f5d2af16a1dbfdc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d9059738836": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a6c3ff8820b374aba7da18a0926ac4088012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b092f79eb1087906d0daba3075dd7eef70b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f1513d64708f86b3fefadc2d3a952c84040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe043676": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x29912c636f6c6c65637469766573", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd005844d8023a5443ab5620d0ba4a075a9f151f05dd81c3978c0677fad5133d27a7814bf49e9d61daa9fabb0e7c6c761c13f4eed9b4fbbffb2c93b4b961bacff04e6f9db0e7fce82bd44b87e0b37d1765514949232458fb7b6f42e4de32c99452cd0bbb09970a5d74aad0a9a273858e153a5f74b8e880a143039d2d749cd06942e7091d2674b2e85c898511f3a233a593450c8b8e94ce173134b1333951724c104b236704392488bd11bb41ec2ae646ac8d181b3133b135626ac4ac626562646268c4c6c4cec889cad12127871c1c729ce4dc90d32487490e54ce921c253949724490d3430e929c233936e4d490c343ce0e3921c8f921162606264646ac2a36464c8c980d62596235884dc5bac460107b416c4a2c04311c70d0e09cc10983c305ce163853e02481b3040e0c705c8023050e11b0387092e0d48063038e12581b30366066606be890010b032303060646051b03530386066c0b2c0b18169817b02bb02f6034809900f6034c08d80960516050604f6040c04a00d30176032c0758131c305e66bcaa5e6fbccebcc8e0a0f12ae355e585c6cbcaab8ad7d52bcc2b06af285e53bca07849f1bac1cb8957921712171b2e33ae355c6ab8d27055b96ce0c2c295c695c54586ab8b8b8bab8aeb0dd7942b0cd710ae285c317041e192c2f5844b062e290084c0645869260da6151ee312e265c34b87570e374e806440344027e00d2e282c38624aeca860470a48065886978677860d0e2011e010ad273d4ef41c61e325968567c6860bbfc24ae3e68c24e2e60d100a59826d0a1533a5f8526083022f0ccfca13c37b80c1e1a1c12a9827b891ba89c14c62270cd814ec0bac0c8e414d152e12bc6aa8a102bdc0ac280a280d6e9a68219a88cf0ceb0b96172e275c4d7c3f7c3e7c623ea88fc9b7e46bf229f99c7c377c636a588033e635b573a526096fccc7c407859760281809568289e026780a8e17dc0266011fc1427863f0101e158c08d612638265e051b02c312a5e81eb3013a34609cf6116c60303220195f0131f153088591c332170c8dc488133c543c02e6018c82a66542c319c093bc126988d5133a5e608af8c1919ee04070997c00bd39384a7702898168e438d0b6a5ef08a83bbf850e037300a6a5a30bbc22f984dd5185183044f94efe04d6627e009014bcd58c05138053323680fde971692d691960dad12b46a60c50172692581598925a1a3050b0a568d6503ab069a86c6e1dae2e6c9cd911b263750373fdce07063829b206e4a7003e586043740dc8ce0e6861b1d6e94dcf0004a7113821b24373bdcf870e3e4a6879b26e014a01428033006374b6e72b84972137523021b343670d89c6135792df182c14b89d70b5e2e7825f19af242e2d582d7112f235e2c78ade0a58297945711af14bc50f022e235c44b88d7095e516223c08192637096805074045c19ee0c6e0c8706fd8123c3b1417de0acb8366265bcb27066e810db1307c3bf3817700ad804988497c085f020a818d40c3a066b0c1c2158606ed2b890b86a140d7ac6fc610e319f4818482a72896f071c1e3e1eb62536273626641152ca26033a45bda059be223e2c1e1b5f163565d48ca909e32a83ebd223c69706c74a0fb165d9b6e0f4106bc213e355b1117c028e0296060c05385fb014ac2fb120c02e5b148f8c0e16130dd6191d1bcc32f20699837432c9380f128759141717134b4d2dc6055c4279d0d9a2e3050e125e991d11b81a738aa7c60d14730c98e4260a0ec25b631686c3c05fe0556225e0243c32e418b20c9c2a3a586240c076c0618347873e01e8835422f6c43383e585d5a5a7065618302c2415a721c5708d000483f5065bc930180de9a59580506417161a2ec36a301ccc0417315b308fd8aa6021008ff89289c40d952dcc14c35470da904c7804740a4d226605ce1157028b9a67dc3cc140b0148f8b6ce275016d006bd8c8987de1798981b1951123410c0a9360013c14a0420a46094040253a80015e47041064c2082e2fd38d8eeb72f785d512a9880f0e1c0df181f4c2d151c712c812d2d1516b86a9f1233f8e84b4b0c443494908029a7e20292909410000dc862da294e4a30909c81112520b20780d2ba485a5a4a30e3021c540e42869486d5a4282a1033e1ef05e5ba41f4b42968e7c1c250da9483f968438a0692906213f7ed41e990688901f48403a90716c910e2005392a52a403482b2c09492a52044902a1846367481a529990823009b1000ba144b3484d3e802429f990e1082906a41820300120482eb8e06302009067b648901f482ffc78638b342d213121bdb094f4f2064b492df0c8abfd9154642989a9c908d2510794860cf171c4840444292986a2203f842815cda41b0bc3918f261f407c342135e046b6e18124251f494d494b4938928d0df2438812078e909a62f8816404c925cd2c1293100478728d2d8294d494c424e485a6187cbca41abb2424a9c907530c408e9a842815394a1a527d30c5507196919438e0a3692986168e9a7e20312501594a3a3ad2894d275c142b4d9ed47dea56aa56abfc2475b67935af7808738e0029a544400264021020a54400a53953f62d9a73b666d3288d79a240dde76477a734a7ce94a9531aa5514a27754aeb3951604add9d2953673a9d3a6d4ea693a9bb333375ea3ee59ccc3d594e9d67fbec5dbabbbbcca2edb3d54ca9fc80d256cb5b939dd6f8646e4a27339d9252cad475ccb93cddbbf68e9b93762d9fd27d6bb5b8065b2d564dd38e35e7c69a4e67bb579e9432a59469134daf716fb9b740e0d6ec11da9d29059a937bce964eddb935d9b9bbdba7b733738b9d76bbd3397d8630db9967f39ceeeddc92cc9272b76ce6edd9744a2a67cfdea694cea52da6eedc6ab950c7ee0e76ab6b58ade6c056d7757436e7d39936a5216dcd39a9942c4aa9a4947600034cf9416bca16a535d37dce59809d947e925267dab2a7f40fba5948484808047db27bcf5dcf73e79d4e1746009d393d97ce5232b3f4c9debbdc726eb5585d63d3ddf29ed2bd351b9ccc94e63e5b73720ef7d96a7d9e3bbbefb6cbbb2d4f4a5160ca949d4e14a6ef000104f7392953e78fbd1c3c9e730fbb4f9e01b45c870e771deb3ba72f77d4d979bbe93d999777636fa7b435e49aee1fbb33fd5ad6b45a2daed5cd93993de6cec1cc3448b6fb74973d5b3d73f8746ff756cb855ace519fb30329a5d36b9e3e5db6eceee63866f656abd56acd56b7d7d4744d4db773dc9cad5677f79c94ced9ad39bbc535d73d7db67c7e1f6d9a4f8ee338a639d8d963f779c23481190808885d0025903029a5bdec4074fa0c726766a7ee943af36cb5b85b5cabd5ea39674b3ac264e600b83b7b1c737ff001f5e9be5f0f33730ef7c9ec72669e944673ba747d7a7bbb7f9e3bacd50cd422b8b38bd0dd72e6783965a6cc0c007739cd7d99ba7308ad9f6db578d23c97b3e7f439198496b77c4e77a6ceb5fbfa3acf769fdc07d30573a61eb88f334f760ebccfb9e5eec5a84f67f61ccc2e864d29a573ba4fca94dda7b333bbb3cf9deeb3a7773d9bebd9edd3ddbdf329e974caeebeeb3d60f474f91e23484096928e96927cbcf0a3851684880f0489090908939023a1134a404a626a0a6161e0250189a9852326214d3e7e085152f2318321a969290626b1a785a6187a905e386a5a4a621a72f4a348120c3310603adf4e901f3e38a0a42424840e7638e080039dd9ac5b1292d4f4c34791251f4c4d474d4930c020849623f6f0c09690860cf1313341a8c78890199a38103aa184998e1248382a0129880f250e1cb9b094f442111f2f3c920c484a47467cc0d001cf92e08210a5231796925c704188928e009494928204ed140141674b68122284265b127c2031e52005396a3282b424424e13920b20c49684224d45928c208580b32518496a01896948108cc90792d28f2324177c3009692a72044429e9851f474d4a31f8680109c84fd7c4e4a3a90808259080d4e483096909c905a6221eb8b6042048458a20310d8141c88f2326241984fc40623af25104c80fa4231282089d50c2901f484586b6177e34f9e0c0d10b459296925aa0c9b084246f9684a32521494598906438ea400b494c48321c0d8084134e280108d29190a6211d60fa71d4640429870c4b48f2b5dd0126213020c1b0c9b0842443f8a668777ae2a493f758cee969ce27a7eeb1ad1eebb4393d6d4e4e4f4f9cd3d313e74fd4c9699ff8699d9e640f272727d9e349f670e21e4fecc43dd6c9e9c9493a3939790f2776ea1e4eece4e4247bac9353f7787262a727d9639f688f7d62f5d8a727ae87133f710f27767aea1ebbb3c713778f7dda7a3cf1f6d8eef1c44f4f4fb2c73e3d3d3d798f7de21e4ffcc43d8c641bbcbb0c43111f1b2fd4f9ae24db29d24da4352d0b907fa44dda3a95b96c6349465a8db22a7f5cabeaff821ce2de457e52e58f4a6c65c603b95655c7ae3d6171748aaafc1c073832d4c856d5ddeb2e90ff7e10e8a2953fe35655175b89adaa7f87d4453002b28813bb4afec827ea0d0ac83f76adca5fab3a768d7a205b51b69256d22a09955bda66a87f7ff6cbe9fd5bfd657f77ffc7a35f8afe24999f38e8ef3d44bdeafe05e84edd9ff3e9cf4dfff929c03d9fcfef217b15ac3ecaaabbcf7054f22aaf87a3e7fcfb1971f3e7bf1f0f173d0ac264dc9e7bb3fd8b6e7dc6202a6912942b87e450a714c4c50b7f7fe677e1eecf48abf3e79c33a8ce2160f5194483aa8beed44fb465189c150d51d2aafa7315d24a5a59c9325feda3aad5a495b4e2acb66e3d4ab91f6975306028933ff2bb8ef3f65381bf7f863d7bcec96de43c82959bc50d89ece6228c1303e41f4139bd06509fdee4d5bd7d4ab73e1d535056e7bf7ea4b97e0cbaf951c756b9dfbee342ba541fed258eb420973806e9b811471dad07c591765fc312c7af23f8899e4cd6892d71f78752fabbac1f6595ee0feb29abc7d370fca6adce6d6ed5a3eae678da9cfc8993b30b314ca8d407aafc09127fe24fbef80fb46ea24be1c0b81497e24ffc09957a98ec9bbcceefad1bac3d5bdc4222ebd3f36f8ab26e4ad910eb475ae76c7230acd009acd56a35141d31ff6990f95c8f1be07cdaedf4a001e76fdd5e7e46dbf62960b9f2c7638a9ecf91863af7e3e175fa66e4dde4db6fa20c5ea7875ed7473af1d3d613889d7af9fd4800ef47134498c17c3a48fe6c21d1d2e607cdcfeb66d00c9a54d42955e77e9d3dbe4e75ec67cc6ebea4ac1fc1bab57e7708943f4db3cee7c480db6fdfda9eb53ddd7a547fc9c2cfba719b0c334888ed23ec49cfb7e72ddce68f3729cceac664cc6f05ea2db45374eb33f2144e047fdc61f36309353f86f0fdf8ddef0eadfca13f82756e3fca3a5fdc2130dc1ddecfa72bc4da1dad9fcf8b02037884a5a2725c1890e39ea84139f48020393484018c023be111e483a00d5823ca3e719475e208d631a8527113c7aee35ea9dbb742aeacd097367f881ca2fb335f3e3b61147647a0ffb26935d7aacadfddb10b3476a53f761dd94995ff0039c451f2473ea53b257f46d928abe34e55f99d1772e5a8ee653210dc9f91d6ee475a478eaa72a7a83306ef8961278ee206c23a8fe6c7e35bbcb4393f1e5eb7ef38deae592a8ebc11c975ba542c15536a9856c154557e4741708455f9a3570aaa01fa8fb47ae0828151efe9c956c5b15514b4a95334d234ba82bdf23aee15f5c0adda2aa6caa15b2190d6ed6da654f9ddc8d57f77c77c17474f03f47717e94e8f1b20a745dd7ebca9f23be9adfc8cbcc5d1c89491cd80fe44b243256eaaf67bd8b33a458e6a81e413359f01f233711d39aa2aa7cf6d1395b8a9eab4eee7fe2e2e7153d5668a64d2adcf08eedcfda638729defbb636b9275fed230c0f9fe44eddf0a5d37d11768fbed89db7c7371a4c18924f7f2e5d3c9cd2936c9ba719b0c126c32baf51957aa4ab069b06e3e8753369be148ab2c3b1c956095fbd9356d3e8723ac4e0ea708864424f744bd1c58e510287f3af7f663c1f9336a717caa9c387295356df4ea7c7077f8cff9de432f7fe44f715482d5f9e00c9b0d70fe08aa006b9afc29ca5e0e05c91ff9f2b7853871a4b59b1e17caf80b6a9a7c07805ed3e4f38f4155fe7eb469d2c30272e721d76e5bee1a177d81e613f538ebfcc016eed2e6fb67b4fdce4d1c69a8febc557e3cbcf61335d8425b95cf855b378e1395605ef79b22cf0afdf3a7b804ab2ef6af54dd1c4f93e70af89558b592aadafdb2ab9ddd4e8f1b20cf0afcf2e5f3fbcf979fd15c679e41b72e2a70a59254d559572a49545dd7137301e69c73fe7c6a66312477bb02b8df029eaa3f51b3f8c49c000a74db42ec1ecae7b05f8673861ebaf4e4a702577fef50b6d78eba6eb94a29ee7736449cea5e606786cedbb419cadf2f05aefd549b3b97fb19c9276a0f99b6108f8b2970f57791368d7f86417aae44224e957f94df2c6ed3b891ac10e8d5ab9dcd3625cb97ef7353a15f3e516f0bf1a4d02f5f6ecfef2d34ce0f22df7fdb9eb6501b6d5e256a96ea7605b0b3f14f82a42e8bb469fefe9d4d1111a7eaefcf4644b8bac8816e5b3eedf7df16f2fe8c5c3e7f0ad8caf5895903ddb6504b8faaee6f88640a0995fe9156295fca97522281aa524a29e5af8f8401cc912b47a2be85fafb692d347aed7e9f16e2da3670a9fd5e0fc9a2aea308b5eb38abfddb1f34a45b571870a56c00a2ae54ed4a0075a56a98aa1f51fff6fbde42dcd7fd8e0bb76e21d76e8540aedc4b8f3fa38d014fdc77fcf1d89e13c7edb7effae301d6edf7f3a6f9ef67349fa8b7df4f76fb51717caaf4b970a4dc13492e1cbd72bf9f11fd8e0bc70454eebbfd58e268a4b29e0bc795aadc6fe1b84d3332e4851e17a8dc8fdbb4f10195fb715380dcc2adac90884c9326cd55dd9e0b470254ff8e3d2ef46781ab1c0d8970751347ae9c4884d3a44993a68e4f756e4d92f9475865ca324db73941b4ba758901ae540d5275a475a56aa052f7bd1ee2a27d590bad54edaa6e1d67757f7d96a85b113ae4ca21576f21feddea2dd4bfdf71c71e7fd7def20d0f28244ddb2adfbf5f7e462deedef08072d2b4adfc1e6ed33ae4da1fff7e52f4fd8c68d37a6b875cf773c07214ddd6feede71ff7bbeddf97fd41568afbd40c818e9f43570d40a91a551dbdf6537e4a570e6dff8c60e51fc1eacc4064b79452ca5ac85f7e27e74b9f53f4906b8b63bf1c023b9bf519bff66f0bb5107fd8ad10b8ef4debe7cf68c56dda488db669fd447d02c8df2f6b211972055ba81fd6422ec3adfbf913355173c8b302adfcb4b2c8b3827c7ef92c367175f1a53872e527eaf56931c8d7cdf124999fe8b6aecf08d6fe6e5b68e497efbfd3e306c83f7ab5b769fe2580fc2cf00791e236cdc591d67d0eddaacae0b2618fc3ae525586edeba4b7bb837f944f5b68e42a7fbf932109a0fcfdfd54d8a68d5ef7a5489bb64fd49df43894f59361f3a8aa0c5ecdee60e25a257280cadfdf1f0b5eab557efe7880b5caefb5d0d6fefd7870adf213f5863e2d0601ebe67892dc61baed6e7f40fefd65751b00907f7f59dd0281fcfbcbeaf8b785c67d16b769fbfb4fcc38dd4ad5a2d4e5bad501f2ef2fab070c76228e255a3d597ac6e899eaa1d2f3440f133d2d98d9d053ebb18107cceccbec881918b3256649cca6ccc8cc5a3073c14c899d33b325b32333243334664cccc4cc68301b6246c4ccc90c87591bb31c78d0983199dd306b3283e23963a66456038f193c61666978c8e0896316c5836696c5ccca0c8e19169e333c543c69f058cdaaccaa6666cc42c09366569bedc0a3068f183c70f094e1196307cd2cc94e1c3c5f786aaf253b6eec70d9a1daf1b2d365478b9da91d2e7656b043829d1f74c0e88ca123860e954e183a5e74a4d009610755fbbbcd63855bb485aeba5df5d0367f55cd0a4a5e45d59e5477a8ca3f7251aa8b3d6e80524a1d3dca959534aaf273e1ca9fd19f6ca14d0553476944ed9f21b83b66b2e7c69c2fb5895237879364af69d26d95ca3ad6dd89287f2a6c5454fe294a55d6d134666f5b88bebf0fad855acf2f420bc9e737a185baf73c5184a6b542ea35ad5faca102f277d7deb69009efd300505f440dc0127d68dccf90e3880ca9db73bf1f0fb0528e2302562a8e4366c805e17efba8082dc4893c7f3f1536714511a40caafc320439c9553df9f0c5136d584146131e94180a62aa07294796b8720515212b422019830c2ae068e204234f3c2089c1161fa25460821a9890021d8e20c1151938944c11809136ae585245072492c8e282128cd0c240b1840b291c68f00609337481a2c5064feca0461041335029e34b1c265802c5ca04232839628583551146f46044003c29cf051e1015a0628225d41023268e24403833bc66d82c56664055a140c992232200a165872b6cf0218a1b006064ea8a2c4cc8e088114f3409c188074cdcd0851753392cf99161026d10d143933367a4e00b6d860754e17215458c183e34016186a71bd0105104972353cabcf1c1185692cce0055610c102280f6248c820e1860e6f90c1e233c39a71a40b1914c4808c1ab420c7134d6c50c20609d83862073188323e0c31954409c26011babc00f70a3154d49bba5798d145955566a1d11bc1ea5c5db63dd43f8a50f769fc19c98f0901cee79fb5d0e853c7292af9541ac70e3cad2fc89401bdae54133167c0565da92654dba48b26394b9da2a0091664409bba524da0d8c42648e000ab6a32c41a4d7ee8d280605da9264b3c28c01c2b2f09f87de9c264ca09d0ab2bc5848aee056057578a491346303162e510287ff899b968f4ea9c524c4e50e77bdf50341fd6435e34ff7747abfa301a2cca5a00baea4a31d1a11507f8428305a8f3a55302a460cc00845dd10203fc9ca802bf23bc1a18ab2b05f5436b0910a7ae14940d95bf5506f8d5955ac246e507e59017314b2d29a37a759755a2266a198221ac7ff8633a805c5da92561d4aeaed41231d587a7133fb1645d8122451b5d08d1c40830a27823ac229644d1a0066a8819a38319f60c1251643943860b17553830f28113b8c00625980a02aa4bcf0c4cc6c491e4cc1b4bca283333f224ca1448a8a2cec042043c46464852658c2ba60c21032d76664840185a5ca191aa0295864e1216f080450d2eba605181cc4806b264d1061333a4be3822270425620c31c6042b980195d80c4e362023831a7001a3a50b9c7e6ac205424cf1e26a8d358c2882d5116436d2adcfee0eaffba37fad56b3a188283604c83f9a50f7570ed1227e2a87b856abd5a08af8693de445fb4b4139546408328668a2862790a815bd6affd7fd7a7db8999be8564a91549ec8a8baef73e3a8532a9be9c6d1cddb7029abd579ee79b2d9f36579dbeabcafc66b6a6473cdaef7ade76db8355675bfabb1b1f1361c656dc3b1a9eafe8dcb5d2ed9ecda52f7a95469291da56b1d655555650b159ec2511c856b57bb45baacda2ae2b85295bba5749f9b6f9b6cdeb8a5749f73e39ce36433e773db388e5256cb5b2dd9dce2288bd56a759df7f9f7c9e6afd579def7d5d4d8800e82b219fc3caef1d8c6c66310f4f8c6f5f2d74b36bf5cdebebc856d38821b8b799b2373994c36cb6e3c0e5d1e87afaffbdd0b06f3381c83ea3ecea702d76d5a87e37118fb54e06e733c274736e7d01aba40dc365d36e3d01a2032ddfa8c5e54edef2498a6b5acaa2da916a87fbf07d0ed975be490ff166d5125550f715cfaa71f4cd5182b33f28a43537b7f47da43455399bc8eb487da5dc45dd30438fa545e9fa6f18efc955be48f147bdc001daa8e0e55d5cf51c9a12dea91b3aadd95bfb3b14a41d61a2640de2287ba48d66d9a17553787f320dee06b67d36fd401073d339e1d1d594e0c07f672dd8036359fd7b55894dba6cbe605dadf8f08a7a945c8276a5e5efe513624c5dd1ffefd5ad9899fbabb8b94521cf7e7fb8ffb1f0bfb41a694522e9be97685dc65d31685fe71bfeee3600176dd15b80659717984fda76616787b1647ea4fdb9d86ebce713f15bd6efff2168ebcfdd2794526af4db28500fd86071418f9fd748ef3b769eef37d36cddddfbf6bf6ea6210b08ae3e873db8f9472949b348c4efe8a23aceebb5600f6ef50612b114e53a97fc7210e16bd0b3482db8fd42b7dff8e869412f5e6321c95605bfc571cc1bae2c8cffda43f72cff173df9c7703b07ff4aa7caf85785f3e0d5788fbb139c4c102f4ca5f83f01335e7fccb62ba9fb435ba305c9a0775fab782d74dfc059a1fae531aadbae8687899793233f39c1b23516273c2861326bb6ddbe673dbb66dfba9c5b662d050b9051332bcba890ed534f9e014f5c0add2b17bf4993fa3ed25d7e23817b7906e5bd762cd9f3deaf6f3896437bdf9ed9bc873ce27164b333ac92f59e8e7ef3864d19b269be8a228fd7ed441c24f589d7aabc3fd282322c019a007ca88e4d005e48ffc4fe689a36c3b9628b505f42f85ae9ca864c5962a7f734783876f9300046063298c0d4a6d6ce49c73e3388ee366dd449a4d191a6d526143874d6e3e43af1d7bfeb1e02f7f0ba737f50a526ceada4f44b6336351c51866666c86a452b831a448994e4559ad8d4e3ae59c739b2de7dc441d330a1d3eeec34da7656ed6a3acaa582dfdea14bdf685616565c567ca584937984ddd44234d934f6b4b3d7097afd86ddb422559ddb6b96d1ced8a37cb642ea5ab9b2b8739bfa04bdbdeab1b0d3f9b6f4628b74d6ece8ddbbac16cefe1b6f1f6cccc2c829341b05bcf3f238ec5a2bfcddf9ea322f71dc782ff0cb9f7cf8893dc26ee96857f46fd735b17c7ad52fd69228c3eeeaee4b340ed537b721c37c57d9d9bce078d0ea4600775d4d1411dc1caf500ad97af430ef9d81df29ef5bb42fe43e49027726dfb8cbe1ab6ea9043bb3ab6f7a3ca3d7deee3f1b5fb8e6e5b27fa13c96ef3c6adaaf259e1b860aa7c1a8e6ec489f333eae77e9b9c8f4ff5a6b9b8ace66e406b66e41518d20c0d50f2ea4a5e815e9da2438135702887a21e7875559dd674a0544ba98c0abd96267ff4a9fee10a81ffb42e2f2a5f268774c81ff95447955bbfeba84e80ea3b05d236186d994ef102373700f9471d55caca89e37a41a334aaf90347154656799161fafdf90660d55215ba3a4579b540aea82b79b54eabaaaa73544cba6034546aa151b61fbd26e595ac925b56caa1aa64f3655256657594d54d56fd89541d1d6aabbb40a39107acfc19e5161a80a84e4394ea50c0918628dbb4298e343ca9fed2c35156d5f91d8e4a0e55fda7e89ccce24f467f0205553d8a133fb99c49d01ddbcf67ed0e96f705122541457405301f097d255fd46a39b5c26d0530a95357ff8ec512e756a777db26faa4e1ee09737a756e73c963277e9aee3574dbddb3bb7b4eafe3bcede322e8f33781afd56ab55a1115b9cf683a1ab65aab363c90fb2de45ad3b8f7df42dfb6d9ddb37f6e38d23a371cbdcef9d39bb63d8744e4f644adb4893e4546d2b40903ae715ce3b6722bb6aac1ba8b23adfacf64cbcc23acfab685a357ef24efeef6cd1db737c36e2eb7f49a5da0fe11567b6b7179db96fb11acce7a5e181b2bb44b1b6daa4d1dc159a7485b20f9366468eb14e6b0994615312805c15146e5104755c603b744a18202f21b20ff7e11d8a2953f23ad54b5dfbb8b38515a2521ad681da595a49254dc14124b37086c24d8a807aac066dd3759752703ba83f39b5b9fe218dc6ca6e598ba2fad786c55822ea9a04cdf685f716c0548a9d75e9359018ed4c6fbfa08cc46069bd97c2a70056f5c2fd7eb067cbd5eaf974e0dcc88915636c091d66eee9a6d1aaf08aeccc0f0b71b65c336badd70d634269c6be7dcf2371c5d68806b851727445289a8dd97906168c5891329209d9501f2afd7f1b76fb4e595714695d5b8e2b0a1f2aa42854ea12099ee96920a753137665cd6b45695358de3388ed20e8bce6bb55aadaef32648c49c40e14d89721205889c0d8c2b740af57e90f9151d2792cacc15b8c3d595729266cacff0784d36eba2e0a0c49d4c6d607854f4dc5085ca9a168bc56239393818413f23ba133c0b0b0f8a9055570a072c5e68440f8c076e417188c2a10a9d2f39b6df1728072e39089183131cac9a82e1e3048cac2be584caeb4a39b9f2b02b3cb8014d57570a8728603630dc890f3c0e55d8da710bbaae156290a83216771728f4056a4d05e52095039533a8d0ba52374cf1ddb13b56d6b4300c43518cfde081e7e3e3e3e38107340f84cf88eb5a2146892a6b1a081f11af207c4644384d652d503f089f0ab46f9f43ae1b12e134959fb640fd3bae31e04add0086b53be8ee5879e3354dd6b4159b04187816cfe29e454b992e5ddcc1c8e259ac68f12ccc5eb45861f6a2c50a73192b5eb460b1a2058b15cfa2c5b36c995826162ccc58269689058b4f2146e1593c8b7b162d65bc787107238b67b1a2c5b3307bd16285d98b162bcc65ac78d182c58a162c563c8b16cfb265629958b03063995826162c4e8567b9c18b96325acaf8cc32bdf02c65ca94914efcd49ec38630c24801ac3210a7e8767793bace488bae5b2eddfa8cae5a18709c532dd90a70e33aca6a75de576303deb85e309c58ce4ca6e3ed773b3cde4e95fce9ef6645301555ed2bab99d7e3f1169ee2a91e0e64b0cfc88a83fdae838f7d88c354e15681395c87e52af2a7a7c852cc45aaf6777533a505cfccf3c0c5fc15c151e44f3f47a99a54f20a19959caf089ec2537a38f8e0a683f7764e4daa0fbe2b10586eb0acf6596bec50d75867bad6b5497585e8311430874f0863ea38a9bac6b29a54e0543f03f1e4c977e5e381f779d5f2e41e388aa3aa52e87ac58fc75042f024959121563920171cfb8ae05a0800d0a28e93aaab12a64a1700d8ef446069e0025b80f4a052faf95e00f226d0b4a6f5ef54edef02e06d0b496702e8d0910022290634ad5f844f014debdf2ab5bf1bc19343735a2d4faafde5a149c53ffd63d7dd217f7f8ec1f2679c545d6b902cd00c8278be2268342912e134d5d504e4ef46f0180a18e44daa5ed2b5655981a9fd7d6487e6d4d83754593353b1ac6a7f57f2878b39257b4e7d24781c062ce14bf35d7d6776886535d6b08a2695fce18265c5b23292565d091e97010ac0db9106d5f51f9ff65d81e05704953f53df951c9a7413a73882558aa3acee7c29789d545b40fe7152e97c4578530230a14d38814ff084bc9d616a3fefd0a4da9ffef96587be2bf9d3df3ca37e575620fff85dd5fe8e67e6aa49cfb1040c186ac4972f32287cd7777cd7414f8b8e9432e92e3dc7777d9b316e8c0d47ba4b0e463d4f0b3fc1b902721d3dcfa3e4cf3e51cf97a785a32c178b725568d7baf13acfb94daaee04af3e2c9ee7320b9b2add6557f3b9bbfbac52e33519c751a92bb300f9b74f5ab9a785fba62b7d7a950b9d76bb3b5abeeb2ed6cb77dd65bfb78573eac929b9dfa6f102adb86dd25de67c89cdd1a5bbdcaa7ee678e01520bff45d9f724bdd9758a4cbbc294fcbb8dfadeffa16b4a3d33c3bdccddc9d474a7f39f3914137ceeadf7593d5490f043d97ebb56270532f983fa9fb7d0587ab52f73be6755f8e4d0d087a71e3c95c372f8f757060b170cee935d98e275f6e95e128adeabec402641e4955f77bd6e331071dc8f7e4f37695e1e873be8ff2e777329cd5eb7edbcbb0eb36c3916bc781e7614fd781e7e1c82b1ca03bf4c4cf6845cfc36f0599264d0e6fd3a4d9e694524a39e79452ce2dcce1815e80fcd3ddc519763e5e107f01f27b5d7cf0010820d0dc9d26bfa3f1ece8c8726238b097eb06b4a9f966cdc3820880200b0c0cc9df07e59014bf59782ccd35cc6d6e73cab748361fa172687611953ffd1ef26c51177959b6b7483e81dd4e5d38cefeaf762b999777ab1983d47d9cba329cb5c3b13b975740fefe8cf6e5f3c8c383797878ad56abd5fdadce2a79ac54dd91ebd5cb67df36357881e67c76aaf2999919062c738bce9d7fe57e7b0f4d994cfef47733a4c99f7e991c32a17ffafbbf1476aa14839ad6cf5a63b96b76aadcf721af7f7a360538ca6acb2111faa7bf694c689d7bf3e82fbdae946cd9060a4d9081f2d2250837b80c600a299498220656f0e8dce8d51d7554135ac89f0b5daa56abf95034ceeae653b75f39c4230495346590d00283a9221d75dbaa70b245dda6c805dccaebb2aed4122e606fa98243617984d15d55fef250ad55e5370fc92b7e8387baef9775e1f2cfc843cb3f2d19963e325546b73ee36b4a1590b93ab47d2c709508a709bb96ee6da11cd33ffd5eabe6033df093a2ac7275e3eeeefaeefa2efd399fe2785bd8edeee0a9bb63a74af92098e3b17607ad72777055d29773776c3bfcf7ca435e20fe2d9c5559e5fb0ad1974fd75ba1f972687b49af24fd8c5c945b9ad6cfc1014a33acaf6aa1312dd4fa7e69d5422eb6585f39ea2def991ddac02a3b9607b6108f3f5759a57c2a87b69c33c4a815c99f379f919caadbf7790d823657bca4bc9e70ed3a722f205e515e4480b0d76724c734addd5f86239b01e5134919ce7729ad9ad6b2aa69fdaecf486e59a0fede021ce555edefb6b4505745de6087a8bcda1d5bbbbb327653b57fc76e8b6ab33ffd72cbee586923d3503924aff6e78c77c4eb5a2cca7d35527c4d71e227771711ddfa8cdd14db80c5a8fddc16cac475e414beca22b765816a00abfa87bc7ff8b700476e4b6dabca6de16d59d34db1986ebb8dfce7affb86de4292fb8e86740559e75323ae27ad5aec8f523e4be96ef305e4f75d2abdfd561c3f70354a2c207fa8e45075bf3fa3fd76f7ada37c1c2c7865f37acdca2dadda3dca64b316029f433a058e146ca1910e6d5c832d24c5fe513e6d5a8760d39a3d1972f590b5407481f8e553af87c096adda519cfbd11d070b766ed16bda6ebf237fe49edb9e7b0ec26d2c5289e5084b17fd9dd1fcfdfed17b7f58d3fa3d6c1009d8fd596c096a34414192e7f6ddbff3b96fff514956b9a74b9ad67ecac9c095455f92d54d0ce2ef4bb21a44bed7348e7b49c7bdfce6ede78f4db3f615c871a20cb36e62902952b19554e138407efe52b0a98ba6ee839d444c95e6953536deb4fea1dba6b10805e47e8602fa6744e766b3cf2df3331a9079653b3a33733333bfac6a8f7294d2ed6a7681f63f2d6ca2c821d68f5c1529517ef4a8baa3cb9fbd85359515b6ace44f15192239825fc917b19e0b39294f68075559610b4d9fd0baaabcd10df49a6cce2d046be71e5b013214f0a6ee70535c95da4f39a9dacf45f5102745fef4d327fd4cde41852d34fdd3ad2b0e0e70b489aafd63ebaaf6db00d142a352540bf5d042dbf7db3cf18d4ed5515e49a92daba4b7855fe5a0b66ddba270f19a315b8d55eddf6aaa1e5043257fba73d2b4eea26a17d54175fbed3ef37315203f91e4d07f432569556734e4a22d7c55a2f63a28f9d33fa354f6b69690a8646a982b23350b428866466620000009331640302820120cc7237a202af20314800f70944e545026164623a118c86118c4400cc430c6108008300419641c6264360180381b45eca1e095fc8927e9af412af5625bc53816059fcb725559bcc2904e5bfaa2521c68ba2ae94bcfe067ee4c820f64d6d1e31607446acd0360794df23572b5192353a9bdf30af7540f389a1034250cf8a4f37e499709eb22cb633536f009c042ff6c043cb0128201b571d654b8e3b53a6da8a97cbcd4fe16d8fa21277cc899819a8220285a2f6bde2b48cb3bcd3d07c9a2e9b56ec09bb28cec8af1144acc58d42c7511c68e8840e9fa1f8672baeab351cee973fa0daf2ac9f0a22eb95010ea73e7f0f776e9d09174d6a25af5c6aa9bfeaca2b229f84e07952ebbd9fe5fc86774144aed8f9601d3232c267bc27241eb81278fd9a6dec4c4881f0f65b19c17c1b71d67279970f44341f8c44c75356a308b64da7b7107369d8254a5307f038f4644cc8cccc78240bfa1ca9fa2a3995b1eb8db5796567aa1db1b1b177ddce219e9b1db3af69f5d39a6f29dc5f6bb0d8f915a149a1f48099719e5518fea284fd4dd46da67ff14cca4527b9b8de8eb56b95fb549143de744d3a3a9dced50cc0e6a5c12b250a60202e0bb0059a5574f94f2c09eadf4fc84f587209a04798b73acb72bc0d18b4bf72609883b7df704933e17b92659ec2a27744d610c3f32bf7803c2b57e4419d8110e4b54b62c5ae94d2183ae48780e8a7058b19fad4d3f3f1bb25eddb585a216d63c4a8986bd2d45b3b7248a95a9e98f06e3e1bccbe3eb21d32489c1e6369fabeb6b4a5c8a1349cf075224af9c30965a7693c33f60ec98a7c19302715205782fdd39fd10131f907198bb2d5ea04822a77284f0a44d9126531a7f8303cfe53700e7f32fc18bcbc4e9459436a4014b4ca9b28fbf5ea3a15775ffe6036a99e5f01725653daf90fad96838bd5278739b7c501230868f995edc7d02c28a2db5c3846460c8e34f444c9df8ad25d5410152968805347e1bd35681758d86400e499d76e639b3def4bd214207c16ca9cb5f06e933bf0c66d10e261c6ebc4d9ce10dba04f069e39ce03c1f89c5eb159d841b8c896c91cb59d801b65f7e357a40f59aa823c9168732d0f11d22e52ac712873a88d512189c786227d82623a4882ca18aeb26fbc8861fb4a566c9cb05c8801188092e0fe102578817d2135988c39f185e8905d25428739851dea35e3647830d7d4300cb735692a19536c123f317bde7d9a9342b1db66067329961b9baa018b24683f0679faeaeaad7e49a1c4b574dd52b9f331a8a6aa11d0bcfc0c742779fa0e3856680e83d414fb9cf1064174ccb440e1fdb007f0e0ed0c22d8dcc99c5ada785c44db35dc4f728d4728e636f2dd7d1673471a3df16f0bd22cab55b19d86f0b15188a76dbd282a2c45b8f463b441361429d21a0acb44339e5f0270ace1c48a1d266b36303b853a015f4bc4b48f5a911a4b932c26b427220c25834fe5c7418f64b525f7a3cd126373c2bf7612ced6724563a3814851cc8b23a88067b19ec6f0b15088a766df982a6c45a8b861d441361a2ae21a0acb4433972f8270a8e1c4a516967b36203b829f035b4bc4aa0f2a911d2ba32c26b822a2d91a148ab5af4ab43b2f2924b43d4fea27ab2af230f0b516c546af8a82695a5762470ab2327eba4aa23934e28e6753119bdd163c48798009be4ef9c1b02a958fa0568df8a5ded06b3ef43b01c958e9e3b2d9fd1839d71eea3edc967318a70495102e4e2ca0728cc73f968ff71ccb05bb60dc3e9f4306a1bbc746218d0a89d8010b369ad34a01108de190dadfa2b246a74bdac52257579fa3ab6226c24c7f29e1be69926bacd4ef4ac41e9650f5e7db45077d0b1062f4d64e0701407e77316ae8204841c144232327a5283d5f8c530b66bb5c10cbedac3b656090db0cf2a2b9491165347a60f1921cbc7b9a362560a7f7ea989835e202ed4c49c55838d38d41ebeaa7d1fb08188f11783a8af1a2d757028c20b89804c7b5a908d815534ed131ce9a2d2583a9af1b2531ee54360da9ab04b9f0467047986c57d4e00f8920a68ac4483a4b48c09c9b89410004fd9537061f007da58568e4fae0ae9a905a74e1a14ac284bbc71297f165ae1ee4bc170d96381bb4df59922fbe735450b6d867dfed1cfd9c7c63cded7f6f548aab414cbe5ccfc5753b36499f2990b8f1a164dc30f9ac8a315da00bdaf3f368ee762aa520cc7ee549f8d05fbfbdc1fa5ae1ecbe6c1e36e69bd8d1ecbf283e21f55521f6fc3ef11fefa4b2dbbe0c3c805bbc5070272be5672f971c6e08754884aff3f8c7c233080add570b2d0040969f6d2759b3b52802925d5da40750ae04ee6868eb477626fa9e2e8e38ae58eb938d2a6c12a61a4b872f949d299f141710f1a62a2cb1d5ecacb20b0aaf6f91c002b4de1b54b612e9359d1025af0c9810ce56da523fbcedb9eb630a55d99b8140c89731929c6fd753a597dbb16665504d755eca86c10114bd0c9281d2b2d57b9380a54251c311659b3c67d2416313857cf5f44de444518435b3c868206a82c977146984a589541269d1ad9743098fa89fbf9474e65699161bf046b6549d2b3a81c4b5f7351341b11d85a8107767c7ba3c9a06745c5b2d1c127faad728c85b818e3028bc82c8a76eefe5c60788703d1eb89123789ed993242e179cd6637ed35c94f47dfc1532ee25e0e5e5fe8e9bafb7242662fe96a8d8c1a6f1d84d14f2d252261df16e8dec0d9f53b73cb05a29da9e9aa7a647cde4f4fd8de515d1fb902a6a4dff0cc8c749259ee159e18402a60c62a01e8e6a11ab7917b861be113f0c222f1ec1e9317a4af5aa73db23cfb9c13e0d1739bfc310842806e78d5a1a5c1dc05017a33f18633fb359a285d0c5cc8690ebb43740d6bd30398198053a8660515309afe0deeeb366f8b503b2095d171a01ce9e066049b0003d188a11837ed1a60995cd8ba78a63172b28938fd081bb27b002647c2c5e9250802923d06e5c6a832728dd32002a754418cd43f173d13e326748244b9c0e1faeb2634fd44f010bb37d18d24fd5af921e9e463b8aa8e64627fd177430a43cad526942f1854b95af0b8da812b9b3b2eaa91e5363980c0daeb24149fb015f79a6a7c448de466a45ecbaad48a420a745053b124ca5722e70c778e781c1b540e3b3e796fdffd66de3fe8d753e07a1c7feb52d1869e8c1bab1379cdaeae7f180dc2140d8cc78cf0b989534953edc20ed92801aea59a0f07b80a781e27ce79512e525354d539e9d3079a113dc1e05ad35c0807528d1b2a17a65d15d57b2141b257efe4e68256a73e19b01e01453aaaafc8741a183f329cb87302907a9115780ef0644331548b1046a44057d991d6786c7e3a5313c22bc3e47ba06784133f85819bcf6b3630cd54e82ca8105c869b85db87e7a8f71325ce83d465deda927f78491fc6b1ffec50774f0a252817de5ec20b0d224293511ec751ff6347a01b6619bcde9cf7072657e9c0a38f4139adf428ae9e6bad76e0d583307a2f09aa4b5a087baeb2b699240bf1d3c23858a289c833c26ebc9f38d5731bb61fb75f5a14db69b6f99f5aa6749ae2006575743eb8744fbbf0badf62a5f856593427d1069ea4cce7dd1da167f6c89be17b62b935f0e039dc3eb60854d55042857867560968430fbb36f9932ded93f55bd6fd00e1f8573d8af6206469e2ceb4fdc5d47ca3bc7148daf847249aca6281dd7836fd01ab902e92c48c2206fc888e38fea2f8a95086ad6251eb478e5ad058049f94df0651752dd004452055a29cd3ae3cb2f93216b7d08d212f48ce09911397ec07a782e8c8b58ced4c152422b548c1e49c24300b21b0ccf8854e7f703991496f2785af6ac06d0185d198be88cf0cfd9d732da93d0cb6ea7c06a802dd9d889fb80c7466f9c5d8c9a547a149b9d6a2cdd209237c6052be0ca715b8170d8a28137282ac72f2148b7219de1fee3e28ac7d5ad8e0516e3f72a659a313e963d3efe59d409908426b8b0cf40fda5b37f369dadc7b8f4ff59bce7672f6bcb86b85b5174245a8ec60ca2a74ead222f52914906d90d870860c56ef368841c5ae0cab5f273c8767486b83603c251d92a03818ab08c6edfb9e5ccab1c22ccafbe953ae988b6e01d7a884ac92f6ecc426eab2b49f3280848fe9ae1b7b4e251c8379e908ec38ca5c1fdaefa00d1eeea6396c5fc51aa042d9ceb1268b77264cba71dab64eb47b19661128b81396f502acff0107781bbe263cc4015e83a7c395c14d5cbe680f63ea480c2c2e95cce656fa519cbd5711196f8be522385843f173a8d18224bb4b8c2de45775f156ab0a88fb73730034361bed4103fde435dd46c26b4282495fcc7c1a7c06e52a1c25593d79d6980c07ddfb981d8795edde21f958e98d450e2174b4c3801bd924d7852cbb586307076a29ee268645526170709c52c54d0ea7094733c8d1078961afdb8deb8f8bacd10ef7f49de2feb74c7e8dd6073936c75fac95a2c5da108059e8a0c5b20ad4e827149e74b0938231b270ce9899971077c075940c6ae5788400c17d56333aa20b5eeef6f9c0823e40b10056b19e0ff0f45784450ebd25bc1361f6e0fa76d39521cc18e3a4dd60e6d1b24ea59c13b5845b4d52dc0aa9be62f2abffc1d05d150193a98559c6d2904e2377a22b9ce6db42da50682640e2e213050f1a371d0f2dd95d5c5bb4aa610d811a898b6001696d0914b425d32d49e8a4d9ec62feb6d89a05adf3c643bf1b94740253f45dd57909a5db71b5390e75d5ee9f6570dbe21fbcd147977701871f0a080f611784a6db6764f66a2b00332ea173362a70289cfceebfa4be6dbd6def6e4eb919831227997bd8ba44f370acdc5e53f951dfd30ec46f7f830983e6537d7cd6b0ecd77941c30c103a57995859b97d6b310b082ecee9e858038078230b4800b83635ce98205df8ea5286d037f6f896b2c7699e69c81a104f07d31189c4f5b8d6305d1d8d4ba72b9959115709ea7f80a8acbde05cfe052984ebf90ea17c507920b146185ca82c5abab68a4a880092a332a79017b1b5450b453df9cc4550620f91e6872994fd781cd84d2425107b7f6b234fad59419e9c008192a42c73ab145a271a1c86435c1511805eedb9b4f34f12612c2a6ae18b59e7ea26dc076c1e3b504ea8b568ba4ade91cf7aa9c147c458bb06432c507d8e41d3ee25ecff9b07b9554caea4624fb87a8543470d72ac2c079c0235007a6ad0a22725aadbb8406bff6ffdc46246ce62d51455c5455084f10c5a4e442b2687a2ba673b03bdf1c41a823c9d210f4bf09e16bc7582ce6524a18006f4d9c3dc355c9904d7a77c2716c6a7df9d1fe15db3cf84275cda6923b50842332ad8213a6d718a65b877d99744b3df423c1f630092d32fb0be69a21eabcd5e483bb449ad189cf79d04dc8133c14d5d219575ac5aa14e1d5ab773871e16358782aa63d9cf024195c96c096d66f710880670e016e19c049d16f4f29053361dbd5f26ca281e360742f572685ee3cac9f8e14f76c7f2fb16b6b90bbeb1bc6a48c88e675f15bec917bc5092a1b4d01eea0b63328017051c511681152258e737e20424b53dda9b0012e28e2edb7767fa9de29bb74acec2253d22d19eb8cbb1eb536c1512e04ff1f05948baab44adfd0fc7ee72b8f52837500d67da737223a92c63484a4e5e4e1e1812a78f9d5bf055ebfb400d5161f26e60ac81955ac0c6c21d0a4cf6d31088d1b9738099b08459e8bba7212c02e8fdcec6b499320b82474050f463cec74560327e4ef59b7507563af859eb2062c7236b8cf42af8c1bce7f16e709a3e42d6234352dfd9b6f5f58d3a9fb171bdbb8427ce81cc5a1774d3d7a01fdf068f8c5f713d411b08e2adf2185f4032966f600d91969f0f400a4c450fc240966f42ac9bc2b101970b74bd6e868019219e3d6a90c66dc888f2d1e08b9b1188ce385a312ee0916644e1dd1fb39ab78a8960866744a56aa108691b33214dd8e5cec4dda4824d14cfc6dc987d3eac4898e1c251efabb1fa19d812d926be5bec1c786ce65bb875a80e0525753b99733cf25f57134287593c1095e31610dc4cd22459d77c278a457e23083494ae318c1499d3127707d0daeaa890a7d174f0e57e80f20dca951cebbe1f6c0e823b2ac2541e1e232a33e45ecbbae8c82b10a3d761ea2dd1f12e32f8b534922d83172d945b0376ce32f705525c706ce70281fc8f8d72d5b449edf2fea405db0b7417802bf60c8483fa171fdefdf01fbca21d2edf811a7f689e012396f801724eb44e1d8348edc27eee4b514a00a92fd03f69ff1763d00a0d4a8afdcfce92a60916c8dbbaef0d3b6118da2554092cb52b130fe190dc1d539dff7e8817a4b21657571d78be7a785ee2b4e72b077a78a1ec9259625b732783869770e20627d4c0362ff78113a5815eaf6ae0b1aced869183cb18c49af3c1a15b1d3cc5b0c69ced2de7611fe46ecf5476214536820d60c6879f5f67331b4158f82ee72f812c079a22d9c65502927dc23db45f3d4b9da6de2bea9afa1d594b7fffa151aeded3e2106c675c1f029887835d68aa9cc7c0df29dc36d367b4abf810455a5077863a4ec9611ca25034fa41dc30fb8397d69a7700938d84e0f9e1a811492a562da33eef51c57430c7a855dbcb03d39b8dbb1372977bbd81bb6aafaff4b03376def93e011d7f3fd1bb1f5d36e9c872bdae50ba71a9115fb7f252a342d2059b4ab063e265a7f80f1a98b872822775c5d2d165c4b960782fdfac4bf18c7f12066f3f9b0b94854f1fe73295894f8ff60d8e5e2c664be2668f6e5ca9fbdbcef7eb915eccb65bc5a69dc3cb2f0289c3e12de7a555322570e81a5b1f35d79fb9c766443181a97565264025f073d77f26fce32232bd3b5c83f75e67270df5c0d43b2e9a4ad097e09a4ae2668913ee45271edc88655485ae68a2d459f7dcb9646f56b0c4858a4bb16202b6a28ca524c550648a33562000aef2fc91cd434af1712a1ec49876d2682c78e9bbbb77f9976876d2a056588db66dc8cad052c74d2aad45dfedda9aaa93e784978bcdf2eb43f3d15183ca07d6dc26369433a426b1b2f1058f94fd380094ccd05e590e03632e951499ea96fdf31b381eea5f8802a4afb4f2ff288a587e904f3a29f71a736386d0a64b2bec0b8fb19af88027a6ba0ee85bc3eb623a03229ee15bf2b5a05618bed9bbd6152cf17de95a01b0697bcb573d742a2a9f6e9e357618fc610ba2a2074aa27aad105df74a1c29018674107d440a82acc9927307a578a16d7d59d67bed095d4c51f297324cacdf4c2ba5c9b440385bb7fd5bbcd476a119360072d761dfc13d5e604ad0c63ddc805810ca0a20350c21144d804e9f39db5ace41957378ed07bc83d810c56fe88538e88aa19c4c10df334cfffab03b85aa08e2b6ee386af05db79ee353a02262c7feb3f615bd69e51c9a696eda6333d64c556ad6344e0231805e0daebbc1a104ff3227c2c19cb83c2090c221746bc8bf41f19f84b99040ee6a04c893ac1103f59a310423036a5d5e687b02d453c28dca2c82425f9d41e83afdd45e2c52e5ae78968fab23667ea9a164445cea43b64bd100b2fcae7d1c719d45426c209476e313672b2b03f7a1143bee9ea64682ccc1494f0a01f2e55e225e76278467f153252a21c080a45855984a8548b56e3eea584c354d84fafad84b9c4c49209bcbd3273402b1e963d2af5214a656054aead00c3ec28c3472cb2f04f1d065d44d91ee38388809254093df84ca418e839308feeb9acbe6aadcbf80c8335c8af92e7b90ada61088355efa7db2f1cd261a2bed36a4e524a6efe11895e10dc39caf7f3a5c4a0012fc234b44c62976c9daf7f8c209d378c60d8e7b2e0474be19834f8c5f418bb0e72454a0b41d8812fe8899ebf88de834ffa8132123e065623a3f99fbb3b26b7a3efa4d6475dde6574db7ef4e3d3cb2f491f10de0555b8213f09ee324e8189b2f5044614583d49881075d9cb1792a4afd8876d872b13a9f7228cc389ce7e9032b03e1886827261ac406a0de551082e90303c7749b5873a9c0abf77024b5d3487da49e4955fd5b0e782d3cfc61bdf88541f7c092e7f907fafac62fecd2a1aeabe5d78d7cd9796b659b1cf14a6791255b603fc5681170dd29ef18420b281f7c4b6324cf6b6154064d44ddf7b217d94f1acd7f62a1581a9e25a8b8a628738fd78900ffe3b68256f2c6e2ccfb4076f7812f9f3cfc41c30f46d4c876060e2ba14fd9288998f916f7d0c6fd8f91361082baa49c4d2a20a5cb4a2b2f90f228b544292d97687e08143b0aeb3b65112f95f6aa2976eea94747960711be3a703640c257473117607c8122252c810e13ed09f6f123f09aba11f6b4b4366eb4efc04f22ec7db3b17cfa10667ecb18b205f724410fe59fb7e1022a43a6e148e3c8e1c1af5b96e8a4e1229449c636c9bcb944570189951c612b97d7da672c26c4a5d55bf227f589e7e034ec213c7955394ffd7b155e0a0ba79ac0596f87eb77292c5ff4b7b93729140b968381a6b3aa82c39b70d21109f320d9376545a781517cdaf425d0ffacbcd82f2c9257af26425a2efc8903e3789f24cc5728db570b5dbea9aedf2cd19e644bd680347e4647b7513b2ff5d26629800d9d7fd8349f4657c661ff856633734b9021e9aed6ac68429127fd7ec819dd8fb44a1b265795c0b49f24e88a9f5b75aa20fb37f849db1f38c7edce0954a6c07927411ad901078277b15f29c89a916ee3fa5538d684f183909f09b7989a215dd11514c8d5582ab953b9351785465b3b849abb4f6ea3394c86e2bdf3760a9e3a2982114e6981d4b4e73295a4a6e1bf050e1c46819d603bb209bcaf344392d62869cba1e7fac8511e634dc616e0cebd49432e5b45ce2680cefc6de7d4546bf49e9ce8744b60e50fef3c42086a10b5fd97b6e3b4a98b2e1655961947c6ecca1f95977695a274442b198c785659e85b0e13d9c609a105b37f0c55515f2ae221d43803450a10be23b0f533d3195ba8147ad1f03a89a6e2af491acd815319a6d444309870044c8fb3901da061f80959f1c5d006ecb5172f17d31a79512c430a28048d0d9abfd7b13c22dec166c19602859fdacc515bf2783e7cc8252a7b605b17b986a0f7f791d5dd7f2a817148777ab44a698cdcb083297385342319280109e8a8900a026c91bbb80b0bffc3b73ec4b17ece12e50f44fa4e6269f02893ac633db65a004ec2ad0a311cbaf3ec4e7f9fde2a493745a75771e3c849418360f9300851097b6d2edef534e07ae478e7e6b42d0c560c1036b9ac855fe71e8baa1578cf4da4b5b8bddc6b97f685cbd2761366449ac16dbaa4c61cad8ef9c4778f2022858e49d9bd5b465b6f656ec283a364b75195f2afaf3d109b2210758f22835e347d1c633e8e03572f230bd912c4857e8e62623bcd82d038c2d63ab45dd163b3a42f85ddac08604489040801106b1e629a0cf5776e0e7f96230ee16d34b8bf332b2cba988c8099e3a1fa2b5fda77853925543d7a306bbfa262977616ff1ff12172f9ca0cd260d05db3d3fbadeca1b1bef3076df4cb72cd9af42f5de8cd2823501595d58d5d36ebde10afc5115ad7c7cf3db9fe89b10dd3de5439f91f41681cfc0b129cec510edd6f03b3efc3420c10778ea8aa997ca39b2074d806251cd7b83050ddb1881e36b606607e9cfaa64b3d5b373fcd9d8fdc20fbc781a409f4907e035003b0c82707d4338c752a1b91b3f18057453edac8cf199085ad937030c9809d12995e2d530a60d7ec7ea5fe98615c90571e1de8c09b2256b2efeee6abaf60d4a438ea6c42764e6a924214e3a9e79a61ebf68fa8c6cec85f15251e2c1be537f2fd5f5b7ef582d8cfcd475df5eba709fb7f0ca4324e62d2d0008aff0d258c339f5c72939573cac01821330d07b0b9b0be8e429b6afb01e044701f9d53a8c0d43d6ba8e591bda0201429761ca347acff0399e042620e84ddcc8879767890c608218fd1f977c8621e3702edcc474f7bb8c023d197accaa02fd2af80b6d4d6d846db85e2df5eb5ec81826d9d0c33d48596672d4de00eed76e039df1fcdd67b65f699633727615ad719b39e9b769bc45a07f9ead0750c5171dff7d601ee05cfff7542b268ec27e2b4150da6d67743a55099d46b1ae99c163b1129d88bf294632636394139cb34238af412d1c5df0245f6e8bd2e383ff9d487b53ecb210f9bef468732d28ea067d1ba346595fb1d43bf92392321b0baadb2f23c9e365542d15cb12a6bc2347b1566dd2822d607617174048ab7091d62995777ebf4cc3c144ee81555e980d0d9f5e58f03251208f7e62dc88725009425ad51d24fe5ba5b4097267ba8dc921695c1ead522b4048f844c0d873890cf1228f935e958fda65b2954d3c0422f7f88ba70fda89a38900bacc07ebe289a75656beb4be40606152209106775f9985085e1eaf2d73d15f7169666789df40435f243b8f6a0d91f07386787b577b72997cdcc052e9610da51cceb343fe74bc1e3fbf44ea41adaed572d0a84640c1a4b6b42680346fcb70308e54000d5a6c90bdd1f546b792790d33f86f1b0e45e2624f0fade9eb349af0b367e6497388373722bbd523d556aefd7467ca786da5e7d6edc74f0a2fdfd46e981c484edb0b7e47bdd86848d5274fd2405a30f12f150b35f09e28cb7bb334217a56d6fa89d15df9f816a07f58ac8e0f2a207ba26a70fa6b09c70058414e73469ecbc90017597657f1c9dea0ad14022c766dffff4396dbb6576cdd932fe57cd88b69d4ee4797e50c895bc216f446b6e5a629eb021f48358d83f39b8a14e985c6fc313a4f2e801767fb8cbc5bf5b68b84af4eac81cfd988c604e6cf0c5796683716e2028c7cd27a47bf3f758aa5a3de1fa7a603c7387ea0b72f081c8309ed3a8f8c7f4c482644c2d1a99a40376c9e1d1ba1f260b06138d7bbc79c744e237de699f2587bbf4d87fa6ad18954efe5ea9b93fbc48a1ba1940bbea00091bb07059cbb9c61b97295b6a0a57101afa87895cd7a0aab2b3c1677e55142f83eae920538266c2a8f80b13943b20304d52d1c34b44d6e0af1ca6672779b521b469d2f18a564d94cace60818508a348d45e2a076368c89ec0b3d0ba45bf3c424f952244d94881b7f0db7a39c9737b5f9370ccb9e7632ff79dc7d7d6eb021003c281e116341060a4025a0bc590630a7a2859dd6550e0936830142f3676863ac09f34eac5e0285b7d1d9f240abd248cd2398fc1800f06f928bc8729bba81aba3d2f62ccc3468dd207e43a5c8faf5ef382e1b93f9db7b61f5087b66e93fc67a4b7cc6ebb485934020c9e9e667744d80144c78e62e47e9f091da519d5103015319b5f94dbbe95906a306a71c2435f0a230e10a725b5963b805c2decb285efd0b32732458083ecf4ab9f7d528a53810dd14a9ce84bb4958c989bf317c751ccf3857cc23e416970cb2424b2412b80d32a67be09475a8e4619a817736fea25473f709f59e4b32b43b35333a8e241b8beffb95ee8197eb6f414345b0e3520f0254e58a6138f841a22e2156d463188ceacc1afd35a36b7e9866517403e6a23b45db4d41f213e02c4fdee13e0a3abc38d2315e8d1200fcf1f03313164ecd036647819674c31f6624dfc85d11d80b8af4951f9f68d144caac28faf97fa2d2c21f06f93f540cc3579f29e91fcd563bd2e4e5d7c784286de5207b97827fa023942b625b213cc4ea59a175d789faf1a401249c53ba5030df88eb92477e4409b04b113491bb3a5aaae346684f074fab67f20e9778106eaa19fd9849d56616230e5b2ceec70f5620e913d0edab5fc166427ab9ad43041950e0e334c38e29dc95638485030e4055a9e6c8086cbb90a806a7ac19454ab9149c3fd377b23561205ca390ad38f42d21d8a08dc36a5a0dbf657c9ed49bed7a6196d70a01d1808da5212eb746c25e77f8c388a2e3207ac81fd59fe3506c02c7c5d846dcae9c1b637bfa559fc883b0fa095fa60b5cb22837b63c1e4438dabca0fe6aaaee6ce69cd1a505fbae4d737a3ae0e00636924a918d351bcb493cba23629c7a20ca2f53cf1f2447f6968bf9ac662dd749892074f74e8b2121d9020fdd5ecce3212f7b8f38f1b090e00a2aa2548e70f6aca6643dda8fc1bfa13f3b46cfb34f76456a151523aad8107090c5e28c943cad75e80d0eeb27d4e98c0f60d3477a92b83bfd716281e1bb4d2982f2fcb82b5f0001afe734f6723b890d642178a3ad08f3bfbca70ac789fe024f54e872e17827c5014c2bf781a3cf2b8a2810ba159248fc7cf26e999a7835f356c4a93981cd6e15cd9f79f6d014fa6e3a0ae4b4f043f5b44b043b484c169489f2dd2767a77b2e1915ac084296c900e695e98b774322659e692fd43147a5fc8be75a16352ad240fbdb08a680c6cf42ee016ede041f67dba5f2797010e0962db3464cd722a1145e22c05b0168722a92da98337e224bf4f1d64360363d65560a572b4b1e5c9ca42b824651fd8687dd3c881aa184789ab56259dfe03e78d8ba75c64637c652ce375a1864a6edc14dddf5b6a60f2a53d9a648ae7723723aaa47c89aa2330807d082a9b3246684ac3979a92f6aeed893441be27777adae5a2b310ea4f85ecb88e7529b814ef73aa5b5ad8ec668e19846df1af292f86627ff883c9243a1d1c47d4eca472aacbe23a86822230374e0cd21a67ed29d77103c407443f53140cbcfb7cd06ca1ddd54fde1b104b97dbe7fcc1ea89031c31c8f258c3af09b5d93f11a4c4036000e95373b983b2948d8e6e0ca0fd9e9a2acb6e279faf0b182f25883ae5c46b021f651c28c683270bb87e207410ee200f94c1c98a2fc96544ac5088f4f37d0ff0136e7f553a5cb6031b44010a0b0780e4b7637423dc6ae8afd0385a2d3fd4e3826a517375ba9ff6c914a1d06038b4d96205b3fd72d52bf47b4e1ab1f7f5421d6a95b02db676fd19ee5d28855d0a3dda563a6c8284b3ddf17ba0f0f9f0860f1ffff854abe3eaa159773f990dce9e15ef942e7995f907f3549e412a6a1b6eccbae712fa3729e3c7463454d24e880835a5390ca7263984a186d4d30e1ef76c152a88f6589bde4d6f20454fd42652eceff7c43ee6649348a813211083848a621af82d2d3e12fb987a509829774984bbe0519dc74a0725e995a51bbcd009dbfe952b662dfc5f80aac0b5353443986a2f355b307e8d6d4792be1a91afc2609448e09028ca0f7034821bbc99ebd5cbde35f45664c5c9d25decf8f71587e5e6e89e3196fa604221987e5fb2a11d8ed4f5dcfb44f2943fd6132e52f4369b063f45620343b7a1ee743639d60ffb54abc82585b307adcc239ef29886695bbc0a91b927032845ab01766d003e768b204a3b2bd92e92ae49b9f8669810f5ebb3ffecc9d62381c463ec141020d3335686f1c1ddb3c2d24b54bf894b0da99ea01169fecb36365f7fe7d86ccd275e9d282fab4d8d914305a93bc0309adac476f9755de8bf1369b090f1247ab835b7cbde6c031dd2c57c201eda0d228aab80683a0487e46eb0d7c5681a6bdfbb5a18e24a4684b3680e60b80bf59b78e066f69d6f21a4c9f43322c7d01f16d24ca1aef54223f538ed818b04ec5238c2fc7f25d163c92fb094dafda6581943ff9b585dc8f47617238506a52ab8ad036b11b7a1a40657c47279d7cf39ff50a6d892b2d2b20001d42f75173b93de172d8ccf7d248ae435326ca0e67d2b977aec5211706fb1411608dc02d14bdfe961e4cd589a3ae54266c03c7860c1e3915182e7c5f348951d525e8601c62bd8126ac7fcc6d8deacb292281530386a1a1d62ed8622f63412998c578c8cee102f6d56913ede6e135876efea8a329b12dc6bd937386752a136147f846d68b50b23cef8db29f03331079f6c3b48cf86711e1d2fecd65b891128d2d244fb50dba8778428c5e0d429044c1ad884c19157aa09c1ea049c1deec6811dcbea257c776944d17e0edca581b61c82b628cd95451e5a36f011823d58065641a279118482621efe3fdd3e48d155b338b522c56fa3905e74a6483e780749d4422091e2730a5d6dea09c41c871d3bb0ed6d8988a9be898c109e002b8acd43b939f830c90150ccba212f8f1d00a99f00ccca55a65082f1923b2016e5ed396cb5d25d6d1e1b61996577fa2f6dbd0d6e2862db2a7a6de056237b02db4243dbaed7a0af5dc19b75050bc614b2d100ade5fc253848167fc3d4b073d40450f3cdd13140e94f98220a28ff5571454173a8dcc120984a000bebe00d340c17ce7ebe8e8add89511329fc5e7cfea6df37d853fff026cf0f114a0e79097e80a63ebd905fbb646076488345f00d153748045c752e73a5241abd70134d0e7f72321eb7233585abb9bbaf9aec16477575b489352f9bc8924d21ef45ef5cb7f4b825b9ae8baa150cb5ed40d2a64826f69186a357ba38a9174c5a0a9278848482e3269bca0642220296860dbc6adbd1cc3aafd039c706d01bfb0ddc8cbe368cb5c503419723e22908b181e703586cfd233d38b444c69bfc16c5e4c986174dc55692538fb493005144aef7d97492367fcf623a3d23f4fdafe64a2e7e0f16fe4c18471fe28fb91ccd4dd259925429a6c466b1f319119f8523792d0f7e5fc86e86d9f79223670601c81c73cc2168369ade2f71d211551457a528c81dbc9209d765e5448904a45de86ddc2ede5e623292517aa64656526528b7eaa96986c69c041c830870a11bb7b2f7bad5237b91248febee9314edb10b7e3e7f97751d66027d8642fa3e0669a9a636945c614009f84bed362100354063c0300c92a0ad49d35611b4224123ae29dd6d705abbd65c0a412ba12123ff3a4c59340409a8e02d4412300d998226859c30c2c06a0115f041ff8755453d2861583ff7f17e499f438768f74df3c4b20bae24e557e8cf872572301f028f82c7aea98d6e0a98a541c469dfe8061a78922d6fffe1adf093dd583700586e6f6099dc1a01d3b51764348a996111068e69795413e1acb8effe92dd3f9c81b6d0a4ad7dd829e84ba20fe3352b2bd0c9f2e976d1ba0a0a41d4e919ec9a826b5228f5486937254452240a02343471db59d656aaa9092977ab10ee5825e873c11e0e85d5ff2d6cef6c594b650ca05ea861942196acc1e64c1a9a57913f73d73aa260740ab1878af5e949e7d79e18c416a5c25123bee3b7436bd8fce14284fc2f75b29e8be0129e7ee24148f8730ea7ce955b814667d9e4b067c8255e11b3e99e4d050377311b56a6e0cb2505973fcf9c42fa60f64c61215423a4745bda23f06e8e81f9d5b50c4cac38772b7c75097f8f10b2c4e7d02dffa5d6a9dd7d9859e80a72a2055c50cebea48cb131be5d45779a50dedc230b170cf09da3561426fbf5d5efcd83f1abd2e43faf85cbea6ded7b977132d3c5da7f63cac6ad9fbdec24a9a7407b4ed11a0213c244584e67ecca9d0d6cd5bab19eeac95874b493bbec72c640ae53b4c3340832137d8b343823a0c4407eb1bfaae1f4c734a5ed2a96cd2cab110ec3858b1ae34e62b4c680c6df26252bf10c88d34db4dd7ee2cbe818b1116a5db367922cca8393f15c355d8a809c937309980e3e3859e765ffd0f067019823764ac496541302ca424b86a01db24cd44bccd36299c2f980cfacb70f9d889bba537974ded280ee3bcd9b122cd416df1087744254fb77e6bc277725792374bd327dd214ff11724a07bdc1af18d50addb6cf91ddc84ff05f93b68325d2c096a4ae4c6a0682d76d34e9e38dec94971e3397ffa5139dbe117a03650ed6e28a591f5dbf3c56202ed8603d3fec713801f12bdcac0c14726f75c67daea9af598da2263554c8174e454a0ec2ed2e02c11e80c47cfd1c7e96a01bd180cb3cca01de058c9c23c263bd81cdec15b332bcb086a436c963cea3358e930f2f4cb9d2f2798102b5267adc5f52eec9d0b520b07002069be6e369d6c46cf9a08caed4e25f91237bbfebc0519d896b2b85ef363f19bd6f4eb67539248e962841d481111663ff4ea37e9d3e2b068fdd1c04466d60c9c049ab67c5b88e507b4a6140b31c44c2ad300094e60368fe3f15dfad680cbb8a9b8a4341fb4c1ecd380713f70e1687e96ff53ffcddbf31ced7718ab17db7c95e2918b78bdd25c7ab9596d955b70745896607f4f3e657557515250339c7ca6e2606115b725f4a69430d654609397e5b770e2231fb74c652ec0faddd4070ad9108f71d2bc687738bae438ead6f51ee75874b02f157da5f9abf95c21cfdffd9eab1347d002ef316c1f675e5f32ecd5cc6c3cc3b9217b5e3c69ae91e402167d904436b96709aaefe7127552f8a5bb8341c8517b4ab5835beb175db2760ca9243156df5391a640f57a03d5074506c98647a22673872d7d1bf23b53e8b08d1aab173ce2d99e1c1b534331ed46eae780fdab4ad2cf9013ff420e291bc90394883b9e2d847ed7a262ae03dfc14d7b3b24487cd3402a307f91a4afa32e9dc2783c38a97383753c4f5b020203008b4dfade6355f3f7ceeacdeac855948eb776a357858262bcd3749bfebae9abfcc37f5dcdb83d3295fcfe33c0ab88d9848878439eeea4dd09121a5112c77c7f5343c74be94b041db7be6766703b44d64783604911b40870a9ca4e2197daf021df03ecb1e14f0a730c8eaf2974dd7dfde4c02e81f4ce9f3b5246fd6b5e9252fbd1ecb99994d64c1f0245cc65fdd09b6de60f603e70b003490e523ed034d5472e10b2acd6582731080d755e79b3e73c5c1dbeefb5d76a0b35b6d13f0608724ec088e8a4d2cdee36df0cc9db9a67841367d42c9328ab783984705b3d04a81378366c0c962a9c676c7b67bc35370028a4412db7042077c2b3c859dbb55c26d3859e8ad1ea7ff0bc7e093ab258cc2d6e725c3aa3f00cefddc1595f752674ca4573a070e3e833ac362216d85a1302f55bcd499c1b519866e9b33633f957df578660094964a828ed40513f459e52907236a942801305b4bb46ab5d7cd3e879e13108521385883feda5764ea4813b5680633fbcad7829f3bdca6399e634644da70a05d33055014cd7590538d761e38ec5f99730c9019364679afac5dad1e60ebb540e8c09e718919d36d4df647085f2fa0b269400c55b165597594032fb16b2e576bf63619016d6147c55d5989fb3c16d28d4c574c75c918b093f9ce9611500f208fd50a0baeb254ea3c8563ce198986fe6aa606ed62ec2668ad211774114b8894d86c42b212136c437d3db933df357ded62b002fba300d69459f41a17364b3551632259e5b85e481904462de20e5b62291841948f989ad895108d10ac96aa119954416cd0222aae922a6b652f2418e6773bbb030f5e918deb68aeba471fcb8105238623842aa98b4c6a20127fd5366efb62a39daf373d8d527500db6ebd60d808b3c70b2fe6e2fe4bcd80593464e89aa43462753e9b4957a14ef249a1532accf949ef1cd5be12e44c1453f6a7bc21640be6d4e9db27ec0fd46f031a4bdba356209e15a703695cda02fa82305b44d0b332a943de4c57cb6ce5209ac25680dc63e6d2569c26a9969b35002c7e1da0694245780f78129d6b7e8dc0585af7e144eca8444c4af00cf238b3e2a7256defb626f7de32252903f709020a1e0a6013d3a503f072312e365d9c13ba30a62be5a751005e94ebd96fcacfa35c5c6cbab858ca8f4b0f1a48af87694ed034cd0e9175f3ce7a5ee722111b40e9a3738f43debc3f1fa3d855f9221a229188f4fa19021a9a1340ad8996bdb44334df687f3e462f437e6708ba65419f15c0dbc99e5d76b2b883f4eea5ed190e053d7b2723c1e48683d69f4e21873c38649b836f9676a845edf5d7a326756fde79d7d5538d890294bf390b87ec31ac22d92b33b237260c3d7b3dc6b04ade481bf939489bb03b7c2efcced959baaeebc2ef62be93f9ce635ccdb8fc68bad653b992218829f62c9e5d64af0c109e3d646f8c0e9e9dda1bdae0d9397b3d06cf2b902678f66629ed75791361d8c11878250cd62b4aaf843df768eb599d19dac86de5ac0b29a18b2f97a5f5ec1d83b1df7c13d92b5fe45d27f29077a14ab90da07c910fd1945c941fb261b1cf0879c8e347130263ef45f1ec77c66b53009be0603f44f3cdb5d20dc03b7be20eb46edec5cf0707f3117ae9d4af1785a671d282aead09784d3dae37f5f4a03f7b220cdfd9f3ec334d4117c8e166bdc9d212492d8ce9dc53e4d2a528c485ea90766f6ad9bbeb954f7d0241051172918bec90908dcf75d31a9f7a1ccaf85d1392fc054dbb324fa7df98a737bc3e2ff8944ea7344698ed824cbce69b77f2230294bf6d533a27c51652e448d17a36fd36650610038030e5f534e396fe865ebae45c4afe6284d944a0843068e1630c6f067edb2ef5cda68beddb65a266c96bf7e5e390e9edb363e2cdaa55f95f8d30407fe95789fb32db0c5de4016cf6c99399468d20b088f643a4b74fe93188ca2b3f9fab145e99fc9ede9fbf1a39c56eaa91532935720aac9153f2d6fcd55c7a2792214532ba7a6b26dd4c4eb77ba20989ec45f2229f35fec42c060080d40d5d86977ce49d0cbf3ee3a7dfd24fbfa19fd369af4c277b5d9e7319f6ba7ca0afd01457b1269b62634ca1d892b531a6487664a36745950892a792887c3a2b7f341c14bff9ac975fec9afdc89ca0f0e724020510ee2f929a97b24794483fb591e371256b1a8b014ad734ae611127d209f29d879cc695c8bb520d24896aec947f74ed441d0c43d1a9addce62e3f243a57998889ecd3316a9a04a526656bde334a39a7a52060f0a5bdedd363d3f6d93e645a1a466fc6d9dd54ce969c051543e3b63935bf3db539a78cdafcd98618b718639c73c6186344c2dcb8397b72536eb6264173f9c379a6ea23fefc742cc2684ea37ddb34f91cb745ffe0c41d34678db9cadf498fb3b7e635cdb7fe79f6cdf9e6a7ebd4993e67378c7b9ea05fb471dad539bdd33d3eaf9d9d9d9d9d9d1d276266a1cc63272099c691e18062b25950b7fa66676767676767c70919191919a01d19de388777b8c7e7f50373b95c2e97cbb5b3b3b3b3b3b3e3449cc5599cc519e7ecb4269b05718b6f18875d2e97cbe572b9646c6767676767674716c42d7b7c5e3f30201973b95c2e97cb2563322663322663322663b2877e106d8137271c7785397287c53097cbe572b95c41aee75e312b6616ca3c76028a37be18c63086318c610c63587c318cf6aa29089e4eee61d8324c839be75e4556f42e8646fddaf1c423c51718ac5341e08c7af4d9d12a592deb950d8fe7a2cfd9bb09ab9e2022c778926fcede5c883b60007c2d441e46cedeb05e713d9de2b843a8b99e67873d77ecab9e87eaf65b0d3040cf372779b77d3424cff34e7a24cff6175bed261c86aac6f5f87ca8ceff6a7fc121006ecf44fdde46b2dd64e327d56e1261a48fea1345c0e7c24b6f2d441cb6ff3a512582a4f59ed5e92cc78d3617d5cd762cc2480fd5f89df45ac61deb94f4066275b3f6e69c73f2b75837e9d80e37378d33431757e028f6ed9386bd354fc3b99f5ee1e031e7ce56af7a67e2f40ac6a34f57af6ef0e81deb550e8fdeb25e851ebd67bde2e1d13ba8573b3c5e992df6f2363c2c2e1e3da657385cf3e8a75eddf0e8ce2af718e30e28df5cc61d52bef964550ddfec6582bbb2baa36ae3a8319d92da8bdfa8363c361c04cee2b1bec5bc56ef6c54cbe279a88afaeef3509506aaceb0a4d383409ec9047aa82ae3bb9287aa2b281eaaaad4b0222f3895e2a1aae93b9387aa293d3eaf1f1e23222b070aca4e8e1b3cef46c5435594195d270212c5443251a984831c4d01de8e898050b5f4a00c0fe766a767e4330341916809a7da6bd4f6e1d09b412f1055c1ef4ea4cf51452fd18f08d6a91387d3a92d886b71381a996ad4e029c00b76333c541d3d0e55e423c35bab3638dcb47276463d239f6d569ac5be0f87daaf96da3eb3f573a2e1a1eab7e2ed3754ce0553399c518f4fa7da79eca85bd04e37c977be77443ede26bd469d02e5a1aaf72c55a725478ddd5251b57b96aad3e22ed5f52a2d386ad78acd3c8f76353c540da12a4555ee6bb0b878bebd566d78745822485aafc33516dfbc86772c7ee3fb115fa66e54ed73d491ab53ed611de574aafd46b5f18013ad56abc5bae1394c32200ebb2e47dd82588776ad6eb34eb5b314e0dd66ef281c383aebb9549614bfedf3ed38aa28a853ed5e45320edb6f5451ac8a8062bd8a3cca893b6ca2d8b773084077a7d4c5857a6571179a2387163f9a1a953eaaceefaaa7d566bd68955936aa8ee6b6fa36eb95084804d43c624fe3dd4a1b5efc286561b1f1d16cd659ea8bb37c342fa91b9eba612b7dafd56dd4f8b6c68f9fb5acee06cb78638ebc56d76a64b5bc702a7543ead081c373a92c8eaaf1bb2e7e2ef6d6bc8ba350bed5bb81a0df9cd63b6f5ee47c03a25cb64b65715a6b38eaa3a981aa3b5a7c478b45326f583c2cde49af46a51f3f169b0355452fbf1e21971e2bf599a651d967d4dbb9befd546f28a35e5fa937e6efa6526f8ca95ed1ecdb53ea0d51ea1dd5eb60bd94542fd7faf6d156afa8c9b77bf58a9c7c7b579f98a27a4d7f45409c479f517e349c8ee6fce9dc384bb34838188b675656f4f88d621f6d20d16a18c9acd990c89a131259c334c717383f6950a2f1c69ca4d463ea99000961f00cd3e7a1c615656d88b2aa804eb6018c33ba8ee4813ee4afc0434307c0004d51506ef3b4c931c2b0e5d66c9653e2107d86b5982dd2de368e0b79d0d0301412893a1a230f1f1ca214a40991449df7bdbcd0443fa9010cd15289db4adaec12974a25094e4a3566cbf2cc92794a9f779aa46c8d9d432111d72ea6f3bc8feb057db0a7893c11897406f0c62e7e70b80577b4c89c148c302a80b7878fde799e9c11a6f3989979cee9fde43abd0f5c824f9e348d68684a2812858e6ecd8f21c700af177d1443ba351f238cb671f40b7da26ef6c772c4c919ae2e72d7915620a5162c994e0f8a1e0ef6446e383324cc9c7c90cc743a6d36e866a4537a92654b709a36209b2e31a404e5e6c9c290d5a04d9b4a624033d98f0f904fc80b8d4228a199ecc707c8473277cfb985b8a96d1bc7512a0a7d21100ca5844e2119a11baae862189c93ce4423b98b8fce71304abb510bbac9cc2c995932cb2337370864efa0ca4a9abbbbdb4632745d94520cb90690d7d053e34d3adb8052ca34ac01bc9452d12846185a82ae23c999ce5d8802227f888d09022f7dd9f302f0462026cf4824a144049cb8d1c9f3f098c821b5377ef1ec9ddc86689bc468084094528ef94b65422dca8174a259b16ddb36a715dddd564c59ebd9e70f5675d36d52ef3533d31ef290bdb23ac1612814aa457c1480436e16910e05874582b0aa9f524a435da3748a9cbd0bd22bc99a5108121c6e4e38c1210779620681c16011a60a397b017e84a24c13a71f32e547335d56393d073a3dca9e03c8aae638ceb72a39ce27c771939373cec96d9393b14792678fd6ac87e15f50b6344f0b73b6c44665a8d325647e74e0f39383255a8c60c9eff8a8051538dfa3070ed96594538b2167ef7ef44ab23a6e9b104138e41f4bb08afd89f93f9a52106c5025d303ab28a53e2b5764fa9032866a366abe7d34d5e350d32c8501f8c4fc0b7660af24cba3a2a747c54c13e14c21197b04c6b08a411004e32c54852eaec09077b36af24d9c027293648bacf8450b96660052bb61c1a7fc66d3f6583c9bc76f8821d2d99d79098e1837e366a42e485e908048b0d6730b17440a0337e3669c1352186400c1e5c68514e3669c13194070b9910104ce0bae0917e38038a42d971bda3a01c8c97000d11627c311d3b4c88989410378e3ebe6bebce732279691170306c9494ac440e1490e39244a0249a41a72b0f2ce1539601539a95ecec959a29dbe7ccb9b9c1b65f1b5d23a260719cd5eea356739ce2773fcc2e299d3678806f0d2ef9c2984a317736a73c7fbcb39cf3b39371c52c1320911c04b993265da39a2d02cb6386979d212f4cc1ea8a20a49bae2b91d8b676f528fb4ec812ab624323dfc808111c3aa6d234950daab39f528ccfeb60fabe22b0a4bfa270840bdc5e63754c29ba1af715825bf2439ac1a39149f93ac685459c621c79c8338eca0f86c9057e51772c6a10c8a31254bdaa77d56edc3dddbe61b18edc3213313c02b6f3c79c32a2aa48b55343bac42498fafc924cfecedd32b2562ece013f07a7f39f64d2ac7389449ef64d07f01f4976dd895e895bc61199bfc9575f64a9680de308a44d6682db202472905b8e04221ce43d44321ca51808b6deb4e43b756610c496600afcc4808608ce7d7a444a7d8edddc235809f7f4870c8af2850f1f1c9c7d7135adfb127bf1e3ce647a37d4ad8d8e779fc683aaf86fcab7cc35470c822f76aa7cdd377f5cabc0ccb9007abb4f77825339b3967ce2239b17834cdb59aefa4473203c8d3413140998f46b31e131e6bb48fe6c67b6e3ddf682f2d7b7fe3cc895a8453dc1a090164bf9199d9bb2535aa832ebe5c098b404828d9b92247e2709ca422ca969849b412d34a9f297d9ea54fa734242e4a52f157a2648edcb98243f6697afe68e4eb08e08db24b9148420956c9672a5ba2378fdbb4573e2a887ee9fdd25e140fd4cc6360fe908fa6ed0c875ca79c524a4df319a79cd15e275e1b327378761ea3184c27e411c04bb780c94e0812e73b92e7a17a5f3e34996b91df23df1d18a0fce963fa0c7773cd893af6a4a83951f85e9c2c4f4d4fa94fea9155380f7627b217a4fff2d465125c102ecf858ed8a9cd800b2ea650b5482fd2ab53dc05f0b6ccbe652623870423fdb84cf1ec5ccd935e97f47a66e23205cb56b927dcb01361d85d5aa4178989cf1b7054e1b52e8097b4f3a41d0ebba5ede5809cb03c91966f79e92e2f2d8d309f0f16d20d3b355e5a122cc2b06b2800493e1cb25f1d829e9d0423f9a85a4490b47a1cfa8bbcfbd2cf2f38a24eed0d025140424e725288faa5af753ec3db672ff89b67e3f692cdb43f27e38f66669626d8ee511adaec13f243a1a83df5f8f9a04e048831c618e3a94505f19bb54b70d85ef39a0567c415139c6a6f5fa257339d6a97360078f2ed37159d7cfbadef7e3a510aca52e490e90c87edb334adf7498e043013bd1ee531baaeeb4c1e6ca35050aed97a46d1c597abf504e914a701bcd26606de184382c66ddfbcdb6a900f80353fb78a0262af5452f31ca37af4732e9570c8ae840d873c6f9ebf2298a5b55ce08db12042906095dca28cd3a28298d2d6fc0ca380486f6f7b6b3ec6a79507879c06f0f2f87e1ea419a55a4bbaf8e7b59e6e2d055d54894e50fc76e4b7cd769c0740f9dd49af0920a594f6e945268e73caab90732e5f1fa2b6019246ce6e9c6f1cd73d46ccc78060c8bb9e5e24b2b79d7a472bd80150bee41996df9cf2bb7a1faa43dae7956fa23e79c539a531cfd5174eb166bd8d6e967218a37553d175d16fe7b705caf7e8a4af044b7ec6c7570960df69de5751403e1ff9c8de917f5ef3dd68e49c8f4695ff63ea5e6deff8ab3ee28f46f663fe7c7cce869f4ef937fe6cc8137d3dbe1a9ff253f75e7e3d6afc4ee47df5fa883f8489cd3fe7fcb34d7c349b8b3e1ace451f0d751f22efeced9cba7c424618ea45e6c708439dab433ae7bce7e5cbef220a17c0984518391f3ffea8b3a82036e79c73fad1704ef9934e443ef3c7cf0773a8c6f7eaadf910bf57e5181faa1749141f6a7d8826d4f9acf1bb4a44febc485ebaa8829b362906e8b38d12879a4f6e6220800b203e3033c5cc112e8040c205089a68356126034db89971820b0960a0091a78820b308908448c31c618bb79f6ecd9b3af29b20fba18638c31c618e5133a965272dc41d7dd8b438e4994524a29a59cd3b54dd35ee636a7895f9c46dbb4b96ddbb6ad01044fdc130cf0f2882fce932b00a5735f112156ec94b4d463e1509b736a939e3c11382713de34c94e21ca6d5a37bbebba8e65248d6ecdf3a5dcddddb23b8a46f748d75b84454fba18638c315aa0ebba686f6c220618bd8bd5e330f2f8e8cca3238d30d1a54c032131258f72e0c4e81e38e4c4006ff4e2a3cf6893e050f2a8fdebd1df5626c244cfe1c64f8b92f6bec8d869a01387d22d4a49278e64c2f450bd3d7cc8635c4dbf007889e237f5b2be9cf1529246a697ce79ec95c9c64ea1d8d8a9dbc36fde95aa7cef558cd1a3db1bf2eba5135849a34a39dcfcab1e879b7b15e470f3ae9a38dc5c546fcd8b5c6b5aef8cdf9ca5eca1e76c75b2e6434eeb353d05bbcfafe7f90579207924f9ed97d27ed5abd43def64eddcabd7ebce450e829d873ab0b39245f5d2274a23cfbf4e4af9a5d1e7795554e383f589911341d27ad03d567dde3949e49e77a18fa693528e6a8c305ff56a8c385c295fa435cba851df7cbefc7ad0506dae464d33b1787af6b7bdda95f876ea92ae38ae6e556a4048245d33598a814edaf53af1ed52457df390cfda691f4d68d210b51e8753ab2ca32d32235356b1cf1a2a7905244e49bfa6edd9b5e79eace2f901f089b98da4f6d14c4eca8e3bc452e9c4e22fddbdb09cb6a9b107d28ef36ee863e9a5dfd2c7192ffdce780979c4c89892f2451fcdfc64dbc8aa18a227b8a2e65b2e59a2c4f52445b4aef4083865a01cae5081062e2ad0c0b5c516f2e5dc1c0781f2356d8b59a24994458055b429c7711cc7c9980ac4147b14318c6886982536288057e2449c5e510a82a793e3bc382e28e7853383cd665f90cdda66e6c9ca00fb64b0d917727e46813383cd66b399f78528669dac9403f076305919609f0cf67ab92e3db1e5c5c5680c6396e22cb5bc6e1746490a013dc3aae87ddb21ec9ba380018caf157cf1db109bf392e79ceb95ff11117d3a6f16d51e593df0aca8f6f9252d80fe17dc3e66e10127c42c7ad083f822ed90189bdf1ab658a2795784ab1cc781af3953faf1f44af378c3b682551c054f4e70e85d7bf1e3accce1100a0e398e611c07fa0537eb0457a12003c815b150ac38d629cd6957f2ee9e52fc82f6966ce4b0b3310eb5bf1c23d94b9f4bb1177c0ec5ded3cb9d4e69ceb18c55b19f5e316c732cc00bd23002c8691efb905f9e495984d15ceef44afe744a73cd5e5ab29782f682e0cf49f36f07e0f4cbb308f49c4be7193be120567dae79b7da86559e6bde37ac1ab9e68dd38d6afb57dbb7d855da71d68382434df3191e2501457e69ab5792a5b9bc915474de858038ac89dcd75bf39cb4e150bbe916875a0ef7c40cd51b6a4eeb955dbcc6b52805c1d389b3dd7acd9d682858155ff327802f9a1dd224e94de18a152479d2c797eb051f51bac88ab375a2f747d3563a47db9a0ce0164bdad6b4a823246bba644d7b84c788c8e20092d884655bb109eb8820cc320d39c801ec77c084073e1f5f39f8e2a583264f59155f3c50f2a567ef48ed5d9b78f24cc4262f2db76d82086ebdb44db4450521dbc6266f9b884d5e36f959173bd9de35fe74ea3a37ce0a9d7815b293ae244bfa895721971e39e459593834712875369f75726a7a7f349af4fe7a70c719ee4a03229135cc44e8a490361c83e67a303735682f68e7507249e0bcd3c7c88aac927e5f2e8f1e38d52eab0c873e442fb33da1328631217a3abd740fc32e44c166cdca74aa725a8053c6aa1b67ff05ab6e0c7a277a35bd1d0a8f0b3f3f2fe8489d824e41a780468e0ac02ba251030c7007c4d9e9544b9bdda4f36622e23ac4ac4d9a11053d7e5cd7d97da0df669262efb6cdbb28254a6ce4f1f3367e91a86b3dbb2848347b76aae45b11018980508056ba601dd8b99a02301412752211e7f193ddf3128b97de499426285c959674e3d51150a75aa399ec5be124b8026390e340e7c0100d8568884234b46d73d421ba89b650a8c9b37728324ff61c7be4a178e1f1ebda4f779e7db472c5b3772b3ecd44e48508e8056e23b96d1e0d795d0518fa36bb22e547b3d205870c45cf879e842a131c6c0588c315180d18700b56603460404774ba9c060c3caf53008e7c86a318d463f7674488e5d9118c04e05d81a10081b509271ab57338310605456e7baeea90a424b99e475de0dc3cfb3792915a200a10b52318872c4c4440222f443114a05e919c7d04430122d9110c4502f08a4e5b57ee6945c941f92a4af579f6de793d3b0aecd963cf08c66404237d343aa218378f3a37ce12f90cc7b803ed2cca0e4b11c08b32823d8b8050be8f66b32840a3908f3e1a142f38642ee45c65a26728310e190588c31558846101784730a0671fc558755760cfb02e4640ace29c7de405ab2e139cb3afc0e20e91566ede043d7bf77d74f434722492c9e1a0a2d31c6c02d8c559327188921e933084d9b3a3a4edc13f3d268108b16f0f79b02abe70acf8e848448057b427be5000bb91498ccdc441c1ec6f84d94c9ef84a81093ece0a640a9c0a448a9c0a440a25aae8d14156451c1f3d3a0ec9837c913cb04726fc6529fd803754f9a84514aa7869afccc7d0df901fc8145670183f8b1e6ce14371d61ee83a525711639c72d3a28cdac6e27e3a9922c79730746739c518230e4069afd7557415336e48a6d309043d4aa547c1d97a09437796e81df3b6d90876d36c1b7b008c1ebb0af076108bfbcb93696a5a5701ca22e3008cf6769398e649df6441a404b94edbb82adbeb1380d2fb03c2fdcece47bf8d45732e7f7baec5f406c439b93c27fccd2fb7c35b17eb601dd016dc0ff73323730e0267693ea3a19f9c9d9ece85c5ebc0ded5e7398ee3e689eb397f36e3007c6256ed2f173493fd748a9d72b11e6e09a798f379025e520ee77305e75b0eab3625acea1d566dcdfd8055803bddce737739cf5c8c31c618638ced5cec947c9784c32fc8666fc7b81f8dc361d7f39d3b5e68a11cafe5774f386452d08f664938747515e0a57f3b978bf3b41a59a11a595ce57eda742e2c5c1cb22b0875d1ef388fabbd6953fed436c93537ba17f818617a5c70baf8721b274a58dca11461a64fe7c16bf5aa8675c18f37e675fd63f842a4c74e697c65ec279f7efa953030c24c376d0194b0e91268ba8c4def9b29653f65d04f6efde49b9f8cf3935d3f39e727fbfce4d74ffef9c93020d94f0efae9dd6928205bfb6651736a8da355a17bc26bfde6f1e5ced9b777c1de5663174900c2cdc724fcc027f631093e3adf3d7107698608d3de5a84a0c907e02312d0e0e43bcedb2a7f280d726e31e4ed32885bbdf2bcfde58c55ecd2d3e82724baa43ddfb75fdfde3d5487f3f821d1282122fffcb3473c2b631625e44867a5ccca1a560d6b863bed3b621a215921941091d31a96b7f9f6091139b547a88b6cec94947dfb95b3cf08c9e23c7e454856c89e3a357d86c34e4def668feca06f8f5ec342098947fa25a38c71b25ea136a71e59ed72d62bd46683883ce491d53d325425ad1cdf7c7ba90ba07ff7318b0e78e0a735b10b7cfecaa06fbfa19c459876d316c0eee9150a4c054d5aac8eacf67eb54f59af980d4b705aad562b0ad60f90c8091bc0d8a2c5ba1d6b59cf3aa815637fbb67a405149680d362dde9fabe33e7fb095d4081498b75e7ce771376f062ddd9e3f3f3ed77027d3bf705d1c918658f88c8311e054473d62ceaf42ca52d40ffdb3de0c72c3aa082d74a40a470c261fc97760edb5d00ce6a2a03c8af56ebb90bb01cb4e6eca30d245ccde411163a3ebe54f0f3a325e0f8f83a4114be2b82ccf1f1a58218bcf7f165021efc057dcea40c3025c6887ae972099b4fc984138b0a722468e2f1f1a582333cf8f1658219fc057df24ca4448233e4daa6692faca273e2e0205603d0eb220920c8640d38e0f9eb63c041ce5fd07b808311fcf52f80dec7170ea2f80b7ac8ce79fac9c38697adc821758fdeab49edc9042e017c7156cdf9821e7f197d7cf19481270c7f3d86d344d0c55eb147a79207f943089290c3fa01278b19ab638f2b4a081ff1c1e6c5625bc3ea2277c7d0e8d6e0400523b45848584ee074aa4277b3ec9b9beee64905cfdb3617962c5f72374f22984cddcd1d86a75357a1bbbbbbbb793a77b3bc024bdebab58d35d9dddddd2fddfcc2967bc6599c6926939461186551c6c138d86cd6b18e9d4e2f2f55b8b9d17ae841d380888991dabc993772462691c915a413e9e40a2d5b3e11e68cd3355d11280231b7b6fd9c45b61ed289b8cc28b4ec8d8bf4cb1ed289c8313429a920935d210c6362a6262b7d13ff80a483a4cee65d8bf4d374108b479bb6887c7905cf939be4298017d4bc33f10f4864583cd2d9411dee6964583c5bfbfcb6a8205a93b20a52fe8812e8227b5f7bfc2a1120da48c7debd79bbd4ba393f9ae64fb35302fde814fb4f90e9db83b85cae76cf3baffe400199be391428209bcfcd4a1b2b5b4248d7c72e7b2416d287552367974b58c5bd98c81fb9c591903d225bac621f55e9239930cd36b59095d44a1b8905874ba4e9bf7aa515cf118852103c9ddcc3302686fe6095e7ec42046195fc1eafc7ebf1ba598881091e2c0b3178e16f7bf13c6933d04d8c55977718c6aa988518963c3b77c1aab88513feb217cf5cfce526bcc3aaf862c115ac922378f66e4a669ed327f5aed3ca245553c221d350e9db6bdc217ef7ac53ce61d87eddc74b10a26f1b824800b72779fc689ee896aef894f6477379a72f2d797b4f972e915f8675121808eb55645116e8f1e3598461ef9c1e35012f6fc1ce5bd020a6454d8f8fe2d44a170fc02b5dec2875c691d35288763746d36ae7602535cfdab5daf957675b1a8632f115d32eb2211b8067bfbc922e4e314af3c8434cc481bd2df5f62f809beb704e5dfb82103db5ee2fbce26c642dc43cb756c1d216a0ff07b8f8b657ee3cb35ce93a71c87e9a69d3fea09b1e5f2e2ae7a564e24e264ccf795567736a86219f73ae79ccc47f4eaffccfe3f70d69ff2ccbe7afbd73a2c8730fe15c3e13cfe43edfce9b173f203139ea0d8f29c2618c16c0f61b3e8f1cf586c7c8e722a2dfc04133f26e547b07a0fc06238c1744e7239ff5c8741cdec51ec0f892c1cdc7079d468d20b048ffc8de9a1f79c982258f1f8d4e0ef776f12ea28801c6970c5c3f7217efdad3e611c091b7388a778b4ba7496892110cbc29b2ede30edb374aaf74782a65c6a17432026dce00de58903405a8c353507ce42e2e2ec156af8e48960e8b6af1c8d2e13a2ad829e92526a03fe963165244e16dd4000374f1167f79217d3f8658f191cff04b953fbf2046ee6251418cdcc55dec90154b471e676984726971930dab4c1ca25c6c0f7e97919b707a65d3aaf8caf9913fe3a59b6e4c2e53925594c22cbe6400f4d253825c5a461588144a5cacba602b09ab62135ebafc68804c61454b82ad0f89d0532ebf23449eb2d3a753327ef6a084e0f094a7ec91d9d329e938bc86d53c003980c3c3b9d3524b61451d71e38647567f3dfa372e40ea7ab9922de962557c95e08b974e93b02a3e4dc2e18866040190c5e571015eeada3e9a91e3a891d5dfe2339c8455232b9dba585572e99dcb17a58a1ab9fc91e7a8a891a539acd20cc014179b22e350fa04028862238723d98c30231b39747be77b386a648d2287a0bdde7bae0516623fe3a31658987dd073fe790c64dfde8d8a3a22fa117a2487b742ce811c1e8b88ac90779af701e19cfd468dae7d4544cfe137ea05e48f3cc547a451c94b5eb2773ee81d38c31e87a0530e41975fc947357e6455c9820e5aefa60a5006dd893039bd92aceab60a1074fe8a08b1e84ea7a48faa7c9ad3abc8920ed6ea3645465de0055bd773b546557efc7cccf75c11a608a0e77a49da99fd7402c829b294598a13ef73cda5cb8f08ce3f1b390c87606f1bf309a18e3a223a0ec76139303d7a64cd3447568e1a59b65e2aa35eeaf3d24973e7a5d77aa98d7a414e67f38e93a6daceb50767f2192ec25ee8d95b84dfe46d43223e22a49b9cab139cb3abc8545c3a17e1577193153aba08adb8d105151c4a2a7698b64851c1aabb05abd8aed8ec30e930fdb0eaeaa43cbc61d5d5c981c3aaab73c3f90787b75d69a9c0587575a6b35db94991fd70e9295f0071e9293303b8f4142741b8f494a017979ef2c4864b37b5ac4b37d954976e72b1ea06c07db8745312565d00788f1c565d1a5f712961d52d80af24e150ee20e00a237a8ac022888f2f7171e9a6578b4b37314171e92620565d9613c0a59bbc60d59df177e9a618102eddd4e407976e9211e1d24d5f1cc0a59b6643b8749313215cba29a8e4d24d4fc016c966e462d5edc17d48c2aabb83f390330025322e5d65875577c5a5ab5cc1aa2bc3a5abf4b0ea9e5cba0a16acba335cba8a0fab6e0dff5cbaca12565d16f75cbaca8b5517a5c2845597860a10abaeca572e5dc50b56dd1c5c0797ae1263d5c5c1635cba4a13565d18bfc1a5afe0f4eac86409c0a5abc8546afc2e7e2af6d6bc8adbfaf2006fa99e84936a8901def5ab463824dc860374d8f002e870f7a1c3fed0014447c986bd3fdceaf0a1a3002d0ed0e1f5013676b8f7d8414363007baddb08a2d2ecd841e3363cd6de1edc0fa7b146a80f7b69a80e1f3ddceab0f6be78d561abdbf0fcb0574787fbd841a3c30bb083a6006ec3d3c35eeb0678b1b77a106ec301ee2d3b76b4bcecb0b1e3c586dbf0b8bd3a3bbcc5013b1ce0a3c78bffb0e140dca501e10fd7c509608dd0d0860701a11161c943177b11e02de10f46941a103a4a122e296bc37309e06f8dd05b7220806871972028ef405823209802c26d785aec2580a358235c0b4a110e84354211602f10340c42006f095b5aec7547095b50dc86a7087b75420f920222f41fac1110881f5abc08b717c583b84b03de5e02b811a99293ac119a7a92a75c52f603363c6ec343007b7552fe0d28a59cd40002bc3b025cdc08076bdfb0363c57c895711fac117ac387d277007b1b24f97043c6de0478c91a016fc81c005c00e9868f1800e6b0363c9788cb03f561087b490e5a239e10231f78b0d7071f000f6ec343b257084e880fc01aa109b07700f4c6104238e90689646fc94737ec076c784823b7e11162afce0d1fc21a010760afcb5823e00064dc8647087b493e44c9de910be1e00288f003e4f081e638c0e7a51c608e12e8363c44d8ab93c30fb0001f72380f0bf08107b7e1f9ec2d3911f6827e00f778cc1bac114a85acbc9e5f1fb1b246c0a900219f35c2bdbd9ff774ae46b8d741c2c3616d786e02ae0e1e638dd0558c378379a583bd2b8fb146401c3ab4bd27ee089f316f7005582374ce3879cf6e9ecd6ec37384bd3ad36370dc307d068e981bdc86e7646ffb897d867bd608f73a3c642480be0e8e15c52164c565e0b057867bd688f7f603363c9fe7363c09b05707870be1b1b257e7c659385c076b04fc0fd8f0ac74701b9e157b3f5f9161afe7327ca611604411418838c01042046100203f7cd400788f0a00a7a93878012a8c13a0b2bece4896001c888a83ff5061dc87da030f75076609c007507170990ae3abaad2a1e670a45902b0363c01b02b381c4a00d8152b38941e5371b03a3cfc860ac3c3aeb83a257d47c5e13aeaf454c5e1619d9ea3e2b02bad4e49bf51a75db9e994f4975ac36d5416b715e5b5d270af35dca5b2784b45394aa5e1a55ac3c1cae2a48af251a5e15fad615566cc62559ca0ac4a100dabf28443e92a55f433ea56852896e0e44f9563c28d1576f0326aaf208a1f32fc4add4490c5ac0bffea917d7cbd8a4b15ab22638faf37d5f8312995c8c83fcfde9af7bceb95edf90c7fd507ffe8f3b65cafcbc9b4bf9bfbf66e22503c77bd4a847bce7984a34a448ef1edd922fc1ce7449a731519ab545c2a4e5482549efc4aebaed894fcaedc3c8adf152a5eaee0bc741a359e80dcfa980286184af76aca186228fd33c34b1fa5e1a593c278e9600a1b5e7a298a978e52630cafe90329b208237d86516afc528d0fd6f8a41a7f54a317bf04051070f197f6bcbc348786ad7328bda6cc3a255d646ae11c91ac14591797f0ca024e8b15aacda2751b410e2b7e34415264a525807e53642fa308c35f90e6bca44a38259de670289d55da424ee9631621e0792e8101f4bf29b2d1c72ca2f0e2d9de94a097293254ce0b1259b321a1353490748df43e045dd300941eb92eb26420289d5219a9a43d1dad6d737773b76f9123478e1ddbef89fa052f6df790bd9452dbb6c108231d5c02c8595b02bab9a04caf4a31d5b2bef44ec11e2c4141060481ecdbfe957999b8437cf9310b2954f02c787d7ce5e0c9113ebe56f0e4756438ec618643e95eb3643e01ec5b87b465e2ca484f42269e33a8e44bd675510f33a6d00c08460000007315003028140e0ac7a3b1248f036d1f14800e7f9a4c6a4a1ac7635116c3300a840c22c400030020000001323443430502809e240e7b273028cb9cfa7abafa8f94f3785a5f7f5f9ae4c797ba2f0a9ee60a11d611b88f3e380b77fa10ca33e5b894251a2eb17a3c88259c1adae6e7be465a458356b07cf87ec2535617daf6b7610201ff417363c0430d1f8a9dc8314f167feefa4bb8151f98804770a3b5012f4735bbefe1909f351f981a7aca3aa99a0c471daca85813d10a2702048d4dd2bb7d3b67e9daa4b65c3c651237bbdb19746fe966fde74ea7dc13766e9d6deeaa61aac924e3518324cbccabc37b230a35c1e98b912a63f89e2ce401f842ec44f958bb25e1a9c4ea394f81102312a6d7efeba2c288066c269e9dca8c58764a3b5535cc259d404fbbe5422a3a885f0102d360141f9b7030a79d2f1f7950d9ccf08015d6cccc02876ec8f18c26a814480566cfa5d90646e43d2f1f54f8243d2f9aee120034b0cb68c84d126750f84e801c2fb79562c031cd6009429a8f731a27c1b1b9d6f9f8b66d330205a252c488cca63e20e3885d84f7eb5c765e332358a0e4b237e93aee2505fe8a5c6c702c604c1f66ac02eab6f614d1da101d71cb98a25ac075e27410ae7959b0b6ec15bf59793188b1ea47eaa8747f8a9774083a04c6c6d0ed25d75e4039ffb110fab2f1f0ea80398104958d9ff57bbee2a01a830245a47f1bdc877a3f8f6bc9fa799f9c461688ee06ff133f33154976181e4175358147691997bec5c9630aba5954866a19e20f1124bac80f681a7ca7bd6d5e77a4c2ecd97e3eb7e6e3f72b0c9089c42390a4a9eb0c78c9eb23c2b42ecd2901d610c0acc0fa0b3f3c4cc02952760fb27a972d28609820348bd6ad7c797ebeed80237a255894e5af12e8d7529b8b4de731fa2ada1d89f9588aa68e5e22075e4ef7c1d3e113d31ecfcabab4a7f68198780f51b3801665125f5b14badce6336f84dd798ef4c14de5e1598ab35f8b09d03b519c5b7a2ab92baa0912053623ea139a714be31341956ecbf25535e83272ba138d5722e205eb28e9a5ae1c83e1275a31d35038c9b4c3b59cdf5480641a10bf11991f9059064cf7817c7ebd68d541d53e1e1fd60be2731910be8644dc47228a16947e330e7e6e9e0993d0e64436421fcb6d1773f614e8c7dd61693e32e818eea52e81bb1c38aadfc0605b5a2e29db75098bbce0f616ff1f0eff01c6762e894facefd7d58860bfd10bdad0eda62b80fd9260091489403c9f076c65d95c896efec9257afc9cc280a3f09a247c33fb99c46f70e5343c160b5f9ed4c41094bb5f0700351294b20a6331e61c23586bb6c6d810f8fc58255c5cc06e6ec2f260c5f418c3e63c9ea94a838e7316e23a5640ec898cbc2718bbe8b9b29b01afbb8af625763b0a3a8f5b0e783e8383507ec38b8c94d7fff2c50a7bad38d3011de1b5ee0454e164ae1184d257325e57b424082935ae0ef05845329f749c5e97d62c69aaa854c96affa5810d8f3f8cc640400a1bb2a7315e72233f490753dc523495ab60e7a26114fb087c63b45d69acaee1b08ba77c8d73199f037509c966a87c975c5f628c5e6acda9c5e488df01f44428108f738c3063f2910434537d3061d139af069d6770cf98b860626a53ea3a267f35a6aada4ba60b3d4e488b4c569b9ec77c03d8ac1afd38e29b731e780408eeb2e9d7771053e71e5534a06d944f261e291c64a7818b69c35fab0a8fff76a6a43a542adbf1780ab4df2e75cb67fe2b4fa28f2ac19aa259b42f93ccc665f663bf244d356ece7b0afc64921285188fe156459b65cc70c9eb565aa47d674864a6214ca41f0903efda5ce8ff2ac08d7b03c245b98d57d80913552433767388c0b090a0a64853919c06680df1cf0ad8a97956536549bed835791015801f7a6bd42a20eabfd73e721332faa617a5c732ff3b6231f3462351483c1e04e51a783d8ed7399686cba38fb4a91d21f093ae439f75ef99caa58afbc8061791376e2005b8418b6d5eaaca8ecbe2b5f5bd0fb1d1fed9c1a57e63cc2c72a03c67174d43a9860d18438f1a600c30705bf93882097fe66ced31b0d01c6133dfb52d6b4203dfa7c86d11acd54c2b80079ce99ba637de86f528cf691b5487a3e8538be9b1e0d569ffb601928a6609a16e55fe7fa918553e483cdcd6bdcb8756d53ecb35ffcc03620cab5fdfe8dd44446fd387329bb355967edfd058e0147687b755a130c461745be0d32b2a0c7a114a040947a621e18767b9bd5c6981b4a15332ed5a572594201dd962f21df160da67c2005ba51296c003430214e51cc2091a7672d976c9ffcbdfa67302cd2ea098887338c4628eaf4bd35a8633fab1d930dffc3a9957b5432f91213f778f3b8b98c7c7a59cb71e10bad2717ef5a05a18820012c7f35338cbf16e3b86bc89be8df7b93460e0b9e123189607f91214ef670aa6f9cdae21cf44d313dc9eb369fa111d7dd6b1777e7ae8dbcf36400a151b66b415ba5d12972a560e35c93c664a24eecf63bbb5f4fb7d73000c5cd3c344854c2441a8724a7777be5e1cb62d7e1cd495b8f63fff6e4882252827c697c937024d8c20a4c5100f6ea2e0933258e112349621cfae133ecdbdf5cbd406493cacb4d28ac1a6805f949f7694c88608b4e10de64fe69c3c99a323c26a4afac079df3e15066d950dbbc0ab961bb35048dbe1c7474e3b3fdf286c815202f5a34526215cf1cca73d572f5c3a810ed0409796f0d68295b893da01ae464f7757adf22a89d641eb5a18d0cad4ceec072f64b6b07d60d99e4ecfe61edf6b942fda110f7434f5e8a24081f1ad24c4bb43019e75a73ec70fb983c2ee787ae0e847316728d4d0fb1fade96a6778daa3311fea7ec84a4d265841ff1cf393742a578b0c6a8175edfb833a5136da1d32070071eda7302611b6e1e318b5b5ac5a6fa5233fc155e71bbdaefd73007a6e6ae5546c489db6f86488c8b33f7220ef218d68878c0339e4b6c092a904221938a0212c10bf821b559fb5e7bd7867e2d2cd19cef70e44ff3c6c072b16dc20100fab1019c48bacd007e0b81f5757acec2c1882759a5459bdc1f7a2e0a58974229d67ea4cd5b891deb660b43e192647e9ea3b700a5af5f1a218c4fe6c36214c8a947249480219c98dfcb5361200f4dfa8684a09e911195cd7cdf0eb190ca228ff4395e060185d707ef066909be04ad8e09cceed1f5c067338902f187d46eb7f3ec48f2fc81317912f62846e0ed3c6e13a6e696dad8b11a23c84e8057b9c669f3ea607f493a3f2b8f99649bc1ddbbb3faca517fcf293d66061ea88d8430d62ebf4716d6e5c524f7da675abf9f659fc67cbb52125e1fc41a8057e9ae460de41c895c7ab2e5f34e608c89cc2c6ef1fe23eba42a5ef9ff0bf51340d89fcc7e5174d7ac6629e9ba98727b9d090525ad8ea5dbe04c7ea255e21ec7121bcf5f92d678345b40fd1fcbf8992a14a0325ff2d7ead00b660dbd9921204d6c353e108ec8f3d6187cc8e4a07a0a7e784284777f4a34e363d0c77ad694e6064b4368503630d130aa917d56db09408f54cfa8b442898a04490a979a8d9e849bc444a4af289e6f7d3f91b958fca8b22a5f5dadd4f537973a08e101e9925135cd03561cee159f0c40cb0880ef0aea12678e62df434751e4838630d5a4735af0624417edd7ed0e2e4ba81371e77393252e9952c7c06830ee722f9bea2b87603723000dea28d0e02bd4d9d30611621e43971fd274f8ddef6f39916a9adcf277d9a3e725dc6f2280c6a74130c5fc4804616e5d78ea55abf0294fe76570cbadb890d4327dd72624ce3e21559dba363e2b72c6ba414ac3c66dba807152216b41bf4e8a07a19ab57dd6e0b62f5e9b9d9381a33e14ea797c10e04939f219b7341b2937c9732759e00ea220bacebb588fb49c2214d0c9b6e0b52ba300cc05364d131911f48d0ff35613d8384bb57ea8c98db50a4dcb1f43a1a6364725ef284bbc2aab752564c3a3ca9cd47c91ad8de805cfc3dbae548766f94a9adf8e9cb52256c6a2ce0492bbc79ecf229735668843b58ba5d28f1719b65f55f7a48eb48501fe959af661ee79b842a2c62849bc6c5c6dd0eceb0d5c9b7d9bf8e311d1614e489ce7d30745d6e06dcc4d6f64f7e0580b3ecdbf5f7bf0f28a61b5f08441917ff20b0e9c16a14a20b007ff2d7783a0eb8ffe54a1ceaac6c94dbc50d742db975a2c7dc51eef145dc4950b3f7504cbbd0f19f8fdbca4e0d818fcdd21d3e74a60dd643b86bd96a694a73b2d713062941fc4d1496934f0f83ee1ec1ef840e780b300b96e250466ac817ed2d77ab8aa6aa9c7a4f995dd4d44014a25c719db18db3439e052a5d03d70eecd11a47effafa138df44263eef0cbfde85f582dfdd6f70f152bac1286f7f55f8cccf61cf72cb123fa47af751f9a32d2c0db429e68dbe4342f40f46b0ca8c342228e44d213c3753bf7ca1c8031604c7d528456b3b06dd14f54ea31e5c0a26d7814db647ad12a0f3c4cba34e563cffd7fb3d882a7ea906cdf754e745a3a7959600ff5afa9b734f27d83842eca678ad1ec622ccdea8823c3f3176b8efb7115a05e93f0ad50fb7bbdc2e14895624dd18aaa35a7982ba641340a46115a234cfc353c2f3ab336c6dbb235179d2795823391c08c81616f4c1562273cdcc3953e44d68a3ac44324b9713975a9d9666018db023b767327221a197b372351a24effd980b2f79843c50ae1aa0a8973b25d54452f0b5e32d2c4d255be2e0826ed19e6935fd1a5f86b5873543097bf1a29f4d57cc30b8d8fc7dbf267a0ea907015b2de5e74da2d229729db0a126756aa208e4aea62a10c6002f7cb3d7ea953f9be3e910181139440cf6efa64bc77d83ef51da0956b0fa8d6a78ca2d1a881ae2ef19a1ddfa1daa0e0df668541cd1a610e1abaeefb716a6c41a5e91d1ef766b87db8d5c984873f21a4a2e3ffa1e70dc202d20c6e057413f53e0e3b165a6e8feaaa5d5959e90e19533512710b8ad009060237fdfe9ac1d18833c6433fcd360c4defd6216e0488da0d6ab156fd23c411eaba2a67c67daa8e61a82dfefc82eb6666112106d5ffc12ac5947ce14afea363a3dd18587b0fd5ad4f0864d038248e836ff29ec94eb42d1145aba7642f76effff1be747288c3bf95325e68c0d8db37e235012f0594144fed435d481c6e6071c585c515c2b7c52eafc6617b1c311d0e7e712907e0a6123b5add121b6bef703510ffc581af6cf215b6cf17e6312bed4ea02c502d4098e382062fb1e76ab251fea322a831835bca9360252b327a2d74b92ca0ce5b9e361e7b5b94f188a6c8c0db6343b938abe5ebc2393a56cde099717257df680af80bda3a3c137026753674766a877961d68df95dac7ff740e1b0e8c04d974be7a3b6bc26ba89c2e82ef09e16c943e505eaabc79f41787dae76b89e39fe537b18a2544108d30269339c5634cc1552b23bbfb9b305d2e840621c48924aff6cd9596a3f9967b038f4adbb4f56098986f5ee3c29798c1221c3d785ac70188b3469da04a8433aa4c7cde3a917406fd3fae23ada1a48f54656f79b39272e9739aedfb458deded0df9262375d4d4bd2ca67de5d0605cd3ba88ffd93dbf61acd05b80c2630fbb080770cb2f129dd642e9a0dcfe8a38d547b879454120296ca3d12c61ec35581988846555f2b083092cc13a85ced8bda97f6bcb1b7616011da6778619ae78ee017fb0c92b3a701a33043667a8e24d78e152325d1cc50141819436286990b197292fce22a26fa396c0828c486c154ed1cda8e9ae76b525161d05e0c8a00f92bb87d822e38d2b8e638966aa6288bf478cc802e84d1c0279c3284c6e2a33d93a8b5dfe980d1b17dda7bc8182d1afe2524c7736a28fedac880d3e2a8672d5e98818fdfe2dd2bbc8bcf994050363f6f2c146fb6286c408e3c7090c3d513eb82d687b8f244342ea1b1c72eb41562125eb46f73df31d05e88c8229b38743c801665012cca49255865c14aa39a95a4146e48aceac6453064e6dfd03f04cb075dd6822194c68336bea0400c1d7178157d5851ec45b2f17470978d022ff3f7a05e2e476bf494a79928509f286a1cae8876a8e454b92cae3564232877597626300cd44083a4e39b8ee40a3f388c2123f3e0db90f81f4dc16cd1d6463229b0e1cab1e10dea415a74e9d85e4c27edc97c6978eea14e94d413cf18646d82d19f878fa2578e4a83f562315e5295ed549d5cd21b4103a24b291f6d8943bff8752025c53baaf59bef097a794e50d07b8314993f8d3c8a394ff6ff45bcfdaa3855390ec23fa29a4351621a57b2936e411d0bd25ca9a137e1fcc8dbcd782f015bfa12daed274287ac03614ff1d7f2625e21c2a13b2229b2b17ef07a7ac77373999a8c66702ab970e927d7827f23569319de6813b7ce4f281ce6230b78758d8f40b1798c16b81b08b0cab9bc428b9db4e0f7ce05b4448cfda0f86ea49fcbbc64683e617115bd2a77b138e597a3a3c2112da629dea33e01577c731d4565292e9531f27afa3cd5f34ee87bde77a8d395b251f828688ba4bfee7a278ca47a3b1fa1bb0801c4edcea6cfddf3ebdb54f7f86ee04c769c3ee5a1af821220775aa1d710567eb8f5eb9bc859428be2adf4d3b15e33878db4af91a3352f1ab3deb99afcec144bd581a7421accb999e2e07a7db1d58075683b4e9c6a1df076d4a37ab5504be94a0aeb9befbc5c28506cabf43088ddcf6fe345df9b40666ad3f9d371b701e4a067160501ade5fb513119c29d91cea6233cda84a00e64419d8422f00e9ada659d2a3ca0012028a0b1da824eaf56cb4208d769a93fc346136ff6dc3515dc39f1a96be2fb81fc51c139d49f45455b0387e77c4df82c9aa60526bcab18f23209b163015d577364ce19dccc1adda7692c67f62296af3815432995fa87eae8297acba443292cec3b6693e580b5b757e3f9b905d4394183dcee753d5f33ea83128fdac645a9b5550a2412e163d88d04b326ebe7ac61d0e01a94d1bf7b5a1d0cd418cf7554031c8dbc874eca983d83735c5472c99ac4b4ce4350e6d31023666504cc97b908cf8d852ebc339b16dcc5faffdd2d1b021c4733e6a9c80f75d7f2b09990337101d522d2322da98b4686d59887d60b052ca1e01bd76ee881730fa8b012a1c239b74d71ebb8bec23225ebe3fd3adfe6f09b6f7366653003ea06fe0ab671622d4713990efc481912382a0f8c080dfa73b28b82b9b2545b8fce8ac4185c51321ebd0401a9588e6649d0b190e1601480fd6471c4b4c2e17850f72b9e81de177c2fb9058ae4c0d13f59c22c5666b485c703810e07a2b90e05b3224ee286f59bfe59fc8016a1434dda2aae7f11b364083c127c73d71f85b52fdcbf76f59796eadb974a67e81219f101c0cd734009baa7a8bbbeb39897c37648eca284f063890afa16bb556d97afe0b9f5e2b995fd2767a936a27220192684821976434a4bffc4d1cb87fbe57239a0e82579c565824f06e753233a990b2e216258af209262059a978196f54a3bcaf375b13f0455af40e410a096b020f032046cd22be7ca88337d2845e2da2389dcba5f093c8e45b5e5f54c2aa08c4766080416576d6516dc19ed8cbf4694b1905414f4a249e754530d13e96239b1716169118139b4ac9372372b17321442b7f3e007ebe031742c0d71603171e1f19f92368b1490a41addea0e659fac700a8d9d06bc8b384d576cbf1e6439e179e23ba2b45646b42181647bc455f878a66ba255a26cbc09b68680928c1ac6b6ed50e55c3a47a240efc690aa5a18b30cd5b265500a5b405095a75d626cbc742813f2d2bd9efc5f7d44c13bc4168772333d92acac92ba6e6a14c994838d5b4c01840751de368b344037c7c654a9a2b5c603028b5004f9376695ae9df52355432759bf17b7e90c478578ab33745d587dbfa7d960e234235dacc518511be34ec5a087afbde203b8da3a9d5dfcc03e3c8bc18bf36e97d182e0dd53aa1e72ae908f6ccdc3ce8f760e34a98dfb585ebffb211cf7c8ccdb3566f120caac6007e1d753cf3e0e3ae1bf11c5393997e62e9a84598363ed991a89a28c3b0709167c4b3e8395112b174d8e74cb3c7a5b7b5976791ffbb064ae1f4f68a27a30d5144f03af3fa5b41e14b080fe2090448d1c287f4d3d12f00224741df08135cdfa1e54409fb2f6bc7073dede047201bc66ac74368298a350adb1d922dfa76a0a908325a4c48c2942e838a875b55ba589cdf56a712fd2ffcf90e2ad92689dcd82bab0644db5c8e32b2350957732a37debd1431686a0789f5d3c29661c10bfc40a6ec2272787eb389b1818669b678f0cb4afa1ac610ffcb8010cc0f2b64b5f5de43aeaef0205d450e02b4bdd94cc47c6477f981d8556cfe77e12b8987572ff8fa4d698d297300231ae02a34cdd374c8d001d93db26791cedc04780540527f81b439e4491a983c6071692e7a915efa82d3175d7cb904ae4c80b3701a56ef469aaf144c33441d6b00dd61325513bb468e47d3fdf1f79718420f2850c04c0a7a8485d955e6121e57da7b5b8c9b705535309c00ce9fd0aa8a4239183e1f473b765a2b51646124863cc5a393e41b39bd6e261f66ed238c3a8adc5bbcf567fd42abe68396008ca25caf4281e7eb528910bc1292e8718722177566290cb728b5297f219486e00ae25c223d070379b1cbc31735a72a175f1040416a2e5a69537d86d1364b30b42dbe45aa2ada5804c6ff891b9a406d2ef5a622deeaa719f0e2ff1590953a4c9b246372de2d82f007e458d9c4dd1454b7f0a7bbe87bd08414f73fc20a3fa3afe71dada26bf54512093d3fa45c8a660020a8be8ae57236756c20e2bd9638ae22017dc6cc236d423e40758ccd85f87105e6e68f17fc8ee137005ca53eec5e62d1888a5d1e03ecf52c72f6128a1393ea257e816026d9eab7b8822979e6e4d3ca7d603659a90617610a974ed219bb8c071524b7187999d52ba129afb43bcf0afb5d7704001c0888d510981d8a1ac1420ae88159486c549573f956965442cb53f56612cf721f2e2e6969295400287b686832b81be48df362b3d691f0083a0255b4674b7cad2ab2e34d312d6d3322fb66e45f7275630cf85b6230e1475026331aa24118ef0877a4b5c48ca051ca6aa0df3c21f673e513d273a22cf139764db390a67969062d9ffbdea4c898010e1d84a18fbe20375a28fb086b1f90f69377741ecfb50d4cdcd2f292ba596fe5c5c113ba0e46dd4d854efa804c07e42b002e730b8486ebea45da9e4f5f4fc527afcf05cfa928ed21cf121d63076c921bd191776ec7b881037aed4a954b37beab1c32360ad18bbe2e1c11a6b000bb9590b20b6057738cfcd5eb0588204a3f4fc1d831cb550d4064b2ddfb150ee8ce95459fa3361050407008e5b3176ac43380b3754acdd8da8d8c4f474d864647367242ac13ce57724ab33bd822dffdc7607008152fddc28d405cef33ca9986df47421e3269d3a8f44a96c594df2182393c2c21c2a7a13ec388977a0e8195d39070f07afd812079f957865e361c9abb7fcee4680db27ebc2da76f7bf785a5d4b6ee17718db3e8ed6a3001edc00ab36bd96e27f1f34ce3bc21e6fa83cf4f543f2ca9519a918477a47c0cead2e6c6feb0ceeb412ba1bb32328cafe3a49becb488401c5fa6e7edc7873276948737904403f2f602dbaa8c8b847cb29cbf92e8ca105b83de761d4b5cda24cc79b89b050f7d6758cebbdb26d2050abee65872c1c44c34b81c28a7e246db610936670df3deebe3b3eb522c78f940b6eeb16d3f6bc968cc2bb0451634e901c2943ebc3163c67a81002b3d838d310e5ba881ed830afcefccf909f77825736d7a124614a7ddc0353990b88f1583aa58f2cbde201aca960e1ca1c9b8ddde932cc5bc5d051c38e5861b876ea7338343e02650e1b604b8ceee67420db0efb3ebd2daa5d916880160e577ef46df0957c66708e92de6f92bf720dbf9d0f24dee86c784cf52d829827d2fe5788e17335c9634dc5d3296bb810747b10430a6a5841d868d627662902af3cba5b85090bd0308e5708e82de033ce1b06819bda6228526ed24827cc8fb61c5b1026588ce4923ccb739906ab80cafe527c4935afe14a1398c54938c350478ea7bf41e10fb65e7549b5c2d7d58cf616dd3c7794ae103457ad3921b3edae534faf54c5fd9e6d68ddf0f3e4b41b221a8af34d08924fe3833ce88974795a2fd801d369b9db7b7ad53a2f8370ed11ce787acee7c43025faadff46c721d22836fc53a6e1d3b70cd20a30bf2a07f696ca1d798bab37bae6dd94b137d5332bf06a8e186447ba56e03987ab91b7f1750dbd911e099a4a69b42282f6d01cdbee7bd97ace855f37cb7c04eb2328421369ba2bae7936b6b72bcf5014d35ad97705f008e3bde60626f207197bf7573501c2124a451d225c8c6b077b81c5eb82076c2ae7967ad752c3d177d42d388b3d31607d86e82473ad1d78cee801a50873080652cb6bde701d7652b0a19e69809181ee6d05a41522805a843dfd3812318b1e9d5bae0369ecbec7515882f2e42043cd333d3f46aef3e4c85b4ae63ba797c891388c7bb2420b1c0200801c8a451cb06d97a3f5da7bd1fb7642da1e52805757dd168f2f588e36e20abde34e1e9fcb466895405933a73620626528d7c331da979dc7afe18af33eff5843c7afbfd0442ec3d0e5da81384de5df609f4bdf659c7f66e29646d5f148376a17d3925b55fc00f632f3184f966786848c01f38cb6e1c02fb3a9825c6c6fe171cfa031ecf3e656072da1b4680fd626fa937870c8d35138b56e6532e279f20c7abc4807f33d34a26443ccc8d9e37cb8bbd79fd599229dc5b2e450ddd45229fb408e99c2ec7aa598e53733b7bb42d281d40dfab01d20961db416cee17b9d0fa4a97bc8ec17d2e5800bcc7752c8ae8a6ef3539188a007bb6515f24946e1d2f1016489194f534e0355a0cc6f490882fdcb896c2cdaa2b719220c814406527ae1bb4af44bb98745cd0b5982ff28bb36bb5a103f873002990fa2540e922249670dc3f4a89f46dd397c62f20e2509887292095dd9324908ddc50245f3e777994d501c603f47abfda16be925a2fe4c9db91100560722bb5a9b9303befb010b72c0cc6189d7160f8abd578d508011d6c0ae87a3d19d7f13541f3e50037159bf5c8286604edf6f442ea096ec0168eb253eaf5410b39c30a2e04bb8dd4144a10762046821569055fb539f4208d0feef2192659f1734abd03277892ae29455a87cc921a836e15188e1fb8713dd24e12568449929ccb4b8608d09b3c7f6e8b1c73e1d05e59efe19c082c84d760235fd4131084cbe1f04ee4053769a0f972dfe3718e4d8464d97277a4c441b21a6a0cc502980d54cde0c204071417d4b16ebba638fa048662e4e08bd6d9c40bec96f184df22388571c28b51124839b63d9f0c949ff6c3fed24c4edb5555ccbed5af1c8aecc1952b30261df1560988de8b62ef2e217de28ea80a712b597a66b022aa12688c58f6d4769455b10ae6df45e82e9edbd034c4ddff5001df88df4a9d210b30c6ff9fc5f38dd5dd4c9c98281f069829825806344f2ac8b22325eb313405491a3d39009defd89e9c6c974f46d4f9c687fcc0c10470005e972d266604aba4c13b8dacd46bfce08c5662f5b0324e502e700addaa36fb237f4765832211ab8ff3adc3a4b4d00bcb0fad674870c4453c643a88e9969fae768124061ac95c2f81f647a7e50f7b249ff621d240153bf9bd40dceb873c62df9a35d32af42e254414a9b3a332f3408e8c811f620805b8c8265df26f000558ff1c8c52b51f1dd1b7ec194a3fbb8d4a3476802bff922677957446926381e7151da44185e4d374a3d7c910515a07fb573a3a8f9a42efce8a29ed22bf6d735bd5b7452b075edd79ab4524514944999ea9d6a027a3cee93c050e51eaa2a06c20c4adc83da7f11e416478aeeeb1bc4e22ea795b81ce195a982dcf4329a5a0026857ecbcbe3b65b008b2d3a341681b61d145729bd23c22f330f091a46a0b380c72468de105c13d7e6daea26090340c8c78f838ca4d154a2d02dc1471974f36e3d18d98a1333d059ddc60d6d86ac8b300f7c4e16bccab86c6560bf1c04142e1949b80c7243dc60cd68fbadb110548fc81ac943abc4befb33314e6f66f52cce6709b86b68157c66d9f4a28d4ae3e4b08bedf9e3625d3ca683386b71f263d5fe0a26b07d518795518028e84c107cff0156780de7245af19ee30bcca1e34cd34c5d5fde9b9a2c443e59b24bf9b543c3e9390f1b05a47288dd1a8beadab6c53fcc95de41736f3910fdba79080dc76c779de824738b40e88c0a8515f6e3493b544d4526a2451fe47b3f6f8543848185696918f6a372f97d0c4cea59360d41a84ad7c92680793e35bec91ae630d57d7a62128bdc79c82844535cc6ad370f3dba3332d3c5ec388204399faa4fdde3c41efdc4f30f09502206a7d4736959841bd68dc71fd4baf97e6b3b2d0602c0f78c58bb4f69f7273eff8fa59868c174d84f71204f186e4530aad987ebc5327b60bffe9ec1de5565f505d230d6caddc213962100fd2060616a712dac98215bd3aac9c2c449c49af7e44454ad24081b3c5879375aed6da3635ff5ac6def1088b75144732ed7a3037f3176e0f466eedf032e80dfcebe5a8e4f46213f0055b126141f1cd4c1009b9cfd9016a7171d0e74fdbdc8747463bfa4031d5dae58ec79ca46c81199dfe66b40d7a644d6d539d51e00d10d1e2a4b971a354321e09a27dcae6d3b2842448bb1a1711dc0c835b4fd6e613d370e13bc424340d9e24179a08b0cf68a682f9fa3b581bb7a15dc245a3b34291231752182fbdeeaf0ad701b5964612437b483291b8e5031ae8a7139ee1e9fd95ea02b5016b185c5930cc14fb59a6557f3d9656b87841a9c73d2631e41bbd626e98b474d7c05bf6cb2bbb8d947bb3c7d0a52e2433f24d5cf8cb4c1c25c291031630fb7d24cf9f67ea31619d7bb6ece7128151c8ea8dfe20532cde6bc7b94609dc15a6c6b14f438cbccf54048bd6bfd43adc4711066f2b12eefe784e67e74e04f412891660db4e4f360fbe2c49c037f166e74fc8a6b591277c7ecd498fdc3ce5628ba49899c440d74bb215abd00f6c990b05ee4f66895e350329876195cd02abd3072ecca6abc21ff45e4d1d7de028774edc2d51a1058185a88810f5f510f03b67a62268d03b0129d2231896ecd5f7be7f2c141cea791b0669035ff18098d1a824323f2af55336fd88dfae17afaad8fc62cd392b2a35d13f74c0f0c3bd413ede5f563a350c8d2ebac46d9ce49e8639c4fcc70ffc90734b9bc251489959ed79b6be7bb4318700612e34d4d88c7148ca13a1ae03db2f90736be5c922a05c622c27d67f9b6f55c1f91cc56932a36b740a8781ed3466c6179db00e1d5890edba24898d06a3c8d5653b395b924a8dad5b95195938cd2d84e5e27fa6674d44c71414b53931f12797c4090d90bb50b11fc6370d985988e0c476a135f9420c5d912f9137e4eeb3893794e3482684ceb560d3e372caa872231ef913d1291b8f6416a956a2bd10ea9c424c5b89e471183f5f8a9622db77643de0dd76599497e83fa8995841e455775d8e82bade94975f89d91040b206d420a0c9cec19359bb6f8b42b9fc39989278ae3d7e776e0deb6ee6c02919909a4ed89da247308cc15884ccfadb0698b1cde69a521025106363c97bd2523f9f05739982eb0957d5e75e8aca63897a54637666ed9631ec5854cbe97655f2b033c28dc6c76a2cd1ed651ade8118b271ecaf34896a1ef3222c344a06c0425c8d52dd20edb8344be1620ddea44beb80a39e66a6203fbd1d6bca57f503fd98dff73322a2078832fe09163803cd1410b1485f60ea3bae971f7f7001b0614aa7f90f838f619a382abaf7c0822da6857e2efb4ee4459ee2b71998f88821e1739a5e2960c8cfeead96ca798531089181c8061a47179090b23d1bccd40dfa7abda93d09281c9306a297e292ab0795a5ab069d1bd246769c1590c032c768da33028e009fe37895f443445e076b2c4e83472a3eda0a431245ad1115c397aa9e826651531a1066fc64e0fe7e80d2494913a7b7e1af0745ebae39c77e30e217b3481cb4e0f80d88f44b1b64870a1bbb920484b56375fd2d58a42016a5c3f26d6bac4939456c0945224b9663115f8a9bda32d189b5d0004325c85647155e9f8369686300d6fe49388e9d901e94608959232c6607842b82aaba4183ac9b1fad93876d2219c2a293f9658835eb7134e8483cdea2b6f64ac7e047439a10c2919e32ee37a00dd8152c4a9bb38d8a93b3afa6802b1debd8c1db9e8e646c1e6c225e53f99d9b3d904aca0ade3376fd9fb4ed7e8b716356ddb8f0906e3d7832033a41b07a895c2f49e18e5086f8c3caff827281a920850f2d130d967df6b11ca699b83f3b4a794718d1b4812b60f670a36ad084c675a19715205c6d9e4534e08a1bb529946afe6332db92c1c2da84cb46f0b148f27c24ad7355df3004eb080ab245484bd63288b4f45194954b390d21364065818988638b0387e40711775c62052b8158d55cc04e40f783bd901159356dce33c03776baeef32d84d44e0191a6d0de1f27694bb70498694bf83fab9cafafd570342026c09574fda25d4e14a38d3de76ed27f794677c44d89378b2063e56a5f94c49d080e0a880e50a5df8b56753d9740194c8d86bd98c6731300ad0d441d08407aea4d39d541d8a6c2acc2442427a8b481f1eb7d8f62f3022b1cc5b5ca82f385161d32cd192984dcd2ddb460003c0272c1c3a1a3ad2d7a1bf0d279f6198d21a8ce889d0778867b56e0749369abf441344e1d81f59be1a88ff6610a757deed061e524fb6720b90eac453de73abb525c9ecb1cadd4f1dacfcb097e6654a56c1624b48e51b5bbd5221e1080795ab84b6e248d7f1e3013b2793f7138d479bd49e9916d388354d1838dd7e2aba8e6576483d1f6df894bb62db5afe3525a9b6722b01dd1a2963995245046b1df8f4ee0297d051a4ee9361d7a4f139154a92aef26cc0f149e38bc366c64e743e733f3b5028fecdd72299a92e74bfc341f17a2e955365657b4ab4d658441dd55f84fda0ad73f4a913c37e5461014038ebabe42230f5a4b576f6579458db46ba4e90d422a8966aec45b15a86bed4a1286a1eb4f0aa22dd354d097ddf8e477188ddff4537efa28b842872b279b987aa7658f1b007d570ab1359e2503dda199158148c50340764e020385e55448b35ae0f662b4bc86acd10c1fdaf13ee952d5594080c1cd73d3e94b9eb848f6772ae0fb8446431865832727ff775c6dce9014bf79ac8074fcea82768bc5be04473e828a91c31ecaa9b2e81278f7a09247a80117b63e4004689b4d526e7be17f5d244b7923a4f8f3f713a850f7d6d3fb7904d5996c0560713c5ce58a65f76410481e5008a3b4013149864ba2967bae630b88610c5c6f4c891e5089dd7f73b2a58e7316706c5696938eba65871b07f1285248076d5d9c3cb512fb7fe49c785b9cf5118a7077580cfcc671468488c03cb68900f784a746910072022d67617b1dc3b8964851beb6dc2530c80747b7ba4f6a80ad5977abe350b193c8f7177cc0a40b0198b27b8d86a996eeab8edb8040a3b58252ff156bc826800fc6ab0224f1c81440895efed5148944c07c945aca865e7f3a80340883878758830ae7d72b59327defe294278616c4b919b88c5e7eeebd8bd6d0509affd48b83985fbe0265be456557197daca1e1d2a3fe0a033afa1d018c850b522d8067123ae9c5d083b5a0ac469ef687fc249544e24d748ab508daff3f074a30827bb694820af853f0816d76473f730733bf088070782f99d46dd938ca897290ad7e35078277208d2a44fdc686451293bc8d5d606784d954780eb44a0d02a86cf979583db73dc08ac3117587ec40c5d9c6ff51a092137070e826b480a7a1a3363857812496dc94387038a22e90e98f70e0c3878c0b007023cda36e2cf03bb9707aa4ed71b08c66006ebb1e40971903080ff90943ea8bdddc1c7001d5c7dd72fc3dc922c19b94943c80c8344ca00aefca14a6d327b0cb16ab903867bbf3ae67eb952304013c72f12c57d035dc5fd653206b9e40540b5c4b718345310d40c696ca1b023b3cdcdec6149257cee1e116865e0e7aef98492e8a6e82b6b22c28ed0a98541e18512a5a0a8500c454a4d7d760841e66fcc54145180c3aafa08f2e912b809c2b80d2d263d004419f8f1fad5e038bfb05ea1323f2146abc037e8adfe133bb1d06261302ee68599317bc83d30fd0b7612208f5c798ca94f00b0e0136951c1505a34f2aae5be9fb687de715575206c03366ccad3c67cda76fd64c4ef4b554897b10c98906dfb54c05d8d706d4dfd50a6bb11a88787510ead40d2d46eb7aa131425c02719366f0b3e0ea72ea0117892bb38e891aa7cef30902d09bfdbdcb8315dc7cac6f53319dc2c709f86f27846a12860d2f7ef20e9f747209066819ce2616848334556f60a59b98aa0212073ae8cef17087e5a4574548fea56900ac470f6f6584462b7c6288167f55e75378702d7323dc0098a1acebc0289fe3b636bf40a5589749445e2111e9231d850eda0bb3fedad31baefd4a5be0a52caefd4b926edfad88e7756d91c9d17fcdc3febd09df8938aa85c7aa73f297b9a8776ca5c6bec93f991626aee9ebe227db78c8972254b807094bb7b80423843dbaf7edc81301cc14400943da6d148da4148260d4a941b1196632e2b0d738837a9dbe8af36e13f8434464b3b625a926183339eb0fb10b8fc3187d03ec48cb48dc63112984fa9d6a8df2d7bd7c2a4914abb2aa9625f311f8e92a5427d0eb4392875e420bdf4f9f6f355a2b53a8acdec346d67948e906dc9c759bee3a6056806629b1df60d4c1b95be30489b66d2a201fa1696a5c4169c71c63193f26da6278340d928d380d739ae9f37509e3e5c087c411b64f0327fe4be62ce0f9d6323086f31e19513d6374494f8fd136b015ded1a69a59264b8b1845c723fbf0783122b40127ac3e148ecadc06de4aa6d391cced588cb60a3db1b872372f99c6da06d98a94d05676ffaacad59814264b96297f876695b085316da1137fa40bdaf37acd846d7945ec6e667ad67cf5921269fb89d1493aa9ec9f1c66584a908a03b7000bab0028026817119842b7dcd70d8ed32f02106001b7e1880b6c1c1007c51fabbddb270dd3a79fb97657597ae1e6a500bdc5ec4c8ad39589f27d343915bc238ca11c8f69e369c8e9f92d0941cd64a977c6ff38f307deacb4991cf17947c8b55193698c1f1a199dc22e186bb91d2d25c9459a03ea621bd1d31c6950161b023c32cd3bd11f8235e1463f2702fc0e00bcdbdb361c6845dfb8f6e89c991226e41d12aeecd86a60fb971d9fc57b4c5a5415257cfb677e0d47ace3f12458aa44f3d1871c936489658625044dc375d86f98c0f08dbcb7d275f52c75c16a00ef19e4560c339d4e64fb74bf6ff8e92a60cb52c7421eec975368f1a3a3abfd40b00333133e5048b89c403cd780f265f816731ebdec1c959c484fc79bac37cc58f28d07328d351407fae051d765113edaf60d147bd9a8a1a9f43e662a17427a4ffcd3fdc942c8a324472bea4c3cfd3e6b8af7085d14b56902d9e9c0bfc8baf0b0d7877fad178fe2828e85a7ce5c7005aaf4433e8c27cff05675d5ed56c431bdcf64736b35760fdeffd176eeeedf9708ce1932ea88b3eb3df486605f5da3a37d40341a716531a75b98b8c15da97bf729024c8beae373a58bdcb2f0ff66c202ef5a85e8e1d548130c79a00d9e4e1b5b823cf181c6b55fcb94b569be477ff57c69f36f5c45dcdd121104c12c320fb863cbccc178eb2fcf9e7de88a588d819f143fc899b003f07ad06316728649024d6fb2d20982fac8eae314209301898bade65b5f64263241df98f34e40a26c8b4de1ec4a4215a03a92ce49a44708880fa0d7165fe1ca47100ee52ba009d992182c1ede62a3a22881e6620495700015bdf1d3a3f911844a7239a280241b441c52df96b89d9aa850889b4235a97dff5fb1ff38e41146979f4cce975e1d48a71f8bfd004cee8599d39195e4ebcc2df8a3ba1f0a9ed019f6a6e9c7b20bee73e70655f43164f012d13f452f7c6c819a4010d36bfb8711e241c05baeee036405881a54be8bbf019f0f65cbf05845cc6ad07d7f71168247bad56c3d2162dcf88f01ba269d4ff8dbd560966e7a2282df5742544b79d0c9155326f163ca89afec3f6e86b18f55ad48a02e2e8e54fe8c90e8c7806a7f614ee3a4e73fa3a37f7f1d7a3798b5df46cb869e85399c43c7d763dded14e130ea1672e8fc02e0f71408b0533fa7c4ea81cd417bd46124b8e7a91d0478d431bf950db6804313ab1be18395d218f7af332e243fa8ab3315b6f86afa6f101bfa4843d9749eecc1597ea7db800e639d7d90aa6456081ca45eab1509040c1fcaf195d89f33b949d40c3f265bf3ce3cf7d957a4dd208a798f63c5759ff744d766d9c69122682f8c07e45d3c2c728dc1401c2933cad3a69fc0e75e56044102e3e098b4691a995637e4344a10c4cb7a1663161da2861395b4cfcf2e36d4ede5030ec36ba703da8201bd93f067a1180eff2574f6afb306d1755db964807886a34c25e5b48fe0e5fcd744963c0b66bccf479d7e965e4fceb2553e4aa05cd6d26d3017733ad6e766508ad313ed1981e45330fa0b3b70a8f70b31ddb6deb15719f860c6f4c90653eb4eee8f8065b73bdc70e10e14e60fe462c214ac85af9f60e900ad70e10a89a2ca1b9438c5ecbfaeca0898e7e8ce5c581dda9ff9cf6bcc5de8f11b4f9f27249a874adf6cdbf5d687e77a01d0038fc7274322cf90469a91316f0dcaf0b9e19540c060bf6a96ffd6127ba4c7440f2d4e32581070360fb4ea5a3d4cb0066d2ca31b7112f18fd32111a5b0ab600fc171fc0a3bf8e048a9a865d61e67a8ce1167d182472b9ef99424f6b0ad007747a1cae5d94bd8f44758a6ebb3046272621b2f9ae894adf0ed458d09af395c58c9730f428000897fcba520bd50ae2bd6f341cd5e32ebf7a0e21818e419d96bf3de2c1261406c246678b7d43bd6d6a8235cca04ec61c98d68b21c4b6852765d2a6852c17d8963c0d49c32318a518644463bed048a491584cf46a6faa21267ae150122bda7fa070f3587f4158e5714017c1151883b7186278385a5a76c48042ecffdcb2361c454ed163adb55183b52c8ccb4cc23fe05a067d6de73d5e8863038dc72a62be3e46a00f14ffda0881cb2e93685bb80b9744a3894b242551664a5e9cd31153502f3b8439a73134c8de46f1c36c2ed5a6754c0d875f4f15c72d38da812f9a528fbd0a16a94dbe214f147e87edf9b3aa94afb840d011f47fb2444c60e675f91096fc00d7021bffffe3f66985dde6d247e288afdb2c989343a8e4f8e126be960f30dd4606a8f80d50c44a10afc91d8c25bdb06f60af4f991eac698f67aedae0b043c11ade3f02431de9f9c801b8775fde41f28b39634d8bb9572543ee45c9d3fa722f2788fb9cc64e6db5d19904e723afa51e6cd7db2f86bcd303738bd08cbccc55f0926b4365406519c8619aaeff0294b68d52d748482c72fe6c5ecc2d2de8b390536b00477701535b97326a721966ee047b2c119c319936d4f145e2a21b13b6ac84813b9693026caf8bf277f856a8aa0d23d187cd65864a5020089ad8340ae1f152420c1782269798b675ef9bc8863da0208d6cb6e8ad5d08aab56806839ae2d57828b794d2d925a001ac4b11af02e4c45ecc552a8f6e5888083fd87a0f35747f2dbbfdf8690ec2186b3ef3354ee9312908e2ac9a65a6cfaa60f37de3f9c0915c94a0e7e3cb15438454592433f049218937c3cfa1598bf633c01472a373b96ce2977c8e7e9389161b7680549e41003782ddfb856c9962f66fad75797cf340f263fc0d8226eec440f2b2f46a68c964503fa038060887273e2b5964c4c867e59ea1ecec2ad4c912a7578ec6b3cce5eebd3bb15e8b9f991e36d4551c2417c70dd85f48c4c124a60ffe10f6a70887fee289b21073f88821837ad4116262e002c609407092cd79725628897924528e90709961cd01eb81d77773d6d5c06704f88ed2eea5ee6960f667993e7498e42f4c61c51545d663f7eb36e283f5e02ab0fc6871f4cff867a10ac5994fe7814d5035805f3ae4b61f0520a125fcf55c76834a8cc3c106f668cb0b9f6e13ace8871f249e819220588461a60748d6ffde284d015c874843771710446738f370644e16691c5a275581d949b25dde575fa33dffdab7d84f2066991b1f340abf3ccb5cdff848e799b15d2ddd32ff11962e94019dce5d5354b6052ba34fc8e458f9ad8539b6636dab8859ff32988537a46c1f8494fc17224647da507716a6a28d33e2054c9313da42e06208e2ff0aedf37fd103bfe20d6a188f9a42521e094e784be0b97695f9155992029ab7c3f666a2bf66cbc1e7d67a0dfd2538dec3b254378b333a03f384e3bc1eb167e7774cb81a0356c93e664587079eb2df28716e64acb412703e0d8abc6b7fdb535efc3875243f0a5fca2dc8172c728c18956c368c15af5c9a6f549717310706cb5b86111d3125bfe524425d0df92e4649436ce8610553f3ac871c38492df453c8cd9209e3073f50081e288201811f8424a3e5af625124e82587bcdf17a2f0c8a80185e882a572a1a6371a54c822f02e7e8dd4bf31ca132ac067d050ee59f93a139c1e848ab0cfbd4a9f4bc2cd861e52f9dd01bfc5b9114a5fac22f8b320f207b230de0b83f53e07b87ef67e96b0fb129b85a26231e83d85b0d6d341bf798b1a12a1d7bda88f555062f4fa5f9865140518d5c7ce606fd4b1b7fd3c186c03815a7adc436b00df54724750d40246c558863ec5ef91eaa53175343f74e27b212744f1f7091af063c76b367d6dd52349b3155559cceffc506c51ae888a59e7383e4505eadc8c287b8a90b709e26318f23e08f28e4f8f0c1035a48f91e98b724aed6679e6372c54c226f6abfcd6e9971b0ed1f3d309bea5f311545fee3bfe09d59cc395427b02ade9cbc6a213acd6beb2bc94b3cd36dbec33b638390c8a07ba11002585afcf13b55d8de881b3fe86882c5a288f086b062605cfa3c308987c139e567bf26a492c4851ffc93bd7e9044454dc42ee92d853e23633f9de2974f7443ec4f240ac1b90ef8c0b3ce0fe7f6b01b7e5db662ecb8b413dcfd4715b08c2ada7f8db45f885e3306868fe489ff26ebea1b79cf158f8c2c2d2ce36d3d9b398e14ccadb9032083a7f68e3872d465991b57311ddb631fab97ec7a77bf564d1729bda6d347efb460d159b206d2f3c9924de228955179ea36fbf4283c3a7edb8b458bd8532bee74a5c4665b94297840dbae25ceb1e4e1420fb4b263db4cec0e11f213bb2af13a3d53ca31a8a2372d4c668f782d3177beb289cfd2e3b6ee39d5ee6861ca9fc6cd97730449a8a2abe09e9fe8227476f6d2d4cd53dde3c83cca6c264f1846b7208b76cdea7bf6f42cd416a87ef61cff1b43493b199f7c0c04e19026e3cfc889972b2e58252fab0d5ae78f35c4715982cd614ea4cbf80baca4c6f16a86607ec12ee2e509b92339db3ac69d76ccdbb9502284ad5855f0c40c60ea4b1708daa53ab2dce1350a181a234b04081d40b5bfa060dcafdc45a2e550e33cdbff3799fc0ee35c8a89ccda0ea134832a18ab427a34d93cc431f93e7337d255597d7d710e1cba6630231a081a543403e5c73a300776fcca85ddf4a55be2b5a920a9425956cf04828349847a15fa8a12b7f78795e6b921eae9fca00242af27060bdf1456f7d383abaad85e4cb0db80ae206427d6f88e0263cad27b9805a304cbc925b020a0fed33f341df0fcfb3ee59106006f74dc164a9f80df78012dc6f0c34a3a932e5d7ca9833e86652195e202cd65ced84076729588be0dbe43a55cf77eb4054aeeb09701dce436e0e682ba95545460c1903245ec1cfd321efaca98e8cc5f27cd7ca34c9f781a48f6378452a5cb17e3c4f4191ac329a4199c1d67519ea255d7f5aff5141ca3aca8d280c399fd30ff751823c6f44763646c4200c1e083b091da7a67e9c514566eb02c0772ad402c7ad0c7f49c4b697be890bb20a241264ebabd300dfb340d89d7a8a84945b4568b6c2fe5f21d61f5df95a69316436f670fecde4093484db9bd90e5e85cbf9a02d4512a92afffeb7cce1c1ea22a8f256e87c5c06c218d166c0c30d06af34aecece1ab08e43e754b3de2932b1c595b3e3549072bd8f7e4bb249490c4d033f3bf19eb130feda39b44882ab31996a77a6776ddf645b6af2409d5340b8331b060917d622564cf17a0d7444c913f2d434a03987578b62ea9dd38e7ac20d79491a3fa726077b3a70f330a9d76005982db370cb27b818a8f21cc5968f5cfc1b2714b3b2fe71730478475d55c1e7c128d191d060058e5e24ed2873261f8cdc4c03ee88de299c5027c66784470f30f44d50f021f86170dfa7207057f55b57113e1a4bf09056fcfd866b6f67d39cf6e18f3d5ef4ed1cbe890477b91bea9c7775221b130cca2df48c0d394d7762272660df433e656875fe927be677167fbe82bac7220f747c7c24beef07b02f93ea411302e448c176f407e65dc4a40ec334891f9b3cb96b16ae61bb0a64d52b359ed546712081f5f9c9c3c9f06e11405b40da9380ebc900511184c38f280fb10b57035eb7c4bc07598013b805a4d13661c14c5c5a801c06557876a89596d5ff588c57b7ef230d8b58196a27f881d8b28418e7a5a61455f39b75b9896c5066ddef82856155b9fddfe1e5ebb156129fcb4df838cade301d73115e068aeac04bb63254ff2e8367e0ca160654f02a2a6477060ad15f6bc87b1d9823a97d103302317b2e8997f147c633a337c3d4ca2e9509ead0f097709890a2df0ea9e2de2eb5012e989e7fe700bdeaab96320df63542ea39e959e0c8921461adf5be8d8b9899459086b90ca6215574994de68247723022f84d887e51038f2a79635140b35393f5e40b2b20d21efebc5e9c7e2563c595cc599829202e95ab9f3ee469d51f9cf120461ba28dca06227b217248b043c00af3a5f9d8cfdf2c07b546fe1e4cd8589b939b39ce6e40a84ec5d0ae09e4e9ce0262f8bed37e26d33cd39d1c04bcdd8922cf970b62bf0578013b9e69f6e7aa8290dee2702d27a267f932e53076c68eda3e0f2051d88b9b1f755b0bec88cbc6bd0c334fa8a387d54792e5b02b0dc8ec577be888423ea456609fbccd4e35908efa7114f33625404715768906012ee8a79a0f8be89c1c490409663df32cf6e94b11c06831f5140eb7a010990d1951df883800b97224fe01afaaf1d00f4cb090e9788a75061d3bd017488ec70f289c7c087a57e8c0410d154095df2bb4e302e879a04b9872acf3877e01b3ce5368fb9c4390d91662655a5f1193ae066c6a4a3e4adb7f83760da01f821dbca6059a091833eba2eb17454816813eb1344bc41ccbf48fbb8e857d5ca9be2dba03078bb585a1805d04349ba746dd8c7cffdacc658dbf305f60cd18fe75c0d92d650242b0bd08b45f97f9ccbd46f00cad29b5bf7866035080e2bf500b716a2f994e6e4a2e5714e055b12c20011f0e9fbd0bf6470346b3046c1fe605b0eb90254675c9b0b08fcd08b6b0a9aa5a0239aded990c10b924e61b49eadd55ff50e0d4d421175d31dc88a52479d3ab603e5dadbc3ab9b109c73bc4f6b2de2e6ff8de606c2015ab205434ca091b46bd6c0456d573595185091b6bd1ebe44f19eb373d4ae54e127547365c70030a208dbd1c615509a7405ae3364c7abcc90aaeb9e1a6f5e7a1655164d529d6190a17f55b8ee198ec3ac03b9d6aa149fc88a527aad1e1859067eb125eb1087988b0bfe4d7826072be941f28fb7f46836bafdca0b1051026cdc972d0cb6a70e7279f04cf97ac5bfaf19f541341cddaeb73c6dafeb6812032a5ae3d87bbb4613ff18e5f65ed6c0bfcd9429d4208202d8f49e0a6370cfc295071e4b37d2767cc21e89207838c9b9d8497090cbec1507c8468dc14dcacbfb70a1e607c03c952d45735784b64e54eccf8e8662702446f3122d43ad075e81a61d2cd022045f9868efcb87e1341a8cade330311eb6178f65b0cd7595813e102101722b0270b2a29348c7e0bbbb0ef3cbf5caa03ba547d0aece59e12ebf2fa7c7ee56d83daa261382d1a4d2945dfba625e139ac139873c15acc64c3bbf18c47a5c2440238c09f3c7f41c605d84276e8f5b5e12ca7d891c552264a3498cdd7ae6119431ca4cec134427d11983dc2871bee8dcf42b8e6a99aeb9893bc639cd672d50f77b74d17ccbff26d075a9721bd5096430b25bb3242dc350d6fefb8b50e52660d1c78dd37193df208c9bf6861e6355dcb4482cfce8c144dce4dd70d3feeba794ee300537991eb8a9a84377ba7b8cdea6af972c95f2367de775ee77fb5392a109b7497486dba67b5fbdb46d6ac55d34bffaba2de85da04e41db546e66519d62b669dd44a9060aa491ba714583fd1963e35e89770e2a0d8866e0f515788c0511dbb45765a42bf035eee258d1fe66fc216b09af4deb75ae4d57851ef5c4370d61b8888e05426b537b4d606d5a0f84d5a6eb6da4dab4243666cb66d8fde23a885e68e23a52ef38c2ed503dc5d141969cab51fc87c462cac9e14d29a77674267e6bcd1bdaf28c3a3453eba71a822d6e8a48f61d8c5ce1163868e47753a6e5ce293ec40f89beba0df20c3f6d784254ba02d9ba0dba8813d616bd6ffc54a1b6d800386e3609f0d6911140a825ec6f9441bc8c1babcf1a59080cb2b23afa8f1e81fc2673170c0adf6fc2612ba943500c46ee72ca27bc489862f0132bab73c8b68ca80743659860f78fd9f08241c6df41b4ddd93980b4c845816e2a1143c18d2eb6c5e800b41084c3b693fa6770a5686e24883bb095d9f0617ae32be09560da1666f6705f4ea8d8f75c3d577ecf0b6de79464546d4a61f4548260c0fc3551fc748b6cf570016c34032a80c27b5a405616a50305f48768813b4ef3aa5156a5e2337c1358f2cc9112ce77c0a385543b3d16d3859678af08deb7da49b063ba00d341a4201f197aa8d3184e66b900f8f08d6faefabaa2a5fb4e5549d78a5648237b932df796292599028e078f07d507de9dc6921fe4f875d6d11f140ae5839220c6f8752567fcbab62e5ff0c4afbb904af02b860a06673c945fd592172816bffd0328aac5ef3621bb9f7949fc017e5d65d455e6c4e5821f14ec60e502221c99b2a3c40e3e4ce951e207233b0052220546a6e0b89060b021744f8a8d695008e193a140c2bcaa8450423645024005531c61f2854ce15575c4069a12497a551df1d1150a85ea013b12f418e62e18e68e6d1df6ba21e0ac8c22893952676574083b2bd3bdb349d2a05028222928a282a7646594497c2c0d272ba33fa5868214ace063bc2cb8bdaa54101479a07952cabfd72853a8c4bc5c15e3d7b51744a63153433d7496956c23bc52f3449f9d8487de3a7826202c03675f81a88730d56b3c747d683c549f5dc6436fe8edc5f3e6d912cdebd8d43d3f69fa67f390acc7c190ab67da16f22cb43d15c6bdd754ab85b61a3e412ddbde498553f770f7740fef63169aeda04b17483db5cfe699347a6a1e36fde059f53603cb40bfde75595a5031440a2b2da668e3e10b52f2b383329416543821ffb21e50cd96a6eacf4387618041f35ffc54283eba06dda10f1d48efccc0a676e83fd8e42c031dae1ec22f2447cb67f73cf497182fef9e2d5d8145d6a438d881de606c49552df879a840541ebace0e7ae82d05f66a761b0f1ff478599b8f1f9494a04307b225e841b6a43a80005b3490ec1aead5003af490ded0934c632211a2bfb749924b8e9ca3279130ddf1fe5d3ee3d3f8e366cb322443b7599a8b9b3a30f76bc3b8a9fd25c486b79943106d5b6239dc366665b65fae93d6695c553423ddf17cc55c64cb2f9021b7d96ce4bd8d4830a30ddb4422d7168d448e8ddc666311462e8a1247caed18a60839aaf2ec41b644da5c0a191df31e5bca9c1d862d859c3d7b3954be5de4d9d34623d10dcf443d90a21746a3d93fe2a6740888bc25c03490dae2abb5f88a7c406fb95220ba09b9a50249cab45ff6df67bda9e2c87abbe28f462397ba437f34f238dae40b234e6ed7deba43f307b48f5cb4d1d03ef2ac31bfe12af281790b372517c4e545dc6c0fc17b91b38c3691b728c3b415853c0be95b66d1382e6ed8d6f1a59d1d3edc5e9afb4162997dd71eedd9529b60581976d95c0f34a43fcb87fd3ce181ce1be0f589193cd6e5364bb22411a48fe668801edd664541843c74b67a62cfec96f74603bb10237c39660e3914070f799ed85b1e12424ed2878490df2b7ade304ce450e442e622e7cd5168f1494201859193b6b4bf6e03b3ee353d60588f614daf879f18d5af773ab6b48ec2a845453e1e8fc7e3797b7c3c5473ddd248fbd1c87b4b2c3e1a8db6a52247ae236f5972c3dff622fdb93e6f2f9273e1f1d09ffdfad847cb7b1268e13ec0725772a4edd466473dc816dd2cb9e14ff480961b2e9d657b69f1f72d0eb3ddbeb4b428211d0ac90ebd451060ff003fe109cfa26d723b7ecc12b75b1c48c8cd88f5cbd1fe36ebe5688f8ac3726ddb6610eda35bda58bf80712f0f7881aea717e8fd90f7e9f0206449828960229a208299e023a867cfd459565207cf74ad58a6674b16d01a68accaf8ede167fcb7bbcb127bb8053aaf8057558e95cf9ed649545230f9e584ecc3268c6c1789203da6b6c3d9cec876cc440819773828e47afb8c3a114912c8f1e5b3e31c9484fe68e8f8bab2ddcbd981443fe66ce96d171b8aa3b3181275d860b2a5795d893b5b9ab1c8b37344623d1ef3fdf6cbf17c39ebe57841521e71968b38db3d1e91c9cbc11e75b65b6e429c98b27cc6d4b3db6cd461f278e8b3f6789b4282687f79666d4ba25fd1a39135a5b60463929561cf1edcfa638a4d7d628f38110918d2f9c6eb131eb0f819799e596326e48cab5f3d2f9128653b8e603cbf5e96d8935dd98edbd88e21b01e519b7e2cb2a5e517dd40b6c79e2bcf7eb12145618b8f1faaacb6639f4ec8c93e6b43bfcfb32f177bd09033eaf43c7bd4e1a8f32aa5e258adfea1443f368a43434048f539f35dcc962c4b7dbbc7705ad02d9700a4c1f2de2e006ac829dfda60b43cb277ef06400df97cfb87b5395114d91886612c3ce68d45aca3f38561dcbc386eca6fc8b9caa8b7421e55552f004d8daabac793d4dceceef619999b72b9a832ea107e6ffdebb321d7afcbd057182cc1094408a1065758e185f64311af73008085f79a2db5f30fdda11c80df28bffe5ae879f61f355c01223f2c018c25786042c56965fdd4f1ec4ab3259f67464332cceb3fd5af95e351a57421c1608d757392846d2edb9991b29048c523d2180226595d4728c1481f0164f56084357644020a618295241752129d6601cefbee6e7f497058d924434998388279bb7333484c48ca168e5061bea21b4c927262bcb6d8ea4282912e49a47e4a8f5cc4d2e50aa5612f86615a1132f45d122896d17f0bb6c774332f00af2a9c25be5f552cd8e128d9d26cb73ab6db758f9163a4d952a4e19a2da9dbecf327ba81db0d67d966901b1ec3dbfb87e42579603c2534cfc9cb793c4ff5a43c1d25a5c9343a585028cc221667871b7bc61c99393247292564890e3b4003748d85c5339666699666e9569bb554758350130a5c8939d56e4a232e4e758ffc3a7122b390fd23cf58935948f823cf5a9359c8f723cfa026b390d78f3c0b6970d33487fe9a23738c9e458eccd16fb4b478d6b2cdf82dd26416925fbdd95f3a3aeb301328bfce3e5bd2376da87576b2257db20693e59d58afb644c62f1036fd609955e87f5c476494b2a5d92b55840281565b52e8d0a3b2e939fbac589d53af6a92796ca3c15cc796306f51130dcbac631e2586f913dd609179a53b5efbfc45859cedd364a849b68fee78df456820fcf6194724760289f9120bdb666c1f3659dc0be63ebc53939790c760f9f3e8efb4de3f6c7ac13c87cbd517e35e42dc049e5b1ec3cba109c6e5f0dcf21c9a442e868bd31c2cce0a096920f589131f5e426ec68bc8939f209e2427f8e1c4dcece24a871dd21c9d70c1824c62219f0e1a0ed02091c16b61bb90605e6ba6aa425996b1e8a6c5597433f20f64fc286431c618b90e79dcde87b897ccf71fb08f826fef331436ddcec533155160c8113b3b1c81082d9a84d18393aa0c0a1e37170e852db44d211f8adbc4e16f702e5b10ed5f46dec2c929b92deb85fd112773a276996b2644b435dff0d1bbcc57e4a33fe49a61ef490d48149eb5ca3466eeea39a361890e34a7269d8adae14604ba454308f8978c00bafec361c8097a6f73c8afc3ad874c4513e0a0eb96030a12198252e5e0a48af0b003ead4c390d39c79d655099e77d8978719089b9e172ac3eecd9df1eccb643cfbe33820a4de4ae404b9be1d3b36456adc559f91316b5f166cde5f9e4c6366ab6af036bc7f3e637a04c171e2a33b3607ca0219d901e37927d11ddbaa259868628934333333334f060ab28f1f330f1f6122580bdd34de1a59c65a50e13498ca8d2b725f554c54f9e7ca0224e895d32c387d92c1e40006073d40413d4054a8f8a0bd0c9602af32e4736e35d4db55f8141e8597126a86d96575642d8465da22d18dbaa68d0a82a3c884c969a8655956e7b04c3461d8d6485846af2baa3686157f222f6cbedcb22ccb820dbb68264342d8d3a825c928eadacc6d596c59accaaa7ced48891333804ff41b6265a21bd8f186f839880233a055a6b5c0283d056c12290a845c4499224a18ddce517a8730bb5811f47b55f9a077fd688f97c41994ed36ebf16165aa1f190fcb50d96e812e20dd8185ae46d23904f8672209e0991af5b85f149b80b68a0c8ba1c8bd2ccc49c50155067a26bab91cd620f211fff21ba2177c64b4e22dae9f4ce7f2914b62a6b5401150648937ba9b889aae2ec1ef8aaf5c2b3691385206c4a61dc8cd3833a0e6481c869cd74fbc118baccca24c59950c48d7925abc1153882a64401990e9fae1eb278ad5f543ba7e6e441462bc7e3603ca987f32a018593806bd1a60a10b11666eeee6e71a00921700323794ca9c1c35c77835736bfdb4539fcc6fbbb5325e6faacc7aa1a00bec8a16b66d1ae86ecc82ecafa143f6d710725f315e6170707b0916ec7782ad8313ec30de0d7659af4d65d663d464336303a32231bc1cb604e055c66770eec654659eac4136e4784384fb2c36414b2fcdba2ec8b3ab3e6cbafc39ffb0c9f2b7facbe7398865ae1e36adf7d5733df34a4f4b140cf95cf771508fbc7e78d989ec8ba7dd5ac66a37e4b61e436831e1db0baa0f42d6b6d3c7d6e56a41e6e2333367fb226bf7c22064aaddaedcded0c800d23432e47beab39d21841a912cd32d4df5b9f12fd84fc6ee6e3a8406bab02c9fa738a043e96eee063af47b8fa70be83d5cbce29e9e229357abaaef811c4b3170760c9cdf7d108cb7a17f2010e4dec5c3d3237797f5674bec5715178fea2e4e23f1de3b227db00603414e1706e223ef4578bd177fd0578c266291db847c5cdc1ef3dbf7debeb797cbee7befbdf7debef756eebe7defed7bbb2226fc03fe8100885c3f25cd74f9fea1bb3b0b2056df58d40008dfdc8c5c109a276d3725ba9060a44b93315ef4aa6a72839fd2896800084d773c57772e82e8e203f2472fa30d2c4b48816e6db37d5edc3146bf9883f07b832f649bd1a7e598c32d8bd84714ca7ac5386dbb86ef2acaacd55874c3dc42669bedd46f2cd1f1ea3b1b26cebcba0bafdaac3613328d795d5683452b54c326203c5d228ccefc0ddc680cf9208c8e611816319616c8f952d9f68c6c093a0ebc617160c9d15edbb4ed8cbc140fd2450261d30d5780c610811372bed4105b9acac6afaf3e260298ed48a4e83dd8f4485a84fe1e9012711a97cab80c3c8cd0c74bc5b8bf1ded85589003d5dfa6a21bb7144257058324e595854e0714eed8f4723872bb5b13c40a0988922040a4b65cbc1c36bd1d96d12dcd21a331e47c3baf09c5b1dee2444e0512b2a5f99a0012a409171964bbf59a7d48bace9d040424ea017a171ab13518a879ecd4865bb861ce8688dc18eda07732fce6da41851978f6e70f42657fde55a72093f18a2c73915826c68b6562a9d9821036c3557d570dcba86356e4f3e586b0dfec54553b96511f01413e089b5f0c1dc93e8befb21ac2b6342d69f376ac3b9655777725cb687c5513f478a9f7ce218ffda027c3222682a82a8389205ab07b79a4fea0632ad3f2ed01b83d958913fb160126f211b1edc530ec0a0f104d60a0469322b42864cbabaa890f9a0f127b55316942d6830cbdaa981c210cd9af2a264458435eaf2a26404c7e62ba19191ca1bf884f3a4df482e5a78e1da684742503259e1d13dd703c4d610119394834a97284cfe8a78ec9c2efee9eba8c6719f0b03dbbeadcf08f66a08a0191df27bf1eb58d01945f77512d714485df25b909d0488309448410450f4e637c0ba4dd4eaecf6845ceae639365829cd3731a36ede9b90d9b74f574ae78cee279c4448788ee370c855093a5e90efd8529cd6193c5c1149733616af48a03a6d8d4403492229e8578f609719e83443f188865427f5521274c017154818c511c54c8095340c0163cafe0190aa1f590b54c81e49f1d13f0ea32ca437b39ba9fe9c69369d7e962ed8d67aa7932edcf213743d043f23be4163705f053eaeb2c5f6e72af3d1e197839daf76b9e89c5db33f0785cde3e039b583cf3103705a039e4e68d9f2593c81f374308f8e73be5dbf595d62d6e723f4bdf07d01c4f14a3c6c98c23f58a6e966578cbdf363b910b214f716fefa6522ec0879cb505e95c801fe23ef09e604307e9def297e77d396c37b2bd3ceea5da5b72201f4f3bcb95f6a7baf69a82c4851a995aed2f96059d04e3e455d8a981121d5eb39aaa6209aa01153f2dd82a150edef211c410db2f49f989399825917e388d0cdbdee9c1863dc39524466c555045ca48155b6a6713b6a5e524a0946729ba23863b67c2543b54c586362882da52bbc7cb821d2f0bb6051bf60ceff24142232a880351dbce33d481390f913cbbae5280428376280f0bf5574782f17f8f857c62ebd8629b391663cc307f1816a1e80693c08b97635b3fe69967d876b9e6578c526adce521ac4f97b3e8065bd1cd25f211fd71ba81edac971f91652cff963524106e86ed2c67d9425aae31164783065991d9a02e24fef39707a85fbecfbfaf2316e84bb2a6a8e4a13f245b822e039b485192bcf3519feb39c9ae2de7a19295810e993cf42849dea90fcd43f290f490c4263d41d8d1d4a84e32b00c5c433e9eeda05b103acb164fa53113a29eddcad68a36faca96fab1aacad650e929afb9c0c4f012db970ebb6811468b8de83b333a5880e2dcb545040c9f294f7e5e775cce7e7a3cb604fd821bbc4ee0844777406f61fff94ce421bb302162888c8e3e3dc633cd72c5e102b9c3ed0c5de371f9c7303db3570f5bb110cb1c0251377640e30309acd8800a2cae084a82133c08da7f2de39d10be7d86e68a28574871b511a921462441032858787185052f38b519aa2baea8225d0ef0aa5279f1a157d5154dfc948e840cc60531062f382d3c36b07e3045e3014c4e0b151614162da4ba5edaf3d9e8bd78c5501412beaac6488112c628c2af531083089f7d3ba9ddb734f3ed9d184bf8f6199af69a2d01e05b258613bebd852d59df3d1e23060fc458fd741a4b88e8bc0f88eed01d0650a180768587c31249c213d4490706a84edaaeb0cf640d1e5c39e1f0d458ad56271d1090ea58ebed2586c6417148e1491524271d46ab53fb90d3f544ae30e3f786838e299814519d70d0e1f2d999f9e73af411785427dd1526cdbf7e6a91a1043380564a76390b302ea4d851c268cc4249aae1062a724a31e4d4202986d08234958f0a88955fd764c8409595114fcaaa678b1ec5b1de2a1bedd9b99ec8c74d5eb54a7d567b7674d5f3eb3f62e8d50ebdb3a5d6791d26343aa0b493c656202d2324af92d5d91cc53101c9a6f5fe61a03f4dd25bdbead52f1f72f27951ee650296438fc172e8ea90c3a189723140bf38d5e3d0c3f3eb434e434ead7385d4939eba058a637db6ceafeb0e0a6c23d93a4771ac5f4f247348687226cde7a458c6f2819c5d37d341bb16109107caaf6b2498191755fddb58762049bc4ae2fc97d0bd15b1bc5dba702b6bb3fbe0a76e57587f3872baa604d91591be2bacc7d8005f866d31263d430a2498e0a050a89c937654a4fe748bf42aa3021452df2fd06dd35353c3c3e4d759c8148605ad7171498a21c1f0f5054dc783f3eb33d22546c7eb15d65708393b26724ab9a4653839bbd9fd7633daa8164411d4d3413244e1d303069de282f3eb3333ec6f635655cdf2f9d915d6338d09525b829cebb33fd167ca96deaf4809393b28884dcb1365072d0f9b7a0b9559f7e2978c5f576e79ce782fe8e7fab04ad4043955e5f3eb362d409c18e5e5f0ce4e1455fcbacbcb794a9c288bceeaf06c0f932db1ef6c15bfaa97b3b32bacebb63a3b90cf5767db9d65f29aecec8ece76fbb6c7446777b6a45106f2e1f08e64d3265999f555f270648a091172c68f1aab6011b2224dac667eefbdc7a9b7f3ebb6db15d6ad27e4e3620f6698961c39492498ae260a25dd0c0b2c3ab2abf9992da9d34c167ed9a583819c24128c7459bd22a048576e8822f5eb38440de61581efe2c7fcf8f10ce272c52b5ef1baae8bd3f606548f9c519423677c38cd84ac880f7e6ab8e29f5d01685758c79220e70b122591ddc3a6f6d40be29f2bf3050559d9924a612a6ca50d23e45c2bdb5d79418ac36d767dd8d48fe31ffe79417c6aae7bac23e48cf00989c6c7637434fb8f4be7dbb57b778c0a3990d37d9c4d2a84215daa90d3a30be474274fc876373728332bbb2a54a85055593921a223e4d4a087ceae579ea5413f2f25143dbfee52839035ede91581814fdf7bfa9e3a5b6cb1c5cc0eb70fb06adbadc5cd87aae1864ddb10e244cef7f37eb634239535396a3d6af189ec9d344664848c48daf8f990cc45927aa99d5f7f46a206f386f8242115c8f5456d2fcfd537e78ba93e3da040f2eb302818eb3ef8a99d9d46c70c49f6d6e3c7aec0ce4c243ba74f9cc0f9fde1152021e515f0aa45113993f4351f2314a95fd74830332e4d5863963469bb5d611d4691ad6d8b1a455239729d95fc135596a47a22c9afc33869c3b4a7f51953e4a1d8cdf839b1e8f91055bc907d10f45b2d3e822892653e82c0e1ec699bb325ed39a2c8ebfbf841c996b4c708201f41e06ce9c5471038ff16894eb14f5cfdfab40f4cc121d684ad9a4a955f572bbf3b13a27ebda758f98d57309493227e4223bf92034ab2422ace76dc43e46cc74ab6e3cbd5593d6e27d56754d7b6b3f43d0ee22095617f5a547eda3a8da4713a67923a07e7d93b47674bb393bc922d4dc9e4b99374922da933077150eff868cc425c6419c932ec2d50e4f3e5b21fdb313f7ea82d2d17a3e4e89bda1eea15d98e9fefa658861e363f365004c80c4130ff500f15947a45aefc3c23cf33c823380c8eb59614e9032850a0a0b0eaeeeeb576bbbb6177b7d3482abbfb54aa76565577ab7840e4091428b06c90b11732aa378f649625f8f1181a1d5ad339cd763fb4783f550b171e8ff5158d0c3d316ca947a750e9e9a1f353ea8f12d243ed1a0a347c1033434de45a215777639f578ed019e872e8d97b4ffaecd6a2389edf981df87518373ded3c74eebad1839c51e7e9b248c5e18117b9207f9f4b1b18d6248360520f7766cdc3284fe03c24fd447942899f0ac51f4671f2f373e6a1f7db170a9202e68cf7bbbb8bc6a3d1f1de7bb1d79f947257eebe87ed0df65e0d0d8ca1861ff98f0a27c376ec8ffbb15d0a4c481731640d3f376c69aaeaea07b37c2838c6720b712f6f9fbb97afabe5ef3d4649cb9fe534bc18e3736c751d5bdf8beb41b31d7b67e344ae33333333abcc38c277196bb2f97975987e3ddcb2b1b61ecf2d779bede11ba305b71e36dba16678ab7dd9a647e72246f73553470b5b9ada860e1daf2a33aaf8497a22083fe3fbe0a7bb530c3bd59dea54a73ac526766f772fb176eb93a5bc3a6fa125d5d3dbf4bb1b45e38a63bde110082fa046d2a9eed475a575875e5a525d32b45b6f24bf382cb32996d915c8795dc9ae24ebd96e2ec4f7f0df8e6c70e185d77d0353294ba58a3b3ba3ae2227e7fcf3c9394040bf3b7fe58a4af5522f3575d5556428b2bcdfee86452f30f71487aeebabc885e5d2c876e45b02dd66f987c9602fb678ee71e8eb56cf4ffed9e2070064fce41ff9cb5efce41f7f3daacc978a835e78ddefbdee0dc974ba899c97cfd5a33896899c57cf4585cc76da88a4ed2c18f8fa24f5825f48c6f5faa487347eb95963796733fce5a324e424bd6545e51502335f7f4b32ee654fbd3296b7fc48b77838c1470b8a241f3281640fb95b334c2791ae6b0b39694b21b71c664537a12744f402fb071af09ec4a677c22c7fc1b06ec6ca5b2ec306d6a44ab05cc7965435c694b72c9ab7d65a1c9f1f5eab6265d5bce558bc2c2a6fbd65693710502a5613b24ca315cab46ecbb2ac1717308f1e5dbf7b091227af0d6e1987324dcb4211d01f8012e41402ff05f6ebc505f6cb2fd7b7367dd2967a5508ec35babb6384ecf1da5ed8d75fd8f55755571130a4f07470a738983953e1cd65def89ba6d91ffc9ed96ebbe70761777f368aaaaaa30b8a0bf0dfbf6daaf0d6e7ee6e737f27f73b9a010c1776bd17f782ef716a59584368c5683e9acff2e8665e216b96b56f5f0e6e0839ab21b418428550d7b2a06575db4108a1c516b42c784d219f776a6857e4f3b62c6859b06ffc30626646ad2fb1206ceb8ab0ad2bc2e0c7ba42d615d9801db22e36baa1854108ad2b5e3064b171c10b862c51a689b4acbbfb82218b8dc62cc805a69a83c3bcfbba2ed1cdd511f67b8f61731c49d2334dd3d8c8b6df8ba427fd357729a76c849a9bb9864108c39c2fe7887968838f45aed9c0960028c8d49f03cd7e057a1b7af4cb01519f0af4563fbc50d7e8606167021ee99174ccd0c42023f2d99174b0c2b8a2b61ee3ce902f033598afc750e360b8005fc4c9a038d675446eaa955f8b23e9e86e68611042eb8a9615b564cd5c355fc3323b26020ea0853218daa03fecc85dd6057d6e37b32ba3a6c5e822924f7358ae560e0fa3e801ef31bf2ceb75477d3c9ecfb534078c37ac76d02f918ffdb6460001fef6eb290eb83a5c9816e22bd3342ddb8ba45d8c2d1289b0bf38ac64953ae92f0ae0e2417a39d62714b1b0886e206b2b910f3ec6c5083fbe1a2a8f870534c7ba15ad8201c52183968450bcac90461e40122fe842b5842ea0f8291d8b2e9a8484d005123a90a2575517385da462ba198fe102c94fa72922eb2e35b7b01d3bec56b7385e4eb9a94f5e9db7d4bb3cd4774f2f87fa7bc5a1ccbc7057e7b6bbbb2b8178aa3856b986afc507971edfdb9ccf46faa3ae515221c1d0d4d8f4f0cf5bd8d28d7fde03861864783e03901abef8e7426ec02185f352f8e72f87897ffe946c29f4cf9fce962213275bc2fcf9e351f5bc150fc0d81200b634e551794012b0f284173b04e1044ac0e2f4fc5dd992f6e09f2f4a892d05e09f6f6a4b9a3f5f236bdae73bc49644fe7c916c818417796f69851789442e6fb0c48bdc458403d48b1c664b0678916ba21b91f3913554274df34c74a36559b64591cf74f0d916627ce6305b8a9ff5f07ce621d14dc60425a85328e498e826849911fd12dd4416fe8a52c45f6e896e2e2df95b10bab625251eba0bcc22e8a1c3402d7a4a0b8062e5a1aae96df144cea97b4b915d933b7876178672c4f316362842d57451718329d4a427d1cdcb79d10b1169288af891153b6051250135904fbef0020b25dff3450869f4e1ba823d11a2043d4f921871000f489ee800e1801d524f665002d4932a523f4fa0a41c80ca7922e587d31356242ea20b0946ba4841f253ba88093421c6ba0d29a678118423a4704216320ab144b2ac208b25cf497f3928142a8829764ec0036043eaea150b31a8bc36c515d91053dca08b29be908213e365c1986ec60a357050c54fa7b172541f9de1a8f40cd7653d2c15d18800004000f314002028100e098522b1503c4fe5ed0714000f80984e6c5017cab324086218a410328600420c00048000c00ccdcc28082d636b65f9deedbd57949df6abd2e669f4d6fc3305bf2addea4b43cb9def4170a7fd56502dcfd0435c40c3ee223966a3be56faf2c2cf296aebd855eefccb9cfb8581d3bd14e8b5e56d2d1db7b39ca3d93a213709bacb5ecaca3629ede587eeddb6209bbb141a5013c4e59a8db1a6f82a92546ecc00a7fac64b8655cff8ffa5674785ee1fb1f7331aee93e2808d8738968c725d25aafc3ac3cbd6cd8d67ee5e4ff822c620e3d4bdf9e9ee94a4fbe40e4f3ae81e5c52d1cabf0182f746ac89a96c20f91fc05fede07379303921281829b312f12476f7c8f6d0b3759d9367b0a34c9600f3ba83a8d6e3acada0d4d3dfe60ae48fb158a4b19d06a3c94ba9505a1d4ae8af35a4da3d8c682cfeeb53da5433d6998304a18a5f11dc3e16f0c040b3ae21f78e72a022ceea207d9d0606287ab0c0adfd59d437a095a7901666bf01b2f4085a94918e691c7e412bd85af0d2b0c094e22f9958e7715d415b226c3857172006ae2d4629f391676605f5259d37c83714c7286bd324fc38a10b3c7875d78654d86cf292b62cb0888bf1b01ad514b8d5000b53f1ebf564de95c0006bcd9a3004c2f74bce5a2f18df3348083f7e18ae43108844303a7cbec94d30aba69a0859af89620b81adb7ffd14461a3196300dd137941684ff304dce8996130fdb805a1308f79e155dac436d86c79d25698425379a4dbeae8e250a37167ca4e3b7bb9740242907856931ad74c0f888856a9b24916541ab016e4ad04a424b7a5d68cb702fc6fdb391e8f3fb50eaf440585b14da5d3dc582e45e93a02eb0b6c0a378237a3fcee37af7ee021d9c1836df6ef08e60ca81390869b97a558e705de492ebea259d4adfb50b2b321e1d42222ebbc855a856508f88f9b48c98faf925e0c6daf3101c0ae03cf967fd849ab690225e0548dad435cfba280959d28c4c8c9e93363070eb69c804bac7d6da8744c054284daf9b9b7fab428f30290d56a332727b0015eb5a26d020df72e0d0c058e721ba90bd9177cf4f7270e3f946d7e973e2c86a24def7129eda49725ca5215adc2c03d23cdb01c514a2750e08a4c687a592b996016275e83454b2df232b8c1cf1ff6f2341ac5c370dea8277f5364c508292ca1a4c221ac015e90b32af0cd120e712659b75d293da407770a88f5e6e87b03470b3a77f83313dc9f92e20149e851e4d84b60722a01457c14ead2f9bd3fb3f55e7af60fb5556b3497044f5bda72dc946ccf4181b1c0c1bc6e9e8ae70a16d14aa8c4a20033944be4b100c64cad09bd5a768f88d0b19a27d82b575aae340f02ce3528b45541f0bda5f21538ce37dfab9cde897b591c4e4a035dcbe95203070ea79b769d1f132b68b2c473c4b842c58892878d9bec09ade2088b80bd2b143a41a568efc5f6cb6523c1b69b8536fd5954cb2ae566412f854b5b7875b06be16d6cbbb2054823b086db67413b8cb8dd35d0a890cbc245976eda2afeeee4b8993941a546a14d5553b2bb66450dcdbdb1bf14ace27f553cde422bc6fc1e859a4d7ef5678db0eb1e8c7cfbcb77e64343195e01980c391312a66f182d7365e422c19d5cb82f76cf7c9c7433e32c9fbfcf93e9d4be08c1f73c4cb34b0c5420a7ff89cf2ef2e693160d15987571ae068fb281e414c2128b459ab55f34ed0150d149c10dddacf868aec849596a4e709e96176a80b68f2cf0f4aebfbe38d8e963fd28eb94bc008151164decc5db5b3289309237b7646fc5eefc2a152bad2944336b5ff4bee614e93ab4a1a10cf72b4f676a73a63e79012b10e9e72d1e5d238b751ed2d0f9133d9ac3b670aff6a8a788d0784b782874701531e29e8cae834e7121d23fc9368404235c27d6e59f85dde1626994c294dc483922a6392fc8656d3ee550280ea84bcf6e27043b60b9db66629123ef175d9891ab8561da92943008b078f55e8c5dac6290b0ef45a8e48746bf17145e5a79e2ed0de6b12567667fae12c2f94afd2951cc8d3e1a297e197cbc07ee0f5936fe143a584975b9d5c35b4762f748cb4736b54b853188f7c15249d2ca4b26a43f2c695b565121596f080aaa25d596fdba60d59bfa67846e05c3ae643ba20e9a5769d0841679dc5fe821b8e2bb77aa31fda565bcc9b0770fbeee65ad28754df0bd1381738aff807efe9e7b273ef8de9f7c3fe6ad3f4ddf0fd601d7daf7a39edff115ed8db47e5fe1fd1875c9b61f51134876cbd21574fc21fe16f3dceaf7534e4cb9357decaf1ecd6307c0424eb81425a05c13170b40aa25a0bc670f14d90a05ed839877312bef5cadb75992e690941b9ee96be870ac99dedf60d4592a63c2efc4d297caec35f7f926e5e784e10396e3faa7b8fc306727c86a771b87e795768aadd05d0a26b9ca7663deb50069b72d5a6f1ef78a816b76619b82a5b67e98f2d31885ce538c26e14b1981d3d3f9a79be5c9435ea8f4f515202228c6b2c981375a40d85941516e3ee14713fa084b5a95fe56fcd911c4d6c52e845b5af075792598e95dc24cf9565ade18a60d9833f664f02f7a657077cfa3e12f15f53a63dc1026502fcbbb5a84dabe9dadc8188bf824e6bd8d91d25f0a909fe09c7db9c7bd19ee7e8c3175f350212fd08e195f0a6c9541f12c0661eea5551dfb5dcafd4ecad3e5379efff3d5f6caa5e5b27d9548875891bc52a6ca694c366a11caab7e5fb8025e7ee824145c6e35d2cc73096e11880e80f2212b261e2c0759d91a209b654c89fb478e2b93fd0c5b2c1abb093e83d92d39a6828bb243b57db980a4d6e66fa6e1d4a9a34b8e4ba9db89c699dd812570e8a91f48854e91fb670b64d8964ac8c9835867ab82ade6ca10511d888180a93654e77ab9b638791b1f79c676d9eb0c042ec65d568f91b7ab729022f99f5d252b2c98d03cbbdc319998f8f6fa2cbf208f3006a235573b5d944c926affd3e31c17ba797714c9fafad8dc2a9a1e28edde943c0182f385bcb02c27efcf510584ac1f510eae09852c6fc7fc0971cfebabfd50f385fa72cfe52081e320728f682699f88932cfb1b72ea9a2b2652a4284be50d263479e7fca3f9d812556f68bec0336f1968401851197146033e454acdce2dd1d8fa17cb77e75cccd4dde28c69174bc550e21a4e568fd64576bbcc8bfac8c780d7d79af70431155dc8163fc158e98345e38d9d05fcbeb3a2e84576370558b31064ad107fbf2909949d371bf4fc1b277d708fd850e40ef05f690fcd7589919423a101fe965ddaa90cba2b65899d9e7e6ffb3c99ad1bdb6a8182f44c840a0defedf3f98eda1ebd1e945ca95303fe9cadeef14f81be7168d9fa2ce5176de1391b42315091c28605b0003e86c43e4c2223e254db08f581132f9ffca84bc10864bdf667bed6c10c9517f8d441a12d60fb4a5f911dd889dcb5e239ff06d93a06599f2ad8cc00cb7327b63caad73005d0415d44037550a890d20d2808f8e62adc42a76d02b167d36e890ff30c6da8ffa5fc6292d3a1a0b360343825aa35d657b641e5ceeabeb3d7bb964515be0ea8518fa109afcd30836940075bd0fa71bffaad7cfb280be22ed8e8c2314b22ad018436ab1867042ecc835ae71a11d36b9f76d1cdd005f384754a9079a009ccfe3b5fc714bb64b658dc4215ceb05e598583d995add72f7b892215f70b117ccb40c3aa35cd0286e98d0f09e34ca42a52e9ec016d260d4f7cb4161f97b682f8e7eb08ac5446460e8cda2c0b487515cc6511226d676a3524a2b785dd3320840e121c59bae2f29f4b6a2df571701374cf1ab840bbdda64f4da172e1da645f272118f03cdb9314dd0d9860980a3279888e394df6e29072d1ea211759ab6853e046755ad961fa9f381cef5d5827ae84f8810565a36529e60582f42440ddee7e0d17a0a566022faae8e2cc7f01f32a9a3c277613f627a124f2c8311b48cf09274f2ff15894a396eb20c24cd543f9067715ea65b7eb24579a4931e083e8ea8a122070f57c0479ee537838ff2a027ca4b9ea7b651acdc983ab27aac47f9c376103a8755784f835a4ff5798f842ba059ad315342bcadbe3cbed77af7cbcf576aeded3370615a7fe445b7262b536c9365d46bc37b4a988342aed0cbfe9a92bfe990064ca7da006e927e4308a33bd485e8243d4a10b8d47d7a773d35bd750b1ac84ae520cba9168ec43cca5f128584de6101e4a72ad34ca0bc514f481195d965fb8bb82c358be31a19a74eabc882678640e384f7f8ccad5ab6b7c495d75fe4406ceaf4b3e63fc6f552b7873a39500069c4597684b80745bd57ce88402afc27e6c71a6ffc295d62b96aab337d250623e9daec6747a3b874d0a4a6ecf7c6cb82247fa74806be67f72dcc0450744dd301adaf5769e66b637d264d5e3dab310624817c23661f52ace288bf53cba1d71c70cfb68327fb3e5b96bc947d5c1a024e3babe5c70634d83fc1ebc6b062e015835e44243f9aeaca0f18949fa8729929c211aa4dd77ba6fef5e7e19f7234d379b3816e8fd27ef1fc89abfa29e1f2daa9c67ce4f227b0463b3fffd6369c2e743993bfb6e2cc8193ef2b0aaa5d4c6dd54ebeae8f3170e674a3c8ffffad79b11787eb2c723c9f846b82a922cfc88676d37da014413ff12193c5e6b6fd753cb529e7470ebf9cbe67b028ae33d52314c75dbe79c5ae2d2798de5e5f7bd7dbc67392a235e0e4b6ed60e0f634bbf9207b9ac18d3d85bd63e8d5555ebdaeb6cd93ca114e0c4ecfdb248c998919e2504a5f9c2439681e0d9b135e202494b382bd36ced7d969fcd3c225b9345a1ca825a50ef4a9978690de31d8e150364f66c9773faf6a8c0db442d9409a6b16507def6ed777f3d976dfe9be4b2085729c79726003a2bd239866d8173c86137b75d9dae520612ff924695ba31f390ed82fd2e389785a03c4d488d2f65cf97658672f291087d907540c70b2fc979227db772bac7b8d196370440c3951921535183144c4c36eb556eb91c519cdaf8e84ec795713f0b4a3d0e4be5e9ebec79c17f542d8a66234b84451d47fd027b40f13292431ed6c7c2924c0e6e0a2982b20ea7f6af0628635d6826cf7ba749609ba4d0e96235b71fefa4c2c168d6bc7cd03b97e151d6b788672ed239cb02802f2560a84940cc811b4a05b95d1663d38553d598ed70a254869d19c5eca0d52e6534078bcd6d42b00613cc9592ce9c8188322985137ea98a64b3a264bae2e291e2cbaf905a8578875d24c6a8ec22bbcad4add43059b51453517c5daeb3827f72756c915df2274511c818b2c798a7a5eaed70428a8e5e3596681644c7ce5b3b803d28c5bc72c2c049c6b15932d857cc96b86641968b11c92ebc6ed0d1c07becda4fc01bc66a493b9a20b46c3a71f7c6a3abfa214321d78c461aba60858054668f03336373458a865b8f804df505afe53474c340d8adae4c9cc617413a10d0ac46b53472b4e0e81afd1739a611f8a881955f2631c979282332ec93a51d976103d7da742e89e7f882304a5cd3e4176a807eab17a527a28bd6821112b80217d9aa796523c8b6553fdc4f47bf9896ac069415e8251b2c5f45980378ca0374c78537862f74709f6e35650eb7442324a19ea2fe0c0fa477a450b45038eb18cfb0a59884589f58929c738cb008dce9a0b151ebfc05b5d70d13a38541bd4339283108efe1fb3adb91216a394028b203dda64f074dc184c2aa587a22daf4e740b341deb3e1432599ae3200e96c3be40358822cc523e4e00cd5167f7e8e9430c3d01be53254b7a62927640b283c8eac709c219da51cd806ba79266129c0b42ed6736c85f5cdaa03651af2a902ffff684c6f280517a2881e1538d878eb837b8ca44ff14c1e5cf100d4a7720e900585560ff6c97dfe8915545f3cb106576156354ba8a1b2f1efc8495a3c59eacf36914915a3c3f5081fb2e4a80c90a6c76d8300201862b0a41960c5877e2ffb83438aa56e2cf8ccbd69a7a5abc890f0626220c6b4fa397e191f51c709e2f084a602913aae19c4ac7ef9a9f5bcb9166fa1a8f89abd59c8c7a52358b315f54f414d7e6d34575201bd1a4a640f9bed2d2b54d33ee1642ffe777d4d059400fa7f2b50acb5e732afa16948a2aee3231475d67a85d72a052f1a51563e4bb641d562bbdd5a636b3c3c750119c0b11dc5110fccbc43877f9d853b836d206b766d969cd8270d6368cf828b3c87f8004bc7cd674e8b739e8a5462a874e4b0ab0e6797e9b9638219c2423083e5111bd47c173fb266ec8a02ed32a18a26ffda3f317fa6cb505bc689c6d93fb7113827fbf0d20a1e5c46148aa6eacb96171981a42ffdf41daf951bca5a7305ec14d00595d8d5584c5f395b5bfddacfb55925f40a322c5d80412cf79b088305ae52e8e782e862a7d707d6832e41c6e8c984f804e88438641704812ece4be3532aed6cbebfe0b1367bd83be0ab5b1bad84abed07be2f85d6c05c5dafbcc3064052a46ddc964fb86aa298c197a1dc1e16eb63cbc9da1da5c0a3b2bb8f75f59894d2b00619330b649b94e9fa0e08bf437e43f48f14409f1152739e89b154dd70af1d08b2cd777208d0930b3f2bb3d45929455ebe5dd3f8cfbe9b99db3118349b7520173b0e0e51c5abd72b88eca207fcb941daf8b89f8521607730f49733704899c39a683082a8f972ae331a7ead77e6360d32a07c12435830f6d6c582b0826e64241a324413e7cd498b38dbefef8dac596719d445bf2a9996ab10cee8b384f882c156e59247f2f9efbc49330513e1df6b61fb20222da2841c020a8a60ac6649f5807b7890c53b09fdb368d606843598e62b57601bf91fec5c7f347509c44c0b898ab00a3241f249c4c4f54419c526aac30143896814c88f8ab94ee39952f73ca8ae235ac251f8d1760e97d40bc823565e189245e8731c99cf877bc0cdbe4e3f68270a4335f9363c81580bbf930cb7086f5dafc0cdaac8af3d233b99b2d1cd276e689b031ab92566a8587de6c426a7f9cd6513e18374be575c47598741d81452b10652562915256372d18cecfcdd067cd004bddccf1849b846bae9e6f4f55aaf6669626c4ef74cb23e028e767ac2474def7e2b1ffe30d13421fe0e2004e7fab82355c1cd6d73fd10dc7e932d3bef32b70f5bbea64bbb462cda93cae13c254331e9652b61d4b51420dcd1a3491c9634700403828645dc9eff36018ad4fec30193c1ac1fab12e03d85c46657fe11abab4b4b1a4f5201c3d9498052e5ae554d21854ea14161c5367303d03b29adfc37478577841ee51b90ec64703d1ec225e75100bb8cf8a7f2021086dd8912ba1350c9cc744857bfdfc09e7d4d624768d72eab65928c0436910a544e8bf8118d93616b03c80636190bef6998bf1d0abb9f1aa031a6e94a9b8a4126606f41148f31be3837d3efa207176aa6c63ef180fc1ec6e8973532ae7ede5201519e22beed58e055ad0fd207af04e37c0ed40a3ffd4f1b851c3a0823b62669335d8e9e9f162efd86111e994e6357db66c5f888297b354c3ec9a761258ed21bcc4f7d83a0a601f46f5d2314b44c6c261c798e802a9ccb0856655ea96616360a3d89ee057b9fcb0f0e48505e8ef0669e89eb143bd3266c6230cdc1a2fb724a7cc87d2d5edac572436c22ce6816dea436dfff3669e0558a90a0c14546754a72ffa3619f272bda7974c86316601a97080318793b5fae067fa452913b5486212f6b8d2ec53c885eeb505d1459929a9baebeb8185445e67aaf220ab15e8188643acc570e09205d2f1233ccb13b7ef94a55aaa226d5438a6339b2afb9e14d10b64a64e3b7b9630f757e6d854066282b25db01946593f16fe5b743764871c091a433296f706b44ab97a1a0b755ffc00a2af384e6440c2258d33f11885f442560a884647199ec34b0ee47e1ce7e41044488b414605ab685125a4f2da50a70e73b395eb767e6ecaa044486b3cd72be14d27de408990c99c53438ddedc623ba09698e7fabd7f0fab477b0f5d44aa7738c5ba021145cd0d99b9ca891ecf2e3abbde09f7315a2c0b3d51d103e69261285e7d391ace595a4dd130c264b0a608904f389e6c0787ae71332fd7c7fc5943ca2b98f861c467e7bc517871b9a42de1683978c90e602dbdacbb5b5ad02fa2df31c7c7a50f83a9f5566bf26687a1aa49d2fb50d593795935c9540f15cc103756dc1093e79ca5de159d5a226c50686a40a35e19731296a6be8c808bc447d20cc389ba245ace28e0948e60e3024d6ef858ed3d0a1ba18a5373b90583ef7a4738e512c7f64146cdee440810532bce069d63e317bcead1adae1ef912acc720abff667b1c8631e6d798eaa51c3883a78a61b5dae17248f2edde92c22c9eea7ec3bb0c3f8d9d9cced7890d6e8a706950891ddbdd09780f1fe8cefa540af291a646a46360f57906c9cde32311a83269b4106c64aa8b1ce350c2199fa0d353be3ba41e47ad173fa6a98dc765694939616ce56da7e3e3ee182ed3dcb9afed410f30d1426803e8a24d4cb0761b79bef18637982974e303aee6bf4a8f9805f1c9e606e7a723dcafa7d8b7be398f1548d90eb244bf379aa8bdcef802af2ce777d494deb2f1bf0860b6ffeec8e5374fcc7240a22d351a55ff3ea193fbb6dd2af0b91d842d5f4aa0dcd5904ad9e4ab89ae9d70e98896267b51f87779dec0e4dc51d8f893ff1b80dcbead8def971f1b193d55f514d1f5e54b680542648428bd06b47461c12063272b498a4919a8e5c90f8c051bd1055345dc164b97ea33715668f5dbfeff934ef2b4a62c44d6c60b497a614bcd6df20dcca1a23af93512707a81f7a550322ae8b734cc3585fa9185ee81a1e67281bd430c638f20b81624dff320dad5ae20a0b8651972ba263a6cb4f3581aec95c9c8af1159f3bc0c6b70c6bcc9c939b51800d1ab09f1ef524f320560e0f6503e645d855232c7fab30d873aed6e526a58d47797f85d5524134dc4ad2a32027e165c2dc3698e0b3d427e02492f774b569373fe0f2fe200d1727a908968cfa53d22e0f620fff46a14919bb391b594894ec6fe8ec0eae3a695b39661139f2eb1aa22bd8aef38fb16d401eea1149c5da2340e0d2ac67dbaca984230b173120be04adc26938e933b971be79746641bb1dd8481d6a221fd28c1e6b84c2325c7f9e2c5e30a80441614cc1b5a1d35536f283904d28c3ff33d3cfccc0bae738adb53817a0c203a938d03f45e95a9207b9b396d421a22763507c6bb070a8b051acb1072dbe6bebf31f7707ccd99fcb171124c640d3df9a11f3e08b28200521007224d300db92150d953e7e9679b187e41c24728b6c228e0f0faf4c3af0dc330481151bef0fb407edf6b557e1d5437f9df6e090cc8ec73196eaefcea2d25f3392c4d263c41fc4fc7ce0f2dffa706f0938085a11fa646c75854f072eed0c5281efcb94d4b29ff967c50ccbd44d14ba29bc8ae4bdf0609d2e2c364f7df162bdde8e408f279514830610c391528fc11061d6a3c8abd6a288d538a7d8b78495547fa452bfc27a17021d15947abe07079cd64e8716b3d90caf23629af0e23dcf3b0a21be900a3a15178be54d40e00a982e2f5dd7d70ec202f1e77044df64640f5a10a356f714b57b8e8cb2de1df0e82a21a79570dd3ac40942acb1593592ce23ccf1834c622b0c70366522ade85612e5be99efd0f4bbed686760b7fa8bb684e362836490a1eeb3297f94e74f47b07d7314543370129026bae7fa244d3c1c3fd1f185e9396382ce1b8bc1e6902bd7850178cf405d48ed50851a392faf618ae1d4538e4288a18828cd5816b32f23d33b86c5189d362ee726e9d465932ac72f22bb4c30898d3ae6c9d57d4c6ba46e4dc2cea145e129481390a0f50e1450784ed1064c5224a0cc3a6d55877022568dcf8b3f41c2dd76468a240556d68c2938240b801f3b2ce624591edcde940114838325b240032b73a0fdb1c0ef7ec7bb00f13d0c2459152801305eab725eccb3391e778c2d7a1eee9b161ae28443d1c6c7d4c13053bd9782fa3f2c01b91d042617aad81a1c6845f950073c714e2ebf7b645e1a90745a7c9abfa9ee4fcbbbd37b4f9072c8b8135ca27c170677d0cd8dcb096d4e4743cb023bdc2b7b1a3ab8052875043ddb08b25ea8b1a429bd012caf6f99fca7442eb60a9b0bfa4498c70ebf7c1df7bc3f674742d338021ff1c7d9182298d60c1da6bb2283709fc3b5332e89c521b8ed8a83301cccc670458e427c20a1532ebc1314b4001487bc4391c20dc04585c9f8ab90742f845cde27f0799bf0b446316fe2b27d29d85c081b410309675cebc61c6e651b8d11c73e8b4ca97435a51e5cc5f4515b6e331ded9b8b6a5e5fa960b7c02b968a83cee0bf33b0e78f3d39c72c10e20ddcabd758eb08f2a167c1de10f70289e26708fc257a90d6941435385f3e643c5a7890f7f27d0a0cb6738f3b80ddae380b53858b41e71e0451aa135d1a16cf26c2badcfef89c75adaa1c385f4db3acebf00476703e92cc2e15bf02dc18f1d4a97df4cce5c51bdaeb871b0f9b10a7e8842ba32e3cab45e71083ae88f2d2b4585423364ea0c0135d5ff6f120d1debff8966c1919c390e3922ca323f160e676fe9005db4c81bc81c1f094a22e9f04954ea7f44ff38c6b19b64f9199e082e84ae18a3c2e1f7c8ff873516d382b6dfd6a8aa07173bb7685664c308152e26b84a838d74c0b41582f2722dc1532e147feefe724baa04642b384ffef511ad1f9e3bd31987964148b6619647fe10a5cc2c33e469b79a55d5fb8d57cef34d3ba4445d701108d1c9977eaeadcf8f1165e111d1e441f77c38629596aaa97db17952e9af73ef49409bff0d588e97e4a3ecb229d7a3a951c00167226e64f1edd719cb21b3faab93b017f3c3297553ddf833c3b9db9ff32a0ab599a164fa74425b2dfcd3c07650a362df9c252be59bb6b582fd867cb68e53141e8b8c6e5e7955a8fe8039a1306bb5d1e8e82c82ff5717ed8ad65456ee26991310cc3459f44fcaa82d0e1dd4ed15e93f28553a474efe83e0eb5c6d800cbf0d27ad520b48926daa29f5c4a94a8fafe9238fac31bd05c6c3126eb4bd8fc761a712c754f27887f54a8f546edae7b99e85a9ee1f1278ca88fa576aeeac4cba101f3b8be68c43f374fee1957d2fbd946f9203334c1fe845a2dedf40ce077571e92c06a571e38cc9843a0e2d81dfb72e2affd13abc1adbe59da3f9f65b03f866b27c168aa045540c2a6fb00d0bf2e6e67872133d4ea5af7c206fdd3930398eb65b98a26c8878f856c1c4f9a4377767e32e665f99797a617784a8432351f2b053ce6aa1a1eab752dfc56b0fd413acf48efdf19549e80688cb2f55ab222273f7d85b3633d56e072160d5202df7348de13f5a7e485a9d4973e518d8f15fa0b090e214970e46c1669d1ec0fba48c9498e20728756bb4151df1044b7f9063c88113132ac016017c2825984297695db30fe422e0b4ecb784a0cf234dd530b385b3f889d4f03938db0b04641d45f746fddad7894156d03b949808f04a3ed0593584a94d004f1858aa9908c720060473d462841b7daacab876741eba3ae7952bda29b44bf987164e05508fe0f7e4a5c9fb0cbe11ad2c06d30892fb74ef0008341c1415bdfe2dfaa52c190a5217d9a3d0418521d5a02cc0878b7c3bbdd5d1a93bd0cca63ec4e196ec909bccca1a791c8437368dd0f26f8368be5164d9ffc495ccb4d3cbac040bba30486d8c4a415c1e7cd053e9688843f817393c1f2c2029029c7c9508d70f82c64e86b972262908ba30a040c3decef16a797d69a3fe89efbc06320e91bb9f6db3dd7defcb8902e029beeee9f081275ea82e88a2401e529a4cda78ce32965b3f3ba64da14655b6725f3e92dee39e171c9c05eee486a0b971b12dd408ec7efd6033f22d3bffe875c3eefe9f0d5b478fc1cc111a4397c7bd92c284d2ac44abe8d9a1cb0f3bfeab315976995c56d6a39f4fd806e068140884cdfde50501adf9d00dff533b14ba273da2b31fab317ac174def4dc57556cf7921caff733f080327ad36cacd5e1a068c0a8b48002a4b8e4debc8c58f7d24fc804aba91402f747211af62170cf8e5b7d8caa3edceec3e44124b0dfb0d0394331cba99ec344cf2e47ca3391ab5076af2ea320f765a4c04c56d56f00e58479441752e26dae2d37861716220f73026645dab2c68570a039540bd7ac8360a091f99273d9346e0ceee49e731015c6bc381496bd830714dac4d1b4253aa533577d134f49cd231fa522704b5011d06e71713d2fde8f307b4e077a94103ca230806347c640444860630b18f44f034bd65186290e9352b0a157a8e2450fd575ff48104f8a30975e0445b6b68c68eb08dcb8b19300c3a01a79650469f29b8653fbea0c954e3d591d15712ae1a015688710e7120359e094cf18d4bc5299840bf6a58a80717daa19a1944eb4bc923329d92550bc79e5802cb4d1d300ca9abe8ec99868dabfb9ed150d93e2b5345696be4de50052a35b3e2396efefc12c50799e1298c29a7e7d67a9df51179db2f19a926854bf7c42fec93a275dbd80edf4b8acb0cd35603e1fd4b540346a1a81d363aa8df80b2d283e64018efc08f3d3af5dd11355426d014a2ac9f4ea4c54ca8c440adf0578fab9fabf955ca16bd054e7de6bfce1b29e6b21ed290300114bd0c2404966914d696ac5f238389af9e7a22ec20d341518a063dbb2703c786d0d8e46bbdd21a349be27bfde0f31ea77d8e9f97acc4f7e35485e285cafa8a825e1d4befe43959054b4f0b462525bfadb667e675accf11fb3151d753b729ef48b40f256323600bcf53d4f4d0ac28689cbfa8205cf97524f3fb1f4fdfcb1f12e1badc02d796c3645771699551260e5d173fe241f7a572b0035339e13942bee08c0ee07cf1fde6b4066cf471268dc90d1d3236ea709a19382dbecbbd5bb731781b6c6873e99f0735bcb61a911b475a06e325d0845552411a8eb89cb499f49a48baae83bb471fa617977c9f40daf71238bf1abb41ebc015b3fa0f818e6203c1f2aacd9427d3ab207fd56f5038b858429f0ab556c94035c9488284d08a78fb150910729f3711aa360adb29db85eaefe8c596a61020eccc7ff17cadd054e621a87afbad11f87709c77472240e3176ce1579dbd9920883dbde10b70f8d180205dc10dec95414c4fc7340d52d8945eeea3ed08806e5441e2a0ca6546e6cccc104432153d67792498a678ab0d511b325050d691e767a16642d243fe54bdbf6585e14cdb29b571820b8b705ddc7a3e1de5ae16a98c9020fff0386582e70393233e5bdea631a28d47c7190611bb11e0e634c651e1078a4760c624babfe3a6b394b923b8060d9a7e479d47f88d8c754411f2efced384c34bd13dde13493b74926bfa69f22e156406159fb36c6e1bb668202ca62f772f2d077868d44aee23bd4a1a2498af8b38874523367d957bed2e9ceec8c28e14bd43bebeecfc207c0c1d2ca5b4effc7421e890ede6ca22cddf3683cc68e64a1b2dd696357cb5379c2dc56e5bb658a5ed9dcb9f0fdc5896a704e0a3a16a5ddb29e8922ba0ecc217481d312bd686440f69740a342140ef1e3827dc490f5a0075c431619c2c81b21b3e68f13372bbf9eb3c83b1b0f529455a0e8afcebf3665cd2c7bcc882ef7aa02bd26d97fdca88ef089b9a30c5a7ba9179e8af2b4d58f5075df584d10d0c9722b83984cdb5996dd00a231c130f1614b044b9d38ec58ede7d993e507f0deda011a9d49943f81cffba678f403078470089e669631b65ab790202e7d616030d00400e48387a479fe0c270b1bf3e245af889c7a5f464c36efe63beb85c354e329786a095541c3a87407e82bded3ff8f5545d5b15fd8199fc9942b7e3ff704bb60ea3fb5012027ebee2dc645e16017de79dde8d2fdc3451d0c4963a0242043b161b479cdc4e9c9c69b815a220abc9133a74ad47077486e240b26fd4ef5ea014ae8200d33d10a5aea61bbd5df2943640cd8be40e13c0617d309771b8ac56a5fc40d4d2b92ae4dd2bf6f4a0912a761daba652bed351c7f7fb77d9015cfc0d11ff16c6e7d56e994b9d3e9b9a535397520b7b7eab3536b8ede81af676206228703101126ca3856f6d15d37a5cdc8c60778a16ef25489646f0b9cfc01adc5e590edca0bd94b65e8193873f502fc8ace70d48dc73c48dc356bf05801b1ac67ee81775cb9c6d405490dba3dced9b8a3392e0994332648f7f8c76830ccb6089dd890192c23655badc4ba3ee73e1ed4138a03da94fde87c24721fbc46edcf42f087d9f57403818c5016844ac6f3af66455b24cdcd8b7d9fa8d211ab6e78ac914cb249e91087133a0d9d0ea77a3da7d507a1112531e33337c34d2b0da4134feab903e33d7c536b43b1ec6d3750512b7a85832641aeed96d511df3a30dd4652ff20deec72bdf1cf8e8ba7838add156d5303ca1470ace055c263ef6ae300b1385e8fb9cf1c310e33ba941b1f8ff86f1aecce5be806185c73b52316315d3cde00fd9909649848bf3b2b11234bed850b286776e0a608a2b0b198f40320c8b14c7707675bb6bc8fddf39153d024120afdbe88164384576c705d2a1efe50609b7214b2684e8d22129c547daced52ee9d83bb5172698233b91c0215990880a3fbb4ec4a45c205a347c3b5d29ca45ac69ce7805270e3e689adcf9e96ad325f00aa90869e41804fb05873f1cc2aeb0f0df693001ed075465fcf042e2afee73f2bc133be8bd2c63533f1f31018870e66b17dd45beda74b0ad8419caee28399c7c88eedfbfaf01e3dd37a1f513867f75b9b54edf52c36980214206d8f01a87f60524ff51c012c2882c1f5625a9bfaddd4cdd2be07dfd7f55cbc22608205be56b434cfd26330ae385283d5d1f10be545778184c74a77d035211dcb0b42ed8f444c8442fbf332b9e5c1134bd773c105ccff556b52268fdef9afc654933abbaadac760434eee14e4030d909c1d91a330c5136afdf420faa09db4fdd2d77ffe89fbffd5bc87dba1752fb82eb61c17adddac016b2ea3fdf6a99ad25fd81d302b472d200acd436875cc3596603bcaab41a07c1c2b374241b32f37827cdf8bdfbf14cb336935437ab08e718872fb036ea0d913fc32d3d9d6e56661a539d4daa8e1ad4ea7c95c032391f5a4158dc32a59f5d2bf0fd88c58ade5826db1dd8135094468e6f1ac36c08d3ed9ce2c958e6ac81f1fd3e2296eb1d9fc882ea6e1f6ad0b128c11fbe9299730ad198a31e395d43adf92e324d5cf4fd141b16e697c14c43fbf6d22be6349836612e770ee0f70756f9092707c3a5b4274027289ca82951b560946ae6e80b3ecde60b194f5c2ff292b1d0bd986c0ffd96e5350597a2c40be8f24020549ad8705b2c0460a1c533d512c3138a4f846473f93c888708d591d14d94cb94750190ecc3f17aad80a424075ca435888e14d2b60ad8491135eba76b1e7daa6ec87b8f19e597b8b1f78719444723759f2a608cf3ec59b8b7584653e3311fced03fc61805884b3d0606a618383d5145e9a30c085d9d482baffc3476131f933b63a1b88f8f7104667d2b28457c42fdc34ff23e23e36dbf1103deaa1111b72e6832a3461ce17cd020d64809b526ead509f9588addb2b8ffe9eb51bf8b0786f6e0a6da650f6960b129f001a69bd499538ee0ebed6cb585d9eb1d56ad194736f3e21389089bfe72b2b1f31d37541ec2bbded7452fc083413631def304422655986ecac19555c224b1b1b7c0722ad379d7e7e15a8d916676e70ccb41c78c22b6c69065e78be41f532bcf7b204f8e9802a70930cd24576be5c0dc89e5c23d55b141318b71d4eb9ce369c8fffe5ec01826c2904ffc53e8d46a471c800274a29149b6086fa8d8c1a0c397ed685282843fc4a35f491f70a9dffe2c4f8edaaa808d02d984c90c1dadc3aff9ebced30772c285393329ca4cb79a295ba6b1c4834dc2ba628f981f712acfd98d20dbfa1e97c5001995d001d8a840a60fb06f3d402b26309d51b538253fcf5f1ef25949c90890b847992d9aceed4d1522807f5dd539d902af9d13c1d4103cf72d45059d9af2a6a90139860d3e736c52c542303d7cefbc66797066a6a4532a2c812155619df5633875c325efe4a557772f023bb92ea72c4a44b12c1934a8c6e1af196ffc9d7a434f1457494e8a567fa012b7a592a9809af5dd51ea307495be4031196b6afbf47106e5b9b3073e2b4ccbea232a913d08382d63a0362f03c0307e581c927d8594d228c6b0a2748c5260c0cbd535685d3ac304a2cef59b8c0a12a7fd77be35276d30e11a0ffbc1f3d09aecd8d29f4f7a01cd0eacc2fb0c52fc250283f3e877bca7ac813560f84e2789df495dfff0e330cf9dc66431d3a1f9f3cae6091e8810224e08c3bcdc1278ff40f72904165d901bd470ab01347e797fe20b810d3aa208a426d4c0fd1a61c169bea1e10ae4465894bfe5274d4a858a170e572c9637688ab5adb641b96120d2616815f567631ae4971c8bef7ac1378651a227506047e9af2f32c1c48910f8a258e2ebbcd2058a9655bd56fac6381469715a67f8459c501379bb47d888ff8453b5ed1f76d7cc5adc030b1e81876806d4115af28210580ea51069906dbf3e40cec3925e0cf4afc5f76d88eaa3e2503468b46986aee7105029e98a02532fbd086819921c438d2db4bb193a5b054d91256336484a65c048584caee22f833e1421cce20b0e13dcf1f16927625c9fbd1cdf6bd5db47bbaff3b3c9989cec607ec3fa049e5e2c4c84a875e287f87b62843c37555294dfee16c9da0457d36f3b7a48d12d765620bc2462060efd479e5525616c990e54e3da3406dd3e0f7afa872ecc4d4f50ff09f798148ef4f5ce2d9dae0ac96520f091b5d5a3204c0502e14ac617c91c51027be55d2b96a1077739b8ef88b16848aeaef2ddae67058bf45f053f0138da7bc5c0b98a244d740f49c13f927675f5bf3bde3fe7ce502bda68096fe7e96f8b3b3be09bd30f7c9f4ea1f538dc3cd8bf2bc3536ff9d172ec4df0d0f796bf92c62ce3de1d395b397d623a5f2c6e07e9d55d8f73a1a8a021f4f7e7c098b7d7b5b69eb7944ff7248467918702efe0a4efe8a460b60eadd5dbc8a262c8f959a8460dcab2520a450b36818e1cca75890a177a64c1b86f276c137c533515076c411c6a1d11f7f0c049351a45be1857034b35b2b3978a44907485f9a4c1bd1837fc74f0774ce4c085c1162df02451b2483a9b3394d249c5c63b75e7258d02618484ad5673600a1f0a0c60d616e120d325bc599101138b4eec64804d33e1126029114a17a810ce98e0f34c07917c0521496419de8687fe8c886ab734ed040502c960ddb27285380c04607c03ecdc9413c2ba40955e58aae80547cc382b869d23f15ab07b8b29983ff8819616eaeff5ab8168bcef231435a772402240812153bc21769d1854d935a55014914119f74367aba18ee68cda88718f9ec49f74bc08be6ed85badf19948da9e891c1cc4412aa29a2f1b951a1c3ba42e702eaec1c855504b29fe874295afdb38342fae937404f58d3ba38fc3500b628fcefaeb44511390a0ae32e2283ee95a5c7a853ab759fb0f8c5c8ba8a7047c9f08311930f0c1e1c46d049bdf04f737161e1da288bb4def1f03684f963d0d5aafd790f674a72e4a94dd6adac625e67779defd5e828bd4e2cbeae9712d9b78214ad953c10f7b77bb21acbd400498ab6af7adefc7cca990aed5e9129a1c21518df1df3d2c262580d1e575bb37ccf354b8d104923ea88be44fecab0282e13d2858682124594ee5371ffe10ae4fc21c0805ad8329118354769b9710967315daef3c217cf2fb0328301cea49a352eb66c64a6503d3881993b42a9b62c8f5701bbf235e0053310ab64f38b507e41871f6089f4d558a58279e1a89baa6bec99223d982fefdac35d0ea42080d2b4714bd201b837220c4b819557953f4f7683a2db7e035771f05bbdd94fc2162dc3c330394fc75538275d3f9a658cfb99c9a4661e7e5024501616654de947a2d0617549085d1851bec328396f55c126a3b0fe6fd502e555d7e2805a62a51643e0d627eb47c3565142c1bf01424219279a0bcf6e7ecd9ffec13808edd86931c2f09e8f428e7988b0c2d7cd4c7a6d24204f675f723fd37fe723502d8ba0d2c09512c8d1f5f57314e41e7da7c4d9b6c24ed9d8bd0ea95002396fd0bcdf9cea01789f9a6f8d0b78da3b4eff744b2a6e10aa21bf8457a883863fdf1d65d5a1667a7aff59fe0e7a1488890740f797a9213e402b47711f95a82eaf7a5e89c0fbc42fa68c73cb83a285c181ac9ff3e3a086b0a8928dfe9e9f26aea0a4592aa33fbe835cddc47be8f2bd8a490ff650fd45d83d2405fd71c8a24bb56151c2c97837d6e6efb72f54c910d33d59650245566241a3f4b8272ba897949ee67c0af1390d3b47f4c9d5e3e86cdfe138a64cbe830e0bcbc0625e48f204292c6729bc1ffbf2384c37d8c16fbf0b336b30ecc78c23facd5560b2dbb610ff06362078d700ee66cf3013321d385a5254aff75b38f6ec958c43a5e2ff6039b67e1e6649b1e818060dae458b7fea82b1ac0898a289db506b2a4f66fea9be7e6c1af95e164dedde469578b6728ff369265a3e07d60b0d36af569fdbb9b0754796a793814618304d567fdf4dda3ba20162c4774769fcbe92495f029601d33350c9fa8f2d6ae92654d331b456e4a2818b30d62530a30fb5449bc13495612477091fbb9558b2ac1c5488fb4da526853e1a4a9baae968e4bf07809533d0beaefe5008246b4ae649d6e3f72400219605d5199f743a3a9983011ca6a1c4804127fbdd2596c981f3c2b43cdea466f66497f981888a497f827f02be17c0169da9613f23b524aedcb06c5c1921136276f6f6c1186196b567a929eab674adf6795bfc692a5e3b665a2da03df9ccb894f4f0b3bd6ffb639d70274bbad3d2177517ca0b2714a046e7e49ed118c869f152cd2baae5f692dfba7a07e80b8cae6da0c5dd8541d104a56ae90a72207f5145719c88cdd6e6337e4b8edb39cf10b0a01dc858e4de50a5455669447d96765ba47982330d834a1809d3a61ef7f1490c84f8ee55d4af9599d53b2180467e4a289a9acf550e497a47e71ea3141672e1a3ff3401841f4bdc1bbc62e3405a4666affd2c805dee24a1d5e4d5a7fdfa666867f3ceebfe78ce1a926447d15de689dc7c4fd614660dffa5ac982db37428de95af6c4317a7eea3c3d89179759a0814e19fa3e9d8de1cdf41a43e162c80712b5e47a4dec3a2b96aec3a45d17166ea24242249b48ab0904b145a71f39ba14b6b8fc2fdc66b045c407bec3af451ba77b0d520ce43261b95b34f42f413f4658f6f95fad04e71647e5017a4e08dd501849cd69cc961e242a6d496e48bb4561030c9e0e76d20d835626a3de74f5f9f26b9cddec9af5892612625189fbd21b7d9a48a961c26a7e9420c2e5b289c66f2bf2080db0c4282589ff17bc4ea612a2c3a52da8396787d71a0062c6c54186d199f235d98a96a317636cfdd31cdc6d51645a743b7e0509f587d828eceb349591951e049d077cf0ccebb31b0c3bbbb0091c049cf06bb5a881d4c68e1b7481b3aec93b2ba08d2b0c96da13cebc5a6849a83f8ba7b61d820b69f391481c24fa58192b8dc73b9caa715731037d913226f09242ff7a357e75e5696447590a2e191c1b51a08ee15b4e48a18d4138630765a7da5613bd8b7e4aeb38e91f225970ab5a7f004cd588842cd2ae191bd303f5fdef385feccd8ee713b43dc68434448e234eb9c3193e63efdc77af2c07151d26d0fcc102b3c15c40e85c5fc939bad9d617cd1f671793ffd8a0f3bc70cc2083c3775a2dbf6ef3cd92397319aa263101c0a5c582c0402b19710556302945fe2dcb910edb4eee09d387cb3acffa21045c9c6f136f33702adc147422d59049bb094fc3271b5699305af2e8d27ee5dd521e2dada916a607f237a2574bb404c4b29be8c88a157d96533b5e32610d61980f1c2c4839ff82f047544b4f98a5a144cf6d2eb8ce8e1843b112de12dfb6571ae1fe0e42a624ac51491a3dcc68a105f059575242e6166f0c018d91a9c88ea2d7b5522439cfd7a21429107b5d1989a10b72a5e0aafe364eb2d689cab1b690dd724bcec804d187859e977002e18975fb3d13a4be88dc0f818f0c21014af9ab66ccedb29740b6d47233f3419e008c577586f8313a38ad770bb684b9beb6f5f5779198be549d72ed3759d1944bf16993caf70ad22f119df3393b90210174ca727cd8a052791e78c66765b9bff7ce70ed10b19bb45198b62d10dbc0b69730cebc8656ac4cba319d4d9af85ac80ac83456c395ce0a582b70e49a5296b2b2d49177912a21c834ec703c81b17b70610c3848c83dfe3d81193f3b7e35086a4ae0d6f5f3086210a6c4ac70d946c8646f7855ebe1f02f272d2921934addb97ca854db09ecb607c9650dc615a49165e9357984dde4436ff96600c887212d342e55f5232c61aaaf43125a3a9a9cfb52d062340cc9baad7f3664b867acd1e891f203a3520a91ce7f5371eb89728e71c2977e243b4a011e4bdeeef627898adf186728da2b1f9be9938354500c84a7c6232e9e7b4df368a6f3f6779248b03baa8194fe49715a17b5c3ab797eaaf03ead0a92da8381c279bae8acbba02be800e81abb1c586845a1c3cfe0513a688ee8b774e95dc7988b53f97a8360a2394b28c8997faaef979b97a3c9719f57b6dc0917518aa57220aabb8e3a1ed5708f09a4df5341e7e79b703d595d81db8e5abcdd869962cf5e9b2b4e7b077db67e4f1efcf5ce82599d0a40a0b311873c72a2853f6707f1f20be872eedbddcd2e22d8c1e9bf8dcd79254948993dfeae8058849517459c1da16d846623548bf97d5d696af8bdc0b291f487a70434f6d94dbf9a5d0c13127f71ef07577026a1e0119d1605446abffcc53a045b49c837c08349187a6b22f667e7f34e2efacaab56aeb3d57708656497bb49e238539278857620522920674b5315c1ee9fe35b6879547d484a22b2969d22aa5e5cb5765e726052f0f945783381245c4a5cfd05bf39b7587755e548670439d29e1e7d3bc1647c4992f0b8cf5218f247bd8b5f5fad8fe2580b9c27e23629e35235c46541a6421a531ffb12088af0087401ab708b7b3ffc4ee229bc33261808e9da6a600aecc5eb3451192705776407fe9daa5b488c841b0b92dc369e798ee9751dffc1753a1d169b80e4b49d1b6111ace0d20e6bb0dc3fb24a09a99de86db468779e460347adfd04204b30e6f78010c2fdd7d1563b42ea3f315474f807b1b2ee89424c1c7cb8a1cbffabe83d46488175e944218a04d099db51709a7adc7f0b6eab5ead2eef51f6a30ffd0aa1f90712053be93a848d5a60177f2099bb96365086b0eb023cb6f324afd931a1d24d5b843fa0ae177fc286af452d8f916d3b9aa24ae51b0ebc99405d8d6cc9214bd954db30ae65bd86c2fbf407e661fe9507302b4ea5c5ff6d3f3ae801b92e257505558325d06ab3949db258a5a054c9520d22b22b5e0a5da479d5d94499e1e7f32a07912e0f2e1e73cdc0d94782202efa0bdf60721cc17d7dcc6683233d2746d3873ecc3c986f1e6b8301dd6287dfbcc905b04e4e0d29cf5c963014c5fdc8bcc2937af95bb7a7b7f262a284c0d59c0cfc2c88d23661c542482f68e7d723bf8cbf41555bbd2fb269ad7d0d17df58630cb03a6a7e0b0b6fb2ec935ef3f409e3d2e7b4b7042709d12381fd2109c0bf7364c9e9f797cff9353257a73b8f1c9e3f2d6e7e13cfa7a8f36d205c01a5d99c852b1c57565f64fe590bc5a3160d90c8141bc5cca32b3482231c4878a7b9de71ae7857765ff551401f81cb5be6469de481593fa519b301b9a6b2ee0a50ae58748dd4b3bbf09315ccd8df881322ed05988da3f6ec4929687428aabb260537e869466ded336e61a0be87d6c34b071372f5f069517af468e805a47f38f48144a0f2499545ad8f19e36684d9b400826ccb158a6eb4c2be6c4c9eabd0937ce73f99baa2128b034d394e69244d64637e1f5efcf3be515c606acb6fedd79d8b2531d236a1cb9a83b01521233b523f3fb5a56dc66bd40a3cdd3a9b247f28c42b31c164a04232c811a8c95ef38674dba740026a2f3c7d4da4c21240514718aa73bb088f9cb7826a7a4dbe72cbe49ea9846181f112c61de114868c50c70b1a56b68f103d18955c85a32a28f0eb9ed80472647cc4f25de499d61b9a5fb12083504a71d4542806cf2a7fd6735f45094de6b44cebee1231d764a09697aaff0d8b259ecdc9b4575009826269ed69939b0354ae14aca08c535cbd4dfe08b9230044a8d4a6366cac13723ce91a5cf50b8ac3274ee31dd16d5c0930cbf495a094814ce91ac4e2b19b2bc2620d3b0037ba989915d089339fd0fed473c95511610a1a7c976eb883a152c8f667e3603153e9c5357a4a4de1e8818fb1507dc76960baa5370c21719ddcd770707c3a7958f2b1f3e298691bf676c7a0061c4992adf77fe28d53064cd0c3888a858481a87d89ea4edd8c36a640ef87c372a52e9e853c1f59259087e7a3baace3dfd6cd0c1f081f6e8e1adb3bdbfffde6ae2a0d4b8aecbc8ae6fc9fe83a304b655ef8bbaaeb4b1ece6491c44fdfc9733c08d740a01075882d1eaa5aeabc05aa6577aef0116eca34b3e1ced5e662d0b79ffb9deb5d83973255e976ffb2a81befb51a8475b5b0edd5149c51fb2a7ee063e7ed1178947a3f9729675fa0aab071014201239db158fe056bb3e34ccd5af9e9ec81a6920b240a2c63c7ec1b9cf5615282ec6fb5eb6c6b40831f2e4990e897fef3d1d0a07a739ad07464efc6fa3f8ca9a5375c4daea4b1ad758c8d45a882753944d0c893e0caa55fe3a00ff2f763076c08243108b9b6f1f0e41620309525cf43953fbe056263df1fcf11bd06ffc824388ec584bd49414eea8ca4aaa699d18e82ffd5215f4c55b0b9a212eb2c93d71880ed5447c90061851f46d0aeb55a1ec4dc0720b92f91e8fcf731c1c415fbb96919f5d99c906233723d1173efc9a346e0f11975956bf2387933fbf732abe0d3a095e1191bbc939380e3c384a3733f5481faccc8a81e0133f356317a0cf0cd20c15dfd25cc993b96a942a7ce90e338aa51f7c5bd280f2b3c982dc5258b37ca7ee23be4302c2b9b90576f4f495b46a5aaabe688e79ce70dc2468ba64901985589fc3422843bd7c4f0b78b56113a8eed389485d605e3df107aeb77dc42cbab641ea66b460b12c2946e5d5ba9af5e51e130908efc8ebebc776378405c33247c30285e605a66da7854834311be1d0b508f21db9766b0dbc8b92342075e0390d75964c8ee2cf38e19b0f96ebff928c10af5b7c358acb18cd0cf65c2f07aa2e77d56a9b6f71ecfad343463e875651ec9bbefc86c1ee59e6941a2292098c854ba2cc6a0cdebc80e01a462dd412fd977743d556ea4226a7c4416a45809c0fad55ea9fa38f944cb2d52832d0f7243bb2b523ec38891a14cb5a1392044d71e859e50383cd850979c35155c7ce01ced8dec8615fcf20767a8b8346de9dbe978e0cc63051b6be72c89a488025c6442552df2c20db1518be4279548f319bc178f591c800988c493fade7abc8b3953216dd12d58d4b5cc1369400a60651586beeec192ba9c95e5ac2b86b9315a3f4bc588f0aae42fcc5dbb8c20d505471b0e861be1b9fd33fbc5848f6d1d2e8c4f38f96b7e597ef9b601cbffe809631c1cc3f686a83cbe7d15a7af982bded1e9342958e56d8b42021f02895d52ba86317928e01fdcae84110c785604f011e0d3fdabf4dbf7c6220634f7e7a5d4e507d79414326da7567a7e246b28c4997b65a6254b0b2608cc1c5915e99e2a3972031254a8b673e8a12972bc15d6fe3ef4f2ed929f16286f06976ae3d03a20c10d821b398deee66fa16d838dab9e582529668cde72b13a7be3b594cefb47a2632c7505d32776aa78d84ccadb9d5d090314bae44bc1c10f0eca9d2dac77f08712a49dd2383e1ca4c7eafa354846101fb876e6068f00190d39878dddce6959e455830e05fcac1be5599d3c3a5a4dda91dec37beefc6a7462975c0cf302dd5141e2fb5017a54118c152eb822484230880344bac4d1ce6ad5121ee0d9c5f1146f159a0cc433a24ed478b4554f1d9efbb122bfc03059b03b87cb815c89293e1063fb21ab3c83b49c643409094be68e084d4d8a2cc58ed2a0fca6af9421d16b103c892dd43a41d33dd18d68831975f369e766186a2ced63a7dcdbcf47100df1f98ed0140d946b28ed3654cf3b1cdba4f0e07e2932b6b10c9ef2b8fb3c6d01b0f840d2715d90008f9c0f30fab068409312a8578d2062b1e933702bc085ddee30bba042d93e9a95e6f320b365ce451723580874eeb31bfb9def014787e96ac2120c730ec95f13b8f63bb9af2dccdc21938bc1b0e24dacdc7ce30b3ca688665fc1b68f3f3af7377bd5a86611a073010588a4ab9d23afa199b66f7e0a85f333028749775deda278d84246b681bbf9f59af6c93c552e8f666653129c781f34efa0b8515c8b0cb5b05a43a1039217fbc75d3ceda6b19121382256f58fd88f4a67e2fdb2dc10a6dfa1cb976f313f79dc80c66fb672b89137b9bac937bedac45444d8330ba4e9b59569aef83df01cf65d84520262a7bcbb2802a2f634a928c2f7d634fa80069a5768aa0d54b0691941d76a616f26535448ab11a45b49959602ccaed9806170a7af57cf649df5bbe5cf67c905d89084e48e31aa189af0462027079727b8de519b4403363d0299b84e95a9cebf06a23cc3821d8b71222e05cc168564e3c0278f2097fab095d7a2ded0e57ddbc69ca5029229f305c3e74c6c986fb855682464b46264b9d6e29c1f62d6e0b4f1334c8b7c1fa125321eb22bf01a601b664846e41da6a2f0bd7045dc99ab37439113f103464dfed1ccbd0b21c12008664b45d9d3c2741c45544e3709e59714f92b4e64cc723a9c42fec282a30e10333c0517435c94c98e2e991a107d0e10bd49f482618105eb3707615be5168b5e768f26da75af8b8edca3f731b39b7b7d95d705216576caa88a842fbd952c3c050c36ac3cfe1fea4fee1e0c2dad868896e8017e730474689782461ffeea45350aa85a296bed8c754c1f33bcae140e9e401793854a3f3272df4c38468026398ed83ab43253857a5f908aa42fe699da16074643c59ac9abd645f6ce56ffd387ce9425bbdd0904eb964535ef0264baa96a761127d9661fa9656b01dcedca5403684017c3cea522b9d0d7d2c1c5ce6705b3a229ea397ebbb6e739db9a633bba95245b066d97817abb59f1a2d0ae3660624a7546bdfdc595f569eff56a9092f91fb0174d3668c82cd6b7bd000b459b6e85525a13051fe79d9600a65076e8e6e8401a09f84d98a892cea509dbcc49dff007165c56a9a3dec4a836ae8cfe3a79d75cb9ea42c86cdbc65a02395f28d9c40d4af37c7fb230f89c4c7214e0ca64ef3dc8a1d018585af8cd37f1b3d02133d6fe80bcec3dd2e46bae80d079e19905d57755c19ef48fa631cd0ca9dff2ce59c3fbd106371b739ae23c11d2e4b5050df3aa57bc3ab110091e8f197d7ea7f982d7b6de1431ba17c016eb5c90c6488ef4af55d1c8e90b036442567f88cc22f09456b5392c1a01d7906f9c1ba1c60d56b02c32604b171d78d18a66c427a762bf343848bb470418517214a4955021b896f5c2491aa420e10ddd79d73504d43dc7f3d3a7cad4ee8800b79799c5087280eaf581739782871d9bd011e1bb99e680c12fc8ce5ec622805e369b70f9d3fbde89356f20134208bcc53f5685defc85562ccc6ef8e563512e2ef3903f69b351b27917cd40cb4755cc025b63e8ce8a119934ddb1a05f892de3104bc0eea57a79a1d11fd8793d3402519bcd547ac86d5d08844c8e0e06ed90712219973299ec61efbaf47fa228b9c3ac73ef0bdf392e8af9da1670deba8422424c79a1d409a36a7b5631d6ef8ea610f8aba85ef148444033a63aa785b4094aa4d0739ee113297af9f2e38a86863c0cda75e0178488e1f0af10ad4547106f833c1a240e531c6992493711981d1e786d5bb9f038b3ecc0152d0ada8e31e942f0cf0f417d8b27dbbb0bf8645bf6da146f6de5bee2d534a32054e078807ad07718a24a8ac4e35d890ad5c2724f16d609dd60909e8434a2ac2a836451c164631aabb4afadbe7234eb348ae7bd187c34518c544b606abf2a35fc832a8f20bb9882abf9083a85272922a9f3f10f83ccc0ba0e7e76f06ee41bf357e20f0f98e430f0a7d91089e91118741c94c8441f99dc738f2b767148392816022aa7c54957cc3a07c94a6dafc460b74aa7cb95ba37ddc9af91b72010db787046ddaeee9913df263116bda45011424a821e2a0ca88a4ca288320629129a3922a5feb9edb1a8ebb491fd07d7ff4f33131a01f81bc18d087a32a3f21ce3ffe9a27ebf4d644450b448a68f71702912306e5279f3f0fd8bebf180643dc4fcea344a0dc73fbf984b6aded8d4031557eb42f8c55fbeedbd35a7eac1f2fd6ee38d73caff2734413f6f9781269665f3857850a848cb0a68e6643bc21fa5603ce9f8badaab2732754c3f6c5438119ff971656c365c35b0cfa8750347ec8ad17f8b7cf33910b28260cd66d07872b843455fe9c916767fca59cdba679231fcc495af94b7630420d294fab9670fb589123682806b3f9412c0aaaf1bbade91ac3007c386afcc21b996a0a6e65c29943fb3db0f2639135813df3636b961475d8247caa8c32a832161183a8f243435019b8d41f8cf6fbe30330fdec829c1ab20b722ae8e9b603560ff2baf6a674f9fdf24340d0fe8ffb42fa759f03b804b37dac9c17b37924d233287f7a320ccafdd495228723d5bfe652f693cae0fd588382200fc8034a1918940c4a1918949fede0035cc23e199647062eedcc9947904740df7de8b7080d252a74048d01ddfd843c1e1bacc973a4aa4ae984d74da7ca28a5942fa5941fca9b2a41f2773048bebbfc8c8aadd9ce932829a87f2851b2c89a24a84a9632a892ca223a88aacadc89e0541c4911aab81a341c3915479286a7e169c8849a4d6d7742e3735c435f42b71a3acd872a7c0e92cc8a67fa99b009a45101ccf132a4981ac61583bf42634d31f44c89bf68258b2d816a7f64b2355ef9b78f44060d8217b5579f2bdb75615b118cdd22b268408eab8c0a30079762ed975fdc00cf740c0cf6c715c715a80d1ac6d59cab5e31d831b256d90e58f1f402bf7f51090de36aa5f9dc69a96a485b3b2f43f384e30f05424b58c2129670920f033d223f77118b7e6ddac3aff77500f300b4a6ee57f7a37b94deead89f8f4d4d7482b3fbca259a67accd2c622ca574d17159b9b06abbecd47ed9acad5e6c466bacea8b2455d6d025874b61a693e2521872d9e18cb87811a45d9ee096d09943d0d02515b2d953d7900d162c2d2b389d26aecf95e9c453a6d3335750fed025f5a2e3927299c19a3e5b13ab73fc7c2e337091a287bfd0c58957fc42171bb88484d4eed4ea4883862cadda5cceea68cd25a569fe2e2997255c5a2e52d8246d5c923869856c5c9460d97481225ff318b2d1417129e47242414244a2c70fead91a1d6ea74d2e35d81997d40a60d0680156f13da8cde9b8e8a036a753b52f7411c300994bca25555d74a48bc7e5845e6c382170f2f7e448688c359e78f4d4170f0fcb8d1323aa2f9620a20746aaa8ee921edcd425402a3192d455854184a6ae2a0c226a2894a186daff2055fad88786ecc343d334eeb70f79b12e97247dfae204a5bfbfb487fc1008d36f54b9ef2ab77db6d14de46d0d79b1723faa1d9bfc4443bfcf6d89d2d73e3d486063638343a59f8b72a0b16a8f711efd0d7994d2fdf0a0f43f3c44cf7527f2b40f79f497f364e5360ff414f4a19fcf711f1e73034dd03743df323843212f9ca18f1f1e30a1ef0559e9d3177da2a7def460e8c74a7ff340de11960f867eda0707b41379b1863c10cc173d17f234fa212f9c55f3b8e9710d41ac212814480d41ffa3abf42797b20f3df6ee516f2bfd3a06f7073424d598df3a6ec411a92110aea1e7bef3f8c3a37bfac138602bfd16b6d20f46f4337c38ac501817e8cfa73f5ff4dbdf50b5077921900afa9017c61a7a11f538ee42dee7f703fa1d1cf26ea820ef47573f5fb7432c00f79a177ae57e47efe0ce5b06b9c4a5ed4715c364b8cfb7ecb5e7626758c79f1cfa257efc44209eb29d6c277382ff841344a230db7122186c9c8ddb20ff1c08069bbfb05f47e4d73c3d13b6cbb5353c432e97941b2eadc904d71456b6d357786c5040bcb21d2e85345371290c654f644a42998bcf2082f6ef8d1cd6134470739b676bb647acacd5d1b3679abd6c75f4cbdadf5a98325653e1d2aa9abc6a7f2b48ed7eb984a8a1df04f9a8b44852639835948e52c39652b7869f63cf80f9a30bee4c83a086ea150424a89e469cbb433972e478d3cb3e1864ecdb47f7f7c3c020f7ca0ff77dac5781656d05b8b41f6ff615e8676f1f1568ec5b81a6b9bbbb979b9b8bc0cdf7628d3dc48f5e883d7ffc48db87747eb83df6336c7f44fb65d01ffb648f8debf61d41fd88a9e6c9f04c3ffdeccb413bd68de351bc05315cf2f78f1ec9091a7f670776638c31464dd334ede3b66d9ab67da1f6db73da16e316372dc6eeee66c36d62c01c342008e658ef4953d0102435751ecedd7df2cc66cf4cd3cc6e681b224733469565685450d190864605368d4ebd83d97bd00634fef66c17b732fde9a1eb0a67ed0af8d8a131f49cbd72b20158f46a7564c1711b43c590494854aa0b798486239984447121b9905cb04ae53a3af283e5e44c29041af64ddf4821700ee7f0f0e8f4f4c4ba1f1e5208349c73466c092751343e179242689c1f29c4a3518cf9b42071e0e2fb73214927b63e4e984bd88f5623d60e68e8a11f68385a71464509834ea98a41974568485574a5622f7b79590f832f5dab1515c0388423d60e96445eaf9ef1cf5ed844d13073c2a0b7aa3f334143ce49e5580c66ad393d6331a8d5112b7a3047b6cfbe9fe315c81d46ac51cbc553dddbd3688b1117cec3c7e8a667fc376f84d333feed654fd09bea2db7994374ad51fc50a03fcba4a021246874ee15b5a021a77a557f4ed5a6f8fedc6a6bacd81af9fe1cab4d194b455ded3ed0ad612aa4293466b4e219ffb0eba0b0ffece828c603a9e8a8a77a387ad5d18a1f7baa6a13f78d563de3bff117cef9a9ea8e56a31597bafa8f98702973c2a0ff68c5259652bd358252fd69e675adf6f76cca4b1dad98069406a7c147abeca533472b3984eeac0eff5e3955f58cbf0a86071a8e56aaea3285ea3fbfea8ff99c9476c6eaee248a0aa1ecde491550f9dcca8deca0b927c776577bcc0b7f681af63b18c4a2a41418e1688bea591db1aa87590dbb56f59741e8ce5f1d4e228d9888c0a023d668151242e387a3558ccdcb116e6578fba6713aa753ade9a23ca41768b3af54746dcfb4a128d2cde38039383145f30279de456a5116cd0add28d2f7cac3a0f167dfc470858c5b9cc3fbc23887a75392c73dea489ceec198c5a7e8c93032543c454f03f56a75c48f9f29dc9ed4d8ddf83a4fa8bad08b869edaf155f525fc890862d1d0534e7c8b3579103b6383357d56d948650fe2c90a5654a691a2ba13957142ae861e44e5946421c2ac8b98d0fd1cb0233484869efa14834b30c8aed053ae837dee2bef62a4781c53a833e1526a629f7da951ed2f85fdb29c547657e5f86d751e34cc27ed5cf4e2ca911bd41024af13d742ca70e2e6c479c499e2879e1327af48b9784e1cd652a20aeac4655634c941eac4cd0e4915d5090686ee82d545ead4dff60cef6ecb840723784ed159090e043de4f3f7f01efeb1d741e10db5de10e305a4440182390a81c6df6e66fe3c0f7dca60e9c18af7ee6eaf826e1363bc76570cd4b6d862b2e5fcdb98d4613f67ce811052aff8aafdfa54fefab53ae27f5c743f73a5b8fd95e911cfc48f1dafe87e48a30f1b7f77f6ddab48bf581d18f6cc7b52c5c822846efc361603c1d1f097237128dc091a2f3f822371278ec491b81387c2a1702338147e0437428f6710a4a19191891d819e9352feb4c0a31a468f8961fe16ba475c1dee2308d5a10559f9b985afc33e2d6012071ae3078715cacff1d323bca1720b73a706e297677012c37c7db35d2cfbf57ec497bbbf96caf65cd97ef38064803a6b1e10d600ed5cf5030c46d7646cc8038ee0a288114e48c13172460d49468048c2430b0b29372083085a182948b5681acc476ed0284910018a22a87001146490b164082dac9e358e14016709393c9f23a891460f4aacaef062cd18b9b377ef2ac075a8cc472a1307c2122492ec08c1c50f7c3885b47a193524557715aa3f0bfbae0a42aafa18dc035d056c39d4ca37e03adb1c0c82ddbd9fcc19743f16a19d15bab1633066d9fa8f2ec676d13041b1ba2a284e94a0a0251c9228ba1f2877033194b80225896d099d755550600006e82ed3dd8d49c6dabbddd77d334c66187bbb77776b2ef213dabb7dbbbdbfe69f53bab3bb3befee3a80c1edeef66ac60283fbfe3d0036237591492c9398ecc0c8366dfaa6cd4c82de9ad7d33377776d76d632759bbb3decb21dd0d8eedd340c7eddeab2d47da95bb7bdbbbd63c750a563984f20d28acc867ae06062f56a7f0422ab7f63b51febc0ee0b6f89c9b9bb32cedd53ba6f5d7c1efeed855d8e0ecbd4e8d576c340dd07f4e99a6cd1644ad904c3b0d9750c8934b5265846837ed1b61a390d8b71f3884da009f60102b732bd18a8fb80bc4f17b78e93a151818666c76705065798b3f36454da8a152bd77ddd397afb807187f4316c1f17be7e66d731249226b56e99ecf3de88411aa578f708d56943b3cf0b73a34c29fb30c70bf73e3a6edbb6b176766adce99dc6be27f7edead0b6afe58e0e346218b631c88c38dd73400448a264309f004149e5cf3e3cd801537ea0c2065d98a1841064643a90d1fb832a95dfe58d4f0d55a8417238124bee2c3f9052390a1de808edf40f825404d4ee700895269018c2c80e7690a2e5c0437ce22ac9684b683a9666858a6b45f9618e48ab6d5b556eae403d51014ae7090f3eb06085cd939c223a4f90ecc0f344072c60010bd693253db0b06a3d0163080b57f08c48314e439140e30228d8e0a25059a4864f73a8fb5043fa6408d1451445703950aeae2a0a2332608e05a11451fd73d0a89ad054553eb7597f86715056e0d2e142a7a7e0cc05bd779d33758f4d7e5083575371c39c04029fe72fec7efb1d1c72fc5ca47486b0fbcf03400f24d68e7a2d6ca5229187c34a1843a5dfc61ef69b0744d68e7bc871011f512565d4ea9021dd1e866e1d318a921894efa61018431f13e1fe96674206a2caaf4d3030f4873ef4d5d05f0db1c9132b38a71a6cd0ae589d5abe061b04803af5dbe029609d90803ef4379c628b077202e487bcf782760ffaf0fbd3dc43837f18c5608be435fcba3504dbcb8c446a83eba4cf0d086d7c406d80426d84a83b2f284d4045524a2912b14829e5e7b2b308896e741b2296918b74ef916ddc70e9641271b1688312915948263c99cba6c66d8f4d12a9bb6edf19cb284d3d12a160983b2834435db7dd32e7de55c452d7bd06ef952a6361d5f86956f554aac5634bd753e3a7d79b2c657169964e1ea1a1a75aba1bdc6198a7a212687c1a2ead4135ee462793a06b42473f3cbca77a8ac90b3387af41678e6cd114dccac43d2d6bceb852ca133fb149a9b2039c2a4930a9c2826d08f4061bdc16f453846e09fa7175395013ac688252277ea02c47a6a80104d7841a41362be8bcc201817e8e90a2120423a83ce96840b5ba2a2a2c2aabcd414ca3950628f2c4293cdc2d85c1293da572bb18acbfed22b99a0aead1e3d8c23a328362efd664317236bcf56c3dcdfb21d76d7563f3398d0620b3f2eaf0df7af3e2ea701bb4afffb1e79a79d1797548d91f258f64d181462c2e836273cb6f908a7302c90bc9e6e405831ad247e3d5821b2f22dccb7075552f1c6af83458175cdccf0e0d339cfd0ca7258c94990e97648d9f25a152e367ae296c8a3ae8644f1c414a8d384c6acc76b2568d99941a33cc71b81466a91a9758824b292e7d4604971a50e36f9819a9518bc8f5d01f19eb5b2bed990e6a9443e8aaa6a0bec8d9781127b038468e31f627c61837c6b8317631eec6e82d7f268a8631c6b831c68d5df7dbc7996270b65a5df7b3d47e61b644a99bddea3e9014900be4ea960bca05c5b2d32d908b65876587bb61d9e16ee604750be4ead6092c8e070e4710ba1d9dcb692928ce0897e272fa432e277e5c0e779303044c8d91ce9ee1010d297fc82636e156266471f5c7974268f3703882d010843de8c5257feca3c16bf652f7433fd010f46271c260a6245ba91894456896b1b0585a42a8fc908515060da0575440accc2344e58f12f4f2403d2dc8cab2434316160b8bc5093f77d3261818643cc90f06fb3dc9bfe134f903bd4054768a5c4025e901bd7468d8b579482e8c859a9be728af7bbc569bba795a41b884d52b6ec325e998ac2f4aad78a8d9d444a957b8a48016c216a0c7ca96e28298dbb4e9e5dd83752b0bdb25b1efea0c06a1923122b8950907a0aa1345f7b9dedd0f0fee254a0ae9fe70df71d1658c516e1e7be86e1f7737e9adec6295284a6de8f6994acaed777b6a43a7b6815cd486621c113464517d3cdf1466827e3d29d84814e55ea050a1fbd26270beb8a80df5ba363493281a825e5b0a3da480e25256670a3aa419d479449da1c8458b35a130c1a062d4f9b99851e75324a8f6da872eab14502eab36bdb4e277a379337e8eecfc97d60b14e65635baaca2cb2a8a6afcccc966adcd5c5ce2e11247172cd6f4f17c3c5dd4f9dd8747e46eb2cc49d6ca5c2caaef0a0974ea16a9d01f19ab6e2fbdaf87c1ed4bc1667e7f8ed09e998fbd68f8f5d4f9f57c575c557e8b4ecb8ecb6b6b3e55be0b152ec597efd263820d97b84a16848ea8724d2fad9d99bf55f9a19cad69a952baac3220ac2905d44b943a9f6940c38fa7cee73e3ca41c82862caa4c85fd0e8e91e2e3014d90abce9797168baa4e14747a26260a1a825e7208ba7d8882eb01f223151a825e753e8867fbf920295ce27efe4d9dd5850983d365c5e07cce65e5b28a51a5806ad3fc4c55e773a3e0c2ea44c1d533f3b91005579de14bab4e4ffb39b5cf65d533f3773013347459d59902aace5f99f9cd300095093b241a3f9ec1ed007c3882891d7c38627573043a240a4e0067a02abbbbbbd0022268d8a4a6a096b811fc86bb0e48aabbbbeb547e9f441852f93b229091020ff632786a0065082ba801a84330c308d59dc7cd68a2fafb6393827248e2eeb2554694d5a28c15f06027b278a9fe534af5efa49851fd476428a95e45f5ef501297b2536ff0f0493bf72bd57f05167c6c4d1c637e5284a8fccb599994d290133d7447a44057f0c0e17cc668ad601b9160a004064c3a1a6507cd088a1ba308452612af6d0c368a64a79c961645080fd84906aa1925081da4119e2cca0b70fc14831d2c4a133ef4c9884a4651826224561e85c90aa2112d235c340a182ba045a0ab9d90a069b046a418248071a305ac699a1290a05a420150578584233624d0afab42020e5d1114852859a0718510683831058d263628d01842070d225ea08142c32656faca41f51f915c63bc9a6883f322167185739eca79cedd91ce8644c77a9a39a9045303cbae90f2921f30327d051ffaa5d484a0fe3c23436d3051051355b4c4b216ab99c3404115c6903d665bac4809eacfb9f698a77df6690147c5b22deaf68d7da19cd5b1fd0e8e4a6818caa9dbbf6cbb3ab60fc71ad435ec632827fb5235867270546eb706009f167054f9196b6b70a050e3ab474c9538a4fc160555f370d9c708b2ef30a8c36033883f9859454ca8efb80e83432808b60acc5fa602839d6519cd0a0c760ed7f12498159406a755307fbec320d8998eef80edd9ccb22ccbb22ccbbe797e649e49af9b314250703a587bc6f5cabdca7e829cf94f4f1ec13e62ae6a2e0b6e7269270fed9f1cf7ebc9385c01c098c2e6b432b46350ded01f124575319136ae2538c73506c7725159ee8c333824705cc45c08755601650681a0ab8b00850a0485ea2b7524111a663a9de93433c85f7ab1eed6ce9230c8d9ce97e9d87412380e5bc235d86e73941826e796dc0c7a058dfb72bb0a1658a85458f0d0d151a9b0e09193d3d383050f89050f4f4f8f0c5288142299482162d475ae8a97119514e3bbbb7377777777777777e3ee2e1645e4b88b496f1548ac847dd84b190b1043f815931826a5dcd14cb16f7f5daa7f40640cb0f5300cc3b22cc3b2176cc48f51e60e63969344cabef9fd0b4efc52d973e86729a5bc8185c79f9f87fbef588d0e054bc80a88ccb59fa34c2c40c791ef8ca495997ff908cd0e1e7d414be1f7b373fc28831c4e2a6b386ba8fd936292277d712981b62cc1a62029e8483ffde17144caff7c44a2cf8efe78f4f9e3c2925141df0c9fdfca61deaef102326ce2a785971a5a15415922d1872da97056d18bbe503ead21a7fef87833c8076d3e50d94f9f6b0f069e894fe9e7230bca2da9e50803833e188c0f039b5cd53ec2ae87d7cf176231a8ea1094eafea13f0241aca31779b12e60c70e061b068e85a585f3b4efeeb9b259e0a64d9a181514e2662751b4432d18bc0714a725d526ed5b765a9ee012fdf8a2e77ab6a767e2733da15568257a6269e6a439b6a60654f42115795b475eac212fcc6a185ac996548b0d6afc168f85db96d4d6446075445761134217c060e4384f8b2fb8920313506dd23e827842df12bf45676b441fbf250997d803551c415c350cad4451f4d1296848b917799d14b4496dda9e5d155a513a8a1347a4bd48f4346dda5ef4fce1218a128011bdf6379c3e1f0f067f2d0cad4435706abc542767d11701ed145ac91818d0cfcb1ef9312fa09f97aeda3cd789212f6cd9094db889009f7c9c41439a05ec885b03ca959bcfcd19b5f821169736e4a49b78826a26d8f44cc76d5ac76d5a134c580cc6ef3e86536a1db769b1326150c56054c26094407f2c80bd7f3030780d379c385742e587cb0aad56314150aee18656ad659960c360dc534baa67b029d4556de2542aff9e36715fcb36a746694f8def49e8729cc76d907c6770da6c271fa33168d8926a49c56fd189dfb2137fe48a2daa1a5b5835b6b46a6c71d5d8f2aa717453e308a7c6514e8da3948eaac68def3df6249a423ff217d296d48bcb6f887c03673355e4efaeaf4be97dc2cb95d2bb73e066ccb26fc433912373153e67fc1d1c3f18893d0c5a3cc1c8ed51b0c90f06d3b4978f022472d31e0548fc8361d3bea658f6edd819feafb1ffbc0080c5e47f955f38c9c0418b092a86d8220cd629ec6f051a156822e6030d571524feb6699f3f6367429ef004a5377e41f4b75946cfbfc30797b2978f012e69cf39a952864b6f7ce11c7d21583fdff2859fe80b7da0ef03ae942a3fb9bdbfa6691fb5f5b2acab59f6eb81a0bb24b097aa27581df2c32ec116a004ab00c6a1caf7a87911882a3f437d48b03ae4c700fb92a0fefdafd337603d69c0ad4c88e5548f71524a22fd8320cd8721415731b4699b19b0edcbe289616b3609f049faaa4df2a3e9197fb0baec9156d6245bb2676be2937aa043240ed53ff324c027295b6d9a33942dd9fa0af68c6f5f38b3cf77a05c1c41d7d57a7457e88e6601eddfd511ce1906db1443cff8fb8cda871d1157adf9c7d0fd3d131fcb9156b8425ea2b6b814469c1a597c6235e2f354afaeaa474955f524a929d455ad31c58b9b7a80ba4b9c40b1024465716955568870bbe273a1b89f175066b1222a24692217868440e4d7907598071afe18d58ec11394508ea99d89aff3da51b14d188fa05837ade83a22040de3111abc1e91efde479c48049be4c74ebc58234ecc89cc129541bf79ec1114d5a656c59b56b5c9553164d6ab6e0c9bc5ca82702b137239d59fc311847aa68a9fca7b40c34cc53553b589dffbfd331697b8ba2771ec31ec69dad48fed601904cb321583ce35cc5435478b1f357bcd0b47557b6ece656d5773f9e01536bea6c519490f626470dccf13bed8d172a9a8fe1f1efed1dfe54e517d77f7c3e75d9a287949fddec49c118726599665bda33ad6ddfbb5bf8db14977b7dc6119b127f1b868e8d260cb01ea2f1fcba2a1a1915ee7c2d759dd5d62f1fca34ae7189ffb23c52fe8fc90c61fa31abf968bc707377f7345d3b5e8ccb8657bd3eeb946539a9de1a795431a1c5728cc0b0098a1bf86fdc1b850637f6095c1a2f41046116affee60eee2d758c272811a62a8a0ca89a9340065842d7218020f6c10441a2cc3ab891554809103173f9c18093ba0e1a460430919b061847413d83042c3c146aad9b861c3a6864f837519343402f814d64409f02f03e600737cc454703a43892ca0c829220934706050fd0bb5ef074d7577770fd5c066eb41159bc55440c40728dbcfa76ddabe1a8eaa1399d4884d75ed833231c93455a860340ca9428732525beca0015661a3fae7a081a9abaaf2a462755555baa8e1d7986950b65d57b86b5440fc69f7eeb8efe4264955ca5fae7bd3324cb6e4a4dc304d868830e766da625b47ea999e19ed9996717560ed5d1759d367cf34fd74bba63967d6ea1916cfd04b2c4b552ceb342bebbb4eb14681ca17d1bb2fc277777729dddddddddda574777797ceedee218c57299d3ee1296d328f4bbba091fbebe813e734e94ba0f1fd5986d0f8f21329c17560440d0ceabbd9bb6733c3aea0f1b11019beebed3de787ee3eb3afdddbbde59ae6cc24a645675c72df959815347ee7ee180bbb62bb3f56b02d9ecca8a46d5546452b158d8800000000c314002028140e0a8622a140280dd5791f14800c7b94427c521b8aa35190c3300c4206114388010400000c01a1a1a1e10401e983ce4a612bb7abf4b571a5eadbcbe7015879ffe8231666ae0086786053be3f38aab5257370cec2c695011eadb50640a97db3fab45c2045cf27117d8e43aaebf24938006dad624fb9fae99f6da2cf83e8583bc05634c1bc8adffd1fd4778e22de9b3d992d02631d5616977f525a6edab730a66003e5237e1d81414fc48e7e9d0e18728e5c718bc5edaa06bb7e23043d7bae8773e749086211280532662ecba64e1fb9a9319e8016e651f525ef0e62ecff85ad35a7eb5d14cedcdd668db44d44352b463136bce7dd7b641c5bca20481af63947911301f3e79c234e011a746a08ca48b171d2a0bab992366c55ed6151514ccc429fa8d3d99a3aa2dd4d1a0747d6b38790970ed1400adafd438c3e8e7fbbe1a172cb5aa5d3262b86bcc46a8bd548b5c037f1f04808867c92ff89fc5fd9d0ddf096d2ced9c33b6f8f038c5f5592ab69bae8881d1a416198029dc8672db87053c7c3aa30f90337e990caa2482ae7c32956d0f88ecd735a439e8f2b9c2853763b2d864d7b69ae726e2402b0fe968c5648e0378c863c37cda40c4fdb06e31a2e922da6186fbe3c0b05fd7282bf0f32e519c9bb1e4db1c9eb1a4b2cd74c0e8816673def172df64e8828505cab8fb6f9d44bd584221146948c9e64ae6f1e20e933b58825ab0939498fdbc91a7597a068b97fdc9137d6d2a3cfc79b1338f8fadb2d1b714a1309ad6cb366423df74f024df94aa5f2dbc450b1059f734962909002663d22399265f405177194a46f26b1347e7d189b543619d296f1693a600fd703092ad935dc1610e0519230a94dd80b54117bafb884a0420588997905b7a7fb71025c688bf6158ce3bed5899b8847f67f9f3b6591f2e4d66d58c30a7e0f47fc3a8b0b7f9d21ef3710ddd035999d290a6019dbf12d61c2c09446315b51571778d51b72f3336acc41445ff004ce046a23dd83f00c25f0402ba6bbacd4db6311109d94b302d00437f22dbe635a07a25a9f4d72e622cc4e640148ba9c39d0477cdb3f467090a260dd3b8fe4f73995f8181da62b96c74c913a048dda5d6ebdb1a412e2196ba7996b592f24045ae40deb859ed3a108a884e0868fe80881e46c32ecb16e576cb6a2d57f827af8454260f120ba075f2130b713e97c9588be24c0f74820043265611c30e8ce6ef221f67171a861c667d66db6a671571a4d7c8976d8cef2ba3619d248d6148b64116c7573e572ff81323fcbbbe9e969ae8620c0b14ec4cefdddb7ce8cb5fc61681c1a6df5e1a94c0a3bc7da83422ab25e5d4ebeb1e463703971bbefd202455f9d2decd6983216f82311fb0c1662e62c3a08167790500e344e8cdfcdcfb01629719df04811d8de3f1f2f42f5ae089ea5b6c8e93722d424740a23a92f85a34088b310a560ea1aed6ab8627945099d3969c70d2113c2400d1ce03418302a5ff7a094a7973ec890874050d80ca3bfaf0de7e6e5232610143cebfcd4df05c26fc7d2e9be5db5a7486629f9a529161f67427adcbd0d4947e1cbd83bf3414482bd562c2614d2eb7c119b51a94380502ab7987829d7d08afa3f3069745c96c3e60a239d63bb3fd1a011e684e4c99a524749c56aa5ebf023a7a0084b2d24b7c26886d675afe3c36bfd4b515591be86d319b00d254d3312568041da42d69f4e598238f5eabb8e224c90f574e961952e927a42f37d0331e22943bf67634915179befb1bd85e237c937face06f4314109d1e51931fff3cc015af25794d3f368af97addfa3d2c0729f90fae10f62cc22c342999243d1f20c43468bafd77d67850c39155ab685374f54042211e42f255e6c36f1fb3e919420d3c79f49f181ecfa0f9716be10d541736f5e950d8030bf7bf92ecde92e77b184c718450f22329482cefc344d20fff924ae289e0ce046e2478c8f6aa454c86b09e733011fc0d506464d04ab04a7e03a2a9c02406ce431186d3a655539904e30ae73cdee548781ce5aab0c0d87fdefa532610c067ff76d37f2bbe0fd8231e014dfd152580a4e1d1c84698eb3cf613cb5ea78e32c4cf3b101649096efd3439a946e7841cce35451f012d13f5c433c80956fcc4de55653dc3cee9cf84118cb42af4c9e48fcdca52891331ed8a91baf49353457f119380c467c13f27a974195a2ec5a8b190ba26ebe7264ad7a1016c04f66bf1200b3b6ed7e38484ad1f16fd8b72c546c025170668a1f531ba6a05397cc157d4ddad01d7e8cf4068d47617adad5fe3eb552fc22e71398cb824a888ce8c24e691244efd2e8d51f0709af78f9e04e17fb5fac8e78dfc85a1bb9718cd96b50fa76e2dcb65482af0d771d7dbf2a6ee11e100e45c937658339c834cec723b2da0f29e2d807a4e11c3bf5fac0dbdbb6bdb9d47a2376d6c9329c9839443c69529e2a3102193e2191a43413599b842bf1ea8f225cd201ccf1c6f005cfdbee4f91e106560225b6ad437135e1f7cd075c4ab8721ed112fb6b7b1ff1e8d22ba7a5a7b8e65935b0ea13b71f5d17d4618600ecdde294a9ef2432c068ff6d21304ef9fde2dd20e039cd0adfa7649afb03e4c9f6b8fb6d53a1586490d2ed7c4746615ef8eee200e532dda1ecb58ad0544c911fa46aa7c4a191fe72a3b5c9b093c7ca18221e4c39b4adc7f4a6f448af8921f0624ef2f037e98beef6edb94eb1fb66017d54610aa9c32c4bf4e05d1dcaa339f8dcd8ee645b5605a150c2c5bfae162064591ce2d5f57fdc288848b25f8ec3552cbf08b4d98f0e6f120fad2509110f1153070769e6617409fef9868b8b538a953f6b9a029e61b1391af099489a927a1a60eab2b2693c38ba8f708eb8a0e7e6887e0d7a13aaa40824d73fcb3875fa0c0dda95eb9ecbd715c5fe46017e3d2f3b3f3d2c99faf4a27c08662949eb81091eec0520601a8c3f7146781b7e32cb09bd2dec205655d05586a07a3f62806a870a466fc3e9cffaaf4080bdad0a6e9cce0dcfec4b79c0d7aeee25ed6a7464a130f1b4fc890aee223f44487fd354a3334c6aa031af351e30f366cee53610387e7476a264f8a296cc0b439023b23d3c954736444ed528b61c938b966b0d1861bf13557be668db291fa8bed60a537355fa2645a9bb3d05f2fe771adac4d3c25384a961b424fb8086291edac3dc3fb1fcbc2c7f5b91e880715bef623cc7079439f8f24de79009efd72356ecdeb65f24fc6fe8988cb80bd0c2504873231c22e18e590069143ad198c7ae545b3052e8af26740f34523f3a7ef348cb00a8d5f94dd3db892b23bf4c96790a17f8a191e73fcfe845a5a32ea5cf617c6bb6ace4c2f6e0d967bebe8050590a24e8392b75b3b297497463e418a79ba8af6af1898ea83aeb9ae3342105aed0a1d528513182c1138c5346f3f7c5732cb0be92e5d764c04d6059452bb0f5035d546a8a0354c0898397a00894461c3ba3b3a713d1b17cc771638e23a7e15b4ff8b529dce4e6eb8d10e9485a399bbe10de375ddae7f9d7d3b51ebb2a3da2dd8b3d78948ace0aefb7cb6dbae464a96faf2b280d16833d355ad70a426c59f10ebb1ebdac95827fdb50e9c83d1295b0181a3a25aba61a41f407dc1c1d53a89bdb570b854def04ba892110794dd3557dd51ba752f47acae29974429b495c0e7c71caf1b75f36234c5ac932bb32663b433f9e4822f8272f0b126b31f9995bcb10db2614d54a952e0c2a53d8be87a20009643f208c012cbf5f70b5b3c0b416d8179442b7f0c06b49a47bfb4d383a0fada0296f5b9592ca44ddca15fa1fd1982e61277dccb7d6de92aceb39878041988da1dbfe7a5911ac4be44679757d71923d3e92c838bc548018afd6828035022487fafbfe0fb6023c2d4067c77222621e8e8450fa36b546071a28d4def58309ce5ef0caa0f586230f05ee9a76a35348fbf18b1b8092b912765fcfbcd5b735fc9b7130b9f84776cbe5d5ac753b337e2a132f7e7b81aff8514becf81128417a6b2fa618c16c58b58163b25c72a9402da1b2ac4ec97ff4924bb392e33cd130ed6f87c53cc9796493a497df3c1bd7e818333c83212f92b6106ce3fcd563a4f00097d5c0131548348810b3dffd4bc545a3106735c9849ea51d4e89684c85912748d653d463e7331c00c429c1528d3381f397a776cb4185e1bd0da327e429e38ac727572b5ffc99d4d14a4c50cd452982d40102a2e7ec569ddb32b06e2e461ba198cf9160f8569b6d7bf886d6c4534a90c8c359b16fb8a5b0b95313c6b3ec754a6d71c3fded2a2a34c3422504cabcaa09646cd38d88856ecb5a4f6bcf0cbbc8af96cc49b9ecf37fdf733852ea52f2270dd774c093da7f1d5638f17360271e82347cce777595923972350c4fa609a666dcad1ab8ff5bd5a6d53728a7d96ad6dfcf6b62e2ed387a6ae846d33f4f41f746bfde5eeb9ab98ddf9901e4eaa19d5e2c7c3bba841a2b6d1ebda30d9e56aa1ce3440578f9123dcae6de9d38ea8b663f720a22ea795fe61d83b525ff0b4e09d1365807c3b342a400a587322e7a2df44f39eea45ec199b219f7e42c1a07b81c818ffda263c6546db434eb16e46ee479ee718a76c70f1a17fd91c50809ba34afb264e2cd3f3b0b67ea3b2e6f8552507ad558587d3f98320fb0d15603a85cab8e84c507a39f6ea6d52cd48017fbba7c6d3979daa97779c64bb5b14eeb1a43ad55c7814db431714c371b9a02217e3046f707da3b5292285aabb9c1681326424dbde4901a1269bdad18270f48521f8d627161790ed92565e55b02ae603dc4d07e844f6df358ea1d4018712c737cf467bf81ebf2ba1c8a0f891d83f2fe236cd8c6825d6cbad69ad64b8a30e6a64daa5596cb7d6164edebc744889e31de316322b2e5bada3e12eb16702e8e058f9f56c0034fd6646094aadbad86dc0f1c676b22ee7ff5cb182932d649c49e674140925fa59b0fa0fe2512ba3173426b62b0e062e54dc82d4de7b18f59ea364a44eea86bead66ea0d4edb8d36bdd72da5a0cce07aff9a1e1c6baa45848391261f294c9de95b90678c40095a0a197af1a49650c4b84d5ff26216fd90bf045aafbd09e21e149ae844745328e38635a1c825caf8b616fa76279363b09b0d4b6b3656dc76df3906c1b2699de32db3e41f234db3f834ed7869ae4cb675a712187605c9077f3c8ad8e96a98cb3c527d610a3ce964f739c205af6f8d52e50f4c66cebc912716b8e37739270f244c74e68a49eab004c3d27ee36fa3a10c084902bbefc7782fd0a94917ab34ed1131240bff2ddabda8d68217547257e39a4806e4cd82f4e158df5c701a79d847b6e931c4ff9837dc6710b929915bdd0c33d2468414ac5d0e84d653bee59b3ccfd9f7618419ff68763153020666a7aae1b6caf11103bbb56abe1995ca62145591e288e74e6b2575eefa46735473a47ae0963581acb042e176021ea84cbc9ae20aa0e5043da79bdd74260b20e4e3723b3778875b7ce126c7bf9e2c515d6aea2a5d0575db23515af83a76d2acc32674b8a0e554727d292c5348996cbcf33c3f1890c3f3f7e06371de462d29d8da90b6891310d2ed5323da0d235fe3518ef135c750e282492a1681da55dce8ab7e8c6595c5ee7dcdcae66e200b93e1c3f0e39861d0f9ab1a464b5e4a352701fea36e854728547420b281b95a52375450a6715d2a8811e698ce910403277c1b19a24cfbe71aa8ea8fd5d41219541bb88eb82bfbe3cb1f16714c82d7e5a6ed8eb16112055bf0d722bdb595672558b4c3b0f8ca8878f1a8365fb554203a7bf62f2cf2873eb642ddd04d15d7ade6aa728a7f5a4344339896ce6e2fac5d8db613f6c469b0a794bd402aa86ebf0a3c3b1cc6d7456a741d2b5082da36a9bcadcbe1f494df4d23820adb0325b80e7134b35946dfd4516f0fa8ea8a511c4bad8af11c656abcb1b7d8677c56f56000f46565c2a392da82c07f09bd702a4c0a165be362b2320ba9060faf2140e6414539e923b6097a79337861534f426b52429698e3757634c09a89e3c44027a27fe08854b634abe7dda607c8a725f1ce5ce61bbb526a1574f2332c2e91e5686d094f06e0ea255282d48566f548ac841a6ed628eae9f30a7f348b5798ec716e1e63e146bbe04ec69a5a92b70691821e4306dc3197fedfdafbf45d60a7d540b7dc06983562a254f91f3d971e0d461838c4f4663e5c48803f7ba934a7feefc92df8f723d771af2881cc0044b5182b1f094692343589c5c3ce6266b719646ec2033452631fb81ddfa735cadb7b5fb06e4c1ac46b238362c2f74b29161092031c1ea93812d64392b95ec841cda9f70e85d9afde7957c8c67c1b7ac622276d091f163e318de860612ace18ac7250a22dcb1ca3a6747a9d6d577eb625cd0d1864e6ac8bd917a17b9211c7e6b8cbe0b1601adbc75e0d37437e1b9f6fea88374cf954b29d057c45c1f599e78788e96debd386871dcf6e3ac77d3d952499c186ef771925e6c145b117b2947dc579b68852680da0cd5d210cc2dd92a535bd98998dccf716d512f41098ad9dfd6bee39c028ad516d4b864a352130fc2a390bc2ce6e28082e1c5d631f544ec6526b86b10a86831662bfaa3f4b6fa8e6a7d078c0c6c615761ad0610615a0ab913901fccebab4575b6dd5cdaaae089ac29779e3e7ec365cb43292bd57b18d4ff63953331587261a9a43628c81633da2c6c1917400293bc1836fad3d25cd36d1e4a6bb00d74134c924aa50e47a0d95557059560ac886bdf7baa6011dbbf4fc52d830dec9b9fa43b49f593d412e885b8e762b7871f856907ee0f5f13fb96566ffef0d718066111d112a813fcf6495e28f86b1b27fab02ad3402f7e94db45fff46e04785068081d15258251248b59ac3b61a8685a457a28015e3a25f3596b2f4591cee02ce02e55994066a2952dc62b0d262d02673170cd3e668e706fd68ea1bd4f550e6883891cc822be931693c924691d1c1e1d4f7d7f41723c1734502a4adee28618fd37187cc9eeeb3769885db90f15077649de0ad8004ebc9c7759ae0b1631e8b4342c45013b258df5ad9a70004c307e4b416c11db374c206c4cf6b138e97b6c8f1ed696881f03a4d929c8be5910997b27fd6dd0abd1c324c8b711eda062958e807290b1232b35591edea0458ecc2930c808f38f337d8b7873d07de16e1926859cf88397d263b74f85dc8fe116f164fbd55c7c9f0648e1efc661a58a182a41000247942f93a333a81d70b46f1dfd4dfaec0fe6e96df77318443d636818233b9a1aafd8a0918124f3968280b5e8db6d68d5fb76d0b757601591861859a30b41f7b864311dd77d64ec09e52b8a6200d5b96483ff1a08c64e1abdb53aa4c189bec174401364027322b1a594c4171c011fd9acbe685d13fafd1155b5d3731348744189c34c5a868ea5034d5ab76124a44453e7ae94e8b716648abd3313f2245fe75a518790ee6bd860d4110b4620ef99096f29bca515ec7a8a7e218efb24bcfe250e557a1b160daa4e839ae821299fba3c346e181ba6ee54ef50f62218191c2e646110c7fb9552613a754b6ef50829eb2c7acd6d7da258b980d6b79c68202992a525964545cac668f22201ccec1875d17c5400f6954336b07f5f6d9448bb4a56032916054331e39ff222329fe615d63d029c43c95b5b776a848f77b552177345d3a70c51132182a70b93ea3a35b5db59d93a874cf153ca06250b83d4e85ac4fd21f48f1d964c003d899cd06e67d868b910092b56856fc4beb8aa1d048058def25e544fcf0ad42edb2390f8d8b386be9ca38572f439313d554e0a644d818e801293250a5752568cf06bdf9d403a9b2581581e2b2620cef6817e2513d9d236062c4c7e71d47a2cdb96e2ae515b6138f6b7eb878da5f8f77bc3a47d40d74fa1870786a6d2d5aec1881e9ccc1b5b5382c61873206b30aa2de3b1cd2946eb9155a11eb75be095605a36fe24beca3f46dbf8200076565936a9bd07318ef951a56840d2760b5d3f06f5390652797e43d1804382304ca9cfdc1a520d2c6d16470406e7b00f5c1bf2ee865e265b57933c07e7ac49333b57ed6d2e987bf0648c3bebd10568f594a54fef63bbdd46ae06bea6c02e1361b26425dd313653747476642519fbafa0ca5c619ecd0d8d30536544bc764662ff785e47da3df2824bf13d3124000d93ac62b01e378b39e44339b14cb3f6f19e8de21e0db5d25fdc9f6b5425f0de23f7b133b1a0c2796081547af54364e5c780fc9b61b3030a368e0f0742a59ddd5ccd2db189427325b4e6108d824132fd0a0b23fa5eed64c0154de9447d8081e891ca74063a0f1c6cba14c6f1d01b72461be709b4225cec100126bb5b8cfeff18490f953011c59332fe5002a225906bd62bec6cc01ba57bb67c947405928ad1d409516e6cc2111a7f4b245ed93e33157d7aac60c29f5ac566a04a28d8ae912095c09e1d8a717195eed3400fa6b2a33857c25430d8e25cbb485a7734f23decfe4cb0136246d696d7bd5a8f7cb27d9e0e9f88e3d38e217f0932f622aabacbef167c12c5c2f45b577e565371c1aea455600e61d7746785dee841877ed4ab20ce73191eb755c71b1b5e87860bf360fe885172148413ed7c284c178886462c6c9ad96c36f9d58a8ddf4e7db5ad1c414036d614ab6706a055bb10b1024ad7b0ba9c09bc16855ff0b6a066a04116da4bee142b273415f387ad5ab2999af931fed38d15a5015c51e52eeac9adc4b1460e10bb53430db97b4c95801a6ee0064f9f4e04cc9348f17849ca2d9bf7fa0e54eaef7573a32c0759844aa6d28ee7c5ef3820b3c29d312e928793d14a8d767fab1c6cf70124da423957d6998b08d8e70fd1e9acd0448d62c4ec4ece6943059b5c311466988aac91a2a6000e0cf33c32c2ed938b24b688a4f47ec8f9ddde2529d0908db7ea33852b9508ee3df6bf4bafd63ca58c212c3b7c9c5dab7ee926103b0ff86755c750d42554a784b67cfab4149af0e84147862ecb33f3c2d4e6cb6d3f193016d57f9647e9f72632fdf109a9a03e6f33102644f2936bfd32c36132e3c732519f94f183439145d9aeff32c6b33f1f6d9ddf2782c7ff7cfe8315a58d583bd1da523b74bc197e425fd347455781657d21a604ea2d1c6a61498e7795011fb7cb9c9a0582e61dc235de60aca23336dd7c3919c8a60e40b2278759087bb27764f8ba442cb286006859b88895afa669777c957970595b0634849a644d3abb20743687f6224aee60217e063a984ff0041d3cd96427aded2c134c177835c94d979c500c7ebbd45c7e298c3024e87f2fae3cf9b387df1aff2debc4c36266a35abfafda06677ee4aed45ea1d162ea4b07ffe0d896b3251f3fd6f8b4ae8326341c22c80f67e96f8b69a2605b85f9c41aebe7c1726168061f9466f741d8dc2c2b9c7419afe0ad1ede1c63589d7ebf3c7367cf0e989410d99b1cb864bb89e530cda1fcf48140603b4e951025008a02d7f3f9fcbddde94c04116ba185ccaea1b612aa3b4e455c6a4313e25d355f1f19a4ebca2e838295b115369c9c29250f19602f14c6b0244e4c3cb24b2ce00c941a8041e75fda9162cb1ede9c952250f2e490f1d9ee8749f6a125c14528a91335c3586361713873f476bc0e95d9c3e63185597be638b303e0dd98410ac0ae2123d103c86f65a063575d65d966a1bb4f3989255a66f416e4c24fa0fb966400406cbdbe6f5c5e0cfcdc27aa29cac46a271ab15ea0edd8082bc2fe04e96a76b8de668367494d6faacd0f599f49a1b663b9b6d788d65b2a5d50806c2b61f14ad00e7109af9ae52f9e1a72baecc97105978cbccfd285039611c331721a1c5b03ceefc1d462466cc4c82b7118388381beaa33698df33dea7705a72313a0a11b1794cfdd34aa5c5193ae19d430e266f5d44b75e90d8687c5df4330b5d85a7fc2333b1f4de42e81f4010680e685460ef1ce6a69059c23cead98e7389fa73de605378ea7be2081e644893be419ada6587a5c49e5429ef3c71f9b5db7274a10e5d6395b5ce7a840fdc46a1dba8809ac298c9ae2fce712afd061268584647a2898d835c9b46a0a12313a1104733787ad0c5d6802643b91ff62acf2c82d77ed5132ca3285625090c1e8dae7eec8c7de3cd1a9fa2bb18e2fef8e027c81c605442e72202d737afaea1c9238d1c50e7a9521401a9adab010825ba62cfceaedfcb5caeb9f21d40698a7d1962e7ce6d4408558f08810790d35b41d08538af3a405f1c74c11c6fabc5a1b7873471fbaff66082cea7f23a77f0ac8b2750613001fa7b996e2506e68ce1342aff3707f7bc4121f1f4836702d2f9c2f72b0a3c31f12815bf6d85abbf801a1e8f0872c3a15949140dcf51aab5161b952f270a767bb4028b4355eb3c5df3ea566b519fae499b336dbdd0034d27e0412cd9bffa2e104e5ac111fc0af6829abe99e0dc69ace021fbde38884de330553da831f514f9620980d53bcc89e6fcb3f7aa069f7274e4d1fc423c3192d0762f3026d8059c93268166a3ed3226d87e8cae95f521d717d476df19c6c32b517928a497981816204b4da97c49a43d0df781361e537597294c62ec21b80fa33f0cf943d490cde9fd8caa75f047cc2846a06e3b0590bc61317cbf74557bcca8c5c1927917fbfe544ab58132483070fed596a803f145812c8451e061a0fd1cec5be1e0f3ea6a4eea431c73fb42b3f6e92cd8e6026e1c9e1d4f63b5eb577cbd1c4caae1abff084adc201354d66aa480b5b5ac09de92bd7453364b4d02e202bdf9414f209319fb9783bdc67dbac2a279d0841840224fc9f36e85ad20ab3ee48c4f727acca6d90c5e3e08e7f1c0d434ac31992067e52589bd70baf8f2bd1bcfb4cd05872ba2b8115cb4261c5d4f8561e99ea37e54f3b5628e0eab2c010a4be4d4e092eab06202e01b5d9fa330b80bebef90a93601529de5716a3117d6c21553cc7831f5d625c930af459030a6c6a6f19cb629730a10141ebb17f079a22695cb13b7eaeca37db1fc789c74e5dabf39d6f3e241bd10366ff7aa30c0adfc24ace38952d022c989cc49f3eae24ddbb76bbd5258308b788d5b514f1f55408c1a082f3228999069891d4ac10c4443dce6bccd78e2c0f922c021837a8fc394fb3d3dd276ca5761ba6992975a0bafe0921e02059bc8af0af858daea96088a5d8b705513da8abe3e195ce4e735d93918cf241bd939dcc29b0405342e14138ed38395ab5b7f11f47c2058611cd78fa78316230a44a318ca97a3c62ce9f51ad3567f5405537983805ed53a43263f8258a5c9a4bf4193aea2100516212dd099a17c8df11034c1c5799c2c3bf58965c0f698f2eaa5f7112e8aa3406fe720e24d32aa87623608bf199bddb26cd1ff61206386447a7ab103aa8533f7e85d82d8774d45b98490c49533b533e4fb07337c233c8b92713d60a399eb8fe2835fbae799ef466705fb509b1685db18a03bf4aeeffb3b8789f41fa07e582b62f09849afcfb38308591b8d039e06199bb7d379da4e00e2ca53a562d68f968b65f34848dd90323ee0b662ff43d96a80ae1836bb5782faa0ca1a85d764cb0b160fb1e52fcf4c9180e9918d0f592390d22d15c02e13b4f479c5d5cc7bbefc54516a0cd42c5b5c321fcd2e4f2342f6c2f23e372e2870049a4a5c34ed31f9681804b87f4a0d9a58382204a7cea0340052b2e04e79ab655b2c33e439aa1eb21440bda954b6299ac24ea2c2acec0e7a25fd946597a417b6ceeb362445101f3c1aca876831b90ab82f7c54f719020c339d4002dcabce40e53a0885c8ddeebf7a6076b20067d441abd189c73ca658d03b0ac75b8eeee3c0058cff9eecba2bb104f2dc58aa28de0b948f70d766c2bdca580fddab47c956f2ee0e7320c0f7240158e0a47740cac8135253114c320f0bcb5dcb0d255622bb829f1d336807c36d80300817fb4bde85e5b8ca934fc86761569d600868172fdc812dc691d05c8771a4af19205d0b2208a39817cbd4f27fd5e39654672c7c3dad964a4ba81997acdaa0da28b09d24e2edfabb076ea51a57db8f62d5856622aac54779df9e772e1950e7760f4c6a92d6097547851bca91341e00083c9f4bdd38ae9c0e35ee66c3a782c57a33ccba9ee290cb6d419028bbe604c94e5b3376c74c8674315f677cc3fdd9c911135be6c851c69a849b412aa9431b2df2c379161043b07958a2504981216c88c4a19958b24f12505ebac44a867e372b25564c8c6dd2bdf4107aeabb013d905aa9d8402e2f240c71843b3338d51bf0fea21c56384eccc21d851265d5b153c629fb42d61a7c44acf4a775cd51cb542092f1a7d277c0a8ed8faaf6ca757907baf79c4d27bc59dccab6b8aa013bb33e935aac0297b7ab84c3ef8424a0483a0514c666d4353269f1f337080255f4f6988711e7ef29540ae26fa8b6ea3e426b7fd1fcbafe8b0b9f8f32df2688fd4e12dadac434da654e79ffcdc7840f941ba79780e1b26eebe4900f90e568eaa00b4190b08137781db84e2f7e054b622d8947fbb61d9110ab1fa869511c3ac8fdef0ab9849e713c3afa2698579f5fe3fb00cdf675d01097db1e5e253c9ecf4b8865f26020b493a808fcba393e7639c1ba8823dd8a2544535ff8f631fe109b6e93e2ab866abb17d2facec2281ef5a8f44d4eaee616cc86e898821961d5c087ff70cb129e21d1ab9cd0bf2aa5f266a7db9773fc56941e7bbd0e2fdab9294b0017607d546ef1f207ad150db4d55bd2b692a6267b60060080f3a744d370d865a551f622f4cd33f30c41e4fb7ec890af5eb34833e2625bb6e6c6cc3731dc9454b6649992891d02b37d9e232518f9be80964a5b5f507d48f004c2572b691494912209bce16c6edc8a72c09384770937090c304a3de453f1068c5de2a46f5911e2e65b263beab8ca3d21eb5f687a182399c6dabcbbb5c7a606f61cb1ad273c12ba3193f6a3555b627e9267b7c8d54d4564357096134831a58b456c2f18759e5c30dd4f27ae12419711f06fed87f5e6373a97371addef54496d8a0b0c96f6ef3dbfd8fcdd996a38b5c28144ea25ab65d120b50164f271481de311bda1f0adacb7099c20b8f1f867ae79e7d3ef0989b95c00200ee8ace2b262f8e8cb24aeaf79236283d16a6046ee47d60910dc6dbc74986157c9dba197942cf88d1a4d67e834ca082254c518b5ace8e699d6a27830a9e4598b4bb8b847e443c9167cdd3d5e215d1fb87694655d02026bffa14c702070a35513ce47185dd84bcb2ccc312c86b138fc017a04047ca3ffa1cc1e04b0471a7df0cecd238f8b61045b5b7b85b2778e44c0400d26bc63e793a5e56dd818035414a8e1d1e9c20448b0285146a5ebcc8b9ff63fbd1eb9a18902861af74c263b495674d326d4f1b5ae24dc04235d6a5871e282cc6c3ca117b0ac0ab3fa9471a8ada79b98f6a7479546846354009887cf5a2b780c46c9e88fdc6f4d260b4f6bbb07055fc12f563ceb821d24a6001bdda50b8514b830dfeee4c0febdd52e3498ccca428447e7596251fda847449031dc08be8b1f11f31136b1f7c892d119ffc901369d78e4775486dbb1f808fa9a90d74f60f35af8b1ea6e30085cf5464162ff287a3cd9037db1309ab7e450ac951da4e144b979e7afdb6eb3c59c3e42c3c4eb4b7c46810138a84dad981f10fd45b2b0cecff61ca374e214391e3651d174f963a3c22edbbc2b4762be553992d823064aaadfdace5e3383e3342f7c28e790621370ad7e19fa8b6514dfb04afa1770fd3f625f37d92b42a0c2ac069fd52cc9ed1a4cc630ebfb903fa144e45fe2f2f269c9e42994e7880b660b6059b2f952316c952d1320cb2e904a6095fc03426c9e33d750fd49af5865802da8fbe05bb61e10e59e64ba7f22e33234c233067a9c902da28e705e8fce2632b2234d762d8427875ae20655a404e5189fd0c32cd198bd1e67cbe65776ec541f75725fdd595c0a38d819f57f0c865bdfef0a123fc932ae652846fb71329e4301403fed976f052fb366908101d1420cb5ab3a2e8a008e5b2e8ab10f7b54a4f157930783e4ee80b3b4e8b4351b7d96b1ca512a52e2777dde069aaaeabae1415234b755bbdf038b4c9c636f1781e0c9d5702619bffed4b1ee09ab492b2c2ae486141478c759ac8fbb8fdd708d88eaa37b93309361e14f149e8751b6e9cf0d21aaec2a4fd22424b030d1b711373378d3f2b108205bc89a0fc22d94a6caf89130e24a4b664e6482aaeab2071d7eb8447991e4998fb0a544ffc4e2236bd7132fdcdda54d5d287473e4d92b0a0f01ca0207ce22b5959845c1a37cf08a7876ca87a073df705bb6f097abfe25f69a3c0d28aa85f587235563171dba4017b05be22407833d8b888ce31ee2c7c49b70dde9330715f074d7fc99f13d2d4517dbfcadbd92d1a08e9de9c09894dcba5afa9a8496fa59c10369d02e1fa85f9cc92ab9a0bb569bb10644932719f5bdcf58f59b038c5f00844a71b212c983244e8e4d2f89992d7efa1e525514f8ac07add484109b0b505bddfa80ef11366ac550f3cfcae6505d398897e6e9774e34889d7e29062651a18dc9049de8fd8f728638bce4c7f4034f87af9fdc8f5276d7c92b95c5965370be9980fe5013f7deb40c3c99156c0140ffc692660e676f346d2fd250e891edec77a20d6ac865af5e16ef8f2d5c29a60122e24ed8ac078ce6a4774a16453e6c3515919a19e9a082cd38a234950bacdb7bb65940f5e49264adc169e6dbd166b9ebde956c105ef3eeeaf18f3db1e9fe6d01c8ef5d021fc6a5327a995ccd897101f80cbeb40403d29ac26c1238757ce5a1a20d53862eb104bd175d6a784d29452619a3df71509de1e6f1cabf1ac30c824358d0ef11de2bd2e1a4f622388de9359690ba68eb3a64ac585a6462100e33a8547e289aaf8dd0caa1f46a5d531b4bcbef302e3b89990e61bda4ecca0e8b21a04a14200b3bedf0bdd84ba6c8b0b555f6409df77d275a220b8b9ec24d6221ff2a41ab7f2a22e794074b32aaf49fbb64fba0d638d9a898bb53cea21a4aa0e9ff84b16a683a09b813d5806d77e0257e3c25e24403e5b9dfdbd085a0848d39bf06488230c2207e14559d14d5aaed34b2c329e2e976e3a89871c6e99454b47dc74bd644319ee318f16086d529ad4a0c43cacba8588dadb42787e7350346c1a756f850427d29d0ffdec9595d5c7781ce1bfb0b162d2316869d3b543797278f1b12fb4008544dde7b50f4037123fcce415959a57069de6ee7798652b2bd880ffe3ef5420a107ebda829520ae1485f39718f1e4c37a76c0f89d5ddb8c0e0151365c55a882af011f68f1ae2e2c234ab47de764e1a4f0e56d9875fc1285374a7c932a148e19d07f2b166100373d7cca9a35e84b853ab5a466883524aafa1ed5658def66d2c47d900958a0999aaf136d0dc2823c844678758319fe0ff8cf83606ce97803e2a8f2e17b91d8a32d578826b569971ceeb4ec02ee42bb33cc0e28dc11c31b0720bef887e1d5fb6ae55f4eb868cb08bf90af4b177cb2b87372d05c8a8e4e36b41272f5db78f588a00c41a03bc91cc2c36f99a34289fa8cf87d79849b02b65f60e86a86f99564ed68387b13dd1bdd03a46182898608e64a184cb5bd6595cde5a7640fdbd1bed3f31429a13b670c2c5cc560094ab5f33d0985d002c2073b4d6708a762866ac31e59cc85688880200f7b96c3ec3253b3ec0d4cb473cf64d086966c43ea795eeb3969a3206e04aa27c26b78608b792d58b28b6a00708f411f2866305c1366ec64073a9279b897130ae54d0c6613659337c18e24f898e5764ad4d0a5969405af3de882a36cb9db293fa708f06bd7e6ef564437495b323a059acbb6475c61ab6c790405c2b73d44b7e36b3817d50c205e683597a635e046dd05c7ab7f5f78af0bb56e20267a61588215a7c0747783b33c163c6826b63d16153a7c69bd85b0a0a5e774840686ee3e16a40c1c8d988141d38fc59961dd4ddbd070d2b6a821d5c2b5399bd5282a254991490794b29885002944bfdc2a5d20771c16e2159a1218245b9dce9fd7cd68e43a68f6adca3335f95d8f4f039110e35570596fa1bb337e5483c07cea00464c0f6340f2b745176a1cc27b1a1e475554e68745c707a7b1ac7d52d53c3a75cf473e373008d059e66a6af6e14efef834deb1e49c8363aea50c3128860a73108b8653051b7b1e92db628c0911205293157aa66742ee260d84aa97da890659795ff8fa3ea354233100f79661c877002a330269667e22abc6f6f402d03820e72b032dffa4176ca95388544e597ff450acb3768a3a6ff07a2ee61c022b280008dc3341cff227e82a92a48b73d4f1d6f94703bb6f6180ad372da8b700cfd304e00c673b00ea4c97d71207c3f715829bd40c52de64a26575c97194d987472c6bb0c0c3df644584bc3b2b150562c93c3e28e7c2994da751cf6c2e24a9a47299ee0e81064a86458fe45153fdc55ec7d0abd71e6041b94c968fb921e379638866031bcb6494e255086180486a00514cf3cbc211ccb7f9edec5c9b3cb00670064e2620fa6f7325ac078a723352b5c9c0aa3ca05bec01c8c0e0e4cc2bdbc084d97d202022022c6da2f0cfd9847b83e42e8efb1caf1bb12f58aff937c8b7071affae6f9770b294916f334f848594f47f1d80cdc5a8aa8066cae49ab879780c32be8dd184955bec8ad84c6314f0224bf62b8c273b4780acb813cfec13e1c2e54f46aae5b88395d0ea6ba0ab48a28fe254591e152981f6bbb7c499156f972a225890122309b26760760df423f1b2ee9a8c257355f6de3106032dfd3402bf5826624b21fc5f2795b8169d430b733828dbf3c9bc5058243247b3fd2c9ff7e3578b1ba42407a8ec77a0a616280ae656e2cb30a5602b9fc8cd0f31f05e81127a1ffd6122378bad9b7be1e5fb6d3add0a036c05d05cc8a7792ba6e393586225161338b0c5e73b1a8a8ae82676c5d90cc69ea8b41a7f8f622a419d523aeeba319ee25c182e84cb0a876f46e38dc927a6607249472599449c43cad37017edd06c44854f32c6a530a2ba1684afb5bb7f990683c25e0af842773ca1dc544664d9ea1a33a9c34d749e350437e28948d25fe8bce22205e9e64779965a90371e83f18070a0be16ca1c52a9e0942389612e78fe49197066b667bff481b5235a034ac3e20ff38397c234c9639b011580640fe2fa70d9d05b07103d48f5db969bb6ee9210cb22b9288894f5a1858c83d1fda6853dd465cd8746e9ae38b76b3ea6b26a12c807852e801755a3912eed950f8e9e6a8b2942811fa52a5694cfe43ba71842108c628c75d8e76d1565917349dab0f5de87d07ada48e63a86d5873d7041e2544c040addc9e4f24547190a1c37ebaa53f1d40f74e070affde7556a8455ab16f110e175c8c012dbceb8bf6c4fe01e6bb653d105c4a0dbbc0077f194fda64173a13b16a16285c322486a4686740b10f6edcc097de6b01b65a96a79e65806f1851588146f64c1147e91697e9d533f67659563ed5f532ef74255f5a3f0fb5d0fbd90c8df91f400f3ce1c0ad5d88b30507b91deaceabd55e2d7829e5cf48eadbcaa6049d675f187d54708400b6e25143cd806ae541d4ea1d75078e2629f8af197102a8704802f8cda3a3bbe9b42e42e42406afec569b68da2011f0b26f270771d1eacd0e1c51864849c35304f3b3675281381949c71af2defcba6573da0332552d5ab10700b10df5c632b44807397e502cd30e4453aaeac10a82bbcdb6d38bf6664d7923d161c5fd6893c1f27fe55ad050a6a85cd2d02b3afb01bc95d3fe53c8364cbce9f999b953b37e37211bf006a221b9d5cba4ef87cf1e7291801cdccce8151331ced351d958fe36157e3198df6f7006c0680c7c543c7444b59f1466620081cd43ea411948803fd2676471a475f185535f742f8e59ca83014c7e29a0b6457819cf97e58e2ee61818caaa0bfb9f91b9408421b3d52bef5e83b5cc09d14a6a882b59338c54387f814ab5b3a05b0350113f5f896e6b45d9a237bcf787512753835e730551328fb8847a3854c05070d8cbc7bb8d010678944c2cae247fa84a0506c6bb94f2b9ab0587092b8a0659a98d7746884568947620299e044056fa3874491c000a8f5565ef4aad64239eebd058661a007b3da4858b3829d328436f4c2ed70d4d34eb049f43134eb139e3721314321e05c38c7e03885225716bde74a31f1c1098520c43c16ce6e26e64b2bdf0473d2424a8189c56e5c775c79c748a0b262e6dca406946198cec722c2657160bfc70f5cf9f0842de350ca281c4a834a00e7d48243e10891d41236c203d409cde66bdbe819b14fe2ee1472a2081da8e12ac5d3649929042f7af67079de41709f5963eaaaf79e9f1594f165fffb4a57d045888440c94d9755307aa21d54f019e27d0c8216e3ab4bf117534fa427c7f1446312cb9c372755e2b66083c850e9d2001cc60aa974793f752a42b4557e4ec03640c22959418c919d3821fa258fc174ce09ae7250109ba504f1de5f7e79a37a52f914bfa5a7e0cefbd7154f5d0889ba72ac6aa4964d5bc9e58f48d3562d72b5297f64ff6750e123ac4e6acd28860023519840909fb43fada223b66311d388d094404322a6d81752ee818253a9475a2fb0b6b2ae3549f32b2811898298450f86ff0cb3fdc48f53bb8230702f67e12ed94b7ad29b8c917adc1306050403c989e093c80bce848b458a84a13f358877bf01f884de93e85512e2c7153e1ad916bf64c1df46668851f33a4bdcde32062c47cffe8a411aa31293889b08094b2ce29617d72e6e04ffcb778e5810608d2775c6788c49f3ccf212632cc670202d8cd64c836584edddbf866d5a0a1bc51401eff4cc7f351687cc147b15661266053ae7f6c8758d154d1f059bcf321eb6727e4ae69830d0b043e9d8f75ea822d4b700d0ba5e5fdab12608d61963078f0078fd33cb595f1300aa5ea9ce52296a2e039553ba9d8991e8f27c20e8816e6c1fb57e3157e301ba114ef298cb44f7fd4bb61d338feb444b042b57e7eedfb53ee0a3ab66f535a028bb72844cef7f5a0b8c22614c858bea2d218984b811260a63091f0aef29d9eeb7a11815f0c2905cf5eadb94e33714d9886953569ac27a6fb49e10f57571d9bafbb59e0a5d5621967e02475a8c2e75bf1ce78830441babba6eac0b78749ee37e7f0d68a7730c56dc53fe8eaa8ac4f48b90f7420ffc94eed65e7298b2d9fcbe137a03422cf1b724d06af5551c167a9f7a53f8a590381853a2d9a2ea00d2d50c025a428b41463159ef5cfe4c7984ba8db0e18d69d9cf0e72f6dfcf9e917b8febe5142629084316c0af9b2eaced12e01d56e8fd3d44f6e52f55936e5d97d6851ca352de91c81493f91fd0e64d93f3d6c7daf0a656f602c4b8081f0528030b13d18456ee6464e448f8c13cd3b331461eff815ad05d282e07149ad290b601d055f8e0111f93049a2954da61346a0fec500c8eadbcdfe0e0526d191cc2ea3be1fe87891c06b944c7b0b125a07fca4756f2baca4f08e4e56030db3349397af129be3fc727ca4bb8595889c6ec668213e8bc1ed7601ec83d3dccb74c98408e2fa004471da85a0006f66f129137092f1cdac0b76ebb385bcb05dd286d28b860576031f4cfa9e88f1048f3fb9cf46ccc22c59943d6d92ce16c059de43c51cef8609baccee8f78cea9af5a1273d3444b197fb00066485f965a7cf34029c64ee9f45c2060eb133ae04852df3418c4ea30864b06a977140c5a1c044fcfea0b6fe884108ebc68f7bccc8bff275ee807813e4de89913b1dee7782cbcf40ea551612d4b79302bacb1caffe4fffeb96de05a8854900b5ba20a5fb6bf1584be07c3bf0d02e5c812ad2d116ae18c23a1089e5affd38d0ac94707b71ef49fac74b0724f1211c6767ed483039a1410930a174526e59327a7f5e2f3ee385cfdf8e2da109c8d2876de7e698397bdf3850b84a6bd0016e7b09068f770f89b05b6a3dbba8e655024d92742890112a7b79d42e3bb80cd87fdf4175f1b579516260fc2e4192c67711a730a0f56db68958fe5d10bca0f12d0f76c9b1073818ccd3d9aee9487a7c5d856fd330c4fde9b739a8fad795cb67c55e2f12437b75fc936224bfea1f595484495d23c3d38511b4d9aa91314dd4db93640c24631901099ec6187349d5eb5a046337edc560176394477350dd4cfe8ddb7522552ec1e7eb27030b5d0eaf75916c871985d8a599455baea984c8509597bd51b0b394997e3ec15d0b8470f6b9c48323805a40d99ea0712ee671de2931f48d1c4ce2f678656c4272f546e417d4bb1ed47aeb9dd636f57e448effbe41ef4872ac6d4188ac656f06620d33684baf83ae163074f9c0b3bf89668a1938eeba77a9617225fa2a48f7d070530ea2b3870c738ca7d9f8d6bbdf50316c2b9feb501a7363c141db6f6f17085974c80a4bb6f113addfdb706abfee03fc750c0e7d5b839e99032044c39c00c6abff8630149cf357ef7e2e911688e86ad65d72623901887a88be3b5e57f352b2dd49f6017998e92d6f2293f96a9424dddac370d836728eeaa65b3dd9e291028da4c372102a4bcd78449a80e8a8065c9e1082af5c9822f7376f4144d2618735d662042b620d952883594c635fd48598c935a64ffae196a05363467158fab00ff2c46f0ed5bcb6c0d7694cbf3603eeaf4df65f57de22899fb2252a56ffd87334ea66c268fe4dee7691ff316bdb3e8f5d2068d03019e46d575624748de53eae6cf657e062f68b285dff153220dfbe8175298e486c8902c34e86a817486ab2b633665da1405b7e8049858838486c0f2bc9980a26dc256ab2b9b23f674edfa2fce7235d4359ea7658298f414f35cbd01640261e685d312c712108b5222968d3c3987024f1b2a13ed8d435b48a84964f13defb8c2d3e3298cdb00214e9256f6695d5e90eb07291830191623f0af066c90ee6d67e442f72d2b595d051eccd5dd13fea3f49bd8e59c8c14e54e07c69a4daf75c65d6a6d2fae2228c1b54becd429455926636a0ace266e5cf4f8858c594513daf01a9cabc4c0564558d66727d3072cceacf30b07f3e41001731226a910b6f8276d68b44a9d65ff07fe6bf78e6161bc560e7030658f74ca8b837e5e83bf40eef8f01580e61c01bc4ff4fb9331bb1afaa942c46aeca2954f37c91e34b09d336d8981d37b9f6f61b022d73c6b97a7974149990735b37f23909c0f09186d4158a94a58b36baf38f31732d504c915688541ac72b56c2c87b1a5fa209d10953532cada4a532da955deb38c9814f23dd2c1453f80c22f3c9c18b3421054ad533db055a0aae0e7aae0d5e951214edada2a811d1851ba1c8b7cabb5563d6056f5769aabe79506acd399fe2c875212435e645d02787b8e7d7fade0b24b4bde5b9e52b71e227e41d4b07f3430fcf261b8b99be508bea32967486ec4396a98e13b64bad948190c46aac272f97caf07ed42c51ec9776bbfcb3c4a699d73c2b80c885eca8e7463523a0b889de55d7185a86e9885e770afb57511084999f110c09b3c63a7f6cd78f01f42b069ca42bc9fa2d11fe1210ae06b41501874b81d31b006bac794b47a1d201387f46ca7e2e1167a5265b7f3e353366f14531bff649b245ebbeded86883ca460ec39f0860a5aa7281f847e09979cfafcf47f8006ad47d16524db1cbf1d310963ae63b1240d5f325aaa5026c4787616ac1a09f81f42c24d07ea2c05980f7c681cac3ac5e847e0414346aed0d876f7cc9c33c2a63c764e58fc93e4f7ae519d9b1974dced44df90761c450b14122b05f36092138d1aeec66293ac44530db8618f03d71ccbcd36c92d20b5e07c41e6253add0700279ef9b2d7cef8d4c3a923611012b10a89b80419e26544ca2fea672cc2c28e163542330a68908587ac90ac57adcc862c432134ef64b084392fb386aad160b4b703844c19d21804f2b98763f552238065ea0b7fd7186d1fe20f7d79f736ff1a05f9c2e06bb41ee331069e9404784803eb505bc46a8f24aa40338824c1fa000b77c9d44240c71d4d7b68b1ea24d264c7da65561c885d65671c103c7e56d801dec5127a3adb15e303839db0c82ee7ecd17ed56f2d0f20e06057ce49c57769103694b1010a433c147bd771e300378834c29198f197d8d0e9ffac14e907e436d1d8ae8624ef204eff905f469d5729333409bcfedacce25d0903d30ce8b54c7e76279adeebdb84cf8f5d66380a53006eea85a178a9cf05e129cc31f756f8893105df9953a6166a3c33351207e60432db7243c1ec41b3b73d601984a5a7f0ee4696610c95f373d4b8aa9caf945ea1791710abe924e452be6fc9dcbdc0b251f924bb820eb7e98833190365658e4293f1a5f6af0ff2f2e15fe9341e8849a4d6b70f2fc15a4824457cac95e7a2d30d39ba5560deccfcd58bd7a50b5c8855b769b5fe6e2c7b72ccef80220646beb053f334f22cf764e10dec45ccb17cd0c0540b2a97f8ea3741ef1db376b805527201b7645ef7faa321831c0b03d98259d82eb724e0cd2b0a138860b8acb35d5d9b9eb09de88b95fbfd7be3c1466e75bedb81a699c2d5889bb2554854abd8c9d1c189e6243dd99cb9d6c8b73ffabb7989c34b63b7887a3ac6928db3dca0fa63c8c56381a3fe0686887c0e47e645506c321425b54040c153e555231a09b9376a81e79de082b82a254f0a6693db3949fcebd7b1dbfc6fd33d321bf5f0d0353bece660bfa19d4fe1175da9f69e559682a219de1df66a5bab7e28a921014a9f8bfe681b583b0d702c90188ac48c1e9ccd5f3307889c4e2105e92fb2a0e018d613836e00e3571c32d4ff8f274cbc8a04c1c0904f06542e9336e08e1dc27a1519f1493dc9e73620b81ba39c593b322c67022931ac76765c0e6dd4a9940b9f59f24295e81dcb8d12e8a5863b7b54cb915579de039814d4c7adaf18099c5d668c724afcfe10b53132a61cc41ac3bc06aaeb1ee2c2c77c87035c1616fd62db4071a3d152df9a0b0d9177a6240975f44f56ab707943e36c17f189b5af8e73504a39d0dda3981f048c9ac48b4e5fc38a8d4176680e6f89069d7f71c789ac227b2de79c4e2efaaf1d1414787fc87ca298095c170fb3aea2f083818f3274d873b111dc7411d6208ead0d47d1d9be8d2b8076ce138704d7f60214f1d1daafebc96461478ed828977aeeb4204bac214d937098be2c02bcdc97bdbe28d6f46d4c23e9135a4a277cd71083b9159341509b3d4de4f0350229ff097076f753f06b1e66f89ca0e039ea6865b32227eb63b76c49ab9057873ff92c391da1ee4eefd8c029c51af368649cfcd8623e08e9fdb05055a838870b0abe6a4bda39a8aed0e5bb24601876032a741fa37852f0ef039bb4d455304f46c9644476b1d00b41c02381a3b9cc992b6ef9aad63473f53756d0537340e8d5642b1fa9e4196606c700fa70146945eacc5571e38c495859754dbc3232553d8f5c0699cfcfd4a5a35dd3511225cf8450642ba9f3321bde972e9351531e9bd9413844da740b8bf309f19e45a1610b4e176226b1169a670e826dc16d676ad84255e50844b413fc7ba54358fea8bb49d00625e6ca0c0ebeb282bb681705f83e8048130d6b18e91ed12b39dba076bc84b58ba4662e3a2e2532e6630ddf0a7acaf3910e9588875f7dda762d42824c8cb5ef7c91c72fc55b3da33dbae9e889d9b93172692ade1f5ce045f148dab01cc73776b06a7d3c3cd96da8234740bf7db378e6102309e6b8f0d86ddbbc4819bad68017438d0db7aec077aef7a0ddfad8014df250ac238a405e462996acc1a43d725d462c88bd1a175d717c1a6cf89966cdf1180b314116431543e5e4d40970fba20b1e48495278d860d9ffb443511023eddf5e048d6aca4a5272f4a6d592e937641c4b4f459df1330c850d078f8c0ce221a9f19b63c5a43c6b6664a141cf9ed8d00f23c0d37329b564aff1dac36a89f2d163327e7f4836759869728bba09862a666a3e05815ffadd58a714b00f158b87dc75ebe3f97282e2917ba40228bed2c9a203c042d40a950698de91388ea1c8a2b9e0d9033d841c033128e3ed30087cbd016357ee214d3e2f9514d6fe078b979ebda8c7bd24d56a2dcd4d6b6965352d3980705d8aae2c062e36b67a0c808b2ca59212cf4e8336e54804f0920662c18faf3065665067cfc5b082176fc9269c74f6030cf63ad2e2eb780a6bcb131f572dd14f16a6aa58862c7561b7c0d5d3025f54e31984535a99d7850359306ed70fc8e0c2e24d475a2552f3543c6b181f77a72b761d57955617905f75c041b9e9ae9db88b65e302844c1a07e888043ab5e2e9a78a0e1cdf373cc917b6b8945e7c931782a30da6f0111a1c1d90c94bcda1a77df52d099bec8402db00b8abb87b2b07808fbd728f9bbc3aff50260b602c5ab2af1324a9ddb96a52ef2eacc93801b4bd9a2700007c1bd444add0a132a0a0a0ba86fc5a05ca2c757a2a23b97eea31a38f80b07913250cb407f33b1baa77a34d92024cb275ee28e75903a3341fabdb9a12ad56308d0efae3ab4801f82816985621dbc7556f0c65aa6cd1586a9e52c5110242d65343baae0145546b39b702c4a1d569adb74e207bb743933f63e9413c512f94c64487e0b142521fea3c761813c05f4ebbe99ef18ca375a5fd5e04452779900d1c7522b8de91ce200fbd0c59faa87a81e548af11c18d2af48ea9c109212f7c679645a01332578b2d2242db7100a5eb8e0417f29f68fc8d164ff316b71aa416d9950cf7a29563f613e3f16672d967d62c24bc3b4c65b21cdef234a916ead7d8c1e9a294061427ceccca4d076e68e48e56ae01e8647b3c1f5ec022de731009d17f2813eefc80f16694a2e40e45b405b2d1fcd6b57296ddde3e18c6170fc189b8bbf3b048928ef7b2c601df936529917932e1e0c52a53ec169527e3a7aabbf1ad5bd99a37f50c9bbd59826c0981a4860e61f9a3b5368c3015b7b2637e451c1144b46997315ada4641ae75c9f17536f00ee9d1990d12db08d629a81c497f4846b3848eef90b9d7b67dd7c27727260e6a435e639d97fd15a07702654a0d1e831e8c451887b89ed8cf13f9dae7ff5566f404be0121650b965f0fb5c65812550484d95520764075359f4ac27497061432a090e94a0fc0ea218750d0bb567d8dd719a0375e0edfe92feaf5b827ba19fa1537951c905798cac56e09c3de108508439417fe50c3c94a08e63bce4dbe5a4d05b69d7accb6ad45ea35319c8b76c4fbe0179d380187c8ba1f838fed08deb2f8b202003743566e3b65c8d33c6288a8374eb0360091f98a642b48737ae2f6420da0ab5a1b1a3a6f19fd241716c56e951bf5ae5276caadfea6c1217dd341ca5646ce42734f97faad047be255d12ad393ea004e35f765c104e334ebb4f58dc8f2bb3bdaa20f2c0fd8e2274a1102785ee0bece23fd287fb7f08de82d8f227447ffc966aa6c79691a4b1cfff6c815fdb2aac31d6822f8d3f741774463953d2183f823b048f2cacc90b8aa3d096ca412cb493a83232d379b687b90c7614c7768022fc51845be31c018c2e0142122e4db06e546280327cb0f54b267516ae8a8bfd0083bb3011e938aaa404e3ae36eceed60cb012231528cde08c23755ab41cadf38dc00f968ff95bc66dc43e34ae366b560ba055b695e5b7f55fd76b38bc1d03583bd4198879a84f9758ee8c00d7414e807c36de7a2f1b0f326a01d41a01cb872e0ccd630c2b74a1f9da7d57b5d262152048d5352f15f535e9a9da88b6fdfc496440b870899a10d4320ead191deed54ea74da287c68e070d5189a4cbed827ebd794a0dcca362ad821a684b729e48bf08e6bf29523122cf60571ba80c3442d91c398fad4cd7263dcbc1cb2800f30a59a0da744a2cfc18c3c3436b94144e4f40b39ed86c524daa63669758c8a37c4e6ce59e6b6365153878b9c52c5d4308f04f761a5a17d3fa8491202d1fb7f9d3ad59695cc1b9cf7e6457fc8d695a8d56a9b7e7e00b48f9bfe7fb6f33c9f7bc9f1680f597543902a72e80fe45cee91102dbbb63d7985be4805a3ca15194736d14819c4e9a5d221acfe25677a54aa0a62235ed0459c7c8054ee379c0e77f7890dc8f5f73ad6b6238bcf4d1d4b6671a872e5c03e0caa50ac2dc316ef302825325d42e8505d842064cc2032889494ed272f680eb0b23fdee6fc00789772ea23c2548567496592a912667c9735e1c095f1f145bf52509e45ac1d8d48fda7ce244df0b6ae12c9563ef6b49c108573af7a268ba901c116fb399801325a5f2d1714746f1f24787e2bc9bfc9f5c5724f457dd8adf441f3afbe24b774d2056f4943caa088f328449b30c808c2d92511f3aec150614012a8ffecc2144eab0afd0d3add672a69dd8cc132451d8e663080753f9ef83222969b14c13c571d3b81b363fef25bb62d7311e8a9f4cb4f761e9c3edd77e076e725752be56b5f314d3d9347b09a9e96c092cd0f4a1ec3ec097d32ce72bd6fb68078730385c5831d5c3b0f8755b61be951e11546802a798a40372b4aef37f8b28d81dd4e3f168ca4f592c5f591ea7e4eeff1eb9e010af1bdfeb61bb6273d82d9557534c3e8a81a6370af7593625c017d34d00edf161f6d2e552c08773d73d1ab09aeee2f356efebd36937d22efdcc07e03f4e1c76d26075c03d72f9999d6940c6a0888b93c88bc4655dc77e164a37ed7f67a815ab1b9c70d976cfc2e031e26982cbd66748c4eab2d3b2cfdf62765b37cde94d7d2bac2e8c2d59bf9c529750cf3e78e7789f1de221757979fd9af9a1213b2933feb0bd25b5562d111f3c380d24f73c0ff63d60cee1508a963bb04b4e4e656780ef2b5b698b827b115f910cfbacd7816de0bcd22e2e6ef56ec7843d76d1e9a6c0f675f5679c6c0ed91eb91d92220d7b56e60c1598e124c34f0fb21301b9a43a5bd514c633e8600b73b57fe5052fb0028f685ed39632f0ee6f5fef163f051889171a1f7b87239c4c70c13c83f7f71adc86016dd486d40deb844d180cc6532bd5c221cd8382cfff4b2b44c002faf299625b408ec24d07a63688fad22bf043ab5c5c187ceaae8193f607f0691ba76d217fdd27fc45a196f82370fe87723ba0e012ddc817ccd51e8f2887ddaf844c49a1b45c0ba17ca7d2d202e2d465af90cf88a2ec4dfa93ddd6e49652a69452f805d8053906b1c2df7e761fabcedfba8f06a9a522ac1a7f9b9d7cad13227decb86e91be7f92ba1dbdea59b559a7b7a6f45864e8d76f63443d41542b465456b7a3554c6a6263530cf4b92e91952eb5022f9d2134dc3eed2c20911c7a71198c3a4352d06f675c53848eba44af9e3aa3ee101a195c38014d0b473c0c490146077e0d2d7183c2217ab9406f567587d254516bea0ea179d58fbe1fc9ea76eafa0158897025f8aadf842043747eb46a278b47ab9af5db25c6440ac25c2102315e2ee8bd2f9aaad3dda3071d4450c30b8a9e6892a676ac478c2d70c801cc13495c5dc65e41030e5ac400cc92277870359adacff2164f09b2bca0c40b8aa32f4ae0da337503301461051193166e08729181802c8e82c8b081872021d718750063ca583942872860f4e06a33b56555a7e1170d660c002d09164874810489255c9814456f28f5170080c4911f236237281c002c216141340350858fa38c1f6668a17ef46316395cf86051a424899433ae9e69508279e081e6af79aee567a5f6d757d1737941ded56fa305fd1dcac1ce258aa1df1a31185442a0c5c56f02878145a356c57ce8c730d210b26ac2cc42b7c2d8a57d0f9207c0d8955a2f45827fe9a2491a97f624c89f9e0a5484f8972e9cbc5cda4b2fb52f7f5d24683b3b3b3819f372695e6abd20f3b55fd7ba3eca0c73fee96cb8a027d4b0c0c884cd046f31cc796b7424b2ff756b2a04f7d61be20569150b09b24be79445d7b66491e2a86e96161ccda89b458a9e7afa22b26d1a8170d2227b5442ab360c2fef6e74ae8456b551152202bf18d60be8d7c00bfd180b6311837efc7a796bd670a5095f93f33e8a7a7ebd58f59b95f95579540dbed01f22f090a9b5208d9df4abcdf78ec725a59c7472a847996c389b5289a462a99a0b4f2655a9526302815193068d86314628e1151a3538ef52f2fd795cdb7492823f9fc7c5ccf3a7553d817808f19fde8e7b3abeeaf9337f3ac7490bb5f6a55b7406edaa9f6bcc1d76a7d47eba260ad440771387e2a4a9f49b348d407209b937837cd55dc3c68c9248ac7131ce19a18c124a19238c304219531cc9247f23994620b9e6901618e4ab8655a257a57acb8593c3130a7f5d906150c32af01b6ecf2a0eabe098a1f2359c3254be264b2610a20d6f1b366cd880bc36aa74643ac6eeeed831c618db3dc6f81d9d061a67ee8e31c68edddddddd104a8fb1bd638cdddd1d638c1dbbbbbb3b7677c7eeeeee8edddd1d638c1dbbbbbb3b76777777c7eeeea884fa73dede1d638c1d3b76cfd8dd7ea236b1db04828c31cad8de9e5624d9f3d998999bb999390061b53d22ecf138731532fe3c33c40d55cef86083c280a642a8f1a86b61882a9950a3d843f937c952c62e624c83cc0b8a000ca1c8c837389df3801a6fbc552e732398829894818f66b1d87db053da10421c14cac708ebf2b19563ccdcc5470a3e7cf8586ed24e384c5118ff8c78757776e7304eeaec66f3731cbc51e3028f2167e8b32dda2b5612a67ac7c12f8c857dea766286710f29ff639fba1ad4e04aef63c94ab497bf0c83cd4ad8a77320967ac33847e8c75aae57fb9095700ff6a9dda15ab53b34024fc29dd4ed04e3b3b807c949ddff8ca09cf83689cf83aadd6824ef650258c75c16f7584e00f770b249d4d9b5475bb55cab3c4042b76791b3ceeeb7a342b82301dc8341804eaa77340e19d5afabc416382861e4a5b2ea2a612465888c583540dda1318ef0a9dba98766d43ebef61fe753fb6f2a7f46b40a1b56293dad5461bf34f990af2d07e31ebdb59ff3c15219a82baa55dc43837888ab7495282c65e7c3bab5aee594700fae3e754dd0bb6e19dc5d3284504a97efd2a5bbfb426f27b60e9a80c4f8907d709a8a02a791df5ecac7d6f66c98f98cc4fa01aefdddff240c6e676766666666e631ccee0e7d32ce3fea067583e3eceeeeeeeeccccccccccecec1edddddd238450fec89470e8eeeeee349a803b2187e26e7748e10d24030251d4c72414369bcd24f3eb3884cf0e5be0fe106846b13973373373944e0859f27a4df430636294504ec8691ace3fea06758333e7e4267cdd50a91ee771d684628e296772f78f30caecbc516a63e333664076e6f7b6332216c528a2929824090e4551c427222c2a89b0088b4a6a9f02e21109da3c0e6a293bdc83a1b08efe662875cf745afff8aaff4bfdd80796d27194563114eec122581d3b700e2678cb5d5d23349f4d24b06b7a3b2bb834af4d2aa022f0540fa0aa11548ded4261d3d4e8c5159c077afcb231150d17e414ca20c182a231313082869e0a9fbebca8f06f503a5e4705e0d2240a3050b850c5071774a1c2d799555285ffc35b3c301c8922c4183060a14516176ca1c21fc242856f81ce8915c65475895e4abc84a81ffd325befcefebb56ce2f68bfeae351bbe1deec4a3eecb85dc98fddae4ad6cfc84e0810c76b9e108437a017c402ed3c6c3bc9d0afb355bb3d28ebe05f6f32e51ecf3af8b9b7fb8cd4dde19b5ef14e3a244647b9553cdc99d1cf4825b24f324580f424efdb87afe3cb35c21a2117f7bedff6b2fef24980af792a680f5f7a2a5011a2bd0af299f0ff9c52beeca8552c6b15ff9cb32be23197c97cd639cb9b93692d60aa54555d2d6060553b42b5e75408fbf3eb7a9f7b31bd2897c665bee2f79904368b1a5fd3d2398c926dc2c1816a20e0e840b5ff6610d26f91635310d2af0984203e84481eca57fc42d0fbf9cdda09c16fc1f7a359a9cb3e2d56b72a50dbd2f18a6da94ded4b6a7fa428e00f5f08842fbd1d085ffb1df752f1d7e59d77b07fb68f35939986d323229fb74951a8d73c227376df13d17eabe67dcc44e273add1143df6a6ce65eba762e0e0496d94a0fc8d9a1409faf563c1a0d48fbeeac76a1b1a40b75f22254eeaf6fb73772757a7cf8681abad1e2a722bcddf6efa76f17d3f7e45b68f1de94b5d693dceb8f9e611d9df4a5de9b7680221caf5844c2f4dd2132ab58f17553301d966073f76f3b90e48fce911d9f7875ed79f915a84abdbcbeebb01425a2f0564a68010716fa7b745b8ba79a9999a0febf4d68b2467aae67d1fbbc951129c571a46a9cd9df1050da3d496fa4a93b1ab8c5dbb602763086ae771efd8169fff87b7e6f3b8a6f647785cf0f763c7e34a5140fbf942b49fde0e152904a6dc9bd45756c0d058c1a17e5f61036d24271e7840bdd5ff3dabf28ecabf759167ac1276ed5a130841a6af7630417fb9b9c190a0c2cecd51347fea3a841036f4eeee7ee81042d8d0bb658f3c227b644f64c51d2c96dcc16a150ed9237b5ef67477b7ec913dcfff3f5fded264bedadff9aafb7c9a42777b8aa89f16abebd928437ffe6c5026f747e7e6d8ff20ded2f15517028c031750af423a876b1573d7da6d15d23929b0f3176f6e0efed9ec697aa2b012ddbb1d3b76dcf7dd85be4b37a7dd4b16f91be10c58773c917b895d0877631a8f3511aa6fee336a5e60bbb87b03e98d8aa1aa55436c8ef663574405c9e087346ccc5fa5f458d334cdfb1badf2879dca48acfbaa56e160175bb1a2f2afc760fbf855df84aaf2be4eb74e2f111219d48f0e21866fd3cb105ff174459bd92a117c48e758c00776d22d1fd240e7ec125ca2d4a39d557e71c1c2a6a025b608d58f7d2ad39c4f25a4739885ca437c4e4afd835609b5c762181615ff0c8a49b614ff8d661893edce00a3a6c90c6b284ae94d1c143317d4df0703d92caa7bdc09c98fecd18b9164189249641b372e8c2a954aa5da36ee628c1eb9771d274428922f3d944ab584721f6afaa38228e3a070a0bc055dfdaf920155c5b648d65386ed0f5ad59bf79550b71fa552c9d3f9a03312abce0f1f12a173dc7b9d1fff46e2f61cf3b6711b7f5f8d44fec9fa2963c03de9bf7eacd80de91c0d85627e9217a455ad692f04be6624d6186448b4808f524571a8520c343ef4a6f6f1db48acdacf19e37b989a0ae18baf793c959ba82da89e584c2ed94acf1b3397f8b7d297a18fe359b105b78352ed87ddce099be4ea37bf033c95fb8faba637bd29c22f6da9e3189f3b147c525aaa1408ba5520fedb973a22fedb6fde7969ebb852a9e4a54e4f84bff427fed2b3e9495fe36dab4c9cf7f97f806be9e3f3d4f9a56ebe4bad4bb90ce813c1c4085146fd58b568f6c0b3b7641a837e1522798be4cd923763f34ba881d5af06b6754382f8b036548c55ea9affbe964effa9aaac79daaafe42e3476d0b1bdbc2c0e26c07a59f04a82d46f6809257c2e67082aeaf50140a1a557bc9ec7dda7b11168e5ef5541979f98963280a055946d860614a4266aea40788014c510c4354940d1224104208a17b00ce70e952fb6f9a883e99e006910f50ed20d0a3040a2d4c00c5a70726b02708d31162d81f03644481c689155cf9a9f2037ba2ccadfc9c190ac312036001818a5203098c4d490a6c985f14955ad004288c930fc030225232d3d2f3f3e344c991941c927c10c68b879f0fbe9011c16085c9074746f5a70ad1922bb40ad64334413e241289442a23ebd59699cdd98bce60a8d9cfcf807ab52c343ed0e03be13413336364466666d6abad1f0a084a8406cd96cacfb1406dea0ea11153673082479a0e103e73fceef627d2120ae5f76f0e635b4839cbec7e6766a960cb82eeeeee6a4177777706babbbbfb023318daefdccc1dc6bd194ddc9bdc446c8cbbee857b052dc8bd68405b8a390e569830a1849929bab0c28b25362f5049400f689a8009fde033830c37498cd062742bac50e0282181e24b305814698aa012861831c89e22a8501c47b9ba8a10439040cc14a1218270c2675d5081bb3b6fd971021b5ef8c122cd0f6438c3e05848ef9b147a65a84851c3141ece60f941c9d60297fe30b59b0ba4be1fb4bb1ba165062a8a78c2ccd0172e7e6146fd761cd1d005bb59e04932d352032c8a0a6430050cee70a1769c0dbd49863ca986d09ae8a250ed356f8205ab436ad91cf2fd87c6d7de59b03d66bcaa7cad9bf1aadec476b05576bffad5afd2ec97fc8e798bf4f2dd49b74853aa5036336233bcf595d4a4bc513df99f63712dd0061a1f76156f7191afe4cf4929eaff53c9a22a532490fef4274f855398f6f2b916d446ea546881f4f477a89722e1f4f4a9a702fdd3af6b87f4d40b42f2a6af98a948c9411cc44127c8643ab3869a50533eb743bfee3ff2e5a4534b95ef5a8adc8b6cd352d272f3aafb1dab32d6393fde5a977c07f2168f4b3ea9e37179907cbf22a7f7a1b41ff8a23eaaba9dcc18b1557e39c60a808864a07941fec94f7108818689e69fcc4c7698eedb8d84320ab2319e3c71f24344191727a9fc373a6706a7c586f338db42082184ed9c9360db1b9b8c428bd81cf03f77225607fc8d39c042bfeea02ef296e9e17b4fb74c9e0a456dde86fa506f7d053d8752e345a9f08aff7490b7784e4a51a87f19940d0d0d0d0d0d0df10ffff0cf0ffffcf0cfe4e816631b9b1cdd58a5f797b738ef9b30420eb050f87e65484b8c74655ea9f0fd05f3168f0bbeffbc4bd90e98abf43ed4ab461e526f28d852a0af6db9bb53ddfb289c246afc1f42ba6563e806961ae329c6d8b74335afa12666eab74ea86afcde9c88a4c6ad5ce7b444c2232cca5bd24b51805d9b2241aa203d572c71c72d5b0a466685f9540eea6a4922ab5b731f9815052d4d19afeadfeef9120a7f738e4915d640e1a34c1458d7f455fcbec65265ae81f2f7936d7f6788a1fbfc6acd905122fefbf9f796ca9559a8eb7dfcaaf0b7fb4007e4c4f3c14f8550aad043e154f7b74b65d56fd3d4cfb7a3f1a2bd807d36a1f0b47a16a2253d75899e48a9457589643041dd4e7b83c78e9d151410f484914bfb15b68b172780b9a810d97e7eff8eeda06bd7fc67246e359d0e8faff9ed759abb8d33bd4eeb6ca78e796c907b1b6a4365cd7bc73d77a7e7d139a7aff993e7a3e66b5c1ce77d089a98ba797f230494558455a727a479ee00e992afc35f034bcde97f83cc3ba7183e0f138c74eb011f0c51fbb7bf8dd5dea13874864bfd760c7f84391f4ef391fae1a8cd1e0f0974c5892b340f94a424b695396c61ce5dcf7ce57fc2ca9c5ff4c7e74bbb827efc83b7560b132e7f2f0523b4d23ffde723a8ee4754ff1a63a0bf66b4b29df16bb25fa9ee4254f72913e63b54772fdc7fbec59bf81c89adb9d2abae7c42bf38ab4143d9134a09f138908252e1f7968cf9ca65cd10a59de6c2e6f03f751a0babc37fc2bca5f5f4ca6bbc8f831070de77533fed0573cda7460bba757a297095316fadc759f5e72f2a19dbe27625e31ebc3af8fd198ce5322b6b17aad78d9a36f788faf10fed1ae24a4e6c9c97ed0153219c2afc53855e0a0857f85ca1f7f1188155e89522815df2d9253d18e78adef4d5d26e81650cf9e3677e67ae7338044a68ff77a3f273b31e1356e66a9755bf412b492f49d7e2a780c085af294b4e22cd15b894f1a76318d943b77c9156d0ef4656217b2415920affa9cd26784bfe7275b78c1dd6d1bf35a494dea3fced0985011b163a9c000a8704f5a1b12ed1096cc04297d070021810941301ddbad862940466eba15a111704b53182238296aca88086418f7c41b9a02aa220c8548884846290a28c0c21e47a7a8011f990438908221f64d8c8104d29d304d1142e484034a54b1744539a989285680a124453ac104da902030a3ad95286d4c29824aa08832a2141081a85aa4b44822395465d221ebec0b2fd0761f0a7ee0d9ea81bb5bbdda33b3b843c81dcddddb51997567507d1b62331d4655a5d6f69335404323263e483ab42a4d7665a6a532fa8ca4d20ae6e46382f308a13080a94d059965ca894444d01ded0ce4831545bf69a93516d6de63259ed97b136d366da8c0619977d34c8b8cc8f220d32dbc19ec29c62b1d39852c9db707aa09fcbe877723ff299f45c165db6196d46d1a3d176b0db985e75257daa6d4c2f004bfdb6a34dd6aa9d920bfa4d2019a3fcd81581409bd10c286a314e206f919e144bcccccbcccb1ce366f49ae647da439fb96c33da8cbc3581269036816ea886c2919bb63b77e7082417c9db8c7cd58fd383cadddd519de4a49809bd09844306edb88d69553f0e994db619010101e11cd1ef143bc93a2716e664741ad3399f36e3228e344b5bf37293864c362b87387b42e7e6f013bc355b77a0ea4e805af5b339bc67be9a00ac0e5f46fd7a754fc3a2ccccabba4fe623daffccafd3903d9fb54a424167da51e7ec7cc140434ed100d8bbe27f260f602c57fcef0449eb80f85b19365dd2d3c2f4cab558ccf7e4458bb991cb9c8c7bb10a10b30bf06f37325941bfcdc8c88d649ca90afa6d469a0cf62079570f12ead25e7e8c69dd098b4580bfec4e2f5805f8c7ee44c52ec0df4f5e3687ffe6469a4c9bb999ea1f37a3cde16fb2827edae65acc0608eadd5de837b5eede65ad9fc650f73cc2a160b8ebdeb7b3fb3aeeee0e7721162cb8c8b62be8e7339fbdaca031df623640d0cf67b2ba7093ad7c017c41d876c0ff82d16634d705b47e1c7b1f945de414b2471e914fba4ce1821ef9a447f6c827f2883c22b9c8232ea0920bfd6637336f0a422943748b0145afd78b0517d1922ad57f3f7652dd7fc781aa3bb797a582b91041599a80c40a5fe8835e39c3aac356c14f0121114995bed43f4e3e20a0d4573c0479dae511db8c59942cb498619bb78b0a305832012c7cdc47782226030b1b7705d68f58263399c08c8111d8aa26db1cdd7e66a3593e46084f336094c5587608bd9772e1890266285280c2fd0766bf71d60bac6e5f1e2c16120a211cb212638cd17405e5871be37a8c4fb950fe58c423d3e03debce5ef507c1f966102a68bb9bbef8f24c81c6779918db16b252118a1362044c04d58f724a68d7257a9243551d795da227383c5992c4b6db9abf4d4fddd264f7d4dae1171f7ad0bb57689ed87e24083aa32ed10d68aa17052b8b940af7460b54f55617cd20abfed07f2e51fdb9ced9aa3fbd41356941f5c7f928d5dd090caa6fa161081e1ee8f49caaff8f2675870154ff2116e81296a8fe1ae81c0daa13d56045f52f72820ed5df48e720a0fa83a0a8faef740edc4a640397ea5c7ea4545fa0ce5922a034d59fa138d10d5daa3f47e99c9aea52ea32b4f23bcc601e2433783283a22d8c0803c89b788d23990251eda1f88c941830b1040c28a63833834d4f13e8f22dba683b60269b437b4df2f0968d5f9cd47fff3cae1a29e805e9413d07cfe3dac04637e9b4f1fd361c05fb01aadad7459f5fe922239c0ee52bed531bc31ed51c745dd4756c7d055d5478832b745da91fe22bed7f878a900dbec6ef50d9a1228483efd71ee5ed501182fa94b7f3c357daa3be86b74345488d47793b3c6a6ce0ed68d95171e075918a870ba5bd8d31e8ba36f875a1bc14003c135aa5bd4946658a1414f1f37ab94ef095f63656141955ada749fd68b5b243dda0e397afb4ef8e4403fdbaa86a2921fd1b7cff061eff6c0eed6fc050edbb48fbf6a27dc7b48730edd7db4803efeb59d56ebccf5f34bccf6133bccf7f6cbccf81a8f779d0c9fb36a6d5789f5fa99ac9fb7ca86a9cf7b996aa6d9a7b21799f1b550d6af204b92c207cc8ae72ef05e0d3045b07707777e1b6480f7f7a949e48d09b2357c2aecbdfb6737fb891c6196c27f046aebca809631956bee882d684d96ee0b20dd19bba444c864a46505a97884995ca440ad1cf955dc7d1b2a6006b8a280616d636537b06b57fd7668aa0b56010ef879721f3090e5289685f8445224540f33e5699aea874ee353531ea14cd8800000000d314000020140a8844229140241e57b6f10314800b76924676541a4b845110e4388a52c81842082000000300103243334327089d468be4be765352a73dd5ed262642eae596a9725c95dca7054125919e68e3a3cc940bc95f5c8f91f97771b40249f677a9e9704ecf67ed24ff31a3d784e96706897c95934c7360d6b90e99f7f7d9ae0cb02eff6d3be1b40078aa9dbc0ce74ba6effca33574d15c33ab308fb3e186b4120c1287f08388d6d210665b805380457b04bc0b0905a8b4127cabe81854421bcf39245a825a188d4f9e4ec79544fb6a8a239f877bb05dec2c5709a30a92853f79cd9cc30953432b1356a17264ed65cba4015c2f4f8954133b6b96d3072df603e9f2d399495755285072e6e1a409f314c8e2b47a50e56b1397a7203ff554151538c5ab50b29444fd23f53d1e73ee33da0631f7c8164db75aa10e4acb4fd5af6acfdc2a19aa6ee639a6cbf897ac9de862103cf57abb70112e47aeee7cd94fc876f49088b019d71b1a7e4fd1aaa92c88fdf77367de7512329aa8f60d60bc049bf96da3dece087041e8357e2c3e25fe6fbc96378406544fc50a4eeda8d5fe5df1bc815af362af772ec70b1cbf24ee92091edc1641fdb788d99ed7e8d3fd894c2ebae832755322153daff39ffe3de63acab2e4938b146e932cd313151bf4f435d08b0f7a5a1c5a56568cd44b702cc62b5801921c7dec94faa3065019fb4878fff5313e8602e027ca77481fdb354d14409322bcd95c582c87c34a4e6ab8075346a6c56b94c5f1f2a29703ab2a3ac0d397d20328be874ea0fac8c07b0c3b8195fa14c78da6577adb8233ab4a6e4c27dd34bbf63629458b4a5c7c540c44c10511813db558e3e3a156ad12d54cd1e73d552fc0e28c31b6f4e53124ef7e51350682611627ab8ac03e2a88846306e6ef1873bf1956434541a516ecc108f914115adb91abc39f88a8a08f8112c5ceb2fdb483c8c68455a9175d2ad11ab8d7ca5aa0c65d96c8a8342919aaa072d09393a986ba297232e42434329867ef7c962d09cc9f12104343c7a33dab3931dcd8d33e1cd4f5d292635a7a534dcdfd6d6331c01fa821e45f9935f1a428b65a58792614e2fd65add6882ad0bcbb590734e5831c672d8e4960832b438a93b933800e458dd8482cae12ea52f94bb8b8c55f49c010c131d7ae1d09f39d1cffdc45e571976ce4f06f1d67701295f0fa093b047949c7017c7e45a68c2906c6303a65ee58765a658719a529e85d843c735b03c12e310ef3c719390d6e2fd8779f0e5b4a29c0701d1ccad155ed83740b476a8f73c970dea7c3a4f7dab3f76923cab0a34d4afe7ef4bf13f371a44b14d655c117e3877516ad9e1b25c6be3f2e782867974b31b13ee26991353b2f4263f01a9c856ee690f05c0405aea9d7b1b325e5cf875ef49615517dc50e828b0d27b28c68c54a73bee3fb129e022508e0e9ec06f1ecd8981d6607fcccd9e41a98dca96049207b527c467f0c71f42850dec2243511683aaaddc22da60d7d04a54da83e6280e1bcd25ad3fd499c966e0813bd2a0479ece3fb115f503c9900b7a1a329e255471b5ea55c29fed3e880c84a9efeb5c33205131c2d457581d6f9a2b12e523f6552d19b68253833bc4e9dd95240a83ac8c387de693e6bddffe03761595868b4e3b2c3b5b7d62fcc22d69591c8d1a08f9db1e396e61ec8a0b77234ea2aec4a8f43118b18b0ad36f6e68e90731f22e694911fcb9a9f675a36f2dfd9f06e4b629aeba8462f26175f1e252c71714ce67e30cb708d5ee94170ddc782c537d1d8fa01dd5e0495a154e45a8cb2ec513f3312c5932370823c4852220a53e4072bca48bf343be65217b7f6fc15d542f82d52f44ee7e47ad0aed11355bea84c924373565adff25ba0945359bc3fc6082641321dc25c42ded3eafc0ea668828760731d2f32b5e4ea95123752321d39a6972bcfdc92a8eb434e2b23090b90a8afa6953ad4b40ff19c11daa36b77e3667210fbc2be744b64d0e24d926ed184607c9b471e83bd0e45027a9650df2bd452bdc24b1064718257c7fd5ff7e3f0ba56a5bce115f0023c270b98891b72b444e5ba82df42e1820c2c0930392d7ea4a8a84362ce5a39c4896f4dbc30210997fc674fed0c25996c5cdca64683600f4fa9634ebe690709aac3c13a3b3afbd7f50a6e7e06ee61c10710cd0f97de0c55b73aa02b2fcc9bdbfabe47debef3e27a1a584f5b65bfec08814de69633117bc3f11ff4b149b24b3d3082d3c6c5262d2b579d4479209d86c01478b47a8575e99d7c8b2563bec376b729cdb46d164f4abdda37dc6ec1071ec5d523d0cbc68e6246945c46ada35c8a763187c899c189c82fa0f8ad01e203f566c73ed7353051e0df45762ab5c8a188b6f67fdb74e4e6d917e0a44959c804b84e3ec19dba0a6e989193e664735b9d1c061443fef0298dad56a0704d5f54a2aa92ac7ce0b8e9dfab15beef972da607f8f0a600d674f325bbed2a4298c376d075a578ec6d0907e66c0f31074a285caeee7f0986beee279a715290f4963d68b8786691fb216f431d29e950a4161402c15aa902d5bd9f82ca739e5d2d11d8011f8e3460cc1ef0e827b13794f40947af72266211d03e3f8c5c002724600cf0430c4270990b5d2940abec8510abe8eb803d9cf33d21a72c883152b48bdbb6ab6c15251bf22d9b79dd9c40887c38303328eb2491158c2df97d2bed738a37cefc71860f62df3bddfa2b5f154bbe8d5fe506d1075987eef2a520b6cee262c363ef5734515ec61da71af9c043273838c64437aa7a321f9fc516b1a1d23bb0f41ecf07445a153a5c11d612b66351087b9b8969df19ac7fdb18611c6cca5a9bbe5f4db9ec05aeee7add44223e077301f6ce9be123c05060a528f6d7c54a160bd6f4a655deb7d0addd87c436deddeb1f9491d836fa1418e5ca9000456318106ffaba28bcfa945b866d22fdea8b21a2e343a465dac29c3fdfffb2a3657339d2b486cd3c490a29f11e225c8d65e1f9c75fd7c291ba7dc45b911c0cf0b8a4bc0820ea2019d0b40d8d0582038acaae9874085eb80fed52ddd30c5b3fed91a7fa1ed5d54974e691edca8c4e37eedf4c0c0e15c6605dad622fcf712ffcdcc98435e4d6bc0b9cb25be4f0680bfb68fc54cd0e61acd3d497565ae87c8dfd9a4ec204af576c1b9843ea6ce86e607e948d5cf434cd307491117748721811238aaa101666b135fc2ecc5179692eedf5b603be39af3ad305e12b8eb51dec118b3cfa84d1b7f06b4d39d160bb0a960e37031b6246fc0c7b880c45e0a4b9a9311f508008e96176a504328e878fba0d20837c4bf2f1e3156fd8d0680cdab23267ff44e4e4e4f5a472c2e684f4948e6469731d5ef8344feeea350ee42297a492d58eaecfcc8c0b142b885cab8050609133ef99a6e33d09c0a2f988a8181807dda500fd86a0127127b4240e643cc623727c0592608ec9e6341a75b04e6c50da29f92d0da2bf70fb8b157ea924f807f9ffa1c1354769d8680d19366cba8f1d2f8ddd855b1d9a9f039189d086de3cc6cb16669e364434a19cb682c620f3209f610ec31b7fd57a284736806f0809bf1072c3c57285654a793c7300425cd96f960c43dbe4d90e0e335de4e26915d408d1af0df3d9e42b6aa76c8993c59345aa8bfa8b46d875870d20eeb6ed6e30da6c547979a46bc61b7e5136391e38811ec43cb51c715ba512f4f251f145a1dcce0807a1e8ff2c58a7ef9686cad3d52068d6950fe22152c1a1ee86bd682c5f140fcbe1825dd6dfe1b99f90aafcd2cd9c663798806bbd563466ea4fcd466753529d35489d9ada72e593f6750ddb48dfb7a4a61c50fb36afdafb9dfb694252e8834bbc3a10e87d258a6f5ea33344583039078d056dd7f0d8a08cb736a9256678b7d0accae65e4b1357520284a2c9caec892eb9a0d980cc938196fd779a4b034596c566b2b47c62fc383da106ec6a738fd0e7f29fc205a352fce1ebbfe698650f0e4a1558c9237af033d6ac195b45dad555db8f62abeddac6c16ab5adec672833a5cd29e529dc903b6c788cd46edada86c90d0b6ab411492185275b2c2ceb48f6462496d558f02d37a444f7faf4e7de9cef057adedb94a79b44a162c3aa59c9190b6fef4b49ee2e24e78fcabf03b62e5633f955d3a0e1b33b38e84a2294ae844fc0bc1d7ae0f9f083b0c1ee8e1aa606e5640ed2d3824ceb14091e277bb60aaf66bfc8d9be00348715c64aa8eb5776ceb8089ea650d875c5e31e83d4834bcaa8a77016d8ef5e354383c96e464d0209a981933aa2b0cb72679aad1180d493c7c9949f83af251ab334545c3a36825071adeda622ad8b2df044a6d4340c944a0b683a16137b9b3f18ea8be3649c267388b8e831433f095e9da76c0312e9324432b84ac7259b23dd90212caf534a8346810e5eeae484b56d76b508161713dde5f1732bf009e17dde607d6fde1b13eb22fc181dcfe7241150dab927d341c1d694ddbe8ab5d47f83183d2556c659c0df1f635f79581ea9c83263f72cbef8f9ef6e0ee9d36b9c68f8f05b95c071555ca7f8c6f01c14d506ead5c368ebf446216883cc3d42da9d131d10ce2a2d4cb7adbe1e039fd1c3c9034ecef011d695cdb43f4310da96aff8d6843ebe1113e57a6e1274131dc56174263a9579017dcb67b58c0092419ba81b0efef6be03d98da4d2431b5698799246325798b3cdf9e57376b335dc8c3be458c46147f46663800aa4e4a237c5fb322644ffd0cc33d297156a967042550a9bc1ff65c7f6c5c0d7fd81b744be7358c253fc79222ee95d6dc1fa6ed875a4cec9f008945d15e558c1366cdd37f5884e3309f0ff38a0bbc793663edb01f2a47b1c7af644a12c6463344a471eea14fc053bc08e6a10534ef5365a635ea0a04c47a62c37299f2c31bd1865cf5ea07a034bbbb83bd884756e7350af0f5fc87da625c47313149fd942e1d0779246264855554586ff74d2c56d0abcb66efe148bd01c9852997e48a181fd0efccd46802749108710fff4de68e8af2d1fc5722a9b4e23d89dd5570bee57b4778ed5038da229fd839190b9be1ef8bda563a8df516e8de8288f9040587b7b342be5f42f4f8e7643eadb5b080f7565a06abf9551ccb888c19e1b8090a836e178e4ef9662a0630f79b9915793fc66f2fc27ff96f27a955f6a79b5cbcfc1fca2f16b86439664b443a4401e1084f7fff1afaa5ee9da7fe080b66c5f4923de68a7ccde4647bab9691c4dfc7c34a7971531a24f994beeb5a34473a45df9491b74ed750a11866543ae205a039a8f54c4f366cfab291e4252e134969b0ad7c99c678ba23172be2afb7cf4962ee73352b5e1074c193212562befa44f635dcd637063e58651b45b91d13e158cdc54987e4e1717e37aba0ca64f8802d837536d60f87fb12510e8859877c9c53ca04b9e7f1e3152040831fb7a1c4e94881e34499c2cc0b8211d7b8a42f3c894213c1608606f983e7b25a11091bd3b215210ed49923be2e0159deba1806eefd0a8b640d6df80f008a83076fdac8a2feb30eb3e624f04b673de1fb8d500e569423a253be543cd3a3f3fe64934c4dc98f6e43be1f1075ec559e54f97bc0014cdffb2e3e7ee166beef294c7df099b6ff4c8a44c76738535279dbc9ba0e593597cfdb20c8618ceac5d118d4cc1568e9b3760e89c7b3495a1bd1fe1bc5684800f97d9ebc742b2ef6ce320057c4027395fdc1d4356e90ec8f00c998039c19df618a879f377f5175eacda8576f6a299d302ed0b26ab58a89491c0130a945c77e8b70ba28f72775ebf08d5045c99958d2840d1a5152a74943d676e5dfccb54781ba9ab180d84817f6733467aab2e2675d0a5e7d881468f6c3af6a2c963d694d55c5a07ca96fba427686315c0c54d661409ebb5b658a621baaa5c6154d87dc7a3fd17f0a8091f77410dff36ce6872fa830fcff5b506a07eb05c684a739d0a0826089b9a71cbef2c288adc1e231bf8a6452e33b1893d4cfc3ff3cc9bf31ad2deff8c219236fd87ac2c25400e8ceb05c5cf52f30aff99db8e70389dd2dd8ddd2874a0d7adcc779ddf65b06296b6a4dd14ce722e5e7a6c95e0bb6846513232522cf9aa242009ab841ccf203502cc1774ce9d864eedcb689f5fa870081c0f8fb588f5fd0c12d97c7a94dee9cbfcdd0e583e43a5e1a8f53430a6057e6de3c5ae56528428dd1d70399f8c02039a6a52863cdddff01224587e16f37152d9a5204be9c0d8b705f7666d8d96c29fa6340d9d284353ae925b04dd92e455d30a17489c8dfb9d9918ea48a0d26431541277f344d6dcf6abdad4c7faa07acb5d51c329aa412122cad1424cc6a7e558c5f1c423bf06b14cfcb947d5a72e4ec07781d4123c17c002152a98d587db1b68dc3f65bae2094c843470546ec93909cb644875d33fab9c7ce442e2e7a5d630bb41342d470ac3ff76fd561008c6880b2b9d7b2eea6b07fc40cb9995363511d9d4cc557ba1210bef0f820a4d1c60fdaadf7206f7fada7aa8dd0243c853059b859a211d7b056ec68e13167876205dda4c79104423045d39998b639c4dfa167a91111c0a5161fbc1180e57d44eec3444ee6151015ebf8b6bfcaf0f51d05e93901854a49754b512031d008f5f846990d4cee1bfe4d42c47b126c41299e4783c992cbd977b96ce54169af2436ff3dd1b31d44ca9264ca42662b33313e1f34406fa6ca76258d441557268f14f1080fbd1ac2a2cbe31d5d2e83eedd4b08c834fc9a3996fa962117f906a4934f913e71f082583e67ce22b396e3e94d66d5e01ba08768ace1ff428c9912682ae49f3b4aabaad61d16f76dccd8f11bba92684ed34e76406d921766571212de25357189e790754414bbd63cb11bc042600472688a27ac436f68dd5d9235c9c1e8a36d2cd20d05b602d4f6745455eec19cc8e7d04ad88f02583719e17d3e19aaadb5025f4887ce8f2112d2f67fd9950e4932433a0915cc8fbffa87c5f2135230174924b9159ccd3b0e1fe68fe43f8183c4ea1f7c300b2145bdad9db0ee04459ce13ae286d2f0d3c006303854e0a8e2b81d2cd647e1abdc5661fef8f4f09c8db663ad1899585ebaac986e4e8e9b245ee3b30df1fe65c97a8246a01b339953b1754e908b1550105f9c35309525aa81a7c979916dd7e53a1128d44bd0594c827069152d27d3f670abb7c9e1a2c7e3bd2ee25fa82e79022a23fd940e015180d09119ff8d6bc650152b6f8e3633e52ca8c8f714a5906d7db9bffee6f4b6f5d374a8868365bce4ec26e7532c385f5c99b17d113ae12a414178d8e7d2624d67f8cfab050ce8c983cf143b9c9784f414b3b5e3c467587f86db44a5a6227c5d92ec1fe2b1e921c46911dfc8606a5fe0c274963fbe8878aa0cf624e131907fd27ab385944ed75992e1eb0c0266f309f89b1b31f9aef24be994d40ce3d3839b25fe65de12fe5c17b6013c0bf9ba72c8429c90b80cf520af7b67c126cc0d2a163b9e327420a7c3873a1487ec4cec3830988e5306279c06b5a9f79b0b47484bcb3c8a8b81284408b079a1901ef285629b89960aff95ec6c1a8329fa75c7b2369704eebc5affdb0418f7ee3fbe319759cd648437e9f3351a6281d1185df1330ad052492923742a231beaeff8df13cbf08a72a055795fcb09b3950aec024503c258133c05276b620ae1cc1eea1e4c226112238a3c4dc352c9ff5a5586b38bea9c9286ab3f973bccddb4c1a9cda6609b730ba69a3fbddaa1ef086e8260a4133f35d130ed69857cc2a93431e08614659205b41205c2f54359bc0d0b0d1294954890f6ab886d022e0d609089ce27db349be210d453524a56e0a75d296b81c2d25fd544f9264eb82f3207a46e6a426a2c083c0ce8ca50da08e482b7fd84a90a21e9c13d8219f88bcb17a8180fd7fad129601b3cb1be4ec9b77fb7fe2734c7e852ee4892f3b1cb4366faa77ddd59e83d3b309d3a81c3835e4270d5e961c17684a455d19cfead64363a03e50c78f9f252184d9013dfa47c07d1687ab808c2867668e0d882390346dd4e4da19f178744b86a8957ca7ebf60c00b6689ec280146b706c86b60fb991b282c21d2422881c1ae605bfa7f0897b6de9993d860ee009eb06a25f3266b8363a710f4a4b9bc3166482e36b5a54b9efa7c13a7785d3d6d89beee61436bee22c1687b50c2da168b10824f86a9e6e93575b782d9597e9f0624f544779818597dc867422b85d5c7b7bf3a8800b14cff05570cdd1e654339fc404943c16dbe5ee1f1d3f45dfd5c1875a5fa94dd6971c30931c2a77be5ac3591cd6beb8446c7f0a452d4aadac2f486c21e482f356a21ca3f30f1621b41ad34250b21f2cb84febd5840a27d56532bf022fa668d7bfafb08b832a8f3a75dbb543c0458281bc3f197eba1b1f7504ba073ebf6eb34a8f7aeff144bdf595c9642a88b52f492d77e9fe9c3ba54592344813e6c0bd80dec7a1ed7a40090170778d0ab7a73c53f3140eff586914f26bc102a92a2ef495dedf582886103c0846e4516ad0090b307e4d4a84da4a102f137e2f357226ae100249e6b85481c3165ce9c1a0b16d2e39a41fc3aeaaf73f48549c49344103e1e6591fc6382f701d6f95fc01cce112aecdea9a36f191b60a824ebf4c76d2b601836a5a23b9b2361d7d1978138eced9c7d22a85389052296b0b08d8f8bd3ba33c415dda683ce0df805bebc85816c40e785b9384913f32053b4afd8827dd2020a60470a3f7da2f23b056662cb6ca6853fb1f3296525fccf321a2c3412a7114dfc7f3c47927f69314e165968e4dad23c1899a603f3c16faf65b608387aff87a96de8b5461cefb854d57323d85dfa49ea2ed62dbe90bcb2bce6449f890e698ef0e050c011d481d659bb9bb7be54365e47a3163e2abb72bf21e0cca328ccbb68037ffd1f023c072cfcffa68eabd1586814fc0eab93b3ed6e96a5eb3b9aa3f4841724e509002ce09a29c5099ad13eb986c24f334b1fa49dd4c8fa2e17c48025c3e7bc3b4a69ee6ddafb508006733769134d14028cf2fb85bcb384add6cfc707b67620b5d7bc252c2468fecb027c295254d732829a8ea9018aac16303719536a3e0ac95c695b965a7da25d8337d9721d2b3a4ab6aaf9a77475177845e786b789c3afe0c0fa02a994925d345f492ff8056bc4ccb4f588fa16b58f2d497e4c3aa5bc2d2246258bf9f534317f5745b879c85b37aa6cb4d90ff01e7b950e0108163cadebe66011da4e50dfbfe02715103124a067870a5acc8e4c721cb1882d2a00ee81888a93c737670f7c9cbd11ce0dc284dfdf23d8e4fc676398598608507889ee357735770748b1656b65da0bdbd9636570cbf4b639df5f926032fd3f6ac04fe1e46c6153020edf0cc1bd1f5534aa3187e0f33d08c1ea7f01e197c60c781717daddd1fb656f3a5ae291e8aebda3deda97dbaca9a16817e4b0f6329d83b114bfd6b9a59ce364b215bff3a7a3957a6d8348c13396280bd5da7c42a18423b361ef5c0debed5eaaedfbccfcb2ce2912eec9cf115b2dbcca61bffe31e79f402caa492b2f39c2433eadd01cf15a601d634d8a2f3308a6596291a2dd5e428b583677c14c0fa5411c2f6228a34a162e3e525b275a68ccf283d1cfdb1c671dab75dc41afc7967c3da7f6f1357335377c61dcfad4ad56d2ed6479787763a7ef7537165858eb3f8f1e994597d5a0647ac14f24c5f1328974a21a53de7894a15926048d58e2dee9491b6a3c07851c556955537ed5e672043032cfa2456b2acfc5f96925abf273d2ba158d8e0e78fbe8d3cdda6ff3787778e309f98229ac8adb608f244cd8dc721fceaa7f678487b904ad98fc03bae7ed439e439838d4f78361e05f500c7cd189f084a4a4df5349291f4702de37105e4d0f2d03ff091ba8a74da3033dff71478ba6999745a35c13bacfe2c7808089e49b82be24dcc7afb193da0012a3b7a9261f318388296d461164e0b53d2296b6252d18cc4860acf58a8389e9d60e9f5065d0a16d3b04f816a07031b82c39179c8b3740eec5ffc5a103500c14e9367d148e323a619c75c24b7e18e630a8ca09101434b392c04f642f3b4c30f563d1205f184c130afda38e2c0a9a14037a634cf061cc2d164eb62992ce5b40a2ad86b15a142a5ca42fe087a9d5d391646127e432ced972ddd23c16236bc52c7e31862bf10ec710f1945c33cf104ca746a1defe9a44d1dab1c20f0bd27ad86e08867f2d37c51854bf743f85be48337576c5fc0389e05574f89780977e0a02eed4e0f4819abaf43de761efeef438bc038cebfbb9d6b99d63e323c97257b200fc35bb791ad7c035c2386cd3a20360e624e0d8b60a8b5d59d5a6d001397ba48df653ccd072612878993d4fdc72b39649c27d7dd02057145e42c78b137d5f7a932b5e145c7a5304a659d90bed42fbf7173beb6a58324cf4daf9f3e514320e756517d45cca23aff9af3e66e45c35de69b71df5db0f50b85590ec4d81e40ee067e5d75badc30a196c48bb4375c6299347d2f06b7db72300c0c03ef9d93eecef89019cbaf9024110ed22527f77b7bb0ec045e2b61ec435239d3fb77d2023e7f1e3c6d3b1cf679342395047ea2d25e064a75590535eae5ea7b105e55221fa4fe612e0752bbf76b42727429d6b0f5bdad01a4b86259c17c4851a958534228af66092a344fb64ad211e699328de8f65fd2591d19d86b0c88d7c003366100dde18d43cc66ac58ed6e3423c59769a891fd2fc46e806cbe749c3c715a03506336d64450ea32677475a86cafca67efc479d4cef6fe308d9ff80d4d5de4ac0e886abba94da86c074b9723d268434d3bdbe72b8429f65313e66e65470678268a1a5b1fb5a2ea6330fc7fc8aec927bcd2d1b9a1ae814551129dc98f410c7b38009d4fc566135fefbe4ea7cd62eca8363eacdf9e386c9959f0fd49ca0c27492c52f4e05d519841610d780a831efba7966d781931d84be7a47cab132a7d18291399952cf2d45c556004a8d8417d1166803d8e9a240810c42be041101c953de5cc43b406c695729a1210c792620afdb8ec25a526b07efda13f9850bc738f6427ee2fd3bc037d6ec49db799d77229e4b114f2be8bcc325c46fde28df6c6ecc341dcef1ac6279656e45b431162bbb806a88117247bcc78aa9b6d0ff6c6a0d8af3f2b43b61ee62fdd6faea09424fbe9bf0f403d429d94d24fd9ecfaf3cb71cd2ca04544a007519ad06f25c6a5e2fedaf07eaccc92aefebd9c45a69a162aae391893db947a6298ef1488f8eef3087e1e7abcdbcc761ca6a62dabb64504dee2ed57e0c272b9b4c30e7d88f69a5d34eec54dc3ee4e2d1adec1a1c374c441ae6307d3097a740c8d340609726b0d950609b6f762fad9048ae93484a2facbd02168d97914a6aecdf40131d268dc5fd2a5a19dee6ebd5fb76db349316603ea187dc4a2f97f77f1e3318dc8f1b13d09973ebb27833ccac3c134e1931a7a9e86b60c50bd880e9ab9586e56e70f373ef5f762a2e13ab10119086e8fc8d9fb592aff4b8b3e2e9edc575ff9b51f160e13ff207b6d5eff1fb790fb6e0c6255a6c028c51d1564523cca4c76f6e9486d99d7b03e126974f2ddbe8d1591d3e2eda566ca7c1214c8e4dfefd5ec3e15fe4838693db4a19a639a84001f6fa08f702b0d9f2691a8003307885f1e51f70337c23ee440c0d91f0f53e9e6046efe9cf610cea878e05a3ca828e3e17d4d59f7a07bf927f62c40b46cec9defe93c5360ea2e2273d0510d8b79d16a39c9d4c7867172cc3d24c0a2c1a76c3af9093f77dae2533b632d3afc1245044fb7ba6197fe7e205d098b68291f39da6410a7d45c4921d2346af9ed1ea57658f6a4283d245af6b056cd0a6bdc71ac3874d629177dc0e80b6f849dfbf3ce1aec3c798740fa1f6da3cab102aa7d1ab1eb539c2dc0d3691a255548c7ba4b103dd09c199485bfc25a45d903e9a81dee701d9eefb2a5b88a7473c5ae8b6fdd66678a45f42e86dc808ef5e7f300e3be5c0a3ad3e9b071490482481b6ee260da3c1eb0caec37f30a892e2fb95ee7b7c284d2244baa78d9dc1ca58932f416993a2c12a73ed89981754408b3edd21c5736682a45c874ba448334a0e97c0a55ee7bd890d595cae60a13cf36e78c0512598522175d6086d3c98119a19eb96046bebfecbf018fe9c488d90b13d72a8c0b9cef543462fd1f7c45d026174ecb58328d2895c14fa5ce7d3df845d30ae43f608313576857834bbd64a2dc63b6cd2566ff35af0853c50d4f8d9999d0d577b3e25461cf5854a053e6ea518b4ba1666847a649db99c0e277a6eaec35f4c9e0b165757bf487425c0de386987b8ec184adfc1936e561b425e951f30ba98d405cdf1f7a15931a0f483e6eef6739b154b6ff70f73567680c0ca52a5c3105bef34a26f2ea287649b6aaf8f789289344893a071eb1a95b9e2b446d647a9fddb6a948a1aea010aca943f381771f4132b75341426723265bd4c659e71af5f50e47004bbf6b1ac45c5069e75ba9e246d44e138615b33731cc26290bf66e760c8f81b714218b3e2a9bf38798fafe4f731329772b4c1c8d9e03d98968644304bc20ce66fbff20eaaeee63b87615cb0598e6474e3c40d5ebd84443d1f3111d390a1df953c8af788b6591590c908e70dd1df12855cf370b24cf9ff068a89688b0e811611fd5ed25c7eea59771412333368c0c54c31827c2098d71cd5d8ce8c1331fbd62f79ffe3091e8e71cec8f3c2755d093e3e3987b92a33196ad12f686d31ec9f1ccd91b19dfe84d18189171a4d2ce65134d86268f95b2c3f86b10ad9c33e7aebc544bdabd15c3fd8471fdd3a1d05b317c98286e25d5065634f690728b502d9fb460636f226847feba1d4de1b0c516ee0233722aef94332e4c707526e8d5e581b956d957877efccbcdfa90d79ae373ca481bacec873b70776cec22a0c78ab59b4c1b6a91a0a68d6d45d0c1a29d6b61be83cda63289ed933a1caec5fcca387c3167cf56de52375ba0f5686eb0f7a0531c1725b6b1b01d922a041b127a7a47e2e8f59b9751476fa3a2ad7083966dcc42c8e9c97d830b8b94492933519af3e0e24b75695e630f30750235179ecf5ecf215c7e8a9d037a2d03fa7543f556b4855c302e0e16b5c0b6c2f9f0d3d4c145a2e4a40c3454023e2eed7834ac55127d765073105518097e12ae00fba16ee71669c6f1b82b03ad6098be244e9280cf2c9d21eda4dec39bc279b764a07ec6c5f786dc6743feb1396c452f8cfb8aa7caa1630a0f980ac66dba1ced129f0291081e9213ce34c08b187505e85158a20259f38bb05241f9a15f612101fb729f499ea646211357b13d09f7206f8b8ac1bee12a76db95c12e4da6f1af1cc85f4689b93dacb23efbf1d79f9d3594120b5fc2c639706f7b951622d693110080ee39bfcaeeac8d9eedd059bbdc489d923a6b5bf65f5801e392e71ffa5838cf0a14d8b57e7a1a4939c9fdb8f89b9eb3f796eb8464055947162a9bae3ed48f58457b197439aff28523e2fc240a10fea6083da94bdbc7e86786d148763fcf4a84599a38adfc9c2a2dca1ca2304277aefc37baf6577b19f76cb87b2107aca6a947f6fc1b10e1ec02fa4bac77cbf9b83db74a47f7c367de1e6be77b41ce5c78d1ef599ad1119de2e13a1c7575792306aecc1ca7b4cb52eb44137ce1d20f371689aaa2b000687f0be373ebee6586515cd262d1507e7943d7ede3deed0c7c545083c8fbc9963ae07d85b2f40aae9c9e800faba05cb144bfd0209dd01f52f541132ca5e1b3b7d4ee4362c666bad2a0c8dc5a87c6a8b87c71930052ecb0d39dbf8c037211ee5bffd1a3d6d15b6015559b67a4acd1e9ce0fb2741cf0a4627838d752674470fdcf5ffb3e8e966782ebbd259b75df8ca5e46d157e5241a3944ca8d59623935884f445576dbd4f971b740647786727a3a504809b739186eea5ca0c12f6c7dd586f2ef70eda801cee5984bca8e4a399c772252dd9092f6618e8ebf44a132bb2e727e9c07fe56dfd093763d6a0c0218adc54e17795d95abdab986a2bca1d5158ae8ba2b04dabecab4fb68ef017ff321315ec635ab145cd0cd71e5706d78a555c8758c401d6affd30de2ac3b2fd70fdc97f06e83cb4ea7d5e547a0bead0e7f83eebe9620895792c6970fd47d8dc3a4141bebdeefaa3c97c02a4f85a823bd6cb183ba1b9b871cd96681a545c23f44733efd38ab8aacee93e7fcfbf2a5042434134d625caea1a87966937424ffbe3a5fbd25f933c293b5d20d3c0833f737577ac1327f0f776e379c19469c12e8d042e91faba6cf2d67ab89dccf1314706b87e1350d5ba344800b9f8480bbaa34567302a490bafe8cbb6d4855ef312c54ccb92b317a4de15a3c45c9dae8083de461643c8091c3bc9633043cf00bad89e76befaa63d217213b3ee8348dcdb9d16e4f9b953f06fe4f8db292cfd38bb08831194058995cb869a230178b364afcc12c88e0f8cd1be36332a7333ad98f12bbd1bf81a04ee63eadb78eb3707329982f9a4842e102bcfe0f394440487a82d4e57e805642c29ec283dcbe2e7ce7abcf7e44226b1e294af8a4281ec68a1d0608e09827449ccf84f5882a7a0711af2512064fefb5d96c09857cc01253b5eda9065de8afc5f4315d917d2ad0bd3af5d392b425dcf9bef2c7443ee3ded224d7b114634c302f2492fc606cecf97e098b651f7e089c12a487064f183d78f0846bf59f5072286a41b5342c46fff63189730e9a73ee43c282aadaf352563bb127e391b2ba311c836782108dcc3324df0bd60e2a69e0d5aa600bf1e8fefad47664e4bbeab7b955ac495d26653357d795747f9afb50a58850cf87ef7f17d39452a27dcd6fc4a94d497beb9b37d12d3895474400caf9bc66fd4cce470655c645e8bb9b84796ae1bae03e8bdc861dcf4d24ddb6838668f13b8ec3f29b56bb8cb337c6d9dc08dc7a37cd390e234e44ee03d9b31896bc13022b03f10ef0317e81d0dad119693aa16496eed55290b4e7228137389fce33c416aed94ab3cf95908f3a92ee2a07dd321d4a72beb7468ecaf738ea32ef6bf820025d5d79d67bd275d58988c0ccef5a409de74216e99786ff36853f3a4784c173bcf8637ad95720c69e54e7aa58180f88d00cb06dbbc66faf7ad915d22ac4b88347fcf487c7f7663dab296cb56e14bccba4921e32dcb69fc7caeba369bf20c5867389d344ee610176c916ddc865cfa332b28d2cfe911e8c1b16045c40ac2d6edb5d766f3a631cc34e23afe158ca0dadfc548c7bdbbbc224e3d101f29d7382a2a11b1076adfc1a1a6ef6164f5d6ec10068a1ef63c5050fe08f66de31a5d4d980379a7066d3832874de19babfb18b46b8f90d58786a58bdb5ab39a6fd9b82f228a36e7fadb696a4041e97a891a204c3e740f224df35796dc12a997ebe60a14f4017b13bf80f21e1b3b8cbfef513de9dfd18023e749dd9a6254a25516000d42b9634db7d12d37e6d47d89157359f4218431dc574147382401c1af2cd8e1445d65d33a1776e093b613a0c7a3c7249cba9405839e8d018b1ca50b720d13cc6a392865e31635b60de9f4f10ec40eea42a1a0dbcb2abdd70df909d2bfc88eb1c8683c78ee789fa33c74be264c1fc015b0da86122daf394162ed9e6e2e39539e4ba017a631d3709662d95b1a251cd2c333858e735db5158b7f4952ad06459712208c316b91a401637f68b88d1926fe1485588d71fea67bf78194c89e4c9c24a4b798015694fe84dccac33a73a6710cf42517b54d424c8a236f174f9dbec5c7ce9db1bd0166ecce8df03d116ccc6183a8935c646a67a704b98a2f98e67130343168c378c933efd6ee3e9a92ece5e6371ebf9ea5a16fb92e87e32541ae8b8ba31202cbeec7821be798d60f496a1d4307bb3a53c9e14006aff2117c498c341ab5466bfde49c46329089677e9d1b7e8e01da2c4439b66e44a119135d5edced3de7f2f4c231f334b04bc0cf6818683dde76ab6234a30bd20cec33f814ae38fab47a35fcecbf1d0d774497ac089dfdaaece168f2ef98ed4c664a2bd8e410724697a0122f38473b49ed66a6745a1ac654678951827d5203e862a10272188fc4e2308a326ce097c9e6c23db6f8f96bd55bda215f21c9c91472f887db5ec9e0471c60a7c4cf3e3775b760b3cb3a71101b180ea9ab5ce4387e5dff2bc14912fc6ac3b9914469efffd98f69cf1f5a9c4220805673dce33cfeb568ed443c92860e512c2f9ee11c189fb261ae09b07a0f742b571d08b6ede5d9f1b3c43f227df798561aa17db5b2dd0c5f4230e6fb6fb2e0c4015a59cba327dcd7f16523149f0cd6784eba4995ef0d42628d3a60a51a646c4741cae6f2bde451db8a33be0245c1a515eb1959de0d794651ee99580ccccc7fdad0b38de275c447ef509a11ec70b9fb09247b1a1e0f16ab605cfc30bdc95a69aeb0cf9f6c0c692ece0db1b66be74dfd99016b63b82c9d6a2a794a225a666275b0a21d07cd607a6d0c61f2901b83b0e8f74b815605db9b6a0d1b53866854ea78666a85f523bc2e8e061cd9fd632172a3e9524d47191c564ce264b9e1f589f58388430e5af8adcafbe2be09b49ca73275eb9d53ee8c5ea321dad47534f48e3f8279607007a679b9064b3dbeefa5da2fbc3ade63ede1d7c44ee414532a7983711aa43e57ffa855265f88793348ec8d2f515d83a16883695def7a05a2008c20a96028d4ec541b064e5ac430023c8bb49d764475058aaeed07da2f7b42be21b1b9fec700e5b2743caa6f75a45591dd92c858e7520b6d19fdbc09b00125e5715e3e96cf01912b786d0635745f28db22ab5f71bb1e20438497a91a92c158078658f09651e68fdd828be44e6157f579082535d64ba565d3b87514bf54ca10638bd0084b6e918df243ec0e86dcb8ed76894a94ea4edbca73ab8178355f7bec6ad86062a865c488b2d4e347a5665e6f25f1b5d8eb513d436d900a459adbc3fae92fb5aabdfff1f25ba50b0cfa24399a2b8708748428f69b4c02fd84131e7edd8c6f2428c0c1bfb79e9c32942d5a82b692d4928769ad34b802efc78463add301124cfdbb3125eec2c5191bfd8ca9e4f0c8cf2a3a7ed0ccb88b6339a25b48a8ba4b2e93464bcd915a8e1d1c5ced98312476c6d4d9d14f234c3144689b86310f2f52a91a9a180edb4f054f8996c6087eec83943d2991112945ecf31cdc41ada670b6e3a960b60b44105bcc57c11a769ba58515634557248faa9c0f2f91c214c0da67b2ed2ba9db0c9eecaccf145f291550d8fcedfd3b8ce8e5bc2820f913651aff08a243095c132933ec5f9d5cbd41f5141d9b85d8ec01c3899ea8c4b6789984bdbed8d11ed995bcac2cdc2e96278b5ea0bbad0a296a0c0adc84b0daea90e38d90c33d11597ed904e6bcaf35439f82247359d80b8c330a42996c726eaf76955d438f6cab109fab17c3d7b89d8398c174e52fa3f24ca1726778866f8d1ed996dc0654e755b3ff15eb12cb90a9ed26ff0f27fc92e22aef8c9756167c52415d23620d6a5e7da33241e81ce3a4bda7e31f33adb016d4cceee615ca0ffd300e5c82a982a01bb36e022fcba32345acf4eaa76c3168695bd3724a2e6d21fc4a6711a828cbbd9e0264092a64a78c85f8216857f53e8ff5c75c5a389334764627ae9e890793b1ea603c3382ab6e9fed04b5139d6f29285c7a5def72df4aed58591b7b8229b0b58780e5043465b59ef0caed0a814d129eabc66c515d227766ee28bec6dc4bf4be57f5b27021b556d48a5eb95cf29fdde9fdfa64363499908bb6ef07d5f0189a5f2d6bf66f3728a5d88d494fe7988532b82b7014819e2a18dff44d2c89b4d39c2042a8a94dc88ed6ef16737a814854225d216e7d720a211a3bc4cd9cc446b3d2d80a01e24b40e65ba9d31d8cdbd942b31de500b492a65f0856c8448805e47c3556509c3f35c1a8cea1d7afbfe1402ddfee41974b3d6e75a41adb360e67fba9d27bf93928ad88b1848a2b2ea136aace5460b8ea52e49c4acdf2c7591d328bb2a200d67b417114cf980b4453ea57380acfa45c72ea23e1443ee9bbdc418ef9524fa308f1f8222ee5efc0111ca92c8022218647c1505f7c3d6ac6f7dca6575ba498cc0849f59d0a7b5f80863c2ad78bf36d21207e8409f7fc13d06eb93052fc5c1973da5f18faeea53639f572bf2153aa19a49bd856446f6d1c7dbf38e4cb60e09711ab52b6aed8d7bef6764f72a6a7c0ba6437e76eff030d7cc0bc8f7c386d1cc191268527332f85adb36c4ece43183a40933e276ef87ec2e398f59ea3f75a57d1736050822df9e1d9186d4ebc7e9a28ceceb8e4f35c40875d12900e05fbbc10f0b2cc758240b4c160673e4567f04c02c603cce81bf8495b010d0efe11c6d36fda7759dfd981ea02225e96250321b6706d7084aa85e6306f398fa17513b72f48518ec4e1c0110c67040c8970c1974897f27ce53b884196eb79510a18210c29dba34befb05295cfd854a2cb131edf78959a05f25837278f92ee45c515828c3105bd1321a71de532051a42dea44c1f74e27e1753863f27122535947ffe5c99a3a10a2ad2e5b014adcdf768f9882c58de56d459445c27b6bcfaa997a77bae50b00c125ecc2055f38b715732b62ed3f7087f49e118224c676244ea600fda38ba018a1812b066ae40931bad1c2da21695a5b869aa7a3787fa4e6e432dc3b8b3ab04b1116fa7629375bfbfdf241fb087cbc3c8e31826ca3beab1070a8819b60efae6b41a28e6b21b05866664197d41a9c138572dea1ddfeb1932eb9a849511c5dccc2afbefa7b18b2912b50d420c219c91ee472830733ea1aeb6de150479b239f5514e15fc1597b6fdaed06dcf31260a7300bfe8b94e450e76ee7e1a596b7c42bc3919d341f33ddc53a8f6132b9b4369944ed19fb05391d62acdb66954671edc873a33b8aa93ebcc4318615c0659100a51703287fe3993420d8fb165e835898b203e215aa5cb1a0059bf95412c18820f13f33f34b8d443b5d307b0e27c6ac0182e55204021213ff0b3e586b227121ea8346ce3c222d7a4c206c90904d04401c9a7f0a39448209153c960d09f8ea8d5d97dfcc10b021c786faeef6b65f17dfc448de6c410f0fc7c68e1fc8e268e73bdc2456d868a31a91608188e8911e3ab8a1ae75cc2bb2e088259561cd4a35e55c28e40fc236fc44fe6da1da41629e6186ab8c89218f42f5a6d50e301c4349069c53ba9865a599ccf67756059350e759dc6b4b6d7546af168c0dd6f1d50d90bd5d0c81cbab9a065d6fb6443a215f59355a8dca27b65b869ce86bd408635287683d5ac8f83120cf5182a4b12d7c5e06676a19b401f953fda10d1d934985b286acb40dcf45f01cf3843669624e19458006ba54c38a9a7ba479e375c5d1a28f9d865c801203fe5fee8e0ea739e1cbf53bb48018d5fa38af8e04cbc909dcabedc796bc8362e645d7f551c46bbf94c571cd859e2b23d80da3aebc0b02bf5a6826a9d269145f142742e500b808ca8302c156d3324c52357ad4b64779983ec905dda34d8417880f1ce4cc4fd19200371bb856af42cc509df3311627ee9e9cf21a9d49f02c70f0b0b4b62073f4526cc14c33557b95485153d52c902607ec428be07ca7bc7123ecf6b684368c6dcaccb8c4f7e8f13aaf5b7025a73c1b9f7750f2013b61126a0f4d1cce1181c27354da901dbf83ffbaf27fe81d85ec93b97188ed8850a6c8303a14e1bbf1c0ee0d1cb4bf7b6b36bb28e0b5f9289c2c788e3a8bc50d50a6c03d0e4c3b75c8678342cf7b671a09dbf7165f8e1e7b063acbfc5bd35960e30221611d9f80bcf3038c0a787225fd3038f080f48031ce7039b86d31eb7aa4a9b701f9d44a3af9d1cf45c6d71b6d8e42b9633c8d1d546b5a486e7f9ae9e24d46f0ffbc6f6c7083889471c85ddf70a03283760eea35a0307f006720525967a16bd9967a1ef8a1fbcb4593b6c9030116fd583635b44ac308128c22ea6fe0f5acb1465124e001bba8191edd183194289f5c52c33ac4967f92b9967a2d202f76c1f2d5b9f978651b0d8dc755b5302d8670865cf3cb69c9e478b4d5bc670e551e0e4119a3781d5128be2546c9e018f0e6e40d8b7f734c2857d4d2190caabcf10df0164d08e3ec8625f73c69176fed57364bbd0d309251c9ccbe1e766cf30861b19829586ca16f36cdbd78f26aabb837607d1dc621140934713460a162eae3999113ed960096c050c9462bf68ee3da9beed52cabf72408eb85ff08b720281aafe234970a8b76cda24cead1605c8b8c8d3349cb41ec9562b6222d7976452995b9782865b86e96312bc8baf9998842a6d7ae2e6712cd9204e6a0eeed08995992c0f0487b648677e1d53ea3515a8fa90f7fb0216de20e8e6e9f57434bc0c818c92ccc2e13dcdafaf4052d66a5c6e48790e521ffa50b24be82d3685b00bd58231fa50a4984a577349d83ec93079bcc7d32c08bddf0e719fbc79895b22558de3a91a7c59bdfad8c4d24e4a5583d9464b30d388cfab0a3183bdf89985f916535cd151e9bcaac6cf31f27cd51b0132845a316845df20ec1b5df0ca2e1ba53f2c43ac40dd304a568f19953a0c1f867b1448f64838c3511820f5e710aa98a2f69afb504cab7fa786bf0bde2f1af52fcb7743632a23a5b66c4c0ce6f1f3c2ccbd6bf08b11cda48e69c154e9d47c15398d234dff854c87972dfbaf4a97e56a5e490020b81432add31d90e9fde15a359217d8745b133b3bf3e10d07697c4c915114e4709626722535fafd76e6081637cc17525681ef8fe6582d2bad4e2b8052c834c41f8e614219c95a33dd688d4b364aa43bb2a8a0623f777a200d4a98a18429a2a5a356cab4b7c3b2241d8058c830a118d0776d875332e855b8d845c9ca85307b4de1d9402411bf1a0e05aacd8fb9c4a8dead1f30e75d648617424e63c44599763aa7035174605344ef88fb06769f4f485fdf3b8d00e6aebae784d4ac8f72c24a036b3b7104cba00bcad7edfb1e4159cdd3d8b10e1efd23563ca6ef9461196a7d5649959fb545a59e297f60d75d00280364a2408229cf177f93f6b8fbab62a082a0c2cc269a1642f68bf11d02f0b264976bcd5528a1bfa4074265ab68b1c575e96cc3ace7a88797aeaf5261b0ba785f4faf9b2f327aa05afea5e7d576a64c9fabe20a3fce15d8ea80c5a4351d35bd2dd0e2a4a43567f1c097390e075c662d968b87a1c3e29aaa74eb9a6163ec92012d51a96bd008a3e16efeb29dcb11c93217305eb00f6ac59a91960535b822edde1e5e7b12ec164f1a65c6ee87a2593da49c6096ead7b50a4c866a9083904f4e94a0d6886b8a00df3466c7b64eb2902da456241c48a237ddeb9364f35201221ba86ca39c9fe4808f5508f1680040a261d128949eccd6a0380d559a7ae170bdd39025e36873ef5cc9a864aa8334bb50d10803fd7f5c63b3fc31d6317cd4681b61e45c2f89e499d37d424344017d77fd0bc1eac4d394f7ae76cb8be61f72c0c4aa2ddc9605910346c676a440d86b9083434c03768119d5a520b61f8081e5858a526ce37ab7f52c1c59aef26779b36416afb3ac36cd1e1478915a372e034cdba610a1c7610affaf3e300876ddb017c1ec01bb0c049bb0ed432b34f54a8fd523d1fea8848969d5b02e23c4b232a8268c74ebc591db4375f516337d8cba9e526a371f300386467d0a51854f997d66e824d5432263d1fdbd2108a1d6a5658229a86f30afca70d9631b56d5ca1a1b29df8b72601675bd659c07ea1312b6e904942a21d14c8abb96b41317702dbee9692143d762057fc888e9bdbc9cc4b5cb3e79c64ee8a0b810938fef5d0b011cdfbd5fbab1d76cfeae85e04f9b887f5ad46758da810a8c503423feefc651824a2bc1fe3060e8055a6192d1bfc74c6899a5daf93fef91d12f50c5420dfd0d10f568ba816532d33648d1476a6cd2dcfbff53b91e541e4f9bbbc0ef42bc0ae82cc9ebd7dea300ee6de1de7318f2b17fb6fed5055ffc430e4f88b50682080caf3c10007c3559e806bad12d0886b786018195166ce9846884600913b035019e3a29025d27f2f319deefcceac033b3431b8f49fa7ee29b6dfa2eced5100e944e9dd1a3060f2f924e73a6e6f23d4e2861a2955adc07bdd9d9f871502fd4435772f94a970b3066b626f5bda72902ad5f0cc6be7ae0b4b295706392109af0c1fe67fe52e2e053f93b6f53d5e8eeb25fc52e24ff97ba71b3c9fa6ae45baf77ea07acf182c6a46b80a4a0a3e1689773f9121c6f32110f8f1650d28a02860a3b066d5b021bddaedf8a524c7b1a116f7b58717ecd5afbd6eaf1ed960de901fe6bfe7b7802182b4b109e248bc80d09313fd3c43c6404f3cedef94fab99bdfe46ea098e4c4168d009cfb838215951f15c475f5d2e6478157bf4e1510e85c98832feac05a6725e8f7864eb2cdf30e00b318cf45668bee41dc7ab5e214294af11355e729e120de2b4b8ba01afbb2d0684d2b8bda823127c2742f51d3cc998ee55e45b60cebd45dff0e0871b5ad3d6f9f71040376143a35a043621cbedbbe92b04155f20c316f3a4846b069cb90c3a2559eded7dc5f6745a7bb467bcefe5b15dedc58eb7e51294995468babe80068aeca0ff922064dd4e95672afe5978d8c71df85742df558e888e2d744d2ffcd01fcc2a9889d91888e08bb0ded039170c3c3f719930578b4cb0a031e9ef0b5f7b594403467d3f0a8271934964c20f0de67be803c17ecd4ca8e846be89ffbd0481ca27d76b2a4ed1d7af79de0d6fc53ff2b9132e159cd0c8b9145d691ecd6f6c037ab49335260ac1f72b0dc49e543c8baaa4805d7061a3398374e8c7b9a00e191e7b7d2d9d97d6021251f193e2f841b03d5cb8385d06afcd76a8d0df43384c5651c59e640296ddb8ac7bc2a57fbfa028aa0739c13fdae4e07689c35582faab9e3935596f37975ca3febb31e92e14700718c3990c225c4f598e72449c2c37ad5f4116a35f0330960f374b2d85fd6ad045af70bdebed2612f139923bb074aaedeac0f6f95b0416dfb34ecfad729fa15bab08248b030a841a7e59409cd1360791e7a8662800b870566342397e40615c999f390da6b31194a703ec42183a8e4f3717c77de90ebfe85a31bef7bea5ed2fb0ef8019e4b3cc50ae006a9be7d2d95d74e500bfa71ab073aae3e56d77f7cade32c99464b707dc07d107afd2a4d9851010e48a8532225cd36b87fef9c87fb8c85724336797992f717e28af1a0911121f096e306005f2a79d7ca1052b5d80105ecf43d20508a3fb6150bb8c46be43769d9d20f6e7952e3eb0dce9211f78dcd979885dace721eba1d1431eb2b534e79c52ded01fec3fda46d2e0976f80dbf7f4827a674781b8d82e5a318586d111b4421baa718fbd0deeb1e7c7b0d7ba1b3c68bf3d96f91b3cf8e001fbec39ee7380e6ecf4b4566a58a008459ef4f61ab6bd564306bf0d4d06771fc03efb106021d07eeb2848c3f991c1bf7d0e503f25cd8f0cee647c80e4b3b7419275377c706723fbadbbc143e6b9cfecdfe0c1070fdb674f42f239401bbb21d9945c619f5596071f36b8cf3c0fd96fcf03f799eff936b6cfde4646c6ec3eb07df621d8ba10643a393b5c47bf0d8a9668090ad6a3e027d21105e747fb06d14f4a10b6a1a2f9d9be33191eb8e1c306f6dadfd83a393bd786d6ddc83aac939e0516570be9f12da4c8349c08e3d005154e66e86bbd7671b4f6cc589925581437350708385a39b13891216eff8f540baa0827c260cd717549b8f2d17da421fd414797df63688882b4857e74c7e5f79652d66aad46c33d457e14140ee75fa3f191384753bcc13f9c010c2a900f14141f89a34fc8651a0a729bc78dc73c613d4fb9fbc8437e0b05db93039b09d31d9ea2f5d4fcccc9856a8a291dab298ee338562d8acccab5cf5dfbb4921644dba1a289b45003a2811acbe5f7eeeeeebf4a7206b326ced7a1a7383ff3f903196876576976f82b12aca77d97b52f43632ac94fa791a6f80bbf0b7194189322d252ca4986cb9fd937bbd3dd457eacf2244376bbf393c87a1ef2d0fcf8113eaa4c849eb83e0a623d3f8dfcd422498a6d759bd212a5b444456a8406690aa4a9e9364ddda630b7e9e9367db9fd945b32fda6d682427d28bf9ea35a98d947281d1c2567b814e4873e812a394acee8928ba4a5f670b7a915540ab7dfa353dca6abdb74e4c2cad9a94eb0b4761b9220ac474b4fbfda69614b127602b4249920126f8f4af3436bb5d60ac17a34bc7d67474b46686907b73dac47bfdb4f6d40697081909e1c482a84fc98064d611cfa5b0cb7db57455c4749e799e1af26ebd1d295265af2509e38c9c51f34c57bdcfe76213414e4760359dd76256ed3944b4bb4c4366c2b6f6e0bb25b4a29533d7be35daa943ce166feae82f5ae544acef0cb57bafc400852ca6eac2fcf6b8b39e75cf9c85b66cc34324717398b875ce5f24f664e7e76b5ed3dfdec2129ced55c59447023a7a23b152d90c5085b22bab23e6b858e56cae5f7165bba5d9c1f17893b64d745cfef41c80f950245a1449e593ea45584cbd6112e5b515c7eeb06f2e3a72fc80f15511839a33541b03eb07670d99ac1657a864bc570f9bba3a88c184ea8cb6fb5582afda12498feb8383b627b482c96cb6fad583bac141a43c58cc95292383f54a4d1745ea5a4cb1a6b5d2211cca76237edb67e6e58d0ef32fae59d0ed31c8691d11d154ba2607dd5b9d89ccc683d2ad20113ae10d2d303e929427e3c9c1d11d3f0208c8317818a42242e4f39a3af48cee0cb926711d9e1e7a21ea13a2e8bf22413c47ad4452aba4a7336a1911b6416b9fc9e6267cce59f5a5cf620978a547411372ae101774d691fb5b7dc6e96522b912d9737d9b57eb02d35b7ab3c6939c5f7c25c8dcc12ac37479e23fb117e6dca98f33a5d637b52fa53552f2f282686f05f42da23a56062c8e54b5c0d41c7f5ae181291299b378d6577e6a539f216b1fd5a8b56113b45d9dd39a6aa8865c934b096e6c89b415da7f65cdcbd5e2e0b097239c875ba5046b84e9925d8d314278c569281ef3ab5c76346c3ed2e461516c695529088dc0190c15a55982f89740f2f1c0ed8870be3f2a614ae24d1b21b38dc4495d8f72cf800035cf9d26bc0952fbdcd95af611a4cc3eababe19ac4a898387c476927b1dda96bce4d8921e8c2b5f566b3d3024a7dff313393b3136afe47a1a18d22300c9e937919c7e18d7d3f4f5b6929737d3c819f2b634e9d01e9212ee68c8eb15200024575e9e172fdfa33fcc9f2afe29680ff7fd27a0df3f02ebfb3320694889c3f5fd25d8800e72867d4f6a21afb84eb8fd62dbbea493b3c3249bcc4600bd006dc38f558e8779269dcbefcd292ebf8b70f0a56da1eaa83aaa0eeb16b1365cb25e56edd86abce36e8af2a4a76a7642791206cb8f79d5ab252e96057cdf446333fc91a07e0410e0f64ba6313db4bb4180911c79677783b09238c8eb790db6eeec480c067ad1ebadee869d9d860189c716d6e3dcbf3616886e2488bd43c1ec88dc8d009ad3cf59c077fb456082fe3809023f08f50f84b89e14adb45c4f0eb9ddefec40d0a80f1bfed4676732c839084ddee0d90ba469922301f6b5bb913df60c03928dfa5977a33930d8fe666e5992f1647025b6a90fba3612c49be638e06f7528a01d73f1da5535adf655350290f2c4fb8b811b9ea383076c9460012875c69875629d1580bde1dffbd5184c2a2ad0c81c452396961913124b2a2230aab95acd18d36b5e525f867679735535adbe87295f7b6ab8fd3e9a9ffee140fa23bb709597dbefa2a96d326003d188c5e3f9e9f6730f6ebb1431bada57eeca4ae6678f82fada7bb576727ac9fc7e1959f5d02646736464dd0e7db394561541a4082235a040a03f299b0b11a58fe4c26585e56675863ca53dcc83dbef9a6f9313803ce1a79fbdd6f1c0bed69e13eb3ce42157c9defa8d07f65a7d0d6458e7dde9a741388ebaba90018d9910b945ac67229aa49ad32f482f46d6aba16b60afb7deab41a4894e2f7e90b2eb3ab5975159dd0bd215ac679232496554262f48a28caa065146558328a33a852c76bd8cbf97d13180913c7941b2c260bd397e477a417225ac67927a4132314999a436224a72054a6c16666ee76ed9c6f9a9d55acd481a4923c9034eb282ad55249550a3b812c5c6c6e0eece52cad56ad5b29a1f0741bb04286a2a2867b40f213fb487ecf46319154ca5c0a82c18b50546512b4cb1a22e4fd090867609d05732fcd0151ace0f5330a4a53074410633f8ca8725ec753d0741db623d47adc295cf1d1a12494818d64c1236150d290d698a12f9d1b4a587dce67e81f1a2c46a188c17d696683456e3703014e69e355c8f8638343f315e6ab6e4058c189dc3404179c1e194fcdb2eece4eca830d5b5a243bbcac5fec10d5442a01b38e4aa085308817c587f03c746c50e4220ed716c50180204f9a8efd9316cfae3b6a540443960120d7b60a58b1138b81e0d2bbf8339c893dee866d62758cdec70ecec88acc6f477e0e7deb91a4c3f733d6fb227a1dc06c33eeb64f0f365eaa1b7505247c3e6d48e8e3a0a5a1b796d12d6a394d3c06ca9c15940c809c116faf4d20e0228145ca121257561fb7a34d480f461275783051ee610de5173421aae7250390ebeac92268c4a42c21f234b29254b9652327b3747231e0a79881261ad6f1087628c34671c6ba86a21f291fb0835a4e5c4129a5e48406ebf8f46da388ea37134ba8b9aea2fafd1383fb5cba4c18edae3612ab75fce089986bf300e51dc4aa1b8fdd2a3449874892a5c4ca53de3fc788f3d4acd8f1f919dfe5410e368dc01ca93d24ba9f472e9888e2a26d2be0cca7a73d421e7e841ccf1ada9a9cccd19bcdc39ceb9aa9a355a96252d29a5e56f6dacafcdb12c4d0aa98e75c442ec0796828db01006622dd887ed60296518862f1d4e51280a45f47a2ea2948e1c8d8bea913a8a44d8113024dc7ecc0767909f6a9a9d4dcee022f8180541b3037b03133603509e68158673b17555c5e6c460dffc741d41d71184d86204f2ea28dc04e0cfeff25347f3f24d0577708d612c54c7e654538d698f57eb8885da93827d2a4c8385587b651460c0c2f5eaad638f8c4315cd4f75919dfe2942295851aa2679d25fc76aaae36d4dada3c692323d489672cac9cc73f2026ef09fd77aba8279e76f97c3c9dddd30ddcdcda0041dd468acd556dc2b07e747823428281c8e051dd5dde027aa40831408471686201f3c3b2ee4877efe83a5a3e434a2a7d9b1f8a9c73cb81206eb51d1faee4a7ba6383ff5fbe96a7ee87747c5f9a9b493c1dd155d832ddc470e360dac47433983f6d31ef243359a92925082c4011cb9ba1df8ad7701bd9d83205f9982f50ec8d0d08006d73b8f8e2cbf3d1e9591017af9e9e58e43397708d9e93fe2f63be88d726114c14519ae23d68b718d56918b0c171926382778f21716d3caa82424c452580a4b6129cd2e614bae87a5ac9b92339af9454dbd80b05e0d61291bbc0aeb3908824bd817d7c35256c68b410d35c7c3520e56f136966a4e6741acb0d929c352b73f1363bdcc74fb335467a86b79d85a4476fab9b8fd476ebf8e2a56f1f6830e3a98adb01e6a18cdcdca42ca6eae9a236a2acfcec839ce51c60ed79d8f5dee7a73cc6cb8b3d348d407b655a3469a59d8694356bbde1c4180814848be172992ef45aa86118c9c915d5a9f609be004190579f229c88f87ae0afd8a392747e37c7d66a89f586818a42f2be4c0a57b73c8de216ef1864272d8447a1c0a1f72797e5c09b2e356480e09892be172d536377078172513487b1c578a04f2d1afd56ad9553464f5b0977f76036da3db867503484178d9307a3dbf8fda43bf0357c743ebae972067e90ecbb89eefd5f90815a2a16e1a6a0f0f2101e90f8a48a53dd28525c8651fad5ca61f1d4d11cb161c4262c41eafc25c2ef13b4b85694f3f7f370db1eac8e5e71f441aa2a1519d56474644ad14a556eafaae1d16910e592a6bbc542cd13272fb294b2965ec905dbaaa2ba65058b75058a629cde168e84ace68cb922b2b75f9405a67901f2f5957901f4dce983508d687bc8aa0d981bdc135038d182e687dc1ea42b582b5de9960adf7bc246787350b85add7a32bba32b2aa2b0b85a5efd115e831b79fc248f1da60a5accf09eb5925ab346bb5d66282f5ac9497da235da0a0c5edb786584498865396e634a54356a9f9b1a0b56a2323d781f9cd3838a54c3c31b252d44add1da2e6a43427d41c95dbcf56ca4a854499294418cadd9da594222a7a612a9a1f2f79898abc242a75f6d87bd8080bd29ca64032f6eb1b79315af20e3b61be327968e468bc2484b52eaf3c6c74a5c93486db4f4dede13f512194312080e122213d3cb011d370184c09f971945f011ba58830bd546a5fcd0f0d820eb13a62d56345451a96b0392d2179f2390a6665870f3ec250dbcae9d49e4e7911d29d22723ab16c8d3ce9fa045b4373633d6f5cc8c9eafc5412054b3b0f7dd49cccd8df83091bf2d1a97be37eb2629c080d0d518d5445746626919cf432c771b43d52cab9cf51cef8b815768eae43ced082fcb8687652ede1c2234528893b3f623d1791f8c0e72673ab102b418d444a174d30854017f01ed673d165ce7f6eb2d4903f62ff75983a346feac77f74a7bf532ab6a175d1fc3813b2d3ff447599e23a29487fca539eb24dc04220787a6131ad8c4a42c21f20283bbe9a9fab7390e47abe3232e7ca411ae2717b76be92c2f24511e15028c2082424d370218cc31140aa843b95b46706353fce457fff0fb71f058277c75cf53ba9b9b81df435feebba2ecbb2b04ccbacccb2fa7a6cd68d9702b99a62c7cccc3ce7b451d89ed7368560fb22d21effc93f55dc0ab84b8a58ab9ba306e678e97cdecc3979724b645d8821b32887012ddbec12566b294f5809fb62a294d2d108ec1df2e4c5a218a6041636e73125dc0a12d3654913568ac2ed77eeb070f45120787848cff571151d310d8f71151dd151bdace78bd900881c08213f34343b4c83ae70d7a3a14f86ae877d5d528524ef418c4f1aa22b211aa22b25ccc41b164a8c1c70a54b12307703bd7a931812812b5d92601925b1a3bbd2a5c7ea6ee37644ceb0be3f0669e3388edb388ee3389fdbc693b36f767a2b42725af256044cf6cd8f53213bfd5e645281917edcc83cc967a50c48b5fedaf870bd75bf5edacd8d1ca0ebad8d97e35a7f5d9d0fd7f3c63baff210baf37598d75fb5762dd98fdb9f85cd8159a934221bce0a8b01690e368e77a3a9b894c5c4395dcef95c12c02f0910d4aaa5d29cee3c4da8393d95b07fbd2d55c3952e3ee0e07af6a6e6e7fa0d7c0e4a0e5e8ceb69a91e7603b5d4ecf4bf771ecaecbc1c4abaf8a2b875a5b7517366a8607b3c8c745358e7d5d47b1aeebc67e1b4dcfe4d4b5deec7edd7b42758d2fc6c5c4af5b65123619dc7edb8cdad6850b0b40c7605bcad34a72f202567c372a1cbccdd16b3c1c8c26e23006861b5980d1c723770035d422157bab4946e01ae74095b6ef6cdcf16c3a5886e3f0e4e5218f149f183172988285176154ec4d285d772cbc2c02a6c4dd521477c1ce8991fe2543851103f951c88f3e46a493bbd34a7c7f450f548b1c7a5dc7e1edf83aee7a75746a1052cae766db695ee30771bd89ce62e83b27cb9100d9eb81ef7dd760957ee36863b6eff16c37d9c4a3777db116e831105eb655f78c78bdb6008b1de067e2f896ce34a7f248804c6cea7fd95ab31b36f7eb020dde917525fec90b6b2eff6675f7bf8ad0d068403d69708b12657bafc0085cb1890e6f4db5081580f9ba20629171be70763e916717e301153690eb60323cd4f5555d1ae34a4fba9b6f1a6b85ceeb6cdc57adb665a6d1bbbc9c698d41360064fa5be1d4ec4873033b36ce6176666beb82d6b9c9f3aa43b0c43e48652f2c48a94944e92cd043393524e620c89d0e8323733333333f36c905b48325cb59ae77cf3f3a22ba9d55abb6934da7ff699fc335dc182982874f9e90f2129286770c54a2e269a1fbe44971f0b61298d7dbdf18fa4fb329dfb0ff273f66f84f1959b4efcd910736de66889bce21e5dbe350182a71716d3caa82424fc0182231ee09c9a4aa2c37a58c8fa15b80229490889240404455812b61f4896924acacca552a9343f3e1a9546a512e9d61f13b0328a5074e95b234ae9eaed74facccccc17bd38775e9b15b05dc2c2b89e8f463ae4a79e2416fe119a216c10f5f443146aada26641562fdceeb6b8fd3466fec7bf39d76b418ecbc13697d501fa562704cb9e97847432eaa9395dc285c6be3a8ea252ad6cb72634510459a61198b9fa56e6386573775b16a7d828ba042330d26da6ddf2a2c4f20b0062c020c97000e862d40ac35a128d0675053b42f5c85e5e0f46b1d1ecfa226c0706b6673ee360917cbfe84a3adb791a922e7344e5baad7367f60bd436be63e3a2946984b20823798ecc37115b8d63f82325a6bbbb9f626188bd60e1fcf86824676428d4fcd45a2b8642b5f4070b61426e63416e63406e877eec90b2b91d321e5d8f85349ec542b71d0b2f4b7b8c1761adaaaa5be082f442d5a2aa54b58b4bdf473e923398623d3026b0275c382c94275868d171e415a7450deaaa050585c3f9d768acadb5566b359a7f0e0705c54925ba23055e4a612e20ec849140587fcd512f97554cda46868dfada6bdd8df0c667418408ba81830405921d011cb3082650fd1c20fa4d61f29110162ad00d1c191a46201ffd377054c004f2613d8e468338ce18af8295cdf932d0b747b74560d667595f2908dd4155a82804424196cb6fc9a65ff70ba97442c9eee6a4c456b01d2addb14cb07c3d47592d28281c0e4943ca24cb2a20a1851308875b710255fe419e30f65961a53ca1ff5d7efacd5a5dec8df7fd19f63a4c19d6f3b51eab9dd5cd113463baf37df388ece858d110fd60e847bf119d991e76748729223f5ababbfb3d0cfda3d49d524aa97f9e12f2904824121961e75b545409f9d79c6efe986229974a324b29f92b4b13b248817064529c403e98375ec5385aa0260adb89f80f47b5b0b7733b9d9d8b98f6901d7e264a46ec90c913feed0aebcd718ea1aec07c0fc3b0c77ed946966859d9bb08b2b81198eeee7e2b6366abb5382872d75d1c633a14a25996dd9075679c6d366b73939f86901feefbb5f723ee679dd6895ce72192acf348e618ace7a653738a7031e66007d188f59c546a4eb684cdb2ec2dcdb2322d47965d9b5dc2721a6f5e09aea5bd6b9de7a6e6f8497bcf4d41b4ce4fdb660064b0d96bbfbd767135b62d7be634c069b859a93d1a4d6a4eca365eca3eebbce4225fc6ac1216dba4e086eb0e22955ca4a2b88db48e81056e9eec4edcf6509bdf4cd184a1c8091aaa717d7d154d020b5709e9f125a46708e34004f984d054a3b0529e58ef39d5f1832a08d510aa504893a23264644193d76048188a3418151758a448912cb2b87a90c54664923249d9f0d9b0c384880da1db6f32c4446532daa062229a18a119554695516554afd18df5d8c686acd6524ad94d231768af1e58e76a4c3ae96b4cb58c4ace689a510dc074fb5126abdb6f926acfc52629132226a209cced3751ddc6b0f6c1d2d76162d8d38dc990e6042b27b455c4ce5516aca769e135ce0ebf268ea22692a85823e205eab66ba076d25e34965ed1465a4913a285da8fdbef607b1c740dbc50de7956fb1312ac066a20bf40f5e50487ba8c89738a1998b16046388361cebecbd9ca656cbc9ca55c6eee97e983e470888afc6b0ee683f43810241d10b6af958f2e206a91aa05c9e1e7310d974f15c882184610fd1c208d6e648480a66a6976b8a2668759e462fbe79c734e0e73d10585f5b0101602356eadfa5409d6c3444c6c8f740143eaf2672a4c03a63fd9b38719b98cc55c7e2f4b611ce65fe3fc641da64376f86be7613f5cbeb0202c36c4e5c742f2845fbc4cd67311263663224f8bdb820c80ca8636b42922f647db164bb2273bc4966c905aadd568fe399c17bf359c9f3986ff359c63a83ef6589d366c8f75d910b361c52cc986cdb16125b11502d6900856ceceace168c316da30dcb6603d3bbafdf57a5b78fbed88a574db86b6a539f687250db19554c3e690d8c0cad9e11028b2a10d6d68435e0540c59db6d9c4756713d543af5830b6855f54898ab93401735dd0596bf21d01f70006b8ddf58dc75c675e4cbb91cc18579670b409cb3f6b48f6e7af55d46de3a6e0992d2c07e14cd647adcf2a5941ac1d4c62d165067219bc4c65778f66e7a5d60b08abf1a4a3f99955f3cfe1cc150feba29d0c1bd70d186313a38f7e1cad43045d9f03a459dddddda26f234193e3917d06653deb63427ee8c8325d7ec2fa2c1539835eb64874343fd657e9e8a33f803db86c89b2979c075cccf8e926bb17107b45613d2fc2e154690e8bbee65c461059dffc30a83bebb3bef648fad8d7d761caa07f599d0cdad11165b1accf4447d6677dd7b2be5e7126f7121f68f2068f8ec01bec0035841316d4ea392fd29c200f86e841b5d51be60266762d5189b0b9b4d260fdd49ee9298ddbb81958e6ae093b6dd57055689e425206da83c5aec88eb09ee790148bf919e9b11282b8871b984ab2a9d0a3082a50db60940610e481020b14e8c60c296248201c5c0e8e08635c7e49335e8eebf971041148561f16e041c408925f9946bb3471bafc020f06973b17ccebf284df7be8e1921cb1389a67125a3599ae7741bdd87b7d2d4d4ac97540fb6debb4b999779a6a0abb70f0e800ba20af8ead0bc88b95ae37b3b719b67941bdd74fd3fccc54ca3453a62b65df6a52f2e422d569f5c856b3344b72069940a669a626cc3ccd97db2f2f66d6a0501a45524754844038780c4288201ff37380bc56310a4aa7ec73967575da079490f9ee6e142a8fe06accc6b81afeb3fed5611b191a0adf0cca9a7adb1a35274fde6c604fd2dd2079ec35924d875d7fb3d33dba8080a32cf3bcb9196f025cb6b92e6a836b930229de4b0552bc2cdef9940a49dc79758d9a256bbd374bb3344b93fa0b1710ac3b64a4b09e8320088a191486612d6eca90b0af39a4f9e1c00c89cb90b80ce9f667bef9e14ab3d35f355e9252343f6e32611ff635478421224ffa839c6a9b325f0fd6c344d7e3655256dae371a5517bbc6dcca4b42763b2fd1b1aac877d5c89992bddff76930913b1c0af878930956de4400e09d9058e082f704548ce08e9e13f03078e1c388954b19ff341c8585d6e19ea126e9b41a6417a58235fb89ae4490d524f990ffb2a262aa59a3328d728a594d2d7e866aa8a88aca504eb49f17635642d89419f7653d59c6601cb1379d28f0202c954b5e9d6f6b047bafc60fe4d8ee626826be101d60907380f05542f743030705ef4b049a2005010a0d68ddb410d0e04003387c89f3a215757c6d86a15b24d76e5a8e0cc96599164365116b240f0f462b198ac9155b28458a1f58344a2244aa22f94dd8a91a16fe42c6125cd8fd76aad46f3cfe14c14140f641f9a1f064921493dee8fdbbe91973a213fd6c80a9370db22494145f2a49f44a5b0403aa261e8ebba916103fb8a7537b2901024108e4b04f9f0cf3a1f6707740119fd88fc786a764639833541d81f525407d89c5eb146cdf12cd002ad517b249802575898065bf447739a020149e0fc78c9024b6029864a22d7297599a24402491678639a63c4022d90c7d09506a013461328a5b4994eabad49329b7a6885ed4ddf306c161d31e59c3d5b4af98282c2e13cc949a5d2a925c8ba28a575353f56f79fd58a595b351aab7a807eb353e95b4fa728766f5a68a29aaaa96f472512aaaa3a622a55ac46b4203f354c7d8fe9b86daa47c2ca4558e4f612f2533f27444900a588c2ed2f59d94f19725353bc2151534537555315aca99ae22aba8ed8405b79c94ba2110fe240dc9482f1d34bc9457e34cc6cc56593924b3d88212e77a292c84b5eead56505e6ee9e1ba719f8589a23b9ab2a2b8acd74dbd9e90eaad2ddddef52a552a924ea2508f9f123dc35b5dc90c6482d06196c7fcae7b9e9b6a7a58b114126a8dfa33bc0ebc5b81efda653e1a9e670483e8545794427d21c517bb87355f3b0aada55842293f659f3b01ff6243cb0cdc37a3eaa7f49fe022c55df867ed7cadef2b07715b7a9f55d40ddd49eec5bcb324bc3dee34f330ba3f5db6db89eab4435341923a5946f55312cae3677c1865687fee6d876335925845cba7357554b29a564d933f8e589ddeaea4f409e504076fa8544f1f32301d9e977f170b8fd33872b6cf3cc81abc2cecf21075a639abbbbbbbbbb9bbbb9bbbbfba59bfdbf49d2a2408a09647d0ed0ec48dc61b779f6f4d5ec5827d8f6808bb3d35fc204ebef62735630cde99829ac874880b072763a1386d54684266fb0645856cf39e79c73ce39dfea3979cee91da248a8248e5407450bd58800004000002315000028100a874402a168442c4b8afb14800c7788448250a10a644990c2300c52ca10631c3100040060448066340a0280c7932054502e9c53bf2005f3f61a83cf1d9a062621cbc7dbb7ef09e3ec809cc1dec87e692b5094c0481f981b0f1c452ef0380461b1dd1ee04993023067948ee0663181101e7b5d9b09e33b55f7e15be30ddaa81759d2713b1dfdbc0f50dc30932582f06cac59ed6205eafdeb8b31ecb2800a526f42d309cb80d0c90fb3db22242d2df4dba7977c9ffdb1a427554cc580b4ce99f244be8fa45e8ac58e5a91d5a6c0cb5b43d9a4042e9749c8d7bef6a2ba5398044c0a28ea75b154eabb8e528487c3c24491a9d9b754aa1b279125286cbdae3e5ed85fa45ec48d630881d3f9afab62744ea6b7b330557dc53a2a5a520d995a812de4b8ec71f1098b80b110435c9e0e6f64832f0ce81e39b4545dfa2a0f3137e6219741c24933fd8a2e4c997186ca730f9bb5003af5bff8ed23746488156ef214a25c74791750ac3459b5d25a247f412ba46ea244305447ec6ec1fa75ee58915a50bc0208ee884dd709a9db262792cc455aa38e1c382a2bdc4ffbd74667bd07573bb928e2e459bf30d49e0e10464ebc074b1e1aa4bb01fef825884c5a8f171fae7ea9bbf88c26426a0bfaeb832166e18babb2bde5013b0a2782e986b98ce37523e8585f362841dff01085944994b14af8e62a4c5ac13945b63076e32b9f84e43a6a1b5be880c63d889f7f1f2022646a7598ebf08361d1381143a3c5e2319a11335c052798c67fd7e5856e62c9e666ff8714900909df056aa33cabc84a1cd53900eeb50f70e8c93fd0f692acdc7f1d2f4735934e8b027defa87aa68abe9bf59c0e886cdf0fa1552527301ef5102a1ad32813c8d6c3969568a91fb1d5db71d4ce6d6607c86771b13f6bf37f79306013a280dc701d7663971ac81e7306247e3a70a833edae80d5f78e9aefbe29d10b7e982e62b1b4761fe1a7f8e04b897e23e59c1c0ceba41b79d65da923eda41a2ecfb69badbcb5844a88e2b1fac6e372a866b4ba848b59b7bc8f9be1a48608a48c860b75a957a1cb5ec8681742b8d4597a50f869d0d3a3e0465b69689a4086d472b283dad138a63ef7dea04204ddfa1bcc87fc8b3076680a93cc31d10f0410643de8d820d15a2c5a70f9044353d9f9a00583003da8d034e81298922bb267f589279aa3b0d2333cb532ce42710035df28370adeb68e0e04303eaea1951e4825be4fdb3440ca47054dbb578ddfb186c31719459dfc9fda806b0e0e55b5a5774411463c4243f2f1eed73c8a77a9451ed794bdede391ca92552c877994eae22a39c7e36a9923711a259ef7b589f80b77128f6576938bb5897bbe68b62f4c54e3381b6b67ea850a94fdb8396c0473df04d66de2e93a8a4ad9e39202daf69a9afc72f974c484c2c09fc8662888006fe37286c2f541cdf436149b62a0756040db5a3e29c8c67603426c8f19a332b971811102d2bef48575959c3d73613d17535fc79b28f6695a3e31162a9dfc1a98f785c7b8d38edd3ad6b5be44c4184c01e174a183f269872d8d25bb8da0d54cd684668c5e34fcb8ed6226c66d4370e7e7f4da31a996d868470c7b26130b62a2183af2b678b719e9c697f6c8a3526060b52dd59108e976e24a9bd128a0dfd4ca3d7819dffe740abd0533102cc988f139261ad049d790d67f28a34c9cc655bc69bb793ce750c87cbe1685bc3085b0a0f71dbf3aed5e4a333c2c74d8fcb969cb10fe84c2ec3452119c5aa6281443268bb3172086b9b4e4e904985572c7b9bf72fadcedb01982fd682c3c531e97f4e848f8c14c8c7a8341a2b050b895d4ede4ea9d2c0f49a36f4d8c5714b1b08ea6d254ee3fa1630a2464c6ff817c3a2b13aa3615d6055a4633502f2789b063e32d3edb21f1cecee3f9c252873d81c3a44ff606d6c6d405df2ef5a277da2d37ee7f044c6ed967dc58663f64d974aa40d47bfea7cc0d1e6f4d79379a362ec9e868b5bfcb9c02a7ab74256a94ec8548f5a4baea3785f0996ff65b9f99c55077b7d11b7f921a1368cd9d3cc82321f9c2ab721f270d93ef0ca8082f859d9748894f040896295cbc148fade996cb808954eeeaead31677f5d78286bb60d152b1ed6412a0888c7011eceffe55363df5084a5a850126439bda71206ea3a96a355200f9dac53650d1f9a5e3e12e238f3f5470b41d6fa2867b46c9f1b2e362a7b0e0a2ff445e7019dd4a9f9e5d1b18aa33487e987be0302148817c29ac65c47da17d0786dafafff0d0eacbc503880f0d432d02b682c5cdfb1dd5118714108ac92ed49762c3670ae95ea8ae9f3050e28369b97daa2832be28a815a165c36427d3a262167fc7069d3a9189bf5696a64d1f21332f0d9dc8b473ff9a83072937645f47291f8169f23ddf142e73a86982213caca7cfef6ab801f91d90b7515603e691c7a086e805fc0bf4e1eb3b162b7e5bc65a95121ded129a941cced0757611b6058282105a682b11116da504a61fd9fe3394eec22df8172091ff40060c162942fc41790d9bbd8f47879b4e0588e6415ecb02beb0f43f22d449791eb8b1e657cf3573d6566ef50b1a43863b95e3ae2e2dcfc1b278c8f56d29c5764c9d5b9b9f0e0944c990842986259e6b876a9752b60de1c4d13316afeb897c0b74ea048eb942356e0d46ea50f53d8b6d46e2021c122648fa365c50e628f82a2d880a565f4cc63317bc49581a156d250c7a65473aa1c05c433df64be1a604fdb772bccf6d85b477666620c998ace9da13e24aa12aacae234e10d2622573dedff0fd600525c6b295137c52450f6dac5670051bece81dfe0f989240481d86d8bf916ef17b4b23ea2b52401cfc2c78fca489d717d24a1e6c3ea20b16216795c16dddd471dba6f2c1c90503f68fe7deb8ba973ff439f138cb92ad68ce1299a5182b577c57499934de90080a623819861d5c140f6148a5f2e13f546e60f6154cf837bb8aa02616f66f5ce6064f4d4a35a9e854eeadba012405cba2bcca72348e2b8e599a691fc73641f8df29d3f8d3f94de6d213773e335ce46efd1781fc061064bcecf4a435d6045a383ce8b0a01e784c258f483bfbaf506f42906c8630e27ba41c229958b483d50cc531ef0237c87a55a9d769a597418e400fe7c81dfe96748cf90d5cdfefc591b5bed321c82dd8f6c94869442e7260849941b52af5e5ac4666625cc8343c87daa2a732c1b50852b48992bd7283254ef9f7dd5a4f0a18a053cb29b08db9d02e584c2c33b99961a400c65060770c2dfc7bc29c382e0ac90be7239c37c83d8fd1e5daae09b77ac622939c57cadf356a4f45153199415326eb9ee26c6e6f51cdb7c701fc5018c7c45b12e12b6ea5ef5741e2fd10c82e1f2774e5fbfa303db9228fc1d928cea3c8c77801ff24c271e15a762054842cf5dd623d60b12b0ac9fc7874fa5256fba58ca398e991cecbc74ce8dffb123798772bd14ea427f009ec59ac33cef4d999dca50aa4bd54e8750f54ede3998108a782958c53e99a983596c1ba753bf419ef110f23bf79f289ba54747dc86c8e14e9f06d38d1dd72b70810e25ff2ce136b50bf2890d290ac7af7469b088a68e51c513d6462b2590624217886a685f14bd36aa4ba11d4d0e06ea6b678c27f68fc9d2002f4b9dcd7db065586e4530408b31f09d131204891c3fde482221f385aae35e908f9f1ee501ae162c8c8d0dfe358f3a39d3d922ea54782a028522b6821a7dc76df48c009ed8332c3f9bb799e922679129d851070dbed3f654ed4ba2f8b8066343a6cb207767d8e02d4a90afa9735885ff4f6952c49fb3876ae6306ca50b1ded14dd89ef58aac8412441e94beaecad23704aab68103d2c4c8ee296e33374822668b892b976e9ac62c8dcaf51b06c7f4c29279546df784f527c22a3dd461792269d5c8f7a17ed6e4fa9ed2af9ec15c81d7e3025a178874b121f1e97a6432a63b1301c33bdbf5f965c09d0aed4c3d56e19f61cadc9f1ba395a7b9e3fdf4e0e53639064a8cc017943e84e6d0ef19b7d2288d0df6f64fbd048f0ed13e4e1e5a13169c6f34c15c9239ed6527a1ad2f4b0d898bd8e503ecfbe3ae6abd18684b679594b075b1bdc44b9c4d8845489d010cc7ff8d60262dc210be76d5a2ed192e04859e30a41d0acb4dc488d4456b16fd06a7591ee15ee862ed9c577a2d2e9ecad9d5c836b69440a484ea556c644ff5bef8175c4f067d6601ae00dfa7e2d36d22626608e841e2f9731cc7616b6cd143add933d793efa8873766757407ec74714ef507e50e82464d8c3332dd699526ea11283165f35c87828c2a7d7b8d515de78a281231138740c300bb7a289dc8ef1573a66166877efaae5bdd5b4e4bd23adc2d3071ba9a9792db486b15b2a3f29eb3e4284272829d24b742cc448aa6b60109fa087cc470d71a8d1fe760b3d5d0158c1176718f4f35826461b5491c5609521d1a6320f6693a7fa60dc37bd99705f00e16bea46b063d73abae6975de91d3d49f57cd50eb9329779fda176e75ee74bb5f4c8bab2a25a1c630019d453b1a5c556552e34283b98c9ab295356304bbe4cb97c0de7281828944f06653fecdbdabb21d7e82cec5501cc3239c20e31e258846d09286195969a71bfe0605e172de10aa4dac9c27fdaba4b1128b6080b39520d04fc12da43a0c49ba22b2b221cee21f1ba2bb417935b9bf1b9e7cf297d4692a91ed633adc46549d06c93959d621cd2c6f9d17b32d124b16042ad079ce27a10de7fee524bb80bd904ed8d24bc015f952299ae5e61714de645573f20763fe08ecad1ced315300a39a4e0f1efe216964347a20792390a31f0d9029019346b68b40fcaa35bea6a82eaa21f6075bab80890cf8d400e4b7f5042b2526b58083a94131758adde0cc658ac8b091c18378d81a4ffc56ca5a040c2df74763b7f3847b5ee69d89291710fed33a0a28378381691d6e51fe4aed0ec5e293731a15141d8bc8a8bfe069c5e248c849a340a7f348814b3f3d8cef33174c6b89c1d01789b825e672033474ef380b9688172e282f70186c1b704b40efba1a588fa684a812d891e83398690c0aa2a2a533c77db44c4678537d77612a1a56421fb7e69898605c51c1170112e2b541d275db11a1ce3af90775c95f0729ea791e23e3259b4ebb81aa876e90755b956f22a78e2e7fe8e6acc275aac7c9c251c0cd4d8057061c8c88c9a03493f5c28e80e91a57b11b77cffcd2d4b89b145cf8ca15752a5a2648388a92cbe2083823825101220815a6a9ce5cdcf15e9dcfccd18010213b228c46c01a72f2cc62a58447b40a5a65b5465a2bd6af3e2fe5427322296874fd6e7aded1210c28c72a505a23c6b11ca1e63e79910c5a86ec8c4258463d61868e758ece0b8d392903455e52821c2eb33a1b26728c6e1dcc0d0751f3ff1fc1585792b159e4f164c7c3724ffe547f24e920917758ae503a1a2535c3c939df55aa2412435cd56a7993ee0f79b0b85e86e9458f331c5a919c48f5efdb7548e2aea6c09a67334fefebde102bcf2e17ab8b8e063201de840dc91f3bc70c9ad166a29e544499fea3229253f44f09af95771001e68aef4456031c031288b46a6dea0310dea586951af28aece5ba70667070256128b219a4417746d550e52a09d125f1220de0fbf14c6b72c31da6bc48662c2089ca193d50feda734239abfbf028f9541c1e392fb516895ec43701401034184dcadf9c972366cbd9f00298dfcd03255103a96f3d769493551082ce5e4ee190b4f1c4fe0fccda07c54cbf0cf4e2fb57191358ddcf09a39e3599db2401e43074cee9cc312db3060c50b65e12bd1558d2fc0459241139cc951d92b4bcf9119c4dd0676bec2f720ba6c7f4dcc586c425250c2149e82528ab2139a4fcb67f09b7e8406a3dda7bf89e28117f486c9381ba640d133190bef62c236a2b212049dc569ecea9a7c18ff600eee857eb637173984c962678c660028035d119349992bfc2fdcad5e6adff068b85230d87875a69220db701b7c70fc9aee8b0454168747c3aee4722c993f62a44a5f81088262c9d1f5d0b88547a43769a5d92c535743d1f9a893b5e85fa649d23edc7227ffe4cc379615cc57fbc041676f8809fe88fe7a69bd86692da91489e80c866a1cafc99eb6724fac5db86ee9f4a6868b58fa9fb09307c63d6267e4586caeddd6bd9fbea9dbf464c4ca7a50f8c83855fef853430b15af87019510c2925464fabe8cbb823a9e9462e30343c44f02247ed064170b59612ab0f9f5b3401b923158fb79a4e72f4cf0f330187fcdc4f099d5f76ca67aa5748140511f0642c4f0c9a8f3457b65bbc7c7c95758cce948fe25f450c4f7ed8b5ad4b130c44445b805a755951d72ef8987879c33222d033231dbe57b9442a723b055cbe8706eaad13b8ae4ea8f2cac5035d5f8d962e4bee97b6b0d4f1dc704ca6a5429b02f68b889e36e78ad57db0679e17e0f9ecce49d6a75f1eaf3de7fd9e0d9cfe2422d1b54eeedd9a323b02218749df3ef5de03c1620f8ff141540ad18640b7a063e06dea00c4fe7b9677e6b78ee8ac0e39eb4cd04aa4c75b115c1bc899bca4cd76b7d2de5a78492045bd8ae4e7f449c2ef464eef27c5a121c11f216ea539f5ab73b253ea70bd38256c2b285bff62d54b1f22e025242f32422ffb8bac209a6fe2b8de523d6e68db5809168453a88bf5c70a63a52db8f95464a7068ec6919c32a2688f48d9b5b091a9cd41e445905362154f8ac50d9543c906757be7968c973a6da85a184740b0a0d598e5295948d1547c303145aa33cd8e0235083e5165bcccfe4faaf55d2902054fcac2580dc58183d5dc80bbd21f7b1cea5d01cded894c0c35f57539713e221c7d37e34ce468a78f0785c41bbd711cf497824868450e1dfaff98a4af9e70b5ad08e446a58f63e1b4e3f510d0ca5a4c9fcf6b0c1a370e641c2a1c8986ad63ac7cc72c8d8114baeb5f1b94af02ca1b7b2289af8bebfb5756fd48186143f0f3ba73908e38995b26c68255086d3b4cc4ddbeefbc0e51c075ac57fb1a4f2d7bc31580f9e3dccc23b9061871ed07a1f3436b775fc826c291cb6fc22a2cb1be8daa52903dc689183f7a4a4148052970498874bf237449d2260688e2f839a4c2e323077cc75d56c2ac0a340d0f49921acf0ea905695dcb44fbac700badf74529ca295dc0f3f18e7688291b3edbe5645213de3dc17263b542b2e807e0acd6a2dc40b5ee2844304f4e9ac71d814c58481999a58a47575de4976d986eac463e0188901a44d4f1769c5983839084fa53c0651c831e8f2871894536ea45081a459e0d92122522e38bcd70453c48bab79fe7137e95e24b6d0c7ba7edf1e2c80f497ee369839eec850574d0aa87ec1c24088d5f7ee6a939fdd94073e6b4bd6b3292ae3c4580fb47ef433c5c6db538d460515b6de41577f5c0690e2027c1f246ae4357a27b7e3f8f0e7b0db4ea3f7c286e9c14849ff13b9273314f494b71b02f9367ed3d72bbec0cbf6d5ec404a554dd323246272e16426db9ae9095c750f6b7a52faec1bd3230190e13575730919837b62640dc27e520cf31eed00080c8d1f4df44c44a84929f0ff94a28d2ad646c642170e617572c6b638e18e9dea2955861ca29dbdc224b6078f60fb393da320d5af75d3764c667fcf8f23c2cb56ff699e751e532e77c5c9a70ddc9ef49f7de620a9e42476bb1b8b47071a128ca442d2a46c258114305d0dd5c9a05dcdbb025df615613ee130af9f615a7741dc6d48a571f982c35b4b2ff45300c2288c91fee834538fcc6331a7d0d8fe0eb48d1ff8910521f3635ef664e72b00ace4d4ae5e7384eb7b84b6ff2fc5a57a2e3a8d196b28c0236520cc84c621a15f4018c8521c4d56a45b30d0836df17ece905a52143155fd872806328da1944f6440273583c0f43cdb1d83a6666dcc73b4842de0916adae873a76a86e2695d3910ffcb16ab58b2b88a98fc35743e479ffee2275c025888bd05a6ab61defdc2e6f68268417a14a4d885340cd198b0cec13e8e869e53301583b7912f5b5c06fea5f3a4cf9e533140a8485b17140c1174301753133da51a86539fe46a1724edd05ce3948385e9b80ecf6eb8e52245958b069161197d5c2a5c6596e3498e55cecc723a9f306ff1d14bbe0c41e1a399d2545ba01548880bfe18309671502671e66c62f1a33c5ab067f650fc9c405c6346636ed89133e03dad7e96330185557e8bce471a871f5ef088ee84b4786157069e284dcbc7a56f6ed4da959737ca4c6e998f11c1212c8ee8b16f5ddfad1170704994a19e64c73def64ae671d3424956814f0192afb7793bb941d867b4bdf4d3f56291b7c29366dfa72d37cd506b4bfff0a984423860ffc87909591ca7fa710def943d891a824170b9802e1b8b4b20f0e658595f8f5f77880e2000923e9a3813b200e0e0d65f5e02fd3ff56adaa0e6e8ca19c7667f2fa546cc6249da1e44fd8a3eeb00682158135abd98c44427112dffc027c8612800b32d95a2f8fa9fa6f072ac7e23b8d270f6533f5e816c0cf0968e77856c4888af9e09634ca0f64fb1d599b63fc4cd9787c62f6863579d642815094dbf24ad9404cdbc339d7cadf6b36988af343def6e9e4f4a00377bdf8228f44d1f00e573fd7eaefe17c12b051a42826d0f5706283b2a93e087567e44a85937a7950c41b02fdddb9954b5c7dedcc48853183f3c7d6ef8a5586e574e2d6791b0d55f420acd2572e0ea96e7a4f7c17529730458665b793a90f6d3d49d0d5b951813ab9a2c359f3c43d7cc3ec1d3157e15825fc26ad6edac6aa499b881637734eba8ce23dc27eed681da6d0c787f89ddfa72b3220228142388eceeff2b7eac9d586dae3b245518bb4b37a14a9e536942718bf29194900ffb3dce973bbebb018c86429840d84556a73504de138500c18414b9f0b1e90bef422f5d11924f846af1b9e89906b1ec10361d68d8b4d6676bb22558ddebc2c87e453ea08967d0d0b5eab812c0d33376bb28ce6780fd1b55bc437efe9019aa22056cfc6ca70021e7b160c344409b2c990aad06850d839098d9e6c759609d90e051dbd895cb1160ffcdb8261925a45088b7a8d6c22580f974573b0c984ab505c697fd8070fa78b536ea65410b9138db98f701d90f6874458e5f97e476194b0680e49a4724f305f013bc1908ba7d7302ed01c3effe395bcb706d2189dfd6ed00fbd2de0dda679032b63bc786b2bcecf12040cb1027c8ff6311b8c5f33025a80b2d9659e032bf2465546aeac3f2fa93ca38093b1b2113b5e1afbc40f0367311cbaafd93847d24d0a00fb431cb854b0a6a7a66e94a6e25b8bfd9eedbac48e2b2e09ef6a94ca33d42b5392953e5d635e2bd952c3d2bfef7757ba011df15f7380cb31b318223b6449006595e23204cb6dd3b16935d272d564df49b2fc4f8ee54596fd06727565ee1570593aa3f9454329d6962e44627fe549bccd296150131d17b7406bff15480ad41acc0d61e9d27b94844c34567a6841a4c7077b9279cc6547591a9b8a3d39a0d69d5872daf280d59fecf9e940d9c7d12e32ec52051046a66e74436b57726fff955e839850024f77c8d193862ca460b74c7688651b873962d00ad3a50d45ce53cdba5f9cabce181de0bb44f574d4a7a99e6ab0771aea3242981f4368d15c131526c9603969a3bb2a777aebe2b05bcde535860fca20835b30079ead7b09d3bf66674fc730f978a40a5461345af20fdb9efb0439302402f16ff7dff49eb69f18e84ea2061fc6b58877a8165a6922a8f6750eee686c618f41facb9a36ac517c84be2f82b36425f80f1a26ffd77d24c109739b63457cd3de2ce89096e04e7e2304e7a3427c5ec841eabf419fdafd22622ae49c832d83a40f27ae7db0485dd6599f6f5c9fcf934fe0871345926f8b614c0cfc6c5e678a2293fb03cfe7416100c81aa56e3a11c9acd5bee81119a3416736f73210e9498031a8db72405f0026c2a09ba4d9e49c9aa8d973aaacd2f4aa0d0b77088d06090a74cef71634f1554269d3157bfda94ff6cfab437e676a2e17576a04e66bf1590cb02a5f0e7f963d7625df4d2a8a7c5a28f5aac40824764c174c5da3205e68d36be0c0afc2b628184f50ffc142952ee56bed54216b16ade1c69d2664d971dc091b993e5ec56beaf17cf0fdb7efb9eb233f8e1e39f1f2a6798400140296ec3c1b4b53b93fa6848c32e9534b0c2d72f91b900679e969d56f396bbbeb2e11d0e7a7217c9b83a86e26d021930ea49d9df907da84380f51cd61801331a55f94fa725f4f906b033865e63674691dec255f8e6ea42bcdc8332c86ce6d5f4c2c2d96e7f8e8e9d2b2335368eb2905e8d4f023b6811321b45905f2339951ed7c2eecd306822e155bd8db9636a8d90af5d82658b2411dbe762a058a767b9b0d21e3ba62761cdb9847e903c7bfc215129a5acffcd5b190f1bae8c245ffbf7318ed3b32fabee93d84055fd59f5d9b604b04339a5eebbb30f308c3a4f2d6653f60a5479a13b2a2f7484381a7bf2848355714c78a370bcbb4c0fc01b622363a66238227b03d0dc408140bb8b6f44149e7527311ae500207dc7b23097adb6d03cc5ee5c7f708140d504bc51438da64cc673731af23470ae7cfc3dbc41a24ccdfcaa43df668a7a1ed68d82b2c48cf68f354ede69978b15895e42dc68d0270e5c20facde2d3104dacbcc051222ffa6b82ec4f29bc299552f2ce322c99ddc788e081880cf94cdab68f0203a5457d5062b0e9112b0cc25b82549f2ab0ff261678005291ebf608b93e83d251fb9e7631074c97b4557f53ca5b1f8d4298cba41cec8099827a6dd5c8f9f1181d90b8e69bd520b462ae6ebfa73e712d4dac070d8211d0be05d6e84ee3e5ab7ada98537a9afd701151e94153134d5f7e76b45431c63a72bfddc84e0c289c2ad1951c400689195cc3a338a4ce901608c0cd8526a5c2973172d715083e896c52df0f6c7419dd4cfff461d6f2cb8d6df9f7423697377df78f84a1ef35c1a01952bac3c1686b36c6041adb74fef5c9ee474d1748ac4d3821eeb33935e3fe3b98a65b42b96561effe8f6e7a7ed8cdd74bdf02faf30a414ebf3c4501a9bf2e375750735ab797e6ca9ce550fcd53eeec930e7c9ded4620c07aeceefd85fce80881677685bceb688bf49bcc61515e6533c8ac534cc616a8734d3f6b572ac1417c0fa0a62fc311592bb143c41f0673ccc6c64a79cc686974e5102bf425212676e85c35e40bec86802ed186fe77b5eeb37a2ab1b87eff8d0e9d7a9d8195006bac7786ba1ec7773f6a90f456f8108499d1d3c0dcf36946314ddec2efde3c248e484fda99cf4b3fa87e87c4493291da8743df52c924c894523b3475855b8b220ac1d1ff3c27e3cec4226f60aa313ae436527c75fad2a1e7dd6f04a121b7c2c681f7c9f70ed7cf19aa413a4e6f02f1f19d9cf972942db5f9aecd56d13f7a6db6648fb35e4f45c6d3c648dfbda35ad6c09ed4db19db578922cfdd08c4126a2ceaac3898546d8b1871182a657f7a42ee86dfb19957b82893e5d14b0946b9d5692ed314e3d53f53f88aa49c793ecd721f0e364b445b88b63ec69af54388e5e56c39a01790c2b39349e0e2fe95d039429db0b0ef5bbe7b11643b61ef887567f5c9caf6d5a5388470900bfb68495016e0ed65c6a0e98a0968a0d65fb95d9d02494db6858eeb7b531464ee5bb8da05624bdc043d00b0dc9bd95f76a2ee68a58d15958ed8a85df73585d96670afd4b7ee23797887b435c736421ea8d6811bfe78bc64ed032fee46fed7c552fb48639a1e1e8eb5dc32e82530911f33d14fd0994b413423443c2d94d7ff13ea78f6f499c01cd6bdbd860090a2bd11334c5e7ce9f8ab35fa560a81256824ef38766796aae0f95c48df135b6fc3572c11faa029546389d5349752304b0c08790764433c24c4e3823d9008dd6468889fa406f01828e81bb4aa6bceb7fc8505b5f7c7520ffc91b08985618fdd816387c431014c950e4448d0de443cd4831502cf2656173bbbb667bc14a037cfd05a88ebd9f31e678e38dda0cdf3838099cd462a9fd17af6be9277c6872f047d07efef66b2ea879b3c989548e0a63e0f7faf3959a39a8ad910b755d2fabb8627a743310a720bf32e37ea4d1d0c8b8609ea7c0fd8e79ed084de7926ce0de3480374de83686439284fd513b84cec232a81754a8f8ea8c1a2f825147213978e5ff3c5ab9fbb725f499c455240900593634c3e421581d2e386738de9d2fdbee9451400feccea51f04275ec6a59a59d73b9336ce8fc61e1c5465dae2e339637ffb6a91641260427b98cde0792e819de2917d9d158904fb3f1769e1858813b2037f5a0cea192deb455ecad19dd65d3e3e6b4f877f1d91fe807aa07b8cb71662bf9bb24f65c6faadacd802f6464549973983637a14fed8a74715e60d9dc3d4d67c778cabf50f0327a2a4bf9e9ae2e5fec6810fead6e9ef4c967352aaf69c76cfaa182177cb89b42549d4d6400a3ad0a89abc51b43f5165e88ce0a04cc62be224d3a408390f14ee3cd0019969c74f30b298b15e146ee81f08477d67d027d6f92802a564297ae6b6484d5d08797776a0aa816927681b2e392b45780f3a5375dec6c493523199081752a54fc973868b8f953d39c6294ee3791ad1d8508fd8b1e31fbd5c32089b9f9561a5602f51ce108c12e5688b4787ab62f094af760bcff2372ee856011eb0651a89ecda4d45c4be221b9bde38d7b49700027bce48c460cb398101b0f47d7139e868cf4243d377b8b4518e62a04d9b7548f9f0f938ada9793687ad7cb66d896b68c0907e128623525a8bd68e7059a136f8d2ec7122e65de0d1ad11ed93ae8f76fc70a351237ebcd3d4df3e055d4bb4c4b52d3db5c891540bbabf8e695ef4eb0e113f10fe2b276d32a6cddf16c70fbedcc860e66010d10faf5c5309eaa92c1643c9e21cdf8aeb750566c2b106b382535e9b4f7236ca06ca20eb1c0c415da7df7ca7c6e2346308fe0573002cade0e7b49faa157d9c271ac76816434d32ba6686e516d1366d11e88f03fab9a8210fe11275080fadb8f30dd44149b1663af3d2931fed191b00bec84c4e0ed4d2cf082f075bac830115e9e8c17f7f88260766fb37b839729be6a277fc3203ca8672543dea7484dcf06f8287bdaf5d7a1aa87eb8e1ebe140eadd8df2e2911cd10186213d3acc5c1692a352323037d2889c882d814b010162e095cdc069661a20a5a297229f715749c60b82c9ddd94d381a281a2a2a1621cc083e829ff2798d9ebcb23d99fe197e59be675f369582130bd7a878202100ac20e6d0a7076e80102d42cddac635f3924d03da009091f96bb27fd0dd19b675731a690f6b9a275228d145cba9bffc3bac6674635e0d9b016b8b062dec647dbc0a8340785b720ad03a435e6b0e25b8d445ff0c8ff5d815d5c7ff7de261ac8bbda01e0d83a837f02e8bb25bca6b7c6bd061d20c208b448474c4addc1983312fafe5c32d10b6696acf51bad3a0c3acfc78b289f5268e5668f35b8b6fb9459b951d2343b3b67276cfa3e2b1baa5304b51713162044deb617be95bbad2fb54465e1857f227efa74f4bd529635c2f590ebe0deb10528870d1267dfcaca2477adeff0b734fc2a139383cfe3ab7e94ab04e54036d11f1c532e09888d73f29c1c46ab20c319823614024d377544cebc075d737540beecfc30f77ead54a5e7c9c833f651934eb24aa9037661418f9c074e5bb803f105c5577dc5db00b22023a57334bba66535dac6016529018ae030b2bd9a72ab5d37982dc6e79653a4b3b82b20a08155c268f307c4a7b0b9e91cdd26d61d242f0a02ae68a953c71d0ae662f1301eda8b05873782b1b6ba8ede59160d2b38cdc74639187449f4ebfd936ca32b11b693b4cdcb0358f29b891c206a52e94f3f18d749dd7c555f4c084c1bb888aaae6e15d7428395b91bb9825f45310a0408a43807e5a040187f1c92954464c6118aa557148c2086f2c23f822172ec8ab852821ff726cd3316db3bf25326d547666ba151fd09e147b15311bd49111233ecc0966a4165db0c46d841f61f40438af241daa80905f42fa7b044d1188e62bb81250445a41e4d880e1f8b077c3537a054ded8f5b09671c1eb88c9ba61fa6df4fe24e63c80e5cb33cc08e923163f66bc7c45ae200636e19e8aec4e1645bfd5b8a7910f2b5610c35896e65b822f93eb79161868077fc2fd3cafbf1415682243e2f8ea905dec1d53e31a300128a1a467768345049c6b0d474d460a2e1ac1474000a9cb2327b3259266f8bb508d5dfee44feb1b285c0858f8bffb703e35d2d2a75f5ad20cffbc952b93c9e8d77ac4ad742215e5263c83a3df0050cd379743a8db93f1c6335e1dc63241e7e7faf1e3b1f10f3a611d43b9958511e29997265565a2b5ebba6a118e71f059978ab4685fe3ee8bd941e5e2b0f65c6764cc2915eba4fbaefab9bec7172414e29673d7293d41e8f94293a90de0a7bb7f0142c4b34cdf7f69b50ef175f65bb0527b356e46daaf18b4239a70d7bb572b3fe60a815ec888a6593a12550f3a8da6c5a6b9504381b220c40e051bdfda7ccca63fd3dc126141315cbb23e5b3990687812dc76e8a682e4ab8600c453e2b4596f0decd92f97ec24ea0a2473eb2e3d29e6e62c734a278682f54c7188cd4d2a4087ddb8c9f1c88677f0dcf5dfd9f1114ab440dab4dbd02a561f511f94324c64206a55ea83ab6e20b05ce66eaae89aa89c2dba92aa1252b2489f022820a948bca04313cbd3b2066b56e3b74991d02a6667620d04fb0a2e8cc3053fb45278d7b155d6d25272ca1e1c048b896391a556a5beb0872ace2ded7ea110acd2415fb372e58a132149c35b472d1af3585f94db518ee8a4211a3dabc3c9d1ebb628ed89165385414d1592219ee00459c83832439425d5c56c67ef744a9e76b96d02fbca4307ecf6dae1f96324d2ab17f4ad9f72bd4289ec623a70073a612b9f1980aa59508ed08bbef9b07a24a744888e47c2c91b89a35f9bc41515a65869eaa9834e7bd02ae173008586d5cb03a29b8687263810af2da3f22a865b729ce42bd8d4eb4a58c0b0f9a3704cded78010898dc3ebb98ae2e9368a4773449b8c4ecd0683b3eb0c841e695aba70019965b8a46dfeba64f401720c1c28b93d032c882ab46d19536c40719f8c2c9966476a46e7e0e081d4ae8a5fbc0c6b088d35c320a6e2a3d5d0b52aa5935c2e77793b4b4326c73609ffc2de7ac9965efbf7321fcd56cd7da12e3af2a3bfe98d1ce7588caa96cd4265c1c9e5a547f94802a24f6f6277b906a364c529ca11d9b4e2e5916f87e6be721750e638a23bf6b0980528ccfa2cf0b0612a59ec3385f6f464d103d91ac8b516531e8eafb262d8946bd58a79af6f36d7d2c62bea11db905fa2470c5e5b0a30661c73d629761b7d2dabb1515c61d00ede0cdfa1efc3ff0ae1976ee23efdacc0f4bebdfea2e6214840a7d90fbd6fc5eacb474f2eb71180a2b3d9c5c8405c62b57c6778ee7497e74cfc514afe82c6a8037123a6cf9ef885c5f6241aceb646a69f3b8685b418228f2382fb580a67f0685ca1179decb1afdf8839f77b56165b385e40c24033312c914a27b365e8eb5299ee86b29262ba154bb51f61cafb06a77fdf6f67d44b9df3d63ef1c16a90598881ec5780de659768df2575b6cf499394e349a7ab6c89c23f91fca7174042f489969436fc7a6a486dcad7d010b2b6926d66798842dbb12ff74985593d04060f65aaa847b3fde62a893651c52bf532bd42bc4bc8586b1f6f57373db4973ec92ac7593612768784eaede420f1d7a10e038352e950f727fbc34df22b3318b69a36ff77b7dff2bfa4bce0f0f8cb70d9bb226acd103ee1ed40607c5f1c2ac2626736347f3e19f2c6f88dcae325b998189b6a3034fdffdeb92fc94c30a41cfe0913b9b4cd223aed55121661887b6f81f75fa03ef6d662e031e7de5952b9bec1d5b54a612cbcc9d30d9ea01878f1a0a1b88d7bccb3416f400b1e16c4f8dd356813664ae0c14a454c6c41697a4349810ba89e0c4f1c16e20b15b229cc5ffced28256471299d43740471be8007801a518969de0156ef0a4b02349bb5428e4d15c8d75c37fca3b37ec636977a52e1b6a9071c9ec611895b748e203b8d04aee3f02e4c8e25e49af60565968d2fef5206b291b46d096ee8b87a7de26410d6c8ef15ab142712246ed47bd0dd16e88944a23aa480b26b6d84c43b5a58e2628b37a8406c24a4928d2528c843edb7f70f306104f36b512bca1f57d56f7416ffb642f80a7e73db0f19c38a9e52d7c349f5012f024b88dd29e1d739d3fcc5fdb85339dc5bc24cbc9f84646ed6e86b8a2b97e7d84ff085ee6ff60e15b5d85f44930fe43f2f9f3f483089ac7d89f8494072962d5f71851ab019bd678eaa1f3760af050c268e510fd152cf9d8168fb0bf9415f84362932f6aa7066eced27535c6aac149c35f1e6a920c6111e64a3ad854ed9f5401190bd9ef29ab6975139e7aa10cdd9d76c9af9bb5077620ba8d1a1a7470c0996f596ac6164004619445e9869b77b485c32188a918cae47177295a717e80ff0c2229713211352d163c08f23014b2a078b149ec3573c05011745dcbbede69ea7af389ee7c6a44763828ac3fafcc8ee2f3862516c0009d33a093881a2ad4698f4c78d6d2230764161e53091fa57cc78ade606802c2417c4befe9821b03e5ae55da657c13f463f200314346ad8f09b3376a821be1f42d6980f3c77d8127d31580c428257c3692a7a20bf0f7b51efdaf0617bd4e260646f7dcd78e4f3610b4110fb529350ac6b807184414029985a95ffc52a78e6014554da8324d0c9e1bad8678a4473ec734eb0e83cc85ab25470084cb46756b0ec3b20bf0920024f8def5cb81b402c17407678215c8cc65de042599bc4f7a428aba6e848f03f29493a81bd9a0000289418c4f61eed48414f2e590b84e9490e75bb139a3720de104fa50e979b7664be282bf97b98b4b450ae608b9beb1dc4084ccb2a45379fbe2a392bb1b2b8e27d24ad196116006a8990fc261835a96e33b4fc0f568ecf391da586e5843d15de7d2a8c46fa5d775ecd179619e68a119aa8ef899b7d4862a30ecee2833921b47a7dbc4d82ac9f5537ebabe4fd97f827aa4a719b9c1eb081bbda1dd2615670651ddcddf805624e9ad21af152a7fac0cf7ca8770ea9be7edc83b2685581bbf42762b82169dad32c25b22f876ed036461acd23ad19a0e44d604fb3dd4c3f9071a219af9d03e7476ac473f89efbf3c6881ac65bfde430d251dae088ce2794932c7512cdc6072a45c0f88be8d65e4f03fd1068aec290b05effa38e12cc23a56322f55e901192851b1f43dd4b1f25498fa80bc121896908082be096145c495027c8d65ab79b920dfb06a50175a6066c660a25460d18f96b4d4e506ab8f83f5030654c1bc3aabf67f46424923aac1a60d19a86ed4ad432e380d21af2aa120223708910b307e92be48d1d150f15dabe3de78bebbc9c92169ee1f4459e77987e8270e4ad90935650c9e18a01eb5b6dee2416415f26cf5a62c3123c4af2589cc6d9ba23907d0265d771b6408c515452e71894ad906e9fc32f702c437374cba687c0aa4526326226e8b783b4f5fb735880a4802c23bcf0e1bf66f2557f12cf9e6edba500b6cf0833c855e8b669052d382b2ced3ce698b53a6476878d5fb5e868f27cbb6a509464da7023699d72c091f80d32ffa475cc6cc7791293d16f9201c57323ebf671d68ae4943cf79921caea7cade607d1a04cff152df2082de7694fd704e2612544f84a5aae3ba5ea43af36b25b6d60f0c9a671fa6d513e0be1a14b12be0488cd2a57dc2181916286dfe93fd641c752b9c9c4b65d10f39065ec3762af099bf1c5e7a27e05c8215a9c95695a1596636b39321fe68128d1635960d354df1f86bc8749287f0a61ac458af7bbdd3f4d03adeefb226dac4ccb0f400065fd8b74ee88715dd0686b89c686ee10f10a6bcb509e6a0f6c8285c23b6bcb166970cd6e707eb988360dd72607b9d15a45ec2a44dd03e28b0db1f1a207e028aa7fc80376920e3c49ca245a07fb1b33552038ed40090ae622a933c60916dfa51f1c7862630b76a29693944839d324c52ec074506ef8288c11211321a0e4614d39edd5dd7e82a568c5b79d59e85e3ad59832abef4e3e46974636ac7098ec49626041d1ee384f0d29a72a5e96e1b3fd8025a02339669ef0357decedf13400a3cd0af3f937aeab230c73a1f2fa409bc87a8caa6dea20259edea81877c350ef0f20661dff4ffc10c4c1379a6210fecdc7b45f1b456ea63720978a0a6062e44a97e66dd850c5a36815bffb083b8a77cbe572cc466f31ffbe6bbbdde8a6403bbf2d261b7802fc5405fdde21b19a3ea60a4b14383e068169653d2d09aabaacf192f259894cc2a797af6b928d8a3a626edf5578cb7f7cc5f6834816643ede862f2ff296794687768edbbc5870381df081f102e65a37f7480300815f06e8685b6fafc188634a88b0019ef572d351f82a655becfd0100da5c4b49f5df9b7d415c2cafc114255219585c8e462014e18342734396642fb6179ac5b0df4be49f2b5def1b502b354ceadbbc4190416c3161e5092787cc84eed4bd894822e74568d092cc9477d802aa206fdf6775263586ac80d553518100df07b6c57e1b241709da65afdcc7f99e7cc9c5ab4482e0123e2e1088ef9bb3b2973d29a16ba0adb70dc65a7de0dd0d735d3c656efacba83ef3006ed108370c499241ea3cdc00c2b93e63e5000767f7bc803a8c5c68068f02eccf16742e5f56b25025332a639e04d0a2048e18cbe146a7535ce9c9fdb48d8034e857be080737e1014a50309b5b85174736a2750c3ab5fe97e64d8009219c134d587df3d77181d6e0dac4d67c7d70dcb5262f9a0d702c002cdb8e698f91e4638d3424a81c625b6b39a5164d487d9758b2ca5075285942205ddf00b93e250d1cfc951b579eb591b3695c2ad7d74a0e80ece92d3db9e8954a393949b4356fb307d02af0f711622ab37b3a09329ad5fb9111fe84ba7cdae104d401a78134af9d5c0995c8182b0ee6692b1278d398259257eeba0758b487376f56fc3ed3b4b19491ccd45f3ca39e79414a0a69965a38b7e0f98ef5f656c69ce92bc800d7dab7b29971adba085c15f80f4eb801851365d601ab8faf2f2be33a2eb6b02d52a632797eceb01a863f335f217849c80964962e2f12cfd400222287a4ba98eb0e2ec919b19a3f4f668282131cadaa2a82f0bac1751a09fbbfb7e83dd940e932b0368e8421c7e4069a4759df359858d5fd5ce0107d331c06c1c3441cd0264073be21cd1f995dd8cf0c190d69f32746fe1a68398a88541ba1de2bc71ab3a2fad5fd3c28f4b4484068bb45f8c7be2f61d1671b9968b2fe03ef195fd219d891f89e51b1c785c3862d568bf19d5e46df0058326f01fe97fc736b639bb1b6a9053857ddab8d0608e7e20c2064452571846827e4a77d3586de17d89876b1976d5d328242967bd110a0b2342b453d64db85253ccca562a603e2ebab1cb781bbde441e1e3d3b23a19148486f94e9cfa786623d0a30c49baf8932d244287d31e125f69f500ae80439562062081bb16e02cffcc9d3c30f766146c22d9f4f106cf50b1297b3271b2a886b4e31e0da8f76d1baa3ce0bd4f1dcbcdc59a81039885398eb9d76e0e677a0021e7df3cd70adf57ca06cfd78b35fe2ccab1becf37c12b5d44ab2b751cc1d0560e7e0812960406529e340884da26d2f8d84ada410c34281c2186ac8a110b603ac42895edae01c3576910459a95b60d4c7b46113041eb3a3e68849eabf75c72ef384ca766a1610603f773368ad5cb19d2a0080c4297209268a24e77d9ae5022fa178036830b57474305f30a70ad854f7eed013743b2430bad7158640dcf8fe625f976b66bae118242ab70fe56cfdfc0513441a144f5fda125419881955bef5e96bf29e6a8e88883eb7c84bbe9c0d29691514afd93213d14aff18363a05c8e46fce73f47cedf174d276bcdf9e343bac213b4ca3738bc01b36054b1dbeed154c46f8580742e3a463d180fe79ac7c36bfbf9264ea7127bda6b319854c0bc6404decc40d7a8079b2fe4491b69dbe75c7a0048295272f18e8c035cbb5a780539f73f214dc07b8afccbb68e89c9648865aee048420bcd9256700a8c0ffa23afef661281caedf7f4244fad1e60618992801d200b222307c02b17116a41882aabc71959ab4178abb4900443dc0c133dfa43c43cee0664612df23d3a54929a780830e0af2c2efae20a097167ac12561c7a3c7a226bfb7d068bfd88c1109384ef83dbdf9fc4f4824f13a68f101f7fd9102a61702bd4ad99224e0c5c397bb5767e891044d76647769b77512e5e28c6c0770ce3eaef4e6ea9c2916d02caf82ff2a6398c327dbbd519ccc1403f75e721266c4ffa14a93d93b6bb064bf53c1f24bb51328f046f1ca3404229a12fbb0210dcb37b374608ede7ce272aa687e71a47991dce23f60e040e1a8e86bb596d40edebb9e7d3d930dcc37c6f5ecab19d82999a2b580ad072c282ee51e4258ec5aaa8b6911e4d1239bcce4ebdc65e56e70703c85749456ab61b02a276db749d907cb5cbf547b8b9df00d1c2f5fdbbd7d1883c1d79297bec550beffed378729c059d783242b118e1b00dbb2c31ca6d1a4e8286efb59b554829c1772b27b1e6335b42175486af92b97b3322460f8ff75d3979ab8ffdb8829bb5fe4a84c1d9f611c3faf4011ad6ed630750489a3cf17dee3643c422075bd8a304775f4486d88e62883f9f7fc740550a13f6fc4597d6de0d2faf040eade66649acb68bd1c24062a45c78821df8759f924fd428f22db95d0d475b6415953939848191ca3d928855a1d3444d9f0fcd4d3b0fe1265565108b7136c91debbc0b8c34fef8cad3bed899485380fc55991adb31f272be06f4556617a032f3a8eb4828b0e86989012ea3002b36c1562822ded8ced4a91eec6c8d1e80b21241e8f6de141b2c7419987e85d5cdeffe4171462ce827e10c84662283fd5e2872fb33d1d967f169d98ea7eb9a0b63199b692d412471e0f9dc0a30b3305ba6e94c5fc01357250ef2bb9427fcb719f6b4c5ab463996540b596504c8ede3899698b32c06f848ae17c7b82da88ba915527d29594767e08442fc25874f9c21296869498330619ffc1d948fc060513a162c46f4238f60ba343342edc608d92473b52569b6ba75e34038c926a92cc46cdef91db8b8bd9e35aaf9945664a9792dfef9bea69011392ebee119c8dede5f4736b83ddc24e8d0fac291bf9bc57a79812edb44f0ed70775be212de2aa2a966e2163296151a0ab5d2f052661ebe846239b8769cd7ed0727af63efb619debb0c5a86d4010dff2a61b11911768c132f7285686bc8dc961946774fe92c9e082cc04353b961592d891194d32ae29e08e6a1293665e85c0f2f719740f54df025d2ab46c346d5d98db846c9e1f262cecfcea2e5138831c42669d4e77a1eb09547045d2da81d4fe48c73b0a565a03e980c5c3477dd8f9f01120c25b611a5fb47f8e81303fc662d4a18c92c5054f64cade6038f82d5d5b4588428443d1264f3b3a9db1991653c2322e6199f241e5fbf1e9e3290c871d16535be3ad3f32ea5e0e4853a7b8abbb0d7718ebd2947503da0c7f3bb6193886cd4cda0c197070aa10bd2221ac68edbfd843c9182e47cb53a48181a4978037935bb7bd656988012de2f6a447f4f993c1c5dae449983dbb3775aa2eff174b5c3cf64fc4745329ed7a13725223ab85df23b136385b1dfb0c3dfb18a7c3e3c9bc73a2e64dd83c88d388fdbf674cfc315dc4a5517dd42d14230d624c759c20f72614eb403f754831c03bd13462698503de338cafff8fb7a0f6994935ef6f78cb16a3b159798cf6540970c9e14a1c110b5b2c4cd49a8b54a700d73a83f00d56f0a92cdd01ae4e6cacc520286a893c0d98e42c8c094eda002b4d5bae3d71200d4e2c1566857e4b031d52d9ab88a5a1abfc738460ac48b6a84a5ed6b8c6845ac47c04da1c03d7f3297c6603824fcaff6cd38d7ca2260438398800705232f211d0e63fdc8bdc08c04c442d7ca65e93044d7d19c4c495d96730cd263c82ad5810c49f7217cf707021b04450445fac44d73f5dabfa1936eba5963d32444e41b09591718834ea810d40460161939941782a004df83ab58537b8cc30a5d25263c6dd49288489874c3466bd3a63b3dacd8325a8feaf08380ff5b5fb91fc69d4e34c87b873479c32405c9e5add7384020ee33ca5d214db9d5d316b85f7f0de99d6dd59f16a83045c5d31ad7505fbc15784da7a946ec3203a46a90c214754d9478e70294756eb8be9d7f43aadaa00f494a0b7c09853796fbae6980e9904cc6b371ead79e09d22f54585150e2e4de9966ce0402a01869aae90a54f5409bac36b5f04e6aa8962d5680257883a5c3f2cb79d980c4c9f646a09c05f2df8160b2468e2ea2c7b1891c0fa11d612ec339615ddf5b1b0a5ff27f17c98051ee75ab19b5210d1deb02db70573f9c4fb21be813767e1538e22288e21dbe5355b92144b0669c260fca5e867ff31d14aaa2f15d9478068cba8a1fb934e82a0f0392ba702a0494977c681ffe0070ae317f9132f5a4d66818d9a60bbed3209fca10a882dc54a6c623c75e33bb7d2f5994a38e782f612c17482dd669c26cd2f3503a94095407e020e771e125796ec07be4c66927f1d4863d542cc9d7cff5f10c3b0e4e20144611a87e15bcaff67fac69ff6d173bf5a7e3da7fee73a0acc87d90927b61a5066f362ae1bc6f4b8ed1fd56111480d5dbb00a89b57edd6f0bf1f82e7996fa4d037e64494d9a170716fa199110050115d8b8ba4002680f6989aadef9c8e4b908b81f4b8f8d27a4647c208119e42873928e75e0828ef878a63accf42b966871281a4c2eacb01567aa8ba2b39e3130a2925514ee40a6dcf659b4e7dea79d4b3f1c73a3830e690424fcc2cbd1274262b569502a8f1db501361a959b8f687cd2587a3f79c072b7af7d70ff8a33e432143cb48e8b4c8cc4564c1822a4f77750f2cdacb0e16d6e32e4370b1a1638575373db44a98670a885cb9fc2279e40a86d89e505036bc950c8577f26bf831eb0854fab988de76d44c221d49101ed946e412a1ebbb166c0a02288bb9e8233d0b232acbfc3253198ee0a9096c4ddb8ec5217b060c7e4b559762815d4222c435e25e4e0d126080593af1229e3493db5112fb44d0352c4869c2524bfe5d2bb77d82b8c3a31e107027870f428c5ad09f88da16baaa6a46837a80313f9fd334d291710a30f5398340db6cf71b949400089b90ad892fa05dd601e6b6901553d341f37c8232982d3c5f1b0727e8c4a72a6d3b5960bc2e35a7c5576e05eae19345a68df29dcafe0747f36e4d6e7fc7ee73043df21da6bacf908fe72681f86e81b9a0bc7878bfcf3de804aac6b5e8959c87f327a46b513ef633d4a5070ca221151ef118019ce03e10767ee2fc385e75a830153adc0b29f685da8688b5244fd09ed6994ddc64be7cf9b9867b0aaa88b88797b2f064a510fb63e983008ff3913636fdeda18adf9be0c8aeb7182cb749b0ed59ae4bac29779f4350fa7c6065ce35fb950afdf334584c1c409bb8abd708f0ab2ee65e6792f182c43cf22fb0044cbe86dece4cc28348bda35cb96098cd135a9217772c11e04f538fffb253f77520d812e753b4d862f2001679e9bac034215dad532be0dab578ae1c29369fb246705b2765133f7d14d9ae82f5e62e45cbacacc22c00447f98b81a73e0802efb96ec31c10d988290a7651c7a912aaa4464ddf75c7e149622e2f61e11b216ffaeb2534ab674f9685880ea3f0b30acb420f31c9378302fc6e13b0912b5d92d6e1a5d46bf7eba01661c3406ff4fa9d631e73df184453c60a5f5d3f42e7b7bbf05ebdf84bf3fb9bba87d2eca34b0a8ed91524c9a44a7a59fd3da59529c23b405bb6bb91c41354740203c3ae0fbb7091090e913686ecb3e12214d9eaaac0a2e2e2a692dd8d1e9a2890d26534f5bfe4ab190c6a818bd7a514323249657b4a5f675c4bbf29cb437c1f34a4d4d008684bbb9f45830305362d05ecb2b3fa56a6b61a8649ae7df05ffab0ef9908cd53d54f33f8ef141880751af10888bb782550e162f9c892c7826b1709b5c8f82b59cddc6a0df89346345aadba4ebf291f61e20a62d326ff22f76de17b08f3a20c9cbe38f7d0d080efee4fc05074601e278db09c3a42273e44e6c458519f386fca2e24279823a40a183ffc12ab61cc91259f5bd7d9111e69d77282b0293e1aedca9e24f2a9dac227e52c49823f2a6874164ab489ef24b3a762e88f9ccf47a59b09737b71e4031092634b2a083f49feeb85d73f9251b6293988a12bec48cc7b912472f9b00628fd40b2f4e2a35ba4406e3958ec6999dbad17740aa918f03ffc922e2d780e4e22631e656672d8008d0d34d14ab5a7db2ca367844c8035f2b856a07e0ffd67ac0ca32e10afe74c6ee1903f511a581f0f9f94f13eb0a9b778ed47ab97362180bcbdcd882a87d30e164308cae82fcfb953e73e3748d9d4622a229e5d8f627790e021cd9d413760a77bf9372a5190410bfe7aebcf43f2c0aa1583359222e8d470e784290e25b75268deb5ceac9d098d46b399f5cfb1c0fdb421bac2d121ddea38a7988500d3dbdbec6f0805ac85b429f51125664d4333ae1f252cae9164438231016e6128e20beaee1e0b780819da8a410ee456526aa3422a3d8ec3c318adaad50882951ea48c5c9afced15a99a50024b8939a34cbe09a674a159dcc3f00157033e09a0a15f786a32fc63a0d3aed53677c2ed2532251a1778df5717a4b2a4a93e74c27379c798fec7d96e3a0194686def323dcdb695199af71bc8d26dfa00d8e16fd6e35d00fc4dde4f255a09a6f6eebd781756b34982d7a2454b1a81972550ab67a89fb7ba804540da22180ef4c13aa650ddea1ccf979df9277aadbbe8903840401e1bb86815a54837888bb847853450d80efa68373e2eaaccbd206c3c83d18c8489ae0748aa406671f4c8633670cf837332fa0fc7b1cb32bfa0298f2472708c2b1da1c83e419042c694e388435a5b6b4719c38da1d084fb2cf66198668fd28ded77b9162c6cef92788ad13f6e7233ca75b0b4ba41fe32750f7f05cd282b8e65cbbc51d5f196cb98cbe88db2ce75c11fe677e198f2132339ab844d1170634bb8fccc4e832c40e36804a78c4ac58cf05e5fd8fa14c85472e744bdfc6529a6c4c495c1e4762b06e72404ff38d0b960e6e1e211febf24994fca75fd5bd448d6a33fa318f1855345eb90f27f3e605ab166d7befbc63e6ceea157ae2e70afd078b5e903e7dcfb52182631d1b069ea255c8403b05f6ebfc0bd2315b5e2551fcab687e8c2c093214f12ee71e7c21ca040445b5e8e3e9556ba1b5ed5d49fff41aa844ce782cfe3ded80bae4abfc70cf2dcf012e9281d785d81802b7f7ce8a1f4f84e866839e96a1b002384c888029fb79fe463d1a4b3bf414b09f76f3fb4c573cf6d7e97d881bd40d791ce3b653ea807da0cae78947e854b2292db984c42bbd00216ce2270a935a6be8bd63d377e71e3c6eb1bd90f996108606c1bf8e07b5d051e0aecddbcfd2c419a5e6e06c2e8aff994aa8cf35d38f28d309c8ff59c2a375ef43570d10c899024ef55c0094bc4e0e7ecaef2b1f8ddb1d256b59806716ec66e95a5c45e3285a25536a0401f159337e12c75e7e542c90e08f6352b53564537ce80139d8f975dcdb3557acf60304e0978b1c49f61596b23f30609dbafe764928559cf914fe1df68bb1e27789bcbca64f2c19128f0897764929e1824aa5ec1dcd6baaab500f3e61bcc723a20f47b53990e9de7dda2d32654fa10cdee710cfcddb96df08e826cebb4f1b6d210ec05089dbcc033579b819b90e777d6efd57d7789860c459b5a95e7971815852fba5222b19c4dbdb326f17023d076c212b2285b0f6889534776c0c9b22bb01370d9378321c08ac082219b7258b3b59a907bce81d54d8c56c6cf67aa32142a3853ca51f4fb95de59031c5db7998e06e68f4bb08d4603009fa3f67209a80cb8ff17a9109fd1bb3cac7f8a10f5506332af402ccab34deda91d773e8a7c1bc0815eb25ce3a786b611787db51829b5eb8b243b037660cb6267fa72a7e0e2cffcb1ed61e4f37ee3129546651f0da97018322b694ccc7f3c48caac14d608badc58bcd5d50e30537c798d864411c69945770d4ca623a403fc455342ea2fd7913b406ce6151572a442dea91505917b6d8aa1477139ba26836876c189f30e7f7a8542e95f9692b723c8c5008f82fb672840cf6f15660d5eac6b652d511b988b75d22bc072c6b662e4e8def5059241d54f90ef114f63c28a4c34620fe1205ea90aff98921899aba0cfc397aa8ab59903720f33f903082cfde8529d5152428f7b0d158ecb5a88a14fb0f9348dc08fb3d5fb8cb68e77906828f59c114c35f32ea132af602f59b807a98a569b4489648ad9ab8d39432ed2c8dd23d179ed18a4ccd7606dfc49b66815bbb44d004cbb108083e9bfc257fa614b4b9bf174b0d66719e466d7db1fcd518ed24a07817175da13b95d61dba7bfe2ae8bc7eb9c676be04cc4323ee582fbaf959b2d3976d33321a8a0de119942c23f5ca882136564a12004596a453af46ff8db315e10d0c0d31f3c438cd61e792287f9a5d872b8d42c81a74c32512f21458bfb2fcc6431e0ab29ce6b96c8dd03d7a767c70484e063744231642803d0479adccc6cb1a8d247d338db605128a9650c0354f6dbe4294c08d61867d6f6d541b5e93e5cf3440df4232d434c94dfc4924dd05b013b06e932a0a5738e3c81c31835b3c7cefc84574efd7f44ccebbef905e946e69d02319b91f912fada3f46df24cce9eb63bda1761fb2ede049731c0f26f256929e9193dc82f3c409c544c5015374193af523694336c1952383d91416579e143786469aaccd060e0390130f9416d5d5e9fefcf35196936d28f82f189e347de54b596ab05e112000c85c4b28a1f005be0ca21a0fff7fcdb00a5aebf7af9d17fdae0d87dda8fbad2092da619a9fc4c1c13c9d5172e82b86608f8e8c8a0c264bc5b6ebac7372cb2082f7bea2c2d9f577bf96978997c25669ba84e578696c93e2e08ed62d3b14883f4e77dca15680dfa5447577a0aae987e5d95334c37fc432a1c196e0cd3e2ca135966c6cd150e2cbf014f6d5980a36a0163e0dd3d8157b155a5722e61066f211eb66d2b6d8ea3fb82c64f0e164c42ec40d945f517a114a8d8acc75d909154aca6b797ec1f7f9c7e8264a0f2cb194fdad5a1fd84a5bf7901a20b656337899af402d33978706593e09832c987892e09472138d46853c910a4e69f08bf0e11fd81c5a3c3271b099c85160168736e27c2612adaa368f8aff23c4487aa65627733042a7fd1c89afd2fb4967618908d7b3e07419ccacaae1765894917a59830a8b6c21a1a7551e0f2b5e29c0d2698ec3aaf3ceabd069573330e7e35d9992ec5578b2d8d0d7430f88dc25923fb0e4b20dbd0adfac0deb62305850fc32b991d107c4cd132c75459798e7803e0231b35193d3b9435b4307025b800b153473c09ba706b9dbc660f1abc42227b24374cd8ee497bb3cb667e68a35e1e130e636a8bd04f74ffc4899c4019af8738681269a4ef7e70f26b7e6c1c0d1b4a92c5b326575bc30bff580943c5ed8a9b249336344a6075995f8584da2a5e0056110ffa596bf1d48431b510160eef825eece201875b9b3e4bcd0fbd3faeda7fbb19dd06293bc8ead05d432c25a8bc1644beb7e8c1fa185f07f8f172b642bc7f3b35773c6422bc721c406d8aebb30b6cdab86f3fe46994b5b258c09eb2d6f441ad7946ee2fa43b20adce6b807031a97941b1f1b76977ea748dbbc0a6cfca7b3c2cd57a29ee8137a0f797120906d68af395b7dd4df0d6d4689f66ae9296b966d9ea1cee4d62227e600bc73629811619889367da81dddd2118effa81b2061a57b8f1539f3fa5134f9ecaf1653444c67200c332f64a124baa85727094de60831289783d998cb60d8aeeea253d705d1ff7cd7bf9f3d9b37db35887359e4079523eef70ad618220b1fb2be97002600d19a899b5921b488d1720717d9a4c2f1ff5b982296a6bff9cfb1248b846e5a38741afea0d9a1334b94c270b1265e8b3392a7c5cf5387014eb3d9a9439ef818180d3cb5cfa32a063851222879b54dad096144d10976f8f53749704f8fc615ad952049b950be11f06466217a2f3035e612dc4fd0333300bee1db01b2bbfb7fb08de55cc37a3c067413264ed61997784ac3844d67c5daec6d8ccbd98c62e5b29164e4ba751c02d62d2ee2b89095d73293e8843d58d2ff6423c909a00a56b9306ac6c58f5226c0607ecca7e736058f4800fa8fb1bcc58661867ca1ff5d897ff00239525eae547704520f0c112fc1c90deca5fd070d74ec22d6c5ef859082f82581a303cea8d3694486d8322193c3921ec4a57d601f260267fb9067e557adbc77526f4202dc5c2e2aad0f0926ecf7ca47ad36122a3713b3e0cb418a8d7f5c57cd62dc9463537ebf32bf9fb4377078a2c7e9b54f4000f42b67ecabcda6ba1b66579126a8e2387ca3878840edd0260363931ce5bcf63a105e4e7ca98969f4672a76a1cc9325c090142b429f8e9b170a1cf0ac1450c99551ed63b29a48953905a9ded680f8c6265c6034de7049bbdffd26137a50eb4e85fc16c5d1e6e07c0f97be7da6e18d2a6ff5475e66feb53e74dcea1fc575ddb8e49f614212ba425fd73a734fc36a669aa1fad223052f232a9f16e81aeb1d4753b658cd85e2e93cd008870cdee912cab174844a44ab98a9321e767b844ca20a2cfac6662660e267e4b1088262bacce3b37db66aaf7f94a0e12971d8eb3635b9f3c03a89a64ce49c903a03c3a1567dd71cb6be4c9b41c11fd9db93e422e303592027f56f6b2e86cb5b7fdd01d3b33cd36c3fccfc79fce947fb05afd25f867c367a04222b7f708023fcdfa6f01cc9a86c0f04e57ce4e23a7821589ba0fbf9f97ec2384a9e4f7f87a454459d4ad1b29dacff28fd7d29c3ed202fbc6799fb99077943220fee02f65f4ea62fc5612fdf51ffd0af367d6a881b14249f8c52df3a343383ffe74d885a6184e1e9f4d772b53a31d884c7d0e9df2f179ad28f5e766b1f010b201dad16399849db7ee080085a492691f8b34fc314a77aa394046f62aabb26e0dbb1147c641b7ff38f0bff47c47ac5ef2847b314ea1cd28107ab046c14a6a6f8172e1ddd3e4e30dd30506d52a4af0a1cf059eab9606739a17794975a3c97d83cdd77508693c485adb8aef239c1a56b26cb6db8caac6f7f37b2d2e3388c8651f6c6c73e8feb1963ec5f116752c90590276c1d0d4479524075796900fa176a633a2b8dbefa1ce2ddd72f6e78b0183fa0832ef631f48e8b8f5e435900fb7fb8f514739998006429df444ed609c2efc576770217be0c3ee1d5a4ef5fa9260f18b5437a58d772fc1f0e673cc5441c4289f26bd4debee1147b4901946bc9e8717e62f2b2333b3c2a5a7270c3688994ec09579a7013b8b1804a442e9ae7b0ed45516fadee5187f8da19636ea731f9c7478b640df28e5b70ffe1aba3d9da4496671c9a3725a5e4c05cb65f36e0869dcf54186555517ed0b8114d8e7c07d092d0038b0af3a3934b5038a685fb05510402939e955bd76b5ae70b2b3f509f747989f603fd14e0e67174a7eba8f6e36bac9e866e3bff7c7eaa71cad5b061e728b14dbdbfd44e2f60e2e318ae082ce19ba73023d72aa73044432a4d608516b8410b2f79632e20ae30a9a0a4b62a408d1209d628ea385e5532c38c6aa4d272ba6e5b36a33c64242424242eac64ba19026174996a5c45a624d41e3d032281d49d3f0bc7ed7631269a5abfbad989a9309ead8f9ee1f072e0162554af2d5c900c936aa947ac28857a5e45229d12b6420aaeea6c4cc502c9fe2e158187587d7b85c2e97cb1546cd18abc6aa856114ab1646cdd0037b59350f2c85fae118cbe34004c135e425b0aca8cdd80e0e92af4e414f224091105563815195dc76a23752f1c776631229ad4a898564e5bd6621495816263ad3c3245e9717d765b9d14e31c4ab5232e286cd1526b8a28857eca61079091d88cb8788c37268198a5bc0319552d4a15c4cb4fdf51ab866208aa1f4022bed8e6df4a94a6e65ccfb35a18e57f188ed237eb76d18e2cf136abb3b69d94ea5f4c27c373e69bbfdc8e49a6c53a52461ec8589d84818334f3ae5326353b22c266aaa64b7589ab5d21d5139d6d138484e1a22e9aa708cbbec8ab0f2dcc832a8479fda59912f493b122fc8443b4304996e4b31c9e93420ce71c78cf2fc05b23ce7afcfed2c73d0e4d7dcb8046621f37c4ac476d844ecfc5421c92d6d24c98df91888137d2ce57f2d276de176851e5be772bd24d327392e8defab55e8aad93b64a7685bfe7b49185572db1d6cd9fe66c1cb7a87ec1c3241851868c0e18723a42d4b636a6ca0da0b0963d523319fecba05baf25a00922f9f3104b310efbbefa084ad93b98691ddaea42d272db8ea279ebecb70850cd8d55f12f6ad40ff8d57da151d81ee93279888df9e93f6c6d972cad91b8b7b576f06c62122f235c442f379c4fb03bd7a4af506a859d4052d67d42b2412c4de97fd40f07bbd8686ac386652f0892e4137369f9393f7c536d442547538d5ec4f1f6c7bb4f57abd5e9ee50701b2f7653dd0e5fab7253c5537cdb4b8a9574fadb2c820f9ea46026af3e29747bb7fb23deb75e3eadbb8117c200df2aa22f690af97cb054ecb483c58c87b136e74b25a200b3dd55e2f19241f44c67a0a7c35524fc9d718622b6481df8aa562791d8bdb286bb264339116d5b1e6db802886f0b10d35444e63e6c8ceefa04a6e79e011e7132b5881135e8fbec2cb3195c646bbb1097df7cd8dc8d6b39b9b1e29c41e5cd7b5ed7aec9eb088b7a5d43d754f4a3d2cb310bd5777687bbba71c33ca773f2bcfb4c8f69824e908d955911f6f4996cf762c9fbaa14f948986b14293f2e28a9ad29634ee40b919c38424add49172bac28b521b0121470623449ad22b2cdf8b12354a430e54d3982c485375d8382d793992465172ce342565b1a3c3130b415ede642866a16f09104bfb345432026d1bab078b8fa912dd92c61d2837639826d2b45247cae90a2f52491aa52107aa694c6769a4291c988d0a2fa0af9b016de6eeee89ee1d944cab6465657799efff580e5fd86c8f4eda3e71c25cd80e5fe86c8f1703962a99a11295a51b774fd67d62e9e994dc746339e9ac0c39b043245d88a49b33f442256d6792ed4e3acf74d279e61684fd49025a7ab6520948596846b5659a659ee3b61791648303529452ba75146906c53aafa3b419c49d688326c2e14497dce8a494524a299d1c06a43a29fe4629a594cadba07d9f9b9e944e96309e21199339ae0383638eb38145ea9bb3674a0a725ba7f2561fc802bf70ced90a9170a72c0639ee36a8702a109be3388ee34419ce194302ee39e59c66a6f783679fe61cc19427231f28f66c44868642568f0d2ace4967d786cea62914a90deda6ef39e99ce2d1846843e57c5f8b0b830b83bb25ed5e205eea799e07522446810a01e84ec11db1cc6a2527a51ca4839dbdd18dc324a0f5c41450a419e3b25061058e81463348b20a40a319f368a09195520a1854b3f08b11231f28f66c44868642568f0d1ae4f512c549f37a74402810412e0cf1321b76b2d7a3b990a8a048ec44916816a6483ea1682344b2dd0041271b5244cfa3ed20821e920d293e06ba4356b2ddcee38f4ee95009e8b6512a670f94522244ba31d19f7d296976ea36594e96f3b652b5ad040307cdc731e2c2cecf3b4c5888caa53c579046761b9b1027978438df89409cb349bb37b1189f8b2cad346f46cfd51864bd41d8fb845aee3f4b5ac972db1c6f107672dce8a465b7f10b65a336b23368caf9ac197376677d721ba536fc206134090b4fbf5556c541c2b6d3d148d8894345b36d8e3f3078978fc1bb1c8110330f84bc378a9e4a9c45b3f631225f2b900ec91711f9a2f7b18578598a9f6c90b01aa5f44ca89c544e7aafcaaa3242bc2c65c38cc9d31944dffd749d0d3824b51719ab4c3d3c597ac45354d2cd035aec35c152914ecd223a3b321c17664e4eb59281bfd38d0de5efbc422a895e920784ea57e438aee366084315dfc671dc6ac5711c37aec083231020f85300f0e143f04c7fdcaf0996db42249c52c771dd83a636679d773a998684cd918e912f7a0547572042414141c917126592b3e6846a63da98a2ea6c671aaabdb0dd92a93b69c628a5928985da1bc522448f858678555bc648d8a552504cb4bd3df178545b24ecdb104554b942bd402229a97b4a26262ad5df682cd467da681c120b3979e1c5c6b43149a5cf0c2a61f75be228c76daf292b4869be6449f3254b4dc304176ea31e1addb2e91a2bbb9b6a6b3abc22de2d694b9a4a9a76e0b0a2baa56e09ca8b6e4c988ea973eae4744ddd155050505050505050524343af175454b7c4715242cd98e789a2cbf5bfeed09c126ac6c44bcf0c134a332082e83c2e609a89b92d45b0b2f51b64e5d82d55db49a8b9a4c35ed9dd755d87c484b41476d8db4169c6136f3fe630f45ef65d3f56189ef52482dd12cfa452ab5bfa74e8584262eaa492845ae26a12d6b158acb358ac8ef52e44d2b1584bbab3ce12c61ab926f992507cc55218daaf5e1922e9e6b0eb464e42754b50dd52b7c48af2f98007ac2c1dd194c6206de13632eae6c237e2a546974d29fbd4a88d8c7afb82529ae4c54e9ddeb2499692627672720ad3484e9fa474a8945419dc78585cc2a9a5ec846218cf7e1cc731333377283e215eeab4596a027a02ce82a90a9892a12dd8b68d632929f9797143c9ca56cbffb45a524a59474a29e55bdcdd341a8d46a379b4a1a1d70b4a8ed18c716ba446f4b3237e69d068348fe6d13c1a929ef116d91e513c73ebd765c5f1f6b7b35aa7ad564f55bd916cf583922fa94475956afca2e40b8a3869494a9f54eb4cad35d2a68fc6443d975e78e618ebe0f7d50fdb57bda78a9559486b4758c17a45578fbb019484c991b1233193a325cd70db26474754d1260f86d58c1b3d9a944793776e28752d3c524a29b9ddcca98bb4eab01f07c54c12f6b364066d1165e7f8338b2c947c45214d0a45c7801e85a24c509e274e28cab4854aa06e06ac93cef6d8b2c11a3383dddd7d069190be304b1b1586d15a5bc1afbe4a9c502faed3102f558d630b6cff02591006ba2cf8ca300ac5af3e08de9bb179f067a2efe0489daa9c2386bfd4692e8961124a5577907c4520b881971594524af02a9554813f22655589508838e83f0f54854ac2835f5531f25f58291b70a44f3ed050bd0b91a8a47ca24e33e6cd566087f25fa77a6c35d22c14e9055050534af6b7a65634f3ab5b22752c2c0c3e6ddbb66ddbb66ddbc6b227c8ec46aeba70cc3b3fdd8d690363e5bb53a619f3c62da91b936c4db254cbd2972ed4686539645285c8e4711cc771dbb6c99944b7cd7b5a196ddbb6b1e8862ed196684b51d3139758e8486d426d524b53cda98dc8d5bed1f56d6c5de9a634fa3344a4eeb03d6cac6c266c481b4dbe64eb48a45c70903c1d2b6b2e3b431a45ab7d627c5f57258c303a36619ca0abd28adaa4b68ded3458e79b0269e096ef0e7824b963b3b111af2737e68db7d619dbad26f9ea4f6ab69a66ec739235db9fd30c97b968522fd3b9f5721937d4cb786ca8b7a148a0dea612817a1b0b04ea6d2d0fa8b7bb38a0de06d3807a3b8a1aea6d3334d4db6918506f63b1807a5b0b05d4db7112506f7381807a9bce01eaed3266a8b7f1c850af8462807a259502d42bb110a05ea925867a659701d42bc108a05e19050cf54a334cea95695ea85762e142bd528b16ea957158a85772b142bd924e00ea95652ca957e251a1de094549bd934a927a271624f54e2d29d43bbba050ef0433ab774661eb9d668ed43bd3847c02edad1364275cde63a21f2e2f32910f26fc8626fcb67a58664209bf384af8d5b183652510fdfa20fafd51594644c22f10127e3d08621909467e858cfc0a1181654662bf4562bf3112581683fd9e00fb058065194c4d915f5eb3846545da10f9e52c6060199137437e19ce0c2c1b3267845fdea206968df08508bf0cc60d2c13618ca15f26c309cb86cc10f2cb6858806542d408e197f34061590852847e7b0a1596091111e4b7af606159102340f8ed23b4b00c84243ef86d2e5d58f6c11241bffd050ccb82c4bc7e1b8a2858f622e3c16f4f6186651e50d1c16fa349c3b20ed400f9ed3558b00c481ba0dfce420b9601bde1e0b7e1c461190773c6dfde820b968d5fd4df06830ecbea18ff6d32ba0c96dd8c1fbf8d46e361d90f3536f8ed3c5058b681141fbf720a1596f920a2c7afbc8285653d8cf8f995476861d94f123c7e25972e2ce3b1c48e5ff9050ccb768871fd4a28a260998b8c8e5f39851996e9a022c7af4493866539d4e0f8956bb060198e363ebf320b2d58e6f3e6c6af8413876537e6d8f8955b70c1321b5ff4fc4a30e8b0ac670cf1579221cb60996846eb57a221f1b0aca506eb57e681c2329694f0774ea1c2b29008f0775ec1c232d088ef771ea185655f12abdfc9a50bcb564ba87ee717302c5389f17e271451b0cc23d3fdce29ccb0aca382fb9d68d2b08cbb9c6ae61a2c58b6b5a1bf330b2d58462fdfccdf09c7ce382c9b7ff29662bc6205de518cd7d5c39b69bce7e10dc5785f3bbc9f18ef9093b798f11ad1e11d66bc5ca3c0db89f1b2530eef26c6cb4f137883192f43e1f05e1a2f4735797f192f4bdd3713e3e5a91bde4b8c97efd8f0f632de3692c05b89f1362d026f108cb79120f0ee32de4e7ac05b69bcade4803797f1f65203de1f186f33d5f04e62bcdd44c37bcb78bbc6803712e36da705bc3d30de7e52c05bcb781b2a01efa4f1761402de478cb7a50ef0eec0787b6a86b711e3ed3b32bcb38c571a19e05dc47825ad006f0e8c572211e08d65bc32298637d278a5d200de57c62b9704f0dec07825130c6f22c62b9b98bcad8c57d65e785719af7472e13dc478e5530b6f2ae395502cbc69e395512bbca78c574a05e02dc478e5d492b794f1ca3b2abc8fc63b8d94bca38c77d292bc3530de8984e40d65bc332985b7d178a7120a2f1aef5c9a3d88f14e26fb0c8c77361d3910e39d35001c03b25fc00223b3d00f9559c887ca2cf4a4029559a8071e2ab3d00e9559c8890e14c801caf6278043931b6c900092ed4720c9f621f08025db7740039a6cbf869aedd3e064fb0c580094ed2b200152b68f8003f41ddb9fc1c8f665a0d9be01906cbf00048861c9f607208026db87a166fb4c9c6cff05175a88b27d165698b2fd00c83bb6bfc4c8f655a0d9be1224db4f9264fb485258b27d14986c7fd664fbb666fb472ab3100064f5845668820e1c25fcf041e401101284081989158901e004126c1fb6464d1adb2f92451b2c6c9f089c375ad8fe902de6c4b1fd11c0f8820bdb17818c31e8d8fe101a669461fb42380fabc1786c3f84295284ae1041c5f6831c610416db07814b125a6cff832f4b74b1fd2028c480b1fdd71464a2b07d0fd05061c6f63b58a3268ded03c9a20d16b60f04e78d16b6cfc11673e2d8fe08c6175cd87e25630c3ab67f34cc28c3f67f749e56a3f1d8fe0653a440b17d1f5788a062fb3d8e30028bedff7049428bedf3f8b24417dbdf01851830b6ef9a824c14b6af030d15666c3fc71a35696c1f47166db0b07d1f386fb4b0fd1b5bcc8963fb36c0f8820bdbef21630c3ab62fa2614619b6df9279a41a128fedb3a6488162fbe11522a8d83e788411586cffe3928416db5f7d59a28bedaba01003c6f6bd29c84461fb1d1a2accd83eb7464d1adbdfb26843e1bcd1c2f6e71643ee9c53e4ce38b6e70a453f04514251532098f8e43ff964bea5644ec96f4b43be0c956c2d93f0e9c842f2df94538e3f49ec9cb365994f12f13c4b29a594a2b764e72513f529a54be6ec46e32c8a3eae1e5ee7796bd0e819b42986145ddc455589d199d7d6f33cef2d7aa3e779694230c77a9ef5c68b03901802371df86eb035817845d1c7d5c3f3bc8e7a51789e774fc23cb0de453cd653c37ae3edb88dba449f28bcb0577c156e2ca709e36483584e13c592f5e6276b4905b641248cbb096017b1df4306cd4fcfe50346bc2f3b5f4333c6cd6614494c4af615c444f2b6ad0c0fd0464646461b730c9f04a51c83bce46bfe96d75ce9396b92098f773c3a1e1d8f8ec7ef6dc7e3f76599d8afca21fef9f17eea156d6bbc380c0d316939f4ca7129608e712864c21b3787a807ba7a6c36bcf8b61f8c8c8ca058fa02e288f3a0d9820c346aa0c61a7966e0a3f44c4ad18cd6cdc0b1fb28e8495813eeabb7eb2c964bbae48e7f0df278e7ca6377fc538d975ad5b472da4eda4e86a763375e15ab88c97e5d1e1b52f14e3c3a3ed911566621d578e5c5775574e29d8726aabbde4475297aa2f7eea2eaaa8baad109f5fed363031fbfe1a3d5dac047ed512fb3b1adffd4cb6d6ccb75b63acea3ba2e9e43256d649985768cd735ca8b52bc0eb1e88ea8ba28feaa2e5e152e5175e7704967a5ca765edffb38442293f05064e5e99d84bf3f3cd96159bf1cb250244727e16f77f09449f8ee54beb3e0188539e876a313d6f8850a7829cff1f03407b30897db5879107c0e6f066d3d4343dcfeedde8ce500738c545c3329360e8e54bc99141c97227290fc8d4bf1b9949e4b192f0efc64c5fbdce73ddfce1ce4ce7f3f2271f854d70c9abf51a5d818815871e942468b11684ea0340b82a196d490e2c68b376b8899f58ce20c2a62b2df98a4c87a6fd526dcc35b64bfd3ea230d91f5ce636ff8ee1dc33ccf76d849b9b1c670fc02826310fc3413f3d59f25945a5a6fdb2712b8453687cef630ad5422efa4f3e459e25939feacd05dbe1b5b78d27635fee0d0d927d34a2624bb411146dc5ee0b8f1963928f282e0bacda7ced79f35cafc36cf560251748b2afd9c639479ae54ca299b76179e846ddb397ca1c9f67dbd711dd771455bb7755c6d22e5462de5b84dde2ba594f45bf76d3bb735d7719be43aaee36a130ee4ba8d485aca711b156aac3ebdfee657dff7afbdd70e5e0f6dfb9fbc6ab552ad56aa2d88e51e843b1dbdc93acff03c41d5bb1d53a5ea542a4ea51a2fbd5e585df65f7fb55a558e7b87dd65a55bb7f23eeffb5ab6c7a9549e4ae5755e5579aa95ca6ba2eaba52ad54aaafeed5262a956ac5712a95d78ddcd86408091aa45183ee3d65fb2b288cec376e755ed2efc6eefaf5b70377fa597be88fd6798f7aa7d41b0a5fa856fec89c54b65a72bc9e77f63e9b27cbc9b4de832499d61b3d16daeed540ecdef60e71ed7ab689ba6f4f8189e437eff78755a9542ad58724acc7c6b71b91b0ed5f4f05e52bbc8d2aca576863a4f215b2eed5db95ed138f93728a95db61b3ad7a55361cc16fa4f2f5bd3b8847c242ee9dfc42ec73f317e26ad5b28f30d1b42da1705d552c54e45527add0f63b597f56904dbccbb3fd3e0a72d88d5dbb55747a57bdab4d3c097a3d4622dbed294858f7cd93e3a5f649db6efc5932f3e4c93325154529a594524ae9134a2fd7eb89243b1fc4c844c2ce3462d2b0735e9f5a10013448c11370ce30c1a6ccacb758f921cecad339a21802519442bc9b9148b98897be40bc34e96e462d2868189b977e42819da71b6dbb9802bbdd47c26ed86dfb6bbb6b4b43c6d207769ef3de344143249b0d28e29d51e29c42ec5943bc52caf6c52b629845e49a702889961ee8256343f4ae1ef47cc50e49a20a1292a8819df791302076ba2c336c8211b99ac8a1113d15885e0ac4cd880323decd88ce8c66cc0bc188e1921866215e0e43644919d923725b7507715ad0c1a11b08c974a19ab27c7a837aad061faad1f8da32edba9847e3c20be1cdbcdfd606ddaf2a94758f79a685c8ef7d1d4c04da78ebaa1b513acfacbbd7a24d353c240d1791b751e71b1e22dfaa5f8d8582cef43c636537f976601987ed2e90d5c1b1d6f93f9888757e084c049e2f844bf8ceeff9e497f05ffdd27a4f9d7038485eac738d370b3f6bb3ab346fd66a1d45e93c33ef42783315eb127c09dfe5aabb3cb7ea64d5095567ad4ea73ab16021f25d3d12e233e621ab515569e2ac3b871dcd9b75236fb5b96603dbd701a77b166d9c87f431d0ccdb6c77b643db6d429bd02574094dd4444d4293d046da48c73ad6b08675912ed2449a480fe9213d428fd022b4083dd4432da48574081d420bb55007e9200d4283d01ff4071dd441fdea577bd01e7407dd410369200dd440cd4173d0638f5dbbf6fbfda37ff406bd41fb681fdda37bf44fff348fe6d13b7a47bbdad53a5a47e7e81c8da371b44ffbf48dbed136da46f7744f8b2d76ab5bcd6a56871d36d8607ffdf5aa57ad6a557bed75d75d73cdf5d65bd3a63dc7369105dedd77fd7f7de8467ee42a30910e14785f86d3c0441378df86ebf01fde466fda1be99dc4441150622208bc99de4d4cd40026aae1fd767a3fbda1de514ca480f7d4fbcea5d125ed12e932e952e972e992e9b2e9b276e974f9c4442f5c465d4a5d4e5ddef934faa47d227d267d2a7d2e7d3231110aefcf26269abd3f6b4c64df47de00787f423191ecfdeeeeeeee86bd8bbc89bc87bc47788bf01e7a0b7987f0167a077983f0fee01df47ebd3d7877f006f2067a73f01edff5fdf78ff7066f1fef1eef9f378ff78eb7ebade39de38de3edf3bef1b6f1ee798befd69bf50edfe0fb7b77777777997ad4d9de8a58a0b6fde691233f32c32397b0233ff8f0273c3033df4eb2ccccb7a12cdf8eb2ccb7ef5866e62b932c335fc96499af74b2cc574e59bef28e65be9366f94e24cbcc77d62cdfe964f9cea7b0cbfcb64eb83a2cfbb0fcc33210cb1e5816b22cc47211cb31cb27580680e518c798db588671112ec244780bcb43180ccb23f0082c028bc0433cc442580887c021b0100b71100ec2203008fc014361998ce5292c5361f9c56a2c7bc01d70070c848130106f61990306c3f2c82357ae7c3effe01fbc016fc03ed807f7e01efcc33fcc8379f00edec12e76b10ed6c1393807e3601cecc33e7c836fb00db6c13ddcc3228bdce216b398c546580e1964903ffe78c5505856b18a3df6588de58e39cec2f2c69b05ce57b1accb9cdfc3b213cedfc13213ceaf2c2be1fc2096119d2f02cb48389f04961939dfb22c76fe1296c1ce87816545ce9f816544ceaf816543cebf8165239cef8465229c6f01960d9d859c43380b9d839c41387f700e3abfce1e9c3b38bfb560199033d09983f378aee79f7f9c3738fb38f738ff9c799c779c5d671de71c671c679ff38db38d73cf593cb7ceac7378fed4c232f0fc9d5767d5d93b7767eebcbdc77cab479de7d2e85c3d6a35de6bbcab475d83771af7ea51e379d3e0aa7ad468bcef7c558fda8cf719ffea51cfe06de7603dea32de3278588f9a8cf7d459f5a8c778c7e0ad7ad462bceb5cac474de71dc67bea5183f196ba8d7ad45fbc61f01bf5a85ff0f6e23ef5a8b97877711cf5a8b778473d473dea396f175c473dea16bce5dc558f3ace9b05df518f1ace1bea3cea51bf79afe03ff5a855f076f31ef5a8b578a7e03eea5167f17efa06f5a8dbbc51f01ff5a84ff066f3d7a3c6e26d82d77ad46bde4e1feb51ab7997e01cd4a3b6e27dc581ea51a779577120f5a8d1bc6befa01e35156f12dc837ad423789ff9ab1eb599b7081e548f7a8a77d33fa84741ffe020d4230ffe7a907a04e41d5ca81e7170a087508feac70ba9473ffe0fd5231fdfe022d4a39ff7f808f568c7797c483dd271d789d4231ccff122f5e8c67d0eab473db7f1583d6a5dbc917a149e7512ead177f044f548f5d54ba847ddbd9b508f363a6287e01c32f17c20f32752bc0251bc07a6f300c57778e24ec45c8730a78013cfa1894f00cc71587a932fbf4cfc86256e83974b40894700048740973f40e90ee0f2067ce03524711ab69c01487c011eb802b43c014947c0113f40073e83119721cb0d50c40bc0811300cb6340fa00ae5c001b380c449c8995bf50e52e0cf116a89c05da5798f20008f12552aec2d1954479120d1c0994a7d04647a1320b157d56998582c80010974647de798e1c79af61df6a58fb4e63f6aec16cf6a6010a6f3c28a0f0be93c21b8d1452789f81e46d0612246f3b49de334892e42d0325ef329428794fa9f026430515de3158f21e63c992779d00bcc5084000de61acf0a6b3c20a6f2916de60b0c0c21b062dbcbf68a185b7172ebc5fe0820bef2e5e7873f1c20bef2826ef2d983079bb0086f71c186078cb11c0bb050210c09b050378c719c000de5031bce1c410c37b050478bf210001de6e0af05641010af04e8101de5a18c000ef2719de59c820c31b0533bcdbcc30c39bcd01de2738c001de2640c01b0b0420e0ed9480f79a0424e05d0205bcd5284001ef2b16f0b662010b7857c180771a0630e05da3e18d86061ade24a8e14d450d35bccf34e03d820634e02d82ca5cc4016f330e70c0bba9321779c07b8a073ce01f40e0411080c05f11b8071188c03b90c08148400207b2e11cd860c3c71b5e6fb8e1bfff71ef3768721f4d9abc070effc10187f398c0774c600277e5701d39e4f01c14380e0a50e03e3afc860e3adc8693f73871727187b776d8e12c1e1ef2c0c3c11efef5d0c35715b8aa0215b8f7e4dd9327457cf85639eb03b53efc3b52efd4028b2347a1daa7506747525178929ac295542457a126f992aae401a82a7c85bae42cd400bc85bac25da82cfc85dac29954170e437de102a84c3e800ac363a8023801ea005e801ac30d500970196a013e4335c00f50653802ea0ccf40c5c081a8177802ea01ae808a802fa026e00ca80a380d7501afa132e00da834dc01b5863fa036e010a80e7804ea032e810a81db5023f01baa047eab0d6f526f380ef57e02b5c973a8389c027502d7a1e670279502dfa1ea701eaa93f7507778052a0f7f527bb80fb5020fa202f1a29a81b7510de20da516bd3550dbe81da53694f7516d0dbca5d48ef216a2f6d17b4a6d296f5a6d21de546a4f790f519bf6ae529bcadb4aed21de44d4aef2de406d2bef2bb5897823d5dec01b4bed2b6f0ed4467a17511bcb3b4b6d0ebc8da85dc4bb03b5b3bc8fa86dc43ba97607de5a6a1ff1f640eda43712b5b5bcb7d4f6c03b89da48bc3f507bcb9b4bed24de4ab53ff0ee529bcb1b04b595de4ad4eef2f6521b04ef256a2bf166a2b697f797da4bbc976a33f10653fbcbbb89da4b6f276a837987a9ddc45b4c6d27de4fd40ef386a2b6983753ed27de51d486e22d456da63799da51dc02f587da656411f913641132b5437000d429abf384cab31f2a5b0bd4b614ce9b22521691f7a15ed5937a7b7accd87386d82118af672b50ef8e1eeaad3cd41bb443bd22d44b820ef5721a0ad4cb58e4502f6b31817a390e0e35f6baac3ccfcde5cd0ad6ec4c8fcba4948add67cf0629adcd20797a6f498a526eecbaaedb3ee946f976aded1c7b4c5043438ee51a0da6a4b024f0d2d49a07e9b65191167d594009934af2352fbdc8a0297fc0b3fd58ad1f0e48c27eba53db7dd54a3228fc1cc3f1878ed725c508efab6016ab6e0553d048affab089f2468e9141f35c954c634c3aa708613733dc797074a39ee442ec3aa674eb10942b7479f2e459c352d03583e6b72f498996d3cc41b268922ca771419375594e3347c97e1204a9e7f5202db7c922fa4297274f9e3c96ca1afda0f8c033d007d630499cff56bfdef779a01b4b6f240519f3948c8c8ca0cc689a336c2ca54f51f60e6d4a67d498c2c97edceafb2ab310f755bd3f30adbe74e76db50a917ce7daf7de40192ae9efa09c3d19645d0c5866a1ef6c3dafe32af3d336676f7d1922e919aac076ced73cfde5e863b367f33190284a97bc7c31b17cb6419af45ff245b73be1f89ee7799e373ae9ce8d972f0f8b2839a43d6e412e8f4eb8dffec6bdebe5f78f4c9e3d3ae9c62ff3dc38241ab9bfaf8d8920403d7c449708413e4c2ce8646e67ab8a420f44d18c7eab17a04ee6ef6aec84e8d9f78f3e0a1041e499d14b299ad1518af76f54051185f3cc683b66dcbbeae40b3752a1dfe848bfb514ea92b28de20c6ad758d4dddde604f71dac6137dbed8b028294d27b65c4db48361e0b6998e2eaaad65dfdbe6c657d1d38437a1b97adabde23fe6bf560c5eb60c573e802dbd6088415c7218f8c781ac6eba9c62bb6c6ebb2977bb0adb767637ced1945c9c4b6c2b3dd5867d528e081289ab16a94f04014cdc21104c177f5c06d030fd6f9d50ee4c1dc23ca17730f285fed7dd543970c6145c27ebcf73d2e810be4d836f2e89221868858a5d55459b1d1c4e65a0a47e8112dd48ecc22e5919d340d8f899a85e4cc42e575dca6f23a6ee3366e3b521323dea6d59ab24c6d63b630148a9fe8c6adb1fafc3eeb8adbb8cd68dea10121d16a4e43947bba91c6c7407753a9542a9514f1b692912d3a7409d4c87c1a6a0926698b122d4899a6eee9d261aa36caa9c4529930536dd464e7e7b72db2871509e4c566b14d5d421926329a9bd7711bf53a6ea374a31b35236eb449698d7545f471f5a0947a513cd125fa8822162b4e3d96def5571009eb869ef8e26c451350525df27881c414cd82125c7102d55f07fab9296ad4882237e002099e30e3ce9d1a9c2d3a4e098628c36d407f05a9c5b1d495a666a62686bd1fe2c6f8a8881748ca095296454c230f0a51fe05615ed0d4815d3391eadba9f77d2a90c71e32625f4e2421f7237282deb9da6db77faaea4407cb2ce4852dd8102ea1efd1c9e98ced17e86d902fae6377d85600b23dd2d056be4e464937f22563205e3965e5edbeba6cd25d757939c544df89bccb7f5e75d25abdab5f6deb852fa8ee39a971b22acfbbeab6b32429f516f9e2a6dc9ab26e916d24f912af8f9ddceb77b9362903dd81c988462b244e4367caf630f9c7ac4d973883e4dc7aba7355b008830b7b452b3f44640e2da16285e3daca197c0cf435a5cc3368e41f913da5837c4929a59452524a39ca518e8e1b6b4972f5e4eb229501d7adbe6fd5715b70ddeafb561d4746092fc65871d0b67a22b9aee3c0745cc7898053718d245ff20c400175f1cb63bbfa54dca6aa9b9d96ab9283b6772bbb6d392c11adf76f82aa2a2d77014b83c82039be7ab85c736b8134c80da28f1b6f7e612d3aaee3622075a8604804372052a739226b0b9bafcc17a74c1565ca38f1217dab8debbaa61903c7aea90b2ba35a085729bf54973eaaa8de367eb5eafa6069f3aba7b7cd6ef6e7c641754d3368f3d264e55d2b292dedcf8d72e3e6492fea8ba96293c23870ec681dcdc9a339755eb7f16b3b5755b4190b3968bbbcf75d6e38ecf6db217dde8ae3d7eac9fc5a0eb1dcc675ddc6417553e98d1d8d45292bf148b26179ae6833a8a3cd8e36c5710176bee9d82cb4c9e6cae24666a1ed1b1de9ea89a3ab21bed0cc102f065f23e594f21e0bf17f885c9879da59fa985655acd2706006ab27c4d5192b17889f186e4455175f1262f7b45a23f6a079126d287186e821b1720254a24c14b48b2162d308b4cb07542a88aaa65ed44694ead5f916e6c73cb30185d149670e49392a7070557c1ed42a74d32d9618737e5cbe1f57135278d4c86e35db30a8a28509c698f17dc6886d025b3482273450a60a0bd8ac51c1ec6e4a631877a6382171c1040b668d0513519bc3cb3651fdaeceddcfcdab7e64aec66d49be7adc94eae66509f131d967e161d8a665d3c262b1865879169494956729cd580e726a543ad0e58b1d373379d69284b553910792d89440a9060225dacce4596bac3cab36639b07a478c1115348c869c14c9e55022bcf7223612c2bcfd2c2304a87ce162bcf4a62a211ac3ccb8a8c51cacac232b2616dc654f040133058811431599a98c9874e12d66aac7cf8346331bc69c11466d2cc19c365261f4249585f61a54bce0698c2f880185ea898c9875212d65658f9704a3eb42361661846cd983963e5c32626fac0ca8761648cd6c2a419a34a61d48c51248a48a34d1d341c5063260f4a49585761e5c1a9192b12e20e0bbcb0d140131318b334563e349ab1a2326a8e88828402178860aa6b563e44920fb348581c86512c148b1c2b0f423151909507d924b9b1f2600d74b23246c41b33ea8051a74a9e993c4893b04663e541a41913d28239456cd1040dc07862269b04561e549a3186928325cf962a63c01c3193079724aca9601a03365db1f2e0990f0fc3261e3c694cc9987887895e961a7961e53fa5192bb2a2f4654b124bac81e68c99fcb724617d86e7542102323cf0e48406accce4bf2609eb1158f9af3663498cb278c102355858d1c54cfe7392b0168195ff9e68dd4cfed3c2b01927ce16183351b5f2ab3b3336a3a23ea3556dc6363a5b8e58a0e58a193833f9959384b5991288a001ad882eea8400895947cd18c389521bc2898a1564916626bf9292b09ec2caafa6244c7e6547c2cc306ca65985598d593531d1adfc6a8b8c4d2719d42b2f56721a130cd18604429cd1812a3379d51d09eb32567e653463322c45c4b1435303c6163332567e857486955f6591b1d54c5e158761b38b8a8dca8d0a8a897e587955d38ccda525556dc968c6188e16567c61461a12ac19c14cf6182bd988096304493580b26606b30ec18c711d19345144194a6d8cbecc5a0a2baf6212c3c3c3b039a1a451c78e84f11d26dac0ca7b5033366993163583b17559794f69c68a8838e3022b456c91c3549b31cd18d7ba68b3e45403830e9899bcd724615e6dc6f84d15a82ba4aea0428b9599f724619e1b2925e51949d998d7c4443a248ce53b3bf249a963c3b98162a21c569e9392b03b12c648302a9b9ab85a13b7d9b9c34438ac3c673463b6042b1043cd192bc8126626cfd124ac9fb0f21cd28c010983052880228618366c662dc6ca734a3306003370e2905933022a8e66f2dc928475182bcf3149983c3746c2ba19934a4a514565c450a38a295d98a9c11a33d94e5816e30452a4d0b860cc0ba6ccba0913c038538416a53388e862d660acfcf68466d3c230094542f1b19246db8c588d140ea4408a285290e1c44cf69265039441c118a42eb8987367d65fa6c8d891b09595a76618d65ad02626fa6caca1644b29edc8c3654d1934a820a366c6849548f2348b84d98075970935d9c8582f2db9e9a66e9a35f96934634557f07c9962c454139e2a66f2932661bd8495564861c419222883036b2c31939f4912d65eacfc549a3119cd0e9ea9139cc942652695b0f29309092b3fc74818aca934953ad2ce1d269a5636529384b19384f1931ba8103603c7d962e56592b4226334cca07e5416db77fa3012483863e5bb36634fb2e8428d242e508caacc6483004a6a4a4a8791316f26df63ba368fccc03015bffaf2aa3a8b84b5ac7c239dd1c5ca211584200d0aa0349569c14c2a59791d666c88121825bec0019344c54c7261010c2e43c0c00c9d28303329caa82943849167032420a2ca4c7ec0ca1384e00b284d8881a2a993b002089ff0a8a44b17094455889899010100000020000316000028140806c3e170602c8b5451f70114800d888c5e7046170844698cc2300821848801060000004144046068664600361bc90fc54ccc6f73f94ded1658190351bd2d5a70dca9c95f32f0333690455aeb2b00490be5b8980e8da8013d086950b11ec2e471a7f66c39fc3c46dbcca0647e3cbf1b1f34b6f6565bd91b3c7f66ecea2d2c8b2f680b11b2eb4337b4f931e0648a0f49b27d26e41aa33848f698a3cdd8a3f57805d99d11401927edf2c8b1d36e40052338c93c0754aae63196a18730b4acd69f31e8b6c8057186fa41b6fec2bbf854408c3382ac28c0a73a9e806d0093add63d7d4e27b82615c27c5136dbfb6d5d8eb74d21b4ecf7fd2a97c95c6258c528f6981c36d8e2af66f2d0f3d67c735cbd2d7ac11bdcbe67cf8dd61dcc8de4e4dd8947d0070bca6ad858f2af22194f5da6ea15e323b94e3643fb46e867f7c75084c5c3cca17248a923221892c814bc74cd5c0ecede8ba6be981d9354e56968dc9284c882aa93c0645def86e496cb88a1002301f954b71561f5e18ed002df49e27bf41782400b86940ce60b6e32999a4eca91a938f6c187973c86160f77af973e52ab90b7d2738b73d60996f5d852dfe60ea0116c90ef9dd15c5ed42781836203f821f20bcdfae753dda56904dd721ea8dac9d15d985be90ce8c54a2bacc3784364d4e17c16e8fda9ca534163bd870e8669861d9d99a717fa022000d57b4258df0ccd5451977943ca696b19d51fe5653a8fc6be837b0cd09cebd543eafdd1f3e3d6aa18359cc4c5967443fe1913aec4b28b6b81ab6cabdf6e6d36f24b563717ac0647b3f01f3dd7f5080318043f990c643a2ddd4df258ee283ebe378581455e0366b100dfbc05e895ed2cb1212996544e900463e0541281b3d781380a000414267fb388ab5aa9201a6aaddc73e8728ca33ff365f57edbd8e71eaccdd72a26848de3cd0e0591240510088006b37ffb5531119dd15bb68e7b760efb5921a6e8e2b4e78e911c1971136015a13be2e380a4e598ba6f0b49278bb89008ca85b9249e54ea3b568a1ea1023b632a6203b040a94d8216f4339f7664b41ae2587f49b0a0f6b5ab942094a1ec49e05260a56103f474b20323f417ddac61582ee55c5d42df8b373afa591a104ed3730a7d5cb4e6fcf8143f7f5e199755b2c3a3dbf4c60eab2017713416033e3e9fe7eac72edfb6f80182c83b089a261ac3b04cb05d602a29b5cd68997a6ca14afefecefac56b876adb73032f341205eb53f62ccf2ee4d0b411e3df5f31d0d7618ce276b693ba387620992fab45dadf370b9541c642ac6e129c4115b10d40789dc232ef233b732e6b1abea3c8721cd6154fedfd8a04c02388ac3fca5a19e307b70984cf008a9ea221a51bd2d57cf44a8339381dccc1b4c7123a0bdb082497dfd74f75ab1b8ec4005def07ea5caf507c755e35e074c5189c5d1d5db3670be19e3743f2894316cb7acae04c605038f180d11f794f5aa18a27ab8bc3670c9f7b8030340584b952945acc4dd0d01f33b99cdc2a213049a07c5eab21246367b806bff7bc7cd457eef6d3105c148dcbd1252827918d207ec0aff7ec9df93420324cd83fad6c20be12bbf2b01b9bb595788ed6861dcc0c8414f0a4f64c408019cd35009ae0ac913248386603a97e3c570c667e1b347c222be962566d9881fecd576b0006098aad58393a044166e15ce0378712d600ce033228da4ac2661279d67222fa0575d71a247ce21a6361d9a5e3c8f5fefcd332e58aee1571b1a52349d2cd20946bea39ae0ea448aaf6b8a321f60af11e1069dfdd4583a8ca68a9b5f4fb6d3032ddd35b641dc9e3a9a65bc783ee481cc06b030e56cb73c176f0511306e529fed41b913db13e11959f9ba75f54e77a04aec7c63fd91ab67587777d0c6483bdc75dd0fff083bba9f51680dc69c2f87d990f229b62670481558746859b24384a3d9a99d7b7daa59deba0bf6649eb6a8296ce95bfec8d539d3634dbeb0b085552b7ec18d14868d248ca46b8afba2af3812a488c8f142349eccb5305eeffd824231230f202d35fad30d24bc64694494e2026422901f9a718d7ece3c7f6fd08157401ce077b0e2c752cb53d15249cb72e654bb1caf3fe6178c235e4450e68f6b0415b69e03a74af88d253b1dd64023f9a03e6b517ae5e90adf489aa04bb82f571097d1401c7a218f692335860981c135cccec562970358710f268c66fae342cb7baf1e8d1194b27bc7429147a366d3123bb556fc0ebfe0887d384083b000a0e2dfe38759638a8102177109117088a0fbd4c6949c13e83c7dc661bd2275490569695c2ef2179f4b8be02a221b12c69eea14f3989c72a7783a1076de9c383b82db80c565677088adbbae745bbe509e7a45104ec6c987edcb16374f1167c1ae657672c9a90c6f780fa1443b616c1b5e81e8b69ca1cb43178954b55e2176ce541db81c1348b115415d300eb8af82402c65f3ff9485cc81cb723bc4c77f7f8b95fbc51675e0b1ede5ced55ef4f0c01e73134ca230a0fae9a5e324fcff84f6b2df8e07e237ae9a9c87817b2da642a6fb4d321a73439a45342d0897821fcb71526700ada0963f0d2e1694349d70be3fb2493cffab09f14547b13b8a72f30d4972bf422884b2cf921efb9bd8151445a0326e8a6f77549cf8fb67418f83acd65ab9bf4eed3007cd32650bb7bf2430a674a7ee34cd9360d3898ed608ad5ccb55ede1a88849f4f69c55888de418ef52c2ca3a0c2532fd41a494705290368b37a5be52aebedcc312ce5baaca8da39bbb9b3e0118b5d5a8dc90321bfa164c5827497822be7116045014a53d01c03442122a0db8006454d4c730aeab1453e776bde500bcd05855045e9f84701d73c34270934a1b8fe262ba08202e638e3080ecf5f9146b20ee02642bb83176152eec5a203f4dfeccded4fe0c47e893ae811f12980b0c750ab772d3414688d8fe67df95d2591d95446e23e79d3b8a261da3a215dea57d69ca8a7b1b997741d001e97727e8c3f4a74d52501ada13684bd3509adceccda86b21f34144b2a415fd8631ef86a0c4d0d32de425637263c48ec9d06fc3441cf36fa642101777b18199e49fa732bc03996acd81402c86fd5761d5ca01530592e4eac0d5d058840a3ee83d57d3d2c1b5fb2385ee9ce7d3f2ef2fb84b41400059c623f84caa6e43b16f25001cb90534c8275ab1ab9f0fda87db940f4a429ddfe05baa88ca24061f427a2e65f652334f5f27eb9a0c2ab0372ff9764ff787be6706c143ee8e143b7e9a05c89d7abeca4531289bb8fdee99b0f3d0a2fe914e61c353228f48634a6194ee78ac2739da4765353fe4daf891070c048fdf0c989d2eee423fa4716cb1408c0ed23c287f7d79208228ec084210ee3887ea85d6e26f043801c0b4b1c413dfb79936e9f1974a85c417df72904b1cdbc3679f104b6e9917eb672478433f143cbd70f6a9cdac6a63cc7be4c19d4503cade1ded0b25fae22fa422194154fe7db51caa829368f01e51f228568bb692d341aaf0400093fbb46033cdcd5fa64fb01984ef7a0f1196b9f0e9ac356d9e2ecab191a653595625f2a412c717f873c9b7f32f4195b3b9fed5718dad1606f50b53e716df61a16fb8576e4a6b906d828c575b251d88d1110f3961b3fb7e74008556ed50233bcae854f78e96837bb9c2777fbe314718d4759463e0a1d136dccc4e054cbb8c889b1c72846e6abb60b69ab3623c60406258b6469cdde28832b060e3f541dc24171a7c2fb9a4eb2f40ef628b79ad5ca6241f16bac76f4c8c6d752b0a3144fcd1b62a0db0fd4fc99147aa72e81650174f4d2ba19542a2ef2e5713874477722ba0fc5ff81cfccf0885b3a015ec400b12b769e2f469bbf5a78314af64f4c1f0460ab7a30e60f1e82bebefad895ae45a931daeeeaf2d0c519b6816c090d1bf1f373df338fdeca5bc567e5575ac8e1e75273afd52adc609b15b0e552fdf1b01ee6ee32f1996453eda38bb0c0c50300ed6866dba9281815000154fab51f248b10bec2b643dc32fc967c6b48fe21bd11f592b3851de809e10034df75cd0538c0ff178be88fcef82908a3fb83a8ae88e82b9b455e44311d9cfc70d0d9c9da2bc65fe53f054e98b8739860b004dce1ac54a952430d3207bc26c653c055b191a633d4dfba733c4e49418d4a29348acdf4bf79bf84e929bbf03b3812533968a3a96d9aa184172e9f8adac2af0a48a59f6dd7fd00b22e24858f36a0d9ae026d9e40afbc46f701a9aead557924ac6ccb5e1b4f5617d9fc9cdc3113ca6950d9068d6763b8feea4a98d39e009cacb1a129c103f951151d05a96c6267cbd8c1b4040a265f428e070a0e059025fa4ee733436441e4c416071c474cae3a839597ac7601da3512b2693905ef8fbfc49372c10d8935702b0829d46806d75d74dc59ed6ab6118f3b1978e79dbebf3a705e7ebed564f48e77f838379e9bd3c7b6f093b2a91d08e1230c88e10fdcd4bf28284091de464d6c09b5578786c1d07ee3e9104ed48bff99fe9e8f69dacbcfdef5f94c783a748be18620c1bf2c29d1d06909c6701c83f5d0d30a0a560762b83bc3bd362d83580ddc8500a622663d11eff243131ff48545fd73cdfdc100876950259222c9bfce8fc28f70bf04e2ec11964148439a2cd064b53c12bee17dcbccc7445466ba9e7ba2e9106673c9898d2e95dee0d645d73e9418e0d7258edbafa079da67a4ef663fb4d1168a977b01b85d67ffe36e52865d430dc2786c378487ba6e846e9bfc0ac8bb6fae5b25dc8a6e2279a3669b92de64609573118b10c051033eaa187a273c6ccc8488641b3119e9434fe17ef719b6a7c2534ae1847a8ceaaaf0e665e5fb3e1902ef303cc28526ccbb86bbd85ff495d5bc149f956be105457c77c879d66760cdd3140efe14bdb00c429822568c74bee0a5985038da6d2f7462a506a090ce637fcaaa940429ed3a2e7bc67fa04e065893954cf0890eff1b9df22f93dd6d1b389cd9d0bd1c9db58323785a586999e4401de03c53b8f9fbca20381aff7b6d5435575a9d6219a8428623460334fc499fc2db46d0c4897ef9e3fe5d13dd43209e6896752f87e846a3642515818d533b848bece6786a6a342b6074e5c23912f9dd4d38912366bf0baa8b085b1cc8b7100f68550c733d2b9b412c8ff9031f29d884fa33529b18859e36e89709392543fa31e035e4dd98b90d1c128059dfa572cbcf897de0daefc91e3beb0422ea402a8ad8324ad8afd9f96fa023e1091ccf58848c3fa1fd98eb0287d40132ab6af31c444aa56a4dd404154c58045fc3ab2100fe398341ffd4447725a2db79be6b5ae8ba4ba265055aa8582a69abf241c5416faf74f537a16bf1ab45e99ec30d8a8f78a4b4b59e6a4c00ae6dc0a3b2181b3dd707b2262b81230acd56b0a6a3a11f734acc6c044e2ad710b180ca40c493beca3b78ea2b3e88503749fa468d7bb89445baa167178c52f69802bf08ad7c0bbb711cbc67242ca8bc8e5e3b22400097af79d7171446daa115138a8acb9c756c4a4a9a0c4c0afc1ef70e7782326d8ee14c1f873f6d9a0e27ef845660f2354340317999aaba7c72353baccc05821c29829af1cf36e13cab2893e7296413c667b4fdb9e247c2de009762c61ba0727692cb0f76f90cecaea812add80aea8d7506c147798938c657347be5a1c8c40a3c7be480e686bbd35110d4209b07fc40a24f5168fdf85382533f27bda9e0f70363380ad823cec60db5efd9448af601c801f9232434ddf261a3677a73ce61d40c27535aae3e4c14eae0ea93386cd20031e3836bc27bffe9acc556972afdc523afca44562d66c1cccd5fae7a71ed8faa3dd3855c527623a934230bedcd390f5f38f03f15fd18c456e5bc9840c72db92d7c331f830fd180b7d5f22849786b9694c414492a87d27365484acb8a0f511cc54a39292628472dac94ab62b9c28632f16994263129313ee2282f82832b9135deacade795b5cae318751710dea6ea23ee61fc5014bbb384cfcfe531e0e67567b152667c1465218642c9b8f08909e357d029a1d200518d5a430d5baac6a68e796e3dd26037197d57e777e499329170d8e56bb119f3dd7dfeb30e9e22b76fb2bfe30e3a3e01dd8c70b3b90cf29a5ee361ac1d438257ae2b81b2f6638d83502d6e3e49534a80d206284501996253e351257c4a568ec617a74730219a69e2f80980d33b407ddba9be169e9ec67c2ad6a7734dfb7c417cb3fa7f1674c51ae3312352a1f390f1c62199a879c8a7371873d7965360e95b76c53a23520d1aa536aa72c18a0bf85dc414c4d2bfdf44815fed07306a410711cbd735383dcc010dff3a78ebffa88f755a5c82c96aed69efec07ff3702190ef6e619f299908b0e54cf68f02e5719fc3656374427b8413fe3ad39df85f5f75e42bde3385486a60213c025c122dfbe20bc65ea228696919c59f69b6feaa95d58fbd290c8f6398670599f40689a450e157096903413a893d41b7b08594ff67725f55bafa2703c64788a72d827b95339c26cf6ce1bf471be074f013b97b49535a94cee7736317de496e7a2a1c3dbf5b70912fed8fdd14cf412f7e9090d440973c744972a4dd9516bd921a57d3896ccb396762c294e484994bf96309476866244cd15c5ee05c1c53975a556573e2fa236a9e3882b91e75e3e777a26fe1b99ed2125559a14840c61a5bde10807d4daa79adb4ff8d08c8483735e3feed1a9f3946aac120f13d63dac04b0ccabc403c03b70ea1bbb3da0188d9159c2c6a5b78647d5e28f1bd0ec47ebefcee6862ef30537ba7d9b9bfcefcb324829319455a173d6fcefcaa52e619efe379808073e8a822be124c66a946c7a33683c447db4cab8783dd31691656c94d56114601f8b5c4b50ada84971737a0419956b5c251e77e9c5cc414170a00cd2a36e64109baef8aac8d39dc9da209766a40c9f646b661c5d9047788ef7a857b40b4f6437d818b5dd7882707de9bb8ff643bd7dfb3756a998442ba1ab438cac53701903f06b8122e8fed93b5404b70b964085f4bb2a5460108481e82d303ae214ee4d01596caebae0445281d4abeff00a527c275ded3579414503c38f7a82189a0d582b2e9f42afe3b84528c62a25a7e418b63c876ef84f3fdb1186baa986b4ceacc63d8226a68de07daa2e7da59086a021387ff4c0c9bf6a4746caf7a2334490cd475df4aa2324455b698095b270ba1dab491751c29899ea85239296e60e70124e274d5c3f7a1ae4aaa158f3c00bf7f6d13a7ece60316b1fc3ccedd87897f69c71cc3599948b322e653546594a926224114ab72fe51ad827df1d22509112903f25f5aff5d21cd58342f44bd775c006f88df50ffcb90ee5f8952c18db9cd39c168f83f0dbcb5000c08d9e1f60a50cf20d22a153b749e5b174adf9bd17fb8411ce078d8c84c22e2b350bef04872a97b49aac80ab134a809495f4bfccce32ef10a83d9fb74765e41c0d6d4b15fa50f15cd23d9557c2384e0f696ec85fe96faf1cbb58fe9c72ee0219999797b7c2992abd30a793ebb20b49b250e7a54732d72d0cfb411500a35ab32260ca0501ee27a04f8b081b6a04da0d583a0f17c6d4f291658dfba3085e022e519a1b17ee31c997d3874e48cbce1566b32174dc64b587eae45031acbc12f5b5be332ae03c93f987570d10dfb30d08ce1a7f2566aac08fab95d7900ac5cd88d0f703aac7342ac5917243485b2421dcd7538d8150bb0abfbff32dd93166fff91deb4b9fa0d7a8cddfa8e4dc9d82892d4c3db4149d87bb11f48705d0628ba9e409e80a15c991acefc05ed90bd6630cc4bf6358416b9e5a872871c8f8e9a37a9dff043dd0bc055e7033ec715b9ccb16dcd9ec190f4213f58467e50865e85ca358cfbe4bcb2c28cb174b5cff0da6de42a73b6d2353a605444e732f8664a81bd5b3571ca5c891e6be6b743b4f5489675c025aa9785e8da4a2d6ebb495d1562b78d0b802239e683c5188510b3f15e98ae99ab843a7fb8d467c85a036044febeb01a40212e9877e99e56cdbfaa6fee4f5593145cdadc8fd64a17904abf963e5168b3e51999510d4a2ae1652e5ad94989b8f3e1bd31a43376c8c9e4e87462fe35d0b51fcb580d38096b349617eaaf3d2bf3b2a09ab434eafe4f56b46869faf2024a493c5d1e0a34acead44b7142eeb7f924e239cd9adc458c15cdceab6b8e595ec4a418e75ce4a532bf54fff27c42518b2cc55a8f42d262a2cf183951e58d741e79c0853ddc63c39aee43a54151a48d1c1f1c270d8fbc0a288ce01a23f3c1aa84934291dd0c53e1a0e259968bd4c9319c30ee3747dd3653d3d5ad4537c38710f152fac83257ddf5ff51b82c018381d65f7cdd1ee1932fc2280e24f72f784d52ff1e577f69f477d48fc4b17fb6d10184386b616bd4f939c05d572511beba4ff5c7ceeac8a515356d22955564a16c21cf0e2a769d775d07c4250fb883fac6a101a04b6c80799253f598ab55738b51b160a0c4653e503c561d388a9bc0081d8fca412e1d018a6cf1482744b0403749aa93e6d0411a2d971bb870400a5c6490f2615295762689da1c9b25303088e598bc50b000aed5d66e92c00c3b45e8764068986860646bad696644a2160f3b34e0b450090be4b0bc42a518cf45325e2b1314c136904e99e0a068814a77dda49224483e17d0f29084a8d103e4c2a56afc410324793e5b7061010721d8b1f489128d00814f11e4556c7d7b5238df96064220644912d5791486811a35e64e7c648baad74e0bac6d1dfefd14a01a9ee42fa328ab4a68e547126e970f7cc52d9094a9354291922b952ea2f4b3cb925eb7497041540e06662fabb645af966aa4e9abede9ad66e9b2aff4d3f474e2b8f4e856ba7bf8fa795b3a7d2af4f0f21bbedfc40b9845059cd504c88285bae2851d0280e7a94e58d94189e14f758ca6a963025604aaa8ac06db1902d1b97d5900f7bf9699f3f6e31e75defc0153af10a6ce7a104542eb706e18410f40b7832debd9d4e6e9fa7ebe8f079b91cdc5e0f97a3ebf7723a3abd1e4e779381f841f806113bc688408584d729b12f9908be4e381a8a31679bcd446a9a8018a899480797a622324ae15efc3b231f9a0fb1032a10f7fef80dfbf05533f6eda04892199977fbc9d908baaf0ec00addbce3117baf2d621f6186b2654122c199008a48fc2c9b6c8e44a461d34449cadc26c46912e1cd954c50f211471ec994f0bbc1f1cc4a56df4ca065c9f354a214e312a62f31e448741113669518d35626fba65d9e4213010688b9d6e4cd83f43bdcc425339634e2a44adce10aa29359ed4e9cf424e751977d7df2ad259b2e409967502cdd1c14321412cd769f4491a1f300218ce2f628c957393724c52e0e873a550a134cb1c67644379b62417c55b5f314be503197aeed432acc985d3e399585565c9e52151488e9759b56716cb0926b56c84c4bbc205b5922b952c52b7fa55bddf02b2e112c14090baf77ab0f8a653d79ab65c882f6fc78d7ca528a9ae59b3fcb6a6f6a98e5dcca5df0f5500c50be429c9986348e0de17b3b5cb13c3cfe0651d20db1568744853e89cdbc13033a281a59f11161db478ab516491e84a41d49641a589161e847869ed0a8b0614992d18d044b4e828f3c9909186538949415e1a92c04adb23c109649305986a16f590f91cb32a62f8361c04c8516b31e77ccd2786626a29c59089e66186b95346358c20564b9eadf720133ce03a32ffd40eaa4007fa7062b9e32d8f62420e05300d84f19a29a4db504f53a701382ba50148c8652f012858251140932a308908d0280825406245208f24941a052aa8074a901064c15e03585c06eaa05ce53118c4f018043a50029aa0e5ea932584ca5204755003055034cac32f0b4aa03fe2a0928ac2050b36a80a05500db5630d05b69a0e9aac1b2ab04e65e09087d15800bd6044758167c62b500164b00842c0044b27ae09795606556e0a56b4f05b42af3a5bd619cf60497b50b34d71e80b33de32cd60454b71430de2ac1069706345c61d7b33d0ae5aa983ff794715a08a47551b0b02b766ab147e54943185911cd7804234dda87970ee24db202545d444aa944d5049b55f0548b1ee682897b6d85b0a3c898ac54560b3b5325a675a16b01e036fafd0d0620b7bed01d8ceca433bcca514fe9cad738fb85dc01298741984be1e27478764b94fc70b1aafca8708fec1c2803174bd20913e2a6b939725e17a5b97432796a51150eb7c37f37952b6554a1ac08fc13f065bdbb5d9e5e5fa7c3dbe7eb76bc7dfe0eb7b7d7c7e9f6f27ddd2e2f9f8fdbe5e949f82cbfd800b28f2764c9585f4d7a5b85a20dc3e0ba7a0b6c03a690746f18d8e6ff216d6e3cd8ce1c036c962db41d9802a4bd63689b9f0fb4bbf3601b660cb15bb6806de00a91f60683edfe3ed0c6cdc3ed9831806df942b6815140fa3b0cb6f1fb503b370f6c63ce10b66516d80e4e0169de30dcceef03dadc3db48d1906d8975b601bb0a140253190af32949b6f035863429e912cf2f45d6997b785981346b1b0cd7ae02a643ca15edfe7974a4ecfb731a1867af9882d805449fe826839efdf8a1c9cdbc9980ccd723c431a5eb93098d852b718ea104527810797a21072a0d8061fa66c32e309bbfae1bb665acba2ddeac65eac90d275499bc0aeabc87b07b6e4155b1b52164c3ff1b349bc1ddb7fb110e376c8fa202784aa0b418d7c802e3edbda70dedb1bfb66177cfb3563ddb91fef9636dc76f7c5bcbd13cf7e6d9877edc67fb305b77dbdb16eee8ebb4f1bb61defb63f304070ddc7e7d53f87c51d8f4a1c6fe29498c48a1f94d4fd5d1d268009f93121bbc96331df65f5fec4c2e2172719a98c4719f50870d497d2d57bed439dc03bf54759529cf5a652c54ef6a14600b6590089384af8a34ca58a7bec45cde0f7e9891a24b8d59b8ad53aec47f9a077e989e20471d6972295faed45a580f7e88d9ae4f1d5931a55bad98b8ac176e88ff2a471d593e21576da87228176ec9fda28e8f74abd082def439148ebf54e25c668ea454defebec498d24a3e98d8a6438ea4ff9aabbec41f10077ea8b2244f8eb4da58a7bec45cde0f7e9891a24b8d59b8ad53aec47f9a077e989e20438ee4369ebb5f4a58ee2abf44c118628eb43114ff5f6a652c263f4464df2f8ea498d2addec45c5603bf44779d2b8ea49f10a6077157703e8960d09a0d11b4e93c399239a68eee74fd4129cc879b59f790434254ad51a278295d689016b75374f74e97f9d3894e44bc4a7347d4cec4bdd17c4a7443e238e4aedfbc5ae04be222ea5e7436256eabf271e4af21171534adf26f625f705e2292d9f11a352f67df17e25eae1a38e58b13213c8fad98c4f40f3794bd2f062d77c3484f6e15afe7328721032e9cb7df1527a6a7a985ad20de9c3371be0f9387ab05185611dc879da7b2028bd5d9e68e49af4c367556286ee33142e817608988a5a8d10a726295ab31430c7de54f6811a6b22d71d54fee78b4fa5524e0810326d93f5991af62eae8fa9ad05e0d824f15806cb652635da6e60d5174bc6000374f1795f98ea65a912bc77df5e3dea0d1adfffc808ab330d878aea1c1d98a12027d183d84a6f121d849e2432a30b022e82395d38aeb6315bb4258126213af38a855a6e8fa5104c2ab13278422ee8d1a80054f120053846e6fee50da72cbedf3644783a25f4c16ae12059bb83710d8670cf342e4ffd105c3581685852104873a32046c140ca9fb60858720e80a22eea06270805391b0a84741cc618d070ffeb21e0ab66e26051b9a16d0b82f0ce06284efaae5f3d00d0d535498b873d5a10a1d420cd488bf3b10f01a022ea07a7c807b98d0b84f51ec63901a89275758e424153263724b68b4b4d5f92aaf9f2dd0e1471b31744f884fcc6f612aec318e1ddc983b5782ff6a777e8f7e4d613349df7ba758bb013ba27fb2694312fb4c639dcb201564363c86b95bf2417629950bac2ec2f897fae30c745b905268e3ce6f93f449daed8d867f666fbed18d620939acdec110ea645cceab8748d48aa3f5bd1f2fbd4b5524884bd5dc7f19f7c902fbc338042798c1f18b476d04e963502d14392834d48e6bab936a8a21560b9c71951e3b916b7167d5b967a1fb9f815a2cbef95a5edd0f138bc32aa4fd1808cafa0299518f58413d3e2e23f29da2391e0e63021a9c3e088789536fb69b877c30bf2099bf46a5f69f77172477b6eb70bd74da74482fbc91ecc7c254a0ed764c22f8f603c2d9d63ebef619ad59e78ada5d2d14e885c5a38fa0001cc380ef4c863e8cccd490037ef79dae9076aa579bfb3bf566d8b53cbb5e376dd8df4ca920cc8981e02f6b3de07079806a8df9e4a4fe4baa16de681a470bab6fd38c14a8c2e51fd211f0b765e04a1dfdc5d32e4dd6bb768d5382582f75e9238e99082f5a41496e606a20956e3db2a60e8f6f163b592489b1c1a89fe780c669f66556d01ae76960e21358f732be9f42e0c13f54bc93524bf6abd48f5101ae29138a478d84060ab2d6d5bfd2a994688c980ad382faeb983eabaa29e5fb1fac29c6bb941524103ce6d11be19e19a47c43ceafa194a670aab581a4f42ec66e4427742ee48e022055b244c90523ae9e88d82c298b810db5dc93dabad90d7f38c2768c1a2ced262a3869f9c01c6ceb08bcfb908ec7585c218b13ae665d00017c04661be2149eaf78c536c1fb11f0f15163e52b91a84a92c8617dc5f1a51617a67e53fc75b7b1a08c89942acc7a2a4855b64b8315d3438d05f46e2f3286583af2cd46c74e907a6e8bdf19e6b652bbebb25e25b52bbc90d9cc1e5bb51cbac50f51d7d873391d40da8d51ae03ec29c73a5e6ed79453d6902507c70627d9cd21c7257d3774f515af834bc95cb397862f285cd6ae45ca75489e0cd8a9c06d19c806b720a560c9c00fa74e2216cc40fd1233f6c9c525477afb997015b3d3fa20a45efd05e4e1f572470abc87b14ff418f974bd6dfad1491fef1fcf79dd07516850fe893dfa930f89d9c0ba6a61fc88b93417f2a5eb81ab79be5fddef779428f1b80e6f1adba3dfb410137c50d54d23738ac93a760030d7914767c851e7a8197a46062860e56a169ad4bc8d3a7414cbefe653701a15024f7e10153255bb097e84fac1a2291b5c8749ed90497d6f6ba2ef1d5b00809c26626cf37fdde48b6fbd5ddabdc28231fa3aab18546b5bffe5fee68ba0574f9fe703857195ce1365a247049531c01ce88bd8773259f0bf3a8e020a1ae6d7ab995fe632edcb6d87cc3e8054375bfd28a79514bdaf9e77c2c3c65501633b82e60e15c8ca691c676248f31d2e2d0be07960255a45b4800d093b2d23c35050259996252a35ad388c8afd3caea1ef8899c262b3185b9c25d2155797f455156ae70ac3552f8b01f4af3c121a0cc672a41aed59b57d02a1745a24b60316ca9dd6f02e5cc80d98ec45cee12fa86a35cfb9468f9f3bb5c3fa245a9b84f4db6ad84402570ad2c03c31c5bd8aabeca94b200cd7c9ec61f12922e29614045b1954e39001a74b202c2124417f04a04aaed8c7c219458f946890f2214f0e55dd73a30fb26d665cd83b496ab3cab83a9e8b4fcc2488b9ccbb66e070700c377d9668ac44e4df1ed689eabb2211c9c050e139d01d7e5db66e4eeeee01a5769165bf69dce06f31b50ea42658d453f2311e751a769232e7ecd68f90e63d2e60f04d395958287586ee37cd7f7a05b0e9e2d67085064005a2a81fac20a0a92036e95bcc1875f3b00d8e11405d1b921ae804d203118c9df4fe495106981f9e49f437d646a8dda1513ca3ad71b7a727a8869ce0d373e13cafa9b180c0a94df546d14dc8a5e062794b5c8857257f6bc035cce915f45a58c2394951a00a43a397f872f59f10f17ca1eec810d185672e26d6c6f3133f4f5e93f8c7355e53631741fa473b411b1a8c448c4b9b66c8ab95945d34b8a26898dbf6d5ae2be0e09030c27f69e9f97e0425083fed83f3ea34e007232d3799364f214cf30fffc455d02fe86b6ac8c5f437e3290e712cd336d2e2415bc0ae8ff492d1dbe98d043f2af4320b98c4182182805a45a669f370c0183321e8631d2b76a5958f144e379e48a955ff8c0533d4c9d54fb8efc8720d58bcec1a8a57aec326ed03d05b2a5f657735a9dbb1422b0032801b7ca82f649dc2b99bbd809a34b94d801f7b0d6c5eab28ebe5472c3a9ff7ac6ec91b2ee6a8affa968bfd1e9348d6fd319f05264fa848942c7966e45b431d796644e1bd7f1f3b721aede7db50c0fe7897c180e161c567e0d99ce26a171f8772669897c25911cfe0d54405c17a43cec60e8fa5f668149880d2ebbd2825e3a58cc6cdda8c6d10dc84c480971cf7d2415a9a9c3fdcc5ab2455ec50335c4115226aeef01154829f7841076863aaa7345a46ba8f2cfa0bb86cdf8b7fedb5af3141797572b8c74eaba3ff5ba3763ee3ec8f623fe10b172301a77dfab931c3f30d6bf2bfd8dc3cde9acc3b64c3f7df54888e3ceab3976a16d214a716afeaad3798797360e423dadba63bafdd586e5d2fd9d1bb011921935b24a0bf2a1835848995ff527bf8e593e01a3b80b09388bf81509589558ea6cd947c5e91517649f39347db76d47da0eb3da51d56c98fd2fe36be3e97a9fd431258e39023c3443851ddde026cb76caf8a780909cff3c556d7392b04e3f5bbf709a7953406b1658d86c3e759372da61e36af940983583504b7d6c9c5aa91842752aafd8d1a0482b44612c4a94162f5918a959baa92bf015bcd1cd4d66c40da0519cf87985041963a8a56472c6d5d966b8a497934ef279f052d420878c789d5700da812aa779d8406044ff068c8762492111fd62b4bdaa4cce6070c1bf979161cd5854655442111435b9d70565da6bdffbeb4fed996da58a46690f4cb336f49f63009f688a8c2ab318a28fefaedc8ee48ad4ea90ec8a36945e3106f8387941d2a8522b69c783d62964dea30cdd183a2df8d122d1c8caabe834cc4a54ed02c549d51d65806f2b25a57701ffe3af6084b3ff998556476f75ac59103558f2831aa73c6f052cd90ebb31252bcd1b5bac82dd16fb526a315d6cf40ed7d8f5d7dcbf178b764ea8aacd4919df54bab883dad176ded024a8a1dab5a7bd2f217806e80ea412a2bc6e8ddc9cb709786cebfe7133fa7417ff40ac8f57209c8083eee720ad6dadd2fac083eeadbbc0c2dc6ffdbe72748b72fc4294f24e0653bf2432ca020450717ce65f2a5f35d95ade716b2d547daa37a5cc3a7cd96b112e3064922fd043d4886f0ebf7f47eaa9904cbbeff230e2c2049b2123a0ddf57caa3afd31c35dd104cdf78db6454d0d4fef1b3d5fd206cea6215135328ff37740c2141be070fb2c5aba35814970b4839a345cbda187555c76c0753cfbd229f4e0b6e2482e125dad262ac51090202305a562a340dd4e5ab450bd72161fc8d61a899f5758ef50f8b5d9d5666b03b86d0ce8e6a0555ab7c157611085eb44ed23c2fa90df5799b7be69d8ef3d782a37e5c68c1f7fb987fa0d529b3e7afff86f1ea908b9a2b8dcc215bca87f03e06a26b01056ed13d04a2cc31192c65ee0e3054203b7c4be84bf0e88e43d874ff46607023ef425d0c60566dd1bfdb362acc3433aa690b8b08ae092aefc1623794498ca4b9d0cfb71d0080d031760e52d5c1d63ac067eff13224ec391dc16a2aba684da81c5f39a2c8c01fd83631f16106516d62a0cd0c9c2e176dc333ac4a81a293c756db166aa5784ccf42fe8f59d999883572993a07039a5c0282626277179a3a01e01effc84204f2ef5b02b26d2fb1a5a902f9e1cc7402f4cbe758465c2c0666d1ac1f6c1cf53cd47d394656854e59ce25881a90348746a2e5cd5346f35170e6b9adf9a0b714d97af39d89e67d2ca5de1c74ad00558dd5682708181add4dc3e9f4a0c04d156fb50ad69c4e078d3d6752473a9e2723ff30cea21741f58d7d8bce03cda24cf90316254a090f5b5ae71e308c78b063a08c299c2553d548975e100884afa9b8a3c7322b8d1d4ad6ce99a8551fb5e80309542840b4f059eb9d115cb3a9efe03a891260dd5b35edb0f8123336d301010bd362f2a5ccf72fda11d6a53b861c9126b40492573e256899949cc12b1fad906cb73880f6b6a16d6641411a5388d8e84a50bf8540734151fc9f8ac909e87233b6475981489892e32052ec5ca16b4c38668ee9eac990809ba0a252854800422166e03ac324429756cc6d73b1321a5a0e3eef8540d8750b57423e9293954b8daaab775fe71b538d850b9ea6ff426de4d45813a5313c621170a1a662964f2520c764b0531d4ea20ebfdbce53c1c4d1cbb352145d70bd51e95bbd9e93620111d121d6825a43e3174a4f4119af4c2a2819c46906d7486a621fe0946559a9847b65c4e6d0a0fa72ad46dab90172bf00d3c6c440c773e04b1fe97a8856eaa5175e8f488610320fe37b7babae768ad899cb9f3d07112d45e10b48b5e2aa37a74b34ae6fad2f11dfd4bed5fe714485c27c44f3f38a5da983df7f005433d494ba8a8cd095ac796154096dfaf1d9206429e9556b11ce1c66233e1f39d85e2363ff4643b772747bc7e33ce93923f2b075d954e5b8ad0d1cc1bc78884d45e0231dcc4c3011ae2c4a45129cf450940b6cab3f9e250f8a70af0ea69e04e85ff395d8f50cc3a53ec229fd3dd2e0add0caee00aad060a2c81d16266c428068df0bdc0a2f6530a6022fb75e46a676ef435123cb6fa3a4aeff571d8d256df8556a98f935d821a16c880fd34dd620006ad985ee7dd1cf7f547c77729e01a20db8e9643f283a5d00a79542d4c465dbad0b2b266aaacd74fa25d23268da5849436a0aaf6cdf456f3f561a8b2b8edf7e9a1936aa771852d7c47768ae88b0bd1ea96c2f8583bad27ade19a7482d763d371d32d4eb6c1ac951cb324d5e76820472ec26b0b86c2fd558e6eb731a1b199cc4dbdbc8bf4093baa52ffe367988734b306f1e72632354db70ebd7a98c9471507b6344e4cae206e1c68796853e022e6432f6bfb6f916537db46968543d6d0796d9220de2f723e0a7169a7bcccf6c63a96f029ba05f3b67fa567e6a98b9199bb23c80622abd2cc0d9234bc2c49cf67e1f922eabe14a46204dd4e5f378191f6f82e0e86bb51a6b71edfe2c449210031f6e4fbbc9cf99f6a8b0a96bdeab57c65d3365d77179d6f93b9dae1b193338a17e4d0a6f86464499646fcd3035075123f867654e6cfdb43c5db9cf4b640a91c94df7e1d6dc3275eb0125b8753633879f43ff6be28ab445b840b5f647218f7bac84f8d8800a220f045a1b7382f1ce1659d8d26dde52704f10f0f3b4442b74f135e07d025e82a8d0a283dc257d9087adf773567054f932bd1b241f54b22ee3b5220e7a1ff7da833184a5150a8148c4a6578d3db732de024b03e7edf77dd038284073416d201cc58dc9476f7b1ddb771cde246012a252cf909ab331de3ed67a6de273eaf81d6b84209ab0a779b7f4a5047603bd5d4a2da10d971a7cb917ba55f3e2bbf4c65ca4ad5f0efdd724cd4a01d9f5737a512fe155366d42d555e6fe297f61ba981fa6d8799529e7446e30b19ffdfe6a3409e584381b4b4d4042286b001ac114053f307fd03666efed038af32e1697786310c2e0e5cd4136a87423c9cce3056928351636f7aa77b10a3ffce918f4c9292b8ecd68cfb2f215594768e212d4e0f52d50a229ccd01d8fc7728acdbb56a2c27d011188a58a5012d685c064a19f32c2ad762e16a33c0f55c09f2f5ab7d30db742a351c0fbd37723a9a007d1e715420f5b577d45d6e7014bd8bb9b115b14c1659ceb6c29e4419b2b127cd3ba61bf12cda19009841c21db53cfaaac52e4f3e15431c64845b98758341e60cfd80bd8d61a50bb5851639cc86cf505ec63154f42a523f74b568422b11d72fbf14708246a9621aaa5255287e9db6f47c40a710df93459d850948ce90cde2f799f6c4a27df21474cf3111904750daf99dbd320f68b83ad02e8991f46465de9774e6cef2ca557a50eba0a97891da70398e309705a0ac2c31bd53e120e7852481b8c83bd8b61e238f5a4f22ecc14288b165e220e44e0f1c06d3421cb32b6e855eea59908c203ba3063b5332b47c3fdc79575ba122d6834bf3f52f4e131d0a7ae0faa90d5fd251e087f003a503bf47a6cb2306f9ed13abe804f558ecfb5606f44bb9cd81e4ffd0e94a7cca5e82c1dbd94eaaa0997e314ea867570a4416f1ed66888df1cb597612bfd4ad0aa3304bc34cb50fbf419393112803497005224a8d3b5fd07ad515b4d09ff23c384a85a8ec8855d8921ec92282ae263b0b3b12263ad343df9f532e2bd7c1048a7915bd39d9ff88172899fe09a3dc6505645ac482e368c8d781a73c4df29e8e0af6b696e2a918d1ce0a6134043f8f5ef8b151c1d856b68f67fa8733715c6a7b1b44decbc45f5feb0922cf8dda125209faae65f887620c63b7aceda27d1c03f56d8e43cbbe3d0486ec6fde318f8a0ff8a7863a19ffb254190f8cda86724a553ef00990ee2aff00e525346f5a96241ac4c8ca4175b3260f3a01293e207f7d5fcfb76474f0aa8266238fc6f4f88c818357490fba72d20bc9baf003587bef4e97bb470d187127882cfe95005389a6cdd77181649ad869f83256604d2712507c353ed04d3c3130a46c88f00adf21cc5d4c9018d0d9a77d05242c9b9f0b0e67012a3017baa6bdff3691ef4bc367e303d9141169f271fc4098222ecdbe5b231fc60ba4c9c4a5e193c67dd7a87da089f75f121949996fa1f991bed10551706e072abb0bb7d4f02ae70156913924a71b95f6f6a188b6006421ab3781bd001219660ad1576cb6ae70ce5ee5968672bdfb5b04926d125e4655924445837d8d171813894e5bf608543e8f1d3853c40bf4dd3f6dbec614383101fed99f5a01ddfb063586fd7ed0b26f40fe54f8e023ecaab8279ac15ea8ed63046382f279d7dce47dd5b8d8e56d9c99c05f427dc326c0b9e5c14c826489e5b6218af154f833de7bed3758f57dca67d5629b05889899225d2883e4510db2db200d9c4effbdd64b7b2771159e5eb40228bb9e37bd2b6e34ee7610f08c6cead879dd0c61420937b117d3dce2c56159333d595b7c2d78f8c199535c9f2126d402251aa5115cce52b3d30e12610624b6e251e7c0e9cdd02bdf137f96c9e1dde78f94cc4f08e3ad092501006d03aa88c27dbbd235a6ac3e94f730f06f8c9d1ee3bb9e1f37ccef4391b7380ebb379d7033033d35a6661110537a0ffd434bef75f05f80ebf89f5f07515111a667df964cb5cab84a402541d3a36330818b4180831f9ce72cfe19c8ef8dedacfc96cd69344b7d5a8c84aacf9db0f224718b56543b2354b80be9f8d9dff9fcd06af2820923967fa59b4f2d7e2a2381fa80e0f46c63c2f8ed2181f64e9e99fcbd836ccca51afdce3df244da96aff7955b0643d29378982dd8a6b3b4568799f70b790e8b54976cc709fb2d21cbf4562d3723a9879efa245709249129e68a2e9778c0501a47dd10205f2b125dea9e4d54385624b481b25a61675bcb32b7bc9ef3b864ed43fb2e8d77f089de1c1978ce72f2eae37e0e4d49d0ba7790bae58d18680b4028c9d28932f73fc685eac7db735e9ac9238291482b9c089b78bae73cb37a93fb2ddbaa8072c37367259ce6f10b492fa87c6dfad183cac987ad0529df118dbcd8821f0e479612eaba49c8ffdd94666b2eb773e1432d929183667d44ba5f80aaa0dc37e0518db51a80b55ece22af2d77f868fcd0a506c20a67eefbdb36b70974b8548376b8cfa5f3c0f13496c3e7a05dd919b952a8bd3cab308e8f0cb29cc9207c37df990619b167951a62a41926e4057432dbecb766650d5fae9004a9ec88d11544bb0064ff07a5665f3faa59fbefb57e610115618960de323f5d3bbc534ccaa97850881003cdbc3d21bd308cbeb1dd1779a5581f63bbff6cd9b9c6f565027615e285797ee6dbdcaee6e733beeeb59f2c43656e8552a8074303d4165a214fa918fdc16efeeef9d950363db441764122c60343c93a31e11b634dab351e35fad2f2d01930bf1bd037d738022a93fd06f15d81b275f79ccdad1555047bfc6cfcfe862e19d181a95c0279ce83e080defe46ac71a3af4855ea4ddfcfb6344a53f3a2e4bfa29648757a1eb9e5c9c52c1f40c7fb2da5a025cecf2a06c023fccea567fe521d8d9978ffbdce122923d63504442a6535f8c86a4b19f5d8c49c27076a145cd9bb1f2f80958fc005666be5751545624d5398b0fad8d191cc89a05396fe37b142c003dc77a076eb0e9ee2002798720ce66336d138d17ce5d6678177c8ad6f52a357f50bcf22c5c071ebdf0b268c7cedd61bf57a2ec5d607dae30efcc619373909684cee288f236a68b77e23c1680ca5047f47912a4dcdd848886f1dd118ddd2c58295a05c81b2a500ce8dbcfce65a6704bfe6a1f9094ae7c074032017ad306dc550960c924d74cf50887deab5c6ea8eef44d99043b3d53142dc42d8adc722263f1d43d1d0e68a233c25b97f38b61b68b6ee715e4874d03e70226de0b6b49c3ecea5fb6210e64295721453538d187b3bbabf2d974d8f7f38abb129d0703b8ff4ed38fec434f3857ce49db3d359030d633b02f219c0cc751f7499904c74185012006adaac4131de844287bc2e7b46c80a4314c5a9f61b41806a2858ed8e665a50d296358c39f727466a82442f37fdd556ae07b615720c0e9e7f4a55241e4941ca346953fd2853b6e8014c9e9e1b78be4a568be8480118cf1fb559c6f0141a54cef4311b878b7b41733ff64be58fe136ab9821b0953a2abab81e1a51df19773bca4930e2d267b9fc9492d257028fb72536e0d61a9f2dc1f5283c27e668e07da533857c9e2130bcadf6b23dabab588abca7bbb35cfe4ee59b768da6e013a2c11c65d2de29532726082339347db743e70a0d7ab17c28d62715e07bc451106c5d6555aa4e2c359b5e057198712ba0a9ed149321f4bc4debde59414ac18240255641069b6367ab9b15349d4f09bc1f6d0a927c6a4607047d45d454c23a4599424c70d3427dea15b496889dd5599b1085ce83b1e99af2613e38a7bb46e879cd35dbde6643535bf2ea61876fb76d72d6755a82b1615370aed8ee6b99fcd36645a4dda77045556b16683be759685af4be6a62a38d156c296f3b6240ad8e34080b739a5674b6eb3ec97ae127a6dcb41f7392392726126716e9010c2115ee8bbf6d0dda79d7d2d2a4f7fc7f45c6382f476f6a45ccdc04d6a1de030a50c4bbf9b67e43d702c3b5226e421e9f35e374c5d909e158ee34870ae37d87359f4be9ff8895039e8d1a147e233edbe537f1393119584b7c5ea40e03af700df603e8e5f54cc09cbae0d97a150ec56719ea421dd292914b9cefe90fdf331ffa20a9f9a7831d1eb667cd035acd5e360f4c6faffad8da3da9b0554ac0b1a3874a69a6e35135cf284dbe95b03d716a08722a1b2643b2ee895d2e8ddea05b92a7da6020d482064206072d175f9fc2d4098e02baff4f0f29bc99ed2b6615cad1ceb265bf55778d623dcf4078fabd22062da3d1944b81f35f40f7c306264648d1bee689f51e8a4fb8f0ff6ba2d92e5d1d20e0ec91c515a13a1fd591dba6041ef77b07c9c363d4006b01f10b8a025d6bb9c5910e0dc2f111f5298705aff0aca5894310fc5c7b19722b78641a7c16cbf2e2b73e0faad6f6a7b0aac997dda79a008f011dccecdf3dd607bae52aa895c74bce32c98b5b70d0c9b241be7d3cb0a0cdbc88b19001ce5d5e17356781b4f7fa3530184f084f3163a2398ada27bd966b8c6e92e46203a06edc8a8adb28fc3f0d70c54a41e3c14cb53b3df28a4b2556fcdae169b12cdc2609516305d5a6743f19955e29684ed910f600e6562700f5db7b4594390067f075714d94665e9ee0b028152108df0bdccad92cb5b74c1cc77e58a662af6f0e56b673926fdf6defc2cc1b2c8fa0fb8e30c1b167e1cd33a512a70ac1e81334006e6481911341c33a2741e59d7ef69d467b982f3017636ed6973b3e1581218cb9013a447b02f62813496a388ffb5c8d477969c867406c1167df8100c7e393a2799c14194d68d6392673536a4c3bd81a15c757cdbb64a4605a8d8a97cd7cca863f1f508451b1a505464f8afb9b53e793a9977e01b22f5a1ebaf1b4779753e315ee145ffe1382155fe760241a9b57dea5ee50c8832b5a4a91f91624ff23b416e96526aaa5f1ae2134e17f269a8dc9ced28e920c2f0de0e048661a5b1a4606e47344b37450e02d782d4780fd188598f12892f9c166809a75f082a6bbe5dd58aa59198d00d2599d84bfc1bca31186ae50c118569049d278cc6e6369f54bcc7216411a89cc942364097f03264b79a366a5302eac2de0e3fb04bc82123709da482912d8ca3661be1e3b4222270b0c742005504d47a8ef873434e5e484b23e21630ea656aea2960d4dc2ab907cd896a60e698aca24c4fa2b8d48bdde92fd93704b043460046c25debfa12e4a7fb0112f0325799c6b37b86c5febcb72acb71b155aa7c5ab582505c446464e524e2bed3f5b209697a0e2a40a835fa017192127a93bee1a2b367721086c60b0d68a86005e037e6aa0732b204bde4ebc4877c6753f47e4a2fcc1386b1d60e8bb6d2bd29329db813ffddd9a4924d3ece011487747904848470988adde7db9a01f98cc811bd23f4d323e1fd2518020079df253d0dfbf2acf39db5ef08bc32795a80862d7ae0d9b2cc66155c76c492b5abbfbcfc517790d5c2830d88206582a5ff711817d85c7356aada9eca9ebed680afbe535ec50ee0290e7d0b3476bf8e046c187c164f3b2eefb15f38b646f9dd4c1042306a765fd0b1ae307d37d152673a88f042403aa9481d14a8f54576cb769434bb24090c913ffa39e0a6d5e0dda80518c479562ff55c313ce4275835057f05d0d21f9770c3b19c00dac08ef2122531888e9d8438e53e017ace408b070b74baca8869eb4225a97bb3ed958d2a0ae3500fdf4531a23d1997bb0fb7923b7bd139fdb3c5a00509c121e5da12c44d1829c1067a42dc3d7abea09b2142d0936457dc4637f8b5bbe31e27b5a919aebf4cdd77e843cd932e2e4d614268b4a0d37d39955dacfab19c605a2764fc758e08b73078da522578b554e7c17c8c83fc45a415987853ad991e2a139eb789fef1fe61cb7d95a99b72429aad52ba1f3abe267645276009f4b54546f04413d0dfe57c4a544bf18021417a8920c355eab53953eaf7ee65a5db3370f194520abd2fb99584156fdae8055dc892e55fd72adac4be9fd457455b66d8c8f371d9b3a46a86f42c061dc5b0541b858b8e31ecb57e761cd1ba01f9aaef345ba33cece53433bb3c8f835242ba834616d06c3b6d75969756624281eb6059fe3c60683ca211358c8d3c8f6399d720588490fc59e3c9178397c4e2cbb7facdb1666f7c6eae04cbb08edbf8b80b86263dc99fd7e0273269a40bb6c44c8fe59e95024799fba17a3720d378103a7a002d68c99eaabb23330b586f5c2a1331ecd5bf799ed55ef49e770d4070884a2f7f28bb7e4720d4ae2b49f747090d4f04a483b137ffe3b9f8339426f68ea39b03b4f71b27fd0e6184c0ba8a99e2c800cfd6a6ac818922c0f8b65aa175826fc317dad0b1e4f03602e1ea331a52e3d6fa3e69154d223b16ed8e95df075fcb6e7b11dfaa8d261a8b75cac765c81139480087d02c6e66ddf58dbc86d2b6072136d7169804500c0f64cec47e84f315e1ed4e15c44b01a7a97773fd9d916738ed06beb897de8e8658e199bf6c3dc3cd97bf767e79a7291b937f22e97cb95b314791e992c9eb325c32c8ebb0a81f5073cb783548755cadf758773fa6eed12fb869ddb4176dbd74c9a71a46c44a88a11bb7f23f279a6e2919ea6dc03325413ced8fff3aa66ef7ed61f64af0a73e2cc1252a7906a7ec29fc755df1d74e8d1ba63dff436cbf53d0f148683da034d88baf31b682c51b9ad5174c1b9603c7f756942ce763ecf557acae10200ded9059d9f2f337bed276055b28a20ae621797bbd57a992db8961e8ac8df332e434583b3fe3f9848a6093d58279348fbab0d6215485e6755cf11c6cff5fd928f30e67f9b908102f7fcf7cec99bee70233a6b3782d58d3cb4b553e73f62ce14a15c3c1e826ecaa61148d3511ba1084db588c10aa385b7b877ac572e0162226b64b11bc4ed455cb33819dde332ad2ea60d26b349fb964ca38d87ebe7d49ca94f1c1057c85cf35f9c6ef31094534a64e24f561ab9fbf706cc4164960c286bcbcac5d4e98d2d19475bd2c7774ae211a01f93de9fb664b5b301a8ebab9f62158138fdc32f3b2374f14ab136a3ba839f7f095942ff74789b7ae0dfdba0b2db177ed7d651ed3b363bc96108cb108921102e2b31a93b1d6452c253188f923431013a283577fa344dc500b3ff0f1740d1022ad282d5a11e86bed58683807c97486f258cac3f8ba08eda568aa3556335a146499bccf78f34d5721963a08f3d000e380d38247a5171cc67030b73b12fd16642fa01cf1e8097f1821ec9a6e0b88757b1df42808287419b862f25aef848c45daca1d03d0e082bca82a1967176045870f008aa64bd119bef934cc987747f608e2077dbe13b7fd8ad6924fb3a5a22b9f5a770883a4521c7184d2e0e0c25bea6ff8d0f74ffd2d6ce29272ce6339db953b3c96d02a5c1d0de81d881ea3bc703c5f12d0f72606104964397818d50376053d220e1e4009c0d3a996d43a20d85a7002c1ca91915101198bd5735e794221267611d59379d5203ba3da6f9b502deed70cc930669ba33141e8914c000e264696886134b63651c33bc30130f8eb92671229ba7cfca9255faa55164f667a1594999ef477366833429fdbb7f4070b6005ee6fc73f3538c4882694f5bac8e7e3d5a5e74f5711e348479e16fb4c00b4bc9083548fa381d4c220f38bb53d0b540fde9b746a7e5419580757c78e6ed40a83385a442ae3c425205213fcc9b62721b4b2749bec6d56993b23c597dd3db0de52b7a6dfa22a39cdfa8713211ff1b98b6d7cde8aa776ba27348a7dcd6218c28046cace6779f284b5d7f352b83537e484b00bb3bde41af46b105fff152a1400f0ccac7ab5a340428b89d4db15f0790de0a5866933abe5564ec7de4a0244991fdb05a2b8006ac4cea019f36e42e8f160c2c084aa8b71ca41f5de42aacbdf921c5be7be8fc4919c4bb7c56a8f8519e3fb08dda2f123c8b9dcc80949b9c7788b503ffb80ce41df866f8516bf8b2ea2722c1632ce0854c4d7af186e40e8e55962dac76a5977aa920de7327aa8fbdc29b31aa2118622e17d5112f1d0937432a9b9aa639afd5441957f76402df3fd0c47b3dd0163e7021ae659c12ca6b21bc018e7b026d1bb406fa75037741976b19ba2bfdd83262a7083341f1469b5e6390604efd157c9b64006cbee9a9f6d11d8f19e896375a8e75f40d6f3e447806119b95d4886d83228caa97359b04de5ad15793802d29eaf5379ca51aa51f5394f8226a34fcb729a61b7fda493146e6786f916e51e08f503ee0e25f76c0676380f0d3cebf4708fc7644c1928fe1b2aca6bfb0bf405b65de3b28f381e4d81d825dc0c661c01c58ebe274f2b36a3212e2ab4d4f7fb70f5877484fd83a1a563cc749916dcbce5890ef6314aca041c88ba1430d9c79bd7ac4362da9e0baa9499684d6b6f370622bdbb65ce879db96898e56de8afe112c75fda7ce797ef0e83cd113d8b663b00763028ccb2a66995e9e205919e46e9923ef2da929938102dcb538aacc1080ed2eb33e62abf2c4eb5e2a0b1cc67b47458a4ee9d20b5578076af8718f96fbcd42c4453c79a6e6818241fadb1bae032bdb9da1b32bfc3aa856edc5d6e13a8e4dec08d1d98fb03df2f711d269f3286ed394ff8ce902edb91435e0d093f01007e00fcf07bfb1868d5cc41b768f06fca5d56ad3c349d082d34923763de7478401152887482b80662ebfa9f6261d64fb4ee8d46a47cea5e5c5ece50320e8ec97793a53e0419756b500d85958cb9b6c93afbd8813a1eebda4fcbc5121a7e5928d0ddb707b4df22fa98f29ccef861398ab41b8e5082a5fd85f0c634cdc28598f4545df39294b3f3764babc6f0232db5c9f0aaf3646be36da3bc453d71ac40a11b87029b380af08dd38b5e8772d4c8a1611f81f5736a8a68aa9cab234b0f428cd8bdb6a5475582d2be6457dd70769092c3c4d7b1a6faa023ef7f8e4d06b8621c4750656abf5552a87c1bf8a1a4aa501b466254e7326e8c6555aaf39693495ff8f391f63ea14d9bfd36d047d72c027f2c611b10f7e3548ef8cc2603a5f21c5feee0ade5048b17235875bc53a50816754bd0340f0064d7ea128ae197e0ee1f2e826f9ec1109810adfb2cc9b60490b0876a67b4e3815d43fbb9d2dc753df9f228e1a0645e900acb66f45de210172890a936975820d8039f5e93f4bc8c3897b2b66e0e683e49e282f37c0b17b5f406b2a368730e26008f6355e9596c764f64e3596dc9b8a30f135db96e24a8e5919cc85803e380f35951404f987876a309829d00d0a56612e27d908b4a6d233ab7d0e84184ffcc4051a52ce45fe7730e480aa17fdbe146cb7c391b8272f41f7a031f96e6502c1ba42655d08f46d3883c6d2a6768a9927079fb8a2cde2346eae4d257a8a1088fbcf7596c9e4cdbb1ac3266885e0c17d4da268e3b22ea3905888ab84fc1d80b244539f1a8f0d3c68dc5481d611ff4f28cd64b961db2e7688f5b73e17a9ea187d019a9d1cafbc84286f65d0f3ac5c6ced68449e6d4e16fec6451c5e706ed6005ce47eaaf23da6bee3f0e85b9f1feb2c560c9a1cb150df69cb8f3d08c6cfe8d060899f1235b2ee95d31ddf2c1409fa2ec2fa67ee65d2df26580a344c133a2bb111252e825401c86a19722001fc800e41d37780828acc73a1375aac2bfc56d02a1b57c02cc01fef234472f397f81704e3e082abcbfa6c6fb106f9a3ff093dd603f086c2b80e987a6b45ed690e2f8640ac2eed2d0a46106b05c16058999bc0153bd64d84c2592e6ec714895a973f6346029414033a5ec2765c40d855a503f9594dbcb836f0f782ddac1138a3a18c1ec762a9708a0254efe4431b48cdca032c42687673731dd80db7da7b8fb08de5cfd0bedbce85a3e316ac65151741f14ca5d3750b7b3d3b3ec941364424d97bcbbda59432c9246545076d076d07eed4e7ec76da0dbbf1a8bbac3bce786473f49ccdd9ee6963a3208a7eec6677a516e76e77977d5dc6c002430861cced22cf095ff017f193ffcd77779f5f37a54bf78fbabbfbe7d58010e2762f62423084104e3b63467d4a39a54b4f3664b9d309e784744e3827d4c25d3a75af743a719f7376d09db8573a7dbcd2e9844ea7d387ce4aa713af743a711f1f77e25ee9f4f14aa7932c7a832b0869a0d6ddd229c417773790efc72bbdbec71871224e0c41ee586154cd3969751c9a0d14c9001ccaa6676f2f19715eb031e0f0102100fe9b17221ecd0d0d45744ca744707062763b9ac873333bef686e349922ff30d20517a95123f2d88fd25247459c488371b8a3121c196188474017fa69129126ea401afd5107421af26550f512102c4ee53b8a5fea134a7ea90183846c73fc1c32ece8d3fcf8341891e3df5079e0845c97c8f5a926536d027890e484cad3499e109e0e800025ac0442c210678169955160310692040653b022891d04f9011640db155260a1891318d1f30397ec4a2015b900d97b8234911d89a4a1a1a1b9514205d995c8fe36c32513cb6b33b22fd1823c82ec5f23069806e49041872afbefe8136422fbd340810a04657f0cf409cbfe19c8aec411b26bd9957092fd7df46906cd136afa24c3c648f68f4222cf91ec4e24e230f143f68f44f80e1345c8fef1489f2015d93faafa047774b0939d07d93fee4087ec1f95f409ae6ca61005b05304d31113c10bb6ea41043ab0524230000b9c22411820a4a3faa1a504100cb022478a20543b3b47e081015704e51d26371b102f1fe4e9ebba749040a2029c65b88384121b20d113041254602d24b4600112449949aa5f9c60c2091dc46f5142933dc31d2776f2f72fbe046c5c82f2a58635e5902e3920840fd31290300859f6cc4ae594db133866393a13824eb7a6bf9fb9bbbb7be6d7357777f71b0f8766edf96b1977b1cb56df7a7066c30524b613f9d18fbde4b0ee87fcd9129b73ce88531fa6e79c73625b0ff0c72201185353639f3ed474603fb18bdb80add4660e755bcf3a60737c538ed1658c5d8bc43410bfe5bb440bd0e05afca4e4f7f603fc79053cf61ca2ba0fe1e3f8d88a04ea5f3f837dacfbd16fffea7e20d9d16fff87fca22ac678d9ca792cca89aa0802d82613441ffc253bc6bd48177716980cd0205dfc2d97e3be7056baf8cf280305fe609107faf4997c441ad75153737dfd1aeced5f1d97f380dbeab5e731322aaf2c306129c8c1dddd8bb8aeebbaec13bc480e16974cdf1294bf7fb13f5c38e79c2f35e6ece67c88b144f5d349e98c10876e497361cb676346e196f6b08fd87d98a694524a695349ffd2c7e85fb652dbdc1605a52b37f4e953f1c00628c556a2fae9afa8401b6e71da9da07f3da3407b9409b18364da20c8346e1163ec9baf712e6907264aa3ada41de0ebfd8340e567d3690f94f4255703c7445f85297d687b7a249c144e1a7bb04ec7c6c2110a888230d2a845a6d18a18844ce943dfd11eb51cfd4a03dd7c80bf48e9d30f864f9f3ee893e9d33e457ffa1006b4319ffe4513a5e5b9b00523811b5b9100fdfe1964fffd19e467df7fefed951b2b3c3ac3bc121f7b18d3dc4afceb614cc6adc4dcb658953a6cb5b556d833b8d77ef633d0a79f753f90ecb8dd4afcfb6325762b3ab2bf9f753f7c2099e107fdec7f20d9413feb56e2cf0712f3c37ef6f777647f3ffebd3f3b1f188c8131f661cc8d9a4cf7e0e18098fd7bc86caf63255a6e256a72e376b4077f5624903dfd19b2f9f77facc4b74f3ffb19eed7eec7ececd39fa1fefcd7fcde8cab924a18733918036364062ab035815b16484bd7812db245b6c816d9225b648b6c912db245b6c816c5872d97077f5eb63c38727609964f866cab9d254f72e3219fd3f81119e19779b2c52245fe5a240bee4aff4a7d9831acdb767dfdf5304dff93f6d3916bc7a388c308638411422881f4f41ebc61f6ce1173d63972b13bab049652ca187470e3c3dcdd57a7bd588772fc89f507d2e001c7d8c187dd156285f5d825f89345f5672872b27583ebcf1503351cfe4bf027575a784c937680e7d38f346a3aeadf8d8579b42948761064b7feeefe96736769cf9f72d3fd371ffcc1a1fc9fdd409f3e161bfa144f51478d7c6c2d4ec44418ee0c81a6a80918ee0065403af80918ee00d5e4fe4c052b77770e86c01a1d13ce7c209356da7d25aae1c84c32b6c0f4617bd6b637bbac3d20b63d6d663ebda1f3ecffe25722b224a5ab22507b92e5d3de11b80912d4a43e4984489fbec892421a15573d59fe27877c9047b64b93e9dff35e5ebec8e2a173ce3929a6efd4622ba555d92b7e7e32dc21c24ffe4c3f3ad92451912732d9a28585504927083d19ee04611559d147f6b4d792c90a509f3ef983aaa9ad9fa1050449548c41d5d81510689e340a45c5a44f70470835b93fb2e894722581fa14a9c8fd72d52b198984cce953aa4fb2a64f387da272c84d118eab3ef1f409eefc0c2d20c72947b0454a295dca77e9b78656ffe272b81ea3f47a88713e80c45c22904077bde468f7d979cd4ec6559fe44fae79fa34bf27fae4f8d36a4f36517b32fde407fc99be6ec59eb8aa0f8556b266b649067d8a45c83093b8191b9e9e51cf903ec52c32cc989bb11972836f88e85314ca308fb8191b22724839407d8a586498376ec60628082588489fe21519668d9bb12182938293a44fd18a0c73c6cdd824d129e928e9530cca305f6ec646c9cac54aa84fb18a0c33c6cdd8080dbd188234609eb161d2a748840cf3c5cdd8b0320c8d47cc33362c4803e69821133228cadf2c923348ce21e937eeb3ce5a5dd2b4d7fdc4ae74daeb4f02a6dd1775644e0df0d743f2a6077fb148a232a12189ca7e660b35ea4ad22e3f1275c59a2fd6c8d6b401b44a90a0f21a470f17f68936ceb57dc2d6a2dcd66f0959da718840ba65eada3ec5f852e3bd5abb6fbeff857176b3b3300688e3d0dd42dd1d21b616356dfdeeee865842d143c9880b03a4d1859e1d3dba30e505694c1c305b48c37d4eef2774df0db685fdb31c2710ee67e9ee0d616b71d3ca72c02844b853600d0a95265e9670af2dda5dba4b6babbb7497ed03d3bf6081ac954e57c97027892664cd1652ac5aa0ca8114383b4811847429bde7a4b0096dcf8d81f6a494d1bd2d36c1873bdedd33a248414a395dbabfb40767b47c52ba944e6d85912e50ca39a3e5a56bf7abca775a650b8b108e6f290cfee1185d802fa5745a91707777ace4561e1c1fd3efebfe152cb998bf95977ce5cf5ed8a71b66eeb730b6ec763967d4cc7a73f59a19f77573df7440739fcc2d65e7ee43e755e9bca4112655a062747a74f7b087eee3fa347907572d355e7899e18de8acf5c2bc5620d7f7899dc554c2d65daeebaad8e5dd75612423346e420fc3deeb3b867d20d7f70eda3aa90b2d299deed5d238804e298227b4c6455a2d33eb2f2f642c926240e8625d489c478343efbad7ed3e0f4078f96031993ab8c230ce192f2fd478e8e2d190b1cf3407d44cf1d6d9eec2302eda2bdbcc5ef6c22e369a257c1b3ff43cd79bd18bc445e8321a594da6e6ed2fe662be5b06bd656f783402d239e906d9757da4117ad7fc805f344e20ba0bf247679f693253dbe2d792fb61a6c9441bda451b21edc5547628bd35ea910e6dc22f5194e0c67fa9e1b3448b5f0189ca400a92d06471850f8d504c1c821424d87c986418608042d9e79c514021cf2676a218c2b4440e0d144d703b501c21cb67e9d3ff00069049963f8042962c27bc541c2cc1081398700fa4b08326a46864d3430644ce260410d7879406031eb0944da6a3c3f5c3d05dc2fa3084f9c0099b9aeab9a2008207561182e08166c70752f86107d50e3ef4a052810f3fdcc8a007213dac1c603c14b5e98994b52513cb8b1bd36572c410121cd1029d236ad08323928826531234785989a5686a2f9ae28c3109bb24071fae14fe4a570f76c9c5c3c5c375dfe1d6b2b21ddc28dfaa03fe60900ced750fb434f8832c1df273f429feecb21a3bdb9e8c4cda9391157ba280e3b74aa8c2c9c5cc390062713d734d66fb0b3515d8441556d8c4f8c0a10e2949713860d6be6a330a21f2448bf438502a5431483810b3cab7d6d7cc224ee9573604ff1783646b3cb0c701f3b57130df1b3b766e4d4546e53be6db19ed7c888a237bc8f5a1e3401a54601833d424460de561fa5a087158913f62c5d4a118d2fb58911f853842958a8142b0620a3d313820b1bf229f1269c5d02439311fce17cb02e63a8330d5ea39c0dfb449f9faf3a64f285fe7d377f1b3e4822bb968751231393fd23c4aeadb205cbf53b753d8d52929b38fb60afc491a2dcb324de67ea6c9647f214ce318ccadeca08f1fd3ce476472c54e0e7e1cea12866290d807121333b78028c731fd474110a3ce5686f1df24ca75163d01513aa4c8750e21d72c72fd89e4bfc944ae1307b94e1be4fa7307386dfa7473fd2904da6817cc14cc207235d518b5d65a697d98aed3a64a2d20ea25aa749fc94180b7c8f521d45e9890aba4b14fe0d8d3e483ac1de8902ef53bd97d266d06fa920673b011f0d51411f0075bddb16fee4e665128d7c749602c7f9fe1bd1ca77de894cb20d7a79da2e29334ac692369644da3f05b8b65181733fd5490fa5e57906b77d306d2a86f99e0942c6a289fc2f940b223e5694a57739055a8420c92c63ad5a751ae9f4ac763a63b7f1c307bedd5f78fc1cd68affefcc1712806b557fff360744038b02efed4875c11dc434850e0bee9547bae835f7cfd8b5d7f43a3f0d7df409fb2afaf43a25e74d346bad477d14169b18b428ad065fe9522dde43a5bbc19b1e78cb153b97a8e8dc2e180f92a42ea6c3e067717e79af62251d3a69ab0ff6c9e3ac09daadf43fa34fafa4d24c2d05fb5975aa7daab3fe27a487b55eb3e9bb32692eb5b205c7fdac8db7d164359df716afdd6220085b2fd6879642bbfa6cb932b93c0f13f8701fba32e94aca1c6eea3f9ebfbc7bf5ccd50bb2010f3d5458ee6a7587e91d9f665880b5b3ed3c7dc36bac12c2f51f07548d415c30b996a38b05cbb8734e85b26d83b1f4876d8bfde07921dfef67d5c9d8f8a8325184113633b1f56bad0f7b8440e4d0c8c41d281993f165adafbf6e86f51c0fd2c7d6a18247352f609ec3f9fa55d647ca1013b684caca27f9309dfd6419202cb2e4707d3de16050cff83aba6c209218c085b20ac075729b2144659a2e788d50c321d3056a4c80aa6d00321787a90cab907362dde8c276e80b8d7bdfdea68bbdbdb9fcb90060eb95b59eb25b6704bcae8044465a52872472625a0f68ae476f7e720aa71a27ce73eefcbe2d792bd947524aab7fbbe56dbf540d7bc05101589e29322727fb437c05f479ce8b0b7ca0dd9e065f931a8bd51965d048a114ab97d386455142e18b3d1e32771f8af8ffcc1a4bf31289348230eff68347a12f745a23c7a38eae28b92d193b627ed585193498f474fda9ef4b7667595f5e417ffb56059d470cc8f99f497c47d1130e93f5366694ffe0af0e75d425e9a48f2ca24920e7e4f3d00772ea4f31b9526b8861b626e826bc07f43cca4574102fe3cccb512ae75da9348c0dd726edded91bacf86489449ff7d2275df9eca73a80a531d686334e262a647d0d15f6c7447a36dfbd1b65d2ac0a4ff5cc77388720ada8030636f53570ab0e3b427df7594f489f4f27d056d6c2fffee901e937efb7b1f73f4459b21fdd66d2e9ef4518b00e95d5cccbd702fb4275d745e7bf431d7819871b7a33de944da93f123a4e63a9086fc8b08fe5aa51344946126fdc5b218351992cc9c23bdc67d9db57722fddbc3f48b776e7ba8911ea69d880be913cca5ab922ef2efe8e5371018bb0e0b2c984c18a7a08bfceae2257e59eab88bfda3e6a2b3c1cb38df51e67d223d894422919e8328d7812ef2494f8a21fd9531b694731b3de662cee48fb84ed29efc9195d7933c0948facf974879fba4cea6242aa5939d0c01c65d0da4c73f92a4c724eec6087776c4c12cbbcd1c66533d3c57d7e9313b9fb1e36a3590917421d476659f10616c1995706b90409c6574efe4c7517c37411ad663126e86329d634b8b0669e0689b1d47a75d191bca0d768c4410aac2c72f0c05f883ab8769408efbee6fb31af2457ad9fd62dcc6797b539b9172f6669cb767b1eba2dde740727b758576387fa51ce5123778dcb87123422b514876743e907c45fa67884ab0010f68fafb070e1d0e7389218cc4c88ea63b1c64bc809412626b51d4be95d259bc7329256c913ff16fb09a49e9000b2515c3300cc32e2edd8744fda45b2c685969036d408b311c9f6b7dece7df4c9399138031d7df58e4faca15b937cbe2e9c6783527c309866199c52c8661d85f8b59ac5e4ca85dfa47ba5c2cbb1986610fd3d9c55c50a4e6c3b5c3a5835d7209b155ece0c216e0071d629411c935611d2fb91fbee4f89dc527eef51b2d16b831eb19324a01e3d070fcccd81b8e1832bc71218dbddd780143f72dca282e11d825b60abbc42eb1555c422e2157cd25e412c155133b06517385a0b5e8337a6619e30f2a593cc950890c77b2d0c9376a38688edf9c0c2778ae20f798993e8134ba9b3eb123c0df4633379a3ec51b33c78f3fee2fffcb70369a1804d322498b6891cb0e4a26d82ae02fcbfae42581832496dc0bdbc32e8b5db6b978efbdf1c61b6fccb218b3786f37c39322fbce3e07b8fee7c1ee8e306b82e5d7bf90c09ff7f13d89b2d6629be95fdbb623c4482ded5d2fd046f6f46fc623b60c90e9bbf680feecafcff4675dcdeebddcccb5f2881d883976182703675d6509b56ba173090ded41a07cfd25674366cafa61a4e4a08c96e57b88ab04a3f855c8a08626a60019fe17e0e98550c2bcd9e992092c8864ba592c9bd483bf2dc36f850cb717212004b164b803049e3c454d863b44e849c97007082d558e9255fe0c5749d4206baadc4264275dcaebd2a59cfe73d659679da52844c621f3c8cd24929b883c6fdaeb160b2c14adb0428f0c193f2c2caa95151d1595a11831724ca6201830582f5e0459b970a12a957e52525a28283d24d20dc639a351d0b6e1689a4e96adee1d823660c61ee6191b16b401f3f5306f43e0cfeaf8734decca32b12c2a447fda6b0a944ba6773b27a63fee348832c18ab027d810d60423c286b02649e0ef0ec18fb6be1b1424747f80220c58939b036d9874746c4ecb23b9adc5d8f4de4ba44974daeb6f31657f539eb3c392f08898122810b5a0d01a72c29c42d29f643417507705b5e7c43dd77ab1dabb7ceecd6e184d91e5cb01333301cb975f69b2ff6de5a629b24f6e72669309a1df0297430b4f80395b784880169ed2f92db4d0420b2fb9d9827b0b2db86743329bf632211609fcd1564ea6ad3e7d9745d4a78f1ec9fdf2863229fab01e9f211963d2278cd5a7ef0ef9441884f4a907da803f9e5b67c50acaad211974f9604732a6b24fae9e9bef0eedfce4641a19ee4c5194e76cb5f864eebf3bd4f2274abdb7df03f8cf2480ff70005a7f2f9b246097d7d13dddf1d32fc000f86b5bd2e56bb4e7ff5f3519972e068fc3a596440da0fb4c02e85a5d005ab9bf8593e104d3b7dfd29203b66476e586771d03a50b8c0400f7c155c77d574deee7b81e9e9ffb6c13cb240bc96e3313a4499f22518699056e264893d61443f9bb433b5304a1e27d32849bfcd92128695464925b447d8a4ec830afc0cd04212aea229e3ec526649865703341787a648f4f9f221332cc2cdc4c109f1fff39d2a7d8ca30af7033418ea8a62a499fe21232cc2adc4c90243a5447a84f510919e618dc4c10a1a13a44449f621232cc266e260811393607a84fb14986190637130428e80a62d2a788840cf30b6e26081316c60aa2a44ff108196617dc4c1025415637c8ea489fa21619e6123763734495a97cfa148732cc29dc8c8dcf8ff6d3a44fd1081966146ec6a6496b6bf104488a28a288228e1c3972e4c89123478e1c3972a488228a28e2060b9b8cf3cdbabb1e6eaf2218b6a7434aef0efa5cff2b80ec28f786a125bae0ffcd6ed8d227fab33fe6e624f4688b53da929bbb628065ce470ee678448b392fc0d1a62927c3099e4fbf7bf69cb355d3c89d7fa1500d1310f6c161624b98e56bb93a38d265e2d34d4997ce9ec9b4719167f526e993567b6137d3b61126a1acf22db97801c31443658545c60a2c3cd765d97fbe2dd90694e7b7f8b437bfd3645a2da256006e0032cac97c53d6ae6ea502feb2562b236a54fdf9770019e53c93b82f6b65445cd692383795b55aadb8a202feb016d6c2885ad086cc1325aee26adbb62dc66fdbb66ddc6fdbb66d307edbb66d63f96ddbb62dfb6ddbb64de5b76ddbb66ddbb6cdf4dbb66d9bffb66ddbf6e2b76ddbb66ddbb68f495cfcb66ddbb66ddb564af98dfeb66ddbb66d1afe6d236d5fd264b66d658518cf828c182e8c70cfc20a3256626c294660acc480b1a11861598901632319c962c0d8326c4425068c2d1b1981b16577336282b1655733e25b763d33f262cbae5f2331bb1e31232eb2ebf132925d2fa55cd9bd7465873ae5b65ec315a8bd799b34a2d848c3b8a64fda4f9b9c5d94213779aea00d8903a75192c5ca61a95ebc7cf9a451d24ef9b2a84f2bbc7cf9d3287719e472c8a54f9f4a2f5f266994bb54e292c725932c5faafa14e3e5cb54a3dcde609c7c4279f9dd84a8f5a4256b86fa04a3a751339562a57e523c7dba2fbf8968d4b447721225597ee3f4c945a3a6b5c1f2e3933e01356a5aa1dc6ad2224a79f951a751d4ae704fa6964826e24896f425f6261b1c6972a3284bbacc37097d32348ab66ce8530f3cea713dae917a31b1e0d297a16aea5ba44abacc1ed9cb178026235759b6242ac32b9f9228acd54ab552ad549e188ba562a95813c31c73ccbd255198b5de4a49d4d56aa55aa9d675cd6b5e73b224eabae635af395b12755df39ad7b4ad56aa956aa5541265592c154bc552b124caaa542c154bc5cad3a6a4cb7c6b53f36b4aa26a4bbaccb716e3562acf7fc1451e954455968c9fb3aa5855a562f9cf84ed7c395a216bc96059e93e93a9fb30ee02b0955aa617ad52ab458bc132bd60955800c85030d58b12a642c154f3bb0b034bbd286129142c85a5f27c0ebbad124aebb6642bcfffcb05ab84c2ba2c399f051b55a64b65e7af5053ae14cabd52f24acd974169abd59af98b3cac186462759695e7afe460cf9f5c59d5b52a6955d4aaf06885e8499e44eda56e4ada14b5a9cb55e836843bd79644612ddb226d314aedcd0da85de66f4279c274654914d6b2b8b2f206c403079adc1dd69a4158cb84b530d6caf34d5a5cb537ff2a82fd31cca74fd8fcac2521bc1ea6b3ce240e66b9ead3b7b164cfec2c79286762613f7f03ead3fdf96d2e378523e79b4c18e3e469b1e9626ec455e8f56f5c8f986fb0b95db8336585e3733652d90267dff7592a4cc01ff6d75f4fbb1eee4300ba5591e77f2f99ba64fa1c446d2c4a23849700b26b24c0dce86b9c8d903c9f729187a54d37ae567165a170537366ad3ce9160544d99f1b15797ee46994ed6a079b499eacf6e6f7f06c4380e54fac8a61838a524a29a594524a29a536a0f429a594524a29a594524a99e0a6f65c47ee8f52daf092e1c796a13d6b313699decbd146ef0ee506587ecb90d90ff2d488e1e5056fc67f2ca51ceda11881539e04fab789258a4f32ac1192e1a908b6d92b8a62d6df296823663e58130c9169d72366235fcb8c79b5c4c89594eb95ebc76ee5fa16e8c119f0e45fff059eecd7a87d7bb1b5eb997495d8a7daa34f9dda10e0da15917f41148cfde1700cbfa1ff9172e7744ad617da853e8c44754abad03799308c91656ce993fd0a6d263519ebb27b21d5b7fed65311861fa08dfaf41b0878ca9e7e0b0151dad3118caf5315bad8cf38093d6bff72f631ce7eed5c6bb00e497d153aa5e5643891f269ad37feea5cb666b6e4c22b8630ccf6b6b438296bcffe37a04910431b0db35be7b2bb645780cdc7cc68796f17efee9632116ab3237d78be3f76ec514af944500dd10aa0a6699aa6699aa6699ae622e51f638c354dd3344dd3344dd3344dd3344dd3344dd3344dd334adf49af6a55249d3fedeac3519cdb314eeebbcbde310d12cd43e8573d17d316f9f524a29a57cd44a2958d3344dd3344d4b49d1344dd3344dd31e6a9aa6695f35194dd35048afa19034ad6a339af6303d1f73fe236edaf6b41f7150bbe11d6c0f4672306b9ccce436f9020558e8c09714420a299554aa2801f747f9f4bb5bfee4788c24572330dfe77b9e1dc88e8023507b30c2ee39b7165c6849105fc6b7a227b764b863051179488619ea7c963f3599197daa5fbb18f451089e4f236bc66a6d700d37c49c99a876a3338434a64a16f8b3de3c6013cb67d97db86b987f43cc157bfbf2bd17a08dab06ec2b02b21cc54cb508d4a79d515a1fa6aff91d8879f6bc50ce95fece315725388ff5c93106e812219c027f70f53954601ad0279f9a0cb576769c8c8c2db0ff0b95e1c47d46b91afac9f4e5b72af7dfe883d8d334402d5e149d39a8842c99aa82d4291a0106800002d315000030100c064422814096c7a922fa0114800c799a42725c1d49a3590ec528ca1963102186004080000000111a9a51003875e8b5b2974b7b89aad7caa94fe08db58213cb46cfc7ded1e1636de8b9d857f45c6c1d3798da8bd15eae562f8561dc1ac203a5ac6cd52632a0caa91f725cbe89c4ec7744e94b9181b89dcf3121fcacdc56d09830fc4f190fcbaddc8ed2f9e9b4cd009e49ea545ab955ff0fb91889b37c9241d725cac10d0c4be9354438779d041e52002c824a42718eb331150059d20175e5a70f22d18118d36670a4f035ab2056f5b1cf604e6d3aa16875fd2c2840868bf74419770abd730b7e70fcea5f6e217a44a4170d1b751ce76c3006be87d6d47eddf4528c88579a0ed4eed84265b24f89117a0c1a89d3c76360e6678813ae4e7caf3d3916889011f5a60a05df64607d21c83b29c31a5869529c9838e0685b0831df40c630a083d64e788afbde61f0713c18939e07f75c48c661fd3e749700579375511680b3b928c0c0bb7c15935a6b76a603c569739eb8072675ca71037782a6a873808c7a91afd7210ab6f7c25d7557d2d28600fa6fa2007703eee346ec0abffcc68191012032e897ef06898a680c74f545dca4cd1595baddfd2042627f3912e5f5fe4f1067f064b1077acb2da7dd3165e100fb2e3d9ea88faa11a038f4f017dda67eee82f807d3487367a6c00723f8386e2a8bae4544deb21fcce77169068f9771f97712e12d166dc38cc76a97488fa15026d2404f8f620dd2e467ee147c58444e66279648de65e55d2cbec7daf758793feb77b35cefd52cac9598215747a64c58790feb77b2fc3eebde63f51dcec2f4dd6b3856480d4170e1ef39d0c9433c1c0b19ae3122560ce047a19bdf69dcb1f252045c2699f83d8f151a38447173cd2575295b63283a4c63d7ac857a1ca08aae320191584f190f8a962935cadc2ce6638f80c2abf8f9e6d87197b125549d05f288fdb8c285ac325592b3cecf12f81182871ce3d0d0eab2386ae48a5c21b37c2c5ffb1ee6b489802ecd60984d5f4092d91079aa256fccbe57215c43d6f75a142430cf47892036302c84a8b2ec14a48a383b180c62a9986c0b528d1813004e441420f785a7468894991715c7efe9d36b5161dc14821a2164307c882822b5e13c8bc8293ab98c5ba75bb88660f50a8588463e654e9111af822ce1bfd8a28a04709c53a4c092f339a576032462b917b6349668ffb8fdbf872ce18c2ec77db9b9dc6328e17a2be74eb63961507c9933e8d75949ddabf2245c6d98e9bec92168ead225edcd3888f16ab99075f6715fbf937053e492bcb56152fb9653d0a9a34abcaf734ad87ab0d0bfcc3168ebd624e5e141f2abdcd12bbd21a8e554ab788fcc0f05ba6c3df8bcafbee03e893c90db80362520e8310190e0b015de98a2a1f17e6f54becefa4e4ce96e79b24b4bbb4cc4952b773ed36a90a458610d60969752135a86fea6947aff89af25892a273e0def14ee419cb9a9ab236d50d93b42523040b69a41f4460c8e88d80d648207934f9e23e2fe0a7fa6b2f02e42ca19a076adaa0d79261dbc86068bb036797921c58bb89599aa1d4039d930a421f6d9a4bc2021330c61c0fb0c2aed42e4bb680d5dcc0aea3e211d929941b099517f32a07271697d76fb07b72c838acb29810f22cd2ab3045c7d496640d1a3b0586741b75905d5a3b7496f1751ef22404d952e02f72cc14fc1e2d8d16807e78221d56d1f91254820e2a90c1213030529c298b76cace6150820c54081c0d0015a8774374151af1b8446f016627082b249b220dce6319f4c896a93fc0acdea7c438cd1cd47ba4a8486847517948422a8870971f2031402812d2042b019cda08d58f137c44ec21de9d8b48fd6d60409efd82c9a2a043202a369264f567ae2d44d0874798e7ae903408f30c5b3492da78ce00b0eae68b0bcc67da377889dd128c625547f60ecab455a24c30044afbc0ce50094c085038ab63a3d0677b5c52e32e392c635346fa5c712e4afbafb4cc1ade4a0141892d9650bebc2428d2a4773b1d7713797e866ac4a353eaa9c17fd54cf2d7f61d8cc85e3c00116972d7829844138073b7c39873958470be472622a9d9b26427d1ac89ced710ad5a2b495eca08be572b7c7ed2445a6f2fabcde2a92e27fc1f9a6219e8a28537af6ef23407876a5bbb93449e833e8f63e2ca4edb565591c0c1e0a0e8505a4b981648510e8eb9f4e471b58c089a84adf2ebc34108697747de3e696dcf7268d1ef5852164884312193af5fc413ddba42bb7d2a59054ec50122470260e703645a4f366ecef40ab6087ccc12a22863c9310824d715523ae57766572c5f5758475336724b9496127301a4515e01c8390b3c50480a048db635b21d6085dae4baaa93a762a511202681128183fea6b1634e589cf3c32a04f22e6da3d88685422cef206d70cf631df2b1d7a926992eb1d6c0436a38a5eb84f6005733584f9c380bf6476e4dc390ab45275c1847452932742c5ba4a08f58676201f04033ad695737d935a1093b012ab1745f5cba4037def88e52ba82b0ab15901bd9ad40ebd2caf64c09d275e953aaa35164e31cdca18cd29fdac35be5246a843b0b837296a95d2b10e04e51ea4bc6cec1657f05e4064f5d14b014b28a89fa5d478f16aebac00ea736b108d08e6941a5f5d3800dd0ab79e3c3277472170012963ce51115e8c63f4993e6e6dc90c9625735a9b4ff0a5f182a2e36b4c9ca42bbba0b5ea7ae2cf3757f53c8ccdd7b1d473aeed93f73a825c794d3bb1a7848a50ef38e2421bb1e7a9c117580e7ce16b0f1a2c0c680fc088456395faa3acb399f9ac3ac15521602a8373d9d820e903536acf2c31cd1121471d35494fce596cbba005becdace5aeec793f2b0b3c7aac556f89505c2b44986ae78eb41b3b8558c8901a44916fd3a9859d25c67648032abffb15379a3bbc5adab3804e0c90d004c4e54d07b90cdabc8253b95c769254f86054d01160b141316ff0709ece641ff18905c70d7d21640b12bc2032666cc588cab191c8bc37a4df83a2f8d734c2cc2ee51d1df8544a08f72028e1e6f93560c90f69c0a08c7db49266a5f431f6722510da77125141fd9b9a41ff7851173e8c7ec3766d7a8f203fa0bed45ef4e14f39c7c3ad93c71ec5a666376058fafb52a62d3a5738f2b84b0ed525b5137752430f18cd2695299300e1dc90c6cc5b6fb9a556ad6ce1859d1d44bddb6c0b0fbd4b217da8c000db9e6f9b65c7690346f66cc10221e4083758b00cbbcc915710bc0e1a2fe3984717279fd2dbf85900cdc6ac06ac8057fdca00ac44ef86a2bd5bfe2f53a251f7b6ba0bbe27a6c55fabbc306516f595fb754015907f37dbbbd28ade57f71c6be54a26a59b360b66adda8490e3a8af70f06b71a914c1cc6ec43b3d838bb40995f41ec44d42876fc42bed1e13f9df11f786b6f88f7e870b3ae356729ea7aa6c656c9f8e498a82b62d05567db27e5a20b39e740a0e55a019e793cab698be2dcf72e7cc105c0b22d907033df67a46c46981fc0ccba3d6cb7d16ce470b24d96b083c6d12ec72504ea205b22d825fbc082a5e4c14f277501f6ed91467c1b2d4662d91ffdcc82ebb2b994ae061f04c0c5e335381369822ce6070b265cda044ad1aa425a6d8d2559135593cbb2acf1a0d4284688e6293c34135fb0a12539b8d23d111cf0eefc7840eb8f5d47deb8bf7fb00f82958345fd89e203f907420b5924b92a21fd7ea7f4b8971b7bd853bf10e1dda2d06c4ff979617c17431c84a072391221de90b82563ae28557562148a2544370100e0f17635dd980b36f6e7f64c7f9770328488afe0e4f297fd3bd3aaa93a88039913c1e375ed6749d6ef3a5e72f1ebf2f16130e9160ed60265830f2b2cbde5b02b6ce628ca0cb262785205c2f00a242f3b517ef9caba4ac75673d10d6d94baa640c9fc69d6975d4f1c5efdc7b37afbff91bedbe1d6da5c49a1d5713e252a65ff867847b02bf0d80b1b495e783cf7a3ae0e0a1e736e0493602663ae257ed24340f03a5854b1be4a3c2033a9c891a56f1a3e4cf1ad5e3f4e7335f1732cc1ad20307208538bcb8f5e223488f4d20030065ca79bdb2f8db7bd6c0d523c282f34ed61bc14268d3cd74a0487836560a4b70d34f8c03ee9a5d7c656ec76dace14e6bb3a5f10830863cda5cf6bc84df634b0a544a1ab92d86a577ee4f1ee7ac7b2dfe4bcb2f99731e595a420ceeb66e7f1c21709610af928b2c8ed957d9d3e82b8867fb98cd985d5a7c4d0a6b688897c6397aa5f3d2a348836eb12211d77d755f43fb2cca819d5983d03d83fd6d5ad54c3724fc0fb896ad3c48e0d6088457d837a3d10d50b3f243849bc807575da6747e8b8d0e53f7b51904fe79e364efce4336a8e23317bb07d94f4e651419db5e8db2c3e46c6a698cd9af97430756abc43d0d55e734015fd2c8717df232db19821010019cba4a1f2c4d2d7b72c5c05bc5482b0f427cccc902deb475d1605be639ff9c629cae0afdfa8d4cfedbd4d2fd7e076d4549ea2ff67f64d617a8232e36d6a9bfca18ccc8fa0a7b05a0bada8931cebd16361cbcd626131df56c02ff6c23277b2140cc2981da1d7eb87ac0a9693e8de4f414cce08b88d4af5428d649df1ab71543a1cd5c58bc4a0c0e1e15c6ae0eb49676301ca965c872a5f49051e2170a71008aef87a977bce10697e35ba55397b6bedff7c2bbf1756d5e72f82dd79ac96651fc2e20c02ce8bc36fd7da6853141755a88469d9de9f9abc0a66b237722cb1af929d756b1c91d19aa19efd49df1b590415548aaee022257651fbd080c21d59b9943b57979d6c471832da50d708463882495c19ef7160f8272ec8f9f32f9e9a55c08f9ce88d5f00e923b3d945b7d2de91f042620c11a14e16861a50c733111b2be5bd67425a7efe46bdf8751ea16a0bbab0604f73c0206375c00549981c74b46de4d23a87ca16925ae9beccd84c35d60721e5490949d2c1e3c845c8616dbe029290bdabc13be3ec12257f21b7f18ab4d52ed69b402259db5b02bb1ac6fd982c5fc25f7a724a5f16d52f4438d5f004c573a6472146e77ee02ca3b129db922dcd0f458bcb91d9c9d6920ed79bce2dee71ae997381c6d2de70e5c9bf727c402d236c8fa61b4d92350017fb09e11d6e92086ced57cd7aebb6f492845c60b8a32734d65e140643511a754c8c1b15fa1a80f429b5081546cdbed54fdec2c5aafed643b744b0998dd87f8519b2f7b10ae3573100454fbadc8a4fbb7ed95c28340e01e60147a9719a65477878ca1241deee04f77916a83b52370305ce4b3876290268211b57a01a005595deaaeda07e2193c9beda4c280adccd224a407dd0211d253e8001a973fa4f6228d9fc0559d4231dc8af50ef01ed4b273c04b374f0b0fc7923684f740534b9735b06558039db9b83d7b7ce463a2826b3a79c98412fa8e000940f5f95351c01de81ab25a263378ee93271c350b90a0bf5d52db93ba78e0e21c64f5780a052e01485021c115f4abf86702b6cb15a1d0213da3b2bcfb019776ab1b01eb32d3837002c873e28d10e26ccaaac26369899f0a80c21da782fa452c12203c1af3a63d9f3100bad2949fd361c69ea5784c351b63029cd0f5f2369d49710719b9e2ec0206efd580020b63368000c093cd4e1307426d69262d84ca2e5e2a20b4d9009f9a695f3fe76125cda0b2a61d8b7fdd8083a98443f3e63272fa4a4b9a953cfdb7717cdc5713f4f172837b79b8b479087550222a05b255c856c94ef1b1a05ca62578b9cf7f083e8ec8fb9a3696228f2da4f624dbc55449675e7cdb4c43cc6f4ec8515d14a44a58a3ab03b87a04ede05de15abb1cfb9d409a130fb0ca321dd67954a8f89e08eb3efe418552f9bbb50147fdfd76efcff9e10b069298747bc1bfcd74462b69a3007ae92489cb6fc97482e8332a37e0631ea007d2f958b4865a6b66438c834aec9bede07de13cdcb1a14e72f67c6a3e497ff6f08d2b8e493412edd15083e6dbde28cb7bc86acc8ffd6700f948b7cef31bdcab0045bcf6f38d0ab826c0d906ce7acd450a69af131d064afbc6ef56d4e64d99f861ecb946492a57ba93a75688b3c020af5d81a2490976197831221843e416998235e2a723b327db8534bc659ffda1c3c7b786da4e25406891bf905c317f6cb6a47f06564b9beaa1b1b474203f54d7938b96dd67b641484444f13981d1cf003e890e2a4028c2f5b1f34f5307c064de18020baa5fdacc5aac3a4ac36e3d4a468b725c79443d9f94b777574523af3f0f9fc8e3719863cec627044f95a401c858bd9187d4499b79930c0b684e8c8d18a043b43a6be97719de5d4f81f314984e74eb78872d0b4a9cd03de5aa77faadde10111f43873afc026d31ab54aa0e20beb16c28c91bdac953134f94878ed737b00799816da71f05130ce285e9f258cfe58ab05d5c9d91126954244deb3c5d0ae3c8bc61057afd97fca7e4fd08b0c407577215e1d88e3ea5accae7933bf100fd711a9e37879cd8ce180583aab93f26e10af65fcf1d8cdb716682138aca457d78c4be525a891702dfb0113b95476963d9ea1445e859f5e02e0b5b3d3dbba0498176dd401755d40b0156017914239d6af6c7d05e4b2250bfb7fef593b9b8d69179c0ad3f7111ec0dea9bece9f2148862166ce702f9334118f7c4583d34fee60e26c08f1f01aed7dc21d56b74dbe906afcd81bbaf08ee00221a93fe23df212a018d18d78c2582ed376d5099e4b7a80824563ca18b723d520288dd7470c9222a8535530cdc7294e6818344b950086ef8c3a7208ebc53dd88c04d7bd8d9b47c0c6923b95a5775a59f55fcfcd39d9fe3ec2a30a0e3a64e610c935f2aa03a051f6a51b2db6b32cfa74ba2d48c002774ab977c6928fc930388094a96a6b10092149e95b6672ff3d9396331e9d6cf6f91809422f2be931a31eb13172a60dd2409aa4c6cc9786bc8bbf33d38892907ad4d69305b957087629e7e811a589132ed99220a2c912cdab8dc58a61e93e4400bb43e062625734f44007293cefcd87133d2219c944d295b888a646a19d27a1a8fe6b0fe98fa2c28e04060c3c2a460b0d7d0e4cca8b56eefb7841b4dc57c828c52d827c29f710ec0f0b00af78bc5c9db54f0deaf2dafbed2750e5433f36348feb8cadb1730613e1b7c0eca577e39b4869c7fc00e141f3acd97f12ff4e1765ff8966fbc04ac2d33a34d994057b17005ef1d9fc6e51637e623feef253c37a1112bcf105653e766e14660168b70356e2ccca2b10b644ce66771b4ea09eec5f1f96f09a20d08bcb4cd27abd7b442a933a0c2c2177621e6dc1f3c52552d5aa54d8add2b2902618571e023779df1d22ffa81026c9e6c70eb6298ae13703f81339d4e188ae2e71a85e7577aea2ab8be3f8fecbcb74e1425ca8cfce472d9a465bcacbe9ce2604a048a831af1740fa9dc7129cea8704b5a7f10ada12b9d9214ab0459a7e1caad30611644c16ed9a901c81682f1ebb92caa09f56bc75b1233b05cb0628ce97645bbc82587f161724816bb0940c19d83d497a8ff0b77921343e430034f07c2b223b60777a5d86bbe82924d5803afecebdb451e2307499990772f37f099d4e977a2324d0f04eab584c051fd8d07d2f04c9ce55218529a6f6bf04a187c2b8fa984217d6fdb7a56dea41919613ce43d7afd499c78349772fc00174be9ec7bbdcde6dd27d57a218a719dedfc892cc5745742e20de7a8d7397c6cc13c739cd6b11e360956178329527d9c70379b81056eb85180f5e8afc7922c70c929d55b051010732309a808325cf2a3b696ad3eced396cd5dc8a9764be5db58e71c0408c3d492aa31447e0e76eaf1bc2b49b0e1e080a89074d6ab915898c03cd65f6ab2a78c38b30fcae9ad15ed27a070716e5c13404d92a41c6cf956e42c8d20c39e30b221da15259a6081a28b9faa71dbfbf1803bef12c4256fae6a5c3c3f28520b34887da1e1648e8a6fa0cb54273760c09d8a2cc234966f760c1ecf002a95e7f290b5995ed99802f3a6a2a6bf64cf546b876eb191693a0bacea08344435ce13d516b9002386080b239230e385ffe36c7afe470086d92418618205b6681f65e71e61a76c4f83b289ee98656f5fc903d914dd686c16242d49498fd679a803fc88e0cb4ed0a8e54f86a9d9b25c1be26f4d6cf15ea8b253c5d9cf6b0e3b75c437e3943b1cc484ab72d37763cd724aa7ab84a3403d6e80c47d87b9715df80a488b68588c6ae01c0f9ba5578e441c192914eb6c1989a2c14699ce0de770142be3d5b1eb6e9399b1ba35782250162fb7abc3531e850104d9c94fef3253cf35b364813ab248b090b1b62220af5b18e3fc945f89cd482bc1e133b18fc4aed842c0a69489c919320cd70949d2d1b5e1e7f901fe65303e4bc7aa7fce219a8ec318931132a0059b1c6db649a5367bfa3a1a42c21d5064b5e18630de7f56b331783d74fe774252a6ed1daa18339563e114e8235e044b01b778072d3ff1b0773cdf18c122d39ffd515d572e998581935b320a0f059a89c57cac9226311cf949c8daf9825e58b941abdae3e28dfc958ded8d786769e64047971582d73fec64f6d31e294eccddabd3eac505deebac6de650919c67bfeea4f73f4a255722bcb529c795648413ffeac1f676850a70e07b2f4a230f729775ca7b6aeaf7686903f2886ab9f79b21c87d581b2416b1054e43d34c2e46c992a221ac71d3938343f6f65b316bd14bd2258cd14a7abdb01fadb6cf647a1dda352e13274a28f90c9c58c8102514b0bbdf8bd7abe6cd328a1f0f1f4eff2f06d87f79db7e939963e3bad19b6cda314ebb833264f2eed3443429ccd19854ae11849aacd1e94d3f853bea4fdc26a5ce67db4d3a961555071fe67acb462428f2492448d0923b47a6e860b06338cadd10373754e0de18bb016f33dd8bd788b54a1f1b6de8fb82db350680a954234a0d51bb8817ad28ea53d294b444f3e44d6e9d65a1153949225c5918505d3e3c427368631383243ddeb958cd87f679c280ab747c51359951685cc6571dd35dacb09ec46ab5cfd02a0d291df8e92f9d48b8039f769331fb8bab898766374218a458e329ac5181e5aaab9ea478064393e297bc48da25208f1735a4544ad31bb6507f98c7aae00106575be7865747d0f3ce8ed9a95cb27db298f66c7e0721a9566beb48026a90b4a4588e83bb50839c62bf88f5bba0329b7b6fc30b70a0159f4fd585f170e07ba4cbeaee74f2b8bcb531339bed6bcab3e599b955b907fcf2e7e1dabc556e0109f5d34c6fdb39ed956eabe29a1253817764fcbbf33d8324381a33552820a36c4ae909415006978089b999258f6260656db2a468bd631b67a815a457993ce7e158faa018a20d18f42db5512b4304e3c39b7c9dbc3ba816373b459a3062b5d51ae36fb10625041738aed873d4aa6a506162aa0be670e15721552b191f9194c26554316cd9512386addae77899839a1049674605877f38a68d40eec3cb36851aa4e4e6bb8308d316bed512f4d8136f345951e6bb91fbd65f0761b2208b537d01c71c1145773360bd1033a3cd21aa3dad2bec46a4afe9eb15c552bc7f64b0d47fbce7f0f3fa161158b8ba145c9c2737f21eac133ff230c8324da9d3b59ee3ba336b1170fb4e2793aa022484dfa41b75bb4cabd0bb0de6b53ef3f895e9c305df2e64249f7ef04387e34a20c116716ebd3947e029b3bffaae6ce28fbba7f8544284fc7a472508237e8330072c103eb65c0b4ff678eec8b6b849b64ab6c349bf1258057384d25e72fab8111496c46a002bcb06c900ca1db34d8f6cf983f8b20fc0860362c8ee3ab7299ff79b529961a7ecb4c6907dd22b1ecfa4a5f84405c0f1981af07663f7aa8930747b00311c731127bb83a91e00fdf5c96b773df0cbaf1d724b8c7d163e0af701ad35e52a711c718cc318f2ac0c7299a7e98ce368b29306dfc113630de2d0049f0dbeb2c7d98dcc4984150e9f7b67508e868790fcd1416fe634d9f13845d6e0c12be044e8411984e0df836ed6f1ee237882b0fee166ef8c0ca43004011bc455c3b955485019a93904fc77a6ba91e852d079ad28f915758ee6b5b8216603b5fb3945add080041b86cd2848c1ce09131108ab9f7448d21922eff4899cceb00c1b760742a7b2a9f71a41908854908bb05eedf1995735ed7813e4d88929ec6b62e0de29377683a28a72799514c5035418506dafd33d9966515223a8a76aef1bac1128a9934d1949f7f23b57906fb000520539b0b00f1e8588f94f94d4c1f55c9a2d92316731ee2d087c0e833520c7342782b283f0f694f7b6097e75bf8c267600f5cb575ee2c435c007f98256c4f882c4229c2589c686ca58eb0a844c6323758b9fc35479c738d006efae84de0a2345c72ce01092c5268b721d3b1e45299cc41e6887f7374eadb26d610b62eca056f5310a23d7529f6302d1c031bb45830fd2e4a0b1f179d07a67c6a3f38b4281ee089565b4694172bcf9e3611a7b037c00ea4e91e0792b7ab539da0582e8bfe410df66f10f1383d6415a3f71b7fba45363b008529336f01a252777932928d39b60d7d5185c5c190049307fcc81821275865288bde7cd2dfef52dfb4726252d604554fd82a9fc0b4cdf641e8d0001b2164111b4b47ee322f0b51dc68d0aa2f010c5b4452d8bc014bd338e82d8c80ac3cd51d825b7974560786d9ebb2e0c21a74ed498ea64e4d9f8dfda4eefa38510b0d0a8e5355d158cadb292f5ea467fb4192076521645ca24aed9b30a70e7cec7edb954f66ec3de65671712479d398c386ba02b0bfb4e59984e856a6db6a649f62880e8ce3c09252cf8317a39fffd69977d5ed01b526fbfddfa7fc7eb886e35f6252652dab31a909fe8a303585521b1c7cf5ff4ac76597d301131ff67fefe15a63832e513b05010cfa352c734064d9d68b6e0cd26ccdb2e5a0e76143829f1999781bf4a736c3b7466814ae64e00ed7e3b8e121b1da0983ec4893b6fad39a5f0b459cfb379da3f364902969a163f50db1a90dca915020c1904ce9d8f78a34929109fd8cc126fe322bf005c5fe49fdf63dde5bb9378a8906063aeb8f79e9f9aa5d440faf3a63f34339ff4786274b9f5f40d1e223358f5c8531d424447c418020f419e0fffd08e1daf07c66008e6b2c097126ed6510388f43cda197b1192cf60c8873e269f4d0b17fec3ecdb19bd14f322e569341830bdc7d5d311b1741a276b4c6782e96946ac4caf4bc46915c132ed7d4e0b427420519e6b0f6554d9a484ae389465c69592a4b228af2913a594c1a13c876d94aa8690725d6ba75de15d5b052e24a00546afc26ae3872dd9e5ca2c8a412c1deb1ed35ace47559f865dbbe5dd5c0a839d0facdfef56e9aec2a9cefa92d9d52c1ff7ec336337facab46241f6ef8ae1702fb9942ecac0db2c291fe2e5a1eee708bc0821ae408476217841bfa82729adcc3f9a83598c200ec5c4ac9c0206113d3b244796d10a7ca019abed7c02e3a03331e0104d9defd934cb60206738108b642e0dcc8b36cfd656f78d08e25a1968fdf55b5dd6db78e7d345436263e65be2b28223afc79acb0968bab1a85c5ba68ed7a9800fd6bdbb8b3f602f82aa8fd98e6419e4c86290042f7a23c32b2832f0b2dc9f2005f66af0504169d331ec9d195a8206fc7c85e99146d845ec79cb279c5c8c0981e3f8bd76ed6b98ba01c4adce425336a888d4663b6508c09a6861b8012b368123e16b26966b8852a73d6ec26f9964ba10e0795cd50323e0b79ae83ad40958a21f0f552d07791c1157ff315c0c5e04617f3e1d7ed6b0025a1b5ffaa7fb35aa4bcc012179fdb6df006a89142c668e093fc98c95b0021e81fe2075794906769d43fa097e36a484f0c0244569d33dd308732090dd8cae7a158e17829caa29da62f12f1e1126d29720597112fb511e285169beda042542d507e282c46f49889cf89152b0a3c4bfe5147f1b2133c62d6b26c128ec3a5554bd9d0183182a01e715f9374c584e66204e7b965127c03f9ef284b5098b2b2a1ff866d4bf37f260b955cb868dfb653824f72b0a96256c877f50c8c019d37ec7a958443ecd02d239173cb1c9acc45a72f30d628eb5b8202a11776e2d9e8a4e95d6048410e3b8b6287f1e23c131c0229b7871dacb9e982884407e49ad09b1a3c1ef15b7bf2c96c1fe55773a0c2eb54b4e8ffa81cc416bc7fbe6429e329a0a470938e657f7181873397329fe5b4b5d06f0d14c6c3939209b325489c24a37181a53c1109cd1202c449650d2de506f74574a3ba1866628b86a726c12ebf6259d699ec749d0eede4bbf19f67deddd5802dba006aba138ad3c25cca227e871b69dc4eab5483159a32d3fe51485f5e6ff9bb660e62f67528974e01bf3ce3ab9894ad24627848a804c4eb54de8b965509a706394da0c885e188a198028134ef27879a413ceb8dc21591fe3e0664d595ff1bf34a360f407d1c695f44fd74d38799d124835ee8526a0e4765d68d368317efea2ec568b198029ab42a85bbbc5ac2adaa74a0c97d00b4796d534c4227a7cc71924a730a523e981545e401a938da0ffb5232407eddab0bd283caa4ddad0aebf6a917b910473eb9d14d163c69d1bc7c7986c9c945af4eea62a965c640148b4c8d30129c6ab85f39e2a326d84bb295ffb85bba4adf2db17024784cb5e6eb5ef7e3178b1544b2f7fd05bd366705258ab378630f7eda5f0a246c0467d2c4b5d278932fcd824c0703c6ccdd67701ce923217b71ae9bbcfd2447289690fac045a57f4b906a04d279b34783266295e9ecdbc3992dc14e248eb84bc80ba8f6ea19dd0db83188330fe52b1f082ad4e4c001658ae03ee0c09c927da102acb9f5b51230fc48c58f7ab85bb2b170039fc9ba55c3959cdc7af8698c6adad6bfd5d796380200b6cd946c9be325a8d611e2e890c8dd5a2c6f6c6648dbdbe5cd52d62f62bd7aebdbab0ad7ac095993192c5623bc5f751a10138c90dd7b57f0b298e1c70786a390b6c67f210d92c941bef6635acbcfe490287fa717dc259218dfc18856d98a450deb9e63425e8f001875f6c4c47a2c04398e20bbc58da12844e65e9414289cb61c202abe9eded57a89661c69c26b2ecbb5192f3c80849918a71ac9f2fde82c319565d632262f4fabaf88e60dca3bffcad93783bab1b03c84adb814f94c55fb7a4f82d49f2878053c84788465a8c0dd58be9b3fbf6b53f58f695a986eb9e33754adf2bc4920d3bf6fc76527b77e49576a4ae02d186c491f3c1e000e20d257a1c79b255b22e4f9b061e34ad2706d5e3e728161a0b822ae1a2323f30ab6698681f77854a39ebc8797a40b4a4d15e1eba63eb7d49432943b3cf33bd3a9c8f3347b1404ce52480b339ade2270802805f5bca80eb0ab8fc3b1e3bccc3c20038c148c7e0270ae73151d078936ffbf092522f10a98abb89487b79b1291b88722bb10f4bd2cd80d94fe75af0279483fc910e23defb27c636826b9aa191abd14c69e04aae3998b7ff95c728f41e1205212d001ea05611200f030a1de11e60ebefdb83521203f5af31f1418cfe4389d9590522856e52a58099c19fd65360a7a4e01ef631c9ef3b1197d1fd973009f55a41477605bc42f41928a3b8a1e2f885478eba85b6c0b4116a5659d4d47f0a22c0fd21d507ccd76132b1f4e3ec90722876f5edf4050650cf288d31ade7fbef0933e3a530006addc6d82bd76c17763871cb188836e55f90f953ce010e30538f011606f5ab1f0252901eb90d2180d5e7f9553ee551eb4cfe8ef5307071118c87e0aa3894a82d894051e2b5e10dece4a3bb69cceea908cd5b169d35efb67e8fe4d64fc20b216b31da4b8df9df529589868e3dc8d68d698d1a6ff214deb8a9fb35116e34dc1ef249ef47a1ef19475d48a16eff2d73c0966550712a5fbb20b6d23effe869965855d90ffb0bd84f445907377b245b821081491e28a6b9571d407c5f2f45d8583f155d94a6fa6a34342940428a85a739c3e07314fb34c4c660db8028f0c50c3686699adbaa7d251c1a536b44e9f9ae2b9f983ed65cb27cac4757f0095571ddec284e37cfb441d2be2c0f7a489efdeccd271fa10db6b9c1d31adbf65dc2769c3a159950fc67b751fe330877f10b91127bb1755563d352162695d7a1494724fde4e2ba5708f133cdd3b0866986f9e63425cd20048e2a8736a930c6f2ad0de4fd705d7cf97c9a02493a44ced2734b8352ca6846943f6fe5546b7287bcd5a8547916832c228368c476036040279437ac4cef2e56a6e990eb906b25f1ba3898e09644df5bd79363076c571ff98df33240fbc4f5e672511312c14a9d7edb861a5cb2756f235f9075031a6c417b2c092364a49091c331b519252bfbfc0e14cdfa21d7aff5bd69c99182583279f15abffdeb030ffb68ee2553bad4eec1aa6f4eb18e3a978503b438c0bb79d22bbb4101423fb30af8ccb0a14aa1a4c7b33ac3ccba055ec310defb2e20c5280510f66a9caaad541d6da318b477239fd679cbb80ebb4b551f0d02cbb7e414e089779bd47d9887763805105cd3076bd46c4e39a107b075ee98bf8807305510c771f1319bf1c77417c4b430379087fec2f872a21e333fd2278c33798bba846bf1984da88a94bd533f227c4ce1f6b089b51ed370f633240c17818a507b705ed7155badc722c2e35661910cc1bc616ab07e9ff2050ad5ea3b0508537617f83836ac15cba8156de15b0a6b55aa19b964d3be159912263dab3e8f9d4f16473c5c4900f5e8a73a332785a9edef217b3196df8a05b75e6615edfb905d0ce3b7d2c02def5945fb3d0453bad3442d0b0547fd9fada8d7648866124aabbe6e07fe9838d1e97b3b7b268048bc0a3ec24c747ab58dca2c82952aef6d809f512716f2deee46a6cd55d1688b4b5b018c4eb3b63b7fc422deafaaa910a6f405c7a447fc952b3806e7f1d24b4126565660a09be3600d85619b1f61011d1493c06d6d2e012507f62121b2481f4145fe3f88422445a36cbe2e698301508c56e265d0276c4a6a7f7f456bc89b9bd04565a8704e6bbe1069c19c35426c76d505a9bb800a09bbb9491bb255c02e0050ce78f3e855860c1686c1dbe1e66f2de55dcd3c49556c827a245888ac97c531d76c180fb9a6868263e2c013f3e347ad8ff80a8c10b5bf78d01436cb9356a07ad258776de09c67fa57297fcec20d71951e5f331b93d4a56327ac350a80cb599b7fc579eaf17622dbb1589e35e5b2b1851697f59228b256861e9bfb41bb5ad963b0c5e58e150afddc476ec2e81fcef15dc6d47d86f4316a6f1e7123cecf542d3ccd082e4c4e6d2b212450e493975ddb89a29cd96693e5322da19d218c66cd54ba9ab2d28125d21cc644b78c05458231e2354cda7b9b48264a23656725f8cafcb2c3fca34f99d9221d25466fccdab1d14f311d2b4954b9db7fd42f921dd789b44a23b98bc24d950f15fe5105fb2ec2f098e9fb13804047249056cef2776ca7464d94ca4d43f11df3d35164c2282e0d8b2ff1a76cc2bcb5c59f0354ae280c1f7210ad1517efba2ec5719534156c9d0b0224f04833db4710049202bcd2896da80103dc2153c15e719644263e0794d89ff72c2b3b82a4b014fa4026d6e1ba260e37977620c74ffc864c319af1c04682b3d1219e80ae8d6c37b122cc6e6986e2bb75cfa0fd674e97b2dd8ab9600f50eb46e41f131d774b8de03101f7c8ea3ef7e652773df37299701c23804a5419ac188837415c0854ed3f0d5b9f50a710d7f0e55563128dbf9f3291591195a938c77bd0f91c9a311845e3169ea8876936e811b7fa672c510a29a3e04a24be0b09f823513fa48cd091062ee43ba6ab004a3dcc89cdab8fe22efbafc7bbd6b9f929b6992f246bbe9b91970c06495730863ec176a45b0bb0eb3f86fb11cc37b75d109e9f8c9d87be3a156ace227c711961e4d8a9b22bd2894652c6d1d7e4ef53c798b2f062521fcdb1e128f46f5d097ef1037e3890a148fd78de95105b54505729425158e4cc2525ada19f140035abddfb7cfe21731e35b6f8a13ecc215521d33e7b8c08f6c805722c046eee62f4a3f6958ea7c1691185ab6ea1a4600919ac2f08aadbe2796054353124027a8b5d899aa25168c8d7a1a26b3025332f13c04f5a8925b74278b337fdc852b4a8f0c22783d8745c12a3552693098ddaaf20e8b1a18b58159493914a5396828d9b061a59b004c6f01a9c7e5edcf56b7a2be8ce1da1e524a340cf789c2c27c80211b9b446d5c64f6f05054ac8edc0dde5008013bb22500a4258551959a2450442c0a2b71294a02c4d9d44305d566cbe90d34a1cda8ae7475634215d08742927fe7460836c66cba4aba249e581eaaea098dfa6aac0779f9250a27bd2f7270c2e343c7508873259f84c28d046d728286d1c97c25dfe0b9a80f45b69fdc50e4151febe9b459abe536a4198b58a1aad70261af924be7c3895698b4bf86aa1b6c6ad77ac7068c63cfb03736c41330370ede7a1f907ce0f7023ab49ed522cae580309cae92461d6cbd0e415a95009eae266bffb6e09c406e19a21c4e37ed32475245e1df2a9a7e883d5542d6b1271836dcbed50078202618c05f41ac48fc8e3eaf911b9180101d5fcb40a0c8c8b479257ffbff715ad22e68925b41ec301753c87044ed47fca7ffa74bcdbc40bfd989f8d75ed28f7794d0f45db7d34a9ebd54796942433bb40e488b813680f92a5a27136ba0c4c7a6a4821e50593e0e5b6780554ec2a548a0faa6297ca19bd846fbaf63ce9ac576013c22b3493810a7444164c54cbf5cef03d4b1d72f0d9025e8ff4c445bae1531d3efbdf2f3f1065d82d1fc16763c38bab5a8507e5d6007fbaf2fef33aac7fc22744fd012ec318d0adf87379bc74067d07b1e23070d047fdda82d471a26c395b9f63ac1203458377c4d74efc0aa48a158c586411992c67ad81dc7b3b10b0c2390a59ad5f4a45cac782e885049373be84e14c1d4e08ec237ae717793e13304047aec0a1e111e7194ec147edf14c12c12f4b5455696bc44f7122cfac12ac12d77b06ba92b69db9f96930911bd2846b39d427507c789c7692aa38beabfa828b4caa73360a42f6570c813bd609950d8bf73051b451b97eb4f988185adfc28931b3fbc51ed893a4ede7c77f291ac13a22aae28f5cf6050da3bc67a38aac63c3a1e56a933e228fcebcec44ca4ee92c6e777878389d8d42876069244729955dc15741568357f30bc700ac96f76eb4a11d40e5c882e22e6ed157fe5310ebbe53e439c2a4a9283718bb29bcb647e630c54de26358803895c6b1aa89016c14169bc11b2d0315745766ef75709a9fa1196830e445a5023e0652241d409934cf0ce6827639e2359a494cff156d2853817ea1d576bdfaffedac3aed08b5051c9dec746026ddd0b51564c5584fea1e4b820a5721f4ab6eb52119aca67cce3683793a25cbbd30e9670a17071eb81c09e419293dd1ae0581ee1e34b96128f1adac46f391ae35330d3c241f7b5c7374a0da8c85894d144d2767c49f140f04e6cc0fe968b87d28fc49001009b1d157dd41c362c9af2a2dde0d538e3b8089301d0321f87467249e2810b4358cd70681d62e59a47614719754de4eec593f05af4fd83031c5bf5c53b9d293d2bd59503d7b26a0ce4eac2ce2b821f4b022d8b2fdeb9ca361962995f8a6b1bf6993139b41cdfb75a5e38f6a145521feb7849e57dc0b9d3ec5a2310f4e1755540e6d0b1a0202314b6f408cd1ebc9074e0e0c85f978808b1eee0815a9b10f88c8347d070abb6089f7bb1636dfeca6e57acd95b63bd6ebc8f053560250c2a88cc8ae96da1afa9a90f2eccea482cb8c506eae8d92cace4a047f72aeb3c31dbcb0d2b47d454b286c8978305c93f44c968a298a6ff0c61586fe8defa6541eb64739dcb7df5d04769ab86edb4c005cf0eddd5ed6582ad551115b80319c5d41218aa68f57a1dddcaa302919f9ef9336b3873465e25450c1df1e4b91f45ae8b96e6c26028afaeeed0d4a3bb474e53c2b4f02b026bcb48a23ea0591da1dd00f0e0f812d2169be9541b87b6655448c2c0f321e44775d38ab5068b9b51de9f92a91909be8a2622d78f0a28566be2a437b528f253ea61411bfc3b05ce8170f8535ed4e8bfd26d059da2717c30819b9e5374fb630a0143b5850b8904ec6f1275cecd6b1f4fbd89dab8e63515c3fdeb68f494ba8486c9a72d94d07456080a9b6a53acc37bf444dec6afaaf20de0e4a12cb875816c0cb8fa7ea83b4f24d06b5520e8311121cf29cbf9585008a5665deeaa5bdcf5a58eecf7cadaba2a92c62d8fb9757f4221058b41df7c47aae0039e1aec2d7aa54989c250ca62a038e3f5ef60b48806e3a23e7943e92442449137649f87ce99133a809604b8288de67e1bfe7a9d92844318bec8ed31c5b4d999249a2d8db19b414dce408541dbb2a2499e249d2397b97a4e13ccb7e2e02ec66f094f6269ef84a741652c3af0c6baecb94e4cdaa49e510d342ec3436198ea0f7e8c376cf8d3f9cd4ddc498d1e35ae85b8c21db70c5a70f6ba30dd383682fbb4392b4fac7bb8e0c5591356c57648ebc09dfeaa88932f309b199963cfd4bf3944db74048d1819f19ea264c48ab5c4795085f6bf00e019a7bc5daaf61ea6c3a6a00faaa5639173839f4805175f6473a5ba97448bb26c596f5363580d8172d36ac7335a4471d4b0055097aef591f09c48984b81d7fd0fd33279dab6827ddc5d80a7023fab7ad26b8c3dab86f0cc0879b883858f72f664389c7e1b57951bfa63f0d4d1498fdd346530408ad758af8516a8a572e91633a0dcd716b08499b7442e0de97131ac2156a7a3671e185d48ab1f22130e8cb5665bf66655a10b1afd6d5f318394e8d84768bef4f64ffa8932d53486ab571f81868f073b164946267b97d465fd4bc89f10b0914f7191fd057ffb83b2796582c7b2ff4fa883ae1cc13b2d5c6e1c30480a93e6b95cf9574dcc238eba8b65481837cb08bcbcf9a219fbe5b1f65fee63e7a141be0de047d804d4c274882608f421bca37bdea909f1e31892a9deeba4a500f1cc8176d727685898c185c38e13ffb987323d63d47ec9555d873a73b82302e3e12b6b291701e5b4f8ed524da791c9ae9b9a0649a008708d37c4a4e14ac078316c5b357968ffa6cc7657d0ee7bc7bdfc829402013429013ab8495610794c88869d91d35038c1518cd1d50cfe2e5c98e696586920340eb7a9de3b4a12a46e92da5983431584a0ba42e043f70e6cb19586d778b717b432acd1f3f663dd611c1bbcaba199f995b282389cfee63fe80ba276018c4a52b1e88aa9eca544612eda6fb347978d872e420fba1862039b69c3247956cf60b905d259b6b960d07aa96cb9d59ce110ae728da9c1c5b26866e10e22cfe112b4850c1965cc000b42a0b52daa7bc341602d707034c898cddb755f017a994e1a33dc6b4796a8360817c042ea1b0c557d944fecba66a4bd9ca07f682ffc0aca618970399029b65b6324deab1e5bacc90f10ad0bed90514cda481da16ddd95d9f3b982c38c90022fb4b873b13a5956c8768aa56c17afa4bfe91258a0762c21fe6f4c58762496e6aba168c0490a947dee009601b4f627ed48aaee0195fb5f5520d36174c41332d2364bee2c738244b8e5a563c43dfccbd1de620250e9bb8fa1d13da5fd4307a049769a3da8368ebfaf3feef5d94796f288fae9c080f280241cd8932ceb4e6216efa22e896f151bcf0291c8ddde81d0587c959377d54981cd3c8c78d0ee4ba8c4f7a9ebfa98c184829b838e3a3505b1c4dd8238d71a846b225cbea8a2e3e904b251f6d3558ba408b534971e404839597c8d258cf9bcd9e53855a38d18070ec61c3495b3c4c86c4db3eb8c7f46f03b1d0f0d3e05ff24926f4d761390d7919bb799dd8bbf46325ece63e2b0718fdebdb96995294a69e877e777b5e4dc0388f0a806e8f0f4c7e05ec46f4b93d6377f2c2aef7ba517113219099a839e97523f311d0795beb2fd804d6a34747a57367d94dba901e92b96178472503991773735a1dfff33d956e3ab09ef0c66d0fc189d9b2e4db319117f86028bfa2e1c90d789b8d2d72ce16c8f9dad8689ca2fabaaf1a41711e8997fa29cff8984f592066dbd1cc8310164eff1bec7114b3c2f0efc51fd6793627371bb0e7fd282c6ac8bfc18fbdf0f6b42bac8cc4834bc5b1ca47890176ecfe01980d443adc0f57b882701a38ff065ce1b0d7c2151bfd4a9ef0f6a106a049fedf1211f00c0579208fffcd1127dc668fb14880fc02223feec403292676a06e746c9e8ddb53929d77acf585944eac7ab6cd8c7d2a24ce44a7a76d4d99225859e5b9bd3e53542b4f9eb72fb4ab0ac59958f5683b2f930856843cb74f58cbe7abbef32ead78be5d1f004b34a2e227977434c5fb7d48ea7d68818644c644d2454f8e7ca72e394322052c218763a89423c918086e0e1299fda825dc1c0408c65190758e372f8a8e31474157ab438ac6863ba2d17281c007639f39eee998ed49c719be8223ed71f90aa92eb2fc39393c5d1036704053f0978506c08b855880cc862940151f174ab2b60689c7dee7bce5349698026010fbc080b24c34bf3cdd4478c0ac08fac758bc2b106ab9fb26a9c998a69d15af84f61ae87bec1e8b9bb749e788eedc62a15df9e05c32fbf96da6e2fbf6586ca4232b5041445c1e5c4de2d77c6b14a0884e487481247b96bbea488e1805d5554389f8702169f39136020768251b6df481bba944594e6d6ff108764bc6ba2997bce48e301bd20389627309600f55e099395160162cb0b38226215392bc91fd8969350fb2d2c76b1f41821bda2e91d4c33a8c796634a9c96d7857e5f69ab5023db4c15e92979f7ee27a79979beb6299ee6e52eb4c6b8973e2c377c1f6bfe4fcc7de6ee94edd4e1175b691814d1da0d641d97e7560decc04b7f455bbf122b38e698ae0da89cc74d1a278251e57cfff494143b59998152caa795c7f3002879e6b1b4c522b01684a2028cffecc478fb8bf1d4640fa112b50d8729f7749b71fc357c7d85b4266ab51986f394edc65c40bc46b500dc407128d1903f8c5a6005a9321e3dc6f0632d00e435348ddfe1157d2a310e712a1d9fca90623c8e5f6a7a3ac1147c594e418b645ae5d1d3c1e326ce67c5921fabe9b1443faba441302c49bb93389c59b5ce7d328f72a0d8019e95312996ada084caea59347e6e1b625e616c1fcbb5d69125d1e4c679fb87b5bd38ab6b61c76ab89cb243ccc89a2ea8d22effa0e875d74ab2cd79f9b4653f4c58eb7e7854ae5759b8cf47c60e5345a98914cb151c7508e0630662346db2fe8ed083e982dda421e62d5b3d78f1fc718da91ae0bbc60bfaccd92e94ba0fbc9c4d006512add2c14ab4881118d014ddd0ac428d9aa225c5b28b77852f4ef14929102264ad60ff6566641c74390eceab590f993e76ae2fd111ced8be203023e6d4ec6fd7592ba08ee008340405db3a7e159117e28fb7215d2461e0ca47e61ea59ba0e9f54ae5f5d4fb137f8e89eeba8d66d438f27b00321c18f94f932195d2332d2410fce72b4f538c930247d2ce53b0a77db6c7ca284f3cae0f4651e3d6e7670d6c7b2b7c37994a5ec4672e07f1773dd9b49936cc62ed94428b4417319f5ab9407a78188b4720c4357dfd910ff8882175d73cd1d9460236da97b8e2107ce96c28ca6ed250ddee897547096e3c49dad9d84953a40643499af8e99c71ed89604459b5c8ae72dcc6f10899ab486cbc95da258c313b690dea3d3737c48d9548ccccd4a689c56c35a66004c2a6cbe89482a15bd438e351f2ad4ff21f85956f9d89241ebf3f0e06f53a091e9861f17b559d09c610aa0a4e896156f43c60d04ca539b2530c360e47f0392df0ddf971865bd0e1c7bc19316cca9e0e8de14ca239aa1ace175a8778c12595053065aeafbef499e9369bb21f0769986d0eb27bfc9f64023878bb8c33decee8919bc7cbf5a49253c4d9839179a4bb8a2da791c5c37e5979e1261f8ad04f00e4079c2b4ce1f76d2b3a9dafaf613680baa60594eb0c6110c62aa65decde9528c2d6f1e60527cf8cd3cbdc125b8d0f9265d984862b5b2bc565f7326b512828326219a453193fec1bc47500a5e788e4861439bdae1e87cfffeba9684cab09bcfbd921c8851729ce0aa15ce36257f0fa6ee02eec83ee8f3da877019af2198ebf8f085c6b9190f4cd5a076e3841991aa385e3128fb6aa2d6e38001094eee9a87ed1a7169148193ee121fddbb9990c3475ecda5000611061cac99669c8095cace984dd3cd9c7f19cbe913db010354e90ed5620cff1374bd78ce2439a65a77cb60b565ef5d64d87847119c4dd0e0a9a52d90775f48da932e11516306ef866bf1b142200da74d18b2259621e5fcf3acab4603ce61a3bd718816f33b0532270a0e3a0cda258e2764e2501da92e4fbf7cc7f1cc1e3c07319a161e471389c12365a685ba51141191f2b0f07ddda158db3d114b47383b3996eee3c4e246718e9271524038af52ceb05a049d44f4f76ea5a049c45bad1685ee1ba50e17ea566bdb91be0577fde0e9226b008ed099a37b2b4ce0d9ad26a142297f1d582734ffd9e63d96c7460f86a014570be4ba68244a7a92ca0484ee52be550a4f985dc460810d555b5df228ce8b8a8c25321ca9928259ca96dd829f31882f4ac2270a7ae0b7d445bd6e8430200c9ca57d28dfd3087f76c8fff0a5abc399663f7990afa37a5b7295bd4141b4e4bffced78e98751b642c3b7f1b85d1139676039c6c13a4a3795e086bd4b4f3cd79d6384cf421714bd3d97762f9e4a90422f12b4893d45f9f56e2ce78120a3fdd298e76c10ee36c99353a23579044b01f958ffd27e3b640f4289829f7b9680ba3da1aa2be7e156393542a3f3a006cd5cccd49e418f1b25779c1daca3c681910c4bdd55fb696b6980b9f14684ff7b6442ee264a62d5dfab72beda94eb00caff16888141e4c6202de5652c574fabdd698430e1f0a50338d61d341b5b23933c48966e81b7eced292e76c38da7ce4f940bb29190888ef27798c6ffd2e6a51774cc2b429226e0f845c2dba12612bc8140b6226eb8138e136e16b9918f13509bdd7a3c11e96750c391c4d504054552d66dab88581434d92631ea89aa83e7bac07baa6cbe07f9b703c9a91157f40561220903e61357e9a29ce11f7b2f80e270e39216a59cdda6f80a5d3ffa7fe8f191439bb87b4f97784aedc697685f2a41e3a897e47e1587877e25db50e951b7cf700568221227a7d01ff3001312d21b8e80caf70d5e99524c99a3105beac641d95b28c4e47380f2201b06b0c9415258ee94390035e206919600751a999afe1383d5eff9f5630bfe90b09491af8e01a1ac00472165294619a7db903616fc1c0463e21a5409a7edaa15511dc2d0b777fd37a0b40d7505a447c94869d4ba1972950691034aea6c539ed080344abc923a495827570601c44b64dc24e13f934d9838aa30f804435395e4fdb65bc911f4c3a43ca891cd4c33abb0630605866e8313c8ad88129b2ca7ed46ee027edb9508ef084e190466c2de11869cd9701b89a7a47d0a99181b601f8a636bf3bd948c9c24173737e3ddf3e8db25eaf855c93b033026cf8f00817e1439104fd114dae352132d0fba1cc3b9762918e4b42c59c1b615cece5338591450de8b5f77c92e765f1ced225c3205b0bdb9171babe3a606c539034eaa70a9a2221cbb3afa74fd5ba77e798b897d1bc524ecb2b55dca0c94bde51c96d53f630e280adeb7a300ee973c883bc5ddff5e8fc5f0f88aa720a454bb55e5cafaba6285b0a8ae2fb341b8b69906c26f8b1e624a1933d5b901a5365d4fcee7456517932448284bd3506f7ca58e97cda26d97e69d243ae09570f04d34bcea1349cff5ef12da7e728fbe69b3c1a96db2954eef79874893cecca13195af035a091c66efdaa386089983363e748ea6fd3a35b44f41f2eab35b308c87dfb152837f4ec3c0a9bda5134f9cdd6266aa3b3432382d79393efffeec16d96c6d412d40d9ec016a1ee1eb3fdae36c7b2556f4fba2d5fbfbe094db0475eedc4bafb5eed072788ade31689c9819049cfa6ed39edb548e90f183af1c16271aa7b547547578bea11a80149c7c2dd906987aed19fe33ea2d047b9e81c54c6995aac2a5483b46771c9d91505b2089c04b1cd65951b978230cb525ba41e204b267979aaf993754388c429b4278c96330288178531fd78b1b8f75d317e2b812ae4956c877b602344f753e88de0bf19b078b12a2b7d06b4a11d104ffb798b4b5c11263a34aba03e581f650885eec7f24835fac10d3ffdf132b7aade77addaf2228e1a2710bb56778d4f80f1aef1b90ef374553d95eb9d293dc6c021aee319a72bb20ba782819bc43ae1426e5ab79f02bd7a847da10e3656813ea6514cc9b355f25f4858f0e6f1606863761401517b7822a89c747cfebf148c7d9ad6642f2f77db3550bce82f4ede12c3cfea27578bc4bda2e997469a54c4c8bd360fd5f05b135ff286546dfdd977ee8fef6856f439a80190990545e5c72ec6d5456ce7034de229d6c47f682e6a8a50e555f28e8a43c6b6da29ca36aa8651fdbb840c5117f86953b89f9e47551a8d8811d97968ed51cbd9405df88e9049c17607aec5d1476957d23622fb361c4efe3a85f6b053552d6aba5137a65f8bd7fb69e1d3de5f424cf87ec1466dcbd84fb90dfb32e2291fa932f9b7c610005301d34cec92e09e1c0cec95e12cd4ab10da43ff86502f383074e3ef041396be4f77e6aa41ae11ba1f2f99cb7e8ba71ec0f1c0a854fb0c4c24d2a398e5340c399461649423a7ea7d2cb804d86aeb120bc6e2421a669a6dade65cb2c7eff0044999212b64e018c8a2a7f76ebd073428f2b0240425cf363fb7331ef79ce3b98dff307e559388443e252ea4e45b0d3127d04b5f24ec193b3fc181651dae6c693ea9daaa7112d1108fc2ec05fb21345ba9552e56cd0fd186ca96e9a5fc313b494025afef56359405a554d07c8bbbc99b976be40a95760b662685c32a1767ee038b887004852f0556d59798b989dc4fe17c36ec47bfa87aad6711bfdcaafa4b16b6a2df769f94d6f2596b064be974a70df5ef3f1ef55b37bef2df7de52a624657e06fd05f10551878d404d9ad1ca7e68e34f175fbe88df4041b88bea247dd08159c650491e7e8c0e3b1e48a03562925c52105eda9e9baace4297ebb71c70dbee5ab4146ec48db811f872fde65cb4d209dc36b7c80ec2977855ae875876d107be5c2f1ac7785d97ec78f9753d29cb6a1d8d26e94563ed4af8223f5a89a995389bff1dc3699e89102cd4e04c8a134e38a154d9d124f8fe432effa670c40c6510c2c15088d00f2ce136618c106758d881a110a116ee2e42a8e1f8e198c2a27164e1250a5de47bdfd96553549959b47816410891cd2bdd26672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276727672767276707424a6750a1102886301402c58ac80a02b984a69f951f7a89006882d98fb4b185e5111c1f5bedc0524c25b02ecc13c61a038e9f1be339519934025faead81250545c5c9906bad8df84a1c2b4f35b0d420c4d293828262234ef11e282d15272736621541273a4dc3f2893e8e40558b15d94ade307c13493339c4091cdfa320554f481f74e0eca1740caff4913f6089c5073e4b1c0f7c963c1db8e1fb650ea0c987213ecb1dc09987252038f0599e36f059d668e0b344d9ef773240930d213efb14b8df5b70e6c2521119f8ec4218f8ec452ef0d98da83ac686284053a409e2b34b2108ceaca46029d658e0b3f754e0b3ff50e0b30f617953c49940d7f0fd6e034b5147029fbd47043efb0f087c761cacf2fdae04344520203e3b0d9c1995e290199fbbf580cfbee387cf7e8a41d10234c5223e7c6e2eb0e04c0a102cc521199f3bc8019f9b488ccf2d448313d0d4343d7cee277ce08cc90d2c750d8ccfadf3e273a778e8ef1f1d73f2a6c669c0e7f6019c51f1fdcd03965a87019f9b6687cf6d8377744c8919a0a98174f81ccf7004ced4152cf590057c8e2c057c8e430978ef4d5dc4c5e74805159cf982c0520f993e479f99cf1108011f53910968729a08e3329f230f9ce160c96b4a9fa38f98cff1268798ee5b7c8e3330390e0e58f2027c86470c7080cf9106b3e8170134395084a929c2069cc1603e4316013ec3d50b10b0e443dcc5577c864e30799108e3eff219fa08e0b38b017c6e81fb5740a7affdf5a4cf01c001f8fca3daf2384093ac89307006963268923611868597b00f78e076e0fa104d189108e33f04101cb839f30ddc5c35706d4413a6120216c15219b839c3c0bd001ca289262c28889bdb3194056ece2a5043811a9c68c2782680a3e3a5ab25019d08e8404007289a301b20802ed58c210f18f2439168ba8cf8708b60bf321937670eb83168a2e90aea81a6c64b170ac6cdd98b1a1e6a70a2e9e269000ef6d96280ce0e3a5807289a2e1b1d80b04f95bb2c6088028624e01689a6e9a28b60ff1ef2d24cb94b344d2f4dc789a669ba333757045c191a5caa89c9a1a6058e6cb90b50344d9b0833c48b4493341261fc0fa063009d02e8b00082b9794480fb7257dcdc9eaa89261994fdb84d34499e08e303b82e80eb72493737002e0eb7e5daac3022d1e443d80a5b612b1fc288dcf0ff36e21bfedfdf87feffffb3834105876fc1a1e562aa51ad59a6b2d75e1bb1b5d65a6badbd2a2d7f43cb0d37fb916b1bbf6dbc61a9a0540a4b05d9b0b2b26223b66165656565656545c5fedbbfd955180ae3c150180a43613c2c35b0d46023666161616161616161b92aff36bc0d373b4f0db6f14a0bb369b55a988dca6834b211ab8c46a3d168345261f91596959bbd466544a5521941494149b111a3a0a0a0a0a0a0a0a05c9595575951b9b98ba4d8c623db78bb5241a9d495ba8268303131b111d360626262626262a282f22394d1cdfd83238a0775f19ca8385161233e3939393939393939b92aa3a76144c3cdfd43856d6cd2ba6c5aadd66553526bc425b5d65a6b5539799313939b7b87ca884aa532e27dde6723f63ccff33ccff3ae8ac997989434de662a28959aa92011c7452ce2388ee3384ec5fbead59b636aa226cf444dd4e4e948ba88bbaeebbaaeebbaab525f54ef8b8e8db956abd59a361b866118866118865d95eeb98ebb190ea98ca8542a2354a394524a29a5f4aa70bf71f74537c65241a9542ae892f292524a29257d8cde178d493fee124dd8cabdfdb76c66d98f97b276c92284c9deb3ef2c832f59673f2e329f9cfd04b9fb8a1ca0095b4518ffec073bd5a9fdd82afb59390cf28c5d017b0b38d309a04e3ce1e6169848d6f9a003cb57c530d48b847620c61a30c1fac1ed9f6d5dc49f22511ddf80e1cd36e2e9468e37aa86b0841086000408102040800001020408901c9c0b97d9c6d4de8867c02588ddc71b51aeb54f93e00b4af4117b74cf10b0f7209064ffe3be91b8cd764f93b0ae7d4a3e7ffd3c127536a2fc26097e33b2a934d979e43e82b196a2fb52bc69172cf718ba318433d9e73642f26eee225f72730b8d2a26c2bca7373750c9639f899e7eae4f3f4bef8eba18f5e688b8e4e67eed450dede9f700b8ed2191235135002eb34eda6eb49176f3c265d6f1cda5b3836f3ae651ba19f2fbc67174469d0c7b936ddd135551d53d70464a16c6be85b4100c978deabfcc567b732d6a5a7f0eb9bd66557433b4ef6e0e4de52a954a2557703c18fb15384dc2220dc620bc34e00bd63e2bb8ce4a6b03b26ac017ec4300613059b3dff8cd0a9621abce798330e962c83b8410ae1355dd63850b9d077b932ec67573444c6f7669671dcf9f9a168968128639cb57ddd3249f6b1d8dde5518c3d9ad803128b24c3f760f24b99af6f19e7431e8cdd4a49b315f8b249608e72c12bf0310f92452f69b2bd47e18fd35e29d5776282da766bfd15472487c230ef9fb8dc41886611886612a954a9559e01ee04c0d4f77b36874ba05ceb4fb07b1dd9bfb876812e6afc2be76312e0ac391bcd43dee823de97f84f55021354794350247c5df7bbfd91bd187e873e401aedd8ced5b24ea646cdfb9e469d45a47a312b743649f8d54802fd87b364e01c2603f2d89ed9eeee99e9e6dde20eae5ba187d73fc96d921ac1014557354d1802fd847159ce91e7bd8d9de81b18f538847bab8c2988cefd158bf62d17017cc6fda05fbcc65267565d4f22b52ac503354ddb84f935eeba13df5fae841c0b6c7fe51503caf219ce9ae4a0e89b7bf21c2db6b9f6def7533e8953922ee6eeecf6274dfb7467687d8ae100d5541083144cfcf10d54a4814405800180a89c207f60e86f654b3d1078e88456d451a0d129bd9cee61c5c68229be1173066a349d867191a2cd85ad981e5fec1d8b74fc77432be46261feb60f4ad416ff4d124ec7144dcddd823050aecb18fa88ed91efbd8a3637c744cbcd9b69b0dc3a1d102f763994f051a05c51b2f71d9ca6805f61b013869bbe739cb03887c247e87a8ea1cb0d72c8e88653c9edfef38ed820d01c2980fc63ec39e2018fb2c83311e8c7dca176af6d7ae11d271308c7631fcf69536629518164f0c832dd8ad21756a0aa28e298960c208491081085310415e1faff8fd91a5c2fe14899a5760f99bcc3a1e369a3dc4fa479322f48a50513423c903cb9691d87217f959d00116a0a97b4418f95956518002a9f9e59f5d0b583ed7fdc0755d8cf8975f1ee36f7fb9bbfb8a2679f41574914fe567cf5bb053588ed41afd8f21ceede3f60decbe991235fb101fd231415de2563837ac226d04ce6cf1bbfbdc52907cd7bd6633c9edae96e33bca87f770ce3a4ebbc847a5260cc79df22cabd547fe4ff2234652db8a7b1dda575ee26e77affc49beaa89d8699ad466c87e5a653fb9100dcb59233ff909d658d94158deddcd6aa10e026a1f1c644bdcdf1da449b28960d929f8221f06b586bf0f91ef371d83d3313c513a13767bedb279bb397a3723fe85ea62f4c7f71eee83a766f98e92abec5a70a10ed2d7c74ec54ec54ee5166ae934dfd2bee2fa473f6d9de6e918196dac8ff5950bc117195b45b07ce9588030f2a5943c6ab0949f5b7e0bcb2cc017f9b975e0859a7b958233d8cbef23d4e89e88f5c718b11c11fb8d36978d3ee4536c84c4f2860a8c23d6e015be922f49ffa39a92fef1a30c0267a047d9283076714793ba0cbe4879b38d1ffafd5e7fd92f0835ab71a3860bec5ef0a7df6bec0ab6130c3b0caf942b600d9ca2e63a7f7a3d82338d2f17d6876d8bd0f6d0a4eb61375f879ef7c57c7f9f0fa5f7d0311005420b5d6026b196ee4e428757454209a1aa6b015fe284f32291af4343082184f22ff872098982e6afefa16372f561e45926b19a42862adfb121178f1fde9dc119f9fe5ee5dce616594608658bc7203f7ecc0cc60e4663ad070c3ffa95d1860ceeb62390c1f0d6884f7f8b36cbe0d837cbc4da24ef21841042cf8a60bcb94f2bb95e1b3238de9f339e7a0067e2cfbf80101d93a30f9e3fb3c49b94579c1368d224fd8f46b7f6a8f183b0f361845bc6219ee01861e20f8499a72ebeccb89b6dc8e0d1142adc525a35c79f4363f8be0ffb1fb0ffb0ef7bd16f9fa8c4c4e4137dff5dd8a4922b7a1d5a45fef5f23dab22dffbefb74dda29330307fc25009668f8f9322ee08cfcd9c2a2e2f389cca4812ff33f3b4f4da2e14e25a0cb7c1527f33494e7a9a505b8e4f3f7f4374f0555e6a046fcbd0e5d628da85ff29b5b93a7b666dae069f2d29adc796a520b2eb1378ac0dfd71e799ef0fc799a349ff797c521717d179ef7592743bee779ffbd0e7d79b606c9e3885845460beebe7bed256bbea3a6644d583f7b1a3a18fe5996d53aafcf01c01bfc5e5aef3f9be5671fbb1752087b37b76029ad8d968aab15e1287bc097ec45b85a921609aeb60bea70b59c0e87abdd9c66c3d56a2c0d574b7d28ae366b1f19ae163b82e16a2fd585ab9d3c13572b638dc4d5ba0df892bd0edd838b6e0b7cc95e462cba2f544622209a3a08d33fe714614c1bcb26f56f2a5c5f574d7512f4600921e8d4744c2c12051168848c34f1d4a448c33397d915e50542e4c1f2b3ab65c7c479b2d12e72a7ce2b89930cb09438d826d2748c0e9a788a34dacb9025af8799376a929c71c6ef9aec081d3a383ec4b7c6f6a44ffb1bd86713cc7cf706ccd17edff77ddf7d585323867083db16b5ed33d5ee0decb7d7727cfa3a78f4d5bcdf65f2f5494c7eabd5e4b337b0cfde7fdf1d0ff2250f40f865813f0a74ecf0e2ea7880f085850c55f426304a5ef49b892dc938e05872ff06f6f9fb1c8e817002ef80f0eb7e8fe85e7eaffd67e97b19079caba8e3ee096507ff4d6bb9915d20f84dc2ff88b77e87709766413cc30e402e1aeed24e24c35512a31d8ea0e125e9fef2083fe288ea2e5e8497e4ad3a18de80a5a075c42962c1124d34b184b851d7b828e5f51cf79da669de57e9514e8bdfc5e7342d7b4dd3342d6e525e4eb5af7a4d504a29a55dc6695fedbc8ceb5ecbb8d7b48e8b9b949753ad2b69826a99573f8d769b4697a05d4729a5947ed5ebb2fa79dc77da679a5bf9979d9146ea24a7ce451aa9ab384efbfe94b8c5e8947b4da34d50aa518e524a29a5dd129da6691ac7957cf5b392ac7e9ec6699ac6d1cf2817b5295ff328a71238aed3344dd3bce4f344748926344dd338ae2bf9bcef4535fbec7df67995d2cf344ea323ca754ffb689a1228a59c4639fa1cd5a8c74de396d08926adebb2ab1d6bbe846794feb5627124dd3b47b9f7eee68898e466936e467cae9fd208315da252eea2d7755dd7755dd7755dd7755d97a6719cd6c1a0b4aed3b44e139188ba9e2c48057a52d791681a1755947baa048ea39a96691cc7699aa66954a39fd18c769c46359a699c0d9d0cedfb674629a594669ca6659ca6699a46356e5a20528b5e0aa20e293970848c59d682a3971a937dc986b2493e553efcf7121011c6a5cc70025eb76963c7ac03cfb9433ee1737ecf0b6a4648c7810da009cef4631f691c85723f39993fa84ff51bc0991cd551d1441f7bec461158bed6cdd8de9f6eef99cd810358ca321f8c86005930867dc7d69119f69687e83e508eba4e92fecc220f9cd1fe4ccaf939e299699aa4f3ca0b7f6cdb748d13f5e6c7a4dd8cf92d7fc89bac9331a7a3dafd1ada6cb061150205552250e649a40e9232bccde4a84ac0d0d42ff10623b510432336a4bcaeae7b5abf44f42dfaaafd25a5fcd6beebf9f4e76bbfbd5f42aea0c2f43728582a275adbb7cf0fb6c1fa4df69b4ce495d41e47d5e4eec9b04786e47317c15813e90ee2fce692dc7b6f0d1d0f7d43bbdf3ef76f37a2b2cbd2c5e8ef7efbbba292327a12cae84445f7c8745fbfe4bd875efa27f1d25fed66920d17b64b564390ca72b7d744d9df10e1ec7be56679923bbca572b30fe1940b516e96c1d96f4697869bab77efc9bd26b7bbdff5ea779f4bbe23a1df5d961c7dac7433ba17ddbc3d7d15c8653662ad7de08b8bec69a0279c80301809fbc748b547f5ef98c2d8efc87ba35a4d1555c74c22ab944e86dcbedf6fb24cd3ecec5a486c8d3c55ec311eae058b0d61ac881069a57ad2c86f7ca43d6ced6a4d60edb32ef98dbb60af691fa1a97b220cf699f6392416fd0d1116414cd2185bb990dce12d1f7228b25be1ebf6bee4e9e7f6f96e4a17a3e4e688d8f371837df7c48a5bbabbbbbbbbbb471d0f2db234743344df77c3c1710010a5f6e12ed35f351a527f3a188d69e85cd5042bc0526c792b3843f2d34796f363cb4bd715fd77453550f4dbcd5d033c5f23113d89c8bb24f73bdacdf0aef4cf647ad5a4d6e3d812b5ba94286af6d56ae5590ac7d9883feb73a393f21c4098f9d5b6d00e7ae0495a795d688173af5c89378314bd821d7f9c484b3c5bb4ea8f8c8c542fe22a1c5722d1ddba19a27755c7c0950cd195a26c9565243a4574786c2c4444ecc15508a0cbfc58238524864415fc90e10b8e4bec4f1cfa812ff33d3a81091006a8898c6688ba17f3bac837918b44ed23bba93aa3d4ebe88874747474b4d7a13faeb60e0f7c893f4cfcfc34918ec213464e2001cf7f51a3594d9a42b7572dd43ade369b27fec41f1d1d1d9d1e327f43e1361b71f5523716a04b579dda854c8ada66c0f3e711783e8d1470af5a08becc1428eafc1c5bb8c6f5f4b75b43f438223e125ba2dbab12ebd608d17bb7165ac8e698c251b1e85ba7079e3f79463878fe8ff9221ce0f91e6d80e74b4744bbcce73223bd3a8267af268d4a7b842a93648826cde71a471f38a3dd17f4e288f3331b312b650f493f003584a7fb753d142cd56f9a3cc2414897a8928711383258b3651273ccdd5dbabb4fd6759a2cd67cd61658d1d43f2f9eec3a5d3424dd8cebe577d74bec7a497f7201966018e61478badf489b796c27f1cf761c69d97242f5ffc9c2ec6c9aabeb93d7386a66b70176ecbbe6dda6938161d864cdbe9efe45b1c6b00cc3b20bcbb06b88440c4c5862094c58428cb11d93355e3548c0087d154651a84f804ec860170980a52c86e39c020c4f92932d62b20e96248b99b16e300c8642b2a0c21be5289d0f5710ca547f7799924158f00b36e649a652344a4c463c227da2469c65648874ffa8a68f2a48c6f538e1ccd3294b2132d5a4994ab1583e75d654cf10d1e71984b32248542781005132e52829aff2d083f094c192c5557a69694ebd68240bbab05a13aa56190b4f2028f353656458c84097f999f4a954ed9280a6c923c2e48983e7d3a8f4f2eca6b20ae1842d4f652aa72d56866522969347344939925284bd94dfd9efdd6699c23278e64a8242a1ee94ac08339fc747378f6abd19aba5badaf53c47495634394f84999fe249354bd5ad542aa552b55a1be57c62e080fbd434f27b1a5e6a958c97bae5a89ab55027479d5037e219b4dfa4f4bc0feb3aeff37e823449665f7f7e117046f4f3a70b9a078e012c45d60be03c4553f38830f37700a1b5033cc4039224119024dfb30d80241a3d4017f971c7a83594ad462a5593b4fbd91648927f91785ade62d1ead1a87a76f1fc705ddee7615df779988a57ad8af7f2bfdfbcfedaeb138ca68133decf6f25604b61ce39e97bf43def3f918501b1e8b7130d1b228834f10868062952dfc322be9fdd0fded3df3e6bc48ce13dbdb4d6dfbe2abadee469d27cfaa29f4f230470a6067def331caa3662ef6678ff79ff7d6f632a0ab93148ca166a8a172ac4f36d744c068778ba9b11bffb41ec4d25a00b8e147e3024073f34e8f9e8df2802d7cfa2ef7eeb44df3c05e1c7700949e0c11bfca650a530c43a300b15c511fc3d3685ea331519df7bdd6f94eb8e074db3df6f1a27fa29faeeb5df362e7630bef73eac93e1b58844572546e3ef7380400786f8bb39624f64bdffba96ee85f7dd3c6dbc3b4fb547f53eab76e338918dd8c32131fda6f15e7a2fffea64782fbd97de4b7b4384650974e098fa1e47cc3125b30e9c6193e48d3ff246f99fcd3c99c872d13c66d008a84656098939371209a110a110128b796a9789a56290a6e1f17e3707e0c526e2e81315c6d49c4880a5085d681a4f222851f09e90a7139367c7fc31a78d37bd875ef634e2842c1b15fb2c7399a2d49250db51cbe96cd46ad4526a336a316a2f6a27a536a8c9eaa7308242650214f25809ca94742fb613eee404f6c907cf27320af239b990c9e664c19407f14fa6be4c6590264d9962a466f7201d935bd52a38537fbea7b269535be611929f6f832b431870b722ccfc4cb998b3fadd5c47a3ff2cfc60128642b2e0036fb0218c9284fad4789a9f912a8b914ccf4f64c29341e69c382b21d24573f13862a4888af4f35086c5361a753170c0dd6f3d324d9aef02be4cf9d0c620cd7d76d234699e7c525e9ab30849e8898c82f07ca01489f43f1ad5536a6ef4a7c6204d9a1f534eccf9f3656abeec9142f0fc4c025892ac1a904634392ac2cc9f33982fa8842c587541f154cd084000002315000038140c0644a3c178288b535dcd0114800c81884672663a92474192a3200e0308110000000400030000080464860c00f15574c39282b5f117c87c884521baef4cd67316a23120203acc43381a1707cd4ebdff2ec356b11f98f8bb54870108f72e45faa5756116341a717da3c9d55f27fc7a2f2aceaf0df9b692974f426938c16ca663cd5f4ca4c56468759f92fb7abb801c47d1e8b4a43e76da9a72cd70ff5a9359fcbf7066ca3d845788994ef45a9b877cc2946109507e67876f59599423f3056b9490243415d456f44296e75faac4c4ba7dffa1816bd722ce29a58ecf9eae4391eb8d9e350d4e45348a915d86e9d1fd7d825f3ea9059a2508fbfb4ec901015443765a1ab8307b276dda42a338db62b9eb72f43c84b216790af1caacad850e8623b7ca5a146553aec69809828cc9e4770b857573223298304f2b1e600d12ab9a367c9254b1be39ced81a0e04225e6e0fdfe826ff4fc1b0efc84deaa3e6d6816b28b8d3880ab41f47d049b5367d03ab74ea5cf767cf05aecbb3f8cdfd0e4c2c85970729d663c06750bd946ea1d114f0e4ecc169a8c3a12bce618de48336a3624b188b9cb35bbb1ded9dcc7c0bfe23061eae79b3f4a3d294004b686243a9def891f9bb771a42c847f4edaf1d12b59675f156b87fc59bc0f575756c6054c8b837b5759da4ec37e7e2de5db361ba3fbf047bec875e96f20b9ad80e8e7f25f4ee6cec6816a1bf835c2ee5457167c0f7b2285b3428885444639aa1f4893c705058339ffefeb7a79b3e56b027b703459203b52683a83a0f75e9eb78e65c5bfd7d763f8f157618075428364bf79b1289a990db9daba20d3f2a0508272f78a5f2913f7784b3da612f4de8d2da67b8bb763738909e44417c523814736483e6c3c0083a3f469a494b57a0e88625844d5b2537ce115c309c7cf88ded6da10b53d0475686f48ac76194320d9adfdcf3f4a960c06f4db75c7fe1d0d17d81a2a168fdc799fb91ed22617d2b6833c947395aac1ddd6718fafc77673e2e5d5ba48cc57223569eadaec40dac37d075047a2abc4fc8c9d74d40c24102c3677dd5335533460c720517ccd61ae6490fb20de8cbe56bc01e4e84af591e3002f50532de8e34a8e4918d74a19e0f21d03352b60d24cd5fa36ef510a4fef2a629fbe4f4b4085466222212b7ce817bdbee963ed7b8fbb35c26f2afaf3aa02c7acba0517f1a811535e843f79a76d7c682e61d44219142c2420047b7885d429cd2fed3bd144f0e63163a33787e2954a373248afc0885e6c86f3ef8a1e16b7cf276119b81aedc842665ee1944418adb295f67b3a157e5542673d6ad0db6416fd0ea450a635798e37670c75e181ca342984a664e0ae883f14cbdb67951e6a473180acb8d2110316b89963683741b4f0cd10d1eae58ee3a34a55afd3eb85ba8625f2939743f496ad8b69fb4c61c12dbed15c13f1ee17bbc2f258ac69a24e77eeeeb7c1a6145729f8a157851a25bdead6186d0d855ac26852756910439de2241d3ff47c6fabffeefdcd59a2ca19a3041f7cfd6a7550077f487979d6c56987804987ac7067bb7965844b57c97d10266e0d6c98c406a98a538dd54c7b4678fe4ca176f939fcf027d38d86a2f99ee458988e23ba27ce11ba9eaaf02ba0dab4f621feb274cd7b61bf60ea510f4567a078dd9c517be2f2aee163f8c5f0fc2a24a0f3ab7f698a407c10895b36b01a5317cd4a1f44440e8844dac8ae1b92d7484dc387aa3ac0c664c9a6713652cbd799ae84b6307fdd33d854c37ece5a621b66901af377c3855c1fd109141a192bef12571297dd11b7393a5b7ca9c895ef746044c379cb468d92cbdbfc2505ca33b9d87111ee51da3b1fc42e857032d939e6073d973209f0163fee8c5e6b52657e4eeea9eea0539a88e6ee612ba73cc6061043cf72e125db9d123833d95686c229a596f2f80c06c71109e28cfb54de7fbe19dd205f697a9c0cf9133619d3313c38cd442051d05730533a16d174e0008563b4b84a9fdc6dd04422f5b0606b05896a142a63506cdb4eefe1bc55a61c087bea2bf01e4ec06f72bec2db940214c19db2fda092c6c8cf88a78837ca71eb483e2b33ffc5ef3ed2ab0bc0251b943a85ec18af93077a65455c4d05a19f1e916d4dc1d67302a8b1b7b7ca322afe4b4ff16edcac5e0aae3bdf3c36fa5dc93a4ee9fb4b9bf842d8cac7967ac702ccc59c9f27cef29ac1fa63a87c220893f90c4c2408425786b6812a21e32571b1f9298a74535a7b18761e054ef524ff2ede3ce4610ef34ee3cf529bfd97ec88d6514e1010861d643a3d937e15de87d6734b79200fe63716b64200de9a30d4e3bbeb9c8f5bb8a33efa876a4b00033824f5bc1f5f4dc8539160c8ed7850633d8ea346e43724675581fc0b9e66df1fa79b5e4d211672664f9c5ed49d383c15c2f30da6995a75d78f196dac1f2067dd73c84510f15b24301071a2ea9da0fd9b0937ab7e864faceb467b9ac13709d5b25086ff70b9886e46546ba96439161ce6b962ea74115960cafa01baf856c7abc03fde711141cb77a464209d8095313b4a1b52d5d06572b1dd95395d2514ba29f2525252f18b6baebb2ae77367ed75055af6c8e1d1422613e80be3bba82ad95fede01bff96ac4363001b980f5dc2fc097a266f64956638a5620cd0ce64f89eb2a5c768d99cc6c033b984540eef0ecf1f166adb0eae6fe094cdd6a56f25a1941ffedbf40c6967f0d56615f4191904974a1fa19a275855fcd2cadc306b50a82566867232444155d64cf1c9811e91f3118bc153fe50f8da3c73866c5cdde285eaeb674c72b588018e42ece0a2589db63862d71aab912e7786e6d46b1b5b18a1ea98ca40937a6812f050e74a81a0ee48a51c8b7cf1c4051f85373616427a307f23b7b892bd14f28c73778dc2801a8c97c2ab851b6f68253dd3c5b54367f21344e528f247b76846161ab81896570a57be2f9c0bbf7c3bddb0ec68701d78b573622d6df09a8e9e6265142994e285a9f94fe54479096ec302a05022903674e00bc557b6d2957f75edd734f82c020fbd7dbb9cacf967996c2f02ff98c8684aa45504fa3fb95589546c3095cb26c9251f11d82897c3c84b09dde6ad1ff43ef65619d9246d1c4e1aa8f58d3f0ef6c2cba0721fb5fa9a0109b179e988b6fedd1366da724f99f0f45df55f5878cfa4e39c52422be250485c636c12b9c6b8b4d140dbbabeae0583ddba0e7fe939a9c6345135f798bfbc675a97cc4fdd490cacadbb790a54a62db0f866c4b58fc2f950e00aa71c62e1a39d6d3b1d3fda1aef7e7dbf841a2a26c72b227e831c6988829b3bfc2df03be788d5183009510a01da47d123dd1e2762de0a22a3f399e400dc39e6da837d0e0afb94172aba35c7a16cdb9327d29d7f00b220fa6aa33eddf9a7bed9ff319fa9518cad20eeffdfedda82ff4f498877f4134ba4dafcf505e90b69c84bb78f7ee22f599e1382556fac8fd9f5f7ecd1e1ed39fc78228d79734f352f303500b3f29d2b028fe43a709ce96332928aa51ff7ba1dcd3ae1bd722f918a49f2965d94a67738a917dfb9db517b00fc4686ba7ac9b34fcb7182835925c26a03b6948d556568cda2d2badf8241b055015b5befa7bec815879a71d3edb348c26ee9ef659c5c65edef46f597f04962f8a74f31a64bec72fbd15f317f56fac8ea6799c72c744a992cf1e71f5855445516942a0417e136c0623b98e93f7a1ccaeec13a98ea3c873240272c97b12d14103437463d731abf0883fe71751f6368a5ab79f1f8011f33a6c9a4f6ea7fe4a65a0b13c7f450012657e75b0c29d23ca6ea182cf4ea94d2c07cb285c6b5eb667ea8e0cfac72077fd5cb351cf6c71f7c5909325c04a6e1f709c5c0c63451f120e0c45671f3e6f2160961e94ace87c18eec93633003ba2befac7a762d8282bdeb93774a49abd4761f28971fb2cab14bba48acd72b26acbcb5a2ec65db7a37507530f9ad5edf7a4516d8b42a832a0a507ad88b44afc08cddafb5fdd40a85e9ede0d9ac84e45fb33299b54c41aa94e9160e34051bdfd9bbd2670f17f622cbee8a6ee5738b5f165498232d2766da020bb07ee90d6fdbd21fd2a97080ad741bbcb80b64f29f418f60c62a6e7559e6448ab4df93a2ca045eb8c6ba75ce4a8e71755a0eecd4731c088d32ef89cc8e842cc8e615ccc04ed8e51310be083a52231d89637a121918503c3e8554bbd590843139c2e521de80d8c3da09b5eda2bf2cd25bb382b7acc3525823df6e971894dd33201b6a1e32a22d7235b2e529d743db841e98e7bf7edf2c4c429b5adf666c986ac2373e4d0b1f22a383c165aedc8b777327ceb26ac91b81728956ea783a538e040738414691550bbc9d5c250fe02d337ec6f32ee9a5c31866016969a6dad665d109be622704a2cfb362f2036feb59f0fb515e3466ce66d67eb6aaf658173e71cbe05a1f4fc73f90b02faeeebea1ced5d284019b2398ca1bcbfc4c067ea1c53f2f8eb34ba05da9f09c65ec139afacfd76d59083916229c84a276eea7e18e74c4a9e8ce43efb60543c4affcbaaa0d681b442bc809526282f79c956e68b5d5a009f557f6db5fc5593cbd124d0fbeec4dd7a530ebeecae98e7d82f7b744963018d394f366e38f3fa2b84457a74c911fce17f31471a9b3784ee91862a41c5cd09a558a1d186258c06bf7938705687a33024d93159c0b6f4555bb69806aed278eab7f6841292712dbe9edefdce870e66200a8c360b69858c7a4bd9896f401fd506ee45b553546ec89ea376992a44d5073af4c261c05a5111f7db4a847b95f77cbc3bcfa6a62a00b42121e6dc959ce32cd6c1e92e403e4dd1d9ab055dfd520c095189be2b2215bfce3cd6e8f0e576ebfec4e0ccb5035970c7988faff832b42b48faf936e3ad39ac12157b6c7adc6fd5e9b61079c9c91f14319c2b88e1aec790edb2cadec2530d16c31a4b6036a0040826bb06bbb0719f1a95152a5101e8312ba6eddb4e6c56403195b5ee817bf9551ef7cc1bb34e2a284b335ab025715b84076eb97c07ed7de576452ac51f06ed23649ae0f82372cd09f3bb056d71519a763be286bda420b43de0a8c51980ca7882388a846742d7e41d28a8fe8e152505fec7a8a723a8c3a8ea0f2eaa173e0100b58e3a147b608f8392713e60ceca22acce80454257295f9910a51618e3ae40f80d43e4b8c32f61bb3f89d7833e1816205a85c2b430dddd4cd38a46cf09a08b12a8864a18cae7cf8ab643bda57c31a71f6f9795a4cc0e8db3f2cdce80ca3b634039099cfe0daaebd5561c33c74698f36b3d8eb65d5317ad4ac958b354f5456c56f37ac3bb5f5457850a5c5668c6253122273c66f9713178683622e2566e185fdd88712a7a8a31d90b19839a8824edb57c90838c93ea930cd6444819ce346a19a3b58b19c42d573396de5c353983dcaa672c3c8ccc355c130d6ba4e17eb54a22151be417c23980882669be2f624609868903ab09011213eb0b3ac807512a0e32005fdb72e829438cb583ccc37b93402ec4fa0c0037bce6c4047644f4f5927f304a9e63145d4358d0a0848d2fcbfa54029355b885f4ff14068fdbb1b50f1311278836e8695b482fa64852d26e6a7116b3256d138ad986d34ba680b67a6b5ea9247c466a563c86f4bb0b535a323fdba89f3820d92fe06bf70c39d20aa079d074022fef1af042381df2936d2f8ceee67c1f36ee5dc7e2e7467044a273717ac78128dc6b0f45ff761620bb045de5ce14c022a75bb11d2db01ef710eeca04e05eba1562a0ac7f54e8c7c25ba27ea00482d4f1c0cefa0a8a930b6fd9886796717feff002e5635dd81602c9899f82b97cb05e87fb0ee8ceb52e75126a07f4fd4625dadb21cbff17f8c9d19702206c7057a82f47c502aefc85db4bfed1738ad0e79a3d145f031c67c0d19137aa52a690d0972e0c81b9aac918f89f84c246128cc0347d0851435312755b954367bedeb2a47c1122f196a55e4598fb628da19c5caac755e3987a1a9fed6672a90ecccfe8f39ee02b76d5c35334f0e2d7db30365a5feea4b85762eaef96672daa6ad137c4b047938b743d5336798984c4eee56e50e4759ba12e5815bb36df1672e083321fa00bf2f02e4cde9385f186abaa1a2724ca607aefc46b6af853c41f5d504c563999f3ed6015f0a260676ec381d999ef01b21c337ad76cd64681c0b36b6ae88830d1587c80441a899bb71aa9d783e66697927ada2950807b2013090340340c2096d309cbb7ed7f34d9f99a742415ca93e7463472f1fc4eac1e701bb5287f758ea6695d25b46fb44d840f2ab8db7accc145da5ff2eee7ee1730779d47b0de739f5270b8db1073b895a236a83c4b857b94ed39d813788fcb82486ed4d163bbd198cf4c3f1172fbfe2bb0c678729aab0994b53ec749d008d77ea1c9153dc71d7b4c61911ddd624b33bcb2f4897a82c7d6fbf76aa4843e25ae9dd239fcad4c451446eadf066504e7ff136fc77fef01bdc259a937637fe53ab632efcd3bd662e5d008da1e2ceb6015ea1606d004ae49089b3585c47f758a4bc6d5ef6240915dbcd6b288c64931cd3c2192e9e69617164fec8c812d4bdf22212867c04aea13e610edad3d316a58f7be73863ac1c9a7bdb545974443c01e67d492cccf66b1d71073aa78d9539d2059d8ea6b6fd8446693978227fa808940cd1e94eb67027444b02ca6f2e071983fa4e6cbb587ae0b8f9c52a49aa22ac4c1696d91e3684cf26fd32c1903d4a9e7439c8868748bb0ea29aa858995f3194698e6dad3e244bf7522ede5f8f69ea0f10984f2d9130bb22ac8f33228b6cb7256466f7b6b7fa6ec9dd74ef841f8582514cdc4ba51c6be2a788ad48fe4b1cbb033cb851f4b83e3d4382be8aa8d0e0e4be0dd5420d86a30d3a5e7575beaf8da06ee1d2465dc4e39e6a1df59ab078c0a9676ac189c589aec6cc7beee4036350a8ba37162adbe8dc431dc033cfa27b9fc5d4332d65cd59d63fe05d0e3c56d4c01f42a4ac586174f4a83402f3710e6807ce9a551873e9d255636318e5de5ef56cfd78e0192ae5f77e50f887333042112e9bd71f738c29c9507f83e25b3604a91fcbe31701c789e4fc544c0878646e16be31c909b316c152cb4fe5a6521493fa79af62d053965c32d464ec590d74532686a29b3687292623a25df38c4c8350c008223c2cf9a8a52a4b6e5baf3b2c56c9d8075fefd2d9da2262d0a629b02cd943d71a6be97e9579325d37b0b27b48413396da17f9e0a73b3149369be21cbc9f68e25b45a95b053b5ec29f9d94c42be943bd973c0a472a27d6725471e720ca8cba4a603accb9d2fa6dc58f8b52473510d99ee2a297e598d7b2751f27c3a1633004c1dda161493a616d224d3c994d136fbada6b4253bac3dd60e6809d149e332819e69526920190ddd801d032882a28e3f28efb9115a94371e0bb454fe4f6ad50671c84610d0069421aa3790689db7bdd3ec4c0cba8b1f3335e4fe285bccbb428d0eb6372bba73f36704dc25342dc6f07bbe7b314fb0bdd5257c9194ff2178a27790ea5a4f1a484902afce31217677b8940fecec37897d5cc32407f35fa3bb4ea148400338aafdbde323ac4c61d5608f8d88b4f108ae6deada15cc1f4791b4f5531a48926cb02bba4daa64281efd0173a0cfbe595a369ff51c2a4fec65ebf7b951d48279162af4d8889d66b81d0f2328e0c94b804e2c7362360ffc1ea4d95c2c7fd526a6697306f412b702df6ba47f5a210e0a9ee73dddbc49fd1446064516defa0e96fac6d2e5bd955d2cec0a7acb532fcc9f4c948be2d245e8a14853e05422437484137b8eef3dac68291ab9eb35e8973f42439f3b0034c9fae498f187a1e1966f34b3724b036c1b59eeb0f6a6bd806e4510186ecfee30d75bdbfb4abe33cfd4fdcfea1ebaf6f0cc8a90f726981d7e5a4b5df386fced8e422fcfd70af7ce11c88063c900f1be3ed01dfe8521a2a7003c10ee2cc5b221ab6a14404cade73e77bbe5cc81aa95778c4125e90eeb84b62c0fb8f7809cddc42a112cf04c955ab2af6a63d569b341fa5e437f61a993bb78c0c904b5ac2233286e2fd5b342567b87d1558195ac9e3e324eb40401a950bae283f3ac7e4699fde24b16ca38be938c731da8e4687b53d0fa318da4ba202bf44f5ec4f14ca96166f4b18e9160c3234a532fa3444558fcf39766ca170360fb1417626b4213762bc15fe53bbb3d464b77367bb79b977db313309e8a7f25083b767a44e7d45ec595e0e9751c460102b1081eebec6adc19ac8a18138eb066a8b1337aae87080defc44628ca70d6753575b96a3e7234999369f82286902a3c0526b3e725f6fab0ee4e147a10139df3f3dd45799b5cef0a187f7eb312ae9164e1d0c08cf37f0840370e334ae1bbf21627359217885b298a04631282e3a60910abfd0409452ca85aba2c835280548b9a3dfff84a1632f399af96cf914e6d5207ba21bf70187c8fd7395dba36c951577eec6559cbc49500042ebaad12a2b8f1d15da14bde7e29573e20a6e22a32dbb7abd084c8cb59f02a912e37c28f3cb46cf48f40d667810c6bae553a963279b9a917d545e28b55d32aa69bb32c7f2142a4bafd58e6a2e338d6b928d01334f78bd2c02959e31feac74b9da5a44f42605abf24ba647c117335bb3452d62b75e52770cb751d1ad2a19fbaf787d94ed3f94db31d693f04555ed3afbf0bcf85594c44df674040781a5865e04e8bbf9f4de16c27c062b299b130b80ea3a89c2e51914441432f76177702f95458f90f74193ce1ca69d5993938d17f39332e0745a1ad6778a081c754071fcdbc7e76dc7cd37489875ccbdb2964734f2c41ff0e6fed4277afe31c927ca140cd41a484a4e1866c7d7ea0ccfc31bd8df3eb64abd9d2575827b2414076c4f497d0a8829a57fae97b806913dd12105a27803a1b0a8b927d840f83994cee873e971ca699a8799a4619327f96c1f362b9b56c3d8547ba92459069390efdfdab9a647953ff04a096858f5ad19ad772fd0caf23ed6f8b683a3b14bd213752daae8c4b81b3adfe8345bf1d67bf3ac50016ae1cadfe9816f77a7da3f578fe0c2415ef6bf019b302cb97686dabfb9554225dab6f6b7bfd74bce05a84dbd49d962afe306505a07b434e999631d8e2ff8c15d8ca2ba86848095ca9a0885e3c7a169f1ddc10b0f4678369817eb0bfe1bf7f297fa0756690e2a1d9713d8d1db0d25212f85638aa742a2c5c2daed48a42d47a36d804207bd38e4259372a0275491c53816a4a70df953e9ae7f09314889290fb40a9e1930e21b00136551499c6aa53a6000535fb6de3138db560b855bfc5854211976db5e9ca1e6c92c1dd564bc4db09cc597037b4a49fafdc7ee6e6afda63b12b18a3bd63a0739947091021d7fa11d9ee0cf9f2ca9c6c3c069b8dde0611d9943572ff37a7daf2d812d59dfadf9cd25e1c5bb61e3268f54214b445693bddcfcad4610b9fabd6f14894c01e1d1da3fee20d36d1471c058b103d51a93538a93f42f9164c2458f1f4d9da519226ac4acc5d3e8e2211a41add6ee86eb33d0eeac80377c203d7ac1bac48ac56272bcec40fdb60218b74a49c799c6752b40af944840ce53b78d89628a92ace322214ab4187fca0745043d45849d73dc81ac9402e0c1c84a91c628a76096d65a82bdcba05b94a2cfab8cb89627ade6a3c3daf5d130bc1284acaec4fafb84345b41089180775ac9f61b909d30a842ef5e6179977bef020785365db17aebc2eb6f942165b3b374d092f552a3e72771a1257ca4d80e2717d2a491be1ec63fd623fd45a8c827027d1d29173e20812c1ef54ed075c2d42160155a26d565539069d4caca77987de3d369488fcf8e61d0c4c306c666754453e3256aa1aaca40930a2b454f5040931405280deaf11475dd14e6c5c6b7f42f9e72250472e52245415ea4ed78be3997555d0138c68d754a8ae9935cc4281d21b44524388d9cc8a654f1e88106f5fb7c3228b5e9f08bdfbe7ff934ca4b57be7b8e50bf3696cd00ff80a7b1390b9f685ed81ae97d7f2c192d49059026c2d31f55a26ec672a005855edea4cfe7728f271f3603a20cf188d64e772a9a60f489ba8b93f4152798289643e6bd41893c9816d5a4abfa4811cdb536a238a2a563f3145a39e328454a3a6caa85d164b7bfe6096d05740367701e2cc0a087799d8298ee97f7534bba15935cf5cf73adfc97a86c780f77736cf89a9a0cc62da5387457cd860bcebe58846af5a724c591583911e8e310298fb90948abed17c6b9101b576896aba07161187194fcdb7658756704429bbcec8724a108cd2124da64ddb392ffc09ea84b698d3bc597ad1d5f3f0e40a1d150339fd5e58e57717deaa7feaa646099e374ac5b8306be4bd2981c63e8e01661833cf7963f9ed18bd65b279965fac8abcbdf59d05330ae0f80e60621c5357292e47625226445d1d1aa31361acf5caa413b0635b675ac60c6fe2caf56f5432b9909e1b1c6ec67508c47621718f186dd42531b317ed27cd1b51298e3ee7cf4ac5008f6f937a8673e35cf3e73b7fce4c85e81a5491d1be85aa863d159147b0c2b0458f3c7d79e44954fc4ee4703e57744ef685b7349e3d654a25f45631de496dbe1d46860cf45220410a15f0b6ee12d4769740c8d8df9c1927414d2da171f84a0d6157b1d1fa59e4b4699f3651ff5645b521066f43010de5c90477e0394328cef650376a3fd99d69592d19ed60ae5e69b0fd2c1057ac1efe9e5ebc8a5f19ed6f31e1dd751f08ec3617a1f8762625fd41c5e33fba4f805c9109a2f8d72513a44667d9c4472343af20f896f223c5bd2989d27880366f5bf565588972f54197d239f546d7a595ab8890cb728c79fa274260d59a6ee7515a5cc8816eacb208401192990f2fd7f8c93fe6a11a89ecd0c5289298231282e610de805483da9a1cf819301e5a6f32c4a0604cb0bca5caf091d1b75537b7425e6b7468059a7ce3628bd0fd97b7fd628743af6ad13a2cbbc3b0679c2c8964696fd7200415eb59f25caaf4dd2e6baaf102a3486a243082f627ce82f083aa9c841324cd5add0c04c25260dea10b33649d77688ca47b795d219bdca171529d82f503262d210e509723f76686c04a965966d92629582829c240aeea0c05f3c124a362cbdaccef1b5351322ec4b92d59647179c790fc236168be90b36afebb3ce0fe65947a2bdcb4d4c0ce89a4408a67120a97218d20c91c8c969785f2c9674d468db8a68e7eaa0faff20559f74faaf7eb4e0950147ead0f407ea9b57edfe5b58ddc721d6df4c15b719efe2ee2bcd10adf0f07a3d911454354621f4132bd14e68d42c7767494a0e7786094e77555932db49ec0b043647e10fc665ee75a6a8b3f10c88335ce30c7224870000306e01dcb03522913273be1d750f56dcc384506c3034c6f9d461b65fff35778f09f3784769848972b952f605c7f4cf8bb317e12997267f190b77801ba54e8d113ac4b79ea8d714f846f6730c8e28924e50a32b9b8123289046204df779453341c9a05e05813c494b23998a228dc9aa498cb098b912449b3234aa307af70d7f9005afba312a4fa0512a69cabf305b554ec6e48fd497fe9edf872037e9a59b4414e1394741f8054bbbd4641f9642dca08049d14e7247e93f24012b9da9148bf3551f6d0200063c63b7d83ae04763085454e8a237431412d3c3929b028e28b668f1bb281d7376b21f6bd4181c7ca674fc4e59ca5ab200d1287300e88d0a816b47fc08f22d2a262215fae07649c92fe1ed383b92b310ffa1ed77c42b2b68e073a88545d7d245787fa55989f54bb416de462455d10f411a98a6a7cf24f96ff49b6d06eee9a7374964852ac1c9cce4d307affcf6252adf069035b6af568cd448f44d8aa7a5954d8807343f412a61f84359b67231de282fd8f2bc738bde6743fc8800741da92961da0104df4cb576723d4ee1a5ef241e27a349739d595188425f480c2ac9573716c606966fda62b81e6c2168655a3cead19675ce6099952facbbd70dc1757b8bfaf3a894a11fce0b9d9899065720f7c4c79223fececb3cd086cd934427564ba8c269f8d3a31eee14629d4bd70471ad80ab18f1421c50324ee97c9cbd8375ab1f1899e74db4fcda824e090ec6489b0a7540131895b3ca11461b2dbdd7bc0d7d8f039326871ae66fe4074bde6bf41a0e06367e25c604bd2603cb6b8234228188f9a71d488a7a50a74d0eae48a90e15f5ad968f517888265f16a450a64ae684b9229efcbfd3bc6b9d68ea91859fcd6e309223f889c71bdea373da2550dcb9a69215ddee73dcb0b38a2ba878959e603211f140d03431e01e4586877c832647260c22f639d34c75b3d7572d472ec7a2846a0a69aaa1437ee76e88502947b71e0b97109a2bd75c4619c7fc2d557a2882b17e9455f80a160bbf32e0acb3c22d6fe9ee88efbf3836d1c246b5c9731d94a196880f4e4c09c916b5a40a3897895b7c7c4830532b035fa5479ca6193c9213fb8f529795f309f4078d476207f33d201fdbd832f2020063bc631ecc00d2051fb1c729debc398c75578576e0934cb63e67f182d43a1cf19520bc4bbcff0f524f25151a39465acbc87d458a8aaff218b463b925c892852fef597866c2086bdf4a36b7a8fa05d23f38f40a5642b96bb97f8c88388a0d638f9c6133979b937955f22dc7582261d92eb1ef40389ed4f2c6bf818ee5c60118d0a179c17e2dad7bba8e685f7d3549df6e729433efa240156624c34f71016f2b7e5479036b3209e4d4e0f03207f35a1fcb16b8a67410855a1579533d6f35575dcb19444fd1e20a2dfa927424641df175c8a29cf695826202685a3c53b8346e3449f894c9fa6252bcdba92285064012652be64e3219ab991db436ef4c8b72a616da81942a5cc4933b1290dbf112383ca5a3666fe0785a2ed96d2318d27981ad2e01d6d9206016315cf08e04a9afcc5a2c9bfb020472e1a98bca5017410c65579da2019aae52f78cdd0cfe5dc3e66458617c46f9767588657e19804506c28d51045efaa90686146e599e02dae1abbfab0e087147244348631e4230cff24753e24828600a3149947111079831d4d78b18edf47bad25bf44d8bae2534c01dbe7d39845435d69cb7acc480ce3ad017a9d36f784ddf898ee3364d1c56c499313cc1b26fde218291c0ab0a0c581024d8483f585af7b8e853aa3dd488cd5db814452faadcaef1c19273887069b7f19aafbdb2446ff15b0872483deef982c0b69085d598a59d574fc7ebad6f7736095f0fe0c4126639259baf8a122d4f0f170025f0796c00c9a4541c48dbba94b6f3b80b2a4160daffd3cea21edf5455c4f098f76c1b90905a1e6f06c0ba36e22f3dfc70a21804027ea825065df2be8fe0f4eefdcc313dbde9ee467344b17dcc04315ed3c50990a9879b440cb8a7bd000d885e5f499da2440c308b5180f1f6a3049c3cf4c63fdcaa0658cae59cfe4c6fd8b5f28a39988517e0a13245f2563aadaedf9bb213ff563c425f5784744054cfd020a38849f261794abc30c5fa0ca84c21541437135506f8071906138d3d2abc2fbb6c7ecde8a26423d5a4250d1afc01ed81b7515c4c75825a84ed1737346360f3f2daa1adae99bc23d3bd38f1a45e346a6a388f9fd25a14a237f14709d79ec8f0c5894cb268bcf90896b8f2dc520cb2e9437bd00fa6f767cc8cceb50275a9eeb399dc35aa1c78c1eb1e4ef5f72a1b56e358b14465bf583a1befd8d37605e29355008118b7f18d4f3954290dc67416f39557580ef42fb9e35f24d1d469cde6b17061e286c5137099a82f3818a544d92619413e8f9cc15cd741199f3633a82d8977a5b52574f65c90acc8d65763505a0b943289958e2a8a708632ac415c2a9d9deaca7f2983ee1ca23ddb79bcfe74b11f8b3bcaf729c0c19f732920e6b864a76d82865ef5d1506796b518f0e2c15ada58eb606e56b5d133e5d5c31447087d01704b32ce0d66da1215a9747df1c4aabb29c2bb50fa2128b004df8b96dc96958ae85d3dd52743d6036b897da4160d67303ebebf58dfdbd32f0155e18a5d490ed81370bfb5dfaf9fc5c45ac40e1dfbfe6ed60acfab164c760e26328c68738ed7c5812ce9498ded59dbdd64f425cdec827e009fc15c77325001035f05c7b8fe0f9c74a62f005e59808cb3cfcfed242e843a4fb5b83153f016d05b7b9363a58505dfbf0e013ea9da9d2e448d8cf4b4e3fa9f6db018f22979a09671c4091690b62ee3e3da0a36a969ea1ad77f3291186b5347a308229c2ebaa609548b071653bb58ea2f5218480d57edada859dc3c3e6f092003610ed1e9ea2ac49537541fac198424c7dfd95b9c153f329045421c7ba24e86d37c19bd4b1589ad778e2e29b46e0615763aba4f81032e29bffa9674a26af8f172130bba438f526b8470b27b0866d1955a561b95b6012188de32aa42cc956c9d5f50a14e6f7613c376827174e9ce7424ff6f80be46dd7fb85723bd66f20b54b1c54044559454b0154f25fef75993264effa23d6ecf65dbd19f23db0f3997974c4298822c241efef7462d393e40d64b83286e44d65e9242cea185ab7ffd17e2361ee08cf09593f875a14f51159246040df2a6567c60d00b02d661c3d928fd859ea59f1b7ce5fd9a587e139aad58ec6ac220d5c9d8ad7b0a97ff8095d98b8328683393f7948a716dcb9090b847239baacf70659d113d4fd6a482dd97b2aef3eea4e31d71c4fde1f1831370b67061ec94ab8c1dd8ec0478ea090a4e4be01309c149012cc521107058e2a594ab4672ca250987402692f05255483b920204f0fa3c4c7e965b01d20c0382286ce3c6a9de21c14e94a484a18ed6091ccc7d43c58602b2a184a3f189f7470a15614528d20276d8202b45122d1404fbdc9a3c80e696abd84702ec54cb7024e5b32d159c98e26ac8f9c46b41588fe5498042a49734a95ed558d121e53400e0662999b0a1c93627f541eb4a81429d40091e24a9db45df10881e3d3c10c1a424296ff0e3c4e246273e0797dd31fb2164082af8ae4f416b13503c912b738747c1e83c40c4a42114dfb55de2e58884e50069e0eb1440d7de7d625d8f974488d34fc16cef8bc9dd01eed01fc447dfa378148cc4e23202c5774872cf67834c0132398f4d54b4c8fb76d17a46e32fc50fe891938afc26406aca3ef41c5060ad8ab9afa817ce9039e81471bf404bd5853302602192782fe27533b1228c94beea393cd10008217ed18fe6420ca0cb38b0f867a80fde3ca08bf018426f57a7a175feea45b4d6cfeca7296195e3017e9751ad6ac53aa0a0785356aa093c81b65a35aa06fb6e09f9725e0ecdffca03bf2088ac5bd952659db96cd577b8a6c52e0e6c8e06cf2bc07f4d0b620b9adffdb411ec2fb527b84677c22c3b1152328ac7ee4ddb51ac4771a39ec1920f71b2ebbc73a69fbea37e208e6507fc656a52f1f8beb0213189dacaec9ab779cbc411fb70d63f7dbcbdc906502a136e8aa0324e4b48abb3627a6a087e118777c822fa562aacdccd9f98349ce713490bb5cfea577cc10e5ae633a010f7d30437a089e486224be9bd3dc8e0b0a0baa60fcb85d81427a55322a996ebfad86bca9d145ca92a749c8abeb5ce75f20472f6e3cfc995e3248b6682a99c1ec95393e7ecae5baa430e9a6c41207932df9e60a9ef964af9590d13f9c9dcb34f40b7956f8f3685069c6c4c22d1a65087fcde6b6cf3b5216f0a5d707cbd8219a2e77b5075f380e50d03a261bf7ba0fa4ef3ce36a23ea2a2e8e2202f401fd0d4d896c2f95f29dd384f11d61c00c23290909d45324a4e92602e50c06b3b253e33c571bb1d6f101b6cee388c991585813d2b50ac5c45d3b11b1529353091ebf27b18f973673a099e25544b878a822ddcdbcd25b6697fbdaa0d4aa88706c23a38b0ce6493c37063d98585b78ab90dcec9db55b4938cb67608b946356e8c8589e4230766c999e2136811b96fed8b46bd8cc367be81fd0918d41549951a0a2a7941685e0e04a3b485218e77009a63d2160dd102c32209163795c27a297b517dcf5295b251164c1838d4b41b827a6ea558abaad1011ddb51d1a06e061dbc42c401b74768a61978db5b7d0a33ec2aa5e178a9dce0a948d1ce0b5670f9adb23afe554c0b0d1102257f30fa149204b449a8ebad40c88cfed556e6316753df439ec24aa14184ada382eed8875625edf034d0dc0dac76a22167b8ff62713250606cc27021a7fb6e7f84483d1ad0a19c8d48d089ebd8feef0a39ba045fb5ff97262068ae27c13131293d68f8d4ae5a9b64d0ea68833681ce0c8ddeb415d4a985a276d1a4d368c9681bcb029b5984d311da69dca15700342d9a0e9926d06402921972637ed5ba21cb4cc50ee25660191247d25574a27f1234818c534ba543a2c559b5e29eea0b399453a5dd17720dad0dfe3af7e10ce839d86b111721dae0b50f22791f965952a49793a71706221fb331a0a55e611df0d796efc5bce2dda8684419bf441a2c23405efe798a02f5d0c3f1672195225f7d8b012356585c6ac0ad69c64eb9712cbdfecf20a7b5c8756f04c2128066218d8a86a96045084566bd278a06bd0085f88d037dd4df371ea79930bc8f5ebbc5c365756a886e562bddbf8e867dff9f7e1725b06de63567ce786a284205d2b2864d1a922c77b2d7694a6e1ffc7279027c3188448b7509754e1a61dcde6263c74aa05c608e0989a4088b9348ec73282705fae615c4a1d8dde603b6996711dbfa6b3af5fe25d29dada993d9cd437a845f4bc00c6c15b7381a624c76f2a67a0b860dc8496a557c5c86b795e1f38f9474e239029269d6e5e2c8c9d143b51cac8df4b8d54e1fbc0d876bcc1b0503eb29b2b5835ee3a0217b8d1617992934a005ecfb4548a50ac02ebad1401b38809fd50b454c713d6864380cf33dc3822300a18711d538041c91a3f244cca3c076b74970088335d5034192e25c76f50ce81f1f8f685f4e5f1746d0e0b9ad7ccd115ccdbf1a98e1f03227a196b3a8ca5fca32171d5f0d4bb73ce9422da35e035401d9eec1b77a73cd6b8b379b87640cbb1ff4b907f2cebff9f19442f33877e858f11b815a602dd1d345f94501f5c8f22ea08963f1cf0fe6901a97a3cb333fd2022915011abd02e00be9423d80681251cfe9ad600d1fed5da7601ad4d7e7c8d9760b028d883f1f88e0a04222083c7d68d63d6727db25ffd2620d7295e0dd51b934d53d9f8010324c3569cec8f06403d06269eb9cf00c67f55b07b12409bda4476e747265a5f669ea7c7c29bcac658a6775cb8f41b6a065a29cb2d7c9729f1333f03c44b5549d269cbf1042519ee8126bae30597160d9cb260fac29f05e85b09a6cf7e771fedaeb1a31aa88e4abc216df535e6686c07a86a2e0bae76d80725a93b02e6931a7a5c34a912268c477da2818f0ff7966b4e6c8a49c229c2cb9907ce2bbb16c630af0677335a7a9c84eeb59a91e89e3cf2b192512f6b9b3f858516d7fc00a06dc239b009fe3e7a5e4ee7ce8912ef29398efba8ac4df4982337ed38c4f69be20a02ff95db2ebf999586e733c9b577c11998481ac64585243556cbc722d8091282efd1caa19e355d2eed1842ac99d8305b4870e781842731b8f688c87e26805680dac6a3504000e025b350d2401cac23c34824906c6c2e1f94523ec7160717240e46825f98e6aaa4c0ee8e229a4f5d0e0be1bc01c2acb387f4d631ff72b90d9c68783f8ec1abd4d769adc1688315572fd12960f31d60561a9dec5299b750bbd45376730b04a1a31b85d1a1eba9993247a243447fa804a125da0704497d024e8241447fa014d127da0714497d048d027348e740145129d4071442fa148d025748ef4015d2aa87d1a1eba9d93247a263447ba804a127da07244975049d02514477a014d12fd4073449f5048d025748ef4014d12bd4073443fa149d025f48d7401dd31fa187a70775166f4b22e1032fb0a8e5c5619ceca74068200460444b3da334382f14692dae483901dccabe3eae0bd31ddaa9af93596f8b5fb7493a0cd99362728251fb46d235d6c6871808b4910b162fb48ed666de3232c24508f918d6f8cd4de2c3179117fc0c958d60743b04e0c8e64f83887884a23404b2dae7f9177f05e322114363a216622c210e488d399d348988691394a2bc737a3db871a564e89865bfd40593a645023e475ff2edcbfc5ebca98b020a54aa958b9e2ba28e9cd01d73430772ce9c529992967820559f592d8b962bb29261c24eaa5628d247d949b24f581da2309df0c6543d443aa5d43ae6b2dd7876a97c9c0e711f18abf4da0bf1022aa4506431e40eb239a593059e6d993c7c06e371b21b17371c6b3e37da0c4895cbad783f19cac014c86f04b78ef075490e73d47633f084d38b4b381e899a8df1ab9d2f0750d50a81819cbc20a6de9c248ee7ea02650e8f2a9d5ccc9b0928db2f51dfe84a6ba19762ca1a2a17eaf014224ca715c40a564423000e5ac80f4b185c0abfcc0c4b771afb717149dd73057a42ecde5a82df8a9622294e3e923cd1fc7e6a6d7575947b8103492ad547d2c7047dec24f142e6365997330b278fc312cd599f1036e826834d075eaf1a052aa45d28ce381b275aed73f5e1168b06b518213858c38754080c3dfbdf34735c746d5ce0969c71624ba694e1db5507991367724a3e5adbfb5d0ff1c5f5802c7602268f7ab0454684b2f9dea80cabd65f758ae3ea27674cdd6874b4a9c241d5a82db6d16756e8ecb5c58950bbc5c8f9503779e414c78b0d81c6f9188ac79d68a05c78c3a496418a21ebda9d00a91da9b3d5b868c15a0c6fea2b303648d8dc2b5e7284ca01695c07d9d7e71c7158ef8755a945732f87558b545685078a3092c4344adfa66d4d035de30a0b8ad15e8ac869bf18fb18ed668bc49654286538c77b3f035909f6b348d75f4082028ef4c233e64d32b2e623d54d3fb17620704d0e316c16798cde9a4a4d8cee6a6e45ae239046a018497cedc6ba931c228b0272498ac7f10f0c85b5e3a335813f951aa48a7970c60eaf820573813a8e671cfb35445063f08c05ce3560f47ea0094d3354d80296bf2059c09e2719a6db3ce316ee0aafcf98c65c0bbbe32d4956ba23f20df2089784c5f9dc7f400c4cbc0d41648ea23768956adac880fd228a8e6379d2278863ea3ad7c008f2f4f6bbb553c8f153805b36b0d9a202071dddd3ad86d89411bdc5b2b1d0f327ed38bcd84d8f16c83a435113a98a9f61ab32de88036c078a53ac959e44d4786afc3eb9d8646cb05c59ae9a15c5ab4a67037a39f2ea484cbce7c000c3b3308ef51ca0fc8aae72904c8ed312344da1a025a61cc6f9fe3ee7df98473389531c0a7ad4c0227416fd30f9ba47a28d1d85e4b10a017e1389b9ef1c0dd66e0ca8f27ce38e0fbdc29b28ebb5d20ae6823be8d908d977f860dd369d1351a59b5e36932acd4cc5c0ab4f2780be91caa94e2301ee68d994e4a8e56332c3a40d9d4965e9e4b2506c7b492fd4c09d5877548692e56a0e6ae2b75c2b7e29bbc753bd3d146c5db5b6f00d45056ed8f823ef4b3335ea09f8543ec244431ac8f6d08e266b69333a269482285221033a8bec1e37feb9a6d1bcc0a74dd0103324462082d5d49e08c57119472df01bd1a394484057a32f95a7b5e0ab2f3faddbc35ecc31df755420c96e4144d9d2a84db012f309676b36562a870417d5b61c777d8180b2b31492367cab3bc8afcb83a3449a31fd587e5496249a3da2ba7cd939f4e169e78cac5f450a6b02022eebe8337afeb4e1831e1329369724a3dccabc0f3dba526156ea270f1c91e8e719d1246c2244e6ac6999a1c1df95861d9329b27861217ae27d3bc5d396ec8c0924ca5a91391695e22f9897c3900948b58510797610e70801cc4f3d35df952025b9ab5b774ec3efc73b6ec44250e290b728305f170e96bdc79bbf0120515bc750f0dfd70b6e4761d2f09ab9f4a9522a4441237ac7ddb8435cea3023904a9294d39554b57be7ec5ea5b544f11169a1ddfd52983182a5c54df5af8f13b6edcb19f1ee6e3e2bc861ac8075e8b5e2a7d016bea1f85697fd7c8500defaedc42a423f3fb93463f1c5a38539da7943c0ee6fa6b3b4b28f1689412018c83040222e3eec3b87375f5ae028cce2102a2bb2cbb8628655f16bf1c529f531d715cf37509ebf817a7cda8b07f5093af9913c5c153583be62d12b49d796dcae1e2c7339a656270e5f32ebc719ce38cf38f2bef028a7725658867502026eb691d165da29fc17002cb454387baae42d0af6d79220ed6c3e019712e5283edc4c1ff610e06aea4b2573e97dd0561cc9be8b019c416a0e5c1ac95cb8e2a11580ce6e3633d9a3d18f4b7415d31f4bbf5b29596c87cf3a9259327e1bd718eb43d34429d965b260c3871623f5f22b7426adb8c88bf803c5428903f7a5d9033795d6466fb89125a59bcdc16817f1687d540049c329e08093f819ef1a732598c490e960529ed3d327c580451e329230e34ca1e03b133bca0345230b41401f61d60912d6ac062ae71926df895a496eb7ee25c5ac8841685b4870992d50309c246284eb4fe681dcafb5f97a1aee85f672bc2f14f94c0463690c9c77749491a814980d6db5a1c6b039466347cdf249eb002578c4cd9ed26a840f59db547a699218fc3028577cc3bc5631bb2695a82612f4acf72c3e6951f040d8d839eba7bdf94936ab1813b149a5cce6022d5b5cbf09bf149558a04487c8f81008f8f1a4a334de9a3e188ff9aa0f3a38ba37d4d47a9d4b16d30e454b5969a74fbe7ae54c3a3137750d45feb377f31ff832a0ffedd36d45a4ab367751c60bf86e6bd9daf72966427b848113b8df0379987b1f78eca3d416ed70f5ce9eb47bed4e523afd4fa90577afdb095323012fccc031a10539656309c11b5c509d9130914c7b78e9b62e31c5596cdb934b3b85d8a94c5d7b95d3a37789af12d83a8e80f031033dd470009c70841d24d340cbf28e0769466a8914ffc568edc4b7dd034eca3511309b5c8761391c8eede01bc09da0880085d18220a90f201bc940743444182173e1fbc4b708895284c39903c1bd219218b9f9c735373ce20a8385ad9916777612301f7d4931a322587710e98438a39e65f9279b3326fa49cf147a4927d41842df306aa44988305b06545063b2ab10273f85037f551cf464f7ca9be903bf145ee4048c5e1f4aabffa24178f45d279a378e9095d041132042787880e4f8fcf8fb401723304278788ce0e129f9f6803e426480f12b8037520911c1904df84825cc868c80acecefb193d842920a31b5f098d9698629e7a474920f866a96649470749179145928e44961d4aa9a5d28d14648b47251d69477a827444dae2e5905e783ec02d1e0b7c232aed483a0f07dc11890e7da1b9933c32a89c704f338e5e268ac23814fa47234944fe50f8060f8ac23814f2c1793e3870483c4561dc3364f60c993d4366cf102a240689a7288c85f008813c4278280ae350e81f8de88a742381c816e9e6e6e6267443511888a40344d20122e9c0a0ce4c6d297792c88ea7b9934178368c50fe4c3c31e24871889c3dd4670a993991522412da48373bd26cc1007758ca9da45355d7d436d2a4f18439e77b46706771f0fcf9f1c1398d53c4fba097f4688708cb87744bd7bc44dd8d7436d49d19b0c5994b364e6489395e4c2216278e2c0e8d22b8a3904c247bf25463c02973c23f2dc6f0623f2dc6d8c1965904b50f9b65e310a4e14404bbca1e72577789314012879f0d354ddc3da6bd811904cb845da9955993c216517f3a22f0c2a62eb3883ab7a7d7c9ca6cad615397797a7dd42455cfba7a601b3ed3dc1df3d311c118fbf1d042fa1012783b6fa7879587a3c707f05a90802af3136577cf2714750745f09eeeacbd52e9a86189ddd93d794868c0a338a2f9f90c111f0e1e707e6e34f880708a28b9d9d3e238f17e6e98983869c0c1ee60147bca881359ba949cc8d28d884496ae075b45647945acd89301bbb346f64c892cf01807ceeb444551d484b1140ad17f8e462149e39725e08ea22c051370e34614648b09fe3255a2b4829c3ab88336ddf3993611fa002f6fc19787472b1535fdf43ac61879aa2f70076fa04d9cb480bbe7c383266e1fe803fc0fa9064aec83fae07bf0c1f7a02449f230f790f1e7d9d8c00b44204e2c1147b40a0c3f9b4051894ea79fd59c3d4e84e2a801510441438e0f91dde103a1d241f5d153fe2a831030d10226625013821b1bbc20470c57d8e0e06546110616610821348327d4208061051880e1058b83ef7e45c020436502a6fb1501430c9f1c93fd8a9841087bee57e40c61084315fb4664818739d8508b3044b1e17b48c08687a18fe2e14d7040cda46cfde61458ee57240c2a7617da46c071bf22614cb1573e23b4b2b2e3a978fc831dcf85644b07747a7eb490061468810811073b8621c58e3fc4996798dce06e148a61e840da905211548905f8fd4d55fbc1338e322560686dc0f0d93d13f65a7bad33515955f5fb775c2d6bfd5e67a25ef7d55e4b7f6f7f5fe70d9000a92255a8fc4b2aa549527a792aa994306aa1be94ee3ee04d165af0f3f2638a81cfcbbcd43e20174ae022e7e50715061b1105e8756af003212f3f261d9e178985289e40f2f2636201901ea2955a4481294fb588029a8a28305dfaa47df898fa07b6f332ff4382c2e7455ed23e7c50fd63ea7999fac503fc90aa8807e8ecfcd43e9ef6f1b28042163ef2352fa1788029a550e1211658fe3d092504824d09e58c17bdbf0d9f6da69e0d79ad8a9622601ed287cb34fab47fb1bedcf18800dc3e36d5433c22e0c3d0a65f89a377896a30d49722658cf70778f9ee03deb671e41263159c40c4eaec7429371e6502e2685e078d379e8df9996829253411714427d4507b4189a7325fc4cd401c4d1f1f48f1c0cb910295088243f8c91b0f87dcf3a31e228ba454ca04009d520e91141b471294a474490a3d23e2487a1c4977891d25c54bf2d26110192bcc68e0e52002fa205d7a061e0eead2b1241dfeecf844f8ac304178897e0a2901f6648b09ea99b0aa25bd526762a2a6e9b53a13544559d4ab3d1395adafac6ac9faea2b457a7a76a5e2e899953acb38e98c324629e35443233502154638811b86e0063758d6ed2d7bab161187c41ebc16fce29018840d0bb0e1bb78c4b21a2e7968a831c663b96629574508425df885ee833c4d440c859ed61d656922e2c83ad5d106fec4d161ae401255de8657f044cb3ef9f36c34813b99c39343af439dd9839363e4e1c86616db35ed37779ba6e7906c0e79d7c4f9be641b9e0d388758dafaa1288c6548fea31f9d5a11013f49439ec9233371e2084a114790da483987c89c21524c1c4a79201d892d92865ec02371042d4bcb9f6703cad8d3c09933adc8e199604c336ced59ee81edec2f775aa6eddd11ad757963ac24e0b6af57fe9e3212105a3a2d89232889c4117cccd28a6f8a44acb20d6e802d93a79b22984db040c6c1664ff3084f053e5a3d7f66ce121c733a89237320754288754bf7907bca892cd62191c862e111b9244e7f4a680617ed3e12e125844b7ee06565891359a014d10b1d259105ca20038e7a87bda5938032514729340ddcf630486481021ac9c9d18a3882531c1271e2a887c9a6b9f476897108140f87dd367c2cc18e9610d66db46c9ce8f52c11ab9f17d3fafcdb32682cc15db5e7e1185bd2883384663dc451f66b0f0f8fc01d982376017d808f38356c9e9ee521e2e8fd6608c4d1e3614f0fed09ef38244af170dcc34f1ed92221056748771436d15dc8e21c26afa4b0eda99b3c286c7b50b6e7b23dcef6988d6d5f6b6c7ba9235beae1a63b0a675aa5e62bbf0667db577a298f60882dfd6dabe64592a448c4b6bafe6d6b04f53e6a5eea69ee6ab27dcd4cd47725a0a5c76c754759b9fb80cdb6ee2225090712744bf68fde485aa9c8603e528f88227c449647df211027e0cde3cec4c66dd8b99b203b1338c3db3913686722d3b2ec9c094067420371d7b673db14f6dcb773d7fe560cb09f7cf2492fc48fc16777295cde322555e0b57ca9026ff3757b982f6bef755d6b0f6fa5b5effe502dfbc3a43bdc85b60c85a4d4d46f9ccea0c5112db438a2c5112db4000214a090050563d3197b7eb050cc172f391f8c5707827d84110a53bcbd7b3c3bef5eef1e110c4bfa2affaa94550970079fcd72c4c97257c9ce39afcbebf2baac56bd844f90197699a51735c350150e85ec1876895d561007062809d49148e04ef60e72b175aebb03fbd4892cd9cec3f182c03e5fabee64ea69e0c69f975d905b78396e279750f8072e893654c4f2c46a8ebbe224a87dfd0a9468454c8d3d7bc8f745185e0e79fafb705c3650077b7d56b39a7f98c72e19189d93461ce905676b864140c2c516458e304346c4c1c1b9aeeceeb82e83b8ae6b06cc1890bb9ed820118c27228fd4912a546eec1f852e91481c7164d4c15a86a223351d88a4833cf08b4d0f2f29df03db52bf5f77070ecf68848138e22c16d99824f2f0749127f2481da923039f6e45f8f7d931ec7a17da1826c23ae66aab3b23f674ec3a8581ba2cd3978e6919d0ed675236f62977999e49d9a0184d3f144d23b7c9437a9e681ab9b9d3cf2b042784c9f4cae5ee47c572866176ba9e1de3a653ecfe503f4d99d51d9d303a4d739aa6c9be5ec9bb57eee0be8e7367c4c6af2fcee042f85ac67670346fd732762eff4ad9f49426c0451e031d8838cab479f95008e3d89265592633d04ccaae7f57cbd4db0ce76e26e5cacf25debbc4ecef66d63ebb745763c44ef9c6bee98c4d8f8f717f9125b4e510b7e941d82905e9ed5cc65363aa9dfab55d2d93dddaec1604ca31dc3bdcdb6fee8cd8f43acdf75bc638c77d73a7699be5ce7e03359bfe629d113bfbcd3197c64e7307e9f15d6496bb99149cbb1f98b67f33299bfe7535f52e32c327ba9a1c235ecacb1420d0925fb93b625fc7b4acded2d6b15b6fbd47b85cb7f2abecefdfb3b4a6b37395c572cdbef269e8a42e0f92cf5eab94b2ea2ef42704e8326e97da4f2e75677221b2eaf7d52f73bdf79b94070581fdbeca568bac8bac5fbf14f5de115b6469acbb238e9036775295d6e5abee7a7c2721636fa0665bcfdd77b5b5beba7cad8ee5ce828076ecf40201b7f64ad31003bf4ef04600eeea95b255c66eeeee314d430c7cb5575a463ba665b6dfcbdc594d43b7a6e71604fc7dbc319ba6911bf4faabbb13a93b930ad2d2da7bad4b37666ef9eaf657ba31d25696eeea69e4ad32cacf2e60f9ead40e6b5bbf993a96bb233666dfa3b610a635cb55e62bcbf538eb11b582bde6b86fc63dbebea7419bd67417baf7ea8e864a6d6919ea550ca5bb1a1789659b65eeabfb776f55fd5addd57447ecaa830e39e44083c68c1922910c192828a1d0c989890908c471dba669598631865dd7bdd6d66a59d5aed596589d76a5b6cc28dd49bb5efb96dfb3a1e94edaf25796d97b362eddcd5d8fe55dff1e0bf62a6beeaed35bccd232f755755fbd7bec367747ecabb16c59dda5a59bbbaadeaaf7661a6dc0f0eaa8b77791140db5b9fbb12b1abaabee7e745dcdae2014e272847c529332c68834dba7b59be6a12dcf38ea1e45edf99a8df1676c8c1125c6508c49e8603745d150140dcd8c9db133162514638c31d298b0dcd02df790499e71445133d6d2ecfbed4a1a6ac6ce581a6ac652d48c9db146648026461ec8bffbc3be4c61b2ed00eb786cee75cea91dd31dd61d8f3d7587fdba8bb4f6da9f39197c38adfd8bf6d665eeb15b989d5c7efbea6ab61225fb25c0c89eaf60a862cf676f80c74ba2d8f8274fecf94c8c25f67cb5ee0f15d5f1d83472cb649f577722ea0a51a7c9657cea0ef4174732f831d6a7c58e75d703ef24441bffe60e77d4be5a04c4db568bb8cb68b7e7b4bd66e7e7ef5d24cef856eeecdf1f6012013a8ff316c4764c8bb8cf631117b588d340bc2dba2e639dfb659dbba5397d7ced36773c3636ed2520e036e9b06f9a861818d33b4c8eb58cc9352d73723c7387699ab94df43d09021e9fde9813fd449a46eefa7bac3b3d419a46eeecf7335e21aaee60861d8337466e8c81aded987b0ad1d977347267ba030165b3fb43f5b943ee794c4fade9ee9e46ee29f79d73ce49c11b6355d772c7636bafd8b153b125740c02d767c69e652e77297bd35dcdde8e758777a432ee19a7b95f7ffdbb31b2a336f7507eb185bb689bdfe6af9e97ee686eb58c75632aed22b5dcd14c4a880a1fde624392aa692c7798470b4a4be8f7dc51f28b2a9ceea88dfdc5630fe51755b00e74e9268f37266eab65f0ad5b7f3706df02e2a4da72c7639b68bfd77ecfddfe24cb687ac611f77bdd2467c7f296e5b8b7dc81f48473677d03355bbbadef46e06d11f7ebdc6dde7e33768dcbd8efb1df6fdafeca3298c63ae4ae686696bb1fdbbac7f7f857cf38c28eb14b773fb6f55bffaaae2e2195bb21f6fb94bb23f6fbecf1928031a00d4172bb011b80ace1670b60bf224ac2d8f11415638cb9fbb1a7ec66ec443bb8239e660b04fa00638c6d02fa204f0f03afdc00ccdb13e66da92728a7986f9a12ce19d1dbd4eee69e3f2b9061041ca4804314fbbd3308d9efeda82f523cd567f5392d94940a159ad1c986e6e0b5c02451253ec61fec481fdc100c890438fe559208e4a142a8109b4af374934d9238c236324a39271b0d79e228eb200f9038bd9b4cb0ab4f9bc8b2446401f270bc202a2a4f9a8a238a2707d51ac1934f3e09678806e8522ac96803e60190bf48388ee2ef0658c40d50ecaaa25edd7a8cd986d586f207f8fa666657561e8eb8a9138181c8224f7d008fa2a89e0e01b848f7b6d8d4a79438a20eb37e1c512bd45724758ab2288bb2e285f9ae5ee1ab2a285515a5659e0f1582942def49dd419b1b0496c4dc53f778f23dbefd06c0454b8b74e9723acd4b00a15e32106a22c18d97394d9388d243ccbf4d047ea11435691ed04767d6ce20a784f20b778929d18a08638442ad94c4f7946078e9105373ce19319f2d1fa6f3f3e35355f3d527b2c4fae3859436d5278ea44f5db2e56914c12b41b6942bd51830c502dc551fb944f54282bf4c01a788ef70a4f086271b52a10d639431db0db50d61164dd18cd9da10e6f9688067433e1fe0d9908ff96ea8835706f06cc816026c31c222e340792b766505aeac502b2b06386226b66c4412b0537d8edcd841928448ad3f4aea12ca623e71d6799302ec225ba87479295357fc0fc7ceafe505aac84b2cdc98c296ef06b0e5df73c296ef549ecbb3211f10e922437124a7684e177907c8f3f0115b3421af881a866c29a3942ff3b29b91227bd832346f661830fb06fc4e51f31d1ecef72015a74cd46f9fe051f9a894543eaa8592b189075160489ec4f9de7b99daefb5502929276d93466515b6b07ad97bed55310b5719a54d9bc451d03491ef9dc4f7a09412e5bd88129271c9786da11f182a155964506418b21fdc15a3228b0c941dda2792c906a9ccbb01eac6505be2f6b66b95ed5aabb53263bb5ed7ae9795f9ee8a556c65aebb6675b353b5eb56392bf3b42bc8ca2ced7a524faccc73d7909559ee8a6267a088645c7b7e60c7c3d1f4b1638435344a2ed4f7f26695f2bd37df9bd204f3cdf96484efcd48e3881ea955ca7864d3c42d4572ca8ec8a6891b3e1b9ad22ad9183f19c1f0f15d4e31d4f9a81d60783a299d53c6285d4658136442c2eb8953ce291fa501140e0e121387239afe424f05fe1d85250f45e79ca45b3a4e800bf928f5a8f7e8ebe113c628d497f2b9236a99296df07c8cfac5d19334cd738a7b3e781a8804bc28c336dc6ce9f83f292bd2674892f42d496fc722f82b9145fa230bdcd253546c3c1cd525eac796ba1b94ee01f785af6bc7ebb02bcce139e4b0e319b06bec5cb6c8fadb325964e92016b0a9235163b32b2d8a59c002767ccd12b64847dcd345937e7b6eb85d229114c0fd9a208632ec501cbd07611745c2a0024218631131928460646cb9136db694e87b3670090b56d410eb3ce2ad436bd344967bcb5ad7b2a2bd4b9cde7bef5959c9cf9687b0aa3e1d52aa7ad411c61861ece6b4a635ad39e39caf7c7680bb077d78289104f6d0602003d1c632428cf0bdf734bcf548c117df8b2fbe0769841042f828b57ea664f9544aa03e2267e0f160208eaa30e0eef1c024903a815ed772376331dd68f64a2f973b586fefed8ad05ef3cb7ecd5fec4fb6745b965dd755b3b5dc71dc86bf280bc213534a08d0a9c69c09a5713dcd17c330cdb2d7dccdecfa6e0cd5a2ebf4dbafe8baf65abb992dbaf486dd7ebaafd4d29c840e7b0335dbd64aa30d98aacf72674d9e9d567d2f5d39bb726692d5aa654c9e6919ee98c52e13eeef32a25c3d4ff02f3ea5186358c570c5300a630a5b0c9b79c8e4f8d564fbcd9ac968dfb8bb103edc214c03694e77185f8d6118762fdeaebb6d17fef44cc3b6cc5ebfd95ecb59c5b02bdf77dcbe10bb95da5737c371201d5010973bb8398aab34d3dc69be9452a8e1c360c7dcd67e43165475f7bed59b1d06d3d9bd87a91794bb9a0d3acd16a4bb90bdae9fd89095113a4131b1d82fee945edaafdfec6637cbb4c3604dd7ec4c8b62b46787d174a66bf675fa7b9dcb5df677edda2ee9f457aeaf15db57f6ab9dbbb88b1361ee30204ed76cac4531dcf161388db54d7f6557d534c4c0d7a565b68b72f73a9111fafd8562626dc8da7a59ecbab4cbd24cbbb22c5bdfb26685a81859b0eb0e6efcdf7b0f39d061b28334b7b9d76c1779f3769ce1c6d7c9c9c9af8b60328d5fb32f2d8ac17e1de6e4fdbad996bb194eabd5b256ad377733fb1e6bf74e8cb54fcde4d3af2dabf627d643a0cc85ac139b63b40b6f1904ea4cf40c57bf819a2dd22ec2e75eb3352d025d59fbcd57360373c55c1a468bd1f47bdb9ae13611a61de6d274cdc634ccc5d775401133744a9010e83d86d5ed945a78755c1abf5e099d4ddfd1f4bc4cbb1aa699a6b926e76a1cbd462d4ab5d310dd7e727a6ba5d929d63becebf1af4cc758fd4a7f7575bbbdf8ba747a9c31acf3216407d5227c7a2bc217611d437f9fdddb5a3f6d186b99ed7686e6ee6e7a6a4ebf90c9899e20ed573ba5af1abd2e4c31adbf8e35fa6b9dd2ab5e8a29b52ca5942a79f6375bcf32b9fd827e3512ee26af5cbeaff5d9a871f93aa6e92eee20dbc4c26d02ba9bd616d6d6ab95e56e46f25cb55ad6aaf517e7eec299861818e3cefaf4ccd65aafeb196671ceee223b4b53b5dedb9bfdcaf6183fcb31f6bac76e7edbaaffb12f6d75f7a39b913cfbc26d592e112aa104111f42a8e4799942fa703f600d94380db26e734eddc9dcebd667b6ba9a7d35f67a8476ecfae3084f8cb74b77355aeef03cd9b2ed84da3eadee649c6428a14d62b5cebba3defab55a74e9986ae9f779eb5aeeeadf1fc0599875ab7dce5bb7c7eab15bb5a56fb538cdb2b40c77ac6297b31996c938b93d8612da6eb7133d5fb779efb42aa6375b5d6d55dd59ccd6eaf7f2a84eded96d6df6ed35e3348b5dcbddb7bdf62f5aee8fa30d74b96d07e51955b6bfc872a2b90dab5aa6ba55593433cb60b72cac629835b906d2ae9b5cd61e64b156b50c6671bf793b9763b6f76bb57a2d5fb7195f59ad37d763b9e31153affd65b1cbba96f55d559f32d668329342d342efb63d9fbd1c0ffa304d3eb94fd0a7454d6de50bcfd768ed9cdbb6d5b9dd1e66b314c3aa4f8cabf5f3301584ed27beae1cb795e1a6b48c06734c6ce6ecf9306f9267287be53228e36763d6f9ea75dee27e72abe27ef213ce823e2f8a017d1e06a4f1fbbc37c3282dcf3cc36ded2e3294bbb8a3465140f3fe30e7047dcef8bb42a044eea24fddc9b8df7e8ffde6895daff8f5efeed87e61b88d6118d63a6a8e699aa669d6abc358afb26cc651566f4d8d9f8d3ae7df8500773c8f9dce09a2f6e6aafa767877542d9aafb78e7dcba279edd2a2a975d458fb9a737ec264530413bac96bf6bbf76ab7d6eff69012bbfedd395f3f7d4c2d8ab19f87b17a6aafd9170858717789db7cddc17d6a19ee58cb9c7c723b7756cf70bb1e3b8939d133348ddc28af9fba7b7aca805708d0e7df1502457770834018db6937ecf816a43b10ecb9e9aeda4a59baa22e51eab3aa71325e6f234be8f5f8e13879053dfbeb6faea08c61331b7b8dd5565ba909877d33b9897e7114b2f6f530f604c3afd8b3d7ecb841196e5086dbc21cb5e6ecf990c9c82f8e6a7694ec35944fb2ad15c3b0cbda7aee56d7834247f9bb18d7fc36e8dee4387494a3dc874e4e5e0f73f27ab5d7c368d724777353d583a8b6f567e55a5f71ad87b92a4c76edd6e2aa453ab6edf530db5571ad16572abf2458dbdccd70bb5e97ad75c3b84fc73909b8b58a7aa5038e61bfcde0dc511b7fcb1db5b7579b453ab2db3f1b1626d32fc63ae8ef5ed7b61de7cb3ae8a0ed96d5221dd7ed4531d7ed612e8d67b8cddac3607a666fba9be1ec6b76cd7dcdf81ab6e5b871ee383dc3edea52cdc6aff5e58ec259a4e33afeb381f5757c984b635db3e5dfb5d7b7dcc12d0a425fd7815f2f8ac1af87c11a3f1bd7abaed95a1483bd1e06bb6e9de16a2afc9c29627218450bf9cd5bee8cd81b07d2f4f54ab30c7ddcb54ec77297b2b1d768fb4bb5ee6a723686e5ed76073e10717465f4baaeeb9aa66bd34193e6b0119bd23f9ab7dca5ecee7d2665c36759a237a1e730ecda746eba09757fa8d344b953149353d043a7ba3be14eaf67bf4eb74ff8d38e7bfb0ba318c52846b1ab9f7e9fae8c7dcbddf5f707806e1f01ecf4d2f42b8377c7a445383fc01309a669f2624f3388c29e24499224c932811ab210c448167040c5a8a212c513555e0fe58391f013555e126ca28a64b9400a5f245183185b8cb1c4132f533cc29eb05042135555555535954092a42bc2b0a5699aa66942810fc610853158a0862a9e98424e16f8ed4495e700387414963ccf72c2081cc060640d4024133749783f2bd0c7c6c64605f0fdec87850c8efcec945f2300031a3a2a060ae042073837325043183b30021435f8e8297f55c30c8a3003249216b219e0116480061c1c0745c842054cc8c1633c01a88a22e010e630a656f0a2862a0871c20ee0d0f38648042e88015f6ea1bae05d410842728ad0040daa708358851324c801a4020ac902054ed838d03651b6502f73ce39a10a6255821eb614021250010b5458158d5fdc4895b729b5aaa989699aa698c489699a9840862eb0a0820abe427f10a7143c306a9086244a78820a2986c42134d1041c5010f3f3042cc030053604b98942b80289a4021d4350029227aef0c5156010042ca008d2840fa80842922445515f4ab7524dd234a53c8e6c0a02508630d83c818a230cc10a384e00810977092eb050640c2a7cf4944f2e3e7aca2f8de02131c2d304164780f0d1538e3f8120052d9e20831b98810652885498218b13a0e1ff0a9cb024612eb6cc17e9972449a2a6c7b5200d516ca1041a6091c58b04842d499244351561a033a51b1b1b9b18bc4ca7b8c8627d9aa669fa0475f663421750ec4967bbc42a73388e68133b40c282306e50248c28c429c8c0041e9ee3380a7981a577589a58aa4c694e4f4cd3b4c49eb09841177bc2020e3a7b92e89cf34f7faee058926fea420b6b0082900925317c72a818c7e0020e950be8c21a7e5ea4f86c508799d23aa6431fd27f4036b420bbc8d7e13d51cf2b171121f978b2e6c5455279c9a6e00eb93b7a9ad9436e4af7783541bad723e5e318638c31f37ae8a56ee6f5dc1fa8b6b7047573980398ca40ad5317547c7a8a9876262a68931636adb1c3a1a63eb2a5867e5165da41478ada0733eda45415dc29f5bde9daa54f3b9392e987fa5014f5a14a66a63e294f39f5a14a262e5ecbbc99b0b0e9e4854da7316cfa97f2144d95c428e6cd1373881353486449f97bad962a8923ea431de7d2631471f4a3840d946ecaebce64b9d0a7b1aaf4bb6ceb7728bb9b76262529efa69f69c9a64296d8d4c8747fd03edd1fa6a7e414fd0af3acb40ef84f178807754a1ce917293ded4c5dd4005bd7d6544464e9a29068c444a4e9b7a91805c614471c1c1c8baa2c3ded88727811304775fa0a58e0b1e81db61a1bb56dd7155563076d551235ed58afa60ea75e6bacc2469c69a767f2997e262fe004c6a464e29992d82186b8346648b18a2ae2441ce97556184ed9210583734e1d262f269ec832934c547fe69987c094bc6696fac4910dae0f1d05006fa971faa8135976220b8a1591e5864ec4080070c48938b18a98436386d6dd8ca5de03db94ceefa61d1d4e51941ee2d51337d5129125e5f41510d9b2c341d444326f2add51738959311a339e0e1de24aa80f8dd3ceb433753121d994c68cea2959ee90e592a8627224eae468248e6814a2a310ea7333bda33ea2e70c441cd13fd3c0ad8386c0b423fab433ed3c1c4a7ea625459c9c9c9c501acf21c72a228d2c9aa1bfeb8e6c2902091224221d7142efa61d94771167c2c2d44564813b91e54e3bf69685331741d3ce344d99c640606a55230a6f58e1c01ca88a082211d8835dc653299d883739d35de20473e2c88a9823cc1145ad237eea629e391a45a12465232903b2c5e4a05f930cca9434bd2974f24c8b37b02756f12e8600b621349d6849ba74e956866552ed0172443c228ea8b5a83ab3a80214e6162e23d7352190c802248ee8e98fa82a49ca7044e168430b0a0ccf5dfa133d63782df0e68928240e914e21fe067b1e0e2d65d308c5a6516caa67ac62534dc4cd1ab6f4a8d8f482374c6ce957dfc081a2b4744c7731041702356f47e99914238cb18838a2938e4906ea23a236e2ba30db0306263d8b4e4416098b5a04a326228ee893f2c47f45de7044e67461052462846620e44464e19080f197eea8d14a11b28522a20242b650fa4515498a44f6dbe1c7acb13f608d9c34c07815b35e6d4a4759cfe5e188db3a0668228bbcf5fd5a30b41e187b3ebcc5b9b01eef12df60c57e60ec57c40d3bbbc6a7044e7082503e295d9625fd15718315bb5bb10c1059acdf70f9ad6a67168a6559704667a34b6499521c1059a2b67ecbfa4bb1b40cb491c4b05ea925ace0a874198583430e617b127838d4d24e54e11ee1ac2419873afbc91d932e0716fd2e4a22d226c283a670789052533834743a8a087c4f12912dd28e2489549208a56aa89dc8226ae1419f075d4dad8f8cb0916d45aeb18b0d0377759758493b5217334b3bd5ab39458779ee485d44967c08ed0ed3060a37595c21fab4912d5348c8daba235b54aec3437fdc55327c2af0a35c5dbf5676da84de611b7c43b6846e3c2eb608bd22a1d973a3278e6e5822e470c59c73f64c30de0b71ba43c0a673d05da8d23a84b47d48bcb8b6a75bb9eeac55cd0267b1c5f4c2c4029e3d130c23189b9367f2c4113ded60b5666559eb2344880fade026b76dcbfa0db80bf984e2e8068490082cfa34048597c5a6576c7a51a62084a2d3cf882cf9740d1bfe065d41c8041b3e135d44a15002753793b24549cc0ddf03db507fee18a0bad649c0adffae0ead5f1c8974b7a2279238a25d60988c2fb045025c330ba768fefe30f53cf26094933ee9cab9833bcfb7fdbdedb3eaf0aef43c1247147339fc15818315f3c8cecf92c8d2cd6e26d93449749139bf9d43e6e268876fd366d3eba03b4adae1f491c8428447b6483b3b3c7a87cbc727331c474a36e5818787878787670708af89634efdae127d3e25b2e4cff7802355e88cc3fb038d87600e7d7a190f073cbde8b1e4536a83f006bd077ad6551e651ef2cc59942d12fc36d452a5e31b5216de1fa628d7989762a7fc71c0d939bc7abd281c690707675eda99b38767be9390cc6f58c90a82e18de01790078e21f54031241e78060909fc4215a92454105e0be4a15eec9e1eea0854116a8b4d5f419eea565ff6600926d19007f2ec9a694284682d446bad355543080e748d1ad73beca0c139e7d44940ca0a2291651aa1b29402278ef2679eb06a5bdea377283ca8a8e8e923557468a47978d04faaec401fde1bd5989e4a8d1aa7355ea3468d77df2952a2c21b4957787307e69076a43300f96253a90b9b4e614e61d3b8447c027ae1b548359ef22e3ab169102463e041c3a6126c43ca6bbc937600709708808da330094cdc5977337643fd7714ce8e1c5ec1ab035ea6d2322f8e74145a0618709524b2ec70faaa47b6f0f093579f36f99a077a00645923cb9c38a24fc9d28a797548970106dc491ed97349cb484ae2887eda48153a370ae7e1989b9eaa821e4639e1a397fe0e590e09bdbbb197c01fa824c324d306663d29f7197f963a641ab873d032898cdcc12de3d2a5704480e167d4790a87ea8242125966782155e8512894099364285d88235b42149e7a063d8563a923e044960baf20aee3505550390fc70be23afcb42e12e5b765e4b75132127077144e677717a23fa8348cb7b5454d15d58c000000b314000028140a07c482e16840ca2259f60d14800f8ba04a6e4c99c8c22487619432c618630001000000080080d0d0300020920a5694c3a3df35811a3266c07df9a64927ad46db93ba48650db7d00b97d9251a065bc4d39f0b9bc78751861155ee7172885b89267b1aed20da221d12422fcbc1f7ebd2dfa891fe21342c1a06150d62fefc68d6442c0d35346cc626ada7c341854b0b4dec8323bc66e620764598da3092af118ac061ac31970929d1bd82dd0f86096064f6d521332b114b69afed33b330d2bacf489e9cfd4289bf2ead9bc58d29230bb9fef87fc094c7eaba5d585e46e97d14bb594f4e55d4821bbc270e0efbbdadeb9848343024aea0bbb051b290ae3a375a71edbe65f481810f5f8ba3ed019760b3635dced0110b439b0466e99f9bd638dae9b61c8cddd5629303feb992f63c32ee93461353b9a1f14f890f35e713bab36088302a27adc00c62169c82519a9fae4e169ef07f4e4c33ca4bc57b05a33092e60b524662783db3cbb12408589af2e8b5befdeae0a827f07f3fb4d351b1399f845b1965e31abc854ee4b6c1f9160d441cdb18e55563b90423d4b0f61e0e3fa0c55ec646340bea621571fb5e7791e17e6d970c2daeaac587b5f2378020e52ac14c26b800f7fc450682aada486d5bbbf30c4d48ab8c5a64bdbc947606a76a69307b8ee283dc81b49c42e2e60bf19b1125dcbc3c8816825452d1acb6705436d4c39361939690ea07e0054c939f9df0de4adbe7d7fbdc7ee05a2a858aa1a0a18a6100d0c8fbfd892c85cdbee36b7ba85455b181f96a2d1ff548040181268462a4fb560aec65e0c490217d1b35f8180dbac248d3f0d76bf403b8493ea5d5b8cb884c708a48d88a66f94eba0c84a989f69c05c175d5cad1afc1161f3ae06b838d4289b0a3dcdaf3c4294102834de374b035c93e324879c43e26e9455283d3f3933e54dcb0ca53abe43c5f19862b18bd0d1905b3ea8732c7afbb46fa5a42fcd1d58d8e672c11c9bbe99e9e57b397cc20a41935d33feb61346f86170513ea996cbbfe3a20ef1176c5a8555d98335c2b55e10cc797cfd5cedf0631be9dbca84c06b6745a3ba75bd0625851e428e3a25f0165ad43b44d50a3f138d9025d3a65de0b26ac10a49321a73da809d7a0cd91efe27468042d74a3561837e68ba878f5a8f5184e056484268d2404eacf80c181304f874c7ad9b84fc078d10cc951bf70abede43d7d94a5b3cb2bb1ca02d56e7a32aa4cb06ab5d50abe77dd890d5fc3b11b97e477a97eab0208c6f9e10d5c2d004d2e253394b83f4c27dc2f974c12929b8952ce3ee6aa95f68f5024666ae53e1f7189a5692945ec0986d04bca0709f0c734d1b2fedcaaa3c4a728abd956fff45d7e6961efddbe42051c0e9718c8fe0ce34fdb4165cae2954ad10276ce7fff9528d78b2a70838544b39e3bb665212ffb10cd222ee5cd81515eb98ab386fce9109fa41e36db731ce8e7ab14f5b045adb3ca673c214ad0990f154a1cc9c14fb69f9613ba828284dc5c070b185c610522c9e18ff67669518fbfdcac1bc789f3da9643707b8766c9786dd6b57fe161e5dea173293280aef45733101a54f79d1aa34aa97fa81aed9eda5cfbabebfd374a652d07a3407069d28ae3f8ffaaace3b3a8c1f88a03ef66dbb63604a56e0825e64b4a53e10340d149b84bfbdd6a63efec352e08d71c54740249e42c6b23c85fd934a18c500a659f3bc121e8e68400857c905dd7ce0eab0461306fa70ccf6085873296371291883ef97eb01a2cd49057720298b19e6a1dc60c6b8baadb108722d9e0582cda27c5b021ebfe8607b7865cc10b1f63a01990235243a55ff87c00968f92130a29caaf260cd6375f83a9e37f62b4a1e55d6aaf9efa0db30a0d1f1b45e3f6063e7a6a2b68b7016086a12d947c04a344a079242068089caf36a4bbe93b1effe9e9da94b5182e5938478c2b31529967e6f615003b9462cf9328edc8c6f472d2620ae52dc4eeae38902a196f2637d0d8cca94e265575bbf7e106dc9e7f4351ac20ba27d55b9afd0f0b37f1e690a1298cbab094793bb8e01a9b637c294fcc264add20f7832dcd518b0ab64a96dab9df31efa5c2f079530bd04667ae3002995c33fc55a5e2c62164367b7756652edf00789885998719ce3f3f9c8443a486a4dd9668531d9ec1e54d35044819cc66f61cf6759e0b23e41f038c115f864ab3142bf7c00c2ccfac8978b38793436908d9ab881415d0fdeef6bc409197dbde424729fda602015c69600a97f73d38e83aaf4a3772dd06513f129e441a515e0160e127bd6e5a42aefc783d2a4e7aa222fd492f93edcfb62d569957352ac25ca0cef54b8423e2393dfc809e0f4e64075bb19c697afbef065c88e7a31e133ffb533510126d18ccb353f98841e16efb25aa87bd74ff7f0280b7f5898336bdced43a3351bd25710310a4291c40972e6d50f445e419f77e687c0e9f10203b259804a77c0c1aa3a018e48de56311dd2c373100adc6516428f55fd012748b605f5c44cef2c0126845ff4163b9839c3a5b3be58a78d47b6c9270fab941cf8050fa99d5d8b23339f6fabdf576202f96b8671f4ca4368f71942d476e98fbfd04068f43d9ad235ebf97fb2120691e15a426875a8cc0af1424e5bd4232115a24c7078e9eac15559e2f35219a714c2ae44d72a4f5d7622ab41e9bd88c1fb1cd1d3f6e99cafe47abbfed2ab917230ec642828f329509b96bdd37a07e240285c35957143e71fc7bd68b5294f346c5f93306f224163c0ed05ab53a55bafcf7fbc700977762b7a3e3310b433c48afdfca237b741beb1f0c2a30b8e556a373c3e63101cbd1601cdeabf3306f341a0f9a162fa7808daf4c435836ddcbd8edf17e2277c167e315e819c11b7f9dff5ff7f625caa1ec3b98a8f55feb9979522b600b67ccbd1c9f3791d9c7eb49b3421c992473f48e01e1c7efdf813c8a96b04f0de2dbc7629cc66c9f5120df7a8bb0534370c173417dec3e02f2abbe3012dbbc6a3ed3aeccf154acef74fdb276f9e890f9ffa5911fa3c310de3c653f87670e90f6d36cb4ed4085e20b6d66819f7569e3eb621cdf0ad170a22ac946db667f2f48fc46727409150fbbc4c39f169bc5f1bf8c353be22c337f254bcaf8a5bfcc58982de5112f665d392edbc63e74839fad6404990053294d1ab1112c820c3d0d574272bf7a70109f13dd0b346ab80f5fc20dce968c31097104e12d37021156627ef862b959ef0c153643bfc2227cce898f970fb86184cf2d3f10ac99f8feb14db3cf7f0169e7ba65bd6f109f5b6908dcbef609ea01785345c912058a436d5afa6d6a6f3524de829b96a7f655b2ea494e3e5ade2dae4da0ec3ddacc2dcefe6b7e78bc2deec026afb4072651e3227b3058537359f93d4abda60f5901c8dc04d0bfdd42a845eb495c0203b8789eb762ad8c8ff30378d99742c6c70efaebcbe30260b73246dc7e0b4dfbba830023020af617a1524177f79109fc9c3fb342230dce8431eb402650ad9593f31d969c6402bf9e2ace952601a75b6e10b7b25f4d5b99ca6f32e42efda58971f793d6d808f291d01e670c458df55b595cd81774a820449d94ef1984ba427385076b6563d491b100604b4a7bd67ef725147e0753646646b58d588b9389ddc0a55f2a131bf3ec82f5201d3d2b016c3d1381765504d9e0000aab408036a3a50a504ba906f07e33da343f0819405f742f111f2b75f7085784e60011aeedad6762f5b6e8364264d7dc485a48332fda5774bac54155fe47f647b40a91a914d2e83b81cdce7aa404cad8c954dd4897424ee9d4953ab01c53086b67d4d1a836033024b062a01b4f451d89bfeee1fd8ab9bc82d2cac6fc93adfb29cc3a812448625707b1c12981ee272c4c598ee611636075b97509178a686e845d39c65a2bec1ea0a2a34aa3d56ae30e19e82613c2f90a20ff6c4d3b24f61bb153f82c97a4eaa94e2d846e0556aafcd7cbb364393bf82067d8a69f9ca20c4e9892f1d744a5cf882a8101ec6aff062c5d688e43dc38a0b67f56342380ff98441c5855a6f547985cf87b0e5519b96ec9ff36df807a222a852f2a8f0771f3cf55d7042862176cf9da2cfb860b3e461784855fb7cba045ecb35af2cbc764e6edb55a31d7fd56bb0c3d8eae05cbb2de18f1d3ff5716491aabb23ae7f6dc87c0491662003c3a60ec22e24902a2bd93c701a70a89595a9baccee05a0c9020a84a1f8b8a45bb9a8cb05a24bfc0f0c948fa9b01aa6e3f2de4fd2cc122ded37b2cc191dfd5fcfd74031451f27a2e03f4769d021e407880426729bfcc66ae39eb22b03d9d7d73590dc6dd508132957db78412c5c6ba0dc259ddc5f6e7b210927fb3e069240c6af3eed610de34944ba0d400af8842dba19414b755c52a7a57aad8b7e05148421b16f80f792f9cc7c8216aee864c1cc43ce5fa1e6acfddb8f418b579d86af4dc06131e90c74874b786d87ea29bb462beecd95dddf61226f8d66752bd7f73bbfb215b494676351afcccfbbda75dbd8262fdb09d16ccb89201cbe0126f0bb44c6e96287b00848cfac648fd5c21a2f2532a2f65373fd1ab44a62db6120f66e87f75e5c2406c364092536b652509a8140434b1d016fca18317ee34dbeb09798b510876e4a5ee8e87777d6e55735c5c1585a064408a71ace37bcdb5d13a03ca5c9a897818825ecec936bf85adca365c6b0c0577f60efb218dfb3b2eca5b6cab639cf815b63534443a31fb0a4cb21379d1a22d66f3876db500dcff96c9011408405fac559e477199e1bba9ed368ee13f4a421912a1025a91a83d78c78e1e01856f54513ee1fe56332b8741b6572929368a1d7631a9cc63357efb70edea66e3b7a8a362b73495e723e4c7196eb2039455c8d4c9a934dd13fd374d00a3ad298b5d9a3a1ebefeb7cf48b43714c8e430419c082ba32fe947cee5a17a86703496aa4cbe2e855bf17e3a652c7a7df7c09997becedc3d8a423c2bb889cd63e2fe0cd031053f673652d7d69c0343685f744bf4d07bd6dacdd11faa2b9196aa4f2fc4d2a1541bdcae5d81564b79fbc499aa2256517bf6b40062479f1647448872e00b4b6ac2e0592190df582baa70930d1bee0d6fc3c1027e6a0e25d8e695f9b4ef57dd3c3272a6b6483212a6d8fad039b6208b8b2e3eb2d7c5cacd54aab74221def02f481c49a03925ef402404317338052b24a032e998cf3771db1484c32b961d04776c8c6a07b9cd5f868fd15f204f64778fd2e7f4f98376cb2c2dad16e9b8b7a95119de18ee3bda617787da3ed27c0bd0d78e3a829c00c39fc4f2797f3fa24541bf659995bd9c39501e51aa9c3058e6dfdc3df33e5ffdda0c752ad09274a9a52f0cd8a9005fffbf4022e8b53d2846851c8712bee422101546c267bd3cc763a8ea66c8c14ef3bb93a8650b640b7220736ae9061f87c907b4c4498107102f68889c3844f55dce74f2b758ea60b0129a696ec522f6b2a079328507d5f7bbed03c9a0a5aa9f6875f5b7caf7fdadb0a1698e3fd866eb506388bae8ea2af4963bfe42aa0c35bcf0d1d5e958f0b9b5d95076ef2f4e730a622c06adb93027ea67a67d68a50f42b71451a5b285acc3a577505e9f2f98c97e44e4d5840574ae0d7069a68d92d4f9b16733995e30a8fd4580871b9af5ae166d3a53962ad5304c288e151194ae352682ee7293ad1a88cbe3ee5799cdb44e571a53a4bf4a47bce41656e15719258797f36d02efa6e3551936158291e625ffa0813f14f06aa11d5636e4ac150d0e92d22ad978aec4aad20185570e6a006faf20da9d807baf2f8a7dbbe465d4f03d6059f115fd0790c756cf04b421a2da7d9bad04a2e07dbed8800fb754a6a18ef38aeec82f4f4b8bfb61a7ce2b78abc8f8194800af27d72ea4012803fc6d9129e3113b8bc19b85dbb26835f34d0ab80702b60dee16df9dc40fce30e65733f417e1154489a7582a6428eb787ec85e81e82d42e970649991e3464750c675c3f09e37abd8cd743c42fdd0720187cc051523ca294bf993dc54a9af491717901607c6be1480ce904123766aa2d865aca3737d2ef23eb7ed81a8cd21e0decd3a4a071274ba84a1c248cdedc74cc909569cbf6df039008320fe907102ea671b889af2c5c85aa0a1010f9d96cf960c132234b7843065a0600a55185ea0b9e6debca01b996a361ec5e907f7fee2e080de0fcf2d8c94611a6434a2533932c6b9135e29b088ae541faeec55a3af0ddb3ebc7f87e77656b7048d11e15bdb97fcee02c1e6289fb8eaef470320ff3cff4c40611114309aa0d3b60dd6124a490765bef5ee8235cabca83fdab3d7b72e76061e6dd6cea0ebe037fe53e6e89d14c803ce4d131ce4356ff5fcd2cecb8d208f4f0e6b3512e09fa016382ca1da9f2221bf8f759d8f88600124c6209f0862eb3cfe93c0a911152c9bf41efa87246ba209c7a2e416ac41ac6edd493155c7f49da7595aeeefde903c63507824ac2c1a47452b70a24cac17d8fef0116c7b95b5470730301417364103327b8234aac8cd1443c71c03a9d16ef50aecee4998db2ae5181c05b11c71e360a1affaa0ed0f6c8b43c192bf047d7aecb81248bf5ff87508a06f8f5c542feda21a672881595860c68664ad24752b680812243f0b3c5130c8e655d294dc8e3ba8dd426fa61d6297fb506f7f17c30e5796d80b3ad2a9d1630b9e8954402abb23f5cd96ab12767f935301f5144c76d0afa90ff879c13347cf2acaba2a058dcb585ec22e0299dcd0184b1a3cf7e4221562a2494921bc726978f60c435d728c5e5371b23b447976f57b3bbc1aee474981fbe712c3917a82b724afd27a13ff47190a23514a9dd48cf86415093ba0f08551ced409505a11a3dc416a12e2232151eb67e5f01a70e94897f483d4a6a098e007c73830850fa428ccd87943134400340c9e480cab0029a0f981b8c86d75a41df4b95c536ed68596830a96ac9aaf85e785169e868bfdc5167155e5bb5a147c8071bfa17dc99b6ab02b0a1e3684d5b8ca11e14b44cb117b1a713ff8cd2373a1e6d53e64870081b612acc03eb32056ab28b5a26da4ed8985cb3af51c0b6f7951d482adff584b6296947c74838a1065c4696bf0efdad4f31b75fa0c51ed73ceefd5391dd9a9bdca06be520f12ae3015f5d427a43e84a8de6303100b381aa7cb72beea74523eef111d3f33c0c1a88b631c995e540f9ba6a1189ed0693b8359e7b65a42bb52c02023c97caf64ee96afb83992064987737aae553544e84376c5130df32a2803b70a92287dba1a5e4bfbdcf59685367c913aabdb7fee148080d83ff5880079d013c8cec2e3f3a831de10883e160b2261627370789dc8b657aa43f1e10dcc4d4374c0081c8a4225e3e849265ab4c824ff8ab41080e2b8bf2e32940aaf411daf4d5b30343dc048e92e93cc48dc123cdb455220be644a1aa6f541d9829aad75a1d6e6cc41171a2fa209a3be2814069d05cbedde23ba19ef669761b6bc061af86d26f75a3b273dddf7365a908cda5b0ba97bdc2c612d47d8631c54875593ae5cca13b08f80619280fd410c818d09bd9b0bb8b24052c65c1f6429073852bde5d4d7cfc971906f2ef03b4160742a9a40ce71a1387812d44ccb4b58121a9d6541400e85c07c02c03742e3c7738572c1abcd5108a3c9dc7382339ef5ea6962941ca1e708cca6bb1a08162639ac5180ca4878fc4c7af7461bb05ea87ca17a36f06927fab9980672f2a73056566040616fa082ebcf8522e76cb9261c4cf5df89a4fa59bbc3b1082347ffd55c80fea1e1223f8d861251cad9450efc63d3254bd8234769cf7aa650a558f2ef8b6ab726aa5a66cb5d33756c1192048f305be0d19789a8806cc7ae39ca4a15a1036ad3a13412a5923cd73df0963cb89e9cedfc849041a838fc1199738db0e9323224a05de1d45fe4c230d30a0a7ec764e99551cffb24c62609ca8e778e926b518e53a78282fc5104bdde88f84ab28705705eb2600c9185a1fc2d8431cab96859e686c62476297c3f8b09ae58a0dcdb5362b018903ad26200ae76a685c49c2e281a7c085c6cedb2fab92f20b36e69388ee3adcffe32258db6bf1155a60024b7d9fb473937100fe3e1cebcb85ce86580e24cc259703fc9bac7b13e471af70344f8c35ccc02f410dfacf8c0c7e05154a35182998f693b48f2302564d67be83e045e0e3575e2970b3b03ab16e5d80c9900e2d18207f4e5a3b0066222e0c18c8c60e6f05d6d089e11cc800d0fbecf378d096267c348f7c4604e877700dd211614a70c351207be7e75e86b8c9e1ca604d7e1388d8190cdcf1f965b0dd9efea6516aa1c91bae347e8861126ece4cc5fbba1ccb3452fea09917ef829b809dc2536e04b05e74c3ba901ca2f83a420fa2e194a62068a008587d182e0d9649ce0462c3509365f4a6e98e32b4caa7dc13bc6836e2b707b4eb869ff698bec12e35211820f971f80bf42b9878384824df4c5b324fbf4edb48f52f26bc04a41b74c0a3d2c716edd08a821d40613560aa5fc2cdce3ccc4fae560c416ea9d95d080e83f326def8c9d5821a729f06c981320dc1dc6fc4c07a0c90572f3ac2c6cc1fbc2a9487eb91b8414b6fc473a816aa3c30c8753c87a23227521e4cdbe9df98e2366d67d72684712bf928cec970e89f99719e66d52426813df655a9625d935ca644abf974e690958ce834b2d0ff9c209d4545c91fcf31496bfb1bb89d0d3ef5ec81e5a148a9d94d92ca2d83eda6532fb33786b6bc838657884ab7a7d3bbc2b7fef6214707392bd5950ea2000d392bad4d170f7fdf12f0e00feb95a854d1e0bd822f1b08c62eaccaf59c785508b75db03858db4c34c2a39e83db654cd478c3e5cabb0e7c73d4a9a8208a04ac0d0d6dc7e6f871810f1a445f16e02e763d22b7a1d7e4142f7c362ee60e183820efe01fd0a6243a7d310ee819dc1d244b3cb79712e866692503466623e0c9820d1ba31d759be0010d4bc8e732b905af195a8706ece40dabfc5e85f2347596a03cc0d1be1a092373a2e5801e90c93371abdec861e3df4f3ae35c5e56ec3b46aa6882c9360076742129155bb19b584711951efda47b0281d58945e7c6b3f74b9b5483b2e0ec339375996190c6cfdb9d56dcaba0f5409649521278fcec896f154d45bebf5df3d8769c79452f200316a5f8c0b0cfc0046eec4c15f5bb90945e6a0e733ea49c6a7d94224e703a1a73e4f68526b158cafdc3ea21457a70b3c449cad3df8a07b2ff998179522ce6a6e0e83c1622a40c541f60f403e88e4d658f40581797a6116999a37d6c57b5783443b7f4c9f1b4ba1c4d85424e30cc7f4d88b6361efbcb9413f83d6ecee174549f0d1ddf95e7e48dcfe8449dcb9f8c3b07d50230355ff9dfe4c5d66e9a03bb669df19c7ce3cf9b3b87cbd33c655ba67b2e2f2929421a8afc8387d8f1bb4da114e4bb21b94699b6363c800e49a3d084608a84a227c21c891fd21c067420ab908605ead1c7e5514111d31c6802b336ff7353dabd52e0de5163ddd60ec0dd511befb7f494d3894456741e43ba55db5eefde71493dc177a00aec08cad8d20385cb3a1d49c19715614bd6ba1f9abb5d880ad04996bf20226d2c25b944f16642ad756a01d54bef4ce8259e532dedd0fab772911bcd0fa6191344beaa8e2c5a811b87025d96a18c9332d32c290c12fb832b6298ffd0b1b8b9968774dc3539ae9ca66cd36396e558d71a86f56e369a65fc6dc624fc6629a56d5dc1f286345b98cd033a7ea5b326c1b5d1a95c69bb51bdd1c7b4efffcca3ec7bc741ac9f91f65d3ec8fe001904ac0060e1158d08495bec70cdb6c11dd126673404ed2e752a4998034100452c4a662a46f5424305c1e7a5069f8d061fe6b962941dc3ee0901c6ae60233dc2b4434236f9426a5b5e21164effc0484379ae9324afa2eeec38f4201a53fbf50922b16c686de1ab2b2e2f25895b5992e605d8a299803b25b7d1555bfe98223fbe47532a212c3d9b7269e98261eec614114472cfdda39bf23eb67200f03572fce11534e2ca68ba9d2e1da1a59470c03daee802d630988d10e36d280031a3cd69f3ae1ff12b9675da2d3d2b1359dad3c9d9f30355aa870d43b2f3ecaf70c32fb1dd480cc7f2c974b3131d9fb71069ec75a47424e90e92c662b5503c8ca4e109ca7afb77115a81ee683c89249122385186e8345f2bb6825c0f515ca77d5c8ff2489294ce1f5bc8091039303a14c5bc4f067203a180464acf2be2919fb4003f36845d2c855ab605843ac77492ed6cd240cca26828f50b8ae7b9e9c2387498bd01499d12172acf5567271dd639937d408ceb3f6e9fd858a519479f73788e71c8001e0482b32afc397691001db4046bbdf7b3241b3dbfb4a9d3dfdb63079f2993caa9e188f593399e76d3f1b382b5a3b9b79265e2b8606725634e7ca18d89c4baead8c7aa769bd76681b06fa5bd823a6bd6843d8dd3af49e3c7ed537141e5b7006d10e066d26e562095b3116e6a0d36f4b147888ce13cfd66f433ed45a1ff83851462795700fd707adbb9b99b802579ec7d55f02279781411ddd188c91d36a81146f4574da6346dca06a15aa4334358c19096a01a8b6a994948b03289a405787c3e79f230e6abe716e79de25f6e834c3bf427e4d8d1763399364fd80092d8c7ff2d1879461c58ae08086795e24030b01c34d4c8ce2f18b4f28b6bdb8e2ebc30018309105bf2160f4e318f9f40928b7f9d4320f4ec471988eb53bf17ef6b254b523d94fcc12124ed3602b7720e99901d5c9941a86b57a8169b017d50c1fc3be03e5748aa32cb1639f35b8ce6e2442885b67973198172bc3aef85d11531a85ae2ca6deb7975e6d8de1fdc2651ac3a45c3d2a2e4246213dd61abd343f015d05fe8fecc4f7a592e69a041abf698bd98462268a79a008ade3918495cc8fd6cbcca49bd7ea10afc81d9b1e016e4321f4601ee422106e2405c3d6ea6dc18eb944df77707c830250d9c0e871630184763070907ebd624ba0518720764f6f999828b5c0c83b513e31d16a4103258a82c74ee0e15e3d8182bd1e2ecb593d3097d9d52d0c5ce2e6bfaaa061c17455784470922fd9c1df3aa8e37e98e671603064dcfb269a164d5e78bf6be97cb73339145ae6fa17892e5aa96b85c8758dd42a23cd199b11975277b5730a5cfa4f7e9b103f3bac22735578207a88024f60910576fed52f5ec394b5919c917fe7fa245538e926d2d6d4342195c0dc867a08ad0497d91fd4a0017fc30e7b992e282e25620fc861730edae9104610df6eeffb3d120895a1f755d0e350b09f74d79e9c8ae2e78b0cfc3961a9ef25c62b214136a656f3c9b058eecefda873b522399d750071514a5c4da1e4933f91b2ee14e473d0886db2e37328d094329dbf8fd606d3d6938a827cff5cd232e1d6d148048267ba7090e49c37832c631067829d10cb9c9e3087a9e281e82c533fb0c39c9f8865eb427b6301054cb511e688450cdf622b6d9a90d9257f8202235f68556f30ca98e5b71fab4870b68b9069ca3c3a446a9e67b240122cacccca92403931952b691c4592ecd23314a404627e424e52cb7ced7eaa636d3fa7f63aafc7bf65bf062d463fa22427a1011389371123e4abdaf4f09d698eb90e6b262ccd75d2f0ec680d502e7099b6a3f12aaa4389cf75aac3c961a1e7432374b4d84a6fc4085048ee2c55023856c3bd3793e9abd812d7e47595d66620aea3dd0c6e2195b0756e411ed1d1e2e8f456b44b7be31b847ea6f24d50d551238ac722ff574cd08019133c8e7c4aab3904e23004fec37bbfaafba289e23ef67663a0d1de1028739138217910c21f99f804f607cf8a4fedf3f09a01866ce7370b9def3d5ea618762f7084a12406429162590c56e7d1aec90484e518c2bbb53c61e64a472ddae02ed622c99468e80f9e666a310cc6cd9b28386537f317f933b8701c2ebdf7601624b4f6df79c4e06b1414615faca754659cf97223e0327d6191d48f486a5ad2cc24f5c6e0f89cdd1fc00b288be987443c932c745e5c245af448d6a36899d0cd60cf03f3107f7bceed4f160e3b8db1d0b4e15c1940f1058146c4611928e56ac3f01eec005feaa953393ae348918ea3cbe46d8c6a24f291d1c7aa90c5df32a3dbe9c4787458eb0620a411fcd9235524ba7d4f6682fad06e48a540c2e7bdff635976cca3cf90de85f6d877d5eabf94a63657b6a615e2f455835eb78b5766b22baa85e305243b50f654b70bae68a068dfbb2421fc96cc306cf72eaa2362122d3e125db542d977089c21c66ea35be3848e875fc36b10e3164f523854f38fe89dbf8232b291712e66fa44d9e27916db1611f822d1b3d5207a4fe2588ac1b2f187ee1da14f8c2f7ee106e40edb62600f70fe90a6083c1450947162e0a44f6296b9e84c0a03238be42b09e33db996cd02d6de896d16c9959c27c71192f748c90a8ff9f08961ee2b119e9e663c54434d0aeb170972e4edfced661fd3a27096b968b246b694c8c4e847df94043010df28037293012a1890dfea734d14179185899697d07c164f3df509827ec6714e4996c25b1da418294704e4b11353b2e2a328a614157c3642b4939b837ee0b6f64a5cfa1498a542222a3c3c9c4a5d9946c114660fe31959d5a21d1f812baeefa9ef20f015817345eac7d9b82077436424d7952d2b90bc031b2f6be67ad26940616ce68ea70b4bcd48aed597420d76514aae96286a2e0ffe9f0bca8bdf2d99f8a431f8706930c219f5b34c1a326be9609a38a4e736ee41923e1f3202eee17fc472e8729e234140f24f7751fa43ccd92ffca960e15024188d0390e34b5522f124586b3e0ed1b6648292d55d3e63be05cc38650a0de6ee462e16e04f499fce04f63439f1d04d48a9f36856d418325a1fa22bd4fd496394677988c675f4154799c9a2850f2e5288995106b24f649b80ae9b10b40c67e4ec2263ad35374c912a154325717c41a7820796b38299c1e43a02121f48acf3326f99031190b65eeb623b8bdfaadcaac8ec0ad974fc7189ae49a07b25831ab2f8bb3cb43145fc72badbf77fac217d4d55cc12e807d8e6d4af0fee45518489d594ec22bb76d7a321b897cd43a65b223c5f9436abeeda099b90d81555a1c42662b7f2b632b9d5587b7947203932caceab8c7a434e7b29276dfe55cfa17fb2e0f744983880454b85ab5c32bd14683f7a496c4c5bfbaa2d803c533d1a6b695fb367955fed964c01c9af8772b1b56444f7ddac201b348e8a30cac8f0cd06c92b258e52b47dd7e5a251f636c21af25f0f0cce80661b32bfcd020b5b3610438ad9b4f457905bfc13a7880832a07130ebb23e6cde5aeec5cd345da94b18be456ea5a128ea9b38609062dda05ebe2df9d25fdca442bb980a2219528ffc7919ec755813927ba61b9816e266ce4a85bb71e6675acd2899a5d2d3153107faa96fd7f760cc7617db80ce6c625e28ec080af0270139c2e0768c99ea484438f3525c8cf9c3911c64bfc235756b989dd1e4db5fdecf2be2c229f94591f0b7c6bc7408cd6c6e8f8117c9a0180e4325c1e0ba08dbb3a9958e628d3078b46da148a857731b2be7b06014007d79b7b702201aa277aa8d37c8f6aec9252f9f6667da52f8d2d813383f13604963a8b13e10f34def24fb2b7dbb612214f6fc96d12ec8c2654c0932277e20e39b7b7d441d2d421f6911c164cb4821c949fdd328cb9968300ac342d9074953fe61f119c4df7db8092247da7e42510fa258b4ad6be26d2f8e3eaea7fe1e6d195b9f16bf6d2429573fb874e85fa242a6bd0e8e064d35c16ad5739a91a4ccdfc3366619a8df80357d36b45cc6fe7251362cab354ab5b9b3278165dd9938f60648114b7ab0ac142bb01a43b2375f25b77f4993e951acdeefe7a2963faa1509534c3e2793d4865821f52314049c23134e554b2ae4589b3f75c075d3259eb9d3ced8baf811766e40fe5984ac1306da55190a99b3a0adaf2c25895ac5f897b4d859211e4693dedb3d9524981cc0cba6e96d8f179ddf1e9f57721a585eb65080a55969d1a22a3c0d61e0e46843ccf8b20249d341c67b8b596bbd0bfce8fd6eb921ae1f46e0128e905eac4beb8fcd675395bdc4d01522af95f075ac7e2b8e85502d1138c766f4fb5008f8db51b4e451520bd0f3f36fba7b0ef43d4a73d98d6d7c30b9819cbcbc9584bb574beea53eb9eb8b9980c65b8629abab9dd373c1b16299df106ff42d681a8534fa04de806d06f6ce694491b98f1e8bbc15c26b6c7022188e058e1897ed659c7e54392f6d5329031ddfabe912954645dc477932714acf8be2ded944bfe7a03f084214e2982460a6c9dd07eb7925a1c5d40e2b4ddc98acca63f8e0ab14cb1823ec56e51b811fafe9beb94eb8a15f75d4caa2080b8263754e21281ba91ee952c6ac7996828a70208d0c742dda9142e9c7120f61d5e2714e4ed5c862787217a571ad8631c24b29a8010405e82d587d3b0bf127065a8c39bbcd068a14f702b5adc7e2a767417a692841400bacc8bf520c95d3bbd44808c634fcced027a06838d7808088a50a9cd68f1a16b1a1a2bcfd6ce3c1dc4d179e4a3e27f6004d0b649a35325d2a5f4e95d7d2f6f67ad4b4606f8940a8b8e41d33789959e53fc3341ad36115a25ab943edda2beffcf4c13f83055069acc8b7afae750f3289b986f8436f3fa61b1cff73731cecdc8465d7f789f7622e10bc99b08f5a990ba8a4b870283db66c357f061a8dc6315c1c9b211739ed482a9fa15e4407938cca5b17a43f439af359aca317af6837f359a64f45637dbcf3bad9c1ca189c650783aa0693e7345368906407fb57bac86496423e64017e777ff301a26d28e4eca5f0e27831a7d0cf7c015f6e5612f87d7b329961c46aa2c70d1a55e46e05163c416e0db3947fccae8052c9a272f8435a10d3433318f34f4c2e3f061a5a858033f36bb60f622f064c2c12e9dabc6e050cbb1444652560ebbc84d32434200ef7ab8a5706ca6d6aa52ef2c462a90ec6336a5477cca9d64a0d6bc3d954cff06a0586a3b09806798085ce567af0351e58974174028b66c73ae727f5148998d014c7879dc806647faf5d159f45ccb88a54d435ae16834cbf5de97cb17fa72d85b0b34f8fd7b2e1c08ecc6c8b7a7cd176de4e76095ea9842b9240c7411811cbe824b0c5d205227fd69acd8834d053315b706b2cb0debc12457481cb75cb25300b0a1a311f50624eddaad7f2b8733160f97385e12bfc9a900e13965c675005c05698fcfcff0d1a97f485e66a3a7d19f810f11576d130f8b6b5a2094a70830e622fbc43b46ae9fdc672b8e95144ebb374c4263cf5251eccfc3a92c1b4bd21db2267bca6efb68dc212386029e7f7cb8ba110f5b385126010a32d0b22a9e15a3d727829cfe04bfdadb6de92209904017d969d4f96c07b900942134093f69a3147102ee824688baf64032d5f45ace92890cb8e7e40a022db35952647ae17ce88b36b71110613ad180951dd3b79c7c9fb84b561c2f22cd03436380897ff15d7e6d9dd4a9ceea60d6ba5e2e09b6e66b3acf93371ca830929240a8f772c9641c85235a377a51b3d6028d077d559a449e403940ed9795a54d8d38e9dd2422b1130c920229c3e731874335ba0b51d152aa6401d7107d81e39c9c88cefa40df024fe30fc2d89595fdce6ea1af1b3126a33c97168fc220497eb479b829dfdd0f2bb6bc9690be1d14683ce95cbc115b3a2a09d49dc4398eadc5f3caec085cd1958814a4bf4e9ace923ee9ceb21bcfbd1428fa33b44bdc5ef225bb909c9b11c0cffd2fcbddcac0c7a5eabfef6386a8a325c5eabdcb6046a25e5784d735148d91a0ffb18e030acab7aaa806d03e9109856647f9540a9af6a878dacc2f68789a347e3da5b892add4b802c2ddc4fc0ebd7a0e22c1a8e7587dcfa35b99f5d8165b44c26ed984f60d014fea2a5d9521ee29c81f699ff66f4c1e2e939e0728b142abd2a82aea114abd43cbcd57346cb458392d8acb208c010a8d31c74fdd1c1fa3ffe153b43d22c43334f2347f7f3e49c34ac3b5566333fd779463b16f7eca5975726895900b194256afc825ad61f9ea69e8387ec666b1ae3a6735069f3a9ccc110742a38c24962be7ac40b4321620d1890b248084ea264ce60882d49924fb2bfb99f4424cdfb2fcc46298985f5c77928983b1f53f74c5e6f70650b41f7928f41854bd5102ba8639a033f7530636862025e9a4147a16502a814078d40830150e9063196160660a41b741c0d66804935d838341a00916270636933011a947c51774560d62d39483d1ea86eabb744c6ab2132c088206af153f2fe3a4130dc71e95354478e745b0b02a8eaae439b11d16b2f146f3aae4316f208f12b61b139baa8972016e5c91604408c82ac7b726bd19e9675398b86d39c20752151c48cf2f7ae61dba23bf1885a5deab8e2cd40c370a473d59c60e39ae6c4f612cb3f9abb082bd91f3d9446fd59cec76e43e5fb30e7806616227838bf33fafd38986314d469184b6ac06bd46ced486f2ee9a82ea3bb1095ae6f9a46030f9986563ce3da45ea533a2b5106cb5090c85e0d6d84252a6eefe0bc1a15b492dc37ad07145a51df64597769806b84e54131fb1d4560791118201072e6dad4db0b0611cdccef7455122d1c899868e8b032278d995c982f0357c12a94c926d030fb82bfb743836011c1b756af696a9b4f6be5310b025140a09946176a18a4f803d6e25c348973e33813924c9881349dcec523094304ad34abd2f7a2d92180b6dc219c59b1232518b4c6626d651272eeec13f4c54a99589fb92826ff438a596d70140d8061f6223b34cdcaf72ed66f65a5b52247801e6817d029ff64aea0361edbd9589e307c59f1b2e541d661b0e0819421a334b30686001fd32b30ec89dd2d9c6c42b3e22d4bbf8cef0f84055e2738b13bdad6d389155bf316b9f80a4eb06a48661b0a469fd6e292661d4516c9ef6cc988700c0f9054f17cd6f1ac39c09a4b82c9106c329c52feaead4d80000a21a303a62602b5097edfb2f24ea2bf4ddb9cad8f48913ee0078d2eb28a13ea7bc7d1cf940c9d8728bf92fd9b6479779abb1f5a89e875fb2c7ed2af699cf265c8d41822b341780c27e83710192ce1a982e1d23ba47fc84bf3509471bb929ccab794ebd530448310f3933c0a77f0188d019baed0638a9876b324978c34d426b0234f3050febe941c163493863c759387221bc76d94a376404ac9240d0a18babbcf072fc10e76a7ad0082237f0abf5284196e7058061aff7c0f7b632c786bdabe68e6652b1017b62465e9c4f4e18870b63275dd902243929c65b7b7c738cd580b872d002cdc486903e2780ad865daedf76ebf621d45c3738fb643b52a2d995d45665568d7b0a21af2a83049613da86a254c44f15abad62ca174e41847d143ee797641a03ec4f85f1ac79d6d9bbd8cc0bed6866ae30279609ef0bbd2216651177fcbffb6f136e6037ac49c402800960a1a46d89c99b349e7a6582ab39003395a5f09d4023a99dc4426d0373ab825a1df78b19be206358a20ec18176c2816416c82865e6e395654ce88f15f3a1d6798d1e299890ca1bb901e0fb1c7f7118d05b1e5ffb55d380ad1fc87edd00eed728b5704ed0ba23aab1b501bab02ec3a71bf92ee50018f2dac78e8ca7fa003526924d175ab947af6ecca4dc5d2fd2af587e2b6f3afcb85543c6d9ebfd2413b043605d4406cef7bb92534bd3e2496394aad1b69356f36e6f6df83c367d1a88b213257ff8b06a70e3c7104a9b911980b0acbdf6c32d10174d663d77a97c70e70bb9a79d99f5be2c59a502b57944a4da8c4b10396aefd3ffa5b9055ecbf1a94f30a3ddb0ec1bfbe0202f1779d1e0213d2c31d727e43343beaaf0981fd5404449f7bb3ac3ced9250910cf0d5418f4f7e83772e4740d4b61a5965c85546571d01bae97201ca1c1e8b244e0936bfe374369f18abccdae0fc25a061789556963b852f5cad31dfc2072a572dcb8100e4bfb0833f73aa8ce9456282110764899be5a6c18302f0e931bbb4ea274f9adcc5637f7fc259e80d63375f5fee307e6705d7e45288c1b1643648391b4862fe03f165afd6489d013521869c797745ad75aea64e1e9859098c8e7fc46bf83453d21e200732004a5d937865bc183f80c3aa6aa061fe7138f66e3794629a0171c765a63ddae13980afb746e5c9d8d2df47f5cd0734fc045aafe1679d53f7a992024127bcafd1ddccd112c0bea3d7e03ef50ea71f6025a0a4b594dd83e405211cdffa97bd134e407253aa66df9490d76b2e844c04c45d7dc4b7c95d70532f50f432c4b7c6ec0047f708c863f4c538c73c47a46716afac09d5814b3c3726dfce788cfcc62ed09b01a29b8a620f2b338db21c01a207d6ebbd10b03472426ccfd9aa3983b1998078cae17bcd38386cd291206a637bfb9ffeacffde949464c91df15b6ea21ecb7d99e7fe47f0274374efe092dda2870727093d3fd6de405ad1c367f555b125a387ab72d7b7c441d54c595c4ab8c0057664713db2fbfaa8bbd18cd3e686bce993a66bb931b89e9e4edeae687d557f265a76964d1a65576508951bfcbc453b43287308f5db17580336d1c2bffb2bea1f8dd930e11c31b2c472fc3afde0e5a691e338be346ace794b344663cfe58b029bf6e5f929fbea221dd50a8362885d120fafaaa0b3a595ef5d9e454509564ef707a899bae4ad63e23d98c7d702c4385afd890193f67386f6a2c16d293ad0d93bfae6eac401afcc2eeea2144fe67a0aee3ca8e4d6c5d99f02e067a60e291bc64059e5f92ade00ebb86d319215400fd6812010684da1607e4562649306953b8036f210a8006e1019bad049d6c8e32cea469b3ba33bd9b39030c8ca9aff1e9b36763eedfdc3029afcbf2a1690c73b7bf492c3143377997165426aa44da207f1f2eb54ac21e8c37c020a1eaf515b9e6fd2fdee74506089366aae7d32335afada6a29c6c259d2bb73aaed2397fc19acfef998f20a5d361052baf363b7a67b466f43982bc134d1d795753fb6244fcfb43991500d84f68104fe77d99ed11bff8f7762674147e7c078b51a81580d5de685133ca4ae90c6a0e2658cadae2d3d4363e5e384696c2f4853fa0bc0786a6d2f62bdf45972a629025d731184ff32014c4e8df21dc5565999c9c472fb26fd637a12b9ddf05c627c8209117bf861b62ed67ae1ddcb29709d1042f529cae024c8ff1dfa56750449f7e173990fe838b3d3defa80c4fba2a85110e0975047efb1be6869eb459e8be8b49d215ff4d88a5b69eaef87f396ea45d7ee44f89a171d4ff8360bfb481d0e77d149cf9d319c1eb65754c78b0eadede220683a6cf8db1c256806ada5bceffe34f446ff0c8a2ad989765d53a83bd2890eaffbe411b49bd602534d363c4b8ea4052ed80ec448ddeef519900018efa043453f0dbacacb6fdff10bd373ffc0f47e16c7dfd61de1769c87736d386671e294db3fb44c51a1b0205285101454a119215a1f7a4267f496086e590fd23f718dc89b25cdd5634d6cea43615e4212de4f02d2fa01ab29b13ea2d54e00e7d9aae1ebb9bd2098062ace70ede86d3176b8ce78464123d2b6b6d233805e5a8bf6a58f8c84d86dabf3c7ecb782eb0e580c0a8187817580e455428b95926d6d250a92b6d5d7c64b5a46da5f892a7d82de41c15399c7a5392e7059214ae9c26fabc2c55ea6b290301b3224b7b6faa5c27b374bb24878eb8755dfe656bdb4fee324e70ca2544f89cd59116f26501cc2b994ca19c9815efb28cc5b8cac36913ffc62d05ede34e44556ec9697367d5a6662ccabd1a8a9c07af1dfaf272cb26a22f4730c8143c7accaf693cbba07e594d2adaf4f0a0f1dd170a21090d0509e601e2c767988fe5102a14a1fcc897f2ff4a8fb63b96cf6e8e6d7a09fa86f044f2820cfeef57876317b0d67da909bff7e80389f3fce385d2e0f2a2a25397465710278685f1d9c438e70940f9430b4e386be4ecd6f06a24cb49b7450d409c2e287a8ca90c9d8ad8aa23d29e0c8642671e2e2340b57df6028d25118863927d08fdcc1cc0ad07afaaf1a9ccac118ea99832ffae9abadd17676a7f2f0ec91d832dfc21caf2f4f94157cf2d07991d9c9766268c96d26fe249c2bb7df044d7443bed73c3f7a1c1766ab562ac921889980106f7e89ff4b55e2bc4937da4f621f2b0ad4e6033d7b47a280e6ecb1b5c46a2c013df9d7aeef11c07efe437cde5310d3a792d467e87b865ed093069b1ab8506d95e7a1fa0d24b74dd1b17ef8d243168857ad5cc6cb559fa44239e6fa097cd4edc3e20e3dbad52957d8faa89165f2b35504cbeb37f73f215d76c274858f234ef4f130bb8aecaa6121ab807ee270df145e5f008646eb8fd605cb399ba8a453d08a0ccbb4bce83f692a769f081c3e48927bcb76cf598ebca80892cc69c9743150b7925877ce1c6c76d8ae28c642d91772c21da09b4ea6f70c85353096f3e4597295158fc2b691d871690552b3a89068e366cde9e089019527710385943b2b9ee01cfe114741f2814dac82c91726e10a262f18ca28407e6009af207b81a53c05e90393710ba2070cc229805e3084154b40bc8a9279f306dcb5c6d4094fd7fc64083b18070656c0af692778125976667548f38c3caabadbdfd077c31eb512e4a67f8ad765744dde1907f185e8b6bfc7058a26509d243c4128726931291ce14355c436e8010b585c683ebb572414d89819247d1b22896e8904960312f1a05f30c1447eef358cc66f78f04657ad1e8250cb866cc14b933a2499b938fcb325a42137c699780e0ddd9afb86b20e82b79f07b823fafeac01674b03001ba30434ed8e7f18555f0835413b6b63c74374e602aaa102de5895ef832936c508aaafa069cdefd819c983e13532f371d6aa145c87e34ab9eb37e90712b931fe268c3cf129a58eade43f3b323e77def45e885314c937b9fef9d6c72ee3156b0ee833d13f52a434d3f8c03f94562dd9cbf59361b4f318cad3a91bd92be336878e55a906202596371b08c17b8462d2c7e553f5c56e6c556531bf079a20001268ab77ea5aae020cbdfdc2100c3f39faae4d6df8cffd18382dfb24caa59a288b370785fb54107e5405b0d5982bab7ad7e0592900835c23b59e960e2f4b54a6db9a01483cff57d0f47b92eeb6458b7100d00196e20021ce7f45a159777d4cf021280562d2b24356d913c7252a165cefd3a81192c5fb3f57e3e72d39cee7309bdf13e64f4e5622eb3859b850b0838e63da483f481a68f3c85ea3205f5c67fc42f0eef0e1933b7810c9f0e20058a566a5afa2dd7356f7b7b0eb9b8f7a17cbe04cd821749c76b0e8647f55aa370cebfcc64d38803c19f9055d36dfdce46e1cb4958bfc2bce9b81ab9ba045776dbc4101385dbdd99eaa6800cf14b021e42e71dc49d20da3a4c5f49c569efd6cf0d5823e236efcbae768fd0129c8b422e72d30cbbd84855eac84280dcfcf90577ebd6100b25600bd0323b113fabdaf382203f561592ad71d01da2bb08c8681085de230b456709a721a0f0189dc004952932fe86e9dbafeeb55f6ed9b1981f1fd63bff16fde0e689dbe24f241f0e1a20839de1d583daa8c56f26299c6cc1f7e981a02a61e89df640c507685acf14a179abc0fbc7df4453f00cfc62d9b684fa0e1338a320af9e305562c112d6a0b3f3e49e0a04294e8ea1fa1b91cb05b9c9cb323c43c380555854ffa7f6e683037aed8968e41a3640494ddff34cc9f38a1511a3d1a6cbae863c3b1f43789dffd6fe45f5480b71bfa25c9f76cfe02932fcdea38a0d167886583d9ba3c87edbea42c2c25e0e0492d8be527e4c475f5ae6445bc66eb7fc42f03d8ff5b468560050bc62da4abe5eda5227686c07d65ce818d756407b72fb898f2f0f90e73f1bcc04ba494b9b085fb4b24f082ea656b545194e4e8c0162a07e2d5f5edd978e84d579c98f038f1f809f148d101fb808beb361318c6fd89b61861afe44354daab991907bf41199799fff9024ef5c053b9b3140641e13d1b94c731e8e5811c792c52adcf0c8e761abb1c2fffd78267c1e31742eb99c644d3d2c514664029834cc8442632939530b2990632c8ccb2b8f8c334106a8d36d8e560237f506481b05e9aa49197fc7681028fb8f813c5368a94de4ea0fef29c68fc1552d360b169a6fe108b0cebb19275648fe2cf398bf7eac10b5035804235e6ef72e3afef9687308c838b89a2c40e099830ded4b968df01b4a7fc72f774323549147861720e9b1ef40b7f4aaa9c939c94fdd96d4d2a208009193f840b953032f5dd46e93b9f10d6bc48c66253a65152d92c93c14338c5787a2c699e5805fe020e0cfb9a3f8800c723492adb9cf455af7461d489d5d4ec57562595ed1066e4ad90db773ff97485c56bb95eae0ebecc831a2cd7e976f189470aa2c821c3e8f4001dda46bd6a47c4689f2220e71e4f230ff0f8e48b86906bcf4e0737a14dbec02b8b0113921cb20fec2203a535ca522e9997ec80fa50ecb53f41c2b4c03941723ef172f3e7793ea3c7ccd9c2a536f6b9d492eb084280e4967b76ef521126f1042f9ff6e8f8e6f1383904cc0b7c8adddb89bddc5de71f7ba006afaf8c2e3e9f1dc7749115a215aa0c79016f47e76387a8c032245f171b2d8274dc699d28ca4cf3a420d689f5e472cbd1a79eb275630e8d414194cc17bd1e73962a5f6996dc32851b4341923bfd7ba2ae8559715aeeecad94e7967b6a25ff6dcbcdb09be4ecd2114c68614bda6ac96fe5a82d644fbe8acbf50cae16744268482d122028503598fd18c6ea7ccf6eff6006485cd816080bf41efcee097a33672e5caffc874496f37436c91f59ddefa1d1d7e4bfe2852069c5d1b8040ee6c6c0c8056eda7162e0c1b77a001e57a54e1533128fa85199cc6ff6a906fc802400d15efcf872df2676e769547f805e50006bdbeb0d98512a2585abc67b56971229bfd3218e4cff9bee3e0df859083b8c5929b695dc4638371855ffe90b3c18685c772335fa062bcf916fdef6541a8d56b90c20184282be13df15a3ecedb1c62560b8945723bb95e7c1c3baa73a51a64b60364778a9cfd72a84dcb45aec05c68806eae7aac47b2e4029492d29e192d62736124ed451b2e80d867af56a9f74cc4da55927dde5fcda818edcf3d350aaaad603a60ba21f2a875a48a717ec88bd77871f7c41503f9471430d9f899f3fa25082fee6879330562372e082723b673f1be3e3a3225f306b1f8f8482a71389c77946489c0ce6330baa080c6bd6dcce48721ac7d06f19e6047fd78143602f7782458bcca449547f14ae01b7bfc393535950f5047dd049c1ddc5c337094d2ab6be6d9fcc381170ba78ccc19847fdc662db8f35d1e8abeef6a64d90d5c333d9431bf8039304d10a329b3268623a720fe8eaa28a2c8f0ba6e95cf9832dfd884e473bacbcef192b37ad012475728d4bdee82c32298e77687829a60a1235785de445fc2819175e2ff0066b7386b18a830d4faa13d203ed023e873b665b8ea1ace3cb90228aa7bf92591158aa974dd2ce83355333fcfe4da09f6df628340b47f0da85c04c70a6c3d6b2b5bc8893417b2e28c9890ec8473405dbe198eae208485d7e78d91ccf56647c30c32f03a6bee7868ffd20fe8e222221688810049a28d3b8d5e43aa45acbd337f66a8fdb41da3e24bb5544087fd4516abc1742c8fb1ab817222db5f808779b78e739c45277e1bbc0a3e5d7dfcc71fc96b294659b994410c03bf1a4e0a981c96182c8c4d80dbe862c8548944c9f6a770524792007d2c6a88463790b0752cf53420a0ca470b61d8bfc00847a21332ca8cf76fa124ada93933c2d54814d348056a9af2cca2754714357c9d195a31feddee3d9abb344ecc4dad2a65d7aa738d3e3acda45cc187f56d21b1e6c57264ac95c6e605277ecdf5e40cdec56a8140af8299e44bca8fde84063b343489935b21d99dd17b78962a9a45ac3e3fd46cffebe2c162bf1aefead779494cfa3b8fc35e414ecd1d1d4f67ee43431ca84545896de472c5b24e8b7c40155dbf7f6921555f454c923fb2fce14e2712acfcccea6cf6891f24bc0eb281bcbe5bae17211e38fa2935a87cd04463aa177d11b270912eb03efa615712b9bda797cbebcc4e1b4d23e0f158e7b94ddc4a3a572acf320f66360cf8614a2385d55117ba538a5e19be307a98e6206cec407404d441fbc0d330c4e8696b842b8653922152f222ac8cbb9f2864be58542daa02874e8db448f9daece7abc674059ae57a4dffeae30094f458d985cff558c5d0dbb45f2cbf986411872c868f1269c19b7d2ffdbdb843f4b06d387737b4ad6c93d184088c9afd16577d80c301bb582d79c140aad9c965ce8b62eef0b8cad900a43b5cb3f843b422a056361a1abd3acd0d64b7df644c6cfef632e9e0b86089f40773b42794b347d27773196d39e83a2a2904669aaa460465db41c354172491048a39caa70d188223dab6bdb2586043511258ff7c04badfe908517f977eaa835238ab3a1e5737100321aa3cb047a28245436e89b032ffdcffd8a75023c425197ee7cdb4763f11b13de513aa2f4b390271097e994b9fa47aadc96bc77200d2bd06799a0a4d2fe30fd66ca0e7ddcb57042480cab26040f6e849217140d9d7d71104495101746c754307016b0c30ea5a4f1a83447a7aeb87dbdc68b98eed9ad4ace74873a53a2f82f8ba3664045bea119ef457d1bdff5b8bf55d00a0b919311374fdca44bf2abca042b6f753530519bca1e83b65e2ca5d8852e0bd6b3ca73737f579d16910b40982d4b061052b8d59de564546728f1cbc77375d3b362adea7c4f1f83c62c5d9c0d4ddd57255638332e98ee8965b47e90f58cdaf03b9438081e62fbb73ca0a6bd164b4ff35e94d061252360a1b63a3f58cd785826b3d4fcc84023ccf57f62b3cf61e485c3b0a2bc741c09e42cddbf0f2bec85b4765ece041f563035b41adbfecca3c888caf6a5108671a26cb320242af1e9ccba8c21a9f4aadc97b0de7e5d0a8c3153a7c0a654c69db04893580dc00bc8dfae4e2761697c5379511e1d13425888270b466b8db0f44d92d4075c505651079f18af5b7573182d7f5642a88a32130e8531a5c1aae12d6c5a3e142d3ec24cbe4cbe44511403a37ddf937d5765daf4a85db34d598ba2dd3520216b0b19499f644fd2eb557a0b9a038fbd032ff121057d76f2ccfdd9e491169faab107f0b2ae5fd5889fd2bbae0cc5fbdfc5f734b3a7d5b5a6c6329d634a9919fde1815c601bcf2ec6590879550d5eec20a41e88bea3ffb7d46f68942231587aacd90f0e2efe9d0a5414144d681b90da30f27e5f3255167d0a09328d66be590a7d1f69c1ab086a7e451ee7ffba814402ad97002d42a87ea3859d1c58f23bfc66c1efc4fdd3dd98fbb074c32205c9a6dbd630bed5e1f3e50660c39d15df1dea191f5409669618ce4d20954ec5bbc2c0d0a81c12bafa71d10ea881118fdebb10949475ca01b5eb14bf67ff47a21170188b82bb90db29f29e8b9e976789d0a07fc6b2674186bedcee515f76828bd8fcca2326d19037afdadef6f2b0ed49d9849f21ac7d2c6e8d1f824bcb81b2e94d06c5f3f6ef5441f245f75326309382ad3c2f9ee655f0aa1081d02a2c0b3858f83083fe06a2fb376b106cb1590087aa1bcada0367f305282baa43acc36fee341b63b522eed1a27e438852b9bd8acba91084b3064a81b5f06e625d964e2f56047dd9874c2d565002c6933573917d0d2bfc0331acd8b8623228f5c10e857ac93fa927dbd3968169d12cce40745eede48d88b7fd5d5be1ec6ace220690f9514c7ac4c610141d790f6635ca61a83b6c6a900f12b604537d5a94620ea52615824799d3da22751baca2bcaa3fa17ec34ae3f89fec0fab5aa2dfa3ed553ea05bc8ae7672b991d4ada6d9b2c1a96ea5aafaeec39fd5b71617f0fa9b9ba435f03648e626b94d2ff7468353a52ef9115cbed71dbc1d0c3eb9f8a0237caa3de0fd18deae24d997b5818b210222230444ff5fe563d5a4f47df62495961a932585a2e1f01a626a536d935d4af49d9b862ec81a0281abc9c3d6b05548d534be8a6a1fcc933c1283c9e9b9a9e11fab7acc0a9c24db1e06dee52e23ef9db947ac7d0c6c915e01f2796324eadc218162ad124308d96fa96f18facfc959ccf34422e0f4c7ba0c0b4f521376f4a8f3fe5915a0263e3d34d733028d831f7eaba9b652d1b20bfd66325015190da2751f31f82938b48d856821c749595cdfcc064643eb90b41b9d6c067dfa47fa6c96a3ba14fa9591ba2a5db2466e328b745c45214807dde0890a8063264158a8aed8e50344afe501f7404e397c3efeffa3c21ba5877a1a0472b39d3d79e54d50921fcee9c87417b961454edabc0e9cc6573399bbfab05b2614036d6a0343693e622bd613f638a03d7a19c69347956378b8513fc1aa2a7285564602a6a4d2af0d70cf530e451855690b1d33fc18794d33231d6328eae3d9c583992594b438ba2147c7689f56009f4133c25cd41603da9a93e9e55cec95eba50b57c35212536c4002754bd9c6b4310adecd0d77252ce130d6a56c299eafe27a49faf0277721d1304823d9ed904d4c697fb86bdc6361cf38b503577fd50426d525c3a5eccd27dcc0987c362c415d9fd3cd6fac5752f28b203ef7e48b467e637a51b6f88ee193e0f770d207727fba5b4f9322a893b6e2e3dd4a21c55cee233ecbe7f60e0829c5669e95f57dd4d80bc49b594891f222a26b772336402171ae90c3574f7f85bac7709e98c60bdb54a81996ae217ce60d3a86da1583c9e0f72d38c0630cbe73223cd000f716cba5555505c846a1c719b8da09aebbd0751e013bccc1ac47b5330dff49aaa985a91ee480d887c88ed2dab7bb29289638c59761603cedbad646f64ef314f1d56d886a095c360089eb6ff81c4220c019902a2f5669bd1377a18254401ce0aa4edc3d4dc93bfeb743ff7595374c9769de505322a80136d3b390067e2033196bb98d77ae8d4c578d9ef8a2e11447977812c21ac339a85b2070909f3fd76b68c7aec54301093569b8d6069e6351a619a8c15afb4fb94d8f13cd294723aa5d4270b6e1f5413f27111d5408aeff05357ad81476029efc44bc0e644731b9a6f56297ea52cee83d76ed2e56d2b639da124269f7a5dd33f808150ce708ff5b08ae51ac0579d91c7d1cd13fc7400a9325d8324e7a4a5c4eceb115b13aa23607f62f743c24d4f349a3e380c7c12e3cf5f14c22173c4cbf987f210d5bf408492ad386b091836106abdc907946373e1c30105bcdf027aa1207ccc24beb1e4d9fb341be01b8d922bd3d03c6c857072674654f268364ec0fd23e3c78035c2715e7baa1096096451e049eeec904fc4970b41ff3899584cd91a82eb1f035e2cfe03c83e7461fa3c059e45a8d810d3c1706df5a2d4e609a800889f30c01b3cf8e3fa3a36b53eb2e4783b33c18c0ef39675e0379c4b2a58e77cec8dd04f5c9e6ed97b67765f6a2060d44fd4a87c82317335ce4ce6b353c2442d1987da5139f550053613331aca8dca6b0e79b93a7638085b55002624bf7f26046593b3d2a43ccf223a5d062de016137cc52e78d030927519b1f2ffc9831dc4b52cdaf1c3be91b95192317198152094c8413a2bd4687654f0548b43ed71d0667995a802db5d5b02f7204864ea2beb71eaa53c4a168e89adf7ed4e286d2fa5a51682f3520d6f3c0eeffdd05777fb3ba717d84442b2ecdefa9a1e97603648d27c236f6684f800b23444c8f6db8f312c7ed6dfb4934329d430eb79690a34f7beb001b1f226463ff98f4bbf221848286cc69f87d2d4f6eb5a54093b6b5b90f94952d1ee8ebc7d1bc3607b05172c6f8d7f18630a7485236d87357dd1f8eacaab692ee03a2a4bb1cfa9141267b0d72ce82f7a4e1eb98c4908fb93697f1c889ded4a7504ca77324176f6daeff72c6afea9e7d4771db053fa01fef9ff5e41d63df31e7e60cb6cff1bfcc66f16762dfac4ce85c1515692915a85c48e84b2a795b14252099de34ce9b978d1e32905de7cd12339185a54b1a74b2429bc9532b8ee4d2446aae10db333163f35b0886652ca52e94613cf1a280e3b908c79885c9f49d9690ea38de3d04733d0243ccd1b998680eb1666761f82036a5659fb3c7366fe281fade80ef78b9ee0c431ec84c5d48cc46f2d98a41c78e816c313ce4953f257b877f5fa2c3f7cfdf1aa6182567d41387ec5ddcbdc1212aac2502278ca6464d3f415706cd565c9e5886521898504178ca5105c80894732ceff3d0bf2cf351e23d902207208aabec434832b56d75dcb864fa8f1c02171d37205d1f7b254565f3c0aab954795ac24742d9f569d4a0df1e2476ff7473819f2271759cd02b8a139c484bb78f02ea8d0f84fd90695aca143431280142155a859267b5c71c6846d57ee83f9d2a051ed15f62ab1027ee1a46965a8141372b1202597114d1b05b64e8fdbc42a4914d6f61bd4634749ef8d72102759840288728e210f1876cf3b1dc8e1bc28f581befb79351a0d94b1bb5080cbedf3eae33750897d15e458cae073e3cbd5b2870f423601e09b955bdd65345c5d4dc1d80dabdccf77ad0cdbd8a3df074a0178d311cb26b6d47fdb9e574e8e51c59603e00e483a15a9290a730798558db5b0444dd0092788ef86617b279042218990ddaba4d87c7ac5d0a7704cb867ddc93c804e530c93b4e68daabd3d0821cf5b4a45578c9767e627647ee8c2d5ba34fa2bd71f0a7db9d78aba5da0dc474f01dd83cb5d48d3d7e2ae104152bd1843575dbbc2d29eb59ddae1153d00a08bbb6da2b896c4a8640064e14900fc3a4c79d59a2fdb86ad18621b03a11311d04587a1c4a92c3a413b4c8b5ac69656a9f4a8d203d5e828874a70b08a99eeee874d0ac03213040c2be180f1ac5b5cd2b847f1900606e41fc16983b6d77ae8ba2be0cfc278d7a886ddb7ce168b3e024e2dcea09a8122d89f5d0e80cc897b49ebcd5ac053edf7cf233582018384b780acefd7e1e03662dc88c7e8143fd74929921eddd3a7655435ba6555bed9ec754aac4e34a06e7a14375cb78ad55cc61ae00bb68c1d458e466c68a10f710f0956b75616b0605ece83da2f2214dfcbe8ae7ad5ec0c517877ced107f39e2e73bef4b2c7e99f95a447edb954e689ecf66f2b4913879c1caab883814222ea744a36afc0648102260e3859fd040ea2764f15f91231f3af9db4fc533d2b30913ffb072e8e318106880378ae6961134548dc28f3d788007f35ec4f36a519f3fac893f87c9cc4b25d4fe21fe7f833041e2966978c34acc4c7561e74f67d02dfa7365f582c2e22d31341784f255917fee069826fb751fa3ee1f8b6354cc2092613eb6b1e1cc42497d39e11a0d9807524f785a9a53222533a2ee302cf54aee11f966bd9118129beed07010bdcdbaa1ab0a15c51ea70c28ac3ebc957959326dd3c29f951bf96cb32d8d912360f0585900ac2580daddd83b737000a96cd9c0e42f18474423dbbdef3fef52fb3e8ac949b80f674fdb1e11216c76830ed706c1b036a9a6d75752fd0cbbbed274ed6829cd4fb4c11d846201162c03438260821501bc064a0f4b3ccbf63a413b1dacab5ffe1127600dc4aa02424b935074b0f399023e37575984019ff95319e1ea11940a6f2b8b7bab0b949c6262407f61949c16a4ea3d71c75aac42ca3e41cd1bbfa192577a5ad29fe7b1635224b98d730df869c849f34d2ccd2275ed69a4aa5c40f363e45eda892df7fb11b0c95f25ff9c46b3faeb29c275876e645ba0a6e65107e4fef97034605fb3d98c9d1d799060c89f37bda31a010642dc22a3cdf6bdada1ce8bbcede7ca85ac58c11c0d92e6544eefbad59c9e42c947138dc864ba873bb13e09e4ec242c8764c83cdc80a31bc76fb361925cbe987db68220383e3bf8cc439be83c84784ef23170be0ce92363562dc4dd240128251f8cd2c5809f7787d2110181f7694fa71aeed7b3e18a0180cb7d1f03026f3766420a46df839ddca64e5129428c6a315076130bb525502c967a5456a18514687c0b037b2a3321ff6d2320c4d876a4c28ccad81de4d6c86428e89f3dba6500eab9745880a3a2f76ca7aa6daa9cdc11abde75ea33b9cbb4583123f65dad98894b1f17097758d9ca13a195af8428c639c2e376b624f538a170709329172515e85973c01a7852a19531291532ddbd7143f85167e722ba9dcd65bd563db281b92f519e5c2a1185b9f4ecbaf3406eb63d4f4c6b180b4263186cc6382672131f0d4ba6177ff71d6f96b191c2007fe4e8feb59f2a3820b97a6d747e9a24e28fc9634af0ab74f583c0d3c09f6a93f81b4a8e46958eb9a7828c120b7b7682b0c56dc62ab0d29c0d1c98c80450999e87eed87e9c4b86fdb270ce5a0060fee3b952c11d8e5f6b40224bc19e3fd973c3664557209e539c84c797003e7c00f0052c89da95ac0250f79967f3ff1766edbe67a3d10a6188aac53a197118daeb9677dd0e974c054f068efc3a38a202a435011ad9cc2e54800e2d75a69300d6c428a4363a71d38041ec339a0c0cadf8943a1340024d0808d2b0a5005cfd4b8445dbbd354cc7309873149b336e97c568361364859baf5f43cd7ccdd0bd322289284849be0ed93b25b9b7dc3be902c802e1023b83fbffff3a2a5887bed4e40d9d9d8dd7985bcee9611d0ae4c809dede7fee29f43cb038b229e311e2b0e126803c80485e005d3d870f5183e7004a06ee7861e81ea5400a648213c0ea54eb4193c0a0a7ae10345f31cbab3543cc790001bc12177dd336add9103486b1a12f11b16488309c44e2eeeebec45475a8bbbb7b0adc1165fc901094431f294ab27e66b00b22924c2b58cfdebaeeee7e345475289b6194bc62b0c40053567ce012247e5ea4f6b76bfe151058501c99203e56702a616a5627ab9db62e3807f42c18a377aa56b9bb679d611dfaf6806dc78a60dbaace73774fb6a8719dc5c366cf9c72ebcb4aeb629d4c80be9d088b9a74a3e905a0e402102542a6931a21ad169a3c34f5e89bb6691d800fcf8850a22f864112693b694454aba020030c02969529473052480c9626b120d6b3bbbbfb86b7ddd06b3700db0dc176833027000a06c99a34b42c991e15923021605c5083bbc5fd0932f6c20f8bcb43b8e148a4932d9ad71089b1731bb7b7c67177777717d6b3bbbbbb6f3039dbd6dddd1dc56ef3fa63cc3fcafcc3dcf869def6ffbbbbbb6ff0aeffffffa05fc1d48093e6fc8e28732c7730d174ab81098608c0ffff4f08f703f02dfd903f667f550c7bdf97652dbae891aaa4e8665e3a1543270631ffccd25cd44a1e2d4df883aa686a6c35bf97d51054ab4409d9534406bdf8682c92599d1e78498f80473a99b408093833b357ac339bd6376dd35ad51baf22009cb80ad7b78e41fa90fda429cfb6d794b572c2be3bb7717b7f071849ae15967e69451a7c447256a2429b5ce9f953fa62f4e803a6efce4da74d672c6993a324948ade7825a9fd8b71cceaff7f074086d8ce6ddcdebcffa9d423efd4a68129ac0ca108c97418d61c8d4e889ca96e01d37cb560741137be28d9b2d4376dd3dae31f02b0644ab2250643ab288d052f888948609ca1f0aafa30f369f21a2ad64a5c70e0091815876508872fa2112522f6ce77f61b6d1ae76a2c3e901157392c63236758c4115292be699bd68e041c5151f4541dca66a809ac9169d357faa66d5a3b929aec69e6bdcb2c4820a694f9b9333d7cb2a2c82a66afe6042b6085876b66577bff36ffffdf30b10e6d668e1be7edc3d0fcbeff29d6a768e2d18438c39d4cc7f55d7bff36ffff2f39b10eed587ab25adfb44deb90ff4fa3dc77eaadc6c07a7677f77625cc75cfc109cc50ba964368214c6cf8134d124953c2cadd5da706eb500e9d1d56bbbbbb6f750d21b950d13c77ccf77d7de9d3458f4fe2ce6ddcde3fffffff424321a25051c828a4f45c6edbb66ddbbdc319995b4947007d43254c81b5501213e3039ad3773db10e0debe83a7b3bbc7aaabb7b075504b3174c19b01666364dfaa66d5aabab8d564fd876beeffb43c35c14f973bafff9ffdf84e9fe1a82b6583691264f7ae3d564b71a09719b256b6b561f2e1ed533f084392f487cdf9706075d34f996045dd42899e13dfc5350228c8c6b85b2175e1bcf44e24362148044d87e0c2b666a988cf07204637624666cb154d54c566115d0d513bcc1bb5588e2d7459337409c5be59b55447832fe953ff7d39214744628f5708a604c318d9c76b5f7ffff7fa451d5a16ced48432b009e060eeeef1dce39eeee4841ac438543e20652d14308081a69b1adbb3b8a2ea2bbbba325b10e455bb2684efa86e63cfbff577a621ddaa114c66aecb1731bb7b74a9241dcdddd31fb71f312b175e7366eef2f669168f82ae2eaa4c147ce9a4c8dcf05fe9a5159c166852d302caa70f3cecdc8d0927073dbb66ddbb66ddb5665a9e2a422a582a5d2a5328675be63dddd3d86eb3759835eb1654f7c222baeddfd667377f71243588726d9a576ba496dac5c17d63d4789310b8c6e06b8a61143cb3a9beeeeeeaa8b012ee2255b29afc9c173b636a4c7d2ce6ddcde2130385013c809f4040afbf4476f958a2b8d49e9d5de5f63188475e870881d26f56de4254adfb44d6bbdf1fa536bc99ddbb8bd7b1d58d130e9e0bc28655e281211b27799b74b71bbb9731bb7778df7a166d3ffa2144f5587b2ee03b6731bb7f7ffac90b1209887000d9209ca96488c4ce91cc99e205e90d87714c1a2c945774f77aa0b4e490c53dcdeb98ddbbb2541857c48af8b55c4cb8bdb1a40380831a5c365f204b3b5f12b5260a762eaea017559395b64ad3dde891325b8963ac7142a965f3e1d52fe570502563582092ba5056be7366e6fde8801269c230994c0e84189b20f4242ae9c2c0c038ac7f62d25d6a15b4c76aba9b79cb73da2e234719c384f9cb026ebd9ddddbded6074dd45925a8c2dc82b9813c4607262ce663e70e1ab9311365ec35c7fac677777676a3b98b4bbbb4fd58e4fa95d4af5b69e7b26a4a950430c4a39d1650574ffcb7d7777f7ffffff9e047088262fda4c89effb92a4685227e8fe375d8d2af7f54ddbb466657c8c6898bb678008621d2adc0031bca9383fb8aff91e45479b8c9c0fbf60aa01485383afb86b10f930024d7e9408d72767ee84effbb6fcffd7982e9a1461baff4c3739b5d50fb13e2900c521051a3a7a541134c404a4414c7cdf37054d832e8a7479d3a087307f6ce02180ac11a6039009b99e3d58f34a6d569e745e462f2e64e6bad4376dd3ba4a8196a8a227d5cbf3c0cfcc7cdf97277dba2812c6cbf36be7366e6fdf8e14ef97d65c7671a0b2c26d4e1ad2a2000a0d4c51cc4c0b67464d78eaa4b9d6dcc9545cf73585e6e30cc41717d20dd0ce6ddcde05ec34703b24f5c86d26221215898c444a2266fb39e7dce6d6ddddfdffff7fefbe8cb99130674c9b6e573c904b8f981f8b2c291a2b9a2dbd5794086492c029549902dff71571776f952e7a6c61cc7577feffffce6ddcde1e5613cd8c3466df072d5c44cd88ad78e049b14cda99d9b3697dd336addddd7b9eaa0e655777e7da4bf29424831e4047271b8e51b82e258151da02104d98852e7a1c3b13ba2d4fca7fcefcafc2fdbdc3eceb6b912529c0d79425200b151b11a66454889ddbb8bd0be0a5648ca4e0e1aa0398d7d61146a9b9845209aa3a94f59f916a08c3a6ec664608e5f1e5317656fb97136356faa66d5aef4b9f250821fdaa8d940d964d571b5596af8457c32be255f1ca68034b871c8e2ecdaebd7f9b73732737839a43faa60ed7a921ab05d40a6a09b5865ac49c734e1a4a4a262d939c92a492b05cbbde2b54eddbcfbef6b00e05068543cfe5b66ddbb6dd3b9cb75288d9e0a55534f195c2859886321d169f14392385cf8cabbbbb94ebffff4ba5aa43d9ffff8f9a61a9f1a8f0bcf0d4a8380ab29e5da74b674c07ad6d55dcdd89caba766b1411b733e8ecdcc6edfdff3ddbdb8c6ff24dbec937f926e7dcffeb9bb669edffff8fd71e20d75e85bdd09aeb8622d68b75680f186c3bb0843995f702e3eb4902433660c154c613238b61a985082305c2d2a01615dafcff4f74c23a548a8388956b2d4f29dd31ee287798b790ffa34cf306ef70ecb09edddd9db7c43ad4496a8387d5eea6c8ca12840298934543bbdafbffff071573903148a98398b76de5eeeefeffffcf02da72f6c333684830204d444d162e6fd26564d7b267dbce39e70f25d6a1cca6f3b9f111f6bb8c11257dd336ad599430f7414e60a820a821a824d412ca094aea77bbddedea2e5ea4514577577bee9e1e812829748f516ae75b3b5b417a0010b212c51f15cb09221e06db1adac242932c869e1a6bb20125a30b1727558b07fe4249a24af6c53a5b7e840131a30ad99ddbb8bdd51d9f3b033b9f7ae236eb823e50ec8583fc8873e58453458f49af93ed016a90509bee9e41fd79481608139062cfe7b54c85c3fdff5f233ab9fffaa66d5a9ba12f88aa0e55dddd05f0154f9eb8bd731bb77786d8faff9fb6d367e6786a9bd6376dd33ad81eb9882488ab98b2f6f2dfa51adbfc33dbb98ddb5be97eaba2495539ab75a8e0e444a5c3d2b2e889cb28009ea1ba74b68abc99d7737d001f934911db3d0994fb3bb7717b6b0089284e9c59ad003e01f196d9f1e5b547a9cffdb6be4f0e8ad4fb553d7618b3691ca41f0b684840421ead3118eaffffffffffff46a5c26cfaff6befffff1f8ebba8542c5faac8041800431a38040d8481284e049761031480091d4c50485e4c0c141a321c044443610000040380603018100000c180701810060693f3311a1b60225d48bb007f460bbc8c335c6466b4154565b464471169eb99a12bbd2cb476ff31f63d89cd9d90c7319c1a91d85a3a11d00273a1ca6ef73834a51f1efa1da1e2a2a0cb5bf19a0c946208c4df0f9221f7e786b92fc0e805b5d35295e8a11a7e55dbcb13aeb361c9f6af8106f7a1144990ffac9357fc5487352972b5d53590fb34b9c9741fa1ad9e83686747cc768ee45e386a7b2617adf0e2cdb27c5e7886a8bc6e75b20d57395644280e120d470460c33594433983f7648b9575cfb147bd3b5a4256bab73dd4ec2378da9d6a73931ab2143124770163b69888c11543795ba2a7fdce8513927fe36ca73beef4d32d4cbf941fcbc10e4b078a29b5deaf1baac2ed5fd83470ae53ebc8ad968968209f29f6410d2548dddf37346964bda5487db96fcf5bad3410210e23fc1aaf541f339463ffc2e785c1a6e8c4989e5afe0abda5c2590e8d40a043be1ae35b44445b9a8410071dbb5cb7adcbeab9e84659a07ebf69c68a9699916f9c0a6a5b2073dfd8c3ccf3821b03ab57a2356a30e84b1d98063b172034662565f6056790c48027fb7c9cb1095efc1322352da156436fc07d571e11197ce3ee2ac2e8fa40c3503957d4b7b4aa691a8f45184b3ece6e0447661b21b05a7b5d55330b9eddf5bbd87684078ec8fe280d72f6306661e77f1bef30a6a7232f704c8ca62569cfedd45c25faf6ed512a8240df29f28c9d581c20dad6fd3e54f1c5cabf1df810e0dc414fb709e3327ce28edcce4b3a97d0a9048c838e15028c67dc4e6f3b44fabf6844895c98c4f19b683a1968d6855b302461c6606a3c57d3105321fe022e643868cdbeac51d001df690e6473839c6d65adba51676bfd08641cac2ea6a02cdaba485ba0136b9c65f8b260f4834e3c2c9e980fc09305f7f950f0782c5206dceff97c61ec4d8db865e7c938d2f4e7d8dcaa3104ef37c9adb341e474c0072c1a780728b1d0a51e3fc1bcac09019b70f35e2b52c408b561a81060a45cac722e4d31448ed64385180702da6e457ebb6d98b00d09c15ba19e4eafcbe1bfb251b8372b4ba8f1b19858d189bc808260495151f86df2bc49b1c69fc5327e528518ae71c1c00ee0a24ac7ec84e2fe1810627091c1848e7e8edd1fbd7c93b76dda3bd54175f2a3ab3f7eda2d58285a3b4e5c4f0d19d4949bd1ec2230f8081c864b251924a820f1a007ad83748fee0b7ec70a5a0fec408083ee0e2f201f99d405ae16cd192273aee038427891b72d34ed28a892029b541ab456f716d8e4d4df95bd39e056e2e172e19c47a83b71ad8d9468ef882e2cc3e784d912e22c123d3404c7d31e8427f16bb6773c09d511544a9e6e90de15395ecafd027a7c12f9324971a5c8f99deb260004942950c8f441292e6d57124fe9d311b00650a816085b5272ce85497889899fe35bd0269a8f81b5f5a58b4638ac0a0bc3c5e987bc0e8be7ee0298a2c1ce0b7a3af960a8f831cf4192fae7470a53517a636787b4c45d81e5c04e29ca9ac031b2f1a63b7c7a3d22feb114679ef441d46bcbf906efb8fc4b33df68958868fef1c828dd64da2bdceabac5e4c0a7fe3c1897d2b72b074dd1ac2e8802a4d321a474276327c4cc02a0a1c709eb1a2d768b15fa3924ec5511b2b2efd06204c7e74b5e335389ef1146028e7d4799b16ef1c7e0cf1acb0519885dc7fc3d2a9c34235a18d5c22e1cd0f5f124810d7b1a5b7968e19bc14c422d6828eb2280a3d20de2cd6b9a5954a98dd268c7f624b20bb4a0f2d7f4378026c4c5f09d8262ecf184282a89836ddaca1605e9c5c7e9b2a2464de2f01ae6467ed088b5a77630a5bc36aa30b9495aa9a45af13e4d70c242278995ba59728a846eb3517cf8709eb0c5f082e007181ce3023290298b8c31dc75760796d3c3c6352e34ad4d0d4a9bd06add15aeb1cc1d050d3c28fced3808f1746a8ddf57ef64bd2a7cf47dc1034c5af05fc8589e3ea3a53064527de354170623cc8a25e50b2875c7ee08ddec50655393d6046ebb2e9cfa5551cc0421fda8fc11e1378ebeae28e39f53b86bf3439c4c69f1bf6b1bd77590f2fe915c900aceafc4e177c2c51d103ece852aa05f8023c211b242f7f575311291384648a79e2ff80bc630c9b3da6cc0b716f04145bea9406422a8b8058f91fed0e680e308250f4c13d79047675f031a530724c999516e6e887904341353af413a4f7aae7f4c6c8ec8c59ac5ef227368f663dfa4f938bf3fa58d3a59dfd626958f160fc6cf098a80712536e3db70254e63cd46f100c1cb44cf64e81f2935913aa87f4340e234535b1d0cda23ec008e68bf1d5981c96133f3885dbef64a69083f6611a686ed20da7ce9f9a100f1ec925021a8ac569876486113ea0064c60443c24a77d08fcd2097425410ac99f0e5881b6da292b8767e5396dcefa2cb1ad6502ea3af407c76d8521618b0039ca842b2836a0b1ad6033a81d3390757a1da34cdea03f9ae71052a4f301db0af967e289d79099b410af4448096b5aad58af48e736b67c321847760669ecaa4839a28217b2e00875ccedec490207f1b63ed8ed99ae0aaad9e4ac727a4f1d7da471cb6a5b194587ca25803b6358fe2d5520ce961aeecb4855f3becebe04ba121047da6d8e728993fa566fb870bcbcf0c149270c1ad6431bf569d31414a45c6d3baaa4f4da248329b4cb53dd885ed51dfe674a8fa316e3073ebbd22a3b8f4b0003cc3e3d2dd9bce1d17df3c17c812452d9ea412149d7f01db8395c5eb952b0624af1cc145f206b761ffcd312adb4dc3f767202fb0edb414b4f2fa04bcb72136ccdfbcbb91ab7ac39442717049309b3d6d6a2c0c1e9842f22892b1af2884c4848cb46111965c61110ae246e0762c06730b0ef04f9edeb30a9f64e082f76a4b14fbe3fbc87327a2eccc49444fd23964659a314e500ee08a23924d53087bd390424230093652251d7702503c1e6cc61554a168c39c3833d5ff7e9527ae6ef73a07108eaef325c35cb680927783e396cbacac6940192b93a0e3ec2fc4d63cf8163f49346a2d092f64ef9ce4a75a2c06f1c0aa933cfb46da64036acd92029d10e05a19a0f406eae8c4d176b613ffff071df56646223357257b90ac16ff051ea700fc66b5ced6619bd73c1b1fca9f4c700fc04788f3f5b805b3bf8ff6e0dad63c61044523374f0b44f247fa411095892dfe8b6d1af6325e7c4173a8e8ac86ed947783f8fb54df503a6bae6d3a5deb74fb408747aaa52e01b07b739f147c264993b97e44f6c59e1dc466c9a7cdd4a9b560dcb84698e19fc1a3420f078c4b1204e3463e7906edc2a41c5aeed839ccafb4fb98434684482f8374e6a76f9e92adb7b65ec52e02b382edf96dc0c46ec97258c5a3417210a37f9c48dabd2dc1b313f00c65f8c8f6bbaa1dc17f79ef28714e726a1a3c855c8c3d2fa87f3b73ce4b39bcc138bcea9177a98a7c8bf9a753fe4d14e52bb7cd872b6aa6f910e91075632e77485249fce0e56393fc19dd2f6a6541953b3e6a34d1e00c413a99a9e224fee0da6c3a014d36722f15f666395b8267f4192eb20e15d6431a2f245438fa5b548718f4a685c90c2b00bd737ad562c7f2559ed27259559a56be59bba61d5a68a00dc57a0fe93b6d26bba24c796b0dd422e8d528f2287065644e7eecbbbeb40b5ae4049a005943121a7124ae37026a08eafc11881417daae480f538d5bce51aef037c361bfac653c62b6274aa78656261880d6d3c6cc76ab5fc2561d268752b1b162500c7fc1b58ecc824c28ea9943a5aa0f3a324752ea9d11ce8b62a8e3e2b46cb6f7153cbe3356fce1a4860317102d315b0ee69f5798c694ff4a3c08266eb44244fe6b9f956b57bb47364eba976415112254b084ad24f7c15709357c35bb052d3d28ff231b79dee77f41c5cd02fdbbe6f5635b2c92497a57483268ab7c6fd9ff9e46da8a3e2f01569d9d6377ce2437b01a0ad61928432245fb5471407fbe9c72b9ba6744b4a2f205278335f39d3b06897d710d5fc5570fde0c50e3d81ba530648492054eaa9106665576469210b956187655546ef9c96088930c074a619f109fbee26663e39916d04a08c44684f68f23e8d2adeeb810a7a4406c668d5cc02207ba6cf853d792132f025e7e0b962c592b90bad91e2c03ec0a703373f534c6060c7702dc569fb5486f8c93d499aeae5d5b139899319b28b689f4e002ad7a197c70552d6162e09829aec9c23d63e54d1c46162ca542d5acd671c6c43a8d36f27ca6625b65d24774bb598722ee9e9730ebbe446ea9419422c4eae17e4412397f184c922fc1591bcaf0731ac29177b44dd1b8d805dd5061363d35a24693c71af798da75887e23dfbd7e5f66116089b92f2c21665eb26c6a072a3c3923c6fd873692cca612013bbdd9f568d168c441d645e21391f765c4145303b14764801b71b56a993183423b4f2c3ad308521fb9a5e510431e8df5e0990bf25171dc95cf08dcc8ece1c5e268aedf92c76562e847bf994ec6e3952d052d82445d5036cdd2a9c9e8a4ef5c55d79ed759a1aa4d5d8fe6297c8d91d6d85d899c0c8cacdaf19f2ae1ad8b2c40d4cb89903f249e792d25ac54126dedc8b08237eaae067f381442eba1af18b27f125dd8b44682ca8f604cda13d830fffbc203dda5dae0158b8afb94e15cefbef32c1db52a4e07657914995491ac3bff1151ebfc81e162f1f6765f047e31ab866bc060882ed7a07f263e6aba08c86ab09036775e5df9882dbe3b771eb93756b6fc8e0c70a85fee556ea63dfcd7df260834780ae3747f6c358ed097ca2b50f320fa686a46419c296a2e0c68d9d800858e2a822c283b7c55ee7d78ace683666ae6651f5269a27b11c494a040e7db027c7e12179c86355dea436e25ae475c4e3f4d5789e7006ce084668511f1fb74af68e1aab6afb6a8f00d70eccad0ac494b53775bdba1cd2e2a323234f37f82278c21b0893c993ce1248b6ec99979431558155986e0ae828f26f4784a6868d4fd32d1a10ca30f779e2c2d73f9a82de54752696f99b3363788f3bbc9d9e679f293cb03a0369011d1ad101a75a9810f76465225b81ce584712873f81a74faa91415919e4b5299fd51a87c9014e5ec7ecea8dc164522bedccb6d5513e1d518f6ec2017183d8834b22e308b10d29d67fe41f4a0619a759c654d4bf23642fb2de11b33e6d782dac356a49b0c6b057eca70a12884fa851913dbc29b5905c5d27e34c41b42014a3fe9c201240e8e249fb56f80cdd23ceb63b5a1aa69cca15b3a44620731b926a717d1355c84724378832b93c687a9614275a2ed0290de6901317a0164f9d60b934c2b80ad871f315cefd954066b73f0fec33b4ded139788f4a3c7f07cde01aa7a44542c7ded8b12d98bb5714719a186d1431ba07a2ed4da1777f784f193c57e087e12c480739f8f4274b5d6c29a6cf9f5063ea69550b741c3bf71082ca7b7b43a77a82e4b552e3808680835ed8c5e909b4abd9a18d9cdb79bc74c566f49ff6f4d206679ee1d43b8547f5cdc3fa266c4c341bca265857b1929a1ad99b75688926cc8658f5ae6bd0d103605244ba67aff3c8189840281ed3622d14c6bcc418d44942f25ba8b2e744779b28625148e1d1e7ee6c3040277f65194ed41b9a5de05bb0de663a3332863ca96ebc2fa6eaeb776114a2eeee86cc50a242fc0840c87564d92b10a96036fd48497ca0ed2b29b0a19eea2bff6c324c03f5f7dd7405f935c654d5d8c094e5ac757ab9ab850ce2e33ab5cb8ba9bfd59427f3a00ce67e7894ccccaa6621480b763ad29cae2a2423026e548e93077d51767ec716a935b580e5dc1485c5567024346c9fe7942a7b9339925b5b6dec6cd784c41a82cf921cb58c7a8cfa1e33108f20fb5eee47db41e90c14cbdbc0f6f9f01617b8b65f31669a92d047d1a68861096c2c3de95cce055971f7f33c4208c953ff9cc56fce5ac32628f8bc06c660ac3bc129e7e138865c0f17a3165697d8cc0594a3606f65022037fbcd3fef494e63dcdfd4049673d5f056ba02a323439efa343103e70ef7a1e1d6d80ea2544e6b06201efeb631cdaf9616b25be1d868d86293725fd29b9cc8cc7fc1a56d29af3b52ee129a7cd2ec3ccab9fa1c2582a3a4f77ad9c47e782729856fda4ea24ecc51440377222218875201c85acfbca75bd259af9ccebacf3ed51014758d29f8a306a098304ac528a43a90544ff396bfc8f4d3c3b8d52487887631900c269dd86496974f33c84d2cbbe23ee358b906232035933108303ed9ee5b8a48a5b76d0450f4631d6fcda3ee994cb5f757cb809381018954ad118b4bd8d44f647c9d29d453981f7bcb6d6d06d08adc163e82ebe9a75c239d5cb29463bbfa3a3b1491049e03bb0f97c6066e025678af232bdd3f46c7814e6b22be1e62380351d63f395f5dac4b789513c075e0bb6bda20a855505c323807e03b849ec5ab48e9690244d3cf7bf79915eb3dfd65c97fb1d623fb9bfc3e59a14d30c435cce00fcdce8517f6896f3fc66d68aedad7b3c0e81173eb8c5f4505d51c6dda72700dd4962e1c71502396f8384159ac4838d857f77ddd5254ae5c40034272bea5c11cf2261b50c99c5467a71f024d86591d47fe08b0a9a2ebdf413c4610b6bb652c8eff5331c004943dd2212656bb2127ef1306f28b1bfd92ca17f69cb1f39b124632d0cc708556674bd2127af2633f8e377c2e9364d4de0a2e9cbbc21d52c2101b22513bbcda5f04c3cdd17497be586c65c27108b0caa7400b370dfa13b87ca9733491967000914c7b21e2767dd2e57691065e4717ad9bcb80e1dc13e78fd03cc2b82e17fa50f9816b32b1c03afa737633d95348a27671de4686369303d12a44998f168986d4a51935c7342e2f06d4741dce067f4a6942fc6511bc4c927453214344beb4f24e4282fb231b40a45600a32f67ec9478c3223d9b45041f998302838d91f87c8463029a140be38ecd024548b41ccc4eef0914a7349a11943518fc71d85ee4293f8497114aaeda982922eca5a4fc904f40c74f5f68951a06537373774cb907e0618f6fa21ad7aca2b7a5b5ca77fc37da56e68a9b9a5e04ea66739c4361031705c9f79f5048c836b803412c50a5cff696ef324b41dcd9cfa1e1079a09edadbe1f2b5fa3b22d6f74943473c250686c1a6f4ca970b9401614494443b4112fa6a88256d42e53ad1addd3bfb70b808fc062eeaaac22fd3f07d68dafd329e6c9ab876226a10ffa78f1e8a89ad546b84162ea172faff5e0607d4addfd943cb38a00b695761a8c9534916f10430d158555eccccc05fcb02289f32f36040e7dd13699d95520bdb9d356661b3db0c363deab0bac017441f3ab010215bda966b3cd0db158b75df585de6fa6b0d1d62953262b60923d66744ab6dda12210434fde85c4a16df99e5d22064d1b16140874e67474cd22256a17ea4743b7007965b86893d2060213f5dd231f77eaf7f97143bd335baa05b14d04a354f17d334411c823a4a461ab9dd979d6630b8ef4ce32eacb88e585c51dbd2d3e623022b0755103c0a27042ce24a18b64c847664bc15fab1467262d7f82da92a63fd60f52e3e978dd58ce4072a5dd2da636edeb67aa6648728e0e40fb6306783cde4377b37d354ed4cd692315ea159ffe7c9d1ebf803c64469e6d2da100463e094571eda2e33813572f7fe8404891e6c0dace225e4d7fce36549a71237fc1b0361a992be2603006eb721c7b2a74fb32c5138ca83c9a29f6005b8477dd3c5e35139a3afd2384d01b1201c2d0cf6bd07ee4849c84c6c4050f947798758f115ea5ccf62b10274cdb5f01e55e2fd004e79f36aac8f102a612c744529b9171b0b4c330c3b1d07c3198112d178086375961be363d82ae3d41ac9c5b6c3574bab1b7154fe18c39cd0d3a4c31c468eae45f24a13652f8bc66192d9cc078dab9e017acd8e6743344c936a2bf172da47ff99c63ec4779455d6a7f551be6d84d4d7287df3f365ce2d7171e354e1f4facce89b272f693951394003be555eb83a8badfdf7684ee0b7f647bba157a89116b42292c391959460d32c858de06a94de3dfe180d6d7716dc7db3456fa889682333c758cb364c4888dca54e4705ad8128c43254bb7457af7c4117a6b69de626a83b0d735435485f018cbf8ec547ca9792aa86e6f6c9261587a419dccf908a1f3de6a664b338308c580cc1cce58a3fcdb068dc4bcd822a8fb294240f30a3e17b176b3aaa5309094545194a30bdbacabcd7f34e1ebb27fd54a58e8c561c9dd0f54d25823c81516321eb4b2c4dc2a3e72fdab4ed49f6d170a7eb805be699fc40f8dd638ee254bfa358ae105ffb0f5a344a67fedcbe4b3d7e8273547c99f4ca255b0f75bbc6749137e97e250e94938fe812d21541d7923bc99e9931111269b43a61b531a0157beeb6b5a610e7427d4d2010e35a0f0886f12d8897042f68bde487d3f82f006086e569b033ce7c7c0869b07f44cf34da36686e393c16f02ca58ebb814dc5369702584af2e47641fcd20ac2cfa81c1da3c44df0e2462f68d9b3d88cfadad330e75dc2a5e67a3b200d4bf9cb6d40b125368106a9b273c12302c9a2eea39abb8da85603eb9614d933b814882341b21263ce2c14712256a9c88a2136d48d42a886c6f95ad4ce2b769e8e296f0ba9a8dc69e5cf9b158bb04eae415ba4379f53d960886eaf4fbca618c327fd740e02d9078c20f1667f88912aecf5dc26718fa4276802f128b8c0a812bb22368be9463d1702b689fe46fa33582104c32ce792a1d7c7027c72e89adc68f6e79613588c5b21de3ec3890652e76bd1195339d17fd2c7f55931ca6d6f4cf36a6da12732766413f343b825b7eaebbe7e944e166752c5642cd731e5c765622954df9086139440efbc14a1c1a4ca5b6a8074949eaeb9921c14d8a3e66a424fbd8ae7d5641567970097e941bc6fb52c854fd3043ab3f137bce27694d34e3725c8f2f3d28656b62e68aae35f838e4262f48bdaccc5602a9f408742722e8962d1a60c432cccbeaaf9b28d422e93f159331ce47b4d3a48ccce3f50e7003ef9404a999e52c0b8837c0246d01744b85b47eb4bacf532a2eb68f6e333d4146d3e2135519c354e44a115b941eaa57322f5495e626b3494e53bd7bca43de753f4959fa7caa20716536c44eb4c1dbdb76517df03d457f347a5bd0b2d3dd1f1338a254da1477dda7dab4a67689ad181e4fdb51d843ca2a42880d4aa3eeaf48f90ce6d8e8182915f035a26908bb561508aece85f182d1abd584bb13c858af8c1c32fa14dd0d4fee7a5a8703ddfd7a672b95651aa70134d623338fccdbd3f51a5eb6f764991128191c90746524f7eeb56f1d695453026e20e2c60b2c8bf7f0b11bd8b42309d131267ecc7a975f55d9ec430dc721510a38cbb2a00b94a3af705c097f26e7c4304c70dbdbb8b9087b6259427ae47b1fb205c4e3e4932e9bdb9a3dbad2617646a82ba8af39a3a184206d1cd88833eb9ef4ee34a68f2edaf6782511e017638c32187faf93492e7b6e01b3063e70c3e1f50de7c8bba0f6a15ce904431b080968f69e10c5e9315738ae030a7e974303b99787d1863fea97c732373ca51b4b1c36fc5503403a5f5e5542a2342e097fe7fd8fced48b2b8402798ee2b48001ccbda8bcebaad5585669aed4b498e6a6490da28bddaaded2b588294c30e5d27874d6959c1f6813f2abbed091ac1812a9c78e40eb5178692155b5c08a149133c4d03ea48fe74592054ba4a070d9fea5354d55a7d86fa9d6e743ec04eecca6b062288e01bdd6810363e1d75ada643f41258c7eb45bfe3cb01c0404c003010683a4a34b68b4bf5d1ee61258feab8b578df351da9497513b17b6fb2e5de52a624536b0716071b0749add3dddd110acfa46e0fe7184e6932f56cead837da4b688c68bb8202c11584134dcb05e5e582e27a7224b53961547a0e67da43bae585601fee0c08a2093c84d06f14bfae2753bea9d4302625c526bc3f06c5b0c0203f41e2392a81b16d8ef48db121e4e0a85a9575a9e1aa480927994828520a6da9d4353869dfe6c067c33a5c2bf5b831320b1ef6effe662f44be83a12ae73d0c4b4adf6521f15b763f7271ec8e6efa42e437281d5c1c3c74b6670251a7bd974975836f300477ec4e3bcd96caf4eddc764776a279b40959cf7c81e8a3a209d13f6d77a2f4dda5339b3ba767eceb65fe9bed66ce9bb1532f4883363822d435b239c71851bf35c71ae5ddc92437b1df320edb28976d1a47fb3714a76d1b87e2b8ad53a17d511acd36e24081bbb34e5b67ae87285f94371de5024acbbc497ba4dcd6d14137333333373703b1ad6743536d6a646c8c7bce293d7f8dc6f88573ce89c9754cdafcb099dc2d846577638c2da758a5c531250d176ce6fcf53c30e9eab0dbece27840c639b1c9c36a972636a5e61a1960b08c0193c4874e050c13e90273e4a5fc40a2d6d1362d5f5e28d717a7a226077fbe34e580365c505e5ebe500c0b15642193831aa8503a9ad23118c0045ab69812250b235e3674cb0693368694524aed88173b78a9491db8ca0d5fe4804d97920c99745111f3f4d745e50b174694846e20a34910cabc645006004a5a4a29a9bc94524a69e5d3240e3d4cf1e249b3416af306894d8d0a10369a5f972b063f7f5d2e25ad0bab088c295e8cd1c310af222440c96a5555ee39a08d9803dad8c088a9a16abfae265e966affba9a68f1a1c750e7afab49175410ae26574c9903da20a189d24bb751491a9ad480f31cd5d1734a3ef415b6c4084f95254934f460c316621081daa870401e569c9452caf052d6b061c50f4c689aa66935316c112386a120235f14b1650745ba68eac264acc061c98a18603307b461238a2c2a1a5168f995e728f124fcbaa230fad0579226a5bcdc5005cc114ab872184201948c39aa81115b8c94896285100650c69532420082176348312508043022a524619d681882a18099a4605b2f4518020c92e081d11141f0e2a9c8c88ad017a22fa880c1cd8e2b4e961842073165e80084295e34b1610865305164a90b4bfe00a7071b18c5e084183192680289c53e78f6aa62e7294c32d87278c2889452da38e1c18992976ec37f5d4d86f0a85f57133278a09152cf8641579827ee4bad62b8a81b0e5c61a8708549728599011357981d362aae30457eb0e150bb2e3620d411ac4025551abfae2d9eb052bb5fd71646bc742501866b8b27dfbfae2d9c7c589d896d73c2ac6aa9fdaba5ceaaa5c6aaa572d5522507eec71cda258d25e2fb53233bfc8c30a8cef30b7dba1e36ba1fd04bf51f7a423bee82c4a6c141edfe429f6730fb328120026f7cc8cd6bf74c47513aa5a3b676944b6fba07846699461980494fc1943cb2d9d90119470f77a763b3654b1878cc8a8cbaae208e3e540551f42155e1809aefa3bc62d41332e2c3d23ee9439485fa683e73cd1bf2615147794246288bfa900f4bf36dc8bb6ca79e0ca2fa19c4900a07b491bd09528f791624fbf9b95079f0fb39b9994e64955829684f8194ae812e53867d7abcd9cf87f4f9616059f2eb06635b1e6e1ed92c7f85c4e71e5ba6cc6f7c666620ee1181df8f088e9a6ff7605e7be6f1c0bcb5cec1ed39d13eb9e190c77c9dba00c48f7d2ff4afd7bce491cd3262182624be740cc3b0e901f13b91fdf94c525f755d4c9edec5e4e8d9f75fbb02b7582e26452e26442ea3a79bccfb26fb5460f537e4c3ab06a5b31afb1d52b1da31efdfa1aa42f6fbbdd09a017e3f272968cfc1b2cb94e1cdc11a8800abbf6d9d65703b8b2b4ae69b966d5176fb349a124c1d0d0518b7ad20b52fee0973051be0becd37b00e0022d420fb447dc57c102b88c5d23f21cdabd0e6db3a28000ca106d9a707eac77c837eaa10b4a124d6f560c063edb38bf202633dbb5b7633f47b81833a93738a9b385d2e31b7c7a5255298b999dbb7ae80d89a48f4028985f9742391158503994fff6e12f0621149c08b456996aa776b1ffee05c4b983cf8eb02828c0b08307e5d5c20d9f975fd8083af8b23fe2aa9880829784862cb1856fb0fee235724755d3f5cf1d297a328d9b67ba260eefb2bc813a45c21b65aad16fde2ea48898267fa1d454e29bd28b39b52ca0d0c4509e2f32e801fc4a29a07896584a81b8912c4e7815a015e18a403634d6f5f7a21c330bb1e353f2dd0df8e75d78e512fca0b9c75379d33d9f702ffc4b04f622d7fd8a86f95a49f4c397313e2174aa6df2ed85980889c3c5830bd99aa1c7d7bd077a723e8dbfb0bf99b66bed18c7a8645efae02f38b3650d99679640cd265c8b43e4897291377674ef656ebb32f2e3857f002f390add6c74f08e640f48500d59f1ed784c91ebfbd5dca17300ecb3cfb82f407619197baa42b495c92b4480a53830fda0e8c6ca81edbb58485942fa80ccbb439bb286a9da54d029151abd5720125fab592840c11c526866118a6b95a4a1ec360b0648474583246107ef032e6b130ec544488c716104674f9f003158a4d8c5e216a9da523f40f0d4fdec41619142d2886a02082a2687a966559e6c36755556d6ac5b0225602927972949c9ee5d10d9670f9d0b30c9bd273401b4252a86855559b5a2546b76aa3fdba948e7c587d32d1aa3ce84147460d6dba57d7eac6e8c690cd5f74b126482675fa9c52dbb32a757ee13649e92c6677a4cbf6a49192ca2eb32cc3329ad18c6659967db2481acd5c514359248bba47b2e40d27e5d14b8c683ed96088b2fe45faa2e2c451c54c5b54887e3ddca5c89dc3addba876b9653f81e5e71756f0b7f2c78a1dbbd90929d81727a0d0ac8b7339d1456c8ebd2f06236fef6eef723bf3e4c99399f9db8edbbbeb13a6ae2351d7afa87c54d7bb1eea0d8d0ea66e4e0c8113ad8f31726143816dd9294cebd9b50328cf1f10ff09540fa4fae842949416474c61a9ebdbeca2464f5da9de6da0bf1b7679b302911bd6fc6ef8f3c10a6205b1b28f2936f1935214d31a22523a424a526252b50e7f345c28b5640f58f7c365ec0e7bd864ac095cc473f7d2a825a6546575d8b9a908cc0766d43afc335e6a288ddc08fc10337237525569443f7ebd3e266a7b8811f19cc14165f6e8430d31277e550619fb22199b81165f31f29ccc2846318ab9f9a35a9dc1a2fa1711e3671775fb38df3c88d579102bfaaa5bed4ef4f88a4fdc8ad1e8082949e9233b7d64311f5ffc34f4b12895a5ce5c5143fa9b97a2a26edf0df71131a18b95166bf32056108b3df6e6754054160aa926ab150a1f35d4a6793ab647f95639c286df4ec7f637d3d997698a57398391e7874393e555c489ef2ffacc0d2af37480f4e992729579b45903893ae75785500f0243eb51ae494f08507dd9fdccd9edc83c1396c11a4b35945f51ccf560db9c1b3e37506072f4b17932cfc993b9e5469b366ddacdcd5e7f91c90785cc9829495390a2d1bcb29286070d5c7e997890f2f30b57ef62a20926a4f4512da3ae6b09321f765112a22e629e752d91e4a3b792d8470d6506358c46dd03763e542140f59b8718ac09d143b009264d289932254ac1d8c3302ccb7444dad15a77c13082dde9e074b4f41c3cdb658d2eb5bfe9399abd7dcc67f743bf9b1ed3d9d9e7c731e8dde998cef3c3e12fa757333ac068780c91e97aa899cf80a972d63067c7d7f3367d8381e8dbd90be3ab8b76277aa7a486d1a8a8a57934ba40b3b46f570cf6f723be4a18e26d343c8e2861d0d5c4ebc368f4b18b22528cae269844291fbd8b28f6eacca9cf30e89ffeb0671ee605f13228fb03c2e086ab8fad84c155f7c41f5627ba104b7c5c4526a336ea19a71a067dec78a8db4836483057220953a2a8462a2941c50c91126350aee2c4cf9ad8dbbb5b81bfd609877cd77c0c22808f2b10f31d0e41fa1f59d326e697b65a343c507bfced7aa8bebf2f768c9bbd88588adb2a94f04102c060c660ce8f8f22a93265ca1481654394d44d1caa33283787411aa2229ca26fd7433e7dba5833ed0ee6ce60671485cc4e0d683e3f164cd7be1c7c036c1de972be740921f4d2e3d06cadeb28cc4b9f709d7ebf0871530e124988264f33cc73304f9803fa609ef0060acc13810f77e9a5d03fe0439c0f7d5e625efbf4d83d07bc8123dda8064bf4ee67e348ab2cf7761329c9cc719275e456a95c655c62b72ccbb2e99d61986318867d2186c5cc0b390c5b220aca5833229e7cb76f29246a749b248a7c1be0db51dd4f53e6498199190521869620a1450ea434c1457806330d4b9e9999190928df2e291257bedd86072d2e295ed4f876dafd34187568015143123dd021072dc39125d911413cbb9623c6f83c3bb6557434e820ca98c508323a443cbbac5cf70c56bea5777777b7cb08a26767d4d014323830b2238e304d31e254e50609e46094650709103db990b840228116bc6c543892064c5413a38db8a8210c09450d4d6c488cc678150d946c5438ae20c478f9eb4a020ca7a6a1295953cea6458dddfb448479427008838b433abbcef6ece0063c7b7966a32a7f7fa46077d877748f0aa20e3be7e0a586e78e32f01852326477587e405a6090999999a5f8528deafcf93173a5621e356fe721e612b2136b3197a616bc2cec8b5f0b3df400db433f46f229f9f610c767ede102bebd1ad57e21f2431efafe6961775a4c0c26d30ea9c4201383d3677373734f2f1229112d2561b0bd88884125a5b8d4c2163b4ac4adb43b2d250989c154911a4622249ec66ca881176098660ba78cd41d2d84477dcce5e723f3b8c4dd4ee3458d4c0cb6cb2f2a31d81ef250546ad7b6272ea5ffe57700b2b71e984708ca39a76ec45951fa4b87f9a4efbce6bcb82644df3c57f52d3a207e2fd0afdc03287ee63f3a4dd3344d437d1a55c50ee2ee1c6c9b6382b9ed4ebbb626344bf909910e445fdb9dfe613781f702bf34417c1eb2d5d2166c6f9f3dfa650cd22f3fba3b7dc363bef4f93fbf190b5711423af6a56f0e33f8c3607bbbb4c1b6399a5cb994524620361ad4c80282b5ecee55eafe646b4ed6267da338d29756a9a1bf6b58d4964d3de594435aa77d2275ad1ac62f4dbb63440d572947d434a21ac6a6a421dd13370e3d1119a20de15239259a6153d20c9b72ca293328358c4d2fc43d7129065d180113850f2d3247599a06d5abd56ad160448c6eae6a38786e6a3d3b3539dd7c53195a54a1e5390bd79627af7ad6b2e4d987468d235962b65268f1edd85661636487387db230f976496f08e207658cc4f8608cab8d2c938f0f668ebfda37b05cf976aeb3ecf0ddbe452a9aa5c148ea091554ba5cd1210057a4d800cb0ddb2bd5d0c8b104adfd5595332d5176d560c9f36b8a17fc17cfee39ccb3cf5314e19977c6a015a50492ac889206450ed811e58264fec4c0947de941166152104106fd33c3d364dac14818362a19907e6448629dfd9056a61e92fc083119f1829f22435e9c6c543834609aa9e1862447434009338413ae21aef8d07f552486dff670b56a5ef1184a9243ed7ab41766ca20f3159cb10f611e21eed92cbeb0af40f4fc92a2685d521409e0c3659191595720ba00665c01c960e661fcec8b99f496b2c3989c988872d0b1c3a44fcf85b91d8fe8f443e1e7e4326cb2185e7289ed62125b892373a48d94986c0ecb322c6e1832d32486a293fac47c17fb309b4afb892dd5458d55c69591e59c2d838d8dcde2e0b7e13caaa2474f79a90b4edfe9b139599b2e387f027d63b18b907229875df2527b7ab7d7d4baa02eb8db1cb5a0bdbb91599873c608343f7adcdde5311bbba02e09a9dd9aaaadd3d505b55d82deac9648e49c3e59a0fe32cbbe70cea640b3bb2511765725bb720c52398bb86ec3d2f9b679646ddd9639d76d996318e5b62c433986722b4f508a4279e8b35a9f2aaf658e510cc3be0582c61912b193ce3f925be89ecdd781740fe7280f7d2adb705f88f35d7316874639c039ea83e146039185f2c8427d431c8bf321c91242b911ca8aab00ea9b1759dcad2059dc67a4488a85726651cc23eadb5500e5aff29a5b79e231aff29917997dbac7c767b502417795aab7cad3202a8fade4b81d67a59c0db11181210abb9434547d644a575d597e41c60d5a2c9641518bd545557da4dfc473290aa21ffae840b1b5a552f0a464e6f639e7ccbc54179a9939f3ad665f08e43117da65e6409e7b4a6f7a0331183f20f9d837040852bde9c1ee57aaf75b4568ccb7db50c30502c43c4388ac28ad2a953b08ae56ab21622aed1ea0d7ab22098178d917cd13e62fac7163e2a6ed18d536c9c9c53cce40a5437612f96e23b6df95524a29a56c669eec5106e59c524a3228215c495b2af6eb721df161e5a6700d31e5ba9e44179118b1a394c2c767716464ec4ef45893626f652f1b1df8e4e81ddbb462f6b54fb115877ca2513c8a483149a9c949aa16a1d2b8cfc7cee3e298711acfc1130a1a9fb129f9ac4f3bdbd0f090fefa0ca7e1d978ebb3ab5f5f9d755943e3eba57c464dcd07843d8d73a783c669bc983d3118535ef6f20c1083ba23049aef64c859ecebd1516008f0ba1b206e06b8598f344dece1b04e9c410d9969780c85f1ecc53cdd27c730189d260772bada31f96d5bcbe9a9e9c52446e94b4b6988a9c849c999767d3c2f744a6bdd2dae8705e9a74104d0a930bf50f3cdb7efc6515e90761d8d01614f3f27fb65af6c0cebc4f8345464af3fb2c4a7fbcd9ae24421c9476f01887b56cb97149044a1f80589c96f4d607c949dbd9827b4c9c6304fcff0f1667d7c80cc0cfd3a4b43e2b09aa2ede50f5555716ca4af16872dfa6fbbdb1b9d73301106dbc7af7e3273d0ef8f1511065bc7b639987dfafc825ef3ad8428342ba1881ac697538faf9e73cbba9f49998b502a3be5ba1f27db763f32eb32b0accd87a8dddcbe183bf6e8c525069b881aee13a651afc72742b19113917c0b7d5715e8abf985a0fc92be9d7d861009a232a97b139dbe0d83219591dbc1b639dbeefad649a9eb5a22b302f3b80fda9479e63e59e6e00acb321b996fbb9b7959c6be3b99774fb2ce5204121be1f889eed43ad3297f4fddddddfd45290caa544f4fdd138d589de973faf41a1045a4dd99461051a7d3117b189fe2537c7a8a43d1697a08fed1d4be2cf384448a7df16977a66b55d41947d490b21185b24d1b0cce39e7d640677526b83bd3a5b3f00304b135c6c70a4d54e560f77ca00b70b2b03bd3e3ffb26943355280f32637e79c4d89a8ddbe69393da7e654db77b80fe6f1b183418c8bda4e0106311fcc83b90f0631e76ed5a0df1ded8379760705ba1fce786c7cc59cc8ed689d88247671f322120631df4131251f9fd52a0441fa85eed917aa5418e639dcb32ccc55388eb94ff72ccbc663a1ca732d91798e796a6cd284b06d0e73390c4e27282f01cbc0b25011f5c59ce9bd4abf01e6992b28fd7420334c8e1418dcd9dbd3e70453bbf8e9d9e76377a63fa9ec2d198653aa42fac1a044428a48dd2382a49731306d33a04491483212750f0bab135d0c7d3d11818079a44b6741aba27ec15cdbe648a9f3ab23b51d7c62cfb2e4929897ee433aed171a7443b8969c5eba7743d430475b9aad91d33d393ad3e12f3fda1da5bcc160af186cffa14adf2f9f02f36c1460a07c3b0bddb3ace5f2ed2558a9eca14b2868ddf2dd735c21beada842a68b152bba40f104fc4ec08bceb0526ad2497bc71d32cfdc4c0244709a5966962c3166995966962c185df29931a3c6866d80e08dd5aaa6c686461c1ac18810b0905824162cdd58241689058b9c554a508212d01063cea6d9d441c042629158b07463915824162c5129525444c2e21131861149caee34143a183644a31fc684c4269629b1c0229689833a513e3366d4d8b00d10bcb15ad5d4d8d088382a159649022c134b1c01896d73426e6751c76db1a8757e9c44a2a3d6895c1546f3884c8d9e8323d23cda388dc89027a1562b22e9e210d77940ddccb62c73cbd2b5b062287dea54a81f91acac0eea05ade3417bf4d32feecee414971634d9b03db368ce17bc36a40d6947f4b538a6b3d4868aa6124a863eadd0542bcd8c59c43c9a43cc8d48514a44a200d28e19dc760f4645eb797474d469515155f8cc985163c33640f0c66a5553634323e2a85439ee364c44a5a144445a1d7624b6873e4df9795459a85cc4be8964c84a0db5a1210d09f74c28f36804f3a8765bd7714d349ed8babb6777cb962d656f9518bd65efea88d213ee5df10e713b1e59486597d270a0bcb954126473727163772867d9a1bcfba2721dcaeb8692d29f5948f7a339ed50de955119cb32546f43ceeabc2609f7749db775eced9930e8b34d725cc665bbbb7277e52ee79917fee0382f3eaaa6552354a3715e4d8b41a21a21d661a29a560d370ae5e940755f541fd46bca8bbfa166bcc63011b56bd570339add663463cc8c578d109fc09ea21fd6b46a5a3544ad67af51c23c9913d524611eced96b8a6ad634e335e3a579f2eb8c373db3e66d5f3d27a9548d66437fa3c1655f3d94173d8975950446692a2e7ef59c6c9eaa297af699ae26099fc0de753ff2ab212253c3cda8868809f3600ea5763a502fbb326ab819a980f3f2db8cc294d177b619a9105f3ac79bc669f1f726dbc5a66c8d6e1c2bce4ce61ef72500e0a9665a5e48e6389f7dbb3bedd1eb293faa65349898d154a6629a369f1aa58452437c42d7aaa9969612c2b0d41083a9d68c31668c81a130f619632c0ea3eec95c1a15b50ecf9b18b26c358dd28cc3bc88426998f4f5288739d9bc3d9a31e1138ef80476b26d5d336190a56c97de8fac293bca8c184cb5362223e6214ac23c982b49b516c74e89d9a8bad9df9e93cda927b332354cb5b8eec7c996d10d531cd7fda076b50e5bcc0f39443b0cb4976ab553c68475f8cb8c1864c751aa1b11a33477c23ceca3978551b1ae5517f5481ff6abbff07c7d7bfb1b51aab565a9d6971926a2fe885a1bd146d47198a7cd7098477f7a290ef3b29f9e879a584635d4363343002ed84af0cdc9e15c73f6341cd77ed850d636e7405f52fda67afb082e696a4c4d39a1720b24aff3ebd2c197df683890eea9b13aebebaa75badba97c34a5998a92a0a224acd7f0548dd5320dc3b039b12cfb280935bc1b2b06a5d3f0c21f287cf42dc16b23eacd322869eb484ff98cd32c49faa93cf3526050aadca609db2ca99541cc298318095e3dfe08de0d093e82d3f06df332d73c1ace79e12ab9c0cedecca2da2c3d331106a503910be4867a83411630df5cfa063ac03c9c97f972d69d6fdd77a3a3db3ce8352f94210b5a0ddf4ec78f0f39e8d9fbf1280f687e8d6f01395ee591e009f9a9de6304a73163e3d578a12a8b495e3aaddea6d8673c05de56ddb302eb4897f206f72c8be68baaa15e50c37d819f4f51c37dc524ae7d7128741d34fd72f9758121f3dbb66dd7835d73ce738181743f9b77ae79dce61df785ec2fc4e77cdd79d3985dd334cd993d2006e510c99cec7e2a0f15257d0811f6d88b490cb26b5e07c93ec33222e60983f8260342bf9fcca503310fe612937304a611c605060ca63a9d37e9ddddddbe5e9095eb3b1aacbd5d60d6581b60ae7d21a5fc852a30663456ea0df529a5d43cc99ced609ed960f7f0581df62a9ec180ddb32cb963771864f2f2f20b7d9e5bdd548b5086b2c1d6017576a70fb0009a2d4d50dcd0758ef36ef3056d70f754665ad2714b688c48d668183a5854ffbef285ab88491ec418b360669ad16c4ac6264b2925c693b9fb6129254bc9bccb2d999953cccbbc748b8dbd1bfbd9ffecb5528dce547a573567942ca594734ed93342d41871a87be577c6914f57831abd2586459459763d90858afc214a6e777168a836a4be9cc58734c2c8c4c4e013d54822416bad5425552a5ff9aca28f8c947b683333ab987906183c33333373f9f6eece810fdf517cbbab6cd0ec0c5c84581c3868f2ed5200b4c6911a02804502b468fa7600302961063016074eeca2051009f8ce828a6fbfe97eba7a42634ab041162d40e10634f8f61a95060d64bcf876a9ea7e9a32df8067985986309e9999892495470009dd4f6344d840079d6766661fa1fbe14e480b0dd0498c6fb7e97e5a55e48a9a053821e100a718be7d46f7d3aa2d90fca0ca1128925899c286eab4a4a68eba14b185a6fb61ec490d2916313c008b27545d7678769cea0898e28a1fb608f13a92a5069aa1279b9ae20a259e7d2648480a27a7262172e892c391118ae0b05ced6c704510339ebddaa8703c07b4b1bac1e5cab3733e1c704268074c18d1011153865243aedd14b0a58c2cacc86205971f10f0bcc5cab3a3ba1f5e059e3ea8c48d36653d0a11d10000008002c314000020100c08842291402c20cd4171fb0114800b779242765a381287d31c876118c518640c2180184000200688313544c441005698e0c6b33aa5cb3dc42b0d2e9319bf9412f582b028ae05add4b65f46f1dcd741ba7500912cfee1b48f2d60f5e83360c5e7cb9e68c169390e586549073e5f21dc83043ad8bd2ee6a5176725a5153c8d378dba9231fe284fe409715195308128a6cf96924b2be48fa9470c7a87915e34ea3ee4753d3eb0aed907bfa131d6537ad18b78d5a02b59e347c9048f105a9438fb9b528a09ef15642e82d1485620027a574a03063aaa87e6688d6a34e5a2602fc4b30c080f1ab0bf205e218a123203942223b1930a3aa1d8c44802264dce1e9e0d8a3d3b5c4297509f2ec43e1e2cb8732d0e324a898a877db6cd819fa4515a22ed37b3dafffc972937452bae41ae0a9d72c62ad0310ade9a29153dbf8a54faca692c2d8f5902b2d70a8de91ad2b29c5b43a977031b71dfd2b522f6a3343c4bc0d5e26b5825df4bbe68515a6715b4d581f307d1982e0af42718e02c5908d58ad6a10664499a293cf3ee3f56b1b2f4cc52381560c5922e9cfe07a60a54287e3deb07829e6d9d714fe723e9a297631cd787892b334e94e40696c1139597406a50b80b9cd47bc83a958480d073c51c862a2c4a45c97cd9e2706f4fc6d380f73a169b362523724eecc48a38a111f8588c4b4abe605cf6c24fd94eb3c130029fc50011b6734bf853935979254c8e4bfbf4fb345287e9b8a0711fcd7e8d7eb1219d81f00b0c1eaad288f409c56731489d680745329ead0553efb7cc72b52eaf06f65d4473b821c5ca9bf4afa23a839fb2320e35a91e2f354273dc833795954476a8cc24e5cc9c3541df169b6c9429cd93d5d6bf85ebe7f07ee4b3f5721d79c2b1b28a614073e5de1fce7316922f36e89b51dfda17880617a953d36351fc4211eef837fe54c560b33d0b78670e57e143bfe8b13dec949b1b53e9311610289059babf6536294d5d0d4c65af6694074561129612575e8fd8356479051859c963e785c1293e020b16c6f0b6a23455c0b9d08f886b123c230803d5cb1d51d7e926c0954dd47b81ad86ef383b5a2a86a0d326f03031870f10778fc20d0d880c9a5fd17ff4b1309388bc8b8c29f164b07865cf847f613b940d4c227752514648c4052bca7af36d5c9a3735d3aa1d8a664aed3f2da4e959c056855f0315fd5eeca1b5693d5bd02ae1d74237a35d5a0497e28f0eaebfca4eeab72d41fd1378fc9a683c0f243be1de9d7fc17f0e9793e64cd86322288149a552b98d34ed2b2441b9af7a9199cd39042e3b98932d37aaf004f7a3b4c7f57421dcb32ae6596ac84a6f83bce91768ac6ff98ed351a0616d9aed2d2027c1b37eeaee1a186a34ed04802b117bc8beeb6cf5d00306b344174299c3bac90cff12e5b7ea80616ac9412d91050e2a1626c8ca50fd254cf6344f03b072750d7350e5cc46a474739263243d17c7e64a556debbc9875ab8e79f265a4109f21711c2c23561175aa5dbe55204b60c22cc722d720308b9ddcf67162b1bbecda5e64ea354176dbd18a25358f76fde2c3af50957b4122014534d1a23a4b4df20b7e36155eaf337df7d99c5dd0900343a9e5631c668f26b2566fe67c4d630e646b3e3389158c768835c08f733d034c9d7c30d4c04a6d088f1820f2f5930f2853e3f8710f7ab23bb7da8713b60a7936454c8985a766dc4b67ac4c064a0c3307bee7528d31c2ad37117ef470b54ac4e4a4a29239d5b47a2e52132ca2d65755d4917700f6d038b6e9cdacc136ed7283bb15762c21944a2d0e6fd8d62582457d152eed950c51e319032fdbfc708a13d54f340ac87a0504e7575864390ea752cf5d9e0eef0cda79473ae70cc9199e9aa0ff1be854003f0efd3aeeab92baddd6d84b4cb7ebfb63e9a5d5a057456d3ea11900b3d6126420bcc1b1b233c49714584d7fc42a6835a3a17872cac20e0966972722d5bb57e0f5b6f7555cf28f5ba79b718819d9e075b3532b23796da420416e6925a49b9eb11868069439afa97fdb679943e071d8e3662a922b4292738181db779aeb4702276ef77f9387a3cf7843ca3595f472cb14703132c904a85d24c83e8daf41438685881f87c60661c54623e69b54c89f336e00205b93431a15337a2110d09e8d25f485d8040139837d1b975a87b76ecb64f291ebec039ba3d01da00cd3b06fd55fcdbaf8def5c41b7a5f31335b682a25cbb647d92022a6973a73d01fc5fe11a1faaaf6dbfc35c390561823225f4a884fd732782732ab29e45afdad647ab3b9479fca70cf21fe326a2e1222c9232558c2f60991f460a04d9906d369b2199698f09fc701c9d4744b379304192faa60d7c52c68b5e131f73a3ffee16ec7d18d1ec94fccd76ebf72abee30a64b5744a0d55b320f0bbfd4f3667f7fd85636e236f5bf9f4d02521399b41b6a2a54b9c670cca72410147e8fe90a8a9d7e89e7b43c4ded644a6e2e03415a54040d8283be5252a45127b0ef4fb7a95a4d2d38d1b03982711e4b510b97e22c238a68bbfd25d0a85153fad251bb7ba76b4b0c7b3377535066d5ebc612853c618367f3b28c1bfe26f334fd30d96feacd75a8266ca9fc1444269ee9565f10696eb9119c1fa4190cd72c3299f052189c9dff2f7735720c48992a173dff4cc3d77fa9fa2f20732f711b31d37108c3c4ce4434a9dac8c95dd4c26aa5ee905457f64882b300846be113412ee46b85205eddc8ba08976caabf703d3ce8290495c7541474772c2da76014756640c45face25631d16f1311334dac102a9c9561a799be91f80e244bec9bada064efa309a2ff208beb956bf2ec423a433acff14aa74efa22293ce3dad979504d031e5fe2a9ea84be1caeba4467cc67ff8641afa963fd097de19cf64d5480fe462ae9443334e42a4d08f73252833bbfb9da8afa2f2a6b86868e6d3c2dc65e0834b0d5b9a0d52450b6bedf28b0329ef9f1c36d085afdb03a33a3fb424a3630bda050fbaa942e7fc8601a3d1f24f85ebc000120db80887aa6cca2a3f5ddbee2aaec431f48ad26afb29351273f068dec1a80e153b8c80301dc2cd9a1f5ab92491ac6aebc7a459e68b8f91250be6e42df3a978830c0ed90871425f79a879ccea0b501634229cb21a985ae00f656db127d41fa291cac9423ef86d1da25004f4d632eb8c688b7398b492dca06cf0e65692c79636bd41b593dcafd80a52f20aad6ae69dae1c32db6f3c6f215d6d418e3d82c10c6f7176a47004078fbf8382d6691c8188eedaf7560eb2a97223477d02afe33e9da6969fce571ecebaf860256684368f4f236759bd91f755cafa1bfce1e633327a8533b624854cd55af1dcbe953ece624fba5de3168e6f0f10e36e13b380d3c77cca6e589c8a2f51ca0e6ea70148984fb637a4b1b7d66f065d7f139b5736ef53eab444f9dd7699b6b90ddc7aef141d7a5ad61c2663e68ba3f21ccf4c6443d59af9cccb2c69b4d0cf595910d9782d1ef2bd144e1f632ef606b4766eda86f768eb6f6b7e857548d6d9c48ec2851cb2cf09ea28e9bed262addf63c170dbbc0ac57241c31b72b36b2121f4ffb5c1a5d7ad6b2026837c731a77d72951bbd8ae0db776fcd5022b2557ed22b8112b4cc5631df0037f5eebd235b1efe56709d8f369eff715560e4b2a1ee7624b64cc1bbb9b487e523ada1ab2e4ef2c92e627631d32aa4af5dc46ea14227ee92902fc61470290f3bac6e0d4c25f74c523e86ef77cbe8fd0c28b1d64cb3fb4103ec1ca02b3e76e87fcdaf228cdead443823d89e6c9405c23fae75c0a3c7ef4ef10544c1cfd64a11a2f8c348b95c95bc49e929825c6979d33f10bfb627d9e6c1d47fd2197aaa53567c2e28efa9970683902b82bb31788ce830cf0ddefb38941edd5a57c1f04313b1e95e6074883c9292df6dd9b846fa962f4060d03095bddbe3fb1c7b18ef29930bedae2f0f956715fde037f0b9e2628dceec73e77569a8a1fbc6f20d75d6506ede4832e86754a95d6721165927901366cf35205b1b407d0a648a2e16a214183ea4ce2f5ad8bb1c33a8066eef3d2fa0e72e019a9e5f282c269cc1c4327a959c48dcb1512e8dc2d73cee99ad81d9cfc28c6884a76fc80458b5a5bfa8a3f50fcea49479baf5b4465ad6b48fa57b9fd3dab8169e28e4c42b24bbc7857096520e69348a6be8e984afd2d6cf7ab439ace9f77a8886262dc6fa5ba3f5532aa230c21e7ed83a3c91c2f7342eeb14c68782b6040fa6128690c005f5290e5aeed1a1427c423bccc2dcb3a8c8091c12babda9404b7c84904c9d15dd86201deb246a0f3abac6421545d839752c294c3f7cf2e7fb1fdb45bf34cee68bb136bc50c94f2e3c8019e8456d05e54b5722b51f52f75ce5e6994dcb98d4e996494ce5fcf3a98b87ccf696dc204ae1fffd5350818f71aacfc8b13792ea9fc568603ba0a6a7573c59a12a35630d8a1ebec439109d02d4b6863225461e53cda6ae8a3cef435b1018da31f4fc593d1bf30cc626d49b4493ac8f4e8049628001f044fe9ce26e3a8ade88bd5283c5357c00324bec0c3984d18f662ca8cf77380b931c55a0cc5cc975ae19e4dc7621c836ba72b3862f7435b46a301cf53dd22fc1204f773df9690b6418c10dfdbc202c4a73da8adadbe9c00b7cffd40bec32b4ad4e70fdcedcf159a9855603176174f9a788754cf7a90a217bb70e90c79407c32f121d3c380c39d34998bc9f75548ca2e23cad8f7fa64273a0d21c83ff4470d20384ab53e1b4e04c6bb596c95e8e3061863268519c952a67c55d0ffd4a776004dafe6d75b48be477eb11984820696655cda5d5b0a35fd4808230da14bfc67666aaf44de97192570004b243ed5c87943ef050711fd3269b7df390758167f90277c4a6925ed95b63d5e894f1042482c615a4b49b68a4779db233c6b5f4a1786b511cc91b21dfc8d506566a3045bedf7de0790ad31ce49ff8850f8fcd7719b04c890e3c832fad91eeaf16b304dc56a35fbb7da24c192aebdbb6854df704442530168dd836cda519556109c3205124e0a2566cbcc356b29b999f58d2f83d689ca80567fd675495e64142bfe500585ccd006f5f0b37a582736d1951f87fc97926c678504a3c120d82963e80956ac685b4ae3b9c16253700844efcf70492964a797905eddbadfed870a39490df2fb41b6c1aae7bc879726f765398f158b7893577efb9640554d35ef5d4d0d2c6697e18656c4f2972766a64ca39d8ea7f873de91a82bfdaad8f99821ab881aab4326c3aef86f948e9cc9f223c0e18d5a108d65cb311a3a261b5ea06a0ff2a2b2b8658b752ac5d96baa8235e1a07a673a79820eb353073624bb7da6a7227c213fb0c3da51f1d2015abf3ca600a367635ddb904ceed4369b87a65412f5f3c9f6cb6595931e01515d01fd749d6d48e03cb02178d30c6656717d86476b3c747b7ccdca7fb1a0f2cdd961653a1f9516fa54f4174429d9fd9b353466ef1413b5d8614618d392da881065cc120d2d6966af6291f6770ef2a243ec97c73694bfac19a014759c5b6dbbf45dc21bb5d1eec5f3b8746f53f9224412997ffbcbe3082e6fd023d8064a88dbb199464ba5eb33b2f60326772cdf104a5188a0b164a036f5f3fc8ab1e8d14019537cfa3fd5d3d420e1fb8aeabe8a123bb092f9bd1ca8462c2cd9b00b11ec1934093a74c094e4f86fa1795125d2ebd9570fb7196030963d1b91787d61084d8e486150ac8c6e724899464b50be22d664f541dfe983149fb450424e62beb2ef138ed5233d8b5987cde37203155482f5bd16c68c29204b3e33cf8748a97054bc0160be961233655b11b49edc3beb86115c81bb2e9802c1032769a76bc2eb9f736efcf8e212a0f2f8954142cf086e716506a5854d0c8627e312490bc27e9100929a47719091e2e0a279b876923e1e339fc2c3c7af0aa864d312431f643b9b5605ebc6344213c3b13d0bd5c336853503d7704356b5a5890f0381e372c180e86a2d5ac814a5ac19a50c9a23029b8fbd34ec80440c6ab4d8258b3c1c739202dddf8d585b29b187f6b4ce8910fafa5a6cd558b84145ec63d2c80eeb68d046442a2d93d35e844c23d5244d99d264ab2c6d80d7f8302ae16905ac5a93260d9c6b5521d130917adbcaa883c068f6e64dc0af7cbd89d2a762309eaa025c94baef6dc5bb5f2a490dc7e4b2919e412c930b08f613289350c4053e4582ea79d5b7d2e34086d670a982b1f0aaf97be0e126de8965c2c70500af628778cd37de65bc125532177c78886a4d3a533a66376380b2f4eed778b65e6bd009c6377f0972d2b86aea947b754c8ab3be5cdda6524d5df71dc28e2ba230c9b0284750e5806450eb782a58e86aba2da446dbb51807d2f4bdb89a41c2077b3349a0a949ae5fd5ed4464aba7ca855bef53f02810b8137ebbedbfd815873a0a75ff811cac5c46fcbc0e3a2bedb65d583eff5657525d0f636db4b435ec0d7906bac067075c3dd55c1de8b351a0a7b42b4ccc9897eeb56ccb724a5320228f0a1f25c7122a5317e85edf05ca6e6423f6a7c8674e4c78609cb35ad41d2957a22328e6af3332c06c935bc06498835d8218768f9414e1a6f743226dbef8e3d78fa58b930990b50dadf9852936c899853f75a52e75ebdb31224b765b986b8801e97607a13bba229086daa1b5fae264a16ac9f2e9f9bc25343b9b35ae3983c97f89a481821a3051a3170b53e8cf9249a9c1a0bbbd101da5cda591c033604204222395b6f294ab90a884aa274b814dd1c1ae48606c74804dc59ce885522295aaff4512d3084cf02c9f12e423656fb81efcdf52c55416797a705d2f1b1e370e142073303e509764e95f35477d499d56b40dc59fba9d2471812a2e2931d3d39255f83d7c27529938b7c35de342006600514af6bda777c1136e261c1b51101055eca559c9e7a65b3bc52820249c721b00ffd5533b9a25adb83f4e23b808aec7cc2fa01a0b07acd0edc93b253e145edc9789c6834f3c2a79803b1ac45645f1d15ceb3539f60e7543999bc6e2e7950e38e04026731e300ef2b6efa91ea67527c4657c7cc299bae972e80931706782aca42267681acca41a5023de17f52963a9ab45b29bb51c9c58b064b8a80e00434e7291d05459bd0af3f5fee0200c17c9798128c9d97ec58ad3f1390ddbc1a4bc318a7c81406103639e31133e33dc8643256ab571dd858452581ad08d25c79ac5f0a6a54a860be0118829d87b14ad838323ad9760e0db91680adf55ef890cf053a2b2993ba4b4dab1223bc808f758183aa8daebc1202b204b55118e5cdb004f6ab3ec8f306527ef59ea0a1477de5e7d91f111e3339ae8abf212eebd3cd56c64538568f6009744fd2fab377ee50854314ec53659f44adb4bdfc8759e9be4e7593d142d1e2e971abb24baa56da1ec09399655f83a3f022a9a5e28927272fc099141921a819bcb70a0164fe8de2a2639ce3b5b1adcde900fc1316367c463034311663920e20ac275eea534d6e7c0cf9b0d225a1a09b6bd4300b502eedf8211506d5b9167a7976f486f374bc698e2b961ba043a62b7f536aec0d080ba67510077ea7b8f6cd585555b063e7a8526e23fbd36c8afe18bea869ea15a597749d50b5223589923ba6be0e6ec086576c34267b44befa27b4733edb37b8b686cad3efaf284df6b6e0016688f9f0cc6e48160d33db2fdc0e1a0d62a19bd681ffd2f53a7e3c36db306a5e04c9a3541b3e46a6021b975b92f5465bc767176be711cd09be540cad36efede24633cdf194369d457991d0daa57ab7b827d37de796d0dc7e7c33640cf5389a6874ea0a0e4024d70148ebded2e00e763a2007f1a8a50b1f32ac30e7f4edd3e00462ad1dd59d4641a160caec19aced3792839720456678d640b586fe0a54e26fd6446a3d98e6c91fc0dd40677bec04ca65f5e1262374d4919cfd5ec49d2125d06c169fa348fb0272645de60267c57e9750660e1fbda2f2508c94aac41879f27d9ec1126f647344a082fb28ff41672b54a9e1711da109322a0a4d40a37f08094fced5b6cf026f524ba8242a2c55e2c4f7224b7f9ab12a845facbe9f3cb5aceec0ad46c1f20c9cc177d9f108f7a1a7497312a2913a4cfdecd7aa90ac63586c217fbe084bf9184909c138e0d34e44bf782b3a1bd4ea75e05945da8404d0dc2a45b3b644341237f4385e5da940662257784f37344faf26027e02e64661efd94a8990e1fe6f93e2333a59cc69f2ee3a7b2fcb846a0cdac1a1b46e65a97e2be0e215f52b9325eccdc3da940280e700d09dd948a5c24731e2a924abbe95d51c9bf227291dea5d3d7b515b5e45605ddb5f2326d3bf35952f47bf5937ecb04c27940cdf01d4a737ed4b2419a323797265b148630a4c03e5145e37a8f17bb7406d8472d1debd5c99a8aa4278d27c46a885591dff8a89baef31319fb1e6e6cd2deb0b9e8659b0fd0e128c7c2e469e874fcbf8034af3f023dd0b8288604834f2b8b4dfb913b827c636a10970339414df97df99539089d16468144effe83c2deada7ed052b3ddf7ebe91c7080ea93eac2c376ba5f85aa3125cc7a9771890fbeb5976999df5f4e3feaed098e501a1ec0f19d4c0af262f77e60793e7d47990900ce5d22c63339e4febdc240c218c887c3c26fd9ff6c4930b967f4e3b488029f16b28280da5fd5bb81c683973f79fb06c8fc3c5e200acce4e2aab81a8e7ba909eb77bc33e9007758acbc2a6dcbb404d1a3ca05cd82bcadad1196377391b4d90664411cad309bc463af7f68745a2c24f683fbfae9e9d145b2ff1ea7322d84b55955f558ba19c56e3285f94dd81a0eb433f4aa877cfe8da4e6eb4f6e9e77ee45c318100affc37b4c4fb8bd54ca90c7acaa618a756151e22360e54fbef451f38132f22541fe0116f0a7f791e3c41d70a41240ca6ea7f1bd9ff0ebfeb3b976311744b12d1fbca5fbc252922761f48a6bbfbbeb7d8782eeb8fdf71272273e912a5ac098d07dc0f0b3d23eb289771f47adbcabfb9108039324f90b64a0553ed8079168482bfe99f3545e4d05e1dc5f1c22a52253023324b59deac3ff058a3e31115278e00b3b2bfffb0d53ebdf3c4a28870b9fd63b442c8031cd89d90a0d2cf76cb037a1deac99d75efc2f96bc332451256df30be07f4c5cac10b790e250472b4ade3823a4ee0c63034efa5b10ee0508284b7cfc2d2d7fbb1df10d93941552ec7e3429b79bf9aa941293262a11275eb22a95f472124237e266bd3ee11c81c646aa956fa704bfb3385a921706fcb6b139bcf312e0f465020c1d735a7cd6833e661ee83752ca6c81aa10e0e1f8ee842b916db99a7a1eee1b9a2ff53430ffdcfb097df25bf46e792884752ae8f8fbf887b6427ba117173ff62e10c4b4b8c85b8f1f173abc9acb89f22ae1e558d326925e92ff818f3f13cf7d70bfb8701bb3ea05dc63e7d44c1e75a854adbda6e836dde30d8aad80d078757762f55b22914907fde37c02d93f6c85614a5c6ba13608f46c08f0daa5d5db5c9b6562ed88da4377f8e918b12522a8752921bbbce06d974614aa837b603717450f19b1ce72449809f0d8925d14aedddcf3ec6bbe9abc2464f5b63b1b064ca660c984271600de0f499dd449955c087a8fd5fdea13ffeb8c1799fef56d426d17bed8bcdd8734c70a68ec616a4701164d959983f49141cec7a41d6968a6f9cd26f9bfe1875d38347a3c4cc0cd4efb8e119d63c0b1438d38de57b896680df65feb0094068fce554f741e449a871a4f86eed838ca486c32c36761e0b0005149aa8d4383ed8e8b8635a47b2ce4d0604bde3ca29e3e23aac4c4c7757924723c23429aec53d5238f607516ed62d3086a527889c56ea6aecb138fa0b9fa64a5f83825b8eca4a379acb1ade2386194803dc05681ff6aa397fdf9c0c646a666f252cd0bda0b8093c3dbb0d3e1cc8487ebf6ce10faad1c345abf88715437e50ac6e59ae3569ec6e9ad9d6f257cbcb02da5404e751be6e2b1f13ca2ca5c88c888f45d32fcf2522d0f607284151ae745540df86c081adce6305107893d96ae6e85af9c85674857794b47e4bc689358d7ff11590d178175a3b866bbece98649e865a735c191e3fa52b83ebb62a275b9902a093943da53f33bb0a6c39ed7e46d8f2a4abd66b676491119ee676456bd635f76ab184209adb6dc268c1b6708ceb4c8d79bf9574e56720da20da5d43e7238925b10bdd2ff0c2edadf0733355f139a94452f9aa789b3df7d454cfa5d31aa3288fcea1e8dfce527f81182fc77e3f52cb09332303a56ff89f5e832c9db9ab03fe8dda02dbecd5f723069e8aa07627afafe0bfa4e6a1909af3d1621f2193ea213dd88dd66a4b3cf459d12072836ba7fc8d704522ee7ed3cb1601ed54173c6e00e25eca7581b7c7cd7e17afd1b4ad36014cf4c3711fb349ee933e80ca75614201c1b890525ca2fa78e5d493a41a94ebd04a0dcd21318044ce650dbc7568914fa45e840c8cf8c801860f32f7e3430521533a07bf609eabeab99b01a4cb61cfd7b18db09e6c7bf9bb97b1d19686e253144a07de514b45af695cf0f4488f09ac138ce202bf0c1f0a5f5d57db717872992052216f98fd61c5910869ed36127d312e0d89b29772356074e450531440d415dd33dae8b1308ef1a73fe675e2bc1722c4409786f3c72ba63968c2da5b4bc868d0c3b7876ddc9c2b9542670706643125d6c560f7322ca1607b40e22840593bf02ab250f4cac7f769be025314b326b8992fa8550faa9cbc5035062c386f08ee4bab82b7eb13f9f3d9e4b31fa655b51f1d07444a820321f6b290e4cdf06f1728e206782af0c93de51c96198ea75244a77d828f3c0025b2c9f0fcc700c1e704193d8a9002c8567edebdb828780586bd4c29d142348bc33aedc3218bebfbc0524f2a566e87ada9872f0dea7060e0e404d9ccb32c29f4ce50ba44cbe70d1cb0cb763f65679c93b7a9b2292e17542fc028734eea7defd438a41101e413c5cfd7b1bb5b22f27813783976d3e507575b1c77499e0dc5a86e3a158f813f990b58adfa3d497b3de41dd13a1245be8e2952db660f511e513e10e7a62044d109e9fb5cc81a12e24f062c169a41face3110639c955c9374a130b1017c5542d5ebe9ef58a6964bc2c6958fb121fd534df230288ac1cfbf436f0694185475c4724ac04009588360f258e0b6ab67dd4950d15983919d7e33c1bc53dbfa7e59e1de258a5766f930c56f27dfb8bcd325807fc491205e5032de576593f9014c3dbf27d35912a63b27dc3b5fa3a78204df24194f0db9c84ba3fe5c62d9b4e35826a1898de814d5e8342658d8e1c889860f54c7fbb3470e720bbfda7a30f902cda0b52489d4e3f33a0bc7533fccb6e0cdaaffc0d6754858eea665233fea1ef3652c2d4e8d6560b516be7352e311f80803edb22e636f40382281334b90cd90af1da07e2cd4509bf0ac981d917b0373d393de87db9614eb786d00c71c52c8c53d77c3bc1ef8a9bde6fed6bb8a327c21623900c25e08760b05727cb03bcc6f0370e1701c27b5e8e6c96c46252057883605c58e473c1ab366cac6b8641d1949301033a36345c0ccbd29fba6e751c1b40d1819c282f9cabd3d25c9c95a662dd3ad4c73bab19eca7f1553642010f44227c23dc9600e62e76509b0564d9a2f851ac3e18c846986c7f1053089c4c5a2a2bcc29fc22cdda20ea47ecf3ad9d04d4815af97a96124a07ac128e0b25fdb6b6026f2d64321a7a8ce0c42be7c92c8c113a847b7d87b6b590bb9047252c400637d12ad8dfb5b8896acf86bed06957ae9aa53dc8d97a946769cc59f84e33fd417580ee9c4e8f55a8d3af754a985cfd4497af501a3b2874fe6af37a2d9cc880f1f94a80315c6cca3d16d7ef7781c5d8491946761f94c64e2ca4cb8a2fbdbb8880d238c97561348b7adaf839268fb9ebe1a635137ce08767d20e43e63ef63910c20a14bd5198070690f5d9f92ab6d9fc6583f04b313a370e98e7d6dd6d1a6712fff4f175085af614f5ced42e0457d4edc295c279b971d8522a50bf246f45102f0c6f171966bb31ab8503c6c181d6243f47e7f637d79ddb87f15fc9305d1d2b029aa66c58f0ad298b3b9d51382c1e45e3c42b821a92366cf4a46920726d30e035b998364f441ab0f404174f2afb845c8631cc99c32fe470cb260de33464c7293f60d86999de5bb6f4fa6760f14853d25f798759f88e4d0a9c3709565c54b87f05c38e0539fe399a62807d48cb73f7898bf56f21e120e9d2194a955e3b13f281bb1e1c6e5f15e4a8f87232271ae95725d181e078012660061a93394b40d24411e2b8c64c13bdce0e7a8d60487d7ff786bf19ab287da4887fe0426fffb37d3a5c0f29f589e8d25a691c4209597316c3f8e01a4383c6d6f1a196cd457157fece3a81acea6bb98e263c02293dfbaef49a9a5caea0bcafe146a08d7d5463e6d5940bbe20986b2cd83d9df32d9e2837ef2e0aa729f2001249daf924f8784a74dc2db955c81305a80f03506ec2dfea9fe8b928dbbc851980406c7c57482708d757551aa5279ad527f68231757688371af5482f90af33dae7f8a22048eed5dea5013cf3196a4a0a7bf9aeb103b1ac09c0df5f9879c81e8ce0a1c786a12840249864b1bb07e98bf3275a3a5471f708c461cce6e8299f4196f18e81e4bc4c81a9c140e8ff623031deecf037795cc5d86f719020c562875f6b3e53be2b1efc96574230c7ff0632e71b808897b9e4a4452fc4d739f65da69a233f08773483f82cdfd58d4e983d8efc57770eab510848b99fd3375115c8377e6fcf665353ffb0fae2ee1739a65c20a4438608d7a8a8691032daeaef82f628f68b3236f9d4036b61cedd569816b2311ef022683e2f0452393722bf43f026f592523a0cd056bda47dd70f0deb2511ad6e628ac666049ac384e6f7bd832e29a406cd56a67a3d407cf39231a8c45d39f8c56debae37446b720649c696612bc4522f446be4d4f9ed9f74aed7d882c29327ba70ef5e86e82acea22a0f7c3f3dc8c8891ad53be3d4e539316dfb9791d074604cac094c26103968eccb67d1e06ed947299bf55be1195a6cf5952843ea525d3fec49cb8b0fd44dba07ee0af7a8547067a39cd8cfa8c5b5dd11e5c2baa16989d22692f5fe728bf864e49a294b0d1a85eefc3661677d5b225f9eb1b94eb48d9de05198f1adc06e71b113860c30020d662c53b7697b39b15ca25545d4a60e5a9d87378c6f015e3d70a1ffa4e643c8e852dca007dc2c060250a0890cb0aa291f49e97bb74e59a0a3c42e4ce8884495cd6cf7a379012668db531155d3a84e706dbf33e5ed5221cdd1ec12be8c9a51e48451b3690a625eca7c55b77750d331df13ff7074542134bfc581d47a68d58d156e425edeaef011c65908aeb9af58d4fee7f717e29091376fe1a8fd3638cff02a8600d0feec95dc16a6f758df6ebf2454d3c72985a17174b868a218b168b52c36fe7f1f0a992483d886b4c9304de0231df356c6c9fa9a353acb455443b26833ca4f978428b6db0c0790f61abc5941c8dbe2a6394d3774dc6fe1d07388ef4b67fceefce2832cb5975305af0ea0e8dd3ad3836cd2385260d4aeb8211f349b52589bcc108656a6d3e337314c6f1e204ebf12e0adacce0d707387d6beeb4e3855810567a395d30c1791af92b49322f9c1c9d3ce1365b689b3e250f2fa6667d11600847515333abfa1238e956af046a9b85d11f575614451d055ce012714c7ca7a1e575d23d30cdfb4e7d67a60fc8c85552c7d64325dd048e0180fbdf50661e43f0eddc124db337f13b252e49545f1bac18480209614d3b10839766e0df6b60f15831e0049bfc3b1e6a4f87a36c0c224a95e1599c9c1b2ed91ccba5e0505e953c867eb098c57f2613d1fb594a85e08ad41fbdcc9fd39bb7fdbac31336680e914aaad7c79fff90b573c648ef282539fcd275d1d0f1927089062fd11e122da96f6bf6458ccf2f5424af20ee6164cf960a03e775313a29b02277a94571aab5bc01ca1cc62c88394e6c032ae8cf5e8cbe856a3d92088d50f45ce4e1f0c02305f14d2b59ce3387271ac28a03a49da1af1fbb4ce90c30b45ed85da61db1679c83a26df00c9491b683e184411b0d8b1a7ce1d859f1bf4673cd61575d4a75957e873d3a057561b3212a51bbc30aefa5933b9b36572e2ff66e30e007b92e9bb1ae93f4cd7f53c9035d454262a42051e8c031fed6c6a64ab599b5b233a29573efdf44eda844906c97b3e42a1c4dadf669c95b3be739ec938813ed183e902143eb66d39d3eb470acc4bfb12a607b626ce65356cc2a8f5fcaa382bbe1501fecb084bf3411a0b5e5b1768e47352155746bc21c360b356164b29e5e8ab61894fb39d02a63d53edfa05952c110ce3b18a6ba1d21efb41e62ccab407df86919fbddb939ebcacdc9e1ccb6dd520256f8f9075661e3b086c55550a168618c7527524e9375eb90283e40dd33b41512a6a49f4f8128286a558025eafaabb817f8361f73c3cab45d99cec08cbfd4384f08a7a9ed8356fb9a539b4081789935cf1cfe5eb2a84de36a0158c1333ba465fd4e0ec2dd0afe1b9d20c329d4188f072b58c546598730d2fc734003dac1d1426be39dc1b98fa113b87fde7ed24037166a116de0fb050b71b42d764e66ca6b85f94ac8b3e866f1c0a82e5292793d8ad4f5495997f5a12cb3d25ec6fb4e264f6629156117ad6fd81023c175a40c12e22927ef303d9dcb94d9dbeba388b3fa84e7d7a04ccad28b6a250f656cf4484967271544b2bf0c80a0a244c75b216224306f06a7a121ab2436d472483be67b460e466eb680aba05aada28099d431d776bac0ee22ba6f66ca14627ee6ecd22c6f3fc2d227f0374b59617d01d5ee7a72ba0cfa82190b03896319fba673822286145dae33bf6c82820b557ba0ca348362c28670ec28dbad559bee89013a9797816646618c72c142433f992e1ea091474fb34613d09e0bcf55566861f17ba4d16f020c1739b393afe71887c8b728e71124e88c1694cfbb046f339ee0b349327dae9cb8f694144fc0986bde1aadd92679c967f51b0a0403eca694f8c414ffc0afa88a3aab1b2a32a132297f427d3a8411fd0614c1d3a4781b2b583f4beec088205a1a6c8374fb4f637bc8702dbbe4d6a065aa9dcd5bb1b3fbe500519be8dd1fa9876d72ab0ca5f287a8cee695e89364b9a24ea883081ccd0709ff4646e61102b07412a241824fdc681c9998fe74085db512e1d4084a5d029fe025bf994c1d5873e1ebfd3677367c801b6761bc8161e3d3becafe0f435367da1483333bb803f67485b3496e0ac71c44455a51d85f54601715bacf95c9ed71aaf36b5ddd45c95e86dacddb9f41597d3d36f3cf6dc42a2c1001e33d06e9b8e3ac623dfe2ade676cccdc68f0928a36519716f2b694d26c7f14d149cb7453db35480439a2a53bea4a21318532edab20f52b9e13edca8398a620470fb8e3c9c5bd737bc5098926738c3250d89f984f0088ac6c4ce61c657c94594efdae3b6a3c8ac02b60eff847ed8c4ec99fe2a927e65605f05b5496237952a1d81960690789ec7de7ccc07d19f136a34a055245df5ddee97650d898f2ab3c2e9ce8bd38355c9439ecaa66e7ba35d0ce846b171081b74f78c73f3f0dc6f13063a3aca4581189601a127c733865d7089905a183210f771c1aa8fe804038057598e448da810400576dc75c140f40fcc7075442b511e78fc4b6afcf297d7b08e0f9d3f1a3faf3931315817a3742af5a8abf78218a4617ba9f8ad7303ba82051c055e9ea77aede02703c94f8d8fe8bb67586126f0795364ce4b77ad6decf390329c712d2f3117f5f59eda354dfacdaafd7369ca9a5ef054614e7f19589d4dc8a77f153f1d521f77e6cb251eacb7830ec7f374e9bd2736f8568be36591417d82b6ed1de3b6bd3ed8f8e247e191a3b9dd6dd32e30335e908dcc33ea34f193947a4b0da279e6dfcc0b74a1462783e4e602aba55da0f3c1ced86c8f20b1fd952647f12acf0b72806e32d40f8746c9cf9cc582c5ddf48955a803887328708e6096a43f55e44b0081b54dd9ceff58fbb74b334eee9ec601e0dd5871363e9554edcf73f5ea05f03dac65c8c051d2d65a28ba9e3b39453910682f0796fee3c691f63b6ba3587696c8c4936ed7583d9ba878b5fab4806027373e69d35dd1c3d6d986d54968ba10d2f2af6208c8279b9b0b0df1d9868ea9869f327fb598066d9d3da49a9933e45c2354466373f03ca77343ae403bb68676968f9f223ae5d93731b6d0d05441ddb6342facb349d2d077b1c362d45d66354b1c3a6b8fb02a8642a591d7719842e5659960a9e2c24ad468f627cee9054402e537ec49830bed83868e09593ea34160d285a275cbb9dd80e7b56fc936f517dc8f19274767314b390bec440c925fa0ddbe2ea143871a8c8b7b2c971d2e438ece11cd3c9515b23e2a7a8b7f24a42d7d875ae8c7a3ed17047c702284e45436ef181890e440e6b46a952f400715c5699915f5994a37f15e65abc20ad2a0ff46cefc06aa95e2154d8a322cf4f156ab47b6b9e850f7c3a16b38095d705fdb2056bf8e49e0d1dc2f5c7df9b1616120fed21d032c5a945449e9af294ff1426db42d2e7939545cdd1dec56d86129a82f0cd7e08c97e76b87b044abb3e8e9933e69fc39e603de0d1a0f135a693d6df900aa188fc1648823b5efe00c41241a26204c9be3639d2830eac732445043f533887c7971798b9acdfffd5a77cd8994d6efbeb0d31698df85d1226076e1b115839cbc927b2d77d4ff6cf9f5bcc37427dbaf5adba3d89a516ebd0afe09384187171672c2886b571caf8fae8cf18000d75a984835c037cbec110d00ca5f0587394bb24d3780f1a618052ac29ae132e6367031bfa7facf22e1019f78a8d4a80ca043f0ed2a0a62e5444dd6f184ca4adc81d8f5f369bf2c2785465149f0b8614c9099de1d879ae487c677c775546e5b337d5eff3cd8caba598c3a2be9be8e8b7d479f6138de94d5394473038601b601be8dcdeba3f6419dc2ea19fb522319b519404761a12ea8b447ec83e6fce0a17b5d1213314ede26217c59db0650fdb1593ea61cd6c39da15ad9275d977a7e8a26566b08f47255d24a59cd3dd0fec2857cf5d6e510660033177dd40e5f124ef849c137467191ea0e8bc60b308087f634eff261d9c0c198be68f26c5c1073e05bfb926d91e8c54b2b2f88587ff85debbfeb66955e115c9b1972bab2e0c27eebba0de07fcc31c565542274602051b7a63270a3a95579a3e3fcc0e9b3fdc7742ec3ffd6e903b0ae269565e465decf7cc509e862382cd224b596d4fd99138f9d542e41940a9f77a83192b5ae9a98fd8b1ecbf97872a4feac4167fcc2fddb85b835e2de05255d1d4333ccad2802214bf66544847e5e511f8a5c336458656aabee41c555d78b5559076311a16ab4d9408950bc106964909e485b5f56313c55a036f1294d6163fc7a113df7aef7fd5335bc058901c63995844ff3eb1d19173861aff782edb57f710960dfdea85e36739e3ed577340f57ae22f63cfc52e765455eee96bed8db70b5f0086d1f4e98aefe6a34b39c914eedb597ff65244ed01bc5ce137330655262452a9bec8fd7cb2482069e950e0c1d977c23c4ff52bb6edc593399333f47774e3129281829878991ab8d273e3bf74e63d64d18b1e8572975b29e08f30d3aa39ef8b457c10e277110894895934f5210856312f65e0d2b524365934d1f8c93d64ef16f260cc1d6bb9588fb38fe8222db84b12e167bb39d3b8f0680e74bfd64d87afa5136857b19a3db7889445ebd9107b81b1118016f3f6ce905c2646bdd9c2cd656f95c92d5119d0c04e09b4baf568257726e07536363ae198a6d85af0475adeb20190512321cf9a2194754784334ae420ece1ce21b42240f5945dd8311d3d0b15c6ca06e0064eb5d6b9ceecb1ab2d93a8e367b733362e31f7a51eb99ba024d00dd63385038499a5691653e2f3b7e61ced6c8356b3511617cb6a34686051140d139c98dff7aa8ed4b3fc8e5e194d300bb0a0195b7ab61e154b742af6e2f31eff3e383e104e2ecc6f54278bc8b37c1218c65b56c07c620f3ff6c352b52de3c396e4acbdb814f663ccf11417fd94ab7b9b6e8153039dceb56ad850caaf99efcaa1936234a2654f37de936a8ba62df22f10a8ecdb54db27536c4a3f55cbdd35ff282b1d7c385b4db36349fe66bca7cb9108ec7e602260a9c63c87f42213cde4f532466cae048fb6c06d5a8e3d6fc6585d47970a5b937549bbbffee5a77498c029a36e37de83a6c2189a0bc2c23f43187a71da475a854c9461a2beac4f228148b9220209d9b4e4f556d69ece8e69f1d331531414fba3c5bd11a4cc5eef7669a4ff8b5bebd545c55b44f5e1ffc5de951cc5d3cc14ea1acb355f538561dde127a5188c12fa7c65ad109a1130d8925d09f0f81e33ce0e83d184b51fec7dcbefd7767a500fb47c3d0023ebf3b1e36a2b96000446ad4ae48eb33e7bbb9c49886d0739587853d0a91548220ee032eb6185c325a215ab2b84edcffe46f280e199417d9baee47b55d49752f0b4574f4f53a5332b27d9198211fef8b1967901d65de7e468f98d7fc6580fb82024e189b220af85d2066fcba3513fef00b8b067c690147dae67b786f58fc25c400c5d1c0c2520ddda91185d7c33a39febbb984169c5e8c1b836a9846f991e42172614e832532087a8493970261602b19ca521c145933413c0dbc99b6e74b5dca38e46ded63226814ec815c795056ae2572c2d06cc143aafaecc6dea3dac84ba1c793101744b0e5ad59bec14c7f58dc44ad8bc197cb477f2a682e311d9c355b2eea3bcfb0f33ac5b87767908f31d208aa96f76e28ac7bf7576306560fbe1508b5d62eaa2b99dd97145aed65b0b6b8cfa37fbc9dc34a4d020243628f7747ea5b0fa85c936b44918aeac077a8f6b392a88eef88f0fb960ee0a4e0ff9a68182c67f5f2fcc7c45cf054735f1691380fb3f8ff6ce65db1313781a20cc5ca475eaad2401ef343c90888ff0297641dd82dd35aa1b25475d4c48e4263a34ffb9c2595555f4e795e9c2e8c74660af84e6e8f669256b40f9f8721f50875ad014880f325a03964cfd99b6225982bf96eb51160470d04ae65f51c9c036333f1440b06e7d3da0a96a65472e68fae3c94d411d2df3d047accadb6a2b237b15a6f6da859fb8083f32ea2283c95541fb82e139ce43c07febdba8637411969c264b124a67cecc0474f927fe8224c2d5bcc1b28a93ac0d6c251341a3d53572a1dfeeccc4a69c483bac847f27a0d67ebaaeaad3db0a3fa1ce6374713c80120a645ac77d157e7f9dfd16a1c27870094a4574e81c6aaadc196e31c5ec494eb452d45ecc9d34e6f7bfda3414acea42c04026266b269a6f17ae0926f8af06910edf73162d99e9502fd81064d5bd318a5567a2b10389d3eb69ed907eb6edbc71d8106b3ddeb9eb67c147bc0b77d3b24bed39f9f384b7a9b2ca607f23e0fd49a791b11f3c83c7da97c9092704b3255a5f73420e461446dd44917a95d45b54702b1547791f2834eaab4902ed2cca159b78c391c141c657e1ad70a84bca15a31eb4c052d9eab2f5ff0f336d1fd58ba903b0a5eba9ff03e90845319258830f6362ca0e0d68eb2118c9ac8dabd3f8666bea29d8d501a58758406c727189db3cb418f343532ce1604e486d5593e91e7b6b7cecdfea00514a72f3bf23e1578c73c405471735e9da9c697b56a8eea6f239586a19c7090939e4abf0ac9d52126241cf6ab2a3c230886cfac5f0479893a2201c2e427b2290fc11a08190f057078d4bbbde9e246f20148c753facf197250a51cc3b133d369f2587fba9fac4c84b0cc802bbb95e62ddc0554f22ea4e12527a97820d2fced949cf6f7d051004456c562f18cb7e41b550648fc8715fc212c1f51b2764c4b285a12f8a6091c85353bb6ea1422b1c3b307c9a5fbec6c749c07413b37ff96d7a28aa67622f51b0dcd730ed68738b3810d6fb4c157762b1a6d403ba5d7095ef8086d0043920b4b68b836aa8582809d1767e2d6ac6e92db5aae7c32dde51ec476170c424ceacffce30570034dc10185af1d6ed7446bab546ce4be2cc0ca6a570df373383fbf843847403ba9e87c29a0667e74296be61a12802eb12ea5a4f502bf5b3310415a93ec7efc0a277b061454626d6d4174cd5273cdbbc67eb74f53a601f535370f605d601bb8e106813b65a7a2cb3a058e261e485c3fb47c217c7c50f7fd94039cdabd943bb10a08286a2182fb3a08168c694b461b1c58b2537acbc2643d6f4e8026cc5fb073361e3d8062abb9eb9c22541336df217122a5254375742e30230d60892a05130c0c789875b3ea182e054fe415e9769f45a55a06b807fdaa382c73eea2aac55e9e128ea7282a5b06ea867c3d446313910182baa8671d89c9f6364e93f64427f88e6e297ef25ca15306040974086cca602a7942f6105493afe943b32c72ad2a87899e10e23a3f7d60f41f7588f38ab6122ac5dcb154bca32add1e340129fe0fca8a022676b6fbdffc6a20ebb43c7b1938215b14af31c1e5c671754bd2f0700588837d87a1404aa53400f5745f0bf15d03cbc46bd56e20bdd3d16f78252ce53e5e2ba339155ce81170842585665747f587abe8d0a97c72041bc4d93b4ed7304e5f64dcdcd960be4311b95f6c1a44378548f156a6d4770ce2d04f7d56b6edf8b007adae472212e9d2029d88cb617683b953164c1ae31126bcd3d9dd7668579824a30b8a431510f035d4d65151224c83ef63c5b9bf494fd762e401c95c490f4ac3687bd09f6b2b50bdc7938238edaafa729610f46c12c2d0020090780e3a955c00a74f76e9e991e5d5ae4828af7b124ea4c4817639e77251fe5765ae584e674b1ae12f7e83147a69c61c659ac6abe1a520d3bc6509674e147cd7b965bd7eba2a11366c1531301dd019ad87bc51d39ce7154c3f94629c9abc174fbbb6aba6b0098fa1ac8d1139044a87da492cc7f7e381fb0369824568bf3af57f89ae743c4c91abd5916bd25863c47b7f21d0617117cfc115c00eca01ec8b6f6028cabb5f715adfbab26e89042a500b24358c603f1e4a1c4e4e20598c8c3eeffea8bd0f8d62c891ba7740b8bf7e4476764ab973ce66b0c32be241f48f27a95bca3d1527ce142d8878c0bcd6442119f1cc7b3b6057cc9c125defb2b747a39f0c7194ddc5f03890adc82c6e913333a0adf1a9d0d283aec91c746b2af76137bb740661b22e159ec59ffe7b667ae719be7062de8a06223060dd3b554500835a07a16ce4a478e5380c88e28cc0ad2774a085d6c884a6433322004663a221d1d861e4d1c84e546feb62342d660dd0d4c4597b08aa9140850dedd9461e8e49f6c5d6072ed137e26a88de4ceb5e35e034c8c3e30b91b578c4d47e87c690452385a7c1453c21f2d011680d6ef5f37ca91b1791f2e9cd0563a4a6c8531ac784268cd741c326e47b71e47f30b0c0412209442c6fd84dc7165428ee30d5246c17c8ffaf2efe1f9a0df552bb3ae95abcce6cecb784c4e81cac7715c9d4ec3b2e8565b9b20899440f42bb95798d4a70408c8c5bedb918317eb03402b5ba35e5163a28e9985feb71115a1003ef1069394228d14d70618a649ed120b08fdb4fa9649de556c2c2c4941e232806fef7ad0151d0c9fa0c6074927550a21ea10cdb44401ac400211d98ddebe7ff5617c334227183a9c2a5dda03fb4c4fc4b21a05aeb038ffa028cd11d380681968063c223f82fac6399199a7fb072fa41d0db12ee99dc9f1723eb4b61a0867eecb1d4bc3d589536ea2aeb548a242fca8d912e2a8443f06279a806df39f4755109e3513a72e8b0d1c22d8b76d426bec434d0bdc284958f9eeff0c45d1b9136eb28a1b789dbb3aab5550fad0a68c27b98845709283673f1462dbbbae324830b6e4db38d8f916c50b1d697630dc6af4298e26b025ef88c56b2caa806c5c8256609f8ace0e07f18e35a36dabc53a006033628d278deb58946b28a54c1b90e61e12781169c27fc6348ca74b074c814e868e73218b702d6784776ad663c3dbb777ceebff3724f6e95077703e30ffc479c22cf0f297fe3c5bbfe285a99741dceb72f62ed926c541edbf1dcf674ceebb011d6357fe29a034d6e456f92e99c5de59d66aa319234ab2023c404c7f3c5b82617866fd2be8da834051404b9feb5bf95b81c8caaf552673f41c6206170b61eb69cfc8453d6cb7360734486c2621f17257ea4cb72b0552d8067eaa35ace7cf0160d8874191b8c5deae470e5f33fded98e5c017ec817ed36aa7545ef1e5739517303fb9628b87136b9e602df81860716582e1421d27a3fea94285a4bcec9e841a8d9513cf7d181b8fa71c032aebc82e58be3b24da3df573ab31024d4e0cddf8c870514844615218af1a4dab2873189b77c6eefefb4faf83821b2e19763b51ceb03709a4b94c1a715ba7c0655fb8b5f0eeffbc0edf59a39290c64cdb4339add5d0dfee39441acab5d82162cd8c2b44aa2f7f1d61cd056ea1dd12e2a14edceb1cc2cb0a01ba49304abdf02a3f0ef091a2d55119a12c46c30b9940efe6565a360746216793668c042e961d8d18e211ef190a766b6fbbd3e34f28bf5ac457b427d82e2e06a2ca7ef202877b032c528c0b072fccf9d47814003c17f11a6fb605dee1223bb9326a424b46c20e2941ee3e5fb0229f0d2adb1d7cd5fed0d1ef517f13f14aa8fc0a5eada639b41ed11ece506ec7f2cdc1f01bb5043b6d848e1c6d4ab90263666e115017eef34dd2e9a5f2220e6eeaf6e0e036c85fabbfa1cd7f2b0dfd20e2ffad06ff38f5e18905e9a540cf95316aa69e4ead59ce9268f19647b053ea9d8c70d184aff7a2991af53d80f6bd9c7d9ee5a808a2ff07eb06d4a387cd4f376b08c24fb0b78c2e2494e3d095ced0ed552a423eed35e66c10f74cf2659d132cbfe09538b4c4b6085bc56c1318a5500a9efbe89defe6b4618700cbbba96f5884adf51323f104b44adbe39ba9974028d472aa8962a9a47fa410cd7157537c11676105838f61347d1ae518ac7a431f110bd28860026de997fd5c626b56169df06396ea86958ed4fa30c56ee7656c88d98ad541355e1c485aca0334ac833f0f37784ea596aeefa58568518423fc3de9fd6fad2b7e8e1efd1bc89278ab3ccb122013653467dca6dc9ef4a5e43b3e0f4618b5f745aa18e9f162e4e4ef62d14c27fc7f443725f9ae00d15f91c11a3860f7219471fda33c12adc0447ded50662ee53c57a631c2312f9095de63692cae441024a4cef2414376b623e783cd30b5a63308f6dce5c6991303099a52ca5a4d2e0f2c46cea1063b9466d80b408bb873685e0e77961788952492473c227fbcf777fe9173a4e9366c272d256848588ff12aad3fff64ca50e45d5053d4c60227cc5f4d672792d6e8d7379da051484b83937b820f44e704fa4efaf2a023d4e1d679b82633203e1c9679cae0ffaf3509203b6b4e248937c0868caee391828de0b7f7091781eee4785310df7ebe6c2507b3a3731768cdb147a91dcdfeb0d77ed77f349e99a0c619513f2cc13315052d2b90abd9c8127910a0676f6dc736ca437c3b5af3142d8ce3f7f121ba186fbc56c62129ea81992b23f20dee7cf3e60e9630b9f2eb24abe2a6323262a7186528a288e241034121479328e684fa4176a27e7d873676f66ce466938e0737e166a776f230527ecbcbb825dc69f29d124e39b3b1f14b587b4dcb20c6d354f2c60b06901a5daac173192c0ba1cfa3dda8d5480688dd16e1355eb059287628aa8dcfd8fd0ec831905a91eda0643ba535c519e83a1471643c422ac1088f79b40d653c5d4aa22e0c447eeaa104021abe62ecea694560dae4e4d2027ccdd510a79e375a0c444bfcf05ae68c3efd6452921190a7fb9c695b60c6104bc61bdfb08fe9af0039c5af9265695f1697cf5028b3d12f23a65dcebd13dfb3a9b81744490ba163b139ff8794f83decdb357decf40130c8050edf5750c8a4100f3630e9b3a88138c41352ee4cb4d1a15525354fb4ce377443beacc7b0a1d510af29a6a856f30a5253356cccc0e2ee9fd685e37acf04d003f572082ad8e53329caa832bc047c02f8c2cf841b6ae3b95034a41ee468c6b1fea845b25079ea0b72581e70d7b2ca25d8b4e2783696e7faae82428e2b531cf69457f189b390df400cd1dffb7fad403854a1235198c26f2e9673b2c6b9906fbe38642b7d21b6ed8d48c38dfd9df5a6630b5c83e6485691783363bda965d9eed71707407079d34cf4466e6520911d91a0af3f99ce1e9568052985cf16733976662539c65eb4671a2f9850bb9cd6bb81c19542c60c60a38f929dce2e48a364283b876201d91106305502e9e02cc73d2114f7c4ae475f793887a01c3f54f27baf09e5353128b11c4681da57a4c09071104446ce84bbbe4298dea19a8fcb28a17e1ab3954498c80b4959aeb2e9c2e442e4636e4eb141cd50f95dee9a020845d3856a028efd1034f2b8c06e8ebdae92c62abbecba908d1ed0cd0d4b5de5993563e28a77859e8a2e5f99dfd4bc64f7a4c9dd5fab8dbd865bc549ea04a21807b19af9cff45ef11599b5be4fc99ab4a5458bdf62babe710dfa7f8d07acf3b54508b8278cec39fc7d3500bca0f5357a51881014d5dc9ce1d55e2fd2625ef195c9d10c0997a5a9e5003fbd6cc681577c55333b91de98f761bcc4f5fef12a2548008c4d956344b1f59b15e02aa8d6ea55772e916d47a016b804be5c3fa8e9bd37d75cd80316db53468cd1b02c613bd4c85289357667bfb2a77060bddc0087192afc13cbadf4a76e725392b3c809bd9a4922cbfbcd5b494945a2ee68b31659a62a3d48a195111ac4868e7039f075cbe77275a566aee028e73fa007a4f56cccf5dfac577c4a84076e884a56ec18155c3dc8e57395504160e2cbd86d27763709d7084d181bfbe2765c9451d64bc7c10fabb8a1e326c542bcbb1903ccedb39c63d0355fd10ea173e939d2989c2d0c45c23562d6e59ace68a70132ae1d9ae499c328a964c28837565c4551e1480942ee989dc1c11ea57c2cbb528309d74b93e689cf42e3b1ed40cc14f3f38b1cad0972105b32bc0ffff0cd52e3b5bee5c24a0cdd852f81eebf22f0de6d9b80fea8bf9d19528a7d6f9719810cc5bd1d5765aa9e57e87c34621ec33d42976310943ec4b2c4a666233e12d8836373431c8eafbe91a365c4420cfd822e45fcc39ce0b11484807d58780c5822c307c0302a2540daed86602d82f0938d45a6bc4f019aba492861cefa1c247b412d49c9048190309673d1036719ba1211d9ab2aa11c72d9525f9046cae48804c5ee7b8d6a2ed82bb77c657a1af2476b08fd67c9b66c28eb6fafa076a5b29299559d2ba8716b19f661367af23556a11788e90bd448456c84be1f8990f5d1a3ae9615e7c632bfb78342a06f59ebaf622e38f393e6d24429e18dabc156dea0c86ad716cd58cd0d22f2517917b5c419344ed24855668b9fea9e23ae89dc2aa2e6d2d09167b3caf989098bd1fa49b057700ccae3d783f9619eea3534d23cdaef486d14017017d3dda2794af736d869c2f34b9a1e6833209ed0b28ea4aaa802fc3c6d26f6a082b1604abe694b151474cbb15fb5a7a2074e3fad35bdcc8e3d9f0521596d4309f3082a8ce82c858fb6f9c11526a369ccfa266165ce1d026a1d8be0aab1bd452530b9de3fa7ca8e22e58b672c4bca72b04a1c75ce317cadb7b29a083002a73570828c84aefd424b8160bfa5a564de306547a21454d1ff46869208335d1f499aaa400d926b98628e134d6f97c6fee5246a5c3f261f613d33c4d4f05df4aed6275c9cf2bffccb8689d49c173d145ab3274dba315cd0c98a5e36d09afb29fafc54b07fa9a61f2f010d77fcf945da7e737895c15f595b848177316c13ff6ae1c3980b929ada4eb81a6f54808b0a691f4c239d5b510e27245c56470ad39e7596ee402d0d1d8265ddf894c9052521cc17920e6d858836a27fbd3d8a55725a4075b5fa8e64e5f5a1621ecb0b6da8feacbe0125df55d8e3547c366a83c0bf681d8d0f3284d834cc09fedcb2b3231cb644b037fb018c11c2a6558bf67e99b6f74763fe070981c88eb7eb096e7e834a81cfb90570c478482b4e9770d14891a30d494ef260c3f51707c7ed300d7212b78da16ab956fb9e1357fe8bb89435db63f42957ff05e40dcb691cc2e6a079cf50bbcfb89c812b5dd172bd8ae02dbc2bd108da4a1c62681b17a0780b33543b1a013b0e3f2626b08c6035bd5ab442284111a8899fd4f8c58bfb629cdc7d3862a681658703e5f43baeab754416123e79fe5065e0b592c44cefbbbf94c742ad13482e95e594268cc3726b00874f1b0f1a7eb63182c77b5d9658b36b14eae2827c7ed2de5ec21b42dfd9885bc08cd98a667ef6fd5f16a59ec829a23973c8dcca04cad40bdbff90e1a5d3ff2b9d8302b2adf318cefb1e9d5d947a04ff321ac835848a3bc299f042e82515698356e1fd57aa9a51f0caf04d01fe1bee01c61dd369ff3c482233648224bff9524d6d33df8157a0ef9a7bc39cb55b538d6b4120965d209d3eb542a0f6a7d4b4f347735d74c471eb99ae2ebfc347d595ddfba0b98df35ce39f8215e0f3eb0ca3601f929808a90a43c9c255bc0d5fe3c3269cb8cee7ea7c675a697869bc4d4ac048753f7c3eeaed6085c82715905115224678baee9c39de99a0fa62f5ab3adec262ed32bef06b26c30190bd8ac68bab2619e976f4402db2888b63178608d438fcf51e4c9f3f7d2bf211b7c53499fe22e9567b81646c984a682d24a565cfa882071bf4c19e9d907c77db57e5b3f351ba6e602a87d03c8578e75d022243b14d50b3765cf920da0326c542b082c03ada40b172237ac14ea05fcf91e9abdf3bc7a9158234b41d839653ba8d2048cc457f822cebbda45124c7cf9c00e162d117f4d8d6e9190e89fe4f2b9750243bba4af66c24ac6c72f02f12c07348fc99f88e4e409ec94ad42db8112f84a241e77c3f4ba655712fd8c5f7b0cd1d5b7a45b5a2e5a490d1088202298163b4e6963cc2a3ce420c5a2c2dd6329c24ad7074fe2c176aafc1e3ddd48146c3d432d40de45c1c8e9a3ab376f42fbf2e7bc516b7c9a55e54f5f75be5677508bdc3402db1ae00f235227c17ab536cd239c8ed354d0a2dcba4f8f4f9fd7010493a6db5534f5441ec3a9a49cad89e682553ec00be925236d81db80ab060da24aa6d0cb7a22b9c50d3802ed15be8d3f2b6542b87dc752e4964d4998de3dcdc95c00479f03542d3e15b276fa36101282d85fef76096aa9d662de5b1edb568861daf33ff41ada7ae7761b37bd4089140f1acb13b71a1523df4acc2050dc379317d2b96c20ee2e4bd005b6bd615d079d19de0053eeeaac643baccc0accc147f85368c3f45bb8a7023517571c9f666c7c8f7066d63426ee5408b80a95a169505d49d93013220dd18eb56f25ed121f59a50329c64043bf2085759cba1fb65722163468cd90c648cd695e6207915730b5499e4ebb1b37fd779d90fc0ffa05bb0044763199a06601e25dd9b3e9084b733ff78e2910b788fe56d7e4be1c73a859ad0411938f1143e6857f1e249a37061d68cbea2f323af6bcd4b774aad346715aad414376dd22b68227f4b9f25da29038a5ab4b35007f37bd81c15118e3d082b50d53119786afa15a3153255bacd6af860bbf940906e1140ca8234001645c034a50267359309c55a5038d3c5fa222d40987dbf50913abed0841f29446750a566eeaadbfa7ea238f5d3831089170b6418d701004910d868d701b7f4f58c3d425bdb7fef4d347cdbc5b06e4d25b908d408d104224d97b6fb2a59452a69464bc06e106420724894d38992117f921b79603763396d7470cc6947689ff22840edd6a0f210d7cfaf3bb0c52ed55ed9259fa9166b6e369a9d31f494d46eedc2bca0b21fc3ba1635eb790c5ac08a4ef498f550ef5e8570ed53a99633d1a8d6c9aa3d12229c68edf4d22bd0fae81fdec6c48b6ebab4d0deb38314bd3afbdfc0e93764ac99fc998f5dcceb1ef71e5cba27d5dc6733b1bef6cfe6dba01f1b18fe9965c97ed5c97d26236d3e5b434f1b197dfd56418bb0ef131395d4ed8f215d8006dd664f04eabd29edf5bc75f204f66752e94f165a6c33564b623e5ce4e863d299e3e7e57f31d8c59fceea153fec9421f18e5679abc1af76ec72bb97865d4302b9d8b7109e48149b44bf41ec8e32fd0272b712a4b2ab7ee9cf427cfe93fa9d53219adcdbc5afc66cdd2c49f9a6466d6b9dc1c65f7f8f80b85f033f9f3f27736f36abf699f516d56ee419bc93af34732a318638c31f3c136480a4b8ca2849f9bddd3cbd7b905b8ef481641f74816432ec6449a1cd5eb25db5e7257c6452efe88e3df4adaf618e6a3d1c8a69da3a1f24d2fe7bb7c9fa393e9a76cd49f2c6ab6c9f44ee34fbf6dd776e2dcf4905bc7e3f6b3fd1897ddf6364d63fa1eb7b9ceefe831ac93cf45b7b3694da6e33beafa9a9e37cca6ad4d5fd95dd36e69e49bbe6d67e3b6db74906f327d73fe94ed66bb1c246b3cc8f9dcb73b9bee98a86a364edf96a6dff4a453eddf4cbe83973b1bdf341bf269a6ed5893739ad80edeedb17ed476ba3f2ee6dc6bbfcd45f94c9b0edb30fffa8d931fe353ca9fff206f14eb6ab2c953beffb4ddf4c1353af97734b29db4dde8d9b28ddfcdd2581e75cfb6f12b5ffee4ac8afee8dbdf5f209cdf35355907ef68dbb1c14fb3d98e351eb2cbcfb23ddcacb6e2777eb3ed328073e7639647ffa02633bae2a5f2d24e0357fe06ae7c29ffd21cb03bfbeac13812b5842c7c8a96dc2417c67d47b4883e3009efe91f9675b8c6bbf16374bc83bd3fc36bd3ddb4367de773d4e2e70ae0be235af45c4c66acd960089fbf6cfeb27d6fdceb15dad564d9a576646bb20bbfabc9a06b3668e463b6e3182a4b6a4de6836b5c96663e7cf7cb43bc32eeb00fb6813f6be80419e974861eef7c520e4927c61184a387238841e897c34c2ba294b9371a5d1763178d5042d873f93b87b9fee959462f1963942d8830ca8f178d50621af52b492d528b94d32fd3b2679a26b3c4f5f49a17d534190c8e4654464aa3bb53888db4a22a5d687425b7c4f5d329fd4b93a17123e29ad7c5dc75a98cccd14b999b97729323b1989357724bf8478aa4be25fe822df1d6edaf3caf069e337c2147e0a3440742081fdba1cb44a624f51dc122e8a61a04d893d112bdb0e9558c9fe14073e2099ec1fb62a4e38e381befa27eab18ebf449f70c9ecbe8e39f6845c0e9637ac5e4e33f93ef7a858b7c6af794f4103719c7d15e618f01eca30d1b0cf42adef42a6e231d7f7927d68e84e013031182399b08d32b13c7d2d2abf818186287773328aa535aabb34e85dddd3a153ef6de0d2e98e6e229dac3b44b248d4630fe1d4b8b85e95551acdbc8f20fc74560f7df2ef29528d35ce42f71b35866b1778b3ddb8e455b0036ca8868322817b31ca457f19f9603ca75cb8cf1f38d81f42a7e092a74aded255451ee3b8205910b71b8b005cab83005c63fc07d05b8af06ad53b9ef01003290cd0229ca2c177d110b8c9b9aa8ddfbb9b143bf23582871e3eb88ef875911d52f08888f6220fe422b9da96a8b807092a8f58038ec275ec09e8c8e427805e12fd7c36725ef067ef8ac85f7d23dfc850b9b880b3b041736111ba383437a3c15bbc844af1c0e893dbee23cfc8dd0a7933e439c352512b5833ed2a721f4814a00e18153e014a924a8feef1941c1c714952ffda2314629b3f854be94111a8135057c341ad9eefad7fd75c137a5f5c8d9c4fbde6b2d30a614c21863b4d0a9cf688132deca7bfadebb9ebe17f9d13e5f81d51d1261517e37e79cb2abc9a0f580bbc7f7de83f0bd07df839c09de7b0fbef7de7bf0bdf7de7bef3df81e8431079b01c3485a4b6b692dada56da161416b655f684a6c8185d7ab27e1bf7b83c3c220e42294e9215a165a4b53426b694a645f645f6845d9175a165a11db1338c1094ec8ae10238cf1bd54139ad0842d60cc1c238430527ed90f4e428d1913baf7de93344229af18e57cefbdf84388be36cd26e01a42f0b589d8755d578c16c2499de5d684072184451fb7ac0ee1bd1763ac813a32c608a1bfd2bf4a218430c6d8a54ab54d25c64e995b51f9a14993791f21845a768ad155ba78427c42c4a8c4b226c15a6b94252f9512c00d3f4a6b8aff4877cbeecdb29396c5cd1fc6e8ee5dc55030144de6c5f85e15a5ecc4543aa1321413d4094a96d26452190a06237b314608638c30b40c86bf5b3725b901efc8164b5cefde0206b7bb572b3a25a7fa05b71f15b9149b4412b1077f7178192d7d75dbff11852c4e80840a44c861350b6e7fb51db5352c77d52bb642c66a46fbd8e28816c11648a06a95d147b628c1650984fd6b17c7febbebe96393d29fd4d2eb3bffd1e8aff7318e4de73aecdfe8ba14fb1127319bf56ac63bffe28af88b8e454a5ff7758dae6b74494ae5a4f4a76b32944a3929a553363fdf3a5e38e2a944119f5f54fe15f6e47bf21ad9ee1a8db0f7eee8d91df33eec7afa9099601be0536efea4d7755186ceed23864444315d0411918f1a940fa21f47802c2104b8b9e07bd5cda5527af51a658b4145b9fdef3a0a8459af1a087b32beb97e7ebdd9b7f86f45655a8ca8f051f735e73f9ebff8f0aeba14972686445023a3691411c5900d307ec8c96fc9bd20b05b72af05dac4396daf4c50fd9959f13108656cf85da368faae8c5ef5ffa6939ac1d2f26e4a5c5d4ba7a8abd50d6ab21fb8742ba05be342d77f6549119b6b46ab5771075dcd23024291e844923804843be69ddf6347b6e46172eb8086160d2d1a5a2b63a0a1756918b2e2c5ca92953154e112ba84ae2a2ea13bd2b9947055c13b3b3b3e762e17d1f1d1dddd3cb7bb8bc0828970134ce4721133c14d683c1a8fc6a315a1f15ced47dbd18ac022dbc97676b26ce76645329d97f9c06286ce0c9d193a333ec03644f9908b3374ee0c22337266b4667ca00afec37fd0f01fd78db0d0b80263bee0ec71258c7e052bee00ee3b5205255a0ede9caa9f896effb831edf0658cfb601b283716d37dfad3b7019f5a9ceb8e232d0d9cc81cc59b939952fa36dea5967770eee4baf98f732367e3175af6e14018f6b2d309aa9c4ef4742a3d0bd730f9d29b7c7c1a5cc38462258e7e89a3a512a5a5a7316ec2a9a89c4a4f836bbc5b7ad6644aa7120ba5414bf474a2416987c3a5ae0365aa4f839ee8a39ca45c46205009f7e924f8c69e2b59a2f51f2394e78f271fbf1b7d94291f553160d8aef4a7ef6a8ad5a1b2312c0cfb52d7eb48d9ef67311ca809d7997cfcf737d1373dca7629fa27ce26de93c95eafd9f43d7d8742ad76b234257bba5aae3cb136dd8d68d0e01a271d4e6c626dfa62d99768649106db10e324cdbfef1a4ded33ed5f74a0ec8fc996ec50ea66cfdc7c1d7ec9b8f2754829252f407b99fd831ce5b2ca92babea271e2a724625c02b9e04a3ac98df14a2ba56522269a2fa9b4d134fa877d499a4c26abbd69c524ad9b6c973dfc371a914a9c4a1715b3367e47a487b6441fde91a521d9d1fbd2b54373fd6834db763897a5a1d49aa4644ec61823954f29757901d48d9686fee86f887ce0fc9c724ed33391c9fa60661f44edc2d30733d1641d1f443ca70f78a58ff9a3bfaef7c76c87bab4fa8a937ca8bfd9ead7d315965c975d4a69579ffe131111f920f2116b105c7a16a780406ea4255f5ae4caa7d8531bb505f08dccb6ab6feade8fbe6aef1b655a7a7afde9f4f4df753dbf8953e9a2565b935d13b41dcbc87699651b34fcf09a2c4db526feadfe663b16ccdaf4adf2b989fa261d4cf3646dfa966c87532d0d7fbc7ed198a6111bc9c99199d9426ec7fb22a39945448a4a524a66826b989e76367d3a9978908f514e522a257d19e326ae546a8252229009d944d1a5dc8331c2d8726913314a8b4d6ef417f76e6d1759df5f48ef1ce925b73da671a4afdc5535fa92a3924a29997eadff6aa5cfdc8ef7c51231cd9a0dfa1b2471f32b773dc69974ed5993e9aa67931bfdfc2a537bc5931b71d7d3a73672449a903272a3688a02db385031148c31c60919c2676e87cf0b6437daec8fa88ec5ec065e31b2434d866164f115d77818d9f8d8e4628c5326c6b8e43a9c391febc0e71dc8dcb3109b198c96c55fa87d9681d1be1f51bddb6f6e7cc859c93ed806f830c623ce1df5b01bf11f17aaba1418717465df8e79c6fd4bce1403464a3f868de69c7394c5388a3f9ae1794e151a5c237b9e32a8c860bbbe934a4c4a1d99ca4f154b335f85716e9cc5dde776fd364da33259b2700def58e5fd69700dfea6df5d56fbf7a44b972ffd25b536adf2f2bbcbfeb8ed503a948ec395b66b159577cdda74cb658a7da5c136f00c56c5aab447fdf31316f61fdec9f0edacf2244631393d0dae21bf3beeed0cce32e8801463f99ced5a9e7bbd9a81860c9a8c6373cea96269b00dcdd29cc2759d7aa88a517a18b64ba56c8cafc02fa1d82e9532b128fb7ce5644dbe914a3abc6d2571cf57304abd69b4b4c4683b9b18af166d628f5eb6e7302d0db6c13b9b761deedac7581ab1e57636b1e58ea0a643d3346d2eb1691a34a0ffa0114733750489995f4abbb49452be941c3b8b367dd9d2f0670f69c38a4a5d8f3de6ae7f23089fc2a71472cfcdbec7850fa39467c73c4d314b333fab0d61d75dd3f9d97735990e19db0e721dbcf2470de01cf821eb5809a3d4341ba48796067ef6194956d8411ba41ff5c8c20fa6a7ff43357de93721b09ff4f54d9ce94bff43b5aa7ed43f16e94b6fb2aa36fd0ff54fff83e951f6e606063f92b458a63f591e424c5fed8d101cf34df626fefc1bd9ab2ed9e72b95dba29c1487207a7c747894e888811982f9e11e5492807ea2505f07ea2c2215b9fca422ede242bd622ba250bbd47d56f5e0140c821ddc9e41eda25a80dfcb3f85862e1371ae6405da9667519d4b2ecf22d28f0bc94967f8ef6a4a86ef49e19ef7f35cfc1938f9327027afc2913e853bbd8a3341fd738f85ddf0e79ed210eae8b1df822acfe0bda4b8a75d5cf05eb2772770709d8138c807665d8fdd9869cb3d303ea619c02fd27212ed04979355c03ddc93d2fecab05724276c94cf00a76090be9ff624d1b3495139c53d56ca5f585410fe4481f06f4e2c24d91cbee22fed0d132e085ff1477143f88affe9a259c5806058369619923f3d42edf83beed9d9fe0736e33772f8cb7c7fff21fc057b579231eb86bf3c5690d050919216c93e16dcc12748887f18e8fa1026c23d33377a75f585d3d41484417803c23ff90ee6fda870f453b8eb555cfd189ce96170d8a7b8d1a370da9f70d93f0d7502218410b265f941f543faf37fb85e5a1ef2af9ff6ba28fdc782cc3d0a21c3d6664e2eca975540afc087d6b245d1e010c2ada6562c30ef0765f219e01b4f6c4e4e7dfa39a6bfa2899596d2faf432fd85e2dec52e4ed59453b53d3d0e0b33519998a03e46014317be9c0c4152849015774238c4082bdc2c08090f076ef7b870a109aa53edf290182174e1c9de947e7e5b1cf22f7b437ac983f4f42bc743080e527dfa3c4a2452b5cf579ec43d16c6d96361dc636d8f359393a37d0e16e18d4cc3380a872084dd63c369b8c9a0f97d806eccf84b0af7b068cf3a2a5cfc146ebe8adb3e0647fa140c0d05857b2c8da7e786af385b18965203cdf972cee72181261010d00cca9c7607201a3c875783f769ca9476a8de877742b13939dbc7cf216d5254fe13f75852568b23be9c2f5fda1b92891302597ad5d2a3cb521ff38c856bb44ed45433f27d782c6955fd835b7105137c81c90c52f9f471c8a7dbcb6f8bc374437ad3e3b0a2e92b176f6b3b74e05b7a1f1e2b7e6b3331857f7ccaa4f6a0f6ed52dd83fcf83f987e3e2bc1a9dace3c56498bca40d8e7e43bf699c979be5252cda03e7edb696faaafa09e3e0eab72f0527f898f42fd0967c265bdea61cefa37a7477db53862b4b087f8f27f882fe7f338d9e72bd1fe30df6479d06763daaf666774942c192a12ba0134c47b344ef7c0705ad6211a45f5dfe1065480db182328b9fd949f60221cc56d46c2ed26c06d8a0adf816817fa8d53733d26e9b72623c47cfa98742961075a4a98903032112fd2cf45fc011f36c285db2d749bb768e2070b4d345016825ce88cc9dee4c7b86cf740f4aa26a54585b62a913e97fd9b1f8820fc855945e08ef785cb4cc4650ec1e5572423447cf840a9223154bca80fe8ba7dd4a7a5f0dd9cb3a3b4dde468abfe7df7e9e8a87cfed7edaa5755541605b48b3f118bf373243e46d01fc41f6bd9a6a89d44cc0d7f91c157ba9af25d4ae5bb8ff1dd4af51d4b07f3dd4f7c1938f92adcc9a770a88fc1a9a08a53b1529c0ac2e054aca7691fd333708f2503f7582adc63a5708fa5e21e2b06f75830b8c74a718f85a59ce7afb785616161ed9feafd107f52cb83befc495f5ad59b8f557a427d1d315cb803246ef77e6652905fe4bfef3296d13e7681f6d1604ad1597a37662382b603bea6a9faff69289c101f1e2b657372e29f7c8e7cd4639ca1708f856d52544dd576665a55ff7c1cd6bb38a855b555f5107f3e8ef8d3de0831f99b136b6271c81b94c561993821f11fab722a48e25470e372b2cf197d0e7df939d8e75c9f339fa571efc2941bbee25c8b0e05c57ceafda446381c71b807c5699a0d79af993529c8560a887882044fa0207aa0025cf820073a28c1149c80c2054f80e0899d931f4c1081144ea4200a413e50e01770122609600ba86002841042cc8b2b9899afbf2e1d2eaee0819f287e8c20a3c91650c42088b0051e58d193c516a6e02dd86208d97d47b668e262f71dd9a2063eba4cb763dc6e5ee97faf86c7eff5eb870369e6b03bf63fd8b2b9bdbdbddb8790f0fadf6b8e8ba0a85dea3227b9dcd1b0526150221beceeeece291f72251cc054fc323a968cdf7b0f8893fb4cf235c947d90ddb0584dbd9cbdf5927ea15cb707d50b9db0160453579c356bfff75b067b88d52faaed6279148241289f44fe357033f89f321edbafc590946df9129c6e567a91c8b7a07be67379640e3f9717f3f9a87484abb340a2e211c70cb619320db19f2026911444c14a4b3b92ecf8cd60c9d0e40589399203a13813508e26e55baa8424f83806ee42d05b583b7cba8fcc8915f8bbeb2a457ed435c8f34b47a15774c1ce8d007b13513a4c34410e5d6413bec6666d8318b1981c3957b10b79f631ad6a46ef734024624a29c0922523bd609520297c829bf10433120d06b262806b5631dec5d5b87135b2a55604f468411c612aa5f54bb38aa5dbad76edb0a57b40fb0289c18c1c006981352e8415683273020b40fb221a03841834ec929e94b18e3d54da8f006f0be2018485989acd042176c104208b72c84dcee57d11411463806122290b8fd19929691db0f4393e9540a09263a4ae014155f68e1f6a3d4e08b242e7cf82729f6e99acac1065578210b3e8e104317acee7d89dbad30d8ddddddcd25a8ef42134dc6b5b8308a30e800006110baf0533ec88548f0420c06b8f0595a60c4d0c4858f434c08a87847c660c585bf43bb68327004821d9c08008622b7df14a476758911ab0b9f664b7870e1854bc670e1a7b44bcb85fff065acbe90830b7f06fc82186e022efc922603619e167460fc80c21852df85b70b2a70b8fd5548173c48494128a1078ca0c938145ee8c2edd77ee53a80187b4106a914349971c54411ace006bb5ff6c68aa9ed689596056fc4c8442fb46e07e0f64f4da62b075210d48521b73fca256a576314d08522ae852610c2874a11800ba9545751eed08f16471811c4470d5e20830991f818c113ba82a563d9d161e9586e4baff861f876cce2303154bc602ec8e08654bdd85691aa35455b3b9175842173c708e8233b2e903081b38a002472618315741091a09f20a05e7917a6b820c211f04712f50817581851d42bcf084a7ae5dd8ed625a8540a920f083926f4c415bcf8c1086650b3fb8e24e9b9dd6341922871832437c8742abdef48122446ea76df912446187d51e57d479258f1823abaef48922b16f08120d47d47b0f002241fe88015b02703875e5149e90e41fc078912daa54b3111b76f38a5b57a4baf7a09689dad10e4c0b5022d1ab2407e2b7ff694afbc2a1972f43dc81d89b6a0e43e243b4566dc77640b462e4662953fbcfe2aef686a553f75c1d097fa5ed887e5bd786be6bdf0cf8db7fce53db743f48a67b8dcb2e2766f49bb8eb77a6581165cf83998aeb8b0ffdd1c3980c008126affeb098df40a7ffc429dd45bde7a37f013af06ee874a1806437c440b565cfe16d06556f7ab96cb82dede32a203c433450f127c9200848a214a20c2c5e3c265eeb8e316b4e0ddd0cf0e839deb3f526ee72d258278ab889129627095b89d5bd1add5edbcd5798b7d18880f90219c8222f9917d0891d60fb786682d192203ef064fa2aa667e567e5433f1e7d5d0721de7e9f156ebc781822e336ce95c6620975ffef80abfed9ce7328e1cfc3f58f00fd601075454f5a17f5aadab82ff62402e95d2ab540fef0647a2aa5ec6efd02eaad50c6e154b8b02da45058343dbae7aeb3afc711978b0f79c5222ba70dd629a0de6276c55bca220da85ad8aee782f3bbc95fed4900aa4bbbb9fc0c37b49c1acee7b265c87e9afe9f9018f8d15b7ff75c793c4ed7f53c6ee4df1887680c1ed17dc4ec67df639e03de1f6f56e1062017caf5783ab7ef0c73e65803deeeeae9101dfabc121a352290e3519523f46225151fb796cf1c748b285a5571dcbfb793fb51eae6edba5dcb74151bbcafcddfccd1b141b145714341dbcc7457404b93c240ec5cb0f044fbff08f9f1a252effb8fcbcb8fcb11fe4de0d62e4be7e43ed2e85a79a9132b4a445ed7f5647af80e815f7f773eb75da055a869052cb3adc62eee7d6fb08d906d12bd6d12b6e6ee574f3c48e3c95e945e28303fc727c70f93d9eeaf761ee9a4cd42a4fd5747840525cfabc3d7ced33bead71292337026ddda2764f284704a015193b15efa5ae663c29ffcd39bba7b69313f294990d57305d0b7f2311c10a6e97722bd46c3b40a16474c7afa3a52840757df641083726d487cfbeba5551df3d82a0776016202c3e294230846208a108a584de4f0a275fc5c58fc1d187c1cdcb84c39ec507080c0b4c8e991b4240da4d09274a160a43faf893f4716ba1d4a784522d2464d2342270430bf90372089d4c5192b64a7af81aea336032b13939f465b7c0db6de21e8b512429e9cb78e284c0d7b8d347cef4a509f8e7785fd082e6f24f8f43fec9646f48af9ad92ce9b5e8e0e969e9e48061e9150b0ff790922405f408f48a4936a4e79c768121942328f52c52e7e44d9cc9d32aa7aa63dac43d56cd112434946348670892c5808e9298a3a4e3b797dbf3306d5eb91bbef2862aca1621c02f9be59d2b9e161c021d7f9e82f97942a03ef5aced207dca3e6d07caaa5ac8c9eef0e1b172724e3e7e8ec9979e64b71702bfbea358491f477cfa28a577fb60ea16549904af53334039ca2f897530cf6a0faa5f2109bc170ec15bf1f78fc0bba1dfdddf17d759e7d5e04f91d4f8a57faf86d39bbe3eca35d5ccf63e3cd6666f84e030f9ed6fe49ffc666fb63779d50cb53742502c8ed2cfbf39b12af8f4da1b135bfa98469dea6fcfc3447ab97dc9f220d96753787e808610f101d2a3f3d3239ca6252afc700ae32f0c43a79532f96ef596c487c1d14f71f35138f926272813eeb150dc6369eece3c30546e13068583431837000c0c899a3613cae6e4c854ca7bdb4cdbe388bfcded377b234b42269722e3fabf544ad543fced7fa06ffa611ada608a7a785eaf60af5a9bc939bde95b53f5b06da5bf39fdf6258b83f4d2de989e44a29c4952cbc314a364a82848080806e682da901f14294ad3a99670f873917661a9bcbf219837340463e80d696fe8fdc8c0c93f811123b53d9606036488ebc831836dd474aa946230303191c77c2cee57ff86521fd351dec02fd10221a190c227a0e3d5e028529414e6fd00056d2824f9279f13df848442a53c313d8d4f7a92bd31b13c4c382c1ea6277d89e3210487c9aa9ef43c4e369fcfa8146ef66439eb100d0000000000e314000028100c078442d17030cb533d133f14000c88943e785a9a08b328486114838c418420620c21c0004360680a46ab200058a94c6615efff580384dabe2369e1b2f1f9793833fc1ce482b9fd9fbf693cae090b8e2bdcca7b8da570da1cc8910c942d6b96a3c8ebf3f12e1b9756310770a95f49881fbd48f4de0fbea466f076015ff961e44a74f62a3b6ff82abf5d6316edec222f6921385655e72653e354d987a4e85127e7c064a2519e33eaf90a97d795e6099861ac23dc964b4b6e63bb269c1d104f9aed8bc7b104bfe4d92c82638cdfa9515285cb9a266c27e170af4fd73f6e765e10334c2eddf90b2b0c9758f992b80c0f40d5fef28acd44531b79e52cff7ebf3805600c2b307405b21afb09657e31f157b5683589bc2f285ad043192a7c3f6154f2120aa240945cd06c14831a153b5594b56bf01c79a3fad2610a45621f78f3d8c5d71d6312eaae31a9e3c09901011a88b3f0dbef8cc0491d546a95cddeca5b2a42192c49fabcc42c65788a205785411ea7b4a8e6c02556bbc850e093980dc7a4a38515eaed460588be19a819aa3d108f4bc7456cbcb5551a6569505d3979d4849a0dd048fb193f37a33f9d549f8841ac4439f2123ea2a704a642b2ce180b8ace6874db99981e220691210145fc53efa76ea1dbc5ab0b4577bd1686d147ec4f70bd8c11e5223dde268d7e0fb2b77f44fa064794b75347b423ff3c431cb4cd058d3101d4d21cae95f562d8a8cfc4634266a70b91c240b9b838f2f9c8fbc839b2518da640e7ba2d28533685f2d072380b8be37b26e54a6957234d40aa1d156519e798d050b6d883f8c745ba3e8e94e51ef6c42ec1d952900cf2dfd53c684c399231fa60269bc86cd3581da3d568ceccaef62ad608530f98829d35bd7593699ee7cd9639ae74e9619536f2e16dcea9a86e791bb06be03032e82a28e07ead6b58190fc6f3efbc1b5cae9d654bf8c6c3900ca60c32d8df4c2ca889676abe67f81222b3765d42c7aa686f93a80130f2f34eba06fcc850a876cda36322386bc7a4e6d6e22c1f65cdee4addad071a6f9c7a4c7f7c07c37caf795693a53841a842a1be57dc8b82a7f3c45f3ad95e3e02b77cd4f842e87bb0abf1c44b61b240cd563942868183dc3b84983d2f69e6dc5a5602b9ba6ac245efce4c722717f64c6e96de12fa4897258dbd6c14bc1a1f3b52446d0f374b2d7ce79d5bb66f97ce1b1087847a1f1bd01598de42fc3dfd9b0dff75ac7552a252c2865cbe59d443625ffc0de7c0c515c980293cc93c3bdc3d9c11bf3caf71ba131665eb72a40a18bfa9fe1cddb56306843a493fd6d7a86f202b58dc0b31dca21e4f6561e06b3f5152d364ca4ad80248af4336af98594cdf8b026082e888f2574755f922a767926f86271011d129ad52d84833aa453752e8edcbc25a2b4924c75524bec891ffb18a2ff7c0da88e2c60c8bf7415f96d4bb8f73ba09f6b0c7405fc7d5de49223bad30c8739cd8cb4438ac7aba1f421cf6db29edc8c211cb88e33741af8ed9941652637b59414439907dadb17b5e7621c7ab276738f7e4e00d5912e9397056adcbe7f3bfc905ef365a0c5fbd4deb640c25a8875babfc266867c9dc776a3ecb540ee0b3027250ccfc59af037f7a86534c0e1339ebf0d2a3e2466f599397ac30488d1f49b17b3018ba7c1f5dce32222f21997e6703d56a80bce48ca3970c97f15ae3f337dabe0ce630804dfbb6234a1d900725ae99c77349c7cc8a0295c142dbbbfc6877d3ec0a1eba25831fa03a202ab3cfbbd4c13dcbec270d0410b02601b80d9130084ed5c5ebc8882ea0e211e760f05d3a2496e8ad7ccb2f6315280efb00b2d3113288ab5f8b5f3deb7205434fd05d834bcfea3062f41baed06acbbb747aced3fc8aaae3116e75699800a0a4080cf3bb642045d4c48a6ad77eb50c09f93e19249c086a187c4b059d0734f92f13a3bd65f8965cdc902e34ca716e7ed19352b2ad0cd1ff23756ea52be58cf51734aa1d7c005575f0be275497bd04163032244fc2e6697c3f438551455067d01843e1ba5d3cd6aaa5e002aa3ebf57ec65334c89c34cfc2f9e86b96dc0d3c0e0c41f365fce4962e28f436f1b7dd1d70ec1b8e157c79198594631807fc5b142d983d7ea8bda2e927c7e8d74bd402052d7eed0b1fd7824e026c30e49506f5dc217e5ce4a424326cfa7af2694e20c0e694e04102e8b49de14f947e7823a5de895084e589fcf50ba02a7786a69b843104a1a10ec4a2724d2fae2a41042ff493f539b2c0743889d4b5ddf8823ece20379c7c31ccd3a5e4683091c03889560195d9d92c68c704a426675ad9fdbdcc583fdab534c3455c5ada471d3ca8f465315d1b39e653679d6e3089bd62355348161d1a2387485a511d7588db67b7952edcca1e5782be21fbd1d13f5311a5e50de59d1f8e7a430dd2664e87ebafe228b4fc50dc27ea21d7b7b90de3e1c3151794d5dcd2f17ac97bbd03eb2bb4d6d2ea72860cf66875ac9b004d7752fbceb6efd7f3b926cf50024dc9003e971bf9749813fa23fc9261e8c34ce9e79bf8a7162c8fc1a52bb008cfc8bbba8728430bb6db3d43ee9492e5c69ee24c513f90cfb387153830f99127679ea76898f635487c82a84008c4ddcc7001372a5201108d6e36c4491151b133329c28083926930ee9a4b994d44a3529bd99b93bc098a48749b8bf805ebca66b83566b2436e553452b43e14198a609f30e47b0e5b901f25d447b3f7e069878485b385ec8e55f0b523cb3c76f28b36ebde6bcf7ef8c57cf35fe421dab6307aea233e9c020b22a02a5e90176e6e725a78b0d85b72348b6419161684e035068c2bb0c09b2f5d9461ce1ea33dcfc897de3e57b2846b66a7eb6d87dbdaf77090c81b38849d2bea403de2a8e0786d83f791bb01391ee310b7c68ee220f054342b15d92c2e374a0a7184c1f9299763e906c326afe2fa405f27d47be3e2aa813cd69fc0c1bcc641140872a5d4196db40609313ecc1c8085c4b0df65a4a12d64f36f270e96137b1d2bd17562a9ed4ee4f125a444fa38b15976d11668a3f2d0fb6d94b67b3d15009bb5018ee3d3df03dbae7db052f3458dacfaba2e213e5129109709137e042b90913cbd30e6a70bb753c118e00266458efe8e0c10d365cec09e83e7f675756b3b3215a77a4d25d748aed06fc32f8906b35c6da6114e794d0990a50540d7a53521349dd7b3359279c13dae4aa4c75308f451606cbf53c21be7dc6eddcf665bfb2837c5642dff9d7d91268613e30b32a3dbc5e2e6b47ed45eb9c7a0045a93a32a6a4553211493f6085dcf8f9ca702368d32bbda871f8a4b29c52301db0e6d494d1848f27531afc5b5b7843b57f351caa7a6482acfa3b50aa8c72a4106d0f916acfcf4990e93e6782b5469073d4b00a9adfaf1a765760202f2f7a47f060ee63b208a8b67ccf35cb302b344e14e545218cc42fdb89a0814e76f9de20650f13ee67fe3bd7be0a967b808ce0f8b3d962a0ec91ae79b1f887c4e676f3c00a221ce749f9514fe21c5f708f16fd0b0dbcced8214097657862be86678be569ac13e3cc4379fd1194394ac0234c15dd415b5727a5b4c17451f739a6b3c04f95aa324ba33bd0177a3bc6b11a258c59e7024bbc3dc5b28028722676861671e85381154a6885371ebd84ed0c35b62159e86bd89440d64eac39e83282694155c87c4012e0ea89e66e7972272740de11a0811bc8a1a83de7ab4bc6a533d9d833ff1faa6cd55df89141992e480be7dda1ce658f966eaffcf8bbaeb253d2462c13ad0944bd353a61afcca21155eacb85053da036a75d59181a05f21027e228a166f3034a8334f1d35cdaca74fa83d16c40c44b528adfd0ae1ae63f31446ad6e0a832f3aacc2e04250c672dd951131637423b0b2fe645e9d1ad704bb3c31704fe2cce19465e78d294f4ef23caa4c635710342c757273da01b7d3ae92447d7ebc0ea56ec381f71af563cf034e6bc1269ea53769e0a0764f7915ac6c08907c419edce569c5f0e5fcb40757f9d22f4a8aae23317dcd6414b21ff7c29a268c1d76c56b59b8ab7ea50f03ee1009f3eba53d3e11a255ca26c11e06caff4b3188d25e33eb21ab38ddfc11c8ca85fe5791148a483daf0b6b9508265a39e8e179b2084c4de499d7c0732df7646b534361bb9f4746c502335c268ad1c981ea4951bc8f244855fd92625834a9bafc0673d2637eb82e761661bfd83679b0478f115ec8e6d7cd4ba7de483be3e53ed11fc54409a3553dcd4b08cf8193882d51dee7528273a3243ee6d4b1bc3cadccac9284126f811d2f033c8bdcbd3d6b137f2bf4f0e29be28a971ed268f03d35e62a0773de442c3696b1e09e5e3394d87108e8625fba125ee2e51a7a85f25c4820d33769b4dad948c0bfbcb359ee34a6dcaea99c5a6b407c74db29e2fdee281866f8ffd12e725f73df4f61ded2849d15e3a9c05ac435730e83faa7141c75232e8a909042f9bd101a55c613ded7da971826d0ffd41a24e5469cf04e0714e3b998adee3bdd4102d15e4c3eeeb4284d6b4ebc8958b81ee9af9af3da8925d632f772da5f8c7253b5c7bdc692f1d7a9c9e4f67b888421a4712d49e843b3e42ee8082592f8f032e73822c06689d6fff4a843cef62585a1741621d0487d23fd90b144521908f3c0270a7cdeec4024f989dd150d6f3438e88b3f7a5c819af40a2be098999253862023151ebdc872e419f98dace0e76ae4493192f3b4e087202b5d3266f073b4f8bbf41b7d535d5e6020705ddd30f915ce78c8050a64c184226bf93c3ec8d8b0ae026734b2a802d413b53006d24d80ba4e7829f8998417cf606fa161e066008a6862e72cfa74efe55be8674a99409029b8fdced6c8f8aea84c7fd07655e86b3f566bcf771aed5fa18162f098e101ed8d0640d7b72a4b7c6a0de4d7fc7edddf78f62010ab1a19f0890c9c10a94fc11983bc44c143a2dee7e51de43d609383799b8395e22878b1605e9b9dc3f0d5279b9463e9fd6f5f2b73c2bb62c61033c8203436b07266e5b52f61c63529a80be87b9bd151918319a63c38089af684331ceacc08aad79586861a3dd39c894bf499c75300e71f37b8aa3ebd575b398d1d13dfd6e634e9c7eda8aa0c4fba4f21dc201710d61aba387a719a39e63f770ad90d1fcce0018a0d96a5a3177a84a08339e7115d4b1185d1bfcb1eacd82bee100c51c63734fc05ffb9699e073b3dac35f885f93a72d14baab08ea700bc025c5a1cf72ab8f99b99f5fb47103d6b1a82d86ecf89e64ef0044c033261e15b86bbf090ffa0a253df6cca0fe4075dcab6334ce586133af109978a27606c37c5074c44e6f3bec842183b6fdeeb4af970b9db335f631443926b61031be2559a09952552047a12ca8a4d5d48a1f65765677a93261f346921c935cc0542b31faca90e113bf2fb3e3bcb2fce30cb97f553cbd1c9237a4d6480eae8f132de54f8c33b85f456f8e0facf57493b712fdcaef292c8eb5567f0d383ca1a2abeaf56fafd0d088090edd4fb26e7fa0207fb03c05c3fb00ae2df58c54b638647cf21b6ef02217cb83bbbc82362d2e4542500bc1588700563a61f226135232a39844e7b0104739a2535a5a3b783e70b3006acf3bf1a9686ac75f6e2af6de374b2a399adba4cf0ad25e633784634ebea22ad3ccd0ed2b7319a0d44494498f789dc13b0ee07e95d15e91f71308a02b6c947491c9fd2ff1973622bffdcb1ec246fc2c701e9108b2259e359b9c9b1f7bc4954a340cb27c3b9ee079603feca15013b2008809bc96ed71f9243d5c10637b0729320dba6f09c505f6553244b39cceea296481a155567390d8448e8fb398d808b36ac0bc3d78b396724299abb27e92fb153889ef2e0f6db4cd9d672b87af9ae5d7bc7414f493737f1a699c588d6fc2908d8b18604e9a37d15e8bfef3050df21ccfa4a70b6f2656d62f717a391ae3de27c07120a3712ef01026d5612666fb15de203e90c192dfab65c77ce65201f1cc3625de490c7d2253d9ab7a7b5a13cd81f4c013058e1d2ff85d41b08671a81aa59292a66df5cc4f70b78363c656fa1ba8808f4be9570da94992677103c0390568813acfc70c4bb6eb58d3a7c8e46d45cf8d10481bca766aeb60ad3715351b42b566492f77f7ef491225b0f3dc220c56ce341cd82be4e786aec65d4cab81abfa6fd2b4239f115986473dddd14b7a1e6c052a0bf76dc79fb4c92496bbc476244ac91d7e91460c796ea8241f06c762e726fa072fdb07179832d39e37b14aee3d51de1cd0ff99603ff3b1a9a16a516fca19b7de8a883f73b3b91314d9fc4b84de45e0a894c9a382a79b65c9effbe3151870cb5c65dc0d038fd6127f643fd43ec533d8361ae3e0ca0b5f9d1b5149297447b6a812db9de51b94d95c924b46d29c93d5a20127d6e1d2534d899bd19e5816835e01c5cd7f01e0278554535f7215fc54a3fb6c15757b3f178d1fa50b0f08531c65fea8195bf8d0552034cac996ff8ad59c31f6a8873a0fd1f92c166a0550ddc376283fbb78cf01822c9a304d8b519a9730fdf058e3670bcb1a25cdc43513e41826cdb431b084a94713a19e65a3f5c7054192b47a430cca16edaceb5ca3ff69b7e8a0de27bd9802767bef135c6276ab35039136325cc9f601c4cb9d2ffc3618974b863f9dd40fa168597519aee1f8d6f427f03d0e2ec25bfffea39d09252f5751b5f5a0f0e160a4e67767a8ce1495028ef0b755ec914c8b7ab00d904d4d28a81ee1326d7b3cb52d16273e77bb3c1afc28b4248835f81f8be241bb5b3e2c5105f284c0da0b7ac24d2b6fb5963193cf99b8af601d04626d989fe0f3b1887fdb8383114e8e7cda770e16b20c62b33fd626a51fb74d233b17ec21d08a2f010f5bd41f18bce88b754125e6ff139abad2c08c059f2e79406326d62700a9da8d2d7673e42f07880e43bf84319e6ac74cf39f7e48b8593826780cc2a4ed20e389e3df4b0c0d6fd3c9b18ad2b271b4f9e620fcca152cb9bd2137255376cd3efab07b1159aae35ae066e1df466b01cb29dc4824ba865cc9fe0d268c5a7e52d97b65693215b244f3ce6f9ab2b33872f8162afac74ec3acb9fae550de179c7ce3e1e005b1444954262b012ee85981f44f4b26f7f6a74e5d884791c77e4af1894009da4bd7ee15ae13870c465a953b6ad2c4acf144bc9ca9028a5e78a085d4566454a06740a653010b6408fba1b24bec52ea1bfc0976faa2ec3481806d026ee0ee5137a6c624b6cf64fb7345ab90f5c466dcd5c4e630aeaa8e59efcb33d9c8b369cf08983d94799e8dcd44ccb4cab7877157cb0dfd9455cd4d707321efb4d0fcb376c229f6e5994aabae7e4b1a80c3c29a305e62affd4a14c1f109a862953f924b413d9e1256c5f3e8704c483cb92b92a832f33d2949ac9a69067b38fed433cd33345172f708484f2a106fdc22e7971026a59bddf900f33aeed3e0f21ba7d61c4b1412c78c911982264123c1410a51c34401be71ae56141b5fe3053f63cba098743c9f99947df70ed6f597beb54e9929321a93dedb3aa32691ac132bc49cba816c4662a87a56447d552c831faf3b29386078537ad17850d1f78defc6c21cb241cb01baa284a75b40ef7b8de061c72999a3cd3d49a8c6c79a29bf29445d3f196f831df2d844f7b40e0b1f05c0865c2b3dded0fd5010839b4cf99068eda27e16cf2501d1e1080dc106af4404f19164979fd575f9c48893fc01c1b12cc9b176e6ec03680e58ff8a7777cd558544905e17ef57297ef2c9bbe3a634a06ac14483b17530b4c0486fd0151e4985feeff420982fd29957037cc9920081ec1265c0b50dd53b76082cd679a5d2610908d963130ba3a02c26a68035aeafef27a88d072e268618049fd90c45c9cdf111954689b433967d85094a4be261143ae9a44bfa16ba3ce6255f470c5f819b102cc1ae1a4d810652279bbdae97dccb6e6b81a969205940c06eb451d28bb12c0a165f12512af9d7ba211fdfa4e7e806f1b079097fc20792f63eb6f34c9b30979687d2b1a227d46de925fa229c0689f111ebb108302f38e8ec5ee012b33ed7d32feceffc722abb9a0a9ec22a485c1a205e38806c6017d77b926eb7f2971ab9f44b079b676edcc6ce252fcfa51b236cd790baa405413e66e5c72741705bc2674206b9aa004357ce71874ead70d9512bb3072545a138a79430914355da8ec7636119654f9de0e905c0c5e5d67d22c1c8421cf9d695e619f44277a46ba3f2b54d5c53993355fa559c122068eccfdc2f610aef7c800851b7ee9c51eacf7f943131b6a4b974f6a9fbc21a85f386cfdd627badc57881e278813ab100d276312ae24b7d48fb61717339d42fd6bbf87d2580ddc77334b53d8cf65b4c5060e1262e846b46432fdbdc5dc449a4070bd5cf8c4ac1d1b4218f47964df4465230f25c8cf54c80297228d6b0eda2a9a36fb4b1391cb72d3356f4823f22343491ebc35570d0fd4f3830b4d441adb886db418768aff443d185c80d3d9fbadb5cdd03fe1447c3a867de6b341bd6c7c120d0166b1a6f7347f795f52aaf5273e6cd0616007159bc0935a2bbc0c6b6e8be400c581f31436d0c0ac803de55b7a0a1b3f2c68f8950271ebaee887e758fabdebb0d78384dad2c4937440fa810103e331c72c9bbbb42f2cc519b3b83e8ee83812039e340ccf23a53ad06942e30107fdb3f7cfb71da168cdf9484898e005aa92fe8bfe0df243ec92d792151d52ead5fc10c9daa3c6c4c0834b095a2458b3f1635c80fa55cc0c5b532cc0e00db4565ed330b7ef89aba3e634705b62da68252020241e769e99be36391f82466e92673552cf2412749e290904ab9851efa6f814b0bcc39c62535f4a72ce9f993dc882ab51516a44e405bff2ef65636ed8bd5091080a596ee205399e83e637cbc56af07d0ecbed4c0c8a0f2cfae91c90d6a12ab117584fbc4f44e4751d510c0aa0df09da42b0b957cd1a0830f3469c2d8d3c1dd2b5870b3f051d63b33f707359b9f6f0b2c56a4955872f651d4038c7b495189cdfd38221f0b528a39ab2b8c1c2e0a28fc9b46089822a0552bcced5d3e2c343d7c7f1ac8eb9540565144e4f891649144183e8b86a282e318129a0a28652ead76c6ac6344828805648ff5cf4367118f1eccd5d81d2ada8c2e011d02177b5d975a34e3b2a1705e4c9e060076b350c9e9ba7401bad57aeed391fbe9437fa74ff946440918a49866cbb4bd9d8fe148c9c3716a937bf1b446c1a7326491c9deb8f9d4b6dbb61eb5d056e6abf76eda2178cc5bfd85c72e4fe71233e63b62ef5a3e9299a46cb8c0981cd82c8b2f4dfd65e59ccce54b8ccd43457007c601f20d64dccd28b46572495d7a8026d0100794400940e202085d639cec0d61e6f98a1f078dcd5ad77bdbb98b46aef7de92a6c84fca34889d50bedf1ea751db9803252e0c57c097bc4dd6617f4ce7311e5b7ce01033499f25eaf8bc85f1694766db53b4ec9886157634df4806b53afd40dedee22f4ae4bd3a44115c156e79e743cf08c12d12428cf37fba37facc673305beb4322bc0370e740c7a02436246fc9076a4a76f8f4dfb08c0f69077aba97d8a549c0721472ec2f5665ae4e83c88cfcd19789490c8af21ddb5722eb2ce21d957612857cadb6b2dee878da19a371e84440e8d4c5cc36f0c0a33d5c719a205bac5d8defdd693d62c9bc4e8160ca40b95e206408b1f918cc900cbffb8198cacb92e568747890c017206ca4370ada2b197ddf4e843c1438f5f7d4996b4bf4f4df24f3dc2849a0c021719fdd9996ae87fc9560a817d0adae360fdeba1d81231fd4047c907982a30383b30ebcb3bf37f12096fcbf114a616faf4f83435040c1d017af3e8f5e5d8e11ff8787d5365e8f62bfd8301da3491964ebdf4e2badcb466bbf751e7204c60ba918ba533387ad5526e86738c941c427ef4fb5e7cfb401cc90107987cd1dcff077903cea60d642bdcbc0b268263ab58f386dbf5ad1abff328ba5996cac8bd38b6aa81387e3b285031f5826fb2b6b2a98e86fbd581040548af97425eb45fedacb3c08216994044a33c9ecea129838ae57a025ef2049748f284ba9fb039c9a9382735c213915b6edc3c96364cabe5b0fbecc5710dae181f357157fce3e2dbc10a0359bd7e04d0983416c3aa01e85b88b887d8687eb7d4d198ba711896017c0799ee2c83486b32458cf33dc9828351c5264975e9978f12cbb0999c3118da6bf590dc27aabb6ab1ed721948f653204b5b05713095fbd531d241ac7df16a358d1bcab85519e6035d1f846cc005f224d53aa4107a087d596bf291df8753143944737eb8ca258ba4d20910ef20d6bd2197e8bd1d164e1de2d7c50b0b0ce108c9ca64ac98c59d1943685e766923946943397a3ca4314ef70531fdacdb8afe89930e8be54d2481f924ae2709131026143b2143b1c1bee00a2deca44ff42b1db5030ccc4742ca6519cc881e21f699379a0d5f14aa480003dc3c0923da3556036e53a3e93b1664e4cc906cf0c4c43a45adf2cb717a94ed4337df6aed8e270c689cc32cc65aba6c2f228280918fa2f108f6b36af0c986fce05fd3075657fbbd174c9b0ce58bc75224e26990561d44ffabd839e594c9bc8c5a340d0ed96d0ecc61781cc164e3891e6cc2cea1b191b387c6600e7129a2a16e0c3636076ae8179fef1b1c7e46912f66126ed8bea43980f53dd24b98caccb3ea4d79e63e40c57b4b0dbdb20a30394a53fba358e212dc39ccfd2dd96653026e4b99c05c99a7278562746c3e5c90c104673a1778df455a66ed6a9b6da230b98509f901933916055b4b09612e6e01c58e5e5d25fa4ffc8ffd23f7bb54af56d688d2fd07f48551959c11ca7e64fa0cd2231af9a1610660e5a8af0bb68699c01aa534626841a7ffe462ced74cbd5f77fa2786665459c4be725045fb2479440685031d7f45011c5148bed003bc37e891eb1bab3c4d6a980e4324bed881d73c35e2462117bdbcdd0620878a164c5bab0bdb779bfe2e818f3d540d229f70990867da3792cb12940b1062841ad1d0b0bf5958d66a51fa645f54aa0fbe57e1480b9214aa4924724318665d0b379537c5768b2eb076ebc89610b2a8a37609e9fd5933b0076f38a8f602d536e94a96f1f87c09fb2053f989b1dcbe706a920301cab438b7c72907a9a0082d36bcf80d85f68314f54f91331e51d89cfdf5b1aff4edd1019f7164f2460c3ec16f5bfe6487752a613857f53a2aae4b28f89bfd16b568066d5242005c5df99f39b9a0c7effd2e6ac27eec6849cb69ae726402a882e6379cfa761fcb2e12437aa281c6f50ef326919db05cee753479f6e7561366c542262b185b6a0d5b149a751f85aa321a14fea16776321d598df5b40c471def14468c4532542152f0d37ea6c9fda0c4d399697ea740dd94fbad975675fa44403853865df013fd26452699b8fca2174c5d089ebac8281754eaaba475f3d8f3f42ef9789f076e3d29eca7ef30385ec617bbff7d8f4d6ddf05845829986bafb72bef278be1c644cfd0db6fd9b9f3d18ed16aef3855c3bc35c8362e4529d625cab141b7402f0ac141a4d4a81605930b813807183aa51c0981bf92662bd83fd6fb99911f1acdb9485160b00735f8ee7769557b668ea3b53fdb260d6ea68195fcfa2a6b5b7996d5fe856335bf8d8455e6cc00cfa929f445d59b449b5a38d27a5f389133163ff7fcfc70771b79dcc07c002666c63173a2fd1fe233f7b71d1ac80f47896017f1c777f341d9908b8aca2bf61ebd56f4f19688e246c93148c5dd00e20be2530713d3ef74cb34c63ad4bf8ba5824d7602edbb227bf59c73cb36fee3114d736f7410fe39a5cf3e02261178152f12219e4e05705ed14c4a57f5f5010e2501640a0f959c8e1a1a47b857ee91ef7a6bf1f9ec63011ba1882b464c89861aef7925b5fad7dcfce7d20498deadfe2591d4a8f24438bf495720d1973f321d144a3313e1f22ce484188292d4c58200674ab0bfa549003d2834efd22b8cb6a4233846505dfbff877d7df63bc5593119d99371bd8d8a094c5879a93f64acd2c28596e7c9e6cc161e9c9d978afacc5cba940f78eb095d38dddc5498a0a869b9726e08820c2d1c629651ddc9b80e0654d992c4bfc420367eb79b7770bb0157e2d41c76885a85170d6f487069038488b51665de1fcc463663340c6722a55e96e3d5c1b0dc1cb1a993caa1b42df3719c53b828ee54a96766f5c53063864765143577bb428bc1e2e8d44f0ba466e87c2842ced83fbfc5e80c6b052c7e0479f92aa501bb3601b427471d449595f1a073c3a5bac877be313785d2bb787744248fb4427bf07a061583126eb4cb25a15630ad7d00240436339e2f8e6b499ac837b23772dd766724e0dcf9eb46632ef3d681c578a403babebba450cbb2c60c8a4db191dbebb2261ad346dd7b8b331d101f9dd048dd14a30228ec4987d70f68dba8e6b1135179f9369beecea0f47c64fdf09c19409f7131cbdd455d0e3b5503c3fb18f48087a5a3601ef9ea0810fb90e14cae0b50a927fc6b4f20cb47136b063fc1e6e479877a60aece116e4553d19f7c6ddb19c4541aaf7553e52412e8854c295a11da78666f545619d1d77d751fd798d7c97d71fdb940ca8378c8912e7c9a57f0bbab79d8db63cbdfd1a04c26e3fcdc17429cbdaf4d099ec19c871cf1e4b07f46b9fb13a961e391c02e51d62c8b7cb6d7f5f3d0c961cb8968fb2784b719beb8da01ac590c7d5588d62619da50d8bebef22cb23a3ae0f65312abe9c8f5778570d0bbd2318a7e8100654f8686b5e1bcddb005e33637669c330b513fbd834d286393129e49295a8c11210a2c7accd1b8f25f583c38e54ea128542e5a65b00b48295d7a28a55b2016d6273b41cad2592a77801b86d6a85de5b8eb515eccab64444714e71289386999a943b1eda6805b530da328b9893b6ae0ef7a8a71d6828990e86cc59c01081ace9bee530e7d4e8cdd42acfe5aa456f1e1517f7965c1c4c68ef20d724b81e6ead753318b9e922908a11e44ba97fb7aa1ea722d0d28d5e7bf431df3bdf38ca22cf5f6db46f757cad655ea0d39a1bf2a8c4214135a666df1e6d869c298349c8ab1b40eeeb8f7dc2b1b9500fe28992af92e7fd2e4b6a9991072789f1ba75450b1c24be3563a1b7d3fff935cd12a29f7e9f0d05092824d657689b09229a6cb7622812cdd8d6a2ebf8f2eb5734d7e1c80e4a3c0146db36eb87b916e3aa9c7b9e680d4bd048e01fcf366e02b94a600f1318faa267e878ada0d724be87e92bd0035042f656638fe45ecca489cdf32ea6a64d2ff397d39f1c7829b6f20690d8c35c7a6b2b24d0687af63081454f082471ef55f480047a95be36ad8656b0f70a7a94ec5542af470f65d758bf8cbd58e613e9b1cfd6010e7e562732b94f092025aa6702b3b1c0bce806ceb55bc6d155f32946e1ecd9f66dd59414eb420ff066e2f63935ca7c8459e76175065dbe18b07d2eb0afe11169f39cf28adde70c656c2f1c772c094583d464af9983ccfd4168dd67d11d0914ed3e62f541efe90627b5a71a51583baab6ea6cf3d59511e07dda7325641b12bcddacd95347f8eb993e5dfc6e33f5d46cacea898b7e2f3e17e48fcb7ab50c99c9fb893edb00b42ed7b53fac5d719cac4fb1f05b6df67e90614f9801a45ddaf8e6ed6e21d40c7baeda87fbba0c56e7340c5c8774e5cbb027f5937671151d954b0b0fd88c57e40098e27a4a3a71989c903e0867d87344bcc0a4d81870f42762c211889eb1c81021e24d8f83d6b28f726adc694c0691d4508a9f176962293f33cbaa6a06d1f749badc63771223d41580b7d8c1b20cbc05cb97e9e397466ef0977af0d523a7129e4afb2039904f2b1ab50765bad2dc24869c315db3594a8abb041ff341d8ee2671b4e1931fa0d78cfdf01718aaf0c780b98df91b8ded5ba73a13fb23d91b501dc13eabab800883d4b08ac83a4b6b1d1356c450c3274597780aa7395c56797e434c5c9b49c10a15460e7a291c138004b39bf659ab9266fdd910a345fd7f19412292dc3ed3099458f093c857f2297a22878a2a9cc36686a6649cad48ed77c97cf600a947a7980691e284488b3b632ad625ef547e2c3ca0b7cc37352ad24f78efd83dab4deb6bd4836db5e44f545ff77f5dc16591964358f7204896895395c36f349e245a8fbf485b003bcc8d47730924fb4966e726617b867fabc304797518bcd8a7182d2754252b255982e287e60f4c757ba99d020a743fcaace752c9409ced5266bb89c6b60cfaacc9fa75361f677a232bec74a28a3e0aba25b6b8a8edcb8e7e290f94d834cd4e5a9991aad3ffc741b80c23b58d65d7a39012631f692cba3c9675eeaa49e7a0add0c5c08a9b9c37fecf5e95783dd8cfd576abcf586856ac053dd717c514b959bc748421d8d407a46b030eeacbe4dce12d0f49dde04faf2caa7eef6c58c7dc62a7186a60c59ada310bcc09068c5075354f88e9e2141ce74de466201663c43ebcd7bfaed2a22cec67e7eb8be55fcde240896c58c1da614faf3cbca328243cfb1565af9c20c60f766f91e98439c1b5bdccbc40f16b0b2864dd2d6c4a6d121329d7cad65919a12c75a39d7b3417b9dba360fa3e94a3420c3899387bcd5a8bd958b4e6a2012c3f793a07d72b22610fb7b931bb017cc5a3a3a11ba952e29ff0e58afc19853ed15b1ca3e8f07f5cfd43a51ca7a9d2865a8a4a5b732b3f6f9131151892a3a56c7064b23c09f0f0c3131f45958e39a29aa2cb2dd1f5a5764d80e8d28fe76f2800eef5f43b9ad87d29423cc6fce3b4d80040253bffdd87ffe55a0217312147965d1e9982b465c31be81c32796f04ab9857e06140470d8f669f312a0b9fdf71251abdb6c51aa4def3e402ebfb809f1bf246651b3e3bfa555f3318589e6d5e9921fa8c967a1e0f2f662d4f121cd2deee62f511dbfc41049bbfe1cf75950fed989dac5e2d926fcf507da855bbbf38435697f6c167d3446bccbcd663ec18e355e018a9444d4a22f670a15fd7aa08954a146825b0fc9448e803b65475f06081d3e0d5ee35c29b95c3055dcdc5ece25acaca2a59ee52dc9ddfd22aa00dc81d45b92e9cb816a5bba4cb41d13508e9e2c220f2a170a9b8b46d953f48a0071a1f1af06ca991d7a4e656340566d7da1123bd0181ee643485e56356102f7558d81705082276205e2ef102559474acba29c35b4c8f4d55f16305015c3a8a59bdef11c0a9168a659fae6b42794a96701a2b6a845dca0aa142659ca2ce1e86c36b3bf29da6b9bccdd3c3feebed10a01a8b4eef5c0db07720c5d944b3f3f195a98e7a2ea91265e825400b2aca234956c08eb1913d7af2f264f08380cb61c952c62bbc0edefe697b987f1fd57b43996ae83901458bfbbf470155fae318ebf23962b015d6775819d3b519a8328b525e83a9f2c0425794b5040904ae7265323e3c6696ee5a1dbf7a5dcbccad40ec6f9d1fc254eccf0968b4b0a3018a52853a38e3d42308206abbf4111f0c421586e1290e94403c4b5bb2b9b45585a45c2b75c471842f4bd6afa73c0f79dd5811a971444c88f0fd24e5434a1d779e0f3a3b6cb6ff742d53dfd9636d37828ebb5d875944a0d16b31a2f7832a14466bf307f4bd3366073330d7916fc4a103ca9d5ce606a3a2505789cc78e63a7dc10895aa53f47bd0e8263ffaa39a1052945eefe81ef474cb4ffd214d64a4160da5c43b09e6b4cf54d9d89929e9da76dcc35b6bfa00b61b4c815255806e0f0a50365ac91fbe77ca986abd12d2d0f85b4b33eb41110a5d9dd840e0cfda20cab6ee62a82641a5d47795c9f4833e9488b74eaed9f8eaa101bbed67a8672701d0a2e4dbbe67f6410dcaf8a1253ce7d9dcb0a6470318487b4aa7669f1dec280b5f090e13b911ccfd08cb57ea802215b87f7c605a16feae3cd507d95197afd4966088105c44d25553dd5dea00cf4930c3c85e20577b270b717f77f0f06a12b3ea22997d28f3505ed77c03e7eb2945ca77c07ae53fbc73885711bcf5ef92bf26db071ce34917bba36e491d357307d3c5324d7568c734b852af42fd569b763a13e00146a4c3d13920ba981d104a0ee74575eae16f57b6b60e28b2c9079e1b3f4c1b2c2a4c75740e6ae47b11282746d4781508985683054b139ad1ae5c05730cccb40d163b2a593e2b561f1234ac45896c12ff3fb3595847d60da4025fd1ef680882f7514d08627296b4ef943f433ae67d188706a8b71e501650e358f2fb4f975b8b106ba5de4fe1e049d545ed8941910101d07b3e886af0f493d91ca2022818bb6c0baf4c6d7513dee7e66c33a13bd66973aa69e846ac3fe72e3d8df12faf19a804d05b41774d6b4f52cf6866087f81c603507aad24dc147342dcdd818610d410de9351f5f1a8b38b7da63a530286ada80795bdf00e49184363d617679c37668d1c8a12f0e00ba7466e3cfb326907ebedd767459589ab7ddd7f9c8a59796437b8329e40225f70b6df13a3261f768a39f6f9571dd8b4b6df4bb5039b903ac214d20a1abfe69c324f67eed39c3753bc948475e04d7a27a15cf2a48f59bbd521b0d058afda5102914a63c55a8b44e329dda3227da0ffe252640d327e30d25b62773b8616062363d59a26cb3193494858ddbc89471e21eef9caeb5c9ab844223e5a89703165350f3b21505ad79ad09a304afc1fb5329de49c13e865727be49c3de54ccdc905c0a9b1ec19abe634cf4d21590bca40a01751b4c5e508589a0c4290e58d371fd32239a4ac41b1f1dc1b14241a21ca26e13bd1f89a193e2e2b06565ee75f7209d3bda5d26c1df98f81acf849954bc6f55cdae38a30c3283c6583acd24397636b460b0847e7bce99943177788fc3fe1bf53c163194c92716c3bf9f17036183d01208fd106d361ac08d10391f34114fc2b8d80058748496b58c2a6d497354864dcb81ca4631aa65729cf8f6db5043f225c98c5eea672d4ad51cf632d84127ec9bead032a774c2865b9fb3385cc03f113f0dc457050cb02493c1fbea785c8c8f16d418ed75e088be8f7313e68bc1b88c4a35fc39e503797d14803a01ac9d37870e952a90dc4522f63576a015844a99cf74741704e8749d945229cb357dd4e3ef3878a68f46a6bf51ca529d77c19971ea94d7e9d1fab14c031402cabf07aca65ea57b9d59b91acf91d7f18b7685781fc6238a626b731d13237d63666773955a1dd41571f4276ced6142beb74bcc15c57a0615c0b3b3e7ef3b3edc511d9da98836dc086b8e3077e2306ce37c8d3f8b8ce369a4f4505d2500557a1013ff431282ea858725fe1fa6f3eed49d52db8e72bd58bb16221c24957ce2c1b550d52647ed0f758d69dbcfd02c64b559924ef31bb34459dab6a42bebdaad3d1cea54d94725478f955493f53a9709e2a411c4ad2498c073cb14a426d76c3aad6f08459e22a856df1b6205ed613739d44059f9218c36b765c5991819811bea11aaef1ba95d879432f929d7b03762d106f5bbf9c4abab2c18d73ce8ac87fd40d7121b844a4d72ed2bcb2230013bdff42aa1fbba7c887407d2fd44244c178b01cb4c262313e86ff6ff27c53dc071d51ef96ee50360eef0631e31da2e024ad96c80337fd1b2f27ab847942befa32b191491a51d8144c4b86b324ac121275796827685d954382f662f95b39c0da7643b31396a6b9cb7181f232ad9e7283f7b24ca139cd3e35c4da865ba8a74c39a66668f6a56e4c0a4b75fd688e246fba48d9bda0ce41ad79d5d03cc2491b6015628445b6b9b2cd0acdc96bb0bd9de7d72d2e4273089c6029134b6f77fa5213749105456ed713218c144743b1aabc43950e4e03c087dadafd67fcacc0cf6022f639bf0eef14988bccbd125fed4bcea1a62a096a69e462a4a940f5e993e0ff7c82cad95c020aa67ac5dabf5d2761cdd313d2e6f4847ad6edbd383850cb853ecae5db125600c7313726a34fb7fe4fe2d9aa3be282729847a4bfc79dcf1cde6f23c323a64d134c5ad92c252a2f552baf014cca39a8ff6faac19c9b48b798f1c9c73650a3647bbfd596537a1bd9ae8163e10d83ffaa127df605e00e3fdc62b79863fa8e393d4f4b4ac281facb1fa587dd55c54466880cd459801b8addf0f205300ff31a8d9c3df5ca4d55040153dd1a25d1e734b51d9f446731e5bb541825e3a19af5a23a87d6a8c0c3ae55bb411ee5a5ce96b47a6c7eb7197dc184468035a9fbab1d6283012e6255594b45e56bb6227462bb5c7c4090a37702027267200d81ecad1c8ea5f3c47d9982851f86096070398ef503a69070654dbb82693b46372924730d74900f2c7fcf3763e13fcf645055fae30ba3e815bbd5e4897ad6e45c309576a6faacddd2163e9d10d0df06d21606c2df12f61a2e2b3f7bd29018e395d0a692c3b8540d3b142b847a30f96d0f319e820dd1acc98580abe8509a7ed409e467e753bdb69dcbc9e684a09ee2732f10a541212d1efa1d4208c17a42ad623f4eaf6abfe45c901015f97332d2a878a68c60095a6481d6ba3c7123bab0b1822be7ba1685d0c2bc1fdc1cb2be451c5a99d7476c67b6b129a600933e6e8851388fc5b06027b80a9d8949d4855cc5d250f832c9e01f66592a91af40403e79a326eba3c3810799e438a1b66c1fed61248a2444155b69996134059f4deacd0dbac108de722c1d6e1a50d741584077a12834c0eb76f4111f8d3ae85540539485271157d410245e6bda8cf483809106603ecbc633b4ac827b5588932fef68a4270c285e4d9b1c19e73455e5edb3895c2e090db2b1699e79d0320b1eee0be02bce4983a72a593ec7fba45bf1e74138b4ee4e3dbce35d5c131267b14d4ca490e2ff92dcb3f50c0190b18e0d96616ae710d31a073970231913c546c04047b38d08b0d0b393aeffc750b8970582106c749d7c021a7fe096585d2eb4e0ca28f77b12910fdb030963f7b18405ff20be2ec76e75269fcce4e458c93dbec1500e22a8361e9cf10f22f91171f0c7ba7e215b139ae4640cb405e8bcb2cc4fd9f65d80f3b7004b4e1a52490389c5f19681eab8012b81dba2ade793a8904af18d5f9ba6163550ab0d80cb3751dface1561faf717a8c113cc14f465b3c6f08075fe6eb4b41b6c8911a3c93d93dbf8d5df54dcfe6a9cd17550461f3d0a49923390dec98db6381bb31f5bb58607db3c404b809dd7cc349a2efdb0fbb752853a98741a4f33f92f30f20386547c841b9b9381e06eb002a4e5194cb92934d6349c15385adb5549ea298b564828bdc708a9fb0c263927dedc4de47dd0ef8d6752d1e53b2971fd3623afeb66fee73a0d1a666238701d1e746e1f9bd95ca5c7520c8694370073dc483d12955f767d5bc58c23f1151611528eea82c3d50277b205835016e2229c8616ac8d37feee01e4aacce959a21998141429b9027b088545473e1be1a0fe004815882a1a929857eb63937c839166e9a444919242aa1ff9487882c58a4a1c6058c92745d9bf4ddecf8ea1b40897afaa492c2ae7b72d618fa083017ed2523a07cb2a89a229f458a57586a4c0d9ef04cbb16f0a12a93dec5d525a5d52375f683e9305fc04b6e1e384d9c9e48363ba8dcab8ace1a89c69264b8a4905c786498d1f69f12c21c3b73a93b86a9c9f1d21a5d8ab420f7b42788978dddbb6e8407de23172d0b23ca99f2ef25755f82bb70f3501aaf6cf775bb6c34eeec5b88a20d3a28e613aec85f4ab6313d5f2238087f1f1c93d49c4e59bdc82b50262c05a75210c4fa88fa28599baefa3e1f14dfb05f4479c0b0870f5ab9b8a988c0c88f230855f822fd6a3a70a65c225269b37f185517fcd9da1a6993ab9810ab2f4e70ed3f0fa63232102a5e7a36906332715a729c5a9c18788a9c8a3b32e5322ba792ad05d2322b5efbc3e3f96bdcb14d61fadd32f74dbd4812bf5783ce0cd8b0f85e771c0914ef60da064c66122910f435d5ccdabd24a8f74085a3a90e950ef68ef8624ad063fbdaed262c029615a386e0f85554186ed149a13dc90bae864006ddb845f234f082fb36edc80db1d91b665936fc066a375990b0ae338cd9109f7c255decefdc6eb43b34de4149a23574d678fac01c0d57a673148c84403aede4e6d36643100ab90edd499b7eda42cfb8c16703c89d55a6d3a74992cb307a50b941ec9dcfe46d5ac96e8962911173c7e35e0bdd7e20d70d9254386741c246e31959e4917177e0fe26e0ec3a358e4f4fdaeb7a5d80498b7aa52aa16025ea553cc0470e759fd98cb3b439a9d33dd009d0949e88f6d38f80305b7a2a125145bf07fd43233312018aeabc9afe923713c985deb577c8e8201a128b2ceaebaa86497de491d8f9216fa957faa946741226e34062a0e809ba2206077dddb422acb36aa7597f05072cee1d54abaf7bba47a123c6c261a3d4fadab4c51143329c565d4871dc4d1c97c436b2ee80405f434cc1044a377e06e9272f7f3b84c7494b984b1ef3d0dcc38b1e1ea43e1a699e89a88d66be2223b80fb2d9df2e757bd2f329c719aaa4ab0fad47e1cabb8b030928bda52ad56dc478b1c4e281ad1ed306ec1a1537d68de8c720e5793392521cc28a009ba2a1a1294794fa213ffeea27118ba1ce92cea9d382354d89446f168b88948685b58e90902b736795eb9eea5b8b25d12db3604dd1fa69be195cda27b84ed51f0b49e7171885346ae2e184aa195d97130e71c9dfee70ffd6af293a9ad378b2e8ac6d44f38ff886d8dbceb83884e4ac4f4e6414286f90d24c75f810c97a778bcaba8887336370d030debfb443b12eea31ef3e796229c26514044c9efc8ba215f8eaa150bb83561087e0cdec5721b339942ab971d5a6b9538186c4f042b10ddd6e0233d63b4841cae560ec74c0a0dca4de251c567412ae3453d166d2f637cdff9ec2701d9d0f48baa0a6081c61ac0ed60c16cc8261f03ca11b7424eccad0f36d3662ca6e64970c2d63935b1aac8bdafe4743932b45a4aa7428f277335cb4d043475364c6642f091add0716ed37c4addff9644cfe1d919794eeda1acff0c4d0f42af5fe923404dba1f46b5e0dbd1f660ed0f1ba294c5ce4634c2486915efc4c13c3a458a221a38f915550974609418ac9a1f11e0b7a8f607462528a890cf9df3c978f3d95037742976c97bab2a1a6588c8d45c43fc538441248c7dc11e9ba0738427f962048be456c594c112079772d6dec4057cf3f18ac90bd5d2b8f260c3e2080f095d2e2fb01618192ecf86537ecc58e0cee204cf6167a33de1e0f9b220e5022fc618ae4ef57f0ee72a85e031cb67b7d31edf2e26a1ef57f93074e6c09e69673ee13680ef9896dbe496878796357789b6601d030de44dc6b95cd70bcca1962f6f5caf7a871624795d3945ebf7243a7f961936d3636186e265ebc8635279979f28c4a56b2f0707aae1ee7469417557740f55590bd49100e4f87bdadf54d8bb51512f05db42e8dad3e8e5a9ad4e1805b997b65df625a29b77719a06fbb05de559e2c7e8cd4be8dda79b491088eb7f56d6d845dc9f6a90d5c036c5ba2e46d00c1bbba98e57a9d3d45c7534cd3b9e18a00d8201003b66daa1f454d77b062f68da5448c0489cca7465469370a891681d3bbd3ad259c4a8f62a78fd7f00dc9cd4c04c4273997ca352cea3ec7827491c1886111642a94568d1a7f4cbae9be3531ab83e137dce3787967cec7fd6f2980da7adbdb888b1dba7f85fc440b1f4529b497188701887e7d07b6ff641602fdcbb50c9c916cc41c980ff5ab23a5b7214f4d7a1bf82580ad0f9db7adf19823f702143da8e9cada1290ac467d72d4dc86eb860747039c2dca0a6ca2b5b5f32dd43eb9e04e6c59c1b03958690f1773036a9f5728de58e515ca786bc1aa76343ad8cb0ccdeb9aae9f7694779f7051d4e015bee13107e36fc7eec298573402e223220536e3a9929ce584211e1a967d8c6d84b8b72f5d86ff8506b79c4c44cc64378e04718b2b532e8f3a00bacc8ee4e25963dd914fea107f57720c7ca89c90c9f141e3fe9b7554a72f545a892bce72a50c4f3522cd0749e25428003420c6c1db6bd162dea40ad516a7a883a14bd1e4a1c63df147058e1105f902f557807f57d15302c4c681c9ad9c646173324c7ce25caf50a1c1e9e1bac27e5c39198602029a45b3ae0368b6514169789b92fea2e08111256f96b26996aa95b62709df74fdef130441ce0c9fa86d1e683daac925ad62ff126129c4053353173581fd5d87e62769652d689b7478502b080b0e06401cf5c43f588627d1fff42789c3a33235187cd4d743b69551e7591038c17dfc8eb22243dd3a1818c82c1228a548e0b075d3614c41f56c453c5a706068adc44063342c8ac7d167785a24ceeb68621a4f68c1a290ba1a0ded9055e08bcb822aab7e1a6e52a8eb57cb2b698e2f44bd9f1f819c7aa1fa9f7e436231b69c8d0fb9c972482f475a569c08d210d339fc8ab4fe80f265b9dc5932f6ecb40649884f8ac8c50cc0599470a883f30edfdfba9f11cbd98daa113a603fb7d70357b1390e055a9236f907eb026bdc6f4631dfe129aec14c9d69488ac03513c5112ca5d42acfa210dd2c0e5e83b52f09e4efddc01f53695599f7bad5b9a8fb2d193526322ffffe2c70e0fc5c5c3c6d32d9cf40f01d00d30264d5168125ada8efdc0107b6259a65447c1ae53838c04ac5bc0c1bb3b02ef0964460b470de4230da456c81c4731908762b42f50c3693c3e6d65e79566576a48cfa381eec267781052d65c2fd5863cf18fc6d9038691fbe2e721c06543cf4555b00df5dfdc7d790145c1c344a565207bb0d4f57cb0a7ba2681f235b412b595e6328ec29e03bb55055ce753876b94c03a9b706ccf4f6c9a57b4d402b97d1fa606f3b0636007bec6f06f967bdcbf8bb92db69f73129f0c5ce19bc350851f4d62a87f4982d77285f86cd134e0047b05ac6ad9ece32b5aaca6a687cbd9bedba659199c12ceaab28b37f5f3b0b353e2b816e2d6ad0ef0a0832ca5c10871128ede41e486fa168e84797c5040ce9aa0698a9e5c12b35b76c27d722ac20895b3654ba039f91411f9337552bffbe3ee1f2df241c49bf481a3c5c7010862af380342d6bc8d65dfdec77bd90d01ef8067144b21caa7b0bd2ff931a10657a79235136a2a8cffa60b1de1d21efa19ea20ac7e30be43fd1243cc5b156252564179245711a9fb34478368a031396d2850d8868ee483ffc945799b686d51574fcb32c9782d3c15d585623383bdfea9549c958cdca53698f6410677291d525cb6480141ff1de03cad8c502c05db84ccfff1327527f7f77687bb1a503657877e37e5e1ad4f492813c760584bc88ab8e35b83216bdda280b4f3ffd5b416afcaae531ecbf68d54a2f78b0829a87114a54a69129cfab053653c1d42c9f4a23e8f869f6040fd4987ad00037d756de340d73e9fee30a8113953d515120875c6e3444372d0885be939454cf9aa93c49e93f227d74e1b124b6aca84a2e84140ffaacc833616930a4c1593d98d41c5ff3ae8817c9cb442cac52245bc4f021deaa8b5d1077b94baa0edd7baaaae6d15df935c8ca4f9d779fa3506abea693be21ba1422d309ad08a5e2ed4db2d67065bea67ae907240eae4eb9f40c19383b6d6c0c93ada661eb5c34910a50fa273179032fe9f035a4d328a05edfe515e4b730577a4f30bee8578a6d050e3d346add7901f7eeb345a55fd035c785026cd8786799f82a0892e0aa3f6e3a432347998c1e3ae791e5e8a0e5bfd048f5a43f57f81ad31485fd06fc19ed73bac8d9b8847b5969e1bb4c6ad0ace222aa03b5b963361bef3ed2ac4d714665597e6aff8d87573b73407b8908998a410700cdcd594a367cc51d1f449ae9d8bb2d7c39a007d3fcac4f5cd0aac262e17316016c7ad334e4bc17bf9bf540e8ff1364060c8145f88259d9134a8f98113a0d1860bce19d92113a52526c714de46ac09682e8d7766cee86c7162c7cb2bc42e58f3cb484c159f84a721866c9a14807ae69332026b5e0d620072b9ced2e1fde8d74d5bc8625e17b58a8227f3109d632ba07375e0606a08665e770a0dc8cb29cf17b938d71d205d8f17546208e4f65ef771dcc2483df9b46dae4f81295d97181427e3fe83fe0f7c27662776514379b23bd99e949ec0f8b142fd913bfe77cbc2efa9ea5c6be1953fd39d0f54a8bef8920befef2df5f50f2bf2039566e2e35323ecc8ad068e50021210774c1e318937b527b147d9b97e755bda925000753f6ce6e93b28f9fac963cc9e06d602ebe9641ba01336aa80c71f8ace4b0bd40ab6bef7a9f0a9496d0933fb186e9e6fc30401992873c5828cb687d10585ddd06b47551968daadeb55af2746ccd3281410adb0664b4bc4330f3b3609f725b6cdabd610509907c5c9ecae789d322c9e3e29e0d43008642ad2325823ca198ae0e5de17458aa258893e898756dce7dbba463270cc3bbc4bac557cc32e32bb760655e297f716862250855a91cda9194d08a864b4632286b450ea107f3916532986e3c80bc6b23390846884880c03e644f1959d3a21a9c9dc48d4bc8dba4f2ed35f14db3258496870c5cdb198e20ce440c7a7dce589a945601aa2885a513dc8c1e535f795fb55fbc21ee18332989013a30f686c8693e41a97c1640a1b0990caa0050868610094e6d11a86617f63b3674eebabac1301a6e5abc2f972a86f91a9bac1da9774055ed3b81d86b98c51a7a3e4395648b6bfe09e57038cc8057c6ddde8b94aef282bfc4e28f8d306162123d266a00de11e43fa9cc6b830ff592a71520c4b522c517e380bb7ddefa6bbce4028b63ab0f687f2f9be0a9895950932a7dd29032a2ca5932c08a76ef5412173bbc30d1a9298d5700288cbf87cba32c6c682eb7e72c592e3b05063c98c36f00e55b989eb2f68c99de50b869a7700d459ec2c201ee5c4c2b4abc8d3894f9979585d5786cb2491d508d54dd89d8a9263d2075368dc22752266d9883397963f82f35ad74ed316d8dabc19e52a4fe3c2cfec96edc0200ac9977c3f2d2740d9bdd9f26c22bc2ce6f12955e295d9db57e698bbf2c7117b2a5a1f513b5ab0f21cd4dc05e3b7b8233a16d336b2898df1002ec4a660544bf356236781052df20350194c2c36d534b66f9d03792098c030c97e4c341437c26a79fc4ab8101cd2612b8baa5b9200bc571afd60d414628b48fd48b5d6a6106855f4832762df3c390465feaab675891becea58952aa44573a1dfe522362e4da160d6ed8680a226ff443bd57a49c5885813d91463e8f6bda4da1d2444c444c9fa34e6ac9a3067e2023841bee124b9c50a9a44ba96fbbd7d3a817510b96d1dbe75d30dc7b887f43704377cbbc1e37d2a0ec7c988ad222a2ef6f5ea672c354b8c9be09c40c264a218a3633b2e17b809aee1fd158a2671b56b51e0cb4ca0a7684fa8b521850777b1a03087ef332bb9fcf9b7f33957ce24c25dd22b939c34db9519a098fe09e051c39269ba4ba2991b3d6666f4fb2073244b98599a51efe25b8ad896f6807d592b6a9d9b2c7c3b29198e01062a72dd821f24cea2abc039a347ccc0176f7678bd0cb1959e4b8c631a0abadb2a2a4b74290f7918bc50a57e4f65fc9ea3dc0360c256dd77fc96b2105dc20c811c2db941b8ba4843765509eab35b783060604b50a3b9d44193296ab7dec2c3443d0ce68c7dec6a21c768a472766b1c68251bcf058c4bbd1a42da5c9a0615f3a8f1e37eedbde08513f6971bbfc644237ea6bbc1f4f99209fa73f573c53b6d060c8423383ab088a06d1c8826361fdb16ece5cee32351f56ca1335c7e1404d7ddb54309ce291fc7671a90c65ee5bee939c11db1a846f0907547089d7a62b8b636b800f5e1bbc063d02724a8cef5db3ddd3eb10134edc649def795114a78f46944b25625a12048ed57d64f03305d157218fc556f2b844cc5ace5165efcc33ce5e592503d47d69ce6bd749791a7384f9d080155a8191cde34b1d297628373ef93f4de3a1a06c5554babc8a1c32e7f587749c11544099034abfcca898270e8536aaca94610460b28d52cf01272f7ca12201f844a7091ad2b1285acf009cc3930a76c8b82e2e43176bfa394f13a82d70707cd51638b2bf960b01ca598f6d4d012b217ec9247621fa9d75894aa8e856f6ce9c30c9e1f8cc85dd383178853d84678ef5563a5d12d547213507a2c3bea3dccc5d377f5b630834abf1306c380445107f1af497c04fce0bff060f4049f7c585543dff5677c4099c7e71ae715b17828649d13686bc47614aaa1109cd9835f2c8a2c1cf2722e0718b54a427ecf15f07d65640f7c96ec3e43181e484b206212530c3ae1c62f37b36d25461f6d57a19662da52a25d41b31e2248c347eeb98e4cf3168b2bb52cecd132aa7c21e9e454ab12f920c1dd3a2e746ebcb08b5f881afc97b32664a3ca969e02e78aaedaab92c5308331e03bf7822a29db0f4be66b75da2ce863f9c48956818a9a316dea1736994a0a101383d8bfa21f6163150919dcbe41dc30dadd2f9b0ee4c0a32c6c2e53c7d4e0cddc11ed7f365a60a223113330303b44b4bcf9024e2f91949ac4dea18727b1ebe4ce3de1f67d263c5b292b1b8dac8494ec5aac36f0d0681a1b9ae59c7fabcb498b0aa76a082f072fcf12811dc01b8af83676a00df07a1407891b37ad365b3d171d0bbc8dab7a42aad54dedc173d5731a784143ff6ee6cfa449c65e14ac2081e2f0406ac43ee40dec8a596b27bd4de1dcf542f21f4c7de9f7a0874b792c253494f0e0a00e1efb8918a17d4b1e8d8f9af826fbb656a71ec637541cfdd779d9385758922366692355f5d1a7f8979d6eb2a75c0bf00481d7478852f35dc3740190511e76ae7ca208f6a15f5328276eab0aa57d0b4e7f1c4c2cf7a82286e36695797f300dd687fd4e782bce2070bd73fbf9ce9093351f4002ea07b0547a835a55ff11164701d66f349169eba69b0e09f1a7c76af54d591037d83f68e1d893d8e139be80423711fc59a2b1f6b746fff4518ffb5c0c359343c37998215d8f08a334869c25d4d8a15ece72699321071c46e807bf0b944140d509b7ea76a265e5c33d88126a5991a7d78e002876093963ee76faa6616a2273fcf77391364eca86fb586f020d0f3d917b27643ac42bfc5d8e5a0076c6e357f9e0dba994b3fb0cd3c59592c1f17065c32917a67dfd942022554a5756874e811761d77043c0909a204e775563f89efddfabba8a1403aee9f67244053d98f91898b7833746d99a572423d6cb1b1129b4ff87dab854f0628f5d9ef43c269359cf2a18b6ddaf91dd7aa940f9d9b154dec92921b3c6ceb6d09746fb4e8a13bcd1d929af3f892a38993ecae71778d01e49f0b5ed1f9ac3cef7324f88a384b0f2a578585f321b9e5d2eeb84b5d7995b0fbb513ea377334e3155901d209181b41942ed8df7d3fcb144adb5ac8d64f8c824da1e27076d1a2c908620726c77475243d50b6c1ab26d785df9f2677e649e1ecc1ce7a96954ddbd3b8e6c24a8db15bee7f788d31197ea3587daf3906d38e7deb16ebdff4574af0bc36efbcaa270d3b57bb0a424df436c4101846f342b4abe1ad8de337199f20c31d98e79bcb6e2534b7ac8c1759586b31008dabacb7a7fd56ca8b11431c836415ec9d4fe49593e34cd6e06d565d0be96736398728f77051e936839e335208b9c6d7434859e9f8cdda145ac08ede05b5a922ae182a78a47a282247d1dd24a894fc90023a9b9bc5e94d21c7df0d633915f73b14f36815acd92557902b81f90afa98af661fdd085c5372a41907d4cda9e150aa5262ab03cbc195ae64305909dc70865b7a842943cb7468c365d11ba97b10289d207c8815e6d929436449a99853327391aead437905588811d3b7d75fb4c74e4eb0ffce43f96155041e1bc204e899050ad03613a5bffc678a6dbad5139ef51448c7c648bd748aee17a4d7131557b0632f5f8292b471c69e139f5788f8785a2b12836d0d6076d068725557bc5bd174e153437603c96baa4f912a8b904879cfbc87d829cc759711d02fb3ce7d7b09a4a734ceba2cd85da9dc275665a7dd19b4aa94a5c03e38d3afa803ced96bdfa34eeaf691c236f80d16ea409b30d4550d36bd56daaeb28163be792e77dc5e53b151464c8f0d88e85e593c4b4637231b921043f01784dfbc3a0d394d0041582108ec8da12b683690591d368fa976aace2dd36196e24c29d0d0d0538cf5c77ed6ec1ec6e28c5009a73145e6193431f060515615b61429bbead88e009926abb5ce0dc1cb948d61ab06444904338e218b36999c3411d726ac556e65a8254a5d13b7bd11221844be4fc9e7dbb1ad137f9aaabad6d8c622d1b03fd2ce64445633752a2a8c30c23d7c56b7d1d9b1f94f53707d23074ba887f093ca9da867ba9486b6cb9c8eed2b5e69f7d670c006c53dc487b27d152b3aec4b5d1aeb8d1316d388db5c568ac4dbff707ef0521a14b8d55c09ca3189debb1d2b1f8fd7fb2577e2c4d65badef7a65441eeff65c9015eccc3265455728a7cf5ccfc89e9fc75fd5c4de38474551947f19af4e04ee2c2b6c48796983273a1b7994fd68d90e8c32b4296d477399c8fac724f24198d2fee581e7e36032a4859bfa6fb88bbcaa78526ef937460aac5e03fa71ba7e5c301616a9037a5025507ef2ea23665adbfe6908923c526b7e0e6535da22ed7718f614db3eeabfce623b152a8f6f51a79b0af0f81ae6ec38c6d27c3da1a139ebb12f89228c88856b17a9bd04015a5843f94d08d9bbc9967b4b99929401a607d907c4076088086b9b4c2bdc566baddbea0e82d4bf0ffcbabb6d6db7ee21d847708f2528128d461f88473bc02548514a7ca31f30fdaaeac72edeee207cdf488bf932f201d3b723c0a5df3c4a8f72c093d672ac05943ef5a7eeee943aa594babbbfc0bbf3b8c0f47d94a1554dad0c569ca1556ddbced02e3bde8b7f2c397106195a5593a10233d8fe19dc855a05da45a717f485788e6d8b44088e6c914b6cabab7e0d15309fdc116cd236e02ac0dddf52965b07abd3afe1e62e85e4fa958e73f678e7ea3acafdd218a05f2259a995ed8358a5c40a72a9c3e4f506120d483608f92489dd6b395b695a56f83817517289493dc06560fa05b05dd7756fefbd5cf7f7bfeedafadcb5b7b39cadaa92c6c9fdfe4e0bffa28aa9fa6fdda80f24022842e06244442e716dfdcbbd5305c5dd69e1606fe8a0a19476dfa150d7f47e214a2fbd1ffa20de7f546cfa7d437f437fdf47e86f2814facffb2f44bf344dd847434f81c0337428e4ddaee36c15b1e5018d149a8640ab5c033d41203f2c305934ed6aef41af431ee007f1c0af2215638040930e7a1f04f4bcf7017a1e08820bf81e656895ff0fd83ef7fd27ea68d2ff8686e6090d1936c6b59da27bf906e9082e80640620b3a65216d0216e984f9863f878fe2ffd027fe547faa10fb2f2dfdb770f9cd346e7cb02b3675809f2fdcadb0fbd8f95ff3ef433d3b1c7ca88ea8185e83c0c1c71c09fb0ef6dba14fd0672f28cf701779eaff254fcd133def218fde84ba816484f1f7500d2d3e7417a5aa294e2d28cb16cfa9e8a28fa163d49cc009d221adfa60dd026274daed872d2f46ec28f7b84784e576f113c9f7e024260888a48c1ee744649fe74f6b3f66af2698b780b6a4fa3e39b2108babe2f140a7d5fd27cafe38340bbbc226fba77ce2f3f7f2357ea66f66efedf9fbee7af82b4f484c66928ed502804e6649bf69edeefc423ee971a5f510736d1dc4953ab1d94eec8ed8ab4cac9c0f7bba7e188193cfe9ac1638ae189f99a73081fcc9afa0ece1ad7410ee814d995c88e64ce785f017f74c6973e88caaf7c90195f7afb313860be68109e0d5b08055979950f52fa196f1fd5df63e555be47e9673c0c2baff23e56461c243d54481fa5d18511a76b02073488c1544613bd81123d3d7affa0ff7d87441a27609abfef75b4ca0f40ff13fb47e20ffafdd4661ab640f3e83f1ab6909379803ffad1381a512d887ef4281ea21f8d2f73451a8d9ec7cca3f1cb9a7bf4a1cfc958fc9e7e2f1243a73cfea2c149ff7b31a6a15de0386bd899359512f1dcf3ffbe102d4279280fe5a9f90b91aec0776ca9a27056355777d4a10dbaaee338b7550a8d2cdfb889a15d1aa0b4092626cb5fd48926fde94fcfa0186aa0410ae67e6678c44783bfbe918686864728c7e003a631b8e0f4c70a1c04498fd07b1fe4d69d4c803c81749a641a76ffdd1ce02048827c7fbfbfefc3fb100a86fbdffbb8ff8d38487a7cefbd8f50134e282206fb469726e009f3121c61069b30245d48b45102642ac9f46d6878e86895d3a7d1d1af1a5a5a4a359fbac2fc6dda35d2f00473634b252203d3af34db1d16dfc7852a154363f939f46e32cd39c9d0f7d80afdcc27d6605b3ada45c723dc7168e8de346b42d9bd1fcb23badb420c70cdf443ef893f3ce441a7e40cd029dff398f91bdb1b4bfa1ca0d97b2e24dea7ddd8d2a46b81ed88af480998da276aaa1bf567ad94ab1dd785375d73ad56a95aa5e3851e31d07722a5a4a30d8d8d116ead88afa3652a12754b4451606ab34dbac2a44d5d93aa6afea45dfd940655a1221a129fc584af373ea1289c326d02f797150499d61b746a0e99be7fd14518b3c6366b46ef4fc8f47d8c4c7d4aa6ce844c7d0999521723d3dbcca3b7699148246a95e8673845a2d7e637579e783bae432af9d4d1ba147cb55f1376a9756b6bad96eb1cbc5fbd5a02696e863cdf5226a6f9d3da5aad73b7db759ad3dad92a5badad0e1ee1fbe60c65c955afb5863cdfa758968098f27ceecbdafd5c9bb25b6b476ae39d58860700c5b27ed9dffd57bbee6b37de12c40098ed0804ccf3c59203bbecaa5b0ebce14d67ceaf577ab9c5727a9e9d5b2c2f0dda63e215d75ac7daaab68b00bea152598e9b007ef9e73acbe456265ea825c084d2914e55b5dfe9e06b4f07cdf4ee9fe9b0556d5703bea1b21cd701fcf2cf75b6c5d4dd5ac2def5c0b5b9b199d9c73955b4e2d4ebcdb9aa4fbb31ff72806f9e40398811c2010ef304cae1c937060ee50994c31640395cb1c3a89a85aec0a33c81729805619c27500e3e59958311275f5437fe2587582ebf657130e7a7307dfaf4c962f2aead2c26effaf5f69eb3a67d4ef790404b1312309d7e8ba86e9d21dbad9f46e9ef1813727f0f699d767ddfdf44fa7ba75db59f06f9eb27a7091f173c6189308c3cf101d6fe8212e4ee723f35d2230619fa6768d74aeea72188dcfd1ec0b92c1d96d82181143818b20258bb0b723fede9c27573bfa8ca10430b31be18c10b6244602dc8fd364ce47e039832f002db11536460451753606dc40630f79020729d4043a460d283154037f8a025cfb9c2ccdfdff0e6a3b79b183914fa2ebc09f51491690fc9ad13a3b723b8a4b7d38dbe0d4764ef3d1aa55d657d2f0abd512851ca4aa7927ce774a9d472575b21e021dbe04a60e0f26ff4a68ac5622198c56230fa559cfefabf22dbafed9ab9898680cbcff46f47a338495f5547d5979f6f4ed2131d4dd194ce59c779c7952aa6b70a68a53cfee8be9f1b5108680ef4e8fe33b471b1945d9c403bcc728b3494f27c2134a7773efbf5736039b0926c364322491151cb0de80723d8ee1334d0e78925b3d91345f099d12008081bde9a40020a26ae48c2c3fda2882783e28b1d24a0f86249121d2f566357f8849124766bcf0d9c0645134320c3f280ade83b188b28f60684c5ed4682da039405122eba271d0da807273e403d34e1eb012ac108785057b329580006adf37c6430b00149b6439acd6444642e00633399144a84cae049215686acf6947145282b438cf945685034b1d337289c88d5a05862c909f27c7056b3a26fb320d86ab320dc389f991070c8f3473116d03c66c4909b0a7450e2062f1c824d797e0b913c5fa6d9145f0c99c934a60af2fcd2bcdc146fe04dadadb37a0f152328307deb95ae9d9ddd82bb5f3ab5eeb6549a61ab9b46eadd71959bd5ad7badfe396dffcab9dbea2d15757f6955fdea5e3d95128c80307ddade95f30a4eced6aed60af6c096ea4b7593833ba8d5625bbf7b7e59bbcce5cfb35f77f7ba312a7530080cba6010a6f3d6f75abb7b345bf585d76aed8de2de7b6f28079f10e0eddc72dd15e27a4dbcd00c85beae3a570252fa3e0b5e1a08da0fbbea1cc7518eda2b44d874d62a0a45ee391085c224dd3636527c5f2772397ffd39d8899e3f0b7662e77abb5027f25973bb02cc970c55c810f2429cf74eeae06f4d5f2f544d2dff122a012995461ab8f1bfd539376127b1705f7253c1a622edfe0b81dcfd7e865842e21c2bfd4876b40902d39fb58ae85cd9cf9409180a85ba06cb60c2840913264c2865e26f278db6d73ad36ae9e89086a65ace5ffe6fa8545cd752dbe561d5410d47adcfe9a0cfe9d5a7bbbbadd3badb5a337d4e6fd508a800434abb26156028e9176dd7a4e20b2bb2dbd9aca920982b7f777beb77efe3396eecd1ef8d38383934cc5e90e146b3a9d526adc77deffbfba43184e2dee37cf47b6310effb47141704c585df02c31107ff1cdffb0ef793bcf771df1b8384cad603c2079f84228d9e88225d118fa8cf8c5869c4a1b21e1f596c468f9d599ae8c54ada33a2b8cf81adc8ee88e2c61786d078d3e7c06afc84e12fa98fcad39b93fe8f43ffbeca884343a11187d2c61b0e0e9d39edf328bd599ad8224af416251a5130f4d7ef416b5c1c8142464f2c061bbdca23e981bffbaefbd1f7e87e14cb4e1abb1bbb47d6b1aec763b55bac763389766669882be27492bbb5be793f63a5efc7dff9eb1000a6f2a31107498fd197469cd28ff08f469cd2d8b81b71da07070a53e9d957b6cf37a2489f03ebd04f58684491c617864c27457666694dcb8ef24161dd535887a4c7e843281842ff7d8f90e871fc433e3d428f471c97b9fb8cc69e99d76aa5cbee1804490faff49e26c08278234af4e0877f479468f431e22041bd709f011376471f5c14132061882196c462309f39e98fa3d3b0ef85841e1c513e3ad40bde5ff7c9fe2e64e00923dd891d9460c2e4492c069bb06f0c222434c6c21b921dd0a00959f7a5d3b2ff8a12f08e21b33cabc8a5d76aacea38e96e67b944bd101be519d6989dd558f6b733bbc4d2fcb928fed3ad2dbb73b1ec9c4e764e96ddceb27346b2733ed9b99fecdc6c4950e69c5c8182272c04a3b9f45b8ee5090021ddad1154c324c512401039010f38d0927447945827497431250820f0c0032328c1ed6044f757ce91b46a403902143a2c11842b909044b8832c9cc2faa046173d70420721ccca10e23603bbc30e4c5031e4e3de6d0410bc1d42d03742348aab7246cc1bacd005e3075caa54a616ac6ad788934d61018913cc8e48c20f4020051254d619c132f103ca12426881830c7820850cae0e40589942092540a243061547b0c1c76ed13c981a891a0baac1141cec000832f8028b18f8f073854bf7678d773f2109b38a1a5a5f45a23470d5d90c42c187224c21031290412b0306a1eb33d332995a70cbce76a8b13222a28b984ac89125c10230c0c0a107260c41628bbccc7ef79a0828068204b12060f013021ed8915c9a5e757be7360b68a99a99b72a014fd8c5a6b781560374a53a0089004a7f09ce7eaa059dd5e79cd3a953a77449a6ddac083c9fb6d3e944a67fe7f8a3c3d3fb814cc55bbf1aba304b4b2746e2a6b1e4c69ba9297b1eb57b8ea5fd43bbec585e7b6ba6de97f443e3a49452dad9daa2acfa34bcb196526b29b53473dc674aa79db6565b3fcad99cb05f494f6899a179b92b56b1fcb8f73cb14559b6b3ef2de05aeb71dc5bcb79997274baa8abd77441ec2fd91251e7fb8fc952045cd63c7f8b911005985354066d17be22d305da03154bad128fe01efb8b1bdfc96efba26a171d9f76f7a52bbb37e1ee47f75f7aa3eae9abbaf9b3edfcf9d56bcf8d56cd1fa3847ff4f8fb5fea83ee71c0e61f21076cfef06778130affc51ff8492a6ffa9268fa9cc2bb7c795f28903e051105714e92c6bb88739235e6a39e45fc311ff5df6c6141892d2c2c2c335ac672b2fc0925b2fc6419af492c3f976a8ce5bd78652c4db9344922fe92887f8658cec7b8069bf1f8ad6ad34bfdfa2f690bcc8df89a4ca63a8642684e68af0af03b0f7852a05604db340b807630a26798a6351202cfbeb767940b9218b89fd2bfd786d2ea73ce49a977d581534aa93b7577a794fa53a74ee90bb8ee47cff3ba11974c5d770b1078761794de3a0ac225c889a2c0a32bae37da62d4035c964641a2282c773ba765e006622d17de74a696735cd775375a2a105f10dfefbb91e77fb3bbf77a5e28f48537fff2228c7b04c39b6adbbbdbbbadbfedecb5ee95ab2d5cfa40300c455654e6e4502a2e67804ec9a4cf5ca59a8430348c34e2a4ffe866bab5cbb3bfe9461ae9ec52132d814bd36df5e3afeebf99a098a2b4abc6dad543dac57a7f161d1659bb5aefcfb2d32e199e22ed2aa25d3246da15f3fe2c4758926817aac7d4939c8a1153b55450abfc5b62ca49abfc5962aa498ae6f203dc4f533401fc5804ea4ba9fce0f224abc94e3b7e7b8c65fff246ee87f95ebd445b93feb46ce3ffe7770f23928c38b9126b39650f46ff1b4dc1f4734181822459bbb8d5b3b0bce9e6afd548d69af417850cf06030630a084cdfc69727198988b9f25f892423b7c68aa9c43243e54442b5b8a09082ad236f4a63b688483d73e54fbbf1de6cd6543132b571e30d5103540062796d882526450d549558de0088a5d75410cb159eec9f124bd24ff67f11cb959eec0f00b14c6991fd47512c5976b2ff8b650aa2ad4c39c9fe2e628b587a0d25965ecb25592b2f0b4956924464ff1a62e9371aa22dfbafb8d4b27f89ac9145647f95934c0395ac69a0e6d2742b7198a2954e2bbbdbdd29af4ed753763f993e6957d9414eda65dfd6ae59bf24f564b74fea6997cdfea42266d99f442339e9570dd291764da0217ab27b33520fc9c82cfb09a2c8256949f61330c925a9497692adde121a2d28a85d6557cb334f49bb1c08cca537f39a649f5a78b3ecab9b4848e7d8a874c78a6fbe7c1d386b66a61fce1a064c98f5012e6fb6dfb5fd20c635256e95fddb2a9bed7553cbbfa8fcd599fcd58d2d32824d2a9adc7223db1618023b7320f784b3200882604eee7e2ef4365d83678fe3de34c90e193061fe330c6d1d43082541516cd497b9aa7594cd7931aeb5d61e6774bccc52f54612848c0a2354cc269d2c14a901174230e207082aa6f8747aa82fb3659e11a480f822f75393028cfc2c81032448e8e20757f20dd101228bdcb966618258ce9127900964f508ee438004083cc9d9b6448540619c0c30007b680b01f6b4734df09a836ab1b09c165caddbe92e0870497dae678417a285be243dfef3813e788884cf6bb6e571db9343ef76deed44b52568115b44bb8a5cb7a2910ea6d1cc0d1556bd40356bb4273bed9935f6fd65a86190de784eac4093fe54948104ca30575b609e769557555fe56fc56953f8f966bb38c0e51f134f007c3d5f5fcb8f6628f2d774967fb4edb694ce48554c2b07cd8c00b5566f9faf561e337bf4d6eadece556be79cd3154ed5ac3e57eeddf59c7d29cd7789fbe52de5d24443d0f2958b7f4588eec7254a99b04b1081942638dc0a032078235aabb3dc4bd7755dd73d7d3a84e3387b39ae765dd7d9207e3c28ea0a5010537c4732982750103d950302e8072279023921ab224fa01f8a64d25c810337cf1a0e98722d996679020141c9b5f4402c16cb35986a52c825187635775fbbff3ab1ac23f7271729d8c71ffe9d67eebe3e37fef0af7ec7f2be11ddb71746537069ea4fa508f69f43e052f572c39db3e30dce0041f3058686b9cdc9aa936f5d147fdd5719a2ff76230a705973ad95b3b5becd5f0de386f8aa0d8a53971812c6129890d00d33e8c1a1439810050f4cc8d442466b2d7268d2036b1b644c88c1be0ab6d84fcc800735d867c1163bd683430fece3c016e7942c663218bde5a0841becbb3ec4c007f679608b738a2634198cc688111d188e10308b1f62302414a7633b42d0603842ba16cc601e111d536e1187862146184b6042463411d822ad82074a7a60df086c7186f1441536d8874798d4448ed468b01c2aa4db4dd0fdfd1eab55486713d21a62c80f0c09ea0034273b136ab62a8455860f4660b37194e09d619040093db0ea220e92eeb9c711e23121fe41848c31fb762c09a19ff6d3feeeeeeeeeeeee6e1cf4bf3973cc0a223b4a5c266013b0e0c6c4d3324be446cc49ee1a973da806af653774b2e8ae4d99abb5044a88c0dfe275efdc20c04ec01c57c71ec82836c0e505e241f902612346ab11d6d63999989a62aab24ee9280126b5457bce169369daa6258c5d7e3fbcd5bb97f6f1c3d9b37acf39a927f21a86eda775bdf18aa41a0af148e5a78a2844402877dd83ffcd2ebca1ffa2fabe8dc055c812afac658b3ad1fa4972c12492fc805f60faf32529c1dcddeb3d4d4257c8746c23702bb772d724497eb818f090e0a7bc798ec692e6127cd257efc3bf57349634444028df90c70d6f385c6a95bf29f4e10d47b92c0ac59212c916142ba5f4ade805a6449cea70bdefec87e1023e310c6f3c17aec8e5ce8e28d7034c05a64bf2fcd9edddfdc4d5d55adb4d96a6dd5ec7ee2faad7cad95a395b6bf531878fb3f6b9aed556f746f2957372d6ba6ff1dd4984afa35d296d253e0f0aa695560ac637db45bbbb85744e6dfa840e7ca803d83c9fcb73a473552715b9fc8db8fc4d6af39c739c5ccea914e79bb366d61c4ba90b3e1e33cf39e79c13680456985af544707fb24e70d70b7e5796727322edfe8a654ebe2038a27884ff037c7ff0fdc3b79f93a9588235e4d07f6248bf9c1c128180d91ba90ef4d6596fe7c009efb9ef4bcfe33c8fbba1e7aabbbbcf27d37598f3dde7fc2b76f33bfac4ddddbd4eb74c8c9a8cb2681b44518cb4f8685a453fbc99e30f94c82dc2e88726598cb018fd204514457884ef1bfd30d262a4c58836d2e2f230c262449b5448b18218ccd61e513dfaef1348f003ebff969d618e5404fcb9c4f9099c04af00cf6f317402d34a97409282270eb6dcf6e98f6618e5ef24a54da7982d99cd327d03f48bd226fd4d3f6c62d6aa0d9ffd46f5b07f41d2f44183c0a603eda024cf9087ffe046d401722320380a8e02a3627961eeb3f6d08bf952ae6ed9df3ec1250dcafea455cefd87654efa9f3249c6834b52cf9c1e66e07be23625d7d04f73870830e51e493d73d52ee33af1c8c8e0b031c02c012e2c89a9332d96141997cce3a0a11173b45aaf57cdfb7f35e2ccbfc499636a4c8d38f38b469c5945e5593c84819e644bc0a54b2da6c6d499168bd562b172b4ea4c4c4a462419211d79f9d2a546836266646aeb63aa8c58b6c69866b5582d1c2e19968b25c362c9e0687dff420f1a04826266aa0539d1e6af93cca5e6a28991f9ca7ad789e72493f92e5932ef4af180ce578a36499f00f8390190a291ac6f962d0525152525c535a3828e0a4454d811a388524428e24df442b4a164a8408a960a2279c85a090839c3b4cdc4e480d22e1cadd7fbf330e008b85f6439c94e474eb2d3cec9e7f4739a9d949cace81749762ae224fb9f7a4c3793946a0baa273a2a03b717e2ad5d5162de5f9432c6469d76a1627ee61cef3f126957cb76da55a4a75d38de7f2c623cd22e54eb35e2089a11a9cd4523a3c2734e52b5d1142cfa8f5e3a5dd48537a9a054939493148dacb9b4ac288ce9e634d3cda595b02a2b0aaa6d0c69978c0e111b3bed92b1c163a34811ed42d5f1d4733a1539f19c764e2e647992a1a80e254292ab15287487ca604493cdc900d8b0640fe953a326dab2e9e77489b6a9f237919fa2a582fc356143607e557fc71bf117aa8e281858f81def8385df310641d263f53b3e08ccb330fad8f12c3c0b6390d5ef183b23301a8485dff13ce274d2fb0197291a0b23cac78e877998df31763d4ec2882e35279b559bc5ea8fa2c0075056e4c87823428755dba5468570a9f90b660533ae6618c36aec8266ed3a65fa5fb792494642dc174a35a932c0291aa5618a667ff0ea61fe043132acff5a64bd0b172d1df332a2cb93b2b66246971a586b95cb935639abd6ca1a5d6a2eb656b9ed018b38739974016da110cf4e11db6c34faf9a9f96bf5f43d8fc895a568fe226b385dcd49fa302b91fa38590b6fc8da48b2c09c1a719224c9efb1bc55277f23d0658b1dbffaf2ee1861305e8db3bf49b2eff17f86379d13fcf7cb14cd5f2c3ccc97379f4ecf82986ad2a4cf2651789811852fafca8c9c3c5d50601acf12d4ae6eb175f2081495dc884b46e2287c417479e26253fd0c5d6a270a5bf171d205f0a54bad24495f9224591e4d59324f1965830054402cc4c80718557ab2a6123e160297c21646f9246b5514291d0de503e677fc8e31088aa5f62c303f61abb1a3754e6096209b8fd5c38ca6db938cc2e3ef1768b8dfa58e544e2c52f6276b79e545ab2ae9711d5982589cf48bc656b6769da2acbc68172ad62acf55d6ae51f6afe249d62a16607ec7d3a834768c2e35afa24fe15d6aa43a7ea5d797c29b155eaf1ca2ad569aaf6fd3a39e1a299a2c9335951f7f996e4ebae924136d346fd3b6099eb955c63c8be64b201ded6389a666028ef9cea5e9c6123bb7c4b23ecdc7d4114847cb35ef3f67cd74bd5c2b7c3f385d39be43b956d40e98f5df7591b5ab66ff0f05024c236b386056f8295af8e549b61a5334940eb8146dafaf2290aa9373bc4dbb78d12e54eb499e71a9b98b4d34d26a92453a9ee6a6009734333333332927a9a0144db4a5682f1c3968441d22298956f9d788a49f56b9fc6b851c2b2be10d4d8e1747dac89b9334723c8df08626c7b3c4b2e673fc0c6f5e6fd3a3293870fc688ceed6d79a61cdd46e36623322796b95abcebc3f09858cd2ae19f2898c487a31339236991609858c42d66cb84cd16c3c46ccf138c49a9ad7db740e9a170d1a34421e3493624452123f4eac9cec0d78f5304f3f4573b7f136dec697a64c73b24678e39a79168eb7e98fc6cccff0c6d55debf8a35fe63fea3232dfa3e916c3fa94173131a21a14276258d5742300eb6dba8aa61bab767777d7feebc2f25f0567be431c2f239633acb1fc4014d311b068aba4fa658ad68af99417ed2ac95a6d8d2d746ea568a9262bd93f754b45f15721a6c2107f1588f40b4c39a965ff54ad15534999ad5da568cb4fda4580ec4f7ad1ae0985d87f9289362930fd9ec1f1363de3c26162d55a59312ca01d0246b15ca4b4cb5528d6d84267964bcde54911d9dfc586420c051d7f0db13e35c8fe28c8dab5d3af21a32553bac8fe2814e95795b978d1aeb964ca4ef677b9b1aaab5cd9b2bf2fc9ee54645fd9da55a66807d06127a85d1447cb4c8b4c4b4b8b098cf919deb4a8073919f3a22d26e671c4fc4ccccbc4c4c4bcc7bc490a9098f78f69c5d4004fa71d56ad56a7b2582c11035527f7f8a33eeb3f96782a820a6f5a1fc3faeeee66354e0f6b2c717862c41248b543f0572a88c4e3af54edc433c39999af228e77e1028fc6e8fe6244d7b70c4b86f5acb7e9d10da76aa99b8c98aab5ca534d82524f52b676c97c931b993115d41267ae9d63c49959a24b4cd952b428987e49ae7e5a5fbe29b37eba6873d21ff541646d358a367fd56f8de547c9f563c6d274cbf559e3ac38c6539176b1c67266045275aaabf5fe279e76d527154132d2aa23adc23cb8f4b0bf503d560ff330230eccaf46dc63f53023ceeabf95e82d71d25722cc5bf101ab875975340ff81c41978481abb71227ac7b0339b947cf8a56cd49ebafc409bbc10d46f2bc810db73c803c6f3044083994b1b0fc67ba91467af496b07aff1696a096c912d4f2d35f2c414efab7bc684bd1da3580f7ff5cc0d194d11858646981010d83f99548612b25ab2573359babd50ff984b49d7e8664edc7c90188fd302285b104cde8193da367f40c295232e94b975a8f2226b00823368c65a755ce12e4f7626c32a158829a64fc0310c95aab7c35ae7e9c74d2c75fe28f9346fc3561e2ec273b9944abc89f0e9ef0a804ee75453d0a15d108040000003315002020100a86c562916828cd34598b3d14000d7090447658381408b328c7711c848c3186004200200610440819a29a6d10004073909c42480e7050358d50263a604c452821075c940437322dd99952a46a7484522e6e3200d29b0df7a963090655e0e05740e366b5289af79631aaf07468595ac7927e4b575a12971cde8a969a13f1d21a0a153f9e6f7cf10d6ed03662e64c26c2412e4bde605ae0ea2e2cad416fdba6b2ca8ad934a71c7754ca6505392dc5a8830aed8bee6440e08364dcdbb69903b22a042fa578e4521a25465894c88b1e98c5840b85f713f3b9a2f42d2efeb5f9a956b46934f10ec496c742584c8682b408e455de00a20edbde87ca3d622ed839f1b550f250b06a30fc805d5e2e55c3c6619425a9a0bfa3e0cb0464add7110763111e76e6f3a0a7f2b7ef4dfbc959a6d061ea396fda68c4041eaf06bd9912627441458a157fdccd57ec44cc83f3d925bd57df69f2535c3f349240947e5ea4338fbb9f2fa832b9277bdacb5e1e412a4fe9f54370ac8e6a794a8b12fd002dc5782f04b1c82895e57d18b8b9f92853f44fa33e137edfc685ac1dae082e9e9dfa1c84897d9f9614e645742e0f5285acc4323248baab2a2c3c5958f555f0d6835ccaa8f90aa42633d000a7c1fbf0b09a31418a82e37fb6ee8d6428acee2e4b9ed5046288514858cf3b2c26b07a8d06d197ca44c917609d4d5fd6d1f771708bcfceb3747395965a6078290fd94871133cfdb062b512ab28470bec4868610a839cc3b02ea15ed6079b4b8b61bb50ead3d666f765bdac3dc849c2b3fa9537d6b4400fabd86a568d1929a365b9c442fce702ff629d1015e782f6a559658dbd968f054c71fc31e9c46fd8933dc0a298fa1079181b466b3e47c6bbea82ec288fe1b5c076d586fdeac96be81e31e6377410118c3190c20b56835b1ccfc42e6d2183b3087494c1068610883142fab6352a8bb0fa48c9c92e2696e93dcfa8000f837418589994793f0a52cdd9570a3343f9c82a19b110b653e0d0359e00056483f341c98319d6daaeb6612c6326968b9b1407aff42c47f5f000bddbf13a8193cd5b1984a4950eecac403f6658c730639145b1272283b8ca1023c82e5622c34f2782160d8cbc30e96daf07dc79c10bd44681308b2a0b0007356d58ea1d47eeda68d1015b1986348a481a59d0a9dc18c1a1cbc9de4ee6624b32be0495519a15a471c3a42f045deca40ac0a53b629611b0e1f4437e058bca247fb32cc817fcc9a0b1dc6d7af41b22952f04c40bf9e84e476ddf7e9974957e64b0c3d32722a2f6b1f77e0c9b07c61664ccfbe1e7542515179e133cf954dee11c75ce261a3045f3a56736400e8a1cbcd7e64c1375298eab8f5459e85d4145550d97ec5b16c697eb103f44dc35f361003f665d62daef24f93929bbd99d7f9ee682b894effe52f7f1ab90c5e630c2e6fe00c3c7a8b4cc41e3ce49c0db3bbd9b1c59c62c48346ac07bbe9e0f2d228978d4754b5ee11d2218877ebbba08ed3c4719f78769a4b3039b0fcda94fd3678ee544060df31de564d82ffc53180915c0a1632c8230067ba70f874d897bc249749614effabeae8ed9d459af309617e31d49ba26639cc14468cc00c9e0da437b85a9c4d7709fc9a72084697c8fd411a9ffae66d9f5c192f906e329f46cb88d7482526b704185f22b5208771f86b6069129548dda23eab522fbca092d0a6bcac4908656449685f105b0e302e859000624e45b865eaf22cb744216b86b34778b8323a042933dea804b969c4b0aec4ab28235d083236f647b394960bb92698ec8ad05eb079eb29d2064eca3b54ed825af95a8fc55c1cb31324c72794880ea7fef1e64160d9c89b577e19254720655a0df6502896edb0f94eeb1c085bedb45664b438ae86a2aa89123219d8cdc28e1174aba6a16cb513936f73a014b8f2eb534ee3a0b2a2ae825b6a22a1bba40cac6beb5a0678bae520fa37331632957f9378082f19edbb35ac2e9f2adceb54b0a1e6040134c5f4819d4d0d708250b7d460a623492782ee6dc5d60e1be6561075ee963217badaaaec0f6b429de902347e94ffe035cd36b293402dc115d011c444a4bc83dbf129a6aecde7d89acfb6f72e7f8bf5d7a6be461bce49120ccafc7856a470e823b581f805ba8a515bb309892dce55197bfa4a99e44adb4528d98fce830ea4ade08bbe0f4dc295b2f9db8a9d9850a084d4d548cb9c35ae2e7143fac1de9f1cda5b7f561a78ba86f9357d43552d685a119defe8f4a5c8a99749b85a0a7029411e8cad61f117c2f7aca5676c8c64be5eba3c5225f9510b8522476d720eaa48175f05f175137cf327d890c9a33435c97e9f108a9a3e003001f9d4fd19c89a1df2479d2abd1253c18e529f4e0d011758d0ed125ff1b3006201f61f01fd64db4511b50be6674d45270e1987e703926333a83bb7f510ca2f485176b2d1ae4602c3c0ddfcd6d7607af623ed96c2bbe2e4f90dddb8b092114e874194bd919b2fa5e40f9ec9644770b0e000e2bbf5c2d12edb288c8022f56ce168a650e4f4ff9bdf1e32c292186771f8c0d5dad02dd9eb3895ae7075558760e9a9bbd8b4dade4f9ad8a693edb3a19061812ecc4d0355d6686d2c7e0f6610dd3399f13c8395fbe229d0d7246981319c478563cc79d6751e9926ffeea3dc40e4ba88bb9c0cc84d7e2873fe014db2576fa0fe9b2cec44e5da2a31b2d0c7f620f6b0f60840a0b4b20c03f28a767d04b918ccc8fc42370c2532bf20576d09d772fd02670e454934174d1a8bd2052b0edbfdeed38a8499498a41c65a6b5e1fd1ed11eebb1e8b676e10de1afa77428ecaf5bae40bf783f0e4b40cb53ca0a61de0540e68b98298a51319c7f12df8a54665ff6b5e98ec99d4466450c00df699fd340d7440bcb21827a042f488208b7bb2ac0829aac46fc9ca7daf93d21420a20b7884b83dc4222a25cd1db4c0df2c81df681febd2dfccb278331deffa0eb34f61abb1cc50af3e9a98cc76ded2d7190f0cd9606a266b6d72b39875f0f0c90b64d9123f68f7c1761dc3531a7bd1c4242d34bb296d4d72067abdfa6bf55eb48a92643561ac15ec9d9635b3000e2fea34744c1be592044ecabe84776f87fc69ac80317205419a6572618e20f47d9d243009572083e374368c0a8aabc6b356d24476dfe9a72446f4b22d08bd1e3c8415d600dc3f5ce32a0330e75c712d165524725f7df22c7c5ae1939b8fe565966e28e26ec3208f041ca06e7d193cb4fc93806e8830ad3b124b6d43b1e2316e994da3c116fac25aaf3d213dd5156e46cd5d0482d8f9b6fe0b0cd9f733a0614ae3b211a704151bec7b4adadf2b28e353096ec68b810f5ff77f4869e707e44149fba50c44fd14022370a35b7bcff292abfc596d4c0c4d1b0c9995b715b541eec2ae87a2f0208b7b6dcd15cb3df0c2a1d3dc123fd8fa8511cd915310da6467317a98d366ac30c7802c9f9ca4802fa1ff73302d60435211f5ddf2f9b2c4f1f858e95a02a722cdb6060bac65084e13a24846d5d52cda797b8228b4983934e64c4a618fb27d8f765104ec78652936ca9b65a9cd490af37483006907d92c2bebb3746615ad654a47b8361426f9cfb66de600a94f04953cb3f880edfaddc123d97128760170e4430a8bf84a58ff67058263755a44ba97f985446cccf18c644c04e41079672f00333cd4d5b9e99b4e9452d708c9a7f8849bb289129e916d4d784e42b3bb96f632476b96088ba7f78b61e0b9d81dbb7c5a23ba54e14ccfcbf2ca49cd20787b2fd7f43a7e6cc16e37e60eb740b88c4a8a8714979272bb9529b85342132d971a34a50f44c3a081cbce304adef5439d6845bceb99e7a250356cc24850b8ca91195213fd651d94342e24d67466c1533000e160719c43133c9816533a416aca3cc0af53559077beff520b32742e7eb8c2c71311e9fb0d02236dc03c13ea11591282c8fc04654fb6799395ee70bcb7d0292a1a8fb58a7f529cc8bb29e4133169e8fd8562ea622fa94d5bd3e1bfd045a819a010b331c2ad4e80f399fb8c328c988058db70d4e0bb62ea60ce8251fcad69c6acf3fa31a78f052638a66c90a3c09d568306a6b74f1db6861be2dca50b1421e1b79a0f3f118604fdd3b695441c344065bfb1d83352c0e1812f1abf18544bbd829119cda894ada195c12708de21ff26ab61b91895217ae1fd6d03d45acfcb8e26d8e4580921153c15a3d9c1664d59142706941e1a654fed72f7c0e8c7c82109852feb68e291ba19b3a6224ed77cc41e1cac0e011124857ab6e0b8c1703c588d898573d064c93a859ea2cc492a86f227274452031b066be11a58b2c6e9fd2ff7d5563eeee6f9d120b2624824ec3e269d5e7875ddf53244222f7ad07cded2535789b54db7842030d19436df1a141947db93aa6df76e0a19f3248aec946e3fd6fa217d6dce50564c35a1a4cb70c1c94c31a1898009a0a7698f5d099e20b37e957ff578a316d9fe798b20200132725b5eb72cc1678670c5408e5a73069fdfe0ebe72136736cc35ed2b72639780ff5e606789f622fa821390144584627cae9e5881e6fe059ae176785847215f1a8660c68a1058daacfd1c10c8429595039f13284ab64adb27796259fccca76d246ecfccd6ed3d7e91623e0d3941fb5ad34182ce9d415ddea6513fe5ba09fb75419f005e0ede853e360b9c0a1c7ce01aa8d13d633a955ce63386043ad73f11c170c2b188cbb722cbddf75b2031817a73087245441a4e784492d6c3cc70438e66ca38167ce29563796a7313e48fa3ff87168d8eef320a226af199b47c61839f94aa6c610694b33fe165831721cb65c900f342c7b383fd4a34565ee617037ae4483547279642a9177985695b7c992cb1b45e3781ddbb8703055879e5784b6c249e6255a0362b727b51b6cd1ee446c2032bffd70e73c913cd87fc572e7c087440470292f404643d0ef225de91d892dde0a53c3b872f57144835b5d6d26916c142024784afd64d3856d6136f30923eaeccd00b457e999cb2d960e516b51b16d3806eb0cc5842bc591db8fff717414bd64e83e8250bea75c4967b36c2fd92bfb1026b18fea7ae6aae5a9f899953968d682eb5f49618116aff151232e55a3664f61d95a4b7aa1e9eefe754568fba65b785fa9f7a47a28c44b85fa7b54f52b387fffff1a379b2fbdca6f80cb62157fe9eff175fda5d99bf6997d9598b97bb13754b486e8a4f8d498fb6ef571e5d104cdc7965cef444eed8b4ad316a79c17196b3c9fa7271d90a671dd661085994737d1385550b4360b211a30478a77b68897e083a3b139f2504d25ff1f655510614c4e6d465a695de5ece8c4330d77ec89d71d6349a8c2ddd74d00d8ebb4092d79c38cc5f2c0704c51423f608650dbc7c115af9b7ace8e718f81f9283d9e1c00dc13b9452de8fe290e153bd4900c5819d752c7f8da1efa27d7983f95bcdfbf433ccf55d3719df6875e47cb7d90c6d6d9a2490f0c5747818c8c5a62b9cf70543e824b52378f444066712daf8e1278ab272c6efb08fb7d7ff4d8589d7ea52fb2523092afea96d24fb642f234bcdb22bf5a728987b02ad58e781b5c8bb6b560df8dc71caf792bc08ea6ed186a876aeb2fdda5d200f75caebbc2b40133119959fd20fac1555dccbacfdc05ad69b2865916de46e7018cb7e633bb2a032a8a06d1166872d77c86b73954d1f79ad939e29dfa6cfbf8199fecb263b056301fccf7801f75be6e7ec44b001f370a073a46c3b1a579185e068b2a097def1866324f48ada1a415392a3dba08f7b965b52e87a51b00e5515c1ff50c466d3ff5406c937fa6f33d268e7e6c751219ded92485ace895d61d3d0c186ebdf7e1e926a068d8ec70903bd8fc25016db6e67a9d63754a9e797c187c761d0248626da4f946b3076a50d4672bd69f8c582873165dfbafc1eee9b3d508c0a52cfc9eb30634db788785020b80e7ed580c75064f9cedd6010e39e02105fef8531050bc4763a15e75c32c030ada15b8a14b4b9b374a922b2a79b66f7163d5447e6acffa37999df8115a083e54a4b0af09d06181b3c9b02266fd17427a96c724599caff13d4ea34b4e344b0576b23422a1f35bf081b378c0b1a38d20c1a00b5bac1790f4d6f5e4d5417aead3594dc3224dac1610c0ab0f691353bd733a215c685ddaa6a41a686a3210e8a48ab38c2671a7e47d2e1bf2a961426c7921c7a89755755f6aa671ccc9bb38ad2f2544fbd2ef5040443eb40c8bdf4ca371a649205ec8d44970562b2dc34bec1597adf268da01329c7515a5a9bd2d9a5281c52e461c51dd2a0f11bb8c6c974fe843e57f954a90fa10d13cf129002cfeface06c99a04b99144ebdd4bf73b96e5cf8945e5faea2860875185f7e3a824ee6a4bbdfd938d3b8a392fa5bced4c12d1e5a9249df1dcd710fcfcec34c168feba3764b76ef2113f151bd2f313458335c2e09a10b37a952c30319ca50ca2d7ca8002df4e632be9fb2460ff3472993d2da63d0f3ecf36ea92f3b6e834bab4ee1d10af9ddd1e40b90958219054e681470fbb690dde969399472e97b464c226687b58a6ff942f2fa1563ec63b4994e031ab822b6c81bb279be1c064b29d0e3769c957583ce8ba301a839cb1ade68d0723b5d436fde6e2e27a41f62a3612ed0293e99fbc32ca746a4f46e453cf9099b840f4b3dcfb608551f78b5552dc8c7a2fdf9304033eb4cc012cbd53b11e5c1fdc63ca86b3608c80b4990e2379d7ed5df36e3379c2c6815ae91e7a483044183e9b5eff18e4445b46a300238838d0aabef355ec183ff76c7fedb742226f0c0bf4b345f22a417c112e268e1d6fb19b9cbb75a6d13ef580108afe137d674f76b0752fca7bf9efc2031a297b1f788c9b521fc2896733c01d05659a9f34ef4c638c79ee545ce76b24ea03ad644ca1ab9259b38112578029057d3b966f03e5c5fb432795c6025f254de749ce5503e41b03330597423d8fb79fee7d672f6b7556c119cddf6aadf3a736ac60d6edaaa8d6a828d978a3d27630fd9513b34fd697d8d561c1ee39a7046e353ba2b14654c7dc0b942217345344d5487ebf8ef141e2adaea080bcc58868baab41c966e77ad4ca0623ea22e00c119687932dc471dde84af7e43b06400c091d905ac1af8db92f92e44101f028edb0684dc5263ff3d53884b8e92bd235d051e880a7e8fc97412b18341320bdffb759d124b02191b8df0bdc84e932a699164495f8a4d3fb5ced905ad1ca08b5cea9df995d775730c59dc44a92a4704ed1a37524a071c5d139c7f34fe0e9eb84a8b31452ea145ac6ab82c5e40e20dcbbc0749bddd1bebd44972afc434a3b01945ab4aad4f6a6b3df616559eaa5d124cd4ff1b1a8aafeceab7d9f6bcda397ccca7416267fe56220dae93e11561426846069887624ebb201623bf10dc1466f909ef8d13519f2b45d985375a4c096ad1c8a2a705915e00e62561c8707aded80fd94378d7a40e8803cc0d719805a8dff68da3bd4d07aa0a5e23ebd393c36fcc9446fa5d30e1d9ef4f12ba423042a6a9f41135300b2654cc50427556e9d65ddf8b3d65db2e6c8114be263274c3aac7f43b7e8c03bbe47421995be5200fa031f22ae414cf2b4e99d6d7cb08368a030d70a42c16ec37b1c5ddc150c138523cc224fa08ed9c5cd2221d64b2a2c7a68dc836ab2a1cb6f241e70f64a28f23471d5e4addc6e95be603355957c55203c031af0d7d6488d62116986237874813ad1401c52322cb7e46623f8cfda906253e526b1c0b16077bdac8229cd4cae958aed40e9b7beb03810476186d27fbbbacb8e9f73be0c29242f9a73d941528bff127a839e1ed30e48640cc063e924cd7e80457faa7319f8f3a2710d339d5a3df04fe04ad25d9c112b6f2244dd2626fc8c3783712a43d5b44a60af1b273251c8b27113dd85b713c5df0eaafd4cc84dbebea96e4f2308e147173c4a08fbdf5ba51b447d68f7d6d41476a841b22c71ebd61275a3964ad75c4150868b365a08bae31fa48acaf59044649af449f115400df1414947aaf0552e6896f1b673f0e5db2dcfde7a860aa57922296ccfdd0640eabb1c1d146c35e1ef4e21193257376c2e21d2ee5f27614abcfa6fea5671705d26ef224203f78da8a1edac6297e6b3f51231068660c3ab51e16198e02a38cb90529867e9af334a1f59649fbfbe348bb0611c0826df3a197df280742d8f0ee2c38e359c02da806011d61e4a1a508246df9a079d7b7db0dd4c74a3786145763d48368df5e4323d6894ca5fe1e06910c1171eef5ca954fcb4e9bc2fed495029185d1cfda86ec6794633d41df568c7dfc90e1d87c439368d850a7b74d3bb26042bff3909f0198b460df50ea8b96a14ea2ad8bfbc242c0b205e3ba68b0b35b62b4f44c13290e78850f32a17c60949a61566810b5cb322c192352d94d9eb7fcf395b8d9484c7d6e2e2020d11e14b1ff7b54ec559192975a5691fef489adfae4bff62e619b0b55b6fe635cbf5d82131e98f1e052fb14dfabc4a12625728e9443e6a6887ab3b5c06b7ae4e9183271b2e7bac3c68f4f1cb933e99543f4ad74ef85437a5b661a2b7d5c82183393031c1661b63a718d1ef3b216f461ce408f02603ccc77e590492564f138640a133584942f7d2d20a3b7e7f2f94bee67173dd5e3f9b5978d5a4a6c742bcd9dd2a56d57d26af630ba37128d73d7fba39decbffe94a9d998a988a81cbad609595215f6d5fb23b2cab43e6ae3e438633bbb8b39e09e0a05f071c7d579eff5db2a5ec1b7972893d0c87a35c482da94924f201c401131ee6be54b4c693ad835c3e414b563f3fa16080d71f2cb0a56a533be67bce6c81dd56c55e0b628e7f0e1a02c26c4fd293eea94760d041b0fb162c1c0d5befb878ee43dc7a583729c265b0eeec2467ed0f5122093e44e721aba0b4b2b79c3fe8ed2ad0da8f890b85b76b03fd7b5938c568230735b9a80ec06334af580e0221f09d74775ff335fbf881db434bd0ba5a53ab55dcd9d0a6e6f8f0b538e00fedcd3398fcaf05229e67e2d75de8da03fe15a1b08c55ec32fccfb1e05259e96852280eebbd2e74d2d997103a7a104808de6306879321d3c7cea5a5cab82b5a8ea53da65c769b6acbeb9c60aa290aab6481751d14e56e47e5814c0cd4c2dd78b9667090669595eb298b421154b25325a8a4495b9538538fc4c0d0032208f1e08c19c8a0902630ee14cab9c43012f0cc7ee453f69954cc6a3c56250b31756654d7765eca21cca66ce6f17380d2821fcd4f0e15fded2148da36011394d81fd4896f8d9e923a8e4df2bbbda253e0c59d70ea389ed5a8b7909a5e144baef00699daa1b5958f4f8362b11bcf21e8baf4390dd1d3529f86baa030a8a7d7bac3d44d919c4ddda6b89604eeca56018f003c1435e0b24df985e693d78e19c2977df667cc6b1aecf234bdc142c9f9e35306e603b3de2ce2ecb4334901aa6801bcfc1c5591eb107507533ecc51431d65fecd8c218f0b59bbbd9e44ac3506a7fdd1ce7203e6d956189283cb4a4f73f80c7572f148e6c5376b0202b70229e25d988cfa6a681b6c255273efcb33597f842bca0eb5404a7b66a091cce2592d068614627a2f2b521737a7a8c3b8008ceae9b494f9efa17d957fc3297ffcaf42b7e53620969aa6ea02d631cd3c2c423439ad7194bb3a86b604c69e58ed55da8a4e39434fc404fefa2641dd86965128b5e7b29ef383c2012e3c820268e2c4a7ffbdbc03d734039ef18534bbfdba8d80c4f11683cdf2e69f6469f3321c607c2954e44c6779072caaee60a9364535ae40637bc4136b92d2179ddb1c95fbe84c2d1fedd8e201cd51c07574d0ed042219299326f913f34645159488d45a04b36b04682f55d04a386745edcd15213d7f35be7c26ca6fc447ac3aeaa37b8564267208251c00af5f77d7f91a2a72a51bee3e23497efc387fd6298857178026962cc1c0411eba11d8cf692ac789e6d9a62906afad386cb79ed679e5df52f00f9d7530c051510fee5b8030ad871936c64cde71d41586ba9fc3a4bb6ac8692065e0e4944b89f9d540ff311600a536f53e45e08c87815cbd7b876e0cb4da4a183643dc9e492d1212c0a899debd028c783ac5bd4d110f618788e4d423d4955e5240b5d6547143a675fc1f4132445e0aaf0b07fce3e9324199b645abec9945c310c270ad72d5dbafd63eda583155e0f3d445bd56ba2efbd5112fee19d160f2655ba070c5847d3a191d121d0772df27f37c175a1977dacdd85ed9909779748ec33e1450658633c50ed265cf342f93b7d95dafe95a28452b3bb9a1535869e49e4a6280115288caa8b04d4670675f7fe1f92bd94403c08fbd5d7d2ada20c8398813b3223828b15235638abc28bc992e5094580de36786463b02fb7753580bcc9e62360621c384c93704d70c0622426660002e318d8c9c7be4d772b62d4a10f46504f345d1b189e46c9368d715f31cfb8de231c6a1907f6488dd6e75764d761f51409d2872e875e3539f22b1959a7c37d2a81f42702daf0ea9d4cbb19f50421c3f3c1b526d8eec89ce52d3e645f966ee06e8b986522f0531d6dd5b844ae45e3118d9df0ea1f214d4ce3c554fb7308ff72e33866035ec9a8217ee7c7343be5b25c694f3e9ddce704cd811139fbbe370dee8f32bcf6ac04f4ff37b22ab5b0e35b5aea9e6162214b3b619834f208693dfa0d8cd6dd630a3cb35ba4c0b50d551ac332929448665d04827f732830ea1023852901f2774383c3630c40a1c17690b748c0cf4a5cfb7693a20036c8a47826a9edf3744b107e07d420cc56447198d191072acca2405e5fbca7ff2a7454cc8506596da322a8489b4572f5563822c331880e5db4dfdf17eef23b767cebde091b480567ecaa69d09e6ee0c3c73ee706c97578cb6da3f88724e87767eb52f8d0f13cc526ab7a515d8261a724cf621ab7b4ea0dcd90121861c7c4d22c6563b8961ac724c5c7f7a40ff09e62c0697dc5ba805a6f85706a752896645d3bb8c0457cf160a773505743eceffbbcc4c1701bff752fbe933ea82dfbf498184b38f1456cd91e3f42e6116a18d00b414a7b4742b6e33edf48c6398c626202d4594fb2fbeedb0be113a22c128570e1dc732f4131b7e99887be2068559c8efb4a9af38da85a8db1540881a21d0fdd2bea0e26226f8a94defeb92ea61b2289503fd38715a3354be288e2103efd0658681a2bd6f1abcb8c0156c39d25a1ba96ae86944474418d8bffe9b33c1a89adb32ea009ab2e5af3f848680a87bc5fe38195bff8ecab903347505773964651de7d9a51d0035d270c50a8810695fc1a5379d0165bd68dbe0ce579aad864585774b0675172e805ee4535d2071205d609573df91558f6b2e7d07c0a60a2911a43efae6e4bfb5000c3e1316f09b7e300c3089668f0f2f8abd7533cee57ec64eddd807972f87604f3c205a0e031db9de6a124be1bcd3461259b6b8da41247c87ab73a70a7f6927ef2cd738647d3a9f81c983caa4a4fb376234f60a8d098bd25e843141adaadf7450b2a346a60da445b8ea8b782c0de0ec7ee0e774854dba29330d9181a0809b765f946dafd344f0c7f591bd37ffd1d636858821092841f8a57c21a0316b2e0062f30868670f25362686767fcf3985868bc7ed0e5e24a89488c2a495de7b190849cd832fc9241c4222a398e7d00e496f41cfc83893be7ba276eef46ec2fbb86fb7174f0e62909e2f6c48fde9a521f47190be2ec1c91bc09eff088955f4d7ea05e5439932bfa8fb85c46ca9f861ef420717f07a7038c0bd26df691f5ac564471556af3b3912b05487484f086592893358998e0cba259db0a7de0bd048ac1d09b25a88dd6f216e5e7fa5504ede726911a0a8a6def3c4e8b31b3e0666ea5636b8b6c9200e974aaf36610942241f635277b8a50a2ec854cb285d98652971b1439f8fd7ff6c9f1d5ff6ffe17f500c1d44fe5e13c62a45013c7330de333559985baac0525cb96f7e93a464243b42274f4d92298a5b08357def17e445c89cb1802031fa4b8aa66117ed6f505d5498c1fc8b20577c96768ca732b3a976fb86bd7075de85444d8c72d0ced2a04fa2580f8c0290418ff3090c26cf1130b53f083956d12213b472e892aca5ce29617861637c74e192f8c05983729c61f5bf115eb990475fe89c629fb59953d836a1cba2f086489d619a2b67945bd5466bf26ac87cf50d71361633efb2c7eaf2c9070544d7ad64c1d376423f45f5d3eab0df48b0c14d09bb9589ba29a2ca00069bb91fcb93f8d389755cf8d69313e583eb3891eb3fe5df45b60e84876fc86bd6ba62ef03a8e83b0a7a116f4689ad217edb901247d68141d1d6784a92cc76482b43b94b4a06736f5b404d864c0b18cc610b343ddee0733b4c08aec432c947150157155697206e90044de9a024910fb2005753cea7d096c69e41a5ae9e1f608715e263a52fafe8b148018e0708763e7319d86150f326a7dcfdcb94374b180a337864e2eebb400c0daa07f9547b2fd729abb465f9b01f655bb96535041ba142852fa78e5b8d3f95242aadc3f047c02a8f139ae1488bb9267a5cd01c03547309628e6f43650af34138ccf3a79b937618ca71a365bdaff4801148bd1f3a226e76915d0fc55d28abbdbed32bacb3c846a85e0aff43be98b4d77b33d6bd9613616d53ed45cb8b0a095b613c30434fab03ee6356f1a22081c9d7ba00ffe79e4d06d4b12470514d0c086d3bf0344f1a36bb72a4c4f7ce3d567ab6f2801406caa2dfb7f90e04100552d91bb1efcadc7038cfa750aaa4df2af972845ae750472c01eb71a32c82f5308f6cc7a1ab41523a3f50133579f941b761620c14afbf0163df16ef7a0a733660027d66d2c2fa3b079c0d610621f99ddae9d1fe1c91169faf9cd511d42b88e1732627066128e84187845656d5011e4a358f06d48be741016e0facde6f2e80e95d24564b716588f21e58a340c934b27be442479d70d7ad1d082a2f4d00724561028b634dcdfc5f195e2c190aacb61a3900d1bfb53fefbd8b2a11530bd28ae838a42cca09d645e941fdfd64cc9e2c170ed3e12308855bee598ebdc411233363201fde284631c221984572d3bc689894eae4024ac19da97c303e744114ab66e46b8b6766d8d3e22a46d5b12b9a79bb1ad1e144b1d9bf71fed9b448ecbcab7a5722e08032f550eacba884af3339121ff0dfec0f08e74eeff251ba2accff1e2397f09065c9d52cada3a4ffe9a75a6985115a304d47b21307795428cb8bac3cea5e8d45bcb98cbdda4818d17f6d8c90dae554e6ed38f5464287965aaff2b309611ae39b5867d53edcd30d39a762bcffa59e6909e3f42e78f5a1cae3ad010c2af504d2bc59c90ed8cf7b30a6395aeac92572ffd279ae1d92ec8e55dd4a68c461f1d926b20d354369283c8e170d09898286d464fc76191570a0f85ba43a9db64072a9e085691acf8fee165889d33154fed87fc9fb1ec3e5bf37c4714804c704b3264003b865ad1bf58a0656048d7e679b33e7cb4c57704e2f87d96f9526f0418bb24a9519dc522c1af940daeeb9f9575985849077f33556730f18e601b66414ea6c6985179423198f4ed01b5be4a50195f09e20e329b1ab817540a019b371b5f7fb060d17dc0055e687714593825425650c041dc351511e37b0c3a377243a8d121d09db5491c0fa0f1ceacee61e4451bba722396252ff310c66bd54f1a4326e316799b9b8a5bb9d76137096bc10b36bbee8a62144531bd769b7f3b81ad67de498f1e31a7e9a7a2c1d37e948b5572e8c109b1e2f6143482d07bb60cdda2aea3500dbd3aa40d2640bb0f97e094e1c164653b02760b0c6485a56c845c98a81a73d7efba5b5d2c6498ea97b3693527f8a3e33ecdb55324a9034f95e4917e8b4d2bba5c85494edb0bc6fdf34382ecc86a4c5d4aee8d1d390418f0a84a7203b2b018f10cbaf1ab47bed374184819b880f16a84689ee08fee0e081efc8dd44a1b7f7245c2d25bfe9639f91475b5421b39517f72a41557e7914b661692a3304afff1161ca735164eca72c22748eadd2023bda93685e4dd954fe96c968d1a3e48e019e44c8aedbea7133be7b184081dd3299af35f472ecebf4154116ac2d3a241bbbebb04ab4d71d1e0c96bbd4a06817392deb76a2e702cca2f3f222b8015388964b988e63dec3879ad67b01b4cc7b7e7e430c9ac8628eb0d1d609a93be69b967035161068e33723c55df6d974631ddaffb806f374de9d18dfba03ad9a7e479d194f679fa12d5e327e22ca71f02e9e18e382cd5557f9ff363dae8ffde1c09a834803d655234a225e16ebb5b46a3ea5c650c78c2f8bff30e6210c1ce91b6a9a6bf1d779b1d5aa95e709c2bc0c84a783571136b7b465fc9e0bf1ffc88a27e40f35cdeb0bd3320e13c58814174d913763d3f1fc0c9539821e130e8e3190fd614499eab795e03af46aa969bc8c9327049f0f14814c7435c0332421447e8d9126fa63ebbb4636d20423a8c5c2b8c94c2b1ff3f202c8ae68dd18c3e7f58aa42f1dcb2854157bcc4d2b639a950550fecfd75195a343d6aa3351c695df3753628225da46074e5c581239c230d09c1665015cac65c63aec61c86070add6622e82e0fa9c41b74c4824a75608e0b5fd3bd1898763899e8878224800a97c0151a1459a9d11ad8d8405542f4baa151d1d5670aacb20634bdd27a2db4ac96520667e356180a8d138d6826b7145063f45ecc741d828e8c5247e88c588b0df1b24a51ba2f0da5aa2b7d14c6e7cdf6e171fb5c53d82c9564eb135d278976c8d9afad5d92fe01e493f5833cd4b7f85d57cac16ebb31e23988a4ad358a7959ddd5f7a6d84a41ded0a247a0a4360effd77a1e3714bc4c64c94daa6bc4db6f88d608f59bc2d312580e6b390b2b78c71f1c5c7f529afb999b60741091a1282af4b091dc2a2759d6689b8c9263ea5e29bb986bf430bf720c00e4285cfbc57a2695bec4b675c86f7b22a0b87ce9bec3100b907758f44ba0c1162926d19782f393aa95518ae781f17f06617aa4fbaad710124d1f50ee847e978362def2ac339505fd0034a484062899a499d726fe38aeab0f4f98fc10049aaf299ef8aa88d0294ec4fc27df94d43f2aebefed2a20b9b2f246cb57409e97c1828139de4c3c90f92bcff8f6f2d16aa454102b311f889682547b55863c75b12277ae5cbf232c085b5b3543272dd3ae2a9e590256cf92ad4a14253842a265328a9e943804ea3a9851e00b94023d8086956f07b1db35efd187a5359acd940e2a34d2530e4dd39c6b73029c22def05b38508173b7bb3748542e91dc083c87825378e594325142942875091774ece691608c70dd89be55c4b69509e310334d38a8043ae26942b017b5a258c17be01763e90a848ac47c0a9abad890978c7f2a441fa30d51f795c370eb23a6f2be9499c38480eb1fbbc19e4ff59402354e2b77a552ba21dbef0fe56cf486a59cf351d2b47cf1c8717b439861eec22af05aba902df4996400852904c15549bb3d0c8366be6a3cd524d9981e132a9a42278656c3daff375a2ee045af3477af5521315b688611044a1c703bd0871af8c3cc10885e851a046f0151a50c415f553e0288d4121cfb840e4d2de6a1f849352010fdef91eb364e74be78cd8998322f07b54e9c8a0d4ae78304b7f83738dae4a6beb8ff134016bb5f85d802b45122e4cb3b4e657a0b944d16dd908a9af7f76d7894b861e91a25940901d809397b431c26cdaea90f625253f4a13f730e3a2f35c2749474181e66a56fd6227b1ae931bc8d9a4147f9004de831f6e2c75d88b731dc5050c50461b33276ae56ca202e41c00bd29f913b0770a5be90dea1116b0d3e3f7d01f4593d66f114ec51998f3b84892c2655915b5e87b60e61fe1dfc33592fbcfb0f4402ba36be5a32a21eb34c97c53574e9e1a6588d4c28f5f507d574dbddb05be9318b7eb8e8a590646addc2802bb6b91e6df4648f15169cbf98ee57e3a17245c407cf2ffa33c14cf006dc5ec9afe343dea7bbf50c3db047056a9b37eec6cd1b02364707b679591033010b006a547b64750cbd529f63dbdc1288e6869dcc26da66e1c8ce49930f9e9e165095c0d1a088fbe59b74516611c5ba66381de2eb9ae29632c9ff81d5c41ab19838bce6b1da513d6bbeb0f0350cafc154ab86e785ea1f07b22f842fda91379eeb4f5e90763e0c1a0e4be23081256965f2d7d745fe66198db4536bcb2ba8019454453e409a1c40e70174e053d36a3510ce479760fbd4dd046498ae998d6e6587af26535d420bd96882e270d3acfaeff8b9d2f1d430918dcdeb252985bc3f314c554c64463ad992f68de20ab0b48b67770484039a87110fb4b9c6d1926a88212caf281d00edf6c16239e55e675ffaf0db4e536012224387a675195eb1291919f06dd7f620b8b6f3b52881d1375f2df1538c4a7d32d4759895a2f4754c6d10e4c581bfdbd5b7148e34da03f0c1fdc32c379fd1a361314e37925249210a5b27af8940bf1ed39ae84b380d39e432359487a9e43edc9d566e3cf8896f51b037badab19a1ebcd4d29440ac64378601fe7c6879d23436c0dfdf5fc07ba0ebc2a2e237da33dd33217750a2827a25d59ba95e6f558b2455ccfbbfea1671b1db145c9eeffca3c9bf1158deb9f9d8e91bb8cc0cef6ebecbfdf958128250f3d13b7dc4e50cd330b1c95499c6a6b71a6ba716e45c032589ed61ae099c8464a2a50ca695fe984cb0eaf294c8e2b96691e1b0d96d595387d7be1547a0c571da7b1172cf3a75839856b262640ec73974a5d99a5488ede4f1880d641a07acbc5613cb5d783aaffe86716a4cf0fb632e432416f7896470e4f6f87f3633e3b4bbf6bfaa8f44054d966fae13ada011d710912a2224561d7ee4d336ba082bf0e69bea0d305fa15912fd2a4ed7cf27292f17423149af4d000b43bfead2246e4246493c85d6b0032112ac16a652de04dbae02c1a54e3ab58a4b9428e5caf742ef770123f1476ac0e785c345eba3f8d17eacef4c54dd17767be09d34d37898f6ee9809ddc07c4ba24fe51a86b9a7690723403fcb00ac7979a72e1c48112dca911dbe6cdd3e73b640481169d1077557e8d79033af1dc2f70b791f9a115f15a49102bc95ae01048b3be07c189e038d57274f05f44dd79aebeaf1d2324c54dbddb75c7f0f8190d9b6ed5ac56d1dbd38bc38118f9ec4e77d4615d58c12acbcaf50f19e4df0f904669b2df509b4fe2a31a6135dee7909708b9f3aa2d49ef0f61873be29c0f2122ee1476f32ac3ab6e19c4b6976ef3e1fac3d7df84f9c6d3720d0364338c1a778d9c2d2c879a515a5cfaa91470805148a28680d912facd7facf193a704d6cd8e89644f68f121021da47a73e20df14dbbc07059a43cca642338051b429e8b59d23eeb59a22ae346e7306beaac18aa97c8e0ec2933450fc9fd82345b91368a5a75fff06ce5c6cf269402c53c99dcd9bf60dfa57c14435d719c7fd3ab721c80697225e22c47d5ecdf0f6c2bb13d2b03856484a876f240d0ff01ad984670e54b4555b43491894336f4d53615912bfc0559935f5385781b47395a31cf05f36b3e89b615f7b8096acb415ecba89bf3cda2f2f16e66bd53f7b3af73cf435872cb166b4373a6cf0f08cfe31995d5ca5fe5e367905df533834a36191676516e8b5fb43330c1cf0a08ea9006e67d17a6391ab6c084756cc04a9acaa5cbdad9188e68da673279569208394669159cb76b1f34d435dfbab3f18f901cb3806e7cc645005207915f4bdab12189943a6332f26374f8525aaba4b64aef2f3e4cf0d77608c129aa8209ff34a1e2fb68415be3c2b82dfb774134932d796e9093698fe6374fe567e2302f29629598a0897e955726427f52c8605ec80f8a63493792b5ce65814904395ae63d04a8901c5197be45de6158622338b419561ce8f4a135d6ee296198315517de0649ebc3d4044d9f88c9d34fc509a8e15ace0f6ca2089f746f942c89e9624c77f42152e8523db8b482d6fc8d9929ce7f5e4e68ab6ad1ec6d3c4722b9bd296d43baa8fd91691d1c0803e3ebb18e3e4af0c7aab568a652b21b8fd5309a59036140436d5a4c73269d374aed2c2352fb2120fd3413354c706f49e23aa47c755ff36b8974af6aadad20f229c889d2e55b367f1951511aaedd76c585ac7b660bc6f113528078b057fb0723c0328534388c98c70f3676126573f386a19afdc35deb21910c567cd182d4beacf0c8503371a74ba9b4ab33c21b0c6132eea1c4c505312661555e97f630ac1b6103b857d9de70ba38185af39e76c73baffb22018790ce0a440c599bf8b982cd165800a7182d6b27f2e91de7a02b24d2fcb63c43b273ff41a8abb55c67d6816b230f2635e14d952ea84568fc9d5bb47f4951416db3d02b57344fdf1753ee629c413c34a66ffbb2e1bdc7cab0bff167eadd912c4c133f0db9410c4254fc422818a2f828b4d9884f654bf0b241bb4dd439b110e4e8c0e2a075152ec887a3a472a5d4b87797f3ee666b4d77d31ff6bd2aeec7a6e81df581952a56365085fce0288c9b9852bf167f7f668e60fe36d6e0f53a44824b304331d9380958da38f1c25161f0136faa9fe09561443001f6c76be6de9e28504926958cba2418b063457506b516c910794a1530674b718007a9219043cb9d8cd222804cf9ebefe1d0070ff7a05acd435d6078ca510b1b09941dfd1de267b8bfc7d8bab2ccb528eb6d864d3570b3804d2c6501290776512dff1ac5e78f843d6deb472e845b98458caf43a58e4a01bebc8a31822a519f24d5bf48acbc559e041198f1985082205a9ba23b46a3d833a1b82cb26c9c3e0e6ed35dd9daef704f9e21e00b5d5fa9822bd0252c636ce30bd368ada58d33facf8521e2c41c3b621864f55837e037856d9d0553db643863a180a710bb27095f82e92f464d351598948d76e2af268ace5ec194a7f5dda82479dd5cf39a764e372536aac96cd24997b526fe62c26887f456e9ef3672f8060ad4fefa69a250c5ab452520492169001c9b10a4082ff6deb9a8b60a965111e913b4371bac49daec591446b9af1023e0c299d96ee84d8f7c7e865f2e5ed0d7169f2fa49e15f158d13af616214c527e55c6c8b15c3a7a7692ad2fe5f6fe3f546b29389de3da31b5db06a8ac868389aae1d20c63dcd564cf33bb0fb9b9d8e700ea9a94b59e7c0897f3451b14e3c7f870102110fd02acb07947c2ed38109848128acf085b0f98331160f974896113310d4f02503615592f15528f165dff16a8f4b705e6664abc6b9cf6618d0e3ab7d5f00745b717ebe30085c2eeea6f5ee1500e8b3b8bec03cebc5815a1ec3701bae34f805395dd60ffeda0d22c433117b64ffe24d97688f188eeecabdc2ba10fafdc3fca56d69d0e16d95371bdba22a208906b361bdeb333813d6ecbcbc107744cece1cb29ca8fb51ca38bbb267e247b40fbc387d2e64a1ac6b37a0965dc441f26a6415581541e97867a38a581fe7c58bb02b32063dfcac5922439220f95937b60edd46d9dc393faeccaf0ba9cd4a2994a1e41b7e0894bbe0fe657c88916e60e87664a7dea4276302e448b8381bd09a9cc7f8294d8c872e9a7c43c32a438d311c9b8df729db41b6cab1a5b76aa3c6d5bab384df71ee0ce7d38db19496896e50c8b33d288c67125cab9284d11683d5cec0d2297bd2a1bc92d2ec3541093003004daa0f72f38b1a8c47276d2b88e0fda5f5706b1af0c6f93ed8c92b5c8d69979613a6cbba17ef335e0db6e4053e8932d3538a1d245c1af2264672f4c2a5441851ecf4cea07bbbe2d6d955f40aa0e1d164d88562b146eb09a3f3ebebd53718b2d030ae8a07acff115b21b68fce8308ad0c155a8c701951020975a38e8deda630ce13e231982b2aebbf62b8108bf7823f36119fb36757ba358e13302152e3a5360451da0155c9fff84c0345fe004284df2b669001856eac0865c82ce6d27c067808ade1e2606542ccb15f0a17c4faca777f45b3ed4718176f7e1786ec4d3d74629bdfdc3e12b390416ee9b85c24c80ed84b09ec3bcfe15e1b62e735a4c622fd0914919cefd22aa53f404b88b655735cbcbe6444717d43c2199b14222e1736169a227906c19b7e382dfb11d2eaec292b3360c098c63bda8436368f79598c1da17b8cb5a4b8cd9a91d22d8b4cfc87d69f76b33d10532395bb280a352e07381230378565d7161b23870853537a1158dc3e85d6da56dadb0b52d3199e59ab8089bed941b2cd06174406649a6a607b477855b22f70832205f3074b0e7eb70e61ac1e9ee4c6eca2fc3a020dc0ad215ed1eb7ebafaaba61df20e3cc10df39d8edf4f03814af84b07f2102ea0cfd54d8f2d618d5529ebd05ee7f3ecadc47f015feb0d44765af2a8848568e74060f9d51bbc663e4efb089f2d743a773d1e6df84af24534fcba89ae8f10750ea710f43bff882cf11520350438b8f030ec0246951d4c6b7206df5d5203c8506f0919246c92a92b7aee0bdde4c859840f54ae530cf73f7abf042c99b913fd8b084e0d02f34507fe327ef9d124b338259ab3a09429c8b97179656c927d972940be11c2160883905b4127978be1679b8b6eb4ac07168b5f3da129d077c6f930883ca7b9b6e8d7c80113644008691b458c884625d20663e8665a31de85369adb2ebdcd1556cb1e963c8e767445dedad4a5d78d9ecd7430735a6a6495489421a11ed94f713644ee6d4f4ee76585c906932600c28de680521eff20713cdc703a5b28d40d876b8053b8b92cba96fe8371133cca03af66f9e5618d9ea6ec5cd08c5518eeabb12aec65fd40fbb3b1a7b87270db43fe4ff8309a492408cbbbf6923a597d92739b51292feed5cd66fab2a6c44da38e8c707b972ae6b6744faff3e3e976f54d35c3a31f9d7d2cf045844355132711af4b0da892416c82b8314d3b57871413470e8efb6da99094c65e59b20849b253ec845c92110619f9a6cfa1ccd510a3a750fbed6a2c64f3d7ff63d99496b4e0d3105d84d3cfa9464c66d5d045c8b46bc8eb2b816d459d97a18564124f8aabfe5567d83f919a17971fb7c296d0edcd0618822b1902fbcb628bae0e3d5ef6c912c47ad1de134c88b894413f239a09b7b60d46cfe220c45b158d55ae66628d3a28df4c11c006c9898d405fb4bea36b3d0c2c0a3d9b5a2d40a721fcef176b29dc5ac869843959f168ba7d4709f97e3442e85485736368002cb6c7ad18f297e61bd3a492cc22adc59016bdfef687eb39120dd511db1a1cb8ff66df52f71c695b08a8c7f69d2b95d582937d1869aed7fda4bd33249206dafe150e00f594232e7d44f125500efad69a7892f6cf6ff00e6c400353630fb5b04531b92ade1f15f019efdae71f850a92a96becb142458b005d8d18af359bfd35f4524f2c336e28015df4e8cb78b28b5a1080c3d1b629635bc4dd0c7d446d6a551a50ab58ee647e59a8658f9b9bc222dd2707b394b1b69ab7cb586d54c92253a3d73c7551d88441d8e359975c31378418fef7d31ecf4200584944ff2324e7fc68ed800606bfd6778c043125d2e3af6011092da4c91948ee0267807bd9c619111d23f8b5a7b3e67b355b759783ecc29f5536cd0d747b91087763de961a9a151582f7a83dad5de5f244b0f5fd0f5a062efd70b6c22efeac744fd3a90ba15c856cf03c8dcc17007ba15ad4fba7a43651041f141d58e4fa1ed3b84aadfbf18d8f080161f15c9efcdc35b03222a5ae26bc23a889254b209e9752e47cb9a0479bb694e4f1a9214dac04e80ac112d12bbd10d9bc3bab61a5e88775342153e9273b84462b1849a2246adcf231b927a3450d6a3dad8aff40ef59ea467a716e26f3ff80fc53731237666d3439105d37c4a53c57cd84aadc90c3dc5504b683f6fbe8cc3906571b4c2b952a455d564c19af8d265d42bf906b9d46fc1729613160234bbc50465681c92793266b57ea3d131b0d05bd130bb1781782add9990e08f758c19939f4b3cf250e1736e59b2b07dd2af953dbcf2aff26db22313439b8a11653e235e06eb1becf72d3d16a328620d8a339aefb929f2fb4c93bd7d077f6a23daaf8e2f621a42fab2a29073ce05df22e29f5c84afd0c025d3020d27a198a112884071cebdcfc2d8318fadbdad4983745873a557b0321bcb7383901ef6e078d71efad65a1231d1c08129079f2d97029f8050dda7ceb689c663ed2201cafe0b46a9010d630996fcd2ae6b56b407a1c615b2fd2529a40609bc0aa048df2320b44e13f552aa64991c3090d8f8d2b71b5df7c8a8925598903d5af72283cfaa2d3efad6a3e2c5dd1ea289293189a509e3940a60ee8de0e0f43400eef90037539e0ce65cd7e50e386b053fa8db9db67c79939de77f6ce40202c56444ca16f0f4f97dc22403fa7e51c4d76a06735a4da167084125e3aa585451b2b2e20590001606352f8d10be680998f51f28299078473ef399233e5f3bea9f32502891f892977eaab311b3edb016200f774a39246bb45e8e9623678024e7c0e2a569ef1b65ed66f3fb685c33e1d781b5adf60690c890b3f8e48f470e063238cfe4e3ca932b7a83f906ea1ef1cb94ecc75e96d3f906e5adf65e92f0a9110855a0ea8e8c76f6d8082b73b89fc841ff4fb84c4ffdba3033d84a841fb80892ad661ff1c0f2d1fe9ef6043dc9c16a4721128c01fe78c26ab0d672641eaaacb24379ca94cfa0a02b72a2b407b4068822942e7b3c34f3a55b033b1bd118c9f98a39c11516a455f7487466b8663b5f37e3814c3934297f00ff43f620b837b4a98d03dd9e90cf0b35d944ae887d259c81af86fd0313186daa59859d4afe9a8d0ac7b57e3a49325ec7f6d9fad7ca555066b8e41579ac0baeb139255aec8c3b9c79e933dca824729bb83210eaab9420843cee1650320c7542290c2f0931098ae86ca864c002f8cb2bfc60c721fc6356455b6aa9f0b038519088ed4cc158f61133c0e3c9a31636c188806807098e21b4526e68e7e6f7570b9731eac1386829332b2e598e58b2d2445460702d7f21463ac026c3ddef92e0d7c236322eda9ea015a2fb06e16f4d1baa828a68bc9c7e6e873638ffc442084036320cd1c42a4806f94b024ff4eb67dff0acfed085cbdbe3f748b43eae9c4a1d8bc4d9ba7bf85b71c8bd169ed002a3466cff33f430792fc05d84702bf26df77c6a26bc9cb6e58b4de1c1c071c4850d837c173dbda0e2c62682d5062406cbe18ac397243c76da40dce2e036ffbfb83b30302b68b11209872dc75eac7c7d950cc3421bd7abb9e8b19032f0979aa889a703f52cd1c7908171ec50cb51b81dff3a4e8546daadc1c2229e823172de89d80f119f211d33e6499d1319d4207fd164e9abb4da04adb0160848d223a93359722d1f4acd8664965386c3e0a8e1349ebdfd5959ae25164d3bf15caf50bd11a93e090f80b54adfafc2036dd056c883160bff0b8023aca6e8e165c49b0aefd36086e97ef469c286ee45b11b104af5d1db4190392e557b7575073c672b97fc7400881d0940431a10e164e00a8a1d5fe1b41e0e278e9d436e7f5146a047871c0d34c6c3078a6c8f2a69f36857e1873095a4fac6aadb12685fb9fc0ef79cd819722f19895465434f3b401163467db1e0b6dddf4d06cd5e79cf4ca4d9409967b8e64ab12212d29fa5a1f88d623928cc98d28e6062856f643e732a94c1afd9289cd5f6ec5953e9230882f06488412e40479125f396826a13fdb01c38acc580e5e929328414d13222f3af2e3e34c4c51265411573849a865e88eb1af386a343b3fa8d5384ee38b4013beb462822108d87008bbd5d75384456411db3fe410ea92162d3cc11f46d5381c56b788352af83a5160c27b7b106542246e11a26432602714d1fe01f191bb2f54ae1309582f2481791077a246e94165cc733eea24b4e1de4ed412b6a3a625bdaf0fc49daf90b5ca18b90c405da020868e99b64cffd983ee11c0a7cac4853778b69e21a73341e32610b5b56221a0e12c3be4b0c7926aada337321980e86d13fb33a992a1c4bc89e38b24892b3f1b019b358cafca4d2374ff8130cc6cc6a68aac7b3e1b06266e80265c4513cad126564f4c782e3af7d44064d6d75035bd5e361480fcf7a63d0203e9197736fc431c27cc61ebfacc20a251f4f95f33dfe64e889b6bb789bee8e5f30909de52aa2e88bd6028e5b84add62b7e0f82627e556c6a6f8e2b8408d5430e4681d9cfdf79402a0feaaf720c074268b7c384a03b4fabbdb1afd3a1390aae3f37e88214c25a5bbede631581365f6c6b5802591e84449f05cb5b5ab7f0df4494ee4e7fc6b70ce5ae59d09b38c30d07159683515f5817e7fc12d68a4c8186b7e3fb5a6e61d6b2183523d7a1d08f9105d6fbac34dd403f50a5845ed0c3b343469c0ab23c00f80a0f458d51b67333afca2b0efada0eadcf77d3f26889b61d0fe514626a507e741643198854fd6560054082238dd1d17b029cc0b55d50a50cd585b7dac431785503207873db0ba66cdc01dc4ea3dab5acaaf0625ca8d41417e5470eceb397fa3d17a506db22700ec07eb0da3157e01f092c38127cead19a2bf0937f6a6df241c74e01e64e21f360550403a5da87515d46b9e4bec51a0ac8b7335fc9b45c6dbcf90eea6970ccf5f8054a10ab76f9b88f54087e7967cdfd29e0c85f30068549d00b8175c8acd6145731ab7808b571fa80e40eff0ca1d20772289ae4804764b2ed04159a6e46fd34edf28cbb60af8a346a0b3bcc826a2621fc5a60e5e8eb57615b1b204178dfc60197685d997da6a1e80d3fd6d768934bcd7f464669e585938ca68d64dea0e2b6be8ff2699738631aaa802c272e5f652321cd9e287cbd86a96179526876659a1a3ec714692c7d553969d8585cc2671fc5c6a1233f142f50c5bbda6704b51b53bb9c91c61aec6bc6f2609803ea48a169c4d7b711e89b415f3c2cffaed0c55e660732567c238c677406263bacd47722f7792544cdb95b1b977b34f9715e60162d0d87fc3bcf67df51a7c1264d593bc7cd62eff9b4a1856a5a7976b1571397574185f33abefca9ed6ac03537fadb5f2d74d7414e29a0e01ec52058bd7964ebd642ece8e38d71a539097c020ccea2b4464341a12fb250143e0a638028651e0af30f43b4d56668184cae3bcb2fe7c7f4f8b262c067b98418ffbee00ec3a8fb0f58a3a8955e29656c7ef720998db9d2fa09b3de71e944a6f32b3330f83259bc1f3d746147a5bfa19a638e95e81844fb09bcca391fe385936c360b8030a807a1e9697f9245a3ad76dad85c10ff091fd1a950d5f705f9b708f6b7c4086c8ca096c832ec94c03616d6e5f2a029103165f37333507fa9b5ff829efd2b9e62fb826fae7d5d71e967659fca3e7f691d570a2a0052243452fdd0ce097ed2dc83fd553eef79b67aa19b8bccd908787a0ad69f4049028cd208329b169d4b48f4b098879265b3a672297a5b13e6e7cac89b1e5986f1f831b693b7aa033fcc1ce59066890059d2af5ecd11b4317c895c6d9ce752176cf6413a4e2903912ae044418a309971e809e6c09439354da8a29121769f64f9c7384b55ca4c6bc691c3e7093e1cc1623a43e2a46dd172f95fee511db2d2fc84f7e3572826d5187cb7121a42df2f142e8f07d76f7b7a17f2297990f7701542374e00ef67aeea3294d0293adb1ad83a898de1ddc86d2c163c02f571b6d580d052161070764609bca58a65ba76386a9c769a18e4dd0092bfd375149f785b4f196a4b36161eeb85d5aec93a204479b072c93e436e4bba3195f694d4141fd10a2ded3f0b5dc1127e4738b193161da1f02bc4db056cc0268c420d67289a62f68e882c1478706b748e130465247aa0b359fd055e61e5ab5fe8b24d5fc1b457ae803c890e778cc0e8e2eddd2954298480cda781e82d1e54fcb15cf5b6887f36ec4bb39773258c75b0b4da199c2f0dbea3ca99a39458e80f832a8d74b886e4ad25fa5f61f8ada19df7786677593b7ddd6b19c40e44063c19030253abe9ca6535407f569c08557abd1350c5137db3f1c7c38394f49065f317c12a073b6e9bcc5b484d8856bec08a4ddc7b005ce3ae1c4f78b000c68aeeb1d18af7cdefa031bf7faf5050d4691350e8430c9003195b165713fcc8fda707d696eab22cb044036ff0004f9fe18bd2ba0f2a1679d60a49ca5a1b01e37e248654dc4df0b2286e0c424b90457dd256205c296b5243c10686b506c6c456c5df704844ed1bfdbfa45e6da646a04c0624a41180c25d8b5309ebd39b03e48d1af3a7d19318e30a1486f2663ec0af6ce7280c3b26685188285bb52dd243e3a57249d849010e1aa109a1e0f401a03cf679f52d5051e908ac08ff48c6927180ba09d47bb8df74271e1a6c5c4476006afb0b0da1838adf203f696f4e47ceea324e5bcaa35fb4eaad8bf03135064ca38f7debf6ead8768dc442e7d188040fa316b380d4ac204f15bb8217e2b1cb73e9bff5958aed53b3cb7eeec0287a708c08028070c1c87ef6ad544d66fed881da23d04103e35bb21c6f12922b0a0ccf680408e9458681ac2fdf7b8ba7e7c8868236bd6558e01786a46fc153133af0c34b548e25032a8e3a62d34b3777879002b1d0ae05a3e41b24444e788ab82b3700be9c542da8cb31091f75b389025903807b435958ebc102a48bcc741ae972098044b4bb8e24cc889cf9b1e760a2337bbd59181431bd1727f9259cf86b39ec5ea062177211b7bc94ed3a67e53653272525aa8fae66d1c2dd39c4c9ffd2d5e4345d00378276e80c3a5daa4d538467a9df95324a669b9a09899f55ad30cfdf1106c2ed4f1d02c9253c290f2461ecc9e87682b4951529172317313a4784151200ba4626a8d43ea3e3c8f08422b88d0707e70e146ebada575ea958edeb5728786d62a4e6032196910c869be28327654230bb71efe0af79709e50b1d2067d8cad42de94d108da355e2534a63461c8a9c61604421574f35d1ca314c86064ecf46515c8d6865370cd566117abdbc915a527ffc0491c2f6c176a231873a80cac9100fee0180b06030a960535810545f4685c15f0f4bcb3800d55500e490e608fd517e54f1a41f893048460f7d548f483f0427b6fffcb871bd58f083b602b7a7494226cea5a1ab354368c4897bcac7b88f58be38497c82db9b1d93713841e7aa8e73dde1fee7f9c26a7c933ce7a2eb27b28cc8545904029796c87174abbfb141ad6a3bdcace19a1c9deb3d99152bbf40cc7870a19cb9d6bfb46189cdf6bfe3d2e1a58c1f52a81e5e9c81f63f0dd02b935a77640e9df09088db85d54d10780d89a60e2339d44a5bbb09f28bb60225b517462c7a311c9d031ec28b0158ecb7ef26f900b47e2dc6a231845be00af0e6924211a9bb59cb52ba23a8e287de1dbda08b0512cb426c49d2a7d841f47c83df20f24516672cfdd6b92c1d52a5f138850378b354dc0609fed98f2e0457d8619006cef528952431dce4fd5be8a0b7db27c12a3aa302382cc390ab9665a898b9398acff823e09fb4f0eba4d0fae1af51018b15ae90e9e6295a52eedac22b6d9ce0ada48d3ca159f10ab590e2a3f442cbfe54dc3950788d3d0902e230a52611bb2cdbc70d927ebfabad9fc348e8afc3c84384b24404bc042f74690b16b992e71d667153cac471c72ceb1a76be90de09934e083639b584065cfc024af1ad615c40d619a7032ee93f588bc2b951c6019761daa4c6e0369ba7ad6100fde2a2001070906be43076a3b6bee9e30d1ab047d7e6959f273ad2d0bdfafa4534e64ba91bc3b29933d00b1d665bd877dc80dee28bffd2dade7b6f29a59429c9143806f705fe0591e40348882837becf1037c86e5419818120840d4c77b4844d25b9dd1fb79ba641fba474f0dadd1dc38322288106545442c06926bd759f000ab7bbbb8b60b1c2fd2a01ee67a38f275c638502b8fd35882b6ebf66493e4588dc862288276ef715d5d6fa3d13536bfd010a0e309660c1fce084167049582f400041a5d0040a061044707881e4870302891b5c9ae84901082784909c68bd00628a15b42441b90021041d5868d02201d1041d569058794b25f2c33eb16221821a3242925a21828447b46259224e72d894001a1129420eda133a22225aa0322774b615f080ad863419e070c5aac48c801216890e7589210c0738502484ae2a56306990aa506e904be45025a02036013465f08414f8133f53065d04a9b5564e052e80b7d65a2b1343fed55a8390c1ad2db0a94f2ad12454962b225a92fcb99f7d02acec8cacb16f9474523ab51c2c8ccb3e2cc02205f6058e1636dbc1b3ef830d9be52c892be2a30890e934ffb6c8a5da9b4c42a084e0c986b09a133be89083fbfd434a7d74a8e2d22036f3b21cc9e3525343816d21c2155a643fb65ef6d1a10b8c0896da80c46a41b426ac6c410f3d0cb1f1b28f901f341e4b2ffb0809828896cbf0954c840f1f227eec604104cef5f383939e1ca41040c3ffa58c96ee5eff9c0fe3fd0d8dc8606c781f8c7c86f1672645ce92aac6d96ae11159ffecba6f3bc9663f77cdcdccb5b9bb1d3ec3ede7eed3e4fb77b4d3a1ddeac5a64af85b24feec68f0cb77f6faa5cbe87d6c222b423e84b08b37cba447bb7a33dc7926c1fa920b9fd4f057b06ddd3a17993f97be991d34f8fad3e0db0f6bdfef39fad65c4c106b7a1c321af1fda78c9ed1ebf79c87890f6f7c124c746844c6a520d65fb60f710eff22f46707338bc4f7ae08ed607ac2fb597e861ca9b09c67454eb02c7bc5fe71085bdb042f8410da20ac3fdc5ce82b3dcb311cbb222e2cdc02073e495450fa627aaeac355766b54f302e474ce544f2a4b807282a52b8990fab49638e8947b5622a525424d194b449925857be922557be8c26adda24935cd28ad473e51320a4b423218170724a3a2377aaaeece15a7dca48296ea5e44a8e45e269932472e5cfae2fec7ac61895cf10251e67d0900b8e1497c9fd48545c7cb8470aea534b90ffcb6d11bab2eb640f4e25e145af2b83d1d17969bfe8509f3e8b23d427d8824ba21279ae0c48aefcd4950f434d62e373aa6e75e5cf1c6be33ee2bbca69fce5732ba7891e90b7a80004fb71249e2b3fc6047c2205714c8ed3b08d555df9a4568ad4e2b99284041f3706e7ca2f46e7ca18d4952421559f78e5fd5b5a4e5382d18b5e4e683f3e0cf6a35782232558f1d86d0bd0950f4374afb2f7b5fc5cc9a93895d38c3c1818441f3fbec86b69b94cec481cc72191cf0149e1922cb9925bb5ae7cfeb89f2b9f3f0eca84a4966c394d7cf9a49ce8c1c0105ff422af044ecaf148382e23bff2dc2fea64aed53e7197e326f40311396356a894ca75c0d30327481cc6e86540d990d3b08d779990cb64da9039e77cd869288d47fb6c68761a9194913ef135d226b9693c7d620da50dd17858afa95c463ea79a1dc76a138c0568e07abc0cc865e4f3b0919caa4d726ad96b4bfaf49184a6a6adfaf4d2fa813212f261e8cad77ab46c9284faf4712a52167df21c5cb9f371aa2b5f53554df5654b8688b486729a6a233f03f24ce5346c6344e309ca5a9eadbec883f5a173a5b6d595fd666030b98cfc1ca7a99e14b2fd5453f5495ee9f382d495af0169529ae6c2d192f4897d78845c293f6d75a5d6ba52fbb9528372a5d673e5d379fa6a52514844399191c89551e74a8fe9292589c10f74ef20d39c3edfe767b3fbdcfbdacbd133ba0b902174e71e3d04b1502c232f60ffbdea8a85c1353343e13e4e39a7ecc186b6dcf4e9018727953be794d17296e4038322c0e0c9fdecc71b64dc27a9c1cf606ec877fad5b5b9d5cfa41699051b03a00fb71ba519f2bdbb186f946477b767a3679779175f76d12bdd2c6a33e358afa7b2e38fa5cb9b0b03b8d373ec61273ffb20ec3e18b719cdddd42ed3e971e92b9c113d0b039b037ebb13768a9d62a7d829768a9d62a7d829768a9d62a7d82993893d823dc2a88a1d42bdac148b04fb91ec116c9451151bc546b1519cd828360a0c0e10c6ae59b4db98f705cddaca32c8a1c819698531ff1c47b230e2944ca6ff18ced942efd34655ac0baa8caab4b4b4b4c000c20e7dce52ba941e5972dcddd99da5a4ee524ae9d5dd99ddd9dd3577cfa4f0677fd2b57649d9adabdd1633c7c487d78d9663b8bb4b0959524063c4202d020f7ef4e087949107b28994b1073236f9914d66f99169b289b6450d34711b348f99d00f1d020acab9fd798b06b966a7b09431caaaa9899456a6f7056f590568b4e3a6b51658c164ba308a65f372e409a2413428d364ab564ddbe2cf0b2f6c2eb29a96a97090c2a40708d2408809caa587079dcb3fb8dcb34312b76b0093237afe5ad80078f9610f963fc2c4e8cc8491cb8cb598092297817a94b81f073161c5fd388be890adcbecc03dd8af421da1956a09eb090096a0e2e30325977d7cd0c49dd1f45eb7a301ef0e588527e34881f68ac8df72b0f10447e0cb18d9bb49a589956a15e2c0326b3527bbb0fa55ee1982aaa0e6f9719d49eb45ebc73d435005839aa77f26adb30e41150c6a1e39a9a4b3fbb86708aa82e6c7af0e4155942e87fc5950cddd1c7b5850ddddcddd5c45976a099614434b7812a0c48f14523c21f574104bf1518158215c875cdae2548d899fe32a136ccee73b7ab9692d85fd3ac7db5db469cf3bb05fe74020a894d5bc9721363ecc6c1643197c20cd8dcd6ef4d2838dded7421a48e7b449bea86b9d36b18e3072bf0eea13b38e20d2437d625611496e53b9d26b210c5bee2da569d8a6b3b8f2abfc9eca921067c69a462fe2362d9b1db15ef17038f7789c8b161358513a88fbff4c1d74e52711741b70d92789212efd8a83bd3a95e3341068e6a773feb23a47f33edb3d99f7cdc8ff4c6de44a08e4fdd5391d0e8e7143df9d5a283ae7a6dc7f66fe39ce6f4ad77b600b928c4b5feb5cc951200e6601babfd6f5d0febab68e061e369aa669da43da7d25c0b954fb7eadb1ccfb3679292788c746c8f509d287a192ca8bc28743f23ba7befc2089957432207c1df9e31d6bd3c7216977587758774bda545215b6b0ee53645c7a29a2e3534a6b866159c5bc1e9847af8b561a3d5523e491c59723b1848359902f6bd7a35e577dbeb3d65abbcbfbea9cb5ce6f856f93bc997074a3c762028acb9b8dd18df1868c4bb606f6b3d76d5f209b9f75edeeda1ffd58a594f12b918b80cb5138218bda7d3a90f030cb15967d90e85c1f243917be021a6e37b1934cb0f06514ecf5bc61e07a3964371bb555f6b35dbd0b6ef539ea20410863f47ee6e31e0803fbd52be32422631b8e4840694991237344163ad0d1810a9b693a299d198e5db9ec73448f2a6c0a52aab02e3ef0c16a526048ecf64410ac0a3e3461c48e0a8cc88962592efba8b4d842450416d8ebb28fca0a2558ecb28faa6552b1be54c4cffd7e466e91c518678dd1b386588cf2090b4b377a8cee750854cee81ee710dcdddda7cf4be36d4e9692e7cb8f33c638658cd13d466f0cc6e859f4185d13f58b1c32b619904f94ee9ca316f936a7d4643684c56b4e592fba9285853fe59cb2d37e64b669bcb9738c7506f9a59829e59c730679e7943fa79c536e1e277655ecaa34ba8b341a9d46ef39a594524e59e78457a551c239e58552b329008199994b52426f9fdef1bcd2a7e672def851c3649cd97623218dac6da2915d19d9159616927db1c2c2cc2d24ef7a74af85f4e2bab4b05c49d25cb61bf94e7a713d05935685bb7bee234e83e12577f717cd9d2ab1f0e58d0d63575a7e24099a90a009845a40a805845a504ab9a094724129e5a2499338251667cf9cb14762b3024d68133ac50ccb45eb552994d05f3699ef229b10b1f0659315ee898c4b1f9c742503315c58541b02fbc2858d449b569150e537d08383827542cde04adb4234b2975da92b2c9ae93b1840178e0e300d5cb94c3f0ab82add9e0efce118433676129031811a76bba92b2ef17a8c8ba9198e1a0005ddb887a38536f58f9890620cc7b27d9b3a966d6686c5855fb87cf1752bb0b31418b6c849db0d74c1e11cc7fc385c361b9f820bac7f578d59b61bbbb202e43cdcb926d868a1d0cd46fc5c6d149704bb68c101df037d6221f4642ee4627b20ab4f2e171e61c285a30b1ffec027303bf2e3664b6e76648a9bbdd6a7b79714351ae05223395cfa73bba1f32bd3b04decd300ae9cc10fa457b92d7433389560dff2d0e10951aeb0a2c8931358e14d72a20cc10401375f3feb4a4eb37926affe57ef8684fd6aeefb774d9f4a26d204faf47d0d53e9495ccc4b1036b6a9be7f5fff4284bd3cc6300ccbba529bb0dfba1edb8f44a28c061e36db6bdd7775a2df36afc7f65727daba2cdbb6abd33cec65f4b7092bb509f36aabc085f57e6e492232f61e6c6c130c95b1fb74cd1ae05cf67102c82dc0659f2440b7f6a908f6fe5ad4e8261f6ab3ab0f6bbd2952036773440777e35f7773615e39ebedf89dfcab93b77fd239e7c729a5bcb4a30d4e76266bf93c6af0dcdeddbde38bfe9f8c2b9f07c7901e8c8d075c7707c00300001068914814809b653cbfab5cd9c9ed463ec31cfcfd371e70dbab72b3d8dccc7d353169bd24e6360a5fcda2286e0e83005ceaed0840b6cdb07707149af1770704c2a08cb44d40a7a6519a65d0bba001abd46d86df6bbb219ff246019a790f3ff3c79e7a1f8f76e2625d8efa7caf2e87ec0b814bbd1d10b814c6f6280a415f11cc1bf25a42364f6029c03426ae61834fd200573e64d52800d3d424e0cadfa0b035a03771ecc75df9f283782e6b770cc35c83879c2b7f04d047d3c4ec3074e5262554f1b073a95cf9709a6ae4afe01b0566109edb37905e4572fed966859691dff3e195bf62042b93f0c16d1fcb3e4f38b9f3bf19e6ed8773358a317bd8c595df3caef655d68fdb8df9b00b9cfbd560822b9fbf1aaee67db07ef0aff7edc6fcac4a952bc33bc8c56a97837a3037e0e581c1c621631d108e7c60f96538ec20902ce3748c78084ab9dc4f80829cbca0845b2dd4ac305373b94b709b41d2eaa783bbf065c481e54222c169dcfb4050dfa3ac9e83e07e1eb30c7f23b81f7fdbdb1fe50ffff93fe2435e007fa48113c01fbb2f7acc07e0871b0d786de20d789b86f8feb2ba0c3ce232d2085a651ca44879f264c99224498c186181e2e3c4902b9fbf7657f9818c4b0f33d127fa391a59db7d3c7638b79783bf191bb2fff2597e71be3c1d1a3f7bf7d18757c43e5edd77c5177539e4777f5d1e86c58b7e845786d72ec70e1a6e7c1ddacdd1cfa28ec2d8a8da14fdd6b197833f7ebbc0d775d1af6e1ebc74b3d194fef65dddd77fb9c07fc9cfa2f7f5431deee5e067a9b197e38b0f67b8adc36df433cc8de718f34c876cf4ecee33620dcea31b42e1bed1f0867176cefd1bb041168b51153b8575810d1a55c182db42b12eb053d8292c11ec14168a25c2ea9d0197bf035c96b9b0ecbf4be4b1bb4c562b66ad7bef32cc02fc9ed238bdcb3db63d193e72707abcbda18eec782463be2e266aadb57e35d51905e418a00130870dd0ffc55001c8e5faebfbb2f7e9a831d51f587e1a2f439606e401733aba317b3378068f186ab5d699b14e852decf5145e32c85a63b3fa31d4effaf5eb021cc0513093ee2744410671cfe2d618bc7ed7faf5237cf6bea8c421cb9653f4dd4b12ec176f658f39467d39822d92536d5c462ba04f2bb4893f0613ff54feb93ec47ef4e1c7900166818b50ea719b8af8c72ee76dbc7940d75ee0f384108c262a14f11285aeaf0956ae902763e1c142161e602c626767676767676767676767676767676767676767676767676767676767676767676767c787f8f991710942202ab7df873a7ae7b48f180481dc95dc7ed9d373093472c5ebf2865715c1d49c35e79aa11fcb66d0a2a67943ad8a4080615aabb716188806bc34e06da14d5d33d2b61b19e20ad72c2d25d24603dee8125d5cbca14b15710d0ba5209015f66b179f15d34401f8fad3401d2434e438dccf38ca793ce52a5ff1d329a3d7d4d4d4d4d4d430c3c83416124c81c0d6d4d4d45420db415c0bfd900967ca542a954aa5baa6a6a66685a4bde0a6d050e3748e909050a75ad5abee6956b7f8654ca552a9540a042cc4422f52d060c048555dd91e8ef52dd34f0b020d551c9bc3e93c8a6726050453a9144c090d354ee7e8cca062abd56ab55adedd40a9542a954aa55e6054d0a28de3c01c863c178542a15028aed55a8e7b20b8823d90055bf00702c146a15028140a42a0570100da8c89b39555ab7d136aa606b65aad56eb51d7434d94444594a302a0592bec6bdd32dd19e71f06ea56e5388f7a9ef45a9e535feb34d7b196e3fe4da6999919d7f51c8eb183e7d40b14e1907555d8c2565b85b76e905974778fdea2c2c29f974be9312b42ac08319f4b73658819b18f1df61c7327e9cef9991096db24f21982916b1bb68b440f451e738cf995dbbc8fb39ae759378136f99b38ae46fd61e37fcceafa729f34981bf6d2b797de2814877acee81db3f83ab89b18a3f434b8456c1a1ff46d781bea1d91ef9d3ff46a9ba27c1ddc9d2fa79411bbc1ea90654341babba11051f65982e40c0d0d3573b70e6f9618502a82750642104249d2af69c1df03ee84c8f56777772992cef4c91f9aa0a6e6460376ce7e137c97734e034439df67bb9c73b6f4da2b12dfbd18af461cc9f20e720cb657d8affab8f8db6f91cb83610f86becd111960d3e7ae7a5fe97166b867afbf7f0d3877868ae37aa9fb080df7dd7d50a8f3e9f12efbf80cb932ea0b7e4d423ed3ecaccb7855ab61e5352081dca28fc7ad41f5d5a07363ba041b006fcb8134fc22ec325458f8e4c687397d8250e8ba57b3b07cd9728c1e16d6232ce1238921444164f5847a1fdc584a64719985e4e7d65c662961e4b252ab5b80cbac22436e144256d69bd95e88581f767ee571fdb4a9eea0f7aa372f32b07ceb853dc4300f0e69533fcf0b11cb32c49eb88592213cbd82cb3e370012858f164771d9474992abc4081cbd24613bc6f85da94dd775714b8bf3e53c922d5d8f9627b1b0b43c935ade5a966f69f17ab4bc772c5e4bc7dc22bfc5b32b8673fffa5ccaaeebbaaeecb7ebb3cd03be3d773ab81f89362048458985377a6dda5e90b0ad62e92c888631c60845f682048410d239e9f47a4cafdb3b42870d636c27d90b9297232c63ee43b6471d5c9b7cb489ff6565fb3f48e5e248c82463ffc17db031cbb8f435907d96e29a8ca422faadeb24dda3a44d70f58daa161bd244db4d7cd17623a2d77643afad06c31b6327a9df28972b52ae3cf57ac531e47f6f52524a690dbe9b0753bffe25ca44bf19b176b4aaacab6a90d5a8ebbd4675f0422316eb48a3ff2ce416d597d159ede0854152245fc8174ab7692fc3471d4bb7d2c900af49e260af57a311e98e7456149ad824819520ecd72809b449dacebe0d6f63ff45fa4ddc6e6aad32da3e0d34d86bd3be5e6a3b1fb517402b1793b5767926ef4b375828010b57b4fb4cab3e5d2faa2fc39d5932449304fac4ec411da7e94e22a5903e0d8110c28717ec607061b117fde821aa42213ada853a45f48a33390dcc01937fc9af50671bc27603b58b92ec4509cbf2244695f58fd15f0525cd62cf25aad1a71ba514fb09d0af4129a54f3f66ebba1795edc76aad15ebaeaec45b26dab6abcbb06ec3bacdd3baebd234ecca2a56af4a5997f665af6dcfbf75a5365daf75dfa6ebabd3883c93cb5c3ff290b0713481ebbaaeeb495ccca8eb5e8cb0f1356d7b51d743341a899e6f26faadd3bad18b4422d16bdd487b912612699b56babc1cdc5a12059218634cc246588a26809f753db2d7bacfb2ac83de573be30eca8d1f57504a5983efcb11db7c2f140a859228160ad52cc85a25596533ccc2065728d47cd8737d9497077b56ab4a39f873bb81b06705678cb00e594bfaf4d327faf161507c0214b34d835eab4f166539c2b220cb4296758b8a3ab6a2ae8e8140a02b3d272dc86a537c185c58f928d68d90ddb1c11229238c52ca28a594524a295f4a29a594f237958d2f656441c61e83249265c4ea32956be4d2aeed26fb6bbb710ca39c6570bba9b5668f751ce83c30da701461e15fbd69da76d3dd35f8560fa63f078c2103dbcde55980b7ed067a37d8f8429ff88536c50e7b199e75d7d7380dc61d6b568ab4d0343eaad8686fc3db681fbfa64fd856832f06b5ff3c703fec75705886410cf3664c264d0135c32a7683fd2c8e8c031cbbb05fcd8db76fac0f3b1999d7428d5f849d9ef470b023cc171dec679db7c8c4c63611c1f5697efcebad5f735e33e288717651ced95d75d63a699c317a560c71f8107a1cc7f0df8cd0e07e88824cc6b4ec8611421e64dc34d1da0048675acb6c1b1136bec7e89a111bfb47846d2b9d9eec68a188df922753eef85198c00584cd31a243b7a287ca659f24aa99cb3e3580121fba7b1fc7299b399301deaf063a0d0358267e8c31be6f46ac7fafd0a61958d30ab2fa9aed9328e37b89ba4ff417079d37a8146ed705b1746a06000820007315002020100c0804227140208b535d157e14000d78923c74549cca8349920439885188188308010010030c10304363322500f82043d765e8920cba2c639764d855197421f3ae64d6b52cc3d3a58cba90597740fff714deb8ab2a2e935dc8a82b997749665dc9b86b9975a18c5d91a9cb32ea9a0c5d7e32bd2ec87c17024b07f48f85033adc28146b1d6de489383c88c993bb80b27c4d2ce70504171a77cee98380b0e67af1c9f5325e3f1ae49c52d542725fe0eff8ab5ab60e8166cf5c3a40b119a552ded9f65ea2d0f6628325ce62f6405307451ff7c447d5de0caccd649849f1a41c557bd23ed14670cae9064af6e8cec6250fa488e7195144186b6e29dba106a1cd4a5d44e48d68668affb2dd1fb036643e12f430d9ae4544d9189993de02ee82227b9c1b18ce1cea5a6625da8f95d6fcd7a0c13c15b5addb89481bb429ced2cc4d848b0677a7d0fc1235c070415c58d00860baf7db2614e597bf15f1de5958b142c15d8adc8e4aa3146a0956f2c4e9cffdcd8d4ef693e3a4b1d8072337681d1997569404c94574ad9c7e48110463a34e9ac4e590fdf17e85d2304b5586720f3c62257c6f07afc8cc995ec592d052929d6d7b28941a6a7f613fbfbc5f7c57631f9de13c8a23ede9bf13ff578742fa4a1ebe5ebb18531b0e6791e04c4f7d3cdc18e565498e2e06adc75bb372b1d72c7be1564fb4c3fb27e72523fa7f39aa78cac8caecfa5f6db863eadcd68215b22fa7122663fa637b4442c4bceeff10f82375d0ac8d2eb18ec7d127d1a55a523eb5a3c9b3e6d1d1f4166f508953c09298cd65825c56e7e9e6cc3de5ad2de2effd1db9ed7c18ce099826117aa2f39ac7c33ee20c876689c1304e17ea169ea650b9b9fc45d35fae3d82407a7ff03414819c117db6f23febbd7041135761bb74c3d41841a0650aba9a7d226007468876388ae8bee26c55e0683df9025706c4ac0481c747992adab0a5c6cac5cce733d9e82616f3cc7c3d8fabec8ee3e6355b95686de5b369ad759a6e2aeb3dd5c54217e6ff8f8ecc44cc1ae82f1728469bb26365225eb556f4b6d60150e12378856a6895936ca9f88e8360ca442c43c1cb065b569b49b8f9a948e2a0816de22d79811b156d2f7bfa6b5f61a838e331a9c0924c6e50aab6390704d1cdca06b6857a2def07b08d51f4793322c60f2b000165d195655c6504eba71b6e10d6ba01b2e37178a44478b4a448dc8eb5c1e758f87c8b0ef750c8b06e3b9f20fe0bd73b16405a6da4916343d3c729aac7822929cb0cc459eb6923be3f45664f456e19824bbe4bb5d18305b4f7ace884f8660b37d53eb577be91e8d304ae91ba4f906834bf4f4a536a5b780d0657daec3704a692c7fb6f9afa927ec05af25346e5bf450377cb37a391e5c02d4c0ce251b2c87a76e484188b1697e017ec9bb97f6e57d56f157eebef3056512d455687d484391902f1b929234cb453617ca2dfe24a5760a51a01b4e204885cfebace24f7d99a008816f12c05e8631f700c359b2a1e1a087a652ba6378d9fc0866e732d67408c80837dae638214de6c8ec5ff914be5e400d693b84391ad59c8d2ec3283ad0df0009d8d8a2ee51fd79589081a7ef782aa012785e96f2b5a0881aa77b68505774046c92ae5bedd43b1d204949ef21199b6234b16c359546bf72b6d18a40f28ef90878ea449f2bd1d87ba40c3630edad4ae36b1ac69792cba883b513bec4b6bdb9c708061fd1a1c5fec699bc193b62cfb99eeca7d96399a046fc0b9b2064452d59c50898564a7ab03ecc0da9c1f21dd4c6debf604990d51ca90f5f460ced2d98338f3390a777c441187b98f84b10f80b4be5c10c92439d22222b49a03b8e60ba10e0c13fa95b9223180c63e2aa122de0cf82c46b7dfecae4890eabe21fb624083dc5a68430b1facc00eea2eacb0c26fe76a32835791f4cb37cc0a9c9ac332c105766abbed9aaecbffde61d3435081f478f8ac56493eecc460c803a0061f52109730e6ea589c731d27589763be69afa2e384cf4554f8ed9b1dab874006a9d8b48be8091ce6c3ca001ef9bb431d59c4b4b4befaebf8d2c0c6a63126fc02a6f9436f0cc4b1f02c7fa292f1e69f2abe6917fa9565885fc1506e6a9038aeb4d9021136894a9be15a3b0f088a4c6d4a559cbc3de8199894ce4d5d14922751623f5224a58b27712a94c2b8c9a44a748c28198e2e1e6fcbdc649368f48ed6360628e86170583c0ef6d4803492f5de2481095e586c2f23a56660dd911ca0a39ebd461d012ac2c9a4a26516de176da08db514d7c5d1f15101cbe2b5319a8997114547fe72ebad0eee21460d86df5065cb6ad84f4af4cf648ef0d5aaa08dda5a8c6236c598cc26a4f1ef38bb53df685a14d04ffe081f940c03b550784dcf9de5bd2628d9df99832e455a57095d341061f52080a0366d3f40ffdd8114ffeee785c6007f03c162c873c9787da07713851dd1871d326cf7611432a54004e74903b3a6bc73e5574ce4f40942b4e876a5325582eca8cb08540a1429d7ab0947447af4aafb1f4176a4ec1724a4897738d4bd612f2de49abf6eea630b05243e7a4ad355709e20e31a8a77214afa2d4d85f911043e97372d68473ace0a011d7d9ce0f749cf3d2be510033f3b4b34914d26a2fc3f1f17cfaa35a1b854aa659e83dedc6280345a973ff511635b795164f21401edd2db3ad90efb81d91278043d16bad540f759a8b19ac8df0754cecdf0385a33f46ffb250afc7e5cd559ff23a004046218933fd885c8c0fc1bc35a1f934c14379b923475cf22e6755a5ec1031dc0fe286c88f749357d888bc7eff6d10e84f0f35d87ea5830c7db4955e45ac27048689a3d1cfc27cf56055b00e34bf4b39158684c0fc52f7bf27accedb84f24e174c56e052fe5c54c973b1c7435e6f96d4e320b5c02e7d81b30baa77884933476abaf0cfe63edd3d64e49f41a7a86cf803f2e1d0d0c1712c58832aaa176afeecce2d2343494cde36ae52ef9a1e1542b25c55c08732f446a0be9b634af695e2f39567aa558f69ac1466789327c67f4dfabd00a90ba5b81d1fb99ae809d9d93590cba0056c8325d11476af0b596509dace02bbabd50682ee6d15a3ef34f1d9f8ab4a0fb7d25a93a504b3fdb040eac786f7d30cfeb67d44515522f8f6b74ba5e40425a97ac28536677cba367694840a2a44f672b68e2221ae672d59d36338f2aa32a72fd73680bc5d6c50ef9e1a326efbfb8220d525fc76f10646a56314feca396054419bc493d6bc507aac03b8b791720a2b37c1ac48844d244182f85433fcb2ad118c938fd22f0d1f28de221d5768383abc41ca98890b814de6b13a7da84e064d8bff4296e86ceb2f9aa1821f286fd6c4d3f9308c79d5ba6c29ff889412fba53f1decb0bc7049579b813d077da2402e1c5af4f53c39d27a664212c3ef6d2c027929ca1cf6f695d3dbc6edfdbfc071be665852661ad506d135826ba12f20659b30cb4a6c43eb52f404f93d1c32d8265ab1b728c27d8028cc05740997237b254160a6ce4054bae2fad5b4c588de51ab20b358c650efa41a96a3d54ca16a120f6798dc5f8a462830d67c4ca53c9525caa08a2d8a01506a2e2a66a1bdcb0118115bdafa30b6d949957105f5bb2fa05cf06310dd92525e506f8d3b168ad4cd43558c290cb02a50f27dc6e572bb60d7e72a4605bc788f3aa640d76dcd215ddd6c5b002630aab7b219f33e222faaaca6db338424b426a2706cebef345c3c78d36b43c78637d588b7775d54b0414e4a86bcbe2aab0c0d34ea3c6fe821a79c0860c5d3eac3c41c8c5043224486cf7f0d614623a7cfe46c40558a31e90e068e8491cca8032a3511fb0647c7106d5d70f61d23d3a99b6446246ffd4fbfa0c6dd36e0ce56738ec7d100ec856eaf454614429a2e862811d59dcd889cd29be398078e3b37f9e9e82cf1ae39fa9267f28d3cbb809d974215a2fe490282e6ae23910d50ed96d861f49d619a8662950db973a651e1d0f7301bf3869ed4a6748905aade15e87696f8db03517a032fd8dc596f4bbed334b2643297a845b48d0313797a1c91cdea51b6626c5a4f2f1ff4c93bfabf05233b7c0a5f82c29fc26414c87eba695468275b954945c3ee22f3bcaa055bff237e3f47768d6c54bbd8927781811cc8c14ff162229057b239e38cf70443b4a277907601cb840f0e2c4ac97e4028a32003560d9aeccb38b51e951c39c986e34d476d15b2e02471bbf31a425aabf8b73ba823e2ff03fecd23419bdde5721015c0cf3af5eb7e78b5e7939a830789e06bb3ca8f024c43a42c34ac12432830f691891ef728744ba766a2b937b2721a723b4aeae7ec45ba8d367bdb2a347bef5ef60c26cd8712b5d6c1dc9fc486f2e90d6e78ea602aaf67ad45eeb7c539bd2b16e50304ab52eb4851f401eed4c9db52aaa0a4e9a5a9d92155ff0ba47f9cb1c42fb2b531834e1910d473ad8324ab892b4fde66900479e035fbe019ce0f9170e119757cbcf469872d4ce21910ff78dcdc298d0a78489a4653eca822cd2d57560c12f68b17463125fd095bccf511754cad37371a586c2904ea9266f610a747dec6b47fef184cafc63ef5cb252f642facf34fcb739791b84da688f2e3d6dd9d20bb364d923821e18f52aad7f9b01fee798da74333fde46fdbe7eb71380197614b6db0201212280956de32907858c27b4961b2ddd5c74be0dabb5f3b49c94637ad89f65b4f3d32a3a9bdce5583abed2441b478fe0bca1ef19954b79e33282503ea8c6f69f926d1564ec241ec40a8ff93a8e59fac56855dd9c6b65596bd72d6a580228e2400640b026d1d19c41e8c425f61402e4dbe8f87e2064b89f2e9308f6a85da24287ae30a83ffe5e3c4d9238d13259967d45b30ae756e25ac24bec55e12bea306ea21f84852f5cfa1b4a2477d4d2af65c57a665ca01fc283486ad40c1c096b92ce7ebf00da4053313cb8b261c5df8512fd0647b3a09906210e94b62d233b04507c20bd98cf812e162c233da8476a137545d1706d5c73be4f8aa328d16d87678495296eae3343e8ca9c70e43386a5708b8e40c2ccfe45e444c587f6eea4ff9c963216a73a714273a919f839fb3ffad546acdf181eb27cc35ce7267bd0030a8d994e28900262794815c09736277a2ca28e41c18a44fc90d9cf0f0eac84280ce01235ba5ffe269995fad8612c1cc034016df7abc4c3e7566264d259141200782ad4f8e055cfaef1adccabe283ec0267ed02c6e070ab8fc547a6e5f1381c012e4f62a28ed33e248412c231287540739891ef79a65c5b842246efa89d5592e158bd54a2304be2645bd413eefeb3f22b1a6074402ad057983185a328679b8beab3210377c3b64fccc1dba40dbb36648e256b14f64c6d82b63d168d1109ab1c0bf307ddf8ae135e4fbb17a56041794d37fee36c238d9e7b5e534198677828381923cc49089164e74a29495b2c6d73bb9b7f3655d198dcbcb40e810022cfcd889e89c11c9b69f707ab97f5a5ba115dd2e759ea27881118e475b544a1a1b5b32f6d0e4f9327fa699ce631554d2b097e4f0d6bdd472f9bc075ddd7bdef1f4e94adb113b5948cabf53e039310a5ead42aa3e42083c79aa0540fc2acf7812404b1882a8eb4d9fef6276a80e8f67cafa36dec28086d15b7476e439c1d41724d13f48cb9de9e5fb33ac3e87135e7b794ced663c3adee6c9a39e0d3d4f77d6881a6e3ed5ef2062cfa3b60989fdb38b1a627ed7a4785b8c1be90f0cd4ac259f9183a2a90b8c93c459378db286b3d606d76606bec2a40871a26b00190463a4b9d716bccb6b72c727abcedecbba31275f00aee4e09066a148cc3337e562fc8c37bff4da1ed322f9cb72fd63a5c816046fbd3a31f01b8679149070b8a80081d7db37b75e5296c3adbd8f478a4dfd92cfdf476e149dde86d1b41b0c0863b6fa5ad5aaaa8ccd8dc09d983cd2b955ea3107bfe36637f107e78d835784ad42aa92ea8117351754a5d6ee4a010097aa0704723286bf95c0a4a1e64e1978370fb22ef483255b9fba42f5ad3f3b2d70508f862ca5fd7937e0ce55c3b8214e0990dc553f104ffe7af45e53fd5451ab40eb50dc1e2062d38d4ee02c9a6f065edc82c46ac008bca8ad38b0b4a05c7291617eb9c8c0fae9c6cbdb4db186304c6dda541858768bc170bcb62ddbc4debbbdd2e84f1d4b2c09fcb623646d11d4e5ba47b17baafc4ee9bb5cd6916cc994f0961a16cc9feec02f3f21557dde11f1017f969645d941faa17cf22d29018a0cba3993dc83cac81281fe50d930b34c5782057edf2dc793fe0a0f0568f4b65849da4636c5bfe900b39651bd835218b5134e1cd537b928e2063b235cc99a27818c0843af181edd8e0da5a07c969f680ed0156c8063ee7f2788e013181daf43945f045e34cc06e604ce36c7c6bf523a509f564863d01f3ea5c6bea576f0da9012ebf065fe4d098979f84f9036c3fd3f55eb7f9530904b963d5ae07f87de8d81b7ab77b56021597b390994c9523e0b0f48167284184aa154ab47b239f1b7226a778b83d541e71c38babd50f8d1ac48807ebdd15de3d5ed2c6001f73392449909aaffe6aef3eabdc29a3173a8a4d95fb036503dd23bd0ff4fc824596eda9be12849d40864f00f73843514d984ca2fbae00d4d28673a304507c31730ab91f0426e4d2618a1190a8ef6c6657579d9457bca8fabaccaaaf137bc8054b48d1c79756a54b3a45cc66eb4a8b8284ba12413150d0425c6009e513fcb9dc63526781ee479ba96c17fa0902d990446b5a3742c4775f213f00f72089976da2e06a96840da61fab624ede72c67dff8c859869c32956a46c293ac69a9955257ad9775f2f2ac72c721ae80fd2347e7fc413d42afb03599a9bdb05ba35b5b3d52e4892487b1b97fd33cb613a84d8372e2bf63d112af7532be8c46f189ed4495aba8d44032398b31ebba236611f2f7e84df7f1e12df87c24a59a5bac9776ce0c3b38cdf86ab6acccfb0c90585cafaae2697493313f191c00891d16d13a689902e7db52f96dd9ff40f1f266435caac5059671821af96597fc2675061587ef559c6083348575f6eac6fd3c75636f3b2dcdc7593973f20012a66cf01c8f26ff95cecb3549f8956f6fffae1f96fb865bb1584eddade0704dc9afdb34441cee887f88340013b9b8008f6d5013d78e0123bb83b0815e2335bad96129f3f68edbd1c86a1dd932ddecd688c59f16d0ed638008439eb1adef9dae087428090a05715d700e651b8e18368dfcd0cc4ebc37e0e33a48710dd97d0976e8da4573d8c8a061148a267eb3f6134436a851c2a873a32d44c21c33b8be14b26263e53157a4fb420b1d86c16fd1015b704383c41d6643ed09748b7be8baf573fa5d54ee679b7f9f6c3bc3d3ec37b868f3988d683b4132c5ec7cd7de8d8a4a2e25dffc69f02f96cd5d03223ca6c6941138932533960148a7c2270ea313dfdb87251bf9980dc582143219410d7bb4674691ff41f9463d3aabb8ef4a868968d1e95687009609822de09e603aa9d92aebb52aa3e863c23b5e5e4becc4146026ba84e93991316558e5ccc26378f262b64939e2279f8e27f2e3b271b7c542aac5bc0a7da6c7ff230738bfd877b92b547b2c24ac612f15c61e3294406b468e610e3f15ee1e475871ff87619037caf8a00015cf93ab1b7ca0f1ed6a2659a488942516c4c54ed823ccb2cde2332882e14be95d271b389c49abde45b03986704b642a0c0ff562b01bd40aff44bd4f0f31a56588eec765460dad4c9084c86a461eb04b6981571296359160cd6ed507256ea430cd97e74c2e67c67301a7d0b4191c7c4196d2de63ef9e39cdb2625d361781e0813fe9c2df6a3eb5b66bcc6a9fc807e562b3e94c281510afa29b18e7328f1385021d274977567522425a790ea80dcecc8bdddb88e8ea448b7ee22fb2b0a3a698ce017daa99dccd0fe123c96083ca83863cb8cb77628ab2fdeccc75f1a8ea1a650c90dc24ebad70dcea84c3924cc0d2e52017b4bf33ef0fa807c3a970b1830cbb96f74bbe5ad8c3782a8453bd5d8eb19d24e2dbf13e1e9b86f63cfd7d45ec834395734ec44bff8084bab5f622730d5f380daeabdd879876abecd74f9041b2ff19b681aba9c8b08275ad665560011de534f8a811905949e5fb0192f6532a4dcd17b1f1a942d39b5eabf2b126595f72b30b39e79d247e423c7aab9f391e28f4bbd33a5ec8ecb890a049fa9997cd2c4741e61bbefcc6c9809eaec12dedd12b26ac06370f87be0d945314d19c5fae8a0a591aaa73507d6ec44d22ae89b51fc5442dcadd891d1b2538ababe6a82625781688470338ac7cd363bbb45c3db1b0e4cd333317808f51199a88d430e0c93ea162af453c33eddfac419207e8dacd621b623a8d08f850f2a16abe7863cff28d70849cb147d7e374701dfbf945cdfc17e0fddc7bbad49c038caafe496dc0397f387b830a28bdcfedcdc4f831d2a6cd5f77e442f71937fe0baeaa343ccb57cdd131b3662f1f50866f9140543a153afcdfc3a2bc69052db2cc6f8a4b41601bc04e061b721188d1fa3f1d99754c479b0c5d99965d77d4a3411badeeaadb34c8ec2ecb7043b2e429c03e7fcfca58aeb5479c6eb619bc92c6a77e5847eb2966f379d96a8735aed61bac8a5a39ad554e570b91a394c109d403f152484cc32ad0e88c3255fc706a5cf12626b0f29e75b8425fbbdbe42e8bdbab3ce585532eb58026b692c4873526821642d606d2243da95888a08cca434c08e3f67430998600901f606056ea8627d082b40e0a6480a5d983d82aa4e5dc44708491363bd3fb9d60fab54353c9a80f4b8e74a736f8b76d97e9ad58f773f24f78919bda0a023431c351d091770554f6dac3429c578be6187c00d7d515f253dc394d45e48a41a14e6324e856b80a7682d15e13739fc26e57e18e4541d00ac3d0e0bb9ab3f7a3ffccda0d606f90a864f4f214e8ec2bc654785c158b43d43ce4afeeb79b13ebf2c2453b00749809e72fa2787367759dadbdbbdcc7d7cddc86ca87de27692aef5230b726c557fa20534029fb759e8361186cc6ca2c78902f0978af65b08a5ea87b39936ab36db72377ce67f427953ac4c5a8ad4566bda105f1be1774ead0a9e3382ae2279edb4208e20e3dc9be4426cc88a29340e37108f1998c30ccca36310df42b6a9a3fe205e2249c56d3f2b83ca40778239195e19bb60a9faa4ecc52358ddcbdede8878872dd60843b4501bbaf64fc6a1b0c478e505dd8eae7debdf1805caaa3cce117645ed9ef6ecd9900b11fbff6028835be25a39b53c4acc5d035c0b6a30306cdfa07a9efcadcb9600eae138e367bd51661382aa6bdc26ea4c2265530e93ab8697201d545e9d2e7eca7e008875431cab97492918929166e6a5c81692959afa220a6088c4bafc629681f4b95cb952fbbf4436cc7531cbc9bb22e1308132d3d62e65f005314324012e8b0b9d3248420e09d7f44e82a27672f20aa8e5034e2d2fdded1dedb77d7ebdebcc1cf980ceef509882f0783fd8403bb5c849b4b1db788cd93d79c4fbbdc3820699972349f85dd1649869117a6967cb320b4ba334e6c0ecb2f4b81eefd81ed12cbb893f3e575ced747aea999a5a9e70382aebdc4b285127d21842cf83867908fe737277d91968bd3c755176224f38173381cc54e5dea180d1e26432d8c1d704662a4398dc72e6214727bea01540231f4f785534871d2da971fad875aa88210b22c4df42446c0dc992c40f0367c251da215500479f7996318f8ed5464ad5b631bbdc566425ba70f71f7aa72b7a89e62d68d9fa0a2632b107ab8e7202e96a1e417d5ed60eee7b80f1c51baf5b4ba450942232c7fe18beaf5adf1f3661d2eae6c5bbe63df3c37a9a40ea57e7e2cd36d03ac6c97e710a8ec9552dad596d779ed49b4fb4852ae0bee82a354497d26a094364b2515624e483007069010429c20ce32748ef23404f7b2f92a139b8cb20c9503214694cf88239acf1352b98ec52a111e87b5e0cdad105afdcac0195f21aba59c900789086f95383b0ec85aa382bf023bd476f24e573c8d8c82055856d72d0a42129b3c799d3052b03a4bad98b56c1dfc2d872d11f3659799c8da6ac156bc3fd3e0e804f206e9cdc03d4810b97feed2e9070e2d4f038112abc0dcabe0ea0d9d9e89085138791afe44068782cbcf2282d0a33a2ebce6682aed85959626236fd72e310592b2230bbe1a5897b11b21c08eb85833ed598aed9e04dccc5ba8f7a891a8eaf565ae4d07fe503f7c813b4e27b0e9e5bdfc235dd81d80d72628ef50c0446513016835029b1dcf78f98bfbf23f50e438d40eb90161944cef1b3a2f8369329f95047850987a9c245cc3d38b4f4d4481b60902c56afc9770ff580c0783d972d346e59c7f95b9ea3bbf7ade64850b98ae572fce41222999f9430dcfdf4f4f2bc36046ee8bc0ab4fbec288fcaa5018d54d586df759e18e2ecdab9ce6782e33d395f2238872d0efe87216a76400ef59cf20aedb2d690655fbcd94f66dcef75099f0a7e9d330e3d41ebdf9f0d538b1fb50fb736ee35ca261c0d89f430b3f7548a42980c4231bd7bc2ff517f189ab3d07408e0afe1edcce90a74a79a019bbf7d0d99659731bb8a70878ffc55d86d90bb3436aad93b13c17850a42e8da99bbd33928997067bfae214673d54d98ca17ee03b652f37b00ccdef7c706c111f6ca0b5b4ab311b058335f2d90dde68c2e23d24f2036f4aaf54794a267e2c5ae4498ed33a9590f427eb299a48ea2155f2d7c69b91ceacf4a924a911cd29e0007d0c3e0eccfd7c439b1ed909b234817ec34f7d561ae375951b59581a611ff0cf68ec91a604a3ac1325858d9bde4504307214dd3e787ef5b2bc44244c733ca4bf547062de09f1dec868bfad9939f086a9ce405861cc6ef1508d3513a86d9882dab997883543ac7dabd215c20f8668c8b444c1cdde856d1e3795b11603be7196adddeea388b2d5c1e462424eb4697ff3141787c49faa797223f6c143d63dd7a1620b0b6b908966a55e4f06a82e37cd4d78c5d1ef29b43c42f4902c040749b95d602647397db1098b6c8514d3f30e7c45eddd4c99f0f0537629cb4e4b121204c5190d6124ed347ac0e3703d64be57578009607e26eb6a8680685f90acd6dd5806399da46e69dd2273be3e39be21119bac329ed22fc9b34e58ebc95ec9672933ab39beb80df85740f8ae712c81183a318463e5c4eead8ad1db87f10863e98a211843377640cca0d8a19ed72886504c9d58c2b1c5b171583ec198ba31046213c536e2fc4631846208c56e7d0f223d5df46de91ad3a3a087c6dfddb70d23d0ffbeda5dee1d5643263eb517f4e06f9b5e0cfc050cc49a4266e9bc509be2c46674d96578b7965700bdb482c723cf3d286f7e91a065dec6d1cb5285618ba55f07ec201ade32da6aee99e47c734bd5dabba7b354c4e8a2ed1495837bb9046f4c146208a397f67d93438cdeda4859a2b2b968a19a05a922c5fd5a540a2b66bd696f1c29ac2a1028681ff3951fdd4ba1acec145c55bd5f98265cf0c8ff1f8c309999d6f8e916df1213f653b1da8d3a9665b5f1a2219305e500c58c9e1621aef4722fe190d66c43dfb9cf405a67a9f046880c0ab45620249faaa61a3896d262a5285304c812e62ce7cd9357742dd96ca0514c62516012f7f9c592e58c28c4f62b6ce56f3688b8e4ca273cec2a330416f0efd8432d3eb5325abd3cc297ba29e14ba411385a92450b07af86fc88db655fa4e8595611b94fd4e070e79a9046e910d2e9a64710f436fe47ff6b7000a3808031950060a20036bd80343996298846be4eff84dd15c5e25eb200803803acb8dbe9aba603d1be54fd2d17f7d6bd8110383c0121692aac5059ff1fed51393cd3418ac28ae6bb7600ab71ad53a0be8c6e84243af4165a3afcf12d5131e1b2990a098ea0754320b0232104989239abd601a6ffc3bac6dd4824c5cca229e631d1ae6761dd25de5717a4e8ea9444b7ba21505607a25b754e469a10921a091212d9ff6210e9c7d7a7deb231e057bd66d91214f5dda97ad74dc01e9bd47b48d5459277f2026defe05c2d3da15daf1a74f76e25bd1be0f1c0a35be67763ed9282cb5771d1a6193b851478559346487f8362a180688b5d17b24ec3d7b856aecd6a430f7786305169f130d4af04569b3ebbce4938b67488f6e4d24a639129b43c321d05bf1d9c8a98276045f138079709dcc23614171ee03203b746ca73454ae88a545deb6a1457ba1c6d2561d2b8abb72b35e46f5bc5bc6b4d224bcc4480d8c1bcc3d3cdaf65ac7ae7c552719098a697bba3e9bd2668990b754c4f0e6ea3c00752de768a6b8db8e31b72b2acd3c84dc0c9559d99457b885e251c071d27b4e9d00a9d3567878e34041a9b59127789282207e655650123d58e4d899580b029ed6886da5a1d86ae76a3b5bd951e482a34ed043e3259e9ca34572a105da1d49a54d6374076d4cede9b7dcdfdca1090af706453596112be98e73489045689a74b4e5d3822fa34eb9c845f409f7a4c816dc6909d04bc3b0c95258523e1053c15777530a48abf1edc68f157c94290d8c19fa8ba0818fddd917f0045ea94063ddac47302250ccbc4164caf623b760833d7c1f65d45141fd50320542119c4cb0f47c8f3f75092f48adc3d4eacd6f8f5ae794db810b11c060b717c4c2bc485a2aa3ee659912412a48bcf5a55aceaa1d7177ac3d8e4dce2ce418e17c964e72025c42026e48be10e47b8c2c970b92c8b1a89c22634d2504c6c19066f2e7adff0f258d809600c86fe7b66650fc086bf91f9299edf432e8e9651bc4bd57ee7c1d8ed65e5941e3d3a4c56661e0112411963dae7cfcba28a6cbdb4dad488db4d566f62e82a0992293794d954104a821e9b98befca0e420083e9943aae07794e6444f040d8df6146e42f5877408e01bd2c06c44528d29f7803b76f33d5e143826224810c3a59019619d8e4a987f106af99dbe6314c61dd2c62877e3d1e9de4adeaaa4b7f921ef18711789138484e47b2d830290eb02362d78643663028e42fdcf544ef266c9ea645e7c6a39407f4c9b1215d9a30c188fbabfb2b6046b6a13f26861f1b69f221cb8a790a7ee2be6cbdba84cf73d08d1c8b58be39d7957f145ad87db8b20a5100bbe938239366bd3c333baabf55153fe1b26e30e2bd17b0544d65e266c7454b2c2a719656f9f0302af152210692f676343e71fc9695e2b1e9b6ca0bc00abf970c2dffd2923c005a30fbf1339b27383d8080b3942b8ecf4bb57fcaa468306e1ccf28d3442033b7682bd7a3cdc7a9845b27b18b458ea47e86ba5bf1786395dee18b75c832836349815ff249fc956e94766de967ed477046de403d91b92f8912337c98cbe41012deba5fd2c67630dfc8423268a4adc860d5c273d9d2f3ce6ae78080dc4394faa3a3fd49b1b574fcf95dc589063cd460a7e57b8945faf83871d6575c017fc5c876f42b75e85568ae271ff4a1d6ef2ba43fab018c4156b75d50c5351d9bf3897dca7329b84f7aa53d1f2134ddfd70c0694f9a6674ea5279d06e15522ef12b5fa6e48b526097f10c7444c10f054bbe17c6a110a1b466ce49415b6957b34e6c705cedccc4ec5e0904fc46062f67be88d979b6dda08615d16395879f6190436248dbfc5fed736a628fcfdc5b2f166b3638bafdf5019e64051b423da48c0a113717692fb3857950976cc86502d287f650f8bb0fba60df83a5d65130753a7f8e4004ac5afdef2a98136afdbeac96916faec8aa3b0769111f6c83a4ce9e831d821caf1e5980b3f1e34e46015f70012201cc42cd6ce89e8374cd74283ef07adc6ebcdcb458757a838a0a7ac43288e0a6dd23cdc145a3caf7ba4cd3ae833fe6461a2a465efa66d7c081b70f6f48fd1565e1bb7903d07409f7c78dbab59f96a09bbdc53cd6f6df4437c3954219f0dbd409d5e64ff3b128c03c3b68a4b8fa9452d544435bac231b6f51978c161e66c6b4cd9ec901cd4f31c95fd686466babb304f694551dc58d3a17f0e9908ab65deb507d9501d127d9c43e81a1b9cbed079bcd06575e3f720d0eb7d32a1b41591e3673e19e395e29f7de1a2e871d1108a797d2428cb40f137e2622ea16cdd5e283e48cb2e52d174d32f65fbea5fabc1b52f43945dee29310789e59d36ba4194caca65977a72e7d8517e4e2aa71d5119c78d38cce6efe11bd29399aad4bf912c5b0a6ba09fb4d4557e44c029be002898c5ca5255694b5af9f96598e5120a0b73797454bf3134c6da5fbce1506945bb435de8bec0a93db53020e0dc6a057f949e1668e02520289d4b3ed5262e6f25bd2ccc6c3d3355e08f96267ff22d11fb492626831b0dc805571cf826c778297693640ab5530cb1f06788af4e8bf95be705b98ab8fc43ff151549f8dba075fd808ca2c9105afce4e08dca11086451af22134bd748284357f184de2c58e70d50ffaa230d075531c254c76587f59cfd35f780c81452de6dde4954e3879a854b6cfcca296aad712654a61270e3b588d54c4e224c02036570c942e5c083d9cbda0d8326f67d3567259bfa1b3c71440dbe05625bd49bbb036b2d5414937b445f7c29e3a3b6b1f8141b015d6a736428b77ad898ae2cdc873113861b518057cd40560f7022fd76d24f3e610d881ab3be4b160f75fd8326dfedea11702a0cc9677dda844c9b63f5f67bf7814166da1c9db9bd4288bc65e2fe18ab3e8421d82118f0ccf9a3cc82690290c8a3179a94c84d18952a5697270440646d31fbe216c5308037b59b8148a9915bf965684973170429b0310f2f011ece2772a6ea7f98022d52323e59ad1f72e28453fc04521ebd13bd52a50e083ff39d685e59535126d375ef089f436de3619f3c4f7800da49f9588655ac47a4da87058745f4fe80ab14567cda1c22b3996f67980956a0ddb27e155ebc941ea0ac98d822c5e7662677d301d3978ce2b40855728ab23cde8fc5d59fc79aa3911dfd455db236748c1d16b1243a14bf162b303ac619f27819215843ccd8647976c12ff57dfee922c28e828e9975db833ac9084255510cc45c088503222e4df55878923323a5014a1c10ca6bc14a73b4b56137536aebac35ac75aa19ba2e5e37ab1f1fc3b06e0f0de988a3cbd0117e78557e83660aec544bff5201c505061225d8caa459d1b8d6a4b5a4dc9a7c0d23ea669ba5656f1cea31919ae8139fb0e584d296db804b030791813125712e94a17358810164e0d96a4cca6d369db8a5e553c3eeb1087b0c51c22050448ed208e67b591a14456e51c6507636d89a2560eafc5cf138cab807c93c0f3132fb0a12d25c1acd42027c2c3875344a3c0ce38a6d02ab1caeba29118916924b988eaecef87eb210a61ed3f3123622244b00359ae60c6f521a91ea1dfd03708e16b39e555a09cbb471e4651deff60f37e9e96dd2a0ab67df36541d82ae1ab39c8b30c6e9bfa5e89f8596a1c227215fc642c89f409a0acec05e7988361c170e89b1e70529e42470a13d8d78b42a8cb32db83e07ba8439e9062319bb13b6a78ddd427a485c5b3196062104f563f3ca818828fb1499165e1383bbf7c3b367319ee4befc90853f7e806433a3516e3adabe48bc5a6999a41dc1869a3c480d7b4d845a8cd3a9374e2200631b73231f10a3e65a15d5aa33c6d42fbaa2ecafc1c700a32567a8523feb2f4ee02f23620a0969b1e2331e62b43e59e401a91affc199150cc3470c75eec565ae0800f72a3baee4c3f692b14c5796f0422c3522d2c517bf92fc4c0484e4ad22dabf6b946d450210fd3d2c145174fd087e577ed435ce7382c5fbabcdf2eab8e29ac7ac2b435d347f41fb518ecce82ed109cb7ec6453c1fb90fcfe00e541a19dd3d36b1612e5161c4db01157407422a6f03756082bc8c38d87c1c1864076a42d6ef028515ac4212cadc484e14d9abe753e945f18ae9db64b4ebc5950fbf00b6ffe63b3efbf854ed8567be0c00b6c2483c60df8ac138ea9cc98b04c4ccdab66b50a6821227f4410677e58c0fa960cc7fe88c2c8d3ad72396902736504226cc0714ee54621eab632b6bf5716306b3cef924038c9e55f9bde12be63bb37fc0c67d9d884e34638f900199d80263fb8a044620df55f0c83ee7c0b5989900ce45b7931ecfbb8b0b78209120a1aff4c6ae8af0a8a1e5437c955da78e74a97053b4a2b309d8ab9eb367fb03e63250d6b5f5ec3c40f5658803ca0d0dc2392dec1c660941824c8a9b4d869d3891499560a2d6243080fd0190a41535199d0139cd1e5c196a709e4c5d794d45127699ac2dc5951c3af313654152b5edc798d415ac885918a66ef69799e2abfc86c6c446e64685ec8114d1aca5b0d99631fcd78d55977560ca480cfd0076a4ebc20228a1829e292aadb2b010c7a810dcb331fd0424547a9734396a7abf34c9b740f04b44a35f1d65235b3a6cdcb801376bcae724b306dd2ed47b6cc3eced671c5f40a11bb8d19c24e4ad592ab33740713ab69ce3da4938995b81443940db43104f109717aa7c816a93b24146232a512008c2238781587d2480e96f840f5df8d24d2e8e2aba2b34674c932566764a8ef69132d93e0f0e1c9328a984503380cf385e3f9b1d52f0afe8ef4b7acd50a54be9cbec95dca352ba01d072409a5322e1e121f703732e250ec1c928cd2aee94e0fc3d435b6780431e287e18010c9ae463ff2527da24384f8b0cd50a1ef91f5c507f15a3255cd739078067e56425fce6b3bf03ebc15467aefbd52e71e09ff90fe6785cc5d59f240e85a044ab408d1e818f3518ba6e2e0ff2c84a0e16731459eb7d155e7be02590efba8bc2644012a4088fcd03966b57fe57eb968f8e7a208a788d33e776de9b5226f3e2a1a3ce5d0dbc7f324b63209a3fdf7a9cb70c33ecacd1bf036d4b42dc71e84b39ec4bdb7c526e3fecd4e42148bfee8947328d181bb213f4bbae1495d3e465ba4eead97c114ad6b5648baad9cf8be9213bb701045db4b24548e9a27418cddf34cd5711ff873218bd2c1074a04c2b0a4b2fd03a17d0ebdbbf73901fc035d86507b78ece9b72346351b27427d3df29531292627d724cfdbb3208521f35725b07319633f6973f09645bbae8b68e4a6a1e0b4fbe271e75bde76ad058d27d488e4e19936c18e7f8e506246426cf6ef08213736ccb1d201dfa5b2f4bceda7b7e1508a8f90052ebff399ad9b923dee12306da6aca77945e372713470e8c40c4cf873020a54e6f39fa7a9000e0737b4c2a8a873c0423c37b890d2fb5cd8914115f0d703016e409e6f5f544cd6bd0e8c6ff9bcae1fa3fb5ea98e26512547bf574e1e6eb469afb6e791a1ff44e5754df31da557c180363796b6f81f33acb2363c770fa33a35519406b57e2c33024b98947d046b6030f3be12e72c4232078c5c55effea0df508a5a6a04fe58e0093dfff46ca1bfb1cfa8cd8e3ccee3b226c42d5b0e3e27c7fc4a465b354c061854f31e3defad7eee894426ec927b3ce565fa15d90240b937c461c6b8895ca648c493f6d8ed55b7c777fc120981647a2177bcd04dd0ff1ce427e545f497bf20006c08145fc6c96ef5ab6b6bc56d9d11c10cb9aa313212af82d79edc2792c2755461987a2e69c6fd3c1d433162d3adaeee6f3d12e374667505a55780370e558cd625d3405e0beecf100c8a9f57d2941338058f2fcf755d2efe41eeec68b1b3b624ebd9b3cd5fa523857ee46fa5373df87cc6d9d292ae8b295a9d8fe9242ef831b0d022fc350cf05b46ab8dde7d3d8aca5803839f22da26bee0d0925c14f83c44743933aca6d2a73b852ed672bca1e5a894154f8de42ccf771645f545360a5781ff4c7c7288a6ea4b13799639af8afdda0d768eeaa3183bc18bc3041900faa097376ef4205d20c71c4747d40ed3793fc29d290eb06d73dd8683fe21dfb1d902f7a89724649d23b78861bb8bdc427730e2542991cf813078b051a185768b8c879a95090584fad1c9101479618b2e8da024fc36401704b4a1870dc2c323018d225b216b80bfdec73b66c981d8bbe9b7ac77c8440104274a0428decd2a206a71e19efb96854d2688d3de6bd36a3fca41ee4cf69468fe4c6a544361ae0f63e449fec8e0fd567b919daebe85430e9be2dae4be787eda986417ef60f1d66243302df2c6dc0c118d3cf7667abee61852843ab2b85a5bd9007433226f4b856c63764a854882ca74e740ab8ffa364d62be831845bf194c61e149ec203b9ca1e0f796956206a92349fcba2a948246f80142e1dcf32c9913da750e6e3754fa0d54d2b1f9510154ef363276fa050725101f9490b1d6834aa316d165e818bc0a3e35afc807ab53784c59ed61508390a3c2146494c2ba4f981533011fe70d7e39965e141e1a1e994733f199ff5561aa004764e6691d94468fc6596d2da1a15f197e4398a881efe6ea9fa23764abaca0bd008429f2522e530f1a31f625d35a4def44e62bae569235ae9807dd0efced66d2ce72ce0c0e292cee6d7e4941a3aac6d64a59a57ff8f0d9775a93d68eb759341927201053dd445229016c0f1c5449879079b31598b73045f82428a14707aa4c4181b584b07df5e758f06852f9079b056cf5698b40305b90401e2fd658fffd3ce898bce35ea4bd4b9e0673fd7b914d1c76a4058c4a14132631249824f1c0bbb98db257a535e4c831a9ce5915e376b5135cb19f5f141114337223f955572fafed871ca4ebb0cc2430cb7dc0f735b516221fd307d16738637cac806a2c5c30c60932bb63db54b3fdc7a37edb9abf0d9d892c0d36f16e485e12567c83aa0725b8d272098935bf6dff3bbd8eecf6130713ac4300cf351fe2ff0d27c61c6b17ae362b6cc83d509b356b764ceba10049947aa05ccee8a6730b69dbb968e91af44350ead56b63f3d60daaa92c1772212f0adbf7d456a9759ea90af49e313e572ba34f9d24403f801a469510d9f7770bfefc75c100e4cec77c957ee23194bb8c1fb63253dcec90f89b1f01dfcb04bb050ed1bd79391aa02de8dbf5a9e82fefde4fcf827a9648f89cc3eaae7a02c9720d45a6a4144ca0e122adcc4a411e8c213f05b4e614e56cf8b10f0e79cfce4e00df884abf3851842fc62235a45a6388561405900bd91ce523dc244c49298886c1a7d34ba5060080f3b725c344ceb5fc0a4bdf61c5c03b4e4f309fbd6d8a6962b24e8174640c8e288e5d85294bd743c6175e6b966aa7162da743c5c19a0369d0dcbb4d44f9d610fa789d3a0cc80d785d1ac98c5c4d244b78ef04313a3015d8c4f9ac7843951d63fae39cf89801142e7fac128a43ab0500aab071cdc47adc253e92073d3f11112d4a11efd5289d6be8ed487c9dfb859242d7ff4d08555ef817d2f21fd667058eb2574510f794a3f753ce581f420d6e36306f2692148a48d1facf5b320fcac8aa00a42faa8eb3c3fa657faf9a83b0e94be7294c815a3fcad9aa5af33e16ec43cae6f7556aaba5d4776b13217d7eb24aba6d4d7a5816cd594f6ba6dd57891488642dd727f05b21be458436c1b62095f84fa1e7637e189c86bb83a444c521cbc4d91142ffb9d2f2384aa93a051d434ae36fe2a469e670cee8cad1420fac438ce542a3a9e31fb88e8ae2ff497660f205221408068dcf33df52d103160fe9e7093fede8eb686f7ab4f649543a85d43e681de453316deef984047df352b08ab3e5221f2c591c022874883e518f67b39018ee0f4ffe0e308b3eb7c6c85e55a2f6676c43ec995057b8e4feabf3e5c75cf10199394b9c671c1a474a70c63105b501fd0a31b12223e332d7984cd82588039176380bef583abcb5a3c3cb3ff43fc50adabbc552892b44c6226ec3784583cc6a6b2e3e151c8f382cfebfbb81cdfac6d2dada15c4bad4bac3069cc336ddfa51be2436d7935c2eb05526fda8759303aecbeeef0ccbab79f47a20b9fa7d04350855be72e46482f2dd98bda1077dc32464cc58bc7c45e4c1b38d67dfa40d46aa8f8d1de046e16f0016d2e244c23295965572ff88139f660d1b56ef640d47445441991dfbcf79262291e7a42f79b08a2f05461fd03ec048963667a0ff598435330c9e22151e5734413a26e8076c3b124f633fc74b6db0df9f0293a688e32fb2ecd23b09897b0336ee5f9c349a81154d11ce57e3c1fe4f6e2e47559e967a9b36a843af9b3aef54d6a56c0503500f8fabfd6481a874e19ce9ddb6f4bf193b04ba059af210ad023e2f882a4772bbbc740f8135d75664f899f04f17dbe7e1b53300aa1ba2bdcb68dd3957a9c562288c0ed8426c9ee557ea15d2f9224ffdb6acd44ad25b3a269fc528fd0476ba5730d07bf002268b5aa1c8de6cc4de1b1c379274860a9966ea11e6fba105adc31f01eb2d101db0af66bcac1c3e7960bdcfa32905e40a2444caf44d8f0067d861afe5b107dccc54a486c771e45de74804e18857ac47edcad8b0466fadb2344a38d5e709d4a5cc8397da8ddefcb9c364f3a8cdc160067a5381217bb3bc4dc293cd534c3f92dbbf83fc2794363a86692cc133eba6d8d8d27c4199bde4915c743df102cdd7164808e06c723b038b5e59b8c34284cccdb47c52c64d0d0d003cfa71991d09d8c70d75cedaa664bb2ac994d665a948da465e819d9213cfd322fc464e418ff7bd10f3daf072855e79437e11a165cc60937c56b012f9ef6e384d3a50625873d36bdda5fef0905309e07205d281aa6f487dc2529a93f12648ea0997d9d781ab7e18c76b331f3a8d2891627f39383869049c94f62bea207912c4af53575683e6fc363312725b766565f8ef0780d378768364226e1428c7f4d1694e0e89617bd455161fc871669391f792e22e40c369b098087e83d75da2e8d2b3ea43bd18b70b56101d58c31de84bb644d6874e0e6049cd0cd476566c6799fc2d5e7bff4f426945b4df284ecdaa0cc52d4213b0879adc1c9c209871b5ef604bd8c080cf557b210bab92df0fbad40b9a2e233f106e4037a7c72e737b8c2e14a30d87d835a38e56e186ec490066cb1b916d66180eae0398ed4be7a69aa0f518daf36df8ebe01f382f453456c3eba6d3907009a3b07e77dcf149fe71c806a1e646908ff14caffa9010508313444c027c2c507f57ad2ca4e45149e7433960e70957f7a64f72aac39a4cc483740b5ccf911fa5384ca4f6176a90354f9ce46e257311a6faa194505d4c90761f8ed1bd06acb7f497a0219ab6bb86c806bb99347bc4951c53969765504a2739c8df09fc2355e72b3690fb09a796684f61516b78419e93e40f974567e881194a85a7d979014f64cc459ed8126bbf39357786c136505e38b92f167fb4aaa34d0b615e2bfe83cf89a7d66f4a297adb70a39fa57b4f1269b597480f58c7323b4bcd37976df2846918b9df6592554b2e6b814de41d1374e26a40f80665534f2819cc506940ca9a310e43ab97f1f1db0426c58717235cf9238b1118d8213fc2e6a5f2671ee4bc98e76949e191676240bc5b2b63d2d300eb0a92073b9a2d97ac65b6819f17c09fb6b737c30eb0e6e3a469498fddddc1b6588caceed1d3994b9c3786b48bb91dd75c23ba7b59a5919b48599acc9818a980acf2fc1cd55990d6c7d801f1c13e36cf15359a12e92b3377052b1049cbbd8f18cfce5c94c56800ab806033fe769cac9942c20b22d08a93ab69e1345d92a2c80b2b8e111c5fb30e1feec6e70698a1d8ba6ab732d88b93198925d7af63bbc2999899a863a3938d8516817b37232df30dde743d60a45be8a6a12a060f7463ad30f3578d517e5271673fa7816350389fd439693b787ba0688486f127af540f2cec7564ce5aea7bb8ce8aff1df44c85d9a995485f81a04b9ef9980488e20e871312e034aa6d51de3620b1f31bd3c171c8304d06a67531e88a587aa8dfe8181035f6553f82e5189390955e5f63b99276abf69eaf2f29d5cd25465adf748dd573c65dc9fccbe215e3245bc7d987e5149fdb2296f271984f12491f48d7eb9611360afd73ccdf5df8a9e11a4387d99583d1ea2c610cc880ab6970d395467544cdd64fc6c85fd0f7b6ab28b65aa9412c01a7f23a4194ef8cea2952bc2235ad68f43b2fbaeaf31638e8b774da42ba16fe02d4a3337c9c4fdf4e98676cffcc963d092ebe8792469040f1df5904ea51e76e5d1a12dd0dbe0616414aa7c16d1e35e390c4c28100d1f24fb927cc6a627c157f2d1ac2a257afaea7fb8c3c55527348850ca631ad47d3a3fcf70a1412902add107e57b5f961cf871ed89206ec6843b3eedafbf1e50226077c8fe468f991ed6f23a03311cb52b54cd03888289f48746375671d5a649e12940bbced132ae744f858e1527b7b6356a4714f3a298e642891c2cdbee87ad13c2d46d1df5ff4943fce65fe08cc8a75bbbe5df2fd2970cdf80309a97024d04581f2622dd60310966ee31ccf59f37c8cc31ae40ce0e19869c77a3b58226c876332c0fe2109d4ee47308eeb6e36bc37493a4bf5e46144d6457b1285037c3bd1c02f944820bffa364fc6c1a03e86002a7c1ea7abcc7dc0de9003927fa629984705d609079150aefc7e5fd6ed3699f387f75a80411825a6a89c449d73292eb5de215bc21e3178d624db699c9223bb085831ccaac639401c19dfbe114d720fe2126eec7c990a113ade4c5523eb7f21e55cc8943a7716447e39449e395bb101effe5a2db3e47797f59f943d91a0634d20b4b6f1148a5a2409252113113c51021007c8e2c1bae3a8623681a6f964a5e6b8ee5d875dcbf6f5444ed0cc635eacd2a04aebcd369aa06a8fca37e1ca3ac36c220964139002c952d3e53130510d07bbdcaa5287d630340f5086d5c3c6dd876a5013a6b65f2583a076937514067004c055dcc86e2b98021d79efeb0ddcf2a0d1c6c28469c3d5fdb12a86ce5de09c8d6b279c8478c1612762258cac15eb7b13530d83f8cb21f09fd461335cead4eb477ccdd3162389b1181c91cf343df8f1f6c6274c1004ef8317407bfe56fd2958e62b332b1402391a6656cf35b8a62238e864c065f25a8ba55a985ad300def54c6a7205ac627aba697d1ba059048aef38865a6de006aee759aee1ee97afd3ad3fe855a8da4a2341339920e8cdc3568b3d07d88124fced21881b98deeeb0503f38fb87c7dc7613614b60a14641571c798d4b2cee3eac260d0e8848c7999b56679e53a1f32df7fcc814448979ca4da5235f65ab4387cbeeac0ff6e42d2621fe1a3618b418d54da9ee4470bdcbc7f50cf63aaf431430c125d1da0eec25c4a1b341a10054c09f6b4414984b499a5a3032818eddc83a4938e245a86b9f6319c9dccdad22f55a047fb066cdf9d330b71e88995cd94970705208ebf7f02584c818a9e3ab66e5fa61ea07a087b0561a40511598273f8db6a9ea3249ff26972b8c339d511b239ddda549f69ffe6b6405d737ba7e49f95f7c817c235ff1ebcd871b5ef84d602eac2ad652d9053c8bcae4efe046c52d1c9e13de1c68454d8d4f7d2b6bfe5972f56fe4d6cb65eae2212c6d99886071091e42944bff35c10b291ed47bf3799edca33a2ab90268550d078836364f8b80c003e177479644aed61e5d674355f40faa8fea05dd8185a67523676e53eeb9eee27b7f4c32df466db25bea3ef051b7de22215cce1d50bfec28a97c8b8a96dc44f8ebf1f3e01ae09a9f084ad489f9ad8c0d8d3ca364a08ff38141f444f65b6f42890086a49e154381895dc38a2f19ccae944e47dd85dc1cf3befd10eb86569c3e189c88af4935052323dc36b3f1c7f08edcc6e723adbf5bc74d33c612ab747fff81456498d4e817c17b384bbb811326c4d615bfac949f693e341afd87c95db6d4dc65081b35930ae1d7e88060233e547a99735a639b4d13ddd50d3a42b1cb3e723e3c0ca2caec8eeeceecf648b008e721cc72011dd6e312a708efd891e87dec71e4540db24ce5cc8d7815a749d3b15e37f7b43fa7968544b4202c81044009b13213452165f2cd83104d5bffab11a3d58ef1b7853c142a0b793ee7cb788c5a1458256e20372ea497488f56d68391bbb6ac70cb42ce2517b3f32d52027d49a28f09056fec6fa6659d342f1181b3bd94c036ad8af9c046b0fec41511dcd5f4287fc7b863688272596cd47d3524e1ce49353296ce6b4544ddc5b25391d28aca6f1d3f566f71fd226acfbe3990544df1be6ab500028f301843899dfef38d658746eb8006d895a487e4b65f969fcaf4987b3b747740b3487692d53243ecc401b94ef8b060e707cc9b15da17b3a42c2e471f4585a6e605c913e2abedffa1cc3639de0137284e6ebabc9764a1a7bbd8c2e48e9abb71877f195584fbc04d00c3d6de691e5e02262de61290eaee5a290a8ea3c00cd9ebeab478e5da5d82c4861ce1e144e069c055f961088c9a10a31ad775de30f6ef57ff8db6fb011d97faf16593ac42bfec6d67ef03b32c69a2156266a1e20da19fc9d1418797db7b39a509cf04e7d8c56686713aa5057343cb4dfeb32acd688a768433dfe00a8b9e3897cd686ba49dfddb862ca84b73fd6c26eee23e430c73694dda8308912594809560af3a082ffcbaf6b52824f4c595a95cf87d12b3d9a3614fb6071c884e196262cba657bad9eaec0962126cdb43bf277a590d2e2489900b63cf3974edfdbdc1cdb9635897b36228dabd495d27b93e2f9dac3d34d3e10b3ef0f80d305010402da2ceca8ecfd8117f6cd94dcc4756d5246895822c12c4b04e51b3c6762751288d663ccf31e842955e1e05f0da7213d6f308ae029e286412143d309100a5e06a2ea083b0384cc835ac509b04be5b1aa8f7836df236a7814b3944763d27c6a251049c82e5ffd5c93d30576fa9003e141187fb8a352ac8fb69d000f66762faad0bc2dc6db16805b9d359166b40a4a4f4baa4593165806edfe96f3aba7e0e20043e000349d6961f01499dfe6e39d0c06857d82e2e9609c6ed9a407a82a1d1c27c63edb32f78ddf9c4d4cf2c6e809afee12ca30bc3745876220077e4269e59f34a9cca72a13384ad5d08ff90a04743ead75e1d061d16ef1dd824d3f8f7edebeae3c251b2ca39ca03573ca710b2a63528ed40415dda98f5cdfb0af292e177c3ef99534958f0f777f6da2173a8572cdefd6e03340c5c8e4900f64d401ecbd0c01d010753b6c6dd02184a235bb0ba21fffc63537912ceaae5f3c047474132f20bcc8fc3d9c2f19e232ae54bc5f21928408272671b624395fc57456b2b93e47b724f2af24797819272c984e0274d06596221d6acd53d5e9bfd5c4a05b40dda2a5de6fe33b018dcc9e0aad7881aae5c494f524cdaa6d68e4512d628d4960222c0fdd487837a15936266fd679650358330dffe9b7b55cd0c5465a3f13983909d4a578ced5f34f8b90fd6703665c29b7517ee590c2c24f5a05b9447ec6f836100b3f67ea78bcf07336f35430042dbb6c7223997ab9860389e040700c35687af662b0f09373ede7537c26e89a072c967914ed859f7021993987c7aaa52de792a18e2812d75c40943b7a7a6ccad5f8948b465350020c3fec9ce5049fd560200aa500580f0c0e0c2f84d95ad3239a745009751fc7ec9c0cc8f0026c438d058e40ee2c933849289e1f3663d4ea930fb17d7e056ae02315f729bf4de855eb63dc79c84e37c6dd94764456141149c44cb3547c51c960487746a6f30c41b5b31200ef631915bbb68e8b0648dfb9eb0336db419e038fdc6bc25b805dee26f30bff1fa21f726950995742ab50e478a0aaa1ef7e76da3d1cff5be8c8038437221a32d4b587a858d48833a9b40a366083ea43370916f8cffa6247c1cd4115a952942487a2245b7e4c45a05f2cd07f3e9a027c5b00a6b1baf2dc223d139b877f997c016ccf014a21b5385a4018daa40375a44dd18862cada6c5d8d12c5adde8e64ae353f3184da8fdee79455b008ebbf8951aa046cff2efbc4f5669d2873405d83aafa3f432d90f1a76759dadb03775d8116f671351ecc945842e4de644bb2a59429a52465610374036c03586a94708e0738f519515d8e153c754e593d50c5cc1757d765f57bef59d18a6f4610b3207961aa2b94df6565592f5706c4c3821056cc7c71755d9feafa51b7203195dfe2cf6aff79cee42fb899be71c1bdd4e89ccd0dcf7893ae6c2351ef1b494956b67d9f3e39567b25cbf292e52577c3ea13cfac8da6fd934894fab55919e7709030978c82e6c4b65ad8f67c58b5afdad6dbba71606b8d1e5cb71feaa8be3ab957638c2bc4aa2cd6e8c1959f2b67db0fd5faf96c3d4ffa96186254eb2f9d16d4f91c46f556956afd14c3fa29a54aa5f5fa19aa2caceb0a5d807e7f8fb86af593826ab09ead677eebe7ccdec22c10a8c76cb14055f5a2ad662309745b9b6d12fa05723d7d110eebf7a78509b9ac0ffd856daf5a2fa26fd1b77e6e65594f5fc78aaeefe1d52bfbed0272bdf512e4a37aeb23a8c79591b220aafc8db44d2c6ca924e8ab9b97aeb77e93381cf35d090dfcf3e7e82d8c7a520ffe99b9acd6fc9585915c567b4de57802f4fb8db33240e65bbfdf372b13413edee98b5abdf50f4443f5568ff9d6759a2fa3ce9fcfc2e9d495bb31bf0b7a7dbf0c5bf92dac2b837c5cf5fa49b1ca8a29d579515d8e942fea9c51adf005dd5e25552b7841fb374ae45520bd825ba3e5b5360ed41146d5b9303a5bdb0f75b4cfadd01608ab303a1d00eab63632a4956d6db6769b8f81921bac8b1054a67f0b52b96c0f4159876eff3b823943595ab604ad91a7ef7aef32a3086018d9699d66f939bdb02f6ccf8953b7a8449cdd8f01f3f38e4118a3fb3c82cd24fbc2fe94f2cd59720fd235ec6abcdd27f3d449513ba78378f43bcb098ad92c852c506ca95a403cf843a027837aee09a326d6ac26e2a246c405a420170e878b35b186611c7361826e16cf2c59582c62614259e874ee8162166b569398dbf130581b7beec6fb0fa642255a01ed7fcd338561f63f18634ee45f201e91a7fa11ea9057b7592255a225b4be6c96422fd82c9e2a9fccd22cb93021ba71389cd50fa348d5c3648d34aa87c51a3d4608a9267d2c22dac49ad5f6146b9c4fa792e50ef2d7a1101d8d5a66cc2331c624abed2cad166bdc8d7d1727d0cde229d57dab6765b6585397e70b0b8be58495a979b1a76807f63fd191220823d35da12c6b85ad7cf17a6557fc5cfe4923d2487625bbf4a269eff22e2fa45016ea5cf5a873bbbb6e9d732e94856ea49615cc79cd1013cf091d010e218c112e6cb2557a7cf7a4d2b0a424e59474f9f948ca69f01863c718b321314629e376bcf276df7bf145814659e5bf9763615807ac877df0b537e441e80f427fefed2f840cdd4127af766cac3ee85eb10b2050b9918359976f07b31a91fafca1d0d16394517a8e85e177fedcb520fd77883f1159dddd801aa8ef3973a7ed530caaa1abf7b0d51d7bd6eec67accb47edd7e6562ceb5f02ed68811bef7de7befbdf7203fcf5eb84712295ef2119004747f1e79bf5f3de7dcabee76381295cebd75a2de0137231d4ccfca5044d0115477aea4bae3dc549f1f8cfae99e736c39798d83b91d336ae3ace62feb1b86a14850b7e3fdd63c7d6a9ed34e4f8f18aec4137ee4a6c76bb034f1599241ede11b9c272bb3f5ce133df02ed170eff0cce9f9eb01e56c48d74deba1f19775a3e1ae6e786514a67f0e163ba89f7f3f173443ff8ec915c718419f18c3924803fafd1cfbf049508c918a9410f7fc10a30cb3528b5fe3061779cc8c48d71af1bbc6186ac427d004e8904fbc86ceaa084150f277fb3b249432ca08dd31e76064dd57f1123656eb8f1e238cd0dd8e1d9267a49022f5bd101f5eb69893fea7f45d64c5379837ce39aa85a23a24d27c59e71ca45e4aa88366b57521a0af94150901e5a7d917ea1d4639e71cf5123a6ca355c26ce3a15212888c3fe58bb01913d32d44ba8e9efa39c262306df49b5667183910d53ebc1da1506f101e501e3210d0d0fbf04a27bab91e19bf2afc7e915722919cb3aeb75e5b19d20c8dc68f9ec2462312455134b08d48571a3ffae94675f434fe57c084381a3123124565201a44ff791d4bc2bacec06af8f83cf5b901f42a38e683bf0e86c9a1a3e7df9791c978191b4d5d6dc402bab99e222bd3f2fbcec11f25414719bbd54814ad14c5b657c490beb08daac1cf82cd0b744a32c487fff9fd5d6d65dcafb63d74a5322032abba3a16325186317253b79784677450d2f6c89b0582970a6569f9621cccfe6e31fcde7b06e4fd5797d5e8f1957f5f34194804255734a1f2ff4b075a5abe8508222425d111a51aa95b70e291e828c7ca14566eea46df89705c6c1066d4fd5f2eeaae115b448144931985912af281208713135270454e890b19ec602dea468bc4d030b608c20554d484cf1468cb8e0eaa545137fa39556c306a62225141cf082a27558ee4505942dde80f818a954a1b7abf683672a62c9143658bcad5e550d1024a81c07c3b335a987d2a23e0490256b2f0000a9e580245158a26298242a1aeb15002ad9b89923084128851e3c5079c500131b3919bd11574abb0a852574ad340497777c78005168afa7477ffa83f36949445cf88e4e2c4cba2e44180c2031d19a6f4e45c6145ce94253428a8441b16eabed4f981a9ee8f807044dd20d405c218350733f1cc61bdeca2306207b500d5e5a0c0c6c3a0ef9fb5cd684c256de826eb7bc18443d04dd601c4f774ac8381b09f83810e62a0f6bf08fd04ef70f8777fa8a8a385a164ec7ee89937dc9dc1837c30c807915749ab6dcf20ab733776b11a1ea02f0b651dd6f981fbb7fb1c40a594324a29a38c92a2627bcf7c10420879a18c104287d06770f5dd8d35022451ba1a7fbf7b0833e95ce688a0a47f61d8d1c5bd8ee5215d21bbd8a80cb1de205575f7c23cbdccd17d70f5773266cd33f237dbe037bd6218665feaaeac266c8e9b3b3f10ef7e66eee72548b8d9cec82825f77b7763e98211792610bbea8a81c0e80ebd63101428c928a54b8f2ebc189f9d1633509fe4da831b6aa0dbd9dd5877f77537f69903f53dfb5acfddd8ead3f739d856377cc2443a1d2913a0001b68ac9c78b088213d077cd54a826e3475c642826e4ee707cf2860c6e170fb9824714c798b79ee765039edbddf341d0ee6b5db78a8ebeeafea266cd5a4f4f292999999999999a5a49444fad7b4181a1aae017d921b67fdc5dd07c46bc7965bd8b56a864b6c76188293d4b9ad480f59f11536304ce261527ec484bc1542dfc7dde585d11d7ac72168980bd8798043e8c2a323e734af9c745a105ad59709f161bd620288582346876ddddddddddddd08e2d1efdcaef57a39a3eb5c1e0692728a8214f48aaa8848ead383a440179094a46c60a03e1b9a746802e835284a32333333335332b67330b462201ef314327a8c3042a7a1d1018a824a1ee3bd689a0d1c7470e15111a373aaa2c93cdf1e9377d934e320c20eb80ddac65fc64819e3420e4172740dcd698a9598ea621c09ba359366c255db34e7e0407a71d46544f331201e4e9cf433a8065a33ad025f0469c0fa7bfbd885e0524affe1fde046ee10e4d5bc2644de112c2fc963f28a80bee5a89b0bd586454724979db99eaf189eb1b21d18869f6370f087c1690740c0670d50f761702de4886119061c9b0c1f774903c30cf53defc009a8ef4924f736ece0192d6243d7fd9171932a594503a043f7e811ba07f2715548c357f886a0f0bddd7d0e775fa2266ead98e2caa95ed39d7ab0507fd42d883bc18771b66da054d77db7df4f7165a70aa0ba29b6c0a9cfbd6d82be8c3a51f71c83392fd112d112d112271203487f37a9afbe1c233c51e17b676b0413ccb76e2d977d5278cc3c78df63ee292559265b63c3a33d894a49a24fd23e46a369826b767667955825b060c1c179a557723aa226e846e3654476a9a77a7ff8f98d79aa33c0fc8d85501d11aa7b9111741ff4c12400b250f9fe55853df7aa0a65026ccc03b9ca9dfa43a90a958db3780a13f243a9cacc49cc76a2e5dfee39d82a9c6832b33b5c488eb7a8fbce0293bba090a0e305142a0956a7f305924a729ca48a1e1ce176dd8e1d6ce6f66ed7ede4eb6e1e85e8a885db753b275d39a0ef9db999fbc551476877ced1d83e627e6176ce5176ed64841445511425638c31c628a3845142caa9a65846296594d4524f822ce62896138aa264570129a79aa298a296a21e45554f4a45514ae8a28b2e409510dd2daf5cb932850fa45cba6e574de976dd0e56eedabddbbbdddfb5bbbbbb7f77bb77741516eeedde3c655c4abafba73ff250ee036ff7fe34533026fb8c47102999953f3bf7ccbe0f64c9484177772573865cc82b2050506555227a8544554b8b68e4dcf3e1101226a51f12c021871891a8655ffe6d685a4bcbe891a49046ee8edb7d8082082e7ac30d3788c670ccb362ee930cb3762671dc8d7d51084442ccaa79682a0a15056445b1fa87047098a24305ca61e79a144a1d8923a378337d3a499cae02fd43817c70edeca2a29676c611c2b94f51422166513b0be11c45d44283534c4bcb686d68da6824e34591e1ccccac423b67208a73671207491415b6858ae6b7dc5535e79cfd404f8659399338a22188b8eb39522acd203bf0d8f0e324011ca6e890c3ce943812e74351d64b32af199a229c3ed5a04fed83ee9302280db5c4f9c4a0e3093b2916664a9c18501a86592731312251cbbefcdbd0b49696d11bb990fad9b9c491124708da4e8ad5e4902945c6b4113d618059a3477ddd97cea57341b9a05c502e2817940bca05e5826232994c2693c96432994c2693c96432994c2693c96432994c2693c96432994c5040ea8848596f87a2282583b29c0809dd6844482811928f08c94784e42342f21121f988907c2e2a44483e17159f8b0a4c52371f2974aa256620032a4eb0a0b4ba1c2a2830019520aa1468d1a305162d4a4dd0ee6e6f8e81ad3d83f10178dd59ef5cc27432cad7dccdbb458ca4c11426950614f4fdbf8c511988266c029268a814ee598412b2190100002316000018100886c30171402c0a1461973e14800e65863872523695c8237114865118844108c2000cc3308831c6188090428a30ce06000b1e6ad3c152c456cbfb06f53a0f340760027c6795e9f1b79008d4d2a33f86830072a59292ddfb176bb028874a7c0fbf78a44d2a882f1488f356fdd68b06c38ad8dc336aa30b8939218825b27bc4176d91e7e3723826574741b76bed27485dd349cff550fba504b8cd6daa27600bdf6663e892c0cc5dfc5262ca5674d88371bd2ab9d017f2bd28de5bf73f3ac5bd58eee2d0f5c4db718a2b7c06a3d673e64b7d738fa3b1601e85760918cf6815709d1f508b8dec2947ee5b8d3a6897b2d91ebec6d1f0802a093059011b35814aba52465a090c72dc6bb122c544353f5ac056e7115ca2ba142bf727deb807d89202b4d232c75241f32173f52a3710a6782f656661a79458164600a6bd11d4f71910a3ef950956b6f904d888c3480adcc9a6d2b79d368b7c75c5a7614747f08a06dc1fc01276c5235f60ea44d0cae1bb41351839ce5b82d854ea8047f1c4260275e6e61df1653c4dfc4cbd9bed34b47c1612b6a5a7526547ec25531522a4de00cc4fcde5de2132b926e9b41fc7659cc9042e689418ae32ac8323625846a4170e63b18d5baf1845d967c78eb84ddffb993f3e610dd1916c82e35abdf781815efcfe0cf5391fa21d5defa0bd97e09c461d7fd78ca3c748e0df267966486ffa22056d9d135cdc21fdc3e4837e06fce52f8bf2b5d80e168b91a989002838306b58f8c3e156fa10e0784eed31a348dd1d11b251646412805e6a81a52770edd78e20f76ebc7372f0c2ac69c5c39d6053cdb1531ff70481312bc8e68b863c492cc7b7a2c03b26c43a07c9197f63b48db33937335d6c93df8d7d3e4ed5d8ddb486bb5aa34563c2f6205d4398771a79f6a997abca081844b4a307e43c62e8579d0d69e3518a8560e79aba6d83e787690ef012275cfb49ba5e38ec833d91be282d177cbaf872467f643ef223bca4a54f6723a31b2125d4809c79377e4483c7803a77e597b487146bd4b952ba81d92699dad499bade164151ff9a934d9d2d6bff819122233ce6be135679972c843bf8bb5b2acc938b958dc217a30b1449f6f9faa7c870fcc00431eaf301197d74d24dcac8347cbcee24e8d907a85b255a07d5d181779cfed6db59959653005b0beae5edd5aed9d92762865a5cdc992182ab020e5c05048030b1ed2dd4f8a02ad0714506cdbdca8a690fdbe60c851e2b3f8714c9238645cf92317506dabe543cb799edba22795c8fc10202d5a66aab097582ad01e9a3b4c07eaa997d8d2b0672a9f07d7c1ea1af93fc11845354ffa7a031af121407d281745065b9a634729b3d02134b95cf21c1ce91d0e0409d26a273e27e9fd88794fb39adda4c0885c68118c7f6149ab2e577465f93e9b2e23f362ee626d4c581803c53dce55365bbb6a815f9721d4d025282b279793d44f708de9624c4d22000260e54266130f4aac81755e9491ca8dd9ae185b32f256eaaba91a860172b26b579ca8553e6385724640dd057314c6b83e5855a6b32a8a9d983a0079558a26c9c438fc7a4ed26e733533e0c875de9f1505a5600da7d0e76607b50dfc9b7ff42c5251d1d22f78cc40e5a36484ce52bbf41561b85c168cfe85542f8a02d3983587b96602aa69a78285616ae2424639974c1ecab661ed44e9a960717765211fd05491f5cf141258af0af8f8930c050fbf309a8e991e0a34507d611df6ec857f477a20fa228662d19113b72986aa34335baf2b3d53050ee5d6f721926e9d31f44ca480e077b18798fb3dcc5b717d099b2cf5784072684bcc352609da3063f70d96f3dbd01b56767ff05c94ef3fa7c6246b03864d310273b8471e619ad04b4880f8d192cc7dfa21cd9eeb217297207350965bf1cf2408d04f3f7e4635d2fce580356d7dcb00cb8f50f8754ee9fa03b1259af567d84d4e6e2a9617d5181de2d11419412383d692d51636a514fcbddbea4d4e9e9b93012300e1e340d7e7bce0f24777d3c6614c4b62c64c6484bea7093441f955ed171292b37274479757b7b9437ef2467bbc68c8d6151c6af3fc09e8764248ca434a7409e956d76e443a33c57a94c4383dade8e4d33235363a01cc44283275d49bcdd07966b57f8f3f5c6ca6110e73cc3abec14d4332a52a2ec709a29e32ae64173960eb5e31027646eb2f3f082ebc13e79deb222adfae116cf364bf34a57e2ab384d53c3470876b633023c578290d9673b91755e8bb872a4b9cba210d784d218f616c2697b31e7fc5f0783724dcc1f51342e0629f3050a6c1d7d64da4eb5cfb60dc053060e0c3b0a4774018b30e807e95b66bb6d0f1666308fd325eac5cbb4189373fde4a8651a3af1a058897d31da930456d593fc88b5b30e4aa3126de2aefb27d727f6cd22a38cba469c617267cec363319a808d8a7da58abde289e89d6b797b4b89d9b0d88b2e5aed849b00ec5b6470552352f43f781c24bd901d0498223b0bc237e4c8ee589f9d055ea6217776601ec2a6b6d8a93fa762a2e2ab8a9c9d98d64f650e17fb2adb592de646b35668fe6ab09e11a4d9cfd6bd930b753a8aafa562c6ba9c6de9d425a806a578c8f03dc57ec9219d10a045ce2d776efbaf312f73ea18b6a5942daa3e3a49fa3fef7c72ee487e4d1e3ac557b8f2af7811256f9210329772fef1992b6884e916610d5c19ce515d5dd913125fbfcbfbfc0a7971e69b1c9db137dc4cb8e2bf6e00b5ebc2d4366fd0536d24b6903209068b7766ce43f90cc89d1648b0e13a73b58add9f011f95789903866930794d8066ffe9826f334411f9e2b46e90e7b2754c24d4e0375101fd4c2a71c1a1b5cc023b289faa458f8c42e19713fdc5444cf9de4ce1b6ecf821d1219742fb26c9d0f022be16844428460edf9db2d6f818715f3a3e6530dcaba848f909614af1a7a62a4c4cbd255c815414389370cc1fedb077a3f55722bbb2a0b1d287155090ce6facc981d0c155a04d2b3a569dc4ef2a2008a76e060a640741029e7651790b1e116fa5952daa3f38491540df4581a4fd9229707f35eb27725a016df4eed95fff89b963f49dca840297c5d5f6bd51a058fad606990528d015010956259b487684af5597c0304f3ee2ec3f91addb7e70c8ab53a7974b2ae25b350f0c0863756e92a5879e608e8e2425eb413934b049a2f6895badcc12bac39547424dcbacee13121d0794bdcf7f05f912ae90295cd128af0d211e6b14751b726ff62d524f82cff72fb6ba76338b3972ea395becff6bd2aac5e7078e9ebfe90187d29425c81e4b7d0e1db575cc3a5d9dcf5f9011ce725caae7b5fd96d9e2554e07459b0fad7a939608e1868eceef256ac825a7082d382a5125f9ca00b321612698fb088d1485b37a2ac00e2540b5cc9789286948c86f1820e021fc99cb11090e39c7f7e693161cfb6e8622e5c398087ae43c494fae76e296937c5a1a64575a784c45826a6326968c04eb106580a21fe6fca54a985f20dd6c8e719831e59c4dcdcdd40e0b210409ce1aa88bb24190dd75761790b3a288f6cfac3db21cdd48c92e572fc6ae17bf74518984cfbc6dafe8bd4152fe6ea6bf709abf28cc572d62fc02402ee51b5319fad635b5ef7d750f2118ebaa5c36c38498d232827c4041be2b563e42019d22edc7c0da849b88985a5e408934f727c408e13f5c0ac05747bbe0e120c9faec524c38e5cfc1ea6858c18718922c2b1327964227e898231f017bfb9047d87b9c958b1beb1f89e9ffc192100f6222e3bd929484def8b476779955c876bc2b0d2f81613e496bea2ae7c26caa9720387e8a112e09c989b8e96b755cd91da41f2c2f2790c41df12955a1660df8d62088dc1edb08523f3e88e629cbe87372a64b3dfb098d2d458caba31b5319693a1307ef649e5429e82d429e518b90a04b4478e636e8f931a5fab047c0a64b1014e99c069b6013a1d2353e0934ba5382d0222b0e778414740ec296c80423ea8c1e040de109eb5c044e57accd69dca0dc84ba184305de6f31d8fcc31e31fb3cfe8ac0626cf66021fea515e277ac3601bb9207011259c79b2b781094961bf100e20ec29eca451ac6f665736949ec202829e5364fee441d849d60324e8ed8b1ebce54b9b25a418a6045947db36e875b8b908ce383572ffc5bcc663c009e70e11f6146e2501f2798b78075c04b166583bb5fd4cff81eec78e1f9e244c6b760e785e7142730de38d0554d650d570f767fb3ec9bef1dae2c7267bc1e8cbe706ed12a63cf3b71d8fadcd58a3046bda75fbc992b3f287abde5c26d7efdf244b1957542a8f56705a3dfe4de7d7501d7fdb551f231f90869223fde7b97264b6f35d22bd5da977ef05320ca3bee59b31a430721267d595c8c19f9f4f2a4eb718fab9e50ae4f93704a3df9271558b572ff0b885c7f4896f508c8b8096af6f3f3463374d52fe857be6ba09ae32b33db6fd30c03368f2cdf05320d96c00b397c3c9676e98a0afbf40c6ba00a9b60aa2012b1ba5d9b8707322812c32b7879d740cbdba583078d25658e3fb72136649111bf9a8068dc8cc0bafddd6540d58897e1bb904d586de17e32b567411faf050fd201c7fc52462081e0ff8883f8bdcd0d1c7441d230a9bd8f892bccf3e873de10e4d300d456ee9a67878e80d55cc0013b09dc27f0986ca5fe81b4ce323681bb86ac06981431bd4b5138226e90be4e720716bd9cf0bc07c72d12020d7642b4571fedd7cb8d13de65744dcb31291c92e0b53c9a4e31eb7aa70afa61d3770645050fe45f074205346a95c416954753e7781ebd063feffbdbe8d813cfeb13c097763850c6abe634d6e71e6a342cb50e77dc54613c376402608cf036d26bc4e8dea2b0aeca06ede17fe8ac02611af3a09b694d58803228b83ea15b3e328aa5f9e779408555a4f890f0ea17487e069a26f31b55051e3750d869dfd70691005663d189c8053ef63a9e6a2d3d5e88873ab1c18bdb45afa142a9ee2e961752207dba9ab591024c36191f446ae3e61dc31a0e3274a76c71354b9c107a55a7e4836b5ca767d3a87ce69c3e33406f5c0d01cf239621dd668a359957c2636bb9b1238405699b3e759d2cf558e083eb7b1ec3d221f9ab7deee958c66f2693f211e2d58eb3d2c7ea5d5c93cc0fe2d5e3a4038c8507aa5c2a402e4cd6d2640ee200c1f58f1439e88784fd1b54120c974e3f250fe3d90996373afdbce406d79040afa82caf936d8bdecb44ff44bead8e5402c2013675bf2c412284ad2e79d7ee26d268a1727039aca16916a18a1d15a9593009e9aed14141b648a596286c46b7d71eb3979d2b00c99c2ddd0efeb434296b1d13c2bfb33c2763a5e0f266e73a61c2da4139cc2683534c1021642b45e448f1c7ca0d9c1f475102a640d7d447d0145e174c2928d678e9a1d9c0fb7d136b018ed12c4229c2176e3abd795b37c735fcd52324e80249da0c0cf04e21803babdc0aa7856c35c07b477f63de7376a004eac7bd7e6de4897bbcd0af46c7a031dffe3e1ad02b3a13b174bd600b576f91f3b7433dd865f6914364858e8f64a60fe45c81ca5720a4d6da5f5f866be280b17ced5fb2a08805785668b33beffafa3a4db2d0940f4ec69c44707e8bf76648e88857fcdd0893682b311ef0a36fa329138dff017a8cb4c5503eb835088aa653f030f51f9deb5388f0c1ddb3f46ade36c80afaa25dc301282ee37ea2f2633be0dcd38a53828570366ea37a17a3ad93e16e6fc9407f07a40cce7438bb1247fcab158b2347e291070d6f497f0b6dc6fcc4558165a7d01774a6f04e8badaf8397da5a8ec4bcd2ad3edb02d0dda08c4bf2608c5a92383afc58515b69503ba0f8d2e7e8f04cfdf2ea6eccced1855bda71b51117c711e7565dc4bfc024043e21fe9381c26513a66f12b51de281767941b856a4a59eb1c23a01a5b2da21180aee64615ed8562a9190b8e96d4cc2745284c4f446eafbe40e401cda55fb26997bb912ff528c4ff3c363e62c35bcb3a5f718ae6e27f211dd9c7188422470097073294b4c918f8fda5330ff8c5b132576dc11480c5cf818fa06a326a539ea632baa03ffe7f7cd88c8b165bd9e15830785fffbd349fc4eeeaf906ea4c7d8397e577d8c96f5d67524101fe724b419ece99b742ed4e7b07eb777dc55e4472101881f636d67c266229fddabd50c5e60da04eddd7446a7580fe411cb1979e2165efd0ab144c276b2e7492e8c12e9b75e5d2a1d0c6eb015146534a54af00e47eabb56a97e41555b65ba987bb812838bcef2a8e52d9facb5eeaeaf48e05ad333f80f19ed15392e2e03962281bf20f20d00d144873a663d4d14a6b675fa6ec7c3ed16a26d8664111f44c4477db245197748182f6c7b340399eb27f34034e67fff6db5aa1c7d1e2f3895d32d2fdcec58e9d02faa787f4a377ded1c893747478a7fa44425e59102b8cfaeb2eac306edb2d67409f35f07a3ff620e1192d66fabd80a688ea72d4ad8f5f4558667f28cb0551a66203d0ce731991b07466e0e06e346c15c10ca6336cf88ca2c36d27ac24abb7e7f84cde80728f0f3e645619cff635ea3ded2e1466a3a69e809748db27deb87fb180a5c51d4577e61b21715603d6f7fa85f8d73bbd58dafe7b27395c5ab26a8d700ccb707249664fee7d084612262b9d4e29f301096585247539d8d7860eb59fe9df2197d294c8501ad5419b6433610100a891511e73578b7252097998fe08c14f010c34f68c01115a0fd6bc7826fb9ae33b3f440bc09c43dca12f7f7c91c0b5850bba11b78c8408f2b92b928c7bea86171c56e5a6d2b4ef2bb30a07c94da98892a3ca5c86547d973236039711bc279d4a604ef41fec19c3e83ab905e27958e1445ded925b519b96ec42974bcda62414a9db9922b08114ed11039ce370269e6c75b6923a087e9fd8f37e51cc249dbbeb88c49b88541e739dc1b8ee93446a51a51e890f179eef3c06169e6452733e28f4b2724f4dc133f86d498fb3891be566e0016abe8e2530d2bf5e6a7d318ef5277a687895c6ce6890027cc9679ed7830cf02b4699d36cac1ff1f61dfe5b2a4f2618f36424d51d6956cfd350c89800bd2476cb16c4062ecc66c007882c90e90040ba201e99782c78438bae24813bd72b3e4e0440e49c29ba4ad01cd0112507236ab926a48102d05b4d1a4cead505dc84d7c4b01047b7c2dc305ec9db54fbce96da3c3820ec168d9cf65771460ccbf79943640e0bd9133dffedf575bda81a827b0ff3bc0bd4b28534b1e59762952537bedb891ebc7d85c5432ed385b3e6da970e71488d83cd899037c7209efd13da0bcc26d7a5718bbca341cb46628bc71d5e978667687c0fa59fa86d9040810ac7eb8755547dada3399aecce9462b1d73886f19cfb0cc0d23295ad22aba5a89f5d7f362051efc8e3f2b69eb3a595ac765c378e636ef0e8f4a004da1341400fbfc63b893c5d541e35fb287280d8722f46edb0a2912545709713f5b4ac270058ccac71232e127bc76595b09dbeee3bf764602034a8d3cebbf1dd3500116186417cbf2298b1b87b876712d782a076770fc2e7fd936360ef2830ccc25e385d36843349cff0cd73f97871486d8d72cba082d4c77890bb9535e9c60f9e5574f524336bfa51bf1ebd59321914d9750ac33949c4bf44eceb48ea52d215c4c69023ad090e29d532859afb176efbe8d8924d51be65fb9395e0dfe89ac8de5a8d31125906e3312e6ae3ac60feb58bd4e32dbb617c7398d47fceeaa7355b1ce87235597e49bcdce6daf906d777c3648ae357030da96f43fae3eeaa3004633115bb14d61754e213c78f200763c5129563731905be9dd2473df5be1f4907d5b50f3022e938b118f2e734b108f5310b2c8f253216ba9515eb47f5cf7dcc0eddd513897435429c013b9f01f996176b6368022db0e4de38548e77b89ff4bc5ad162cd2cac16c8cf42aa147b91b258d2a5d77e564bf4c95abd0b3f26409b1818974c87b86c444b68e49f1c0aed97cfbbcdd16903d38608072008c5e55f65066bfd6168b37802c086a711a62c4a1c3153b689bbcdaf07e5ba5bceabe41188333d7353fcba4132221eb8fff7ce41aa4b88056bb7dde5db10d26b222b06ba64c2ee1097373af5de8c7720f1af1418c6ca82fb8621beeb8f6f4e2251810850431670d12f62cf1a7dffbefd82db908d9e4d5c0bf59b1f429ad79811d20857b90a1047ad14d979c0407fe94ecfc469b14585b607b4dc1b469ac82ded0af100bb5670da6816f65d0f9f084ab8d717ea678b6e96ddaca608b9b44644e66eb771e0fb0268b31dc23ce9f146a605fc637f94befec9a14e0dfcd153db84d60e75c268b47017a9ecef45a16ccccd0b7c2381db27d08926f11cbf9c4140494c262db3a3627c17800537a21550136214af7ae987a3b9248dc8d45ac161a1bc109b73dcbb662a4333972159b549bbdcd54273e6f7e2717740be78d7cbb91c9487fcf8d654194c4b1358ed57a7373cccb1beaa035169f64a09ce6371c94f2be79ecd8ae1d07f9e6cd8d4ff81c3e3cc3872d06b532b3d648bb1970ec95c18f9236c5fffcfd85106f856d56d4e9d3906ce5d341cfbfcdcb2dd2cd8ee2c51d0af69a68c1058e3b03b2c35499a941994bbebb1110cfb07a4ad499b1f2ba63ff8b9173dbc71373b886430f1ac8a4f330726dc8defbc53c6c5e00d011ee1d8c763debf6e3b8a6b46f994cea1e03686543e4a61665dc17b2a3815cf993041bdd7e83d84502c7981998ee157ae3fe20bf344ae65821382ac1641b3b9004434874817b11f9057b327bad99a04bbaabd3b650b13fbdce48489e9bd9a98cf3ff9bfd32891200037a52ace7e8fcf22dd38a5a2f9557b928958cf04db50e03c0d6d440885235c7452946c6977f40d951501a6a32113521ec3114bcd462f787f082df05eb43ca812db34b76fb83989f164fa3212364b23e7a62ef36356df682d40a11ec2b22e75d1e3d0b4499d0d8c890142ebafc0005459d5940ff4290de4e126a873941d24544c849f47b98bfbde1719b6461bef4126f76d225d6f54fd8d26dd0e84c8fbf58a540d33b7cf5c912d74a7a711f6466b7fd17623b59bd0025ccf927cd48ec263ffe092ea5f0090429d98e3b07f4a9a003dd31180cf38429e268eb26e72808c73ec8883b07dc198738efff35e22083cf47d78be4a8a02c4083d89f1f670682c78ba4cbb87cca8fb05c6f17e1d4287c5817ad1ab21951e2404c67feb88b610335c38bcb3cc628bacbed9e02cc03d813b714278830886727cf6b4124d05e5fa5699931ef90b7662b5e61916db258153e8bfabb3a1a6ea16bc00ce4cdde2f6d21d08215d4817c00d2f90a76b40e3fa5d5b6985ce33bef84f7c1d8868d697bd8693da6988c45e2caeda3908123ee2e32422922dcca87b8807df20c403d7580c88992a595c6b1b6a6cbcda7794fd7e0607b57c007452b2111bcd02de65ace8a66f42a2200aa9ab1cfa80649aec647746d7fc30e41d715f692d4a92e73cc589e7330cec21293fe554f7a23ac1f4333e1936543a29452852f8e94db93131ba6eed8a048615de319a891a69b7730e804195264b6e9960829ca62bf4fa4f70fb989e29aac1d7523c6db2867cda869bd738f19b6289a754fb104008d9130cbc4b5c0cee599e2c3d737ec3433e700a17c60a590e90bf1e1fbf0335818567b985f32a32b2247799464aa2843ecca2898797730287119e45ebf88bbdecfbe444b9f985a62176481b6965be42423272f9b8a810d51c11ea9069f0c49dd67f0d3754586f309cf06cd0473c62106252c3a80a5dbb0ec641a3416dc0a7e1613930f82968fb06ccaa06cb246c4b4d8fbaba278291711423d59a49aacb310163e37467cd88de9ea4f77ccc41d329c31569f0100eeb0bf4b24a269ece6c1e6360d545d9dd968e8dd8fbaeec1b07cf22031e026c07c3fde4637ae79b2f84904e503f1a37b715f2ee72a75262aea108a207cd8fbb245b5af107236e3f349fa6388728cf79a5c2bac1db7ed0e007b1af9ecc3712a9d09f8de2c47352655169ca81c644b531d74a1b10e644d056eb939fc6bf8fef015ce3bbdb9c3dadb493734e7228579e99071d52c08a66778570eb8dfd127879332aca0f13f60e8d9b1cfdbd3446bcf138911bc2c8c9b2d99b046e19173009b15b9789011a581cd40d97e6bad18de104b079424005521c8e7720ab3770cd6ba0782162b9e138160086697653d5ea8e07c9268427a5f64274e8fb7d41b290947d523c741c540303ca625601303235491a06ddbf62dc3036d6bbda64e7400ed0348f5124f28a4044afb8c93e3736cdfa4240611a5c0e8857072ddfed0de95dc98b636df7e4817e8eda72a35e00c7b7f76ac8f13a3db79f4156bbd8eceae50150fb1b97a1bda54f9320590ca29968e83a609c9767c40961f2d46c5ce5fe53b4d27f55f544a7ebff37ab51a457aacbb258c26a70d71d19345d398112ca0a6e74259c0f0120de47538d7f11da0aa77c8c4b80cdb958541198c93cdb6ce37a0e94d912704e0dddc55c086e6c4ecbb625277f6adf9e884322899be688c3d20a257c3d9c6d803a33a99c09c3dcb667275c07adb34b0d2e4228e2fbaba6499acb4b13b1666f124003c20e1c11fd308d475405d068cba213000eb64b58ec89131788ea5e23cb6e4e8fa552f66ad549feb08ba07c03471231a482d751cb758b8052f8d1f27e6231ed0622a01ae0a5f2c86739490210c4141020c746b53abd37d99d22f0410240b8eb50b4635db152000e218b01e5b0e3f33da0c6fa80c2ae02ee20c7a8ad1ba4796f531e0872c761cec756cc098405f27b47810980a86bcaa2d48907ce6ae2dabddc65d1b8a95b55120b5e3eef73026c1f749497317ed55df61b9f1390959681b52817e4837e002d490436bbe59c3e2314390950104005593155d96d390fdba5f79c6cc91297e3d2889a026c961a3340208c691ce76b79170be9467ab0d3e1efa588499c1d767c300ba22a8f769c0f8a7b35ced877558bfeec86e61ea1ad42fe9b2e984fb3662de03747ed83c70c4baa1a01a07950f852699255dc16441098e5554db6f77d8a531304a40a3d56513cf0c7b8ceb96c7187f80e536c6f8e438963b39bfe4c43ba1dfd0d0aff795088d0bc37b62c5c9a205373ab1a16fae31dd1d864eb1a2a079acab1caf32ea240fe0326d279057aabb2a4412b37d86c7ea322eda1cf98563bc8f2859389f774590fd9c6357a9d89203f9810cc117551a942897eb9f516f30bcbc47206c00770e4de999e589b3a3f5985816f5067a6d9834c94a25db5c8e42ab6ebfd2cedc1d993cd1cc8479c8e46c94340ba54095f0823eea4d48c08a29b511117314fbaf5fd603180ed6e17e7ce4c5feeca6b13086202f47dc96be0dcf798e4adc925a856bd726ba130c2abb3e019dad99a60f4c196df8479d200fd694c5590c3efbf3ca330a6127e5aa80d819d412cb79208ece2c62fa11d8ade40b9ae83b8e35a8884e885d5298168dc1cd65b4476c12c2ac7b9f8e92c845c47511a2ca2b3baa9ac2f894bbc777790f8a320c8b697d1f63a8250d30ab600ef319aa710d221b70b57e50047a1da992e94fcace6037fa9c0692fdd45c58bfa4e67e6600ab12813c3e02cb355a64815edf82af84568854470868598b23061230555238e5231385b0dcb4c237445658ed82169ccd96592e42b2317e02cb40a5cf7c6887a3e72fa109aa57e64cebf27fc30f135383103ed05a87745fed569b3938a336b79ded521cce3348fcc3c03ff53b25dd8b4feae4c6f99b1dfbecb9241cda63d2816adc18f4ac691330ddc0e29eb08ccc5c3cdf68b1ff86932596d8d9fa10f083ad9bb4f513993653ea0a77aa831003f88355dd854fbbd2e5091cb04e3a8312f6194286e592e11b87c7202bc8743de03489232cb1e537a70a3e409199035a7a9adf39d45cf79de001d095b624f2b3c384edd495705b043f889b7cb664cf798c1728211110b5883ad56c4b9ffa2dcb3c11fea628b299c7f9362a93f0653fb060354db6b20f37ed068d0eeb1d019c811ceec8488af0e0ec738355e96b6939aea5601d76175e4eeab2574a5975b1a83bcbeadf0ca5ac5c3df406cdc66f059c76aceb2c77b081aea0c2c69e69c612a5f181184c8189a64c9056d4130665a27ff1712f7133c9b096e6e4b6dd70c156c531388f471e357e6adb7fde65b152747857a9689f14ad65dd9fd25dba9a27c821c0a1bd3bdfc30d1ee6e74f5468170ffbfc7c55cec2df822c196f4fecf00225effe6d4af35e887ac72237524a37f7ef163a3e0aca7b3216a77e7df5e6798c38f456debc08c1f00cdd242539ff4441f95aa714f4d68b083c8470a546362cac7611f240a391ddc6305f75e87335033024ea8daa200e031b42d438559622a3b70b73cb1dcec66735170883a567fe413c430ddaca988c05d3cd56661f5b19d057954a0f49eb6cb4b74634869a74d47c22fc0768729df23d80e7e4a801c762e3c41488a6bc10c028bfce5a992c6f4a7eaed6b2695653048b0c8a2e8deee9ebb8c7f1c5e764c500eaa9a9781eb0a64c7b620c91a937468a2f35618df8df6b23af4589e5822f9446372a0f2a944db1babca9fa938eca9848b85f1695ff925af04ff1ea5405af2cc7ec2f06fe821028dc393a0ac5c6dff562c11beec9d603614d0d91dd74766d383ad38cb9799dc173783da5c2439bbec895c328baffcc3d4315c83bb5451aa15f3c04e3d5988f74fbe158f17b8a16ab19d4af490571a74abdd6b94f2f6b124d05e25c52a862c3c545341726d4dfe7d1129f8d3e7026558d1efe688635ffa37b4403da3f073dc29f47212e630134ea38e8bd313e12306c6b957e261ca4d64d897405924ac08e74d11615f840d7fcf817c8f8bd5d5569197e876ce13c7c5ed725211261bea0158cffd7a06023745b0ede10b32e74ef393823b23142ea2a29f690bc03b05f3322f717e9b90fa1b590fb38376e0fddd7f97d1c3ae4b85e8ecfb4b09988fddc7f26d4feaab48de6073e9f4c5769a75a9a08666ee2712f6eb5c7ea8cc2035f55a9941c998046f3f8a270f48b6c3aa06358112eeab6630023577274ec021d35f2fbe0f68d42b723804d573d096ceb49bd03cc694da8d7179420f3405095f2a0c211836f0a849ea1d24bd84ed56a50c2c92e674c3d4352c31966f54601dd931974a59767748706c64e101ec9774a98b97096cb03c25502c2c817e3b0f309decef3215b3abaf44eba89907094cbf6a98498cb62c9ecbce9cf7f64abe07510eafd103020c6af7d6eb716dc7dcf2be5c476783d868c3fe7258e0f26c60fb419dc15adf3783adaa2b33052eb0665327a5736e1434c9ed62cbb9a50afc051f811131a6b272538533c17d14d30698a09a3e4165840a81c9b44d2af62077f5a71885c4f3f9e313255dcf387bd16a34d1a100f1b98b03680d82198d0e967cbf90cffe006a66344219d408eba31f59da1f32a4743070ccc865ec988c76101127bc06210f02c8eeae415f23db25dd1aadf81eb2f684a79adf84d1f10b4d71617fbce58af49533b16e14e890157fa26c9f28c76eb8e30632e7d355dbe81fc6b592f1b7c251a246b4b4fcc3dfc907620e2e8f77d895b06ddf6faf408d09cc509c015ee0865ad8f06cfab24c0fcf28a4eb2688148d01abc84ac1d1142283e25d331659d06731702c9a4fe4b3f57b4be48bb657a9a55d625ac9a21ae5a16b3b233a925c3f31cdac7c3a1f906038c7eee2ed427f200ebffd3658cfb5db042ecf0de4aed58f28de97d76c1d87b2b9530da56742026659c500c094cc2100071596534636b02bfa8814159fb5ef6e480cfaf089a229715142745740755b688edf122542ec6ffa9dce1725e87aaaf6f8b72a1d19c15323bb688c669d0328d67a33b00881d455a182122e167cff1364767efb5d66162d9a3d6f98b8ec0a145ab80e341dcc4cf5af2e89ee78a9d30d08f661f4d40693471e45918e6d18afc8052d03137040253be1fa6657e2c8c20b84ef178e325a2fd619071882e8af4f99f22543c8e3e136f4b4090c179574c25aad7843e698ff6505dc27bfa9856e427acd080becfd2b738003ac4068e32436948ab3104aad6ba6ed4112a1f17685c5e1617dce630cc8bfba4bb021960dd2f3c6c2369bea077a57f056458c07651145437f7cbd7bb5b835ce99dc8a0efc197d38fc797245b4416392b2fb71bc540b380f488814fa1d4012a534089cbe69cb6b77e9e98f6be3584570a620fc6c278c15e5e7ce51768360881530d35af4139641adce6cfa6b16a0c313ec601613fa4dd51d63b2aa63a29d79efeabd0bd8999e40497f823abe006652f79dd69337ef0c11f2e080518f5b8301044e8e4118e88f9506004ea50a4230bca65ce47812e98498d6ebc55ba8e43efec17a30f7515ba62df222710f72c84f3d6010bf1bb7fd5f58e713d86b35e8e68f83686550b75ece386cc47d7bf566bba532c3bf6751530580b7f662f6cc57756dece9be0cdef4d3a8568c2dcea52985e737bbde7e5e4cacbe157459d10bd9ab9d672e5d96072ff544e7cca2fc1aee0efb5ef53fa49d063f3af9784e965f3bf5b9b31709c8140a63990c4df6622b4ca64a79457507969561cd644bfc894ad0bcecaf2cbdf2f6e31d98345a28b6e134e881111c0ae465a92c02e2f75008ef22df4b774f23b0c7e17e86228f405c0b76ed656fd649324667f5e25b383e8535e5ff0574fc192cd267e9fe125a73859de9fb94fb706bacbad2f29dc9fa96b962efbc07b6a43b35a7fd8b0e59f244eec60953c44257d4d1397f947776e40e9f8e9b6cb835859c6d103db080c77c9c430bfc244b29dc033e1e2a6a09d050e09fd7dc0bbd0a467bf273e216d1b04b04e41a4c274f6d76fd1d6e960cd0380131f8c637761943bab896db2bbcac37a1d1e575b7eacc15bc14d8e7b5fa157e587460f4e20c95fd63c3be0bb4ec6d7838e6476b802c58ecabb0cc4f1d1789ac49f3de649c610b0f432efdabacc4ed2aba93a4da3623aaf28c99e2d103f83f2d5c65d1babe5503e9a28380229271626ef9b295c0c868b580451565ff51ba75c9b2939643d22333519a077f4255083c5174d7f1c3f82efb202e09f4b122bbcf71e35d4f170d375cde629d6e72480aac67527b5a8d87b3f1ce5736c00d7e1350813fc8412bad0b2a9a96a9e39282a25abfcc4c76983207f6e88b2184b8cd4683e97bf23fae5237bc384a5e62d1e8dcc7c2cdda42dd72dba44179429f408289de04f67cf566c922e54ffaf2bbb3782c9b40a2bb48483466b0afb97411e0e5ed22079454a86f056d7a009941a95c9d43785981bac1de86c9643a28a71260ab8553498bedb611d22c6f7d5a9c3b2b1af1811c3a83a14e99b616e05002dd748b4b3ab3f43ae90cea2c5b16cd8037d8e7efd19460f40758c6dfde88a756d63bc9017a68da9c0d2ed326bf75b298d76549b159a135e6227f39cb08e9a2ccd705f811a8525fd316f8a147152fe2772a3f3899ed642646c7abfba0f01f993fef6ac3e4020dfbe81a0be7d7be40b12c0c45e5ff3ed3bee4291bb66f8fdfc0548f0d8d1fa8e7fcfc293a86984ff98492c0a392dada056e88880a586bb5b8fa10d259ab4fa8e2127a6e96ed4a69c362544c15212f03cdc6db86187e4ec242f4ebfe95bf88cd0012d0a3f42fdab1de69432c40a529a5272905af3c96afc5914bb9a01490035620218e77a68bac0ee08d94b006d29837396872a0f4f5023eeba8a660df13e8a5d97f04bdb30fb16d9e4e7d1a6e6117819095b9b141b593bd8983d31c78e8d8146083f8337c7330bb481f86e511605090a048cadb7b4a0e90c4119253e640f36598322b606aa06145e034a7bee7e5b3052ba4a075a6849a309ef8d37911ada8af6325948295d4a6a0c6dd9cc242340648bab09552b3a58400fe7dfbd5b4a64d175b863106390ab5cb0f6d801ea4337a8c48d02e9f5f09fbd90fb068d180922237fefbdb794524a99640a7607b307c307d3e5925d0f5709622f2ed70bcd3c751944687bbac277902012be5927ba50c5e99d19845da8fe5c004710091f5927f6c79c23f64413889a9035ba0ce5100948e08275a13f273281a88967ce71bf10c87ea174ea9c0ff9d9fc8424f8f6d8d2b5c895c0e3997384eded3c5afe446f5fddf40e175a9e7a1c7d7292971b9e7af4bbde6137e38c33e218cec14e1b40d4c4b78b7370bb9e391f7da79727349e79c974a1d2058918247d61e5c31b3fe90b2537cf334f74592ac31863c601f9634927d9d4c09c4cd3b40ce3ee2cf6d269e9b7e26f3658afbdf7da4a7b8aa6dbe41d160b35df34c77cd3b66dd3325b691cc3c2019d39be22fb58528776cc7df8d999995d35257f7c3dfb32cc3b8b8f7df79b64201dbdf4cce58c51b5b2f1719879733e9aeba16961864d2a9d7126188d71428de925ed9dfa592c9db3592519a50bef92f42ea7e9a3c8e8669ec839f384d22a9fc40596ef4f88857ead06ac333344174aa62c328bd462cf96914bda12eb48e7a2e8426d49b3c255896ecaa5f959f974079db5a2597929955847bac65479606d5b8c3182dc3ce8a20fa53f1e084bce399b67641d1675e2d2b6e7d523493006d299e6689ecdb556611e7295f6d6927cfbcc9a7c7bed9cb09f7cbb6d24be8d7cb75257e9feae8bc9367da2b553d9dbb3023aebd2db1a6cedc3dc7ad7a717b27802617d873f7ef36683b1e98d3eed2c10bdb593d6cf28f3ca6a45e9f9cc35137dcb8f0522a208e40d4af939d6d37e7f0ac56fea3352689c6e8f34c609adeba76bad44859a71ceab4d58a7ba36ad75ce3a676302686ce1d4423a8d4198974e33a7d42d75bbf24d0b245efab65ab98dcceff5242d45cf543c276911c56b02f0b89ecd8542d818ccd922ef1040a409000e4eca6d709c5b26ede37ea2b51ee783730bd2d0d0d458afaed9388d57e3c5c761ad6b3ab5d61ac781e3c6cd0d4d8dd358eb98ddacb5d6db579bdbe07a363fb93680ad95c8d5aaeb6aadbee2e65183b556a6afbef2701ef9807704452fef5e7aa7230ad2a9970aa677c2f08e1fe9d4535f183fb4e129af5a7a27b4754bef00d95a5d53713f313b21739ae27c7035bef290a4cac3eb4892875bb7ab639eab5e83ebe9afd99ec643d6531aaf711baf3547bc8386579f49f08ecdab6b9b17747a1bafa1e1c5477128ac7c5bf9b6f9ca79340d8f9f3f9ba0f8d685ccdf3ce8f41b8d6f9eb79f3e2105885e74a7c7e6518d962e9c4540585aacd1828b76441f7b7296e1268d67bd391fd6575ee3f14b2e287e8d5b4f48fc9aed0b6df8e695c629e70354e3366af559d43b365f68e349efac3e201bbef2ea134aefd47cdcca37ce878d156b8bbca30768f31a2d6e0d0fbab08dcca31a5e81e29cd23bee1bf793f9758df311bf5583d469e48ccadcae411a1a4e7d0b407823d278ba857bba3da594fa507bf93747794231ac3e7c7519cff2e89a5a8df491de915e2b92cca95eeb173615ae36f9e91549f2541f3867ba0ac25594ae0ef1d36d45faa97d4754a4cc2321ba385bc90cef5fa6df952368371f3becc75ba7b752ba7db4abe88da131ce0fa2a37c0b2d8ff2936bbdb19432d487917efb4e1ecab3251d13e72177df4ff4c139eaf3e9d34fb31e3ab90596ef1e35e4bb2a1f9d3a8fdee9de42ca67ae6d0106db7830a077362b16b56d5eb91e1bea0bef95f372b9f33af5de4ace27e37cbaedf342ea9c967128748f3a7d21903fa97c82e298476928749ff3901bd0f60151713ddc4f74da930151dd6ee520eba70ea0f6ceb61a29bae940de396af30f373e7d9ce78ff2e26fdbb64d6ebb9b6f5ecdabdb5ccefbd3aed99c5c73edd47d9c17c6e722d703f5f530eb6cceacc3f909f3ce93f193c7bfd9fc709e79e6dcb67d34bb407c6a356831460ee32c67adc5ac732a7c3f1a8c2928d13df6951029fd84e20a422d6f852ce639bb428398b31ad48179c8f211e1d30182de60d0e9ad83946ed1512a6462200539aab9b576851fbd63a5ccb77da12afb7444a1e63c1d1e4b07dd6cb144d0d152a89f06f9704a23f609c51f0dde06a9cc922efba142057a07dbb80fc382ec7b21510a0d4615ea0af43ae659cfbc20f3b97f60a077ec2714bf7e3d660a325fbab07b99c8350102882ab014155db1020820aac0d2489fad644ee699671e9bd23aa39606330dfb7a4883998ecf62d34ee25abc72e79d77de46d260e698151de635469f3de433975e28d4034b5603fde2528399c72f2a3598795f894ad4336927364517eaf8cc1b49ef64e1aa9388f9ccbb49ef6416c967be9a7e6fd76559c638d907d448f64851d1152bae6bcc3632f9d91f7433deb879c452b71920baf0fed5a29638e3ec291314c7f4cefca216d762155dacb53a5383d7312c9df5e9e1653a8a58fe7a7c92d520bf08a5c1ebd9178b1abcde55c4a22b3179b129ae96dee1242624feb65f8f5c2218fa85dd6d2495ca8d3b3a4a0ea790fce839d098a7cb81981c4cf1da69f64ed8421d0ab1cf1efcb590fc803e1f27ccef631fa1f8debca213eaef911e245da85fba507f4ff985ed5bec1848292dd37b595ac93c27cff61cb0cffed843573b554b29a9ed06992ff5ee6eeaa4934ee903cd27e6ed01494d66ce9ecf67a33910f5761b1fd4dba9b5be7d3785eb9b43e0bad69f4dcff4761b1fd3db7da6f7e7aca365edb13d288e79671d79654e0b66864091310336d6a3ac51560cab326c46501cc332da29c39ead335774fdc2b3d3af6b3004b9257adf53e77676da9c09444dc8f662d6ae79e6f1620eb479a879731ce79c8d8fecb32fe88472c6e259286f392d6519e9d4b4b959cf9c76ce9f7941581f145f88507fe7329e4df78397f1fab5ce3c6e7a19196fbe6639b69cb6ca9cdc8c97917f92716d729c73ca9cb27c7bf14f5efba0aea639733e3c7a7225f0c8689665aeb9166eac23fd468e1da74c5fd14dd70bcfb9740df3247772291f73eee43232980bd597712d3ee69c1744c685ea9f9cb99f0b7c07e1c082e298680286b973bc28fb750dd6ef7bda591f68f2e4a37abd2ead5f6729f95a21f1ebf5fbf9d313ae94d24a29a5944143de77668cae9d9e6ca4f7b5b65d7a2cef5d01030d20ca719d475f0792577a10a1ed834810aa2f5daed08f81bff763ce213bbaadf123aad132a1b1446dabe9da742d727c51ddf4aaa4a0c521d97c873ec6f64834ad0d87e690b54136b607c98f41f30b85fa33ae077521dd0399ae173e6c0fb2625e18f3422e90d76d61bb10fb4177080c2f7c1021f5a30bb1cf02d173f50ed9ab508bf9e99f8d8f88f4d22352e809e99f9ca3bd56e71c0de0383465b7330b41b206c9972efd0b1aba4268e007dacc96ae6592b844f1e1fc8e317a0666b674d1c3e7bcbc9099ef477a2195dbe47342eac6f4423619de1124ba3e88848f284c1783d1a64b0f89bc2773a94566c9eeace3e37aecd757370db247ae07f3d8832faa6b3024f2306f7a42e2875148cca6943241f26d7ae4638e7dce3aecf1af17744fb88e7dbce266a276875e9bb2c306c8a0a1764cbe7c39334627bda55b4fe76b18a9c72f287e25c013d968af68ed335e3a20eb217c68bf78a4b738b201de1184f546ec44cc854767fee837a4884e8bba91542bfa54fdf49a1b62ba10c8b3b6f83184ce74e9a60fb1773287a8c54d4d58f0030b8e985cae1675cd234a20040c4130d11a5244a715dd48aa35a448b7aa1b59402b3af58c2ca035f443e6c81cea4351787c435152a01ebf219739d3e9c7320789c7904106465fd8c0081d5cb95146c72d221da260c2891327965220468b5bec212b0577b95af148ef8480640aa131ef085932f33aa787b26af1f30b9263c684179b20602de17520444978f9fa5d0fe5170efd94de9ce286bf9f11ad1ebaf061f4b03a10a2267f41a080214820e029907cf570043fef0702d6f2f5fb01e50505c00206930b95bf794ee2e2c31b0db1bb40d4a4658d5c34384822061eb85c2d3672ddb061882445418456602d6fe42a001630700951c010a4165c3c0592167b3882af9ce485152f14df0806d6d2b29f8bb5b4f81b627701044e80a8c10b625c435cae167fa1f4e62450002c9c182301940e7040c419318c19d3e212542f3f5a913439a717eda5d4a55fafa3b4ced8dcd40b15fcaa415a29523369ec523ae6b2faadd5a594b206efa09dc4a41eddc6662a61ebbcac23db8bc63e29ef88223448bd307a960cefcc962e73cda9dff40e751dbcc359e7769d7373569d739dfaaac6532f8c7c0d0d934f2ecaa53f27f100ccdf3478e3751b6b93e4c511cf495e14f1ab06afd7495987751869051acf4cd151e79605d078260a6f678f5c8f479f335e74ecd5bd76aed5bb7a94dc09957af4f6fa85318c99e601596776ebcc27602d0c81e105d707c99c05a20f0a45f00333c63c0bac0425090daf390b44af7d8c7d3ed9d75a29a5734e29657747d6b994eb896f29d7c3665f183feb09b3cce6c7da16de025d0f1afa50fe751eed61e5d1ed2789da9e93bc28fac94e7b302f6589407d1586a75b7484a7d4b7de892f68cc91396e40e3abf2a3c864bab55d3dd471758c605d051e6079eb15689ed9b2bcc455de82d171d33becd92d118cb7ab2facba8c6365121acfe8c0a5ec22cb4bc9f303b2cb16a66f1f1ad7f0a1db8ebebd53ad78477c125a72ec6409282de5eaa2c7e73e003bcb308d163bd4a44b4fc9b7e7681ed9ea10fc2d76627010209a82c50d53c2d0a10b2d35b498bbd275d216a5efeeae776418f1db9e93b6207d3ca2f1cc0ebabe9b00349eb141d71e3d287e87b1e4b339f5f65888d847592788c7f46c9e65af7d2158bdd08abadcbcb03a75ccdb37c75cd328e651274aec673ae69be6d1d324f7733dc6fe304cc8158a44357617479e3ef1f28c26ef4fcd10f31e149f3ab34ec84963aa7cfbf46c7ee81340d1432134a44f277a2134ace0f8a64f7cff3450fb8cd225a59f90f6675479a17e295dfa4bcf5f487b2f1a374f0a4fa0f8d0e70c211f3e14727180e9432124aea00f8576a0f4d1c31098e0250513d3472f4e3e88c78c39e375c400c6c71e334b5da3e039a969e9bbe839498c290f3e2785b1e5b999a54eaee039a90c261f919e93c2dce007f09c144686bf2ed710568ac2827d21fd1c08123f62d1c910daf5fd7de47a044d97abcb7318cf605ea35be57a38cb67798d69adb5ceae55c65aeb0565a2bff458ef4224ea9651c830d19e93ba4002c60b64f8610b2b46a0404a8b398deb21247fb68fd9e0e58b9a0d0ac9d7ac6631cc76aaedcbcfcd33b742f231d762739432b6f32e778e74f0e6f90bab4b26819b2f8a6389dae4fcc2f84171f50ef20ef9383c48a762e64a175e9ad485916fa6939ba1a28b8ed342349e91415237b946e3992a3330e82fc27cb165061a6f44b2861b9cf1427e91d20597f7a2f443052f5364972e927e79723715303064b66697308a4af8a1020656267c09f3d345681edaf2f2216301e3adcc2e93b27eba8fd1f5234bcf2d218bc53c4448badc708222aa28d1458b567b34c23cdb172e20038c1e7cf0440ce621f261075e3871c4888933a4609e0d3811c28a179223a868221635921a363f447aa51c226a596b3febedc9af6d74fb51dec13b2479de12534cba7de84266923cdcd4a54563a3ca5add3a87ba54d2cdd5948e2e806ed76337161ae384bc319539d486c524468373a68b8043e727b8518d521c218ea720751054029ffea03cbf90860fff10e867cbf4a7629de8ddc660f41b41554ff7dd3f690a3f1aa4eca51ed1b8b5283828f1c261895f35e801160f2cd66a87d58a06896e1a79e6c2054530e172658c2996b4d899c6f4e2de6ce288512acca904f3b494cea1545c702b8ee6399d3c174eaea596e8c23e9a51ba8f1aeb6eacfb0804afde478da597e6d13c9a52e61111e6d19b47534a12ccd3f512ed44cb00fba6942eea269589058ce2a9df2a4f7d7ed8d1f5a106a9b7a082e499453227f611e6dad19604efe83eea234a1df3b0979e660101eb9ed2474f7459f5a24f128f8000c22c6a81c370180ec361384c9c31c6183d471fc5e8de3cd5c0a9716b44afe19f27f97a38d14fd1678cd1371c3abe77d290b21d1d016089ca0daebbbb070429d811081784d39c20d0584da42af1624f1aa4452ee834bfe10070e94701e0c171eab37700e0d4e79c373c9c730660ce3955a939e754a5e6bdf1b08f68f89c930693728be43939751bd3e30d008e2a358b6866d12ceaa33e6a293d459502e1646f9cdf5784038757ae8f523d74d1ddc33eb2f1b08ffaa8b1f452efb853ef2c353335a89a1a9f1ea786681f7df4c8bf166e78d84700f090c3f41253faa8a5f494c7e1f103c0eb6e3ca393db78dc601f59cf86176e1ff6d15110fb212f09c5a7f199d02075956793faf8b5195477faa617950b9128a3200daf1baca49c4821bd8e84995c5e47b6bc6a10f3aa614b6a895709965e25509a30bc68008382c6adc52d328b94e262520ac924952493bc9209934c9e1223cb96540f5ddc22e78dd14b7be412b7c42d914bf4325dd58a967ac16495f1aa61e931f753631836b1c6fc48435ac5d884c66d834e355d7a0a8b2e3cfdf4d07fb6c78ebc8365a9b59dcad285fed67639c0b794525a5966441dd0a0a937f9065da75a492965cc62e2a00bbb9f9d6a524a61106b8fd415ab9bd0c1afd5b7dee9ac8dd1c67ac5adb50259b79f8d0feb4d5975efbd7eefbdf7621876bb8949a9a7aae842771cffd8b5f28086293f80e7170d47b610f3399e5f33283dfbd2950ec7e41a48c00a0b50ee9862eac2ee29a51b09b4aed3a20b4fdfddc72c40d07cf83995832e3a1b60bb0d4a2d13d01887b914966e426006a4c7797e19597aed54edb4f1413d3af5f8b5cb9ada810c6480d2c523524ee6a7c47427eb73d2f8c9fd8c4fa7ac4af9fc72e4007b07483a582368d6d03c8c5e8d1a343e3fc74999d13dca83e27f3154f97d41d3c31afee30b9a2ebdde1a5fe347e7abaffb1adffdccd63b33422d3820be1c5ae1e31752a71f10d603054d0fa30b916fb48d800b9a1ed2f8c23b31c7388e732299639fd71a5f10cd67b4f9fc6878fc2acf88f314e7d20b7f7cfd70b4cf888dd6f6cdb039110cc38810d91873229b6b4e24fb3a99c3ce3911edcb7c05c9c37d2c19675c47836ce9164f1eb2bea37b377cd0596735c84eadebb8414667fd14016eddfb09754e3bcaebbc20f44fdf0a355374e19d3daf7c1951922f2356364fcbbc49e9acd64eaf934ea75a7e3a4f4a27bb6089aa4c55994d78474f23349bf6fee136fb8a3eeae82fc5c429929a990d8922c3f9766ad7091e5fc6db6e6456bcb97456d2329e51e75c87f4d2d3fc657c4eee04996fbbd46594a452962d128ceb8892274754ac6061e2d22f7b4814ee723fdf6f3e9b5f46a63ce7db8facd2a0ea3b752ce84289d48ff9e47a04f161eb3eb15f66fb69e79cb91f1258e91dae7fe827ab34185f46a07c7be6dadca2cf965638ed0b8ad20ae5c89152994b82bf5f5094581af4a1a91fba502221f54e95deb1d23b4c91707d6130533a74d4a564b0d6d9e08eadf613eaaf42fa67af00098b8564b5ea8e148b115a518cacf7b09536451263dc0095ce1c731c01ab5bb9e38039b010fb1ca7c1ee066c49075f1ec3300c73c66e0ddc1b04efcdb01a300cc3bcabf298afa678ec0b81b01c741ceef92543101f3a4b0ca78e4c3a679122224aa46cb8f7da5be4defbe4af77477f5f455ef0f70b6d6a86d4912bbd4ef5928186cf9e5f32b83eecdc08160d2c165796d181acdefaada1efb3e4b95648fcf87d20587dfd80e63665903265e47ea59fcdcffccfe6a7975e44a0f8f0c713a08075fa4544097d7e1131410f3a4e3a03899fcf2f22367cfbc693f20e7e1191e1570d8a5971c1e5db6fba0363347db8f5a0cd50d16df439e90c2a32674e0fe143a24a3d9c5fe8c26bf1f53372b64643ec2e1025e1a5453f174f812484d722731408e1db0a2a7268dc3c321e5e2e63ae93e8338ff3eb11bda6699acdf553b8bd0c6b56d7eaf4aa694471c3304cd3e46bfe329a5f209b9f694ff6c79eec750dc3b2afe73ae698162c3f1da38e6d7ebdf858967d40d8c6a1307dfb306cfbc2a1dfbc7ae1945d84d900b13544c68b301ba07a6cf1909b1734f453ba8cc72ded7a3fd807c479a8b99cf50b39d73e1bcdad5377eeb3d1be9febd5af572f730b74affdb9f6fa988e7d6175cd351bccd906fb7aa83f1855b4de8032d7aa6fbe79f5f8b7e67a34d73ccd79c8c8a331b91501c61129050d64083fadac5156761e5dd99bba741bebfc525abfd50b360973ae34a0e8aa4b8fb68677d62a420ed75446dcf0e6d9466be3cab7eac3af837562ad4a7095af000ef3cde76810e7994550c58f7a0e967711c808cf3e5792abc81268a1ab56f45e672fbaa65a55e7fa711009daec0944c78d140b5b6b259dec92554e7446a89ce8a2472e342dbc1c399cf44645e9a4743aeba8a2d05a69ad5475441727956e29a56429a5e4962e4fa0dd59a382d285ac766128b6a80f45991e9d1915fd3e8fc6b90165e4e156c4811155de9f5f451891f23222865714d7eb08307ce3b7e1187520523bc89779bacee1197f4ee96d599abc8ed0f23a02899711625e4660791d71c4bbdb27addd7d738830024e5fbe5fcf7bef8d7c335d30c3bdf7429142e7aa534121a3c91226a922401c9068ea420547f8c03483300a03a5862428265372707224060a6070e2c904c2280aa32c92a07490468c88306241927be2611619b98c6e48b2e405e50a14268a9833aa9ccc39a7e482c5ea5625583204181b8e9e48e2031430349ab2f81acfaf27494ea60f54523f60e202197ce9820552e60f7cdd71c01c20e6e13898a3c4510d465cc03446d1fcaab0184378a1a28a2523a61ba60f31e0a6f2b112913774f9f2848821b43c19e3af6a09add43a55319973de996436b9c20696882a2f22a05025512da1f17aa23d89e167be7cd8f913960e2cd60e93c98fa0090c5f927eb0010c0b54bfe4196906527a0073c58b932a5aec4c2307550eb3e6098cc609b8c3300c0b424910506e1784917baf4c0c6590818a810b20c838c5000b23cba2c510b398a2061f3704a30208268098c1bdf75e1b6c70d9228b286890a4071b7a00e20803c288060577062a1b8a907ea84275a4338267d084e4c40d5e70a484134a8abe283203c3300ca3474ea002c51048621c3143063c146529d2412d821529155da19281c6f34b88256384b0c1bb4eb5bab9f6de21d1de7b5f42c0f0f75e55914e6583cac6f32b081efcf6fc0a228b0f3b6fb2521959ad58aa1958ac1d1e051ad000059227a0808196163bab706019428327905051658c0e2c161122447866eb56ff8ad42a850a8620562b29552e1c9c186bb052c5b05ab122a61ad275cfaf1f9878c7bed70f53884cd50b734ccdf3eb07275f9f5f3f28b12ec42babfe84d888db988fdddd3fbe732d723d30acbbdbbd970f605e3e209982c5911793a5d79229a92f2dc42348346e8dfd5afb854058777a767a964aa7b355b00496d4184d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4da931524daf265a5261bc9640498191222305460a4c2a0c97a452f44dee52bc5d7c8e8dd65d626e459ff706cc333ba7bd372d6e96067b498c2e8c4c4bdf41e6b773aa874ec615c5ab07a497121568a7d412a925524ba4bca4bc748acb93170f499e5f3b4079eda043aa4a8a4baa072f265b669720b524b5842887266ec0050a5e567c21c4bca185baaeb3b606897f9dcb8779e67a0455cc63a4214ccf9c35a1b33ea79c73decc7bbb6ed632a4941868d087ff5e5ae566b55a3186e2219dfabdb4a9ad3de96ca50ef503c3e2cf19b4d2aa4395d64ad408dd5dad68a573529e2c5740bbbb99b15bb1696bb593ca6fd2d9524ed952baaeb34e512aac6a6aedac656614c6485aa99c93ceba444a796fbdaa132a85063becf6cecc386cbb71521a3ba5225a69cf3c6231ccf6c0543228131aece6bc97bb5c6d3da3844631a0c12e9c7f6fb575525ae984c16446add01d979873ce792f4a030dfa703ba5d5da7ae3663dfa9c35ced9f40b2786d16aeba4b4cea4465520c3b42ccbb0ad41332616294575a041cddbdbe7adb5c6f73ae954723eaa67dfbc5da582b69414a5c2a4d3b5cbf598b5b677d6da681dc3acb591cae8734e9e74f67063b17e91527a86021bec1a9c7332563d9e714e1aa5bc9366c90109cea1c98a09e93463440169b06b90483af550a8b919b7f95d798f9e5f49c2fcf32bc92b49d1f34b0723bf7a7e25617aadb79694ce3985e49413c592fb9b52b49ef5669b4cc71c917841a2458cb1250d923927ad3588b0d65e8c86892ccb326dcbaae0384ee654b3e8baae43cdcc68914aa5522a1a2f1334d1d0d0d0d458cd186a361b366cd8a8b141c97063bbe17adcdcdc703ef1061714c77cf4d899e397095c1f1f7b7ee1a004c716bd170e40d000226987213a28799d9410816118d6052113a58b112b66e8f2820d6800a364c8bdd7060d4444dc108549982e6614399a33f040050f5ee4b09920070f527840ca21093cc0f30bc9099ee6f9854409142da41f6d7afa9f7a3dfd92461b1fcfa5d07de4e8779144e0a1230a114410a177248fb4020a2caa7045d1428a56fb8a79889228e1c00a0e2b50a205575aedce3c444c9cf8e00c2c456028c249ab1d649e08d04003248ee0e0062d28a3a565f28efaecd45e0c673a83d235ef8641e999b76215830c4ac9dcefe337ab57f5d27757caa0310e0f06a0ba549c892d29879bd6cdf5e0b27f017b00ebf4365fab1b23c0008cf3dc391c004e00e6ec21f08e8bea542a2fa1049b99148f6d2b810125a46cac8d4d1b913b33dfe6a184fa4f3c5cc2c965be70e8675c47efe8a8e1218bc643d06b3c9cbce3864ba7bce3c6a5d798001b975f08648497cef234e9e948d2491f11740c619df61b2f12619d761b2f16890568aff16cfc587d2158e3a3f9c255d33a039516d5962512581084120aca48c28915b4dae316e651804b8c2a9088b2640a16ad761e0ce89d948c534fa87f4b99a0e36f54e745979292d20f15bce8a4a7c43aed29283a576c2496528c91ca0c5c48b1620bd7122f584c1254aeb88e2881d214feb203122bb8018a962e3eb01524a8708939820692db9c7a6d846a1e338334c8e63ee66f2e157e44252c514b548a51461ebd438b8441460f5e988871a28928071ca078a10b9752d1510a3734717112440e8428630137602106941e6e208613ada206a3d31a9d8c332ab9240fb78c7c885561fb52caccc3bceb49d6913a92728ef41b1e68bc94aefa710a0d462b1189c6972e9deba8b42d1685350b152a120000001000d314000020140a8744029150281826daaefb14000d9094406a4e974743490cc3300a62083286114000310a1040081933345403445a04f33c0c1ee287358498db2ef5793266d3f48fa5cee9e013a9bac27d0d0b27c3107243f447589745d5020edbcb65b57673fa4323511c0c1e8bbd32ebfa2a2936a9f5f23998f9be5dc9ca9df374cf84d1b15702c5aa42b39955f83fe5fc443eac36533b3937676d52dd1f234118c032182a387c96eb0427ada3f169671f24cf85f3718d7f2f84da7740f5c3f9b196202a8fa47178a41308468360cbf00a613fd89c6e14de10d6959b8a80af0680116b508f00f96047b184f075540a9cf9dc7fe6210577ae874d160a75b7275b01ba365568cbcca1876eacfe7cd1ec4ddd422351521f4af412254d1678a12432448b45d9eed4dcca491932e9979906ca3c3c8b3118e60e0d70fccffa8355f61b13b09f9d12d1d424f4d15ffb0cf6add121df60f23719cafea3e22765f623c9f627f7540179cef6022e913b9cca2280110342cb48ae7728abb97b5d9291c8a7139eac6174570a6e5577151e83f7259d9c74acd3f2662d0b9572b4754906dd0ecf87c22e50708d0de20f932fe63b2bfb84eb8c3aee4390ec9e40696aaee828b075250341bd65f47dee5d51967f4f6b48584a362bcc47ea6b5c9657523f5012984bccf0ad608c910f70cdb7722ec7bae0e10b20a3a609c9a3a1458c37c6941656b383496567517927a35a5c8f02291523fc28f87889c40ff67ce7f7e2a557d5b59877ed608781e761ade641da164b39fb8944874d7b90b911625367504a860e4fa21d526ec88dd745b815644852e620bc50aa94e0532e3f1f2cf9657e1f1807271f96ae701c84d8360e277e489edaedfe1197572f6fd1ca3023b89e953b5ee7de79590d56eebb0e9acae82df5e1a47acdbd0095d49d2be1900266280eb50b81f3071ee4819303fa67557dfbeb2b07d83c296e5c519b54bbb6f0b6bde88998ac284f68f5511fdd0f9dc01eca71844958741f72948967a42f0ed97e2d905dbe4596311427dca822744f6f67ee4430175330d6851c8d3a772c297a0507ee58c6963bb5a4d31b745b032a603253a2d7f6a8943326ed47eb78b7badca915109f8c96612ee8f9ccbfdc364a6e7cc4317dcbeff9f9607e427ab067250d391689fcde257094ed789a0848212113b8134811e242ad4d591eaec96d3371f909cad517d568e2425f0ad1a00794697fa0fb9adcab668feaedc2014406f0f9ea9aff94e750268792ca1ac5ea3332f2e5e7d4b32f48b4a16aa2844359f41b31b788eac63ef8c99e3700cd91215251f415d058f319f1b0e362499f7c9666b584cc1972a61ddc070f2c3bbfc7f56f27bf80b9c2bb8b3ae17a229097f9d2f3b42677415913967eaabf941e6e1e69146ef3f8e6b48d42e1db60c56ce98a8e51738b6aa0214dcda2852b1e1aaf84e6e7fd695df16e1b67f63df89367d6971dcd36e6075eb0f0401a3a267a6da4c24dfe06f99ffe84ef0dba5323b9e64e128e4f64b7953f82c3d40f0e7f09ce32f9e345299ee45920a4b81c396321830bba951d9cef80e6c1dcdac2c47697151827de0a8227608b4141fed5f1c230a165fc2c7663fe0c872e02b1829dbb19fec7018be77a1271abc058b2fb89296da1dca0601fbf63a80c0bf3b6ba526dd72a3134e0d9a7197ea83163275e75ae4bc6ac5f4bedb8671fe15268d6a1df12fb1786246c3fec86ae32e1f9ec46606379872de85fc60f1ffe22b9978b084df804626994d97af79d594184b52ede078b61f77fa81f122e797f8d750721b9915f064955eecc6d588a7abd7442df869281d4581dc1013c2f07f0fdb375001903b99e9fa66cb152f952f17a2f0f4c6758ffb3436610749e17c131a0084a73d9904ceb157a975951c49adaa4c322426d2fdc7d8bf043766b4f21a30a68d8a82181eca87f97bd0c8429e7eae0e8c496388c85ab67ac72a825533f4f38319ad2eec8c7754d1338a209a3d2e0606120068da55e635b96004dd889536ba296ed19ccf73474f7cf8313b6a5dbf8313805fd95ff82d830abede56ea079b44ab7bce7ca5458d8077a65102a999712924de101a41668c95809c1c8c63421d8aed98533e305619f413fdafd71abafcfa840b19c417a67d61db44944c266e220e8e0c8c4301d8349ae0175b6eeca9961e74882bf060f55d79a7a55e904a3381bc4906d1a232315f5e27e1825b77d596f039d8430c21a9713cb0f7c2256f612304182b1e45796580a40feb9a00317f69924dd79ffe852a06bfd77d3ff3368c5a012645c1db990ba0ffb222950e506d50f6c9539116ee5a379cd1420a42ed0fd34886dafcbf0dec0750bb003ef4b568fe4b57a1c40316a8e1366ac36af990f8c55f38555ac741b5c5664f594ca22c2519b7afaf6f21e2eaf28f8e513e656618e8ba4fbc3508ceaa84348e5b993f1b10fc2fa65d53f255cc999b5228c682cc25fa243023d8cdeeaf5d068512f9a9b61882245fd45a42fd7f001dc188c880fbfe40b7417001ef12d9f78f2e7824aee5940f199bbfc5cd6f3d4e6017954ae5f4e1d7b40e71ed484c4652b0d3f289b504879d46ca3808b7fe02998e0b50cc2fd06c33f86261ea440b809ce81012d49e2d0d6ecd86cb142d0c4d49659847d8e0db7c2238f949031bb78a316880471c94679dfb260b3a36400ce0d36dec029be9855118bd1de8c2f221ebf979b201242e20b7ff38f4a5af132849863008bbb78473c367b8608eaa0adb0c96d750331219faacb228b69f46dbe17b410c481fe17622dce82761acd2ef213af428036dce4db4411da64b416002695527107760708918df6e0443b543ed05470f8a97dd5d2c79abf5cb9a41458ae386359f210185e4d1af50b10bf286910b554665d2a66783abd025ce6dd0afeb3f74110416685f5f55b5779434d12e89154d17562b7588f8d42745430b0cb62b0cb3c47428f43e52342bb81aa49de95f49fe495e19093954238233d265d66d126107ecdbe47e00621e4ed42ffd7f783fa411b228aa1ac177d1ecc046f4a73275fc5d76240e8c0f608bcd113ed39afd204ddd72b23790c0caec9417a4907d3b1c141bf0e5ef5a87182115408910324bbac99eae7ea4f974c3d553acd43b4f8188c24d75a1af1546fd6a9b2fccaa39171046ee309a2e2aa8c0125328af4ce47afa4c9271dc0912b30b36c8542464e54b691b3cfdac81b40c6d3f4512223d38d00ce50a11d53718c44463c3252e7fdfc58289151e72f9d1b75feecc751195dc1d7f70c293242f39f283d22dc6ec459d939f76d328b3f689fe10e00278b8cb48ec9d79091be9fc1d48945a669e8c2659acb0a276503402f11cb6eb4b1992b32c2fd0538e68539fcac308cdbabc1a4bfd862158dde0518dbf2e32881d163795ef18b9eeef32aea3f07deded25a707913af8a19d1b7183d9672d8c02aab4b9962a7c34cc1f4af3445ab8a541a1942a0bdd36f8e8cb4ed6a26585085457a373b9c0e0858a48d9d93c324ce7d85ce87caf295bb6de3b47b14534f4e133a99ea3b69449a73d4e1622edccb24bc4c10aed4bca2bcc5e76275456a6f51f7d31b3a705b29595ec027fe0e57d935fec3af748deff1283d0deef895b9467bb0e1fe95ffc63bba4aa7e1399cf2dff80eaf926bfc475ed91ad68361930efa0dbd57b9fc8468efdcddef5ee9d16959b12158b959482fcddeb6c62533c96a776ba527f8901c07b76fd7a076f3c5e9622f1d4773926f5a0655665c9c4b28a5316ad78813af5b6f653341bad923d799d97aafe1cac180e132d9983fdb507191b0be66e6c72ad9e5d038d0278f8336ea1aa2deebea1affe067e235fccc999f1d3ad38e755e641d710a234d5c9c9dd477cb774e2f12b5b046ab78dc6f4bdd3686c39e4ca54f00bb2c133471d349ef7f65a3a7d084eef38fa79b57826803545b577ab1d5cd4313876e859b300deec7a48968c638da5494631c6f3edab80e9811657c874c8c32b6c366d1ac318fc366a3e440bbcb0c329406e9ebdc85f8611f66cca339862366511ecf41b3a8c7edc06414e371643eba311d01266ff4b11df83a3d44180877d9a0296c11f13869f13b07033f18fc647ed4e31c35138d318e9b8be23887cd4719a70326a28cdfb136fba28de110d3e9234e40784b263ed0c3b774b8a50be1484ce503537adfdbd64c705789447d5f3690158475a4f7ee87e2d802750ab8283581551b00ab86cc90abc20d1da340ca9957de6922fd9424efc9c6d5111b05ed59b69d678687b5e4de6d2d05dcd80bbfc1d5c48daa4affab797e5ab40df4804b1ca463ae9dfc63313c241c7dbc8d854a4eca23e01f47d127e7f7b65296a5416fda9885ce48d114f27ad026efb91f2c966c01f28737386b2f46b6cd9b5aea7454df5e5667119751ddea298583388f0dacad8b5acb5617864767bd9a7b2839dabdedf1fcbf571c5d93cca58823df18503499f90abea8a41d1be00cdd5060aaec07e5aff3b29b8753a1d5161b363b0878fb23a96b1f5ab3e12200cd09258de88faafefa07a1dc8da5274bd7de4110f7c30a51d2fb2c3809d791f9e2102ed408fb15689fb4997ff7088ae7ebc84215447c809b06f4ffb6c2f2cfc8c2f5552233e41bff26961d79b5c198b8fcd8497df459caaba1718ba04d8ff91aafa0d2aa989250b5e06946f6a31d7928241e5ecc089371372bdf7b02e7f32a58fa5486f0200000ad839c6ff834e5142b18cc22838d314c43b87b6de9a1e5e40ba1095793251e511e481905420ceae168631e63ec373bcdb77eb32101c0b00a83bafe57b28847ae0fb0db1ecd66b697b00d1ca9352d40dce5be33679f86ba977219b2eda62119463e564acd16cf14624fe3f2bd26974d84a5187d1d4fc8d06f08f8e27f48beae5388b2a7020e7b6556fef95e051b5933b149a0d546b3201c7681323be81316578f740261bd117978f35945f2e6f25aa8281531027ec8055b08f228dc6c5b38011393f3985e8cf0bd07ed155f22861301e8a7cd67e92cced9a8b08027b5edb3a63b456b1ccf116bbb2ab9206a96f62715c99ef28c867972f0e2cd1a01ea87dac4f69b95a4e6a2b57c027b0c9416fc6d7e2a4e584688aacee56781572438cbb441345628dc6e99b860fcb559f76409ca6bbc82968e67684db412b4341950b2a8e6f6b59501be182e72508635d73b2e28272e5a1f152b798383e11e4934de179933304c2f2d3b2659d001db58795039545785560496bbd01935842435ae57d9b971699d765a0484aec18a05c0f27ba9893a0c14c1d7f310cee030a118d0419d6ba9635739532d071febe662c2b50acb63b832c73a6e1506f12175fdbda28a96bd24e048732a9425b2123213382dfb501a9467e90689b6a2f70c82a9b85af1665df16e093c42ff51780c7ff757b017e7be0cf9973a806058bd09906a7ffba130816755a42f0fdd48150de93b36ca4041c04e54d65894183b52a9534aa4848e5e0614632f713c5f883a7ccb79657fd999297b1d42a38d179c123274dfcc9d13bbcc26db9831ededeaeb0c97c1bc09547945cb4146e5f9d60d6b983dfc8a7a9ad9c6debcdaead240f212f1984b53aaba6a7c6c1624b0d61f416ee44c0bc1e5db488ef60b4f53b900bcda9c82ce66d14891b676e43539f3a95ad70442fb1cff014d3c053c1667bb4008893c1043ffea4b03c3a4ebdcb1ae7f75b397b8bf867aac36c7cae813290a1e173f8a3bf7ffe3fc69f32bd1f1e0efc25a7bad9601a2c5ce53a457c2f79d3534c04d46cf4cd16bbc2b95d7368f5a7c11b6fbcf597a7f6e95055fd015d2a2a1c68e25e4a060795d9d2b3b993b28ee56b8be2188d78a2ac9dd8d54f4dc247a206fcddc6910bedbbd8665ea8d069516b0dfaa32e7ccaa0a0c17add8fedb38c31e5574715a2f3e5cd2832d355f7dae50d0a6fe9814f78248880b009502a99616a1c8c475a65d2b0f6ad1a0d3684fe5e0c5fb6441a5dda5c9b6346b44ed25b03de58c507f3956fb02ac241155413b78d0d3c0f54137643909510739be38a962f926084b0b01522aa35781a83e84f70f89677f2a26653a05c00575b437a875cf311d5514b00831e52ca8b7a7e598505f631f34c333338edecfebe6f041b98f69675900d45619e0269b59af076d2a3485ba4d461817d6f5c716868e49cc51e661222913bbcd2713f7763b5bcb35d7713bdc2646db90ab285cb49d58e5aeed345a6d8d59740439f44e12000be562fb0c51ea16103864b0a179417b7f7949ec7463f5640d5f4d5a46f81ae314a49b6bca2c31a354c42a3e1ec1eb8f1cc149064196c97426826f3047122386c8ebaaf8b2abbb9b236778e818dcb6d79cf5b3bd158e1e80ac7369c2acde02121e66d889bb7be48cd678ae8a74ecb95dcde35c1d79b8e9ccb35432b2ad91f07045573467ad7f6bd0936b64fca298f3e91b703e5074a8a992de7836cc6c9235a40107482430ad9c30719c7183867657827090ef041e2290862dabdd63d44248c50906dd67e1bd2bb2d5e25002ba742e268f4a900e0314357c40cb8913b571381fc5b3df696328c142a131ab8fa45a94a2e06a93bfb62a1c31714dee7f2c30031f1c889ad167f9aa77eacfb7303b641c1e57a1b65c02082c4a41ebbb02fb1b240d33cf4ecf9330ccb8609023314d789ac024100b06a85f524e074c7af2f84c1f6644a613ac59192b111fdd3ab27e6d468222ebb88ead33754e9dd5e975acebc83501d4790510c5ef5ecbc5c01dd8b081f87cd3730146bf76f8f94e478e2adc22ef43e823213a6cd307b97ca8f27336ec688c09898f59855d9d53167d7118ea7c356d6029f395455f767ed343c61f94a6751815244a56e945ca08a5d606478d8a00b81aa6d8c01226057b19ecd7e0381b2bb80b57855f16fe79bb445f0a5ec050662b53e1522b30cc8a75253683a8b40251212240641f46b50d8d2a2e7000be64e3df4a5cece9df2c6f5ed1b40f9741e9bf0763af845c6ea142b26f64d8ea85e596c55eab7d66cab97be7dc3cbb9044ecef97191a11df0f2ca08995148745ca9c4385b8e2dbca9bde60119695daccdc1246f7ffd5aaf27a24c2be76b791b52584e1934470149f30010f09fe0e00f453d288ef327b26c0a7e5f1c857efb4d94d776ebad3987702f822e07398285ffb5b781eef65b84f86675a0e42849e41dc86999d9925d2c5cda8d1eda336981159b1b8b8a179da2ece6a9f1290f50b49cb1173c955f33d11e91d0e3e28943b1f0f42cbd0a592abe87773e72133df574f8619a1c89cb34c779061c2b6d396951063a58faeaf4a0ddd84a8ef1e978953dddae162470416cd81456431b6131d1f41d866438bb57143570ce9d9d83f1a1d729fb8e56549f97a99eadfce35ee8c17d2d3419383a9119c8326a8e204dc65d642db2842ffd02244b8b651cf1ef7c042fe1416213ede84a7d3fd58a34257993e65fb05058238c16edd69530a56721f77f3385c749645f91037c1d51ea4cbd0c27da745e815f760621c79649dcdc05437ab246bc12ff154389144bd8707ade87311ed09bbbc98955fcfad7cd0c43e20062024b9416e6f0acb64c7f670616056da7181d022198e4841bd8a07c8f1b13fe5e9b3089902f3873d5e10b410d4efe537cc701fbca11cf5a42d552862bbb01d4cb4ff8a473efc4f37f20348616f062f427ea5e44ca8f813652e178efe9c73014bdebb7a8b22c2a1af23cf21a252d170673f7cb2a2037c509eae537495cec997b8c7edd2d16956a2210fa6c7e9eacfd3ac9f70ffc8c282c0d2c645705bcea406be3072d4e8a7752f1d74e141ee3ab1d41333ef42d2f7c1625d1dd6041dee00d1b7aea1224820e3b32325f33028ccac4b2ee4e91a8dcd78c8763ef2de4d7731917c87272cd6e2868e0bc4c90d8fc3dd01d8143f2caa5438fa8242eff2054a7cb51648065ead0bb497add9b95885c15c4d1ecdd954957c85e861cba57e7dfdd914f1f03c507c39344f0215618a639dc9b663e7e638c5366fceef2bddf74278eeb92ba3c30eecc8afa3d8ee09cb4bc4c4968fafb5654e342be5b0e62f69bab429513efe5413fe7681cb32827767490d6e1bb4946aca02eda3b0efbbc2aa62020b877e322065295ee049574d59b71f01b0e4d8e4ff1c58b8ef4ecaf3a137d5c2aeaac69079bff7181be9d4a3b10aa9e9e5c245092e995296b0770f08b8f08a52f949ed155e8f3b876f5e8457e1de9614c2a066df1fa1ef96f2dd49730394081a97d128ab493469c6c6cd68f95df87944341cd1e17046509f2eb90d3761085314a873d64498b8dc3c3eba1fa51b6ad62b1c6315ce93f0d2f9c1d8f6160bbc6801066ed765a7045f4a33ae9a04ae223c9778396d85d39aa8fc8f3b6c51a84a1173a8c5abeb7a376862b07b54083d38c12097276a0ba738ab799b4076e553b0490cf160b291abe0af05ce83150c00a49c66662956110b6a575e14e51ee5952ecacbca28ef5acf2445e1ae49191e99b17c9639b26abeb59be0b9cc1d79fe50bd657dfa19807bd6ffa6e98e199ff7a6e23feda38ba925388da01aedd6000de4b65ea5db78ad7e3b27fa438baedbd98c7ccc1863aa30369a4c9f14b736d474e9f80a6c45d3e88b85abb0eaa0bceb94760f6fa04a6b064644cf855e6577862529673829b93032b55c5c65e25977f71f11d3f87655398266a44134e89f486061d4e6b408e15a97bab1c77209d0323f04d9c9d711ba1d28008d7804f88ef081cc5c5841292bc88ddf8a6d897de82a55f938b898e4a515b42f7970f13ff260b8e539a54ecfa624ea4a8c2ec1534ec00cfbd09c723c60ab8de78e3f2d0e39317957190f8de478e0b6d2a739bee858f6f55d65300ce598db0f2b541114ff57c6bb4a61d4007d7bac70f678900b2ef119535c1592b810df74551fe4aa2e22b302ca22d3b5c7c64d17fb97a317faa0ab0e3587582cc04aa945e7a3a906a9243ab844fe42ffb889d037c34e5f497a385d6e4461b9afaae8bf03625d946b4e8aa4f1c1736b5cd6de193aa37a06ae7e4f5c934186d6bcd21895c6bd114294a04c6bf2d0b64b52f237c668171c86b859cdc1207f557231b2e8f24c3710b2e2ca28253c1e8643532fe22b5a64ac7671d4384b199835371df124603c321bb9a00ad91e2655a627c5ba5fd48a7f87b7b1eee12865829ee8d0cfcb94932cb5cbc4d820242f05034aa281295ae89aa6174c96c4869bc8391001f4e9028a212ca2fd440d2574283f81a06cda854a3fd6a45863fabb0e70a4e8f63828c38ad9b8391e11c1ad01ea23819041664b882e1f51e8dcf8a4afeaf531dae637ab75356e4ceaa6c705292331f106ebd5b853c966640283025b39ce808ae5734d9d29b03e95195b82d591f7d515650ebb0e1f82b9a37bd681f5caf8bc50627ae17858bea5673caea7b7ff0213cb2203bef568916c4145fca543c8bbb4bff756573a99c92e6eed047862fcca742863e201aefd0b71e9d5ebdd50e590cacc536246d78c0dd10aa343682cd0bf630f3a1f52b861fe5243fde480513a625ff32478c1f34864c019f44134aec444af7aa6dabcf0a3a41b008f34c2ca79c383309258b8603892617381581a39dc012f028f83b0fd003bdec556b302924ee6ce0e0c4912a56da6d3151d270331e81a19de5fd1fd241383afa15c8b6ccfd3a979bc21021ad84d44aaa5e43d345e8bd8c51fd861a8b8cfb955cd8019eff9ecd5cbde8d28f2432054903e8a2dc7d3a20062e60bd31c6ce93da7dac27c1d4e8235d6dd2a650937b43d312b0a064b87d4e5809f4a6a235575890e0b8530908a0fbd9616a3ce558a20c3fa9bdc3ac38784b95a8377b7fcc0b1501d5715f08834af2f4177aef75a8a7a6e9d4e999475f9ed3e18fc345f4b43d0d923da3359dee309687d59eab6faafa54ccf82dc6e575789cd6e035baadb1b42f55fdf60ec426d574a6b9691310f096ce92c87d966323807033c1ccbd677a9d491009243c988281a73ba548c9609d22c65424c45435bff0d989f540841916cda246460d202380a1919436e0da079604bf3a67c82e982ae8668387d94ade5d82c440f864644ee3f06b6946999f1f830a85f4b0d8d456e8e8519483dca40d458daf467afa592b9854ecaa52c0db85ceb342894d29827665033a127c96e1070b6d56b69a6e222f2fcc36bdcfe5f7a2d0d026e21fca342efa2596b412a4818ee16bd0a67c250bbcdc485a9d7d249352b2fdb8c4307c090bda4a12bfd58d10793ae9089907a2db5bafe542c5a238b5e4b8b57284b557d3b46e61e6122c3d8f9d72ce56a50522cfb72eb31298e8be94cdd9f1c6811b102582438f2fda8adc7627a887a2d95b63046462401a9b3472b0b33839eda0a8e20596741a71ebe0e1ac1fac2d5ad60cc709d39ae031341043210860932362768b05bb263280cc7b5b4bc350f5d690f8ac2b2bad43431c9f4985f83ebaf95aea38e042628a9e23bc56b69919b90b36a192dcc5cc4b72cf26f44591a734507afb999696c1611801988be336e15ca8c277bc89ced923ef844e874c34491e1156c62774bcab6c6cf1be9e2098cfe13381776fa438647c44aa70452d48b8289d7d2d29f0c210834eb5ab92fadd2decb575ab9416e6cc825a58b326a24d987d1336e7a63ab561f7d391af95b458348f078d23c6f75994f02afa592bcc21639bbd6d7502caabb62e81181df05e8c76b8c406ea9e56aed7758428b9071d52499569c702970c4b6bfdc1ade2d2d351848f93a06b0171ef263f844249f26df0129d24623589473ec006bfb02122e1d20b7d848d31cfb89bf8d4d7f507fb7b4990f90847d65e9146fc273e0b6cd9781d02d358aa9c0a1a81dce9216f25a7ba582b390079332d1a619c510734b998d3b915fe6625e83b5b6e35ba61d07ad6d496de92b75ffb8d96f10ab7766e596cefd76fbe0b7a52f785dfc39ae097c2cdc36863752e596facc62c38c3b7652bbd9109afbec6294cd17bad27e30df7dd9087d08bd2809766a9781c985431144c3beaae0ecfd899558d04964284eebed33696705aa8713545453ca70875937f29c986dfa2be368165060ddfc17f6462ddda3bcf877f1b72f5a899642f7fbe1cf5ebb61be39852e2d5b0763e68193ee211db7b0923c695736c1bd76c765062d5b7471dfe1cfba40a3244a223a98e721812c5d63c6c4f0b51b3dec2ce286f972517267338c1f008916936fb9a114beafc4a764ce4187f19b741573feabab72defcf8bd89e0546fe8f244be76b9f14bd67ab6e80277edae8e471d49f2b51b5a91703efca7f59c4d1ad71661a98e0f68e9e91640f5b5eb0d4f70fc2763e9c14ff13bed361059f9f0b9555d859066488a53a6bedaf832abbd80844ec85ac546dcab7edb7c56ad7cccba354f43c581be29edab0d5985a1bc578bc0237d821845945c63d39ce3dc69a52e280b13b213bc5651607a7cb12f7a32b53c56a5bd8eb00729893b2355982193e611345e6c8fc79dd804e4501fd62629099ed8416b5d4145aea1a6cae02c4c7bf10dbb1a26c7fe3535b94dd3eaef880e85710d0ad18977298844710ad23a1349dc3a2d3dc8713bc065f2a7e6e8652e8e172d7bc05342f6ec5e7cd90e459325f38878db787b5b60097be028983bae5b668db448b5071198cb42617b1e2118160eaeedea2378bbe6c1664a672b4ffdfedfd992a5bdc39be69242157af1598fbe35ebc74bdef2cf3d749c636240cb641500480af28496052ff4b1172f86897ef25f580c86a3fa9a581fb5219ae640464c30e7e32a65eb0b266c723c2289c3afddca4630119761b941e5f4a7ab28e26b21a95843e010c251556bb7fff0f0258de703b56d12d3356b1ef4993fa709ab86edec48b9bcc5d4d057054c2327e6bc03514929e582116002356069ac3ec2baa620b38d60ab49f6dccfb04a94e8174d481cdaff0d5b900c199462d9dba5468567f23907f7b7d90980e659616c3e7110aa2e13ccb9224080bac0cda9ec6dd1a630cff397451e5cf17748f2ea16d8e93e4cf839bf015b5d504f3b57e3785e0fb1bbf026951511a0c6d373d14dc022c36f3fdb96c8bce069210b12ef3572392e6f305872830f4fce3c06f1d8e2de288f12ac85477616158c4e7d8cc875f7d99674de1ae1c6883e28207431b9577824cad219d27866e8ee06aada1114bd4ad599ec811730a494370c2f18187e4a1fb0a684a59aa2ae7e871333a6ff64f5db8142116dad6e9d7b0be7e761b6054d6938424bd110befee6743909b9d301a14e4982b2d299ac459679a77569f5c64c0f5f23e935398907b966c34589248cc1c4b68db744ca0c683da1b585fc8648507abc7e07e790a70f0f54d986f0c89dbdbd74d4dbeb9260ef7b9e649f26d51fa8343f0af2c2d79a57e2f18327a7ea02438ec04ddf3de23ec7b76393097aeeded9bde3c468cb1a74ba848e97514248481eb2d3a89136847abdb47246787202ce89bb36360167353b42bda449debd3e2a02d10d61a7f55f56898e2641567cf5581efe94fee0bbaff7332ea39a81cdcd4210159fc55d57f8daaae082bb3ca6a7c2bb7c2fc561a0bc08905371c10fc0a430ad3f3f2497a29ef9f4d7f1e835ad9ff31650019241f29b9cb7fe905654833828a12863554c6c2cefe931dd02ab84984572a08e010af963f6c2dd5c4d49603cda4036b3fb1d40d6291183a5991e61285b93ffc18c5cc18e83abeb7c3d12cb103ee50c4b22b23ae0c833ffb2a3d3ce0764163db187164575d4c90a675ad1d31b2e6e2643e87179bedd927a74171c32be03fb437338bd801048e9da72f5af318b52279e94928413f97ddaced1089825cc552de32e34409ae5fba6020d1e88769596febdb1aec2a686e7553ac1aa42d22e6f3c6c7e7618424fd0f4353ab9191d878a274c2763d6d121870ca81bb64cd877ce656fa778b6a0044dce5c9a507a19d217ed706d99e25f51ca25260c659942f01c0d2866adfa9e99b275a70229204292c62dd532b483b644d0dd8c5f1804246cdcbe99980870f97afaa32815b7b0a4fbb0948a048d59f35fdf2a3db0e97cf1ba3c5ad23ea4c8418521bb9da5c3a612c4544e6cd2c47373df9e5b10dcc44987fdc8709c25e789132af86f8ff93935569088e364e582c7e175f18091591c2ef1557984358e9ed6560523b3c424c42c313b2968116bdc9f82c181dd0eeaa4c0199bc74b4bbabfa9dcdf01b8340b9d023926e64dd68569611732a5155561cd73223debbbae11855846c48855fde0d0863224c71c9f4e18694371d485523233a717b3957ac2d52bd11b2823f026b023c7893628cb716b0fc4f20d11adf14c8c1aab80c9c066731ffb8e22a61da26d105e4bc1a73add08d7233e7812d94632946939a321510b1cd19ba45b570df10f41dfc0f0904211fed88f1bb08514a2c4a1b57821f78307e08262753c74bccf67e934c076e593fd001600931aef5127cb60beb42bcbef9e36035ac2553691e54e44c7668427c996a4d68a2296440825dd052ae9214579c6906c774b86bad5d3eda908ac4443080f013ed0efebe7d0f20f54681b6e52153cc7692b28db82fb38d4e8b168b90aa10274668274a3e4c9cf59a91f20f891111ada7c318bbfa86feeb7ffaa5db2b0dbfd328c3d453f92a63715ce6a03dc0a2c6e4fa366e1428298a75b0046b35117d6a73d59b95b1e9a6463eabe9150388ad4f16511ee80846461ae56d58a1dd9ba333cd7e5204c7637bc02eb81d86e5292af50472b13cd10e0bcc3b87ee3cf9f8f2884d9ca98603dde60c278573507462a23a862aa26ac798f6d9e27d84026ad1ac73196fdbe0a66a3a48ea2c23b40b306053da06b438a795b2e22b13d111ea2b0a75e17f9d8994e62d3358f1adf9317da0a9a2830d85aaa52fa737b771b77c95efe3cc827d0c9711e3f3bff9bc584fcffcc5e5a14fe58a8b6a27fbe07911bfe23d8875fceacd768ae3ae8cfcef0c9a6427dc0c1bacc2810dfe2d954b45f4cf070cb38d301e0cfa917edcf96c33e8af1aa9e60261a5f5513fcb51cd73a7290557daeacb93129a83ea1c1c176b49c2dcce70dc28bd6eab1b06ef86b5cdd7d21a9105dbe59aefcbd505fbfb9a64c38ad75cbee79fb302ef4af528168d8a056d1c8e55294bf376af7781f1111f7db507ac3a284e0aaa2639e54e3e2bd9a28f4b680ef4ce101a7bf4d876fd6a3b4ff5f047ce7f2c40b7d7714d75c62de0ecc84f21b1deaf8795cb6963b34738c8007887a4ce1828e920bb6b28b885083261f6cf38901fa3514d4294a8de561fb88b21605a1ae047f046504fa5c9f4956a98e9e4179399dea9170b3b7a6c9ae6faa0eb4f998a7dc4c4386a06213141f5b6252be7f0e401b0563039a79c3d6d42bf6cbd334366771665bcf28e6abc051c873243d283d900eb3da8d243d0d285cc220af3eabc465e415b295542745fdcd42b7113cb4c936e2359061ca2e813815d33a04502792ab953e0962daeb32cc3ee6814498aff7b5af7686ff4f3b1a3bc1386daa1b05408597f22a2c0a59c0da0b20cf1456ba32eb7fd850bb64429b8671c19dfdce0b159b0950474e02685eac871d52d60e33d25a7d2cb369587c1b8d147bec2c2b7d6d0e71b45037be9d392df196ccf839e021b3abcdba538efac37574ac56376da4629b5196d44b840e7557bf764b94546cd523fbc0544af4759a7561d8fa651db72c3bd16c59028ca0a5b51b213c696c97eb692e977438259f5cef678e104a09d48cb0a9512e8fe70d26130aa278ffff1906f240b241d6703ad69506441c964d3d63e490fae1aaf418246b5d6764b17e262c563be67588fa57d9f22903056cc6a865af857d228781238b5732647af0635ed133121f710d8b1e1616f1fea05b5ff0112844c18472c262381e6d3661396797ea3f225451fb43f73f76755044bd0180ec40424795c22551bb25b4728b4fc5b176cc20cf341579e4f3153f4cffee1ea18875d76234fa77ee231b20ca8eb8c36bcca8993c5384c72c9ae54f3f83e9d30e3059d8d0f2da08f454217337caec8fa1c0af17b1b3c47e47bd2986b4880332fd4fae05918cca01e12020cac814a069f98fe2e14da14ddfea6be27a282d2bc60671439a12306fd9945fc5a1c31ae4c66049c883bec70a059a42442349cdb4bb406a32d5ec0fe7cbd1d82d8652a85017cee5b0c844dd572bff36eb9b07b04210660524e1ecd90f3d082c8eed4eea446a43ece7e9d024b602f02b689f5a72874ea86f08be1e4a1c85bd662e606559fd059a67942757672b019e518a9157a564b2e9022c68f165229778159249888aa85492e0c651613ca1f4fd4d4e2ec6f48e61e49d8699a21e3aff671e09259785f1689638abe20360f73eb44b4d18831c3298081dee1fcfd80d7309257125dc9c9871bff5c7959ce2d6375346f772429e61f7a7dd7ed8f6f9bf322a9f5e7ab3f67320fcf775429a75af88eb6fdefc3a0e086964d250f770c6505361cc145828dc8e0fc5fec74b8f0859c4b239aafb87e0cef567b8600d7ae36d3ae2f74821f53dfbae5b077120a0af8f74231ef7ef79818a4264297fe8aa8e4fa1822189f2654cd5909041120c3f0b515f6c59cfb856acbdca8e6421c1446c682258d7dd6c70569d82012d604149ca163afbd0582544f3368f25ce6717d3e98a22ef6a52911b64e4c4e65191393914a2bc77c6c2e88e880cf1cd1ceecf5df5d12cfe872aa65fcd8b45d67f33bcf53aea9ff11ed70a6c47fc892bd1fdf370a25ab1666cad6a18d694cc60dd823cb9b37fcc3aaa01301e8f40617e7ab5905b6d0b346442701d64dc254036a1d675768915d0bdbf9a316e89bc063124ba500148623c7f1dc1e7fa31a024444518f2453ec60d3e3718697336de7eef26bdbcd3d18b1dc0d92bd5c72e5e26a790f2641756b7f3ef7c43c3d3eb50475e436ae586e0f0c17e01c349d2e84bbfbcce17fa253f7a3d9f13f87231e3377760473f72ad62a109a4c05a6965950b1857fc1f1c83ab5682ca5d166baf8cf817fcee050ef138974d803462b2f21406df191d06ef7bc3749947f9d3a01bead17444ec79db2951132f0c5cae574d1bf7562fc0ff91fc9f46552714fa8b8530f9d51d03025e9a9112819c65a12992cbf74f5a116684011bd57ce249e6250f13399fcd415d054f65d2346431a0ae7eaf29f91f70ad98e174f77c370d082635ead62ab7188257e43100a73f3761e3fd42a6db23dde509ea58c1cc45014da470da2d0cfd42642ac4cea32e09582e7476589d3c9b1f05ae45b34226b20247ca36c1b3684e1f960d5598fef29cd1e446bbd29e8693313be27f27c7dc851e607ccfe2a83523e2640fc462e8718c46be61a3a0f8eac4d1cf3cac9f1b7d42b20b9dcd69114c16ea75c59e849afdb5f8ac1454e8984b352077f834538ebdd607bad33243dc43627fd56e4b95fef9b0db5012507c70d4cd05c4b0644a4a2989f36c2786bf2e7138ef1d9f4acfd8cd64a5f7c07e0bbba1e3cd2d432db1a7919948e58ac4d02d7f973cb3a1da68bdf339c2822baa3b5542f29b281ef37297f4db23b96bd7f6ca253a28f15af26e302384bfca4039fa89ca0362ea5ab4ed1a082d239a53bca1aa00f8bbc846e07ad0b2223ea04bd492606daa0e0240ac4a45d694f4cff2b98c29b6d5777d49b35f7d8b4248d7533573d2f856077ed7e2af460d0d3f46655d94a4bc8c6e102ff253909429e607c4946d46bf7b2eb1ef718a245b32941e8e94ebaf2d86412c561549ced05ad1a67b47f8799f211515805580d41a384494165e480f052d128f186b930d5c0697d7ac9be852df6098e1fe40d54a8e06b71681d5dd886ed7821f873e609aa2c8d6dc5fee11deac1da18ddefce5d5984d1860fa799985e07a01b7d5d3632c24009863d405ef8b19de4e9214126714f04073f0dab82a5e32d9c084187d16e93db35a6c577e6f1ca96199fa4f209b2dd548e1e7412d2146920937f044ec4e07567aa7f170d3d22382ff2cb0c841bebdf565491e5c3e4421ab5ffd9640d927d10bb14b2a31f8a827f5e29a6a8dbc11381fe26e2651974cd0df383d80b19cb1e922e75cf65dd973476902e6843d9a6766f74ea1f4d0ff67a0a2348c8e10c9f6037d12a087eece0583e9ba7d97d7ec421c97211133364fad0348a38e85054c3ac017f01f4bc7093db2a8828605096473f38d6736e1cf69f781022950f103021495c8e950a97ca7da8bcc93194914006145135a7fbbe28cb2b1c6a0fd5da15899d43113c7d6c641caac053627418fba7954222cfa59f6e87d5edc9b4919c4136c99b8b2c432ccba2a3bf5d626bbbed4d532921763e69659a7171cf8fae2cb30a86458c3eb4fe7651695404e1044dcd55413712cfe80b9d97ab622d5965abee04fa85f99e1ae92af0746ff7b86e2167fafbf18deaadfbc82c41a4211d36c6d079c998b754858cd0d94cdbae933fcae35b5532c2766a5fc14123c0e23cd344c5a28c5f74d683e429cbfe146fca72473a4388da00f95a8a98f74eb5c090f0b6f3b1a4ba2df4f8b8c2c17539957a12bb6be19f80813814b6508515a10a6a00ba0f23644520630541ceeec537f0c2bb2669c598a0f8008cc6aecbcba4d89306cb2a6885e62c75c4d7361f1957ab56c9e8eb042b608b15de00b86a0bfd73050acf7d2e8d23a3be037aee778f5e2ae2a892df36fcd5a41251ef71667ecd336424b48d06fb8f00fa88966c72610813fd84b9c03fff437893241295f87cda2e2803cbd215b29fd23bcd54e3ff86b6a012a5998524bcf9673fabd7a5aae3df6ed660978fca7543b86e35570a1211b938722d17f31f161e344f7be2b522f6c6620ff61e111323fe61d13dee240329e9f7b7576ed01a560086d416ec6f5cc404ce3768d021a1458370405d6d7ff70c13c3d60ba41f21a17de241905acd18b5d28e63fadd37509c18b8361e0fc971be6ed51ee4de2a6adb2a2afacaa43e32933443c6928a24f76eac7fa547232c6828ad01ca8e80e4dfc675085d223c48a0ba7199ff69bdec89f5ad0e734fa032d2b8a4dc63ae16a07add9acf81beda718f5de5487aa84ccde4e300809a0d1f502179566e114c13fdec26cd4eed858387b87b4ad1901382d15db4d30314effa6c63459c8d016314ba4c9ffcdd26cb806415e5efefd32463e7c4d56d0acbe6170f72789e5acbedb8f6d4561fde20f7bb5120225eb4b2ac98d1ba22e7a90dad3d3d012b4daa3699a55bda8db8fddf45e7d4a584bbc111713090f8e830636c6e6007df4c9828cadd93ca2848c9240ae6709518c48bd65148e0e21c654bf6d6751cf23241306ba2283aae3099e9415991affdabf67b1e4bd88495dec3cbc3eb13fd6f2e242ecc56f4e62048bec880174b23040e8e7b52141424f8cb88d5d1f91890c61dbfc4f8d69d9208fbe662b36b0db2dda30a232f2e805c2fd1feba65183998d5b69910e7db7885b7c9de13b9f91f4e3a33b8be723a2d58e18cdc11a54ee506fd83a6c76e1f497e743972d0d78c466c909ee15decb55e24dd4f9d6ca77830885ef1535f79e58d1cfc4e5440338e1fb18c03cdbc24718aee180b2290b545a5b7cedd025f79b955738833f12a7a4a9b7dbbf0996fcb51a0072002eab143f4ba79d44c797c4284ad984e5da2828c9747a94b8d9fc8ee3e5f07f4fc5293bd3d97d39bdc4d71f1708897a389887d5f4f8cc966c60110f3be08b06774fc82b8369bfc9ed7d9a4c20fa5a76290480608137554c86f431f5d4c710df1ee11786d1548451a1d97af93370f81c654be5a84b7c1e085404c91069f03068cd4df29920becf0654c8be5f06ce91337a2b03bf730032d78d6d11c00f93824d5f44de8e2eac15a5ebe40dce76903bb7913071d7ee514f80787e23aa4813d738a1b724079502a8f57339b86febc1ebb29565783951a3f898268e0e1fc098338b924b1ae91dd58cdb9dd24140a0494132a3e0518037ad2631542809e9141cc151dc7e9989c8320d0bccaa07c71990eee5294a0a58d2deef7fc68b66f3876c969c80c55cc86675f96576ad7377abb704a786dc3cfb409db9198001e8b2dc1395a7188d39ab6e5693af8f656f77ef9334ecee14bbf98be763007444de1aa26218b5af1350f23c70f5ab44bfabeef23518cff471684800eef57b22209a094032a073f8a7892275ff77ee27416b325b34dec52a61df73b8b954eda104e4a09d85b08adbde6a01e51375f952c66edc13cffce7991a35469eb33e15edbb5e273d9fca93e3c7d859f7b5c58c18339e14b66d949d257a98f44b6e97b124f5b035864232c8a5c48731f9d73fc45de54e6be314ce1f0d98212816d7bcfa81a6838960f0e3de3fcf7563149dee9a0f335f005e2cd9fd7a6368b80820ce0c09bfa28d25173fbfd8de8224902001022b1c096c67f1e2d807a5a59ed21918470514436ceea27d25bb17f600122e8d7a8628881becc21a9e341db577886a71d17e25727141d4caf76f7d65726d131b2b70d5a765a2a407da2ffb1224b80209d7be72ea4e86636996e712dcd912251710a08cb2a54acdcbe5c45c3146c89eae0462464bc683bb77bb339d89af791ec91680700248df16ffc054722649abff22667f510b3498b73517a251e358bec101146dbe419891f6aea7c261e17d4830d4056b8f7fc4bcd9e2d1cc91d3f1e664ed4ffd613409bf85f39b2e483755f0b0cc922a8656bdc82e374ba54717479f3be3e88f79419d05332ed69910ee2d94daa2dffd3648bbf5793992884db861b7d9835508bd53018957d72c30666e817276315f45c354a8741f6206020cf723f374e9d4ef430ade860f7a5f5ad8f0fb9ce1f0b37253fa6bbb1ca80429346624c6181e14ef307457c6ee03982aaf180b6fb02628c2a70f0e7f124093b346cf84afd7b7d15ad44754493c7ee1fd60f5968051bbb89225b7b6a173955dc1d15f601ccdc87e55bff853a9961cacf9d9889842000aec8ce84b89e901912b38e217b56064341c0d375e49d00495049389581dfbda17020f4403abec0cceb74f960faa1030bcb86653dbd154838384120e4cb211a315ca1da642678a328c351fe0cc6a3b8df7b70871ae2c090f72da838fc4e29daa5e2adad4eee1fafd3eed26782dec9fbc1c01360ca751f7da202e41204858f4f928c55e34bca9a9ff1b408063fbd7044e34ef1491dc0fad3442c7799f0441951bb9d1e79eedcdfe65c1d93829979fb00a2cbc2b9f227f601764a231b8497b79e62285203a2f06b03cfb113ae089ee2eecc2dca0749f705f259e3c9801c03ad5255ab772994a34db5b464b7feb53540abb52ae2abc7fabfa90af04e924b1eac17a6c6e996d6315ec8ebba72a96abaeffc0bf5f1c892f058e1b412e2ecc20c9dfb7cc439099f98f6514e4f4a0d4f4d3720e8e5c7583af8b92da7d4c28800415297d73a5baae81cef339297c4c482b0471e8a7ee74cc10efec988b1b7783b7cb7167eca1dc6f27173e516cbcfc1d4433e7471f00d2bf236e497d28ecfe87ddee8129ebebff21e94d20d9fc29607f1de89f9df991de8aac71b7c872a45fda9c9407117ee36fe119687d862ba9b1d5cd552073247e367b21658ef3ead6dd60b3de67334edbec630815ed6ced8ff2ad3afd2f646a235e470b828ce7276c7f044f6bc9a6b84582232c701907f9cfc2ad37066c5e3ea64ca61671e20fab290a930c08aa0c5acb4061acdb2944d379b1ff41235185708001a4d050ea34d711362548e0881b2e50c7a423e71c09267cbbfde84c5b38319e17b6237ac14f175557bd5c7ffa71e5a7aceaed77700cce76242bab5c676a6bb759ed6c2c217fccdf01168e92b448aa265d09e82ee39589f93e00388ad65712d1d8fda697429a753b99e244e0e64d97ebc010b0d65dfb9b85d5c0bad261d761143fb6633a66edd4bd4e72e16512dbf4195af84eadb689714ea480baae261218ac8f4791479be0f7bacd9aca58f654af31bda89d5e79a4645638deef0d46eb8d0f0d21445eb45b3d815beaef8be9a1b0f5114a6c7ceab2a735a7eed1f62a02456b5aaebfced217d515a55f980c218ecadf0771890e24618b627a91d9d75eae61f5bf3f487bd9a68d0119864d6fe7eefe449fd07394187340433baf4e262ce571ba5d1852e0491b330f8a907648192e31c09fda2dae4d1b24d63cf666c0774698a4b9aafd84fff2670f83dd1992669d6cc5443f993745981992e837d2c59fe661ef77b94f2025f8c2f449957123c343a567e8275304ebe58d36a0c69e7c9070d14c0edb5db66c2e8a549ff8db1a64d67d32d18c82b8ccbd3b7597deb4ea29589208ecaaad40c30f167aace242bc8356704d0d3b775a66ecd640ff0f94fd772fb7fd0beb742561a158e79f6586b329da65b2e6f8e2102e6b64f2d4d5a6605184b6be2b857ea6e45515d17344780f2ea291b471d4b8c05ae21533cf0699b1b030e3892e7596b370127ed65d1ebf80fe47fc3baaef240a61af0bd5131836d4de92007311dd6b0cb10d92e2b05c6c943fcae9792a3e70d58eab19a89e206086f13f808a963fd3f4ada42b0cc3d50066e66b9a1393f89741df8e30251811d7215044dc45c23f780aa6d0c4271463108150c3c69aad4a97618cbe9917e2e82e29d2f57703b902888240ea38a2ab6abcfceb1984c2c3625d1ea8283a7c194a17a71319a5cd7efb313665cac0baa5fc91aac3dd8906db85b5084c9bba32f91ae8921a929ed9eb0a5f3470e0242f70a5abdd26017ede3c92ce3870252a361206324aeb1603daf016464270e5a0c8b9f63b46725cbd9ce8b20bcf317924ecf098a7fbb47c765ac9d745c64ac719691f13b32c1e50b8493f0b24ea616017063289b4344001c61573ead0ba550a9f3310d8c5a2ab64a7fc41ef9f1d2f269c1ceb2f47302cad0d9939db26a11db7cd4ca17bea6c28ee1bfa0a2cd88e1ed868013268fcd697f818a5f5b361957df573f7a935fa82023ac9e30c2c5d218edc72b9863e89fa0a083c30e2846fce84d59ca5aeed217e7ae524b29c0eb6af3b07a81366c090f614e197e19f5f47237f056f84a596ac13d9e6e307c9b1954be0bfcc1a78c5a78de4da327023463d71707929592a3d35143dc849972fc9dd6017533939a40d740270a5321566e666cc20f3532a86a8200e8cbc4babbeceb300d2434f3c525cc41fa8d49d5064c0815a94e247a2b4cc28dbded8ea078e2ea85a44507228d2fe1a7fd862c173662ae4a3b5b1f9d05276d2abd118c9f3848b9193bf9cbbbc1997eed5ba98bd924990a4a56048246e057505cf84a3684f9bd661338ea81fec30d50be4ccf1b36f4ba3841d3285d691a8178652020dc3006a87a16c1088617c3d62f86a96920e045a78883c16538e7448b35abbdc17d147551c2bd4022f84e92149234976e610d5ae032ef3148384ff9196dd9ec7457b3b5cda904206ac3bc376842a52764c156d850405557d43ea0b1b5b3a1940610b82a9c05e2ee4daab7884d18b60617ed010742fc479c49ac338c729c19c86f0517e1e3c68d4faf08cbec1eec372b136de459b61a525901833899c14ccf27b5705303f6f49e79e94f740dde241973179f479cd351bb701a8cf044bc2f9bf57f468806555b38c9e55eefd437acc8b1cd9b2ecfd9ba2f46f77fa7378e218256ad2e9ad40f509430220ecc6ab6f675cd1c28fef0e8c99d5f63dfc291527724786d1cac26b68ba629e917a7cdb7398a754632fe540b07d1d490c233f4a20896faedcd07d0e69565cc281962f3e6b05486000cec5d4132e809b3e759b547e0a005557aeb09d5e87727d812a797aac86953d71ecacf29730dc3cb24f408c9bb6970f168cdd9e63c0969c80babcb1e808da469069c6a5e1ee015987f04abd7417df1633afc9d0df47f9e563783d0d4e69ff43f36613fee40eaa1f8b5649b756673c59707e316f51fd378694391a746a22c72c401ba6b2445bab824f00f69dc9de8e7b8ba115d80e8f4029d8d8c6a7ecc94daf5924761f0fc00921fd6dd492ec52d21e85205c2dfda72ed09acab46db2422a94711989b394dae81c2e604633e1028de65e01a12fdd6b5e2e4f2c1e58e22c0304c45b9a9490e12b43381a32a25b4f34cc87ceed2621fb45923420193481fbd050ac93eda9982fd0fcce1b332c88041fd41e88859f04520e6bc78b63120629a0e3a5f9ed1702587b00071480242e44a007e911d3056e271bcafd03cb94146bba9c5ded8b29711af054d402e023feff6bb498ca1324c01bc223e859a988b3e21f1d9ad1bd8a7b8b82593240f0464641a6a586b9d2d4c93a2f47752ace9e2ad5b0298e33c4bf96f208045c00e3e8b63b6ea41efe851070f99b65e375e9d0f4975f3bd4d22baf4f2e1f8bda2371964bf0cdb724cd7a8c4a1a5157c2e8254d72d92c7b6adb48d5ce64a6f21b335541930abb681f9529118196047276f3a876e1b9c2a50912d2f3ab3471ccc30762bf0c3f0c9cfb52a57878ddcf2494813ccbfb0fcfc1fef336feced1abf5a1acf791fd69948d8f9c2dfaa41e621726306ce04a8e5b16e43cfd1aace7fd45730f14d324417c7c40fcee22240308ecd8c065f5dab86ab83b645a56f5666d209469086fa570ca3eb2e3ab4c947d69dd44ed13fa55aecd71a692c978642628c3b5424bba500ffcf28cb721fcff08fe8c573dd97164dfcc3048207f66e872e0d6b2fc8e013d789631e3505a5ba684311c1439bdbc2c4ad852b4cc0ce91fe6302d9329321aaebd480e4faf2539b7f11a569396f56aee7c6a8825501af023694dede57f995809fcfac82c9ca21edffe009a8ea344574f778000fa28f429778e8ced69fc830e0b0c73b760dd1909ec36ce2e9856ab43eb38f6d954f15d567fa7b62bf8622c57871d73f23d0a647420e548eed81849c1b1815b40fbdecaf095d57d5956ed28a159c5497790de88b69f78b51bc63034b15515f94128bc9133b3c687123cfad3f80103710d22be745193d1e32acfe6803fbf7d014219cfea985683d69d57b2b90abc55eb7ef64214f3155b37f253138535a6e2a7c2e8a22f6e22f4fa1659e4be99dbf4e97225acc60944b48b37ea7e55953eea273ca895f7b1b6fe2176ea71d73fd8529e6799e0e9b1937d4654e77bf1dd2e18d7f2b3ef644b23517bb34cad048aa2ba3d27faa725d5ba1fa008fdb272f77913b6f43a789210ca5c7980969eeebc18de0cb23369fe57f1ef99ede6ccbd342022652a159e1211bd0fbf10c931997fe18decac6bde0979fbf17a6c94675e586483a0fcdd535dde3bca7a19a0c9dddffb0617927b7ff28a6f619c4388ad19549063376292146df6f4203f8031c9897794b1381e44a822f180722c2781f40aeb4e61759582f42636667af96682ee9ad994f73475cd5a95230fe502488d9ecf5853416b1eb223e5b5d959778c7e3e7c049787f32f3d2955269cc210dc5a7b5ce683118566106985882e5bd62a6efca0e2f27b229e0b0e75508d46c6293ba9b2d79b6894ecc5a7b1954650a5cf53c4c309a3cee3c3df3099ebd80441bf4bcb69a824e0bc60c9bdfff28e6173ab5da911e7c4d15eac1effe81c0e1b570a50b5f7f432f48124a1a6016044ce33d511c292452f9d508c8f72ed044b46c4dde9dc52f4549d944d620c03a3887596c6b4f5fc261082498f595e0de231bc61cd9e989a1948721da1e589345a5698981ed959d0ef7cf811dbb740b07475bc5d1d2beb3bd20c6928e68772dce4ea5dc38f2048f8c149c3195a83020a1570317978afd6c8f3b65d432448b23b0e67c3642f29ed9acb145108eec8f87e831d324cd8e07bb790540c5f3b3001b8b60d38cdfb8da403b1de387584e1d537c8d03c2eda837b0eee7086aad26097f0964ee4f7ed84c48acb6f6b5a1a17f2a4e65a93bc42d4f210843166644366baed011bc4ebce8f39c23e026fe141d792ae41b7e087492883983a4ce6fa9592a92b01c7589e8d5c0d26e8e017f983dabfa9aa54b033f986cb2561b7a9f1bbd28ce7030fe21670335dbb18538fc569a6d8c26612953001d9ff1d7f2796777203f1a701eaea00b3171697a13768a44dc14c0a339df20c124717343169742eb56f25489515f0729c4c99cee8f64f9f48eb95af8e9d1aade340dfa47489958400e2830b0951d5c6d4cda29da882841c04437ad833d97d82f146a9f365a44df1f0a5cff66cf72f3482f76691676a3542be3b0dc791ca4a39df39e96e29e872689bde07f2d001c5bef8247927d9d487ace8156a43054a74abe1e4ee8d19c46e918ab6119ee5bb1727a8cb47ca37dc5d36050f999040a95bc1702594d554fa684c28d6677f366d4e777e3751fbb9662fef840a7eac45bee1962fe085b6cd5705bd7c6f003494950a32a183a8d9ee4bc4a4702a0d5648fc6e9bff9d2ca30301349497d0c2461721db9542a5bfe825015d8e5ba259cb06266581f94896e532ff3fb8e87c76c81b42bbf3d94af92b36b460cd92c0e791c95d996ebeb32a9672f283099484623afac60f73a0ede4e256a1dc6df6e5a8e741a1876324a2e22254a2d6f2b724b86929335c7089f3ca9d17037a6d836d69c9b5a8a4aca0b4edfda9892b962d807cea1c439324c1bb8959fec5732666fd7a5f7b69eb19443d7ba11ab62ede751ee155a2a218f30cf13718faa0eef3f538e2f33f4890616225652b305bf4430eb3b31efb0794c7c0090653df6c3ec8f22e1bcfa128d927277c35f5b330e229826f766ef93a14ce2b3c306a6239339c2151384444d19437067c47ab0b8f09e2dffcc31daed5e0247cede14db87a48f9b82ff8acb14307554e67c3bc0cb0d7c9d1d97b4e657a6d11ab00f3d3867f93daddc659048f90b8bb9365a79ee05001ec5369fb6d00dbfec7db0d0ae1e559e2bf4a29f4f19eea507ce1110948c1e9bbc396c30055a3673899593bf27a69e9b8bd12e4148989af1add1ef9972dbaf3c19b3dc9f616f36dfcd34d0dca143ecc923cc16ee05f5c5861d8ffe89892f450d2927fa62b416273b7987a361ba3739bb1477d528d21abf98cb0a8467476d0756fce2b3e40c8d2ccc285f67b299d7d46f228040c32f304c688d01c67e0cae4b5786f0ca5aa52e6f312d0ee9a15feea3d290dc2ad59c97f3db39220dd1b58291bb99610f2fc34f4ff44f56ac3e3a65184572d1d4cf206e8e9ab6726231b6330328a6883c9618645ca3bf06cd2cebff10391117178203e6b3d6a03ed93cf26e0c8c700e0327eded34f473bfde7d97c31e04c4d5ce3d307f6aaf2acfd7d19c5d34c24c5dc9fe1512bfaa67b326527f7b37dd3bde6d7d58248a1ad6ea465468be95072ee3855f92e40bab3cab122a0c4ea34140c066bfb6cc70ab091061423712789593db376786af79c4481f4b34932a77c1181745c81461e44b57778c887ce28809e1b42147ac1383a48896ab5b6acc16d38c67abbdefd74ce70b18aaa60ff07a78020864d7b56224cf8600f92ccf39220dd1b582916342a61b4eea9c5f7ef593c2e5a9dce490066baef8bd6b0cd2f6237deb94e4e428f2726c67e841cf617a33fb79cdf0e6b140bfe350072b73d727065ebae7011a8da948bac7c73223042d2adf210945fccfb03b2e8acf8555ddd9f9efa174a04afd96a703c9e31deed1920877323ecf36f2a6a835fca033c970dfeaf3b35768394827c5e25801ec37f76f24ebd1f5ae54469279a2896ffb618fc28d10069413e1a9190ae42fd74528ee75d8b7711abd25a305dd1b0260406d07fd8240ecaad612e521f479f55a20f951c9471940c7e61825c99f758ce95ce6457d1455e90c17531baacce11796f23fc405a0733b39953ceec7f0baf088005ce2e6a1a3653cb2468ce033a4a4c31b8771d1925f786ecd3bc98afea23a1fc9b51da33e1de92139375ff8211a6fd12bbcc94203034c555c5508ea728b67413f04fe523574604d28a68a5ad48c514d6ff310553f1db5e7db154da6c6570afe112db4b84868cf4ccbf0860f75ca9ca25f00fd77118ec89e1f9c2a6490242e310e69eb865bf6750c62c77e8ec96bbb15770c8236d84a302feb52beca12be7388a72427d5ee86d6fb16adaa98c3359d707126925a8469dff1805d29c8c1cfc65e27fc7afccea150165c3f3684ff3abe93040e479a4945f8845b015a150b00bdb8caa8bb0693e34a438954ec8e0945252c687d475ffb1f80a6ed94f502854dea6a37db9d65b9be428ded687a6e0cc4f84b669a5e7b4416170dc4e9e686f1b9799e0d8a0325b9f8ce39b4e898e86926c1b4ccb51c23607dd83b7a3e18adfd0e68697202aa1d51721d4e4777dcf13f1d3c971e40026938c2707084db095187810123b669f383bb6032510dcabd49cc0a7e04f5aac7c026bef1c1f9222a6665630212810f49da702c322696a17dde5abde9301396625ea1e44707851e8d8b9d9607d39c87f914ca5f9bd00d0dc419ee0ba46b7c5abb1d83077a445e383b13d625a092e8aa3955d393e030ff45913be6887eb8c4fd0ed815da6a2159e77b7550f9a2b17d52169242b9797f2ae69a986d59323cee2228095ee378c54822e104fad7717cd43883a8d3e9f134b7edc26a27528d8ede873246439c2a93575280457fa453b164717d4c7239d18804768f566917eb14c0154ed020af5e5655d300ed24a07d28e18257f64caf7b0dac85b482be946e3c72341cc14fd5dc6dc63d736870d9fa1902d41a303621bc2afbd08956128846b74ceef88bc84ca45876021bc5464c10130175172b92f1b76231c7e9384ecbdf796524a99a4940178067706ef052f84734a930a02a54aac8a97346b523bc6ac88e00b3da1832753a8286285128e5a7812a507fcaf77fdd72a2b4883af094f428a3021e4c8891529280f5594546192668def18b3b2829522255861058512acb83bc6ac0459a314c687342b20f68810179008a11243971c70a02ca822a44a0a693255baa24a0969d6548162673bc6aa8081c90006fbd47c9f0f5310712b7c285364850f618658e1c312265841bd35311f8af0018b3d4283060d9aeac3931dbdec18eb010a7b53fee0afdf0206e6095dbb7ef3357b66cf7c0cdac824cbec48b738bd27625488d832a96801428a9831307440494d0e6960986249540aa63099c2c3cd5ff672e6b216b28c264d61614a0c4f984ad20ef353232ebe179f6085fcdd4b8504fbde7befbd374c4eed18a342444c6c8a9a5d778c4d39d3c3162aa11a080948f1918278f0883f3507b6fc191b9e3ef383a4d458124d2985c8b62cde98cc355f5913d9bfbc77fd6f643c1b82284f9b466162d30ce36b6b0b241baa94995282982a8068932955c829503bef189bc2d405e60218ec53e2fb923c1d794904894d29e26534344111030f452041840a3a486142ca982ccbb22c3b42068dcb9318285e808cc1b12ceb0163dcad10d3746982099a294680f09283941aa4243da5a4b02045862731af7701910394233151b44059628cbb90811d6e58220463b4a449a23844391325cd939818941df6b6630c8a92a83ddf5b2287531271b0f581fda15b1ff85b9bc3293ad3e73ffe53025130fb0ffbbe492e0212e88748b0ef5fa926c1ea381510ca295bbebf954edfea56042450eb03fb0e731667b29c5172d298dcf1c996f5e77fe0f347fd49e7dfaba7aedfcaa144615567ef896842f0f101fdfa1ff8d7cf513f761fb43ea83fecd7568efbd8470eac8d80ae8ede23bf95237acf1011100940b1d3d1b23a87fcb863886af7ef43020673b966f5907072ff4d15a5016402bac42f44c490d44cd99c4e22311e80c478388ab1200496d21bf6fc2895d43a9d06159071c2b48b622a28b2a7d725cf77d9cf58b2f6716b2fff6a3788caad7632329ad9b8f76547e3a5ae0606040cf6c5be6ffac4e933df6a8c2db6d8628b2db68faf0eb238f419f623c5d32768fec5f75a5b2ba5ee73d2d0bf3ec6189c3f3f7641f3dd9f26b1c548a5044a428248d2972200ec184b7292a4e463cedec7e37d3cde7cd52a46377fd9cb39a359966519959de92bb8e9cb5ed2d1a5d40b2c662fb8884887234e78c195353b3ce9b0a4490a9a40c9b22ccbaa0a2688819035406a302a13842a6932439324576c93169ac070a5e9f5aea42245b1a42027ccdb044d0a4b530c69e284d7a3264094b0d4044b90a5a658132e9bee186b9265c6909e90c844b1c5d9c4040d93225e30c617e32018e326449a185d6902778c2145417272c39473cbcff45b37b694d47bb0620506b3e25971b9aac400dd617126468f31c8165d95fb0b723a7ced9b776431c9da67cfe197f7cc2bef6f3cbb7b8ed3dc9e52b61c3009f2806dc901d86f60e8dadbf621cfdebee973f35bfe2df5db8df72b30fcbdfa18be026f3c1c9cf7e11b477b600346255c98f774cd17c6da4b2d63d4f763f896d9a83995c1165ddbbdf75e7c6374da5107ddc7dbbd110c3dd833ce38e38c334e8f05597b5a238740b7be3152a743b6e8f2a044fbf2f35690a1605ec54a553ab14939a73ba5b5cad82c27ff7632bc26396a8f498e96871cbfa6bac9f946b59ae1e9137aad3a628fe108db5d8b01ec75a595ee3ad145a5434e9f3acf7c3975a7765e4f070bc2235d2f07c7a92fba88df63d32842b4628cb10db1906f51dc123ac1a11e42af3d9be4d2d46174dad303ea9247848a50d29d34c04bcaf263b4b65a5bf1520b1564f9f3f5eea5204beaae3d2959be87030f1878698bae942a620ca305e813b4a1d4e66717124ddf9d6c80d2eb07c6ecd140b9552990c52473efdd077620076ee07687e5703909b2ba93bfd83122073ba20bf9fb05a3c5f4e15e7bef79793ee4306f0ecbb089350f57535665ef915dc6817277208b494ea538fff13caf878d83317db2c79fbd7f039cfc6b6cdf384ef3f0802ec1ec9257daf5c3d7377f6a784f658d20df67b5905937e4398f28f197457a58ad6a90c524d7d81139d8bebea794c30805c205a60ff7b5e61e42218fd7960f983e97d3616cea645c2d44a593e882c52487f2e8084b7944a57e0fa16af5f449327d421e47d3e7c8f4b15f5f22f100468c8a358fb884e9f6264facf5a3d235da28e7e1e0524e2929952da86e6da4d7d20be280936c3168a5b5520f76d494564a2b8c0a783bd4fa723dc9f2eb4b199366d693ec94d2fa6195533c25edf0c9f6f7624828b9b6bfd53a8840b43db0c19e40f62df8dee3453d22c89fcf7a92a3f77898b78b403fa4da031b6cf9f25da9464dd3344dd3341b58cbb0165f04a28d27e8f9acf3a9bbfff49f58bbd7da5a29759f130cebdfcfb2d7344a3f86f54520daf46b266f095ab00489223b8c4a4a39b0ecd9b49a825ee0e75fc9e90a4cb64fe4f07ffafbea893c3f7c49a7c09c80c19ab8f8de1b3bc2867d2f13348aef8816bc04382b9265d9921392d30a32cda986cca904d90985d41735dc97289c1d634700d9e1c3322856517841e30585a8cf29cbb22c6ba5f065872f5bf4172317991c2f2b25160ef8f1cd5167440a4610592d118513d3d6d931e60483ce0802ec70044892154071668a28464c15196a78e107234878d9a20bb667485d73c25e4a2e2c2e17e7c59ff883992247543186e98b1440f379e2cf43a5b042112d2aa0b0022029a5119bfb36411cfe6d0e06d19f5ce73f411d34bfe5da06d126da4e9f9b60cbc67ce9208ef95287410e06d19f74be5fb1ada4c8e17ff8c977c15e3e9eaf4c399ab3e3ace4054e5a9cb030b18ac229e654858925a0603028a8ef83828a1ea3cb21df8bdc227469d5629715d8f75f99122a37d898eeecfeb595f6149139bc4ac281749181095dc070e9a2e568c5a58b148cb10973c7581728be436c6df9ab2f4d514d25188131be26e01f36f6026435c4170d768c7589a14b0b3bccaf82fa62be5c7e8475c9b1857318df0f298db6be5c2991a38ceec447c4f7c19860b0e84d1a2fae2ea0b24a292b15a3fa210169be9c14a493c6a32d30d89659575ba6cf07dd10a246410498bab9f5b7f689f6563b08c8355b6aae5b2de5b9b7cb61f00336564b99c698bb460ef0fff51b20d836e80eb25f27579dd618d3fe7b9e4faa8eee4363f4193b9831fafc187dc613d4a744346dfabe554a3f8073f5a77abace3ace9734407c229713862d99a07698b7071e54415365872ff68cd13eb53671beb8a79ff7542a829ae1377210b53acfd72ae64f564f563cac7458e5b082b282b2c261b5e487f9e4878d02ab64b2602d0b638e1809f1039216274056695b2e4ef64a490ddbacf6e20cc759edc5378699489c66b5d7c6596d8d686452984ae38e5109cd8cab2a92cea774c627c232231363f45a6badb6d6ea313a95814a9f2bbcf2e81e698cee91f2b05959278dd1a37b5ce1e0eed5dd7d8554bd56a71edd635512a34b77269224897131b281d5142e2c7049e15a25f9d1295c5088712982c97fd7ab05be18df1e32de3136841a2a4358f179f9f5ae21a8d8e1c3e6144794c0575286b8b28760f2c2102fbcb042015d2979b121846c89ba012aae6ec8f23dc4f2099625a7b4566b2fa618fb941867d5da7b31ce2ec659a66d38d3b46de3b82e954a651bc7755d2aa5ea5229952a671b7a73e353dedc646ad03861590a0306cb524a95b38d0d963dff66e9c697ecf9389ec4a39ee7537a8e248acc0c23e774a7b466cee6e60607c7f36e381ccf5bad58ac9c8f7e9f4ff979dc8ac5cac9f93e9d9cefd3d1d9d969f1501e1e9f92c77576765a2d9e261e161a500d34f02935884c3b5c8bc7795838a88117d180737003324fff7dcac7e2d4f4643a9949468e641e9940d4a0710a0306cb929244e2541ac9229288f49f617408cd5774d221e774a7b462ccf3a0d6000080cb150001500108c0a71400b6b9c1c1f1bcd58a954373727cca1c0c009cf297d39dd25a2dadd6de8b71a6514df32935ede22cd3b48deb68d7f9945da76d1cd775a9549752a972b6b1b9c1a138383e250e4eb6b9b9c1c1f1bc158bb2583e258bb562e5e47c9f8ece4e8bb65a3e65abb5ad380759b09ccf419d8e86dc3c3b7467c7a7dcd9c9525f74313f9cf25f45c971be5c6677a8092c896d51024366e524c7d816a8d816262d59c0ac5490636c4b524c0b546ccb123236d860c36a8658961c5634c4b2dc90454996255968d8f5c8cdd404595c58c9902585adaf50c1b124794ffccf2f389aff7ad70bca7bfeb34c08a79d655996bd2fb6648524e71d6342601142e9d610449520a6ecf061f8668940d000e2de5b83ac9c92a848a894209604c1e4098780c6100410efa956050b0414104e94000918dc2b0c94042438ba9244092f5c693ae10517ae44b9b2835c89206b3bc6ae2ca17105c95d8de0f5aea5132cc9b0c387113152c5d50a6668fca0a62b52b42482bd62613ef17d93aaf07dee2b14be5591efb362081543f0187c31b6122688153045415629ac4eb0524496ec7d3c2b2094523c24caa65409cda63ac469aeaddec7e35909c28a103466e5062b33ec3007419ac6db73253e22187f9f8b7502a52e9775efe677ad2930c4a9d46b291dd29d7a9c5781e16f1c2ec5b22187af17f55f2d60f5a5fd0d48e74b7b1bd09b2fed33f8d185f62ab00335199ab62f73e5e64bc9ad64a9c34ce767f3b116b3ac026563736deebdf76d3430fcad69391f7e5be3d99af61eebb5f7a6cfeab5d5cedbd87c0cb701573b3a3a3a3a1ff8009005c6f9b2f915c862d2005049ea61fe937fe24feaf0b78f3a7c6557e94d6b9628f32a450ce9e63a90e2346c8554a052406e367b2ba15e4ecff461a15487de9e990ea5751a378d513e738be822c79aac018c730e13a15e4ecf04833a9891400165c4055fa08a9428628771028325db6887cd76d0df6194bdbc675217d5de8b870524cb8f30fc44bf023b1cf494a8919c52ce59ed04adc62e1793f7b96a583f564db3fce9da5107fd44a5f813c444554e2e3b58254869c482180c88c49c9001ab496605a151af18b1a6416cf29d78ba3bc69cf0b2e7734e2c394166cf5964db549352ccd5f9b2421e058c991d634d346d04ec186be2051b840bb81ccb60ed90e37c6d19fae3a74332fdaa310b879c43c7f4911dc83d778c350166d34f9a1ccb84ac7dc8ed1d1609323717307fdba4512aa55b1fccef5e02f3bb27da1ca881e1081b673f3a5d4ffa1097dca21641caf021c16deb7edb01e9eb80f43dd04196917dbf75c3ff3ecf5f192d0743ff1cfa31bac0efaee50ffd3327fb3e6d22c9e6de7fbb9ced64b4dec16fc3913df7ae43a28ec67dd66720eb6fc020ee6f3e839ef72bb0d5fab8756c1e83add6ef7cdcb1a3c13dcf73cfa35b2d3d8368afbe7563e76d7e27763982482022311e00e7b32cfb9dd57f600e1874f33163e990fb6c057ada0562efa97f0306656f9335104650aad335d3f8673743db4490e0f62e14b5b510b417b27b83daae377fcd3ffb58134bfb3efeeb17cfc0fafeec52d1457d0ace17bbd6bfb922e5778939edbbbbcbea306058779fb3fef40f6f217729bfb084b84b272fa644d1a8285a8646ed8a849289b48c3432326222890b7430da5269c775bf8e75cb067efa34282d2304557a8af1b3f771e07c0dcc14c4db67a07cbbbd06e6e7c0f99beabbedb78dea905a7087bfef70b7bfc3ddfe0ef72319187435f7fa99fd8cdab876b5ee6b462fd5eeab2868a3bb90ba535a6ba532fc116e2f3483ba27615730f4bdeda0a13462bb97db4bfff07ead1a6bae85e6764dbfdbea7ff79283c0b5adfbf2b7faf5774c1fab65adaa0fa591aaa361bfeaa0fadda73a1cdca66feb6f54a54349f3ec3a1aa1e43a1c1cd5a14aca904a7b73bb2fa595de6e7b22d200f56b47c33efecdc61ddbcb94ecacb49d0ea2bfbdbd5af512055d43a1fa9b0ea29994990ee5b4b1c9a76fbbaf5fbf769ac5992ce45b6e5f3f7be2c0e83df58336ad3ded70705bdaec774c1fa38dadb5ba6624c86c6edbf78a640927506a369416a824504f7bdb5cd474450ef247a51a9e0b05508e7e074e07b3d7c01a35780dac2f77de82f341f80d588438ccaec16f1b77efbd60906ae3389e9757c5d132b283ce55be71aadf42588fb5d65a9d54a7fa3ee4f122e4f1e2d341f7556f3fa22112fc2999aafda99a9c49cdeca0693f2767ee9ca83d250b9bf6ecfa5127fe8c503f1c70569d13f27811f27891f3f543a159674493e323f80f7ee1bc715927f55196719eeffbfa1304caf3bf010bddd23950ee6fdfbe25233ba05176871bfcfc9046edaa83e4e778e5d13a3aa55b2acde43c55ebbc06e0175dd84f7534fc8354a9efdc5a6c7fb32cb495cfa35b5ac7e5a73ebb3f6ba57d89a3e64c4ac663bcfc4732711fe6e01a38bf4d0cff9149de435fa5439c94b399fc4786f11efa4caee9cd8738ccde87dfcfeac3677df882b90eabe6f16283acd7eabd0f4df41e7c7508db12fb8736202d8371cedf575d873c5e481527bfbe5f390295f7fbfe5faf11704eced5da69191e2f36f7218f175bf59ad0dcdc87748736835f7421b90f52713f82ffe848167a32c8e3c5be2f5a4676c0d13251b48c3480d57402a94429d73f7c69becf8a504a19ce7cdf1918ccfdccc72b5c6024892533208281704192159a2b9e9a36dd31964412f95287922651b45bd02b7bfe7b479f969e947684514a3fc60ae40e081f5fb0d6b0d66cf1468d136d29a5acaa6cbb1b730604ba1b16d0e00ea23febc4e193049b7c273bc6ce1ced173bc66260b47de41c636caa9899a82d34b78fbb4568516badb6d65a6badf5a66cad4db62e1721d1fa5a8973d925d086ff82dc7ce1cf39ca5bbe5f8454ed87588baeeaca39410e3f9e77bd2cf52c9fb0cd901bb7eebd17b39ec8b017303ca037efb055f5b7b95d84e43407869cbda834a16c3617214dff22a4f843fedb6e90a839521a63d49e8b90aa1ef240df54009843439656bc83280d10fef62accec183b43a4003bc6aa589a2de6cb9f35831cbe5e2d601fdf4aad84c6ce2cd9158cb1334ee6d4619b21b7ccf16e33e48ed9bf0849fe9007425ae5ee86cf5a6b9010f1bdd7cc399243bc7110ab8979647ff325a59cae654ad4669898d162e6893ad9e274313cd06b2bf539cd149911e7ec7d3c2d885171851921741e31c5e0c4ce62200391212aa8204505a61b7808c31443d6f294b56c0b8409270471d2449813c6a0e0062e45a8a0324411154ca8a8e1fbf27d302718ac09066bfa3e56d30cf2d46790164c61668a2147102142418a2a94666892822e2ad02d54b460440b62524421c50c64c822c55394145aa4208325cb8d129b22710426040cf605f17db1588c75250a48142eb096581881a989a72a98a89451d21265c4aac2ba32801d63514ea2987c56be0ff6030ca60483297d9f126c0a0c46250a2b4a1156024919a8288a5c9afd8fed07928e4dc73b84a423dbb6f9dbe3681da9773d243ff5d977cf224db6397bcf7dfa58fb6f93f52bd6733f84a4c3fbf94348ad08484a5f3e8ed691f3ae87fc73748ed54b3d045b3d4baff4500cad87a61e7aefb9efe9fb38f51db86d7a08090747ebd03e755fdbf4500fefb93f3fcbf4d4431288369a2ff5d010920ef9530f011942d291bdd44320643fd4bd0a963f02dd7c04ba361f81640402d2c00874030e21e9d8de460f49a0edb9cfe08fecf1abc01f483a322d9178cf7dfc3f2250c7220da7372d9390ecfb2caec8fac71092042210d63fea47a05026edfb19188162501c6d9d1d635024cdd47f20812a905422612392f4e2c0ea818cd198242c1fc824614961f530a6688c0c31e00c110366873bc6c43ce11d63629a6262ccd013b63837fa3ee2cb2a750836b41c9b7e08ef4392507dd8098966d8f4a5129bea185db80cafac224f346df9f1a9035ad07710876ef9d3185fd15b98726ed95e9ba57edddd350e2be599af39e9a44edf411f0c883c3edd65ac26a0fe298cb9fb99cdb2ec661acf177e7b310679b8f06f9b04af94944a1f0cb8af5d189c06992ea8a56ad9eeb05ec835fc07e39cbfefb11c1d914ba68fdc1ec0542304f768fa4c22ac1c72fc501e4d9ce7744d9f0ce47e8b1d966098b7fcf6ed9e5e99b7cf787cfbcacb738bc0a1ec7db782313c03abb5b682747e943678be24b7428e2e554a5d675dfb0707df2de78cfa9e4fe59a6c6ad87cbdaeb49b460eeaa696523c9f87f3e60f8f377d78e6cbad4441e4206ecab3fd43a0fe39ecb1b399b93de79641b96d5460ca661b0786dcb674dbde47dcb4375f5986f1b46004a38ba6e65d618bfe03042884451caa48dfff93564616921cc2b00b69a129f102ec8734c4d66e5672c0b583e44f1732cb088b868c67a5b4fab36ce0a1f9ed0c98a27a084dbc244fda23852cf70d89e876105bd09b3d84e64f9e727eac2539fc670a33637435a49452c2d8f463a0907bd03fa24f8d44171cc5a90ff10e954ac78ef9ca315f527e1fd3c7346b609cefebf0f582ddf9d3feec600021b90d0963631a581ad9f35948aca21c02dde1e7d269d47c39cf95d153df7c4d18dff765423cb1b4ebab3cc87d3e88fe7d1bd7856cc07cc9387d62e4407291832a5949b20bc67cbdf0a082fe5ce44004ff8b31e843aec1a0a67d96dd17b23b0b41c39fdd8f9d03ae0e6b572386ec6644e7a28b17d14598da52868de8427e2542d57159b66defe1485d0bd53ddf070326514ace2b5415df9c7959e420b3cf812cce64ee33954a0b398dd4fb487d74219f033d2559a3bbba9d1df51f0ab4a1c09a216329ebae0f5e30831c80edaa8360b26953d94881d9f3586ffa6023dbbf75237bfffc18ffe67d8c2e7070c030fbec6fc2ecf1134eb6bff744925d39dcc9b09f81dd7bdce397a1f7f3e97b87c3dfd3990e53dcec64bcc4f918336bd94f656ff3f96fc010ff7c1bb075a37efefa59b7ecb76ea45efbd46baf653f5ff5415c9bc0a8742d3845a974886800000000008315000020100a8703e270482898c6ca683e14000c788a3c82549809439120c7501404310cc420080311400c20c618c39c72c878009e3a49d06b239f4e6fc96794c4007ede770ffc09b1fcaadb95003a04b996ae8d0baf0977c373246d66ac1161ec605bc92043f7d8a4035843593d1aa5860ca9588e6beaefda424f6f9b554961eac8568a0b46adc95e8999120512214d29c8b1aac2f8309859aa3a49863cf3b1ce3f6358dbb7d4f40fc95c9cab2779e30eafaaa72c6c4782e48b9be2f833e3ac433339182465060eb76accf559521ed0d0b0226c46eb9bca082550985091107008fad6f59b027e52c1646786578beb5a2e97eb0e08fee0c24640195be0a26b2b898d4a396952d72571825e2d818bba389ec1bc3dfb6a1b0bc7d7c6019cf4486af3a10bfae6537c0f0853db4955f7b8efb6d80bbc79c5052f98a2969faf74c9a8b7a0ab83b773d8388c8014a87effc74a6c4ebda745dd59e635f045ce9a89f4c8a79a2cb43e0b3c74957bf9d39581b1ee12a15d81113e299ab0e905b5a0f994e82b359fedee9680b7f2d9426b7b78852656dcf74c9666b539e3742e564db2433602bb7ea33c60f036a8e23c442665922247eaa738711599a85a2839de3f42dce24b12b8c8c233a7cdf23b273a7227f664ac0d5ade691b789dc989212728d3ad1ea250e450b90f20086aad042cb3599e90e24d95a465ade152b632247139de59ccb8511a875b27b4bb66a314bb4ffbe7b21e4a3947b5a358b7abd78338bfadadf890366abd1b36b2abc7384b0b4bf606195eb949645c9c937fedf650ce1c7ea4eb6dcb3636001c0aca08c1200812cb2f3efaa2282b436e48c30af1b1df1b1d86a59cb18454e29dc0a4602b9b20f6508dca4f02a077f6f7eac732d06a4fac8d97654f2e0bd63eb7bd96d68f30c6142f093c54fec4305ae8470593bf4812142cfeda5ed362c53ab9cbffd0a1fe46fa6039dd805c96233a012b3a606fb9498384b10ccb4d46ccedc28e70f33c185aa7295905047328d50f08965be34b4e911c99f2fea067817ac89352ad1ec55a4a56a90fec443ad19215bc8c83810931b8d82c64dc599bb68e8e952a0ad4631b4e554bded344e9ac82ce677a9945ae28e09a30fe9a7178404112632e6a05ed5f7ff96c25ca8a373745a5b41bd402138d2288e108c014df897c325b664c9d37ac67d6590865f431774242bf91bdfe89afda21a9c2e0b5b1ca27601e0eecc5e594e6a6b236cec0c61a4c1b196f7c2f2f2ab3b948a87382dd6b2f45a10236777cd4ed93d572b1b85fe9a11db6a7d3850c5983065a6a6691cbeb3c76ec37ca9614101026ebfe7434b4ac730264ebb0665191a7b003cc0717fd9a0edf607ffb75a4e81c4be5065dbfdd18475b4fb407508d4bfded94cd11bee42e86d6cbcfd9d4438acea487213526c877d6650ee0525060523cca66236bae5cb3cb618e585ce7985e6cee6ef4381088c90d1be4e8302ec90a688a3bd417f9f26b0e1f74a94752d8e2eb1c5d744186d65007081b2239c4e1244b21d013c35072969058735232b442184bb8b1d0d1117b5976c29b5b5da8d7b35574fc181d6522762c40e2cf14807dad980e5e2419845fbc22b0be2bb5e59b45742f9f1dc36dab6bfd3096a04be62ca14b7619cab65e2dbb1efa6935d333099de01f1164654cbfac39aa1c80cbcc54831df49d3e3f3360f5615c829ec4514297ec6e886dc58d762274f3a63a11c78d34c0e8593f894f509a4c86af02ed161083c4655ef64eb31ae50325d6f4d3b03ea529f4666480d97c3c588b29053184fa9da9c779892f3720971415307b9e1cfbe4f39e5695c4f0a020d4791e1fd30c3cd2ae075151c5a561649fa2d8143315fee20d256be9908c280feb60b764a1c32a7dcc6dab9c129bd1d98fade83a5c363fcd413be3a605082fac8d618afa0dd3619c983cb57d8f4c48882f12ac4c900aaae11ec72afcf48922ac759983881f176ee38f5363b560cbcedec7a38d4646d4087b215f3e85d988dc7fb859187d19c6bc501b0a887c153da50a89dd6ce0f61804a1a5e35cd2cc845ed68b8f238b198610954c60f618edac8587e57e3dc4108c8f92b1bca59a6884d21e5a658ea887e94f576100da9d70121fa5ce7d5236d590d42be5bdf7121b423d5ddfa63f3b42610fdd15bc77ee53b78fc8ecdf7f34dd45d907e210f439162543b19cec88d00562290174558d166d1ab5240d229e0226e38770e68b38742579947e7542b64e1cc836fecabf2b943f584b4e61d6c4213aa40ad5679b54ebf406a921aab35db28b332d9f2a23d4bfcec65e3dbbbb76a506d3a9996e86674cff1a13beff720f054260f34dc476d93ee8319f69c863c24431ac8b6852b7d806574a6992fcb8280df933bb14ca9b0a8e883b124391ed3444d3a9b548f274c807d141503a907340a43d1ce0c0510341e1188879d4f2f224ec3b22a49a893e5e4b59853baa85e361cfd4545a53b3b5c4445aabdc31a7837580298e98e6e434b811f33fa68aaa76c2523d42374af45dcafbcaa65c9608c744206fa8c6d46c025d0013e5232db209b3e00a0ec0ef7ca71380673010ef2fd8877a4f0bf4cce566338b107f45218a74ff281b14a135351697a08d1a72ce98a49db45f5820f4905f2b4755f916a03e446ce6094d4ab029bc03e39965f5ed3ae24164a252609f56c820971ca464928e297d1fcf1b7e11336657d652693b2844930277a759cf54bce1dd17ba2c0f181463294f8c86ee3d79a25569e736d6c57db1cb58ff2a3f060a56252de31f5e188f0a1caf05d9945d085d9151a730e745a2c7b6ca7af4e9310091c49e062b999cc9b01e41a8eb4a90ef324a8aba37a90993a4b8cae5d4b4d832a17e7ed540bddd6f91d9878fbdb169a48b29b55769bf45d4263e72bcdf88dae08069d478eaa2b1fe0906b42385d81d84e983bd28681532645639acd4a046408dc77701b4621f313bd0b47c52217155fa3893b0109a96cd2c5c26e58ced380ebdd98284d1edc6ec49a397b66616a142913440c7f1ec38d1384128e3776b317692386f5b60be00caa95f14356c383f51d207f19856288e8c1e93cd727cd5e8b3d6f000231723107257168fd15a7fe591706d728049b1d18b8f90969a6a51cb6230c15501a822f0e02f5e2ea481cbb96af30a8ef34905cee87bd5fa4f595986ce0e339716408576e1d5ca05ec7f845a8aebe9b24b5177c6b208c663adad9ea96f122c902833496505b1ea15185fdb4d4d7616c541b5248d27e7c23d61e194476dd8c087dfa7c017b8605d0d33c9a14aeb2201709c24d13db449d41bb9f6bd002b407fe39158e3877f413538bd4d8d712a3df1e06e13865d18a0a6e08ee22201c8f46b22a549e1a07522125352e003573658e93d7aa90e7f2af9668e9378ac8c050f8489beb744efa75698e0802009f30173e102a3a4bcb29aefb2c9521229e89d1549c4d3949202b4f9446edf125d82800329408548d1fc2e60da39be98e48cc1046875476c2940b3f82ea5b8bb70d14e5b9b232a0bdebf4a7545ab5579bb00f9fd8e6ba9724747950fe7a330edddccebedd1a06ca51ee039cc0633d68b9e6ac028155be29e1a86c5f6accd2c095413ba36e23a98dc415199e23fa4057e1c180a848c5d7b6a1b8918808337f725723802a0a30873e6cd103214310ccd228ed7ab9f788a36d5b1c89de2c55153e9fd9891408700a3024e41d4432e1472867f881ed98f7cdc0f7d5068c65e51a5506fb0278fa57a9b2a09b1ec3f8512aad6a5aff93444deca039a67c46a40eff7d2ce1c3ef4ce080a12752355c37c9a71b792184cc584235fab2504ab9f4081c046656f3b03fc17c4fc8a22f2ac30e0b142a6aa00b4c3d6879cf185dcfb1d7395bc23fa6848e78e67d1fcb427492a38ab4828c9db329def85dbf98f60c13bda7cbf8233aec078945a8cba49013e96790f8c7010bbea3e42c59ea58ca7c7db9ba49da488bcb08df31dc7773b4aacde56297a82dca57cd26588b6a4cf542c3e005a2560717a8f07e078c44d6a16a4c1334e04dddd9cfbf0e3c3ec64924c03f12db8b7890d48d99b2e3a6f7b3a92214c0dbbcc1e9e1eb13bc6e966fe57cc28b20205973b0e365a31a9dc0c3281984f4701dbfbb4e401279e26b0f0c30391776e07a482861ec3c52f5005f58c27153585fb8460831203afb76812fc88d7d2e25660839e80e7fa26ce0f89db362c8c03da6d054914053519c4c15bb56503221c647936a5179743e1300e08405292f7bfa901776f32b9263c0c5e68e6ae6f2f49a5e6e20add4dfa1ca0c0bb4be4a6023d134420f341a1c98d166e3ba63e60ad7d7268f6d5814180154f4c8114f4a091ea7bd94ec7e86bc503fc41d7fbf474906b13935d897d7137d7700ebf7d509802258adba6f9186bb0309e3fd6480e57cf09087d41eff6822359f4fe1f6ff95c40703fd153e3596f89a591fa9ba07d3a9373f2d3497eab65ddc6b7a68473978d34b4ce234b6f3cb724bd87e42406a4c0dbe52af90bde4cd93aa10bad2d8f4c4556714594bb167058aa73d0d33c85d4a262471899b102d0c03ffb3087eeecbf180c0d3e2e92ac60cd841157cec0a170e850753dd24f70210c5fc21cd8394480d777206617e9b465422861f24cb6d104f69c310c824dcaf9eb659c24ad0940a021e5adc73008230eee4f4cbd604915f7d5da2110e0eb5a00cbf02466406022c2574d3dee0be3cb58c545dbc899138f6445139b463320692a483c5f360ae7acdd7b8c8d57f924dee442c67ea7739318cdbaf7c101f3cfa8cab89917aac6e0cd29771d0b773fd9935cf91fcaf5dc47d7ca90d93ba8a4fe23a3d13f3e7793070ea1072d97462e093d1b37550b15806fe41a4052169c7b0e447e928e72a9af63a05aa3511f71a8a132f18968a189b3427dbcb509eb34777d6cee9b5c43baeae89379ee85f1a470363e613666c427974b9fa5a2aeadf286c998d7ce2b25c3608e86a07c426e0d309423dadeda397cc0d2213d3d07ea638edb75f17a10234852db46dcbf200442b6627a67819fe61f614c19071dc7efb0cc3b2bd7f87544655c8762831f8a29208a45b22eb3abe440e54572d48a23f5786d9d0e9f779d404428992bb9438f1ee14985eaf20c1458ebdd9f9074d08c960a0012f2143925c7a3e6ee9b016f606806cdaa66c25fea44146fce439ce174e52a7d10906795f7cddca5ded10ceb78fd2c0fce16a94f089aa81b0ebe31a48f718e5eee96013262d132d73646ba57064ecb93e8c07aab53a831a578a982dce273391f48f55ab6c0cde71366eb7aaadc0c34b54bd9e1d46234a766c130161b0e7d2cfe411976177a58d552c58a3a66b5a57f0a285540b156a9d44141fb4931b9ff333a4445c5a4083730b902b6d0bd35f76935a03d0a3d4ef6e58ad58089ce8ec1f7847b9628ea5f51abe816895782741b3d41bc2b3d44aa31bc4340736c61a776cd6a063d15b28326f43d6232a12b580df8cfe7f9c4eec0beda98a1872df102fac440057f12d9643c556620bec80274ffced8193648aa5b051f15b67e20621a0f8b32387e1e03b48b83e4a8de77feb410f4d02de5adad155b8077516c614c2079bb7aa730d58ecf3fd9eb2cb952d14cd9bf0b7e97b034c07108e0f6004cf093a27ad64a0586657c64578732ebd896cb530665740daba5281542b66794f000c593546b89f0409b46d5d4d4be4f1f7cdeafdd6145c19c6afe6aaf286a62e47ba019ea3f840673e85c824ae12b69ce1a38b58f1c77843769a4078dcacb7ddcf5c1ca9bab2e893bd4330afa4ce4b2e966b61056ea3278c9de879dc2c3b1ce9c57b9aa57149dc9220d8ad14ddfe81285f9b6ffa9550147bcd7a2d79680e9ff24cbce045e28cfd65ff34fcc7946ac517a243af5142accd4cae01e735abe13deea7c001b96e2a6c57089abaa93a3b671e9a9253c88eac49236aa2e097c5effac0f92b1ff484e82b3ea08ad47292e8efb71d80bbdc98a235cc847ae4d2f6eb52582978dcba61d8333bcbe9fbb576aa00e7c1405159119f1c0af8134a18d8ba80309e63dda8c0fe05d4ea8bcbc19f034a027d7f663dc3422a7973edbc341de4e40d6d812fed46a9022c663fc10cb2275b45f8da4af80b08163c4c72dde40f9d3e89032f1823b97a5b975da9065e0dac265ca8be6d6a990ac47de172e61f529c9a330e24c4d461d8155032fb8389f370fd0cd018cd864c1aed51355f2f777a0367041c7c6ee223f3d9c8a266040c612b37f388139a8752da2084ab1d5cd78ef60f1aece08e894b55e70f411300f86829363060754fc09ee3a39102b879d668aac64e19f9984f6de80883e6cfe8dba28e56605e2378c0ea689c9ad5b1fc1fdf782da0f54233771c2b43425d7416d9578f704045aa6bd7a07c6b6b9b2b2d87ee056788b0ecb43be8afca4569383c2e269f2b6fbbeb21661457264bebecd44ba6fc8f52d8757e43663108429c1639e58a3d8b9ea0fe10e481b1d77d0fb27756cdd104cd2b96c31467be106e5b371a031395f94991e7b360c76a01710e1157f49ded9216b23d003fffb76b87d31e45e753eb6a69656995957f6876abb37032f2d9e4449e2d575e1515aa7bd1ed5164330a411445035f83b43c53149ba2ad61edee20064b7cd208ce5ae0e874e23fc405dd03041b5b7bd86db449fa159f1c21b4afc538a77db44543c27f4b6ffd82c751972664312f7729f8ffe058e03ee4f5b729f8366e13d52a31c7a328d4ef086e60f6cd01c3d420b22d9cbd63e9c0d224827779628825f66451e58db502e611edeb249f2eedbfb3bf232f82596c2b0d66461e5c2cb320f8e3bd6215a33962e8a82bae605284a565528af80b0825781bfa5837076092104425b8f6c22d3929f844285df30b1262eff116ecc7d31a0b18d5c62bd7dc138b5462fed37025e14a8c5cd52f6c77d5c0577053a291070dd604f25316048410df82c74b79aaddaafe539b1201c8216bed90e31f24e851df926df50ca37004c94515c26c7175146a1c8d52a2a2582918f75723ddf27c61dccf6d63c50eb52badd92707d719c8d575bb6ca19db761f2f874d573147eac19ee263b2baaa214b54855a3342ee3c4f040deaba1eff87b248223bfa1b390d534d233f1bfe2cea30bfbee52c6633d4a23b996b1d9da3a440f55876d4d7bfa43d54a0f2450b95004055405e5133eab9a1db3311061fecfe2dbf9d91c4b4e694c08661c91611f156a7a360f3817f6f15a58798d1ab10de163cbb22a5fd9ecbd741248ecf9a37fd7c1516738ffa48e05eb42cb7f08e5757bd005954f431f1bebf49c2425b16142805bc31a6e5c3647c18b38942d7320d30d59ddf9d1ad149b3a7aa9fd14d3d69e1189ce1f03bdf091b62fb9dc9733adafe7bcbd68931d222a213c34bc031ff1d47fcc65b98c7ac72e9c806bbfc921068003b71d71b2086b121ceb5ae40af754885ad5b89ed28170c66746276a00114f31b98b4b08cd1e1210860698629511e3a2543ef3886ed118ee2cce0e9299b545c3f0e2b121420e4fec777d19654fd912a825d199764442d9693445428941e313452c9ad99f0532cec05e45b2d42ae0439ba0c386be20e7b6b6d7e641ecdc1e03594353eee90f57a5ac246fddd45eb55dda63ef112d23a4b9f4eae580078710aba23f607cfab2e1ca64581b507c9c20c80488f14b003ea5b64fbf9af249d7fa43047f6ff127d1b64c15ba20ac42480d016bd32507ae731f895506970a40b3990e8a0fc8bde0ced26725d31972d9817c759068fbad8a5545a9c43f09b4330a8462889d164a10c3eb8ceb36b34147bdfb5708939dc7a65ce969993b96ff25ace26f345f0130ec5012dc5cc2d03b07ac7a8168752f4f05c384d5c29548c521b8d5ef8cc78ef4c8090e86e28bd7ee74417aaa14891f1309b4eb2370d00814a784b452ea2763dc380063662ba282b13ee89bcce724bbccb5b8abbdf65e066ec1de33acfe84e366f81dac6aff808360c81b847a2772d5b5ae13b1937ace60b5f4385ec84b09f839472e6f946596dbde1b08fef3aa44195695db3be31bc72442d22506f3273ad9dcca1d65d9360310781f08e7ed604c6905e38c41d30ceba634383752f7d91086a7aad3d07375be0f3aacb52deec21dec0f2c7d855d9d59620e2d37106bbd7487a742aa1d23cd851751933e80de3af8300a83074a13d1444312f8036d9f2e4256b6579bebba7672d0de46849bded2f48170c77b530312324b0249d2854ccb7df5e1ed697eb8fab4102090bf48b103dce625149bcc154849f751e82d03209c7188c306c7f4328ea51729cb558d1200599b5690079b6d5c8b6bfb69c9e009b1f16d41a8078dc1df14c8f20068fa246f75a7ae2304ace0d447121b83197e328831b953cd39f9344aaa8c50ffc806c70aefdc0c19d385bf78c0d29a9c87a94b3233bc6882249f81275f426e268ddc045a0f4a9ec206b61b6ded41b68ce8eecee4a903ab51d4cc7dfab9e87d5659b3b3d010034124ae467a363a371a43f7762733ea6082401149d6b68ecf5bed99c6e952716e6a6cffdbf7a3ccd53949410662549f0cbd5d89cdcf71534e7afbf6acdbb403c921c35f052e99cac04abf12767f02cc44dde369677fd1ba8ba95d719ab3d2afe300cb884a2f4eb9d5f835e072da4e9269419e03faf2d397e07bd8ed5dc1dfef70e2d7c10deab30114fc13b2c57e2394760edbaed8976e887fac0723054f1a3b7ba29b10eb61588a3cbf2aaefb3363f617b40ee0443b21c4ba5825749c78dab0209ab12f5df184df5ed6f8fc788816079394a55269a19457ac99f86bb8da5d2766b1fca1aee6ddc2b9decb59961e4a0f9925b9f6839fb67bba687128e4a1da3783649e6443bfde3f7d6173f32cabe3d2e335f6cb1ab970eb37b9a27ac7499ae5809aa5340a63aef294da64886b484811c351f5a099e63af2e5112523ef24fc0c3058d2cefae1dc53ee9edf0156d282a58ce7026c0d108c93d1bd2a801b1336e828d5c644054addab07eef509a662dae4c891328f17fc7faed91869aaa6280eeb16a4558bd6d7b85267c23f5f1cb1e14a34beb98dff0a3aa9642e978864808af94a645df95da37de95dab2ff279c3b313074531010907e2c0ed30da51fdb7b6e97c532179d5855c7a16bab1718bb4c09dfadabb30f4e62b949971ba86629f69d1fb9ebc601299698de33fe1b9b32ba3a3657f9a9338d58fe8c6cea67a8c4f3bec7320d306fb5fd022e895cdde67bace28e631416f0e198671d91ef782ff012efc9adf3998ffd554940003bcaebc92da7e6640f0e316a0617dd5a7868821eeff5af720c4012e686818cedd6bed7f23b735c80c4599e42ac419c832490bf1f60f12726f4b5fc626e0debd9d438a9e53a61e129b836b9b542e88138225277a692221ab4eb10d1e4e249b70e3a62691e64614e00a8aa7328c28f022954ca2bab62670ec45a563e6203f24ad0ba1cce71d8ae81d225b2019dc7c5cabfd94ba7bc2751b5b9d5a0b6705ece4c118ed26c9cb5385c8ad5f82b74de51e35cf9aae607ea47853f209352742c8a4656a5af0eb7fb81b088fbfe36e4ca2335c5e3248e23c6aedc34a683079288b3842550c611a0e526da7a050d1a4fd9fff28259b0f12aa1bec6895bc82009d36908aa3002b0a22dee98d66a2a003a8de487612a41d5ab31283d558835e29d8dee91de408c00419317939aea041bdcf06c1a8de43cead5ad0107d382fecfc4ea5ba8466bd2bd2a9b9912efbe9a202b7a8009340a5cadb59b09d1fc0109bb47d760d3393d962187f55ddc25aba1be53aa56fc1b08725ec9e83c156bfc0a1fdbc40d4a653b6f07621d74537c1ee8a6d6426f0c7f8e0f351bed1a67da1b9130d07ac0ff297a7ac2ad3fd3ab22695f75c26ded60a06ede5f09f44da195ebaed6d4ae5f614330703ac5ccfc9e140276cc84c62e9682ac5bb82e8658c180e37929c882e46c4186b4be19792a7bf0860e5e90b5614fc15eaa85c4d8b4ddcc394104627bd7dd5d5b53c3ba9cb9ef8853f47d2a055711d5f5c49668d95516310008b5c4f1f36e4541e87b3a2b9de45b70b4e6a5202e5af4f14a6519fc5ccd1e77652467b362f3938c37df243383cdbf92c3b1b2691e56d93b69be814e859a7dccfb6c3233a8f646e47d3d2a033b64f7f9dc427e43bd5f3b90b4ded87216fe2ff05ebe28c613836cdf30b71274e015b32ae0407ef1327c12586a0b24e4b961eb3c09cd7a364e999815f49d8870f21dbe35312b5df88046528cf6c8ebf4e5a86ee6ca3cbd762b16de2897362e1520016549755c8f4ed35a5b0fe9a5924e99a089a8ac7ae897f0aa438076e0503aa0cbd2cfc064ffbf741d3ad674464eff019e7424e229ab25083fc826b83ad606cd5a65471b7acebcda11032fbda7bea4b81e05b649983fe2030202fc94537cae88be4a6006b8fea2ba96152b2fc048c83ec8ccdbd546aa71a65847e8020621737de63a1616e35cbeb78ea1081ad632c2aadad5262edaf1fc8afeb28a02efe4e8ccc4e2b32caa57a54cded2b99cf48d14efc53d896fe665c79232f92034735bcd09828538efa9f40d8f5e0238c1b5c6c2bcc485f816cacb387a1c18f538c299ea9bc5feffcff3057098c067d6b7cc522208a35d92997a40a9b658e19fa775b90f9b7bb02d05276c185eb20b99833ac0f06855e39e7f6cb9e3bf9d689ac92fb1da4ed527c82e343aebc5493b70ccb0e2d0fa268267646bb22dff0eaaec208bed6606ae2d5a5aacc523d9d15361f3b321c30a93aa7586e549e84a5b62add0dba0dbfec5c48ea8c522ff3871759e6fc7e38e0c2a3d68efbae4f6b78414925f294a3eca1b270ee7888f9c503925718ff15501066d5cf596b90fea0f79627c22c43f211e1a1c83ef5e25a4fe096df4f3174ecc300af0466d4ca75848bb9b309d61310a38701f55d47154c6bf0318ab1f12a2d0f6917e7cbe80a0e60880fafbdcbeaf2a4d2c68ee63c43415304e925a87b48d0257b6eacac3688e6316545dedc7fc04d538ab3a99af405b75fc00dd71a6d21e58a15cb8fd7217362ffc44b9c7b86d2702d8175241f48e7b9e015767ea60e54b193575620d347dbd4fccd995bc36d9002d84c656a48eab359cb09295b3676f2da9b45aab9346af02ec4e2454dd060d850a8799fbdd9fc45df8110b6090d41332a3eb472332336c14257237150633338348ad092ce4bfdef00ce468f0f0891fb5fbfb6d727ea4583e148a79d20e772be98436a7f591eaffdbd293a3616c84ba323f8efc94fffc423c8c194c029e2a9bb6a86a07994f4f2514834fc09ec7932150a8bab55e55f3f78dbe88f40cc2453c97b63b6382ab2a959729815b3008d15d6d31d84af7dba237c0b44689bf62cb66e92aedd882da966a94e9dadd8a4ee699cdabea32bb16b3941085aa1cd77608ad4a244320af799509ae97435d021dfa1c027ca9f6374028951cd54ebf730f67608bbc3ee8a9b03d59121107e0510dd633b88654a1ecba6286b8e11cf6181aba45a3c196d99809b9a2e1668ca2ed0382b4812b5e3d7d2cd4fa890a3c725db5f90d36ab91e6d60df7d033cb344ccb8f06c33ad8adc5c94a67dca7553a569a55086a376e0398482aefc17eb4320caa90263b694efa0380a558155c8ad78468e384e5ba1cbd4010b61a335ca7b3b0eed8358ec2d5f7b96af7f401f3279eab9861ab938b56abe302f44592c19540b80532c0dc0284e151e5208b525c01b55a71e2a9417ea23d6edb8d358c70050e8223a87729d8ee6a05644212f854c9e2570506cb29405975d026af131cda706ec3bc2fad9bd34f8eefeaea63e6444abfff5d5ca587635ba708df63ac989a596767262573a45cbf51cd1e7ab4996b8586019ce9015153daf65b281679aa2c1ee1af6df90a4bba060fb33eea1999bfb584fcc1caeeec362c91907bd50ef361f7a2b75bd95e23f0a4da1509d8eda3bdb9f6ea64cb95ce3e08607ce7602dd0b5900f7d93fb984fad9e481ad46dbc83d284dc12d70ff9b693bbbb6dab1839fa7f7ce025584cde5349e2b3d3476812e6a2031c83de8e3bfe881b821825c59b03cab6ab752f06a9a30a7b65de4ab21336e42582e486c8d48c2da06f1a28ad314d4b177cbf51856e91580e8f4212f8d6d1334d709fde222f8181404b553be5a2660601c71a031bb6151b5e03d44ffe32937e9b8446826c5da200bf76d4b97e657ec5ae824e240532fd6dc723d3ffe25ed82447275cee2b16490ae89fb63e225d1794a77615d0ff743003c1254540de8c828e219ef227a7d556b51f9f3fba54bbf4d0081dac5f9369e940b9f31b2f4866580a50dd5ab9247ec4189ae0e401d85516a2534e002082702aae996527744b7db7a13e67d5d639e0c0d084aa323ec8331c75220fe16205411482da3d1e019827ce8fa109158198857ca736122193e8be6e608869dc76a25efd2715a31eba1c9118bf84d61f06f23ac6971d4e809c713ae185f6c4c3d80907e17098b739e615f0c8dceaffe8d346ec9348280cbfaec969d577aec1845980a3801a01b30032b52888d91a89c803f3d0fdaddcce2508e0452d80a71d28793d856d5d68e192b650a4f7a8006774739d203be4d08401843c0e8d974e6122b9ddf380ebf0c6f8d88d74619053a3a61deb9b9e14b170a88fd0080668e0f4518dd19a45671bfd6ba5bebe79bc486296723110693d09a35b3987c2c24a3c811e48327c1d68b7817dc4fdb9bbbeb1b3761262039a8dce37b52aad64b281dd2a016d6f60fb061173698dfd8d141859a3d896b9bf3736334600f23476c5098feb64513a539e5c3b37d1c7a739a827118b2dc9c3e0784a9a8ebbd4d33542cff285eebb95997db777e237138aebc7ac1cb6c5328101fb96681d2a2210ef63190223d909e2b1bcac4790ef748d5acecde4e0f7cbf243c3772a37b48c64ba6d435a47ebfe4fb9cad537fe49d4ba07b24e51fa1b0f1fa15d304773c41b422a893346246de80ca71bf3e91b5f968f6c9951419ec1849c92a86bf9fa69383019a11dc9e7e5a240d66efb76c31decfbeda93345b0dd395069d54d50a0a24ae401bf5132d85f252b358219613d4cacf7ae0227ec9aa5c32c8f304d8bc38124dae220e6ac7cdc14b17b44b1f1df61526638a1cb9a289a3578cefa650173c594f8eefa99d20f9447748389574108718098969bc2f03fbb94e3ae0ff6e26ad6a774b2e606f16f0f5eaf6235bf1adeab6a898100f1ef08639e018353d015bf9430f222bebf6bdea7625d180fdbc6c159ec2e99ce2b607d827dab9aca8d82d6db302cdd23784d8002d50381a76e772b0eda0952d8d943918ba06a22ddb3028217a07514dee8d4926486994896d31b334497da11aa28aca62499ac8d20fa0181672e057d6ad4ec7d5e92dc4ccc5d5168fb69ed4927422597ede5a4a1bcbdf6235f4768aadee99972e5c740d82784c1268735e830001033345de1ee965080f35e6668047b215da61b228af3955d0d3b2afe68c4a1c2d823e229bd0aa41568f084571eb4e175003b8b502390b628ee22102ca746a05dfbdac3b65e0c9fe3ef901935e3662f4223e432afffda521d27e39fa585e2bcb4de3ee496daefebe35951a642f22fbd06915f7f3d20855e89891656f95397582e1b8aee9aec7dd095133e45cc0b246e4adc52f71926aa0df1fc00e221a420e7b3e3cd19743c55514331e034388cc0ed3b66ca00b8c4cc573c5da5c0a0e29ee675e55006fccf03dcb4603c595f106c3dfe1a7f0c2ae038a936d32baae170d13716b3dc99f14b73f8277eb01b47ce3295bcad7cf25d7a549bc1187cfbb639dfbfd38392f6a0c425e6e0ce38d4650176458fd2cd6bb9a7041c81e53239d723331bc2da7133fe43664970341b52259c5e78e498e91fdf8aaa3094ef26cc0da971fdc4705be042651b252e5cd9faffb0ec4fcad2ae5b27147e723c9f079412aa69eec1863935d95d89203e3aed25924cb82e023e94b9a290ed16ecb0c4b6520563d101447413a2daf17b139a489cd7f34fbab38c811013ed83dae56fb7a085f9ab3379c86799ae0f84115853e7f614d62496d5bc29a62e3fc4665090244357176e5c65770ff50766962e886a72811d7e55cca0c3078c28fca0393ffc62988f58ba5745d72eee1fea3ebb22f1e83f40e712cc7c6305079ea6ca14299cb8e7db69ab6dfcd818497e01082d3bd4095e3b449e44c9f595383e3e1a42b220ee1bfcefee013e9a79a9b064a55c0e5ae851f4d2717dd6a02f0e27a2de44d8d7dbd4a8658a10e6b5fda32dc96a7d804d7744982be6e022cb2afcbc84dcf03f50d0c65d36bd4a7e665ca3ec52711c39599cce7bf1b03bd4178a6308efd531556e0f9d0fd7f74a487205e40090c8aec51dfc793a002195dc2e6188508362aeb34801c9bd3dd972ba1ac8f35c8ef334fbc293767ad0e1db06b69ce67691a16a1a5dcabee11bf218e36420b4935099d3609f7d7672ba95205b9c454911ffb7382db9b6ef7dc89d140390d24244106e3f3cbcfec265125fa15bfab0885025197b3f3c81b0f945810bc09d6f9393b30765cfba890030b4b7a00081bc068fd2b6f7e8bf9f971b50d036d391787e1cf8f3c97ef463e80589ec0155d48ccdf58608ea5ec0358e4a7efff6d7f7bd947cdc184b0fc9c22723e404ef915c035766e379cec645e6333ca0e2060e9eec14fa19655c6072c2130a6c64ca7c2a32c9551e5dc6786f913f03b77111f524af3f02dfda3562b5d46689031250778bddb48453a623096cdc0f67f7b4cd67cb95453b7dc622beb9d12d1f3f25410180b732eb9dcf6cc6c6d5b51878e476be95bc87df06d91728344e23897953a97414796f275000b9eb7f11e089dad1e3230722aba960128e47289563fda6d4ce1878ce3b1d8d8b07e95b76490370b9d45374ba0fc60dba5dea6b58462989af71908d794cc1d186f8808b077b1f4db582849812cdd38fc88adb81e86caa723eada2214179177c231e4aa42f4feca9629aac4d6fd45ccffaf145843731acb4113399c828ceefeeeca441aa6a2d68e8935282c02d903989393ee3067c130da2678a3908636bbda463f9ecbc0aad564bdfc4a460f5c9216c5699904346eea36ecee92f6bb1501a931f1ee19ea1152ea16cc4696e914c169a1bc70af06e169e05b99d056867aa155c41cdd26a37ee6e66ec4b53bf68e4fabed90932d7e240d1df92de2ee8926b22f4693344607207ae65c9e1ca986f7989eba6becff6d8c9e037e047fd95c7f5c77a86842845a1ae7c7855d584d72978bb094d8918b8c8f8e223329cca9e9af5cb4bccf66cd7215042a664041795451e10078d9d2cf735de32c24a4e7d6b1771962138c16c967a578469c9e0e2ae9b65ba095e4e17d9e44da139bf5fc41963be7e3d4419a30e954dfca49feb01727a710c4c82535078cdcd5d0de29370b1b4a5e242c67a6bc2cfb9f67caeb567fbb59999e39b9f0d6f61b90f45733c5ea4858b149e7d9a32c65fcb338461445820ae61c87b9364787ebe329f9b404850e1046cd380b36c7202226b55a9d2229c91808cd1679da2b80aa73137bca3535cd05f239a5c084895c29b23a8943d9d00eccddffd5b4859054c6f982e06bd4e8002795471c75b0363bf64e91a0a1d7770660177e9d90a7edcfde30bf721baeb5091173484a9f95e38e36d83acc9739326575cf70e4fd31610a795d55c992182fca28904b9594a09ffcedb4866bb2a23ac601ba1bea2f6a827bc55b0357956e750f05df09621dbc407c3dd636fe4607e1ee22c5755a3e3f83750f22592be26932cb32fa353670421922e4997e0c17e8bb1a606dd1607e0ba3600b8b0452080d6ddd1a6095bd5677790d8bf9eb103a24c22b1ad41e77b67f4ffec11c917ca10917162b34b4163cb7e4deedb6a674db396b5a5e1e54a1efa8f389da4d94e7eeafb7ed6dc694c04785ed5d4f8d6f51bd2643c22b20600a5a4d06c0efa8b4c3a1356a8987505db433711971d8c100a1f143c382e3b40acbb3f4dcc08061fbcf068dea547840c01c7ca885440c7298deeea68ec73c881049fbb517578da74d8f09825f2f55576da1f3fae2585bd013904e60c20b1f68cfe42d14394b90d214efab774964f57c2235d7a900c4ef0a26c5ceadd243304a9a8f773bd92c2ec5af7248e36c39be141840c49a37c703e98ec6cddab97ef15e85121c5677fe4454b940741cda6595c4ca762126e0ed559ff3789f986db23866e3f3d8f1de2154ca45fd30b31928a48ee18b3918b60b291cc232b903444d57d667ca5ed09433ead018aa31a3caa41e610e66d75a9e388328a59433e9b8db6cb8e0adebb52f91fb3f5848dba5f05f45f8d370c746399a94948d344ba8961fa72ad3a580c45e5d4ff394f293518e3308aea2f2f7ef2ab82a0a9a19e062f95be60454c83619e6e997b00b9d77ade6ceb7ab1f889af7a995bf77d03bf6880309b81def61f05d965b56f89d7cd85b82a7c62d7336e20fc17ed110b8cce3006921b3843e1b189f5ec328e57cfb13099004433d2ca48de41a41bf70ec8a986771a45b70fc16446ad2775cd3564f896845b151177abaf2aabdde14c0f7a12dd69d7d350e52d4c8e3989c6edc6398ee36cd8d2de624eb2a53d68d11ebb47641c347ac13e5794b54a7a3d719c14158d13ba424217fead28a72edb4ec378da6597907cf497ab8a7f78bb09ee5161916eb942c30c7587ef0d9564114fc1a1d51d1fcfba0836f7bbdc9dfed63589c48b2e9ee7efdf07b95486cfb8f4282b119a2f2f2084d4b97cde54c628b75ffe0e5c19b3e74383e1f89b4dcfd194677a3c6fb087d9b2b4de2ce384c39029c9aebdfa60b8635ffbfebf007d7ac7e3e4c86e94a67bbf488830e27bd08377e0f252706df0c557a7d78fb44adeb1bcb8489fde21ebaf43678fd28f7e957347d180efc1e42cf57f9e2099e8d0f09b5653d053ba8bb25582f530505b834c3f961d8f9b8a093d31f78c78ba8129a323531315aeb5b65b433ec95c11ffaf901077bd0ae21409758cb2d5c499ab2a861f7cf1abc8d663b753653cd7f2dd523c9f81af131b3e5ab8fa0b1552d7a7293004d0ea9d00f7e37dc82033a53369cdc6014cf51e7d9bbd769060e44f27669c466f2d241a6462895dccf6883e54277bb32a99c0f6625ea82b2eeeab5636d25a535fdbdbc333f024e1e8dc516f17128c3c69f8483db83bf062fb748689136ec437e589d58026b2f536a352a70b5920ff89e92bb964b110d7f1467588c9f6ddfbcca98eb3fa2f66c2f92ed4184bf698cacb29fb088c7a8e5274d1e4feb437eaf6d3748ae99429fb8d8c0e758599aa017233db8d2c1d3afe60165b57a031417dea11a0d0ee9ba3d70af2797ec130ed1d2c0955f5f12e72fdb830d90c9022d5bc41839182a39c9d980764f56f2ddda917fdef9009d2e0004bb17fb5bafad869f2be5e92d4d893b0b7661ab3bc8764761e4ce77e2d359e317600bf18dae87c0fe5954eafe0bf96621b760ce3940028071e2dd1f927ad766abbe4d3dc50cef5bb8a385a04678e0037fb08e7c360a03f5a326056d623232424f78fce65dfa24f13665dd12ca1177d1b74b63b4fe98d485dfba385a0524beac389dbc33b9efc7fab9d0f67cc07e598c3e42f77dfb0b0376785370ccb7df4a1ed273c0cf72729dd9b9f538099555ae882a3fe1b06e40765c632242163e686178fa517d029fa2051da816d5e11e5cfded2c5b7796802259c1a10b620658eb9461d85e0eef133db967d914f05479dff0d555a7237c9d38ac3d4b35135dcb67e6842ace1cab9f0321c0d5b178663f49ed65817be14a2c07480fa4895623e73fc816a4595a7f440a27030abf6d8b3047e0c36186de872b9246f71672c6fa4544a046e4790a958d8aa7a47d458c2b09a1089f11091a858a513b17f454ffbbd6dd3099072d2efab79885d5d46ca74b50531d218eea0d35ba4c30b400bdf3bbd21e4cd149e171e4ef88b45fc2a987aa801952db9d8007f4372ab805f07e4d0510cc4442e8cdf477e12bd9879a7661d00ee207e1fe95c405644a450bde0e2764ac4f2e4d8426af96a81faa1f78a8a54d164da04b9a5fa68a6b8c91dd04ce835ca403fe4fbc30561b261220e9c36497de1e735a58da203edfa808a1d3d5fd5f6cbfbd234d75ecba7a04ed314e2844479426f050f7793f6fa0571b4fa9dbcb50d251b7dfebe72cd0c3d6f0009f7f3b2e18ac6cdd09e1ed233b62216aaaac170d3d86418ac9f80b78cec8478ba57bd83e7d98be276bac7b48f092b30158ed37893dd7d616b802300a54ee84c6bc391735ffaadc808a210f30aca2e140306c171e85428fb85165d00a896026eebad59f77ae78ca7420a6b0b509505914ce4de2f6e49c574cc1ffb45ea1f198e697976a1f31b417b91e278b04d161d7e2221334e97f473c842e2e3ace5c6394fa49e42d8cc01e3c8208173740347b751c083bc6f51cbef46113464e7559eba343c73c46909f343c2f42b779c43bb5dfda93180cc62a1a37e07b00cc2305747ef3c371ab27015088276c6e71f4c72fa1b99fc3b34af8582aff0787ba861d2cd959269b8dbf9d2eb4fc513f44b96e1eb955b2ea93b84301199321ad575e9aeba6d1d9058dd5d12818da99c43047c6d38ec3cddfab03d190023a256981e2117f5845b4b980183491ec30c3434779e602619a255c2abebebd8d7718f8605b1a59416bee0dd78db8b6e9071e63133df69ff44ad9da466d8a50d4a034eb80869bec8bf65b9d4b97a8e04cce82860bcf19dc09fb3a00c519911c07ebd7fec10a7c0ed32d76033d082b053776b3c1a9d80db379060ebdf27ab659a18925b4e5a76a71baada13c698c669b3635c0ae1a8c1afd4318a60ebeb469bfda54ff16c61b981ca8ce1f621e9e73b40d7bf4bfd71957b7d6fe82e046b081d9158c4892de7aa4451337dc7380db0e54502bd5eef258be43f9fc5bc128fcf288987c003b83d0cb9c2618378f113f3901742a4e3fecbb682ee39834224f30eb7277e5a6514546fe2d454e055bc2e04d8fa0784da5c5957fa79846d1fe7b765aafd554c5766790ebca2a1f167f50f6ef411e2f9c60041254bdffcc8a4fb90b230b082d733aaacc97ff42e28fe33bceb00d7c916bf328cd529560574ea3c8740f51f0e21c365539b861a4da12a5e73927116a96adf7ac95016542dba9e5446b09a376d068db2b1b60da2539ffba1955061700782cfd2afaa72dac2a9fa4a7a4ccda5ead8daecee2b3214b06ca7bf9c8eddfb54a987783097241d2f05a47f327cd7bf6eb9eac9005df6cf0012fce5a1820f6d60587f921af7b0e5a1415d08c334b49e87b966ca3ac7b51719d658ad8b4fa00299e6ebca315c2061dc001249cb8be2a53a3f3cd724c20c451c11559ae41b9b391c831a360a96cdc574d7bf863c907397055f6574aa1ad02cb88162442a8ca6b19dfe244db4c63e3c3d71e246a572d8704009134a3cbd6a5c8a54c89ce300af9636373c910034762efe80d2044bcb16b98bc9ef3075e73e902453d2d951859caa553b905558b7693d50a9046b4b5174bab40b8fe88168f627234bff79e60e37867760b5c46d0cd3cc2ece7271a9b62f3a9775d9c6170d867b33bc1fb61941b24fa1a84e5c9da3fe10f3338f44187d2c3f3faa93aafce2420300cf003e5c0ce81d5b144e4e1131d624086fb212f5195cbe00a28f912f42843d2db70b5e166edb355f2e5643f56be8a17353cc1f917d7614672a219bf0f9c84110cd0ebae1e6f40d5dd84beaf594317962e1a95f627fd2af1873a57fba24d5e976cf77ba3016d305cc9bceaa7ec5f397ae12343c2bcb249631582680b3beb2a4f8967c80616c3643871503307577000ee16561ed64a4057c321e21ff258a797952375f7f052eebc4e67a14d6412c000e25c4f42d3ade106ae7772ae38aa293a78c6838f6c4773211eed8a53de7d30a5575209b8e8b8be55b409c03460733c53907bee0c8af473c79a3df9c134851bc476fb4ff247046c2d3c51506f91ef113d42e90d7d9641e52bb28b9639c44666c526612410c97137b31d4a0ef5b02d92ad195037d27403797045335f685049c4659babcdc0283c065768057c23a70ec5e0af87a4ac6805e1d4814a940f91ca07a3bdf2f05a36abd4703d770517bd4289ed4550f6a8b3bbd3a2ce40ec055c37422be3203a38e0d48ac1c0413ae74bdc5d694be13a9297d192db938789b3a4e6071eb395cd2a27f3761ae38da3e3a21124f6fe7ec67b4f449dab019a138e5c0629676af46484f70ebcc00ab40959815fe7cb3677d122e2239ddcb82081ad34b2841c5453231ef6b3b44aec98990b964848a4b733eca97c525f162d615b563e5f7c5ec63cf274ecb9bb54e3ff873883143fb74e49ac0982f566c7d0b09d3b8ac7d70239edc109da148868a3fc3dd44113c0d6704b3143b1e315cde031a9828ab27da665d35afdf48747ec091d33fb3ab43cad11bb2d8c59c42218369ad1263358c734c46e8934b3c717b526c3f8af06714fb37cfe1bc8f68c5ad4b6d4e8aca03c34d982431990bb007e3dc09e167dfe309b4cbe79d728622cb9fe6e611b251af214f7d0050359651223a8659b019d6e106ebe776e08b6f3b07565f9c160b8b98d7635c7bc9b0c6d5ba78023dc8022716832121e01b7236be5d8d9adeab3e46c2f34141efb2d9c4ce92472f92a53981c005f73fca32baa6b06dad563c20b32112fcd0c08fe08474aa192fe22350b1334e81b1fd3bf48bfae520af1f2589251e9829180646b6be40a8425a17310e6aa3d63bfc22fad3229b994697b31aeb74714028ade89cd9ceae04db4aad355383fa46c9f14b19f687972dabd46827161eeaf7bc699909ec60d5685f91ea8de29f26a64e8dbb497bd10e3c054526a170ca890f53b2127ea6eb289b8a3ad2addd7ba0f689cb6023eb5f0862a8b9a7c36bb1241cb97dee3e5e60eba21a9ce38ce4e59c8e939d91cced00a3e056eb43a3b497e63415c318a2deebc68c24faf8a5c039cff455a68a4e5f9be83cdbef03189dea07be516e353ef99d22e1ecc9f3a28ceaf1d1289e3094db1946d3b34fe426ba6600d75a0c198477ea64a6613ab712f8a6ffa4ff97f3688e12d47cea890a1db4f5045d715968120cb6bb291fe9451908dce6f404768e309f4fc776e25d2a9dd263105d21602178f5c046019de8543fa39492d0aadc672927da7c95200401bb00593e442aca1b3fd4c9637992e99d3139c776b6daa3dc2557e078c7b628dbd526b9240b8901404c916b97bd390590d6075b2cef26643a98eba23293470eb2e542c4f6bb56dc39a9d88d19cde1e410a111c5f6e646a1886c01100e073aababa56e2ffa8a87296d0f6a56845a3676917801b83a2e8a1b3d895e37d3f9d59ca3184949f15c295a85d577b2e9e5625fe9f1a104e6aafbb3616744773f48772548250e9a0eb9f5b3084a5cf26feb746a822bb5fbb7465d133e3435c614d05d86d574e1fb7c84a7209361c5e4c9335e1c53619a6066b3beadec2046e9e9a60aaf2e16f349fa1f693b44ed4479e68d211965ac643f8d2e60fd5dc00d5fce1612289fbe0e7a00e6689df4aecddfe453fb1d3a50d304c8b2f4c17223d9c85e38979a7745f119a9f0e71d6ea9120d2e6fd7530590e50891fc0514fdecad542cd3baaa7a00184172552fac9749a69bf7f6f63ee34f4c05c342521df69bbc34a0f4f7def17ea2f0830a55872515929f4605cf3508cc8c48d7960bc49f168cd801f76133c2080b1cc5be98bf8644b651fad74ab6c1a8c4b2cd15596c720641174f5abc9305e8f51d7d07e3f0ce3431a4b2df71a6047acb28a802ca2cb54560066f60f93025c87dc41a29744838239e116b25b351010c482aab3c05c19d4593604223fe6f845cf6c22d6ce1e2452cbd1c19163889e4b3f1adac55af085c1916cf7286b6681db47f53172eb865ca039819877c86316d655fe17c5544ad3a6902c46f333851252c9e57033b220539459cc370657e5406d34490a1c5a33cabb0fdee41c8d387cf643a60f1d52b176f5f1031359faeb2b29ea9220bf1a69c127751960ec80b6dfc01e61927e2854e6af457b8e4273e8940a2d6944b8e5711c4c7312a8a204174ddd5c545a3b3330087a3b4f11763e7ada0ebdedb90ceacca92ded66d828542d42f916bc79796abadc63276763d15da9744311fd4ec9e88d11b08a7105cb7962ff109eaa695b17c0ba6a9988290b1941a15282d875e2cd84651a77c568283bba4815dad6b8a76ac92279a6c7f95cfac51515b3ad3811a8209817ff523e8f81a3e3626fb66d96da1713eecfe534eb7cc42af1534779c8acccda32fb5b4078825a45f886bd9cbc7bedc6b2944c38d603ff75dec371d6c97c081b579de215e541ea5effa0c1d59a2a371168848ff6d9a6f80249c4016e700d17541a87e20abcd8733f927c44dbc5066ff40c68dcf3044679f333b9b7353234dff479d065335bbe9f089d6653a73cfd7c86744e546f64593858a5a2b5e2f42c4e24f6deb81bbe32938aef92e45245a1cf5aec8a85f1f5b1134be5afa21e3aa345b511416de19e32f8d17ccba3ec432a8894f00e75a14c7ae64698cd6ef91b7163d3888705ffc206336621616d00846fb5b41b3a361b5916f3822b24bc1551242192a2e91c176b2ba502c68386ae8461294da7524603d5434aac857de59ac5b59c8d621a5b2673af10e1c19a62f1213a9bb8b1aaabbe0d651aa3639868bb4ac4b4ae928e516731a829b38eaa097ea733bb1fc7297bc1c72c66027306eac99ee305bd1f52a6a340f578512a38d2d5f45811f1ed4b80769c1b2ee67607c840a631455ac3f21f880e2c22a2c1c49df475b83e2524c869bf155f8adef1564fbaba5940bbab3774a299b8835a5e4479f26a148e5df77314bf02ebcae32b8bcf8f0940ad847feb42f397227e6a3d51b562c83baaf8e5c038e87341557dea23b082b3f5f04f432b275feb46c00527e2426e90a9d21e86ff9f29290f1312bceba49257111271534d0a18e7508f5d1ad8bc3912e39da6ca36a8024a03b0376711301b6f2253f6bbd9f19002717e9b4b7c27f04bc7ac2eb9a55e80ba76b208c7a4807a35063ae9d7451bc24daaa0a752128c29c40880a9297dc414d39dfbe7180f5e18b26b1bc1ab6a8f8ae62086397d775f23d3495d979e04d9e6d4dfd50296a75c632e2b5246de87f6df2b8b0df35a038c72e6eaa1878d337dfd514fc2e2a7af9d10bbfca90f7925b41317eceeac3260093358c378f06af6f4a92a5e833b9c19963fe1587f5bb23e2c054e2fa38e23319aad264ee5af38aa7a8353eaf3787ac40fd1bc616f06dc9a362726a503abc2aba858292da11af494b2ddab8c26ce59e724b67b07e14217ac8bf2d67ed240c1582e18d615c6009e5c72d6a8ef82c86600d36e40dc971f0c7ef2dc88404d38daac2242b64654bcdbf862d9ff4e9e836666aa9a76f470d1455c4a8df81711ffb5de7f5ab475eba13383e06bfb7652d16ec7c37ce95270ba8710b68a402adae54498fc5e6e90f87e1caaae6becd217149af1b0e3d71ee0d60c4a3c0ece0b38cd8048a510f63c31f3ab9eb55fccef56c600d465283899dd63f042950d0a03b9684e98ad0162e07ab5d2afcb94c25b7baba54fae4295b097a85fcd740f2ba1d4fdc05e61b36a0910f313101bfb2ae1d201882274d4065c7b8aab76f0ff1a8219f4a05e37425b5761234842fa06b2f4ee542e93e7d8f20aecc82b792698476243e1856fedaeb8a7f5f152a2b0a2a8169573c3f4a0a0479595bf4111c99a8e2954ebc9b60e1d90e14ec83a2ec5e78ef7523dfc98507762cdc5dd7e78dd6190b818040ba9d2f01401fd304b203cfcaf3680127c65e8eaa51ac9d076c02cad8a8748197774f3e4548c33b7e586d973fae53a4df9502a543082dc8bf01e24b6d11a5663aea5aca6edf7a82d06c1c4e57286482661e25d865463cb6162268426da1ced0790f15f06a030234c3fcef95582014d6211d3bacf5da8a8eda61786189ac5148946db0b0c3902c3f680fece487dc6973a9725dc88f6c50a899d1336a46bfa59556848452dff88c108eb7be8ef802cd26664348cb097cf4ceaa7e9b646a2ce0dcd1223c2396f49ca0e82a0604120cb068bea222cad16ab6243bc533a4fe11c07a5b5120ed110414af8393c04d3e4f5ae5b29c4882f68cc00ca94abb18684ed7eaf766d485aec99e464ff666ab9705ae365e5c76a9a9e58da902cb091f313ba84b9a4a7a1882d2a65ff7de1df7418055f4d899513f214c0cbd7e262858de1b45940f35f39756e381e79173c34de8156fa87b627832ef63afe9109fd91f03d35270f2f4aca1116931372ca85360ead62cc29adf5a067c6eebcf47f8ad2d143fc75249c2c25f4b0d1dfb633e3dafe01649d8b456973979e23dbfae11b834e84605ea1df7a3402835cf901126f60abfcefc52744a1bd7220b2bee83b200c7d0892aa491befa37ef704261a29a81b0fb8957843f0cd1247620460ed7ba9214dd09b982dea13d9d4f27a23890065e074e6216807db2836a92038c6491c1941c3e8873e98690a29da5639670cb2d450debb4e6f5c1e3819f9cf2d067ca6a606be6ce0c7d6a5b57555fed45ecb002c541125958946bc029c3e392a2019dd8cb4cdc3adb61df303981d731cee39587116afa307c8c5b07812f97dcff6d59f168f2d78951e31f07d4d4e6d5c83ee534eb8e9a76a07081c14c05bcae01fa2a094060508c694d073258b0cac25c05c01967486bf61e6ffcae842eddb4f7dbff6e99f09daf1dfe75811d9582d0d1cc45772b51ec6e10580fa30000000044c8301cf5a44217559ab0fdd870a5a2ba08c546d41db6b52ada425a93b29bdc7b6f29659201260456048e039bc65aad564beb8c81a9805bcf965bcf15baa222e4e2c643240be2eaf3c6e3434422d544e68ae8027774a7664c75d1976b71a782a668a2904f44b2750d8e0e5bd02d6c174b7d0769afcfdb4e1011898ef19b559fb71d1f9dd5e76d67a8931c67079c14eca9ea5cc0c0439847109f1d4011869b0f939b0f944f148f50df371ea2bee7057878bcaa2d566e3b4eb79d19bedb4e922370521393c60020aef08928882970b47e801b9686a85e382a62443eb7a4b5d62a99735a1a7b266f0408389e791e3fb09ce32b2c30420499b36ce8e4b119819b62f6d85400fd0cfb2a09ca6f40cc6d30bec16f332b5f6191885ef1cb3b9d5ba361a47e0f0a3843b0a40cd2ec540412fdafc28dc8099c74ef8af1d79a1a8e8a277003685192a8e99afd2e13a845292fa8d5c0bc90c142f93b6c28b99404a0a95d994da21250fb22ddd37c5272b52fc645810a9411bc8c911204a4efe031a6dc3556ed996655d10a3a6ce8f15e6ee5ac024549091755b34b6d6a8418250d251101d482286f78212e33886610d3896dd53e8409e57dcc2ccf03131d7a88617af119b3844259a69c824309abf54c1760e408da11a6050f199052290750ad1fcdbaaeebbaaeeb3a1eff03e8811881809a0fe5eb306b78c00e4a254ecdca9772fe60a654408d06a47440cd05116ae616aa2665046a38ccf038a264e86a73ca4b9967861800cb016a7fe386a9728a812a19500b9a609094260420c99272872425044c54806725e6abcc909194b876653e4da9b20035a372c68f13aae01083069825495e18e93d9aa2f450fe8c0ba4e810228b121a12e527866ee401e5ec4cb928235484ca141746dde8c8938fe19316509b4d93872c357c90a166a41cfa1d1aa54d0d0633a50ae5d4624188da87f1c8bc15259306593997d4cacc1cb490a1928254c9a4acb5b0964329a2e67ac156de1917d8b88490c2cc8626193e656674a3b1c654ce3035d4b6b450fe0f0c2505784eed0b102595d2c9d74e285fb5149ca0754035eb910313a232555ccf14956e444259c2e7544aa0c6a25641ed6ddcd4e60bffc3c4e2746b40ed8fa44cdb192148509ce7f1744fea4b67adb65686e7793b4ba4a23e089518a4138568dbd1104cfa6be500a551ead94a27fd2cb6521f0060467f65599e35f81cc09f7382167682feb08f769c8d1960ec730919a63e0300ce39573419bca8a2b149e648ff0e014d726ccd9021f2f3e64b5065b92e6bf05f3950b9e5381637d2bea27b9a039c7409199e9af3e19f262c8d593b8ea0e3fcce7559878ff408be779cf3f11c05b5cf51d02d16e3fa7d5acf0268ca672531a21b79684373b40bc733a905555b8ee3382e64317e218bf92af0119000377af2d90d6084713d2d2880f9d14ac700e8e7340260057a5a10d358c7c352db686e03b5d65a6bad754408f5c66687489adcdb86dfc444e8370366e0bbb8f5b42100b4e62981fb700b7cd4020a819a9bef7b3d00dcdba541007e1f8d0e4b97cabab7b77793a8ac77fccbf9cb63c7f3ec4ffc489260cc33cff332adafeebd37cfaceb45dc0045264d451634e5f3c6d227429a37a2222d2276d3e9be11f13cf971449df65702be6b4a8b4bf67603861b2cd818938ac70a3b104902c60521dc0d2929a9aaaecfdb8da539ffe7ffd7d071246dfabcdd409af373fda729f4cf18ed355730a56bad1c05a55d174b3f127ff9c8fff951ae5a1859f9ffff7fb56bd27a73d6de6e04756bad75bae113fab8d1627399126de82eddde869c86985425f071702ea8961a6912a772fc4915377de33ce03624a4d73e6f4327f4f0470fcd24c218a13343412a0cb5d853bbca4b98430fa10e39e80065d3e064db600ab9a88014642b49f2d1218e6043cc51c21852f2cc40b50398b02a4b68260a880d3f326c2c4a6847422d436a9020c28eeda4dc446a31c2a89a4f7843102910838316a51d361051f68ba63069c90f0b620d14c41d20418e786e8434d8903165e367039d49610cd50f3b569448d9456ac00186508c4d29053b8709a10d3c421f70e8a021c2a801b459a811c29e21153e750965e041dc818308e4b47b9a84532e84608a8835a51de523449223a452838a906c4b09ed6c13ca84247ce981e54685e969470ce10a49b6cdc81321210b235015ed16b5ed038d99e882468f28a32a1c214c68820f5ba6431194183483f8e2051b565881080a3ff617a34dc290d40c5a0f335c943113a60044105bc45409c7dc008606d1e886a48532296c2825402185588836d28c5d838c17473258843190115970d9e1cabe61ca2e9f846498882520d9b254e484137a846144d85e8444192d28e4416b115a99da495ef6ac872d398834284b9cf860aa4185a320e12da98a0e3336c2c480b193c4e03142157e01b363c892254a880dfb8a0ce1192544fa1e7941df2122cf8f0dc3d1e681481ca211be300b0aabcc76f614aa2061c212b48c50c587941e4f441d4d760ca6adc54868648828f4a3c951988588050d2118414360ec6c2b545dc28837b4ec1eaa389122f63c097968121261125b18c131247cf263473932220242630fc9829ac876c424aa508530a14dcb5eaab289a4883d9ec0d0e40653e8c5c86632a4851fe109479b07d1121a620841413b84a01d17a8c432cc9e41cbfe51450422255c7ab24b68b261308960048521a2093f9c8ea410854c686c324041bb0868274c01151061b696304a952629628c27529a845798ba18d94786842efc08a18e441c443f68fcf022489cbdd8a1412523cc0e427f5a764d7f55441e53c22350c21f64d8429688346c220945a6fc08e9248e0c3f7a98e407a993383838b5d6fa83a3d75a712a025aa0a005e5cf3fa8fcc71122f8fa1ea0e307b6ea7f80c90c2aea45abcf9b4f969eaaa0ce850f07c30ec9aa9d3e3c7c82fcf8147111c46e5db3eaf3e663eba4e64250b438436f1f2da375a3872388f321c38eb1fda46fd30baa7ba2c8f4fe7aaef4d818bfc97dde76649de438d706b5dd77cb7dde788afc3fad566e3c50d65aaebbf154f188e91bd623eb1bc491697cac562b10b4f52cb56ed3c37aa2f43f1868eb5cbf31464a46453ba4b0f406f479db41c4abb5e31ed45af557f9ecc63a33ad7650fbfc3868e7f3999f4f1d8ecffe7335e7bfb52399853860efbdf7fbcd351781b9089d53707c6539a62e9c31c699e316a594ba5c2eeae22c976b246946dd62d18cc1d103afaff26ceb5f91ed55a2946959966999a6f47596525949785a73eab978cdbd2359d36f9953c33f1e023629895b039b94c40bb677d757c6da9bcaf6ceb33ccbb33cab4a9a7a4c3b908aaa8ab67403f4792b4a5244a43ba0cf5b118ba2eec1488b659d7cf2479276fc7d23fef9139f4e071ff42f83fab57f32f2470f2889f9ccf813d1cac9fcb2a8394f1b29c5948ee4ffb038f5f8d36a8e8b7be3c7b5a6e11873176c5212342369bb66b1bcee81377b9f53aceec59563a03ff18d3acf3dde719a3378ee75a30660e76a91a6dd982334ab1fa86e3938ab9af4e6e056d7d6d7e93adda7d7cbcb20e5bceb74ad5ca73be53e5da85e3535d1e21d6df2bab17efd68936d82e2e03ed58ce4e7a2b94ede85fa0be55da8fefc5e1a9afbf4259ed626d66bec78e55eefd17cb0dae4791d0f5179cd586db6da68c6fbb4fab94fd76976562d22b114f526140bdad46b4e2d2afa5b11ac02293dad74cfbb4f5ce6f87daabca8e67c45f6b134e57040da902aa6951a2c9ac632e740c5b4529b2cbf4f7fe2efd385ba4f35ca456d4670516a5b515a54acfb7fce5b755d47499ad547699dabd5d66a57a3f5eaf7f18f4fba5a511925298e8e613a1e07a15b1a4a31a7980aad68461dccbd1aded9101bd48c24a594f6728d765c61ee594edace76e3881506e0cdc0722afb139677238a4a734ee1e276c47983bfbce6f5e2a44d41f306b8538ec16b242da5b3ffa7b60e62d8ec2b4c29a674e55118957d89e71f07b334303a8be9bdf76a35f598b1d53a96efcced080fa7e66070c32b4eaad85f4eb1e23a78bc2b8e41c5b33fb1ba239d7d098eff533aab2bc0ea9a92c4d9bc740bfabce958d2f1d3637dde7244e9283b9869dd3675fb48fce65bf195868508c1bd5549ab3749d7f33cefc27432d7e2b8cbf1fbdecdb3f7ee67f072aff7dd4f6996d18c83d22cfb13340b557083cb29bd9996f44f7937d6ee41ded1aabf766fbf3c1b49ca2bade6d82216a5619b6534d33ed33ae5ab157d8da4aea11ca7cffdf71dafa9dc2ed5d738922ab6ce334a69b675f0decbf18ecb60e559b67ace16dd24d5a4b74bb668a9e87e77e719a59cf4c0eb97d351c5ee39c35e5f2aeb977e9e7d89ab625f4faa9334c92e556d9702bcc23e1ab318539eede77f98b70239981884aedcf29b58c56295e65f0f590f9e0dcc9a31780dcc3e62b5baac4a29ebe361eb3724a86e39de5d0a8f3e65ad78cec0f7cfd258adb15e0db056b0b6480c701cc771dcf3f8e51f5fe141ef3e8fe43837aac0ddd62a20cde1f6cb3fe2729d8ed7cef187d9af36a1f457fc7b0ef2150b966276d6cc1db0ac9104398bc562f18ec53bce1a3f3e5774905f1415afe817a662f76fccb3eae115e0531deed3c7711f77c7112966bfe3e5f672bbe295afe81c8cc41e746f767ce6baa27b3015b8776fe5cba292cb34cfb37154c6ddcff2eb8d644d07c12ccb33229d5bea5f02f1790684ad13017c6b4713502ca3318f528e13514b6cedf8d5e3dc37daf1e74bd84fea1548a7483456f997a2184df9072307f4252c87c5e889237f4a2ea24a1c23b5e1ef075b929b932627283bbde86ab3699bb6692e365b929b932627a82c54a12ad4942ccb33305ad76c9b1b1e137fb8dc05a375cdb6b9e1312efa6bb6cd0d8fe55916b2e9265dc36d49b42dcfb24cdb4a5db9cd56a90d83b6bdda3acfa29680f685fa8ff7f38f355a6fc11c7cf047fce5bf5aa7d845eb5cce75f29796a88915f778ed9c50134dd40438621aafb77af3c0ee35b0fd3e9024d82b7d123561f92b51131fffcbbd123501f2cac52dcf2f7747318cfef8ece416bbe8ef36fc2686833bf99d1c318dc63ade413d73e69603c727919f74cb21d42bb749d22b27ea75de4490ca790bfc12c63f5fa2837ae6cc5e922dd51c6fe9c191fcd56a5cea35a9e6d491fc3a18ae4df888e6c23fb874b93897cbc5f18f0b972e17a6b95c2e2cfb1fedfa1f8d35cdd769b44bd3600c8481301006b2658e9cfacbe8f36664b3e4ec977b718cbdc7de63efb1f71e7fc174c88e7f1c84fe30b2768cbdbffc3fee690c5b759c97f1485aad5f98bff4eba55f2ffdc2fca5398aaa359f1debd748aee8afae356f8d282a7e8d28280de62c16d7af166f751c6f912defc547f26968c696d57cd249f548babc174b73974b734b63f5f3d6e87116d600ecab91ecf8e52328ffbc8ed3ffe9a0b5386e61a056abc5f14f0b97ad16fec1b456ab8565ffd3d23887d5d2b3e6600c8481301006f28e20d1fa01fabc1d59e9600bc37440e8d7cb59ebfc91b6e7d9bd5c5faeb3e6f9729dc98c4307e4f55e9c39be6307b56b1284ae7339c867de00e499a3a01a733c5259c7bcd3917c166bc4ad9c716e699b6e7be6ac91d63c858df61bc95187221996e11f5ce21f4cc3328c8b68ceb8c5bdfce239e7170cd30f9108a8f44b9a935246a301000843170000280c0886c342410e0421164cee0314000c689a365c4026250d23511445510cc3300cc33008820008020008c02010c61802723d000a6a9b8dcc186e4bffe3fb4fdfaf9bca47bf4bcd91320bf9f1d0f5f159fa5ad8101ba38f2655d947b54f5d5e9ed3ae7f46cb0f7a3d2c5ac7158a3e99e2c1489b2f256d0ca989984cb813f5fa1c3d8ba414903c4d52524125f03e21e45c2eb89e75be867eba8d3541ea07d1ce73dd85949fdbb973b91812de62398ae7091aa09990b5426d1120221a3a707e1c8d8fcf47c239bb71105da9cbe53dfedd9f28eafc73b801ad076fd6b188f75756c702279fd3974351200aa8ef3361ea1263f4269c9ff05427289479fd78a3e321899542385a781b8857f42b1091bbdf6936d9d9e42824d1af065bfc393cc0003f66a0abac4d51d9e3e5ca8b0d8beeb09b027c1267a0a17661621a1b39a45f746aa9942c8d284597a3b666cd37d71a97b19699878710460018e6f3f66b9d4a384589404288ef7438ed1bf4fc85ee145c911a6c771876aa64fac9ce98903af46075c31cd862b8b1b733ff4de750b87c227894653dc09248cdd004af27ef299c81fbaa3e98815bfedfd1b48bb6f0420682e8430af8b953dab3406ac809f71525eb24213336854504be296a4e76dfc2799702a856e6a01114aea6e2293a1a5bf1d55f0b7b92c5a0f46fbc2319826ec663661891fae9b195847c95839e6036b081b56669729f08d34f7c822bcba9a91105047b5280955ecebfe43c2e8316002fa1b1646a4ed8e107c79e1cf0321aa517ba67f9d19151b6c46dcb6c8f8689d877b2f9bc69a148799db2e71b2e2d59766feeb6651912049309fe8e903016c9cff78c4ec40c19cd473ab158038e012ad1f94196475b1fc4469fb5d6718c3b9a0b7f02322b176a5f05f2d47f4ea038c9565a7a56c7077d2241eea8b4b8956b15ba593d00d137e744df6b1f11677877979614e9db64095adcc0cd8b9ec6121f9f37bd870b2af094ff4b7922cb67667951cd0b121009a39a61ebb8df0213196a6c9feae3f749f125956b92eb944edb2ae4fea8740273d78b7c1b8f07db27dd667502b4807b548a67fcbbc3c76bca12f6b6e5bf0998393c5cf0b42abb7b9c3f409d87a09703ed125e8b21a6c794aa794adc63657f3096f0301e3d2a307f035b0f099a6d8261e1d1b018513fe2fad02518982a8d4b5a55425ed685a4cffff87592ff7d9e5e53e1acc48705bafbf117d953213dfe9dccd4783a19f86cd39d5837b5ad6d275bf8a6f543ed949d92a0186053588ce380363ab655bf01d4501a8dbe8841327b1b5e7cd6829f89aae5cfb4985693f003db4b096e6408094d8aafca98d3c1030494a8d9fe0b9ac08443a78e764b7068f97ae767aedfd174236c6895c5a3adc79f261cfcbea4908bed05aa1ad9ef5a6e8361ecf67412baa8fd780280789c9daaf834a94a3b8e398745db7cbb6d338c5d589170423ab5d7d7063c1e0ea3c34161d7bea59afac356102d409200cf4a51537098635f47cf340531e732b96b8d26437c504b4c7ea0b7af91000b6bfed34bcd724ddffd1266bb1d8accbd94c952f6431f335d9a4294b9511247e73fc91b4d65446308fa67f1068f2283e5cd4ff2a3cf84671deb422ddfea0a916cdb93651553b33698954892afc1fbeb76d7cdef3b6198aff353173f59bb14caac93f1c2390d62206a1c8276bedf510cabc12c362986f7c90a8457e666a54f65bc26726ccfef864f4e161004781b4aa4aa470c5553a30879eee947bfd4f05f1cd383105d4a4f471f853818c49339d792e5e297c3af0826da51fc440418ddca167314e778cdfbff1ea1b5d4790d754a5b3c31a07bc4160db0b59c849efa43eaef11c3a64d5b9b3b1a4dd18e36927251006c4eecb92c762935552bc6c1de1798000c3a89a99ca518e094c8a589eb428b0b6e9b0568a79119d0502b980f0d71d584f2f693570621e0e0e448743d28fcce3182bc7573a4fd1d4099589b2f475443f5329b3721c41b18e8a53311a0bee939b4b0a3d978ec54cb0df71d33eb4504ad7ab0b983f6d28326b9546d154d0339b2467e890eb5e765932af06c5aedfd3de27c5f3bfbef8f7ca57aa2eaafaf699fbc89817cd9bd9bd47c61fbc623e24689d4f899b649dd31f7283069d4ee65ca4b1d4f48460dec0c2db0f38d3429809ebfa9456f60ef0287f58871575a0938b082cb7057bc1282bd981b9e9902f2b4577b88d017b13ebd5d2c377f014de0356a6022ca19e503f8818b58b895f5588aa20d33d2cd84cdf0e112b1af278bfa0186cdbdfef40c82139b6e4b5b0370f04c2d605f8bc70a541cc3c2e4fb773c24a81a6e29f556c8b1d3423589ba10302d55724a0e130df0a3676edbb73d4585155013fb6d58c8197733b8e6c2d6a39fceec87c70970ad58d404ea36f5f998242b9d6d8046745631dc84f0a77d7496f73ab586cb0e2855ac4fd4014aada02ca73f6f2bee9724345c4384771fccc976cc9e7decf29e9fdda1575b26dd05401a564f4a690bb971ff7d66d5ff1aabe0737e7eb7c9b4fbbdf8cd12dc8f060672e89ea2b46260ddfbff7a42e84f0cf250cd46024b30d1e2f5b1e21752b08e03877e4a88c1681b9b5fb7f5bb8282ac90f694b79345c1cfc15f13b87688a30dbe84ecb856eda06b707b8df589e6b54d4c2d51939b49fe0bce30dc4a899e79ef6bac3ee8722353a99ef01510f0d1dc4b5bd5ced8f6efb50492f95ddb3ad0ca8065ee4d17731fe4a618a83c1151afd8eb2476f99e6a621856477b804873d38f60e58e5ac03147388b7b63aa80017317421a1a8dba202db9fff721436bd18a5501a068c87df9b72819fea6e87aee222b1100b9a3b50ee85543b9d6e38f96b60d04d25b8841dce2e68833ec68c358ba953ff3bce1724fdf561405193df4d1571e32e6dcd71d51e706c69002dd98a7cdbde2243e9c8eddcd12334b9b6286c7083edd27f2648e3ccfcfbd8a48f5ac89f9c70f557a2a9dc72e8f6630b8fc0887e758890998478626bca34f7520bdc26110f8b7f15759476c8a8f6ddef1d83a242f51b6a00935230d5e77860b62fcdafaf027bc8ef430f8418cc9126e5aed0a0a934aa1cec7471a03e71bfe63da8184089bab18e7f14bae240428f3cc57d801d24395d4ee20a7239e59d1369208942929da3a8936e4c490fcad53c17a40b8c87f38706d64a04b922560ae86063268ba4309132f121b6490b32be37d0b8803641d396ce97656a933634f8201076a80ba20b572031758af09b267250e8dc568709882b29224db6907ad046bb45a03488623742b9c48808323dbcf6085d45611d8d3275d144cdac88cf302be21ac4ea61908c871e96022041ac067819cac2160469b3984a464522afc5ee4f80cd0d2b2a573450233a10bec21580f0313be0c02cfb0b6e346acf24613c5dbd2a9b64f64073ca05540601ab118e81e1c4149bcd64ce68e267268c96e3c5b1688c1b73b2cd009ff71bbd66c39777921cba5cf284cae8f62073115e21a924156dc83a385e4499b44bdcc85843a70bcf0a28906288294c79294eaa11eda3dd594e04541e9cb8a44f206a3083c2d9862c131ddf97029a53deb0008d4dcd054ee09500ffb1c08902d77ebe21888cd69a9d74613d499af2f110a1313450113ee21eaa1d805a7ae3feb4bc9424403fdb19f2d7481841fc213a1531fdfd0420a5ff8526e0f11320b1e6be37a1927356146232310fe9139351799c08e9a1475f2d1b5393f809a8f70e1cc85a610c523470024b831297e77e8646fe4d25d7cfe0f1aa83f0294225c7c2747f0e0db7c7f3ea2cf48a45c16fdba2540dd8132626e8931b88fd0641e3c306816c6b78a2d924e24b342e848798b68b0bacf741f42e0b831b95860453d1607778ab4ddf95e5cf42b11778a306620dcbd64b6bcf230f44da233f151efe2fcc258bed0668635e5f7513c45462f587bd4f645d657ac6f30e31514044dabfb788afdf4c4eea0de145abcc19dfc764eda1a715241cf2e0ab045fba8e294bb8a6c92160ee79b567a8c75a1819a9fcfb1f526958fb362ab1279e3921a46d360a56e41569ffe46ec7c8ca638747df6c25cf39e35366be10d81834602b2f516cbc13d6f54e2ae8ab1abe53e81b1ecf5d6cab6114fda37a60bff3693542ccafc88bcd7a02276c3397ecb0c682dad6c270d90008a0b8e3ca759ffb04cc827c135829772637977247a37e9dca834dbb683bb5b353b3fc240bdbb4452750113f960b5cb5057328779c66d416a0656ec6c7ee4720d5efb0c9f0faf50cfcb08987d035cf89c7f67b708616fb8ab45249de58e56fc598ac96f5c4cfb915ff9becce5bdcdcd1a1e40d6f0dec1e4c2ef5e52c21742d5dc3bd3574861c18aafd3d0e428e5ca33cd530f1a7b54c9908295312e5160cf002441e2f0b4f5398dbc4d1ca668362b96bd3277d582159ad7f306920fabeb24013de9c5c18eac2b286172908ff52aa78a7aecef18c2637a396ff98ee0735fc2fb144b052fea8b6b1805bdce0b828b682fc851e576bcfdd0b560472afc80b982682f1a03b920bb3cb2a4f60b0548ff90c1f1a41f7d4039a8cb2c52129dc061a68e91073ca020f1460ec0fb6b7b472bc4275567031680327176fc67961120b5e057c8ac0b859b032e2f22958e644d2fdceb5eb000064c36d00690bec8b08f6ca55be3be353b50baf84473ae7b1a8d32df8e44c1fd754fc33a3910b1aa5231003e09ba8ab826b30beef378e38000b8d6bb21437986684941b6524e7631f45362e31c062d05d8ad075b8cc8780491978a9a5164bdaa9c7394ab010b3d2b7e497dd66b9373fc8fb2ffcf396a3f34b00d2636e867b9600a06b2bdeb888d11e06f72685e3919b1819bbbb8b675a77f1f8cd95131d41cacb37fca570d6fab714757ec419ac71c6ddecb1c75d633473d7798a7e8e93d6b88544742e1b08d3b78b5860d52c053695a36e85c9163a095f5c60d01d31a3419585d394a18e0d6488e6eb776ef128df541bb1976309a760d342ecb2608ce89a8e957dc701ccd58504b7e7a8f5bc4452e6a76b11a171b4b5e1a4736daea1447edcab95ac120cbd803016a2e9a4f3810093be3665029c3d1a5f545d88cf069fc19d3d79cbf2d5070d4c2f0c25b9851625af763ef578f1c2480c96becd733a0d100f2460be854abfd46852e9b2aa6f51aec5310063dc99831e1530035db07a20102a17919e5fffe46b1c06b9720af43b63577a15dedc472c2bb5690a00020185fa39668068cba2828992290e08afb2f2b47b84e0b267b21e1e445e8bec2a7dc1c89005e5aa06e0e8eb030344c28a820401c6848a1001aa839b8ccd6b979efabd679bc85d92cdab851d2430230f9d6cb950c85e6095bb53c2ab620134434040608aa73af85ef8ef2cfd6cbc293fcfa9f14274a89973262a7dd61f5c11f3b0b7a899e136351aa3fbab414359cf59251c37c62362352e6fcd812f4271dc110d0cbf23df41fcbf5d828cffc0bc556e1812dec335eb17f2683a4af90795188bbc646c9a9613db35a545983f311ca0fe768bab1f9e418fa4708d89605afd05702f1ed081ca820f9602e9d42289fb6ef238dd08c2b6f30b52ed54e2f4e0869915e798f01c3149eae1a257ff54ac1d075dc88ca768a2881e0bc38712b3d561d883e5b0b9f1af543640ede3cbeab58a951c846cfe0ffbe7867a4119f7f1b245fd988d3373783862f9066c2529aabab0dc9a02454101d88f79cb4d5f60dc32cd907feab74acf441012288d9a5128650ab576bcba1a3244c9d92a36d659f33a1a8d90e7decb282efd121b7afe86a3110c7d66f5b2c9d95e89db185baf538b8de3d21fc004ad5437cf7b8b97fb6fc06ab91a5fad80d1806402f9b3a90f60ffe8ca0507f9a3265c680f40c075b2802f487b65821078d4f98a07088f980e1151439e0d74e2b6194b2a08361502b4ab49361c914f2029d3b299c21b634a7e7960c907e0b25e34f4448d2800f6d27e2797dfd40b9c766257d3c66031f4bc6df74dcd8da04551b133a0a757828c49cfd98e8325e8787fb7a282defd0f32bb2a1ceda2b2e8b60f1a3890edc7844cf25dc50439087bb2fe790e82a7741173d76ef805ddc1ba31bb4f88a78c0ddaf8be0e127f059c3bfeb110c1fcfb402d7126007b425a1582c40e1e110341721eee38ead5eef1e6f1db0bd02bc363fd0a8f0756610a792bb96da8f11f91b2823e2e3b3f2f63533b66906bbc7a19a06d8f72a7a0a854c60d21245de2fc9a9bcd429c166587d5f346019a418677e04cf4cddf01e3c1d735ea237133297a86bafcc7f29a1f12b9968a885b4d0c141ac6a209cfc54683ededbee3d24d2f770d0bda23947e82417b43f1a874f63de8f0ecc3f397da24b0842724121dd7f309d6682909a312bfb58112eb7a0880c13b954e01f2763ac06870acdfa7c7fbe9cfe91328d85d33cda84611ea3a7b8a4d0267856fd0926b8613893df5850d4bac7c50b4966f0906cb56ad42d1b003a7f2bd38763c2b0bdb65afa50c6596fb2d38c31af8a099726e5d7c79054251cee9f0f949fe32b908ff6029dc1c82624fd2f73f563631077810637cde1240d87197908613e843fd6901cb4deb42598b2be0a0ae0371167478550f8701ea63415c214a9031e383d4a3821d3a3aeecb3a56cd2fa5e3bc68759f6828961f32a684effb617319f289411475f2465deecbabeeb1789ea79ccefc05503c41ffb0dc1fd85e831cb6d793c706a8a437c5a935382d5fa1c09fc1658f46d82122a9f310e154037e0851b68fcc170c08ea2cbe77c77fb2b56a4cba7ea2b6db61770c400ae952c83478c5df3583e69ca65470b36ea9cace60e91d4e990b0555df73b08b94276a390374f6328acb77bfebe018ed981ec00297f792c9f851960266bb30b67481e89c3420ba85ed22025fbcbe4f8c5d7b795633d77efe41db3581efc3e4f063c880ddafa299f7e7da5977959a56d77f050b7e8533e39310cfb54721a6d08f6b24e72f700e8aa6f29412669eeb87bfb94cfde97634930b89d4c307014a56756b6424ab15786394404fd7fa027f96cda173870b784914ba0fa506cb8b8c1fe38c55c74dcbd99094f5ce9828d133ed19045ce2b9139f2f3e81ae9eb3a5fd022a7c7715e1690c7e34582995a554c04c946d266b5ebf5ec21270c235f2079c8c9a70d4b6202ddb71e50db00f96c6c4c6b7398dd4325d1f8769ca18cc71f64dac6e92b0b17b7e33366707b4606228b37e1cb2fe67f1bfaedf8248d8ed6a8fed3a1bc03c4871604f0fdb0338e4309922e80ee6b7c9e7a307051d628d1d297ebaef1a9b837f8ce758d894010b56fb4a9c5dd19c3aef1d94fb8c41e369e2139ca750ae2b7e3f379dbc0f2b84d6fa1c3dfe51aef8c0ecf96c6f8ec7b68fa509f413525dadfa1c1d46fc4971f3e63422ec469c68a4f4b59ca06587201a0c649ee38f129ae30d71120a7b74fe2b09088c00b44824ff7a10821ea3269f8a9794ec3905916d768da784c1ed96bd5a978f05f4e783e7c229aebeb55b0575428d9f44f3a0a832acc97cd3a7da4d2f63daf408b51bec6b03010e6d8f0b9140b34a02b0782af9f52bde144ca08eb86982f7d274e5e85cf45e480462501096838872a7c16044800dbe0c53c43fe5f8aa5f5c2228c3aecd0be94c75b2fa1dd64fc8dceef5179fb20921fc05d0d43e10e62b28f736c8d1c3830f5b2df3be0c7b49feefbd737fd14b940af7f8718490f0be2222810d889d4103545f1b1b9d5533c4178c7c486b3a0fafebbd7a740b0e94c0005f34da5fb807c87f9667b0bec78faa30239d88b1365b98099b0360201a9da6a1ad990df6209471c8d582a468625cef97ece84dbb1a34135ccc2f0fbccd88448f80cbe5e885ee3559282348adcf6f3d549a49b05e054cf963d0af5566902a1c2184645134a479219eecbf8154cb6f6c068c365a4989da7d8d06aee6dee65af5cfce5159b8201fbe90eca055fa2b544f964df80047877195ebc0a33804b4571339014883212309ab378af90e9cd86b77c3cd720e82da6f8935b980185259f9d068a3649e0ea01cc4c7a3e8c756b20690bd39c7ec972f8620809146ee58af297dcc31301d36150026645a433f14ef21d7f465d38c2883b2c4ea29400d10f86130b579a51e5f132564d4990008375b1fa1677ebf762943c144547172148b34a6904b8bdad3c5a02805c4e5991e46ad05c860f984941fd509fa40371b534c91de018e68ec9d8a592f2b32b7973916fac2fb4702eb613cb2a60b0a3f852fa78942e2fd3fa16028237098f769accd613f542ca94387185de2a647cb758310f69c93b6b281f2315a47188d5b9d8f16b3dbe04ecb4cc53fb6078be38992828a64d7aab40e4103d2a656da24bdc0075977ad8622f82011435f050ac8f9e947cb54a6abe89af0eb0b9f654d2e7c2cc660fb7f3bc2e577c3256645b27d43544dc0086c15df556f2b97c97107d9865c3a0c13016df578182f24ba307f2c5079ac087c36a588744c23a322a7ebe4a3e4c7d01f7eccaed7daacedca4e01b47c631d84e9e9730b789c57622501ad648a2b3d48385bcdd3534f456300820a8457f20051d84b5cf978232d2f0c71a9d173d89c71a6cb799a3ebc7282516fae5cc7eda21ead7edac638437c4b3027e9f8387d3a8549363bc6b8ee5b59bba7b5094cd6b2797cc0b47e9f03385478fc9de48ae2b186bccb8ef2231a4192efc559423128cf85363bb8ab5fdbd508358223ebbee8303a78be23ab9b8db77de115b75f21cd3e1349c6fdd8217b208bbdf43a5c7f57c7c4a5081b4524292149a8179bb39a7ba2716b37dcaf58a844d55a70a898648d5e8057988ebf9fa0dc3126911d5eb1b8b1a1cca7a469420981b56d466164caae9beb8c0fdbc90496f33395ab4c3de7a98565282384e192812f66adf1ea04548d8e32a4a0a84b8615d6d6301c701af539357955eafbdb1d82660c47f9792b6a999e3fde7f50d5e4a7120b708bdfe9f035e322ca3bbe2554a9ba62c52d6553e83d9adaf5b311b857bdbee70048222f35ba6f219cc6e7dd5ebbb03eeffef75475131f4aeea500f7271396e728bf0819dacf37500b4c64df73d1b9867d9535e6a290282d6ccd272811dfa7d435026eda4325f956a16b19b4d439408139cd891248602f9b07c8bfa5aab979e911a030899de8ea7f17410b8cf9a34c6683c16fa727ccdf1e8389e0db4a6fa3787ac5c044772b7386c531a394c691cc71a4ca07405953201308723504489e9edeef22cef82d7e9db16b3a8d91ce6b030c2e05d35c7b7050b2cb5376e507f13b39f74d9edd1c2f78093b0b9afb96c5c6ff44fe038f7cbcd6414bc1a721181d59e93ee8b3c4e56da0e5abc8906ab03f01e0ebbcca990c473ea4deefaa3f25c0349bb98df20becf945284062b969d18affd93b1232b0ab5c44a4db4bb89f19ff3fb05864210c0566a2696156006232171408e09c0320e12aeb34f5b75b09e3dc6e637635cd357e015d7ebdcc50e23c03b4b02bab5e42e074ed80ce550982842ddccc10e5a843a4cbc71ff982c210f7d386f60f0ed58e3dae42389cad953aa67fe4e0b4ffe3858b6a6352af75ea65a4dc536501a6d79088f43952a1b52c37d764141affdf03c84f956e881a0fd783c2029dbcb8216437de99a886cb044dd4473d7cea2aeefb07f377b166243bf3e1e2d46d0d4c2920906d3ed194fe33f11a185e230622856118c0edcda8236b37fe10d41c33574d51a9190f935c3f7a5d927f804a68f6d4e5439d38d041bbff16d3c9ca5d0472d42ccd5b099822551c5365e07caa7774ae615f6b09942286b621b1fa8ac1855d66db532e0f567d0d5f49b68ad4b1999b4b47c05088eec0c9d95e5a770ba9abc954117c6674932d6ee67234e50e074e00814614a3d67f1acfb69a22d662d2423526b89c2d243485fb48ad42e0e13bc5416ae0c692007994f4e08676e87dd4b6bd655213ca743fcc6edc9d3d3235e62cccc4260928c33cb591bb390a160976f800d1991b18eeecfad9b411d96306b7a06891f0cb6b7ed760f76421bbcb11995b15f4e0368e3c32e3849137003d2af8fb1a2f927d28f306b113096e71f0c8011c1eba609289319d2953d7df1e37e08a150d9f3a1b6ed64a8b9fc2f248742950bfb1686aee6cd612088602a67708cd6823c6103b6ef3009f6746f830f0b11ee2899a068522660d30a2c2e1756731ae62338a7dd838c7524b38d7e05e5111222ddc61c815ea31ed593de09b225fc6c14ff565de4fbe97b568addd63ae123128aa0c359c2e4eac06565dfa06e44c6f89474508499b578a978903035e2e53627706d78f77d9c45570b040304c029e0e8771da083e5bf88506d4ebd489aba9b21aabfd4588c951251552a9cd1608141bee7d4e62f7741bb9b6edcfb50a70139958bc23d580c03697fda6aef932b363e621c8eb12e078306801a4d0cf172aff583423a86dc213a8f0561a804767b0d9c3173c6305df725ab41683d05df6cfc5072de6cd3d2d651addf5e76a8e8da9f28756f237a77741435753e9e887d461eade37aa6940e169b093d773d111738ab6bdd5c971403002f5f49662e7db4e9f3c6ef946b6690381c62bd42fcfd3e9c94d098063a5f81d438c5cd322e05d0141b818a645b26a94afcbdf91b0ed8d716c1f8b184ba2e527e0b8661da6e0d6f8e1464c5cbe50adb3b370e8f610a65427d741ebbde65c4e01a48c8f4c0ff62dbed149b615ef022b90c963b9f438a33ba416a06e4499d8e53c8589638a9c37cb23e0281c28f42384e36bd1eb07b731cd2e264e12355af1796470b72970487234dc1d8b4875a1173fd35876c05b91331f0d8aeebd57a677059cf9f415b8b1c76b0a45d1f7147f286052351209f2d7c0b5a0b34f6a42b370e48a468b4a73a12a2a95b81bd0a1b1c5236b868c890e2dd6ae89088aaab34a7487757668167b11b8b0e362959b37a8bc1f6242839db23484c8def2a38fc24757754e946bb4d66f1bc528c366dfdfd480c9bbd0af4a78699d8b1aef05a48b1ff2684ed476452a3d195442ba5b260e71f99859191e086b248638b4488c64143ba5883ca4ee2d57457fc2dc616ab16288b050b2e15ee5a744491f06ffb16bf85b882629162b1a4c2bb253564e8e6a13f2779b99d85c858745848f7eda07292548ed01536d824437637ea24986b5d516b71b6d85b70abe85401a9f0f45305dc32374f47480e9af20abe15a22ba857a0592c2d3a16af05b48ab416260b9d85755a74a41bca57bbd13c1d0eb9a4953bda026a7692221b079d14e75855d42d9a2d90ae85a1a11bda721a15889e4a2226e906bd5106254cfa9a3bab627731da57fca64154df4262b6c016542ad215b4a8e0b4b809be491b1eb7d00224647237f624e4ad5ec5bea2c3a21e0ba85124ef358e1d12841bdde2862e298936a805540b297b378e4e92ca41cae27616d2271a478d04ee5a2cea15e62b7416d56da1c68b7499c6412485716d0bfa9293b66cf159d4a8428dca24674d6905df0af112d3e957fc1635aab0414972d0942d9a67d1214662deae6f01b59fa4aac68126dd3859159fb3f0544bb2756515388bdd58a4a79d94745db778f22e29b9452b2e4b5e8db798555c5be0a9a8b56055f863d1a97192321b87ecc1a879e1713d15332aea02b21a2137685e2149c6e0f2e01da17a4a4cd4c75d4220507a9215f1d8916f284a72eb78317667b5605b8b8e6187f94a7e7a1a0788168fed7f3d1131c986326d0db4a21f761c9149b8b4859652f246a782fa0aa8b924636d7605bec5c6a265f1b7105b34c5e2069a24e0bcad40c1428d6712c1360e3652cfd9cee2c63fc9d72e0d34e9769bad287cc5530dc96e9355c0b1d054c1b2f0af1859545ba4aaf065491a27bb462983486ab89d159f85b845c52265e197161d1c2418dd537312796d1c1cd2ad9a0d14c9ec5d1a72d27fb71a9d24754b5b3ccb621bfea475933269b959ed0f82309220a2414593a08deb9093bc699dc5cb2e416dc3cd305f4742724db7e8d893906f835808f69ae4d5f88a9aade0b890beddee2d3a649380e94ea82321ba7a85eca18d027276d7989584a68d83fd5e4b81cf1a9914426c6ed60aadb509b6cf0f772a10f1c1a332a30d15dd0ec3396877cfb0224d9d5f05aa16b54f2191a071b890fa9ded4bd000c289b87d3dc9f066839d945f9b7e851aff24950d5d45bb0adf626ca9e17c5f61c34752d1d02db0aaf02cc41694168f2a750c1cbe2c91ebb75d54960babd6d0fa307015aae2bfe80bcd4dcbef9545ce8d82d2f9780f5cfe02926333a10bcb883ddc716c005d7caeec8480216844abe5c1dff28dd24b1dc4a7ce30c6eae0d02184106e595ce952ff17f34fc491ff22b700e8e77539dd5f4f42a5cfe516ca700c7cf6ee5de4eacd224949947c3a41143494369ddfcb1d84e93fc6f9187baf5053b5fe42c820e91692043e20ace6e0761081bf8a536965ccbc79ec5b56f921e3744bc46824c710fe6b801ce303407ef7f78835c8f0bda98c4541c1ec9d9922df90876d5a03b094d5388002682b5f84988a40de5c8118c44162bee7a13467b4fc81f3e6da5a587887923445c2fea0b5983cb1a141fe2e4717afc59a13ac3c5ffac785653a1a0eea9f3128af83d290836c588693cccc699939e999c2a457fec8f64cdd4618736f906d462a3f607d814b5f81b3f13d66d59c0d2f1a91d402d47b1581cbdef453c6c586462161351a96a56345cd4077f3750d9a45a43959bc64fe9bb1d0a0929358a9871944cc804bebd2410a4e91acc020acd57ea716fccac0e79c284aec52f43dfdc42a01a334746429c49bae726a347f282b8eb46eb6f51f54a298e72a4f213e7b80a10e80075330fbc564f8df3eef71a92fb20415b902cad31bf4553a84c7f160a1ddeb1deec17ffd59a0117c33d2df4602b111c80f95309a284960ac0ab6e6f6aaf4daf2ee426c5c6408c1c87c05b24421a481f897f259fe1a9e72aa87d1682203d6ed190953217041754e9092af5182c74311809c27e1be9a67eb506b5b74165cf173755817819e9023aa5e779fca90c7a8c3197e3703a750d5b61e0514bf0ca3d342649f0ccf69386803d54fed7d90858d77b2a87051b40535cb9ea3b544cab124cda817ecb738bd04c8d8e50d6ef0d1229ee3084b517fd40b89ad2829f18bdc179f82dfdf2692102091c282df3aa0841350eb3c71b0d7b2089ba38928a1d3e2ab076519d90666079dfd41f65469a0eac9e3073d6cb3539dfcbd128bfcf5d218f40bec2545785a498910641dcadfd6442828c9847741d6ac548724a509efdf950fa603362e126cad60c78231eb6bec6c0b8a52916358a5244abd7078940abde6d037730cc6f310f113bca2f0ed9807a5bad2237f6da1c266c45c1f2e4b693d7f49d52afe4c672a8d7ed506ea3d1918a122c8561816374d8abcd98467c95ff22c43a0ccdf87d1e2044f400e531fb7c2e2c32df694c96feadda4c79dbfad6645731b3677775ee846e599ebc14874aaa5f94c1d21aad8566b2a405c2fab6abe603a73c6f7341e48b73052cc376c1fe8e617109daf7378c653df7b6b8be8f433713c139d7e66305a241828029bee1145465de43e5308ef2149cb1909a55618a700871b8a767f07bfe08ea5fde832cb3fec1dac4c1d58ab8bfb416b82a96d147ca0ce8b45de704ed47723b8483166f748b2adfb4596f1b838fa3d8c0c4e03fa215a6a5c4016d6a60d9d35c27473b419ed92b0dd585d575cc045bb3b66a6a966ac657422f1f607453175ce6863968a35c7bc9777f1736cbdfc80543257a998c6c1e70b2088150167b40dcbc088ffb54548c0426b5434b196104224b27b73e50e7e0694068c06b387a6ff6b5d39ede0120ded1217e4025cdfde79e7bd57c313fb994d3cafe7b3eb66d98cf69fcfe769a0fee49493afb97ff257a7f31ecfc907777017447b3a09e8ce96656fc3352ccb762cdd7b6992f82023205965add5567949979aedafebaa15c7482446095c1fef154b75462a670d30100b707dfbdb7befcedb81a2684a23608661da73279e9e538b5dcde7b70cdb4e7610dd79bacd743e45c6d7dcc7fe3ef6323e0b42447f6474309e749e871b3ee982e84f27018d3ddb964d6ddbe0679d0b5fe0cfbcd2bfd4e17ca832778841a25792945242e8c15a83e8e936644627a57452297330d6f0532247d3b711640459e263cfa284c408c402ac816280e13f9e0fa36108e6ff29a31094524aa5ec48d99112bf863bb2133bb2d3e9c80e9d9183e73bad156a6bbf73e7f6747d1b5ee3679226c9c1c979018e86df115ce8794416a84a6107ec435fe1362cbd0e4499eb2b110132ef0ba537233b09a597836d605f82a406488aa0ecd390c9477d1aa9ebcc6a75ec7134c006ac66d96758ad58ad17eb30c730af8efd25cae8a061b3629473aae786ab972ed41fa5e2ea412932fb5005857535488fc2482f3e8db4ddc6de6a31cab7e106e952ebd3408d7d2663ccda6b91ce2bbdecb34c6615467a18f695824080af8cf35791527635a3d169b41be7306b902e1bd7fa344a9610197d128e066458f658d623eb2a50c56ac9e751924272d329722252b236241e44db0f1d7a5400070ad8e00d3f56a6693283b244b33b9d73c648639ca50f8710b0a4b6f9670f8a19f6fe11cb8cdc8f1decba1c12332c62d8e390731c026569db7248c44adab36c843764c5c741cec49fc1a40d86fdb015c0210c1c9a2f6d0858acea2727582119a2a3151a7e3350a233090a02efebb307d7001cd24382443c7d8898e290483a19754087fb2e29e0374060fbd706e0e8c131e007bc43299e678c9dc7a6cc3edd8e272d1f66dd0c9e0e7e0f6809ecb903dadfc8d5237f2b9ccddde98c13e74ece39f3f8f46d47a40ef201d3b7e12fa11c66e86f3af3c55eebe836a3514ae9e3d9ed1f7a8a74e73dd83dddf6709b50cfcd8d5c1fb11c922e565e1b3de07d658a3fd4fb3acd349bd97fdb6143362b64816ffde4071664f271bfde4eea0c440df2017bbe87a66fed3cfd3bafe766cd1f74034c3f43e168d88713a35896659e14fc359eb78fb37dcff541f4bd9e4e0ba2b7ae87a6350cce0dcbb3466b43f488cf25def8d70f89727ddd66eed77b6fbc571663846f7febb2eebad16e3331deec6117df6af76f47358c30d26d067617c2ace3af9cc10e34c23ff4868ff76f950cbe6639140d6dd6304809de346a682a3d4a51e40bc4d765461878c3148a7cb1e12bf4e96f189d27087bfb0d506511c757977b3dbd386e246156d870830622026fa892807471678900e7cb2a2809867f63fe0f89a2e908df6197b197298375b75215d097f5af6b5f7615d65a3fab7546beac9dcd3aa8cd8fc3e0388ee38208228319449a734e381d44c2fbd290906a199d9041f9c560a5e10783d60703283e1920f1c9c046d3344d73bfaecdb9cd6079f7d0b40eba600ccb1a6e9d7675d8a5fdd651ad7136dc068137a7df632086fe68f8c500474b193a82446e33f1b71b20206a56b5209abef75ffac578d8c7b285d005d7c7d29335a39c00cfcb04064834fd0f06456030e46297587aae49cf2776ecffd2d05c83d5dcc79ed28c37c7cd88ce494e079c9c5b9b770df6f73b62c9114a7c5fbdd1d01cd8cbefa8be179cfa4a971ca4be3006662cd6486cda1bf5674c400e516bdf74c031c6d0d7d3941cf192ba6e396e1735d6499dcd8c074ce9eb33ecc62d47d431cf28b0cd8e5991417984066805d8aa6c33d2b7fa1746b12e7c81ef753954b12d90b08746350d339419a804f86509cb0fbdceb3d3f303514a996be4cf0932018610c226b0b4d045601009709e3106159c101a68365a53024a410689349b2f6c401fb021c285920f054ff85280c447448c23454040a4a2117b8d5ec6d22ccb1b890e118b44226e3b24667c81771c423b0f72c5e3103006465118d453f3872254bad3f02b020993f6cf20cda8fc48b366236f0f9788a78b5b176d641cc91952c03bf6a05dc33dbcddb66dcb299dafd99e7e677bfa5bd57ee8acb369590f4d63d9de0ca549935e850caa641804c201de9e9ef3358cc26d1ad8bd7f5d97e76ba847765bd3527b0cf374577a327bb86941b4d6f5d074765f6236fcba241f018889983140829ac09b0bd5c0cda06174cac614f0e6e07358e54a803e106d4c30638c93870309992e60c2880d0ea49448f85c20c6870228ae26f3e1cdb2ee422d035a481cf9b2256f24121803b5dcf3d2e9d947d424193280e25b52848a1ac74186a3e7cb1e7c7abeec014acfa73d58512d7651673be4cb07e2c36a4dbe3ffd8cfef061f5852cf1bd6e3be84fe931de8dc77c99c3214bfcd9c4c69fa025607f286be83b01cf8fb376d85f9d0f0f9677bcf62b8d3356810bedef592cd1f1ab121dbf2e19a25fd0f09bc20bbd7fc4eb77fcfbd98d353e8e51fb5b3f76da5fa8c1abdbd7cfeb3331b43fa7451acfd7f7749db71df6377bdb798ff6d78df88eed205367baeda8105a38fd6b4dfcfa36ef48b71cf16b9dfe90c6da8fdb8d1ad283ff23d6f0e1d1f1e6400c225a0a9b8f8b2c96488144e6a9215d760dedb30d675fb36e7bcfd76e7bcfd6a968addb94d6ac5a0c080dfd83d3dbff981a731b0dee4296ed6fd7f9acc39fcedf4ed4d8b6e37aadc3b61df5f3dd519fe60fbe301893830f0cd4f73c90a92bd5326d47ede87b687dfa9ecfe85f4a61e729842cdb67ddf59eee3eedb6ef742a7acb706e3bead5a477a1a6144b927d363abedc018d5d0dad4686fb837cfd0877d435f2e9571e33d7c41df165ae21bd28a1c085ce1a7e3bf852e80399da87474f38afcfae88451aed15ff66a8a26b4817aae918a33b087680d2311a7e51883185165350a1614c0ef12164a95ff30ea2b7fd2aedd4f16b85428570d6802cf099c88f39e6dba79937a286f0696276887d103d3390c883d659738d4bf943ad13cb344dfb2d4a6cc62d4bd9344dc37ed3321df5319a1a5bdcf811b57dd011f09d7fa3e022cb2696bd16b128e3bc91a23d90b9b38fd8bdf72f1f71479681c49981444dbf6e9e6fc0aff18ad1d68f30ba10e4fb14565abee7687945ed1e180335cc3448b2afac7947cd6342ffe9f9ca20f3faf0a4fde716252dffd2c148fb4f28723cf7fdefdb8d2605c8c43ec2f7e1d130675f371ef46ddecea33ecc40a2def573c8817506e45f6faf9797ddf57fe4141d7ebddc41c76e6e39e67b9e578cfa6e3e3c3a03908587f3907f4d2071bbd9e61af9b986fa887ae68bc579832cceb72b6dbf42f1418133b57b31e6b890f44258d3108f1874cc33804061e010132c85f6cb090d57fc370d311ac4d025be5f68e9c663fefd995d0f72e10b7cd129339028a50b5fc418eecb2e47fdfbbed9bc2590b8e347d4b326c9a074f111415de02dff0289daf39500164238220858d090459321543431f283228e788208fe44160ec2e2cb8192cf092620216c35c8c125e38915dcbfb30726c6c8c20745aa9002264432d791219e40c1133f686330410c2300b1e4cb8115a0205c10164f50f104147a7f485be29e6409668004245418c20623900235c25dc171ab261cd724146ac25dc9022414911773202aa80b54bc1af231f739f18920831a680a1cf5c3f7dc0e32c1839ea1e1c784496754dbba941cdb77b24ea7937aeb6860a675fe99dc3a1aa8cd4ede9c66a3829e7f2bc4b61bdb6b52c7ed06a66ddda681baa647fdeded6ff902f52db6cd6c340eb3bf1f738890e5fe8fa92164b9f6958c74d4df0d7234d459bedb8cfdbbcddc97716a710c7d757b072139a4087652d319f59c7b071d1fb3f302b95a66185b826cb14e21c48350880349c1712dc0411125251d4c492595b17b0a9a02cb5905863f1f04043c5d36fd0bc65c3f7f8331765f4db9a8a9a53536e5661d0bd0d4d25f80960fc7f82620265f13453e269280a8c0842802153a40c2a90a4d44461441f235c104e80331f996c8d19a86df125c44110a45c171d1dda3478135e752baf41897c822091531c627e2d76f41d79748ee0de00ad4dba3e943f88223091270056a28700b1a6e392ca0a3f46d86cad8828e119492d261266d2449c3995134944158f9504212b49e5554b4195be00d3f1c11067e94281e65a7428385c50c26ac804a12bcaa70873db68d113e9d50bac0951890935a457a51b4042ce5298efc45832bed1d476a02cb3edd482279f3c6f5ed6f3652c21312356e94807764e9f83b4299f831caf8a194a45468481b1469b305f11e4b075f12221f8a043370dce348b38150d220a474e934082025384eea0c3404a3462bd8b7888c73043de88203f503f4a0deaebd0a385e4425f12607c6c41c0d7fa5e187e4d3d0090d3f258668efb074f11b604cd4fe72bb01b278763c2975779f3ea7bbbbcfbc64088c89930ae805cc74e9fe6eafd59c9ccf90e3e754a807f512221ef9a016e0a84142602d640efd968da595f4621645e0fb201260491a01de1247e2482ea44b2bc6eb772c7935429757458063fc8f713aa8088e9a158378b51b51514944c51bcfdac7d66694cb769cf4ead7bf3aaaabe6990677dff39728133f3483b5d7aaca5a63487a1587fd98c3f46d46be0713bf460d3ad6f7fe6e41e93a7fd2dd8717bce0052f785dbf5b503acf9f74d757ec770bc420063188410c7e30e6b87fcf832d2d28d87f3e9fcfe7f3f9ddb2427769944e463ee93e9e0eb26c1d4eb672028c24b630e20a98962db49041c3cf8a1b197b70495b5abc97991dc9aefe65f7b55744554a0f302625c7189ae62d79c8141df3a996db8d4bcfcfa609fb89844d777d0629a493529791629d99e708b278f6293d6099c3c4ba3d8b6827ed79b367f62fd74c1bd2d6afb986667d95b0eeeeeeeeeeeeeeeeeeeeeea89bc21fa75ab1704237dee94d5e1ab96ac5c26979303ff2d1bd1873dc3f942a19599fe5382d0d45a452c9643a9d6e6e501aa6345cb134841042082584104208a3a99583d362e1ac58aad5a7faa0c3b02e0e6e7132e7378c76c780349dee0d4671a9ff5aaae9a7f8ad538e8e7e92a393249d6489ca4496bff8a36e0a7f9c2ab258baba2c89ee0893b8284b27eb5235f2975608c763fd8a8bf872f839ef43deedd86ca4ca5019aa9041955d5508f87d67f88d0ff09bd3d400d4d334e42dbf6f017e6396df5c8ddf4f80dfde00ec8af5ac006c006c0c56c5c2f0fbe6dfb8fbcdfdefd7d7d337a4ef45e3f5b53d7d85f415d2d86b0cdb5863107be8218d7f7b3a7b9d71d9ca5fa6df0b7fb819dfed150dbd09f857fe4540de17cf9037e60e900d7065b83a94a7c857e45f5c80bc31c79237f735f27e8f00797b03c83ba475907f57f2bed8cb1b7302c89bfb00e4fd316495bc437ab67c45fe8521ef8b73de98ebf2e63edfdcbc80e32ff4e42bf2af0b795f4c236fcc710fcafb6770798728cb57e4df16f2be9885bc31b742dedca3e4fd9e8cbcbd95bfd4d027ef9087f3f6feb94ede9c56b393fc5e8c39ee7ffbed6db9456f27c9f857ba267ce26e1ee5c94c11a5222aa2222aa2a290969928bf17638efbf7bc1d9a32b3e52fb06567cbce969d2d3b5b76b6b4cbd0d3bdf474e9e9d2d3a5a74b4f5abe94a12cf9a190e7fd731cc6176569995af27bb15ac22af6254fef5af25aba57c7ffd25a7721cbbde2dfb8d2b1aa642880121954d91a49bb15260dbf2a78d003d0f0ab62889e3ec0974bf2398231d7378142257173e46484898892764f11e273a3b9f495ed25b5b478de3fc7e1f936a47f294270fc991202bcb31569a4fdb395ffbd1873dcbfe785fc9de42f33ee4b1ad92bb45f293c60bf7a1b991a894a20f07ce81bcd7cea49afbe27bd5068daed019cafd4e76aa534b26e2e808151b4b52a74a3e1a457ed461321cbd4ee3663030f21c021b8be427566350cdb68aab6d9a5691aa66d1bcd46a3d1cfb4281d4e8a423fd3b48d066f345706d176a3d1f6b30b5e515e1dfb347646560804f68fd275901babe9e5ac17d3228c22c628e59c935221586befcd02c3b02c1bc2b66d9d0e0b63fcf91821c6181fa27c4dbeaf89164d92a0254a1819880a4d4c4d4a4d464d8468f99a155e80209b30ef2ab47f840289fff542fb472d80f8b09a066491d7cc368351a280f76bfdd265a3a878d23d8b5fdfc68d35eff67dbaedb81ffd47a40fbb1df7b563ee8876dbb1ed883fb7990b84221a42adbeed229d3ce2fba34817687fa00289861f93151324f4c4999c3e3aa0b7f3f0809e3f8ba8f53131c448a9aa5841ac06d3112bf615d36e482d371d396ebef7e97dd7108a0b97a4e45fff9b83da94fb37a496fadeaff7ab2a0b2ea6e06f6db4fd6bfffa53faf573f2f9601928db8d98d2f7ea6a3e9b8e782fae34a7607f1fde90da7e26b50db7186a9c4aa8061c37e0d043071e484490481729374dbb2e0b1a7d5973dffee6767db9e9881f1322dadfdac772dcb70f377cdd48b3cb19a1d34eaa9353858eefc50f7406371df0ebcbfbd7efa8f7a5adbe1ed357760ac487d510b2f8fff0616fde7207b63be8083fbe9441151a6ae8032db2acc3de359c61d97f5eb8c67f7ad43e3cd2ab4fb37fe6f9c2b9df49725543a5f2d148499496f42164894fa5921be98244a2a412d7dcb3a9cd5cf8a1f2e6fabaddf7a7bee9f09f28e92991dea5a2e174a821a5a13fb354223d9923064db3bc919efc2b07aa638eccf117c9922c95cf0ac380670481cb5cd7e4bb5fb1c27b4f862a420008d100049817603415365c48e5608283c6e700950d29aa08fc0002a0d5047c80c30c96057a50010ec7c7120cb4d0d2c0143ab0007384f040b482c80729462823213e920c12113b289d948c88c2f4311dd1c1099f9280e2c67393e4095407e5440e525b4a0a273eed63925265aa2b9a5861ab58042622eb8aacb8050e702e4e1790452a69d95604e30631a7c61c214b88a8c887247a3485802c92e42425608c24a2244b368031d208136491358031f20864912f4fa016de92c50a578ca82428144a060a85ba99567bcd155064b868d6cb29a594525a6badb5566badb5d6de7befbdf7baae6b659bb9590dcd4218cd539ec49338e24638111abe0b015f9c04efeab2300ed77a99e389423e42a5be297292936826d54cf22baf1051178ca8568b063b08534478fb37450a5899eabdf68331ebf7e61b3f18b3323aadf776d1fab4700b6b5d2d7b73ee07633630f7de5d61e1d26aa5f06f05ff50fcc3fc73ff26adf6c2dcdddd7dce39e79c94524a29adb5d65aebbdf7de7bef9571f2c10508f907533e7221607421b79045b802bedc6857d2a43a9d4ea7d3e98442a15028144a2412894422d1c5f2bdf7e5baeee9c8e9743aa1e0e0e0e0e0e0e06032e2cdcdcd0d2a090a8542a14e74f049abbd3f4530e6122212894422d1754d5aedb5d65a6bedc90763d1462a954aa5523268f7005225857422491247347c69047cb121ab34e1dc16cee1443ff248215942a53ed5ea743a9d4ea7d36ca15028140a85b2015330e5163e41cbf7884422914824ba17c6ba3eabd56ab53a1d399d4e272c4d2693c9648a1e29c327ad28187393a05028140a75eff549ab5dad6aadb5d67af2c157d661060d762e11c7244b42481fa4103030f8710bf8a283539c9b8bc229ee7b95b772d6e9743a9d4ea7d96ab55a3a5c1b8d68f91b2a5eb5544bbfbb9528128944229108bbe1dff77ddff79d8e9c4ea7d3dde44aca38f1495b30c6befcd9c56ccdd66ccdd66c596bad4f5a4522914824a294524a29ce585edd7c73737373731359f10a0d2313299cd0137e4c02bec49b3965ea15e11147fa9267a2acd3e9743a9d4e3757689a37fee0bf6e2311b47c9796cf1ab1930fbe2118ed445997c62ec61cf76f73cc228cf9a42718538f9c4ea7d3e9547355d55aab4f7777779f73ce3927cefb8a44379b4c2693c9648a38110746a3414b11d5a049533c4123221150080da30f508886af01e832f05e8c39eedf8b386e8b80b7d85c176068f9d7105a7e96002d4584efc598e3fe639e2d8c05638a405994455994455994524aa94f777777bf355ff96693c964329968d062b414119671f21f8cd5128c992fbf12015faeab85bc3f9f1933b26ad7d29c7664473863d973cd1bdbccfa9b63a694524a69adb5d65aadb5d65a7befbdf7deebbaaeebba12a081c6c03156c3c8b0d2cdd0f0822f9e87efc995095c91dfb9eef6c1da8cd5aeaa956b75f3f61eb48cb9aa9280b7ad2a140a8542a1502291482412f917a38950b375a2ac12680c6c47f762ec76a4adae2a7fb97756d5acaa595594524a29a52ccaa22ccaa22c3b5bd7755dd7856118866118dcee0559ae6b2b9d309a7f17d23882e3db140d7239c502755330e726e298320f0cdb03ae4ca6a281182a9dded91b0840865d777636070440338f6b8185155064d4cef6c0ca03e0051768a4806c67ef3080154f0001884105867c3b3b88ce08105fce11a484e19fa6fd55c36af7b3db712ca7f080218dfb46a33df5a4e730d33fab95baf6d9d4bc6a557b6da3a1da671567f0eb4643b5f699d5ae4bd3a457b5cfae866197966598a66d34db775edb681c4689cdce0ed2e9b08d46cb343617c0c0da6f345ade6e5c0f6a1b4d8597f63664dc720a10b8e68dcc8fd8a6a1f7bd3a65978002a5962204d31aaacc5172c025432fcb5762378b687f6aa2d5a6ded044ed1b85a4fdef4613b58d7694142178e394486f8c85ad46d8a37294930ff6a8608ca5b9341e8db6af700acac40ecb4b1d969b3a2c3f75587ed361a13aac548795f2947c85757170cb53caf1945ce429f9a8e4248f4a9e503c2a7923c3a3429d7854afddf3a856235f712ccafb4958c6a38c47ee2bf795fbca7de5ee2bf7955bb76eddba75ebd65530663e4e394e394e394eb9e314b6f2421eb6d238e52bfe598a0deeb05625edd153b272254d2aedd2a31a69773ca21127de4c5f4d195bd24e6dc9736cb7714afbd7141bdb6d6ca5fd2b944149754e9a64584b7b8a10bcad29e5071cdf864c1101de765f6bf297f9fe79db9376933561ad784371561f4a3422954ca7508ed77a1c8e8557572533a1359d6e50290cdc8846a412bd41a5e22ab252a211a9643a95ae54b94aa5ba1d9a8d4c87a9e2d21a6802680ca581c2d097df2d302673794f86972618a37d7c082f073d027cc481315b0cbf5bbce7f005c0ef160f761cbef1468719bf5b2008a6401ad005f802e47eb7e88ff7faf3c1f0f336600cfe78618c8c156a48400c0d302f79b7b82060860318a025d45200961a2d0358f104108016151872f72d2fb8402305d4d2d2020b8e72b24287727272727272e2a493936ebb103abe7f1225fb938e7eada22aaaa22aaaa2fabba5d3fea4ab6fadb5d6dadf2d28ddf6279d7df9f7de1ba28fa8d46e97243154430300140013160000281008860322c1609aa639a22a1f14800d6f8a546a58389288c4491083680c116314000240440000640430180501b8b2935b6114a098675414a452b03a0b9e18d70fb96bb191ec9d658996b6ac4f2cdcff62544b18c96e63ef707a2f08fdd292ec19ac8f873cbc63be8814209b51034ae06241c526b0cdb929bad1e04c3fcd9d14c3b37b991eb48c14231864be600a5e8318863b747faa28fd6ba2c7e7af2ffde5e5727a549c939b7bddcf80af4b4ad1651a2923fde6e5e7de1224ff86fb9b72c63b59dcdb174d061a943ffce41816c6a4b6a9b1de67a4816b577a99a59aaec28750ff8664e90a2d272a119532cb9536eea7f1ee3708ce6cbb974a6c3a19f771dcc3db92048016d6a8b7d2121369baf5be992c75c92ed197f805774ddd359657e6e5be7dac1ad96acf34c28aa8ddd94bc303b5937f68d245d5e4bd4bf1d662a1c4ca3a04b10c0e2156ad21c412339458118626dab7504226e5866dcf88a8e1f34a713eb926820f1b9cf9e9b7047d5c8330c3e9cdb2dca264c4193530e1c74ef4345cb11d6f2d097e29d298f00bbfdccec39d34c4e5f4c801ae2fafd937f08dd11313aeb92b0dfbe3662b96c15cde2713f047a812088b894cae7289cba7489f0af661f348c53fa02adb2fc727c51e714a2fd6804445cc261434ae421641a0ecc2bdd68cccb6474389569747390d0ef146bdafc2acd2ef012a7e1a6eb8d936712fe9927870910590ff096634c566451bf876c2eddf0e97054565235918e76406fc905c1505561b4a4f24acc40935398376901b790c120e834be5133ccee9557670a21483f7f32921c69b2fe18920cb52c6849f29cd0f302caa57f29aa2cd7afbd472de7689000aaf96e533ac99914fd5801a27c4488ea7113da8cd7e4ba5a269a1dad664998e1c621c4cac2030a4517d2c41637d7516e4808d3088c80bba387fa411acec3b9c104ea30c4682d5252272838cdc86e04f72434187462e6aa0a10ba62759e681066bb84bd695034b8077bf6127c98689f3903548ff1eb375cbf6364df2c6668885e1a68999017ceb24abc9041cffb177020e08c98902c923c03485993a13a1efa1ad3cf5c50814f71e32e78cc03bb43d43932549a9d55d0f2b59a080a4c304b35e8dfacfee6cc04e0f570d34afd0fbb03ad0037eb06fd11f9339a999dbddda73ae7272be654a302d0a71cb419dc1544a543206258eb09d04d31a4cc2c9341cd030c58f2ed1e8be1c612897fbda7f1e6fe4fc721d967e06fa5fa38a5c246d17d83dd591f7c22456ddca2faca6d51b824194bcc87d188426d68bc50063b36e95515e2ee7a5dfe4c790bbcfafee7732482ad7eb4902aa68f9c963ab740d504ab092e2a1e46ddebf2f7f3db24c2b9c66bc7157ee1eb090a681c58f1eb5205804d11092be56d55bea4206e4b00790a6db9a7b1c153105229c71e4f2f283f8c491ed6c0f0b0c475f393c7030384ae713577df81156044bd152b3166b2582da72c8dc09a471e6a49330645ee331d591af04759014f2edaf9685f9eb6a3e6d57d0c7371054482adfb1ea77fcf65e0e93d93a00c80926d245369449b29975b2d11b654fab730a5bd973ca2133f3ff0f1a35e50800b0e5e98468a7891908d0dfb211d93bede1c003ac2e7f821effae34bbc3f12e86242a8758f6dfe12c2a625be165ee50ef158b1637cbd82c49fb3c0fd191fabf143405f141042448595c4a82324e694a804b3e3da92f426df221e07a6765ce34d78be2c23fbd1d6fee39907ce4d9070131f6b376e9c5ae0837a84f8b3d0add3f232568b5454a9263c919570156dcf1f276bf25d1283603c67e9a4df2872df3a704910634363de75eebd5cb23e4f9bfb2cccf3fc2464a7f67587b3fc79a278355b49615c609cc726e288fbc6a5f514e5096b9c1f3c88bd592734399a8139c59c2debcdc5891f826ba6361e97b533f160dbfc5362149fd2ddec85a04b82a4bb6c535ab6bbf7839ee0bfcf0394e564b61c46a2db0acd64093d51a68582d266f1af8de16514cd3d98e5c74c60cce3431f620e8ef99959d76beeb3b955632ec7b5991eb0230702673647503bbd22b541df854c61936c6c1f9527adc5bbf5a66f7f9701ea375450f8c7c1a6fa5418d6d3e8d74d2bc97b1599a4cbf1ba475356cd36c7935f556862ec3d2e532ac34ae87bee0eacf82ac7c852e5ae182bb1ef7f364fad7014a389d025935e6f97b82608c01a925d6f8a0c75cf9fbac785f916143e98434f166fd74e68a6137f8ec97139b4ede4d7e3e05d26b7d71673d3af7d553163bcc6dceeb8a72272f2502136332fdc031946690a86c4ada129c922f089722b0125c4a12fed7b559f6cb5e77274411b7e0e1d2cf1fc307c4124239805882dae83ea834757a3a256cd63adece2c12be68c900abc504a4ad2ac8deb20f5e562dd22a43ebe98921ea31561608a5ac52d341e312182f12f0af84788d1a3778d6fc744d9a67c23fa9fe4c518533dd0fb9d26191384f200f78ae6433d31a5a333740a4f7961a79f668897612e8d2c8c3603acf6ccd3041ad7293a687ef00ec0c7b41a12f074ec9913e8e9fdb956b722eecaf532e80500364104ac00c428981eb8dd7970a84ea85c6550700650fc0dc63fe8179dc01cb8f5ceadd4b664d85a7e26082255b0b6f628878017c714d4cc71bcfca28d3989665a63bf31a1cca06a28f96b0be8fbe6e30a61500f99c031c9e58f554725f18bf6cfdc83e62d9ed6fe6f347b25a08170c2573ab8ad77ce950323e4ebff112743cdb9ee9de7c46d69dd2cfc761921607aad3d4345d4018cf4828dd9c10070dcb0a0736c28cae7d545cdc9e7b5c8b9a35357fe7641fd63db71956f5c044886ff92582c82adb6737d2eb23b63ad0274db685ac2a2d59f641d9e06b5992bd50999cd16db1a79fb102cb5997fbe53106d04e7ce57a62c8941b62c96117442aadee7e7b3f7b45135156b41359d55235ba3a795fc1dc86a48cbafc482ce73ff694c59990ce516cf9691529fd754d5630c3f285c74e80519c575d02b0b63515a991ed13d3bb79cde84e864ace72334939368fe1c2cfc068c4383d2871c7c0ec65a7042b504979496bf4ada18f8d0be97aff1c38032bb00abc905694f33deffc4b04a0b6e3f3e963a03c8d467ad4041cf87749068c7d70cd39090f844cdbb2517bdc8d1021c09193458e0cf1d39193a51d39f06a51a4d96d9ddfeb704108696661330649adabf924718cababb11e716c53979b2bf65f3b1e21f54aeeea638faf2fb0f6db6f388775c3f2cc0d8cf6bde546963558e3ee0447376f4333728136ba2023a90e299805e0b8b0a0623542a268dce5c25d8e10b4750a9a6bd5acc434e6b0c699d742b14dda9d4daeda58b2d355313253f9c0c20219777360304f088ddd074460141a8bea90bec774eb548b37abc94a69059d5bad41aa49db72102b5f508c2ea6d2a685f3cd4574e1aca29bc7adbd0c5a9c51422a0318c2510a8e64ff4a6618cbf68ccd74944ee0795a16cd849e3658034fc82408bc832516d788845ec3218f764d15f6f35e637a6ace2692c00a071fb8b78dc50bc63eb489affb0823e4a341d4d8ca97797eeb400124e00bc1c6c80ae6457078742a71b672786251a6a875531aa0d5a3a0f4fe1ea797b7f0134a786f1b42f7c64745804b408dd86148be7d8ad0d6d44390e8cc94247b3ba5627c2eadfc94433e314ba32c7f4ccad0179837015e82542bfa911740f26daff0f92a9368e3d4682a3bd59d90075878f6a24a0629e140139358d0a5e629ac4178bfa6602bb0cd99c5e51f5c390e4e8a7173752ed37f668c980ee44959ed6b286fc8d3a9f56907980b33b47e31630fd25def6324cb01a37008983dcc1f20c71de13cea02847c5db3196b172e51ee01e998dbb615a940d3dda7e04319d6d0602d7115d8d2dc8e910aab471be9292164dcf95b655bf98450fd219ad3501d9300246deef30da25c5d2b51d292a8966bf55405d5927c289572561ca2126062a6b24fb00e955a66401cdb8cbd34fbeece68fdb2c1be7f5371854da80d3532bc004c82558f404091aeca805e7fa3288fa1a9463d3c2f38b863d5111691b66eb077241a5485a49eb184819cd7584dfb8f6371fe19b7841a4816c46a1da20e2c79afc0d5f11981fe20dfc8e3fd9f7b07fe2dbb47056fdfd941c4e8ead7d8dcba9423cc555e182077caaf220dd3f2f49a91a4de35116fcf596e0543e9802229a0f9507581201dca996a755135f9aadad3aa2c5fb13a66e90bd6be00969a2af6e77a36266e861a0f363593765f7f23b0d07f02c3c01cb805caa210c01661eefc7758f60e496b833fb2f6eb597845d42f8e1c4e5e30c90023e51e39c067a34cc388223650cc483752fae0d7f8f133d2a735a6634652ae4673401bd0e2cffbf2bee506ce2658739d40c8ef2e9db156a135e50621bd77d989678fad991b18d57f4b8d2c6bb4c6bb0986686af376f4726d77793612dd6f4c508ed0867a572c01cddde8c80bd1e5270664576484e6e5bff4841a739f70a30e5e7364e187bdd3755a978fffa7049cc994ec0004efc2502f5a44a9cd402f3a8340a0a738ec38c3605e9428f4e9a178050253501e931d610d0a06ec5e14f757485ea9ff9d1abee70d3f2cdb6887639a8ebc54f9b04fa880ce3aa88f5cb6ab1aa86ac462eaef03d2f33efef8ac5acbea9366ea2760de5310638340639cf4037810a20a38db16491b471fe4b79d1eda17697358fc20f4bd921e5d510325d47fdc3c4ecb1305e7b95bfec4eb21899f9f73699f9be0b938a31530735c152d729dbd1e2d0357eb6e924fcf999a21a577afa9abb278695e82a6b930758c8f64c08ab7f5da296031b82b0971c4930b476c8b84230e1a1cf1ca65845760e5084880e5d5957bf3d45457f5ce1a486c9a59d9b6493d30020b682ab96d1308d91a1e686f00e51ded26375fada91dbf0c5dd25d2f95008bb0ac619e4635811551ff251dc80535ba01a449f53fb9702eace8ac609ad0fa8e04d2c4472bbdcfaf4d53a4424daedb56a4bff8739c263e810326a4c4776c499c06457ecf3a515a414b7e48310bcafd156ec4624aaad277009e4d6f9f8384a8dac43346eab7cd81b25046040b94451911fa2213ad354d3a4e27e76b379f0fed979ee48bea59df3e7e6517d35d68ce1f88879a75e6a50669c1fc1c4b7fce5000d0b147eebb7638ac95671b613c385cb2d60e0073c405ca92ee4162fcccb5f4532aba7fad621976704a96930705c9bf77805f2dbeca71b996c3edac5dc724af3e0deb6a6829a6ed6ec97731d345f72fe09518d518fd6b8c3a585c73f0b7ba9aa2a56fd615d19adc6e66ab2d35062345dcc87a7228c1d28aa34d0451948b53a53ab6ea47a0efd84fb81f3fc9090b8850e40e601e41d87f1642f2af1e1fb9d78945fc91bf237cde3ed63129e79bd5b4410ec3be685b86bf994169284bb7e48b44e65c62fb1ba8fe97dde0d1ad45b5cf7ab3fd851852d9ec873c9a991bbb3e519066d0f108edde2da17cc9096e204c1c644675c2814d6d224014045f9e4614b350be902866238313459082eb4c752d0ab8b306e4f62daa81a890c4e07373ef0ce8ae720c5483b872ba0e672d9c270e26a64e7b791ccf3dc86d2ccfd1ecc14ba3cec519c71789d9dfdbc1555aee88355b0b40d3384e88bd7cc6f0318e34bc52f137c7157718bd290fec98f904900736d81b4ff3fb389ed7ef4804df1c5f7762113188986ab74fb802ca2934193d3e2a1048278f6cfe82a148f07200daf0b8774030a0d7808c1eb96ce18db254ae8eb2742057e696c2f4226c0999b56101a14f5fd21da08a4e07f20de41f9652bdad33e1343a1ae47453716701cc88e83fd609724ce2319193bb2ba129928ddab7292110083409189b98a272a5f9173ba0b1b9e60371db2793d9820737bf2c7e56bf4a62fb69196f73bcd9b392e5a4977ae5125fede1a1d00a7a44d24b541b831b728dbccdb6940e843111a2bdcc7d9c18c987f7b89891cd04f670fe303af0752a7bee1c655ac9bca4e0859f8289f57a0d9bd5ad116c5f3561d4b0997e466ac6dfd3d47ab212bef4cc36b403b6d47713d86424874a19ca11b7e1ae1f1d5d10c1ab8df55b8fced81ab944339f7ed889f3345eec2f78579278ee781790db847f723c8f58c0f29b351a0ec0e72a96834494b94e04d18a842f0939a0d6a36ad788008adecd5ee81a19184326be2195946934a4b09fd29c844f2b5ee846bedef700040b00478b6e27549b038828b38cef5aacfd6b9461a429ba3e943e4ea025cf2eea80c5eeb04a053156cf252b7c6a421f801468253a70ca5cb888b6887d2248b35240e11c1f4dbea8c1258bd3210d4ca5beb45d58c1f042a5de9d5473d05f1902ed9383dba997b29cc264f6d8c54ed6610f083fb37b74491f1e6b83f2ad63ae9e5c85232ee8d4d8272ac25daca99b8ed2d366a6ade6c6f3cee072d8772a0a03159471984b5683574167a8e9e466735904f8be3b0a8888faa8f37d9d53c660446cb596bf672881343469c4faec11340f5a5e575708def15f93a4f7fb960c793d38bc960814d71c908cda98f4fb542f21265fff6961b2b77a70b8251144794741e5ce884f2a7c3f26f1417359688827d38558af784e29340676f738d4b753e496f7b213a80f39b910082d756e9f7dedfb64f5e0b6607f3728eed42964d923c7cedb4aaf7e412f76f9c44e22a70d4defc9fca35a1d3d2c241a517914638514d1adced6978707d8aec77a0b56883e9bc2a68a186429b807dc6a5d43b6ca92d674c5c0a4f19b0837fe3e0c9ae2fb9cafab62ff2f6f92efb88c3d2e6abdc3dadb91d30f70603882f5f37f4152f6313c98248c8167de28c9e899ee32ac4c01f60aa806dcc6557bde7c90222c23e698e105ae3edc3d0e798ee35fd650f48646b178dcaf60c76739131e03bf79dca1ecb156e76341a4c58a6998b16ada792e78905cd05b3361e5659533ad547ea7956438129a158a2db4a523c932d4d133e93e43476063f865570dec50fd1730b1719cbbc1aea08e993da6f7e17e6bb9bf7833e815c4534b40d2de069f790275f56e2a5d0c8b9299ca6ef5d9342e304145a138aed156975d86c9c0d185dd401967ca5359f902f44eeb9e57e5e850bbe24eb5e0a7a03b6902a822ccf621d94e7bc44d6e3cde9fcdce1b1891464200c1dbc6c52f72344f5447006e1ae437fe8d27b52d35764e6a1f29d04d82f4d52c6b21e5d2092946d538ebc18c1a41a3f0811148150af970f804c5289dc0ffd32614a16502708a43dfaa06559f0d5ecbf457e9368f54e64c9c54ab47395493190a867be40f4ce3ca68e044dc88fa5135791fdf112ed3f49620ddf39e3304e9d21756807b74e92f4da165cf7a1efa02e0ae87a894fe62908e68244bd901287451efc8d2363672683943dac3895877b7a9ee194c779e53dad76ca42c01721a9d6e8ffd8260eae459ab829ddb94c59d3ca9e67ec1bcac1b29cb008e4647c78f9f533075fc8603fae73ee5e071eb9cbb8424eb278d2a4b06a0b2a394150d75515d951408a6cd44294895768ede0a409754db8692377c0750dfe87c4a0cb53c4d76a13963447f81196860a965527d2da6d61d76e000e75d151f17869e2a199423aec14e87d555c185fe827b2a4dac71750c2b0b400be505f6568a5863ca0f2b6bc416fa05ec538aa8063b85528da316fa2a8ea3836121943ba8fb900307b931a614d6e6cafd4ead4a7427848624e8a9de7350fc354062fc7e780521cbcf93431008fa39f205c2ab9f9b6f408cdd73e703889f46f127c1cba0ff40a5eaee21a04eab4af7221da76354fc12fd4b880ad28f4c4822a562201420d4d293e065dcb8546a3700d2d6edff4f9d8a3cb54ba080b9a22dd7ddc8ea918715c5ac12e06169fc36259ca669cbbb58e717d432ae95ae14ab19c24a8bae0919d764b7090d9ea63148b3ae1eac7eb8e4aba6059c9cd24684ee14341f23b57399ea0c5317728d5f77435d38c071f45ad50d153e4045763bdd303daeca4d554fb0345afd00525256b01dd0c4bd96b9cd760795335e8a081022ecf1d78e2e491629e655dca554b5dfad6eefa3ef1ee45e7aa78d217269e93d8c6cf217a5668d19f489b1f51666c1a488f35f61871522c99f71bfe035f21a9abcf53afa4811f27d99b646fcd0e5fe207d4425eff2352ae42aaeff362a9e9b8121880e6b5bec1b65ea12cb67e5ca4e686c426229d2254aad44fa5d69bdfb3813e95b7fdc69c108453a3b3a15a248cb331f900ae980f2822c6d5d1917d5a55c7670ed97f87af322bf57b29ed05947776016e2d2c3f22fa8be611d521732b9558ca1ed3897075c81f89756cb61aa6a85400151ac7ea92c037c5f5de43022a252e39dc21a250482a190b2d946927a38e06117f95c5306f734c8b0b7efbb403738c6bace37fd089189c61d7cf8324a6a07108c81dc49858d66f6c19b529cb82c650a89f948eac71cc0fe6592f24f752aa25b002c7ae74859cfff9d9160bc292129f627d305cddcebfe397bd14bf482ba9c56278869d3d4345b99833426660cd58b0c4a8952304d1e91861387d1584f1e2c6479b2509179bccec089cc7c66024b500b945f2890df45455b444b06563c17c8dd9012dcfd10ce3e825c1da14ca7080e1f1111c121006a31a43a0410376b65a778a6820192c6cc47e85e7574572514650c5a50c7a1de7446ca289cb87d0edfc277e02683235de381212a1679e79316e231eb2bed0624a2a92c2f0532e4ccb796c9df48863eb1141ea88d6e22d40740d2f535153319826959d4658a22bb901874f0743d1269a8b9c8832a68b81aac9801108fee695c172f5c5ddde72aca9cec8ec18214b5b0df8b866a91156d27ede32c6367fb61dbccbddb9dd27d6a3fb822d38593c2723f6f2ca44ebaae772212d86e7dc84c3155dc90260b24c26d0aa8d5c2229c14b9165025c279616de7d5e8cebabd3275c20bdc2977b937e3dea9fa14742d0d025f1e6f9a790481c4a933cf3dd3db40f3c94a5181d1545c74b3c734b5ef69eda9a9a1b30fb201fa4b9f4e1bf0980be6a4041eaf099c5e31f045ba75f003df6a9520a25cf303f5e6e918e07412da37b719d5d6d9f2c68c5f022d85be6d8547fb9e744540d75bdda81a6453f73312b532b260ed2f3bf198f0e0118afc0686daec710a18225009f5384d4b13085a64771d4c4398e1ed319d21347afb8a7a84d2f8a644692c80df6ab1cc2ffaefcb8374ad14ae513b3da4d994c7002d1c85c790887a0774a078d95632c9266b4c82283d18801b2228d5ac576fe942550ee9fce8c185211000ca06ed0d31cfd6d792ec28a6ccb3b2de0a2caa64911f4ca48d5ea0b4a7c1f9cd31cd990bacfb84767ed278ce5c45fdaba8671bdbb78010bde0c263e9e9e845ec140ed222b6a4f3cf48d2cfa53175d3195d0b0b1fb9002094b7a1d17239270cc55e1771cfc373658b409294d5f195be8e8968de38eccfa74d4fbd3bd270190ec6bba79c9af64d258d5f1bedb59e493ee4a602519c7ac0a91c44686a8c0bcde257278c95183415ec99f51bbe8545b1a1bd51e313ef5b8dd9205cb4e4927c73c7952fca105fcddc7a9bcec432bb744c3a993408ae4e16830207818df2a87e2d6fab70319bb052d221c4072a448116b2e653340ed97371e936000fa9cc0ca5510027037c9b86666f1b4b938ef3e0fdcac5bb95618291be1257871758001b2dc0055c22bbf49dc279a11d0e05f6e8c812f3b4def78492b29c010e03767e67b6aa671a114db11c739448a45f280acb09e9924963e9f3ce31aa465772499443e545afd3c1e4134cb3a5ebb8bd75e9b44b253e19ea626859be5479950df1023de528f44ea9912b0587307f441d4d59377169c0b068350151f780d53be78bc6b73e9c90b3279b6d6fad6abed65dd21f968bddc59bf5d0c93e1ea9933ceab3849cfe307a0bd901a5b459ca14954a8dd8e0a5a2a1c720f6a10e3c1ac8530bce6bd528410ec152b981deec47bc57c38a8d54b889c2250aeee1060131884360ab4ecb7d10394324ccc7753a2c62611d62c30a51bf16aad7203d8682f262647a23a7cd7b7db26291bf8a947d3fe490be72326944593c43928def31d0554c49cc8ce240b48ab136d5dc735c872cb48708af447f5f7394e488edaae3e253b54bbf4192b33414c4a0280645d186a281d1b23a203dd1b507acb8f134eaa32dfa3f02017c36cad74190ec0dc17a5863b457d0dbc8e5c1d5817c015c0d00bc7cc1f596cb767f8d7b53b9d5dfc01adbf6b883b74f1e413c83c90c802be4c7e1357bc5e2eb0bef26e330e2010242b3d51cbe5242a355029984cecbcf32493f48874a43716bb379bcaf5e84168f56397e3a892d89d14db75bd0b8ab8932212576346f55399447ff01042cda16e132c5330709a839331ff8806eef84082c08e152996d9a9de69806d5c38918f93d5aab5dbb922e0b8a2cf826a1fe04afa0f26c52b3afb534671e03e4cabde8d99bd4d242a1a00004b49b50b31a8dc5185290e3f5e1242c1b6de1444697773b27225a5619481b67e291761354754d6da30ed01db5a8d355dbc5b4b698f6f17416c5fc167f4fbf7e6b1b53c5fb55e6e33cc99a4285b37fdd5706e0cc3342073a7943950dba7d00b64c8826e3cd545d0f38fa53da8cc81fbdca0ab04c0fc078b14b897fb910ca0dcbb6fd8e401ec6c14ba507218fc1f02ab3cc9de44bda15c7ad62f340d40e8f372f6ade9723858883acb9afc4eb60a4a0522acb5e7eb29fd20a0e1743a03a9f69733c13e4a5cbdeb5285813215060f250aabe37dd954261bbdfd1d9cd88b174b6c505abafa34d261d22a7f947c4f5459111eb5db62e18f25c9592a5754b49eddedfd7a3910281356fcf0cb9688bb4d331c6ca6303f7fa8108bfb5dafc9d57f0bd679a8ea30dd66865fb384554c284a51f58992d3da2dc6cfa909b623d506e52f287701d89ba8095d4bab38846b604cf487fe607e540ac6cd30c1d17d736f1548c4c608373212b71dc963dc586d06d1a72ae0f5a11010f8f38b0203dc11b5573acda71298ac9b399704a231050fe29fa088645fc300ae8b4b8cf80295a4251fa325fe519f23024c1b2953d7abe8ae4af27ddc5cf7a4e626a3a15235ada78d4c0dc5800b5eb4db3d592ecc9e3005d3aaa34fc0964b847e3dbf32ad872e6d7239a4082f6146a0e205fdfb8e7d2a85bda4c7dec9c10644e5bc349b407b7cf152951054b610822d6cdcc3a3f93a3c3e4f1b7c5a1e94f1e1e41964060c1ba5f3fe9e449bf30cf8cc911bdc5ea9161adff801f64f37cee571dfcc235109dbf2f061a6949a635bd9a5a9609f961e2f2b55217a1a87d00cf4455dc8d7502275f1970e66453cfe45639f99d120cbeed50cfb10c6bf5a0a8dc05ae195abf5187c16ddc889b71636ea7b8e91eea3b72050b4d46d3070a811307b9917ffa0478c0c0d95cbc44dd050a9dcc5c79392800d701c7b8e53b3b1dc2872e331777a38a52b14ead0fffc48b8b659d7fba97f152108d80867a1f2e8a47508ae2fea00bcc84af8fe55081abde8fc3f13019050afcd3adb290fb56b954ec5776e1db782c80c45686d35dc315a92977e10cc57e5c1a0f7890989c4eb75f4d8da35cbc352bbaf07cfc6af093a575a1ee101ce9a0af8f6383af1ea43f44b9c9955c846d97fcdd13401d01cb9191293b77e2a82871226e7ea92aca5b3ea20d64faf5b59d3f0bee2d2c1885c4bc68d36a9a800fe4a8d4402cd3270c4f754cd38d110af840af80a6d182e199e6bb1aadd1c866ceedf7bc2e8166bca2c8578e645098ee7a843623c14a744879e5fff2171fc08644628d02cf331e735e9720d18538e00c831a1b73136dd45b8399bb57f7d535c742c695b66286584f55807ee08f0097cf3c9090b453d5f1c9a21c3609d2e483aaa6b51952f9b9ae3be5430118b09cc1081ac75dccd144a9e50f8837137f07f2d98c0757e09136b7ab2f06853a37a7fce7a6349966f7ae1f39e1c3d1999405939904a5d64538e92f7d62284218dfa766f910e9a128c37ae643fd851c3a005f74396121b18098b2653e01dfd165ed2569c7d1679530ea575a6ecd47a70472b19a0460c47e57f903a3d2670b0ebe7a901d6d43a1a4857679a42f0aff0c51905b72f68ccdc6934de3cf2554b0f5045aa603f015522a158bfdad225d7bc2dc8b52271777855b9457b20bc1cbbb763565dc0a9055e572866ae2b2a01e0b246b882ee92ff459d929b32e430e4324eb2331f0bf927e489de282639d8c5752610baf597d6414610a96f59e465697b4003857313d4a5a3ce151d069ba17f9c44bbb349ee41ca853767adcd6ba3cde0579f76560cbe7303a8912e321ebab312524009b165450cb4b3e7eba4a7ca19d548cb09232446cc68df41548390fae45991231d078de707388249698b5a8e7f54540b7894e8ae173f1ed7d786eb2d81c0849c06af2d2a35d4d691c65499d51ad16735d9d8e66db88366ab15d72b26d948b9ae50ac41f680ff61780064006cce98f60f70c8aba881950dfd6de0d5fa03d855caab097f59738ea4976ad7344382dd37ce82146b7d4a78e611b4a39717e1a064ca9615b231ed32e5b01d80ae0685bf4719ba23249c81477fc559247672ac49b61b34a27067eb0d452b61422f3ae1bf77aa7b42d8de02dab2f1865afbc943c893782822bfa67f9d8f416e8621dbbdaefcfa43138dea3a45d06333cdf44bdf573fbe66359381db6bb5518e7548b5d01b4eda74c1d6b233a2d0047aa715ab40a309c00606d5364bce6b8b23163c953610da36171dced34bb58ca390c58baefa068364e66dcc88df569146378633a5d404608a8ab5d7f591c29c210b9cc554c21877c02d917a8c2bcbfe59b6e69322ce67fb181ce083414dfa56af112678c348261afd39c8272c40e8e124dac519d7f21ca8660d24c32695da0ed4301cd57bccff34cef4545750091b1d08f8b930023e7f449a8020415bb4a526e7a17f4f55e43711d60e30da0e83bfb43995b6a24e9748f4214b13bc7552b47ae0f76a48600dad9289d7c9469867fb3f58b86c46b5c96d4890fa728086604ebe03e851989f012881cefdf2c0665f41efc5d1aa7651be78c077916d1753397d3626961ec85b1c76796f6c9a9ef4056ce294a2e0b6ee07bccf271b1516d86f5b33244b46c587334e57545161ac67c305bf34015c86527c4e21c3fb2d44351cda5684110566bf72166851d028189f276dc64270af9514715b8530b60b36d33048404878d9c56af17b243337c1a17d45e3eb7b83c494cbcdb0d9210efabcc5005b50edb853847ae3251361d89b66c542cf79217e7c0042e08a4147034d4e83480a916d15e686cefdc0691313b49343fa083bbf8129a184639ae037a75e200c632d2776aa3986b64ad077f18d89344f2c4927b01228728284f3caef858f62cf7fe2ca73fa929e8eecce9d8c512404c75d032b8e8e5d5d89cf27f2d67bde1f748ec854483060c60c7f95255a5da00ca0e77d026239c26d10ef055f1b9469baa67ea675cf2af359b97376d4e6530e717e5a7f50ba7a0b414c2be2b0dd9dcffb6e064d6fd09242998d48a3818edfd1579844a8e6f90490ce6ea220a675bfbbcc563f02300197d4b668853c6ac9a35d6f21d546f9d065e1016d6aca19475607deb38d0c2b8b070cdbaac03ea7ac7c856431810ac798320634e327e25cf6ddd3324a0b9d46406f874809469cee2bdb21a712cd3878e751463b51c12a2bf152de95dc5d09dd485a42ac0aac1bb89e29eaf0e1a76df6d8047acfa21656610b5347bdeb76e2c756744bf444d2797f23a6bf4eb188b020eed71ba87c009900ebab1dc364af103b2fd5687be36b0eb1441d8600a55b4bb600f55dc8c5d4908b321c008ed817c84302c7654fe2aeb4c44d8909253dddb457a2622a0fc55d612b6d700cfb197bf8bb2cca1465833eb3e2af6cd4267370db5d2e7fcb4d9e7b48d66a29b61b29df95f86c27b48555d3f607337ae007d9145388fa45b3d6d61f7b0cfb08e066e9a3bae105d0cfa1fac0c34bde32454ec037c9b84c86787dd8a908bf47d4ecc1352c01582e57216c1482b9249c9547fced42f4e6f1b0eb157ae92aca29919a8b344229f76ac5abd16e811dc2f2e676e7d79f5e32ac2020398ca521b5d1389b2b3e1687ca4752ae0a951c389d7f91219c3d30c822a0d19f0f2b2b09736e9d5b242f9091777e6c3648b9ee3e14ded94e673a44d57f83f28654df0259daf57094ca0f1b7900855bae439f16848468e3d0c554c80d4061ebd48dc233d14c9deca9a266a573129a90353a015144300247a1a1961e3593c8758158605559a26a3db8812e8317d4ecee7537601de31528f0d5dffd9a6ad6af139ed6064b6ac3a19214b0283b87890c503e6821564ad08a6a5f638d67a628e42f7faef00534a2d62e5dae1f63328f3b6ae6b5844538a960442df15bab7ea9d731e20452835633d6a94ccdfb0ef2d7d2555f5224fc2b5b28376591ca0d60e6e4a4feb544d11924ae4b8130ce0bbea47e64bd7852b7aa5f4763aa6a72f0c3a2d43a04ded6ca3fc1cde2376896b5ee9e36d328eca74f3fcd9a9ce4bd92668690e879d6a48b28bc0b037c004a5a5749ff5037fe3bb4e7d387f1d3a29b20d1b20cc0998c8c3bc901e5dea8490de551f165d2d888db4b9cac9bc14d853693da52a588ede37751a877854b0814d09884e9a1e821d88fe4a9369fda302d7aeb6286a08734e77d1f3b47fc3fad29dd3b37c7111bd3131c0a7eeff1893ed00852b3f48dc754a386dd863f80eb2894ec21f8597323977d5e4efebfc5a7f8fb6d7f5e85bb8b0734072bc35f151d8dff16f5e60d7fb0f73a70a771d42411ae6f000f4f0a02022336d7501ae24e405a1d94ca14faecd9529c8ac1178e5149403d1578d65f57aeea6aeeb24f09999745ac7c85b8acca6a14372a2ccfe38bf7b2337deb6404dcbc235cc9a462b328ba13dc80bdb6b63ec45a5c83f11f4188264c95a57693cd3b0757425afc24a47996264d681e26940b34acf964662667b436b155b6ee9e6e2101a5601b68bbcca5174267e30331e8f62fff2364de0ebe8ba8330b7de4fc443d6c278d2e99d3f784e8076d28ce65c8c3acd00bd96b0fde1eada652e99cba830007d8cf14a78c8a4f653894513882afba88bd1526e873f73c94c4b0a5d1df615a0d14ff0612fd3d0bac14c4858179830f83596de989ede088055ed45501d5d0c239e27aa1971774ca0c2af8a9f54890c888587eae6aab7cdf44801443be6b5ade03554fa797c50c32f9a5f24801d28acb2dee21e0920725338a542baf9b779ab0c59f6cb91e652dc3fe03e50d43d49cfe0f364760590a1a8f2a4252c57631b3dedab0790135be781dd592723d933670aeea084c806091c2a46e54d1636ca0bff1b27fef158534d5d4bd4fa476e4f3d8503e6a61eb98a72a83313284573fc25d0c9c9ed906dc9e177251a6433d15d53b918b6ccfc67dde221acde358d88725ac384944e4b7c69ce84fec073e37e704418b0c8bc0b544375f23c4a47a9f44f633287a324acfa53b4e3c1e773ac0f0781456099124b1967f446c08c085737fc29de9d0d0bd19308b3c1dc3af26359deea17b91241b5aa6f81bc080ac9daff6b6503ed111e2586d2b89f57e0d0b84f4b3ab5e09172f5a45c24af129c172a97d5ee80b9b116c4eafb82bf2b4295c9e95fa3a35285ee6215751e04c7971d01796ca29625736517494bbebe44cb0630001952bc08d5369481475562ea14e0d10470efe601ccba8b64e00d8cf3da27eed162a8edd4c275e72c1ec24f599038ec39e79eba331d87b6661b8b4e65c2cda2c1316f97ce66068f813c2d41971efe1e9d4d3eab24e1e21cef8c09bcba0e250f71dded47bbdfaabe82321ae6bb5172ec9435abeeba8db46bf4dc93393e112f955142ea85ed7f77b8991c7c67114fdc484dcada16e584fc3bf610dc26cc962fbad8fcfa28ca2804981bdea9ec6235767dbb0e5ef12a268513e214cb793525382536bfe4c24c6dd5ac5c5a2d89db413c87450d0c8442953ed40574b12457e794a60bee336740bfe93b90dc6f0c4e0fbf9488028dd43e24568c9c6f30d925213cba02d9930f08e4f840fb1a87016de3d12cdd57c04ee8db1549625fd1c4c94080512831cbcc062302ce5d34524f298bb8237cca1cbb3dfcbc0ada7e7286985e45310169217813e5ac2ec3a0a086eff738540c34d21bf689538f4406ae31a3d58d1cf23ae0c40561325f8f2246123338403156ea237f3fe58751a044e8074bcc07a88909bfb6d58f7adf3681249e9e083b549e2b576a2f828845e0d24fc248dcb7861c685e8e376782069aa3313efe597ca6b9d831cd2c929bfa483695592bda123fa582caac07c123de39e686e5074e28a2066023a79dc9cfa178b18e512c3b8ab68e76dba277d6abefdaa0d08e2a63a1bcc6c1c571bf39b380eaee26e80f718b4632db449591965bfeea7e2679871176786386fa7c42aa333a8fb413f9e84c4efb625c8e6fe9d35a85ac46af99e337c7798546ac22995141ec1b833e7e4f208ea4dcf03029b2965dd7e2037cd98f239f71e890648fcdd118d75e614c313c0e5e609b2592d50e7f1484aa8e130bee0ea0b7448234dba773b15815a9e82f4231cc4e4cd736796890b1ac628c9d1036699c689938eee694ae16dd132d3a4c2c0168e80ece61d33ffa0d82733ea06478e5085f7c87f5eb47ccba9011b05bc132ece5b9ab8c7bd106ca769fb91f581745f6017cfd7a4bb2921a56751837660e192bd4c7407f6962d69f731c39d88e17beebbffbfaf5f9846ddeca9cc5bac43036a3050fdbddb7d3f76d1f6dd7fe1f5c2940e189b1d35dcc2708baeec122e2b0aadce79abfceadef858ded6fc3883f77133f84122651a00f7b6a9b6fc5e5b127270dbd76dd5ed00a95f906c400a08dc58f15aa71e6b51c77e507f44290714c4db8f6a7eb88e17f87861c9d83b8186698c937f4224c4d29e4246eae1512b3aa2e201c0ceace12769d769d71bb62febf11c2362af58e87defb4f2c0cf5b5cdad1f30be3bb637783717f38aff0d25cbcb1beae0dab718f99f954ef9b9ae4a04fec85c73777a42ed2a90929fcbeaf69399b7eb120a85a47c00b214ba78bf9ab10273530d781c0064c7bd7c8eb70616e8c7affda2fbfd7f7644f66fc5fe7f799585b75a62b08eeafa4f8edcc76f3de33e380853687d467a74d38c6dc7714f15b12ee675dc5affaf872813938955d711f8308e09864942e2fd2f6121941ad227567f804f2362a1e8a17de016cb04445297777bfc2eceef7622408a81f5d6d8b01aef73fa97819240e90d80f01beb4a43d7a5887a1f3a974260bd8f3beadbeb4d09bac7258e9b3beb50a4bb4b972e994a8216bf644d4c7c63e90dd03b6c5fe70d9b9d38e2e5d09f7776f97446087ad95bf999380935de9add302b08c68487bb31dd6445066fcc9e84df98330ffa13e5c83d667d2ce7305a3ac5cac47dd4654811d661551884c6090b8a902b13fc8e044c37ab40bd08923ca0ad1b1235cb122ff84e5b54dd1669716bd2e00d12c535630f3a7276844e96708ce1b846d96ef112aa00d89d31975ba3454e386da3642ca1a732e46195d1da0b8e46badf475155e6ce8af436e6d51463be0a43ce8e7d629e89204af9b03c2907bdf74c78708b916f35dee070fcc9b945c3fe1ad75399cae361e2c03b25e58855856423da2974b9c3c0842d81b61ec057fc2d2462fbd2258610768ecebbe6464c78b9177b928148e496b84b542ead516fe00667c8ceb0226695a9edbb2f13176c1d1605895e5cd7a04de012cf640a247150dcbd464a1afb67730bf3de0b32b827fc1b681fd6f2fc46df2e210eeec892652c46ba4300bc3f63910bf7648efbb5fdcba0f4ca5da0cbfbddfedca95262e4a8c06a32038f35b084c3428a3ca055c18c0058c20b5bdba9448fb76c914b615a96e17c96b63f75e4f574f6ae0784a42e6583fbfa292feb0e8ab91856af2843b01c405c8f189ca71466448fab481a62daf4a1c7041bc2b28418c4d55f6ff2ca31e94205446303cfbf695549389a92d84f11c578a146d6388d2c4dbbc1a662e8b9969938c5f3ed3a63f41683a30e6e487a3fd2a88c23533b14e4ab98a3390f01413ee76a3cb472bace30aa1f760c96e85543ee002e585fd87115f1c7ec357eb7b76b8f03d27f9666b7ae766140c6d4950eed40fc80e531a4f221d49c13fa2c5d4933e2c5326ff40c9d4bfd583f7ecf4de8e94ac158bdad006dd9c2d5826f61b3ff5ec5fd30bf52ffda3dd26c1519df8d9ce528dec1d8a8edcc257d2cb149301aa669094a0f7d981d9eb9dd3f71ff801aa6711df2efbc7d1efc902763e61ae8391dfb3dfd910ef1bed27f517d3cf2a37ed44143455544939ab69979c363a5456b308ea3eea3792cafcb133a38623619114e207aea126e451fed4de103cd1c59b52ad46c3a64a66c94e1c84b5222bc5eb2907142b18079fc730ce9f29866e956d0f7b012fb1a7b6e183ee5406e5efde5b3ea54280bff65cd013224c059d61ef4c0c2559150a1e35f3d980e4f82e6ea65c32ff3b64334ca5fd93d06508c1cc049280f746cd2065b64c03c513b937d1b751feff8bd2b93ee8de12851a1cc086470967f4a1b3da2152c783590e21390fab330b1a0d6e11dc3dca9de5e9bf151167ccefbd57c1925e12077e2ac2f2a7a090b24a4c363dfe7fddbd7978e1483520c19ee09495b5972dbc397aec4f1cf8c05662c87ead5b4934987e4cc6109649c03f4623c8fbc5ef29382bbd0fa0e63ba39393f0132435492fdf7e17ab52116e54721aae96ac930692755ef9bfe05cdcc98a8d753244548dfe5fd88204d2f04148615f94d7132ff9e2ce88b3d5d8db73b7c95dcd956d1dc4d83ea65073194a9ec82fa778729b0e8e0e2401db88fb85a86198f16a53a01ed2a8e4f10d19d51622ce1a71ccfd00a3ebec0d2ead09311b7df06772cad4f271fc3bef5b05c13e2b93074503ed5a955d1c7c4a8f448a4ae8a1258d05dba2c58451a4e1ef3296421e85c7de5e86eb42a2896bca3da7f9eb258b8f648855a9cbd167fe464e632e546733d91a784330f94be1f452aa7c29eb7006268ba6171be7ebbf3fa869aec67604ed3a4757a2eba1a57dc0b3ff26304ca276c52197f18308c773c032fb601903dcd003bef629eee2ec0d1d31719bac42071f57c4c97e82a6f651ab4f829381c2c698c7a10ed629e8b8c9f06f0d09e835a71875ba3fef25c57157cf5d8e98ae5ee69eca3e74e12ed899627e1c1036699a0c686d688f44a2a45de0eeb4a4e25fc557bd99bb3261cf0cbbafbcb93c5793c924ef2fbf297b519e768e4bd1e58dcea9150cedeb625fa93c8fa82114ab97e470dd19cfbb3f68d5da12560107ac1c4b9c70d72a4eb8d11e112a18f9cb141fa8e5108545e73d004b56260cd5264f20c5b71a517eace05a9db7af051e6eedcc6303330e05a45159c3143e952b9279d582fc7c9c334856c5fca0119ceedbe5e38f324c12854b33fff7c09b8b281aa3cd6ee6eda174b7ead099757282d24c0b87f6e434a6ac946ab583741f350a382e681fd7dad35afdc9e829ea50fbff638008cc4dcad550c46e83c36eecce6917f4393ad671cfee03a976596a4f0e7e7b93f1262927e7f8dd8e0c71a961b69a387fc00eb5b1e35ed422a4f974a95be6148463f26c19aec5d959800e89e1f5a27ed7452b9736d7c89c0945e8bb6c378cffe7f1f58836b8c9e9a7c043ae024171f14ef27bd47859373eed0334983a2365199c567080009436eb9dd6ea5f0428a4c4e5db683cf92ac86f0aca11c71c026e09e4c92e348681a714b5d974f00f10636f689b0c141e1f188959109534031631e098a02fac1516a46493264a138483001a1272d165c0ae52a6e44f9ae8112b9ceda027fb93a232ea42c46b580aa8bdf084f7e50ddae41414c5707dcf8463c3dd2396e0c8d783c65ce1d7b87a5599ce4c230564b8b34a7994490af7577e1f48151bc0c862676248d242460ce75c1741d6022832a3d6cb34b5d5dab51bc41581d7f554930006cb4987eaa56ff4288a2361cf909066dc928488b11d47ce29f2ec52df659aae58ba9c93ce910522a5d6a4daf3d6f82049df8e4e322d99f25767cd9686eaf9d2ad7c6261398290c20fc64f171da5e83220668f1715c09368570a12a8b35e01f39e8591cbe815bd9ca3e852579da56bea1af22bd196a433b83d0bb837506f08cc8c8a5f99241de3637043acd355255d93b57d7a0bdbd79dbf56c4d76363dfd42a6cce1b3643c2a1369c6562197fc4f3ea33f246576e1e0929aa38da16d8fab881516a3e6f23448128c84c1e618ddaee01c5711ad8675b30056a5b3146a8695e7e7c565d656e03dffd66b286462c6f2ce7dc13e1e8cd8d7d3ca79f2786210ebf5e2db9d71635a74cd3af8938659146530e4f9cbb7c3aaf8afbc52059ac2039013878541eb9894ca35804c5fa0e87c550a48776b422e207d78923007e959818871b7b2323f99b9205836f3c29e0ec753affcf831272f2a65cce9a04e085b041c5268ed7226080e7fd90b1f7a3e82e7bbae24ea1e4cb163d1015905bfbed36e3674883341dbe22bdbf29d7ef7b95a42ad63b84b71729746477933c95bb52feac84506995a0b88e47e4afcae66ad49b712ce3a9e512469d9e614245ae62434127789f7744861874e20872050fbf949c60d3aea5823d5a53a76bd9459d86a100f305d90456f5e505a7a19346866a1280622409e0429fb3202c9dc65f40c1d5ee11c8acc52c13766b28e2ddc2b0a7fd68cae3363136f2faf9d8b6bc76473082e6f606463d21742a935c1c540b7d02746c4640d2dc15eba963826bb5c6e199713849464299e70db4147ef8605ebc5823059b242821ebc3ef9c10330bd2864b1821b351bb81af060bbbb186dcbb1882e0fc938316754c36b8e11292b5d641bb91b784b7108c83183760f4e74191ca097d8ea062e65071fa7aab4699c727149531e2f42f74b39c2ac0d0ef747d23291613f6bc9e8b5e20e7b2f18eeaab005d843a1eff1782bac48da841670938d045df3a7942c5162fdf4f2b6f80ba6c65dab20ea26170390563fa4bc48dd3c9f0ee14a7dd356128c9a55305a60dce4fcea95d841cf78c126509ae3fbafe9493f5951898762ebcb94cb1a8785c49f22863745741403def0d9dcc86e18117e548dc6baf8e14601f63ce92e5870e529f33652355def93f7bf3696b37936dbca80194fa61866c1e7eaa47057095a4a387cafd1212fa79ebfb15b3262451f6d74badaad823722bc51486ab74714c5b856d9ad6939785b0296b86946b5601a05f45722caa778b65a5701a6f78d5ca2cd26b87391cace01fa3fd17f1f9031d0c17ef706cc66ffefe7f7486a761984fce0a984b75bf6db86f9b8d6b0f36ca8e192e97a853fbd6c48a8e1d5f9d23d03da2100a636bc205957aa80259d1da33465a60be9c09b4bd5aa6bfec513c6e112f7b8970fd83ef0a7cc5729c637f3b0af22a2e118e35ca8fbc274ec70c5fba7e4f71c571d4e11c19a7bbd9375e581b598735fc8fb6934e1f953cb78ac6984529c77c955eaf359820dcba5c3031a88141e338f7f81962828dd58204cb8bcab9b058aa76f234f3488824eaf54435b404244cb6df0c31b28820dc8307bca46e321817b8e5bf0da6f36d08a3ff54f85af98293cc784f2a70893ed945c5fd24ec83d5db7346a05df76b83ccd9d5c9ed57b78ebd01938c923fa63233c58e34153026f09b65d3bdd2c2a6e92b24a6ba9571caebab33925352ccca18bfdc904b11416924f7b8545fccb7be4b570a56e3228c41283238a6da5e1f2453a2706538f64bc723ca12d3d62c8c08ed223bcfc758c00c64c0d302fe76084b6358cadc38dbe4b9d998707b4b56acb70b37574242f602d7f269361e87c40ee8409e579b19ab948397c6d398b62bdcaee159f293f771a0720bd2655d50c67c292e8d0674a127afd07641652b26aa1461ecf927a3152b418a066038dffd2e9bf3d7854420dc1e9a23040fc4fc1d81f2c55c51609fd5cda0c8d4aec9489f640902585816176acd564ddc6b80e5424bff2ac339853d5059ee026f0e0d719d405b2935108389fe46104efcac2490ffaa742d473512fbcca325b3319e1f98eb3eab868a7a8606de71bb59db82351c2eb179bec0d604193ace31dac48253b90e7333bec911a83357f52a5984bf38867ea69de4d2755afa09a6dacfd96a2bc5123bc662af22144ef8477e7e015d32caae045955df4dc8d3f26794c1b88fa649375ebc1f2cab2c1cf5a36105cd254b0792ad8e4874bf974ceb04e2888ac03bf3ee76d37b586169faa939654e293010b94aad986c4ebec8e47845015a41e28879a89b52ca6cecfb8215597464fddc096ee0e2fea60cc4f52020b56378fd898aa8b36478f4781b512565d3f46e8bd0b094c39e355ff21e5524e11cde4c42d1d2bd802d2a0e6caa2cbf1d9a7e2dbc980e88e8259d2de50a7d510f887b62db722771ae051569448da7072397b567613e68b1183c3aa42cb38f60e476352b1b458cbc74764dd7a64da2c56cd44f0e4fed76043daae3a87483751106a05d1cbf010116841f79e5838144f713c0f6191d2de376b6b89f91f4990f9233021fb542ea78c660f0e6026177a969010182a54a96b207b04104fa9892dc488a097adc65ce1da2ba21a4403d0eee579315ffd88658aef34b73724c4e03b23bb22743f2fffc0d827614042d11ea35bcabf3a32c3afe568503ea01a3a2e7552801195d39213e1c642b4b23c70720332dd9eec7eee08aa6cae79a88502818f782f285740824a685c8fa34f08e1368ae4a3e6e2601c293b17f5599b2ce826503b5d737012367245582b045c4936d81549826253e1a9b6aabd58ab226b23e7802124a9a9823e409c9142cde16f48206661a97acd04647ac6db6e10964ca9da7ab6784e16e0801f9b45694a5731057070aada6fd414c3a07f7b400f5b7d724d9208755794804c724c321942adb6b9262ac1ddee91e849600ee3959c660fb6c1e228fdcfc543163e59d3ff671d7c09072ae630f06dd106eb83ca2d4484498ac4167343db829e9db12003d093866a0a350005592d575f6b3717bb818aedcd756a9b73e77abdc3e5bbb3f1f1942517af3447c24a6b90968934833f9442927a157c5fdd09bf3a40992971960c7805e93b656e9d78aa4894ce663c6adeea73af3f79447a51442a5f70680c3b0b7a1b09abb3b0a6121e8e8f7ed8037c1104ca932a73073ecdf6217f038d3a1391ed750e74a1bad8d96a4874b3254741ae0ef3edd35467dae3dec20e26a9a8e02254a6c4b739ea73761a464389bb244681051635ea862990ee6f516c713e539253c951fe394174c30e8a294a49be673d657a4fd4657277931b58e515a994a1a8b991eaeffa6751b5e7f42f89c644fa9067d71f3ad435023002bfed92bc6af2de5f6b1ac3e63ce5c226919540d3d53e487c29ec811327b9ddad96c2f0706b4f65a8028e63713d0d1da3c058bbd100fe01e39fa71f0c22278ca5460486bb705a1e77736268ae1fc68b7747e8d5fd127207594cb294eaae6a8cee9683d0babbe02492f71e8a795485f836b94d57940805291e612ca8d9f88c1f9eb5308cf01876b574577f90526be4565f4e4dcda73b6232deeadc53eaffc05a2b30a4a8103b655da00ceb526a0b4a21f0bd63421eac856f4e1f99f609d45c43a4c78045337b7a52dcb322e08e8810d19f09f969d7260a8e0dd731fe8e7191a118b5b50aed28dcabde0f140b4df449d8fb6847281a4c971b7b1234b90187ee6c165db11c730091e6745c969c66721015cc0616a44798f5211c886ef56dc9ecef9dcd10c3630fb3d00592c1d4634bf76dad52d1247d5ce4d1e8eb6db1df1d5ac492bf6f38a4a8565ebc918e00cc928b1db275e2bced9a173562ea336f304695f767eb27d63167377423133f7dad480be22e81ca91b95425b40d2c5eea57941a7326b0fddca94f5e0c079c600313e3ca9425c10671a798349236135b505e8d8025894026a864980573a93dfac1daf70748b38eb0297f5854d003323d5cbd5b1729401035e7e29098007d18a1cf16dc9676e1835d106ff3638621b072e7ca5e231382e8bcb2d3df044fb8b94face986b770351558d3340d4bd4f47207d05a3492e94b9098373049cd0aa54a94b254127c6ff5af440e30a0432d4b8edd51f0bb7a39c9eb7979fd7c6ada37f629fbdeaa4ebbff44c714837b40d016f90aedb789f8263b6c3076431d262e7f452e566c0a0b68cdc5c7d2b2676c5d920577a524030c9f0c64fcff52b264c9f2e9fcb979ed09cf0451fb543ee3fc185c09a19a6e662e60cf982e41f1ff47ead6c45f661d1c542b33372c03506071269b9c19e7560e93af690ceeea83a4d40ec8647312332f1c8aa7993da4461f28bd589c82deb66eb107ee0e68b87b312a40e3aa5d359131835f104ff5a6bf69de2158c149d337108c4a34d734805b880b8040571554853a91c4f8b39bd3f32841d708529b0e036617d7459d55005d8f2a89b95017e3a4da812748e5cc334382913047daae0bb6e6da1cf06307b49e79b54a551f7206ea5b07a7393a883b2b5454654392437db9abf09a746fc2235e3f1cbad4d582009c581c37635ce1eb5a73344e0672907a21f92131935b337625099a73b4b19b238735b771531c91718be21c918468b65b859700e8093c44c3cb0377708eb0dd9cb123e7e2b069803909f2af5c56019a0c7be49d8c2bdfa2586ccb4a3abe01f8744f5d1337b02e5dd44bf880c580e3dfbc47564ea620d9cd183a3e73b67a6c3fa6280089e87ece5b484f3a7e8bb3713641f9d2d733fd32af0f1a622f3c0568e09a017b25ddd8de2f5ee62875e81d72bed337d5d37c3d28d434a889d068bccba6ef92a675d2bac1ae7a43598c254a79660941d1179344f50ad4b6f578530f32109fc00f44c6d235cdc2cc6bf13d24bb2bd67dbd425d411721805e293b0e286123cc054b81c88689cae25213b24379047b71602c9855d8b0084b2b7d1f062c2dc71369d67091075fc8ad9e4c356e5a3be5ee4e2b0ebd409227fc5797221b3c2788092d53161fa472e8201195c288be2e4e98f96c8560ba9d99dea13b098fdc5c35d98300d9fb0bf82de521f02d3507855d800d23a5e431783e092294e97b72e9fb23c2f460b548c95f225772e08bacd631975fa64f1d32acb36ab2b0f4d0f866f579b61d6ed9090278760b6762ccc0c88898646939e9b520e6daee5bb118b0aa7e5f32f89f9b3e9f5e9a1f406cecc6b0621d11e54f90303cae686c4c1aa28bf690ddffb0f4965ced2c5ba06261a5193dcbe2568f6be719a9aab54a195cd4225f31ae92f9386927d20d4e86c464313412932fd6486aa54626d0b12cea25859560e9aeac4f13b0fa71001c8916593c706628c05c33598a7099c8d50a70a1b2a447f41a7cfb12710c93f18ac0e8f552985b5062850172dfcbfa76dccd8937d26304751343e6c4a533ed14122288870d333f012609d1ac17fb3fd06d4804ca85ac3d51261318fa16840cfb901d77fe93cadee73870f93f73c2c450746122e6a6a91cf138d8f722e8894b1a5ab91452ecf661e26ee29d6b21d86b44f7dd4182f4a832d9a3b41aea4132d8827c792c62104f445c1024493f3a47bd7a15d2d2b637675a1b97193c221fca896b45eb5015155466530ab80de515128837c469a1540894f9fc09f4681f365eb17da9473d3121081d4f88da3399be5eeeb2dc3872cfd29e27b3b5bd5eb299d34898338b9f1910f444fa6dea1799d62f01e97d0e16563818fc3b76536d96f728c72ee9254195ea4c85c00618ca204e937cf789bea8110e07913b047110da07c1e732bb3e5263aa05356c2dc83360e0225b39e95dc84b94c551da5653926ab7c9a6d4bcfb9299a0804f039d4a400e73d6ad494e7f3ec67b78c47681869f7e7e0b18b582b99a521c2c081d0b21ebffc419b86dc2e23d24551cc9f2086ac804ffb5a2a739a895bfc01c8b960490c7f03e5831ee0072c88d592c4ced204ab9df5d4f10e15a0615f31c9948c020eb21d007b717a478634ef7051504ef6b1201750799d7c7c3a9b46be4d633761e2d08ff7536d350196a166558b86a9fc51f830066ce6459670ff41ce6e40413feed238ea91fbcc69303352e92b5e40e61afaab20710f6f39713113fd349a10b2ace7f0d26354595947f3a368bd3094ca1c635e7d041bc4fd69d4e22fb6639e085e4cd3bf4aac0761fe2b7c6e34037ea48e99841780b6593ec7aa560d1e074d2a324534acdb20953edc1a6a8a30d6de9004a772d0d11ff2a6f06bdf2eabf28b692e7e2b1be24805150aedb44707427e64fef2e1dc206cd44bb104c9c4cf28ada283fa1540957f745e65d9572765fc2a310e55ff1583ef0f34474853dd1d163bbd2c0e81b88cfd4088b689695da0c3f30d220b98a75cb317179220c7c7e21ebe6c71ac947455c6aea11404655b6e75611d8d7095b78bbd7aa10271a3993e89c912b998b5041ddad20b2a729177158a1c6f5f4742ca783b165217c4814a474841d5b20acd4d59bb44bcfde204e1c4f6a6f87c124be1b2f82a2d38b1e82ac5b5c6fa992bd2a151f4157fa2fd146dceb84e60dd84327bc72d80195930ef7a2f12dcd6e7be3b450a25797f84022b5ea904d860e44a8a765b37c1928a611766fc7c7e93e6011b57765595edd63811f52da96fe91491df6988ba2e772490f7cd500ceef92cce111aec704ba55b7e2fe7695988b5cc4628246759a30d5263a6c612377cc7402595d7e42431dd5986510e3e124691a9e1c36305c5e6e84f1644ce8e3a5544b37b4e95ee8e80e3980bdc19c89cdb1b9669bb1647a2bff771c3819a1abe1c53bb6989915320b71dcc840749013227d795ff080e398694071152a363198bfa66c91eed344855f25111d1073407cb1ea3f2adec049b21debf9b4cb9c38bf576c411ef6859bcdc31f543ed8cd2ff4ecc56ea2094144d80e1444dfb396dfbc38e64ccd62e5dc10660c06fa21d64af86868e4efcc540895a4a3348cd0720920162615a892d757fe009f7f0501684c2451aedc8458d10bac20da535dd4d70b89c472c5530deaf7739a5763d21e615edbc540d33a2cf7c0ad3118209a2f7182855590a7830acea9fbeb7029b1c30d7302917569e61bef5ef8600722fc5f1db9af88a7ebb02e75f7e1d457d3992c0dbaa2bda188ef82d5752a2dd31805a2203d9d881838acbf5f76fc3326ac447c9509cb026d7188dd4af17aa0808b9745e8dec2dd2b0f46fccc08d25018c19d831144fcff3e81955a29b3c68fcf9e0a94dfab12bf8da41b2a1fd0ba74d14ab59e90509ac03869ef2c8b76e00d76d5ed76013112248142d603e1c0397be2dc150c283eb75acd89cd7f07359c70b7a7b299040aa03ccf04f659d88752ce7e3cfc80fe96d8dd3d92113bc65f974ebcfcdf128f0e431d50e29928bdc04055cbc38f4f8d525702c628ecebf5e12c2dbdb12f5b485b5af969447c12bc0f314a2e4417ec6ed2c3c29d89c7a729f1e4f8f48fdbc9a5e2e04cd2611016061823191beadcaea2b7e6ba475a3b495bb3c48c0a7cbefade57ae82209aa7da9c4279f20745941130f0e6f3385b69a60a54000ef0d98810d7a31e16ab0e98f8c1deea67b78158dbabe8a30f8ec9dc922aaf6f06b846c7e0c55dc7299a09a177f8624f96759c89a5b369b12882ade105f9c43b08d88732a152dcbf850c39abbec719944fb364a98112f25f4e9cd404c2399cfb0fa7f92048651f6fade5b552a73803bd5dfd7d1cf2fc9eeb21135a937951ed0ae166aad5ffbeb4aca57b39fa710685ed2363765297083da179cf385f71f3933d57fe21e276463cb3ca262892aa88988b13aa2619a5120a976dc6e821dd90b35f8b55d10cb628fd6608524e567d2e7523a2c9c60bcd6059b0a462993ff0d60b554002b4b43d2adf7505be7c0139ba834b4848aeefe3174a3d1f28caf30659b23a77acf77439056466c54521bacb200989a5e3ebec72f441c87b3dcc31f84bbbe372c87b825020f9631e7854a43f69db9ab61f9d5d66318db7464b1dec24ca80417c24242d96b2f35e546e719c01606ee134810d7b4718e99a3f292213c8cfbd57cef4f86beed349200fbef70ec645246dbf70a267b82f335e81b6c5e6a02db6bc2e710662b290eeca9387fcc1abac9985f0bb00fb7022f598afd81cf672d04e3a8697276565d5ca1a2f9b1e0d4c5b6e6157400bdc037e45213807de2979a776a48a3716003b7642d57a57dc1d7ceea907325736d4d71d240c4ae00a7062fc377e267d246b36b3e8af6b2d98cce012c1b7175029c9cbf44b778389141abc626d54e1feebe3357ea6c2977a04a2aa04d0bda1cc7785ce51e0a500dc4cfee0b565be31a75f364f0b08a94cbb1360acd931f3ad78334da363c8a4d1441c4d6ff4c01deb102a51bf04a221d828b19efc8361569f3f99414b929f7cdbed412544181e8e7f1d7addba4a652ebd1128dd9c11e9a65c1f994025b967afd1bd1d6af4374b1dd750b57bae1fc6895ed4a034dc9694574f25550fce2147e58450ba92b6a0a9a3ae0822365024719ed09c4f8107f9276b6c0616e8202b5089f65cf9f0c9762a503dcba82f0408d62b0df6b656d480396f12f40dbe41c884ba1d8485011ae6982e55809615758dcd43b0791007985caeff8f7930a247763a96d171fd03771cc0825f391d4cc3567b24dd810610e2332f87a8ff2494ea3f04535dd0142bc25db9017ee85125b1a4a4215fcf6fdc12bb9bc894929452ca1db702940212031ecce7eeeeee16638c31c6ffffffef2eae162fd996d3962cd059ed6dc78f69341a8d466b7d9446a3d16818638c31feffff7fd78731aeeeeeeedefa7038738b16414c8434c3e06816aab990e6d793f016d20c6b2117d6858b4aa70b17f8d4e549ab6dd94e4833ac565d74fbcc1a27007c6ad925491cffffff2f93c964325aabb5f7f6ffd37f7981f960f27769dda5d12eac61d561187697f8ab6b71f9f0b73efceac21f5d1f167fc2bef9315f002f607c0574659744c7a4af0d3b1a3a6bea40d7b27a61b5abaf66decc97f298ca81a4acbce63a2a9ec36f50192b4346a553860c7cb26066117aacd27830d634a0653deb1d2679a384341b7073ab0354bef9b2e9584833027d830b694ea0898c4fc55493024b15ab26cda5a1b195d2d0e0d3253b023a5cc224c8ca3f55beeed280429a597e5858aca090e6969b24a4d96bf9ba97cdadd5ccf0ea5c1a021f6e3b764f92244992a41d478b046dd934d53c7695558a4f5caa5298094992a493aa14e85f69b4b22ccbb26cd80c7fef80ef71b575369bcd66b34109696ea9f6f64f4f81258c11484006c984244992c429d0deee6eb01b638c31c615666117e6d28f3dd7f7b6855048f34bd00b0cccf7af6c8df2f72f1bfb13d2fcb23e300b83553a61307cb2e3379d756559966559d2d98c0611d29c31f6ae7ee5934c48922449f253a56a2f14655996657953edf8bbbbbbdb4551144511e30ab3b01917bf2eb0309c90661732173131b49066002c10003efcb2b1b190e600eccd0bfbe245a5f3c50b7cb2341ff659eb1c0390024b3e33aba986644292244992b384a22ccb52559629b054adca2a45656f3beeeeee6e777777ffffffff1438e303f8fc7581f55e7cfe92216560c0f004f8fc653340921836468c4a678c18f8f4dd4047036bac31ffc8d86ad0388ee3388ea2288aa228fefcfc0830df5360c91b7f77bfdadb3f5360c9c96a6fffe31458c24e7f062e263cc018eff020fae136221db6db102e25ae2588a88551bc2ec6c6bbbbdce7a019ccd9c4b153cc0083f93f34976edd03347f5d1353031d0134e33973777777ff5cb2f0ec9205689ae1359c71777777b7e9048238151553680e7ac3964c4c5c37934cdbbc09cd71eecc5a4700cdb89fd58631c6ffeac26e74fcddeeed76bbdd4a184c0c72b95c2ed7ef9f62c1521d898ce3388ea3bdd65a6badfdffffafd56ab55aade6b9640153a3b55aad56abd96b55d6df3ec618638c71b88ac3e170b813985279ca5a6badb5222896c42a8a62adb5d65ac1d4ccce66b3d96c468348b16dadb5d65a5b8ee3388ee3288aa2288ab5d65a6b4a754bb6d65a6bad305d6d361bc618638c6badb5d6fa62adb5d65aff4e39d30cd3f47ef6eeeeee81a94f456ff44948f38a962a51486ac4c2277aebe69c73b5f209695e1959581488d228103af3ffffac366bdb276ee26aabeab66396159515bef8de7befbdffffffb3d96c369bcd66d471c9f37f556a1cc7711c4711144b6215ad288a258fdeeaed76ab364cd55ebff7de7befedae561445511445eff3db0d964a6badb5d65e511445f1de7befbde3388ee338b6ebbbf7de7b6f5b6badb5f6aa3ed38cb932cdc01863ecadbe9515568b8b8b2556511445511c426ff376bbdd66b557956ac72c2b2aabc76f5db2a8365aa1f8ab52607777779765398ee3388ea378af78c52b5ef18a576caf9e024be3388ee368c7711c478b44777777bbbbbb3b49922449628c31c6b82ccbb2eceeeeeefbffffff18638c31bef7de7bef8a6946374d1dad6fade8b15a5aae162f301606a6d20903d375b4ab9ded463a8ee3388e2fede2c4e28ba228da2134dab3aca8bcaf52548ee7cf558a2ae5eeeeee0e96aabd7d9b567bdb31f66a6fffffff7f777777575b96a5bbbbbb638c31c6f8ffffff03b74891cd1ec9f99c7d52d4c4e218a5b4561c5b1ae1dedb6d34beceffe392d1cd94a3869dede806eb74b47314833dcd6e771454c424348a62f42406f59d4ea7130a75b4000b45c46b1531738c4c8c189918fe3214dd72a501c16c140bdd4196b788c0d2083e3a36231b11f00b3b9b116e083c859ded689604f4c2ce7604247444cad8906ec20f3bdb5194d026cf94ad23b62224477028f2e9a9960ea140f308094daffb0e3f39e408f16e14502c129b0f3faebbbb7b777777b7bbbb7b774f0f0839d69da7bbbbbbdddddd79aaa8366c361f34baef0e3faa8dd568022949121a357cf0820e4341e0286ac1a7fb4ecf38438e90128a74dce8ee3288bd3dc0ae4556d8415a1f78dea0431045717777f7eeee6e779e3c8371a8eedddddddd3c3c47b3e290a1c38d9013215c5062490e484c501b3848538070058d1e383d807a8696b49125eecee8a37df4bd512c31654e50f2739301881bdb13385c115cfc60042ea6038622166e20aa517b547724361f66c811d243e82d72ebb1c3dd57d841be7b4ff7f474f7f4dc668f904475e428da61050e1551a008717f888afcc87f6d0c8a1a55f820c3121a78d8704b2aa2862b8809585c21850ab9216e0db72124119a4867babb3bd8eeee0e448312da0165e2d3d7ddddbdbbbb9bc773e00fc14891cc861e1c724a8e7c3044c28da2dd799a87a79b8747083d3264454ef7f5196a2188ede93c73a7781bd7c8123b7ee4f8edeeee28c21ee2eeeeeedddddd3d3dddddddeeeeee7906fbb0f0a3babbbb777777bb7b4f9eb144f3de2261671085db8e9a0a8d5b0e3e46e86e222082d4e86e433d41de9da77978ba7978f24c89b4d17d890c2199b3529113391ce4f420c3e28e4ba628f58d063937129ce881c409204cb8340cdd28019bca70839274a3bb83288acd347677f7b6b6bdebeeeeb69e6d724cfe9bc19c15e8c0c80e209c5c5104504fce79e65b8875444436b0814511409c48826788051d28dde919dd3d70afc288189c2881040f280ef80ca1df7242177239702969a500b672b8bd40a46334041210d9d201b666201147dcb884326b05e62c936370d8d9885022b4c93348ae256c4b481b114e025d68a90b0778bb93a043170ed0e6df447988b71615a0cd875fcd315c8ed25a5a58c54ae3e162b9fa8961ad2fd22805d4018779b70aa366970da0cd1713431b1bda2f16d6fcc5a80c4a657c61ed4c3535673fd7595108af234d13549cba536bf5c7a7ca9a44c9e1704dc849abb5f776fbed76ffc7fe8f71a9e4e152c9f3becf34bdef33994e2754974fb9130aec3a4a76047499ea00fd0425a1354a7b426fd058ee49e92314f4e3431afdf88cf366e24cd914bb2ed3da65db45d09d68add6dedbf676bbff637f8c4b25cffb4adef7994ca713ca7442a1403095528129952a2565b5525159616161b15a5a5c668cb0cb2ba69a19caacb0b07cb3cbac2ee3f05a117461976bbab0eb26ec611f6a3027035ecd852d27e0ac945627a0cdb769867f5528acd95b4ec0cefbda7fefd451994ae9a44b3c5c3873474e60636373279c99d668adb370ce2ac33589926b42567b6bdabffd658f4d35b8f42a05799fa9e633a12c0a55e944fde9339d6a50e02b8502533f2995a94695b27aa5d028e1cc2b9a5ba9acdc8493a509ad511d0a447f68104da24369b927e1a4b12754a6e349f9e32314e4431af98cf366e24cd9a44d20f3668a13826baa99a1ad63557bbbfd1d974adee7994ea8130a44a55429aa9495a94626c50481ca0acb0a0b8ba5c5a5e56bb95abc986a64582b045eafeed5c25423e33241b0ea5e30a69a19be7c39b4af57a5f3f527983f7599763e3b241d91f444f8ff4352ce060e481021b401f3121227b4c96012492b81ec094222217ba841068536790689073008a4015c014c1aea4026c72089a024d647205c9c07168a161160528e9b241d6ec4841a188947ecff5f067648230d21cb025740a191ab8343ff501667d6f7591ac3ff430de6ac46781d4532216421f1a094d66aef0fa4d15227bc1613aa14666a870e0993746c520e354928e9879934e438afa5c42bb9de51e342d63791a0b0d6de9b2456e1eeff4834a41fa5a41c9787d7c275266ae37a5ffd5751312d54c22e833495aa19a49f875209a9a98341c19839e7cc5d57410e944fa8748f5bbba101048000a3190000002114858138cbb25049d80314800b26524a407632202a3a26924802413a1063281061000601180418830c428c3184652d72b8d54c76d73db0cee0fe7d9f5d3fb5f3e4f5fc1dbefcccc7088a44dc784af9ae9f93e91b5017e84586f0eca1dfcaf36287d334ae5970484ab91740695e20571ebbf66ceb7424ba793392972f06bec0345e01abfe02d3d7bb6b2365085b06a68977d7c64d39cca07305371076baeab87989577fd434dc15cf8fb36315afeda338d2507a11c9d894e12e83d07dfc38a652c59cf22f082444b417ad9cb4f6d54d65586b4cf8c649d82cb6f21236ebb2cf1b62e20e4597ae95de774f68a6dd0735a988d57b251ac2573d16a331e125866302fda0856d7242657c006bc496adf0f6c57188b34b23510bf7c0876730a56a61e296e166e39691afbda3e42d28821a991ccc30c091e48fc0f7244eb259220f8f1a35becb84cc05c9198eb70aac904474457b3635e8d13fab48d9749b43e16443d3651413f2c8d626632d2b03412803be32de01a7049c941af3013c9b023ee0413952759c383a52e83e1ed7dc28395efb77f07b2ff7c533f4fc0cb910cb2aacfb528361180834b4ae8dc30dc35c62b1f167ff3a2fc6379a0fcdee69cc221b41b3ec552db3babf16564c96f762a02fb7ae9bc4c26a2b1feb7a30f342675756789ac6a7819c08d2c44a99572afaecd952448328744eeeabc731ed8dad8a9f45bcf80c31b228f34aa83f198f8975edc23a88c4bebb7163268ef818856251f6badc64ecb87fef148f3bddc414222e5c6e5ed14179634368c777af519096a9a90221ea5ddbacd2712c28360ff2ad8fde90ee55375f45feaf6117cd5e43f391839eab58dc27c80fbd240568adc1b6ab0e760991fd0f4062beffc0cf3009bfb5647772324118a42fabca70bf468c3f211568851f52ccfe039431ee3f70be4cc2ae1ad91d18491026e6cbaa23bcad31c34b480552be8cfec0ad57be6ccd9171bbdd675eebd353387fef188bcb2fb3d4ad8d55976663a1d9324c29b8cf4f788ee770a94efa2af265314a32e294cc912ed546d8cf17571c35fb0173370e72d6d9b2f44861d4594f12baf9de7d14df111c80fbb92b2bf4f617c3bf964a9034de1c98b93d4ba83830a25499c571789d21d77f3cd8d4825a6a735cb6ed7ff3f44d85b42dedbe229e57f7f45bbbf96d25b66543517ada592ce13cb0197fd06ce12e7d15e2c55600c23c1d73660d357c9a9eeaf492205fa8da7fbcd3b71a0aef5c698840123f7cb6876b9ea82adaf33d76cc4632f4d45deaa060687068dc754c0bdfb1eac12c85050cd5a154c0eac67ad9f2f52842d76af6ad4f47c4259b02bea2697b5e5bc1cca882ff7aa29bea8c85c833c0b4e5e3259806f2bcd25a45c1b0572ba5eda7f823b852b5f229a57c261bd2b08aea4a1563e7da12b701fcd822f31a2015e7ef4f11c682740b93dbe8e3770d9b049e96f98a856df9fbed729833afbba53d7e7e966bf9332eac970a4d8c135f859c642b8516720779c7eae0acfdaf76c134f081322c7b859264eb699f48e1d2c93f4dfe34551d5ce2a35b803e50ed729c06309ae2638d143afbdf5ec23ab02e9d9e8372538eb58f0f918cffd69b3f649ba7ef1cc258d7fff7d3615e5a696bcbd56c966b42e085c8a8543dae4d8d7e2c81293db0bebddcda23d8df0f9b62806bf9a9c4dda6120ea71d990769197d746061a653afd40700e37d6aaa0b350a4b016db159ceb7288870d5ffe657a2fcbab1a9add1ecc624f7df44f1cd918a56a40a3f593b976ccbf85d53f131d4993c00d86805275a8133fd21ba1d451923f945f8141ac2e3ff2f37584a2a4850504ef6054758cad51f2bbe75a5a0192291c08cf1e70decc9a94cd3bf40812589585295acde0cc9271a32d5110b6cbb0fd437b2f25d35ce4de3e73ab1b008e6903b3bdafff65ae0446f1d92fa345a10db3564a709989d108d1ef358026eee0364699f0839554b3d07bbcd4147cbb930d0a86d64e57d42763ffd708fd96ee35b670831a4ff54969c538c7d1f8b9c8c09886ba94c9f9be09248997b6aaa3d35308c9e70d9df176f8608c455af51b53e0d2374f17eda6ae66eb19bba16d517ae213c85752cd1535ff6079867b7a2b9788b08a17d71862611478fa3c5d78a102c33e09ec504f3f46280533fdc15c54d0360a43afc384317548a85040fe6a7366fcded381d3c95940fb430ff8604589ef0c70f807f9441eb2ec304c5787ea00039575646f4ef6757564ab7399595fc3bdbd2ab7b2bc370de2a1dbc1bde5b1906a2737fabdb4d28797983ecadd2c409fcc452ff58e5399a1364dc9601388b2ad8f02c733eceb0a628722001854523d9a1c6fd99430d8fd99efc6bd80666f54bc6b79d6116f2cbc64a7c6eb8a11b93bd9cae44a6139d73e0c30f63386f54ae5a0144a0504fea498612942fc051141cc8e2cdcfff992e846252e50c303b99a5aafca1955ec7827ab9e0a7c86791380326673227692d291ada8add0be650b67d1f312793c656716a04b5495a94fa8aa7b8cb806ca4b6a3c7229ed43c1fb0a9161a30831a6d1c000f7db4512d4bdaeb73420968012fb84738d37cfa187a8b4f2e5edae4f01586a1ebfb4cea3a113b772fdda99e319b8b9f61e8892b1a09bc864064fdcfa54595de4fca517b5ce4b8dc1667d79929f23271e7055a53cc1e29e4d7c8ea0935ffbc9cdaa532e601e10982676485ce62ecb013be71653fa13cfc17acb6a05ff2752b98ee1a7879236bb32385bc97965a441355b137b6877db345a946d79b3d9d5112cb225ce4adb5d41fd46831e425313fb8afdd1290ac0f51c9b88ca0fbb709b8b9b13771df0a299cbf6ec7fc767d004d2b410aeef7a8a3aa281de8bbadda7aa8b9e23feb59acc1c07c4427d697796420d49ab71d0df60360dbb26b9efb955d8136ee04120e2baed7d3414fead29bc40d71af1784dde8878cbf58f1e0e1b350b9b618926a65ee2f62d337bc1e9d5eb1ea86495700665cf63e347fde6755e9fc51b799bb92c162ff9985c7734be70182c00f062aa263d9970dd1dab2279554a9ca0f61d675ad65c0d76afa2d8645c0b1bcd98ae42368e2a7cad669995f959be8bf5e1fd28a9d3dc6ae453646e3eb82403746cd446743ddcdeef6d2c96c586c1c193474baffd2059b9c00db15c2d1176a13d6b7726893cd50c6bbe93a6477b4225d6b872a140b086d0bc7c9358a39f621d1a0e8760571122e47586eb51a519adac2a1f3281307a2795d94f77d78a80712305085a12056ddfc081ee38bb83e12a4a0f25472e50f832d0c2feb2e3c37d4e2a7ca95ff7c5eaca6d981945008798022288efe93bd12ccaa01186a0b3d8a6aab59cf854d64f1861d78aceb3be76b959b0ce81a9402074a7ec74aea0908e900b8276c4645bcfcc1f59ad835c77261aed8ab7d2c6fc8352cb59b0902050754eaddf7a602d2390428757380aa3c4bf4397198b64e3fd13c6a4ce19f1d471351869a8af9677fa9b66e2bfce9b75a98a403b929a9a6ef91908fd8bc800d310853db1310baa37339bcdd775c4d92fb8461421eb451051c8893e22045ef97736de3eac8ddcc8c6455ad822dab3d0320051b26c7755ef77d095f064f3e56a3619ce1d47306dc8492e80d02d6c4ad485fe0a3f33ffbaf6416431b3573306ba190108a9f33842293480fb1194c750fbc6c48242ecd3b8e9c06252f0324b142abe57af26cd8183f3cd7ede6ad49b76e03f66863cef5e489963e6d49706b274f048992a05adf117a0c06d5b792a8a6adbafbf4aa96d60885afeb65dbeb18b7c70193ff3521576047eaa8ed57258cac82e879a215363c0b5afebf88a0121466ee2a13f2e6b65344d0424c9d3a52e3480161214f6fcb62d8af22d4153b52f2bef23a34e51c350b98b23168e152e3940c756200740d45c546937377df52d007e7b2bbf13f8d5e995d3313d11113c201b657350cd22c2c2e1edb354a001288e1df45d1862d822677aa0ca0b9320da2612d4710ca229632133de4e777c37f3bf868b8238c73380a80a26a02a91c4f4ccd6b260df9a8baee05da9b60543b6100e94a05fcfb33c65a9c2df7dd0293d61c288dcf7a7004a7a163e1c0f6489616dbe781e048ff1aaf73f676b3d3c67eb9996cac5a8bb20b923590d8d93d1581dcccc20d6ed1b86db26d2a8688199a341a33596c0a6aa8733faebae434ba27addc2a2a03499dc2827a71687d60e77bcb6bc0211c698d5ada47a4a4455365360842df58d26bcd0d71a9f52e500c6a8a2d2a091914e3faaa29f534cd782bbe401946c7f762795d62d466a1cef8b5f509fd8d41b9cb2fd6effeb87be5966adaf34683439aec99046e35d25e22cd5fb6f53fe8c41d0773a17430ab640ade5c8b8c8d4851f2fad6498585cc16a721936c6dfac82789b89060149fd04aaa8babbe5be2d5bf82fabd3865b395b1b9511ba2f7aab0ff23d9b86d6eb9f1a3d42490f57b8835f34b8815820b19704e45586969bfe92b0f0bb7480d2be1327cf261b2d3cc2e0bc341a2edb2aa6275b1cd89b8c43d2011501a1f40471e9f16208be9a52156751abd1c5c7e9cdbbf20d2b23d0a9cb88c64e0ef7a1ace61d111fd2916a428301801d1ec00e7c64d1e5510609daf634ab8599e19674c33d3b0b743146496524999b62455020c3a2db264bec2273cb7be9e511706e19af04dc3da2f21eacfe6788516ccfb0a47ba16341037298f43976528cb6d57429885f03365554cb64de0640550db9ba7fa71c1183c4b57a8f909142083e0f7d038f2c9b9b84cc7ae4e3c6116ffaadd942b79e5bc75417030e62cacdbec41ccee065ed39debae0a41e85192c69075fe78ff286a6d6cc1706a2a9e702a4a9f0f5db6079a3033fb80e24a77f7aa96e3c51bf95ab12c79e7655dc79ac569714f76e93ddc7baff6aedfdfb7eed01312f4313e38116b4dc0eb74b2e8b9c35e714635586b981650c2760d91341ab6d20cd0f78305c726f940b48965e53822eeb29705e018e918a94909471ae8299d3ca92b91c473c8e24aff8249ebc3aad4f9e0f0493b1165bf3f0075ff052d9a676eda94bd239145b32368e1e609133326cd142488eea5fc931cba1dbf3be3912bc29d8b5a28768c1d39ffb89e1728b813f7a245c40a73e30e7251a96c1149094d9946b66b91c50efde0ffff4f150f4f8b962d2b4961147370ea922ded5732756944638a6d49aa00aab6260ea150b2559f312a437b35634a8322627a54b880ead39ed5ecd2af41be46c19f9876be60208c97b21685858c51b92b4136d6a081f50e76bcd81d89e3efac0b009c23dc715083cf68671421112524a8501b67d16862c6b23d5ba68b3e92ae2c2c94e724fe2dddd0d41f494e334aac28292ba28a511eecf88ed2b9a4023cf262f7c23ca29a121bc8c863893bec292c28cbcd0e9a5580e2f58c58244d56ac1253cf36c90da245acab2f1131975d16c01764c3484d4ab8b197504268214b402ff9a1366666b54008f9e8b290172190e1595076140da26af688e19a06a9e51bc24edbffedf9d0164ed3a7de1a8f916091f585676262bf815665284dc3292598190ba6ad5c600c19e7654438112706596a0ab93a373ac855ba41ca08b3131f17df474a964c047cd077267a14923828f667876a6bf9b746cc5b5d6682e4a0315578357a62a3bf020e484f531434c9ed86ef91850ec3b3a58fb854b9ef121691cc6a9881e506feb3d8cbe54a9b07d9d627f7e41d10713776dac6230ae71f42bf6144f7caa0e1226454ee03e61a6627042a5026bb5a1eb8f902765d27dc44e40325610acfed099c243c1fe3e676aaeaf85840e99e3e35f82abc9fd45f658c028a0fea14f6dcc365ea83c5c041e26247f4a0a67e7df12c63e5eb6131cb6d92e31b5a1c41eb03a04ee6f04bdbe6352b3d2aa80ff3bce79c1b8a86dc3abd5d745a7c5f9e831825de1b1542d86f4abc0f827a5c9d6476c18dae75222d28aa0601a3b97092f4ee33db579f5bf838e5745930087208d8f833cbece0521d21c7ad544d9f99e5de4a7fa1dd76942e1897321dbace50fe951eb7874de9e129ea6a6b7026339486930bc4ab28eb9bfbfc9d3cde069494ddcb78a3fc8301cfe3eda03b8b51c01c4702bc0d1686f1b4ae858b0505fb5bb37d8120644fc2892804c76ea462b28fd60c8b9687fcf615a4c5ab4458e454913b0d8994234d519466ee89f9e24490f916bb1ac4d500491463f6b880857cde93151ea22c912b15e206554f1743940a77bc9b3868c491d3b664cba8def02ec12dd05b9803b62be7a2835f625f5d449e6aa987d88621cb63ab35a8d4b8ec9689d95012d18935b1dae908af41c62c90a90d87c2eeda951217a24901ccbf6b075fb5a964b9180d21517c289af6e11cfbc209a33a430243d6edea10da9b0651c3cc9ed10ba8289554fce84fbcbb86a270e410709d71405cbc8ad404e5a706f785a504726665660cb59ce406273522d64a6c123f606db9501c8e12a5ae39e27bc32b04aa46ec7f492969729d5acfc880d8b4597b5c0daf8aac10a53c5a6aaaac746c91a1cedd86ca5bc3aaae20f37bc28ac5f043752f1796141ece9c1a3d811a234fe4413459aa8345974393c74c4344947b697a2ce0b887095c4aa24296227190b000bf8a811a433f92481d3dc0c9c535b4c00751247ca01c7b6a71ca450ea4061742943de46556701174400ea0eeec2157646fa6696bb72fa79bc4bac85e3330638a2da6a32edf62d2c868d015adea3e697066109d7ef8eeebb02d4ba04a3556341e6b2877b8f18086b52e4caa5a7c3b1a1bc0e13d46ee78a87317b48e75b1ba0e49a0995e1257c7a37e31bcae94a0472f949dfe25ba8317785ffe6e52cd195402b8d03f982a3a3ecb14bf5186869ae102bc80c27b2b7227bae75a48103a4282018e4028860a9d0f840f3be54b682a67bbab0c1a6f25cde7954106f253c5a26e65d3cbebb1446e075609e748a1d87281efe5a3db795bec00c0d0225484b52ae46527b010de2d165a935608af9aea1ef5afcc13c5e9d0875291e871557463d361707a3369baa2aa2f4032499f8739879521544f482a7d5bd0d473298f24587d8453b7a60fdf00c092f87818783e073e41fa136687c85a70c3cb235818171d08e1f7c2b5d3f7ce7b46d23587b0cdc6e0c11981c06ea1fc4a20e8eb6fa2a945c0d3245a9a21360fb4e9275d11e3ef1e28da7eca8c419f9453d06fd39bb5f426213fe47909df7a82b1190f0b51dda427bcf39eefee73918721320708c8df87d3958fd08c7bbeba2f8ae4603cfd6935ce1b7c18a9010e234006736823b837fae44a848b29485d79c88a880f1dc168bed12b09844a0ccf7d8b1124b88de288e0bca8c6efd5d02b0c852d0d668f019620535d3a5bfa87e80db55760c206f163168d44485c6a611429a410dab99b62d1752d8540433674562d333aae380d0abe0c29731d7c7e7a0dcb98d4cd27856e28961e01ad94fdf4753f211242b02aa1733a8f8255ca7aa0b5a926c157f3535801c0f8955559858f57265731812a1559d93dc678bdd76459e0a7650a13b9427dbeec95b847e998693a1d414369470ca4e111141439e650fa689868b7c525f57b9a07b0e5b32903d70dad878f996aff6c7c1929c3d78c3ce67489acef24a52227539dd5744f1462424a0611821114c38cefa4c72901a00bddd7d02730e34756a0ed3128a4feaf37e9bbc6703446ade058cbc3618da6ea6f73e5bec7b23840878d4b8fc7cfc620d1bc3e65c0e1e8fbd2b3f078caa165e121f29b02b5972dcae2e873164c9460b20122725c2a9d3bdd9c59d8832b29dbb87f4be823ad31c0bcfee18395b2562ee0a5a39c7a64510acfc8555b6383493d4b9f8ad6a909915698f52a659b80d3c9ec8e82b7f35b8e707697ebc4fb68e6e489f793b7c403d50df148fff9117af9cb365efed098ea7e2e5e3a560e02437196e9b26e58dfb99a2e3771cf8addc25bf6cb42459c67a66e6daaa1c8f495786d166cf23bb77b0eb6fa5063b9baf973e8649cecb2367a3a09cdb324a363857943a74ec9a735232ba23da71025279e23851d2730c7f0a3695a2b87ef0898fd292259f03b2aaa92cab481c352466966e902bd575a83ee263efd4f199c1ea64d1743da3ba1f93bb23dcd4afcbe24f0eac366d3774b33595d4f66ffe6d6beee6b7f839b45db8a55d9eab6ea0703ac2aa61b26702d865cf07b590763c61eb9103cd47f429a3167654fda2bd7d5743fc4d5d4404a1e537993440a3d6209abb76a6cd2c25ca514cf2d620a55e1199a74980018d49957f2fe1147a50054262b74af08e0e65ef1a92b70a26eb5ad2ffa0eda39269c73021e3c0353186ac812e4cbe24ef25cce85bd34e9c5b0efc493fb2994258986feca93d4360c29524de17384ac1822be64281c3ad7ba7fd4a12505c309605c4b5762ecbc6a7d1e7883f7dd9d2bb3fe8b8b5c14a88d2d3aa904648a147463a0cc5e560afe32161524d845428779e5807d4a98389027a2979ac3f1f7c15b081d8a178b0df2a12612c6a646fdbc2e84acfde098e041c9df56c78a74d570dcfad2ec3a4a883f6bbe2af51c81b0aaf4f821d5a258caae6cd64ef0c041a109911cf3465c08565abb8b8d27382e0b42feee4ea7ec7a061184594c89304030866208a34a000792a66459a1ad88e9b7d40250f1fbe30ae56cfb41dcc7f86f35682a4e9d8fca836a9cfee623a1f1d966cc199fe661a5b2c9b18aaea7159ba9f86064d275a84e7fe7feaad4fdafc86be2fd1276545150b87ca956324097f22081164593f5c754715821a8090ee5c5c363bfbfcf6672078477438c3bffd47a03772cf603443cb2208850af4dd06b458d0f9357c405cb4b560a6d33a0a77a905e2bac0a24610621452383f01165106644144c0da854d001234a79e3e6d6a650aa232d13a3222ae782fead859eb24aa22c0db3d1861eac866e52a21b768028601595a6209c578ef3b4801f9aaece43244f58cc539977bd8f71695c20544e62bfcc51a5e56e4c71d7779e114d4cffb257e6f9c5026098c78b23a68a75a8aa12136eaa188f135572029e8aea244de5237600cb85901c477c826cc55c9135a3e735d091cf531add507165c58b17dd9fcc3c1bd3fa6fbc054348ca5ebcfed2f7af3f1e209429da7731e169321888374e23c6327e8995129e98376b8ae9e2ac98d6881643e957846bea6cf7d2ecb972c39bdb3a98c6afe5427e70f7a5fc4861d48d671d961e21445f6ce45b64834d1b510906388671540c998d2dfcc6accc6e4d309b8ad7ff775d00be77709a07e06470a96630b387a9486626b3bef45d8bacb1b3f8e0b2df4487b6df1df828bce6fd17ef82859dacf42bf69c76d6e3bc63f432b21e696b6264b6a8acc4c6f14a0def75cfc2057f21867f3ae18f86920413ff140c62122739be9cfcb3a6c8b3228a4c6210978a4ac99c80d25fb7c843a69f00fbe88185242fda1a175234ad6b24eb2873166224849363516b7911c2098a2afa0810ed24ed27215886b7d83128a98526e756cee491936c43c5c4b38264b9f713cacdc84a32b7d077f7144aa496fcef9b417e29b29fa4041e0a599bfee344baee935c57091fe517782ec1e4b0ac9a92e937dd27f40243b9adf4941e6016c359caa4f9d94b9c1305cd0f1356c6155a53de0f111a0a1e2bc5e1a0eccdc0a66b74a09bf31529c237c3e77fbfa4461381fefd2fb9282a2ac0c018a9b08536e85b8c070b21a2982653919ece341099d2f33b47d18802e3665e6f08d8a17e36199099bb31dfb82886160e8baa77ffdab2d3b9036fd18a4255ba706b3d46a3108314b1f468939560e4720c957c1afc995932bac77b5db7622bd5d0d54991a19df281028d1835e756295a14496761136b18b147b8a4ec9119cb1e8924003eda88b81f13d3f88d224922e16c2cc42f0980c6c4c9133571bb208d6c2d13964ca46e76502a626e3a089b32843d980dd8c372d1f7f19483dadf01742eace9fcd183c21af755f174b7a52c8ccf5a424c2d602183cc9c48baea3d63990328ba9e9a1f50254aefa093334f07fa3928e32ad0c9fb5b9bb83af31861c29b20c1335eea2321210d8260bbf69919f99661e49809f36596f72527e5b5abeb19dc47c8024ba25a50388a0b340977c128d6c3c817409de217f8ffbb1b2b19f8f90dbf5728187599e1138996054af99686b92a9151827ded7c4118317f8ea948cce8bdd186872550cfa5383549a0e5f333be428a28e424c8b73dfbe50a20c2c612f16a10e3b61fcd5b012b66d6ae46fa29000245d357b30352e469c4ab013d7f50ae09b28c5668611544dbe016817520ba497730794b5d2d221580f347b5894175e11b46500489100c61f8a155e196d37b63f0a421f082c5c6cce44b9267c8ed5599bf50082289957a4c37fedd87814c72559521d309f569ce3cb416f785890aee6826d5583baa4290a8a061bca81f9e18be205aa5fbc30ada591106584f940d2c26bab64047b9b6df8ad1ba969804cf6efd38544b1cc8a61c972556ec11560127b2955a92b9b1b2ff740b0eed8f6598ed4d16d99e96d504e43076b52e90155815b3cc9c481bfe8252caf882af526adaa14e06515d60a34aa08bb59a7d185f22caafbda190090801c4088e9042fd2783e34967162afa614579702e06f2329002db756c31a75827224ff0cd05ad858ff6c0f8aeaee39e6b9dae75509e2d156c54ce09b77fd4a8836e6f6745030d277170469ae1f6508388d301554d56345128d36a61c4a6c81e9b0275800de30705c63d07799d6e91f7380c816e83cda2dacb7d7c9ff709a822a234b6c35b9c5b1a04919be37e31f11089c52cb708f2e8ba3526413466358c0ab34ec7efce588ac154b560a89da766f65d23ddf28710a34140943cd2e5ca46b955cce2fced06c3dd480da279d92f25222cf0fe7c68ab85bfe2248221ba4881223e43c0ad0f127e2ad0f1847dc097e16de66f118c0e9eb2b1cf6018ee8ccbafcd45164199685c73dd214fba8179f8414f40bb788c8433290a8e06ca0095670f7e32e4aa39a09b7c46bcaea09624df6309ce6103060d870ffa3ee7e79a69700411234085fdda2b73541748efb84d031f45a0192a469250432299de9db5f74c6aff06602759b6c182b3a483c50966f29981d474ce842efc2642d0187463698e5de5b435e89940151f2ae042bb8d02e8d11da12156d533945f18f859325a083727e2c8942f1416b48389ee4eaec6c93dbc4cee10b0996f42c9e192380ba6ca9f9923730a135ad4f61c3be1e42103bbb6858f91fbf26cb67ec69d9fdea5b3cff49ce3216b66b5c500a376ecf7bda06cfa3d8aca5a39279dd002f23b7105cf7ca13907c893cb4b7a9f514c58b2b11257d06840c9b91d329e43664683e8dd86019a7e6a94812d83fba878a86de648850a4867afd6d30168a0532ea7022996e50eb1f7ffa52ffa9239405f195681f75a0ad798e5d46af1bd82891b498ed736f5024516f64301b218c1ffd9f13e8eae41c2583cf98cd53f8990f138005d133b77a66218699517e359a1e1a6f8cb157b72b8ccd078b357c892c122463f7b404d0fa634aaf7ae5a0174cf9324c73d6d9ee83fc62faee041361136bf22959a4ea14710667acd8d99b17fce732ca2406b1e44c0ca5ed28a947d7dce5ec1f949ce107fab84868b5840828064b99e2bf24d26a4334188f8603f4826540fc28f6e44e01cc4e1352224410da3b70af91d5584d1f5d8b61d45113b0a5b580d3a360f4d2e685e10a13ed7afd800588284b1d406a04e5aa1d461d0ea81566fb89256e2d1ecc7557695b0cab90ceecac6c3e168f87cb25dd15c896e8ea5c5a2e32c5ed7041d6f4c4476b50474574a407791047ca5a3cc6fb6616f9c1b1247693451f98f6081bb4ad7ac16bcd89c97a61cce01d2c5cfac00740f42e6ca4bb624dc099c10ea7ca608ed890af2fe0d2f019d286bd502b4270815d7379860815f8b1378c26c252fcefc506fe71d5f99aab7f3c25e3998b7f34eaf4c793b5f0ee7080ab5ef04489fbd36a915a9422a8ef20e242f5d1ed9be3eef62f06f444557d58223ddd4d4bcc0d6199e66ada3e8daf9e8d8bbb6d3897d302a6d3a69afc8fe4d99397380d2922fbf5651b5e039774ab6fa27aca885faceb1a55754375af706b44e15b9e9fd896af73fe319fc63556a6fcbf3cd10eed733062e43e3f539c06c22ddcd1ab9deb645da4d22576e68a3dcb635a936f2872456d8382f60203e59dde9b48e9a8aefdb6d42e15265febd82393c680785a534431eafc3b2ec5de4acc789f85b395428efc97311552726d9dc0f0f0533675f9924d7691ea6e1b9dcb410fe92a2e8db8983833927173c27d2c1b336e2947fc8147b2b8fa6592d874b7c6975d88eb48389a63d64d9512411f7df45aa8ef8d34e472113394444510a9e931e82a8882abef95b179243ddb8cdad5c6dd2c0923e0dac6c5d9efb394d66042a70504a66d41398f874ce4af8bfd82a8ec49709c99bc1f53216c372ed3ececeab6d6f32b00122966be2e3115b1793c71b9ddad14e038b72af2ba4b6c903c99451030947f4023f403e991736c9033eb385ed94a157372c1a3af2a2cb177f34deda91ae1ab524c0c47d3bb87e22cc1994c29f14ac0e6de0bac104ab3719ccbcf260e11d09d34912e0ae8126374650bb2fa3c4cdcd3fc9e788e0330ad15f62d3eb185e48adff71beb9bc28defd29a0a0ac5c5a4ab43b72828bf4a5fa1805aa2ad79cda7381a91d1794da9f9421f70c66e6380465b2af6146b3089d33544c05ead5de0d514e5d5fb1831ab78f30649a438a6a08fc6c27aea81533f4de46237a8f7b64a859887c2a7bbd1502804f2318072ef88ac525615f91cf06cfdf6b36d0d34a70564a7659451061aa9865950aae695021e1773624490039f312ee8fe91b434fba38cfacdc0e09f36f61cc441beae399435d0aa6e78cc4bdb6480608957597819e029622cd9cdcf4d529711c544817376941df57bdd4db44cae3f0c0b7f80320d720f7d85945910c6030a169aae9f90204cf6a8644983f9644e10f305b3996cbeb1e89840655a8c33ccb491092f009bba4fdff85e0de78c16c3cddac88fd3b179deb4b51bfc14010551dfeb1f1716e9dd18ef790fa8e1c771b14101bf2b39fea98d63151d05d85542897f13437a75ac8cf80f21cb3946986394005f069c9289b748227dc1903d1ea03c70874007ebd0deccf9481c14117881dad4d0580c1064c8378ab22a5658116f7d59720a7e5348845a2eb72786f912c42c67f54814be72b2cd3c51058f567b135b2af70be79d15f543000e5fe735a7fb43030001096fa66cd5d950a43ee3c5aa04f07b14c1939a526e818bc8abf574edc595c716034e1aa27065b9b42fd78fa32c64f15f5d03e1d414efd852c0f0c33052cc9017a0b89365e801211b10ea8bee70d8a94aacf8ae8ee4e1ab252b4aebba4e42ff3799e001077a83de30a04f416639d2c5a413367dca04094a5aa11466f29b7fb1c06c5bb4f5f025706ea503d0943b8aab0f78db124b54835701bc5c02fb7513699a494014903490362037ff9a992b02fa24057129a0cf777dc7eb33077d4b2df32992c53f77661ba31dbe2e82fee877d11988eb13386d8bef16e7f7143b00e28e812bbf7de6bebbd321fd98dd716ef77ff7ddd98f768ed14465b49841849159e1747ec1bbb116f11232ce4f98e5102b59288000ca2ddf19b672c094916ddf724d9bdc655ae0439dadde96c184c37fa1631b218c5b184c58fe377ff4f8ebf7108a87b24f5dbdd7d646754117e0a23c6ef10418608498eb15a15cacb194b58747fe20a228820429cdfba311489445b2412eded62ba11138944e077bfd9809f01372009d28d38d375a3dddf582f4df71d69b7d6546ede54794f9b8a303ff94a02d85af1dc4abb7a60b01b0dc3842ad2a0ed5b1c622b8f96004ecff3bc8df7791ef8f6451abacdd78d9beffbbeeffb3ecff33ccff3369b71fbcff33ccff3bccd88f9cff33ccff3bccdc8fde7799ee779de66ccfce7799ee779de66d4fce7799ee779de66d4ff799ee7799e0792dfe891dda8ed28f88007a04b088890c30e7c40b9a0e4c4070cf8aea80f17d89c5d511f549820a28828228a8822a28828228a8822a28828228a88d203f1443c114ff0756c658c0676658cb1851d3b76c78e2f76c78ead630739895d1f104d4413d14434114d4413d14434114d4413d164b5aa2aa209564deea697fc4c31a9a42b173dc84903409de9006e3e534c2ae8c9344dd334cdf33ccff33c2190d6f4964eb754a6699aa6699ee7799ee7a9324f930a7a42d994699aa6699a366553299b32324dd3344d73059282549f0a51fa743a9daaca3d6198d6e18340445397d8b50078d9fc371ff1fd0b0281808c5c171cc3b4f6125814ebfd10b3602b09ab85121d43f58f7defc8258a40831837e286be7f2dc702b6c98b1bc92a5692ec6b3521bbd8c5d86575a1f81e78f3101da3319c65d8414a38f7b594315105e3d16a8bb92a091b97c70df96b80fc5f57a8dbef88b12a36e1856b47a5c8047df106b17ad0c40f683f85f245dafed6d18e0ee8d235451b74e9a88996989842d7c7f5de6b3da3a5ecbd4ae8810225b6d9a59e00b6ab0e9d1446881d2242707036e0e775fa12c1e7755a93e1309b966157b6300d1e34190eb36919cec0952dfc43490d569f5271006b30141f941521dd98050a43051b7f00404014c6686750bbd4ef3d60ec3588b97b03b6add60a0a2693c9945de414b7322aab6474dfaf79259bb295e7c52385253af38abc22d7905dec9c6bc836e4157925a7e4151f9325e268a2344dd3344df39971c82af99457724a5e91cf7c86962805ccc599a8a10ff42e9b3b285005aad2344dd3344dd3344dd37cba8865029df9747c793ef399cf7ce6339ff9bca8c78647e59607c9b3f210798c3c4a3c693e3f387c583029f3b4785a3c303c36b6a7e58678ef81e1f1c1d3e251e251795a3a284cc2240e91069dcf7ca6699aa6699aad4c2693c904aa36251bd186b44101a6600d50c5a19e94c7b3baee31f228f1a83c2d9e5467a29ed4e7fce0f051f99c3e2b9f94cf8a8fca456ca863a393bea8f3828d6527d561b9a0db41852617b1a10e0ac3b40ec3ffc7e4947d4dd4503ef39966ab2bd561c8c956d98ae4f25b8e39349b30ad39c8320cff03551ccaa196c87a675aa00ad33a0cff412011a8ea4cffe84c8c8a5c768c91a00a7b522e82d1abc390c49e14a8f2a44095382289237144964f1247a1c93fa78b6012a67518fe8340d9189afc6309baf4a452ef49ed16b2efa05cc4519893a5d6982cc3f01f04eaa0c4917fd86c5f3b6f0b7f5cf8d6ac979f8fcadebefca0e5e7b47df959f99c1f93c5d8f6a45c380181bf46b0634305e659c0188b1bb1de6f355b395feb19cb603f123ba80eaab343c708df6141b141980eaa7c8f2cb10eea737ecebac23566fbda795b78f4a1cc971f175b7ff97ef7a7868f0d9600dfdf07096b01f4e73440f959d99f94cfb9afdd9f1537c4fb8b6d70cc2a09cdaaf09ed4c44afa0c5353aa624a612a9d862f02894e2c459b4295176df4a2fb3e265d4cdaf71d75513b6455b0a18203965d778c2d2b632be7ebc2b0ecc2b24cd3b60da36d180cc765321a2ea3d168dd759eee3ceffb4070b3e17070846188102236186ce43c070706f3c0c610185649d0a0b1169ee41f1886611f9a442c53805f644983be756771b4ef93fce386a61169df0f4d7585d12785492eeb9a690c965dd124882c8d5dd124a45ba9f493f7757bbf3957a28550a4211cfde41ff64515bad454254d5557e8debee6525748e1ed6b3f580270bc7dadc60df9defe26729112169d106f7f1bb9088b118f012cc421dd904d8acdbc21e0dbd75217114574bcc6e1db0f47cc3f6cf7dd08aab017998deb85ff56b76cdbfcda6dcb32f7c71ce7a9751075d8154575d07e9160fb0b0299081dc3ee86c90e20742986a18f54d2926cdc8191d9ea18b1ef80faf72b499273e8006204ff7d8d4b00266d107b73f7bf306012bf39049b0d626f1aebd3149360cb8d5cec7223ae71fe4d635924dbe24672c6fa9cc90e17fcef2f00fb92189cac1f0346fae3b748158ec791baad8b1c714367d2ba206bc286ee357143d7dd84872ec61887ae655996151a73ce39e790355ed7755dd715ba6eba994addf39e696a325991155594145de88c338185ee6f9a8a4b5a98458e64926457ceea48407eebed26d99563219375b3988bc71ac2985423b668d1e2c2b4d0db4d6bcb0e2fa8022143c60cd6daeb2a268cb19565a0649caeebc23219a90c95a6691b66c6688688e3b84c66c68c940d874d7c81b5324ebc438d193084b0892d7049e1e2019719760bb65bad55915427acb5f7a2334aae2a552fc226ae40f5427542a9545433d8e1059dc864c83206d4c0e4860e2728d016a18c879dc1b8b4cdac66df6698cdb22ccbb26f5774460eaa16c020460d13c458020862a44388e10415316c902006104788b152890185182fa80c0e6c6e575486e893daf7fd74939b4e4a5d54758c2d2be7cbcaf9ba30ecc2b02cd3b40d9369dab66130dc86c1705ce6acaa8aaa60b83425f2e84ce83d6f29bda454859a50269b624b56b4b2d7b1a5c160d85733dba10b035c3b6f0bfbd677872dc21b2c01fcef87a6d014b2ec50250b4da18b1b7261bf309b96751f462499a821f0054cdde236e646b419711bd20605b80a4d9d0b445267762b1d87822ab006580374015f3658e386780fba803f80353628c014acc1a15ea8c2c178680255a02a5b752bba925bb943bb94ce943b95ce4577822aae857bc96777d29d7426dd8add9ddc10ef3b936e04dd49e7a22b7527397f21064c71677a3ecff3ecccceecccceecccceeccccbb17027b7b81597e2545ccad5e0509da9a5d0567c4e6e855be174c0b16c6ee58678cfe980db01b7c2a15c0deec4ade49c73ce9f13ec4a1ccab570292ee56a70276e8513813151431cea229e148843fdc37128877228877228875e0d8526722bd54e8da499a956d24eb41187661c324b9abd642fd90d0dc5ce5e6e88f7d98d0c0ad98b76a289b29734dd642b2d8546d24ada8926ca5eb255b64ad3344dd354c470a77d4dd4d0e7fc9cd90a94add2344dd3d4d39cb355b6ca56d92a5b65ab6c754d01bb7e7511ebc30f2f15b96efb22b55c1066cca1bbbbb65376e9290c463a6a83d62ec2658ec276769576493c6320365cdf5a6b6db5d6566bfdb15fe213ee0dfdaa2b78dc1cb67a512944a02205fa8b010ab4dec1097e3082e9879406344e208186c9d62b3ae0346e90e16a1a39386169a0252094061168acecf2417a7010901d76f095afdcdd1dbfbbfbe5c1c3c3dd8a40b87884473cc840d7a0f5aea84b8b8b0bcce5052e2fb0cb0a0eb4cb0c2740efe1a242754206ab2a8d5c44bbd47f826518967900c358c0011ef80045097a10c2583686852d282c9a853eed0bf40cfada159df172036d037d997ea083a04df40af48c140dcc6801831cd8ab19b1fe3ad93182df3ec946807f7d3b03a75abf44932e2f5434692ca241713feefbd56c9a91872a3dd4b5628de8755b2debba36a919d94033b222fec24f1724b2a02bd7e97a8131a764adb4ec9c5bc8d855ad940b3624ca40677f65648a9dff4291359bb57bb3e6ee59c318e3ac5996655959cb39e79cb37695dc54a572ca3d57a98ac91a59d169e7bf381107396bbf69ae42233b1290fdf523d985daf9affc24fb00f722f1c87aaf1bbf8047f65ebb89b76aad65fc99cc39e7edeab0a11f8047db01f92bb0c21c068f5c04e47080258df92806413b66fcc0918b5ccd7390a3cd2141b0b473876b6387ffe6495e443654398e158773fe009763fc5a3ed50569501a1eb9c8adfea13f864f93e27c302a08749ff3dbc564cec407a37edcd7ec503fee733487f3fe7bce6f1626e346dcd01cffb5b08c7c1ca486c3f98f436adc840d6d326f398ed5d8e102fecd2f00ff465bc0e637d202db6fb69506e55f6ad4c6ea1fe00cb47fb9ad368fff43b9c8c696e1b62bffb8dd6b4e2e827291edafee204b6c6b2d822c5db5cbed5ae50f419658cecf4196617e0eb9dae4f25395b6dc5615586debbb725b6d4f77b97de9be9fe158ed1b5e2254f50f6d2c5fc0a3ed2edc10261d35e284f6bfc87a4372ad781462e1255c146530dc4b0383cd069aa57cc12d39b27bb35b6cb1e1addaebb88a98ebebd7ec2a4c6f6cacd64f1597b070cc5b6309063ec4627b1638e52b5fa1fb3eea27b7a40d5dd9b2175bc7999202dbc98de47e1961c3e20dda5fbc41a35ce486f055ea9041e3bf4a99bce4551a3b36a0ef3bd6d2abb2951871438b3a9410894ca69494a824d22fc790a91100000050006317000028140c0a44519885388e04827c1400095482426a6a38134d4471398c433186c418220418600c200400cccc0c910902919c1103bf40d0a12b72231362628c88420e07be6394428bdcec76158e1eb20c8b3c85649c37600d5403999316df13106f3719e503945c14072a79aa864c8a5ed70b4ae9e74c125f9a1e03e7a75b2b2c833b987ddd6f534aae089ec40930cafa62f5cbbcb0887a5ea8bd4411e2f8c0653f06592e29d40e315d22498fc186e4852830488e5fc9e9ed08d661f638d1f230a7c63413ac45c82ee43790f7a008ab22990ecef63be756104db94c971b1f8cd2bbd36109d1367250e1d2275cdfc7753394743c4430ab6549aa4111f43d2ce0803fafb27709692ec1d3bda9b3e385e062f765068cbd35bbc58dfac10652110cbb9e2caa6ece72ade85720860ad45422e1212216cba2ef0b286326f604af0717fc3e5cdd6f186b91a26cd339d690533b27af8d8ac4e3022ead05976b6ca0217d7b703d7f883873c95821f4204572d8d856b985039a0412151ff815e7678cdea1a438974b092609b6aa6a722446b10aaaf19e4c6a52d5c587d6240f0de50148888e0cea47f982a704460f4bce7304ec6579c9c1ff136d973233c4533239e889a5b31e04700b2469c0d8af1cda264c2ba4c13ccfdbdb3ae85ca6b71e1e314ed5f3def7d26f59e900f5dfd52a6635977ee3268db84ab26b66296662543333c29e140096615443cc71e20aba947483a7fda419a39f4f76b91d9239ead9a3a16de772e5ca88f89e3ad483e8b500330f94d8d27e5193730d64308d9fb5053e761b466b21207a8ed4d6a16a88fc4ba2fb94ca904695eefedb982ded61e2db8be0353e0014145f70fd7d0e319d3344515fb75e5698f1e1d60d6e6882ebad5227a271f7b4fb0dc79db5f86b74e4f14635536864c9c3a46b73a30e8a574d4e16ce65ebc5f6c741a953ef82cb9dc07fa7d677ca3b12ccee7ac11d70fb0911ddeb05aa462e1debf637913267e2d49b476dc35eda3747e6d9595aef602b843f72449cdc2ae0a56e0cd85efa9a8cac959c5ee75eee0f7da03dbb8459fd1b8569d59b8de01ed6f68834aea2285d10acf0d300c36feb716f7cdaeafcb3dbd07fe6fb116077b702d519f72d9a7dc407bf232e4f5a39096597441800eeafcde8453fea85ec6ea36372408a809eb4d64dd2d8d48434cd79c5e6bc41c153c17320d5d2dc3480e47c83747607b598d17e1ccb5869c3a254520d12b0d60068341b4400fc3703fc49f5ab49581ff248fa492d2f7e297976a908acd85b9f292da67776c32160c78aed53581cfa8e36e6d969d346c08aedcf2f655f4c2e695831be9401001b924c5a436435b45915f556d7ec1f0f9f12ddfc0a937ca037667bbc96f02112279eceb37aa2df71218d8c7e6e4ea34281ef24b2e0b41b060e7a3602918d3ae53461d1b335aa558dd2e26c7f56b126ba867d2300459836aa7e60317e1aa04a2d3e67e596c322305ebd163066b6c59d277eb63a7023d8602de81eccf91577d0c1c8e7fa55561e2b1239daf424adef0743da9c1d0e117658a923da62085c2c052823af76e5b0eb2068f96ddf8264235d3018293068663a40361256c976c7a2cba100ddf2dc60cf4b04f3c8849ff52c24d23d6f5adc79bd26d51de2897ea30453194fd6149c22d1436cc8509c4a22b54d26d818560b1321906a77db7e583b93b8c8e7a35ad10217239b04d37c912f47b5a2002e402619d248214abe1a7556e89b803cb2e44936392dd7c9a84d3ebf84c8264f8614c9a03ee533161569e19778469518eff424bbec91fe04396cd0421b5325caaba019e46e26845281a2fef431b6890026d837d19bb756c082a83d16475ade722a9d92c6ed49a32f6a89b18eb5c6cfe98124eaf17db09d72882f73d5f0908c3a2e7b289faeb38e6a67274c6b8d7f21bac674d428fb75d020f4f1a23c1970ee2253a552de6c3bb1e1887d0b3c7b8f6030cb1abdf3c60e5f4a0154294228318eae9c1e209fe9c84887e871938481f2d91149c16813a8c2d4aaaf9c4b6f22363fb3f0d619b38f6c13e32450a3221413eb4440500eb4e59bd3c462003ebe991d7252146975572aa17b5b1d93fc8e4ea63309808691a901bc8cb2087ee7bccfac9aebbcc653ad15d1b8d82b06b392994b138d8c3f681c053f4b7ed4aceae9bf80408c0f97fcbba7ef31b5e008a88fc3b7b1d7cabceb1449c8923010c63cede7fa8bbb20946629303aaf01cea64b4f363f195330cb5f57cf1e039df23d6731008c9007828e4ed8cc2aeb811c95f01656d9c8a66e23a14787c7a0f440a529afa1369756eb33b5114c36d4208ebc867260def48394efccdb1709034de4c41f1f9c016b6d108e85561712c5aa8348e3dccde12936747da8b47ce3b91a1a86b941cda95db949453382cfc4ec8217703ced06d7d26445d2f9fd6b6d2480a767502256c1c7fe7a410d6be8bfe0737bec7997886608fc0e134b8113a7b63a540d52285d4821d4ffc253ee711a3f2528b97010c93e9010ff4c1a580dc22152b332f28959bfd2392c1c503f972eeae079303a742036bdb8962df60541aa394398432f4ad10932c400f3ffc7a54e89b47740c2a18034d396175bc75a53d045558c279375e6bcbb88a9bf4d95cbeba85f1690112f11dfe7cf25fe71e157b97a40f58b4e26f854f3625728cab52b2225dc25e209b3bc8f82b88ed4a52d8d44b6e6fa40b2d5c55d66c91ffc3132063196c44644f3b74b778e08163d1cf2cecca4a43eacef9176eb478694f8aba419bf924ec3583b5c8d03cf670043ff8d4ef674c0e0ac2d702d6b38acf18e5a81b752cd954e0c907aaa8c9b2f729d9a763c74b9240c460ca401b8fb3cbb388cf6771c5014cd0068fb4fe776822a0b19fd3fbb8fc2b45f39ca8718841ad2190cc4614d050d394d4fd4212583cd8363edc09f6dc6323e69e09064b312e3e434e4e6835f6896e379e91c6f6daa17c5e0eb63f4f6d015e8783080a111a78b2313e5660aad138419df54f6e77709a3622caa987cda8e30ae807ab3ff5489d2660e4f6f02099f55d6e140793f0c1f146215356fdd92c6dc79ed11708a8c76cd6aa468c7d4ea2603af0542ef9f5d762132b86975f11cf6f8254bed96812282105eeaeb6e852e98a0b81b4d1cb1a57672f9933849758b12b4c8422be3c0de9f0efebc47a5cc4d2236e335be99a80422efced1cd66e12c4eba521d9a91b5ed94ffe014f4fa0241b1d5b657e65e95c42e0b9a853a5f54de691fe363d85aa96eeea85ded1543cbc0a392daa0fff4782619ca7a1eec7807b9e1c63378752defd9085825a45ebb9dec3a332527ed3818037dd3e18197d5ad9efe304a47ffb017310ad0ee6f0ca15feab5adc60ba39aa6e08a08d0a6497833219b9bd6dc1c180c9bbb6af630d6b94e343eba719379dab1220ce88964211fa232210bc7e64a928af9f9662a92d918760f60e61ea28bf71025e384a62029942356d56c6c4035b83ba353ba53b007e17a9f5a19f2a30ed55bdab0aea864e0acad6c46621a7712870edd0043c6c7e4b2fddf70e6d81de9d4d548705e2ff1196e453b80fd79cdffc81c3eabe324454efd3974a71e159c520b53840010b06a9276400cc7acbeea516731ce4ec7c8440681a2f5df222932f9c61811596455075f480a090bb413c521936ca242c871edc0a593f34292e753019b1e7c09c6a2685956909484c5575311fa06db4fae0e9ebd4c14f7c0228e13262ff9b90805e651010d819ad7f8311a6e40c7b0942f36bbec0affa3fb9669a2af6ecd49363ead09f1a1b3826020337578c962c80e934aab906bdd74d12aacd89646677a4838605bd51e6f9b52a0752c56b854610be6283a00106940abdd9de3089de7047949469bfb7ab94d5782f659e17eb995706839827450b20a2f055bdf4570e7ac3b32f15555b183b3f2cd96acc054450d62563b6488f74245bcddb36bf31d3495c7896cd4526785079d15468d91487588aed8908db13ad924a73ff216f164615678a5357ebc12bc34be93e7ca88e2b9c77f2937d27c0dbbe39deeacab8196fa95d21db94310346c57505d394da9d607b06d2222edfb04b4cde1ef621313b2dd1b33b0f8d9ef9cd5e50965fa3d712cde2841cb78c4eb811a05b8d57e1dcf42bad02b604c645057f8d63f139b8a64f46c81a554df87d1130af26da85b9b4284d183c321b60ba382ca92b7659f4fbd32eeb7911cf387d213b82950c994bddc9b42d101c346f6c039afb6bc476158d7c1d0703566d2825ecccec71812a15c33fe47a2034e229259382e75d9f69d1c453d5fe6f8f5a154871730c49cc719a770f2f0cef222fbe507a9e9e6ce9ed973d37b0081e403beca82a756953a35a5eaed56d437634c56d4ddefe350f2eaeacefb575435bf2b56096052f7097637926e6058616fe028e70d89c11b2a4eff4062807f7af2801cbc85fc74946395c778a429714820d7f303fa272f3eb41e29ca819a730e1e38778388c27473df01f4b886b25393527aeb1eb772f03360dad3e379c5fb84767b7ec3f7db895b0e72cfdae78d7126bae225185cb037131bf39cefb3ef9d89e1100c980ae6c35f2f151c3fe0472a2bd05924c44a6860bec559dadbefe55fd82ef65538b4906fe46c83be1d1cf8aa062c7dbb65fdb3afc2358f447b055672b991a7f3c2350a1de0fb07103fe31560c9ef569ea6fa040681245a2af0a5b7db65ba2e3dbca79e9d8d5f1b243352012e7def82b01bd59f3737a328fdfcf352a5ad323d70658eae001c134f6b7f536d3961567c7506390b1b20a7938754ae6579c5d522bd672de0d41188ebcfdf7bac1bb59f649d932549a5e2f54662a4576b55fdd7416c8eb5c643481fda9b757256096bffbccccce5b6b208c2f055676a3cb1f2ed3f52eff948233031c108fc448056885bf1b4386e8d8d465b686ba16288b7d580a57d5eae6886969024b27423460c4f9fd2ef94c6f17584bddc628bd689d685679b04f4a6f0a4a4c6a08afa1bea8a3ead8f5834d229103cfd4d32a06c3b9daef7d99517077509ec2d975217438987c4694247e1a9336e5b16cab2a21dd4c1cd289b967e1dab063e4c163dde0d15ae82e58039088e9e0115a2b4c3421e7ab734550dc51eab54acb73cfcb779ea04c289050d9816dd4a07d70cae326c94d1a94ce41fdc471f421df013c2f1cf512a27c6cd82593e0d9703e7680a5ec37db067267030d1dde8b77bf188864203bf6ce3e1018c8f2082bf8b5db5df3f43eb7df38f60cf782697b520389543b6794d189a1945c1e971004d8e2eab3d48cd419d1024703cb902bc442396830c28d69e04dde4c1a6e8ecf925e385e68969d5bc50977473f0e9304bd5d1a031e9d56c2963226742f12a873ef39a3073642c21a990d5f364c3d958b25dfb0c275d3b23573fa8a720a9206038f87c23febc7f5e34cc9053fb4c5a769b2ff8191e94095e8d4e3192771b055e6f3d006dd375f54b37ab01e69d714ad4481b83238779ee6292295c1c78984d5f7fe4fc8e7d8b91d662bf0b170d5a1f43d92790830deee6be57cc76bf8b6dbc838619ab6380059c4fbabf7ad5cfc0566c9cdaeae071f4a53eeaf12953955590d03cb27209efdf42fda66929098a0a1472120d04cd339e65e7cb8f3b22be9377e6e5aa747f9f7c08d8e599fbffcb4e0ba58400612405455c3869e3bfb8ce8d1a2543ba34cd2736c4dba1da59e3f360630eaabcd694b7e6e80a357b7dcff18ca909bd040062bd1b4c692685b56ba552ba330b509deeffc273c75b8a7f1176e428ce9e5e8b7f112054a559b43acdd647688ea6f07c6af99d734f4e7dc9bd99b75348fbf689491d7315b2fd7c50aabf1a9157b2b562499b87b927e4ec85a3d46744415dc5d9537d9790071b2f6ec41e8c021832bc4342e62c9fa4f2d99a08097d0a2b8bac83c7ce7b3fa2d76cdd452284646a932b687e4ced264a8fe34a05da65063d99be1902cb7a0d36792263fbafb0d06c88a00829b5520fa8f35ee5e2ba135122f23b9402cbfb443c82d892224117e61aee5dd07745a19e8436c80cebe6e99f88678f36c1655e8b4e84e862c0956a3817e04205c2594dac5c210409d287f043b7409f709192480e589c08eb2d48da62971545d4e372d501cda3fb60bd2261d61d41388bd3f9abae2a81b5b9d4b29059c5f32699a8a923e924ad0e4cb2cff35004deee0a8db20418396112862e9127603e0d1f5d71b564155911e8d395df40374a49e5b73351a328bb6447fc4a8c20de92a822ec786c43238812981d595948e75000d87173844318ea7b3baa6130a64f1a5629ec07a66b581db0c10266fcb1638dcb3ea5fc10d9841fa7004b861d656d30b2a1ad8b1cfa8781e7765c41dbc99ecfb37ba51405584f700d465a88c8a46b4cff0cdb2ba9bce346c919ed94bbda6871557fac406847efb28bd6ea44548491bf26c27c9e7c8e7dc30b73b1c259fbc564507a22f9c800021fe091314846921394d45b852f4b5437058dc51de6cd1b84475f1dadc289bc66c023d1c51a6c38a8eb6491d2fa90af82fc82de31cb7b7f962f66acd25092c61bf1481689219e19c3e8abe18d58e978ca5e1288f692a1aedaff6005d3fa6816a200df50a7d313cd34a808a717ba15fa2aa7a0dcc63462502f83502b4ca12b3543588e435154884248683e0642ca820f72d4a7be9709adf9b4c5a7e92daeb571329c10d71a8000eed555f6a8d3333e3fd8617321d9b982eccd67f0630a9f1df0f0ae150bebb99a2acfc91cfd63dd0919eac9fe8e6326481aa3e74715d4d1aec08011ed0973a3ecb44fa8e8d1e668ffa22ac000628df61fa582f30f6b683f79e4cf96ca796e53ab7ea4467b6f961a25197c2830926dacd35eca05dbd27412e90721f1018526edbf361ebab1dd481af0cbf073daaf536e92e6e661aa25fa845843320d063de8dcc47d015be36449018b45b7321ef862785eb6923ddd471b2deeeacf4802b4e7935b05fe5388abc437fc6ecd43a7af890daf0cb6c6b2a8232b91430ec6f3aad930015b740a680ccdb6bd2f100352e4af861770fae59ea71cd9c8a75f2d96deec8db657f20320d7676728dbfb2e0e74d946d74460a8f107e0e8fbc26cc522fa22c11eef52b7e788b6df908f041bf8237d45ac9b1d8236b5c29dd51586bf20e1349b90f2da2eb1d2b021741e0d4139dd7d5ef8c7b46a78946c95d0f5221cd984ea082c5cfb65688891d0b0741bfab0eae8911896d267e07dd500bc7f83f0490eb4945c3f84e31b2c7b8707be4ea1d1654801324005cd7cc8876cc933e1942f52963fa9317f248e0fbc19d7488aad0c2a74cfad705f6101fda185f02a175a68a1f1b98631d2f6aa925328412dccf7d75d04da303e5dd0fadd0b382dc2062994d887616a36480a9e7b0f03dbd5282404d281df5018ffe25542afae2d0f032a7747cca7621ae2a198f4a054d49fcff3610e6740c6f725722e99d525b0d5b0f5abd041888a28a2f60d7c1031ddc30847e12c27ce308e848420db33923f4f1fc69f8c35729251ac141fd58711ce39116b34e06150d16cab1a027c98d4106a5817084054bec8344a3fcc8f92ed00be7d122a0974e4f630792e26a42f2302fa8c1425ebbb874170c3a20df8c624f001a3ba3fcc84c926af6cb21a2f237dc18871e9c03bc9d14e74da39beab1258a071cbd0af28ff24656d34b86bdf0c0278989f59d86176a12370fe1ed08ec80c528f9e9a19050267281334f811312f35ab666815917f9869feaf23a6445012522161dd58b33d97f7ab04c353a0099541dcbcf423c6128fc9e69cd7a211c37531e04a359c0b70a182b437d98f6c576930b4d2c6904af0766ce2f26431622cacbfeb6ea0df399da785f44ce42dd0687f86567c520345f79c99e34ff43ed1211085176730cfc94d2807cc31581c181973023705a16c19b72be1c3e646ad1dcfa16710c901318e2e6765175c6497f3210165c7851d2e296601050d97ee5ba562503f03ec852671321ac1a13483c769a813095a0642c89174c539ebf4a5af494179fd26c8f2389e3356a0d2c0ed3784db1f23eebddab8782772e329cab510022a4fe9974415af520af6cf57bfcfd50469da442874ec3497dc31ee15cf50b7fa475024817ac9e4a325dc3679786ae69799f7fb85e893a12cf6b08cce0248c1136fc980bffb8784c09c3c8dc2809174afa95b6acceb76a791ed62c92e6898099ad9c96de68da9a6a9d7c980cb771fd023c91131f8ef170d40cf25c7760e04179f47ef9103e792a15fa29359fd881f5c12416bd0a9d9999a53f6854f4eda9c2e4e3f94003855d736c3ddc72f4bd6f422bf743f45bab3a484c0925932d11b03ddd8dc511af865f8e992ad61ed04cb4d533b66da07185f1419c8423cf8c42de12cab44e263c98a26cb8f9dca837ed62bada1b641ff411b0dee22bf440f4be6f35f76d356e58af0fe3615042d2ade51480a1ac8a7aa816c6a137a8e3f27d2c036022122e888994d2a341922883929a2ea61bad9fb8b9bb32cdc9344770118ba59929a2c7f0e9d04ce2ed564d6e9dd72c63a35d6c8a14fa51975f71e69191a99e6468eec1b89e81c9bc95a18273659ae8518cd0d650695603c6f898abb3059423013f51736616ffa61daae2a8c3f41c6283ba46a531cf70499ed1628955270ec8f09e30d5cec1cf138576cb116b02191ad984e47dbc49e03eeb5c4252f303c7ab5105b2595247cf18e4e0589ea9b2cdd970bbf1f0b644135ce705964b08d4db861b862d683a889a70dfd88a6a60bc65b9798a45d74c277d98c78a15e246919089523b82bb6b55a0fe2632b3266f8105c9cea36c309cdd1b6f4e21a51782f8361cdb3c3ce5710037f482c5ea1580ba9079ffd837c9a0e16ea62fea85b8ea92f813482a4b2b1f1696372332d781c165e7d03649292ed4ffc1df43926b3088a0daadd096285b70badb535f7947afc6bee56c35de0c4f53d39f1f885c00b651e0ebd1e7f126db97df34891df7299e1c9659aed345a128239fa8e245cf85f5f2600ba66ffbfcc79c656698cfd6dd3c309c3520cc4d7593ee61330f99d740b32c52415fd1062db3138b69739c72433d06eb10d60bef27b345ec9540971996ae03428eee1ccd499f3cbcced66460c1be7cb14d356885a6a45142a2cab10e2a799e2bbe0042ed36808986c13a5d03b6a21cb2f53d4c56ce9a38bcc5e27b1bcfaf832d16c18bd615caa84becca8d1977970a2c90b4ea1d2cc430f3095281ac8903c1e0a5fa06bdda0245c66d1309b080355128f9484a1e62c950aeeda7fc10d2ef307168e3ae0a9a0ffd3face18f13c775adb7c662249503d2aa3bc43ce1f22feefa8572e6766739014520ad00b5a8dfa61ec7379044d46434063bc7969cd4c4b3ca6cd29af513393eb63a02f6db8ac024309da9c59bf82f82463411f690b2a613eaf45ba2bd9c84c04dc643535e207b8e3d746976906c489b33f5bd374c8a6facf645e32d10c2867a16a14cb9d3031c50642b555863921c1542b54a5291ce3c29c6d16844aa371f6070957360786acf53ab198e807a866860a062abeff81b4ec67f272cca5e78a57486453c80f82f2ffa52b5133656f01421e6106234faf6ba97f320179ffe1b41caf03b61945361964fbc2493c4109de20a4fc0a5b0d3e5bedff020bdae03572e8006f809e12c58242f3d4d6a8af624ce4aeb80d201b58151050869560bbd08e1ba1c64d3a08b6029028892221eca48800ec898a502b7084fa4912ce9325a86df80c756956949814906d158c99c61aa890e016037089c1cb4be93b19763183ac8319b8010b42e02af4cde3cb70e875c2441dcb37b3e00a911834fa26cfa31a4cfe111af9ac9cfc3065fa9fd4f259a79f092ad08ab7d6fd231b1e8ee8dc0dc221814afc2d2180cb0e10fcd31269ad9dc4124ef69fbd2457d14fdb665606fee21cf5c9508fbbd270682285a7c9a337bf0249a7e15ad0c1f2b22091ec942457700acf2245cf60d3f37325b60c3b58c30a93ef0e0d52013d3a881ce9082a49f215170a5307af3206924303e4e8e2e22b8bb28587cefe4eb911ebfbbddaace48a5ef89705425e548044e98368e7fc1a5fa008a2dc66330739748a9effe2e571ccc091c35ba1fbb44ca322dd150b051edde59a0ee1908d3c6a8b6869598dbb0769e999e00fa385acbb641611a74f23e198b02550453c33d144b34a7588b09e87937c23767635e0889c977a3ecc36e2720c6612683de818a1bc4839135c6ed2edcd21b5b765d5e9e2493db9747d14fd4a3d02025e9f365ef8455f7753c98b21d604e8a1f207056b08b73681aaafb18245d69b893d8ca2656f738a94651b696da5f6fe3b3220b01da67ea07a7a5794dc2605502827d3feed0a48df33091081fc82713fcd08347996970e9c5a3c9ba30d5b70f1aec8a9136caa5413eced88b1151b003290a244d45465e7cd8239fba06e84292af205a86ab5f4fc717d2ef26e71554ade0839204b850f4a0c06e347ca5585a92d838f1e202f9486caa607eb7804c242a440287845e5203d2aa86ea366bbd6c8eef1ccd24d2f0d9c78c0139bdbcec3c0f33146fa45bb003eb06fb930917a9ae8ad36f78d6700b6d283413f7e704a555e117ce1a61a69853dcf3065bdd6555a9792da241566ccaa65c11e06c4ba6209fc1afc01c03bbf946b9c2ff7c1877d7dac46286b90b87f0c665f54c88e39abc40b845429ea2162e30801d6687c7175f16fe759928f818461e1922e6f2625b3836e2ace29c0be533e4902f1ef06405b0df0db6a0d2e9ccd7472673c0d8a2b9cf8f7c7fef8dcaa3fb9f2ab7503f495c8d50c2615106028e74f2ff805a7bb441d3c6af626d9bfa82785eae4c3e99aaf0bdc7eabe1b4969dc4fce6a6ccb43a24ba920d51535e5345242be6b5c37f485f025425056d36c9cce42cd939dcf82528e4f7d513b71685a8f6bddfaa4493df1fda26e13e2af123586272e7db66a4dc1887121937b6e93e1b2ff951ee0da5a0b3dae17eb88a1a4c82ae5297c4330a537d3d7308244f84dae6e5c56087d4bbd2b1696feab1c5d055e42272ac9217690168f453768981fe3e1072165d8c83ba22d9681ad139efc72e4b7142c279941fe21362c062ee55f3efca2c9028b46b884d81d8161541b625204b37109b6bcd09cf9e2cd2fac356f370ed8cbff061a30c49931f7fb4eeed9c98c41a982f278f5f449d1d7644bb59d1ab16fccc64f8e86635c7dae1dd72d8155603da553c891316c1135c7882583b97779dd581765447e684453422f32ecd1dded579ad5818884b08ca9a3a2c1b72b71e1ce64822726d480c44174ef060178f10bd7b96e91887311df182f624e6113bba5ee5336cf8934fe16e3c79b3de7a448482f394054138751d7cb6ee00f1a215b519435690f0a703d1b6826a0116789f8026fab499bf3a8e78adc489deb7e4be78ff2ea48024e2f639013f08a78814ee702189229ee2577b993667ae6611b7cdf96982ad5e261eaf1b253c88ac9d4ce037e931268278dd2891c7bf044dbd78b4ae4c77425c5367a3248971428048dd16dd9d95bfd6daaa4ed8be216a171dfa6bbe044834046eaaf6a86516c5ae044aae00c35031563ff088f72a5b1d0adb39791c89b43b475154af4801ff80a05a017483f0cd28c56fbaab76812db6a9a1645cab29dc01bad2534772d767a415c8182ecca488b85d14c8c2acd802893159b870a1ad84e452dcfa3aab45bbb2501f1cc0a6412d3cb23f6aac2f1820e35896bd19ec8ce48d72ddaf88e74700d5c772b4660e61c42fdf00a38d4229bf9ad109f1f0dd9171c373927a670d8082f99abfbb72ad18ced25af02d12fda57b2f1f57fb37682bcaccfb92dfb48896ae331cd7a8981ed97fcfa29b5434589d400a69c09a18f4ed1537a8d71290f3be1b1fd5472e94610b65b4823cf2c30c808955a2f0ada249af4b2543ea6116ffd30b340e4889c2250a1718a46a5980f88ca9531d18be332083b685447c33aad61bbf67a89c27e5b970f073edf53ff639afc0d250940fff21199a99e1e94f5271f860a5f5f22e610d301bdcc862eab433fcc77603fa5b95e3a9b94c745659c685e609893de5b64a6ba81e98086130e214d93a81839f889fd364ab570458f32d335f4429e2028210f3985ebe23f5fee94597be6ede50426fa319410cb05a193cce49af35cfaf19e601471f80908345e4ce756765b808df961388fe42a4c02dbab5f9f201c9fe83a7112a43d4fbc308e8d7fffba56be02cce3714f7744ca72f38e8638f560d23143b4a7f1927a6103243f2408d1249872c06ebdb5e01d59e15d47089fe582fb16605aa4f4c8a23e63db7c5ea6a2f893a6eb44a566414ea6ea60c228d7666a09bbe68c607056c6ca27e02a522364f9b3afd62cde94e4eab12c9d9f119632e97f0aeefd16f2e636147bfcbec0985f1cb7171028279639d0e9661992023d2720edf5e15a82f93a7321232085d215041a87fe680e0113f178445c4f665be4f2b5c186bed1fbc9a390b4312c43add649359fe3b7cb866b34fb0bec239199905de27435c017606315eb67ba53c6a97d1b86797fa19edde0b7d89846ff5e2000f0c523b71f1e71645c2f6fee8c86b1d91b31b6c42fda69dafcd78f29f400e32b8a44db9a8893902f01687cc78f0c77e9a1932f3ab874be6bcfb922c81ca081668cd30366ac46fff003116b1e81b3a785ebb52f206d0d033cc90c1c395eb0e11f207d0d033c8b0a1c319539f7b04dc18bb91483cdd782b8e3d026f8cdd48148f6eb8957913a837590c5dc346034cae04d2d53f60d0b0d18045a0697c9d838679b0a28f45e1753cdfa1480b8428e863f50d11871cfde3abfc353d9affa89b8a54a452c97769f45ec469bac875df1d7517398d4974b3e48e94927929335a74ff9b3a12ddd86c92f7464b808cde38287892b8a2d777c8241ac41306e169ab06889ce55a04f88fec4468b12098ee466ef967fe432a00bf68779c0f1275f64cb1c246460a132c2561db3c483967a92568e814f0f30151c6eecaac389c479f6802a9645432c4c9560568f423d58894e240760b34dcfc3ec967b4857a00c03bef2642968b0804cafc8dba5786ca0c5a1fb8514dbc03818afb6164d5a1958fd4c7f80096680ccd1c71fcea788b61dfe960c11bce1f95633362afc9a4bcc3185b8a4bcf7c7824c510d8e6c3f78590783befb77eba5418a6d5ca0146f4d4a6360205c4c133ecde2dbcdb96ad1d047353b50ea0185389d05ac130bd1bb9f19ff98f5002fca2dd711f4cd4dab31051615e8b0e68a2609ef09158b442456851ccb16c4203faaba3d6f428a66a37766ce85c4c752ff4eace96599829109ffb900dd44dff1f56ab69f0cd69d51bb0958197df855d29d5ef10020f49d8baf6f029a8b94f35e79654098198d59ad359ae390b107e5645d0e63dab89781485970cca44e2aa73480fcbab9ef2908896a06f92ab06c30db8bad02fc984d5ce87c2d44842fcebc1dc56987122c4b996a8a1c3c00225377cfc2291d9dbabc69ce9c35276fc6ff0bcc80329ac74ea71dcbb7955ec183c249c4f508f15166a49bdb668d912b7964b62ea5caa8ad8327b40cadf1c7d9da25ab7085b46f3dbc7bb6b89f1c36be908e4b5acac2e7d16e7db11cf14dcd1cce2638f0e85ca2e0eeb39e6513db740dfc571d921c1246f58053b261e92d46d8066154fae49971c9c57841468e2e81b387800744b81667c355a98172c47f0f4cd0fd896b5119055b8c7a4a98485f3355c0bc3338b2208f20f08e7a51fa8a73eb04f7aa09ef0a09b37b50c4853194b266fac1872665be191d4a900a45ff351aab7fa281194fb2809f385b79c20eb693340a1408db5c15386cc98668bf7ed0d17bb4025789d3ba5f9329bd28150d30a66034bc9eb0c9ea91dd8c65abf4719eb1d3e64d06060d2468874643a5df63d9d5cc7f142ba3f5c03bff071f8163eb95affa49c277c826ade8bcf2c59315d169e444cd6f4bcf9c4e98134982475e37192d43ba0dda456d3665bcc2ceff63cfd54df60dd9e6e3064f6e4131a409278abce7aeadf3c622ca092f25acddd0f430645b189547306cb505fd062b6a2130393cdae8ca7bd6c8b30ef27bc5671d08e4c9a1281a2708de63f63bc7ff0eddbd235cfefd1a4ce98dd95bb702275c37ee1f66b47c91e1dc1a209e26399bedb2b49b1264ba8092757d792b177b44ab5276d895c41cc65348f76b69208efb1260f090efc23e603c6b1357bedbaf39717a71e7fdbda71da0901d4cb8dca27e45c7290f5484700d3c268f88043dd7aa681208446aaf0011b473859e5e4c8021e5f30328a1cd98ac66e2c24c4223a55b5388283069ccd39a1160bf48b3a9e7adc186ee5c9de33f92fa00b28f1b81852f45a4a8dc752e943e828bdcc14084a6bf832758352324e4c1b1d93386a66b9c0a8bf9f6d8cf15256185f7f37f0c0b5467432af99dc95e84b75c39d75b12e8a2f61e6b0ce623d0017dce3ae1e858bb24c4594df4eac802101bb28b2cd89c764c12c7849d0bc72a010ce7604debb764cb760d217dea3030947e6857ec16e05b0de9b464f502e65ead0a3a3b693759290aaab1f0f604ec3e51bd90e1a0431eb4560894e786e9af30acf406e786301c6c682448d56160908dad75bd673a898c70daeb062baf92386b01d249d9c65b083613cd46b314e0a7a206a1d30182a10515388a992bf84f9de058095dca759cb14e4e31f471b4e299265fb86b39018de0ffd59b1ad71a371c5ba266cd7172e31966f667e0fc415fcde5f721cf594a244bda3d768bb16cad77c01a16d94a1acdd1ff327b13ab69857c30015f8f9b1e4907b5e5b5ef56047c7938e73b43eaf12a4b70d2387f03bae9d2d7b54f8a4bb4ff08185dc500ae35bd334cf06a8ba33449683101c02c8569be59de4d5011882630b9240f8dc0b7e8384d047a48a2afd0d6927e574c570b65add898e2ba8833df977f52e961682f61487cc3f99587f4d3e1dee086378a3df07b2d48f47240ab1841265f328efbea5dc5ba01c07e1ff7fdc4856f7f454dad92b064e390dc41628e4431aca29d7b6957e9fb953b557067276c424909b92be8a4147bdc65525fa0e01f1fb135e5d5a2b6f8fb5c5bd0aa876c7e7e44dea99a8a6dc282154c8ddc6139d59f692932e78f36a532b4f5b719d1ffebceceaf643160d3e00af095aca2c55329a5762eaa965512e9257222b1b71716fef6b37ce9adda889bac9e8740fbcb7ec975a12db7ea1fb6cf0dc8cc27c5a11a484efc90da3941d6e11071ddefd7a3d89f66d01af0d6f2448c4f9d22ac24b38898e0277a8b6ca177f8e8953ea380a4a1c45e13c50cb87b406afd7f04d93a917a6392c65ef701cbabe4c27d151c259b4c43219f751ea2c5a8a1c6c6ce1908db2401404fe391bc7d10f9dce4cf729521edc01deb1e40f054e08e89d8143d72e59029c158ff32892044f0676471161bc993c91d230fc137c43e69aa986249006000249a933919cf8278811cb7c02079960c5728f390019f443b0151307c988a6c1ccd75feeba64e646da8583231372d4f4860a7295318684c2fc2b41fc2cfcb18a92d20f12974d8a4217e4004161fc41575c3efa51b62fefa6cf0598ee9dad1886f63b02fec52af0124c1a62630b0c6d59f037a74957dd1ef5a13041245ec27cd263193c04d00fe80650b1e2f003fc10ad5495734f4c506c09f2a4d9898b54600ffb81265078b1effd0ecd3c9bf2ddeed009e41c0e8e8bce389f63ab747402bab861565b7016514d1b389217d7805ff0c1770b6062ac8b96f00820ccc07ec8626830a19401239c97fd48cb87fbfbeb81f24694d3f12df698d0b898d00cd3972da234f29630049cf23b2858e497a532c6052c7d33b39b88904d2485b6e4ca1da20515054605f649a27cf8171140e8eb65966599d691f2ad0750daf39ebc59c815142dff661dfb9d0d7fb65d2dd36b676fb76d5fcab79b8920609dfd7d12b758b8a0c1e6ed425fff2c1c70f47bba6d0ebcaf38ca15f902d26cc8aafe50840f628cee1ffd4a45dc545555515a844d113bb2109c7a3875301d8a23780a82a66918cbd3114aa79b13121f1e1e4271f4f1f1f1010272b2911efa958c8801c32d4288a6841296144c84e85732c20aa24e0700187a0840a8068fc1501cc12dc7126e0eac2807f85ee79d88fff03b61d2dbc40e99c03a0f015047fc4ab10545fc8002187c3082500cb0670845dca0e0e305451c51c40e1650083e3db4786250824e0e58701076d08ea04376ba51c13d2191028c8713d81798e08a9102ab0824a84a300135420a3a544658a1053347d783ccd1030bfc55f972d4c0258711489063092ba51c35f4d4af94030a2139885470947e9eeb14f0965dc8961d4ad31978dc1b94037ecbeea601bf1d47c56f3fb9691499303280378aaf7ffb0bc96f8761c06f9759c06fa751c00cbf234e3c459477297efbca489431402c11e063cb00de33e97700fd46fa6dfceebb037203b28abc3101de005e3cc5019c14bfeabc2b4966405e4056404e80c95360c049f16bc508c81b87427f80dce22920cc2c459802e4ce5344978ac653441b142846a3ff5008e318b28d4d75f214be426150a0188dfe43218c4fb5621c0afdd75cd7dbce0655c8168fff489638127afcf1250f201f5feaf0660041791ee663f378cf56691cfa4fa886260ed9a0309d134815a8f071edb1e1507e71f4d99e8e3a0452052a40fd01facef6c93040196f387bb6a755c8154fd172dd9f7745f6d57d77c5855adba0c69a7c912f2ff245bec817f96232994c269369b6cc96d9325b66cb6c992da5d2cd2cddccd22cddccd22cb9788a8ac649f13b97cea573e95c3a975a310e85bea2a94e4e8af4549d56aad329743a55ea35d46ba8d750afb126b880df676f5faabb6c69d2114a13bd89302d3ac6d95245983d4b3afa2ccd134da7a3ec24cdae68749c158deb6cdbd549c7eb4d700153986cdb1446c7bf1bd4efdd9c37b49bff650077b972a39f005050b880d60544714a72422a954aa552a9542a954aa552a9542a954aa552a9542a954aa552a9542a95faf0803afb93dea303d4a0a819e1d75ebe9bd51f8f8fdf7933787c947152046900e4e3873c1f3fdfb37d3c68ab34c8c767dff9dbf978fbd1f9c8b34383ca5019a93fb61a7e733d26f76cef9d00e9e4174720b1e3e104670268831a647bfae3c693617cf2cda0ede94b634f31a3957203d05f8f8fef343edef3f1dd090f011bc09a096f06fc8ed3f9e8369bc777b64a7b3c1effc75f8f0f8fbf1e1f1e263adbf47c801ce7a5f620c0fe0b0af97defc49601179d27eafbde09fc9161773adae3734119c6a7a2d9fd9bdf3bd1d9de8579d56ee329e275e975d1d6ef91e3f88d1ab7b15e83c2bbe24c2c7588c5ee0aad93d55ab1ec66ffbabd0c633ebdd35d40149f201d32f00b7613e20c80820296f5984d1c39c05f9004caaf9e80a19e31daabda7cc915ed5badc14a71648f84c04a3afec84738058624f0bd68124f216b9c14670dce8a125bc017709436818fc997359e027b71527c982a4313aad1f1436a705c85cc180aefd1ae353a6ecca4e347eca65a55e8747ce9f34becc0da8db6909a2ad4d75b9baf7f5088b2827a05d3d6bbd12491246eecea60d113d330639d14f0d6503abe86a2262745acd3119312d41d61a1c718e10aacd54c18f1301347e0ed37464c59d58882268ec01bd78ac92e64e208bc2b366285891c6fc20818403d9c4ea7d3f3017c27dc1f0b3a58c815ed1e442e8289214c98620eb4070cfafdfb300103a1030e21e0f801870f100710f10720601ee028601c2d3fc0f142ef47c1851ba51b3537704a374c3f278e0e85a32509fba20e6cb003981b2fd03764a0f7a38853c84208bce2d0e169018916986fa8a8946ea8a07483458a40eaa96dc4e8ab349c93f44ec424dce8f8f684131072292cf0bab895eb026d2214ae573eb1b495374aad9c4a0857282eb024914a824612337401f42b25d19255b512e928a5282d4828524a84c522a14829919489c25bea57fd16e96aad740bb1d56f166ec5af79dbbc47259dd9bfd666dfc96cf616672bb398cdfbca27525b39845d44944b5697da69caad4c9fdc8ac5add0fca813ebba6467696a59d939154ec56b7744121dca842aa15e502d3b6a50196d45910ed67fdbc611ab1e6b8c22dd25d2dd571ad9bc5bfef5b36d64a3abf5781b9dc810118a859b342d6fcbadbfd6e7cb59b849d3ebabf74bbe65b97c87a41c528ecbe827002b2b176890a3e156b4bdb0d749968dda87e987d88b5510a6d00cab3284f4257c492b2b9b482c7bf89c8a35ad8c6656b5ed8b613bf34669c1755c8ac5bdd0d7bbd0536252cfe73a2e05ce203f72957503c6a9c019b2af629c1ab7a22b8bfdccfbc4cae25f310257954b44aee352b8953927b7a2a1f6339bdc1b302d5f836fed7c4a4ba055d99f4fa17cae8b2392a3b92e29a7bc32fa5c0a8963b2258edc6dce594d28a5cc5ce729edefd85394a76e7c4b9bc81ba0d581d2fe9c0a9ca1b2ac6ade1bb094de5687f6c7b6138b53e154a00cf3ade73aebe55d61712b9c0afec18e148d69d057323b84d8f142236103091948e8d05643914e67367ec37560badd0ddecfe0d7fb78f3ef6cf243acb76ea3b5d6469a5555fdf8a454b559f6b5da14f4f4833da8669f8f55fd6493f8d8d3af282de8c3147d28c2a2f7fd93f879179a5a128a941249b9d57e1e5e4b23a5f924ea8a7ef514f8e9c73f89d9a4facfd3df778b74fa8e6c34cdfb7ee8fd3ca4d5fa2d35a570b3c825b0877fad1ae89350f549293803fd2ad2514af749dc229d867f6df896803eaf81a065d1bfa017edc0d73de883ee9bd4bce1adaaf5dac6e256f441f04928196da3c668f5f4739f948232d0af6e49adde23a1ac6d3a2a8e78280c0d3dbf62f561c5ee572b6f520ef57cf51427526e98b349659fd2fa968e4a1ade1a2efc0ae612d66b4fe79372e00cf5e989d4f0f789d4f7b1dfa392d6b2680766719fe24dab8fd17b034643ef2ba5e767a49cfad8db27a1ec57778515e9f435b5655549ca8132d05c339b88621dc4837defbdf7de8c38366e503a4e1342392b5a51ebbd6a59082f8bdd875d4dc39df71146948e930c1a3635326e6ad4c8a081d15dca392b39ab8ad25a2d5a2debbaacc52e8b61f7669976334dc3b8d3f1783c1ec87b3084000107582687165c90630b39bca062adf6de8bfe830c9ad20c87f921e2b8947356159d554569ad16add5b2aecb62d675598b61d762d8bd59a6c51b9ee29db7380b8c4008a16134451a91068828938a2d5d2abe441f629742cda8612acdc0b1519a510359a04c0cd80259e0caa3f1503a9ec906c6e82e258cee524e39ab8ad25a69b5acebb297c5b07bb3ec669a8671c7f301813c3c3e3e40e07f507c401e09f08851d3e27bfe7c6631cb9004fb62d8f2457ef6d6ca1d92f7f5d79a64f8baa4cc9ebe99c76bbd7d09c0af54c40b2dff53448a0e1dfa7a10226c68f9181134b4fccf5b4b31782300b57c1ce567797f7cb5e1f3526aeff1326fd0d78cafcffefadb7989b3bf4aaebf36cbcbfe7bedf1b55d577665dfe9dcb79f7d672b81330dd7dbcedb8bc43bda93444f16edc059662157b4bfb289f6389b806c72db99966f06f9f7d23fb2bff2f6c8329fb8c63efb786dc0fe9337dc2e740df6afb7d766af0bbbb0960faf0dfbbefd7de21acbfb035ad6e0dadebcb33ff12b6b29b365a513b0943366dc1b2e6d330fa1a193374adeb8a4457b1e7b30c6375f355879b3b0c1d2013566510caa0af9f13d6618d2632ef118eb0b6b5f8c1686c14b5f3903f00b5b763696b0d66dc4917f7daf114715f48f12fbac2512bb7c085d4ba2b6f8b51741f6f7e92d3101fcda57006b15c8eadfecf5ad9559c7e0bd017bfb170d98cd6e7a27ae2c6a018ef4eb93f8d3f4c4d2337343687f1712c58a3208b5457690722bb4aa62fec8a5545c4cd1f3655ed1b58ba3a9021c658a5ca92d73051607ca29af975576c012e92a4b56524e6bcefc293aa3b4d11a2ae3343a66932805387e0ab09bbc86df546a23e5b4c918ef60315b02bca50b4c85912e1546bab060130ba6c2d41855a6021147aa2aa3d6c4115b2a0961339772711da7c275d587ea525f5ce288fc9738421f5eb3be8876807fcd2b5f26902e3160645830943ec817f9430c18194e8563a92e71644b974a13477675912ed20798ea4385a931a44b85e154aecca5585ce7c2a96c1c502a942e9c8a8da5615f0c8e33a1bd4218eb90fdbd591591006f3f790a6a72927fad58c403355d6aa235e80db51147aa1bf414472e0a95aa4f4a411950a49c4c85a0a58ddad0521c914f6de2087d684d6a23d2c19a96a805d37fb424e201437d721d8ef2944c5949d15b40e94d4f1a278e6c5af2d349fbbb8eee8817ed4f85a0a638f24a5ba8e1276a22e5905295843a698795422bd7bc71407198f7f6132947d68e3a0683b7a21db009fda92bfad5ccdc0a06aa2a595522155cbd77a27a92d8c55195626b68f9cfa44f589ae49287505a7342e85c47a9bb731d9d93fe9c16a494c29ac2a9702bb4b6685971dd932da2237055b568f87293ef28970bac7d188494ceac7a92484241586155ded3a431d6524cd5c3ad82b0d2b62ca3104239453a38e753ea35da453a6093fa73eafafe189aa875d70c445d4f71e43a5c74f573bee884270bc7d1f5028ea351a938aa77b332165213868972e04d4d222330f5902da157d41447aa0885ad6a3b8eaeefa9ecf5afafd5d268b74cda3f93f8dc2aafaa696b2cc774d0a1dc0ad771295cc7a9702b9d0ed7712a9af65c8af65cc7a9702b7144e33a4e05748210d614e864e2b403e8c4a978742094c70ab702d2014a79a4804e9c0a4b1c4998242401ef2a035f88380ad9c4910c95de09f9a013d691c24f123194968fe9d0f2f1163ac5510a053af140ca8a464807e844a3868d1b3a7e8081e15464d7e2f262e284c958fbb02db81c81041da3bc35b8fe885b5c119f84ba443a10100b3e7c128a9422a1483922dd24716bfbf877577c5c978dd5e3adfa1747aaa7f19350a41c6cdf754bb1e7293c2008e67d222fa795465c41e9c35ca2942a7521a52dc4443a6013f853ebcf4d1cf998e208ccffc18923343e35e2888d3822ff631347ea8b54b0952e222170f62221f0ae2b5ac2076d9df7d83ca21e60a8a5687c40603c85e7e585c17c6c3cb6122d4e92dad6525afe6703a18923f99e0d04660391d112fb8dc17c6ce248be4807b82ae1a2650c2dff6e1b4486968f7d6cb4fc1a2302216386105abe65716991ebbf7b6d149dfd24a3fc122f2ee29d181118be065fd3e06b58d328d6264a0b4c7b128a94c2341116ad83f346911eed3d22299ac793e77bbef3d55380be93f789c45ae73d0f7292a743b146ca21e59072483911458b540b321af6a05f890b3ee00e7c29b9171d296987fe49d4554e94169dce73291de9e974b88e63e9749e247a6447a3f869276f68c9e75438154e855391a9ebee8ecd99cdcf22a7827dcc322e258b5a9663e4bac8b164c0b59861dc8ae537db10fbbb619953e1543895ae1a42176e74a1465bcddd5d9b73def91723e59072505a5c12ea3e29754558b0ccda4828ec3591947bb1ab8974f3b5acf3998675e67bd51b07ec318c9443caa9f4cd0daabb63feb0f2870edf436901fd3de45ebcd716b563c1a1ffc3110581e116f221749c2f185a18514954129544315c6affde461111b0b6d11a27d9cf4adabe7d0d48ed3871047b6be7a5378bd02b401c6c739c3872bfc2937e85aad67aeffdf8d66efb95753d7d59343f15960741f354ed506f67e656240cde89f82f9b7c71c15bc280e58584c143c0d372c50518ca952a1387b02f864d6b3269594f4544c02a424438b07ca7327144060582d2e8f910abfcaeb87faf69bba9058c45d171cba41c6bdb239a3a7f73d38b614a5f827d1f2222025716b9a259fc637c51776dd15b761dd4b40635bd1344687101deb26b91126e2b5986bc441cefe1eba146947d31bceb04583e2efe03fc41f171fc076908a1b5bdea3dcfc1da701c4d44046c59d6c7a774d39fee36427c80440c2456b48559a47b27fc452bc09b6a8b4deb2dc0d87693beae9f15455f6e9a55962df14684027fa1a3f441c78f21343ffe14fd20ca02dea35a310e8d467a8fa0ef20f2210810cc0822071ad10b4439984002103140d9c92e4503b2a6bcebfd45607dbddebf0257ae80b5257419a3acee1357b74462d5969d0f5132315ae75b6bde50fd7cd10eb0ec42628864e08d759296666666666666666666666666666666666666666666666666666666666666666666666666e2f653d5af565a4324832549b4a13520f5f6530d1d55f8298e447d8231663bc0db4f34c42812029e5f553ff909ca171abe48081886bf05a20a87ef4f78efbdf7de7b3041e4f0a27368b1f40b2287141d44a723888e8850101d154a98a044032525250fc2c0947c8c2850402f8114f05b12a534e1255e52f234ac443588100a3131313131313131313131313131313131313131313131313131313131313131313131312f86a93d864d0fc9db7ed679bb61dadb3ca7f674a6557ecd07cdbfd67e68fe9d0f9a8fb55a79e827fe8f9f797b7cbd365cfbdadbcf3c3f3bb6c47e866512b79b7d0ffe8edd2cfeecabf9d6934b747ebe2dd179ecb5f76c253a9906fbd8636fdff3989dd4e24f66e138f86d36c1dfc926a1b7f6e7b6359c65e8df4bbf3584b4b779bf2c3df289ebfbdac76bc37d509e77621b66a7edccecb1b777be660396b34ededab43e5f6403c791dbbf30cd433c79a3e4dd097dbeb369efd9eea7d3f91deae4cdc271323ba7b53f352d7b6dcb5ed37e87f0d3ef78b06c32dfdaf9b6858bfefc276f16efb12dd3be3333f69eadf3dad6d938b3709ca9bdc55c4433c0f3336de264a21960cc3acef5247e529271d14f45741cd9d1506202f4e55780bea438383750c6eaf8e16f1f423fafdcf4627429a59c73caaaaa2af9966271a394525a61c080010386dc44302c18160c0b8605c38261c1b06058578c7705847185fb0a29e58a39e75c51555555ad10d1608588063737a7130d8d8806d8d69a95c4d869428b63967543768b4e7bdef72f0bd3fcfeb34eac2b9fac3936b47f278786f6b7f0b19c191a7b8f1c20b4bfcdf941fb77a27d07fdebbce7eaf1fef19ff7bc3dffe25f9e1dc3015e96ff85bdb66debdf43e0e3b5278912c0fcb12dfbec6f2ea1bd3ff6d7dfad84f6d6df125a16c90063d8e3b7b6dd82c427f6f1f7b32cda81b16cf2f15a36f178ccd2379f58fa234b8f1abcb3b3f4e413d7d706fb9dbca1b6efdb7661b1cdc21cd3fcadc7b2bd7f6599f7752cdac0fef1c50b8df17b08bc346879a364f7493cfb6bb3152219e09bf78985e52b9bd4b7aa75f9bfebf0ad9c146dbddf1632fe25714cc3fed65bbfed161d7ef8f8ba2ceb7140d1f72febdb6ed1896480fdd270eb76219201de2796c6f276b14fac0a4fba0e74bb45956e7d06dc03663b443610bd886c00e332ad50f2c24ae98897189f0663747729a59c73ce595555555554857cab8962109808a8344eb576b1753513000401c315000030140e878322914092c469968d3e14800e838a4a6c4c9749a3d21c48519051921062082006000000c0ccc8cc2611004d78b15e92695fa2c4ab911704f200c20f008b99a4688ce6017528ba74e8ff27f705b50c3db9bb3a1673d9ea59c06d02e65aa872dc27152c911ec067a1e8ef4ad0f5f083a97d2861aceab3e937365e31e4c96ad81701a0d3792b23d6f71c7924c8872464e491c20a1255e491c23fa911e9086625729386f85a5fee4f30b19e999ead3b64fede7816e8467ab3498541db33fbd211e373d0a0eecf3b454d9ba6c3d5a3638820aaa867f040d20a102458c714ee37889964bf21c35c56c9239b99e682c5eca24ad59cd3c41bb5e22f70a33f07ba8a8432c2201e5e25941f930b23bab0f388c4b8a53ca5f673d386779f10793269e0dd7ded17c6a9de77a1ac43789c5c843a94eb9b73c27960ed922d6d04bb47dd5816597cb7211c4bc509189217475a4700a2f3eaac684a7f84b8e50bd7f1c3fa7549ea8578ee172e1075dfaf3890bf0c7eb6c47afb2588a63c879c555b80e7d80ecc83ced46304c30f659566c818b0ac00fffb2db32a4326482f6a6f2ebbf2a05f5626449f4d2629e64e82f2720966cecd32ccbb6a4eb0a4d693cfb3e40847f1e1f38c4495e1565814c0f9e3184f67668734306cadb36feb8e59d7809678695d2cef0e09e393d407c5f07387751f32996425c9dc623b60d6c36c050eca2d1e78dd0a9c656680bd1dd98d06dfeea51b5b01cf9bf6e59f8c224fbb0ed4500d85b4c92c7c3d1531714ca095ef78a9845293e514a49a22cac29cbadeda5a03e044a927c775472895b663405d83a6d83a68e7cb4bf61abec5364141b3019f0fa9636b8d299f73646013011ab041f58e0e0bcf5de8cb912ab661c1961c570ca0e445b4f77ee8cf93cc9dbaed2372861b3fee3587d26421ee85087421772f0f8c8d8520e474a8560d01f767eeaf2fd95cbdd92ffd29903a4f172a9de3d0b18c9a81532024daa579a6710c63d8b971327cbce079d4611b080bc0b16f4070df22db5e5e799afd29a49fac91b5607203b7e0a7b95de70bdcf6a3a8f0c5c397e0fcc5a889d8868e5de4bc06ed9ec716ea2ae5721bf2d732050f4d6bf9f3a0e536e5ac0325c53e6ed07a079333986afb0349d37d5f01c0b8231f114335be3d2728d1813ef4bc2410793d0500e65b3d891af07bbfdd5aafab04f598a8d0d993ad39e9a70fbf3b48deaaba662cae422463f891d466274edd0945fcda48e685eeb0a304644dfaf8f923bef6d68cc55a7d6e802fbcd97690eca7ea4756a86ea601e0b67d39e846a9186200aadd5ccd94b32b83a7eb88791a4a3e959bd9408a9bf890084e57dc1b2b6c1008ec995b95d691a66aa18935d4770d36df2f19bfb99a76519aa2df288a3f6d70ef67d468fcc35dd69db0cbaa0c9c202d82e504d06a92b1c0ec39d0c7a29b53ecb30ede2fd4afde790c313d54c70cd2b9b2345e49a0722be179ed821a1dbde0ee0cc6687ab33d3a6de9d153ffb73d653f58997523899a062d5ddae81a4cee1ac3f8cd0a4be946b128ac4cf65c488c8a3f787d5a3531ef3b1802888d180cd251826d90fa46d087e0395b5f8abe67fc6f0edddb630bc003dfd8484e7e891e5ec9d9aa94d22abb9e5735954688239be7dc49ffaa717c64ed204f7885b7372d6b4f457d20153f788317b3acf114dba362a5fd089a00f7403d646d3755e238218b0e3c26f9750883c2b7000c7ff6263a0bbbc9490a59eb3e79d20f83d2348caba181b5cdeea66cb9f722b5475bd94549e44c412e2a22d9f9485776bcccd303c84d30d4cddf114ea26c2d494166765fda4ae27a644aa4e178bd18724e4eb97e98899f472f72ae965c9f06dfebcf6ea61595113d562a009252313fd13fe14ef71b3833676a70cb08ca3eebc8bb97edc3e18b251e06f1f953bb8f337c9cc6853a425a81444e8b4c8f988bba47525debc531d49dc69d9fae015e66b05f9675422d2eab615a4695c0c5bb34d96fa2646124d7b36921ca10cf133190fc3024d8543816a84f6b549d354284bb3731028e0450b2fe2a9f48d6f4969ea24cbdee9d00151415e4d2664b960bc4c8b48e974e857bbfb30c6673c053d7707d19d3748109e5cd4d90ed5b914cc7ed364f7537fce0198649580f3e699a3475d3331003acd3a1048c48d117ff04bc94bfa42a9a0fd0079960865fa02955921a6b28596545056bf62c5363c39615ab5459b060cb3a4bca58d8b3c6ce262b6a58b366cd8a0d4b61e56248eb3758062c36099df1c2058f2cc5a33252dc76e3bb0fbc7b033b9a91c6c58351db84d843e137784a20ae8ea5afc90f317839f86c90221abaf6eaa8f697b5ac344a9a56a2d210efcade284abc4e3dc05c71da2b50d30922cee7f751a202fc8e62763d6464fd83b08ab814f4129e0eea318933beac9cd52974dba00753461dc01b0e9c09fa8125567fd8826befb50b9a005651e7345028fef554965de6e7f5495a2a4a2083413f901248644663c04daef8ae586e00fc5946381405cb8ebb2c9b676726b7cd21008ccdc5e84a4ca3979df020da2a667941c7c0c835b151ec62ebe3a1511f5236d3a069984371d4907be9dc2ff5a601f6bef788fbfd8b071e1b05a515987c05f38671318d513e4d9c8490b05c91174e2117f1390168eccfa02f655e000ed63ff5324b3ab436bcfbbe50b6495a8cb60064903ad1d68a804942806cd4007c3f9f355fa8acf30dc0070662263fcbb102aa01d82f696a5c5fc96e53b9cc4d0d7b0e5ba43735a27e53ab3fadd6b1eb724827811303504e3c7ff57249a22e70ea1a0f2a197343b7654e8d736be644c4d200242d225eb4b446a44e2b6a8a2969884c3f3dbd74a2534a4d315d3ad1d3a74d2925757a51534d4b253dedb49e0617e371dc07d6d6f582353c4a3eedc2e2eee1e0e4138dd6c1b4b01018031f34a6f125e165019a5823ea879914ce8f7e797b06083ca8eb9c45830b945f822f05d5fb0165c737683ff0c582fc94c5bb338a6968c3385053580abf401012a814aafca6b3fa7ba751685246ddfa1b7ef3c5604b62ac5159d283f652f8c2d04fdc4f37692cee1a60f8115269fb44772bfcb28b6b5a0f774c379af511f9c70406692a7f6a8fcf33cc5154ba58c01a841a03badf8d0eab1c255b971610439f531f95723df996084dab904fbe399e130497423efb33d53bc13e609c8ef7d1d6af502034104527d8a357682fa3ee7fc5c38e74f418b967b91d77ab125fcce7086b300aaa47845e0db8e1f4fefd8c40c4e192de7a20d759160e4d1be0db8e48be189f8ded17f9bc57a211b3b7b313810f17cda6617b9708e023ca5356fc27e3b12e5ee74fcc5296f787746f76e0b4245100c02a98f0c560d2e8052dfbd049dac9676f9f4cc986fc08a40320403399f6eb6d327fd26913551549b8aef1fa993f9d20b8fa4240c581a16438b05a34014df0372b049058f946ef41f6ff13d2a2c3fa1728af14a60d018483663c12cf9797986defd07b81db5fa0118dff64e34a34febecb6721e22b246a8a5f67e930475d54df45af8bba7c0a48b1949b5fa037b577363a89e78b41eabf40776daf4052c8eacc9c02c586e04d30509e457727c8ef748d2d92638d5be40296d4dc9700be5893af6bfa15e2dad20ee7bf2edae76b0e2755dbbbdc99b13b3f906de44f77966c27c9d6b973382faa3623c99d691e32f454e3ceee1ad5ff6d883bddb7cdc167744d6f3234c551bff5cadebe9de4942c85dbd98cdea02332a4ed868298d100befea4b6bff9f0ffc8ff6cbaa834183fe1cbbf6ad4a7dd56d93f2b156e916704364ee30d4d3ec45f91271db8385248a60d14fe66459e2b33e2cccaf8e5177b1e4d621579f27a082b6cac39fb1779562f9afa1e3372dc781b35352bd3248b3c5391331442043dce93e23afd916ae1a5cf65231e787e07ba19bc41feddc90360456fe20639094c11c5b1ad67a89295c1f33703b479d9ee19ca0b1e30ed10aff92518a5568d5fb7cdda859c3161ee5252e71530edf485cf57c340c9e60700bdaf9cdb15f1c4e66006867cbca2ef7c85fc350245cd432f0aed5ad0083fc589d6ac990ac42e926b464c6767d7102ab9204540282070bb7852ac9e7ecd3bb2a396548380051f5dd0e8a366f2585b4a1115aa0f46fac835ec90fd8204cddddab49c8250e97c628541c76119eb687d83b0e4c564295329453fe3bd6c9874857d0f6a434c0a65513783b0e6e687f0c7d84f3ac632b35a7696bbf7f3da29ac1ac8fd25d41daab049f9e66983c8984bcdc3e93bda1e165d3d439a9d398fb541508a377620aa20bdb9477d2ed806ec8ffa74a9c3f65232e8bb4861110e9685751d1dfd9c048932fe111d88514177770c2ae2cc4d57322e67541eae48ff6b0cf4a8c2cd69743c7914c075e49e7c830e320fb943bd69a6ee1c4afc410ccffb032bd390934c109fe011132ecc83a0e9426abca49bc61092deffd1ca4a928f0963317f1cd4e10ad61631fa82a8a19094bbe6dc2c8aab1b9a474b67cd83f6c46c7fea0a6a9e45ab11cb43ec57b45bc6bf6ec51220dd11cf838c8562dd45f465fb54ed7fa3961615c8726d91a8abc220b61b88b1640909921d9f8cd6ba1b5bc47a65de5457ec416acedb5460a88d054e1e0f8116d2d418c37d0af2149fe5b385323efa9f4ff8679907dd820635fb493e453d64da304c7cd20a5dfab3fc617c23cd95b14388185725a2ed34bdfc109a4306f19b8e879072c93e5f3dfa47757c0fa10dc72ec1bff86e12cd7ba4fbf4788cc3291b836e3446b8deeedcc2696b8cb23f5ad5ed11daec3f84249e444e7960fee9015d27092f9e7b8fff9d0676405d6ed6a7c36e6c8cae6461f49498e2f890c2ad20d84b8a622a0051759ef723289aa3b8c36f88ec85a54a9ab1af8e08fb0bff297155c7513e28ebc1d59b813e781b648fc71cd9764d08e09ab8f5dd756d6809c1eca0f1ca029bdae99e79cee6afb09590bd11ca3eb318e917da0b25d14e9ea3c5de5ac2edf66e98e6236e158ede180da7b9930abac58a8a57005a3ac94816d5534ae9b106b6521ae10e2e1a806c661d90fb4a8ff5fff78a4a2dd8283228a1678209b255392c48fb5b251a47a503c28b1cbd3aac9cb2dc03d1985b3318c42b29425d0b80eb7d63efbf30ccd14e2684b7c7620c7d239120a4e961530f4b863fff41d75a51865fbcf946a23e4883812d5d2cacb072f2b31efc6164b20c921e222ddee32cb5e53242fdc1d1398507dfa5b4c76d5894ed926ad8ec6120dd08d793711d2c65427b397d353528836a042819e17bc4fc30004e4648bf650fbd57f7f867ba0bb8f39d4a6c978704767ff6773d6d24741be9c535636cde99b234cdc364b651fd10ca4105456d9c135e3320b57628acac2ab6fa3f8be4416927c19e4a8d2d777e8b5de8fb455e0419d5328a92466c6c02b3c8b566c7380b19c753dd6324a474277aab9f7827a375f521e34fe80907b8f237ffda63b74416de7bf41ee41cf3e372c6137eee11138f2df8c0e591ed71bd35420fcf7171e9ea08430931ca00254c4167dd6f2a4dc7cf4ed910a60af9259577e90e23ecab5a9413e49010bad336cbf2a3d89cd8bde392a8c25ade42720fccdca48eb473e0c1d49a601bf08a0612a943d4d1fa8c2bb919cd81874e8b5e400ceeffb5c2de362fd8a009565e6783d7dc89b91b0ad76eebb4df81a4c7de733ce0f98318ecaf002f7211b43ff1bdb9303072adf12f4cd3557bc8ea931236955abb701118343bd911cbbf3f40e44d2b06f6d3d6ea9544a9d27e18d6a78916fa8ad39a287add458cdeb71cb391a34103aab56fd815ea598d9c13bf736afaff9330f695579575df15b981953f985640ae8fd5d7803042f68deb7ad130a6413889dbe37a8bb38de5156b286dc51a170d71643450bae2c58fc6d67e81f7cba615ac0c0b5792d2350b3ae7bb03c844d1c1aa7e6a603a12907d0edced7fd99f300f4acaca03912f6423b9b9f05b28ad66282c4377349aede4a49ba1a0d8d7d80394c735d518edbd4278acce510b71904d52031a5193a9311a3b0ddf313e6cdf45766c5a429ede090023d9e5dc5193a82a72cedeecdb3b01f7b260abcfdcf28e16a34752918054392a7d24a2f99d3db94705e809997d4b6320dc873d363dc2317cdf293e45c314e31c3de1ea0c251a4a96fda447119da5c54d467d8f54720da871f165966f77f63ac4adb307dee735c53283235aecd7bd1366f1dabe31f6f34425d1ea9f07fe11667411b0f790145d7efc8c4326cd9eb4b47d8514c9c01d785d6a762b79192357e32aad1420e5a0325d062b66e8f1a50c86caa22091650f6cd014c1c290402be5e19893f616e878e0e083a872494f5a7d1526e660666a6697c0028810c3d9a09aaaa35a9131cc592fe66f7994343aab9f7dd6060922b6828c73cb555d9a2892f05211d616b5361a4d6d243bf3fa3c94b7bd6a49619879ba7553454cbcc4295b7bcec03844a3cb6a7c44553fdb8d320b6b96cf9c329c1d30195acd4f898722597f1529a5a54d45fd4ca4f2d83968eec4126d5704bd68efc355f8337a9209c6dc6dad51186a26440359f71d6aae14b39733e1eb256ef7e4738dd64174a2c2df58bac9b8eae991de400c8508d0cebc0721e3b3ffb7c9fef3cc4fbbabea79169196ea616f6ecb5845912b5dbf9ba0c7170cac943c2f22ce345d85b2ad45bb8ce9ca5dc0441d09106d665ce8b9b7b34d695400fc0447821cfacae8016a44e5fdca68da6a5ebac3b2321a9255466f45abf5f5af2c2e2766d9b541769302a7f3bddc490416f662dec2d14c1da6599612899d3a2f37a38f10bbb11a470c6da79e0beb4e8d362c481a4dfbe1809701313572290823725433d43efd2740683030cacc0185de351abc49379f92180114d804a1786fec7b98a569d575279df6362f97779abea567d50535cafd9513cfc8e207ae7119fdeffe6e44b76d3d895b626cf932ea84cab42cedf1d5a3b92da7398402defae46507a05fbf0a7dfa0e0c4508308dd8004396304d98bc846c1ca247b359fca79fe18ae52c9448d24dad1d0dcf9646f4b2149dc68484cd44b4308e1bc4dd3c901701fb61db76669352b46fd1e6cd9bca498ef888633235a1c2d3616de9d53837270ca539d2516b07a13bb9c753c1e875f4ccaf981614a24814446b7c584625ead3534cfd1454b67630b8871a9684e11477e8606a922387b9560ad1f0b9d99544f1d69eaedabe3d59cb9d7924f4fa844a00991c2d065428fb748b86536f9739dce0a4451b43d0f06359ae9741300972301813e54822e3d015a8f0f00f4c5a42159d2b54052d2a82f097f465152c6155faf1b53363a338a6b87c7977d898e6ebebc7048f12a5385bfc7709f4d97cbedcc96c8e45feccd24f1dcfafab804e62b2633ac43680a8a79f397891dd11e7e8d3d44f202113b1e0e94a52ccd09584064d298fd3b039523a5c2347c1049232f18cc427831ccc5e843b174e80e6388b20d352585f926445dc46290f980b515b5802b59f26700a8b6573eadf58253c189ed76e8e9b0db933db77ea61556d0fb7ddcaa4f223a28153b493073cd0ec5977a43638a1bbabe71302c34317a9341d3996d055d84d1bc9cdc1b46886929e91634e6eaca609c1071b0cb3d1abb0f44daf82b4971932b0d9ec8332422b3309f5b9bc5cf9c8cd8c3446585664e14de404b938504bf2e0bc5b20302e225a8e2c83f086c4909c5b7750d3c77e66f4b93d740c31b3df9951047213dcca252808217771e1c24ebd7f297e6665e9dad1a5becdbf9a27fa1aa2083b55a1d92cdc5aeb661dad86246bc4fb9f778b7b6477b47e510af18d3b04d246cef66aa44c003347a82fa0c7a7ad612fb3ea50ca904d30e95357cabc6a5cefbb8da2cc07c974eae77ac3d71996456b6c41bca4250bff744ffac7c7d62a1847018d10e7387cd373462c7b46e2f71ac515338f54814f0797f41930bba91d804904701089dcb7dc0a0240311ca86420f500157ca9d64fd96cd25a8d6c28227748c8f48d0536d39e5149b60c123be407859efeb0468683a7afa73289dc0c032467c40dc6dbb71391aa58f6630258e0a8bd4193579967f49ec10bd4b85d02eb11924ae6f592cac92f6797568716502750d637392cffd0dca2145781ae158ce427a787ab466fef6880549dd33452144dfff84932882f56a0fea439b23295cb24f3789873f0f561b38f49967a8fb042253b2dfef013c322e30ae0bab6d81d1bb190db0f074eeb2f61141fdbc2adc0eca65baccc085c2948c22013c0b923cdda082d1f9a79484049008cc87a5651e5edce0f679a98a98d5a13c2235faec9387804239a0ad06b83eb89639081d553f4e228a2ace32fc35af03b54aa9d0c5951a0347da145c6934d7ac0f436572756d6901a62877faffb031c0d5d9d2c5fe61cc734f4bb316e14bae8adf2e8c88cf765b92e67b4f3a0d049d2ab9f09efc198f2a96fae9fc3cdfb05d9090ac72b066da5495685961a9816a9371672e93ee66c5a3c5b40d49855f2c121749c7338a5b484a85042386847e74271a7ff483964c64f7b2b503844ff6fdb8303845c08bd4213c7bcff8bdb59fd803aae6b1ae106b9c09b73ca05c280b5e365a8c08f5294d602d71fe8de34c7945b27be9dd50ddf1c02ac52fb7ab48f4697a35acd30a4fd63351b3da996a03157d13b601f73f15a000b185c09e952e5d6666640642328da7a3de822c2aa264560bcf101ba561e55825c521755ad07261cf7828c7a91192508160e0f573ced51a7237b1916c36515c911ca3adc91daa39af651b72e7c4428f135b79b96139fbd18b541343e906ad49c9da66ecbb040998b2aa2546ee4f7bf10a75b7cc55322961d6a44d2541ef86d27bb266e25e9e13ea9ffc825a172e68031551451cf6b7726cb3ae3a61626b13cd097eed4da4c5f4c7b7333681a6ef459e2add8ef11bdcd9d994010566fa15e7f3edfb2938dc6014e093e4b8bffcf56ac57d11d317890458962128395979290680fa420a26110f968ecef4b9f02684d6b704fa2f6e0ab9775c34ff58d9fac57d46f9b3b9e81b79fceced2281b380a0d28c094ec0c7464318eac9408dbb442e102f871210c14b520455b35f378bc13f2bb98575ee8ec53d9c5bc48a29b53e43f14e04700e450f49b3ab71937890c4fbd1bd30da8326f9e97ce623244fe9de77d0d3d000ef542974b5a48746c9bc91e4ed8772c7726465b2c9175e9d7158a475352634e3ad82bd479e10b190b73a13074b3c36909850af5374aa1d4f93ce0e5628140aabac52c07733d582588861d87824db7036ba26f857db1cb1ea9df1851b6cb827689d92b06e9d648419e817b3501e85fd9454977e442636020d8e56b9b92956932b630d11f2022bce958bd08ecf2842ac74918d3527de0afdfea7519203464bc2e171766e275b92f5705dc11a2ab35f5e4bd3c4b779cf2d532085085765d06ff6ed68bd55d65ed6c7660ac88d60142ac509d955de8cf0bd7201b1251ebd2b8d0ca55dbd9b3ed7ab4f2375170455e4a5fe3b17008fa9878cbf1b1f9300399bc434557e68b81efd7659600f3e0ffbc0da836c1d4027a098f10f4340b8fb7db10bdaba17a6c3bcbe99b166328c26efb7fdc31732cead76f5b550fdfd94a92e5a147f9467fa81c3323221e757b2872ceb25987a157efbe1e9aa9d868a5e02ce06b55977b285edf69dfd03c9fc55150a9f89ac5e0a06a219899cf2409cb3bec78955bbf4ee45d011ea0bc2d5e7cc1fc65838c059decf8aa0a13efb23e9e3ecea4d5c55f9e28c4ac8fe1b263c72a6e539ee29a4d240c83ffc357413567711afeb2ea94f25ffaa169418a6c25a6f1f8adf7cb80ae37f95a6fba5f3e397c915d9d1fa4ee97f994aed665946619261b42cd3541d9e386c2bee10252ce75e17ef99422c9bdb7ef7496ff043583c0b532fc7af87e8cdaa3b5e52de5dca92a986fe251e1375797eabd44181a8f1a0713549fc83509051b4a62cdc7771e4e243eae9269e18c9f3f65b36e583e9180570ecb6061535521e52f3eaa6af3a17864d13324567237e88bcacbf32989d407a97081ca2f67ed5b194933f8c0f38214dd53bfc3a0bb8ad63b2b75ccfaed73c5e554758d2ccc327afe06f486de856a8a14ebbeee1f7bda551afedcb54ad4c424ecfde40329ae37d1d8723ab7117d2c231fb7af563c6d856bdf603de1206a6802441cac410f9727c9c588dbdb8dfe67e34b06684d1e1097833ca32a9255a67a415a85ee3c9fe3ae250bed6ca326020eb1a4601994655326416050d1482b72a693c96b3f59a69b6bc070ac3c67da442455f6722f08cbc87164929e56552c8bcd8ae444cc999d309a2c47da8633bf1c1031d34c8e09fdff10730066fa513c1e553ac40c567af24e17c0285e52b1f983cd748d0a0066262b69c436510cc6f22c6adca8ed0ea76709e9bbe5311102cd5d585242c61c6d15f5d534579d832bc44cbfc227a2ce1436f5c4029a6602e18610f5e067a9be245f36729753607d498b33dff35b621b0c4a153f723192ce3ada564139c9d9a0d4002d77402ce43909b89519b8fad074b0da627389494e6945c0902c738e99acbe0ec981935f167df71ea5f0a07c08124a3444d5017839e32bbd858058ac54295520f8b1484f26635fb5f9703a0ed833fead453bbc68167c64294006cf44028bcf1a9d787fc0160c3eec6e0e7c0a3d84e2c5af9859a98ddcf2e5a8cd847a7997ced2383fbd3c6046fb0a8a99e5f7b64163e0aa46e33d91484af0d58c8aaba5d0c86040c5efea77540462e6a544df4cf307b563612722c739efe73a35a4f9a556973d42dcf3100d6614f02046b809b67c297723423aa0990efb96caa878c1439bdd6e4743f2d00ed2c0b9e0a11053690f25f783a3b9d743981d47fd21cc3ba0d0d6f3197d0659b4ad662789ac50e11c9b1937f36a7bcc741a35e088b4fe81ae96d2d57b1264b57cd0cd1cd45805ae9ac95ac7da749520c1d4bba71002d5ab293ea8c43c23432d4b40c94317d30b686171fbc0ef6bdf051433127e232ce8e8b54cdcf5ae6f7b7040ccd30bb56720a572d7cd29400c7b3fb63dacb1330e1d7ed18eafc95677ae2c1c7f26db6b9c6c1f875a454d4cc899fc5095a6cd2e6591bceef8cbe6ee4aae41e9f6a80325919b24e8e08d4b918862686258002e73c7f372fb4f09c4c57bc1444ffd82fc3b5620a399a2e0c484fd739cac22c71fba8a390124c28be23e1e93a2143b85ee9752ce537c8bfdb6c929feba56f9619ea06d1c79dcd337e992cb9d203f4ce1b408752e16b316e1e84f1504256bf606392280c6cbe7858e76c60fc3e92a8a5c79ec14a205de85988cd38c661a3a6397c36f5f9543d3a95c8c8f39b24c0dbc53ed4ef143f5855619713e4441e4d1ce87adb639583a1fda80b459d25e795229815511076aacbc28aad3ee56a37181988eda023103d32c831ef5773f195ca7aa22ed5d133e5014df5481789076df32c893f2fe1b0ced578457011bc4001cd3bd75233ca4eee5021d552066a68d4b64e0a5caa5b492c21488b90775df796d812d43ee956cd7574ebe06623a9f7dea6f6f71ffb08ac26c0585ed81b6795f380e961b7d006ea4c3eaa2a6135ce8cf9da40f98b83d74af089ab3046b082f25b1d4e324596b0289da77d932e5396e39d0ff2ca0f40a215a5de9a059d45b8e20d9a88ec64963a789ec6788e9450a11c322b36cece61d72e8ba3a415201306623438ced4742827fa575597a7a314097110d71f746d8d631317e7a3fc2d5380baaab5be556abd1486c06d34d36eaf8bf64f8fe8903e80ef86e1d58440e9457a72a24a512e3c12a2aa9f9c27488570c2c02c35162639d8996855c39136719b69ca2837eabc399305e7b9c70564431386c175405dbfb613790a7b08171865c96979d9a857f5e12f175b80809a07c53b60f5b49282fd726d6e363f66b2ae1cdc4f37b0e17e5723c9ade4f0f82cd14c09d60f8675636c212a3fe989d0068485fe6f0e7df908e6bd68a56136a770e17fff2a87d271911a9d307b5bab8cd3ce41919ed7d0993d188421a41a0d9b3f745191f282501495ce4238053588bac0b0a0079c5a95ac43c2171119b21590b06a8ebd982de3131449a4e37fc4b48bbec4dfcc67e5e968254e13bd79e3f666fc2e21cf7aab4a4862107ea7563d159b8b1bcca1ab127d2934322dfa40926b42b06328f40c7423ef0ef1513089818b63b779d540f0f7b63b8a5c5a87f06705333851935b294d23ef26a510800ef43d052d0b608af50be48f271776aa78ef7b0d66ac95f88d8fb61d14f7c745931ee0615bbd0424bcc4a0b6af270d80aad4278a1dcceb1a8403308c6d41c8de8d5e93da623c4a668d0749e3cb8c899d80dd8a83e501c546d8813009983601b541c936314e9b56143a841d1a39b8c697e2af5d1318a56c831262685d47dd65cd7332b02ef1695563baace442043efe13cc907b93ffdf2b891d3a3834be70f9281da2255179d1248cada16d634aa72a7c94949cc5819d0919d6eba08c5323332ca695723a8c37c36336801eafc29b55d19a59739c43952863a81b439b0600f7170d72d604ac8a1e696c86ad4278159b7bf6afda5d4983d1afc166ef990246e1a9466bb76ec906ac027fb67e0341f3ff07271b0cc1b83e7daf8781638ac842dbb2da1e040ca4dd427d0296b29ea4fefe6570f62031a7d050574d66fa4afa783fe683fcd64d49c1b7c691c5ad32f76eb971c46fb8b94f3c3ffe7ed13997291b3e98f35f34d7f8dfc813a045f992378e2c4e5da0419b5d718ced10cefdbacfbe5de2bf92b9a516197c3578eccbf009269e083042aa925e03d2f81b90d1c155f474f0fffae7786a065dbaa43252734f19ac7df282826d5c583170303a4c4bcd37f7a85248e3a60cec54807af17202f0e47c2e7546262206f1065459a249c05100390997998ff34667d464953cc47ed12bf7fdb409180f4afdd72b9e36f7cef97f94535b2f28f97d04c8a658e5f86b0fd8d914c1a9d5ad52ba23dee8b3166e319b47aa8bcb91c990faa0126f858a3de779603052042ac7c17a7f96af2e826550b932c701cca41bcffcba05103e8b5ab8c715f398b512259521097a31437ed5e80cd2c38f2cfc8ac34c41010107fbe943e5355e8ca797dc42345fe70045f817031f306587f7b0258b77259782abe9c599c5ad380c11bb8f6111f0a28c65e6a30a13c8b26a658877e897485e2248f9d50f76bef27f9cb61b9558e1139b2ed0ebc5ed957e5a0486aa0980129cfcf662bdd869a599546e060da1e33f873aaa27d0e01a25d78a929b7303a67b6e566b5829e505c429baf0e04148da1dd39a901bf6c95675e964a4eb976850d6353aea033271c38b4b5ca190064e8aeebf5de832957d2da8b2f097a26a103777a20846829f7f8537d69cd2ae580850fb371e0815fbfd64f2e3b29574b84d2ccfa05e007529f51d1f24757317c24f3bef3f7aa16049f9b9aac980481cf82381596c674cd8f79d404627f934c4800e100d9b822e0a30e6223d2c9213a6f0cf884c36ec7a0fb3511ad7794c2cb1e852a82b59a7e1e80aa81e5b91473981a1630905844832eb4a2d01a6369ea5fd5a71a8881a561fd5c4dad5512163cb4f56bee0156c4d47fa3ba01b5ba084c6bf027b7f19a7cf97433cef27efab79f2159999b4001551f06e957d0f156030a61eab7fed9068113d0d64253b74786d53be5fdd91bff2fb56aaacd393d606d8a8395a0185e912626d564d06eb3e0f93f6edf6c003dc9bec134de55755e459337dfcc515be361cc6a3b58d54a934bad836bcdd4f86b5d6a93e027b5444c54ceaf1c5a6d1d57fe5f9acde2a7c4dbbb2b90f1c89138c5845f965c97999157312318fc86aa0da22beba22fdb3fb109f821a6a7b3f528d94ea6d631779a8ba85018387a0bc53da295cb01003fc4e49ba142f81adc62069e27ceb4b4658230b92588536f1cdd4b3f6dfa8d56fa5d69656d9dd8d830490323ce65a438d287a10f74e6d22636299c110978c5c66142a1e9231eaa289bade1b84427ed115c2deb45ef34413d80656392784527937dc63e870f68c8a45b39c66dd40374954ac10369b471493869afc970b31a893c19de5e8da00bb2052d9a6b1e11c48d4efc428151b3a479bc6ec9688378ae294596ee435bd78f058d6361ac5434f33e67da862efc65196e8ebbb1e32b4dc924b22b0054f27d0c12576e8c99e3003a5854a86461e1b895ba0b57006ce65b2347fcae46c4a686f8d4650f59c4c3cafb2ed294f33f605195338b9d02c60d9993be7c9746181ac23c51c6abf3c393bcec978ef001903cd26c65a55470f315826427290e829e236d3b0e4f25ef108b1a6c38e2c33440a331bb83ea3b39a7824d6e5f2a6d3e87c918275ab8be95b9c21149d45e20462865e402e2c893cdb0f8969e0d2df8084eaea639eafec9ea514ee3d2593208b8a43b4e470e0a9716d7edd7bcc147b12ac44e025806d2bcd63a4359c484ce1072bc0fa99ab145f31c6e73e5020242b4b952b3f58410ffc34252dbd25bfb836d13b0e61730019c2b698a4ea53cc779f9dbb8d737572e3e690cc82caae315f320d36122e7762d2db5a0a9e7ca823cc176073b64f6f7fd1d813020f647159179ce24142804b5accd9505eb59da5ca98512fd46ffc1ca94dd1cd28dcf49a2525a3f93b4ad3c8b29deacbb90fc01e449ebfb1a960d2abdc8e1cac63dd0b81a546a062621bee2dad272c37e05dbf069d74e868c3fea0fb600ca34264cb80e9a17c3cca7b8751dfe105802ef1f3e253bc944eae316009b17d7198f206494d09c30022e34310880f69840577f4a1a2f2c810350b117711ba40385cb3d56b292c604f41661c125d84ef321a35cda215844e1bfd54b35cd132b626dcb719eb2cb224ec1aa70684c79e6543dbb9144ddbd10cce1f6b25b53cd42d288d1c2eaf16da0e345b5f4a371d4953afe63b11e42d4ff1fcc92de1377ee5102866c105a556130232d3fd7b356fd5b949ccde19931f36d02c45499a24691dfaa7e7798a67d2a2573c6827adf589987147f5226098b52ed7754d9b1e8556755b49aaea4594079de038bb850d6a1d9844bd51dd632235accdc92ea214c79a56130572dde142f31a2f89b3d02ce6dee2fee809fc3f88ec31fef4b8c00722a34dfd0216b0f8c685ac266bbef4fff79c229f156025558b007ef0c98354bdc1a249f735aa7ed3c3f3aec6ef8112a7c06755ecc3a12bc6dd544458443e3f9c12583c12b872b3459baac3c16107fbcaaddc26ebca9b649c86645d93cdb81c455fe8d5d73f26b5cb5c237c8834fdf1ae0a97643621af102e8df1793d574ce9260cbc75c12a5776c4c2b99da16f6748719f9c4c68984cd99b4ee250951207e3a7aec247be86c72053c9b6b8bc3e3a6de2c62faaa2eb9c1c8fbe58638b9f4effd134c064472c0d9b8c2c9fa398eabdae1cb6990f4d3d5c0da5ea15b3deb56b11f61511150c26068388f69082d18aac41cd338aa39e561a35cec048bdcbfaee1a6ac7e871036c29a8b51efd78a75b495549b74506ba53ba601e28d768ac5900fad99313c23843e76e294ce8443bc825e7e7cb04eb9ccbced3a821fd6d2d10cfae236465428c2d7bf7736b9b4667048a6c10d176ab3ed4856c129dc95cc70848ce00d6e7db3381a4330d391de2c8bc612dca5b3d28c1b125382b9804be14c32f02952d66a4085e5ec9c031ab6023ba3e11c87cf3bd9f6c6d5cac9dc48958eac422da20a97d81d724924531927aa714b822bc7df4745ca4cede2609a1e35f2413d8bea6dfc2223cdbb327130d6de629fc2b8f247d116b634724086e83e6b4175ccc4bb7eaf1725f33de02b80888cd9735ceaead8044e34a1244e25603f9041b456a16e98ed954362f32b26e3e093e20441be02c06a8dc2e324d652598650e8aa324cf0706aacaa82fedb532a981be4b52088534459205255404cca9584e20f0c717d159894757e30097cc7c1a4210df806931a106417068a54be69d413378e03b156546c8992524284b5ba662985d10a26692607c9c2c4f1ab95ee5da48e891263167ee76ab528acc483ab95863152bf5bad4c9591cad156ab4f715eb5400d69b512e401e4b46d22be8a28dfb512bf99a442ad95fc19a953b95ad1a79152786a75c55a068341ad34312669d1b4d27e237533214f3c6d3e916a15ef182936aad5b772287b51adc230d62014aa95be17e119a856b4f918ea7f6a458aae4c93aad5dd2f0c78e439d9514818a75a1db3cf8667aa95865b203b94cf9d3c9e37e48236c7e4130d98892bbeb3f92f1c6018f66dbf2362e4f3829afb670761ed56974c62fae4cd671554421307d2dd131b413798b2d7241db0d91118a45d04d855dee12f0ed8237b7229f76f9b429f83707bd46467a1e8bfe41393f17921b03b6f58a693637c7be1e44491662a21085b3cf2a448c0bf27ceaec80858786207c01241357d1da4acf221c676747462722549fe1aa41210aea4502cd734728095e808905b495fde004fcb1170bc92fe3647f73e1de6f25d41e1fd8c8308065849c69ca06864a86860257d28014653218060257d32023c293549e54280c9120404aca4ff7e00170e08f05a491f75005bc207f85a493f9e003b7f0f80b5927e96007f7a0f90b5927e1b014eea1e4096597d090196e01e602db3faf3012cae3dc0ee4afadb0160d06fa646ee9f716256d12251625654e7fcc4ac42884913b35a8ddd7d9534b0af8e7a56eb0933cfef33460c203b6407c02ab3caa2cf2d3418566615ac048862a6c5b756924207186a9816f7aea41e8402d4702694ad6116fe7f9574369026667555a697985554413c312b2a19ef57490d6e6a1a809d72528279f038a8be1d367230ef53ea67f0e0ebbe97d567ae898528e403251d781f5ca9fea6559dd581ed038e1b9aad8b7157e1060530ced82b81bd97d06cdfb49cc831a2b674ec179c6994d267f53202cc4661cb75d9cd4de880310d260e5a7f9c180c95c2da16862b41253b6543fca9a7c8ff7059dbaec0c896e1c2eab0b382a8c35adcce4d8b8b223fb1ca4e71d541e195dd9021ac0c2457e1408324450c0faa2647347f598c5cf65871e1782d0c68582716117cd9b3219cfed048ac192a312ad91215ea1dddb67150a1dacb0749d55c54f8a1881fbcd6bf17847a0f22e7b469539ff2a6dbbc04e7a1e0c0e63168441beffc11d63cf1d4058585ef023e187aee2d37f183cc0b26355c859c17599ae018c7773807ba93b14cca2499c8bc8c1e5f99e698c0fc268fc944deac967fb3addafba9b19597f57eb128f9da710f6a8d8d4480ee5c4957b3373d944293fdb16a55fcacb490d19b74dd4a29f9265b587881721210ea3a8281ac94be341ea948c6d28b2700ca36f38b8ea730ef7e24cd0c8925f0f70fd7a994c794ff1f95e445850b55e88330d2b2250bdd954f975934c550bc1adeacda19c73dbe8ab87aeef2616a9b45a583735088c5532c2bcb6af235e213c67a9ba5b7820001c1f0739b005d3044748067794e365ebf1924d36d8e57565306fae7c1869055a8dfd48d34e48b119a1fbe7547dac3bd256b2a4a7798e6ef90e30f0db2250062af8fe4fbb107b92bdfcb6055c28047918d81a892d54fc3d2912c996d57a484c79a4d88db05684a27be658d7a90c4fd767973c01d18f780837e2d4f0726b611b0b2852114a2a7c87eb7a5958f5491e559b5cfcafad7f4782cab6371dd378d7dd8b362f1abd875d3c58b846e9a977603a3ecaff2003d8f0400903467f26e9296a37df1aea8494a3fa5913c1dbc36a73e2c383c1d3751d0f6ea0a7e7b420b48d4ef1327591d45df669bbf7ae0e8dbcefefc2334cf300f5e1f2520bbd0a730f484f4d2907ff320a4f569a5de70503131f14d9a4554aa4b7afec590dd1b05477aaf64fea36d28d5962d31517c566b564be7e36e7201e4df195ba8add8598cad82a75aeff22ee7888829d6ec088fff38b55c58a2f0ab5c10b8b3525e3d4b1e26e9cb701cf166721788cb155c1531e1100a6a33a86ec76b9f10f2f4f27001857077ab10e8686022582b3cce7ccd48b1b4dbad6a219d1c5e9ec991a3c44a44dea58848d510bf10afd871cac3ad7668c2bac543f230d62b20cdd75c04266a2555c74d18bb321a93b2cf2c3dbbe869adf28bc5ba6923c6a4e2e2cdb3512826c2bb31f17e5e63eb1611172d59a34cddb1e2ee09ffac505ae9166afac41bcf6be664f08792e4757c6155c89248723c8fbf40314c6ae09bef63b2c46a76832ded8a639e16d0d4d03a11dfec22690805a13a5bbb37c7638cf934323ad7096f2419fac7c9ca7a905d4ea6c6f3ed38b22ace8a106a6c733ce58d1c4553f279411f0cf9972e35a48baec55d24cac87c5f1b77f7329216874ad4ed4c75058f204684482b42fff8cb38781d5bfb0c2327a80f4352b8c25ccf2cf8cad9322244e16ec4507e59cf67f459a987fc1642b9113e9901bd3e90994f1786746433b889a8db63b0d2d419625fb1cc42336e97bffbf72d466225e6347da96345d66b2f410fb3f8535a89ca61ae2ac819c2d58fd5a2120efbe4c4639e076c501eb7362d59462ded4405e3d6d56af3989eb23bb1bf816ad5b941f67c85c60871d6ad078d05d40ade0d575a6e17c779345a12338bfb9790cdde60141aa39edc125ed0dce46e008766ff2a2f58be49819c05d3c3fb22aa34d9ec60d0ab0b0631e005cb625583e5af174cefd8649b6b5c79eceaae94013c3ef0f6a593f5d57bf1c8e71a7d2314bd5b68fd95d8c8f016ca3cb75ba6ff0d0ee1dd8840fd3d8801daca7b268e0fe0f2cd58bc24f7293b6d83eab70445a452bda4041d6f6822f3a36073d05f63cbf16d5a3ee0e21f195f19cb0ca05916e1941953df97c222cde9634a2149b0d4a73adb4ad79cd1113505aa253ce7f30a9e42d37984cd0e54e286d3bb959f0a2ef63ec0610f9a216ea751504ea7e0e468abd93aa8c487977482ced5ddae16bd4ed3c3224f60ce034b18db53d030d54668af72f59586b638bd484537fdceb58728bab201f092b5c22e25975ef53960501228e2c51782925ae0248a0a5f95141ae288a7c004973ff100d450c285de9848cbd24a6cd898086c3175e498f01f0b56148f09250403726c96a38d14e611d22dc8435bee90685f4cccf59760913cb66d1054b43972082373242e42bdecc643bf76f03725c7e210b6e951c5484ac0790fae98a854549021ba6348aea59e67cb6f898c7828f8fad9bd3d6de2a9547b833c1f6f68e64a87e47c7a5f9d8b0926bd909abc27b59fe2f7fbd42c7a3b8aebcd0c7c907099a1bb4af46ccc5fdf3a9cc09930b6fab39ce549450b9ba7e84fb8ca6546bd1c7a72d6c8daf094522a38e349a7372f61e70577de8ad24b5ba4c79bb18230637d276f2fd53d4e2058b083c348a8f55df5ec078ec53c4e141fe9c7309612a137bb62b2e753313f5094981c860e0f10395e5311b460dae31b188f13f7abb39df76f748852f1a337e049fbc6f4d7e3e66d005f5208120931c07dce29e9a051c85d65825226881614aea76444b2e09b76a7ac4e8b9b61c472d62034e765d1c80d9289644d8b64c227bd474a8904d52471af8a3d2a1093440a0ac725f828b8868447999040a030c8ba7373e8383193804549c03eb0feb68dd8c7a3bfdd3fd1878b04774ded80c0c00e52515947f3acddc2a08a0e23c1a897c2e57d248fc86056b1a0a3d12d11d8c492d37f57ff31f3d8230ff441e0c0b475883db19117b7046178cbf6251c0b22dab56581454e98173a8481fbef68a2ede3afb8e0c1314dc1d038569c3cf50141a26b0e2e265b880af3b554fa91db643ccc86f70dc752347ddbb4d8fad141f0d8c0d8772c23a1bfd3b18e8f3ed8f10bcb7bc052d631d0648a09fa5821f17b8143df1a6791712c41160f6af14d40df679a81637a8c5d7472da4b4e2d61c724964ed0477521edf333150212795c341ee31e617cbbcccb8d5ad4213c9256ff8084fd547460c5f99cc8210d316b023cc19b630a734b017c09e80609464f0bdb442aea6e0b9eefb489548c5a582d1513695b08231b527e673f97c3f3eb2ca272e1610225e9b7612e8b5ee2e27705b7109cf14f6ad8cb7e88892b5c470532419048ab2a88ec33b7330381fb12318790b560ec720d59510f71a5a53a93e01f1754d7416d2a5fec336fde80aca50a05859f0f74da8470bda7e0bee88dd946844bea112d11da82cb83602c10c515e384709604e739cc8500b93b9e8f7c3c0faa0f3456ee86a8aa3fe3cc7cef5f80c0cb6846fa4fbdfb649eff15661ce4e2d9635c3221d7eab8b538f79b09ed0b5414eed1ae0da1598faf631cf98922733fbe86de4baa972dfcbb908f6bb14fadd2d7f2fdce28049200bb1bf7a8097409d1f77146b012564c33079cf9033fc60763764310fb9c5e80d9983b4c64baae31be209b58164413dcada85c0ddaa314f4150bd1c42ea99d5539c1c4f40c706c795a700c3d289e270422c79b1086fcc5df3a3856f04b85115d38d2e04eadffe95f273bec714e2c011c6eafd09247fef4bea67cb66e0f1c43c0b15cc0d76f97d92adaaea339e44e3d6b3f8b30022d4ac2cdcbdc54e272a50e853b83d5e427644eb901649a042e2f44b20d54107066351d800341213804af51aa801208e32914855229a72804c1711e0d2e61ed8436b15b4ab22de5f65fba91b4bbc94d986ee9f081874b267c7e5fb5a5756afcb632d029e8546022fcd0f83a26e65ab4de64a7360f380c1c0de20fbd117df093849f29b6e4f7bcd17dfc49f263eca2cd1bce3265522dcd607933ae3ea238797818b55a237834824dba15d0dd39dd7153baf3d1b3e62da70ece2f8a93d4e96eef8e8b82337e190d5d9c8f7d26295dfe2249b3588e1ed6d216d94cd0dd47ba2b6de96e1cbae37afcbeec4ed1a7dbec4595de19769b3d7c7a8774c0188c870e1d3d7cc4660c06448720030079c4e68f1e3d401d80c08080af2304127b1f3b7a04993a60c6e5d5b9dd2dd45de902f87a302aeef078783b58f8730da6d3834710f007000b0730001e3f40f077b0460b7ab07296a9ac7633a6b2bf3a567627a8733f146909d3f9d1ce74f2b5b0d9dd32babbee8ed1dd32f44c77cb74774c77c37437aabb5f5ea6d0e8aee49da94862fff2fc6474b771d12d4e9e1add6d5374774d775b13cdc37d5c6977c3e83ed9d832be5e68471df08db6eeb6263bdd3d4377dbaabbeb8b2ec41fe6a158da197695639af2a30f2bf537b2e3df173969b84bb0eeb6e96ee31a5f2f8fb16bef7dafd3c3afb7cc7fbd5a9a67ae3fbe488ed4339d37bbacd29ce7786dcc67e9d4dd3574d748dd4dd35d3bd1dd342bc6ee1b59af650a4e7282f87ae01bbd68f3ea8017eb805614a74eedce0ba36277bb7497bafbc499babb44002958b8c0050580a941050a150c7cf024680935188a11c10715664422291c2904a9328386f2c0c0c4163fa2039c800992a302c18e2a33687880c791b807070210211d31029411601a2045a6a94489e26a0ee6015374dbb6335384112577c98952f2cd717a4746c651322f302687294931b98c6f3845a07c2ba166a044c14182003b9cc3e04841da76384782003b3f987cc68738198fc1e99d9919878971a46d07468a0c4a8a8ccff88653048c6fa8cd8b8871199cde8189c199b9f1e204701571fe44ade42e335262dc0547ca8c23e13b30becde444e17cf32d474a1146700e931385938284efcc38070308ce67708a3082f3989c289c977e18e2bc34038383b4edc0380a0769db41790c8e142408b003e348db4e8ccbe0dcf8c1e4330e04e732ee822305c504cace4c4e11510cc5f8e645c0384e1131be790f9c0b4eefc0e0e02011c5b6f385eb25a7e8895ac99fa899dce4dc8d1f4c4125df600499dc4f50361717149ddc94d32e28dc660099369d505216a080ade425d3e60299deb6a2cd4dcee16c3026938948c961fc05657a8131712f2f309c6f30a89c22ce64329938cef48468330014d78b0f2677796254ca1cd19313777a823ae564ce005050ce9d8a4e394425df5038452f272ff9e652c8949c3bc178fb707ecac1b9d9e42e39462577f1138e131b57918bb72b26c7c913178c97709cd8b85c7232e782f10d8691cd85e25c303944262742e53879e27ac9e1dcc585e35c45ed1dc35572d456ba01aa7b67c3414232494142c20605ec94709088c209015c4898a42045e18400aecd9130e544e184002ece9b8a8b632283e2803c796244c939376273938b3f9182e43ba721183fb911288ff1ce798284ef9c729e18e1e2313948bec3394c8e11a81c24dfd98c70d9fc94c379bb112e5b95b161013644b9f902c5a94e6e0303b64d0817db16ba9294238ee00ac021a1539b73311c12623ce6e60b27578ccba0bed0c5784c4e4c0c872587c372a385cd63884c515c31be798c0b8e09c9940491498aabe49c9b904c51601481c9312561427a9942c965b62ebae862ebe2a68b2851a8a0a28b2953bab8e9627369d1420515446ebad8b64d054b74443578134e4c8181e2742382ae51eeee2e45c90afdd22fa617d32aca0a89151211ca944429d5a6244c4c2075442629b6dea294548dea128e290994140d40828b23b2bc6871712f39a2b8bab435d72e2eed27180540394cabb6a8c690230a0c220d8383c2e1b44099a234a02b39920d0e4b49d59eb2c2844a59c101d9bc9d2855c5d539375ee84ebe715abc683955114247b449b9094257641b22e2380f924207c565bae1e3e22f4e6c378a70ae17df9cf84aa99294520ac9758a92a523eaa4cd65db729e389d4c505ccea54aa9552945b472955c2bd429ca4d968e0865c5490a0c74513a2d3a84d075900ca3630adde67af1514a959c8bde5c5a4a3f5c72885a0b14aaeb6c6cdc75f8682e4ea753149729474b7321840ea565089d1657898b192d5c6871e5cc68a9428bab8483abb4a1b4cca009974c8cd28c53957c0be98242a15059665110b76df36deb98d83627b6263ad031d135f1f282738a42d45b8e7acb4ce4b09480b8c0f8064513ae2d36284a279fa1524a9576d09ddca506e9a5344325277440f795522517a2942a6d2eae44e5880312850372f2d2290a1514165412d1cc0c9528418204091224488d248e83d142c94ba51b2a74250ecb1525202f59945425d722cb165ab878f1224a2fe12a212d51da3121e1e0da1a07242e07290b0724498babe43741e8362ff58c125c154a5b89e360385329e70859b2dc4081e3361f1c81c50747f4c007475001a493e10bb88201493180f8cd0eba195ee38e330367a689192a34b849896e2d112343a6460ca7e1260af40e319cdb5054361714150e08aa0aa7e2505c0d1c193132dce4362e23c365626464c8c839b5aae433b2a0aa7040382dadea969191c32575aa94a5779462702e19385c5277ca1443864c8d19a6d229c7e6031d0c279a69829b99320345a924030d8d93175769c6899929a514374385060e11a704171a7088562e6eca35d1f84c13251ae77cc6899929353433546c9b8dcd56ba1142131f25a7d2415895525c1057c955723591b9f94127d340e84a7e3ad580b273c36b7ce886d7d4f88d9c52ce500d7ec36fe43cb9e135e440d98911c4c5d5f80d270ae22272259628fd80e1363887aa12a4f42386732ea487265036e0d0f806e3c589669a082204460e0e37706e94fcc66bf01a9c1ba59c1b3fd4f80d5f5283dff80dafa901e7064e0d0eaa03a514876aa294e2504c348b3351096252820372c339140ac5255141d5e050e92188063a0ed5440dcf28d70c9ca33a40830de71cc50467e3338ed240ef60e3dc4c13311e84064e0d1b35bce434d000a3060d354a35336c6cd030d3c44c13346c6cd030438d19336ad8d8a081069b276a7c861aa7513323088d49868c1c27db174432706e36d0999ca673184e8303c5558281e2808bd31203e35c16130e1cd79d6c6040e686085dc965ba534e11510cb9b80c5ec4c963382aa7081797c1512eb3ddf8e1e4311c8893c7c801c2c5517873c538e785290ab7a5591c91f3a0e3b6e4984c318e42c5981cc6e42893f7c0714938a59713924ce3406493749ac198999999999999114d45332e830c3ee325199443d9e1bc3920308ef2211847c170a59ca11a8771989c2730507664500e5345e9c7e944c34f369cc64d584c3549382fbe790f2513161a3438262ca55416a6241a3082a4dcf4a0231224a5c669f01aaff1225039373847b98ddb7829a708989c1b5cce8d1f6c1ce54b6c50bea4a6c66b72aa205243a5943a79a9868a669dba2494141c10183f75326460a9a1a2c4838ea84b72956aa8e080c0c040e254279f314326a76b9260207139449c16a28ec60c381c0c2233b84c0ce7445d928cbfbcd4e0a0b84a3568b80c0def819b0187064c0d0c4e4d0e87855395905c307c860c2213961957378303c363e06c527236a42d4a2945840e95e43293d4753636251848441b0c24170c120c2418a49a18278241828144844a4225698182794125a1925e3822744435495d854a475493942404ee492ea54e47262c594a3f4a2f38642975326551fac17992ebb4856b564a9d5ec452eaf4522a954a3754e85e9c7bd9904aa9d316a5943a71a746fd50da41e5a06e96d06d2520286f189c99920af5827323848e0806e925c70585eaba524d92094be9c78b277157b8883a534c151d110c120c52e947124cc04c29fdb8513ac12011c174000669862be1dc044186a8b3eca043d9c092e43a113d918253a14e5e93a445894694d28f1b2514514d92ebe42f2527e272505b14ee74229a71895b6c4a314694a0702f375e70c1c201d976fa250ba7dafc458b6bcbd22e3336924e377eb0e1337cc8c68c9c214ee6b4256d7e4384cec4040c93121ae8367ff19817295164948b468d6fce6591512e1aba35e31c127a871abe350744c696a384ab0667062fe1b8b868c031426d6e6363b2e1b628a54edca97b4bab4ece995c3538dc169da281638472cd90c365e9d4c965e048e1b4f48e9333c088283b325c869b0187cb42038e11ca6593c369d1a993cb986c70382d9a753a39e784d639cd701a384f20a17666784d0e97e5c42535cb756384ee0443061964f0120e1187e566035dc94f1d0c37c580812ac12002c329c1c58812941826981cc898fc460859e8665cdecde1cc70eed29dcbe42ab96e6ad0b58b977eb8985c870fa219213139352e1797e92587339db65045072f53925ea8c821e29236e71cca8ecb9673e30793733e64722ee74914a61cd4d08c9bdc94f3c4e4333736e8aed0716e9a223345e947bb0c14ae928c14a617177fc11284d34946464606e766039d8b13bd547932e5e43138505cdbcba94f2f59e0bc5c514abd6039bd54e19270701002e71ce72693e948e987c94d28940b8753729d70da7583838e68e626075ab8e478079552dc02b498895995bc942afd184311ae1b24742eee330e65e7e59473e307199ff121199fc97912c5c99fe40ce53c91c981b263c2d2b938e735a5944b4ee73720e860728c702eeee2f2e28293e374429d4e279759a9861908ba6be29ce370724431f550fae1d26466e448e9e5a4a3072fb970701fedada53443812b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb972e5ca952b57ae5cb9c1e2068b1b2c6eb0b8c1e2068b1b2c6eb0b8c1e2068b1b2c8e707385152b56ac58b162c58a152b56ac58b162c58a152b56ac58b162c58a152b56ac5829c97407dd10a16b6f1e6a24b938992a64a8c850d12cce6f88d0d9b8d14129c60c2a382031a890498a219314432629864c528c18fe22f3f2f2f2528a913423890a0e08979494258b16a21949584e319238153723892846928b93499a91342329694612a7e272886624b938ef1a495b89c31283ae944394616e3cb0422ac116979b1874442287e5a60339a2705b38184ee3e28292e19b0c2f2f3164a0b8c0e1b6f8c9a55d2ea6929f648081d3a1545b3614ca73a06670b69c19207439a2a8c68072140704c66de0c4c00092b9f141f7e2a6ada41a831125282e9c4b0e641a48d70512175818508593c941c5c8109313e328183ec4b86662fc0546015e4c4a2cc1449f4e2e3088ccc89c4e2ea7189d0c9a538cee743a9d6464e0d0c4f02e46c965885921f112835482412406c6f4836e85544a41e1c28a18d38c69850417e3a7182019574c4e0c8e8b8be3a2f423c60b33ce6d51fa3133136306870aaecd61b4e0dadac509aecd5f38174785ac5c7fac4df2f51a0206d8bc5fc5d2a8d2577e1cfea5f8c3577e1c560b7bd5c019d2b04ef0953195e54a5f6f345fbc7f1f885aa6e2ccd72229027fc653ed63d6b5e4bcb48e072de4bc34b779f2e8de7ee0210abe5eede6fa3ae41c75fe6f86e9e06a6946ddfda952e4bcb45ab65a405ff8347baf857da618f64cc4abe4c13aa928e2d28a25595e10c7e8d1dd0e170c08a9811027bce51b1072d4dd13c0e9070889d13895c6789ad6ed6044eff076b0c46a2f35aa3fc3d3c8acd502e9fd70be1191ce2248c297d53954bf680e3dbe1ff6d4c2a7b5705625b9be906b004b188010fd0abfacbdc06b637f3f16d6c741800c89e2e4a985f3938ce0d12bac8f811ca1035265e5afcfb6a6bad34105edad6b635eadce97cd8c1de320823aa6abf0a7e779ffe3d1a3fcdcb3d9bf888a347f9a7b31ebe38fd7c62af5a739ae0ffef58ced288a4f733c7d754beb7f671eed8dd118cdb6867ffd8de64c145dee39161d9796666bd191d2c3bf1f525c2d8884a709febeda9fafd26c2daaa563eaa1c72c129e26ee367b8f7b2a519c9ea7e31db84c79f824f9b04bf18f34bb77e9245df57d1efe2ae531eb3f74e0e13cbe688a30ff59ed7d700f93f366f7a73f1bc29fa738ceeab376df8848f7fc5b95fc2deb0b857f3f8bb4c88bb05995bc08a33ed9fe549af1f7d4323912b97606d6f949b2ad75f2e070ee544b33697f421bab948575741461048f583a72e898d101828e0eba4b32e81cc1d7cb475f299d31b7f98848778f2296514cb35822c1f7e90be1fcb23b876a319aed0f6e27ddad43771e108d133e3845f26fed0e858fadc813f684aef0b35d12be8f87316c52a3397b987fb6469ec572c63efc4ac7fbf943c7a4f8b31fe9256bb094c51efeb5197b77c6dc62c7eec92ab532ebf8b35de21e8e4c3d467d35c37326ce32832ef7b0cf9fe139cbf68722f96c97d4c43b89583b848f04c9aabd4c382ed810b4b2c10991e480841c50900313eda9527ef458957277daff18a996e2199e46c6cf3eb59b2b91eede418e1ee47822c712f87a3a16b75ad7be728e592bdb0ae6f001da23932ea932faf78dac5097a33b4856a908a3423356dda9aaf0707dd2563a6fcf0a72e8ee19bca0bb71ba7b04dd1da5bb9417f87af975f02b7c1bbe911d6162aab5d8fdeb8b9e676d8af78d80bcba52479a478ff0ab8c0aa5bcdf88e6f9835d95ce194f6d8a9f045f4f07bc983582473a2378a4e3031604880e1f03d009f23ce6fb781d42203c62417ae8f0c1baff1ac1a36a297ee18875388e747b2bacb4c857def2fbb8bc4f9642d81526094357c8e30a5f001ee86e01dc04804a7777901fdf4f1168c59def9be169e4f3d5f7799d2e4ff5630748c95a4e61eadfe7d36755566b53fc90f523cd4147138927ca2ac5fe342b8ad363762c477a34c798f5547dd153a5bc1c9c478fcf8b66feaecde02c22abb4fe8ce62b5cce86dcc3f4e8597fc94abf276b431f5867c6959622e93c7ab8acd2300c3f0ca7d78e2cf978ee78a18fabf645fea91eac539c3ba9987d2228fe88a0d8c81fdb19cdc7cf549cd5d24cc3707a9d7e6d0cd31a88274c55fba294d77e96e73886e2cf3cd7d28e329b7d7527163f743c67e444e29e3fcef627db9f1761b32a11c9b2878ef783ec4f5895d48eec0d8a892f647f5eafd7ab468aa11d5ff87a3a00a80000aa177e069fc47fa9fb9316c45ea95f9bc137f2e931ebb32cab2f0a0d816ff47a15cda7b55ae19318fc253b45f3993c58edcf7dd8f8e32b3ffecfd6e8b1154171624bda4bbedec85e929c98863648d11da4bb277063047cbd114f1a3863ac6abd7ed1cce25ca2530bc3597b7a642f894b3bd6aaadf3258ab4e873fd31834ff4377cb096b6d6f9aa1dd94b7637b79960daa5698ad084a6294296a629c2154d530424d4f044142df8aae1eb6e2cd2993f7cfdc7ba1a8e74db58adc147773f586d7de55a5a109c35d88416fcf0c696eec6b52f7a554b317efcfaa4be5f742ded158bd91b3aa896e6d7e70945e3ee9ed1dd0d251ae7faf7679576378eba2b8dddf8fa55134972763782669ee1cc3f7637821041c51bdeddafbfd175b59d0d2f1a3fcdb4e4d3d970a2b391447787af6c45dcd920a2bb6f7467e3e5ad901ad94bfacc33f45c92957a3877f0f5583a5807cf3b49911ce92bdb701689967c812f8a16ecee1bbaa3c18a760f7f86a7883dbfd46c8eba3bdf37aa1624c92f86699e18bf0d3d87a0cb2a7d983f59cb5eabd3f125dd5e708ebec37734471c5c88ab8ee688838e9394481f741d77f2e1eb6159a5b3fcba4fd2fc63dba0bb0fd09dcd4c77e3dbc3fbe1e960fdb5e02bacf376b71041749b82d8907457a336bede2cd33b7530695529d2da9f566b87d1fdf002fdabd51ac1a3f0430b56223da15025428e60935c5f084978278d5452249c3be1dc11e92c82f1836029d4ddb3ee686c81818189093f673abe07e13f1b82818189c9f58d887818094f934a5d56e9686fccc3774c3d08094f93fc7f63229d46d3f3d1d7e9f845586943b75874b9f77de1b5e05fbf6ff48ebfcf2735f2f0bd268ab3ac73acfd2cbb48732d9d9c636d66ecf865610973f7a3397af8e13f78f4201d67ad8558b437570b7a09e2ea72afbe1195f9f44a737dec0f734b276d3aa6fe97fa97373ba62e5a0bab328abd96e9b5f492ac998cce7c7a581f7f7d3c41afd443c7d477f86a3d4faf54f630c7e21cafad7e6dec07f7f0f899ba0e3d74d0e1c7fd3cffcadc56a7d92b73fc6389f1f467e2de07f4f95704f44d7f98675c8efeb796c9117f9e20f5fab3ec2b71964e1e3f48c34addd2b28f7bb9b49ef11433be34e62fab74b4e0c3c26bbd526755ab13facc3b83fc3ef930af89d57e9eb2bf32d9f4710f835e292ef3cc421ed617b24323d8249c3b471f561fa070ee643ad223f78d80badbeb8e26d5ed2b52a4b348973ae0a39b63c279347473acce8aeef616129e26ac20243c4d5c5629c60fda1bd4dd01e82e11b1d1bd85217c27be43f81997448ee70eb54c8eef0febee9b6e0e08fda3bb0ed5edc92a25497b43af89b9be48b17b5ea9fb1361bd55801f9f9f242e26dd3d761723020d030313e3e5174518189818950e0be7fa468f411bb22a9da38ea59e87411beae8b43099f32c35040ec2479b71c903030313d3c5f0d1dd1e4871a5371fbdd7298a13f487799de08bb03903f324310d739df44e23ff6a1d573a73b53ca23879bc8f66ebe77f6dec61feedf01c1c7ffe77922c717e98ebfcd1319d0db957044e98e3214c67d92bf5fcd8a7ff7ddafd59fe1913f78a402bc262d65d8e671015a751f5c92f846b7522b1766826a346ac1d0a3f2c45b0fad4c2f95774bd085625a10814fe8360891dd7264d9c2e8a94e6efb4af3e5d56e90c97a45b8c63d6efc3c6b28675fa2afcb09616e6987e7d99df277d622afacff26682f0f39d19fbd3bcce5976ff6b479f654a73b2f4b0be671c7582fe3497555acb4bfafd1c9bdb94eefeba43f13416b6982dcd8553778bddcdb03aac5f044e58a533708eaccf33631dfc4634d3915e327c5bc127f1eb28cb867c6468ba6b300f1f7f321aab96e7737f5c4ef061ee3fcb1eb39eef241d530f62912378f4e5974e5eb814cbb1046388d0dd367417b3822e86ec62e8f7b991bf6c5e9bb1e7faf796a06323ff3eaf74ce405605724ff59e23cf6474cce13390ce6829c7e2acf773a58eff4e11fcd07d025464a1890d3c015f4fa7d5c2d5525c3f1f7dabf51a3fe31aee6050d0edaddab57986758e1ece9dfb46f6f52035baffaf113c0aeb93b8c4a4bde158e2bfa16867f8ef2cd726f8e12b83f466fcf725ceb2d2d7d11c5fe4081ebd3ecf902c8f869850fcf50b003e295404fe8c474747871ee0f40102d1d9c163ea00d203f411f6e8e123888e07c2fa3c6fc6b012ebe05cda22f067a04ea6b2568ba4337ced2c97f395af25c912b37e9c37d66afd48732def4b17daaf8d5d191ddd563fa2034fc02f82b57ce5c7dd6def13e135987f488d68e8367b26c7cf797677f72904ddfdd3dd8bd88daf773f539d07a988ff5ad0003e4644718219dbf195e7ebd2d249019eace5972582e2d7cb26c63fbe8ee698eb5392827fef87f5f1b5456a775290c6be3eacbb89bc8ee678df88ca6e77f7f4081e75370ffeb0bb77321da9f8ea6e17fe8f75770f04c85f04d2dcdd43707e8c679ec9e8d35ef77534c7eee621a4afdafdd249770be91d5ab82aa996e2fb4b1e462f8861a51039d229f21cd1b03e49baf20bdd17c33a8dbc102e45f29642612d639fa45a9a4bf08f88d4ca1d59a5a1688d7c9e34d3ea23ab73061e11b9f65e2249c2fa20fe9e4a65f402ddf9228fac526c459ef033f920e8c25f3af924f54920f16b9d331edaff90e33592c1793f86ebbc438fab25f127a9dd2f7f083f5f4b7e3c7af80e41ca2068d08180090f6f87c783f5e204f10cfaa1030f234354292123d8640850abd56a8de0d1b5f71219c12641cad0e703f4033a3c90e401a41e42085fadb258e29a9831f51cbe077878a0460770d001b17b08215621ad962ca7cdab3b6d073c0e8c8103528034cfd1e672d69f0d71c0080e040d21c42a0821bc3a853850da00141b68d2dea7f255e8f319cd5919fac376f84471f27c1ba8a1812d3d84102b1768e0eba9811a98d802131d58e13963e24806ba30820c0865a03100457b5606b397ac6f54ef1b59992371af26c228c696f49f655cdafbb23a43552eadcd1ecebf9ef2d21bffd6445c5a8a69f58711c1c0033a0c34e99e4e9260e006064cdd3d84102b3c69ae0b30e10253f41042e472d22e90800bfc2cb1a58710c27b7c5673a47d1dadc59316ba96c8c1122358e248af42ea4108e189e2046d7d7dd1ccdfcce10ceb5c8286ce0255ba8710621584102e0b4cc002b8bb957467011b2a60c5104278487d1584105e2ead87d7fa2af44933f5556dd6c2f7e93330cf31f40a90dd8d597f2b6024d7c715e8308e8e0254bcf0f35ff21bea2870d4f4fb7c880241dddeb5310a787b147851428aee8e59af4d9adbbac293a6c4874b3ccb943aa63bba53c2bbbd5a9da35b3bd44d204b7b0f4e008a090c757f2c56c2c049628f592f02a7e8139373763fc83d95acd25cdaeb36749bbdf768caeddf9f0d75b74d7713587577507712c8c2535df2887a32ef53feb3a1214386a852438688e2e469b586e09a90e3e94342848c6093e7d1a3cc74a447866021477667889023bb93f1874c92a8411260123f10d802010f40c00210e8a183c04c777bd673fc68718e176b628827ad9623db9ac33115cb18c62eefc339da0a7afe59c6d452d8677fbc9a284e9aef24af7d911c6578fc6698ba579717fe4a9cfe009cee06eace01561c80030790ed3dad26e63bebbc2fab56745b9374f70fdd215d00a9eceea2ee9062904a0d80a201430de8babdc77306de9244c2d364c5fa6cc7bf2caf3691780dcc45985ecff3615e9b238df97cb54a96bef2907000123f90481dd1832352d0ddb0ee8e3822a50bdd0d7627c502527ca4d4d0dd4dba63800eba7ba83b06901d037c58c016cf6b936cb1bcffd824ebb33c1e3d62d65ddefa3e6779a91d4d6cf64fa5f2bc94af523c9a7cfe301745cac43d9c8fbef565fc6158a7c72c39413cbde2ff55f8b52cf17fccaf8d7de367fafa8f7d31fbe10f53ff2f12de49bb16fb0218d02d00c90286747792ee14b0457bf8fb90f034f99ce5618a84a789c7ec4c56da3bcb3e41904e51b4f98888028c1490f266209dd197d579a7ecafe3d26b36fbf422ec8aa282281880324577b3ba8b42bb7b4977516674b717565f21e169d2fa3e6779d9da2448bcf57dcef25433cf592a36b1d0105590d25741ca949087d5e6984bfb23cda2b5b017a637cf232da3c596d147b48cae62092da3655a46f368197d04080d1c8eb36d465459552107dd1591d4b53a63311afa0cff6beddaf1c769450be2d26b30ff6beb9643f796a366cc79868f29f84cba3755f796da0240831e9e5069b22cb25644d26d84d63d4935bedeebe9cd09e0e2e9cde3fc9bb13fbdb97bc3b109600b80c9012624d3024c504c46984a5997001b9dee36d25d00223480aff779caa8d1acaa1411473c979688547713f152fba29664b3afbc35da1bab51d1ddb45a086a11f0969dd17c85af97c919ce570d3cc2e2884a9e33daab4ef088088d0a2f0f874fcbdddec2a288319e22cffda07b89140111194a52cb4646f47ef8c25314e70bcfd70ccc1306623aea80988e47dd953d5867067eae657a27a9e3795e7f3c5f247d87f0efcb64f4e637a2b87eec439f65aa2b53ddde42fd404a151828d0a091c680d4dd4d33c593190c0f2b8200b1c1f2c50d9e69e3ebe197acd2abf3a5930f5fe01b75a99666bb9400878b8e0b134f56eda5f98f56c83d0c2bf10cacf3eeb82841c91204adc75ee1e3d2064e86890baad40b539cee0da77bf32e5e8072693f53b7d857199706e8de00d0bdd9b0dd746f35740145778574f787b6fea5fd0f086ea562a5feb0eaa1ad2e83cec9146f5e1bfb5aadf02b0de843fbf309e16a29acf0d9d2dd220c46eb86640322a75af02fe9a19de51fbd06db3250e204d0bd5de9ee21ba236b3a0b58580290eecec21ed13a03db8d2e6458509510131f3b0f423ca4a3b7f014613397634d0dcad6deaed6cc8c58c629ba7b06e6397ac651371bdd1b0ddd9b4df756a37b9ba17ba3d1bdd56c32ba379aeeadebde62746f32746f30bab799ee4d6683e9de50dddb4bf7e6d2bd9d36ae7b2b756f5b7fd1dd63e86e3174b717dd1d86ee0643777fc10bdddd85ee3675218641c4d2dfe734039df844f8b8d54a42ca37f30c5faffcf8eb360280ee8aa8b4f7b794556a79788a96e8199edd423a9c3f73b207d01535be1eae4af21caf2d42fba389c4c39e692d3dd52a958ad91cdc8738419fd73af6faa41dfac1e2b43f31a05c02e1a7d7669ffb950694ed4fa596fc910ed1ec91a38924fc6bf38495988a349742374ff2935425a150c6f648c6654ff8341b5622310fc46ebe073e4713493d72349178d5d2f0bd267ab63fee79e47f38165d4bcb5f75783a3c1e462f14fe387fdc0bebea71f853087bb5ee628bc810d08f7b35b15afc7d3e1d3f2e71edce0f2996552b4eff3ec72b1c8bd90fe7cdf8470be672c7bdef2bed018a701f3244c8ccb3c75737c8574384b45a31f185848c7426444e24ce83ffb559c8dd13e0ad96fb8b941c2d68ebf77d44fc06f7aacd5824c779f4feb35c624c1d675a4b1767b619d7320d69e984e6fa14a4b15889abcf1b51d145fefbf06219fe0c14922d2132bf071781f6c8ccb3e7d60f7d669e3dafee758517145e56ac56defafc17ac36dd9dbaa1c6eceee5a36b5ff4122768c56e09b40310f084ce6b048f5aad6ac7d182affbf4de0943400d773cc493ee577e6c44c5f922ff8b445146f18ed70bcf17d8322104d0e5080b9fde8c613a412c0173da6862ecf4c065e90ea95d725f14278f4552cb54a45949cf0836e119c126414744e62d5df3962e215710b6b1ea2384a5bbaf1ca1bbb1e8ee2b806084eeb652842add4d842174d72ebe59a746ba78c407ebe4a9f6a7565d07b0e9c6c100ddbd1d40064679b05a808205aad0dddb1411982068c60cac00d2dd1b012a100490120ef04015ddbd41c00a0050dd9310147477e90811024401023820e085eee6684ca00a1632c0441556badb650317d8b25dd11a430fddbd69d105059e7891012800e96e1307be170dcc8040d484eedeae80f1d881101170b2846e5c7b1f8460cc3c4377eed42449b6e2fcdb0d44c7640adabc3c76783a5895662f6c86e78c8912d967781a316d32587413e1a43d904577c7ba5bd28489a93dd0edcf922aa1053dd7f7960ddddd80ee66d2dd4f04c00f2df812024c07a1bb4d40e816c5f24714278f0e0d8c18c8d8ce7aa340b5747be243774349b4cb16c057b58cb991fda985f367d3adcccbde6eccda4bba7b6d8a7fb726422ee8849ad03d679e3d9d900fdd5de9944dc745778e33b03ecc6b79bdb435df61c887f8d11c439f57922a49729004a9bb55a9e9d8c8552977cf3fcf9166fc6e731257921949ba083f04e9c6e2a4b97ee9e4b1d77f5a7e980f092dbd1f349623ad1489900b564a84ee7e7517a44477ebe82e280b0d561b0e91e3cc38ba0bfafa06f50479bbafbcf5aa95b0560b2be92eada0bb11d01d900ea02b0065d101c90048054014f0167e2a8a936645f163bef216be31f7d2d62f9b24397fd6fad102e3eb7d68ab0ecf070f4f070b16b29ede8caf87040ced79d6bee8958fbeb65a488a80448af696e7e9aa55ed8b52cd6da0bbbf3b2441bafb024b74ab523c96ec58a263c9081ed119f45fa45aea614cd20c4e72a4fe5424c7f934cf25cc57df57ad87e458c2bc965fe62b2be4de47d26cb1381d3f154972fa7dfa335cfad3fcc14a71b63ffe7d9fefa0cac177f01c9e83ffc75e34e53c3849f32bbfb8838aa439058a137cf1e09e5fbcb688ebe8f85f5b6574957179bfef73cf7f96a9d760be529134bbad290f9f088a5935f14e918eb5bcac5ced8d7d3f9fcfece31e2e417182532c657feb574bd22cced9cc30eb36fbf71f7b7d46dfe797626b73489a2f35caf1cf25395af01327d097a9588efe1f7397fb00c0c6aacf0fed69ff63848702d0a0004bb4633164a85b9c3853b1c47f49ebe41c5f31cf88d6c4cf93863f8ef4fb1cd7e93f5ad0e622ee65f0efb520ce437c471349ab158457fca23fec431afea519cf23eeb9ab7c55cbb496e368c154f84734e62b8a695fc4da2125d9fee0d0274f0a5a8c5df627fc24d9fe74d1dd39baeb9942ed7d087b42b0ce12631f71663b8479f45012b3f606656c8dfc486fd0cb6650b6a25058ed0e4f488ed7c8b5e18bb089690fed7fc46969123c8fccf034125a1ea10f2d4f7ea190f6e09e0fe9c5e11351bb6f64414c7b669e3de17c23f783f0bf582629ba73bc9f271372bc46669e3dd5d22598878ae47f917cf43faefb8fe72ca8d26c4ff84a92643c8ff02809690fcdfe7c9e59485669aed3e8c54fd283c3f9464027489c8c3d19cf23a1cf0836f9d814aa7f048ba28b8950aea5e5897d9217497a87e695914abafbd45d0f2ae86e55773d207183e7e98ec7c778ce9b8f88fc2df3ac322a84ff86a1ab24127e55f2b2f78978555bc7be9302fa9ce591a5e792f46b551f0f17e2a90f7bd73a0064d000a06de8820d36a0b1e1c8866b430ddd1d035ae5c039f0d10c0a4a017939fc46a6862b6af0410db8061d35bcdcc0e2c6076ec4686ef8d0d8f0c2091b1cb0c143c316342c4143830f5fa0b1f981cd91cd0d3435aa34eec1527d3b82be948b7446abd5c9232805f4b9efc4807a38ebf395b752cec3593c825e3647fa97dc11f47d8c95aad4773e1e419e83eff01c7ce7969f0fe7810757a586f0e8510a69b562f6f585f36fabf5b239a991f3b8f7790e5e98c37fac264eb0c4d5d20b9bb1796dfd988f17d639c3b4d298db5c83d5c831c3173433d080668618ccf03433cca0a165c9e71ffdd8f497dd390361a5907bd562ea93e6d1a0c18486860f355da0a909024d8d12ddbdd3e3397c2eab34e8fb907c1ee439f837630032b2d0c888a2bb659a46860864fc74f7a96964f8d0c8b8c10a342da001010d0d066868461a9bae0add1234dd0368ba9d18588881849aa689b1039a18962606101a19a44023030fbe5aa77d0d45bb6306cef76b634648f01784f3a70a72577da63705f4f9ea5321d9e971d61744fbeadf8f2a7c168b8559a168fd43f2e3397810921b6ef0c05ac3f9656219fb3bc1af565dde101ffe82f09fe55c5a07a9cc8ab259e768c4fafc67437e834771fe7aae12b27c856288fd7fa4e183b4faef78a57dfd9ce591748603d7660debe3af4d1994a0984686264d9d46061ddd5e28838d4703438b07c38aa698d2c060a2bb457068884dd3c00062c88f1649ab3544b37506023309a099b98146e68a0868642a4023b343230323860a9a981178de971fbf66feaaf6f32f9ab9d5fa3c6653be63547daa1db02fbf5005fa52eef37d5f0de673cef09c91d5d23ca783b44ed27dee93e11759a34a6595ca2a8d09a289f15206a3a56960a4e876d1c090210d8ce3681a9496f6b0eaaf1d535eab13c54437100d2a287fcd572e1a54d79ef86077fbd0342f54744fdafdb0962e9a97284dfb18cd4b93f6ae751e2fa86e98671c7507a771a16287d246c154a443342e41de8cc6c506e6299d4c1268c810212607d0987a684c291ad30b0d4785ee66d2345c0568b849c3cd74125f793256b5bea2292580a6a4034de98566eb01cd7644b3e1f0d5fe783c40a4803c9282ace93e5f2ce10b157c1181ee0b295f00f9c2c462a9c4f00031b8bcf8c215bc188217485ee8e0850d2f640843953070200c621870008311c020050c3f80810730b87c61055f08e20b34b60c610b145b685b6ef08210bcc0022fc0bc00c30bdd85157421d68556175e74f1042ec52067a9bebf36e3cf6334e57835441042eead9d1e67798e1c9ce68f51d171a675357ec62d96c7f23eef6801e9f838cb5309c9ac9802fa523e03ef7cecb53b2b157a917504041029a02f6605e0e2acc11cf4fc139a650bf3d50ae3495ecbaa5689b3bc4f258a93c77370203c07175a8914d36a81dcfb767c5e135f9c46b474e2cdbbfabec7655853fefd6885bedcfab29dd15c9572dc12c5077ddcc31f2e45d257f4f396f7bdbe1dcef2cf6336463d633a7d8890fa339a10f097cc6b6dfebfb1d1de98107e71c1052e9a206b19bf382b2de271d1c4662e7070010bb6a2e7d2ae7209e30213cd85a3e742eab790e4a9301dfddad816a6747bdd16a2587bb7d083a70a539326b4854e2787eeb480c5b53065470bb3c62e33722d04e9a6332d5ba61629b440c0bab539a47dfd529c46add6d0ff8dbd685fb380832ce42cec6c81050d6081070b37ae60852b28e10a0fb8428f2d94b0c5115bf4f40dee5ec697621cf77139ffbaeacb9b53fe4694fc2f72b7d96bf78dde558fc5194be13973519caff9a2b52cec79607e5fbd6cdeafd55983917fc9d5cffbb095eafb927e5efffe17d5895f2fc2a67bf5b7e8aca0457b4340404978bc07614aacb084155c560052052ddacb25cc595ef8344661e02d2d3e7a3183f38808158e40051750c1082ae0c852258b07b20865e92960610a495358620a760a35a460450a2590024c0a3851d8a2db1b777adc56b7b8522067b9e3e9b549f3ef0b6b29ce8ccb9e24df8bf6f5556dab45fb9f0ae4d86667b97bdfab4ef0f539cbbd95c42bfda8c6ecf47196f7427e9fb42b718234d35bcaeeec719677ed0ac7fdbc28241105044401480b2fbc1bc431cf3ccf5b23cd0118c0008a3cdb3a87f8be207e9c425a44408b1f2d60a040032818412189b5f7734c555fcaffae9e66c56b9de6e3d54452f57d292f31a6dee7619dffb7c837bd24b85a3cff82988eff37569f087b63afff58486ba238c3214f20bdfc582cef136c54f8b14e0a0b39c18abed40964f8f9c50ff187ee851f3ac126294bbb92a4486ad29d645304d2a2266069c294226ef390ee9af035a107af09364cc072951c49a2e4081398604290f7e1a389e4638277b635c912b27c18c9d144f2fd2cc18af696d04477376d094dba9b2e41c7126e1653b288d2dd338ba06e2f0bf169cc6b5324310d9550a53d8ca9387ef6518212ddedd9ac84991252fd4a8091042ada0b1fe6d78a4f1bffc3247cf4e6af799893a0a35b86842dddedc9c292c8436b656e6b2d631c48a0d29e2ae5a1572468c0e637a20d19e2e3ab212131a0f1b38f10f0978494e7c5f20ea989e21c224e6cc921437c84601131161ddd5eb51e7eb64657a2f0832b2ab842b637946dbdefe1f04e0babf68a91ee6e91c8159bf17dfcef39c2963e8214dd4710bb08a43e1cc13b820b1653747b5eccaea8af7cf5d54471be3e7f6279736961d37f0916140beff6feed57af268a2e4be4f6475be968abeb8a2c5c31c5cb8ff1d74c9978d888e6150cd39e2b1a70858ef6fed25ca963ec5466842c2ef762e2e38795424658c2abcdaf85a1cb083eac70e1857f2979f44ebf0773fdf1f54654f63d58430febfc4bf35f5f4dc72e2b505869d2edd1ac28fa0c3facef78ceacafa65bb9a15b2caff7f8f0b85091201fa77d15af92227cd143f091ddc113fc2545004011ba0a145586aa7044b88208503a2218f13e58895fe1cf6fc563470e0f0ae7675ce9a762d5d04b5bcb60696be1b36a89ebc77cbc4eefaf37d6aa0dcbc7a4873f84150c61034358c010123004030cc1c653a5f07cf9b45a439e03136779aa9d1eff0ae42c0f87f36ff8cef2543b5240cef25ed9da242f7fd80b6114828d1d04a116041c3e1eff592e63f7692e8a1fce71f585ef3303f3dcf97e96ebf4951d720f8f25782958a97740800284cfcb6479338e6a7155e2fd40053f28e20702f001161f28c007a00f6e5891d41e8f8a2705f41511c5c9f378eeb45a93acc170ca3df04e4c633e9eca739d19d3947fad5ca7675b453a45d15ed1ce68a3cdd38a29f6c78a285f14be1541dde3e3e18f876b5fe423758cc3888aef430fb2f84ab33de0a107347890041e4cc103920742ba1d74b1832a7ae5318bf3bbbc0fd7bee85f680734e8400b3a78810e22a0031d74d0e5a08a1c7c0e3a1c24e12005dd5fed7df8bc1552af7d510b7fa69709acc759dfeac3b5f7211ffdcfe7ab2f0614fad0a1cf5b389c9f04d6e32c4f95c2217dd5bea8d5c2b5f7a1d51ac2617df243cfd8824fd6543b789ce5a9667866ec54258af6ce94acd2e918478f8f1b3dec33f8b1d8ab70aaf645b52ace213ba365b17c3d0e52dddd0db2dc8005dd0d8ebabd59a6b4af37e8a1bd9a98c11bf8a4b9a85479d98bd4885ef2f31427889f878a1262aed6e69528529951493595eeae36c0523bf2309c8e147eb6410f8ce3c95a9ee468c14a5d3f7694435aada1199e464471f20c191212033a726477447182add6500d64d0a00a1a34d1edd55be6dae7fa63155734ae22a79b411466d08119f4ccc0a6bbbd3c65ef35d5f7a5f0a5d5ba2a4c4dafc190783218c014627081181489814b0ba8f8a8f8018324181801060a80c15077e339cbdfd02b1ffde72c8ffccf594378925e13efe7acf9304a9b247e010a5e007b4190f6fe5d507301ce145e98c20a5330d1ddb83c3a7a219cc2def7cd4f14670bb4d082285a208487abfdee5b16408005cf022444ba6301aa5bc10e562083153859410e5250410a12482184142715e8a0bd5690b3bc96cb592def739617b31e13ab1d59ad20ef13e7df8be7ce37473a3f92cea6bbfd5be632c69a612ac2caa0144c210529e8528094021f29d089228b2882104519054e141c1452402104142e284a2898a27b87cb2a45e22da01ea0212fe613dfcf3fce3bc9d538f10ad3af8867ef13e1a1a5f7491d75d2322e89bebf384a5bab4adc537ddf8f13af8e3e2c6514364e4cc3cf591e8c1ebd18b3d9ff8d48717a6f6459def77d1eb3993aa63458aef3ce5236c37f633ebdd2262984829c1304e104b413f49ca046777baaa0d46332470e2f632b622c8aae1c39dc7b11462b0dfd67f9ab0d3d466976e6abeff31accadf77a615a9588f3ef0c4f23a238c1d90c4f23add6d00ccfd9db58f5c1a1cfd0ac4d60849c7f5d2648b53e13d427c939f30a34054bf7a4b9a64ce9ee764d0992dd92747b9f08561dea9ee0c2135474b7b7e4bb9647142748896470de7cf4459e803d81c3389fe81248e1e50b7e083ed99520fcd18278ce420ad2526848ed8b86d4de0721e02f11450abb1f547b1f7cfc283fb42009923ad3f14990c4892f9cd88213217042891342bcda7d23d5d76a59fa2271ca3f95500ae8f396cdaffcf85527f879ece813fa843c071f81134690c4081630823b821f46e089208b7ba258c6fee6b0beb7c3599e2ae59fe9a5ed70967f3c1fcd3f158ff77d68c12ff621ed3b1150e96e4f044988408a088810c1d74384f80d9f6a470ae873d610217e835774e7f8f78b261211d8747be4fc99631c5e73c19ec90b85c08a982b044d74b76cbe5008749a7042131ee8f66e09827fef87b5745cfb2258894bb7395b9ba426fef567e23972e4c8e11dd1d85fd2070c52d266228fe72ce8f19c9118df1f4b5c2d88efcc339c9748ab35f4ca2569ed7d0d191202fe9221414a21e02f098f3eac43e8e03144a389a8e4efaad7a99e059d424423a2010200431100203020168c478462d9704a89caee1480037ac85c904c9b49b330c729440c41c4100000000010000084410001d4430040b59b41698cd39138229bd43c3125ab1b7187a0399ae379821afb001729652652c303328dabc4df413e69ecb0b89e51127fae4883f5fb04ec9952bd58b11dfde5609c2ecfa7c0162ee9312791709cee7e4ad0e101ce8d81e8474108e19169e85ebd5ac9972f6ae5d8392aee7c27730bc707ee12ad0c876ff670428c7f13f25a64e6b1bffb2ff8ebfca1d9c75c26e23e643e6dfca3cae320781fab8735f630b4bf75fe61907b2c74900fbee792bdc54b827b4c7c82adf64a82f1a595abe05d9be3829c2d4f18269c20ee4974ecd0bddb5a56188a5b194d46896994c9e4f041e98baa91c6b01500afba8b323007336cc45214391eac7808591385b5a906526455ae465445279e2a298dcb020b37dbda388f10d6201b23eed9089ea264c0c422530bc8663a31ef01381b614a9d344bcb8b9568dddf3088fc6779bacd8f1f7bee529ccb2d2ea676ea1da348621d2112ee9dd1dfcbc11c58aa6f6fd00f2f502eff5bd07db3102a04c9c46ae5c765a03b7024630e9c712c4be8fe2dd01a86f4bda6a98bb439d42c3b4b8167e3870955a26153f01c84ea8e0676c8614ab438d2a65f7e7dd4cc4381b07dca81cc6725f13654e688d05049414c9b1e08c8e2779c2cb765d82029b1e2e1a6dc8119886a39c21bc819302c9e588c856db05f91b5aa08925b5393d52423c3ddd3b6a8f903632ca34ac30a655ce7b07e32bbfe84b43943bd11032128014947fdd2f11f7658845ef1fbdd2b427e7cd26c5ad6023255e2d65b37db9fec93e08c4c3ec9554f153952802f0eb316c3132030047880e8f66e39829cd893b4f43f175d2f5934fb03c078332bcf8137fe53e90286252545af6142610ce025d6e9959bdac97e77bab650124b6d51443e55e2ec608371faaeb44ce4741ead369fdbe1656e8e865f35f7af61ff189ad963ae02d4bd99bc5bc6c970f0fb4f22cbc13641cee172597afa3f15b3ca545c667ec432ed2e904ec43493b4b0b010ade5b87ba35e869a5bce7ad27a215c67feab1269d37bd59d4355c8ae2913095d95f89984c77d66cf209fdaaeb92fd966a073540477c1f0996cde4b6703e180cec319d9f834c73fcdd1d0347ea2e709c03f37a8de3af2f82922696117e9b2a9f78697c568c41d05d9c5ac9fe431df029f667d0736e7396edd91bbfd15d60def24406a2f5f136ce4a9b4c2e875ad912b949f4501d428caf180251ceccd1f8d4111543598b451d4564d7d21c7fc64cd4af6c834aac34ee021862f1fcb40a4cca07cefcbdd13a29740df9cebddf185a1a2726cded036952996199763ac01f53a40dd436c728c733709701d99d3a300646058c5ba28bae1d39857d668e775ed2ac3638a61aa1969b28d35731ad6c20502c775ecea9efd4506a70e84aafe64e493b8d17b4c41aeb49377538b615a1476c11edfa329ea5e94991294eefd8770e80b35845f357f87f0589798aa0e63eb84b4ea9203f65591d66ce78d9c9eebae08ff157e9c8ae9e44aaac45f814542385b3eccef02de7c2fc975ca4cf95520b89fd5fa7df3e206519ad821730d00c319cbc0c65086e1554de67a02c4f462e99c968e6cf8cdc683c013ca0498489fccd7b8d6593661638598adf0f2fa729b812c05b34d7589cf4f3bce3898010e08e659e4874a7bf61ee7bda68727c952abfd072e40221c9ce8bf0e749724de524cb08f96fddb6b4e1a9686bc43322da7bcf1591e605f9090de95734edfc9b30816249561d2d11580dfb9d2a3936b2701206fc146d9b60a0f9585031e3f1c1dcff6daa6ef08c199ad26f4e30fb99652f929a076da07ce47b0d000fef0e50f00b20b0986135e25239a5407921f1cafb08921ae9a0cf282889544163877bdb98e668211ea9b8833a827abd1211590b49036b0fcfc5f4caffc13a9faa0e70310b24a036ae97f900ffb5b9d05f178936e67267174125260af13ad0da4d6c70baca51dd0b988268c32f936cc33a488ac9473d5c73a7318adc5be55f58cefadc996bf9c03e72f7ea9f27a209e48cc9d5a97af7426e6482da73acb5c4da8cbd91e4f8ce700686e13c119b73bab30b4c84e3ef79a3d883c501957a56bd0ded52c08bc9cf4b0a7819bce8d75d5c3c5def229560d0c09bcf99188fe0619e63975b67032ffa3fe03c2f267dde6488b33e5f4dfa65474a78165dcd877788c9c30d6d9c27eac92e38838bc48d5560d66dfbe948e1ee313a543cfaa9af3eef17f313f0d36910051713a80e52ad2eadead110a3929da5deedad8214d20a4a49ae9bede14cc43d6360241b44585eb146d64dd47e3b9497612849a5f51122002783dcea407a6bbb9d155587a1639f7515061aa8d12a1888d3228f54507c011dffc6e1823ad15d5b7409ce7d36f6e822464d09bfbfbb7cf925caa68fbb27ec4ecdbec2ed63150d07239527babe0367c36026396fd49f1919204f78802ca55733fb043a4bc76a9b401bdaa660c8457a50876f6357acf3968ffac192ff0fd725490363fb70d5589a6c5681df2ae8bef667f3c7c45f64c0ae08f404e504c3b6028bd4a9a7de4fb0a0b7e52a1af52261f4cab4f66ca740576da9a5d4995fa958e973eed1af75a3a03daf9ee98d8f452eced374c0756a10eaca34d77615037d7b569c97ff820d3201d895ee1a588e49f1d342c3ea83cfdafc1a8422856471433a5c88e8e4bb53125128b99240818ab1330c111869805c67b701cf41bd8ece0a59b134e3749f2b2d06708dfd72e4cf5d9971b9171b77d6e36c3ad2ee2ea127a111fbee1ab7ff751fa3be05f91bd43a0c9aaee47edd80174ca7efa44e192f8eb4327a05d4891437333a4b8e937e73c223b8b97ddacd20049a289a3ccc8f1291698ee6ae89e23267451b8f112836d42b962ea9c31f90e7d1690ee609cc5f8bc90ef2811b8c70cbc3913fd92e24f78d43718950b8550181ea53a5f79a4e81af012a2a2a9a55e3781cd5ff79f118f8ca435ca3d644b27ac5d9d07a68749e2cd84df9d78e6940b622e98bd92269f53a84b8bd91dbf19f3d3db55b18303edfff8d241b14b8bd2631571ba60668066769684f3aa598ef43925f7966498acb0923c1ae60fd3f08b197231421b9373e0a60ec5e5d3d155d32b601655b8e585ef319af6c7d5816c78c043eb88a156051881842574a1121072263163421fff9ca25d221b8ee5baab2468cb04cd688a0bc989e707429ab4232dbfea5614b6fe348e696d79a9d33684f31496891233ad336bd515954c6ad0fbe8355e1262cdd438b8ab79013c642ff1a6c68d617cd6a3453e9b6f1d86d8c24f692adea1eb4deff5dc516a8c9159e81d8ab35f99936b898383a4a18fe9f17fe631caaf9247e77fbdc20be8f81519215fcc82fb97a567d5db9734fd93ae4e3314f4a86b2a77ea32bf5ebdc59a10780ff88ec7dbf126545aa981272106a335769489af2f1f20c2e654dbfaabd60a95cde7b2dcf1c62894b8d16f11716048c9b7832393d54f34e6dbf0952c3e402e6e8b32469fb134221ceb1a2f8ae4749e3a3bce35aaa713369319a7b1beaf36bf975c2c9c85d01999be8d6e9b217f49ac1da655896bbb95f7724770875db02cf144f6f62aa73fa3e5904522de89bf9cbcb8aaadd5cd8d00c1d4ee89ab4d296001e340941a290a77de10d97c41fe90ab1127eac089b6be1a7da138715768d0ce3127212c194086801cb8b28ab3750f62dcf71c9b58b80d6bf13c048d0d8cafaf796332875e8c13bbf406027674e7b4dc17e855749b426aed7622b21158d91b211f11904c5661bb9b21c6dd8d96755900ebb09bd7da6a8d6b41dfbeff9b174117f06cd22594623641540cd86a5f8b635121ea1d8f279b26bb62da52dafa01bc8267e85bb592985269dd12b5324bbb81621008b2904faab1cac18b947511ca9272758ca414737f66fe0f6f67c9afd2e436ffa0d7349bb7ee07f242a0a0a5345cbeecc43d61dc03d1d63340fa0e7591b3da4b23408d7f8068e840b21a08be617ce04adbcb57334a4c90b33a3c8ef4c38f37bae2b309afe12f4c5df8b50388cdefeb33c62897c149c48b735fa80ecfd0074b9e54f1fc67dcd6c49f7a3a22c2c59e1915256ff04d7b79b64857d61a4b8493845b3a8ab905320f4a4f20377e1c6beb27198977d0112ef391ed7d540f748260696e2dcdc6efaf952874ef71c620bad516a43a0bc57173512b09caf1f79a62957cff04d7d9b14d3fce64a51e35aa9b549e1bc4955bc420108d40b7189b43f3ea2f6b4f3dd34e4ed681887216d6e48d51466f460dac63fa82588890b386941c6d846e9d7ae642b6d353a52d104a5190b09120ff43e8eab3125460f1c50247471a269c629679ca6865ddfc50c06ae1ae8c79dd3657986262ded226f9813b6868c46056c1edba61fb71f5585021c59cbd219fac94f9a520b707e165a99607cf493fa3e8d15f4be03b97fea6c3c372cec686f4d1c76cef25ce52d99be7bd07a0174f8817e200091ff33e3fd09e675a52e1727b52f64c04f21a1b4019505f8f12bf85a8ccc8aa407e13764b6f63c14ec5c48872ba456cab454660705da1d29f07273a56b4d384e0eee0e98b189d25776440e961319c21c743341f7dc21c697d074f0dc9b0b3b18125718e34b49509538789eb09c284e5322bdcbc64d181be8a09d7314d82366cd85ce12a1abd687b7e83f801588b76d0207c92d23f1d128460ba8cf83b107bad61fbfd966f50de177ee290b21741d2349bf7137577e2be89261b6709014509ce72bdd85778159cb83fc2f3909df811fa57d19ebc565bc3d7387b605c53394cddc1cffae7649279b1f4c2c158ba7df20262815f8a76f061d8db64fab80d147eb2c20b7a658c9f606d1b362821bb2cdb027fa9552cde24ca085640ef475469d841ee1463674be609c58baa64d673d9d951878b7282389b67792007c38e55eca9cd9a379b9fcbf2c8e321c1ac6566b38c0f5b99c7f087e1e771800deb27e41c4ef6706470b4c7af0cb98dbbec7c8993f5a6ea04277b37c23be6656adb134303a952ae59a9b062ae31a7cdc365c8f0dc949805c20a31028f6730aece9c32ea533d7f26a44d448288e70b790d99d506c4cb03dda40f27442f740e56376f87562c51e716c2591e0f8013f1fa82887a8c4b60e78501f7802fc2d5b4040c079fb008d91aa8b775fc6e8879829ce9e6623c745607ddd36dfa27a0938b3e9c49a92d1989b07c11850a7f0ad67a432c4701f3696d6c5a502806d53d836443ada7246744fcb0354441c392bc26214341b925257b11116978650c653de232d0c4b7f4839934cebac619b4641ed205415eb51438c40d36f54e8a8bb166b5fb73820c49dcbb7e063b43e4e5d5119eb8e8492a92773728c12937e45cd9e1e2871f4989d9996dd3daeae41ec1d3001a2f50c1f4caa8d65f59e1653a0482eec5a3779e9c1f05f9efc5e7db0b7ce216a076333bb663c3668337387a0139cf4d3444c40bf445647d3b2ee0d236bcc289b8d0365822adc69a08f39f5adc97661e24c2516fbeadb0df1cbd84951787393e7ecdacdfe941540fbe8c0c4255c4a1fc041703980801eb2260e2fecd1159740a4a340e52da78e0d0b5b7204806404dfddba3140aaee55128c67d15f7b9d359004a46c15f5a9024b3c5741860057e1db93050666561419f21db971e3a6458757b0720db74d083b6fc3f677cd943e5ec2ea050e203f2241d0b8651df299e5d1d0a25fc938935ab5bef62e80ebd50d080bb9963ac46c5f086d360d193913293601d18f8e2a4c3e1dd32355c92111df445212f937aa94a821f108a7f624f730400ad3d4838d96153c518caffe7b92d0f64133765e6f04cebd97a64b80ffd015b656a7a3e7aeb2483bf8bc7dd4f5f8986ae52c20c999dc9edd573c9cfb516865907f6f5fc0c4176cc1a159e523ae9d67e771899bd5071f68bb97197c20a35d35491cf1bd460a1a63e0dfbab414086dcb8434b36a94c36ba403588cf026179609cf38d68cfef94742a34caf07fe0da6c1bec9af700b26ea1db810baf7ff8a2f0fb26073ee41c6a6657e4ddb0b766204c4c65fbee3a329f4d885d9e170116cce4e441ede7a02a6345d46c6580135739b4fd9ecfb2fd5f861787cfdccc5fe1334bfdc36210588a8e655e14fcc6c8df2d89c88b162e22297b43cde44e2dd6c07170357733a3814e08c55032a592a85fde5e9b16535444dad3c73ada77dade134fc90b8ae3dafd722807c8011ef4a94b3e8584c00dc36174d234c57381be86cd7cb79e816d3997170a2524fde460a8ab814bc8d41287a2d178b35434448c8e4cfd9291fcf83e58fc56d86d4ce30882833320ebc003c5cc6230f4b8847ab175311f43832537ad181734181c08dff18f6eb0fd689bcf074817883f64b3cba0c01379a673268837749a7c05bc3b8a1696b67561ced492c7cc8d3a6605434a47477581927c8d49b07bd0ad50a3104b2bff4687688db972dc6737d372d2c9c983ff27e4d80b92ab8cdf30170eb298d2756b30f79ccc0049d9e71632b1b32be022d0a08f4948be36673d9f7d88f2ab23b89b345ae959906fff400eded03875f39faab7127233dd8717b3a705a8ec6208aca66837a703939f26b72331482b7e1191ba8db3cc32be857b5db7d1216942b348975288f619214b30dbf62e84bc5ca520c45c145b44201b1d7c420306281f9c7017093c09c8515f6906c0cc776ac2d64d8f92e010937f779e6c9853415c087383553bbe8ab8ac29ef3daa83e0ee986e14b070d035b996725a564429f630acdbd4ef87a1db09b71fb4414a21ce76123f647ccea1598407d21bc5fe38d3b16277bca8c5d89dc9bfec63d57d02d851666a223907c84135b23685949340fc4b3e5af27492884a20b24536fca8eef0e41744fa9ee87d16972729d6e53241988e10ff09ee01acb9dbbe91fed3463e8fd5bec61e50513d2260b543c23653e0cdfc576f3f5bdda7cebe6d734e14b173860fe334ed7e3938d0793216ec646029accc668c67a89c8167f7b30e69cbd1b668c775c49251e087461cf229e0f9afb65d38460aebc5fc4cf75a0d149117bf61a4c9c1dd4e4a45700aa1d3d74ec9be996350f988a372d3d7e2cc5a71247b46d6e20f9e59f8d0cb9c2e745698d356c5d5813fef4f499d6af61b03032ec65f5b479553d1a267f08763795726c71139d0943f0a7feeeba3194d1218dbde799f4531c629c50d90efd4849a616f131c0a4e3e3b4aad86e143742a989bd8aa19858d2814e0356047967de595fafa6877332b66695feec06932d05a2240296b693c8a3eabae29519214261146ac3a427b38230922b129de48ee646ca4c601c9285f69737fb56c09dcd221f835210dbfee0395e90e55e2816a152024073a2df0199da0b7720c738bdcdd6c536f9406fe007f85960e10f5aa63779b5cfe45be0291e7a3cd7299bf2628bbd0538aea5252018569d41fa58e3b563297e37198a1c1211a5931383a01e090d9391b41576568353379cce2eea6a959bcd31a6d0fd8f51cfc5bcdd919636c966cb821f4f523c706eac5dbaa90f349e3409c5bf18b4d93e31833953b78c1979da46a784c792754423df2eea1edae268f27a8dc4622f5ab17bfe13d9dacf5128df7f41d4e698f41fd0d8d5236e6ad29b161124f821bf2dd75961762618b786c2eaf896afdf3f4fcf3189199d73f2dd274582bceb3be997ab8f12998ed9d9ee5b498f62654a69ec2ae05ac4c02750049ab699da51cfb00687ef245d2d92b029ae6dfe719371371f9dcb8be203d9df49a08cdd2486e54c650c74b7018a1c63e0e7c068277178e256460c3865747d6ab61c9385200e7c95aebb87bc9f7904ae198d10978ee4966697ffa54bc023320d492780e02e5139cb7f2ca9dba02f4599b11b89b4c583c27c830ea745ce7ffb4a23acf35efa5b03dc42d59ceaea691f3d9cea38e196f68bf50bf76169f313eef6f294eb7c8139eed09ff597774a496117110f7a7a52d42f871dffa2f3bf76957c9436e4331058e97f065137bc371a901bdeba5a0b5d4b0d84a3ac70c36e893531b5a4621851e3d2933dce9eb234854ccfee7c2ee6cb77abb88bb155a6ffebd5ef426dced57e8b34ba3ad7832e717862152a0fcb0aeba8823c411c6637ddbab380a9146e74f157b456ea55ebdf9bcc00a03e98a6f94be77e2920e9626e2adfa4702d789d26108f4f105f23075135abc5467de298e22e9e1c51b891e922c7afc63154d395ad9ca93496445ba613e2adda63204588df54fa2f6095f9b2e2aab68554c053c29653357e6f80a0626032f48ca6b5f2dee62bb19177d526db3a95655804d610583f8424657cc213c9adc9b2c851b58ed0f5ce2e0155d17b8735c28b62da95a7c40cd17a10c8ded6030f67bc2fc1b23e3f9243213ed14b1e6608cbe1f272464728cfe81a1249efc4eb025cc08d73eb8c46dbfbc19c7ddfd8ccb98bb726bb185c85027c41a24a091ed100585aa0ec38db61dc6a4c7ff676c49ce591b7ef8cb2b61de06bafe28d1f355362ac9b63352fb28f274d5b9565c07a714d13f2b2b0a68a1c9044e69ec70258a29d3f66fef007f08391e934219f3581a0ee402bb1c3f873d6f4463929ef87151fbb9de98a79f8925f2f9974b180555da0b1fd1c8d13ff40a40f3b80cf96ecd065a79d06888e0cc9ecf067d9e198892f6f348c8b6be82e8fc1b104198247819841163db7b415f737d11c698b791cb8415f27d5fd1a014d5105bee3184eba83f921f35e72daac3d9941edf555eda16025d5d13211fd77fb23ed0ecb5929fb20da1b54064b44c0216013a062222b49ae407274958ba9f6417b6df1ee9e12197de3f4b3c20d31ca697fed0cc44c2feb80e40218335b2bf4322e3a895111a5df6728bf30e51bc34bdb9669bd6ba4c673144e4290925ef9062ffa6b456ff604aa7eb9965b974b0549e55ceb679ff85802b8df50654b82f679997b5736b58d291807e25520dfd90fb6ef9ec236711bffcb7a3ad7f6ba1db1d6d7e8351e426bb2ebffc64ce5e12a279a802366c0db559027cf84f5c9d53cc2ab09e3da5b2de91c734b7224a5239b69f8a956e9ca8e513e58b6eb7ccd9a206286ddd7b1cb2c37b0db8688a4093c0989f537c1b45401b8a53fab88da9148493402c044895799e3ce94734b0a1501a3eea3b7110c929ed51a0f05f81fec98da8b74713cdc14c3fc3fa415c9c4c765853f1a6b7ed8d4791047ad9c9151c9ac066c9d09ef3d1ae4808273f391f78eccdddf81d3f58bd3eed7845b9243e64c456196479ead7aec5db9b456759bcf6eaba43ffe256216913ab5d52aee391ea13e9828ba078e70c0e3194a962505f69b5deb58385e8f3c56c29c78127157526e317354562dc779f4bdb8d0e62ed4c8ca89b1cb65e18d497b09bfbf91b2a1868e3737c9f5578277537fc9714a6c53bc9378e4cac16fa37ff7e9df7c53320d789f5070a455e5c660c352957a871c6f54bc3025d0c7708f3dd80c2d04dc3b8aad5cb6281e9a456e635dbe1e315ff42e75053d9b379cb9741cd42c2ef112ff7566e407912faf7dffac2026b64e7cfcbe7ce627be4449553a9a9332e7991443c6fcb46c4e072b9d83277b81fe1a72c3699cb4180fa7ae51c186d16fedb6127d5119587cf3d4a37155cb4dc57579b118ec247bfc963039c108061f5ff728e014b28127946cc179c4da2031fe5d3cb13cd527aa21d0b3ce4a3a3ddd6256b6ee869842e9985ccb3e54f02ffc1a0c12fec97cabb2e1b306284a7d6df906de5d3c39b8fdde23047341370f7922d4b41039ccfc555f486338f843bc8379c934df4907a972ef49a50d8043483bc0d78ad6ae492eb632fb06bf168a6720077f6a7fb6c314f1c8cc6ee1e8cf3a4a03410e70c6162a23c150c7da6330ee64bba23b58253c598419a8fb4ff5589d2cb328fca2b2102b98535b720615ed05e4eb4758da2398c4dbbe87a8e93a7e87ed0af4f25feebfba1e7195bfeda4cbad2ff81240eff0c157d325063ae9b21719d20ee7f1fce780cecc1d47da53abddaf33e95d756a176db713cf73387e2db7919707a711b57677ed79f1c5e66b23127cf36a317ad1d7e7eba52ef4c0f7cbf5321ed2b0cd6a60f39b76aa6c55300d159fbc8c3ac4879d70d24009a28882eb8fce680939e0b5b88e8949259a0c74b550b05680a088a0c3dc5ff19bd3f5706cb426669dc7b7a1a7b6f59d03a5313303fed6486d3f0d687a38de3cc2de2b15f859c3e3bcb3b686da8757c1374e6c5964fb6d17d61c1ceb31904117de7623d342df9c09718541119cc160a914e1d5f28c88bf9352df9bb347195306b8743e1ab2d82caac5c70e56212f0fea09429a08fd0706348fa38f1558d26f672d4d14c2d9e415a5d0e7015f66e426cd836f2fdde7b7663bd80a0bf86b1cbdcc27761466fbcb36e15d7cea1d9fbd32edd93ebfe62d9781e28cd6f23b578e2b9c3fd2ba054178c2f8ab29e2854aaaa9e789d95c2bf4c254b4f0903001b00823e79caab894c5720e673f56e404bfb877c82872bb0eed7263dc3fb96abca3bdba817d0538310290c98419849c60950affe4a6b84d37ec5f58f5815efa12fb524798af56c696e435370fa8c723947c7d5e5daaee86507bd908082a67b868867d66f7c5b4698802708fd0a2d00234b1fd3d3c50309568711d4be1aa831d05061c94231cb88a112c8e6cb4c2026fc252b39100ab2d384e54b730b137a54d018e5960ef4d0130cf6231c36e1910755170c77e0fa67b71d71500b390062ce8511b685a1b8a72ff43523d97fc56f23000c820fb97be4b031b3e491e9ba13edffd4dd63d9567e718ead717f7e9f71dec372451ee22887b6eb0e050fa70d04a4bcb9b15d94479c1fd80586ed487472e6532ace0626cb7f4f11c4046d76c6d107db8a97dd61431dae824e18299b43bdb3c2cc4a721ade6a007b7b5624357e265595cd113552c9525ee575f39bd2f6121884b378d48d50af813e8f1a98418061d670aaf2a9598c798f0e4a834056f964318b4f0f305b0ee6283e960140392c5022d3d0c73303fc8b34e355844833ad01b5c1a48db9025bae15946e0b19a7141df339b9650a80ce13b47bdfab75d7ecadfbade89d8c7de3a523dd437600848d990b6db0dbf3d40b79d06a7bf876680770b58eec7ada595578cb1e1c7d4f327a61eb6f928784ca8f8613ea50a25ac54ea7c3c745f78c1207c23fcbf157d7fb15ae6924e995a1bc101dd046c63cc52e2ff9eb21cdebfdb688523fa07771f28f4cba6bd3fe82f80d34379e1d017da5cedcabd0a88b14a6b76e9cb41fec14a72c3230cf4e41311dca7b5479a1c98a8b06bb932b7683893c802c275c9002027115a534509cd421a701892300ef3f07a8ed78bf240186155010609d39f87ce4ed8eaabd15297d0af4fa353b1ccb8a68348f03bc73f7f2d9b8d9db4323b3e430a3f4fbd72ad70e10fbeed6553b7c499ae60f4122a6777075754793d058f326874cfd341f41e82029bf997575015ca5925d75717427c7d6f84bb29ce5bfebf1c2ddcdd793a2e92f63cd5c1d350986009879553724928371c60306c4d0562d8269f6e7f86a8671ed7fe09fb2ba82cf4e955a4fed8426d6039e9f4495b72804cab9e557ae41e8b2840d815bac02627a317792b732a6cfae2789c1c4f222e9f5c02b3f0b60bb02b7e3d70325fe50008d2f69561862fdec58ba68daef3644c0f2233055876f28bcb0f7ef78b41b9233a39b6557540c134c6bacf8a333d6415ec8a5334e1baa0e0cda3b0050e96091a34abd5c32475dde1b426a334f8911e561ad650f0e2e53853423054ae9810ea5b8395588941186bf4e497768c255c9526b800e52ea7d58b3f83be564811f01564aacf0535d7dbcca5ab2ea51f5e4ee7e9c0d1c151ab75bfdef0f2cb7ff43a6f2801ee36b4b9aedaf54caf49a829cc45117a00a6d0dd079e50893d6197e7f68a66c15e3926d8a9a470f6d5350a56ebc1ad174732ed29122588c9051ab1c7c13614398c164b9c255c5657e1e827394e4806bc62030174bd5f1bfb89a125c62b93ec992db0e455ecbecfd09617559bc30de041567c90fda6dfa73c7b124dac044ccd7b2637ca69e5f1bc4c2c703e3e8b635b85624e272362a773bf38eac8499911c0b870d0f7e267fee8cd7172de44dce4b26a7c6ed5831ae5cc8f9f8654520ae4326a7699339ab16b5ef4ea5e8bf4cfeca9978516a8b784b374eebe1aeadf1063f929ba5cfa02e0f6a680d38da0a48fe65910321f0c68d4ce9d99c034dd4a2fc60d887b332bf281db152eb39907ccc6e7b43b794bb7d5ba4ed1905a0e0732f1be980f84fbcccc23ad4e0c551a263dee45c7b1c66193eb787e8ad8d48f7a97edab4f8c008910623e3c524bff9d2213bc26e37c5a6ce24b88c16dbeb80208e72c4ef27358c8567000a4ee1a381aa7cc2d990ac043eadc9ef8626afc5942b42ee4572a89a0f1e5f6aff9a88cd80632455e5c7a40b17f1d73d8ed45707fd4c3b72df429da44b2e80024622421a096a30a9a0181892ff11b164af4f84ddefbc2241600ad833a2d6de7aabeb1a74e5aea47c19e6d63e7c0d205028e446e805653a4daf627e314eb3edb93d0673a63728bbf635730e6e618bdfded5d61159a2cc6fceb2dc7bdb3db7185f920349eaaac446af16c820c42132988b8bbb800ece575b47c14f0e0875440956d22915a11952c059f82a9d4f3aa4f135451a02d176621d1085b030a212f164d5f56f3f707ed963d78407a5d8aef7f2cf1d570a73c6303e9c87b9c79ccbb85feabc318486b8ac06ee1fb90adc90f2721919ca1f3eec41db8a072a85d00c1a3cac6e4369244fa38e69c6e75ec0ef1d30f05f82be2bd575611e42983ca34436bca095e744c19706f2d2b1f6c1c42a28a8129775810ecf0e533630f1571c7be8b49cdc441734ebad2aa65656450e4884e16c2ceed88008fbc8dd4ff9872b5c48fa23931efa13fe93b62d687c3318c83a4f6b005f365f30f5eaca6f0ce38031243445c65fdc1be7ec5109fec0efe4503938a3a0c8ba2deb4500299f748993735cf944020ae13be4c05c126cd074ca414965d008908ad92711e2030653e6443dfee6f3d4b10f5e8ae7c57a86f672b0db659b40d0878170d94118e44e8228a1979d08f94f3c88bc67a66d446c1d12a1e196f138bd386b066a87da434ec4b5debef30d7856e8073a33d7a76ce6be64ec02437897fdc4a11645cce863c6781b831980b2243dd4b36e53f04825bc83bc069acd5ea46deab0cd9916a34a544138835534ab23fd931fb26f0d4e69abe6f9a6bf3e347dc7f9b7679da15a4a37ad2f7d8be7f6e3fe4aaab5e42b4146df266373be42447012cf2b1210e757d179a829594a310b4c4b590ef5ab9be3467596c8e00bd5be0106c0b06da50aac0cb1450ed13fde4a9f3ba7ab6f1587ee6d1a611b169e175b7d625c0b47633081f7b6cd910381850482b879e0e6f37a64bbae739125e502961ea457963ed7b81d6c8136ab488aae71801cbab8af29dbc54fc1d9c761f720a1216f20da811ccd16c093349275798538608b8677b9a52ad956cc3a41820e32e112980df24ae5d75c853f71602dbe48febd55e29f416026276168067f0de10f542fb84ac68566eaa2b2515675be0b2438763d83ab29ce45eb17d8b1c8c0c114093d083839db40184e63b500f3b457064456e3307da9b91053112b90c07b33de3a0e3e0708f4887314480cfecec9e29157466055f10a33062956c4da531fcc59f9cb58a071f9da5f1df761bc0829f9525b80d3ac6ecf8eb04a0b2b58285b1407bc2cd3202a8a76872dded71edd1589f67ee46b574b7434f0ff6396ef8bc229b96ef70148ecc7fb9cbf3e47eff70ccdb5c0b3b2fdc77bb806b7cc2dd0f02195f6d8699fe18c782b386227fd85f1cc7202e20ccb903c5c34f51e46443840c2d24510bfac9da41f0fd4461736dee27b4579f5ee19c859678ac4b1df8b7cb1fd410f3209a10dad99f40286237fcd4f45004a1139a044b8498ad71a5f6820eba8bb6e7e8f18c912d2ccecc072896bc58e853c4f1380a14645a84e51b2b3bf98e78bb11fe8148bc667b1024c0f403d202a353e9be2eb93c1062c4078de3430511bac13085e9f29fe99706e2d71eb38bae9a4c63d2cb85a0a82d91497a3deae27ba3a8040a774fb447ce3aa9bfe38c4fbcb489323fed546945f499c6a297b303e49a5a4a977f44db5c846c0a85bb6ac697e45f92b53782f3020b21c55a85c88553830426b4d19f92a3730804cb4dd8c1160209e29c756b23ef3dd023fcefbede10104186e69e09f88fd60f6fdc57750293134399bc9f5d9e6992017c8328467df1fa224c24aeb969024a099deac706b66a2806d95c94efe6a89a098311d44915659cd69aa710957ff59914cb15acc9bd4435d92843bf7e547888c11ace521a18dde38b8128529c1d4790d24c1afc603f3a488991b9310a43049c264c5db23359351c9a3cbe7bde063dc881be092b89063059ba85d8a57c47b722fef8aa55c8ea3e360428f9df8b61df42fab37be627b98928cee76a2828fc2de8dc97672b7d43a60bba3d61dda693d0b7fa9956984193abfd7ea6ba373174b3c37ce63905efc4b9b5687e01e507d115e9d9749c381564108da740029a9bcef1d6125b6629e3904e4ed3bf4910e69104028acd87cea966629773eaaabfa13bef59dae42e69297f3de5b9a0e1208fc87eaf9deef96dd1181545a69938efbc70612abf2db344c872fc428eb0f4905c8defefbf85304348b10a953f94c28a390b093e715e25fb9014a14111633948a63366fbc13145a0b3421c06f53a7b1a45c093b0be28fdf36fc7baffbbf346abb741d1fdfc68fa1d38f21476f574cc80488b70a8663992f3aee1e60b2a2ce460085725b3c91edc5224ff19a9baab9c6ae191b0831b0ea0397682c583a0e107c7945f7d033f5a11f98b98208cdcc7ad5c20ee5ec59c12b064e4e1fcaeff073eae9d44e7e0bf2d34344845da36fb134a37eb039e71d0a8b69afe1ce6548487a5e373670a2f3fb6596b91dcad415035e39e83c76e833c3b4f86b58b2ce47cb97d902f04188cbe9e227be99b1a1125709f7f7490171289e388a09a2da2c4f709c79cc4bfaebc4089a7e3bbbff4510981f4f117e5e8ac95f9738b236506d80f6536ebe5484bbc8cacb38cc310ca7e974c5d11dd3410f918ea93478a2675eba9f71e1e2f39028289c932f68df5118f54cf5233431d364c6f56106d687ee9414c0bdf1bb4272eec16faa715d729818fa7487e1d8c24bb9b160435ecdca71119609a0e05d827b60918bb43a435cfb96cacd45ff9fd6f6e738641d836e74f11765f68ac45e81452ab0c64f0f0aaef4868692ca95169bd5d8c6f5579732121bb9afafda46e016fef6c749bfd42b669ebc62fbc99b4448dc611858a64a8b9cd2192731b681a495678ce4fc6bf85f15be7148fa98a863513c4e8d2cfd8a4786b2b0a37e62eaf5e280a5ac57a5366a5c463ef10b9b3d5cd17943786ed1cd370140f4f8a2408bdd3a1575dfd33449cd4c1b5479609de5f1787a0c7cf3e45cc46eb4c32ead5d33b3db7ecf33a996e508af8dc268725c107eb4d3e391c2e0019ef539df631b0da9e1802e3d07da7e4cce69d61afe548912327701ce3b1b2a813f19e001f8e698e68960092e6067931cd809b5c6b4ce71677fb2f7cc2c2bba18a302cff2fccd23e6a815f2646c80788335abb67f9f19c4cfd18af1424d2ffe25b15efaed5023848378aa2fad0c09cfadbc3c1bff38c3f8add7e1320486bbc89cc3694ae101f32bea26ddf52a5e1ea4aeaff6aebfb1e1a4aabf1c91f049c632ed57e7d9410d0e823b01cf84f46ef73561286786c1f0e87d86301485bb772024bef67c93a4d467e1ec24a227eb80e782fbc9d8e1c9369bc04f4ad13874c4920c7a4e5fd44cd811243aafaa7937d7f176bd20de91e41a80985aee13ee4d9cf776519bad2377a26ec35d4f6bda3240a67da315c9bc48f528222cb607381ccd37ad9b566a38011083ffc433d070eb12485c4aa55b3fe871b0b9704a7aa46adf36613701920bef1fb71f9795f7f273b87e9f205d6fba74ac44d6084fef0c0c79a9ee6ff555b016638e51569684c7e9a3d13d3a6337bd0137dbd8875a6d811c8e98d33487865a156bb93cb1a86137ddcf921e106208f28ae157e35042640d73f15df800c54d4d9dd78cac769bee700a05dffc269ce29dbc03a4ef979374514bc61a8271045a50bb5d5cfa7bf2ef3dce74a903fb6dd7f8942a7e43b185aa8f3dfa390c1f47dead53b021dd1d29a12d2e08c00b6e40191cac476ffcbef92e6ac22562bc0f424f826792b5485e43708b0ec78f6a61e52dc6810ad81ca8b73a82f20359d74833835222dd353cf481c8ceaf0447d941539e1f3b6a12c367c01c28ce8b4f9c062d81effe2280e20d266589c3c8142eb263dd7907899e28642b4ba10f64f5e4f0dbe0c8253c31553efd0e8f09371bb79883d6fb868967ec869f8f4c9c35e1c62f8c78c14902cb89c3bd48cb93244ce1781b750e51c025c592c1983a1e1b5c2fb2667c03c6d8d0c044fa4e7d252182357a823ef590196d2be4b1f8e994b996d3bdd431ff603e6c956fc986a59f16cbc28690253f3a84e8e7a2b4557a2c457c3d442bbcc52eef637572a17101349f68b434fc7a08f78499fc15cc58907eec415859bcff419a3b824b60661b2f14b7734c0559e86e5b80fb83e299e0766b70361ad7ae6210c19a1b7e26d7d138cb65f413b5356204c46d6ef36f91329855f8c0bd041d91a4a9d8249d4302f901bbdd3696eb81d6ecd9a79a5621a5d866dc1175d9a9dc20d47922c6add36fb5fa24df5c1687237de27486e8f501851d7c1569ed4c08742972e124a097c661e5beb161695929e2401c79e7cd49e2d082da3ed04e401d7cee4a7ddba81029007e931e2d9621f672f832fb0c60d68fef7ba411c4a6f0d0700be2d0a092e7a377277de649c698c8f99cc7050e23ebd4820493f3cbe76be637f8023c8836ca6a3b62255ebfd0fccfe7792d8ae16cf8b03b1ce82ebb9add6beeb3dafcd97ab2370740ba7e5e71330845ab4e9e7daa3a58325e74c4aab5c587eaba0527b0a6f240d7263c523d48532f20378b3a6687c3bb0ef64742fe43bc8124b06001dd565dc236b3137109ae96af2ee6c4dd409879c11b76e5b581df40dc0d11951e9acc86b99a416b7e6920cc67f2ca783f2c63f9b5038c4869ec68823ea13a7e6052805705cfa75bfe7d184bec2197b9efc31fd1b876cae8ed1d46ee850e51134ba63524df94327e5b16840d8f68e74464c93cfbc64aace6ace0755dc2afae946cda1fc3496a1e88f485841b05abf307a0c2a73f6b166c1248bc9f1a796aefb714025869ad6d1e72075ed436ecc9d9865e1d857eb8c914b9c9671c8bff33e73a7917e0eff939c6f25ffba07ebd9d9384175846fde9b99067450616275d3eee6c99d9bf8a0f99a504cd0303b981bb04488f3bb036b259e74480bf1332393a33f550baf2b4194c2de60c23f88b079599f255927fa65021e97f63b64fb95185bdfff9119693fc5ab998f6d9a00f9081c360e49f55c57eebf0f50feff983b640a6547af1931b967d915db39782bf6f950763006100eceb6761f416e5c3e7ca06ac6e71e789b2d71e5d29b63b802254800bba303bc8eee9d1385580cde8952101e201a09d9d607e6d38b7a012a47f217bb9d2d5b758b6905923046c47b5a569721dbe0d7d287d760b570c4b4763bbd3e5fc2c3140d45dc6cf17e0387ebc5934669d23bb3de377682b2b97ffba5e123e1b8d77417739f9a27df2ddd3d0b53cdd6a849abd1676933d7eed1c0b22623de842f89093310e3814d422e0043bed77fb1cd21fd5eec4e0558506c9bf38beb059f6f86dcf3132033b61451a9f103190931a2d88191aabc22a96de279cfb1434afb959c07274922f3de3717ad23f25add0c26bbb7826167eb8376141aac18ecf7b164018d116ffcc51a41145c8632a3bda1c05003a50238415cdc475ce941150ccb063ee178e7258afe9020e1072653e8c2e83ff63fda6e5ce2aa5d1b804bf0b95e1316308671ba5ad7d3d7a97a543c48fcf2bac8f5833af9f9a5d16ca2b3987e85b24ef71ade239f151a7540516d5e74148e6cb13032d72493ded5a8289cf010c147ca0d978ea3b614356c4ee74b81d92fa6e88142da23c18f498f215d6f61ccc43737c1831f47d90c325c01d276a6ff4961003176b4972c194be3c8eb331327e93f59c8010daf12eb00662f87ff1f1edb1676210e47ed12b9af234d580a79fe1b88682a94525e4d6dab7bbd2f0c9c0d618051b9098a13fb2967ecff64cd679b7679fafe9e65c8f3cc9ab92d32b01a3684c74aa151eaec1b2e7c324cd0ef95ff305683df46160ab2177010682b9d623996f414133b7a47241afa932a8f2aaef1e71a27967dd7c29a259155b84643e13884f58bd530f1784866e866c26119023f69000c25597da5b82834ed9d95499faa45367488ffabba35cf1a3845575773a08ac8679c8ac25fe3ceb206f71e63ee66fb8be6445fa8ae888a2fb736f659f2aa0d2f61a9d6f63e46bb23c7a28dfccaf41c31e66dc2cfd679c4f9407e22941e2afaaad138a876214086674ad4ad06db4ea26fc56e0bc9d0f15acb6e12f1e211cd7c798a3501cfa67ddf5b9f6362fea32b04ed88ebeab4ab230455043b9eb1c5586f3935d120dbfc96fdd93066cea2765ebf0332380383fff8d2037f41ffcdae059cbb90e9b5ee6a1c015e14bc99f14e798abd74ae6075f1af84d7fac8b3d37598fb4fe9fbdfe5689d1cf8674e5039157fcb0698de57bb4059fb35b5c4516b1ca7fbce564527529d10c191dbbe041de448a4ea1b813eef3ab7064a5bc8848eedf7189a26b2723fef1b5a99415d97ddf4a08773b6e339446c6d68b862d805dec0d32468bfa77d36fb2e0f3e015016b6709a608a2977832c85b9bfa3cd524df608a50a4460723254a90f38922e687f52471a4c370da07a79bbf192382364fd81fca3f9b27ef2dcb4ed8fbd50dd993cedb58374d532d17298214ccef3042db7f0e5ebc7451013475affcd04d1396c17090277593a7ae3614ae7a12172a107168854a813153d8312a6f290966d84a389829684d224e88c41bab0f98b0a8a249061efa37de28018bd38126e1ba90f61736ee8be8a2ea128094ec5804bd33a10759f0421849196037a30142f1de77bd28cd2563edd3da75a761fd73b4dc5aef1175a3769383590778337712df93e46b832ae40f63490534afe946b46a573af9f13a298377ccc301ac86cc3f4bcbdcc168f381881e1773f120567f527570ed15a8c6fb18f757f2dd6d008aa3d41f2deaaa01eaf24b59ad53820b91ff34d23167457b5847d9af62fa105357f298c7da198c3e96851cdcbc9bada59e4ab40d3c0951d198ea00c3908c56ef5174e14c84ac08dfe91210f2de94fc3312c75acb9acd8c2a00af89313e675dc24b377bdb382049507af6a793857ac651e224cfe2ab7fb5af5863cf3fb89f73a33443d5833eb71994a7b1e1b340f32fc53e8c5549a74780c4830549fbd9d1f63a213bcf4bec8c57a05fa79c969aad1c1082bdea9b188dc619205ce98b245c5889766670d70b08726b2150787f9ffcbb65642262dc4053e4b8364cccc66aceda35675ae213f5d2901b2b73cae1c9afb67260f0bafd2f84719b0dd08e1ecbc87e7c413be6c660b4fd0a25ac5a6cc84f2ba6e329786ad82eb7206e39acc2c07e7c18b1ad50e2f3619107bac81bcad6ad8fb6ba61fa5443fe849167e7c27d13ae8223a0ed9b579796a4372387a0eb0b1dc03119255b626053a360bdee8b997e84d4afa7c8ee602e53c3dbc3496466496e1e9d8fcdc0f2f0ce552d86634bc1a465f111e5853d87e67aadd2e9fbbf8ca2eb6c91b55db61ddd1d334ee4699138194c554f325cfe22972a2a471695f18714ed4faa4a36b3c02dd541aaa0d747cd49fa256690e4ee12ccf4490e4ad84951aa76a9b910fc9c17fe6c7a7084cf14d661f4f9c9b7778472a99ee42b95c0b05774b2fce073e9602c9261029e7d0e0bd08aa5c115c06eaad10f31bf4248086e25a2a56393129088dcc02d34e2382caee1b83cc1cdd2f17389141692ba999a1510128ecaea5405273098e5472d108d8e65b8f3b6f67376088d825fed8b7f3fe8d180f568e7dfe5cb2dbf07d8670778271cc27c1df3fd9cca6abc3a98196e5a922afc640917fc1f19a9a48f7a772b6cef6c6e51305977034ba8cca02cbfc1c2ac9acf21a02fbcd97479768f42786941326c9149c7eaa9dfdc1bb241a0805bc78fc57a2952f8896442d6a69982f9d02a7dcf1eac840eecc11ee61eec10c7218cf19d9c2c26c7cf95e78ab2a18a9511311636069307891e7cb88a9f3e49c3289cef0513bc643d16d0f447acc55323f283750fd2537fa2d0189c57a38731dfbc4787578f317444abfcc606b6e61e10296473457e230c24336e44e6a19248b848881cc6da9f06b5b1538a3ba8760bcdac4d7f95b517e5bc12afd2f67425cb2b267a4ab97c31cb19ce9eee1b5788f0e91fa9250cfcd092fdc294507396923207139704dd3f0f9b0c1b0fa92bd7a1cf978453393013bd56b6041c5b300da1e38751aef1f47fff0469d2206a4df1785398e5bb79be613147621eb92dad92aaa1d23f4b37c042e5a0dfcf200c7de92a21d2e9c90714d8e138cc2822c65f16b2e8c82f2573187d66ef4e1a9e0de534904f2837d208fe8aab42c7ef4c7f5971418caf4280e2a98b7632bb5fdabb96b313d36cecaf022b7d9d3aa845b475c0c41a64fb244fe14cd5c07502e7ead5f83b730fbd6c87f1a5779e668e3db8e371760fe6b5c87e54a367a574c3b99d8a81030ea6711ca6de76c7e24b3ac3d2b23dc8691613aaa878338a9ae154071dff797c5d385fb4a0ddcd8b4efefc795b4cd2d9d37632f2084b61a243245f24a34b08fbfaed18ca2d4b5abec1990f8144dceb923eec16dc46ca85ed4062ff46271d85770e672a2d192adae02023ebee9664904f7c90e617d390947a7bbc34eb00212c63ec2c42c13bcfaed0b059d94d96c469da7250e782908cce5a0bf0c063b530d2d6c1dbce29716cd850d6a1ddd391e1c2828b6dbecf82288556b23cf67ee41fdc4f38a8858d0b2f112551c27823546f862dc5c60171455aa4a03f5173a5b046a968682ba0553ef8b9777315408a42056fc857ee49a3defd683b14762dd2a1a349839e65ea5bec53c729ad093e334526a9b64df952abaf71c6238485a555458c89f5f4b7753a334b6925f22ba5608a5adec6121463f2d8c9e5b4923202d8a97b966c278e205639fa511c4f72c209a33d4cf6e78a5465d90b6c3195912c29349398517424626b645be0e81ed2e3c6dc1b99f1a78a789a240a3d8a15442f70d285d89edd8787785f5dda367f64c9957bae68b96f03048889ac0eb2a51666e198b77c2525ae6d27d412ce8021228ac598f3bef7dce9ebf31b032abc50131be8082ece720cafa4d4a0292c944e5b593322e533c9c05c931f3c52c2ddfbc4539adc74e01fd61c719ed5ebabb335bf6be8fae63224edd60d04ef5cd8749cbb1f4037cd124b338cdf009fddc0951cc3094e51ef2b79943ae3583a92ab9de03231cae763610edd8d8f432615a3481b1ea868122a9aa06860649483c0015b69bd2065eb694f887ead3eaa29bef13f86e9c1ca23d846d4cd118ed198b34c00f0340d92621f66936aa65f8358bdd6ef3751b3f1de43b96ef7f2ef91c93b6427b44609edecf4b7cb2bcc2efe5f125bc1ec447acfe9ff923dc14fa26b003019c70d7d18b48c3310ac8e22ce2c32c61b1f1ab659bca6d02f6640f4f3f9cbf4b591f34ddfd90c3feddf97373971f95d9e63faf92cffb498de854e0b029343a838b3e56246eaddfe6e9ce241855977f1cb0ad95371118bc231a1b11e9f48da2a007a1bbda9fd30c75bcecb08db3bfe4778cb85ab33f7a9dc2e01193002f4899b38c97a936a87aa466ebb21c4c9bf75ef08231493d76142c72b39f88fd8fbefd580154fb0c020c61e7b774c93f20948903462d8159d6b22de56b60f9dc325f6d0eaff800b16008cef50c8bdbb2a1a6c34a01a87ac5e4898d540c8c16873a2972f0eb0fcf7ff7c057a2eb7db318da7f42ae8aff8c4fffd6b573bd0f8583908039091ece267ba0b00f10f0189e5a259898b0c134cc235f722b074cba41ae2d8c4841289e0eba6c9620b44036ae133cd3780968f89302bab6004c6a130768d2c7486c188b89050732bba207b46a3a31e51bd9f66a33771c738dd136bfae35f5833e7e939ad34cf6f5be696ac544d50896eaf96f0322a1dac42b1297ac67ebeabebf4fdc7f0167d092842b203b4e0aa38558eba1cc7b498865d3e21793adfb49114e7fc6c655560e05ceb0b13136a6574e14e1edb23cfe7619794b366c23664ecbdd80f35697ddd24cf8d2e0c8a7a50d9007a19c609294ac70df450f68015db6cb6accfcdfc0dba386f6c71385400318c21396cf74e4cc95c219352a15fcbda656b646370c5fd3f124f942155e1ffed35b098669677d76eba7a93a015f5d9954fa0adc3d34f2f4b99fab8563e7af73056af1e27e8f41e8d0f23285da3027f496d0fb653f7206bd98b50fbf76b280fb9b7faf681022a8aa558857793c17096bd995216f10ee82ff6e8558d9d9aa8ffc060b4a07d7fd7837f5ad5af14e03feac52c5c693900baa040349fb662514d0f2d9da6985654ef542fb682ad4ff7588808745a79171d544a48ddfed98586d9b15ac3ee1233aabebe1e1d038f812a1317ffda3f88fdc0e968b5955498426c8115bb2b3fdf40b3fb108372c3cab8d839222a3ddc94ed7fd9161060295df476c4e74bca499c5fda6383e572832e425bc517e36e97140525a336327c8f16edfc23955c018ec4bf0da5026aa4088709f400c598893f5e89a189eb6c7b8268ec114c932fe2fbcb34b36cfe1d12942815c67f49033d12f95bd89038533beeae62cc2505f52556bae3b3cb89eaac18cdd0c03fea04215ae43458380306605b5235a2189d8e81e252ab85d8175faf27ea5d945c20217ed4b7a2cb63145e700aa338b3f8566cc1d542b846646ca502a656f283efbfae30511863fd3ea677677a2bb8e3c6eefdb0b145ba2c5f42556fe5dc17cb0b35dfc0ae4f829a982e3645206483ebff8869f996545fe39565e29a05d7d9e285467dbc621fd9bdd18027025db74b7d1b6d3cacabceeb51da8f476a80aa9be9b19c55c2dfa4f981c8c0f1373480d1e6a643aa380dc317e9decb632d7c541c3339ef39735a01af7a43500a7ccf250fedd000288fb651ff158ef4ead3fdd75479741fa687887edf05492fbf4c36ca1603008555ffc317fb6fe5df0f2ffe67a3158bcc81667e593f4aaabae605e18e3c2334cf5e5352e657da5275cde2dc85d1a734f8bff392bc7ca96791df99b6f48e3feb47b6a7f34d10a043cb789dfd5fc1df43796f5c9a7a03fafdf61221c97251ad805026f45e6eeb8a2c2c5f9afa416156506828806280fe86f0142f41876a9b126d11d3c891c494acc046f9188dd8e40edb71e8082f5e3122152faec87a5ddc3acd6946209c70edad638dd49d73be015093591e7f2786ed5a4b414ace50b8d2a541f17de069ab0fb26a41e408c44ebc53a0665a871274f866c22146ed8d82bf329c6daac78a52407a0999c21e38eb94180cff546c1df73ebcfc2944a6bcd212004f97fc2ae4db5268ff23a144885e823cfaf3bd556c40557fac31ee423a50967d13ba4960d0228db6b678fd9e391ac01fc94c6c1c9abc6d80e16b5a517fa4a862a86e021ed5bc6b525ca50fdea6e37458042002c743b0107ecf02b6ac837ea5cd6c5fea2bf352fe9cd4769d73ef8bf390c1b12046b8a8b454eafbb3a7b457cf0720438b7aa849bfcbc6cffb12230a0a2cce887f1b6c4c4d9b3864a8d839bf5e75bdade3a0230e53e7739c5dfc19851cff520bc1826b988102c5298e698aadacd37804f59b4e0f61407373437f60a79e2bc67c9f0184a2ee055553d24120e379eff269abf79f90f477c3a630be7b7bcd2c2774454df0c0b2ff460f3dc0406d0e4147187f23d66e66761f2cbe9c22a2404945aa172a8dcc634454831735719a2bbd322f583549fc8c0bdcd3ade5b49956532056d381aaea2617a3f48b4f76bd7e3129f75216118f79512a5b6b705381d300333e516595a528b37c81f5cdee7bfa5bf39a860fb0806e7d4ea0252cdd7ac448956d79c96d000cb65b3b4c05fe4de0c5d7829235afefcc5fb4f3d693134a53c9dee8f9f9f7c6584edfd3ad8447ef01e026cb92aa255993a590b73118c8df5625f9f192807b67189b64f800f1af4b425f9a38c47cecdd69fe205762b2e85bbd4dcbd39499c755737ddcf8f27c4bcce992711394ffce14a43fd7f191460d0bf6a22385cb1e4a92b62116db90babc79cb15ad8241f7be88e659d9e4ef59a7339ee338fbb4917d81eabdcf26573f279f7ca06046099c65dd78dd5ca1b520fdb349d73594fc3d01f5f7f0e07e3c516dbf977e60019d469d8008133dada766013509692aad2b1aac661cd70b857d5bec9fefa7225d382b475c9e97e565e60d8e1a85db2bdead22c8c03661f20ee5c09d850b642051aa79b7868eda4c4176be09d2fb2c5217e9a4457ab7b1dede5252308659199a443468cb538cca8adb27106a28f6bc9a4cc5be7a92769f8bcf13a23c9771729894c1e560c72c6701e9dc840d3c403d77956e8206421e561b426610ed38fc7eef24f8142239b425106597b8d3278dd373a20131811bf9a68e82eee1197ab8dfe4e60f7490d98fa01280c878cbd7b0f583c43bd415d67777c24b6fb6bdfdcc6600af5cf860a0f0783aa631323c8aa44a21ade3fc5cdb5bd77216d2b954227c45b38a2214ece129bb33512889d520d810e8ec9e8db679a47d17c3fc87c4e27963bf4cd2bdbc462cae07f6d724f1c8d1242eec9e5495be07cef1044620e677d2dba749dab7007f735d93a9bb355a731e9d88d49d173401aee0c43bbed7ffba5c2813e673139a7a4858a50aaff525ff61ee41394f1fe4dcf6f991e338b81860fa46480003a26d6cc6a313e897b5a7c677a1b18944f5e6f9726c0e1ff17f4137689cc778326475ff0be81af8c0279bfc202c9b8b7784f0cc4ae8506f0c25cd67c6b28939da85208393ec742b9ca9461680044279860caebe086dad866548b01944b6c476cbab8b484f584595fb2b9adaf9e9adb4e4a4c4fc7eceac0bbdc10ff62312d8377206290122fbb6af42d4e974a82aa9ea21811aac06b144ead456039ca2188f04077f666d5e4f18e946ad56952f6411db4a22e91956e38ea98be44e048a83e1280e0caeb044c16da93f93b5675a49a0c05f6d110764ca6d18afef4db07818f9b84b927859ca33937071dce151c043c111d9a07fdee6ea51c072390034c9bdeeaa47fae27ecc5ec3e2065dfaf8f53fc036a24d00f442832405f0caaa833ec116c4a2b6d7a3ea3cd044a00a4b70c1257424776f89c328d0b2475690c6c1359df432038d99b5fb23e7439f1897e98c02516a3f00ad32b63199c017339c6091c52d00b4edfb2f19f994b5fc780027126be061dd073353acf6b0484236004a1af20c2165bda11376b73613115fe904ce3a6f39717c7b22058affdc940e49e0798bbdc1ae822104b63ccc34b4a2b4a5c2c655b0bc03721169b1c6aa976d9e90b193c548fc38b393be5ee275be4336769e6aa42e6ca224288c741bc5eb5d518ebb36b4b28395f28ce0f35040ec90ce90c2913163e5debf69bb1f82a6dcbd2ceaafa9cf0fcd4400ec67f48202740681fb6022a5f1c08dfd44eef7f993426d100ec838e9b637116880c4b5ac7542e92586260570d2191bef0bd18db7760bdb176265b29de7380e8402c0c512c6e7c4b68bd1e6a3ed27775210793026797aa5bd5dbdfc414f21b8598bf569cd516dd43b4432819b329cee45c345e015025e51cd134aa540105d6735b72a5006663f0809f5861804c5ba02090531d8f5bfdc99935c7445f0cd2be09b1e7f2a828dc5fdc51a06a77ad192d4b3870b3696f94c2d6fa0389e096c25f595259e93ebfea6f89e673c16e73b8327815515d47d28740858f77eab1c540981562f433cf60e100b32900826601704f3ca2d389812b69fcd2319fd5502a4899823e44db0f74110067807a495b6f28c061d2ed613da70152e307b7783b2b819cdae5b3bb882c0c8a2f425b94b5ca445bdd70d6dfdc272f6eeaa1b8ec23f9ab2f3deb390445427419b8c9c4707a5b76a38bcd9a56ea3229c86871b35843ad5f065de791bbaae5115a0d3a22b3408e569814ea763f8d34a4a360b80fe0095acb358e3da0a4ec0cc7e2f48eb5b056343c414c2f2b3dd900a2e599066fae103127fd007fdc69488299f07c256101b024b76e8cabccc0c931609796dcf98c19e875d68f315065861b2cb077da0137cb75f2ad29135e2163a0a636306c26653c79c244ae1bc95bf304c84a0cbc888ea5105be571a3242701ef0b379190901917c9f59c74a089af13e83bc98109cc4d74a07e0ca57809487442422a1de0bbb2925a673d9a6f7020819dff40238ef845e6d0c0e031c67f4deb8ad669b2cfad589ce9aa723d8d8e337b144606e58af341cd06f22fb21a498f4813056bd39363a7f534c21ce790f3aa047422b8768109d48abae397c4e17a89c5b1ff3118727de6d56f7a09595fa61525204b657f5aa340d87782f350038a3ce0cb97721ae8636941cc4926ab15f0a31a0017e318299e331afbac14bac071d74d01b8212f3aff99ce37e6a2ce59cab996f0b9a2a50aecc078907775ebf4479845331c2d17926d55b7cad2481117d64c2a8164a28e4bc101b92d9d4398b7cf6455b9401f1a0bcaf501e0492309aa70a3e4590b5c8cd67ee51ace4039808a680359274ceb3131a627cc5ef46b822a5301d5604b874a11535bcecdbc40c2427eccc8bc40b3448ed14ec4e185add980868cef413b8117abf41587b69446b655562e405d52e572d362824d1c86254749ba9d17ea16f708b0a6465db96cefa57e0ccd9ebe726b1ef2bdc334c79abebf20d3a66e67a4f3f2a3d6fc60dc7e843372037820c3c5206fe4cca07af3daa37647acdfd50d17b5437f45b7a5f9dfdf4fd6af43d6d43ef3b105d29bf9225a9c90168004af10148dacbf31eba49f87815f1c877ef1f013568a0b7011b9d650f71cf0c75eefabf7bfb66361cf4f7a294194b59aa614940c1077837a01a6ba65781ada2a1b730f5c3882a71009b54485886f107601bb21ae334ccb93264895000830c81070ef102233acbc05d91847cb3005dc16518c47deb7d6d542717e2a92fdfe650bb1c22d2fad1c8c26c283c86f4a4914367fd17a00b289bbacd7ebe6e2cb638c0004df0fa705bac2c9af65c09393f17a00b03b24d5b25435717e2d56e7d814b00edfe6a5d22e854f8679122d8adab75d0f2b5df3c108b71b608e84846f4eec492016ccdfe40b74062fc15cf6904d056b2535468075bc38c6786656ba8910efd2fd4a4502129eeba3a6e256510c8256731c0ad18a0dc4b69813cdae4e7022be15a34870a1d5c8cd2b2473b9e22403caf07106c0c9cdf914f0dfe3c1c1fe41ca916062d5e131027c504dfceea166390b70f48e108256f7cca7d50b086b90618066825b6790e39af8b0be8047e2266fc85c301e23cd1b91a62219bede9e899a8cd7aaf33f9b3916fd9c35cc49a9d1c2abaa880638341ed0263ef5b3fe1ebd06b5b3d12e01ebba2cb47ae4733d4a3a4b97bae6e4ac4f3999ecb4c203879765046a52311020f95143848f8e0a1eebdbe10f7833b40936e3695a31def5bc74417400d45597e72e52006845f04e24ecb4d95a1373b69f04b30146ebcdaa27f1e102752b936e1cf0ae074e9fd1a0195fb7476e938f7e2c917ec140e0269dbc5fdcf29500bcbcb5618df0aef2835ac41fefca280d51131468c82586bee8379d03ca52389a6d0300452192bfab15b9fc9c50854708330b6e7531042faf22155b89226252bad5b3ce2183b9dafa3756a09e23ce6b05f30d1048f65a08e35419ef53aac74d6fa63abeba3481c2b6835dc15f5fa414e3ab881fbfae8dbb80a009f6be751a0a51c931190ccdf2440ee1fcc54b8ce4043d90d9e8e56e26621802348c6afb2f590db40a316bed4501ac056546aab32d0ccd6d4485a711f1b83c74c9ac03140f3fc71362b6712e10e0de928f1b34c7826cbce047d6030b8c805b431104c37814023bd6b2a007e8206d81ac6d2f5623678aff9e467eaf1f0ef555f6507b43d59e48ff24b14b4e022e5cf795c4c84887cfd0c4f129a3dfd6bdb3f98da93eba9f404e45f31b66033b7b79f5fd35d6ee8ec95c9078a31f9d7c50bb5ecb1a3da93c5a160645c7c8c2e5430e858b218acd2e9336edd981a7ff813a598e8fbb23dc298ab40221484b1c074def10beb70f39d51d71e83bd4746e731d9bc1043933597cbc86af2b26644ba2a4f8ee3bc444140a2d3b208963c63e020ef69eeaeb912a0baa48724594c6805fdb98e6e9de265cae550620778387a48899d337957b722158a2d2fa1eb9739e466ef78f7057f4fef156202bf0ed2fb690cf64def4849080c5679838f80be3e3e50bda49fb4849df623533687fcbf42b39bc8dd0815fc527261b3e1d2b4e80a6b4f2f48e5fa30fd49a305ed179f329ceb159eb640110c1da06603e54fdebe48c931c06d7cd1f48f1f183628bed66a1832a7a2e6c23eb4c7383b7bd23f91185df28031f756fa8f284500670390cc24e1122704c0f9b4c3419b7aabe237c196a8719bff50d7ac053644dfd96240bd14f5ebd71719614bb5339e5475d2b8a30d8b181b51d92f6785fcd98942ea1b5cbaab45d53af55b036186abcd5363811e23b1901e2d5668318601d120c6555ec40e73e8f45038897a879da857b5d0b8b2104a25da8084871c6ab968607c756896f1f122b332a7e44be3ffa3f012b319bb78254235d200d978c0ba246e00f3c44a3d295399bd9ccdcc385bb51d259af310b4734473db012eed66282ee277588211a32d3692ca564a6b595367cd23a92573441251262a210c2fc75cac78432a16c727464a2edce7588d470849203b13aeaa25355899e579eee90b017d9c6c0c56bb4914239279cfaa5896c80f9d130ff1152ad43d602136c835560854be98c8c0540d5a72b829d052ba92bca4dcf4d9f48832bcb33f62a396f113bf0d0db340eef0a2784672ffa3d71fda27cb842c3318ebd456d41cd8d24b4510a51fcea83a65ecca131335a80573bdf558ced5c0369045b2984a4110a031611156686dae224d4339196a90369b17c69570d1afc07646591850446749a6d108d2e9ae96c021e1be5bd591f2f5d62d5e85baaaf0589476bc5473a2c905593ef4820758070907b1c1a1122be7f6cad640974050626e3d4939e4e81acab794045171460dee07b101e10cd54fa35414e32f2b6fce386841dc6d8f06b849dbfe7b2840588f571602bc07d6ab0c6af92324e2f8e36fc9e337bfefb3d4ccb8f488992fbf012e096aa03db03d8c4ff36f129be939442bd1276e987d0fd6ab4f1700864b3e42255bc93e24e25731657a0916a9038255ef2b945d296df8766d035af39c9a3be40b8ce289d07411c1492022c8ee0324a12ad796c9c3f67c0ca13795329a016dfa60076a05b88161facf3bc879517f2ec4ab03ad99dc209afc248db66581e7f2dedfd0f5b6de41ad2d9f853f84680d3a5bca45304002479d783f42bc78e5cf8d081705c60bfafef714a0eb4d096d545c76236e84c68097ff62a0f2710a9c160b371bd31955c119d57b23e4e78103048a4807796de64f3eb174c29d576779ea97d1b9bbeca53f8a7f118b7a2a605f7142904197cda018b218b5b011a7991e00226fa2ac49ecd15b3017d49c2798f184eaa7f5bce32aa5561f800af4cda5163c7548296ecebf8b36f8da7659b6d85f4e23e86448be4dc6035d54b54ab829c6423b086cbdf5ad94dd43b212ccf4c66facc3fe4db9b482979da4fc35ec1ebc9e167ebdd2bd8b4c0c944c4f47a02b2c436e1d5637940081f89fd90975209657bd8e32cc39b444537456a570574b3bb9ca97458a5f8da924da2b5c377b8c0bb0e08b0b6218c27e58f0a20d5190e28a70c886d424511e4e15c019739446ad3ec8ba8fc958f5f004be2c3732e6c62258aa8b6082f43019d48cdcb39cad76c4a5e02af56ddc47ab2a4fbf88031ff0deb1a20f504e07594a0c91e194d6afb3d17882ede30e89d51acd924bcf613c4483f21d7f2736802bd723a29cbeba1e0c1cec920403760f6f5227b808e89b4bcefdd03926ef96e3450eb3df8ae94833078f2c2fcc8ff1f09c59945cb2bc57433d9148b71bd4e6bf47f07ec5f709b32b12efe1c25b4b8d58c9c20027de9fff425ab5053b389231e71832312b3e0b444b24faa459c4bce057cfc805ce8498efbd3a86aaba9b6fcb7494d43196cd3a67e6fd72c835b2cae337e6070e7aaf2c97d662b9983f7d99e956e4812661226c476eda0c82b76b69e0c1f8427aeeb77b0ee8891ad6c5945583e014304fd8a12067616cd55e88c48b02810ec8e7f9b91ee937971280dbac797c1540282773c973bb067227543fc0cc43f169b10091c372e1a408bf99f291fee8898f840778b36d24089f13d2e709b72b331d56444929bf16b3472d82e4c43b0b22a83876a38b11887627d77332ab6beb64fbcbdf66734263453b6983e7d07bcd5d58c9bb82aace2f6aeb345ff64d25912375304d9c70cf119b093d0acfa5cee20cfa16ba3aad6e69ffd99cf7b2cc27b0a292f9981fa4a2ab6a17de2021acf20ddccb73e655c59a8bd680556fbb4981fbfcb50b117d211690e3e4e8e1d715478599a9ff4145d474651474e524dbf3e7039d46d1e75c64b0cff146f65849dbd23db8e6104f414bd0c8395fd88dac2f0f00f115dd7622d6cfae44e2e94a99974c32380f57d97865362e401bd9d7786895ebf70fbaec09131644e92c5088f51ecaff35503761ecdee105266b64c28ac3cad35dabcd2f5b21eeeb41661dc5616383ac42ba3a38515814c72ccd288ca109bea6b57143b6d5d8212b984c160de6136328065c7d1b78d977581dcf437c5d11b173032207ff1864315c98400b761e790cae372a544f441a5027065d7fcd05c982b0b4377b5e40f1abea69b423bf6f2dfd773e5893313c41c24ce88cb3f36dd6edb60fed086f6e7f6c42eb59100ba95fcae70bd30c536ad5fc462ea65e382765660b347dc61a23b7d97adaa24f487c30dcbb32670373a6f5fa72a23195606405c32e27ad1c51b5702f7b61f641fb3656b8e772349d93df74e9aa3f175ea3b0395c9341a363152c173bcfecf462b7af63a00acb4e3fc6637fc33e617e668f00519ba3203594e616227f2f79090fbc6702ec6f27b76afb474b54a4b1ed9cf98c65360ef2bf758abb10cb4eb902528c30a4fb3334a9bba165bd74122fed4d4929cd24f2dd5939b12c74c9a0fd1c7a9781a345fe25a6dffde5685fc987f1042b145edd946c42b411a67d617e4a84991f709003ca0fc1e04815f1be81ce8199a0f19476a86c84f22aaf875e9025299587cedc17f68e6c8cfb2b4acdbf8aae7eafa8b5dfabd46e8842bc393791d978757a7e21a8b2559dbfeb4810821384e8c94342e8566f89a18390804887d4cdfb86104aea92ca7a696506b682d5012962c271c645e7a07fdada3b0745da42c21be97d748fc810fab636d98fe653794ae4312799ba9b0f4b1a8b1ed1c57e3c3f4c7d3e94bbdcc2b45cf588f4f37494709916f0bfcef593dc9b26c448394d6f9d555be23db2998862642e182561f56466686eec99c2872733fcc9b83d99a30fce15c43e99e14fc67dc4461ff04ce1f370c362d9e7e136cac43f02f7110b7f32ee237694897f04ee2316fe64dc476ce483961d80bf7f54777df7064b27fb09c70766cd2dc9fa7d6b2727d5b90f22f4ad6631627763f0729d5930c9ee439b9311154f03fda0041a90891bd0c8ec999e93043fb0a875ba5e6687f93bf45e0d69bfb314c4ee957e742fce3a45792fbd9d2bfcad31f6481955b9300a260a730d2e248ea6fc1f13f38767d9626446bf7c8edf3871786a3f32ab14cbe7f88d138767d9b1c514cde1fe5c65359ff62e83183abca13be94aba5b4f27bae9ae3947ef799dde5fe1b18b63d982d68be91dd3cbee1c50057977453496137b77d2b226746ec56a4917b4a633b45513fcbaa76d1520d1ba0e27a690e27782960aa85fc72bd98c7e844e4707d182c875b4964ab69107732941c18c1dfa88020c0fb54229aaffc09fdc02b91fb7798ebf59999b4196aa02bcb742662f2245d84012ef7f46ba532075402f919127e988721834b99526c25a656b0efa38a3563416855abc493c85deb74542cbac892a3ac2458df96daa0b7a49a8cdd16b58bc5791aeb42328b06e89013648da1d352061aea0a025a1b3b0727a492c219d27eac781e656606facda8b71591dc5bced878ec102ea4b8552bff43f6dd3eb06b84225e60852541f99738e50e2039a98fbd3bdee873e68bf920e29c9e0092684fb72c81714f479c56a444283ac63353ab32f99ab68fc27fcaf8ad43ef46adac4ec5c7c98f0381cbabad4ae82f58e38cbf3dc3a666fa16b1a9b4e7a3d96dd454474c005e8174483f804e39452fabfc5e4ddaf5587d8b98dacd4d6afbb7c9e6aca6bbc0f7e155a6a79fecd2b1a8cb549bd79e5fe4a717a148f15a679c895ab20580240d2dbd8dfae5ca7c2d669d1f97fe435b816450f57be587af40f707837d46ee21f53d78dcd8d4ae12d34061b0068213b9dbba8f85e35a1c197cc4af2afebd6d64eca974cdf02d75c4d166d45f645803597e480d669f88264b23059c8817cc9b5460f77c01b86c177abd58c4042c59db5016433264e111bda366ae19b2c1aeca359e896624b41a7ef19dddbdbea1c9e69b85a0db2630d00a9e3d4d3bcd225eff724ca94d7c24a8b21ae2d7d081c84a7b4d6057b7d7539d6b54ef7b73e54bc3baf1474209987a59ae4b1fe71aea8aec7c04047f4ef59396c19787af9575af41e62bc4df97c6ca010c84f1c65f3257b53d26c19b3bb72168fe2a746928417f091d7b128a6f70403a51320bf35082a425573a280d4da047e64f95b327cb036541fa134d6d5c79d4d57a56cf80f1785ea7d381b49dc62060246523df990b9c994b11e2b1e316b4006b125c0498fd268dcced5d57d2afb2f1cc891731dae907aa2410f58bde0ffa1e48e3797b3092ca35e788d4e84b72864eeff7535cee8a155d40a76f996198d1ff39b04b49fb7a5555a16c9d13d47bd8e141d8a405533bf00a52ebeea4b65381341f0ff963f1d773c35e1c5f8e59eee99c4ea6624c334ee1f6aa9691d47d140e439022b282a86319693acb8ff9ae0dba759da7d112d104211665986d2ca17e968e83cd4f8f4c89da6e52b53b646d7d87c7e3e6c494486ce044459045e0fc55a105010705a9303003088e5fb06d14304648c31495b2110e8924ad162519917daaf2dd96f48969876449d999929c75bff7bf5e52d283ed72d5aacae88888888a4e87aeac337fc5af0048a88989a594bc86e193b129c12df0d7244d143097b7be861041fc0e1461b6bcc60e543650b2d98241902c9d5524d60829121342ec8c4281180283b7be0600739d8210be845174444408e37d890810ad23043034648403c60d565c16d5270021e41e0c10e602082270c208025028025ca4e114d76d06106194e608227cc28c3000528e5808396daa10539e260e2a7cb1e7a50610a4b2831830ca33764100316a8208d117c200b2c125012401257a2ece8b0818318dc00055e3801c20fd8c0810c60a0821464e0020ba0420a27e0f1060f5490821380608a2ebeeb301905c1c38e3ae45803062628011a646c7185ef25012ca1c4151d26473222a3206ce0608d30bed8620adf0560844e132647b21682889e1d75b081031ac4c0042540e303647081c514598cd0417224bb3412113212bd3deca8230e1aac11031898a0041f20838b2db0b8628a2194b22c3184115216b0f0e408175a10020e5a58b1002c576005ae584010170ff8d823a4c795c70b16ae2bc87040b4818b8c4b0396bc62085aa41f45424284301976b870b06e88b1215483458368064b061f2f081112a211b910a4059a203600a9e1070e33231f31323031170ccccb4bc87acf0612c0973a6d2a23be6bfc945a3da1c613d440821a2fe8c16a30ec8471a7a04debf70aa0a9b1a99152a3e73d0cc90d5683e406d3924614d4d8410d18de7b5dd0ce42229194d0710263431a17486dbeebb4cac8d6a5a1d37842648934744843e6619dee34c6613a238003e3e2bb7f7404633c6e23191901d0083ab6697fd31db7bd67e9f19e95c77b5616a860d92102fcdecb11c3c1b66dc583c819e79b6dae99e699658e19e68c31bed8e28a299e58e28821ce17df7bedad97de79e58d17de6cb1bdd6da6aa99d56da68a1cd15d75b6dad95d659658d15d64c31bdd4d24a299d54d24821cd13cf3bedac93ce39e58c13ce2cb1bcd2ca2aa99c52ca28a1cc11c71b6dac91c619658c11c60c31bcd0c20a299c50c20821e402b98df4b34a19e97e7e1625666c6a666a0a801500230086d9ccd8cc10c0bac27b9615a8804614b0ac8d9e0da0210134ac40837bef61594f0f96cdd8f4f46059f73d0ac3667a8860ddf7a89a1e244890f08006942798cd90215adeb3aa40053466c842b04608c8781877f2286e05254908a6788f440a819610f451083a11ece6068b35980e365f14f12c18aec4d0c40202044bdc4882453a4ddb54de1fb15d795c705b7744c3f6cf6ae398c6b892d6a54ea50e34fac0933b7e70c60e1eb7c5b184f72c25bc6725e13d0b09ef594778cfbae38dce308dce58c232c27b5611e23883863380c421c38619aaf79ec482c0545aa5b965c77b561d4418021d735872c4312a438bf760c7adb4890b130fbc74808a0e901e7f6f0d32b4973a59d1a4685d476998dfb4d3160ef35bbaeeb46dd974ea8499b8e6409ba7824921a3c87bd9064658a729e136524fadb25269278a0e95294cac9498149133250a0f955229e3e24b7a5be9317e60757101137ce0c8cf09e3f496aefd1c09ea543f5e9fb64ea5755877e2e2b1f05d102ab5691ddfb59d244bfc69e3c17a4a67d9fe596d4aa0d080d6e9cd77272030f034de88bbe08df80ede88cff1463c8f37ea33bc51cfe18d7a7cefc9f0020d0d131f1e0d93ecd13041e2d130e98f86099747c3648a47c3a4018f8689041e0d130c3c1a262278ef0119f53c9a91f66846503c9a51158f66c4001a2133231b298fc6863f1a1ba047637380476383c5a3b111e3d1d878e0d1d8a4f1686c62f0686cde8001080d4d10213c9a20763c9a205678342dbc3c9a16468fa6051d1e4d0ba4f75e901684b8e0438047e3838047e3d3c5a3f1d9c0a3f151e3d1f8b8e0d1f8d4e0d1f8e8e0d1f814e1d1f860e1d198823c1a930e8fc664e4d19870de7b2ecc2024861ea047d343c5a3e9d1e2d1f468e0d1f49cf1687a5af0687a78f0687a90f0de73818699f75a78011bcd30f39e0f1bb6e86fb405f7465b58f1465b5ce08db608c11b6d818237dac28d37da428e37dae2096fc4c5cb1b7141c31b7141df880b9e37e2c2bf1117406fc405166fc40506de880b34de880b19bc11173d78232eea78232e98f0465c48e18db8d0e38d18f0e38d18f003cc0c58e41b6139f2465872de08cbce1b61f1efbd1f40de0f191aec008f06dbe2d160603c1a6c8c47837de0d160277834d80b1e0d6683f71e90179e0d415dde28c88a370afae28d82ca78a3a01abc51901d2d04792f427ec4fc68a2118f26627934913f9af8f36862138f2656f168a2031e4d8cc0a389207834f1058f26dae0d1c4373afd319fd28a508117a060059709d0b862c6bb3440e2d299563e18a6d234d4151f33240ec33addc4c70ce9e747e31af35bea07698b88f57478cf92f2acfcac17903012038627703095e6a52d3e65c1f7ac1c0964e1e174af529db68ecb7e38bde5e63dcb07ef5970583dc8a458847b20144aff70160fa630d9411bef8974d0c6b631e9c152397837f0f17e2c37da78ef3d800d6e234920237ce3b89486100611ef89c2108dc020e2bd178130addb561d437129bd759bf637afc2c000c2c41770bc6ed92f4c0f08a30854e17a611401d8b34567814014de3ba1a8bc32a680030230bcb7a4f79c1fdfe974af859f8ea0923a694604a150395bfc0ef7d33b4fc5a35653b6f89d2e84d045962e601ea987e3a2a170d1507e561cc9a3b46df32a128742e590304e777af3c1525a8a07db569d66da92839d388ff29d0654c4a7340ca54f3aa83b6dda00f44f91cdab561ce64d3ca8243a6da707a1503953b49ddee9ad082ee749a7ed703fbed3f149694f348d87eba955939eca59624450d735ad882b264e3bb1d2693b3a49ca039d8ae8b49d9dee394e4be9b41d6b678400d316ef3d26180f29ede4936881079669d1012dc8d0c28947c270301c1eae6841b18c07affad122940514b2b8e385c1e5bd770dc962e6f994b6d369da941516556071002c50232cfadb7cc90896756f842bd96091048b225886751aeb3e752afd702e9ccb15565c1134ba82e7bd47a484d258963a51b1e28e97d2be5f62e2b4930ec40af91e29486f2bbdadf468015a16a0f352abadc36cb4cd37c19d804e5d8f040479af891387d22b26bcafe3bd97e58d1450e43dadf340a7d42975d206a0859fb4f4ae4b25bdadb4de560888c1a88a9e2d1da8c21ba3030441a57f86704103d438c093d785e58267b5a0052c78cf5a810adeb352f09e8582f72c354ef09e65028b046abc67a5a13bbde447e1547ae3f951381f2d0589ee39fdc42775e241651ac5888bc712811456785c6a5b75259fd300fc861d81180e36e588eebba6440a2aa4c842458a1829b852a1923aad3446e25ec561a8ae8726b8725c0fb852a192f2c14845607b0989fb9a89d34e3a6eeb38df515a0df78341217119070486914c3d5c47a406f31c4a37c1483d3f3ad563ea308d8bef52fca44afd1e2236353d26ce7fcdffaffd70a7943671ff83e9adf3401e7542f1229dc9e784f2499df8499573a379fc5683611a0ad683c373d363ea4e5b7ebca9fb5a916ea5611a172d09462a923a61563429bfa3565d4fad30d2e66d9c60a49e1e2a1889083744a57f6a308cc4f9af612a0dc5a65ba950ba26c5839196e8acbeffd13bdcaba8a474341eae7bbfd3718d47c99294b6a36d3e00296da7fbf7b2814660e2b4695b693b3ee0e28211a0c185025c1ac0e50a2e5370d1465c7eb8a09e4ac388fc50630423f20366f30396a934cce6072c558361990d87655162c4c50a971b22353a0b6f8b099e37f52da955dfa2a17e152cdbb46df34f32265374a79768dfff68547c4adbe1b172844a43f17ee349320242a150a75f52715cb7d23cd7a53c902f597bbc6b889513cf2a41ecc58404074b7954a9fb1e55ea286d02523c519397f76046d0711d438204e31b3745978815418284e47dbabfb8116782f792e0d1519223254709768371e9a79c3d5ede680f1fde680f1fc4dbe1bd21efbd9cc7cd1be541e58df2c0c01be531c71be5b1c71be941e48df488f2467aa4de480f2ade488f0ebc911e76bc6785f12c2a44607cf1b252479d4c3c7bcf8a80ccb31a2085cb8fb635e93e769c7e129a001224d8b6e23d446ab46825ee4422c2614e102961365c0d104e6036a5a05d2a91b8d429c4a46f9a73a725394d469a1d23ad3f52d7de94653d4af4f4605fe3580e463a2dd1b690b668d31614ead455d9b690308e71409ac37a4a6b0db535bf85d35bf4a69938954e711a87d21d67a3376f3ae9cdff7893ca934e3fd8294b4f8f12dc89eb9b96d2c148284ea561a91cecb4759dcfd2d3a304e6ff698b4f7d0deb29a534bfb12c53715886695ce39ce728d4290b9325519464590985f25b94c8a204e64d9d4d11cd87f340279f1c8cd4fd0995d24e3a558292742fc5e79444d378723a6d874aa7ede4683b3d55850fd1532a75de67c78904ca32eec46d5e8a0a360cde7b3c046d27bfa930bf7fb42ea54d524a9cce163de53dcb8bf7ac2eacb01c20c67b5603de7b37bca037d272701bc9f394e7385f2271584ab3d1db2a07dbb42658ca6bd9346ec5a5bce73413c7b695960446e236ad52696cd5b54d85051184dee29360246e88cefbf4d3128c14821e21bc2406290855daa524de1b32a44b796cc810ac7b2dfc74c4a6355155e136529609408b478a4025ad2b41a02922b0b210007def69ccaa42008fd318c83283cd03511192c50ad2a6c9f2e49ac90264c9752d01c633b244cf7ba4ce6d24af0497a70494f70280c7eb3d5dc71fd1e3b5784d733da594d6b3698fe218d7799f94e61a87a9bc16ee81303f84f3a60eb3e1ae602793df984fea74e2a71f2da5718fe2c1301217e48fe841fe086d67e78a15ded39db6bd2b686cd15247580c78cfe2c2d2e23d2b8b37baa21a5de91616ef595758565cc1410aca03f9272a8dc70a1caf9fb42a55c54a17ef6159136e64656764058eaa346154e58e52a9afb852f74d9cb84ef97731a08a8f01a44edc9d339eb8206e23713c537896f0641eec61192f9dbadf94782d9ac7caf2dedbde884a188fdb4850cab9454fe93a5c7c4f8da6a8a1002904300572dae69be8daa330adc3fec9c45957a45848bcf1deeb9e09ec089c0290413f9b96d279ee0e23e891071233ef3da8d21df773eab820af25c86b29711ba9e3951449b348911f8e05b3b9d9b426a8ad67fa49b39265a55229e57b3f994a27952ea9380e277aaed34b5986c34fa8bd92a252e5683c59e63bbd711f304e637a5be5dce86da5716eb8b772dab413c779ff535aa9436993073af974db77eeadfc702e3838446a706eb86849b2ac7b2edaceb29e3a1d8173c3bd954deb70a004baf9e158b22c02f59f55aa54eada9b4a4cfcf425442c79a4ae048e1c255ef491929ead8b0469949297e48c51922eef3d6d2709f6b8ae3bed9349db543933786fb5adb81c2d1e298788f79ed661a31c1e8868e3a5561ba675a72ddc09dbaa138a882c8250276dc7c46993eef49221b030440846433c311a22cb1041709640f23f36244c75ea704880c3493d9a694bcf49ab6cbcff984d4f0e17fdd353da1e2101c20889132324f83d5290deb2f9748f753a87e4b795cfe963dcc9e7644aadb613d7d560be9f90d460375edc387924d426b26bba07d22622bae6067b8fb4b123691ce93992433683f7485c4f0fa6753d5cea04a507eb21a534cc03698ff27e49a9a7b4dd4f3899eabd9749c9e0cb68f0198fdcc67b5c16a3f3414b74b0cce56129cd55c95878f290f75e0a07e19aebc6c5e22671f123f560454858104aff643d3d5811cea6c06af1deeb569a118e34c5f6707aa34a826ae222f6b51c8c94d27c3a4effcd6fd150580ec9c4b58aab33548dd7c3f9a44e2aade3308e36194d248ca618ef917a8250dd899f502a2e1eeb5af3d91a2305a5f43c329a3c8ce409deebd9bca9db565fa56d5d363192354fc990f88258c6283a79af47ebb08ed2ba0e89006330820b78eff53782437a48bad34b7ab04dfb53fccf8fa67f3acd57dd6fde47abb855a74b5dca7338264e9b8ca861a4676484886f4486c4617a8a132c45c283443ae3bdd791b8bc4752ad4624295ab4110993ba4e322a824711385ed7498a2ce03d2959c63d5096f58e2ba9b8aee3933a75cfad4a5de7643303ae633ea9938de93d1277b2a9215541080b7027215a10226614440b82e86214841641e88c827081881c23222678ef91a260590fb72ad283653da420fdd3d383719c5639e9da0369aa1217fdb3532a65c14420098a122c35783c52cd0d6ac0789c0fd252a39a5d43f388d46043ce783a673484cb101e4640ccf11e89488f073a6929acfba09a0ed31e15b489d400a10569d3b6cd1f0142ca0f96f3031eef3d926a8571dd69d3f429e707387eb81394d10f6afca022d904a136ed79463f48793fd08c7c98c123713ddcd7b40f08e019f9d0e3037e231f6a781d03000e3d2c61d44309de7bf98d7a8062d4c3113de4c0031078f8000f2b1e9c8c78f081d900fb0253614a603f7640c268870ebc243fca4d4a3b4d8912b4fd14264e787498f818e4b594b28c3b490c098e0cda2bd44f9d306ef7100946b6ac9feff8a5a7716f0d4d59d66d599665484878f7fb71c5926a6f75f426ad94799e8a926a926559c6a9b45cc4d22ef99491f62e3387d09465280de44b1d973a599b3ae7f51f4e992df65c4753966d3e25c4c73b6fada5aeb05738a529cbb8ee3d57eabc4f96e1609ca63225cb4a3f5a4fe9cda46fb8204adc6a2b956c2082d5f430a4fb92ad3208207e74f861d33a8d830f3d00e077ab1c7a88256f2af1b0e96e0856c30e36e810440e36e0a0c30d35d880430d3534f430c30d32e01003b539c0c045dbd2e9f082ad520896b154d2266cc445ffec40134b1aaae4933af9f868a81a5c98b0056e4810d9691a90aefd56f3c366a6f33e437c442e08190963628908cc9017090051e98790fcd178c96fa552d462ab5471cfddab5463c552a954eab878003c1da690018b2158fe47a74432609184f71ee7815cc8b8934a9780585400f9f1d6508015392f0a28ba3c41802682b86c015a75dcc6844a4bfda0b40ce064f2f9bef3ad7b4a02c8b2841201b892b8b05c41e28de2c0e38de4e8b14208f8f1d6a8628a9c2744c90b33a0c27b2f482524c97bef6dab4e732594e63612370599f72e29e474621041847745e18282134a4f70c2db3423428640809021ba9775df693e386a08c1a9c982908d9193f09e9294ced6a5aaa050ab26a8ad3b6da7a334274f7c13272a1c133c54da96aaf273d228255ee3e1bc6fd2693b4c348d47a5379eaeed08b17734e1bd4b074c70a37b146ab5f3de7584c72de1bd4b074a7891ca0fc7e2af33debb92808423f8f7ae3b3aea740565841f0585ca79ef2a0277d9915afdf7ae3afae9bd8b081ea5edf4f7ae21743ce7fb8e83c7c5773ae81c0fcb61630e9e9c417a8b43085b432541a1563b188b1547d4e275cfc429a5753aa58f780edb29e27ffc164c7f94e77ab88d04817ee08347a486935698088166402bd1ca0fe7f2de05c71bef5d3de0c17b7276cf4f9a156e6bd271da3fe972b489c76f1a94ae73d2c16382d2fc943271cfe3814e3efe094a9ff8a9af8c8041a99cf7ae1bec40ff686e75c400debb7470e540ceee06b56d5c6c4019e48fb8ce40a170f0de7583207f04aa888e3a99945c36e836ad7aefaa413f6d2b9494f72e1aacf1dee3706eb8b722235096c1089465100887888d9c59c675d4e94a479daef8a4564d52abdfb3d888376ddb98749b9612d4b524dda6555d27a86b49b08c2bbc0af25aa85df553d7d9f9d152beff682939573838720a3185117ef34e2216896562a1582a168be56279ef0201c6926511e8fac07bd719667049a8ec44d1e151b253c58812961c28254b4810382f0271446adebbca78efc95c1e78ef0191e4190001419e20b2e489a0105273c77ba920eeea0007966031e1593fb04e80022135a21d86a86248e74366891020aa705981e601044f0ade0f4e08f901c8ce04240006185654514502a6a0828a0da70b727a5092a45227ec88c47ec0521e0531243c60298f7aef0901800c5014904cc10c0f2481801641bcf7b290f2ac0c218487391ecf164d898ac32beead7027550e7752699f144af573c286c0f38ac011821171821dd8e83c95aea584ec6084101dd0d041c97b4272c0e23d5589c3210f213864ef85e1854feab48003707eb38284d8607acf771eeb6e5839b0c07b2fe55551b41dcb6fdae74e9b8d0f1f3e7ccca47492a06e3b61394268a8820484d08085ccf0ae0af850b790a1a68b134f87189c784f771c057e20000c6d9484c0e0440c19bc1a84bc80434a889036de4988901e2142b0f7b8f494080a5b7cea251720b5848d0d121c2418112efd54d37dff24cbb628ddf74f300cc3524b1000e3d24f25efd37de90d0d64e0a50b1f243798104d442a10e28290166c20a40517debb2020864f693bfe47a32286902053bc774de0bd4b02ef5d613c21419600e3d92ab52d3c5e8b462541e9151328eda96c52f4e6f5c6a4d65a6bad94524a29a594ce39e79c73ce29a594524a29658c31c618638c5042092594504209259450429973ce39e79c33c618638c31c6f7de7befbdf75a6badb5d65a5b6badb5d65a2ba594524a29a573ce39e79c734a29a594524a19638c31c608218410420861cc39e79c73ce19638c31c618e37befbdf7de7badb5d65a6badadb5d65a6bad95524a29a594d239e79c73ce39a594524a29a58c31c618638c30667c6da55346283f3aef25f1de1bc01312e2f2dedbbc117eda7ccafb54d1361f80a024da8e3f2de9a89576658b86f24994f826b4adc97b1704366fea3a2d95ea3ac97b971753b41dae8bf7def580f72e074c09d24fb49df7ae065c0c78efe2620bcd75ce84c98f126ed3765239db8a732d9573023a2dd1a9953fed4e7329df84e738cd75dcc96f3e48a33094ee522b229cf77feb948edf56ddc64cdd76da1829a531d48ad3d8d62812e78ff89c38eccae2bd0b8bf7ae2bacc8c224003a544a4b982c89a2648749694a9429539894983ca9b2240a9412961c28599693f25a341e8f5a750d0ac6f9f19d8e8f86f2a9934f8a89122c4c61d3760e46f25840e3bde7e35d0570e23d2235d67b6fb3c6b8c20bb88d14b44b1ca7555d4aa74e3fa78d73a78efdac521ee37e38bd05d39c70ef5d56debbaaf02ce97ed3b68d094a77bac97b179529ddfb4deb54411b97b3d36aa9156678ef69ae734fedaa0a516828aed350544a2a95ceb2928acbb156b97154c80096b18a4c1853b0c17b54c83ede53bdd114869c3696b1c46d5e85f226395758c6951444906525151745c97bd711a86d63c235142a270a4600c016852844210a50d001148078ef5179efd229e2058d9e30851376f05a183d8106ad3212d475dc6a0af6e3e339ccd469158642e564d97b9793ab08110e3cbc78f162851396e0f182d7842d2f8b9c4c20c1c34258890944308188f7b8c0032c6105a5d112c0580256c20c94d001291228cb704c9c76e2c3a5b6681da569bcb4994a3fab949cab2fe45ce1e015125ee0a86c0d95a433f9e1587ca7794a53d275b2ec8623c8f0b88d7452e9521749bc926755607487ea873b649e119c3032421bef3d0cc90d86653d3d58c76915e6794a03719c9bf7ae21de8583e48763e9a828a91cce53f13ebaa35204931d4ab0a38c9cee7f7ca7d39daed4f1c61bd581005d0726c21d8f8469227044d8deeb72ae88408720c77b244e63363a182988f349a495544eb4b2c5ef8c8680e9b8c1888e27481de77d7c561ca74d3bb0044bd20a2cc152b4c2f92928540ee74e50bc6f4285a79f94442bd04a96c9b93271da64e2b409080707db1b39ab745c4a5382d9e0d50db52bdf358e33c78ff71e0a95e3511a0c9603c87bcf7fac874bad4a405a7a4e5b9120afe5bd1b4994048bf868a87acd378aa30e19070fde7bda4fe904a154aa1ccf6993141e9fd469eba86419f75de372ae704a9b5771d13f28dd69dd0d17fde339bdb9e81f94e609c213384ea3b2ccea001066f0b8d3919ed2a6957a92701b89eb4e3f4580a0e53d13a74da61ff4bcd76d9a89c334adcb3cb77920bf5d1f6481db48fd880fac78afe37caab4f9ee54fad1b66f847ba0910f5446501a8e2d8f4422f1536a48e7519df69b0fc6a13c5086f2401e55ca9ef75b9394d7a2753fa50325484be17c12da4ed77ee382b414ef7f890bd22a8ed3284eedea8d1c2e207eb072f9008027814a3da0400fb4788f0856fa7eabe9c10e6f07637813a79de0e0dca07497d2704a59e64f5b5752713edc8fee74df917395832a1e0ab56aa2ede84e2fe15027ddf9255aa2c8b9d2a8124ad37689f33844301b36ea78416c2cc186e8bdc703376584032f4638e86e90850b86f7ae172e2137e0327a3668c3063d1e87884f3f6d3b07b3e93a37dc5b2122e70ab3917355c399f82931f1d34735c05b6840c60d6fcbd5c2688d138cd6c0f1399da675eda7a0744751f14d9ca8a474543f9b13254c543f9b93f7ae201790ebc77b254f6509187821083c18a20247b0638d317c70a3440c304fc8886066240236b6c04cd0c49582c20870a082086afce002154f20c0831641a403c240038d224fa0e10134e08007642c31400e781480240e98910c4ca3185871c5bc77c15ca22b34828113231838c90215485ab8d6366d0788173841ea3c87d24c5c60c6d39d5ea23bbda4a7fce6bd8f96326ac10bdef5523e2794f64d04e9270f8f2e3d2fe627e68990582fe6bd8cac98e782f52283d582252345f7851a20d221e692917911852cebcd7091def52c244443582fe6c8cbbb9e6559a1cb8965c558976585609ab8accb8ab9649862593056ccbbac20a4d0050353338359a2eb126961892ceb9ab1a470593ede8b25ba42deb2067059d62553e5bae1b22e18d16525e1b22c98cb42c29ac1b242978c0b5e42312d583258560c32214b0c0be6b2ac2b54b22ed18c0f7a01b17064ac171f4248ac98eb12c5d0cc7559445cb0160144f10704ae277a17062c51a846f47259a1f7e2006b08d6bb1e0d0dcdb39e25b22e8b0996cc1584655d2fd715b2ac6919b1642c20d7755d304aac21d725ba2c1822fda84106082b88101bae2eac97ab064b6485ac7749b9b0194bf4ae13ccc37aac2b428f0717588f88185c210bc612c55841ac9017d72593852c1cb2ae4b845d407cd4582f961503457107685d333032976559568c6565d67501210463f9b8442120ab876b6559a122968f1f972513635d445c3a5c3a5c39845ee8592e5830d7650511d18444570dd775593096e85b3e7cb07ebc5cd68bd5c2b52ccbb26eb88c80f9e1e3b2b60c9098cb42c292b1acd065892c27560e57be70b87e5c31d78b15b22eebfa71c588acd04bc8b2ae15b26a2c1f1610cbb28e583a5c33a1184b46645d969559168c0c170c96e8b25e4456be7e58a14b072b14ba2ed125b2f27559365c33960f4b467459969559395c3331214b2423b22ceb62160d41c8dc848478b142960f4b4483e5c347f643891b74b00020b2ae0be68af1164d0cf08713cbbaaccbb2ac222fe6a9de953d2c3caea41e66858e3bdab0428121945145d301a9d031c79bc2c30f1e121470c323a1d9785228708230a4f0a0458942c700f078c2830e5028820e1c60a6000d46b26e8103978e203e5c1e662c4b879587edd9430216d3e3917ab0a043919e312e9b3932a0d960300821c4b069c20e3d18901db019843c315ec8f27a5eb67898488af742efbd67ed71e58814b80133c5cc0f35e8e223464606666606e6e54728071f31a197500c4078a0d8e941a6066646068b80b8608980c42401a40b0509d1bcc0214504bac0b470c5f810d904c90197d165c60a902eb269018a8bdef0524564c1dcb4a00b92274b46525ca219d1132254e832c714d64b36da8108282e910da1223ce822041d5d769032450c2e24a1225404145574a9c1c715203044a04b93185432dccc14badc743e8ae8e18226c64728c88b165102ac804246340a15995018a1023e82e8c1143255e8a285ebc70b11a3982c3ac22b7146142fbcd4cc349901026609511031390a1250a08828dcc8c2c81441f81305bca0cb8fd5ff428a20d2052b8d2e355828666232cc8c4c0ba1ab5344288799263150e804a122e3e406264d667c380142a5df90a0cb0c221b3b0393bd100466e607931e0490812e33324e74d80be8f212a279b1609080997939021344ce103f563e86c838819989a921c8121f3e88767ccc00030e40d820431032353b538080624686143383ccab2325068828c686972c647d00110dc18888f111332332f27284081361bddc10e2e14506e843868732932334c8ccc8e0e342a164e70795a911f920f20166035d826841b4e44588171d7cf820c2c18518ca218a2e242356e8878a88422f04e841000cd0526694d1c60ace3063031750c01305e0c269f99ef70860890060b152858a94274638c9f0ac01e2070060a218c0608f2628c10843e0fcd0830d35c48871031b68200348301922cb2106203f605e70821278600c0d5cc0021410238c2a35438c90be88c01e5988c20e401398a08292c64516a78f736426668c2db4b83e7c0007196364d9ce00c38f1999181c6e4863044bf81e65c7089d264c24804502aa103247458119656ce0892b56aea50106911b6d40c10a0e12eb2306e603072801082af000062c800013908004b288b283736408100b0bd715ae2a88f0c09870dd2132c245c7cb1cd60fae37ae1ef8e001901d5c6e5c6c5c2708997169110dc0f2412687171c82d470cd70c560c1307ae145c835b268442d5c3f5e662e1f3232574ccccb25b2429605f382b810ba2194822ea22bba889ec00481593152808226035d5e5e80c400f10328441488a219805c8003300ae8227ae24386191c6890a28b8f24440108e9f0a3830122d34406c3cc848ed030f352832e326a74816109287cdc50184f00224797973dbabc00b1a1075d80743da4a08b0f1a5ab8628ebc187969000262f85143175188ace8e2020f2ef0102a32322243c3688f285e8490c13137211742373217e81282128dc0ccc074a04be8078c0d229b1f31648980886c669abc081193048c0d3033300300020310187cd0e043869824427944016343e88c285e66d0e58701887eb0d20f398832202ec08c4456a8484889484a101960ae982b3137c4ecbcc4d08205f323f42202120a85ae504c4826e46306075128a64a8c1017a4cc8c626062ac508c888a8c882c991a423740e16387170e7469a103508c604437c82c894214b6e60fbb0a7ccfdf6a8a65ae9e6bca533023dd5cc3a8e38f5a7b14505fabf6db62de21fc729f20ebff35e531eeef23d5d80411e359e1b4b5622ebfbe2590ba67cbaf9f74f66c3909348e52d67d7bdf95436ad5e071ff7921bfdb477b314d8376ac29f7b24e4f7fa67304bd6e6bf1fcd6eaceab9422e0f1cf8f35e411fbdc6b442353db7187956f0eebec2188b77abe75dd18430d3708fcecf9631d2df7b0620d7178ae0f60abe9cd3bd33eef9d5a9f41e3fef0de7ca7197f46b8f1a7d56218bdc4654ce8b7afba66ddb997df037ce6c9a3943552c8b7b71db8926b88b98d599a7054dab6c4c9c581eeed8ff26f196fbe7d6f00fbfa69d738eaebabd5990cbba18716626827859eda31b4e4f37e5e3194f8432d35b077dc9c7bbe2d9c96e2d8e4ca00d41542fa25fe1ec37927940b03145aee2bbd74e68ce1f4179810c67f73c4944789a3b6008ddbfe6e7bcc106abf6192ab02d4736d31f535e31bf3c7445c14c0fd475da7d5114eaf693565e151e226cb7a2e317a8c11e6bbf59f36fbea27c0a18d555a6e3b9d326209dc3b3db4356e3d3f853787b16fc630eadcbdc63a6330b096dcc208f9aff2c78bbff0bdeb2829fdbdea787704e6aef4677bff9512e64b21c0af8f704778e1de965368ca321c1c1c1dab8acb8b9c279df6f318ffedd3ea2ee8d7d1ca8fb1971e73291f702b85fa732c67ad5edf68eafce6802a35ecf6d78f23cc50479391ab0153c2497dacb45f79bfd5a62cbb18e061ef34767cb5f51bd7dae4e282620b7ff77c7ebdb9967f8b5b219e74e7daf5ad7d622db09db7560fbbc6f9563d955c5970697ba5d1db1aadc41e0bc9e59f9ed34877f4d8da2bfe9ddafba969bc73ce1b2f2b24cfd8634af9b711e70caf05583b758434d73ce3ff325fb914a02bb53f632a259656ff4ae54a40ed5b56d9fdadbc478cb909c7a7349412242e04c83fe98f3edfef738c5266190ef756ba2cd3c2b529cb88b8aaf0ffd238e1ef34f3d0eb003fc77d21dd3d6fcfe9a7918a3d6bcd9dc33e35c73573f8af29b8ceb5724eebe6b4d7ef995c52f408f39f3857af77be749bb20ca7ca1585d772d6f93be737cb2baf12171413e6c8618edfef58e3fe3d57976cefee734a6ab9be3f475396e16c6b8f8bfbc5bb7388e9d4512c3da2b6706faf33c5d5d7a86d1b932ccba34308bdbcd57b99a5b63166a157ff25c6d7636eebf4446ab00031c7197f9ff9be9d6348c5ba82bfd37b3b7ddf52fa3c21b442fd3c671cab97f0fbf869095661e62df1bcb0527d39a6b3894585ff71ce14c30b2fd4145f130e8e9cab52add2dbc8d9756e7e7ca753e5867b2bd60eac29688c7df4f17a08a38fd943296cabbfbcffc2782b94159ab2cc5b51a8316fbbabdfda574be1ca8282853f5b2fb5d5f6dfecfb13e4dc5947eeadef96ffba9d00fb9f72564bedc6f37a8d07ee73dba96f84b576cc7113f8b593434e3fc4945acf84deb9c6777bdaa1cf99cf25ec6e2bcdb9cacd67c65e9a707c56db2fe101e2065a4ac015639d7fbfbec71d234f42ef37fe18a3defe4b3b2d1220b45457c96bd5fbc61d8f10f1be927258358ef2d26bca329c27d61d7b7f19a7ce38e7db25ce502c23dc1c39fc1d42ee7785379bb20c07c72a4295995e9a2796dbf7eb61cab2034ebe71df1cf3ecaf87b40e3be3b67b570cb5cc986b22482a2f9793c2d9bbcff90ee1465c21ce5bd23971d694098b0ee9e3d5d6636b23fcf2fb3978a6f376fffdad36ca8ee5e8196efd7b977b6a2e7d1c53d75a61d493fa7ae18edf1242c7f656f837bd3a625f7910fccd9b529f798cd3fa798110f9b432dbed6de694caff03ee39e736f389a9ef965a1ff8bc2dfcd1f64dadc6757a0b0e2c6f9f15db5a2b9c51da37beee957f3e77ce50ef1997b07a50bdf6f9c36b6fec5e57cd03eef7f4b7eabce1d776df92b503aa2bb49ddb08e7bf306a1ccdd2c1b593f34d6da754e26abba05d32712b5596e5e0c65865c551f6cfb7bdde8d68b984ff7f18fbaef8661c93d5869f1f6f0fa3841243f9331b5c6eb839e5fc760d658f4f583880bdda1a719470f3dde7bec1e655db1c31957c6aefb129cb7088c02936100994eae754f228d5aa2b3961d9005b5db385755bfaada6bd06d4f3e9a7de15d6ada3bda61f6d6b32854583de67e730779c2bb69377130e0e0ecfcde63b1dad4be9d8f0dcf494efb830e15e4525cb726c6e2c29ac352e86725b0c6dfd5c67db4d598653ca62cdc046ef2da77142b8a9c7560637777e3bdff4525d7da6a62cc39962c5e0eacfab87137f88e7bdd5946538482c184cd82396d1d2ffe996389ab22c68ebb20c27cb7eb4ad49d0c693dda8ac1774fb7d97f56b4c79ff1836b1a962a373a3d2503a8d6a926529df751af537cb0595d748eb8f3d734a63ff2df0f8fb3de187fff26ef16781867a6f783f95bd437aff0a7aedd456ede1e774d7ee5550e1ed57662ae3febd739f0219f384d77fce27de3c7b14e06f278dfe4a197feed89f007e5965e7d97ead658ede04fada9965c4b64e4a2de72598dccfcca99efad65fff2681cc9bf36db98c9ffa5bb51a784fbc3d8e597b5d35d469f8bb37d6327a7fadfd368fe05fbf3df7546b4eedac5904fed22e35f5b77a18a9cc68481cf1c5b262bc33c63187c0cecbaff75cde2e3fec170496db4d319472faa861bf1fe8bee74c27dc96538af93dc3e28aa7949446e8e9dfd60c0c3dce7a53ea6ff6bbd73268b711f2b973f45b4a5c3db0ebd591fa0ab3f533d7da812e2bf47b52eb27d6bf530e7c6fffdcb66bbbafde7f6e607bedafe59eeb1c35f5930ccf7bae33d6e87b8531c252b7c6d053725aefc497eec9e7d440c4b3768c79cc1c76ce3310fb9e3153893b8d78660c70acb1dffae208bfd6585e60db9b7bc61bc6caa3ee16d839d22b73c53f57fe7705a4b7705b5f25cf36d61b2960ad95dd57796fc6f87e31bcb67dd708bbcc594a3f01df25ec5a6b59bf8e504309c47c23e6d7475d71ed1886b1e1c77e73fefda7df5e0e06e61d5ec9218cd75639370eb7be8074d36e6dacd3ca6bff34e11049629353a30ae2c150aa9fd34d9671252b5604aa965b62ad7bd550f7a94d5986c365d98e05816aa5c5fd66dba3cf5b4b532acb70b20c27894dce4d96a54e3acb36df9d6e5096171f676d37c698d34c3feee2726b6f8497cb8d71beff0137fe0c73c49d6e0f6dbf3818a7312c3746580ed059dae86184fe4f6f236f80a5516a2a2bbdd794655a571ac262c0a7bfde78ebac35f37ca329cb98dc585ce069ff8fddf7cb399e329ab22ccb9828b1b6f8596f8cb5bf5ce7eaf3d7627e3d619d194fa873cd3c8b5c37e7de5a4a3fd7ff5e2c2cdefbfaa9fbae57631db554e90a6fe18e10e76bb5aeda5b216bf5936f6a2ded58f205cc4cb7fc1feb5dfb9c5b01fefe3c29f5345ad8614d40fcda767aabee55ca1d3f022aa414dbaf73cf37c35ec5e537c7eff5c772d6c90fc0a59ef7d38d37e4964f2abcfdbc5bcc679f9d72e9a7f810c78feb867edf7ebf145fdeae318f5562dfa58e42533c27bd5ff60c7785c2d20dfbf676f3da2bcdddea02addf73e3ca7d94b2df2728a79bee4b61ef3f7edb0db0b3b792f3acf38c18db02e01c6bb670ffada7e6923b41b9d452728fa7fe3d7f02e08ae196f5d36ae7cdbd09993b8f98e62d27cd7807cd4bf3b5b5f7cd21b5984bc4135ffe61bdfacb29b74cebe38c585adbbbbf7103794cf1ee16674dfdfe7e15b59610f61d7bbf98f38e73db3dfcb4532b69d45ce49bfef969ed7c738937aef9f7deea0e2dae796a263ecd5c436eebe5f6daacca32d20aede79e6b0db156a7ffb3ee1939ced1de9484b95bacf18756565ff34fa5f672dda7fdb64af851bbc7bbabc7f7d24ab3d632f9b55b5a8e7196b9533c0079fdde1a6e6fa18614df93debe5e6df7b5167b8b4d38ce5e29d5d97278f7b43e104a2ffb8e79f3ba61fe7963bfe3c7fb4ffcbfaf72c6ec69b713cfcbbbdc9077d8359e1c7b89b9e49ad68d279ff3ea5f77ef31ffeaf3d7f6df19abc6d74b3d2fbd3e5b597d8fad386ab927ad1e67de4b707e5b27a7d14fea631600ce5b5e9fff8cfe6349b37cac37bf784ffde7e4932ef16d8779ef7b6b8d547725eae433d28aa9c51dd21c005ffd873cebfd3dddf92651359e9ace0de3aed2532cd4434837cd7043aee995cd29a5dd479c63ed724e2bbdfa6b7fe5d3f6da2d9755f2ae3e624afdf5dc7b1e5d719d17739eef8c9b539918e60ae7c6f157bc659c727f9ed06b9ceb95757624ecd47eebfd2bb533532b05df0eebc51bea1823ac304abf567fecb9fe1befcaed4eedd2ea4efdd5b0e72fa129cb521e55e21ea86719cf4aa51c287e7efbb7ddd6caccfb3cfd92d6959e705ea3e4f84eacb7b75a9ab26c87233abf14decf3be67dfa6e63c4ecd36b7a2fa7f6d7dca9df483a7c73bbb9a6f06e3c3fd626ae88939a2d9c5cc34eabd67be2de355a44b5587a1eb7f534fb5a61ef9a6d92ef86f2e38c21977477ddbb56996cba3f9ff252bb3d9498d62596ea98ef9697533a77f557c9beb2cefbb1e53b421ba5492691d0763a31be3aeafcabd57eb44d657320ddd7ca2a2db61cceff4d59a6d2b66e4304ae3eef0bb59dbe5b0ca9a9a475a421e4acf9f3cb67e4f243be4d59e6531a8a97f8a9d31d97654570e4f7f9dabbe7be5ed638ffd74add09a5e272904c1da1cd94d2ac71eef8de400be19e944ed9699f70e31c899a6ffa69859d7e9be534655929cb9464f45aedf5f5b0d70aa7fda62cfb21ff685ac9672b9564f0ccbb7eb97fed54c329ad29cb4af4daaeb59d1ac3bd65c4f59ba6dd53fa2bbfa5345fdc3d3765d9166df321d5eb2dd63163ae7fe5136b53966d1d4765e5f0ca0fef8dd4fb484dd9dc16f74879b4f56bed3f3765594fe992d6b36c476ebfb3b6337e9f7bc7389bb2ccc4ad54a54dfba52cc3c9b1d9a2a764191191660f73e6b5ef4f7bc7d394659b36f15296e16459f7f3af60ddea07889b239052befbcd714a9efbf7d09465387805c44d2975cab2ad53c177fc7c23ae31c23ab7b5d91a21c71c39adfb4b5dbdefb508f0e60d21c619431f7d851d755aed2cc3b18620b2c3c6cfb7c65df66f7187515447ceb0c3bfa594d24a4d271130e497438e31a77cfa3c042b33af3edbb975d533563a26febd6be9219e1a571aaf10cda12dcd3aeeeae5e75d632f0795f26b1abfce59fe48a1024471f038e18d7ac379a5a6989ab20c47c7e6089110baadf34748bd9c11f30883202dd57e5f38e1d41553da4504841c2f847ac30dad8db8a4f52ca21f780871af5e5bd927fd306a4025ad2f21f281ad5af7dc358f5acb8b79e77d522238ee8dfedb8fe7be79c36eb588dee0f7fe5aabef91e6a9af366559f73de835637cfb8757d29d6737659949c4831d682f6fcf3b632cfddf979bb28cd3543e221dc02fb3ae7067df4d3710e5a0de3d6def7072bcb5f6fe0b911b70de9eb186b2db9dfffe6dd4bb23e7f95ffeebdcd012a974ca68039978946ac55373639d216283ce5deb19221cf09b61c734fa6e7bbd4159868313c50607af541a8af500d10d748539c619b9b772527cbb10d9c0737c3d9e1dea2cebaef3860c510d62863d7ac871bfbd7fde6d6e3220a241e55dd7da399cfc4e8913e526cb6e2c0888d6d8d1f399e3e450e2e96d9e019f18664b67d6dad27ab30c74fef7fa9b69cd300679c33cebd6b2ff4839e7a62c838194374a2fbdbf2f8898f6ca3dff9fca8ca17641c694e39cf1fc15c21d730bf2f4b2ce8ca1b5d4decd827ba9eddfc72fe3fc98c215609e73fddef20fbddcdaaaa05618a3c591f74cf7d733052214d09be7ae5e6accbddf1146407402d9a99471471b79cd326bd19d17221344f83fb6daf75bbba7599620d3c933fd31ea183bc49304ff5edcfb84fd5fc92bdc6ae8fbbbcfb6c2e869e6719ab2acf33e5d88d2d8fbde3eebcd384a2a3d1f0196d8573bbda618735ab108b086f5737babcfba56fdd1b89647ebe1fcbe4e0bf71485605feb3986dc5efbb3f63775d21c170dc52615c5a6a74e47d8f8154a5bb1913206f9236ce2e66fc4108160525a7b8dd9eaabe7bcf60319c279add4d0eb5a7790d7522aa94467e4eda994dd46effffe549bb24c55c229c28a8d3cc2261e71a3d250a878d4de340788ccc0fc66cc7daf7c471f2b2f43e48149edff58e309bbbd954b539631014412206e98602245f5c3451d80ba7adc739d5d577d2f356559c6248a88037362fa65f61b7f5d63ed36106d60f60871ff96de7a6de6119151f3c4307f9c719c11de3d46c593c6dcf7ad7ceeae2b14220dc47d75d41fe27dfd863367a043c8a3941ef3cf75951b0392cb1f77ec5156ef79a6a20becbee7dd76f219a5f53f1b406481fb2dc71877bd258dd4ca0af04ca7b6b5efaf6f94b44721a2c0dff47bfd6bbeffdac8411189d1e9fcf8fb9af3ed95e2b94434810bb9e510ea4cabbd7fd7954802fcebd9a5dc764351183d762ca5e75a5e8b25c526244460507dffbcfb573c4d3d75fa59864345f4c5fedc46aafdc6fc5b696704f2af7b7b8e21854e8820f0a3e43d623b29c45ac26885c88b4fa7bf7073396b13a22eb2ce79464cbdbc14de9c653829edc4dd1840f400286ff67e479ca39e1e662a440ed0facf1c75ddf6f74bafb52a206a40fed556692fed1c63adb3e72930440c9097cfeff3aef14668e7e7c272b97faf7652bbe3cc5bcc1e21dd724b9f3dedb06bb135d752567b33fdf5739ec59f73d6bf7d95127a593716926ab929a717c66fe3d7574c9afbeebed77ba5fd305b01efc77d42293bc5b6e705d05c318637768da9b4b82aa0d36ae9e4fd6e9b7fa63401b26a7ea5c49ddaba7384088872d7cd67c51beb5921e6f1a22ab684557e3a7b9c3b579b6d4c9c76626361213a0085d4ef3badb53c4f1e21151b9e9b2cbb4189a8f877d3fa35af78d2c93ddd229a42fb291d254a84104931441445e9a4ca918289a038a9723c4f693988baec10da830bf25a7808e97152e55c89c243280f1f1fcd2344280b1c16b81216bac20d212b9470085501ca284485184253d0c235d4161292029050145e0841a17452c5107ac294b1c6d97da7bfe67cad29cb747cfc4e96e1e004712537555251b2ece7a4faf13c369ce7dc046d2b4efb8d47e3b9b9901072c2975c5e7fff87dd63ec3d1edecbedb7afba476e879a702bce344fbfa3e59c637db3448809d44afea18f787e6e25c5a62cdbbdf4356d93c224b4045ab1cc387e19bbdef87f53112125f48e21a7dcfeccbf97309ab24ca57fb20c27cb0e7684478920bd6d5a8692502584844ee795d672c8f186184b2e89d0119408ddb14346a83bf25fe58d35631d3fec382062a808d18e2ca13a4244b05f5fcb299cbc4708ff265273034343b0f2ef1a37c5dfd3e171f41042ac3b87b26a3d47f7d2563a73b7dc46cdad1c527f0ea9fe1c4ea923ae7174aa21d5dff64caddc740ae1c6d8adbf70e33e37a53d08726e7e3bdddc47e83dc74098f5536a39b47f6a79a1fdc19e15d70c25deb67f3c6350c807537f5d2395704269a1e7706c9c69eeb6c24aa5f711bfd16fed19f6ef2daf747adb83100fa68478cb4a6bd51ee61d81423bf032f32fabec114fae6bd581e47dd27ced96d5df98650e309f79cfbfab8f12568edd88dc7e0a7186b9db7eff6fc3eeb9e9b4f1738eb9ff4f84d8889ae23af1fef3f7a87bc4c1a6f5761ae3f632fbde6f806dd77dee19e586f3cb1e45c80653f2ae2ff511eb1d799d0808d5a057cdb78e1a5a8f6bbf34e8df434dfbcdb7fa1f235fe3ee5ee5bc5042d9f39eb83b119a41bf71e33bb3fcbec399ad0c4231c890db6fffa7bfef1cb9244008067ef688fdeeb3734933ec2f88bbfede31eede7baaf776419594c30fa5cfb1cb7e6f0ba09dd75fecb7d5f1db0c2d2a422ce850ff4d6f8497ce8dbffc406805b2cbaaefde924a6cafff2ad8747699a5b418c3ade94d41965ede3dabec917349231b2114444d6d96d2c21c69b5f082113a41c45d7f8ba5ffd57a1bed172113744bf1b73febde39a5df97a0da0a3dd65c768afdacd48b100966c774d27aafcfde66e9bb94075283f3a9a3fe32faecabad1789501a157e986b9efbfe6ead855984466073b53c632dffbebafe8c45480431d6ccf9cf9fd3b9efdf213472b47eee5df5fcffff5e4d591602ddb7a7f7622ea7ce796b5396a17a2a150201f435dadae9fd57daadad29cb362765843e60e39cd55aaee5f5fe7f6fcab231426740334265503fa3be77eeeb4d59f6c3b1f494a7622120e4811f61dc98d36b758c3a625396dd843ae07fd652e65ae7f7d9d21be200e692f7c92f9e36e7babf0d946203a3d8c01d1b08c5063ea9b1b0086d205a7831bfbee33a73aeda94653a213234d69fd3fd71acfdf31a9f088dd16ddf76e7ff3fcd77d36a80900636de75d289f7cea62ceb364df5732af594ce321c2da10cd0fae3957e729ef5bf369bb20c6715c280f693deabfbb59afeeae1054217e052ebe8fde6dbde5bfb3765d918210b50eb7da53272bda3ce389b7c97d23e5242158830e3d9b7a7b2dfedb72f410951a0df5ea3c5127a7ab1c4db9465abef242446ec36ef5db3bd38729c532bad88d004a4a598d7eea5a694f7da4d599624cbb2ccff947ca7734212c09f7f08bbf7dbfb2d51fd8473e3515dc7022314469ef24e88f1d557cb3a2f1891e35b35975bce3d2185a62c43e98d6f5e4a962d097db1bdb4956b6efdd4b1b1627344f7dda65151adba5f5252adbaef59968050046e9c7f563ef9ed93634b4d59562aa1b64e55e1220401fce7def7e73d799f196a2fa084ba083de052dc6d9d9bf7cb44c801b75b0db19f1d6ea827a5a62cc38992659c164d335955841a1062c04e888b1965af9d625b79b67ff7d016ddd73b6f8e17577dfddea62cb312d28246bf358553ceebb3fcd894657e53052094859cfd7fb879dc9ac20e61b7811016d9ce0a7dcd7ef69ffdb413085dc1f3a799c6bd219cbce70a84aca0f5fb0c39bfd35e083db4ce082d004aaae985d976ceed96500112ea5de9ec53d20da7f7a85002aea69cd65829dfdbde6eb59fd2f14564d94d014208a8d45bf9effedc7fcef5af2267da2bc697e3ccadbdfb0017c758bbbe515be86dcd54dc6abfe4b94a2d6b841b4f11ed95de6e59adb73bcf2b059d90e2b923fcddc61d05d7bd432b65c7fdeeca2d14f7f2ede7bcf0d74c73aea12eb5538ce1ec53c2dde7a47b64eda3a6d667e979f577ea51b18edf576c3bc5dfd63cb8c55b5fda71849d7e2ab3d033aff7479f25f6356e2cf43825ffd9e26ea39cf50afbe7f8a1de387adae98c56e091da6b7bee315b9a7315fad75bff4cb19c3ad70b772e2ac0aaabb6b6431a7596fb4f81c38a739cbc73b9e3fc5c0af9625d67b693f73b29e551b0fb4b4fefffbdd75cbd8642a5317bde71b690572cf313fc85fc6f5a21adf97b7e9dc039e7dd6b4ef1eddad28bc7ff39e22e398fd7fbeb6d132abd95f3b8abdff0636b9930af9cf6f2ba2b851dfbba045be3d73b5ea9efacb45725709ceba5fdda24eccaf9be9efb6fa1afb522816a2c219db2f6de67f447b8327b19edcf9fde18f31d9372eea3e658726da1a446a81566af778554fa997911fa85b943de71f696663aed98bf668f3fd7f84ecaeb9878d73a63cd90f76a8940fbc4985f0a37debeee2148e8a1bcb463d9b79e938e1a79fe9c66bb73fd1fca39628d54ca6b3de774722f07d6f9f3f8bfedd056cce3e8d9fa7c3fdc19d70db710babd9063d9edecb9df1c83c065d5f87f69efa79057205ce86bc5bc7a6b21edf407bf5beae7e7d56eb8a184445c3e88374e5b29c6345f3c778703ca8ce1dcd366ce33f4d69465a953c977fac8f506c7b766a92fff7c5e9af1d503dba1fef4d39fbf9f527f1e60ecebbe30d7ca6b9df8ef20779fb1a697672c65fe5d075957a861f733e22f2be539f0136e0de3a437f61d297743f78f27e7967fedf5cdbb8d4b73941cd73ce5b4916b36a2f7b6ef7e6b86146aaa71e03fce5bdf4f67ef5ff27c037925f57e6ee9e5f69a631b5cfb35bdde6a3937f5fed680c7be65deb577bfbfed970650f69c79bc7ac635f28db16abde1e7f8773e8359efdf1af7bbffeef85619c4a9bdb4355aecfdfe98c600eeaaabf7f67faafbce30f85142b825ad5af71af17cc1f69a7e9d3f9676729ca50bbcfc9c7b2f3bbcf963c9af16fc6bb9cff44a783b945aebec8b0578472971cc7ef2eca35f81edb8560d6f0d9c45a8347169c59994c328c610020061291a0100007312003048241e8dc582d1905cb691bb001480014c8c6ab44c2e954983b11c85411404410c8340000084186400214649c6b207a5e84a4baf2e4dbb773186425f343b46284b55f1c9f21b886bb008b38f7d08ac36da0b9b2ddcccf4626a462c3321d4c0a5e907996084247703f2563bcc669aeb9d820fc2d01f4f3d2ec45cdc4b1dd1addfbc9d4540101631ed342da08654c64a3cd2aa43f32a011268a733781105e54ec87e1012ea6a2010a35e4dc1e5f48590b21f8c13d7c8d813cffa9761380a90f9ade8e748b6fca7e817c810bbdff1d0c0574eb00664067eee8114798bb792fd313f41cc0c3ffcb6c0c88d100cef1dbbdf2e2ea3087dc36a3a3bdeb0e73c199b6325f1546c2864b24bae768e9372faf7db8eeb0265e490328516ade0d230a22bb277bb6ae45c6b4936bc946b895e379b8c516fba82afd5d83e1d4b92286c458a7eba4909414a92a32ebd161e74733df7192d49bde98f25774a3e18c401f59dea3ca4021ba0e18e660a50f3212a7db52534d9cb47584105ee9269629d41ea95899d4c0da4657b898e08f00f8bd7be30d6516a27b1d2a9d802ea16929b27f190cd8f2308d461c755516b29724404d358113e20573fb7d42feddc2a0d2bd3d3361896ab13ad0c8a1ee4fe3f8cb792ebf2ccf73c6f1b9ffffffeb816393df14870b5e0ffd1731d01b43925847d740bd3f3af2fc2ad08a18b72d456cf59bd09846a598ad0314420143a9b6ddc9f8bd0eeed0a8aefafcfa6368e8b13f762f7c810dfcffbae72e179ce3356119abd2beeef63615dbcdfc8a4defccf5da55f44efaff42eff60d9b7c952fa11b1f47f94f3db7863678a40c898bd08e76c595423fe4159475df1c41c4df7131c99b3202107efb1818a0134eee626fd50ac14c4bf2e88d5c4b77994bcc860f5e083ded4726bc2db8c356f50c6dda8bcdf70fccc2bfdcdfb0cc9b9decc4f9c71857f9f8d0f4594810f4acbeb8e5fa254748bdd4a12e1188f6f0abcfe49bdab3cbcf7d81aeaf4beca0a1f2872e326a95bce12184c68464aaca381a13d2a88dd9a93c9f4d388df0f93b14f5a0942a1df1af61d6e7239685210eeec32e95126aa6fdd07bf90bcd60faf29bdc2005231873b8ceac2fb8766853079d8884604dd88959a2492d67c44ce0a47b02975e59bbb62a27cd61eaf32e700e5be0700e621484a58fd100cfd1cea9845443f6d2c43fa204a10891952715d05a0608ee588e839ccc4380b9907e68aabcb40e5113f65b94f97a280a17a5f17613a6aab440a22f57b8f42b682d832f5c3bef15a77e875b65a5946853250a1dc18b94428a0d292026c066c91c2624b707e6a72a3f10cadf55e1b64500427915942984ab1c41997a2e3cf43f173f57a3101adc9c6e539efbcff33a303a9687038eb31a624a2134339de4d6a6b430666d1b5dfd8d865627031d26c678371bf463d0b0ca1fba37145a1b12d15f33c1c58a7c8d76d13f31e7c82bdf6c7b535c40fac7e24e1b3c4a752bf4efe2eea1b6b9f277e29fda324df57c26f6028e21cbc94f1cb8e15e27ef9dbe0a20ffdd4885ddeb81ca9cc7b9f0c4e515316f569a725758065e530691fff7b3e673f83288686d032ecfec2c4d96dcde4c8cf4e4f0094a6ca7c34bd45bd20e185aa7bc44d52f3681dca9af9c7eb68e54b0b60b99a07ca669db7a10242b8df6a05bfd16eb69f0e77619dc60968374c49c7da6877fe1c9208d1681de868345d851aeda6f1aba163c4dc68d6a6592e1b7354e6f8d6745ceb088e4e81919a03c1555d44ae1e8ca68616a2e3c649d11fac461f60ec5d2fc3d31c36dbbd9a4536f483440aba0681664f9e5147bba825305267770cd0af99b6ce0dc9617b21fd429e3644712c12e3183d09d848099612c4dce3fce6aa2da1265f0e4a0a66af8300368ffe9c97800e022540a822bb5461a2f8f1f474bd416453927ab2f25148b24e654690c6f7472a066fcd1de881d6898a959f314a8e827fd4ef6f0c3ee6c4317cc6b5b8806724fcb17cddfe18ae2bd3db821f2501cc04b9e334a6fbf5a85e73f03a84f9fc9f22601b5e30feb1fbfb6eccca6697dd3d7dc9caa2a170dd5569f913b3c14aec7e8688b5248e28796267978cb8f1d5d6ad5127968ccca20d25684aff17c3a3febf7318df70d4d95bec770b33ff58b1a7c83745e2bee8a71297009acbaf97e970fda56eb9f0ce6d89b6eca0ebdc6d8343c93b35a36c472b129e9b327e341cfac8dfb19a9dd01c09799411f36e61dd1ba06b936d180679e2d2e1240cf432f88fd4e45b932c2783b6b92256a49747f23185b9b4c8204ce65bc7578d1de21e4506abb690dc7160f788718a6a2c34707838bed73b046e50ea2394707299c139a34230370cc0ae85dc4cccd1a24a1c7ee6d51928f44fd86d2ac56c37917142f1d173bddb6b9660656c3295b27cd63824d3e6f1682ae81de04a80e9ecdd3f1b96378ada8903d1335d8d60c336f8a38416b2d8bbf11709308fd6b0ec4ac293fd72a4065432d0dd53fd9323003469b7e20bc8e7f8b85bd768eb7aa061914420cbc788f8f9495bba5783af4d6c111f377de5560e2958cf66eacabf1de921422d40d801d1a4f6d832acfd62e2cb19a10f7753817400ef10344ff79077d52f3deee9e8f82fd5255c3fa37237c5e5abb836263653995b9b7be5da891f8b8cc8a44f8e6d0037956ab689ff1ab6624564e14772dc616a48062f8cce7cb323b92e3bc8d14d08616b025424c7e5e600741c9c4b2e09fcc1f6a70fd9f3c0906a72d3975e0f182bec51d200051f45a0856d99652e048876622e0ed5b2c07faa1888c749ddb9cce9a0391d300c5e94e5a49fd43560c8c2352ebd6aa416765b58531628145da39a7bd322605cf2f0061efced91b802e63d50382bc7d0856abd4f017813242b602f534a1bb4f03e90b9d413cd984115931088e805d7c0be2dbdaaa90adb341ddb1d3e801531ee124f332f53ae841f701089710c1e2ed219d8e4c863448a2f67ac4e72634710422847286d48bef2366b78f606ef3aed1ee3f56c2e44615b294fda7275833991081c525e11c4bf6e5f1d9fe5f77d03f76809872de4be4927593c6b64d0f554a3630b2277ef66cafa8e39cf6f7702ea0add7c13ce53013d2cd1ba5c8884a7483a426264dcd4887ff6d7b07469ec651d060842b44afe989f25010c96471a4df8948ef043f3770d3a22f421d61687e40774ec0d452b537cca76e657f0526e956494ba992b8b485f6aa22f38168185d158d23156b0d916bb8c5d62544d67a09aa92bd41b10ddff32922af77392dbb4c1f91863141b921ed0959ff2b53d1d8846f48454592b27206a3f6a4f04cdc1a7e34206f68108c0fe73cff22f829590ef3e61758a4d20c1b64e8c361b2ad539d14fb779cbe4d921b6da26b605eaecde9f5110ad29324faca5cf79869035924ea917f4f69625f55bbed36ab94fb16800f3255f353668565700a617e378e578bfdb9b19704c5ab5f6b67baf2d84c12b49a736f1feae2feb7db3d462be6b09bb09d0bb18c871333de939497339b017d99946dcbfc94266cb5e6deb46f53b7eb2deed2f642df66f5265afbbdfeadab977eac94879ff9a823a0fd0b08c9b2beff20e8a3e947e29e0a69047b18fa24e4aff947ba1ccb998385d6423c7bbd07006607ad4946c8722d3fbe7440dcd28371b346fd4346cc72133c14c0a9a9eef6c10d3c3a0e91be86ceaf7e7a60143b0c2fc67094ce811be0fd783cca5162bb5aec0d205ab4b2d506c91926565962ab4badcba45ac71d28c02cd9f3f62681c212f8512314427e895096d921ad4bf51cee2b3fb2d8e0dac0673529ee29b425140d3904490761043a5a5fbeaa8ec53ff1a2b47caf733653af4e95cf98efe36553a723f252d94b60ee7495096518e8caa46ec2ffc67f6186dbc9b73ace2ebe60ef4e14e6f15ceef95534dd4201024ea757bd9f95e9796d1ae33d184e76e93b9a5da10ddfaa63cc3ce799eb35a0ff234db89946f58f31b0b4c4a42e6ab4aeb0e87ac6536d43079be3b43e32fde7467756cc9ee5c16bb3c375ac75bdb650cc47713ae4379c9509965cc8763049d4d475fe5ff768bc3ea77cc12275a91949787e2d3db165c9596cdb55d5eed1b171f3473bc80f3470ef6a0fa4c5d3cab6733768ccd76fb64dba952c95e2563990e4d442d2875fb1b48b5067973e0c490ccceca915e163804246ac9d6daa740b6e5eaea0a0ff08b2791e596c3d2384236580b9f39b1622c58cdfed790f726071c8cb872fde1fc83f5d2e0b57b56cbb216a9f17fe08a9569413f61cd7529876bbd6941b80a553de28ce35a32409d412b0507d24f63c66fffa65321caa79d3ae7872a56155de729ddbacf99f39b485f3451b618d689eb5ccf3d8620741166b41bc1da3406401c9d1024831faa2d95e0c6042edf66c9928107ed3ea82b80783ba585e56eb5592bcc04234f97b6729ba6050acb159a186ef2b5814c248c0a2cd346c728fb0d4c7fda47336a1e9f24035bfbaf506a2592ab3ec849db155954846f9135ae0c1fdbe078b4b34042cf6402e21d67bdce431b8be6545a21953270f733fdf6cd5950e1132c841290bcd96913cfa0d5fb1bda346bde371536ee4e44ae27c4b42e53817dc6f9a291c4c8743695efcb2ae4ef2cec7a13ae3d5df1414b19005dc13d56a86a8403119f195de5aa47ca2a3b3533dd58cb15a8f8edeed650e7e792751da58225887c046ae3daa29e6ee23aad9767029bbacc1a923fa2874be82523c4aea85ea5a44dc4defd03811863f22216d4587a43be03a1a41af2c3985676b39b31d3ad452f36a8f651337268229c96554355c3bc5082169f04bd3eba4cbe19a48988f3bbe2697407a2d280f0b3535510f5d645070ca24e1ea0c2c2ccc89383bea5a2c3e719b84df9588283ee8f049f08fa2582bab5f9fbec701ca3e96c7281cd421747078242635ed6fb8b5eee90ee20e45d88e278ec811c6e087b497adfa6f01cb4edcefcb4cbcd96768010e4896083694a81309234e4d3d24b735eec2f184a8a1d5e4c7617c3bded87014fed40edd08b43affa796b16cd7f789b6793c4bedb4e1aa5c5aa49cc1d0c3738d1d341d0f80e880d5402ed72c8cba15484a8147ac5d02e415e06a54288ca41ef90396897425e0ea52244a540af643eb4cb909742a918a212f4caa05d087939948a4054cc30f44a401723a4e5133b5c3dc42ed75e8202c804103340770a6962a84d103883082164e62075520d754119ba8542c71216613ada9a2804e4822719eee007117b28e53a207327e4ab653afafe3423f801629f5d80931ebbdf1db53c4788da5cbaaf221df02b05be8720a38ee74150c4404dfaf6dde58188dd6bd2ee54ba54d43710bd3511214cb5b4ba2d9636c94b6144210ce99851d56215e5179ec891329405aaad67b10b045f3b80ae79d7fc4583acbbd8983eeed4f2b5f46af105a48bcc2e035e4a7eb578dde935c0974b57dacc2bd661d7be4611dd383dccc5e3e3e45304b20fca6e30eb109b622c32a9076737c83a944d611639eac1d80d643dce4a962228fbc2acfd28ee5129c8229f7a0fd9a8291bc56c43ec8db18649399c4d204b50f68559db510e6313902538fb1eb271caea9b72fda828633bc8ba3e3540d6a3ac74a7506223eceaee61fd265e28c6a761145cdb2b29e17a3c2807bbb3ea8325231e105c9a8cc02e5a243cc89841d170cf89c25010e655178540dea84d3915efdaa6c74bf99af6775bb86a9e02eb96dfbcca6b27d4fc72002b3481c94015b76d551e4771b7586cfab3b0a5958c2c124256d170899ec46db059b04e87d358d6ce8441624895dca4c8e117f9c40b72549d9d1c480bb189584054e11b786b80d9e543e87d37dd888cf60bb7d6c5ea23a78c58ce1d3d3fa90ccb5e4b1b6aff0b947d576aef7001ecc9e014881119df5672e3a56ad1b1d4b541a1e8e44aa2c48c0cb75db46ab03c92b667a194a8292e32d6a55675f5bf9cb10e838348c16b4ee8ee31865bb0525b01c61cad4b7a4c00ca170db011f3056ef7d2a9cf1117cf17a54dd9854d5a75755f97ea5a012b5daff5403a9bb27a5ce52cf500fcc4209aee76e1e881c3ca65dccf0c0256cdc5cb33733820c1922cf2c0de74ad71439c7cc700ed365a9b80466b86ad788709f3c0df47df32827e3d43e0930066820e10ec62cb015588cb6d970dc63c1f624904208121fe89e5874552478d33c3539e5c9e384318aa100c8fe1377aed30abb984a9df34bfa19639d02e05a61804625ef4a4c3304cfc202c4f283a6fe10c2024a5411a8a5261a17bdbdbbcb4149298850eced821602a4804c611ec07f6bd22ca9151253c7999144aaffc4b8ee9d220139deb787e6e2397008f153a7f8657e063d969067f9870037f90a08abd891e595cfe3fe6689335fb671435361907ca5901c620bdd72e7f2093ae821ca231d192aa388f134b8fc65c0deb56416b3be01f314cacc52cadaf64de5e402d2ca1ac11d1306b9a884aac884e0c035cd89fbbaf220a149c78c18abf802561df182d28208ccd1965333f559311be7156cc7e6c115aef44fb982b369ced12a1761e43e6917b5cd7c6a8be51468ed995e42b4afb1c5e390bce4ca88fcd019551c533f4bc94ce907791d4549db1f2f69b12048d53a1057c2299354d719cb5d2a55a218e0900962173b63518f0ef214feb70474ea6c17c9903a5f95ee475074b5699c278bfb4f205450b70fc6dbecea019155a4004ca7d77d1656cac4c0f58bd6d17e6740c4970ea09baaad5f51a479019663732e40c079e1bee21db47d5f3f87cbf57aa99fd1fa37893df853f73d16f31b62051e17ef5e2422b7acb67dbf2bb897deacaf308d48ce93d0ea62bfdb13a556182d57399fb3e5f915d82b5fd243138593d433556ad2dc414c766b35439efbd778083b3015da8285ff019c5f8ce9ec1c5ac104701c3056052624eff2174b2efe57773a7f05d54d5126557fe2dd6e57d258184fe5161990141d84f75d52bb6ddcde9344d9b7ed5f51ad16f25ae67e15801a9190b9070b6788d0ed5a803fa4d0f04c2a6686c6eecf252560889526b74cf027ec65cdef8d3578d36a04d75ccef31d4911baa4aaeca9f0c89f6f2ab818ee5eefd6047e622efa3ad70fc7bd1fb47942a64ce085dccb5cb50a912262bdc48adac52005f50dbd3b1d69e08f6ba2653dc09c282cfa0fa19cc6065ff5e75c7e963a9add3bb78bd19b038367bed94aaf6fa7c6789ff77d0183dd284b4cba069e12efbc36c03066caf7241f1b72bdeeb28b864fdda8ba9796b3c6cc185e7a76abb46f4a165db664e073d29249619d5af5935ef9c9492154f82243a9f2f466212cbd030abf72cd91346a405fa790d131b3f763087a13e55ab9683d607802535a71908e6709cfe89116d5af1a4137652e9ecc374e9f2a0fb7bf060572caa0a0fe55d097367ecde0b36ef30cadbd3b0e5619d837a74c96e54e750de95623cabb2b7930db7231c264d41be6cc02c0d889efd9e7ebad53c0e415d66f557e70b73a6305d97cb7c9fe79e3b868c58991ac030fad5fd0e96e8e42317b0b179025e39943fe6226b94dc488532b99eb0650460dc07412af3213a4665eb9785347345d004493ced526e8a30c008e1bff16ca18b164992b1f275ac201c6d1e559fe9c928200e235c74b21b90ad02b16b284734f2f4b198488fba7670bb61997e923cc3d74760670df3563a2bb0a2ebc90984f0117bfcadd0b0349ba2994175816540bf429ba4dc3ce0fcc5c2a23a37b2dcad2b27a3c85e99ea2e45c878bf94f27d46809ca75c54897c22f2cf9146baf0738788a6ad97ac5d1bb975036e949e0efe2561c20d83c28800b9d1d3ca525aaf3436d387d73590bb2c4e3efbe79e233e7a333e50c639ba07f116fee5f6f20c1e9fad2815d848c89289677525fcb9c21a662bcb7e70dce7d688ab492a732500c526b47c7068f59e2d1cf60bbc60b7e073496b7a5633e301e18bdc2f9c1528b6e4c50bdce3d0699dcf6b50a199711cea0de8b060c894fc8173de47e4e9f39f8a11086ee6948333ed7a1dab80e7254e963eee0a4cd300279040c1ab65e87b748634cc12d95e90d1db63afdd4a2677c7941dee18c91f2d60b925cf036670d85b6cf70fb960d105ffc4851de55f05ea8b9553f501ee8d4b8ff6d787f32b6e9ac1a287f31e4efa31fe3b065fe8580d8397f1b8fe7a1ce09c3275897b64d10f86e82799cbe34a5030e12b46f53d7874360c6ca23fe5c94c812a7af117f1ebcf81c0ba8edccffe3fa11f304cda6141f274dca1cafbc92d3ad9d9915d2239e5e23ab6f98d5663d278f57a0897e2a44587716e7ca993638decb3a9b46850993c005ad0449168d7714cb4a4ddf8f21590d1325843cf60ed1f955ec0edd5cacbba4fffc6945f6c30a5e378593b2d291df7d47eb48536cda03903d8e11025cf14c31309850e69da5db39fa66486f86727adcfaf3dcfd3eebbe13ae3f3f40935fd0715ea8340aa8ce5462c2384d5bbd97380fe612a90f572ac2123f1652026d168277eee51977d8f9ec0bbef5cf41d7f0eba7c33a1bfeecc9a375e0d3ae7f2a87e82ced72b3cd523b58e7fc8198d5067b23f1fd3ce4f4efc39b52a71e527998792ff06a8afa95ec28f113ff82fd9e9f078bc2bfa1c2fbb35441d854a59ed4ed0b6979b51fa850c7bda0ddedc14eaaa5dc26f9ca8780dbb9b023eca119d1105542e50645f217ff00838f4d901d22cd8dcb00c5c9e8fd4b66a6a4878c5501232249d138836ad0d31b9780b2679a915a65537c2f564181bedd77d8a95c7d42a74754264f8a491250f38adb64bccae2778cb269fc8c6d8ca991dd15e5812b174e1ff9ccaa7f63963fee46c0e49d63386a16d850ef0f40b5569a1e931292fc329cadf3f7152e635a1ffc6239c3cb6cb8d67a544dca7d6d0d7d062afb7b050fdf800da9be294e82c50402749be5341dee9fe9cc6b71f98be7a4d6c0ab4eec780e1b6a8bf9799d540da005b7e28ac067b13ba017c2af50b162f4fc2406e927427fa761b67b6e15f3e7d3eea1d8056f61d51cadbeec76739ffa6b64d9f25075638fdf5f17a9fb9d61f208f580e350c9fb53899fc8bebf7580b788dba697b248a8119251f5061ba614469cb3335f63c1ea128401420610bfd5e211bd86ca202abfa608f0702fdd17d0804f5094782364c728001ef3dfe78d07ede11d6f1f49eba3fded30707c3a024e4fccf7b653d0d4df627aab87d6fcb011ea1da6ebf2c3cc31d6f25a9d2356dfcff531bafad9f9c15069e24f4a1b186f8d01e3446dd7d542a9c690e3adb69667def8f147e99c0f85452fc37f31f8e6a6622cf58f787740e44e7e81863e9bf5d3102b66292b23997a74dbc6f0d830cc221be41e81be594b153af73b58b34663b957db8f6c8bfc64c89a619118f9fceef93827118bbaebe17dce2273183cf7a5eaf1bbfe2d993649a7021755c302a74a2c134f225afb3d08ea428763efd5fbb3626ffddd45dfb59f6bed167ce3fd5f91e7a9d53a218ee3373ae703111c54404e53fd367e825b89eab7ef0903ad8bf617f877c3372bfe8097f9b71b643cf94c0f94671f3d36775a63fce5f36d6d5bd0675d9d0f73892eb9a04bb261fdd6bc3554bda6568a7a31bef3caf6ba6db9d4dc9759e6738e26bee0790a7250330f67f863e433917fd91c0b56dda19893a4c1eee01d683c54e579a79c39b7e377d04a21ab39dd8e6aa2afdeee8e7c0eabd50afc3545107dcc663d7a17e958e5dd194d8d38b582cc55693c89513ee2713813356da0b47d9043c38661a89c32a5ca2e2bbbc45a7883f9976db1476123f6aea99f5cf881c8935ddf4f6d1bf496ad94547c8bdc9d7cc74ad31fee869ef6efb61687e216eff660a0ed27ce974192bd7f0fdd3b79964cd919ec8b599cfc6f07a33f6d8abed273d51d533f6cc113b17b5b8eaedd2bc93d5b7c50c917bcad499eb5f31f9d26bfa892da3bf93f4b20b8e107bb3eff949ad23ded195338fad90ba13eae8bad4a0a541b881dc36506d86b341846db86bc6b506546dfca859975d42e49de342fb718bd17c15d1c75ce170769709b67a10328ff471bd764676473072cc5ab9b1ba0d096fc834665b3f1cbf938605dc241b64ff99584dd30273d81df52fe758e02a0547ec3a1acf1bc7e0ad4531fea28b3336814e326144109ae2c189e3b0a62db3fca2d921c67fc226b26f16055e537a5b88679c10633d0f8135143e9b2e8b672f30ec841defd766fa955685cca188e448c3f82ed5960e84aa9787e1145ba19bd97d74e76da1ba7fb9de8d0ec184da7c0f8a20ea2ca0a7b51d5a77786b71defa251674eb089401d7622c4befea7cef43d2d734fc2854cb30aacfe307cdd868fdb29841f48934db6ae3ed18d1b36c1c05e38049b63b87305e22100cb34b383b67f068d3df3b1aeeaa4153e451834d3bf376a81a8ddec8a8c82c4b6c6a56ff94c142c1727635b45004badb22592a85235f9a6340d8e1734a6ea432a0cb0e2a462f6cbfdf11ed7ac2e4a73553c304124efc168df4cb76c620dfe131c8c329425245c5008306b881bfc503b76e508b8a9d0255a72d64750b6fd2c804246bea28b440569e48ae4d776905f0f5381e4357aaef7b301e1dd5759551703341051804fef7619da525830ad1a6d96582bfbfa0e53e82778c2849d581b36867b8f5962d712816527ca2e9ea456cd5ce0834b1e818527140c59bd0bfd8a30363411fa39ce54f029b9e07ea1453bc94d7f502e5cd14e32f6dbb8c28b6e8779a3ac6d25c0d3c8cb4fd4453a0de6ccd026d1388702191f60512567da2a4c58e552e32fcd858c26c756d2855c721fb53707c3530399064d317894a50d51dcb4358a69bca0258a54b2d00298804dc426531aec7c7ec3d6db78ee680bfcaae892ecd827df6d433a9f3c020c83a8dd08c4b689f9e876aadfec7f0d5112836b9dc7dd6144551ff2257d12c54b1dfee77cc83ab786c0e1487eab50fb168965fa99f89c870f662f284915e8a92cbd13b0670b13e099df5ff408f319d6637ef77f945f7136de9b9793f64393a52cd0d2223e25c5fc3ba77bb8b343dfe81be7765206a6418c76988f1ecab92133ba458b370f572bd8a32b02739d6c070c2b01359171293f1c81f370523de63ff099d4b676d1793e992e5246372c4bd7324c2686f9c8d57b5262876855793ab2f70fc0a884c774e9ec3f35b96e3fa9ebe6174318839ff2d41f482aba8b65d5e0e7c0a8aa94cf89bd75e119adad3b68c0e19d3b2879cb1cbbf88f85ac092bc6d68d106b7951a049746513bf5df984b513dec29387fb919bade65b73b91aecbc8ef99dd2a6cc1dcca60b902d69378395b8ed8789a1d68240d794c5a6edb6039ac041a1ec5377b2140e2d17fcb1f14d219f6c07f7570d7ee6c214d47f910f8a978efc83ab8dee9c4750b497ff4e7bacfe14c76f39593c0ab0d17c452ecda0b4da0c685969737fbf789270a2b076b35f032d31235d7c22ef36b261ff522ee74c84fe7f61f0ec51da8b4e3702ced1072b16baa38d5fdb201cc8b9c1aa1027378dc4b0f78f8c6b4fac28bb45aef95fed4b193ef71f184ff4190adec898be568b03dd61532c8eb6ace2999b7f7a4bca5fd58f14bc87077191c65388d0fcc312b77baf78386318258b14bd586cde2e47110936b0585b9cc47d2bc7a7f10d92feee367b2fad110d74d3cdcecf0402150f3e59288e697052c0570565ce3d8c08025440e0f2cb318324f636e8ba9e36ec66d82dcacde64b6b85321523f4321fab13cc7d7e0b82a9cbc19945a40610d95b4395537ec95adae98252f7d24ec7a41ad42499173efa71b7232be33b010a64280e9ac05d0dfa0af052d943c25114029a8d741ad523bcd9e96a44ace936f492f549fa6d5ff1bce77e67d1543e86b18905916854f1f95dd43f0b62e46350b532b589d8338d7c790095956dab88cc90cd84674e03e8cbb904cde1e3ab2d6bd97e8f9da08696717736abbf2b3d387c6ee9edff09fcefe33ea82fb27d8841b6aa6a3fbac33eb9da8d9043906832dde47bff7bd4e9f00c47a545133e28e7b1d481c581147e3f5c4da4abae8cce0b849dc419b45d788bac1d7fe194b0618ce301a7530b343f144dc2bf177e3aaa03b811c72094fedc967da5de43f370e63d99b1c1e8860503d197967abd62158e8bf18bc1023b5471ddd8011aabf45694c8f08cf27e03e20be8e094eb04a705b7a8c6ecf71130b964e0a8b710b48200a6425236341820a6de6654fe30e4fd8cad4342df56ebf9bfbfa3b78c3c5615458c80298fad83a6084a5a807cd51f2e4f42e83f7d6e90edf00a961d77a4902abd108ffd84cd76a7c921c5fa730e74641ce40ae96050dfa7e466e1282a0d20da3782098fb905312f54e0b109521e6b9370fd0031a20bd544b5616f629885edcd13241d61b50eefa1745dd18c501966fd3b48989540bb5b1de25462cdbd45353a2fe7030b6fd066dfd0fb0d5fea33b12fc3a632f13a821551e5cc27a695cf89bc483e01352d094837b3c50a65a96ef2f0b1a7f4fe100179d9ca8beb1793b1a65eb4180c74b8d2b7c3c01e2a8554ace7b20613b24e4aa3b856d386cfd3e7318ea108097a8c97699d0def0cb8b62def6231170e8bca3e51c198093e7d9799dd2adcc4c35995dc0a39e66459bd5afecef98d85c86d9db7a82ca9eb340c8a318338f549769da01756361c6663105987f3a740694d2e4c822b180adf34a8bbe4099dc7aa77905cd312a7ab828a97852e2d8eec16aff44fb618c3bda8d4ab889216961ec4ca7e1264c7f5d32d3a26efaf424a3d9a4495f131720ec5050f54638d23442e5d6f136ff5f893e6ef3b3d28dfad7fd7cae8e8a0ba2c93a073851aed5e88a1f91beb8f3afbc0e92a180ac9f98e35696e67b88ee43c660ebf51caf729a3e771942fb8e819f9efb8ad3d8154d0f71cadc285010fa81baf83a014ad337944f4ede666c2d061ee766a7557df2e1b7b3928fafd9d0a008e31c6e10e1d3f3c95fc3fd009e4503c4e1f2fe2dcfd830be5e615e4c67d5f69355c58e230c97043abed702ab8af1788ca0d4bb45cf663ce00ec1be736ec3b43efc0faf79482062dd07c58d9fa08d6feb50319de6fe25d7be58d8971e17f7a2e0a11ccba66144801a7efb1c5b2ceab3190f23fab44182cdd0b62c2507569ee5fe83e8d4a5734979b3eef8ef432b2b66289eeef77e2fe8413dbd720efb20bd1d0355f70cb71e3aaf5e2b388ac9f5ae3e2b8ae9eb108ecdcc2f86c572cf5eaf80810637d2421ebdf80d6e63c064b1011dc59fd2c08343efe6f88f9d1133b58991a2a87a5aa1dbf76eb26be09e7068009d541b5219a3120c380099f45f3476463e06812fc5d820488a429f2385068ed054b2de1c7804034cd8bb33b209fa798f6acee6a58c66b8a846e4bf4e95b164cae763ea5cabd495c4147aeed42d9529754f79cf450a61aa2b8c96cdc5b1902b0ecb2a168a803f63d2569be96d9ce2f64af09b52aafa83f42f16180a590388014f600a19a02da5824fb8f66f86d41c6119d724dbeb7214f06baef17f889765e7bbbb79e67b1000f059232223d31517585d2f47d3ceee75d1679439722a1e3854c14550473e1297011d13040d610452861e39225506d2c777467f6abfe41376f7331870a9d00d96c92ce3d620611e142417d2ff3178fab844f90ec0eda87ac23f72144953b5f06962f8b027377a77d37a07f18739b839b7db41cd62a5b971f9be17f70faecb972332a16d7863165ce1dc43ea61d0aed9a5f400ffbb1bbaa83db7b615f7c240c59de73908138ed2946d6de3f144f046404349d7962f51b13ea836e712467539e8b3861cdddabfef56bc5d39d873eab759fc690b3ac8edf77ccd1ff4dd9f73e59853c7595c39d50a9bfdf096d2ead66d508296f37144b3058b6a534c40f935e24d35a11f3cdc98d64d8ab8b213a0e15ba223317e4f22d4e833c902833b59ca4715f55d4a4674c7aad7f00a5bc12abfb943942c26aba1e976742f485d4ba9c7e1853142bcbc945983d7494e7dd8ea060f364f365036c2e018b8aee4d42909d81d69b540a1a144f6691309b0f5bb999953c6b871b8b0dd573061975e91029a29be6f2bf50aae7e91d030ab84f7a12d40907b6e23481754c1cf5ac6abe763c3fcfc00e2eea343a0b1569207d884cc03d3ff1956f9cb52a3b25224bb372e7643e4a64a33a648d58b21a21d7bc2c4c6405d40ce609d6de10d097a68b541bd054fe182d6f259458bc43f6ea23e3a02554c26418a6fa1f267489e0e043578cc06f3facaf55c429a35c0932e21bc8d8051c18d9c6f3c6621f397b76a9838d6ccad4a0cf94bdd7b80abd80b9d7a6d597ffc0ec60296e6f66964eebb1f71320ec7164fc030535d0db177b3250f71c84bd360eb238eb543d3a007692af60535a2b5cf0939de66d696575d44ae5a77c31ee4a7b9aeff5b3d67023caeccb33ff987876dc0b5be9e3ca954287369ec39484a520f67e3b7cd8d6a75b2f51b81173d5e831f84286b82842a6ed27e993acd9c8da3514ff1e463e47a21e32b2d2e7cece120948531ef905b25be4d0972444884d378f9cd8d5b7b44c5a519c680fff3085e5f5dcb5a4a7376334f21b30e02c5e34928e5579d720b73da7c7c34e3b58d011fb5f22e8eb5b305605e32fc98d953c2746ca89de1a49d8107cd9a00e749cfa84d9cabc80427334ed6208742cc0ea67e6094eaa1c01253107f871f9a9acf20c0742c333a2ab5d5d49e547b96d68d26d1e1adce22bfb2b37bf5b1c1d5a7d2e4f038efba092abace9e3d40e03244468781cf04155ba0b8b0d8b239849e99598331f794eadf09eb721575aae1351d7c37ab7fe7b416073c067ccf111a9d483c26601c8408dc2cafa62a2a34d7625bf413a8b3ecccef4fc96c6158b9a7a17a889855cbf09a8634fe85040f47d2e1b22511db9304873c736d4b86824d30315369c25836effc136ec4062553021e0276d2c5620ce8ceffc3989ffc9faf94f5a7d563b43c0365fe7296b8b92823625b19178df491d6730dd0f40ee20f205d01a9b3efb0ac2796198e9393da8fe189fc759203db41823017e573be77e4c8ec3ddd76a7f2ea7c12bfd700ab98b2ce338941cc8bfb60103a40a3f80d8be317591e53ae1241f2da01b72715aeb0f39ba72fd13c30bbd41c1d5347d363a0f49153f2c7878d3ab924b3e43279720af7de1ede2bdc6af63cd57b6fa221e0d8704c79e2d250a40989645fe3d2c34155883ba69aa071af94af989a118ba536456e4a07387dba36efe7dd5207ff677682aca151f3d6aae1ee2f0498fefb2a9ecb075cb3f9de8d0e26bde5bcef9e87a5377e10e9ea97689f9f2e1c12b6812972a5099f1a0c08d3790dcb4d4ae199bd2cbc21e58d5eb29da4e12a941cf958c6598f2cedf510bdd6bcc4bcb8dc1c4cbb7b78db6e5f334e0a1dd054beed0ee0bde50afeeb8423eee385b3d6dee8b0f1a7be1d4b15b5b42ab97ded68dea7e009162cc7d5d904d509082a26445405eb9af5dae352446de141043b21962a8ea4fbe66f1a9d5bac59b27f17c03ab7935cce7182bf373849dae0ff59533eab4e295264e61ca3f68be245d5956536d16b517d742961418151bcc6b531d740be1b0b5f062d5f7bbacecd9d8b1dfa08cf99b9acf2bf0c98945981d78179ae8e26c580674b305be76d6c622d9bf2da6af5b8e88b5504e722fd0d9d02d24f9e1b52c11c1d405c69b6c65b09e041a2538b18c9b359b9a1645cf7fb648b657d4cc3c178699dda0789f14aac0f430f552b19459f8388784fdcec533e6f9c7d3ef4fb86e92a4faec977679ae8616d5c3be23ba8f141fa685667e36589c16658fa89c07d7fdde08c833bb94f95fc717a24caa1a16cff639d39049dcfe56fb424b78ad1e344b2bb7c3cfa8f3e9bc49d5c9e30e7322ea6ebdae2c5f05f4219ec019df9636078886f1a86e3cade0f035c618c091914d261db5c3cb5287c05f4703724058bc8df0b5c89884e7b1bdd72328481537c95d18cdee446ff399544651f1956b32ae3912f3066eec5efaddfcd578f1bed8e563d044f9d3d3ec292e001580a9a7ba92d5c77f8f32b0ba24c8c5ce4c78a1ba92b472178d7b94739c519fca33a143e4c05e50d1bf0264f46d628ca6786c674323e0989b76eebf39cc42897ea23da4d544ff8a0ec8a4fb44d4ee751522ed652de048386cdf651a655fbc67388707c6c03290578c837db8f79aa37f3aea33b4a49074665196e75c97dbdac9808cf29cfd53b1f1d59fe701aff68f91924a02f67c1b3d75d68964ad62dc71bec056404fe80e96fe3019ea81bdc337e582e2c954ad8eb852b0795f39c204af63b8570ad88d4eb47460b797ef2195909ff2c792ec8277524fa0b3f5f9ef5497890338f7ced30b856fefe3ff8606da0fb1a92416629d5ba6b3f37bb54a0271918ae5afd0faa15aca23717bc2cf5ef1fb06f21b901a422913be8fc964973641e57045cf1d6339298247dd4d9fa0c391579bbb88ee80488be360e7af9f68734f4b5fea9ea39d8a527434a46da78e5ebfc783aa59969b5e4e7b5ba459d832b491b59eab717f8ba1c227b562851e26cf66fbbf6b5e9c53f697c6da00686f408568ab5dcc415622a1cfde465fe9e636f84cc94a839da3636c13a24c0b216df6630e1333512369c23e8c208f27400de1f467cf8996be50d5ee169f02f3e90b159f2c3531030a0f57031e4cd887a4cde7d3a87d83d17616b0a9e2e6178447b23a80dca11ea318e7e73ff7085fc27a31da077b1500ccec6e3e634b939b0dccbdc7d1cf9e0a533bdffbeb3872a53230e20fe823176249ceeede4ae16fa1392badb1d732bd803a93e2d8ff8949781f91849dbb0146ecd276e8e9ae9f5bffd30a75b8f97def07ec1fcf93a446650fa02811422ecbffae1b8d457f7cfa738585f05a197a6eeb523ebda9d1415d7cda62b7bd9c917d431478e7263dd8713db6d8af75c0698ee476850b9d707c4b4210474b0ab0c21b2423800803eafffd66cb7fbbdfb6526fe452b19e0adb16826f5acb09a2e6a9b0a3e04d21b5939b8731deee4bda41e081dc4a0dce2a11388139a2df4ea33131d34832479c1b2887d71019fe0d548cee042625df4d47500f70a517eb43282f29b4821183942bc1dccaca1b889941cd4c214d4c209318b99ac1c71ac7424aee55553c3c4dd71c365d137cf4a44c5d5b93ebe3eeef99308361aa1a6a6ba59b132c6fbac66be21b6ab3dffd74fe02ac6ee42fae30b28b824892407b08423b1588d9451605ecc1de724d8eb20b54e706f23a7ac78290e4abdd4e579b601346e35838225c3af6b3d3b26a343419ce5199f5e8b7f5573af014f7a50e9cf15cb3ccb522f6bf0e6ebd5f3174638d1d206e6434ab51d3e219b4ab64f86b76b367ec0bf97be1fb5c79d21a349df2d93f11ac1b5feabfe7fd4c21d8b763b76d82f5dff6477ea539a83348b812030ce44816f6055e9addfb77581f4f3f13b687b29dc34bd58f8c48a1ba2f1f39737908702bc35c1f99325d4fe0a1f4a5baf0dbdc78bbedbc14754a144f4f6127cbcc91f9056aadf772d8896234d77b05ad9178f9080a49f5f5a27fd48d464391941ae7e1e44e0986efa48efbc6f80eafc2872af25842a3d16188d151d8715180832a94447b170b3c016794c19738dfb7146a568fe833b61886676ab1822073ec8a59b58b4e9be47e5bf6230321f1400829ff1b9ae799352e96a5cb05034c7ed3b83d09bb12c9528b8d84967f91a94fb5ae1f89ebdcd222b470b816b004884a53c2b16b6a393d8ea4f116705d4ba881c21e8d09d09e3b4c05b0015fbc13a62c7edb6bd5f2704efd6576ec07d422af0f40129c4c41c0144b29ee06e88e3df3760f86cd242deaca3d121a2b571a2f68db03ab1c6ea20f5163b1e43a2d4363409a2b335847a4e767e66ffba6299cf6e20ca26f94d41f3834a0e9b67f384a0d0370568f1c60e52d092368ea2aeb925fbdf25a4b73151304175cedffa6422fdfa2131fc5f52b0ff427542bce83d3c3b8378466968f2ef7d9c3e2fc8320b1c0e53c350a9ed82ff194955358f40e03a60c80dede2a8e0eae44a53c87847ec7f126c4fcc05f0afeca9d96109a322f4039abe36dd81807c5963c4adc28399fba5e28ab16994688c98ba357cce0cdb0c469564604157d7134a8293b4098098fff09910cf91f901590151cecbe964c05e230ad8d07c913771b32a6bf14ed71730993d6e420413de0438fc60764ea21c3c57dfa600456a96b52a2f8bc6afcdc3270d15fd6d3649641192f31015d344d5d68311363c167b0a60dc25911473a30a1da09e89c57282f8b3265054aa815aa3745aee48b18feb2bb205349097a9aa642018275ce4c4b0ef4395783b61d624f5436bd7cb27a8007dae2dd379bba0cd6f164a1f674f280337f4a9b5149a13df4b3994e4fb83c36c34c9dae22991deb349c29bf807e78bf632cb49b955326eeafaa9ec527aa6a02f59426f1107d60afa3df206f8083182be626609235dcf4f8efa15d8a62821c14e0ed9c1171b474f13456681cca9dfa42aa34c1f9f1bb436008467a1d025c27e8ef064b94897dc696b48871ba4a82b47b601d91a50eecad0d888d7b744d0e96e2216eceb95b3f2c90409aba9e8e469c315b4b124bf82bc12f5a8d37fc4e858722f94d5e834d8d6ce11f88c83d686a6d931e312db72aced5e1e4bcd39127aa1b7dbc93f6a2ad3f1371af0396ff30b055760c7ddd61865b1df175ba7ddcd27eb2b99bb696e8765448a580b1cf8f2411babaee0deca60b29829b63ad6d87485607005328e662dd611675cf4e67f69701c33e1f4fbc732f81c43243cfdf7735a138316653c99e4a60968ed7c43d082cfe2dc23f8abc75396ef506ba7d130346d600b86472c490662752309f2e63110bf684436b161601abe8bb8666e931bd4f3591d5acb3daed88fd1d8d431d2b98c0496eae4a4aac335a954c7a0fa4b8d04203b5a96188847b666951d09989b4facd3b42ea194a48511c40fcce9bfb69502807549606cc9b69657cc0e7aa6d9e2f328b3bd94d0e29dedc8904253ec9448e274185eebdb529081538e9f1b0711d53e88e7294f933118c4ba0d9243109d60ae5a3a0f1bd1a31f2e8eb9936d9c5b7c6bfb0ead3510c326d838814e16c1aab65c92c09b1d08b80e83e019bec808a8b4c2e365161911db588f6c2a50d9c7340cee58ed3a89959c43373cbeb1a667b17dcb4441b3945b0b0577460afa2c148b79ba2a6fa5024fbc95b6d02338b63fbaefa876b9350b4b528b001fe9cac067ed922f5cf8350708da5c4e2055d3aee84f309d641227d0a2d13b383962c1cb8f62da5de0d7efac641bc25da71ec2b56f1334203f8a26a6e8c47ed63c52326ebd90e562efe8179c7d2f9167c3532ffe43dfe755c0f92c71b0e65a932673bd13ae26dbc4b6a9d814f9f0332300985756c0b4ee5617162e09db27552dfb1c7372cbd637e1cc21b0b846c6aab10a2db9916b029fd03522db1079f9c09ff17a2c25d066994ef93c523f1a14fd76b18fce5f1696e52a6d0215fe838899f3272823608caea61844c109889c561063aab13bad762586975a49f980feee1c18f110657da1e38e74534fbddd26ba791e03687123654caf61600f9a9368327ffd4c3cd18c6aa58fe99e76ce2e6d33e37a8fe5d937648c5381cef53243fd8df8fbcb626eaea7bf10ebb383339584973cffd2e6ab0819c7341f94b45c04ab514fdbd5896cdca086f722f48b5f86b76814f2de2d08d06035ba3155e29046ae49a3350fbb0e2dece5affce0ac6a4aa01494927ce5f2f129c4d8a8fe64d7173aed875b9cac7b2d8705a6c373a36ee18739d51eb3209c811bbe02d3b1314e1ed2d3163af23a33aaa00f2439e2302fec29f7b399479e975edaa630f4dbf68da5e0e6dc5619ff02fff9332fb155c55699361eb2ed6960eae5d457d42de25caf41726f32de3241b3d9f1dd17d5cd28ffae077c342dbc18c5ede1b403d65c85cb1a2127ac96dc22dc7c2eadf1a49dac232cfdb1cb6ccacb55402e25e016d4fe3a875d423b310817a51a34031d5e06f23b98984a538789a3aa07e00d51002c535f1504760e42d32308e497ae442318247df1fa1a8b2780dac5c497bed29810b93b484b419c9bba13ec689c076c795b6e465921dc8e63878b509cb26fb2b6a8159c797dc8aa65ae8bcd60ddc4341b230e85561485947dbdf5eee9df0d225f10f1065ce1b3bf400061dfd27d80f14123017e4ced1158713387edfc662b6d1675b32b6af5e5e258e95d5d91bcc058b248da7e1587fbb17f60ba17bde7a80191a8f83eeb516301914958f11fb3aba753293f85973e4cc6095758993be2130a9c3a6d23196a6e567714e4cb952168dc392bb09842b13a0dd669efcb590ac2f45365922deef14aead0703da9932aba739b14aedff179e783a430d974b92e352eb9e46d7f2fba1cc4083b1f128edc57652ea92470be2b78af11eddb02220a62bff3c88a53818aa2045b7d17887b88720a9107fabfa621aa6ebed73af14f78ecdca0f5aa1e042802ae9d2d0d35af0b1b5232588a69dc3b30e3d4f44374781ea21154d59f77108ac5ff360bee8fcfb7fa0a7713a05065541df969af0a02891830050a15fec2b6016cfd05ea103ffc1bee73995ca5ff74b157bb852700dfd44b387c18c0812168f5dfb21c36e2b1bd81ab6047ba6df3a565a0922054c870953f116fceb18c8384cb00bdbf565189332899924c907c4afd1e1940c743fec979ae809c93ea24d3eb5f37e5e3f22950a3f141572b077b6053ad5daefa2280b53ebf64cfcde8f304f09857ac3eb61aef7fc51035c39e02491a54fac70e87cb51cbc11875f5a360b37baaf9ce4926bf68707f43af603b820aebe1f5e7d829a682aab01d25599209e6781c42b900d3f3938e5b48385213327be0b9995a8d84a0a1874aadce107b39d2c722aed8a51a3e7edc90487f800298b220958f8dc4fc030b01d786a62ad84db3f14926906bb6f1ff14b6107b91549012a5c3b009f5411cf8a0f719209b742174491df15d09fad72746edf9477d81e498b4a32755de9e77a7c7e0db35f4df60c55b631098733becd52f18ae3fcbd8de11ddbb7c09218650afc15c689110120ca16694b4c70148cd51de211b826cc42e40c5c6eea41adac08eeda138bd2c0462bf177421b91f667d8c086488729869a287f0beb652242321f1322cb97a88d591ef947f2cfc5cac5ccedaadc240484d59b80e42bd9977246bd9cd637dc3a25fb1cf7fee553c37a14173e46cf5314be769908b3551520596344984c6cc8d0d95572f1a04a463effb9fa6ab74abe0c3e5222c654c5be458977c392064159f1c0e70762808acb85b72a5c0be70eab5f78c2468c2284b74ff3b699be85ed1cc95647302821d437785c67eb4d30f72b9b87c7c42db51e92d2a0f2e111b8c7db580670951b925432a5972006a30b890558530971b3131f4a6be9785d58c6cf7cbc5d7f2c166108c04863337c6273fcb1bb33b062e4de86b3a99289265d6113679a02e9ace4ca72d68dcd514d4fe2b3cf9c67c62e2a33b5d64fd1dc615800c15001effafbc7e8135b0c2e35ab92b67a72720ee9126b0a1b12670576bc105fac4aca34d84f2a0a02b48fcb6039ecb0e1d15d7fd24563caddcaf83b899f80d4537fbc7f9ad46396fb8944c7cb592951560c30b0df312709653e22bf679576bf39a7d82e3d81edffd59534eb4b5c007b9a18e2d842dea575d580745a871c63d0dafc377f83d981d2efa2f1dabacac6b80697c4d8b61878385f3791524f866e6c8bd6ebbc9d242fb2b507d01a45081b903373e58611af65099ddcd6268f9945998e0ea1e07f845556ce20aafc4ec9a999602aa10a7b3799ec44c4c5228c48df3e608754523ed846a114387a23aab1add4458dc30c5a137173ab0ebaf45f12390ec4274ace4b3a030f6538ce3beadb278f1dbdf740760292bfb728ffaaabbc459227e388eeff3d69fc5ce865deb93c0fab797a9233046e9ecf88de45e31f107b8e66923f843cfc6c6f8cf039d8d89c823b5ffa1ce59fbedf48f2c49e556d11dbe7184a035d2ca9e8b2ccb9017a39171fda83b20279948d2e3b24560ca9afa0148268228318280da2fff54f7b13cea8ded014749336cacd9f758d283178b67cd8e197f77a7a34c0e9b9ebf2f3423b120722766ff229a0a110dae02a0c8135a494613c26e3d51f1e819536f88b28be441280091f5f7f16282a659a117501e3c2d3c522c3f3b4956a3ed64103a8fd7051bc9f8ba97bb6b57491871a8e2c6191dbf47c5a3c0c05a25c2a714afecbd9fa1b0e4bb7af9276333581fe83c6ad71a87a44c90316122af10876149a1c921fb5409bc1452cfefbda08e03441a48ac5387451d919572628215d06972573f1dab312b48499d52a2e6900c5b13edff8199e738eae2098b10bdd11db83e6f288c71e81a93f581af731350612497414d9f7a9dcaa8dd0eb7f0fa194802767a24bbce8f5b9d3376bd2e57ce7f26a63fd8cafb022b0a3ec10347109c616be79b71b4b4e162d3abbb4dd98ca24687299f41e7a1a942ea27b1581a93a191c4926f6858244a3f18c72959a938eefc3e1fea0e63257dc17d2b21af87ca65361c17ee040dd4706ed6c3fd70f1c91f059f7d269e2f7652279a738f040b402b936e18e171e00032777135bf0e80ece8cb70c9f6812ec652681d2eec7808e0c1aa84afbca326baf3499a413f0fc0489b92560e1ec09214957a7752da9101fae5794b3c9e9599ce606043ffb0cb00a56011a72818b69d8df75a0ffdb35918f40851d94a2dc769772a73285375a54fca8c888a6a6192e09996160604d53a4aadb0a876029aee17051f3cb80789965bf188b780c598c6ea8857a3996f82809bcff23941cc4b3f2b5d11eb1fe4db22deba363e44912f162a1e3e210b59870349c05908b51f88f22bb19706dda0b4279be8ceb240a758eb8cecfda00467f75da4c62f7bb09dd92099576ab28cbe9bfbdd7d67a59d1188c80aa514bd672aa2dc717b89ea088ceabe69208400f5eb7a4399fd5ec64e52995fa7267ae7f75ffaedf87d51046bd7c3629dec153579bf339259926ca4661f7a510d165c34c9c3b79c9c90c62265ca6c988ec065896dd942980f72ce19e0bb28ee57de41e905655a3633f9e8b87e3d85cf2b166beb79588fa2f71341a022fa8d204f354e68e7f80712d9fe97a1e14868d8ac80c015e054904f0ed1ca5cc6699e9a3e43385c46afc696b8b07d5c4bd1a74eef9f547901d971947f52a9fa95395f3ebcdea2e55c464a01d3f70c9ffc0d912ea7e21d864aa40e1fed0c1faa6722db54580290c6fe0f236653a7e52d01724bc1dcf5a9f9b4ff76577861b241e9c48946f465b1239daa496fdf588ddfb2dc835a118d4d3d4337ef096312d22a87fd28385ffb3879204a301b94240af5c1269b91ab1971fc9f484b26585630c61d5714c889105265752bfe75123db9b92194261a1c90916bb58e4443d6899018543514d3d0928d41b470dee205901b5ec3eb83a547e8a9b76ba8b1e5e44c1722ed5c185d1b966b58dd80917a6a64dd43d2f6cc37c4f94bb61330d50c67ec8059357ed93a174481d479623196181bb8e37393dc8a3332af2ac5eb3dc540b3d013fec2f67203f45dd0e3dc0c48d6dcbe64616c50debcc154c79808ad1b90824aa671311f1ff052edb397f934426102868fe990fae7dc48c932fb8ca48b08303d21154ef4b1eba804d8097383f76f24fa3c8fdf3c4a9d9676641cbd8ad37df2d48c615e998af5b4c5e99179df42bb67daa3c05157041a2911aafb623c606fb58486f212ce3cf0b7d0704d55e033a1899a37cc9ecf2f3f740a9ba223c4c5e7b380f452b189c6e2ba5bb0fe2611bdcb2fa71159a38c4fe367aefecea2ccea4d47efa2b83b9bdc23345b213a0a915e366ee7da8224fe1c0779bb1a3ad473e93dc828d8da0535ace7ac01f5ee4fdbf02dc3562ad30df98e90b463ba8ab84f34b30b64f838c95639a44d850943d80d5f16b1f12d0335c21e9f903573a0f42e8b940350fbeedeb899c8ef0df1f6e089c82bb9871b8717bfce6dc774f218715d86b9ce34fda111af8881a56ca37b4cee29da85dbb9389a97e74caf86c1020aba77a131636586d4c805f36db57655793ab43cf8475dcd0a973ced973ebf7e9ccfd57a6eb2ebe584f9de403e8e3634f8c02ab7b2a0c08e78c34b16aea9ad94f5740593a8d83cce98e824de7e2550a2d785be928e093678c99fea016b255a7387fa9dae875d144dd7dc7015bd75b43d9b115180b47082ca3e29be3f37ae3ee4c3c30cb93ee61168ee758f7668953a81d95f6793eaf0dbbade40cfe37453f825016c1d5a58d981ca1a6902b8ee00650c05307914ef3ad7f8b211744690eec2024bb8695851daacb51c6f7a6d43752cdb702fa3e54c54cecc778a06c6fb62de7d741caf816288396c5b0893235fc00021644cd68488a352e592aa07d764b1f9bf51bbd2f5f5f25a2c5e795872fdc08fb7f857fc70090f5c8e579f376e4962c91d68d88e63214aa2db3cb4336a3589b62831bd31aab622342f75a557736cc6249db158a200cd444da2ae46cc32f00639e32388df4597d44f360d20359598e1de992cdb4e036b3d08f77ff85e04ee8e026b8e684d98d0c4e5994a388482049bee6059642d6109b8b2a5a8d10fd682c64f3c7077bbbef9d0e0ba1a12d5b25cf9765c9f0c8e2002b6afc82640570832ae3eed0cc907479a60db85140a86132c182ead419a6b2798b2b15687ebc7985cfd4cc0351f41b1bcda39f5d2fdeee74cb67a9cd11757ab2f071db71c2e7c37782b3c9ab22d256b36b8b45dba9cd4f32217975f7247d272456091d5c118f2a15b40fdb7b0a23429f2ed38956d4a87135f1281cbe426709280af505d6b65f2b1c2f1b959e6a4f676d43ac422db652c4054206cf5da7b21a1d18bfcdda6b690596aa3ac6c79e97387719bea86cfb77709c72abb3ffd762460ed0f1cc7d6c4c583c95137ec28632354d31af19f4a71925f5b737c4c1bb3dbddce712d8903f20d250394ec8845bf06b35dd5bda0f83f4e19b26c8f9752ee48a95cf724e164b6a4fd9bee67f38826b9ef13cb8d015796d21c061327c5b20010552d0c1375a502b2d8ea6bb8001ceb829a1e28c32f31dd795a1cdeaf74fa448dd39525af8c92a060e6976f2bd0b42fc13828e844ee5aee7d1ac111b90cfe79e90d0f8aa014cc6373a6933c3d58aa3094e289521d06c6680edeadf43ef739d738ff2bd02232c9b6f565cce33294051c15699276c300e1d65b7baf73c43e0b5c791fe644c55d4a41cd11ed7fd381ba1bc93487fc8cbe7f222d48093fda4aa2f134aeb95fc625d32524167cb687e90ec12bca2af2550d5e0b8cca6de823b3c79ecdcdcec698d283f8b8e9b88a117da3f7b93c0aef7c555764f9604ea9bccf8e81aede2af2c8d8482301b92a5a2ca7f6102729e8e3dbc063b395769de0b0ffa33be1d998263591aa2ad41f96ec59485c0040064f03185d96b43ebc5ae9f89009f6f0a7b7d2b055b0823af89d0cdc97809c7754d04fe2713c7cf3981839a35eccf9877ae0df5225bd4fe0d3f37648894f8bed92009416d535f00e933cb84f5f2e550e5863bca9ea793aebf50ca0db1e770e8e3a0179e885035cd5b39ef8e077a0298963120c11c99e21c627f4e00351a670ccfcff8f7149565a1f4fefd2eb3e4fecd933228217032e0ab32e38f4d845056064a25948f9c7f199844d24eecb5a0573daeeef157ccb41ca6dd6fd93b1d57851d1455004ce84051a1551e298cc05fccfcf6d886ca286c7c05d2c44fa6212be62019fc268312390ccaf8f4c29964123ba87a28dc0203fbf04ec2fc1826bc8da6defcd725b22b4b78a88f7290aabb7c221157ea6785d26be66ee3d8d778de170437f2899c69daadf99c39e4038c5f71e041d76d17c5f507e2b4cf612e14c013f97c0943acda07302b396f23bed05744c5550366cc5df0fd7637b579503b241653bba0fef2dd2c45d0e873913f5a6db93a0d6a19368e9c1328dbbdef245bf0377fa2e338345ab4039812fd0f29b98af87c937c9b17f1541658d17610fb8e57e7b3f19473e533b0cc97770a46144670aafb2b4bccd220263d82b9d5f3d1141f625c98f8ba2ab70f04c4ca8f569605d943690645007a08ff373459eac7775f8d9aec124459e14cc3dfb98650ef6119ee513a70b455be99f485e7a32f43a7db2b6586ab8ebfd69dd43e5f383be27cb10fb404fbc1bcf216c2160448be361002ae27f61238ada2f5acf54e850519300417b282e3e2e17e96bc2c05c765d94261448511fdd637e24db0b06dad8703836f1a792678f19592cf5ba146fac37ea588af2a790c4d8528e1dc4121e2e73a6ab604f3ce46282df6fa66d1e59792deadc357228d5fbaae491447245cbeec3e75402cb373cdf95c6f77f6087118675c2bcdb70162345f65befe7f953035bb559af631387b7b8cdd779a0b278abc62c6fe4e916c5c39268692fa1a3385e80167fb3352f29e25d8a43360603f9219e6426d8ea9ab5bd300dca2635b5787314d836d8225f18c753c34589e277d9fd49fbd18bca1e2ad6cfb6a372d204c4586b881aa9c1b7fb3fd3be4b2a58d48fb1004423e4405f26658443e4acc085bd3b8028603162ea5c08cf724965e5fc909d09fa74475585118721077bac4099b5284eade909cececf46259fad55024ceb020e4945c70d3a50ac26c90103c00030000c0003c00030000caa38fe5ae8af5453999b32d4048828e15b4bbb222252eedbeb010087510000000040e207faf8f94ae50d530ecf0c8cbfdbbee4f796dcc51dac132a2a25d75bedc20ef9aa09bb1bf11f2a8744223a0080882eea606c68cb9a133bfc4542177448f21ad77a13ae559f4361ac4a081fbdce5c0ead85c9f5395d4fb57178f7f2e47c2997c4281cae72cfab1b3bd46ef60de8d7df9bfbedc966dd906859e5a2c4d406ea4ed68f9627d225cb86634aa973ea4e26afaa6bc84266448923155fa36a48be3c4564d234f49792bc78c50f9ea3c1387eb924e146bf3f43a59a51dae629a58f19bc68ab2af38fe9da32b49aa49f9ed4e9960cebe5fca9613fae9531e89a443f4fad9f534e0c6c948ee5515ecec44c182a494ef7e46cb1d7070327e6d42016ee1a53ca17ca315e94dcf97cfaf18252f729254fbb4064ac9d145f72e18ccea0f5e516eaf23b498c575151d782256a56e612f4cfc35930c378fe3bdd146c462c707218cb1b5593ff825730af921452e9d337875638577e5d93990ebd6115ccc15a3e7f7bfb932015fccd268931a6b097d729901416d04514d0b72d413c7488d51c14d064ab621f92192bf7046b273d364997a4cf7342d572d6d59bae235e13f630bb1a7bf19bed9880b86a7fd0ec9660ea5dcaaa9d4ad14d0998fc1d2ec89564256b49307fb5a4bc716f52352460d1bace433e49a5b123dc316c45fb8f963f6346e8a2084f67ff50fd1dd522113c394f3272a9343304c5634e45ab965f2784fe4555c26312e5b620183ae45c46e7e6990c0877a67872ca26a942ff019b33db1a2a8587ec03538a789eaa98e7d383f36b85da7729a15c1e745963cebffcd889ee80b173f7cf705331aa2e74e08d5ffe6e9d8b2d89c16a738eba3de3c2181d294992f23829b7b02d99a429f753ca650bedca66c53b66c844b5b83bddc6f8668f2e2d4ac9a3a6cb8bf6a4cfe2bd4ef1c5a2eccd461666aecf29a6e85c6d89857dc25d0aff5d111116764c8274756ebe8892904824e48718328844c6d80cd478c5415a4454fda3c5898744221b8980b1e30c1f3fcaf0e6e1001d3edc023b9250c315754ae26e5c831aada8c10aca6f442e9e28d71e0e8944de7d3c2087037414e5a0c62adcdfbcceb13da63b1a12898001011d35a8a18ad39bf4df558c96442e418d54b0255ff83fc92e4ca6432211303490030239c2d001821aa828d786cc91269ad0ef9ea2ae1e1b934eea5039690af62d2a552da5b4180f0ee40843c70c6a948214a3c043d3594ffae99b4614c6c73371dec2754c01c00e6a8422f17553c9b7b61f75058596735bfe79ccb1800e0018a1c6272c6d89fd2ad74bb3a1a4862756d578ea6693c95dd389c2529e596d4a1d6585ec18638cdd11f2e3057eba0627d86e9bf9ccbe27a6b6c70f1e168000066a6c82d2ac194d08ab8a9fa48626ec98e9fa7eee4fcace84b122934d6cee7cb060a2bd750d9b97798811021d3d7ef0b0808e05d4b8440d4bd4a8440d4ad498440d49d488c4026a40a2c6236a38a24623f83129b8a9a6e6ae6480310107e8f8618606784c20a406236a2ca2d512f914a6e29ba58a2832685bc8d95a502311c5a81c2b8e8941d4f388304d78fa5789f2546287787d73e668d9bbf79421f0099373905bfd300b6a14c2ca5a4247c449f651e7518310e9c5134bacdcf4eb778c1a83f0a2b8ab64e793b6e282c0934973327da1a261204a721a957fbe35658b183500a16a9b5c99ec7d8d3ff45771f7637c7f09b91f0cad49e8a4be163cc614d4e8836952c7fed01cc4738f851a7cd8473d57a6f5434c6c0935f6b06abe9c43fc8d86664e50430f4962728987fb6492d31fa891873298b45e8cf3b94d432211ff61c60bc898410d3c7029d5a9b34a6a491b2bd4b84353c2a64959593185ac0a35ecd0f4e55652d5247bee52a85187b2749abaf01257e2a5436daee561f43ef83bcef0f1230435e650f8513191283d50430e74be9cbd6346fec7ab461cd00a9da16365cc24546ac0e17b759b2e9dced2ef0d5be80cf5b638de41e306f65467f457ceafa46bb4e1245b66b14ed241d584400d362c126635d7256e4c768d355019aace374dc99ee2851a6ac8356515adbc79ad7c1a52eda8bd9e5575fd45c3a993557a68a96469ce807d68afed1c9a21399a6fea49c9b65f86a2a4540d561e36858c0cea6ec6ed939593eb312454902ccff1ef3c586230ef8579ff4f1d93fc861a61d856366c35c34cb92524120143f595a7938934861a5fb804fb0cff69693567470d2f541a9f66426cd0f12d241261438d2e949baba52725ad774a482452460f34d4e04225058d2795bca6cef70079861a5b48ee3e134b91fda84c991904f0d1e30960060f0ad4d0821baebd7ce22c2503307c682012d1428d2c30b5d9fced3ebd430b89445cd01ea2c3c7e0cd420d2ca425d9eda8465914b5c615b0d7d2afd0bbed5ba1134f5cefe49b2ad4a002dd921a2cb6878f6656a8318534e5d12445935cb73d07e888449850430ae61c735f4d4cb9c763c288418d2860ded697e4fe637f5e50030a9468d1296fd45451fa271075e9335e8adf4fe24ee8b2ffd9dac598627a9a608b49962a675e13b6c3045330a9bbd54a33787a0949874af24d57ce9dc34a28bcf4669bd9749db349b082684fe7934542f1c2ad4432658b8d39025956f99759bf522a8d902cfb52d26f6b4ab71581fed35892f09fe3844584e7a4933ccfe4b4c933842fdbd967d90c76292484c2c7e624b72597d341d8c3ffc5f78ee13d0508357e50c3078a4929c7ae3576ca9d1e741f3ddcb8db87e834241221a3060fb0a0f9df13a126577690581653a7d01a2d945e43077ce676cf1f32cd3e85462e8c5d16acc2ebc999352e4ac1353fb2fa72ccf12dec922f3eaa6dfe4f638ba36fce484f9e1fafd5624d39494e12b9e64912335e408b4dfccd3673f5e777165c9b4931a7743b16d516d090452925e1d27ca4dec22716945a8e31a578c3424d51e1f42a37afe65eb14699f45e9613d53257dc9d2aa5533bc992a65a5170cb249e548dff95ec38c3c70f562c55d7799d319572c380c62a0af924c798f8af59351368a86213aa636aa6ec6be791038d54bc312769d3c34f2ac916030d5468728eb7922794b8bf14c831811c12c811811c10c8b1021aa7388b7b8e4fa9ef593105256f9d10a6d96726edf13c2cb0230c344a41b44dde9a1463d27092e220e937267d70cff293416314873dcb71b9188b9e432211ffd183470e31688802078d50289d9bab57275f2ce2410314cb89f9cfa7de3dc6cd27145ffdcc24ff4edde9893b76d42c4acc61d247021a9d30d4b5e4e217ac8f11442261d0e08439875f5a4b25b48935ee4a98e86a22c9040d4c2455986587097abbf225dc9d137d736c2b69244b5cd9f2afbb62b831f9c1637b45f0011a95c82cf6844ed3944c3443223b7cf48844c010410e0ce888443a408312573e9ddc24fce5381e1a9330cb78ef4b49a2572402460a948624ccec294fcc2565cc6f262134225146aaeaad56925445828467e69f1b2a76820ad07844d16a2b25ad2ce57c0ac03880014ee08810d068040d46d058040d45d0488469eec3c66d8c31bc29400311748814d030041502f774d2c56cbf2533134293f24a89712f2a9b86c620ccd99a52565df7f9bc20deb4dbc95d9b0cead141231009e69633eb7aa6ab3c20124f0e778dff1f32a99fabe898b2cfe3075ca44bc3626325ebfac0a4c9861e8ff18154aff99c613487a6f6705e2a39689c8d7b238644225ba0a107fa828dfe09591353f2041a79d8c3eefb77e79c84b19240030f55dc89fdeb77127632028d3b981d5db94a7c5940c30e9d9770b15d3c6b0a0934ea50d28aeb9e4ffcac27191289e418638c85400e1d0028020d3aa07de9f3758aae3b7f4824e23da031072dbca84949e23d853c2412f9e1637d9841430e69ee89ff0d5d7f731c8cfd295a6cc75250b50a34e090bc267eecb4513473f60d5e4caf296a9f5b4327051a6ed0b26a2ec94ed0bb126d8321b63bc8863c3dc10a89444040830ddb98f82af723b2b9b2062e099f45ead2e57e510dce6c9a9c9b33854e4b230d7ab0123cd2c4bddfca183e4290830734d090fab5e7ef20a992930e24d03883a92dd473adefece77140c30c58275593f7f2e5f7b60c2629f4673aa66e7fe90634c8a0b96ef419bda99263c660060d31d008030d309c3f7d666ffc2c99121ad0f802e227e7e50d992f74e80c1a5e7893e4e33154ca4bdae982319464c1921ce33ae5148106170a9b243c63b488125334b6c0c8c7bc6692c40c992442430b44e6106bda9fbac9008d2ca463b97a62ad57d41c0f332e40030b6ee6f8c7f709a9b38544223c765480c61568588146155c4d959b921cbeb9bd9048a4c7a14105c7e4ca277e1293f7851f40630a67a63026a5d41d3589c18086140e9f3676c2a4dd36e117d08842fb9924dd4ed5cab11ed0804226758e399dc62017cb27ecadb9357aafd459e604b3d533c5e093551f35c18f3b29a5fdc5cb4b1212899c317abc8006138e54b79061272fbf4886185b860f1a4b30b4c6d85c2759844e4309dcbaa7b85021ffad19d04882a9726e975acbb8cd85b0808718349090099a83e65c5e2eb7d33882261d65762dfec48f1b21a1624ac124b9643ee700392ecdc861ccc861cc30c005681481061176135b356e491a5af107680c6103348400021a41f83fe5a85bcd133dea011a4060d2de3f8da7f3ef93101e3d7e50be54ef49fde622341a3e38555a3386fc3c29fd212fe8e123029148193da8c4248fdbf4ab05cf5f40830775a885cf10f1359592d0d8015b71e3a1639e336b34748006fbce396ab3975f1310402e12f32dc9d9a73d76cac18531a34ef6a64c6ff1dcc229c9e4d8e28aacf7db683e22732d0e79e15d726f86932ab4507ebbebb4b2ca49e62cb28bbd7b628c25e624c922e935e6243973b61426b110002c04f00a01b88205d00a0d088015b48a0508401502488500502180537ce97d29f92575644000a630e7ca5f17bbee5b3a1304500a2a6a89d93d6d3fdc8714c6e576534bd198e1512494247d3eb18ed9ac440206cb4244704314648893b3567a2314c9bf2a72952463ba68106e80e2e89dbfa975ed7336156e7c6257db8a323bb6e2fd0d4fa8d9e454b7624c78ef831b9df8bedb9224db94d0dfcde0062738ff6ed91cd221d64b2047182db8b189ff2c9b7caf5b060b6e68223159bc7ecebc6e64e206268a153e3e6365676e7be3127a9949527a6c422211bc61892336665a4b25df4954c68d4aecff571772f343771912898ce00625c850391d27cabb7ef8fd0393384d12db4bcc399d9329c10d4958e5a6e936da891a321c043722d17df04ca2152db74972e00624ec9b4a41a6ba3bc594471c5e3c76348f92a3578ea0e49225af635790971b6165ae5effd4956f75317c84c188677dc3e2a4c9e31713024604427063115b4ee1352f378a38b2c7d44b7037391cc68d44101773cc5167ac529ec5308311b1b94fe5d08df325e70e9159c54e295ac8acad420cb1554a7ba3194d9c4e62e046214af25f67cea7593f9a10225dd37c9672f01ced0ee2f99252123b2fc7cc193d7cfc28c3cf0604b1d494a8bae7b5212a2191c88e1988f18120e4666633fbee330b08a65370cbdec152f22a2412f9c373eab1e35b82a49884a1e38783406ff8e1b28df274b29be5b57dd0d32f98eb7d788f9a0f59cc8ad9afc4c64fee8cd163c71ebad160e772e298dc181289fc583dec73a9d3f2c9eb1e1f3dc4d821811b79403f3337be096b1d3e78204d67cd7274cfab5d88036edca1964b9f3dab520e936be0861df8fe4ec256786a125375b8a4de9382f489ffd9840ec96f551626f97bf2650ee60fde2587d73bad0c10dc9043f17e6d26b2d6d33f71c864694fff6dc2cfd52170f0525aea9f6f8c31fa6f703bf47eb4da5482d66e28a5d7d849da8a4a761bdc12644fa8eca6d5dd026eb0e19ecbdf1bd768b25ad6f07d9a4929c9456506dc5083ea9ef1273d5e564d1a742f57d3f893a65502230368f0246dd47bbc36537c866f2cc5985ed54f2e49cc50124d716314bfdcaa96e1ddd81ebf637bde4fc9608acbace9333a86b2bf72f7538a9fd712c37163a5b0bf7031a7948f1e3bc0b81106f398e0167979e562320337c0e049f953ad6bce78921c1289b8c0bd8c1d3c3ce4c78e0edcf882b57175825bce59d332811b5ed8f2957872f7e5f04b8544223b7cf4d82183edc2b17bf7cf7e57aaabc80d2ee4499efda81773824a6114e0c616b21832d55b88544bab853c34b3e7fc379e52921e3fb2704ca7e1a35c7e69562d70030b7bd44fd1ad98addb0b29632b1052c686682047181fb871053ca35e28ff781687808e337cfce0210117f4fe00818f0878e086154a4928f9dab3cb36d9d1801b5550baf28e5a36b73c2f156831bf8ab410bd8f86ecd8c1e3779051c6ca60c78e1e3f1670630aab9f1c3435b2c413062e05cc24fb244a499139f6904824033a5c0c1f6168e04614921b50305da60917a1ff8e1e3f7664e0c613384bedf9a153499eb71b4ee8422463c79655e78c1d6359c0430c17b4183cb6dc6802277790509d33b17a64c10d26dc58c20d259ce04612f80612e80820b861841b45b841044c2fdf44c3eec92b86442225b83104f3bd3b8973d9d56d211ddc108296627e931c9f193b69702308c6f2d499dae277339e88e08c1b40b8f18314dcf08119377a60f624cde5a5720b91dde041e69bbfcb624ea2a6ce0eb6e91819a74a263d764307ae78a6fccef6a9f1f390de0cd8c88517f374dceac8062e9270919fbdee16ef8ec660e561a756dba2b08a91c944d10a366fc0462d0ed5e513265694ec9191011d3fccd040056cd0e212e2374af093c284fb430c1e6294b121703e63351089fc108387183cccd8e17cc692118990e16464c0c62c32604316975a9db9e9e7d8d4b1110b7d4d2e7b57b8974f12c236606149ddf59b92c6eb98ee1318838d5738d5619697935cc173aef04a32f7ce4884c9263a6cb482f45b19cf2727d1666745c99394c4fd84aa4df12a3041a7a23693fa9e50c1862aca9f2f6ac650ffe5978d5498fc8413edbdeeb3a78c600315859f1426d2298651e914a6dc5a5315639d078b0d532445cdac29e5246795dc0e6c940213af429f249fdac8860a3648516fe650e39bad75338a622c495dd484becc4a083644e15ffc24a7f07413431f0a2af7c450d6d920d800c55127d97c7ed6d4e2f9c4ba49b03bf14f88aacc13d8894992247736f5bb3b60a31398249f61d26ac9f2b11ad8e0849a241f2f312729a5f36d6c82bb349fe424f5e44860431399306dd88bea1d453bc711d8c0041997eeaa745ba32d021b97a0e4100d6fd5a51d16d8b044b77e19e6a6ef24eddd462516559fec6c273596131289f8581fa3043628416df08cf48b89de7e125ace4a62926a743a456d482229b6e7d87a6a2412bd84f7080b736727244c93a2f74bc6558ece234c1dd910bbb5996704820d471cb52b977491ba49f47cc04623dadfacacf1fcc2b262011b8c48361d3bab4b49d8136d2c8253998a9e3ac5063614714cd57e25f9b2ab5d861967878d44b89fcea6346fd64c794824620311f84c499f5d4ea80c246c1c623f49f5dfbcf0f738c286215c8f53b1faba9048e4f818bc3e066f256c14824a23221563ce889884304d74cadb60523a4bf1818d41b49b2e6a77da915c1098dc19d253aa277c272412c9838d40e49b64972fbbf0379a904884103600c15d0a1953dee6b57648243206f3b04024f27fb0e107553b548c7bf199732e241251838d3e983eb7da56f5dcc92963830f6ae5cae57d60544007080020041b7b6073964c4bf93161333d6cc0461ef8557b8b99e3f2e52436f0a09a58e733171f0d848d3b50567da2e6f63289dd0e6b5a4fa9888a8893ad43fa1b4aec68cf8e5ea1836ac2863a970c4d85fc104306dd230360d89843a331ebf9427806af42c0884464d0638c311c90e30c1e1e011d67f8088387878471060f8f402462430eb5eb54b81cc3574de54005747c2012a1818d3860b51a2e45f794a4b1e1e09b10a1157f4363d32120c821821c21656c052236de40b46eb86bda6a851f1289f42883470f084c0003392aa0e30111d0808e336cb821b913f35afe7cc2cc4a041b6df8444d4cb5ea11820d3618427f5b374d27d9cb21d858439f5d73564f1afa332e031b6ad035564d65b7db24e521395c0c1f611c000c30c030669c1e1be80f4422eda35d041b88440ca0231211848d34dc6ae2f569d9cb7d340367380622111d2db08186c7daa45d37f6e97a66d83803e749ce71c16ccbb22311e0c186193861d5e4254de8b33d453046fb7941197ab05106ccc773dff6c364b3c950308ffa175636efde43b031067d3ec554af269660ae18b87c62ca90f11573fe9a60230c9626f32454c893b33c146c80e14e92a0211e2d2bb6f2c0c617e8f64d5abbeda33a25c1861734c1cf76ab4dcad9dd0736bac0e55c5d41f3dada2609f9c0036c7041ab60ba317b5432670bafbbf527c9c4132ffb5a3844a23377ce63c2db5960cdbb525d5fc6b83116ceb06143e6fa5379642c8f48048c1e7f05fde2d66ffed86d726785b29689491acfe93cba21111b5568df4d92e47052126c508117fbb0e61219d59982eac12ecdf799a8e1337cfca0810d29785615a6ff5ae3a5310aa5925a37e77c52563cb00105cc7e4e52936578f42191888d2798e25ae54e1d321e4320d870c2fdd51de3a794772617828d26d4f291e51ee59e921912891cc0001a00e30006c871860f07e38c17c3878b40870e30cc580f7141f71883cbb811071b4c2873ce98ff1ca305dd2ca16499c16dd317e23e1a6043094a96fc67d8601d3713128994e163f0862183f5118930c04612927e6663928dfffa186d03098d544e5e3c93332ce708a8f8dd05132d79c6d6088cb7c7dfb41053932bc26fa1e9b33afb4a36229cde9d63eb5ba3bc830c1b43d02c3bf5573e93c91662430895cf5ee5cbb62f4b1204fc7b5f4fade4263d40e0c4fc3dff52524ee50756b2d5b0b396cd261682367ca06888cfe96c982448ce43063d76f4f811892cc0460f28cf0ca231fd630e8f1de30515d0d17e7a404087dbe0818d1d242bf351dd21277e116ce8e0cb9f743fd5bc885e5210c6097454a08b5c9825da83c64b21b752d9052e700d97933019dd92a8dd22ed58c296c966b9518544223bcef0f1e3bab04561d5c49b4fe2769f36461961e8681f0e88449ac719d4452dbaa04509ba98c509ba904517b1f0f6de5eed24643e1a8908a10b58b051d32a87b5f94b61081837b881fb30a38c1e63740d6a10899c318373361201e38718eb238c001ca18b57f09dfd996eb129c419128980d1862e5c918a65e8f9e5e4317d4222111474d18aaf82a8daf8ab9cdc219108182948228002c00023b12a1089e8383d361089f8e9c12312e173021c74c18a2e5661ac6426aeefabe2934a4eaafd1aefd949859562be127b432cd78d0a2e57a9ffcc673af14222911bdc800c3142ca48400c6a50830a74710aabe3dddd6fc65c96fd6186064a17a638e64f617d55235f9e904824e9a2148d26f5ef8f19f3342705776327768ae6132a338a840f9bc4ec68794e3751541e4f324952ceb691cee822149d74f2ac39a549080f28fc112fd9f2b098be7ec29534b38ff24de1e43cd14527fe3d51f3e6effb30931874c1092c49164ace7192e72ec142179bf82f67aea8daf949fc7474a109339b27394e8aeeb55e269edfacfa312553eda80b4cf43219bf4eea52df5c7671097ff34489bd1b12899cf511468e1c398e0572b84f408718bab004ea2ee9d51662ab5309b3798c663a13de6f4a9cb5a48c269918273393e8d3e5bc7ddee5952e09c2829fef57ea8ba34782d318d18d1e6ffa73489865fc56dff347d4f9b24eae92c92eb923ecce27baac6594d11bd1650d993aeb6b680f23aa7839bf999492a4bb08cba3c9d932e528e292720e5652760c194f224e4d594eb6fa9cb53a8840a5e72b776bf80c9dc410d445217839e1624c5f25779a10dc455d3be9132ac50c828a5b9fde4fdaca600ba2cfafcf7ed63fed09841e35aef37fc6cb1810f466ac9c0c19259691c3145dfc81cc731aaa37e34c7a3f64959314f2efdae93e58fd61528e4e95936788d0051f4ae69a72fecfe99caa195dec01bf0c2677326d2f131241177a38aa7c499eed440d16ee220f5e5e8c299d184bf493bbc04309fcc49bdc7b1d4acb2e4d27ed78e8d0814bcf9836f557a8f41cbaba7811b11c92becc3194892726e1385c152be84e94a678e14088a7c58d4af5297d83926973328b7183a65f52e6478d6199363467929d8bc906e37e9e18aed364b6863c57789e9aa8944e0d59d0502e9e3f2c6d69d0838ccae62bd91f0d865a341dd70d13277e86fe84e8a0b219303196760a76194cd5f162c65dd4d764b8d4ac464c760ca5b3acb1af37e64f1143aa22257166189a92b64b434db58b6028ee8cd69afc51f7173ee15363b494ada879210b271fe326c227eb82dd31ee3c9a1c2e1ca3677e4994705372b6d085454fdfb9164c711dd367935f2d9c8537a7eacd9d0b3e3216cca751db84b7af9050b59bea4eac60d1b6c2fe6d1ab332b763da5538a4c6971c5328b74d53814c51ccd3f465b8949ec2a12e26b97b978211963ef8a978a560145cc9ae3c9ea79b0205b353feecf172fd9ea0c6349375374858e784322afc4eba7cd142dd04baa5424ca887db30c1fc239e935c1974f32550e9f6f25446b7aa84e3b4db4459dd6c7292c0dea5ff999872dc1b098d4b6ce9edabe78f506aabb5aaffcdc84658c3092e59a563f12d4226e639297126936b8890249ebc96d1b4e26708c5a9872eef6e0fa710c85062c8935d3eda41686743a47aba7f3e2094d3a498d2db89afd90f8eca29e9bc5ab4b97ca046c5fdc9f6b361e21eb876f132ebb6739807d7e56fcc214334f63bb85657a6e35fe8609335ff2edada499d5ca0677672924eae17e362933b861234e6afe8dea21c63665b0a3fc135b6c024317db8122e67ce5ab4714dfa2a51ae2e498b2ae3c7c2e44a49e52cfe0a62f2395c5924bd6b4a9ae7a7f4db58e41ae773c52496696e61e1977b999462cc9e6c5fb18929a70ee6e1624deb0a53844b7e2569cda26dc5a2a31725ac983427cb8a725f3acafdab4828b35afb348fba2a4e1fe39438bdf7de49c5e9042b4136ab55dea8f8d2e54a42b8f6a69c02cfd96b326ffd86d614f988895ec45dcc4b51cc94eea3bac58a2a294e9ec3a56dbdb87c14b8ea89d9da7f6e445164e5f2d831a148d67c7279b02828f0d44c89ce27cc8a76314fa7f8d63ce1cb592ebbdc955aebc47352aecf7a498a9a13495216b6263474b43651e77839ad1b63d094263ad953846c4e0f93341377ee910ff59c3d4d1413e8bd9fe5bdc52fff12eea65c72f26837d95b228f1119be792594f1b6f1b0ee4a3925de96914c5f9b49a027e9d55ff6b20d1b496051a22475999e8c4d244e9deef324a571ad8104be1f5f974d4c55d53cc2ac529e9d72698951e388c7522e3fc534a26d4b8b373e1177318c304a73b4624c29a26216c169ce2a12fe317e1a452856d14f1c3d492e691241459e96381bad5c348830674d3c6263a482e610fe055d0b4b9bbecf186289381b2931954f640a61bd05b30d99ecbdc41022df9872b7561233ff412495c999faeb926d5e10f798a64b748d863d10a4266d51df4ef51c406cc1935dce4d5e61ffe1dc5592497b9b2bd77e502ac7bc244b89d9e13e9ce64dde642c5a74f960704fbfaaf3a1325bf670add9bc7492d3f55af4506ecd9d6ea62c845af29009699595fff2a5b4e0a174c2ad56ee76f24cb9c3792a45114b79d5946287a724a9648b1531b3943abc51d573d91635540a1daed8355f1baf3386650efc2539a6d0d40bbb15399c7c3ebc49716328b11287ec376c38986622ee7ca2e2a5f206475ba3b362099e4d8a1b12e53c7f4999c136496983653e7e2959be127c36e8a296d2a1b3e9f66b48aa9472f2cf13cb1e3598b1eb19b2a36677d3e0a7bcc6aeff286bd140dfbdc87ace7c5dcfa06b4a4b8f922b4b3543775e196931c4322d4352d29885b9907f1a32f49e2bfd7162e63263a8ba93dce9a6da7411032756783ab91286ea84194ba2892e6a82818d317f542b49cc5f7e810e936f39eea549985e703b55a478545a13cc2ebc63a627bae16c73c98523bc444f15992c77b9857c57bf04ef38bea9d442f561d7fb399f2b6516b8906526f49eba9a2416708f2aeaf2ee15ce925a82580aabd1add0547c088d774284a70afec968b4685625ca542876d96cea58629284a760bcb8a1af29f22f2b8583a674afc66c15d5281424c3d726ebb2325048fa8dfe74e713e8ae0fbf8c27d8974e28c5cfd22ca5cbf29a700cfea1116769b263c2ab59343c6a6b32b684e463fa2737aa4fa604a72429c25536947c12ecf827cd9c1412d0c9d8deca749b2a3c42e639469b8fca084ba94459e59aa8131681d3efbf0e33e76e824428471f1793e344e7ce10cc5e62b59712c2de39ae256ace9fc241a0df553ac9d96b1b20d49be6c4f18a3e17fd41e246cb8d3f9f63333ed8a3a4a5545f4fbe07c9d9abfc53ab870f0ff42425eff0269820ef00d3949473cb0074a05e447bc7e482d02cd55963876578b8304ae5f3cf47a457778b44cb5393b01a254b670b72b3a7e82d17aaf3b5b8fa7a3d7e4e25984f0ba3e5bce94cc1cffb59146c73672fb563e4b230e537d5dc27168ba789c59818d7c302d1f47956625c65fd0aabaec39f20bb82affc9db3b5565426fc58be9c537d31566839c8acb47b4c7bda2a8cae134e8cb3fe699a2a8e2d3529b35ca6312d157ba82cea6296a4933454fcfb35fd3326b88a760a4bb8c88b7f82be84668ac2db4bf3224d8c9a9522c99fa9bbbc8c971929c8f1247249ce280a9792580cee1f991605bfa963bf8576ac43518e6a2eefbc63515030a32a75b1963de513fd9fd027ab498c26eb095efe643d86d0fa742231a62476855e8929e584e16c72fbddabdd4d987d2dd2cf4cc8531325134ec37b69c99bc944492fa9645a0a13d889299f5096ba441a4d70cd26799858294b2c5e95251a1b7f2a5589d2be539e74b245c915259c8ab9f12fad6b8ed524d2a896cf52e79b182b49e4a37133a5962459ac22a1e6fdb4b61a5c3b2b4824d6b947d3cf55b8ea11858bb5693efe4aaaca11668ff9ebab3fceffd4884b46fce24d2ed97c6204beaada15db84f2382d023dcb139ec2dcde4e8a703b3ee8673a39859d12b175ec4db9ff728c7142445f5b52e668fd191e3ac41661154d0e29b31d32045aa1ef92501722513e4ea667b28999109cacc13377ce3c130f62fbae901f6edaea1504ebbed1c4e0a3e16b20ea3c61e355f874290a88e592446aa9da96fa877289966297462ea87e483c6dea54a51e2ca60fd54b69e793e2e4d0f081feaf91f1949d97b2072b548e116b99b356f4c0a6f7d7cb394985310f6e9233fb98f7c9ed111e08b1084f4ba20916a33bdc298772f3b6d854911df8124a3d7deee4724275d85b3cc5f384c5ced3a14dc994a657b6be9f4382fa469d6cbd6c8e1c28f943a714f9ad76c7418ba29abe73b3d78643153a4ce72fe63b7e43a2874af6a72f63af1bd0cad99226f92d54d306d3a6fcb24cc29b56d8a094dfef5996341d5c4397525d2eb152a58b6a587a62d37353f4bd347c967be282c614ebd0a0fa499a4bcef9fbb13324f98e7c753a1bd5cce058f40e1eb6c6f365a093943945ff3cc12743493368b6e8bd274c6378263fe7b2b23a411283a59f83668e997aa2303c267487971018ce37e9c9c8a81efd021d97e409ad34315e387dc99c20a3992b5d38fa7e969c3f4a4d922424128941245286088a175c7832dae7cc5dcfafedc5165aff24485e5732e801811178a1054c36e9434e30a942be9048c478918524f1ee4e4e713273c70b2c147cc3495e76035e5ca137ef150b96b4fcf4b35e58c19b28f97c39e6bbb75e54c17c9ee52262c122d790157841853f06a98d5bd51be90989442211304040c6ba8f1f65a0c08b29785379bdb14b7450c00b2968c08b28dcd99e243937099997175038a355563c85cef5e6c51312cdd7976b7ab6b613f4fb0cd3494a4c52b49b805c745ede4da5a82b134ebdb2e994c6e6374b58f6df44acce4efc8a1256bf987325493e8d79124aba37ea1b7d766e44c271a399611db5acb62394c376e61e934bad848cb0ed6849cdfe9895494824c2021f4e0602bc2802b7dd2d65ebd5a31e193e7a3c1822c881811cfe8233c2d0e12ce0b11ff8f50c44222cf08208fe9c7049c8f28bdfb91743c02d8d055fb9aee4792184a735db889d1c56e57a1184e20510bcf801ff297ec66d6b133bf5812e9ea14e2a786d6a767848bfc08c1d60782047067494c08b1ed8e27d5207139354375ef0a04bbbde9af33d1f3a2f764067467dca60f142074d8613eba3e887ec7c2e38a98c9ec77f63ad8b8ba3e424caf79c68c6945b6472bcdacdb9daa20d1bf75765ac05e3ba62de31ba9294a28526c79578e7b652d1c20119dc9845f1a7366ceaa8d4ad0471431664d8bdf093f6f9ac92e3878f1c3a1cb023103762d107c98e19de24692ee6062c92eddc52a8eb4f89d11baf58eee26e3d7bca98a219375cd14ac5f767af2e4bbf15c7cb762764500b75eb062b12724cf8fb2dc9365b53b8b18a43977cbaf29bd733a707375491f579a9a58c27afe95424f5ee6a31a4c4ddcb0f6ea042b9f419cbe1aab7ea5360c95693f49231aac6dc30c5f973537d3c75faa68970a314e9645b55cc9f374f38448706cad8518687f48f2503004bb8418a1ba3c8c2d3ed771c4bcb7c0c972a5b0ef5c0a2a8921edaf24df6b2bc22bb0a0bffea30ff0cc7400e1f1e52c656c01575254990d24a5ba168d8e9d2d8e89c151cac28687897300fc9988457b145eb5f7ed3cff3bd2a38c1d259aed7ac686a07385261e8f0964297d4e13e2a3ea1242c53be4bcd491ce038c57e639a25b9c76d9ca6303cefec9c766592523cc0518a73484d396be7b324896a000729f2f7fe9099ab3911e1188517e72cc96b65047088c224af6e6b87d911d5ccc0118ac2c79252897a6692f11f384051dc4a9dc4d9df4d5a0103c727dca84935ebb2675c3d51de1bdfdaf06db58e0c31c6e8045f49ac9b2a21638b1e128978000727682f295696cb581c9bc0a109a38f54ce497f2978161289ecc091892d5e8cd8933a211dc08109bd4cd37f4c7125e57b89d35fe5134e3a4322114b9457e953856bd84e7748250a2d26b7be9a64c594c82ef26a723dc99b7242229110e09844e94e9e9ece581279fa2e79d4e2e2538c4462d12413644acc122b1c90e83c3579c84080e311e5bb90717b2d273bdd11c6b7122cd964fa0d7a2336f9e7ad734aa6c40f23d6d73539ff36774367115cdad4f09b62be30e11f3c3c06ae021c8aa0a44df6b0a7aa41d7445067219f9225c95b1a44247dcc90ad394cc54987e87248af13dde03084f92aeb55bfcfc478fb29c4a3596d3c4569876547f310430438087149f1bab47d5bf7c459b028c031885a4b52324cf41a739c17ac0640b0e3b88f1e3fca30050e41709234bf66f1f2d16347e20884f6212f7c2cc43b833924a0830c1c80d02ede3b669a0c7d2f878e1ecfa30638feb09f94a424a59d2109c0e187f373bb4948542c31a70f38f850e9b7491b542dabc684f0d881630ffd599a8a16935f923afc038c21e0d0c31996ba83798e49bbffe8d1e30338f270aaeb3013664bca193c70f19349ec4e276d4adf819eec246ed4ec61826b872ea989b9e4e3ca73b20ea544589adb998b71a343df57b92b6b3ea1de9ac372a29847e70c337939381d26dcd692cb799238147d3c26d94aa9f8e90f70c0e1abd14d1634e5903fc1f186b4d5a7eb3c555d7b379c2f553586bcdf5ce26db8eb438ce7cb6103e335b9712be4bcd86b387fcec94b32ac86e44a974ffe2ffc4a9306b4645d194d6d51dd82862aa3462ffbda7237cf4064ce7cb8643daf55080e331c6347bc9abc61234338c05186fb84794dd22193894e86c3e72c6163593777d6078e31e8d1296d86c9a5b9490c78ac3df1f2ce30301f63496ccf83a1109dbaae515267927cc1d1b7ec0e2727c13aa6070e2ff8ab2126ed962ef82945b18d492b896a73a1ec396636d94c1237698b630b5976d52bef3f593e80087260c0003a7cf4f8b122c881011d3bc0a105cdf6c27530694f4c380b76a578f7715f2cdc26a58cfa7f8c31ad5730495bec3d8f66f2c658a17829996931a13459aac0c794dcb7fab1a98c0acb487ffd7ac820c3026ac03105c3b9f5a6760956f24b61cbb549d00cd96f4f147e4dd27dcc490a27c550784bb47099dbefb1fa13dc2c96379bd8dbc5dc0975aeae4fb97c667769c292ea39a3e61ad992c2842a666dcf67e199525bc2995af6ae235202995e2c4acbf2c97a12bc98f559b765010f31ce88c01d702041ffcc9ffcfb3e8217e34bf95427d52487eca0030e2360e25710db8ca9c7f245782acfc6d774255b5689706c782649b70df596212476b9cf8652fd4c08cc091ef2b9673d5512178c610603c0123882b07526cfead6f17e7220e06b163d4be426b7f507bd5eb4f714199eb5f9c08ea9b72ae75dbd6c8594e1c38c761f3b9c0547023fccd040007c80a3075b48cffa13f3cdfd8444226398f162fce0e163bc60c7f7d8c13b660086057c70e0d733904304393090c387bbc0c792f1fe8153e0e001b266514c68db69fb71ecc0934377879aa4d135c4a1032a76c9b1937c9ea6d90e905cd826c6cde96ed5ef1f128924082ef0b5942ce93ba9a72cc82d92c7ff52988e17cff3b638c63093da53c911d1d742cb31f64b8e8e16e530265a2a8deb64726661d6a85462cffc981495c55272a84ac79458a4596308f36cd2769282851ea3a535ff04f20abae44e1ffb7153ec9009405c01d20a105680ac02441520a9004105c82996fac9b01c3d668c38e405653400c414608094a258e2febf8798564b482f045c0c1f61e400e30cc74048195b811c8f002105c828404401128abc5536b6c3562ce54141869ccf5eaadb96ee273051d793675cbff2c813c5935c67563ffbe41331403a818ee79f1c724ea3ee9c2889261fe5af82fba89b48b0d1d89be731e9a568c291da144f281f2413c5b0196bea345fa70e01c1847eb12693d093e1fab9c4976747bc4b4fd47c1dc412556ce51e718d4a165525d81dd5ac52f9ea634e088412d6d988d96db2501a0e89444026c149163c86cc1b13df21c60e2580488268eb97133f73ba135f22804422d14a480fbf2327fb8644223f0081c429ddad76922cf3cec903904718fe39fd4458ba5f2c0610479ce264dc588d39fb6223fe689a317c95a79493308030e298ee244912be345c6b8b404f1253bb9ebc993279014411b8647dcca82645893a02904498620ceb3985150411df06bbec9a673f2c05e410c9e7342a57aaa9cf0a89440e0f07411b400c91da9bd431fa335bce844422659c01a410b46aa7689f192c193b7afc0fa700194008b16ef68dae5ff2687856001984d9267f8a915fa7eb4e01441059b42bab09d3ce5169024820deac9dc47aebf41425800002d7384136f64c877dfe70ce187fe65556b12a7ed08377aca871e39c1481f4e1347671db57c7524807081faaa8d0954cd65793fa3d9483543e3359cee3ba7a70bd829d7eaa943d2f1000c983514dde9cd8ec612ee321a136675647e8c7fce500e40e9acc742739c9fa71317000b1c3fb61fba4d04a622e31241299001b40eae055e59cad4e103a244a899a69aa1301640e4911e5266a789cbde40191431c8c258ce61493a161952f80c0a1acc184ee1bb1b5f8435200f206d7f2c6b4615b71352606206e285efcd292b2a38c33dc053b7afc1003a40d85f1cdcc65f2c99e3936f82e25f6c965c9fbacc178d27676d9f897581202a206b6baf723f27f4f4bdc053c5e009206bc53467c7449c9c78444220d8206b3e8699de4c99bbe9dc1947e3b77bebce627cc20660029c3275d12b27e5d2a3719b202103218d2f14c0acd2dc90bc818e858e9ae28a152be28881812dfee927ce7b53e1648180ab99a97ac70fd11a70002864cc2f7cadd837cce1740bc60de13268074e13ac1a32f49967d72b8501acf795ba962c9311812896ce11213aac2f698466504102d70f1b2f63d4f867141b2b0a650a2949ce358af068285b4d26235de258d7f8f1e21631c319c0072854bccf4ba463a49621f12891c01c40a7cf0d9501136d6d12404092055389c97ed094320e487182328638c311c9023c78f19f80f1e3d2090c36320461140a8003285bc22bb722c5924dea40b2052d0d34a305bcf71b4fe238044c110f1d4e8fe4e6332047254200708744840082050a02aba5f6892077942bb1596212c66e5392700e204422a95349fc1739a0ca409e87f3a51ad6b10265426e48969244dc6f2d1a301204bc0b25cdda492d537018812eebcf6d1e9fcbf630e89444092d0695cf8b42f7140c78e1c3b725860092048d8d4c468f92b5c4bde2e00720453bd546a7f3a29561f041023bc715a9f3ce684ec2863cb7000007a005284f3f633c63d314eba730042043fdcf37396879ae8e10064088cabc4c50f16635516c2714b922ae6d659cbfe062041e88470b9f8525a524e56200708744840070d408060b2b297ecb6785a412980fca01777adb463bbdfd611407c70872c9352fb9b31411f80f4e0fc1e4f6e1e4be52b203cd82fc79f7dad0c901d6c0044075fe4c24b9e799f24496aaf784824f23d768494b115b82f70f1f77a2ceb183d54fc849801060fbeb84569423febc439045ec60f3124f0852d5449b7934d4c9249f39ff1430c1e3dc420c317b53876dbc9f406bfa045d249b9e12fe5b38e3f8c59f8f1e6e46a5b2ce73418be90c566924ac7099b2e9a7c2cfecd1c9e520e3e96db2e7c018bfea35b861c8b5591f9e2159c24ad5fbc6adf5a8e2bacf469f3cbebe49cd75678521a938b7812432d168851c617acc83be6289299829df059859ee94da30679b1d6bf50c5fe19bc5389713ec3938a524531b1824e9d4679067e784ce10b54f4f1ace4133d750add2a2739c85b3690a3023a92f08529088ddccb1e6fa2a296c22f2bb9cf04c993aa26457b6197ffadaebf4a4661dafe4aed92a74dce4551d584c97d710f453909f3d7974992a663a028e54c2917e261cdac4f1c196ea67f53fe9c224f6c269add9909a21b4f66f045270e9ef33b69aeac6acf09d445bf921c19ce4a7e136a8961334b43f35f471385cf84d598a6cbce45f045267091acb74a1d3c9e184c1c4b54cf0ea3ddea9613beb8c41ab6e4fcb1c4f24a1f147c618953a44e924d4e315bc548040c00f8e08b4a64e9a77c4b653ca59e12cd2771a66b2e7cbde8e38b491c6791e13486dd664612a54d139ba4892271e612f6faa5c43cbcef1f80c1179068bcc34b9c6cc8becc23ee3ca2963d86924d8c99a231be7044276ec133423bcd2d667cd108efda3f562b0922ff09d9d1811f5f3082fb8dbb8cf166ee2da22d69ca84b874c16274a9084df0aa9ff7f413d24ec479cbd6f2af09de6b410453a231bcd44d4c387ff4be800c177c7188c2e74e48c99ae77d43acde95b2654f32fc422853bbd6eb6f1d3e8448d3d3de489f24d919841fbeac4c644198bf76b2740e9ac30d44755203e2cdf559bf12fa37fa877b2e5b9213dbd3523ff0d1fab52e9b654abf0f58d5b7c9696ddb449f0f64cc93d462a7cad8fc1e6ebbfef0acd1831d673a52c46a2de5f3a0b59494d484b83ccbe301db649b57aa6227f777e8926568918cfb63f27658daa4688de1a87410230261180a0582a140180800886a7c2600831308303044208d0563e1a05cdd7d0014000044321e504a2622261a1216121288c3a17030141005c38030201008864381906a10e76a62e305d72d1b211327c7bcf8ca84c08d040e1ae2cc94d42194d2169d7c484dacfe9d0c211dc1acb9e826198e76c5fcf9113288c78850643b891854103900fa3a02b39628ec340200dfa098f060433e91e90e826416daecd7233056d942e0c21329155dcf86002ab254246a4e64b4a5ef1e5adfefc5a05743283ea1268afc7d1ab3177c72f54f51292536d601df875dc1dc97399480e956ba1a712319615588a18a904dc18e27617a90ceabc86568f6750091a4d555bb7738da78049007eb138b9d0e6a900b8f98603088353bef28bcbcb107ea090bd91aa299828e8d69f14c89679de6c05c0940eac1cbf23859215fe5eca9b1003d2eb1438500e4568ea26e24e451256f747b71ddb996598ce06e344e38395cd7ede08f7fc3bfc88860606580a52e4da65449c3303118afa58ba4534e9c5546b7d391e0a15c14cb1d476cee12934bc4225b1d0e49e733bd4430bacd7b732ea0c89d2f54cb8d72f8ebb9ec5e70b0e88e63cae9510bd123d2e4b2cbadf2cf8796775f60f72268121323a01d530640daa954d1646f8aaaeec66f60e4674e544bfdc8097793e17bf807eea8e8c6fde7a978eabea8b0fc3f6a1aecd434ba0cd30dc54bc1e5892bc2d35af914c130bac09ff7274835308b64ae16e0da47549690e013ac02184ad4ee00d242ce8847342496f6bee0576244e99af3373d976cde4e19a42185693368592e5645922c865beab82d1bd969fab4064174188e4769d4784e41c19b7891cf706e88bb4ef074d55908754bfb812dc708ac3e8a8267d789a3b8eaa314f1a8446acf90fad7dd95177a064887b30f7a060985cc2a70ecd37093b53f64623793ca75d858fd164bbe9445ec20476c42209ce07d99d8652d5fed200d3e17f5bd66a4369de878ca3fa5efe59e9b32d0e5c11882605d8e13fa04b3a4660534a82c949331f8380fca014f1f28dac9aa8cd39fefbee0d3652a7486168c7aa4c92a71efae6fead18b151bbfef42d8a267b70328bb2b140acb3e1cdfb61e231b53532b89aa647e440ed2e193409a69e5b122dcce2b93b34cfb9c578a69b4a80685d677d8e5638ed4e8a1809f4ea3e011c881ac2f29e7260651cf20eb2d887a0af2f532203750c1bce16670f90e4ae04db83f8e1df1c65aee0d177aed726fb7d8fb167bb525bdd992bdd39642d416dcede5b4b05eb90b51d61e203f840e462d06993d7cdc94560924d0735312f12ceaa0a928e112dece640a1cc13d3897750f18a60ad6aae10e3b090ac954c4d04121d631165cf07b6a321591a928314da4732ce4a37c6443cd4547d7fd6a3f864b373efdc78bbe80901b8e481f12d7c848378f19534e6fbcf6f26f8ea9386c8d0b538690979f56c766ec21de8d715a966e6a9b84484d1b1089261bc8673abbfa3399f9e276a09b88110a52f3b0ee0ef1849f6190dab540ec392d6d9bd52540e6ec70d9097271c9e2a8a0abbdca200e4ccd948a50d5f0391881a23639763936860c13978ebf162c6d8cac2e907f4dceb20b0e9b36231d29734479da57d4479d9632ea458c7a844b9a7abaf494e9094403e569557994330df13ca904a7a4e9a8534b5230c15ccd373726ad1df80331bb474bebfbc3cede504e0ad936bc4cf3398167beb159aaf66c2998264d9294fdcb4632f895f5d2350a142e2868fa0d324dbc962bd797ccb6a0f6b1fd117af1b57e426ab14a9055775d6b2cd68062af9e97f2e63e6f1cb0e2fadc98d615c9101df28ff934fad23aa05b4994edfbe2d7103762db7dbd328553add2c39c488af4496fc0177aa22483907dd063298587c7c37ebfa157e335e88da74c503d6ac4ee9dee63a4637d14a592604c062e0d9426982abe230156c154ae5262c2659e6b5a30861baafdf1f0c56567b58e10136ce7bbab96b2ca049fa84fe7d9e0701471696aaed3b47794d5239463c769887fd2ac4293916816d87a7fbce8855265bd30e33c6ea32c544b698b2f559b75f957b2963b9f4d707bca2b1f02985a8169b47b57ae3846124b0f67ed003496c938a77632fba84d8cb29e4efc9591da43b0bd1945852dc63da9fc02e98a04dffccb81cadb6023700bfdbb5c95d3380d90a329f2efc3bbf0f35163c6ef39a783c6e645aa8c629b23c586c35161cfc817d055ea29b413cb6a9dc54a8853610897674357f0af27b2420d06c1fbb5b35c671fccd5d54de5683b59aa3decd1f034220ac33e1d4d4ae52d008a2013bdbb07d9a8b99f578951316640e3d447f4cd3a39c7205a3c007cbcb288f78a4a0a392ae9dd3d21cef3dc9987e8fbec9708314ab025dc1f5e512f6ffa842ecf7da0d129f530c728680b06c702a24c75d51a9d75e03d67b4196828ac2de15ba3b655091392d6a0dd22319199df13e63d36d728cb58700898732dc9fe68703b3136f36c125c41633387f9f085a61e05d2b26faee98c016538856b2b2a13048de0afd90421213cefd0a40d744b15a5f5d2bd9064fd06ed1c27afd38c4c9b100018091f3337c046c99e2a1fe362457afb949514f03e15a40d872358a9f1237f1fcecaba7ff3219074317d01495732e506fb772e02c551cf6e4b221331bf0a50af3c0849cc6e6290b90d47f1c1e58f0dfe3e5c8226eee096798b913d4967d90922b0b1f8d5a9ad3352a6c6b4ce30f5e3bcf797b1353cc5b47f7423219c0fcb1c82ffe09e1d324dccc39536eff5255021b12f7ead9f24584a948226f91280912a3eaf7f1d812a150b2609b3201b23ab058eeb858dc9533a6098806fa74c0d5c031f708db012d5affe4ac27cd68d97e9237fc28f5239ce6999c397287f2f55a2174d7e19e5480bbb55113ede2a7d4f8ed1be0720d97234e55957f4df582eea4d036703239de1a962b6b33cc4c4fef6d49b0b75574f7558ee1e3923deac039e443daa0b88b59fcd147deb23cff83f31790d016b49850215bc7783e8a77a03bd6b0dd29c1c4caab1ccc93c5302fcb2a2939dbc9956d56ab4e14c1a81850b3656498e283ae39e4859ab8853369ede65ad57074ce7aa4a3acd005298f33d9337ce78ca9a80a69af86791840850c41e0eaeaa2120de120598f0382fd029f082fc2446deed69a4a14bf76a38bd61d80f78f7a203c13f89173a0d03381c5f78c740566da12f0d00f485dec61a1d13b86d8594296ff65c45e6a6a7dfc63b78b47909eb958151198a9d32bf3935e06892b4db3c2d56ae870d1b8fdc9e31741cf1255e34fb0c7e776fe1382cd362ef73249118119fa8980f7f0f11c37f150105650e5c465b971104768adad7c5c20a4fae3d10e624548721590e534a72a26ae95bb52ca8c1505a61d82de060e87a84d8ea3792936a390d22ecf5b0a7a680ed19284d58e789a9305034c8721d2a719040a99c65c9b0ec959bb917905211a5db38593c3154ecce7bf3e274864cba75a21271a5da42c1d021f355c2b0a8c6d4e4a48978f08b34f0958d9ae8e6bcf36c04016d3dd24c2cf92554f06d02dc910c49152da55ccf4fdb4ba08875db45204c18bb6634ac6136a1508a121863e862cfa048239922026fca18e2e1814670922a4820318203e2fb22d3ab570a99353e95c6a8c52f305b2021cedd90753b3da4227871c27fa741a4e2a0c7c8af45ec87f18ca751730907535cbdabce24dcb24c027409462f61536840981f8a0c44389f323df77880f4f8cec41e49a137d679fc124ef4a2d3e284a9740b8db0dc75917a7e04a9ab6f6e847192bfc9929fafe189e3f900b023fc6886fc29d868e94104307c86b0aff9028adc1d8ee179bed3f9abdcfc8303c70a19227f76083da38d99a0455b102d209045b8dd56b8fc04bc1c941b2f054006ee841d85c31dd41d152682952db8f9fc5d873defe0617f35d645e42b3b9ad73d08bb5305c7cee13668202874d244a114d7f0dcb7936d5f42f5fa61a13c47753c60999446d6d570addda33258bfb6c6591fdcd86203d094ec8a04b768222174422f0a3ac3fff19d2ceca51297c02f338de2e00f9c3b64f0f69c9d666c352db68fb4cfd4ab4c6b06dc19bf89d1b5f1229920912acf1540f176ae4c4ab0b3eb1740ffcc0765f35046b5b420a6beface53ca3052889b04d7a1417486befdb5580e33355822bcb1ba83bc6b4408aa61fa2e4119beb7c4b862cf00fd2aeb9a637ac9338de99f6b31ec11bb2d311737cae334b14f06a841e08788bca1b20e20714bd4d67029ddfc3a31046a61106ab071f76106c3bcbc6f0e94dbae823d528eb7259585e792990cf0ea8892d9564f63115e07774794bca301f7a905f6fd458106901d02e12b549282003d085c624f648ff63a46ef7764b451a65488d046fa4843a5f3b50b4672ad46ef02025b21caea5fb71470efa3e6b186afa3ac6695ce0ede2cc6e4c2de512ee928b078f9ca847be35ba67ab5156b92f5f6902199c5aa3417e9255e58f564029156f38f66c961357dbe53ea14f8053b4fff9acdd63ccd54a18609b98f58d4542b50db8eda54fa756796fcb44be9318d81077f0f3f229cacaea2866dbe9a69d1610043a3dcaf9061eca116f6dcfd68b4df4f98b41624d9766dc981599bd36fc5f4d3c43e1954fd4c310e583e47f2747a9ad9ecb0a01e34ca9d3bc6cc7343bf818cd11e3256f12211d38e346ee59d735dc49f148fe41e4f28d3b55c406ac94ea0a4c548339b225096cad46fe58b2702043852c0f8260be559452012cc3efb5e484730c0720134c6a50b95e85fc84da43781c2d63743eed25f7269d34a5c06a5a62903fe0dd70469929e1f3428d35896ea423dc50dcb9e0d724d5f894853bbe29a99bedd9a2aa73613d8a24e45ca358f2f107809ee5a98805f23d4981d01c7e1c0f12f45017a64e7faaf1f0b83ff0b7a8d235a149d424f448be62d48ab6701b265f3c04a994b002b169f4bc8a3dd1043b7cfa33babfe36d71905aba66ce4fbf52bdbb475b70ecfe5a574c280198035e012549fe8f13c35c24c98b0c15773aa207d4ff59d74917897bb2649e4797236637bb31be66d98aaff1d29b79d648ca4fae5a8cdaa37b2341b63669e6f3e1d32a73f1f668a2c6464b6e81c425e1ddab0eab07c065fdabd7c08cfc96df6366670910cfde4f6f4d9587adb610142a753c59e01df713dff10cce8dd77820c0e6cb7d7ba6129ef2236392e1ad20dd438e458febe4c97528335454bbee476210080ba5715b4af00359e015cbd55b62d8e4d36ccf502704dabb01d07e3ab536cc854ed3bd7bf348defee9125c478df615b6ebe3b78796cc974c81638e7e249338668f792c5f60a7c4e20770f6adf25a75697e168ea045fdba81f4866882837e9eb63c567f53524e353b643e686a63cb9e9b6207884a0722e53240aa1ff98f88c97cbe3249801d18205ee68bb866e5e12b53bc4214beeb766cd7509fa4735e8ae6d778d9488159526f07fb071ded25919cf618a08c1cea20b50cb84df45fdc89ba751489ca6c192b50d1ae3cb09285dee383dfb411fa20e9447aa935ffbec3bee8f151dcb9be787f724c639647e050d023b9ac477aaf839c0020f27a21f049f2541939936aa7454e39ee0561aac2cb2ca1ef8fef7c9ac5f7daeb6e0ab12d51c0d2bb8da5601818f0fa51f41835b568c1eef83c261120748a7a4e76df806031d6943661459e8cedf493a77d40121665e8406aff8c97f68476585db25c6b40879c405f057139c9dbc2a5524734d6d92049dbe777819a16008191ac7d6dec4c42a14031443557072d959a3056435b9e4d2fb821b29e2cd917b3b8732e7180fb3460fd2498daf67d27639fd81ab129eca6a2529447f9f96c322aa953dbfb9d1fe4a11033a82d2cf84c409347f3ae7f378252c1f125143c2f7f4b92606410da9f08eb301d7c21aec7d193aa98b757f7939c2d6e34252080a0b4c60662bcc9ee4d5d583920d36d257d4bcada6ad5531321f17e9962f198de578e6896794915c59826ca580a1cee5cb2dab1e8e508fb587672ffae77e8c969c68a996b70d4ab304b932ae8c1ed78e0a90e558389c43fc49c240442d3d9d38f73004598eef51a0ea443ab29f2be4a81317458276782ce1dc3c730dde153823721fe162decdcc3224402a66d0450c8ded923924640d37f7ea60698e46678cb6b31a25d1010c984e39aa0e660afade5a84355d2bc46c48f2aa1ec3bb13fe485c7a6885638881205c510f1224e1c2bd85ab19b637e4d8c38f6030913b73c99c9bb8ae73a15b7cf59213027d4db348ac33b42a4a18d0455966f231381bccb7d96ea5ab8fc4ac7670cb4218ebb8d357d1d257bf315632cae2850aa256c9edcfdc6abfcea5ff3011329dc1e737c099f784a178b03ea3191f4c9cd82a4b056b180e4b998e2d047c1032af3050245b5b9eeebe0ba9abe6e027f0609ef442f5d88aa6e355da4664b939466f0cba42e9020ae84024b982438ea10f93967e8a380aade9be8e41fa953144b6d0e58a7fa85ec24ce632bc78ca3211ae0c4ff32573a143f3aab00e93d7d761c92231b2a2a74c2f63ca797653835ca393419c98f4650baad1da2a56b194e1800ffc42092616728be0ade4874f804e31180b39925c9203d2ec1af2204011c441e3490151e13c16b7297ddb103a20c54d65a6638796d2229443e228b6ec4b0a5d53a247aba7021219375105566a25920912847839975c8c37ea97ea7b4820bfc8ca9d133a6fa936d676127b29c727b108f2005a3c84bd1fba200f9dd2be4bd74aa95a815967b2655a2184e5680c4c6045101c0d5270193feb02ebfecdd4355090728272a6bb8f03853565f9b604d8c5614cf12d3a669ea2e9ae1109f888a6b5045a3af05e2a418c1db031c56110e181f867d7707ff22186c2d0811a706d052a97309b3a95d2036a10599bf5bfab1822ee3e4c54a0191730ce141d2bb65e76022c7ccd3532d4764d5c4253d53babc01d0ac9c93f2c847a1ba9154593db78bac759a578689e971ffea31c4ac8d770c3a95385bc7d14f2fcae8a04b5a60434cebfcb8d1f3bf56d79981807e79b67de3a20bbc2072e47a878a623732ca9ba19f48597c249486329339c671db51e640cf0fbee7b9e01c2fc70a32d95019cbbf255dee825b49a59b0132f60a946545228b3e982b33584998aa99228a3334cfd5d6cfa69a0aae97d9bc9fcae8352690f9ee564917fa214e365b839b86b2033235ca087f25d8d476143cb3ad6246d2759e481f0d08401014db3ec54e89b058cea9112501f6d4e999aadc1d16726a3f9f4ae06c42ae07e379c0a2d07045926c3de871aace863b55f87a7676fafa978d0d0eaaf112f98e9e2dc44025fc92544dd38a6ca291a5a0d52895607a022a4d775ca030ca4aa59fe64780a8bff786dd77af6f152db82ccb96c0bbad7879f511583d8b6ab97f3c8c1dc4a2263154173970ebe3c5a08c6965605b1865293c6854b605bb4430171bc53750c0bde1bb62d08cfd010c7c1c9fcf4e443edf91616456cd4391a2803496d6f8c2e1f153729e7594346690ccdf5291aa0064df8d90b2913f8b0a9bd38b063608b614959846da0ecdaa119825cc823585f557044cc1a285d6f1b4fb77f8ad8116d3fa11d7fa80e6112d2ea6407fc3ed8af5cb434d5b3409f70f9e751e5147ba13de84a502abdd683207379583aeb29d7466971f2cc93156fe6434fd136bd81c33719280b458e30c7db439ccee27f5c6cb9ba4391032e5f708cc04598ce95ed70bdef4b537c76ed6a88334af682adb91a2876a9cd70db3c29bb0d5c833189215d420ebcad8ea0e0be22e288e8cc1db074b9372772ec54458d25b18b3fc8bdf7a4eca871b2355537fc062197cae18ee2f989cb89b61ab9111565543df92fb31ec9988b8637cc93286a454dc226e3f01ead2d24fba1b37937f64db88d47243dbea33982b31123d37decef124a862ce55810eaf5771b5e702d5290cf96ec9c4243af5da908e3919ce0ceeac5fa3b1efb22e6029b2521b4dc016ee52c9547e547759455cdcd21b148b608b55022808f990218f1efaea44458f3fd36116a4e616ba28069e2a8d97157265b330567f7466eaa93184cab6aaeea0ab4eee2db981f2c1e720b9f13803d2395e3644d321540c1bcf0f2d8b197b588e28cbc2f38344f40bd34d9d1c9b95826897c43dcacc64529a9791f8a4a494c1d8d1816b4daa1458c9bddff24ba29e41db7c1877019894ce8e8b086b83b5241cb249ba50cc8cfa32fbce8d085897be9ca1a0ea48852319c3f60981a029ec1383833013435fd0c71e2f448097cbb04460ceb023dcc57da6e449dd1ceda35d80060dab3b5cb6234fefb8c0844446e33858e83f5702c2999a82cc475b7a28a259d6374c2e2292ca2965c7292fc7ef12fde28e04a26281623166ee91a237c92bbcae19075da3045cfec416ba5c6000d5b9abd9984765a5f0428b2efef04b791284190a53b6c7ae94b119d65a3196f65574b05dfd29ef2ac0d58a18058ed0213fb840640b5ded6a06c8239aa66c987c173f5ae40fbae9aaf3151d0870876c30109a1cd0ad791af057090ad6d2bde43cb095f4a88e4e301c25cdcce0841557a626dc31c6e514a761dd75247b8c2f3658f32fc12fe74c89c1b2c3c189c1cfe64f1630e1917e6c13a445865884042b11e4b9181b79b1b2fdb1afbb66608296f48f98f139579483dbd3ad825f7b0edc332d9249830cabeba1e3bd05885a8303aaa41a8fe0eb6b7af862cb408ddc76910ac4f3cb5c7813ce13416034b3e0ee8131062b7dea333db3e9bea4fe47951c57922e89d403cb0c722bf58b3cc5b9b887aca5500396c3f3847c0354d102d32f27a4f79ed405939a3487bd2f58e02da52e238ab2621268e3782788e9ab5bc19b186130779a92003f92882b7b2cb14ed930509150561026b16f65fba791aa483298602bc331aaa45327e65b0313be4175ffd3f9509123367f8e6075878cd2140278d0037c452d0092d1b2c668688b3fc900e67b0e91b46be16cdcd7edcb86ab26a0887a5844508bd7b49b23fcca749e4899bd0236b572293bf93fb43a0177a0f01a15278cc0d1da2b4fcb08798c73e4c3c86078eed4ba6acb7980039f3edbfdbea3dce951c88940fb9b64e0ca311423f2443328be296d46aebb6643facadc209f4ce857b0f479750968865441090c8e743d89df0207dd0b589e5232e47223847e8bbf7bab2b8dcd4e9c37eb2234c247f9857a229ee0b258f45f0591b3e2a7427841f5a5c889f27d6db38b0524764fb8eed8061fd9736823af47f35f8f98bdb50fa77c1d2c3d4f02a13ab11cfe06f4eb8c73b1bd757b49cc07dce24714228afc9eae6d730cfd14c90badedc299895ff69b01b4b362a36693d307e3d5eaa8ab52d66b1cad28e57f011d2c9d6c146da6e1754b6b36661dda3f3b3921e249a348933eaaf8841c98fbab00b54a403e1b635a88b5fdffac9dea3f0a54f28685d97291a18ac167ded10b9e212dd3a45c34059b4765cd4bb51d43f53e7afad1633cf21afdd4b9dae3e69ffe9f83c5b2f1350414d84b73123272d36cccd0f78b5bff95089024e7421b632b9bade492080f705f7d31f018a9b3bd10da6daeb80c3302543d73bb118aa60f6acf24f5b016aaa12f99f660f87dd2be59c83394b686ef244e668c4a247ff95a0617d56cbbae0a7a4c791e72c41ffc419a0d0057ce5cd618bb91c85a2b19479aef8b9f54d551128c3d8d0b6b9973e65873fe9adcf134e4c8762b5bf0bd9e4e889b0cc825d710b899d66d71efca6897d2b3d407cdf71fbab5a72dbdd9818b4cf17ff74ec97f9b251086c3f40b7bba8b4f61f11244a5ff463322b409c1c58e06df8b9ccf7c25b8bc2bc92c796c71a9271490c395a96412c73097dae31e23e2803d427c81b8f167d2ae7a2bfbaaa87068c95a11eafe6cbbbbf28ab2b292b73e565119d499da812e131a2ecca369b0b1d2228d19c6e1357745f7d1278fc92b5fb7a42f95060a6dba62995268b5a87a8914dd11542e15f93cd61b893b639323527475977dc24a1206876e20f1ee57d6c8fc5f93edbfb1703cf69cba5c88e12e133a9aa1a615b7a195bf237f3354a6a20528b0ea8f5f02db0d2aa0c6eb9c090a0a4d4960c54e799ef3dc49decd1abf18a1b2bab65d08ab7dbef26a9c1372aef23041f9ae59c1adc4351794e2e0ba5bf43524cdb9dcc9b024aaff40fd6ba4d5f86f5957eba3c7502d9dd00507bfb16bbc78ee0521ce6e38447738bde91c594861947771b5bcdeebe88a2fe6155cc04e417f737be578503616e690bfb0061b23286bade1eb6e4dada902c8e87acf2d7d9beec472c3fa4dcb9b90d67a46db71f9fa861de1a014e52c0f1a5e943dd634c99ac594843667429c9c1f8bbb68312776a0831f8ef0778add4db9818649bf77e8e2c37c34b7656cd064c0721f9f0b7641f19f02a3274f83df7165dcbc3e4969d555db704c23bd1f3246fb07375795dee9b6e32d858d131c92e251e21724073435f99d93453549e5685921843d8e88d25e340649f3f60ae5513461eabd1c20aa532e5a4c7849429304b526315c25845b14b37444e00b6e31cf6fedf73f1958099f70413e694241c00f67c83cdcdd28f1f12f0b8ca257d6d43c8fcf24d5b869232dffb948f1a7fe59b944404761f677f8fa2679110aaa3bedeed5e3cdae0742600e2af488d9d162825d4da9191f9655143d4b56859bf4ad0991568054ae03ff548d3f14789b80907349f02a8b494d5aa09bcdda2b0d00ea74b48fe1679dbb0f73111eb562b2406ce09b45ba240e4f927165a35f1806aa8200630f975c052050ae1abe319d7ce6e82cbb4d4c53ffec2ca497ed471bafb6a24a6af382b52724929246935cff9e7473dbf5822c3a0a2783fb7a2bb44cbc5ff7896cf7600947e6dfff440174d1eb446b23feaf51079c09a45765e068b364a7c3b8c2cf8b90438041466a8b67bb54f35b9f548b40d3e7b5d7b56ad0f5d716f57a88dcbd8e9b2ee95eb5f779e3137336175e73d9c9b6b1b8a2f9f638f327d3fe1524b38a8b257667d9ac924bc0f52b36358412f0ee9356c8bba19c5ac2d05d9ff4b4f9af98427ef35d4ef8edcb3c9a7767e25408c1f31d0a27a810b51dbcfc61829620b68de893115215682ff61e9a4c39cd52e0c058d272d916fa05e90c3378a2625a0f2383b95a1599574b2d4c05170fe67f817c28e4a9263815983be184a256df4d8b992322e3ec95a94ba15d602275ed4c6516a51f0c7240bb266151e7b716c0659839430d667a683410ea27bf15056b81bd8018c51456571fac3368c4c9a5ff11158b1882f2e1fe99db7a5bc1bbdeafc5974e075fa562b2bf24a94cead0b527c918f7046d8520b2fda86e08a2464fa2440c83b82499eac1797cf72d27e170be1288661151a8e9b5ecbd44e7d82c182575660a42e7b5b0ccc79f081c7585e47990618ed0153363fbb2804cd88c87e84abfc95e56b7b75aaff53b9a3addf7592d668d08fc68ea5ee96fe5d4aa07573938e484add69f24629b79bf25689e79b4e9212644953e0b214e9ade55795111cb23dc0011b38fbe9d9c5aade80b1a199f01dc106082ff8c392be67bcddf72ea6ba5960209e44bbbadbf540ee48c3a83d6abb9830b0412bb1c135ae5647a5fb9df9e09463a86365811a12432e8b65b73e055c044dd99527c308b3ef3cd02897d2b6e78b04c7b5e4c499fb67834de805d3d44183184b1900435f39a181a5ac068be224f4875de34d3de6e3b880302a02280d3dca08179fc32646dd44e98aede20d1216c2c01fdb991b7cf45fb87384eee469549a59dbee798ac2dea2a07ce3741215244e5ecb57492a60cddf552598d034cc9b528e48c25096b4a32661060cd35b1c4b2ee54b1ee8b25a598dac2e473fa7958d26f060a96008f09ebd9dd96576f33bd8cd761be756cf78af443e3e1a4a6764caa1c4f2912016cf4cc3292c23b0b3c2d709e5efd3e2bd72cc46a6bb99ddd93ee59fb14785e9e1a1081ec2ec60baa1eff45109f805b606a620b8c9532a1b746e5fbae3cb3345418d18b6676c206a08c2ccc4dd7774996700935f76092e7a05813bb0368f1ad9152a2ac07fe5b5f1bb8596458a213afd77b054ce0091e2e23d2a4ddb38e337d9728d078baba585a92dde8ad7bd6d4442dc0b6a1349dda4552f1b8849bcd726bdc456d24aaa109e8ae37e3cd339cfffde59ea1d65feade892a01703a93768c7db699458c8639701cbea8304184b4fb957375636b64758777c21b5e4415aba5b389bc16b765ff9b5953f687fded40e645e58df53b50a2cf3d426c4735e35601a8f025feae588751201e8dfa54e6935bf1ecb15f429aedf59dfdb52322951c42c446dc9524995c995a4902f7fcb82c85c8dfe2530e44a8b4333c7cbb3acde6757db032e4f96f2614ef3f2857a244006b5b86242e591f66e3f641e5d83ea90f545007d080f0f9e7624396a1d16491576c6d16e158db32df903eb7f233e7545a237ed7cb076425a75c01c66173aa600d0c43c9907e88decc2a45a563168f21f31d7edd2bbec8a2578df744dc0bf99f7ab44b6b6c13462d44b6f4667dda86a476309f427570f28dd20e74f376f1db407023ff1285ce0aaef4a257c5855872a48d9721cad247925a8d6f77ace2ab92c93eaffedc12ea5e1c6602eeccaed87f3e064030c749456f9aed2bdd0a635efabb5afe4ac07cf7a4278dea4e91e1ed1737470d36541284b2831cc71c8dd033aaa2bf404d8825b75ac53e80ab0756f4f94c064abc224fdafffd8051597d3248bfc50ed10e68440c2ef999067072cb2a54a782ca966ca984654ae3f99cddddd244666e8a46df053d698405601a0cea568115375e221e6e7d66b27d40c1ac7c5595c13c179ba0e563143848566a7d87961bd7df4457c267254f27ab6073b46f7630e1e1b4d581c2fd5b9616bd9f5a70358a80b4beb242020c5806e12d47cce56341767350892ba764fb4084322a383a59f757f1380e859f5189cc4c402c2222b7826e82e6d5d7052a0006608c4de509204b87c9d49aa9a8193fc1f7a62f8b3017af83daec101849f052881922c02455d78fc3aca286b93e854ce346535740a6eda202dd77fcdf2394181bf6a7829f9051d1455da4ca360ede755ef0de4727356de37ce17cbbcbcaf8b8212b443742a7ae23296365d3c0acd6770121688101e5b353db83fad635a7834fd8e65c80a553f21ad45854aa7e3f83abc29406f714425605732434d4ccfa2eeb39e83ff84e8db5fb04f4991345ce53d560b9aeb6ac2ce5b349a1c8a441e749eadfc8f5e8f0fb223e9fa25753804489876dd8e934609ee4902a40a705a7503c63ed26f72f2ed4a57ecccf4916790ff46fe9f0abbf29d1f3856eaf2a6dc830ade1cf15a2a25264ee96de8b5be1c5aa39b24f4291aaecc2277e5a57625a9862f5b230bf2956ce80e606222869f481d7b1314a3034133239e8d71c27d85df2f6fcf662751c931667f732cf65139b4082b1d13fa7bb24869d1c7321a1c97370a8bf442a6bfded79b25c76295241a15d1f5fc153cd94d018e538055f4843a4d13b571f5fa3e12e9bb034f3571516961d82534f450940d64a015e2fc6af0998a81ab53989ada7896cf1682aaa056a2b15e975808f07a2b1169f910cbed8aa0be7ff789ce739b7e327e3fc1edd293ac8d4c7aee21b31334132695adfea88a1b50980d1de600b5441e5354a8e145d3ba59251586f6945f4d71df71a747cdcd532032cf5bda9225ebb7bef18a1bd6a70ebf3c6194d13859d89b439bf1658ce5de35a5fbc731e6d018d64a06eccf387497200b469c56c13e3936414d50bc546dd0f0d4f9500aa53a590afc147166439a9bd35d26b931cd17641703eece45e70e3440aea69003033ccff33ccff33ccff3d819df570409bd3b2525c105da07554b4a922d5b041502665f6003cdfeff7fc17ec2890a02040f1e0fe90eb7a7f8d57292ad82b45c6e4d51bc889638a96392b5a5f02737c54fb775269f90e27edfd2a824c928b4da0da2959e2d8926a248cc635693523ab3c95070e55f529f78c28509419194fd7163e53bf90b7ee22bc16dd4a429b1b5f304df29ca86f25c270c3a5ad2eb6f68cec6893e732a648354a46c9b58f53cc6d52474c91ed30463f11aee2e9a3e6399284cee4d8247a765fe60c258ea9bf2ec32b3752ef10966f9377ed2287f59028ff927459b58e16255893d2bc58572effbb4a1c4193759d60c4d52d4cc244ec93de50df929749024c1e7d7ecbf28126cab6fb63651f919125efcb04b52863bd17bc431e5a4cd4c56371a47dca14dd68c2d4f67298de054b367e6a8bb49533d326083116b26bdb0986c2c42cf694d2b6f6efe9d4644d2f81124053614f15d12c5b385e8cf662326b09108ae843949d8bc41449967492a44b8fec687c824e55bca92ae6bb035e0041b8678727e767ee4263e6da3109410a6a1a2c48bbb2c21f49433d9dd4ac8cd19326c0c620dd33995a6d08620ba92f4c9cc7e201693d9ac492eae6d1410e71e9fb012cc3f6471a2c3f32559cf4b16d8f003b6e7264a8d8d7d0567a08218a8c0461f123ef4c526f19ecb5919d8e0c3d21e3cbf6d453f49923d989b97d5c349655e1d2036f4d0257dab50211b794033d6f677a3b5648307b23cd3642bc6a5fd55f0031b7758ee42fa6fae6dd8414d63be212eec99b6a50e5589ffb99fa43a474d0727b453b666f09eb750b131077f63873c4b9a5672921c4c42f4c60c2d6f15bf387c1d4ed8b8794a8ea1c1818e31ae728e11b71767c002e80d36dc60a30d5c122646f3e6b021d9ed45d24c4e986b0d67eeeec890e94fba940d35944cf490e12e5c3491478060230d47669993b59c4ada4643925cb9499aaad3c619b2dd0bb1d5f9fcc46bc48619c8d20dfd17438d7e090ed847ca50ff966c455f7bdac98888480f3690044934202202840cace6f8953ac93d7c70a4878d311c4eceb1f3c466ced41964f0600636c4a075bcd0912a9d31ad2322223db01186248d7aaac9b7a413346c80814d5207ddf51e4d511e11110162e30bd707b1da2a4912cc922322225eb84f784d1542a225a61111912e24c6d5899292a6eb587ed8e0421d3e229f625276ce16caf7ca870d2d7897bcb2de7420592835763eb1d6e536577260030be7fd98ac7246fb14f4326c5cc1eddc9ce9ad3c367d464444ac40d709766d975ee3d955382bff52fce6cb19aa1ad8a00226acaae76aaf1e19a7b087abb9a5fc9ce4b4e3c08614940bff19c777733c310a7994a84ae9c32423c306140c1adc73cfe6496c3ff2843edc9d14bd2bad47d706369cd06dcce5e5eba9c41c036942ff296b7d762ad32440c828c3839031c2831e41dc064c286e2ecf2699a53be1c4c6129a1ed32d29ccf6c99a12dcd0be2979eec94193842cc51c353ddfcb62030989317322b222db38c2bfb184db641d1b46e03a5512234a4ef8b247c828a38ce4cd204301368a70c7f84ee37539c78ebb0d2224573e09bff898d0e0860ca3967b0be5a7fa5af9910b8cf1830132081106561574a292c99df2d9c3db8719272418e57a8a7f861e18e798a41cd54ffe40c82fc81721bd08e185f26ff2a99ce7924493110a8c00493ca081905d5cc28925e5096dd72415a28b04b98b3ab35cb35e2e5a37d7cfd86fc9a4181774169ff4702715fade62eba0f7f526d7d9545b98b1692e874e6932adc5c1432beeacd7b7420b379c695d7a679de5233d7e0439c3c70f13320bb32abbb56aeddc47cda040882c8ae925c5fa13377bb623222269ec06426211028b905784b862435a11c28a0984acc2ee0ab249b0f89f0c5185f14c5c4bfab2dcc13292000a4945082a424e814688295ecd954d10138db7d15228a751734a6d95793f529cc5834bd66dbc7e276414f5a5b01e8d32e9045f14bb585ba84693343f0f452171974a2ef55c5382025171b9cd49d27c267e22afcab424a7784c2dc413e6d0bc1223ad3cdfea44a27a995ef4138b17e644a9f6fe4c0e1d4b737213cd9f60172a5f58b7146922c136dd4c26e9e4e3434c08c984ee56be9fd54bd83862c23a7963767989c1d58284904b789ace53453c689a6589904a109dfa3dcb9c249467005084104a248d99749d3b7dcacc43266196b4761a57cb1022094bd4f8a1736fc9a1f6911e3e82f470108444a2d8b0bc4ff5a36b9721041269bc4d29bfda63087944a1666ee346257cea1f6e86191f70800ac6e881770e7cfce0801f421c4157aa2ba411079796bff7123b9c68064218e19669ccd5b52f2164119a24ee6c0ebe9f6de30eae10a2885776fdbfa4f4cc2a552124118a7d7dacc949db2735c23d4210913c79f7717299f82e1016841ca26ecb2d49d66c374f7520c41049d9ae3eef718f200e64032185e85eaec4caf4022184e0c37f884ae9e69f6c4444444484021f320863b54f73ce37cc07472a102208a3cbfcad5289b173de0c218170329649456d9afb5b0b2180f8f72fc8f59a14b5da1f8e12fe2eb6dd42a6a81f9e8b9aad3e635627e1903e14a531a685ae9d861cc287f3b5e3e6f857624c1db287e37a554c42e798b358881e12db37254146d334e72179e8d393ac5f98a44975081ef8a0a36db3b796ab0ab903eed9db3aa2834cdd217638cdbea264fd42ea90647df617ad332793103af023a6f94dad4e8a61c81ce8f7d02dd29229351a111149a38c32921e40c80891439969794633c571130b89439b1697763e262b407a00494636040ea58f7fd2a61a4744448090518390375c425bb887d733dbb8a1d8b4bda3d5f13cc85e868f1f3dda50c8dd74fe7d7fa903848c1036906e62548e09bf31df0308196b48b078af90ee4dbddb87a86199540bbf25edddbe232222dd49481ad0107286effe44347d39222232460ed8056e76300600c0106286ad63e47fa494a8259721137f47e7c2774a0d3d21840cdb9a984b0aff17e1a990319472f09d8ad58e6f133150619e34f224e1e4670b094352126c636731e14aa3400e3cc8074444289046f2e3c7052e30c6183d063b0bca2823c9410a4444c6e0410818f21aa9fecb8ff52eb220e40b215ee84d3ebdfc960ce942081742b6d081102d942fb5492a7f5132e573c02e9840481612a52f3bea4dbce93c1a675820040b8de6a70f15d3a9b4845cc1109784d0eb8d1742ac60a8fa94d258ba4865ad105205ddc35a54e3433ae44b08a1c2952dac745647c7306720640ac692888cf9da05da0c32382022122285648d0f711fa6902814f79dd35212337841cc2063a487fb800c203e08814272876492d22b7cc7840368843c41f7cb8c3dba9b463641429c4096a471aebd0412d204747a3e8698af0cdd9980d4beba749be0fded12308f7d6238918d29a42d085102f3ed7731e7e53b3133e000178424c18dab7f9f0f7565d24828b4956eb29c34c670861c813e394bd4dd9d98311462844a66b5e2971c327815528433b985e474524b8b0921428d61f0225fc96367c9adbd8630fabd14e2f2332549b082b19fb879538e72b125a74727a10630ba9d0be17f1bb37964f4d81e1410110182010778608c203dd8408d5f3026c45c4e72a8862fb2974ea1f15dda537d468d5e9c3bdd634da6943d2abca8f2676b976f7ec69c5df449f64ed0cc1553ba75712c2d9d3d399b8b3236bea794afc4dc4970e19ce5acb868366626b738f97ab424f161d93a5bac1e4cd294e44f397d925a785671ca520ef71dd3824f297fdae4f7dbb3b32879aeb524768c8a5522224180b80dc868326ac8a29c3a2d8917357694198bc2f9c7531f71040d203dcca8018bdfce4fb82454dce82b0c95842c131719d15c71cce961fe613352d30a2dccc7d206b3ff4bb362170dbf71fd24e79157c18ea5ad2a3b37b15e557492fcb77392bcf2394c85593448caa59a4be64105e76d62a6fcdd299a4b424acd4ed7254906354cf17f8f584a6531f6fca5e03f894977c57facb3a450dfbc930917556c3a2fa8310ad2635cede59a94f8c6d8400d51d4dab999677c1568a046284c490ecfba15f4400d50945abeaa43fc26f1e4d4f8440d4fd4e8440d4e503a9636bd5bec586b6c626b686204353251031329a871891a96a851891a94a831092d444ba6640118a18624f6f4ae26566da64d91a83fc951cd5c531e17755103129c144c37c9f7a3521f06281111111169e2d9a90008a3c623ee0de6194accaeca51106a38224d3989291e4f73b9d688b453ee2ea16255a78a1189c9ab376a6846cb7a11c9df3979acb81a3c4720d450445b5567da131583fb89c87abc5ceaf7d2e7434451e52d658f99aa3c3f849bc32eac5518e44762821a8630346612c574f3e45f28e0831a85687d73de6039864d138d8888384044640c163820050ec841102068dca02fe0ce817644d42084694cec3831f5f6db0791860c3f9724614bba5d1089f717a5f285c5ce3810ecbf5c4e1219df1b06847a593fce43fb07f2dc733a398931733ef183f9e73f675d3b553ae903e6e15d296a273109257c28f77b65ce5eeb6e49f6a079fa18eba71e0c97d3c6964f8b0d691e703be97fb3968bfe89874cb2e8992edd6fbcf10ec95172e2ae8ca787ed700aa3ba31c77392d6abc359ade4f2b687757428b7b52449960b96f23687a36b062dc14c7d4a8e1c281d4d169d6bf3421387672f7cea8ff54e471135e050f4bac5142b2656ccdf409dfe5ef59cd470839a236d354aeab49ea4461b4cf5595ede5683af63d46043521e9150a9acfa8daec1f094e864fd9d573c3524853c978d5927c7aab750230d977e2e4d1706a98106caebe54b4a16262bc91914cb94a379864fcf9a19fccecded6ca1a9e25486af4ece2147dd5c3c4f8634c4e76c7af31832edf49f433a35c4d06494b6bbc78ae57518cae1175ba72e5b8a070c499ee2c6ca1dcf2ae22f9c755d9ea3bddc752f1026a6a4f9a1eb266e1756135df1d0b53279e542d29a4445da735ae8b750466ecab1552d94a04616ced20c7a99fd93540e0b35aea0776ffd8c4911420d2b605aa9bff4a4d09255c13cdd5cf558154502420d2a9439256f73132d7938853f6fec1469c2a546470acdaa87e5eadbf3e0d68842f9a772379e673767a0e0753e9d12243fc8983cc1202e6dd5b3f1d9a1130ada49be14bdc465c526783f2399744f7e5083095bfe6b7e7797eff0975067cea39ab48347754a404a736d4837edb72d099f64be75fde726a1470216d2e4ff937e4e74b3c611ea24974763de566adf08456b798494a0da9a1641cf39dc5cb387cfd4d42082d993f867e6f1b373c34818cd6a2568495d0e09a3afeef2a974d958371889afb261ed5a32b70b8c2b68364b4f51a36f4502017e714cd1ef43b389871b7d516c7bb599cdc70fb9175675c558df60e279f2e2fbb2b6bb789aa9c75d74f95ae51c8d1c7f7847a62bc5c6cf4843056904f1437193c96dc9c1377797a30f7c9c56be7e8f0a39f860b4859e19ab9876da1c7bf83d7f925cd34acbc51c7ad8ea93d86692a8e98236222272460f1f417ef830411a3f72e4c1fc2589dd59a493a5ff100b2a90030fe518735d8e7fe61c678e3b1cf2b397c9e92b8cc7cc48aa90c30e26d93acc78b4ec249639eac05d69cc7d52a7a4961fdac11472d0a1d196eedb78fb54e273b02f7ed7cb4a98f8b70772c881c84e098f69ba973c5d8693c10125e488437b65659e97d3f2db09193f1216a41104004ec8018775cd4f638ce75be97e83495c3d4b927a3d794e0739dc70b8d470f91b1f89418e3618175cfea73bba3e9d830d468bd6edd3299a753ac71a887eb11c3ffcdaa4d4600c655b52a98935ab9221471ada541d3f68673641939820071af64ed9f2cf5476db739ca1d4246566cf7eb3cf7398a150e2e67e665a0636c53cd5fd52410e326421773733bd9a145e8e31f8d953a62bf9a4cb9ee7104362aca0e331da74f270214718caa3f3275766127e2b58c80106638808bbf7a4296cfa0bc9a9a4a757f1b024e885dc5376c459122c74b80b073f4f726bbd5c304dcc8e25dbb485eda2d47f6b460babe87a5eca1aa7269385aba412f37cfb58d0a72fe564598cefe71572dfd8565552e7ec94127258c1cc49a622f38c428e2abc25a51376f523324950c84185a7a44de9d672eee4981c53a83b8913e1c1aa3bf423e490829dae6bc28a1a85c7d324db7299030a467d84c49998f75fccf184e3c6b7e5d8b9db258605399c60fc6871c3757a23f626147f59fedc42b78fcb04f4e244f7d51b49cd12e8b0254efb4709870d1eed7b3e772a4b427e2362b27b7220e192d0b6cc9aae536d24c871842b4cc60f390da9241b81d616ad4d621bff9a1c45484a4153446b98f34e92830885878bc12f598671b4cdf321d91d6f34611c2a2a3387a54f92e10886337d2f0e60e0c93b4d8d8f6892022bc0f18b34c599e5b64c3a1ac7e10bbc354bacbdae38276f70f4e2f4a956ef20d57125bc28d8546d7cca76a18b5c58d9152b72bdc72a830317b5e999b89b7370dc22d93dca788e3fbf9b9b000e5b2c1ef65bad5dcd4d08472db6932eef475687b611072df0d09ea34952ef963642c0310b3b7389b9566a34991dc0218b47acb2db7a16ed13138b3eaba7d4b93c94ab05072c3431f9337cc6385e710e25aa7bbf8ec315e7f9cdfd27599279c3d18ac535648e27a6a0177370b0823e9988cf796bf53c3856d16cecfed418aca7c48c6800872adad87fb71aa7474d3e15c5a451a3d52d6a668f0a435b434d93a7e0193fc59617433a33835ad9a638f3c94675e6122aa64b517d8eaba74fa1bd6252f82997873e39c5e0d78e82d58e21729d4c12cd44145645fb88096928ba7839cf5286cecaa03074e56d30f5f268e627923a4acda7f31ccff744e1bbfaba52ed44ec446927ae227d3b6b0a39918b96c7768ef2dad626369796f3dead93324613aecc5b4c92878f3766c25072e5af31ed5462840942e5e4d0bb6b9a3e9748f2cd8d7a62b650a9e0b0847ef627c7f7084d15bd018e4ab0e9b97f629079cff944e0a0845d413bbab24e7c24e9e1c3063d80806312491e6d2d4bc5ec26562322223d1222e090c451eb6d7ff25373ec8c888804014724cace41d39af4320e489c2e7ea6beac1f816da8bf8bfeaaa5f650010e471cf216e7e67b29646e2401381a41e660bee2597e5f3d8c384ce8978eef9b9e7811be5b6ee40991f69ea308f2d7735e13e924f9611c89a04b8c1bb5935827443810e1874eb914e5b26a26711c82ceefef5c29da48a7380c917431e55a594ba7cce028447135524ee2db63ff3808b1866ad83239bd76a7471c00081c83484a57961d3fe11084d966ee841283ad25393802d14e5abaf83d169d96077000e22fdd64ab17c2f187b36398cf992b9f2425191111e9212222820b60a00422e8000a70f8a198138fdd2598e059c3d1872b5734263964a9a59c0f898916ab744f2ae9a4e0d843a12ca7bcde1a3de43f6d31f7d46ef4110738f2d066f9d6c8afb8f5141ee0c04329fa7fce991c2adc7b872b4df766624b0c1db4831dc42f8a8672cdfba9c32966be4c79f33d96659081831fe0a083b1d337a7d706c13187b3f689277a5481c8e19839899c78551cce372ee96ede36610207bd35697f4a162038dee0a55ff10a11df70133470b8e1a43a6d96d7e4afcb7fe068c37267dbd1bc43060e369453cdd6ecdf6b284ac9c65cce9eb99b031c6a783ed33b6359dbdb9986e773f7a675fc7cf2674444e471a0410b15d359ffb464fa6c80e30cc9f93b8cae6a5a4a9f0dcc505b7774dc283943a78c348e326ca13289a9c2e8a5c546444480f818711c64308a9675c6dce118035349b29b170f87184e5373b2dd95901a33053c00003de008c31b2f47554c25edf63138c070b44af99d49f6c990491c5fa063f273efeae0f002f62166eafedb3e8aa30bf77c56faf052ae591c5cb832677a59ee3f3b7f0b6f6fe9690c570b6488cd6da7104716ea8ecf9ff973ada5c281854258989e9ed1ec1f8e2ba02af1ae73b17a43c76105c64fcfb29c45255909e0a8c29ac757c3ba26cf09a9d0f69cd0bd11ff572e8e2970aa953a45d5ffb89e21e09082b65ab26d118e2898ea511e3be6bf4c0a0e2858b379f753e6bd7be7094c9da75ae6121c4e386bfecc61b358bcba58004713d0607fd2559a92b25c389870a985ccb1e5e358026f1be3c768d5d86f7d0087128ce87b8d127912eeb8122c53c481044adea9edbfacbb6442011c47a02b85b0babcae1e5c12e030c21a5334754b0f13971c018e22a89a32858ba99e72da8c88889c8b000e22dcdf293a49f2592a95ac4044c4c70ff781193ecc20c18d61e021dbcccc3ff355f087a7e0479014888898718630d6d4a8a466f223222240c8c8410f33bc8c337c7030bca94e727d7ef408188826417253b67db0724444a402377ea16ff46c9bcbbcab9b6484c730377c617bafaa56a5201dc32040c6a01bbd40b4ce773f07dce08599664dd812db7d539a811bbba8e3caaaf38ea78cd60d5d186b293d25ad73711ccb917bbf8df5f2062edc363d13ecfa6398f3c62d4a132e65373b19b1051b3a967fca96cebd47e0462df4ceb1c755a79294ef1f36f0e48c20490e7ef8e080dda045ed5ac172d608bb943322229286d0e8112407df801bb3a8b3491f6a4cbaba74cfa1d1c381fc48ce9045c952899f323e496d4e2c4c16d95d662d2c1add90a788480a446ebce2dc9aac69df9cac6a4444c415ce499576aae7afb9c08d56309f9dd3ee7db678ba1313888800f9e129b8c18af38dc9397b9fb627fdc72a98943fa93446549779813134704315775a4d4d92955871bb54b0b17e5377d2d7c87e046fa0a2f4354bb75a3f39993d809c22d1a283d4acc9259a670a3b263a95c6d768934ab1f9fe44798e592c0cb8410ab4a3d4e9ab360aadc59220d96be2b896033244447280861924b8218aa43e5fadfd122faca168df3a7eeeb6427f0e8a2ec646e7af389bd46232cc484c30060a6e7c82faacd935f51ae9f1801b9e385acb7555082170a3135db6bc6de95df3f8991b9c687d2cd4c90f1bf4d8c4352e3e3efa9319dd480f1ba0b1de3dfc8c8481b88808057e2423dc3e4682780e44447e24237c431387a6abe76728d9e7f6c08d4c189f362b225e4d9ce806260ef6b71afda2e57d342222d269987101119134cc48e8c625cefeb768e9e92e21e086256e5402336dcd193eab2ae41ef4074444c600c10d4ae4155e2ed555489cfc24961bf5a8d614c2bd95046a172515eeb9965a24ee709d41e43e3720d186126fb3a27af6cf474444c6c88088483b1967f8e004f8b8f188630a8b3aff18644c331c03371c818d470b6f4f722c971b815f7994caf33de9638ce8dea42ff32a7f04a11b8b286795d6fd8b4c25c728825ff1f97fb31c2ba43fbc7ff8b0c08d44244972af4f59f28a332142f78bec8ffddfdb7ff430c3cbe8a1811b876063995fb987fc88cb888888218e1ffb46212eb92fb4a39d1c3509bbe00621740b7ba23925837873dc8b26e7f9687249c10d412c97eee55f6236f94c20ec907937348e5d8f090a6e00c29f2f2949e55e103446f087d44c14f90ab657158d8888a8e0861f1ccb1a37952407031a1803031a68e7e48c14a4e12128c18d3ed0ae2e799e53924d1d72c10d3e7c75b939c36e492e5e066eec61dbb312dd7f335db52322223c70336ee8c19cee2db7cee7461e4c13d6317b727633ef811b786864dfb5e27c0aafd911119105dcb8c3396c0cefa61e3327d934829c9103b74353721d63349ff3bdeb40577e56ae7cd241ab1caa4c8acd41dd4ea79926ecdf69e8861c722bb9f1de2c72e98b4325a6860d7926ccb9950429c3bb0137e070e30da564e749abf10d377c52d2eeeabcf95f62d0d0816b600337dae0776987ece828d96783daa1d22235e6c61a4eb9b2bb9a50dd50c38d344ce0061a6e9c6193e7d644cb29dbf7bf61062b499efc2b1f9541dbca6af184a8fa3811c20d32dc18c3b9fb4dda37b92dc9470cca9b9c73c44647fa0324b81186caa662092b13972d9be1e30637c070ec8d8f3b26674885cc8d2f1451f6ff9943bfc7df0b4fb5a711ddbad44ab9d105f272ecf5b7cf05eea42ceebd4929bb06c28d2da03b3da13b92b1bbd4029ac4848eaef39db7a471230b495317a32feeb22c8f05d5c4d7943db4956dee0a64d26072fab415ee4a2579a26c974945c68d2a2827c9c9d3e79cde3a4a854327d3a5cb583d710a8ec9da593fa53559298514dc8882313753dee6f3dbebfe06149cd6ef35314fbf49f92778a2cd6613a4b5e5351bdc70421bbe2d5c93e6dee534a1923afce4f8ece7280a3798e0654cbce5c877557f099406ff31f9183b7a2b3794704a3595c3c74e57a2e2841b496037c71ee99833ef9c48f04efd52ccb91b47b8373e4379c865704d176e18a17c2d958996db386f14a1dbfc124e4e69d9ac45e10611f8fca61bf382d4758c8d611463e36ff8c68926e64b604318b698b0c1f2c9631eb30bb0118c4cf44da2a7c4e6fbef061bc03047d728b117e6669367b0f10b254aed848bcf0c367cb1947d96a0e341fb62bd3098fc896dbfd9939c106cf0c2c62ebacc16c74e568b6a1aed030369b40f0c7c09d20842c60f1f37484600e4035fb0a18bc4a4986e1e55af76511bb928091e63b2f74646066ce0a2e4399cdb5594927eb2710bb425eaf472a6d795b630687e12a6ac4247ac5a2445d5379b9f12d70c1a67d0c24cd2b47f9e9db8e3cfe2123d4d983ed59c722f8b3da5b7d54cf499d36351bc2c6a9f938592731c1689264a6d45fd15a5ff080fb617615157601d6156c29fe798ba159a3457da93ad517956283a3d9226f468b8ab3885ffc669c5e89bc3aae83ee9a73d53b1540ae7d2d6a282527bb76806c9e6d39b400c2a988268cadf4d7258f2814c4193342731a7735238eaeeac56a85220461452936a2f06ab984b6606c480022126640917dede997a823b55a24b06dfdd11c57082727963963c254d3879e82467ae9c436f2e0613eedc1aef2eae8f592704622cc198f1977365992f4948036228a1b95c9264b82b3155b8013192b069e9a7b2eb943f392006121e3951db132d42ee801847e8241f932c2b7fd6d2474444ce8c11fe4b29dd83234092910f885104c2e414b3358979da1e3188507f68b6ec713da6941bec18069ec2bfe9954617bb760863d5f48e413f3f460c76042339d2846d998a59f2c00e6024d5a6a67aff707d5911111f64fc62954da13a35469ff97c41a69093c352896ba301e9c59b42744cf4a25e89f2420b92529ea2df85f9c49fcc51297f49c22bd8a10bd5be52dfacbb06b972518c1f43e79bce3377a560072e4ae2e7764f31a7fe2f5fb0e316b5c9591f22230a76d8a20ad14e62945cf761ac45425748c9e9774edc043b6851684bb158d65a9659f0e927c9e6fb9c4b7a9060872c8893b3c6b497e2d7a223222235d8118b04a98bc1ffc711119113ec8085bedd939f43752a497a4444a4870876bc82dbe8947b7b5f324e3b5cb156a5358beaec68052747ffbeaa32614a9a15bc274d692b136149cc2adc143ce7a48990f2fa023b54b19418c5eae75374149841da8e54ac6a397eb92a6dc20415f9479fb4b14f769ca2d8579aa2597efafc233b4c91c9276fbc0e36268ac7cff0c14030b0a31445f52593bdab2c1ff4c18216ec2085b5ee6963a3edc939368a76ee3dc6cf753c5a51a4d939db57baae2e83831da1386eb45bd44f69ed2f65ec00c515fd042929da66ecf884531eae5d3bc91b5bf384b92bc5faedea44e1dad5517beca7264eb8276da96a98cbdfd226ced9263f54cc5b59464d28e9d942b9949948b45cb17d82c5676730518aa11b276a697e7f893cc68d4887966edb96c8a7b62cc78b924f629530672c299524c5fdd0d70e4a309e71163f6c1262ea1d9328f58a9f667dc7f8c90448b3df608724ee4c62a936af417c9491821cec88045be9e1fa2df85709422239fd8995e35faad1ea116efa57f8609289976e479cc44dd95d3732891636c29cf94ab629d94c73ca08358ba5e69a0a9f6e2da294a3c465ebe31d8ad86476c66267546e34115a86aacfa4911ff34484fe9ff251bfa4ebe41ec2b4b1aff6d162564d3184de976309262741d35f85e82ec604ed6413a20da71317173753390832675ee7a32aef5304d159a79f9cf953c73809c49d5a3e5ee5ce6459020873ead7790cfe81abd41b2d4e97e417f3c321531c93cb739db104801176f4a1cedfe79de353f0243c2222b203325a0321d8c187e23a347994f8c5380b61c71eb8dc6d7337a3f9bdeed043d96a5e5bab2978bce48193a4ecb29304ed9b320320d881876f43e34b43848729f0811d77b073f5bc7b9ca8d9230810347ef400428688089032c8088246eeb083575749721313b3a30e599ed0a92eb3fac23be890fc2549b1257bfa1cdd1caa289725bce4a6f34a1a415060811d72304c7928094dd36a7d471cfac8983b7c9c5360831d70a8c44d733125b1fac3fbae013f230d15243bde909b7aee0a99ea5ebb1bae53e9f4f9c1edcbb3a30d9c4b75ace01fca2c638231829051c61929a0c10e36987f3774ff0793ea6e0dcb493a65326fb1f36584033bd490b8dfda7d096bb9ef1d697866f32c78417a9046d2021f3c50810476a001134da235ed9ea124e7d63be14cb69eca0e33944bb69370a26ebc4f193bcab0cf9f70f163395c98c990943e9a82c6a8bb4ad9310693a6ce147e532ecb80058821b92bbd24c9e58c69c3a069b69d4c093b1a27306c57b95a99a4cee48fa92f982b5612436f2c417edde1053d6783c5fe7e9a3449c18e2e94d17e42bc9bac69cf327cf8d815ece042dbd3b9e9f1a949aeb670a8e4f1637ca473857668c1941a2c58b69c6b5edd91852429fec44af7ce86754444a487193e7a04711bfcf0f122222fd88185d76635254a70c715aad3b98b724952596b87154ce28484ce88f49c35821d552023e5754a3629e76431c37360031f630715b04b8289276a9f58139b1d53b0d5c28479d17ef8e84101158cf1c333b0430a76b2def124f92341121388888c0449ce10114923c88e286826a74d51a2bd67d43d82fc20e347901f417640e14b67f2d459563bb17f0236b6b9bc72a86a779d60ca8ea7280b7de76a134c6269d2a7de4813333b9860d4ce398bc79790b9099a523831f52fdfa1844bd6fbd974525ab9b823096ece326a6a61a2fcdf8104b35334bb5ce9239416eee2c5ac3b8c704927d2d93e3db3293b8ae0c9aa58bbe7e99c991d44e0d3df65f4d87d1d2f3a8661a53799198f55d5be30d679edff97cfa4a709465ec2887b32314dc2a70318a7dec7244489c9793fbf58a3e6eb94a7a13d73be384b344c6dc6f4c2b8be3bb3f73d5162bc28ad7430d7cc39475776f1fe6fa67fde3d6ca043172639e5c5b4186e628af7c03df0c379e04304a523170957a29ba96c8a593f2eba984ede2dd9a38a949020881964f830c10b74dc22b768b136560e95abd1610b74c6364c4a928e5a24eaa7d16467426fedb4305f38d1aa68ce22d9c5d2e2671232643c093a64d15b4b4989be39c91da3041db1f8734e2bbe17ff4349ea80c52587cea1f63a62c2d8021dafd893d4d9e5dd84053a5c61598a4e7889584e738c76337c9491011191d6818e5664e7ee614dee74b0822faf1867ac5b0517edd69d664f10ab55e1ccbd8c7e4c97dc642a38b3b4dfd984fe2c295478c2a68e5315ab4ed3294e297b123654980a1337c5f9aaa5a33aee3a594a8106bf28d5f2e82045d7d1156e345a8e68758c823651e53fcb736ed245614af6a6a4dfafaf6528bc1c16c37375ca12962fe80045752544068930c1f6b3828e4fe8d57652bd0996fee7078ea0c313edb8ab6659b1093a3a71e8306fcdb1a7ca541d9c28d37f382bb19a0f3751479f8ba72b9bc79268c237213ecb7d9889c25da3a768cca4291d9838a2d2c68bb28cfad925f00ff64912f3abc3126c86dbfacbcf76925702d3cd2144ff3aeea39450b4427a524ff7dcce24daf3bba0db1f163949a22c265db9bc2a93f047c2368d96d1ad2f2ac6464444120d15e880c471e9355fcc8c92df3fe264177276498ef9d47684553a9deb4f8a043a1a8105bd60b94c8a283933810e4678b6b72925fd4d696d1d8b60935872e5c98707597528a2fc49db52ca1546fd2411e55776d6784ef1b9bb810e44e8aab6f5d1395ee936d2a3471034ce30e3033f7c00f9814606807890343000041d876035bad4ee49619f53f7011940d0f8800e439445e236ee422f874e54884a2c0b6352d684f0d36f4cd00ff14b2beb18c45a312726fb389e2e17046ad179a29ffaa7e804a2b0f13cac233f2a3a80d884e9682949795913fdc1b1101395c37a820e3f50139e3506cb4d9a1a1d7d7883bf86e53c81a0830f7f5ccfd456ff2eb5ebd8c3626539c9a9eec434d38321b764d14a7eb731a4230f9698a162495b999227c18391d39d476fc6f37750f7cdb269882701a4c30ea47c860af1de1bb175d4a1cf2bafdc8cc9df8d0f1d74c03409fe6e3926ef9cd331074cb3586e4979b30c02c4832422d02187c2ef04b77c313ae250b654d163653c4fe1d60187dcd34b0531fb0dc98974e4dfafc30d546e7e4b3dd136944b74d1f7ecf46c396c7835ee7aa5d4d7b057f470129b4fa898a9c1ab365fcf9a4c2eee693086c547cd98dc1a4b6ea0030df49f986ecdae34a5fc1912cb674bd5dbfb2e378319d2fcd7372a8339e547ef4a4f6fdf92c18d1735dc77f55878633886cfcffde311c31e3c46ff46eaefa784c1d9bd0c9ead3567d7c05094764dbfac693fc45f503556a95e0e7961731fd9cd77ed9bcc2e70628917b25e672a2f174e51355416d5fa924cb690ac57dda7e8b4f054cc262f13ff1db42c1865a97da6abd4333ab0a0e798b2ee437b73c53bd07185b28a9cac494a269b9d5670a3735af5c77454813a299a7472ec091b722a1c2cbb47d405fb6e7f0a7cb88fd7ef8ecd572285744ac8cddb4c92073d0aeb66a5d9937d12e88042394f9e379b8bb22beb7802e5fd751b7312b35cd4e1842c76b4bfee7b2ce96fc297f2c994fc25ece8a8830979942df92fcfa03ddd40c712c8f1244b74e7752861d7d7b0304bd1aa4e7424413529e1729e930f9b1d820e247c16ee6249f34a6b8e8e23a039e57c4c330f298d0e2350d1c49336ee454711dceca1e56e96e43b131d44306c5efbaf96c5df358ca22e4aae0d353b8b0b038df9b7a4d82f912ac9418e60fca395162ff3c0d8c2a7cbeec77ed12529e755f0cd17650b16a36bae62de7b91b86faf66d3a4397b7841fe9414a34d70a4c7193d7a3020c72ed0f8a8a16312f1b09932fe72e8a23b4b492b06cf33591b393972d1586e1354fe63650f4744446ce043040700921c2073e082de4f5249d5741bd8c08708cef0410211111bf8284302396ee1e776984b1dcbd24573d882f29c6d75edacad5120396a81550aafe1db3d62de1cb4c0463ce566c7149390e5608ccd318b3f655916c6c8d03d6262b148d4e4bae7b9d5f3c9c9018b4d922db69a58399724af38e693e24c37f304b5b8824dbd3661b3c9c39eb48250fd18ab1262c5f796cac3587efe93ed418e555c59f3335af4c9d1d3c8a18ae32b7cf6e3829f89e64805e3b9baa33295f67415e4400519362649a2a4b8d9570f729ce25c9d6e6b533822228201535829946c314b5aa5284c878ac7b0964f280024072992247d75fffcc4b31b8527de6ef93d5fb25ba2f0fdd2a3753299185d288c5223995b2d57a70814cfc6e8191f4e6c3fa14f1c1dfc3ddbc560f1724f9862887dd92739fa4f9d602cc95a576a0e4e7819ad84cda9dc52d71c9b48f0bb8b96951ef4a4736822e9c684ee36933e939709538c716d23ccee5208136e922429a1c265bbd4e5b8849d37a6e76a7da57a23222219c86109357649628d86f020191772542231aa53ee128ffdd721420e4aa49faa6b7669ebde24083926614e269f681dfaaec30824292303392461d20b7eb949aa50aa03492331418e4818a531d3fa3266caa91c9050e4845ded486790e311c9e935eb976b5c474768242087233c7945e3c46062703d0a391ae14d49e273b27c962c23de984bbc8b551a4ae54598f249954a2e8dcd495184257476d46f0c0df32622d16ece9327c9d01444046751bda17e94408e4378577662509bf29bd110578e3d93a3618e42f0167e5359fb84f8af4fb3ab6bcaee7910e5143266c959c5f27604816dea4cf23d26e58fc911883b8949b25d4d27db09fb1866e400049b367fe57c6594918cf1c3004948ce67629e2499b82f1e128c172e2a85b48c84057530c011ac746d3691e9fcc28911124deea63374bca7b508e598a149efd55e4dce0044b0e494b34982cca94589c7300c6e7d5752b6a6931e1428050f6158ddebbe71a354873e18b5c9e6f961ce1fce031f65f81969a8c00a3c80d10965c2fc7a8a9dcffd42b5132c4b7c5aa2c417f89944a75abca063f5e24e15c3a69b31bfa0e1c18b4c0ae9a541db63f2985db496c33e9ce749db0e70c0071eba40bc2bbe89279a0b3e3479b4f11739d9010e7a7ce265f4a0000558100237f0c0c51e5bf9f2b57e63bfb760aa2ec5ac4ca5296e83f6e6618bc23c9c14c6c39a5ce95adcfb316dcc9f112ed28888488f1af0a085791bbe9652acb7f6b3f8ec92744c668e8888c480872c2c297864ed89b12809953c7cda764c65241e04880dcc2003063c6061da05cde37bbfa2d0e17259ce2b155676c52a121df16bd28a572ca4d27c7bd2342b8e177d92d03e7ab25a3c5661d558af77accd5a29aa28ca82492789e6c13b4ac18f2040121ea9305bd2fa94a316ea5378a082cc2785889929b724798a742e83e895679362e7043c4cd1f99f14d7744e92c49412f028c5c13b87bc546b0a7890c2b09c5c4b925ceb67192ce0318a74d6efc48b16e463c54314e8c6b8d1dc4fde107e284a29e9b7af696aca37280c6e65728e316adcea7ca2f91825d77f33a85c3c3c71f449aa7f873c3ae1b5f84eb895eecb56041e9c68bbe64b8a9591a0a1032f234143071bc0018f4ddc953cba790ce21a0f4d6cb697d9534a77fbf68888080acae09109c3d87ec7545c860ef6e081092f4ff3ef7e8ea5bb59018f4be049ce2ed9b721621191e4c7064444921f8e3c2c618a48cfb1f3b77ee9088f4a9c52f2fd9996b3d9661e94784bfe8edb966f3ec6e7318937f3523ef788fbb61de02109f3aad42a3e2ce6d79491e080472454fd547234314d6b89360f481c2a661ebe922421b50d783ce2e4bd494d7fdaf7f32309303c1c614656dc901293feeb22221ae0d10872fd6eabd7deb26c466452f29cc9fe93c58b1671cede70ba6e9e53a5085d3f45973c9fe2560a8f44ace1b76d3ea34949d68c50e0fd876bc043c003119694b26fb3436a1cf3108cda788aea3c0f435c9e755fbbd7fdbdf12844ff490e91edccb0241202bf247b39e7247f09161e83a8dd4acc79622ff4f43c04f16670d168521acbea7804e2fe9610f70b2556ecdc0c3236073e584484072074d5a041ca3e4687cac81fb89462c5ce704f61353cfc704c32d2d773d61f551e7d386a53563473d74f2f0f3e1cec83e668bf9bc71e0e7149455cff6292e4f5a0448e985c92f4b9269e07afca4ef8d49d3f7742021e782849a2749f749736647d8753ca4e2f699ad33bda81f4b4f694e1c2a30ee78e95fd7c729e685278d081b7fbf46bf5caab180478cc41577f8d79b525efcba10e67b2b9751cfcd0b313d22439ae091cb029c9c3447d4d55df9054d94bca54dd607cf16cbaa627a5b6c1d0d997254afde2c986d2e5c9a5b9ccc1b53564996afe5316d5f2a8818f9262d0a824da6ed2b05ddeea58f2b5be060d649b701f3ea7249d9c014dd24b9b341b3b496f862da4442f3a5c4ea12fc3971a9de6c49001cb74223195f9c71e439edba492832d06faa4bf15f3e849c3906435975ad55ae382c1e05d929463af98e07ee136e1c3f49e78819293f3af4e0cd5245da8adfc4349a25c602f4df95aa9664fb76065df94a1452dd815b38d59f4cffab2d05ed818dabb93760e0be62b9363c89c5f614d8bcbaf5421bdb9154c318728f1afccae79150c9725d6c9c4509939155ad3ace9a88f3e954fc1ece4314e27974277bff66a278cf5517034465cc7f2bdbda150dc94502577d1357d42257c7b9a984453ef84773b2e7bcae136be26e4a9c2a2b38afbc530e1dc714343a96d892fe110f17d1a53c241b5e593863a0966ceaa26af3412eec93131d453defc1f41df1e0d2a5e266f845f63f4a6db7914e17ced9bf5a6d5e2e641845bb3c74cf1ee4eae876132cdefd8679772164665d1297abe2c266583a107c912e42401c6d253b133a7c9e9fa0b634b8c75ee1de3555f90a31627f5f3fa077b71c99e1dee355ed4513585cf10311ddb0527556dccf36fc93eba404ed0ca984bde1c4f2e36f10f2755258929830b3e75852679e25bac1f397d524c985fd816b665779cfb88320bd7c26b69352997450ba43b9f099ec349a6cf2249f7d89c2257f496c51ed3668a65ca3ee958944b9a79ff1a169a5758bdb994f5db576c5d826812db4336ea0a77ad3b9c099ee2275bc109369d84cf3e7382acb83d65a83e49b8f66f15a7dcf1b2ea946ce5a8e2cce3aff1747ee3a9e8b3b2797a8e37372accd615fc63730a3f097dff1b53fc96ad95b1346ac894c2935e4f4e5249cc9d14c7a5cc6cf796a96414644e9bb4dedf1c912896b034ea256543c1b9540ee182c22a0fef9997a4b0fe13961021259b30efb1f64497c49eb314dc737c3bb17d25b1a24a38818999c4f25c37c14d6870d998ee3daa092a53f87c5666c213ee52478d63ab494c50f115cd37599e944c2e81995ad8d82cb713134b5c1a53e70953492c4c2a816fa6a8923a7fa52da184d17aae3d3cc924acf866c2e7c6d968259248b828a7bd1dbc629544a214c5b4356f98852881c4e9b3c3d6f343e32579c479ad43760e558249491c714992c8ec6876664ad288feab4c537891dc9f11c5dd7d5459592ef945b82ef9c1a39820db2bc2e9b0599df5c2e47c22b23cffcf318f082eaa93e5d12477d00f910693d64ef4114b6143f45d95f37c2f4f302944a9844eb9bd2666af84d8375a32e9533ab9741064d068db252b51828228eea6eb92f1fb140c44995f92e42702a28c7d526eeba656ef0fc7d58d3639e927c9a37e3086e6944e4ab48b39da8752c8145af163a129e5831fce375b2add43d1ae715275bc4549f550f0d4896e4b5dfae7218dc88b131e65dde3a16abb5fafca517abfc3e92a5253743b64f919b3c22495933a30321e1bf33c9ec4743865bff98dc7dc53cea1ccfa0d4bea52ad1c8c29ae899d581cf2b89649f02ce14057ba13bb6ec5ef936f48d2cdb9169d74839a73b1e2d59caf26dbd05e66f6932b9de529d9806a051337c65d8bf935606fdaf1e29d901557439b7df66e3f2cd54e439227fb77c74fa6180d49e9b35c48545e74cf605c0e65bbef51c935c39aea92ac9a512d4aca90d89f4dcaea7176563270f2d58b56fb5a9b632827df3f31c978124a316042ae499bc478756218e8b5fcb37a8260286627d1fb84bff31cfc82993cc9619b553c58d00b7b4a29ef27f92eb8b21f374d997c1de78227e47b7e5e0c7bf12dbce6d983c9e95e096be1338ba9e07116ccf338f9a931f99260e170797165df83977a854ede5bd792c4c84bada04b6aba5adead18ad02726fb2e5db14fd2515ee7acb65625bbcf2a6406aced5a999140ef73497648fb9b8a250d8a731ddda24a5eaa0f04875104dbd69b3b92798f42fe59274d173e69c60b23f5bfde89a80a70bb2da6f41f5724c70f7b563ab7c72b3dc12e83bc132c7e83af62b2151353e2dc5e46d3f09867af95c7298389723a15815de363f82c133272977ac19d1087e45d5467ebda67011123627d3af9c3dc40520422edd31f9591b466995275f2d877cd68491e49673ca923eada8168cac3f362f7e88aece8091a51426a5e4999ec4ec17c52ce127e3ed6bcccc1747a7bb4fcf7a51f0963e170f1a4e0e2f7e493bd1dbbf525ab60bbafda362c911e619d3c591d9b2c2d88a5ac672518e51375d5b52521f175cf64af2e632b3a0dfc24c3153865f8fbbb52da864a2d5ab5d850cd782d050e298afee569816c6a0ea9e2932ccb2b3383bcd45b6e25497c8a24d616376990b25afb1385690f832fd0eb5c222e9fd779592d4f77c0575629597c7c5acd315a757c54ea12f9a5cb602cf4d214faa7c493f563cf6fb96af9d5594f5f156bd957b324715969860a772f56797930a4fb8b859d3725051b67cf18a29795dca3945736e173e9a8931e4a648f079ff68dd936d97224d3d3e9642a39b2c29d4d01323a2427d4f46c1469974264645415a387965baa7a2190a73f0ef3cff28a62528923cf24db4f38937a5dbf0bbcead95270c935da6a6f324a93a91e07b69d57739bc8613fdba7f74926a137a6be53eb9fb3ba794269293ece1f3fb99b8644bccd4f13f1913d8e4e68e758973bde524e6ff984c5b2259338485f954023b39b7b8b1987ba68441fde6d2633389844e49decffe245fd64842935f4a0ca196a49cc44482fb2417264a875b8981c4aba9dc73a7645b92e61175640cf19d6282891947a826a57c1f45ca3c338d68cf2ee550c9ae2b6618b126693cc87dcc228c490a255ffa2b9bcb2882cafb17aa59b3f2c624820a6ad597a454f13c22ae93cbc28c09e6a93f442b955d2f34f64636c439db9669f2ca3172218c529aefb62f782c2184521fed34c93f26940cc2cb5b226a42ab9a2a08672f63cae431d2c540d86f9a84125c635e1110858e1bd314d5b73b7f48c8d47c9a2a3fb469fd4e73ba856dfa704a72a5d2d928f788f870e757d77429ad2ea23d247e5cab545c0fc55ea6d8a99097fd3cb8991d76a28f87a478b131f97f52fa3b9c314f8b77c94ce47638e6f7c855374d61ae43219e2646534ae1b374387de6c6acab59373b87e28b65097afbb52772787e35dac6e370b8bafc999c9b32091c3ec125aba26db25cdf9028a15e7d49923e9a6e58835898c9b8283db6e19452d6ab1c73d42a366899227f728ee953660d4fe7fc9375f52f4e450c351ccade73ca39bed9a58891062c3f6a2ec1c3bd253968a03a8c6712b39c01b1f3dc147eb2538f6298e19c26899a92bf568c9b11111131ca9067c99673c57fb1b0c9a077bfd5aa948c21073e7c0c400c31b41964f0c00c346c88118643c6ca4ba12c4d3b2ba30c3242700331c060a8310b16ebee9953231110e30b6278014f0d1d4d88c8ed9bbb70bedc2f612bc74e192ee38c1c7c200d0c0001929840052222692c10c4e00261c1b635bc05a24f52ab4a92f1cf820f708003cec9f3400c2d7c56d933d56d23222239c8021f2265a2cd57979efc0f1f41122cd89bb15212770ba2962bd47772fc93db6ccefc206858215963fa9dc538b1a902de1d0d8dc3a894cee2a1c1a1482c1007c481300014b23c2b004313082040541e0c0623b168246aeb1e140000562c1c463e202024181220121009c3c16020100c85016130181408878381e06a9e86b1a0f321382943932685b316d3b89deeea1e35b62da4872d44e9014be98d0520430115105ce06db4bed536c8ef4910ab4e10f1e807afad1fc2607b13e892d5f4104481b8cc3551e1241a12bda36798d7fd1fc98b9f0f2a575d9ddbaa20c420554b99f463949f5792a651368dbc69eabbe8b8c571dfb1c096859c1aec77036ee11c2ec459637e885c46309546ccd52ce75b2cde47d7d988b93bb1b0a224b305ecc8b1faa84cd0e98b79e108d649bec69b7a51dd360b737bcc66811ae0f7786bc828c1d6b20f56f290018c23b58b71976022a6f09155d347e34c17ceec6bb04da2986986cd07e154aa9b6491bca55797a74f50560c8e1f4777f7d617b082f92d223b3a86ce6793c9959516497acc9a095c481e9d8e6351b6ea75bf0bbdf4c511a70900e9b93fe82a165726269eb3dd43ad46ff6cae6913edc19d5598b95b83c68725e6d2264181cb78d2e57af7f017e37297be88babd721615899b3ce61881211bd13f7df66d7f9b7243d59b296174d39fd26509917f1501ae8c1b4039179cd18194a05bda0084a0e023954fb6601b16c0fdb905ba617ec722307d9d2f13d253501de36613da5a05e5af05579f1b2f49ff96f0ab46c3e9edda2b381b7a79f265248fb807dff8148db979409dc2a20538c69534978162f027a60c3d6d472c4352925ec47e576b94ac36bce049efcb0a16346bf070738a71d0ab9a87671a571550b3b4a7fd675a687c71855258513a29030cd57604df50085341e823d93d5d34bf06b8543ab6cccca759dd3ae0b78885a22c6bf25efaf0a9e49ca416f2dc6a9773d9b03396714495d0f46d8991a6fc99be59db4afa23e290d272a56571bc146da35eca8b612fcb2e24cebb009b95355bbb8a96adb2791e881150586f0da9c94e4b4c85dc4bc7adb08d114cc5f58f82eb33f413d6cb32daba5fca832f220df42037a56c182ef4abeae3b846ca920aa909c014b78aabb2dbc61c9688696c40c8e523f9d3a85ea0bfe8f4b9cefda2843fb27efaee86f98bc6a3eaba266256ad582716d8f7bfdf9c5ea8a94f51f1d690de0d68f14d8c4948ed510a15859d2d01a75fc559e1460d9cd135ad882b3c765159cca94096101fcd90a732e90b81bd119750fa50cedaccd46252e2b808e5ce76a65fdf3fb2573da98fd03bcec835eacffdaa68ef40a1b325c3b42e6f369830fc39b98d61438f4b627db962ace7d92086f46bc1797b03aae835cea9ba583294c643d7a22613fe32e9f2bc76e1872534c4aafe6178b11a20b680c6b5b3f2762cceaca53745b53368b9a35ac0ce7661cd31bed32c0146d924f897e26ab3ec257d4ea3364ecf05b2dbf4cd99d54473eb772d7df3ee3eddf46fa7651afc05b3cace17d57da7abafcb5e22ce588800d47941fa79ac12b13918179d040685ea45b224e4601846591a6c17dbbd0ad001b481cd857aef365641847a5df5321dcf2a8f722a36031fb8af63fd7e68dfa77edd587d3ad6adb10dbfd035f0d61d9201298689eef14ace8c635455913a5c16b767e754f3965447cc5325d4c1911420f81a62e44949928e1072047af35fef3b16870c81a2c0a859a47babf3e508f5d67033ed4ef970c19f276693f47cb5bda9c1e7d5765ce1dfa9f5abd27fd3fa75b5f3690c9ab48a75336a3deccb718a827394c4164faead868fb54b6199a5341cc0eb567b921c643bc71eaf6fbf5aec56ce3ebb59ecf2d2ef3b276ec267950c8f86e74d72aec633d34feb3db4a292590b116d11bbd5f2b4b37a567c5f7c5443b119fbd07d9deaf5637b3ef3df39e41a5f1eeeac0566c9ce75db98092c41fdccbaef350c715f63e76ba8be27c5cc3395364086ae92a55bb2fb9cd23d8fd570958772f5f1fb4c36c898e2772bbdb42fb5e616dfc0f3b67aa1470b48652e225ac41195ae5f26e90e4052268c569b058bc60175694bf3e0577874ae6a4e23568b6d717530ccf5c518d7f3277de289225dbce9886a39a5066cc51c99832cf1ea78aaa03a2cd5d28c073d39f9fe01ef0737e01901f1891ce3a7ecc15e0bbde6fbbf90ed34a541cb15222d6b954844421564a8c7d9e159b1b0fe035cb5bbc1b427fb8d768afa69f441022c976b55a1b37c766375226fef68be7cbd99652cbb534a0457123dcf9cc387b2c576d051e68e4cf32a43f6755832c8158272b1e558f053b0120840a3d8042fc644a71454202f1a3858ea7013ce79dd9a9b2e7f2f47e6fd2f1f810f328a805d44aa01b32718c610b7aea189bc4216fb308827a762cfb482e3e3567cc3116b9d8a09f7c29e06c82b86f71b75ae95508781a95b124c1f9c2aabd8a2ab96f64bc5044245c62cad0dfe9b07b9cc2da1914eb565d8e49639be1ec34a492577b4cf1756c60fa539da8ba06e25f5e247c7a02528e1e72e6c0426aa7aed46429ff6073571d4c9fb3846b50e711f02bcb2fc1d7290c6a8ebe56c99b338c06c0907ecc62af3b24abb4817e5bb7662e331e80c57fe53863835f579de8a09172b4e28c058927d3655f7fdd7ffe62983496c2af84250ba9ddc33200a914129b50bf4b1661796750d123086b10593284c6d7158b130d0c2aa6500448b263319364d8429051a64dac2218c281397563f807c5be4609c352029a72e18d42236cd4a58b78ffbe6e995c95bb56c41e600a3325ea8f97f6a4130f1ab56ef3d0e9f0d721d3d52b48f54168bb63c22c7fc4d4d64fe2e118f7ee66c1a164f6cc5dce2787bb83b83a54a3056841736dd420117c17418ebadc8462a71f21f6b0671f2ebca612f5f53e831ed58fddd9ab8167d2f46e9dc238c784b01d9ea59ec0b1db9732a2ac882a0375eb73136d3d144bd7cc8a21bac4491381fcb55e487d47b677fe1632cad7d315826b9f61e9f7fc7c0559c7156374d1eb92ddfad936baa42782325f5dbc31502d17453c54e6f53e64bce18b85065b8e0b99f9710d64e1d5216c8629da440a4b35eeed7c13ffc6b2cdd04056f6874bdb24e756847c9264ec68f86f27ca62e937a9d2c8832e0d4a40bfca4a1356f8d5725f7ebdcbba65704560ab35f179997e2c3221707509c387389802a31ae650e845f937339e909ae2f156bb2177109a51ae0fdecb61a3e8edc2b7e3c51f1c7881293c0c852be80631470acc57ad2256dd5b217ad8691ff58945c0c93316dc1f184a114372d9f84df4d2d38d99a2175139f6c73f9d20b01fea09c4bfb9dce858c913449279b126c48749988a4681033a0cd06dbe202a03c3d3e29bdbad81ab963d6ef2a48e9ebd53ddf0b8e673d6925624c56f061843f2c67f5c803f4fc83f99f032bd44d4f4baa1904e671af07e7bc689e3f5de2b675da8132e2e89399aca60782dcf6aaedfcfcecd87c9b09dcb135ec426b82e642d56a0d30aa7431cf4ef6eaf680ebf1ee68cfa54b66396596b86759009480083bb66507864e93ab45205e5a1616711d16004db07ea757c3e200e19b4aca5104301d4146ee8274603f061fdb2d6cb39942533a50a4faf3e32671914228f69bd301881fe9c676293af18741e33611b928d82fdfea88b043de9b1ed6a6d2cc7162178b13a8fefdf1c4b7cd077547878993299a873e1fba144ea00f6c34df5b28d24b92141df6e0ebb7e044ed92a3a1b44f267a26e780e9ccb3350ffa4371261572335a185e0a4b9c37a15e88ec422e0c3839e44a80f5a47e8c2fbe37f95aa1f06d217a6db2fa5008162e953d49b977b21be60bbf8a7924e4cee9a270532f26544d4ec8c672f5f952ba416e72207701edf7bdc39fa0610ec3a1558f54295e7db6c5af7beb6b58714d94d78f0e49df704e6d8d3499004b8a5fd045da371f91b158da06ecac64dcbe48327019fcd90ad3c73c3b056b8a53a85e0f345d7867b5e9e84e6b932806650e2a5247396f03ea0c8ae89bc4952f40cdfff5a8b1075191c72b13995ec82da97df58fea95e43c46bce9a64a363dd3758455ea51ed2cf76f34c6a69da0fadb8f8a966322b462eca1aa9333016592d77ec9073c85293c36b0ddd3a1852574e8fcad0c2e468a59c2ea622a359fc91071c63eb57073a91e2cc967f046ed7799cb26803ed3a58a341bc7cd7dcb1baa24b8cce8dd91a69e4978a16e89e06f7213c46053e588a62c03e3cab02778e8be2950fcd7c87e881580208d55277884d16c53c89f154a1d1e3f18bad42d3490d33063dca7e639eaba30d4a2a117c7ad038b9884ae77f6e62fef21c1bee81f2380821ca0d3ef188fd5a42459e526f2a52e61c59af186272f1b07d2c4c529c7412c2ceb6b6c25b3f6d66537db56b2c784b0c4ebd5f00e009eb3b54e027e5254095259bf0892a0113c36541aa89c33fdebfdc69865545307478cf349d4c5b31eb0252b143f8de0d622812d71b6820bc842fea0322b630794639c9b6dec7ae70e0f9fe7b901e59de24311d74939d52626b896e4c7698bddb2a496593129f15913927068a74beab69d42d248d0c2aef82d8a62b95a5cf085444c1db33e2dbb170d9024de7eb462772beb02a96800c22a6d56ff1172336520630d6fb9fd4b17fff217b8f60a19f5f5f375b241f7553ddc6c6466a84c710cc502778818e508828763ce867e0a8b514027f2e8376e3c1c9e7739889fb76e643cbf6326d2cc6a8d8a2d1954fcd49a803184aedd1fec8701595c94c6f2ba8140f5916e65a0047e59d7fc76cfeb3de3d31ff1d2a681c074978a3a8a0be88d13abe73d7d34bfd9f0e932707f6d3b751c5dd773ab65caf6ae34af8f47b69b6dc6f0ecd883c72eb25f31dfd6c17a3fa44034567d611870f3ae94177aaedbe0839fc1c6e0e6b6de1ce24f0cf067cbe6d1418f41b904444abb2474c844e1269f8306765d1ebbc2b7251f03426180d8894f0a94f90cf7789eaf109da85349b89b0542171878c36c00ff420dbf1d1749715510a6cdb3017517b8538bd7d63155c3cb98814970782cf8427a174c777634c8dc43715003467d00909a65d40affd57481e7064bbbf592f1d92bef2ec0fe8dbfbf92baa51684eee88f24cb6aa082755902e0810838bc00d5a8cdb20044f637d0baf132f5b1be80ff09ca239322a1506d4e489768c93e83339d34ee3674d23a9eee2b16ac050209afcefa953a1603048d4c25f46325a08ff610c3722209c55998b628cbf2d71a505248fa72b93a21fc6dca31496f2426d7c53301af819a7e2d6cee1f23c98346d2d9aa6156145a2c9a8e3922c99edbcdcf3582cb506decac35b7468432258e7c811c9ae17014dba2d0e747c73fbeba8f2942691ab52b9330d9729ec2391657cb12f0c77238029502d13364c89ce974f1b292072d80cc34bf6dc989d785109d0e1b7fe8e2f06785233f94ff3ddff9a4b0b81d6ccd11ceac07d54ab2aa240fa610a886567b2e2b5a5e6f35dd4c34eb19e39638fa86e8a1c378ae83e3bfddc5031ddac03fd01dc649aaeaee22a86b63ea433462a3e0379cb66fa294526098efd0cd0818d0927cfd7ebe4205d2b660ae719af7d2d819ad4081f1fa1999b71bbe8d65af00d71b94fdcb307636c77683655ad028507c0f03980055081715124f93e14ebac08cd417f161daa2c33626673ee936d893d48f48c23463a70ae552aa017b20074861be9d11a30754113b28c18c7abe4fd34f0d46435a73f9c1169e9b2241a80fb50cec0caf24c1402d04ae3f3152719f560306d322e8e9ea4eb22573bf0e3946409aa4b3c55a18a606f6b69e3a61894ef9354358ba52778f690250fe7e9611c9117dc76f4defa10e31f4d179f61391110518cb5cba4d0edbc5bc14bb5d98eae08d84c3bb552f99ac355e682cb6d64b01944ae041419dbe72f5d06a0ce3d9f3d4f75ca8665e90325473b2557982929629a1393398a381f280bc6903d56c30766ccb036afb6d20d8eb0bac41b6aaf009386e3984915570e515e5420d49fc5b0323977449180e4c56a2007bbd6b065e6eb1563406c29938564a3ec6d5c0b0cefd6b1cabe652f02c01a2a29392c97dabe98e8caf217d09f109dda2d646e1d5dce4276b6f304794282be5b8e4b058e6838a5319876b89436030ded2dbd89e8608269d4812cffb0358cc45bd600a2c5852d0e7cb1195b615deb7c5eb5bfb03d13b17d7045cbdcffe85921a4215b24348fe7fb1fa718429465e8963eb9a4327012ea7d27da92b54ded76397bd0fe2611632bb3d1e700ac02cd06d3a0fcb13137b0571f868cae00f636010f9604dc06e69c5cc3ecd3d5e0141dcb7db708e0bb55757c9d909627eafd0cf56b1b918c9eb0050b0cbc92ca461eb3bf4339bd03949010a88c5bb4bfed7943a0f0df2e9d2f4bc79f5cbd35a8cdaeceb4b3215107ae6a77cfddb0b36af22d4ec1cb17ef5a1adfe07bd7a2aa2ecdd60fc186268361280adabf0d6c24df43423add2e922b6a68de1b4246d940d5bc24ad2db909756e24b522b84ad23b994e98646f5d66d04ffe9d8e5fdc9231d1129621f6c069e90f67ea86481b77258b1218216dba4dcb2441141fb61216e1da3586d0a81430233ed55f5b416148b493e07e5ae5ff7352fe3efab7898c2815bba205e7c558033294750245ecdbb64e75dfc3593ac25c0150c40517ea9f4ebc23bfc5484b63edd4fb99c9a5cdfeb3983ada01baad3f003255b3e866e9d3755a580f0c0d80b3901070e7b06f736712b4ac494e7357194a5000e5baa07ba3bfc80ae082a923975742e8e35ce886409a07dc8e9f542346dc530c2563828806d6126e210d9bf8aa8fe9ac58ad34599025532ab51626f194931fb30542d9013626932613f8d2b2257f4cd228648ae5814b46b510aeeb8c0f4fb22d43a54c1ba99aad0cfd2c43524b2165e70e2c2e926aba958fa0abd395999eee886a23b1bf76b63aa77ec75de0df77e5315390304b5201a55b1e1e8236fde6da7eac4e9c7ad41db2e81ea380551789fbee867c2970b2952b7a060d44d15e717e0f6a557500d7ea60ed86662e409fff19042287fc0e8732f280161587972d33f8142d4d912f373a727c27565706002e9ee41344c0e71a8f127672dc5074d3b8be0c14c3b6f045e714f5ff4115a50734ebe7672a3c5f006c0630277a2ac1488f55a60a176de723deb14b51ad1f8ae2266234b3e81df4d714d17733aedb18586ec43810b0e59546a3ee7cb93da21966aa03db07dd1d2563eae1761f9e172d78fc56886cf711aff27407c64a59b72fc79f824cfb5f166ba8ed29b9d0a9a14e1c0c803129b69560356a52642b39417882fda1f02c9d3c8e5702c199d24339bac1f9e238604998820f07d28786d0f719464a6b8f18ceed641bc20f6c7a2d478bf3b387928b6bdf86a226f25f3458d8a2b72555d3c53086253f7fa87e6117b680d91f7386993d6e46cc73c6cf56edeb892856afcadcae80eec15a5155e2f4a3dd31ac822d6b990132f38e908d81273ebe6b26fae17b46fe29eb1dc4d73c159c23d3f83ecf44e99f1a4ca0fc12e620fba7b52765efa77f1524f60f5c6be2f1a6adfe12da3efcb06c8b6e43fc907ce6df7a3edda3c0bc831776ddf2a08b0710641fd99895caaab3e6abc3716f86ab52651e97cedfa3909d39288baef5fee2e59a370b47c2f434faef9ef0166028271cfb7a946e945e80b395fa413ba35393372c6df2968269bac0c197bab01d6b326d33e10ed0cb267d9ea6b042fc02307ece29b3c67802df619eee6c60ce7c0a2a49860306117595dd40bfb12dc9803b0e0497acc951d605404879ea263d02c57cb63926029bb0a1238b12b3ee2e99adfa7255a887fb9afc9443fb4e36d4cb7132b26ec02ed625832a9aa6d172c9f9f28d0aef830c35cb8c7a94a5c17df4db8df653e7c0819a22867d8366b348f4d7aba6e835272ff96af12e2d174bd189a39b6c41e2f5eea66d0ae8a4e238f81209e18a22124726d6b5e35ebe5576ba45ba154f565367cf6cc5627084787d2cc5e8064c6619f11b5fc0477ba02539f669a49080c96cc8a86fb71bc2f880a19242c6197c9d31d7f603847a5ea3b6056519a8a94fa6b41bc3af71712f81248918a9181426249aa5f3502235a2fc7e2643f414e091c3143a8679efa0c795358b9e53d86331db70f8db8b1489114169d8e23dfb5808af84a0f3b21f407a8a0614bc6bb8fc894bfda2ae89cbb7efeb16399d51b469e9ade7179b6dd05d987274d72a653b3b49997c2a073b5f2a9e834381f78ad8bf3cd41f3efe63d59216909f9f986fee309ddb21a17dfafce3cfe12e236b63fc66a0f8cfe4d23c8edacff2106174ef373022d4f20053e782910c3c6c270f1d6861e6dfce10a5ca23cfc22d06b4e7a5404c806313475baf222bc4a50008c0f0bc7b469f9cc0799f72b5fd15af7eeffb9830e571449d06d937ac1f1349196630540f105943ecc68aadb354624759257f9e0b0703981e58717be48fe5248393aa7449086f3522db55c97ca934a3e6de72e9d0c9a3628e808dabd70033f61ea619efcdb841b9ec4e9e3f0c7268611aef43b0cbec896dd7f10807110a8f2f3cf439e56948cacfe42be06851054371d809897fe1e695d941d5ad4a2b78f0bfd26a108f2ec975c05d7d61cde0521d579a7a2574ad1335a8bdd0de184d903d09aff8627410f081e52de49c9cdb15770ea7f98ab53773193daba1cf8db4383ad97158732c9d0285d34dc2ef0b1913e94cf8281561c21e245aee6dc6fe989abf390db4a096be5e64e31453d519e4372b13d990fd7435dc97953debdc7930ee5eda23ed4c9d165e0b9dc5b2304be7df81ef164693c0c2a94af274f62d928b1802ac587937ca735f21f7073cc673e0ec6b7357f746fe5902c8036e025bf390c73243370eced38d75a5e6adbd2a21464f41ca2d2a9b2c99d08c89fa251ad7cd437e2e528cce8a903859e0fac35076b7ff084caabac03bf83ecb975bed5d03a1971d1c7b4ae3a50b28e10b293d58d1da14bf1476075750b4833579acb027effadf2cb6933163f57b963a8abdf9d2b6e7f47a3c5a5e51f04841db0bf5b302aa894d68c87a7843c873f49869f8f4cd768e0c5255f6b38199df465cbe281b05f5b4614e630896e4ebf41f11aa055fb56cf4a51db8a8acd2a5e46a3d3e9009fb9c08b33284c05ec54f40f571bd9796dc2b83e06a99356abcb7109109a8b64abfdf8aed6e9e6f34f72118ced25103aaf3cfd21e6a0002223e24288df8068892a0e809f70d68dec7f7566f2fcd5d56bfc032c442554baf2274a60e363541c855eab1dd56641eb81148779a0e90e6ffa068d20ee58c5899476d8b19379e7299b9ef7568c5ae1b0020c2c683688bfcc92c13550522c4d8a1dd44fdfab2ad30306d14129e89be90952e5ca4cc8932cf0ba224af7e1554a0b55af4e2450a7d2f02f957611f8c8e06c6e63eb5f8252fa32fd56b5969b2b13fdc09e246425a3bb20b01659d7743cded222fd81af44d55292982f5dce496391782b5a70054963712025c495a7cf91629ce06d99fd448977c2f78313684c6cad5312e0ccacca6ced253846d58726875cf4d729c651c9818e5b57fd2299bde6428c432dcc1da190731161a7afe59c329d0d2cf2d0decc72533b2224d8928d68a465c557a0561496f3d1185f0643b0e883124a571cb3591f189e3a613f02f05df76dfda008c5138a8f264da2a6c57fe0df0b411209ed8e5b7e2c8c5811f0dc7fdfea97d5f6e01d39a633c70e662ee61b9259c707565618a7797e8e87c08eeddc48d479e3110a6921072a9a417b8093298958d54356de3716091ed587515ac3b921eba5f880c4001dfee51a01361976578458b5555d996506afe40a2c82ec82d92c49793ebc2d3449b87226b155017c801d0f01c01c2eef4af242595cdfc1ab37ed745c3253cb1178803cf31c11da30e5ff1abfddc146b0d368a2a500070ac5d9f12c7f8af87fef7ee2b127f9cb4ed649f707e30c72190c15dd6ecfcfb0dc50069c6f489417717fd3c563f0c4bf567d3a5e76f5b76a3727bef7d373af418fd98955b14b472dfc89c39e7ce8d1172df58383ecb7c133abaf6b408119ee703c02bebc1c4268e2e1202ae61c6c1a1d29f938d39d9450ee2e9f3f2d5d1baeeb5cd7317fe9b18fa7405a0bb30bf6851e9fc4aa68b965b8e4a6a3bd84737862d1ea725023d285b4ed4b14240260462bc38d59eda7c75484d4a1ef53f29586704c80e7ed07e8e8995d31eeded9b015ea818cda1797d4d40efef13ee1fc2bc14e7712a59f279a8cc5208a6c1943f4f2d807f8c63cb96fc96cab6f3bb91b7d1a451ee230c085b6ce9f6c4e1b70e456344b4785b21a19849ccf186ea3849988a8d01f98c157a45c7c2dc8012d09119148af7396427c3e554044c5a3d5191fcdc244c79a0242d2d7b8a695027df393d19074db339ebbd4b9ec56d2bb7904e62b467ff107a9f1aff03e8ec9e8d61d95d308a5efb8eb5b99effeef53a06d8594a4683f980f8fbe5abcfaa15beb49d26e42ceca45966548dec1b84f5edc4388e2e672123c09852bb80c4c182d1ba4d4324675de4422dd2ee5a03c881e6b7d16e9e5b99b2f2d035424fe75fa511b7d4ea4505fc3722cb19247c9cce9483252841e173b89030c0040ea1cdd74f4d12ba2703e2f9c48973fb4c70dd02e17e1979b9b1a9fea555265fc07ed863ef26a9201f128ef37c90f622b680599b0b98a335a91082c3e445eac51b0c61938c59a7ba2eb0082e12efc39326d6bddd467a7b2ad00ab5641352684c2fd7dd3a79184b98bd8698c54e7006662c570d4aa86598698dd9bc394d370799f784fa53171b0d71ecaaee6be62a6919da2c4dcb46b5437bd77c60fb6c6577962554f859fa9a3a1f33297db5a8c6abdac2e702c55ea8516d312ebfe61c1d3b6d5325c76cb3347a43ed9c479c53e25837c912fd690a0893d213bddd91b0baad71038c34d2e308a5c2b91659e9141a839814f0aca6353beb9779fb4e8347699b0d139964f2bc787a0b03127e5c0efcf3cd87f6c5b942e15f5482623beb44f34e913f15aba358d1787bdb2a8cbca3edd34e895b738a379a5757a1c485da3f191a7e286aeccb56a22683aefda49b078f884e762ba90c6de17706a6771822d6225421da829f976f5160cdc75ce42dc1a926290bfd84105e02334a1b4ad312e25e53c30efbb9a433da7414f022f71e4fcc5fa1043e4d6115393a262550c976f9ffc4217038927d21cd0dcdbfc69a88e6ba48d110512ada2f6d0cf5141e4a02fbb6cdcf2d7dbcab105f5e576c00928974defec736369b7331ab4bfe5828407ebb76b4e3bf289bde93d171358508270ab432848fb9da5b854d2808af650ee2ecc3b2b35aa839cd14b95424bd7125f146dfa12167701fda193317c718d1e82b4ab84eeb40e96b35c141cede4e96292f037121b85826f1b08d31ebda52e7cea07fc217b8e073415a81a892f051eaf2e07caa08787cdf891a40d9bbdf18082ca1edb404e67d2b311acb72260c63679a7cc5e81385359aaff1e94009d45c81f3dcb8ebda8f38e223950f8a9f4a296abd26ba2d4c45f0fdda50b3df123b8d96bbddea882c37d043ddf8bf89ec7f48b2812f2d1136e2f100b87f279991f257195e319d4fdb0f0726b59459f330a33935417f1a685945a9173c25c139f6796890cb423b3674688a0f5d8abd105391b2cd4ae378ffa9e84257cc56e114711003c5d4efce54ec91a2a785dde35821723422988ec588c5226ecb819ee808091ce1a442ff17e748c3b353bb55d13fc28a3740964990d0e38eee0983106d9a269e5d194bfc5ec3045a1af626748a3437904c19015d6934be8c5aa5cf9a99b2c14f59e2b3da5c2464a976ff7a64e422a2890987ee09dbf9dad1121dcab8fae93258fa12d1d34a87faaa8cf9141f54e152ec4a30ec83006ed462c903f384be5843c8a91e807fb63411d0eacaad772f5c87afe1409885894047dc1ba7d102040b1bb96bb991871c5da472f5c0ca78544fbefb0e0d8ac0b68cd9fc3a263bcce26a1bfa43e5042accf070ba83870e78afbc36cc0178ec42a30d470212452e3c20bc08c42fd3e79ae7d0eb97894ad2495f8ea086705fc58fb29d29146289f0ac3237fc1bb39f98f12d71bd99ad2b6c6829f961718af78377b4ae9d3d9dd93b793f98d0dd94458971869c5ed51d31cc4ff8ec2bd65c84d337bcc507e69199090dc3e1318ba512974117fe26ca53834484ae7ca235be57a46752ec147d90b4381be448781dcd2b31f7ee96fdd5b525b0cab02d56a3e86cf4f48d1d2a9edff5960572c3c1b751f6798c0d97c05839479d7fac9966b5a32f094970b90f31a4d58915fa96c4715f01b616b273d45f945f2af5054843e9772a64a2511911aa45c91b03499b3adec69807445a1e12637282fe9ee70923b4a7bea50a2510a272850d7d6adc3038bd5bfc612ddbe61003b0280aaa296851a3dc856c28beebfd79e01c0472d30c0b0094331a8388a87f5772edb6dcd7a8d7659200e10df4a5d48830bb7d05358dc4b5a6d692afb71dafc5b5050c85a3f9d6dcf39e0601c905b36eaa9bbafa5e386b9ae007e6f1063b128a278c72bb3e0d13a42150d1a643fc9a26cf38d82e82f9d455bf0fc1684af54d7a907676443355eb31a42710190714d86a22616f0742daff1cfcdc4eb005249eab02873345814df6eb62458183c1ac1e6c3a89f91893f9adfa2a679b4a9b8c2606c198c22c8b15d6b05e509ac0d29c2359162c5bf6893413fd8dffbfdb495ed9f28c43705e32012e5da2d22209f86689407f2a56498d0dffd5e2f3379ec1479bee109cfd313f34d2444b11b0e139cfa5c169db120bf46e11b5ba5a09d758b39f50cf97a593baea00fcb6b12f66e016ae4b78ee1edaab492a76cf3b3307e9b6c62267ceb12591c94a0686dc1a548ddb1cce6610b2c7bdec910a61a571d87859adc19f40d7b7c889aabe87cb115b3ef08df15597ae3cc7c6e91f5fef6509ed26ebe74e6fbaf1016d5b28fe28385dd3cb52836dfc9867643367127d0c038b3d1377e1654548aa1f7b762f6799666ccff9b4d68a8814900beeec9837e8a62c89fba3040ee17ab66d26bf4866f163ee5d92aaeefe94e7d8cdf8f70813a43cb63277e833b6159307851a5016c7cab263e221004f0797fe9eade7ed1eda218c3e1f02d17f1b8bf72f6710421bb2d49af0ebdcc66bb9a536d78bea5034e686c227aed950c24a4c437d35eb38db46388c01541a5ba2453f7070d7e92a69bdee32bb0f561b2c88cb40564402b2129d4e6ee1114453d825c3152c7c07ff256aefd35fe9ebeb1362b4a5f3e36be62c03bdb20ca7c22e8f1c3d6ad8d15f62b38aa79f5252a6f35c28cee211462798bee1399cd71ef0ebcc353190e0018dbe4fa450fc09e92536cf722dae3cceb50e0691b3792e942a40183a1e66baa62bb2fe9e0d8fda3c0ac9217476b9bb72fad3a1999e80d159ffdfc590904d5168ccd2bcd190239fd698780ec45c921ae554c9ed5a24050ffc6df14f8f1fb12538ef4cf3aaa446f511e42ab1fe7f94685e985239246ca51cc46f1cc80c7d48418e2e292396a41ee578c134a716442ee9ce8780eea6e3870ba0b1b1d5e15d6f4e147c80c442233f6f71c54f8e8ee02a0239be34dcbec97ca74f36f4d137c09e02fe7839d8d8bf9dbfaffce28a3cbc983f97653751ffd26ec449831f219c6954280d539c085c132ba24fdbb49ca515e6ae350170622c8c622f0e1d4386dcc235b0bb129211dbda777293e750e3182a85f4da0c0b3ef8a60c488d8902b08e86b63bdc858b3cde2f634c42c6da5bfad9bb65971b6fa240c0602d56dd2d9c65d1b576c0317b09d5f21c60c1d79fb56dbabb4edc6b698dfa4736cdec47df5b6dcdb2666b666e92032c451e573357b44d9191707be01d3d2c43d7fa130345f25d1600df5467fc2d2ab04bb2cf03032b170b859e57c022b5f53b0afaa68f5fd11bd81e6fa8f6a263f5e3d875b69fc2795d7ecfd68c32a65db2c6c930925332988a9159137497e3542953b554892922e351045278d088d7862de46d81675c7096a0392c94e712354e636a6df5cf449775756e8ace752f692511b5d2144dd0d4b447f3900a8977ef518698131513c4c30713ee2c47a6fbee02a53f9ee16626b096497dfebeabeb66c3fe2d588ff330250a914598d20dfad5f9a6b3157341ab5a4cd5cdb59c90769c2a86e7173629541a60b3c7118f4364caa8ed7fbeca00a4418125d980e1ef77c7988173d912574018c01a515015ae9654f3650ae24c901cfcff033fc0c3fc3cff033711f11fabf087d42f021735332bd491553804f49b2256da0528702c06acd750b000000b2521fef04ba04d4046626715f6f3d414a74001831b8e4010d100103aaf098c596924bf6e7cc24a54a16dccd5654f7f4f9eb138b8428d19aaf5b0312b8a1811b9fe3010b4a92c49c623c6be6ccd9a041438cc5f17845afa169af2aa3862bd0904b57393f7cbe8f058f569c243954b4606d52ec30c78a0183072b4e1a3d2324530cb7a4e0b18ac7c259464fc971a62ae3860a1eaab0fa3f336e9c5708cd06182710018e11e4b821c6231586f3ae2cef168d1f04a35d05220840131ea848772643bf899939666ce43845628979bae0618aafd24dea34887abc67f02845656a72ee4aba393ffa82072912bc35df945cee713119638c4146e7b8d18f512c7a177ab36c1b354e20821c37fc218a44ff7431544cd2b9651b346880710211dc7884e224670cd90f1f3ddffe0728344bbf8bd0c814bbf3893e4ccaaf62954992b48287270a636299bab935a5a5824727486f2d490ef331d9e99c287a5434d1040b1695df846aaf6e25979cd4414d60ad67492eff3caf990953d0d4bfbe1126ae9bbcdddb0b19837a094dcaf61534bac9a66e09d33c6ed24fb933eff5e0510993ece13c7d44094e54cac4564d92a4ca63125e4a7b6ecf6dc1f3e721898305fd8c317ba7bbf688c49b1e97c9ea2fff49f280c49db39470827f8f4760192bacb36f6ed5ac2334a9d28cd1ba182f783422a9d5a498b346060fd7070f46545b62d6b9fa2292cef1a44d62ac0873c8edc8141ab5649388d3b4e593a05142878e88ae844ee1ee2fc54c8287583ecb49fb39b64a5d0cf1e6d458d3599ec287856826632bdd4d0841774e4d7e39ea06eb06a1668a964a9a3b00c64310b7cbc7f5f84134cb1488dbd5c42e59bc73a70610c6d1df0e5f7fb96efe439549aa0c156366932c7ed8ede4641932e46a82471f14937d7783e7ec489f0f5ccee2a1f355698c13123cf6b08951299ed7bbe43c2278e8610b6e7782c48496e77958f3cf5a2eb94d755b81071e1893ae3be935dac9dde30ec60ed50db1e36f96b643db274d5f788c9c9f6ce070336e781d28ed99e813f3e692e4d0a1fbdd6cd1f26bffa30c1e73504deaf8ef97c3d34be470a5989864f3d98d593078c481d1dbaafb7c154f1e1f70f0734e1a2696f882c71b0cb96f7d5a75c2698e1b922e55366e4dc1a30d5cf494d2cad53668d058c1830d9ac5fc1a4226e3835482c71a8e7b13736c68aad0c678a8c1e851dbe0f2193c7be391864eb69c72fe7e678ffa030d6a92429574827b8eb939c339a6c4b4daa525ff38dc060e6a6ce161066caf476c335450f994e1faac94e6277d8ef43668d0a0c1830cccdc96bc7ffeff92338682d5d749ee7be11b13c3499a0c5d52f0ac50d50d1c6c19fb08c35125e512bf23d35609860a5af000835e1bf6dd15eaa5ce2f24c45efac73c9eab752f909db26cba2e78a9e7e24ea5f34d9a0e3cb8502c295e56aa8d75cd630b68b4ccb40a3b2945c9430b776a55f579ef9185448bafb9c2e4246e4f36c2a8a1831b5bc36fd4c041468d143cb040bccc796e8d785dcbe30aa906cf99c49c7e58a14f52e85509bf9b6e03c1a30a986852cdc54691cbd90868d0a8f1a0c22e7d9b647de557330b50e03185e432f9723db7d3461f5238442b25393269755751f87373924b9e0a145e8ffba49fc34fe8c3de87137895b8b87cc184b9cfa309497256cc9ee52e554699b069be24f9a75b476e3696c079672a4b622765e84aa8aeadbc2e7892b09ef6d87f2c794cd60712e8e990e1545ef3e8477054d4d75ac34f760f8e8711f892d4932465621a0b9111a7cb4a39a1323a5e71926437394a345e9e6ad0e18a5678a2b525490cd7b1abf740072b928412e5c3fd0995ddb30acf54cbe5ebf3ec2fa40af44f663ca5cc96fa549c26c5ca9cfca9e72bb4810e54a8a9f7c4312d217bcc5314d333db751f961f7698a2f23519cd34be7549ce6000133a4a719bcb49f3d353b92d292ebff93ad0318a46cf2ac6287a6d53768822b1356f787d4f22f293d1118ad54e667366b2d1010a7a6ed3eb7a7ed7f73fb189c1c46a37c790d1f7041d1927c473f892f44eb8599ed22594568a73c29c67d7621bceecddc46bf3a929b49a30fedc4f68fee9707a268a6a61a4bc5cd63dc784153bc6a764fc126634bf8de2294e4e5a428f2b556252fe1faf129f6be7fa5c0e25feac9fd4453a935025634a93caa4b48e24fc78f213a9155172249428b9bc820809c7a44e19db7b44ef92c12a87da11e5e98e0e17ea461c34ab7ecc9ec9d3cc8ce8afa2f53d851791dc51fd4493a02b1f459817523b5abeada913c164e731e1241711e615d1981fe2dfca9a2fbd1a22394ccabb2b16c21013a16653532124c4196d378b6cef576510274136ffab8b4f452a08fb2d443ec67d0b4f209455cdb7613ee99980f844c33b6d93c9b9fd8134593e78949824e9c40f875aa7b534dbedf48136fdec71c345c6c287a2cec97aae96e48a720f666fcc641dc674f37af05737d8e807f370ccfda1b44dc4c3e59f1f932396cec33b589b529d31496515433b1426c4d96cfe8f4b5887d33eaddeb86f3e3974a8a34faaf41e56639d03121fa6521a8fe1bd9343496343956b170763b40b5b7b2a9725070777531893a5f23259ee0d89de79b3b92a99749d1b125736964979f196356d30850f1f63af6c68beddbf2fb69e46cd1a28d97c46befeaf47a386e345776bde0dba9a4983a12a77fc731acf914143a7b9259d669c6cf719aad18dad922709729b194c3b3b6fe265c04a78b994c25946930c768c5bedd4bdf3958d01b1ccf41b24e7245b0c7745ad1e59933050eaaa9b4a0483963263cc5b291734c9172c317b5ecf2f66cf122f383e9f633a29ba4fdf854f93f019e6399ee8295ce8243fabd30adada295b2844b44e36b7b440c6f4349d2bdea45859382dac8d4509160e99b62544fb2fa5ea0abd54fcc9ce29dbd35660a72f9b468f67265a85928da89c581b3f27a9806487bfbbe0714e6e0acc05d1147a518714126c24742c6e4af2af3be88842994af2784f21952aff830e281027ca9af831ef78025a194ff64b9b0018a1c309ca758c5464dc5039273b9ad0c18424d30993f22671d330722c81f8f46f1afb9ada7d184a2854a527d3d42a1dc771818e24984bbc8adbfc31e30619387e031d48487386314f33ff6953560c0a741ce1fd91880cbe69b2f58ea30c0d7418a1a4595749fcf24f5fe236729c5186053a8ab0864afe5152c36db06654a083082531495cde3c5f72ba876066938fb4d8c97c7331cac891810e2198d6627fde29cd59d18e20109fc4d10aefab030849258b49db65f2f8451dd3ea2d8baabb770f5fd8e9225d729eeb3069048f5ea0e1b9c65f462f75c38b2be956de548fad551ebbb8a2eea6942755e3a18bc3688ad96378bbe8a50d7de4a2f19eaa28b936a87b0f5c24e6789876fc8afc718b2c79a50d936a52f09f047ec810413d6c51dde68aca38ddc04d4083c60d1cc73f6a91f6465d5ed8899f6579d022640c1af3c9278416488961f9ca4467b1c67cf94a726fd55b21b210012416b0784539ee79d6726833ad5c911c6761937ad48a2b93d499673e9ddc291056f4a2feb2392c34570a64150595cdf1495315c674aa1e3459e80e995474b9375af55f3f5f0c828a246966a5be249101e41497247adfa5e9b0b5e90b404c619e2494e593b1c8b24b29c5e1db969645eae53a148090a27c25cc857eb2b23e29096414095d1763196c656fae12c59d31d346cfdef51f8784e290f1bafee2cc778762000185b9e27e7677b9fc97b200e413ea746da5f1db24cff8038827922d33e74c41cf33a5a9139f69ce5d9337837002b2092cdc764e6f6dadc40907104d249e1e3e553bd826e94c606296c27e0a236dc2983894bb79cca5b1d9ee259c34d18b2657209658cc43e4475f89b42c57c52be973a74e892e6bb6e5543efbb5491c2693662da182480293bcbe82680793b5038944af9d56ce3abec694f2000289c2a6a5fba7cfddaa90479c2c6992a63479f5ac038823f692b2efe6587177e39046ec27c78a9a26c9887b4acc97c4ba642f9645a0277beaf93c6537a11b4014c1babbaf2635cbc9e38303928852cef09b39fa398020a20e71e7277932041502b5a8412bce9f9016a7284008f159dafdcf91b7bf181b350671d699c5ee70712aa5b6c310a304104120ef299d49ee61f95e110112086eaba693b47a39649e0910406c6288dcfb68fc97493b80fce1d5932c6c850606c40f6ad2136d54c23e247d521e3fc93d2d3605e18319d37a7bafbcc99f7f00b2073de421e93439e51425bf29b201c183a1648dbfbf30c003903b9c736e75ec8f1edebb1d52cf9da28a8c75481236cb895bb962799c0e59e8f4888a2beb1803990361c1e3d45ccedd4ecb618bb15ed163300e27b153844474bba7050207adca728ad84f0f6a027983a7da26e655e6ccafb8214912cd3f26614e9ab0da7099d54e795aea0c081b8ab74e3165b856ee3010206bd04afeac24ef9a264b11440dc963d147b33c9ea7c3b841c68ded0d40d2405aa76aaf244d0082863caaad411a809ce19416f45ac4e7a40f310031431992da6edfe42d91b21e4206c8186cebb4e1bf6290de4a0d8818125d56bb4b0806903070e2fb540c92a22dfb42c000f94279a1ba505cd0378ba69c53df85a62b806c21bd986a6fb4e2df665800d182eaa511755aa167395950672be4539746454e21806001720533cb4ce89f3387054800b1423a369a621493a4f8da04902a502159637378ac163285bfcb3a564796426e17f6a6d52858a659552532a5ab640e2050803ce1ab0caba949d6c61910271ce3fae5566c4c39be0d4813204ca82de36d9d6674057709dfb5d7e5ea0ad7a32a81fd533d317c2da7924930c6fcbd34594173ee90c0e5587cf3db8eb0fa9dd86e494393746284e40f13bf7b290299bd7d35931411ba9c625ab7d455f186607fc689afc76930110297efc2f64c0409426af197573ee2a434438060760f6a969320a2e95f70217652cce4b8bfbd2fccd123fb3fcf5bcc6b2fa89256b6c48af2f9125e247c8e697f3d8d392d1dbb384b4e5e483bab1c950e5dd0f2e9c41ad5ed0fa93b72c16564b2bc1caa64773b706187c72713ad63123f07a3e316b7adc64a79e5c131021a34ca18e33b6c410697e8d82d75d4a2cc97c19264a7fffc5f408b7385c74a6289155f9f8e599416cb4b924f6551aa1265726cb6c43413c522c1528ca35ea1f29b58072c36290ec0028123089442650107dfad92dc062c8022502e02156933729c81830001d001432001003023c719261840009c067b060d6eac180710400e1c8e801000e04f495a0d15c6e4dbd846963a83068d311c478d1b84716a9c30dacbc80102050c81566bc9b513db9dcd86105ec9cf49d35a5f46b6a180201c3e5acdbdee3475aa2800085fb0a0d16673bcce0c31c238836be0a8c82f9230ccb84118c717491866e0b091438c1a351010e985199e8317491866886123c7d6a88180c82e921a350e10d1451963e4c26f40c61863f8180688e0420765f4183e460122b748c230e39031c619356a2020628baa05d1c25861d453cc9b434c27099159c8a2fc14da396b0eb67e2c60d1a5e42fbaf18ebc22eb3acd952d476e1e5de1c6f8d3f84fb5c2b43393b369e878f964857ec244e5cff874f32abcefec361193882a5251abed5a64b92631d5082ace49c64646e3c78aef2996540daf1eb64a3534853968f4f446568af24931f26f6166831a214572852f3d8b98ed0f23a3706dd66f4c3af136daa2b03a653777e3814828f8b0494e29c5ce5c6e8e611150109b52b62d66f8cb67e4887ca28a2925e9cbdbc46c02114f147f27eb52e5b4942f158874a23359cb344ab4d7ccdaa04143239c28ed6f9b9c327b1ad76dd0a091914d54a6d3e1cae40fe6711b7c460e1a34725020a2894e7c2c2599bd31f9ae48263051976883594ad1a4762f899225aa1294988424faee8a3a13f124b81c890426e533296ab2d662c786db60511081c4236cdd76f9dc2ee2882b9dece59e3fd2887e93143784c4554a7236c208fb63bc799efb786917416d7694949373b4d6228a8824a22288687e7b3ac99fa9eedf21ead6135aeb73fb55c5109618364b86ddbb4ff28530deefece325612aa508a1c91ba236f37ec71a07517b0cb32fcb392a78362282403327837eeadc64171b1b8804e2be95ad64678900e20f59b01cc6c32789f8c199fc1b7119ffcf5d1f3eedd5ecf1bca3678af0a19bb5b839a4b9873f7ad0db0ea31ef260b88a2f267c46d87df09064272639947e3ea1a4ef60873ad0e128f2298a6529f1d099831c164d694becf98ce676400234c0e12188c4010e89de6ed67862fe289f0e44de60875ef5f470b2f61e379c2f69e645bc8c56d6067c2fa5937dfa0e138cb0c13895dc6c25165903a9210d8486c8192a628632d87329bb09f7a7f769329cd4a3df26b39881838c1c913194dd4ccc9ac5124318280206ef6ceb53c61287c817ec1c2f6ad72f42f28343c40ba709237a93267c5eda85af2bc5cdf868e32f45b8f06a063f29670bdac5a429e7def3f92007225ae0d4c4948a7b6662362359486a5bf3e40ff5151d2c982b76bb87c944aeb066bbcd293bc98b3e6205f77e3454599f9fe045aa80fa6f86fa4ae1c3d30815cef9e5be96e66e3786139129246d8594bf9770994ac110715225f554ce256d9811468d00ac2212053f9cec7dbf1e359f5c040a98ac9bbac7ff3be1137942ee1e4bdc4c594389bf130e9e96c455b619449aa009a51a66c2af989832c1d553df38b1224b20ca4b9af831e924d288129a7af3cd14522afc154982ae75a9a4f57d77759140c6fd283932ee5fa5c811f8507a62b96a1b11daaf2d5aecfe1a448a60b9d9ec9cf4c6d8c973c34f702244a8e4fb924eecca4c114686101102ae7a29336b125c43c2402408d56a64ea8dceafe34780b05fdcce296b49da4c7e51458f7ec9b8f645df06c4179a7912be2d724ce83ca417c48b2a2426f6c31b80354076a10bbc36967df654e2dd950b5cbc412a09256ccaa50f728b34d7f64e995cc9dc93c00520b6d0c64ed670558266abb56844c20a852aa833976120864110055110832008629f3543135080b840180c46c3012d91663f13c0c0ca42d170280e8a420181300c463110053110835010c3401cc44044e224b3ac1bd1a3b4bb7862d3e55c44ae5e0b5dc3629e52e2d6b0480673e51de4bcc7f666fe27e6eb55dbcbbec433741adecc82357ed3a223bb8e58837bad264dc261d956e063aeb42b33186f49fda99e4347facc4d80688ec7d7458350310a38ffc72578f8e1a0ef2195131f5a30d5d47effc3644ac31b6eb58195ad1185a9755032ce6b0f7bfc4854445acc262d27c52b133f126f022dbade01c257af5fe2a1a8cc3963f8661b97c2c1e868121a49cf74f8b54b91cb24ab63361549521f874232b81958359b539d7e772b98b28420ebb1fa2c423c16803213309f88fc647f2a3b8154170f2a6bde166f60b5c6e0d7d078a82c206352e9ad3ef357e30620b69d274447210d9e71a495fbb9e33749f275ff9345652e9715cfeaeb2ace2200010b6c05db6fd8ae90e95955d3334adeca76c4e7e65b46071f245bfb96df60b37ec7be078000c94aa8fdd7f8be270c5706361a33694296fbf49bd35abf59792d843953325e5d9558a47384f12856efb4e0eddf5be58b5200a88bfac9959c89da14da347287413453eca907e02d294763cda4b3f4439991806b804917db384ed08c1534196cead8e94ccd788d7c53562d7267baadbc3a9bc2083a3764b6d3a2e78e834b0b95038fca587ad1546943e04591197967abd948364862b0603452052202ebe8034e11035397cae42c8ffc55134e86663f6c94b1264cb5b5ecdac72076a7ed829a6c9e88516cbb02f0e2f41ee4b8451ecf9ce1b08f7bfd800c0dbe61b24700258c1fd964aa2df4af91eb3e1a44f5549db0730eedd8514a63e1b77272ddc9f9b0728c8c0122bd44579c7e16d050c109419a43b709276f0374c13870d20ebd2dff536c312ed182d10187fa74f71b1fca900372737603b03f8bb970c899cd1ac2de8c816155aa74143ded8841f8e4814dd4009b9bc0ad064677bb5d6f1af9583d9f4646c7512eeb5ef04126125aeae72875b78568bb021699c7f4594c2fd158c500174dea61ee981d689efc28037aa9fe89bb68517ed26a484c604edc3519d115193796ba6099036accdbf1894eb8720b8beb56c4f7ee80ba25d6c950c9cfc428f2a56ac3e28cbf8c385342497225bf59f88c3b54cb94ac7f33121a8a3ed55792b259084d9829e9e7a42f80eecc23231789c8ee41778331403a55bbd137e5a02bfa7d9f3b7ecd50e1ec4341fed85b965bb5bb86b1cfadda7922a51c38b01feb6397eacc2771750ac086cd1daca1c0ee53a4e4b888bc2a114b5c34fa4de42db36e5366854bd99f090b450bd92a6e42e61ae312707d17009e025370dd58237a87c6cb44a338b35da5a2e0e2543c8633ed395b0867f7bc014057317047e6cc792d00a59e92d9b100fcd73f04e9ddaf4391a45e3d44f9ebb03bd9d783f2935ad1d78c2738e1c668ad1d99b0bafc8f29eea804f90ee37abde857561e150216e38775e961f24914135c6e2a5deb43e264ffc5b994b40b35fcace963c0a63a47af32c683c9a621143a94d9a36875526f79e59ecabcc9dffe528fb76300997ae1464eb586e179546b54189fc8e2e14085208dfb6672507c23514208bdfdeb70ef3fb22941d049a23be02c96c23a7788e58d00a00227c026ffa24d6629ce3d620d2b07be1c609a5fc1a8d4963701592f2382f93e27111304a9e385354bfd026ea5bc45a63f1685649531398964f5efe05bc1062084b8f6911521c8d7cdaf473f847c0677191b55ca7059d4ed8799f96d3c9faa13ccbc9d93661da50ae99bd93e3c57cb21f4b26d58788cc4515fa6134af11a2b29efbcd5c0b33b29cf4e65c09526fff27f6882d1cfcc1124d0df15737a85a09623bd4594795b6aef8a370f5e1ca16da384cea5dc3e295d7c27608332b7984139a48d1dc88f54bed80e45b9c4c50a40b030e937883c5aaac241d11205e2fa5d9c1d29ffe37a2cae7fddc58c73ef5d530c32606cd21dbefedbdf774d68d6d9b8ededd24887cc44588b591364a605116c21ee81652de57834ddf864949b3725a51192e530ebee788de475586014797b51c45e59c15d761133a9abe65b3ae5e07c04254cf62d8d93aef9c1d6d517a4b379b8624d9343e6f5ef8455344ea09c81f2b3735434220d0a6211843de10ed8f247d4b539585a06d396dca98d2f11619bfa94264d182c0020b7f726897b9f98c5c49adf0cfef1926e23cddabc2a7f69eb3273edb31eb1d3593b4de0a33b7ba01b45372a2685be4afa4fef228c9c9e2b3fbbbba8d5519ad108c6d21d25a133f1059cb68be3fa714e6b26655df3bdb0ea85ad4b308cc07ae9057fc0285e05f513366081247a71dd9dc6dd28bd78c3873e92161e0f1797a2934e8b36e93ce213fc760d03e876646a252ecade956b8f023afea30b608be4f2909af8655e8f4ddbbdeb919823597a4a43a0093e4efcb9cea82f4dd08c77f57c27989a08ad507d8a480b09ee37d9443008d4836a7b887beab566d3a080dfa0f2f0b2265957553e6f9327a29b577e907b80e59e9ecb7deb6b27655b243c2b301723d728fa7546426ee7a65e35081c7b68daeedb32802a5b9df058f058d7efd209e8a50b6268dfcb138de5c324c65baa14e425d534705f885c1c9f2eef6eccdae34f84f48e4d58f6d69a4134c619c8dcb9bad4c51a88f269275b462c2867b4362204af1c9241b11cc1d6afb36230df62eea6e82095b5fbbe4fb708ec5f81833a0981f3e384a1837d01ab3f5844a043a5b4e8e2bf3a3dd40553cc1c0b0a0da81cab1a7fcf56e3a87150eb664ac5b4b58a36f76a53933c32fb1a654c2236395b7f753d3c8e4fd2072c8f0f1987de535083774c10d5038ca0d50f6049c8690bad5853ec4bcd90227d88db44fde2996570e5936415923a4cbd2140e8ea99efffd48ced8e8bcbd5c77cf1266d799b7c15654f131d6937ed9351503f1c338921b0f8d53616c611f8fa71a087d18e8ebcd389884f36b17194f6ee7743dca03eb195223b90ad124e0abcf8b6ca6fd0a93f5b06b6a0f040b0ec74a7808c417431d0abc141ca159c35a338971dbcfb716c9457a2bf751535f7f0c3adaed15cd0adc31696d55caebfd603cd7fa15daeb07eed15b9f867c7980d49d9c216760de9dcca87b3f9b7c3d5e6d1cde609ad521baed2abc0b70f9188749d70fc04e22649a24577784e524704f3446a5e8d9219fc412029152cae13ee4b81f62c2f396ac8ea99594515d5c4f0f786f1cdf9d4df6376354f416ca32dacc510514c2a22923be7ddf7b0d579cfc4d8b1a53440312f4e3bc62a1110b1775121cb50df773a58238510dd4ff1ad27956d272624d6223dd2c1c9b3bd0f038971b0ba84b08f1a2550743406af8812b28b770ebb9bdfd5fbbef8d5afffda77fe5358f670e8dc3ba342bd43e164464155dd2bfbebdf7ffebbfffa5752effe3a18a850a0622a4855e6e4317e0a4edaa639cd299f1ed359ff84331b1f09250f854e75676486b4b154be20cf78f9f35df963bffde59fdcf08dd3b5e154a4be0c47435fb295c35cce65ee9d7747b76198475df03405e848189413f80695ebfb2f5109877604de82a23d6ce73a6bb6abf718ced8184ed4173d8d6471d69a852216c4fdc95e5372f0ef4a5198fbd7e76e6c69afbb94bc0ef54e5a9335c12bc271c208fb1bd8ca1005e8ec51a13e203744af8871daece8b57f2cd385cd83edaab80e9916b897fa9d9ac5e7142376cf8c48cdcb4a77ed6fab607e605c6229164fe82415a5ace5a5c9135cc0d0533559e606cda733cf2596e8f964374d6f16c853dddc583236b6e359829ffe8b513e2ff7cc18a08e669e97f892f1067762f40cfa711673a64f2695791917f0e13bf2e579bdf6bb87fac2caaa2b8438eb64f9e54a2e401d2983b868e503ca5e8239809a7fb12e3fa471ac7cb72a5f60de7d160d84402b0c2c02c6a01a4290e72bf6b8c22fa3cb6a394ddde3cb792c6428a21962b7c62485e20b577c4762781e203782f14a65b41008d1a81bd63db67ef3e01983d7a5b06908b58f0e365ff6001b796498fda6b9e7929da8ce0e9970de7a3b2a33c4ad95def7b9ad20abc0eb29c68493c5e663ad0562c9845af588d86dbcd13218c4c0a552b4c2fd2f1ca3efc9e2568f483dccb91c2c1d04e8279f4528daa56656e3cf687393ac9a0289685cf39568b5ba31390b885867f312b5747e98651bd9f7f8af63eb63397f7f8f88a0605695a43afbda70c218b08695385d4dde3db5e55917a68d8d16e09282191e46252bac10fa8ad6b590ae1f42ffb00f6b4cbc3f291eacf537c42c4283652d1fba90c71fd96c6a09799204144865866368b595c3063871677beaaa8651325c219a224c071e3ca901daed028f547e8dffdf6d8c637c2058db85c87034bfe1bdd1be75d9c964949a25c3f05ceb6023d72dd2496a09a08ba7b1d2331a2ee5f5cc7324bf3b79e7e254102157b6639982ccb17f823f154574594f4c3330244c38ff78dda9a1c5f0cc2d36fb1fbc5da228532d67ce05b0b0c80e8609e33b09f48b6002c88189c1836c3285c949809076ea8690a106aa7e9716b1269cfbb6bfcf210b7547ad0a99237b6bf37228e586c3f80ad3f8eb7f91cc6529b5ea5d092c15f0ed43ecdd78ce3e0f5aad7172ee2d4a3b65cff321b28a1b63c97ea6fd2a52c6176059f448f10bd1c3e24b277190d993e36555b4a7c32a7770e80cac33d96d64055b941856cac552f25bf8ec695ef2fd05a93382a9fbece87ec3f4be21e0344235f79c33466a2c77f045b95bea6ca690240eb8bf0f89e9b426b719c29e599f283c0824c9c3f331b509906c5770ec4dd2a81c493647a8b0492066d8f5f8f3ebf9859aad890e5ec20708657a8299955afc5d9d87ece8072f4e0fc3c80822af533492ab56454c01ad0ea9071b6386fc8b3013944934434427eab886ede78d9a2aef1134d175822a7cb178b710e57b2a6110584db2ee4e0dc445594b5f2c153a5a820c8533c70fc4ffbca131bc08e30b21cce1102868f647092eca610529e6090a03b1c74e475c7db706b78634e1c9c7984b2ff55c0595226fa27f2be5342ae7bf13666c4e59a2a9c86954862d7b3bc60d6b89debaf0db8a4f38f1f9ab63f2dc69e88235eb22125dce3b73b9691278784b70a7a5a7adc56f89c8bf887676ef09cae8279d12a432cf1a0e9df6ba903e1dfd291746aeec5df864fbdaf006ad580003952ddd4220e08c26eab5516f596bc1e9c66bc628368e23ea3498e310d0b6cec4b04f386ab628363726e68c4a669a860ec69ad2bc23150447debdd3849e58067ca1cbe04318b4735ef31f0289df26b03956e335", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x20dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d905973883670b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62b447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe04367684c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x20dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d905973883670b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62b447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe04367684c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x913b40454eb582a66ab74c86f6137db94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xa42f90c8b47838c3a5332d85ee9aa5c34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0000a0acb90300000000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb301fd292232dae2b570b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b": "0x70b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb32696ff9dd5b58170b447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d": "0xb447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3326eefc9623d0bbf8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62": "0x8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34c18773c813024fd8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18": "0x8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb34eb162433582a2de84c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71": "0x84c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb382c4e1e553751ee4dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d9059738836": "0xdc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d9059738836", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39b36fc39f221acaf040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe043676": "0x040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe043676", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3b147d8162826a908b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e": "0xb0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950144e983536ef57cf617572618084c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71": "0x84c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502162d00a2134b03661757261808eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18": "0x8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505ca51ea81516ba7c6175726180dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d9059738836": "0xdc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d9059738836", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19506fc79dfcf079cef16175726180040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe043676": "0x040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe043676", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508512e4feed3e68ac6175726180b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e": "0xb0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d93963836399023661757261808012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62": "0x8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f66f3d370e6b72dc6175726180b447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d": "0xb447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fec98f6051cef823617572618070b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b": "0x70b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x20dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d905973883670b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62b447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe04367684c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x20dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d9059738836dc8b457d69477f29e5900b87ff546906bd6f1ddfc2805686ec571d905973883670b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b70b8271aa09a079120109444b69dbc16ccb9d11e205a77fe9aef105f00bfff4b8012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d628012cebd357b832321efbff52414503d834c38a806e496eea2b6ba93ed945d62b447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55db447c01b893738ad904fc7e6cde03268859354a7cb7622b5363787d85e57d55d040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe043676040c2f09c4b32fd4ecda945acdd3a4bcf801557462020991f9231972fe04367684c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf7184c41f0a7bf06c05d59c2dd733b82eff492211e9374ba640b95f48cb346cdf71b0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50eb0e52b6106bc95f25285c8613dc39ac76cedb7671d0607a4f850ba81b1e9e50e8eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b188eb69560436bd1ee7c172144350591e743d3dae6ea0d6985dff5b3ebf93e9b18", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x02000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/contracts-rococo.json b/cumulus/parachains/chain-specs/contracts-rococo.json deleted file mode 100644 index 09108e9c0995..000000000000 --- a/cumulus/parachains/chain-specs/contracts-rococo.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "name": "Contracts on Rococo", - "id": "contracts-rococo", - "chainType": "Live", - "bootNodes": [ - "/dns/rococo-contracts-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj", - "/dns/rococo-contracts-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh", - "/dns/rococo-contracts-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk", - "/dns/rococo-contracts-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX", - "/dns/rococo-contracts-collator-node-0.polkadot.io/tcp/443/wss/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj", - "/dns/rococo-contracts-collator-node-1.polkadot.io/tcp/443/wss/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh", - "/dns/rococo-contracts-collator-node-2.polkadot.io/tcp/443/wss/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk", - "/dns/rococo-contracts-collator-node-3.polkadot.io/tcp/443/wss/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX" - ], - - "telemetryEndpoints": null, - "protocolId": null, - "properties": { - "tokenDecimals": 12, - "tokenSymbol": "ROC" - }, - "relay_chain": "rococo", - "para_id": 1002, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xea030000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", - "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x10bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e448e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b", - "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x50cd2d03000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da935161743a9268b417898a3673c8fdd8f66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9799c6127efd7b432295ad94afa4b64bcbaa78c7154c7f82d6d377177e20bcab65d327eca0086513f9964f5a0f6bdad56": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98498a8f808e0050b3c0ba85c699f73280e47e2344d523c3cc5c34394b0d58b9a4200e813a038e6c5a6163cc07d70b069": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99c48f20906142ab7c6293236c329ca3eba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f207c9cd4faef3704921617f8c66ab968e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f393201fb2cc5f70cd1e830effeb4302bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x403463616e7661732d6b7573616d61", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058fcd4034e8a044d0e51106868950e68c8b2137d200c0e9d8c39c78e099c8758941407774161573801dfdd730857d4343ddb350afd8c66865cd81a78357481ea5ad813f17d6b7cfeb1b60581dc373c86b5bff7265bca2d654a2905390f230d0d0eeffcd5f9fd977f89cfa648d4e8da78be256a5423266b8da7d3cde8d25ad44883d92044bca2507ca0fcfdbb05f1562bca43b895d6a8a5fd196bbb41f86b65eabf9ff93400e7bfbf9b10efe46e40ec17ca3b7747f715b2cde1b8fdf73c9f0f8e379fedd32684e9f6c9bfa77b38a6fcdde10082768703887ef8fdb02b62ca8f0ee1efaef6f3f73447170795334b912ddd46d5fefdf735c0bc80ebe7affbdba7edd37b027041f42fd96efbf43aef7a5ad5ec806c75b8f7d586c2c76954953c8daadca9511587c287ffa3514ee116485728fc1cbdd3290250f8dba8a695070a9f6b543ffc9946f9c387af358a1ffeee80dd92453acaf67747c5a1fed94ea6196f3eaf4ffcdb27ee70f02fad454e5ff3e6c3dd90f73b9766d96e42aeae3ebd5ef6b62cf3fad4d522a7a6b76954f6fe391a15b388615dc5def458d438bacf352abeff4ca3b0f7cfb0b97dda3e69cf9b10a6af4f5a57b53769b3c829f619f7b2c36c9c4bb3b9d484d9d07de93b1bf8d4f6cd2e8f9a836e57af87ef9ff9eed2372b532348ab10955d11a4fbbbf9ac46fbb3acb5ddaeaeaae8f53c77fab62cb35f25f5cfdeb62ba3f569479ffce37f9ffc77f3897ecd5799a0454eafdfc9cded533f6f3e57073bd9a7e66c1ab5d4ffcda5dfa87d7fe93b6fe57fda204efdb751fc7507f5df1dde2dc1a18b83cac4f003d906e116c9892e7491a048810fba484e4441b398dd519ff6ef36000e098a19d0fa687f4f4b7e29d777b66f2a47f92b47df362afefe6bd4f5fbb2514bf7b36b2e8d9369b63eb86c73b8cc35de7c62c7dcf5bdf95cbf5b02965ecfdb90f85757e3c7cf7a1bc2d1f8bbbd3ebddfcd077e4f67ac5d33fe6efe3d9d65bb995ece2ab137cd20aec7baca51d6b704fba5bbf9609fc9591140afcf76935d9554fe35eb22d1ebe3ac310142000925f164fb747d8fcbb9048a7ff9f2c50b95bf34cea5d7ac04a0ef33d6e47c1f040fbdb0092552d955a6464eafae3241afcf588b73e96e5757e41476dba7fa287f4ff7f49bdb277e9fdba73a4319e33725dbbde1a63c960be8945d5aad56ab1496dd22082ba04b7747b63c50407e700bb3cd92b82a69bfecd71ab55bb6a441fbb946edf7cf348abfdf668330eddf1ddd2d79ba38a8987dc856875ba4551ab44aba2f1bb55bf0a00bddd77a8753fb368d5a2eb0e085ee6fa396d61c747f776cb7e4e9e2a062f621e3df46d57deeb64ffbfb2a669a6c91562cba31db1d6e61b602e01666fed972fb35c0bc80c301443f3f7fffbeff6e3ede31d7dfd32ae653b6dcfe5e3018601044810b13cc1430228091622b636bc17800460530198059c14401d301980dc06000060a9829db978d0cdb18362f9b183633b62c6c676c57d894362c6c50d86cb0e16023c176832dcb16856d045b09362b9b18db145b08361168666859d0b0b09941f382d6056d49db82a6a45d41ab8246056d0cada54d41938216054d0c0d0ada133427685db426684cd096a029410343fb424bd2bcd0bad08ea01541e342db420382b603cd065a155a0b342a3418682fd05ca05dd1aed062a059a1b1405b81a6024d045a083410681dd0a8645fc8bc907541d322f392999159212323ab4246856c8cec0919163230ae165c55601f8057e015f0059c048d0b63a1f1a0c8e683874626066dcb3665e3c0b6816c091913ae33d8080c067bc147602e9814cc056bc14a602446027401b402b60056318121245c090e867f9175911d21b392a1203b41b645b625d322cb2223428645869491201b41364526822c041908b22aa62513174c5b3069c17486c90c53164c4aa62b98ca3055c13486490aa62898c0302599bc30693121c1d485698b290bd3104c423005c10404d30f4c3d30f1c0b403130e4c3730d5c084c53403930c4c31c8929021a1c3c0e9a18101b200ae00b2b4304015f850801eb22c645fc05481a1b2a5b181614363fbc2e6848d06db073629b43232276844d090340f68526818d0a66850684f684e6c516466c8d2c8c29081218b422686660513084c52983860da80898a4903a60c9830609a6282c2f484c909d30afb829d013303960656068c0cd818302f9818b0306060c0d0c0848069c17080d900cb82d5006b0156054605c6c25880ad00530196020c05d80930136056b0126024c046804d8189000b010602ac0ab60168039986bc82a48224632b8314434a413a4142413e418eb18541b6e4146417d90419865482f4424641324156418201f3048c13301cd8ce00a301a985cc42622191a410b42168596858c824c07c400e41064112414343fb82c6056d031a072417c985dc426e9148905dc8234823c822c825c8246905f9454686ac0cd9183421c8322410e40fa492b6cabe6467905890599066481fc81e482d92077207f28a7481b442b640ea40b240e640a640a2409e409a405a912590249038903790369059640d240d24163903d901a9012903b98a64885e640c240ce415f205b20a498564c915c8272415ed047204720a29021902090259457e404a213d20a3901c901b9019901890532414d289f8259e2143239a21a6b179408b42fb805645aa208a218641d342f4425c8a5c885b885a8867443362162216e2156219d10a918c5885488538466cc5294429c42844312214e213a2136297d884c884b8841846544204237e1193a21731091109b18b788468845884c8257211b7885ba216318b48848845448a43884288418840883f883e883d885a220fe20ea20e620e220ee20da20d6296588348838825ce20ca20c620c2205e8957c4174417442b620b6215918a259115591057105510531051104f104d10adc4124412c411c429a2086208220862952845f4408c22762072206e2052891a8819881888532214f189ebcb7586cb0c571a57192e325c5e2e315c61b8c0707de1f2823683ab8ccd04d00a2c011c019c62abc13bc33303112f8d57860d089a0c7cc9ade06378cba3f0c2f0b6f0b4f0ce702a3c335e161e169ed2bbc22be359e191f1aaf0a8f0c678ad37852785178527c683c27bc273c2ebf29af098f096f0c2784a7860bc2f5ed2f3e225e121e175f18ef08cf08af0b8bc2da0186018a017a017bc0506010201f6e0b202c4027fd1616830701277c12b2d084d4c5684a48c6461645e4012644c974d5660ed4351904820e80992a124828232f6239a0c05059996879848004951932590082a4a3244a4e488264a82826e605280c1a2b043131063878e709224e808244e983c59020a3b5484444951132445519a28b1c19eb04c98204912a4e4098d52940409515113270790c19c9024c809124d863061e2e40045498698307172801db02e1b85891224454347040d0d21a103c6847582441325414d100d2d012548c9135ad4644889269008f1d81276284913274d82900429794287923471d280a2264b38499284eac0c238c24992a1236ec0c0d8284d0c2d098a12a58921209a38511225ca100426f6c55240c9134a34b484c8c94f1013f362878a901ca1840912a3a0a125869670c010470c4d60024886d8014bc24659926428892447d828454d8688869268a2e43123345182040e8ccb265112a58912a2222686829a60f2e4099220a2a12398285922b524891326a91cd816ab44109222244720291a62800cb6a5024a98205152a4a489121a0c8b5d92c4091309040d152d91648889a11a18d212393980860d61a30c29295242e42489a22590d8c080b04d9c28294242b4c41141454e98440952f28422215a82d2d400c11097b808c3197455d922ad5694557ee382258025e0271cdf01523e0848f9ecee220001073800020e904ab1c3e6c7f03d66e6f95e337cdd57f775396ce8175f0c21eceed80de193d0dd31ec45870ee1746677e8cdb099df63e6c7af99d7f9f105fd8ad0745dda062574a943ec66a9435fae43333363b11f73bb3b6fecfe9ef37beccefcde5bf826ecd7ccbc14ebe166be96bd995983798f172e74b8db718b02f086573becd8fe2e08196e0ea300e083db0daf85eeb1bde305e3e5cfa1f6daa13b061fbc98310c8bf045e8f039bc1af6162fcdc4ded775398c505bd810765fd7754108615f39f890833b9c974386ddeecdeff1eb7678c14dbb60345d52caeecb9d1bc6f75c00ce10a6613f77d771e9d0d13a74b8ebd00175b80e1deeae43870e963a9ebfcbddfd72e6cb00af003a34cfb85f3b138007c7836967e8cffb3de9eedefef8f9bbc15fbfe7cfbd07766f8c991f0c3307f11f8e61bec3f9f5ebe7ececcf1d76b3bf767fcede3af0e59c0fe0f90d8fd965fc75333f1d98c73dfa0e8fdd9997791fbb3b0cf4d7cccdcc0ebd777478da051b6582708397a68399df7bef6a6766784120107a7b0ed7b27b5fddfda37f787bbfee7e7d5d57f7eb0735f7eeb1bbc3e6ab99b92143e8cefc60badddb317fde18e68e753f1f9007842feae430fbd301e735e6d0bd9bdb9ff3ebd13ab8db10c0a3790ebd9fbfc7ededddcfdbbd6b78ee7ef505bb1b3a6c77878f5f3becde78f000e105dbbd7d8700dc9c74c0ba216c000000e690430eddedbe63c7736f6ff7d7d80ef7d78e03d6cf2fac9bbb65f6f7de7bededb019ebe7cfaff79c63e6f7badbbb97b9e773f4e8beeece587bb35fecdc7bad4b29a574896152ee83c1008c069c6673945052d46409a21b26e084c90d1b2fc3c4d0114d94043551822489244820e1a4b3a10809d15093a109e4a0637586a24419227aa2849324414443464e920c11052189724492a1a09c2528203a4f920cede438628868e8082227434a888a02e083899225383874a8e174e334c3c38c0e3601a001c7c6114c94249124a888c9124890183ae246071b516ec0ac8e132744352c498244024c9838210a400d9221a21a68869604153131d4c4069aa2a109dc8889521445091343399a385152940449942648888a828a9428a18493d3ccea28416288e849274384648849121c368e6832f4e40992a0a10920217252142507c764c868884910134894089a401325139880132637e41c318483ce00728000d121c28189a12472c82051b44450511325444f82924451a2840e2e89284a9a2841e2249b40424912498a904820a888084951942027454f9a204aa2c3122449920c2d419244141b7ea0747c0c0a884e90ced012244c24f0313c3a39414c38a14051d0049a2849220a922430256c306a32e46f73829a3851128568c82868688808892022274548923861c2044950111343398c9a0c798ded26889c2831a4c465d464c8798091a29fd005f802176821292c454a0b2d145a15aba0d011afd01ea9e4d13bea2317da28b4aa23561d45a13d3ada23954a8509ed9149682fed48a5526d42ab521da99ed01ea9f648a53a3a52b16a8f8e542ea43ada3e7a42aa233e521d1db9d0d1d1510bedd1d191ca85f6888554bc422a3e62a12356711452f1111fa95a0aa958c542bb42abba5450f58456c542ab52b5d0aa542a6f2115ab542a17fae19580779795888264032fbbd77369d37ef9f02b9341dfe79895698e97d984d8f0dd2de99779ce867a03cb984d08ff1269c3c3b09437b00d594f313399d2d0d0d0d0ccc874fda71adec6d34ca6c23de0d3306b5ec77cdfe339729c6a38517f1edfa1a1e3158eaf92561eea3ff33409a099db271b32342d3343f39203dc4395365d5603cc151c138dd2fccb4e7e0d3057704bf8fb65d7558e82c2cf18b29c5b8b9cf2cbe78d0133fd345d658e827687838657be03e4375ee3717455d27ea851f995894667be86af8fbe22a7f2671e7eb60991bf64a69379d3168446e503cdccf4d7d0d5a81c05ad454efba1ec6a1415ed9779ef3db6f9bcac275c7a519ac994676d82f267cbdd30d5029427f77c9426a39d00dfb1f11bb7d171a1fe9910c7429cf41d1ade5f8863a00db23236fe10feccac2a3af3bbf9cc7c4f67bd09e12f14c77b51d0f70fd248490367e68d8733e6b39998670e700f4b63fe864f4cc71c9301e4269801dd2d44c801e54117c94a0e281091ddc1d16285065ca0400760a091623a1333b7ab4c34ca54fae4df1d4fe9937f105779451d288946f5fb33d128d33b3d22c4a45137deff49a362de3f63534cd6dae32c931a6f3efd3d7fc8fe7ab909a9aa28e8f559d47a3675ece506c43d0dcf9b4c3704f7369d14ce429654cdd330710860292545004b29e937fe46704feb76d9ed77bbe6a6e00cc10cbafd72fd40fdbe3755d2ee9a83f91a5d953573f7066e0c8874fb54256b324c06ad454df965bec6ac2a5ae369d87c6a7cc69b0f14fe42e167bbfd007f298e042c851d0c0c38492b4f41e12f92951950a62adab34aaad14763e3679ca6ab4c5099e7a9a23d97cecc22a7363ae600f790f91eaf31b59799f1b9b97e535555e8f5d826a469b78a0abdb6071c75b9aeef713939662e859953b84a1637c000dd66e5fcb539eb059f1f4efe9eb5abd0fe0c6aa6b9149b4bb35d1ecd70fba1e993c2347bda7340a7d66fea0268f3ac1758a24cba0a85dfb3720ae2359ff4a9d7cb4c3c72153ce22c7e12328f19021ffa439f4b798b977c77bf64cca011d3f8f1a17cd93d8ddd92ebb177065c8f7d4f6710ce5ad414e64d5f991a35ad1a2d6aaafd6e3eda5fb35e6fc451266fe504adf2a1c4349cf8428d2495ffe692ac6e6f7aaed62a1f1439e509272891d145e31b451a454563e7a697d5dff4de153585e9a0701a34db6651d3ecb509c569d6e1188244df9ba657f9d9bf69d4f4a998371f19e305c56977f3f643f3f2103ffb2c7bda6e42e4c7bfe4fb5f4b7df369795db27fa96ba6cf66ec2a1429f4bde93d76554523efe6131fbddea79cdef27bdc27ff3597409142e12f957329bf745aa3a828bf3f14a7504271faba25f01b764bf8bd83228556a7fcfd3dcd13474f1c99cbcf784b400fdde5a1c6e79733becffda13fbe9cfd3efb637c97522e51ef7679c81f32f94bfce367721241d9a5d58a16d5a0f289a0f8407d79f8131569cbc3bfe8a2507ca0bd3cfc7da9a9b7a8eca0f0172abfa717a0a2b2dbe5c17bfb01be77cc5f7b13c23ef907a6fe3aae4ffb2a8d619ec88e70af4f5cc67feaef6e1bd9cf29d16e3edad24517cd9fc55cd910f955c5a6b9fd607af9a6b9d479d75dcab9346bdeeee9fdf9cb0387ee5f43aeb9d75f3dcd3639b0e7c9348b619aede6b32cc3f5c9f4d8cbaaa22c2736dfe4598d985636626a32fd3597be0c068a531c3f38c51eeb7e79ec33bda6a95b221f7b9e4bdf064532403ed66931fbf0dfdb644a88cf54f2acf2b1efaa8a9a9e6765ca8fcdaa00d510e82e0ffcd8f738cf7e4cdbcdd44171ea8fcda50de5c5c9835e1356f8fc71e2e00e0ad3ab5b2d562bba03ddcde75a42d6bf3b2a57a1fead03ad57c751f469294731b4418870e815fbaa2de3f977bbd74dc9008fd47b2a365251346a86fad7007385ab4c2847d1277f1c5a67e8cbaec0558e82fad7b502f597b2cff98d2ab56048010f58c0832cadd52af59ebf7273533c574f0652b4e0892a82909a92011e297e2a36525332d029f8540c90e27f938a015252b00cc12f4508bff1e7f77f2f05cb10f05f27a5c76ffc612705cb10efb993f27ee3ff3a9cba4848fc7593360c1a28c2155a78420cc600034606dca65423e822082b5801165d6ef085d4a6f62bce10bf5aa598a368940e5ca555ecaf8a98fddd91f512e1764b11a8505ed105e2965ccf2b5aafef6fba5bcc200b94293f6f41b013743fcb788777f67bbca77bda07c7c33905fb37a9c8d411dd8f73885ea5e06333033ca9f73176468f42e1251abdab473bab8aeeef86437642bc7fc0a6de13119382dfd3bb41aa7c1c434c5476506268ecae80bf4da038d4379ff5597945fb77f28ac2f9e60fc7bf7ec31b9487c251ef78e50f0b211a551f08b46e18f4fdfbeb3dbddeeb70f0eb76a1974d4fa3aa4c40a32a9744a3ae2740a39c5e0fd4a2d71fe99d97f2edb25ad06b86561e7afd6e3d6dd3a8ddc2c58a5e9fa3514dafebbaaedf1d57b76497fa0c245a2510963cb0e481d60ec15529351bde84f0cfb29defaf3964ff5191297f9fc9197ffb845de1dfe3d8ac8f097a7d77b10b12bfc2971d8cef6dd06b2e799d9153f892ee06840e14765734f150cf9bfa972ff07d8510123175f8be4208e1f3df8d081f52deaddf5c47ac627f65641b016eb790628956b95bb0b082f6b77e77549c0770d586f657495b0a2db43f47ef70aa9e68f320c494ec9f14491445778b28906896add61bf67066eff37a6c0ef1bfbacab49b92019e147c2a32957554640a7ec7eb33d38c57bceff1389fd0ebb3d6b2097fb7f8be9ff39dfe37d76f3aec7783c8affba60ec3ba25454daff741e35c7275464ef739ba1b107b05badd1538ae97b248a926de3701bfa71fea793f11fee5cbbe5f5f777dd7af49c4f4af2762bf7c49bddfddbde2fd6e38b61302fed53d6053b05bbf21c287d4ebd66f1c071eb5aa1f6c42b6be83e57af9fbd935c403f2deb676cd2178b55aad64c77bf330fa2840fbe5359766726279f03d2c7083efbd6b0251c10285872e3951554a7eb6db10ece17c39a7c8cf0016283cb4c829fcdd1c57d1eee7f75955f47d26b5dd84a86833954bdfac4ddff7c4667d343edc80b041e16751e32d08a752f3cdff92138b477797102676464de175755096c77b973f56d67fc1773dc8f2e15c121ff6b8debb1aff3d7fd66383ecf7b49c95e9153b214be1bfaf3d687f8f0db2b41f4ea247aba455b8be7f8b1d7371f667bcf1674f5bcefde3fbe613afec82dadb7cf87b7bef9b8f3f6f0958ca7ff9f4b315fbde1bc03d5af4287c1cb0a8e90ffc50f6cb972f5f287fd1a3dce100e251fe4799df9f610bb25dd47eed7f9fbdd9fcfe1da4b5ff750f3a3fd4f3f62f5fba870682e91222a65fb2987effda9ff52400c7b48574e7b3a881f081f663b70289fabf0df27e1fbe09ff479f7c0a14675946eb533fbfefc4f73ff98e7ccfb3417e79c0f79793eb1bf871cabe812f7dc7a66fe05fef3450ffddc26545eb0fea4fc30661eaadf1e6d363f409be6fd00c6ad32798b9c6ef7783f2e8c2e5b1bfdb5b1efb3dfd26d3dde147ad7add54c876832cfcfaf86b86f2af3576d0fe7a83eec319b3bba7aa83f2a9d6f8370e36376a72c8708f5a2386ee2f8da987dd1e35a355d2de2030cba3bf3adde7ed41e31ebb0979ea5d6dead75748e505bb7a94c5ec06617afdc6af8fcaae7aecaa8ac2e75f87f379e4e642b62f6328fe250dcacfdb905e5128fee50b2f8f3ea2fd3c87d0d8f19ea0051ef5cf5c8bd3a8877444d717494a54c4d15d1ed5297cde1e90c22a85f6f3f736c4a97ff6b4de3c83da336a7a7d7669be31c0bdd961e2eff683d3d841717a75bb3ce0a3f65fff535ddc4368edf5ce94eb33f0292cef7d7cfed7a825effdf97dec60ae70ef97c24dc1c91476ccbdefe92d014b5fa775af4f2cfb3484e3e723563d672ed9feccd1272ea61001b581c25fa6cfb73cf8b3ddbce30904b75bb2b082566d6765baaff578c69acf2ba87ceaadef4cc1c2ff3a1cbb325acd41b7703983daa4b8fe9d47acea662ebb4479df67cbf5efe6e3ef32337dc271fd6ef93205ddc771753f34bd9e29ff9b4c79d042f9811ab594ff88de71a4d56ae5448aff47a3560b2db250fee5afab058aa31567b94c792b2db8d0ba49947f7b67cad6d2228b1ad0ba6250fef51d4e558ed613e5bfa6903090d1a7a5700a01c3943e2ddd29040c54fac4bfa351903e216150ead3d29e7e73e9cedd1efdbb0d69ca3e67369feeb83ef1b78c103024f569e9d3fdca51e6d71af5947f7770b76497e8e2a0bab8c9e036395eef70ca9ff33a438564d525655fbfe1dfae6e145486ee165f606d310615ba5b8880c60e74b7d0c28aca465d11bf7f7db8dd028d33e8d3dd028d2e68f6b485cef4fd7ef67000211f7bacbb22befcebdfc3cde775ccc9bf9e9c5744ee7adfde6fa3e0d755a2cbc486c2bf9e3fbb34de7caea0f2a9d81dd9a4b0f8f7f683fff30bce0b88471f9c0fc20ec790a6fe4613a82aeaafa24b771bf2def7f4fb9d3f3cfae6ebd33e6f3fbc877208a4afdb3e795757a98f5805fd7191ad0ed7feeeeffeee504ca1eeeece24835a387ea6db40f617265b1d6e919e68d16f547f3f9b46f5ef68d4a38df40417daaff58ea71ead3cd0ce41f719c749b68ddacf7a32e5c9acf55cfa1a057f3f63d6207fd6da72eddf0fdf371fd831c79fb90627d3def877739fa53d99eed680651264fc3c93b477b7fb4bea1d0e20fce17b7b5799f6ebcf383bd9bfced431c7b1a8f636cf853707742afbc7f21d29b5ae4a0eeb2a67eaaacd935cb850c99292e34c5f6d68952c9364cd54e1427b5ecf5de69a9c4c7b7b40a7b28e866b095c9da942fbb1b7d1ace0ac34ea3d1ab46a56d07edf7ed0e8ab52a850f8a6596958a2fd92b342fb311b2bd4e3352bec98b817fa3ad9e5a872c42acc6138906d0e37b5aeaaa8f610c67c7d2bcecb96755c4cd76d5d175a5f95c9a998bf3098dfb2ec9bc7f49d6133e64df3a25bccf3c37c76c5c0c49011d39926dc60c8e0f19d7e2bcaa6f92876c6d215a3f44ccb63ebb64f4d61c8a0fc5915c6d89862578c528c1166fb9edeba5d1ea6b934b6aa342afbfeec4dd1a8182b2f058ddabe3f66c27ccc676ff389d9cd67fb9e8e610af3b2b914dbc18cd4a63fac924e6ed9fda8a4b038675d55d1ec215c527abf49925d2a4fc5a1dc897bca5ed80b07f3f5c5fca67dfc4c9b19c56146a5df2032dcd77cff698686e665e6456b689e9ffb199acfaecd87eb98a3e168ae2d014b693a58c385e13b4a3262786bc6461799e974a686ebb64f3573a9cc6c3a138612fc0b99c9b4662ea59999f99eae9933dd526d9ae89f7ca7c6f7d79818952bdf9982c5c6c77c063e8565e6fb631a8d2282c25fe8c7326c10238e6adf1fc7b03d68af8adff406e1de94d99833cfcd8bcac0bc809b797e9a8f99a1e9989ba199e199996ec257e544d9f4596bdc6e4efd181b36dc741b7397870c4db77d92994bb9d934739787366df4a832943f831a3799cacca53335fecd9809e568456d7457d4e8b22bc2c47c4fcbcc986e970737578b5a7449a39795eff46b5293da8cdabca8152a63e67b53f4a99fc3be3f7af11dec39ce14bdd07e4c07dc05b32c6a31737b6dbeedf9613ed3361f988eb9ed33d660366d4bc0d22d4a29a506a37515fef5d31fca97b3e2d0faaab8a4bbc1f7ed8af7be7547ee2585c53bed0759e58855db11ab1ae63883cc427b83f8ef631b24636ed79693bf9ce9b37dda130efbb711f13b004b41d7883893e6f369591efd590f495825e150804b82d630bc1a47d1832dabd411064696141788842638e14aea08e6085652ef21d4c20466404a1d6128e8927a4b10c1085aa923894652ea753f607088787ffdeba4f0162c98d0252505fed126042ea9f757878388eb61feeaa4ec163058a02525e5faa3d8250b0e22621ee6633a292c021078512525057647314929f84772075552ef613a29cb842a5e402525e5ea8ea2520a76f18b96d4eb5e97a59312bb2082a5d451544a6151714c018e6df6bd295bac6830d712c6609560074a4f23c00d3c5025f5ba97c56ffa55290a709ce6d3277eb69ce977f3c9419ffa7f90f1fd4deff34dc9852a4b2929ef8fb88a17965258b2dde4fb8c2f67103e7bdce7921879d6459a38cfbd57a57a9ca7e997a411040e657f94bbfa84163d8a61ddd3d2a7fe23ae32592f34ebb64ffede2df7e087d1de94c237e042095024c574d1c0166090945a240e89f2bf4e8ab7c450c12a25e528268907ca7f24b7b464f80b30b4aaa45e9754c39b17f20bb4208597984c8b194f0f4fbcaecd27ca4dc3b613ce49c6d8a3094458719ca6719b4fa66ddbb4799bfe1ac2c841996b48f96bc0be6e17b4b36431c524ba9b967557c097c5776027258671317d7d48b49f4d5f018edff4d8e663e2a9c918a58c5132c1c5978f6d3e32d6d060361ffe1a9b8f7c9e51989a3e7b1347f6ef55299e424a16e305a2b4d2a79655fad49f4dc9f94dbf14aeca2ab4bf5669d4144fa4aea0fd316983c850fe18c6a262978dada8c4bb23597bd3cffc35645c28bf6cc1ae0c687f16c3a2bb993a22076029d83d24bfe9f791ddcbf2a62a85cdba5c901ecb6ffa39fe2c89c6afcbc502cb8572a1f1b9025c7c7e9377a1716a5cfcecb158b489fa58b4ff65e99785094e7e7cd3e613699ed3d0d0d0342f8d49467b73916a3005a45456437b13c710efe1c34e4a01a620a5b2651b3616731c6f044eb06229d5469802032da9cc86e652deef146a306595cae0dc2d5c918494e22c1810432b95b9f6a684220b48a9ec690f4e29f28c2f5a52474f04acf566b8309601052f2938b319edcdcd420a276449350106ad5456a3bdb95c9070832e29d68015aa6025b55baa2869496537aee5710434ca58d1686fae11a0c8c24a2aab595a8029485129d5bc371e4c55d1b73c9806edcda3a864a3bd298507199452528e7a348108abd4fb2300f46029f53a2c3886f0c78f9d8ade5042838b1ff5e002155452db40b21a7068990eedcd3d430950404af9649ad9a0bdeba51cadfefdeaea8e60f7b4f84dfffb245c7d596803a91ae51b1683a92aaa65a667e3cd0b03e3b3a9ccd2efe4850b8b4296bdedeecdfdf9f6de0eb8f96c277de0bbde7579f325598c2c333232323232323232323232323232323232323232322ae2ba191fe65e3784dd15c3a0fbb10bdd8f4974bf484a29b36641c6e451a15b1f954785f2d36542884e0165292cca525852ac507625268f8aecd3637e42c6ccdded3ee452d238eef91974ff6d3e4b17afc3283919de7ac24108afeb924f7b5e72fcdbcc70524a4d72f2ad769c4e9fc3c69728cf70f33a0c11b79becb4cd67dbb619ce8623e2ea9ba14b331b356cc870366260362d336132dab061c3c6de80d9e5b19f2165d912dc7eb6939bb5f3d276466d67f52a5d9aa5c459bc2cc155192ff8bc1993304fc8b298e5f6f7f496077f1653f4804d551bbf361f26ee85ee5fd70f2954dc0be58fe25e787078f0597116693f6e0ec052eb37db11717213c2d4e60957398edfb4f930894974dfb4f9f09bb8a9f5693f4b8d49941f0ac74c62126d9eae44f79f70d50693f182d9f32ccbb2e68d81a92a0ac587d57cb8eb6d9787f746987a01ba7d7a567ca0c8116c70861194b082326421b7f0410774a0bb450fc8a017dd2d7cc0a5059232c1a1fc38d8e9f5575cdd114e0a8bfbbfd76c050dc4a0bb450dd0a03a74b7c06204ca2b9e922d87fd7ef9f2859328c4a2fca7d5807b6f62ef15fb20dec7d7611df7e6357b0b777db69acf2ae983550af657575d7b9b90ab9be17ce789dfc087f0499fe06b34e0ded75da2f0791352d427f80ffe6e3e92573dfe26539f1aad01e605dc26d1fa14c27fd2a8f8f08b7a8783ff1ae51fe3ef6b7de2e04cef6c0afe6eaf937dd2b070f529fc2a29fc6f1453f8426c81850b857f44a3dec34f827b600aebc97128e4795aff57abd50ad60d83c2545d3128273164655fb5feca030fddd582eeefe9474fa3847c61a94f4bf7231747c84265e8726104a4191a7f6d90aa3968fced9d4dd51d34fefa0e10372863064158410aca50452abe6c54a41189033da0f16d1ab54490021268ec2a131c7a75b253825bca42bea0f4af7736d5f3f50d3f138e862e11a4a08566748920052c1cec2cdcefec8fc3dffba2c7f475454cbd9ba20c5dd0dd828516f407dd2cc850039aad0f6e5bb4a5e4b86ac3ede853fbce00f6a61f0b5904da5f39dafb05ede78e6779f4f774105ce5a1fd383f5e7ddde9fbd44f004ed24777f4ce22ad56ab29a9fe475d55008114b4409db947b78594e1e05f32e8fb7d9f8005ec3331657f885d24ba5f970cbabb44370dbafb7a1a554f0858a66fee9efa479fb63b9c3e6dc5a1fb3c979e1af53c34ca26cb0e687dbabf1c77cd4de12429689574c7b25381e9be186f358abbfa649fba4fda3e99ed93ec5377e7ad1d4e6671822b943be638dad32a671ec19632844177cb19aed08a43f9b745770b19d0a0381b8429ff6b517e14e55fd3cb1742cacf3eeb2e607a99c9d7342e941fc9e42d57f224ca9f791753e75afc66e5c50a6b5bb4fa952abe44f931222844646f7a214cbf1b11388830bdf65a7781ec4d1d8e7ed3ab529bc22184f6db6f6a3728426c9d16caff804d699d5f19227b1c4224517e29aa5417ca7f94da6d081cdd098144f94d8f8bfcdd80a464ef0ae5c73abfe237fcb2f32c7ec3dfd35aaa5ff1e23b4b945fca97be622ab4f212529216da850b12652abe6385f2f7ca6ff8b10e0711d89bded45d8045f937b5a9da551cc0292a94a5602182b7a00323ac524f602fe5880633c658a556ab9914d63de1629831c52a251fc35e7a15a7823d7f8611211febba50ae9d44d98befc8e754c6db033625bbf59beb777b00a7d66f22fceaacf7d5ad7815cafdd5a948bfe1afbea2fcbce43b35924a40c62ac5cf5e7c6753fcbdb2a195976257db8a090d3388a18b55eaea6ab3ae64d1829404b3051846a8b24ad5eed22dca5f84018616ab546d25da03126e8094aabdd45e28bff41d1cbfe1875d3dbdaeda78d75daa72b4fa95d7a28bc3d1a58a6dfa926dd684fdd5ce6894bfa7806c1b15af97ee12c3dcb10e4aa47e44aff8ef776b65acf536047ecff73eaf6cb9f60cf65fdbebd6fddf84ae94a5359f4bb5a5db3b9ce2974cd0f7dd432285cf643cf83a6beee56f5455d17e8dda750e473f93417b0adad33e77ebae3241fbdf64323c6bad2325a34fde4189b45fd5ceeb30de94dfe776f72ac9d70d32fff59d07397e793d0e29a3bfbbbbbbbbbb8c97a73805e7ee0dff6e4324ad1cf5d46eec2db546f5ef92f719b24c7e96ad04b845320110e8892e92153452407f0666444171e872910531681929a03bd0e5e20b5ee81953a8466d602eba30053dd1e562e90c9a2d126eb930030d9a51f99af6e64c9f5c48f657163898a2a39bc513caa0401ba4df9f48564383e11e6a700fff993ef99b7e5fdb204bf7b70d82fd8ddfefad08f7362f6bccec86ffe03710578dd63cec2adf9895e98d8fd980305186d984e4f81b3fd3a88e79a6d2fd4c46a362beffda7c7adb7c621ec8774e359c6af82ca399999999591d3333f26968946866740461c3cccb25342f73830ddd0d5d6d4af33d2d6d681b66e44c06b5dd8438addd3dcfca519594237ef502b4ff15517e5e927389cc1fd19ed59dcebcaeaa20bfecbc277c39d32d795b10b5a9ccf3d3f15576dd5d51531a49bb1f6dd92da17999efae16552663e7e437fef5d1ae1aed0ed20041f332323d7777686819f94cf32d3b1c3340be53830143f8fbfbfbe53315eea10350f0971491223a451c715f6eee6164babbbbbbbb6feeeeeeeeeeceaf3967abd1847cb4d2cf63b9bbbb7b2be9b4522bb5522b297909683f777777b70e0ac80f666666664601f9a1a3d33eae6835399ba66d395614f9a9d1dc5baeb3e5d468424ffa87592c168b252373e3c69c37372cfd87fb7021d71ca55393b3fdb8bbbb3b6f393a3ed0e84727a7467bc23a3a52abc9d97ca080fcd0f1a1d5e46c0ce4870f6dabc92942848f14c162515185152c168bc562693062262d26c66432994c2653ab8561266d8b91a9f1de7befc1689c53a35d719deb8a31c61823a771eb7d004a29a594d26432994c26538c31c618afebbaaeebe2b4add5b0bbbbbb310cc3300cbbdcdddddd6432994c2653e4d97c7e369f1ffedd7496eafce8781116d54a7beadf536d33bac0413a69f92cbbfbeb54dc893174010b63d0fd76c2c6eec29257b82c36ade51be9c4c593582c16eb3d1f423add631f425a4d8e4e4b76cccccc25315ff19b7e1d203f7c086935391b3f59da25fe99cbe2e1e119401002f0f0b0a8a8c20a168bc562b17e26536ff9184e0527e3b17eb8d58fb37869e9b45aad56ab3f00e4fd783e9ed0d31e4aa72667fb41f5fbf17c3ca1a73daec9d97e3ae64d9e0194f353a309f9e016b34eabd56ab53ec01b901f3e3423de84b8bbbbe368407ef810d2b69a9c2244f848112d1f44a6115fc4c7e663db7c142152a48823466a34223fc5c84bce084669da360cc3300cc3dcddddddddddbd8823314a53b6c5701886611886b9bbbb57d1b066797bf1628c31c6886118866198c67a2ea594524aee628c31c6d86ab55a2d777787eeeeee0fc3300cc33029a59452621886611876619b8fce1b71b56334de747e37234e672ee5565211b0e841dba06140f79b8adde12b57b394e412c75e6c56df544e5d05a7ad2475792d963b10ffe13e5cc85907b2200bb270583a1c90ae7236cf1d73114bb716b7780ca60293f193b3e94c49759e90906b3f423f3f425891aba78823465854546145a3728cb05845b08eb0582c232cb4e5d468ceea24ad266713eaaa7bc1988ccc8d1b73f256732433aad158cc620161fd60f970f7826b72b61f0dc80f1f425a4dcef6a3b3d5e4fc1839f253a34116cbfd8a98498389914a5534777777f7d731c61863e4eebaaeebba2e168bc562b1588fc562b1581263c918638c315ed7755dd705218410c228a594524af8de7bef3da99353a309356bb959425acde774be75cc2ca4d5e4b8e4381b1bced97e80be481145dc6b1e68067d9169c41399409f19b928d0a531430d6822f99a2079c168922618f76dfacf74f79f1c7986cea3c223237bacd66a585ebc0e6f35dfaf93b57eb69c1ad4cee32525205fb7d525e9b1763a546782e7056f35393f403afed1551c1f9d50a7d32161c24a8d2604f4538a7c06f4b49f8b48c43422458a6098a601c518638c115eda9122519a342240264d2302b471495209fa6bc10f5cd7755dd715638c31c6775dd7755d1797b43a3f9b26e4ad656f3908fc7d00a39cc341b6ef8755700f3fdf0f733a58d3f1aca9e11ae61a8cf5b02befbdf7defbe1c0e0c2a85f6324b320cf6854ce77919f42e4a1e02f29a0cfb8b7d4f690f3fb0858d4cf1b59961c6763f390b54d1f3e361fdbe66343c24413cbe3e7881124566a34a193fc31f22e202346364504420cfb597ac4883c4204486a0c0465264d3018866118765dd7755d9743082184300706d97ebf02dbc3cfef4b5994ce17f195ab1879a0235f79f55fb785498eb3b1f95d208f1f10230e3523735340e6458bc04b6a40a2e97933dc2b8b2618c85a1ebd4d48c5f2e8ff99b00aeed1af33a1157dea3782641e9945e64fcea6f35dc403f9e8b44ed2f59d22d9cf147a2233e881a6119f05cd4d1901b755d044f242452079239e56c4dc94d0bc68112193466422f91f24cf25715d4cf0795fbc5934c1f42c0f0ecad974901cd9569b131b44fbfeed09eea1e6fbb7298dcaa96fc456c35dc4dfb5ad30ec881135395b11468a40082184b0e10f5d22ac1612f8ba5d8c78a0afdb0ada1d9be7c13ec358adfd4c49db35238e3ced076a3f44661223927c16318dc84c0294e4b7953449138cd0632c8c8a0d02e4fbb12ab8871fdf8f59d1281fdf457e0ad013799eae3e924775dbca6f682a890466d03c32b3227353afe9d4fcfe720f395f4d1b14fc2545e4a71c79a0af27ba466ce86257587e93dd6846dc8df65a3b685b8b87d64383ac1ccd87263522d388cf808c6053a615d960a2a603c4693a356ad4e46c451861a4c88f56641ed9561b156d8389e18e1cf9acc6cc8c11407ef84032bf6779f01f9933676a3119d0dc1411194d674a991a9a111b339706546363a3339716999b2a02420821849c0d1b3536353770dcd0a1e388919a1b1a10911b396cd08800e5b8616a40468814b9c18891cf70c001a888b9a9234672dc7043b7a3cb41871c6e6e300cc3300c93524a29658c31c618afebbaaeebea72c8e11480d30e458cecd023f630994c2693c984611886619894524a29638c31c6c8c3c3c3c3c373da7c321e4c8bf0f0a0653f53d24c00dacf8c34c3d18c5cb4c8cf8434cbd17ee6a3990f2297f623b52233e87f265323418b5d41a1727ee6d22d680af90dbfd044409ff8b599e21efc35932e0f7e238a38f29e8ff7de7b9900349d2969a4990fedc8dcd44589cc4d65399ace84f4d10ca5119941af339d1e9950dcf0c5c884e268950afa22419ffdd07466d323473ee3e1811243b73732375544672efd99db2c29a59452c618638c7185a6a4d8f2e0af9926eec19f63c47cbfe10f9a47e68ef633596732ddd1a6a4198fc633d22c8856646eeac8dc14918b02cd4d65aef18434eb41e3f9685600a7452614377c39728655ca88a6452614315fbe7cf9922af2990f1ad034e279322532a17862c4632c9dcfb01ecc04032586fe3c91b929a0a547e6a6dcdddd515d9512485739ee47576d6c7c74f55fa8ab271aa3943ef1e7cc0a700ffe6d36b13cf88d4c36c20ae52fa20aff131e1e1e1e1e1e9e2004d08cb8d62ed16e2b0d82de403b31862e606177781c2a65915a38241b2e9f74eae22da9f45a2d1e1f1d0f0f0fcfe77475af40fb65304e8751407eb08ebbbbbbfba8e1eeeeee3a32cd7aad37c66bbdd66bbdd66bf10e0ac80f1f42eeee8e6118866198d6359dd35bffb44e775dd7755d17841042089fec525600cd07cd88934a5c12b7d809fc051781b1e01ed07db6c1ee3c794fe72b67f122571c159b2a6fe5c4e292a4d21314901fcfbbe4db2e2d0eb3a0258538cda646c7070ac80f862c1f52729c8dcde774f5b7c7d2e9381d6fed48a50d8205a92495a49254924abc8302f2c38790c96432994c98d6d57439ddd6fd743add952b57ae5cb9e28396f395af30156c020681d057de808faf4dec0e5f81eee5a4f42d9b2e1c97c4255df1ed7d74558280f60b759533810d15b4bfa6ab0f03da573ea7abdc042925c7d9d8f0d6fd7430afc525715f70495c1297c42571495cd20e86611886615996655996d57439ddd6fd743a1d77dddddddce216b7b8d5a36dad5d5a2cd41da3ae13ea7eb145a0fb7477b875756a5f4a8eb3b1f93f71cb773627b60df4f0355de5827c4e576d06f05bc72d1e6e7d804bf29bae79d403f91fef43e785b487ac0db2f3fd908addc1b01eba2a2313a4ab376e0ca0ab73d20a79ba7a73432bd476501d06a4c37e74988f0e13eab40eabe972baadfbe9743aeebabbbbb1d47ed4f9caf3f33507e8eb0d91afb3c8d71b46becad07d6c778efc3eff7eb37ce748b739b137fd46305944862372c3a6dbbda993d66de5373f5d3de974b5bdc02877db6aeb0257b7158bc562b158de62bd9654e29220cb88ab182bcb3056f635c35819c6ca3056f615476e2bd3b6326d2bd3b6326d2bd3571c8861108318c41e832cecb92429b924c925492e497249f22b8e54f21d29e3572e7e944a512a45a9d4baaed6d5ba5a57eb6a5d5f711e4b4a8eb3b1f93f9d2a8eb7a4e4381b9bfff7f544abb7de579ccc84fd6ebbedf2883fdd2e8feb7b9ab79cddb61d5e9d0bddf707af28178329e264abe537fd3f484857b268f9ffd792e50a8be554bc8a5b99734eb7e2559c8a5c292d79e9baaef3b2a4d46a7149ea82030e38e0d025894b44ea2b59b4f478acc75749b11e5f398af5f86a43b137329b4524cb155653e92a6d65c78e1d3bda4a57692abda2fc71a5b4e425871c72c8c1cb9252abc525a90b00fe0700bf01e07300f035355de52e495c9090ae64d1a2830e3ae8a025cb15168ba97015b6723a9d4e6c85ab30155e51fe6be53b40afb454d7cbcdebdcfccfcd6f379ff3466691f9c30fb42dca0f5bbe63e481be2e97ba5d7678b8c3eef095a3700723b3c76ff88b4c2213684224df09fa067a23be9e8af88a73e42b0fad90c8fffcf6eb3b463e27e8a51127ae081cca01789d3fc293d3551b233694b922dc4f57e51399eb373a1de4079a5955bded0132b57e937dd69a6f439ad6264c9fb9562b800d79b45a407e06b56b1b026995123fbbb4b80db968bd80dc86445a8fe8cf849fc94bc2e87c4f1331abd30874443cc4acdb0502b36ed203665d2e0e98759784987595829895b5346056bec28059d9cb0266e52520666d2d0a98b5b30c99b5af2460d64e12326b73f96156b7e233ab5341c0ac7ee500b37a96d4acae85ceda4a3db3f6920fb3b61703ccda540a306b5721c0ac6da58759994b9059396900b372179e5999caceac5c05352b5b0132ebe9c7ac383e66e5d1994b7366f52a38b376971eb3364b00b3b2128f59390b0fb3ae971d665da400ccfa37b35e2bda7f9af562d17e1d66bd90683f0066bd5ab43f8759e38af6ef9835b2683f0eb3c616edef66952bda3fe7cf2a9168ff0db3da3089a48e49c4e598441207b7687f0dcda26f3389980667d1fe9aa944fb69261136e32dda6f6312c9d0fa26d10d5a5f8bf6cb4c22a6755b495ab71511063389385a3116eddf6612edd7269ca659bb8be48fb37216ca5e20cb77360545882e9141a2fd3ebb5b1c54dc518e8a8fa48a087875808c6c1fdb01d7bf8fe9806b15730fd9eea839aab412b73f333345efbcbee9ef8602d7ddf17bfa3d2596f05fdc28ec5b7b302fe67561f2a8508cf302877de584cc3ccdc7cc3c8c8ddf6abcf696b7473363a3462623232323131f6fafe3de062e56bd05396ea677386fc574552ac1bcad7b5dfdf7dec503a185a8c44d1534410d32a610a29919490240024317404030181009a571a8c8ca0614800b60886a52422e8fcae7e12c48511553c630304400004040600001db0050284f38810ad8aa6590ff8114a128c132e4a3998b9d66a8ac7c5357ffeb59527af5f235d353d8e36069fb22642fec9fd028bfcff020f7c39d8ec5e8d16fc62f3a2092610f6113ecdd66fa4e7cb9486df74988e17398b999765fe626ffcf73df0ba0b219bd8966ba526edba750a98f6bdfc7e7a8fa38378cfa786272f3019218bf4de89e39799032d7f339ce642e9c20e1de2bf32d0ecc0c78b493aa185ff5b5f5e2c0419d27f97f7a089e0cbd064ecff46246f77dad2274cf8292bfe5cf7e0db0f4fb77c9ef3218fcda45ee2b094171a1eeb9893cba4e52369a8b05e6000e6f6b8af70cd8ce1564bb3f064a27c6c1044b084682bcb05de043fce19b49bc560e6a3ffbee77ff7d23a6268ea3c1d8e49a422b195b3f2cefd975e9c083b6540aaf83c11ffeb58cae9c957d736f815d7b304537c2edad581ef281091cdab1321ba618d78342740f1c79fac31934756e3cc8f2c6d96bd240231f9cf71ee194ce882cb6f224724345eb7dda6e5c425c4e45d2c31000f58c6c5c3d56e2bd1e77c2b2a7826db8d7d0a62eebb06f1f8628cf37f41205ba37a3e64eaec986583d4f32a61b1c1c11c3b1ae3f432f3a2ffd43dbe53271184116593c4a7d7065b57883383181d8c1d0c1a641bdea0dc03abbc6be1a610a8474b05a280db12706da3b03227d4172a3fe8e4e0b90318c20546a5d71e75ca58794f7b0c170687192843b1fbac743a65372ab178e248325d1ef12ca999bd43d03c50a5530f0e88ca287b37e10ab100fcad11f09b1b412eecc1da38b0ef9526ecd22b9b9e4432d0e0d88bc878dab9a4cd7b43b8c879f084a91988e3c0cc36118d88733b8cffdf6dff71f8c9de5c379e813d58f4c4373e8de56da433c4283704d4a4dcf7474372439a97a03ee6ae8d6da7911ec37530708e86b555682a23798ec4ec6e106b2e1e14a343ca9807f07ecd4040cd09ba76141a4341401b859db7742f98c8bfab324c25f7e9a3f892333976fd9c68da1e15fe7454b4587afb1fc118211af03e18369a4f60f5f5efcf8f9ed492f5350cb80706ff0db1c34f9a5a15d18f32e0da7058c63de6b463e4cc363610b313dbd029f74d206ab18da9841ce468ecd6c7a58ca4601866cee1e541098b81cbc3991c42dbf7b31bbf70abebc9d311f2f6c6e1294b01731048f2cf0efc3f57cd7e24c6f7c0b3d23444f059f378882c81af411c05193c841b9ba726c7a82d77913392ca554bc4735c580d0e23c6e97de745e729aadcb0a8052540d1c5c4959baf323294de75da8a710f7a70d9e2815401b2d2a1fbea5a5427f6bfa6371374d0823a7b7fc37ec7ca53c6d5473d633b05495304160a4e27620ab787774fe1607f46e5d515b43b2885cbceddddab9bfc57d8543b0943e2e6f1086bb09a1bf328cc95e83c605e5fb0d85125bda50346ac88e2cb2001d9610c5df34b07e6278cbaeaa5fd5d29050572a90d78d57281f70bafb3b6729583cc1d6410f414cd06b89bed023e7e218d563a91b989ea28197a43190a4ae1cf58a673beac0a5cc4a1f02cfd28ae75360f1782a21917bc013bcee4a552b1557a245d0c46d7883fa49018975aff0fa6a0996afa6e07b599e61af6af0f48202b441011c34339fc11b9ab900e37ea49495348325d0a07187e10b03f834681fb0ac44f1228b1a34122ab7845f49131c96b494638920b32c71b967c90a8e963c4e277232164eb411a713d5e37862861c9fb8e12079018a72d4639e98ba3e4ca6df15d4d9438e2f7a6541883ee8c055cc031ceffe4c32aa82b5e946250473ade7f8cbef0a2d5a9fc248caefc6b698a0203ea684d0a8719b4726b8d4c6a85c546f4782c5ee80b4b798dd0ce9bb0675bc15635ccd70f9d4a0f31c5fab83d0599200a82d2d5acca0e127ca193eda7c0ecb43712dcf691ab078e5fef2eabbde960ff9cda862ad66be712e893d30def87736f4f932954627e863d78a772ce7de0ddefcbe965e6b5f2b77e024d3297c58b244717020316afe5a959acf504ecd8ec8547323cdaa09944fd8ac633916bda43699dad21b8721733c6226419cd30f367deb21eeb0d28658dd179434f86927c3ebac884df1ef4fbc10337cced3d251021e4baa23ac40f3f5102d484a62d856f3f1dcf549ad51afb575cd5dfc3fd63e05d29def8e579587771a5e76cc4c1f5505f1f5a0750c28f775e52ae5858b46c230ef32ed6d5af17045f7c0153c7f9e48bbaec8584c73b3c28c6f2f7f210748d3fbb2f81e00c6667018c9338cce0174fd2ff3deff5f867483397f0f85a1e2ec3a1c07a7af53c5d18dbe19d03b98aed463bfc91eb14e824811894e2fdfd962a05455c7aad07699cddbce2e47f071613312c84bfd876152d7165717ed7e816c9fd355191fe4e208d20fcb816fa8ab935f0d14ddc7e5177e72ac714ca35044d87df2c403d170364c24df5dd98a73207ee946df492309e471c34503b50f31f109cb7748ee1aa8b091e553a0f55db3a62fdecc7ca9fcf295ba8eaf9311be390f983ea5f04c401d67f2666c263c77666a00ba4c126c65fa62b428a25294f008397ae9092e88cb4ff170d53d3582a668fa33397758fa8894a590c8d3528bb0285a46b6f951ef363947e1a67580460ba9332042e3b4a7993687b47791ae75bff728bd177f99f641e31a8a7507bfe5d383fccbf03f06dacf5d79c33a7f0d0853459e6e8de191b065883eaedf3148288cb2c581b25aed7d99a9ab5217ae11bae10b48939278430a99d72ab25562f09a79135c2947cf250b57a1196df12865b4482e0cd4ca542bf96745e4551f6d6995fd28d843f4a055f631db95c97a8cff9e01f35af4e52328884ac716322be1cc5dc30887ad4a215c363efae0b21d3faf75a0ef329e2e058ad7a6e9015dd0f6fb34ff7157d0b18ae0d8aeb10a8fcc47eccd4c9417dcf5b35fd12383bef648293e52481f29b4793d985e9b2c4a515fafd7d96be70529ffcbd725c07e38d37861dd6bc53f8eadac7e46f7a2a51483415bb3edd19ff64fbbc433b784349d077798a7e436cf605e13d1ce367bb9d9d891ae8ffa8377d038d17e5c6368d68c6f0263f777c22e2ddf9a95f17493f5dc107d700b5af5b44fb27b57fd5c4ad8dcbc6e39c2315b68fe35ee7778c06e250f7607266177f71e764b7062176728766b84386b32ca964ceb27b26133abeb59cc540ad84e5761010a6a0efb599e6ef0934bab12136562b982edb7a454a111628ec11d0098d07f2254f7b9ae520b0684ef0de6f4e193606001837a3089c2dcd98236bed7ffe14e1a6da28fae44777ca514c9dc929b7ccaa9d6a98da3f36f801008375ad3d83636f904ad5c99e3b98bf1508839651c36a42775c02135823d7b5a64621fe8aaa0d21b3967d5130e846ef10bd444e27e26e6e2f370719e65b1b91393efe0baab6ed3505d61e5654f9adf2f5eea46e888757c4e403a9dd3486173f009c91c51392ea7e0b514a618f704e58d42ef190927e64bedeb2f9be2f2ab5fec9b2d550e136b251489aa0db02ac0e2b9501cb1bd04592821c05dea01a56d722065390b3b0f4451396bd6e242d83ab1bfb14e79cdcb492a2fda2b08130550cd156950983072b3cc3542a0ea38e17f6ed48b3a9146e562d42906d79e66969b1ebac7721112f46b7085af107e079603f232dfa2a16c731104559583326b8b43a7e4f1bd12cfeadab41f595e92dfab97b274bd3573d0ffad8df4c02b6df46769db1877b9125a3036bef05368551d6aa905caa83efef5785661015f51de048881c8700447ce15052cafbb12f98a1a2c242659dac1dab8a4c35465d27949526aa4ed8b651d843166d2be8b8ab50acffc6e5801c9c30e1d96c7f9c20e7ef3133f7b2a92fc5dd3fa96bdc08635809347bd45829cb747f679b58f406f04c80286feac05d25e63f6b3a5ef0ad278369c5199cdf62941ae63fcae275143e9e04cdb88a95962f40c5ecdcc5509d01adc75745c5f5911372cea783da0c7a1168b909f44bdad61a10bc4714d13d494c58bb779919af56b3206a8d2695975d24c2f7ab85b399333d23ef3dd4201c0913e97f9dfd354bfdfcc0172df9656867ef1abb6e70938a7ba142756cb578ec2447a7586de381db3a4f372b4e5995ff4d783f861658d63153816de57b54214b13553e6f2f2072e5b6a001d8070840ea75044073784d1b1230de9489319462bb4eae6d1282948fb1cf2496fd8f35eaa1ae2e7496b7840ecfbc5158a0916da826146a847361fe32578c26bbdbf4b133de8dc510d5ecd74c5eaac582ac69af74abc24e05a6f55e96a3b5a478b788abce5b69a00660143e4d14aab735448abb4c88507ec166e6991e102c2523ec62114c4dad660293e0d8ed966f0e30b12487ca58384067a0cee532c05ef925dbc61012daa0ba16fcd85a0646c2174f85b5678bafcd41e21442fd9b6b26859f789598f3cc364106e49415c8c250944354d90ab4e95b0232b3d9355affe0a900592b47689a43cb792e8308b7079e22bf1c2356d485a4e6d4928ea38703a101dea8cee087549b1409db999d69c9f8e72e8c6f2b8aeade9da50be01812d82343103936b9af4805e7e1df5adbf53de916e0e2bf83708fc0725903f4c7188348a8a0bb4014c7d39359694bb8bd540e08dbb12eb642939ad2f83ba141d04a6712658f0eef8248d3c604197c531fe554ffbd5ea3ab17bb4129892214f88621b1615111356996884b626254cb5028f0a1fb0336dab5edf5a606a55d937122c9bb57854b630dde0390cef77865f0fba33086b05baa62509f7b5463c57c883292a1fd48bd47f21f4a3f0a4c4cb27ac18d77696e1d59a56a4f7b6b1d1b87ad2e910291dd341a9a11cd3b0d0378b2e4f0caec2893b6065d335ba990b6742de6a14659bb0725a7edfce7201499d63c71a8ea5852829f6cdbd548ea450e880cf1f74789e20326c22ba49ab508fb6d5f0b012a2be04e0d8d1324d089a2bdb46cb16b8962939fc7adccf90bcf20ad81200fa203d316006e042ced229228fa402da7d27dddac1e7630d76c575d87548efabd1a00dd29e43702580c8f8cc87ea7678b037f45dc61b0f3b96f7830803f2207727d95f0a2977b36317fea89b802ca662da058a6fb322e4fa1450cc5929e9393b1778a607901cd6b737bff3fe05847ab921f17ad0d71d68faef12c6d5240d9a512d74f63bc00c81f96d99597e79906459abd043a655dbb5309f2006da6acc1d95ded5cc7a68de357cac9bbb7571c12b0f7541678d11a4ea0d04c0194191d2fea5c40bf90567d9f1422e9440ae4512b024df6f1b1cec8a45402724307e4886803205aebc67d531a81817c1ad394dc0df12d51e36fc7db412044a22a8e1b56ed8f8255744c6e105e08a548aaa0add8da2141cfe76e0fb35fad22c502b716f586ac82b159b2124da7ab957bb3b275ba06b1d38c5d7012a0dd3c1b799f1725696af4cfa6444c5af63f8306315f867cbf8c8b23c479ff7e4c53bdc935d49694f1204047be2b7e2c9f3d9a009ec617d4c7c402ae68a0f832498403791ad64b81177891e35d2e8fb13f44e8b850ed0c79b4d50e93627ecb3456ab9cb81702db628407efe652dcc6d902db408d6442db3688f6831e808c2792aa9643df06c25718faac2846277ca0ca7bffec48e2a9600f458fd8b3af73f921179d58cb2523226482598ccd2c5d978c32fbc2a598cb72ab851298bf398f2aaebe09ff3cff9cf936d8624fbe5b2666051df721ee3a55e19a13cc35a6378b306140717d0efa39d3bfa06435cddc4bf7187b3e7c1483ee2834646d8c62fd8769dddadeda64a1452690c3c2a412610d929dd84c37e2039bb049f6b1f90b3a70dbac58d5ef26ce6457b8abb45764f0e87ad17a0546e4d2e71b49318fcfb3f92ed9db39592abea0cc6a161b9b8e40125dee7f02298cd2ad9142a555bf3f2c7ac3662808f4c4836d0a0b80ce4aca96054a34e792dce2c2891bfa8f577592084fb006d19ddd58836c08103d5250940604beaf30f9e6e0859db4d305c4b73c4ea60260422656f8544f6a31bfbcb7746742ba32308c2c160545589852ac22e6a8894b37e120827a768cc2e0aabdd122eb2a5206b341838269f91504d5dff3971e353339591ed5f947bd15bee477ed154d7df637f9d5c39299e40ee01d0d50b089e23d0f4fccc6c4343ab4415923200f959b4dae48fa950c5e671be6a17f5363f5615ddd6986728ec96c41600a696f75486e6b57edf3d6fc2f18bf001b53238547d059683f970f1cda79add82d8980a0adc4b9b8d402713fe6a3f1a2f0bf5caf643479306572352d6587f1329640c97c476369a4de9abb2700ce5c4e548b0211f019290f38943331bd9447899918fbef2404ef12469d8383a3d41db0b49142ae71a2f3b43418637d8503210433d6190e47e6c220c96588a643ec89ae1d25d336a526ce627219b595a68332caedb8c02c9b810c5c6828f40da021714fd8f3d598cacf21d747121f97a63ad9d8480373c1f265b5fcf1874b24a6c18d2c11f680765c8784843d483580bbab955703e903d13e61315dec320f81a98480ed1c774817850efc2bc30a5f7e11db4c9a6ca04e163d3661f43dc070334998dcdea45044279ac18e420ce0357362d85941426798ef84e09f3bd0095e463519c837094874a98ab443e1c016d6f014fca26c290269366bff7d54756ba2258f5988117fbd08a5a96aa0186e6c8342d353be56ae4e9d2b8277bfec0b7d28b1de7101c9d14b3bcf7e2a135b7325a412b66f9765886fcc305e200c92c9e6fc58ff03b274f45d93900c13c25c3a74384e1dc42c4ee025108e203c7371e5a4d1226d0411ff076ab15d694b51a4015455b8a014d3ca237c884116f79788429b2e7b5d6056c2fb01b5caacb61e6ddf439ff0f7955e50ff54746500f54fb508ff47ca827f22f15427603ef46b6e95c631cf11eafc1a93297f1d7608e65ef0176a3293b8671807c8de345ae737b27d62affd96dc86992aa6a919f2283e1bf3a953dcff2990992b820c64bfd721066a097ab04bd3e410a08639e328bc1fc1e4e5606143f27423e81a477ba1155c4a2d1a25de85ee6a9712b05d0600a40a24443d3c050522b7120b0bf5282661ca19784dfbc4e6acb5f8a1ab9d2928cbb5c767855cac32c64acd155cc588a44373f03c72f6671e3253c245b4ee5119e0656badd6434c1b9ce25dc4eee466ed14802b096411e95039f21214021a815248c9f9072fe88ef946dbb4766950148f048cd255b002c1d01331154d1b89fd1fbfc15021bf8ee8800b61d379b4ac706383f521370a30328c94dd8c725c61a469194c9b71801fdfd70a7880db8e294d3e4463d60095b964300470ffc7203be3e6abb0e6edc92934fd93970b3291fc6c98167662ab80c7ccef0572a29d104ff07fedd2c7d7e098a9d8dbd709db217bfe1f6eb3e53833d35638f4a1e375552fd6fe20677281116bc71bd5f8eb79689f3b55142db3ec0b736a189fbc91ba14cb219abca891d97af8f493e3653a5f03eaddc781747588d0e6b37cef9237ee9520c3844088634c9fff204e6a6234866dff0180e05c7e289c7f855cb2e729ad1d36c78a4cf23584cccb01fe725ff1b5b1a8a0d5f2693ebda1cc3de8531b483807271ce075ad112eea6844d409f02b86c02d2f1803cf985c7a15d552c07a3e6571b5e89684f0126b85556ea4f17ca80e351a1450ab5e88986d87f46eff734dcc576418096b0a1f7afa36a3bb48366b8423daba3c94c86177e7e4bcd3206f7270a185f57414f2da6f0354028a2e5b8cd9b7c120bd8fc151431fa013240a1f02c893e21abddcb53b6d0a72bd110ceb085300ca9380d91914f0aed2299955bce10be9e5b2fcbd5cecd138b8365e40b271beba756227e353630a9e5b9f2de340d73d5e8b7ec1681a7dc357c6c2137fb0bb6918e0d4607f3c8d2a9d9bbb0cc3c16e65853c11671ae1ceca13717f037329b4ba1a2d76c18d9ada5c565243857f5ee9108124d1c1ef10127233cc0559860120d370be487e0d84f8e8b7ed652afc3c8b305418f8d5deb7b292a6d47351e8f2ce0603c1e2f9e7f05da090b592b98ea30d60a86a750b2940e890d8a7e9389aa458e1bb87a15d7f5ba3d1cedb78f8fec28c110ae019138cda4ce622901bf913f6231a1699149d93e4a0a694aee8feeed007051e26cb319aa98207513b8abdd9c8a436d76dd0cb6b0c67cc82379c98fb3cba3ec85d20b3beae0abfafcb24900d44c71ace6cbe91809755d62dbcb5ca547b41eba8a74f5a6b32170d9b7194d87bcdc052df486175b2c1da1a9b873841693c203b2907bbc083716a1a9511c3b48f9d83bb9ee95159f85252a201cd9f7b8beacd551123791e7c6a7519f034cec8f33b637b8e84091eb011e3d4bcace07c0fa0fdcf74e715625a4c5041b00e2ed9b389ddfe917c2be6c7abee916940a0be03fe94447a32187c75717cc92f427afe9a596ad9ff14d34d50ad934b0769d50e2ecb02bb274bca4083914b282aef8fb3f770cbdde8bbd072249c140e0c9e2243203e428f21a23aac59235f4bafa8d4304e51c35568345a80fdc008edba69f2d49723ed70a6930a6ca4c5a00e1d8853ac591375428b2e8e25744986a9b8143c5c33c1750cf7cb3d87ff2cd9fc6e240d4edd4030fc5d0cc16e0103ba21b222e1e08285a78093d9e45600e9449555ced7346bcde7a7b47ad0c5a7ed0f81f9694acb172cb70c4605b1e709653e134893a0fb57941be1785c53bcfc593e06241f2f9d0f7ccd5c110362544f45806fd2b6dc546ccfbac0c2117642c4c82a780f4ff8c719800d8236d62af29f4257b49a381141c300e60e29666c25c515e39db19c0879c087a58311937edc1f03c55ed86fa5e549353378f98a974c43d9b2f67d442cef88ce5c2001c70b9621974d382e71a073f79dc7297d32d4f70de52b5ed5ba681256b77438070a1a7c6610704f8bb7b6d26b1269df702d2c01014f34164a726dd92c07ff7a97ad757d7913980de7c463e753a4290360372f2cf048907a62e89e60301bb62026656eda6f534167a79cb89e1e2c01903951932f2ea7eeaffa28560f4eeb0b6e3315002f0050bb0b2d864c5c67a3eb55ffd39b7d5e63cba683e2a007983024a5a5cfb3af8b68e586ff15e7a397d14e1fd00173ad4ffbe06dfe7440e8928d7c6613dedc6062138d327ac8a0a9ffc9d4e73b9d10cea288194a45396a67a9e301a0ad7142ce6de01c84db48fe3a98e9303af25e922a277a0a8a0f60f2dd29d23fd0f6045cffcb7d3be9e58b9545db9405e6f391c86b0fe2a2f934c5367653d94750444ef0675b91b4eec07b372d78f2865c9bc6cdba10d08562b0c89c0f7cfa9f8c139710bfc482adde36a7416cb53b98e98ba35afe7d8bc90b6e6e53ceffdf6affaec628bb7b7f3aafd33cf8b5301383befc7eefc3ee2791acdf360a4e7c7f8541130f8fb4e6c2530e25aeee0e11c99afa32ed13eecabc106fe8f48295e205f81571f387b8259aada8e03f2fc020a0a865313a0e7f08e1af70ac02e1fbd13282ff2ea207eb7e8fbce2b8761800efa14875e787b363549e36b65d10ea0d00370ca4238f8805ea22340f5f91ec4ffae936e8cb96345610d21ad5e2ad81d98150a7e692a873dbeff0986565951312ed2fc5a8094a4aa54deccb09fa0bd503c28b8f9fd4491cdf480f78e19a698332ffe977600e00c0f92c0244be08c26f0cc13d85a63b1af4762f9694717540cbf4ec7e617efeb75312d0de2e365a4afd88ca95974f4e26de805692fadb6b4a7d0ea82aa77f7ef0334d58d5e7714cc992c7046ec315655784b059770a15eb9e9879c0b3d98b5ddac12e9fe0455862a26eabdaad2290b2a76254c562d89e74f9012e259940e1f292970fa161a35815575740648c5340e89aa159da79860f0047056d9305ffefedde325aa6288bc6a841a6d56c340cb339a442e2981986c2367e7469a3ca39b8c114e6ac07e27671cc532b5284998918563777207efbe3849ed367fc1068f83e24f919c0c48ffb200f4c5ddbf8e347bd7b194c2db6958431a5d127eae974f25826141be8a00991516f34954ee924e47066062bd5dd208c28d23fd222ad09ce152cb1e61af68e164bac17ce90c4c9e81164cab664a6b46bda3e1c0d68c4d6cc669da8c7b37e3e8405a393dd94a92c9101524224d0def109a2f90e6131b1a205ea57660a65e80538f9b0e9af0bcb5e438933961d34e4b4d37ff1ae7be13c547bf5ede4f861164865d817194961dcb64e03440d89ab31e9d0ff650b906c7d4ad0ebc27f9f49d35f6784720e82543676f0727be8fa071cd88abffbd67d0bad072773ecaa41b29fba43ed473cf3fddf38518f78cadda9e2e7b7766b861e705843a27976072f93a4432831e3c536381f969047cfdd0a0be9f5b70f99329f5fef0cfd73fe14ce4646dfcdeddaffd9ba1449377af31a0c7e3a22236cf9617ce7b4bda9babb2d87ba78606d55e5df67a55f2d19b37b8aebc85a3f5b0cb5484ba0e94d6293a88c4c559296bd096ca6f6c1dd0b4e472be1726663e232f9bf9037fd80481979e0979202d4165315e6509ef31b4897740b9c229abf3034cece25a4e4657618a154a543147c6a4ac9e738cd4fc3820fee4fae01bcc62a592fe2b28c3f0830bf6c476121d0108d224a9233a13739ca213c87aa4184fac8a8de918ed7cc159b42a52860b1089c54490f5b802456787b928ddd8e7af6c24135d90bbcc229a9a9012c935ef252474e528b1853a45c2d371fff5c020f01714b7d16e70d904e98c85c249229d60baa5d023ad432c7126fa21bce8139244b4d7da562e7bc309994f7ce315c0d9948a4c430bd22801a10477f5a97db6cfe4a771ec674c9364830e35aea2156b49e0b06ca08235c0faab0fd2607c64a9b97231c8bc9a8cc840dd1ad5cd80fb35b44603a3d894580deeb33110363838edfba9228f2baf363adae4fc8ad988f7915f62934f44fe784dfa675286d6505723ffaf8637206937c1a2d1397832241142f3155a8ea269eb3213b5910dbbceb3d3a308e921359eb095b7fe217126599da5e16b49f058246ec2ce895003823d5648291be62f909c054cd0e420114148c8256cc699e8404fb549545c8d44c654322c810777a0ed60834f18894872bdec742b82b39d8a7f05379b7dd65621b7d607ec5a974bb987cd1ebd0e9419d11394907a83382729829a2e54ac806e340d980084d9f247a472088b590c3a236a3d67c58b9486bd989f2395aa4b3bcb99717e405eda889cb4826740bf7630c5204a1da8eb1088ce841a55b056f5721972695a03ece756b6989b5c18b9739fe0037d80fc41d3185d44aa178d9c9925bd6e10c7cafc196ff7ff97e8316b77fe02d96213f3d36b8b8f9477d72dd2231fb6b7786f7c4f6f711af1afa44505b0b0a285a8a2f5c1e6021c297c1d32150135dd5fa2404168a3697ae3173ea2c2d61b9ef3dcd6f91ab3336a7ef31178a7fbcf485cce0dd8e863c6bbebf0342b3f1303653c1607268a27be578ddb2b39452caeded7d7f87d74806b4127234fd4f13bf5eba2589ee80cc34f5f641a5aa35bce825f556d2b2d741fd40e476d2e82d5391e0d454b8eb5c5ec79abdf56995996e0fafc095eaed1186ec4998ae2b8dce294d07f38e64087f1d5542448f4ffe716aa808a7579a34168bd8e6bbe9b4e0885483ec7f491c2c9f056b02484151189480c222e89479cd957e9cd3533dddc7deda3afb9ed08cf519ae2ff3b056786abdde92f13376c87fe989f921de66142e1752c88e5851e8212a54bb61378e4c06310750894689e128435a1142cd37256dbeb18383036cb9ac031ec320d4e8f20a4c75f56bfd111c2cd9b3b42b7c4c378a143182ddb79eda988d1b3a55cf8db2c7bbbf210ea5353693f4be44593a95ca039eb0674eb78108d6d96d38229b11a3ae255e430992b1b96820936f2b33e56ef1ab4b72279d5a9f4c1ea2e428d12e08f175e1f67668158531652ee364aa9747c3a99e1545ac3c361532d44049e67050d7a0435858fafe70172bf2ea41828a8fe3ec20a82924ddb78465178f86637987b8f481ee642e6c1a478179c7c8b07786835c65b8fc0629d4c48b7ad21783f11e77ac770306da918aaefa03cc0361ae3fb17396125fc1c1566e49cb04b62fba96369e8cf014f199b7a7edfc1a7a9d26d7ccaef1a6a336506a8a168e0be0c7f7f58aa8b8ad088eb1b091366c4a49bc59b9b77eb5d6faec90edeb995d7fa6b9edc84164a8a40be2da8306cdabcdadfa00a227e455731e780e2a36e3300bea8f64524d4acb010d2a468ff947eee00155c3cec577bd5d1dfb7ab1aea8405c69598de2b91c4acc57e8a9fe7940d1a112412e8a4bbd6f2ea2515588df9b6f41d84966d2963ac93f82f5952a2984d9d563a77c62b7936c5ea1421316799fd80d0e10090d7be763ee126ac49ccce8edd60f3a5a8f17bb5b3058c46bfbb8e4244a6f4f1356cde7ee8ef8612750c8608e49a9df71ccd60172f93d9207fca9373167f2e4d3ca8fd89171e1d1b253683eb25f3105e8c2670cf721af2784609d6be7893804dc12711d17b2a8aefa960bf57b1ef1997cba934c67948662e61e30df6e32120afa695f2b008d6f1981aabfa1b2bbf3f4a67ab0f229d8d48fc1567c03e5dfd263c44d7c238618bfe2319de2625ee1daea767d70889f01a239f586e0436ea8cd9916e8a971fd1e82082d74e2ccf9d5951a6d616cccb7b8447d4a222ce3b32a567ed295f35b860da7703b8de87725295388f25ffdc8586f361d0e3105727669e7c820a003bd1e7e8448748ae96c6046787739835ff2f71c22fcf74667fe7e6a83da9b9291fe8cc7f720c63c8734c616a1dee26a1b70e53a3b0370d499330da0aab41989b09a179985b85d1388c1a85deec86ffa5150980fbbae6f47800677ee0200f57985c14f4c763e165bc1fad8c9ac5348a97d806a7f8b96c636890e321f463511b92afe7caa0c5d2853051e5545a0cc83ed2a405ff3fc6e53dc259489bc33343ea2d62383387c8fda8231a54b9ece6dd0cc98caa316efd358132a8e6726a0e483f8f662d785ea53224340427f83b7cd5319e4ed023694e468281d676c4f177acd3485f195e9a38ce34f5b495d177b1693436b48380c529e053fe5818770904b7c333645cbdf7d086a5842c5661d7c3a1d62698b000732217650309eb2f31d3968f9b6fa98c68de0e5d487cc5b9b9e036b8e1047e21a05b8833ef92db283f1be3444fc576389cc0f60f6dcce4e76bd9ae3eb7a52adf4be755913833e2074d69c2500e7f35379fe29c2d6a1a949e7d779b6b3adb3f50efb978f41241dc56331359e84de6021af4e36e1be3e72d972f16dadc5f0cc3cf5ef46882a7293a7a4d7d761edbc1474c177dfdad92e2042cafff3dc6e44a58ad5392d5569107fdca28f63e6d2a181b04e09f964e45401603c850920f84d70edc033711c447524ce8c49826f5c3b7de83fd599126958152c274a9429573ddd4065246181a6d8c29d602cd6c581b72cf15ed095a95c14a386a86a051582d1bd112353870b882586891339c22c5f2169629171d8f4c9ceb58658178994487abe5e9ea3f82c69a309b8bbecde3c77078ccb0294377854bebc5f648bd70c679a189bb0a4f2a38c673ab311af47edbaad8a16c802e2547215051df0896ee63fcb1ee84905837abd6c9fb33013d7f919b2fe4809be2e18b2492eb465184eecf7e2b9d05a6d1b0f758078a40201191122ca73b03cb5887fc0c88ed2aa5eab481806a2101c913813e650e3a9e54db4b0f79e07274082d8b6f2412192f999fc1d1c8e8814e4f6212cd9845a2e979de69648142316d593093fca141da095cefc14afc6df9f8f1cce9c1c5844065fb450048f48a19b34c3b3d34dc93fe1a4778c46757728f44c0066d0383fe4b7690ebb749f0845920c02b80190f98ff9870c2dd2ecac720dc39e8f7d375b55f8bb9bd83bec0bdbd2043eb1ea50d0920057c5ec3a21758a5e6f5c71e9649e1151362ae66769d426c4d174da4f9a03ac911613cda16fb1927290cd448465eb69db317a7cdc60a0b1f256de89db1b6bf68fc0d1770670c81c16a4bc3b407887fb69bcc718aecf66ea6d74e27eb9112d0d6391ebbeee4fb451cc5670a9ac6bab92bd2a596d72ca47bb2b168956c2fccbcc98f3f42bdc98ea9db6a2c29d692df8ef5ae8b4ecc01c2b545ece1246be1c2dd86d01d4386dd118aeaf7c2a2522b1152012656f007e1b99a686a50d9b8143ce53b91822dcc6e5e1ed8ca02aa26ba475bf16c810b3391c0bb8d6be61008bf3525c44e2e9a5480bd653a9b092f9159da58dffc13e08e433c824f89974dbe6adbbb4afddc4a7590758ac990b1579d29e184fbf51bb080d12f79a70a109c0d337b3284d7d526883c6c072b1ab84f5bccc231475ec956457f0f04e2be6080387ad56c86ec36b3007d5149d3f76506b30b490abc8506baab0901b1fc58ab8ed1a171e31b16209ff060d06476f6631578558889c490d139545cd197d551964e5e6ba0b83f89a1a06bcaeac27e696d6d6c8eefb92e0a3422cbc8e6bd75e3ae29822713d017f122a8e858a7bda0501f86ce7f8291dc9d0ac09d5f21d7c235a26bca1fab25738ab0446ba7d5ced944b02e0cd96741cfe2058f19bc95fc222a63b87b2523c67234837fec9acd4079b5157a6da78c2e0c4ae9610e8940d10a93fd9b4f017986cca6b3638819279edfc29b613d5cb5cab5f827ff426e4d506d8dc11845b8c1dadefefbe12cdb2d5b8ff95a38e433b0258577ced001ccc41a6ca80ba985c0f235f48307f33d21dcd0f7e62a1f5a3ff51a467d373cd88a7f537bf81bb066780ec63fc82dbf138c36f9553ec783986257a96c84e913daead990959e02811cc09a7ee764a0672a8cb583fd70cef48380a81c84ef162ab9ae0fe6b0d9c103f8e45b17ccc630a3e2e546ad63dcb650961d8b104b6384ff875f75dc685c96307b68dc50923c4cc1271130f7a4b1ab432d10d956566e97c3cd316e9fdd6c9aba2bee915149361c52cdb047232b22e4021b81732cb91d50aa4b38dd47dca5813c92572e98ed3a1cae9d20252ffe299fc507793d8c6380a6c61f5dd9cf9f640d47af2f5372d89468ffe27764627043579c796cdbebfd02708c9bacba49fc683a7151a6bf559783bc33a63f71135e373bcc384b83ae5dc9e4a1920d8baf16bc423033ff528a05ef5a84decb4985215d9c8caf2f11bf5e6caf31c7d6d61843dc4c3272e071f33624ecdb0ac8447664abe0d51142c133c837bb8bc9e76497e8bdfd96f7ed7d80ec03980c1a0d291b15a0a0bd535662788221c92720c0cf39517abdf305077b2e7b2a59c2cd2d6e114782c4c6f0a71e247d61970390b25c8a0a9006a759746fb66836177d839f40060a6bd53173f46e496efdfa19e221a06a8220fbb41b497c80ca6c9e8655a0a3de74e07e8934989a9db55184a59005dd15f36a350c652a651e5a38abcc69075e64fc499c8816c3e19cb9a2ab7491b800b1eb8a3514aa90e23c190b37d0380bc181719eae600e0d4367f3f3adb6d02434f0f4bf2847a3b7159ddf0c4626eb3693bfb83d5963673bb4368ce6648e97ea912f606353872d07d616658022a57effbd569f0314fa86351dd08226c7164602b36c56c854a3be7201162e5fe68e5a58ce4c7a149233dab8bcfab404c7e0d86ea2ed9012c429ed4f690abb200483a4c0315c399b2954de004625b56b0d2d3929e8443a3614871b0b4751ca160b236620381c985379a26f6b981c28293749e201479156871783af8323517d8e668f49e6d6386f7b9710489dae278b3d92be85ef3a784bb744d7a698dd9a74dc6d7f6b1a2483552aec35fbf4c8bd9b6d20046eabc950163c796914f40e8f2e72352f8792db9ba511a7ec23e80d905010e92f3f9022fa8f5203c204b64095002043ff6d56099c86d110dac6844626b3051d33ea49d060f87cd324860f03dbe6386ea24fb01b3690ceb8eb91fc1ee82fe3a9b427bd51d5e3ef792d3b74f68b651320f8701bc4853b5dcb5ab434ed535493dc9aba28e830e4bb5d4c4f8a0fa9aa96d919eeb285f00427b55b3e8fccc5b06e4ed92a923b5fbc404de0680c636252de8b9b1fee5ec78a14d59228583c2d015fbefdf6980fbd417be751f1841e19247148a9f38a38e688f3d56e1f8ac533859a8557d7a3a8ffcd68a2e9952107e6e7730a0fc8e26ff5328d4705a8469edf0ead00dc05c654ed28f8a23495aa181e340e1efdae22e34b94697bd37c860ce9043009c0b13808a0bc0e135453b0b8eb78784b167e11413cffcca1ef5375f11b9de4e37dc7bba9dc13b002c69e61c15bab70c49bc101f9c83773aee49899ff705c9624964eabca5d09d62b09782321c2c3ed5b1155b7a18d0d24c1855aacc817508f4012e3c755c1ce45d2e8b301af8891b253c390e18b554cb01d9c91ebd36dd88b948048007cc281e91eb7fac6a12d6424a99d9740b627e7782e6bec0647a54a24fd9dccf9c8c4b8571d1003b779bdcb979260723875b7cd02c0689eb0b80c260fb8294c4a22053860331308bd0ce0480bdd615a8f291f659756fb98a8109b996ff4d1f34bdb6f8a7680846fd135a8476bfaed466cc0900898f4b21c824fbb7f52a21026a2b4db44df32f492e14586aed92d7a1a0efd01c8c87c14a06c517f5cc1d3f5415dfbcc76139158c35e4f9c94f36ab74464489fe63094052f70c44562330f3983b5fcae66e212e9c4594025aed03d2cd742664b0acd60808e9241e091d284eae7976cff409282def69333bf6173e8337e957c3e38a3fb1bde2be03c4b22d49c2ece524d581de0b893b25f57784ad1c6163b3c523b5ecbfde1936739e094de6dc28d2cd86ce624669e3abc050035225457050af9367078fc548e62c9f83164cdbb292181ad7347550642af05e28f88b89c1e62fcaf3c185da4f62f96f3a50be840baa8f41bf43c8a00c6ce6f32c9964966b0983b58a241d68f917f75b60bcc958aec15fada626838a17af09dfb0f593525fdcc763f776f661583d0743a3638abbf6769f2ff3a5862f63dca220892188337d8ee01a4a40e8bb408d534f0d7b09447737334c01270a164abc497af1b5e4dc69200db38fbe89f5e8724c2b8bf46add5be24edbfea6214b8b048812f91338f828383036e2e05481408845d530abcc578c32505d2f8698bbe0c070c25bb4e60d9f46d741f0558977223a12260928ec19f95855319fcf6c6000a419b83af0bb8be85025f28ed46bb8e9824f1dc6a9cde0311e846f43a9cf6e360ad16de8f3d5fc9f4781e6f04e8102240b2901d01c1281304145d012956d75b7d79338c6090e954178475cb0b06fbce217d37c8df658486192c00981fb20698ffd06084908654d0a511157c62c3342105127da681a80bb2f1ddfb7ee6ef1d46241d0d554f2d4d6b424875ab8b57d5d37ae9ca481755daf6cb356c0637354167177755b16f55fce5a470dc521063e0f8626e299ce8ab0565f861b5b59922cc32813d3ab9464d424f2c549dfd7a1ae7d43e0ffc8f800329aa7bb452af8ae545b3566669e9d20e451e44911b15e6213d813af54e9c03542c51af77aa1091837e69b39bce30356b942f0c36838cb39c8ea7f5e3a1dcd77201dc7a0cb1bc0c4f2c2fbd8d47a83b65d8d275d72a2473187d698e24ee377e90e28aa486d0e99340e2a8afd16a3002074c0bb1efa9a6ebe0246e2feee1091ca41e0c87969f4580cb139c4a8c0bec007a750f32b15c346075add6eb4635088c61663ed47c9354d5553685df75ee2f289716daa97e61a804035cbf5cd4674f26d080368e4e657d9a35f2a40521ac2bc1b44373c37cb7acc7ceaca5c0d260f5e1274f32b76d6f9ca7cb90c71f3ce20eb282c38815ab0153e0d04b86647f712333f0ce4c87a3d1af23402fbb6954ae2c365d22c6592c3d1390f005accd74a33e30f9bfc0a3842ecc241d96a5800e853630b5b0581b5bbf0c4a6e4d27076ad4ec5faddb04bf978a33c590105879a278d6cec60c8496ab14af52ce2a1351245b6fe2489c5256bc59dee5a72ea448dc702398c10841f85411f0944df37d6aa16caeefcdbad34db658128f7efb89da170aa12ab3f8d748d5393f806a6477f139f20a50a5c99dfbe719d6535737b358e7aa19522578eec9d61d4f62c7107e8badb70b90c91af86e0b55d2326bc4262680df03148cdc045caf9f3206ac812523381be0055460b7473422b49cfad06a6c76a210cf5ca8cb0106f6529d834d7e9b4e4a25784d1b556bbb97fe54c33f19644817b6f8b9be4105393ca39f344084534c57b5fe0470c5abac4d8477467a90b6b90052e31d58b66fae5b4d4943559e6f9840b6b19bc1a90f04b75ac92ce972e02477a8969b9bbc2b0657585809a65ef668afaac2121c2713ed6fccc061b0cd9aec1422f22ccac7a9d446a04875a92b8a4a951b6b1aad2aaf31ec26c713a4f39a6e527aff963770766702e25c09021f9e931b23a7602db172dbf638339120a730a7d16907add0d403d5611e88e94e3afe7b6c5902556778077889309573f86be20374ece1db6bf5bfd7de8737b023f4e1492e86208751b5a12edc1e220856bd7938bdc52b11878344aef3d52f3223d26e768277f35e0e4042a081dfa40d5d893e7ec3c84407d15ebded3b645e24ac92d0cbf14df338f265a3140c8ef2d0b7f277c2629026a96f671a2e41395fd2294ae213dbe036e0b8c16f0f0dd0f6bcaca6214371c74414d1db8f941f21e57db50a177d5a0ba913e00f277d58b650d4ceccd83f0cfc741d02f784ed419b1b49446f29c84f7629b56cbd40cf8af71e8f6833f347f9e6fe5925ee7bd40ba769302e45a3894e6e630b132c9dcc33e660ef09aa88e3b2d7e8bdfe3ed0d9a619eaa2817648a53c484799c641c7ac807e3e58b9a9f29c22906a2a4aa0b3cb2fbbcf5934cad3a5487d9cbe1a30122779b0c74598177591bc5a06984910f9def6e3fb121e32650746d9b14a0842460c20ee094375662931aeb5277cfbd4765e8bea24e1c09b04d5d21db5eca31151f82eaf9a4a3bb9bf6b6c5a267495a43da9503085f2eff8a4834aa198a3c928ab45ac5c821ed3c4eb169cf49f7b189c39a69d20654e9050266d69c849b7007b1aaa01bd1258faf5244362c134606b40f0f39a4990ed32c0fab098f8876b29a2adff1df07e416d88915d6b50c4050380426e3465938a35e483b14ee55a30e31066e89a62fffb47973f81da1715fc07e591518ae9854ce27b05001d000760c4e0667bb668dceb491f892849da12fd12c3bea6204d501898f9ac4bd080057e88cb17d2866e391c6403f58a5edf477492831acdadb3a41307be45e5ca7a5217292a081e35d6fdd497cd6b1d1e561adb724f81f46f851cc8156b4024463cde1ad91c4964b3e758f32ece74b55ca8f1dfb16deeb7330a954fd7e6e4e73dc0e8b22565c4d532c7b54dadd9b16179006a78d2baae4c482b3d060a63b0c44897fa0f83e84f72e3a930b51c3c6565e624ae988f9eff1fd8945ba24cc7572dc08c863bbd8b52ac4cf73b7cf63f58bb62ea3c688fc6081f9a17586597fe00570dcbd2333eea2ab282dc498a34a98cc19e2e69e8d0842f299196c9c6e20753b8bf01fb3ec46616cc9c7677a60b5b1be214307a864bbe98bd29e6f55091ba6d47462e51b0e30c734d2a2010690850565a27cfe9348ff149cc188c9188526b5a0fc97956ec7efeb031861538e205641516b92fdd55526d28ca5331e734ecbafe87d47c54b82b559e4fcf22c9cd3148252adfc34cd160dd419d95fa2203645c26237b187b887cc42eb5e318c83b19cded95253bfa2bf06d14427a54157339ccba7e864ecb9663524c4efd294c598e3e3f809e11f179093d08c0a8567a336a3868c16986583b734fc8ba7d67477ac8d8aabd5fb33f960dfea6740c2a98b7815d6c54be5e45aa220687aca03e99408a12290d04107e0b3ef3a75b3a629c33f02130030163d1a54d71391b7ccccef1ef5054cb963aad7805fde42cfd7d9d8f733038adb670ad1c2bc1c1742830b1f111c7b340b2061cb6cd63776a69edb8a7506614214ea183bf58bc6b7217e35632770670333b98709d648f1965e1e5f87b24ac811147b88ffb0ec2ec6e70ea87e735a664605d7c439915d04fdeb6c89cac22405119300d078d22835148c01f63504476c5f5afc4864710a6fb75839bdb4b697e4ee44a013076a8a66b62310d54c50d34bdf8cd889d4c5e098ef743227030447f981ff583f2ee3e1aaebf3d64613c83defb9967ac483c69d27ef08dfe95de828aeae1331ab195c2018daaeaeed49b39e1787a68bd79b5ed42696c68fde0e84e639aeb3a12114901bc7bd3e8a4a6bc8a81c5b363b46c6b4c0c54e9a1071c8108d50210872763f09cf02e9bf38687ef5676bf4b24622bbd51eab20a7d5278023b09e678748b944f1d860aaed1ed0012c5d92b4b5d579aaf4bdc006e74a907ca3246770a90f1391a9d68507139cc87fb6e082ba2ea868cb72db0dbcfcf07010084debe8b0fc326de101802aa67171ccb1266a7eed339076bda05e4e2549c19b181a3d0ad70c21ab63cb32b0b445a5c098adab4bb65768ddc344bc0b92a96c739d9808d530666c587104be13cb57561e9fb57fd022f075100a8052bd0026be6544dbce190296a600d2f41f7a18821c361f546c8474da16adda6d347036778c63ee52632fe5777904ba3233998b4047a949af2b2ca40197206b042c9d64bfdf1388429665cc59b95f956a212fa597df7f08ab3df418f1888651601e2ee1fa4a707ae549e1405dd5adf8063094397ac6d1fc85e9b5f6c43f369b344a24174afece51187832cc8eb355704619100b7cef3240648e955add7595763d23c5c92833ff9a56541cdb0643d4c1665949bbe6a23589f2e54419135e24bd587a99690fe54d0eddf22ca5bb53d850cb4a9f9f9d3384f6de386c331dd80ece2695f13d809415a5cf1d0f6e3c2767cc3e3ffac48604ad0c87a06af8d4b52b1bd099703d38ad2c56f02ecf0ff2576609e6579cb2173341282147aff861e0028ceed893b4c3e01f7e2c5dbfdded0c99ec3bde52451aab15ef239922d61dbdce4ef8d42930d6d135df0c54977c6fe60e7669f3de2f711e2bfcf21c2eee0273425663599dce3b229ff3a7278b248b737edcb321a6b869cd68c9658a65d4b995b0b79586aec1fd12f9756320441e65a325dcff7d369d75e5da58d1ffeeb91e4d85d117ee6c49df0462298b22676ecb83b557ca2d846f8c800c6f60bdc8dbfb7902b95bde8f45a4b1f2238f0e3777582d698afb9f0e61f22fc13c429f0cc732e815087e0cb75391fcc6c993c12195b8af4e1e7445d6bad240322b7eb447182614e0689ddeb9dc9dceb8cf304dcde319e553d01dfdf02c11f47bdb3cf84f8a0287dd37a0ccb256fd50e494be6097ff7f4c703c06c23bc17d3e6ad91f46db3311194dfe560e795b140fcf8f24ade7f2316bd6bd92438af7c7d8a999e225b0bd30c013a52273a1f8a403356606a60400f2ef00ae49aefc1069f6a0d60cfd7f1dca794445f8421db9afab6584d1f5f4097052a72e3c1887df986780a3716ceb76b840ba7b55be0ac029156555feac74cb33b11cdffd85255d45785e70a88280b7f8ba53ca25b28cc6f4a92fabc82cac65d83f2ebbe1637ab558d5ef75b58414658508acb26211e573b1921c012d2ec56792f6f0e97cd1101186873afd46db7df0f0f90a8f3c2fae9f9b1f186954d8cf03634729b66199990a85cf0a9c1b7e0db34f4121fe312ac0e9bdf816197ca9a228e8a6785caff958804ad7654917b9fc0e1c78073be0b9f03dd11f091c6a3879b467ca595d86e3a2c83b78e271dad5cd12c87ba4178bf2c9e1bae9f8e92f122ef2995dd51236b6472972bce3554348418731570bc2a43fc203771389f74aafc28dd429c0108aa14eb88a39741438f3e531218e4114f4042009339a14562c0764e9e790315d1d4605afa1b2842522575d8a8b4ecd42b160fcd6d7b89c2c4b5e161a3e3b9f209d02e8761850debeaf2b56c2cf2035f1f660d00f531ef0d7eeacacd384f300a09522c9788cf54e857328ed4c9b58233e7eff20d136d1fe912907bc9e254b469792d5603327d5436b7b440384737c9fc72f0ff5162c65206f4e11a8d1505754c0ae37d58bfcfb4902219f0503c80c7d302122a6bfaddd026f17e691c8c88454c54f4487d926e175e52548f5f38dea84502f4a95f6094c89539271e3f8542f67014bc436bde5b5bb35b4476eb68d7fdad173013640faac702f53b3ec954e5aefa0b7160a331da0494006c32995d4fae38595e8020e86e2af119751cb10e9d498257091abf3d7c1d64c833f344961dfa83a11a3f06a443e899148f10a46749a692dbd4a0955eb177cba91b570575c3355dba4a8c1ac70922dd2c4b03270a3933618b04da56da161a2dc1d2f44d8f1cc65e9d038d080758c4e9035d515d511aaa2a97bc38524573153eaddec596b431f3b0a6b59d5a5083b563895c309b1de31fe01b928132aaef26bac078b624bd2e32d25f61e8c62e4fb11ec8a5b689feefc8f9e1f06f066c7f19aba12fbf7f7aafdbee70e99e9530226610de87dc372ffc0458019800ee0782b53246b4081fa1e813c424fd35e9832b3613c5a942be865f690fc1e77e943e802bbbe12cf684532c2a6284cea55787663d9d47608382d76809213a23de1fa5fcb672e572583d3fac864c2f2fa6345d6dbb60360d0a168c4c74be5dec8f7274e14f615c2eae9ba8dd6c6ce2b72f3d79192ec04fb4af21857f5998b258385dcd43cecea8b01c2d9c5ce5d9fbc5ea026ee64c5a9900c74199069bff18094a52a98712752fcccbd7c49fe80934c17911934856a4da835eb3c86a94f475848c17ec9f14691de70f0c841c16d0b7979aa255c8f7a129d6f8209b538e0a320121aad7f9a9f4fb676b621c7beb31725821a55e11bbe2339d5cfaaf6f1ece4df08d8c428507636e0c07fc1f6210bfaf20cd06f27322a35b8e457f232b13bef23170d3d3164e8122817effd12e579181b1f6cfbe0a16af4ce385566ba1bf6e8ffd4086275f01520e41eef6450f19dc70b8b24d6eece12e4b5daf9253fb59a2e85afa683acd4c2ca149bd5132014c85dfc2872953f8ff819135dd901af4f7eea52238e31286ccf6c09f4ca3ee950b8451b32d0c1a12e91f6fa3c6b265a6f4f501d5ee2ce33a4db08cc8db55b999bd88a3b89435e31501a3d9a9660b45e2757ed2ecc248bce6acdd54b428a9a5f51880cc5ed76ecbffce4714d7d6c643c6b27a33ac0bcda090555ab0168f2fc755078da5b8e5bda9071b4022e8555eca41523e795837588a593870c8f80693fd9a8974cef3d931b097e36e411be6bde4b7f935f2e2948ec961aef52885b461d0836de90c2b3b8bd1605b6f8f4e01b83c5ed151cb4c03ec39f2f6ca3b22c3d57bbaada407c53f4d8cea23d21c693c47cd3d7f278438e367b8c3fc68bca7c4330461c58a2136ce1ae99f92a5a26cca612a2637343ba7394b8bea9772b87751554c8d389706c86230c0ca192013ba2f0587c7a3225b82a8fe48370a967ace5037a7d6492538bcc7abc9bc7ab17a518da8911728fab914ba2e6989f7cc3f4dbb7cae5fb3edc2b8c81d3437f393fb46ac15037a9d6a835320d62a4a07b7cc9477f542b22901114981ebedb33885f0ec1fb1fd4a061741cee7cb06e821c130a415301df54e3ef480c8fa038ff142bf18199ec0e1ee36a1df4a109f3472b61aaafc64efbd89dc52ca94520a45087c075a0873fa7be7e41371b971694612bbb2a8c1ed91ba341a82651ec464ed5d6adbe54b722e9220cc3b97c571ee4d2a26bfc7ccfe516a9495c93fc39c82c93fa77046c1e47fefcf6144b67352d877bb9bca781370d522d63da3d26ff631fae87b9ab6ab3da9e4a4a023465e68d46a4de694ef55fddaa6e3ad21567793b9fb420bef9bccf766b42e5c62e0792486a11ac4e41f9c8841519662f2f30926473ec18f9d01468b62f2fcca41371c7941001dd3a3c58162f25799fccd49302eb2dff489c92fe349544943a4ecc4e4ef1f334fbedf51a5cc56e34d07f88feb667dfb7ef9cbcfd6ebcb79beeba3efdca5effee847fbaec7f9c2fdf70227e5eeae7c3f9a98dd1c14ae3afba7fdadef395685a3ee7ba9fb3d7ae7ba59dfc797f0bb18658c17954fbef7dd83f2ba2c9718e3e85d23f8de5768f277727f906062244bf943ca94de05e4da7f2ff7e377efc9bf61eebffd229e841ba943da3d27dacca6b391468333f2f7fa4eca2f42360f926ea39e9312904d6721cd0be2b53f2b694da6ec2673df9f9f87c9ef5cfbb31aadc97c5266a7916cd4e3eacf2f93697ff192232cd336122f49d61864eb1465cc9306536a999dd4c8989d6cf71b5e6801c5365a0cd19bf7c5600632f8196376333306f28adadb7424730f06c2b984236799efbaa43452f747a31876310ccbb26cce2c690d4a4d4a2c13c3b2c98db4ba8f61daa6e324e36eee9c946a3f6b9ab66d24d2a603a3b393a7641868624c86c1ecb46e4ac54632bbb2089f67cd1b897446768daed14b2e0af6a3f79e3721e4635c944c52b96da3fc5989d92fe5fb1195aaebc1f7912b0272fb9a9d902dd9ba850da05ae255422d356a17e7e913eea3f25b9cfe1a6663ae1b6870798bc4eb6e91e389ca1c85591b45251393970d902d0d59c68fc2f7eba9114c7ed7a19fb74279f5bdf7c016d5b7922265a6549a1a2f31f9b54d0752dd46edb214738e6c5bf88bf203ae8f5c14f917123fd59f3721e24b2e4a16e9dc5889d9a1a264ee8d217525a8bb38fcabea4dc7ffa2f1957854b193abcbfbde7ad83beae38aa0368dea7ffc1daaf69f1e87ea1c58fb5f00aaddefa7d9f8f253bb3bebfe69a3b52e6c7c89a3ff39db8c7a78d5a673f8937853bcfd4b96ad3603edb8cef05b78b083ba5b8870471e75b7ec60a83680c843991df4a9233b6637bb0479aa040d30c1e6b3056d43a41d920f29883404b303e30313e42928df0f33e4a9107cffdcf19408be7ffa788aa3283d60b96c976e59db22eab6a8e32a447cc756b8a7e355c73f1d0375cca5e32e1db33a6e311117755da56b2b5df774bdeafa0789ef1a8804df359728df7597ae595db7ba26eabaa8f32a9d5be9bca7f3d5083a0712019521a0120abd86fce60aba7cae9d1883985882c69d29142641a1140a4d406109a81c015b6128b8ca13ec0437c14af04e1412200182239e18f1010f74c0090736a0810c608008a672010b5480021390400420f000073480429f3a2693ef640b63d2809df5e23be9f3dd64c177a5157cf755862ebe435519b8f82e862a434c15bac5af16dfc9ca4216dfcdca420ebf9e3ae295fc7a0a045ffff2b982e2d0b583c577b3c2d0f39dac30fcc2f08b73c577b2e21000871b764040029220b1e1638fa71c40c4f7471f180487780210002bbe9bb58aef64bdb961157c37ab26abf6abfd7aaafb23bf9ee2c0a7726a30420310bf9ebac007f12bc443d9e656326da88d01bf9b13b3c5a2fa8720f2ec05d7c9e9c375b3c402ae2bfd0ab8ee515d701d8ab9e062aa782ac687b7e0aa54a905d749ce82e31ec6828bf9e12bb86ef1706f5ac175b30a6eaa80eb2611f45231a1579020019f200a117c374300e54fa7ef8f89f1a944d0d8001ee2564dcd37142038a29f3c0d1114aa98d02b0f08522a7dff119bef9fd92bd93e4182d8bccd13419f8a09bd126506c837902a33df49233ee081ef503f4284c4fc5422a8ab98d02bbcf3b235b2e22908f013df01274ff3eba9225e46a65b44d05631a1571cf06b5a997e70e08724f254f7fd46b0131b781a2228ab98d02b118899313fe4e79cdfc9213fe45b7e4343e43734bf349f5d1a137a85ad7ccc165e5bfd313d9db38b82f97e59e4296ee231f0a4ef6406def4eb290d3ccd67f21a91ae48e0b1ca439e6229be9f5b9e1ac13712df24f866147c7faf3c5582efef1f4f99e0fb1bc8530df8077cbfaf3c3581eff71f07f25405bedfbde5a928dfef449e92f2fd5ee4a9249ea7f8feb7f2d494e79def7f409e62259e53f0fdafe5295ee2fb1f91a79889ef7f459e72c0f76f3b9e8ac0f76f553c6581efdfac78ea02dfbff5788aa9bc04be7fb4f2145bf9fed18fa7988aef1f0195980a0a7fac5018010a5340e3ce143442805e0fa057100ae8352405953e27a072280a2a83a0a072a70abd7c9ea071c8091a7d9aa030880a5dbf11e22f40d76f82008299a0eb373f3c2f41d76f7c785682aedf2ce07987aedf4ca1eb370af824e8fa4d0f2f85aedff0f0515a0940c04f80aedfec6002ba7e73802f015dbf59f224a0eb373a3c12740474fd46e74540d76f0cf021a0eb3705782874fd46f520a0eb37f58fa0eb374afe095dbfc9e18da0eb3704f80fd0f51b1cde0374fde686ef005dbf49f24ee8fa0d922f82aedfd8f01de500dd00d500cd00c5005dbfa18188c569f259132a038de1b3d69ad0229fb9d684c2f0d9d39a509ccfa0d684bef059d49ad0018c48d0a751fd4da8d6c6dc2d3b585526ef333403f313c10c32d0684db6d9080d4d66c861925383111a9accc0336834326c4cba06233434d17266a09161633283111a9a683e5eb4000c1f1f9f6d9b6106264c982c93211f8f2123e66751fd4166b80c3c0cf7c2b3a8fb4ec5a6ba25dd0a4b0ecd5689e8bb08b50314c4c5c7c7c7c7c7c7c7877c7c7c7c7c7c7c9ab45ab10623346c4d341ae6261a8d0cdb0c3c83462303cb1a8cd0d084351a19b63de2373dc39ca512cbb051093ffaa839d5d48ceaba01852a64be9c6c4e276d479b75dfc0a2855463e5c6134c40b01162b3654234866b6071a38f2154779aba425cca50e38b10172cb5b94a1d08192244c80e84e0c4abcb861e587ea68c2144860c49038cac2e1b7c08c5ba6c5861060f064434a648a8a5d79876dd2d4e143111229b0ed3b738cba14184d565c30c316258438a36de20a3526e636a2ba4458d2a4f5bbac85e13224488907f9aba6e984105d58810214284522075dd00e283d3e8a64329e59c4b438aadaed01b44b5d42886e10b2a5717cec9d5a5060108a8065a6a000454b90504b4cdccdd2ddf7b4f934456d806444f8fbabf443ec837cad8dd1233bfeef6a2f7def3967c6c460b0493af6bb4850d388d34d2084296ed19679c61c61e1903cdee96db2808618cf1baae99c96ac84b4af96cb09299fff97b0f42f86234410b8dd753c684222526e5c878c2f7d9ba7712ca91778433b2460c7565a3b67bdab55f900ab26c87643ba50a2fd117c8e6e24c61461931d706664861a0d9c9ca65ccde74fa7bd3710e899feec9ec57e2eedecd4de29e2338dbed3d104c4e7b5c95cc88096536d72c43966533f53db9d9b65ce7a49ba99cf1d3e9c76d3a1adce6d6c94291710d66b73ba8cb2da4c488daee4ea1bcaaa451fbda112337186954b320dbb94bcc8dc9b29dbb4f0e20cb9e77773b0fbddd0f3a1b91613ff7f55d777777f8206cd4e3c3bddd1b3284cfddbd8b2cdbeddd2e05d9eddd86df75774bbfe9ee9e91f9113361489b9661237945f8bcb9b777bb8694044ff186f1717777b831f23f113827cc7bef419797fb737fce8bdaefdcbd21fbfaae5f1710228c1042870fc2d77764ec438bb3cf604c76777777f77efedc5ffbba771beeddfe022839eeee253575767bb76bd1dc0db3dba8a7032cac1071c18b1347978fdfa4461f5f0fbb809da8a347f7785d725f8c72487ac3e7eeee45ee717df7c5e8059cef71793bb163848f7322fe62f23f77f7ab61dab8a2a7b5c5bee7fedce1b3e237d2fdc557c56f165ecffdc5e9eed1dbe1f3f7dcdff3e7cffd457787fede7befb93bf4e7fe2274f7c7f0bddddd256d6274d1453bfb63528e08618431c60861bc22943e3e3e4b602b72052b58419657a5fabf8be3763e54fd3bc6b8ce0ff7bda980d9f73fccbbb860f2c711842f7eff7579bc628417840f4a6fcdd977ddd79d94417171ddd5854fb56366e69ada3133cf204cae458983d48e9919d24429a594f29a0982f9b391c6cc2e98fd23f6d60f524a2987c0982d138436d27e547a71c16232ed0555c666eda49412cb348db5f80286799bf2ed8c302e58c6916a27a59424cd892ea0cacf037f31fbb1ad76524af98290d96894f9909453e329b2180d63fe3192d17890339a1c61cccc234d7bf9a3ef20a41cd1adbb38cc15a35d49ca8c46e39ef93cccfe4ecbe16fc1201a4f311bfb87b116524a8995b420660b66ffe88398fd989bba864f1a6b319bdfe654632a05a1013223f32366da90767198ebaedf67253d89b032ad76bb6ff70511c4cbde83314608238c314608e315619411caccb99b352dc618e57b0fb6e0439e82913cd6225e312ebfb87137b21693ffc58d417849cb7ad3608c119290f8b9ba78a1457cf1bd48da34d24892dec79ead2c5b2c8e78903cf07069efbdf76074787df71e7cef4b7eb30f39f8dd7bcf6bd61a77d5e13debf0607c48b9ee228931c207218410beafcb28c8b2f7e07b70f7237cf03d38e5d523091f7c0f622668bd1e16bc9efa0f4208df83efc1f79b0e587db3e7ca9f7ccfdff5de7bef3d7feff97bee0fbee7efbdf7fc3d7fcf676664def3f7dc5fbfe7efbdf7dc9fbfe76fdfee1b5511c66a3423b9e38b57dc87bc38f071dacc8ccc2bd520aeb8fb2bbdf395c9df8f931a0fbbbeebbebeebd8680832ae6ce8eff9dd30fd8be03885e9bff03bfee55f8ecc6ddd87cf97e460d5a89d0239b291cd54f9f17aee7ff9af7345ecab627673664ebdce744ef552e7d874ce4cb6cb753252273393256ba8e503bce235baaef7d9f5ae8beb64d0ac30061ee6f4ae04bf9b51ca4b72dd7c5c579a7bb3efbf2ff982a30b2eb6d062dfdbf7f6b516a50a6731f99f17bde7ef391f59cfe4f7fc3d672cde7b57bc7dcfc9c8321e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e182f39c22436a2b4d53e2cb732ba64dda022fe69b50feb92fbdd9dec36a8887f5aed13af87575011ffb4607cddc96e838af8073a7cb4dba022b662b7773bc80aeedd1df1280559b6fdfcf17b9e62f6b3f7aef49b6e6ff7ee767faeeb3e0ce4eee675d285479522268a2290f9c347b7fddbe3c318bf23d75c4506e192a07b395042f82fe77a1775f81717b9eef97b25fd6fcae3f6e24508638c5446e639b2991999c7de104208238410c25db80b4da59865de9b7de63a08e1c387d07771388e1104b39dd3df41e9e744abf01d897abd07745def7a1128faeff6b2cc1f7eb3162ed25f83f7c618773c067a10023db99efbc54f4bb634c88f52fe368acef91ebc3e42ae93524a9bfa5aa8fb7e715da9ceeccdfe7b92eb5e7df23b28af875c841717394dce38bab75d063177e5be08bb23187d97b3b6398b8bb38f5dda6ecb7553acd47da7ac02ba3f73694de6c4be7f36d6e4ab974a73fa2fd76dfc6ce37bde1e88d422de4b2870350884b7733ad9b973af540a4962185bc4c5581c1f15557f8ea7afe9f9c1d176bec7d974b0cf8a6c11765256633afdf543d47ccd5f9c942c4298b8977262eee4c3f540acea7ad35f9c942859863071526afe7a295984a8f98b3bf1dbfc149594d39fd8f4425c6f7a7e1317250b734298de868b42dff451feaf9fa25ad5aa4ebf2a79c493047085ff03ab6cfe089df840b0caa68648cdaf2adbd96d43a396ea0f33a0d30fd7d7fc10d7d77052b20861f3a69772e23f7dcd5f3f84e98970526cb81373a71f4e5ff34310799b27f2366ffae6882533518c683e91934d8dca4457f5a71a6ecdf813573218eae9a92ee948c7b43a7407e99a3f7d33732290558e48d9138be48acdfb6352d894e91deba3fae879d321f5a6f34487aed9f78844392345184431e218918c23040d9d51bdb9ae2c16cbe69415d18a142992c9a09d6896feec4ff06d7e55fe5dc55327c89d7eb8fef44398de869332e44d7fe2a4641162c89b4c2f45c85fdc09feaaae5f95891ef11bff8be63163d8ea0aa141a5caba6dcc608b1a69645b82b5944083c678cc1a34239bce9353ff83809fc03ff503b12a213f04ebc00c3854437eb72740ac8a0a95eb6b9e8ae94f0fb953733e08e14efd427e8a6aeb10eed4dce987eb85bc10d70be1a264e98f52f3d7372784e987fc102ecae94d3f4595b10f545cf81658788efe53b17922267ae21ff2abbae8895fc8afea444ffca65f550d3da9a834eac4442846e437fe365851f57fba7e43ab547fce4af567a1a7fab7e053fd5dc8b0960b74552dd055b14057c5d15551baaaa7abb2a1ab22425705a910ac033382a0aa79a63e44c922c490afe1a2987e0817e57a211cb76657e124cc96e38d3ac7e6bc3642b3380926d479c820830c342c0dcc71080955ff03602cc07afcc67f5485ea6fda9c51d1a2fc31166caa9fd89b1e4ff58edf38ed9aed7cefb37f22fec4304e718584c9958a13afcaa27d16d253c92231252c12396a1e9bf3de1f6bc26250d854b73809c6e222de34a8fe55a8febe371dec335f672765d18c56bc41f5e73a665c6db338c96e91f8db06bbc6efba76188be92ecee327517e93dc0ca0c35c04b1564d7f06641be2fa283010a96a7e371f6ab892dfcc09cc6e16c16f4e665b8e59b20717ac55e456cee841855ccb4ddc112e9dd56ab55ae9b05aad5877ccae77767674c0a265b5c408522e316d0a6b7d0bfbc2e6f4e748ac09d54bdff877df510fd0ac22ccae57518ced22193f07609b53cd77a5fa289b534da9f49fed50f3bbe3a91acec4adf70ec744981dd662d52e8a517d8eca5c072bbf0e4b96876687b5b05646c5624e288531bde8b22c96f4bbcc768c60b35871b53875cc0e6b691c89eb4cb5c35acc7531b5c35a4bb2036c8c59b207d06f277334235b0d5acea693d3314bf6f869d4560d897664cb6cd0906c3a4e4a553e924d477ed61042c8dc8c36cab81e7d7c04b41d7be34f37d52cbff1e7b8f2b66353718cbdf1f71e03c3634d588b8ed975af1a4be7c8f7ef9fce19bd8f320368906e6520741707c250ae386c3a4d458906a40291c161ebc109b0ede0413edb0d88295bfc2801852bdec812043b54406810aed32a90a7a1ddab405e867650aacce7b0e9c8bc1297a14eb41ab1f48d3f10da45a9dad74d47fb4ca3710584eba654201f7fb8caa4aea7791a99d73e93a1f1a751fe1a8d2b2f5346e69574ef04a179ff52908b76187be3afda767895866b2aabc5f1e73966d73b405e49c755e768ef1fb1740ecdfbc71f994d47e3786adf9a465fe54dd3b82bd7efa6a9b2d070a7040079ed35ce035a05c2bd46d56d87d9f5cea47251daf78ed641a9f3fd6768dd749075e6eba6c3ab33dc932875ca70ddabdafbffa0bb288deb9d46f9c7d0baedf0eae49a4aa3fc31d5a6d305d8741e17578d8289581ae5bfd16d94c67507985def54ffdee91c2aac8cb69746f9eb6c3acc354b8e39fa981d406bda75371d1e7808b38bab18fe6f96a77ae537fece5ab2c78a357b55fd590833d67d838e296aacdb860c587591bccad89746c198257b14356a2b46c461ad4639152db5c994b58babea1f579ebab02f9d922aff4dd61ee2efa6135f49f3b025802b86470fda4e66e6ef61ebce8c985db653bd31a28ab516c73fdbc95996652f1b95fd6e2dcf3e6b7d47ea52b1ef4870d44c05958a29c856007fb6006d77e3386687b5485c483b50a3beefb8da61adea8fe1e18fb51649bf3f14a54c8939850e7302f521bf83bea457ae58b908df0f9fba2c2401644a4c123ce5bd5e010a32ff8510ca85a5ba425008d5ae85bab543d5173809b6538330bb2dda566dc8915e30b768a6515aa3e0f3cb4641ce871ac58bd3ffb06cf1d2658b1721d67c10f4eac8013377dbf1658b1d73bcf7207c3688230f78053a86845081d04347172e75bb810fbaec400d3e5e490b903f318a628b1c55c4ba5be4f8a2ca4edd7e51621a2f33f3ba953998b99b45c77b0fc2f6b1e3baae4b4a6e1101c3302ccbf8c708dbb66d2452d111e69c332686691264361d967919199ed9f89772e5fd99adc38a8c038fa53eb504e48a8c71d0cc3d74a88099bbe9f8795be858f91cbc508b971fd6162f3e3f98c19638be602964fcc6dc0284abee96212b3caabb65088bed30608cd03b99c921b187d943f9f033f998940f470f21847044bdae1b5cbcec16dfcbf70f02a34af9a7ebbd763d5d9711e4c7d115a1d760e528c6f71fc597315e59c34e427c7edee277e5820711e2c34bc26ea26cc9566e7fd00d33caa8a59194d20d33ae74778f4644f2d5dd520712b00cc3d2e0e2ed30c5eaba9186965a6a548c316ada4b430d29a5dcb635b8783075dd48c30b4d230f98090353e5065a8aaca451f4869613cc98392f2e52eb23e6474ccc6cc20f991f3f5e194533485d21325832333232525c7585b4fc0869c132c998013233f3764a640001a1010284488868f5d4e8915a5d2132b0d004a1a191a9eb8619755406929191910912448d2ed20d35da286575dd5063c8546332692c85b80c05492087b1b6b95d1cce32e1679fd9c477c1c4be839868ad852a73e164896acc323bb044b588d1ffe0214cfe1fd9102d686a871a157111ffc9d3b345fc9fe400af10d98963547f31c800430a927ab797a166ad18cb6afc4733dac91a3b28d973599ab3d7058363b316b0de1915c1f8dda828d3d2c61c5c2ab731475077536a0d693557a82eb726e4582ed468266ef8190ac229aa0ca56daac6f4fb9989b28ae995d3d7502a5960fc4c00d79b3e0a29cbfb29aa2cd23e655cb8f0a96060ad01c48fdca88821b78bc3c281a108164258a07185972be0c866a0415b4f494f11f99db5f41545c4e654635261ad2fa617961e5f62a8a105b32484466bb5eb1a7272525ecc68a4069fb98a31c6186324e3bde96bc861c1ac9979d26b581b629471c6a6ae1f2591ffb6d426a3fa4b999e4b506a05d3f44bb65eb93e7b19f9d51870126c2775a48b99fd1bc9122680caff345256430e173327b5c5cc3e3e4c1dd162c2e7c845f8b323367416b36b18b39f399b0453838bf8772cd4202e921351b57fbf625b16d55be6a86a70128c075c248893605db688770ec65a5450f5cf96b32c8b9f2d6147a38a7d59248f286ba28559618f1ec662f297197f3a26825eb8a84d6bea6e3f08d59183ca54ab5efb8a19339ed9352b669d84cea39bd050d81c292c929955cb94966d3ad96fda97c5c19680356171fcbb1115aa3f676dc5247d9699a792e5c75b31afae57478c1ecbde9fdea5e98a27ee08635b52a6176a0d26b42857355d557f534dd6178924e7efa603f34a3abbc114e5e2a42401d3459505fe14554f184892319c0483838bc8ccd177118d1fdf45a1eadf452e42863c1532e42906073f1c3d18ac82f95c3483c9b8c882aa6742d577c687d974b237d155358669311a6f68c46c594f15736b372a32d5fce9613ecb8c19f1d139333b9d4362b597ce19ea9c1fbf35fe3f7d226ff35da93e17c358ca49229c4d57692bd90f2debe1629178752f52544e92b3aa5db6cab054871918d57f6c3a4f38e3a2fa8f2deb6994ab606e9d1ff359805895cd1379d39fbe8b3088d9186494b1f18c8d6b6c1b9b33f3fe71cb22217d276166f6339bcefb996d49d719138d79259d7d6fbb939e70af56305c5be913ed1d13bd68b60f8e2a7b10ae9b345c0f10ae2b6d5c3765b898cd94b419d40b31931ee958a81d8a56ba4930d616f15f2b6aa4a3cc867712c2f4d75fa69fa29235df54cc2b555e55f3fda60daa411735d2ab66999050ab72edb00eeba9459075ba86625ffac61d7e733f15d2ad580f179d03b9665999d7770a4c476ca86203122449a64872030ae60d3848317120c009089043143307255028a955e6f51fbfaa9e98f1e1ef088b33267a653620710249922692dc40655e37e0c0040e04588200392831e1e710a397a844498c5e628d7d54168bc562a9582c565cf115a6e9af474265dd80420a355e51d2361dfe525c24f0fd3b0c1900555f2368c40786c7e22881d7a042f5e79b0e7b8284586b712087ed8c8a7a6754d44a6c0acba2777aa777b09e9e9216648b5fd24c9b4efc8cbe2b2ad3cd0a35b3d176666fd32bb6c29499960c284383088d05ccfa389d8c13aa1d4664c311d178d3e99dedac49f6afca9ad22f1c1fd817a2cef9b8da5992f986f51cc198176c0863f13159359e00074a20c2d73bbe546f3d7aea113bcc8abd7cdf74defb26392058757d46e515b5e9ba010513ea85bd5151cfde607a7f2c8b4d8da680f58c8ab09e1e4f99b89d511d153db8e9c06fd60ccba6d50211fbc30a0327e9dff810c3e91d4ed25cafb848a45d0bd0441c5976b2303685c5c188ea2b7a92c48a936054e022ad465561069d5184fa28909a51ae917a85b176844d3122aca53ae249123bb51f3ebfb048b2dfc7592458fc0e86ba555854a34655c0b6a8a3a2cec17a16d5f5887e397aec8b1e7b2c17e9b02860792c4e11ff4c875111cb6067674895841605912a8b13b604c5cc9490594f0c907b2accfef75daf9a4aa39e4fd993aad48e5405d2fe69d46a0ab3c35aadd89528a391510602aa92bd33d795509163d33367ff3ecb683fda81995179252db9a279bde9bd6240b8d46c375218f3bb18e8ac4d3b1f6a3f3bd73b4e62a819d755a43057c55cfcc639a80b07e9c02b4625531a1bf05177c35a8bc3dd5168d6e284b1a91ec2def8974a311d2b539930aa0f4ce4d0471f7da8aef84cbb278531ff9b764d2afce64efcf0c45c5ca9780f29601b74c613ea6e3b9c98e5c56b4681d4a65b694ccda00687769843275899e32fdcba6296ec31542196ea2c8489d515ba411d37202ac0f49469d3414d4d8d891aa0ebd56a51fe5e1dd3a3faeb1cf8317585d2f8a2c6ac81050b163076dbe1c2a3c257d2d775712e68acc7dc203156b53708067c54ac08e3a3fabbb0edd0754bc0de51b9592395e99574b33c657aef76fb015399b8b86228a4ae5f78b9a08de89c3ffa6e082184ef9b3a99c1f4f037b2a95eed8d3f90ef90543655d3773195df854dd23b5bc49f7fb7ef025019b5a999289a58e2063e5d5656a86abe1b9d9e9fb6b0483caefcc6bf869ae8fa0d09fe725dcc6718c57cb01ecc53cd22cd3ce458cdb100c08710aaa43315a3d8113aa430267c5fb32968ac10578ef9a64e56a8623da892ca8a51cd8abadb02ace05325fd51313a5377d3218531bfca3c334bd3581a4b63796a55aa27303b61e651312aada8bbf5d0b501c087142a46a31575b7a7d56ca7dcc9dfabd58af349258be49c7855fce91a9c55aba68c8557a41d22c595cdcf70ad0af3727ebc0360d3f9c18d2837ca1e08ed3a06d57fa35d2f41658748b49bb58b2bac750403401bd16cd2ce49f6984fe7605cc795dfbfce7112c3613d8dc27c88267f87f5605cf834aa09b3c37a2a6f652d4c98fc2364833eac544967c5685b519be325b010a65657480d2d15abdbc60c681000edd165c30a4c5449b78ad16705fc9a0540e323c40264ac2df9325f8ed8ac187f628ccd324033d13bd90006308001e068178d58fa266aa9fea3220e9dada8740c198a721622452300000000000316000020100c0906c3214d5193e007140010688e546a4e348f46236192c4300a82180619630c3286004490518668a40800b670fde26ad013a933a844f7195ea1b5d6b325c44518c77caa310222d8b7d487d59c42bca1f1fb8e3116eae4b787592e948bb20bbc6b5ef9172c64429a03f2489f3a192985017c666b7a02041a5913e1d21f6560c68ed8c7fc78c0b74c429898a09292a58715ff58b42cdcd71971c9c3ecbed72dd69924fd20ac7f80907410ad909018cbc015464a825c8adebe5d101555c70ced19061ca52c7b91bd58b4a72f6cce8bb4cb611a75218f512785bc793d5c45fa52cf525c8cace71d194d4da2d034171b27f044df8fe0a1fab363143cf41de583e87b48ada05c3d1cc04b9d9beecbc024a15b1bd775e5bd69cce1384deb97397dc0e8cf794beb058191c0c7b24325d819e6b410ab532fea3c46e89ec70cdb40e9d832eb428216fc5f087cd70bd71c9399a211bf14ec2691d6f00080a40d31ceceebe0ef37a94e30a2fa231aca890c2b34ab04c8d1d93e2a5fe696cff83f393f67aca12e961d9cba24860f2173978abcba907b256fd8e9cc2aca24a1f83388ac2df93e2ee93ac30bf36bc325909999e52172184df6ba8e37f92dd371bf042447017527af8e1bbd5fcba3b540f236e57474d3b3259a18a96566c4c58ea664e221086eac4f77aa92ce73b212e69063a2fe8ad2d846da67032f285d526e609b148eb9569934a102dbeaaa745d9efbd60b85d50af1c50b84d7bc7c13a66060a536b15578deefeb3ff7ead59d7954835f423ca31582ece4f16c2acb23581104a31dc68f0e741d4188a8d9f5789be441d3c41ef76cefb33892cd5e87b90d623add8451c56e8d01d4c0f98da3c003ef57c753f51a68f1243271ef628f9c4d079b0c2b51f0a064db21a9b59349623dd87abb3985cff1cff07b1d8907241804092557672585b8243311e53a9773b423110df8f5f9b4d930f043c36e2e7175f3c1761715548f6b314e0061e5b88fd4352abf5e3add27a0a1db7af38e6d5a6f5d73bd261b757a9fbe187fbc7358389eb371e7479360d0cdea2f1b353335457498bf43c46f5dd6702a8db34152ebdbd600df06c6351aed2199cca94a4fbf749d3b918464a2b2b71d31dfb6cb3a5bca4dd0fc95b7cbb8b027cd2dca280afd9e2dcc1751afe8246d4d1162a429c0a5513dbb0c4582a44d16533ec774349f02bcd0b18ff4da53d924b89697b1e5161247c8a58dbb1ab861090994761f1c49a4926a981d99605a6a3fa5b33d18c2ee2e05b46c97b0f9f92f456c68032878e41aa7b52dd17609bc06c801916b4e39754a72c498879a09cdd18dee7a87068ddf4ae40e7773c20a526b34dacb1288d3846212019de29437234df4b4e94b77d32537d6e28907027918525904b064ad0c3f7dfbe68d45c7fda5f83241abba4b38ee38f29c522162fe817893b4865c038a88182998469c3b99868cd22a89dcc9e88032da8c09ffc7a4117094cd380b1060938904ccce30e38955890e1c4ba3f7ad6935020c45f75d787047866fc5c533a132205fea1378ef9a28007baa1bd781e5353fbb379720f1c5d81a743860a2c79c58229a4146a6f7430b3663959ca7c1e19e85276ca131a79970071b4dbd5a73e82b2b6038a4f044b6e677444da9d90db300e6ea086ca27585e44644e9afa6ce159ff753625755828222a31b713ddf2bce102fc52ba9ab61700c4e80693b98e427108748d940725867eaf85be2d7cb44f092b679b7fc9957b971f38cbbf320d8d01e04e89bc96523f52996dcafff62fcae754222394162fddba5ed2bcbafa8a3de50c8965a252597f020b982061952f3e889fc50a3db662eb50121722c6b7cfcac7daf0aa28906b8b18351894520e597f7485e8536fb1b1745c5493367c82edc91b4108d214a1ae402ed7771c8100283a8d2eb0885c2cf70e92b00c6d4594468bb81a0802e9fd6337568c8f756e611e4d3e108cc435626b16147c80de278d11b508c4d42bed194d8899f928afc2481347ba54baf0c32b3a4d849bb7409d078e2e7b0da518ff42a014412ca8d55aa30aeece7211dd03a212e7983a2f0742d9fe74e124ad0e0156dd6e2e860f71b31158dc6658dc05d68427701603281e998d49b830d967ec64b87da65f1c6b7e607e569e8f01f110cba0860120416602024626108bd4f08227cde21303148141b08b5b5c5ef7787317134eaf1a8f8c1777a238948cf2ec372fb16215295aaa752150ed51bb097fb411e9b103bdfc42cf91c437ee853689ccbf653b88d34f042854852f3be418535e462455bae0ea81f0ac849a8437277193c4ab2bcefca4e6ae87b2b7ce4bc5846c9e2f79c493bdd971c512c446572d6c7982a5fe3aec578632b0e4ec9b23e1b4404165e1e72c41810378c4c06c5937bf57986ecb9d1d60d606b80f9278690e204f176c9149e391310c25f5130a238291ca86038a1b1b96aa5c129a60473a5c3200eb2cec1a993866225f0b35076b9a29356c3c24b8dd0152908f4f01a1b374295cd5e40e1a9d5b0cad6109124fbde706c27a09e45deb1c0e54ce3f68b9ba3d20839a0f4f8689ae23a92e1c7d38157a9d04affe8be62a272772a53f993ec6f7dbe5e140380c0631b086d3ac910dca26daf12f2d2b155713750710c24d0a426c67274d7e9b2ae572d84045b37b036957b90a50470b45716dc746b4c0aec28d0f04bf11664e76a50632540f552d0640d418c21f967a7f63240928e463df66d5a3f4d2bc26b6320dc4cc368117960c70e4794bae4bc775bc01164c9bed7e97949f068b97200aa31dbccc1a5f46fb7cd0d849d3fa2d44fdd0c620381dc5a96bd8dfb69f4df2f3f2c422852c5c60a64554ee5c110ec71dcb3ef46caad0b3d9b2672b6925079b40b11bd8abbfd1b661e03160741b15a16646515fe4334653368cb5f0d6be008325a8785374934a93aa81021b4a55cec6d807e7924c8f0fd7d9060d76f8ae3d943188d584de3785a33988ae034587788bc4bad190ff1eb81e72105cffe7a3fb7ae17089f28cf70fa9844b4042c05d42d76531c295deb985dd863d7441bd08c944c69ae40d63fad4533bde22f18ffa5bb97c6a2cd2b50278579f456fbfd0e66bbc15632d334577033d603bf69ee566105d91382f244192b51177b4ca23f3f380d49399e2553f4044df8fdf8f587e8669e989111fd578ea7ae3c94eb26a525b5102fa5fee0a09a7fac65c3cd325c33c7a22e4a26faf8ee08462cea8ac2a4eb77ae8d8e05d54e99b576971550da2f00839565e82d4202715c8aa0ef5851597903749fa64208028bcbc488c45cca9bea4c5284eebdb2bc767c08b24fa3cc574530224c649fda582afbe13f560c35b54eb8d8ec8c43e57ba6caddf0c4066e51ad55e933b5b9de6907e37e4048108e16c2b0179b2872b117bd7cd7b6c6b2b6ee45956d2c3a24fbed0d93152e62f61fcb445b7b90d849ca4ba8803f92d94d0d5a5ed6221ce3cec6d8975543e4ced282ad1c955f252d4b6afdd7322f3aa711a727b34c019a5d762e83a8a1f92bec81cb2609eed9d5815dc44b69152d77d1cba7c8a01bce72611f357cd066f65b41f7404dd74f05aeb40a8b314841f4bb0b1d541e06d67865a1fd29eae0087f0cf6a74dc42d0761175bf940e1353ec763c4bd6e7b6e63b61f4736271b9627bb4468b89d2d1213d43043c5513c68c2d157c30c4f54af0228f6b7d8a95bfd5250793e64f6a3ed7e1d600610f80a8590f9f3a5f6bbc74d1c13556ff682e66310ddd4630501dafcdf1115f99b41ad02cc67cfea2c92e6a8496ca180dd09cba292e16ebba892a2da0be275041cc7f20dc1c345683721109991aecb29664d098c68b62c02f1776767828b4e207f3c62af875389ed627060055bc62c88af284771873bc0886ccab7fb2428d5314eff1861f5fe88fe823b84bfeb7388e4f6ea26f884509e100ee106ce1bc594b8c1e6b9cc100064ff0f7d911fa86de8caf8b5a5d8ca450da91b09fd7abf285b501b90a4c933cc9204a671633ab28d4095ecda9bc6a63c5c621e9b5bf02ea780693d418e00ebb82b13ecbe0994447003ac6110a8d72295dd936a8575362e89176e6f27b8a4ee3cf9a3e20990c1abf342e590333046b194c17efc7396fbb44485640a32ccef97a6f72460a2543612de32bf989488a0822f0ef15121b3b16cf4fa47d66b618fed064b1c9f8643e1b86e841ce49043887b1c58bf26eb24c070dc903d601a8be8fb749c2cf1b0a3495b650f89bf2f78010b258668b5f4b523150f0b061e520445d2521b7b0c49c101feb722aefbbb8102e263d829660649fc69bd23e0b4ae11d16bcc6d2819c0f0bb1f621510cf28517189ea83b1c75c31632763448db5c2784f2c177e0c18b19a9a61b2411343615af7c329881e53b98c299aa867a86482365c29fb8409e60c1cbd8b1ebd9170b4b9625ee2ee76df3d0cb28a707d54c13d09a38e5c4d3a3871b5a5e8078bd8c489779e8ebe67e79c2add4edf0a0af4195c41ef49e00dba11352a4648f5fc5c99a7a5362a07ba595fd8e91397c2a57f566d28fee1b57638c35793592630eec4bf9608283764d7c928a4be8e5b1082bca0f6924a0b39dc4b3ac4ef4a8f58868d2d1e192995645a6e88530a04dbede2fb75f9e2d15f6ef2f089bd8943eaf237c6a088e4b93a222b6563769a72782e644d60b6487026dc761c91fa3f47bddeafb6a9d6858fef2f8e09e7d58bfdf608f7c1a4573cb36aba581296f4cc2444891c89d0550c82218ddea0839ac9a1b03100e2280f89b32d4aca1fd97a0ac12a39d29da00bca9b42693f98be7364d853ddea071661578746c48644316c0c404bb2aa4a8e7980b00c8b56fa36063da9db539beb278c75c21754fda09c9ea6276bff9cfa26a7cd0dd6a18858bea8b2e5015668141a4adc82b2e0cc301b31202af14a7c425306011380e9ba8b9276b54f05cd893627ea252a578e1e5a743aaeb6582b75e454d89e1c8b9905eabf5ed036b83d0f1ff153d12084eb202797e2f70d4c91c14e80e4bed5ef4f633ada30177a2654ecc1484b5610c9163448d7fe5d54e15a309f1269666ba004c53d808b813713dda8a73245254ee0ece84a1b8bac1107000ead7ae29201c0aab8484f3c76fe28755558de28dee96f61458b40663d20935bc5fcd4489824a8432f56642bf8c88879fa7b9b9d83bd722045929113163f1053806bd0b1b073b4dff621bfa7097f1a51f35a740ad2280efb07474b541787881ff4dc0269cac6fa683f7b09c18e626d5dd615d35a4e5fe823420160b9a367e9376f7eb0da2f71318c7d3b501d472587f3a86c140b022c1b1bd9c45c8f4647f5cb63281f84b2ae0be5cb41ec8aea6c6d1d23b27482239a612f2f572ac526bb5a87c652baab6db07890e8fe50dc05a3212c72e1a40832c7310cef8581e8fb5c6893fb1c256bedb444962f64d51e2f58d81a7cf57b3ebc7e0f8a3cf84c624b1c61f53780e9822cbd25c204a4fa67584cdc600a9c02b6705094a883b55250ef1f5f68c0f11f100a07a4732f24932a06952bce1696f43a049d2b72144386e64d8ebc081ac337f43d1468da2ebdccfe1f625563a9650a18c57d266734f16c3490a408251afacd51a29b508d151ab75079454d2d73bd227390f6ff2c086554e3be3aa7b8d2a0b277a730a0c0033e2bee9768d48717ceba9a729799f67713c6827cc822771251a853e5ac72d5a48ef639aec9d9bb6ebdf55dee32889dcdffa94b549de07d3002034d04d2ccb86e1037f8442ebd441cb16aba2b18140a045e226efe481da1836993c264f1f2343910b6a1b6e25b2e32ee41ef3fbc6a6bad5e8051c16da1c29a3fbcb20a8e993af7170ed28c9e697cf0c57a648b35d28c4651c798da5d098f1a945e81239edfb07933806fa40c60b8221a63970b6e9f51303e350ca68dd025edfb643c9a26aa81ff9e5a6eb4b7a9d6c81cb158b4571aa654dfc3913b61db26fdf4bda42802a96d76c53cb05ed4225a569348a5126878233ed682651d07eb362ff8cd6c0137b7b9b31124803de8eae3bf0f7260926795420437da3490a9bdc79029abdef8a93fdbb727505f83cb7c31f4e1c17a47f07ba44a7c325777d007dbb2985324e25ee5bf5a0206813622406c1d22a145c4c61fd478f0c4d48235abb03da3b58d4cf0f30c23f6a72301392cc1f288f11d113aeae7cc97e6c692c4b17e51b246dd27fb72d5703f6e54d1b11d0f88b06b109f8d97960dc0a0c52befc5fd4856752505ebef5ec1984c10440a788892b5bb6b2f79ecb1f576cb90d5b4941bc378dc4cc78a1efaa839cdc9300c0c752690aa7e0c3357e011a1cca9026e7e465b14b481d82ae6a3c0a833f28f398d816610f17f5933612afc5121b6436b0b676c945c7f9b86ca2f6321234aecd30ffec5ef3ef5a140a88210b7db9af19ae06840e2da330d3913c44b23f81caa0e0bfa48e59f92939189cd402b0b9fc60d1254e66a0c42eed296ad5267a1ca2ff1e072fccdfa61ae76597f4b690e9e5a052c46ee577c6054cb5877869ba922d76b7c35b8ba983721b51fafee2bcea3beb0d6fe8eb31557577afb2e2e27ef37a06cb707dd1bbab69235607c7978f7dcff854cbe2c8bea3308a211851181736a5cdb757e28c5e0932e7cd58e0d4037070d5d28732921875d4a6077917f4b0860d1f4f8d63900d61fe69900bdbed88bf852edb10f8a096f7428daad223eb14115e5aac42787d07ff155742a1560b850d9cb7a87cf716f25991d0295309e2ece6929a24e77fdac97d05ebbe08fca4c945f2b9610bb11025d2d5e9b6cf1f72be5142b28e1f04b6c207cf5c13f0d6546696e79fc21abba6ca25c8a057c8c2e82aa8923570cc97abde47af18aa42aa5ffd9e5ab011fd5f04010e1b3ee80d2792bf03bb57eef51f47df717252a7c14161e6524715f6845e73e8a5b0cc0a1126785f07700f0452b653f5536b4864352226b024b0cc607a4b82a2e46773f4eec303750f71db419b6035827b0cd0e31de690b92e658bf4401e137f91dc25895887fb18044413e3a631ad5c355fe951a895e2a961caf903c7cccc692cc3e5cad449a564b8725d9aa1dfd850cbdd7d3d836930b606cfa664571523ccafddc384513d92d1b8b62231bfed7a58fee195db7a434b709803c5c08dbca74d32eb5bda6b64accbde11bde3e0ca52bb8215f9cf9573728e780b80d6404de02c68f44090ef50215e0646bf84f56c837b164f600e0e1fabef78e7166b441c18cc991f53ddb064274fd283b015463cb32e0444b1cd4dd13ca42191207ffd1e05d0c88c6c1b03cdb4e304822c8a3d2be8a999baf090209628cf7789de72a48ae7aee2f2d09d52c3517e31cc79d71928be4927b22c673777575b44c77ca4269af84f40ade8cc232dadfd58aeda224577a667b961664f47ab1f117dfce94eab4b94fe83ed7c2f63262b78cdb71704f24745a351f9bddc8c091d1e66064f0148291d5358e50f3d11ed1689b94ce169ce3ea89d5494c244a37413ba94ffd032631631219bf97169b917407b1a3fd19308d2b53ca2e306d4bbcd22a881293e158916cf1173e3086ee43d145d57a9737fec4d92e91ba4c6285224fc36b085635dd6bca5bd14ffc7a4527a44fd87744ec4085d871cd821e482b1aea489cbf8bc4aeb0bf9d40df10d7eeeebc065f1aed473f6f6900468f320550ee1a4d8eddc920da8caedf6da6ec87eb169c4285664d600153638845060e97e13ac76d716f1a170c3d75de0f84ca6fd543b2e75789d094a62bc0f91a7c080fa251524ad7d956a61940ff2b0005fdacd65a85968b364a9afcb5f1262221292c5f7e18f0f49462b08c831818b761741dfebbe2bbdefe65dd0df55b70c42fcf63d7c5ae0e1f1de28da139f4b1a1b7f756dbcb4c037c5d4aacac9ca543daa63e28978910fe4033dacc29fc940e6014200a6229abc5013d748585dcca6daab6881ba2b0f7dda09057b51af1bd579ab851c8c81130cee986a819483f8bf6fd21adb3fb9b907bb0803330646a6391b9797de705a57895f74952858bee8b5299d713912947a382527783b63ed4d1ed3af21b7403c02962f5dc18c14b50612d1b6446714812d8ab082b50e42b2ae60498b2f1a73aac6c1882f7df5ed1eeef93c2c45607b5afeacd951a64eea445acff20590236b971a372636d941ec45bfa75b417f85cdec61f4c4338037c0ee91ff1d9c39f832e72c017656b84e5670d82f96805d053c086942a206a041c49390cd491758538e52e09b741aa19acf03623288f665fa175cd7688ea723e151fb228662d473156f332aebdbe78e3f94d9f1b9cd73c8da3071a010d25483587442e84825221a85584bc2f349c88449a4db12c4e1d2462658531bbb5ced4e19ffbf3ad81f329fdbec8d290b3ff4a3dc6699ab0bb1af009f114ab00f7d3e18160e7ec60a6975644b2f387ac759b18bec276fbf82c0a30300c5487a80529bd1ee2ffa36ba8d0bf7be0e0f503a3039fb8110b4cc4845b9720fb96905d54fee5b2fe8e0d641717346604cbb4494a4a69ae82e4592f4d3862913a5f0f5aacc9b6332bba1aaef55f2fac20b5b252d2960dea331d88fd4b6a0a758a8ae8fb64054f8a8e0f076be5b187ee4db04e22784414c3ac863b1d50b79a3e9f1b0be6f13e9706de53388d4c9ed38928aed4c5a420c6b8b90ca653c9db20770d8761183b060d7f2e70b7700fe36d5ac151520f8818b946ccd1d110b7aa61c2599eb1d5a77d5127abe3e26f2e8baca81519ab3f415da37ec91681ab9e8054bf310216022c8ba03d17a88fe93ebdfaf97c49ff8f34eb493fbaa73879d37527e4b368eff1048d44e7a76ad8c5e25225477b65d226d1f3da5c0af02dc1319980c0187ad7b3e156a3d19fd92300a73f336a35a7b7d935e943a26cf3f7d8c4fcd0dca909237de0beefdbbef769dff89e8bc0962e2ab7d04a669905de6d30676040be55a4c302f2e55e0400425897f48346624e6029fdcddcfc5ab986ae6774bf7e03e1410bcf8931d1d4d9eb51d65cb919e6a5a571185116b3aba8d7594ce16920e7950a90d9ea361a7538714716b146c7ea3d84a72a68520e7888d0761f5c93878062f75bf05161e6c5a1e03526bb08e5e54ed8a09318d071bd0bed455a582109b8c5b74c398e62349dbc3451733a990d0d1ec715b85131b4d108e59809488e2e96b7b24aa24b8fcc1e46e9c089306e048ec3bfbf9fdbd132c7fcdd596356ecda0c3c7d02b79d8ca85348238d7f457a9825a9df114c58d892b1c2ae9cf52d44849cb417b45c311fd9986634def2aa97c07b21b80356529e4c4399b2c9b3add7dff6957ac4185699d297dff4a968a5ba152415e5c108526808afeed0f8170b4c442466b788754bf918beede640e0f9ba0a1675484f53395f4a5512070021557611211307849b187bb01f8db004d06e20b7e7849bb6fb25f292f7abef3ad18265b32b93db3c8ee8cf220ff26cd446b8dfead278ebcaf34ed5be75afb4d80882ef3fd4258dc44ce17d42e022dbf0f3942ee7e5647310c2353f8f862af5c6b686f9eaac2097da3a3d481fcfecefe4dc5373356fa8e469c13e298dfd7e5e21ad3e8e198d9d0f9702d30c6ae0ec505c705cdc71015e8147b7fcda9ee43de13c367af7cff184eb1276c32c6f0498891ea5f28c359931de286fd72f6e6e2cc26436b1213a1f9fda836f9240b545971ea583b78c608c2eb2281ef14fcf014918bc6b83ff09bd749e777a9f065d509ef94040b6c3f2bffc4ca2db8d500f156fe8107801029cd73aaee31f5c306755a1fb0126665a19350b63e63e0d2d17a283558c18fb5ccfc414f7615e5aab2e993d2206119e8c08fa26a4b587d3739b485d989aa78d3d1a800b7a380d58fc8f0699a32ef1a80f4f549f000701f3bf194626c41d77a8177d089c5d3b92c99f6a3a60b388f5ef6372aaa372fcf9c51c77b76b0a48967fdbd70287f392f7dd696f41bbf509c30537d94db37f0bbb56e542b4e30ebda098f0d23c09a2409bc9392a06e5b597cf23a760b7a006cb838423a02181daa8e0f623522912e5041da1f1030b04cf915c378221e666aa0d3caecd0581c339edda1a7c002c7e2222ca878fb5cf621937d7b45bd9eeb3bcbb81f2a04d36741e81aaa605818a1b006dd25d7eff3a15100ad7bb2358dba466b7a7021072fc592f7ae47dc92e24e7028872d8412f03fe99a0c65478b5a4cb5befcf8a204607fd2dc779075d009a0aed0ab607d8975d2755228a013515700872608db1a2bf4cbb5e86587a521865c4463a654e014f82fae023fd6370b0745e72f8122f11a3ad2449e13e497b020ae2b70f496c2ef59c65e652adfcd17febffe4a1992b330b9765ba958e83287cbe10fb043b3852a31fcd085ebc05715ba175813be416c1a8a2e25a8ee51d384fadb32bc208ed3e94172da469599d46ec7effd97c5fb26df305aad971954af6e7edddfc979ddf07b6d5e6ff07cc7e2bfa936f76d9c397094f4aff791ffd0ac0c8c318b9501ed782e948c88521ce1f17aa7d272e2cb965acd01abd5aceba112e145707dd37a0cda156c944bb5a67b8da48747ae028e51b977b388e2809859ca62ca65d29b1f5bf5be23c6d21ac725984c0de730c55b3969df7c2051b2711b40686603c0f9f0707c1394ecd12f7f241bafc014f6989c3694acdb217abbb7bfd69d3c06238d1fd3cbc69982b255a166bd6246b21ad8463d472668f2572d567c6040b0e3ace118b3f0025102e84187831a06c5c5c9039aada12a4813e678a8a145d62008e3434bacfe1681646d576e2bff2ee8a3d7235db5752acb0845dc41ebeb6372c8a88a1b41b781a0d2ea934756a2756be148d8928d472b6a30cf9f1ac3adaed3f5aecf9bb1bb2dc8303d2bd27fde9f420d91a89f8abd31cc0dd7fa21ba2bd91d74b6c3a0faabfa1beaccb06ca85c168be9af7b47f47eb2d609522e5a67d8d48d4e98a36aa529c9150aefa875b278ac857e1b4c2e316802e8e91128f18a97ee506ea4242f54bf31f9ef902399756f974338df0c7da672053279480b2b0bef8e13151c6854c641af96adb6631a35d2b8a269de5696bbb506dfb07de89b2945e432661bf85a16ed659ae63ee3915d591b6ae4b2a4baea634c79e530391fae50f00537803ee2da9e0683a4394ad4f4a41fcd2046c3c2a508b1af27de4e9aae2ccf8bb8d5a00f00bbc71dc201706ae9973b1ff95779c0dce699a18aa2c65b9ac9bef03441cb6a9ea044bbd39b4ca236be5a4e23fa62d8e078948796642c60efaf50e46839bfddfe90a221c7134cca87dba3db3090b3e21b21c1d4051a9b335587eeaa058a4cb922b18541d1879b5005703319dff621f85607514c9bc2357be27d23418c8cb940c31302272a71ea07eec15ace78e279a14217c8f95aeeab7d04f401585488d7965a23e4852c722c83aba7ce2a6200f40802fd5b44ef73942ad2db56327cbd147d2330902ab6bcdf336403da74fb1fd9e13d97b5110ed6805c04435f33cc4ffd82adb81a1d1b01580a2ed36ebb98960a2d851110d1a3d71435a67d9f62dce26858e1cfbfc5dc44ce2a996f5cff910b45c614e8211c308dc01f75e6ba2744586aa8acca52e9b04673f192f64e675332283d383b118669a76e2ee29d5037a57053e491825669683eb308874ddad7847043b4cbc3278bbb1ba25239939d1654b7ce144e73f709718c19ed25bf118d230eeffd8b54cd6426ae5a656998b20f9c3e5ece3481f5330300c8048b7d47479d8673538ac2ed2ed090fd8c76ca7e624f49753f15be87e410fe9d3483d249257d9979f0e62b52caf5d727077e0f90ba40d5eb82d88a5e818ddeee6c7cf8be25a8c0e7af850afe8664becaa423419948b98d96229ea7a5315a57a3c7edde32426aa5ee369e21b88eb1c43e1052c4628c6bee938407b98223415fa37c8059951203955841a6707a9c9924c07d4dc6161a8f5d1931d1fcc2ed973856aed1d19f9f209202b9d858c328f5b1812047660ef307e092b8c9aa78142e224b426c01734d07e1210fa211167bdfd82884dadc2a4dfe9b53029637320f5753a69df31e131727ce58f3a76ec104dae204fb8c39a1c658d6e468d05941c860c6c55cd9d277959807053eab70ae7e233dba7713199fdc373b5ccf6e9b87866ffd9b82cb3fbe05c3eb37db2ce4581de823793022af980b6e71e90495ed5792e094fe69a5626d47d7cb479506a00957b167b0e9715c9d1dc03dc39410fe409a03968a3d95b83660d296e64bc9888a368cd3bd51f26b28f4fc8c3ae832d1d1bed4a1cdc947447a23a019b0cd2dd9771868d0fe2aa7cc4a7d4f5318adb08c13856ec20936305514d2b61f11059d2912f3f6efc3504ad6b73e794549988c1f38bdf8c5b0281984d4b07d4b2c6b00f29e59a9f0be7b859fe91ed4282ad691638c0a563ad9d62619b41d3012ae5f17147ef8590102c2071dd6020065bb9aad5c7d1bd8d1b25cf0e0da168af5bfcdefc8892f5b9aa38c4beea054461999ad54417524dbf9afb253891efa4f396d15807d864c734e9685449c3b1332d97d0e424fba30f11f446a3997213761e0433f9093f3232428b1c3b570a8bd2703cc56d22a2c383a77c527da454a8a0fc138eb0b2db4a1a73a934066a6d639ac869acc6216fb44c63534d39bc1691a194b56f2671bf02349366e4461b70c496ac4d2a0e00c1d835f481e1e14bd7da4103e213a0970f51257562e1d9f828a7e16643019f1abc0cbc26c44847bed957fb6311154bd05123f4f843bdff5aa2da7cdcbfe9821bd2d2eb914af98e2d4988308e925d6e3eee734f85fb0e149d1abfe02606b98e5ddccdbc07ada4769605a50c81a7f0ee199950a122e45b720ae52967d58ba2a26aec7dd273174b8b736a9a95268fbc5b9debb3a382f706db34c627d80005b2a31aae70722604dab3f6b97baeda38529d528518634f413d8a34501fcf4049d5cd6708f545d81163f6f338c9552fcf78ba7d3850d6ae33ca7fc44f308e077b65d3224930ccb3079af353704b515f21aa05f40570f118cac3b45422f457c771174eccf0b6b95fd0accf1182003029bca995e941be133cfe29f19c2773ae85e7b65277b00d003f801da3c96d892602e85595366583861508ff7433456014d6e0548ec7a84ae766327118dcf42ffffa8402bf85370be6e129b91cd861517c520b9642cae2b01df41e893a16a44f72a45233f3faf301690bd4b0dbf4d52b3901163b4d5ab637f8d630647cd554625faa9b08f102a5ab9263a883b496f41dca062fed8dcae1a3b18fe97aafafd569954b310928d684c927c8b707c3ff54be411f17edabcff5d390c43d51ca20c95f9efc83d7826e0679967b699de7207dce8ce0d5246011befbac99e4154b9fdd2ee138c838ca58a03550edbc8d165c0202afb8b14000341030eeeac260ffc4aedd071652bc7f34b18164e3d07e25458b872f3d8862d7219db2cc1beccdfefc8ce304b0edc2d9cb8e170e9a2d55d203b776981e2bb3d4c8fba9bcaddc1345bdf6521cf0d4b96508d15bfa3afec491905a71827353a9fe5237d2eaf5c1c3619e03126fed63eb076b491bdac3f44914375810093badec9857a244f7636123ef56f617965643a024c6178c0423f460381f8f6bcab9101d546a1d18453d531465c734d0aa02a6ac5fbaec0788580f75808ee2ef1606dd9275b9112056ec675cab4532bbad8a2cf562b6e2101a754b04c82e71b271c1220250c2dd948d8474530b1e2fbc37df370f154af96bccf146ae1857e84a0b36a2e74f8a40d2933079ec0dc3c559ef4ecf0dc5d2004429f28bcb593c5d9f053335bf7cda54bb49ad29805eada80fa6f0fe75750a01cbec1878d37718310bc88f6528b73d20e2379d9b8823655bad535465f34955d0cd61ba9931e16cdc508a3cfd8e1e47d3c1fc214ad1fe4efbe591e748e725450c1cac6b19d21b028a90ba49912a7b4a43fcfef3f213b62c89c470f4d85c306172c0208fbf0e787782904c7dd286dc51eb1ff6d4e36db0b0dcce3d1aea8388c2beef9b8eb420f0c14821758ae176dfbd1c10e0393e081924990846ac55154f085866835a0691e45d052cafe48907cef97d733e7c0c1bbfc939b3ccbd885971a56c575990098c9b073dec219bc85e426d2e2db6572d08a2819296fd8d994671c1e429629161f41b30512f27c941f44b6c2292564ec60df303294d0c495df0077fe444cb8e71cd079647ff6329b682a91e946112ac1432723c21ab77765b088931c6a8d3c529a6c12ec111ac6151c0065d2024a20c96be5532fc577574c7a68f534a2cdf2b3e78eb703809f3b3e4634a59587b3fa2826e0c8feb73c2fcc7a471c811134cd2074c0e123f54dc2980eeee223f1a06774843d98d7f2902a9984922e5c30116de4512d1bb41b339812d0b9f9cd2a55518610f3e6afd72a4b6c3416f5e9713b12987868f1d6b4292b2ef06509bfdaf5a00dbde42dde4f6d1bde5f80a4da1d3c90002d8f6abc73f2100345f094e6c09bd3baccf7f0109c2405fcb4eed93851216b91412c88904b696978548937af567cee69ab16502e09521b5e271230450c0caa0af413942ecbd41ab583a5da0a097712a796f2cef075c5927275b972412e27303d92d9d122b617220a9c6e06a7c2b412e9c113cf8f1a425e54ba0097de8860653d4f2846f1828bd6231f5e8136bb2d72b8b5d9bbe1041120af1acff023a9c14fff006b7df174234c4305872c975e9787d562705001bd06b1e5864832f45219c58c368635cc6e32d4d8dc48c94dae5b07f5e62b9fcf9046a29776fcc8e378caf995de3fcec92558a1bf1b9bc9914ca8150a2335294d677546d7f50ce076af69141fbc6b035b1450c08916b360d9f9862f1f4d65b2d5e7083d4e50d10a40922931a28eb3e8045a42af31672d2dffa512dff6b2f792c84d086afab61e149746e634b02e0107c346a1ca462f0825b3123b22ee7131adea1c0621b6caa7247d03d5460172610e2166f432483078315510183374ed0a3cf690c8e5c8662a89915ccdadea3c10bc1112be3fc290b7b07bce770f9db4ab8e15d22436e6406fc1aeb7336b6803d1e39cee287ee6a6108684884c17a0363de8f6859e3922da5e8450363f3bf90e88fdd656208b35a2e67a084b63706b3444ce2d3c326ff89d6e3ce9ce709f0f4bdd820b3f0cbe53003431397c48a07ab7da137245e040d896e7afde0c36c7b172a4a921714aea116e60a1e3ce5580d63b49337d55d7be9b200e56aea004308d58fc2d00b1f4ff05dd8acb84eb9c508c35a4952965ea8a108af53f1713696134312c1654c5e8649037039002873cec52fc221181ce60823e4b3fa4508ca50d85320f0d27893899c56932b7f922472003a91703acc8ab4aac7a96c9acb2530c2981a55f1bf438db207e199f7a7c94d774a9793cb545fc97b515075f352880e5d2c6a1d1c12fd266fcc906fe2d85ed54a0c72d42335984f0623c0978a66507545e5961ffe44558c733804c04be3f4aa96251d9d5c9c4e3b279fea8686022283bd0c02cf80abe688824944ef0f659582bfa3c7d2564ccc11a5e14fa662dd45c51ce9e16c411bc74ccb144244510985e81b6d295070c25ada99006252c676e250cb1be0140eb79e71b96108bc09b0a58ed0fb32e6fa53916198d75e31a818ebc62624c768e9cb7fa953fde158f239c1d6e1f51caf65890479741908b06023df3592f3061de59cf0777b708f401124f23ee7bf50ad5925a9643f4d158b4e7b5daac971639c2c840a0a8d523a9302590c71b7b7b8d279e80af63a6490e5d14279f9eeedf9900303ee34248002ae3f1e4c289a9de72560384c2f8db49e52299cb06481b575994dd8ec9c0d44fa7466bcb2b825e53af5dab41ea15e5c89680c0d88a928c64ef1308912636a159f68614e2ef7d9095a5f06b5d919eb7358375f576071c39b33e0f8962638f02d346f7cd19d5217e17464001e0b1fc1c686ec5b4ca911f46c65a9e7636f58f5f7ec008925c779383dadf2555e7e14c8c45d6b408232e742f8aa1c2ec91b12c69159b59a33467da8dbcb453744a12d82420817944942130276acee3ff7f8bd37af31f6cddf4fb27858a478a4e57d8c0f865baa28a34e9f5335783e019ce192555bfd74ad65a3e267a234fc65a615407de6df7f787473dd74120d22cfcc2cf9108f5eaa0d64d45b5add3960ea3d3e8b4127522b44978832943245cee012989098504438abdfae351748e929bf5fcfe0c8808eac5f03b6fc95ca095b447f3e33fdd874d9a57cd21554686d2c47d85cbd1b7c57a8bae19ef7b297382f1c7a03155a68d350f35317efe270d51e04fa53fb156268a9ad3f05bceab729e9f8934dea9f60695bb7a6d55fff1f2d27aeee4d1dfbfa7f74f025d9a50ef887ce542d908313fda6d265c39001f3d795d46900ce973f28e52e911b4cde5eb573a5f56a550ff37bb17f9d1b0202d258cf8399d62ada731ff8c992452a4c80618f4608fd5d17cceb626a2abf23900121c72db98eb8b751b568ddadccdc63b418930b69252357fc3339796b702a6da07d22e1431212fe76cbedf8812ba40828ed6b0f88e763a9e86e15cd71020e632d43fb267d2e010c888c1e3d1c25f9d6e8887a02c5ae7fce2616af554b29761f0345b3cb8b2df01e69c973fb879e7c18a5b0097f9d6f8d9c461ccf6a017a42513fbfe41380ad1c5601c13f7a3198a0233f182a81070652bae0f4b0815600111f5a3e098e050a00a2459a038eed2d387de6f1c3fc1c24ecf6d5380e02235b9715eeac3cb178f924233993519db98b84c939e5cd63c02f6539766f3caa98ad3dd110effb81afb2ced9fd6b19f555c8588d89e4d76b960debef2be83e930a58a36b459c57b3bd268e896661db10e587e4c0bb933e210d228da0da6193693af264602727aacea3b693212d3c640bc3658f93cae26be37daca58815dab0c797d53a61a9d39ba53994329c114fa91003b92b202914f81824542aa46303725e3d8ecfb73b0cbc5a4b845bf8b96ae95e173ac4137907f6e410b5d719e5930ab289036ab278389f0d2b0e37955efa4025d23b02c6a0a50321baa6aac9b5d1b9843729185c0c4722b07463340daa00ae02a165341f8bf2965384922ebd0118ea7e3411a543397b9554542b33837ff835d8951c207accad8b64fef661faf05c51b9ce9be8e0223215f3662bb3fa6101bb28070549f120407421fd12380b05eff55faf0b883520934fda36e6a22328f49f0574f91e419467ee920e11f7320efea65b678d8a320cee6693ca0734f04add24dd94cb3cc698693204683ca26336cf28d69c1eab2dfb7138c63449a165559e8aa0e6e8ffb306a15b133e0b951941c24acea5966b9f4219a55407b7414949525d158af5058912159acc632f1db324fb3a272eaeed4a30a809dd8479e27b9a87eb64dffdaf1f6de45f81ceb8d3edf24daf29665da8528a3d829df7106bc74b4bf46839256e47727e02f5d24e62b12198e505edefc25a318639fa527732aaa98a561bf0d5ddcd9967c08e10b2ba134022fd30ae2dd0c2a64793a36354da7b5b24dcb9bce83eb681b57c411387d04dda9884a6b59d098742043d0afa911a7c0f014991428e4f88000d002cfaf4d46307bb3bf0633c00161f81868e7c28fa662658da6907c1232c39311e884d166fce46a086301e084ea81854c7a6a3acfb68be68b6a6256e9f22c0bedbd080270e2df591300605a1dc70f940953c36fd05931ee9f36580cc530df7d11e80ff1866f900b7030445b308608b53fa1a572bd888dad59fda43d849e2f7e362fe82e28ba723d3fc6c6f93906ce85115a3ce545accc12b695fd864245d07ffb480c8540690aa0120b87199fafb5850bc1fa6df1f878a16e2793ff0106b0cb818079a5cb4b3e6fa709f9d228e1ae6e5023d783ce942fb991577d27e3a56d22f82814ae8b2105cf8d4d416a28bd515babe5014bce55f62d1a2cdc0893a2d5ff4a12101a0a6193445df2202aeb12e992819bbcdaccfe2c6433ab9bad2dc14347003f40049c5f865a14022022095b0432e70af0646808925d0d65f3835e3717e9d617e4ce54bce9d8d8443f80b8e64875c59b5550401a15ee6f36232ce14029e12872e31217d3969e6e50452d9e51a0eb981bcdd552e60a769736e9fecc20d4c6aedf61c70412ecdc4590cc37b4915861571e82945c3ebdd2d53f5bd2c20bdab24d8a920f4cde18051203c301322a47f555f08dc675f097cd1a18e66145b0ba504a0c26bc0453fd885d42141cabe7805d74b7044d231d1e5fac7e2c8fd510c72bd2f9253edec04a18eaa591d830d2f778a8920de9218297638d1e48f8231b74bf6952185c46fe19ece0bf7b55e64f91c406b7242a79b5a8513d5b9a697efee0ff7570f728e2aba216d86512f9711270f26149c9c0008d6e7a379991c9e360ab8352ccbd98f53da3e5883d7f541e9a5571071fe04d48622ef2a1c3b191b33a05a1840f099a2cc133146eef2583691078a23dc9252ef82bf188090248be7058e4e7c0d83b70a8a2480d4ff609cfa2d2d03435c413259484ec04cf9bf21e814c03ebe051ee1fc333a24cfdac0fce6f5a9bee32762550879648b57e5e60ee4f6aeee696a36cf7541b80160c349ec362c0928d4519f17b77bbc35a39872b5cb87943a1cdd0aa3121dcd85bdd7d85f218c0cbfe0c2e29532bac212f8e08c9ad1499e1456c61ac7b1b2afc40de316526c4a6af0ece956cbce9f39cd1ee598a2345d6e0fc1917f432d690b6d5806e72088a60f5bb67d2ba871623d9078b31fd07aba1301d6282554edf02308cec872a53f8c48b1b2198c03127d97783d5a8e3ac64230a605f1c4f99e1ec0a938d0b08d5454558a10d088dc2e95d04bc020ffb9f96206c6ad03bc659ca1c8caff1916817c409a9d0229e74ba4404a21d09c7eed0c0c9a29724c9b525ec762151ab518fa8737ec9c581c6e1ce0b3cb6558902d8ea5e36019dda997e5e1a0b3697e3980ebf96615d7c154f42e5002cafbce74baa3501572f270a04d30421319d435faaec2091fe5920e2256ad2233122272484019c8ad5f4ee3faf789461e74a876db837c79899a6bd0b3615689f96e98e0bdb39954c3f46ecaf8cf3a78c83640e0c8cccc2da2c89a9480c0d90534e67ca0116342ceeac8c4ee0b37fc075cc9d676b33c1b5ec1b27bf21a9c202820149e04867e4a155c8271782318ff524ab7207e3e1c83fc0f3e7d0f9be003d00baca9fce37ca4486d08d2fe02fd7779c3d7e606d2af01bd0f3a40a8cebfd657a0a1bd09e2f60d4bf98d33bdc6d392e6225ea671e1658fcc4f1c495a24070dbf984354f13a3807a6861e46bdf9c82d310fa452c60a3a3889060b861b00641ddcf41ee4bb54f7a380acd6ce11895b9b08e6c99b02777b38d3bf78b112cf00404ee2325d5837a3a2a1ac45890db16345a083cf71774314a1ad4529af211bce4ea719a4da7127807fb5fafc19301b4ebc26cc52a3cdfb360de2a5f4a6fca218d52f03ca19ba86246200d98b1a0a9fcba7839abe74bf464ab59d05828a60aa0812c304faffa16c62e224ff297cee4d60fcc0384485d0c36cdcd1c007349e75249a044ca60e1a28eb0bc79224a0f8c0e5129cc61328d43b175cf59fbf9b052305d5016d3cf8975179faa04c66939160237da2c23c017f890a6f4e3839d0c19c3262f077945913560c69d3a46a313a5dc85c1003245513a978d89e3daa545ddd0777a4375b8a4b67514f16aedd2e96ebb9030af67d5aa5b8b84ea03dff4899f4a30726d2203ff4f805cd7e2e0724cc774360c33936c1332347ee2b249f67eeef9b80438a5421099a006b024548b2e56711b38dc50565b6e613908faf450754600f14059cbe5643d250d4a109a8339915ce54dcf99ba91e6459e14ac52800f134a8f3591d207b021a73e9cb239b0991280e66918e5e2eb873ec30bfcfce045973214507822f9add04f92d9442ecc150e0336bfb9461c12b4c729b591b2841660b8cefc076351411ec8714a70a225ce47e411970f685ae7f68372981b839b3674142373101fbb453a546791bb33fec69f98f580031e2b37f2710a696b91d6bb896ed4724d700e6cd10176df0b0870e2f2e2a9529daec81d9f80b47e34ae6b30b18bb7b666b7ed8789378db4b8ddd2de1c508bd0b90c06dedcbb16e5b6ac01c132a28e340462bdf3247d7119030e4c3d57cf6b14d39ce83c134d00651254c7b4ad224245bf8fa4bf5bf205d43e4b9d97981dc1d12210c3d2b4bb405963834f1716e9849e8f4f7f01af37509090c48d8542a4c730a9847a92ede4c0681f104addbe4b2deb2d178d06c9e77933689daa22c84e11cd0659714be37d70d66584847734f2d19ac822b90185404ce60631be331d0a1bb0df3c1a79316e4534677a79cd5ed38cd0a64c66d670f88ac0d2b999a2d07d7254c81b22d634e82a135fafe6d2eec1b3c07b4f103c5112d9e05e0128297914050ca43ea397fbe70fbff8f69e64f3d9e55b80f237b9d16b59dbce41658ecd5c86dde2f611326a15c33da609f8c69534a67ef02fe7782a3262b00d5126db928a1868c046e74f5a57342cc915d3cd41d79738446e479c2717d5be420c5aafae9fb7d9933119ce5ddc10e840e4ad7da988a4ca05f24dd27a3249910c726e882864006ee4274b3ac03cb38c6d15b03026985218361f457fc2a3518f35eecc0e2604ccd36423aabd8d8ae3e9d65a06d6bb3ba8f458f2fbb18640af03df86236620083e8c57c1dfcd2ca2ef31ea90fb87ddc7596a0a54a5dc612498b08cfef1d1068cd433f58bf7e508c0746c5a443f3c795bbc2e417da818405a0e8f4f34fe60fe8b6f8130852a4e01a678386654411ee80a4610677503636c6b1471e99b7c7b68346cc0b888c744d443e675102c4f14d86b0ea6b006f9e1aef2dc064c030609e163bbc5b8f081596ffb7cac65414f6d51fe12a356914493ed95f65925be377e12a5a6cefe8233ee8ddbbf986158ffb6e85787379ba073c561067bbb70619e9c3fd7aec7ffd5630e52f90d800ecbce892a8e8443a7ff312bf0130d96251417ebfe02f74a258df1ff679816c5864956e3082872ae85b3a9e1fc6b302a4e2d7ffff48a283fb59c1edffb059e14c6e03b627a39c0bc7b3299c7a1af2774cf7bd20a7aabd09a05e60a928c639baac10a9635ac3cfbb247da74176e54290bf76f23c51c44c05641a1805839e2db8fba4e358ec830f3152de34a6b743fea15f24d08bf977faab8a86d679b8da3de01773d6c772f72ecbf7ebe5bcefc96af156820f77b5eb41b468f73b142f3d624e61a636ad1b292a3ba71a5762ba9e2791124d480c39640e8a37926477a1108fc1d97910778034c6b3494a32dfc9500cf8e107634c8c56ba877cbf5fbf3f35b6600b41e0484b6518bb2509ae05e0a1c84894093626ec30403ac799120158d86b0046a8d090e95b6ccb6b5d203fbf8a4032178367ab5554dad422fad458734d45802afab03d8eee09d915eace5fa061e6f12bef22eddfff25ffeedf8695dd9d79b6afac7ce391d81c9f867e22ed8c9dfd3197805002643f6dac4929fe4e85ad815643f0c7902131206aef435acef9eb38dea71de202c4d1888fac347f42b27ce5be64897ead0a956c42837650711d3c86bf1e7480d212907608eac003de06280466e5fbfdff30903205d32218abdfa3be95082ed800160590b1fe8965d6eb9e006e0620560095153cdce0da0e2eb7fe691bd0ff63fe99cecc7ff046623fda5da39b2044e6c360af09f808a1f435ea28e21c8b136c9a343cfd02fca1c8eabaa4c433a0776e4264b1fd1c605044fa802057140a05d8e19d353956e2777c80201eb3d51090651af092f4827dbf80de6d0ab1c08eada70f8161cc6c9b32b2bf973c936f93d5e90a1e50e331bef19347cb002fe5262072e709b947395f1f852fc8a4ee515781bac5d213368fa33fbdbdcd5fd60b2d433db1bf54c816134a9545300fd83c7cc418c4b289659f0d3151faad065c69bddc92581f73f18c4c2c2780d3bc6bddddc15316940b8b13d0ffbdc9988f6f70fdf5cbcac91d4cf30a14b8c9d5010e4998afd29b6e2a1ae92ec4f5b32993f5c1539306fcbb92157ab61b7b0e97357b559f8cb84228efda6de228bfe41db67099f8ae00a756f2b33989305d6503d419eb4bd62f6ea1a4b7473a3b82f7b3d5975be80886562db6fcb94b12cd06b44e81f142fd9c96e2fa5ecdcd017a75bb74bcc46822da354312b76f61f9d0d664b1b7066141635725120bcb09906879cd023e5d7326d47fa224e5584d09519665b80a2443312f523be5c189d9887d7b63195c6509a1257e01e24301e9167a6f4fa0e4701690980a64c498500bbc2c62565f370167dff3d677341fc247eba63a6e3e0d30e923c41deb375093b061e267db414aec1fb171ba481ec19d1d2479869f01b58b3ec684bbaaa0f7d79c1c9ec1b4c191a9e4aab8417fd6ceb721a0955b5a22feb22803b93e197359a880c1510c35a0982e0c2d95acc437d338999677caf45737100f106309124e50623622e4c417047895a292cfa027467e4cc066c4bd6378723e03b33ab359d29987edc5390621a59cbfb40f5a59b04cbf03029da20be6165d74d3fc5b9ffb356086fd7f6d646e60b331f1a34545bd5a31f7fefbd128389f12e6c911c0044aebfe49de5b2d02127f9a9e8151c7af02e3e02c1c04e359e81f57d4465053820bfa6c7ea8d96f5bf695be491082011a9640ef58702458ae9dcdbcc659dbe0fe1467d431bbc112fa808746b26b528c8bbb18f3ee90310784e0a8df005cf4fd1ae63bab52854866b00ec63614fa115c88560d7892527646c192b07631db5e6b24c9b8edbb57b9be64e7d2e5959f2db740b855e7ca70b6b0f5ba42a292abfd57c5d3921d9296d182b8878e46b8c254d788e11221d1d71dc77df5c5afc1269d31b6dd2b97d862baa5f3d4b35cc837d1eef76fbe7efcf5b1aa8f953cefcf2509211512f22733541f81be7b49ff0e3a00780bf7c163aa125e8be7f00a92668f5d3dea6fce477d7a3feadf05a4beee82d4d3d229e8971db941434ff44a3068b0c0a01e6b8b484504d8f75d27c41a35706d297557946773165f9ff1bb75f58695ddea2068760aaee0a00d7968bb0e99500d382850c377def2da9c92b1f2a9e4006ee3ab88892fdc5a48ad9a6225969a90201f10f21de56c392aa5856463949d7ced3b70b1af29499f9200c361f48b6dff9d5f11451ebc04a4a648f23818ce15124a5f07e20be1f59445cac0b5925f9187810110506160a7b8670201d22b9c12fc90788d8a825c3fdb3bae67104db1946d205e2cdf94ffa581b7deea9bdb548073f0fea3646f28881b21fdcb190b887714c90f41171154bcc2914a9050f786fd5ebe83d1f3018ef8144779ef299f4b04939c1040913066bc812ec41347645474b8d1308ad85de97bffe0001919396954300e85f136323d20212080009bed074f8253831111ab20fe2282e0a846164837080c28ea833c588c9bce1d9d912c0ab8b9272cbf35da42f2bb9d8d8829bb1605708423ea155cd3b03fbf81f6f0f56e7c9d93ffc9a18500481a94511529ed9ce9c6574f210d90e3374d24ea248070615cfc096156ee0705b91307addecf7776a1f462b28a6cff91a2f5d07c22020f385ba80a943dac2fd40db84e4f85724afe864bfa03eef6b7b9e41f7235431e8a4d65bfd630795989ce7d3631872c157538bb43af041c542db68226809382253c79bfcb826486d25ae40b050d62177236f353ad130377cbabcbc2e48cab8605529fdabec64e64556dac6488e73e09d6d59aff91a8a3ccc1b84fe77ade5ac8dfd96a6b83bdc48be1e0a6ea05e4d94d1304c605beffc5901256209a554d3a45e2a4f8ab782351f81ff61b1f9197885c94932f545a860bbbf712fa32f5d3cb8e40fbbac3a970d0058002e8e2e3e187f7abda78c6e3968dca6edfb606baeee5f4586bd5f23ffd46c8124b08217bcbbd03ae12f6111213abd5cdea38b0af563856395636c771e458d51c395698b73a8ed3158ed58a8fc59c0fbdd38acdd4db809e39850cd3c2fab479bc393dbda9dc85b0396414cdb97aa3ea37953b4ded6e6c39a28f8e33e76cfe8351f4de71f8a6c6fe4d264ae94b75728a1ed2b37450216cec1522e3d920d8199be96a107af668ccf9ca3480e634f65e5521a366ec7d73aa436e7da739e4168fdb441b7b371e1b8dbddf3773950a39c5bd5471245763789e0d42cf31677ae6b89da67486d4fc160cec3477afde581bd05d9cc12ef796cfd4db44f34e50dfec9c1522d32c44a6e9b373c58e23639274f618f536a0331c2beae5bcd8f8b1bcd4d9194b26131303a3d22495f6c454be0c7a7e8c4c77a73ecca2d7f4ad62918ef676f74ebd4a7b98f0c5fcd29e248c9214880382a67a63c73c7a3dccc41854cb5022b68c0a9b636a6cda73a46bef905bdaf3bc4f6e51ef9b97e3d9f8c59ea64034880ab9783a062882a8788ec2ac2d62b42ca3c6868d9299c1838ce588b8202ee8498c2f21f4e586b8209adbb4eaa65b9d46953733e3d99c2b0c42f31c1e57ab95e4ec25fd8657e795bd423ad2d45871a44a485fd285b4740ea7a977a773780e8f79f472667014e801399c3a016afa1b3f6d731ca79097f04126a0a1a76d1ebd9c2cb68edbd4d8977f294df1dd249a88ec20386e73e3ac9b6f4f0549a2a5e9bbd3733ea81e6784e84e7576da7b4b73cc31c79e3df14f3ecccc501fbcf375bcf30e47afaa974fba016eee1d809e7b4c8da775f5c3ea428488f634f3783ef7ae9e66eebd531df269c6f64073d57568aca7facc755476c6fb4e7b962de5bffc887df3ee2b5bbac1d7d9c71c7a42dc9cda2037f76c901ba7425a3a2ba4a56fec641476eec6494fd53b9bf5ccfb2187d3639e0f37729cda0b19c5fa6627a358389ee3d30b02c76dce5e10386e738aa3de26da86e3ea64946c9b53ac8b4077d226884bcf3ddac9a84b44360e7b8d6c5de7e564b7a96c13046767676f8e13916da3c3de9db6b13a9e43eab80e1d36ae1e6d9ee3d4a6e6a814c88acfe69702d9b0139a6747c30b7a4270bd7aacd96fea15d23752c73bef38ee717146759dee2adbd233e77064ac37f77c90bd8a8de35c24719cb3f76b1cd7c1fde44377ef3a38eeedd073d7c161af90162e422f88d82b1b2463cf87ccde9d96375c210e0741ead571383e2087d39c4276f241269cc1a8691e69bd2d4dcfd52ba4394e4266dd1c323df4ac772ea257d9197b37cfb2e5eabdf9cbbbba44ecd5d9f3817b6583c4d33c7a3fe4709ad3bc87aeebe8bdb144b885604d739953ee5695e6d21c033bdd7d454ffc93f799ef34db93eaabef34ad5dbdb1bbc77a8574fcaaead07357551fe84cd5e1d37bd507b6bf398ecceecc657e536f134d73e8f5b0d3a7ee271fe8bdeb506b77baebaec3d96b445fd267ac9096a67947ed15d2d2f1a4efdc9da6390eaf60d3e470997a0bd0a4bfd42ba449396c2a6c5a05b7a02bc6c66fc68ce3704c9dcd337889d8391c7a3ec4e81c8ec339d81b3b87732dda23537187ca4d490267a484efe403774ff24709152789442661142a87eb70537c7268e92b9ac49148367eb1638c2dae25dcc987f8132d329ad2f2d19e2894cec0ec205bb43c51cbeff44ed3d8e550617312be4bab1137f92e05a2555028453b54d84154883ae94b875a367101150da1346cd2022a98a600fd508350af87ee7cce87eef6c62f119bbee65c5d39ad2b8fd19e5192573c2947ccf2b0cb4b1e66cdccb3d1f6570156584993b2e370f62370d11c3d349d41b67ea50fb6c2fd1d6db4d1c6c8512ec6786ae96fe4628cdd6fb43488025120264ef0a19446c12cfa8ea197a3e338cc465c14cf429f8e47247c9eed5ab548eb3448a6e42beb4cc42c1df6c6d6711afa682f91d93ace3ad551995583f8e275e2751c87290f4944bb8cc8d4b9f1f86883d8fcc66153aca39546d191b4e330476911ae12999d8119a43b8eeeb1f2168cb29351dcbb7a3feeb85a6f6c9b22d155ba3c4b9fef3ce60c7b33dea750511d7a392a2e680ebd9cd571f8dd697e73d55f4a37b8dd692c77b576ef2c1bad2c17c515cdefea35a7abca4635958bbc1f647735ab9c9ad819a92a47c415f57c254b7b38222300f0cfd2281e02a28b029de08ba7e7f1237c978b685a1f1be18bd6d2e7384d652f875a0ec7a1a783e31c8f7a2a62c74b2f5923adeff86d48d7c1fa4ccd51af44a2c46c00d4d314a5e7f0c383272f970a6b0b66ddb8e6e5b06cfce26c2632fbc6d9d3b971e33476ac1fa84f14adca4c76fc46cdc0ec20a4e33853e68ea37494e32d4a15baa24b85e3825112ba38221cd949df514fdc4b1c376484d70f5e7db7227c97f6a018255faa35b16704ddaad0453923d9a23d46b4c7c8c848b6a08b3b7a35e5899cd7fde4d91eb8bdf3a58f9482a7c89e96328a961e7755470d3c3dcc4ad2713546ce688644e22a8cb10ba89257791da55e0eead4cbd1e1b16e1a47a3720bb08ef6c8169fc187dbd0523aa1a40df05d8e8823e282595c66c42cd69b0a45690a1463500ce2ee67b974b40ab6a619b48aceca88d102e39763f9e54e4fb94a83180544816810b3387b0a044483f8a8478aa6871fc7711d7bc1281f6db929479c11ed61227c9733e28eb81f71dc11b3b8779c113d3785515cc4521845ad9cf935a97e3f7a08a9bd9ee58e2c6cb67783f67ecdc99f969fb110b6248f4c79391c67247f388e8bba87f6705ce935ddbdc7f6d6dc1d5d3affb6f0103eef35a5ca3e2b7b4f632faa55f6d6f4a54033f6eee84b8166aaf02a0da240f1c80e18e921b32cfbd8f8652897b168c95ab43c07411e345ee39787f0cb45a0bfcc24feb2115a1e46d67f39092d7f79093d4ebfcc0456fde526f478f96524b43c7cf9e5262d955f96a274b6b7a52ffbb00fb3642ecf51302b87cbf30fb3388e125752b6542cc78453dc1595ace56187e330ad4b6c1df35897f83ae647aa2323a3293333d8cc8c8a8754ca680ab3524731c6d429fc50873a78f61669ef9c10b3e88e9a8b3a8e9b99c74fc843c7e331c823c7e3b3d8a3f3d1f437cef5d2ca09dda85c501017c431e122d962a93a8dbd1bcdb91a7b4d3567d98b8a51478eca64802af9ae7219e24a1e47e59bca5350a81a7bbfb2d74463efc72a7bb7592404d5e39d401edcaa4a7d82f0cda01ecf0531ebc6e53926cc8af4868d1f77a3ced6383b45e95ac936e1c3b524f2b0432a76ef388e53c214245658c31886aa7086138da00448ae20810880e092e7388e2641551d7c7c7ca04a9e81f05d2ee2ee436da53eb48751b4a7c4193129a9d825970b62020518aa98c2175e2e1003f4a2074ca2f0d241098682e019564045104ca0848b32c0e00915507879a1032d5e4f603d536147d1d1c8e9642a8428ee39d4095156891e660f29d2dd7d98ddd91c2a6c998e864ea9040234b0a105462ff0a2891a52808227381186d7d00f101013a8414a0c68b0851ab8410026a8421a94b4000b69681223515c1171b7b427de42a8e2a2d79df6c41e142852206e8e468ddd754c06b892a751590a549901a2e46d489e37b8a1e5cf6b8043cb5b794409221fab6175390db187132d2f3fe08396312388a921821a34a0a001c303730ac1e905042f339e98613a6272f9808b0c0fc888e1448c16f96a81f1050c9638b0acc061e5f3e25379834ac90d25af0d5e77d45136506e0d1c490da46dcaa6a541cbd0907507551cd61d5471d30c90879465803cb83b9301f28850c59d868d0adb56d8b5c27e851d5361d7a8b06954d83015f6a9c2e688620fd8f25c50ecc119c59524ea86908751504b9dd8dd590ae4d1d92eeef494c1043bc081931f94c10b1d198ac00633b4a00d52a401065d104313245318210e58482006359802137a7400052448a10a1d0d9b44c18b231dbd9c180529b66193283c9133aa09a2ba9b2a0c447577a987a8ee326a0b44758f513f88eade523b88ea0e83a54e88eabe72f67a785398a6a696afeb616b6eb6438a34a5760a67348fb01446c9a8f386567451d4171ad1575a05a3384b8368ec4b83b83ff65194af478eab395cc7167ac2830fa27849010432b0010d500c626802831ab0400949b000858b9a40a18a6631c416058a29c9835b9ebb803cbacb431a8486265090a2a1154970d2310d85ca90834e42b6580a7ba790abf860131f2e7cb668e11f7c978b9cf844c13ef8584024b9e8080cc314d391301c8942501480a65079011825551e8f356c42032f9aaa545a05a7e455bc6829500fbed37387479fa5f6ca578c5cc75cc4acc83dca1767ef06e965473b4476a48f8251b2fb68c7d432037dfc63191a310fd8a70a665d2e6a27cc922d957792a7e5e9a53d949b4281542af61d814225bbe4724645b025a7f0842a48e1b5c40b58b8e4d908b676920c69e1090a82f003224401b6765e108336c4010a083c808318b8e4e50bb61220022da840a2052c10c10dae1e464925cd562bdac1c740dccdd19c846c01c12979282defd9bb6dd11272d1f2487c3a53a474df9d1c47ed6de1ec8569ee99a753005309071ffd0e46c9639e0e0e673b46edeca0605f7a41c4868c8a57670a11ee88c33a53a630abe39478d834d6cb3f685f7cf1451c3a5e678a14ceb6ce142f780ab7b8a875a6184d69684513281d84289a421e1fb4020c5c34b4a2c99436356442108e34e56e88e4a678c128d8b448d3d9bdb377761d778e5622dc9cd551c34b67ca9197a333450ab3761a76f474a648992b3a538a1805a3ce142352c501626a5f7ca133450aa360efe06fdbf7994c3f0a25a9f83836814292becc4da080a4e599d98ba3582499bbd74c137287cee8450c54208417f8b8b3502bda5484644ad2265dc5c9842cefb337152934c9fd6edbfcf66b9bbddbb615c97895201520952a967c879e0f47f43c0eab00318bb5534d53f17ec0d6ec7d4faba284514c85ca4fcb0bad5c5e85898ad0fc8eccd73c694288c16f6619c5912af54804e2810bba94692b2a42cc2bf32a402415d6c1a7456979cec1775580a84a10e538e7558018a552854a10b3a695562508a8af0a9006451b5201520962163442153de7541162d6bc3c52b976f86dd78a36fe4ad3cb193280e9e5b0d5a27839d36a17f8aea9bd7bf6b4758c2ac3b71da9d823f1e7a8357bb75751c9b28dc22c7a6d0b8da8e5d58ab421669d7a90ac6d2f7ef5242a323a3a322a22127a321425cad013a11f25404111282a893ff11579a64fec893cf145546474746454440485e0937938f4e4a85bb36307eacddd23517b4774c7715508ed9be57aff9e2ffd6e2abf5fcfafaad452c5915a0d320ffbb3d2215a7bf61ed144b08eef2c112ca8f953a3dbaf8952ee26981f40645472b49457b4a4dca602c4acabf25305b3b096cfaacc206a3eeef476ca7142595271c2287915214d45a8e5557e9875b522152998f5a3d824097db7574bad48ca164699502619c5a432d4d0c64e6c42ee5069a202855f3499241094a34d028310b2bc44d8e298e2c308553ce79c733eb264c99225f3e48ce3ef0e9d6aaecd339a5738ab920b46c519a3bc9a61e73584303be3e031c6ed478c59d4342129f4662f24d2342db3daafd92dabb563147f359abd33cbb21e2661e80b89b2ff90fc6156a4610b8dd5ac671040d81ecc3afb07a3f8f3a2b10aa3a19763040f41d11712fd286a6c488d8d910eadf822c989647be0267d636666666666d25675d4708487510598da31c85cc2f8396c0da398bba6996f922f212e6c9becacc224589105844f8c98444dfa9afa87b4fc497b241a69a1b757d63921a4e3ae236c1d01c10e97066db01f01418dabfb1110a05c94fb1110985ca41f01c1e7da7e243b08369776b831d1d54cdb00ad58c601ae4eac03a42a67916696469aa3b4d006e326b49dc91c06da39e1db010684104208218410866032abebfb350e9f817ef220385c128b9046ad033b42553c8d5d94d234679452ca6f9149df8a491649291daf6df8bb43c7a74cf59bb172491b17928851104a231e0a652ecb8f6c452e8b6c28aee429169f451c8a506695ed04ae24566934add0091468682a3b3a31ae8bcb51a1e527674a36c8721c6666397b39ddd9cb61a1384c4dd0587de9e8fdf0758b1311e0a0b1aad2718a0f26818b1f963a85a6f2c9c31409ed61d677792a05b3605c9e2a813c625c9ee22089c779f15af9a5475a521db4a4b12b31fc5a0e3b9b51313b951a61d4d8312aeceed2cb915e4e8b9d423b2da9acc0e8d1b77051e00ced745abf137320308f797c4cccab2d62e43f195962a4fe65e7c710304f9efc10e6f545c4fcd6c81ff36a8d2c01726be4f43f26e6458a18a97ff91220a7ff30308747304a3ea6220103892051fdcb81fca7fa9717f19f62be037320350ef3781898c7d82246623ec3c8122330d7769878c12378d45f8dc7bc0898d3b046681ce631d6c8122034ac11181a2f52c408ccb52f0132e331af616b1cba620fa3e469d4e85323f6f49ce281c05c3b9098cf38f44ed1120173ed45c47cc60d666e6fe3f7328f67da4363c672453207bbc95828536cef67c39a6a746d9badd045cfc050402e8a9f638f70f8eec6f9144923d9baf10aba1448f5cb1dedf04b5f3cfc521ed42fed49cdfcd21f1d7ea992aafd469d711eeacb77a8a7a7aa8da3aabd0e3587cf5499430f875515ba6e54e8e2a142d70e15ba5215ba5015ba74a8d03553a18b52a0963488e7c5432df7221d5119110be7a208e0f47bc3f432378e312731353dad89516cd28cb0110cd11ac6df608bbb35fdf5fc41a583cc6f9729799285d8c6dfac56e16fd799bd13b377838f5e8e5562b6901a8d990b3c6882044989708bfb3c124f8259a54f24ad0c7ad173729985326521a3688dae12129345252b61d8f7b51c3bc1cc787131c5900153b39faaca5faaf61975e5a64aef52b9cba8de639c3e1c6ec15ad9bfc31e4b6c8d7d095363507a3d90baf4ad644f4468e75e04e91be91ca9bb11d2354bff95ce44a904e3f06b39122d2da5b37494090e060b0b8be54f2b1d7a392cc7aa1046cd67b6878f543af486602f3d76a104f6d2719825bbf6232a5f39664f9f1d8244da80642769cf8e59202a2b57f98eebc89252e9ab2c828e5ece8988eca417a1f27ddf564f2c872e523db15822a20bbabe4c3b10d23579d28a2dc2df4a9ff6ec4568cfac912540f8d98d48156b849fbd54424096691b89fafc284180b6edc8b87d3c91682bd2348df4e813a3884f229428053c8a55c49f181485e2151a89892292373a84a98de0ed4c2291e09744778f3742b698e06014afb34cc4534e3b1f451f1f2dfa6824de3a7acc768a6dd3f86c2d50d34db4808448a4cd4d073538157b11b5910f8698c0329b598665d8647e94ef9a4c30db8da00c6f2df0377614805971e314fc85697d9c82352d7db48951cc7cad66d894914dc89dc9710a1a5133e78a31c618ad1685513c79fae8a574830f9eb90adf9547cd97471a1111c4785010958229f936800946768c927083533a01c36e60dbb669cf4e336d236d5a9665584531151faa73fcf0c1ac1d532eb9399a9fc3b40333f4fdc6728a003a61e8e406f2d5519e743819e39fb28c8398c5640a3b89421d594ac74c635961b30fb32eaaa3882de40710a40a04a7e2632d00a3e2b72198a5d91b6d6ced706f9a0f630bca7bd2af4946cbe5fc0a79b09cef529920d5ac46d8232691bd72864e5abb3cd5ea103f8c3e0d88e3b011b2157d9890ad9824f68850e22a3e4694167bbf963e250b8f3a0b8fbcc852f92bd57bf4912d0e0a92ad18054aec11a7c4557c50908f4f9b82a07c8f10e51dc7bb1d90dc7d95a3c8563c8a53620f4e1257f1f11c14aff26bfaa2748c533a529f20f681cc307289d9abcca4008ce224dc55ec3595ecfde8516693c4e620a88a374026c4ecee148b904b38cc8dc32c1c46c58e7ba7b3a08e3f98c5acedf143300b369d9ad40e353b05e990649b804e5c4b367bfa21b30074d26c0b00191559f3f10560560e6fda1ad40d6699f8bee3168fc41ff9ea9a883bdb5439c38c8c6951d3324dced8c2fc86082b376a420ba18a0f8dd630cf87a7cc97e71b215dbe2506a93b77eca38f614db2d55996167bb76dc54299faecfdac89abd185c484901b02919873ce8df3301f8c9aa7f08b01c4108c9a8f617f306a5ec6bf7924642bbae693902d984f386f7af4817197531a953b4cdd7eaa2b7fa92c9f51bd9b6a7797aa7218b574e84117cc0b3502a8e7670cea69846c49222264589ccfeea0fc3642b64ef1f408d9e2b8ecd41aa1cfe833d28d64e7ecc93599d0de72f8614742ce4369f9e3fe6d710c1f139a3d12875a2c1293b39fbd5bb397d3721a29800454cd9833e414e3c7406cec3bf61d6be17e84e5db3f7b8a6187c8ece97bf61d17e59e1d08f7acc8cab97f16c8f6ec992dc242b77afabe7dc7c5d5d367ffc1f88e2bc6778a11a3e548302bf6bc1066cd471f29b8f519cd136116644211aab8f1486b530211614af758510413f48d51f48cd1f211414acf378059b2e78988ecdc8164e76c9125df61d822a467ff2c10facd16d14e8d68e7be528d2c01a2d9d37723247bfaec890879ed45f0b96bd730acc6d6ce65a70d60d4ccba0a65ca9b725e45494f24646a6ad9114610015d478e6ccf7e8474edb442d76118359190a979524d42a6e6b70ae5bcf6eaf96c3e167db72646cd18866fbab842973c7fda209bb6239b903bb1096e87b3951f6447a198999999798b4dc6e5ca2a563f9e2c397e8b3b11932b306aa633f6804d600c8a5668e6d884a0965d6482ad08c5204645387c911f01666de71d2130f6e057c3c7edece528a17d3ba519a51c8c83d0159c502ed3594311b6c5a0e6ec31283261164c4219868a9835855bd109a2e8845950095690a2b96f14ba314a14b2020e3ee81b89ba9712ac4045df28253e698e509abf6530f6800dcfa58c64610484308a4d5835157dd3de301849a979e0a763845b1246c5cdc76e3d8c8a87c3377fb79e8e2ef81b95442a88be0798daf09da123eca2e3c987797868777a4e25543ce90b89687cd2b02711d165844c4569377b61183ef8b8fd48106433cbb00c9ba8c327df4d35301571602afeeef8602a1e7eab10a63a888acfea0651f1589d10153f857ad6f47c63981d9244cf21457a62981d5224ee603cd120139768db26b38c97c0cdc286108b9ff58c6229cf547cb7e6392e14dac12c79f68113e5efd6db063f23a396120e4d25502873b99fceb496fc9ddd91257c792a6becc141c7ba89a0a9cc4e00230e60d6026eec170e4d8637f86a76304b7b7624648be53d3e9ddd07b7e28f4c65f1091751680b1394ef8a1f2747b7469a6094be354594a516b130339f58bee330ddbecff41fec19ea3799be2ffe7c3366c4c4c07cc68985a39d57528199c17c83ec74db68986e627e171f2b7182d9fe3d7a4366fc9bf10f49674b6a587a961fe17efa0c7b82f9b3c721d95a8281d8dfb395676724dc62f9fd3a4691ad93966559961d2689a2b3ec74a546975621444198ad54e8cab27311b3d8048574a2b34398fd65c59b813161547605a3b2a1278cca1e73ec110e5f165dd9d948b6747806b343d9b2a7a8ba721deacb676acb73a8302e5365dc468d715b4dafd5e5d03b69381c450275f64c0675f6cb449d45c988622c0b0565a7d85dd99948b6e659ac11d257ce628d2c0142facaca8dfcd39ef8d0350f5dbc523799ca3e2b94a938862fc3bc9c1ad7b2cb5a339dd8dc0554658759ece28b57e2a49df41933b0cf788d95b7fcc8cb611cb327cdd2e99d86b83d61ff775cf607b2f2db224b30d2493b2e8a75d1cb390df1931ebd213fc48e3911d155a38780e8aa27d51376fb1dd7eb09b340564e3a76922db204b3405e6e6d11187f799196af7c18566b8d2a3a7b4c10366445c7ca22e895935ec4cbff1a355e4f31872e523dc55822a0abc6cf1154d0b1663076081af60473d2775c9b3dc1d813112c271d08cb49f42c87b1404e279d648b703f7dc7a555e66959a18b749603219dc5165902f322f3a4c35820db4fb688fc262b0355d8640b1f74ac53040dbd9c13112c5f79112c5fb1469600915fb991799617b1f2176b447e853fd074c60cd35d643c46cb61b07c658505464b0c192e2653852e970a5d322a74c5a8d0d552a10b46852e960a5d2b4cc451b2d34fa542d7075d2a2f79efe839d2370d0aa3b2ca4632959dc4479d9d7b65efb27b3e9dbd54b3ab48259d71914c65d055727515ba68852eae4217a942d716a3302abb66e310a3b2ec310c1f6797e7483bccb1896d87b91819706469bfa81b2ac863ab596b752549e7304308992551121fdcc18c6a14334a2e6008995ac010b2958228a8cac2b749adb5da354fc30df5bb4154861d0477cd5f13e491822ad8da419e87bcd9505025ff8b3a22cb8690321bda9aa3d4a4a009b5247524faeeb6027f532d6bcb1913fb3b7eb3d17e583445ee39c2916d5aa9096d413233bff014be4d2641a1cced5e7d74d3b089149c2811af04918dc6897cdd65913b662f8787b3a744ce0ee71e2b890be298e0f88a3ad5b0890b9808691dfca2dda179393ea07c54f8fc48d12ad27ae9f76bd20e875ece0e425a48e72af47272380ef3938fe6a6d3f809c64f671182d2de55ccac8a343290a4efb826aee29972a7353e3ef23976c7943b7197495a3a691ca6557a399189e622d71d87398ee3b0086569e6339548ec9c78efe634a895f7d5af7a57e147672ebf9a5f53779dbd335f9dce541a4481663e93a3bbfbb89b93eeee5dd19dede89ca15fd1200a6421a3ba999915a543b49e390eafea6da229775d6c4f889bb8e27baf89abeef426ae289f322193cc9c52ae3209a37888d67407f2bd4ad35de5aeaa37e71a291010371d3da54264fae688524ae9ea379513625410c784e63595e6d80c98aab9ac5df355cd6f6cbae63626a8aa391005ba5cf1f88dcd797c2aab1b1b954ad575cccc343e535d6a542a55cd69eaf5d1352ad58ce598c81b1b213e7ae535a5ca52f84e30df390adc6330143eee1ad137e6425a3ac6a19773773a468c961a5ca47a8c71952a75e3386a6c1dc7f1bbf5f60dcbf11997d112bf7abcf758a9eab1defc7073d55742c4993823a4674e63b5b9aaaede559b1d950f2f97811eb3cae6fc7299cbacfec24477dd63915e09e94e65af905e7da7bd1ff106c7391cd711e35df566cebd5b799ed7bd3bd3d0d0d0d0d8fce6d053a9bac73a6d7ef31b1be6388ebb781dceee34e60191e3f198f783e3eebde5e69877801b7f634b37f8a215d2d272e80991e3d406c9f168836433b5ab97b3425a3a879d8cdaeec564dc598ff6ceb067e9380e1c3a70e0c06144eb382f27751c3858386ee0b037ceba711cc6516f9c8d987543a6b8471c958d8a705c2705858fb3374ecf8778950e8f5ce51f48cdc5b84af514cd0c5b4a694babae03c7d9e8fd10e3aa43cf87d45529efa9ea9debcc297b3acccc8c7942d07c15394a29c79cce9caf331339f682a4628cf191c6781d4f87e6ab4bcf079aaf68e5389aafbea289f6d443d77531340a69fa98c7d4e9ecb8aa7a2a656738751abd1e769ae6d0ad9e7af04e4fafe35928c4cc692ebdd30f33a7398de53c6a4f3dd0c7781d6a3fa8f21eed0755dc773a5e8753f636d1aac73cc6e0305763a72a6c554d3d55631c4785ad43bd423a86d562e357a3c671b8a5cee61adc122386e58e62288dbd2d4d73ca439fea33d771ee34c7e329a5cfc1567c394e0f3d1dc8a81cb4de2904a6c5079bfb7a8579392a7b775af5191ae3ea5d8c31c6586912eac3ac95bd3bbd22d241e28574bd827175b3e673e7c5af4e63b75ad9ce7ba4597c7cef9702514a29a59b0dff7ca16d8abad03870987e8b3d62d7cc95fad01e9a846fbbe6bcd3224d84a90f16dfa55b8433bf7178b7a694fe833c60d31cf74e7354ef8a2f07cca183f5f8ae0689a7a731eb302fe783aad533cf87ec2beedc75f74e6b8e7735c7630ecb1d7146ac8e3dd5e90623cb126b4655ef8e8e3a194573f86d8ca221dde646952f79845137271d87f9099f13beaf6e32c528f97304211c56556d3e5339263ddcdce67c842f52b83a1be1db18a53a8e37818b7ee32c1dff6aa9a5676e1cb2749c52d87de65e0ecda9a4947ea7b94873fcde4e13c13a87a5a9343e535d6e126296ea9032999939cd719832f3bbebb0fd4ec77a63e57bbf89ab99cfcca86e536f4bab0ea39eb8c3786c967ae2ac123930fe03cbe3591e4fb999cb19d89a9733133b9aca05cdbc4e46a9488751e18dcaaaf7abd784a35e99158c0a6fea8d9674533df170d82ee798c8cca091528e02512e02f15061537ef2a1ee721a8f5e8e8cf350238d147a36f616699b7795b338b2ab49fa12e1ee6e53ef4edbd8b8d41c879e0d8eeb60669ed181e3dd6f620f1c42d09ec161ef4ee3f84ce56666386e0647ce54ee382a7677b8aee6b84da5616f6c1a39eef29a1c392e9330cbe539ce7939396cfca493a6b1cb515da2e7036d89aa3736ea10c22ba0131f3920b36e7722dc1cedb9f1158dea37b1874d8dcd5e4ec7d99bb8ea4e7b648b02ddb02cabc3e6c49b41a87568c80433f874175cf48c864ce8e2094d6587299952c81f8e2236677d3a72af893d60735626615454fdca248d9d9b7de3dcafea5cec789cfb38ce5e9aaf548f3c2c05faeccca16ca9580fca1485ac1c1488bbb4d74773d7612f74d2dc6fec8557347773ee941e479d7d719cfe2ba2f612c17ae6f46c79554b37f8682c11ac69a8cd697e22dc335f3d7a3a41e867d3d8209ebdb1674e73ace96d7e89609da3e30dbbfa555922dcde57f64eace36f628f191bc43bcdf9ecfd40636fe28a715822dc3733c75a7a42604ded4d5c456efe8cbd324973bf892b8ec6b9ea722a3b1a34641ac621f32367646474f3c84536339c77ae9433e294fc8a69ec26a756aa73853ddc3c7a2e5ee5a6b1aa3455556feacd5c7e137bc076f9e6e5b8d8f8c9243b3d739a7a1bd0342b9b9b20f1dc5ebd3b1dadf799438ef636a077829ad24a734ff52e323333c7fdc686b337fb4a651bd0313edb1122d35d6c9a7a65fa661722d331ef62625e586258abdfacb01c5fe5b8f9eac66fb0aec346a6b9733608bf3b3fd29c539d632166ee5da6238d34d248239dc1915ce96932b6619bf817ae34340de0ec4975eede49f5997794aaac0f9051339fb1b701ddddb3b701cdc5b0a1f98b8d0d8b93691b3b197583f54c470ceb060e1d3a6e8ee3e6abd5e9cd2a91c37ebf4f8b1ef834cfd36c10aa69ec699a4629a5d7ea0f7cba9b86df5eaa459a3003097a5ca5537acf934aa4084e40b87fff6c91efdc775c5492b47b8f1ef8ae767a1ce95521f0886b05e05107f10edb48e9454e4056ce7dc53eb1e3face5d8954225b9c6be5573261f995557c9be97b9980fa25535f3d15f17de52b963f1b8d644af2c8d414a0bc5e2e3cd2c0c704b3542ea774a955767838035f78f1e3e2826887474deb85474acccece618cd2ac1078d4d8e11472d058a4c2c75f7c519e238a7147cbb81d00ede00942af08848490e813a520223f2925dcb41fccba2820e435f545c1274398644a7ed629be387c170afd902d0ac8cb2361804fc64b99a3860fd4d086c49cf88ec3d7ebf51272dd094da6ef83420d3ff80145415eaee0d5d9b329602ac3602bfbcca608ca7e644beb014c65cf2036a5b34723466518178ccab0221bc0dc401e728bd70e257dbf5b0d08aab2331c3ed8988f977322023be946cc6f53c893ea8931259d7dab27c67cb01f993a0e6f4eb4ed89659f2fda8b7901d459f6e3d3991089e89286843a3b8968dbbe8f44d4d94943b2957dcbfe6537657f7654f69aec3bb2e364ff917d88ec46643f223b12d993c8ce44f6f8e2c91e7bb2479fecf1277b54923d02658f41d9a350f6f8247b1cca2051f658943d1a658f47d9f995613dd9d9273bff646725d919283b076567a1ecfc243b0f65e728d9b9283b1f6597afec9227bbecc92e7d3209d49914ea4c3ee94c0e7526a37426893a93459d49a3cee4516759966559966559966559966559d6d3d95fcc9e18867aba8390cb81ad38820d8b294027d0a0b575dd0e1f9d43a6ba863cbec3bb628fd2e175c01e06f889abeef0a6eedb8790a96e04479b131797cb6d32996ca40216c19f2f421eb346b0cb4f6b640910ecf246e6f9d09555e872c9436b441e3b6337c29f2722e6f945609727d3b1efb8663d99e681f0e74d9fb6c8129305228fd922d8e5775c1b8f4cc99ef6e98ec24f66abb149db12ba1bc151ddae80aaee5fddac0055dd4b75bb425c41e92d4a14208f2d6843b1c79605b8dab0d8b480aa4e1b922d03fcc8cd49ec118790c455f7a8c5d0af4b5f6dc8003c80aded0a36c014b015b5f8c26573d2620ba5bb5f97ed09a3daf0e9f099cb40d593be3f8a1aae96d0b7073074772bfae67ca19df42d0017dd3d0af5c521ea0ec5a4ef0e932d82faee0445f9225eb64ea626f4f5e1095d0c21e9a23d99ac1239f139db4fdbe310faee0ca149f6c613d97aebee12879074774a23129fee36eb049fee868486229227608fa8c5515c752338922d7e318b7404f2a0ef0e6f44128297287d23929eee5e2154954eb2518ba3d82322218109bafb666fd4c20ddded70be4cfd6a43aad343f97a28ef3d62510479441b3ff6376ae1d3dd8d5af47477a3163cdd15452d5e39fca250bf32d15524bab2df1a931497dfc813b398d25dcce2a8bb988517dd3dab9b4c753f5d51830b1a5bc040797132e33766c1e4c22b7a640ac6ef8e5f1f7d231645bf310b253c62fcc62c70d0dd6fcc2207dddd015f474414457b43312e01044c9a3e62d10554d9bb9de186bd1f166de0c1c62c9ce8ee3bd4548d32155521a3642e75b8b068470e32362aa9dad1f6e2ba1d29d9dbd25d019d40273e7ce4c871e3868c0ccc6d313d7a39261ba3c8f9e98e7a15d5b1765fd5b2a88274e9e5c8b8f47248a7f033412fc7e538fce9c466c3772a5d7ec7c59707c297b6c892d28bccb385322563ef06842f2f6d11ec6c7d5c3109906c694332d5dd86bd37597b4dd5deef59514c56d47d470d7b77d4d0b0b70605632fea277b6f7ab1d734c37ef66e348b27590c6511250ba22c8a6216421cb3a88251dd6564e1248ba0ee22165338d51d0b2fb238f26581248b24cf228a9f2ca4c8820aca5261c3a853c8afd429f831ea143c9b8bdf52a7e0f95cfc594f118ba353b4444497b4118b2299ea0e5d6c23164632d59dceeeab305bbc9a3e9e92eec5ca4b3ed2a310240b1915648b4818d5c1a8118b228e5848e1888511546171062cd01057ddbd1c521c8117a41a91bc18d53d5af6f96ecce28ae9fd80a9d82c9874f797111c654fb028f2e2bb5a4f6745ddbd4742ada7bb6745cc22bd7b268559a577cf8c988575a58fd638022fa0aabb572154dd8884a7bbc723afd8238e000e70d5bd1bc11750d5fd4227d0a03bd315dddd65a8bbab40e9eea428dd5dc616dd5d1b22eaee459bd187e4c844825777da50778f51231228a0aa7b4b8d48441057dd6154162447bafb4ad58e90747727404c9454f143c5a53045d15d4492a4bb6e04478c7ac3177b18d575bf710447dddd003fb2450198ea7e860db6e18b4e747727fc74f7918e7939a57f556bafa25aa542275aa042d32a3b7a41603da42a84515d7707eaee71a87b8cd23d12758f45dda351f778d49d5fdd99a73bf774679f9feeaca43b0375e7a0ee2cd49d9f74e7a1ee1ca53b1375e7a2ee6cd49d8fbacb5777c9d35df674973edde54f0781bacba0ee52a8bb7cd25d0e759751ba4ba2eeb2a8bb34ea2e8fbacf57f7c9d37df6f8749f3fdda792ee13a8fb0cea3e85bacf27dde750f719a5fb24ea3e8bbaaeebbaaeebbaaeebbaaeeb3aa3ee8ebacb5edd653cdd653ddd653edd653fdd654abacb80bacb82bacb84bacb9e74970d759745e92e23eaee910a66dd1d40dda31266714f84baeb1e7b9875e1501266ddfb30ab7b8c82f4ee48748f4898457fa314dd75bc75bc75b0a8bb0f61c411b235dfb9bae3c8167475dd2f5bd8bb7fb2c5ef6e922df9ee28d9cade7587329d0d12877a1adad8b1f1266261d45e84628bf67e7ddc1cfd1a66c5f6b6cd83a6f64cb285aae156c46248a6bcc3472c869815a1702b42018553debd9616eedcf0711b3e7aeea488c5106402517b3c7da110515fec4888a8e30b6c52d4a55fc8042edafbc58e8ebeeef3de6f7c82507b118b21b96ddf17b1186aeff1094d60cb7b7c8210e401db7bbc42896cb16b6bc20785f69e6085f66e7cc2517b3f42b66a04b9c1e51d09d9f2aed00617b8bc27215b5e901297772664ab060bc4e0f21e5fb245a38b12b8bc471ed98254d0a2c8e53df6c8568d1e30b86a94200a97f7f8235b35925cc1e5d1a8c20d5cde23906cc12784008acb2bbda10c2eef5148b66858f1e3f21e9fc8164c83cb834560e0717951c8e5b1106c10051f9707b9200237b8bce88329c4e0f27cc4210d442eef062eefcc235b337c9cb8bc738f6c0560094ee87179671fd9621f9777fe912d6806973700a13714b9bc0008a109115cde3948b6a014977716922d6f8a2e407179e727b205bde0f2ce43b2e5192105525cdef4c2e505e00a294a5c1ee684cb834e54d0861cb8bcf3916cc516bce1880f5cdee54bb6a0187a60c5155cde258f6c41251cf1207179973db2a5dd00c8e55dfac8169fe10d4da082cb835ab0c0e5754eb8bc4b20d9aae9c289cbb3d1c4e55d0ac9d68e16b8c0e55d3e912d972097a7838f075c1e89052eef9248b666ac2085cb23bdc0e5c126ec40093470799747b205855edfabbdc31ed79d3ced1d7ae0e5bab3a7bd1fd79d3eedbd785e2fd79d3fed99e0e7f562810c5c772ac1a410bd5e4dcae0ba13080aa2d72b0b26b8ee0cca82d1eba50319b8ee146a6f066378bd5eaf21d79d4fb2100cbd4e200235b8ee1c925ee879bd5af084ebce285b1546af974f14d79d4447307abda4c004d79d45d289d7133d8872c475a7511a7e5e2f1f20d79d47473faf570b7ce0bad88be320f47aadc00bd7c578be4006d7c57aa8e083859ed7cb0630705dec670ba0d7cb0653b82ea6440940afd70d54e0ba18d0b4c2e8f5aa4113d7c582a4f4bc5e340883eb62421c91d1eb758526ae8b3dc1c217ae8b0d19a1e7f592e204ae8b45b1410f5c17236a4f0ba3d74b0a25b82e56940319fa6246ed95ecdd1a8a21467967031443ed1d6e9f6c61f70e653c1b24626154ea22c28b410135d98a872e2094e93341d7265ba4634ec0d62631a19e50602de879829e581006d4f39454b953182194a529e2717806c9d43ce94ea11e5c7a06316a463ba57cd0157f67d19c4345434432358f9d300b99d0c511b3bcf8e9794c095605b7620c6147980595f0059e9e40589223cc271a31610b3ee88bfd50a12f00f5c5a890aefb3526332066dd1d414342ccba93a8e7e76715cc2af59c4c7a4e272fc823f6fc8e49245bf1f37348b620f31cbac1a87914b3caf0655689d917d5f3cea39e3b1835aff0c9f33637abd9c9c76c07d4d006a909d19c73ce39e79c73ce29b4e3c221e67724bee2f93f54982ca03a527b228b8aa67c571669434a80f16229b950a28d692acd69f8b0f316befbaea9ec62f5e464ac94bdd458cdbe45474bea24be16d38786affbfdb0ce588c58a6c8f8c92204796801aaa6d09ac6696157b7ecd1521f8e050a890b46c96d3b69dbb4633ff78b3d3bc52afdd18e5d08ed41b0ffbce9e5b6757f32459ffdf844c1281905b3e2b31faeb2902a0b11a3e4dd2c4b916589c2328551b27444d4f2a523665deae305b32e55f26256fce36fe723e7776449b42c468c9296c5e70cdf65b9c2a8e52d1dfd30ebb218958e646b9e7537c932a525f5892c462dcf62c42cbe4fd11759ae60d651e9e8a33e47a5a3d291f6a474a43df93e18af26e24e9c1d0f58804e6006da2203d9b0c90986fa14eff54a9fa2ed41ebf9adbbbedeb49a90d1f7e2a309114172d1a252514b16a01250486a2ae5c3b08883bea68e30624063e8bb4d6944454f4f7e8cc2acaca324925b48281d8f3dbb8492551985514466f8a28cd2f3320aedf102853232900843f828f60821c6900978231f14a20dd124beab29912d4d89c5c22683869ba644b6b427da13ed4919b4272de5b45246a1330e10426803071c1498e6b87f2d5c739fcd6943b10714cadc1d86887cd04300440084879f9cdca3972324ce180feb9547907b9c9f123e898fce8e3bac30898eec61e794f82896613536562193e153e2b3c13386af092cd9ec6250ea64d0b7a302e364d0b7fb3af825f1d998810d1f6665bdd910320da1b72b238a8d1eacc8d8026c6d61f8ccd09b95c186dece523ed24932a2c8d64b11fd69d2f652f452c42cfaed2f529846d8921105a6b6d395a6d7a0402d0aa4f41a958105d8b247f6c80bbd9dca212a943d7efa781daf416116f71863bc10cb50179fca4f531ec3f6e94df1c9d4f622dfb5c1d39b0d1e6661df6e03c9f69717a2c60e037b56a30b469094610479788d5d067619472e2f66994065068d691d61eba5086a439007d7d8557e200f188dbd8c01b66cf840d64b1a7a3b8be1b3f162d4767b64c387bbf86a083583e1bb2c433608f2c0be093556290f54b1abc81ef5761b3e2f93a7ef4b11cb506f3584646a3b87e1bb2a2f06c329be7bb98e742f1708ee5a728af607ecdc615f212523460581bd642bbab6abf0b020f1ddaeafcaabb7978ce4f6cda8b7bfd4d8dbb54e890f0527f04a4170c7972299e2b6472fe7a58851dbe94b51ac6124b74f4d48ca1a469934aa612453db6f0da3de5e8a7abb6c91be6d242b238a4c6dffc2776544e9cd864f6f87329b0db2c310b75c41a1cc95f9f8f0935208dfdd38c6984999c4374f616c141cf13e19f4ed6027f15dcd87b4c1aebd2628f002898692da332494f5a451454f1a4c9850450c3a02358609d1866854112b0d258c62e961d44ce2bb318eb8f82e0d1a3db2c5f292a99e9e9f21449d70a431299875595e3d3f3e520431ebd2e8f961d69d21442309b328b3a05013b8e8791a54708b5db32f0d263d6944d1f3b24be2a34d4ee086be93ebbbb1c8a06ff7c36c161e4e8bd81826441b6aeed8af36d4986579b117bed8dc2fcb8b85b32c3c97060f7a76e183424be0e91be3a8b918473dcf5cf8b667bf2caf9e5f39823ce26fa9724450352f57c492a4b2f430d1f73294659a4f4f2248ae19423235df81ef9680a01c922ded433d3f6928a1a144a6e616be4b4349df284614d6c2370fe513c803f68c61c4f2d3f32c3d50356b6c8861d814da7158125d69050905a026c8277d6928a1a144b6b4cf6ff249094836a12f4b0f8444252658010a25a09e427d6708b1f4c8d4ccb2cac3a84923a86754a2079da843830a462561d4c42a67e1bb1f4b8f4e8e12dc9786929e5782fbb2f4f47c764c87060ea06a3eb32c2780aa790a63ec21b3349440d57cb42c3d9527cbb22cc3300ca3a1a4f2302b7ebee08a8e875fb3f4c810c91629fc016d400c64fa81308f308b5f05853277f6743ca9798bef6eb148a6e2b7efe3277cd1f2acdc3d4080f4328a16c460e8ab09356b4a58893c0e73149656469129d694345f53427b2273092894b930847a2241658b0151f745f58c811018b260c962f0652720f27c96df71ddaf3b9e8e8759584fee783a248c9a5d4fc723ebe4f18888aef9c2c2277f3b9e9797d20d3e79d4777bddacef7cf5207b7bd52948e72b7ccf8e306a763c1d92f92ea873c22d29d42599b3ebe9d929e9d901f5ec98f4dc9875e951cfcfacc2ee90706a763fbedbbd7afe76afcbc4866d9b9def5eccea5edd1166659647abf308a3e67c316a1e512f9885d98d8751737b316a9eadf032c1d7f1f43c0ca16d0a85cc82353193529e8f92f29bfdb06fb0a51db3acd53927102ced9c5c7f4c394f594a8c310b214e13bc8331d602a27819a594534a39a39c3293c72a4adac32746c896763e10cc1a42ab10a6308b497be5b13fda1d8cc2a93e18c5f7b1a319b3383e76fc6096c4c95817ab3b18c54576300bcbe451df136169306a6696f61dbd8379bb1b3eedf24786edc8321846f18dcca2dac0304a6c876679880e925dc8f6ed51ca07656a8b2d5404267db7ae3915f4fd5a367c66616ab46a6f767921018c828d55d83e92687a0cdb884cba83512ad507a7f811ab3b6478ebae2bbda334888ffeeef00104a7f8ece594ec8fefde3bb3eeecce9e51ddf9ee349d875e0e864d7aec985d62766765d8878f54c328bec128266dd7b4cd7e5add90f0cdcb4c08cc76b187361177e2e4b68008802edeb64ddb342c323fab1b4cf11026304c728f13fa9eb129042aedf5d1f2d9185abe0e6e9454e576ccc24b186c58bd3e1a9bbf362c2d18bfb525bed4c5167b18969ff5f9a467fda9d452dd1895ddab1d7fdcc2511ebb3384f868d95985104e21af89b8c353c2c1870fec3d36007434b7a6f46bd35087caef0e5feada7bfa74f87e6db4c41506d3c31457d8ef8c3bb7ee3e187bb0133c584747b7c367a3e75bdb8d9e39f46c81aa79af7e5de5aa5cb1e9f992aae7556620eac6f46c81e91903aee66bf474e9d9c51e305fecf196d843c6147ba0e20abbd66d5f672d6c6298d8e3c6638f9ab892893d72c415760d667b0e99667bb9e98dd8c3475cd5c41e3871157b1420ae628f1f71859d7443ab696c470f391af3117b0081137b0cd103e4514401620f203f620f24e20a3bc9c7901063b1476c081b88d8c38821628f06c4551190070480c41e47c4151681b8c21ee58a1e9a005461bf6c4474a2e307b0b3d40b4014f6953712cc7a63ffe01a1abb0a1c1a7be948636f00744343400d475c988609401e16802aecd823107b08c1bc686c8bc672c411e4c0114580e32642716313796c6a62086a5611042b9af8048d0aaa5437e2076ef0103dc0c30ed1891d52f195427d81d2210e3accc06126072f729079838c0d37d8b06db0f5a89e0d8d91d6405203690a290d243434762665d89994cd68d22f0079984c4dba05200f17d22b0079c890d1a40b813c624055d6438c269d4a18b9146d0b5465ff202a7b573b88ca4eeb0651194465a418493192489d59218cc25e8a2b51a8bcc183ef3e8c90adecf23b9815a30001211cca2af61d59122d2ac65a83ba51c3ac682566a74535aa66fb4cb0350021d06088076ee8419320b802f04a8314a858e282a02ab88898af40a1ccfd78c4d8117adb101f70757f9c8c414645c8233e665c378c8815be780c87299532320e63d8b7472f67a3d0e69b1d3d4a84b9c747bb04379fe3b8091867918e672f08f9c517bd5925b6af32fe12dcdbc56e0782909c8d10957d4eef07c932ca1277c9d921b2378b91e8ecb60a53134806e399a98042057cf27783563449d273ce3927e02345dfed084a14f0c1262c28eabb59d1a40ade2820594a29a594524a29a5bc94b2f5436e330a4abf2ccb6472b2286536a3b398456f76b0331d4e41e32fa51b7c31cf6e3a955f8c29e6d04b007465375518535d4e69853c6af6cd0d462d8fbde1d5f2988cae4a887a398f170da65e3ebfe3e531fdf2f24da55fae9d625d761464999efd066499b05aba01765a326dde0fd82693377318f5a20ee331ea8df1184ab92eabda8f19be8b0dbdb02b604318142ccacce645cf3b8ff43cf3449e8265c02c6013f00858043d31972ce6325f8217475adee5f4b3f1cdcbc1be79393399478d3e1897e79f1ef31aa72b9d4bea242f077512ed626a6c540a95aa30b8da82790aa5434b6de11659aa77814182715aaa1173ea49e213c50f65e1b8ae8b91b9c1c3298c30ca52ea38cca8973a19859db67434b0210c0a358334d25c107b08803997d4e735299885ba0ebfdbd5a8e0e1f7dbe157aba2e7e5919cd00a3350d1352ce869829ea610f4fca2a77c43cfc32bddd0f33446e752533138862ca5ee5261673adc33f60ae9fa342476f62566631fa2d2983d737689d899bd302ef3e8f520f37ae8e9c8d497171b59e662cab2ec7ccdc54696995eece90799d757195905b3ea27cc55663ecf47988791700fb36c7c9e93dca8928851f33cccef506551d7c1f07450c71e535177a9b0295653a7a9474fe7342476fd1253e6357e1a12dbc697982e1fa2d22e2e42c45cc62e11bbda8bfd74cc1342dec52e11db86bdd861a4ece907d45dee6283c0383dca06399d48ec98771683659c31b05276979abd56f98451f330555ec1a9f954955018358f9ad7a1ca2d6214fdfdca5456c2a8791b95a5e09f285e2acf543e55eea98ca4320f1fe1e233fde52b9f47b8756449ccbc3462568dcfcf17b3643e592ea7302b87cfcb23e905b3fe799a433d9dd6a8b1694cb59777e9a2178496e4b6c4b878df673f1f034be252a3ce8ea953c03c8311eaabfdf47c67d8a9e6c3ac984f9db7cb633e23c65e173b6bccf0e01243543abb0dac5eed47fba122c8c9d01645da9417121f2980983cd9a0308b7b9ec2d4234b32cdc78aa22a3abb0dc274cc5edbf632ddc9fb414bc2a88e51f399d57c18352f53619fbc2d05dfd57a5c72944000747d40c6e1e5a2719dd8d8652ab78d0ae1eada26dafad8bb783f986eed5d22f6e9b5c6b6a2488a36fd743aa3ab3e7ca7bf1c66b7436263760a9ebb689c6230c2886125ec358c608dd923340e7398ca7c845fae89c1d488654618c00066075367a6c1202686621d4c952e1af5c63c3bd598e74602e8e9a8346687a89c6a6cccd3f9b02191e854ef651987ce8ed5f86f134e7476aa75a7ca1e68acca2fbee8e8e9f0abb12f3ac642a8aa612f76171f669d6ce60961fac9e2c8acb2111abbb15f3e3d9d013466870ca0318651f22c61807b89acb1c35808552f9acf898609a6622ead87592f9fd79230cbf479cde75461e3c8972ae333aaa9320fa3a64b8d1d65c6d04a67a4ce0e210f1dd82dcf1e610be75e4d434f062dc3f484f07e90c796f0861e2f08792c060120abfb3c4eecb123aee6e75d90070fa89a9fdee69970648c0a9ba5de89a4e757f875998ad765297adeab4a687da110445de805ae0ed1e44d61e0b123f68071857d7ec1063374bc66271fe157193e2c3efef24ba509de31c91daca074dbb66ddbb66ddbb66dcba40db27dce6360a7b7ed73d3248944d230b0d3d9315a2f3d47229148241289442275d292482449baa61d033b4d3af47a205da397a792c64e7a3e44cf8b41b29c588378dfeecd2ae3bb1a0f85a08f41e8b3c78a0941b7cfd34bda3d562162678f244c7ad9690d42ba971d7a2448ebf6583fb53abb48819892e19b9f9007341d7e332eabe9147e3468bcdb50cc72b141b6a36edc60146c755ff9f55ac668790325f3aec6974c4d14e95f8575421e36642e31b0d3f274f6a51fc2fd1669f92b4f4f65b5a7b7bf3d676f651825e59b8f7197c7b64bc846e24afb4dfec79172b3f5381c5f876939665dbae5247b5d9ac6a597f3c27a39e91d8d97cbd3ad761f463a40ec0dbbac3789c64e87682cc810ee97f4256423811d36bdad43b0df1dcc6200e6d2da21dcefdcb6933e3d22b1a5b4875e8e3d0ed793ea65ea142bb7b1725b873071c4034ebc7ac8d5c01be0f0454b8b816a2144dddb2131768aefdce961ac901a7608fca2a7e099e1fa2c14dfbbef7bb7c9d47ce2b3453819cc00082d5001129ef0e382dd9ff85efa139efd646a7ee54f94ac49a6e6bd157b844ccd4f9982c1361a871ee9384c038bd07b3942c2d8bb7d4472c98c976ff69afae5e5358c9a24abf3f21db0652ddde07bf98ccbbfc8979f5eecc6ac087f7ea494729e5fccc33d443da5f72376c728694965f86efce91f29a3eb8c9aecedda24a5c9f4eda60a742d6d10d3619c466f8685f5766daa300e3d1d185273a9b065d4eba3a52a81350cec50acfc896fe5eb36d982a2f427bc92e77d050a953f51522995be722858fe840acbca55beaf58284cae273e0bc5e67aa2091845091c9e80c2c514e2b0c4f5c412d257fe7de52a9f7f0db3b62b63c517471ade1c3d7df0e6045e61e577e4eb62a82f84d2f32b15aa542853a50aa5872255485af918452169a5631425d1c928d22b49670d44cc3ac9930eade8024a934e7adcfaf56af93875d640b44916626942dbd9648c29489652c6d8b2670852503ae79c73ce39e79c7388d6980d322faf3c0676e625774a374dcb320c9b534a66d27138835a73364876ec18d8e96f5d083ed2217b3e6c276ddb83c48e5483ccc3d84b081262e647edd1de20f3f25a9079edd19bd76a90ecd83cf432bb75191c20c7d9cb71275dd6cb711cd4ecfd1a9acea4c82da0104764e628b9e88b6113c3263462290583534a29b3327cf1f08b70c28d27a3300cc330099b50f8c13ab139b10f1e7bac815896611a6b58c41e8f9130545f29a79473629856f39fcb2ac699d66d1ca17c068ff822e41b94368fd44d9e86c7304cbb8151aefba290200248ae4d53c93e8c832a789e91067223fab8a5c362093e0da8e1199e63749919bea852f2be1933a734f13312c64d2a391bc3177fc417e15663eba48450da86971826314cd20ec3300cc3a4a64929b74d6a1e56c2627024ba7530421fa00a1e87b31236bf277205466681477c19e4300c9b183625ed20d6412f96244f0857e2acd3c3bc5277c417217fa986a8ac0c3023c31767a88ef822841886791de518470f28c43135190f2f563746cd79cd4e46cdf98e59f21876ccce27d0ed6b69ef12eb1e638c31c61863f43a9c02c4f6aa09c2c0c316f841943ca9761025bfd50d4e8892cf2a8428c96c6af93a662b99bd8835a17ccaf2935131fe9e666f0dbfc371889fe0f95164eb04b1b335c2c7ae61f604b14b7b821125e334c50ab71ac7f0a16066afe983374968f99313ab54f8e4d954616b335d00d8a43a4a3b042151d4a60828c4c1a4e7e10637a87dc3e0b56fe74ab74c3b7c676fedc877e34c98666ff7adc3ba8ef99a9a995971eb98e13528043ac1b04c07d91b1ed1d8062764de88602dcf873312c11a0814ca5c529c937bcec973469e13c360bcc209110bc87a127bf0cbeb42cf98859ed79b7176912796496c4e39e79cd99cd81c1a1a1a62ce6d8b5733c327fc0b43832cecb1235cf1e32594df9ec12060ebf0071090476c498696cf821124bbd91f72c608a394a5120e7c80f03fa04afeb0e63f4cc993b64bb9bde29c5b09d8a7a7af0caa2117262830ab6bf978c5026294964fe402602b6a0153528b2752a2644afe3225e5bc9c733e8970283661c627434fd0f03d3e3942d62c014263768808854cd02d22604a9eb4ad7c7208a8924f5afe09e9958181eb694d4a96db752b3f3081920f078410326b6a30c8e0005b3bb200696be72d200fb9d9e05b0225104c2af848b0433e6152c34786d60e217fa1b5cb27beecf2c897fdee684dbb1152eba2b79d9600085be907dbbf2e0938a53512e388bda4b96e3dbd68ed525a4382515a93122469aea58e95eb976894c59f28ccc328edf203dfddb16ddfa75d3af1f1dd11a5902f23934c69df362d1a69da25fbf045f30c604a3b0eb61eb4a60da1b5df9ad67ea04ad3ae1dca683608d7c32581b491ee0324fd07e41137d2b74222fdb2e59db47da60a53a477a48dae706f12894422910e654849a650739a2635cd031fe919ff4030f71f90076cee3e401edb39ee13489ee37ed92a9ddb3efae66c8529eedca16c7996b39c85307501d01c77a8e20e9f70dca10c67834ca1c8f20314ca5c6ca86109bed05706b5fd809b94800d2b3f6031eb8b5f1cf19390a9c971ad01d88a721a01550c805ff4e4022c82a7dc0908473aa74dc1e170f5478462843d6156fcb6c563510cb175992adac11eb81b221a9873187eb18851334a61d48c461f288a46cc7222fb3da3e689c0ea45cfcb97d0b6e1cc1fa0173a3e6e138a246251cf226c889bb231470f7cb207b0552353b3e6f57a89a0055373d6c85654225bb015790069e40126edad4d04bb36999a334ee1bb510986cda86423925da050e67a448d711cc77d631477d2146214ec0c6329398e2b95b86fa7b1e3e293b862653a80282c93416da7893de6bfdf7b5743d193d863c615766c9b8d414825f34dabd4aeb3fa55d95e85aee8818fe36b53deabd145aa46bc974aa525c415765aa31550857dabd1095461cf6a64c228ec5f8d4150850935f65277d85a9113109693ce629fd871ad9cf495d31bab68ecd867ec11870057d8b11e401476ac088dfd66a57bb54813454df07179e7ea855d7602422ab2123d22a22bfac81476ba5257eaa98895b39cc5462532857dc5461e99c2e28f4c6199120c036aec981266a91cfbbeef9fa6691ba3b443effb54beabf4b4ca332f47e5fb6cc82c956bc7bc2062abd8ab594c09a3b0f3171f967d8d61a5d37fccd28e5df37a28b56621a34a9c57994041188e3aae5e78a4c46c9a755ce50c3bdc5674d6f0c26c108f48ce8cfa40080554b01a0a21b9a24943124208212c6254ed3b85b8d6b4024ccd531692a97902c2d5092453a722ec3cf744a6e6a14c21388d24c773b1357bb6d8835f4aec4fcfdf979e8771b2f4dcb66dfbb66dcccc3c7b640beb02a6e6b133f8b4a1674f674e28e979e9f5101b2b82aa7921be3b85a690911366bda7d19c46d132843df837bec60789c7a46046cc8a364a23999a8ff6922c6664b1a2f7d7581126855bfc7abd5e28704d25c0146c9c131401a660c7334b4b23d99a6780a9f9d9869e98133d31288c8cb022a39ee72fbebb15f53c692863ea010a6568f402ae5ea834abf4b5d9a4261d533432180100007314003030180e0a85a2f18050d225df0314800d96bc54704c9987498e21639031c610000000000000200800088fc5edcb83df3c8c62d40c346a2d96ca2615045404af607012ccc928b4b90f0adf7ad36f6a7596a1709d4807d925410f91b42a2f78b738fa020623b029342def9228d2760596fa56f235e0b9fe8eee6e22f809e81b8cea3a1931286e3607d76b24d8c981c8abb736abf6a9d8fe4ddd714f8f7e84225419b7a43328812e819c2c07995b5c7327c5b0aec46386b26aa501e76e4f51b8aa1ebd18b72d0d7aabd27373503a4971115404091a0d03b22cdb9539d5d87d1edf8dea09beb9f7a211c93bcaefbd374d34bff55e266fad61ea9e7fbf44443936c00d24f2e44af039dd223d0f143d77c14be6f267f906f926ffa4014fe958e662e094b567ae0800e8a2b97e5c043c3377b255de114920e7165fb02bc474d9384d4a7a684dd7d215fe2b5288aa60af7fd01f6e910e68ba2540b3d939b37ef75fd11ba9eb3113b9db917abd3478afabf357a14b6cf46069607386d7bf615776f4c5b817a7a5c6f9a1b25d9ec240537927dac5a037447de52fa6d7f80cb251d6f378be86c6a4990ddb09881685da5148ef25f04e733cffa1564615398ce9b24c386a8aa8d0b97fabb8eb6c8593a28558cc418a8a252d29264cc1019bbadff0a6a8a48de2c9787647471622ea52918634eb90a5f20c337dc87cbaf535e83fd1a24e9d8819f6fbc0420dd67d0df198f7937731ee7f6cc79d68c9d4f3e0ed1fe456ae141b82bb3e3f065333a9fb7f6a5d4b386f505cc7b9f6de5e553dd5c605f844735cd928cbe17752f5ef363a6fc0f39eef03329a349e261516ed2dcca84641a715645ccd42b4feb8f8e7580b0a2f3ed5837ff64ffae3f15b5a350b2be76c217fc900ce01a0a650401ffc64f4246a29c4544e21d073f0fd6764d9fc3f9321fae60e5a52abe2afcef4d3a8a04860629608a2cbed5480453ad1f714a0710a903d9bba25a05d0558a94db7d2b6b74c30582f5e8dfc89f6b3402d0f5e4489aa5103b67df5a548a09d750587d8f0414f131c5dbf09c48d5da6357c58312d7ed7000d3295a70e1ea5a6aaa812cbbcc60592ed1e97d78f61592a20adc34904762a7f28fb612f1da177fba4873e1f28f662f452dd3b4c404aafa9bafe35e7f04fce12158c074cc0e8b230e4844c8f8e464fb22c75a74a499d59675070b0146143277e906a3566d4f47be11bb53fa0384270ce2675cf58d6de59d04d9728e8ef43049d354ac9ca0a59c60af688e457dc406a210f912ff1387d601756329f36607f46d5f9fc280f4fa303ff3c54c8fcfb0c6ae2a9ae704d642f781cdecab583457cf571c24f18ea3bddf154354861258aacc2db3cdaee7750580105c2778122ee638419b93d6f31bbd299054ab246f1eb7dd0a4c6c2bbaaf163f5bd1a1c6579efe029104b4edcda3b24ec59ffe9c11a2fe4a21b30c88ef2fb28a3765b5eee4397012513dccf9a88bbb24de47e36dbcfd50fcb5aaac368c63b882e053d3c7af1e39a6f718b645f477602d7dd91f70cbc0b035742a77cbba6f17354141f304d213094b91b8232a7ade9411e06e60c38d791f83c34c7914d8e0f9a7fcd4a5dece68558640c3f74ce19f4d682d7c9db8f0e37260c79f46916c927cfe3633e998816af29074b1ed2047f16f7941750c0f9da80c39cbf7d356d4464f998ec686df1b4b5ead0d9e17223ac7081df4294b26d03601cc437a42afc142d80ebd54c035c0137be01ae3ea72196d8fab6a946d0bb7b9031f17af1627482a3a7d44d77264fb58d2118e9ba7d85251b1a0dad5c390083a0f543c05dbb4609e824768002566b1cdf5cb49a4eb231dc59cc73b86fb5333fd12fb81a160263674b28376cd65f0f7646179b4d2b1b5a0a5ae5a52f01239870882a66b3ba1f66cd5bb912d329f5db60df7ce91190d1bf29128b441ddfc48a7adcbf82be40ec3e40d13845409497b9f29145d5cddf6fbd9d77679380964fafd49fd362bf07fd63177088e2f18927e04474da90ee5e0828ac021f12e19357f0cf8781364c14b9c8ba247018aa901e02d1bef5cd069ede06575150edb915a28ece84d35d8e4019abf4f6ebbdf03a2a4a99aac90b4ca149204826cce01eb69de0535506c5bd6cffa009937dbc63b6c90da6a04e241124e72dcf71aaa603b4e34a185d7148b9cd71e0fcc6dd967f8bd12362b3f4d9fefedac6e39b76f6b316580f2a0b52dae136096711e711f603a9035ac8b318ff6b2bb332192c2796c201e34f8c1d3d36412261bd702e87837aca6f236c380015f154807d7020a2cfcb84a98b044f67d10371f80e6e122d6c75ea8d510dd2290f92fa478f4163fb9c0950fa946a16897ea60db071b701cd9c563a915b23ecb6796453e8ccbd778e85ca234dfe6f17ff8b0163a17501556759b5c94a565824d6f3877fd4b36ecdd2bcbfbd35916cc1d32986447d46ad32c455fdf9ffe199dad1d8d969a63ef066226cce70c1998789cf680e919c92c05b5909ad47802886f41f863a16988136d4f11574681910e04e92903c387eb0c4eebb8710b452c6bbf3859902ca163287d0b4411db68d3d27e449d0818290c3f44656f6b7550cf66193c4800c6270d83eeac365f1d01b34863a0d823e81d3772f0a0bde178a7096338c912a2015a592a0f77b03793587d3955e96cea81e4b63be4f157b0c9d6bfc650e6263027eb834ddeb3a6ef5076444796991c8b6d1cd8712ed04d4d9d7684235ff0eb852830e862a48fcbc85ce4f0331cffcd2bfdcb1a764a5316a7567842ffb176fb5d283a100d4dc89ceacb23d4576e00d5ca2ad0532b5e5e27077cbdd4450a8c11c79d99a1247a3abca1cebf3435f787ca3e95c764b41e1a0025e38a776b443e1045e52ca57e9e205cd2d4d2f4f503408ca353fae298e54c37bc674e033a2a288259a033e2b7391c22615efd126e0b379b0b01af1b9fdbef8a17a028f9aa024439b747a37a33e1b2f996f4b06d22686c3eaf5f7b2d4287a6cfcc971fbf02a01e607c4cce3068b4e55a6d57ab71858d45e345eabb3fb3bcffa2d0c44e3943362d05c3af2738d3e227f64b8d64685754bc774b2ed1384388804926aabb1c6b84e37c8091d819e5edefb40194f104a9f1bfef77501b20c7a9c0202b1a8e43195c559e903e253363ea8e49f2e17e78ac063a4b52524f027dfb865e5e78c07d28c86a78c217f931598e050e11baa3714b18032751842787ca876e265b2f85198dd8a773d9bbe952c983c9580632b98face669b8df95889dd627d884109af940ccdadfd75f861103004bccdf173ee863e5e9f5f80d710e09d977251306c1c9a5134ddfd8ec8efc6e4afa38fc6f7d930f05a5ce1e0d26e045a4e7ced4f990aad419362d1aa70e80960ff9575acfa964a2588fdd0ef49c5da4b2d88fd50af45a6d6be22dc815966050adbff288882d8a7067bf9a1f5a437a8c8397e99775115b71af688a2a1f9c5d1d679d8bd2270c1be87eccf44d48a13042a52e2da9a3cff758fe962177b6786b46e434f1949f05d6f6023f7518cc50c7d76979d0051c6f027b3c9074c40157164ff4c7428fdfed57b51efe909efe91fa500b351544773cae99622ace17b1df691932476e666899f8bbe36630ba1879a73986ca8bda0619c40fa4f9c1b4226fb191158c016cc7739616be6cd18f5dbc5974863383579b8996f21af0310aa44ca2eb57e7046e1038829f6048b6322ffca5d7cb7c836d8244893442d3a3ddeeb1d969262fbaefea4180e5490595ded142bc36f00df05634ec3a3f53bfaffc91dcef8a9ba2b4a45d177003aa9678958c7404ad784fbfefec95219d6de5251bb0a688aa80392c8862917e73b0a16a5ead0bea61c914a950a557e5037b4b4f26f5f03fd90b9361cf7f656900c8e7bf626a9d13add9ec50f19245229b3e04ded121f1fbced99d116f88dc1f9bedc417311c2a41782f5b7d0fa6253d7cf58b951b7b6285d4b06482a1b631098cea29aa24ab5f975c6d8baf0339eff8ee9d81c04d5474e51f3a0e8a07db6e7fa41f67fb35252d6146f327ec0abdb96323dceb27c25d77df79e49a6951d546b6da2ddcad6d652277bcc824de6ee106599e16181de2db88e4116a5e353903900f3f5c1d1e8bbd114dcb459c702497e3e29ff4ce4f701f3c2b6467844a4790bb16814c36b4b85ed8a050817a4edca319dd32846c311e898f7e896695e53dd55342349710b930da7d6f8d733909fb197e0b821248d13f05e86b41da96f7c08ed5f68e76eb13092ca6e58797f0606bfc3491806f0f3b3ef7120a880216886b783d392e385f555ac605fd1ccb156b7c0bda9a1f60fe9baca9adeea3288f8784504f30843de639b42681a9acbee623d8595ef3d06917eac2e581fec6f67c5ce3409f15fed774e8e1a3d5cfeacb679fb5d74619ac8ac0901a6720e4206aa31bb26b91272fe2db336501dddd1364138077950e7e77ab72dc02abb608039cd6cd857ae743b08988465126648677d651d5e0cd091bfda1edf9ef3c3443b2772d3d64f6e358a87fd9c408bd56d5adc3e20903c1bb5a2dac440f7621f007f7cbf4ae55ed8476253fbabf80a23c937a207d014d42d4d7422bf07502d0cd69847340e561c7b98fb3242af8f0b54e9b98b431c079843799a065299fa797ac3828d155905353d521126337afa54580b02143cc5b3bbf7dd45a1f17055946c2110e7b1ffec8d9d4f2dd694e9bbb3df8d84fda3b533723947b9fdc4361ac9fc4a6f4bc9e9e0a8b92541bffd002537011039b60e3bc72d7baa48e90a08ae162d976fe30c23bc6b9c04a19d11a95bc330a2c04cb82d548f0bb6c110a585fa8766a07ad07aff184a7272884acc47d12bc8414a8726462b7c24cd6bb14af459568df00775d6f6e0ba35dcd25953e7f22ebbce6c8942c6840f7838f033bd56f0a2c2345883e83f671c418f8555a29b948aaa16f1e214870084ad8ab874b73047e192e35263a9396ba25d9d26412a95f9d07743e8c78307f2168a562ebe498e14fc65dd21118d80ed48fd7352bcd29e5e3ccc68eb6f4d38b15f24537ef3d6aee5a91c9200cd8365e3e22439c9893d94d2f2af9fdd66c371b4013b40dffa0374b5d21f2d13704b5acef9e5fd9564d4db30135660ec6bdc9dd7042f12577813a1125e8b9f81193204f33c33f0e2d0a88701e831fb57f4fc9dfccf7030cb1be6403af36a75fc97c6b8081c84b67f83e350f3eb6758d38b36ac0f87e6874b2ceb4a90458a20763e718b9189c82325d48fdbfefe6554c3207e7f48cf4856979f3b89c398f8eb6cbb9fa26fc09fb7bbaf50bf364b9654e7622cb824b0889bcbe4182ecbcf64702e607c9f9a1a7bcf754384dee83a0537a6bb91afce0e3337004959e9dab5c66e24e63acd826992ed7faa6a4664862afc25f06fc406eddb2d1b95b807da61e73ba1344a7e3fe12bf83d2a4227b32a6a75430e9ddc55dc0247e7423752284bb67cd7b9cd2ca4d1378230e7c3c982d9a5ee31b2431f7ea6c966aaf8e27239f51f81ae6bf3688dc2e8cb5eabf0c61893670b5eb46a92cf016d43b5d81958e706481e6fd851a04e63122e8acfadf8664a39c3e739bcc81ffca088b9e200cbe6a0e8ceb7844c326675508a8bbe2ef6f1888efa1105f057ed44d055315c56d9777be114165628b9845998aaf33198333c2043a216308df4c6b8bdd08450b5539649ccd8541d910df174bb94a7e1b593b6e740f509d8a4de34d915a2c5107ab20ae3f90614a41bf8ee02ac64a12ccbba8b9e393999f5650aa6b952064b7833cb71ffe2336203976acb3952dc5c8b7e0a172277950cacee64c3b8d295d8e7d0a073b04a0f59f5d29ac86b23c9e10250015d516b932434473ee32fa991911c22d3f6bc04e96acb63461d23b71cbbc46aa2e9b0b59909777450adf82b3dd260afaa83e4e781f93ff13cc641f3923c7b3dac4ffba9195fe88fd9605c9d5b7a44143ede7be28ef5ac1ce0fa4255848a926959a47b9efb595de0a920d1d687948271784f6d35eb327601828b03b722d78043ddeed114f45604c991523d0e72ff6376cced05c83d0b57256f9aa0ceb1609fedd0c8eb4895a069e424cf045a0cb7dfd3c12f33c90eef6612341ae441a8606ce6b1a795cce61438790a37af5db43dca06a510d430d5233968fbf05161523ae2ab6dd8ffa19c96662593432644b443636c4c90c21c566d1be14643d36558a98e98679a72379faab3cc34a19db190d743a569cdcbb5eba88a7b080733d0f0451356347fcb4b102bcbd3d39a522a5d8600fd9429cde1c419354ce09d72ac26fedfdcbbb28d8aa5884d0a09d0ca61d928743e82884cf692b6f33f0411096f7ae621f7bf46cfe091d27b9d3af68c00edb9dc3474a245d1a53d4582b1a8cdf104ad7a14cb1485f31badb76fdd2f31be6016512163ae79f1295f403e2ece09666dd56fed4b1033331ae088c7b4cf8716a1796d159afd85af73dbb9a49d40429f70fffbae4561a875e38e080900860cf1e7a10f295cab1ba5a82a3dab2a5fa420aee2677d26cd6a911780b15a0beaafd2aa5a498605929f0a7f89f3a4239b6248e96cf1271ca4c704a0835c5bd946c83bcc8eb4465a7c7a735f5e55637102ff2344e4e6cc0d0d6bb6f6510a5f9fe28bc4a42c53b4a3c80c93149b92225c7cb89c1a5de35f85b0e6514c85f3a9edb3de770f93575cf0d1c92ef2b482f469ead63b0996c33e882f645b708045c4166e601759eae166ea5b9b8e05a493b62ff824c26936be9545be8356a53983b7061bddde177aef97e87543fa8801090da6770423510428247a505927fbeb49b41a51cdf81319afd14382439b4f001d6d9c5d0fb077a6cb6f808f11e50245289cb568f5284acb5470f64c5088d8f1493e92c9b822cf1fb5bb51b99c6cf14cb7170a82540afebaf3a3405622a9c5524162df5c48184ab4ef8e9f2a30224fba4a5865113d941b1e637d7eee5467b86f18536785869ff500983aa03c7f3c736f9f516c710548555a1373a7cf7475e38aa306b4e6f753bbcce2c5e86b326a63800651af6f0f1adc9fd64ca90bed797550cc47199e0c13ae8a360f9bf950fe682328f0a3d5a3399d446a7bc9cf5bdea3a188e0a38d600c56436657b805230a8caaedbc1bfd2499ecc79d981462bc54c46e792a08e5f2b2de4332ae2a24499161b19b4efd650cae48f68c80ed435351c074e0694bf52625622b2ce0e92a9cdd012bf81480c5d7fe6ac9628c447fa11b0aff3a353a6dceb59265f9197ab7a9f02bac73a51a780397bed553849a0ca5ffe9e50e932ec8d1265fcd42b929977c8508bc9fbff00e0dca37ade6d5ac2e9c44388cb3c2851374db833d38863b512a74f35b311c16b63c7a8bc4d2ec07a4b936e9203e7510cb1aa5f17d4851da9b2ba6918712ded407891b249ed6ad778a4236cf93983ab2607bd38beb8d69221a1f7a0454a1805b921ce65fb8e4978916912a1263fbe5dcff38eba65ebc8fddcda465abe7ce459b19bd2e3e15a395980a98e42dc593148c698d63fa8c4041bfc3a0f51e7a26a4d1a22d5d69b09e98cd8d4b9f81010046dbf7d8fbb6308028d724044409465c7e1dd23378e414161a8658b526efe08c958be9335bca70f8b28de95aa5aeb45d425a68d0d329c109b2b40a9cfaa7906cee160c54eb3a9a1f9175dc91c8aa3364a89210202813baa401205afaa5498e15890020f92f48ee1d509ff8ef5670e2be6905ffb7cfb6ed6923a5cf154b3364abaf6655f093159a3357c3825f6fc1857d39ecbcf9ef8272493931c0d883621bf78f704b25c011ae6ab253e0653b5ea02c1c72f1ae9ce9a172d6100e21fb4fdc267d5b7198dc01bdf66488781b3e04bff96a5b10d368521ab53a2b0cc264795d5787bcc73c920927bc94dd299bdf4e41a47c6cd0ce2f4b998b1c2e8dbda6b2e5282f16a17f3ca0261f7463642eed55537dec4c6af01d15879aab550dc1e15238284d4aa48cd331a7b66b3c279002e451337e82a22b075ac607a322ee2a0cad145118daa856c7a1434c2611a5afee7e4ac4630e389a028f7d55760c38ca268ac541ef11bd4ebc50c7081a5f1f2773e4f8f8b8406c1d1495f736a3c9d67ce74b3701f2ccd54c9e835784c54e5216a5261751c6785e3178226cdfb9e3afe75ab52e8b35daef8cecc88c5c31a8f37b71d86101c2b936585044739260e50b1121dea97c0aafd1342f44271f8c5016b0dd33b504efa6375222ac3949cc08fb0d210cf99de86ce1de4f9c09ffb67cf42adb978c7afefe5e784048a6ea3015573b0834627f9eaa824d23981386dc9f30ff086e50654b36d02bf4a937464343e4dbc92c892796889adf062d9e5f7b05bf0dd0caa04009a871ad392f881118ff092f5183f010d7324d16a657088c7b92b78398eda16ea5eccedda415fbfe5dc5d2efac181402c4c13aa5b7fd984afd1274a2abd6c044bdfca379c0b2effd7770a6ec6f6194f0faa9c8125f556d9a4a2e845435196b48aa26deb2773881aa958696f1fe61731855d12e1f0b61ec04809d86164715f04efc73368605e897c35b5687f0863fc3db183614cc2814846b5f1eb84aa2658e6d5be16f439c95089520551e144bcd9cb811f90fd71f1dbe7a010be3c2c676bd5bb41cb21fb62071a9f6d5b59debe8c74ce5b54da59fa48372b31a04395a176e97b6f1665224de388287ff289b994a5ed3874e60f1423bc2f6034293653046ccfc7b5d14aaec1534d7b584339391f60c6af32ecfdfad0ea0501622eb19683fb41e7ebc3583016b78fb977394abd6725661441c2d4882c81e0d025bb84b62af259dd36893fad82a27f8a3d02a184c12d10855c4a180790c81a1150ba9fc69c575011d00fc6614e3b7904ac820493eb1ee597dcbb521da2ff2913cfa82cc6adc85a67bce2cdf82bf17b60559b2e60a238e2256e0418668e207e56984a89dceb53d888d0a0bd1a50afa63404e8801b0b50e10cf502a6fbc3d76c7f9ccf258e14daa193835982c8fbdd7d413a04aa6472d36631bd0d43a0732e89d8d011d183319fc73118b01a849f7fb0b85938ead6862c696d8fec9ffb95f9db5b3f5836c61acd91e42e571fd0e4f8ec46a1bdaac36ae9c6028940a749c16be15d8fac7df7afdd6cbd675ac8c73dfba418073ae1c0533909cd7876efd15c280bedbe724f6ad251d9dc08d50eea6421fb942cf5168a21c87422f1db1c33e09841809912594f1dbc022e3c95ce68dc1148260018e8d46b7ffe6ea50812bc080cd85ad374b48efb60b6b68259f65fa5c928eb4610205bc3651ee06962e7e7b9e2fdb64708304969c3aa639c82bd9412a0ff913f8a7769c721e65279aa39ad24c8d35505591566a353d99955f61a2ba5fe965aa269506c53c6b20505af7cde5785faab6ab554640578101cc3b69aaf148537517fb3c02261b3c45c0fa8a52da746d1fa37d859571461f91070fa030f30acae2c7519e6340c8e75ad2fbe73560da38848a61092f478ee751431e5740f6d4bc411f992fee76e0791f86a2471ed03b25dfc8b78532c415f3339153f9fa7be27493571b21c93052eb31a31892b2c056b95299d950ee5901eaccfc52beeb249a9788eb4e4974c135e927a31d51a9fec41366dde5cce7ff1555bb3bea0d8d16be9dd46161a63aa0d3457d0ac8c0d712b20d6c9e23a5f5fc70f734030ea5a02885c0ce494a481c14a379221f8dec2dec890dff1c618db1fe2e6069861099e7e7644a745ae2635d14dddd7dc32ebf334870715329c108cdc8c2fe41f1a97f76b43ee6525c2ce2d116180e39ef544ee00a95180b4e7c4222052a454688d1547cbd4d4a4594d9243300658a32c45d870b43bcb8be0fdc58ca4bd047644442aaaa7c77e2e6282d2ec100726f682b41c541c11ab00eb61fcde58656827ab23f65960500cce635dfed443899a535d1501b406e4b0d073c06ff726e74f7bbe6149f423ae98b5f8e8bfaed35f94acc4f63839684a758c16732d03e021794e6f08bb35039d45da33269f453cce757f2949a26269215d84b217c12b499b55695cc24c5455866d9d225160418650f6e24c4c4e753dc8123123328d01086e091ae4e0bbe987aec32e757399b0c22038f26ad4970585223ccedde5ba0af9161500fed3dbad528c31e6e70e0945949742efb0d9106dc0b9dbe0e912bdb1ae8690e75586bc436ed9af75a3879483e86b60df25d0ba05355b841e944e9accbdedfffc081b87ee67d219a1e83ccf099d3007e4b1479d8e375f46c4538fdda574f68d462759ad797d66b72e5c293354c4c35e44456f55725dac93fa30442c66e82685268052a2eaea54e5b31fa46db0d3349cb234bc68cddd8197c3f5f8174456b66d1012251852dc6eea6af8545c028a3ed3bb0a91c00b8149b7e9f41dac8dc805545c48b553bb6c37af3b5fc76a5f0b315b58dc185dd764d3f49eb56da86f2d8bf766be9fe825f6c0077898f726d7e9946045eef74641564dd032cd11ec95aecb923b8ab100626262049ae9ddda38c4f1a61eac55fd8d7b972ce02f498bf1c3f4903117b37a352df3be57c42c2844653be3b696d420c7eebaa8ef3759d420efda02de10d9cf710fe80f35447815f363590875bb0b116d396c8110e0f6fcb0137e085a287411aec8027888139ad5ec7181f25c21ef0ccb32bbfdb8a9a0d76094ae29166fd3245e23d0ffd3390a3404b65291124b7b60e4ff5c160a58ff975e003f20b44c8b5b3ba6e9b621bb48ae9eed4aaf80de55f33c9a6b47652b5528deeab03323cdc5c2a955e8efdbf8f76fb138a8a5844bd484542e2dba69e213d0cfa1aa31ada78da50387bfbea88957ba1b64fde3582fa663ab85103260370b4bfc06b6975a79f8659b387596f76e994257aa8052f977fb18ea8282b4f3564e648e52c1d424958848ffe70a08556102662db2ff9c4cda687177a8ec778fd736abd36bcd2435664067fd8047cd920bd26ac7a5d8865e7be63f070c11e84842b0a39e16aaf8c8283d92ee762b0327fe44e62110a178f29fc56094ea33074b02e20cc1308fb43f7eb7bbb92095d36a2d6922aaa2b2b9b40ea2cc669e1158572d98a4db7ce5eb7aec173a4fb2281ab160da0a4ea54de43d4f0b15cf5af336c7bf42be7a69db95a2929c98002cf9c458074dd2ead8a7c720b5c103576d3776b1e346bc66eafaddcd09cceb0d337e809d17c3d2d20cd9bd2b87cf6b4a673d85b5f8550692a6b3db9a063e01433461414966cac424d3facf236e61a5d9a572c7181e45b7af436d23212e8a4c6dc95946773d51c01c65702b329371cd219b877f6a8abe6eae89d36247a92864c574d226fae1626444ee9eaf4557867da7bd0531a472d2a189720e45ab4d81045fb9bbd1836c138443b70dcfa2096ca68359fafd2140a6ba8d3c33d4d6c7dd4bb90a5da6f7f67eb125b9d9d7c72b7b1dbc6a13578bce848b478782819a1a4a39bc423cddd77aea4a3ad4c886b7cb96fd8c2abaf3be283f26d8e89506df6101c624b2be91812be05562aae88ba592971545064832b9af25619e2c398f5ed2a4756733c561f00a2b1f7a78176ab8e3c1d9be988ae2155ea4f250896932827ee6b8bc5b833d8caa16bba5f6002bf005592a5e210d7774839f2d700d05188a111820d24cafed53d0f5beadafd275c41356ed134f3fb55da238f939eb8e5f7a269449e8413b35cc8a3492966f6e27be322214cfd42236eda7a20628795de28d4a475ed0bb544efd0227bd03fb4a832d0a9a2bb050661a18edbfb832f0e2ac0564363f2eb01cf86c9c4b7138df393225e50a94a3e8d234f008e98f82ee183de7474b2be838d48e394258855caf1d94567a9e377f91d0f32815f7a3b9dea6c479ebccbc9e2166cad63aeb715b49a2463d40845ce0351a342ea1478a1938ec5849048d59c109af78ae29dc23d49cf1a6a06a629b0d497ee1658820638c2e6577c41c2b7a40d95c04914af32f458169ccc95774b98882498820712dbc0e19bc31fe91dabbe0740fd33d9a59466f4191dedcba20f405081188b2be447155ee7fa4daa83670f7c3db381d3d7420894d899ddc0891af419e95fbc18f116cbf9690cf7e77690453c6e8a9d7c7c0a9d5a6e47088c16024c5a61024d2dcb66e3c32dfc3315144e0f79a407de7134481ad988fbc2f77a5e85eca979387ae0ab873a7dcdb5549eee9d31b3288bd0071a570a7df5298d3b7f4409d3e414f98dd02aa4c4124db19c178598cc81d428e6d291efca0ce02521559f28d8190c620a2595ba72421c7066cf300e67e544c80d59063051dc94ae4fc6695ebc00670362fa7cb277d88dc3c214c2a9ec46c3c94177592822226eba9f399068347c2c6d9a05937ae9026fbb4003e0d75dc8a6c29a3ecf2202169f66c36bdeed4c9b08e10c34b4e01441d73d7e77264e05342d1d8dc8c696b68f12b1b9a07565323fe3e0e78cfc721ab13554c3a3fce7681a60911bb54c4a7c0a453a3bb22ce75379c6e5d27206ece7b0fb6a521e0a421f83280511bf9842634dd28f77e7156fc3bba64fc5d5c4a8e47f2fdc8691228671462784c92d8ff351a2c93b9d2fa6151299cf764da67e57c4cc5c735165c4fd5b669631f1728042657e52eef47b584b424a88e2802d1a2045f7bd6f4adc24888ff4a2919213aa95141acedc43a63fed61dae9e27a70000a3abf4b5d16628b8f5a61b635c9ba0df5024ebfc0c98101a98781898a010ac6c03564e066ca800cccc068ce003168e08534f0e679b60c7b73df60d60bba669f566c8007f7ff203ed28a2d14b71ac8c5ff179c235079a7b683e8a5f1eda5e6768574c4eba84cef6f82681404b661a980df2361a5fd14ff54a9dc0f8d28e4889008a1c30b5b1103fab435a0bf54fff9cb6a9fbfa0d6f94bea3b7fa9bef3976a3b7fa1b6f397d53c7f49cdf397d43c7f519de72fd479fe429d932dd43ad9927a932daa3559fbd48036c70baf7fe5e0a844b901cd5fb3255acc71929ed4e1b46533846240133ff39193e242570c35a79c8054ba7d1e3322f5f51943a5644fd29b6c656e3635d3bc3d595704c4856e2dc22f2a91a4d0beb40d4f8841d930ded6eeafc8e5250e23048780264200ac540525ad9fa3c80e4e6d9d19e65c28bc2d253a4109cf877a0c5e63c813c044eba944e2764c383691b66e8bceeab10b4923587935314395f241f5443b200b2c83a81f888dc4471392ff50c28f2bae67c10f561a148440e650f5d41ecb0e1f5edb58aa045cf20a4774c86d07f198ca30f81d1e4872b718c03280e1b1f40954fd1884567c05c1c560faddad2f454bb314367fd992a6efab0c916b4a191df9a73e7ce50bcbba1aafb14aa8afdeb26709ed7914241330c856ea3507bce40eb652c8b6f63810b2346af641b6f8939aa5e6a3a4651334a322590c75ef77041b2bb16952b7bd75eb8bb6055de583ea3831e5a6f71f375b9fbbd9d29dbbe46f39c1d83e86978aff826a57ead104dc245df484127175f5641e1c0d18ef22ab739c8de510e5dea474b7da3ebf386f1692e08249eda8f9c083dbe4018a0826e426e8f7fd6fd9b7e3594c0132941fba010d7dfd20c3619b4b726a4a49c0d60b56aa2fcc6e2926ff87892df222e2717da27f8a96351fe674dfbb134c6d5a4513b92c54c37dc4b2a16c80d07bc5b5c5415e0345c145bef44eb976070e9c700eaa614b1c7520fdc743f72ff5893a059b5cdccd5e08a8407584dec74615c48bf1d312be66e10ac49b05beed66358c1e4a226fa923192c067a82037d89c657954f9172b85cdfd06570f97e323618637f1c041b52536f47047f39fff48082ed0b8356869d8c3c54eeed1767043c42af60a1a2956fafd3b5b5e81a230403860464f541a192c55f5d740094739f3e891866ca4919b93c46b8d906e90868eea07b2136f12100e932f610a4feb5221b2350a1344a989ea6da48725cba3a38b7066d6cc12627efba7c3eb7a0d4d8fab9c0d701d5817f4833c3d5d00eae70fc62ea404a8ba2b5c41c5f412b45abc7151fdf645954c7822a7fe080de8a58f29bddeeb4d757f730d68734e09dfa3f4d329eba52aa60b2e3cbe50000145e4671368e4af84e8ef1545b098fd79f53e9df44d6f605e12bd61faac942d76c75e6bc3b06bca3dd6d0a11a080ca2813444a4c4ea2168aec47fe6879f83d8d17f84e62bcd7b5d0d92d31e9c0138898a28d44d7a11f050359f7ad41ab8d03a6b53d56f412b37b0beeac2cf5127b7735b2b859438649ffce498e9773f6306ce230790839b9c3b6c19b2fbca616d6fb82d1ba26f923f495e5a65cc87972914d5f930476aee3a6999d8b1b0814e4e718535801a4de4a6baaf7b5e991cdaa27ff99b76977272a2fd4a9b38b0f981cd2fa8c074a5b615352304cd7d5ed2274d67084831c089c1b038f7406df9580ec6cecc48afbf47d27bbe71b0f23614e569097b3314e918fa83b24f7ffc20265140ef3137c712bccc41bf0254f414ce53ea323cf3e80879a04f8cd3b8452a339be904cca2d95e4c76b71c186fb34bc16872056e8f0c695e31b28ab82dc13e6bdea25a3b13d5eb50c29bddb00ae216c43d654f52c05d1e95b3904d19abfa17cc4439f8521a3b5abc144d2c04734803d42ea0fd29798a03a3d4f20c1d596381da7a42cc36e11bdd64934eb0cdcfc202ba04acc3f080a22da478df2f394a566a2900708f9d8966934cfe9481be8d654387ca792eaa54a023755b25cab04e4b54a049f5522f8ac12c16b9588fc55c9e9ab4a7adfaa54fa55a5d2bf2a157e55a9e4ab4ae5cad25315a5d13562223d82a23ada232d3a4474241dfc197604798e9601268f7a0c527b613c06e12035afd99ea46e7d498c756d439accd24473228647b4d28104f13be30995af19258966d8766365684a908b4b42feb8d420914f713f382257794cd5ae4bb2fa804974c99f37ba910ee8971459fe971e09c3cae18cd3b154aec15223a88cb54f23788970fa5a444981a7dd9912b0070c50ffb2436df052a8bd774028c93d8484a2d4e30f397c32773c78957a299c206e3480ba56603d8b6cdcee3104548fb0b046af7fa15905c058bd6e145233593818be1084018c5100e82f50009e2d588ec66b13783baa46eedc4a3ee2f5e05884283511cfc63c76bbc170718ec9910fa830bf46b45cb52a66f12e459d192c195cecfb70a7e55f521ca75ea64ec027253cb125543472e3d004125cc744d2ae2492f4eb1a4595f3cc2e49c91c24e7bcf1152ee8c588530a4f209052a88b66b64e29477a628f1c69dd18824f0736d9e3d425769c8dd4562f20321398d5c4480ba5c0484d966da845e3ad81eda7c9b00d9db8f920595a99c90af0fb881288b5cf59cb12e47e6ef0197f301f9c933ae989e5935660197e7d6528ac2b01a065cde44b0b5d9c6e1481ac7a442a10d3045e6c96c659d4299505dd9ba9fa67ce4f6239846f1eee67f96a8bd4acac6c63a775498c7ce03c69d2dd1c237e95429015dcc9d2b45febd5869ab62209bc9f8cd28666feab1ec6f5554b673f5e6ef5d2f8b3c414da9985f26d3154272b9817d78c640201e7230b04e17ddf04b41d4a9404be1762d458001ba55cc5fb354a830827eb41ab509b069817069b38d8ee28b54629893f643bb0dd8b7c7143fe2917b27aa48a912bc869cd24c44a9e787692a2a40a75d3fd14000d245b8fe85b083e13e9c62b92396fdc1e7b02b443374eb3a910dee1d285c46df36eddb66c52b7272e1bfba6cce1210e74f1a61435f717989fe156c284d2ee33ac1ec60db7cb5dbbecb81ec00ae03ca5bdf1b45bc718a5c39f3f21eb7da62d52a77631584700e7c0744fd7ef084222190eb03afcb6d3eb0a93e5dc32c2c7cd0adff6b9a56218481aff0f4d104e5dbe9ab333350ca3548badc7e41e5bd838748911b74a5143d0da88c97aebfc89937eca4e00c6c9e01fdb76338e1b8be7f1f2889d59a9bf21cb87ce38d1f46d65e53ad34bc74fa14addce94f77d3b7373d0a0f414104f11b0cd44a0be16b204bfe82ef65d1d65b35a500cd0185f0d8a04e100bcce890c3422856b4477ac7245fcd277576fb53ed15cc40159889fccafaa415214d9c9a11f66bc004d805183eb6c812060465b7cbd1c8f8b96df5a96f8562c6ddf4a5138e7a41c495b89d5efe72368a080569405dbbaa5e351cafd93824ba748515f13aee34103710320fe1bbd3d10ba49a0f6eee6205b156d457bf57689fdad39e2f29b04b651dd9d70bc2cd08588985388d5a2adac0701fc5e65d5d322bc58981bf13e6b0d6925e9c6ed2f3fa82ee57f8c6535c1cd63a531fec08e04afc0ef01ace83d9c94ab187661d642bd2b5e5b96199179c567a9cf21c9f99c26abd31581b6f937ee72c9611ab95c612eb9dba3bebc143e6e583e0135a97352742d01054e0315e02c4128b970bbd901a6ee1842af84e2fef733d1c53251d9c21e0f1234c927b4d027c3198aeedc0c214bc3709a89ca64e518b77806408cfb797dc2d820404334f29616ff52381da8308a7928aadaf4668874248be85d6504f1ff6c8ce813b236853845c1d485cd42cd2d10ce779a9682e1bdda719c84c0bc5551876faef51c320b98a7122e0b36ed29f7bbfb8423cf4ed2406e471a8126c062590c30a047fc5a7fe6961374632084d3da2634e6074f88aca84b0b16e92d643949713c3969fea9f430535dd140608618bfd06d7c884a4e4135922cf277eee5956e2bdbd86704f4932157870d6391446795b979bb3b96df2ff8a25a903d7d02daa998a7460cb01eea79050323e8c9f1eec17fc154974604d57baab8754399c303ae8b978e3455d5a0935eac83866dee6e966d34cd99a725aa4138031cf79b0b708c6a2eaba8c1da4127694443e69b934a9122bb0084e98355efe41dfc0ea3617d29a27b1300e5b204b29bc92d8407a52b9367d29de022029a45e7aca23da0468113d84d64e09064de767d8cb585c85943c86da143b8e0ec06f87a3a7e4726ed7c3af2b4777eb8dd5b9bf455438788748e59015556b5652e81869b1c86c75cd89e6eb034926ff0e01fd98050d5848190e5d376811e80c8ef24a71bd11c3785ea2697a726349d9e76e608869e9301287309e1086d56dc4e01a05207f6f3f46981957a5ceb6f69f308428e0e6bc383af424c79134825e284a4bc3ea0e5e554fe8403037ad04aaf7780b6efab8df83d19c888f52793264595bea04695ab8d36f6933a74a346f308523e7fff8d438d4a58cd693e534294ea7a54a539cfc20aa01aa6c5098e1298bb40de57208cbd9f398b25504946c0015781202b7f041fc204a425faf31121122212665e36e1d8207e4200a9c6900ce4c5a17d3371be58a1a0aafcfe097d8f41a47e91f1cf5443fcdd10a01fe745173d876902ff33164d57371a42bb1c0361a99afb0234a928cb006c10f12734a0587e7a2437e6022ea52cf1e060381fcac430ec66900f4bf0c68c3b4cbe824ecfd2999ba0ced695ba6ee8fc845cfa885f564710eca9ad9a3f2e3f1744c7afc766f4532e38a84fa8f3d56b9d31274616c427985ce650f69b593006130d6895b652423a8767400d3ac2d56139c6deeb31ff1349c917e3580a34e0f38b627b4aa816d0ab11c165ed813b5080f0f314bce35ce424a23bdf90079aea329c2938e94a3164197d1bfdfce471e1fac571020fcb413f6556ed79003269c919075ba29240b60329150edb81e89c2c79304ef40570d612d73e489987d431a9b850909d9a31a921e54cba93ba97f109a4af8702b9f1fe7061c3e05233016b825f4c469e45645fbad5c41f84e851e441660396732808300af64e3ad6585155832d783524d2e274323ce81c7c600caa6384ecee28a2b03c5875fb22447090dc9928698f238070753b00de20c247d5f75f0b2f23a59e81d54b765d9d0d2bb341d89c2c6b3f6c99c58a85a1df82caa9cf7175a7f9bc747ad447e8c60bece86c140819cf8bec557868eef1e458d28f8e53ba9a89807b1974b7eac207d618218d6aff694446f29874670f9ba45bf327919b8a11405a9b0c203add00a64bc8cb22a067752edf46c34573ebd6380a39cc9f39850e99741271a8014ba16983cadac881ba44aa36fca43826a089c782957a0586b7315a0d4462f634a67e61b1296dcced6561807612974288167965d26a437784c3a13f4bf51c35930b6a4cf4878495bb90225c33b8380af76a8b5a584eb0dedbfbf71c0ac21e8d94c943fd5a60785bd6035a5fbf626da528b629c3fc7a033e8f6b5779023c80f2c16d813cd64b7bc65545a7dc19e0f5bc461cae0368045827aae8f3de13e807e266a9c048334dec8c62f68d7fa013e599465c3d879ca5a270cc6c00091c47d97b37871635a66632e90a5ab5a025d136756b7c9d716434cf059ec4d5238f914733a1d59d9c30584df63a9800000f6a12b23b7d7e7f86403c7a95a20d8ab099b81c06bbdefd9be02bebdce4b99802a4ab41541c7aad518565d8c7e6b01274d5eba5b5a170d6a70f310027255d49f82e0dd9312098b0b5a0e4e7339f6d9bf82fe382ac4ca008d7610188ef15f52c5e953a2bb1084f9f9688a32056f312931f577fee0b7b5856e9d5f72c9c5b851bf14c1c84d207cc015584d10f01e2c1f4156c6f33caf71f42144925d53b54c4491e9142e50a68dfa396864597c2582bc15144637b37a2124e0b617658574993b30811b7e3defe4f73185403e4509af044613144c5dd8271f3c4e77224e0e0a655df15366ff554113730115a35609013eda3814504da99555e84c16bd2abc89221b1ab042ef1e8c0aa994c79dec7cba36def8f22c2f7bde662ee086e1a09ef5363835f12b2014767d2c78aef119458d76d42c66a5763022d69504ea1d4f2c74ce14d84cf9a16e262e095a9ca69509ab273cd221187354006bb70daf8414e64a6fc98e1ae853bb29a6a874867dccf045f8989335a1f45096f350622fb84c69ca00d3a5652c43a36d16e495377ba9604bf483d4a16282bc710b2afdccef9447c0f145bbf467c2087e15738e069783400f8bf0820eedaa5c53b691621116c36db491a04771049e667d4f6cd781abcbd38d7803f842a8249d98828b80cdf7914b5bbe353f4ca45f87c3347e9a9f25be53428b23b2d5df9d66201638d6a414ee8af2fa242fac3532bcbb1f8a51654c2b7f4ee40f49a65439365fc8878fef7c160e7d41bffc8892c8e8bf24c38159c8f5f72dd8d5cdca2a329d3feede928667e7315bfcb4c1f9a5fe5b696278788979319ab26a478a5fe5b78a1a794d611974336a4285156738ea9c0e725d215cdff09ad3344391de2713cbdbc4e6c8c9c419367d708027d59deb9695ccdddb344fd3751415fe012c2ce392d7d3b7f85e541b45f1d74aa39a192548ff62854db64de769567c64681182a86c144e2c61db939507655c762ebebc98190b1675d30ebc58512870193574cdbac2e89581277dcc477dca193bce3278c287fc98986f4f5131fef29a9300559def282cdc205f48fa415b9e1df11d27ca5ac7693766ce6eeb9fc5d43823a82f0c88a91a0e270285cff9a4aa0a9d86519287b38f8b9a5ff489092b9fd32f4e2bd205b5a0c058ae1164d041104890477698d6d1a511f690280164c715809bb9ad5b78853f9cb240bf93b9c5e676059003666afd28b2768ba24d465e55253050e0f75a78f6256bde2b4ae25bc9d6c7a489153d01ad5a16d83ad4cc9b7ef072fee17616189e926882549299b71906ba2f3f817ea348d8a930145f443c56629da4a82335b54d8728c777fa67f186ceeed29e65a0851d2aefe8f8f4b9fca86e13a29f3a3f6d8dd7aab4e36910910100bb8370c68a31d18b5c7c952e7859fc32c081451fa8a576342c7ef89c75104ecd04ddf4ead680987cd58c681c50d930f8fb3500f72fb14e0fbf42dc7d640301d981dfa04e8dd49bd560b33912969644b79d098c6ad977a3a74e1de188dbff733700c7141b905c3b3620776455e8a8573bde93e12a37efb40146c952c82d791aea8c512314acc835774c65766ba8415e6ca9c5fd88ba185955d0eb449205e7ecec458d1290c2c8f4f9199849ec0db49c24180d4c736825f34b40f271aac3e73982afa788b1faab9d5427a0dd7fc4fd52a8a7eeecf16cd1034233fa24e470241e8e8bc51c35b40afab5f682f4234f23a6b9d3e491ee10b8392ccc87021cdf1d3369dd97ac6a1a52fc6a4b1569c03bc9de6a20edd5531cafb1d33500765b43afb93939d0389b4f1f26b6a0990506348a22812f1c765ed3571b5aeaebbfa83ae95e8184146b1fbbc20b41ae412c83f5e427bd80f5f66a3cdd5ec4be6601b78b4eace149547c349e01a186ec6a3b3b11688fca762081a848a010cbfdd239d642c3658c56466b11965413ceb9cd00e512b4e83bdf0e3ba5a5b7b1396938fa995b30ba2fd1aa7a3b0aef8eecb15fa3f9ce3b6a139c47972848425d3e6a0f9a8c5f549c28c667f2e2d3574bea678cb4e1b38be0eb84d408408e7554b65d8c3641cce335053cf8b9282027a356211e871bf1970b2894d3151c3faea387c83b203d0acf55606b31178f84d3efe8ed92e9d1ac1b3c83d20270dba0d01c45ff895f5c87db7080d21c9fa1aa4c8d99667236941fc9f646d96c0de208cb3f4a9d7e5a1767860e75d6694d69d94279c3bd95ea825898cddb408f30102b58879240f8e1cd13b264ec3726a822d011e55b84580c4fc20d880f00bb82a246fd364a534eb809256a2792517058c9b998571ce4c2d7e7e615885974970b9acc7fad4ef7edc8f43bc2761d0c1a1407d00be58d28fafa056bb884265050eb46e08e0215578e453e18e3739b144da51d60a4a1afa034567cfad78fec0c4b35120793036911e29f853291cb9cbc9d7640ab3271151d0d0bf4468f10e45da35dce53638d73b24a323e2b41b3697c45201eada5e2ceec77222fe6790e444404a41dba66b70df8c55aa53a8601320e2ae6fd54a217d05493e5a900c10c161201b2ae6261231359b8b0ad647948be4d508848d1c9495a1687b5daf8e7a083220569f7248909d111f07f17e1a67d7d0ea0edb8c584ede05427e25d04563e3569ca8350e38a769640ebc60f5ef9b62c58e85d8dcde23c83edc4133aed7e22de649573fb98bab9d482d740ed1ba6df61cc5e99af47209ca009389dffe3de307ad5edb85ab5402b4263eefced3b502b899254894adb1e79deea7fc4942871b266fda1340b35ffa4408c98c82b8dd9c61a143ac608123b0046d4c003c73213cbfb42b28bd36ba917af3bb91b720123f6ca7cb87870d9d67879db37979a6847b46e549e07da357a7f079e5e1e59fd670cae80d0ba400c63a21ca534b59929c72fc6531529dd0fed42c575ed1cc9a3b42946e83739a6c1e748f1b051da0e489a2b81f82a7bd80c2ae82654c2c40bb76213f368eb6392d538861941960b1eb57adce1dc9519eb548e29df1686c6885a74d32754f32b5650e6ee61eaea3e948833eb3778377b08378c69ab157fce282d87ba4f5c246a506d930d8b0fdc889e2dde7f626a4489247b428c4d1119efd22e1f31f4fc97e836a7d217db7b960becc061370bf0e1fa08db170fb33f1a665da24f94a3616c7fd50e08d085d5db4364da3f936df5b1b36ab1b5c5c23d08f33df8db815026dbb5427f2b105cb0a383c8ec4b552c66d50a9700898d9281fa8431aed3552e457d989c489959656010bb9b84121ed40ed104c5b7c20554763a383d75fc0456749a15eabb4411811b2f45e799341341b98b967f934ce9b7b63cdc9ccac0e69d785193a550647a02a803382f6c6c654cab0d02a73a688b822023250b1b24c1c627cd656a8ec50ee922b2c6a2a532ce1ab86ea5c0ced4115d3d496575b60e98f2f5662d44301dcd34d65481cee89430e4e5bada79fe7e046a2f5efd7c94646d1b263e0380863bdaf6bebf0f1e3b268775eb3b9dcfce03c4268898f104bbecb462cd2f8707f94cc5dd139569b3943fe03d4fd723cf25b62358aa9e3e9db828be56a8fec8c6f194413586e9994c9a60de1518220791b3a476d8421040e32b42734b31421fe84ff63fb6aef5cb6c745fa7b2997b44175afdb34d1fc916ef68a4843489974395bbf9f2a737203e13ef696e9e4d949bff27fb786dff346c079a6dffa395488cad9e968b149ab64752e8c6aad6607308d39eec4e40b785dae35ccfa4a4f7d7129588ec6e03594c34d9d466e34a783a1e4b73e2a05df1154ae14f5a292c4d1b0e86a5d3f98ce41870d06c77394d4c42a20d07f08a7982037d4725f18a0f9c9935aa8857a29d4e246c97f8032ff8042b07acc43606a33f5100df8cd4504fc6995e3a732257f9bf4dd78de8d1ee6d2e89601dbb8db20f4dbdc0e9729473c5fba04c2476d1f37d6cf943c60c1f91ad21fa40e48126825c4ae18012d49a07e6e2d56af995824b33ce43c084f9e3404193771e53d164e09ecc76f3197848cd23fd89510543d4cb5ba48a95da0e1cb53b0bbe48e5e6d13d21f701b15e8fd41459bbfba57207de9642bbdb3b8d8669935a9dcd3c213c56df62e19656e53fb8bcfac637fa53ce604103a7d9d991cbb6b1b091b0c6e7686204c067f03aa178bde3f2ee76e1277bdcfd7a37b8c30e388abfeab8a0dadb6b8670274302f1aed1185af0abcdf754b39b658bab97b1aa94c8a5579ed0f831bc2cf845e6150e2c896b07d72a76862cf9665f9c561ef4102c63c85fe9808dd195ad2c9a94562a10996498d075f0c7ba53494f2c502ad40c2d7446ba1e9d5466679506cd5b038267fc44a64c56f4908016e52169c90b44e95d8e710736f963c2951788829f28563253415436a5016080019fa5f627237280380885caf45a1ee1a325cba992f4d971baddc54f782b825f085eeb2b2116ec145605a026d403bc8bfc84f21c272ebe14cab5893b75c529b4bf87eef282c6aff8777bb44a2b17df3423b6099a8f89ffd937854750064d51bbe7fc3bd653b70215fb31663a262e4b633ca7c5a57eadbe35e1ace62d2d3ab8eae8211f590d3e698b82d0a9875ccfec4158598552ed498476dc5f298e0665f4b218087b297f33a6e8362243bfe7b0d6c19b7b37f0d95ab50acf05fb97f1ea9008f030c096d0b9522008f78e11c1dfcae529643352e1e6da8d227aa1163e6138891a2d835af726382aa408398d3ec25727f012f7915dd0e3cfae59c0e0dafe252514d7becd521ea0a396e537c171e1bcf515d0802dbfa9a4c5696acb5e831ad203546de9b2e6ba54a6aad1bad138841d6b28f327d6cd595458108d0d95b56f79d49fa245afcbabccf4848747f1d03233dcbfaee0c32790287b8af50554bf587a8c3e8b1094ddedfc6dde1ef3bcf7542afff0c035bff19074b99fb4f619bc77eee92e4c069e106893845337d866ed16cb3c534f8b1fb056a1198e12505b4fb287a01ee0a55d6cac2381f30940b738ffc05451ebbafad13ebe21863e35c61bf5945fe419e2ce38a2ce202af2c8717bc83f0685264deca68e78d1059b5082ec681df822374a79de29d43729babcb16fadf17ab34e5f07c4d8a398afd53e2155e90da3410df1417dde07d09758ed1eb190b5b2080cba19e54ba38b8ffd942e21a53de2fab6821aa2ed615e51148b3c863c086146887c2cd599c4590bd2904540de7128ccdff941a1bb0e02ef8e628a25a61125f3e9070dc6895afc847eca36bd0da7942a6af7661ff4e72e364a1d06af6f01fc9408c04cb01e6520c38004b423a973a1aa7465134b02a73e4a637c99210f243075783442b733a0853253cfdb24ffef2d1d53aaad60b619fb90770e9e6d6ed91035b5a123fc7255b78ca3093f327165aef9f56db65dbd51ba01d3bb952ff4ee09b9e2d490d4c2a36bdd9659ad9d6515ba80881989fb5f55492f6ffa237c5cf2a0a40b75b4815a2efa27c4724c3c71a4e46e55490dd3258b8b51ec38f1cf9ea2972983aff81c186c3499b53ea2d6746b65088669950341b2070d1be14dfbe20f2c2af3194bbf553f997f7e8ee46e04e4c261168d34cc4a38962e8b2af00b2bca05f31b4f0d2149897888d7e412e665ea810fea38c7ea174a0136c2236aa5696ea3d0c26e1767edded4ca3cb590eab5533572a8f5f9d0ff10c2aa4fbc96c0550d7fa4e2611ec024af08a67e483f2f0cea7c9bbeced4a985d66392f009c475f760eaa92ce0cca8bf93dd90e8a3f8cf8135946eccb8b435150b52af6c31e6f83da61518ec8b8d9e3d4758d3f68a1e357a75a21ef269d5ebf53291a0d4c9f630d01a502d8780a905ffeb948a158553c6f755ea209ce99f52b57b449e00221fb95cbdaa093fdb225c68a3b710dd46330cb8c229053ac0bae8b1495573d0f317a850f39ca022b9c688308c72697b773980e13a99076b2cd8585b34323dfdaaafcf16e342d7511d51f0ba8e771bc2870badef1d4d107d48de4cfa1d65eb7d733644ed588137784d06e727f13c4523f257c3d69f729860279293b9d57263b050a486ccd3662e7812440aeee89a90537524d3ebf74e901bac65ad3db0ee2aec81451059303d527655e792a323cc9ff07226928f2ccc455b88c923bc415d5115dcf8ad8301ded96419951b947f2659f3c3bc448b500d4174a3477930b23610974485510bc408db16a490c2e8c6739e4d806edf3ec24a40c450bfc7dc52a2dadaf58f472ac2d47c490610a6524351ac219e48f6bf00b1c84fa74b02c4a8f9672950b82c9d8c4d02ca7cc978cb095b45b48918c215fb15755500b0ae91cfc7a60854d911a8ac748c4ae393df12058f7cbd4441aa11048420d7028d7be258e87cd74411dc1e20c8641d46f54e4049055296d2d6236c5562da0d7d660c229e470534ab108643969710a39887583ad01a1be7315a188f8d421ae7662265613e50b6c796a24a5c2d64ff9d21fe9f761e8e63c2be10e434fd0406d02e6ed441102ed9cecc74cf23cc2878a817cbc3bbdf8998e6815c413e21c3a151eba6dc585ebe020d27a71ca13ba96ac09c5c65ba86c73a8419128c6f6af0b09bc86853ebfca9a0aabfcb040a800ea7abda95deb649b81ea1441c9f4d82e75e1f46acfbdcb0ce54a80fcef4eb24acb76305524ace24647abaa1a500ed52a402a92723d5d2bcc6ec0b1a722c928f9334cf96e8bd55a4dbe677ecbf98c8d7b2687f80e8679118ee2fd385b5e3fc5f010627c7550918847288249a031abebbd60dbe41a3a2fbd28869986adf9bd4b406c5e59784e755cdc479c0ce966629dbe1b03917d85819c2d1193bfa4a53c8ca111917ca8c3c7a7b03d81240914b92311c8ff41b54320c9f2c3f6d7886a41391fa048595ce180aed2991d44a2e4507443b376fc269d1b3946198242a605d04b658ef2a1360dec73d08f8d51c4d0beadc86c20e6e058c04bd5e4b2b6e39595d3a3e27d974925153bee2aef3c24e42b3b575e1316d7c23b246925e1ddf60b218fdcd739a6174e605e1d9d59aeee29ccb9dab74926ce501c33ccfeef65b476250bf6665cefc0d55a31a8b20aa238653fc92d4e5751e06584d06675399b3294f0a2ab5ef6b748bbe3d0878699b7b7418e8cb06527025d146b514d1458d0d02621dd982218e266f6ef1d314676336b64791846ac87f1c3cbeb4c2b6185a4a3da0fad32c3900e36f63d54b0c3115acc6604aad0d1cead16b361b9cc3a6504dc475b81a58df0b6d0dd05630f481caed4b444570bdc65320af1b6990ac41fbdd7723bdc8d16b9424eb7d76c0c6f5c9f66d6ff37f4f47bb5b79d6ca610a2ba634024308166fc02582ed286f55ed157a408040c12f60bda079a107188f45fc820d6ca223f4158fc0117e0cb4aedecacac25b1efa1eb7f909e934c0056491d40911072178dd5d2352bb34c1807592c70487d5724b0725488025335580476667b516733e26d5ee250d143bd12ed95e53f7cf45335b180f71e93a1359609237954eb3f83497ad14274649a9faef0c11b332ff7a5667347ebd0dc712ef22faa2abbcfce0666f4e8c08ccddf539c73a84fa23128adecd4b5606b29f8ba933bba6cf520d3bdc17f9ed08c4465982ebe12a7cd24445c740d3d91a0a4c8a730a72282c54b4a96f35e790c8073f66c8833046e0344688ce83ce01bb90dd2e8c05bfee549660c3abb3f243eb86ff6e40df5c42bbac6e861e1d7f5eab384fd9dc9969d5b087a5104064916e58b545f813cd79f2624a7747ee5544b87b31d2c9ae9d062e8138ce51535e2308668161242adb20e9ac77ffbd7d20e030dec5a864e3ebde9333602a25db844d09d6bce6dd07a668684c6fd113185f8548e85dcf0eca8f24f38748228eacd4fcb4ecff2fc0678213207c5b6b8cf93257cf77cfc4580e41c13b420ff9871790909811151637ac9918a59e055e1fe27afa809d5b0bd53d7e55105fd6125dadcc6d6dcf1a3df504f67b6c2db7410f4795e866f7df0aad42e38b250804ca0cb1a794bddc65a8a92774698364f5288659f09aaec5281ffd8ff21dba823ca8fd5061d896cab857e6b103d7621d6d80b2904f60459f867700192edfa319eb1563f7ad45f85b4bee667b252122bdaf02f7832b74c734858dd3209abbca4970953066d503f783564229d79a58382dea35a7c34fe2e9d45f3096c2c65234b20e0f189e105b8b1aa5e3c794ba8c04656deb041318673c3dfc9e1cfb54ad9681ffbbca0a1926867395313e45834c4bedc46d2e1d0ab2a41605496f0ea6d68ad9a34406dafd45cdcee3de3d144c515d0c84eee0e01a12a53a8f13fdeb2df4680ed8d85d9b9fbedb14462ea6cbef4d4f6126b11265c30653aa0911d59f172d1c0d48b9d204fa53f9c8be3053b524723e6cf56a16061e881fae1dfbeaa032d6ba7cfa62aa85fe06ce45da4570f15e6e9110dc0642923d5453bc72db37aa7b6fbd7332d31f976c731f541c482e9908a80a875e472c4ee71c8b348e2cf78f667016cf8b739795148187e01c388cfa2779d13d8fec79df7392445108e8a4c53aa99b4477f27a4df0112cf7b4cd38e9885d3dda24d4db15ce3c32591f1a64e3aa2894438da4a591d6c14e1f42d0a3c671cefa1b9e7b71e5b281aba0e484973223d75705d7049f3c9613c728fa0b8e1ef2007f3800353b9664e3322a48c841e6fe23cb211212267015ff443e866b1bade3f5b384308aaf16b80c07951b11096a411a81411a3000aba807fd7098e821cfb37c21a9659f64685298846413cf7c5a17267fa254db6cd48f8f562cbb86886646b5308afee6de886bffde515a772aa4789fe91209d2d822320e11942d71903d4e4f9712d89afa01a7f67e18578b901271508f98e3bc632b4b0196cf0803f5fc1402c9b511b5b2fd2b0414fac642b47d444004968a155c5c0e5ecd08edff7398add648acb2b3647a0b96da81194522c08a6c2e76f83221a90b9559a561a68ebc5d9e0bf961c06de9a0ee72c96fbcbcceb2fa7aa3a8f49daafcd1df4d8e36784981bd5d79d2a6d3dd002981aba7b354ca77262149738e5637b502bed7fcf78da1a765aa2531b0aa9a97c77a58892e8bf40ef48d6159bd7b85bfd1e009679cca61ac83ef850311a8ab389b5a5f03f718fb513d122bafdc0178c62e7aede6d64f57f75291e25fea941056030726d0bdd99b66236c991423b4aafabab1c1c75f2afa8786c51a508178191eb1b972eb6c14b0b1ecc9c87f46bc4dd9c5dd8f689419ffe3475fc24f5fc69871c94f07239d9cfffab0406e9670a515978ddc47e6aad4a4435bb99018048ce45c9c0ee75ef96a0553407c46a7953c080340a72b1f26526d14a31f3456d758f4aed961753b94e4d434736f7cab5ce0e68e942b268479b5ce26bce7076986eaa9aae7b832ab4603e0f37d98f8b9bf535eb2d9baa3753b57e3c155234a7c3e222006c3f83a2c37506759e5dbbd7dee9fb4d84b8da6d8bcaf71414df9f5ba36327112fc7c3138bb4bbb4c341518efa64b11cd716154656b08955842fcd3022be3e74bef20e3cac80888b671de43e5214ae2eefde0be2d6c204d99116c69984b58ce707afa33acae79eae5d3c71f222a0105753e7f5550be663e5dc1ec19060455cb954c5f37b83fc0254b7bd609067aeb8c8b8e6c605b735e9cf4143a6a95bdfe989449a7cd38d0f106253bba13ef60add3b409584a8faf0013cc40228446b19d2fda7df3334715afbe1d53f06064e2904a0348690e5c398f6f7377528643e2eb8f5afbf7d7ad2c93cc48973cd34c6e0d1ab1594b82bacd8863e00da7046161a282735f11401f5de7e0a0db0f23fdb936ae67d77768dde695a914c5b61708b2453156acdbfd404f671c9326c58c1bd45e135b9594c32c7db1c375863797ed0d5741641f2e8f7cb902d498c2e26cbbd2bbb58253e84b0644189e24e95d88127fce87d8cfda9705b259d58b0595cc5bf1e437fae64c6b8eb650cc7c2f9b20632278209b0829726b26fa3afd8c44fe2fc1a6d22821f10a2ee30cc681df271cf0b74eb711b773e99a72044232760137f059eb3ae4ca1885863c528979c1afd56bbc3dc59b7374b9187c18d3dc0efe0abffb90ea0757a4f403a62cbb256701df474aa3c88f1f24b963e7915e40cc89bb881558513acfc6e88d714e564f0984a62d61a7087b1528384f036e8852db4939bff00badc13723c6c840cd93655a6730743316c6fb5beedca203b1dca0c22131a906fd9eb7d3df1853d2d08fa8bf979b8d635f87c2727cc97b861763e397a234b82817edd836f49c46c4888f83f04a0bb5f140a8e2dd0f0424b05bd21d94f49e4c147668e5ba4b761c560019daed15646d802c12df62a4bab8cde8ff9acb9e8e6c4262f58f82381fa83e156754a0059122b182d113046403e4df34790da7af203aa2b535068361fdb0874652e51460f62c1f1ffe4cc6f66fccf1805c0d040c659ddcf08458ecc2652404cd009d20009946fd9c8f91ccb767a41ba2766016e95ea9859ff0004f393a33475b54e37dfa6a3e3cf143ba4ac54e2c5e2d1d3d7197ea7bca49555d8a6ed8af065412710c365371f98569813f6190b63b5a25a620ada421c2df39357942796bba0124f841ae07d310c1ef91f27d8712e28f4520ae48937a7db04c0b9326be5e4ff8bb903eaa9b3a00b9b79840fc18590cb0bff6f34bf8b14c76c59d45ad59741ccf262f71721c5b95df9361729520be9bfd117c07c7b323da1061e0c741d83ce325c3c429f4ef3b5386c44b308b6a665bf971bc6ca4c36bfca26b51e7d85bde1fea22345439872c1e248197c7d9b1197dc8941208c44f5084378452cd5385912794995ed30b17450783d0e6a18d94e3e9aa06bd36ef9d70da525556f02d28d72bae9de901a3896a183ecefed3d4eff1cbb71c236d0c6b652bf76c589491fb965e7aba144e2090f40d8b4501c5fba6d4b5db91318592cf9a41123a54c45d8fc50764ab3ab44da7e4c15b742d6e119658b9696fb9a0eefedef616548ef35881efa8882c6250629bdc2bd206e03263c43b1c7689cca2ee04337720a02ba95f5ea5ebede941f91bbc59ea09cdf34000ef67480d80fb1f0c09e9dd639c4cfa03f043544d5f44dbe65c97e7b5182b974d5ec57cdda917ece70ac118740558e65ac8af7ee2a6de28908511e9ce071fbc38a4370ad096426be2c490758be7fcf1fd1c1628aa96a3ea5924ac7006c94463e5563c0fb4f6ffbcec011c86b065bb0cc23f6cc4ecff4aa1cd91933cb333a8a3acca63bcf2ed53eecd2e6060509893a1f310370b56d60e2192ec46de06e4d7503fd0d3cbfd61108b5bb125d47c91b5724566cc6689e259b704fcaccc0c3f8bc7549bf120d6e698ce0c4c02e09484c913e6215d908d2613211582fdda953881c0ae0a738cb15e6047b785c4ffc618e9b51986030a0ac83ad9b6e0098106975301b116272458910f72b9d7f1fd36ad7728f0042059e8a5fc45cc211eeb746a6e699b94497901df3508941490b1235ebc5c2e9ba3580025e4069770074d7ae17ca476c9b8b4765d8d18deea870bc2143eb3ede04642e4c64042745fd870dd1d04b82576097142dcd78667537cb13f6cdb6f19b92bcd7fac45486f1a93b1f1f365651cac5de9efa0f842c58b9ac63fc894df7be7cb49b8e8a52e1e50ea2e65c0b6ba0f475d1dee55f334fdd2f765279ea17636f94a7a665eccf108bc3c958b9a29ec69ae3ac7db083f993ba19d8ca20361cf02dad97f9291a30964f65b8f748a657fb9d78f88e16d764d6f7fd50d0e2eb1417705f55477b014bbbf3ef40e8186d2e2f2a72862e2d6e3ab8107bb7e8a96b5d11d6c9a8d0945fe289869bf8336a93399a97202ad7aee9e56f972a2713c57cbc5231806af6cb538c291c5d0d785e273d5d8bf2a1bee46ffbf727c4b5248f34eff7d5080525c35809aa0a0535270c663a601669b5d1c8904ab61691147bf6ad11f1cac0ec6d2557e0a5d121c8ee4430409615a51bc3ebd84d156a20d0d216daaa145a19714089d78668c50cb9e468e69f4de5ab3688b5b27f96075aa61605739625ede4a36d67b68c373deffbeb1d0e65880c658dc239614c0f51eb814c785b22832d73c07f8f804dc2b96473646abb8d841ff01032556311e7a425107ec8fc3b86ddd8271649fb5c621f7948ff5248308b0a6cc1f26dc8c016c9242292eb5374c219ab03730c1a0c908847859a85d385025506bdfa838c66dcb3061847bf0c775fccb3ecb84179f3d925fdde613bdc9f87d7c5730f4ff79dfb79d29d67a8d64fd08749532c36c6520f6f6ec4238f91e1e07f154ed1264dcc4f6aa265e16a6f0cbd75a633ec430a2d0a774b04f264214fac1fcceba7f898584d14f66e78aadd018a18a262457d45c1ca8603d7857251a2c5eaa32bbd86dc2b959e2172c84dbfbf7566615bac187bc76206a71d1b5aa0872a24d2a43046def20aa417451e5197c9ff0ecb59c913bb82da4f544798a7cc224d1b1c271c3c80fb4c4ca5bc2ef6ce30be10668684609efb6c26d5fd65b996b6d906838e36f80bddccfb644b328870d5820e83f47765efaaab599be5fd7ab46b97a1c6bf1321a96086f7eed7d79b584b550ded5dd286654207adbccf3f9cf1bc4800722ddc7c085037badb67dba684551833ed64915fb11a70875db7b56b8397cf98721ce6ad5dfa791254cc98b77618a913912d52e94d4c8d497e8f8a32871439452da3f62c645684f622ff300d854b7da6761333bc199b56546410c88a996680b00eb00ca4e2f91b2fa49e71fe0066b058cd979c0dce84dfd716bcad90df5e14f36695e9ed078686410df1aa20de6c6c98639c15e1ebeb09ce37c73a39219196e66c1bd1872c6fec09d2a2657435a43e986da1a416552d936d2ac5facb09a4aab6ced91131939cb9a71731df2ff9236cff4d1c5b4513d2c31397231ff779b3a0dfce996dfb81236b9a2f53b6da2cab9e5cad5cad474f0d31a917052afd74e4f6f7efbc6cda29c16345d09b5c31fba8edf2d7bb5312d12d4770520632b588f0fd8327838052e95acf7f3547510b9d1cf0d81dba720987db991ce8cc35559f47ef2207e20389ce5884024775f0fd337e23532834ff81686431e6a5b6ac6140f8e9cc306209c11137a0988b0f385a3ccb17ac9957427af0411d016e62d36a1c28c45e1d89863ef40fc3f499438767c8212f7a8d53093121ffa4e090666989fdc7a81cd2ec46214677c25e4e87335e99e37189648bacfe83a02cb103a41e5dd570afbf73a3dc6a6a4c1f9b1905e74619d2c1bc68296fff0b14965931fda7ce069da0765260f22be7c7c4caf71cb3b7bd038cc60801eb541d2f96c28b124865dc8bdcb08c52165d71db23a5751d501b2bf7ef027a057ff61b6674bb7fd4915fbb2b8cdffc0684c5c5729c8fccda44ec6f8756201459a2d2dd060038a2f4f1ee4dc99340836df18b4e8ed330942f7a1679d3ec75e7e4f845a4c636e392a30db415e23991f900d05b5e0a0040f7f2dc57a489ec426f1fd98232b723cba092174bff8b6a2e74df3b85cd58bafc3d4b04995948181dad3a3bd6b92adbb283434d789031be56099408090b3c625f3dddcf56f15ce8f727dc571debfee14ef243025b6e8c442a740b5257aab36bb1107a84bddd2856a3cfa5c81ce646e2f64d2d404efad098abb1449f9ccd800422c23c4bc6d7575770dcda71cf557c70298690ad87eb58afdb647a1904fc87828095c30e9918c891cfafdb5ec30a6c6b0e4de4210a733c5321e9290916acfc3fd71e8b29c49cac97a530b868a800c09cbd61608c2126ca5c702e650e5dc6ae12c5554965e58dc0e3ef396ff09e794072b6be66713d59c49694b4789e21a2298eb01acf57434ceb2eb18afdb31c775222e49794b0ff70522b8c300d031f157b48bf09f368a40b0ae4840f24550ecd3821d4d1a3631088cd287884c45bd25f43c401ba64db59feba7882af57ebf18f2ceadec153954311f46f9aa1f8e05074e209c956478cad44573c723c29b9c6a356f7390da07d55dce5ac218849910397e018b5d025c14493e82227955e59353248036f85638e810b8cc9052854cfe1e04d08c7971ad90d1931b9e4c6eb4e641fcd006d258ff201d87683f670066c0483806e3b982d7fb4b25c4c86724aaa5237191c843abff6302863040fba2bf62356320075d096292995a7ba2479d2f0900c87c1960ca25d7fa0d8c6d6a7c0bd81a71c4b4ebba9fae6b05a34a531e41370348904e14884a5bbdc2e1dcf316c9303af86b45e97546c40371f0683863a78d8e2753812f7ae2440c836e3b0bed185ccd3e35dacdc463aed7d3f513342cbf5dd2d7e5a03b60de343bcf6fcad3c2490527ab2c0fbdedef1705d02c74cf45e43ec81ad8260872a25baba0b79992ba04a16ec1034639a51eff862a7780474c23b1bec9b4182ea62c0e0d519a98550f1c7bf659c9d65cc444f82856d0be540512662f47b512174d2a646722d6b57121f7fe520ecf0aa80b47bee801e943909eeaf1936b2c71284107889fabe239abd46baedcd1d06471f0ebb274abbd26726c4d79a858c32ec769b243f3d0a61edc4c3d68652d9147e140bc91706f9eef077cb6024097e7d6a02a32edf1520fd34990609f24689923da99238e97e828a172ee154b2962081162d907f43f15a81a6d8d80ab65b17919e04c94592fa9b84bbd740e15127e0215bd2fa7034dcf5ffad97a8126aa00655da2fa688acdb044b4d22b46a004fdebda090e1097803104e763055702638f64f80a5c17ff2956bcbb1dbce800aa656929805a0c940773408b8308dfb2b695dde51c9d8337823db4bc38f1be0410b47328307e4e2bca6a42c169f287d2bd08a508daf3be3ea149e5242180896f200eaf2f0755192487e68158b55d43cedc8d176b68802c305237f178b40fa5d5b8c1f6a5ac3709319413e98f12761ac56de51e160582213aac04dabea8b43aba76463b81bc0ec971d4ba34423c28f96a32b0307f16bb0e5d1c1e6e2af684faa83378d1a1b7c69ce5b1a228b3a1a32e2de50709209b71a3da135d293be6f5111c41ec8534592bbaeb06fa4ed13367a39a3797312bc447d3a9193f86ba060170f4a5a9d79f048eb7aee82e0e2209ee2c566c78027074599b6c60a8376f52280c64fafc1e6a9e6d23f948b0ad1b33b002ec21d1881fc8d2164bb1eee07bfb493f4448fa4038d41a9c97c8065115fe68f07353fec61a33a735ae9104f2c242739c930a0a81a54dd1c41c20a8808fa01b21f1ac1df0b59c990fe64bdef0fa16346c2dc8ad6964ca543c01c16a3e7431956fb2f6b8dcd3d194e328c15c249c876538f524c225c609b0863762352fc20c75c4b32399bff8ad04a8b0162ffcfd3814f6dd93fa7e29f242a080e1d96e346385ffa80387145b0235bb65e1ef3ada8343e681209aeef1a3ae4019207e5c290e9faea2fc2819280032a454165e5370e887c89cc3514ad344a6886fbb2333de3ce4c4b05ac24ad8b0e3f17684d8f25e47c5590944fb281333f663a34d5883926642aa7e2f22dc20b2622a3d1841b6bd504096de6b7a55795ad6b225abc30e60243b587789a9bcf7669e8fb377297c46566e09d605c4cceeeedb36626caec338741ade6915918cf1f50ada7c27390f8009b4bc6ac717aa1fdf99181241392eefaad0d9f9ba57f8c95096015b5baabbef1b9b959a3b1780fad08c69f7056a642040feabf01fce990eaba6920e35fe5867ffee721cfc488e6929f0395175f708fdc84d867131e238103e890ab23e53bfbbecd8caf50103eca0a7089bfbc4e4d8362a0785662fc33a55d1ff7a0422c044a50316ace36a8f0120499f966634cf26b3e18788e41d3f3b4e161e0c68b8e547a3253d631921518ca545635912d8ee9f4b14df1906d79ddd1e3867ea5394922808a3d0a0404423f4a805a112f85d3995b273d1a2f061bb1614a8770454c93bee1692348296d004ed71336f869026983a330c44f350f171ec236a11c03ce1ca4664b358682b3ed294f368d33a881f634577ad1536dce5e0e3cd7ba5abf19e61ad570a902ab350bb88653ca3b529c5be8205d89e216f4f69f27c22de86f5321d4b4abc8464e0e8b121d783151e606c0978e11287637b0c41fd091fe9719fb56dbc46a7ec11bfcfa6d4c57d508814523a1bd8770ec1ba0b9ab10c73fa164e7ad1f6934354f3a5e8e787ab740ce2e241e29d4394b532b65925c6f7b5a699d642685f5e50d19a7ceb8dd9e2bcff16c43950d8a421de612e8f7e1ffe7ee2f8e41285bee0847b68062264186bbbdd4a24d2973ffdf631639732577cbab17acf1694187c080830d7313a1a5be6e45308f6ce5529cd9011afc25d249dfdfe4a00f71e76cba3fe30482a5e3be4fe61ddc3e7a1b3a3bf31c4f973e37c3d0f038e0dfbd0db2290d35c394ce3425b20838e21b909b09deb32fd9bff0a5edcd61480c741c2dfdad59b8d9d774faaeb71f551fdfb5ada3bb244fa9c686f0e981d8603c89051b8b4ce1655f0318e0ed77d82bd51878052d79fd10675a2ba42cc61e620f344f2bad04734825bf5304b31468a5c660302cb9351b89776ce350866811f2eea458eb2f9ed50c4c47caf73b588aa4aa839c2a874ba02b1245f89fcd22c3c06ad42d93839510712fecec5ce813b3ad2264d1ce39ece7655e74e90d1f2badfbe6ee4c3757a02e3f7c05b696d7b7e574081ba44bf715d7a79708f6796cc3ccdd5ddc93abcdab704c74bd2310e323b2c112f80238529198e0ac949ab40c9b6ea02c4bc66bdff0cf077483cc0eebb03d7493d56be0ef6d92fe9c63b5dc78202389ff6336a1f2e9d0b30fbf95597b3447a802125e1e47a66e142176f056a5d7f4d6dd2e541e4a87831e5df6b439aadf6bc399214879274931be6c5f12a8f2f864601fdc471ad124dbcd638a0a08ff6480d959960989dfd8217f856fcdc7ee428fce47c38436407ede1f387704bf53fa07e854df39068eac3b35e68f7a57d17f2fb71bf80bdb503173108d1473aaf78ff1be586f1facd9bd77fe90dabb62bfb1ef651f29450eeeb51e29116fc9020cd9f986597cac219515108d7080ada5c5adfe08466af4a33059d0257da51f41f3a8410f5ca45347b31edbc74d433f2073d2f12964e04621e8b4a474d8b0fcf884681db689cbd4c68c681bd6c38446157ac213a6f5f1f3389f84f93af961778b3edc4129ec814bac63b49ea788855a29267474c39b00101612cf24a09114330bbdf8abbf2b350acef19007bb45c765e73a82387e60ea51a7203e9b1d26d03fdcdc8e483566a420198a9ec5c43e0293a3a18a277e3d8c9717d73df8a1949252b639396dfa4e5e825b6ac70b0055b2d40021bd34f71904e807868bb0b936ab7e45aa0a3354afadec0229f51980f3badc1f2632d99705d02a5cb0c3b9e110afdd61d494f166d8140fcf98334290ddc8f2c5d5606c019ff117564456428c009ba4e98bc9fffb92bd1e26a34432951690c94ce1161283cc0c4a1ba2373daa5153713836c44ed25cdbd12e34d04ac2385e08374f41d1acd4f43fb0bc2bcd58f47067645dc3c53f9b3ede31813aa98597b8528c5f2953995eff07ac663be6ffef72c1253504006cce7457ff6e77ae992055fe8e698c49b00a2d0c6d7e2cb865e13abc2e02f27886c0eaa809fbd3359dd7f78e548de6de733d48cfadc38a90a01254c6e17d9829f97ade04a684a8d77e12cdb3ec89808d7c4bbb2dcbe16c04f664f2e7b973e5101fd37f5ae4cb46346a1474f5994dda13dc1e23c842dd0bb07581f3ca7b135612a77cb95622c55722f383f45ae1fda67aede4fc379f21f6ed940bb81a9519e529c54914b8a4e691bab8dbcd085c46001920fa1b0cf46041cefe382996b3d8d11a5b57f9c6a3b50f241ea616109727623cb754f298f65a779252f6f7c8dfa259772b12d5ca296a2f7d9d862b448e5e9d60a66a274742e624a16b4bc3ec28decf719b2a14ecea5f1843052ea8b3bd4eeddd611f8e48559706caea973d77f75afc8b6cb34cf9070f54cd1d94962dbfb430bf7d5fbf4b2246f3dd1b3488cd5f80e6f055c7e8912aa04d4c320a83066afc29fdecf3a975dc705085fe5589afdad022cff5d93d32964943dbee6a61988370f4971b88fa1827b88b0eae1ac87458f7d4c215654e26741e6e0d6a42fa380fb94105107bc0500ac0fa541ed7dc4de1b8f7b5c22fd9bd0bed6994f95e52560b60a62962b7448238ac85fb5b34ad571bd21cb7383823800fae1fbfadf2b1d89ecad4323c727dd6a7f69220419b360151c92ebeab8337d374fbfe01faba3e9dd612bfedf10070ff5677b3e7adc0e68d82362a025952dcbd2df81cfef785bdbe14b4253d65c9af81c234172f1dd32469bb485d836a51f89427850f2546c4fdd28ecd407658a1f3a4a592d2e02481815e0b76985e2c93f1f7b270f9b65b1b20ca912f45a38db706a3067e7a52311bd5b413d37c93ad7517290b3385d1c37ede6da4c19344897d3baf559be48d621f52340b4015eedc035c90cb53b3276af88d1ce36f0c88c2d292aff0d4c077ce7521a75d86c7612926890f8fdbfbbccc73488d4f9e1659bcfe9e33cfe08276d0b261434b61a4a5854180ac1871d65c1929ace7c66eac99cdf1fc01fa8b5aae5d9e1da6c05f9c2d3d4de528b12b1e01c69e95a216d1106c335d1f28f3bd2c37964d6d1841af8263751539668969bc28f0db779c9986aa243bdfe199073529b5f92f3e4f984a1534157bf69e5f18f0daa8c61ffa34863688cd063334945d59bdd7a48beb7d66bbf581b6567eaf9b8441cbf5a1fc85227a1bda5b1e07dda7dd2de1a2072c8013fa31e79cc268a0cdf93d4a0eed40d35955d96044e542fba0b949b02249b9508510fa7e37fcec502d2ae50d7c9d9da3d004a2af40c7987885a5c10ac53c4f9b15f6b06e0076091b773e30d9765238c53608286892a38825f697650efde4b68c5abeb755a4b8a130d56205ec0aac8b68e5d15c4d0348ea8e68b6bb41aa87740df5f904c788a69a45025740336672237201eecaec647f9d0ca7824f96f13f839f4145e4bdc6d089bc8c5931801e8ac69914fcad0e593c838e5c5fa738c21d95cf32d27ed6f02ac0d52babb12c8cc81492a19be6e73a7d0c9b97c4b1da2df97d520d156b455badf6567eb093616833d02893c3365de7e600b745f6ca7af7ef6498371226ec3536fb3283ea3ad901255281ae482b68aa2e6bedc0407930235a60fb18c6d20aebccf278de0481936c73012280aa19ed289057f064bad2788eca21dcefee6197c47d2dde5d6326148f017eaee036201d7ca62fe9e6c6d0fa835ba61767cd9b5ebc3b91def4a235a19d680ce46a0b86531a7e9644856746db54d96cce2bb361e7361c245cb2c980508626a9606f8935b86f1a93007071f34d0296ef19a893be45355d0b23fb76e2db9300d2d5260f8d4b94cc3a68c157efb52ce3789110d0ba223ba5055f71a7d6c6e16a335706018994c91061265bb64857099f779fb448d00bc8c7fe79de4156348c07c58f45704653346625dfa962c26777709ebdd24883ed7a8ed04c406d571138d07ee632855f2a3a83034daeb577ad2f3dd09c7e75bdde6e80d17e5d8554b5432903604506ad66a3561aebbdb1cf26caf6892e9f3dadd1446c349af5e2f6fb4616e071e2b9e6e9ad8180f038f52628ba03615e40179f75652b1f9830e43a174477cbc9d1b4c6865df8ec8a2d8d06fc0a64f8881dbe4792227ae74b053fdb13ba1ff7c0472f03607717841db5b67b2223785bd46191fa69abb6007397c43cc588db5a1dbd5a482b3a8f8c3a6ad46b68859b633d3febfe57ad6f758bb34e2b1c3a7bf1b16193bf70594ff347762011596547b0663a543c4243f327e165204347951a9c20a1f50b9d72e4252f74cf3e8cdbdd2f647a8c2f6224b063eb27f5d6ebd81451a5d4524f680dff21c4c8f690e3a215fec069992c5b23b180a11feeba5748abe5588010c62b35030ef6f2be524b982e8aef655c5c6daf025169255b5e82e61077d62f1b97551fcda0a9b6a12e99fdc3678139dd0551c3a1990c7b7a8e6d95fdd50e1c38d7d57973900065d0f3e54a0278c95a9a806402c21da7d03a5d285f4379e5b9ffac2b3a933243ee8dbb8f9bd281d673879b9c72bab388910c20a9f0f24f2adec685e46cfc0f15505ba508778fc81c1568b75e8b880ce39db5be1911b277848e7b9eb5aee12b1a5318c36986486be2b772220da694d1d600e87e73c22eaf629a1f8f00c859225f7673dd99b45d2711d62b992bb0d355be9be1d0b1ccfdeb4b44cf5f96c747c72e725630a4631777238fe2dfe11fdc4e8e0ca117069c823dddae009d5f46de4d8894590f730825f2a5531e7d26ca21cd3bdfb8aa7b235865aa8c5a4155823ef5a479d7e932a8ff6a365e6e5d92f015764c081a6cfff92030a82723014da0431b97c16e49e2031d23799e20a1a39e133d74868da39379a023d2c3660df49b35674678746755efa0b0d1cb4d57b6a7c1bde911648c1e6afda14ee3c56d3df1e658529ae9a04273684ed094ccf9dad1daf9eaef9e569acc8fc69340fdcbbcaf57dbd57f99436f1deacb536f06d08006c1f36f8d117d38da7f7fbb51f368f5ddc9c87a319081d0a8d627105a868988b6a4d9fec5e4d360064f13f63910098501e9c747671261738a3bc23d7aadf8437f45f42cfee19837fc661c6eab13c763495c0a86cf016e571d0ca51f1e8b95d0d9f13ad429af13c1be46c0a968df0b715068bff4fb590d256e31df999127c101ec0a125398e48552687ac2493988d8179f427075b86d954d4235afe29a273c6588d3944aaae6268754156484129485dafe867072852e7fc2ed02b427f2040b4f71d9b90ec2898c149b4302d40021f80cdc1ad2de454701d88c5d42ba6780308330d68389f49af0a7d7928d04dcde2629604d20efd98c57edac5b9119eaf305e4f741f7489c63d84aa46dd1e62a003f7d838323309d5233203c56fc6dab7d8b1e180e97dd0279d6e1726c52b6dbfeb64bd18b0c5d950b8087186214768d45e6810a03fe8d74a0012c0b92c2c21a19d95d52287d8e3d5d9dc5841dc388c861c362db56684f77edefaf61e366635547bb9a691cbbbe3af5c37cfdc166d8f430bdda94912db1d04db57d5cad4be2a53e6830bd2e75856bce4579a54147efd1a5504a3adfc14f4867b9e873dce47032bb2f9c204b382144f5cf044102178b12993c1bd00db71fc6fd7e33f5687e5c038f912eff079fa714f75d2c4f84b8b8115ff977d813e2ca88012f8dfbd364488054e6884a83a9d6f0203382b444628391730644d5aa00c8b4f60767e3042f518ce96988075484a4e0c263678fbd105346bc235d74a3db744162760f7942a3144cec431d6fede8537a749a70dd6b68e4b571c9d3c3105bd018488e85673e52ca7792e162306ac6d1d0dbaeb13fc53060a272d9dd72e17c8441513c4148299c57562524afa179da4f0bcadf3e9f707f290581341271a253a08f65412577a3fb0926d38678f20f77e8a1641962743eab8be1c29bad8a286da7f8341b498cdbc2e485ac3f874c6767a2fe459a4e071b707ab5bc4783a185373be7cfec57bae4329d17428203a67fc6258f88d0bbc72918c410a7547d6ae7a430c0a895e006d24a6c8d53e44bb047cafc613102e478050ebfc5c012581050a96cd20130e44b31cecf3009d9f65d6ed640551eca12d80e42c895d982f440427d20c52a29aede05e975ec40df6dc75a04a0a6564201d914f8983458cbfddfe716d3b2acee1306cd2d5e8a21d408516bd208217bcb1d7012bd127f12162802d3b736a00412987e04810796c0f4229308a860fa308aa627303dab8a134881e9572e60410a303d9805165630bd8a8b2db4c0f4df175e74311be241b321c8a03985e43ac6905cc5d8c9150c1a1804d6d82a68beef9c382e4c790010294ce9ae27608170eeb8af25dfd79ff787f99e6fd67fe87ff7d5cd200a047a41bed7772cfb6a4355dfb1921a7b75b40322c107a113ac1d0412a8bd1b84ce7afb934ee9bace8beeb996054deae201d5980706a1b0eadd22404188d0d29b2eef054760cf139aa7b60b22a8d21a99415c3f108693ec0ef284098820414df42a28582505ab78a8d848f51945f53c05abaeb20c50bdad777307c40d7faf630c5dbdc78029b8ef9ca72008bdcf1df9de3059c97b5a0392ac36fd7ee2f2fa0c92374fc164cb67cbd1117639255bef9696eb3247da72d23e69797dcbad94246f8bcd8dc9bbd8cea49d98a4b09eb8c5751341d2bc3931041c76e21c6d00ffa2617a412c1bbe1b63e84e1fc27e9e9b3cec9ad88341763b28ac738f4be6c370f6c89c724136263f47243249561f72cffae09df570ae40ce5bd31978e289879cc82bdef91c85880cb193c28800d118cd81683864c8e7281462a1b02143eeab053287b921372870350c73b49c78c786b95168c80db14025cd9e0f93456accc6677a3e47a11e1658e81c9094df790e8fe12cfc46cff3ce73b83bd6be8cc82f5a0ce59fec5c24f785328722cf39fc45cbc1be9228ac717ed1b20f78e740f465042d778ee41deee7603b8ce4ad5108c96d72e72cd896186c4b6d7c610adeb919c4e52918a48db72cd5980f1d64e3be72f80cc2f1cbf01c2c0e2b00f238bf68f32cdc0c621c2e256fdc594b298171f82477fea2d5deb994b47165788f6d8d802cbff39e872da350cf6db2fc1c898ef4d8c62d630b1397efc624435ede5792212f5fde27476e8885c2fa433e71b81287d8c634470ef9ce8b9cdc799f06f1339f230ddf672e0c0d86b15158cf7ce6fa0063fb9420985a0ec81f5817c96798dad4918a6992a620f38b86c31ceec7ba0f54776cecac170de10fdec30f7938a3545c1e0b2d87dcd88d88d9d790b7f021a7b1af21972689260929c8d7ce7dd128ec33832c72c9e717ad9b3843eea4309e3b84c288dc2c62995b5318d8069e370a2ce1170df33e803eb02e73fd07d6e75d07a2ac7188c9e9c325767e8e5118d098c85f0e447776860c193264c8e7b8b333e4e6901a7a254d1c28a40cafa46a43e42aa15f9019a64643a33182a80506063057c0a80066053052c04c01539b3d3defc33c317b785c5c6a6db554a8327b8a94800a91397b7a78422136878ecd9106911a7e638a9642debf9185963a9fa14aa930e4b9c32a9c868a6984485d02d0d46948d0467626806514d6c7a7a1328dd028b591585781a0cf2ebba0003ceb605a03416202e1400369620259420300deaf524a96d00000251f726f4d573093ff3c6c912689060a9a245a7a78c2200b0dc3e03e8d8dc6a9c6669dac03b84f73a3b9220906595680fb345768cc959b3058c214eed32cbd48d132bf682f53b4cc1d122f69bc64e991a883a90da165a9654908612ecc9d41520cca64b02156a44a953b4486f4f0d4257493763eef17adda0481a4f8861b85f5855878eeb0d0694a307b78a0983d3d33700147617d174e1382d9137b9fa689d953e47d9a2568384093347b86bc4f83840d92e4a0e2173ebb543d5158ff859ba0c3002d5550aa19a870b45445a96ca0ca010b3777387c31c28b940de7b1af124c9c7e8f7d4131715658e12f4630f217a91e3b318f6d9c7570aba0a8ce73d7af53b45445d1ba8459aa823055527402b35419a1a3d15235d5556096aa25c0c06460c21a2689c21aa60313d6304a14d6304b14d6304d4c58f35ce7f6f4bc4747474747e773ece9d111224488101d1d9d83a3900e0ccd480666094e6026d11294d10ecc32b4c18429d132cc5158ff3c3034dcd7c88b147e35f10ac18b03af255e484c9cfe10fb4a9a387d700236680286f741590aef87399ff7619660b8070432d3249900133db72cb53c77b8c7c25c3171fa3c16060613a75fc4c2ac60e2f46316460513a75f5a9829264e7fc7c2483171faaa20b8186109ad2897f75552b4ecaba668391bd67a3f1c62616a304f4c1c9cfeac2e43feda21f297134376ee118a7786fc457b192185676a2f5b8dcd2ad410b8ff8acd5ab7133881639e4c26930511346f55a070ffa5546334a8bf4364084d524d89961986089a2468d9c27d1a2668d982dbabc1d888d88961aa346e18223a24660fc57d999f93443f4dce84d5c432b13058a47ec122d12436872ed81c2364734dbe3e36b352b019c688cd3856b099870d36df04d9ccc236c300d98c43059b79cc60f34dcb22d130c7e41a229b2f068045a234d81c2eb1394689cd3501b0f9e26033598395c10ed9fc5ac2fd165cd6870e52bd8e34cc838f398c8df984d29d7e3c49c27c7c0d4d46e6e1ebaf1c556849d38082c21a0a7bc609af2c386761e6c2fb38a0a025b5e2e640efe3b88296997cd0fb38cea025bd354e64a1a58fa7f07ecd8c9699bcffa959dba34e7849e5784de15c48b6c2fb386ab4cc4c35b7d13233bdee44cbcc7473fc3e8e1b2d73cb5588c271f2d62c49d13233dd38bd35b5295a66261ff779bf4646cbdc7299ee8dd07a8ce0492a92444c899679062668999b2cd132cbe0042d330e2f275a661e277aff65052df38ebf70a3654ef21aa72b689999bcc68a17ae7cff7565e7fd578ec8fb2f2c43de7f3dd13207e015062d730d2f285a6600bccaa065a681a6638490a45612c7a144cbbce447dec7c1042db392e7f03e8e255ae6187ec3fb389ca06586e136bc8f0347cb8ce30a2d33f93e8e1c2d73cbfb38b0d032bb3cd1320ffdc8ad490a8396b985e7706b9280a26546f21b6e8d128e3268998fdc865bc3448dadc67ce8827abc5f4393b113ebb0b3262341ecac8908889d3525c9b1b326a11f76d6b4020a76d6846decac4905984de136ecac69862677d959d30dbfb3a66c436e7222d70c4437b85c32d870f30d9fe1f64036b979065713221998b874e0605fb80d383c87c76c38f92436b86238dc701b5c33bcc9ed0174d950e431572c879b6337c78e83eb0ae1faace9869b997e1bec0c7f137b8500f25953919b995c2f12733d76196cc8c0e444365e78121b443d36782e838d2b840d267ba217ec9304f9aca9e766261befe1b1719ed3d85953006af88c9d350140861c77d69499e4172e34432424c3cc4c122637cb70a2db03f9c2cd44332f0825716186061d4d4e60210793263966c83184490e32c70a4c66863491e14c6688fec2ed019c6142e4436686cc70f3909b87bcc9cc1562e6b326196e66ca71262710e5f80b275c217e7cd644e466a699131932f3214f4293c4850bd1b0f01568844a9a9d27a1b942d0309d7021164ef80a399f35953733d1bcdca1f9ce453b6b5aa2e49e9d35c590e475674dd985ccc2b127849378de0a2edc9ce442b70792859b853c16f00a41b707150c3a5ea8017aa9f052e18517d1abbaf0225f2ab8a07a21c95df084cec2ed01f45c68bd7a4437bfe05d21bccf9a92dcccf4ba0b3542afb3507385b0f9aca9753393f756f55ebf82b842d0b10874156e0f20d611857c05f10a2132d5e85041c7150285cf9a746e6612af2344bc908776d634a4a385b3ecac09c90a37eeac2907fde7f6006620ecb3024b859fcf9a826e5ee1f8f64002dd8c59403e3fb707d5111d2ce0b8b3a6fcf3146ea47023378cb07043e886cb0df2869120950b0b2b3c88850f747b00674d41402d776109ddec72b3cb59605d21589f35ad7033d38d07e1c03703e1b842e8f8aca9e56626d65b5c5877b90ab70715660252e107c44c610a37727b00674d3e463e6b020ac9ab707b10f11522fcace9e766261cf7b93d90980996c2cd466e0f24ec0a01fbac89decc149e923733d11e14f6f01489953b4486e80869d520b6c781d8fb1c8b737de8a01eff61ef51b037d7071ad4e336f61e667d5c1f6a508f3b6be2716b6c14d63b6e4d150aebebb0f7d638559bbeb5387e7be327581ccf616fbcc6e2b8352f7be3d6d4aa4ddf860defb2acd3d8f0339675d186b726a9b26e8d52b5e9cb581676b11f1841c8200ddc625533a0e1600a4cdaba4410b821606abf0a5891ea019ee3d0bc61995b43a3b0ce8d2786bdd8282eaf2d374fc12db973b148286eb99cb4f9dd51b08a1de9c57ca48a3c79a01ac501b81b4f6d1415eebe638cd26bd02835345ace1b6ef15da384bb66c97baea9d9708d13eedf68d5482ac313e717ed55440c6486a9e13e4c8d967d182868f9a41a7b15316dfa48282d81fb2f2ab89f546333486909d3d470ff459b384db3b464050968926892284dd2abf6a2bd92aa4dffb32fa56a43525877775d322033d94220955c2f1a7dd1ee0d4f1d53708008a750205a5356dd946e85435390a90255f32806770dfbb42befc2660feda6d3c2de3b280c3c1085d172cef970c2eecd16efc1681983e75b454e9cb983c2bc5b3e05b2eb5ba7adff6c3e8a39eeffa0a73b60731ec5cc9373baf09c34089e3aa684ad8a220c5b6070bdcb342236904a96aad793b3e77b056dbda00d3f5b2ddc7a48572bcfae56ab551dbf3a92f17a2facd7d6c597bfb4ae7a1d7171793d1297d74b4e9cd6ea757e0a6eec62a3f41af8eb8b6d64757ad2822d97e249ba4c20f31e4cbd3906cf4e24270ef83ad2baf7f1de155bf78ea425de5c1faa0edeb256aa8307afea1ef95eff1afa5e8fe4bbe4c4999f82ef6ba87b3d92eec650d81ca2d4baf427eb7afebbe4b4ae984ce2795d3138c818d79cef6906f9b9a3eb2ca1c704725e92c2688c8a3e41c2ee7dfeb33b284cc504fe3506de20f4b3df574428ecfb8850183dec3bfd8dd608c8efb3b03791ddbf27dfea16b941306502ffd9efa031f0f4072d114a77d039aabcebfa8040ce1556a954aaee6190dd698b4754d89b5b90f45ffda884738848bd8fd283dd37dfad6c839f073bf048b4f512b87aad5635e0404be200330ddc50734a66c4ea6b425f0385350e38d43005ab74e8dac878faaf8dac668f28ead06190abe7f984033881d0b378c0df37815007b440cb7e2876e2f53e4c21c0ea58e20d298baa6ac0418755adafa20244da795d5deac19207722026e6b3c05210ebf3200d5a7d9eacb117fd94c16d8c245910f87917c541cb17bd87bfcf9f962f7a9960eff32a95ea537d2c2b4e1bfa958dc1316de83d0b7ef9087b9f52b0f7e1efda90e8ba2ce1dc91db4641f1258aaaeeeeeeee16559f125ae6204de818d384c2fa2806535145e9486f0d4a28acbf363aa2b0b64da8cd5cbd065a360cfeee328d14e07b47cbf1dfc9d913febbf9284689cad640afe49a50585f756b28401bd96102e9770f7670446dda4884a27a377bbeab6e9652a150587fb446f4e840b41b9350fcdd6ee2a8ae6aa9de8d422d55aba3538c6839be7f048596531c552d4c2c5e2915abee2b09e5a1e2efd2db8db3692bbcddc4a12dd0770458751452bd055ab6f0820ff81beaf077a0ba52d28496aad3182f067ff705ef8a600a4548dc4168994922a72c5001ce3092b4a92a6b0df0412803efe0994510a0c0e15b32fcfdebead415a9302ad421bcf53a6da4bb63121606af4e03a9678d48560f1f82e0bba95393e828ac2f596373dad5a78b66a60bc330ec5e61f8ae53c2b9e660f87a75376af811c75f17c7cdb556171ad7bbee5d37c587fa2f48fd57979e8c0702d7b0030f7a9742717fe17d128e3a6de4bbf75c73bd2008ae5e6f96e2e5aaba52285edd27e1c7d7ee4aa195a670bd24e1c70a5e29f4b35d5fafb9e6769d0e356643556f1eea8f3134f8206da41ebc1fae389e6b12e388047c15c1abd340548f8179a90d7618c705c31149ff0978f3590d82b7019e05aa6adf8c43e8abd6ab8dc3307c18e26e0cd240faab7bb6feb3de5f56fc0d965559995317cdcccd2e990b147361eecb053f678bc42d176eb9b84856f5eac787aab388e03aaf97c1f0e0bdd16222a5d47f07c3ea11c1e0272d89c6abd340c0ab6e58cfba2f15508de9506de8a174da0878cfc3598a47047fdebf1149f827e365dd1b631071781deaf814a2aec0e3c79ba578a24e1b096f66fdfbf7bd1b853e0fb45fadf5b5c3aaefea3410efce3a65f45c67849faaeffb54d93b9de3e7791f9dde37299da7737eff1a7b1d9d73d239e79c73ced9d5aeda574ff1da2bc18e1d305ac600aa76f568135b2c555a6b8da975470a4528a59452fa03cf1d5126a5b4de7c2476f37da0dab5297c11700285abefa06555bdff83082dc1b33aef4f76ac8a604f45a4ce2b8a8cf5eb5c40f6299d0777c0a0f880bd6e54dd1fb4fcba203f28ac5f7750587b52e11c4292e09c93d267291da68f22ff20924b01e807a63f72620cd1ddddaaeebeea27fc2092c20e9096abd5cad2d5ea1db9baf48277ceae76417489700e994dd3bbf5dfedc0593b0aab1f4861b344a2b81a416adc598a3b8f7a5ed7d15aad08ebe78edcfdeec654c3a35847f107e951a022e2e98d7c12debb0852d83834c90351d50836066f8682abf5a15e49b5a12d541b7a8a04097bd130dff296fb43509e384c550f47f22fefdf3d90c228695b1e7ab3ba84dd0168495b78418911141fe87bd6a486da05421f15bc1a853e2a1f958e413885902d2815aec67a2c75b21aabb56a9354633beebd53aa311ef772dc7b8daab113eebd4ad5988e7bf75eae45c01a9b35d1780f5263af7b7f8d7d50d5a6c66a0cc7ccbdf7ecb98d7b371fa97258f5cfbe70d8e28cbdd1549cb136aa4ba552d1e0d01367eccc27ce58191b96f54461f5b2c2a0362a71c6c6e01014672c8ccde9866b5ad2413962626a1d8f4e09b70fc80cced817fc1286ac2716142b8ad56af5b02a5cb5e90ac57a9ab12e980c451acbe4aa49b49acde99382e940d00a6a536fc356270a9bba4d1c72c69238145b700ecbbab170ac5cb5215549d5e69b72712149b213493c8a33b6d5c3b29caacdf8dad9590f9a6ca9d6b2b59c3ea96a535b52385a5a7ad87aa33bf52e5b9daa0dc9ea6438574b9cb1e312165fcfc3aa9476585552cbe6546dea755cfb4dd56a2d0a8ae5c4aa52d8eb7f65b4883356ac50d5a64112f78c0d9570e80a651d142b83a18b3863572fe28c05710823ce5815a6b1366cccacc9de2840c8b07d4773ef361eba68705857b5e9bfb16b6c6162190fe7b0ad136c6b69360128389ee3ac1cf69ba23bf59dfd3ea81a633d9141baa8148eba0d1b36ba990ed7f0aafe655953ada5d9e3511d90359ead4f13a71fdeb8d1fd464723ced88a692c93eb9d653db1a06e58a60faa7e50b8de9b01e90a5d14070e1c36baa6a6e6c68d199b674e7d407acfaca71b96e633d6c62864e3363963c382788e3339662e93eb395c34f7751606aa32963ec6e656ee9bc2f52f36874a1ff949b1a0f271663d5dfc584f992505c399f544e2cc7aa254d51e56e5829ae85bde140a03444f69965d2384ea641d6df6f4291a18a9bb2230edab9afaae90342a8cc2f43320e7a570ee701631a5afef1d94764b85e10845ce87d33ed1a5a8b64d8d504908e70eb02655a5ba546bd5e674abd56ab55aad062588142cea50aea722455c354909aa265544f50415253555659556abd56ab55a0dca246711fa945382aa4915a11f5da2356a73bae1724a4a4a4a4a4a4ab55aad56abd5a04849d12525a85af5a2a4a664944693a8929292929292925243d56ab55aad568b52aacd1aeb82e6dbe674c3e59e1a0a94913457d295604b4a4a4a4a4a4a4a0dd5500dd5506d53026524cd957425d812cd292929292929294d29555aa5555aa5d11ccdd11ccdd11ccdd1dcbcd11c58e9419274b9fe4aab58c80cd2ea0d852ca137d5a3508f42365b370a794b4b3509f7370a7953245da24b51516dc35353f386bb7aaa8957638b37457ee2045b790aa6c773e2391ea938dcc4a1fd6d1176f5c727298c52108c7da0cadb715f4f1f566b6b77fbafb10e225d33080aba3714d915a1cbce89c254cf1d1270f7ae061d33aa36ddbb294ff63d7740e86e07b9c301eedee1ba2e664f63275a066958d7e172102797ab2fb8b2acdbf8d6b722d5a6eb20cf52bcb233411daec3d133c819549f3b275c50e7543d27dc55abc3f77dfd0e77651604d74575525d96af6937a188883807995066cfec6c3ad4587d7725750864ee702f95aac3d1b29b3836b580eab0d072de4a10465419f80a2d2716441802b68173978b026f54248073970577dd555ff72ec8112d49a2dae128ecca9cddec6e25671d8eee7439bad3351264ee701daec63aa87b97a3e594854f847347069354406658a780cc305c2bad3b28acd6da511888d461a4ae6fa74461f5de142298d44da9ece8baaeebba6ebe833d4877650208922b157df7550a8814465d9ecbe56517a6621117c87e2e82d4b4fc4e769fd7984af1b0775f49eabb7797070fd7ba8270eec8e112a69fb3c67285027aae512a3cd733be29069e6378cf950c3c7b80e70f4208fc01b94803a4cc3967ee243c67ee25a33973dff0cc8dc3d30033f7139eb9a1f0cc1d85e7cc3d85e79c9926e199a9129e99d6f09c33d31b9e33d31c9e73ce4ca7f09cb9d2f0cc556968ce5c6f78b23073cdd5e7557d1eeb73cbcfb30d3c6bf03cc187079e3f293cdbe08983271023cf42f0dcc133d6f3cc83a70f9e2af03c4f2b78f2cc994591b9059e938bd88ccd2fca59ce31769e271978eecc1f109944261a43e69099049da933d710f2dc41e029643611419ebb083c83cc3e02c8732381a712786e2027678200e7b9a9e08933997e3cf71378fe9851a0f0dc52e079023cabb861019e2eb0796e2b7862816716b0e7d6024fd8e4c2c7737781a78ff9458fe70603cf1e730c1ecf4d069e3ce60f763cb71978ee9868e8786e22e0a96326e13eb71a78deb9867da641e0692725e2cfb4083c3fe911273c5324f03c616e20c7335d02cf1c130435cf940a9e359309078e19c5eb994a81e76b5671e399a600cf1bd305369ea9153c6dcc2c5ccf540b3c5d930b9a67da059e34f38b99670a069e33730c1999f98398988906cc8499497879a66ae0f932d770992eb312413ed722f024673da2e5b92281a712786ea0355b1304e31c2793f85c9fc0539c5184cf550a3cc35905ebb9a6004fd674c1eab95ac17335b3009fab167882938b1fd573ed024fd554617c0c0404047490c2803e477c20ead9a6087c083008df0c74a0f7d8555c656754761ac4413beb26bcd7f8cace3acb9b0967d9592be1bd848776d6536f352eda5923e19d848f76d669bc8ff0969d7511de46788b9db5d49b0827edac87f046e32e76d667bc85f0173b6b20bc8370183beba8b7198fb1b3f6c1fb0797b1b32ee3dd83cfd859efe0cd83d3d85943bdc9b8cbce5a07ef316ec3ce3a8cb718bf61678d83770efeb2b37e7a83711c76d637787ff11a3b6b2c6f2f9ec3ceba066f1bfc043bebdcbb8bdfce9a066f2e6eedacafbcb7f8b5b396c17b06d761678d7b6bf11d76d6317867711e76d657bcb1780f3beb17bc61701f76d6b7b795c3ecac5bf076c16decacad78b3e03776d62a78afe028d8593bbd53f01f7686c27f1cc7ce6c7ef31c3bf371d881d8198ff778103bd3f11d176267f6f73a7676c2ff217656f31c276267afe3f88e9dd9f88d97764673d7637626f39917b13398c79cc7ce5cfef21e3b6b3979237636bef514ec2cbc781f3b5b9df51f3b531d3cc12180823fa0ca1d40c57b98e23c48f106d82e258a33c004476a7a14280ea5045f0009ae80279e80da8f98fe6404cf22b813276ed4c48b42700450f90e4b3f00086e800fbc001e380198b80e1df8003870012cf11c948ec3067e83066e83120f4012af21030700064e03129f21e94d8eb80c1738130b7c8911575281c74081c350c489687f81882719e22e08f1a1d95b98c09148e04782b8909d13a76553be829d130788d320563895add06bb0f06e020b2cbc9920f4ce2224f45ec291b7128e1c79ab81e43d8504c93b092dbc91d0420bef230cbdd3181a7a1bc18577115c70e14d84246fa92449de68bcf01ec20b2fbc8540f43e8388e81d0418de40800186b71931bca36288e1fd03256f1f28e91e2c7997b164c99b074cde3b60c2e44d860c6f281964788fd1e4ad83264dde62ccf00e638619de39a0e18d031a6878830180f7130000f0fea286f70d6aa8e1ed4500de58021080b70d6c78d7c0061bde5ddcf0cedd70c39b0b1cde34c00187f71639bcafe4300301bc65200001bcb518c01b378001bcb3d0e11d031d7478634180f7150420c01b060578bfa00005785b31c0fb660003bc5d7080770b0e7080370b76785bb1c30eef15d8397710f056010210f04e819d73a7e8ed5454f41f4647c1c8e8374e6ee3c4c961f93e727e8f27e7f1e4c9771c5dc7d1d16f026e1390805f013f41010a788e05bc66010b380e287f4181f21b516e234a94bb904e8384f419065c86010c788c94c34891f29706dca5010d38c9c35b78e0e1ad1e3ef6d0c345073c748003ce7ac0570f78c00e04aeb21f86408721f0708afde140581fba10b22bfc8865e148acd05bb0473e6491dc05dbc293d8a1bf605d38914d7218ec0b8fc1125d8985e14b6c0c6762955c06bbe44d2c93cf6065380db6c9016067780d968607c002e036d81a7e830dc071b0363c077bc3056071f8006c0ed7c10ae004b0037801ac0e378025c00f600bf01dac018e007b8017d91d6e64117027b6e8d91afd8975f2239b9f00fbe40ab0475f804dc0a158053c8a5dc0912c9433c046b9148bf40658069c072be53dd806dc0196873fc0f670085807bc651688771076ca5b02b665ef09d80ee23db32d81b710b627f01ec2f6ec4d846d21de34db43bc8bb04dc49b02b669ef0ad82ee26d846d0abc2d60bb02ef0bd836e27d846d0bbc936c5fe08d84ed23de18b09df4ce806d24de49d8c6c05b09db19786bc07612ef0dd856e2ad645b03ef256c6fe0cd01db4aef0ed85ee2cd846d0ebc3d60bb03ef0fd866e20d02db1e782fd9fec09b8a6d10bc43607be9dd846d2a6f276c87e02d02db4dbc4760db8937936d11bc6bb647f07ec236d39b04b66bef12d87ee20d856d12bc9b6c97e06d02db50bca3b0ddf4b6d936c15b0adb51bca7b06d7b53615b8a7715db53bc51609b8ab7ad5255d88923609954af4938c28eead6a96a436de34681ed133cc8aa6c13871e5b95d3c4098a809d5f1527d8a1f7542a16ecd043c0e64a044cff009b5da2c81c83bba33010cf890385ccaa5cb6d183cd16e71a956d70ae515988149b791860f344b27946b17942b1792ec0e6a9009b67026c9e4736cfdcb973e72eb2b973ef6073e73680cd9d3b77eedcb973e7bec1669a69a635d84c33cd34539aa9159c6b54a65ae05ca332ed02e71a95291838d7a84cc9c0b9666a062502ce358aaa81738daa41e05ca36a1138d7a88a04ce35aa2e81738daa5470ae514fe05ca3a4c0b946a500e71a65e5fb0139719fa04a5118c507a26d270e9554b9da27b0195452a3aa8d10d0e8cc983fddec89c0ec81c0117e9e6b1288307f7e7c9e657c9e69aa1af3c72785e79a149e4f0862fea460e4998791671f45cc1f233dcf383dcf4090983f3d3ccf3b3ccfb125e60f4f91679f22cf2a50993f45b0883dcf2c9e983fb12dcae7c98514f3a7f462e7797e9182f9b3230691e7398695f943a407439ee70fb4983f4384a0f33cd1e862fee81c41c8f34c0218f3470813823ccf357e820801e4b9893063fe00b140ce731f4184f993a304ce736fa05363fee078e0c773832088f9f34304283c375311f30785a69be78e0289f97373029be7ae6289f963c302d873bbe00786858fe7cee289f9e3638b1ecfcd8514f3a787173c9efb8b14cc1f1e62ec78ee31accc9f1d3dd0f1dc3fd062fee810c27d6e34ba983ff708f6b99300c6fcb14cf873af41c6fcb910273c5322cc983f275820c7333d8208f327871235cf74039e1af3a7c603389e290882983f3844f07aa64c45cc9f57d38d671a0512f3e7c6096c3cd32a96983f3658e07aa62ea0327f5c58d03cd32c9e983f345bcc3c532ea4983f335ec83cd32f52307f64c48879a66358993f313d8079a63fd062fec008e1e599a2d1c5fc793982cb334d0218f3c78509e4335d838cf9430ad1f25c893063feb458a0f55c8f20c2fc6929313ed70d7c6acc9fd103e273054110f3471441f85c998a983f6113ebb94681c4fc619d60f55cab5862feac58003e571750993f2016aae79ac513f347b5c5f75cb99062fe7cf7a1dd8b14684182bce7fa852a05f3c7fb03de556e261df0a6e266570fef296e3e0f6f296e8635e06dbb3988947714371761c0db0437cf1bd2bbe9e6898bf286e2e69983f22ec1cdf369016f12dc3ca114f07ee2e619958077ede62975f466ba794e3d798fe0e696e5b7086e6e9a93b713377792d1bb899b5ba9e81d829b7b09015ddbe1bd7473db0ed04e06e85b011a4780371337774e8777076eeea701349400de4bdcdc5139bc956e6e291c7aea062ab3e1adc4cd9416009a54c33b0337532500bc3170335da2e18dc4cdb436c33be9666a6bf23ee266ea24c3fb0237d31b93b7056ea6b8256f236ea63925ef0adc4c9f627853e0660a05c3bb889b6914d19b7633957ae14dc4cd742ac97b889babcc85b7103757dad07b76734d6ae13d819bab1292b7046eae4b47de41dc5c6b426fd9cdd5c6c2a7dc5c9d56381037d75bd07fb8b9e270ae513df83edc5c73583585d07b73087dcf1d1a01cb540f0112d33fc0019f383cd839711a60e7c491c20024280b5040028e9ed0307d76a284e98d96307d11026c987e8703dc30bd017098be00394c4f80274cafc300a230bd00a4307d0e3d85e9719061fa1b6898de86002861fa1a6a989e061ba69fc109d337b9617a1970989e490ed32f79c2f44aa0307d0c51981e06294c4f44a730fd0b324c9f8486e95d48c2f4434a98be85254c8fa486e98fd830bd9013a667e186e957a00fa2c7764e1c2015e87f68647c4ea849c1070f8be98d00c1b1c1f43db11d21989e47051f1e4c5f240b2c625c6c517ee1c5ce18628081e989fca0076460fa216808c10c4caf9384231001d30b996b4c264c35307d1022840802d30339c2024560fa9c0d288104a6c701810796c0f43f98444005d3a31045d31398fea68a134881e96d5cc08214607a58165858c1f43eb8d8420b4cdfe30b2f788c210618987ec70f7a4006a6d7818610ccc0f43709472002a6b7bd4633a1d5c0f42742882030fd094758a0084c9f63034a2081e96b40e08125303d0e261150c1f4af289a9ec0f437aa38811498de860b5890024cefca020b2b989e868b2db4c0f4335f78d105a69719430c30307dcc0f7a4006a6874143086660fa97241c810898de85ae419940d5c0f42411420481e95b8e0832254a4a25a5925249a9a454f20c0443517a413e644bee7d890fd9922ff1215be243b6c4876cc9339095d825f021eb827c704cee3161f24c62263e4c7c98f83079068243b149608dde4f589f1a84659001020406fb5d2e9294c10a0892a4cbf557180c08967906825523d85a5da6face769013cbd4fdc83281ef9a65427a91658a7223cbd44c9c6599ba89ebd06aac9788f2e64077e0de81d06aac99b87720b51a6b0fdc3b105c8df507ee1d48548d3508ee3d08adc67ae9de83d46aaca9dc7b105c8d7508ee3d48548d7513f72e845663edc4bd0ba9d5588be0de85e06aac4770ef42a26aac99de8067170fcfb02045260e02cf331781e7f934a37e789e52ddf39c02e2b969539e3b49f6dc4a5db349e0b99d72e372fd84f4dc512d45c4734f515a11cf342953a50a3cd39a11cfd4668167ea7481678a3be299e6e81312cf340a03cf542a03cf742a89e74a53e2b92669e0b92a6de0b9d65ae9b9da9c720e9305974660419908ac0aca09abba3561554b21b02a1915fb412dd9ef0602fb2d7dc07e320f580f8a09ebdd3a60bd250e582f8af5684b58f0a6543750355095a84964600a03524844253d1d91bb00ce024e46d82a50a380521134894669444c0d21851425c4d32c37019c049c405b10b596294d01a29bfa41ca87a8083c4120f7000714e921080fb6015656ad279b11e918df25f2b620338fed86771ea44b02e2cc54cfd4dd11576ff9d015233365667a86a6310d670fedd39b1bb5f10e824284d058495d6feb5d212b76b9481b36866cdc9b01994b9904c83cade05ab885316ebe70e010a190af8735a214f2c5f3546d3cd15b01990309c51889c4f13922a9e95fa1308ff5ef37375a760ecee6e4d0c8b9628eb0a8488a5d9d01d6c848ca8d2c038c8c8c8c8c8c8c8c828c42464650c81b3cb614a6786cf612e1786c3c57786c3c55789c78723c4f3c503c65f09c41632d4b3c566c9104f6ce73ab31fab50f190e711993f3197591515151d1f7229f2b45d607e703e2306cb1a8e8938a41ea24cd9eeebf563965d092c272703957a068291395235563b39a9bc111b0f79ca99c2c34361ba5ae60007b0732a331112a070b2da79519e4b0f71cef2b168f15b48c61157d08c72a1a8b0e447d7245d60777c24528649e5be03c1990390797836b2334881aeba09ae7d066cf976f6e43491367b4d5d8ab49374e09f28ec2d8244a9487516c8d539823ceb11fc58628515e54f49cb10912d243240b569ba287a11011a909d2ebf5a11ee92b9b858c4dbad7aedaac1e8644c4390ab158167cf7592263937af0fa50c3084212b2a0de191d1004993baf06d1daadfed921ab55b7bad1812a929d4146368fb720f7c9778bde77bc51581721d91944c723457772a01ac5ce2027451e03a6e0be3556509837276d97568600fe1ec5cea0d0e6fbbeef89f5a0d8d51700e5457601b11ae3a9426dbcfeba1b2432fba0206a41ea40a163a3304fa7362ad159cab99293a33097cf31078773b43432b24747377ae8e14801dc87a6c233897d547806b18f4f12f6ae00bb7a026cd1c3efbe9674dd771feabb0bcb35017de80ede2941dfcd301c6ed1cb82e663844f924f12b4ecb977e5e73c365a7ef7ce5385c789964e7e05882ae045360177627bfed9a2b36c632f06e4147c05ff3829ba91ad5e74274e9cac584f1e16e4f7af8ade364d68204507aaa298864dd16d9ad046262eba133b719151a8e8367923c3618b4eac2845614245574c2387c7a6b3546d3c9daa63c3de1564f6643a4b35568b9e8f5f5e5e5e3e6b4ce8e5e6068e4b6850bd46360be16aace8e61b3ddfdc46a13ec642cba39b8df0155a8e38233b5e315ea130263e3e3fc4b61f0e9148181e320af3c46f6462abb15590777014bf51088b1711898cf9cb88a471295bb97c48e40d1f4912203da81a03a36aac8351c574d87b4e173935983daca7251de483c342e69c9b1b16380f06640ecee5443474076f4e0f649e58e0bc17907d318ec23c2ba40f59f541f351c4ec6195b20214a0009f355616e02fa35094de62b503244b92268ef7d505a243382db4e0b1c1c4a9c1c4f1dea5acc678409024796c5024cd756a35f685cc7370b4fcb0f79cdcec0173d749f2643938103771bc2db4c05131c8ecc9885e39730bdceb3907c7f3d49fe5e962e2780f6566d3968cd83cb989e39d701e5b8dddf0d85cf53907f7dd9bdbfbe676731ba578c84012eff090edf0908d38988844422159ac7b377208474b27f73e74859646f73e14c6508e9645f73e8485c66a4823b6e571a2302b6e2ed1bb914f2c4f150af39e2d8f53b5b9e1b980cc39382797a7ca15b434ba3c4e385a165d1e2b28ec0a8dd5cb73bbc142cbd5e5f15af0a3cf12e128cc23cac5c8aa8df7b6dfce71640673bc4eb8711b2e1c34f6eaf8b1a3878f19d88f1f3f6e50c0d11a6f1327876f6004dc7189c2bccbbcc6367bbe7b5c6019a8233854b9017c073bf1016c3e1ac0c7255adea82e1feb330b33c2a0e58b758f50cc1ac215d8fb88a3a5083546a541330427b0f73157635d907796eaabb1d1b20a2d619c68c963c58d96e3bdd75c5183a365917bafb9424bb103aa06b059b4027b2f800f19f64e801e34ec5d079bc901d849616216ec3d079b451c6cd609037bbfc1669d34b0771b6cd6c961ef01b0b9825183cd150c00d85ca568985670d8fb0c368b38fbe0b0f726730b196c9e5698d83cd55862734ba1c4e636830a18443657245eb07995c4e669c5059ba71a4336b7142dd8dc66503962330543c8e68a040b36df156cbe4136e714017bc7365f209baf0a3657a91f9b451f9b6b540a765298919b3b510a7be7b159952b62b30885bdc72c52e3d26670c7669288451a62f39804f6ae63f348c3de85d82c06b1190462338873461c9bc11f36932858a41b9b5d9cb0771b9b5d309b5d6ed8bb0f9bab540f9ba7166760ef3c6c169db0f71d530b1cf6aec32275d766d2dafcdb9c3303ecfd049b9fc3669e27ecbdc66612078f0d7b7fd9cc03957d2481bddbb0d9e5b2b9c33436d7289c7370375960ef3236af624a19f60ec343962b944b0e0ea9c32d51506312b46cddfb48a365eb223142949813976a6c06291931de2c3e89b71ace9e4c65136dcd8d3717afc676fbd4c4f13ea99806f64619f6ba36863f7c0d850c415ab6789084f7dd8046535a7a496a8de2944a76450f9e60ba5b055ab92b7c10859589052e0737b7c0d1f1c80d1c25079e1387c71603c593c2be7c738391128114f6be7b2b20f388c3debf5945af47a195a81abf43217bfc3ee2badf94b6a254dc801c584a0edc1388aea07c968a41aa3e3bbf1a1bf63ee2aa4de3f1a60212ac3643380af3ea7d7d9f98946ac2896e6a811bc2f1d8fae6464b4ac723158be0ac5d7113e7e636ca4270c5cae5abb1d5d0ab6393ee7e1706aba29c80551188c27d07d8c2a80f94c988c052fa8de798c4a5022d8f8dc254b90d38b172e91e6900dfdd1fba8377daa8202d6970c79222e30a2f49a9451b45b19bea44db0e6a9faa9ba2252d29793511d38badd189b6325035b66ae35d09233aa824ce18694e8925a49430c1cd0d7bcf3cb61a9b0c5488572e492aee314957dff6e6569381e2b1d5d830ae468413c2e5e06aacd2d04ab59baab17a3ba9da784da330ef3e90f4e38d961ef63e5e41cb69054a097b1fa5bc8f59686ce57dbc42cb69658c29ecc9b0f78c03e7f1863d9c47dc14388f51d8b302d5029cc734b0f73ce6b077d5d79eac96a4a444cbdc4bd8bbd7c2de3d1a2de9479c3d23bc24b08703674fe6d57befa51aebe60d925640f494161043a65020a80080e84a5626a8843f14a0d232e80395a5f73eef49b5a38809e78e8c6309d3872319647661b23e7957a552a94632c86e8996e4e943d2d2d09c3c8cb6badbad566331b56a434197985b6ed71148c680f44897128c6b26a656632e3135fc7263626e98baeccb7bcca704cdd897f7ee535e5e5e4b66debdc9ccbbee33f76e13d763ae0f31773d46566de8973b171314e65aea203a06097e8e2e25ef86a8748b99d9985a8d913597cb63662d59628c70b9e4ac1b9bc4fdd5c32a7e23939820a68d8d6a441213c484d1b7a83161741452321362569bf042c490b2efe531b29797872f96c9f596a989435b4f902f279d80c2090a73d996a96a43c777a31015837cbd1c88d61109b9445f9030c5fce532758799aab1987c976710ab94aa8d65bd45aac6bad3f1e61ad5325563aed31b366e6d51829ade656e06bdc3dc4c7a77b94ade5f946e317756ef9239868629ad8a4a99acc5c8728b1a3826084c93709502f1119adb3901abb12a556dbeb7ae783f5785aa361ffd4ecbaf7b1866ef2d1198c2de5b8028e9d9d0f3bcab22add742da1c90fd4ef47240e6989b8b8970ae90c3dec718dcb07798fa962b6cb8e534de61bc8f0f4395d86392c6de5d4bb484b977f2e6d755ff46a2f11e4d96f98d9337dbf0462218ef3e21af3a79f1ad7b37c7a03a89a4d7105fe13dd26be0964b7a17c31764de6a8d80545d3c79cfe5aabfbcdc57ebde5b2e5e655fad8757fdc5be5af748cbc3876ff9cb43fb961c1e6c9151dde5b64640aaeec9cf310699b7dc27326fdd27346f89b9b5dcb35925733b9a7fefc624f52dafe310cd9daf2ba5e2f1aab7dc7ce37636ae948a61ae3a1d8960eedddc18e69ecd4060afe5e443d2b6d80e5924eb2d27616efe81350e55a216527529354f712d51f21d2dc593374ba92e25cfba96b020bd237131715d4b1446c3b3a678d2b2ea28c47aa83a425e65bdf66e06aa40546cbdc58e1e4d497559e27dc27a38c4baf9233f47323c791797bfbcbcd55275b21aa6a4a2a09c9e72b8db1425275b6d69aa2ad5a44aabb2a729a92828a7a71cee06849293adb63445956812a551d9d394541494d3530e77fb41c9c9565b8291a1a16191b845660aab5a29c6b60c7b2ed7d48c148863a29ea05c37eccde0724ef3c93513d31d7b33b0982037fba08455877957047b6ff9ac31d759349761dd0cba409a9bc91952e666176e39cc63ac0b7b1198c2aa9b5bff5efe1da8bed8a38e86c9bb88e27d423eac0fc9874754aa3c05932449daf1e17378064cc1aa8b2179cfe6084c8d4220bd1e8fa8de72a08a59adafdeb28610c8dc8314cedf5bf7a8a3e1701c1bb3580c88ca1198c2df5d4af42e26680c2ee616730553f7f62e0f3d24d320493dcff366bd3896ba05889e425741d090c2dd3f5c9fc678aa311a34c720734d0492325975f7a4c8da2dd598f7efae82bcab5aaa36ddab4583a4af6735b542739d2c576da4a0e6eb13edbe1a259ed5f2d5e92b0f660f0f246e9dbe92318db44e55b66a43670fa8b261fadc68c583f6c3ab9687dd28d4d25804ada7b2c9544ea0edf068eb1952519825ae6c142064b8e54e4c718bad654c9c7eab923181f443501cc3ab58e2650a4396aab5faea56a81a5563f5a9daf4ebdf7d9ded0a55cba850b5d9534fab55dd3c4f9513bb7b0ad3517c5b100785eca2264e5090d8b8d56abdd56add1a255aa423481af7edce68b1454bc5203b5144a2b81b91acaed8f5acadd681e805270e7d6be21a454bb1d62a8ae2eb2824b69189e96b548d9a3dadf78c385a5ea165785647044cbb1bd5a9e1c9bc2030a57945609abd23689ebd244cbd246c3c83b63a45019967ef02987a4460fa993d09e098676f084cbb35684ac05d135e9e5b70ee86d0f41d10faa7a5e967ee8a80a9921498a600dfc01a5ec2b4c375b9ee89c268074561f4d9cb804c8c0c865ed140287d68a34f337b2753dcfdf9d4a284e92b6ed70fdca7e9cff8e86c41aeb0c14d8bd850c0fd2b7a90659dbae9b293c5664f37bfd30b993d31a79fb9c434a73e17a94f3e660f787a9bd92373fadb65473bc1dee8929e6c238de96dbcf4cf0cea917360d56c9f19946730757171b98b288ae24197bb4c1cd6c489b9f192c1d0c224983a15ca5a3adce197963e69fb2db387e40ff769eff4bbdc8da7970e2ab3703f476ee609d316ee438dad3b278e682b542d630536ced781b9b1c6a811ce1d192617bea063a192e8444bcfc3361cc46a802b28ca0057217006b168c5f78956884edd5870ff0b9940e6f0a9c6425cf844940bc3a0b027c82c7ef5f061f884c5f08a350a136d2c517cb2baa24d07b2f1d3ec99351b2d276e20e27b2499a030dc3a8bca1558fcf710c49384426261841ee0577f85bf96d3274817968bcd2f5f1d1c85fa8a36b1d66245285ebe7a166ba28d962eaf2f1f9f577ff993d55b42a2f12e37affe7285e68ab44c2a51aca96c1806b5a9628d967d2716a1786a5d7149cc6116127c1647a2ae81acdef76b20ab8b367f7845f45d7c18e6682976371f89e167c31c0d716190a27885c2ea0a0c57612eb4210e47c5db0d8b56885788565058a5adb047a2f1e18dc26a38da87e129b5f3fbca3ee9d5bdf10878f1e24d01af560f576f3b717fe119b89e15865014e62d21740a554ba0ada152159de88e985d397cc2e1531806142dbbfa3471ea6baeda785d15d46bcff33cafef6155add25afdbecf1ea972580505ae4e28994007a90e44dbaa9628cc0b52bc594161f57d04293a8937d5122d3fd1a98a4e14565fb1a704b23e57d1a9d6832aa58953731d8c542853834a6badaa5c55e546f051f9a87c543e2a36dbd2d247e5a3121535353547a18f4a574f35063aa6d45675e0050a59fb52c83abb961985d1161aa66f49eaa6588e2d336a4367f55a9d172eb5c8bc8bd4e189e73d19903ac0395c6a91b5910e4780693f5caab1af45665b6823120fd332c81c268549b4ec4e1f26d175275d371c7e1df4dd176b4ad0552085d1af5a6449e09df5cd8a1256dddca2d422f36e065b662db4db22db01996b548daa96fe05477540e61619a66f7ad70b14f5541b50116181f5efb9bbcff2ae7aeeafee6c903691de3b06ef4ffae0ea2cdab4c96a4357ac7927665d5a827d950d024461b4bb2d34a1300aa5032df3943a002d73cb8c4428b4534261b4bb3550183d2502090509c501f4526849ab124a6d9452daf5e3403877649d560139a4c273e2808f4185a3f41a36aca3f8b05b48fc0f22f89289220b44ab12ef937ad55f471ae38ac5185abaa8f8203526be5b624b7ccb76d4a6e2c0e2495a7a171f4363b3a64e84a9220663136f19b80f43c58c55a99a615680fbe2914828a41785acafd5bbea20f86e01590f5441cb02ef93ca0a59df41d5bb7a5554f0e25aef3dfc30eb9df761f13d7bc47b5d55df9c3d2016dfa93c517c474bd5c58b1769592f1e5459d08aa24a9cb3e706160fd658cbc59335d6ba78564b4b7c380a8961cb85b6bc882acbd43a686f19d4a62f1485a1e0ca6096ba2066ecc6963b598671e24895cb3050e0bea902f76fa8b85901ee83558c113b197108f9c606ded83a997702325f2819a6f94285f32f5aff95347ece1ef1e3cd2f1985f5bd2a24f8fc922179cd28ac2f54524c282356ab7a1d91a85e6fa623921a2c86cf170ab7786f6c13870af2c686fbef64b3477c8b774e9ceafdc6d6c9aaf55eb2d76c16f4c1d8f097bd93396e18c656c58cd5244c9b244c2270bf2f9bdd0466ee2a80fb757a2d5d9d63abded608c8aa4363381086939c73ce390f44e79cd2fd249c3bf2bc4112f6ba9fb0848185c2bc2bf893c9614f0647612e4978bc8db76ae3dd4856268bbea2a25587434aca88da15ad3e28992819295aba68709639238d0ae298290af3a68c0c0bad5eed8b861fbab0c686059f81bdd780316337b7998219bbe1220a9301d505ce79d202d758b981c18c0d7921ce37b76eea7b9a38de65caa8b1bd26ce8d3b0af3aeba32513235b61d9ec11a5b8dada64a0e6e875b63ab71a23bde55f70264aeb1b92461ef354e354e35b68e79c25e07cd46ea6cb45421e0fd21c0de5c91069965a06e6e4720a7e056d9d790ea452fba79c60995cacec854459f7142066a664661325035ddd1300eb74a05e206dfe03705876d5f43fdefdfcd408c9882e778a4e6441da9f83b102372701496730685795e1a64cec119c11a81cc39b89c337678cec902163d933b3cc7e0e71c28ec15e59ca81ca99c34b0f70c448681ccb077b1ea1988113c56d01d2c02ecc4f7bb4c20ebde65a96a6c35556aa06acea0b157aec60a5a4e2b688481bdcf2b354ed87baec9d53cd59481bd9a1bf6ae9289a2657649922983963258e68c51687591aec09e8c539691a137203bfbea8317624a50940b3125a8fbb10c5413325135d6a47b3311e5ddc4f5017c9426ee03d2bb66e25382bc5b94b36a6c5e075218596d3a08e02d0aebe61a5cbfc6e6751d920d83aada1864b5dd54b5f19670f66429dc48cb272d0770fa50cc55314a8412a1aa8d4af56ed577316a00764c4229053b2a511813143600ab7a0a9666048dcd9196e46400101be093c6c6a56a43c725ecdd8ea36d5c52dd68d2b68328d5d7e3d20cf6ba01a4f0390aa570201afe40aabebe4f543fc043953dc001ae7a5b15dee1e10f24020e44c371697482964fee7dacd558bef7d1e644cb1dfef007328fb739b560d92a550e44a3842c905a034bf9de988e495cf8bb6348c5aaa958adba8a15cc0aabd858dad6b61f1d753c3629f2e838171c1ae4d16f6e37b8d93327f66e6e3732e7dc9c2b1466547463f5e63c559b2b68b9ba39504717e3da76a7f8c5b91e472c146671cdb66fffbe1e242b6cfb82272d59d72789c2eec4f1fa66eb5b02a4108f2c2f1aba231de9fef01aca0d3d551b0f6c2c3cb61eb41eb4222b35d62fb8771e1e2b3c5af0c8a0635d7f6f01d0c3b63ab62a14d62ff813db56a0e00ecc0123878c1d742ccaf1a3d89c1d3419394f61a7414e1830010aece119724f5e28e5bcc8cd8065863068d98245a786715772d5e669e28031730e40d690734452b518c2165b08010b2cfa565c829e7d6079c18ad55fe1ab7a93bbe962c690eefd068c1b1c74acbb6782928521dcd095a1dcd0d3101843640ceda06dbca0a228486600a16d8a2c129561292436f2f182a2a2a2177ddff71d2c2ae2c1855777c9d96296aba27bcfd1627edf779751e833b2395a4c20dedb8acd99c1e462e2ac906cce53b5819a38644c9b89e3dddc847013e7fb56ab6f66757385962df866f3dbba6028b48570b3a77bd008f01026dfdc1e7eb6855b02e40d16918ee3381d8fb4f017e57d25ab878cc2a628acc54346cb160f19ce27a743dffea46fb626272797f4350def3cf390612b9eacc656412a954a05ae583b706b01f5a3a37508475b3cbee33b783c9378c7bba56a0305f87ddff77ddf474444e4fd80ecf13328cc7b4761507272ed838ff5b18a8c5646abef89c28a58a58f0f0a07d8a29045f76e649e5b7c4facd015a15cb5e9eeeebe422e608561188a5f8b25848590d12724648445025439fc5d21212b38e6e696a305eb1b7aa225ebbb4ce0bd0f410d453175f73e7486d4501a43595c90b93073c188fa89b15cd171fb36b82b390a83e5562c168b157ae3aa68f59d65f42216ebfb3e989e634175501d4576bce2eb0113786691861378089e5994e1032cdedcf0cded260c2c6e6e3757dce06ea06ea26ea46ed2b8c942632eb99b2b55b0f79b9c900f4ec88a90101ec771d4d1024552a46590f9e6566344550e448dce7a577926ca51188e07a4d1293e1065193d878b9eb11c5c7fce72fe332d4bd82b839c583859d58a7c68d5a607e4ea89280c2228a2285abe569f98e80c29a23488b2c86098c160042d5f4537270cdc54dc1ca8239bf39493abd91c2c477aa78a1dafa0b0116774f33cb560b146a1efde5c19856e72140685fc316b0b8944e173d401c563bb81fb6410215c4c19e4f4c1d518b64246dd7e40abac83351683cee80a081615ad56ab151489f3cec9add57e44c5bbcabdeb2ccd9e9ea2e859a709ec5d87ca34523455682aa6b01faefd7bdb1e9e300ab5ad66ab7d27d46e4f61bd175924292411ceab535be45696c23a3b85ed70b5356a0af9de54b02a14857db7132bee9aad5013a7abd8eea4b0233b714f61296e9b0d03b35e647380590703b3a6b08dbb8a9db8a9a847360a1032dcb5cbd4dd0a556dbea357b147b73e4d1cd67b0ad671ce5a85df28f4bda8e8e84094c52a2a52e1a203d1239b81c02c233b717f9f51f87df51fb306d25f7f658d3ec7187e0cd140fa4607a23f68ab1f2c565b611b1b592bac107272c719857da390938745384eac28e58d4246574cc303c307e7cd3043bd93c2727840f6c52c39dd281b6744de0ec87e4de30649d1ed2a0fdb0576f56e8135326a1660f1f51658b05c7023db2d70d22c60bdfa48075f6ded4e0378a477387ce506c661a4a28345afb6bb69b88e8fcf33887daa0f8d0c20ea935463b326db142b788944c5a580b8adb8771fdaece9dab34f05b0779f22a691aed52d8800e0a384bdafc0b6ad3502b26def37150f718c424dc56db26d54b4ed45c7612bf2e624c2d5589d9a3645f78a68afc0d63326aca7b0dd1a3561458f6267556a0a29fa048090054579c56db335aaadb03c80b8a9b8b58c092b6a2a8adeb5a2a2879ecd32d5f714f5bd025ba3aa4dd1a3d8a20a35718aee419145179d18dd4935aa454e8c9c3839503d7272c53428cc2b7a57b1f7e68a2b147685e2a71a9b4132b46a93c3847813c56c479c0c0e59e224bb65146a199784a4986da3e04f6c9fe06d63b07723bbe6848a589450143d282cd6659d8e41d63cb13957280c673bcbc9d11d2fd7396296cd3cb61c9ca7e399c77603f354d1019973703cb69c275ad26f6e41f43e3981a07e90576b41f4754eeee6e0c4207360a81864e760e6c8246c8950482c840400d2d0e4a8c0aede29e8ba57f095d51dd47142a7a603c515d6d7ad8217d94e01cb167d2d0497732527771e5bed2c5015c20909ad6e84af50188989aed41c1cebbe584457a048190249e48591837379d8dd589e723957786c1e118eee10e5e88ef7ec4ad2f1bec07789e6164444395a4e2d268d0de938111d0fa9f8bd6bac76f7806a893c1c0e88703a74e4e0c2ef1b85be8ff50f4bce951c1c85d1aead9b9c87c4c337b889e3fde696436b5cb4c2c2627d4667d9d53f5bb42a02b191c539fa32d5e7a8ab8b7314865b44316ac8271df276524a828924a28c649c7480224511aac6eaac319d771596a97b1b41611eed41236d4c1a73709dd85d3157c313db55bcad8def1352e243ae2f0a6c94f7096c53710f0c3214400e0210c073c8619c8db3da0fda8f217ec87ecc7ed0582cd68f21b2fc90fd98fda0d56a3f643f860857b66d47d6e862165ab6ede6c66dbbd18ffe63d646263ea2d1f2e887d30fd98f21b2fc1822cb0fd98f21bc27f2c9d7dffd31c4f77d67ddfc83d661e07e0cd157cc4261ddddb56f80aa4f13a76f96b2fa82b4c1c7089f249f2c59b264c992254b96ab030585796da32c9d5a0c48972c13af1ed2aeb485a4cf7a1d87faacf7b8baad27c85792268282c2bcc3bc1339e19d7e645581afc65330380af56d3d4176b88607c03299413321bad70b8174f0e0586f5413a4eb9374896a2cd659d78776899626ce6d56dbc06a5677276bef0bf286e78945962c387778c5b2525658e80ac55f90361c59a3ebe4b0d092d55f142d1bafa6685934a3a5131a2d8b2e53947b1f62c4902468f9faa24c916594fd90fd18e2070db3ac98654caae36c9c4d71201af290b16e063f90478f4d8f15a7c4a9b0661ffa7d6d535642abdb4c15bdff9dc5627595aec22abab9312b8610b38a8a6ca658bf91d192f57e8f51a8812acbf68b6cdbaecd944d13be6314ea953d12a51a1fddc8e85dbb4d96363271d76e6446e7615bd97128c435f4c40e3b39ebe6a32fb74f639b290afb7e74ef06e493be87734e8f4734e78996b434ca37326c74232c3961d0f2e87a4707aadf28748483e8c580e4716a2f48159c3c7462fbd582ef2c929303512db0f8f8d058569c1c0b2c56703ea0c571a2a56a43c4c92432841b2a4348df2507576dbc0e2a03e3384269108f8d96147bc782cc3c36d616b56e56b35a85211f9a4f52118bb53aeb5db46235cbe53e341e1b8e6e2f481c8896a0e61643b8b0c34e60b81c5e157de5e4e6a3fa848bae508e0a5da130cff38254e1b4c55469e8a07a7d9862f46a6950d7acd1759c68d956dc68d9351c2dfb8a4e4ee78996afae7dea8441cb155419b43c83962b299d3474b2d0f2e5e4137f1432faac28c543466153b49c133715f72bbb83c2bc871eccf3b0844645f7b5a4be7b53d17d30ba45b749ad5382583620bf572f888f204552a801e9c3870f718ac2bcfbf031a365d37c2441cbbea2940fa5da15d32893ca25af94d192622a5ecaca19ad4ca254e261048d45b9771e325a76edde79cc78d068d954dc3b8f2468d953dcbb58eb3e053c787dc0b82b2e4df0f54dc0d77a451fea94a0be59b461efded8f7624046b14458a88df7a6c212e5a6b0446174cd12e188ae783120338f6da80bf0510e44c11a03ef0f4d4dba23fd877af0acfb4377a4b3c21e5f4beac1db500f5e1bba23dd596d58464537fa91cd53f0d1e92874f4b068b55ae5e048cc2a2a62d90c73c24647b66bd7c83aa939b94457a6d2ec699d9a8e0d04ca91f579de2cc6551bd6c762bde00ca7d0daa458a20c463a102047b23957a88df71eb41a03efa43642ee512130d827091f259f241f1a4f151ea7209fa3cb3d1a9053f0c43dcf39530b1a45e44238a12b6d9f6314eadb6447c33c3697a76af3e284504eed256769e2787f1995e4dc5c7183bbb9b9e4aa8d2723b6ed30945b0e4e665cb20aeadef6066e2ea6f0cc820c2c377866418320e01c2d664c08d7527c26614a8a0851664091f10406f6261639ec7dd5522c01419274b98e852d49284928492849284928492849e860d2ece9da991c3972e4c8912347ae7a9a3d47f7ae5afaa2668f937b32243224322432244864489038b5e0d482530b4e2d38b5e0d48253b5f1dec23fdbec319a9a3d454343434343439f33268354b5f13e5473a1e642cd859a0b35176a2eb870ef367b56f7eec9bc2449922449126b9204080cf6bb5c4a2f28bdf0396333bce0c9ecf7956d12bcc8f61337b25d823bb10dc559b69b7e64db0451bcdaae6d766226493536436eda7807419274b9eabdc825f5a0551bef3d6832c86a8c070f190f190f190f190f190f199c7c9465599625102710244997cb070381c17e978b247d6a2048922ed7adcca0040406fb5d2e10244997ebef7ef8d9a2874e1e7609ecd1c386c276ed613759160982a4b01fee9a656a25bee4a90948ba0e6bd2c5531211511251125112511251125112f6ce04078224e972fd15069b35c061ef4756c892131bc42683130892a4cbf557182c061956e2a4c44989931227254e4a9cb077230ba4c802b94d1cef324835a9310102bb8b5c620329cca4c6a4c6a4c6a4c6a4c6a486bdaf2c105a4e13a81994b0404d204060b0dfe522492f94a2985ee4c0a0368165eaa4f7a0c100430f1a0c3d6830f4a0c1d08306430f1a0ccf404a2513081018ec77b948b282609ba0074d15c423861878c4c023061e31f08881470ccf4070138f2fa80caca4a8848a94c6e1608d3a856664200000000173150030381c10890563b138100455ee0114000e87b062784619876996840c42ca10000000000000000020480001204d12fc02005d16c3637c76612a0a1a378d06a21508442d8e0df2f6e4451e8d5ebaccce51e88e5f935f5f7338410c53d25b6be25159a4008ffaae35234a0e4e104fa0299e7562709237964fe8122f64b25833a95ac14608556748dea54bff9d8711f42be781b2ae321d10ea06190d9e8ef68c26a732cb88b2a0cd7de61404f37787814832a2663f0214da984fcd0c2278169e40f8e7d8c751c4d22663a2288d36b8536d7765036077562b24a690a07c3f8db1b59aed4d734dd1d42cf68be24280f2ae7d6ca431400b897e7a87766a89b74501711fa22bf954b84908b249323e0642e02013e5afd6fc2fefa674525bae0dd22ebac19414021039b22e71aae8f6b0c525a9ac7640ccda80bb70f9dc7127e8e7bcede439e4b104471ff9713549514fa88480249acd1843152182e4c5d3e269c1b38c372e5f5a4701dd38df03bf87c88ad88d1635262f93b71284ab96612ac76f30c4c9bc54bb072095fa1182c2670f2cfe7742209dac0505ee843b46f87df87e4db67874fe5336107cb76cd538d254c2269b935d8d131fbd6fccadf3eccefe23afafb8708b4bea4c972002351005684cd03c65d9e44b83e9ea8f660d2df7a491bd280314680adb646b87095039cc2e1d44885eb6176062fedd289e819eb176b2c223ca13818dbcb622435e2486b49d0cb2c5dfc3cb612997384b84abd278b842daf074c0f2999def05c8e2b5d251906c05f145b0fcbbdca08d129e4cfccce35d7c0d0c1d34e5b943d307d7861df5a6db1f197fdf5508ad0dd5c5e05f642bbc595d0769a63901b22eccb9e98b8f843fac4d960c5131462f394e2aefc45cc1cb0c2bfd63091af4353f380cfd2ff970575610bb327bf85a130e8792608341562ad85a4b7012b43bc7a693b1114cc4dd67941f8840c8685da5108707a0d761585aa39123c8e60e9d5bacf8d9fbc8f6defd23ff046e45cd87a07ad843c7749143a0818de38ae694dc3d1b3d02d01af8ab85b8604db4427da76fee8d693ff7f0b462bd943b717e3f8606285f2194325474adc7f9567ba3c5815439cd3ab79061e2a6a0ba692059c6627d82886bbca3ad2662151d336633d642a2b1beefc9c7ac2e4b4461890c0f9cbcebf4a67fa67117f43e9278f9303317a59bb7b2716edc0d036935857fd2d76d280713d9999a068adfc801111eb138e19da7d4a9dab6e3fe1c0b9b8d0735085f3a61b5d791045ca770d76903f3012163df4efa0d3661b524bfd274c7d6600ce0a22f31195bb28c59cc5742def6f5b4a137ae9c4adbc4b5dac7ded8ac8f2d6b217dedc9b490a9e666d8f8fc76e5121b09b6d347b001f2672f51ec34e888194cd4181ed328ffbb893232c3adf943a7a14b6324c729f44804b0f101454b0eba4ccc32c7034ef110bdd6c8e5799b0da8c1e6669c7f42a89221e1e19faf4cfea3091c08a65b28970e4aa1fb8f54a5a0e91ba364a347d966ba31728d32793de8cd355928f050846d79b27097ca93c60c1d25b6515f5d18746f8bff29de3b8356786225aded44d3b3ee0b01b6f6cbcb5d1dbbe0edd2be0da7c0b26e76fd580cf5c387e861455e2ecb9d9ade778fa05a07c1c35c0d48a017b4ba4637c6f0c727ee1b3d6651a3a46f3b86dc4cdf97ff400f8a6b1a092f33e17c6ad036da6758bbbb9950e3c176b8dd2dcc835549c8cd48dd39cbee3203e2740a75e35376d426c46a644f2867443b0bc70e3e7ac175dc85132d7119b0fb4f2f7b842269b055e8469f0a866959b9a1f873dbb6ffcf4086a1b11d6f8bbc5f848bbec75060c917cf826e7aa42e212c2756c58c9b0c4f6f90be946492d30cdbe77fe675746c353169835e37894f6c769b91278529e81338090792e2b9977719f0ce4e4f04ac802c29b74148fb10b82f859b6b725af48aeba4b6f2768e52061412c1b71af4c2c446bc22747fca79892a4234d29e8b6d61c1b6d36cfb89715f1f077352fe64913acc6f797d4e6b1379fa3ca7881afee73f58352322c2e23558be9d1f057239d13ff94fd8fe7fe784089a9b2ef27ec51eade4bfb7041c95f04f4986ceccd95568d0b45acc252b64de558fafbcd01fdef248ccddd21e5821741e907a1569866f8d66330cdc1fe857f56415113d1330cebe763bc7da014bbe79e38ac5d611cb374fd874d40ace7bd57d4656606a6f9f7cfa138002d1bc4c8afaefa5d98a0e01eb3937ceeddd6f595d6f57879270a722a7488f123388f90ba12e4263f67142c6aada9204d98dc5e750c8c768833e058f5de15ccf353ecc05e1360e59eb48240c8e2197e3d0a95750a8248579c9a63e8c93da8c758e146ea96830862f42c795580c8d62e22e146d5d949382d58fe930382030b1fe110f93ea0e88ccfc6b765830862e3d2daa153205f33f933b67264d3746ac45d0faab26919b1c0f3560d566494faa9ec52170545381ab17956b9857d2eedcc9f0f431401503cbfb9111b15e4fdf5ce545a97699330bf0c2784355ba5fb02008f4ae46152caa26a3a02421f6c8c6a18603dd0e67d753d06504e24e034eac2c089229026e3d2b93ad489702b39b920c53b005433a69145b665c5121762db0224e163d27b002853d8ba971910f154544b8c6d5289df3c0ebb5c26a1238cd7c47e5210a6072f68d240b24be5d777138f8608dc53c3e42a311e83a34bf159a87ff81611f5acaa9653f6aac9433a9ce5f850dcd6d3a6adff11db2eeb0aba528b5947d473d21c99592ed1c7ec69396eb4f86a421546791f5bc2100c2dc31610dadbcfe1d48c49c1e6c15216324029439330416c98cfed009cf0aad11966582f107e2e88854bed8bca66527fc49fd50c55d41852487713f0d32f4cf644d57080d5f2b02185a62d37aabd8411a9898ed1c9e4eab4d2314bf54401476ca9794f0af81c80bb9706b5bd195e542f051312d4121060c6b88c318d0dc1fc4241baa8d2ee4f73819c20a9fb130f424c73ea9b59d3b25b9be46edec5b979e067e4f2678a37ef9ad30ecd30f66005786351ffdc2b0d55035a11684bf49edfc1181e7028b9960b1a2c5983315b612feae20f26a2ce83ec4a53d36e3a8434082ea4c02dc8ba8094facc3a2ff7a25a50063b7967bf5e807a2a953cbb2cd18452fe1702992ce94f97e66712022afcd9e82c803ec964999f18e5fef35ca7eca4299b6e701a1739c4a58142b29086566d160cee756f90e78e13657075b5672151fb8a551de969b23bde1588e672075ec7568aafccf27b0dffe6a9f3a70cf8fe224db6e1168fceb4731a370e1e9024ef753a30bf82c31220473ad163f21d7e0199c235e535120105063d01b6690913b882865d01c1a1419412088728cbfe3637ef80ca5ab0a774a07c98b87c00d4a247d6b20f01690d87845f88bd667ec6b15c2790a98b46932ec9c3f32b4061ca89080862e53c392092b811006fa249bd7535049b1123c9b48699635e793330bd59b6416f1621dd1268455f17803f97aa674eabf79f805b9201c574178f5bc94a3e5d9fe31a2271f125a1236cc542c5e0348a5a077ca3fb178c946e36782a816d8b1b77886f9d921225ccdac7497d8e2fcdada5ffc584f51ed5c1993b9d991b2d2ca8809e740dff7984afb2bc2c398b581d54496e43c5de5c13cee458c73500342dd4dd2b9a8f4f12683185d4da2420f35c71ea10e713984df7e9299d2ac551a9f19bb2eda51fd89f26f553954580f32f245b4653b605f58cf1b5b5641c906f8aae0df1bcf016ac91bdcdbdc65db84513f7ff226678fdd6cf63ecc3322d0d14fe254ffb6db18ca35caa7844d09347d79292731a11c93fcff781b05e3abec1752766e2dc9cc984e80547cc91ab75ef257ecd65ef09f63cf917500d865119f7c42ac0cb0fe498e2339c6550cf1c5770adf9cc4fe86f1ec9c84635422b662f268d4c5c2f209a7a3bfc89de4b08c192ea1e82b437263fab9e63de65bbd3e320a9a729ddde326b62bc0775227c0598435a054f7313136ffa18db1e0f35254519fe38c75a8d1e9aa85c837bc2d24dfbd7ec57afe48cf2c49c021d8331bde9463618180290645b18d2d132a24278f6cee66199c7ba51fa401e7a7af23003ab401609d3c99c1ad32f03e58c3fce10e7444272611de84c4a53c67524039c6dcb0795201ad06012138e620288abadd94a01b3260b7fffc48de8c6c6a1712e90cc0598e37593c698243c69209a1f6457dbf537d6bc4b56bb2d9a48ee7ca4fd4e71b1934906d7ace2e17c3d3c87c1182c5d66bedeb9157301837fb80bc71aab330c679b59f26332449412852095c7e8cb763031e55c8ee933a12c7bf1126435d7f8e32dc2e4124339c448c0c1b9acea23efde249cee31a81ad74ffbd8ea806d7013e224c49d89384605e187418cb5e038f3950d50eb0732cc302dd50e6082313f4b32033eef55d45f96b1abf877a41f0ac76e2c34204b609681dd3b9fb1022a57291fe7d15fe3893f40a83828161709430a3b2e9d01caf09caabc9d1b640681a3ef169ec90ee50a39e5719c15e596259fcf58d49ae73725ae20a787eb9d0b6042d88cd5b094a8e94385faf7382534c1fcbc72d974b8b55679ac9f56b4803542636fd77ee2a99f6aae4ff081f478470afb881297b3277d7c7fabeaf10ddf421e0c224083051be059ebdaa6c96f846af2a14d7f0d6ea8dc44c01c75cb9bb3072868ccb2fa3f46fca58b97229881fcc24c3e3577e4ab1d7cbd38d50fb229c7c05964f98b0f4eb7d6dd1a9ab61f2ad11f67e303ae1dc0f4a993b48ec4290f41a0bc933e3c8be916b48f067474c6685dfd7410cb3101f1608c84b359b9f87f7a8362d6ccb01bdc1fff13562ddec687b69c58fdb0c02fae384acca62d1ebdedddbe519fb534cb1ed4220f7049535510ad6bd2b297877494170aa08bf31ecfa1512cac532a359d0ef3e8ab0e44f5061a370cb0fc172ffd0bd2c29626924fd748c7f752663b501038856003ba9176e58524a0492204b20d1b6c21f8647178ef76530a8266903e5de864382b90dc28150506bd460d65a39a7b7c3bb0554001c6f3f085d1a2d96cb6201f050dfa416cdb7c09114ebcad98579d11906bd203638bf4955d698df0a8e90dc342ffbb568598bd01901a768c0213197cc9e74c032e152dc2ec683304c1e1010037da329db00f0815eac5432aef7c2496a9d729dcdda68fb6b064dee28cdd2062e9980e08788fd85328a6ec2a8eac55b7c31837688240ae46835ac89de8560e127174f83ef66ad68a94eae115bcf8f13ce77a1856d2f917ff91311e28add017ded65da8bff9a5ac7099ebb35ae699f7f836f4b7b9ac25fab28990982c7efc0076e417930dc1e02e7f428f49bf46cbd419fabaf5b6bc08de0776d18b0a61976f9e53072691b4b328a4053dc07b7227ad131aa707748357fd984175ae07939b698d1b1efc3921a477485726490f331ce34f863a4bd7d8d46444850f7f2625070d22fb449d3428fd94fbaaae7e0424d8265242359eef02e2a980ed587c196548439a7efac8e6bf53c426074fd6953edee146b151e389e40ec4a6b777205c90dc60c94567dfd89aeff7aa0d38d7c332b877c74054624515c5eb1265a7a64d3eee3cfbdb4867ef7ad471a8a8203e5168afca9d8304cc5dbbc8cff8485d65f6c6f412c9b11d412fdf96ff0869654170e9d6236fb0a4c5021098950f54cd41fcdbcad8857485e3df3a29dc89b86a5a0e1b1723e4bc9cee38771f18a54905bdd09877b82610a00f8f488100cf051a9dd878708caa7c8b742d038205ec0e3c60878769e263a2577603c5217d50c5194868d7f7295e0cf7be0be3f9f87140c401f259b88872c06c1cf56c5766e72691b87a52bb2724ad86989a536438924c2b1f2259611a850c508d7511e329870962927d106663e2c330d97b15d7b76495cc41d88e0b844fcd89b1aa25ac96f161975c4ece0c60df31067f6a13afe4dea1f645369e74c80ea889be705eb21e459e56b134950010d2f3e9155c6183d48b41b862f9ba4fee9ec104dca06049018c4dc3bb14436527316f57bcf4e57010abfc7cf292cf109aaa91407192fda7d00342dcfd5e0d9655a8727a677bb2efa29b6e008a4f84f34fbf7e994bda3cc426d7c8150f892292712168295ae1f9cd1a888437d6c68b6b032a0b470ac8e3d36b7facf5303e732916b257e7d8cd19c6b3385e3a028d16b51e574f1128740bee7fc2fd97da480b229dc2a440235dde8e2fc9717f05afa0331ec17f75ee58b6ffb13feebfdd1c143adf727a6adbee825525a9473e83db7223bbc3d53d304d153c24b499ca6c9c8accf5a7d64cff88a3023292186fdf566a35064ab2a23615735d3c5cb12afb27ccf1c94642a99f567ae585fc23363c89d39cdc0198b070d8768eda9cc5c54facc8db4d705c616c578b8b744b151280a73da03ba87f2b90e3170eb750e7effe2a16dafe7ee49c8ab6c82beb5029056bcb2932701017985d6da89a327ba3da4e025b36bc0342e0784037d09a14c5dddcb4b5a72edd80ed12b08d46581b7973f9a957f20eeeabdb3358f48ca4b8e550a9a5b67ffe589086e067346cdf293e5a52873d1675f9a128bfcc0291f6ac5f36664b2a614519f54dc2a4ceca49148b25098d2b0445887cc56e7c8d59a3e9b0a0ef12e75933da91f5f9405ffef194beb36da99d74ae1c0373b52513e2f491ac774adda04a046dbce9b7f252c5f8007c3cb866bbb697858578103f85aad80114d954f52c2a59d80e14d28d513167c9a1c152f0efd47c0491a2fe5b241564a3808a35cdf1881818274d57f888c827ba33126345545579d2d8b52e8361ce31ff2e0ab14de62a8e5408b7e425b7a110134a03ec430f7043a2fb4e4f21b54ee88cb42f83db3bb1b76a44f1fb2171735e289fa10a83621ace58270ae9dbd829c727d84cd9456593cd0b57f4efc4fe1facd5a2fb4c44a8a20f589423911b98481a7c00dbcc0d332e40833f0b44a39f00cd1fdb45ecb69af9f639b001eb604b4385363063d962207e0e1b78b708cf3db2866377861bd213847d1a74c4ff444181be1cf92576640f83b3efed034c3a8b11329e3e834b50aa54e249507c17a00c0ea3b5c6365fb2da8664a9720128d5e3d264ed025a0a44750e18f6d41a7286aca1d6863423b774b9c164b66bb87ecdf7ef6a5a898dccd5c336930baa9226e3676dff048994622397144bc1bf56a77dd2e3acaf073e53ea597e3a6da80f025da30176689e738b585375af88d7c365a39ce0b3f024f8be34f908c53dab9629fc481a95ab65c449d4a261cc2a7e522b73a8275ce1a329dcc048edd9a73b978d8b8e88ee87c2a1333558d8b300dac991fd1c81cfcc791b5bca8275d7acfb8284f24c2372e86c3f28a79df18843c629c5f25bf88996bd0983e774cd2e46e410a76776da65ec7d1fde09190255a5e28ad5fde42bf2cee1d64e336cf69884606232c79dcf0e27c82a3871eb8ece4f153b23e18a4638a78b508e037e70a76ad34285cd82951986f19cfaac017ee01ddde57db849170590a3d5c0319daedbd69fed752d31379d56749ba93f38673dd1c38946149397111190624f5aaf84139b7468b7e43f42cb26b3d71f7891dd0d130b6d757b51de1139f056e4f9d7a03bbfc4a641aa5e79863a1e4622169d3df261b57b2eb38e6f14b79fb0174af909af0174751e43d87178b1e91dbc7e0ee3832da012aae4edcdf5386916810e5ca61f8bfb7b5c971f29f4f0dfd33ceb9982243ae09042df99631fe5e6a8981c62fae7d4658fe6b93502606ed5a7459bc3b31a104e9ca180e7a20cdfd35d79db93e8edbe72560d965b01f8ba15996925073947cd5e2fcdc69acc6356775a135addaa19407f73c2cd5be317fdd424e860137e2187d6180500540c295d7c8b60924e3cf36bde9ad25c06fc35cc298d324bc40f879e2318bc3c19ee67bfd67b3e0bb71ef723718a4e39c321f4ad187b4ec4ed57096ccfef1d1035c42a3768eca37dc3c9c46c119bf584727720196a2e4d445b0a3c50d634aecf1a28c200e0e75a6f453db23b50ebc0147c1171cea873685e0e254884165f8a88b2d0a538d6ae97dd1be83cb4baec23dd7028e620634a7c7b22d9dbd6c8f1efed69447a174fc72153e6a7d4245816ca5a376cf16dc7fcbc839c1996877211237c01c4bd7b422ba721b34f3d4d7ce6ca33f599fdf04cdd8e41a8eba60388771dbb5f053e21a1f08620f796b39f51683916b61d15604791c2387ec9ab99d87383e64877b4abec6e8b789c4a9189980cf6a1846c11cf07de0db879ed1fae5ef19a096e8956fc831bcf333880c7f63405e4957879bdd4deaf72be5d8f052f697b9a82425deba0c6068dd3cadc293cbf2e36be4da881ae6ff073d7075ecd6ff283a16123b32532807fd8d195f71bd453b5f1d76add111ab7fded08c7f9054795f5645eae96a158c8c5566316ab19095aa179691b530a3a36a0adcef314c4c3ed6199305318a7aeb83744bc10bd52cc8473a4201bb7c002e9d1db6546d8103942364cdd5aae4b457d8c60ef0212d3e6c62f11b86c9508e3964bf40aa80aecfe69366ba13fb88b582245a4e6019bbcc0738072af66c91129b44fe7e48fc9052bd93cd52da4bc7a3e40feddd9e0f1ee7db6cf0767f33e3bdb4cf39c7b8fdffefadf3573d074d265bc3a434c4a65e2f021f063694eca30e86b08b499f7af4e7070f0997451c86f726aac141df5924bfa0cc61276ad7a30f7d6f9c66637f6b479c1aab39510629117af406b576070f3e25e9c79f68787579cfef22b5b8e4978adc931e29da6abf434643545f5d908eee638965dae23bd4dfdc35f4d37655bf60c349d33a44d82dd738249e1496c537355cf0f6e4c815a93e07c2f3c51b16bc39174190bfbe09d274804b6c20f3f61a3f946d16452468f020805cfd22c8068beed7624fbd729e69b43b909b7d4250aa7a55d4f7b02e02313416ed59404fba1bbaea81bee512b864655f82228f2e247e3b986a038e36c4a8882d9a8a4987cbd565403b117cb8a198b32fba486a61a2764a9a77547b6d80ed8c47c61b65786086324d5a4189fb5c276c377f7771b8a9a3c736eef07b1af70b8b44092f85fa11a3a385d987ddae01edcc23c53efb001c84503ee5228b44dd8c5529e17ad4ac668a1e0e9440e7f3d34b3051778cb0d97746260ab6e2a35f7cd29b3a56712d992760a7b2c1add9a1b028c3f2077431d08ee695271317a36f498666e15c9c2b641b265606db013e8d09178d221272e8d4ee462e7bb15cd3260d5a91bcc55e478ec8077dea97eac2fdafc6fbfa8cdbd0ed50e306d96b0dd46eb3cde39be5f9c96ea8d22266237a7e7ee3a9ce66b26844861361558c132955142859b1c7f4ed0c0768b9f0f1fbd77a70ff80b975eeed109a9876a8c4064740b3f6eee306e1ca4f2394de346fa8440d15f32ac2310df1325305724af0924b029d896d2c7063cc71ce95333f7fa6415e9326552c5d6f19f9163e9a05b6583ad808cb70ed45df65f6600bbf3ea2edcbdf41775e9699be2a192226b0488536dde28e331ae343ecc3671c99b7b11e7c1c256d3e94a349088a1b257926ec229444c099084cd6ca33d26082a947cc264a32b3e06f88d2a2fa96a493dbb41c0e44fb7cef3408fa295180f797e2a46f04cf365280b21dd4978321a5de75224930e66e82508a7f79ffb1b79d51406e9082ec0ae2ea659ff2373548f532875212e0ab65524c1a804c2e5735aac4defa1e67560214774a999e7d4c7d64d3a39dd8c3d397d43bbfc0d748680961aefec18b9e49dd38abd52110e20f4500625224ce538fb8da3f8c7dd97a85e24c383517a06b975e78c0a62fe8610862e2dfd092f49f189322c9928a081d643f08a07c7dfb71bf2aa09df871bf91f2ff4a63483a43b0afdfcbc44442f8a3d2d8ed37ce1060fea21372fbced3cb47828658ad58040e15d76d062d8d6daf3a309d363cd717998a1fcbff3b9a79d9ba0c6f0d1aa99525fddf98c834dafe5b0431378517126daaed94878d13f304420adb9978dc5f199c8ca70b70718e2283762e2af7011685f98f3dc04113658dd1682988a2854f58bc7e5054e0cf1e64a5dbf90270aa4c04d9c195361f559a8ce01d55ad4d8427e159e3e6545c04356eb69049afb2e0e6d54c2925c292f5583c486612a5c4fdf30182832f2cf214a7e1c90ed58487ee572571bcb0a022a4daaa7f4b9436fcbe3cee48ad555971fe97941b007293bbe7b8c4f5c886d535cbe10a48d777087c603c419c241a0c3431883c7f210051177c1445c2ab74bb456543ccb8d206b1510aa4906a3373f1698e0166dcf1d9a9fdbc80c02bc13825e81b6e5f1a7939218f248387c8274e49e51237258426240354fae753695a7d5e4f36f73ea8f6c10b79c32594b928a83f064371a748832113df26c55eeaad55e66f0c38f9f8e07d941ce0ff7b362950bf0d264806b31a780d5703d7c7ea9e5405f6cddd84233e413a2486f3888424bf26ba0c6efec575b35a13f1f04b41224e9acb823037b213b99e5e07ff81ef8e3637fe65340fa9b4d94466d29b48e672f3cade71383f1715afb70f9c248fcbf087f3f1a7a249839600ff9973fa3e7b1e1e073f9f64cdc7de510f09bd0a198fc294df2b0943009f3ca153060882be8b996809dc8224b2660eccb57bfbc3900efd1e879309afe8bb4804a406686b316191341e0374e3cbbeef540ada9564334bd0c26d348dc4dc313102674070f29b1ab6f81adec54d8cbb491db6e27f9dcd6b6c0e10bd498bfcab4cda839be327fd71343034d723264a646951df764d382ecbb6526f3cf3f710836da31ddbf245ce27ff16997d6b417530738133f724e7116728e481cd58bb8a9556c69a28b420daaef98050b4d372e3b4df8680c1622806b79ba85f1ce483bac6da5539eb46f3d38b641de713a90cc96dd2d2378e9898b7dbd586c88c0ea84fd9b7892521e7460a3e5fb29dcb4333beb7fb0cd9269254959be50b59a821ef1d73af501213997ee424cc25cc222f436aed58ad54d290fd15d27361e4f50c659c1438a33165c0d67c842e5d7a87fb577943de990ddc1b94670a1a65ed0de314fbfb79e3f3c9d3fae95731f439005deeb4a8d2711b81b8816511473312a0ff53c2dc77fcad49bd3318df6693c4332c7cafc4c9c5f8bb27f713ebe9e551269e7a99f1aefae9d38ddfab7f226b1c70df4bd89bfc098979bf04b18f3d5a2fb5acb05b9ff96127bd3bf252f0ec2c467125535359e92974294d09b5663a5fb03f4b260037a6913d1ed838b644bde163af68ad7875b894f384b9d8e79f94f19b70d79f6c815ef3fc1a5a95b3dff1a5e08e435394dce0d576a28ae48bafb43bdc674128896486713ff2a5660035e5b90a974b55c8fec8ecc9aae65c30f1927625032f03d24b704594a750c99b95b9f742c33a722a933b24126dadc9e341ee599ca79190ec68e45b2ab2d6e5299687cc33001c1f5002f2a3ecb3d6f82e74e22148d57cfd090a1a983045a57eff63a2c24df641b8a067710947e5dc1550bf8048d8cb5c42cb9201b5fcab543d6c99961e9f4d28180383f59711d2903e0b95748fc74be4a0b21779fdaff600d5da6dd058ef82608a6e846016ca0bf26feb8976bad24457c49d9f892d04fa9998d5ec8fafd6336d6e90ef38a814e20c7b3467ba2e6de4b2092b9d39a398229c2b3d6442bbb53593ee52740e619a09facf3e9966a296b0ed15310176294f2fcff7c7626197c9f94adc24337e131c5b340536486670d8976471aeb69d5e14cde114702a391ebe2c980b5ee942e1a18b86dafab1ec40634871856031d9d0b4682b63553e7b25ebf4bb937a63a39de9ea7b9be16018d69f72e34912e2cf3dd4cac3532a3ec8685e4f38fb94840e4e752be97651bd99b13d230c60e1f3599c74934d453bf7ccd815aebf0848d6ab1ad13bc25ae9b564fbdda7fb428fa8a985b8cdad68281abc9f5b7f0d843c889ed8ef5120b9602f4a88105a1f7b9c9ca8aeaac6f1891baee49c4811ce37595deb1bdf8c12c759906927c73ccecd5ca600702341973c7dad2456f0c76105c9b15065c84503eff4232091dc17d1c69d798e76814f6c4cda420438189c106ded97d6df4940a8d1dddf5ce5374f3a2eb6cf560d6274b290edcd3d881ac91f50871ae3099ab6ffa6d7871b8913f0634f5d2f59056557262be9af3b8e63ab473a9e21deeabbcb91d5302998593e164b9855fa9d35881813ff4b1449b41ed06e25af153d08e2d536c41477beafc0b3c6e90f0773d230b22976f2b56ffd42dea234be5e691ef8acec620a5cf4d19dd1f51a652f51eff2a2332541df57fb5bcba4174b64eedda1b132ba208e198d3135ef53ba6a1edf7056f958f8c4248354a2ab18b0dc2ec1893943998232e7631586d59eeea1682420ad285f1568c9001da69f71df538e220c120d5ab9fd95fafb9515030d92eb70e22044ff20d13fb50111343c992fc3bb510394b7ae612474742374dabfd94509c7ae2c9238b09e55cb1e7301e5450057b226c642b8c0c48def2384e1dc7ba0cf945684d7c7a4c07da2b032ec2cb71a2f47f214e618b27353378974ddb3dfe941fe051bb4bd0fd9e5acf83841544ad69b2af89c486ab0068f327a84097a833a895631a38d4cd8fcb85be95ead5989d7ac531402167598c8ff18a8d3a005b183bb973f944d84d33201d2baf7350e58d523065c2136be6cc476c0c88e30835eebd51cfbc2bf460129ebab340793e4790902ac116e7c38c4910577cb788c5ddc4e112375ebb802146807f944d9bfe231bb6a355873e2526ddf181b10bceb80381889e1739e3e664889ad3a13c88e5422c063e3b9c4ea34471ed135c4557fc799195383fdc84e25aea9594a7b101b1af0675fd72df76ea9997c99077374bd85f5d76f94fd1b0636ab6aaa1b0a4122bf89f8d980b33e1a378f49260f22093970140c0fc2a042612d832465dfcfd797c6f58919d8b1e2ae33ba452e7fd15c11ee658bad5ec560ae9ccc1f76020db59795b1fe21845ec8a86552b402f74e332c875661b6975ead38f7f3b5397f12206813402172d4a47b0ee93273f328be880e8986e95ffc59c5bbd274eef35c938fbaa61cf5e4aec659283019711efb5e11563f11c223333ab8ea779ed5dfce247270399299c3951cf5dd4f15361df013ffe3b7388b88ab504535bad1bd9edccab05a5797889c94d1b2b7fea619d04347290c60ec0f0c2de5fac32544eac8d81a4356cb8c3bbee09ecdf63ef5287fda36c34d53c952c82996b5a42cc897e36fac5bd9165e353a1b45316e9379c607f141e42b56a860247412ce83fa0c0b91de4cccf13a621b1516ac4827d10b3224d65f288c13d2b36cec75d2375e22970c7c084199059dcbd8741293cd61457b7b7ffdfd49359e9dd0a506444da0a66e77778f4f0a469f68d7b626fa1d3845d5ccfabaed26875b1b5cfdf90fad0669b49288f39d1babd440edfa5c2a8a55612c4a90b8d8170aa3d9407b153bbe178903a4f97c0ec8a3a15afb06fa8e701e9e5697ad6860b5f92a4578355b33f3b788e08f68db388b143afcb2593f4e3fe0ee2928e7e375402236017ed64dd63927e53543cb053f7e61c2025f4c23249cdb7fd83b5e01081382c78ec1a514aa4ea8943280db4c94f55bf1205d1aa35c78d39bd6c217bc018aa8d90b1a88ca083c7c9bd420f62fa692c7ce5af13552131101144735c609e18e8405ccc51c8bfff5ad75c176842a744573545169b247378e0c2a46e5969993b55ef2b3f486909f0a0f94e0d100995a9f2525d709b8c5053cb945f1a155263eb861c4bea776044ecd71adf01517465d31e4a49fe6ebdc62de8ee241efc3aa4d981706f21f700dbf912318d07dc0b9451ce85f846e00694ac5813290b181c7146987a6e4da56654ddf898f02f91cf4005a965343f0077fb07558be4db5a40a779bbc00852fce88d91bf42d33b303395f4c3c3537cbf7bcea8a62c5e9ecd4d69d8b29514c55992b001cbd0a5dc6d54569b5ccb3db65c8c9e555120eeb8475d320141998db3a5ef1b4a4209a7bd38176880fa8eac6fed1db3724084b74196d47efccb530e53d08c4dd089455eea45fe141ff3d561f17f8da0ea9ee6c0910aea4d41b85beb42ee845562adf0451c73e4ebebd61f0e468a02e7b07609e71488d6b7f6eeffd831cd9b09bdbe5c5af0f1a012c33cefb4a3c05e63316a579eaad39b7af3f28188a1d80029f3a70881345907c5862e6d6a0c50692c9fa61dcd74619e3e5ac94e2a4fc575ec5ad06a85b169ddc7a7537dfbe7a9e7e02732a576d9871634d03ef60cbdb61eb498a27446d1ac6008d8b5bf008efa3a4fc9a3bba7565310edc79652736b14af7e7ab17dc012d3a2fb910fd8d3d4d1c92995ef49de9f5d97c511ab18cbe8efa35afc8a22c1ebc5f963b832535e26847a74ba5e63b72db9708f98c099b45357f40a2501c63bd855180481826d2138e0512847a439ce803ccb0b0d38f40ecbba227f0fbf3ecbf942701607c2cd02d24f9e3e9fb2056d1ac669c84239bd1db4655403597a0e80f322427ae08bae9c12fe193d2fc6099a4913b0a8d584bfd52f5102ad4d608c83bae44d23a3aa3a8eb2839d1540bc29defdc75eab683ac15d5de23b91797df344a59ec3c79821101cb04f7a6f7349d4b698fac3a9ae3cc45cf91fd40717363f1d79e2f7d37074ab2e9385d018e6cd7d4f3389319431d28a9ccb7637f51243e96d0d32da7689c80c01799c565e9875eb465c91ab63fbd0681fe4d5b84d62f9d6922d205ba92ab9973c11d530c17fb5ebba7be77b66d857cac55f5c4fe9b2ffe553651ce76c828845de812325993273bcb604f14ff8e6f8be976c75a0ced747f4f29dbd825c4e0a061cf13fcade5962003694f2de42b2f9f9120759dd13daadcc5775d94de05843bc02b793fb753254f98023f72a9e402897f632b88a9e084803aaa202d44bca73536d9a0082dab8940ff5a10053894072eb444ddaf894ce614b2393e76f61225869c0a951a96ba1a2de403bde8c4524e939b2d6f8ad8ce889e7cef5856c1158a72135fd5af5bfed47792f943a0a13b94b286441bb40b9c60ae52415927845fdb0650aa208a0396da4a5d37683a961bf95e17a47cc7a55dd6177a910c321bdf542566101b896beb8f9872efff8dda8e6d589a0192b4906f996631d166c2313f833b7873cefc83e20258134419842159d77fde95ce5d0e35ce97c1f16f2801287c502676b1813cac23b460c0ea91dc3f799b58439740a68c0c476a3ac08a289e789919386e890499fa7f07fcaa04b20ca8b36162a1b59f7583298d65e892005d257c9cff59a5efe528679c9d51e54bbf7da46a94cefb4b52e1679ecd62ce7fb69f1349f0cdd6b7774f55fe4dcffe1f7062b8c0f80a163451c065c1e40fd66fffa276546da88edc37491d25837b3020b0fd0fdf06e2bf21cf87694287ea9ce0dc421478ef1834972dd61d1f802568c7c62f4fcf5f7e91200815d476a764dde3d2a4e9f755f2b1ce7c1c21b8ed2add4c559f67db40dc7665506c42ba8ab9694916efcdb42e7e2a96877c472102517c12ba3432d9a9b7542e218dd7ad2ec66feaa675785597adc6d4bc2a7d9e47ec802d1573d0a3ef59446c35edf4190d9e47bb01beb2dc4dcdaadb48147d00487a1fb9a2a303218a4b047ae7ec55d5ad71709d0aa0e6be44808a9f36d54203371a40d5e87205794d150fab09ba85ab51917a42c0e13459cabd85034bc37da80c3bc88f5271e91b269cc3124ba0349628dabcfbb044bb25428e97fde53942605bb9e00801be29bd2bd60c4e240abf0d07e338ba8c644cc72f9702e816a0e7f235b765e3af27552182b0f325a799863961d9c40fa39e08a052208ecae6038ba9433e0af8f7665621256a44677f60a97130d0034d398f0d769938c207bce05a45512f1531afd9ae8749bc9ca42b3db9a5857187ee751361aa5401ecb848eedfa159007344321e552b739d720f522b3ef356086321c5cd91bd3ebcc4827d91813d1adc64b5044ad388cc60569d1f08e919a140590934cd271c3b730de5fc459f4ed160d8800e0d2c59cf6f4792a1beb531745c15ccb2abded53948e13a268eec784d841ff6ad3e4178a64a7ad5debe5c4238bd9dc1076379993eb21f3f4a1576a2614937a2ab5dd92475191d9488ae30acba2cf2faeaf94a84c79b88238627dd200afe6d2e957aadc3a9ab675449f6be81067db2660b23bdefe9b05cbc7582308d47f3fcffc3f12905d8fe03d087700f9889e3657f9965128f5e2d0e6cd84b7fb6dc2493db691673ce6120977c10056466877410edf858ad75362cbb4a8f425bd3671ad7648d557a73279f597beaad684e5899b0773f80fbb3d035f2057a271da2294f8d19395091b67b12a8d00b416ef54107277c8e7c02f539009f522a4c143f893254c8dada58d80ee2416b21ab82ba3fa85aebbb6f476eae9d962e4163f279ddbb2074338d699c2d1f27226b0668e5da04d4b37425e92f1d754e1e3f5b21e7a33157cd1eed1dbc4a25b7b97df619e98feb1788869bc33038fd8597171dcde8915f058467456438184dbf78c66d4a9cbdb82a74b200a3e14cdf56c11cf3e1d42e7aaa18cb84b401065260d08830128983c6ac51dac6ed418cb7919d8622eaf31d34e3c29ef2274c084c26a71604b6b73a79ba1d5ee189e7e1563bf664e92f1b22fe987de0b5b5fdf01da9af1f41fd60d17fc3f9d82c2be5f37151177b74d3a9f9fc54939a891cb2d054d0baf664862e02125faddac6310ee97e061da468ad93267238fa1327e59404f37bda903c08353664741bd74c859996e01f62146d07111d7d4eb56fc4aaccc40ce481e10f4583a797eb5b1264f3fa446c91f672dc79ba085ce437fccf413bed4d43f369574ce9c2e7c3767e6470f1071c01c381e95455954d9e985b6cf006aeaa845d11db67d49f2da4028908b5950063140f28499086351bbf49bb7f20ec2b77cf6bfd241ba71f844dacf559cdd38cc2452d9974d0a991c070d7c4c75b562798fc741a2c82eac7f249dabcae1e500663eda271e47f102c5f98ab2bcda689456922cae6e94b85222a3115a57b6babfaece594d34d9243e658afd8a919eead895dcc42dc2a8f66176b4730b478684d6a243cf523ffe10fde129f69e663f8d59f49f2a92a7e0d8d1f2f79d0eb4eca9ab4a77eced2aa498be8ef2a59a5b4670fe7a058d457a63eee12ab493bf67691545d5a445f0ee92ba599fa782a35a2be3af77092505d9ad99f43c93ad22c7a7648950aa4c9198ab1948dfeaa04ce4ea36572d1426e006aa0253cbecd10b14ef9eee3be71133485ec098432ca0b06697537dad69d9fee44c6fd04adf96b2aa5f57ec4233dcd7b7a093115b0470d848cc13e3e040cbd4fd71c562e95e5ed8de1b4e0a40c5b64c4cd83a84d9fb9dab2058c2f48693795810c7308f5ad4ac80dcf47f97625e3ed79b26406c9168879c56389794bbd083f942b99757f9bf29719b2ea8c6a369b33d3866ceca9b1972c30980f00798b4618f54017718b5911a067f6fe84a6cf2dabfc15f1140d810ce8ed89016c2b61a2f3b71291460de45335fbf41467035107f0f3780e443f4a5a411b29008e8cdb926b231bb0103675f549bfd036f9851f8e446df472bf7dfb02fd43c08b477176e3e5158179ee308a1177625c9628dbfadf4c041c0ab1ed951a1b1adfb55367e8ac94e178876af32096c1d8837820d5ee04cfc7478b6e605d9d9ae174c1aae6c4ae128fc51f53d089265978fbd689fa22e2dd2d98f66cfffc8f91a433504d0ef40c37e84681361e9c3bd755daa7a10a1c03f5c3ad0850e23b7c512911e58460481f359971f094d8053d9315c4410c7121df3f44256dfedce507f3742981625e647a5d7838817a0c0917d681f1984e37aff8801f651658e82a964c4793667e3788ce738ed2a4366b31ab179ed0ecc634b9021abeb7639fd4710731620966430b2f1217bb6d1afb35954f80455365bb3a05aeb2641e72ed0a8465758881624c5dfbbfc83ec8fe774b26dd603b47e197c246084e04b8f201d36c5a223eaab163388cb12fde624d053f83a17b19f67cc8c57c1ecb527919815e269312402c9be62b2b12c78ca8c82eb9ef11d6045378af8a0bc5accc45c895d398dd06e7f412d7a613c526b3957df410c63e82a532b70ba54b0ce12c0fba03b62958cb23f83c19703553fe738092b09372a22c0249590e3e21bca61736f6aba2075b24282b042fd20ab84d4fdcc65dec64da0d93cac2cc4f26021dfa230cac0c0cc1991826d8a116ca8fb676b29df9a7fc81d06680bb3037af1c63ad617880d4f61f3daf05233f35fa9af43663290693b62ab73ffd9a9d33ce2e02c414332e9273257fe921c930eea56ed53f28ecd7cf66aa536feeb9bb10ca0fa00c50982330ef9233c167c3aff4c1c2d8923a0cbba5176952f71d2ea97c20eba52f99546226582bd743b4ca6cffd22e15a791705364328929c11bbeb1c8f14838e1030434a91fd78ef579fec559d1b5e2abfabdbed6b91cdeb0e14207e8e25e32fd3bc51a84a78b01e8115f3256c68b3ecf568dfe3a646fd446a8030336f22ad60bb7bff5cd5efef4df6a0d3755bdc4b082776ef09e76ea419a03f909707e3d3271654a7a93cf8c5cc8ba23227e71690fc9e6f45143a0c9b1b369390e1ffc88fc7bd794c967557419f5a3a31ee2e5e9c726ae5f13b384b7d23f2e905aeb24d96ae929e3ee167b6a95b425c005d31ccb5e9539caced9ba8cd1d36ccc3ce0547972193f26d22ac33858225b0912eb4800b868a28569e4fdafd20cbe4a753c58e1a597d2de0bdd261745721cd0cdd83b2d4b5099e22295612cf72335a8d1a6e0d8db123c925a355c88e77217a8bb1b8ead58e55f57f249c1f8a6868a88e2e936a6013525a85b3d1af90e30fd9fe7aa2a19b1500ee6bb54311ffabee16ca26ca4e8c7b1d938c589851104fb4ab90577489e323095bd033ae19c20263558a64c5a088a5d797df0012efc7d1afbce5ebe6f524948c9486ab90f464b4e7ad5e75581346015921a297cfff1743fbc488dd2d9240f319022a995b736aea740d3dd4715d7aaf4413967fae0582413559811b7f20223412c19bf56488a8b0b91794f340c0b9f4004e6c287928b92ca84a054f909ec5f9922cf838a8bb28f098a9b4d79161347235f1b03c60f3915007a0ce781de86c1c9e564e3315274e412f6c138acc0cc215d4b95242e73df4715ea52d9d59fbcff1b1a92faf5a5fd9c290f9734572d8af55de53ec85f8205d1296ac71660f068251c6fedfc6f2cbcb1a7df2ea34d868865310ea5b7e55f439176c9dd2c158f89f434062b680b4354f87295f004ff13d8abc129500a630d2a40c9c71b00001845ede1c8f3bfd138472d1820d898ef3d35787c2861e8199375fe8311cd66aed9c0348105c32c6e35678b82863310e22086ee59c4f76751d831873ce23a60fe254e5e6abee30ad2be1e0766260b2633c81e3219822734e9b55bcd035b4cee1d5355ec1c62112e4c28c15d0f85a1e201edec5fde446b6c654cc934db16a26786591d30ea6a63be284958c11ac0438f04359e95e8930e67760beed7c4946abaa813e2385476875a89887279cc88c067bad2cc6093f7fabf58ab53d62bb64e412d872b5e8eea02d846181e3765000347eea41c8154f11144575f15a2e71ffe077b956d78ee111c600510aa0de2f56cc2fafe3e9a2dfd376e3a5c60afa14481fe5dab676f01618f07a5e0ecfa2f4e4c81b5a11cb8e0691c2f8dc3db1b53880369bb1f92dabcbcf1e2d2489188a44f08c848683311f33e213fbc9327829b4e46b474a876059a3b3dbb977e8be577d8f18b54cc7e9386bc40533123ca567817bc44a86b81769c52b241c2dbac4b98da1281ad80681883bf50aac9966b89a099217ccb128c6cf6f33ae0ee00944344fae1824133c26dfca1e96b8a0de995cca763be6360f27b582ad2073cc306668e1459dc526a8826843ff82088afd983b973f342dbb60ffde32748c354e1addfd5bda72c0987fe8f649059f64d907e4b263e6de97730c355e9bda28804a516418092ebf600aa1d25d3aa02da1ff5c83ea53cf28010de5bbed7a48e2a66b56082cd7693c2576b435b5121082a4ae3fe30a6fcb08c2013fed0e14f45bcc479fb07bed19eeb8052d504e46641b31cd30acde85a59ec5ee21eed328f360aa5fa06ff64b58197f300cab61179aeb15130f67e21fd36495d02876a06f2418b82391b4ff7ce95bba47c20166222a91d9900fb410b280ef09e0f91092fe868d7289a3a20ece48b76eeaf44927845c6661bfad2127fbe37fafdbfa2ce5e6c3199a87a3dc2dbe041982e3e1d734adcaf56b21deb03a909c3afcf94d2b5d435a08e52172590d6b2c8b625bb67cb92f6f2fcc12d6b384f62079e9d3ab78cb48d65559bc47b6fcbb291f2b3980224e96919c0484b9c2641e8e879ec008f9222b1cce41d8ca0cdc33cb582858c655a1db59ac0f68c45fda33a34497c5636bb9acc90b5df62507c52656ef9adc0f5874d4e77caacc8cba833ca55edab41c42fe0984e78c1c5533efe34d5469a0cf456e4dcb60eae8d921b275225af914ad54510a90d59a3b3e479de6e2249b721761fb27458760e9d79ed43dee915380e7cf904326e41c10297d948723be6b58fdd696e0273bc533fe7540dcdf5aac6aaa2a641b64c763b373f2c159855fa314eb3f6a4eac0c528b5072fa8595fa06f2a5ec8604d487c83dcf41262db2672ad6880731b86a5b331fa93ec3b7c3b7c7675d62834df910b2f129c48d092676714151710378ce4c4b4760816883b147802f3afa4ace5871440e4b3ea1d29fa145141891cc311779f18a7443dd6718d4a8b70967162e6c35b99104035759b61f70a18eeffd8880beac5c7548668ae1cd96f351e7ccf3ec815471816a017570f7af313ae46811077285e74651452320f5d27f02c54e7ab3ee9b373b283700b9f77f22550fee0c7a72943f6c45b1266c82b4c5b71cc3fb1eb980039ef636376bbfd1c01f5b13f4a20c63854e5b4126d719a7d38c75dfc716aa6c7b5e1a6002364cfee9c56be68d6a4c07e6761ae5752e89f1f70ddb7d9f6726faf399c5405b3a496906e7e5631576ced2ed7e764a34f6848329b4039b7b0d3c72a7d0dae8ae56a183a6e2ddb33686399f726fa739fa5b9f55ecd40b199333a2ee9ab07153b0426e752dc7142ae0b869d463b93b6f2b5074c2472a22a4b5714340dc695b5feada43c8e3cdc10f6571a3118bc9f5aed49f164697f27e6d201d02ffdd6db400b48e293743b696c79dbfdb5d6ec162bbaedb3e396d37e58f91ebc9041ee4b23b197c9d07f8e2ed08367dc58d6bf1f10c2e310295265535e1917df984d927a5fb93a2f4e0abd5ffd7a45673f167a72e6f5e7b11a5facb10d8e84fa06b30a40894d2e3de7e18eac6b734cccb8c5ac262e1fa79e89f078a5737a9e62d5edfc40260e5dc4b8ef149ad250741798e13c9ae59643d977ffcb5a1e5b94ed076263b5181f164d38c361d69441414713f0b4ea6097a6ebc070c7e695b8aca743aba88c5fe30d3c699b2a5e38f6828df54508ee6fec55fe7478518f0f3d5d44a6b77785a7d97149819d8e8b7960b83b25108da3c3c6a2f3f2832998f61c6eaf3d04d135400accaabec8ca8cea72460795c6fee0d6733be4f252d45a165897810f8510d2e0d52ea64bb29ca845165625fbb968114a558777a4f9c8c58c4a0af76f94fd0a179326290b35f4588bdc6f3d66bdc5cc8d3231db9e62b92e2039afc5f42d259b69bfac1ba06a3dfce995570480f5b83c5359f5d9f9cb368654b8f6721a875daee3924928ae977cc6fd2c4fe49e6877b4498ecf3d92e9b91894e3057381c424de4a575acdeb2f60c22ce96ac886c338deed71f20d44618bf005836a6ae7975919098f8adf9daee168c5503f36d046fe9f2773a48d5d8b898aba6bd9ec061b4be4076a214e931e05471189bea02548b40083f6c932a30373d4480e2de8801845418043446c2baeb2f2ac459f15135c4f992cf7899ccc35d3eee8939c9ecb20db7135e476122da9c26996e1b8cde525737b70cb7b63897ba59556d91fb1ca764a410aea9705290518ccef7fc0da82de8702fb3d62a333c48d991839c2121664465b3b6aae967a6e3a5a97badfdd3b66f433ba468cf21cc61d57f27a18387ab232f447c01a81a83d474ecf11adc1b552a52ea9625ee77e45a589bf5c21175f6ab57316bb38575b6d9539f384761e245d37c4f835e35c7f4cb72a1213b3fa7ffac1471ffef42f4a8e343f5db089e7548e640dc66ca6b6f6126cf08e28828d6452cf8ea965606274dc716b8f79ab65b0355c5bbcab2af2e30fde5832e16aa673fc403a8c5e31e56f2b10e8eff0da9cc522f695ab5ae146745fa28a54cfef5b79bf42e0e9fdb3dd1f006bea0f2d77682e33674dae33303651a008bb2c40e623476e8d191e666e652badbcea56d6b4f8815723efd9775f5f415f8cfb7cc7c5150f2311ffb35bfce1a79f7fea57a577e283095e7d16d22fa94c727775f283765a4e698345e5259b6efd0ab798bc7aeb37d4f9146580f16af34f49e33f76183d269812ffa99527f88ac4d1e320a7cf3c4d0a6523f9865235000fed4f967d389732693d57b2c892b2049116a9e3a0b3a0833abf3e88fe2c29efc830284cc3a599c96202d46765b22006686bc8d0d970c62692b5086011ac87c029854860eba0c6518355214e7de835a68ae85b09388209632e4df7b622fe34920d5578e2c932e0097861418db640f42fa96f274197b27db2fe716e2c62b435d98c620f212c86c52e5a515d38b0c8d1d54e7458b0288e4e1ee7350c1ce740808452bf2a53d961d5f3bddbd500c11341fbe56ca23a98d294d61046a14e4859e811bca1fcf5bac25f6baed37fbeb27b9f4911b63af7fe60547d933a8f939a9e4c75ceff2854952726da3043a3c55ee580c691c448a329cc10703df5137934492354bdfc4bdec36d44e488cfb6294b43037038b65db28ddeaaa99656d040f8402d2e0ddb504d60522e678b4b93e65a6aaab82c83823ea99a8df65fb3c2e0aa09fc360a74e407a4ff113f7c5d586d6842cc2e29fa2f9cfc0e02c6c64becd9059867f72635046a20dfa96e4d91bcb2cd2e720836517a9f4090160c9c5eca0522af1a3dd282d16284e82444c77f9c1ef5bba8fa1fb2cd5fb9a609f3c47b93997a4e9c16439f1d0df71b364e08f9a3f31d59ed83e6a0a55387402c6e0974fde1c016c277d418df948a9332535c3e12bd7748f416b8fb6937d224d0bdf26242bed9730d0fc1b8f1e3c0c7521fb704fa63d108508a5f88672d8da91c4f7a62f33e87218bb2c56c2717112cf7d60778c2a49c4db3ca5f1f9bf823474bab11c5d1452d12af464409aad31c126aaa0d44087b1c32c763f06c3986700277c5e6b54092f6c8ff281f274cd7b353de5f7d2f3c31eb5442dc3c2eb0be91573334cca8e40fce6ff5900aaf409c8c90c6fa8e01c2fa86d7de8e4ecdefa6fa56c9f0eb4c36bd129b4b70340767b18884ab9ef2512323d0fee265d1c78851c6d27a1f00a94dcd9a95c04a44fc6af5284cefe115f393757de9e516adc18f709baa8821f8cd2874870dfdfec5b4776f814cc6c2032665765c1198e2848b4177022de3ce07a816f365ddd5207b0159be8a6572d0aa13130290034f9bffb635fd07d01bcfae9a5901198305d67ddfc0bb6cdbee40c4d747f4d1988adb5cb9a00c0a9209422f31470606d982922f4a849d5e8a59fdba74d467525e45a35b879543df894477ee61e3bd3b3b13a21b39b28910b93ab5933a92e3c4621adfd812dc0d50c9d3d638bf1267a369ba1d82865ef4f1e518bc5f37f2372183f437ed6f6a3977700a9466171edfe5a8ecc1644f3bf788d336f42698872ea86017869285c269b75ff6222cfbeedd0ace9ecfe7a1daf5734e6688d39cf65b6f8079e471ed624e49203fd40c4e85b81f8032b2be2c141f3a8c4c789ff360f855a08f7a1e8d48e422be11db3a8ce99d7f4e46722c75f2d4f3308817e96405a4dffaf4783bf39cdffe197089b5055b25d71e8aa0d8349466d43a08cf1861ba43c44bfa905fa20bdc94c746be6b64a4f5db419bb526791b8a420bc21c992f561caa1c0a447adf20668d694395f8e52dc5514a877de8d9f9c8b71eb48ce56cfe9b708e7d6c0b673be26a56b6790834a1368e544fc0253fea33ff15688ca2ac3a2c68c065689ce2981564a908aa691385e5d0e313b235b5339603977e7d0688e2414868f2a0331b2dfc83ccfdd27c06f4539e8640c4ee959ad97354286135810aeab159e303a125ea1a22f4461d6cc2ebcac6221bff9b770d3c1b96b5191255d962b721f0252375d5d6cd1138aa57dea07d4a90ce378107e0c85f22142274385dae3855e638bc9133e5a2b14695431d73586c7d269c13a4d41ddecf711fa3636d3a44614c5c05aac36e9da96b2eb9d8411716634eda09843ba82d76acee4ee07e07de768987c2e3beb4f7331ee8cc3cc2e4091cade3aae661849e591e418c877a9cafc7cea57b5ab53dc479a911f7dc131f8fe2ed712c9f1f407638d2e76cbede0dd9c7f91c48295af353b84e2ff8796c0881a6a8408d395d770f762550c6089a0a7c557bb182f6e8a003e0495008a58042e5de93002c940c0d95efd49bf3a6c0dc437b545775d851ba87828e10edaa1ae74d451e79faa612a55303bba6e5463fa5b68aca072ae318543079d12ed57cc4ede444d4d7d128b51ad2827d191a156873b4bb6a2ebebe012575341fbdf515c2e052df6a48e9917a6071aa869114efa3205692f277932650c0d93607f69aea47a4945e5207ceaa6ae74a7113c59b85d54f70296556c349979a4b9832529aba848b388aa9e566ca2e291df64c0db5a6acbf125c8855e6c0e98328fd69b212a24ee567d5e43a2bf0e8697f50319969add99fca3e2a61c0566020d41ea2daa9dd5a52a2ca9fd5cb15572071d4ee416572e75aa926551ea9058b5d8135a6761f554d8cd79275aa1c4a15567b053d51ed60aa90b5af659caaec54ca4a97763980c57556ed112a9156b0d5c5aa8c448d5c8505065bed1e5421f7b015db55b98f0a2c140b7280b543547e36630b51acf2b36a723d167894b5bfea8c0e0ff06a64e97856b9a88467e139b2288b2f6aed48759d84c1385b56f3d98abf2adfa4ccbee4add4abb10cf2d8fa66e96c5ce547d5f378167c47d72e564dbe74055cbbf653cd90dc3227a3fda6bcd2a9212cee72c3d252fb5ee5619571422d98f16b97a988a4aa2d2360e524ea646b2d90186cffa03a99af2dd9c2ca7e54e3215b9000b10d3941c9c0d3967ad3b6bd57c741f702ba895ca3d809523e728c7fef630d69d3ce8bda358f2912c1814b5c47250066fa3268333a41a08d5a0a684b2b056ea3288437d38ae02d34c4e14694f2000baa3cd4828a1cd8445f0465a42b419b37eaca99e2dd21556b91e6bb1d2b576675962b40820350cb70039598b4c72cd1ce17b104aadf8829351857624de2d647e0025ccb30039599f6b49f6b0316368e43eaa1a761045dd138bf8a1929c25fcaa8676087ac9a41af4a30158c4bb28127e34657a9411f1a186fdcd5ccf050c166af43a5ac6673011428c0b50d33a8928936cc25ec7a01fb076e59713c2e8316446e38b54f7e165b30034451ba11571a18ee4448d2c5f7e0c45fc620372d3357c2a9e40a4fe18e529101cf0a196b885f8abd6763445785714b9d316c898a14de610b5fc09559cd03d69c029a67464ced9b0710487a1d88e7065499d2fa9ad4ca3deec0765dee2804d2e38e36bf8a594cba8b1cfbf63b8269ecac74e1fa12ed2ddc873f04b3195a8c2faa1b897b410b4848980012ecdec56208ab5213875603c2791741cc34dcc378aa08fd10455019e5248226260922e896090e516a6c08ff24a663d08385e85ca910bbc084a06020440e576a3c5a5860413429e50d44d24c2024c501914eb0b75b18dadf3fe0647fe8d87e983c3f5cde7d68491fe6835f614eaf80b9bb901d0af0b3636fb7ec6fc2e316cc1c78b69d4ae98dcfc50472d7322161e8d23a63c600a910c02899b108f264678d4bc750c411fef9280ea58bb84e22d17a1edd0d9978c3eee085de04a5a5186394b88157e3c7f1d35646c2c8696b45e2f0292b227dc4e955236df4f415937ee4f4b5913478eaba901a8d22289d106510d493d0b200da83d09201d13b8122369a895001159d8150c98acc43ac180ace47a43005c70cb70977a6044fff20b46426ef11530c82f7135958013c882c1542d8092e28381c89172d18dcc4171c3c9cc497160866c2cb121446c24b0e026c828b18e46761051c7a06a12533798f986210bc9fc8c20ae04164a910c24e7041c1e148bc68c1e026bee0e0e124beb44030135e96a030125e721078892f4640f8892e2c009c44972a20ec0417141c98849736c4afc24a38f07c220b63f00e11a5227837810515c703d1a221839bf882837df00499536886cec8caa790b0bd675f0929d1b6fbd5fa51360724eed0da040352330398c60686460b94da49abb28a1690a842edb48a9b977bb055744b1e9e5b45a8448ff590c13baf82de65e0986aad032b747112c3614542a5312baf222b082b3c7622850a9b14201b26f03620506b68e0d39c40d8d803b501063035e53270378df529bcd385466caab84bcba0978731aeff5385b3c514afb94e5e879a9680ef0595630099bdde33a02d68825fe82c6bdd5029a65a4fa6605feb36b54ca4025a854bca936e6ca311d3f6b68e829d533bf5237ef098835a3caaba506145edf9918bc8848d0678a957707ffc45f4ae68ac97417a9364b4fbf9f86d56b8cc3019f0aee7c49a8b41268fec815d4f06b52565e477128c1ca7d8f929e833fbd2ba0a138a0ec00561c76115c7d9e573b7a82ab604eef48a62aad1448ea3127d1f5f50579c77e3e28baa4b75133e033966e083803dc2cab26dabb7a421f0111953ecdc2b92650747660f7858e4af999cf297229bab92cceca6f090d19f24357bbb9afd5879dbaa9b19df0c3c10f0c77225b86cb0828ec5f6902b966decbca12ad9cc66021f8dee6956426ede635bd1d9bccf292c12cefb2494ccbce4b66aa9390e6886512b32db9b051706e41156926dabbeb5aad2b4e1091a0ad22b2e2adfb27d93c60d99c2b65d4f4751c4d131027698e9681cfbcf12944fb44460b1ba389593160b499c82556ae86220a9c073e777206e0d673447cbe3c1de275ce14b8b7d0a30244caa29db0f2b2773c83aec7e7924634e9b0f04720b5c8e307f37f7feb0299af6159df5a56b7697175341f310f1ccc6c1f5170b05d0b302145e5a91d4ae195629179a68f74403e4f6e6b16c87feae73cf1058344cb860a41df53ad19b659aa4fd095f58de5973e7c5a36ba316eb4a2ebfe8e14c445160624fc3d954174eb4eb4f27bed019124208974d60a9019e02a1877d72d3b95666a40ac6c9d1ba7369c6babff1cf9360a418843872a16d09b8bbb6298ecfe7f29830484b4952971af8b9d8667341052adf56270abcec0fba3580a817c716c0957a9926f1041a6702ae6238ace8d9147a4f22df1dd01bf54388c82a784b8b7c8a8fb21007888b996d2031c59eae8095b6031834bfaf159666ee58f42a51f80ab31871f8784b03caee3f5ca3f40d87dbcd84b6d814a236ae693ba8943143e3f5e1d046d89419270ea1403e0c0cb34161f754f1c7184aae6540b93cf381e6aa62001e879a6b84d03ef5ef47a6cb0c4d5acd07b7b0a64406120e7c90503fc202cfe3ab3f8ef21b40089361622d854ae53824185a66fdf6fb648dc80c8a6ca6920103e12e11c90f1639a8036ca79e931eb7b417cd9e91dba7b31586ceb5e7d30a281e745ca0469212da25bb329aee1c8c09efc9a6f044aedbbd7a87781a1560683b7ff4c261ce593541363a80dd1d0992dc9b27441193a099cb3453b916fec6a3ca5c6308d629b242eaa4b245ce1e8d64caa1add36efb911d1c2512726eb88437e8f6ce8e4924fe8ac517119fc7a3298a9a2284d81e491ba73501b4bc813107e236a25a368bcee55efc8942eb2947e1152d39e855ddac2dc37eb6ed3ed81cf6df097e04666233c54ba2b24017db15016ab6b701500d34aae77152b98e29717de91e9d2ecd393337f36e747a2db8654cf38e3df1d4c5c209143d00d367557f4858a93379fad8a2acb2f2967d5b7b01d102713f436fa4f5e6dd0c349a222d33dbd09c99059aeffd134fd1582e4b98adb6c36c2c6eb3d3f657140bd455b8423f135b23571cd6afe75876286ffa17075b00400e1214ec502d7839034fef50375a1bef76ab0774e3f0566502d238f1eaf6638bf3760378d7e4308c7dc0da58896acb01b53d312c85e3155da36b43a8e239d586e1f459c2d30059f13b3cc12d00aa2d58ea1043d5971be2ff0658cd21eb69fd2752c83fe47cfbdf203e58093e09ced6248b390145ed4a9d01781128558ec8403047af0d32960956b39fcd129139a0cd6316f0bc9878b029ffef3108e8d738c97090f1c7167b482a8732c44cf8b62f017f3162c7e19b8a9dfbbc540726fe893cf47f5655a281010632477cdf05b561557e3ec2cd0c8a87ccc27d9b28dbb3aef425e61b8a88cd40fbd54ae9d03f6e15a6bb0dc00ab57aa07d9470b6aa16386e6228e3fdfa34a1e73de70073b0382f0ff20cbe8396d3168577130a0bfb0f3218a66f83a28b513806e2cafec994553278d3941575fc24836c5e28fe8be3f1345d63ccab48d2240efc92e1f55321ca235b4abf116335d92741ebf5511e1b4275c43bfec5b32af2822e81a6072a0c3c6dfcb0ecbc85a75f6131d1f62f6ec4935df55b619e1f4460c67a2423393c1bcc8d27435d853ed2394dbe7efe9d9592d6fb7f7b2b39e9b72693b56d3a529ab8ae121f800264ecd911b5b090641722a049f55fa62417d807622b53c67a15c084581a9701f1b2759195b28c97debae0f82fff2ea40541cb0290ef02607ebc816ea1159f007b2732cb454f202cf24a2dd44c0ef52e4739d7bfb0c865bc1e6d671687b2ad110a3d1595a50e3de5d8853a1152085baf94d7da3e61e3058fa4d449cfd084e11f81b89a2a18a1a8fdca89de9fe5e6d2981b4740988cd592868b650b80ae598e17732ce2b5b81f8ff426e9758df6821446286cc8e3648f9d9a4bd6f7642ebf8ee0acf336d92c5bf3e62652711803908f90f754c125f9fc090b039f4b0098fcd3ef9220f1a70306f672f7a012b1f10001bad18494d91878850a993cdaa5f9a317fbc34bc0b9ac87da542d2e6ff1aa5f2dc8d71d3026c4b1b853a99c63f841970e8a5ceac3e0176b3f648d7a828c6a8bf7d64ce8b3b8c74e4ef4533690f201c11bae88d3f4ac60e3d6e91b9e048509eff20091f3c1173a45e725e60e2edc0aa2cba514245c778216856f3e71d75781ba55a34969b24f58f05303670772984eb743ee413233d07131e55d33a71815ef0b1c20943cff380cddd877fd1f4bd81fbec17a048343825320ef16716fd27b6c6083dae5b40c340fa5e9d17dd5a6e4035d138891370dc4aef98631a6278dda3ef90edecefd99ff695d49250f51635d4a055374593d8c0d86c8481a06791c314df1ecc102581b5bea54ec775c71c165645ba887414fd3cc500f475fa8259164c8c0be15241542ed76c9579b2db91c111480939a88e60a4dbe4b4e379ca00b0e0472b78e1092f9cc497292a09938a73e29338bc05e347636ae1f3bdeacdac8744d9ed058fc76f3b455877b46a6fba4d0b2efba0b264e13ee5b2887725d09ff00ffb0a8575b41f926f1569ab7f811fd7f1b7104c88ed4f8174fb1f82542d16f59d447a482579185fca7a71e255f4e7cd0e226cf5a4d2b574643e7d34ae762b4a1ef4baa3441867e9ad874f64c15f673944d5185cdd3d8ee83b053a23412abc9999d5997d2166c89b298eba2bd14bbb29346975bc50fc249273e6d4fb78295363ec3eb88df490c2ebc4e5ace1b07cb2549f114d534293a64250d1fda8be6ffac5edf292150b64e12042e4c13c7914c7830e3a686e0c30da20c7ba0d05efaefbc1d914fb4602347b6cbad2b1591149ecb9ba42060bead6335ea3580f21e52d43dfe02294ceb1539ee7caf7b0eac13c316b5a3fe08b3e2092988a7f3b7979da41884ac27186c4fca058336b2b36b12ff2f1e47b010ce8768b622c6b599020c6567627b29fadf4fa2d797ff31bc60672e10b8ae5204ceedf5c47995f0ce72b37e70cb8de00d853477af6eedb0c4f2b0d2345a3d4e2fad9b5f912c7e17ce0d238d21aed3c8d2ab1b8500245d7ef00e492dd68bb0bb919cee33b06e0c5bbc8eeaa3cc8a11521c9eced7a6b7926210903e60b05d2b171eda48ee92491cbfa23a1cfc81bf04b3e6825f6a0a67342d4275e87f4a2fee490884aeab8cc0f2f7bed379230e5ba0d172a0f7edb40d8137602f89d255dc2c631beb628f8912dc9ddf783c5cca4c09f90fc9c2776148d2ee18fed890d9eb02b51324923f6c1d329256ba65756a882e3007e43eee0d9776d4616ab760180563662edaafdbf400158c64413110b7f0c908d07ca8608800fce012e2af7c12009ed6c191f2ad623ce012848aacb27eabff12d59cff9c78bd7e66c0b2368112c2ebe3704b8aa005fadc8e869055eb24eeea5dad9b35b62d693061d6d5224252813504812e6cba252681a8bd8ba6f485e16bec91aff88779d395fa787d44d83cca549d9483f1b9ff4ec59cd143070859fd651949495511aa2953088444dafd47e173feb02fe6e74f707ebb5da51a770b1ecdaa8002a8563ef1c548598728605ebc17f9dc67bdac3556f2074ba7561571807788cd11400958f1c7db1af176720ac1e2d18e8d0b1a00b849fcde4dd761d25f73013fd27bfb8cbeb0d43b589f26a36af2d35aab01fd1b629d8d53db7165fd86375477bb1d6c3e2e3d7cf134f0f273d2453f5c28d5f7555662adcea6124726c06664a19ab8c302ecb533bb941f7fa158b36417455f6a36cc3b5b3197658476d4fc9dcf77a5b6d7c5a3ef02534aa9b6ac56d75d3abeb73b3621dfe71ed9620d8dfced9fb7b37f4b163f76d9b97c0167aef5e296597689b46bca6dd7c6010ba55a9334c0814127706d40948c89fff379d4b1f528e1132dbaea60f8ecd08c42438b25e55df586c9418ea60ca1ee5569ec0ad8c5439fc78de2fdde3f76e9f028a9c5b81f56769f4ba36b26f94c12648bc57e349258a11eedae68c97c6fa63dcd3c54f182d6bd2418a6b3ba00598ce16dc30f3a8445c6975cb5d15413a8abe651b89813dcdd963a296b9818a981d2e783af8202ef0dd8243ab19b9b0415ce6797d424dd1b9e8be565dcefef8feb1a75e9bb1e3356db101b2f707c66dab6feeb06eb5db81152fa52392c3fa35db008e60a6d0394f8d4293f7e1e833183b60f0937a5ce87d2aead93a4ea443b1c9ba73ab9316f0b3c835f942f6f209b98f1143c0306450e66e0505dfdb6c99e367b0e3f3ce6de6a8945f3ca990e24b1200a03f5e2a911202b87fe977213208417f7512d1d5e7d927556650e5eb84d859c73701dbeeda52be76216d5d5560a344a958e2159eaccf247b67e6778e5ee4d5b2967866e890b0a9eb1470d855f237e4d0b060ff959c4eecfe701d5e75834f045d3232b99d8f4fa0e7056f1e0da6acbe9dda2dd68206d261f9acf9111964860a86f428f4d736e54c963863fb0694d5627cef43bb8b0cfe9ebcf3f12e5ce24d45ac35e3f92620e1b499758d7730180f4dccf9bfdd19251d723e27b7b8cb8d963899f18ec9c5b097d60e47f4d9f6c3d48e4e730c31c56983edf27a14f45cf056b205066351e6d37b3915127844d9ed6448c3992484b2458227ede4b3a1b8d889823cdb67f7dc19c2647a095d116a11f378e9007be420d1416eac638d2e5870fb021876a51572e36702a5eadad10d25961249189cb90968b9fa3a4d964a4cb6295e078ae01cc9fe767e9ca3661133ae68d02fe616c927cfe688627ea4bbfcb797a72cb6afd2602cfaa699cd61cd8813476be0eca522500a883f89f56d9e8e160b9f5e1bcea95b65c7f7c134c3ec0dc3a52c0b61d699603f70c8ee5c8a2b865ffb83de5d11519f5c67b823f34dc4c68db976e4c5d2c276b1980bba8491890153ce1cc705b4e4e46124d438d1e6c6797bf91fdce71b096ff17b1e8aab7c386477f832fbffff87b06616d124cf31932446713026ff6dcaf278f0bec9aa641c55d006443f221dd90907ed3eb8c367714ec641d972047930c98081907484328e8a4841dc46769a253874a8f2229755878626c53857050ee7220b20a2cb014c63b95b5a5605cde84f21e853cc5bc59642ba3419362026c532ea66c2914872404a026f6216fa80247267158644c74b4b25d845440d8a63bc8ca29345ecadc26daf429c8e486882a997df34d148cd274f0bf5e6cbeefd2660167a10f497ebe60caa04c83e0718aee6fba4f68748e232e7435a1f41de93a649ed10e90f1ff329fa7e9222eeb30412f3e5b98549be2563ee79ed4939030bccfc3b4dc6fa3246415502834a80323e51155ff9619a3111a99636facc956386ddf621f219490fb4c24416977385e41c633c7f731a849ba245463c17002188dbdf5becbf6dbf52b55047024fdc2134bddf0b14899bda49a5fb1fe5614eefee7fe4b6071c4ba871f04c3e62af06c6df97b08e444c051e9b43ed993ec45bd8caf25a72a1c38feba4b3ad93e08155eb8edeffdd0f0958e7938063433c3f76b8cfd199e8746efe596f5d5091db6cc70b7b6da4b089fd4e96295ff564177e30be3ca7929c6aaf001a09fbb7349088d0c9bf96515de3dd2ce56fadd5f49d46500f0528124ca7dedb791acaabaa94da07e78ab403f5ba5dae97df6766c70285c515b572ac04ede52ec308d8291c36596d00e9d5bd17298c3b04c9dd85c492abbe52a6ac277a2d1274d3354d013f8de67ce868a8f57f7f049e348f2c67817fbb4a23ab2d8f53502b9b6513ca0acfaf3110b30dbd830aa3ee458ef76866b4674962539f151a4431fa92c4422fd24798dd8c6b269b2797c8d3289c866f8ee1e47361cd0b466fc4f0df04e847ccd5427767639c989b2a0de7c1a3015538bf3938c1821107a2a49babc6fd0b3ec3bd1a48c5934f664294d42c151240f106829935a403935480ec654bdd091c1e0952533a054cda849d33d273494652b2e956cbda27ca0ab2c952dfc7d20140624f842cddf46574ffdd0ff92b192aeb0543b665ef2fbf3fa61b8dc9ce40c596a7989a042fc6c641b69295f46179c4f5802f89ddd25080f630a04297af63286f8d92ca106313fdeb001373987b1fd4b69bb24d7221afc2ccee905f686923d1908912bcef76ccc02a0198e08b2d2f2d7ccd0fdc89e4b43dfc51a5ef560b54f0a0531889531b48799e53564411451845954f93f3a6e2d5452de33f78a993882b3948de9ae49db14478e72be226f35b451c21ccc2726a9d979a39ef32019e2e7b96462176e98e7f45f0cec9cf0038ae97c05e49259a89679216ac50f56e8dc76b1696bff9213b420d835d4cb4659dc5e619e5616f7a3a82a9498fb703010d4abc9b45ce7d64671874db3b8bbc5c5f6e23c5bfbd56666b290da68212ba395ebf6746ad99149d8ea6684ae8fa9366765dfb2cc9ded56918f0b0b7398b5e6bb8ae6fd8fe2ccc12c66d6daa22888aacbce62324ad2355c0e58939dc3c3a173c084279dafb8d5d4dec69115e2e17a690efc7cce8cb69b1977f139d95c454c6e6bd243a57b0e4ff170daa5827bf48aebcb1fa42895fa752c28da0731ac3993e41862d0c82622862a06db6eb1d7e65e566f35a1eb2bad3a8cf977afb7f965a5410874f335f142c4342751682b14a4e1f5e43cc2cf26d61853f9130ab1c7db9f5c0c8c71d0d5b66c1559457b0b9ac385a1605171148f47700c146bf705741cfd79cee5271fc874cff2b1f23366a714d721df05b2d143ac9e9e5e55737ac11ad9d8d5539a425b468925bdec154443dd27dbe57f1f5c0c339cddfaeaa0e1bcf4fd0c3bc15c88cef3cdebdf7a03dee7a5c2fa3a99074854439142f30f841cea65be0a614d62621955e2e9cff73f4090cdeaefdf6671f50ffd5938493f6fc5909913742a7c5fd6f9ec141a5e3622258e1b2e4bc0d781dde2665f4c0c7c28c64d50d77d07d1deb0bbbf5f6ba34e520318f1215eaa3a659faaf5474512753e9f41ef271d772908fc16bdd38b3e8603efa60cfec31c23cc2f06a90be166999ac0ea8df7d6e7b1e0843bd8a1cb9b8f13cd415c0f7675a63744ae10c8b2274f3f6501e38185067e79f484d79f68d6ab0142235ef8e3a293313e4e85d85664ef851d8aa5cfc2f7328ec34a21eaf3ca282b74487a92d6b4e01c9098f38437d66f28a3f954d0ab51b9ee8558d1a79d51636e4913be9f53743ceb6bfeb9a88598d7d5563ec719697fe9015734340a4d188a1d97bf201f3193cb21ef9b3f45b3655cbdd5f1f8c6fb898709c061dd6144d9f1f5b7c064594f3a24134bcba335b7dfa109b88057425766aa2b977e24e51c154d4f5d242b948817a78b861c1f82db592c73b67e42e0e00671cd94965bdcfb9cf560f65c64deba63d785772794efe814832b7d73e2fe0a71ceef7ef618986545b45d4e01b153c43559065cf50b8ed78ceda90c38c794b44550675e5d35c9fbecad69e50b3f33e0622c08534f9fa861641b6e870d845b5de749ee20fc24eeb428c732e0288d3d1a3fc4e79fcfd60fcc801b44e6edc97518e2c6ad545426773dea60a80c3857c93bd380a7bddb3fd9a8ba3713ab3d68d4f9ef8a37bef64b31b938782939975168f7183576e1c3cafd6678cd9bb86bf2861f1fc362c9c754d4abb233c1131ff0a623eb3611f80920405cc50d0e400fd85bbc9cebbc00b1c3e1dabe76a825999e35e549079d5d9e34b0014a126720f5d0a64602024a6d1b4a1fc29b0913d5b4a9129ba15bf242aafa6ed8f280067210c8c87b50d3cd02a61385d5b7b528e877ba6680806effa209b0cf381a48da17298321ec1768d7fe925bbe97e2e4de096dcb2e34382dcfbff20814a513899905e147e1c12fb0247ff481e81244ad67088e2b27869bbd841eb3988e23c6ed205b5e8835a61fcdd65c2843b602ae3665b2a0ab787bd801064ad1eacaf3cd0de5b3892a5a15767c8e8915f62a4e52ed843f8b1574da30887bd8ea48a6d77d6a436b593b2a41d5506bf465bad809d4fa8e9c21a7c7843aca5c47ebbe1d84454ecece8088c50db6cf461291d8ce7e8561452c0d10c348031a8afb07b1083e5a86cb433da9a0531e9d00912fe9f82f96bc0c7edb8c674213f74b0f1a48deea8d627dd135aedc8cb6f9770c86f357564905dc820f8a3e9422497867b71ed5ef93adc1f31d7da1064eec55a00e95f3f3749e7e136b188daf4f5102757b162c0609795d38a7562a3cac91487fce228d8d540fe648889c9d116546e1dde4fc1dd170bdea0ab11a894c8da1644bac3ee3475b7d4d24fd3f6b19d213610ba8d61a6a3477c37c10803612483454874d5e2d2445af2ca608548fac21622d74f0ff1c4b84754134e2eb246cc3993f638b396e1c987d071d102a6adb16392301da92f487340c30b07dc3fd00d07423be94a2eb5120fc1e2ca9806d991fed0d6f754d38b19e303cfb6835751273e3bf28f82bdf958f84ad442610d60053ebeaa016c3689fbed955be1b6a12c4e8bc2fa8c1a7f7bc58bf7bf7771cc013adc0e34000daf894fb8caddcc4b620edb2c767dc30827d0da42150b9bad377df38f71880035cfff73efc8c9c05079426b96073d7b79909495b5be24bbfe9922fe1c772a0f5483bc601b2ffa6f98d1a11446390d2d585555f6eedf44e718671b76ebb122b3b6e6cf961e1537ad40d710550cd4b28330010df2efd1e2f5c7204c1b8d68c235a9ca3158eab384c14a99dece3c95237d16460df53fc996845b2d219b3c0a632b212050d4b445d9db833468a05412721e6a511330c53f7573f96c25c38e87e3c8b0638999efdd4a47de502b3aa6d002439a97f1fc1fa01edb54fe1cc55235614ea8b6ffd7f43775f8a5cb390d1dd1ee081e41247b5c444d2b4c62ef2f77abc09b2364d978b39c2bf9309a78956a7ad56b8320439fd4b3a79aa639d149540149112a764b89e875ee0ae6a04267c334c32119823917ed9217bae8e66f8fdcf6b79e38d81772163b6acd2c3051f848f04be1284d70c57301cd93807090b0e3a968ea563e9f82d2822e24cbe6eae954579634c9caa937c6e8fa999a749a6c62c295b040300000a80c274a405e6e9cf4d414e29da570d3dfc67ec8e552a3cc07f6cfbbfb1f2bdb46465f796324919f10c730cb70c3fdfba08fa2173b70cde18348d883182ee27d420dbf30935bcf637a335425a23d4eeaabaf450bb62180bb3db9b1af64686bdb917f6f64e84891afdf6734a61d2987b73278c5f7a12a86b9a3abf7d37aba89186edce7fba1c6f76e741dd79abbff1de1976332f97bc6e2ac142910dcaa3fd39e879e2d33006f41eea78e1db3087fd5097a5307c1b869e2dff06cbf3ee7bbae4d997b9f5b35ef8b6a33bbad4a92f7377e76b27fc1a7632dd9dbb688d95f962fb6d656e1ac6fcf0de08bafdbb144f7fe4cf5177d5b4f764ba81dced9f62e555bc0e3e994ca1e2c5bcf229f2dc40509b33dd299010836d50c6db13ca737b9e1bcfb9b5d03f45aeee35747ff153e4b93f0e14f3549285d60665cffe7cdb73dd39cfcfa7a8d46bedd877d87626567ff6d78a4381b3411c30b6b7d0472bc0c92d0db8c7132744db7fa1ecfb13655ac44daa17978ca6e8ca87f28fee3bff793290bb3f8f3310bc3fdf6519bcbdaeeb425d170a3d8c4f223bf4960ddfc4282f823a99da60bed8decb1407b365fbafc39eebfe647287e88784190c09b31b9b834bca62d1141c69009e4778a266f3b0e7119480864dfae9f3e2132a98edf9041072f658a403ed1ab028db70d3f69ffcf2824bcaa22e3f51969fe6132a40b2b7a74e38ca5347d825556253247bfbfcf6fec9956e7fff7c0efad7907fc04e583f94b96dd180436e2a555dd223db577787be470f27b5d7426fc302d03d9d14c57f317b2e41cfdb4f914b223bc57f614c8aff3cf9f39f8706981be443e82b4847a8eacf7bfe43b9405fd8f72c66989a222ba094836eefced8d6bec7ca6b4f57748fd74c421cb0b06712e250851dd225d739e8f67edb766fef2b6702c4a93dfca46d6fd580a98aaa32dd560db87c99db3ec154b551d66623a22a519eb929d17bb88303345544f463fdfcb49fbb432fca56951a334dd93460f14375cc3325ca45ac4afccfa201fbd333e0726e225bfced438a7fc302f8cb70527cd24fe27b9ee101b88f269d14fffbe4aa4b97fdf9502e5deccf97ee52c027973c36c8c9cf7b2ec265ab38f90915a133a11cfaaf0b63429ae290dd340c7dcd2ea8134e6e2fe6e96448cbf8f637a26a194e6e5f67b87c79a928ea4449592f4af6468f6c8f12e6a09bb29cdcde9a0197208e08c7419c222091c6d4890da79ab6cd99f015885351ceaaf353592da161ccca490a1a26155451822216fc1230914b80449b608509582c371dc8c204330f6cc1c407e6700382e409661e82a625561d5087258e24a11e70072830e86289283e60cb0c50401e6e44f0050a9c804097254220009c80b124861252e064be4650860a8acc2f059cc1228127188e49c357305b4a20eac60fab02be3c318423b5a29c0937ad800150c1cc1dc90db8c46b90a400698401c02598042435bb7496ec85e3a7a98415137b7b9089a3686adb25e8646f0fbefc54823050899fecde1e84f9c999f856544a5d8a15151d23681cb68de859ee8469fb6d5339b9e1ee51be7455e8b7f7257eaaa7fadb057787b2e8f61e859ff06f5f557ef2fcf6b5889f3abf7da5f153f8342e70a685bf59356d5b9d29ab127bab4becad9bb9bc4e0d70f79daefb27b000368a1a6cec1426356e681c0940076a5e3a3002d4febce1b44531ccd8a328c8d8a328c4d828496000607b78e0b2454cbcd8a0191ef6dd530945542d2ef6a7861db6480b3a44c1c40125901c3892c306f7540207582df697c3627f6460d95e1756ec8e14f4ee48216f9c84df4012546c200729764783951deea9840dac5436e64269a3c0481bbfec133865d73d95a00122eca9040db836d7a37f3e36226d93808bd054129f32127a257e8aa954aa2452ac24e68bb94b7b1a006b0393dcb62371948b0fc0460bb365eed26b0cc0060bf3c5dcfe5addd34fa19f6101e82e69687b17ef489cdc7e5a25d8f374e359457d37d5b4fdbd188fe3372bbbd906e5ce16f354a2850e6c4fb6db5d5fc0738f2ffabcffe7b9140afd17ca73974354e2bb2e4bfe730f51ed520c89bafcf206eb0a3b6485d9723fa44b21d0cbdc1d7a51fea19a3eff8142fea072c2f6fd8f2e7d429fff421fff1012f044a19f1f9f482af4b7a2c6e721fa510731f2d13c443ffa910e327a91be9ef2fe74a6a248efaf22fad20f417a152d64f4a42f692146788c9ef442c6177d9398bbfc345f5d78b2b777248ea27e5a02ca2a5bcc9e9cb24b2ffa214ada4735f9933e25d3d447faa985907ef4222dc4080fd28f5e88e8c79f290f4b428c2ffa21464fcaa5cfa77c744908d1939e87e849ff79920e62e4a379903e4507193de9838c2f4a11f9bb2b25fbaba246baf4f9d16fbaf4f9990a628487e8473ac82806351491a544fa56d3763b38c0330572c204a99932f201bdf813b35c1758c6e7e744a94c53487f3e622ee9b02a95b6ed9ea10eaa526dd08bd9415acc7456931f01a3f87dd725ffbcccf58f6bef6f66dd7ed62fb637aada3cd9de70eee1871c448fee634271664ba9fbabcb1bac7d7fee72886a97dd77332d7fd37ba366d30767da108e08b61670f24d96927bc1e0609ef697f3a5835dce244af69c495e33099299c4b5e74c7264cff99aed395fb2f97aedd9f273e780c4ba8eb4f67c9810cc1d4e50ce570bcaf992c19e8f630b33c79738c2d0c39738ce80830de497f3a5d25fced7cc9e0ff3814903049346fef9e2678ac5fff8376eb4f62c6fdcec7963c99e3760a02f6f3c99a1d9b3c4b16ae1b859f92249bcca2741a68c94bebce14af1e58dd79e5fdec8d938547be2a859f1250e960bc76bcf2f6712d99e5fce24b13dbf9c4970f6fc722681edd9dd3c79f972bea2381591a1048c255c989849663093383132d973bea0d873c99e2f252ebec41103e24b1c383438601aeb06147bde60b2e78d267bde70b2e7b7e41cb22d43d7e2218719c3d92dff225f27bb6791713575bf00fc2d1e7439e21cbed6e4f05d0e341dd82d7a84b9f1b3a26cfcac281a30a30a979f15868c9fa717aa7232889801bc0edaa4a90f4f6ab01f3ef5b3a27a20c0e778a7a9280a23df05105466d2e1c1efa9ca4f1e824976df790876f74150d5ee9c66d21920747909a0cb5b7568cafa41fb40593974796374797bd003a03329bd6776f7234c45c1e8f271e8f26fe87214802e471bbac6484307607cd1e545e9f2e218ba1c5d7449bed025a942972e3ce8d245b7e8f2a57b57c1447135b47b2a73a14b15bb749add75dec4ee76d0e5d54197d8a4cbb123758973a073c5b3fc102d9e8516c2e25b3c8b166284078b6ff142587e05d82297e8b37822a91579c5b7781e2bbec5d36fd1e259e8202cbec50761f9154f24655be4594df659e41559671fe81effd64ebed554dde572693017cc73aaa9fbff71c478a3a9a8faf2e2e24292ffe38871ada9b118cee799aa31994ce6388ed3bdbb2a4a9ba9a6eeefed3456cd3f2b8795732fc6e3f80fd36076f4f67f18114455e1a00219314465449091f722ba2de11f999394272c1647c35aed4e63a160263350eceecb4db597e4287924e3114ce3646765d5d4fdbd3539d3adcd5494bda9a6ee5db49997191bdbdd4cf71aacfe8f23c695b2eec5781cff49d2c5a5962fa3cf825925cfbd32539f69ca7366bbfb2de7aaf0cc98b3bbff6452c63925d77b311ec77f92d4e5c6c4ee6acdee5ecc28795b39d969b01aeb7e1c31769c7bbb72ec1e67810b1bcc2029e59bf803e3e28bf206ca4b76f7a19c42eb8da69a3a25bb43b2bb2f6dce76446f354e7e9f06854d82351c27bbffb40673b2fb72a3d956f5d9364f255868c10633a9da34934e762773b2db9838d96db1ddcd3046e43d37038f6351cdd5bc3057431ffcf2a2fc286b334e762fca9a124e761fca1a8d93dd5b23e0b07b5b046cd3e93cdfbda74b4e89dd7134bbfb6d8977bf31e11b123f81befb8dc64fa3ef7e5bc24fa2ef7e5bf929f42fdb7b145dce27bbdc68b62876476eafc92e379a773236293726a8a984063bb1bb6d06bb73d96876f71a4b63692c8db5bb579153e4f057b24de7553a5fca3645921853e1cf90a9ce5b97edd153dabd55817f2fc61354edee49294a463dca795613ca9c6dfa9f234836fd4e3895b0749a08eed5628825e2768813b15f8c11ec242a2eac2249e0d4f64592b8a9ce83458c843f6f5e63e9f2926dec87d9a67e27db78aa7d1a9684b07f9f477ded3bf7c36ca33d986dee6f7906a7ae9752376fdf6d5ac8f65797a82e0de17df743dcff74902147948083d4fd4e0b31c28336210852485d4f7b3f53d7014e72b79a388eca30049ce49e6a0638c9c52c115aeb1b2835c337dfe7d4008aa23c66dbb64d1bc2939a34caed4b3abcbd69233c54d82efbb399aa6a9d426d825f97294a1297f74ca95f8a6accf9a2ecec59bf44f93edb7ee985253d4d4a6a5f3a0dcf4f8c3b9d4e877e9e3969542368a7d3e9fc75b2f333fc19624f8d85e0e77597db72e9a110f1d02d8aefa39452eaee0e82185f41d3346ddbb6edd61c4ee57f04e17bef05ad8a85245f65742d580b1ae9f5b06b01832038b1fdd0ea308c4903b6fa3ba06b016b5700b52be08fd5ae9052d2f7f7ee896cb280f6d2af5413519fd24c9db432ea2dcfa92f0bd67cc411351f51f311471c71c411471c81ebbd1d5b4120580339100876d9766fd11cfaa233b3dabfd584c114e079274dcd1adb33ef7486f43f584c104ed6dfb1d11bed04f8073fb9a51dbac4c94a619ade38597f06d3f757f541b7bde7fdf71e03f6d4a5a6d1e7f48b9330f46d3859bf7b2aa3bdc004515f017ed29ecefce264a5d77fda70b2fa53fdb9da38b99e1ac6c9faf4c5c5c9973b3de3713a8b9bfc6d6c776d5b42c9fe2cd59f79e23d951086d5cea093147b49625a84d7fce844a54cd3f6f29efb3b5196e24de9168623f7fe1f973f8f1cf77ee274c97df8db93caf05d8f61ce2adc87a17e27b7bf3a086c6354f9cffa731cf7305ebefcaddbd7ce0cbd5611782124f52024b76ddce6d5630eb63a88111edd7b1fc4080ffbdd07f13a1de4566a0488b64b159bd31bc7a9dcd7a393dbd719ec3f5f4ea4d62e896f7b0b844684f6baf4c3dcae3b36c032dade74a93d10bafd61dc89544a99f05adddddd566acbebe2e5e7f4abec892241fb431048d45a6be5b653795d58bc599cd451de2aecfa576f61be7210200837d51f58fc04d24c40a90e78c0712c324a7ffbd77ffbcfbbef466647ff39afb3f689b09f576bb5f65e2e7fb55e9f565beb0f3baa5b6b6bd5be82da9c735a6bb1b55fedb66dc165b4ad7d49fbb973d097d136d59af89c60fbda9713b6a3a254dc449f05c7c5a63f67e641dfd21febccf91ffde70e273f805dff3035cc9cc1f3cbf9aaeeb06fc6985fef9db9dc9e72dbe6f7cb1e3dbccb3df20e1e4e3a0f3fede831e7cdef526ef5613fbc76cc0983edf0130c8f1e7eaaefb039e79c13d3e4ecc984287679b75639557d10356dec29c30504aaa93ef653f7f341a39f28caf3fd0cbb30f46aadb5be845ef762c34fdaae3fb702dc541f0215f5d20307972ebbd67f0935013098ef3471ffe5394d2e5c09814dbf729ea74b24ea77f365f8a9d32e9c8b8cfa37b370fabf8e7e724e6327af07709d5bc5d5ea72acb4752d0782afab939be19c2ddc531fe8eefc372bc871f7830cc146bc50be2fc04981b24749136652387b60a99be71a58e00555eaab358cf97c0d63bee7705a2950f68a38c949e1ccc95237d770020f5e292e5780ee92470428a05cb59ed7c7bebe6a024cfa92caeead1ef78f042bf0780f4a4f6b13b536616d9298d2fb605f96c62e615728db16c67c7e0b63be1427bb7b4c53389778dcc78f9390640a38f8878445b84919f19e48ead334208a7ae04df8ca9bd05ebb7b2d081bc0224083670c6d40369828fbda5adb7a2db79add6d2cd7a430b52468ae6a7a62a23423cc0f94ef7f9a11501e45977607bbfb8e3e287b8aa69aba87f15535754fa1c0a5e6aa25c0a5a5b1dddb12d0745b5b18581bd455f7b503b8d2e05273b9ace67257adab19a5af569ded2b12e0d2f7739733e7db96e8807a10830fa5071515047f9021a3173f08e887dc0f8da3ccc952a1ccc5c19502e58e16383093c2793e810419a8521e582a94ef0f6852a08c556c80a570a61ca091c22b3543cd88f73486b537cccf975b0776b78960771b0a8830352c4cd44b35757efa76f75aa74961779a1376a72561540326831776f77504bef213f7dd6b371505faee7ef7daaba2f077dc2c352876f75cf630e0df208d898f4f4aec446bb2bbaf22c0e5dd5d8f89b3c2e013d3d4d9573575f6095fc1d4be9a2dddc3785502e3bf9aabae2a137efa504ab5d0876ebbd65cb3a57b9a83f1dfa75f6aaefd3d0d51ae0e32e6a46107ab14d69d168222afd44c71a0c6210e29239dfdef82bef253e700fe65491ba1c3b511d587b95d9e946538d97d0d01a66f35d554e6b27d131fb48e7eb20dfeca012cca369aaba2c617bde7f3411c85bf7b24fcf47df73d2a6ad49a4bdf1bd218775f4a7355149d26eebbd7e76677dc975a3d85e0e705946b49c0c231c43cf329fc28d987b93d3ff1e7f3f97c3e8df5744fa6b3857b1be6a0fbfbf0cb97dd7d0dbb07bfeeab0a77afdd8bf1d45cafea4db0722ba46004096901b06d00b6b56f73d04dce16fb07c0e56ffb2cf3de5a7a8dfaa5ffa64917ae69174e5acdc54faeed3862ec4f66176bfdc96ddf927edab4b7efe227bcb7ed35fd43b465b409b346bee964bd31f66763fb9ca39e8e4470ffda4e02bffdef3522ec2e8b06a0bbbb792619016c77daa6797b4e46db7686d6465b24df6429b9ee27adc17de9767abaa439e89ea90a8365caad268d8dfbb25edc651bed6fe6808f0af30acbced9dff4d2d94277add12c09bec952be11ee39cec8f42ed369d29ecb3c28a83f14d8156b54a552a94c9d0576a8e36efbdf06823c6ca7e99ca1fdfc8f03b95c12227cf07b84ba47f79d1b102153f7fd29db445244523abc3782c6c1ea9216e91ecc45c0d73a46b0113367cbd439015012d94eb53007913d7d736f0b8188b1b7ff365bb77d0ed442fb17ecb21120beb7ffea566badb5dab0733510d7aca6cf596d09df6429bbd7aef6827bc6e88bfa137b3c315a83ae285db9285efc1efc1e5fe250787d6fe227ed0667578fb9eca59aaa12b54814d569ea5f8cc7f19f245d62b486cfcc1775e603f3e7c31c7a2e8bfe6694eff2e80913db47b0e711d0a0c419a2d8f30d7b1e6116c5ccc99e6bd8f30866e8c0fe2a383157c3984b73dd610ebd96c7f732a8a395aa34e9e92700973447085cd29c27bb3e7de2a7f256d1cf2912897489a25d959333494f672a2afc1a2bbd4aca7f50defb4f0b797cbfa283d0d4f79ff6996a8aa9e8922ec7145dba6bd71fe98f2ebd85770a3049531c0a73f28a6c9e291ac3629edb453051b79a66fcd4edea4a4c1a3ed65affe5c711e3199bb119dba22867132c3691d1d8773e01fe42600af353f97bf475c4e2f8a22e479aca9cac4f634ed6599fc6a8cc4f93e63859ff935de5647d4701cdd974b5c2ae4b3c8eba1c1fa4cb47d133225dba7434517425bcefbcd388da67e8cc6ca94f7352feab29ba1c37bada5608a0a9cfbe3bb94fa2d8a5cf8c4aecfab2ebdb3c661f6587c2c9faa1ec4bdc541f1483ddecfa0ca828affe727121c9ff71c47366d72960ac5d34e964adef2b4cf608a20737d107338c93f4271328e69c1355a7933b9fcc281c3051d301d344bb9788897dedce47e16a72729f4451641ae181fff336c864c24b0b2370a56ce9f2b2e7f5849f37e79c2fdb7589d365e7896c22db763a9d877177ffbef7efb9ff6e18fe0de9c7793ccf791ec67d56d0375c9558fc6127414edae732ddd46573016cdb1917ad8793733aaa085569c166e39f1c91219ce10bac941023f8b9dfbef39ddfbe52016bef2bfc7de9ab93f641ece0e1a7cf6baf837012043f33f0953351a580fdb19e295ddb34d75ce98c931a083a13be03ec35da574e6aef2ac09fa6817a08219c0e32958c600538a921f5892a952a6f16980062d62e310d755425a4f60ef021bad21077fa8c4b24d5e98e2e45f1643ad99aaebed9b795554d760a78be582f2e3fefc59aa681e0d5b046e90b6b6f5bdaa64b9a1e62fbee3b2de4ea21d507af14a7a7cfd8f44c6916e6ae7d30f8be896f28d9f306cbdaaab92e87a86ae9805d6dc85c7aa3666bd44300849b3d9390a4096acf277ea064832f2e2fa4cb939bde4ae9e61ea61231c3ab2a89b85cb52911f75db59dcbe50d1607ce5e66cededeefb8f58ceabfbaeb6c288001ba47377118d0e305667ef99203aafc747f7cd608d6ec0f67754bb0c8de266565d6679180c1d66cd9b69f604dd7755dd7755dd7755dd7755dd781aa6ada7e34ce44bff9cde6a208a0ff3d7172f39776d7fbdb36e0d25dfef2fccdf297f3c2dc7bce6cd99e0b7714c11595f2e3e3886dfa5150c82825536ef4438c428c702f64f4a29fa97144fa510b199f244494327ad1f318bde839cd83f4e3c37889fb11f7dc8fe38f7410d28f1f64f4a227922a7d4a9e295c4da54ccad9614ebaabc0998a22cd54f749e9c09acf87944b9fcfe703aa5472e9f3f97c3e60cda7ebfca6a2567c69f4e30f217a92e8c717bd10fda39fa9e9b38a4af9d2a8f2a42fa93ce9859456acc83455ca9c56f951e5858c5f2afdf843a83ce94b99486a1c9ff41c57d241544a3ffa4d356d2b324da9e412f72ae3977e88f14b2a25ee495f7ad20bd1bac4e99210293ffe10255de2bef43345d2e3a7e812277a922835ea99fa2ac8751cf74134e73222a95835fdcca5ab77dc68e1c081b136a5f466d66c3a299dbac4b172dd6055137dcf30f6e2c9dadb8b7437fea8838035d5b47df74452dd7b88009a0257941573eb3773286ea6adefe6554ddbff8f23c6eeaaa6cd1e014f5d4ed18f442512e9495a36fe48cf6a9ad3e77457e9aed8434155e36f5b45958620fde847ba34c4f8a31ffdf8248d6988809912e959619c707244f363c631b3a96a539f25bf76becab081bdbdcbfcf4c451330c2f954a4506277bfb6ea0d8dbf6cd63af322cb181af5717a2d86ef6c6cd1b3f95df6c2ff15375242f323cd9db7f4ffc549a7afbcededefe00cf9f30ae10019e1289ca1ff354555dcabca72711ee671022a9a94b42d094e8e716e93bfffed4a5e9bdccf4f7ba396994a33d3f346b7c33fa620b3421326b8fcaa63f6596e772385289724432d1ecf341d1218b372d91258a3767fbcfc823988c3cba8901d2d08c618cd5e218c6882d277de0fb1f25d1593b22eb23b170548999991cbe899002ee1cb20d0cd90c06c6efde0debfb5ec0c854554d4e42a29a76e4903c20973f0fac8e5aae3024b36d917994c21d0a50e981e3001506c4b87c37998350097fb8e1768b95d04565db7879e921458a100880ac3d99edef904dcfe5cdc50fa48a025416cbf29f0a160fe39f0a0f6c8f585cd65c3269564dfe2f78c8a4d86c795006e0fb83357e9a93049fe581c24da4cff0f7bc6a5c80e9b32acaf4fea459e757883562cdffc0a558e3229b9e87ac3d972d995b3249564d2ecec04dfeabed7d09b24637a35635f9f799f488c559cedefc037762cd08e472dd39641bd3bbc8e20e596c916d3c2ff7bceeaca61d624d458deead231612531e758c0daea61d7af4152994e5238164b639649bed5be491136ef2116bc4a23412854a20b15452e970afb25be4b95958e892480b8bca9ea1d5b6aed03997a3555997a02297388507568ab152c4864b1ab14a72146b44624d5993fc2e47ac7244116b4ad119ea127639628d58e32e472cd2164aec8d58624dcd765779113fcd580e46a370d29feaa0a5d69e2bec108d881e4289580f0505cdf6ff7ee0d2cac2300cc3300cc3309c93061876ee07816ab2610012d5c6c78e5988e71030fd50882e15c40f373c76c01410863d703e214a0f302f1417a4c5158b2188aaa88a6e80a26c4e0e55e5e474421fb8b4395415ab4291ed6f994c9495d57b736f84c0bdff7d4d1ada577d6fee8d9585445a1c72dca07160fb4855f4de50958804b8ab3627c7e60421e7c3d0661c47a383301e5328f8039340ea01aa9a267f0e4cd4bd993721d836c785ad93feb3a26c4e35f9e7dc6ccf0142ce9e34c20ef8859606655673049733c7abd536ee769e0c2ee9cca4e1d95c7f804b0b9b342818f60fba7fd04df575cd9616dcb09379ec8029a0078e03be9001318fbd4138f9c37c9a65b8b8d87879e901667e3e14ba6dd475d14dfbf95708947abbbcae1f421d1788bab5ffc218198c022e5199b3084c3a8364fb1731e7130ba33e682151511666732cac1ec120d052c1c26c14268aced82b6c7761d77581aa11b65fd734f9df214c9485591812b6c39cec01a65f5ad87f281412b9ca388a44a21105613c1a853145d49c6de7ac3fb56f3c55eb1a5dd5c4033c2f92571853f575edc0b5e7a4f1815ef781359f21540d634e5fd76e35b5307dafd42bcc4d309bd5e09b2c1fb57e9a7644e1f4a826d8bc99af39271215091df4787fa11ab84ec37981d2050902e4d4b0e09b2c5ae77d2f336ef04bfb03ff0f998b37cacb8c5bfcf2abf1c3081a873d7a99bbc72f51368dedbd763ca02f3da11011bb3eb5a022c62c8a12186514940988f2e7438150c6b87a3c4688b9d3f98192c3b0029f0c8232387fdf11bb7a5d678130df8bc4ae1c77816dc3c0ae9a96016b83ec5aab9016dfa8e6b5d61797dc61a2c632c676f287d152779f34346df311f596f8264b11600ca6db4643cf873fc3181e4e7ab7edc09f77d14789392ec89665ec46d1a0d0ec95f16263bea612d4b3e08a82d115e563f6035c4e988f8adaa169135f0dbde1b6ef7280cb39f351512a72e963ab18a9fc4aa7f25e8e4e73ff79ba64808a3f80cabf932bbf3de8619caeacacacfc48454f2757425fa65b452ef12e432f6337e8b75c12d9a007fd47c16a0497b4b5511e4e3ae839ee5b8c5e8fbefca34c770f3f65fda367f1d34f2d7ec5b37c0e46f8d84474cf7df79b0e154f559e7607f83e97782ba9681d9f7efa9bf72a72f97de809f0bf324303d0fddfbda7b717a950f1dc77b9f47100aa4b2bdb73b9b4f2df732aa515adc3d3a58f4dbb14ef55c858d17b9a88ff154d448be7bcd33276bfb64eb2f8adc5873e8715a0e75ab0189f5bf12c2bf48ffa47fa47ffe9d1b68dfed340ea80dd8db8dff4e8c7d28f461bd7e9721ce591ce3fe6cfdfc34f5997748fdebba7a31fff1be51e3b46de974ab4f4b14bff651f4ff5abf84fe7ed00ffd3499595d7797b955cfef6dccafd7efb7f2755740fe33ad3eda3a23a2a54a8f8e927159f5f4f2755943ef4d3c950a78928bd57d225915d3f2ecf52077acf7bcae512fbd8295e6553d12b9f224f37ade8f26e6e7b8edb72a9f229ff759d260208d07b3fbd5c7a5f01229b86311f97bfaca3db561ea6964a9527fd4a2e87e8d818b0cbd0ab681932f4d4cba587a9a027e572c70e7d4a2e7decd0eff0d3a879386aa6444f5da33046a429de44d96ebb5920748340a14c6b9c043dada928fa02e9e9e4ebe584cc84e1bda3a268abf5f253f7fe54896b1fd5e4f3b5bf0ad29a19c8e00097b4455d2b247e2a6913bb458fd026268db965db4d11c5bf9379b8c9ff86319fff3e79470f3f6d1d8efbfcb7e51e05c09b7b27cbb8c97d789ca767a8c36e6e078f1e78dbb48c05623b0dda7dc3eb0951b0a39afcf1477e1e1ec06e4f5b278d704efbe02eb7696b63b58c9bdc8793ee714ec506301eef5b4771ffd93c621f409fb5614c11e0b62027ddea12dcb6da7bafa6fff158c3188ecbd666dbf410306504ac2eb5661c47addd193d5038e9f531add9e946a973f5abff85d3b3016cabcb8f56575dc448d5e8cda1edba6dae3939b45db5aa554df7e6f8765f7a2a9b25fc92dc3ab8d82e2f365e3756038d9ed16e50feaa6005da44263e99b3e5bbc116c6541be485d330e6abe101eeee686bf5a72bab6edce7fbe869c3e114f73563f16f1863c3fd474320b8fd81aa0d708cf831a9acdbdd5047d769311e8c6bb70b63ac5751680f680dedcb6dbea535b68fa11f4eb5c1f4ad16c6585d6b80a90df2c2f7f631d92a0d382b82d3511e588dc952264e386fec36ef57a3c6e80b4fe253dc8d994f71458c7c2e2fdb133db08a12718a2ef108d362d6f693265fd8fed70b63ec9df914a8eb4c55395955d37a07b4afddde4cddaba7f77d16143f9c22497c6af4a2175ff83de4ab26f963f285317794e70480a89b6d9afdbe9b57ac9a70665c8e8dcb641e5a31fbfeb20d7e2e7f38d514b3e13c332ee7e2d8abcb2fb6abcfa0388d47bbca6baa69e52d6739fecf8c1ff539eec59b8a12bd3f27aba85945a18c3cff8d32bda9a690a6af1960fa2899c6aa0987e2d05935f983a10da59dfd9a6cbf5f4e583b5ad5de87500ed4cd497320025d30687c727b1bccd4554db4d5023d13a5db60a6ac6a9a580bc9605b4304d01a1960fa5db76d537b2a827e3788eb32b74935c45d604fd2be28d461f7e7bfd1e4bcf33d8c7779db5a9efba33f910facbdb66d10d2de905eb05717836d14c66c3bc0656d026e7f91d8f6a7a966abd9141858528d2d35a1a27d15e2e3a872232e2505a439c03ac0e587d365dff6c3f1d30bb0cc4f1bf8db96025e5267737c8761cc87e302fa6436eb843942266675f231f18439be2dbe5a80b7aac130c6d6269a764ba1109ee2f487534dfe95052a9aa3904adafd3e2d7735d471f7dd9ca7853aeeb675582d6b9bfb36f05e4dcb757f1d983dcd0b75dcedfdf7cdaeb3fdde4a2ae0f4d3b6e79355366aff1f8ea6abee68ef9aca0a086adafe1cf4b64599c0fedc863a2c9867ca5f0b6334fde1e06c55733a35bb3d7d5764d8725954e226ff511823be34edc59b928b79e28d97c5d70ac497a8a4c32191c29822e62c866a5189116cbf6af1e5a4fe98d4959fbcf7179588379e37e74c9bb36d35258574156a4f0a63b68af2c0e6ac243fe5b87de922e3c5068a43818fc23386417b7a6a807ed2e87c7969dc175f155565b40648d726f4853fc69f988dc7d3c9bec10c9333f861fd9c1dece46ddfeff29de4fd2f8393bc1f662097bc9d376fe963dfa7b7f3720eeb6bad7dd73bf73d4faf0075587fc50a4b67545445552b3438b1f73a8ce95e873e78dd9eec0345f64306efcf5f08c86ef6f2c7e4e3be9c8df36cfbebed6a166c7f1696b03e8b30467b16a10fbeadcd0b1c7ae41d2c5a8431f55b8431dab7087d701bf0b76cc3fd976d42eebd2aa335ea8abef0f726a4cd3b1c30fdf23f264e3a176b5257b4c65785f9c2ff09fe9c6cffabaf305bdcbf459843db565715e4a07d0abdc2f77c2e8fa1cd0e4c57b0805546ab304dfe5b908561b6fd3bc387335bfc0980e9971f8e6f0e0c9f163617aba80f677e579828f135c59baf0bdbbffe40f71576f9e170310fec0adb5f7c8531e22b0598bef6ce027e38be7d5bee58b40027d6be451863ffab60e73dbddbb3996be2a47f8bcce5505150c12d6f1e28480f4e09dae2ab9aae7d0d277b604b60fba507b61d0af155515c4c7c6dff4f0770e2fb3a70b1eac414c65c5d651e98070a0fce8776b61b5346aa2e01b1bd7dab27306eabc15033591daa0724fb34d9df21d471f7f61f67b30df737734ddce4ef228cd13417a35f72b12dd3dd121ea03219c3121ad8da6f25067c92f65b3e1eb4f7152cc0902804124328a14f08fc425ea7856ca8869c3ea0a3513d5b46ad4ac49d886bdf0340f0cd8d3dba94d1364d02d34d99f81c8067fed0989ffcdd7d864e4380fdb163ea9a77f60ea79d5d4f70a3d5430842135ac549f78a5351f769596538dc0d97ebec72373498bbe1769d2d21b499964ea7b4ce6ef0cc7a6dd5f96098a3ee1f16acb1264e7a95d558d5aa66717c73ae9b4d732ecab93e9aaa065bad45755f5ed098b2c73db2a21dda1e23b869bafb82f6b7815b1637cafeecaf03b78cf7e7815bf6ec0fecec0f04b71cee2f04b70ceeaf036ef9db9f07dcb2b7bf0fc875fbfb7c22287e2030f489be11387e255247fbabd119f629695f6b29b65a756a35bbbde09b4feb6cbbaeb3d9c2449d65c085596c76a7dc4f0e0898d238946a6c38596911b8faf2f20f03c424eb0f4e561d76c8e1ed84b14a4b53632c6fdfd654140b72c5db12b45d4cdfe2c5491823601b309f4bbaffed47bd829aa6e5eb41e264f5bc9cac1ed76ca99e5635d52fe6641db91ffcc4e100513f56515c6ce5b9285c72cb9bf28b67c9fa596417af949414d1899b5efc27ceeaa895b32e8ba82f66599435015b27a49f894e9c0c42b3b93a73d599287332dc9af6c4660b13738b323fbdf8faa213710686312f5e803c3cc8831e5267dc6ccb707169a92d5c4bc6b3857b1ac6601f2e6858006e733acfebae22f8c02ea6a3407f3768892b1412d5ac56ccea8f5a15351abdc6f1d4a07ce96728848b4c5653ad9ea66ddc67359571d43e8ebb1d68d2218bac1afc99c12a57ccdad11137d5510b84b1f8285a8f5ad5545bbbc67060d7795f68aa9bcc1e5735d5bf9e1810baf0fbc0b0c3714ceaeb503f872c725798f5399c141faa3c3964f6b45c1e9cce6f5994b5c8e24c94b9aafefa226bd2d03caff2331442948932fb9972d69e63b2bd6f91bfd847b3bf2f4519a6c1331e590c63b0e6db6912c67c320fe80377ff514c67ed7cb10fffc0f767a8b5271603ce7e0b97395918e6f0ed8911c1c3fddd9a76bfac3b852ec515ecfa2bb9c4f5554aa4fc83a6e4b2ce76f98d728955bbbea87e28976210767d502eeb925d7251ecfae2a855621a1106bbbe47366ae19912d7f26b82f3e1bcd8a8256a8994beb77991dbe7bdf7095c8e28176ef2bfb7f33ed07ec5d11d9b988b93d707174efa0bf8f269ef5d42786ad3b7acb15d5ad776d285cbb53376e6be367bf3515c657bc57160aa9dd66f7d93a504a964589b8bb0ab1d6697fc5201ece2524db5f32f74875fdfce80de7ea9b23da1b76fe9099f3e6f1fa4270d45e42a1470e8838cf061bcb44e84f985fb62f07f9f8c694abcda9e2adbdae3ffb48c71c6334fc0da97786663259cace0178195b01608a12ccc78c6c96f871aa4992d756e3c8395c0341ad6146bf96e8bf216450fa9b294918f2e0161ab6c5b1721e9640d4dea9d90d5b430260cb55b006e877fb5b7395b9803dc4b64f0a6647b77e5e40d170ad1a5409a164afe7aefd540f5765d67c1cef33c4fae1b258334e08ac6c91d78dff7c960dff851f25d55537d71c5035c6b8957777599b835df5de1073f0f86311f6bf1db5c44cdf1207162d717513448534df593c12532b872b23e18c6600dd23859419a8ee7615cf3685aed80200de8ddd5aedfe5d2de4ce3e227aeda95dbd5b620d5104aa47228b15bab136aad15a8e0d6b45d626dad770740800001020408102040800001020408107f204080000102048807f3601ecc8379300fe6c13c18100fe6c13c9807f3601ecc8301f1601ecc8379300fe6c18078300fe6c13c980703e2c13c9807f360403c9807f360403c9807f3609aa6e522405bb3745c3149fb749ede5a5d1601da7809d63472c53ced30c92dd7dd6519455e7c86ff0e735aeb9a26c34f3633d7c5c508ba6d385d9980e97f9ce5b8da11b99ba65d4d03a58c6cba0484d5b6ba563528be4f5b626faa12df9fa6fbd31af47d5f82fed35a28a44bcf6ba0a78f43e2cf5abaec0ffcef3bddbdf81dd17f8fc5f71775590418d29deddea3cb224097ddbde6f9f069e80311a1b7dba38910754977e73dafbda6491d1b3cd232be431f7e09d2bab4daa61d4d84f821109e52a4657c83baf3a2262214d2f407dd77beefab97ef7fb9fe47b5d017fabc0f85b275d2d394082a0ab243ef65cffb5048f4330cfd115aa37ea7a3bff70ef0ed8ffe47e94761ea372a8950fa7959f4a17c7549f7157d7d7a44247aeaf2537dd1572a13e51a0ad5d27b19dfd4657f32f6076efa5e28d3ed618c477f405f78df65ed3d361f5c5128efe077b2e7c319e53bd983f27da1d097652c0d7d08dfa3ad0d7e31db7c3ecc2879ba0985fecc7f9d6cf3a77dd7c99e0773f83477747ffb6619bbe90f688db9a96b7f25d2a99e21b846dd3519bb29f56c9db49a3e4cad1aa55bb0d3da0b72d26bd5b49a65ecae9543811cdffba39f6afdac2e65ecaeb566964ebf766bad9a2e0171bf7ebd1a7492bb5ad5f474723a395d3ab733f8e62435ab594b37114b29f095e6cf5dca417dd34d3d30da24ad9d76fac9ab7debead06cfa9f863369803f8b18f1befbcf690dedfef6f36b8d95f766ba370c649f64edfc67a7fbfe3a610d63b49fa92f53cd83854274a94d7b35065508987de3dc86319f0df71df7f5a6a2b899999b4db7b784f9c26bc2243d284c2a6cfadc4c456961d3a71e1836a5cfddcc16fa36d34d003cbff46e36fdefda9ff5b5cde9a66ddbcc1dab3b349ab6e5e09b3f594a3ab37be6ec1f96ba46c2499ae31403aa7b71092a62e6e05b955cd035b0d6b7b9a41b2862e66c7b3b5b3bc1cd3fecbe20be3367e64c57551e7c9365db32be0e874ac49da2e09b2c259e9ebab934539eda81e97bcadd8578e011f865ce5847e0d25721d16824956ef78547608fb96c9633675dd59acaaaadfad2582c168bc562bdbcbcbcbccccbad801e9068b495bebcbce8104965a3b2598eb3bce52e7ff98dc356abd56ab55ab1582c168be563465a51c1f2555db1582c168bc54aa102cc54456756abd56ab55a5d8cc7f19f245da88bbe268dad56abd56ab5a2b1588cc6688cc6b2065d66a4ec63230e865d8cc7f19f7c51cdd0ac6a5830180cf6e4eaba5e6d2b6d555747e0d2612ce49e73ce1c86c7abcb7f92ac5e9150676645752c68eeac33b3050998c5eda810357809717189c931802794ec940d01f40043a3c65b6d095dc24f01787b8bbcf8d205cbe9edabdc90f1e227944b4c25068c1c3774aa95123f81ac27e609c4c1aa045b4bb67764b7c8cdcd0d7e99110386471b5d2d974b460c18485c3070c9880103890b06ae255634a39923ae4f6be719cf65b166554dde328e2da592976e66649a4acd70b5685c485eae564c1ed18c6670e4900329cac4987823be4497d8126b445676e1229b70131db02ae69139b9c30e3be470b55cae5845cd608d5c3890bc545c2d970c4fe8f341115da21618934baa9c162d3e1cd80a072b582bfca6c928e66ab95c485e2aae968c1e66543351ce8a15cf728405ece55ebf41e272b95a2e1792978aabe592915d62e4c825554c26e50c20936630dc900276d3834a942313cd66cbc88503152c15aed583f24df7de7977e391c562fa79f0c4622eae96cb25236bdf439ef103c82ecfe57044339a11e58c543070c04a01212189ad2ae2bcb2e8aaa652a9d4a9b67f2a8f623b8f7060f2e8b55a59592179a9b85a2e1757cbe572c5c83638724a2a1c22d1bb87e4c371d918b570884a40b1d1eb26140ab964c0882143068c1837b2f62fb993e2f286f2d351626b868b0b003a954b00b964239372aaa94626c1f0dc549427e6261c84acb0e384e7cb8eac3b752a2747aed68cf72fa93ecf83d86a75aa8a1ab95c9dcae56abde4195f23868c2cb66864520e8c23ee6a8d489c64b2bf2f3bb211cecb490741076f66e891cbe56ab95cad18d966c6bf64b10523db786e30f69bed7f6a55d4c8e56ab95aae966b868c183090b85c3262c040e272c988010389cb05c305002e2f72897968c92e725997b083275692264f4c9c8d3eb0fd5bb84a92456c957509b9056a6d7f15ad91cbd5125b2e29626ba401910bb4cb91cb45697639728d33dbb12736828d2dd219b63f38729133bb1cb95a62ebe54478e8dcd8c011c4104455f489a36c4e14499224c142132556754eb877475eaf17eb9bff393867d594020157d453fc3bc0f32b9ddeb13fe77c5f955adb8b506a04b6dc53eb2a96779ff1137048b67d2e08f3e434dcaba25ede06e0ed73ae49e3e4ab9a966aa2b416122a936dbf56619eb4978cb733debe78ebf216f536c6db96b75f71260d1ede6a372e15a5c3dbff89bad63e9d340040be8b1ddeb2f88c1130f7a5ab8af88c939e43656bff51af56f3713b50cbdc6fb988911c5adc999f609e6e1a26e9afb52a0aa4a9a6979fc09ad790304fa00c26d9dafe3756519e57ecfbb84c7291698ce2e0d05947e629b413dad09b6adae1d1c60d6fa20f1742191571d26746aa1da29c390327594e7a47864833534d9e239be5cf278be267ca343523d357b5a12ecd9467aaa42a02a60f8213ac1d9115825c4679c923952807868aca8a8823c24497d81259628d4823ae44ffa2149e19cc83a34205ada9a615e88189abd2eb0f43215a9445411e0ffe84be8f27f4f9a088223c939148decd2b671693d9d247248aa0d008f4a0f24895338bc9c6f1535e2eee1547a1906834929d0064d2ec259364a79b863b03bd5ca82c72c9a2990c2746130a895c359d0ecc83e3333cb0d1aff8190ae18179601a4ba64b04a7fca8c4ab36c6558e3a453310240000a314003028180e8885c3d1681c079ab81e14800e87a44c7a5e9d685192a39041c8184380000000008008888c040d00067945796ba5ebcd97a38f709e31de7f250907516cc50d677496d104e1132bc5245f747ab1f9e7b9ef36efa6072f989bef7713ecc02191700d9e51e96822b22b287f5cca5965bdcaa916de2f3b1ea369884ef095613ca8dd8736253f2aaa6de750f940ebf38c6de988885a3820e7fe6f23f28549a1e7fcc76d32fbb55cd70a2c43e58b9a2390e5e14b30706c2ed5c270970e07c699e99b8780a87038484e49c5545707b867c1143089b06cc915e139e479dd07a62d2deb539823b57544df68b217271dea69fadd3e9af95bd70082c24205f5214385571b101421f3c69b25a85246f1615413e2fcb804eb1225cc372be21013810979bd9a1291ea1d7f8f9cacacce403b8f9b0c0f301a8a2e194a1d2d933db5ad35e01d8703b182e43470eca02195560490ef5f40606043854ae771a278ba31ec033a3485d31c66b0856676fd2af0671d4bd075134be415c12ee4d72836b1fcd9a8499cda48ec2f95e11af89633cec88563784081666195a41f6ccd7bbd0db0d128f2ddcbb44ea50d5e176eeff133448e35bb5f34c2f33fc1203fd64e22c920cfec0b6461c5f38aba4e95443cc947a9a84119b6e2b64a356fd908980e07b271438c9eeb96cd2439e1097fb80e71dc4efd6b6177fac3a9eaa3587ab4df5f09e48efb5184e2c37d8c1d63229f9e42836fa0ea89d5a830a02a49a775893178533738034a630e930bf43581e7c5b5c52105c5330a3e0f6a41ea5c87e70ece4cee90d7901fd25ef8ddadb9ad67e4b1f6b5837f1f4fcdddd38f114fb57b3759644d9f4c046d51f0c4f9d1892b8a0dd765e8299b22839f9fd3510fa41fab491113474eb4f989d312912e280eb7bc6d23caa39e14f56050d80071be24ee885c143bd4a18177722fced5174a652a623c8fdbfa56ff24d83ef0fab8d04887f2c03755031298b1a2fb9622ba09582f94a28ce561c0d09f8d8bae60cd855ac646c1295df3262e0fb56b8d771e2c7819b895c9e2ee957fa2754446655a9d2bdc7ba5e8288c37a214ea3a329eb0d8141565a6e239c45822ae8d7d1f6c4bbd50920d0172d0c2bdca1c8d0f80dca6c09d48c1f701eb4e4fbd74924437ba8df743f291c74fb80e8bad905614493e2a39c7ec2e4fefdfe825d2b8d21a75014f497e2df0e1f0a0b60898830589141d935cea475f19567df3b1e55c9abe6abcb8b5e3d3cbc6b41ab71c1cfa585a2ce148e68826a160298ee4cfe9ab234c5a084d3426e9447f084a0ef3b827ee4e2a74eb60924d4af34cd5c006ddfa1ecf1d190520e54d88d6fa8f2509d2e9b9a41a66c8642bf19b43752d8cbcc9559cc37adc716b09e46aa3e9c7f32341854cfa5fa668448bcde07023c165d4569050bbab030688e50f780b174550613be881360805e2363f1f1c27c16efcb113943dd523261e0c9b7a33076530fcb6fba92ef8570a8d4a50b992c0cc8fc6957e2798c8833f206793224dd1959017280651951ad7ecc6dc864456cd927ce526aa4dd2d31c98fdc513ccbf6cf614af5ad3bc25f3dd2314b1f1a139c45f872a2a1a9a90902ddbbc5dc3d102d09100c22047db8262ca5266ebf0078495ff483d5184481b1d86a447cd49ef0df8f0f383292816e572af57f8bb2381b5881aa9a81b662616fb0a2650d00e20bb74c3203b800dd270242cae60bca672e36345f21d61a34ada74150d943971198cd1122b61a425db880c311728e60fdf76abdbaef4c3dbf10abc0ff38a608d8e669f1f59a048757148219ff77a1fdee3f415fad667e43a8fd67d2ab90edf3dad819478066989fc9349ec9c057e441558c21abf783ae77ace8bb10fc9e98f0ac7a50b97e98d76729678e078b7e369c9b5041f9754c71234c66af242e9dc73659c2c2085ddbd7a91c487a59296803369931a2564ddb21f6b240bfcd4b5ebd2c6a4f6b5001de5dc721cfd286171d7ee5d84ef7874919a257b1538d350b1a6d750b9fb55a096bca0f4e6c9ef8358d6906eea2a5d103287d69ba452b941f1c0a4487bca8a8e09d1309476a55255eb5982f4297d380809be4ea4fb21fcbe86e85141052b029148d21ef10f7181f3874ee1b7ebc83ea48b879906f881e38d8207e44c07b5c26990d464d2ab8a26f7821a4191e13d5dd261bb000822ada066c3a16bd7c9de5c5ff15e11ede3d860ac86cb73e6d1dd6989f0094a18ab3124bdff84738720b2b2e02956759da66b51bd3beb7eaa641880d7b5dc05ddc187fb06780b4beb02d08a35586befa384ab1765f54129e1e10342cdadf2380fc0cd794fbedba08c5e00f50e7b0da249e81c1b27f50fbfadbc0fe01692daca133c8aef6a9ddc79bd394778728bb620b56da828dc7bc9bca407ae429e620811ed7dbad1e40d6af5cf49c4bc8fd001023dcf0d11c4108e7acc3d262433b137cc9379795cf36d62256008fde5e46869048887ae2c1941050c27bfce1f96c17b1883ed398d3a5529bdfec1b2dd29c967c05d109f32586266da86019bf5cd7cca896fda9295925846b96d54f365c2032212dcf9b12e757e75f1f5ecb0c2711d3b10042e70cf5d3cda53562b8658626f5b38422a30334af2252244e4fa675cebd95e68b041c6cbfdc3f81b5c81ddc89f1eea65f9701e59cb45572e1f49ce6d2ad216d89a578fb45ec03475a8bc25f20919f0e772c33d598412edbcdc085c703bedf7d2795414ddaf92c80029271f4fae57fd93f3baa8dd4d31e98f481fecc7a7458efd8248a4fa9dfadb17722d5935625a07fbdbbb5de80fa8a9f71218ea44c27dd08a93a7b2d6c74da8145ef70c4ebee7ac140679c15db625b9d48e33abf86cf8af6c473943e8ac5a085640b57619a2562192facb5be594919b41dc0893fe2ea9709b45b154fa05cd46de589f9489e29806d71d2266e14912b1e3e4a3a3d2aae7a64af4c3fe8f35ce81b0ff0fd447bcde880c60a2b2e6ee76c5e8f68b65eeb4b2d80b35df946b2ac7c63631c691786c546297833a171823e728c78e2972d1a9a6630b7188a39b853c534791cf31195e67602ce85812c632c272b78c7fe138be5f516599d6b6a43bc7d0924e9d4a85ecd852052ff6989b69fba2da3949bf3b25d15d96c782c86f17422768dd01f2b9ba44fbfdb7cf6eb18b8ac8a401aafacf183b472eb8e9b05b8e5eb865d4e937d95638e09665a7d73d864a8da2db318a521cc1542889d2e7011b75a6f46a3b877aed5d1c7a3aecbbdddefb31e33aadb3a4a5b61d423ac436a5d1f2591dbf4d2a4917990bf1a34e6277d20fa6a77fd2133d9bebec5f2f319bebec5f5e609beb506fba1166739d8d9ae0d089f6d3ab98f5baf6d3ab98f5ba7437895359aecdc4cb92277ab6d7d9bd5e6236d7d9df54064ce5eb78b54b3cd1f6f42a765dd7f6c6ae62576b9910a0e489deed3adb3b5bc46ead32e9d7e189f6d7bb628a6fc7a3d6bdd053f9aab396ec4ccb9ef539f47aedb0e060cfb79e613728a3f13c4a90c633b6e83b477cf07e682a7c7858c59f7d1f2e471c8c5930cc0aedd9cdeeb1b2d573e4858a8e0ecb67f9bffcb98aefb37e094c4c9465e369e91fe4f98acadd4542d740ba7e29049c4081f9d2d4dc1ee5839fe082fa27042c4395bcd94701d02578d97d58890f47882411204ecc3993fed224a0f994c9ecc7e810379fda345de2aef119c1f65acb3623e86ff9a3d89a2079ff0dbe261d31fe0ed79608730e00651b0026bb7d20f10642d158ac5f200f0870e948081edc40adb5b96a03fcb32fe64e97e8a364d26df37bf388053c6b307ec8e2df276e8b44371841e8d3e08bb27d00d0e59b2b82239eaf2114014a24630c05732e9ed6b8d9198bb4b6cdc370446c3aa62b5199b234a660fc4abe2b29df22f55b6b2515ec95dc4a174e05609f6b3a51ba1445e1e0798321c822ef96acd92c9a7e5a90e2298407dd163520a591915b4ad8adbb74120b2faa747f3d97d24bd9853763d5aadba04e15885b5c2aa57162aa2ecadab1557274a63ee6f051c1ddf0d1ebf3b6e4a6d1d0d3409bed14a1ab7e6d895e87f0317945b509a6b810fa671014b09e3e6c7937ac4a592c68ba0da620e8ce4a525406f51f4279391b64a0048e41bd882b697b59e756e8166033c0452efbfdf99c3a51aaa203c1c21405b34541c83d44f6e5109b092d0ab4a18d64b299fb5131e5b047bb8ba9dd5f2986008a16cb15ae824a86cc8b778c6d3d599995f7b1bda39bd96a85f8cfdccfb8097742370f511857c960d0ac418d97139a4124d1ec3e74c07dde849e2afb1004d48a00a57ef7df88fea225a520eed4a7b05fe3533c46e986f7a6ef5a4474ad3c4401182f26babdcacd176c1ebc904f41cc6098087352ef158b0267674074d7996f51e069fb1a61b0ee23c2d08615553398b7ee518d30a7de36c939b451510d8e385812d5f2750ecab4f77a994140b14ddee6312eb08c3bd49345982c0e89239711201f384cd062b4f16189d83680e88a3a6855f2007b91e015955b580ac9317e1b509afbc0fdbd1e1fd7465cecde046c654dca5b844ac9e466db782474972e87199b99dc5054c329ad2524ca82e66b40bb36795f465d08197aac5d427dae50602c71a8de2576506cd809d3a18fb9981c3297a221e5fb2e84e2f320de718c20cb7127a54f6cfacb18f98691732405cfd86443d76d119501e56833e14583f9cf59b628f20a7e110b6f1b14b71b9d2231a6160f7cdeae01f92dcc9cc58d7fbd47840f8e28deb4c809e201766c9b1dbb03b5d2e4888aa7a855021c070fce2c3ca2baf539788ca1ccc490c8f62b0a74b50a14983aaef02198406622db5c3fbf0ba4e35c234448143da7d1b1bfbacc09fc19ae368d8b79d0e589c8edba967f2586201d99f6a78519c2c4d7960fcff1439b2de4fa6ca94bfd844c63b09cc70b3cef77c369d95754efcc53cdf9a2af2d318c8d809ed2f65ec4083d7e82299f1eda54d55f4eff62e5437ebd97eaba2d159b95929ad0e90845e615229ca344b9722363d725109003cec04a44a13c86f5ac54b49bc8900787efaacd76725ec594f2c072b33323ba53edd066d399f78492e0129066930752d83647f4650b8cdcc15142cb7b028ae2c01342fc371928d26064dd790045069533a504c3d1a79e8d1e00ea838b7b0e3d34b8620a57c8e99c8e64a83b3f5d4ee76ebb4a6884c882a6c305c2c72bd1a84c134c9ceae0182b07b71bf0e22cad88cc93a1145830413cdb8a3eae104e306e52ff685bc54d4310a305cd54110afbff01d3d8fa5ed74d85f17b5c00cb535b754501c7673d221bff411b5abd7547b5252cb73fd0f3b8ea76cbb834e82d0819a51ec14a4ac10ce4639b92272c7cdab8d4a8fce109ed4122d0be2b267c9f9bb12c16b7ee6f0ce88806a2f26ad088d1b77418774462dc380a3c5b2c6d1c7e7e08fdc3e9ac59968f8924a15c730b44f178acfa94c17b330009aee81c43126eaa2d48acca24c953017a3f526885ce16d22fb8a01d4be8de8c673aae673a0871bddd11431c87138e96ebb345d2956bc19d577f6d4012335d7d31915aa937aaa0de8807059e6f3059717a6b710048d2460e9b0ea9fb51d7407c291f87d258ba1aa2ecfc3eca04fe6140f141a580c6a35f33867308e91c93ba451b4e8152fcef71acebf070364a0c8d296b67b6224119372eea10cf96555dc2a0bb057aa7e2e0c162ba822d51102534782cb36f3266f65d47345f782f8955a7ccd0e72a3fcf3e2c62ff5c027e6331e743ecf19249371d5062aafe0b46e05589342dff4db0100b84142705c2169b3b6dd1fe7ef5924fe186d71b97aeae57e6ac635b2ba3fc830557ce45ae59135d5d93f555035ebf467a4523ccb9171d90b9e5896f61b4933ad9d778ef00ed32b8893fbdc59d95bbed72775da69bbf16cd62ffbddafffa1ba8fd999a7f45ec3f291ffaf8bad8318cc7bfdec059719ba70f1305e543aee0a9ca8ac36a4c00dcd801ba11acb591b01ea28827b4a8ebc0754f036854b62afed97b9299cd3199a6abbe2ecbcb4c3b5968b7d9bcaeba4703943292706f9df61222365c48cf57c0fafee0093181eceb7132accb6e2aa28473e3df63e67cb859f2cdb3c0abd08cb7367dc22ff174613e958654e95239e8eb1fddd434f7ba6ae254ce3caa9ac95eaf4a258466cbd8f735475754af485cabcee6cfa6505dba55d56acc9c48df7a428644ff6b9b98bad8bf56ccaafc8053eff5b28dbf86bb7a2abc7c29d3eb7c29af24fa522215fabe31b52f154cebbe548ecc0afa6f52d7b4baf7768c1ad25ec6504fe4b5656aa21a35aaa986352160eb63eb25b75aed6e97dda7fb33b7f61d1fb2988009040e345b493ff90036297b151afd4714be293aa2e613ad11155f1946547c119ea742da5c3b894e28ad0694ed2241e692d5df550c31780d1e0e2b9fc4d3593e951d55ac52bb71f9e4f5e3e5932c1df7452aef52dd4262041445bd2555f2583b82e7b4618ad56c690db4382d14532573ce3438ba26ce393835d6d2a9b2ca539dab0fd8bfe171cb9cfcffc7fffcdffffd9fe21ac6ac6be0bb02c91a58869c54bb1a680cf0b3637c5ed62c9b2c1c2ab3ec39eb18c126807ef5eead62d38602eb23b181e98f1739e96d4503f5a36de0a99f6efa1d194dcb40db4c34d52ae67828d36ca20bd929cb30228abbf4d5b15af9596640b35721f23316b360b3ee3233b1e61ad5587368a05ca338a0517f375ad5eb927c6e4fa66b02658ecc7ce64a4c16d35d9b6379a9ef5e2b2db6b6c1c0d01494c744252f2ba8e99dd2e8a5251ec59b8d67f6951ee3a355d58590ed665345683e0a0197281f881308df231a1ca5e18e5ab554feb1a072ef3eb86b30988b42ac6b5500a6a776c24da91794c3d909fe033029fb09cfe8d8a05e97b2d2f09d92e69ec45a4236cd6d8a74d280556798c9960f7645e1d52b5b44382e0a3f8d3873b4d53135a9a24098392695f98b89de0cadf96122f6e2f26e50f546699c2a5e29fc1227ea559a2f647eac81ea0399fc0c54aa1511e5698100d1fa91d58d0bb52f1bcb55be40a75fa91d3bd232260f69950a87647574199053180d9c109403314e34187042a34b28fab7b4be0617347bc4d6eeb66e18fee8a4d571a1882b2cfbcbbe2544782999c436054350ddeeb25c724a911efa5310c83116f4d14ea063c1dde50f0a2ba54226d35a8044bdf69c918f320312f26fffa13229daa48bc7e62937ba74659ea94b12c1d8c9d055d63956d444457625507a551cd4a2e6fdf920979202e5e9a9a45d7954715c9b8f566c8dcb2e0833c9c5b59dfa8572ed22204b203c9824e25af31e59ae932ee3e13a7e8383c8c6518ffb87b205bf8e60c0683e47d4a2aa572c881d527468679923af6436688ade7abcbaac6f93ba0e0793ac31d19d9f855323bd7c7b9e5f9c4bdb87c33b0116f578d78b78ea69277823190a55cc9a997ff483ee44b652dc290eaa51606ca40967da7cc6161d376a17964caf6642243f36cc6509794dd7ef9306b2c3c62bd834f2ee2cc509d91aff63fca91643bf6004a079d99fe6f65776e17b58aba88b703666af383f7aa4f51c6cf747e8c8af617dd7289ff8b30d6a64c6305cb51ca92f2dd51e96abeedf5a65574cbe4465d5d3916b5c8880ec8fc3b300716349cf8e86590eaba3c117dd758919a5c69e98c46606203e4689c2304df9adf48ad98b0b10219cf1dcd299f314b67b72e85b555eb59aaccaae862166b684496fd429998db0978d6fd5f0acad1d332df51e45e0a524049bdec140963e28d5986ac0317a1d6568353c7a43c29b62c4f25059df217ad01b1d081d6f2c7c9f5809e84ea4568569ffd5241380649b32c4b6fff69e567fa70a83a2b078932d673475395b85fa72b1063b79d03d108ea04e2090274e750cee369868e44ae14ad4f6aa468d952abbdf25b0e16c0a56cebd09b9e203fe607e3136e877c83e77eb4ade0d7089a4a2afc6dd3c6cad34fd006e72e0db3f54f0034af37190ac8810b99665bcd08315ee1ed69cfd85c9ff971e77c13a6ed799021760cf002ef3d6a9b95d58c612c03ffdfcc161e96672c0a70581e34cdc22ec7034d2013ed2cb6ee0d2532d98371b9780b5041e3882727deafb39d1bdbdcc8fe658052bb658b1f21fc8cbe0f824f594c7b415b50d2a679a016253933b37e496e0febf7f1ceafc59082abd63ffcac3f852c66e5e197dedfde250eaf95e109fa6fd100bfc948f0bb0b48182903083d785d338c06f43fd79a0a8a2c0233007f0aacd7295c255be3e233ef7fe63d4a06a0a36e1aad2eef60e76aaaecb89f41b96ecf6ac1ab9d89b581e5adbbf3792b26126a21bc959a811f14d60b7f9a91530f0811edf2608df6cadd3debc07122a009d79862a36436285ca093d02be83186a43f4ae544c20a3d68e21e09983e849f736d1dfe198ed75cc57bd8a80278bcf9efd5dc99ec95d4408bbef4c7f5f20aada7709ff3bd322bc3fafd3fa3b2f18cd4b92ffcefcfcddac2bc2c3dec346087afd3b0908bc8f2f785509cd0b9ee67e9b9aa3c8d0fc8d38b0a402f7089ed1f97bfc6e5b5e64fe3dfcae29c4df1999ce34f1142f0c927fbbf57be8f8e4d3a657ab5e63f4ca476f520faf26f627f745efafd8f0dfddc26186caf3c04b723ded028a1fafdf732d7f8c5ee3a367a222ef4574806cdff755c4a6d8159cdfd2944f4874453272b30a7ecdfd19a76cf0bd126343b13849d4cbe2f839f484e16b91421938a68c8614445b313fe945745881f0493aec5a50474a8a6cf1be61939ceb9cd692d220793b5fa15e5dbfd75218821265571a718a96407e075ec9fac895e2879ca09fef5b5ae021c828f4f6adada0f2a76c844f23c6ff082302db4fab007a13c9a895f48464a846a1148cccaa239fad38b605fabe86d7df91bce0e0eac36e49d7071d921e0875052f14f6589e016106d8b7bccb990ac93ce97303ff34deb187de6336dab694518724a675618e150540f5018259d4ecfe12a18a5ec2e18adc239067bc73313453af117d268d248e6c5267e9b4ad25e69cabe1f1952f7b67d9c85980b68df3275b9fe56188fb8ecff2bbb4d885e14f282b6c48980e997c807ad984e6ff9d4732d6b8cadebf84b7e82166b82203cae6793b57b88319ba912099ba371e50eb381e5d26b633d2e14252d153c09a632043e8c73dff66a3d2d6cbd226c3b61ecd1855d47c922a759552026c97016c32a001507989e16f6f4ffd2bcd27d19cfe645c630258c8cd96f4b0e8f7e0effb94ea700e267074e599b0f6c8ead6b97973cfe9362cc700111ff5c9a84da2ec1535615371301067f1a8621532b9f60fc9cd13631c80dd427daaedf8ab48a6fb6f5bed8d91f992acbca6b0edb69e2d71a77538163037d7f9e0ddeae8605cdbd91a6776f3e73a4c78a2356183f2edd217bb380eec57a45699c8d72a0d489e4ce544e3970290f4c63b4f74e944123e1838f4112936480999014be003f3ae9b76813fa46a54434b49cda3a593ccd1a18c1ba12bc571ccd24fdfe2ae0a52eb6e7ea95e6ff105f355b30fe50eaa02bf44659fbc8a97ec09b7987bbceaa8732a9a9b834556692845b429acd05ceab8011b7f65c349793302411915886ff564043a7418d7684b1aa49cd7d708f519e31a236d263c70fa1b6867fc00997be30cb180fc98bb917ed9a873c7cd13ba0c3a5fdf5a570a0336b421d7f00040878bc32d522a76bf5f62442a4c32a07bcc808516853d71bd4ead568d966593caa51aa9ed2113b91e6b81fa82c69fb133a7d31089614712b76a5223c64c9e7aaca82acbee4776416316ad9c9615949c8a50a4911890cda41fd3a0de6dadb2a1871ab0633d8065369283f9b6be2e309fa8a3bd3c62352f2234e3b55a5155eab0207e8f411ca9da8a0179c8f9a0c4d6d23cc4fb74f4689b7311f4b43a3607b4ec3f05193d2cf6696c5646c45e2c86f46b22ffa03ed2a05cf7c76cd79ad87bb83db219f4757b6719de9ebb1a8efda3e2b8b297172340ec99697ebd0796df6bcb3b62af6aec64e1a44c5accf8d4366d2f9cb65b671ab56eb011b65ad0395e43c47de4b180d5f5a0f6aaa54fd15ca28eda9cb7398cfdf0673d5a62741a13c31daafab3ce043a424446db41a3d32932633d29be6c2126d7cacbec0d3026a3a14761bda20bb27b57844b70b84e939741b2977397f71cc6b8c6046e59211b2c387b71166f8f6789d8687cd2979880d72f5ea6b5d7ec4684b1f689f2a7405181ca5c09502f20894348f80545da73554b1bb102cd2be41858246f45608a14a2fffe76fdba7c276ce23bcbcada72cd97ada66db6cc6a138741d89051ace609d9a46ce10e499ffd2cf38edcacfe28a62d91180521b9ddea46527cc61481a47ff086fa49f19aa5eb894f82a89af8915233d5c3b1ac1fe31ae5bbfd38a79639d245c0da15998a9667ed874f1956ee8ff2d4cf5fc44a402fae19229008cbf4488297a31a46e007acd7fb3ca88de2614977ecf88a271430f87a29ebf5bd0f996f514ed5fb48970cda40cd1b33690a5c901fb727fef3fd1d8735899330c5be635bcafaafb6dfaf2f064c690431851acfdf73df1bdc09ce941cbb3f5afd054a15163aa1debb8c574cb23a7d84b03e1fde7e1619ade6769db75f3c8fd6872554eecc36b4996de80a6acbb0f75cf97076e974d024f51f0c893ea63c18dc778241d45b88a57f620c32cbdb2e52a3cd78302a2e9f6cf644b059b9db8a70e806f8acaee3b47182e8e815e9ebd20bd68cafc17fc9529e32dba5b65f94f25b98514feaff497b8363461ddfe56a30561549769de8d0cf1468d4a990c3704435b5d0ff992310b2e5a1fd3959963760d1ad2b22208a7bbd23faf91e871fd628af5e758d4246e5c00299917abe978148a5979d096fa3a8a2b446f14582145a16935ef22008f4cfd0b63c7182e6fd6807710c87a378c5c636236190df7e33c9b19da82ccf9278c946ebff445972491a18c52dcb06cb941a20c6d1a14dccd796ddea44eee42ca55989f6067787fa8ecd0a09cacfd29dd9a9b50408fa7b09dfa6dd7583aeacae475cb501ff8592411a3b9a3c600b8f54c9a84a9f4a6627d4fea0aa382d66953ba7e15d976faf437e02996becd0c67312d1a6053a8ccc74f989365ea310e4350c77e40b2b26b423b9e9b1f53510f7caa8f0d34e5acfffa76d2aea185b139cdf67227c02364fcfc9eb99de9b94bc260be25b7fd11fa9e8bf8001f985e32398453244b35b8a49a316f2f9ad844a8dba5368072e650c0e4a776f4a837943c4cdafe7f38acb796c418c95b39705530e4261fcd3628e07864ccf8e55712910201eb86054a3151e83f7d2d444f71c6fc8c5097d0a10fb9c69c8d50384b91863465c4a15a646a82b097dd278dee0c7a87e34f4dec56013993c0b376992cf504637798f3e5d9dfa0703deb4ab4015ff064fd065fcbc1a4f39f124f06e8f15920c91c1e7489a4e2f731994931191eae16dc55c4daef25d53d50b0e70a2c864ae36dfda104a2de65681811aff0a3f2c74cd71ea777044449ebaca8abcc7f420b76b42737a290a299d4a40b6ac233a0402a22c0ab2d776f4cbd215fea52b2fc4565177c9a08bac20b3e0bf1837f2a3940d5991a772fea5e282352e81f025c452b3bda71c7c7e9febeb623b260482808745bc524b8c33e53aab1df560451d1dfec92b1d1a6835c65316c17bfa3a430e50859072e7fd51c57731702911b3358c06a0efdc5d8d59a513f265f0bb6ea886da4f624e070d2c008eaac18df249f211958c85f3ab7f6876b9b6d0ed1838ed3a097318047924134dd96b208b3bd490fcd6629cce495179365b596f5b38ba931795ea98d9d93b9da5e67ac1502d46c0f889971d2222b31322b41e5a3b7f12970aa388a0f2bc2f04958821984792e80d3813a4aa3781610817851b7afd9c1fd59c909a5e6b2932c5bd1c570ffa5df2ce645a08aaa067df4fe4e862c6648bce0dfd95ee582099a6cae8e18a1ba4a11058d5aafb306dc9b203146312e6271d77000fb5a891966945ef269f17cb84726c2bdc0267101d76f6c03f0badc94240fb0ba547247957407a9d9590fd7d24b311575591eceac5852cff9d64cca5294ac5840bc71918cbd08925e1ceb3d902b6bead2cb747d560cb6f6ec08b5e5c03e8db28abe331ccf50b05c485142d0c353844529dd1dacd44a105fe60369bdabda94b962d4f96070c27098b4b74dc01d2bc8ad55b81186baa06b3aadcec33c06d9bf0cd950dfbd690e3afbbf8bb8d100549c76ea324987cc321203c5785dc30220ee2047485ae2d63be18aec213e477730fde0d897e310504d5a6525182a8e2c942739e17e905bb73ef2a8e2b921cdfaf93e8af081486e83a69c92084f33f8b77714446630518dbd1af725a6f5eee378b3fb08130ae236ef2f8fc9865813f19176c86897f4f5b5a0cb710e3c87efb94e80d9eebe5566c2b9bf8d269fab7d7352f4461d8764a308762ab8cc467476ba11f116f818b95334da4aaf1a529007372cc7f9629a37438449d9b546c7d2659e0e162e2859b732965e6676b5e5558262ae1a1c2cb1c1210379c5ea6e1044a8842574616fe3cc9798da9f5e355fb7feb55e4869e14068dadf7372dbff85cadf7f271cf36475efe0a6e1a160f0667752363bdf61abce5268e0fa711329690f7271e97bcec5d427dadd4924070a2bd79111a1b1aba41eda521d028c2f6a0c44ead0c6c8b7f1941021419fafa2566993a77bf28366cda45f469f99eab230a476a66831ea76494f5addb42b98aee6c3448d74dc4243281a05cc7fe15705e726788db30ce88a573312fdbb892d40f9941b94c880dec3d7b883acbcc4c7980e71b45390a15520137bbd1b70db8a0fd8f4a28005cdb4ef4d894cf405c9d44d9a213ce48d591053ef1c906862a0b02d10d8cd422c7290a5819a9b7230813825c74a649cb9129fe883114610436be07ef24c697f01de47601d29b1846334b59bab7509a41a48cab1354559f6d4a98b2ee8385a2b3789a78ff9456fa459cff93f23dd38d83b390b307ce77bd4de2f9ed5936a2253abfcfd23e708448ec2dcf1d6857e6e5bbc3e7c131617378522972dd2db9eb409c346556d1f0d6cff921d1f37dfe6a3a9ea1ae301da2395bdbaa362c91e52bb74173be6f217d8b8d02ca968563bef1a8d022a1046c0ae9dcb7d08af2a4faa27a2e6a572b92c6d40e44a1b406382c94e665823dddef673238396b71d29b74d8c79a41faf66cf9985946c4a74d9c6cdc7298ca4f91686618c205c04710cc730df1055d43dfc83f6d8fa421cc4de399db4887cddc6c8f142ec2424ed36c121959e62bdaef24fa3b4f845e64c3f41f4b69cfbf6c1c8c0e1f2b609f382ec212fa79625e7898a0be40d281a7de5bfcf0dee51c751233dffb336c86e97431059d6f5586b36bb0d1f99e1053a3c2699302cf465b8b6f23b2631f8412667ca665afa8e63abe6b14be314d66855d272146395ee5de90b129fd7994dd03b2c887c32d4cca2b213ba9a14be7f380f6048e4715f4df3162ff8545c86aa4c5e0dbfb6cb176b8b8dba0eee448918d0d2a7d11079061a26c6fa40b4532654c439b9509dd230cdc30e8773e60e8af8fab8b0c5c683fba5b2fdb5f5d54f77096d6da2c6976532267c72012c2b98815b9c795c176ead2f0453a7c0b74ed20489caa46bf4e4350318a2542b2eaeb639573369ab196584181dccafd0bb9b2d470ffbf38fe71b63af1cc61aaffefc7338af8a7d985804f36700fd8c6ae255d4207e363979420cd5864732ceb066aa72943042b5d76e9356b25e2615a854d62a55d64c3e2570723bb4dfe453d071d4d837916d869f0310be012945eb16930f8f9398b53f71bd611c228d842e1444bcb05153b60c338b497a7cf7692554ca19b5ef8dda1c54afd47f0135ab39618d93adcccdd7d638005c13e2543a87d84542d5972092d51ae21981b3eaa1d5d02cdb3f0b315caa3811095d6038688d398e32513a48e0d6e23350ea2b1362cfd72ad314e23ac1abd1227d83a8ba60b45990ce52258964f7fa3e476fb34d24a6694b579078056459b7b971ede882956fc8a8680ce419e2b2591757bc0085338da6a7aa77cd06e46ed60ad3fa57a1eb3dc0e1c0f686c1bc6efbca23c74e3cf01fcb39426f78ffb3f4b9ee2eb4f79445424443f8d81eb4e2189f1e6f6926a77da26af129c011e1f9077453c4f75feaf98d4c25de69e0743e9e43a7811679c860d9e567e0b02b8997f6694f9a0844567b26ea94007f97ac8126fa9673bd9b404a81a6694f874d5fdaff10edba5898370b3ba7d3e7c43391d9e906d25778c89de507676e5379ff291ba90fd1b85dedb6203aaa20db76d02cba089930af189d75b530331143d140c2fc84f3600b64407bf3b1e880b1cf475f1c0d0b03f238441c1a38ef8624bff8414c09a70ff8964e3fdd46200dca52a7cfd5eb1523def44ff9f6dcb8b8208eae5781442bd0e2d56078e69135a94639318af9130b6358ce688c05cb748a85f7a61414828a129bd0c085f8c64ecf87c43650ab6d57108ce60d5d8c2e198e819aa4eb9e378b3db766a9df844dc786ca03e6839f86a2aab9c806653eb3869e8edba588a0cb4b5d5269ed6aaa353ded37736941d5bbb8490d421b061f387279857c8dd4763e806fb18e01f2c6166a0403a94ae030035edecd70e021ac053eded7a155c4050d6cfd7ca3caa858d8ba66f55533b9b1d43eb32fa54cff98534899f5ffe7709e29a3d58dc1b26d83623d6e2dd62622133b9b8f3e918f80d2a4d889a61ce01db4e6f11ad2386a1a967d1ab99b54ff7cbb47c5f8ee4122c08c21ce1ed29aae47b1610e2e6ef13e7fa0777e864c687c518c8aa52f3adf6e4dcc9b5bf128a68a4b4f00af90e9949efc5ead4383818a05d524033d8a45bf8760f74a019131d1f17d31d58a42818a619723590031d713efe573f8637d1bd50ff106879c228824cdde627b8aa238f70e9700c16efdc1db56b2870e897000425ec991607cbb0f21a5a8af2aea803d89aa1e7b8a87d7fd5eeaf840ecee2aaed05e8768c63b10b37d50f1ae7374c609e002323457f6bf0fecbff1e45d5bccd39b9a1b8cd7cc8adcbbd5e0cfad206fb73bcecc43b043350523cc8db1fb630b018d76c0fb3f028e033ef97b376f861038b3eecad915670781453616b4a6725efe99dc9f2091e0a3164a1e5835149b0ab9b7dd3a089815eeadc6e29231215d27af17848b1d5f509dff30c3a3c2716bf6233d23d82d9e15beffcf48ab011781dc377cd38a1fe221645a2e8d48bbe5223b7a35032fb9143b586946db6bf58d948200410812f600c7344450a3f3868f4de5fcd0188e3a7cf8105f4cf047081ae7b7b9359530fe7835bd89efaff5058206ac18a8a562737f917e4226aadae848a2fe4c0f3bacf20a1c09f94bbc84e143e1db9b83c3ef68aa9e939363844513c370222bb8b5d6c6e68d0c731432874159b42560d1251ade3c7b86f1852d4bc72a91373c281d6536f30b313e247a48ff8aa880600199d3d8ef150211222606691128dcb61717624443a13399cad010e6084d5df18776451f81cc59e4a0e0760049d36b38682c60bd7bee8eb6c05ddd06396beec92e0f431be5fe39401c2e9f124b3bd5825f62f46089ef39baaef2019957216b8a560dadcab6ee28e419bab22f101b2f8456958fa815247a06c5ba684970b56e46ad03d4cbe10759196d8a7b6c1a412bc2f61edfb726a08152af70693e068a9f5b1540b7bbd73c75f3d8512bf8c76c3aefc617f8511788f08ef264b22095f3787f8a407e3063bf858f39cf62a434ad3f56a321cfa9b3528c78b18130482bcc022506ed97ba6b136d507a13bb5fef41bec9541454ef8d5ac7bdd57ce403804cc5967b7bb895b0cb72ec1a530140fe76f0d049d2de340b90e8c0a65b6e0d13f8b88d29f758d030d1665b71ded05a58576d9332fb21a9ff515b9b1f77e25985018396addec2d10c5997f4e4b48cd8a1d274486b8499ce4f35f24335a8e3f918dc8b7f9a82592d141a164564bcbff9173cd7246dcb8937956cb8c147f070e9a62f372cdc4f9e7c094a9d6bea6a4c25c3175f51015f82cf13605162110c842867302e20c76bd01678fa3a66ac069eaa28040a83d04711b6252d3c3b3658ace88d635f464ad10bc7694fe2824a40f337d4f899f0cf578ece43083700c08d1f0afdf0bc3e36299e5e1990b42195ddecb61993c8c5281a200ef30dd268f5b41fdc66056b43c26837557bd856d3fa47719e6bf74f38dd12d316c514fd970c0d425d39967ba69e61b2d2c06cc6914530e56ffa7974a32b5c65e8c8593a2533bf512027b3389d21b61bc7ef608601a787fc66d060d24e6775aee6d3815f7b8a2c65a4286fd43b61b60d3e562f50e352a3dd3fa498d99cb8de684d3727714514a21a3e106c581c6c588aee391a20ebfddaa5660557f97d3f0f782d6290c10e2e08dd6cfd117fa4d838cf669c0ba475b414811825d2b1a3dc6f681137a546c74d928c679672c3aed40e3c918610ac7704785573fc047aacc335d6fff00dd11d43d96fdd4d62945b03bb1fee5d0dabac43d0ab88aae7bd313fb034e8940b907e3e388be8034b19ccc5fe56306c9521030043016ca9bad06d737a24b3eaf00eb2dc9bc67f23a9f22532ae304525620853d89717f02459d592c517c75d7b3298ba44340aeae1212b4f82a008f2d8d458f70fcb41eb9461865671e2756cdf1f1c9a58cd1d1694dfb09cf9aee75afa426235ff1604394e1dd494f900c1486d8d2c890c2b79120345c67f4626598732e1480b80cd01c5460551f1a3bec8e18a0a9a9f036ec348b4d0cdd81423fbe60532d5eba455ffb8fd42f6638486d5e630e996736804683406f1556d60c20631b1713b7cb7f196a1c454304983f62aaacad7882035aff47d8ca0a612ea4d3a2e8a4771d57a1346dd2658e6e1163d69197928bb3fbf45ebebb2f91d7bf7669f32db03bc51edbea86d91f119520d11af7c764214112589431357d581f78737109413ae4269cc40aba579f39d94cd83c8036ca3e7d9d70169d2e48f31051008a8874b1daa33dcf58a4b9d97db498de8bc990d52830749d3805778f8820e7fce05807cfc74f6174aa73f053a1dc44823d1f4606b6a0aff045f5f35f6dd05139d0b2db3dba7a6200ed4ef51d69ced28cafb1e326dd82f902ad5ae41c1aa5366329639089293242d5859506d66adc9e5b335a6412ce2d7a17b5a2d59d9b8c86b0fe1dbad129adf796a707fe4c482e78f9b83a7d129c0cedbd0e379b0afebb1adae6fa43a7aafbc86a56a2cfe5541d752a6535aa135840547fec6f8def8b40761ba32aa8ccdac3aa52a5b5ca66da32a88569fd1a7408396b80c55b80a638985af508405a39f0f22f0d5232d626958babadd74c5125775e36e7b120fa473328c64a900098629bac2e0917031581a8e234a432955a8910f12d7ff845679ed6d0ea98d2a044f528e812a3f192ea5daada9731af58fd16115d194be8e57ea807ce1c9e8132ff0964e6c449a946f36e4091823b37ea9b0803b31ce44953a52790f3c9a1eee810ff6d447cd54166503d260ef3a8cd96cb3ec7b22f716c7b75d033315fdb1bcef3191f1cfc802d14492d58754d6acda26c259f805099e64ed927df22a31fe044695c6d9e5c2194418b9d0fa9202b1c77861894df3d8261823e041cc96d7d321f87f9fac507c66a3553ac81002dabaf3fb0683152427f59960d741a1847432ce7834b1d6bb35269ccaf5ec941ecfd9c51715e2c9d548a8767ef7c10c73ecb3e15ef78f3e76d035b1997125b2ab140a2133c8d7a9b556e5dc69a10d283de6d8a861b632c94453df4711f57c46f3d69a2fbc5ce00c6cb55402a723551961a5f83564d91f8f3e841bf34d095129a03f63c0633f861884a3c8e54b58b36d68cf1d5ca1369544a915585404d3ece283b26d08fc5c3767aa0dfb160c44c6d5265c4f39b5103c6cf0febaf0e8d4a475a9cf6c3fd9eea9d8c52a8603a3dbba59d64800faa84b7e1a4944a2eb1f29ed457f29094f8ba399960e8bc354ea720fedc17c78abe5aeb71e128f5f2cbd77b984ae31b8b347ed3fa021c801cab270c09bfec53c53ded3b5132ffebbd10ddf60af4c152d66ebc1f3c7529552a863e4a6fbd08a2ab3b72672eb606c5a7cee540c12f123d1e7c1c81d9719d4df03b86bc634802bea85824eb6d7b56f6089d80248c37f98199f0d5e62e8c434595a50b32e01d05040c424ce1baf590fbbd66d7ad5f364c18d4c3cc7bbefa49747e547299f26eaed2fa2e2567e51309a8703575aac42dfdd35878bd3d1771b146cc19d852c1d09211d96f8da17ee8825912ba24008661f1ce3f62f714c2536a12c86cac0584d1654b1ca05cd5e18ffb32bdca3da1201d429dd33aa4ff113ad8e1c1c788e4da7d9c504a9fa891b0f3f9dddc41c495f1f444e1d9037a03452f2f2e4bc9047fee8e29c83dd36e9b51f4e1bf3fd911ee7769cee8504fb31f257fa2941a02d01cea970aa2eafaea3872c4ff1db38bbeefdafb88b616076ea867fca0ab683afc7d5b5f1dab2c48d3be7cc2ca263ac5726823d06022abc023f795ce1e070066c948e64e2457a231e4908a72df404eb689f970ad2381f30e3db1dcb8d4cfa7b1ebe6813f82188d82bcb4b368005730a36460822f2fa20695c227294b4d8c7da1a22c49a127bdee77a4faaca52eadecbe354260448914d884f9d0b1ed097464dc333c8eaa9d6cdff41b38fe51f9af11941360cf9a1c09c73c87528de81eb8313090a1a8b73e38b52f40018f4cbc7ec5721561561d1952e4dbd5cdc543ddaa0a5d607855511dc816375d452cf3ec633dd072e25b6ad6dbbbbbd6766b8c9f3d0f635e8213349c7d84a5961c54fcb020fc8a345e3aebe3e278895950a55148d8503207b6a3c6bcdc265cf35db69145daf6cc90f4eeacb34e4c86511df8e4c4105ce2acacd08255374dddc803dd7a06040789855bdc07de9c71171a2649f4c0946d5a9866bd8757d5dc536e53eae5416813d3a68b28e70f582b5c7af08820a11b257410b924495ea4ece1741b1b65dff708f0b074af99293fe5ab5f2859826040aeb45e7b7e76144690802623f9869589817a044c059faf03bf1a54a9842749c49f2c084561352d0fa9efbc6dfe43a37a138e6e71103f7ce12265ab03f6549034c863458d2af089bd871ea6cad67e6369b3809dc7908b13c95b680abb8ebce25bd54c43feff0817fce399cc0e578a4a46e96921bccfcac86d950de630c7205eb9c9295593ed707328e44121e8c01498f46f90aed8cf1323f9daedd28e5be450dad2170f62f4ba373d398f1b53554afff5badcb0a399411e4c7109f573418e5a5b068ecc635928420e9ee1d2963ea1059b8342387dfd27f6c1a988cd1e605649cc44cba08e3d08535fe9160f81bcdf4c72eecb0580b28f61b609a205e9179bf94537f5ff349c0267bda8d36dcbf5dde46b843be860e7e3717113f6b4416322c35b67a7504f59cd092418deeefd788488d87527bcea1b7b997cf4347751d3098919498cc094bd5614067f6c89d2f2d6825f817bd88689f3a0b698b13cc774b66956617719b2d6197216d4592af09f71faf5272b8aaebd179e0e8bf25d39715bebe847fa51ae0fc952eca8cce9071e0af77176720532fc79ee3fd3ce3dba094ead02dd4758918def786bf3a607e888c788f84ec61115171957a5a945c8e23e003c3642e5062186d2fa00f7b863348ec43c9f668cdac81edb7519834b300caf729fd7c75aaf972f42cf8f6234fab1a3052859a30652e9f3a3f971c97ef2297b757eacc28ed3e36be8dd82f69f9712acf44d6818ab0854aae4bad8ab542d8f9daafa369ec3306099ea5f9c08d07d31f85e0847f93ba0b9420fce3126028767a0e61b142b0e3cdc44ac022634667c1e61477ee490285e9a4c4455344a0846838c3dfb3ce413ba56ca690c61bbf30c00b025ae24473f08a765ac25316d269db6dd128b3cbbc6ed544846b84327882f497f9fa13e8839daf7c981efe33496854ecc4669e60f7d9f267c4a0fe1d28457b900501d3c37d4e49e82f7a6cb8aa557218d5e0fca119e3570ac4b76874fc4d926ab177a9e567fa67bcba83d11d383aef422056adc83fed972a0c2a49aed2fb7e88d884d581766bb286c8bfc59c8904eafc0c63ac8c0b741e5fcab85d622c197e6b51d802ee3a07f89c67fcce38a311a946c3c2fc613400794f93f633dcb75a7f6f9095b83a506eb5c0f9e2ff0a266d6208a2539629e4759384f4587da329d7a3b40857785f99836c5893a07ad713a3049738bec1515e480406554dc052c1ac2d25df1468c60a9298f8a18a17e3f8e2701b5bf44ab995a4d648f460df50b6af1f2ace88f3244d89875210fceb1f8cfdb31a12185ea6750ed9b36c83ab5e44516928c41c30860c08b34496b38393dae50785daaebc76e82322cf5f708281d697897eefa092751ec4066c5a05d845746444bd10e3cd026955a51593a5ec1069870647ba5e213dcbe2a1b606733e6795cb99476664fd39f85045779ed1461961c9461d3824a247f2a42571269d2a364eebd016d3a2acd7031208a1fe4472c7deefeb45df426a78094376c5929886a3ecaaf8efbdbe2baa2355c253831e7345a77e977d5e49813f03443a14884fc7be7c0937409a7713490c532534a37cbe3f6da5080aeb95f12d7abba23458321c1524c8af8694cc2ab412b522afaab040b9b50140ed205875f11fe118b807417ce2150c7c6862c42ed99138bace886c9278b0e689cbddf6cbb2b0b51bb08da29bb2ceae7c379dd1227b01b32f9a7bee4ce3241b475438c309ba21b62d9441ea5686c321bd27f19d69366a0f89b8525b5c66ace050867a959fdc876e9fa3b9903a93a72bdbb1bc59d6a99af205872e84811e110c13b12a8c053f068972fce77b71cd4220d2292a8e04fd0f1729838b7ad9f2111529fd832613fc95685dbf2c45711675376bd02faade3ae20ac45d073444f34d9e21bd7e4a201ec2ecfea5c67ca1dc6320adf95186cccb970b07519004df51cc4362e602d660e0957c09ae7a457872a87b0be793153b6814276c0203465d0e1629d47b8a9e392349444a2105fe447127e37c76991b656193765867100e25298812fc09aca312f741d37d64c7bafe4bc57331f7a4d70ab99935a057452cd9cdcba88f353a64ec71eccbc18d05dcc14ac4abde4b06d8e8e4958322e3bb4ae5815c544145cd02a2938121151b336c5455bc900f3f9115a7109c026c691506892e1f82dc3c278cbcff8b1cee0545395f9d083f6a6b746b02a37d3eaf06ff98842c900f424955f30d5c3c4c5afeb8bd1ffba09fbbbd2fc2672b72902274b2bc86ea88c41b1a74841129a4d5c410bba1e9cda88b231eef55420a3a9c01e0dbdff249210110978b76c501c366c2889ed5cc3938f395cb924ea774fc8abb921e32e8de96277faa44a8e53305a1254e1b22fb9af70644154fc2e50aff4e34a7247abe2bad96cae393b4f87bc7059915ec04429d42993eb8d1d05f2264d62f6007c7386eb52a40974075e65451bfc56b1a5301da5bac44cc545a6a95e81c6815a72163d8aa59f4431e0fe41b99d98df36baf09d0ac5c0b0732d52489e38d5e6ea8d57cb8aaba8a8fb062353f6a086819e6ba0214face021843216aca1121146d576aa70ee36cb6b32d148c49ab3d32156ad6b010f6faac9466d83059bcd5230a0eff42cec4cb8de48aa5cc744e10089117f7cc33e35e2d5094f00755313622692fb25c1b15ab4b5c3729da278362419f97135e4ae8084fbbc38dfa285f6c07a5073ddb401d57ceef9982fb9836f1fe57f2640386dd8dd8e94f12f24c1f6a75dfb57606766800b77d9da94f1fd6d1999f86c0035ce3421759bd417e9ab7f6e27c62633daae1012d313db850a473ef1c327b203d5c2b7ec0898f7a78456422d6cc6efb2e1afdbebaefa3d3d994fc770537e553f599f014a1d417a300dceedce321fd32c48d61835cad3100a4a6a86cb5e8b00772d4aa357a34cd068b545960be7d5f60073b235eb73c225e16c8861b3420c123dea72bbf07cc813ff0efaf260dfd5180268940d3dc0261d34e40fa166091bcf34ba75cb3256fac7f42053e73533621635d112957cf6f52bb43efdd37733148879d23a329dc841dde506dd2953772e60bf1403de01f1f9f013d97bf64ba836b96bae4da1e9dd20fd4006354068973c83a2c29553763b89b1de85f8be3a125febb3ff29f1e8ea8f9241b910c96ba4f9b69a67fb99e81fe0379cfccb3ef68da30908b66038a3b6b1351eaca40eaa409bdc4a6df88ff721ea9f927bcf9e0aa6a71f7e7b9b1f1eecb2eb59514444690e843d2eb35be4a967aa270f1624dbc96631c4427e6b5131830e0eb6c635aa68cbe129758ab9963386971dae71d13e8a9d5842953bd1a23a4f2fbab170c440343fc4a6abf69febbed52036c9da91b4f819329e8f56ddc87cdeb8240ddfda7e3e8f75fadcb4d5ec6622ba161483f3d3fba3e80e02f37ea28d255b8ea922785bf21a0a4ec9b492c711daf9e987be210ebb325381521fc9319e6492e7c0f20fc021b5f7407cfc97afd799063ba13951da0753ba8a9824912f487e89ead7a5de0f3dd402c26a1b3f1b048340007387538104e948d97751f5cb974f72416d65c4da41bf38dfdd81058f0b75609ed8fe989f827182d897f265e26f2764e001c16ed9ccdea0689d45ddf788b705fd8725a115426efbee8e700615dac30ccc339302ca5b145e7e7e512444217f478e974fbcef9d810282266f3480b0ac1002835adb356dff5148fde384c4db3c1ebb6f8a33232a430762c01d88d0251a3956324ea487549ebc8ef89eb3227fee198161dac8065246eea4db241a6f9a08f86a405c860594e3555ac63faeb5c3aa55b8a51256772a32a7cb4a4831638c8f0ee55962c579c692094b20101821db5ef8d0ac51536bc512774e1177ddfb40dd63d328bc9b67df5d1afe2b4ae14db32b974c7690e6606a891e051ace318b32e81ef572f962cc89893e90643b745cfdd3d72acb249e230d1d451c45d448464ae328b9e3a3ac93f862bc4acd1403419dbc7eb49dfb33804b9d9f240745e077105ec1a5a9d2658cc420cc8ec4c6de69c6a68fc894d223a24b9adcadb9a30520ad36855c85bc990a45f43d246656cd105bc1b2f6e5dcaac1a8b571a1bb2d59d75a936483c57f868d1f715e6c66ea880bd671565de1cd9089e75bfdfd497ed69d95c4fabe01943f4535525805da7a3ba267aae4f3d252343c0fd6ccf32be8b467e7869bb0af91ab8f94b3653c6b4d089ea8a64318dfdeb5d233dc09cb8a92a93d79145091cb3c863254848198a066c0970a145e692cce23054658ccea48bcd95c8ec56eecf94ddd4019db04b6dd5b6998309d47aad798622811b1a51bd018ef658a15aaebf861702619d05a053d60a33d7c631a7e2b064fd51afd90d27d3e58063211edd0e2308353ce06a85074899d85a3102d4d4f02699c9aee6a33918d4061e89140361ba30efdace360e0b4fcb5c5bc396feb5341f01ae163f59515d3233c4e66dcf3d21fa7f37b1592d031fcb6da906bcd93b4135072b80e6053798ddd45b074ced5b5fa75328b66107b42991a1dbeeaa11bd4a42e7e40a04d23e5a0d1668bdf29de186a1624ef05c4f62891b7d9ec08ebd3c3aa5b6994a98a138b0cf322f1783c8ca054176aa15f8e4b1982fc83243aaebb69ab7fd9092c379e3daf4a80b2550bd62673084dd2940a32d7fa6bd8e45971ffd612fa25a8092822beb0bc57600e3a892ea9a0cbf4cf433138a43d53e80575a7335309d188eedecc3a47ba0dd0b5618fd435e47892a378adeaa5cba2271a5240c8211703753d5ddb7c9403e60e69dcaa3ca2cefb0e182de09abde1a59c9350b539772fde0b10b837150692bd6b7b32e281e1e6f19e479c8226040760f4e2e66342db8c548ef20ad1c3b1d18829df7df45107ab8a8576d5c00290d7d6954881b18e197261d7e6d53abb92e5f7550c26e2d8d4920fb8ac88199c2bfbe9ed191cc91d959618a096ad5c6e74e9a6f9eb7d208bd6080699ec441b91b12834f55d0e419f868e0e0eb7cbe1622e15781678f8ca21f5363bcf3a15d8929ec03548403205d695c5c006dbb0c7287823c00e7d1f577071df5d3185d3818b1fb6e6534dd5a3505bee4d96aa22aac63402b814630c154dd321cec32baf2569fbc0c1ef5ae041843a7f70a4ca463983eea5f0662a53aaa9c3d023371513a028c2f6ac6d7fbe50ce05105935c6b5ac0a3edb9f0425ca7093c975af8afaaf30b5ba72a6507ce8f0c5f626ac99aa2378258295adc78d74ae49c515888d964d42b6a87065dcf16ca42f7ddb3761b9403beea761744ca4243bdc7b925456dab100dcd079320021a6a79db9fc10e695d43e11cb6ebac52a658a14edfeffd6381f33997f9a8fb76a3d915b733000011ca2785ec5c0c2b7557589c99334c0e26119b4b8170f28985b2e4918d3537363ae37db5b9fe882d0196a518c1ec1245303b15404d7f6568a1b9139da1d9c65368e06584ca2b60cd7c3fe49421b6dc89be8e3641be5df33f65ac55b78c5e8d2263c018260ed4ce543199046d68fe98f0e6d300290604ff5486257096620ab1e1bf6edf9bce6000d864496af6e54133f98409bd3d792c6bb10b95bc5a6224fc0e19c2cc3c2f757e67a850927ce5759fd6bd5c917d7ffdac7e259daf6bf7538bb620382c54a1c7880120b1c9425ca151fde59b1ac2312209f9c497b7bc873e0e05b83133a14e075074b4009712b02e27ed81d88840842768e08af458141090677f643ac645bb259b35503b7c714505ac902853716827cd45f4975297c14fde96a6ae4e93d10f3a7fe56be35458a0f0ab06ff027c007d10c63d61cf6ee93305553a21f410cbae63bc8d60c5ab01c1892d489a19bff6197b7938ca1d5bbbeb9c07d48d4a93f835268e550b5c8a1e8c742a8796aee49ef0eb4627d0d4148330f9b3a25730733e9650049cbec5334cdc63bcc239ab441b3c333f2f60b1b6d30c8af4be53593a7380e7ac49e055bc4d93a61abce6c40c5c56a238a0f9045e6c78685e1965f05fbad7280ed2a476c1038cb7118195fda416d28ccfd37fd0bbf9251d9fe101923fce3b5f3133a22da4280f0c081522b6821ac3a9b79e680555776b40ac0cc5d769e32537edf8f540919ce5c49c73b0b4ee8d1e150df065fe6da7e69f4b8a936afd2b4a689279c8a1a603f56ed7a10fc0401099da45627aa71bcade5c2f822363284855b752069b32053ca1ca738900b69144b81a4c4852dab1f3ec334fa5f4f98bae28a18faa42bdf6b4151062b78dbf16a9c07c8c319a0bec55b609c03dc4888c28f6af752f969cc31dadb0938555a037a598019b94732e2223d2875b395286e61948361e8a0325e75be59051800b8e73e217cacfeadb270eb86aadee05c943a3d1073ad07807ecdcad91a08162b8211013317289e3a7169ed15d9e97e814bc6bf30acd486322c384b92929d4706a713453d35204564c9c997f10adbd597ca7120871beeab5c108a818904b1408730ce2d4c80e4626f39808eabe19cb796a855176967c23ded9d2ff208df0362a331fbcd354ba486adb8ec359c99682544918b6bb656a3ae162e52004037e57fa74ac1abb80e5a01c5b10c7f244d1547974c199b1e3296dbf02740ca39473bb14b78e5952b097c8f46e28a7ced10207372bc401bfd865d4c9d90949b450c5df0cac71f170dcce28682abfdaf1ee7f0e2f3bd9ca2bd277e200ff6b63399e4380b82aa010df4dea26163562cb23001e6b588d7bb74a5781415191a9b82a6b12198028b934cb8214e2957ab24f7daff350c0b90606df7f2ff2b02d5b395becefa0ed8a8cd9a05adef28c5b9385222f9154978ac84c40d9168c4ac0378d1948d97e2e372d2b3cca35afa45c02acb2ebd9604a89fd02cef189992f8c979f90f2d7915826772741ad3b228c4174537c3b31bee93109d1e594cd57d26fa271095c33cb6163d406dcd9f6dd2fde1c93868fdd83ccd7bcaa32e8320093b6968748f365d5479abe1c590d8558b3d0fcefac8dd879554edd9dcb57dc04bc80a3136a6d8aa56731492c7f7ada17c30e054af2d9026a48ec9e30b011340239e4b80579530f3694e8cbf6b28a7d64afcbe83fe1e979a6b8d3625176403792b1cea1944a76af3546c008daa861f575e57680323b483c90dbdc5ab87eaf939e253631665acb1542b86d432e97fc251a221024ec6da730e3cb77152218d4dc00fe3915f856fdb57d08ce01f0237f6075d1362fc144d3b1dd201ec92223d22f305054040df9f697e7c43309ffcfa5601b0597edaf92f47558b5f9f7210046a515e1a5ca5038c200a26635947e8da41e564d22be481b41249ce1d4654120f148818a96f0a6571f45dce820dcf99bd272098a342213e957be6a7f1c23df13c8dfb0cb3194ca3897b56222b12b98fc8b71bbe8e9f46210a87724af0064a9bb233fcaf6896e4188ae0ea48ee717d60e65e040c3c2238ac426490812edb0720728580f64b7fbdc734f60e50370bf05db6ebdfdeea2c72bda7b17a72845f6e0140aab727472a52b5ee4a169fbd5ab95fea9d3105585555d6419bbb42401cc442c179d30412a148da275814ffa7a639e7fa47f9a9a17188e8a7013d0f20893d88c10d46c8f9084711128c4e108580d3fdcd1e047df71ace3b4b9d18593a735b90f8704bab7548900dec840f73d948e66eea5bb69c681607328cec2e858fc971df0154904d5e31914c795bd9e847bbd7230a6121dbad21f700ac88708c71c1b906065ab3119707c006d4c4dd53cdb9bcda772ff1016514f39af999673cc738e352760cd4d1b259fc7cf5573aad3e8dfe11aeb068bcff3d5a99004edb7282c506915561be04a613fad7e5c4a71fc4cfef3037bcc9699d6148dc7f90c3c6e527f2699271075077fa39ad1f78439a578a8cce6afc018c4aa87e839f3aae2aae275546c412f0c28ac5aca87c74e4ac37ae467955a94854d69f94e9b66c134aa5e84af92ce5b8b4aa0e426f71d50b3cfbccf573421c77dd24acdcd63e273f683f279558029ad693100d4b3d30a922044b4955fa598de4e3398193b3d81a06457c7d35c342492a58f3e2e800b9acc522cd77b35ac060dfeaeece1cccea36e1d79008d478466571cc4a829065077ed981d50a85fd4d5bca1d835e52e5fe82ccd74ebe064ac2d0a3a2c554bdd62c93975188bdd43221468422d4a6f8f9b2fc6c2d3e00ec80cfcff18f4b26f4bcc755a38ce9a7f2dfbce3b3751f1ff06865d232a20fecd8d84c56178fd7a34b5d8d8a9841d3b2ad0bc5efc24f91b43063dd7b3ca5a4f9f959b7e51a0c490d574841db699e0dc04ad54d65220bed45d1b30abbe543c5defc8294b439ab74725f314dd1ca62e8c1e77407b436454f047a6abfca354d80442f9d26fc34b01260b113605f510a2d85bf36e99477c97ee688f30cd43c9b6069a78a20a18416a9de441f19f7627f9b54b5a7c00cea2898fbc573f92255a196f57eb66a3dd59b4f37bd2188989b467641efe123f8adb4830e3849e3ab0c7c069523e48e228a0b55d18cfc59d672ea4ed3b0dc10e3831028038d79ff8b4659e13c98a69d3ba4495908b4d643a2b7347475a5428a8c0a4c9abac059137554ae8ac125b5bed0ac6decd8827721f56cc157db6f8e650d08794d3615f5c0135d66f8155fd8cf663947cb33c3045d979f0957e49dc3cad72c59e3771524df68288d8608e696db3c7dbcf174478b9189b93051f145acfe5d476549c4392b0d8636b697be110c45fe3f2ffca5af44e8b6b5435134983930902d03a5db2c0a0bf8bbc96f76dc0c051e3d577edef7da4dfad654c7dc5c20e80c40213ce08aaad7141aec679bbfb331588e17f1029087b8feb660b1f46659a9b12ecb6bb44c80156903cc737355e602d43b0526f91afe3d70e61cb0e64049d4ccbb494b12be868e9f74d696e02538bb385e7a6095bef2e780aacb0c50026e4e8562659e03ae9d759d72ec3547314b48d69c1e5015cbbb7be5074eb9e4e02e416b2f0856b73a35730206e8b12416c42bfef52e6fef2e9d9ae63bfe6e3f3860ecab0e6102a7b2af8fd502f2917c7c30be5049f0e49da2edd5e4f26b5cd2b6217c1a42fa7e05683ebc9e55e77caa8f5cb59875fe5c5acc082fe75aa02be0707698ccc0cf884fa22d30ff79ef73d2ddb49b0165fb25323f2348235e6555355e529a316684e299dade0fd0906d8b536a011aa41228cbaded10628e82d623f4634e5e9513c72863e868baf9a4970e3a0bf215157197bb1f3f96bec2110922f06c7c6ab9217ecfd9930ed1ffc6794ce3f24fbbdf5f4af09ce20280eed8f5808669050f8bbdd949724f643e08315780fe37c45b3e63d38ba547871924d237f7693e026c118e4f35ea72ebc05f3b868dae7f52e3f02b7f38f6179519939735a979ea8fd3f9e217e271ec79ce41a36a4f79b97bb3864fb78c1a447291b2047a83bc948fe1c5dc2ad457b6202ab881be40f495ae120348d24168305f27f15184210b8223f477ca380dbba72a0831fb56b62511da43ac3a8342dce587e369e0578e981cff26fbfb9bdac609e827259615b3917737011f601c1fc29840a43b1ed86eb5907c718da37b35c04e79daaa6dfe040acef5e26b1c6d19a0d0a0ebf287eace70ce8a981bcca5d9472b513414e49f3df0ed99e45618103bab8dfa333aa808e28f5e44cb2a5092e5982edd7dad041bc83e881e1de0b572f2d2c90152626304403b5344512690378da6988cc18cbb15bc436137360c56175ff51f29337e12b8d5b32ad7c3b3b1990470f8c6af1f9f3869503f4e2e3d8ee4601bd9e1e2e29a8ca286a2105b1340302a9bc983c41878b96e0ce4710dfa43ab1bd8f92c86b845814888dbfa851c1824cc849f0704cb8dab607485e9bdca064b886c0de8b3aff6d2a8f4e05b5ed88460537432009e7bc63a0cfcbf1579aecb8d71e197064791ee42fd7d062b189ba046ded35d7058f494181af92365fc6a2d89db30a4656e0a32ea8151d5a951e965d079a668a9daa3443502a2acbf8b4222a54f1205a66015179773259ea493790239e5092bb5b1f783e8fdde52ed2a0696de17241ff67747289248bd83e4adb73710b33fed627838cf25f8875795ed8b1606d47459c078458a177f4560d0a0093176473d68e1e3af726feb8c2e44ad9096d88b2fdaa40b47de3cf8b82f606d825d84b453f12a630b4d6ba7452326c1457092ad9746e59ef8ab180a27cda3f009414f33ae6e99758b2c3f48c5e60e3b0038648503c5df13f00c12be753b7f31bdb15e7f28ea22f879617b22e99004b3a9c1f1ac1c569a0cf5ad23a5ed412231b901b318315e08019a6ec9c5ed3b335206dff47fdf7411c7848fde56dcb0fd08257ca5ec73db14575ae6c8fc31a611c5b099b8cf4d879dc36cf8e6f451f21aa53421aec51a8aad7e282036c5328c3d2d16901a3b39ec12a16a25226ed3f6feca0fa1539c7e1f2e68fff17d9cdb747fffc9fbb47f26bc7f8c9b427f9f62b8af4c3135c31ae72f4aece662a5ab008699ff70d7b6df84bbe7aff83f37468ac8c19a659d170b86596c8b066c58144b74a4a4a4e9a32fb652c31d86b13fb766f2c3e1505b7eba7efdd1b0a0263688fe252b3bcf9b5e6f5f8039337f2fbf4c1eebf57a88b67c2fa06efefb4afda7a99b2d82bd8d14f4e0dc718fe6dcd188671b11141a034872c737088259fe52f86609014690bd2d537b1942952599add2fbe1bb0fa35956a1378748b8a001353d0c8e8e12b59a9d730248a8cbbe470192a2107bdd48aea92d5e55878ef1dcc3e0a999d603a60ad584a83c5907a72db6da312dcb03d39ddc6545e92e39359fc38878890c5182d13cc140c6bdec7278d892ecd28caed04a98163c3ccc3aab001d91351e4376da1619a3a2fb8ab3e9a32e823749b58fbf545b1d49b9c94a1df33a360f24b91c179211eca256abf397a4fe26875d7597881a14d6c956bd9b88cddb7ca549d095e4fea59a74f83d097422f8184b3d4761722a0769712dffedd3c9dd26073df2865db67005337d89246d0fa43f5f08fb1a820b15a607c60fe22d0c498d612869aeaa0abe74717b1e87a0f1a980ab2ed5625035d678300233494b6f78d548e1fea3028c3a8fcfd134b02bbb23acc560f026ae3026a180dd077708ae921ecbeadcb06ec0c59e4471f5d348ec2949e72cd332697acca535fc7d9a1ec8af9c2e1ad7b36cab7dbcc78b4810a57cf8736aead7f2f05410c2ea0ca3792d06efeaf18d2b9c31fe062ed4d25cded4fea4a5b75bcc1ca5ba62980c366c649b85998b05acee9efd1e96086ff465a0b7488a2586bd79db3db5eede98643863a47f62ebb2929f44ccd2fcfd3d93e7e90d237ca86e3ac677f9e2a87ed681510d50fd16e670e8cc6a2c0fb4020f8faf3abb3608ef05d310332f9d34e3f180c06bfaafb99433952a1b7a3899c26799188844ca213584965a9a06e0f66080439f399bb7b4081e2c3e2660fec38f87f017e7a6c0e9987ae1932d6f1f6c682610d6470f2360b1fb0e47cbf461b9eee04f04fa4580bf01313707cdc79c2194c4e7600f8788705bbec432f2c67d05dd148ba5c05fa0051a2ad0fb329caf9a25ab0586ae700238608f6ff6f48c1927662270daa4da063592c0961d56028c0c5c298cdba2dbba435f6c970d362c8c2fc0e86954577c01c87c692f6f9e68dc1027cf81ab86cf73ab604425a20ee9f0729aa8b383c0387bf94583130a0ec2ad01db32fddd5bd49b6b6328257a6e308500f26eac76d9cc93339c44884352af5958c14d0366d15dd41502b5d6cbf7873da5b23da82cb0cad290a4f1e414aad2a4a1253ccde88b43b3b8b8f337157403f0aa08c0df9b31f286fd46bff5222fd9164f87cefb726a6eea77d846d71a9b462b05b07cab017dfceb3960ddb08e0ade4315d43979d92a6881e66f1a557dc8313235f73bb5408f814991bac811037bd0f42d49731c4ce4591cfe68098592091650229a57618fe51f484bba94e12b3735275a334ff33534dd0d2a1058aa85c4eae540c89231b615b2559f4a7ead8c4ec4e4aa4fbad9878adc7a10df3d24c79a1237ebcbc38d5107ca8390ed8c153d96ac6d46ec6bfb5f7fdcf4803dd95b7cf84444601cf04a6f6ef4fd24c4ca95ec5a60d80964a92af51431d15a8c0dbe94597bd2e3fbe3d570f080b9687ac443b5d300d5fc214f1d26b31a1773e565b1ae7e404ec70e42cf919274aaec38ad0a393ba78b75f716be6db8861d6aafe5eed060fe6e5f0fbfe2bc6d16a21c0c00155c5cfeb02833a309d25bbef0eb2ee416e09f281a300c8c3970deddbbf9134d81398b8a4b4657d768c77253cec622cd72f53a400bc8f37a8e83a95b96c6abe16705afafa79991ec895f75c021ceac8f560db3004d0789943f489cfefa34d85fcc159354c9d9f5377616b25cd4095881f5a2e87c2e3fe2f5d30777da0156f4ffd9dd8883e165d84868fe86951f5ca8407d08795c3929c89e8c7d99b3d02363ec031dc0e95cb112a753f8c306676203f81b7497698f537fdac461b5ac27b13b975758776ea266e119e23f952a43d5e60e2adfa4ea3c39662cfa932ee8bfa66fffd7e95547c13972a3e7f4ab236ac4f9db7365cfafda5682bd34aa30ababba2530b91f045547abcbe3dd3924c20594394ac725f35795d39d9add4a917e2c74737cc398638c61cc51cc107b013661656fec4682c42e56ed6d6071bae98c91133cd575f4f017c6a1d3b3bcf1306e8e0e08023ac56b0665916032ec986cac8c6dccbd02d6a60edf27eff2399e6b620287cdf62ade2fe37969a0691cff59f392f7bedfca56192ac97709ba2e6eb84de268788f4e9fa9cab9f2599413ce9fa62e10411049f23cd520e7818c84c87411a524a695cba22d206355b9a163174411cae3cad98e6c82eb317c0ec2816fadf09d3e98f917dd3f855b32bc72b77d14f632ed265a1021720d52253f5e0b1db380222a834306b05ae5334a491242c5eb067d35026960f9c12195776033a57886227e74a0daad4e21fa8cb295119d43373e700cc453278da31f33cc2169bd08c74cc0430951cef87d93733b7bb4c760da070bac09ca0e60915f51dc2a497dd3cf6358cee484e4b967177d1a292f03f776d8b1e854e1687955541f2a955bb71613d44343fc8ea582ed4bc88546999d07990a6f4b06bd3b8e46bfa7642be2426a1f3fa1ee4db2d2f0e832cc3b8516c3809c130b99988dea1d4ceba78ec9acd7eaa60f4dfcb85b465d46c656520946deb000ee3c5f66cce8703e9847bfa19b6709f9e1ccc355e380a301a821fa4a1a2941be693cfdbc586c6f789628872d0bc04faf921c74de3514a381044205f00013d1dab7b6473d01f1b32705b179cf16cdcaba7b7c4f588a6291793de58de8d40fe01c6426e0861e1f8312dd4736c4eb752c422f860d1cfa6e9dedd6944dd288d142a1f0fc3fe2d0cb13d3539f55549ebc9f6bdb6aefd8d69ad94475c909da6b86d8cf8e4c4fefe514dd33d64a38b6c6953241b09d41070f2d822a5228247c15688d02c90524cd42712352f19323507aa27ec0d06215460dfc66db089b2a041a4cb2b5d65393ec4f0087bbc8f7487e25090a9780a8a9dc7844f9a0d1d206b0c38926185f32ee6d678f251c25c9678eacb99e274894beddec5bc1284b718c266a1be2f240429920eff4eb7da2cfe1bef5ca4d3bc119d78b2f5a4997839231f067b4c4ec5867c4ae780f1ac3bbf289bdcf2e08cc70becfa831b7c45132c616c3a2b71a5130ab53769f875d3e1098556118130a905e90178c1070fa5b4224bf98b917fc88cb19a34df829cc79e2259a16be3d2242320a545415a0554083858018b13377fe847ea122406e1895ab38378b5badba46cc7b053cd74fbe8da30829ab7896b7508f6f7c921abfdb409b61624d88d5170288424577b128e07b619aebac22f8b5609afc559e3f647838cc7cc2bb5769fe7bea1bb382e69d36943c962076d32212ce7e9254c96ccbd606bd3834175bf748540a0e6552cc3082a3addfe0af8687e4fad174380f0747ae65fb6fb4bd2174f4a7a8a2aaa68b96441e2162779d6e6b32fdadc782ac159795d4c70d9cd0e155d752e9cd04874a7f153be933543a736b03884fc884a07235dd2486fe37d34fce00637469cfb305022dfdcf0ac8d26fed8dfd6be99d99a005885fb4aca2a53c7337786f7747727e69878c13bda5af0823f8f7dbc75aebd3c276e9fd3dc3d400bc0f9b258c318e385999931d864a921a7af9479ea499273f790c06329ed00ec09eb0285a6aff0d14f63bdf0b29b931fcf333c08b4d8e92c6c42628200a0861471a19a966455554e24accdce721f4c53a44914d5791b7b89d4302f1b1b3f0feb88c8eafd2ce39269579752a587f2c030db13e1d4ca5029d58a958b8e43acb1614442cc20641d824e2e2b3181949c93abd9b94e8de33503d224e867a9ea8bf6b8e6f7dc56e190710187a2ab8fdf5aa7d4d181c0e18b0a81542134da8e2c664f5f2efde477f67aa092f653595ab73dddbba90ed5868eec32ba890de4bd435a9c29c093f644939a2cd8056e6c404a5aebfc8bb8b990f96da4dd65bf5d312c8d8fa227707a55cb415e5bc6bfbb0962f72ee6c8a7e993a96f5228f76676913038408fdadc10a747ac1c9c0cf0005a40eb2c4a7fc57c442447a261b13c106a2e79b89692ede1650eed3c4dc90d1cd9002b5cd656400c9bbc92cd1ce03f26e6d4f507531b92a95eeac5eaf79f52639c73cf21c7b0ef1308e27e6ca8fbc2ab269f1f99425c32a2e4e9b5dae689e361b38bb50f03680b005734c3727c90b4422f9e5167db94bbc66f5361867dc671e92cbc5e373342ecbf54f16e68f25376ad8d1879b57d65626f02ca841a2b2d89af9783efaed2be33405d68f6ff63fef1f5c1a0db1fcd321a15fb28367bfdb305f105a368a321298cb74c1615264d7e2914baf2f3c6f4db00bb1c6bda37d650f6b7cc4b646b49b8875a93737966124df80eb57124eff8826322ba91c78036ffb08b6b3c5e9b1520ff4b8b4b849b9db64a8b43a4e9428530f5c38430cf845c23293e62e4731db99297b6fe264bac8c6572171522206174a0e5a62e81a1f3207eaf6ba70871eabf6b701c51fd2920c07d24a50f59f500d623a0a702cd4ce5bca225acd6f4743a7eb1ba9bce90a7b6d02fcb7ca9d605a68fc8149db1f459f928141594071857c1a050e8d84080e4f10786525e92c93df94a472c095034a35e63a78c7411719b482560506098e0e872934bd95d582f3e6181ddf96fbba1d3e19933ffa0b59edf83935ffd84b0738ba8eb62d36d2dade9b104236d97bcb1df10e7c0dbd0ddd7659b9db7ae26d17dbcb16ee77034f338c091b7cb636eb64839656ad17360b5b1c6c10775cd62cadc3681c39b8c1d5e3c289941c8f823970c6665dd848960ba51a056f246adab6b062d2c2765ac9c2863a1d6d2c282cb4b05cc1a5c50a29972a6c2f292a6c302f32060693898159fe20133316e3071931fa32ee5f86f8cec03d3383c60cac41c3468d296c9d256743d27018103430cb1a2062c66c6afac6e66578e3a671dc802a1c52d83acbfc2017840aca861304179b10386f08219a882160ee522b22b6d862ee5239ab28e8e400402707008ac8a1a38800e81040008c10c08e1179e71d91a33080230830001e02f4f0f8f420e1f38344017e800a900450ef48c2003b781840091e0750020107800940c0120950c0120b50000316c004039e6cb1014c38a0010f7040130f8040131180800422d0430213e84181095480024e54c0024e5cc00218b8400630a0810c741a78419d50d00684b4e0c0063ac0011f1df8e103c88f27800c3de18121283cf00128827c00044142000211844088087a0442a2180151144544521491408a1290604809a6186282294e6002222740019114a00052918222545451440555ac40054656c002235ab480052e68c11117bce0080c5e10031820890114b62803243d0319d06006d00a1ad4c08a68831adcc0062fc90d709004e600073ac8c1153ad8c1158f073b50c2835ea224f660890f7af07ee0032c7ed040c0220601082f432104a173341202cc6f08464fd8626e14ec21581e271bed2516e2cd09299de681f5e9cc03eb23f39cf7bd1bebdd406c71b049dc7144a8b6095bc7c12849a5cdb47242b1b4b8a45e6062647e8821e317cf98a151c3064703448dcdcd0d1caa207084188288558e0e007214a12300023062271f310002f0f4f820f15300a0247618808712074040029650c00218c044031cf0802620100109f49800052ae084052e80810c68a00b12da00073ae0e3079027863c00c50782802004221032822888baa8a5681274097a484fd126e81334914641a7a0a9e8225d45aba057d0469a05dd8276411fe917340c3a068da465d033681ab4155d83b641dfa093340e3a07ad83bea277d03ce8f641ffa0b1682074115e63417aef065ec52384f7e04b414ec21300d2486933848e1dcb84adf1eb9e134eeabc1cf1526e323336b9a8287743e4a31550f854954c5b0ff97161843e641ab938821499a83b0152b8a2a580454b81494b218b96c2939642157258dbbbe923fd6e22ee8664aaea743a3a2e052a597e66882c6584995a6678348f0d981cb63ca4604beb4519a48e03d8925254541404268fe665813dd9aa908af2681e1430d4c80d6f64394d40e52918dd189692b199d121afa3f324cb572eb86092e56d80e21b02c9a2a2dc7f5105304608e17c8cc5a3bbfe7cfc4402238ca712e60c1902b39b60c36adea40c7d13d8de16329892e1b14ca5b47a60299977d61e312b7fba2bd7b4dd076968e8a976e54dc961d3dea56420176ba659cb54d6ec6619cb74d2ab6677669ad5ecca4c3548b3abce295bf7a45c5486d687f4d26bad7523d9e75329bb35d3ac651a2be96619cb57a6935e9544ba32d38c6a957461a6b4b2d493e5c10e2f8cb5f60aa930edb5b4c10a50283ae27dc5fac06f908b979cd7edaccb6be14ed5972d23a4ca5a54529f5d2544b023eab17aeb2ab18134f1dd586bed46b29be551731745b6b862d876e12e957ac761e32496d0eeb87e08b1f27533e0440fc8c5eb6c1d17031d2be0ea7191e3163228caf13651478eef18bc1c9d63cf6c8315a05094dfe3fa1b1519b8613549264959b0ae6efe9ad69c18c31272316228496cf1af9ff4d12cd2e4491fd1e92bda482f69a3ce227e5ad7f1f6a081d1c4eba24a6beac49c26d223e6541c24d2c453dcbd2e34dcbda30c63311e89ad7b54e6ad90c35090935706723f9b8f21950d3773644d81be209264792ae563512c0273708aa0d11230f24aee601754b28c548c8ca4d582065fe42e0ec9524a96b7601fc1d516441e1040d669573464eb9e326dcb136be4ffd0f7a9bc2206d9ba4064da7687f58eb6ceab36f6b0a61796415a61c9962a8c70d83ad8c4824dfa0872fd86add3d1d1b1535f74c3d635914d6e15726ec8d67d4fc8d0ee880fc215d9ba4f0af9d91d8d2d7e420842b62e4e7e1646815c4f0463ebb63618d1c898b538b2618baafcacc5d81ab66eb340f1cff63e2d927491af19a36c5d9c9fdd41fa831c560324d9baa96c912e1639da0739921578c873265b7bbb26ae6a65996c6f4ce31f9d5bfeb4d8410cf20fed2d97960777a88c3ae954b3efdd54fa1a924ab81392b1f769a1832ad9ba3278a086fcec4f7de994a9b6832264ebd6c8cffed0dbef406981ac5b1cd4b730ea97459d6a96d4836de6178530c4904b6fb99d29ad6d7bb4db99d6ae2fb774a843cbc3723a6b667de6198600853364aa41ed455227243f215b5727974e7f5a5c81876cdd18f9d916d2addb71a5934a3ca9a0d25f7e96a76493f04ce179efa64be5686fd08f17461861ec21dbbfdcb75f95dc317380cb8d3b2662ac0b7139c6faa3d6b5b7747b49b8743b9b6c6fdd4e89b8034f37a6bb25f2b364a35a30961b636f5f6f8cfdbbd0c6ca0daeb2cba3e0eaba94b9cabaa7346425b215a76c0d6f2971b1a7ef3d98453f69282800a3bdc810d6396754c3768b3b996c33495f9596c7c29d10d9d3431072f6599885672f2c495151910faa38aaa28b2aa454312555059517e153459587e3e58e0322b79590b3310d56835416b1022b7245112c8a30299245b43cd6f2c02cbc1b27a2175b2f490239f94e6a468a8a8a7a5045922a9654615445932a9cf8540185cbf6164d7e56ab2eb79f4cb6b1316cd25480d14dc4b2b0864d6093253b4ab7874be0aa642fbd2a1339c345964fcbd312c5de3e825c0b9db5ad2614692ba6744212089760d66226800164df462027a3756b5b3803906b2c04b9b64a25eb6db5124b100089aaa30372328c20909342acc831f2e302057bc85ca4800ef941c98f8b146091a955df16543cf1b17087a1eecba40e237124dc63513ba08839a86ffbb21c753b93baa118bfd88230603d226139b55a4e47cfd613191d9b0ac559fb74e48ababda4a32e0f8b229de5f606597f99e5cf5af847cc5d670ea072c59d501642e59653cb5ba3a75b75b9d65151511110a81862a92862a93862a9b0c25271c5b3a5a20734b23dbdc9d4545d2e10fa2c2def4bef50cc2d58066d1f763cc3f62057ca4a67395d4aaa45a4e49c3e42be835f641b486331079bc02cb8aec212015461648945a1cb4de1b66e1f35c9a2094727a0720227d91e5ae872211690469ece39ab409e9687a56c4fa1b5305c023969a3b375b0c9920e1e8146382870d5c1286479f89e64c905112659c623e4a13c273124910c9bbd3c3c0257f6b24bb7eb0c85cc9d8f3c24f3cbfb08ae725c2e316cdb52a95adf71561cc3d6c126f009cc1902849512cce56116103a81414a5814aa10852851f0220a5f9c78b475b7f7359d748762c6206799b012976ff75659f4681e11ccc8a3f12182e4d1bc6cb22f3875870c7179097a14a54eed9599da4a446371baf5660239f9c6f241aee5a75701ae4e972fb75ced7635df5245419b25ac4f9fd45dfb494996669ae82631e7451d48071b9b2491480ef402d2c8a33a5413e9b02c5325dca56e717769c94e27ebe48d0914cab2acb758249bfbd4567b6ae55d2eec22d2c8d3b6977b39aca7c5d302ca15d0f6d8732f87c5300befe6e8dd482fb6d24f6fb9dd3b0a02397996db0dc9ebc2289046a22c4b225996a563a7adc5f0280c1b89346d67a3c41219be8732e99645a1704700c855eb27cbe5b695d7d924d75dc055079b4881abae8fb2bc445dbea3b4177025b33c3c82abc7c51655b23c8c02bf40e167f1c34e42355b6fcb22d9f601578d33401bd5df81287bdbb823c9fc2e09772aeb1613d9be6fc715c15509779d4b9727d24fa5d7d3d2ed22c8c9d71ba4647d84404ebe443a13f4fd729c4e7137d49974259800c346ba6909262027dfbb61c1dd0872a3701745ded1d9d1b1731469e40990447bb191be2191043c8a128bd5075cc90cf8f8c246f211829c3c09fb4075427297369d18d21f176b10e262487f255224f5802bedf24ec015e9b22493bb8795b12cab747b3b212720d704e9ae5cbbdbe93591eecbb8732293deb793c96d2b2ab39ce52db76e274b2d251289079b7de9a8536951f674dfbbb148bc6cb165faca76d21592e9e9fad6ad9735584ddb77e0124232797bdd9ac816ee4a87a77d4bb8536518040ad1d10109a0045c55ec3385254dc015a5324a960723cb671746f942b6e4be4f0b2b8eb28cf26e24848f494eb10129a02f88ad93c172bf4349491fbc4811cfd7d18a567c8f26534ae633d7359382d28218b6c9eeee5e6638d58321f1c03acd6066917819f6931776af4c24fbea018539283c109fe8433306b9ee66c17bef3ddcdd43d3344d6a9986e95cdad42c4d8b1ad45abef772685423596d072448a64ca952a5618d921e75d185942947179438b4c59c4be3e4756151a6b6a754db9555ef460a984a6579644ae63744ccb44b53bda20bca0525d2c00b0aad56d551a96cc964a9965592d5326a2888542215ec0820f4690432affe502ac77763bdbe308e20c3fefca3844457371752ae96918a79394a74338e52a9eea500f1929f40340ef8ae54a3673c1cf0f1ca781c7c5f99c6014d1dd8de8d7c5793610988cd47894453fa41b21c0988ad3632d46e640aae688d0c5f87a846837a40cb663428326c46f601ecca106341ae145ccd0cef0582394360c97839a695e14e04328614127f88238032f08a61b0fa09e05dd78635765d0fbb302b6a69b82294480305be08655a971178042961d8fa740a8d1666a96c6d8017ffac763d7b76a4488e97f0ba315e29e5752dcbb2e69c735ed7755dd79524229922651ac12555a838696211e9a223cc62fb86ad93af6194d6c43092bc70cc4ff6eb3e19ee22ebc1e271372fffb2908c596766904468c328e5102a950e687574a435e3cc6fc371f3aa12ae6287412893ba24fcc1e2145e9558a52843b999564e2ea917981832622595502c2d31323facb4b99a41099d4e1b907157563810e39a4c1df8e16e9b0f995b2afd88b9241210986bed132fb7d6214a3da0695064d907302c488ed7058239436059229052488c23c81142d226e793813a51c0eecc56a6b16237c60c9b9a8e8ca4ebd9bab22bcb8cd07934f045bc1c1f5af8c8b4dbfb9b8299bc2c86554dd32e3a2d2c62b5d66a792c89d5d48651cb8a9625c17e5292e677a035e3ade5c948339c54e9e8e80040276698a70e1d1d92759891b212e46829d3b0b762ada42109139490644adf8152628e45e4d2a8c11de7c6298de3f4d2957120aeea3b518648ccd179ce637087ad88780adfc522127374300625075fdc61ab204e03771b11f8451a9bd7985286c02fd2e038272543d4358b884544e6beccdd68381c0eaa39ea3837e74e6315e2769d857864c3cb4ff32faf881e0f87cc0c5cb13c06832b99cf6f28987a39603e31e5324ecda7ea13e3e0a09abf5c7b2755b8eb3ed99f9777b253650de76d77a0b4df600ec7dcfc74558f4803df721cb8bb0dee5241e063ed27212ea3de0971f9b779a7ca2ad4e94330ab7e591fd483fe203e2d8f9a51ef81f31818e73f609cbf401ced36b853e5d35b70f79f50b87b82286b0f427595ea26ed5a33dfdcce35353535b946e69b979a9fde723ba2dcf26779a0e5f9d161649c531c9cfb4ca2ac5dd5edb8ac7acded3ad71ce776da6b7cb4a36a2e51560dc1fc82231b1ac7a9e5d2fc746d9cda78644317f1b28dd3dc974996c706ee2d82919fb5f11d2893baf69a1adc5b2a55d21e73493cd85c5e73d529c9f2a8706f2ea7a45a739950b91ce6a6de8df69abba26127200753b0750f4af7a4b0607b79e3c69c132bb9713bcf635af620a76ddaf163f679eb5a9d903c73aa7dde19dca1724565ec6d7be82736731bf7e599dbd97af9c61d724308956d1cc3f87d7ae3f6115a37f379aadd19dca93aed3728eed19ec57463ebbe353a5bc3321b573bc52e76ed6258a974ec76a54f2537ae5d2155ae39123147750343151413ee54d9f495e3cf387dcff2d0e852196f354e699c5a1e1ab46d8fcd6d9c428c7b9af69ad7d45ca331f78df7fb15d1a371c0cf64a76d82ad7ff3677d1abf1e30e3e00ee6ee49b128a533df81d8b3733686e1e793e5fb79bb288ce42199bb94e1a9fbafeba3aebbc8dd4e58dedd7592dcbda48da4ba1f159877af4aee98ee1d3d2831dea9626cfd1c2bb9ff600f277c0c75d1cbf1ba90e1dbc8cb713a92e4e558595d7f396eb27c3972327c1f7511d8900cdf525e0e2a2fc7ccf0b0e8e5a03988c343232fc7ca91242fc74d868757c095eaf0d0e8e5785e78394e191e3e890257a53a250ab649ca4193e63bd0c6ed6ab6711cd7c6b1db39882b2167e3aa8b41ce068edbb836c76c6e037bef0616790663ed3bf1e6763563ee366e8d63d4e6d678cded381a8e06775bc6af70358fcfdd0a399c5973ce49aa71693c03366cd8c09d50cdd87b10d9b0774f8a134d61631bd6c3094a8fc1d50c0fc5bda932ed5ae36ea7715fc6ba283f2a7946fbbcd8b5cb631ec353e6194c316967ec9fdda1e16a31ce7087ca78461f63093953859ce9a67b3b1845c6553d27efe8497954ba28f5ba27a58d72f7ba27a58f72f7a448c9dd9322a4ca7d13d6d9d948c72c0f8908e4fa4e81ab8ab12fa69429a5be9b52e617ef49a932f78839189448038f419132bfc03a9f60eb3028475dc0556711c9f0e50e7b635132bc45447613b1caadcb639ee775a9204dc378be1327864dcd9ab86322cfb71097a3f6792d0da3d969767dc7765d18bbb0cfabcd6333c3d8e55bf5b1632f67c37027a4e26094c3367fe9d8e9d72e22eae425b28eb42e5f8e99adbffe8b56e488512a55d68c2c222b8a26b2b1401087b76959074bf2fba5449cb2c9b904727d45863c1a2a05c45b80b88da42e811c7ccbed24f64767aec5dee5a95f9777ce8acd29af2b75bb7aba5dd7a79c13bfeb1bee84e48a8760be28de20272576e95c7caed39ccaca6d363d384eba929ad3b7ddfc49993a4db9a4522e527a2048be744ba54f9cbaefe534121e0d6c23d445a94c7dbb30534a25a5d204db76d3698e9b2c2f713724512edb35c1266f4a6da7a4bbddce27157e9086741cdf706c463123018b6cb1cde7bd79eabe2c6f4eba3630e3b8dd502cdd9bfa1bd72b5cb9fcfacd459d6296c705f79672493d858724c54aa6cd77e09c36b7e6b69329b6200cc83fbfdc59b8a06c0fe9d5a7e5a873b773677131e1e9a0930ce73f815297a907a584b1ca29df59f41329e3ebb60fc9a9048847cb63de05c8e5f4d405a770d723771b8eb607e6fa6e5c70e7f26e62d44fe0ea2e2eb81bcaa29f400ecebf38c1fd440ed93a3f272bf0224b99ba10ca5553a93f2b876cf3f22e7f7239c1b00bc327b09e2e7452826dbe834e7ce013c8c1de0e6d0f7de99d05da6e71d0f695af3cd5a7c3c3d34ba9d3932ccfe9a6ae84dcc4cf026d9738487e03929796fd49a5a8657952313ff2a9a77017a304081c858444c429908878a22c7124ca546e8fd6876eb8738954a60ec4959026e582db0883ab2e2571d723bbcccfd455e272950091ca40dc076952b81bca137798e591dacbb2d845bdec2ce79c94761338e7255cb97cbebe1c2f4fdccdd3d4ed26b299c8bbdc6ee25a311f39756b7fe4274ee16e48e64963e43be824e64762edb4b58c44baa6156146eaa2c8a9537923149853ab4a7a655650852cef728a55796946e3549b39cdaabc9611c849792d22908bb786404e5eab88b48752958d0e262a2b609ca6a0be6091d2e2854b17292b5eaabc1209e4a4bc320ae4e49547908bb20a90935742819cbcf209e4e4954e2027afcc0272f2ca2690935732819c945726815ca434f894abf2c623c8c91bab003979e9cd4f6fc838c511e354557f383582b361841146185183c6cc0c7c2f23c60f461861c48d1bd8358d30624ecb08232c206ea86a70e8d8dce0c031c48d1b3770f40c48a921995d3ecf727a632eef2a5e01b9e8729793ee72499d95e7c45d37d961c3c6e1db493451dc1d95a54ce14e66295d9e3a957035e77b37f3f2765b9e29dcf9c82e7848ca3b7185dc85821ccdfc05e58ce452bf521bbedea58e9277c15b859cfc91c242a83c657d16a90bd2725bbe13b9fbb28d1ab7934b3a79458e9fb9332ebe9d2cf2dbc921395ec6ed64518e8f717fb85dac12a34430bcc8f12b308b9aed4524a4ca2ea9cbdb71f3a9cba3795e2a684e794929a595facbd765cd9494425c96b84bbd25853b55966f79db1e89baddc442aaec82e15b702721c1d6b55117392a2a2a9ae2889410975d8e821ca42e57468acde59d0b7e45f448c18487e3e59413527f31bfb7ea91a2c9e35e9e3d526421f3fccbb48bc97233bd3c89d5142661455ba9f4677b2ae46075b99d4c7639a597d7e5baa7cb6bba755dded6c784a23df3a95fb74bdd79ebe5b52e7fd6a7e5a977e372d9b3dde53b91f41616dc50de0d3cea3693db5994f096ad9602ee8adb0872549841868f616ccfca794758b0a1bc1c4f4a867dd8ba366a2308698665b79930811c74e2ea2670851d5ed78cf8b0c967efda28fb9419eb90b06e3793e7a565da7b1b8239c3313f8f4ae6804cb670e7441692c9d76596f792bf31f32fd37949392526a4ca28c8f51124e222115ea02bd4922e348b122870f5832411c71222122b9192dfa9250309f9fd0d65cc65ecf2422b2fabcfccd127667a612fbb24297e07e2ebb2b86c0960091b6ae40ecb4f8b1e2c691bf7b07542325962e72c3cf6eb2ff9c298e5915d42cb43dfb7c3302d969020fbccfc2067c5fcb45022867c599f981fe468a5af46524794792edca3bd51ad59bf2c2b5e31d72563ae0bc3e075eb62d7d5d322c2fa520195a7b4ed8ebe84dcd3c20645b9ad4f96e78537429e7719e71fe4e095310d548b1c54c9f4753298133b11de77856432948710fedd4e89f8ae902adf6e898cad805e00c80115999ec2feec5bf7412ede4e26e661f99d78c54b08ed150418820cc58cdd2994aa4ae0e4799f16385892a955df8d8fbea68d12b95b224b8c09a98866cb27505a8a7ad8babfa15a3394919d0708f11063b43c3056d9e0a544498b07deb23c8da345218cf36f7b908bb861c30e3e39e7bc2e0c938db1ccf26419c765f8d660f7d60d6dbf4a491aa944345ba342e9db601c829b91919981dc83299907bb66f82240a8da46b4894d428e2549b64edf731765ecf44932f63ee5c1f28387cb5b7e5d1ea4d7d3471faff678f8fe029efe50dc275d282210bd12a4e419f971a1042af9598a83ba5f4beaf45897b68d4449a4aff4046df45292fde92b9776259d4adf4a3fd167a3f8a937d59f4e229dba28f2d6b62788f4976ba9b49db64b0a329df4045136fd591ea49b4ea49bfe627ab697fe72d0fccb94627b6abaa5dbfd6e68db7adc4114aa74db01f15194e96dd08f2872fdcb31f747e78a6bfd0e1c8a19859f20ca149fe530f7e54ac8b1e06ec8f4530c100d329d748a834adfbe0369e9f3dbed7a4aa552a9f452b5df70d749e676d375d2ed7c88b2e9a4d74b4da877268af9d16eba8f7613ca7453259d4e22e1eed777e0b33ea49b822e4c1f533f63eae9af1b83c2407eb6975ef10fe9a6d3774445996228e2cf4624531c74ba3ddd54cbe9afdb45d9745f2615657b3bd35baea9a5e526d35d946024bbbc05c874973ffbd37217a0969370479449a412e925d235613b5a6e8af931bde5a6b790ae91b4d757acbd5beecb2fb7745b1e187db5de93be7259b850c251ee6be7c1921b075dadbfd1db05c9f454da0210e512bde9f6db4fafafd89ede0eb34910e5d24f8974edda49f4a6d37a8bebb7dbaf2cb7c3f23bea9e6e1744fb7b7fd6002f6fafb5e207b9f894401f6db4c3d6dae7ad3c5af70451ae90a34f1065d23bfb774d23fdc1dc24dcc14c7a69db70e7236f1577dadf4d26dc05c91beee8df7722c95eeb43d60e459362ae59c3a88d6eb502e94ce9adc73a7432a9ae65b42052d63b095cc15bef2bfad6511b5c552c14b346f1506370a5612860ee1be9b0f5dfafc7396cfdecbe63f78725374c62634a050f338a31c6f818230a6bf819c8c51df01d03dac4f6fa2f456b92a7e04a2675a5902d401b76cef5f7ceb9300ad2c415c49d36ad97bb6d765ceece01b096600b99cabcfbb2d6e392df1d9010062ad8e10c534c610e47bc47037db01c8fd9fec36e5b25a843be6ed31632b45c969efed099bd6d79aa641a035af8b63e35c777cc4ddd40e96b8cf4525c61d6ce90a1f5d1485cc8f017a98764545454448596e3df2b82e6b6ef3c0f537a64b34ee9515151511534e71d6133b5f07a37f1d7bb79efe6bd9b27df4dbc7c37efbd8741dc3932cb13a9ad6da4a8a80805f3c23514f17277e5f8cef1f1ad5e8e18ae61cb322dd50da2e2bb898fefe63d2ce1ca22c9d4aad18a960441c83b90c28c043bc8daed8ce21f3df6478fd56e4f96e3e9098ba5d2b366c81ae6e9b8cddba9f802298c9592c66c2e2e274beac1c62287bc62791efed1c32263ead4cb615da652d1a7e78be5893f2edcb3e578ec6f07669627c318e6e9d31875de97b79ef76ee6dfbb91efe6ddc4f7bb79ef498833eb13b318cb137bdecdb33e9d53ef46fed99a5d9e3e855b8697d667eb531915766e78eb13ad267907eec0b892e1df16521ce51f3d2b395ef8470fe669fcd7fcb690028bdbd8d537b670ebcaa16c41cbc2fd212967b7172d7386b6b6d4adef49f95ea7da40ff62a364727cef3d6959f2bd2a24d371a0b4745da7cf06c94d44a12d00519e1d96e1ad3f3be1ad5b87383e039701debc3527eea2c818a680f6f4a9f633afdd006f62f366d93a255dc2557652908c39c97d0cbb1d96df05b1a796b5d94b9d7d848f982d0051deeccf76fdcab01f98290e9af3d81fb4f83dcb70972f4cc33dfd39b35ff7a73b53edd8318c5dc3ae9fce5617e407478b561028a56d0b4094af5378597f7fb7b86bc28851ec6d7f1e7dd7aecdbf7b5d0bcb0a390c3b6d9b0451d6fe32fc871fd6110b69547aaf5b3690cef0f1f34336cfc73ffbd316ee86228db47050cc4f3f5bf8c785638032141820ca133f61fd09eb5098b2859fe80fd987219e10de210947b9df1151fa2cd0952fcbbf430b5a1e7dd987b70b92bbf7a14894a15cb2c1f73ba2dc49542a298e327c8211863c492a82e5e1802f32e9279026cb9874164e9e40b1cf2e4fa3e59132c83eda1ffb7855cc198234d7a511136c08d2c03af47260591e6193bf3013906be29a9795b1b6da5b976a5a761f14b65092e99599d6f7eab4b514af8c6dc118a36565bc95b132911d631c82f10b6d79e2e356aaf15a4330c53ba38470566bbd3bc66a2d2658acd01ac51508bb072f477d5d447cd73ec8f0b48fe40c3679db51ba8b5c86dc38ba36439ec166d9ab64bb7595904ec24636c7d79763beedebed32401f2264e1dd68014a216cdda3c2c43ad97a4596325a9128c6633067436529e5b6d15b4348df2c1410e6b76b821fb19da22e108c20a7bda9562fededf6020192fbaadb7d70bb5bccea762fb7aba25bb4de9615e3e985c095457fe22d2c0407a941b0b25156b5988cc4f566b7974ea9e52d568b69d6b29665a7c5b25a658b51562933a95d8757468d508910b1c0585232dd32335c2a093c6c4a20e1a449f7eb4cb5eb5d7d755f5566e619c68e9ae5918f78d8acf75319deead849a2e54ac095258f49dc18092592801c7cc44af41327fd040aa55ad86007796ad4b29665af2199651b41d4dbf6d8d733d144bd4e6420085c755f76101f26903d07227f67a69a947bbab43fcd23e62e8a2cb3ac58ca174c58decd42b5f8724cab42d14bc8f09d8457441fa21a4936e4e2f295d358e5b37ff20ec50bc596ed96faf6f266025732199ef6b53f7d1bafd4e57db94086b02cdf72bbce2da7a9eb6308c8d0963ff06ee03df070047939e4ab7583f8f0197a8228cbb794f6a20b8d03be3b0c19bea9bd1de5dd70c10733430bd47ac83f3a8cff202aca439de54b7eb6004459e246f26ce077202ec2d648a0d58a64c71ee3adfb7cc015f62b76c1443604aee487604e13110257d2481b21d244ba880ed58a09ead0295dd6265204e6bc236a8bcf1496cc610a10e9820496844ad582a46f5bf1da8a253279d89e62d24db228b5c818e51d92199bf134960e5b8ebda5c0786dec2be2bd58b0da4ce0aade546bccc326dfb76e6fadf896c8527ac48d53908312aa2cdc0513b7aaa609812b1b67ecc75bf6a7bb7190f5faa0382d141370858251b0c0a274d15e1041b264a8d3358a2ea9542a5e9a294c0ee91b096ff8e5c5f2f48be519821ccc328de9647ed1b262d778e1a9b615103231b24e94e32d4b8ba9d60592ca4358b6aef67863de2eee3a494c8c7d0cc731d1440f8ab29976ec5c0f26a4785d3401043b90d2e5a98c4c5fc6f2346e2272524a19af4526acabbd5e7d7ae7b1dbd3079fd81365d7b4cbf6b507328465203fae3d1415652bb31762d15d408ed21e8292eda4db4c20cd765a4b17dadb515a1a59d81dda726be10e61b9b3f06ede8d10eaecda0b28b01f428a8a7e04c11d85ce86514a92f40139ec61388846af20bcacce2044269a80b6de6b798464b2fdb53c56c628a50f3698814812f6013928a40872d0566b7a91e18fda8849378961e265280d83ab94c4dd24623c53af2ba56d767b1f1532b43b323b3b4a77e10510b6ee5139f2795272bd906a81eaed332c2408e4e01f183284abc60f8bad7b547c00913f183aa2d247547c0cd1a061791a3341c3f234e183ad3310996bd81ddda37b302161134dabb53fdd38e6072bca7dac2837953969c98631d1c45fa7647c0c3d0b5471572fed83c0553c0c727dc40f3590767b6a7fe42deeac4b1cf3d345454559e2a0faf920ab5ed7b10b435ab27551d1d13554a3f460eb777df472c877567e5fa9b13c2d6fdf36daba3ef2216508ae1e17f01da5bfc8b0512c2d2e2719a1254979cb02c55b27d91fd9521c55eb0368a0f96da1240b9bdf164a8450f3db4209173905b9febb00cc215df9dd7a45c43ff8771111f7c3011bc77703dfe10c1f638c38a88fd1c81d86c594fc60dcbaf8d4065439e83a76ddb63e32b2c5dbbb81972ad8e0bb9fcbf1359ec66b316ed9e2a7848dfc149056652b767f18062f8cc1292cc16a85d614fa663acd28c33b23f7edac032854b1752a59459fe6b46fbcabf906beb5b2c826c46d9ce6d8c5a06055803f61d4338c4f374ae967660e2dcf4cadf47327ce5c1aeb6e90cb7a70aec29d4c569d0446a4e822d39e1a0cb1cc18d7efc49a8a37c8a954a7b2aa3abb4cbe2edc09c9191e82795a2aacfa4ec451c1d3bb31bd1886ddc73a76a2acdd995f44b985b83c937dde4ee68ce6d9b571ca70f78ea4fdd19135ecf2e8678709eabfb6717cbbc6d9e9d282fde2e93b1075c2d81109b6ee4d394afde53ef9c209938e6274c54e92234618814304008be810002a5fe89012a588a3272b4e98988cae9891e40810467a48a98b8620071be5e3ddc0ee1e3287ab97e3c42a5456e108ae6ebe03e5149b20dea18ee85729057270ca3c0df9859c22910c1981dcfdb33ef2884402395814c302f33e065735ef7eeae5c0ef2e26f75f5e1153cabccce9bc3756f9bb58e57fb627eee12edf54aa999bdd4e2667a733ef7699198b758311bd6fcd1fe47e7418193ff56eb2ae329fb9f19bab157937f0b81ecb22191cab48917128e31ceea0a462433d0303e6dcf8aa8bcc0bb882397c2605ae6a0e9f7d01572e87cfa6c055ccbb14ea419445642299794fcc22a2d15a3bef401c374eb1b931881ba9404ed3269296cf20c9905848322c92cd2691061e3b9605a4818fb95813cce86258400e5e75b1251718d745876b0f172b6a72ba86bb9f8ee12e75fac4dd061b379952302858162e186382659103cb026b827dce89dd8af30512b89ad78c684800303948e2c1d61476d48a68468ec438bc962446c9e80057350e9f55d18ab421da9297e349e9486566e6f87406cf4430be032315b89a393c95dcf59cb8a314bb2a1c37f28dfb22cd8d4d0d1058c52ecde5b06b8356ecd6c02e0deccedc19a58a5dbc55ec5eec1ebb32b01b03bb3fb054ecca603706bb30a98add17eca6602a765d622a765b642a7659b08bba21a362f7f48add955bb16bca1a76b71915bba5998add9a35ecd21a15bb59c6e00a831c76eddab55ba740c89a5b53637d264dcd988d8a5dac62f7cadaa5a9d8954054ecc69a8abd1b1b1ace460d1b9b6bda5832dad8c07e36364190b0f3787ac81d8f8ce1f76e26eef0cc4ddd8e28a7240afa333b76b5cf48e515814191a53c2d2a718a09b609739c32b315a3f59913e3f4ec4e65792686756337feb8b2c6fa3fdc972918f3ceff70b5c886c681bd333dbd110cc8d1ee8832bd767ff8b33f689eba429c5e1b571c1992e10370bba64386d7015fc4ed3a4a3f6102c4edfa488edb7594dc4d299d6624c3d788716315acc3866474c8e290a1108f96c7c6631f9078527a4e2e3bcdb20cc3320beb5bb8b3c942aa796ae3be6c591eaa611bb4f4fdf265b10b71b55721ac65dd0a39aca38d1ad4e956fbda789b8a075513abccc8b3cac301df5ded3533593bced58eaa32d7ae42693fa5f2b4c973957a27936170a7a236ee54d9b8aaab993ada8bd6a2cd1a3c04b38ddba0b95d679a570ba4656d9e5a1f99d3c429733e820157363e5fb23c53b33c36de23c60f2f2d169198d3230626e5724a51383838383547dd20967783835373146ac66b706e78dc5cfb0e44bda61b7a373b98598ef31d5833c43b6cbe4be548893430e7be48c37d755fa4a97122ee8b34343ec445d504e19ce5f3a8895527222151e4f91aada61b419eafc15a17aba86ed0cda3c853c3a9c11d51aeb976a74abb0a3fcb53837373ed2755cb3bd4e7c42a6c7b9e67f9c4381a0b0ec2f9cd3b141e82598b60b84c283a791251e589bb1310ce6fae3adde0d4fcb5ddc15283f379bb197808669ca36a700c4b8c1f5e5ab44fdcfd689f9f9faf799cd245ccd760d59c2bef22185945b23e359f3868fee6d6f2a859d36667aa99d5fad43c08f519a79647cd35ef11618c1f5eb479d30a46cd9af919286945669999e576c6c1c1c1c139cb0d9e0115ae3a7998c103913906c16333bb647620323b06b988d598dd2a73fc25b38e3c783964e4778a7abf17f5b075ef8b7ca2125ea11a99f8bc7ca29751a6d15a29ada27dbb76a429518223582c9cc4375496550cf5eb7628695dd6ea7459184aabc7345a2ba528d4f64d66284d3b697362d8dbcaf0094a14ae97108a5a52661906b90cc25ba54dce60f340907c4b8b75fa86da095e13c31bea857161dcc91648bf032b1e92246dd3862684da65c904bb1b4382515b1f0b6224de8d0c9240c9ae9810a22017af2dc39dcc99bc10420b62b7ae8b99607777d3eb3a45c195cf6b7990cb5f185989e5f2755dd7257f7119e2a0eb25081b0971e532c8581e8f822b2a15b684f84271e5ecb425ccb2293714aa360ac3b0d3896ada4fda350bd7d37db262f02d3019b27cc3a977037f61d257482fdd4e885ba912c9d6bd98d344a0481908219457de0dc8e4edb4eff6773219622d12c2361ac2cb69296a30aab4bbbb31991c84fde5246a8853492949a9e7fabce649c68009b8b2244a1e394224c3a879423981dd2078995c5fba40ba5a10d7535bb7d3e1b1d3ebe9a707417909390a7fc27d0472456a9e73360cea6717d64c9a74121cbc9c76c2c5a3892ba6efc088876d03a91cb4dd7e7b73f172da0b6f2bd24739ad0617882d292ddcc1771624ff3254c3cbcb63768ac16043fda10e27ee7ce40e82dff2e9f4ec76100fc95c7fa2a4eb7da45b82b0bf30f29103bd3092805c3455198b848563fad6fb5d04cbf258963806e8f39dfde9cb2be39d78d13602e191ac484b5fef92c45caaddb695b7a02e90ce2f58deeecaadf595d31608a451f0723a496c258f265e26e661db804cb68c94bc9c46821216241869b09b991296671343292d05aebe8039a9479a611746a1fe6c10c8a921090e1e4dac287069220a78395ca489c7f138d4e393885fe2e5d0398eb76a2e1e17df4efa28d270f156ed85c779e1added3398a39007834f142645110288f6c5d136924498c92b83cbeb33885e28a4120178b5ac86561a02e6a0952b7db619d9db6945693a7d8fbd66f457a7bd756e478246f27c29264082e35a58667a451f08458525a454166acd809c845308208b1ae904b92e44e271ab960eb3a0911a398e48a66d282ad9bb4d1c44d84055bd746d9ad2520124980a10357d6fc8111a0f0868c3a4df50a1e4d13d94e157271053f8fd254bd70b7cd2c9b179c593667b464665999b4e02f10f89879a2a2fcb2759fe83cf10f9f97b3f71001bd30ee8f178607ae1fcf49866599656571421e29656358c5e8b3339312cb2696f23b11bb2476d2ee838491adc34a47c99a499c4196eb42c1157c84f01be4360c2b6199b37b5ef5411a5449669ba130b52d0af726b3b4a4b43a9b18975b52d4a9c9cc220b26a51b19958cb415539559a5b5bb2184d0b26627e59472b6841076673da1f5ceae4a2d6acdad446796cdccd2302032931796cd99cd88691baa629064fb4271e5fe8afde9a215c487b78f40e90364e8ca402f8c9c2110993bc33e535812bb52abbe97bd1e19395eae6083472209b8c27eadac47549652c3aebaa1688d1a9667bec627ec973504c206ff6efab357ac9e220cb462dddccc9c1836672654f39cd8fa4eb4248f954259320d21bc84620624159bf55486d14a19210a93d5b250714e6b4e08b339332831c861d690bc2e21cc3ecbaca6711cad9a1592b1ac2b2ddcc964cbf26c9665416b49cbf25824cb03259450422865492ba984541b96f59685f8224fd4015f8cf331deb2c0b02c4bca19d9d038e2e7ad08469656e41d4867bff828df970f929f152318d18ad17af2209451ca08217c0f6e71e348afb8300114647860ef8662b43f2ed65085073dc441f2531cc90f0af97131e4289b60487e62c88f8b29aec8345678bba13c3faf893b2e751dce5f51be1fde8ecbb05e134208219cf29a125e5794546a3173fed8f50b77aace262b21a4ca16ee96c89148ebe98552add492f2b664daf5767d63724c36ca74567a5bf2bc6f0b3e5c91e955e92d65acd24b2367f35d8dc12c6a925a75dacbfeac541e647a4b999eaa142d75de95123d99fa9496e84da577886c4576b13cb437ee309a5ae1aab4823bc855524c4ff491b9f49729ccca0abccccacacacae76f56260562e534e687592a954e6baaaad24bcab463f4298d713afdfd8483e64f2f76077d6905f52199b7d3b6b8b6dd11c472d351efdb1da66f43581f963b29dd4e482e7de57632af1cc6ee387dfb0d0b64fa09079956582e9643304b1cf44332e3581e22eabca87b43294c1f8705eabeaf34219782ed3a0ecda973c8cff258796fa7ad0a3abdff56567ec3f4a7b240bde1d38bdd315f3a8e29c40d0ecb53df0d250247e3d0d4208010220a216a2a8ecd104443dc54216e101143048e3a846a15b3ca31044e5d09a123a3a363150001e488e2871cab0a809c227e282247356247c70f3a7672e8b03c45082086006600ea110330228611030880a55b35c2f2986ab640f4bdd91efa972d501479053fcf9dca636b4f3dc202f527967104a50520423ed99f157c4999bad4075703a8295bdf4de994a79670903d06b952e914cbdb1da5cf13a0645f2cd0fcf61e0b64fac44118e428361dc8026d376d31a5236181681216a8745aea4315b28cff58a0d2270e2a7d8705a22fe10a545f0cfb83b10acfc3f26cd1072f68129d90dc19c0a585858505755a595959316da5981d3366ccd8f11a0b129d34de98fa6ee80efaf91b0b343f71c7ae52db0dbf637b998481c80ce72ca222d36b233f0b54bbbe77d4a721d34b2343cc0bd542c9cf7629ef444cc62dc23042a6f7d41d36648a4caf4b7e96c7b4550d99feecc079359b25d8e4c745095690e9b5c9cfee88af38485229b539a5fc4e9cf42f4b39353a279d34d2d92f4f8c41eeea1f54db88c1908c4fbe06c940db7695a4f286b39d5883e4c772543d0be5c1f28307cb519f9747bdf4d9e1a7d8e2b36bb75edf6e0c90a60535ea50c41ce4f2ec9df66b2565db963d7577a2b6519aa2cf6ea94bef287eb4dba158aadb53db4ed4b2acfe652d486a2b9df4edd62788b2ada57afb97575e3a89924ca7b6df4d772da7cff649c71d349934fb92b66d7fb965dbb6ed3bd0a4e177eba95b8a01d282ec2b0da26db70b92b76fb77bdeacedf4460c6ea7da29ee7ee8698f4c9aa4d3dbdaa4b8eba22ce94dd826f3f6a7e2066be7ed15772f4794df7e08c92bef88342cbfc5bc82a55dc1dab67263b66b5f3161201bfea9b7d734eda4e1a0d2492ea897be72bb88745f7a5ba07a9643fb833a4bf6eddadde875edc6fcd4a35e8fba5e51b8eb8cea301e25ace405573b6b6759863bf577daf5cb6bf6974bb3ed56fcec7618102d69d794a470e9bea7326ced83562ac96ed9db3d4144251440966da9ad83793bcd64ceb2bfd41540eaf50f0aa0e62c4582a2b7779d2b4fbdbd31d94da5c764df4ecaf0cf7652f6d225916e6f5622fd7d07be2bbd5ebb311bfe69313dc6e472d2b5db1bb372d3edb31b435d2ecb5bb4cb7297abbd8545abb75bc13f2c8f217dfbca3bd2eb4d3786847fb6af98fe4a37a6f495935047bde5d2b358dc1101e97cc23fa6c794beddbe2be19fad74d3b5d92d7de56637ddad843ba2d7b5050a62a88562ce3014304b1ecc1d6c36feba45f9cd880212a1200c18e8751803f43e5fdf4d675d9887fc1b82f94265473d1c852d7b5773d65dcf706729e9ab04bb84abee3a763d2b65845d8011ce8c5a52c9f42c8bcbb3a9981799efc007f36c8cffc9f8b33c32feecfd0e7cdde119ef6ff891077e50ecfe4c7fc61552658c9b08feb18ce37b7cf7f03b24a34acd327eb80c98cb88711931a8fc703300b9868939cccb61640e23f345cc6d02727d189897db45ee255e5cfed2f297d45f52472eb7a505f596d35b58de82ba3a20d73f9d4c3f6d3fadfcb4a263baaa6d888df44dfb56fa56c2331a272bb5292c66edf2adb06bc7deeabaf6fa561916fbbaafbed57cbcf0cbd08a33ba7ec1713232304208dbc8bb7efabba4f177ece5197fafd7575e2366e52fdb485d379de69d8ce92f739f81ab989a98ed2f03a1ba5efacdbb214a7fd946c775d28378f7487f5985c4757b1c21723471bd9e8898fa9787c8005cc5d09c770f8cd5d075ed0078f7aae8bcf725e00af597fd2991612a0d36982ba4ca11bb32d2dcbee9c2f4b70b731aebcded97aeeae207716f9c74719c5a7588db27e2c2bc5eec74d6d5ede75c98d38bdd3e002eccb58bd160ebb6fbd3b8f7a79be3a220677fbc36ec210fc1bc735b209b61568e5d212ed7389d13009f9607008f79d874ae6158ce31cb93f388876d757accf2d07a8d886b968788c72adb10afd72c4f3d06d3d8b12b84ca38a7b3e27bfabd34fe3be3d45e2cc4fddbe2a0b019212ec485b83fcebdb77623bd14c4ef61b07f07c2dc6ecb3fed67616066306c06e60e491e188c41eec730df893097f4ab3a8987741c37f056bae9e626cb53b2399d6a7eb23c1b1057868585e62c96c774988b82dc9581dccac536eeafd91a331c8661d88c0d1bdf81f4a5dab87f8d7bbf72f19f5df90eac564826d378dfd3ade5a13183611876facc8c19df8129cb733abef7a662de6132393fc8b84a0617e33fa464b6980b2b7ddad6459161fed24fb9b0b4fcb17c7b3960be6518fcde4d47dc1151bb82bafe723b1b99e5a9eb72bb14907ed944a232260a8be825ae6821421863843aa0f36f66defa82ad7d90699b00098cd60439ac12946076119327d2192194257041a696bd4e23098a8041129cc0f46ea6d14a2da964c59595a969c6cf959529ea707abd4ce1c50b94bc03e9698a24599b4205a6217c309d4e6c3841972db80c79c2094524ef408aeaa2a2a222225829c35f3ea51cdf53d230ea95608bfceecb94a5c56525334dcdfa4a399e0eb1e2470f2aac39a8a4cb9789333d0b95a211010080a000631400202014100ac582d178381055597e14000e9fa04a625017874110a328a88c61861800220000000020980d0001a3d8dbe2ca0cc2b31bf02e4ddc39a8ab014a5601c4e00a00e9b80c25b944b0cc0ca065afdf783940ab898cd6fef2ae49e73da9c5e932898b1aa7bbf840c5804ce3d97e656d3cd12cd6a672d6666273c4f0b81535d75f639f21693f06238caa9de0b24e0bbdf484cc5d37bbd44bf593e9a84f3d15e9377fc13bcdbe83abe811eba0ea56fe8691582f8461668222b3aedb21620842981b1cc418c3f010954312ebef510525374f841318e4407b926cae2c1ca0973c334ec03016e99e8a9fc1eeab5282960e75dcbb7e656cc1c6a603f44b5e18c88f3c8943c5082941e7e5eb5a080a0174566d484af9947b66e58e7f31f970cdabb22bd8430c64c16df78429e8b79263b6876b4fa9103f04c13fa01d1d77ebb02cb987c910e280c70336273480b3abbcb40484204702d0c6755746ec5b9d605da24e432c70d841ff7094fba8853e981981682454a1a6f9299e657e5a365a12f8bfcd7543475442ed334c4684892f599b64cea87ac77f10c313bd6b265030ab903437d76e9c8774651e028f48e831ba95b9b345c651b5ba505eb27ea2777a874c553b27c4ca0f812d91b8b187f53103fd5022f2e1ca08130e838c7a1709082465893744d0780298b6657571f9fb5407fca0d9cb2809ca1858f5188e0839e79719235051b6037ffbc6cde5e2e31b456879a0b95ba7d9a842c5108960807102a74dd6c93e042c089518d38c351ec846ce5d85f05be1803d0868f78559723ecd687a288e1f6b154e155eff55f4c337b17a3fca622163d5fde33e6732985b8a648f04ea17db7309d9a03690a6541ba3fba31cd9fe7082294d13ce53c57e03386b0c86064d119b240b781ccc182c8ad8f64e19d3101fa4a934099260c353a7f1b3f48d5e02fff1333dbbce493f56761c226083912d1a4c7ec5aae5c9c19432739ea6a4b4ceaeba35e28670167356b30c19f2396b3a49c21c3d969daa7a4df55f6f21ffcb9709c977a53f8039815ddf1ba71fcf0ae9802225b8bb60be0dfb4d3a8784242ad85da702383f454565f35bf115d53d1f88e3dedadb053b817d266563268d83537c91b4def924ee93b8b6503e68b0f5578a217e9ad0c5c72a9455b596521f6ec1dc8d00c6d900e80503f733856a92ee2a97eb0d4a9772897247acaff1d7debc97e98fe9b23533cd2f297cf41372ce62027be5c53f35544dc25a9a33c49074a35d4dcfebf321409f268429a756a8d1b0104092050310186d26c9d9917b107a162d00e637c13732cc31c04dee119290168db7a084b0025ff7e2f6fb3ccfedad9ed1803c2085c877ed2193a5dd88319ec299cadb8f008a89b272c801023eec3f43ac13501c4f1ce35002a10ec474c4d2af25bbb6ce0be1d491c853253902439d05ace89840c4fb320dc055dc557311c88bbedcb0f2ce078f3ac04282be9f98408efd1d39c7709deadbba9acc1d192c6807828f75eb0643e96dcc864551a80b27e68d2a16fdebdadba5c2d50c715dac950f396cf795890fd0e20c97039777e686a98a87603f046eaab21e90adc5d43ed134b49a0ad037bb9b99c6bcef988fce7cf18620409bac157199a5e86d7fd6f925d3488da625a3591ed21f5ccf3fbe5ce9b29f0ceaa6ca7039adf0a1f1c384e44b4ad5a538e2ac39be5bd097ee24ab9a9ccc7eff64c1408777c25b4c80f6778972f68ca51c66bef2609ca54b30b7f19bd5c722ed8250298b854e1695c10b2feee44bec56e544f3007dc460dacbff8ff00af564834a27c9b3cf13f0fa11f7bf589fab8d0040b2afb2b5f5bb2991a029fe4b3a37307529f79c53116c07096aa065d9600ff0e7cdff3554892889b82eb2c04c62ecd02a556365701e9d7b6c6ddcad2bb68672490ee58e69ababb27b81e4f95329fc8622a41408d8f44fdb5faf443a45fc05036b95098227b7cdf188eb6a1445e658f5220645f401a6b5459ea588e86f935d700498be2af428db298b59eb815e34ab2277302d7d8c98383ae8c4e3637c5e1ead933d7b40c1e936027b2fd80481e2b9352ad2dd057984b943b8c2606f7647d90c93ad10c50590a5f323530115df9fc0930849063c43aceb3f45960abe50e8ace118973cf745e379f139335dfa84170db140545bd90f7c3d62b0d233e7c1e7c90531d1949ef6e9970b88d84e26f57f14a8cfe6751e02cdc023a6682546b9607121265282275f913da00bf3df870bd6e93e0842671a2fcb34362f3b69cbec43b0d660dde84bc8f7ae2eb9ddffbc5aa5452225279d038ffcbf3c5cb6a60a0824eb5aed6bec334be068b2fe36b580a0f5c588a2a6b4287df53e500c1d6e34f996324067b668f1033f29008ad4b0344c1cfca57c1245e5bfa209be08dcb574b6e57d7e649115945b9eca7758ad2574261b5d0034a98940f1e5dc90f4fbec85279f50cc7414bd8a5ba4936d4c6729bf354e3d03dca888e846f5e75581c90d316ccec7141d8c34bcd74473b9b5a6f843764efaa77cae3a736cc12121ae90e47b4c2ab1bc6b14713d5246692fc7acb7a103ef6d8883e5771e7a44056d29f0f6d055f171a491522204efecb14d236c7c7e318a318995fba05f368cbfacfc75abb9d372f9ef29529640c2d93697eb182540aef9e2c0994fb09d62f5baa06a11feaba8eefe0e71268753b9ece874b8f1052fe0d93a530905fbdd60c22407c69c120a111646fe1caef6b7226c2a7fae67fe745b1e1abf1f8c4ae88a5f584c14adf1b8aa182918c4ce1a3aa5b00b045d913c04f66110377d7d3084b8a2c09ba30ee2fa9e289c97ebe167806ba7b8dd1261432462cb2066e1ffcb6d70187fec888fb266c42aa53b62c9c7cac829a887f9e02c2b7555c6c2772f65383a1d2a6638639dc1b4534b4627db459fb4f91e83cafe231191f3e1320bb3b86b77f76e9a056ccc8bdac3df102a246c843259d9444f3285e2c707b145fa89c22afda8674d817eafe73d072ac89f954c7b81c11bcfdd540288f58b4283406a2c8d48e55dfdeac16e11182304f2dbb836b97edd72dfafee99bab765e1bc2f9af0c6d3213e34bba6d3d3dc3111545c1f131fa8107047483ed70cdfda9828b2014b7c16210852bc20a5600200254d857004b5ee4543bb2b421c3ed4c8c21a6895e237df4e69da9cccfcf8f998230eb1ef0f789a86938986ad55bf31e7cf160f7da8d261304a9f4d20b599a895bccfeb78e9037b1800abc781aa0b47fa1f6e0e26b7ea7e4f5ece862934ed5ae146472cb3fd2808841554b3e6bdd924f03625fc021b51948169821cdee44511a3d5c1e202dc865992f870f65082e694867e75a87ad5cbc3b0639ab5315700fbfa746d59435319486ce7f9a7ef8cc614c1358fce265f32daba3db14eee87dcaae736cf97c5ac184236b2974c852e95246950d5c512ab4d7ccddaf79b2b8aacdd2b0f3532d6ba23b1232e77ff6aa24b3ed4ebe502d5927c8525630b71246c4fbd59dfc65f26c9e53d7e88e5b801d451674d91c89ad589968dafd9f91604931e52e0f5f75aef5562ea6cee3870c5ad28c4e1cb2f6bdc202174f6fcde2813b83f46e96fb0ef58a5ef25042a8351fab77d4ac0efb1afaa67bca3435c1723a7bfd5dccf0c3f60c010fe16635418d58b26e882d79ab40e75851590ef5c67d631b0e4163d9bb33cd1f729df2910f462b488cb6764fd67f6f97cbda5c827f7608f6838f880c23d49be44612782a984885932c1aed2912374adf3799ac36297a3f1f7b75dec57e6db29f625c0aebfa6dcb619e59040c72cb8f53a46a973fca9ac6f243fe58080acaf090923f87573c0898f83c86383b1510c130c2b4fc3bde9009596e5658cf4a3f9c255b10efc47c94475a798958734be201c4744b37709bf78638116e00d57216df82445c4700d98a49fb0e78ffc46d0c07f2e79894f4b4f1314eefa9f135992793187db49625167804cef03966ebddf51dda9b44660cc3ab7e9d7d878ce3efbcad5126e84955ff2f2c01b56230c79bb17c3a556920dd6c5c9cd62b468ce2cf1879576eb4b82255223d65e75b5643f1660bd4e5a489d37425319ec6c58d2c8b1bee62620a44a660af160c460ff5ad6e3d076cc2699b28c62b6dc110b8ae835702d2088196c8b78337ebab7eaf8306a73598de36417b97b7519711e177c9efdb5620418c0a7b395d1e120d640421b5e048734f62046443c1ec07e1f030feebaf12a16929e251cac78fb106d903d5fcfdc7b9841b7c8212e796981d5c50dd377f6418406ee7dea7eaf11fce06cbcaee0cc5e1c333850269ecd2dd0eff650c40cfc5f2c809619d0574e5b35101bf70d64261df30902476df07fbf61a4e6419b9d04210b45ddc6d25da24f248370b31adbc7b57abca9536b1f4645fadb2117945233549032909dd4d9220a1a42a11ae14be9679d14b08329cab12fa33296c5c6bfc398adae84de23f33cac373e86e418c3ac9ca613afb4f99201c03998cc0e9ed7cf6d5c3a219b140427b53ed18cf9d4a62ea76298cda2553f6f907a2ad02e0c15aca0b90f4014676efb30920148e9ca0a11166ecb92c581e483e005a5e2bf84b4f47e2c76173465e0932e24fddfc84fcd3c03a1bd94a1210bb7c6ca00fffae67997f60034b568d7f5e0ef0d7123929c9c49af84a48e606f07897b650082e500c98cb0c5657be16521d52e3e815edb01f573a51121a10721c7c6495c508642a4482a725360970e27977b6cae5ec1b802b83baa9f00fd3436f2e533c49415b5846a6277852836078d69d8d26f9185720f36cc6102e931b32ea96473993beb25933fe3da29f0901d0f0bd297deff1eda84eaa3f3fbf00454500e03a1522e14122a60594ada142fcdfdbc3af7e6be04c95066ea35c62f73673c8f7b4470963035cd69152b1ccbb7f576d8cc975e635a2150b3aa216cded53d01c9ed1a3469aec2bda719c938ebfe6578d80326b723601b9ada9a57901a037405ef61e93aef2cc3dae8f8756cd092f1036b310f6aa432078398c04181c23703eb13d0e2bbb2c47091e0377a53635a40b9a992c9e20f1c22b81ea7bc1c2e60fca18c2e5bfe8d360e1bdd15e4c32af4cf5bd052cc2dd842419276421f556f47214e860413434a7649c1ade447d9298efe404267ebb81906ead78383e47aa50cdfd403e828605c1003a7bc184d04041fa8f65d730ed40135d3164cdd9cf221073dda4e3479667bc51706907c0bb617e26f7137e40a63368050f8276da3a07e4c8ee3bac7539bce701eab70c0180142970569a6e04bfc1810db1b0f004ab6901e0d51d3fc03cff50ce6a3608a6b58ce483b59f5812494fc405c85b79af548ff23e5b0f7a17561881fa59591ca6b1fa0591ba17a669e210f78afc4baede826612d7e0733220e35a24a4da99395d1d840759ef125b734f36c93785b663d6cabeb9d7e5096da1ec8c46d78e4344f2a187da95a7113d80ab7ffbe83f859856b6d9ecd7a6dddc960b552f74eecaebb462b42aa16c394b81ea68e2ac83eefdca3109e4434a6da483af7a9c15da3bc5854807ba7f60d90025d942efe6862fc4a8af9d3597a023854b79286e3f321f8e9b7db17e70f293a60e59a96a9d93d8d8e400f10ada357ce93b0fb29c1796f116c71673d569f90d432d05a2134f4427c0417229824db24e7ed876c705a42a493e4e85985897fd960506d6eff0f4c0eda91130584b627b67f6d241bc3463061a527300da2ad79a42ed27a81961934e2592f0a6493836df1a7123f7f55904c9ee609ef72ba02512fc593c3ab1b7610b8aeb946f866b6e322ee3160e63ff144da10503aa05745478c24a46a14e9553b4c79b02f6d1bca76e7e476110a26ab2be6422899704cdc398deba537fc2553457afb77064481c1d53ffe174f25c7ae0bcd5fdb3188c1576952527ff671caafcc59a04247cae2517f8b1ec96f79fcb6f926d7852741264721c390272a49c6499aa265e04212aae224f4c0e946f0b66d4dc9218e3eff0d85f8edb58664d08a075505deb674ac132189f7458ed36a7532f0cb381a6b938a3e372723126df4a3894ec3fd556ead4f93e8d3c9ea4222fb2b280b0e3ff0df8dfa81d40aa6807d4ade8822c1aa11506cd364c236b4ab0e009718e8a26d1a18fdc19270e46fe29840cea3c4430a1b2554f08fc61621bad300718c4861730bda11380ce201a66843e98ee25bc43b91fce583c4bbc94784d1d131d8cc2080b945da8e76e87101e1857feef4f29529fc3d61b8f1352d577aa3c8985d51bc1b6c71852d45f5ebd68bf60834807e3289a7079f8015904625b2a409610c9c015ed7602ab64542c2650c8f55789b12ed5c35fbac10ebf83e3f2ba9abfd321ea9801258b9eba2a82f77873ef81b3912052e2becad1da1b6fd14d3a17d0955b826594d522c475d5e314de83c14b235688817ed2f34a594eb854ca72b90c82cd3775f3b64306031e248b31f12d43d5228cd1d0363539c401dc4e4d9ead6bc348e923120ddf22810a3844eae4129d9b1cd146cdfbc9fc8a35f7c8034357e2007fa0d1fcb38156cd41fe1a622327a210c402ab6085863bc23cde04908c3065534e4ec720ac3381bdbaa11eacecfa067d3dfb08c7220e121033b56cad2a7601888d73035e1be958f34473d7b1219459817b4a7b14484b053dc38048f4820b26464ff7e31c8b25e8d476784e79947d2183f990165b096a0da4a4c1ee25839546beaf27693b0eb9603fc8c7600ef794d532710df0c00348319df4217f4276149f39cf3ebaade38e9ee2f54e592828e4fec94958d36a30c46cef746ab781657fcf74710448a4682600450b9a53ec1e727b1abb88a9bd54c28c1b22f72b350b12f559ca3c288482739a94f572823488a06a81502c12a1369c45d681825d85e40f679e763c13e148e087fce08950473cb80986874f73c4a20ddf804f79edd985216ee5edbfc6c862b3f426611ba44ea9ec7a54ddd0b6e65742d29aa46cbe69298c888a00eafd759a9cdc18593968dfc0eea8bdd9c8422a156a3688ada9b4676999b780099705cf56e6b92ae84a149557aa9005cc72e612c7e8953c035fb00b7afe2dbe079187e018f750414e1030e502c357b4dd5fa20bcfeddae1383142b94422af3b0ce26564628656f45f0bf7d4b3767f94ad7e3fc1eac3b6b63a293027fb136aef0f7b21f182a54c7775417007ec22213ce093b4a360b44518f1fc3308a37b3ad8623171049cc25bff1d038b7a6569bdcf75dff50542c3f63d6837c34ec7d1c467c50c93025079dd05bb3bbff90d71fd556c62e20ba80f35416088c3068e6df19f7b4f4b04e7b75e492a311583c9ee77c38ded5929bfcd754cab31087320302a1c124cc0000cf01ea6403baede3ac57c900765a1a0b3a96375228252ae1bc5fdfb143b8be741e40d9e7d3cf01f3ffed0cb408cd039e7e00259e74a011f509de4061f802c492228af8e07e1cea8107aaf94be3cb9e70f70fc072622e0f99aa0c104efa056fac954783d2b8783be76d3b0621a7065e7834e036c3d3391172159b014705dcd107e8099ed553301db754484160f441c6603ee6bbcb367c57ee4562a93c3dbe9e02d6837e4ad52e25ea327b3a896c10ab60c48cb8cbeb1a55977c791719d36b57df4e1fca3a9fa6d4bb49a80eebe7d33d935e17b9d34a0b237bce76c425eed534abd36816fc476f3335b65da079d964daec405799cb40b4c4c321a0e5422b1cacd8155283daeafe6543f757c4dc5d713173908253def934b29475f03984984673ec17166bfdfcc08bd38d46322b552ca2d5ed207fec3e5995129e8e0ffe75b9f6374f093347d06557d9710ce23f1b5b0515a35d5e86677f16d086226b13e656b5c0909364faa0efd629b770e9093f2a2028a03e43ae43a70e477a105043aeef9321539d278b787dd22324de7ea728f717f68c2fc49e68f876c8485d74fb487c15060d97fb6def8fb31f0f5563593abe320a2f79205c02d1daa7ea73cf2a920bbae26d2a38432a1dac3f4ed7a07d71a8a7df6b515877a68b54a0b55e37a5e81015505e53cafe0e955e18e14f17acab18f32a473f19f24afe7b18b07626e8ce445547bb6c912d02ee8eb29aae0ff17a0ef84fbcbf50b4548239669f3e0fbb0cb48d90d2f6ddfc5221a561c8f31124acd639c286361e8a02aa6a7c8d94c687dc29be7ce2eb0d964d1d1499283d3b2787b4b7a744993762c94c3b11beb188a78ecba658890286f96bda4a78bd8beed1625029543189ad6d3d957a77e23dbbc4034f6dce333530b85a85186b2956de320462241d341c18ff93f8e99f50febad7d8fb347da60703a511b11c1d3a65f293cc3daf27f70ce864f3555dfdc9e675355fe2ff2d13ae0c68fc8f7f15af195774252801f5ac4480e1e46c03b531e955c39ac5a42c3d1d6e46addfd4d597f6ad5abe5324d949231e6902d87e8bc786d88ddbad606be7d48b3bb97a67f3569af22bb676ebd447246663c2a2c5e4f5951214f64624b6d0239f09a8a6d9fb6a0ebb2cf53173146645837810e2f8912745c26fe5c53052209126a9115b746effb4ad7115e1317b29e15ed2cf6f45a94626cefaa9ffc58921e291cc2d8e92d3779f8dd0b3e52387631acc62f2ec16832bdcbd1259560e140b1a8b3cc77c1d9b998409c0d7b71383ac715419ab26fe5475134e4303101f7f1c0f7d1a59c6b0665c82d99a0e258dc1e9bcadecb44d139a0222f8a6a8e3326c7ae3e5f219327674747140234484c772ba229320234d2d5c7f2d756119ca43ccbe196c82d5bb0383504fd932857b5df7d1ca28243cb635a7d3708319ef930eb9d449217bc72fdc254c411312d707cda52ce9a42d48169223dea0899d462cbe40dd0b312c8c3dc2ae0ea29c6dc53fd4c5d30ba802ac5f69060f4f23352bf41abab01cc3e822e6df5e96788f28a08ff39b50568ce4c7a6e2b02b3fce2a2ada46fc9ed29df0674dc37ece3e8ce91f2a2cb4563bf24295e2b0a2837f91d3bdf3dfb19c52b02258b1f6f5464f5597963ee1709a0ae47bacd97323c3eb69205eadfb3b4b1cbd9e8ac7ebf85f754c85735b2534e243b69309f02efd2dde95dc849160ab6167f458863565fb66a741bb716e8769d2b61abd6ddfd9db369db2e9f6b8b95bf4ab141ccdf74833f6d788e92ed326704fe9b9ab85c8065f6a5dce181987bf3102ebcadb50fdb37d77547c29b7c618d1ac72d30f1f61d9a56c8cc0820487fc91708e72e6ad044803fe0b29ff50c9a7c124ddc044478394d8230a6b53017c53db506f3991e9f8ccd4911b966d5c1b0a69d7617080d6c5331911b4cfcfd3c96cab469960c4afee4cf52af4d181583dfb8b5e717bb1a282bc8a1a4352ea38eaa78d31e293f8bc00ee2f5ef1004949838a184ed762095f51f151df8bdb1173b6e5299ae33b9d401bd784e73dff4ad6b87e52ad93ed509b3d9c22e985afcad38809891ca3e4c74259930eb3ffc98c262590f76021834a131d1c97566a3604468fb2f47213a12846e3a670a45ae3971232a79364597fe1b2a6b5701c7df5c782c7c5e5cb7ceba2ef55ca8a49b16353d3bc37f0fe2885de975ef24fb16d9d4976c317b9f7fa0d4d5c9ad726e079e342d9f065672769fbbb5c6b6b91fa1b922e55c758ca9d9af5fe0623b563cd0eede7a0391a965404510baae9c73789c6df8c48bde67c06186ecf7f879af63e94fa3e42c473fd6fca54d414fac0f900c3a4d79de60b2ccfbf095391200ddfc1c409d0ebb215ea48f52d4bddedfa7a72ceffc678ea49178b07ecc80f2604bea344b566a876d4878c2306eda60aa29faccdf3986ebe75a363b46735b7ed9f79d5344f3f9b2ec3925bf1eb838c42f88f016dc1bd56c9756b13cbad7bebe4bb7472af4ffb19f837bfeec62e6651277732f7fe4b62bef6bcce9eecb6590d200e840ae2c9c02e998385628d7b07ecef5f5470c896b8163605081529303509cf5fe99bf5dbbc7d098ba9687be73240803a3702944147b519a56d72a441f58ab74d102ea366d33bed478b7792dba5391979602a84ea7b6b411ac3e705991e3ccfba63f66fa581ea749348bb4b133d021cd9cf1174b2fa92606f0dbcfbd438360368aaffd23c057e5db6cdc8041b1aa169153b51958c88c01fe70f8a82ac37856c4543d433cb22823cbc12d6087fdad3df731672c961e155621b3410144e740bb5151bb762dc97c86a27ede97b75752f1aed96edd0aa45d24c83fa10dd22b8bdd7e54252def9d942b80591a7f80eeba06bd8c82c681b08651ee38d1837e4a5ff0a14ff64fdff518146384261f4bd681e6c0fd1f7e2475682e1697858a1371e106006c89cf931039478a11c5fe92d2ba1684275aba9109abad09f129c92621c40167bb9427e5d1d234c942b101210236d8696271707d5bd71930b0003d8f2f89162d3b37eeac29bcdcc44335b4adb281885ed85c9ea60e752d5b0bb9532206e7f1ab0a9bd6a709a38b399df3280b9c5185d908a508553a4f1ee15e3417cd7d3ae401b8431d5edb3fe9fba5cb7288a6ad6cea30a0292bac320d4a8474861cf55e153eb91527da8f93bc7764cb11e811900952cd0aafcc9294662ea6bfa138af175b6c355a4f22c2045337b3dfe11925146fec6621d8c300aeb2e9f32cf63ad4ff31d52801d28f087aca4df9a9e835ee25d8f0f2b138490a4e9517c839e299efea11b5d2387a68c918faf3ea20bf8fcd778cf15a00aa84bf4961da2f3b07cdec4673470197b5b640618f59f7e705ff10bd6bab26bf8c344de5c6d7cdee4e6e258147679c63dbce3b783a153b6cafd0486dff6518ff765b6a45e59224ebbb5126d5ded4a88814eebb8e01f664660b46bd64b4e5c5851bf93506182f05f20a90de1870098dc8f16783fc713a445f76d35f49e6f9fd10a519f06b43fddca4ab06e7f17b019b83f029c7a713bd45257ee71505de1889a57df5ed89c11d1e7c25eb19ccb13d857e1e312b63a1d82ff188e01c858094d537a201780af31a5d0fe80f1460f7d3ce49b7999bf49fdf7612daf59664f6c046977488816cd903da8026234233fe8446f54ab390dd2a78c7b4a01574a11ef4c2325f1d77d2250f5c5b54c7bdf64fa916b3389b0f31459cbf062d4a756832dcf16e4b6f68457001eaf1d6fc0076a86f139d872ca3926e12e57b37c5153906a63a8b5750b3106569b7b06f1d1bf842b9f9dcd732743c4c491e2e02945a825333305b38b41c78afa4bd148740183dc75950176f35041495bd35012f00d52d9f7b517d5379b0550ce9d049272424c269bfe15e4188af2f2e54b092352cbf742c5e855efac338e20092580a25530991965780e9f0cdb3b0b793191d62a2fecfa04706684690eb18207f64c1b7d2b39d234a59385f8cf760688de8db18f364736de3a5a6fee58fe79ff92dfd217b7d53712eeefab020e895971e10311b8e525990c17ef28400a8827f491187357a227b62757e2520a639d067e5d48ced7927887b7203d74de6d66ac7b2be27f538077211e199bfdc963f1e1e5f890bb6a84bc740b7d825e4ce1a6a347c04d1d151c3b56ba5d3e422d50547b0acb2413473ed71d63ea16fc7b9e534e753752fadb390e379a3a8cd1a6baf15e321c38e091d85b8098107f79552f41b80b36a542c5496ddd59c1815df9bf74ec6cee39442eeb039e0ed651cad4b156b8fe285c2d8dc1257b48044232c1e8004909f5bb4ce4ca7382c3725be491515b66299974d4ff2f6d8c6f70998e343f99258c61c835a434e39290a473a200d0c6702fecf70a6fc60f6df3a80fb1239992f3f49f4d71877e45f65b175271c4b64eac49b04aa7e905fde077d6c0f1123a68553a8f363db3984fd9c0605393ef45365d8b575184098ba4502ff1a4e8c3c85c56fedfdfb08b0cbd8011c37d989f97b7d3bf1a757ab1549917a8ebad74a6830dc3b10a8fc690c647841edc4bd649a2d8853d6a405f3228f835b33481c6e484fe62ef852bc6d6b258ede634563d5a4bf02efacb46f8a0b1345e8cf1548203d99222f66245bceef8b084ddc92d32162811eef94fdde8e09d465638c3a116058a4b37605ea4156933e1876bec7cfcfd0052f075d0e983eac060277e4e0827c3d831822804c2203cd37cbbcbf6672fcc4a3f4ae4cd53d859f99f8dc1650d9924cf92ca77bc902ac67a61a1449da08b8ea92a38629e8130d65b6d4176c538b8ec8b4ac8b550bb459d661e42f19cfb23b0f7d9bed4d029d425050c9f2fa1e206652c6489f44559954fb9bed0e882a838da442d34653952eb455fb2a774bf7249c02557319602777b9c63da92a13845d08e3f2009011eb45071654e5936ddc3c92061655d7f440d97a2b2cd53ee511bd47b3c0b187b566b8793e8a0d9142246c9141c2c6a60eb629cdc117687de225a716a2489b9b163b7d53b6872424b3bbd8bd114c9f664605a3152f56511950b4f0447eb5ccc1e5ba1033762c71e56e54ae369f536cb6877528859479e00c2ed692b51cb86239f446900de5ee82bcf1262932a3993144ac89af392264c40401a16a068a307ffd41bf169aabea8f3a875d7664da31ede5b8fe51940dc988d5de9a00b08fae9c56d1275265947c44f43d42e03344d887fc3eb701db44f640a6aa08070a9103d140b6a91886448602ca7d90ba054551fc4907f064a210745008d25a3e11235320e09093853c1616c40bed1828f624d773e4bcd820212374c59eef79bc2aa69024587be5b92ace741545a6006d9bb611422f1d21ee6bc7008fa0eced1d7d871dcb5c675d0acdc8c043c65e40491d6e603cc4176baa3094be381210bf8f2eaf011e4e803b81d7c0aa5a1494f8b925b51e12cccba246b63a832e77f68a67c2a4a3d3e768adf3eab60f44329cc24ba523e344ca470e1b8a4023329deb404acb8a1bd76c15df41164007435529c8d38c285bedad82c8707865a41b955c26a6285b355896da27bc09769a0d14f2cdbd36b26884f85d08afa6b4168d962a11a9d59b508758e831a89695c35cddaff5598c8a387fcd1714a2889f3b65cd42f44b69217b7befa5054daa07a5caa3269573e812587d7f538d0f55acd7238925b654ba9bf062b218665089a628e8c8ccb472fba2c0029b8e563c51adea9d9c8b80bc0c4887d70b7762abfe496409c4179de9d75782656d7906516c569fcd252cfdc1d1a677f34977ea286e7e3db224c86f713bd8dce028ac912af97557f56f1b05b78d15323b6ac1c34bf4ea01344b0f6c99bc4b2febd37268ab486346823e0e6a2aa5383b687e934d4f2a2416b09e5d7beb6be07102351d0a8c480dda261ac2530c7056ea0c94b2c82060bade67a440d4405e37baf710be2a4fd7184013934eba51e6ba48e68c594d5381230a795f443d14ae8c85578a8232109c11c794c2c8fd77ee587ada8d38cfa54985c570b964d9035daf188f69afb6e8a9e0fc604d8c7e50f951dc62b045b1fbed4c11921f6f32402959dc436b5fcec18efa490d45ec9d97f74e6670a7c3ce2a318716bb8b15944d39affc2b79953156b7831e2b6edc321e1866010a6ba90331395241237463bc7a4712be5515c1e9c8fffcc23401acee5206e3440877081422035f4b58931ca13aca86113289d7702384adc5e7101588f07b1d0f6259eb8abe42957d07a7cce3f753050fbea80256b5d8d473ed5b4ba429fa2bebefb1af7b2dae1e893aeb7c522b873d0589c6f30f78d25c6c3f4edae9a8f87ceabb74680eb799fa84205854ef5319e53ff1de086dcd464505e68cdb6b959d4e3483e14df25735234f7580ee6f5072f60c3e1e89689f233a69ec8fabfef26b00886f83600865b42846e57dd6414ee4be550149359a73e6a83c59aae928c5533da074ff565be9b1eee6b20bfd17244d2721fe4b1a35ca4ea6ea16440aa4f3205426cb9d9dc057be8ff8e53182fcbf64c0193f8a8b9e37227eb1f545fed54ce35b4ca113e723b4d5d64c3736ab30e2400f61d655faf4a43b66b470d1d1161367914dd0bf45f39bd9829d7e890122fec0478fd111415c90a5e209481bd2d823719cfca23ccc69ecdba1590104339cecae2a06ef3c197000dc7d8357e48cfc83c3912376410d3afc86ddba025be26794bc50a736bfa5fcedaa63a14cd2b00ac6d43aebd98c66df9a1211c87e6e8d2831e6d7d97cdc49e1e3e982584e64a7b5feaf56b54f9eb575c69ae1f4ffde275a9b45641ba8c18a909d7b2c58a2b47ac113daf5f49473b56e20aaf1b3390ce7c128ee1da424fea4d3b6b6e209a2fe4e2be8fcf59829d0c17b69a066048e15cb77f5da92b50b24bea11e640d15c9a67f95fa6464dcdc585e63239ab7ebd73f81cd735677aa78e42b3ad0bafc93b92976a11057a8981aae981f65a57f23205f29fa7d2376b74f351a89911653d5bf0e0d1b82527a7e6376ad30ef8f7a932d5992680ce78a3daf055ec4a28b6377e18ab60012ecbe0a75c91b40fc3b994615b6c4125bcd3eb321bc24961ab05516601b66db7a103788e4f4a6d38f414071b337f41f5b67dde1a2dae0d28d65981636360f5f4dd71d5dbb5e0807fa9bd372fa0588e0a7f08a39884052acc10ff0f3680e015d0b6321963581cd0cd445e91de94410e6b4f7fd868582f26f07b497fb1df319c70a2fb0d67535927a9e3e86a134a987c46ff8b0639a2868f60d65b679dae22254f4c55f217ad9ed25240cbc5553ed9615714d25f56646d6076d56372474b69a182d99af67c08ba21791a2e460b87443832e01547a24a2c3e29f3c6e568c9cc12b222f870e7658d2f2896a5960c89cdb85f74ff64541f50945cb46b7cc090934e001b2b394c53f7498d9e62ece8800d769aeb07738c0f4edd32e2ddd95a11978488dade83863d1763a1b210fbbfd0b8b106bdbf9b30aeade75c53a3cd0501c4f37ac429358a0db4f2b7e52624275390d9c2075e04c0c0f5dc1d973bab5817be35f4d49c3ea9ef6e6dda6a77547c46539b97d89bad32e696251481f0d421e5e92b0c60eef8f902ec70f242c72e18d78530b677cb208345d88eebc3823ed9cd4124650ce1b37e617890bb01a7392032194ffa65156d2355ecd4216f4b4e0d410b888c71977929bbe8f6ef037249e55cfbdfc2c24b33f11703b1fe63e4ff14e86b24de32b2078659b01b725b18a88e57a4af22151497f1f306c4dce0a659e129f36411601229b9caa0002b8d0d076c80083d2549f49a63b01d7e2be1a719ab0a51c18b49bc8d2239a97d2dd9f4e264af326b751e3bb5be6229f6f8849d644a9114d5b85f42ef28b23b3830fdc54454785907903106afeddb2be10b22b8e1239c5ecdbc44569fd29502ba26b2263ee945f0c36dfea4e2879251b45b537aaf26e94150e3730f4c6d764e6caefff23a899a08fae778a7fc66a5ce7ada4af55f8d7c22ab4110121e58c65a35cb9e441169a60ca2d4f0d4cbad5c8db95dd2ed53ecc00736b69215e8af3bb22432e4ccd34f269eb3c074848c89a6ec1ed81dcb919403fc9e35fdb725e382e55d6c7230fa23038188a209e0adb8aa2028992d46d4555c1580672f6c60cc2613c1fd5d6ddf1d52da11a314e96be55e063a6cec43fecf6d8f6afeb06667320c59a3976d1509f11e7cf036614acee53e62865174b2f182e1a80c430cb36d7ace20b2b9603ee26acb56a60f035a176c97347f5323cbc878bb1aeefc01ccfcff92da7b56b6fa6b7a9d268b846fd843ca684eb95b7c99696585cf42f9ba33a079cc20e4024b960689f659d3da6df491bea0a848ae279befc921c23d2a618acc36c93011020a23ab9f7978c4dcb691ea668a44f8e1d93aba3794623e158bd18d5fdcc9755da598e8d8dba445c462bcade1038ab28c331996a258adf1e9dce5e6342cdb58b23bf458e5ca38f801bbc9c720297ffd48e1a10604400e1e39c6008575a56294db35cc402aafe4ff3986a326315463b98642df30b8a6281b6dea1c704ecb44d3010f32158353f9c6a61060fc8437ba4589697d151b0226d77c43436935002df899d855a078d4c138e9c7b6049c4cc6f676c12b5a2c805dc5b7c85684a1120d5a46a1f8933ffdde03b663de3271b07916c8660f049e1bed00aa5abd169e7c03ef71e2311055886e5e01405ff49d85c262bbe3005309b93ea065778e5fd1f845f90c07b570e635993fc874b106980f37f7616c559cb117a895cd0a94f7b3117d55f59306b69e34c934672a2445e87b0c6b086aa0e2eb4ef098b2c28c8fcf159bfcbf0ec568ed5eb0ff3fe9b0962b53dc07e94b7b3a53190672fb3a0c92441f93f0296b7ab489e9775746e6e67321057d3c2e7fd0136cd43549a06727b81cc2aff8422c39215abe0d1ce03729e5aad5f50525684e71ffbb14adf27a9753857aa668d54756d46acdf044c08f37a74d48ba39316f22300de585f6a2ce9c22c9010fa4fd8a9c4f3a28ea9c735a42a7975559271c4da285a8f7bb927aed584e85f9d16b7aeed31905270d732875882d15a727211a1229bac0805447aef9d0bdf38de74a59cd25e5478e8f6911445b52d16a9d363572f12682d9ef89f2753b4ddf901a3c028b2d680c02791854f356fdebf2c719452163ab5d0b679c7973596f1eb045e35797c2dfdda293842f4f3690ef5063381b7ead42a68004f8fa30775e17b5c2e34eb9c8ed0c90c40330d5c90eb70553f8cbdb27c0c7332a160a3a21194e20524d4ba3459add05262f26a9d4971be7130ce7953c136da54ff97c1e4ad873c4778561b54d52f2f6e58d381693d2e8689e48c8e383e93279cb18364d6128a3850e9d8e06a0e9452abbe7189aa570d254efa55400013612c225ed6c6ca911cc78c138ed6678205146b31abc687de471be9a81e03b55bcd0d5a6bf190481b0315f4d3fe00d41e822c815ee62eae977b5bf2e590a15336f91bbd09b9f54d78aa313d33b29058f5423a9e0a16b28d91d4a43ace8a85874fbb9a5c9919e5424e24a1e590e992ab9a94773ecaec914735e9c18a3a2e302a009b99fe1b39fd09c69fa78f99a3ed8963654a57c9bb46289a1e5df95ecc9698aa89e6f7b9f2bf10e6c5a3bd082d339161cdda78e642155bf5e0b4d564b8d4ffa761d3e43b4a73e129d4d42397e5d79215fbcddbbcc0a9f1344f1ba856f50ee68500f5498321c0ba3d0b516c15e6e73103beeba1427153afbf60d3e4ca28e039e717690dfbe3815ad22ac6d38c57804bab40c1aa13f08726dacbbeb6402dbcc2c7f84cdcd5eddd93802cb6b791d449b6770ce2ca53dcd00159a60ff0134d1a038232b139804a940b2128c5fd7a538c2c5fb9cb1a534922fa7365f3c538d8da5689211140852ab0a7c6d148219a4977fbb68792f6a39fca163d14a1d1635462a804c47726a2e0a6d06f5f464098e9efac9d1fb412824591f30b9e71d26791c69d8bc17ccde3423b7c8ab17955f7cf267f3f9880eb4725853a5a842b1b1cd5ccfe0bedef6421e4915afef64a46393a6963e3bb529b2e5d54e406cf3a803aa17724b9288a5dc6645e28a89941bfacfc3088e74398b833355c2bad45b0ffc52e01c608e6a9a3672d5a88ad52ebe2f48bae7a5a3b928737832e2a859bdad5c8cad3759e39fcc341a528a5a641732234bf8be2f27fe6813bf6e07a9583472a0349be0de0141f73e3858093f59a1e84c63ce3d6c539513b065ffbd29d5abc10fe00a091c3d97b1a196a59d248a9d21403736ab129d67eee7990a82f7bd16dcde62bf21183ba67ebcc44f251c067bb91c269439746a9cd566ae7f2906248daf247298bca5f43974842d7c404852ae8d39c27c3e92fb8412a91b63e7d5b371cc7c8ed48404702c93fc09a2e2cbe71215a45ce4b32ccbabadf8a935020de1ff696b361c62fe78370d306ec84d820f3acd1bab97e5b06bd202d69beaebad5e1bd686b8aa1cb48659af7809e471cf429315537875f9d9e029905f3ee1095079374a0481243664124d5bdd83d42435fb056000d4c218cec7cdb6a6e74010039df5720674a52d7a90796bc410cdf55ddc467706897e37367580e108b0d37a8960d6c0fd4a025f0f839a57a08e5fca96a464f4d6ddabd527871fea19c4fbcd7fb172db116f5ed2a79ed205405e9cdc2e11da44ed425390f5607650cb3ce59d0878c09fb9a436b4b8fd0fd67c115747069155add74f6d3f83c1dc08f429091691784add2d7c38fed9d5e0726c713d0ff30af67477181ea76b55b156329d119a576ea20bf93d353847e84fea2f1879e5a79ae995b0fac4801e88d47e0962c0c3f3c261ed620d7c84ae306b713b316aec51032071df83a8be84504bd676be38524168c74dd3f52c97ffa90f4e839daf57b521653bcd4b0411e8f8b8fd1ca8ac8e4eb6c56c0290717a5119e62393651d6e9b9d81ea5695caa09d8e7a352d30c8d1cbf89f6d7d27b1361d5011d64450acce6cb734bb54227fe9ac321ca4c1dcee80e37757c3adc5b9afa89d8cb3d9f5e6655dd22c5fa4af05c1b38d0f3c84bfd761e27eb210bd2ed82f8ef1e6c6d8d89b1cd1134263052cb7457d4c63123ce6672a20f5b76a7043f9445bbec0747b4c06417e9cc51656554b2a809fb70876497c82510aa745c5e1168428091fe0a5e063ac12f808a6341f41978a4f704ae1334a95bb83d374801b1c038c0f6b7f1a11361490f2f67834c8ecd9a7ac39259ce3bf71d8fc25187159a76922f586cef35a5cf36d131044033ac9507e71703ac1206cda30895085e8947c928f99a036e3bd384402f9010a546863dddf28bca1eaaacdd75cf2fcc146a1de5bfc38c6ac995109eeb1fe38364319ed508e291e4ad74e642bef0b3851254e8826cf2596e085794c1b2c49e61d4a94887b25a007f769e86d0ad58b518c0be6e6a517af04d674b509c3d9de94f27b462c27d676170b1f98d62bc1090312bd9418c4b2c1e95cb5320031d62301854482c3b3ce077ba355ec46de96872c628687b4482b91eb4b50d6f4c65ac6b7e98cdc67621bdcef8f8fd67d83a62409fccf722e98b775213cfcaf9acb9a62195e5460d1858310d518a053863775d18b7e5c544432bb7960629c233399f0ca02f80f0462ff87fb7972468ee55a69748259c5880c5c3681c36a0057a4de409251f9b54b6fb1e19e6d158a5b3414085812b4b408e6de18065bdfdd9e311ee74a0fb555b330eac9cbc6689f0f48219327f667b8c944a636d0be5d212081522ed203b47ededee72ed2ebd6be07ea46e00efb87c31293f871784a12b0f245313390ed06d1a988d3d8477f8a30be529fc31990694d3f081ed81595cf3122561d80ec6eab74da54d681be2153867aeceb3e0ea0df41db29130e3bb8d7f882fb7538c047a23546948c2621b3ee4bd9836087a4c6c0e5517876206450b528145994391b77e5daa354ca735da1540154a6f68a69c5cbb9b8bdf3079eb7ac70021844b709e915a16c770cb8070281c51fdd126c336bc436e3ec87657889d04df5ec3afbe93af3816c8cdc98a66fb97df6ca338801c7807521f96900cd3bf2e2bb56328031b2ffbd223aabbc7f2224ffdb98fdba816428cd3fd26e86930e98e7fd84b914823151b4323ecb1bc9b0cac6a4d8002c967b5836f73f7cbe18d9f6fac77945313b534a17c5b0274a7ab388bd29fba43cac0aba8178b894fc63edf2d7bcac9bd68906e7131d5503680f72650a4a1ece1f21d3215540665eea6cec118052b170b587548f7d4d13c1a6c874c1cafd33b954f9106d1e52059b26b78114d79a224be53f1b5a11109558c2d6a12411f18cd0e0b56f05d5b93c18ae79cf79fa3b50582a08800b56ba5faf4691b791c16cfbfe66201a806cd71bcb1cc4f94364908d04cc4a5df91322e4b0cce11b9ea61eea43fa1098bf3907b57ecd8b489c0f5e55486b50a29ef213a9aa30c6da220684963f588f89348866571933b855818631d50ea3f3d6c55aaf5a6cab6ab84714aa77b1d50164265f5cb48524da5deb9191a2e20c160355ebf4cd692a9c59850f99e467feda35848c0567b42626f6e7b0c878b3ec800ac3c382efa6d29129847f8bb33ce29dbbebb057c2df614f22ce81c6f5ba4d9bdf1cca96a5dc7280425961d89dd3123ca4a852e4e1d3261145b3591581391a632def8826f93f5f23779a6a3d2f0161b72608bbba4e1030b466b602682a3c0ffa8e77d60db2690d49aedac6493aa4e3a4abd27d9cd4dd77874a43416dd1001682525632a7878a6b165df39b6f317e941d902e963c050590783a25a3854f3ea7323a58b7e16c393059f860ce168069627cd6585adbb0627ffc0262b75e181d0535273970ff3d4c0b816f76e06a460f0ba883f56db697a136a52dbe209d398e01b886f4a99863c7970f0eac3ea2386a4bd368c4d4c6e9a93b5ab5f43d999400d31410e7c9c0089a7edca5d000369fe9932f40f1060485fc79bef4d2fd2737013086179476f4cb8f8f76b9ae03bb0da059f303600fe0f01e13110910250752f9abc1cd434af5878799762cd6d0bd00ea8f7eb046c5cfa69b9c3bdd0b00064359d08cdeb83cbdb79d8b024d1535383c9517ebf378c05722c905ace6a4311c7c52ad2e2ad36ed6384e445b1dd08094c82afee57b20d3599110d662f6883a56f1a8ae983f900641b21f174235cb51b430badafc6257a9c63d927462b79bca439902982db96391bd70847c5dc30e7a6394146cf4ff2922da63725a8e605e2a741743be8e6afd9efe4d69a52a9a4ba3cf89be4c514c76da1d5908b209b500343127122163b8e9ce5e34bb4afeb6fd3064d78e520ee22818584d8e81ecc170b8845389bb0c9ee3274f0864618b9627b78938a890e69e2bb526c8c816801b3c796869e15fbd1475faacd45fad9aeb01f63d8479d9357566456c6cafc09472eb08c194aee294b6efbccd1da36b0920cf26b27da161d835d5127107937891eba9e86a73357a01da373bf7ffa1a6dd9302c899cd69b06b4a2f049e8791488da86084b6fcaeff2a6e547e4c16f1974579107821c85c989924052e912203a28f02a086a94190eb56a4c03bafdef2a865a21181b24b1086afb95a8d62b319a1a34d5e60a2d196b93cfa6adab7d368d81b556026768d3867d5a963b776b7c69ecf0eaf46f41d3af61d91d3f6ccd02d42e65565a67f820cb4a8ab1a500714fc475efcdb8ca24ccec4558da22d6f0a2c5153677eb47a204677708d88ac3651b21560c82f8a37f56531c2ba5fcf2f52702c16d5a6197adc3459f1a67d5dd8d103f051a0f00dd29d5e6576205c5e1231e81487667f374ad9404c8265b7048246a0493310a74551fe1bb24136f8e539c6565ca0d0cca89d31ed97acb917b504ff43942232f2caf441bc411b6d1615a0d25c4fc88b3a42187821990ef661e8afa3644d01c60bb03461fa4ea2c01ecb0ffc23fc325eeb70bf4162f7330347cd9d38ca5fa5c19c1ebcdb4c98c52ed83e8c4a7b4273a613f7859e06d441162b71dfb6cb3df69e0096916e0c6837b33e0fa4e6cccf33b1dea4b121f8436cd87dc84ec6a806b8e0d1f085175afd5a37c8f5dfca0840594dd6e326d4d93420224b6e422649d59f00292aa6d9fc9d09541f9262dbd7be30bb95ee1bdb46ac07f5e448434bfd3824fd233975776a418d993457279f051a0f750719b84a80453618cc69979028f64a6a1e20bbfdf0181a2a196e52910222043f86a684567e73b75877df3a0cbd41fb3f6608e494973618e6764969278d12e771477c223dd146d5c0dc698b74affd3d3fae3b98111f4e8a8e0f0b00c9c9d358712fab7d53daa5e3b13b5f98672a14e828517fe8384cd8ff80599b0a1cc3bc0712e842f0922404a3ab00ee7409fb4c4b8fd38f606795ab3a449191c0c82f03fa72e7822b377916d38116f6fa0897c89c39f126202d41a8ac6d2187ee39cd693f84dc9c863763850325b4b8a3541b21fa86e5df5f28c2ba72ef90f5af7827abd1b88349c09819f4ccd2da4ff78bedb5ce94010a3ae6a9e82c9f19423c9a1979cc0cec546a74e97581760d7ecc2a3480de44f1aa99a1cee4989ee6d8cc8518d8160375577170455b33f375aa71400d12d062026caa2e7eba9d7d095909c5605ce8dab7c397a440c639f2d9dd721d784745631e02a240ea905e255eb4f30664e2a209a61bf0a95f321083a02123a5af03f7b9a6232816476a8ec0dfc47c17cafc80443cabdec1d3e04b4165c943b1ac26d5c49749d2430810c7738b4b58beb5a0310ca8fa20b187c12a8ca2345bb67738c5e4d41296bd8e449a4a65a10f1f4c5f1771d9b5d9c4a57fbf37718826affdb204ffc1d8062c0c004fc1d26c4108090c0b03a8879d65dacc97e32480d2d9fc20bbba8cef62820ac6a4a8fd427674388f2a05337d21fc58b42c0744fb8a377448e6999d58825b46dfd0c0ea49ffb5a65bed8001d1845c5e20085ccecaa9d184c7a9562db88f89e3a10c45c320b9fbb239e0b8b4404106ccd3d2384c91083e12f5fc16968bcf2e4e5182706ea019e34062516290418cf5759d512bda21670fdc9d8137ae61e07982a44fe10292d85bb45d7a91f85d8bf8baf5111f445e2e16f97950b6f517dc1b2ab42541dcf553b337943f23a664e35cff36181dcbef19542f5e07bb8b27ffc49bd1f34ff617d238f3f6b040cebdc95c9aacbb9dea57e21a594c72c3167ca0fe18fa9f38890f5994417f2723be1ab1fbca6473d41d73f68475d04486d170230034f14885f40c8d63c193fd8ee677ef8de86e3debdfe35b4313f095bb84f892bc515cd0fd576a1a5158420f090538293c2fa99680ae188245ed816565a045ac5d9879f411917d6d4d04e5a516f11ecdd9064dc4958ee53a64d75b173b43a0857e7b1fb9ce52d669811bca9c8775a023092e6db2407dcfbff9fcb1c75c69c7acc715f4bf7ab80b187c7218aebac1740cde6e12956fb0510194e8011a2a416441c05ca1201373adff06de75af1493a6b6d4a6a8300c9268f2684f83e04732c3e72d86e94734b8e5ba1bf65bb74b2cbfd6895dd03c0915a598cba37288ca905eb1545db462a97bbb8a6500492996cd2aa058a6c7f7a7aa5cf40dcb1375025e142fb788e5c918012f016d3e12628925dd15c4522ac59c8debf429c9095722fe0ec6124a96db0192732f9bcb08ae6ef35fe68d111d6febb7518f0b6e27e0d93a146b3b76337fd20d90bfabacdb9f863a49d0e127d6c72a1344a853a567714bfe4f425bc46741235c33b7e33ea6e7c15e3718f40179717c9f47d17c1f6b2307aaa109ae164cb0d04a3377cc0cb9d2b5f272af4cc3657e6617eea45b97695cc4a9ab203e05579092f8cf6290fbcef4080628418681f2b850b23eed65fb5a2ecec3969765120cfd04c7fa2656121935f3c2cf8f4f92d25ec391194537dc1d4ffafd240e69f9a62af49e7a9c9b09cafb05424acee1c5dda518d8eb20030e2a2af225991abd579236063b88499ea945bcd4ff199b6eb4a6c4572a76cae5e7f22c813d58a8c23805ce05beb8540bf928433b4e5dcb48a1e1db6750fb4d8c2c9c9c3c94e68ec16aa2a4688d0975478ce82092ef575fb65375ed2d2d03466efe4dcc4980c4b3bbb968c0e7769f227347587318209542e214b3b968cc0595a5a12e9ef5ba948a4b81f2b87feb1f480b16f89a2bde9551d8fb238a9231a607594079b2594f2ee2f3746e018073bb459a9cf74c2de6d88a6301f6845c0cb5c54d85e8dfbbed2bd6d17b8d71baa43b6fa20848c5317a3212745cabb2d48ca5947f72d49cd3894b6c3781d181d8a3b104ddf28d7b6a66c434e94acba95b675f770669905a90e2b3b13be25726c1dfb747a02540934836bccb925367bacc8f5e5f61555a90046e6cca90940f598acc516ab03f4bccd7c99189724a9052707963e2fd7ba80e091da627150953ab43e880fa96a7a883de01e24f6dcc2c8e60d3b664f64d3b4118cf235e60e897dba36a101f18b8d6d061d4c8a3acfd7aef9990fdd79ed8442e91e52d580903b22465a39b5d7e3249626032c73cbfa013fa1fca16a228c35019c7f07597b86859981851ebc28dfe8126966d8d3db5d079859542f003b3906047fabd5785de22fc6b129498d1a208d55ee53689ec13274875b3c894adcecb7fe7be510fee7f042465d3bf1e3b216c078de7ffe9ef14e81286d41ee7790385b097379934d287e8154bdbc1f67378023bce577ba7d31caa9396d137c8216b2ad7bb2ab4b49922e2a4a11f90fb94cc0603b7441d2084601882a9e6017050c45178854c8a919ea4f54b21f5fce6c8ad95a12ebfb760319e6b460a22a1dcedf74b410a3644282c199477e58fb43c7e8d730d3fcc096b64c136818d1d66cc4037f8d4e4a1c41e0a9faea2bd32610c1fb0f2de0f7246871aa5119860a5c4e448cf41c2b173bbb1ff3b91e9fda9acb1980b5b57747b85b1932c85aaf4054b5f89fb663d58a618c8353f824f93567c196d90b4ea1b45b656c9f36d3f60a450ea4100eb365d4cb437c9acdcd2af3f0fb3fba9b2b1feb47320ce19e301220261227446228316aa8ead35c3ce07b7613bb3d982d5bbf6ce3776e02b33f5207be7cd116415ac26ea5542e1bfbfefa2ed6b872594d5675d668e0c76b9614fd1dd9a152a4fea58e83bca720eceea57c2a5849960e79b2c4f6f02d7ac674d847c2a307cd377c80d199dbd6732755470981291421a70f2de9657d9d4c3df371ca2a2ac60bc9b6011ac041cc1511d30aa84737cc242435e96cdee4289987a53fac0ab4a6d40c062c6af903725aadef74286bd59992804166d531072cdad001efe6818a959a599d9a1bcf3892ba5fe9c101b62e39c502023becd3f1cacb24059200aeafa76f63f582967a18cce1e373b37da7d52d6ee0b88a7a925fb252d324b9537cacfc924a07a2b22b8e5df2575db505d90fb62553ce023169444a68bfa303447c0b462f8610f2950a36f16609d2dbf1eeea18f7352008de3ef78f1330cdbd2d05e38d4a62ece36057aa6bee38fdc566802e7815352f8523feea06019e0e7c1fd45ea8341124858321a01bba562e1d320f4ac303afb44fad8dfcda7a6176af9a4cbbf6f9b4c4cfeb10f2c5685c496c559a0369d3a6037f1879e7b2120ec8df0338406bfc43cf1c06cf74b7debe5e2a28679b808e8c839ded791ba27d3c57761e7eabaa35e8a17977b9e63cd1ee1f1c5a0394707c07deb1d9e9dd28760c7be5ef00fefb0fa0035424820d1faf09d9b1ec07e04068d4dd530b0045d0effbe7e222f31728c92717e2dc24f3fbf6b52d1b36f334407ca2d8e61b1aeabb07d64690dfd16cc9b1aeb6f425dc9f8492aa403016a0a2931553d4af0bc94842ec61c5ddef8457180996a70b80ac90c3791920d5c72f8287d15729e3fa71df3778eb871c448e100a0f6a46e004705c6e3d599825a2d0502e552be39f4b85ab374fdcd14130f5e80078d6afc4554dcf6fd7a8cbce4b0c0f794c17aa85d73360665cc48d3571e2d2d18fdd77345a35894306cefc64368443c520cc0a7faaaef60a1a7ae3a2bc6daf86e4d3c2973b158afae3683fba7572983057175cac2041fee828493bda570e605c45dcf2cb5ff70f3146535d4a5c0fba4e029b2633fcdb515351b969a532d5625e4aa1f329c0f23559d252a86b11902c4c48b60b846ce1988e257ed044a1dba0c2315d9389610b61b9b61509f4e4c08c86a65d741c12bba07b9fa6ae23d2defd599a060fa49aa5598f815da080a9ab58a1e12f24fb644c4fac7dff21c58e89e0e74f9cccced3218a7e43e428ab90a87c487af5af51573fae5190801a372a8b1309b352234ea70dda6f8ca181f39eeb0110a27b37b6949f68f439b935cc32844f909383bac9855168c40389bb5c9682befa54da4db03304df8b503656a689d3de882444fc24984ffad0a7e5933931067d08675ef8124df7e4458be6baacfd774069df55754af947db287a7630e02eac5df064389e293a694d9504626d20d351c071706470066549ac971bd98b0017a8de00ce7421e5a104a9824083a557ad7f9a9751576e9237bb31f39001b66be655df82215c759cb0fc5e1abc51e1bc43ed48623ccf93e5afd05bd8f292d8dee32918cd5b3d25abe230918443ab3731c5d11a29cd42d42b615c127e42b91910774f545ac2e16f0c3c8b5276314d38151e3f77c98ffafdd38f3e359af21d45db7306a9c87630ffc9132951eb8adbe40a2a1087f1fbcca4089e70b65aa6904eb080fce330cbed5c27e2671b008638e33a370cf1e56b1a1c0bb2055ec758f4a723ddd4a630e53e7ad2a65922db793c0464ec3242d5b2405cfac2034a2d6802122f206fda1dcd00d769940ec9691b763d585f182e60e5b2c224b18938708c5ace840cd9b954b9e45feb4a9f7afe5f0b114002b4760e7ad9e1e5b32e98b91e97399d4359c1bc79c4920d76a6c0de50bfcace231bbac2ba41309e567dc213e70508474b5c8fd8c95ed67426d5b97490fb1a69f68827e269deee38513da1e4a759391b983d9676f031c157be08df9b56d1c68affb46a73f62434f0e53bcd60aeb50bc78cbf879b5736ed53cf8ee014b52ef362479791bb52cd9bdcdc96122f62b0e373304f5b4b923a809a4b9bb26d2f904ef622a52efe338c8741dffc11340d44502a58cc60e0fc0d60949880511d8f25b6990da62b4898ddc571bcd583d4a722a1f40bda14d633f99235ff1c4243b53cd5cf79f3a93196d378b8446729c0af10930831114b262be289637ae1bd807082cc0b9380275b5a88bd8ed67d25fe762088589c5ff0f5ce2ec7af870af18509f3c3bfcfb71f968448bf3893f736cd444e966823c7eab418fdb815efedfe4999e06dda7b636e565c18fb67312981ecbfb2fca248f036812d45a5412ce21bd8438ee77afa0c293dacf8c2f8b546c27248896d4619702d6f6c530715d4273c957200dd180bf3e871f3aa7f02aef551d6963f108eb699b34983911973578a8626404308320c76e90f17d18e4ab09935fbad1f71007b091ad45b54a2735e67c4670b8e3a751cba67eaa8c4086e2718f8a077486cb14b78e480413eb2568b64dd3b5b6e08f1f92f562ae27e2722426c2903b7fc4b583746a63a64299c23bdc7696c420dcc02ed1320c0083ab00c203dfa97348a77e676354970a2fa259e4453cab29c34f1d2020dc3083ae39dff667b90fe14c1f66c24d2ce018a60d8dcb37a0853e4d6132271c38fc3a3edc8736d30b28c2af04b57b7cb3775900e1e6739af3c39e6edc09b97debc94a7478703b28327794e3f15242acead0efcd5e68fd707a9b69af6aa404012a3ef787778021f62b03270a9b0f147388fbceb384f066420dbbd1a8d9a7111f2142aa6c99c8b27082421050a3d8176a01bc5c4fc471cbe983b1898b72855646d0ba1666e7d3660cfa54803525b32c221452e058e298c99f07dbadd2149c71d0f9cd9078cc9d37e8cb45cae576fb16e0165c2aed1d118e2cb4e347359c2b54ebd0f90e0fcc180b3018838becd503e75620c5334e066e909da25df13214e6b8cfbf10326ee74eb7a54ad298c3ed44b0e60143f6be080399f2fd6aae0f15711398cfe6e0018e4e19479ea95b8cac15853edadaa6e27ae99613b2856a5d94b03b02e899132d835b94b8d0cbd1a9042a834b6a233c4805531db545c204e7ac51f1e2c6b6a6d247d41cde6135980b2a622a1a38e44c5d5f5104e30ec2f23788f732b33d3d5e743a38bc50c53e0c89746b9b09e8c5901feaa2dff07f2e074f860988040dccd3b2a36f1b4b294ea23ed9286a21532c7ae16663f25d24545cc160f0f953a2878f1704384908106f8c6b7933e9088e828994dbbdf80835a482824c6f111b7c1823edc7703a2aa194caab447414ad0d023a000f990066788f896841c2d8ad214aa793eaaa35ff19cff61ecb6ce32fe21c77d3a064dd7270adc871036584380d7dcc64c412662c9275c1e5bc29515ee74d3bf3204d1f1cceb5cc05e4186c04575d48499bffa04c4347d450921049dcba2ab95f7aa158d6b2611bb393f1ac6da2300103fedd7d2cb44bac479584656ba07a1b4c357f3e759c09d1c7150653e5871e859bf22ac84b8b84f3a33239877cbcea179e1f7f0ef5a111c9f54594e30dce52b9d69171d88c80b069b8cbc514dd23840583f2ab2dbabc42680d932ffc1cd3901be0159c9350db8e60446951cbf1dafb4159d1dc87a17cfb3834227bc9dd7946a234205881e81bc65d20e15981f78affc0105547b0b665a76e5580105bdf29039430c9ed153439102f1e209cc9d860e129a38628ce40e56903e47381d300353114ef403cd70dca6c2ff707154622e2e635363964acb243b26933e514da63291e36143c00a1581b530c8896d4ae8d6ecc59745d7ddbd776919c45c02592d457e76165c7f93909a12bc7cf06db8fc50069d5605766d3c01bcfe50b5a9d18e2a9c1c0a97b5164768f7f75c139b6b18f31cec22b1ae29490447db58ae5e17947ad2f85dc678907c7b46b385a5760d279b4e816e515f74c8752d40af08d765f31c8cc89e103af8dcffc755d7cd0b0a6f2b02d1829208915922104fe99c9908fc0c8fe7c02b6e062b6b668d64605ffa07718f04c9a331094592236f61d24a187883a75a27eac76f9c20d8efe3c47b51631ecdb17c3e624e95c54783a9c86871a4796535f046f0caa51b52e91e24e5dbf3c63f035edd9ff3300e5c2ae408a11b56d987567c6b80a871dd3d82938286f6fc45e0ab587759395c1f541acb0227e2f5d7510497bab8701a631f904ec92c9025151c0456caba939148e6e637b3343f2c458c4c7c49612652535584b480103ad65a2349d79a0c8bcc71aa6dd1a92ef91b5ebcceb20bfc697627b904a3a79dabe1ede3a414898f266c654c729faaf2db066574ab3c4ca1a806f122cba11f403bc2906e15a45699bb32fab5c87818f1469e80070774da3b904ea8ce96caa1800b937c3f510dc81abaaf75cd0c83b8db680b49c467dafe154e24a6eb11af99cfaf571decafe136699592ba86694ac3033b75da1174d411d79f262309b4cb42098a9141ebce8424785e97415bac084adcbc22396440f59dc05c7eedf6557ac2d7341d8bdfae9bbcaea8824bb9e61f047f508b8ab221c409766023400f1f028e8e925deb28f19226f3f3c6b2e231faf6938577fa3ee5cb2b5b976de5400660c6e942dc035ff054e671481325192a5710eea18623d7a2b7142fdc2a24acf40126bcbfefe56a9e175bb718057dbbbf878e5c098958e091a9b5c603559a1edcba78bb3e1a68995a9fd7c0cc1ab705caddbd866f87e8c73b60df84000e42f28684608c668abe5fc18803a281b6d47d40e6e69806a7db17c65e1aab2f40c68f5725cd320a1d270eb1de3a4266a8fa2f98c0520c2385a53b75b7dcf2b374bf7d20307c6ff2bf58b587c1ba243fc507118d8eddad7e3776db4f7b9eec395e421dc936810e9ee4cd7e80e1ec75cff1eab8f1dcb18b9b71b5b77423c291cd014b93de5db338b65d7155bb908e266ad6050870a5d7137021bdf317fb9731d2262b8ac65d56b41e6508b0d8b2c0fe74b64f4885a6f8c30a55351ed2d47f8c9875233a3e97c384f0f637339fa168752ee645c02bb05c37de198b096a18709b7b153468dee6c342631de7baef5a9d6811e02dd89096679f5c264799c6a9bb7c0a49ce45dd883ab38aac21a7b03ebb2a6fcd0db082e2c3e259abe9e035db007d38d50d7a83d980308cb69b36f539ba0a051f69bd93825d774e1dba13ecc5a3aa903bd1fedab37c9e3b43fdf58928e2250d7ec8428ae203e259a4f16e53a6438827e5dcbee7891c6dc7ef106776b21f33ffd5f8ad2b474775e040f41c17152dfe8bb417cf06a13a04d0dd214204c027a0ac82781620a68a6412973f265f262b4c6c794d0a0098d8d68de4c230d34d1ac99e69a35a249239a9bd03c89c78432572700791268268066120475ac6ea03047f10a93419a06846980cea8df092a6618ab0d54e34a4f030d346ad0bc46cd68d080c6069a6fa499061a68d4a0798d9ad1a0018d0db47f59b35433a2aaba40dba4521764c7af9b048429404f03fa34904c01c934282683340d08d3809c00e449a099009a4900a279052287b52ec81c4769dc51d5694167d268718cb75575b2aefe502df870a02a834ce32e13dcc9009799e07a66b8145ca0ec0ff685c14506b893197732c7a54c7091015c33839fa81c5c6400d7cce03e43b8c900173202dccfe25295f3072af3c81e489d551fa8a166740df079b92e62ea51d5fd6335144653e747eaab1ba1068cbca85f114c5eebf8591da551d7e923538fa88fecda9c2a46ad9b4fea288f52e79fd5a13042fd0dd133ad043c0c298383fd85c018a691242501c7eb3fb118b2e8258b69d780f7c221d43582a0ce0ac7fa41929e0c6a65d42860d5cab2038c79fdb785200f3641ea290b04ee7190f90094542b475a490cebe149a1194a3baeb48de103455a2ba69370b428f6838a9d99fdc1b11d0add21c7c3a5e0118bee995c0d9982f74ce892a5977f135d7e821f8d2602020521ce00496abc46c049977254aa253962cb169831363e1604662d9c8fd43a4f16fd83e74b2fd9c648a24b5acb521921e2949d4672e1a0da2fc1fd0ae6819c8653e0f6f97d3650ae3def2cd43c13428f6f800d80a1cfb3ce984d2b338c4d6d23477d25779a5d186cc8c4efd7bba839cb197109ac8de73a1758de2ba8f99e427894fbcaf6bb604dade590c27088d17f545c0daff40ebf029ae5000e8866cc3a14417695f455eacfc60af7af320c221c5245d63fd2b8fca710199efff103596324633d0d1608dae74728e24335c0979cf4e81bcea733f2a8dc4a686fe565f4c64e9a2ad3de3c0fffcbb4a3ae6addcf83d9b2437299b182458aa1f398059c7dd3569939b0e060892ee1a7188407acb82f6ba4c90ae019493eab808f4df7e9c4df6a6c5a104e6a7ef6146ada086228a05e58819fb3345840d9578918d29130dc430cf5c630331c8ee8962f728d4839c270d844fcfcfb973d3285bb06645149e087aef11ce2f587cd1c18a394f4a74ddae11cf12d85451a635d0e039c1fea328318c905a45be98f17f06b1e07b7e5d35b5ad73d88fd9ec62430bccb5523756e365a276abadc06e5382cfcba9a8411e41b3d8853a390e792732c8d8a47ca1e33bbf6c8f59921208b5af8b0238c29500326fa92f4a1a5461025ef8b26e8423581675b408e0d857a9baec3b666435bd27012b635d8bc823d27fb468ec34159150a749d01eb63aa042e1526a8b2f47d8913abcc1d23e06dbd4c47cd9c06fa05b163c46f1102ba613409a4f0b432247871f2afdcef409f533e101a9e3c99f07c08147b2284844e1aa1b460939c205d91f1df00f3dd49c9b28d0b2d1c5fd8490ba19adf44839f0afabcd96858659a8a433c6ed82c2273fedae69fcf7992d6df335fb1e0bd3a493a2647aff7bd8e15f110166b29d9d1528d20101ff004b55948a98b445a0a0a01a07a1187e604c2afc90795da19acfd8da1ee6fe02f3576672d533a7e2774f33ea0914abc296b5ae3aa1f95e68ac3d8dc1ec3b1468ac72cfa957552a35c274916928602e6a1a7173d8c48307e0d5e0d43b220806157c303f52a35c99689cdd0a48667d308d579293eda17458e30706ccf9eef1888aa015aeb4f301afbc1c37cb987d98f78b46f0f76c6b18c98bd7c2dd2dbc6884ae1f821ad381c8991482f94c24c32927c0257efe8b32833f4121aafbb015e7b4101d33092720ae86f7a427499265ff665de9690345e664b831960262393f47e3cc45406818ce901d256665e4d90125a2415dd33dfb0d2d1a4b4d75c4bc95e22d00c0edd8fdc7ce9554a1d3e98f8314d623ad0d02811e1887bf381e98b1f2c7a430845463a80f709441a66202719b0d0a11a18a774c22426cc2ab55d64682a5692117396f097e7b0f22b08a7d96afb3568356dfa0d376daa76026c2b811ba2757d7cb4b0de6a886eea1bae7a9835ea417072b4acc5df7e0c0449c92e9d7955e62396e0be98dd8f7851a5069c3107c99f1fe57e0a31aed0c20e383536eb89fb26660181fe225732b380409bb97027e242da3d86f28222439ad49f91e975b6d0fd1e369e809b2f690a7f1965fc7043ce5402b3c9c15ffd96ef6e21afd1cb8a574018cd9b144a5838fdd951b37a126375fa81c7fa102fe97eca262fcb3ae9a453e0112c8336b6904eb3d7430801487565afaafcdf11f338c4ab6c0b450906691de3fddd118c955c6a6d0e53a9ed2e50c3359b7c5acb3031c23888f414bc5c1f190c6f688bb0fa69223049d9de282ce96c44939650ed2ccab9c980a9420a3d8276cfd4a9a19afe8b049d7eff301e7258009f90a643e2c2c7c8ffce07a1fd27601c2f0fd5b8fcd4a685b22418f2b4791d10255f08e4a535c9b3e0c5accbb24f56c21bcdb563a285761680b2ef781408bcef4538fa77af0ad19363b489dccccf54d916e5927db551cc1424db279da55d7b788666c0928676475542919dfcdbbbde367525e2a18c72c2349bd879aa5888562b787f1fca327f44be7bb7ad6041a3b1eb538d127b8569706f7158c560882d40744991ba6c68cd10da4200dd83c60718ab39436e782131ca8df1b09a36bd27b5072ec92db3beb005c63b7b56008ed3a7a7cf3074c57a43f9c841dc33137277646536a6bcfa7ed46eea3c0c4b5c2bb176f7530184b697e600afe527696dac4838946d7752f5210bf5c45ea0001c60babacc286b49b3e72748637fc4424e9d59b0e4f4d9ea76ee427e296a9f517fa7475380bf18a36ce14e7719e4b70ceabaf9f5372665ddd5c2701209d5eca76eb0f3a73ac0f8c978fb68e4b84d971c2ce9bf5e8c23d81d23fd17ae744e7c1490e7951994090f432f40f2842acff0216c65069da1a227c7b3fe575ef54ee9d5e3d9d4ed8d380d4841232c12a5c2f2666e481af3992e7435f0f8922036a1756cbb33833a8e8e960e8ff862f4457193c18f82f6cd1c6682ecee9fb5c7bb38b30465e2fd2ae203d8bfb58d872637076fecb3e050b594c09a2d1430846a04d4ce1d0efaad60c3e19fa87f31a266e8e61ba530378c29ff36a66ab4c9fe5624ca8d8c373806ac835f7a86d2cba21006c5292121ad9acf8af042f08b022160ed753df6539f230155ee81b583e445d0efd67f159717c495cd66d6178980b0d31b81c06bacb1b219972de29cb4163f1e91236d127e51e1f27728a5e8035a0caaac780254d910fe18ccf0450e5531807d934dcecdd4a27b6afb299d55523bff047897e9a1affb10449018ad781661981635e6c1f291d58ef14495f6073bd2841f55bad3b0f7c0d8310149a4e33568370e6ef5b2994ba3559d2ad30cb15b4f7afb6109c4e023d0360d446c14e4aa2332db789802447f7ff8d945171c80dbf25bc8f68049220711919e895bb4923d9ceb90c08bbecd0a1262c6dc58fb75b1e8d5b26cf0424ca02bfac1d0c619e3de5e937491ec31282f349829cea3e34eb809c1bae38c656872f08f407d2b4eeec590519450594dc2ec6ed0b1c4b9508fff786166c97b3d14965b7d48e63093accffe699ddceca17cf8cff34e3333c3d79d6341ff48b1844f561704b875388d9446ce05a0b250c9bd051c06ee37771b97da78508bc390c148cfb9d56f4b54f40c80cc99597b96747a9c895da871cf9b93085033601743f6ee18db423c343b601e0b76a4d123fdd70b9be450b846b7687907f618f423051314489a16798e2d1823368a49e059206390896cbe2f125184a7b655150716748822c2db844d1c5f48689a88a7c6c03961261bf4c6069af6395c00607446dc57dbfca8590b9d1d6a6135a987740304664eba0b176ca7c47a60ef5b9541fbf03b8a49e2bb6dded354f7f064b133c7e083a68bbb99bc5422143a9e485a76bf283af800b8380b055acaf3b3b1b5b02334dd52665ca079235b8278f914878b6d2afc52c4f1e50ea4ad687362a336000cc4d13767a03c18a3870edbf93f5757642f0e9771dcf86c679fc5add8d54a65d4bd7a09010390e902d79fae6984b01ec13034d384db1da1818db803850bad85e569657d162e389f0b6209a3412408888abc448c438e43e61dc1823506d9bdcaa4c08baf7ec2c20fe278bedf04a857261c44eb15c1419bae5aa3d9bc03ded6040790fd555e194ce41f955318c55260087d63f61a8f9000fc8332a4e0d49b30a0f5919d08d8c3bb9f9f1c1e4fc23df18e93570f9eb8bd71bee2130b36ea0d4c4a77c91a122c4796bb06cb5eb07ec02818e60ff556c624975c34641dcff168149f7469e64c9a1ea34b67189a3c097d96c001feb1f9749f49b578065b5db706c1a357f17325f94ab32d99613e7040ef861debd0a069ce946034bdae05c70b212c86d6e044f91c4f4638fdea6c05ff16d12f150a5c9ad493264407a544a871f55cc2245419f4197ea9e72068d83e4cde186fffc1ed0a17be5134fda6810cd978bb9caa564718658d6bb4970e81ebeff22a57f8682cccc0e1892ec6851b99e88d692370c7156636404d1c0b16dea73f8e1c5166964c9478a77df78a23d8e59e812a3676c38e3277321ae9ce9749e97167dcbc421bba6e6dce7bbcefd3ff5bd2e4bf9e5aba903ec76ca1a29f9d511fc8e2b9c9197982fcafbff60f6c31795c718de0833b84c6b7c0076bd13d3648294898205729106f65bfaaf1e6d9ae2c49dbe8cf6950eec62a81d0b0dc045b180e0c23e815c162e9ca0ef7c417a2cd52d0b5469ff26ecb59c02cc1eb4bb672e2c2a000106a2a8542eba3e3185bedd3892e9f5a1c6431026e78835b5deb1e9d09822f33d7e56338b8ccfe945542b96ee8949253ff1fd258b78ca72a059bfbea5b6fbb67a329fbce7d6f2e0f07e5a59fb1185c4c3eef2e89eab239a805be22051b2f181057e7b156f5f4b1ae763f8eac40ec66c5ac79795716df65d06439f85b02ccc4d0acb90345e6b8de20a75f58b27f980b9bb9a1dc19f23d3857838449815d1e93fa2a99a61a743206f1307e54e04d464151fca68ab8a5ceaa002e0da5a742bcaafd5a1ea5aa1307a7aa21a55afca01f95fe098d36d10c3d660cb27ddf948e4eb1361c870fd5bfc4a57f3c74ad7602fbb2321979d2b54aa1a56391060ca068c2730cdc27eb2888412f2b942f3b39b91217775ea6d74793013b8802ad8f165aed33c5eff6756026827d765b9f8c7654cb0e1fb4b0cdc2a5f2e20821c7e1e93e843d52b35fae22926d7362489175557788aa52b8a6c75c1d5c3bced33c99acec6b6b255b2bdadfc6ea1ed6632623841a76c2407508f405ce981fe5f2f36093c4f3f45105785323a39d68d456a3793ba4984db44d59bcf33f0ab2c85d372844fed000773eff53246133aae3b317650c5714b1bda24d3b59e9a2404e139420317cd6d408109dcc200954c4b156f3bf53261bfef572ea4881dbc0618915a576d1bf3bb392db2381ed02b00676a8c9d47a848ac71119ba4f9aec72559424e49542f33dc31ee3512aa5a166b75d0b2c5afaefc6c21721dbf59b78d521a5cf1b5983ca7b08d99f91b948b1bcab826986132be22ee6d63b6e160fa22f9e172d8034d94b8b6cfbc1dbbd44e11271929047f99806b9fe217cd990178cc4b708fa45b71494ef5611dc1e36917d1853790c0844a7188360aa1649512db0d0a87310d9c35d02545047f461f10432e6555d36a22e47f390d4e6aa91bfc8d1251d15ed6603d3345ab40817e4a1271f8fc29df083a02dde3faf9dee8eaeac3f158f921b1b43b350e8d7fd33363ac2c1085f3f8a0bb8fe185cd09ddd81bd86746e0a24457dba4ed583c8d43df3093b7233b50937455e435a4aa8f29901dfa525494e34d649582cdd7f82481998c666f950ee670670b0b1a8125b4f94294885665497c82f158b9a8c4927686598f2333d95e6803e73ce6ea0c0b6a81589b3a22fcfb6595e4d945f5e8de202eb98f0d28fe39de128cc89780e7b9384340f1f37e4536c26ae249631ba239792c8e8bc62b398e517665f4ffae2c29745f9053e71eea998162b1dacecc9d1727782ac646574a78b3ff89ed3230e315dcc95fa5077009ebb96456c88dd6f315c16955accb8f27cd6c46e3a9dfca38e8f2e269e1d28f85afc2f715d805f855534130edc9be2fca952828253766dee4eddc4a9c9a2348c35395c133ac1cfbe94f644ae2c6b0257ca5a54eb2c95f645e555cc2208de7633f6efd39ed22254c326dd742dc063b89beea59b42f86455c8b0c0a5bc6f5242384d39b4f2006664411194087716e8fd69aeb2307743ee1a2fe8a751c27d5e36c432e894280590523a9cb458139c9f10bea80abcaa4ad2f88fbe6e57f8ad5c01bc5481361468084cb303426fe122f086d866ab7f7fc08bf99cf5092991768230e8483c377d6b815b232e5b29d3b54416c3a8d13749111860ff7fa66ba5c41e142fc492fa5a3629ed74d432695db567f53f85112f373334b12e23292e068b0b4b9c3416f9ec8de972208c087488ddb41f19c8f3efd8a3a41a001fc1682a309d668a1ca906a3f24c4cbc41f41ad5d3d1677a7c440f1a819e12203c231894cf8e35f5eec81cf86ba54c082aecd91c4bb609e1e7b77fe058907aed4fa53a105f2c8556f5867bd9a5c936ebcc27c53d3af72d1f99b17384bbc01aedebebfa41dd892561df0dcb811cf9bfe8271519edffbaee779f4921b3995a8cef04793ec0112595ef6c63e0a613c917d660378382e3c31361758d9fcfdea6956cff5f2af48f4fe6189b5658b1d4932db42d1148287d582e8b2f4c8c353caf2462046a92a28594c8981b7c6ca71ab797beef311fa5cb917429c6ad2a249cec8adc05866fbe8d886953aaa23fac5bbe04dd04afdb36306d393e22579acdb0f07b641223435b421e0e1a3e638815fd0c4979f62e58906c0357825c121be68f09584600c15bf2cb156d621b58ccaf2973b63d20c91219d893acb7e7eba3ac896b999f70f3e83abfb4a3f623bae6be904803f8d3a20450b2ab2035ce01ab40537a09abab2457ba0b85fe7e69ebdb34cc65e53e7af2fed7e07451760b2bedbff102d66f5239d18a747af29f2eab7457e014a23a4c4ed4cca10bffaf62b955c0cdd1cb3de3f34e33f973a308cdb26296c844a4dc91ceeabb7311bd98b45445787f87138c9309f9f0dbc8471c16f5c2e291ce6b9ec97a5f662f365463c43205bb86a9e15ff0757650a2fb4dc02d36d55f9d7ed09b4070ac503273a54319666ffe8e5a883eb3588ba24a0415a3f84c780982be5c344b6600c570589075812f03d31074df840563b56224245a76084268eb0e1797ef24bbb311ac75f460815c9f7eba9909e1f70dec60f02dc149caee8990f04204d12b6ec69ce6ad1775d4eec16006f4764e8dd655f60fa1c9902e8bbda98c468011662a1fa2da8153a90b5014686212f02fa7919127f049c15b221114708c41ffb0416a04f0d91f74d7fb376c8d6205e13fc7455ca0dd57f428ea0d060d78039e2f181a00650fcc028e1268fb911662f9080540402c728f04cfd942c557cf911c51f710022ada3108e80c83a64511622e1cb6aeec97f71336df0c7310cd000c4808df3ad9c13e5dbf56919abfadc6804329944b1c661fab68fcfc51579eebf4cd46c56e7024d736a709c84f69d31e75cfed7e6f7b0d364663098fe1df51c54ddf016c0e6c119953c9c175ca7f47cd8a7b9f04b36d35d92e0fb42575f77b1441451eea730d4c0d1e8f3a7cf77d7adcfe98be61087b71f115e653e8b79e40a0a6c3db980ff11e9c6e979cf961256bdc64e0a07180e169f488f2690cc442e88c22330e52ba4147a6e4f664861ff6e8e45e3fd6efbffcd1e22fddd87f959a8b0e618a2412c75f2c84e98aef4e70ef27f20fd832e533d5f744e9a3f3a8232e4ce1240e357b618471bca724c377b2c15dc110c48bf2c1429f93b299e5032638ad9f80e1e147a4895dc0a40bfe5735e0431958ed0953bc273614f139b9f4df406018b8547234d37e9b6789be849d5f7b5c0828641fec527ed1a507848c3ae8a483adc5e6af7687d9710a13bda14c15bde39181ede789810d0a56ae60d0a222e7baf2a2410327e43437e7f90c4d091ef640826d47eed6d4e17db1b88f3b1699f90fa06e5f8b03c1cc086c6f871f64a5ec4f5b05e73c4536cf1c637c7f0cc9148c4e8928c4448bcbeaa49d3ff67b1120069b5e70eaa02cb8917dceeb220f6780e9c2c1984217400a1c0846fd282f1a219325669b0b2941259a4f541293662e528a0911691de253598849a11451a91206c98274e55988902cb45954c5239245d6925536225944e4642dfe73c030422e3e4816c99449591bc9a234f750cc4816d99495b203c922f0853b2f20a96216d0b76428b9f93fcf81cb8de0e291c9b78206a2816a623d44b53190e877861212413cd711be89a4fb18c5439f9571045967740606381f081f0e9f8c3da24ae13db46c1083f0426458f6151c6325460e848334f621fb7091d91b1628becdafa73eb38e1fb07ee481bca14571dff82f47f307f20c52411d243fd4ba76e84b5c0bcb3727a496c67ab13be0f172c68499bf1c97a42b220478ff24b563baab4e2e157486e1370724005992d0606d63b5156a0bafcf62e7d84864881ff00b68fd72184ec561885bcc212705b0f7b7f7d8ad5fe15a0856a91f1d70e86f20d3de6374c2af24b2df35f86f6b1c9a5d892d0fb250c126ddb1ebfd169e5471866fc515fc4b2acd894e90c6dcc934dba2a821461007c3cbcaef5ddc85ecf01276371fcbb94a81b9fb13ace2e2127e73aa751aec4fda4011dca2680ebdce47cb1f70ad56016140ba73180e23b7c844f699bdf2fd0c88f6bcceaffdaacd19e2c68817518d81417977ee7b00669a0d48e20078dcb8f6e6670c20b9363d2039ae419f5d8d4016f1623648094cfe617e5ea888d23a42cbdb0b671eb15bfcfba15f49dc5f0f09e4a9040e02846e0c4f108067930e7075f26aa569adbbef25f00b012c31cc65db7e23db7ed5c3768768673256a7812cfca68b5791e51478baa3a7e3c49af6a1c6ef00aada23d5590d3af18d18b1926c2925d972ef2d654a29f20c020c550cd85fd6b24bde39e825c8bde72cef86cdde291abaee9e753d6d8312e5b6ed6e9741e7c47038b42b7e5aef97d5f1eb74fcb2ac22e835abd8391f813bd1c99ea7e7ce22cd0627dd3393c06e930e333bab3357bbd8558216258aec795690836ee8a3d3827098db845f8c21f958a55d7ed88483aef546ac80fab33622270708200210001e78a0a1995901d9f85bd66775465b01c518ff3d368fe0d156b046811f05b602b289315ad82c00df90759f556c052b904d5f0e4ec17c02c17b2478ee9d743e8b7400de2541ee13d971b80700e36d5f11716d617d042c4848066e132817dbe14e237d056653485fb94dba8b742b6b2291cd23788e7015e914c469e486bfdc398d74d06dd2618ee0b91c285d9d59c4379133735bda0665cabd3e3a77ad691b942bf7fad0f7cb69c43f042bafb2caf79a44fc2fbb69502e184df0b9d767bd8a114a9e421ce7d8dcb7117ff7ded90d3681228a0842d0739d38d7c4dd251c285d9dd2bdfa97f437d9b99b3315f177cf3ceeba22724dfbc929a45709a6e1cbbbf133c42d73dcee9e7561300b453935118d19c990666adcb070e4e03ab81dae558bf05885976d763924fb71417f0cf9f1031ee2e59a1a3dc8ac07910f950220e63492b93c7a95449a99e9576b946efc205fb581c3245f2dd1e470235fbda1c30ef2551c5f8390af9aecab34353dec90afe6e00300e4ab3a9c5038f2d51d5ced573f874d8e7cb5fea043be6a6f8050c95779084208f96acd8e217ac8577bc049c9577dc821a208f92a00543ce4aba71e03f0215f45f92842bada6f84bcf2d500dcab02f5776ba1c55dbd2a8055cfe8d029ccfe7094bfdb1cd76a7bd9e61181000490afda0ce1c70ff9ea0f420022838280c85775dc1f5982d09beb2308b43f0691af760e6e14225f6d1cdc3844beda59dc4844beda3f371e215f6d2c6e2c225fed2b6e4442beda37b83109f96a5b716301e4ab6d831b8dc857bb06371e91af7615372a215fed2b371a40beda54dc7800f96ad3e04624f2d59ec18d0890afb6951b93c8575b06372640beda31b851897cb56170a302e4ab5de5c605c857fb05373240beda2eb87109f96ab7e0c606c8579bca8d0e90af360b6e7c807cb557702313f2d556c18d1090aff6941b23205fed14dc2801f96aa3e0c609c857fb04375240beda526eac807cb54d70a305e4ab3dc58d4dc857bb04375e40beda3e376ef2d596e2c625f2d58ee24626f2d526c18d1890af76941b33205fed11dca801f96a8be04627e4ab1d821b9bc857bbe74627f2550e73e306e4ab1c871b75e4ab0c871b39205fe5346e7c42beca6fb8b103f25576c38d50c857b90d377a40beca606efc807c95d9702308e4abbc861b77e4abac861b9fc857198d1ba1c857390d37f2c857f98c1bbb47beca68b8b143205fe52f37b608e4ab7c861b7b04f25536c38d1d45beca65b8b149205f6532dcd851c857790c37b614f25516c38ded235fe530dcd82590afb2971b7b0af92a83e1c636817c95cdb8b1a5c857f90b37f609e4ab5cc68d8d02f92a7be1c64e817c95bb70634f91af32176e6c15c857b9cb8dbd02f92a6fe1c666817c95b570635391af72166eec16c857190b37b60be4ab7c851bfb05f255b6c28d5d45beca55b8b161205f65326eec18c857990a37b60ce4ab3c851bdb8a7c95a57063cf40beca63dcd83490af72146e6c2ae4ab0c851bfb8a7c959f706357215f652e37760de4abec841bdb06f2556ec28d6d857c95997063df40beca4bb8b1af90afb2126e6c2c6eec1ff92a23e1c6ce42beca5b6e6c1cc857598c1b3b07f2550ee3c6d642beca60dcd840f255d67263ebe0c6dec18d8d45beca5ddcd83c90af72d08ddd03f9aa1137b60fe4ab45dcd85bc857077063ff40bedae3c606827c95c78d1d04f9aaeac6ce225f25e2c616827c35e7c61e827c3575631341be8a736373215f1de2c62e827c75c78d6d04f9aa1037f611e4ab41dcd841f255206eec2ee4abda8ded857c75de1abab1b5c81746144304453c5c7f1a46f9dfe4e83842c6123e7ee8e81e1e284f7640f0010f40d1812738a0b301274d9cd0400630c064c97681262c50010a4c4002118000130f7040039660c00214a02401491080e4000650e28891022481449123880c111204c80f02acae0f238a18400f1e2a2272523843ec102208206e74fc6093430001e8ee6eebb50dda0ae72d86182d4607694f8b5924075dee182243c0b92b1dc76d967bf74b2ccbe3da89c49cb320b4dc7bccdf311dd8b568ca0846f9732ac7a1fc217432c7084eedc0281f6ce3bf03a774304a079fb6d8b06bd98dbb700e0dd865d951d7c9a52e3f5dc6a2710a3aad533a34ca83f417ecc6963afc10804ef9080ac23de7b0ebcbf3b702978c31ca311b2cc36cbab93bf016246e7668792da4efcdcdcddb7163d978ae59422e8f06916b1a5aecaec7739d259f45e9c5f0e66b6e5cb5019e8bc9db387306e1f1fb5c12fd86eb04c3de92578deba34efde3c8d96188e36c373b727aecc0aabe717d1ec1239f73d614916b36c8e53accb217ca20bc02b15cb9fe708be36c908aeb8eb3c12d100bdc026ab9fe908a99046637ec43efdeb3de9319fcf82e147a88bdfb25999597b4e473251a186a8b0be6a443cb85d900cf8540e0d5a91a8df2bf3a451dca62558d4ef9e043a7b851378df2b76e109df2a1baccc588ebef85c91124463881f04188619f7d66b70e02adb4bc412149f87947907c4943a4ee593561930e6365cf7323bb169e198d73f843a75d96c62a2b7becdd7a97bd553797fdfbebbaaec7bedf6791f73cf70a72fdfb2378ae7b67997348ec2d2bfdd47d83c810b966eb9e082d9c407aae3894f75ce91e2c57ee162a821c67eb9e2dddb3841e2c3d5bf468e9a1423ecb507c1a7aeb59d6cbf8bdc1c7fe7db45be8e19b42df3d3dee97c0bffe5af04b4f966842febab0fc28a2a0c72acb73fcfd6bfc45aceaeb8f55f3469a22a2db96ef6395e8089edbd68c6561dac5b059c4ddf71866bd0e762deb2fab62184f10eb089ef7d785f10b237a7defdc72e79ebb918799885cce481bf15b9df47556a7afbf0d6290fe8d27487f7fe8b34a247bccba6bd371a219445ad167daa6e34446a8c5223ef513e629e828ecb18f98353fcba0c844327b4d7bf86e2621b2584cbb41b9443c3e6625fc088934e12c0b056778ef85f0e5f63b2174893c8bf47dee6ee43db78cbcb7dc9daf65bdcbf5c7ebbd43e9b8378df43b1311f6d39b468cf87d7d9fd5e9eb5c1222730f9f28dc6a041d6605d40fa5f0821ad208b37a80c79885b0cc1fbcb05006a567917d965d9905318b7547119955ed9e110cfed6dddd4e4c0dffeaeb83f05cac0987e1400fba5ed0c1eac404b1cf207c257856d74cc261560d318b45ff55a5c0560e4af338d74288cc38efb954fff6fe39789f73374074efd7b91d6259ce313fcb7accec749e1120e61e46589f9561d7d5d743bbf5655d96276bbf428c4c2deb598ffd7b7f5c9fc02e3fbb673f4166ccf217fae7ac1df25e725d7ef973df9d3d7f8f27b61f2172cd46b9b647c7f6b97bd685c12c14e5d444346624439aa961a3744396ae5ba134383c0793d381c68a97837c56a875dd0a8d3bc8ebf6679079fdadc743fd29c406d4edf393a55db7424541ace7434d15760a89619bb642715cffe8837c56a8e9fa4714003e00a72a0094cd11001eaebff56c043083d45c7febfd90e3a4c30675f3430080d02180206e72080184cd8e207e1842081d383b6e5243009183130411292154393b781031440f15ce0078a48ae89163c40088f05184ea1ac163e5a307012e6a00f0c76a0621c014528322aebf7501218011417e5461452140ae74312408155e10114203ea6f7d71fdad2364901dae3503faacd047048c23c2282206125b92404201926044094796a004130cd0840338010917043c210914121005256328400a0b980203a8b004190da88203acf0802b308105086421025a90c01626d085025ca840172ce08526cab8c017363396808189170c84210362d0c0189c204393323831c306cea0f385036878e28c0ea4010a343ca0860fac01046cd801f3a40dd73f4271c3f58f3c6fe84923047010411c46c061a2f49020045188408a11f844290109a688c2045248f13941095030450a4c30458a0a4eb00214b0200554a6b440052e58c10b5850850a0c5a100317c8e00556aacc00063488011532b862a58a19d4800636a0c28a2b37a8e28a1a6061831f2bb2b8010eaec801165afc0065a1031cec200758b4e001500f74e0831d6c81e5073c00420f82e0832c5b08e1074300021182c045962208c1084338021182b8e8a2085e18e10bf9acd03e420eb8b1e89fce42a342e0e0d989785db1db5ad2d8756157b430ccbaae685906d4e387b2683727b09b2db9dec3ed8266c4f79e7bef3deb39db3c577718916b18c208238c1503f25a76097c4d1443195b0fdf87339141e25b189077497ccb2e19fd4be651852aa0fea49f7999776fd527b06b85e8c79067594c5bd6fb70a4fa6ad41eda2dfee847557e4cddde8bb469adf72cebc2ac4c5b5b44f840fd0446a47b2ef67cb16318f6d9e540d4761a50c207eb13d885f1a5e5f8622883d03d1ed89d85cb7dff76fdf49303513743cfac9ad6929581e8f5ec272c86de853c593718dcab42a90b6c73cd217c333be9c7c4ca84e6deabdf44f244d36eda5bda67bd6596c90d131338e238f021f6d8e5ee57488f0929622203c1cf5ab4b2d07e7e13db23782eff4eafa4c8594591b302da00cfe51f41875901b165cec1cf3942f043bf9568de595613283d397eb050869b551bf7558e7ffdcc5efe76cd77209a2d99271f2e2f1f59fc14cade3d94f486ac8f2cd22b8c79b7b4946e6bc942116ecdcf2dc1cd0dbca177bb79fb9c23e96086cb01a34945017227d7c7df4a9973f15e36abcfe3cdeae8e73e3034bb3cffef63f79e43cf217bd1d0653f8564665dca08ef0b72561a9cbbbb7bd7dddfb92c0d1e1e1e4041ba7885425e9dbf53e84f8e93ddf7369c12fdfb1cac72f7f1184c46f61b8371e76f03b8efb721eeb39d45b3cc28cb45b6942d1d7cac461113ee55edcfe519edf55e43cf3edc52015d6281ebfa50cc0216ee55ffe7be69e47a57c54f50cafa44bbca6110218b1b99927eae1158643687a3a09f72fc768a572d49cbee721e72e719ce13d6e9615d5c080bf703e79c73ceb97bef55e1ab1d1b28af20069d1bdc39e7dcbd961e7269b8208e9f1ecd103fbdff2bfaf7bc95ae83a5a7d9f7feaf44f32c0c23393c4294fd7e5dd6bb7ac9fa04bcd73bb91ebe0ebdd887aa8c0e23dbbcfaa4a481b634c54a018d7fbdabe6d871bd45baa1ca5ab21086eb55879fcb3309d6b2052c5cc826999fcd908437864299e8be876ebd2b0c1aaa758843b9c5a61059081a334982d4e4fc21a7e2f38aea842a06851325ef1eb77200a15b61441682ba876016ba3e745501842a0ad61cd90e3fb10dbdce29f86e45587956b1f2ac1c2a07059457f30bd014864084293d3d2b7628f8f14f40ad2f394b0a7539113a545fd60e220b4183e096e6d25918f55cbff7d0882c04cdde4177ebb367ea6f55579b75c0779fd95d3539ff0d4a4f105396bdb33445fc38e7a2671f33086d56d9a13b677abdc0da68dc39940cd10a1dea4197a271ecaf7f3fd0e1c30cfe7b8fbd778310ccdc75cd9e97f48484ceb3f7ea6e562d1350eaa7f78f09fadcbf95c7960f0c7d6b0aea5e7e661ff20a6a224da44111d4a07bd265c175f5fa21e2de6509e8f5d055edc2ca5ab20087eb2acdcf65e9eafbb911de081d749824390beae0757ff19c0fed3264e41d35a5fbc0bc36a5a05ab6b8fe54aebf9c1d144406897d2548a833ab08590cfdf69715ca2076598ec31be93efa73379afb9e1922d76c37f7c90f79b78b82660f1ffbeb4f395e14ec3abdee09329df86b3211e43ae227bfeedff4e1a777ddcd7b5f70a1292273ce6b0e3f6515cb72ee9b41b2db6650937b88d56791805e0f5fc4a99bc83839dec428d6f1fe7d885502609b5704fb1036ee7b56146a3df4f7b3c26af604fb0c4218869e1c67e6be9a1b3fb9ebdcbb86f09e74127a67657e5df15a5e473ff7c6c7b3bcbe9f6b552ce0673af05ebfc3890ebd42b0cd7b2058478d9fbcabbb2eba6ed7def286b47aa1b6376cf3de1a0165cc8424ca68c56837ee624deeadd781d60b43b39a907d3fbd50c8d77065bb09fdf6f7ddb8e7decd7dfecefd5d9d408e3c2fe8d659ae7b674dfed9bbbb4f21eef22b41185fbeb44fe0c72c94652f0c75bf836406cc92cec1afefe762158beb2d0cb3dc342109ed98925cabd0f3ac6608ba7b7b478939e724e64c310e8a1793d44f4eda8d62762b99dc5fce26095d1fb2bc7299c55ec731771ec65999fbde72bfb01bc4c78ee3ae6b6e6318f64d3a4c7dffa4577763acefe7ba8a45e861a8c9bbcf445c3321913ba624a1f9a1e7957c9e954686b4dc85bddcb6a6c6beada9fbb16f0c6bacbe3094b744affe7250e82c11d08d39683b5d77ff7cb8140c7ad00a01cdb08d83e2116eaca39fcb3388b37ae8df0d5ef8609dd755d6a2051bdc584b3f97a791cc3ff449e4cf9ff649e8a5ff56c4cf75f17560aceea273f7c250ec7146f7fd0fc781ffde432e2e669de5f7419cf297eb655b3866e798b3cc3e306814bf02c27e83d2fad21590ef832ffd54058a6198255db61ea42509695c87c6652d4a9072a3c8ba34b73d75f32425d85bef624facc7eccaedc65daec9bdbfb326a7e32ef7c2d09febfefc08517ce32e5e9f9416166fd49748565fbdca2b08e5d39679b03b9b454257d40fa790f9a2f732446e86f76b13485f435c8a69e4d0484a2997c43026e5684486bb5d12c3e45f4b461f53e3bb86ddfc9232463e51dde815652dcafa2f9d2bda1c0d5a97600fe576dddc15fd8b958a9e5ad1357a0c7bd1f536e8b7d5f13b7aee25a38d66d9885e5ce3fb7a91ed2a2f0d8abeed4644f4fd5e46f3e8bf6c77463f2eb96648db0d91fc52bc914d21a25f22e343d1f5f02a594d14655c95d168341a8d306bdbcb681dd9bf2af3362af5e1e6f47f67955ccaed8d750e45b2a3975a8cd4ec12d18fbe7fd3cc681e5b5fed33d1f7b7c5a161d1d46edd99f6f3379772e53fc7a19e7adf338991fc18db22694d319f3dfd1b971ad29f6d3aee8e5efbcda55ccaa474473f5fa66e2ee5666f4d21f2978cecd66f1a91573a6af46ef41b7399d26e1be0a17402a1d5ba6e4ced2b128944a2bf31dacbcccbcd627ed47308df988f4e8eaa9022f12991a7d6a27ffda8760cfdeb2faabdf66e46ebc87ed6edddd2f52837fb9a71f66e46f3e09bb9979b5d8d7257f3b485030c916be04349e13bf6f069be06c2bf711ce76f42db74c78d38b41f7ad9e7ae40dd5b56085fff9a2db423880c77658b96a02630814d4ac0b73e097c7fd2f3ea7996d927d85fd85fff045e41bb602eb08aafabc213903072f6bdfbb894130ef5feb33fddcd7b6e4e01c8f1fcc34d10df539c08c26e3740d8ede607bbbd8ddd3e87dd4a02b05b290076a328bbd193cdc18eec0663ec069dfd92f143e856d1636246ef356c9866e80d4cc646cdbe46c5f13335bea986fe867c992a7aac6a31a64ab191753d60c02859c271fcdf33e1525611405750ec9f904e58bd399d1a00158becb1ea581ceabd0fd5b7bcff02c6cb972e5ec8b864f003391b3ffb28a1c7f16e4d31f608890bd31761faf7be05162fe2c6bff72b367bec91b8458203c7efc4cf9e67b5f9cf7d9b07d1f74e46155285905252972abc2484fb1c0feecbe23ee7b6382e370d3f3d27c54f6f649d8fcf7dbd7aefaeb854cd8ffdcd61e1e15d507dd7037d1e2ae96da5f95a6bfcd799dfa1965e876ae3799a46ff3ebc87caab9aca2b1e2aafecebe0ba382fae4a0ed6f58001731f3719a8f5d7f73f27ee9d8c3ee6ad1ac5faebbd3ae1f78f5e9b40e9b9fdd7a836d9e9e9b9fe4d5c1c7adc5561b6d843ec33cc9af809f6973531af2aada5aece8a3585f47530609bd762a0fd9babd261a0edc4347a77efeefd659ef451e8d3bcb3a6913d8259937b4ce6b14722f398dd0172bf4322fd13d3c397796791d01d1afbe4c6939e3ecfca277b24d867760728e6774c311649f638ecce0d6b72f0935c4f7ad25f9f397c92cc535f82ca90e04c0d1ba515a9f24a8609256f247baeaba17bd5c652ddb52a10778105296ee6eeae38d40b6571416e8be3f230e73e12c5fa23435ceaaa90b29bd806f1cbae8ae358d9e2c6f0d48db3c271b80b2a4cd968eee6aa64793d5d5001cbdd5c50176350e16e6e096fd5ee3d5f7c1c6763afc24b90a284bb3995fb92e03d40b6b8544f99b2e57dec292ee5aa3894eb29f781a155d8a1504e388eb326b7aac9ad4909ebfa24d09a2e6b72d627b11e5a7f59d6e4306b7256895e61cf2beb79e5515c958ac57d6c83c1e1f0bfff31a1409e8612e2712892a731002c21b21014de40e7a0738e995f17d4bd123f39129b7b08e11bb1de8733e138d01d3a7488614b1061e22ec10466dd1ef2d7d9234a9a70a9f7fe4b388e17269eeb078429b4c40f77e4a8a1a1966559a723e8f615892d9744e914ccad157417291436b3c39ce5fefd738fca3d7ca0e51e3e9407eee153aae11e3edf03f7f039f9c03d7c6e56feef01c03d7c72567507b6e9f7de7befbdf7de7befbdf7de7befbdf7de7b8f9e6e3f2a64b1c2080219d77ae925c781ef18765d56fbf5beeedfd8cd60cf3382553b14c12a1d06c0aa1c7ab08a8607ab4c2a56e1208255377258554ab1ca060eab6a0cc1aa991dac2209c12a992058350282553137aca23a5825fa81559a0dab660e564901b02a0680552114abb213ab20005885f9c0aaab07565935ac7a3cb0ca59567965553fabf87760d50e3ab04a871c5895030dab684cac32e160158e1bacba516255c906ab6cd460558d1956cd905845926195cc8855a31856c550565111ab441aabb4c9aa29592523ab628855a18c5519dbb40a62acc22e565d16ab2cc72ae7ac7266554edc0dc79bbe54aa1b1457c6eaae632172fcb42baa19cf8dd699de6be9db59ea279ed204628238ec1452fa1bb609972ce9962e8de3c4f8a019fd466f28643726a4084b7eb25e894b9d4632f3370e9a2f82f5ba3c89d8b0ef27eb6bd8ad1b66d74d20f07bce25fc64bd65856e27299471f90a97bf9082cf176380b98c84cb5f8ca1c58d967c1308cc9ee4a7b6a6fb59af2baa40a12c47e7423f594e8ac02712b26435e21f6da82e89cf37420eda3648e143f70fe55c589b604fb80bed06c5d5711742eb33876dac8c342f0d6221fa1c5685defa934b89b467e6a1a47558af915e5499b20d7c25cd238675c090cc854fb29bd3ccc08d886b592fb5b7be8655f0adef81e4a993435990b28d2948df3fb9940f92b528b51e421b63374b06b41ffef014afac9e9e6b05fd6871fd31c70989ac1755277138280b2bee262ffbac78dbb96cc5c0c742f6c527e647b71b0d41083f8a2afd5095dc4f8b96fdc4ae3ff67c9f7f79ba79e5c71adaa01613687e1475e9e9b91bc49c3f6d924a4efacabf6610f732f6f4f45ca0ecb5c83eb2b7f3d3d84f10da2df4ae59ed87f25dc24fec52fc650251e227eb0b40e1430eeae9b91b9371add730f71bcf9df2619d3604df79f6105a5390be183b4fc8d928227314714d6478bdd8560ce8c56830f11a50a9828c1a8c717fb8ec450dacb839d804aebcae2cb3a690ec66760a9a9393bd1e13c80f3f619ff3467f55b185fd34929509cd35bd0f873373f2a5816217845b802945b1726bb8b827c7794f458a94dbc3653172f0e596a2a40154c6cd7181155ea8151390e1fa70590c2db070877831822b97c1e8628c1e58514596cbe3b21757e0704fef822d8050f6e2ca94dbe3b217548cc1032eae70b972e596a8d48026e94aef0c9abd27460fb0b0e3387e1d745c7a7a7a6670a50bbce2055ef902afa861e6c2cb39ec3083f8c78f0c1da4b917840f8a4a7efa48223d3afa929fae9d24e0873ec771423cf77ad224f9e9cade875096c9cc24320ee9f84bc23e84c8ee00c107ca4ad30876f190c9098489366140637e7b970a2d57c7652fa8a072793e3fc50d6e4c720859af44c90426e0a797fdfb4b8331ef4a7bd187bfc4ccfb75f9c3ba448c7124a594239e528e465eb2199a9f85feb25b66af502625cf0e1428cae0f7975797841ecabd20ecd23ce03fd1bf6c1a81d98bb667df97704823b864f444d7d652ee6545a1f73c856386b28776f4d29ae48bfe41f8d75f5dde75897eeb32ee134d213542afd5d86a984c35966412c2cca9c8da77341a8d46d2daebbb4beb107da96a4faa312f53dfe3a8377e561bdf8519924be08ffe0afdec42f3e067a16379a55d02edd62ddada878ee40cbde8af17955e4a1b281b769bafc5d4e727cd5e5fb25bfb5cd167310fbb0befbdab5a1784f021fc1b0abde863eac673631e1bdebdaecfdec1cfaa7cf992cabac14ddeab87f01d09c9fe8db27f9ffdb3908642d36eef8a1e76175a87e8a548547fe697e0ee42f360beaecb58c24f57d087344a1c672af11376870ca941828464c88cdf1e7ad8f891539a392e657c8096c64fd8e39849c0aff113f6a659729254f99e641e0030879904fc1d7e8aafc334829dfc84c5d8e523dce8852f3fcbb2ec4399690ef19397ecaf87ce33f8160ce87b38821b2f0162efafcfc9f991f5f013f603da1f39596592e38509b070190c2fc6b8445cf6c20457ee11d7849fdc28e4e5325dcf578dcf57991d7da9544353436d4dc9cd929fb02b15e5c6bb2e94f0b51f0aedb673e1f39517061f3e91ebdf0fb961d987d8de15a275a3d9b2ebb26eb20dfe5563a8d28c61822997a770d98b29b20491efff6a08ca4c374f7ec218873e7c4a0a4d2030cb62201480288aae7745ef6b6aa690ec9b744cd5aea0578c1388c836bda6f8b93597c5d0e2e7fa0c00009842e0db2df4466412edc3c99b1c2691c854e4ba6c064a9749e95e592645264ae9055f964118b2347e7a950832308ad1b8562548238a142a8cba565358b9b9d76a0a2b722e11379b5719a28f970d32faf9a7cb77e4023472727ef4f8a15df6474e8e0050f2aa4cfce45e10c5c952a906d2d45897ad29956ca00bc678d735e1e9b4e3ca71d51dd7d7b8ec8e13cfd30f57f6854fd01056c1ffe20554bcd0cb6200c1cad5a243420aa5f493cc68ae5a6ac20928bc28c118d73d124fb95514e0f550b85ea41313fcf742b2bffed90d087937b3946d621e5a21efd28fd89539689bf0937bcb0574a3b9213fc521439020e1270c8945e227ec87e0cc24fa42bb59e8a70bda661b28b3baf5ab3cd24f34e6df1402afbc317fd1a79774e90f719c186b0ae27e728c96c0e7da5cf6c2878c0b1d8708f6d345aa347e0abd358d6061c24419994337f652daa2040ac769c271d80b29d0b8ee9978caad1c97cb69c487ee5e3fed2ab14de8dd6cd2f70ad5d1fb7033d893646ac946dd7809177bad6e3d6ad42dc7e98e3efb91fdab02c96c76b9ede642bbe5b8d7c6e4e6d2cf3efb482b0df624c7c130585d1528140279a09f309a6ac28568aeb5029a3d8d69f4a3e7d1a842ebd26e37d73f6a69fcd48f3d94b444f3a71c37393d7c0c41e2085f263cc52bec45b5297bb9b156e92707c5c51e1be885551d77218d9f9cfcf9f45118721173a31184d75312c6aa19d25f3577a69ed8c63d097b51dfa77f6368fc74fd6926d197fd74bd1741d87285b8ec45105870230621b4d1c3832da81777e30a0fd0a0a9716f341ac9525069244b3934350f8330d660b1068921393dd8713408218e2f3dd8024b0eede360368365073ed924222f29b117b4832b242e4158aa38b7e2b2032c2e088b2c5762578eebf1c3620175254b303101c779a2f7de43fad7c739815ced0315592ba01b139a1bf397355d464c31d86874c5541a3fc9c7684a6c235f54b3eaaaf5daacd29ade5fd6f4ea5533f858cdec7673731cb9d785e432b9b90e4b0d77012dc4c852c57bceced244501603085af0171274c27148efafe3461fb94f359d6599966576be4ecb297bf694737e77d659cf3965cb962dddbba3745a966973ce18e78ca5f99e8b4d8af04df96464bf65919af0f5b3b31767ccb42cd31ef4539cefc3c9c89eb2654fd9b2a76cd91f0a9da4947376cfd93d674f39a5ec96724ad953b66cd9b25bcaede64a3bb27cfcf053cf6cce39bfe72907cd5352cfc63aca0968ac5527458bc6e25aaed37c8ddf21c38e20f11318e8c65f989880a35cfbccc28c442291487376b7813348229148241229b31d72cc4a93482412a9db30a7f8f829ca1a24128944ba261052cfd89c399a3b5ddb26435f1f3e49d6f9389f2e49689f699915afb93d35a78d1e9b404691e4d91b5d2399392d2348e9285e24fb9ee224db45b2872273d2932d64c6f92548f662166b5f6d348940975860fee8e39491736633cb6696cd2ccbb0cf8c64d99c738e3eab4be6f31d3dcf89c94899994d2023dbf4aa4122914824d2872610528d1a258a93938085f08f02343f8a8f9aec1ad5d1f02f3e52bcb7e85244172dd6a8cd85a3b218818b4bb98ec9517df79a327f551d77652cfb8964b72590dc69a1bce6fc6b0a79b7497b8ff302d5defa8dbf649a8dbfbe899eff9c8926ba0966a6a1799e40281392eb91329bd98cf1e1b3ad2e657019638a53e9e95198c42c6e9209e94e97321b8cfb188ef217238b2d4aef4eb82c46165a382bd79d684cee7c9f4062aca7212d13d235591745f4354aa50743ab53692f7e729b69d6b9f8c9bbf8a90c3f51e7c3c5942c9b77e971521c87c1b8fe8e8ab3e238fec5dfd1f0945bf9bb28dec5bdcbf5a0cee2ef3edfb31cdeab4c9f72d5ad7a951b54bc8a4b719cedce3933eb52a2f09df9069386632ec52bc73ec51348066766a690f95aaac63b498624439221c9907e3b5d9997f9a7056afacdf944018a797f47c5535180441fc5af803428aefc1931596366d29f35e665d5715724b2d04f33c6b29fe6eb50a3256bf84cd17caa685a0e96fd446337d29d26cb99dd98d09cdccd24fadb8a9fbcedcf6ae1f8d1f7167c715452bd51e59d69309b4ecb187ad9cfaacdcfe604d242e4c76f2c8e23a594f137ed69f34bcaade4c8e1f33b9ef2280ec609e79682d94ef446e66fe4f79cf3af1943939446f51e877252753eac9afead65da2facca6cb7a1c1b08d6ba7239bceb3588dda6938ca5f7edb99c538e72495323057a0f6d2b9d9cf2869fce473fe68c690ac5149d689cdbf5c77f92e18ff4ec3a5388edf2f8e13e1a8679c56f64362cf8f5d87c81ee2270ed2f19bfdcce25b35daed66bea5e4665189e368d647f147222dd69beb9b55a3bffe64051a7f26074966244bb4442ad5c891dd686ae2c77c4d837138b2c10c893a7e1a1285fc18025f8ba1317e169f5d8ee3c8d772da4eedb3ba31d9216bcc5f55f4b1d2186596c968dae8b7d2bd826ab36e34776a9a66b597d236cdb251e56d9ff4cb8ff609109227f0e527c15e84bdc4fe897cd3fcf83c2b58ddf72371df3fbfe547bbd32fad69be7c9ed54e7c674d734e8b047b6977dc63bf231ff224b18df53b4048e48645cf3b0b4589b4d534ff14ab695a2748e28be8cb3700affa45766707967856a2df4e22d8d659ea4358cf0e3524870654505ec92fcd774ff4bd7ed622ae7de24bbbb3d3443b3100af9a188057ee0dc02bb9b54f6430fdd3557eda81682fab7da2ef7cad36719f4e90f43bbbb3e3ded9ce12a56d076939a02bf95b67b95e565ead2eb9e279d919b6b13626a5ac9a90b47b47e555b9f77db93fa8bbe2385d032ee0e0fa3b2b9a879be2aa380f22c349806e4dc6f57fde303b030bc79f6159063388adae6ad5cfe13825f72971b8db43f72b5ff4c00670ca3341ece71a3094de295e967bbdff585c232f53ec633f4759967563599665599675e487655996e533094822e2ef3c5d78e0f78580af1856bdc7fc83681e6e87c0ec10d70571dd4713dcab96eeabf372d6558ac0293a034ecdcf58d52529502680715dffe0badf1ae84af74ab230eabdb3105acb02e903d0ad7d94a04d85feedef29bd0aba974bc19ff91aa418a744afe05b6f4a62edac3e5445894bfd85c2a5a6cd99b15be986daed746dc85d4039e85edf393731ff3cb2a1d2ddba4a57e1a01be3f182570eff5c55ae77575be92b55fce4fe05d1d857d5ee0b92b519b4afe9325d72a3d7127e720dab55bd50269474157f8f51e25250c42a440d3f57e8fa7e23d72fe97f3857df8dc114d9e989666871fba7b5b8ce6791d7d5c3dcabaf224640e138f17b3c74356bc98216f7aa319708163d56162c085ac1df8162630c5ce859f59056d0f615877212a07263321c11abad7cbeae7f1c972e7e70ab3416683dfdf75da59ffcf7b1a34b9148d31efe02443f453f7f477ba844155a7b257a86af7d92f922fbc43e0142227ffe13ebe1d3da2b4d1389449af6f093887e7ebf2b3db5e7998f04fefcfe395fb33bf2e7ef580f9f67656a584d2de5c3f9d2a74909ebe12f40fef4e113becf79bf83e6902fb3acfabca0fee2bff842fe6feb2c5a16ce9365f39e253a3df7d56ebbe9c0abb3b8fffb689f35bd17fa2be4520d0346b9e7c175ee5d15af27059f19c02968db8a5bb60a7bc1bd1585fa672f09849657effaad881fd3753dec5dcf6a07b9583c4e873122d76cb0e7ce27bf2710ade745c142a356fb5a543c95c351f3e5493ed6b4cad7a2a2ed80ce9f1ffaec49c1a8499f14d6144b058c9a3e816868f8693eb57d1d8c9fe66bd6bff8693e7cec75409dbc25d03f398e55fbe6d87173b83659cb9ddf63c79dbff112a8f52f5afd12f3d7d30eda624dfe333a58cba33b1a77fed65ede9b40e83f8b8aa3e65b537a9ca2386afe24bd1eef01a2ee492ff3da6faf87557de716775a59366bcb9d6fa9c0b2e6f34c16314297ea95f651544dbdda99ef00fa77b3a63415a876b3cb6144c1c5ce8b72e7bfc164fd8cd566e6cf5833961b01a7a843a581719ce450e36dfc7c6703e3947ebebf81716efc7c0fc3384e74e8a57927385e075e53f3a8691d67a4661835e7c74bd22b66e6717d55bb3195f47399522aa9f41a022a3fbe0ecf7e9a715a2d2a3ad8194eb91a1835fd4b4df338f9654adfd5c0a94702f62f2ef57adca97930d13ae6cf989f39ddf939548b0adbcca7b16a70e79b6a15773e8eca6c73a35a56eefc52b551ad16b08ef935aaf502b699cfb3c9e0a7f98f0459bc1ecb0a269a87a502d6317fb2806de6c7d8cde733dbccf672e7d39fdf64709cbf933ed3f7a794d277ff6abc31ade1d0445ab5a8f869bea8c2e84856c6b2434df1d37c8b04547bcd26193d11fd487b5e69547b6a4d34867e8cd19e6a311ad544da7c6b8ae3dcb8f32d2a8e73fdac72e773cdb44b600f146795a210b966bbba5cf8913a2d7e826f61a1ce89e182de89e18238b3d60e68963dcf26afaf297b1966081f0b59e0e6f1c30f745a1c051fba2028db40df6b6f411cf06ebec585f039c802a2a117fdfcd16f2ec857f0df13f88171a9982f6941add82c2b17fa5091b25953e0ab02335b3d390e057f561f0e053fa68a2a8c348c8a3147950b9fddd6576496c5f8f1c99e4af02a4669ba4c06db64efc341e9b9516e4aaeb45bfc191d78491f4934db6f45fc4c2055609bec6766de876bd26114c093054acff59e1bbf2790f859957589b43a30c61e917ea6ca7c462a21810f7348b509972ab9238e337a58ea1eb83d85655cf85d055635e9fb847b99d167d6948d3e1bc55136fa506a3efc212e257af8a3cf2610ed23183d1beda924e6e9c73ca11f436d64a950115db2fac608bdfb8253d3be319853a18705255cf8408e4411bd2e414840b3924bbd27300a7e182efced860bf455e1c2875cd806be0f8f4265168a709394e65976eb71e84612d2f771f1137c0bbe6685a09f6559d9b3297b1d7a565174e85945f12ba0eddd2e5df8cf4fed2926391fc371ac9f4dfafaf5cc26994f423f2dafb2f85b113f51be8ecc64163358e3c2e71a68975c5d70bc81366411854e5b066110210b8df47337fa2c46bddf6e5c7e90c6f0c866301edf3ade6f160fe72eff0ca78660d4bbf9e6e1a375340f677f74fceb36549118c5dc8db7cc216e92601dcd8308eb786f846ddebb226cf3deedf6deff7d7e839eeefed6615d11b1ec7a978c6df2c5d1b3a6a0ef5eefbe9f310cb3fe3d0b48d7cf05ab5502eabead634e8bf71c078b11b286203fb1642b46c81afea7ca1597d2be3fcad45e695728e4b460e10637889fd40da51aa54eca50aa518d3acf8a52faeea9d6df2df33d5282f4a24f42ea177d92d1cbd45e45199919126986348a2e12bdcc27193dc93ed17ef432f60990fb27f445cfabf8e448341a896490d017fde87d787c72447a9e9548f4a34722fad1bb1f8d9e6477b41ffd0e7d51cccb545e89622f60f4f41720434bd8fbb71cd1177d12ed47f689cc6b2fb24f8090c8bcf64f56319557dab37da2bdcc53ed65fe09fdd1e8e92791792dc6e45ef43c2b5ae96b8f84bef6ee35bb03e42c12ed457647e6b5df19f13c227a1f2e332a89410d51bcac7805b4c41ffb988a15f1c7b4fa0ef59e0201714352cd37bda28e57a2da2bad88e31b97c4876e09fcf8f07d387c4c3ec626f97ca38f1fa118216bc07286fbfedd59d610b7c5798b3be2056d6bb22c6bb22eebe3655d16e409f9880531b210f41d218ede11e2e8e70971afff593d94ef7bd6a1770462aca0cab5be57e023eae79abbf597fcc4d7f3968be348a8f7ae9672e8c65ba8cc31848a97fb1e091fe2388fa444cbfb1f4850a1f292c04844fa2d4bf97976714a88eeb966f31e305f5c8ff3f9e25eba7c01d3c591c1a54bfb96202e0ed5643854d0f573250b16cfd258aa4c7128772c0ed5ef3f0ee5aa577128577d4a6c9f9e2f60ba070a27fac970a8fea9e448134c600972a82c5db41f917435e766888f9e72c5a1fabb8a43519f18e96af78c4eefac130ed5dbbbca8443b97ac4a17a480de9aa0f87ea9c9274f5e68674f5e450aebe49ba5aa2912ee650a24d50930178c5b3e215140ed5efeaf321f89d55e250fd9a87a6f87b438842587a371858380c2945e86e7730bab0c22f872185086e0a912f3f7f57736bc14b080b3d85546ed2619e27f768010ca453b670251493030cc320d412c616b890d96531c8a842d72d8c21a59c338c2d74b99bbcd6e530ba580284674416e2829c8acf54142b7d9965c5eb7afcdb8ead741ffff3e10f87b35ee6ce06f1f973bffe9efb1429f739ccfd3d8661502ed60fbbdc8cd6f1fefac6dccb7555bc0cccdffbcbcd8850b897e7c54ffd2ef7d7d7eb195cf21373642ebd33e8133937fb9d3381a35ccf719d74dd48e5c6e0ba75e57a7d973a0e8bd1821b5c4742bc2991dc69f839ff865c4664660b8940e79e259f7561f29acccc130894ed277e31dcf6418d93d0eedcdd9f735ef9bacaf7b181ba7dff2ec339d7655cd6eb2eb40e7f575d7cedde6e75018a32dec776ab2fd725fcc45d1c1724badd214122a847bfd73f7af889df1974879f38879ff8bd4ae327fef6f69d7786bf9faef76afcf42a8d6beff7de7b1fee15b68c428c4c7b02911308934acefdb9dffb76ef6e7e1ed77e060ef904e2a40b43eea190fb4b037d67bc65a544f0bf18c3cab5b9fc4514c870a3bbf326d88d1f826e1a0959e927fad1d6b08d75797e64beb1f1357e56e8210f79c843a1d0475165c2a1ac8f3db00a4bbc24fc59b30b7b86bee4a7d04d1a688e33e8c94fd63b835ef19d618a5487573c894808433f81261cca0a022fb44bf8c9c26e4f20a6f826f8427c03d00679376499b041de753b953c34d0f7a537fdfc8dc9b81342197a252e45ad6547a687750ba931a8040c5849a39a64cacc88000000104000b314002020100c8704a3d158344d9461fa1480119aaa4a684a16674992a29031c61862084106000000000cc98090a00040edc0e3b4510121d699302988cab9b717d1bf564aa3f76b43893cdd4d714a3fab30cd2d2fb333ae5c99e068e5bfd283b61de5735c20427be471c8016b4307bb82a3f44cb15c6240018508deb0216059936198be7696ba268748eee1d6ae32b2604f7128583c936a9ad42efca735e5a4841991733c0630c4a14a5369fc696db1e4041e376974da7f9cd847184150bfd2cc0331b110dc7df82909d3ee3309a0fdab6c8c1edb7fb82b79563e0c335b9da0a4b074fd265482102e4f87e695353b60bd52f8c3e0344930a3000c7cd7a36a01412176fa08b468095549fc7301e7b3c853079c3345b7625b152ce1fcc7ac3e981527b024a90629ec803e47c2c16a4f1391d420852f4a42da44b4da18657741426568b8562a1aa83873db387a6fa2935c3f71b2e871bc45b15434d3f3df00a48572078c191b3ef23b7c706ef0ede5e7f9b374e46a80fa344081208ca4b713189d15ea6a73794530e5d2fbd74e00f66495288db36e985cbe099e66b90ecd4890dbfb5f1b2ba7335e51e195d5459daac8b8a7deeaf28fd4c370e1c07f66e37e328e56ecf04e7c2b175851554abef513c04937ce4f4361be5c9cae92b7eb5db2b407b8408b5c0bdaf1d7d158f42278c384e178a08d95c1ca100bd280bf6a95e2ee418abbe975b8f2eee5aa0224839d42d0e1630586990b0d508bb28a5dc0ae0b027407d0288937b57e636aa8f91dd9a67e0dcf303dad080fe060a84b5e5377ab691a6ae72f01148a238366ab5c87a51dfff22f300db595941bcb2822980984748d89d905a1122313400df51ecd6a510df42c7302d76d7c4b03bbe85acf59c6791e023f5d15e4c3e83bf926813b7c8e8918851964cbdc2d23445280fe474e95579e47e4d60fd7cc79172815048dd9992df957701605ac5b6078bd1c96a910ada66e4fab4aac2b1f066c463c334b2f826499a5fdf6067800d1aafe3b4894b3318616e6857b235dc4781fe1d4f96ecea9f8c9a9b8437740455ded64b2c04600a6d4546f6701035143fd0886c0f8a5a64748386c929620e4013bb849ad9d07e58a2120f5c854af84bf46355036087aa39b9fc9359e895a0eb36c8320bbe2999bdf4f6bd21262a0ce0f76754489c534b6c825354864ece3bb9ad4ab3c9643a7996f732aed863e4daf5566bf1dd86ef502c00267962534777a2c1b2cf379383a1001f6ac7f300e9235f26686894035740e9cd9995b56f223d6689426dd72e56ec81c2a28c8103a7d85f30fc82abdae2d1ae40fc3194ede061146535db8f7900d69a4aa393a1a88d77503470449d62e11c793f223be91d7ae58cc03e0612fc0f4cefabc486b6044f26fc46f175f289dc1012b6185b92083d298e17621ce53648fe0dadc5dc5a44e34b7cbeb878be0cedfc6445f6d11af18c3bc9d708762e0c1c24bfe71a80d9b7511260bc7724438e6ac83700c58663c31f727dccb1ff85cfbaa81a6ba9165df96367c81ae71afba646a255d41cd036893126f38a0e91a9aa42c1c25d4d4a5f32061115f93f631bd8418441f5790d622a09cf500717da1feab0ca37be63943fad369e43aa6cbfa1a1cd58d172509f69034186195ce2d4734a317cd5783b26fed723a69ff5851f673a8a313710fdf2b4beda2ec07395ab4b06ba907a5beb3817a0cf3696e0272d75c04d4b3121f04dca95c00e22b9dce95099e6c9a01e23895e3d6c5ce7690adeae8601e6e14c6de5a21dfaac75cbeb5eb51521395112d9abb998ce5eaf0039a41c42f57373538db6a7409f34944021ab234d95173aac43e20d437b639847096ec5af8fed4b6d838220a2634a13de812058a3ab0866d876a78f09d20ac79cc3c0e01dd5ac3eb076d08c5803ecc651006f65c61675a5a3106bf8d665b346b95fa2adb70dee8b9d3c41b97eecf51722acbc6347c65cb0a373060cba1b6f1977adba80a9b7042a81dee461e68aa4b13f72fcf7fe343e12240a6633c325a7e235be8678be80eb591a5e753d9d959376a91433b9025e2c70dcbb8e690225341e02d435d1bc37c38b2e703466a483a55a581067d47afc292b8dd5463b4935e3c36351a5c16a20720e3d013fe8c754a016615d96db6a673656b73e9f81401228c5e6a1d7e59fea089f696b06916c9e728667723f3405515b17c08eabc87093eef2438b877d595dde3186228f2c4b90a4bd4928ea8129ba33d922293a6164ee89ccd4a4cb8b30a52b931d6401015467cdd7c68022bea44df6fd932c15b764b612953ce9afcb1926d3ce39958014dad2317bd97ffc61222c470c5183c2f8b05e0ff8b3258decb8908294c11ba17dad2277af196a02e977b3640c1b6b85121c498040072fe3d4a792beb6a84558d7514abb72cc27db982b50b5a9d750fa6b5f8db6036b63722842d92ead8d800142817e98a8a9b2cdd3c65aed8c3598231245d9d5b32577bb4a05b3af747c8544a98c0cac575a1d9c274e2705e2411a83f7cf89bb4c8196bbf02aeb8d30edc6d844f1c66beb0512fefd9fbb3524a22376940de8e7ec7f7dd74282a0e2dd6c90a58852c729ec98f57eabbe9264e54489b98a22a47b171a74d55fd127d18ac11153f891d1c255890d44df1aa6d06995f4d06605c3a80f05ea5e6d658fc3049a9f99145b424caa81b3ba0cc3b4c63ff872a31600dc2542ca9782e77eb4d003a11f2b1c66f0f2d7ad3ba8e6097762aaa8050f90e38f2bcdb5c1210d9070472d9660e256971c5a00f30b5d3813d14b4fe4c36d4d03ad13d2cb9badc969bd657d2c8734b4fc4772127822dcbce009d7d9dc47a281c6d05f10dc52d4a116bc8b82ead395a5289fad3c3f12dffdff25ddcbb1e38ab3fbaa063b71bc3781df015e1a82e2e8624450da9210703e9026ccc8c07334a822f6abbe002f925210e5ab9a6cb2a8bf116ce682c760245df818cdac2b9b2fa28ccc74284f2142d020a918606aa6b2d2b9a4328bf97d8e1edf6487cd4270ce21600f15fcf42883ffd18970df0d71cdb9cfdabe885a59fd4537e78052c9db3ff0a8183011691a4678e28250b800722ea575882703f8b450bb978ac98ebccc24f2990346b61f4b17e5c656f8631ed890f6adcbe20b310a6cb35fe2b555eaf4c9c0f838a949a35fb4f0ab290c49ba23e086d4a90cb922fd883a0212fa8034e3ee868f5383b9f01213202b8e6002e5490f12006c6d79b852d88fdd7e8d1699e382120f2f88ab565ce10a92f5d6007c35771cc76a6941c09e5e7ed7b59774451f4fa362b1b4cb85a21065f0af4fbac7638e12d0c0778a1bd8071ac5e8fc217d11e6cf34c5032eb7314045ad64bb59810d55e080b849c08dca8b7622d5354700844e703d154126abbe4c2b35cf31c345b71689eb0d39c51869540deab61dd2778a4ec5c805ac061aeca45c8aefc946865bfdca213a409e05787e03e337a3673e531976898f1d265ca351448069c39dc4471a50a6062a7de42b7ea303afa732b2973746719a7d60d1fec63aff340b30aeebb6b2e4688588c08e1dca41e2b70495aa25fe2a3f5a61126c046d1fb92160c3374b38f72b6a0214c8801939fef3d1073d028f7a27388916a342005dc9b6ff1ecac106a865adb2246e74834c9a313aae3be528478adedf874955c8b46c3e5f310a2ab0703aec7a30123455bb4a380ccbb2b3a0301d8c040c4f222875137e1d388b2f56f41bc58797b3d9b5beacec231f65abb00fa5c74fb981d1fc57429e40a87cb0a42db8f88af48e4b8520d2d2fb9cad74f121607e69d1e83720adaa6096ca7920376a367f593cec6b8a0dcb19568a68bba994021aafb98c6e26f756c78e178330b6e030ef89dad0d63c2b50a7011dead4cd5e9b3da8600c455ec0214fa2bb5592380d33d5a527369d4d08237128741ee96842e625dde6fa2ab69cfb15983b991a83601681b445426a8887f9477ac5f2e269bcf67f5794636c627a963a6e8bece3a173a9abf97335d3af8928c73f4bbb16a3f31bf08c3c6f292642e4e3a9a1c130e811d58e5f05a79725ba3bf46c6c53b2271074da6b386e1028cca1bb8b56b6edd67291e17a7683502697a46e7e0e95eaacffd929a0b4ea12101eca4c85b4567bf43405a291a2486d05ddfe5b0481a4062665b61cc49bb78905bd00073a912149122675fc9d5e40e286dd2d8182e1e1287e38f691e928e302f0e3a7d8e965f8a8fc0f4b2779cf64c20ea4fca7f1899bced70ba88be63fa148a7d184da6b64fb903853ce5fdb5f5edec88733282578c2c6905531ff3410aed73df34a1e469b444a2df343c6ce1980018f891f348e457e34dc63e53d232b92f0f4ddd36c85548b19d902c51c5f9488a57911306a560d99f41c449bb3e83fd49da34e3e70553171efe4e1bdf14b5414d7696f242b351e451d6867b1f95b5e293ca503cf5341d9fc3d0ec5efc10ca033a6b4f08362a0b168f106cfb61719642192820642b6aa5a4b9f37e39a06b184fe92ec9637f0cca13dfb18aa0188676bf305397a89c724bb5e6bfde1437ba13fcb87ff3678b938bd8a713df0b7bbdac64816a932846e5bd7bc1c0fe7213451cf27c670a0360d7b83b3160a68522e67ffeb79fa7c7457d514e0a52a5559133e110d8bc75c2d4182c7d93bde29ab87e14be61202ab86cf0becec87fee8fa6afed90b57b980b9260bac999fe830d427bd153f4715294392dc42cb61d2d158d0d09b1fd6db961cf41eaa9bde644072ef041845a032fa4de27a1612cf0a4106d16011c8d9bf4268d9286b27c42bd11671b7aafdb7089303880ec694e04e64ebebb5a44e97b9d5404fc2367e9a7ac901d368981176ed41e3bf23a28e6b8d61f9645a85baee697b42b0eb679f0f3407439b2247f5da86d3e6a8a6a84079f570d24115b54ae7d43a19df4e22c54661e05b3481f855d3401ceb1d1139fbaf26b642cb007b8d95b6524414fde1c01f1ea5c3dc62e33b1c65ab4330e513f4e8b762c681b9466422c5200cebcdd11398f96a3c9fd9a3af64c4bf7377d3dfb86ec2a70101c463170e6dde583984b1f211236c722629754aab174e8469cb0887ea1db76fd8007bf9a43de53f92d86baf2405f95ad603e6d1db7044321ab9aa18b2fec8bff04542f5d63d7b8d8038477ef30059125d21d9236f396e1b9aa7a1401404ae07a16f0d37f777198a0d412b201e43ab9e298075874304c1bfb77dece87113d9ce715a0bee8b848edf9edf2e14ea9a360e122e07aa47aaaf9e1bb1df6ff35b18fd8e2b8a1362b82f041877e790dd6012a4d45c4403f8766bf5ade4a297032a9581585c9f92d6313d8beadf25dd1e279091d3f48f08a16560cb9aac6c87baa0a7c22b7155f65fbae0fdbb9eaf22ceec8ffab1f4e9a8f0d8b0dde56289ac4505ffcfb06b0cd5d2e3a29c417200894ba4c00a3c67326584534474c431b2015f96112ed6beb2da7bc736398c51978c5bfa800185f56f1156b087f0c52c0a0a46e471deaa298f991f1d85612fcba2fe8a8fd6ae955dedf965d9df84bc7a184cdeb7a0b80ec81fcc3056e713e6db4663fd6decfbe414e3f9c6849092c1cbc007900b6801c729dfe04d69cd857a36e7e1f31161f0f3c88827059c1edb06cb055744f0b96a1cc59b69125ff231d2fb69dce83ebd6e60467f72a96100970f4d93b30bc73486c07a604f1b4de0c97c3d817a2095d18acf2711e96dd8b42e1f0dd3d6921f5da037a6db27cff0c684d48da3cee36c81224a1e2fd61f3c360d9ed8089476967ee0a6643959d34145870bbf013f92d52b42b72e0256da3f2ee413b83c98680cb5d31d6b0f2d1e701940f9d914baca282700625a3698eba32278d05ffa581d616611803fa82f583b654068fca1ce3bd8b9445abd1c001e8d99717d49d92a0c417edac06345ab4c311fd6a68187ec2dfd680270378236bc2f324940667eafdeb42359bd688eb4a55dacdf59c84809114925101bae38741e39a8e33e796ac036628befe690f14c65a3caca428255c7559ccb8716d73e9fc9498937d8495a93c519fc36333e73016d55c27ce999c3bfe93ea9687bceb9d5e8ff704f2310b8c54481f8d1d15188467fa758be97406a85d98afdb4561fb9aa4fd76ab777b83c8607541584df0358fd9cc16f8b7450cc9804b67374065506349e4328e19fb0188e1b9f110c3dd6b7902990a78494ff005d1e06edfda2e15ff4bb313a1d7527d3a1fade4a332a4c0102abd9e1df582c5b26d8e4e2b82c888693333cd5cf1fc24a69c5237cb8bd462050b8b3db94cbc79bf095de7845cc224a06f9da0e9e03718cac255f8cccb8136f8134ca1ec2af63a53f1f84a58c1e49dab9c1ad93609ba5158acd3fadcf754e94c473c494c16b83b859bb716d548763457a7b4a428f850e150c21b761ce83828e1830abcba2a655df3c5c15bd66150527bc70dc18ef27800ac697c546fa5f5437f94aef45b2d3af5d5738610e590a371ca16190ebddf8eaf50e39a5f2d7fd7d8afe9d0754b73e978fb5c12d45a47bd210d96133306207169f23ca3700a00456378f121a8101d8a83a6e9135cdf81b75642b8453c338a0b79bafab2e77596318401629c1cbbcf57665f356098639538a20aead1b2061c0f69cdb79a412a9d5c855633fc5c2307e1ee5864185d04e5e18bc16e61e3dc7bbd53d0ed17b1cc00ce4fb405a9f88eff07660d2e5820693c33a0eac6a4524074e1e1026c8e6e59d4eba95d5d67313c70f157fa86a5728d9dc39ee7503b5aed4d99d2bb63969b186325ea39a5cf9e231c2b62f38f739705edefa49d005feb93e52e65925cf3a645598346120e583c9632b6418dfbdcc609d4aeb896dae267d68d33b790711dde5dd37d214a172dd522cf0aee97fba51c2258f91458e1e42fd8d1abce783ce6d91de0e3e9349da2a3c424bcc4dce1b49e7dbe9a81bffbbf1d6180a7801aac13109fe404c1fa4ca14eeb3401a858b488ad5424b1d022eb8a77ea2bd82196cd466015d04206e6a3e825de8860e2e6c0bd53f4d7e6ecc610bfd7ff470f266c689c04e6b08a089b573e0c4ec43a6d779eb783063a8a54aaf26c50c1fe63a783ea4241238b74c95afa6a10ae1300ec0f15bcd90c647a610908f3c1cfc5fb0322d734242888e767cd52539da74d44a545b43fc6d54329d11b1f9767228b423182a667384fe4c638894d4f4c2554d46aaa517b6a0c52aa5be9b4fa6ccb17a632bd9a659d20c44934a9b034ec574044cd907cc628e585f3f6a303ac14e8f1a5c5ce7e0c58000dcacc30a72aeb179c2cd02a507e7832048a3debddc4205c4293c60041d48d7de1cf474aaa41f2bb5e93718d11d6d7a4d1c565aa29f4af5c315c402d1726fc0eb9a5f32f94389e35e3a84eab8e9a544b576ac21854a9c5517036d242a21da912ee477497a87583ecd4636c106a90655f2a276600468381cfe227f555e16e6185d385c33fa8ce829a559c14ffa199136879b752cb787f0447765513431e7b0b9091979cf1edeae21361798bcc81438f6bf6fe990776975870fb1957d9873b39518d92cb87e08a89c74c13277640888a80f05d92cd8bba29475b8aad90b612b51c52bfdbaa1f44ab5e8c1142b17ae586a562a14dadb4f0b25c78cbe5ef2abd795de7f16c8a1099f567dbd37af1c11e65ffaddc97c78156b1de7a1d879a5abdbd2121887bd2fb5e9529c2812666443fab51ac4b6a6a5f66e989e8562dc0f096578fda7aecec90e38b13112a8e32e3abe0906ade23987dec3785b2dc713bc73d725bd0f52430865aedaa3f8569845cbc5e74a6ae0138f3f65b03ff8272579e1aa76e5d50a9c70059d92aa2923d5cd43deb6815aed5104654141cdc689e1c6b97361fc788d5ed04911f648b3fe382e2357e6cc7221cde048fefb05fa311aee76b16a0e0d31d8530e8ce2660b08482bf95f1dbc53a8a9247dc48a16bc6f9f53e20698794b7eff5232ecb671ea43fb6843abdeafc56f6555bf93c660ed5d313ba2b57d60b004ade9929f5bf77f2cfc16abf2be1505e5e0e3f68bbc1e20e9b1e0c5f910ea8bce1b3a69bed804fba70373ae7d0fc72d043e7f5ddf3e5428f8510bccf5de0937c3996679a6a539475b999e52998b4181b95e94e724973409744c60b332d541a71c7328571e2569fa2e9397436c996921989774daa2dfc9764ff01e0f0eb49353054920bda4909b07962c60996fcc916607ca8268b7d5452202d5eafe35a314f19053514e9c41d5067400da91ec727b9e72bcc598c8737db2d21e00a2fdc30e926d34e544d7826a337c488e5505f567cb0ef4ab3ebf1fcbb84646b18605b16bfffafe4771cde670d6149b5d9a6e0999e79df423cfc591e0a707c7b0c4943b5c71eebe26e9932e2f1f2add4c5855ea6c206634550a1efc6b6390231e8ce13d4d40821b18cfef241102e7c3e9082c083d78ac41008cbfac6338c1ab79c7d13bbfaacfa1d8c467577233f64bd8567e1e575eb0841bf46b51b27302191c8d202407d6aed044e892505f4427b122dbf64a7b96a81aa3ff55c349d30658db14e0f07dfa97c91872eef6a3a8e7b23e6d3dcdafd73a030853eee175fc8944605b1bbde837b44181561c21dbc873776171c2c4a57b2e3290c4309f4df4e67f78b478762058c93ee12e019227b0be1d04bae3b4fafa6138ab4134aa674599085e2fea693a966b3627a284d427907571e66cd908abd3bdf07d478294288ae7e73a7df1f7366e543c593fcf6e72960bd2b3348b81bb114926c52a97e283a261aca71f3f7342833b98d0d41535176c518aea22f981eb849f55b61042ad33f90437fb6362c77d00c3712d559d0e079f3855b451817b570ccd635851e8d0e47cc900b8dab4de3bfe75d49a9c0629d8a3737766249058e6953472457ede8ff866e0c50553102c8140add5ef212bdc9e025c56339b900a960897f9cf19cc36b8a2730977ed04b01cc355a18ce82e846be82dc3c785eebe78eb92733985b9bec2ed32a0a78f8c94aed5f4930445e251db51a2568c47905adb14dd88b0091950c177b404292714102c247a644c95d009accca5f4e72ddb53b19c0c8188fa29175ef6fe8e6d7146354ab93c8c16c8f69158d45ccbb6fc1065fb5494560a768af2adb1c0579d9efddd8214efd368bcbc5a50858c324cc57cea6c2651ec8b471e5bd269bb10f145314470484c0d8d94622baa93705e71b5aab170fd5569900e3aa3f83e414615c3061c6007638b9b2e60ea17a4413f56edcd77251526d636c4c6bcc524b45146b7115e505e7c3fbec7acc2b82b367cec44b8e7b4ca4c14ca4a266149a2c19a4b8ae9889ae836a10869b91a69b5f285299981b25ef1ca4e11244bdf8c71245f5c5243ed26e546382a234c940991a28823b06acf9ce1dd8bf3df9142b6f0c2bb95f855432b138cf01ca74b4472b2963052ca52e309101595558ccd388a4a14713b4420a640bcf8b9fb686fab217268499b642bd23c311c0fa03ace4d8efc1e9dbf0d2c5901290e5b16798fc918125bbeb0872dda0193b113beb062003b2f0c3635668d7ed4fec8ddc56568f00304b1acbc2a8ca3203ff702ac2ea414ba805277051ce61a47f125be98d420b3460682c35a8e829ab94c2d8c4d0b986f66bef0161a061e7725ce7255977eb77d067d379a240d6a0e2a56c92df88eed841208df89648dc2ca3421709f275536d876e6f6e4ebe2f78c4bc80d140cde457b910f990fbecdabcb4f34147cbde3ed93d5d29e048b520403800a0981a618ba3ff47bb345c9f057388eae48002d0beb0d68ee8ed7fab3cb93fb6d652f6b024683f6677bd30b0b32cf0e6cbe3117ec038eaf211d7142d24d8d6ff409a7cb294ddf53ad88075873b6ec561a2845ed432ed517e55bc070643b0e5a56dd5dfc40da3da55b8d57436737f60a19cf74b20e740dba6f5f2a2fee71fab8d0f5851e41aad5bdabc92cbf58e4fe05f67eb2e469a3fdce6c73b2e1108a79e9828f206e22de034d43ee2029916b50018e8dd576f97ab264a0dc52195ef491f809922fb9a0449f3a4f50e8d8bf40541ec141f34f2345b49beaef996f239857b56660c86256f8d14900c3525449f4b0b0afa8459cc1a38592e129e8a2225fa3e490b30c543adce81db5f56842e162a14f194f3c747bd863a9946a7fa2bd90c94a8c71c207e68e0a5d8b555e4435195836ae003387b3ea752c04d2e996cacf8a8b6ba147db564164aaa5d3a6f27bbe21cbb868c42ce04ce5c8a999330ce4f48158ca8f72a3ad8c1d32db4ffdca58b73505cf4dea8089dd8bf94113041b2a604d785c1bac27f4741eac8932a92325a6dc14b77df7daa2acfe5043d3d3578d51f52e702f2b6d8f483961b8ef75bb9eb423cadf8ea7f7450d1e9b3e9b2b19f1d8b5fb22c75cfb295c398133deb985ec5c172d866d37961a4511ed498a1ec914e5ae0844c185c65a840c79e8a2ead72edbe8839e2606ebae8c8902c1c52cf4e85de76c2e2dd800a35fa9e61238ec9306e7db2fbf9ab3cf766fd47f549e80c3a96883a5d00ec92e35498a1f1b00c66c6ba3e291deb510404a4e01e28dcb5a9f547b34e99a8c4a754f5d1c4439e666401cae8e04f3761ea2b7e738f8b3a3058c90241e13c5aa6591a638c530105fd5d48a701ab3a41110bcfef0bf657251c90ac7062f744218631f6807b2a26b7eecbc275a5e3b984f79ff755d6b38310da6419974fa3a90e03eb3604d5bfce2af6a75b38f75547ad40355868735500acb1fed8c0512d083e78ed3a2c89bf8146c79fe86eba4dcb7a99d9c62129edeec7e9e47f463fa54c0b915b98f36521b9566df0157ff37b1c0dba629a236d432266f248b6ea0322d2d030aa322c14e47a887f8bf07f0f233322e642d60ac29964e27c6d1ddf26ee50bb134104646b0d610277910074d395c6ef1362a2894238eaf8425d73758020bab8e2001092fe2e61475bca0f4e9be83b6850a359604b7789d3d5c5e252766b2c63ed80429d21df1d0ac5adc45a5afc7920aa94886cbad39e6cd1abf6773a16287529cbad29524205ddc59cf209c11c869258ccd7cb1811154684f072d1e62c379e386d4a9b47ea2b863e39e1dea0f342db21ba6c0684d3e9897a215fbad71cb1790901bfb70ccaa2794c1b7d97175a7cbd8cb7869c144232e592062e034321ae3fcd4bd57a496545b45190a4e8de4d8977084eed139e0ea9558e30b2b2667f2f21bc388da1b4ac3fca359f70e13d6148badbbca802922dc257dbd87087ecd6c0a1d4eb3d35fc02901927a32baeeb2abaf5c4c8009ee2d908e2c81813ff70a8063d10e87710d99c9f440cd33e1a26e7c6858c08c67998134b008265462c47b7822be357a3914659dbb9818519ba5614474ac901ddc754101f8329dd5c64bf11f33dc64f2dd0d146005e45c06a634a056f47385118a288a2ac3cc00c8c9112c385eb3077c43a98df1fefe276e6f975351723bc0fe607ef6a540a49e2af70db158e3085f995e777df4c330be5c90f47587df5c5261f6d3477527aaa91b28fccdab84374ec4d1eac07a2c2fb461b8d03d1efb984cd39b07433fc443ff5766b081dde90949a6fb411480dc2ddfee8677ae3122118a838408a173036a7baebc21e10dd1f9d8de6d1a1a2df65f47aa962a504a66f9d9867d9334caa9c560d1aa009c6c9415e09416490ccd9a17d0a59b8d9ac9830b8fbf980c7f2386fd8b1ae48413fc73011e7516e473e0548af7d8e54989e1fa1d687a3d12736a7a64e6b7b059adf7b348273a38563657fb3dddf3cfd322ef69dcf70a42b1152052430b4f5a8871a1e3c8cbe1a8c22dbe6fb2e8fc151f81fd2d229cb5cecc8f292822cc0aaec4bb42b938190f4145133b36c6ebbba698a4de57a7e99e04175360eea350a686f7a760b58e94f8fef8c67d28b809a7cabf3e8811ee9ce40aebb09088dd9320b1133ce1b73e0ad15ca6f929b7b84f7b332a4eb7a48ece681883b39f47edb7d1a7c01f157d9fb4ca501112ab1213534f1adac087c0cebb00e424fde8e48cd7740d1d2f177bf02bf4512f7abfa0a34b3a7966f1d90b67fb52fb82a1d197a262e935baf90c0eecbc0ba75515735151a8ecd5256f3219938a1c7ffe19cae2068d7cbc03b3a0b6fcb40e4c85a5848eaa19f2d7fd8244a129b8c128cbcea614d0c9d62006894d41446bac3c108c8a1ca7bb2d65124f67f17e1143adbe8d8cfe3d10af340f036a11fa07d8ed0705b3ab5ae53bfe513e701c3e31035fb59423bfe177661358abdbe39ede8377ddd02b7545d8ce8e5b0d4aaa20da44067b3cd5758449203d11ae23271261445ed6e5e570db67afd9850c8a92d87cb1c96350d385abed6eb48a38106da1a1520fad029b38957b425018040071620240cd23d639d471862f43bfd14cf0f855a72342e3c3362c7fb92027504bc51705cfae96f38f47571f7305a89465ffda390c52b755a5d2e85988e2fe723578fe190060c096aa0e4831f273e5fa4a0a7a66c13d19cea719b4abb9d6a7734db3ba8efc6bfbd00b54698352b0a28359d88ea481c855dde1d40487b11da996fc400192bf18ea55eddf49c23a293fc5048db190d9539861d00249ddd88a7420e8d21fbc8bc86cac763017e33aab90d143cbeb8728f8db26085e2c77bac5fbb81fd1a2822a92d40f30edf70015d04900d078cb1813f050e9abcbb74071327a897db1b8bef6abdbca944d8fb7951a4aef49eb851462c48d0103ea1426b725412a481ce429f0c65c7234373f000b3dbcf274814908232c841c80212bad675e0f4bdf9baaeff71dac1bbae84c4037ae85a5ea448b77a64c120bac85487a1898d147e3b9169a2ceb81bcf97c369ba362047a4f5b5963d9b42cb73c4094d5ff4ed5752a709e2c35b8a428ff01e2f98b795d7f3b5e4126f5c61dfcff4b85e3fb0bea016dd8239d5f0a3f84c2d3066fa00a7009d2e536ceacee5e43b5f2f2496ab9e3297dd481458286b5e9da9901c6f51be8b3be0ca148e6a81fb218b968dad29202a3fd82aaccf3be88ed386afb320673f867de1addc00e903795bca6c8722b1af75429aef846658c66b16c10dcaf4b9a99e4bf8605a602bf1f440d2f4369dec9d1c8a2eae17ae544f42884466c099944d1adbac463b001de6f16464765ef3c3a3535930b8e4d3065f46c588b56242770b98690d87145f4d75190dcbfa8577e1e5cc31bee45db18a87d14d4049f9f2319b6a63a8c544d3fbfea45708ede32eccc4bc851860b645f36d8f7ddae719702c9f42650188d37b248422605e92e413697c13b9b033a42382250d96295b9d01493738a86ffee625e32309b67e165855d95f4601584451293a60de5995850b8c0a6d27ae48a593e940a6536b2e4c1677ba6a0b91440b876b2f2624af2ea8ccf4d671ffad90bdad9a5987c4dd561701d0cacd2f64b46b3a623e36c181870cdf8e92635ea86a3229f702f7d0a553e3c35ebeaf01061cb307f36ffd3407615fdd4f4f83cb22e5f2a64be0fd86c64cdcdb8e7142d48b3c8a4dd321ebec9966e736945290e9a6b636294c106d5fcd5e8dce6503921f5cb98fbe4d75329a797bf0ac8ef7cdee6d1582484b8a08d58fa5f7c8fe453db92b135acca170ac5939a3e0f501bc7ac1c6097ee6d2d635ad3603e9a002e460c8f973981231dbf7f5c0294836be1e51211dd6ac3c07fb610558244ef405543dea99f270418692e36052a2a51298dad40d96e3b2604309efe89ba1d5d4c3734d4e55a5019cc898d51dcb7487a801fabed47dd170bd4d9b334e863371742604ffb944cdc3cf261573cb7f15f60867a81781b90906d6c608bbbb4cd727322a2bd9e9857a41a9dc6d1c6f3fa02c4f747f047489cad28369a03ed62ebb8df6cc5865780af0dd7c7ab28cf1c35038e0656cb07c4459fe29e5d0fb92b52de9b6a3a468ee6dde8e586b6291168e081054504f69762aefc38d2b8d4477d4be19acb7aa8f52b9f1fc6936b6e16728a7e8a6f8376c10d317f41aa7f10e55230effa87ee98bd7f08f9cc0e7297c4eefd6f573f9c776f4474524bea54a5046b97d0b9133680a709cd29f6209a4ec7af9421843517fa879f0c0e182b8f35ba476c2c54c5bfd14c7a7e83291e68021775256102a7d2f836e8e108018d9a23b2e3442b46dc72ca1525b053ed39095936d4c0e7bf6402e00908c1341b9df9695b1f4a03b43c070c46b8d9b9333c1be685f301f708ec46cd1b59b904f55d87ee41ba0a285927269ee1b65310ee34cdaf0d212417c85865ceab48b171067719d7551df6d40bf3e60010b0788948bdc7ad6c8a8b20cdcdd261d7be9aeb7129c78cefceec28ca03fce2a381365b8b977a04d56fcce6a19de6999f81d36b02fee90cd3063917b49f09169c0ba2cb4625f5647c6161b627e557afbb936a1dc5ca07c98c33edcb1d39d10953f1d6973520b1e2d28cb0f4134994af0d93e59c4d204d9f1b66951ef823dd257e61ad34086520f7ba1de51c7418583a67e35f008bbbe39fb12533091b3c2f4bea75b371d950026ced161fc2873a4d06637741cc66da1bb498fd110b08350f312ff661d4f11ab9f767dafc78991edf658ebf8db67b2cfdfdf287a1f2589b208786f0fe06aba7bf160785c73bc0bfe34d2eaf78ba4e5e39fdf83ba2fb0ff73d7c4759d81b78090507fd3440171864130d3ea3e1b54ff127875e523c605b1833f01d396c265e84091b39d83604a5cb1fe1aba50bd717d06b56aff9738bdc774c900f243e4bc7c6b9d6d66ce0b0d7708690aad343ce481e8826bced300bdd1c46c8eca1b25cb0da4b070dd6e16445ea5e4971cdbdda6c7dd376b1d36053112d32655968e190fa1e8cdec09088c2206b3d482d2ffd3b234aaa97f0b401c20aa413bfecf1da89861a2c18dbc4fe18aea4707da6682ac1f7f4b21ca06c62f1dae917f3db5c553ba92e4b5421d95529681f60e9ceb81ca60615248b08022263b883a6cd037fea5a76c76ca8d08bd4c7d69dcecd6d926970f8e488b67305b90eff5d3721b40bbea0f0cc074ec9028c3125272de8b1d143009c1c3cc897a79887cd17a634d8eaf4a10945c62b9ccb7525c9e81df90a3e2a5e20a85fd7afb8106bdb21a244ad155a6817f594f33809bce8c5d4ac3b3268014dea15939d6d3162317d5014f6755de2fef39d19d65c66d35d19d4ef37690f7c8504325fb04887adcb4b03efefe8080c427d0aaf5737a0104d02f1ceff40cc10e8372688835bb7b6b4061f8db4870547f1dc1f896a484fb5a1ee331c47e85fbf2e7688a56e195b2d0815c20f45a154aecf60b27779b6571012b4e3bcc946d1a2c319cc952520f04ffc95fed9eb3826632587e815f2c16542b5b4ccffe0521d14df63a054c28a96ac432f11088920bc10067acb16aa800e331880eb549130611962d78d22d8fd6306f6e60ee298160dcca083fa70b063b62281943a2ecdc893ec8692cc9f1979c53681e0d6f3656804f60d17487f37e3267c4d923fe7a06ccdef98887964c5070eb92d98f29eda0264a846db4c22b36660a0118d80955c0ee20c2fadbf7138262789a17b48be72756f421356fd81be0c20eeb7386d64a7859203b5f028879b0405c624e5e1f1ecc60d8fd4838f16f0b300a8414badfa31e589cc057c45023053a8b85c8c70a17f26c96db98e977a6ff33d6a846f12b6cccdc2d276324bc52502a3ab2154b7b601c78818430816061526d797df5a6f54d8ffc338cc15230410ec1881c7de0b345f2526e052aea1b330721c29445fb6f0c91fc6244586a1b12698f7682a66fac685f18162cbee006237baadc93343d796998d5051db2e8782abb03231a227c26c08e02f77337509c67e01814d6c783c4072f200c0439cf63fd4d03630f053f31775485d2ec623f051a172db2bacc97034beebff43c58308f6c91bbdc6817c29074ce69cc3cc1ac18556f114e44022ec5191df8a65b6665e39040d8ec767392fe9b79e9a1d5158179fdf311a4b568e9a3238893fbce9fe35d5ad2b229025bd72bb6c00ca4f014a33b974d177a262bc1bedc019c286239910f439c804c41d893c98992da8b32589bda8104295a948b1b3e76439ff4aee6005bf6b4b5e666cc37fc6eda89b6f48f60203792e37e1469614a9103fcc99820e95b77dd89543232c890043e76dfdd821a9223543e762442be24c01aeb2778841c0226634179c81d8a75f598a5e5105287a3963a8b565abcc9c5f0d660e1e408d0a3c7ae62767ce480e1a0acd26327ba8651745fb998006060acb7420849b7a4c892837c6397fadce70568264bb2831d9f5be1120bc6a4b29a68231e69f31ce7cca2b53b4bdd858c0ff8430522c0ca32b82c9d5300eecfb67333f10f9cb836e0815200384b054901b214c53184091c1e356bd1de20598a4c568d9c7d3a5663ccde2a35545dbdcb5938a6e092c3c57d770e098e7523e5c06d36d5a398edce1b74ec84f8b1bb1b6318135e95636768db81d14b675bdae82503d9c9378b16cc1419c3d47d310c2ca53f41e46dc5b2ac7708094a0274e2966367f16d288a50a32cb4044ef5b40063ae102dbd05b41b8941aa1cba86fb024d876fecd48d92695af4e1be60fc5f37766e4b71091c6dece25c3a508855698f0523836d633768b427f9864260e1b603f8dfcf4d0db7ed08c2a2df4d50d5455fb218b1fd6edb2506e99da6ed28a247338b8a97344a9f72c3b61d231c1083878f8cd87dc57eb2b8a81855417b8338df5cf09c33ad2d83c8d66eaf360363cc5fe06cd33f2136d5b6ddaadc081609ae4b351ef166db2e71b76d53d604945f605228a40b7df29c5d47126448902819d8b67b9e9210b321a5f23c9ea08c25f4a07dffb9b334d0839acfc31be465788a52453acdbabeebb873483728e3d0e826d7e93af5e72e7aa9924638401e6e80c0bf174ccdad23e1b5093aa82998285e2bd1d71e4ddcd414db3159acfc8764d09d2e2569249df3f927a97c9126f18ce69163008c291a94a8cf7b819a42a0e2cd55766470acdf7b7dc03037e9d095ed643434444f7e4f173c0ca5c3f004409701a4258c335c6d07ecc455ba2881300d2926d0baf66335f3781608f3094f268c5c3bb9b64583f8f61a1efcef03b94ba2b77613befd613e745f8c6a51c3668070b369b6db63b23f47134fd065b9db180104790aa038caef9b8bee6da68da6c2d90a04ac54290077b029bb959a1aa770205b78b38bb117b310dc8d33f6af93bff37bd33687ce6bdbdf87d3536d701bf3d82176d898c47a747f601aa49ad07ba9efe22a5f3810208530c77b9a289cf9eed80ff791d5ea12f13ab9d48f932ea14ba1400a32403f78d881511d4cd9bffc5156bf75f5d06b5965c432bb7e5e6f393ee73b97b0e5ae425acccbcfdab729c8a2a031dac21d73dffce8c155f4bc8838bc7c592758257e701fee0d5aed19ddc1956fb06c6ff00bff0ced184590cf2857f812b2478c8ee4868f24d4193959d7520619ad7e936b9e05e5721dc9b829d68d007088285b84ec6dd8ce6560cb39a02f9c0d435c0de4cfbe93637d0dedad95eb61405f40c73a40f707eee41a209d4a2a61b34213417d14383e10fc811c1d65535434bf254f3b9a32b985b7c72ceec03488dc7018928bba424936425bdd2e7ac42aa978229cbcd9b7d38b62add9211e317bd7629ad865880e2c1a4f8b518645cd8233f83160c9a86bd600644020f7a0a01498963a7484d2bed526f4380fa8e3a72241bdc6b0459d2624d09114cc950a44a3ca74f3801a3e30ab042e5b5545bfce239a0d605386eb40f8f81e9660b7c355d30ec9487014d0c37b096694d4aabf7c32af941f171e7f92085f4536f1f6faf695b91911fc4a049759f69510ef466b8a595ada3401b4316c3d4a53bfbcb519ceabcf0f38ef4dc5fa13b4110b248938123be60d24d9cd57dec1a0c9849f5d4da706a363ea444643b0e63a84a7e92835fb274cd0591dd552270c07d8e8c86d5d444907b4c0b54627d38707f8745bf862e4f45457b3275669c9cfefb308e2ff3dbfbdfea92a5880d196820a4e274425ea1419cc2dbc74092a65fe6b7381e3781d1f8a62970be00c5593d09925a8b144dd0da5a4b553ad46b5ffc4383109358d2a51a754705b926a0f2f95a0de324984963c571fc14179eeb513e2742a9a987c6c432799a89bada7aade937e8be98400b28795a89d86e425eaec0dd506f1452497913f40675d7208269ffe51aabfdef6f750927d3be70c1eb46786935e412c20b8f855585d0531e015cac666f4883b3d94d310540daecb5fd920b9d9fb0f22c53dc7832c1597565582753a47a060a22e71ed83898dd9dbfc84b94a8a5e251f0d31926d61e9b515f58021ef93a97bb3f64c34900bcf89179102345e362316c7faf978f805d305b592c005d632a9b3948d6c1cb10059cc7978e15e5b616b1e667665f22835992a9fe745b984eb716da8c772530726ea2c6ac594b627d4668af13e157f991285cc6a95ff230a30a9f0c6e3783e19b062411e4688007f495cba843ba6716bbe0ee5496d1b00e003f6d3d85a9df38f66be46130d248df1979e90c22857b6ccae0f5d0cd5311c6d0e161d33801ec40c04cd354a68f1340fd76de9f9eb37ccac3063ae35e42664fc5b261b7519cc9b917b6ec9f9af7abc2963f890ce2309291c005c8c6b67e964a7b84b3a2bf4821eb90588f017a70214eefe051caeb1f736bddd4cf5ce3ee271d39383aacd4f5fefd3caf8845a4b3bf4095412d9461d9d1fcbf34c230851cc60110d436b0253d470a687c91975a9f34344c18923344642a6718f435444452ab1867575675fe5458a1c6e48448c9cdbcd8e9ebce3be2a02146fe0442784c95af4522021e36b78b2c001cb098b6009a1b0c1a25d2df9a4d6892d158069a5aad4710847cd254bcb46402fea662459c1d131808079d8d4f17c13e23784063d66255fe6a478f4c30ff927e40867daaa5feeb04e80e8b7d333cc8683768385d3028e8d16136b8e50d2900e0550b4d76537fa6098bb8228274f22a62ba5f87c45c01f17934f854a74886bfda20e80a6faaa8ffd257dd01de0811e4c12651fde0ee4e06f38ab3517e46910f10dfc0290e01e44d4249eb1decb675898134bb4fcf7ea992742d026bfbe399a0e76d18ad1aa24cbc7a907bacb48ce278c29a29d58749da4669343334ca7dfb6d2964280bab7fde3b39f3b8c0ad58448b32e8abe9f784cc09490804a5b465b5eea49ba07b57ed69a81207e5bd45ffedb622939048e5676cdd04f82e017489d6fe868b44d884af9ac968b88a7d39e293fd29827c14e12aa00c803c226532adee23e3800dfe4d2247d5b968d939dc977a29d74fdea0cb99dc7599e465a9a3035706ebce16b5cde3d687a79711f464defcc8c2ae9a76ca2c0954e5f935f3e0092388f83c6a05c85c046425108497651b81989deca76e67a047ac873f6a9a8c6f4d65a340ceb1a76535a971f26694853a5327c4698ec30620c4a4d77de79627d41b53aa2a0e33a1f77728aca61b7f797c969d93567bdfb491fc1f4a5a72f01a61fe17b8168f813e39a19a1122fcef2cdb33d9e12311f7a27eb082b87078a90fd1f15d3ebcb1971a58954e6918c99a1dc0a8c99e444e8f1fb489f3241da7591836d736c91e72c311c9c6c429174ce03fbe6e597dfd8ec3a8f615638ff9991bf082cce0dbb1c64b06f12d5518c3e3a31429bc39935d50e629308d0c4fbcca098e47909bb9f5472fb0d30dcb83407c5baabb3507091cfcdfd983ba292cb5093aa6384d64d8115a6be8ab3879ea499c142d485a7b56f69d5023d853fe1829bd3bd7862ecb74e3e44d4510746f532418fa66c72522ff17fe3b3651324e8eba3bfe188d2abba3757f69ec7ac9cfe8e329723fff2978acc8ec3d9282fdc1a412b520aba306528bc00e98c024351d60a625ba78ae2864583176a600279ea7c411105e7493bcc4bc23eb86a7261fb35b5520f11eb6ab45145199a88f3011774d452aa7371fb300b64d2798a7f021140f7ec97b010e6156a88cc515d4a80b727705e4baac72ae9dbdfde0969882ea69f264c9665a925189656507702a2be60001d78a551de255a8369b5d54c8258e85cdec38d5866115ee663f1be8f441920f5ce82b41c70a4db531eaf886760905b5300fead9a257c6b3735ce9b6dde5ec78de59876668c75cd3d05baa39eff520d7f99f2f06c2a615c0eb52aed73a1ccca28fd888b9df501dfe669423c9867771502b0236ac8a20554805d678244630388ac80a35dee3cabf9fec0334057e8f707fe0d7c6b6571b32bb25f65fa60a97c4ee1763b847c995053095430a7f6872e05dd42d826669a1dc5297354fba02717fe063a6c5670b0fb6003f4fe54fd60a3e199c206037f053616020f0a1bb848c2a7894075d4a7cd0b1bd2825ea023ea5dbb29bb132b77e530ddc1900510694f93a4ff0b266d677ebd08596fffd781488158ed1384f33aaef576af4e6fb8df6dd59a71bd3e4eac4a7cd38d1148d2e342838f2127f295e1ec6f42b54007c13f867e3c3043db9ceb7e5e9db0aa87f39d6a2e1cf999d7f3218fb9014244164b7624d363ad1fb0e78e3e07626d9f289d3a273471d54a2e85646b8aec74102bd42acb07c7491a2c251b3e54c242e2cd9f3305c9132a1c9b53ad95354f6cd5634128cc120d16ef3a71e06008f7af2bc106e181b11134ef3b4779b4afe72348a957014148681c2b769139df530d94490688b20a83fb418196ae1afef5c16565cd3f0f04dc8c571c6db9a4fcaa0763c4507d490638a5f58fc7dde88153f2cb72b48b151d30ac5aebc0e0a2676a4890900949d76322845dedd71f459f7ada68047ee722e7460814815e6f23ae8f1243839917784916348cd4062949841182ffeac37bb2b5a225ea31184a29ab2444335e7cec809e02a7d6dc48b1c4c264614f28dd474247a0207c2a565eff2fe57b166c6d54a9630ea733f97a12ba728ebac312d4106887002099cc8a2297c8a9fdb99829a707ecec2194a75500f10694ddb25b0eba5ebefdee2a3f7b94f071b1999064d444d222f990bde015efaba7a9a2c2c1574890b8a7675a72c2c4d3843378902a7bbeda827257d793b57b432b7b7a791fbe9ef2f0858c58698ff283e1b0dd21270e70b8a7ddcefe0f6aec856df04f3e3d60da8d195033368fbddab3e08ad25872b997177b1d3fdea60b8f4b4dbd1d5f9c98fc0313afde05dce376e97a88545a622b8a92a330fb59380ad15349c2bc7e39f301246a82d31e6825d573c7a14c90bf67ff6349f7d6086cbdc1992c12b682a8c28e168d20bc12f1a78f46cf0d9eea18bf2d947fb006b812cffb7afe60c5977cdfc0217847ffe0698225a2c30b7f7d00d995ef803cb52b30bee5be91c35819f5ef5da11d1b088548a202d960fb582abe21a3a61ac2cc06d881aff1d629c5e250240631c34f719b3246ef10c980c0485c5f8ec4c80f37a01f075d61951414f8c7f7b8340ce10d1c06c1211478faec0d277160de36d886fb61ecacc43e6bd30c1bf4f4495c0a7c166caec3db870a018b4a92a55ca26a45ae6b5ba18d01800459435d5463bbd5f74ca1e5271de6469b330cec72182176d1046d6034d304cb332bed2f8b56a8d1619b02cc5fb7bdaacdbe2f47f4a4c1bba92e9af82810da6ebfd78021d7756f6f8ff0a32c945f082e2a2c75279169597953d0ae122622cb2657bbb2b0a03fdc9548d812190dc0157223244e04d651df6952a1d81a6d3cb57d2a8b4f639751b584ec4a417fbf86d977fbc4980377a49ef955aa3701c2c40276e2378aa707878d90ab4a6e753e0762109a1f1818969cc74a7fd75eae11c7aea21632947cdea5a62554e61708f1617c6976cc70ae2db02c6890ab19cccda3382c097eb851e104f92fcc41e7de783fb8e90700465398a1860a288c46500c4cbe68033970ca11746685061183c0050a4bc4c7c361750a942bb27f9234888a434b1ebb9b2d31728e23e6fd15fd02ed17e8ad8000d9267f330bcce3ebdc0322e05c21dcc9f2da15a5091060fc263f3735286c7782fb8a0a81fa584d970efcaaa8130c91d19701b744abdfff1076bcd4abbe9b64e4c46eaa1c324f4e54f2c8b4de410ed88850f04966fc388c7cc4b271dfe25bbfa6006e220951979b7a3b7049355b9c5309a7e07a4c60f24e893034a456e6788adf1fb5d62ed618e09896fb969be818b30bc378d68d9edd797104f3f880d2e74f06bd4a1beb2d88bf9a05921ab201b28b600df53227adddf02ece6e4e336529deb3a0cb29ca86182bac715654b6d6a136ef4c7ad20f832d0904703b107929cfac763f8d3424829c7120d734f397b0b6152b6e453abf128f082996e0b004c8a9ab1481d57b36de9d95167d6c3da7edf50e34198006b4e0754e7701a58d542ab8e3277d3a35d59085e22543530e32f579be4825846b0c6c93561ffc97d38be93a9f50d762e1374aa343e83a286dd197fb47ee9e3585c42f8d5f047c15788b5fb5c2586265a17e86df8b69833add901da182f22310a441cefa11ee1feb03da1b8fc7263af5f17ceb6c64aab71bb3199d4254cce3d9c62044e42ad06a3a987167fd0495b71e78f951b93c0a7af441740c3f147e544f73f28fc17b3184a45e830e20901e54a7d825e0209727ba1d65afcfd2ca207961841323d6fbfb21ba7c145810763b189945f0ea6adb96474d5e64dc050a175a94437c8c9c11d53b123f0ce86d973b5ba8c07a0d3072f0fa058b56662385e820380c0c9d2ddc598d56680eb6b417a74904135e1c6811ac97c1d37c3d06748e0a3f51c037e442a42a22e045ca62fd8bf2e7c6794382dbdc95eaccb8bc058c953a0a34d69f23e5ccd1bd662da78b669f897ecee11f84502c6e64b0a162dc626f3dcc45639a983606161a38409e7ef6d2c828f8b1669b635c9b708db9e3f055cd064b9acbd485a1b5402133bbb6bb7875b63fc40ecc1f00ad154429c180a990518d45a8abf307a79ef51b65ded657ba23ca2ee069803fa9dea2a39bbb1b6b8e7595474781f332898c3d134b5e1e0c2a4d9d80fd7c2ff6fe951b825cd2a27ca950b4e5c60e988562b0c0347916f9a66562c6f9a5649ad2ebf1d36392091b030b9373ad8d9dbd4c5b526735e4c8847bbb9df9fc011987987f7f29f0c7d8442c69efb97def0dcc4d83a507d8afdf89613d875187e548682139616e2071d4c464008c0dd2432525cf0fb42a298758206b0999ad76ee461e924da7a0bfa0307b054b0176495f0105b1a54436b87fbf581f9cbd5db45fcf42446bdce977c0e3f84d46f01d079083bd9bbd1c4ade931f0cb240530b33899b394610afc510be4f7ebc4f17ab04029d14281a98bce070b3926f91b2402af460aa317e4f8467141b488b13a62d68ec752fa0b2195ebcb062beec38a41c4b2d48c33351218d0a8b7e3b24c9bbb9a18d2ee97cc535c77f0ebd3e8609492cde0859f400584c570cddd2a810d95235f38893e9a2680d4efa027763c071db036bff4ae20f9b67c5eff1717657dabfb90e63656e1e97e214ea121d05fc0e9478249128eeebf53522c4d25bfd457d95be665f05dc1be0ed3060b2eec1cf1b46ae8334033432881f5f5e229c4ddc8840aac33ad387988b060c67a47fa93e48d91206959a95c011a906f9ea962ffb0f86c074550a8b65807194f58246344c704b6c30c61d0de66fea71718013928e6d2d523a5c59bea8bec7167639875356ef9579d6fc874fabbe771168e1a8f7aa502fe6dcadf95e64a08af7e3f469e8d9c5d3960444c4ad1fd195193c714034e4e40167edb18e027de84d1bbb0e3f922cc0cfaae079e6a4a3cd84693f681291ca1cd23c18d078cad88100284b257cd38a3484f653dbb3886e472de0b1edea324f36398520d560a42e2eed48ed0824e37dacc9e983ed74e145a8081a87c53d604c82b8014b78a1ce79c60f027274f62c9b7a014efdd6666345c65db6947644266009dfa62696ef106de81f0a493e09140b0009ea05ddfce1492be3e7a6c270d4b9d8f8f429e8e39454422b574eb8526288410a89b2ce6852dff856a73ce683ab4acdbd613a93faa34025392cd62623c5c87562fee515e1860f0b185aa8354993d91996c4458346c6dc133970d22b186793c72aca8fb857535bb70d50a62f9fbf69bc76eeb6d46bb21c0b48555f3d704ca04772cc9c937b918f6bb2c83611455611683cf20888c83404e638cacf4b15934a176ffc1af4c9a97d774591211be01a89aea4e3b4e0c288407660ac66e207b4999784e22dd92ce684ae8f9dc536ff3284e6987c64485a55f7fa4d1697e8501cf3c71566a784b27a0a484ed90f2f9cd841dae8fe9b00a27f0bf8be61e7df6a59efb81131072316dc6d55dc86b0f93e425d2a86f026fdab8e1df991880fcca9fa1ab0f5e3f527127c48d662fd99a385374e43af382ad24867bc6f8ceb4150cdad8962ed45002b65be3a123b5a02472637a2503e1ce62a0d9e4b021f0a04ac7948755bce41063cb8014050cfc06e137e1e0c83663f98b2cbeffa8d91b034b4897bb588a0a80647ea9299a00cb8c76e24f2076e189532944b7d037c123d8a70151de086ff2d0c983b55f59204466a70c8c8e4c86ffa67dcc33087a2bbb5023233dd411561e15cec4b1fa1bfda38c8ff033a4390f849a46d5d7645331cd7fa9469e877074a98883580c8d6d8676752059429ea1f5c524a578243c18d0bef7d3ecd5a170910161fbd5631542a80c4ee6f04b0749d1453fbe71642fe9d8c4bc51dccd3667c08173a9ec5a49e7f16058d9e3d5c7404c97b798a530e9a3de32c710e7fb29860b8d6fcde0060c5a9198e28e9cd54395d06bfec4899018e575a03d3d994624be4ae605c1ec96af02ca68a06ae6d96eb708d19f2387724a376e2dcf9593fd3a1054eef70d9eb1cf2f61f3fb63df9bcac704123e26ceb39a7808b8ca9565c1cdde29e76ffc18a9ac8dfe4999ea4feb4a38e08150890daf1ed24818e02434a3728396f83e55458438ef7618e95fa87560ef4e28c76254cd1d0e4d5e37c8d14ee718683ebd35acdc3a6b89a16d71ad0a9e407439f300cd35151cb6ec7ef8eadefaea78981e870e09a0fe0248daa86987310c8f97971f7e012cc25a461b06c9fc49c2d5befc1034f10883953807f61b1d4444445154f87d6f6f63080deda9caf51510480b9efa5adb9bd03f93368232cd19ae37c39e3d4ad4c0653782b927dccc0d3ba905b854688b84640665194cdfec25415a7b7f7433756b203374824f2a45c7829a7ecb67d97c6b811a046120e59d2023b30805eb5a6a7151cf9dac2ae83ddea8036ac4d0355600ff8a9516a04467bc9735e72c0cac24981550b0d74caccf9e5882409091d00a4f1d2be227ad2eb4127cd803e65ec44680fa1ed78ab8ff05838e730a9011a172383fa2ac458a5e7319b77279cb321dcdf2962f6615803a9d0c96d5534258126f00105c9a5ba687d473d94dace03b69a50c192500ef93aa1d216aca28eb563aad71bd9de5b07a14430b1196ecf86b14ee2882837594e12c5c4424322f1c2b87fd10a38e45874ffc434d7727c717eff1edc2d2d7874f79c9b079bd63d14f007663a57d7f490e93f845b981fa45f1c949adb84b00d2dd89361f667fda0e2fe41de11c5ff671135f219ec75b1e370d2fece83e8fa45919ddf1d57ae59c63abcac7e0ba92807e1ae5719dd044f63a669bcf9ed3e1909724d8e49d40b9f978e94734c47ab42eb17f1386228786521d8a86a472866c16df70972ae6e7083c7630f39d7afb6eb8a77b25838828018a88a8de4d39561d193ee35d528109f0893c8d0b9b73411fc6a7b8c940c104c7cdf49640af5f67748c2725b0cb7c404942f33eb2011363d4d3dfa0695f8992371100f29d40c8765977bb4368ccf640ec824eab07c96c570f07a718f10b7b8542222b6aa08dc4abdd235693fe00ebd9ed6ab504891655a99eebb0b22ca9fa994dfa651202bc3bfab55772506f916f99f8ae82df3ff80506b28298bdc9dc868dad2ceef51dee68933784d5b627dd71c6624c8a3de1a916a774e6158b1e4a28cd9bcfdefc0c043a9ce28b4d423311942617dc067c4134b8d205eb40de2f43ecb54b498d357f835f3ac3b96e5cb6fdae22a1bf30ff2a5f1e6afb097231e58943c09ea777bc48e0c88660ef57290f97287c919ee983e393be59208305a81688e47e0d719f037718528001235c8706c3de3de4c241e60c26cfa619bd88adf626b61fc3d9a343c51a117996af1411920fb3e51355c1e7e4d848f8db6454d68da022a4528fd62c7797ff98c332ccab93541cf4b68212eec43a14b3a8fcd228c5a27815000a7b3ec81b4f037599b02de4c830aff1a491f7f280be1d1df83082a22b824a7cfafcda0e1c25d23a93222329c11b33a47db65292c991659743292dfe7d48c94873723be77aa42991c8e68dd700f2a1c0f80731d7fb4bc8cd1ce918997fd22d00d5a3cd4c47d4a6973872ceb14cf9038d564327884b9349c821dd3e181265f89677ccdee1879f4c02aa8e4ba85e6e08b68aaa39cbf04f32e929f6f6c359889c71259fb752a37b105f73347cac24de625a9342cdd2f6560047e61716617512ff644db8900b6c2b052c0911d7d2b208b51025f968c277fc520965e54d125f8f4700c154f7eac6abe55ba9a860735c442a97aaf1ef61dc4c765a39c0e418189d0735a5bdd8241a3dae3e7fac2654147d9a88482ca24e501bff7d0a220cfd3795dc506c51405c07b0d1ba0d62c5edc8ec83820b58667984be593cb95f9e3ee6255ab77e667367db7675da17a4eda2f32c240a90862e25209745277f92e7148023a10385344f6bb67543cb254b800a8a90b388eb0702822f5e15fd0f0d3e440539f8d4639bf6ef438f4d9edfd61f2fd98188f18a9d97d22442356b53df737296062eeddb129e0f6695fbe60d27bd4bcb594bc68ab7d0c6838e8e6b3be09a1fb5e8c7afd5a18432f31be4aa424c0c792c225df3151b32e171d99ec2d18feab32f8f69863a371b8d74fe4ba6daff6321bff63ae302e0a0282a71d7be56784273f19358e91a9c08f0d14896f087109d6591cf8f6be22690300bd4b9aefed2597b086e71933ba00047f553bed82ec36c80dbbf1c16d8df60d512040372b47af87cf5b8aee76fc1e0e34dd01e253bc3b1bc077f80b5e4e091798b4f0d8e06898e405e59ec59d17b7dffec30273c02555432ee5f4e02bd68cb974252258fd64d6a92538f83db1cba8e4e36f7dbdc5f5e3c085bc5ba2bd3cd56e0f5ff2c06b33e49d752f26b5defeab96f07b0140e1da02461ec57177771443b45d94e01f5f942cd3c3797518a211351381ee5750692c9c1229b40508ffb4d6bf50954c2cf802c4a407dd1f4911292e15dd6fb522c34380f950a89fe8e6d0e39726bd1244ef42f7f393d39d344b75992d30975c083250a8cb9d4b877df69bcffda6f2ad07f7f63bb06545b18c91d7054ee873bf82881300fe8b3b74621268797cc8ccf42986bc4b676d0df5db3de8d8b2e8b30e944f4026beb82c11197f19fd8d6cc80ab0e237fa8c2a528b0761c915247ba8d669906d5cf1e0ea42fbf1a64ecb40c52390d0fd6f99098fec3d398060745de6981bbd257d06f6c05e3983f268843bea309f0e86ef730efb0ad4d5685e97a1051e282c6d27e84cbdb92eb3024e664f5f912f9c716ec5a625609ce56882d8cc6bc4efe3fe24293fd04615c78ade3c905f50f5ff299ae307dea826cc6ba6ebfbd992566829a79f05cffe90b25b3e3e622f796d47f4778e8f70b3fcdb805d33748bf3087cd7537d654363421ad352a9a22eac943d0e5784a45005c44d50960bc941da5db103de2e0b4e451ceecdff892f4cce06005c060ce70cf5c8cf81feb6c963ea3186230e83d3524e030ffe5e654dca9fe2df885f072df1f580a0ded121326fc5d7865d4b86c3a1e73f8883ff5b4733d4340d30663668c900cf60ba9c2777a7da1f47d1c7c13cbfb96840de1a9696f7c8ac347f320d0d1749df13e17bdfca781ba3fe3ed790f17fa700d24cdf97f60ec0732a00ce5b18d38b8186a9ced99d205eb28499831aa922e0c5ca90fe0cd8ab580530f0412e76add0f1dfe58d4620a3e6157e334db0cfdcfb1be1242ec0acaf00be4fe60ed4f0d2295d4a782ee16039807083e1ee7f1b506a06e1431d07e88f46c433dedb9419a4b22f32ef846608b0945ba1da14ec9571657f5d81ad63abb2cf525840e0ef1d7e7cf926c2645f90098b20e919f45b4d96b89802462f312acef87de85fc8e67ad3906d874cf7ecf7c1e0885e4ecff311a6bd791dce2c94ed2c1e22e89ee6bf7782e4ca3e9df8653471f213ce49531eee05a593983cdc1f1103055ba3f7c9002861990a409eb535d06878d5a8a6d7d44468b8e042c0a28b8d0190d248ac26404647b51800398acc608548a27a007994304e90d47f2bea6b5d3078f0dfd143f8b55b10342cf2a3cac6152b36608e478472db2f530c19877461dc3bedae079b5de2a6963d7cf7f1f2970299e77da53df8653896c02af39537a16ed994e0c74eff4ed99109b699c270c973012825833781aa8e55ed54381ba6db28a10b4fc019d514844ae832e018edf4e91d891df33aee00166862f22a49f4c03c7b3b62850839c598b9113245091ce334ad1581c204b9709dd01a2125c25bafc31e58d1df57b09b4b215959fe4b40ce1d30cf6e88b442a24e384fa3b7f5f4301fbdf172048e2706ddc90dc1589e21ead78e8706fbf1a133ea0b197e179266a63afb155506f86117508b734cf24322ae2b01b32e242e5145b7872340047dcaf7dfc01966f694780be0d9df5f30c9189e908c98e1acb85448e76339fbfc9a0d3ebb0e54cfe3c4e0bdb1d52a29a12ccacf41868802ec2fefaa2ac2244c7c852c11458ad30714e1a74f628459c33782d05f70a6d889ec77c14893ae86b5a6d0559b538be49b73f1e4f02cb703220923274501f5a2f37b75568550ef38bebca31faaed6b8c2ebb689850cb61d442e5ad322b8dd7866c7cb87a72842437a771741a16d38c37036958a64eaa6f343a7300ee33dd327886c90240b9702a80e5ce789e8f810d8e005a633d638b2f4cbf0e600208bdb67a9e384d1da8aa935996a002cea2be142817b08aeb7a44d199fe38666ed80835a7a14a9c9f85f6fee9e1d3fbe93c1a51e326337af3dea75a9073154f5451034128d8032cb45fe06b54a4a38370e928bc0e95a30389fec1377be135dd82978928ec721a953ec41985636ce0bd24958ba6c3f82a0d6da80d115e87d62a8001bac1bcda83cb572408333ca6badf609a0333b995d0b5736c7b059bc1711d9586e4261f11b110061a431987e3e7af630033b40883334a6eb80c33fb10f78f8df8c80833222e11aae94a4437dfb12e7cabe07adaf985373a159837374ba10f8a21fc4bb7e97649bacb2cb2d6b16b7a0b1771cf2944c8bd66f01ee44511167df5c4985356edb04a18f9c2d4385a6220beaf5ef9edf4876bdd29eed397d6c1f93631e40c65031a117299203c81f95a8a9d5647e69e4eb3ccb17346c3997019a0ca5f7cdb2d8be7cac23195333c1be17f13bd58ee9f8d6d35235d6282ba40dcc21dac9d9098380963f9635be846fc4b5d7794c891cbb3c6eeb453a26efc0c307f25d0dc2a9fac6572771f782a5e2ae8e63a09ca8c6aa1177a4244a8f5f30e35d91d870ea0a9453d65544c5a242d1c58b82e3973de35d2fccb5f3c7da75ac95be0c2161b864a3fb2493e591716ed46acee3c8ab2c2aa7b6d0e00330c0cf1bc58f8684cd0eac7fc6831e31953d00d5647aa2c2a659ee32e0a9d000e2ca346b72fd4d4b5b926f96baef516b2dd2bb4c92110010210400031c4108220228820802804114000010420409846d245f0c8177fafc51108027d13230310a836343de230d0faf44a1108ffdf11916b9af3bbb62eae9ba6fcd5b0d43a232d8fe1be490e22a5934985c785c05dd210322dcccca6190fa8f756da6d7da28d2e668a011bb934410a48611948addb1716b04333bb275104157285e68d012ec852d7bb1d7c371f38ece02984387da264dad4cb4572039655e35025c6f1a9e64082f159d9d4743f13c87cd0f6e5a65428838fd117bb50d24408d27942f334d0b893356b2dddfc2727e047a8f3333148d4308df09f5739ac4e8536bb144eaaa74311c5a98324a74cb49fa3db675106136db31a0316e0e613a23762d7dbcc9a7c7ae5a22f52f83e8ac5c272ed6b4cd169e2ac122896fba0e50ab047e003712a3361d10788fec4603307681131b5b8ce4414f323447762d69981df6211e2a0eeda1474948662dd87592e803d021f9253990e237c40f4272696ccbc92a3671b67e9dc171c36466096c0666cc5b042ba5230b6ff9073c3ae23ca43729db908fc13a03362a4cc207da44d45ae3313307f06e8478c9739a48fb4a9c9b5ccc7f78f906ec4ac6506b3a33b159ccaac70f009d27f3132645a2a290763d24a285e8887ab680b97eb4c4cb26cd35ffdb08249c2a1d8c057a41dd4c1846a6908e49d8abed324c59856e2a83e6a3e9cc7b746cac841355b4063371fb1ddd48e7dbf7db3b3cd883d150e7dc56fbc02586c4e139686f9881b31285a0b50bee83634bbf1ba0f23215333231b1e0ff88af983b86ab13f8f32dcb0ea58567740da59c3ece34d9d42e46d2a9a163207273d5ff5ca77b730e5d3cdb951df45a3cb6880a495e0febd19b79c8138ae83fb09488fa6b62ea67219fb21c6b7a943138408cb71602f9f8f9a9fcc855f92329fc5ccb5231733b9ed1c8e4e1ac74123c83397bdeccc3b37f8bc2babf27c11aab20a0eaced4204ec14bc0e85523bffb7d0bfbfa697d0ed43fe5d4be1ae6237a0824d23a084fa9eaab0f4771f182b90abd98751d453e9c2fa98c1b6111e40b764e9acabf6407ae551553b1fb9f23df4c1fcd8eaa7ee98010c62066682171986b5de57e2a5cc1204f919c22258715e8d41040343576f7c4759a42b49ef3d2a81842b01124de4bd0cf2e5cfd8a9e830afdab9aa92d820ea200c5af3e19f68b834723794d58e6605ba2357481a9ee219697b5e05c2ea98c3b4d899065c918db3cf39ace597067b138ad04aff0b99ec6010ca30c274f42bdf45081076d8655ae70522a85f90ba5c5dcf7f4e05168fef6f708538cbecefdbe7aeaf8cb00bd42097900d08eeeb812ea9767f4d35be5ec9b2b41821c9afd46468a8b4445d2471531251a58b727d79d004528b2acb4f8508ee96d8785152a94807b1d8d29c71551b9c8a515f04798c25d14a4edfc72f71e7dcb4dea15d9b14acea2f16b256ce19ec0bf3c01ade5377195f8602d93d31dcb70229ed99ae6219b74381ad215c2a80e2dde96ed5740c0586afb6981d57933537639f0aab2960bc4764748564791cc9201383fd7e35ad5549342c33b3a2116a6015b39d5c76e81e8aa2d5e5618bd07fdbfc15d251a99ccc2971e295d51370ceee0557c5c00de358963419a997c74687c7c5865c7f424900f71ad8fd1372d54a725b2b0f7034d93e6945d62cbd30062e07b5261bd030b4f6c271d974b827215989d4c375eaf09d159e149fd386c785cbaae1f623cf7f7fb554a43745f151cdd7e8c1ceb3d60ca1018f8bf96899260ac0442306830a780f05d0d5492239a352daf755d9948907a3cc55a95f6e2a8c531da74de4045b1106163813618403a62aef55563d8fdf39d6fd057443ed69941588bc4a26cf24e55826216d904e14c3608c677989e23620e431c6f10369ee93231f76d3796fe8ef0b4fcb14f1d6d28d4c9ecf62e7a2995929fc7881f170fa0ef5fa56d19e413e7cfdb860e57ee291dbd932aa811099c8693e06798fc6ff0b95d91a4b63de2a3f888235a0c56fe0b74042d5e7119a5a3f37a8fd9a5c6c8953441dfee9cf4399758bdc28d6522d92933dc6a194a9bbb7aa7b22a4a362f5061516fd77fe59da3b293595c60b9145384769e4da9f566aafb7e7b01c7e54b98ad1db4ef43a32400026f7ed4432454275a7edd7717897948ae994d807800a4885e8ec2b1866c7f69f6e060b56ab98404bd6aa4584417e09a520c1aea00eccfb5769050b8468a70e4d7163557a4fe532a8beba8aa127be3a0b14783f43b39cc53a0b4bf280ca070e0422fd5088c5c9744503e4a68f92739e68531ad16960fbc0186861eec6574cb2cc5f72397f8f01409b6e1f5e39f4c0945baaedd902090c0cb7647934f36807b83a2eb483e3e019a0ba5afea68728b407426ab8b2bb2a5a2fb5f12aa961872a6b855e43154bc82b6bc05a44a722042e2f97fe1c6c0a226fdd6891fc628220a4f80c36c399da670b394657e11250b5a5d8865528ae9d71e34776505707b47b4ba9b526f8149086a3547b68db57015998bafcc6166510cf7db6fc26de374eb1c40d1116f23b6e31d4dbf944eb7cacd7cf4c29e99c50da471d44e46e2025dc19b571396ca4fc2e1c6c9e212481180d5e8521d789f24f1ac935db25d7050275acbbe827ba0629296bcdba193b0d8ab86c3dc93808741a8cd2673bb78fe00b836876f4acc6794a6a1cc2751a67193d984b1d2e520f854e466387771547ea15d699e004f1b1967238826d03199ab3985ad318d82ddb2d1ea511a4829480b5bde22a40da95961f2840747adb90b1989f2af5efbdeb8efe82ffca3ccd731e84ed4a0c289b3fd73a2edb462017f14e8ac7367b11cca93add06dd32a98cba0d64db0b9d8f0b60d16daa6a48b4f77474adc31de09927195efb25fd959492698423a13b801395ccaf73fb0b7d663105bd6d25e0e4c8abc65d525415160b4e9f34b3ab06195bb3a056c3b2ab2ef66d7215a7dbd9b2b914afc42ec5d6ef198d97c81f13b0bfcab53a07c156b4c14a1d536b3f27e91d30742bf62aa03e1c1f3efe23a0c1f0c61fcbab0275635450d1dc73d8310294bbe2299a24273e87ac325e101561c00a7a1e2fb27ae2c01298ee2bca972938e9f14ed0b6f940ada8d92188312cd430d9a318ea41e3e0d9f6e4934a144a46732ca615c45c78ef3291836217748d775211f33253def859a2faaa01469637f58510bab9c5fc3e2a4508285eaee407d853716348bab59a6f295043a2ba19558707799858b310c475f6eac760e4762a0c55a2ce0a86aea85f4c982d7252d2ba3870e9e364ea93452b4a18efd04905eecf1dabcedcbcde21233c61c0480436008b0b5a489b2a496912540a6d690b6663112be348d64efebe5fd26f2760d81981c783d18352e7fe0101d6b6c3b9064618d1701969552259d9beb3a37a2fde149599eef72932a98ab688e11c553c2df6634e14f3cc5368333317354220ca6e3ce2c80ad481c4b205c624ab6cc6338c276dd8009348e2e0f54afc64da12c7457011a02bceafdab73eed8987c5273976d2266eb2302f7a6862de4dcc1af8209064efe5794ad440858b77351099a8016da3ae6818d28ca7e2fdfecd5fc2e074d49be6aa826c780ebd8d607bbcb0b6e7b75506c40a165b65ad5ec827360663cc022cee31f8ee1065c4c4e174a4537c9237cc1a50b7371819f10bdc9e1e6fd91f10cf815ecb471681c51dbfe68b6aa72c4b0471e73d3033b8cf0c300ada25248de8bd02f6a3146c8678bdf0a02189ea4db97ae905b291e80750475d4b0853048112588633a62efa8de7ac7b93597644e847de038740ec350f2317eb090ce07e01670806ff0882ef2a6321d25cab07d6897d60dc631348a9c709007cef8802c21c5ea160fbe8702f3e86093ac84ecf375cc10040d93127a257e6aa5b7d5453f51a85841b2e671b1fee97a0f428ef83ad74740844329c0c3ea901d02d9a93810bbf49c43b7cc16f40108f1d7ab5329d2c3454adc08a7f4b812115ffce545bdd2137016af63be005bec880e396ec06bbc9eafe1a989fbb44d56d235a96ac6f083ee07f6c48af899b092d3091aed1345a77726526b779fb3a33981b6ad42f51379a4993f3b12a0f16454f32da541517d65393be4f5e28a54bdcb2c1d1dddec2045abd2cb7afbe803ce10c78ee5018aa595ed8572225d94742be58b2da1b1088dfc779141bba86953336cdb1a5815e4d5b8002e47b32d3f59b448275d5b98ed0bcca4f0cce460040ad828c6c06a314e431dc02eed63bd93bee59b0a049cddec003b9108036706c2f46ab896d8319ae8cb9810279a8dfa65fc302055fcc14d19af60ad2a9caf3768b25cf0643d0027b5b007ddfeef42add98efad08116965276c4f6696c656c2e8277bd5c47af5e0cf0463805992d101649600388d7b01809a5a1cc33fbec2a1354b386a65324312d2f63d39ec7a4aa2d5b903cd01308ffc9c89b0e8b2bd6ce3138412bf5a0227e22045c02112e70c697ceb7d432fec4481db178ee27f10f3f22f2580fdf1878c65d03d16296069edf37f8d6a25ee7a6cd5aa71498fb78db3ce7b53703064ff54e6468e94bf1bec650a3fb288ed739fccaa9db12593fa044e60421398d8844e30311398c084263621139d9009263271139dc804ec84813631f13a5c0408c5576a14dcc019baf75bde28b619b0740326d734ad6ba442b9fa07163434a18391f7c48635029d1280f17f14c84677119a49e19b33348304691c4395ac0d359d96889819831466644c65156b05aa2e231c1e2f3c90dc2c9f38310b3665d38ad12b4385f423d90d461a60c9554b40a3efa20efaec53133a76a885a02fc38df95364314acf3118ef82340c3104d6b8c412980d2146e034969806d2186211884611532034a41802d1106216d8c68849201a845881d418620c8cc68849e01a526c8168146209ac418921701b426c81692c310ca4418821108d23b6406948b104a621c42a908d6005db95d80d23bd6ca240e2a29d9fa5f190ee9c2a0f3b53e9433b96d2d094986e3a7e18a78264651ac772b081a98b0a7061d992bfb190d1917fdf2b4d6f499a2f883058539a2fc04313c6d635e3b02c69b55e37188ae0814c2f0501cae08d86a3685037204d055eecf06404900ce6e0389a521503428ae0090c4b4e41c1e00c8e616aa8b260a5423e60f4240d548ce620188ec60a17422ae81106438260c5740c86c933b0e7e17531e49a713820d3c02900a4110b99b584050c2c8b083ca00e15c228760600b0803d481c29440880c0447430194420b1082ac3d0492600878e25002688872861061c02201c801cd20234601449e4005b841d2038af7117b685c11bca86466a088df70579b6f4f4e9b757a6ea757b0646a7596d0ff7ef35b1465ce8d19d6e30da818434faa8d95e9f51bd5286ded63f8980868d26290f56282e11a6a70f8891f2e968f4bb7ec0a2e373085d4c4683aa9d40ee80116ae50d291be7c44e4030386534c4858e66ee5fd373de83cc5e60284f16d859e816350c1928971c08c0d093cb7122aa579b7c29f2991b2bc638e2e967a080b8efd7e1eb0c01163ce1784a90aeeb561963c4f2d1ea65a2193625e58b2854e064c3d46d16f83b19a2f8def57c6a69f93b52d661fc575d18923bd921f98a5a2ce3111f6c5f21cedb862a73bf7aab12d316542cad7458582f32bf000b48c3ea925a6fc10129c88b8e877cfbaf70af36c4602494238361e9f1bc18050c7d67d54b9d90b9ee8282664b490014ed67d71439df42cbdaf8279d054e77b861b70e87fd88bed58ff99459efe670a46bf7097a4bf94498b35a0d67af7eb4bdb21008d435972efda0a435fe18a4f2c1b36c61b60ef31a0074ad8ac4dc40eba3e4ceddcb34c8d829af46f756ed24ebd138161448d8ddbc69213cab7d745db468716ab6fbc3d02e469a4e16f79e51f94270275084f9c659d0c06e6fcadadb7bd004cf6ba533e2f833f19186139eb7427099edc584b20297a0405a302d5c7c6d0ba7c068f05587136c8acd108324c057642af4e065f8341c447a471337b51a00d4a2f0e2fae2b21c89288957bf8ca162614d5fe64fe406bd17bd23488ab7e4e158caee82f7955eb6f3824515f5cbf0772e0a5a426ee401fbdad96cf70ae46091081e0400e0970ea32cd589254086ba1b892a3c77a441956a7e5ff2ddf14495c640643884bab0b5d2e154f0e78366af8c9e1b857a23409e8d21b4cba343c5bfafab82f78b9dc2a6f680760ed9be0a06c1babd819c95aa6837940105bea4c4a80e5210705895c692e6e3692ce85f3b04134f572b144888f405f539f1cafdc2eb03319f3d4e3e8dc94f2c206b80101e0369d585bac57dd21cab0cd9f6b17064512aa12ddb08d810d944ee2df7de7befbda5945206280e9a0f600eaa7bf052cb2fd0b03707b907f3068fca524b2f6c117b6f93283a3e19ea99d1f149132b3410216a574564c51c6858dca1962f70e80de3d09df4a02843094850821394408a12c020b2a2de38f47549746bd01bae4177340d0f0736d97b9b79356fd2dcb8fda535a65b7bc1b8c39a308e7717cf1b7889e95da4e0c1accd151370087608d8c5b54cc22b045be45a0b52c1a369d87b2ac582bf584ab1f777d260370d0fcc340d0bfe4e9aa86334e12697c9d5e6ca5ecab2bf150cf71ec8954d4021e6ea5e0ac10eb12f62ae78f4bd0c8205325717fc6d025e33bc486b5443980e739bb7c360d465106c91cb840e515cd822b7091d7e884ec106b9d65234bcfa858bb229161b77d2643af58ea271affa0ff0f62a30dfb8e3e537ffa8dae654dc917a47a578378888b7b467f9c5dbbee5aaa85b5e3e5fae694fbf80f734ea2a97accd55ea3672eaa9b3606fae523675e983eb756187b07c4508376b2dd89b2bd441accd15ead207367c87ba28544ecd55382510ec907bf03d260d98eb57c21f807965aec2e750c170b7bd10186e617174cc957d6ad2686153737541e9035bc4decb0206af82e16e5ff96abbf4811d62bf9259ace66adb6e71c542522c78f606de095f2bb866617f647aeb5489852d627f6555906bae2c96a3bcc25bc1e04fa6bcc4f43ac5bbc21a20de987015402b648bdcdb9c5373de3c3accd40a5ea435b707b6c83d9873c0db6b2de58247d5b038515fd3b79b6cde812d627f79608bd80ce69c9a7d8e344ac7273e44ba8b12b8f1894f92c67e8fd921d8ef650fec90eb376f306f59a7cc810c924be4151207d20a79036903598504923590349033904aa40c640c240ce48f7c8174816c81a4424e21a5902c903e720552053205320a890279026902d9234b20a1904fc824d20949023902d9034d46ec923aa874caa0cf5ef7723c52f54e1da952ab3b92870626e4ce64625a6f4a81852ec624b30754b45c818e4f78a086bee6451d7bcc15bd2a103d260d4f8fb9a2540848873a3e118a427732d6f9697304446854c678e5230c5a7a46c7273f46daa68b51e60d064f7df243a477e8f8e4c7e7c94f4b6257a553a34dbaab8a0b76571551c78c5162d003441469874c29bdd40c51d10a480e29181469fa175a67a692c680565a95f85021a594b52a017ad28218581c4ae975395192baaeebc230273058d2224accd90f942c8bef40ed5db49e8c78773fb8d3571b849e9ecbf5ba38248288d30a92478a876698d7813c9d9c43d763dc516b9737bde62bcd82883b88bbf0bbb9f370b7b5d59ef9eea1b72d6acff3ec167ef67a99c35b6ed886ee23f061b8637c18aebb5870b1e052f0d106e9f23e278174e4c8df304772e99cd5b767355c91e37090eef72b2ca8138a65e524c11e7a8b7147c7c91596d0b4b1702b3985390b6e36b4e3c06ec32c9f7732c91596ed76e5e1e76de037bc72f1ca63e7e120ddb92d7535947d787f7a8c2ca6cfeb31b3d2db2710f56ede29edad1cec6cc07731d64c8b6a6109bfae05955338cf8ea50bb3e95ab9b41cc8712f5ff15a544180bf8f3a07f5a8ed3b2ec6ad691c29bdcddbef14e62d4da7bc35adcb3b958fd828c1a3258ffe3a96acc48e7bfbf9bc351c79df6de5376a4eceb94781e0cdf660de120805fee6162578ba7b2bf73097b797f7750b0ae7b46424526fdf54dd51dfde8255ddb7b7a8643e1204fc7d978378e7be6d19c9a5b71c241201e92de7acdcaee015cce55bb06c69eea2b010eef8d30681397ed77542608ef3e6d118e32c5305e10e73ee303098838139373799615e43deda69c8fb1e0079a774e4c81a76693ab01c57feaeeea5e51d88e3f8068cb7e1bc7b68f038f25e69f01268bb7182091f694d36bd8b164804f33ee2ea3aece5fd4db270ef56f0ff92dff2a3f24ed5ee9cf7d978976dcb1228fecb5bd3f1a7bcb51ce67d4d79a7ea96b7cef57dd70eb67cb73dc69ad437f031d6b8fcdedabc359576f3be2e17ccb78163647979a774d7b1baf80def23f4398c446af961eecb2af0dbbbac0212b5fdfdcd2a3003891bb8792d2ca795f0fb468243db23c1a14de73c8e3b8755a87be75a38140bf778eed461d5e9debb95235277a7b07b7cb77d1b567df7be1d3481f7f16210abbefce5e0de7bfcd6b9f4f6f8edde3dbc79f476e9e0cac124aa3c2b7435d4c54be50022466ba6796b5c7411876b8d34ad2b9f342a21d76b0ff4f5182fa38fedf133fae01e4fa38fceb38fc7a28feff159f401fab8373d9e8b3e421fa7c77bd1c7cae36df4c1f2f82ffa403d1e8c3e5a1e7fa38fd46d3c3e8c3e5c1e7f8a3e548f5f893e5e1ecf127dc03c1e157ddc787c4bf481e3f1a9e8e38fb7e1127d641f391eff127de8783c4cf40180c7df883e68783c8ee8a386c700d88071f80eac12c0775c2688a993a0fa86f3c0373c06cfec48055d231abad628c57ec72ae81aada0eb77bc82ae110bbac62ce81ab5a02bcb77dc82ae910b2ddfb10ba9472fe81abfa06b0483ae718aae310c37bea318707cc731fc3b2ee19741d7ef68065d77a40280ef78061abee31a357cc72abae6bd739088489a039be6719d4bdff018243d13f31b3007a8e6f10c1f31527fc38f18a939c61d46b28c89c0e522e43082a7030c0084f1d1e0a41eace1c95d15b1c4d8747d1873044ed79f6c4042a7eb5764a0b0ec48423d2a004af8747d0b8f2580ba3e356364e30626b808a009a1ae57e1e084fa971ca2c0e8f004165d7f83060a285d8fa3260a2dbafe3d8ef00e52b0a1ebb38f3172f040868e01940100029801a3eb69e8610a35e02346b2df702331eed83ee8fa23593ea3e61d634379601b1e83a3becdb42d5ab3c3698fef54cdf7a5a9d9215ba09c04d536e49daa89f9be2d4d03f02e5e1e8f16e7d65ba0cfe4adc5e47d2b8f5fc7fc060bf4ade91beecc0d79c79cc7bb181e38260687eb80c373c0e13379a770783db545932626531ed912e99a6dd15cd16d818026cdb4e1bb3ee65dc5b6c812cd15dd9648d34b1d73ba3abd2daa3159ded5a3c55901897a75697170c82a01e420ea77bc5ebbbee1aceff871c377dc66763bb0cc63aebdcb8979bdb445eab1c760cc66e6cc3ce6d11689398fdbcc1bf0d6b9f44c560989398ff3c8482e9d53bfe33179f3e898c7dc66dad000e0c804bd03cbe4ad7355acdd061c75d4313889c804bd7956785fda43d2b1061c350d386a97a85319937b6195f699d4ab35c261ba8ca08b3a3625d2592bc95c658fef6c68211de72d786fac9acd3a8b8ddc9977e66b7efd7df8fb0fe7d020989b3ac3dfb0ce3b91b8ec640b201d9d70a185e6a1a3132d94f41662e81eeab3cf7e99063139c2338a1117d96f38ee71224d1a504acbb3b73cf7c89bedf3462481c2879bed3df2467b5d399d1e99cc55f6991e462292d6b9f4b79371d8daec342962ce3c046565df9947ae43ee5f931b662391484f1d6ce85d81b999df4db53fad1891facb5cde3bba723448886c699d4b7379e87254a80371ea1cfe7e416db1d4a608763185e79c16678653686a1169cd1194957d34a0d973eca30fa208378ffe4c6ab870485c2e6d11d3b99cc3ddf498c3616ee70812f0e1754e0f73b5454c0f4da7218fb62e3f612338748eea515bce080ead72f987279009cfa0b90ab1ea652e4d2abfcde46e3f54f87b79d7d573453157992aa13f13e8dab6da22362bc1a34fbfefba6eaedc1e435db648f87b2f3e3dc41488fe7c45be9f7ee23c2eaeb5e1bb6b71c2f0e338da93fd447b74f6ee74922de75aced97fdce964df9d2ca83950b3dcc95a6b398ee3b84c6717f72c4e5e429ffab4455acee5ddf22eb4f1f9dde6199477f8fd65257834ea968a061fdaab84489d5dea2cab70fcc65770ee43bc77f477ba8d22e0c3bcb9839fb688fd296fee3bfcc009a4044f11d4ed22cfdbcc2ee321e63396baebb87c4f1d3de57cca478c909f37a25ecacc847c3d133b3237c9f1d3f3bd1c3a8eafe33a720e9823c729c74f394e19bfebaa11f54deee9747fbabd77e5f937bc44c49bb94393b364daf0fbc44dc273f884f74e0faa301f31a2bed6cc447dbc6162a7e626e1e7e3cde99f2d62cfbd0b71c6c10f6f3ce79c03fede807b476ff03686ac3ccc9b07e3b924e4c66fde3cfac6a9c5f9c0476de3206863dbec0ffbe7acc29185dcf8ca6f64dafad44b27f80dbdfd6771ec075a9cefdb36fb83eb6030553257d9cfca3737073e74e203263a3ae1224a165a681b3a3ac9c2485b9cf05c5841836ae44d763ab469179b176d90ef4ea0b9ca8a802b78875f3987a71d72ffdd6214100ad31ffa03c3e52d371be467d2a09ec13c8b517736381477e2607eb23f6060c2c3e42dc37f79df3cbb98abec619e4ae60a66165156f6ae93365a23b2dbcc3a8d5c3c21dc3d9174f6894424c52849480d254a4053b2679f4624f82ca2354492cb2c78f3e8974f6b807833739c3a4c215b84fb9773be73790e15e16e9d64a186e61e3ecc5b091e6df37ef997a7921934bb98342f99e5d96de804a23534680285e1b462aeb24993dd871c15c234e80cd79ecb8084e6f7a049f33d3b65c2599caf569df983bb911c7b2e533257d951dcedf714e2388bbf2beecac3c76bef05e14a6dcfed09a4331be2aabb0f2311de9efe6124d2defe84855024c2ab8c84aa5b39e7a752650cc4b95ab9c5537f586a1b8fdac525cb6bc3c5860d93c9641f752a95e5b5296b5b5a5ab24a88d4a84bcd92734ce73eb3637688e9dcb18b335b16c764847616e7beb338e0b679f3544c82f9fa0fefaabf8778d71e5af33527895387f03bb541b63d77eefee6c33b47676aee1337510991fabbd4df449a34272959f8a84fdf2cce29cb1bbe6a9a295509d19c29cf9e9b1dc4938ab99a3f3e3ab3d40bc2954b7395dd66a9943457ab2cfb9e3e72ca5c659f2d9d7db666926dd368bebc4453529a3267adde5026257bf47af0ce5debcedd9b3d74b24559d993a0acec32673f92fd48365f7dba1d95b27b18c87b7721cacae690cefed1207b47bd885dc3d725116565bfb6241a228934a22cee2aeef55856d96b08ec44c41bec46c89bebf2e6fa7c7d9755dc8d86e5cd1049e6e5b35413f3ea515b7a462ae66ad68a7592bebb11de033729e9ee7749773f82d63071fdbed3b487395c6d2603aeac1ae2fa85b568cd0ca22cec9a3693280b7b12edd1636666b5fa53a97b7db06b9aa675745e434a454554a968286806055d473e7f2a75efd14cd2b47b53a9632d1fac65a48996919d56cb4813ad0e83a2b14f0c8cb98adaaefc68ec2d2f405614a5b056144359128d51099a723552526e7798cc88d65c3f3f99d14f6684497d0dd19a3a4459d8877caed190c67e1d612dfaebe8e848d3ee4da5fed56a66a6470f8f9b2faa176b57bedbcc4edaa0a2b19ca7684c8d208d49c18c92cc1586f560adb9a2580b66260169ec419ad01d4acda417bc8255986adabda9d43fe9cccc1b83f2618c88b2b0a73056345718d6a22c239a4add8bb56691a6dd6ba43193f67004c30c19680eaf5a7ae295128dfdcc1516c55c61998fc6ae32b60be93aba8e302df57da98633239cb1e0ec68aeb0d72f2eb833238dddbf7c3e0363d2b46c79675d680c3b46656250a60da249a381316950938665a6f28e53f4c688269777c664ce8d115d498a8a994531231858191aa33329a2c8bd701b5e92048ad40df89ed5cdfdf5433feb11edd1636666b5faa91216a952c40e836d82e64afe05c71e2c5252516965be65aab477d75060c429fbda65712e9f243d1d86599c29b5d0530e5903cc9bd9434f30a6f0851317a4f75dd1348e562a2a2a579fb9c26a196ead3e142707fab31d756ce51b85da8e7a91ed39a88cf9a07c503e281fca72ee1d0ba63f73859dc3d467aeb07b9852315718f599349cc7e2795fc133738579b9c75c4d2677531f8d9dfa4c9aeb88522a26cdd6f4be8ee88f128dd5a35f166703daeef6ea436be28695316b4cc78e196144b4e674ec5811ad09ff7de720a3436f8c088ba235221d29ab456b4cf925b2b65f1d1a287323adf9f296b786b5bc7798e4703cda8e6d37daf54876db86436b71ae705c6b58cec9706802e3d1e88d135dd4d1047ba4d8e790c8049de5253d5f726521264b02e9a1658f01ac6456f253c74532d23b15276d6da11aa1db1e84bcc4f2fe750aafa6c59865596a164f4d3f13684fe1ef63f7eecb39d8d6ae5ed134ec086d75677a682d7b9cdcb37f38ea9feee9df350d95b7c692f7fd4aa6272d34ddc3d7c3f7b3f73a4d7be4b2cea56de6968390c7e47621788ed0dab55f40441cd5a47045ecaa3293d94db8c62b62515ef288d4f495f3beeffb3caed667d7b13aabb1663bc679a6eed7ed750fde7bd3bdae839fc558178661d98896b3ac0486652530ecaa34239132e3ae2a64753edbba8f524abf6ecb32cc16c9b2a8b17a6dddb9ae3b186fb197d2d8a5c977d8b575b57ef770fd0ee2eaa5f4c5daf2befa626557550189915e47a4beb28ed4d56622914852c38aa05d2e2bc0f818e7e3638e73454418460043efaaf7d551c73ca289b548b86a1b7d1c912d6dc407258d2404837855e644a3d3ea902ede48ea747cb24519f7c91650b670a2b718824edddcf92b06a224a70e893118c10c2552984246096ea2d7692f32d152053a3ed1010d34f6ebba771d0bb7d7cbfb958b5cf7566e4f6d912be7cbbbf0caf57b1f5eb79f97bd67758c3baa8d3cea9d2bbbe9d33d7c4447bb6ce4ea77b11777d4dfc71bbea3d6526b51d686f6da1bdaf0de5b1be7ea629da96f6aae42d4c5ac077620e6d175caeddecd97c72ee32f923439a28343abb607a456dd884d9593767997c23b752352a7b42a86478178834782431b518247b3e41d1e9583ba7d0aeff0a95f9c130475fb1cf017051600fc7d985167b90d4de188c24bb4a2453dc448a40e8fc242a40eafc25b75150bcb3d88552c1908eaf73b3c78f036541562d96ab5b43c8204c7bd4bde4b8c4087472251aba58df810e29c5027bc3d888fe884078f2427cc2a23f1db031a03467ca852456b249d066f4b874583d9fee29da3ef6de8f5c0ca101faa54d1a067afbdf6da6bafbdf682d75e7bedb5d75e7bed052f78edb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb5d75e7bedb517bc9de2e8682995a48ca3a5541228d20c2a54010b5dc82d7877d284afef428a23298a98804c8c58b0a4c3834a94b020e9090fa2a0e2499324d70ad0c808cad48177a9cea1471651502ca23c61f2639fec0029aea047671d9fa8408a5641146d7f61bf8cac90be07ef41226d2718f7e00ad6b49d44b3089e05e38e7a1b79d4771623d12e5e62ca93880845300218428833268c2038e12252d6932120140121ce95183f88d486236c81042d226541f1419c2b2024218b3857622c018b231809fd80740123202181093d80d2041e44e08c26e8e0042990b103a52f94628c718c32749029a091702a4004a418e36304820c3372d082c017ad3905bbb23d5d6dd06f1f50640931c61f9ee38cb14038f26e0e4090028f09013c3740f8c118403fd8828c217c3db8399ee339f217a63c81fc9cbf00b7d0a28c1b68e103336ce0832ca650457ea436d82cb03803088b6b8697f10df273ae223f7f9661a71916e788bd916c966189cc29781903e5db203f5721aa42d46a6930bfdc162ae4c891637a39aa8033870c61263044881c385f5a056859dc984eed04be508a56023e287d37b83671023e7ce1c410aa10f27c9b2964889021363307b6418c3fcce4788e773930d0179df47260201f94a4c5b1c017cf81818454c0072421b98a1c5985009e1b98c7203f1791ad71633209916f3385e0fc1c188d2f9c803910ba03d08f24606ecaaa22b22a37a6f7ec2c91821bd3796e4c306984ff4229c60a7c1124aba2c15088968506b311b08a5e2265877c4b6da8cf5805bee5835227bd8c5514c8f17c201f9432507e8e475b4456e506e6361308dd2147ae225f056604f0dc980ef4831166808c00f4c38c0480c88fd6082d8b1b98ec0458e5a627871b531e42ce91da60abf0044fcb0a51e80a6012cd645a02739bb9e40918d312538e947541a11e2459d1031ed822e0c50268bbf8aab8d801f8387b71f31207fccf5e5c1e34c9420b9a30d102154c76a0c6143bd0c116a4f0628949075cf8710bfee72970bcd81e907aa3aeca5101096f1f466d84880af55d2d2a0309f2023cc8a32ec0f711005ca7451341dd5e07a589a8ce721d164da4e5a9ebac68222e7fb9ce4913a1e136ae136a22357c751d9326c27acc75ae2662c365ae036a223b1e80eb7c9a088fcf5cc76a22375c00d7f134111c9ec3753a4d4487d35c87d3446adee33a9b26b2c37d5c47d34478f800ae93692204780fd7c134111f6e739d4b13d1bfb94ed5447e3810d7a19a08ce83b8ced4447e1cc875a4261224efa9c3ac0a12be004132901f07f21f79d71fdf17c88f0c04e7411c276f4d875985f3fd207032901f0ec47fc8fbfef01d8980f82103d1bfb9cefbfa5bdee80cc487dbdc87bc23910fdfd3c6870c8400efe104c85b12e0bbf640800c84870fe03ce43d79f8d606c04306b2c37d7c87bceb0edfd7c70e1948cd7bbc266fade6fb3d6a32101d4e731df2be3a7c47221a1d32101c9ec371c8fb387ccb1c70c8406eb8007e43de91e886ef29801b32101e9f398fbc258fef3ac32303d9f1007c47de73c7b716801d19880d97b90d79571bbeaf8c0d1908eb3167e5adb1be1fc3ca406af8ea35e47d6bf88e44ab1a32101a6ee334e47d1abea50d1a321097bfdc25ef48e4f223f3c525036979ea2df9886cf9919a6ac9405467b92a1f992ad58f686751a93210d4ed5139cc3a367478a973009075523acc4274a4b659c788d4e18f542374a9d56a691d940e75f61221ce41650cd86f3a5a231549cb100b441e4bf153f1ffd1fe30925910bc5de802476b8fb1f4a21563fc614e8bf12fed10d902077cd18ab6013eb43e1c5c1b077861a48b2974fcd781bd60f959ee3d8fceaa604c451412f1f13b8ca5f8a215e30f9df43096c287568c3fe04b8b13812f8eb1143a20e0438cf1071d790a7c29901063fc410a2131c61f705645f13faea185dc66eac03fc6cf5e844af6e0f6ce6223f65ed857fb30ab82c42a3a3c92cd73021d9e47472b44b640876006af178ce0d04650f7000e6d2f51d28808a8a03238bf701fc68b299556aba53be95d6cc403f73bad564b6f7b159018b5117b544672f3e61981bea755aa54d13653ba009931f540660f2944d08af1870b896be87bec857d0bf445d2a26dce812d7241306853871c4c7122cb41184e90832031982068c9187a965cb154822b70400628706045199eb0e2066648626d30a9d8a00a122421411540738d1198ded11e989b8c9037307947de98f2c537b041094cd0b241154ef0980ef31b05113c308f96089e1bd36de68d0267085306ab004ad204500d9ea8010da0a0410944d0130213802052d60c4eb0c40c94a0e0034a6410051219c420051e88010c54a0b3c404839f153cf1f3029f242f70010b9cb02e68c10b6090440ba898c2bb26cca403e0bbb822e7b7a5067fa9984206d6467d997020b4615e32a790a2054c3600fe3eb43f96e0b9e105f392704ac1021734c1029f1730e1b3829f12fc068adfeccc15c0400331c8800c3010e74a054a54908219a4200a1ac8285050030be4e7b8407e8e486d40c1098026700213542181486db0cfcf38521b4cd063034f476a25a4beef29c10d3cc9530228ac90138af9040e3c1ead8a00feafbaaa9b8fc0d98b25a6ff3c3a6a1b67cc1349ae70c04c329d58d2002f96981e678c132408620009469083058c60b674a080d9aab2830454598389116b9ca10902ce408507455031430f0e607aa42c6b86320811510632606100131996b2182252d6920f8a2c8d410b226310c31643c410861f08118629401032050c430500c317b808f2052f040188179484f043a90b5d04b1c474d0044a70081e4ecc345cb045406ba9112818340cea440c8f3ea933875507b2e8946ab3e40d9ee52daa47d537cb5b726aae5467f94e1551e51c96dfe7b09c4508cb6fd6b9fafe0b56f58e12e13aeaa5489242498aa5295a53f44ca1021ab4bdbc2200baa345f052b42612d5affe7b8f3d938188540124a62852c9b45a7a665f22589c9b59b2f4822aafcc95fdcca4914a5db045ecbdb4c8e2488d048f8ad104c9d59bda2e70210c30b6c00535b4e0248c2c68010b494f9c5c21c90a55287ac2c58d9287942aa4818618454337c61de153549068d8fb10abae463a438c33ee14cc604219641c810645861358586a1d430a4d388a02123cd36514a2a0502c0f2514ecca132cce75826589e20410bc619d92a2506c109b05c28d73a5ba0f2f75ca091687254a9877f89b51b909f73201046fd884283ac8264c1982d6986e0215a0a30807d05a996064716ec8a20494139ea0c5129210050a4a80f2842824010950388272842848610b24887134060e4728920219059002903c7e20c69331cab8a1c80919d40c6b7fbb1a24ce6cf124de30c228b090342d0c30ce30c2910e54a8d508454022821458b6af4c1afbd45cdd532658216106a7e0c0812b70c4cc5e49bde84821add4952af59252e5e73069c0db5b9b5561d5f52b44b02b4416e752c1862c5fa0f2181e4a889943ad53ee4e692126ab56abc50d40fc86475a73731e8fb4c6e63b1e694d0fe7e191d608f90e8fb4a600af79a43540aec323ad09e23f1ce0fa91d618e03e1439011af0200bf88f041c0701276288475a13811311e291d638e00c78a43516b8021e694d056e44118fb466023fe2f38c2bf78c8e2d37d6ecefc7771aad61c51b226bf688acf98d9760e006bbb96e3aea5db8ded09b79236f3a6dfb96d46fbce9d39a8a8167e0f33d3490017c294b1e03f802f21600d2f21590a780fc04e42570847c0470a42c08e44d7bb4fc03e41d802365350047ca6240de13494b05e404e0485946e43d95b43c0270a4ac22f29e4b5afe0038521611794f222d6f001c296b88bc6791962f82236511c97b1a69f9213852961079cf232d2f0447ca2a008e94152403c191b27ec807812365e1e43d87b43c103852d60ff90647cad279cf9e48593ee43d7db47c0f38521601f20070a42c1ef296485ade078e94b543de3249cbf7c091b26af29691b274c85b2e69894316008e9475439ec191b278e42d8db4fc8ebce5919697c191b26cc8313852162baf70a4ac1a320d3847cef8f8068c54e51d9128cb0665b5e41d95288b25af1099a2513ce2f25ecdf4b89151a372cad9806e0bdd8c9731ca47a923e69c991750a95dd3455f79526c4e4aabb4b989da73d384e6ea63862eead89d9c736a5a4aa14a7345973a69834997268dbc7315836b5324e812ce7521eea64a54b43ca53269ae2923fd6696f59a7147dc717d8a5401760c1fc914dceb54a9e20150a51ff574ca5cc99a65a64b4a7325a99212ad9137142929cb5f12d4a2ebe245a2f6747803b547cf9c23c758d1ecc95e57f6ebb238c7fbaecbf64cad5d9fd75dcbe697659e37e493695d52bbd7b42c2f215c677f70af9552aa61ee1fcf4e1356e6c3399ba63fed9f4c14fab2df37efd794a6cb6c9232dbefdbb55dd7b5bc3579dd5e2689e441dee66bebcc2dd3a3af7bf6c7ca65ce91f7dead5cd7ba9c956fda05e6bd720de94e7ef2fbbe7fdf752dc3f217ce7ec2ddef6da8e6653adbce6e3999754a4b7a1e4cea94ec3599379d236fe535edd10ab15a566dcf6eb5673a9bb6df3a9bfe9ebdcbf9f2965a2be2697bc14d6bcf6cdedebbee32506016a7e330a8c65ccd0d4b2da59472d3b20c14924796c1a42974895e784966518e82603a337272375d02933e165c30494f99960c1492872a3ddad2f29b2e9d90bed31214f611697a6d3b8b4a3575b7cbbb562b84d35d3d677f68afafac25d61a312d0f478bd3e53a5758a652e60ac31a97799e97e11c90c5f3b22c89de9dc7027aefb283214bde53cfce7bd7d5da7535f3ec34b184c6bacd84aeefb28e8982e54de88a37cd8e5dbbcbf6d42cac35240fdd2fef5967eaecf19a57ab9773b2b3bc3ea6a5afba5746bae6eb2c784b2d7556c35730b3d6c85b765905fe7ab739a59a7710ecf5d8eb594b93a6bb771615c943adf5312d6b7fa058eea13a8eab18aac3ba1cd439ace3fee5bc5198c5d9ba8a2faf4a9d65d9b3ac6a908545c5fec0aefd325d5e5fc1db4fd83ec4df6d28c65a9a2b8a7119c6e59c7a0c53297315cf5ae3f535579dbdcb2edf922ce778f21a82bd5e7b55a4b1f8eed20ef1643d06d2b3d6903ce854dd79e7be57451accdf1517097aa4bb7bbf40eef2304e49d37fac35b073dfce5a62ad51635a5ac3f468aee2332c75ad95b586e471c5c78fc8521620745dbc11f4c0ddf4076906290dc99607eebe3a6eda27866ebe9b1da80a221fff433e674fca3929a5b5d67a5dd775611886611812d20c9a414a4a4343b2255bd972e15a2edc7db5dce4a4f5c2321af53c9d79e61f34cf0e5405a13c3a6655e826f5a13f524a29a53d429a73ce19a429a594da24a5a15aafa57b5d4b9a6291e85acaecb574b7d669df8f9ab51fb428eea0b9c61d9b1ae98eaa284dbd18e9792045e820ca41cffd5981d0c8c24c230a4d65d4ea5cd1f3734251811bcfd05b4a29e5912eeaa85a9e5fb8f1385dc4e1d229e49dab296d70bdb99af79b5e9bab3b69680d7733397d5d215ebe9bf7228ef3ca27dc9dd2323569e6f594d192e218898a6a0502ca2af6222e0c7b9677b0ac92d977aeac92d8796ee811daeb1094db8ed0aad135737c86539445b1276666a20f03dc106b88902c7a8a054dd120c2183bc818191919fd0cb1321aa2889a10c90149409a51e348694926a953ae647218c04aa60ae998a3098c674e2c0c5dd4b16f4bd36ffa091a3dfaea245b934986175a46a08d50ed3df5a33be94d5cc318277019038b8f81041b636841779737714d128d85a0bbcc48a63d1632cad0ddf4260e857447bd89bd22e850095a551f9d9481a4eb2756d5af680d7351a6e82e9b587b17e3f6011177d0e3582d717452c6140de52abadb6b69f088d660a74b4bdb6b295124edb5aef3dca8e6f522b05f79a7c9fcce75ac886c077b96e3f5e47aad7aaf3569a6bcd7a3a94785a6df158aa63e5e6b7aad8b0c776b419a6eafa56990bca93f1892156eca6b792d5aa39214c3b22ceb66bca11fc2a6ca4e6ae10eb1e59db2a198fc4581ae3ffad038d6dc48166d82a6df37c42368facdd29426b9d8b5b56e9a716b0f959712577955ad3497a607823e899d59b3221489b084204dbd562c8345ef58149188808430e8b8e3144d5fa7f45a9366a7bc9e49b35fbc24936645532f0a4d532f9366feb6e8bc6c183a19651843b0e20a52096944caaaa273c09d3a3ea1c294ae3b72b726e5913be3bca75ddca78e8f33390c6924c0004348cf1e7a1ee92965d3b22c2953635ed78ccfa66d42b853d79e6baeae5c7b684dfd67accfa4a1420b3d2b13edcd202bf424a2ac799ba79e325944b4662609153d7b901dd14c52aa8b8e68d280316be467c671ef640e93356788684d0e93357fe5192c2e6cd6cb7ad547d728268d676bb51746af24ee85abd6b9d7ae3f56083d62291333eec8b2995d5a1ceedbf5790ed79eb99a358a0c49cfd97d4a79d9806e2666dc516f7a24e929f38cd0ddb547c6f9cd267426e38efa8ad59e2dcf1db567d2443169663d7dcd77aeb42f74461bbd65901a9bd1d5471d152be0e6d4d7a0ef63cf688c0703c2690cbbbe6bde4de8fabd0911d3d0585e823d1ac1230a44a872135ff1ded1353b123c4ab4f6dd440c438c1fad23b5963910a5e82c2fd9896f82070ba59b2bb7f68ede5bc535e847cb80a8049f9bf88a6bd05107a5334a46647f3a0ea80657388310d777522a612152981405155154267abe0a5d425810fd7a7ca800c2302cd332aa692e449b0b1177e466495ccc5ed96a8e4ad7755db7e3331465772da9320b71bde5d4000202027281522b9599c5c9300c037de60a833d7335c33396707707243469767886663269ac983dd4cfa0f00c541076f2d1f32152b8746a9d7a42a410c966df19d0b51d500f8861a0b438173c9665596624f5cc8c4cdf526318d5c06318bc66c2c008e625f5a111adb19fdf6191f60d0af5f40005f500c977262cbb6a13174f5df14217756c1a90f4ac9792894b2f31129991567f81a0d1a471c1e1a32f0c42b91b048bb4b8f41b2cd213ca5ccde3f00171f8e8791b4a33233da48b402814df20c2906efdf1a2c123ec8c0b1ee979900814a2c1075dd4b15157b653928b5bdf514fe76e6aa4d52eba2377673f749e71f79765198e9ba66958729d089274ac3f428878726570485387794466eee8ca32e66a6ada10b4c91dcd9551dc31a7703469a851f411f5d47238d4f39bece150d8c5acc9e4d5b912d7ef48cfcfc87a4788d86e321a25897b5d78498693349187e23719771476317598a7381c4ac285f2194d9a28936623517f34f6ed2bba3b1ca246d94fa664d66c992b833b02c1fd8a8cf47cbdae2577eb93b8178e185eb23dde2aa491baa0358ba37d45dcd157140e7ddbb39f234d349fd9d027eed8e1bf225ab35d7ee1d096bfa22982bbb9af88dbb486695afb3c8933ad7919fe6e24c6348697d05fdc57345744b40624028b8af4fc8a3457e9941f0a08439191196546392bd231befad49f30764b341e3a1c441e524e1a56a120202a9474414c28ad577675a7c5904ee2ee6e2893917e427a9ae45d6c88c121ca9ae730080645316bc01f2af4048194e8f97d671477ef42db2599353469b2e67fcad86e50b1ddf80982ddf019e2460f654d172de6cafe8897f23208d8e67958de487cd2ddb55dba0872117219d2f33784f4fc91aab78b1087436ecaaca14793351f254a19654891a246e64dd12eb5474f28dd25253d72bf6bd87561190ef80cab15dc2af6ba619715c4808894c020a121bad4055d9ca4c925456bdf59d0917ba46acf764157ad945e9dc5f94eaf673433d2da379019699a73e487a5969ad4c0532973880484eb2244f39633cbeb9b8b909e0725d51a38a4e7411f5a4397266b7e6ed0a7fb0683f4dca0909eb5e5a3a7ee82f44b16b52f7bf7a3e5390ca4e537a9e5ede516e5d16a4be76519d3e2d2295249c9fa806a3149cb9474a6846571e577a6a4699d927e58dc7165a41774d50cd9154a1e42c943fe5e5a623f56d506a1d12bff58e91a77c8db4c53dc214fb19675d218995a47ea795ce75017757455f3a28661f5aa9ebc4e907d9fe6bac4300cdb9ac61e8de8baecf126d3be7b0852699c967199966d1986611a3653c1d0a55273d638796436358f6a1b7474b285969e99343acf01c3bcefda959697f898a429c51897a04430b0a4013c8794ccd5b15fa41922cd4c9a2b8c8c347cb4909260d0538d2a1aab81514a8c4b042e620dd6c2e24aa1e8e387d42e9f63441f30476a6df9931ac0cd4193d1734ea3a51b20268d8d25d7bc8e59538f5e80d01a6afaf49e843b14ab9b26db67d7bdbc07208d6366998be3190eaca3e9eede78b53f66764d67bff17d2d835cda20ba1bc9667721ddb37737b21b3874b541b277790799ba7b576d906b1c5afad01a6da68624e62a88efbac4be3ed87ff8c6d10310b7c1f9cd2f2200e8904738708e2731692495b8c28e6d4945630f22ef8a5dfed09a3982b8847681c8f287061afe43de38304de7ad5d1ff2be3d6402c4258d5d9ba13518d179c8fba91df24ed5644c072d87bc351cf2d66ec8fbcee49de291776a47de5fed156b466335ccf444ecf20887de73043ae73d7d72e4ade5bc359c9ff7c56e1cdd9855739e4e37c264fac974264eaaf970669501ee4d9f37991ee69df0a6ef9c7ebb773f7501323d98e99de6a570249aab8a944999ab8a650ccbc1f2ccf6c7d4d7af21923c11296b3f911119510f7bd6c55cd583507e6460cc5594b9aa16a7e5a1c56979680d90711159ac6a83c8b888ab7a508cb8aaefb40bfbb2a10c16c51d2e2c14c9e5f48e62d431d4299e3a4b9a34bbce63d7eb59f0f70ec3190a9fe8af1c93264da606cd59d2657a0ac7d3911a764a140969d2b448d175676ae86a325db338a62eb65a66abe5b3e558cb5c436f59f6ccc84e4b9b8e5d4ac82b634e985a5a2a53c69c68b574b64c67d3d95ab28b62a85313768e62a8d30ec3dd124651a7389c17e6446da14ebff08b135846995a288a5e389c985212455a524a423a322a223a322a221a120a021a120a02a23fd487f6d016fda13eb487b696949290969492908e8c8a888e8c8a888684828086848280e6cff4993db3357fa6cfec99ad25a524a425a524a423a322a223a322a221a120a021a10ffb5259987d6196ca969694949292909022110c91aa281a45a3f8b98459eafb56aad58c8d991e5d8f0993a560b42cefabc2d8f79dde72bd65a7a5b3697a16142ae7503a27a594be9c5074d216e6c4c5b06b9e7e7f614edcbd444bef969fb2cea64d2f6f794161690a5bbaa5a55b3c0cd3368ddd086dc1481085daa248d86d690cc3b0bc75b6286023a01354c22695dfe5bba54b8a9da6356950afef50dfd4b4674bf52ecfbe795d734b2d28995db4a6bc77b4e914e72294d29b4c549bfee1136e397dc6b434b5817558ee94b62d9ff295e7ce94ec296f9e79d6d275d6126b8d980bcf9f70384d3895b7d4a953dcd2f2d35954584bac354e6f3967715aa4d7824f26930dc5b42914c3b3e2d4a17073e8af4b53a5d3a44983d15fd82ba60652ea183e1de5e41a999a22c51d352bcaa0cc55cd4e2e761b3a69929e39278b3257b3d3f33630584459126b5dd37786042a75bb2a5d338b92197526fc2db9548a9e6739b6eba4d935ca5cd56339339a2b8ac2f0e9291cf5b741235d8fa24895226545df19145d8d761645d79f4e47dd84b7d4269c3973ae6fa8536c9a7362cf30d4d69e6d48d0249cecd5e2d829261cbefb3086dd85683ba56fc1fe6177d1be3469be63df9a5ef93c6687b8d0d46f9ce6fdf2993ba521dfb18ce51cfa797ad43cfd21aba0ae8c1d751b4a31fd0917207513119a51b7d8296679d7cd9f4e59653a767ad42756997e7dfe8455a61c04fde93a489f9a67c9df157766246852ea34e7a46eca392d478226699a3aaae5d976ba927528cdfb46ae2f5987ea6fc8e7f2514c3576211b756ac26e33bffc518d5db99af29ed7a17369d26035ec3edc2dcd550de37edf9d5237c5f4309e7ee190a27e9d628c22d1d36d26a5f607cde1b363599f724e386d90306f1e1bca826de6904d9f7e6d37997ebde5a9d459582892028e8c8a888686848280787ee80ff5a13db4b5b4a4948474746454443434241404d4c4cffc993eb367b696969492908e8e8c8a888686848280429797971b28d45d98f8d154fe481f8ddd0646a56096544a9ab691b484a42a323a3ad218eac60ba65ad998c97b6748d387ef7a68ac83f98dbfb8dcc85b83b9aaeb92c3dbc091b2c29d1f4df366e952cf6e4353b8052391faf469834c7dca39d74d265310945e175eb9c9f453157dedfc68ecd7a6a8a8c3cdf27b14de4d6853952b8cbb9710d23b3b4b46822669d337123449af3cb399272c7568c2db2fde3a457a4769d2ccda4d995de759ace96c49f7ac432259f4f64ca9caddea83c8a6cc550da24bd29d12ad019528ab5ed3ee4da5fe95de9d92aecf9426cd947a0c27551048d3a4b9aa38f5d713d6b81b54d2f5978a49b3691450099c725b9306f399342aece847d73294804bba26d1b747577a3469eaeb6994495346cdc0dd9e3e29e99823db3a3003204d2b270345cd322dcbb42d03330dcbb26bc2c2ec9ab22ccbb86bba1c8e5aa62503c5a545306bda6b4ba6657add7e9f99eea575b338b5facc15ad3f69dc484f93a28f7aaa0655a253eebde91d67714c26f9ecc28217b4bc7d373b4a052defbda3140b9562814a9a84655f95df179cffb0c53ba5bb2e6f2a05bd678f0c1492c7d4629569c94021d33369244e26d39281228b358d2bd3436d05ba92c34216a0785eded264ca325babec746632e1296db541b4bcb7df7b78d75dc3cbce64e24c373d7bb542386dcad835aa44a7cc155d42e35e20fe2ea46bbf5316cf7bb368c7b4f6aa88b586e431ef5c79d9e55954b22c26c370a477a1716d8db6d551ec8a6e8b58fba11d3bb541b44dbb164fcbc03eb34b35ad7a9a76a979f497835b352522de2479c2defb13ddb96736decb4574f19cc4be8e62d7b08cc7b2cdd4f215c68d9757c66e33e72f6c43a5a06b1395479bf5a78b385ca28ed28b1ea397d498a4b21ad1202a34448928929674955273e9ad554f8ff818a409dda114d12c8a4ad32888b29434b9d492413d32c84706fdc820a021a222896424918e2412924492492dade7faa47e0eb40afa9142aba7aea6ddd457b1c8a671e5af7717d6e8cfdc3d32a41995b01944832ea52a91ead0fcd1f3faa1b235f7349a3712db34eea63d37f286e26f0d212ddf5df345d0cfbcd3e4face3ccd91b262fc95796eae98f724fa339945d1f259469411654419142d8fa4e3778645a4b11157f2f2450b2d858890e8ebe3cda5bdde08ed55cb99908e37a2d2d72c4847264ee76574b5ac32a27e7ebec66f2d23ca883230264d2c821a435a3e53caa8cc9a8c94419934d10832a059195a6645485a3ecac79d4dc12e8a34693c2d4f6b26ad995965c4a49f3c37f1d12a80e6ec88b2e267ce8c28ab13a23cb2624b5634bda4a9d7e98ab699461045a9f5a2f1c64b3f2910107414d202195dd4b15788f4bc9412c3b08b667107d661a970f7fd01aabff04a88d2bb43b403b46385963b415a725cde3b425a7b777917c8a27175f4789a0ad19ad37685ae904c51267f5aa235da69c9f309dfb2fdd09a95a01fa1f02cd81e854f9ebe365c62dfd14eaf04d19a957d83f47c372b10a5286c3ac59c109006447fb61b53d630281cbce7436b4e748969c587d65c6ec547cf9b7276a42fbe413e5b13caf2b562c90fbdd771c980489a0a776b3fc0d0dd49936199b70896b47cc5da959ebe30332e9854ef452e7a3e7adaec618e7a3e47eacebc8c44edd1da0a51573f174421b5f2aef61e3968335a6ae5dd9777416be94ca6e79249726d323d59a6b5a5b9ba6d7adbeae965a0908142060a6d93550bda5ca26659b655ac55ed9281e295d66eca24a9599699af3250d42ad323d3a36586645a323d43467aa5e3932bfce82ef4681c747cc285283a13d25d8d18cb3bb527b5263f594b54e618b9306c84ea19bf65ce3ba6a5a9c551026765aee27f443db39777f6adcb47fb5b9970a42c2dbb7c4b90a047f7e6238b3dcdfbaeb85dde4860cf720e972ba597d7b520f259b6423a7de5acab58145d9c34dab66d58964d2cbb6a3da51d16d3d23142aca598961635b75a434345454545f7de7befbdf7de7bef570310097a84e92fcca2c25a62adf1240928a645e945e9e78a2793550b224d9f05251aeb4e7a2c9e98d65cd52ec41ddd6d262eea3a8ee3b825ecbb2ea63557dd371b9ae9cdebae33b5fdb66dfe6ef61d97a97dc75aca1e883b20caa2ff8234a5ef6887b3762578b4d76d547bbb09ad7d2db89b7641d3535a274d76da858c7ba635ec1d67edb6f80ae37a9f5c76d61a92078b8ace6e43b56378537d7544ddcc92a85086c928d72bbede6138de64b8fb7623b87b9909ef5c76ee466007b9cc449322ba6367827bf678136f5436ebeebd88eedeed3dee5bdef1ce65953d779e9b9ded5dcedebd88ecd8b9bcd31dfb0ef7ac72dcbbaecb4d0cc1e519efdba6a5382fdeeddbab976f576d6688b86fdfd1a8e330cfcdd6e1ee17462285502d5bdbb9bcb393448e949581ee44c41b6ecbd6169580a40fd04fe77573c3dec5e1ee165f443bddbb2c853c22ef49bc2cbd6f49e46d29246ff1750ec79b7757bcd9aeaa5daf188e3732ca258f689e4307e26e692491a448237914346962ac15db90d0813a3ef902924ebd7451c73e5dd763b66ddbb66ddb6de8dcb6ab54aa6f9f78fbb441f0dcccdff36e574645e41dfb30d396d46dc01c0402ad9834133c94cec8f4efe07d0bfef405f34d41a0b9b28226f19cdca4181ec7c3f04c785945effdc66f7c66266c56d1ac32c08d7b37e246f66e44787b6b8a3257d9d1555f1e2eddefebf2486b5c903e296e7675f4cebc299236a2a64c95f6cd388ebbf75e93c9c4ad7c49789b399166587bf40a7e7181c1dbd3aebaa470b7a6af9b3797d59e38c4917672a7462329124da24aa7ac2bb674ecd11104ca96c2a5f7e8eb3ffafa9ed1d7c9475fdf2b1d7af842bab7089b938aa04894751f296b0ba9ccd5a96583603a5c8a3b2e2adc0d029d6ca4fe721d4dc3441ff3d763f481e46ad5510fc9107950adacb0d01476f9c498feaeb82e9f7f79c9f2babcb87cdec7fbc8ba46f7569dc2548db8b2819168da25d3a4b8ba0f7112aa146fb877a289d64df88eba609a04839168fa2553297175dfd5174ca5c41df7aa7b2fb50b5ee2dd065ed2a3dd784f79f7e1bdf38218ecba8fde0ffc40b0e55e7b4b6806a04d954e35f635de3659de64c909024d1ad3b325305ca2d952b67439b9b4c6b32195536bd25c8e669e3b1834579ebdd7814ce6ea3a087491e16eba7973d2cf38571bcdd9d2e5e476db357a39b94fae777b4a3269b6168654f47585dff20699841804a2aceb148341fa7a77378f06bb8b378f36bd33994ef136e12b0ca05ffcddefdb77dd637d67adf11dfcb8eb6bd2a3392758743f3ae9a493664bf5fb65aea2644b93c6f46bd3a60c06815644e1ee0e04ba7869d3287ad3257aa44123faeb1d52a7b4a5ae53eccd99b7cbe2cc88b2ae7b47fa3a5d62c25d8a7107d00699e8ebd9524665d26cbfaef54c9a397f5dfb9934f43b5bd2978fbeead686d46f9a57345cb1eb04549b983c196683922eeaa0f236b4063580b33e8168cd900b1c02d768cdca4f1a78b94b4ac7c3fba91e698dcc6d3cd29a98b7b0e478a435391c3fd21a011cc723ad9909c06d78a4353e5ec30180c323ad09aa8ba8242bd78b633de818221a0104000000f3140020301810090563a1589407aaa8fb14800b95ae4a6846960804214721638c71801002082800004000a449000060652985b7c11731fe2d5110148c4a4b66a0979ed109c95f766dac7a4bf339a3a8a4335ae6bc7bb1cc018a51821ab0201208b71b7350ef56df85f4b69b79978d8dc2e5c9e34c5a0ebb961a6c6bca3dd9f16cf0827343f929a85a21911735d81b77954bf802eb2eab2a16cdedee26e2149b2eab3b78cf6df00b9cc5f25aab8c2e496304c1326723ab66138307602acb1c59b012f3680bc0e0421758e1c8af339b7870f600b421e834b527991a5766a9124c08ee665e4e27f75cec2f46103849a434a5e983d2b0186aad595d53d6d46f09917db41365e6791a662ba13425efb232570f4b01483f3e79c94269d9609930f6f26b5c60e37d86b91e6da2127ed48e4d92ae5c0cb919a20ae9867a9dedb6ef6a45399a1202124a3ad1d8fe7b14cd0f55da4640b9990bbe8e356e22cf56e5d7289a13b004706fff3aa82b5ebf2d1192575b65104af4aef6a0f24fdc2eff25961c51d06b2d814351e26f53ecf396d66ee8325b1a5197bd3a88be4b41135b1e172249249c8d5e0466618910e293483f31b9a72615b3688bf921c614c873d2ab59bc314b6fd12ab019d6d08e1c9e59e62f584a81a59233e1331d141c26a24a19c38d53130126e457f69207b0dd4c31b39a96aa2d0aa34f4bb3e90386e07bc14c6976c9123e377428beaf35da94a1d2125cf1c7d45b093d014393e5c2b04445216ad1352585dfcd274ca4c06ad34e6e0ebe82c12c0e39f175c88310d043b6f907a733703ebb86967ee4c4fb8c94e3c5116d12532dd9c88475f40a2ef72910065bf6f311a878152cf4a3b0176f418a2986a13b8adf5bab485f49faaebee062d9cf4fa0c215d0908f827dbc0b284a190ae968dbc34bd005aaa0d18e62f7be15d2533abdab2e7c31f6f12fa0306528a4a3d81e6f021751828e385af6e6115461158126910d4ab748d8efaa98ab405de01d135a20d2052a30bfb55a831118b401b50415f9c7cdaddfbe179fbcb492e524291fa9180190b498504d3c69ec5a4caa2903897850c6923505f0d3f3b38105a935868668203e24616fac8419c0094ebc2aa06ddc3812ee04180e2820e0f76ef5f8394ede986d5230c435108b25f486da92de976bf2c569148c8a24c64f3841f2021d78b758225133cc9f8e5d42328f3a1fc7f7cc94840bc3fb821d4b9792e3988ac3a4b38430d9c27dbeb765784e421bfe9b84d6a80b989c343377d749c8022ee11d7b0687681234b4c9363849b7cd01e749d1a0e993948d99ea25f040f359f2e9e4ec29a5f42213de9f0750c17b311009e7c37fce1623b14f67845ef97b0aa8b82e758c96f01d7364787d3a98a6462fdcb1cb23110eb375ecc5f1d0afb71d4e1a7c86077e41446b1d01ffc40f8de4c049ae556c76d89e2b47a4eafdb99f41a406991c5222ab34c7c3832bdc4976fa44571d2765b3c508a31a049efe5bb67e6be993b793c59a3eeaaf3dd38995226cadd4532b745d1c0049ad843f81ad175dc6a0d4fb2e41ae2f598e70dfce59edae61ac81a4d3562c5e02a2add8c835eb194d72e08c2222a2e3b741afddf478d6c40afd114086bf6937060b5b541c4fea72bf375b0f8d3812a73a93d4f3213492e95a194109e11454904280c90a0debdf93fb86efafa00231ade5adf751ca7c3ca4b6b8f1b1c5b7d7da8c177e769bebc3d2ff9255a42efdb2fd2200e1635c4ccfc308741924d0067bbd63aaa762857f0509e02632a27ddd34b038b2912fd97a858ce7321f4e9b0dfda31e5a8da6b8488fcc2bf951ffce37d547780f80bc0eb5281f21df95433388093596507b08ef55a7702b8f52e6656ab4dc0ab13495064a7216a9fabb3fa87fe15f161534237c63479eaee4e85141c6ece82583f170fe9364880c3ee9af4c3e78a4508829203928225502f763a579e4580342a2822a4da27e514f08fd9ec03e9d208fa3dd2ac8b6fcf2a76a9003c4d89e195f33e807001540941afb1ff25a7501e00a7ac56ec4d400e72cf078395cf55568d6ee6ecba2fbb26c0eadfbbd8a2bd66fd250182774490fe803acffdf421069b580182a9e714e34f47cf7525a24e0ed1806acda2754f2c064d19e229cb06e533e49b1fa4fd9dcb31fe38fe244b83e9f267c595f14d4db3828bbf70104512205e6e3331a8833eec69baebf2478ae1cea777831ab329fa0722c0c13daec39bc85518cb5e7ed78ddca922c6e737e778d08ae95f954a959f30737870d3d12daf121245846f50ea6f4234764acbaeb9eb29016cf1d863bb8fb0f12d1a2f9eebae2d8e93aa8d1976d44130b9b16bfbeb8966dba475bdcd3a91ce54a0a39ea1a0683f1c80e0d8e72b5a53fad2b1298c85fd9a3cd634a6ad2c43e2c48c68faff71daecd3afb9b0fb5ad58d0453110656e44aabb7c2401c550f179071993f2e55be370451452ca7241b880e74b7f424050e14b53a03a0c73bdd78f0af17071298b7c890e7665e8905b48d6bde8ab0a7b2d11469b10ef391ca732d7457af4057cd47f4c40021ed112e7289f1913de57d08562903a3e11c1065bd3756dd25ee03eae8c26d52fdcade1ef26da2d0d627aceab766aec922038b7632b9b8cb0864c144ab6a49261a77b84f6fea0de0fba3eec76c69a4dc6984e762c087bbe154f77001ad1b735676835d6b9ee094adbb50c216a65680173169e4ec01224afa1e1710fbda2278476a0123afae4a5642369a22f1c166a7ad2fa068c48118afcc0d5d129ed6da74ca6e660cf4657015635c610a573457cfb0088771c8c46f22c471cea8f63d74064771aba6621d17fdd3374d7f7da4b3b2ba9a721deaf079d810e55a468d143905a92c7755bcdaf2932d5b935b55ad1443dd53fda463b98eb359a5e5074aa7763daba22a37eed736b8a44aea376236fb7e354efc6b475458ffadaa7961435d76b34ad15645d104b7c465889f7436944a802b0d3b12bdce11131dadba348534ab719d6cc16404d984c6279d5e1edbd38f7bb4168d5f149a2c37b2763e7e76aa98ae1e10a69700f132d11798499168270b096a30e01def0e7b11dc39420dbd048cb73583e3c27e6f732224b7011f1ac5ec8615206ad20c8a6252a4b362996e64edadaa0248f245e1c462f0fafc6ad2b9ed579f0ef70d7e0c2cc4692eecfa631f09d2518801108f14638ff838420e92f06a0d9217321a2406fdef63f27f8678e101ddb6c2b6cc3d03dc363eb2e71fb936303062d64affeb54b2e61e65e0ff49e539dea905a5a2765ba6cb5e5dd8d5ac31a19fe04a00a1e3c94d25082164e847bde7006e7a62bc2cfe35cacf13af7ccae3cbceb1a83e83ce0c75d0b022dffe17d347954cdc882279b025491f7454f25648265b109d2ead7a7b9caa3d703b14de29834f0e2865aab318531e44e7cddd04acbadbd8f98c850ec37330ecd35b9f892f14f5771c537b146b48ab5fd7dd31bf0bec4795c3eac728d3e5d7bfff8fe6c0f9a271647d7e58378d253d5214fb917e2505c0275ac831d9662dd5096cc3f3ec846e736fa482457fde87ebd4511b6553d414594eda4b45eb63f4ced3bf47a0356611dd0aa0fe67ed7238cd4194d56cfdda55bbde0dfaae9c4a61605a1effed7c4c43f1088d03d81185b664f49748ac18b209f7753398335378524563044de8627f8d39f8777fd655436ded964fa7dd35bca277303bd7bf6ed84c27788c1e78351b728ace0de029060049900a697cd21d1a139e13b5148b45ded97a39c6828b47333559d243505b8f7d3244f86a1a9c53335038e079b5557316e3da66e77a60b718a4dbf0d6987cd202f932d856a86b1e04cea4e40196a9249fca170c27b208494ded7269f43b100c3120e52044ed6a9b18aff4ee8420f87ed01658741e3bca6b422db5e2553ac36e999ea66ae0632333ea69f3657f2e86c172e57a5d1c2c2f1c2aab643f38c6f3d276e0d145a447b2f978190ba212d3c265b843aeb2e8535918631fef4a6c04427917620d65d7fb52e12e7a0b9289422aa5fe49663e3da70a6e8a236297ce20bc0371b053459156295dd6b75150ab6b44ec6659940762345c8e6f1a48b81c7ed6f57b5a061bbb789ca4b392e7745774f3af79501202bf5765a26a47102b4a0d5219cd1e57acf2569fdaa6939541895efc528333b56df22df8cb6855a44d234eef6dfc4cb4f61af82ed3a17a1aa50cc8b8cd5b043b7d7c2c52421a1c7ef771d97a1c8a4a6419a028ed050a77e33637261e1f13a326312345f9b2c21de706ec9741e892a0e144c720a8fb6fcfb8bc0c4ddf11ae93a5e9f5d96d7ed3f4080982bc47db40684834cd97991ab601c18473990fb1da57df58bf7afbdad40b129d79e23627180b5e71d8b99471e566515d7398937684d1acad44f52ec69f79cfbb681c77365a14f463b7458a08163cadc20310c35746724549cb237672369850299ff703bceb141e200a7e1ddb8fad208ce558c8b15716fc4d815f0446bf7367cc2bfe6fcf12e6f0b7e5d6d7b8482d3eca6d0823207d86ec611b0d3bd41a522ab321073e4404f404bfbf2a065635b24adedba4bcc2abe2d16cb0e73aca04688e53bc58f0728d8f86c41bc3cdc0d0cca6a6238bc3c77e5c2a9647a0efdf00dfef15b19a141bb31ad4c24dc1df7f5d3e43651e7f93252bb6c5e824d419c92cb55fd10f884b010e0d42d32fe13cbb6c9f6f2466dbab63415bf56fbe446ab88196a50978f6894018f7edd743ae0b1beba7719debf667cc02b9cc1f449474cad0592c7cb46816aecb1841ed181ba39392ab60a397611e2dbb01cb2cba80121017b49c42e2c553830fc25f71633f9c3114efc3371da00872f31ca27f2f8cb9c22cfe9654fc6b15cbe83746a4d5367fb8e0112d78d3f55929681bfd8b631af72420e6a45023073db8e9862406971a5214dd3568afccac8ed1ad7644db8f18a4bd9334bae64041fa0a34ad7e84a924ac85babfdfe90708011addd1938d285653a51020bd08200a71682c9321a7d4e32fbc5dbfef20b082dc96fb5ce23b3c0f6d16bbbca14de81b08c5957b7331dff3bb8fc65b6b518eedd2b4a4cce32105f1e5582e89e741e10eb6788bccacfa98a70fc49e5339f756f352c54133308520708a68ef2a168ea7d285f9511118a9327b610dbd1b2b2921b286a741c7e756b6352d5e6312e6ebe7d0e85d677e60d7434fa5564195f00987f73f8ebcb894a1a02138ccfa2b69794eaa84adabcaa624c2890d949792cef9ada2b7984958d91a8671082fbeb8631836c364f78ad80866e1cf5da43743ed84522d88ad0253f7c954e15ba5be73355192fc9183b263b1cf4792dfebdbe87b4e5048725b54e144c6daf03bd88277aea7b86b751950a3af7d56c112bc3dc5007fc237bd750864ec9322619ac8365fd4150bf43e4a3b8e47d1c0b82a819e3a9f012b28103526908fc022038d875246cf9b98432a7518cf81c3797748bbb35ec49dc4456b2d0e9f17f9d269fb720e6da3d32886b6c84b340d7ecc8e0581645f2482846c72bba70708dd8cf990466da671d7c236d4820480ab4deab40d9bb94efa7175075947066621a96a684a14c8b35490f2bea505efd92d1b0c95c5b0471d73390e168683fcb8bf54bc220b9d17c2ed88691456cd3fa30ddf98d93eb85ae328ddf87a83d20c87d026b433cc4ce3bceae13bdf34bce65060ea292c43285074276cc39647e6a3681bc68a830fb5c6aa4fe0cdc2233d4e090643f5d007868b885a3053e445b880e298d5b7f0802353c10b265d32a8af4fc0b1f00648e5999a5d36d7289f7aae9a2e4c0e50be576a6fff9374280b9568e4f1210ff503be5007c193140d88bf2f199818a032c621a455a1b95e1cfd543ab05b7e9c8c9170050e0255fc9d3bccbb6b15c42dbf6770a95906f02c545b7c46e7dae704ac77d4301886e690816f2cd883dcaed771e76bcdabd159b9a17609c171dde67d267962f1bba3637a0211f16c203490ae1cd3a35917b759448a5aecbb20fcb03f6fec44b3d45dfadcb227dc8b15ebd9ac75c4b4d7d058e69016437896895541d2c71ddcd02a7e1d5aaf47c7b6ed811295bf6fb5e03087e708d359b7392ea1eb22467e4c1801bcf2340555d604a27d325316a89da76487f30eda7acec8f66c81f2ed9cb00dac28bfe506f1138350f9bc74514fd58fb29711dd7a9cd6c199147bc92589fefa44229044ce9e5fc205ef35b29c1ed2fe37543ac15d6018bd8f32144dfc411b8015e745526bf489522d42afce45282d77934867b79dc57210ee84c27403166992e28a503174dcd58f18804c65d17a5aa4c193664d17f1512d3b80992d2cf8a73e4aa1ec5abecdbfda7011b2797e81a21e0bf4c1f986be50e66279cac3389c21451017685b549d2adbc41e0888a4810809e42b211cc261123300e308ff21d9773727aa3c1d336a07cdc8f4c57dbf46d1d197cb709356f9c4b794a90d827986e5fc8f0c6a443c3448b82be090fe5a4c46f809d882306f746dffb4e55a0d2887ec86404c3daf42d1385db8bd247a63feb2dc73247ff96e456b67b12593138cdcdc0f86274a26520299c76ee998ba1cb52ec2cf7827f982bc5c1a3f28fa4e531e6ea4abed533f0c79166b8b103f016b689aaa6bb505054eec680a27eb23d80d61c5668f721532c5890e2d3633e1ac46b5a9a19749cac8ae98e41590d11e59b0f62be8bcab9c8c4b690ac630b76b609cb2f394aa4553b4ecaee84138cee8a6f81f52d683a6058928cc00e77608369149448ce37db2e0f5738358055d657907caf3b72646756200299a1893906a4863490c2efd095103787f3e78d063b15b6260e8e5ffe8bf04b47d2f431cbdf8c25a35b60b7bc0cd32e5159695801312ab730baa433f49e51ded58cc50d67eeb18a6a702d2f6b90f1ade18035673c6dab85840622dfaec9d1e255c1f344bdfc3806fd2b74089f6980460d734307e87e4f2d6491cd64cba457031963d950baa4031958f5f58ebca03d44fa430c5eb937ecd0f0e5ad2bc156d041a2f7271b03138c5c4ec09e83752073a77af17fed2e777a969a1c26f1feb171aef30fe816deebbeaf600dfbb035502f8fcfa803d2c14a66f1f43e9d3d8af6a36a3d962dcccb40f67b784dc5da00a9944134c3824b0d18b6b4f38d7d44dcf922e439ee36c9698a084e90badecebe0bce178f134cdaf7542822fc5e3483fd60869bedf6ad0bb7cdd943697a355ee69cfccd2d4305f141aab0ae892117f4bec73ac165141e3495ab4156432f43def7ce5e4d2b243fee148bde65db228b56a8080b8adc84402ea6921534954602f455bfb578d968a38d1fbac99fd3c3f6443421ff32f84ddd703cfac9933a1e7b15469271361647f7ab88c3c44869f7580384e84b36f3ce8b2ebf7e98c5f1abf39cf750e50a1a2aee15aa482fa8ede7dfb0281bbfd8d2a6374602b2f91ee31151e9758430c3f7e94b2fac679da58a32958b23b653c589160d38c20dfd4f0bae171e038ee2fea619ef01a76595ecbabbd402e3c54c04cc79d84a36e0c955c82ad31676cd5937169788c0f63b6bae50e5a38c57d4f61ccf378cef15e30579d0265f49ed0741b1814540d12e12744f231dfb8f12610085807104b3f4eba8ef1fb3fe79f2a2c5068384900e631a27d0c2457f90ed141bb7abde821eec36810e0a59c930a637df6732de33b7d6ba7c231ac694bebaaa95ec17ac777326a79ceb6d3902db387dd4c3c7507a35499dfc25bf88dbe116e7e5a5769f4e131588bcf076e2b071309bbd4308d15d0b9cfd279969d07d320b8c5aa18bfbd20c8b0cb7daac9df5ec2add7c86a5339425b5332fd03138f0fcf347a0e57a7874dacb7ad2abcda997be2adcc59db2e83a5acbfa19a63ff79cea70cb679680af54a80b88520a74aa284e6d85abf90ad2fc7bb554865a3039aa586ee8c147b989a794d7f7fe9e55d27c2d8e433cc016b8af887980adc9c044f24139dbbfa05ae9b028a1106e6b59c4faf960d852fb980c53088c6a833f626e972cd275427efe9e8124660ee81078df739f54ebf14dcccacbd8cc6f8f77f16e05d190531bcdaa28627031beddd2d1a7f468b1b91f04bce5210420d3e912212321eb66e7d9ead25fa11bcb10edfb124f9158fdeafc2cef0b94586c1e7e05589332aa86b710fb3249c2e70f179caefbaa494f7765686cc57ea2a19f41b2a9134f3e4cf02440fc31f52be25725bd6ef965dd8cda583c1a24cf9994857c77407bf9c521cc5549a63b6f74a041e73f2c682a56c6558ea4197a572569be86e4c5221dc589bb6b69d900af4a9e9735cfc84d769c383f2dab5bdd95d89ebbbb2a791401b6aa5f18c08411446247276aba7a11e68dab6417a3969a12e25cca5c25d38eb5e162e4df520744d17a021a14aafd130ed0d13f595f2571969427bdcaee0b08706f4458dfbbcd1ca927a79fd4619fcec854353620304d24f3336c15bdf5dfee8d6148c25130d11401f41f27c6ecf1555235be5e29253b292481741167798664a7e3a982d2e6a28837362f209abc4a925fb975a087460155e5a6350811a2ae0771296d4894cc5d49f2dfbcc6aa064fad95e1b7e4f47c250f52b5b8c8b595546aea8b354ec29381bd7d28d9470f78e08cb83c817a4febbed3db123b2582978844881bade6b22b48b61266328913570936fce247a3a70d5ecd2896fdc050b0d4ca0201b402a4821dde56f7bbf77e5a27fe8bfbd49d887aba747d72fcb905f1e72db47cb372cdb2424b6a5dab571f9cda3805489bcd7d03275a34090014900611be64aa9be4cbe6868eba2249d8aa11620a37bc4ca8c3b4227998493cff09c5ef164fda2c44e5a80eb312356ee67eb3a9177387a276b0a4440b7ff8c7aa8bda7aafa1bcaa4e35bed43aa6e780762dea1a99483bb09cc21de818e5f3d3f8ef78f99cb8250bbdbe201aa94a77e59bbacff440bdf1787ae37ddb7bd059e37a94e9b49a1c4e7d24001f28c600ae74b8f67b1f330e01ab7544c19315896b083612900c42789420d0378c5a8d48b286ff6a0ad82cb36f102209c5bb0d922c5b5d4f7d74673ba793d16241b3c599a33204720564125a79336d42f0da5b5cef189eed048c89b546a32a99ad9263c9c3ae90d2ec4c4014c7a40b5908d0831132221042e5e1706e25eaab52d862a4a40606ed933d9e4e04f209acf58aa9f9c5810fbac8301439746041c885c3fa64eba05abe0b0b95f14d7825723e06dfef2f3958dd3b8e6ddd10d1a4e797c95803138b8fc5af97981ccb5101c7ac3c0dab8a274c2e5358ca1398d101d002f587e238418cf312e56ea7956cbd96c5638f912b073d6815cc249af420cba4a060a48af44b6ed3024e5182e59a77c65298053a380c224c1cecb3496e419f9c1964336af13cecdcf24ed2f69720ce2f2dfc987c37bd6ef722dba7958a5b343a6c48c98534f07d27949119df7b79096154036efedbf3cc723d36dc9d2768c140217e39c81fdbdd8447a8a22fe205fed50a4b76087f5141b915c9270b97d0c1dc13d114be568fb57d8ae39590f4856ee8c8fc7668597594ebafc789df1f567f58402ee0131216101c7fab97e5d208849df1ae91c04d2a1aade421067ed5ffb43e6502981ef5aa9714f44a6d4d32b3030c14ec8ae4b207807c03cde6354882e40457b969362a89aa5330d57dcdab220b91e06893691d524f59689845ef093bff4d52ba5c1ea4591bf9b7ebeb45775c29b8d83e26a84b289a150155a99486a32143baaebea390ebdbe463ff626903d0eef8070c8fb33c327962c2addfb76f190fbb5a570bde39fbe28ffcb97f28b2161d797e4acd87369083f2b30665a376febd409870acb2231299be11fbfb7018e51bd9e5658d111d9cad8d9558097a7f88224e951b8050ac022306a3977c0958ad45177f43f2d0b38d028e570da0fe4631b23ec1af4ca12f4474c0f8a4f87c14fa0b35935e81d106c4d4715278908e2781652f443841ca3ab85e6103dcd997a744192ac88cd017a40a6bf9b945ee9d9a19e4d3566c05605ad23c9ad1083a1631b7d9b4fd05a77fa69c629c0cae8e4869c334c944ab97cdda835494c595eac7946e9acf92b1f71854d8e1a23a7c57f133d6306cfdecd6db1fcf87bd7066d020f8915d2fdb19a21e1f7bd140619feb04ee574d7c24f7b16e2d8a6a631d14d440104358d7daa98c275d6144c567f961a81b2b8dc4a4d8d16ca87908c01f2c6fa19c97c8d2792346c32680a52ceb7117f8d613f1704afcdf5d961553fa88f389ff4822163ae84ab1cbed55171fe75ff2293d560bb085d86b49887d92d446f4a481ef24882f170259a6dee223e60db859110fcb956cccf383496ac2da1f80d282c4ed4b2460dc254041debbfbd4c1bea0621e77d5027cd290db63f8bdb5be02951fdc13974da647c9d0ad20d2f606fd53a05bfedf88cb3481641bc35927dfc0f83a79ae5ab8fdf35528856e2168e859258f7d7d5681be99b0e0427ee85d465e6f421880ced9fa6b82cabf698503c52da2459f8942e2a6f9a2b2b0f4b9aa0bca01bb1af6e6d54f9976a96600cc36e409a9d8c62d4fbb2c979e3ab8c5dde6caea386c5e2fe83dab78bc2e0ddcb0a1ea830a71766bb399c30b4cd5df303bb35b22bc9368468734ab8586690622b1b01461689b0ef33f21a29a6205269d998a00ed43d170acd804ba88f77d6ad70a1ea576ee5f536aabd10531da19dd6ff163aa09ad8245f0b5384ccb789131e5a2cbbc61cf4aedaf4ee473cc2fc689ec57464c96f53ab4b3d441faf1418a00f629cf6590501b083437c0d832a84183fd666b3c14d6a23e4df5be33ea0c39cbbeb7bcc5f0facf104de26e5b10197ec6f1c8006206dd5e25033a813166484cc85e4998606465eb01b8e8f2bf4b578707bfed3e71c3b652c04972db7fcb98bae29b71e45c1f413ae9a84ccd075419582fa51c8a5fcb15ec27b1caec8ea44614778547d27038ed39bea5f848e3d74924310ec7fdb01fc2e7a068785d05ffc24db204da0b141423b61cdf12d8bc0c5ce75fb97f526a0a09d0423419d63b78def3f5f3d19516657fd7c69e4de13d5009d0415e041f14ddfc206fd0f937c6902dda1fce10c6d7947d6a0f18abf2e75f0055fa9f3ad19735f11895d7c19b0688401c781a74c76a58aa763b6fb41657476ab154894eef1392f9a385596c93758907855391ff029922483efb809a52010ce0cbf6fa7329002c505f3f964e2ac8de3c0f7a05ef2d132af71e2ae1e22817185c0364af86a6f881bc748af25e126988866437ef312c83d83511d5539228f832d604502aaf23369c512f7ecef9aa816baeeaecdaa29f56e4f882c9b1a3ad2ca8cd214db9f33c6093e4ab10b084c678bb6ecdf5dd48ffc65d215469f85ca2059af6f44268a0eb7de8eb59f2bdd1c77b673fb745be9f2822442c028b2111f7632c65eb45de1aea09c1fe3f2ccb2f91dfd4b45e7629a99c0b69f49290e2d120923d2c9a39291d4a34c2680f628d6d005e30adcab5682a62e64df0c1e1d9199b3812dd25133f760325bd9fd6b7cd7e213b09c1cb46e34da19a8cbdd62baa3242a2587d16eb9e00883d237030e1c3ebbeaa9acdfcead98a8c9034cbab3fce3f876b76e2c17ccfb1c8a037a13fa9b7464811023a171356c0865f83b403ae98a8c6b537214462649b4c4aee9b4322d93a5fa321a20161a904c968b17e2e1994570e062c9120379f50851366869ca49382b3c85a2dc4623ec13b7f14f032fa178a3537eae51a7a707bf47802fa48f898f99e97f568e92e49733ae10b927bdd03af0d3a746d3611915b7a0648164cddc77dc658b5ea12eb1b9ddaa6f7845dab0b053a17c0b364701b89d8b9fba694baa53cb2236bb2f82246bd08afd5b5c2e33fe88356717813e9e292c83c2a14c93d3868cf62274919f5d69fa516264e964aa13c0924d30b9b6d431ab1e897c4af0626a4704d7380220b7588cfb8f80dcdb929c57b264c1dfd0d1b274adc452a710832e090d3a39fe31efb2db8d52a3513f4ecdd69d121ba78e455d82ad90494ae76cafc20eb70fa0da47c7b975ef1808bc1ecfb240657896a03d35eaad587ac3df25527dcd006400c5f78e7379ce3f9e3f3c150141d98b5f5847cfaaad8116e22a54d927dfd8348853040b982fcb1dc8241a21216d10b22c562c90806c7adbb62db09c9b90d1425af9205ed4dfce4af81207e149deeb9dd525736de0ca91200e061e19027d752ed4b19d5cba387dda173fd2ec4635114f896e00b5673da8d80efae1f5ec735b8669a8c137159c90943aee2d5b84c1ac3c2363a5094da8551352b2befb319149fb1eefd9d895288d395b52edc445349df4a59376e1678a1dc82395bacc1e53ec7791a891d3e4cce1a78a2246d432140859f0b9c50b41413abaa61cc591101a22fc1258b778b7a06d7e6a77199e58e90d15b705df76a75547039fa7bd9ad8bcef3d80abf3e315bf1620041177ba0c169d69c05ae2c77465a8de6dccb78adba6b3c370657c3e6000e3140768ff273cf6743c1253fcbb2dd9ae41c501c56b492fad23b536a2ed13742f34d88086cc14f44e7d0e7453cbb4e30ff48fc1b75421c726d8944bf816454f35c4d4725bc5cfe4b2bb4c2efbaf54b8b27885b92313069c1e582e3dc3a1760294b7c305434563b2cd3bc11d4dd49e5b29687784655f4326cd20b588a460eb006338afcb56bb1217b60b84e77143b161e252d6c8356de5fc46b408817355205b6d2ec1b272005c324f4cea95cef3c65e1c52979b49b30ef8f7ec8aa0b43e708e34d5a5b29c4af29de4b8066dc9e902b01c1ea69f11817d94766a97a7407f42210126f3c3454cb2b83e10f5e6e9c7ce62b436c056c9425a5466d305505029f59795050adc97903ce2a0831efc17b630b60bad3da1af8dff389cc6e9dfc97338a88ee15104949e542a11b63a48e60f63e8e14fb1128956372535fd60633bfdf06832baf1d64f5b54a364e90b4ccb8267281ef60cc4e8df4ac0c93dfc5b691ba00a5a385ff20d6632f1dfaa18b4b275d522c76e2da6968aa4bd2b4b3fa2ed8ce240f2377df0e0c9e6848e2003c8a1885b0470b9688d7b15d9f4fcd69941d42a1467364dab6654539d1e542d47792a0cd0e5e74b4042e62d385e466c464576c98dbbacaa3e05b18740f13d1a935a336902d858c2a030b8cf6da2d64b8035281cd1b5fd07862dc45200f5705dcc6ca15b10b3bbfe86d20ca2562a02d9311d9214bf3c08b12fd83b75ae6388afeadfdaa577e41f6bcb8044dfc97bef986a66ae1b1e4fee9be576c3c41f18b9d7aa2f992930b39d7415449e3a302512bdb50e2edd66383b2d89840a5afb6ed6bc68b438b33895d178084ede9f7455a16c84ad6e613d54df5635e97c39dd8702785ecb7682688d133f1d90e48b0f2638b13dbb63aae0158d3d7e4c80f78096c23b08d5296f11064c8ad8238257ec59e105c7eca42e0a2138f3b812b9b4d848dde330b5e113671117634f72a4255bd504ff2d8d56f373581a3812cb1e07985347752bf5d6003e3d7dcebd39a9aa80c4cfd609d7c1ede2717351cff21f6c4a35a4c4d5b330fbbe48bb2d767b1e4ec35b77d30d742291e5959d19224449722b30242fb852600a62292d6226df74e488f3b3a133f897cff32001330c74ef3a6d5a67803cf3e6ea3fc3680eb83ee097b40c901a53100737e129dcca8997b4f2dd6369ce802035eeecc1bb004693fe9e29bc60d94d33e68b20d1c2581df46cbf79af4f8104c419ebb5eb0ec27ee65d2ddc2dbafbd337cfc8bee61f23ffc028489fa3f4b65ff7658e06fed19b880967d5a3ec0b807acc6211c5a39de6558f5ee03c1b2b9c1549311bdbb955bb00653e4cce6a408b0761b612bebe0ba988070b20943ffd3857ffff3401b515fcde0c33f1aea8d38cd36fa68fff894730e14208fddbde2ccefaee270ab15c45f42c5595043203ec4e0ba5a4efb7fafb13b8efab2cf8cd7ffab2adc54f70c9317022327841576911e6ad6d3f55bcd2fa42612a4da890a9cfe4c8ee37d58814e5ad6740a471a1a53bbd2907b19d91347aba02a1c719139c55b7776c4472c824908d46e51907837f7e3c75c5d5db5c56cac949e5f0d53788d94f56a001a6f8236539538b36b5374bd50de289bcf464be611c84eadce34deca89cf1aa678575dcff5fd1681ba44b145e3f9aa3e00f0153c72da83d5027d32a712d925b094a9a683f5f9f93ffc9d4460ff52674d0dfa5c9b5d99ea6a7a27ec468e2ae90af492238a8193a3efc047d357da0fbcd381e32a0addcf50c230e8cde495ce77f1081ed1235feb3030d2f4a59cd80b6105625a8e4158009d01122280354e0aaa92238668d4ae805afb8af22f7ca3364528fe10c40755ddfaee22767b1551af529c2a68ce487ee25aa4a72a6d16cd6bca2941dc26726aac84e5f4d8202a229460f515c218a75402f6b8341018886b44279cbe804d9a209972e3b91d81d8de03a0ac30151c4bb95f17f07625179eaf10ee951e102471e539c1bdb4e6f0d00b9ed69a30752211c1af221d37471b18366998b6e836b393834b6c3a6f0451472c9c383c4d44635c70eb285da0784f733c997a1471e08b9c6ee588bd9e131cc235470b9d0264a48195240e07be35a65c19b015dec2ab060abab737190a5daee89f316c91866195253bf4cb2afe808faef1d4668b6784935d0870052f8e6fd7d846e62314380ad18df5487d41538db6d37c698ba80f774b420043211768de993efdbba1e3cb49c69d3c3de7c886592ef0078b07819a8c2fd01e279acb92eab2f07a7716520915b791b02137558de26bbb03e7546ef77182b3974725141aa78c1b1f6d01f8af143f3bd0eea90870353b215b4d2e5d00ffe954d8a4822eec78606a706273308112db3ec6d147997f7f5b73c8c80fc9a83e6e7ad57dde56331fbdd1d7be010217f572138ab43ae10465aeeac0dcacfcc2e3365d6e44c1ddbf6c6aa581cd2b377d6c9c76e7fa8082fdd9d1af8ea345bc96a7549021925d1242c0bb99c278e1af03bc5dee562ed366c046a0ccc70f96d720f38275f42a50bd479c72cda1937391392e780f63779bacc5f92374119d9518eec7d918cfae6aa27cc184dbc765511e6d9f8ea8c94e05612417d65c8191b97eb3956805c124167dda0a3488f433a7d1be5391a5ea88c1b9352d90480b112d57b714a7313bc7cf471b0cea2b120613c03be4d8d14cd0ac51b66f757e1e218ca7d8396525ef1b1ef48d2e9ba8f99a365a963e25e011d9efc235a0e8f9baf4454a4d7bc3e16b9df6eaaff7d9269927ca617009b10d7bf5af29d6ea6a4961b4d2dd4488fddf9c373b757a8e15fdef9d550922c51cb8306444dd97012a75372d266acf6c7e07ee4ecd64cdf2f8eadf8e1bab942a36181451caa6aaf8dea1f31591a243473cc9ad4d92519663c569a542c607b71fa9273a88cbe7e1eae22cc5cc1bc94ab403b035f5c14f64b1539e344e9df12d56e7b8fc3e6f8b98876de3682d0b5f1da7307cb1f409c83d507de63894a15bef4386ebc35ecd112141a0bc6401b344a590e0ff9480f02294a6a747a2589277bc80f052a8f8eebd89b287916c34805c5e38bf78d5d82fe96d433e7170b1e5f883cff6168fa3e3bc4485c590d9e8afa643379e8782ed49ec6252f3d3c2b3c49913e4de12ad6da0cb122d90f1e955cb85b038c9851422d31991c92ded0f68c10324b4993b3454f54d1b9202691ccb439e263bb3866082d48f579542a7d99dbbe4ab6a99be4e72f2b8315cb329e55a7cdb4cec32ed86db56cb9567091a07737884c344ca93feaefb5ef1b8d40135e6c318bcb6115264470c2d61c65b99129e6bfeac50b76f0c7e49ed3ba5f8bebdf319a38acd7bc6fdc978922a82cb2c3c56e0c7ed1e2090922ad2d1b5fa14709fb79ab383f23157a15b04f7413da1bfe1c3b54bad8c741b1134e05f658e0d68c1c06b66cc3487cf4f15cee4cf0ffa2a1545fbe8a503fe7f330d3b92942af9d8adac9e13a87f2c4b550761a94b1d080846d3ce67c6a5ccd770dcedae78b39e552ba839e9cd89cf729398824a7c5e1a24cf0cf5c812a594add3fd7563264dd5d005576b3556ccd23caaa40d2795ae6a2c712c0cc33a4788dab08e0568d8374872f3186d835eda7fa436d8e6882a01d1562095eaf9f43ca805c26cc17eb3379876a0e771aafe8deddbd39ef714ae722e171ed5b5bb9777e4b14c57246e72a2ff79a2c1e78b1c441dd04b1a7f5b70fb49047ee7289d541a9411d34697858748c1d665abc8290202ce28a4a9cdfcde46bd6096cc1a9a61f09aa7235b53b462b52612305a84f68f94e65b2b349bb21d73821845d34b10ddb0a569424c50b89d3aabd022f6c4ba8c19e1473bdf29857677a0b2cefda6c5ff3cd4e10d812b53595c7e8804e12e3e246a23a5682cc634e59694a307420bdb7014d0ab4a16f5a89452238b6f4346eb81947c711147e22954e7bf9728701e001d75414cb0a42e78f6d1f34c323706282498752744b300c651d501db188bc698e2535da966f4e839dc40a315ebb0433c0c7a5f69519d2e149036e429e54f3001cddb073894602ebc09f59e65db930f3d12a71e4d3beb8dfb1c8cb0e68626c1a580a86f20cf8ddab548239afd537fc05478385fae2741f65ce84377f637eb3910e016f948b0499ea11f73431bb6e6e7402367308c3367b7704c3a80f8d0ebdfcee848ada2f5318070f29cae1a4f33e78005a334d6d0ab8e1f9f0baf7bbb956d4ff8804c2891c5ad2718af09ecc931c3f89a1c8fd249227b58176a28875d7c74ac69177dffa2a47533c56f30011f312146778ccb3fc863fa16b758b5131aa1f2b85d045b6f52454ca1e98cd833f1bf2da99cbf4193bea936f4c226b7ef14230773a818330c669712555c286e4dfa9fb1d46ae8f6c2e225387b9d85c4062ec629f77cfdd67189fc86cc4fc915282fd3062e452a4e1b6d1ae47da264f11a32d9b7b4b0f667741d3b4288e9fffcb156c2f3e315c2708c83cc4857f38fbccbcd57e51408fdf4d2f2fd68174c65abce80d9877ee6bdf109a004662265b9e27d53fa90ea5dc1a9c0fd085049f8164e672f96e4e5545da69fa750505ca255a20c5b2142666544540ac57580bc506a0c82f8843bfb848dc107907fe09d0f232d6413939094cddf0371e038aec2c2417009d14ab3522eca4d2407d045d9ab26f56d9e835becd2f4a96ae9684d63bd1df2aeb6425494c08e365cb59f03ce87f638b7aee180c4097a8735e617a28cf9c46d9bd33e36f1f7f1971feb59a427042bfcbe5693b8d163e228adff62a2e71c70ba6089886048f9459ed34c30d981879c7926fa03a8fc76624b6a6518ae8e44869e6956733a910bd8c096c9a30925f6cfa78d8537652c9aa1b776544653093a7c565335d0824e583d135acbd997d70e66de93d4194a8bd81b71d2aea0b3fac6f96fef5d73bb5b0b1d0430777604bd67b36efe17567473026077b7a3d00bbe26646c0527653579e540a73db1f132680a47f68335748b0a926427f2b854b34844c31bcb9958824a2dc6a379002f0496859b7858c049419d3bfda3c4d2015b62305b499f7ffe1e8677574c87f649606b9e5a4297e3a6fa640e5c972425bc5008eb7f4c65bcace8722203e867165128935c15e411bdaa4498875b116074e9631b1188acae4347d06e5882cfc34e0de2796fe8e1ca7688df4256ed06eb4e057685a625feeef457ac16815c57207216d763dea81fd0ef41fd62272f989f4de0c537364b7ce380a04a9e3b0ed2fac1f0a787d6054c71aafa7981f749f4ff08ee205dc387a4df014704c27a95352c48b0b87c98c3f25b500aeea7d8ff83756dcc370fe9b618056e0d5231409510f60d1f989266dd5444ac5b69a932199aa757209f7b60d80b28992c60475030120d0d4db70d0e2a78acf6865cc4ad4c6943994991f74a96a36a4d6090b5360751122d4125197651208c1248509a9b47fe87d52255c42629498bb3ef1c502c87147e057ea607a09c9e140957de2c2c0d2a9b41bc4d60251fdaeb387e425bdddaed1eb82f44d3ccbb4598ff9ddcd2cdef4d0f22beeb002d5f64e85770232c683705d6de0b8521a2741092bb40f32c7beb837e6a18838547b098e4b6792acc201ad4ff508a2464efe430cf92c78c37fc50803434a0134906bdd913ed62b926ca6fcca4ea509f31f40a9e1ab53e90c1a84d9162bb1fba35edd92ae91bff5978093f8f71b815bdd7f688106625e6004dbabac603475598324ba40456d7f3216c8e9f1a88899d9d8c8cdb7c6b3707fca0ac3b2a0b11e585cd85eb47ecf5afbc4d75d476db5230ce20afe8eb932da8dbb6b40ffe277b8b8776a20e9b1d647964dc1a6e5390d32a5c3015ee08fef437bfec44e161a8d6d764418789e4e00949099126cc41a23602b003d0676675c53334d8f2b6beb18f3a7f426dc3642c1222106fb98ec1293d100d6a9d15074d260740b62632a7d4d0a1b3d3f583646eeb7926e692410fa52d85ec0405eb20c3219421ddc786dfea3758e37343735dae70044aa7b7c87f34ff47b3af19a096e3d554e63731e769690330301ac44d1fbb0ab7bced1a70e4f9d5bd68d476be610171fb0358c5241b9dd0ceb0512435d7030993f5d1cfb810795bf46dca2fc006a83ecb56d8ec2b3973e4e0d9f06cf06ae37fb5b5d22c011d7998d2a21dc65c9af2783412d026ef2e25469e357f1a16430085f3aa0f87bb91f09384755f8b713e0f2c57b2b5346489bca44e2e30c28e53752517a1b2d676b58c910756a9c389044a3ef1a39492c6704aa18e1c302af1be556d86347ae305e522c3d656604b390ca5704d4f6e8925d9aa0d02a8e8399c6a20a91da91c2b0c2c87a272eb74ca9901a0f07800d3fb93f74aa26a69655e3ff219b0e4ff0eb22ad94e65ee918125d4775558c6dab9b2f808050ec67bcdcfeea58a65636b6a2f34ffe3229547f946e45c288a63d8865e80d29c790728122b75e46ac632a04ec6372e11102260f6841aab8555118af9c9aff2d3ee994f9cb9a52b18515c3b1f08638f7af5df9d2402efaccc0404b95ce580161148eb462b3ae42d29c16920445f1ea66ab880bcfe0669b0bf0a51d382b1371140cb04979eea776db82eed8bd5066ef670e1a3bc54bce9a7b3ae6ef6501a5a876cb5bcc67c4b556c447cf8a7791f4033848e7db03a6c0da269123a86c3c29e5adcd99df29fe88c647de62b14e22c667cd3603ee4112f8342cd371216d97505560c2f3bb5b86017a6e7e9b8bd088e43f8e0d0b74a60b0d58b34caf565fd2cb4896dd515b4f36f66316fce645583d1cd486c482033cec635d46fbe73089fb002e9ce5bf586e0b41b89829ccb4d261cd3bcf64f6ba7ba48dac6e271694f135b0727dc9efe5f982a001c613b5c857652fbcbe6abca3915026a1e63e92665934c8104babde53402eb373a1726e223b1d0c815aac7192ddab3b406829e6bfba87d1c1f2c9aac659f7abec927ede9c5c97aa35c6b82d9238d6fd12f46a3223617297e67939436b17a91dd33b55d0efcda7e8a4fdf4ba2517dad420cf8f8cb470acb3d176bb5f2a09977804e819e1ad52f8e9ccce17f116882d44b9ae27338ffe596062dc508d014d0841c25ff98ea0b6b8f69d928a32ed867ce4119e6af97117afb074c6a36baf9d460d713b544d1c7dbdba7d562582b679bfbc4add070b5da00e7edd4af58596549bad9507c4a9a4898183bb970421440b607c32c6a8f02ac33dfb87b9cd151013be777b6005ceeaa27ecd2a820081bc1cba4fc55675ca16e661c408108f23d1397f68cc2390b844981884fc30ec7f2544bf45cf051b6d77a1cfa888286796860e056c77d95f970de15eac764856820c21398bcc262fa5d3e34d0410f237a34d8cdd063b645528cd0631dd8c2947a82d18a006ce63779cb13db35f0c049b885b3b191aac81217c4ba6d6b162e89ed738a07e02fe70a05c6b91c21a28c8dc685652f459206fa44d16806c8943c93ba2f564305a21b4fda2f6bec91ecdb48e036dccbedb14a554fecdb0e3a4b6a94cb43cb7d8386c025a849139a318c2503eefc2d6d73ac168a568e2644af0c1aa87e2f9eaa08b44e33481e32dc50e17910e52105155fc954d43fcec6f9220b9e950c0e628bd6911415995134e5e0581e31f4ff4740cbb82880d2b33ba1614e269ea405066ca8cdc9cbd5a067183b513d84fbd134428aace47a877614925b813f065a5eb44610051011312daffdb3d2c0508a025cd719391582d86d3a642571618956a571fc9a64a5a487f33dc8ec65a25961b5557738b215ae8b915598f847151a29b91e832715498a5238371466f840f39a127db715aa82b6a1fa2fb98d73172bb7a451f885b5dac56cc4efa09d708c94579e2c44c852341ae3715407683362547c0f596bdac750b3ecfe889a1835c7e84e8507d8e41cc8d4e26f7809ceb6728e16a9e16a70124387ac0b574d8adace7833a1ce206dc8ecf944ad212212298b2063454e4555e06ffdd59490f24ec46d3b151c8de37fd4f1c4de1a503466560da8574164671ab17dc099fa06bd9f6eed2ff0beb65225d8168ec0b68e4223f0e809116002fb6cafd5deaa3ca56618ad4aca00790245fa6b27b6712819d7da1f4689c4b570e306b18fee030add7c83e02a91482cfc169bb9173407330819b1ae4a7ac3934c9d5a0905302f3a1032870b35ba6e0f671031015160e7e319ab0dc77a0ba19fba70f91c8a22b9ab8c14ca58f9845fbb840428b01571884905dbc3303eb3d562393c3d95e1df4c3d04716425b0b5aab19c04b6cc86785a096cb1af6ee313b5414e604b632f2022bb50876b3c792e47c9e0ea419ac4a12fb934894ded3105cef834d3249a3cfb76387955394dd2bfd66fc194593a6dc8a0e76e109028024328de0f21869360f87f985b7b3b6ed55338399d6eb440cb6680efc387dc647f550bd7c27f616c9969a3b665aac966aa411cba8641d21eb392c43c83c0b0ec14c6ad81bc6022d34a38bf2224ba28efd9841ae330f8bc87b398fac55f203e4cc05b7f1d2a40ac41d26237346242010955668473e2180e6b6412da69a63beea63e80de6d86d1e2b7a1e687ab68fbe610bca16b416e4326b284267ddc64eb21e26bd27d24bafd477372b18fd9dd52b77bab98a9f9495934b668675fd5e942df4b5ba3c5eae40f32ebf3162e3f76a6879b5f52b007a8ca07e5b534eff91608d9254e4ddca4df09c1aa19141446d9c10cfd90417e7bd970047fd74b7802ee33b68197d1f4e18655493f334c9282b822d2bd585562955f91fe22c1a25d5ca492352b9afa79f45d3bbb9d333a5ec94632a8410728e9835f967437ed8c1d6a077439b5bf190e96358e4de357f7afc9fd8594564337c2bd4654fdf11fe5539285bbfb875ea695bdfd0a99e73cff9712edc30695d6661f42580e7531efd6a1ee0b5bda7e940393f0d3660c5aae43148fc43dfb68162b1de9a43105cc54b9487fc8f171654e14b355820eed2653dfb2325cbd0cb457a9b2d1406758821cc15456834a8c5168b67917b483176e0450f379c19fdd9e2622114a424d8b331474ef505406708092472b94026ad42dfdcaf65a885469438e5301af00e84d38c3d7f5b5ab53f8ba0bd5ae625705a4f36850d4b4a4337f716b27e549cf3f6a95c442586cfb09d614e6764cd2f7e8f1f9ae662b7b6cb2ca7990c7d56c4f8352a15b4328ee256c62a531c7e18ab2592e116cfe5f2cac0c270c4892da72c33ba208a360556d4ed673aec95cf5491194851c0791aca6ed220aa2cbf9db6c4abec027c620eb401091bc3c673d1316a3dd1d346cffedd68f77d81e8d556125f8eba0c34e2fa16e031e11604d66a897fda1c7d4851670ff928f411e497785ef3389d1f08002ae2c1e3ad7e4f7e025cf3fc50351dba304036e8dadebeeea343b7fdbf7e216f3dc33e025706f1e3b7a7b0f136c6a7657aac04597d5f1dcc36ba0b186ce46a681b5956b93dde060cc3efd8ccabdbaf8e0125751625ebe96404d966fa7933ee7a65386d5e1b5777426fa46947a6dcb817a3c823bf7fb66c8bc5c7a7ab72dc455c123ed094df017f26db22b7a056f29e11f2d11e1b56823025af3256b88e291e312dacc2ec137522528938a77a6c781620e2850aa6a6b4fb6d4796deab5f8a3d8242500daae0624e69176ee0d5fc40c0bcd8eac8def56315ca2ee65e7afe95c9bc73d31fa3404517846aae63f87c5bd29dca70a95e7a91acca4799ec53e537296ad563899967f2a0e541c4a99eda6ae2ee494d04d4e7ffd20a49d37481a19b13cd2edc28b4f2155d1bc5cde3ccd9ef602b3250340b4152d318c91018712162e021ba3e9b2c5cee9b20a730e67381b155f40515f8d6bc9a650b4fcf0cb9ab8e7c55c131d0bacd7a26d16f2d13b2e8fe813579f3f4bea75af605cb9b64475605a20e721707130d702dfb74457ac720181443cdd6aff0a36e7e4cf534ad5d80203a3462a1d95279f7a578fd302c6321510b712cef26a22bcff4071930dc72b0e2353c4643b9a32cfdaae5c26e14aae617e7748b6464e476b672fd64836cee9249cc791bde533d11fcd8485c61aabca172b06db29db25a492499ada3204d9372de2d5c386ac0e3607f7e93432e0cbd88aab5cc09c38e1205d5009a8b619a9619e188e900b85613937be3e8a2f231382e1598081856f46c8c68af5aba4013fd56bde3a28b8ec9b703f53be00dbc0627c85b65e59fda6a67af255a19437c71adc21e6311f5e3c1d0a4786bd3deb73b52a01c4a258f546a756466186cdad8df42506896d272231fa28be1e7680eee09c3e0ca954f4997eaa31e5e3bf3929e4a57ffd4c6dbd2f0c535162fca773806596bfb3f16e3d60e3521e196fddc53f07d273c821d09dbbb9ab4cfaf71c85cca863f51c140dfc3b987b51fdf80158ad5ff94087411afe00875087d925803fe8f44b10c51e91e6607c4cf2169824bfb5cdddf471466f20aab83a8f9e018eced561e7cec9e506832f54a04be69634269970b528a9759f11dfe421601a1cddc70e65b63dc06e183aba6a7cb1da11a38e7b0646aa35479caf8d2f8283e6319aafcd260ea8dce11900c6cce827c73bb31962c0859d58fd0af51c2afa25eb8ec005c39182fea61f0bfd672b5cd41c7bec897e3c048716b62c5fa7a8e3a168e037695173806c7303c99187405980b0ad6725fba2ce50abcaa541100fd888af88a831b5ba2f6e3ff8654cbb50005f0515fe64f274cc5942a6f6c70091fd61f461d6aae2c2d0cc94598f76d08eb395e498af692ca43b06257329aa73181b518b0169a6870fc61ae28bcee7a2ecb68400a19e099fb261cfe768683ff29e9d260c5f791f43ea255f34bb3fbbfb0303490e887245c6b568baacebe6c174761deef20efd3d3490e520f40e0461bd8dea40c0b247bd02ae6596d8f9b7a3736820bc4821fd34e4e3a84dbe3b45450795f090ae04fe85418100ac80ea5f37e93a5fbe32a2cbb6e2a7fd4ac1f32b0d5f90c0a642e239309136254e297146ac56e1179049ec4a0516ef5dea31481fc74f05ce52a17ed9e52622ae5093a3836cd36bb8b6c94ab07a9767bfb91a88925929a68042b850c5fdb0c9a295a978c32a09c362217f01c93774292b6117e112816f78bc491fab5f078ffd3b6822069d62682a7a44f6273d7b2e188b0645c38b7e192adce0b3fd39c83f924fc776739029d0fc15968ddd34d7345636422b07c075c2e3692b789a126fccecd34a7b9312f09c1176f0c5daca0bdc4bb7f5e5a5080afd48fc09f80fdafb51854d08be0ed2b5a723beb987a7ded2124543f70eb202fc50164e848fa83c25b2de73f80f7b8fcaee12c1d5ac812e3a9c2d828c02ff292c413b3a3bc24de2139e10e2f045412a929a1d25213f8947a9f9056bd8968292afd5765d2ae12e6542d252d73574520f0591837b6729d975c2a525b124af0ccc4baea19fa80f6034ca784c5d8b55aa6c0d9443795131db9b115e66bac94c02f4e203d4ce66bfc36ca30137bacf6692c79aaa58c3e588bd15597731a7a4a28053ab6941238b10ada7c502617980d15b18b680d8a55b88fb98faaeba8ee53f8669de366bd8d5a04075e841e9743b63bb92504b91013364af4e2541abe49422405672bbf614008698d3c41ad9552dcbee60c5ae52e5214845a054dc198302c3e888170d81005079ca543a29eb7fc386b5de7605f97a4104f1a30d7ea28dd58f9b96f1d936a597119387c545020b6321c0c197ac4abc71a45dbd3344eb9d0e8dbe40a0321fe00c33823ff5a26057f74391aab5f380fc7e7bdb375e24af7482f1fe1036aad6d43baedcb5dcfc2172a524181c47f2840401aed611c9416b94a36a4dfb206016aefee1724afd9ed7d080e995c4e1762a98366ba904aad6305b10f8155ce107a4b034a83a5211ec9340d3c2329485283110749112c13559d4dca918664345fccbebb686b21290181c01bc5ce0e4c33457c86888c8532b3a478abd6d441bd3feadbf0446de924b5567c6386101ea6dbb772a3154417886ee80fbc4a6da3a0d956a247c78190274a29e17619d360cfcf0eb03e2ab6643c56ce30fde4be28dddad39a999780bd64ad8793e4c5847d0c6902730b8304bc2fff1a36596c53355885aa4b210d3f51d981c9e7a141c0c70387230d8c30318ce4ee2b05c586d6803aa1801ec734f066157308cd514f438b5525bd441a936860703313d2ec21fa1d5e1d6a0328a94cb3b7b7353d362eac0b1da3adddeff818ffe543a4096e60f136bc7882d7b8ba2fa93020739155ed950b9d62f067ecab5ae70b5c31c11366eaa097544cc6730517a5fb56c063559c95fc9f705b20663378be58bda0176ba75b02793fdaeb9769f9b5d5f603d003c162f56e76b02d12fd728a8e4a0b3b2aeeb757ec1b10f405486c026a84d84683cce9b24501f914dd4a3b6d93f0a9ef1cdf7efcf1a8d287711cf0b933d8a478d8bf20b84f528a89a4cc5746dcaa20a1b9dcd5a750b83c4ffe1e73031841524b149e7f56a733a96ef40d5b828e4a03d8a2a7906499149fcffcf9f65a315cd56a93927cbe171bf6f221cbb0a351d76ed76aa66e2fca8884b770e01fe65ed7c6821bb8a3a6b48bf2c5e3ad0dd6b8739ea1512f5aad398c6ebe4c52781dd7eb8337e95bbc7eebf5ef569ecc6b5e46227c0ddbfb8195ea3623fd2271f9506faf2cedd481d75a674c57ea44f3e2a0df4e59dbb913aeaac21fdb278e94077af1dc6d5d3b00dd74d57ec47fae4a3d2405fdeb91ba9a3ce1ad22f8b970e74f7da615c3d0ddb709d54fc14b8fb2737a32bf4d847f4a4b95f157dd6387da9b8d4807bef2ec6aad398c6eb5a3af28f41409473ed794eacbcf189f415534a31bd504c7363deb4fbb5e2cc7f6c2ef7969dcbf9f7a852db80e997ab8634f84a0a221895f74c8183f4785be8dae130ff26bbb1bd013776ecd4b1692873735a38e0357e0619043751ee3c1edc0e02da2885ad61e33f8a880cc038d5c1a4a187186f02821752314cbd07b11984985a5d7009b8a13d300fe87622fc1cefeb19009b42ea9d70ba63d23b3abd5decbab8e0fe020d20d9335218f5f1cdc715906497ab43559933bae5b4669fcd4c0286d3fd610690000bc4ef55ddd4ff56752a6de9338874f960c4e5d3274b2e32b81a03d64bb59e1b93d652ff731e36f48340f3448b2ead938de011d09e6685e9292520669ae0ed67797bc7ba2d7ca2145b0bf09f957982ecd99e96e64677fa9d1db25efcbad099880f2f59c4b4631d6935f7cad4af3099b5f1d8855a2726106a60e3b1134be02007528afdb378b4ccce5fecb30571418483fab72d0d8080184100e71664227bb7cbac6cf1955dd53588f45470be12c78b9ffb3c277ba3c225a5bcfdad72bf36b2023dab75e953681edc0308ed99939a732457b351a5f89e90debac4edc2fc2b95cc08db1a6e87f81d0863b299501fd2b38eded866b5dd28a85acd6a5d6bd63ad66eef24561ee2c89a4e5ea6a82bd58d94fb741c3266ac9ea3252729f1af6d3a4268209c5ec68e6aa5e9a1a666b1af3aad58fdfb01e8b3e1a25c224267c0895af35dfa4d7e09b0f54ec582577842615f6e3040771db17e53d70937fc4504ff3a30b11673097c91ad37d6fb0874e39948e0c5099f82f5b60b21e81a9610df6b8d4e6eb400510a28dae095522c25dd4328d7361f4868b053f4ba72cb83917175e37fa1a47147310e85c62d24d77525fba10065f277cf9ec40757d0b6133fb0f4f761c4eebaf52bd7fd15740144a69f6c722ecbf9749ef12ca3ad1179ebc2ad71784bf58c35001be729f0fd315a2c5f19ae73cf5e28318d5134020d94a8083f89255433c427e89707e548f000d7e937c065828a1434b47f9a18f3494c34ba404201c92b0a88d2c7830f62dce8acfc79b445d51c4a6de8ededef3c5f9df151552b03e93d9fbd4c4c5870cc29481fb3abfe34dae61ac79330344a743acddaea3ade4c965950bfb48dffd01eb8342e3fd0754ca1f3594a16f44d137aee651f1e807e7196dea55a3e7110b3985efab4b283fe88a4b3a20c96d79ce8ff17a2e3ff7c885c628740b3d0f1447936895b85601788f5d97290d0aab74dc6f9067f4c4cb8b54bd350687e26aab89a3638e184580010f4319999a2fcacb8b215f0830e7832aac9cfd0fa363cead4ea8979f22892d2b55e3d61c14003d200f9d266bb9a569653c234694d129638dec2dad83a6e049cd0871bd2ef62cf758929fd5b6b37bc350000311d769555bd53ff5e3b3bc745f5928ac9b8b8ec7a29354c48d487c763f6c4eb6545f0ec7865e0a7aa6858dc39ec8b9642f0b5fc3d81564a1ed841e1c00d37ec69943471338077a551b3d76e47b803f6e11e3417e1bc40a3839c5ec41df7465d0751a552bb25852e75e3418064d0c050f8ea422a406ee42700277b9f409a3ef11c00b04a58dd325c0895a3a2e1fb009ffe22c68ff4f8f946f962828075eb262135ce7442f77f247bf072a9e33e4925c8b006cbc3acfe699db622f13abb1a9ea399217701a942fcd38e855ea1673be7bd71453e48da691e585c846241ac35bdc4afa7ac88e00f4d1f762b2662afb194a2c5fabcfb9899edd9d5f2b0e3c72e4f053f16cefd2d3e8813c38acf7bd2f3c1061d5237462b8ffe771211bec2810a11216e34e5018a23c2a48cc392bffe51d86104b67ff259433ddceee6573542c21fdefe3415e11f212676eff682606a6371ae8412ed2f1d13ffd1d27e7bde409fcec3a5e96092f43a94f91bb5d8f52f1598c98e9d44c1f56c2da563c11ac94f8e9250a3625d414a00621570c012e26db561359fdbb468f5beec69f34abed99662dcf02771c27d190a5808a50798d5995cef277cecc08d897ba88a2285d86c8743f61a9545fd367c21269aed7d539d8cfea702d17156241e83fc26850b969e46e9af0f38f80cad67165cbe897ca98c8101d2d2e04fbebdb50eda5946a3ed308069fcaa22b9195a2391902cd6e313f03022017beb0b6d71b717ddd617227c067be005442cdee15dd601b4236b24f074aeb297b5fc4ad180897e4f308c515b6bbd9a4fd6d7b322df6dd66b655fac609b2fa92da5047036837902f6035f89cf4dde3ab4c5f6c5aa68440cb9ed91ebbe6a0b2d25bf56b7316accd7068ecbff0a59dff67d91d616079b7ec9a6a903243da5a715fc7efb292ecdd5e193e00557d60b9582757f444bf09a62e4c35b10aec81898f176b71d91e64f09b907c259a8c4a6321a6a3969a4026476468fcb32fecbf0b084a5c83923c168c1fd2123681e3c27f72e18f555b0d1476b57d72ab15ce091e95e58b096f11191e3d95b23c00891117e066c916e1090fa62d994f96c6af36d0135c60a9daa7ec5cf521ec4d69aa872330297b42780ec4edda8f7f9d5568943eae53324374b862e38e2cff1aaa75dd72cd7b70522c72327655b576941225900e14468b65bae5bade31e3de63393e07ed075fceba7ed1978b69345424fe3cfbc3f275fa782d05273de990c64e4ac7f903f9eeab5d5a51bc8e387f72e0b5bd86c9f89cac94e68d761b5c62be1adfccd9dbdeab658a795fbb0b5c62bf964bf0e2bf9dab28e56f6cd62ad775940b95532c92cd627b158499b84b8b0c4c0b3a666ad0c68d4c67aafe693e5f5ace46bdb9a5add07abf5bdca57d6ebb39aaf6d6bb56a1fb6d67b05dfecaf6565be5bacd7aa7db5d5b33b4c2d3a0c807c0ececd1a23a67ad2999a7ec58ec178d5b3009f8373b28ae25e4fab2f93978a4f19b017cf33f72c88ca886da5c7412522c114ffd27baf86e364639dad1a47db64ff88eed04cda3465cd3d60d5848e100ced2705d053b5505c9c15a81799a2fd6784936cbd9b6d90f401372e8ac44806fe3c90031b2a7b84954f95eb8f290c876adf2b5c94bc984843404ada61104ad8e5d39e0e373fe4ed0a44d1fe99c3205f0dacecf4a0415d1873e96afc4d965dfa84d935b6d08a7a6258954f0cdf5729f77152a67ebc4c6a9e0f5e0752ee5596502dcaed8b8eea7f7487e2f45c2ab699a2f18242b388414e4986feec186a720d781344e4b5bf3d2a2414807736a5a2f77d85ae24ca45c392b3e6856fb3319a3d8042744ddcb316706f5d783c1bb831d334923e7d01740f922fb961bc82af4a357a613b6734f555da42ff982f52c2b10a5f9628529e5352c3273508f62036e6fade5b4042fc6ed3f4cf6150716fbfeae52dff613d3bd635a548d8f261625e64ff8cc09838611d1089a0f354def529bde5121aaacd3fee15f4ebcbe5919ae8822a36dfd5030429b1e03721d6859e78aacd3fee59846e0120c13093c57b98b62ed418ef15adc376bf72216c51b3222371beefaff58268427c3babc90323faffec4c0f9a941cb69ca631bebf6a435c21df9f329e9792f06690cda03dd2e7e405844f0d5284d7138e197d1c6d612aaba2396e9c186a2609e99f18ffc997a8aeaafbfbb853cea1b416f21424d068557d0e60811f5b8d93d31872e11c1fd33572c749dfcdf80c220f4a63ca4d6bddad04e449efdd5904f44b7fddb306e493febab33840c7522a594cf3eeac03d2eaf57beb9e35a047768e599866dd5b05b4d9eb7a5f55a6611f1b5d1a2780699ed0d7b4dac7c42e1ba7ab4d84a426eed0d4d8a8621eaae1244d8027ddd735738063e3bafe46fcef26f96f8811b7257f7d78a3fc7793fc6f45d1db929f32fa637fd019c845e779e17200a7cc6bb1052d66e7fda73a5c91f39feb72d2e8954515346026cc0eb2971b0a5979d2b0d67a5f76d02490cf50cb4e980dec6c60906383b1f3dff793eb7bd901d8859aaedc5d14655a4c751990c1e7f4d2c2c1806c5f497888c7c71693011af08d71d18bc7d2348c74a3309d4f3023c34ea9080c77049fafa660794a6bf3309ee2de04f92014c871d5d3ac03d9ecdfb0e7ae9f1003aff152254ae70108e510d4872713f0386505d08dceafe00b406501b71e3e2b7c533e9993614c998a6e28e7c80c3861c01b4d0392197b11add75601ef6f78c1a18f6327455c7681176e6d1acd5dde9853561558e9cb08b5aaf09c92dc0873ad6b0277ab292fb762f54f02a0f90d6ef0a3be488e1c80034de36b35c6a0ac7b61cf85cb0908e701b7a52dcb841857d053c666bc67f33a0b3f7b519e7caa81482bd83f93a0ca580a36201c9b3dd4ba6653520e660f05fa7e9a05e1cc001dd37a7e68fa1231a35e206fb216932c62891ea7342493a1429b9d02e3bfe0bdf6f6534521d782e7ebf694619caaafa170508cbde2facdd1b317dd9845d7b3ed21ab9fe1d9b50e016ffbd088c3dce8bf66c1aee72b783a26aa7e1aee4571f541f91f0415c6544c6305a4c15d8e8f20c243a997ee231617b657c9b4482cded0130f7ee787d2fcdca5ac26beb6e297be8e1c446a813002958f761495cbc971bfa505924cdc1517104c5915e08bb45d851186cda56c7dfc845c02c41e8307ce957fe224d681c425ef97c514579b768ab2473c3be7ebef8e0bddec7c2c375b8377d61164943ac9b34be93a0e74ffc3799cd7770003e4139a461ce00bd7c9804ea0e5999790c4e0dc5363484be297c2d2e637f925864a6fde517b2bca7b40400cdd24ff6a57d719ec9db635e89e2b721a103030544dc2283f3444087adaa7a65df6e9b8ed4f70cbfa7698c8954e4080fde61f7e6e06778cc7f543167c9232878384e67c3662d236b2eb2b15fec17d3c39e190cdbb3e4b216a415858ae860e7fecd9cdbfcfd044e49eaaa18d8e0ac3cde36033db1e2de63fb97a9e151fe5b41113cf32df28a6293a41409784bc993c0daf278a5fa823699426e3f748f74e73210cc449782b17bd760b7fe3451042f13a6c96290d866ecf0b3f9d75f6b1fe198d39d3ddb896dfcb56e36c6c0063d1ac012c169b75277982afa9170497e4d4b72fa853b78e448c09e0495966e3587cb4c7ef0321efe184ac97dde94b7d0a3d730746d4f9744d14f0b44966b221ddfda89dbbbbabd5192f7d89d2ec1f4ab57c3c4ec0acbc357596306a8a6723458d5405eecb02e5f0df4bc859d0fc2caaf7e4ef0fcbfdfb15bc4d0bcf8912f4ea6015da8675440dc66b8f24a17feca23352ae340465a81a80b1551338a6cea9843c0608cce855592d40a076086a2d1f888c72ef13bc4380e4a501dc1f3a0bb6c2b78df858d7b46294b109bb62719b398302e5f373590e2e473da8a3884d0658ee7cc3e570bf51c97b155534522861d2d6fe42922640e6f4c427909548df38d26086250a8ac46beff99c346084b4b539110cb9895eb32b5538c8166a86d017dd78ef9acff52e84bc3a942ea50ece84b2b8c2c930336cdd6b17f50d4fdf20b44d6f3856125a8df2f52bfba406302ccd664df29d424e58156027f95fe371d131bb420f21f302f664aab753925cb9c4ffc36bbb0f853b9013472fb98b8ebae42151b74d2c0c945b94f1187003ddbd7465fb2d35eea13c4eb33544fc017dd64e9cf699481674851e21ea7dc97f6fbd1c5af5f4c1630f8facf9d7c765beb4079d30fa6a9f9a04d54507b32879803fa8e04de93ae3f8dc7d8263c9557111242e85745653abbe6182b7a283ccf70d1b273fc42f725361060096d948af19c5f797cc85255eaddf373c4a52bde0f690acbf10e50de80224a1c119a3fb8cf04183aec44da3ca8e29014ed03255880d0be5676d70f1f5d0d45aaa40186ee45cb68f296786a3a9efe6aafc05969881851365597c066886d6625158191d1ccd1ffe3a731ab1cb42e88424593e6d657caaebd000c206c2638f59ba39f099a32f3d882080283426c4507eda34d26174261023596e9505f32344cf2c72db3a1a8fe1df94b51ddfbf0ab2f6cf7044367c37fb00a9f6b77bf7defb898c296cbf6c301ba6db2f2259773fab5d6761973aeede538053ce90d92eafa17eb3cb77ab2960ca3c313d4f54da010390980c490f8e3ea8f6f7c85437ae3cfbc41a9c2f47746fa198a9261069abcf9a4c66088b22f46f74c436aa1c3ef9d86eb2e0b3cb012d62014bddcb927e0aed866eeaa9298463ae2283953403d45d66f22234397453bea6371238a3386c10dd94e9d1fa839790610cf74cd04d11b632e4e6411a37f1495381446b65d73d52cf677be087abf05ce7155e07efd1f728e9132ee4264afa57073da102130cb2adfbfab5196edda4ceb1eec00791fd6816753fb291137e93f2bef68068795556ccb64f6f4d20cb797ed5686ad60132dfe4f6886cb44c850de240c9d25db95ca4c311f37240b96ef9ecfc7cddd2b7361fa5579f7d50ca25bbf1b735dec651b17a90925df50214afac707a80b96b38b8f6ffe107f09fe1d0f4b7c1ffbda45c7bd4bf792f870367f9a935094d22b7362af5799c3701915b87b19023b9c445aa67078590ab499522c20c334a496ce33234106e78d11b800202be93c04c004851ebf54135b2bd2fdcf4d6302d6d7a819f09383c3e097e166084d6c0191071f8a6f6b6812a94db8ba62c11764a69dd16e284bdce3c3d1ca9332b7298dc966994411935fce8e712cfa313b98dc45c70dc2dfaefc157ce1d6ad93e0443f1febb659b0902f7e040fecc8da0458e8ca2fe7b41b76035295f058acac4b2a4f5885319000adda64dd491e286c3318af0ad3a1f685f45b4ba2d29200f60f1b9090238df0e0e5e0ad81ad8be460abd0862544cd39651cb0456ca810ae818034f6dd49a0befa2e73835d081b0648e8c2eed278b8bb31c754b1502614d3f74d919efca35d3f1162ae6370acb03f896bc445094eca10b4fd020e73e0aad16969578946091f07866caa6347e4045ff96c7c3933432efb6ce414cdd98b94078165a5e298fae990ad31c5be4732dbf62cc608b42b46946d952188d4634300ed5e6b20605a0de431788190263cca161eba40c28ad9048348ae3b1f5ac2b95d4c8fbbe6f0b87ad3e91b1322e7d77dfbc1491920ca84a76848c3fbf61d69a747b516f1b54b9a5e4266035b385387ca30942467d4d29a4b4e60765613fa39846bfc027026cda24ff9dcbd0d6939bafd4deb4753242317aa575e19294600f2773bd58497dc3be93722100ae57902bdd5d9b13b9381305be20d4ddad8c8ab0e488cbde89f04b696591b364bd1cc60a51657175222e0d76caa4ad1812065877842bb7d2ef2d6c58fbeb089b375aa32f0a6f1b1511ed1d64a65d2bf23747f568ded267433d9f3e458c9a8c2a28852a09ccbc654d06710b841fcd2c6b28adacae6c14837b2d44ba95acdad197b8238c375e061b9b2cd06248c2034134561b4061e5d161d38090b8e3bc831659945d10da371fb2f03449d85eeab83aa3742d4cd9f38466391a1452050723589fc119286cf79d87d9c433a81485c56cd7e6734cce38e78033ce199498246abf57cd735cba47cf880a382aa00080da636f83aa20cd5b510bd65d03df3a22fcfa963d9f1b965e0409f77a97e5793ea852ca6240bf58cb4f6864e4508f95ebe066c56ed0fb26871ea3e7abf4289a0cc9f7ff6dbc4964d46db95eafddcfad07906e76d19a2bcfdb80508b530973a0ecc39dc6df4b20b9aea15dcefc282b5f05fd93bd057ce91c3521da15552ad6287da7f35da215e85b3bb132507f9a128583aae14f1a44167c835806263bff2d484909a8ee06485170591a5f85e2f2f4311c9970e42b7f172588ee33275335c799dca01d869f56538aa3fad395ebbe63e7c785746430a25feea980068e886fcc11716c370d93104e45264684b7faf106024974652b4c63f97b277d9d588a9a41773ca2e1373ed9d9d5fe9a3a1c088c404a7f75e6edc99325e5847e2c9896c7bd83ba82fb76ca4ede9075065ceeff58e813c80a6a9ddd1e443a6f2528a410936b166c612aab1980ffa00c498f49bb9f31ab4707649b9b72a47a6bad8e2fa27253cede2799789b168104bffe1d529d4500e21540c784207ea4e24e12fcd52d993738ac6a6828c60b6b880dda426275a23d77f8959da5af95bab26271d91e26f3b5947310b07ae032eab3350e0b5691b4dacd862d130aa0e30826cc6ef0cc002de43a41d8f134b7dca060864d2bd535a46df06571402f890f7a416ef02b1a6cecdc2dacbad47cb1f86705cb411b190fdab2ca3e1a69f8261436f20d2e98ab5ab09aec14860b35a6c508afa980bcb62bd45b1da15e2d414cfc9b714cc78d96bf2bfe3725b20383b6f0ae0bf89bf3b224e017da8a9ba7d9165068e844cedb544e9b5cafce7cf40c37712545faaa5faf21381e7e15471187ec2ffc1624c274ba21b404ac4d9dd25401c0aff01f5931499b5ba8326f0b062fd9921edc111f4024de4a0430de4415dc47b5806daddc25fbc377e107b350efd030852c3124496e971903c23624247d046423b992cb4b3f6b2dd520e83aa9243b62d499e60c477e6b4a72bb72ee1b8848bd99f5081746f0f35c3d9beb16c8bd7db9a0c6f0cc0b8a3359c546e8f759870acff7e143dfb6b775b640ef96fde2155533990acaec5257a8271ff41bcacd129ce653818ccaa6a3b6f181a8164e42bd003175df979cfaed6190f346b35e4a3e25a9747ad9e3a1eb90031cab6009a261ac4cd48b95b47c11f0d0262a9487e2ae4d4d1ad0168ab0671dc6a9f2b04f64b1edba5ab89a4575dcad5886b283d14063b5f806e9713c41004b1d543f6e15ded4068bcc841fb78850953bb1bda490d02b7d4decd061e73bb0ebd7cf596fa3cc461ece79d9e0ae6fc6b00451413ee59b1a5baa40dc9b6498f0a2f0a26f73f2cb7e028157cc7bd1e66ace21c2e4ad07f3be5bbdb8dd9805c72bb31fe2c2765ca2882476e185a2b937c7c5872cdf8ac21509c80dc09877b8a78b20026fd277c5443b145cc7c038a6cb4de9fbbec1dd864edffbd2c257ee937da1b3195d1cd46563061cd1ade1ba5faa72a7d7a04d72bff54c656073ec7b206547bda547b4ae9e2a4eb336e29c4468c2e3c6ff4641c810cf169e7e88483376563f9eb1806c0865892b5ee5d6d69e96e0ad70d92250407c485f747811251ab64632b6408046376245eef5f381e10db77bc7e04b04f88e05149376d1e6b9b271a83417cca40497f4a09253384971f9d5fc7ff1db0f9cca6d9c0e4af707d0b61988a7ce2f9b841019064091760960378f2ebbd354a36b8dcd05de9b954b4dc9486e3bbdb765c5938e15469a12e1c84b71ae3e284ee24e2080b9de148c4e029687b01e2b108b2d1d36a340e3f108c0f5c2a739c10890854e32d1cb0ea8212fd5179329c285ee2fc2c031dbb5708c3cd6e58cc08e4bf086d10bd47fc9e404f9bc7d7c801ca927d57732348103d64a92c1d04e52bd3018226ab8ffed3992e13d4470622b713d0f5c955b970954b2a64345a65072b32252f8e7a03c7835f4610bc131b8b4e22dd84375a837ee95b503d9b1383bf351d63be8532323975baf0a6fdc6cc3eef3baaca1984228d9c78b4a38057c957dce9604eddb2fe767ebc2117427aacfac1fbba14be37c07207fe2f12a982e9573310c8aa9238478dcecb8f6fd66b713fea71482753ca1c01815626ffa60a83c24081c252f02999195ab428438941b02db29e22a20ca3d96f0e6c01b125e3ba71117ac5271cfbccc95649a545feb4a13108610a97804887532e7f97485ec50f141a27e047a10d49baa2988763f65f1007887c617ae11c5107402cd1a009b207e1e42ea46060c46f501525dd19147475173f3b4d07ef5ec11db806317269629f14343134cc0c4c258a55c01ef8c6a77380c44183e7dcefa93a27242f55cefe7d8d4a186c5487a4033a8787efa0471817a5a74a7ce4958adc7accf73947e029f3d84f32fa683e9ca4c7ead34903fad7d242c0ac90bd631f9f5a40d0bda758c2af9b88ccdf4a1e4fbc038113bf6bfd14e8f8fcfc8d966f971f1bf38a5d3950e138e51b5723764ab1f74f73f6576959e6582b8fca9ef9d2c837c427022387127b13ef6cf7217fa2db8ebd57bd0788da3dfcfb088be51a2577bfa4bf2a590dd73d7ef7ef1878a1d3402f5232cab376f0c55ac75202c321dd77d00c733980eb8541a8521a3e0eb965f18d03c5059fd53209137070b40a74971fc2caf9185eb479eb4ae26d1f8308d0c30410643281f9eb94e85f2379632e93c58563744ac4ffceb0572b5aa973a520e80a98ea4ede66389467ad5a2d28dd6d4d39922bfd9978cbbeb8a2e21c8fe1bb1485c3691396c4c4e6e2c2cd9becaf11a0061d36cc8cb5ed72a5626a3f64f08a0c5215cdc75324fb404105e0dc3b3df09254e2340c80b084f4648ad012d2a803933263430625e60052c5ff6492801bb2b54798151606c44e0c0798e413adad76dbaea3cad5b404f94b45c72c0b4dbc848e42a5ab87011b98d6017dda6269d8391af790162f8af5c0ab9b0e23b45dda54d07b42efec38cfdb03f9eadf6836e96df4b0220306236e69a423fb8097a40324d92bfdd12c2163a0682045c9e351ceb86da1575119023b392725f6d3b3ee8664d127f738be306e261a769d4c2a98300f47e562f665e33df1f1f0931a1096ab682526b655bbc86af09529f0b5e40e6c07b2089b706637722f01a061d301980e3d0e92f3f016386536206d096a3fdc605c3e9e0357f6fa5d7d9f3de573ab267609671109b021f06a92497c4eafab75d0126013a34caf9af7c2bd233655db5777e8379965d5facb14ba8758c2737dd8163c1f38bd2adc0acbc412553b534f3e8e643d1a540b43fcfb4b0e9cb7edc9d8fa4ef6197586457fcca14016987031ab7f1866971471e05e5c0b387f5bd22eac897385bfa0e73bcdfef3834ddf52439d0796d8ded8bd73661bd11e9aae2cf86e3570fa1d0351055f42de4db361db84a685f5ac54e5f77d601746d109edb52c8aaa8b868686ef89e10c9cb2e79af46b012a72780cc015e87c55f1a8224d80f62fe01ca72baf4b11fb9e0700b6c85d848004f4cdb988e187a68561a53a2768a231a8dc688648cdc55e3396374a3e08a5db6ae8b3d3d93a0963a38d243891ed2ca865592013c68c3bcde4d7ad2b2be486ac46c75d41cb24f1a2f2df770ace9f78f9ca1f67d44aa853687da1392cfb82c2e464d931800836880281377a953f20e5ca63bd5d80043e0bad4f1b05789691baf2df23aec2d8fca444e75441bf7d94e3321278c465050cae113ffd66f49ca7a0cae56f0bc053ef06f481110c613e221c61e21f6a6c35bc2dcfe6ba84e4b64b0088549b2d10ccdf40c8b54a4f745453985e0352378a1dd125cce327be2c0a49b2fa1fc834cd2e3a618f46a87375cda4b32c020aa1437b761b825fe67ce9f1f928a0b1cc84615aa71c292d52e15d1499283cbdc1f0a2823769ae55273803a356c7fa44aaf315e44e371292bf8510d03aa81034c39030a6a4a7a5a405a15a903d920c7ced8005df3c99b69e4aa377299adce32cbf9be41edca907be35a035fd6c7b9d75383d00f46e906eb86ec03f12f39ac299556864205d0eb32ac23ac5eb5a86ea51ef017d13792269becbdf796524a99a4940143079b077a07f344e7895ad9f9c71871228e2c22592c5bafc59dabebde6627dbb5bee79dcd9d496bbd6a746bd5a9a7a86c8c47f9412c6d1d75eccb98eaaec2e2e2cece3a1e786b76d7ed923a7d8dcead7d54ba6421e59cb405677a7063adc1aa7dbd68b63b5abaac14224b0ff1275b2a68edf9d9d56edcf6ee2b77f657fb0b66dc6f59acb3b3fd761def775bb22f7630dadd3220b2576babc3e20dfbde724f6c63fc855829c8328dd6504d83bf625a935b9f0ec63b1dbee91762d5207be6d9b671520639ccad19e4b9ad0cb12c0ab2fc1c33b7e6893ee5b2920e86ee160c12598a010747474724c4caad5891dd753ab6cdbd4ef0ba4f3b1eb0d3ce0459fed6b13f4f9de8d4a57b7529b57b0bfc49f1648fd650bf94858518d9b80f4d2f5abcd1e198a3b8174be2a02e39637e4ef9c2fcf962a3ec7db3d37553ba833d7ffa87219677feaa7cd14baa4f753e27e2be9a20dd5a4cc9182f6a5babef8e0eb130cbcb00557ec6e8481cfea2ae2d46171959a8865e124788895013b1657ee841d8f36b4d8d952086e3a59b21372e833b9a99333bef541eeb10cb4b34188c51fa30c3b42cd4da34869e444a7306fce60ab386b0e66bbaa6ab53e960fa580b29e253f83998a364e497a34a3f3fc31c15e327cb4ff0278b0c1dbd14e393315b821c2718bb1992e304413d3b3a8746e690a00926ea55c121243aeaa65f955f88b5629dd6aae99e21d63c8d204ba7d48ae0b670d1e932c59c0ae8d7fbf8f17c368a3d1d622214033963bebbe60a2181edb985567422006f0f67c3bfed0bb1a8ad1d8f493d1d84dcdb7bd8cb9a06e3a7b683a1c1bfc98e87bbb9edb321c818a6ab9d8eb93510e43841eb5e6f9109b6b67f20e31517ee949a3a907b394ae5a335def95edc6bd30dea8aa90e15c9ad6b3fa72150d31a27f67c247b3eb5d9f58889818071825f74eb812c237de5f7fcb6827319e410cb5194e57d4a8a88f428bf49fd83e7e726fde7a3637478befc299f2f64008bcf0820fd4f10e53d8982f21d4d670905e545a42f144a0981de0381fc95bd2fb7b213a0cff95f88fe13bdfc0de6e437fd222d7776893c1e29bf27e53feff148a48f47cae7f3bc7ceff32c7498f2a147f91cf3009eff7c9d25b2e7bd2f794f7e8f0e81d89e971d02e4474279f91f12caa7e0ed21a17c3ce2043f1f2798f229dfc713a6fce8939fc5d75922e74f085af241c929d9e385409f4d3e9b3ced0cf0bde8676700f985727f2ffaed13799ede6a7e29fabe70882de23a98931789bc8f9a88f49b88b4feec9a27fd4dcf4bd19bfc2632d1b925127dfec4f3529fa4a49c84581e496a94ffb4f724ef334aca7b9e102bf479be1f4efe73f27d3e87a764fd837c1e409e97a0ff7c5ea67c61cc4ef9acc31c02a1f224d21762153d51d9d321e9479fe2f17c3f743c80fef39fff849f9f408ca781d8f953340fcfe7a19c907ec5a37cbcd0933e218f96fbe404f42b74d863877ea4432076e8736b9e4c503155f21226ea604a3eb93dcf03813465c180a80bf451cada93baa88b1ec92d56deb9e5287f4dea9a27cfcfa747e24485589eef74301e138eb2689150910ee4d05f7b3a6ce608f314521a7f39124a33ea78c04f67e6497a1394a1dc71393ba192738b66d73c751dc7b90c90bb0f732ba583c99ee73e3a46d0f3a5743ce8ce1f9d2087923fb74eddcfcfaeece54d08ea7df7ddf7837a1f8aa65ba51b699ace679d51a8088b0ee67e2116ad99dd5b507708a09bcb2d47859808d140077bbe16caad10cb087bdf6a5ffc68f0172a324bf37507e35f28c40a958822951a4688e554da2a7506825ca983f1fbb47e51cbeb3a9762a8b2c5323a181973e75e547b4a5de39a188eedc050702f47e5568b932123b72814348dd1c1dc8fd6d09a3d4b1d0f7882310c05aea1722ba1dbe39e51ca08fd483cd4088cb68c0e73a0b2d016ff2ca4c0a61f4bf56de878e07d69f0539d677430f6cbad22726bcb6db2f53d82f54d1d0fbaef6f2ef57e2f36903aad965e8a69a6d18deb688896d0291d309ad9b10511b54a0d7461ce39a753972b5af1bd28876296dcdd652a15bb70654b7777774c9990a5fde887612a13b2fcf9328e852dae84b77a4cc5ed6fa87b1f652abedbdce7be884f19712a441cf8a35b618ef6f4a63769c773b7e9ecae9d25ee4b59bd3ec65f1dc7736e32bf892ef43bed3613e47c4bed36bbee8b67842e45a671f2a3a15fbfd297f5bf97825b5af7b794853a6531599992cfe2eee0a62c038848b6f44f5697bbda519582dbc4628b577fcdbff031ce6aad1557f77aad6bfad69fba5722cce00adbbd7e0c196a2975c7eea982febcb1b15635c79063b6fdf0ba26f1f09073afcf6d389a1b32c159b590436ec8a6cf0d9973ce39e7dc369c1e364b55dbbb57b5dd31cdb6cd8fc4c3b65fccdeac26f1b03f9df0bc22e9f03d3f3b3141fa7948ad5ac8611e62f390b8ddf366eaba6a1686c430cbc4d5a61ecf8739894d599b86b9c8a6617662530722cbcfa12842737272ea983d3a5219934d6eb1137d61902dfaa973b848e4b12caa3dbfe955c458fbeed63a8cf5e84cc4528468ea9292f7784a4a3c5ff25a0753e21189be70ce2a44f363b133263dd89671b19b5f6bba393df4e9a454c338678c41fdf2e5f01dc253ad59c89fb6ff49e298ff1261352f7b07a735dbdf8711a52f22af8de93bb5950c5b5cb996cba3976c92218a54392aaaa26a932aa99aa7235c524a29a594f2daeac33c852f0b9039ecfa11488e3c42aa60f57bd410c8f5314ff60b83f4f87acccfc704e5fb205f0436486cf952155b08907bcc930f20877c910f4e3992232caf16b6b852f2a1e3d8e0cecba20edb47981937a5a14a441a2e88369cce24a125fe9be84b7e5b89340e4174f12fd1f803918611d186bfc4aad8e26f899093a0ac799a5b6a9a92dfb40aa74a3e9ac48c4d0eb16ada21db3b08dcd8d75a6594d3bd43e261376b2d7dc20b89d7135c29964a3dba18bf98a831410f3243a9db384d020f218726d547b3991cb57d8f3721b2c4aa95dbec10ab6cb6f6e00491e44cfb6885cd669e64cda681c8dc6f9413227374c64b4ee22165cc0df74e29adb5566badb5f7de7befe530c61863aef3a164791f469cfce1cbf6fce7c31d401fc6acba0f89a8d9520839f42111335bfe96458c3bdd0eca9aa0d36c4f89586d19d2216ded995ab3fd3d219d092d2cbc329d0ee9cd8fba4306e06c4c593295da324db3bdb63251dbfbffa66912b3e4f8db41c50afee88c0d420eb18a8823f98117365649d58e37a490b7fa58858f58820ab63f76612413254d208387cc537c2d61c84c12db7fc59a334408410976885bdcca35b3437c0413a992ce9c369479b2f888097a9ea0f442c6d4b18a93c9889031989ae05422e4296d6ea6a8f19a3a847c7fd6524e490d3308db4b10ec217ac9310e6b8712840efaf575e8d0e428149261cc9e0fd36122cf9fde43c8064a1b88b125d23a1add8c35936987d4a1a3733bd33f9b812d7e5c41691ff20f2e31b0a37fd43f340fdea64fe2a16dfa05e1edf8318a6dda615cc30efd8b30a9e570145244b18439a73baee9c006da31891435b0d6de2b852c749c129d28a6e0a48ee20c9d2a789248810b49a44086cc799ee7e53c05991027751229388144f4a181491442d8a3098a4422139324354e94ec98a446052ba220620409e564c72453209292a40647650506a44041122986b0479a935a8a25ace8cc6e062b3bfe4a6582944ce0d5cd9c12a03e85dff4b0f17b85599a778a3daf18f614129d1259c95ce6dcc65133b503af680fa694ab396776c8796c0d0ec338b6cc98d3c3b5d542fe8186befc1c5e69647c97dc2a7664c724548062bbec9824a6dad48888c22baac23f70b968d06282e5821924b6632222f86e4d6c993103dcf5e9ff5cdd9f53c82a2ff97758c81bce9bc7368f6d1e9bf1fe78e528228e32bd3f9e7194cbfbe396a36e78a7f1fe18c75135de3f5b39cac6fbe9fdb398a350ef2fefafad1c85c3fb6b2d47dd787f2de6281cefafe1382a87f7df568e02c0fb6f2d47e9f0fe7144bf1034bd44588cc51a9c30e648955c4922a164b54c3e94ae50c262b286f4a1bc9138533557e124a23f9cac70b65a7c385de184cdd8ac81f1e1bc9938332774958c0f7d153a1167d910e2558857db5f07ed00d09e839e38f4bca1270e7abe686983d2f2a46dd4a071838b49632fc99fa1fde525f936b4b0c888510261dcb890bfd2e2d32c162939a4153a665202cadae36026f0ea6d628f7557c82156ed2bc5f649e211c226ad71cbef6cf2ec74649baa62cb8c6bd8218987fab47edc7887241ee8d7cfbfb8fd2586cedc842964ff2d3aaa3e6c47bc3769f7e69cd4756f94ab9ce52e02e8dfd56ba5d578c96db2fd39852ca3c53a2ce450eb6cf26ab55aad56ab4e8d3fc6398f46ff2068f24ecdceb6b7f260f1c6ddfedd15b27fe8adb67f2ccb38aad6b8432d06826dff54ec260eb20cc908f19a06e4eb9a272748d47d79a946e298321e062e6cff2851b10adbffbef0fcbe578d09fac7624b4d0d14544326cac426be92705fdbc673648eb8b9af0bbb48ee116ca817248e786339683d7181c832536badb531c7acdaabc0f1925fd7be8937e667350455550191f1462917a9274e909ba094734e3c3f7637b6dcd01b9fc29f12a1494c54c94c7c19618a1a21a21d3a4e8c21550195b3669e427c1d0afbc61b7409325bc260c695b0e3870e0568da355e72704ed2d871889c213f74d12b999682084a221e9c6110c1383341d9e1fc1d0633f3e4ac972b70da5fb1c5a481d98f520045134886481c4e8538c3951041074204a715b69b606794fd70f44d4490e5f196db80be1dc9abf2266288353df3748d88a00de2e91e11c1795b904377a96ae84570d7fbc7e82e2fcd3fddeb8108cebfee52cd938ca007e2897e2e77ed193533c493172182397e8423d4efb62c0b32fd1cf6c9ecd822a6de0c67730e38a103499c400227c0806e60342331141394ee301ab7a5bcd9df4d6e96eece718c373bbe4df62272c67caf3187f882c523781189c38fc819f35b5018d5c82c478aecd9f2d28c1fc3231207fd40eb037bfe91d1c83d88b886ba6d42d05f7d74668212075c88e57d9486b27c6fd53be2833d9fa31e28c445c71af4d257f790942618678fdbae96e18e0a58a29d87934f6b3cdfa6691a109cbba37ba8c0f6fc5aedbedafdecfe76ef959956adad52bed4ecb52f4bff5e2a89ace46a75adef1a2953cad980447d3558c8da231877f4b30ea67ed6ed981d0ccd0e5e9a0f036d1890b9d6c1bcb65dab69f086ffea17d33669d7badb2f8938d248f611473924f372afcbc1722be27030ce3fe438d7dc8b4332c1b9822c5dbe3824012a2c652668ff7e4026681fbf708c0c55516347219c610699474e97d25fd29fa793b582114ba062cb978e638b9c61f880183cee15d1e716fd5d300e3b02018c2dfebf324f76ef80428908c64da16022ce88dbca1d8b81f42420104a91fd73b84320446986c23571048bf9155f466196493c9da7196b258b3b491bc4936c71fe85999ca949b8a40de249f22082d337a783089132d3c67c1ec493bfc77b27c6416689fb800421370dfe6c12d97fd3a83665d434cdb3cef6eebf6957cecc531292853b988c627c3f120f3502a14d3b8cafad1203581a91a50880641118215fd6b5266c177b290ec9f2b3ccc00dec0dec0dec0d6a13d4dd9dda18d825a449ce1edc5a83708c7fab364e345c6e90c152c3548ae1e2b6b480f102d73a51eebdf766f76a4cabcd9ebf9dc058b959b16985797564c27111cc568484e7965ccf05b4a9a9068b8c528cfa7d3e1fc8058c17a1d08a96a91bf08a8e294b030deb8f0d1ad5869414951b5c4c355864946298686dc2c2058c17ff27ce8b8188a0fce8bb90640d09795ef6946c9e9b5d2d6f6a83462591b61b5c4c35586494625018590605bed9d5bc4d6bb0c828c5a82b569cb8780123cb6e76b5cea6271b346ad795dce062aac122a31443247a13900b34e3795eccab9936bcd8e8513e763d78312f8687d4d02b4f43cf78acbb4d59649462d4cf07e4e2058c5028dfa04d622eda0466d226ad15c7ad6e9156c6badacc0c50cb2326685b97db54d3d8f0a518d5068f677301e305c7c9b8c136d000b9586f39e6262d57a763c2cad9aeda07a9eb115b008a0f0d406100d678b780b5b8bba2ec9797014cf0b6e8fb2d34f82ff4ca636d37ad30607cec60c0cf84b5720de01b5fcce2625d376591518a51bbaee3a2058c171689959f7f82136fe09f7f029a01cde00b43af7c0c0d3ed674d316a5cab1f67c172f386ee533615df0c6ab514db3f2305e68106be5bd97bfb097ec0c56ee9d576e275c0b7debb53120a174f0a35c941dbbfad1097efa59a8a4a0904e568c4c442521d0c793bd4ec76d5a369dc6a474703001102e835c801d6a3cddc70790e3f561014d39b20339399dae83b1462c86d9fb49195bc4643443398f56486ec549b44d641a6d0c3a501254ee1f76b955c2470f1fb68e013b642a6b98740e2f3208eef68b3cf0b6d52d135609ab84659594948826ca682412894c642853930ea6babbfb28d2ea9626637ce4b5b16b09ec1a6ddcd6f918d96cf6c7b246a620b59a57a5448e1f5e9516bb732e614b91b02541963525ebd32991d8a2a38cd88f3e68bd800d5c2975f74add35775a2bb596d22271524a6dc6e998bada078d36a8b595d254175fba84319b525a2ba5d4da5aebcb989628bcf3bebdfbcb29715cfcaed59f35ff46e3dc5ebd9b8ea98eab97c33605397ea8c1b69c7ac696fab683b99b735df65b66af96616b449eb65efb73ce5b6d1419023167df97524220e66c4a31edecfa49d54d8e5ca671822e862d521a411a699514d8483ab69c312e539ecf8fa03f75ea953e926d5ecd59bae1c8d50e606e645f5eaa0464a4d2cabaeb8fba4927436ca1b64ef71268c409fce3cae6ee3739fea3c0461baaeeee550b412dbdb672b3cbb2917bb59c6b1ec6d08e079ccd2cfb4137f63bb55935f0dbeb4b2f74fcc959864de277eab2568a5f6ace75fd91b594aecc927fef7482b2de6b23c06dca79753783fdcdfea842a6ba3f0f7adfa7574bddbdd6b79652fa72c7d0247973fc45c41435e2ef7f7ff0b77f67c7c3dfea0e2bfbfbc7e1094e0e643b6514706bd318733ef9851491454f1f88a3ee5b596740a20fe76cbfd10888639cb34bd6d6992005e27bc0775ea621033991b019932922e9fb27dafe0a9dfd68fb90d65ea4bb9f9afbd8c5d44968ca978401c95f8fceb743b440c821fe681afc53bf789d4e87dc15882d7403892df42517f2f43a2fbb20485e4702f93b8e32e2c9febe104cf2be1ea08ffbf3f91ba94fff659e3c4f3f871cf186f7f477bcf179fa914a7e7e4c2a0437fd4825fe3e6e1023f30b82df7e902c34e52801a0fa14e8c348844d3f2575003dfded6ad15b1d7a69933100649e6694486c2a45b0e94b2336dd54b668e67b9ac63fcfff80b42a937ab82f7a1ff7455f1023255ff2f9b01ffa824c908ea9aaa5ec483d7cca5da994d1e873f43b0a24cb38e66049c48ca944e09869bb2bb88d0dea7eac2bee276349becdb2fac90f3ddf17facd3ee226b64c96dbd816649967c5c42cc81ec5a643ae018a2c3ffacb1de3f23d535c39d7a418e55bce3589d4c3a57f3fbb81ba5daff11af973fa4ce6997cc116574293d89e9dce670dcab22c3b0941317d73c0903b6fdf2b3241afe5b1603904c53a1fb54ddb345087abd9bc989726281603c562a098976627ebfc5de767fe42af62cf979d0caa79cfeb7c20f921a8d312a05c8dd73814b88a1c50cc24e64deb831d714f184c46c6e562b15c2e1919eb02eb02160b07c7e582c172ce39e79c73b62e9052c70c44b1f81167bf69fab6c090b5b744c89b739e900966efc9d09833c14cfbdc7470e629dc543bfbec351da720bb1eb2d4e7c64bd9579c6c3ffcdcecac7e27c7511d18919d75be4e8e9732ad93a37db7354195a3bacfb8cf6e6b675f67893cbfe3324f6682b3534527a7b5a2735844316d52346c92ce24647ffa3358885826c1597298a03f7dcd7e187263eeefd7c9013b58c6d9e940e7c28bb36376bdd9d354e325fb6496784bb7912fbf08b8cdb61f0be81365cadff33fb6665ad8e2cafc98f8917af0afefc3bf7e8c9f8ffaf30b523f520ce2f56352d6a423f6528e315293f4cde4a5b849999276bee36f0823243bc4fcfa91eccb1cf8afc9bf69a59439ecfdc298ed9ba4a55fec31ba9546d3348d6a59f87235ab554d736dc61b1a8d6bb8577b70641d6532f1a0c6c5719a94806d5c35994c9ca7db346ed3582e223852e2e49c475ac61b38a3fc440e7d4177bb7e746583155de5d008070797618bf186450929e225d5d12f02a7eefbbcd75a0bec59eb0536a541f6f4e8e23ea38bbb8bd3f985163dea68345a31b2476c12370e7398c50e93f10736e8410f78a0831a38a5354c2fb45a5ff96701c1cbcd50ae98c3f5996071c001ab75306e4980abd78ec5f4f2f282c38bad1d8fa3f10baf21aa0006b0039003871b291d502fa7951b9e3e0a0e538da791422b0c966bb87875e4ca56e4b9259f0068171d52377040bd541b56acb0e1e444baa1060d1494890273d13295c3c5d55ab98ebc5c2d01689395892a07102c816e40362018e80572815aa01910eb6b69f962e42bc8c8329e8d77c3c2c2320010abc577ae1c8ebc525c2d97c9e6d24abd128fe70312094093647260c0e06a62449a5861add8a49852377040bdd4951517a71737d0a891651376c4e572b55cae23af1457cb65d2364832395b9fe0743a2c72044087d40d1c502f4d3ceb75a8c80782815a9a3635988d776363d3c2b3b1b1e16ab952dae5b706c00d1c502f75c58a9313e9061a355050504a7268139b0068931a1db4c98b888a0a9123af1457cb05001bae96cbe5ca218724135b723031f9aeeb7068e5e012425262031389442e93b661c364d2366ce0d0f76be84e0a6b5b5d4020971b38a05e6aa7e39df20d268fe76bd07001b55aae4cc6e56ad5d02effa26d805a287d92d31a1d996084c2e63eecdcd474ddec602e9f89cb65c3d572b95a2e2d972cbbc1d572b55c2d978be988cb653ae272998eb85c2d2c32629440182f5cacb4f8f4b3504941219dac1899884a42a08f277b9d8edb5e33460ec0133a9855b85c2e1fd460664ee42007395841862fbe9607394e105f2aa5dd419dce034aa9bbf44aed0e6cbd8eb1c7c0e56ba817d75b2fc6f2e3ad808d2df5adfc420b6c3aa38dfaf2644f22ea75db0277b744727c9982263ebe741c03f76b7f0a21c96c67a9953a68aa385e60802f5e27b1588b6f8a2b639e345841968af77dd011a015480592f18a782d957f99a70bc3114ff789087a68e2f298a3ae9f4c314549a77c0b165acb637969b3a971711c2743d72f69fa2bfadfc5ddab152b56b8f541965f5fe5e95718951806b81b03791d63a987993251d1c063591de355b4dd71a2369897fc0830b4c9ca44555222c2b9f95eb10de6281390c7fae0c41b29a3af5d0f32a62546b5d65e7c6b0de56cefbd38c3f55534dd30b42807e789eca989a95a743bc22cf9066b2205b4c13658cac518675a66b992a6afa27db7c05a7b2c9013b3e438cb326dd380c8210873a5b9fd412dcaf1923f0c2d7aa14537b1c5ff3e81e29d0b0d8aad68100c24035279c941ad58cc6399b8b4367999b89af07f7f514ebcc1a2071397892bd3b898e9e7b926e899d7c21f3b8f3541ef1290a5fe03b552a0c2424525488a8e115401b53c968eb941ad16eea87c8a4a4a0e47d1a16fd2178ab6b0428720221e0b1403e598183105c846040613d70603d5806e3c273c96c7da208bc9254966c7163266454a0dca44b1484b039b0db298cc1005b0a1aecb1b5c2904a54e21e03730f2d391bdec3d9d27f99bd7e5ec795be57270e39d20eeee3def3caf8bb1052664804b4bdc8a08b7b9d50f32cd2af1f1d77cdbb61aca79e3388e72ce755de765bb44c7ad3a9d8e9789d0643a4127f21d4cc47bcff3b2d7c1789f5d2277f27bd9bbfeb7e301bfd04989843c80dddd91e0f5a3f607947aa4e2c78f1f3f7efcd05eda4b7b692feda5bdb497f6faa1bdb497f6d25eda4b7b69af1fda4b7b692feda5bdb4d70feda5bdb497f6d25e3fb497f6d25edaeb87f6d25edaeb87f6d25edaabe21762b4e510d8da1b63b0944f505143458c8a17154e442a92a83b26a162057b3e47c56ab660870476ecd8416394524ac971a91d7565858e4609b036e74ae9be3b76eca861786dfba84c0797f4e3d31e1207fd7cc819f6ed09e9e71259aeb4c792824a3e9f54e18c7e61ce9a9629a9b21a4c8fd14717a2fad427f37a5f483ea1d45efb80095a99862c5572e52895b7f65ba18d85febc8af67c8ade1e456b1fd22fd2dee3fb9f63b2d031a5a2632a24da8038ca7e286580382aa6ac4cfd18403f1f485aee131df7c4ff7905b8bb47eca5bc3d10479152167f7efb8600fd07f49fcf0f51f2f823d198a21ffd5eb28fb595aa6d576879446cb19f7594334289826dff4a247c481cf203518620b6d80f63138c882dd66e94235dcf67cf7fb4ea539fcfab3ee5f95b02fa4c3fd3cf4626a08d9c7c7e7b219ed79e7ea4fbf528f948f4f1c7a4401f897e3e3e8fbf2046e8879e7e3e3c0f7ad0c7a4a44d1681545926b675c1b648dcd07c532173c6646464645243d8b28321f5f079fc0af090e86b12fd483de02f7905643f7afc25259fe9d19374c84d0a426efa72cf1d3393c7a21f69d22dd1a4fb3185ab89c8d583b45fe58a32b1630743ea8131fe20d96f5f105c3f76a41e259f80982af98218f1a13de8435f90cf6faf00f9840ea04881be209ed73ec7bc7aee5983ad80ece7e31fc23f7b05e0f77c43ccc75bce303dae7db9f292b5d65afb92019f25a8842c99ca7ad4211a0104008000e315000020100a874422914814e78aa07514000f7598526e561f09b42c466114851032841840080006104204666666c8009acc26c4e996820fd3959399ba97f835398b344c1b88cd4ae3fcebb59a654cd4c37b1b45e2653186a649ccf7a3ca48cfe8e99fea1a7f1d9c35aadddf46582cc8c0c2abc2fc4655ceb67b0ace16f9b763fa6f82e13b4b670581addb56f8774d27d8c1a3b5f7a40361c5309b4b235a8dbedcdd2ac025c31081145cee4f993011ae634dc477204ad024ef38dca93a6cc133d99fa2d7e86a07c56f3955e4dba82c957aab4f01092192a9aedeb61458c09d328540d145edc8bbc9c6b4b8e5cbea1037e5ba0dd21332a8e1118c791137d164ed0eb9673e1c41783b07b9a7de87bfa35d537aec9abcd94a0cfcd8abad406d9ed7ce7148e47aeb47dabcf7710fff48283bebb7025dcdd6d019b4023eb10c8f769badc5d21cfca88bf48dcdfa0130067f03e10966682bd5af692027e8bb15f320845276943a5ff2c2ca2de6447ce74905b3ad436185f7acb3b3c6d46f80b5eda0cc7f0afbb4555340c439602100deeab2aa8e88d7fdfe30276156b6faf5c01234e98ff145e7e84227960de0f2180f60e63d7a63f26ee8ee0316e9861fcbea582c547c8e404042de8c0b5f4d4520bb3ca0951ce3d317c426e1bdc41bf0cac22165d8087538d4f2c6371fa09669ef658c9713eb3c392c2cdb10d2d3d1bd182f362610fe319e515e0f4048fb8f32b4bc623cf1eb402b21f1491e797c07ca8813e3ebf17809f3f1de43deff2a56c4479db394b0e375960c387c6cf1dbf81c30af78a39f0fc97e855b4136765c0cbd9a06c4f9ad72bd527ebd129a35400e0d9068a95f861f696af070732018ca2eb45e248b19a7f16260b4115903c45d684c5d74bbadbf391dfa33b206dd06bfe39495045739d9d54e31aab7766829411bb1117f55a6c1ba6a5daac673160490c9f8bb15349a2cdcf893da794116608d14b7dddc02b61a212ae53e18684ed2fd658af32103081ecb480fe44efcb523e9193cccd93a5274c69bdd5f52ebfa61a48554d8457883e515938eb4b209223d48e0cd3bd7223ca7cd6fab10d24a731f3c2d59a336cfe7887db657d16e35fab2082f1c5bf0e362ba6bedf59f2a703f6e28c2270938e41c58b7d4920708594bcf306b065a08743a58d6cd9c184576cc11e1150b026905889eb53ca11d6e966afe7b46fa755f7203827c5f62e3d6180bff15d77fd43f1fd51d59c5f5900586e4d958a7f774d40a2defd04ea26883f9000259623acb82910de5c5c475751382995ba087f800c64c249acb85eb0172962810485caf8fc147b49f2434dd770a18ff20bb5ee455eed875ee1b451fbacca001e2cbd8f5b2791cbce270df8a5d174f3f1c2162d7f17fedcdc3e7dbb0ebcc232decedb31caf2cecba3d8bcef1abea8b4f6f49630d4b8b003518ec3aab1c9be2805defc83ee99badef03c774ad1d81c7b00308500359e5f87f5d8f2451b44295887eaa401c5ccfa8dfd5c428fac40e136c61c1be2ed0aa238d081188e36f58421fa522427401c021b6b0f0e31cf24024076be58aa8ec9aa33cbe6adc773f2cab1a7f64d7e08293fe2a5d928b7858a924fd2ab367ce6a256e3153c04dac06e4a7417a3cef7b58ad07d0bcab9fce3c2c8aafb3f9075ebf8db85cb4cdfea2d7c14a58d823873783f71d465d70fbe912f39d5acc45341b3a04e29e683b1faac747772f60823ab50be1c559139f992c1c00b7d91b7356bb3a47de6376c3a73e7d833319060da0070b0e86c73e2a574e2bc9b917c0bee55529e62e6d9addf0a7703b44ac3cc010633f886e73ae62001076d3993614cd019d2c97817850cf85b1517ea203d541df8de68beae83194521067e978c4db7a1ac678bdc0de652946d849442f58b8e8587949bd6ab2b9e71cf5365223aef206d0af30efe10764a8c627e916f13496311db7d8b8ae0a16cec041be099c22bd01ffc0cdbc15c8ed41bc8bae5ed841612bac2d83858fff18054a1cb4e07f65053741152ce43fd08ed60bbbaa06eefd26dc2bfa4a856afcc7a964eb33b2803f02f95ca85416d29c64093e712af7d18ed413b7c40052958542d31fb2eab79d6deaaed3020d3273b9c696102c383d3286a23d357f7dc1e16ba8a0049bd49df7275c0959c3a730b0fc2048a4ee8cf972d089c69a61db848821693a346cdb9e9484cbff7e18e074db6774425f2b0e431fe39201822441289ff8d711bfb09d887b1fe870d972a72449187bf424a0ef57206f316518eedfe96333343eba97c17a35132193964b7c172145f6a4a84cf62cf18d8373424065a80e6ad8577048c068dab2edce4c58020f9eadfb38a10b45ded571fa0aec201e49af5df9198600c67d39944c5f81003c18829a0c74e3db76fde5f770bd123839118078a048db3c1a07855108a624064ad55cae0da6eea8ed802674efe2cae345fb68b0fa215476d372102acb4de539f9261bc52c959474cf1d0e161f004d21dc60203ba1c15fe884d3317c85b4e15412b739f9a3f3601171e271c4a568181ca88458c2d2b4593200126f3f299fc307e72b64f51ddd8ce0cf993764a8be09fd972a82562f1b2911e5aef01f03a808c4f3a6e3fda6aed77fafe94a82aae1d99c04396f059e88ef024cfe19bd73dfb135417a7b86c836e2ef4090e361085b9e507c06a2fcfbb53ca920ebce8f1105c63f18ffd181a60c14ac1902534af65f81a784ec656e2de7b6d947b869b22af54ed8a0a41f28f16acf3179ad7f8f24ef75d46a49d672375de463c133745b16f24602b1904e39ba8038e0477726588689eebe2decb8dbb77027841d587c4a5b2db728553700303467dfb3d0e6c21414347040bd24254aa433242df60494cea32264cfdf4b0ceb9807c3f4bb51ad96937d71b709d62bd9d8eab05991602760c235f35fc28dd68027fc53cbbfd0134a7b4614ed620101150a44544cc93aff51d3a0ee95276f51b08fb7441727b31d64f22157ddb0efec48b5e3ccd7a56c8e6dc425dce4d4c37179d96ab57c439f30e9cf8070dafa1cb08a001059ed048e58634eb21573b3fcffd60803519815d2343fdb9990e809ae05426d0bef7be165b60b24b0309ccf91d227eff47fe06d51a1540f504f33df59df584eb39c7f56aecf50127099aca2495d354be28aebfef3bdd71df925015d3c2bc929e0fb17d3f2d22d497f401b3e974d2523c84062247e2503f969b619d4ecb5f1c475e8fe17c3a81b18baf4c2b80a85e153e058a54bc2737bbbf27432bcc448e662e7271ddb0c2bf66a2e047147eae575e5b7e30bc6d216a5bc24080d5b3323d3fa053393d669f4450194f8f62ab6399ea7060baa1c09f2e7f2664131f5aa0f202be0ed0036e29df0a214a96318912bebaa49ded05ed7e250c9a9cca7baae3611c77bd8d8ae7167a2cbcdb1ae39ddd1f8588b1ca4eb09ac4b419351e346d2c5851400fb99239a2edf32b93a78d11e46e0891336841ec70b4cfbe961d11f209dcd629548c883c876bcf83da81047db1e7e315ba53be13d088b77cfb4e47c9b2ed7f439da3ad16ed28acef06f590884f56b6e246abb18ce3a4246569cbb57935a02dea43ff864128b19687c89ca123240d5c78d6ed1e33af3f7e4d2983fc8a423bcc2c02c7764ffa1e0e378f5c76fcaa204cf9859c67e7c8a69a31741231c20ebab0c75d69ac4131b572d5b915d7d9edaebf542295b873a7c428d9aa0468083a94a30b6746ff582d4790e41b7389b958854972b94c0871814d9a25dc9f03a65482c88e7d4e53c3faa495bfcac3f3abe0e144017cb6f6a105f7ba2bb8df30b4ef5e5b2e2a287d91393bce0c0e5865d659b06f3747d1923ab709b9207a37a805fe8035fbd0b8eef21bc902441bce6a6575bb78aea6f839330daa4dd446da7f0c4d2be98b053b1f2189282ec7dcd39fea1ff4923239f01054091e9a8841b34e4295053129c99fccb2d3c3bd218145e882601b8fc72c10ef6804c3e3c9c0502094b85225550666921a17b1c80a623faf267d1d14ef426bf59eed04f7386d27fc63dbe7cdebf9cd468400b7cf93951f524da1b63761e4d9ef24f7c8ff92fa3d3cbab9500258749e73c58087a393681859bbdc51c534c592a70bcba620211c8eea5f9122b13c6d8d6ddef0271c32469d1857001c4be975fb0563d3b848b647ba45f4c744025f7c3e4c471204262c1647c65682b92f3f04f24228b01d13c0173d93b0c9821eb8e3be3a18664353be292c3aa5ece8ff69c2f6ff65ab24e97de7a51454463c314c628d4f0fea827931c9490102a7183f972f3790d292b3382b017be9c66dfc39f83eecb6a66f7722b7bc51d72609c1eef21dffaf2ec366e6e33e467733edf98538e27aa99335f6e54ef0115b90ccc117cb9b55df9e97bb9fa53a062ddcbd7c19019cf1c6ef354e9ea6a8d666a2bcb1861966f633d656c50c643d1a65321a0507df65e80734668345701e08217034b168b367d4c2f0f541fca658f18502fb78f5778aee94865ecee6019a23f93082119e20e5ab27e7073c47c1fd73f2c5bcea941139f124d11c994c44301836b17d93971ff7d304e24a02048cf5de76515cecbf93232edccd05f0be0a4a98a5108f48c67db7561d891a6fcadf5f2419529a7b6ad4cd041302fb7c7412df9a0d2de0de17e89b75fdf27c8ddd83d1679390c7172d3c20e2e2eaac44c7719e8767e1c1f121df38f4268d4bb7c8343df113acd692bd24f8eb6cbf3f8b11b6612d603da5dd66bfaa90a7a1c890a6617c605438a0a4c5714315333ce49e6f233ed1ea42f526b3e033009b82eb87e01a270562eb7d3d3ecd9210670dbbfcca677547bbf6d623978374f2bcccd41a13b25e6cbc9f513c0dade761b31349eddd68af138e9d029a80e546bf1727edb2352b31b366233bc7b375bb00aab1dda956ddb0f9bd8249edd8dea189dcd0e024e367ac7b5fb0aab98509516bf6bdbf64bb3d882c68c5acfbaf7c3d1f904c44a1310a3b6ed9b9828c25b537cc39e54a47888a5946ed4a2aa8038c0890d3810d81dde1a681e91156b18a3bc77838cf97dda5a21cfac6ca4d666ed8f822fef8a968c3e91247371c4ae3f71e0c80c61ded7c13551642c3b539c35a32ef0e1e0c8e45623fd551a995de1c6510f93ebe67ea3409c3d7d84f5a2ff51460ea8bc4168cde0e4ade942f2d929ec236f21a060f47e6dbb96cd200da8ddaed23e41e6ac26204edbd3dea8f3a24234cdd0d724b0c4cd895ba38a50075eddbb41dc666a4c92c6531120f6ea70c3e39979d3bf6adc8041a120a20c63405c5739a2adc745e708d302f32e74fca23744d8eef24eb4034a8948897544c4ab7769c19d180cf2b2fe73c22ca260829513fa883f8f043cff0a6c6a1fd483d444df096bc7b8619068e148b2611be01b37b769e51d7f3ebf91e067c16440dfdb159cda2ea16ba3e690f038b128379dd0d94ee5e26dd364c9eb9c7090651903e364cecd6e7c945b55c0407cbff9a91308b7c313e4d2001d27749b00b674e1511be81869792f11331be746da89bc1e176558c7e38e35c95a0bbcf3085bcd6d709a057179e5f1178fc76eee0ed7dbf1d115e458f143db0190cfe160f41228064a34e94dbc097a588cdd3b9f8d7e578cd576099d566878c1f011f27028f1056c88cebde3b9be088fe82382c2d379894892e793ec5542426abedc089fd2e3e94d56f6bf1b70a93eb2536273f3eb0a8f9822e7e142fd0635ec86fbb5f87555ed7b1e3487af6319d9a1e2e37b40745341932d5a7e82f95667331fefa57734b0835c3d0be4f9fdab2bb8952e5b5ca9df674881ed3c084c6de5a53dd2b0553fe8120e131fe35da8109efb661b9d76549f267f24f4fdf4f830c4d27dbeaf2c0c4ad2a443536c7a1e8c390a72aa281888c8b79290f4a1b66d05da0ebcdbc280a63464c51e03f8e1d5c274f6b51025bbff3ebc48fcc3f8af16730fbf8218418b14838a9b0c301e6dd571fbd0390988966f4996d80494251c5912e33aa3b699e1e937c338763ebdc56a9468efd2f7033e5bf7104967028e7327c67f5372add2e932c691ff1ffaf8cf9cfb805e51a2c23895f0fdf6b6bce6c7617fc1790b9cb583204cf45ed22dccc70cc05d858cbe077bec3771077d508144ce94606ae10f51892140082dd8c4c7104f9de10e4420de53fb72898ffe202f302c43c2a541c3d8cf1a80190840c2898f0d7a69234bb310b10434f0cf753cb50cd0532d44fd0c61156c1243c6ef355a3ec34fc60386c6334409b863cda13940143bd105e2c1781d0606bb5a28dd9a216bc4cd060c3d55ef3b1701e68f33ecfa3f02f75579038626ca32ec4f2b179c968840654c1cee51d9f46e80679c7fee13524c6fbbb791a813aa2868afb882884360cb222440a544c022f192b195669178475a1d45f1da20a197f2ef12569065c7daae43cc742a4c91a2322e6a71d9a814ca8baaf00b2d5815f747bd81fb36cc951cb3fad825f048b2532d018cc7877f474a432ca6b15657cc5863fff9bb8267ff2378933f5b90cf861286e3af5f984da7003e57f528db59e34cb5d7d3ccd01c3c81a0f3a63d3e57bd474db7f8695b8bcf2c98bb462c41d8c765197fb1aa527acf1db16179d81260c829690a1c8d294a40e9b36d70684cc5c0a40375ec8f05499138d2e01e901b4fe5dafee7d295b428d7b0c5fb83e3e9be0df0d65d015ee0e2c90cc7d226e7183ef9dce04dc5506663727ea4294fcdbcf2d6ed83b2455beff0c1c94d8dd7fb61f7c65dbc25618587b76b616820baefa02a9c820bb5fb4d692cf37cf13758fcb1fcaa06eefe96959d0b137b9d3e786bb66056939cb4b616af0b737ab843db58b8050c1b2c9eb4e91558a74b6cd0cbb78ec182b518b0ff21dc299106ebc3b7cabe934d056ad57704df1e3cb8ec43b90c916783a654477d38078ccf94c8086e0d3eb72e3c04ae904c59424670192f8e88b6d8b590c7e04f45c190c735a5e966488657cd9a0e2d08c9ede70f2f50cc1305be0365e418814b6bbb81bb37613b750290959eb3dcd9ad26889340a7b6bceca187bfbc47e8856ccf13a16d5f810881b7446e4b08bd6eb35998f10f0e18bb709571cdc777465b503b4b57b08817ba176ac962056aee12dd1b609ea0f81fd5c23a1d02370a07bf6034cb5530b317ea1782cd021574fc12ba26b5044295fa328af54c014767cb6d32da49cda25a19b94123bfc425455b206167c55c8c52c8c5f1b5dc82912c97c1cc5fa88f02ae40ae861c5eecfa80160d5a4e93d14eea4f6b060ec51ffe5e55c7bd36e5a56f7aa403bd15e8d50b837b62f284be682f4eb991abf2879b814f4960668d9ea7eb6bf2aaf2c19e6ffd76ec7784b483f8e2de13438f81fc323e8165f28536112e79b50ee9d460eea6e78d3ac61bcbc55409adcda0a70605df6086d36cd8b69e0fa73aed8652df1174a341f5c6f825335b4f6d2c19112f1f4c0c05eb31cabb9859658f983e84bfe666b3b135c7055e768c7f9a706967006733b66ac3e0a6ee2b0d267ddd0fbd203bc6b3c57859b561be294750d7acb4be63bc7561e28cdd7b63bc748e258b36c1ecc150b71133c61f0509f697d2eb1c0d17501d8e1bb09bac8a33309004350a40e32841c5f8f3aa6231f1eb1e23b3000a776a6f58f6e57e7f15e3d3e0b448ea990ee71b32ca92a83dcb6c435728e322779d53c578725cdcb089f135fe123fd0fa8e0343628c4fddf421c69fddb4e0079a63eead24b1a4d61fb27e1f74b8b036fe60b8572021c627d22dfdfb9f99cf3e2d3bcda9de6be4066ed9b0d5fdbea9d80ee3dbe3c92296b710dd29ed873b298226e445e083fc7f0488fe26a5b092bd3296e05b72018b4b36657dd84bfe47d45061980fc613ac61a10e48f955a3ad9cd07588f39a2bdba6cef9f5999aea55b5f7ca2ad5fe5de5889183ea549237ebd993690b0e03fa8d1308d30f580d634fce923e82696a591b07e58b47435aa9fb4b0834c83282bcb728ff206e870a03a4b17957301e830dc1c2570b92047e5c9dff452ea9c4277d2a4052c2e03699c0562d1658a07670a822a074e2369d70b55989f0da00f6c03e030892019310e3ca1e1af9fe7942f95a441cf600e3d54548b00d8318c167adee05dc5b58393b167cf72e5e273a5e4c39b784a358586e5a34bd7a1395daa47ecdb087d37fa997da2874a4a7be7b54f8c5a77cf4abe54c83d526327d953e9b9b7b8d8ef05e7c95cbd485267435d78bb7b98c28bfd2a3c4d86d727ec7f0ce1b9b1ca69fce5e486dc1db494c38a9ff0405e1a34c4aae7c069ed177f166ecd0f62dc2855e1fdbc55378e4a1a30504934680de0c159a4104344b13288bb463be37b970dba050e673f1ff34a8d7febc51f360172934aa6a2c17ff5ccd76643bc951061051c11bc9b654bf9c894e1d4b0b28a4dbc713dfcddcfdb403b7f86ad2c061eb1cedae5183e900ce2b6edbf1ea9d2d5e3c061f718fb5f5f78705266f5bd1508540fb7df3d82684a0480a695681ac16b8169fe3c3e195267aee498a80ac4786e3b02c62da65c94816247e996999e635f7d89adf923b156d2e29d5e22dcd42cf622bf46e971aae806ca6c52baca9a1c534ba4e53b2d7b4784bb08ff6cbf0c976e87a5b60e3bc64492f86a556361c715faec2039c32f1a6413693442f4c97a71291552e8cfab7b3927063f119728b27050e8b865d13314e69a48f431068f8cee2abfbc3ab4c5ac056635f7862f17a168b6f842d9c3b13f20b8b4704a4a0dc7468b8abea76e464ec2b9e01b44285bce287cc2af23070887855648781e16539add2bae2c737414be3c7fca3c291e26d2e1557bc20ab6dc57f3aca4d0bc216489686a0de48160e99b269278822b57b78faab70e2fccfba8a7f841a7e78b38a57729ad389157a7f606238e44123ab933a2aab31d852a557913cc59312bd5f5e21c7c9a07ce2ad80131c80ecbb8512267637c5cb7f7ab30b8b9a5c5b40acbad9344a1b9889b6e70ee08a9ad109a4874cf1a91ac1923b34fe7a2fe3e7420764ca1072995eb3b23f4c14746762a9507cf731b2ea12cf8344bcc04f6e468a6d54a47841bd7d9b2066fc8fe6a3f8a6f3b2faf00eabd42e20a142441c9c44f1e46b186d12d6f661b9b052325a3d0252fbcd27fe1c6cbbbbac61514ffc2741af5f3cf1625c67805b69279e5b61c0a6e463c78d1152359c5ce36b61602ebd675b3aa4e0324c36bf7238f12fc8f85595ddc4173619773c2782135fd79b9bfde911dac0356e32937c726a52fa6e980138e4644833f1149f88f4d984782520a566d1fe71a52712e35fba28c2addc0833bfc1c80d30f156fc0cff092d034b127d4095714503c4c17dc9e123323f5f0d869fbb3d404bbc560a2b7e8c25635a5d421977c68fa1681e4f9e0c84d92f307a6098710530ebccce6f6c9e7f064bd207e091cbeceb6bf7f14fc2432ce2389297385b89071fc6ef58da64ce6c7343e45d756357dc4900368c3fe7631004e0c127346937ccfd3952958e19109f1aec60ce201937541d49779dd6b383aafb5dad0c27fef0b1a11312e2e8fdc41473df016ea70d0631978e0ae11345034b298a2ae6492d07bbcb81f339db4bbcd62b38396b09cb1cc80e8da3774035d336a0df30149c310608ff120bcf7017889b6df5e04203548c8c9614c523760a904b42c32775463e345aa856eabecd2ff4e4012e09ddd42c767771b77c1c04e6ae6e053cc48716082e28d59afa642f065c12a28855291e4fdf24191db16b6a2090ba439d3df4b9ff108e97d6dc715cc2a31290934adb0a4e9bb85bf48770d5f5e49665d08fe6409823a9539857efdb603e8e00c125b354ab1809c6762c643f042be07c64ab9b4002a6d0092114325a7ea81c4f794c79526ca470adb42731aeca0fa16be4baa60a7d0f0cfa0f24cebaf119f0433084de5c1e9f1e45e5c52a072e01be635fb88b7c672e6f73b0063405b041e6c9e06654683079002ac103c3e431fa2c4be5a59390f2a23397d3be8ca3f59683f71acf2ea3780968c3a6e8bf7bd6c5deb5ea0d7ebf945ec099cb9a72364bb31a34a9e324a337500de3db197bba7e91dd33934eb99137033d6bd1cb99cb029b621024b0daccb92da60203246de6729f0a0e43472b9fd904e597ed14582b542397212dcac55b40ce06bf46d9899bacfffc2301fae8e5fddeeea61eede4d08b67d9170d255fb0e3dc5a674992d3d3cf93269799699a05466e4e6bcd6dcb99425dc6a26f00cb1360764aaa904278c725a44d9cc8d0e5da5aa1fc832e63587ebdfc739900f16863f9de67ba8d7af067ed64f19f0fba97ec02c9c7898d0d0f34afd1092c350a47457aa416d34eebc98b43ed07df3817c5a797f3f6e4aa88d974deed77f564edfd963ad367acf1988006eceb79c390b1104c1d588083ab9ebc21fdd981d7e4e8c96ccb7b97b4f7cab5bf276f70093d42d6381dbf5ea415c8024f7a12ddaaa4c168fbad074294481efae0b58a43907795af172a77f406c8a9c282faeed06c161ad5d9847af7d4488b3587eefa933fedc25a76f3eb2d0c400da03e8d2ddc9a0a470d2bdfb75036589cdcdc60a51328e738c1f75f3e0e4da2dea200136a1c0965fa7dfd417dbe54bbd70d3f3c0e5819487273e338b534eac76941050e3a1a43dba8cccc494f52478e87be20d16b5edd0edbc7277533af60f8f328f711ec62e24f5a1979eca02dc0af7684258aac515864232619e58ea23480025994bb3de8752ba04e42947bb1e844b19e0cd8b18c4cb383686eb923a7d381808ec4025ea904f2894263d278618fa269c54a78b1e7c84a53406f1cc6313a505f73a049478a27b027c0d6d153a3d4188d9715d7b29364c5b1714fa7fd1f56d04dd2a28198b408779fd6c7b0420183432eda4113be4c4f67ecbcd408574a05c457d8702c22951333570d134d20a041315086e3cc5071c0b6cc67a1bd0777fa020fc436336a91d1c1b1fedbd5d3e2b6478263a2c91eb2b1dd46fd27aed8d81a84c486efd4a7044fdb4a754d3fdaea4623d84be50638018e618f3de0b852cbab3b8d5b09cf5d42e894c0f5ebb4917249c1b846d5e9ab87b9b8fd29bd823c2e55e54b2a9a39348ac3ff57843e2f741f465e4925afb4632f20df531c596e1327b384d002f1272647a866c60a7603b94ddb2568d3a22ab64f9b44e9f92cbacc274d7205900a9ae2c4867da1e0887701f625b3547744b074995484b69a7d7350f14a5aa4763e70424127c89c5b00dcb015f042fb423074a3d14e901ddb1c5eb22c0c73c20a052260570de8da0abc2976d4c7c2e5058acedc2f135ce398084d1ed3f00ca64b7c6669f16ed27081509e457c7bf8c177297482575b431068602c5ec662d5a918538510154fb7ed807aa494805600390e0893a136964a22d5672029d0e18fce83361f80b6198ab6549230e6ecced8e9c04665754c3894a7f8abc8b282d0ff7b59e9e2e93e72bad8b4191b730850cf7f8d394eae2cc430d764a70a76be016818c3f5f09e0a42773bb83fa873a62f9d97047940d8565831c7412eec205641729536642ea617ab812cbd9d0a41bf10cfea2bee2ac3a8967bc50623d85795a6bb16f38b249124d9b2af24e244f022dfc6d3d41f400796ee74e09ec9498187a849d2e9a29de10e8da8abf6d27bfc4f36d3151bdcba12b609c8cfd3d43d1b96d7276baa58f3de8d175efb7f1260df104e8914d271b214d5604e0319e82e09ccabb4cbe0e24af926b0d9279ecb24b07e22a9b9497dd70be0ca9eae6cd22cd45c3faba44a6b62d75b0852df0a287e2caf6b57e778ebbfdf3b2582482c7b7d7ff77f16a85f15b2476df99330bb17791255564893fe23e60cfcba1501742302681482cbbeb7febfab047eb17e81aaab7be59217b2d8083d0af603995059e576b2323e21bde4b60f18de0ca8d8fda8ddc811ce53a755a37f14add8db9127369a33105e9ab8416b92a1fcb029aa947ff6c1757b579aa9a502274cea553d65efe5c4b03ec605164f14e693ab0b4ba2faf89b5f7a0df3cbad55a0c5720e40b55d3ae23a613b1c3f201f87f31b62a340b9f12b6fdbcfab988c4999960982e46edf1641f40490eb324244dc710fcd75a020f2339802a33c1f34ee1b102524949c5937c3d87614cfc8de87988f7e82fa2452e64c2f2720773d92fe63f81ab633761974890afa6d3323725c47e770ae47d435c68f70d944d81ddfeb65c7fc8c2dccc05e1d74fadd81564fff65b15b854b617fcb2820b86e61ff5bffe34e230272a73c0f08c63661627592ec1fa4c136bb5ea6187b4c8ce5ca8223444be4283e9a2566162825472d55453e6bf0f5872d58c1de51deceef307793fa384da359cd47d0325a96c0c2508bb4c8e9f95efe5f5a7ce3663e3253f7f6d032ad67b50b0caf8c384dd3fa30832e9df8dbabee6a5c16c91923db0e3193bf64128adb12870bc426e0f68045735b954206fbd2bf5d3cee95cffd5bdb9249f2c631014a4154cb07a316f725a5e8a8c5586c82446e1bece1b40d0f999abcdf92985abea4167f7f795201f820a7b5d7a0d6679a0a15452da7b28f96da21000e38a4541a2e9526ad2018fa8a343d6e6a40bc9d5402e00a3798c5b0a66837b0b596fee108cdc0d4c1489de1de48f39f27758901753f1a300581c57b4ab5078884600a7842ba69509919b38a809ea08cb36ff6636e0885288ea2d0ce1322ea1b4ed30a138abe401bb0202b29af5c1f84f15bba51dc64daa2b10fda9eb10f54cbf333c77558e01dd853da1ab293a5f6cd8944e86d2dc7ba618db9b078a6a548aff99b1cf89c972011ea3f75ca31f19003d3689dca374d196a40d789f2d5669e167b7199ef8090e5f2ae9c18c9570f69afef69ce7790aafaa14bb66caf4bf05c5088a23c4b33f0344b2814f5f702ad293bf1ac50fca1f98775d5dbc20a9a4455aa08274577d712db35532ca40a9fed0bd267df8d4c8abd30e85a44404b3f9a992d7932c3f505ff5f3aefff70471ab2948e1636de1b4966fbfd87da8a054ee45ec1ffc92c2bf8f16081ff91b677967c4c1c28dfff225d842f2e69ce37b1e4700d081c32339218819c904361ed3f61aa364fdb7fa8727f1c294c0e7edf371681f94efa4f02db26a94ef50112362346e0e143ab24eaa50dfd8f9042143c2ffcabef836b42e9902c70ae38ab92800a1825414741a8258629854492759faf38d9355ae4764c7438f9ec4221f6e21612ba55fd498534e5dfb755ddba3a9b5b4232e23c2335e9795cb2aa5d90dae101811044c6285379a7a6623e1ca5692a97b59bd680841d1211ba6426351cd71ca7802679bdfdd7d348a86c8b3b12c6036ea590fc284375b155cd00990ac2797c8b4db8188105531219350ac6139d7208485731048935de149001b33e961f18d0eb933660e3d8a04014bcc1b0024b1b3c35b7b6349aecfe3146c5333e9f34bcdfac9478f72571a87b59e095346285acf8eeb9e199bd25aada59f38a8725e2fefa66532fe6250c9932b610c6507723853d4dc11a012f2b4aecd2de95662c0da3cea4d0cd5007188729282f694d59327762821c45e7fad10fab13135fc9760ab3809f365e2f06f6a6b47b118d6fbaa4c1a86f34d9c1b29e6a10f8efd1825f42880b310117198de85aa03c38438747a57637acfeeaf0b70ce3544ecd5aaa3b77268ba2c5193307c849653cb6926382c6d74a6195b37de553d1b66b453ced1dece4d40c3c9c4eb59a65aef8f72bd4bd25fd5302697e181348cc9e4f313fb9249e482f01a4720023f8e96cdb80253cb4412bbe797a62c40a6207c330aa3a2ebd2068b5818c5c6e5e9de6561f0f9ec8cec496ce8591121b10dbe3df4f76363f9b40b566ab06b0ec6ac564e368fed88fb136c104ae14fff8c29d4a6a2ee86ba8ebb00a722824601f7b08dfdda9c4f1210f4e2aeae5f0332cc2d090199e478940afae3f0e1164e251d183b2a13054225d5e989a367c414e5bd7826847a1dbce0ac255959c103205ca053c6d9a6d19137ded50f6eaaa6f1cc525e97a32e850b8b9cebc64249ae87d4a7da96df609d32a995a22d5cc856f709a153477a70d45490b23d8f2bcaf72d5cdbf108e3215c0ec8c71b4c3d9db30757a1156ac653da34d24d299248921548515c6f31820a820cfc3466d79afce394117b11415117ddf6de9e98dcf1f9f8b0e563d7821893c8909d9ce87a8f0445e75fec4e9de3e1a4169a6cf029ce9b3177b32ed8cd5ccba71b464f4e32bfc6d2fb116aad451d1e02ea2cd9e1d53f2ba75204aac04472fa6b80b1c7a05fb0b5c91dc6fed6e3f32edf5651e7f2e3d21edeb980c4fb0c7da775599b232987bba2b292d58d818086da691122b07407c4c083d10967257a91408ed17fc0b7f94558ab7d88fb0ac31592330878a44a705e4f7dcf80cbb9f014fdce8c045fe47413bba1f91943cad1bd05226746715b61090eeb0dcb27680f2bb4b6d2504da12d329be737f225532e404c51c01237516c03bdf3ffd21aa59489e74847f2d94ca04fc178c5ee98af9f988c081536e9662468f6db7be20afbfe22458a170ee4022c590173a4f7c1896ffba4e855493e761309a2eca6167c784d29597b3d32a81970bc31ea868fe298c9aef46d18e357e0386142e9fa4276515ba15dc3e81b91cc1c236a6db99ba3e94dee85c25f56748678b2095f4a8673eb460c0de18af43d0eaf341f74f40b2b406c8a42de22ecea0ea3953da1229b2f7c86d274c675b42a2ad56c7ffb2c67ad9096423706722cd5abad6ae24481dd0151a377b06870015004d07dced648a0e26828de9488bfc816ba8a1b00ac20b84080063f45995ec8be9bcf51cfc895f3092b087986b427b0f37c3fa017846a621c643ff40d0f5539bc65cc1bc50478f23987971041ac2e936af220e7107801776ff8f5163a4684310727d7293bff718faeff87130be5090591317802e9f260ad2cc240318c7e97ee1c5ed0d0c8951754f82cf3b241d6b5a2bdc77000de1fb18a93cb4e996dbc16dd54fac20bb6d1b78394cfefcd34883a99f968d5a5fe92009b995d202fcdbbc06b497f91f5f871a455dc76cd516a6617d3e8fbfc79a071db153c3d97c2357b812177043df027f001015c5ce7490755b5be65fe668171137126ce477a143c3433776d1c30c82fa0de7299330a7418c29cd5753aef9bb3e3fbd80c3db18d2e969d41a83d387207800703555691eee6edb6710ddf775fb249ecf0939cc173f6d49f9449694ffb1c8ef18248dd60c3c70edd68a3075805c3dd5c52d2936f278e6f24fcc7ac6b96fc3c1f12e914b01c1a5873520b6a831c773d03f347bdaa67265e26da874ddd1182512ee9a884bdf4f3243443d499f4864c143213a7bd41c787c4d5c30e9e0867220e420f8c214ae4923dddee73beb699b460bb21339b19f040c2754cb2a143f3dcc622bc3094768f267933a7daf0ac99d107dc320eec9a85342bbd1a5f56795c53cbc81e1ae907972e6095f6d696927da3173a8e734f88c350dc95ebc2d5e173fc1e21d6d8a034790e2f3cd401f0d97af654dd35c7182fa6b34d861e1451d35e38f9015881e865ac0f643a8243d8c33be058e29047bf6a98dab587dd2b04e0249408be24849e902249c9bff9426b5deda94089275dfd3dde3433573719d1aaa4d33c7fd4fdce0c18151eb233b11eb4e6c79c46b2a20b69e866df0e89286b89306814508bacbf08d129a4c81362203ccdd70058b8922298fb3a06f479836629263132c6b5222001246eef7d83f9d6d833f5042e004fd800fefa74cf0461ba0efce7f0d361472ad82e120b301d81b6f49e5501c2e2889cc7ed3b9495a0bb27e94eb4a75c200a0ba06b7f9b0a763d095838713e40403f9c896901800b146c8825eb564f4d75bd36b07cfb11b9cb0c86b09fae043eb2b73599bbcb45ea1ba27eccd3db1f0764f2fd21d6d7f0cc707e0e80c82919e822c25a877b0a8618b3619d419790c5ce291e934f28af433321e34b1dc58558085ad9a4617bb9712190bc28cd59416323c3fa52597028b41daa5c3849606dd71702e84223aa579c635faf780953d2fd039de720726acc434cb1cae5245e5d8900f99a07d28a165a4ad4405857bcf1df8d133b99f130521fda85197dc066e28599015e6d2db0157024ac3fe418cdfc4cdde89613538f1f63134842f0d9b0cbe534d45d345049ba9c15705159a5930841e4915e38c65c878a61c025e012e6107708e6c00de61b429b4827018678d5276a9b43b19a019eb094062512974f5a470ce5b0e304ae1595c2ae01e828882c60807da9916857fa9258a7cb8d0d02decd4c958b88dd1b5b07c889a2dc2d715a635eead70be3bd402a5ebfb9dd64ca1394874b75529755ebcb1d1fcfa5b07dd3cc38bbad02485653b2fb1d084688e555a00e81a14398951a2bb16c45f2cc6146f8d51e8f15f6dc445e8852cf28766dcece2b060112d281dd815945495cc6f10370ea0ce97cff986b891b9a6a8206e216b7dadaa8520f01bc92b960a835cf56e340a0d836eb183785b874726ba645c5484e9731b9ee557296d499c1b991cdbc157a592bba1b8a02de72661f0d6d3ab13cd131391084009ce0230be81c06e197b0621ab9f4e0369276ae94304b80ea0db025fdef6407fd3a037e3fcc3d0ca70146e81dd0a96be7166ac6cd58c602da2a520894cb9719e05e25f814bfa09a5ecfe5f761a704505e15c9f362e3b7248c4733e469f7c478e22c3659eaed4324c5aaef578dec5c4f9bc6a6d00ebdad14674aaaca1308dae62dcf537b32756dc5045960251132b23a2a76aa03ae7f5c28364542815edc744b26760533b063a66823baebe04fff2099f87ded42cef7c8532f82fe718892781334cb115045483ff4d2f8de3ce40e8c20ed83ce055e5eecc5b96e79046fa11bd664cf7f52e68534fef5c4cb8c7cb7b2847b5e1a9917ba8a45872d3c5d2abdf7acb72ace847ae340f413ae79b7480423ac1c0747c557a079d92ae834dd34d70bb7471f2b2795d6d4eb7b39c1cb01f6de9f3947b7a46e29b7e712a96eb5791ab0174116454c2758ea84dbfe29bcaaddbb85379017108066cbd833075c8c05bf4b44e17a00ebe018dd4b3ae64a5eefe7e07a9b27e7668940ca552da8bddfe7b3d40601bb5966024dde756c1292ae0d6ab976f1ac9f53df5a3163cf87ee394b1abaf7ca8693ed4a26d2dd9ea561e8a6eeeec294441b4d0192e17181c4844dc0872aec6d027cf0f7b302c3920125557ec2162c0c903c9d4fe42aecfd8c9356b51ed2893418bc55aa3b444a71180401d344a0d599b90f20df617fe4b5f3993de9f0dab85f946c940fa1e9cb26dfea0c60266054f19b2600dfb065cbbb90f9a5098d79a264ca6c7b103684aab74990adb60e0060b644e45a3d389acbed4d4ba2531460a7044d2b608a2ad6415941b48f6c8e9c16aa560199e6da7b0ecc561a9a45f17a8c677b28b9bd8b506e37f11f6bb90a58ba7928844bf181cc900d3c6dd201113d9b79e8bc9089e59e69caa571dd0d08341bd5f638d354683512272189b080c135ce372279cd36e01cdf76427f312c15c847f6b9a16b435263699134c5a09b9bbc688f94261747e4036e8a39024130095db87a96a588b7c02fbda6a3c321a855dafd9ea1d9fd38a1fb89feaf40fbf22f7dacd77021b1b150b05087c0e7d889433917a3f5e4c30b78f75ccb534d8b8aaa5d6998e71f55f92ac582b948abff2a6ce9e0a8850210f4d4c2f32ffb00abc7896d9470f66e6988cd3343810b830d907b0ecd63a397ae5f05d9e009ec4a6440f7058beba8e8d29be0fa06e70f8eb5aa6cd5dba1a5a5b9b0e7482ace4409f8c44c129e909a6e1aca1d0c842d1d5efd61afa0abc042b02107301f9fa01787a55ae281b80ba5f19ada57276ea0df650e6bb67b48ac2c2d316ab378c4730f8968e0e43149b382862a4cba077283127e2d609a1e95f3c3abc229a97ed7cdd9c28822460c26281f70e788a56eeed6067d1b9b5fb44fc8e559289171d4b58ebceb1bfc3cf84bab27972012aa3a3e3ae35dab4ccf55b5e28f8003eabe6100f29e16f14ebc98520e4dcbfd574136c3b09df85fda1cbe47954dab92b44e8117d2086dd49de6cfbe6c9038ab0d9760e9d3c9e6d0005110ae8eb4270427635a42decc0d7f8b8fc0a18f0198b20370a7d225a330e3db0fc44e01fe14115c94c889068ef473ced92fd78c84b0464ce59c0f8701ae1d7e90766b94bc161af2ea98b6bdc3e2e78e55c48aa681d8e0150e4fdae7bd3857449d817da26d0fd16b1d71d04913999cbd511c4a3d06754bd0801084e54b79570620fc920f5af27ebf1852c59261e0b34c9a65177bee7051bc5f12ea92e458dee53aadb6915c9e42cb8cbde83dc0e411c949bc7e3419616d4cf47a82d5e37023d5dec9b0ac980911d974fff8daeade23e9fe50103f73d1c9155b994fed1cbf6eb4fab1622970772e22314fef2041294c68d50f68465ad5190759dbaf06e6871de4a66fdf0d21e0d4a7364dc40176fe549272ced1ffcfcbfe48a51d6844020b70793759f1be91aab340f0582be09a40d186c3252620901a263d1d73f28d6c409aa283b5d4a73edc5311bc12009b192da0c5c23c4d53c4fd6ed31e641d69952f842ba21b3d58015befb96a321c564b988fd495304ac81a59a784404eb37079b89ecb36b171d5b405f8400fa6bf581b68d9905dd60e100892a669090ccdce45462e24ba648325e8522af7aff664a69495a04d022e27a2ad6129f36f3c26ab08ebc86aacb824bc2ff3a5586e01ae33645cab0485f2330f8f65313c1c4d450542fa13285667b9837954d6867deed07c6b65c7a960828be11f82bf6b0024f37702d64af9819721cc382466a86fb72d6527ddc2966e0503a4dd6f2186369b386b80f9c2806c991c47c267984fc73b0aca45c5bab500cb4a48900307d88e615a5eafc490059248891cfd14b0290540afe026c62072b17e027b3a981eb1e8a3142505a5060ce2a9bcb3fc9636e3b5f85762279333d21149a2e6816c2735817d3b7fbc27483c49551b2c35cd8f26f669956e29bff8e41c95ed730bb8cc7517b3fc925810971863f874a22d48b3380d7c321a827eebea9ce3de29f6f0505dd2fe534d39263fecbae4d7a944b7ee494d98d004b7aedcf0cc9c6b76ed544eb68d034d1fd0745dc3f4a3df588e8cbcefb799eb31e183ef001bf357bf740c804cec0b0a3d6f763f6d6e5bba9245238323d9441fe29cdc44dfab3383d43ded0b188cd328294eea6da5dba70d792ab68f664cd8cd37495d47c87490cb8c3aa9c7bc71693fd55f87fed24f4176e56e21d0d4934088bfdf021eab033de4e46fec242b11f3c1c2af8fb7d0f828d6ba1232e2c298464ac610da36b8acc24dad70097f717b2610b01074292f042ab85b2d337c58c0b618d158782aa1f5e19a26358124b929dfa92b7e84c00057c3c7bf6ce1871266ea416249645b227031dcf9be39531cb90aa9ca51b2b31083479e2365e6cd37f23844c47934f251978cc550c3e5bad9b0f932f08d205e7bbff521523b4b294309d02dabb8379af187139db0582f4c99381054dc58827d74d9dd1cc9ca29311ade7139cdf278508b6b18d4ad1eb457cb10595efdac3757797972065729439739cf1e36886387fd75e2acdcbdd5b73b10e573e582e10298f40874f875ef2bf2b5f6fc7979b3553a60b17b978bb224d2d8a266acc9f5686418f11f63b50b2832ecda78453d99ecd5d1cd5890a49fbd3cc52d71cf5689620280f32cb43f6f21b67fefe11a2d44200179a05068e56c2d4bdc846451c2a1d4a3cddd9020493be54c75e62586fb94ff96a64448efd3dc5ba9f0c8200a5e993e43491108ffe9974bdd1f4988f36d9810f0da503281653e11410829748210a88f068eda6bf23f7f9a3c4fc3aa11ea9cc6b52f6ce6ae12dbed8c6a3e9acc30362e6f0107c1b516fc8135c45dec9945fd93cc6e51d6d1cd75282c1382b02b7db6abb358ede2e0232c30a90ce7ecca3718c74a61c7134db0fdcd48b50479eff1e6a908b795afb165a17df4b6bbbb7cdbeca386b4becb6731e30453f5299dc5599e44cdd862c41486b42f9deac27aaf85668c0898718c0b839d8a5a9031d103edfcf0b7071137abc27e381b1b62642137a134117221ec4311b8b10a21853066cb0dede84910f293e21bed62b289a7061c3ca74c252deca774c6f6b277aa384e7ad288700a295b7d2a20e3006c226be0f4659f22678b310bd6da6f9066edfe4e81b7f1079f9515ee3c85c025afab170e210bd7b50d0ccac93a39e112adf371167c58b2ed880ff9e89e2871731a9755f7b75b8aeaa3d75bc207040c3c678bdc9d062ca0659cbdb0d43ba136173b991e00537ced28aa1b55dff071700530e009d389932748969ecf87a2dfe78c943bfaa925b8727e128fe21335874cf23d6ca9b49751e79ceafc28abbe816cca4118714a1434f63d7d03474d14d73761c2ddd69f148ec8508b81d0def0ca42ebaf11f3b7a99bc0008ca2eba91b25259b8d9b0fcfac05617dd0cd43d5205d4f4ff5035e3c531d745374bda574a635856b1219ca07cd4d9d3e96ca8fd60bf81799b8476f68203e295316cc22b71179cff081ca2efd72442c66c7305489ec84c31d1060eb951b4748be10c1aa3707bb13525aab1cb20e8f0cdee83f0f6b164f1784b7d1068ff8841b8b5309e406b387f04c368dbd7aff6c35b7fc18234ba2d9ca255685f4075733c00e691902404757db865eddea29ee23439b852cd3e66babf26d0617795a99121d94785204c234a6ae04b3efd3865cd1128445f712779518333c378ee2412f80e40c031a96f124be19b0da23abd5d080a3ab2f3ee9aab39dc6863a5ecebd4f9b3fe00c6ca341c458d9d94ec91917d40d01c8d870e3c52bea6d009c37efb1189c63c01958728886354bc1f7fd9f64edbe9393f086daaf0a2978dd7e16ba599de5bed0302dfb4079c00339df4b75cb16395e750be5a248a529baf83ba4b00cb661f7e55d7f83bd1addaf2d69e91231730af849b873d97b00c37216ffe11eb2c300e379a7fc4385f7fe31af0825d5cacb4a8666c01c9cfb5b968bab87023d04fb71ad52b99e5dc1fa282d8f11f0d62864e95d30896e7e70997ead218823741795b52ae99bc331021181727f64b3f303f9b002f6bb7227ba7b6ce0833b8da1575fdf8c8096b48b543b4f9b8d73b38574fc784a0e378c57817e54b5830e86cf23a831181cc30818330f3247b0edfb0397e8d6511e41003111c85818e622c050bfe6f86624f53995ecc8060049ab248da408e1d81366598b2ab934cb262f878f14f05674707ced540decfdbd6e458f22ff75c75234a8edebe30cbaac96dc069d51784909fce517ba85bb3db7dd3b97995715d6069ed1aea68f75a0f61a460b20ada47edc3fb7007d3a97c584e12201b4e3ae1911ed209487675f9b12828011a5f57b77c19178ca20b82181c687ef5b3ef32fb4951fe81fa80043e9165c22d55f3591f4691c5d84d681e0ad6cabb4aef200d53d41398260fccb2b4ac628e623e605d5d7435ea3c1a7f32a26e4869a2978e67584eac78b266a99c75c8368b8ae4013a89c2af542b6a9d95f2a01eaad0b2fa4c35d9ba22bd4708e6d0898dce5b5855bbe232e5170113133300447bf41fab63d61e3a35da1db4c56cadef60d2813d39aae6d2c01d9521faa668044c9d976d18f80d841aee0a0ef7c36c7a8c4c492d52666fc54790d0d5b2642118c3ad609d86bca6a38c26116d413910c79a4167a4126fba81c9b26e6a51c0ac078e450e1c9805ce9272434426787fdd6ac3d8f113e0e18d1aed55544126b778103dee76858d1dcaf88883d41fe8864f1e4dabdc39f78532d75bd5b2a430124efd40181977035d11430359c7449687601fb5868d3302a3c20342c055110cedca21608bba3116b16019a37c6ce4ab5cd9ea967b6434bb5abe82f05740e67672451bf2be838a7490252df8c4c6bf2b360ff72ec4331486f16726b07306f33957e97540f5bd2b1e6f7c8e87d3a5192c9f526d3a9fd43068f614cfe16281996c076a817af161031c71fb5d691f7067c7639a12fdea968c3c284309ea08e2d11c10744e06735535b9ad8734c9c68ddcb4e1b6517339389893dc64fbd816c4a287b4a9abd679418318794aec96316507fa030b06a082efc093c9f7df8c3cbfa6569421a3020be46c65fdbdac489b84a7fc2e7f0e6923832f6b322cd824319a38365f7af90f9daddadc1f8ff6ed950606e04a1ed23e8285905e51486541656c5a64deef078674b1efaada7410643fda77b80f32f5b96ca0814f1153ad3a7ca53f0a7a0ffc3f21c4f0acfcb33beb06b1e669c389672cafd124f8fee5a928a4cb40c2c4a75a716f8821685360d85b57f6c48f68133d64fb1b4e965b5e9e7087d28f94ff921874a942a560106bf8fba536f5b698317c9a90d0f8b053b8f29cc2d44884c35246b212daf7103214185b560aeab849ed306000c2f7221304b9c09abe47d176b865bb77998ea4a65e431b851ecf6d1dfb7c4b5ecb0fbaf34f196efdb2c36fa057126d7d765252c77c78906169d28c1c56a7fa225caf1477e8ea8ba6985226b844a9e9f4c2372d5fd89aeadd6a38adca02e074eaf416b3ac49a42aa74b4c392277f168882e44dac4d00e5d0b383a6fb1afe666cfe3ffaa2ca1caa544c4f8d298f42e9de1004301bbb656feca0e05905df8d6e3bb029bf610bc30d8b92c3312a0f4d5b96c8f123a5eabacefd5d7fca48bc0564fdc3ada65a5d19996260b4a38f0b0432948bd7b526b3ec7dd1fc705648c1fab1c5965c623a782b120e088178b3bd2602353dcf304e5c6feedb676e5ac8dce6516640ee308e93271b9eace5dcb3c6c857cc689dbb32ba45bb3733dca3689becc12e7f2a1c3d6a937928c73595c32ecd141bc5c12b119d203a5a8417a1217b5cd3c429ccb4f320a49f0a5d4f8ee847a519ccb43fef268eed403000a8a610bd0c50b32d17579371370ace35c96e6d9a840ba6af4fd1ee872e8135888db9bcf3897177cd3c2e38d10098b2905d3bcdbaa03279252f995f2d676818cf69c852db79d55b10bc9c2f35e59260b80368c8de826f2719ccb199d802cfa5d8d3a737c6b288ce1c741447ea77119f7794fa705a00d14b8996c62124efeea71a7ae6d2e536e6bd8110dc4e63267fd8c6b380a130e7f39b1b9fc3ba14d69a7bbe67229ae94cce22a03bfbc3834312a760cf977575f3c3608d44ec3e084f401c1669a889e09844726bd487e88a8c38d53a4c592a3b429ddc6854290594b950b631444b7a648a7e03f51caa85a42ee56c3e7e20a020b732479209373714d4c775069d1f90bf8162462ec7fe9b864012e94af5616a2ce39c47624a6f940349b133ccd32c91fdd5be62cebddbe0ab089c531915ab56b2e9fb3fd8a68a59816f432286401dedea652cd7affa208b98ed14176fe83c8af261b50049a3d098ba4b96c9e32a72986c512b52e8631ed92bdf0f5514a203e5087349793310a70a8e0ccc0790c84ada3a3bbaea749c76c468578390b9447f5cf48aa52d57cef11b97728b3b49bb96cab688d1d6a9dc82cbedfff765793378ac97e78c67bcb42d97fe151a993611d5008fae7e8c99b5e081fa213525d13bdeae2f8d4a317a15dab1c2ae6fe96c0b86c3c6d20e9c10cd48115e44d9c34a68d03f92b0c15a3c34a62d140b5f70a8da4475a69e7daa5a2e79040231b5343b833bac95aba515779ce61a281a234a91295bddc4977f6163e7e140de6227166c313184fe16b71a2439d817a018d896965cb8efb65faf453f47d08a396a63de71045b85adda709a02612377526052338cf5faa86e2f31c412045822c990775f9102e3f93586f9d9813d2374e3556b30dfbc629614147407cfe1c93ae5176b620845a2010107a22a148c54d931bd9dac5804fe095557ed6a0c6e3e99c8c95f838222707ca5f87d9f9a1cce6ae896ecce8779bfef8e6aebf423a82541ebead170248a731d5dcf5b4b34570743266a07660ae30b9c4dfa4e51b15de0391700da75d0a41dead3421d33c07894ee40ac05e0f8e11a66afae48955efd9ae9f93c1ac729f46a227fbd1f6c169e083eab2c3d327c51354324be1984247d9dd3696f9cca01772b66b526ea806319cb9d244355347fbfca25201d99a19e05d9df1b62a534abed04b72087a937d13cc1856bbfd9fac493ddaa0c59038e479a87bf4c811aaac553f5784e54917e8d707f62e2a0e9df52f878855b80b0c7adb09b47025c9c0f60ac8d6f194272272ac082c3dc22a8a723588b394d716ac6299687af10bb944cb17e202a3af7f5d33f80287637e5be1abceaa64d46fd272b9ff642474ca3f997fcbf984ca4396a95f364bebb31b908bc7a499c26627fa07b6cfdb8908cc4479de001e4bcec9cafdac090523f47e099534d70d253141691f99cc93768d4a857a86c513af935701f458180314fe9330c13af1a9435c6da462bbb6b266c31b2bbe22eb56b4862c02580b63a0f00d2a8c5e2f6520a8f27c2f2fe700c8f0571d08400e84d51d01487bb06744bc19ab9132901951c5b60bb7a95914325264b11c49b6f57006c4b05099ed839f04c8ecbf2691606fe2ff07066aea8999ef5f63dbd606c412f7aad798dec13c4d78b97c7772ed81c9542feef3f05f0f870b41f71d59b595ba31f583ee68bdf34204ffd334f2fa8c4b6f6aa2287b4b7eb21d1c57c8e384e80e9cb34657b13c070ecb9322851ab4b4b08c47b8060c0337d890bba4c0abde45511ab2be8da08b7b1726a790d56640ffa3f9d62ef6c42268790fa42cea04e63bb1223d047e02d9115b25d6f788e52ad02e2d2902bde93fac792f092f865c21365e289cc6db9ac93039e6aef5a9ee7db90fdf5c3fc8c5678ff3e1f64d76d9302d515b9f5ac032181b2a8dab26665d3471666fc2fe36221ae0a6e250e36fe1aa970bb15a3e44ef72a7fc4a8183497f638353caff166c3d1943e437c5c274bbe758d2b5b5f372455bb784755e47d2ecbfc0f979bdcc9121c80a61d9f41e0cfc286b31fea042225ee6ccc17da1d59083f99695c84fb5e4e81c7815598be7c5c93321892a687f21e45681e7520a1a288e0c91cfefdb25c005a55f91308864b31e010c3da8f04aeffcb54d373cd2f410c6e676787680b082ee756217afaae0ea7e13e331716310dab98cfe682955a533eeebc66876dc2a0a533ea7b6f3ac8416a56e28f6d7b80d09e9077459313f4ca6f881f3d073d76c615832279de904209d9a4546d3cda08f8490183bdbde9d8d7cf9accb565409ee8318ad00c80f22cc87a9f5a9602a2484f41a9ced2ff7b06b6e61a969ebbf58c5d766622ad8274b0071fbc9f8d75ab5636222808301a8043c60623a167e77c8cd6448d48032575347507838c9c4c5d2e325b081669e5eb6bd2fb0c49014de9fc12b13bfc03af2c959a2e2070c656cacc8f237153a0dc39cf8c63f1c068601864c17ec90da0d9b4c5c804b3b97d6f670fa9c00997aa42b9e31c015eea89632b1563531bef8c68cc31d315c90bd6594d713ed8373905598df3554c3099118fbf83b5bcc64ae73299853c42f209f175f7c9afdd995708624dd0b51ff342d6ff77cb5936adda67d47e8693a3b1ac2277991d920a738b874ea229854746f656af1bcfdc79ead03fc2f2a67c79bd941e37fbe609a96d9812cb3672da1a3f578bd978d4b49713e1ec8b2c88d337c3649927192a597aea3e4b1b78e9fc23159a9121a96c521752542d360e41d812abad2cd46d1a01decf5159c4620a4c297b098d87683cd6e33f77a298ef826888497bfab276f2c1cdc453a8f0fd8d9c67fa1c496f12ccd0810dc2001e20ce8a6988fcec8f33a85850d54a2cec5e87952ca739dccd4350a899cf1173b114e548833461ca7056a4a50fcff120c42835f85947fe92a6e097346916cca81f3a10acb205a8058301e0836113bc09ab6db0510ffacffb35ea5d9b5af0d57ad3cd52a36acac25861242a5d01d8ff250f8d4a1c2caf22dbcd01281ff4998d3668ddccc3f4f863a72aff12abe49c914ac9f56066d696b0f95192ad75b31ca2212b141bbc4f002cafd8a96fe07e6788a3a434755381c1184e9788cb811f5af1942bd54dbeca224d293a8a9561a98d4df908895c41115e8333ff7ccbbaf5daf3a9765000126ff43ab0bb1304443bf54b1a9120e02c0321c68b56247201adfb7549b6cec8f80b5c0d6ecb520da823824424598faa648527546da4f9491b9c02a6fdfabe288599350fe5d5c0cc508f8e0d5e120da5bb4b5e05943815d01e6c768c054415baa0af3183ea9ad5af61f6bb0c29484032ae17a9b5a204e4a5207a9dec78eb1fdae6398edad82906a8a0a3714483842362233514157f5d1366a8c5f7fcfc82bccbd1400d90a5d7f1c33cebe7ac79ab3adfe482b745fc38c85424b0f0fa5e438e2421f788bb564ef1222e5965226290300094109140a335b29c639afcca20dceec4913ab2bab6034c1196d6667459bba5c587cd4ebb950506ba59492569734d2665966876eedda7cdeb43c1ed3e76efd79ff902da5d613b275b3432d5c2bd7a2793632f6b85a4b6346b3a56a593bbe1575b052bda514a9826591403b12e8fbf6482201b192566dfc65abf1ac76b499d9e2fdb4781606f4ae16906ba5e2b570bdb45f26716b1c731e756b34c11a6dfbaf78c63135c46abd7faa358ea1a823a4349552d9a529dbbf87a7aae2f890bb543c15a878f6c7d1b572614c8194824f49d58394566ff576ca431659411a38fb79b2b4fd79543cabe2f16c40743c04a0de6eb56be36508c6f9d5ce0eb16014c2a55c2b9c106ebb30d607c1d6b95718a95d8555a7c8ea03e4b4fd7b8070db5b74b6f34c566dc5b3b42cb330964cb6cab2d5aec5f3b285bb5bb8ab9dbf9e4653c553c5f1b2e7e5fd29403d0bcbef0f747a69f303f1563b1709b41333de3781761ba84d4ae5e0f842384a94fa94f9424ddde05371fc1c0eb4f3127c7fa036e003f558b79dc35b3ccddbacd438a65c29d4ffea1aff8a3b563b2587079275a75cabddeabe100edc293bd667ad769f595d2a7cabdb76dc765e2f54f12c2cf3eeecd2529f5d61adaf6a5d4afe02c77ac61a9085645377a7cfb2812c8cee0259185910aab52271db95846102b16cfea0673014c6fec0504ac4b2d11a514607ea51a2d4d31af759495e6a5706ea6dff8f65c34b9276b5f92bc6de91c1be9f7339b7abd036817a30f6cd801265b0abd075b194fc55856e3db06cb57e9f9973a9073deb37ebce3457d5bb2a37b65059369fc202981c985c0ca5ed5fceb57ea95c5f3b0e045d268e6a7bbda6705eb3d7e4d4f757f53ddb5fe770d0ce57a77c26b835ec326f6d476abf09dac17a57574f9811831a25aa8fc3d65f31063db81d434955b39528a3fd1cbe367f8eb5bedff7e99c73cabe16755816d0af53467abf922adcdaa7da6d7fdb5aaa5f9711eb948894ba9f2a75ed17620c8a95c4fbbbd6ea9cf187adc6d95cfef0b5f643faeca7bfcfe26b31bef6de1e204b19fcc0072b087ece59831f088220e84ac1ff7b0d7e0641101433088ae08b200882d61f0441d0ec41a285d1b43d0c68f45a16467fbfffd52a632abb52f04f3d58bf1468a6f0e7efab6797ea3f977f0e7b5f45b6506f78aff5dbdae09d81ef15766575a83ef8f7850a13bf12f98343f583680d37e86210f86507ff66c720981ff407c12f3b08fe6861e283af127580186cf0c19cdbe08ac7b3831f89247e16c1cf8b83eed9c1d0b38b660c64feaa9fddbde54e7edfbb832ad0c581d25f1925025ffb55b963fcda5421fbb5a2572aae5c0032d07b8476db0439b76b65a1ce9841c51ddfe770508699da9effd628ec83cf7f6d14e6c1e7bcf35f5a06e0f36b0ab351d6f8fc549ce14a80def87378ea05b8c2b88a937b3f3c17eeee6d76bc9d4f9496e97ca69e8a3a00f02d8c2f306e617cf1f7de0e3016756051c78cc73b2abe5e3f63c6b330cef81cf645e6362b8c18d0c9a72af732cf5f3a38f8be6f05defce5e092bffcff13750c6551c70c17e8a403c465f05602b8648766cc70e53699f74fc5bcd3f17a4cea0de6b003b26ed00649e30340ce789085d1cc3a13053beb623c8c183062c0880123068c186fbe368c186fdad8303e830fc8173b0f848074fe72bc5bb4909d412ca12996868da4cde381c38074ada70ea46b8dad9eb7410ad520856efe02401571aa834b37904e9ce1125af2170764dd2fba57189f2c8d0fd6174afe6a616495c0b2d9a1186fbe48fa3781749b86ab7015aec2d59bbf43d1813e20c19e1d3aedd04b88e62f179ad11a42b2174b5e28914fc517493348d7d32069ec83bc8d36ebcdd613d87b915402c8b343fe1abcf922e95e9b73fe66bc30f8dc06cd8e05f466eb29f3689079078253fce54a7bc6e35a65c4af9f21747b91424b2aa12842423a2f4da128db715cbc7cbdbf50cecba7a1c7ef2f148512519ffff9a11d99d1f8dc2faf4c14ec19df0159370764dd4364dd2fb2ee0d3eeb28d18c77335577dd33f006a46ef457cdba1d7378fab30e04d2bde86d7f18ada7175997db6c6fd3024897753a5077b7d97a02ba6d7f1e20ddf61f5fbc30c1d6934e07639b5967439716e2000b45b1b86ad955e9a7a4288154cc3e48496c43c018e79cbfefab5aeb4c29d5a09187e0a9540a94a9be825aab5e932adc1a385391a02cd7688d32b996bf9cdf3fd72811058df2a7571855aafc2a5147a67449679b1d1ab55875632db33a7971bc54bdffaae7a57eff151d2f4dfdfead349488e65aaed9a1ef2303cab2915ce3f55495c62af96d4d565aa33e0eebd2f87d74fc7415c9beb6bc9d6b2e8ce0ae2e50466b683157bc9c83645a4a94885ef1e66f7559377f2412fe0fbb40239999d15cf1782b5e5002ea0eefc5d6eb97355581a1d8aa2db8d0ec48eff741aa376f04a0456e6bbad8d6b2ec686dd0b6389648b043febac54382d51a85eb0a7241827d7de82b08857d471f15586438aeb02275e8c2be578314ac2eb30507d8fe1fc681430145e10b6a11b6d94693b0a78c12d5f7cf3d1edb9f66194d70b7fdc19d05b58ca63d7b17ecc9a819cc375f317f0ba30963e720313f1d1fc348017d1646fa39ec255b185bb8627e164653e7154856f013757c9452570af5f17f2c649dbd7b0c4a692ce674ad916c9d3d47b43b5222d19a459b9491cad5ebd523d933f357cf910ff98b3d463c04ff15d963f310fc41d648d6dd33bbae9edaf8b582e0f8e0482f0ba309826092bf546209d40e9937b406936a0ba3d93a57e275f5ccfc9522ef4bb743524c91e0669148ab56aa476fd0271cc9d05fce227d54642afc368b440a7f150298733ea2cdbe1e1f3d495e9a3d3eb6d78cf4d8bc44e225d8e3a3753e0c10648120599f25ee80b1af0b4ca23558b66dc1a48b47f07b441d3d46b2ada725eea8bb756e194d30a9b6dd6c9ddbfffb27adb3676661a183303259378591d2f9c357255aaf3056f95364b85fac905aa89a12e5f7eca2b486fddaa3b46d91cafe54715d57b72fbdae5a3ffad9d2fa3447a0de6baa6077f4cdb0baac0c9f61b7338b760c209561b66edbbfcfbbdcc65fd3b4911cc74beae4a4448bdaae67db3511fcd18878cea40d0fe90d451d2ad8ddce7f451df9c338f51fa982ddd126767521cd5ebb40f8481afeba21fe77c386d358dd2f4df5e6a5dd97bf540fe6d08551e5a2a14489c6f70735ae9f0f2f1a5f5d05427c69a2070f3173cc3b883953c31218a27a31f3772eb3cdd7ce26083bff085edecf5fc28d5a5227273d8adbd965aa4075fb737db2538a916e139fbbde59a5b94d2b7592616913edfb149f5e5a178e72188d8d2cd9fe9436d5a0a827f5825a944a59a513046b106eafbdd7fabdda0eb9ecbdd75d45d50201fd5a6bb1b598c5a2449faf5694085b51a444f7862125b2180429917f2a55dd662a4589e80a5b8badc5fe594a2da5f65e8cbfc76fd21a35b0c5d6e2ebfa3c579a4ae500522fa9d78a59a8f74dfcdf4e01db1b58d41ceb75f7a714bb2a1da2f6dd4571d4f7225cdd4cddad0101846b1f042f75384caa532ac2030b10020c70a1d60c80fa464fa5cab3b94e0351023a06caf0ea2b53051b7cf8da95b98219a02aa5efca6401007846d64ac42bb305afa016403f3e3ddfca74c1d0c710ca0006062ff2ca7c815e811dacea5f19c06f478ccf8564fbcba041c63f08675912e7458348eb3c6c04fd2b08c61b6d3765ec714cadf5072b97ed4777fd6a5f3c263175b913637d8cdd738ee7f74d1bfecea45a1748fde538ae36af7fa5dbf5a62ec6ddf15b6c2d7efb29585badb5d66aabadb6da5a5badfd4cbe6eb872b001617b9095f1b4cd464221cf2d5b94477b3e6fdab327497667b4954f2f3f69912d9cbfecb7c8169796ce0eb576f6edb9ad3d5727d9fa71b5727668cc68f6c87a643d5aef8856063a794824a01ed96d15e5af25a51e32c906aa1e8b3a54e027dbd123b340a02c3bcd30fe7c7cbe2ffb28f5d8211f1f162b95a22aea36f7b4edfff45c1094a980c785d17cb1c337cfad8d97f595ccfa414a2bcfe85b93464c469d84c19ac965dbff01ca6deb03caec9005653db2a516471e428b99bfecea5c45c95846f9592fd32d662f4e9eb77f79aeaae748076d5bb387d633db57b7edb7d06cfb3fbb6d7b8e9ef4f028f9902c59aed56ab6c7b53aed90056538db66755ed7eaf497056532d0c84bd5a7a610d9f65bcc6c0b9a97f9efb79079d96abd5dad5a208b043afd655b6f029ddb46f9cb829e0a79686a95a222cf039d4051ac6f31dbf6593db216b316a852f154309374bc2e9eb7e28ed5aef9cd1ed9adaed589a18cad7f61c16fbd38b77d9ebc3a47d0ca4cf068db076516a64dcd2291ec95b1ed87a08a4ce90fdf9a90ea0380102a2e7041112d6c634e07c1b8b597110ae0be82c0ec4c06e950009a87006e0d895b63e5340f564e4d0bdb11d8e3ed584141f4c34d5de52bd288898af53d93fb145b9c8e733599da41d6daa0ed9f49f159f975ce0e790a5753bdaee4b5ba94de7967350602a432424a477f7999d10c0aca948892b9f47efe5b2531b81b6fffb6c55d97c5651acdc2aeb8c3f7a7239b19cd4ca3b96a678dc060c7f3a64eb1f2a5e5d30ef1748f75c2a0393b64a3fc65b52c9f1676b5cee75dc2ab330bf3a1692e4b9052ef43d36dfbbb6d797becf9d05a2c7167e3bba8637c1775f0b4a066d628bc91f491f918f9cbbeab2e8d3ca32b85faac076fb8c2d87a1e12a9a7e75f38f9d05a44f990bd2e1db34cddae64db7e0ecfa7e9431b5d2dce333c1f9a85b5deea1627eb6c71de723e645f49b7abd9428c55ab954a143f2d9bd16ab64fb55aa94431eb25776bd54a654be2f9907dd92c7f6628cb511e827d7afa0b9b0965392a9f218ba582a5c69558ab1625908aa5461e1746df29d28889ea7b7c2cf52dae5208f6592a34aca851e6e5eaed8f462dceea3a7792ade743f665335a3e553a78c654384bb94219cffdc89c463e644399bfce84f659a785a534b676e743f6cf9ed549a27e9f99659da27859a48f0cdff191f918812eee608d611d5927251adf8e2eca33fac8bc0cdfbe8f910daf8ed06ce143dbaadadb95c5da116e1efc668b735b1e5728a3352ceb649de2beaad7e7b6b47d5f755d2ad8de165f756efbf904f5aa22a55e4c852ed367df37efa635aecef73ff356eda5b9d39f8c196498616fbbd6459f99d1be7bad09b837dff797db223b93ee978371b773f865dafe2607dbebbd2a5c570a16ac3a26ebd23a5a034a17f6700f5512ad9fae6acff6d3dd2fced65122bb3fdd07f599f9d07cba4ff7e93edd17b5bfdda7fbd07c3ab72aa54f57c5f307279ee2299ef65ecce3f1783c1e0f7fe7799ee7799ee7799ee7f9e5f33ccff33c6fb7dbed76bb299de7799ee779bbdd6eb7db2debf33ccff33c6fb7dbed76bbb9309adf8ec6a7fb7476e8d379b62d594bd6aab56cad598b5669bca94afac1fd68f9d9f2c3c586075f83a462a5f183b3b0cf661bb7f983fbc17d046a8cc7e3f1783c1e56525252c24ae7799ee779de6eb7dbed765b2959588d29ad946adcd9ecceeeecce66bbd114cf5d6349354855d20f4ef683abda338e127db8fb83e607f7f383fbd1f2b3e587cb0fee07f7b3fbe1fdc4d93fb91fdd0f971f1c4e269ea29d8f14ada862148df780ac4152a51a134f0bb37a34835ce6bf5ee2b95b3219254aedaa3ddb0fe35be3cd16916de3cdffec7603b4fc5b3c28d10b5584effd5b46af0f5a328ac3c69b6fe3cd1692ad5bb296514b4689eaa6f19fcdc26adaf6d9943edbd267bb7db6ed8f7916b6d3bcb11774beec35c3bcfa494a5869092bddb0120e2be5ee69613d7d8eb2a0d9d35eb59b852ddd7039ddeeb6fdefecacb219ad664bba339cce8dbaa0dde7349952d50fea5bf203d206e9410d9d5ad511905604e48b24c10ef9838044e10364f500593b40560e907503a46b80f40c908e01d22f40da991df23f81b416202b405280340137819c047411e095407b10a0e703660ea035a0c680a4052829608904dc8e5c02743a46a83d04c4669b96a37680240328156009074e841c918e00bc1b3d989fe52c041a08b50140c03e0bf5cea6e132eba6e1428dadc434a3f9e99294b6ffa71379163682f7572559588df70fde5fb5646136de5f85b330117c081e04ff81770fbc3fc8b3b00ebc7f38b3300e58d80634f0fe21cfc232f0fee2ccc230f0fe62122ea8830a3c074326fc6b020f0009fc8c08fc0625bc0c0d1ef02e073cd980ff180b7821057c0630763c062f74bc8b20047c0ba0fd3f3e07f89e56019e07c78f223c6b45801743d883aa103ea507f0f97bfc36c8a0b1060d92ee0e542af3c6365526a59452b3d65acd5a6b35abbb9beea69b8edba6caf49cce79def3736669b696b44d5592d236554976699baa2473b5b45d5b20021475e01e840e4865d45ac75d29ad2e8ca6bef6e9db2e8c17242b0a12a0370be1b656f73dad3992526bc4c462d28889ca83ec997119573ff43115bb64dd16df6aefca4c81b5598c0b4af5a36034c199a52e148c21111ff237b5f5ba73d8d502aa6daf81470197a98a2efbbecfa9c3be0fc34ba0c7626ab320d424f19248928106bce59686267b30cf3c66e60fb10b7f33d8623a57bccd90bc47240e5d77e3d2b789f3a52289adff6a1d8e2b276b6e541cd9f8c28832e704f3258b172b3f7c6a37579d5e9b3643ae4c4182c2c7ecde3bc590db146f9ee65421438708193a6f767e19f956a7c9ce4d21123463da9cc97264cc0e3ed0f4545d84c7bd67542882ea05ef92e5863d90a2bcf0040e49d6f4e0a17204a637299236d8f7a9d3681b6f20c80e4a529a9d925b0cf7de7be67246bcecfc37672373764673dbe10b13371e98e038e9971e155770e04185d6443502736e42b2b38e72e6a35cb1410ec745467035f0e0c412b934692a0c200ffa16e586c18ebe1026c03461f286085a7d619b413a4df5f77db9b466847b92018b3955541ebac9ae56a2aa83240140275142e4072a331ce194c44cddbaf75a81da17637def119897e20b96196e5fb00411e2e2f542133ca6f800c24c8f3b775455cc5c205bbe1c15b931aab9258131c6b51255315eb000e96168bc5021ae72efbd508454539e6091e18618f89c236a25301e9b7cf0a0291704c5f3c3ce679466421262c2b2effbdcafe1bf3453a8f58da90779bd3c31030c3ff0d0e5892759a89828f3c1d5609270c1a28b14607a58818548a50a7dbb3dd140097c0d2eb1c1f7f172dce0cb7881a01b2e0368727387006f96767e9f1a54451de04d83b09f347db0f1d7ab751fa64c0cb937ead6242e36fe7af18e373da08052a5885b93a8efde60c05fbd02c4877dffea5a2dff388e777c13bc0c7ffc131c66436c34c00f5a101f7276e8e123365eb1c7264f7b1cc791e7c7b1869a2766dce00065c94b6cb4628f4cecec31688fe3388e414cb1c7f136a161e7fcb5c765065d1afea9447847bdf7e8de7c5d5ad3f07decf2215564eb2f7969feaa7f690b77f7b85408da9f11d00cda3be8a6b486e9638ef975ce2d5147cb55c716a93792eaa9f882a018938fb44632a95d57e6af3a42527dbba48ae0b24deded2119ed307c6d66873bfcd12708a9891d3e8ca4a51d166087497576f83442a624b81d3e08e1dfc091a3b6c31d3e09483bfc067839eef04b88b2c337c14b0d76f82768c003667e76f82808216787af8297d46987bf82922276f82e7819801d7e0ac26f41f855167e350abfce94f076f8f5285c326587b44c6dc80ebf1a0999c0d9e16a874f6b520dc2c9e6e1e1712328239725489e6051e6c829889d150b9ff7ea4a699b19d2187166c98a18a49c3c2ca62c2eaeb25abf1ad5590a44f14d38417c0fa0b082135b7c17bc0449b0307c8ae2bfc4b721fe0df173e8b0c51fc14bbdc520517c2dfe68c316dfc7cbd616dfd65c567ed8f80ac6f83cab2031556903db02c0390bbbb31c13955d085ef1cdc2f049a55063077723f3d4a55605163b4b76fe1be7273ba3cceca2fe7a7325c69a57500675453becbcdc8ed80cf1c4092a40d847f7deab35d39ba10be6ac2b218b0d891e1832575ca983af2e82c8ce18835abbf961dfcbe406ccbe5aeed53dc163080d6a94e4e6cca1932fccca6432592d6652dce7c218eb7b5f7f7f69b3a34fbb3efdfa735dda083e7db373934aa421a7f6d8f96fe0c83102090d28e1dc19cbce7f82063cb064e7178197aa9d1f0515563062e777c14b71e74f819794a9cd959dbf055ed29051d9f9ab919719ecfc75e625656aa2cece5f8fbcb43b7fa579499994b4d9b96673c20c122fe953d2134d967849cf28fdd8f9eb93bae42565e289d999e66ef8c32fb808e9717172674a0f73c46b348e343632b1719a11858285d9da3d228a27963853840f497031534fb1cd1164593182b6b1255818cead5eaf7e64daabd5cbf032ffea5f2bd75d7d90d776fe7bcb01cece656e3a3495b91929f2f2a0a753487cf9487ceabaaba17bd60a1cedfa647a579c339d22e373df8d8d43000419363dc8a029738314ab5b73390bb33557426346f6fd7b1b4267df1b112e3c6f6138878669e7bf7173ce6770fbde7bd1d4b06f96a07c8687e2b38a51eee9fce0ccac913ba34474d76f3a93c3756105881927325acec0b9a1871d2b3936bd17b4ca2d0b19554f635056ca98b9c1032892ca0b3be79eee2d6f934e08a826281870609d9c1fdc24e4de7b732ec3c4c65c2e650386d606081ea88073859c55939332457490cd44994531c7ce0e70a2f0c939dbd9b901b98c0c43e2ed89cc9a177651a5cd131e53675f01ec7bc920897089a07e38a1a0220c9329a0186f511c37d24dbf3be6873008e8720b83031725374e715648e8e878ffb7f87adcdf27ba5e832e73d4b13a05a04d4f44408d0112f45037dc30c6094a961f4a7078281312314ab6ecfc3a1c7d8260bc8c170d1b453d4001264b13676863a6780374efbd37f70414985b8b36810973260c939d5f86185907d8c72d2306091b9c30c242cd1a3741f7de9b9a7d31c6f8de8bdbf96ff602c4ceba262f5860f0a586e60b9d334db92f413736d6a9f11193c3ba2eb41b5807030a78ac79634310738ed878ab8b04d3ce4f38672e465c96f6fdf0768161dff709e2b9f7de1cd6e59eeaadf7366d5152e60521256c504d4ad801b1ce4bfced6432590f8ce6e7f6635faccbe1f3bcb72909a59dd308e935e1eec069d2f28632e19c974f0ea3313f4f2f6ba9f73005f27a1606c20c4e6f7ed8aa1c012496fa7a7a499fd8a977d9969d52e92c0c9fe7ee89977ae9666145479ef841a40bed090723b1d4579c97d4899dfacac4969dfafae465c6b9d457a3afb34ab330cab339b1a10ed29d246c62a92676eaab8d69a7be22498185e19b1daa6fc29fe081d4a390fa15a428573bf524d40fb2309b7a19afd4136d0a283cccd0a93326966ab35358ae68b3533f42114388582289ca942453c4526c760a4b549b9d7a1f2fc39dfab0c71b0e7c10f1e2630d975913182f1138f08d4f7cf6d0b2417283200fa74d9bdae462b8b3b5d6667ead75d630b04eef16d31adff06dd78fc1c8febeafee3e9b11077e93c9b6991fe36b6b4f26dbf8da5935aa02029ee576fd2c1bdfda6ccdd65ef5d26cd9656db636ab596b0bc168db7e5a183efddc557605d39b5d14472c815ad3b473be21c90b41370cc618db706fc061b7705e2a23064814371c9527353fb5890a14624a10e60729b804e164c80dbb16b582a4d69c89d4361ea3efb86f1017362f4499420416b31b62e6a7d9e60bbcf7de1cb64d2693c97031c6f85e17e2c4ce5a9c6cb033ed69e7a79dff93767e19d989063b04d8f96d80e0376a2062e7c79123869d7f84ec3444b7f38de6b06aca2964e95eaa4548982a5c5e783a83e5327147b8f75279b22fc6187ff706e961bf767e1d52a7205a76ce1fe425751272c4c5c6453328a0bc1903a4ce13204b7c35cb1241ec8cb4091c6754538418b5c0f88eb853f7b7f30c3e9aa0a898a65b1d23597afcd88246740244d5ae06e0dc91c36eacde7db4f4e5429da04e15bba321477054cea4f0d744cece9846637a3caa61c688049d269a334107259240d9d2a587103320d30cb66661777667feaa4fe6fcf788e66576d5ecbab43bd316566325056273550778f9e2230899214e2662a686dae6b8c2f4e62a585cd9fd287fd5a733d69f62630f36c69f6ca45d8a9881135489297a44cd81820b0c64bcd4010216d9a6d8717952c31d1e8ce8b2f38f350930aa5c162b3f988aa0c2440d97336d9898618a171c8464c14689337390c2a21cac8091c5790107a4235baeac7210c64fcf19e41835e1e126268c969d7f0cfa2bf648c77a533cdc065d32f02842889d2074452089695712fb73d17193ab70d1c9e068c9420d15b1d6ca0e2df1b98ada767552a29daf6c16d6ea010a2b6fd42425c123e6bf4af2b26629428292c9b1e20910496a31ffd5929715cbf65fdd2c8c4e8144951dd434b1e64e915875cadd22846cff159a55115ae21bbe19d9feab232f69ab1a251ac0f65fc92cecb3f9ea6661b0344d30b10109599617625eaf6c7f3167611980220d97190c47dc78317f51e7656ddafee2cec28aa474a1730ba2071029b998bfc8f3b232f5e878a9bda4b72d51db5f8cf2520a2ded4c9cb2fdc5255e2a894b944800db5f34e2b03b13916cff7067611d643965376c39e2072de6f5b6fdc39e851559499a8107299e0843c74bcc3f3cbdac56b6bf28b3b0a21d664094441de1c4144d62fee2cccb5a65fb8bb4d9f61789382cc7fc43285aba1452a0d9fe219730e71fea28d1cb43dcf60f6516b622e28b8f2246342419625ea96c0eee30f1ac24f540c628e61fd6bcac360b2baaf9b882f4039ba727acc42a124a4f68961e53b67f38c5cb941d5a3a1454549cde498948dfed6c165624335285923b4d73e8f010f30793bcac476c3f01c8152e43929454d912ab523685a35b6374c509326b9cc4fc419c977529f754041a2f8bd0d2c3843152d26a94e8b7bf2aca61b6668246db5f159444164b619890924314318fb2fd553b0b2b32420c1646c8e4b8a9a14cac1ad1a362fbabe8a8a4d0d2a5b814d594edaf5aa252522d51a218db5f65b330bfed2c2c00599e9c7e14c1a58a0f31ff14cfcb0a653b04b2c029e28b6c49873b31ffd4e9659559d80958d63441eae196b426e6af9a79598ba01151d5bcf45719f112dcfe29285a7a0fde432a954ae92891d0f64fdd2ccc9352b8ed9f925958510d31dc7982c4eccd942462fea999979588ed9fa25958028eb0288933264e90a6987faae665b559187572e2310608254a309921e69f4af2b22a293d492d79e99f9ae265ca0e2dfd87ff888ad33b295190d39cc64b5af292d2dc93eeccf6d76874115a5629a4d046b6bf3ed2345da3442db6bf9659583d713a9e97b457868e97f72cb3fd73549642cb0a059573ce4b9408687bdd997967612eb2b0c14b9d249ee65089f97f3c2fab93edfff52cac2809162a3cd4a23851848798ff777a599b142dc5408bc2d60312999618135aceed329795a9327ddff7b3bde26416f65147d081a1d6841b2b31ff6fe6655db2fd3f9a85fdbca9e189343f9ed86245ccffab79599514fdc85901050d42404d5922e6ff25795985507ae2e59295ed3c766859932489dafe380ec62725f2d9fe78676155a92a613c84cd962cba00396289983f4ef2b226d9fe78e90b1b30338c91c3c312f3a4dc1394ed8fd178a9dafeb8082d2b0df4559f865dfdf19197e3fb631aae512270fb639985d51a8ee725edfd40c7cbd6f9439497aded7fa5d0520576a66cffbbe42af9df254aa4da2eb3b2a4ede6d9444e0f2957e0f4887945dafe59a4b8a37426dd993589790d62fb5f9985512ba0381244891270cc2cc5bc024123726b5efe35e225142d3fa0064663d7c250b0332f6b5ed2adf4c44b31c8f6b753bc14edd05201544bd4f6f738def3931295e06eb3b0221d82b8b3eb15f9716312f3f7242f2b92ed382f69ee49e725bd42440cdbdfd178115a062000468ebcb45ebb7103477b74bc0c82a294e2624955f2ba64b3b0b743bf61f420c5125ab04009728bf9a3e065fd61a7a029aac76e0831513ec4fc53e065f5613b511650d844e186c89c3631af3dd06a4c6cff6ac4ff02b4ac14a66d034af03f8112d1ed70664931c059f2858698db529061b146cd90296a726247b6ff5b18c5c910470a590e49597c89551eb6bf0d10ae0ca1dbbefd710ebb30d61b8f1b5b8c9f3281b2318f0bd76a5bdafab3857fbfce1c36a6e0caf4df3fe1be07eea3706f706ad8f75e195edeb771c3cb1c5bf6fd11eebd6e7ad817dcf74d191142da6687e1e966c9d65aeb373cb67e9f208d8118dd9cc862e3bff889a78df1ed893ab71b0f0a979b1b1e8fcf3943d46218e3cb01136d84f8c0f1484267071f7030220eee0c14b4288ce0eb84887dc31b6a1eadebe56173c5c80d8f25da54f1a6ea5074048d1218ac1c5171c3929a430a535d3bf76d853c9769086e638c3f28237af6f7fdebfb6e478e38b86384d836ace6d91acfe7af4b375c2eccceabac34cb5f6999ce8161e79ccb6fc2090eab3d994c262496df03f951c8bfc2999d7b76bee52721c8c23e5b0e3fe74c46d7daf90990225161aa88aa13ab4584f041effcb6c6e3748686adb5d65a6badb5d65aebf3848a62eb7024627f797f66a4eceff5f92ca921f67d5f8ecc1b1d96a1b2f1fbe00fd211d9f861605d131bbf0c0c0565e3a7e1e58c8d31bed39463daf77d8268fb5e27306cf67d194e6198ec5b468cd1be0fc2fd1b387268d9f74720a1012588a962df37e1fe095df6adb1afd39315fbbe08eea330a6cbbeafc27522c3c3beef8297449b9ed700aa97f9c4547f55e40b3eae4bb3439fcde94b133b0c432d4daef8a0c30c2824291c00507ba1c5d28d223968c064c38d53c8837ec12107a144af9cb3a33743603153e40a23229c6cb02304e651002e71926e14952171d820ad79a2710a1085e98803dcaee0c9a91520cb169a8b9ad317048e2ce6ec88407aa346062b3c0a10616af5c673623627032cb6d5155128e1e32983324110312314c408cd094ae60b2f033741847078b394249ab193434c672db464454c67195764dca1c1cd993b647c986122a3c6f5840c271a30c9d061860d6c90a0761862831d6624d9008a167480a25a34b920a2450e4a333c84ce08832aa89824ae2005e9848ab888c106151e19eaa882e8682e04391d1c09f2e225090f9ca04c51dcb0a2c511994cf6fe6375d9bedbbcaedeb6b37b31706b9a92c55112572c716bedde7bd75011c01a39619cd83061acb362c9ce0c53143033a78ac3ea08638c711a0e9cd6fc00015fbd32b2e5e75e4cc99431ba23674e4e86a598f9376cf3a5c3a8f171e58667c63034a489614e0c4fce541b40da448950eb5d938dc7f0522cdb39d49f539a31d47d0c3ae28e182e62a0764910f9eaf74981e2e2562816643cdc30a40a142140d4214e96d8f9de7bb323e1b9b968ca539029763a203fa4a935a4f0169db536b396426454720412902d4e8448e34483a8dbc0e60427bb49e1d173bb512a7c543164892290cceac44c5d69db1c91e8dcc315453cbabca0a64c151f3a3755c88f95283e2cf66d3f40d9a2d0f4a0d320e88ade111a2f3d1d86fc5083f8d0da13c6472ed3912cf6bd987ee4bf786a36c6b80928628e08416246caaece30d694ee15e1c6c0c40310ab9b04636c248b1dc8ecfbe17d3ae29bf33b8982f1bde5fd74b8bdd0c10c939128fb2681475c0f26a648f9c163882cea51a64d78a10e4a7e42a69a66d2e1872bc99356483871afce7696e89195abd8b0f33984999b1d2064d873611183903bb92361c45420aaabc9ec8c310e6915473ba04aa8e48cf695452bd1d4880000000100e315000028100e890563d1348bd234177314000f749a4a6a621f8804418ec3280832c818460021861042080098a124600c11ffc7650dbcd4cb98711aab0e0054ad79396e6642ec4bf0bf41ad9ed1c03d82c28d212417e3182f655cb188423aa6ce05885b859e7c6583725a44458206e05c44e08e8f79a0f438cdf5a926d936883732e0023b82527ce196c26e29366ec80c65dd167aada55ebe96548410e5a73b51151ddd31cf23237d9de59a1b4c20a5c3aee8fedc0609ce8b59c5bfc5cd6826fd16334a93e167074622c5b6cc81ccab145a9790ae2898263644b54eff2840a5b77232e83ae46d495f2b4df6900d1a9f0d136a351668e0b1fc3ddbb33c406f787eb67e84de183e6f6386aa5ca110e6b4851ac08dc8e906cd62a40999c36c012bc5feab22bb1cffcf9a654a0ffbbf9d69481fa279d80801c0bdc75b2cec466e01ba8739e2d0bf11bcc3fa2073a80514005c6ee0408d36e5bf699bccb60182a8ba4f1762534588cff8a3c48d8f040bdfc03f11977d00e8d557a9416b07076dd84871d5e5f176691ec636a9c077497c4b94ec5af98ebeb8537665576a66668b20204a8fb69ad4ceb8aea61719114786d00470fe1cba8b1bf0de39355dcf158bc51027f586edfcd2f259e697d17908adb4a20251eab379b07686fc3f01a2622dc563fe918737ff3ec94f1bcc85350ed03b15d84d3c67f1eab3d9ed1e5acbcaac0fb2b0221cc4c260075db0e4daf65b33e6ba216f9e0ea8255c39e0c499a169cebbe13c94a4aa452057aa34aaa8619aafa81b78672f94eded79c20871e2c2037397096d3792ba924128597e18bfd84c910236185cfc42a632cf885ff311dacfd604abb719e7cd76d3bf3d27de35827cb6f526ab26d601f373170b46f9ba3e2310d7a13c90694a84434140c1849236ecc7de934b07d6959c7a7b0b55536d6f39724478520099493491c618c6ef4de2e0176186e14878b434c72b382f8621b43bbc586693f90b9bc6143c7a25540ffc6e0f16cd9a23d366f7869a72ef424b934e151f500073ea8c545cbe4558bb9647ece9f3d7408179b407a918a2fa6d0227561523b07aab2670d47c4e4687fb769db552c91a4b735acd44abc27ac861b124463766f356d8a4e926258f77d575148bef12a2d020d0fea1f7ff01c3718d3325d5e58e2acb3ef90ad9bffdcc50498839f26f105b372626c7b13fa7dd7a10658425bd770cb68ad80032edf6e8bed11b97b9d5770d4e3484f2f8f8ac667d432a3a37f42556e58258bcca22528e0fced48331efc53271a3f66b51875384fbe0bfc0a13b8856906736087a52d70e8f3fc0f68bb73a05bf0870ed672017043dd0fb73aec3f713f3e268053e390303b25a637231232bf4b79910bacc91ab3f7653eb2af3bab4e45cf798d35c84df24dfa38b23b308668ff04592a577bb448b74e393f44c0afbfbc5fa709fce5b3e872d18b4541ca8437b9fb0a19345cabb00cd89700af98b4c86486d3e95c55eb04b988c4fb6036444ad5eefc234f0058475af4a4db3a880445cc7ad10dd1a7bcc0b18b353bed17d4b74c11c6c91f84d4cccea3eb78a38199938799f269562d3d50db6d07778077b2eecc6e00f058f46b8bc10684b7f7411f15820dff8efd786c2768b78296b96729b6128f945935dc253e228bf53dcb86929e7149619df17b80ae5bbb0cbe5158f071927b17aef809e1c0192e99d48e84863202f818adb639fb7fa223b840e09d9a4a99bf518b01ff9e814e7cc5945b505fba35918a0db8b35d0a04919504369a777e6d50f141e390215d5c59b09e8971efac6d9b67e9849264dfe423e6997c225c223bd1dc09fab865e4982b083b25a8b5793e73d6e773020020b5782cc36a17f989baad09bbbf62ed6d11142b4e4b5d7a8ad69a54b902219e6ae0d7382bdd2651e42b179ffca3ae3c4900ba85e5465681574a0a6a13ca1c68e96dbf9708039923fe9f101570c8e20e52747c506207da5c9b58df1f69b180d8f476bb25707958d53f82aeaa57cdec67de8abc55dad86c42b6f064ffe1058916181b825fe36db6becf3468ae3d09d5882b7210dba2239637fe4a2d29a9e3cfe9e425ea0e2bb8f1887f52d4b59ca5243881a9b6b8aa659216d00f33a1ad850961b0623e2a4586e6ddf01cfe8027cecd42bbc688dd386b843d73a4b804c453523fec85f607953aefa61a530ade95fd06a11bcada9592c79ab05518178994fe1067d7a8c5c718b16d27123c0d30a22f612151639f14f4565b47bc59babe0c44491a4db2251888f293327542767a3ddc02ad3134b3f70299b095c210c0746bdd6d517a1c0228e3464a3bae3f2acc1cf0ba043c9b9a8322963d789a89777992e03441e941fbe042e249c7e31e374fef82a47570b9de34ec14f2a12c56c4cd7a1fd3e57241b1045933e0b5baeda0c22f42836cd71fb9e821b6f674bc7343e996083f7062b9d963869277cee112708a1431a6d92831ea24969e4d510ac65c15a41025bca82b59404b688056b8904b61a0b668dca2ccf9671e7ed99aa8a8928e1425f1713bd4d03a3bf4f51e0a862941cb50da81e1405ed1594843e82661a5aa32daad319f5345834b3c06849b0e8a78151d16640abcb804a3c58d424307a6b307491a1c2682147b74ed04b07650be8e368bbd14f2554105a5451b578284b63f4b57d1136fdfc33322c9ead481f66f172b40455b9b1682517949594eaac9c5ab2a6bc16b564bb5b82944b65485954864a5bb94a5ab94a7a392a8b97e2d2b814298f4ab1d209cb25586999627968ecb234507a4ad936530297642508cb25c196c902978fc72559e934a558503a95ab2552954b835214ca26f14a3ddad261048ee47a4ff22137e970c22678d231dd62139e2e9f60424e896f0cd5f69aeddffb2018ae9e9f1b009a4e02fcebae9446d6cd2b1e41d7e8bb769e1b238e8ce1b02a0b381e011c2fafcf9759e9e5f0ff6cb96cd62f86a4836523bbdcf416e16e30f44f12916fad69c943e08083c339d502e1130e46a786618c0521c9fd41d024910a9c738d545e58a75d3fe979f185fbce09f5f8447b060556c2b67e9de2c90f3fc076b2c3b1ef8c7f75090a5148c7ed38b22ee49847d564052a5f4875f0a07ec133bd91d527cfb473fd71f3a704e22a07df3819633a6943e51e17fef22ac1503de31975e293ad4c9d3f70a5c2f9a9acfad3f9e59919b47f85b2381caf58bbc3fa1deb0c7b8aacd38315122cb202cdd44935cca8b65f5590ad85cdc19af50780ad4f641df6b1eacf44ec490085f4744749ea1c8879ae92da84faa9c7b98703bfac212ce4636f0898d923c59dc024c19ba6c15ece878c1fac5e72b50d3d8d61779c845379aa48f3141b68178202668b45f102d1809cc9cef0a8fc869414a98ba75e697b20753c15f1dc828b0e4d0fa035eac88d0809fd0ceb6c2c4fadc5791965534e05af20e8a6af040ecb997dc4337492e2484d50d4e64f547d939e51ace75f39cb33b3bf05c3b4ad816d3c3693d7cd1b0dc9279d1a618194a262e364ca490ae1d485186316e20814d1fb4017a10c9e54fd47b2f44c378b622bf320fdda4f0c283d79dc14a09342fad8530c98fa9763ae56b4a5a5e525806fb26aa9b5f67eae6b3f98e4e75bde327018de3a211404ece879e1dcad1131ac489ac80329de2040e507d4b049c1ca11c4379a5d56d7c202aebb38e4dfc8832ec433cb8b6d37febb76ecf83627c6829daf1b978bfe3a4ac40fb1749051e00099c2b23ae8ca57b1642cb2a9dff3e8ab81b081b7648ad6c3dd7c414a4804f7731f01160e1e5054a136759dffc2577f8365486b6151ff056ff7dc3ffa6e0e11c54de0ba517d427ba57ff2513010d5f9c41de21843f58ce7d76032caf3f6c79869f4d52d95e264ad743ff98104559b8f3188358f449e72615636e1093bf63f11ad906a5eecce91c5013deca9684a049f35d4cd55a7a26aa46e585817da165a3caa97ca525e7764af1a85c357577258369528d2589af7d44447d61422cffa3855d5a420c07df158834f7a2cf2ac2c0f082f3c21d067e3bd8f2b2133b3ccaac3eaea8b733a3ee422096e52f79e6c9637c48d39f047a6c13b47cccf25dea6cc19978f032decda15598edda3de3cd43923fb26ac5fa3b2205ae4480d48f0b9ff059548811f3c2d8f48240783ffcb1e72b617a7ebf26edaf0f0f8962dcaa21382baa2d3eb7b728827e436649ce08739d0b5254181981e6e0c3a185af17331a8df46779cfb6b8e2315d291209c41f47346ac4583bdcda2f2c87b3b8c1c3c64c68a2e3b1242ff5e62eebaa0397c3edf0bd14c3762007cf1ea008c904019053cf907af46a6273f1ce166b20c141af0e73415d40a713cf844e9e0fa9dab74ea362ad82c3ba56e24f979b0ebc5db762ea31ec425e0f29ca4100e30645df35fb40c239eb4a6b1db7d0e233eb7081284e7da9f3261f07f2f3a2800c4ba85bb6c12a2de76027a8355b5862eabe2478c2fb58a12b26b9bc05c594190c141be52003bc569813f872ea5e77c875572d5fec24a25baff86a49af95ba04d62294c006d84ac880c844aa7b0436cb427d08087b2f9b8a3301882a5102dc588af356d780f6df9b48b1a91a87cf483036d542360ba6bb7945beeda87ded84c487f7eb5a1fb9915dc700db195674812340a6d616e9d3522a230dde763d32b3e01236d813a65040baaeee41809e5f054af89592b9164eea2d6eb09cb4f6f57fad38cc03168b74a3cbea7113b45736a7f4c4e4de423b0524292a51048f7838e3511acc216148dba9938c7092ba6f4caeba0b7952af199cb346a08f60df8c2111ee5625febc29bf0e08e26d63cd718f7fd37a400578a8c0d0677007f588de9b8ca674af0c08aca074044460c2e8bfe60578104dd34b8f771b186db54af2ee20938ae8176274495c4198712a4034e03678968020341ebcc0cfae3be57116ca70788a0d62c3bbbf15dff29cd4630729cd54b2a5417cc3fbc18135ead3e718d7820daf13f065c540111d7d4e4e0f536d93702fb9caaa9966b3764019f80e7e8e7cc99240e6c58ab4b98fac1d9c9e093ca92115a5348aa00fb23211d3a813168ae5665f3845b6455aea0317cf68c70127ca9e1c91c3e992103fb1469c310c13799578cee38fcd370efcc8688c9e70997da022047d4fdf5dce7ba01c17aa48fc77aa4524cf40fa3691ce8911f49b104cc6fb7dad995fc9cd1aa4142ce742c49cafe11931a18c9b61b89248d95340a79da9eac6b7119034c34053f8d8316e712200c833bc28f97f8216bfbe58744128661ad7028620be712fe3ab1cc994577fe3ce52ba062927242ce48f852f5650aada733329c3b1da642065346e716f6c45dd0913b81304c2618a95d821fd3358b99604a8473bd65927bb9f3155b18443edbb04da64285089edbf8fc1de39d699eb8c0248b469456ed8a527a50dc3499703f6cd3f50650d2ab645d84053cb0ec4765b0ff3da092a82dfe8937ce6663e8fedb9c12778b34100ac4304f06a3848003a8dc5410e48bcfc848dd94817b8b21fd7c07f6bf16659a9d26822199e7b0c10dca88a2375996e869e863f38834997bfee36a655b77f6a20cd5840d8b503c7e91a18f82a0d200c6a22d87de101e714005be187e50520c54d9ed17615788b160ca7dee10fe7a055186f2ba1d599d5b5691555b3432cf238eabfbcf232205cbf2e52460aa4d7bf4ecf2e1baad21d397abdda2fc5278d1120cf2c231d096fc326be85a7b6968645a10ab7b93b025086ad9049ac4ad436a4f96f408c051767ca1279b22c58a8221c9288233523dda6f05256d35c49ed6c708fca5cb673029589df5f9589afa62e01c157185924695a833fa7359ce87b33dda2a50004b410158adfb97e1a8db7e3756d013babc1032812987d23f8940bffb1d8d646b3ab8123e8466055727035a40011c6b9748459fde941d973cf7066238ec8f469144a6611b9b72c9e46427dc20c7ee33a5621e5dea14336ddac1bc1976ffc8eaccd22d557f4a29ff80a9b30ef6a38e7117fd4d20bd8ae19adcb767741307024bed03fd23fe2a9a3dd24343ca9e419f6b919955a9e5b4b76def88289338eb095615136cd4f894571abac708c38619b4d8302236874cc7c0af5977b56b1b2fbca7804c32e23c548bfc9f3ec2686ff57dea4f5b5f9e2617aa944140009a69e94fe2f61d88f650a208d3a83bfd47b33a4fab89194804691c32c5dcd94e5836a2f8dbccd46027bddb24f69b1c4fe7270111d582918f46a172b78206c54280f5a2394c4c8c443ed50bb28055b2213b4175d547326bd447b4550566c3b9c12299d4ae1b648b19018c0713f5b9b94b0676fdb3add8a096365c94a0407fe31f8bee924fc894d37e43e56f463089c53b20dc12a9f1e709bf8dcdae5c1860fa7e850925d1c46b8421d70b72cd2b131e1892750ec7dcbbb338c923c2b2bf706d8848298ba4982524a0b86c871d415133cf060ae450500e0ecf7cbcdac977c2006d4343349451ac045298e32ebdd94938e8ceebc7ece12583a6c84d2e3d269b8ff1975034f5c0983d97327854bd97f862336d3e3c6c041d5bc64e1d401fc28333ce6e18b83ae261db7355e081b05bfa74fedbfa7754ab310506972d90ca7dd314663a05d97ead8c09999d08de8ed650ca79a9a87d0599b46c890ba3cc2122ea988f7289b4a7e2f06a6e81525495354cbc4c3be7bef781390a6c478d0d02cfc109f02ed7f61fab9bd3f878f5487a15c0e304d00fa458f0632c9a4e0f9ebd1aef8e3afd50955e0db9d89202aa6507e43720c7f4937c2da068aa08e047a2e36641887c39880363bb6a6e6b0518a6e0c8bc14dbc7ea923f15f9f185f519a6c7c72b8e54cddb7999e0cb9459e7e0425fba3b5c7365fde24e993c46948cdc8c001a5332c2663e246d98738c12434a268ada728cef2b1234829607d5b0f6cc5461f98280e61c84c6f5128d57257e18601cb0d53f697f5f6433d6cf0ee709d07afea5383cb75dfa0231ae89ca2090307500f1bf40070acab36df9d36d67ccddaa857ffde5b02c5150a99224a0ab7cd7e71431d560754b3715483f22bdd42af4f3e43328d56ffc76d98e8209f4786114c038ad05dfe1478b2aa0032f20808d8f1aac3fe90deff50e4f5551ca78ac38566dd28ebff4b794c5c4d5982cacfc43c6f8ecdd3371470097f9258d8f60c50af2e889632801695a7d5145ac9f7c9c51601f22512da43229314860d351070a1c1bf6611270574fa0698a195b80088aa7f182d912d93a2fd03e44c2d4e193e50dd34945e852bfba06effe2fe1e5e801d1268408ec76097ffe27fd182ac4c701cbd3877803e1f008cd592000af1c9dea2ad520fcefe291a6dfc3fc9267b53bc240097aa8534b2c141f28125b03b31b3ce1d41e954a457218429dbdf90c0e0fefc8689ffdd75db852d34fa9a7011e390b5a4c95cba832794346994cbda9160fbb04284bcfdecd9fc01f9b184205b3489c00017487ec4217cb8a53ad3f02af2d6426645b09b38fcc9149c1fd654844056a4e4b89a731ec2ae9af66460af0101310441b8fa7d5d49546a06017cabc1d07fcf9967370e81a00f5900262c19b0002056e14f2d84475ab9ffced7a005ae0ec07535b3f12ae187517705295cb1198d53e51ac0efe39822a5b6f7253dc0f66e05402bfe86735f2c994e67b7c3888ccc9f7713ceea30a5bf86186c6fa6c80eae604ac9caac537b31397b788c4be8fd67bbae3a311d839c2c46fc23aacae6f04b6b7e8549298640c1a5756417b07dd519647fb4774b27a0bdf5e2445cd7985848e94faa7554964b27e377a3dcfc081364dc31e48ac50d3efd4c135653394cc537dc7a0e35716ae4998ac8b96df425e88d08b650e36fbc6caee5d8cbf2fd356a744986a5a06d654cc648711013046604a77c2dc79d28d92c2fd0f031487f4643bc2b74e8093e920e07008149258b2ee5d4d075ce30a9075944bba06b4bfafc3188b51a9141e02cd40effce138826d33493940c0fdac2cd3ca7ad78975a31dad91604937ace0c605b6e1ac978b0a9184b6d0633937a7ab9b4b5ca19b5be7429574bc1c6ebb742ffe3dec20a723fa2cda8230090ef29adafa2e703915b18a9206d3991a5204a7194f905548cb5f155a904d43d4e818035f285d39faad1030d664e8375ba1c7623b7c71e695fa28a676f153467891fd4e5db102b86ac87d4228d94811ae35fb56a3678833cf16fa3dbcb8c4b833f30073dc3117850d60dc6043e9cb5988521c5742a7297e8c4ae82c6753e50a09e330f586ea838b363285c022cd6526f8ba5f4d05f174fc083a61f4c7e90f3a90232fd97a00e61c1d8068329bce2affd73d09dbce7b8aa1e29815c027cf176cbf27ad3cc2e16a1b438a53f290562c1d0b7df2b0ee0c34a704179b4990f1a412c0417e9511344f096a7a410a13445471ff300a930685aaf35cd1bce48b8574277e58590ae3b0b8bb90b094e293fb031539c00cbdc97f3a7d724362e74cb77cb6203ef8beb2a0100e0a1ae2721a4892b2a5c1f832ea228d43755e1650ae5a518f901cdd512cb5fc30f21d455c71927695946a53dec7af1f93752da6cf1cd0fb12a05ac2576d62a576539489a782936339164fe2d36e0633e190673dcfd8fb133395af5322c26611ab698cf3419013637877cc6f51c036de30a2618ddc9d4e78f8a92a65d920ae105b2c423d0f8b648824ece491cd4273195e8bab28388c5b66c9a129a5ee2cfea75dc2b95d3294fe4c31c9edcfdf578d3f2c151f4d517684199673b5521e0d6685d6cf336322cf401436d0d52f648e668afbccd8d4bdc0b9a25d24b0aed8f03c1e5e243288693efd5f40983dce798f0b1b8da59b1d89be805c7af555be47bf4f1502a7584c251ecc670409030045f9b08c6d3a3121b097ed7d598e74cb4a08154ae86ca065bd5fc2d426fa05243d5e0a7666fb986242880b5575f98543865647977023ff9b4a6018104d06f646c50b4122dfec082aae37c56e6821dd278d457ae31a97080ec05170cdd8b0d246857b285009bb8fef72e520a5fecfbdb36c138109e9173c800e30511953aaea6e81067635d0106b9bbf26833a28d67e18ba117abcfe2d8a01b30afaebae381cbf48b01d44fda11213d439678e832381fde9d0cace1959528e757ad186d6eceba615fa50d662ccbb181644c974db9598f022f0f4ff64b6fa74c93315930fd4c5f3fa42e6e1c735c5e36381f98627666e8ed0e733003d691a6dc18d591fc11147038490a247bc8ab49a54d912fc5ee2598f7af7446cbfd057bcfedb69a1638ef4fc9e8a3ceaaf20ba3eabf260115d9c265b7cdefe8c389f4cbc886b0b28e156319cbc7317b72d897b050368c38303ce4a6750a4abbf80336160d56a4ac00bdcc4d9657bb05255c58780fbd0ccb25b801a5bdc7d5a878f4f202e3bb0cb4a5b419b74d93c242e429a45d16361830433a146000af08b6a3045e85408f774c928b1bebe390b6a849859f611013c1af1ca7b2c73718155812a75e32a307c3a46a09ae561e13e27373708b8741113f737c2e3b3a808f928dc50ecc709ed8c5fa80f359754a9f9d94997b5048ad33e4f2335a26aa761d1781c28c7918343db2183ced3f0c94128ea7d64071e1e6ea40bc350690afbd040fe9454b727a5ca72bc454117433ae88a43abb15570c0f5372d73c830c5caba32e1e55ae935b76c5e9c6704f005930214eb58c168a3cb5ae7aafff13702d880dc06a754b86b35a81c8b9a13ba0c5e09bf992952b6ffedc0ee4eafbca3286480cf3f67c3df09658bdc402a055734bf36a673123868bd1642bc875547433c68a1b540fb24a88b4f739314d07dc7c2005a12ea7a90dfd54dfeddc9ddfadf923f74d2a7fc1586864124adc1520e3a83219c956d074f147ec790e1f9a3c6f7fb3460c29d60f0477614eb488f119831860b211d9ec123314312b04ec16aa6a1c55dfe10c295f6f971257240db2fc95cb3c52d29ca20e6330681e33ba1031b9818f3b791e06280578bea968b49a10d8b068541117453a02e206e496d4082fedb97e0451a41eac0cb2aa9cdc053a7d0b346b126e8f17a01adec8d7cc0f963674c89b0f4771c85a2c2904ea1044b37f4d7ff9dc605f48833641e8ccaf965866e5cb580885ea3ce4460c7ccd0a224b2fc12919b6d90097f17ed1da2958180221d4dca4e49b76929164dca8e1493b071ecb0e71f8d8261ae7c39a676ee1fc032a50ad06ca727253ba87dd34332c80e03123056cd7ecd2c73d72a214c0044a8a6a9180e8a1d0fbbae29681ac53e104d8dd5c359333b828019962cacf14c7c3313ce70146760f3a6890f44d81c0c8387f3ec152750a6cd199fcba775ceb8668db88319c57530d049747a39ba65705763d162b990d54ce2f632c229333d30d06215305f2194cfc95ba684cc4bf8a479bb6eb9614dbbec343a7decbc3ecf89cc3c54b0a039ed45a1ebfaf99e9dfad1c2e7c8ebea59a611a84ffe7315ee0018117ee4605a61b4f429aef0ae29a174003cb73484b7a7d453acbac800d18155772ebae90b0e877af845e5d35280fa4d7929e852f00c802c9803fa64127f6b8900919e2ecd6aa1d63ee6ef9da94c0eebd4a375190f277d7c851ae2346698b2472d36a364c1da3fc6f50b48174bb907f7b0da9d169f7c5c446d0ef443cf234e92d70b95ba407ac7bf62cde16716056dccd038c9bf13a14e50d7569ae9b1ea40813b7257aafdbdcf43d8e9f63a2112d8c98a9045478902b01323ae755ab87c5da77278d6b0c2674536acaf53fd59c398b03d1ba38f0fb07cfd92ac670dc217389b4539300c9403759bfca9b361685f60e9cf69c3203a8f0f710082a765c888f7922526378907b458028d5e81a0d7c07c20e2f8465007e5f0cf9cb16747a6bfbc921ec80dbe97181f74331c84886a85b9010970629007769afdc7e4c19268a029621b63b10e52dc1cdef258ebff445f26f42e0a4f22bb4c61961fc8a7f88b729f98ebd598e16b3efd575dd689c3702a5a74a16ab8c5d0ac0a93a6e4a102a6ecc85a1d4bdc45f396f2577a31fc8a3009832cb088e5a2d693a157272a8c181489cafcbba62155aa5c53bc778187008cbb99dad44305289f5646deb366afa1a71be5961731fbc1527499996ffdce404d8371eeef661a63c5faf0627b3598a3a9b63e6f2e81302ae32a5bc34cfed82b6cc2de05418f74c2a63120bf757e9518cf2b8f28416a0a7c9b2b531b889f96746723f66ef2326bfc767a410dd5edc97652dc4581fe10a3d2c26b3b9ac8cd60aead044a828cae7f4ee446390be1ac222984cd081f289fd9895e6897c5e29ad9507ce7ffd2746ceb0faa977a5edec74c94bbd86cbda725fcad9af129d6e27ad60f326bd1363de8028295f2208fd708f1408fcfc64f0a3e148e3bde861fdb31f98444dfad1493da0d125558ce77bd1a5086be4727f7f74a7c10d8dc26fb8d2568a65db2b57d4a1b664fc1b21d8e60ff162694986a847d69a849c30ef70a12d4a49d2afe370b93fe8feec02448f09d3b11b0e884fe23bbfd525f19f5a4c5b0ac3d0f3dd17a07351c60130ad16c3a65b79efe66ac92382d45ade97d2985bc0dc976c09d74a1959f95601c445ac293a2c71521c81f7d7b428315a20ae43cd65602635de14918792e53b09136853b10eb5e7fa5186b8217f249bb64592e17225929d991109f8198257540b45c39e5e4ae8dacee14a2186084cda2d4681efe16d801d10b5eeca3723908306a4955b079c164f90ba4b2e7a3e85015de5f5fd3e2b84248c9bb150ea26e317474c68afc85f618cee16e2e7a1eec93ca7ed0540b825eb31f6c32776e988396fe0d1b00d9058835eb667b872ea81bfedc1c2828eebc148e15c95b9841113dcbfcbac2d2767f8d3747f06034eed73be37006e7a2bf6f1cf8abaccf0809f9da386a7c035c4e55a05d18e56d7d08826b97901a1495688d2a411f86d5be484d4130bd1a8e6870fe3e93f1ae781ec8fa876e22ba09270833d120866c60a91fb2880e4d1b86ba3e5c60079ad29231a526fdfd35b7b2edbaf9c3d466cc5be64a867b254bd8e131bf5856b4cae110e11c0743b3158d8cd02cad8f20490fb27c7a5218eda5fc2d08cc1cc1d675f5726a07e1f312227c753d415837002e91fc58b204ffa59a8f6a9d804094ef9748407a73fedfe3c9933d5e1c404b0087e2093adc0cb3c32904c97fa09640dc2ff35674de96a3192733a15a7060f268a7669f981cd1b089b14757628eed022e7bf33818d1a9b3767ced0cbebdf7bd84630642d37f79e1a9f6421228a80d8c40588e84affcd8c09954f8b433d78d22bd890d24644259e85c5ba5f3b5f119f5f51f0e6346677fabb0dc1ca8dc1bceedf220433ca1a7e39a6744404c4d4f10fec7dd55575521bb4e02063de88f6bebfbf1326bb4f7f08ecbb76720ff9a0dd762002e7c166086ff5c233c5699aea5bb6c8fcbd87506898d59adeb9ca748821a6b80a5fbcb45e5347dab86af48a7b80373c1d69ca1f00e0a40c88da3b6b2ada4905c37e98379a4f419966a6ac0b7bac6455e28eea46cbbcbd9b4848de409d3e655f07d4f2351893cadc7a3cf7a06e2d09aca6c196a808fd6d82dcb642959de834bc2e15e14d98d0e009751efc3148758450a349e0b8fe900be0436304f68e68c83592653d3c8f05b5ae404dd65bff0a8081cc0e17f202ebac6a865b9f1f7f9ec84152170d34c49042cc1a1b207b201179bbf9df081698ffa60fe3ae0ee24efea64ad88385230b9fee85bb619e61010a93c7b62e18a92fc8c1204ebd87a716b24704db1604a1ec3a81d61ec097c705228a96e7d278212f811eb97cc8841e0a52b109036f2374cdf07b99aac540a012a16095d269b61bda3d6c00fc81cb78786120757a531df90448d04dc955c496155e3f7d37bab050ae26fb7ecd405c44b602449e1e1e80e17fcbb03f5c23124845770f37fc437414a0280bf2786b35d8eb621baba32216abe68bd3efc4e66de0d37ccdbd10cadfc43a54981c0a9566ca713f8830c6b4354bf2684234c504617b245d4bd89d1c4a4ab7bf3200815eb687e61d65bb9d0b41bf6ad7502d6a315a32d11ced44029c5a7f575407a30ee3e397ef55014f003f573979ec0dc4ce61acb2f448cb0ac7826693fc2dd21a0be1fd72ae95ac91611ef25cb5f146f7939c035772b3f951aa482435aae8bd7aa8e9a5ddddd3a3298a3faca1d89e9b5e220df88cc3af50f14c00e29f8634c45f76e351f6038f48dd9a83e1d5e644aa60ff222c01763e1266bd27d257c3689e01423bf31c3049696231117623324bbb5e8616a40220525b93cba01de511e5ea7467ab7368250dc04d7bfd3d7116a3d456a298c4c9feaab5762ef390f270b215ed02ca234e751efb035d6033cf122de7d86513deab6994f13e42a6cfa5a2027deabeb3a48c3cce4ee6e7af0a9d447617c1a16f4521adb938e5f58bfff467d5cd3b8f94d45a08e74abaf2e925132b61e8b6361346a95e2e73b33ba4328ea2c98edb4316b5c56006b858df5a57d5f76a872a5705ab083fe28d47519e343aef3bf94c33de5291007897c93018480333a21cf91250f4545cc8895ca3ad0bca8d66a95eac473d6ce480fad2a6494ff7d923057a1337c69be124cbbbe0034815a5005eee83ec766d48df327baa3008353d4367c8c079e87dea9aa958d01df930a70165b217b9738ce88ea77106fe7aae1a23db4ce621862809fb13adb405a8c25d7cc7e6929bd2402062acf01b16a4b9f69dfca3438924101ded698bbc828df57f8aecb90672054cce13e288436570b0189aefaccd124b2ae148371d427ace787324abac7dc5d168aec2ecb6f5bfc0374a99acd52ebfdf9c27c183983e0a21948bc3d76c69739aff71e3bb5d14ddeee4a2a6c6e332e9786fd2e1b689f117074ea4f7ac2251d95767c8aab6ea6236224ab4a81d14c68f5a6f94aed3c624c6d319a3afc6e02151b4710e1300abde01bbb9592f325f402aa37dbd3ed09a40992d05f3b82a20f40ead57783c39b97ee629c9ba5faf48cb36afafa7d0cd56c3d1440a6a5dd7c0b1d699f9fbf1d5e072dec96fa9573a87c25fa4c5b969cb76410608d057b98ec87be16e73204515b6a2502d6c3caad2ebd469bbeb8e194243d7183b408c904b8a5e85ad49009edc692a1d982bb12493a8e83fa958581cffbb73b10a79c60c30c94c622d4b8c63057490f8f99f6472b0ecb2643650e18b9f2b68d790a072edb72f5fbec21937d24e8745cb59362236314707d5e03351803e8bf132d94757538a912b90ee1fd3de005dc6f8ed254c187aed1af4c18eec73659d7431259fedc5a8ab9e315a51fb7b65b6a102f5a9752e20cbed587802f5cc0d3556146d98351888d44058cce8f36713ff38345e9d3f826e2bc68a58818d4dc4e0fdd8924930464ea537130716847cf5c2363e44ce590c0c60e011326f890c6a77008f0f6169954530aa3deca705562e4375be5293d40218f832bcbdbba7a584578db61365b93e168df7a69aa0d920f26ceee47352001df63f07e23788ab16134a33d26ef711a04ef0b5d34cdfe652f4b7909d0c14c84b2c8cdee7e1c287913e004aba403e4837a337a4d63e752eec18d779fdc27175e4a4e95a2f08b4c9a6a453850d71f44e8080de4114105e7af98bc9d42f7faec9ea34581ac760f71fafd5e51d7a2055d0939c432f6583057b8cdc8b2be71598e1b9c7c8ff9539b01e40cac5104ff28eb5cf3165324a766eddf9fae92b9cb13d38239cd5f67f6a260609156b78baeeae6e0c4490ab00cd108dc45c9748f083fb4b0d14edc116c39737e0cc6c3d13b768ae2e075e4bab85f2bc9cd7d83c8735c3f29a0cc0e0bb807d0a495a086f0f0f55bbbde9598e1796b0d54d3c9cf9ae9646cc10b507bf5a0f333e84eb68856f03cef4741327623abdaf3a388a4c76886fbcf3769f0114dc9fe3436458774844d2a4de526198357ed726c6ae656ffeaa4889b9dfd7d1c8eba48592fac502b337b724bf2cd35bbdc51d9443e06efeb4853623325b02bfae85d64c22a0546cf2a3818425144741b32dcc10fb94802f1e47392a66023a7be9540a696c03f63b1f80cb39224c139ba848b05b1b0efabe1a4a2bf654e7e819e45e3cc33532ecfa6c1c64180123edee74a2a70cf65ddf3c6053abda05fabc9787bbc12be0977777f2241493a4fda09cda0dbbaeb851cbd5392a82f8f40a9b1644cf237792964fc8dd71d80aba2c216ee6704b578d4273372cb1d2591cf2eaee96eda1b1c471d067fcef119baf8c78d241972064a4a112433ecb056adcf1cc3e9ac0db67ce3178ed1b8e402f59ef5f6398551a10c7ce2a84c4354a7a8d2163b51d259c3347ce70ec72453f7745e285cf8f9f0a6c8ef662278fa2a5ccd45902cfd5150e4a43dd67c0a0635bc2688ba8bd3fe292c68e1194cdd0e290a9d40186548fe77fffdbb2f572bff7793dd47e545b6915e7d20a4e442278ce7b27780d2f4d52a663115c426ea8be640789d698f8caa472a97b696e3d2c97fb9e6676d4c554d7cd95a21896bd37be2892be787cdbdc966856dc61ff775bfe813b33fb2145a0889847ba5f405ae1428252e11c05ca8853e42c02a2e863c207635e65a0603ae3d5082f31f787532159018a216a89bf648f2bb8fb2fc10d422f8453bfce8212c9de3336cf7551164f1aa3e2c20a9b269b8c3180784d90f27809daa2f4867d17a74a3ea404c006aa7fb6db9866671e44355406ee7ef48b3c8c4d55fa663e6290285c288486e8c46369e2d63224358ef2077db1b4641195c366d4e9b69890eb57fda45e503054151f0d825a4f4cd5b4acd81ac850a476ee7e54c5fae7898d1b10394f18b1716f7e605777bfa5b433fe946a6d6955084486552605b6de46a1cf86c388f9b1b6306508743b5c32d960f3ca7842c7223325d7b273051ba5c62b65fc8e503fa618b1358fe2f1da4ea3c02cf6ae7096079dc6dd01d8146d47499531d812026b9b10bcf81d32577ea965b5f472097bda8cb5f5708cfab88d8086dcd3ac4e1370acfe14ee03468e0dba626d8b615b4d29021d710aff6a5c9bb97f7147582a8fd60b6845e27f578ed883d04bff19ebb292042adfe013b7554f0b97de6d368a2d8834cb91ce0b42a96d79b7a30ba4e338aba5cd429ed5d31f19b4eeaf96dd1ef707cdf63754b8330b7fe032fb494c2ed5a7eaa8c423969fad73bedbe420b7420377a9972650f0dde67e885911ea8ed8da98f6f66b55765d128d675ed889dd07bba7e806cb4bcc2edbc388500473817fae797e0922fdbdb4ade82388db7d18f982919c9a7a9b599e0ded22c1e5b952917e9adc3eb0c7a31e80525bd31c0f50d547b50197d0add5f8b38ab7a30bb4a338abb56c4c93dbf166a1fc26e79cfce3410d0167fc09a9ad5784e8ba6169069a744737b40f9a38eab9bba323469b5341b9c5a1eb49b35b8b73e132e5ad0ca928960c7a999df63ce72d5b2699e13a4da0dc089649b67e8c5400f94f486594c3750d973f56828ee726dc450d5cfc015cd51eafaa2a7b457e530bfc1c95e2f2b6903c6b5bd674f0a4491f51ff8a40e144eaec5538971d285d0bbfd09e7b2591f6cd2168c6bfbce9e741023cb1fe0911e28b95c8ba711e37417a1ed7813dc9564c63aa655d70a3f61f2c62a5f174c90f0afc643a16560d6e7e27bd9393b38e7686529827e1e86c4d0988c1faebde33ddab8812e234f09f3927685695e104cc3e3ba1e579d2dec794d49eda25db1127d1f870e933e48f4d06acab2062e5f66f7f5146e6eaabe6afc112424d563f651b1269f0ea290b1cd3a370d4e20996ddcd3e1148a0794da15a152d0ed59621fbc45f4a73b639a25bb914066281cd257c7f32fc3259b9126b5ac4986c807a5d695dd4f8f6aa19ea64d9f23f5272acb9d9739639f3593eb35a3dc5d0755e4534b658a546127cfca71cec282895b93a00f7926ded04c90e37754f433754dd394ba1a45ffe45b86ecc90121d8fbf3000cc6d76b4ab92b5cb4834a496e152159964dc580f2ccdad1537417542b41252e899a24fa32053bec70388cc32c710c1e65e0cfa04bd1b48154eea5a678dbf510f48a6f78acaa8a74be160f21170f3b702d1a2d232f4ea0f510f232ffa4420609a5c5c04fc1654023f5f752a87ca54c3b5016a8351be4f2ce8fd334c09c5b771b9813e88200d350b677d493176ae331f346e3556266a79a098493bbee0441ecc4f954a391854175acfd1a14aa200360fdd8cb5185542c089744f0e0c17d9b22723404c50717704b0adf769193ec2b4cfc5b4ed615be9febb618464ea836c2f9386151c32e50108bcc3a61ea38b3ec0099cb9449ddeaee52982a6e36cd84b877c925c8827bbfa58ea88e78d021f8884bfd2374789935d577a870c96b6aac5810a1d65478b54a6a8e7e76c7e3ce2af5db2f0077882dc4ed7226a501e34be0ed2b27a62c2fa6fe5684789311b598afe6df77a713a52fb2ff646080e0d383d2037dac207c52b703de50225ead99ce98fc52c885dc3e4481cf6efd7768683f0bc28b2f4260dfbf48b37bc5f7f6c72bd80f028a30ddaf62c7c07448c8a07405440b40a2bc6fbee5c866083b3e823852d155cd28cc44ac551d72cf18c4fbca91bfa783e528f79142daa846601b43294452002641c320bcda2c601df178691f01188b13d411902aa8a66231ab5df15eb43d9539468dcac7b21b2c1529dc82dcc0612da4a03446b02fe432aa86f8461064414e17b157a2650c1d6fec91bcb8e0042c8ed892a20087307ab162be61360646241a19b144a3966a5005931252a52f4fad8069d436a8d697648ad6ea265d58885c7f1cfab277f4f65d2c3d887d817828aeb7885ff1a0325782e415c63a3c3fc476bddf09c6c39ceefe2fdee84a75fb505f509d135b9a52888300c64af389ce7272175e4949cd0e1dd87f0edde5e6eeeef1f5bfb330c004a98f5d9117e8942f18b08a37fbd38de5a43ee1325f56d2e1233ef7cfe39a8a00cee9568ea26f7d73c065752ddf39e0c2eee256dc0ebfa6c3cd462f154ffd53bc9614f9d43895be3ff47751ec0f18407ca51a33ac99a580203aa88fbcc71b7d8a4d44757c667f52d0aff828e84855803c94a097bd5ab4aeecd1a9e43177268c89b037bfa284182ed723fb780771bd25787aeb9141e2578ff9dabb7ab4a8c1d5a34436ad1ec0feee1c37528fd85a8e7ae8142bea21a5e9a647f2aa353d9c19b0b7cdf6ab32f7cda8f81e0b605cd073c21ee0e77ba41b777cbf3b9c128af1c98622d98f2a090d90adcd324f63d37322bc8dd536368117ac4677b1d8ccbd8b6a24874f0d8970d4704f448d37b7a7f1967b1aa5384d239253263d773cae79f6354b944983de9234ee70346ba88d46ebd3f7d1270d0530e57768144b169964907ff7b48c45d0389b82a071d866de3c74a340038f1540c30dee11b8d22106b8103fb5a5c653d4140caa3e0c8600d68219cef403cd9decf5b26d6c99fa889b3f803869b6d0e77c6d085505b355efc2285cec965e18124698e1ab7751955dfdc487243102fe0bf5ac2f6ed512232f5f2d0e75d614796a377a6d7065c53e683493e309c742222d057a7daae62abad57e831edf8d504ca26d3da34a587cf23d36b72ce08e61d71938c8922b6f6271f2d1795212b0048a3a1c04925c28e5d1dc075b1889bcfc55799495578d29dfced739059396adfce544f960bb6173141fa22b50f90c0d32b55ca0bf239f1343786ebab30a4158163d8144f5899161985f2afa5c2092830355e322956a70180842dac19d415fa991e8165ceca86b8535a4f1517fb8f6269b155bdb55c53011b048f1f7b0314308a62239c71558cb8d0ca458df25455d36e3085f5e71cce21cd784f7e8e614f06f960b305f2a3716b9d5fb81b4e07b4ee94f7ff152808f741139ac8cdf6a397ba3270d06e38d3c75580cc14c878b6be7125768ffd83bfde75d5c845881a61de103e58a21f59fe343a9891232ba68454dfec0ffe78ff6b48d604c426d270f257d461de76721e1ba7afb82053acac64b48a289350866548ae4f57375376fa8d40f6347fe9dfa0a760e0c8587b3324b2461efe6c53767a23c548872a349e1083a467e4324fccb7553f7549eaaab1a95fbe1f8bd23ba7e7dea58e40fe44208fa5d55c6d2ab0bdd999e26dd35da4cf508735a01306d400b56fef128b2dcc26b2d3a6d71d5e0d9e4d31f9ba4f37339770a2d70ca478d6798c2394280107d1ef12d090c79c90fad776b6645854e14b9ac7d231a462f7886077b2c375b02e3b235566ea7edbbdb0cd440aa050ed3a2fb1929d120ae14b8cd217f41c98e3d1c4f1e598e1166af8800f44d8894068d0f5679a697627993581eb6bd744ac3326a3848121be5b2aab52fe625a2bfda4e99a5a267a16e85cbb2bb7cc56db20bae39fe893fb8afb96e764e51a7ddba619408d99c761347e63ab195adfae71caeb907969c873ea50eb2debd0c35c345d514a12b6a11b94a02d027eec747b8c73c60d9c04845a66285a75dcca10934f836a2780edc93a2a0cac421594058609c4ee5b2a3be66ec0d42fb9c3daf3f511fcb16492f575c132b187e2ab4f3a5614cfd1923fa27cc28ce1c7480662bd5a152c4561d6742df90551c48701dab3893cdfc4fcf047ab0c2e25a37cd7f3720d7f3d90522860026fd078a15d7462e382ae9db99e67800f25ff59dc1bae1f3d541d99426b634424cc79d56502ec05bbb6a3be518bcd5803ae0625c6420dbc988b03ce7fc8af821c663c7054e0a63b9cb265d7a7f93f5fc751a3c7fe2f702452fcfb3a73bdd46bde3e9d1ab516eb962ea1019360a71e2e64650a604a4103c08e73b27bb01c1bf95f8d13b7cd916393cabc5dce5a3f1c2b2aa72931203cc9b02c5c2dc7ff0f823593c2d84d5b3ccff33282915b6a6c0a2989f08a93352ffffb3bddc8aa9ba7709b70eac1b2242c41f0856a8c836ebb0442a0b49b70a52ecc2aa6567ba3be863b10dbf11a742c3774a396ba761f449c8514ff8ce180db766f4e1fbd5d7437de395841e14130aa8888bd15a7a88cc2237d5988579959f378f91fda3e5ddd952c294ddd72435a1d5e4894adc1cdbd7deaf53eef0212d69e87cf139e84d4ac3054e6464d70edcb486f8b3fe88efb17f31433fd16519db413a3a32bf105a5d874e06f730d914c67dc28990b50855c84f410e4e9c1985660961c00d30cb11605a81570076daeb5845f23bd38d322ec7edd1f19debb1b865e41430ef3ae1b22e213a180244482a8b02c85714b2f6c48a61f1a3cc10c0a65158020974a1969a0235baeb2749ca59000527c9d42bcab4f53d10e60f04add2918354ebe371a63112ac6c254c71e9e4c52c6811641ecdf4fc260a1d2a83fc2e92f7ade3a687144f688709ee7304d77a4bbbc9dc6600df8d3923352a6f2144cdb0c490f820136595cf2a88d2c5a82d1f5302ff57b4ff5140056a9b732826d23364146c951eb00a29280bbfec4ab725811946fc22640433846dbf197ada2c4e77bd4a39b4381eb68d45de4df7267ccbb512067993509937c2aad613f4ef0e43ddb18d6688e5abeb068b0c3000ded93578f417bad535f04cb5223a9d9b754c11ff62e4923bc635cd804ad921f4483fa19f2fa29800b1aa3e88d29cf72ee39f40d144c790d5744ab46ae1045f2a7a24827d6afb21d367655d69b9256ffeb4ac1e8532442ea41eaf2019932db463f6de866fe849046729feb8412502c39ed353c66e13c0346f5e0616f31022c38eb71edf40b02fd10f9923ba0e6f54667043a231f702feef7b2e94e3913cefbf44fb79380bb28d64c62b0b8af34307110d0c5c73da8b5b077cf535fea99a1a5d28a664639db33606c25282ac0caed30a3f1f805785c486437e91974c4880406d082c6bfa472f79e7900ba490f93ab77dad0b27885fb0d3e9c300a06d64613814e64f76f59c6e5b071d4a1463fa1bdcaf601204661ac33aa1e109f334273cabdc3d5265918d51e03e68d86f0f712ad8806bf249db793dda78c1c619ba647759adc6d059536eab6ef19cf4d6a209a545319a26dc02a46bd33b68c084f6839490506b0cce2f0dc7983c01bd46c34c9a95e5f1444c184cae3571ee3deb275ecd9864cb587ee5ad50bafe3984fdf3bea5918aae46f9a21a59e61e565fba8ca6f39a265ad75033b7e11abe3e30f969f6e9f61b8a54da18206e472729b46b44bbefdb5fbe63d1c9dd30e6654ad76ecf20cfa57f1a25653c3d960c2d61f5bbc7611414894cc19c58a201d6bedaa726bee97d0d6ab760e8a05ff91611c8c3bb4a23096c19f942a247521aa53a1f94f2244444792925799e9e8faf29c78f24f159dc68882a8b16afe990a7596420a2f5be91c181f438fceeb86db7cffd45a51e7878df44a9aa11002f6e626b1c7457dcab0c5b55698728358cea66c5be6511303719aabf89851e788446526e04e2dcc0553b2412269d2e7e5383d31331273c94d6951946553809db8e40fe1f468f03ff2474cf4b8aa7b2d80054901783d222badef624e0321ad0c42708a469c57a7a5c505a4cbc3a625f9e90a2a593c422d3eded2f6c29361bc18cece48e09ef4d3f14514f840a6425c60b700a09084716ec9534768018120da704c1742f51628cad2b1c1c39403ab1e1e11847325e3a38726877eeeb5cc185e4e743330566d4d6e002cb1fad47f894c2250a37c8250169ff4874c8dcc41c46954662c83eb17fec86cb43191955682463f88afcc2c79cc9bae6aae65172749ab9bb759200f656b8278112dc7a98cd92b424e19686f6eab04f0d21f9247b754eeef4a74e370139f5688a57d66abb9a50b2f471e42337eceef002702d4aa222dae2927af7532467ddede9afe58492b4919fb166f38c9fc3ae45b610472fab00e7b4a229493c5ac32bc42662136a92f6c4a008300795b33ebba57163054b765514ea7e4138bfdf6cd99e3a97fc0dfa3295ef40c06ffd33c971930f66bc42a3b0845e30c6d826255434502517afacecfb366659c6a8e0ddf66135cb7348e77f0782477635e7edd161f0863bf5377a0e8962f512bd7df277a0635b70e96ae932dcbb1d61d9b584ed8a2b4f92ff3ffc733a477be9f19ebf313c8744c372083e31c4c332fdf61c5277855d2ba3cdb71c08ff5fbd4f50b9f393d5867b88f2aa38b151b8dcb8a0e6c3942d546deae0ef2608f907245bc434006aad5a7083a02e60e2c6439ed60ece441e0a23594415cc9dd327706316856b709fcd7e20f3f981d034d6a6333ab394b7bb41b733be89fb7186f06044e48f25d921a0361dc962825a1739e30148a2e80e35ba4bcc800119817db5f61fe0f61e42d3a436f23cd853ac9aeaaca99726268a8063881061ecb2d53c782941bf56a148cc8f7672684a3847c3d177aafedf2c98be86741f9f170ce720faf7e2c99ab6dfd2aab0454a83e3dc7f047f0da9cfe4d086cf843f425cd9fcc9b9b1a7781f4225785cb5f4a7794aabf77e7a1ab52abaf7a45b63d52f3813a5171bd23d4d6adc5f36a4f544e9ebaab27a817de2a32e303e29478fcca66a7b7146eb4bada680ff40ccee46bb757474c94ababf385daba1bc6276bb8acffd73f644d53ea4909636c6f8804801ad6eb629b28f3af18dbfdbde52592ae055d6222dcc133edb5b0f88d4914ce0af4242b46d2b7715ea63eae11c1049d3516ecea648bc300689a7ff09a372c98bf722656bb77640a47b9298f115b82954db84f10c203e372e6908c5aea39e322c2c52c49b0ccfa14b87843e44c3b9da352e497107841464190c3e0cc1706a7351d844f7ac08e6d9385f98383a9141295cbde5c25b34db90f6ac03c99febd533ce3f02cf8ea99fe06954b7ff6247b0055a1af94f104cf1a48ab3f8506c97c97d6324885fa86dad33a2693f606281403d30d5e5e22121a75a8058f046bf26425678990811b8f86315e8c0d082e8634862d638549e912441eebb9b8987436fd59e7ad9e0479872c8c243d33c20f5640815d4e235947cad4053b5d1d9b77ac5c6c486a844ee5941da98c1ebc6b5b240fead9fd94c69e865ca3c01638da6f1a334870c30af44f8c0aca9da1616f5c86605dbad16d9a0efa7ecf48c94ffcca981d4043e3f0da957244522650a68464811619645005db834010464b9bd79c97bd8c444a0af63127463006b7289634028137de2a3643b3b081ea12f512392b1487effa2788d6581424603d121b5629d21d90a46376f0afba2d0f90bd0e7afe2b3b8c6ff4077a130c8ca9c5104b570303f04259700f561bc4727f036b8a243e3e73b4314ac9ccd0a5a3711d3fd42ad9e6ea272f6ac2a6e0a23c7189b9d4cdbfcad78650764bcfac25827848d5238371fb90197bc0edc51bcf8121bb87b70543fc0fb06b0343e7522381551bf2088c360b57452d15e5592be54ab77b895e499ce3110815e0d7a12a7796b408daaec46abbe0d4186ce1d5e61df656a40e754bb86caade53522e6cde974e65780504dd5ac04518c07d51f68c174adcc424dd5733a84d5fc236221caf9a4f0bc42c487a3fd111222e28509a9d34642ecdcef2918c22d09a2fb5577986cedb4b12e4649d67154be61e31929bcccdad0f940f69088b7f225561ecef0691ad57277df7bc015103db210aa1a7276da4face344b7c68d225dd3a9c0ffa9f3bf964543bfaa5bee3597218108ec0ae4eddec162fe85ba6d9f66ed86c48bf66350f66df8e9695c86ac6c83b4f81ca125de0626278f1bf4bbc3326f39c84770c60d9856943134378cbb3d76886e6081601834bdc9d80d6014244f71d3f8dd904a17360b4e13bb8155c01b8078bba13e30b1866314ee342adeb14e50dd79a825b726e332bad186421ff30b1543f4b1fb1f1d2c5773ddd00e677237f8cb69b747f77725f4a583955447cfe8a1c5fce0061f2b68a3a3e7ae136caebb4c196a21d51f2c25b76e35dddc64033bbd6ab3d4c4f61978e3ef706bbb17e24a5bd72b5b0b3186b31890b6dfe10c98857170bda8c280b89e5af457223713ec68716e0f18622164a5e845ee0121ee368c7c0a508b8757006e33700f4ac8861164bb031cef8fcd8722a760df06244350baa53bcacac4b24744849cbfe8118b0aa8c52b13308121c0dbc406d55ceed9ec7b4d5af30490e5d52fd4be6ff804f06a9c09e37e4ddf87ba52e56f56af67375cfd03a28916c57dfdb2acf2e084aa85a81db7c1e07dd2be06c9896ad6adf34319ca13a6d09537f21586db82ff9d332541d0df090d34c3dc55087321c06af26370dd310a5424fd356113e5fc5ad471c099a5be33df26c077554b4cb9abbadb97b95501fa8b85f3b00a476fe13cf41d814cafbef84a7020f0e1b6d55ef9ffd832305b32ac8dbacd5f0f9b73642f51f182d234e9a0bc460c254c16a01a76c0e3a0d84042098aa5ba66db03081a939d1ca7fe8b6223742327d13fe2c0e2f4077b4e21c02815018a1906c6ba34df50ca916e77254e4d36b5a2a9ef0d4473c8b57b39049dc9b7962ddaae17f731646c7c173042b2afa908cd5c55e82ea17197c2f8e3c36a73264db201b4af470d4528cd6c0389780a504fd363d40933c07da299af661dc6859d92ed0488d69cb9b27821727d6c25d77d3038ba9c1c41d51b58a378556cc95fd3fd0a9e662c0c0c3c734149d8b4d8b7cda586aa3ceffe18c8a5209d09a05023ac8e65f0fead76274288006570ab769d870890c350a41d2041b99efc515d9d9d0e85c68d2c93e5506517fcfe02de86d5c45e26bca9176a9650b607a2d7942ab19b5c0dde6c8559d483de2edff7bc4e7d806f652a2a2e0f1fd5e1ecd594810d0ddc55c5e8c06b64bed9b1e8de943f961862683236dda725ac12fb4d74e0c35c610f9190ac7d447c630afb5ea6f04ccf5f2f316691c56b1b630925f45b78283677af46ed7c8a4d515c2f9557fde294d0b734aed5ee029c79afc4938ecb36eafc11b6ec489a13b42db39531886ede44978b993821a017240e1087961569ea178908d30e3ac2f97ce50387d2281cf4f873822c1d28265cb82e956abffac259b8a01770ee810e29e392e50969368459850922210ada9962bb79f3610c9ba7f0231a132addbc3757d8388aa3361309ee3e63391afb3e42c005108b4f1006606993a926e3a0eee7999b25b0a37ade3981af250e084c2b88fbc0edebcd579b3a8f16cae652b82d7b0591b43a02c1e109c15eb4d901ba7ec0e64a5928871c5049a0ff4578814e5427de90872bfe213308ea2677e2f0630ff8d37c1e2f90d0820546df0a04985a2a2b0d9b6a5220395b6ba7c4cd20e5adf60a46d2aaeecd515c945a615e4f37b3efd2eb994f05952e92426ed84fc14feddb18b6173c61c6bba89640adf217a64d0a06603540e9c4d7392d60555b0733093626b884f0b3685d68b1e80a557ccde07475bee23622b072d04e8018e8ffe4d911a16dc508b6c65e483db43d96676b5233359cdba96f1f18de5c2c2ee1b403fb764ba4a4d135b8608b0d1a7d0056ba28c55d03cd931b0e01f1ba31b5ccc6a1a89bdbe2f6e28f7c19f53a02d8128f9fdca4bfa77f6acaeaf30202f520e07d2b581985f3917652e5027a31bbc4ce07ea0341e5a1aef08f519db908f024702356cac5fea09c1270ec40680cf9bcb94d7162448347455e798acd20f814aa5d7245e709fd696d4df72c62a3ab0bce138069d4ea716e4e432bfd2f71156ceb9210c0acffaed3dd829a8459edc9d3900beed51832df389ed8d2d9a6b7ca47d917d2785bd465739465057185440d880e494801f6c7cd55ca763bc28b487da6346dab6da123ad4e2086d80dbbceaaf318cd842707ac747e89165b052fc9e7681af4ea5855019d398768cd732cd12781585cb9a11f23db63f541209e0466606d9cdd85d93c2e4e91034c1f14bcd22b4ab9a6df8ef2469b80fb811872cda9436d14fc42563f73d0839f2ab7994da2b21e1cdc32534066e5ee0adf43905337acd7eef219d0debefd2850881010946e487735d9941adc26e687cdf390092ded8a8b45bf1c9c58a561b9f107f8d21a2e96466b11063f4e7e0c27b217ae442412f221d40e68d98e63c6de0acc2eeaf20cf7e31a9172317c0e362d8575e5c7e8feed8f8784c4503fb45393d65489adb2ca3def448473b486d0bf9d0fc52be56f4eb22be296a82e396fd43dd5f2ad7495d43e32ecd69c72f70a60032548f8130d2b44d261f7714cfaa6d0322b1ddbb16178e243f71518df497ca73dec51105a9b444f361044cf0bfe202ee3b822f1744e95328fd9ad92158f3f7fa31dce7364546b8f578421c0c085f32a09f7c404db615b3634fa643bff0e1f4f3028a53a2b4e6c89a39b17c0199a7f00378cfea213ba51c629367b8a5d5765a1d55674a6819264e1b1fee30656af604034cd9b7dd39c29b06953ff2617d6f224eb2323b806b9cfed3d6e554bb7dd1d3dd3fb892ff2dee4a25991f1c34d12bc8621ff5967ba9cc4c3daf99193ad9c5e0c0f2ea5f5b2be8094559e21d83108bfd73581740d82e3e38dddd3f1ef6ee356d148c77b0f42edbb1c31593bedf14de8a31ba3adcad36ddc611da9327b2c7c50d249955de053803fe98aedcc6d309eda3dc7fe70b6becf8471b080482b011b5d79402dcb568687fae095c7155c93203f7b49df943f6b2669e72a6e81ba8b0a1eb97cacf1965ff74990b0c2104ecf770f51e1e2d87c4111a13826b92c0b531dcaea660c48ac9237a0b1a63c3fa746f420a08d8c522c579302e4a302ea2996745a300eb59a0ec42029c9804931a4a8bf29d7ac43a58e598dbba9ca991010b70188a41e9d9cbd92b55879fe083e4618aae881030a088340186ed350475a6548ae1bb31896f15cf4601baead5e7ed2367a6ddb5b4a9992dc7bef2d0338076b071f071e98ef8109f379411665b59d1b32597c187ce83b3762766e60701793bf274120ff116ba8d8b531c341a63b3628324fa6bb36bcd8150f2b821009f24416e4c87dc670a8a221850d3e7a6a8d916bd95d05e496bb43a6553fd060ad9d34e60e9f36504f3ca21b64943e9e9915cc4ce950f46199b1610689b78bde95a9636605884c77659e9471eafd50ec410e9f14835bfcf08941a2957dec434c14c517459f99acf7c1040a6996b67009b171d44250f865c961188655446ce4efc52a2246f9fbbeefc004b7724da44ea4f0beec417c318b3f819a4559895096021864ea440a972c02a422405ecd1ffe6a1209a44396372ed2643811437be31b09622cb9d102080b2d283e2c6ed6542d65654913fb999a2cbe073f1c32adfa91953964ba63a3a45af1f6d284386a5e605579863a4e44b50cb9b0e24d135213225a6cbab8481e0f0a28b9d62a95eb51551a2437d3aa343bf22bd3aa344877371a89dddd1de7967b27d31d1c3856610c133054ec58a3050a0ed20a5f168a394338d39d9c2fed3a065044694b4c1313acf0f866400785918d93eb1d9ad373a2c505cb7427074d2633ddcdf9226a598008fa4103ba7e6dbc757c2b73fa2209641e3ff4e0a7ce64540ccf1f430dc290567046c7af149cd1b196084539e6f7606581524a434a471a7ee30f9dbd2c16d2a8388edf7f18a0e1d7c4ef3311cae003472adff81bc5cf7a81f5fb14ebcbc48f8c428eff74015fc66f82b30f9f317086bfcf0c43b83f1d15f22bc34020d127fb6359c3316946e1eefe660c4bf696c5cc9a994759cf848d99eee808c935f36dd238019ff1812050473898a4d0c4e002530c2d72d7eafedf57af4ec2f089038509ab8b120fa62b69783b3a733664baa31326ac2a793cd982caa23186ce871503162c447444058112f35929418b2e545247438a1c5109f9aae47e1329e721d3aa281ad9080ebfaf35c0044391522a02892198c33a75400680b9c407825f98c3142401139b2c665a2584caa2c1b5d65abfe47aa263d842c59e13292f7cb10d99ee62b0ca66a6bb189e461a388419bd29327d13df47010a04fef73d5d00159dca3c84b2077cf9fb2f8fb905b8defabdb18eec645ac5a4c909962d04956808300410481457b0d9b999828f9ce8b2f556ab1131b97eac97abac363ef6d3c159ff471d04f2143eb99bcac80ba2f84e6549161f1613d94c79b1c23f64a63b3a4632ce94cac80cf2f7d4e7fbc2868166d1acda94bf03500684b90f842fcc0a2a4fcc04d110322da9d9e16b3058aec536f8da071019661e641ae63e0688f514bfcf16cfb0f14782dd6dccda4fae911082288ee3e8a3edf568b724209ea967577fb197c724b1cc0742f5ee5a1f9ff6cc0742f5afa7d80367f5dddbed17a283a72589104f4b121dbc78521e6b6d4d06d9f687c33fd2d262fc157d208c8fed07c227e30038eb0f7f3cbbe803a1df62f0c3e54f974580e3c901177cb81083a4d8197f3870d6231645112ce1cb24fac3d343d744c8f8eb1208448ee3388e632577ce9ac4c62cbf0c9fc857520a7322e430178618bbbabeaeef3fa92ad525df91d54c33f61fca6ab3d9cf4f49a2947de6588e74a4220409c1320f1310f3f812181f3f96d51c38fb7ee7a4b9ac894a798d591bbbeaadd6dcebbf27ab51fe7e2c537123d7eb1c7be77815c219e21c79e0ecfb0ece710b9c7d0f34ea489865f2312dc54e63e24eb314d2ae8fd4de936e7831964732f6f5246196638f4f3343065a8298630f2274a20b10f3f72112ca80f066a2684929c995941f6e5808faa81429c91f53febe1636893d8e57fe98841fa70038f316fd719f22c0993fee2ad6165b14bb45b1bbc7b67299f82240713c4d40b73478bcc109cbe2a9012c6ff03b3b3532ef981f7c0d96776279e7f3ce8c83affde49d0f21ef7cad011900bff33bef205007bff31f40a002fccefb804040bff31e804020e80202f03b8fcfd97fb39f3c800b64f1bb8e1506b97b1c5190bb84dcb36cc51ffb191e872702de9e1932bcfd7ad67c621f7205aa5f5f5f79be5ed937e2d19de7758ab953b491f4bdd82482b47e0f4f41a00f0f3b7dc05848ebf77e723c7f72cbec7f3d41208083cf70d648f8c91cfc73f0224010b2cf1433d8a04f90100e1e039d5f0e21a3fd07442bc0f9e510c49bcf7f027801bc072064650318a08e55845ceb77154f1394a88f80c73d6702be9e084040ad01b52f87f03532038598fd8ce3f80e0281f80edefef822d005f0fcf81883b94584e269bf5320838c5f83147c19e307717e3904509883e11c08c487708ae0ac1fc4d9204e9a43383b8df8bd88b3e70870d6dfc199e1fc0167fd3ce705e807fdafd30c495ca359b965f541f8f13c4002ceda078f80f38307e18317011ee000a7f8d30fc249c19901c2b00141423e9059659908e0ac5f04d8c149694d809382b3019c149c71e0238053769a21adff3c3fa4f5ff490170d61f809303f403ba0500d90f38dbca1b3cd8e1373869fe70d63c7b90dd3438e9bdcab1d304b3cc41366281bcd0bc325154670611211c119d3141dfd5295a2cabf56fb0321266b97f838823cf0d320de7d7c2095776d88c78199a2255d522d601526c98745dd678c0825168bfb6db47a071bbd7dddb6fb89bb0d80cdded9b8ceedcd6b537a19e9ab3e56eb8a787ba43a0a4f7436b88068c1841fdc5903b87cb3d95db91dbbdbbbbbbddbdbbbbbbddbddbe3dc91c644b7ba2fb2b5d65a6bad0c5b48a37e7bd7dd45876115425977222e7777c7758534eaee0ebabb3b0ca6eca20b9bdf2dff8e84401a1de1c8c8cdeae4ca25d2ea5b17268bd6ac305a91cbb6fbfaed5b80135159ba7676f488b08ea4171c92ae7ed8245c4f8e2d231960b11cb99d061cbd281e96d78dae29a22ca930b6b7d8cac9cf7542e684fe4fca9c82b36bcb54a735e7b3e5d055b87b162dba2c5b302a7e264c9744c9fc2bb6c065ddd1a62c6562adf588073465b0d212596badc5110b21067db4b4a44f1ff1aab6ecb04491e29124432923a7b294b21563b80f1f4558a488b1234990fde8647be652fd9495ec21a5dd7d08921d6283748b71ad15d7ea4962228d89ceb484999a4c1414051ec761905c969eea5194bb7f36eb759adc2f7a77778f0024c9da18534096725b9f42412bf63e74218dbecf03543cbd9adc7a84271c124fcd42811c4557b25464032e291a8c9004c7a5c262489e7c04243a930bf68de07415d2a84bede664e8ee118ef4421a7511295c1120d32919576ff10a6d6fad152b579e5cebc33c570b83c5847085a475eb6d6f60b037538fa94b884dc8ede2b628acd57acad6ba77b7cff75d51082182fdd6232b902bf146d164f16e73f0283a90db78a481374d58986c5892f4f8e60089e1389bcda6828883088b59654af543c9aab1db4f050ec7d75a6b2da5eac126db6fba95bdb18a1e2f90c768adb596472f5befeb543f1e36cce38679e0308f58c63c7e56adb5568553b62a98dc1d5723110470800103e78d1ba12d393bb2aa9448118165eb21157be1a7ec4a16c9f64587d952668233988da6906c1789ac8da7a9202ef4e3c78d6bed1701becfacd69d1a238da952894517ddc68dc6c5a119336131ae9046db1a596bed948a15d9f6fc5be08ac19ff9cc6ae81ed3b0ddaf810b6934dff7eb8eb1cf5e470a600104488eac3833b8f1c5a1aa91d372c26dcfc46fadb534b6421abda551899c151a644ed8e2c6cd07878a06171c3033b8dea7ead6946bff83796c8f2f1569c7dcd8afefb0597bb523c2623a74218dba0a2e19badb45e70a699486214c156a36004d582c09e749b9a424d30c43d016b9fb1dd6dddd9dc3e6396efd2377bff7c3be93401acd15c71248a3b9e6b937e2862ea4510781e8473503c98996170b8529f8b9160b55b0660d488543aa070c4b9ab0f8bab2d6a0c8fa6eb0a03363ca0e155953702bc496d151942441e1cd0b1f7382fa0d14a41cfec982b2c25ae99c929ecc69db0e2e4c9d222d5c58b872a6c98d109c901c19627880ce4eca12923048e67c6d807c01f2a60e89a0850a44ba2d29e04cf9d8d480aae36557674cf64ca980ec20320a13e7c9141e35ac8ed6ec309962ebadd62c5add43ddbc1339aa4ef460e2644dff549d18ca3b995231795ac1515c01b9a12585d10b57ba3e3553b4e4da46f8441d3863d2b058b3e24ba393e214b5e3cbc882663d9932c5664a3525aa8e379188f2a6b0bc700443d75a55c34bae1e504ce9919b6a0a2e9b99524db1d9e021b59bb545adbd2d67da6badb5ba90eb0aad283050ca4c77609c78fdeaee6e303d72c732dd81610146c8c8cf180d4299cfe3f10accd271f469318e2ff4a84c0d39f5e8126456e150e4b15a1538985ebfaa850f0effa2864cab5ad872ed7f6c651a6a16c20081329524260a1a3107155690246e5ae02139638e201c2d2d375f0b04b53e32397ec87a3f1178c908de2765e619835dd895c53068adb5d60a2a5b77c1030b97133058405199393206c85a207927db7798b5a783332b7321da4546b61ffb91adbbbbd72adcf5312f8fec2fbab7f3b237e938f70e84013383231776513482bc4cf63775d9a5a26497f5fb7cef0302d9bfd65a19d6a6008d9cac2f4c3ba08482ec4726db2715b2fd18916c5d366bd957990f188206f5605af87d5ac478cae5daff5cf20d0bc45ce27b513c6b3fe163c005549414a90345d5a3475028fb90f6f1b20810fcd967e203853458b3d3d042adb5d63429e42ae4556b8e5c795068a561d121d35d9a33bd3a7e434c09be9cd0d3b14b410a0e86ef7b532bc9c490dc938b192ca8490266cc085034e9c9b48a090e263450184a310123619852c06143ce8e20d10d065f14c932a3f4e409ca9020f3e37d3ab0165053931b589ab26c323e3124f8a002148e2d427a304085c9ca4bd054595103089a1e60c60461aa83c5c9a9ccf7a53ad9120356dd7cd8db91909506995629b12961b2de56fedfba8fe3b8abd3421e6b1ec7d184038379a655b714b9667e8740c04c01c92de9a1068a182f3f3a786e8838bd7871e57ba1cb888cee46a38a152c5d08c015a6ca94558f47efdb9a654a5565955f99eea8a0ee163ce5c54a7b9dc3cb5524ea2918573a2842598cedea28c938d3292f56415e00c8b46a692b8399562dc55087286f85272872aea0790227a8b9e41eb222ea4416df831f0164bad36dc937d39d0e6b04bbc8d1823f8ee3586535a7e2f75fb6b90598e70023628464a8407222640b1d43f161610a2a2e4c0d8161294550a825876118d6510d1af15ffc592f8b1f7fc7a5da5356184f1986ae0e596b6dadb5566badb54e7a4458cc85ce85550b8b316ef19431c618638c31c65d655c965f77f7a1761384b9dff676f756f1dd6841e6076ff0f1b822595b6b8dd3656d7b77c7490a69d43f539d15a4b7621226bd98d5bbad08b91523222cb6da15572a3d9fe581342a82ca17f72954a50d9046455c29b949c402165ea8f20397644909e7244bd50fb66a6aa2f7ccf0e36a8b8d647070d2767793534858b93eeedaabb5d65a6bd75a6badb5bbbb6badb5d6daddddb5d65a6bedeeaed54848001c169b7ae1d45dbda2fb0912a121a82c9c92aba0065be4de4aba51be45c739e1a07054b828382c1cef1a9501002cc6e209a4519dd5082caef0c5451d7c2cfa02d26819362314cd196185103e7d5eec6ae4b4a8f8e8ea5205b248336564c26d3fe291dddfdddddd9d6809a451a226277a3289743122ab27ba9a39b645d66ad9fc765f6f7f011edd986e4e7efd6bb2d96c2b8e9c5a749a95e9945053b67f2fcd1a5a1224db1f3ab658f91053c406060da3a914b77bd4848363101693aa63758faaec7c5272a23405815e4d25f78cee5e41c7c813eeeeee3954b9dbafdff6a32e620c1342c2b81153e548952149601114af01aa9062d304028c9f1257b25636b9d65a77722d57c0b22bf0ec0a5fec0a65dcd65a6bad56467daf6f565b660bf6621205a4512c5e10932f18638c715bb76558e0503eb1097a9a2314b4c4083b69f026933c8134aa0b4a62756f91b55a5249b4b2f5ebd75adb6ef1c53e32c63474208dd2b0721a57660ce902565b6250a10c951e5237275d70608cdbba15aa124275ad5b1a77c61648a35c41337aeeb1a83228ac54ee8bf535a6c362381c0e878b7165c98e2e303c2599128441a28cb1548ca58cbb1b638c31ee6eeb16e32e3d9dc206d2e80d970b4a91d4b72fc61863dcdd18b7940cb54e529da53a4d759e6c3719154c3cbec9f2375bfe86cbdff4fc4d97fbbdf70e75f7b063ef6eecd8bbbbbb31c6ddd8629cc4db3196c5dae0bc4dcedb24799b2577dcd6ed8f32147d4d149046d760f91a9eb9e64bec6f4fb69ce83164a546952c70c809161df6b6d79ee0d65a6bad1a2490466d283165354ef71259db530385adb5d831c66460648c31c6186334468e06c9d1d8b8441db8a0b4281a82c38d8b14513da68c31c618636badb547cf848b0d17a644695246c8890b51984c91354305d268149ccd60c5906c8e0593234d27dc68018519defbfc0f1ee1e48a87f431376b5d747961ae2717682e2c26a68bcb665e2be626e4615c940da60bc7ab8279621a472fb622311116cb62a127e8055c1687c5b2421a7de1a57a77777749f22e4ba613271cb8b78cea1692f99627ab6f25ebedb4658ca018e4b5b5d65a6bbdfee3438bfec2eac5d58b2cf3c556ec05d7cf761c2a2c76c40369f4e88b1f95318fd8c42ec6e2711845275222622272228222a2c25aa3011633a10b850dc50d050e450edf62211248a3369498824e385d7c9360153463b081347ac3e5720c49b3bfe274bf395c208df6f29cae98ee88961ef369941ca16cb9867a4e5dededdea2b7e64687173f6563b28596b7e819ca52bbb5d6dadab5db5a6baded6abb5b38e9a94f742dba7bd8715a514facb0e321abe609b7b023fa131b148f68c26256ba2396bae82ce0bcaf47b98873c12d6f22a279bbd12c4244c4d8a8b173826502d513c618e328dd523fb538c11a3a3dc0382191f2053c1115a5f3799fffc131372bece42c36293d19cb6dab728509436a5d8551a3858b528ad29777eb77efbdbe5332275bfb6dd96c36162ac238a5bd4c7746a8b2ed1d69123361a6098bc188be13bb234ed97a5799ad52b093a39885771f40f4c52c8dca5411c18151d1c33667ace8248658595bbb762ae8c062ba904639901092db151591dd5c218d3a0926abaaa1dd3799eb8d7112a88cf13bfebf302b2b9046afb2b6b8b255cf5a69a8e19bb3f799553d8134aab3ca55571f8630b5f460d084c5a89a421a75318a4ae749d06cf8a678208d7ec179aa4ccc53f0e4285c97deff58f2c84f57f25679ad95ccea55effbf4f23076adcdbabe648230a335de48b08f629988adb5d6ba69a3660899a2cc85b5d6d2e8fa296f3a267336782e927bc1a145e7fa91e1098acc4d382bb39775ad74496e74d30b662692d33551c39387c4ce4c7541844828526788dc2a5bd759b8cb0132240e9225a51b31405b15aea92a6a6054bc62d1e3eb53bc56ec45aeac9d016c14bd488e0c2936f5a4e6bc213da4a237e15094d5613122bd90469d0ece14d24427a987696baa4693bd352e79dbe9b1d65aad60b5155e5bf902d2686e6b6badb786d65adb7e41172790e2abc714155db6b74c41a06bc5e6ddf75e2c1ef9de7bffefbdf73e117a62f404e9898d274a4f98b0b5d6f66d9be47561312ba36b8574ad6c5c2ba56bc574ad9c401acdb87feebdf7dedb7defbdf75e6badb555858b45856d77efae401acdf22d932bd6fb5dd7cc06d26cd50da4d9c73a1f3787b77787ed21ce66b3cd88c29ae29faeebb31aad94977bfdf2f86085852867e27839f1e6ab13f8694982f4c9d8c1d995e1c726f0c9a5ac047e0f8fdbc3630f0ffbfe0f1bfc7fdf3210fcac9e9e7befdde0f4713b6b9e1b97987c4c9e26587ee8819d3170d6b43e6b3eb965f8c3a7bf87b346824f2ec96fe973f248ed4bcae281401abe804035127e72f9fe601d1dc6433f00df4f0da70ff1c9b366d29016eb89e5d2ccf885f1c5f8f12796e57f8fcf0e3d76fc0fbf06323cbf03b61af19511a019cb4a10c7e7209267ed39bcce14c0209bf84c4198cde7708a20f23809ce6046ccf0abe963e75f2feefc4bf695e5046e2e4b08f47cf9dd38f0157db8b12481cb13ef9c421b7ee883784a594d24cf9a99495cfe8bc4e5bfc817119267edb371cf12f665904b52c47fc9bf320ace903287d7d5f07a7cdfc2beb40ffb7040b057497e894bfbe5d7702866fcaf2fcf9a994dc040062ec825598b41f922c2f2ac7d3672ad1f972f5e7cd6c4dce5bf427c76495e59892b96e4f77fad3e9659fc926159cdca4a006b55560298cb9dfb1a6a1f2e37e54de0be06b2dca980957d45b2922c1fcb6a12281f3ffeafb440f9f839000291fffaeff63100ff4b4662cce16b1f2e93660981d7635909fc1a7ee745961c6464b9817c1ef25542a0fc12afb22cc9abbbf75e0d3219869de66738eb8b087b7ab010cf0f7dd0ce636c5ff855a27cf25fb8e86300ef55829497fb3578f9304bc86adf673b0c21feebbfb20224fe2b2b1fcb3cdcefb7f89bf2dacafaebf39c1404617fe714411056562b21344f5eae9500de1202e49778c96a9f2d2d4066f2bf22fcb592a8f81c497cd6b22c4bdb5f6b7d3ddef90c88bf23a321edf526323e6b2e66f2db96a7894c9e342be312c26c6522428a39f0157d0ca0791c4710c72383cf8408960f98c2d427a4200d24c1d490a9d496a7dc994ef1b83e1f6962994a55b51840a65267b8b459719ba263668a8e55be54ccb12b6d14b0137abd31bc5c139ba00673b9abb08870d1329d6a2323cb084e59732493994eadf151804ca94cc8caaf290f32a5b27dc9a69cd94c09844ca7e2d8724fa6536cc67c58582682a0acb7b10ba4b6f6de7b491d18ac6c1fbba8d15d9242173b3470f952adb5f62adbeb56e74249b6d65a6bad4ecb55b6afc625148febf5853126bf56ec33ee27428527a415b4d9b1b034833150394e5041a753e189f7b56ea190acb5d69232115057d85a1d5456b6767431391cdef576561932d50d81aa8e753bddee4e4a4d3de57eec7dfdba8b4d369b8d878a29b0582e53292836b9beb65570e90fe4ca54ca4899dc5cdddddddddd4b74e4168fba7b0952eeebd77d4747ee5183090bae2e48906424f19244cdbddddddd7defb549aefa5eeb5685186badb53890b2bdceb3e38b0659ae38a2e1e9be175f7cb396a47bb52c71710cc262589ebabb6d5f996266718534daddee6e6768e5726be9c8edeedd6b8fba4285dddd85a59bbb47b9f0c4dd9764b746512e34fde00e45c094a5bbeb92ac3d52b343a690752203163d855c48a3feba19ea0adb2e219e9b2c21f116fd2a850c3533c15d6918f3121d981eb1c7e24df874e301f3936dc6ced759c9cdddac39c955949299b73dba7a1b43e17bebad376ac552b68faf6c8c1762b363ca951784aa62ace8323a71fdba136badb538ea76d545ae4a1fc212731bb09551f2446489111049b72509853f5db0c966b3c1d015d132e6328d3a71cb36976f6ec6e2288d2d45129719200c1392a24c4061e663c2fe07974e7ecab6a3e864c85bad35ca8564656102698ac7952b4a608234015f182565af32ea91ddde714b099a311316eb0a69d4fdea355a77f707ac58b2b64a85ceaceebef58022ae3bfa165df6dab57b74779ff99830ffc1768dd9d66dce3ecc7a8b20f37443623628c7b36cd58e31093119312131d98839b6d6d6b6263461ff11c55a6badb5d63a762a136c60e7418207c61863ec2bdcb368ed78f43c4cb2d96c34b290d1d0f8a33177df25095d651d58d65adfd5d112dd7d17c388c8dd351401c3424b132a2ca674b0015dc4c8fe3120d9bb7b27c3a8bbddc8ddddbdbbfd734065a83ef699a49046d124a1b9ba65539dc9aa75049a5cedee7aa60816cd74f9ddb1237a99a490e6b8a14698a1f22e738573f782bd9046318bfbc16003a45125262728aa4be6c902ddb7d847c0d0a3e232811c31e696ebbef7f6bd5963701ccc589e8dfc901b5b6b555081341a85840a2c9e91e981888a280a111609225eec7936ac062452e450e84042a829ea436c4b8bc9417414b890469d6786c30613745a843868c8dddddd27b0fc04cf4f7c89d5c80de362e2a99dc16d46208d22d9506a123626b30716a3c305d268cf47d0e98a696981674e13af34e564691903db9173d342e7f58a63b52256c2e182d3e351925d5b4d3bb82be975dff456c056f437b99046fd09e96e742e902d7a9b2e373673cb0b666d83dba226c3283a1b36295ed5c5113ec28401bbf23142cd8d88d923d25cb973596143edee5e5748a34ef5e5840130f54439e5b2fbd690bb0933610d737777f7ae302a9a30339ce6a874ebdc0943a9466a04018000f31800000320200992284cb3d6393514001049a6485464380e0803b23088015186611886810086410086c110631882d2b3150d80032d7bd9373fae3bfcafe86b48858bdc14df46bb6bd5280c4e7fad79b848f701284217b3c01a358fb22915081d5c7b6c617ee3573dd51a2a34da0cfd9114cc9bcbbabeae20d9de013f5f18d0b47166a319d2bc2eb96939e3450bcbbcf6fbff132bd598b52a25b6d8445e0d280af51ff4485ca677e6fe371bcc5304ad3669cdd73fae52d6b7a4590775a71f221cb166cc6f48a6b995a457800f4709db260dd9ce1af4d470c78110483cd1aba3f846917a769a504f413de284336de4043dfe80d636215d176a1f5c6c7e97fb633361fb74cad71feb09a1c762ec8d5864d4063b0a27b6213c588240650c2bbeb7f3f862e4a848814a74e186b9d86b5de2d1cc3984af2634e4ed73e2435cc5bb791483d2357ba02fa4c089d8f48867418f9391fa4a3561e0dec6f57213163c67fb0e511e1312b417ef0ef33157735ac631785a384c373777479bf051fd2754867d933e69d0507912afdedc0a4abaf27fbf8536053c512fbd88578e3f3a0fd5d3dc84fb678a162baaaa879a13332f287891f612250a1396338dcb7467eb30a7926c2577fbf769e7f71ca2f89150261dbaec69a487d802df3e43ddf8d208420dc49d76bed6aaf22ba994123b230be9b8496e3c60a5e31d316ea4a1e01abe1d6bf8a40b1ff15ae7f865f8c4180970141a2389d6dfba19cb7c79a3b546cbb555e0ea4fd68716459d4bff5c4603049f442506580938c5d412dc808a967c86483a30639658521e33fd549c49825f86800fbda98bb199bbba5b4fbe167bd2321e6b6c48901e87772aee3a79e15b64eac79e1afe1cc1c42415bdd362ab95bad63be91d64a577814a1fc7a445add9fadfe89d16588f87dedd8ce9faf5b1499a3def76ae6368c4325028acfff5d43b59bdba87dc99a08ed8cf00d2888d9efa2b1e46ecd18ddda20d223be01132e037de1cfbc153d71163234ea3043d9505cd143f7412a8b74c0e623f3283f0b4b4370d2e2757812813a8a3b7816944ed607f833d542014bdbd3f522107ad1cb67799cc2a68f725a5aca8dd983ca4aa233d2462c09f6768569eb2f68b6e6cfd1b46f26366862966e20521a004c5e249cb4f75e8a93b2e237f57884f5ac4d8f8f8e018bf972068e4e4483c100f437edcec8de8330290a443ee91f1c9f82b7a3d448533527c5233293a8cd38c5b15a5cd9c019696fef3380e80222e53ed385e277b797938bed107350f37e6290f4f0372087f8afb35df480801fd01ee9c3ce81120768dd070b3fa4839eedef49e946974678a6b854f455d511d3b56980124f22a030f59d650f4ec9f38ff91c14417529f6e36cc843b247a4c3b5b2a996869ed52e7f1937c5a2a440d9ccb89f4402b423a39e0fc47213a4a4a5826ea9312720343afde4cd73ba8930e02284293be401d68a1a9382a4d422d717939e30be756235d044ab87b1fe99eedc3efe6e116707009a6d4e57306925350d8416e2b0471146dccb19b9c2a0f55935bdc389f79814bbd43625134041497b9efc49fbc207c6ba7614435b29831bc0ad3d7726b41763e84dbb7cdad3ff5a05500958ef71e94893abcdac5e2b5fea7e26a423ea1600d24527cb8306b57621e30510b77c0ee5dcd1091badd71b86e717d190c4cad444cf558208a8ec40cdeb51ab2fc639cf16859a9f80a7deb01ca55e8e9278b181d2aa3658db5b6457b59b9c557b1d9ca05b8512b0c08a3d0acc29fb0b2722b110724862ea4191800154535dae9fac433ab6b16759191676af80c2a31b9e0be22dc0b83eaf70b8540aa0f559d775531185076f29a7227bde2ed7501aa13dbe822a4b3150d62f496fcaf377f301dbeeb12d7e86116afac7a0a664cf68ae06c82f002c746b3af4aa9352e4956567a7cb8b7732b1f81707ac5fd30353da065630e4247fce3a2a69f7f9e327b25dbee7cf04b7d2f0b1b2d38bf9465d7c41589451ff77f8f4165e33d3cca7570d943105f86e8bd026b5910430015e38dc715dcc0a103e212e148c76316a3d65a83170102a8f8da9ba5b1749cdc50e85f2540782dda99358798b74fd370aad5a201e104d34e9a2f6788f9e06bfd335b24c7fb24e44c853a0dfed0b80311c0c6f738ecd5f4ce4ed23b2768083269e82b2550ec307c8a807c80c5d79819303d759528218a8014e1d8923910666e0a4ad6a3d1bdfa54ed30fcaf86296c3c6e837b03b9dc5493f75c62cf8451c358a6068c20c23482ca38b93be71f4f493fe81dd0fd905e94ab13ab87e7c7d04929ff2e3679c5273624fc2f6ce50a5687597202ee5f3cf49eb50212bd55a30a1e34a059c03b1e25bf6ceeafd1f814bd65378a3b11eb8fab254111f9ed88d664deeae9e4a6feb8e01259de6c04c06ed9c59534aba09bd33cf073bd198b9894aa18c63438e14ee533bce6a896f94a4ba9d072948eaef38f7b0f08e0bf373ec1fa642165c64a82b2a8ad8c8004eecd8b8d088699bc87fa8e16151db8d1cccbf59eb112f6fe3d0c0ee648ff73570817ec73d43711a90fe57e0951d1a3ea2263366873b6ec45f0b5dab8b25a49d1c1846a83a79466f7c071cac7951833f60cbd254f47cf88bad4aaa15f9016db52ae52f1baf229d53c00bd3b947e3c5bf6197aca05d594a9d922c52bf18e0a63e0c98c69fea7d325cb5e068432b4337aaff9fea99b4cf474c772095f13c2057ee8debb38616bee8d994c38ad32a513b075847aa0047983cff55eb9684c1b3bae6763e66652cfcb3e23b61fc78a3220630e711449999ad4c83eced653bc4f906fd31d80019e3d0f22ce90a34a73b75432a2aa10582b982628585a3e0f85d7510f87f9d546dd91383357cc0ec969a68464e238b6d4e79c84a99c8c84794b46b673d0530d40bf15e03bf2adc21a419c17855b03650467cb02dd4b4bc75ee198b53bf52a87f45ea9654e59be2f97e2abd3e48c690a56b9a961a37cec97a2a59a0cb4c8227c69cbdf2fd76d1698b56212da4d4373d30a683047125f54446cb29b8996c836d19a9b1614081f67733757d3577db1f1d35e6ff0ad24b2898034374d60501ea7cd6f4e4bfd3e7ffa26bec98a78c4e08cba61aaf5244b634a3793f05f3e8e5907a0a3a02dd7afbec77194dd358d08ce3301e31fbccf6c14b9f224ad7e1de3118627cb3b5a3320080e8e5dc649d22d3aa88d1409c1fa65392384c3cb4740c7b7fb7433cd67f010dbc30821959b45880ca371d04d69a9381d625afb9543f89b6324bf12c45990b96ff8cd35aa2b59fa66e7696621ac5dd94fa147c03db336769c1d77bcc8855c462ed0670caf779a524ff5ad326b8cccdbf4ca4f13ce9858223471d0052d321adb801d494678fec605ba2e3ea386398fd5b0cd9a435739e71bf1e57994d28e0ed071d0118a2ecc102375837bb69a5eac102a980c7a7506646843b2aabbbc40b2a8c42d6b56dadc000abddfb06aabe9727b13404bb41d8f2540a6959610a4a35c0565ef08f152ac41f5b2346adf8ab9da62030b9cf0bf2bb4e9cd2adaa56682ce20b7946871c52c803fcb932b51f45c8aeeeb4d6644d9c9a3b058c0d70804a4d9da4a2eeee6010fe3834e5399a4e9199784c860c66d8388f5c393b812935968904ca4370e2f4b29b0af8c285472063dee177494c928c4757cf04fddc2584566dea8654ac7add1fe5574c985944099a728a86efe9052d3d76354bd7c42a47f3f9611d6167cc86c454f8ab11c7acb06f2a68f7074e7b7e0f8aad1168be7aa92a2b08d28198b521274a19de84dbe132281394416f235120045b52d5c59eb0def3a933924859fc6d5f5f61147fb2fb7a0d4e1b8964477e5aa01c2dad9dd8ef4d8b5ec2f105f00bcb485c14b5c86fa182f3a28fc7c8d79d57adb2cca51bf730aaa5f765456eccae4eba4a1945a16e8e3bb91f8096c645d8183b645c7fc791a3ca529e57c2af232b0b4e92c9ab73b897aac90836ef4eeb4f643d2160379884ee13e818261c0b4ddd41382b91c6ef7882b441e5cddf861d54c794c443d3f100ce64eb8524ede8579004a5749e742b3e536cc57a6c82969c9e35ea2a17805643d943c6009809c367363e29be5f956f7de232c6c214cbabe11544f6d645bfaab0af2f27f58a3ae435b629583af9efc2aed9500144da48d01eb9caf6d040f482f86fb97e95f4f1e6e38bc9dacd9a65882ef1410cdfd77e5729f6adbd3260112f5a3685d4e1e80df53c6ddd53cf617604e498f4a841e4d2c30d3fa7b7c50acd30499e8b5f32b81102730797f4218f21945fbd7c71bee0e4cb5817488475716a183af051eb56f86032f16811975e12634a6e41aa0ed033ade48b5534bf64a22850bd751fc58bd093e1718e87f7c6cb1ea667ad7675d81443145e2cad2a853c2e5b9985149e8b638a395d9af095721883a918b47bc97b2bee96bda949ce25dc6489d743e5e22e29aa9e4837397c9fe2d70696d13168f3db4c8310c4f106a885dbd6eae3cacc76f8511060b5676c768ace4676b9566f8eaea7c261a17e654b2873ca2d97070b798f1d6748c5509c2890996411da4f9477282ae7c610669fdff8b11219df17dfca773f28e10879d37dc1197f62374c07f8f2ef72f2a99bc4ecab578084f437637130da1afb35190e6374603fdb38df50d99f46e65248f043f9b44215a4cf0fcf72158df30a94ad38a68f933f25b2af004c93f30a1a7e3d8c22e71530bd8822b8ddcdf68c10c0dee981a7d821cc4ed85198d40378a202c0cd21db7b28cc0abd3010a660619b65ddee109a7f44910236c912400f0b6ea134fcdf503f9e31bb87ba7337193fac6cb31c9728f9b39d35e39c18c7dd1342e988f49b512f4261a42b976837be5e449e762eebf6bcd8e99b7e1c8196fb9006efb9c992b4d5e23741f22676ce96cbb5e8f883a73d4429593fbbc9781c6ab9c62d8b17e342f34c748ad5557e92e46f772d64f3aff293055cbb854779fdd043ddddce602b2bf195a55aac06f747784c36c3c005190b11c6862728ced8009e01ffc8e04989fd44c6cb423269693ea9038e880ba968e6b347e89b1d99819d48ac51e972db927e35b32602356f85a7c623f4580d1d31514751e00d396c7c03d38f1cffee73de2c6ac7a7ef4c96f2742d451aeba2a566c249e7d5ec3d9c43248e83f4aee7287eb8f259e687cbb42cff57191d9bae4d12f78ac1f55e8f204e14bd840f033984808777095de593696bdac163777068a712bd5630182452ef26ff6aade539af08ce3c91b4f96e849b33ca0130ae21011c0ff6e5c4e077460f9b68874af39add8393e1805400979bcefc47f23d85ef4f8717b3255dd03888679636ee30a17c1b2b5ad077815d15b1e86f7f5cbec91ec64e62c8d94378915b99635163468c6e41bd0b2c5d9320e89e4dc554f5ff31c74a1ca5882ccf05010f44c4bb0462c0d7b63852e31729b71e17580aacac6e3f83d170530944df945b481862f1e0e2603b88064221d2b19de08cf27f70e28019c6ac73553b2bcb378b4a42caafd026c69ee0216a75d73a35a3fa9eb62eb9a7d33a670541a9d89cebcb38978ca1a29f25b310e58260710d8beda8a056d24e44255876b9db9d38b545823f274f06acddf86b62172e88492d5380a00602744378b53e3bcc454a1e403ece1bf5ed632ea33f16a2fd5a49d7d910299e4534456c7c4e4e1486000d1410923cd05848814b8a796d13b99a015e675d6d34526d2084c0781dc1df4c7670c99350422a1f894c03bc2089e2a32185a5a30707b3f2806b63c3e7e0690116ebd8a6ba4250583c9cd311904dd5b972ff8701c323436f833588c3639344ad55be6471c5aa87e9edc3e52afdc7386a18ec96ee19e4554362b5f4fdec9cb3f6bfcd13518f0050e451cf416906c0d1af5f43ed7df99c65a67c1dd13e64d59b259ec45647307a805518d6c580965b5664815113b17048e76bfe21b4b881f50c261590502549d1e0ef96096de1893ecc7741775fbfaf164ec11ef91af02383b50ec23a6749e2a413379b76ad8cca123c4ae9611f5c612f8870aff6ee2481201984d76abbfc18b56fd54857d0fa3ad056935f3cc3b9fc0b9f95b18809adaaf86cfd7d6847c59da869f93c948ae55abe3a011451e1e232420509dab0da8f7cef54f5f461a4b1307c16c350fd03f8356c0c1e583c34df12cd031655177efa54be81c41e76713e2177e6cca6d72a4842839a614c7f45e8f3172ae0a7b2aab2a4af6b54bd4fcb6dc3d1f9f3bf89145ccd171521d2f67d5b71f764c5616ed5c7ece6631ae6d46a1a8cc8c9be2eda2f989381668c23fc36c3fc7fb2bf2ecb2283a8015eb453a8ee32ffa939cd4de913b7cd8e39a6fb203755208aaf5722c741c421de1ff41099b714538a99e41b5b501cba70237884fdf8dd7bd05e414122104269162c96c231cd231bf559654680a418b37613d269082e60e3c25384c13396e1f3743c0358d77028e7ccdcea4985dae876db64aac66c1bed56ae4a7c40d1789c64dcefa2fdb9515b2c624b788d117b49dc5f6fae3548af70bfa0d47f44c8440dcb324fb59e93c02c2a67258b374c36540a976f5a41809e2a5b1c45e3f64e9552c8186fbf43f1736f058cdd552400834d62c220183441e583ec6981615cdbaee68b7890395689528cb78e21e0d22f5f7dfb0ca38668a1876b1979c40404b0fb58f92cf3d1db5218123aa320a751babfab7fa091182dea99355e293e250ab37720886f6b19fa3f96198093c66dfa3ab92b52a07bade6188bf6ab3455ae60910133d47afb035391a602d1c8efc719578fc415cb76950a48463280a71020b8e908aaaeee7c7eb526fa8ea6f18c8e159dc176cb1fe1a14c63ceaa7fbf26603e440407f7c8bec062834ee402947d3284fc1f0db47c701837c7ffeb1a3fc469b29262f0e9a6d7516e2b2b934887a2826ef2a118d2d57f631d084a575d44b46eaf2a2773a5496a116afdf3d46e94b3a5c26e315af9f65ba2b8a9e8663cf0ff7376076474903d3210598c9e595afad7a9f4cde1e29d2071ea68815b340dbc8b365ee68476293457a90ec22d4159fc3487b346e856e6708c9459657da8b0d3cfdbe634293cd8a79fd0c1b4229c81c27965bf7464bc7063f7a17a26917224f26310c7d8e6c5a274fda3cf61be0217b269982c0062557e3fe0ca16a52eb315fbea216c409be4526b643d1a7310196095c06d63301e3fcba916acd08f8c1433ec6d16eceed66434220c41596f98f32e948de0187a02e0a3316a1751cdbf6ab50c11d10d20f7c830df710af2097a012fd7b2fcccbb85ad555b81410f02c86cb402a648faaaf42edec7b20a24f1f94a43b1811f4a9d4bb1b9153a0c8c59d421d373d0eed3884823399fefa7c78e20e85355b59cd1fa70078b7456ea95d0b2c4b783635c841da15b503912a59172491582e3e646154f0b34c0f0953dbec068b067e3c82a9974c6753d93b16eb2a52f29150dcfbccb5d41d8e1788b60f92ab2cb59a767111b58e12cf8d366b6125bcb92af5b5cb385bec7b266eca772fa3cc9a77ccbc72c6e6847ad304629646f31bbe50753285c3dc3745a0eabb74a0ca71c3a50196df6743d36e3921009d371bd5007ae907147d0df831e6f4f2887fcc6323e875bbfeaad54b283f761906daa35097e4e5170d60cc7372e1d590572f997344c0ff0d81d29f24d69787589ef5df9a9d16e8e0a841603342113af765480010d081d72e5b4ffe0ebefc32778524daca9b24cb510b79195962f2102022e47283472f74385a42f0539d0539420a439dcd438806f13732800bb53d5abc2cc1cb808b6a3ef87aebcad9bb202372746364c42f4b73f345c298de4adcc84d913fa3b3341b8d2973e62eb78a817795b0ce3c8e3c2351717f13d068e2dd45cc3678f2d73d8e1553c5b0183e0220e4a1f2c32d590238821f6d735df12927bcf3ccdc36cba74076a68a2850d5c5262c21feb45313da8dc2462868758203e0a2755be3d178bac7cdf07f79a11d02e81b3d562fdb8541cfecb93a0ab90e7891ac39900d3a5bea01e2770cf2f8af896b64f3b42b0d8dd1f4af0689a32a3d166ef8b792913b4927bb9516bfdadd82e7ab0fa981aafbc1628eaa86aa324f575ae7b74fd110d04cf7b8390b56637839da53a3f2adc1d26cb5a06232b54cb4609b3e5fe744118920b26af68a91ba7031db79c3f68007823e9e8351d3ea1ba10cb48999d2a438b16fb1fe2246c70adabf0b5c8ac9074967b191f3316fa7886f76ba5d87cd005f07c41ce96a4238a2e933a5734ac07e7b6f92b02200674d7672e0f043b48a3959ba1f6555d57c316d166f7cca990038a62107af88c5ccbd01a065234fa66fce4cf712d9c7add3752a4300ea8abae1c265856bb293241fb6319b01ec5012f2e02605c9884fefe6c07e7d8eb39ad453a00c4c7af09d66159d50a0de0ba52370915b5f02f55c4fb54a8f880e24cc9e6d552cb494e3c5915c9ae810c50186ca69d49d014f3909635170b2ba88185604263d812fb7f7b463417663a6b1597095941b7907b39480dfac4d77f626a8699aead3aeb1d594f984b648ef0764436ce8bd49e343405695f2374360a4307659e18be6350b7c084311713f2751dc6b5aae13983c717bfbda2c2b5247559dc4e4846abef868ca9a4f5fd36736baf39d3b24b925912e570565d33a162b9dc8091b9b6ee8e0eda0b744c485ff05e7728ad7fff91bb6deb56f89cfe51afddfe0a25609fdae9ae0c4bfc22b2c3b0b0bf8a6db3b4cfc846eff0a32c17b8cd8fb434cc4aff25c43c7d9e67fa41d925258b012698b7a2d544790fe5af8c327c098160441b84186b3aa7c84e4f5120788d07551c7b7793d0145389ae4b885cd8704febb53d671b3323260739dda7db9280c5e9c156fa59ddcccd68685c93f3cab03a008177aee4674f8ed551cc9ae38f27d776b5d8f1ddaca2d6290fdee6b9f81a9a38c8e19faaacb7ce7c4978121f1856aaa7925db25428d5060f78551d3c2fb633dffe05552330ee165a72982af2f8c9c7c9a2acf84bb4b48693ef01acac5debdf80d3031fe5acc1ac16a0ed3b4cb12533b72a9846f050fa953a9797d07e155333676fdce126a5e02bac8c7bf6ba25d78f28a0862e1189a9e3f2c4de231fa62b1ba506534d255c409905cd89599a8ae323653e277e2c20d210352475600d8b333d6353a1d2ec3eb721f61a8b93371aef9e08f64022fc0a36b975d171744efbc94198b0a60387aac4e0a59657093c54d9801a424f2d25212262fc904134738e57cdd2080237733c792e340c2e1b911f44f2311e6ef4d498935beb50cee049c317c9326a092a1bd89fc2d98dd82b41801242e9aed309a10204887437453317b6212ea4b3854b017cd2263d64ee9694fcb81d58f03c305e20b6572408be17b9b12c037998ca17baed9829fd21208265c1fa03cb6eb0bbf8c9b8fafe18ac6d1dccdd5703fb860182cd437d8cdd5d6ed6f3a21f8cdb48b29d7c06e668726940fceec94c263e342428caabc0de706bb919d9ae5c8fec66499de47ea8b66ccea7073e25da0eaf76e767801ae5abf182f1ba51fab0a95f613e4f068880bb9f8d1886f218b0daefdc45aeb286e5f41a7f4332a0aec6a2813d7880ba41d550c4b0f466baad4f012336c6b78b41f33e320f23601bfb91a7faed3c90ef6fd03453869d3ad91286a391eb95a1ab36bddec6839f73a2cb73c602ce7b2ab43295a47113d93f103f0c3e403bafcfb33cb9f7ef2ddc955afda8e5524bf1f749a1eb79a0bb17da3f75d42551448840a5034efaed078dd5a2afbbee75489d8f0cca10e5e2345b94c5d93e6f1cb30ef8ec7678a1084368191b88ee5f58cf55f75bd563ba9e6206b7005cd3d2a39a0d5993c11be9824e900cb4616f596248f4cb8513996b9816f74706208d622d88ec442b0065770876061518db575ba1fd791178be3326df5b2536d3607ec436c5a91b6bce08b0a0732a58bcbe75526461d380385357b8b00eabdd8f82ad367c7df239a3265d5b0acf7a8ae260da4068f3344f0a1c323548e43dea3b9b0791b180ac38c27588423d102d44f6cad76d69406c4a0f557c5b60af7735bc5889158090b44fc724df1538719b56e6e2c6265dcfe60b44f2e05073dea58127d672345fdaa144394ce97299ea2352eb7d8ce58929290a2f8e99c53fee9998541cc86cf16ad28d422325621584638656e2bc7b881a826495ecbce95984f50dab4a781a96e32b66f4ba81d241bbb16ba8686fdda2dce27c654506a5b7c8918b650c1cc0863112b48d54c3e47fd37a86eadeb16880f195e70ee7edd96c82371ffeaf2cdadbe58239ab4da29cfe051c6cdc2e6ee0502a65b89f44de52ebc58c3de883eec6618033b0ccb1b3e73e6caece92c60c855d8683d8465151c6ced2615bfdaa62ead8c75f1f831436402b4f56d66189b4de7f7cdfd182a0ac5af5ebc770a1d23a62ad63338ed37221de9592a40fa0bed10660aa518ec9f588cc02e96b25c74ef2bd6b05eab6edf60abe8dc72f05f91bde2019388482546adf3f6966c20d047b80c5adf560a4704316f56d8a2374839582e2800004b63252c10c6a8dc78a6a419f567962d25a9cceaa8d736bc82dcadbce2bd34b870fb0e651d17a300172a95dac26770fb12c51b6215b4774f009c7b2aa8bfca25fc8ff8009eda93be461eee37cb32140c13d8302c06cfe2a8e2f5cdce8f725ed2bd360a3d31f825f6b75a7237b0f8c26ba55ae26551000060fb6fd1ebc5a016fe63dfce44ee7b1f053b8a4de2667673a77d6ef98ceedcd945aa59b469686ed31754fba4ad1db59387a0c8c5733000220789ead10ff2089c082de4f2e88e40bbaf3944e2220bdb95c4a3fd9e65a4b8593bd0120d76233b6c78f0863334c6a4640d6a3f6734446cb0df4ca06b182d18d01334d9cda091a0473d767726e1689c52b83042e54a282deaf3a7fda5c4a28ecf241c4cb2f824bc03a30fda944f948f7c9560a3a9298dc4faa9f3a4440c34c2cfd8a47356aad958c052627a816b8462d2a4364796b25e5546a40c1c0c045d303e64f96713a7e130728fb7e2f405e16d094752e76b7dd55f42c9b9cd4a1810bca382b787239e26650f7d850e6372a35206b18b3b6a2b144b127d0c624c6e8d17d44e19baec904f6c480444dc094d038485ff131f6424bf9bbe44decd2691e80f76e01a0ab3d7b0ffdefb11f43a887df0a74b72f2f9526659abbae5a3db3a9bb291093e888d9092ee0dc3efa10ee895be9a86afea731e7624972a4932ba632f6943f5fe5e99db728ccc4cdc8e65e91aa7521842003ae1da6a4b5ebd48c6cceee06b3098d0b2a43d87dc56daff28cd58792b2eb5481b0718ae22e0ddba66a84468073740248d6d3a2b6dcbf7ab46b8a4deb276b0daf543e4537a2656adbb101df3f2e042e41252cdecdfe709d069ad25ee5a6362aa28e9f131c0912dfcf36952a3bd60634803e9daa5c2bf6b0e2397f05fa540088d1950ef83a6345481019316ee3d30b2db76379f45b7a4b2a0810ea8b49695e1faad01d30b56576096feea9e10989271aeea708e205fa6406db489e342f77938a6aa8e384cf0a24dd68053e4b84cdc317857c06fb034064d69aab5373c30b080bea9414637a0abee5055a74f2c1261dff0018dc14d50254568866114fef9b552c3bf6ab2d0e8a5bbee5cf99a569153aa06afa223fc8dda4340777051a78cd2f638e7b1037e62a61cf51250129fc94058e3d8c769762c9a7050b93b24cf6854961693f54162a0e217d061f8b03fe377acc3f477cab5ae33932deea975585d53f9909fa45cbdcd725e557863eedca0236b42fb65891cd4af66b5fcd484c76684f6ddd0f274ec9044932365b422234bccbbe946c75fc4df1c49c52d5957a19afa6c2a219ab8b2af02b98d0cbaa5cf375f267e22b142d8f67118bd7f956d92d78f3338e9c11ef17b2316ab06fd36d07606d49156dd15db72e5a6d33538eb6ebf498fd727a32f741130eb00e47a42e43b1dba8a729559c941dd0fe18573d91f75d36388a2bdc88897a33bd7aa6b1a05caa61f81c340ea83e4153cbb072620af7b5565d394060d9cdca864546d394019d95790aff6cc2c48d22b351b54c7fef4aaf9a955adf17681bd29cfdaaace8a3a8e24da1cd25f8826baedde5e211b9f050fc5589b4e2663b96cc2614134950a61262d84ee76302978e1b2d05b9dc1c80ecebd874298691a24c9e21efe5422c0f1d0bb880392dc2de47482e872499d305b849426ae78eac86494d6b273b364942166443860f5699229cfef95541abc8590da1828ac63d403cc4a8f676106db0728d042847d6304839fd41bd2d949b2de554f453e771060d4ccdba1d141119d35b221f11aa9befc64444d159a15ee99b0a9721493f3016f7c1cd5599cc787986a51c5570900d30ec3d45d4610c8bf072aecd2f036f7dd37244a3ee86a82618321c43c22048c777dcc4839004daff0205dae18c1f983d69e2a134883af61d72f2287b5f2ae379f44b7c8d1f2bf49767fd331b8f7cc233f07a6d19150a055847137721448372da4a13e984730cb79c764c1c46e24b99aa8f91eae1404a8e9d0e2c128a84ec7c6491797fb437fdbebceef7daa0024fc31e63f6e7fa6cfd6e90e337e9b793697dcfd34df869dcfa8f539b2521b23a1368e71569bc2a6baf9b1d6c4019a814575d27eae6cdee426e6b073606bd172ddb05cf32c51ef54957f959273a8aa0a3a1f1d9ced226b211f0ae6205bfd149edfc891d583ad121a451ce1a63d617c0d24417be44e32d7e5834faf785d19c55ca51a5ca881f885d22a714e539edddf56d71b72ab045c7cc0d2b1ff5bc1f5462322ec3d9e5eb5e7d258b904ec199556ee548fb5e1f080640a56d2b2403d92f69e5383b00c537f52f33358fd053aa7bcd00bcb1d437a5ddff37c30614211ab955286670a480d5ffab18419486909d1dde917dc915c1b98d6fa80f651708ea92d737861bb6a8a45e17ec84026909288f62b968a5573be6a2b5acc0ee19d19ff0a3fdc73ae393f5a087c22840a511fe6d0f7ee8e1ebaf3506e2bc4b83926c6ac6c75c20556c03cad9e9eb1569a3a46f4bab427f563dca3beee918959b835b1c5738e1767119f4f16e788edab788ac5402a7c815c71a952336033a603e521badccbd97cd758cc3bc442936707752d6875a911bebc5f21f02c99a28105ddafe66e4dd0773b874e2534baa4376cfcb5068d5e480034d7c7bd09e1706644759af64b32e34f3bf2c5123ebdba855881cb76c83ffc50042d9f9074cba37d509a1ed40270411c77dbb51f0c0778311ab5e059191ca7db8f274218c514d5fa2ddf47f1813502489a02a1f867ad4479a5030c200222941abdebca09ed2c5d50a6ae6b5e62d4e313a4e2fefd05cb55d04c022ae61fd8bc12987da2b23d18257c6ca918215640a7cd5a8a76f8bca1898463d24b37c8ea084130299e8a86a1d6e751feb7e58367f003ff2bf04d10e67eb302cd8224637a8127d595d4aeca7a53002791bbeac4d781fd9813105c1ab02648c4893e3f8c6fc71c3bde5472a336c4e60ed43398f8b5767448f422c2433afc44d198919084923944b0e376e089c4ca788e13e3011a567809bea164a4b8880b830a134339895e30495a2d9f65fa5bd8c232c0b3c2b4d4e5d11fa4bc4309c3a0955f1bde5bc2dc556bee9e9949ac51a04893e52c71da9ebc9ddcc489d10423075d0d4f00ac84bcb4a958cc182ff6641c0bd483a91138d57a558c46b6f9f9790231000e2bf433029e010b7206592197436cdb28633e735fca6b889a6b6a4201672ebebd5365336424060fe7a7fe6c30344bc2a8680de2ab908f1c423d3a4aceae44cb0ea2ba022239d07ba15ce86bd855b7d38a70952ca07e3b9cfe7f5142b53bf08c89180babb464a18359a0f696c2ab3b0a81b5c58e100c6c9f457670698a2150076bb29a0b9aeeb32b4ec1de1725cc362bc6b09c64b3c1159248ecd2ccabcbaa6143a28fad547fd97b848cd1d6842140d07a6119164368d77d246ff5778f583fc04df209e38ee367ce5853f921710cc9261674f59bd005a90e73f970c3aa6b78596cbe12957b747a33f16e0429ddf2244413baa884aafe5d3e8446495f7e6ff1b0da959a706021d8a7bac4163f098fd6ee68383330251332a99bf368b910c8ea446f528be57a0f0b28d7ab247fabf76568717f79a4775486abbd8e0d4034020ed0ae82c25fd6d19894a010c84080d2b1ac8c8ab63c2a9f6a46509903629179300b1131d446e9daaa24ac60bf85e1adc76c98d2720f434fc18c3c8968848ce00911f6b2fe874f778c939bb65a65a2a01c3e8e1ab12bc7f72e76c08c1414bcac4477e23e6582385c5b40b829dc3bc26cd29b5a76968c692fca6067438c3a07bd7a0778e014c61753df6c41f102f6387015628b8f2fa0aa2ed8bec413bc88dd5908e568402af403db5fb84d7a43c6f3cae0c1a0ae0529ea81422d0f3fd96fe8396cf60091587a9dbd891c1e39c0ecd2e17dba35cbe8512d1c7d440d5a009231e7a1f4280866c2752d702abaab3b86c0300195e58dec02ebf856142098aa743f456e201f57c00f4630c713648d18ae51508be7bafd9c243e16969281274a264b2f64f73ec591d5635f3868c8fbae277bf8352445710726b0f4c457636cf0819b9afb0696f702b4a856ca8677229698af603ff0bffe8e302998ed8c400455a290c47440a5e86df3597f3aba4826e4ced538aa06035936fe6e4d9a798102f5489b9310fba12bde2d7c0c877645ed895fb6341da05cc2ff0d32652e57b243b1deb7168316adaffd88b2f1b1c3ea29963b4665e7e6e6e39dacfc3a60de43210b54fc0f39165c36f4907e7c44f953180933a51a943c30b0e70666c3a0095ac67b457c230f8194b205fb875b7ac06e84e1e7a9c01267ea9df0c5a838641ced0d671c208121b00941f88dbfb38fb00771602a01b82488b641b04907d9ee64ab66be9879c999fd2e730becd941004de6d9289ffce53375978bcd66d54d1666af49d4c558981d822f26dd58fcf6b8e817d910020c162ee60d1b82e127982bbb5cf243f2cbaa53226a104a249303c71305291585f97db24b8bb647d05fa7d4fa6ba5ee72c31e9cfea74ddc46e95eec41c21c2cf1fcb4804db97b69a095664e58f472bdc9a39182271856c4b3a05a6760af78a4359e1c38caf539cb40893cc7f217de662c38065fb8d90c3bdca7bbac871d56fc7b979e63e4c248b7f75540d3bea359bf84471a95270b75479da0929f98beaa089d321723ea277ab054853a4921ccd29263c41b5b724bd6fb913f37e8612346a4a1a514a3204859db0089c0acc7b7674edc0f5bbd3fd0e1b608b9c33914d72c3e7fb8db1788a08179afe620c1932026cf2669bffbc84774346abb6108cd2c84fb2bbcd3e6a7599d7d0be55ee7a637399c8a6ee16d97486563ec43358ca8da5ff37cb8f0c0387d952b9cda0c632a15b73de280491583e33aa05e878c11282a9b155c38b6870a91168f422b9d353bc4731b29961c2a79543f1c90cf1b6f28833beb400eeb93b3f0edc04808d9a643d00ca9434eb16f729d767145ae2b859a4e68dea8b6f664d33fbb33fb0f08a4c81b3ca18282f9f3b9e3cb6487698b0f3bf25ceed284f73c9746d3ac42f8013440157e88c5c5fa4b0864a6b9afd7c629396d80dfa4e679d5e8fb9f3a7febb6a273f5c0be1fa126ed810b8ef883448d2464d18934b5d8df6b72cd0902612620c347fba046c58d550906a0214a135a0dcac689a858b5310748405c0f1cb123b8198f9ddd1e6281afae00b3fae16d29ae42a34e8d04bb5040280d08ad285b72c5f665a5b8308e680fcfd012d056a09d6c862bf1951f7a612fbb7897790c3a80ae683af452b72c17ad0e83104ea331d6d9bc0fa8cf6738fe931f6bb5bd76483cd15d1763fea0db7e63ddcd345561f3a7477dad5d82f8c26bd6f2425d6915cc96af975291c7c65c46cd2687ed9ba61fe612e389132646e63559d49dc4a4c67b4e5175f9b6db3a1863d45b78b22d042abf0a1de03dc03ca844701403be09e680badabaaf0543f9d7040f4f3747261c915ebc9edcb349b65f8bb5ebe8cd3101b72fff7a5d50f66b9aa84105e77e66681c10fa5b847f3843019ec20cfe4214f69fcbec35e9765d5a1ca7e0c1629359cc1a9350e658c964e5510aa40c992c3fa36eba21e4ecd544679e3f87d652effee80e5188a12bfc1eb01a23eb4346e64d01c161ff0518200b64aab9626d0105aa489cb674b71c857445c90273c7b678133619fbaa4aa48e488ceb7e511c21fc0a0925fc8ab9288221e12474acea83663b038c4f543b85905d882a76209a95c272804031ff4485180c4ee833b380e1c6b5b7b4c73e80e08e8ef108c2b41928ab206f3e9a756d511c8f224fa2ad2be0a1a145b135ac851da371e41bdb19cd8ce151f8b9da790ae7418837c34a36f6eb280287a61389ac3cd1108cf598a8dcda1818c9fa0d9ba0dbee9cfe8a6d0a638ec306f0816c300fd1fd17a0cd2433831103ce55bf2600fed0830e30ec2e688704db0bd03d2278e93d641c0ad42ab17b49a550dbe9ad638f805fb6c8fa4da1c83c693f03ca97de50e2c94eece1f8fc4f6f386c73886b0266c8743cad063bbc1085a912e2edbc0197050ca4a8e5bf854dbeb88c92b8e4f12d51803d5a7bccea37fc0ae81560000b32f48778677e47d7690c8acc00a62828514ebd4dcb582d60c26abed62a32f52f5d5b74f28102c53895ee5dd1058fda6f3a41165161c778ad681e6d77c83c51167f2674bb78f03380d2f78f74de583c6e42c743ff42ac1a70b97f6d8c07ca933cd53c9744029b9b30594aac52d3b65ea5159af9a7c3180591524b394aa21e384fcda34b7f4f602a387ec652301061a66d163f6fca8036eca49996b0bfc79da37582cf40f0b80fac90bc256eca36a74ee958db28c8ecc45fb2fd5fff5c9b8e7d02073e3b7e2235e7e6bb88c9b370482ed681c37c3c12084ec844b6634d7f0bb33682af8d76b200a678faaf8429d9bbcd91f9604741eb88e17346787ec7eaf641b699bdefb0d130f11f03b4ae3e4a26984ba7c190a8ae353142b8c8179445312ef1015c7caddb6320fa2da61cb150a7a2204f5e0d31baa5dfd72903513300e11a4ba146ff465d2c53048ad5c527c19d8c827d72578258aca788e62c5965fe5ab4955979517785ca015969cf86b54c49bf6b5ca39b302f301aecfb0f089a802081224060128f00cf586c8af6a58115357330347bedcebaa9841659bfaf0fa43c44ebaa972b97da7abc1791552f87a8ee3d1c8ee658b9554e1de2e33cfa08725df375884928b69e2b93a61798535efdc27a6f71091458f9bda644cec62f6373e473abd29113cd0ad1c67618e6fecb99ae25c8f224019a5540cf5516a4fd274b28f4ea15794c2c251c7671b27e6f7e450a502cd3bd0ee7f7683943038009f5045ca128df7ea4eb8f8007d5517ac4c24db7ee3abcc270150447a573189230dc5eaaa00260b8bbba599b70a24e736803641529fa63ecfb5336327952cf68e6704e1f9ee36a7a7da7ad9c55e1e9839c34b7bb1b2434442f66328d695ece4d9ec393076032c485d040ba8a26d82ba6a1cc8e4e5987eb5e19112932a82b287a600b37651d9ecaa194c017f2a34c1e5bef84f699576952d6c2ad7e06f55f0e1bd09b133a1ee1ebb902e4a712eb702c1571bee28561977f4f8cae88f5b02deb056f083e44c16ed44e8803091cfd6baf159edddf6a0ebc7e8c8edffc2e1c9637714b69b3750bdc5b045e895606827e23f8393f123d933cd7f8fe06b030ab8e2254ab440d3d00057facb8e72dec601e105ca8c021d0aa39a1dc399750e044d5955e614613c1fe52367df86b7a37db8cfdaf3e0d12d7d568701bd7c6a607ae931e7e1c36a0fc58b486ea959700253f967b06623e90b4ffd83b62e8b41921344abbd8a9f36128d94107cd9de0ad3746501754feff47300e8c4495d7c3f8b5bd8740ca2b8c194d3e6078c11e32b97ed3ae23392384e680fa13047d4f01971deb8dcc0ec4509a23620cde8c7bb71b11f0fd70c681a2900f9bbea0f5880cab71fddbcf5d30f7e6219d0b4cf2841c5ef6775c0245dfe5d4ed4e1318653b98aca08efdabb68dc282c53f1c0f103a3bed33e663e25b556114926331b3dd5a1d4f308afb05fc79cf400a3ac6e136347c46ae04e0b904b53133df7eab095614f27fe8c53377d8fae678190ec5f4e11915f1071ca461c958ad7f3b916723b8c64312176d5eb22427344821ee64ab9a7312eabe92930f969994c64722376d678ff924445e554a71edb08fc5787bf5bbb076d20f1bead0fe65b61cf54c347ea2241e02c27dbe38bef979abe33b1e7415bc6fa36ebb4aee41dec4201f167b717d13ebff8a8dc898ba5da63018a31b5e32075ab64e0c7edf062f904f86ffa472b82f1da1780e18c4dc9323a512473ccafe6bb4a7de721b813973824138a773c2c534e6ebf5b95ce127861c081191ed293529a29b0385121a3657f3b1e32741ab58d80fad5b92800fa6c69d19d0ea6a3c8808250662b9c40efea9d844ae9518dc87c6b30b6cf1465a4858181554b012252a4aed9881345df94312472bb83988a68430b1d184f21ff24060dff09721acad39228407db34c7226ed75670cf0f92119e7ffd6e72022023635e133e2ad3d8ae2522b883890eb326133afc8420f7c90595483ca8c9507019c5234247bf0f8c786fa37d26e5eb6d9e6cd215f9560c32bc054175e493725888f8a5624e6264b6eee4b31fa7d31ff7b675866fe7cf7bddacbc892aeed68930abcb746ea36577671cd3aa5ad47a78deb9c1bc833650aa91e2e9e9d59bd0f56f9491219025f0eb0ec4fc2eb254c2aedaae5038a722a040ee97331ba2f756a57008e422029b841fef3434d0dcbe81fe241b5688a8abff46a275d888e92f152763f116cc242cb86d0a9686708d4f460f1f883d63de7a91501f2d05ee004207e07f74b91e7a706c5274582ad44623bc15a1237cbd09a42d27c8b26d794f335f35205e9b88722440e9ead195111656e607ab647583f969cf299d61ed40e8886e75c5aeb1bfe79d7fb81a0f1cc6258788df53686833cdf59d7049b1295afeb470eaffffde7efd9f66c064dd85a9bd25a53dad7db7caa18a9c3f089743f54bcb3075d89f9e5a405927df664c3ce37aa4f8d60a64c3895aee8a7669bc8a26debe53f82d6ca3d43888ebb6a31c8c190d1b11d6abc8c3f2c6d97f5a2bb28fd1a0c252827989abd454497ac3311147045e972e37c4e60d9754da1bf0425f878ea80990112ff4d41c228368eb9646176e05f767672dd3b5bb717aeb6989ae2d3df0fd939961c041cd041815c76ece882cad60446bdcb71a90bf676d73fd5d7219e0adeb673a4087070cdbf7e383f7bcb17634973cb777f23db8e81b9d8c89f64a70b41078011fc08473cdad69936c01ecd486caeb8d350588f5430618708ea1ca74d7cfe9e52145c4642dd786e0b4b7ac34c802bd7cb6ac9ae55c881c8252c321b9aebf1fefd5cfca93a595d95ed0fc8fc38febc74b8f949bbeb6d8e93ed8fef81fd0fed9749d318adbf83bff212ef143fb9f1fa37a04f45aa63f3230be2845a62133133f28d7ba08e4e25139ba4c8f09ed15ae6cb8223d230f2b29747667941acd8acd4187f5f7d08a7b5eb6393df074acff52fad4a18271a1da6f5ab304b4159ce8b8548af4c0d901f7b91174d1bcc3c689c6cfe7720d1f05c6ea1a547a94d0c330d588ca3ac3935f0a8c842726591960df8cdba960f597f70b8caf986d1b255d0796fbd6d2dcd5a55708d0a151ce3bbbf16fe7375c42ba872720dfa66529968a33a6df57fc2466849b4a7052c180b3dcc3c5be2917dcf2bb9f73b3da0e621f9226669407c791c55a9a35a63fb9a1a446c08a3e705e6b0874dd3e0ca06836c711145077ebde5eca217e1cbe06ed0adf69d6390913e9c3ebc2e0d5a0508c124f473ae04bff8f02f72f71ed3d65e8ade766de4ddf4bc145b8b10d493308edef7c868f68b80b0461013a11f93c5c50ccac9d0324a7c1602f50f2227e1672110afb69344450d86f9617ea73b1e3d2b8e08f45cd42af20f2d708c420815b9965e8d0137b8406af864c06ad24762b2f8075a336bab6c7764ab491878b70ccb921714b29654a29c9245392018203b403b6031e4dd50d2eeccdbfd45ae5c0666349acf2bbe4883c3573367f73f7b366ee86abf933bef5bff41aac65fe2eec2a9393f1a5475fd40d659e29510fe5cf3e4d5ab3e95f6cdecc912eea06179797dceafb6a63d1ee925bb12e874b5a49ac6bd796043a20e752cdf997a5cf9cf332cd7554a37bf74f4f96e4c9b61d6eb8697e609ad9cc25f7654ea3e85637e8b2cc3bef321f732e4bf5c8dc3b2b057158c887232a63a09885068ea9a6124bd8c52f89480798a24a08715202ec8586ec3bc03838849fa194ae7e4e02a554e3c37c124a09a8ac424b4fda347991a6a7b7a930e9aeb2c2a80ee0d902dbea3c30f3511c9c1abf617c6ac356b832df86652bb013b0ed7ad9f6f651dfd91657d3ead8f6c24759954559d4967adb4631f8271d70a7625057956d37eb0167b2984c06a37280f3a9c7a5356a26cb478ca37ad46375039abea81b54765d5b1d070a136a24dc623c8aeaf33c4f0f58e73ce824cd796a7df65b0c7c7ad2d0689fa23417b02d4e5d66749fc6b73b9a1c8975155060c35af039a73d38f5ce5968c83c4643e3559fc92e9836ced71587f3fe097a5e60b21e4e4fe3f3f12701d22241bc1f8057389415604f63633d609a144dbdcab61703b6afa506574bc69365cec378b204805f3d59720bbc99fa3c7633a0475b06becdc76f9351394869fc2db540000158731e4db5dfa5688cf61878985586553d0cdbae2bdbe238abb23bb6dd65c06a1483ad6eb0b1773567d0b099ecce2835e0406182b750e3599b9ba7a0027f6e7f416e027f01872339941a0cc04f60dbb5866d7112d8d6dfd856f763d8270360af96056cbbab806d773a01b0ad8e02b6d5cdb0de866dfd0b8b63d916c75a60dbd5b315580eb7ab97f520f597ec66f8c0cd00fb96e6a3be06e3c8f8189c1a8ffa0b18878247fd0ee3c078145d3dea538c33c1a37ebd4df8a8c79109b87994ed70f36d37a9bf1e55d9f6dead4ee0547d6773979de0faed6d3b9dcefb75bd99ece69fbeed70f3bbb7b5fcdbbc8bcac1e93de8be82b7a91448ffe9d79273bca2be45d9b6c3cd57bd05b6ddf5d3576033d9cd209399ea06dbfd3f4dd55c9afa7b39dc0ca8c7fe033703ca6edf7b8f40e96d9e83d2dbd80fbe9a6bf3cd476db956f5fb7ed0e1e65f3693a124c6d99fcc643703f9f73d7e1cd691a4076e06dbcda0a60606060646ab26d701d691581f7b14bde5f697593faa3f47f2906fb9fc39945fe609d6e154eb96c39febf496bb3f2617029bef417ae2cedd67fdeea301da0765369d4637d4163a45e701a2a3b5a0653626484ee2cfa9274988a14afd4001b3c6a58aac983e2c959ff4123722e25a6b3df4f5de7b6fde96aebff385f9a4940f140ce8e15350262712d44a8de2a79094c759630b697de2ebf4838efe646f2d6cd5369d5cfa3e58d13eede64635d0ce9dcdb7def9f65ab3f8da67adb536f7277f60581ffdedeab351c98b3410444834e50cc558911112134e40b8c135446805901f213d44655c3cc62c293fbe507e84f14fef2160fc8e2fd951fe736587e8e246931c206445403f78841347ae7ad67276601fbd279d5b2e62c50be52856d2931bbd6477976a94e38d5354a31a3dbb0fe722527caeb7b9b1ce28ef7bfb686852526bd2c308955e0f2522b6c63ab33e145003a122083504abc843ede5b77e77ee1fd90133ce5850f9823194818962ec4e3325eafc445170ce394f72e473dd4db207e6fc4451e5ea8c771432d3c0f18ecf93f43edfdacce5277f5922fecc6ffdee347f9c4ca8d65af7f85a357bf1b301242526d69caca040e928032ad33262c707b3104ed26494308296a38c5766347d44a892f3e144d0b7838508654e549688d86530be46f08044009d40b31102c6c155a47fd2b75424a7e4d9d9eb2eecd44f42753dc94422180302745ac1048404dfc0e9c9750ed34cb9891e0536e3f7bdf7ce57082e3dbd6fddb84e64fdf2c928af2ddff6c928afe3fe69adc6f335d75a6bddebe57c7d6a292b5fab3da9285b0a6bd5a499dea1298edfb7a9d394bda524845a8262c61d4770f4b00d270da3976426c17351e295bdf5de7be79b34b799fad408c3ba92fc702c79e121cca3c5d71beefea47826d25d14da4f3f2915154506ba84ebbd37d71c45ce4a38afbbb0e3a103bd4936df1984d0d06271a36904500d9e1789b51fd8c4fe158d785d6a5d5356a0e451935c18274647069cb68056928e9cecd0a832e3486846091315451f5adad28cb32a215e4090d1e4c3e813433103cb38ab3a03db7cbbb0787296e34c49e6933d33322a5cc5de684610db2c684bf6e5d882d17c7ecc279f9076763e28a2f47305c9cb27a424c66a6ebe7d3cc236d7e691c7151edabbeb278796cebacddf3477ab7dd62479b137cdebc9b2344d35026506fc73e639df9b031df6f0291971a5e20ac3b0c1363a5b1392feaed23ac4d7668ef6f121c4921e587a704911b10384344c6102bff059e2ba3d8e51284aaef85eb8ecc5f86adcdd006b16fbeb3fc9817f590fe6cda119db70e405a4c7398f95b82ccbfc3b60c0186cd43ca169ef5ef5a4bfe16a28900980f1de467761f7cbac4902acf9dfb3fc25096e9964a337b7617213c80b6e26c618636cee5ce62cfc399b3e6701fc9c73ce799765ce39e75c9a3c0a9802706443048021562817e47b3d167a3a15b05030ab119b208c866b82112794c09b619239ba11c50cc108bd04ad523d2e523a362caa592a8686f1b3ab1be155fba79fcc21d9a85c89f0ea71ebcd9b367689cd6b9afac6344dd33431ec6e763ede0b9ed9b6838dee7a768771f00dd680d4505e8992cb7b6eb4132979c9d73445d53abf802b7bc9f44b9f795996177e3b1da9e177afdac561a8d15d508010d2e783e437c057fb7c907c3e4a9a2369f269fb38eefccca83ec13957d2d31d07493092626c4d891122d89312a3db6ffdee348b32ded9f15e9aa66972135f5abc8371b96012f7b30aad776439a91d596102080e0dbac8d76059beee7c77244b9a6db9d6daec3de58ee28f238b184d6bd8a94b4ab78f8865ef6df8277f489e7eeb7727675a41a2aa86951668528c5e10e93569e59ccb4ffe908c584d4ce49a276de9850c11b2a8b40ce126afac2f117befbdf7cf8bf8f7cfebf8d54ffe8e40fdc24cbdf50dedba939d973c59ce79ef2130088ef6ddb7eefb0adfdadc9ffc21f9c08b7873779db515a32798bd6715370e3db54ac09812ce2d629b37a39899956c9265c895e77dd3c1dd6ea4b7acb1982cb515466b89ede52b4abaa29d2e601fbaed0b6946d5929249b380c0a03c9753eb854ccf6aa1721e97bdd535580b1a53ebf8927326942e7098eca964de2af2d5c8f79a23254f33916f57c4ae7cedb6e6fcabebe4fcf3bdf7ee369b07092b884728e429c8a4f6b9f975c5dcbbb32def258ac0443059b24622ab6809ecb88156bdfbde7b06aa3d8ee825fbbd7d93ee25e7bb07016949468e54b686f018f235f4b9d97f5a5bbdb37e03ec7d6058a9bee8de9bfba08626c91e6dbc8d57f1abbff5bb530db223210651d0470b9e1a43b090342a4bfb678d0b84352d4b2a9460252cb034a7b411ac58c9d942bda533a62b48b8de7befbd75cf1652d1df68ffe413128b1c1f53502e499e7397b20096a0202a41683c511184b7d14ebfb237d48506173452b4204ed50026e9d89a6724865a482101233b6865475f580e241e131661671a46ce921f1e2c1e65357c1c85a96dcd0b7bd27fa07c090b814025c205b92cede0c65cbc703d97203333d4214113d42a08e97a71034a00a2dac85ce6442a44e7a63405052135e1c8ea9bf931a42aadd8820bd20455b766781278a83274081dc825480e4fb389994dca1c22ea564ae5e2c45f7a6c1c3cc666b1268d40b5d65a67f97aefbdb71412dadfea27a590a02c40c7e6c4a9a8cd94a48bcc1dda068c15273609231059d08e51987c69158701654b247601f2d81395aaa6ae2323724cc2735296c8bcc4500bc724292196f40a99cc688c0571cfdcc68ac4888abc64341e5192926eb7293aa0f884f849f2beb7942bc293adad43f49273def726bb36784ec4b6fe72391bb2a2c578131f0ac528e6ad6ba00a3845d9a23282aac8092f48efb07d21a042ca545029479796a81cafae9d6213a31cf911928272036acacd4b6a17dd9f730938c0a1830b6cf000ac2b3dc6bb7c8337b85e8fbbde5fafbb7e773d068c7385fffa0dae7f00c6b9c37f7d07d75fe07a0e5ccfe1fa115c5f827bcd1ef42cd10d723726bbf36119fdf2b7bbdf398ebdf6cdb3d4255b765e961b0bc6965587a5420b564f162c10588c696ac6639a5f75dec6e8e4ca8a337e59311a41330eab187967c62533239032630e2a461947e38a29c61f32e38e942296b16299985f75dea60825ca8a2b268152cc7a52ac7252ec3529368d503c6252dc1156a4b1a4d84249f14492a208b02b2d5fabc7adb7ab332fafbb12ebba5ac275b585e48ab875f5d3ba72caba4a3a72c5c3c8d510d6950be3158ae215892be21a91886645945245644245e41a128b42e25490f834455402127dfc88377cc4173d6290d4ea71eb8d5882e775c49c28ab2b5056539eac9a14b1f272b2c22262256cb28a62b21ab264f56388950842ac6228598110c4ca27c94a07a94aeda88a8a51d5132055603faa8e145551f9a892ea51c5c4a3ca88c8af3a6f53a563c78aab9aa1a38a458e2a13225485c04195e50695990daa2843544a6a5069d1a0b29a41e5934145240615d285e1579db7a122ba2f561c550d21aa105c5001dd10a846dc16c32d97c5b0ca5d311cbb200cc3ae8a21921b34bcba2986c08b6258e402ad1eb7de8641ee09af1bf6b8268636eecf50e8fa0c53dc9e21cf2d31fc707984562e0921d91d211ce18a1076dd1042e3dd1106af8e10ea82100ab939c2a2fb4188634d08638b5045d722ece95984203a96605a570b1e7b5ad049bf12fcea5682463adaea71eb2d38fc3957f939e79cf32ecb9c73ceb93483bcb3e092591048593047a71294d18fc1157d4af0a7930577ba142c7d6caaac8b4d41e951a69274285359fdc954557732d5eb4da69afa0853479dc91451d8d4d092292125534149a67ac0a674beb078f955e76dccbe69767dd3344dd3e47b9ba6699ae62e81625cc0302440ae2da0510b28cc02f28e00998c008fb0804446e050112874050c22027bacfcaaf336409d5cf573ce39e75d9639e79c736962a1321b8a09c3825c5346a0f0c7f331f58ea4887843514250bf20fef4eb69c04f87013e2c0bf09929c02796c11796001f17027c460c3ea1063e1e8e8fe900bea31b1f91017c4305f00911c017b4f3f5f00c7c3a1c831e167e41cf8c5fe889f101f4c2b8053d2e5e41cfc875abc7ad371c8ecea8240adfefa122c1014802b319000002301885712088811c07f50014800937a27894a0482c160b88c2402818188702612018302a00000003400003420845b344c41fe0b9041222de85005c6c886cf0b0e70608e5676eb020f95d5860b4f0cca80148eb0d12b03ac047bc0f199a673320dbdd3cf4ec873406b7366094237314d1c6a8c044215273f0764f03985f6367a4e0351380c5440ad8cb03049998b43a94028a73348a29094475536760ac6107386f246e7138abab563450dcd41f18abcb01c607d8d73e65455721eb4eccc040fb702d34a16d7155f68158090f6047b412021d46831c1b32c725c98a2b601c95a1f0e607d00e95b2b60109172c11bbe673bdcba95f4c821d4140ece5f31b4f738b00f6f6459bae41e405cf15fe008f5abe634387962e7ca9d56da842b12ab092ce0d6e9e0f119f9359ae3ea58e29828270fa77ce2d21e182278d719d83f8712426cc49fcc796290a627fe8ad0acdbce18b3bae74294bf4403f2ba42744f607d101684c82ffbad54a1a240c8b28773078cadf91825cce1859004d18ae50818db610c39faca85453e57e53c8c0ab236f6bcb2282729ad63de693ba776450788717db4593f355b3743ef8d795a33afc4705a739e553a0cdbcc6377c1d61f845f4af7e6f7b187fee5eaba691df1e974233b45f0a5576104e3dc52afff2bf4174d61355a266d24c70842176d9f00fd9246166c84dda7f3e9328d07114bc2aa2ffc0cd70c8b6c0dfd205d051f1a3ddc05c491c734407de97153d0b68c1f91dc6df9257edb1fa5a8ea2057db44b1b63cb1545b60bccd5f3cd2d80ccdc42987c30557af6a5752d7a40eb1ab4d99a1674d3762db552bcb6ed6a71052df8a15dcfb5b107c4b6db3761f0951151ca0b10160c6302bf282dfae344025ad7a8c5d6b5808b96b3d14a50dab6a5c5936a416fad7aaa8d3510db4c9f08331f1dd712573831813c2e1c43c9a63f4e3ca0bdac5a0c410b3a68fbbd960ca965fb5a5c450bf96815236d0ca4ed4bb52861ad6bd5620b5ad041cbd96a25086dd3d1e2e95af043ab1e6863302dafebd86aa6e98daebaf390f08826f2424bbf935058557b2080b6af69d1625aa7518ba96b41572d67a19521b46d5f8b276ac17fad72a28d40b49c929616d2bea65a0c590bbc6af90bad0ca16574b51c411b025f6cb96b9a8a86a1093d1d2141807924f496caaeff5d24a07519b52c5d1bb868391b2d09a565b7b43ca916e4adada6da3140cb8b12db2e5a7c3d7a473df4fa82080033538bf65ac1758e3b0a5a7a849625497bdc441bcb41db474bcb70a0bd22d0bad0a1e5cad6a69f526c33c5ca400b8a29eb8b5b8498a11da89e21c2a4798f7187b6438696ae583bbeabd6d7a636eb4c6be554eb9a53db294f4b53a41dcf45ebb5a1cd32d25a31d0bae0d076575a194adbd006da324fd2e2366ead3ac4b5487fad35d515ed9c7b30b69ab87061d2ba8e75295f2001be07c8dc99c7ee19c65b0d73d275afe7b63bfa0b06689daa3625a05ddc8956e453b4c8d6ab6d07086da05fdbb35ad0ea338016ebafb5a3baa295f39036e86cb4a76a49bbcf712dacb3d60e03dad7a2c5d6b5808bb6bbd14ad0b699e56aa152e5fb7625901b1e2b3a2f8353ce336bbf044341156861b4d47a0088b62b6951825ad7a4c5a86801772d6fab9520b46d438ba76bc14fad1ae6d8764756986f760399e27cf34588a4a35f46d12053f98dfe69eefad799698ec240b0f5ca362d6e8f769bd12df0d9f26b5b8ab646dbe6c816daffd8befa97fe6f153ba840f3f1bf5b8cf1b87336e3ec9e0fd724a1fd1bb4da0bed74a675f5693931b568b956fc55eb6968b106dab55cfbead472f1b5688956ec45eb6969b146dac52cd00a91484b05626d11c8b59428d692a2444b885a8c55955af4597e5b63da9450063034859d94c67d4d05be3d32235e92858440129d30111a63b5a8c7aa0611e274af73c31f8d81f0d6c76c356b6b3ab6576ecbc1b674a976fcaee56b5becd85acfed95b3e5e25bbad88e9f2d5fdb62c6d66a6c2fdc96836de9623b7eb73c3a5aec406b3db7577ecbc1c668fd0ab33500c6f6d6b6d9b9b5925b17b7e5645b9ad88ae90796ef4fced071d59befd1afb179734fd9f8347ce846b699ca9d20f910235ac63bc44e0e3374b2d935147fd38c1427b5aec8d6dbdbd260e5a46365c7385351392a75a4ba30700fc6c1a801c3a091fa99a3b6ee99d1c257c59a47a6700c7fc28b823e42dc8414547b67d353ec2a2906dc4326555602f280b701b20112b2ffb05c439f3bedd952b0d023053575f4e299107d3e8688eb2fa8b0760dd3536a56b30471b4abd5f62d501ff035ed620810c49f2af804e240f2be6dc5cebbc00a383892dca295ca03e2e4145676ca6d885efbeaccc8c465a23df8a2330b2952e8bc7ea0c6ccea5fe8bc514e66557d740bbac4fa54b16b453b5e7d6a232785d3ed01ef210ffeca50d46580cfeae2d249fc36349d4f3eddafc7c109c2683d2fa5f5dbc86f904e4c28086d1dca9b4f9beda426c231b81715a00f318161f5f4201111884faf333e99f3f5cf5e99fb7ca3f9fd75f1e9c1bec8e8c6a7fd86057cc5916a63e9cf5d4ca07713264ada205046836cc4b1722c065e5f94a8ce295ba8325e5a35802633616ecfe1bf8fdb1164e31b0ff49ad65a3e7a8b53984f7217f15049bea67b3108d4c19354a329ee18b0118ade3f07c04f60c6f687a4a6ebc51ddbb26bdeaa77d8ebb8517ae97d59a504261ad8e05a236b4c6482ff9c5c4cc22e0dbec6419145a24c7d16c96a39521dde1925ff4f81775da7b3e9f667ec1a0d3a01d4b3cb73ce273d08bcd544364d2cfbaae28b15398e4fe99f6feb4952a25f566ebb34b8131204365874125daa8b2034c7679872508918ac400535bf38c29ef929281874637494b183163aec32580c45aad33f5f71605e65e9a3d6de6e3ad9a0f41b630a3c4ca31308a03f907e2266319ab3af8802ab39b0522b602059884bd924ed12b2d09f0eda87bc582942c34914c16d67a7a8f54ad90988ba78c41e9f2eec7f79449bf1834a3323c019bea56ce975f34684b06d05387a28f61f6748385019ca4feda777d4165b572682e0b944c9159eef0bbdb2926aba656be9c50ece08ac739845008e152598c94ecb3967b03935d94473dea8dd007209ba7029f20df7517fc1503dbeeef0228c61c49c551b43a976dac105c97347e8c5538499410d976a702e63f68799763639e71b1a92158a950450983d1b04ac907f56cd7184033af67ac41b59b804d986faa6a1db16dec88241c05db687f35ac792a4b1c583c01bb6ef8bf51d17d2f84603b0ddf637e39a9e35717cd120f08aedcb59f7baef75fe25962dad6bf8fb33b5b84a2f057d5ffc673c785818fec099d467211e1190c8a186bd2aa8b09ef9235c9eeb7f0eb7e52390992618ea939259c988b07ff1f66ecd754479ae13652a40168d187b9bc2acf1be78f2d9feb3559b17e96776229b69824d11aac96be7df8ed67c2f469aa94293f4b706429317eed6a326722c50900332a8c1c32bf54f482ea95f0a4241640da03cb9ff50aa85ba203abe52d49653024cf5bafd13e59ac1fd8e2199d502ab2c4c8a65a9ab6ce5d6c385fb5c60c271274b80efe0049423a6fe98f000651c31bdf82fdb4566b4e16afb966e7414660ef3938bbee7cc8a9e002bff24ca2558b630333ec9ac5cd0baa0a139fcb85cc4779199757e2d4ef9f17f9d21ea6945c6327328daa3c0b894410d2d9a33cd44ace651c37e865f1518bbfb4024a3b0199f480f9515cd58722bd19d85a3793001df38146b49e6a51aca82c1926981a7e0475cd8d32581703209382932bcda1164975822d663217ce7090ca087e1edbd1933264bac432e5346769d87300d1047ab8ce7e742052c8ebcff8e0ebbeeb66197bb518ce9fbd8dfc568dfc3c3353d3c7bc32543bdc88cd4eba9dae0db80f2f49b9c64bb35848f819a2a41ef637c3322bdc512493509247428fb51a07648a103cb3a6600704216aa43a9379536b3661eb4fb75b11765eb9f6393eb848489b50b186ec044e3063a6c4609286f35eec5b7feec6802b8f872286dde0c22e5c22c0ab1b63307c054fe7fd59c1fb7d89cbc468c0ee1078310b8e774941c0d18f84f4236f78a2b184418bf3857114effcef9b68705aefb9d6b841823672c3a9e1bd6db111bbd9c86a7f0bc0fc8265ec9e499f4e4179c85a89d45e611f0c765849cd53e977cfa2884b8182b89e6d0cc2d716168e0ea88533f8ad18988f32758cd94d49f603553523f2218654e9430be84958992a73c495256da65bd34c4ab02cd495b38f457a603b861247429263ab7482b10850f9ed427a792d912af043aab4b3fd99227a94d96ec52827c04bb9d55fbd9a45598c2c2934a3991a4251e89645637fd8b85f0f2d1c02a632287d48b8fb0460e631bf7c3236fcd92f350e84e07f19e9346200a09a7f0decad14a3292684b3d12c94c1a2733ce4be22b4e2564188f5a0dd2308ff8060b0114740322dc6a873d1c51885ffcecfea32d68fab01ea5621bb9222bcae7472e444e4bbd2992795ce488241183b40980a0118b4c912b52233c3247f04847bed4161171d126a0144a8e0ce91c0be5e3234cce9028d943a473b8f4cf1d79521529b2221eb24d81ce71c92fffd1e818d5ce06a691dab360ac94df4f38bcf5952b388fe71d3cd59911291a1a1ec110cb9982195c7ee54c2482ab74a5a6204f7f46cf15eb624999b70c04a67e0499248df1e6c7e786785e8e917c44b89d20c24945e4357848e0bdd3a17f2c848f9fb073a664be6aa71c1f6173a2443e824933c524cb19cc58b565b10e3edb189da6bc8617b3cdcb62ae2131da15ed07e63717b5bdbe2721417d3cadc5cdf07dc323f4b681f2275ef9dd727e66ba7c4b67c06b40e403be2609f7d78c07b76389d042b98c17ea210100233743e0db1f3074d2ec0030596c20bab9fc33a369e4b80bfc0dd46cc8fd29f74595ee0edf4ac6f2c957899f5cedaa37681d64085b3a786c01c75a7a7438ff058f035df495686b87f015786aa3b84c8341eeab1045fb26966e1599f0e19dfdcf33b17da473e34b4fd1058a00041cc9edf59257346aa075bfc3d67b0b185e37c9020e353a5f56aa2fafefa844c665a8b683c9a3e34040464af9ae65e9854ffdc57451682dda9d249fd53d49e8c814401a6cf3c0c925bfefd1bc763bb31d08f7272201fc7cc31abe03123a93cb77931e240ec328df5e270d044d9100d7200393ade6e73ce6bbed831df8aaedd9099ed1252541d6bb3d9d3a9f259cbea660df90164c079c16b9997c1fac8e6be2c50e9370829cc2d461d2ee1dbdfc08c905edae7f334695bf0ac16f5755e7f0962874d6a082310cd037bb512a688df34dba86e8669d001be548ba4035e19cc32072de3b36752b8ed49aab53638879ed3dc9ede126b0115183a98c9b50834b052c2e44e426ecada57088648043971fa9a57a50128a41dc7a811204e3e8aa50b0c9cfc8b1f28f53868800ee75bde05f2bea453ef17c64a850b911cdfe3d580541d09b5e42db1a08bb8fa67c423d65b6735d63813f51a30bb239a616765b388dff10ce7e84dc34dbe97067c24fc209643d13f3ff8c23a2d7187053ecca13d5a71fb56919aded70a206103b356c415e316f0d1831171c16c6a864f6326fbff8f7982de256f0e788f700dbd050dda9a997552efe29a53f343a5773a8cf9e64b60f0f7d721afb2ce3a690ccfef8927af6e2e3f70bd49dbec5f13824c862003a33025b260c1a22ce6232ef39f0ff89797d2f1a07617960bb54bc8d4bf05f5bd1b7ffe7fec7a5b0873f2dbdfde071df0123ea6e0251b9ff8d6d02fd4b0d600bdd611e3b9fa04ac149e79785aa5780fc8cacfd3a610b500737905b48ad0fc1b97db6a6919e089891496d84c16d01637511c59bbcf37bf09456f1e8ddaffaa9791e4659942e1f309e830dccef092c8ddf082ed6d7a27f2b0cf99efb925ce0763721149407170e779a657266d705ac6b26a3ad4ba02c2235cf3890364dc1f7050e56a240cbfb9e49ac85cfd08b140d2df722cff2fa42a8eeb1ad350acc0f8cdf39ea99279782cfd3b296c6a4f84c6a146ab80ab6052de575b60c54cabe5a1f21d3be73bc5603b77d240c12a358429a303de2000a9388bb3fb754dcbcc8486d34e07893b8d5ce60c999e72f116802820cb7d728f1828dbfa288b0d3cbebe0352a20751020278c75375cf7f559b2200c41dcfcbccb8c399ca695ad5a08fdc756e924fce7239cdda05891494c35b24e6eb61fbaf4553187bf8a6a94c5007f1069ab02e45323f45880b22d04320a6e429afe9bd7ff23fede75fb0869d625c5bd4edcfe0b365ad349820f8863e886c67a2dd8242bd9374d9cf7cc94d5009fe61d43e9dc4156ae4fbb44959a47b6a0a0796cf683fa4908609f6529171663957aa8b9281d0eb5351c9dc217ab35d6befd664c6f15d7abd0600a80ef0c44ef6e279aa9d18649849732fa4e3cd3ecdfa3c2e8cf8da8c556f52b66022919b644d4dfacdf25c2e4dbdcd270bacd2acf9101de1dfefdb0d20e9320b3160592ef791f0586f2c91b0a2da9b87bb82548209dd981896e656586a697c7c656a7cb071afae1e754a81d2cf957683a6035cf6efd06e3a87fcf619a795d38b19468e43a7e13847c395237997e4afae1cecac074a701ea50c07995e87ef80ec8b6c4c33fbc86e76be45a8be1530e2fdf4674eaf7ac85ebf4f5640740e66c467915ab7c9c34e44168921a8da8b7851b308ecdfd72146283cc7bfdaa4be7dd01968ab8ede8df8016f4e5919624df08c93b3e1aac1e97515a63b1583adb399dd87332884e85abc761945c7bca18997d3a484e4ccc9db8f05ab4cd0c820b280e98ef7439d1d32e7ff264d63c8d719679537ffdf178e8cbec9fcb2bf0720c7d0a37f26f76e29f84fe3072888e52a66841a05d4cc57fa1ec47e9a84e8dfa3f807f7eb0d30970c0f151aeb302c5d60001651dfd252c61c39366d04d3fba5ddc9815d282f6b80d2ee8b9835536e2dee77f5a00e09853d90c2d00983caa2b3515c01e16c02bbbc093aef92d4d9a45c1fe3e1c51f7152d3cf265094edab59a9cb2c727960b03d41d50546428c0253767053a55f16f723e51407fa2e82f9adc25030e2c1088477809e0b42bbdfd6ea68ddafdcaf78a51945937accc66ef8858042db946a7ebe8bbd1a858c44aee91394d656480f6815d3db7138cddbba0334e46fff7964def5b44d76e000a788514edeeddb3687a49fe8ff0a25992b2d7664cda45931cadaa333dfa7662d3b84d6427503c2a9cd341d00dcc2f4c6ec0b5b26216270511511927d0251f16ac89bef9ef71014bf2480668b0222120c22a713a25bb49106b9b0310aa26442b964503d029d92f3edd3f5cdf564fe519b08ca41428eb367096f6dbd2412a96b55ccb5e2ba07685e492e32ad4d17266e27911e0deb8d12510636e96e7c1e2e118dac756c9fbdf9b2b6369a3136b0a51d98c4a5eb40b9bd47547846bc18ca095c2c872eabbf783f1abfe03eccc9072f9a548202ed27a778a4e92e4826716df31741d432106237c5f8821ee025ed228746bc6194de35143cd68962bc80e419ac9baf7cc793181f80d3d38830b06ef81bd18f9f9b25704e42cf6313a3016b3702146b87516729d11c0011334bfbd5b5e967b5114b7c7e87eeec0387cd51d41d4518470165d0890ff810ab7f717ddfd4d5fff89c4669f1642506dc5861d2c6ff3fc50090226077e77f6fa0b1c7d561cb746f409ae920ef8138122e40649cc83bfbfa9a65c2666a2b29b7e9239c6c7f95501da963a7a150d74a67679d3555b739cd45f3bcb0f4ea75fec2b9afb5c4afb21b9501fc8294bc420d668180e8c5270341b03198f784d4726cefbe277ceb716060d680c8774707849f200a8aaf506f91cbcab7bcb109a8f197da362523d6b2fed9f2e0d680b0e2ad20fdba2c34fbe014ba3e2031fc66580088fbba2cff5c3eab2aca290585ffd5896ead544008884b485355a3746f1a9f6e09518b6b94418ea067cbe4f53a80f80162800a6410b1d7243bb2a00c71957e97068960e89e502df35b181f7579664915b741446e4a0e482062f140c8cca80f47a55ebbfcb0d34251e80b66cfc6b05f43976f45ffe838b479518852db32ed7745bec5020adbaf24bcc3ba450c5953c7542738beb3b5671d52e137c46c632cba61edfa76cf16e0739e76292b16765623c640befa77b9bcfbb0cafdd388411ac309f9127a0fd5586cdb4cec215de2e8eef6d79f1db0fff5d0c9711ff081422038c8f1a4ac6cbeda009e506fad708cc3a2f0496b84be27650a17e37840540217eadcc7a100bd5bb0925c592e4afe8574e8219cc28d60252b525038f7d6d055c725550d690c494d97025286774124a182b79baa874a76980885893062256a09649cc1de9b2ee3c773c0dad5cf1b41e3c983456d8407e1d6fc1bb4fe0f9f12f543a9b91377f125212cb553c00c56391ea49b0c4f6041c41d7f722df643d9172c35c5da0c50b39a26fdb1a7e4ce7d2cefbb38f1404c83c20cfca0e03c65efe318b8a53032cbe26e5b85b6fd2169c9d960cb794be2032ca6f6f987336abd86f4b4701ad6c2112fc072aef417ca87e5d42cd852a00ced04a9e3fd699f573c09ab9d2978ece85db4647d5d543b2d3a330f027a90332bd50063175d98cad7dee954e475504ae391fca59d344762d90d3f36a2505617f8192babbee81da9e5ea049e47c41839987756636087f687890f437fe1f3072013a6b57482131b97db5660e0b0162c70b8b70160bde915255067baba339c9af2affb7cb36ad306ecba549003f6eb364d9b26d31e61f403a5d76b83653700573a6306718d4db458fa31fb07527f99b011180f2e31328ad1ac5d480efcd564d963a901ee7cf7d07a5484885b004d86e7b616677a828ce2719f0378247a7b623d1e6bb756d583daf01f94d8105a1e4f8860f9c168d9cc40d1c3fe58d58383ef4094f020aaa00bae0882104f6ae731b193df51f31cabe9d5f6662e07f90653c7ab246a728eb499c73f86184405506b8458fec552af08af3859090510329696563a59559ddde70d18b2c9d5546f1bde53612330a022af7fe1a3752b1de09dd82c6260e5436c42f1a5c2829b6596235ebf871d0cd916c9a92f312ff8267c0b77462b546c426c074f55bb574eeb3a0ad2499e7e51003942aade41e1e8ccf3e966f969a7df739ea7607e1a86e85d4d1a35c8a43453f0ac5e37360a614dd404dc9a19c941680fc887fbc6c499c9c38c5e99c6143d34bd44215505334211e15d1b22766ba4542dd9b0013155354f8184c874ae9fa3251e11109a9c509e101edabe1859e4a78e03ecf853a79f5e037fe29e08e90cd1371993e663692a33bba32aaf8b6c2e0ecc158bda34591e9209f22421c027c8a7878b21f3c877a1bd2b9ae533fd3ef0ad8f8a2c316b13305eb8e16376928688961d1dcc440a7ec9bc1a9c2c8f943842e933162e595116d331bd74593b52943bddd8e641ed9c820c4ba68f57218ee63b9de9c3e999d9dac3205da94625da4bfde7a0f1d68ac02ea2f06c9fad25475b601ab2d59a512b1611c7c8848a3847fdf6d5fade102e3997d410a319dfec5d95291444e2a7a36a876508334d58fedc0ee7ee8593a6945d17a433fe5a4498cf6a1b7d6fe3a38a90d796bed4f98b3f54bb9714b72c420638c22083c6f42ce4c2fa9b3a38b211b8155f6f91e862333dc728962ef6fede60c68f7d477f56ee628d42c78e079c285282c19bae9bd852bf7e79faddcbcf3c09ae97ae8176828b7e52c7991f5abb1f07915ebcf716f807f7efb851b8baeaa343245560283a85b34c49a681e448521973bd3f5f55721c837e62af269bd7b6d644a75f98dbde471b60d6ffa04c17e88729cbb5906b2b516eb293fa3f943280db8fe00a0ff27bc42ba2986149f1138b6db2aa722de6f5cef7568315105fb40d5015110af9e3fe6595f8a8787bfc523cc7a0b531b40c1d0cf5d7518273bf50da3e2eac7bab8a0e4489406a2947fb1ab152a425142878a7a85e5bc73dc2df34572e86ffb3c0500dea3ca1317401ae3c4e2a103f008ebdb2f4178a1f7bcbb05871933ca2c01aabf44226896805e349426415fb536de5e0297b50d3178745f31012d763c7a014dd8ae056958f846f731ca59e96159b987818672c2ac0d7e0ca238ec9bb5e67680fff7ac238bd7199106f96028401ef6089e37f87ac5e6fa410413cd889f47d5c6d53fb904833bdb6df8305b685ddab5a5b72a2ec536ea087ab72cb775a61362e6ef1714164f6d44b6093f59130f0aabb9227060c8debdc9398386852fa6a493afa7d5d71a7a69d0c4ed73ece8c5318a227feadb53357a08937def6929c57c6dd4fd6f0c4b0c648cd73feeca87c0540441a9dab45f0c5c7854fb429ca00a7c5a02bade49605c4090ba4d0768e62931596a0ad5bd60c025215e825904471e9a5fd16042c99809b6c35a7e21e27b17f890d415250fe4a05a87d84fa37659b48dc10d92af1c12c0a6ee5915c29e3f58557bd19a4c8dadbbad851a915bca24a5dc3b4919f7051206f50596526aadb5d65a4aa97dc2d233775a6badb594524a29b593da6ab14bc99d2c981919554284d196adb64e6aabdd5cc293db18acb5d6526badb5d656ebd3d24aaf4b4a29a519a594056eabd74a29a574524a299d945ab9c1732227752f5db62aa5949a97302c0d5bc5dcc9611005f1c50d63ec688122a785bc90f9b24485d28915e0ea39eef2eb6bb2ca2a650d822a31c7d048cc49ea84992dab395ae6f8d2c208e3be9440dbc1a6fbe7e0f28507d40bda0f49f810030e15677486d8a20a1d5e2085cda1c5a7e6ce9dae9211a4a0092c4131b0628a14f4189f1c9e2b51d02532cd927077a794524a6badd3e79c73ce392b9dd767e6b5d639e79c7356a713bbe44e6eddce39e79cb33a9d33bcd65a6badb5d65adda75b5babd339e79c735a3be79cd35a6badd3b9d5cedcddbdd6eaaed96aab9d73ce39a7573aedf568ed746bddbaad73ce39a71655cc1ca30c7bb4009365863d565090bfdf6173b88000a2004cbef490051658c248e920ef02a9b8210c21a8e488b1e10831d45d30b3a49edb617d50f2430a3c2c41c50a41567ae828da9578610a135ac4e40c8d014510e54e615a6633f339c34c21b993bbbbbb94d2dddd5d4ae9738669996561dcdddda594eeeeee524a9f338c94ee2ea59452babb0c13264cb55644cce9c01084022d888082840c7cc2e4e0f2450b02bcf0d67d6aae53c6e1c7a2ac58422c08c16027053e6068b0e2072857507912840cfd440baac8b2c50e174e6ca0e28b1334dcc98b0c2f5868a183840b7e884150115ec83c99b3092a38b0f002113788917246c49d981063abb59e326782b2a2c8d0e489973354bc98d8616d8cb07ead43d7ac0633d7ec6bd4524b29b59a7d22835cadb0d4a9109cf418dc813277f75a6badd6d65a6be5c1d23477ca22a3d65a2b08866832c40e2f70c1a50550166e8c0caa8e29765c4bebfc99419b97d22773ce18e4f963459e4e9dce39e79cd4a789caeaeed6ddddddadb5d6babbbbbbb5d6ba5b77ebeeeeeed6babbbbbbb5d65a777777b7d65a77b7eeeeeeeeeeeed6babbbbbbb5d65a776bad75cb51293d0677f71bdcdd59907127186aad5584e9d45a6bb59625e24e964e17638bd08a68ad94150445112d40a992c218572c71829f27d6adb532b8b82c0796bfdf61e3138f2082091124d002b3007d5e36909ccb31185e1c8b86b7742e9149b8c4b4325e4d73018c66ebbb92c8e4ac3e2e2bb966e8e36241fef05fe17304436020430b35183304152d6020a625868616443d514ed0050b925861045db844316433e4f2054a100d9936635852040e76085ac204587050222827688a4ff72c38432e41ae1dd752ff1245cb5a6bad41943b4931a790983bf99719b484eeeeee524a77777729a5bbbbbb5665955552f98506ed989fa694524a39e79c53ca1a349c73ba4b295dca2f56b40e07ac54f1f981f2420b564978d961ccce2bc7e7a8f9fb1d76471558d2495bd0f2ca348b3e5a82b228431f2d40587650a50e450b18262985e2858a2909f09cd984e273620e0a2bd9e60f3f9537c840e9181f185450618c163cc144451b894c9f70814b1455b253214c13f59daa4348c15e5396d65a6bf54b2ff58c06c4990af7aeec69bee0c9155bffde0bb36834de672e862403bb50eb0a5ab8bce08a7a3d7b6504d72b77aab5524aef7d61488617a440410d9a7cf939e20b14ea672ea594524a29a5f75e4ae9bd97d26b450b5ce24e56c0ccc0f48a10569420d15656c529b4c293e9674e29a594524a29a5f75e4a29a594de7b29a594527aefa5d74a957befbdf7da9ed714160856bce889c10ac66081c125c8c5a3dd6d8831598c1069dc2d41ad588640c27db208d5bfee6fcf98eadb7befbd57e83ae58245adb556afb7091ad47ae67785efbdf73eae21df5955a8353aa184df7b2f77ca2e09ee0da20536600df13ac20ad5ed23f2bd7f8241be4e2384f602cd9226a090628c269cd0c1a7e7a70a1454ae109cbc2ddc7befe3beb9f7de7befadb5d67ab9b04024b37befc5f7f6704941bef7deebc17baf0af7de7bafbba7aecebdf7de4b9dfaf5da42adf54a965ceba53e43cc40c3b90f4f18327a8e78892aa705cb0558a0400e3e4b6a30c319263fddc371d971a726ab0c19d534cdd669c511388062523740164604af4e0d752a3600dffad95066e4e6caa3fb4bafcdaef4b574a4a5d677769fe7acbb355eeabee9f96bf1d6cd937283bb1ce749c1f1502445e755383c115cd50d4fe755f83188ab7750762791d894fdd3a96ba3dbbe46c7d57415482382e30b7e0073344304f750bf3a45047f1ecd7f552482b9af3fdc0f86135549e007ed55e73ed6fc7782ad754d4d4de9f4a2e2a7a6d43d9fa724c3860ccf4767196fea161932dbddf1c9410e462c31324c364a1d147d4372e6e3b3091fc8d9b3309cf61adee7b8c66319f90086939309510194e307e99b2800a81ab58c98628650941e217451d3d54775fe353aee6d74dbdc3a1bcf7535de3bd457ac541fc519e91b14e7f9e8cccd21473e90430211ceabceece2c71de31a456efa7e61380886d32fd177ca9b07a10e1a4fe3f4f16d2a90b7d36b198c3dca0175989e86f705000379fb538e6cfa4842de32229f4da793f71d316112e967789fd3f44b861704ea88cf00dc92b13d964d26ef4b92b78fdf2d195eb73a1587742a6e5e5f11525b11f6c8f4dd8addeabed237d56b57a96b2ccdc3a3c3c4762821f6f163fb4a54f1330d287bf899033900cbefd266da267ebf52d9374fdf7c3c31ebeed2374017cb29a78702d25e63f106904ad56ed2a9c8222283c8fbdff23f67de10219d925e10309d82d8e7acfb6c3ba8227527c451f74131395e29a594997789c80ed2f9eb570421cbf1bf3f7b07039332ec516149aef9875499809d399335cf072662bd9c06c2e2426eef8365a494919579666687c0c5d0fc2e326b56a7a29397df409d6a274dfa070c7c42d600dc4efa06c23241da4ce3a8c8449c239929980dcc5f8791a3ec3810738f11152ccafdb08819e8e44c6ab5d6ce4184ac9890d02c2cc0bc86624e9dcd2ad3a43b21413a155f04bc03fb81bfe6e1692c5d3a15a5d73f9d2a85c005d0abcbf4cdd7afc6a26f1e5b49b9a3254abffa457b9642e082a753f93d9052b67ca861270b425f3e9153900885a46724672f3511faa6fbb518bfbbe005f81758be9459a7e01be132b6008c2512419c35d640430e58e4b082c2833989ac566cd2a37edd7d28bc5c8a13292c315e4e5c0d2ebb8e112ef7c730b88d704cfa8b2bff7e7fcde29c28e4658c0c453ddafb76e40f4379e50fbaa094c161c5265ee0217c02129c311b50003b889e83262bf0824d71e9f024bb746892a77c5cee8ed8c47a6633eb31a282a79c99280477777777779f577278981e86f13402e24712e00f73d2cad893be690dbb3b513af3a0c51a843162b71be310525fc444232a18a6300c421df56d4ebb9c60d2718535e99b0f7b17f88bab8a9d0b5cdfcde066e539515882bfd8e1f6fc7974b39a95db2bf2358b3e0aafecdfddd72ccc09d411df7180bfb88a3b65b09a1645005369de2b7f718545cf48b3327c656826c3777cc27c0ec45cbd13eafbe86c5fab9d8f98c18c3ded94e469a45943197e8679473a05358ce1c4143e42558c7115b7c0d84ea79cacf0a7c4896f812126638b50c488d0608e2feee48823230fe602ca7a4446f8002615e345b9778e4f42df40170ab0c8f1e388b55aad5250c52f8127c31f33190ae538f4c555ce48c827277f91498e4ea7087df3419f2f727c210d88a21f1306156412da260e79e10fbac0dc6007d8e139d5379fe7019c5adf3b7401f184efcc29dad7e030d6f784b118b1c0e03de5c83095e1b7234786aa0fabb2879fa14d97e60df58f8fe107f5e3671084871f80902376d01fb19b6b37a40250473fed260053fdb38300046201f8118406e4882088103be87fc0431d9d232542f390a5e0073fde06e23020daf49780dcfd1f01b2085bbce22ac2d791083becc2ee988d3e2519461650b39aa5d93a6df099a2891b00872284b8d0a105e04aa0454828dbc122458f77989b3284144fbab09fe520c4982faed070d470658c1015f506951fc6080144694ad0c3981cb4946450d921c80b1bdce2a04310143ee410b4c3131c8264d861514cc42d2016be83d58a4436a7cf9923f29c3e27a619fa9c69652b080222480af5c9020c2222280652153b670e794e168878a231216205225861cee40cba92e051610b2c2bf081869e41d6e302327966d8e38231f08b2f5a48f4c05981441833d80024860b547827a8d6da5ab1187eae24e103105f78b14565a7c8d65a4aa9b5d65a6b29a5d65a6b6d23b48ae443d8fb90870194218e0d57cdf9c90dd424775d7d7527771644e4af56a9d84dd320f7676a0296e3d795e94d1e0a9a140dd1bef4b294a327331fb5842dc15ff6420159e5b9ca1a7631f8419dbe6a2ff8f3a1ec312cc6e846d4e05f441cf841f64034f0bc80e35a92e36bce83e1502723fcb073c683e150303c140c0f181e0cc779b0c713bd5e81711e0ca7e4d1a1137e93bbe6f138a98b2adbd5559c3b186654901cfafea51c332a3ee995a8482fa4f4242f090ff193d02f3de9495e127fed95a8724a4f3f477b7f542c75d64b725ff350f14daf4495c47ec92bbdf6424aaf7d7c4d7b939744fb92a744a5442561c010b389da50747d5527b74803f8f3210f2066136fa74455753af510b31101b36926f8833f433a18f0fd0f82e99c205450c583fccf83ac6ad1df6f918fceb4caf449a73ccad3a98f62501eeac4098e4fc16c7a4a8f3bc6a7d37f2ab523522c9d6a1786537bdaa6bfae6a97dcffa7d4ef4879b083674a03b95099570fad72633ab97d08b369eaa23c3568d408a42f7dc943a1f4a4871aa9436189f6a44f42f2502394ec971eaa92686fdf4511802a6df280da80914e352c53757065e1f721fc8d499d12d5e7431996415101eca05f93b1eb14cf027f99999cbdba56c9ead516b0fcfaa4c76e803f1fc270a04ad55f759ac00f626eccfb2a93dc0fb1ea24f7933af9aadd09f10bf702eaf01be0af811cfb09ff29d5400de44395855127bd803afa459dbc9d7c75d9cf8e2c94b332b9a33bc6a7e965aee801f9caed61748a4a5df9d00a18750449a73ade00e30c8fb0c249aef9b2295e7476a08efe1cfcf950b3725c615585568600c032efa04783391610c360f93c30239c083c9660986b0a98fe10cce606f550422c0a7b4922155ac2b85449f08b80877efa4a70bc12d50d8f48fcbac21f040a82d940203f83b1cffa33d60b964819648a94125b69d9e245113ecc39815c5ee69c734e8c9585cc9cb333ef8365e26b0ce602102b974a9a10b37cdc751828b2b85426c42cdad5848f816d12fca2560f58727e64c844af2caa80f1baa313c40c4ae8d0530f9913f43cc152eb2a5bb99a68425f517cc880767c5e40946525caec2e5c0cbceac91205c2d61557685dd4796281749a58e8d2c1a593446712befcac5f38f3fa35d48e83c3a97b72e8d5af36d343f5bfcceb212f13394cc9c7d15d68231f771cb4918fc90f89fbc8e66c339d8afd2222653fa642ac2d51baac54b0848a2a5fd8cb158545855640220a4a5d588069b97c9c68423820f144a6c3e5c3da12c41240b4b632d60e39954a192d2512abe56205616fb4b29d2d403b2220a02a504cfd2aa28ad58e96960ddeaf16aa6189b68a21078818442317b672b5204aab04ac6a8524cbb51366e472a9d093c52943297cc8f9d63274598121933214f9c05085bd2c9badb5b644a9824586652f234c00e4425b489045361b5bf54db32208314710e493c91f9693e3cbce014dca2ddbf3d1b91f3bed9079d1acc254e94cfe603f3003e0c9d5ed3958f2be6d13b2fd0781b6af1eaedef719b5fd876d6c9bf7a19e7b0dc5754150a817026bb5c11ad23728efbb5fbffa9c1764c8fd22d5130281826c75dbb88dabdd0ca82694c9648333d94055ae56aea6b4d519b7ae6bbacbd574b7f5e5eeec57cb8cc6758f380f421ddc7719ceeb329d8a1fbdc6a286f632bd6cbc18206448a7ba4c6d5763e1695d993d39515219f6a83043e97bd47cbbbb63f26787d5bc7fa86f89fad2447d91f67a08f571f40d3069323e3e0944a2bb4f9fb2643b943f0e3ccd4c00933e02b8ccfd38e3bfd3f61fe6fef35ce3a7f75daf87e643e842ece3f092c02ba29871a96c3f8dbfde84d0dffb300def3b356e91e821eeef57f7c9c31f3f882a9e6678df69f3380fd6f8feb161e3ef8f8df71f1b3fbdeff411b91bf773b7ed6edcfd29d365c6c35bd39dbed4cdd03aee4ddd7ddce14075433a85e53483a78b990747639112047ffd5bc761aeab71fa1fea9499d74b424cefac3debb4d19d10334d774256a36b98897a34c4b5d6560f4a4400da44567ce85ed3dd2f75f3b7ae9f0756a33b21e60f02b97ce8ee33a38450fbf49548ce76a87efc4a549a2633795f887dec6670e77db787a47bfdea21f9fded49af039df43e6f2f47cf3d843800f80a00e7bc0f67f8849da4f77d7710da40efdbde4ba577cf640449fe4c3d2337933e8a7e901e3f0a08e9f1ff38e50f3fe93f23178a7a90bc22f8e1f3684cf4037bdfe98bc878f8f05ba86fa057c47ffbf81049f687b36638e3475e832932e3b7d7e21d753f0366e83f60ece04321c387b1832f04193efc946408bbafe691d7603a156b67eabe23d94447afc1aec8f69d39f7b179f3eb768488e9273792a3d188721eecd4c8fb9464269a97dde9c618f95442a7e2e9e7fc1af449f4218d986b36d037351f494fdf060a7ff7def6f3b7973f4c0fb9875b7dff6d84e2bc1fdbfbf6f0e59bbaaf3ecd33003fc0bd910e787bf9377eeb4c6ffaf95bf71d811e6af4f0fde5cf0e35fafa1335f27e7cf5be234732fced79605bf7d5c7e1f8e79bbc910e787a48b21bef5e11fc23af488d9f48b23c1f76dfe621b1f1b2c6d364d44f1190d38f9fded77959a7505e89f41492a8ec24a4f3e14649f44b349e52b8795fe99160d4abf9d26335b4abf90df44d0dfcac6fb687f44bafd1aed411f1c1f43f2854823f0d083b1a3f31510f1a3571079a5e237510c00f3bc54908eb4bfcdf29d3c70ce34e8d07014cf3b0533434de6978fe3cb03a3bc8a34feffe101fc9329a26f771277223ef439265c83d8eaff0fdf40edf21840e7f93dd911f9b077dc01f3d0f2cd3f8b8ff1fb9a4798ee653923d661a349e0746a33b7df705c934344fa4841b5ec437ba2c63107a1d883f64e4d316a0d596180c45695dc900865b805899c3ee978de4995ca3c8013efa2c82c0fde8670461fbd1bb16cd60e86abd72e72feeecb4a2b4aefce83ca46f4e5e7c93e94dde47f3da89a60b72fa104e40fce5d6a1b6af7998b90eb5793ef2f6266067ce4829b598e1b6e1ed5bd463fbdea4843c7ada00cfffb179dacef6114bdc893f51c4e4f8714adfe0c8f1a32b0279891fc5340e64e255a56fe0161378c9f1636b930e8899de28b2217f7b97f535510f29fd5404447a1b8d97310a4a7a445425fc80e39428c3c0f0e77f71c7012660353f51bf7545e46f356a987eeb4c8f8980649d32fd17b3296ed3e47d461490ddfbe47720667f6eebfc6507b38d2e6605e4ed8d20e954fc1add079280813f28347a5457a18ed1c32e8b1d8cbea69bb183d148cbee2904fc27fa3cb01349c653afc1c8f85347f3f86774306b54d48386464a5108f865bc8c081f7ec3007f0dbb03dc006f9affec3ee7deff83423240c83deca4f443282584a69bb737c12ccfc903e715d99eeb4cbf75d093d2af5508a5604f45982782abea87a2ad843a02bcbde93f28d482700708f7db6b5b474292fd65377ad8d5dfba2fe6ed67f75d20f2471308fc4ae2def4de19b9997bd8a1804c14904afafa1005c41f3ef48a8cde5f8aceabba84b689f04b9e47e405fcc59d96940d244386188e3b314a954ec52bd8140946ac125b31c69d2971a705a1dcf9d69c3c7127b607234a48960425a4332fb6a6ecacb4126a04acb512ec949c1dca07f4e9f13e9f9e2e3e3d40198a4290de87a44d883e3d5d32d6a14680a22122f0f03cc06c627b710a66b3933dc8f1fba529b921011e0de690ed79d029b8c383874245e4f9d8e70ff73f1412234fef4b658861e6619ef639747583815b387e06da0c6136f0cc94dc5305d0a61fd65c97e0f81e0ae6afbf3f0ae1cf87865280370d0453fd2717aeaddc4de4feef663b75cafc0f931ceb622675b711107f7613f006766a4633181a21a64b96f9cb76bed9ca7dd3fdfdd90e96dcad3ae5ceae7415f96b314fe099678646fc00e608239814f11201c9660bc3344fceaee4a1221055a5478df0a579a56dfa3d7b3957a75fe1d0213a34c5341d9a5eb86fb648a71adf2493eb770047ad5bf50d0406c3995ffa1148af7928d8277dc943810721f649daa3707f7aa8f850557aa8eaaa43fa3ad4e14e9de215b8ea90aaf755960f4de975c0b309f4cc18ab1c3f8b5ed5c13f5f7a517afafd754ad5c170280f66d32d0cc7ba937caa3cb949afd51470d5d9deb47950f5f91095141b49217dd67996a296f9a804cc9a6a6a9429a21100000033170000181008868342599443291067e20714800a6398526c6a288b8702b21846511844410c032004000080318018841ca26e4c0032f84d0ee79bba6ea6994681dc4ea3c0a19aa8a158799f7dd18102158cc0a5e7d6cde762e2c9d1199faf250b5ab9c9629bc2505adebf54d416c0b9ecedb82196a92ee5feb453af090fc53912d72491e9da21d5812add5c59ee7ea7c9c325a5c1852d0389b89dd9fd13059cbac8bf4fef2d342e8b830f99a3302246f154513c85467b5c04437f4daf14f895582fd3d50574dd248dcf8ddf191ce049cfb9808013d61fbc2c17b3c16858f9d19d8fb1630a53b25b176cbc282e54fba46f7312ef39bd7a00d759dcae157e040409d01c428ec35dd02957eab045e759f389a4be86094037172cb599d479ca071f7974287f9d6697300357121c88fa11d4f3b52a0bc0324b0344f9951fd151cf78197ce011d71add79a08eb06e4b39e7d640eb7ae6f52a29a314153cb59d93742a95d21c7cfc75f25478843d3c5ea5a16a486c0157f9103d6fd741fe3a7cdf7e44312a90bd51d59afc75669dca5f9eb0779d8c6c964958c1407ea0d64c18d67b99f40087a17aefd15ba6c4e00f07e5e98596e9f7ab01a25faca19682115340bc0a0cca7cb6fb1d75ea40a9615a4d8ed6afb3d4267de0a39b3e8f5083eb65675ebadb7de78c68efadff9be76de058c5fa4074f2b4ec4233e166a72e803286a63199ba05cbebf2d771f8accb579862eeb057fe3a4fb2444a119624d993f433f9ebf0e1fcf0fb20cca9b7fa7c0bdd512f216d760e4245038414b1b112fda3f67b0ecc33aba9024022215402937bdce86f51265b12fbebb81e02f61976c3584372d5345ccfbee6d0e8a12484aa000113130888957fbaeae984eb8d70226c0ed429605334ed84c3a92e5c16f3ac1c525450c79430e2cf2168b465031ef46cf12943ada18606b4bdbd19ebfbfc3a05fa3eab86dcf4694be2845673f7425634c4163da7d5f7de73b46e6d1a3aa97f9d827ac498143fd0632f39c63bd390e97c7d6b0bab7eb0917df4af4343a5cd0deabdfb2f1456ffa027ccacde5de078b9e8609a70747631dfd5924e6ee780e7ae8b882494a1e494ac014106ee07649c888e32707cc3d7f922ddc6afd3a23210020edb1351dc4c1f323f4c8cfd115c6e0db32c049826c3cd38190ae6da552e1038a9e0f4caa4dcc313fa37794b06d1b8e35ee5822f30bc25c189cd8bdb5820545ac40393eae194b3b7f8066bff1ce119a9d02b0f15fa772e359740308c39b1bb350823dfd9a64762a1760e4979d940c1103d79a5505cace469e40c5c388c5b4a3b4cf4bfb0ce34732555b09ab452a44f43a332c4410533f8fd27080c5a0b3e67cb2a8898f4f76fac4ff2c807bf7556521c7c69d6b7b64989ef949ec40972b7543f8899b6f611bb547d1e2e9d426f249a3808ed45e123966d06ce57f4e93fb237f40d5d75c86ab68b03b1166340e0b8e408a18f922bf0256840bafee8d531bbec736ac03ced425241de053188cb3bb5e0f30fa91b5df8597c5108b8fe0c72f37bd4959a6b0e59e4a540e685c5348edfc9d9de6b86e57e413d7f4fd07e7e21bb6e8d84941127ccfa2f94bba9094b3dacd11b198f832517b0d7c48ae5a96b16d368c2b82be42235a3dbfc9177295644bc4f75de190ed92c1a849648f1f5b224d160da002aff1af930d78134d3adeed5bc03b988ff27eb44140a63ba73c24cd37ad151654073eaafcf7fff5f755d68d63ddecd6943e4eda846b0557bc0fe3c3eada84305a9cf800a7beb11e935397c30138b9aa50c907f5d6113855b0ace02a42986e38b8e1a0d95c0c5696b6453f47d0c09c30534501ec8dbe86962043cc067bca93725c723ce277c0e3f679939f47af82a3ec6606a4b031130eae4de06d14a91a9091afe01219920122d0c13c0f0e8b1118eb99c9739333336b444cff50e5a70cd2557b17e415610e4bf10f3caa69217b077e58e078e7992a55d6bd33c53abffcc291a718fec6b0549ac624d37998fabc83aad190677039ab70ca2a564a11bb7bc208d72eb55a8c8e2a3f37f88021849636a575d558f52660bdbfc6fb499f34cc1da89a08abd63c6c4521e2fbce8395a8c4cf0b7c04a161cbf5141749bb9e534403afd023b95b5243980b0850713200a39ee6fa4808ecdc6dec27ee2028e545de48ac209723959cf67368e62abcc2812a90aee6e0136c33ef85d787e0768b6c2121f5fcd3ed920befdeeebe3c9fa6226bafbfc1bba15e9f7397d852d18f789f7b377d90431874f1fdd85533ae04e632bf8f9fc807fc6b339f91004c62f8a955df23d800a6d224d7f1e1183f02da2abfe4b5afed6a3e94c9d612f13c1395cc2baced13f8652a769a2d4bb975b5def661042847be3f5771cea3546c5b46d1512492cc96a018d9d009d970ffda9e591c9d93ab5e9ad43c7f35140efd398f0185d0c17928a47c453455790a2fe1d043b7a33b09de7ca34afd310d9c015a505458b2a2aeb33240e960ca8fb557fd9392f3f0fec3603b472d09d2ced04b7eadad216e11a18afbafdbbbf89f0cfc18c7d9445930f33613a1605d479a3eca16b3b1b7fd2dd895eb72be6762ce23881a12855a689d4afdfb2197ae8b8edccb5e56fd03fc391ec7e07cf963b2bc6658a3c72ae21e14037b303f6f265a5c43afb500034875ac4fc8b35843c0e0be04ae41362cab1de31a848748a02dc91fb6b5cb9f4f55e31ed071b5747b41e95a013796144da3909b2abd12cd9df6dd457d1b75305bb46cc58fe48c2e29dae4ef5be1cab18e0c555cad965f98bc9d3aee1144236c1e2644d5e3f2e707f2cbc5ec22c95606cb0d508965e263dfb519f35fea634f129188739ed188814c512a23985c302523212228ad5cb76024efe62a7adbc3f47584e48935a55d1244304a63e14a5a111367fe9fddb1c87996fc565b7275f2c810b7b7046c045f67d09cd9d4cf659dd233ce2dabdc6834c33d9f2b8204671aa52fd8c396f7c733b3371da272170e59013b080ad893dafd73ac747fa337916ff29ee4ded592dfafb3876b3f6450ac9157cd28415fb00c5f46bc0464eaeb46a7ce9f661f08ac3b75c136fffc19f7086d332239b5c5a8c92f83fbfc12fafc634e3135c77dcd35ed6c3aab7310418f8458681ae576d71c21c23294559a6ce83dbddac9dcd38f4061dfb1a6ca8a496cef4bf753bda0d9c39ca1cb986c599ba24c339352a5843c7ed07b9e9f186c5a130e82f0a38ee6898845d6e7e32b43951ba9d34fa0bf36c0efc83ff6db5c21d9f42bba6653057255258a691d6046cea27775641542ca27185a540e3af47bb7619d2fc8ccf057b9a4ab0869a160dbfa355c1c6f19ad826b5d5e05460abfcf7812e1955daa807e40af59b5692d6453c785db84f9c18e0800217e568f51c437e0fab1bf3653b90f0300281813966d86067ed0b0a44b4692beb6a237e736183e294e1fef1314fea7581d373078f9b706fe64b593f73086fac379a93f5b8805730aba6b0470073516838efcc1f0c1be0c7458bd013382bb11cbf0fe4bd296d312bb7eddb53045a132a8da79b38a73d4958c9dde780e10383b84f0dfc9b8669307da1c24819b619616c99ce0c4df0036040744ab515dff6c1094cb618d821eeff3a00050cd3d6473b4fc7c30228f7412a8274b382d5ac847c0a8529890e16dade5796d6e71652286a37d048df852229c48b436057c619b8aa72fadb7b58a56cb315a0eaaa511e34b49a8027cfabb4e8282f9d6c038cbc7d16a74f9fa420b1f8bdb82ff93c1cb59acac7a37b776c72e8dba8e2a79500658ae131e4c5223d18ee460ff194300666a7aa95c2ca7e243fb0225b3a165b99d7be50e7fff236e7160fca829fb5119853741f1bf5f5e36876422ffc227d58756e18eacd5000cff148a801804fa58beac637bda4da9833ee5a47c5ddf9c96e11451fd8d3820cfb872d4ff44feee835792e568eeba9b12745089deeb92571bcb156c445e4f9ad5d20b003ea74526a399f50349d647af327b5203e20e0a169af3dff2c651ca2565de267b874ffb52fe16340d3b66d575827429e771648da4a747da0bfc897b3b1c27d2b9ecf5d7b16ee970a2939833b72b3da4d700fceee74f162eee15355cc1bec34435db648ca011e8a7e19cd05e656d389b293c18e5379c3403e67b765c94cd0e4aa059657f5496967306b304543a7da570be6c36b92e4eead09dd5627e5c815ecdea8bc995c40ce9950f3f2ec85e1667b514e93783e23c92176292017f25e0b2882ded14587b0339554e356975e7f68411191c7cefa7a5cf2d2bd30c80359cf499b044238c0b8d0acb028826799097074506efea25b03b962c0e0d7b3b295fc330f802f33673d521dcff1e64575d7b65824545931a9a39366e3caf5d10254b52355d0f6692be262d94ccf6d3b5be7037a6d796e995cde7a62a4b87765f5c8f1d3a38ea7c294f6cd96aed3a458f767898a16ae7dae018578fd3c90119c90bf2ddedb2b04b6439dbf84d3fc7fe62fb3962a3a015db8a10169fbab948dd346069893b8b80f1613076899b81da66edbf98b41431bf8f3b70e1fd33d87d7d01707c9d2e911db20f635e8bf237ee1d8985ce3f50bc86283c1c374c13f5e8692019e793dadb4f7f631499db42b3c8ebc4632c24dbd55eaf4a496df01d524ac0611967e026f8d5438936969b243ace8f4cbdc0d23f2cd077b70087e73f7259e080db70f2d35bd1f89731c7920e8d54dcaea0e257a0a507c7353bd69b28af02215e44b9494e0b2fdb3b9478e9829d6d23c33cdcbbf1ccee5ba14ad6223501b8feda4dd65aeb6265ee1d24a20cddbe1447365f021ab9aefa14b6207be02dfbfb659a801aa5556aa7760732ef2845733863748b2dca7ac35dfdc6d5804cc1f842e75065af4e39cb83b40cea2a09c591f5b001de0dca4e79b16aacee9744fcbce6299c98ea616ceacf18e237c1c9f3e46e8d037798778e7d67dc903b566f0ec84eed723cfb143c5546f7762665744dee78c8ab2ff50c824627d71f9e7afcc5b5457578ab550d06005b0f95d0c02e6e19306859c774fae1df0143a2a570ba0cf5cd35df1599764a8297dee444bbaef670e10137a4012ab9b602d966319e9cd67aab6abfd53919be54c9f88e70d45e418ee17c6b0fa848c8b5b3f8f2c21a47a62dc9bab851c0233f1134a5fd778ad2c13c8144e3be4ae54def85031fe9274f54138152592788514ac44048809cafb03c690ea97d4d7c56d9d82b5e35608aafa0a2890a41e81340e7cf7cc966eae462872bed34bed209153aadda916f75d92cdf41e57aea577127edee0be94646b99e47ab03618c4be73d98b079ba8838d07848737428f06c6e34039fee99ba6e5bb9fd85152e918b838156cc6515ca0a6f7b1d72cc8ccc7d4e3116247820537326bdcca3312fa8e53c4c475eb94e298b438b852409b1711f529ea2eb0252153212ec3025432422aa809686b765d12a2445099de2565323ea3daa2b1a72233c07e77eaa2b5f909a514c3c3b0f425f47b47aa14c13c81faccede32b1441fe164134f8816740ba2114d88bbdf87562157d66d7da6266baa3679a511da2a307ff95f7530329a63acec2e904ad860f2ed3fa496836300f8cd67f6ddf5ccfcbdc4dc3e923c47b20bd9014d533b1ac860a7a580fb76e44d755432a198b7f0c99e38fdd44ce798228198eb082456708ca68ad9514655224732c8111e5ba22c5808e19cea0a6b17fd3b1b6a7d16cec61420f4efe6b5ebae23fb6d95761b2b85a717b9bc41f35770e2eb11aa9ab8043e0e78627e91afda5e736ad4a3507cd515932b804cc43c68e7af8541478db32140f5d130474b3a66731d262f8bc50f8c95d9cbdb99e9286e16bd4e06bead9f91135dcc7a74d04cef8d409f9192e4e888e1f38d9778298befd6071291b4c9ef2b1c78b5a5f34bbee63a827c04053c8a3163c1e9a68343bf7f01a434e1997d1cf9ffebecc9ea733753f162446dd74c68344be2ed3feff42452f18390efedf35c8f28f8d7aa3726f49bbb3a095d5a8870fa81fb57bff228238788b83d07b36955ea697b91c0cc080ec7eb0379a7f085e06253392db8450a8f51c5cc9e5a5136adabcea531bb7f5bcb35af00e13429e1e40b2877bdcf0132c8227eee6189cb23b4ac70be6116b76a373b27a061bd6cf20c105be51e7486f9447804fd01aafc765961baacc26a2b8948359110ff7fec322df7bf581a8bea60d021835cedbbd0fa411c58c54de013b6eb840d418eabedacd40aa42229c8967ac3898bd1494e94a8059463a16f5863ed46ae45ef474b64f44c3a08f99492507798965a20f1d08d1f001a2d6e0b701b2944e87284378b91ba2b610c7a716a2f407af711c2b94aa894b3bf187732c9b2726035123067d534302ea080e93230e5a4e12043ceafb5372eb049f581ecf6bbe9e194c960438958a9e559a5561b87bc83a81a96350478fa642fc64b25390bb19437ec70ddd64e74f9e414cb90402ca57c3b8e91408a6090a98cb9b5e4c9b1d0c67bfd0563c1de4d4ce6329dc041e29fad20787ee76f622488b19a5068abbe166c2770e850fed2a2af43c85ea53157dbaf93382edaefc14c24e6da7f43627c3e262a5171a9f4a4e3682977641a3210f9552c6bbd2f0ea85c421bc5619060e17270435338a5721a9cc39a3fde8a311ff1341d3c4f6e352b4632087c0d96bc5ab9e79526805c4110ad6f41f2faf88e5d3ecd593accc7ef6cd6cbaeed9a5a13c74553be48d52a25caaa7a155743a834c2d8c1f4cff0cc931e908166f070d067981b75ca02d6175157caeef0c04084266504c2336778dd0280cef706777ffa1695acf04b6468a5e3631fc43c125f22c0e35d703d7f12900e18d8bc6affb8ca1e9c4655f6d23981ab5a04e3a93c9d67ea539ee93f61bffe643d451c4001f90392785338d03b31c17bcda7054635d36fe924a8a6b0b8d6e5924d3a47e9c5e35f78b2c741204976779925357197b24f3b05dbe1bb885541abfb45d1dcf683e3a19f0e997fad4fa87ad7b108e2c6ad35283ec30d0c75a91d229b99af96b29032fd3f90239ebfc072b95e50952c439b965e328656b7555e0ff68cc1be21f549cf02fe84203f4e370d2699fa39334ace710dedab2758f68e76224736d0693494c7493bb094a28f56ce538cd9a6d2111fb57ccfb23623d525891621df4d13759fb4590504051bd8904aa00626f04a645356982a8bb5ed490f2edabe70ea756f8c470b68e5a9b8bebccb0d173015a58830d2bbf04e54f01eb1a3b4e9616c02e8d84dce322619e1a6b24f6b839975ee41766bcf5d86c70e57f1412842bdb4ad0fea0ad456f05aeed3055474c8e9c6e610ceea3da45c981830e0ddbd9bd39d6748473504e1fcc4bf124af166cf019bb3d7b87d80a7089975a670d1a960b84b5926d4f9054cfb43804613a3aef901d01fabfbabdf7fcca05aa31949de2762ecd8e3e985b114c6e5b298f006f337c695803e11bed43397a5c75eed9c4b6dfcd99a5e5773f9185a79d48ea2db701b78891f9047db71b1dd5851350024eebc90ed1b0e0629b3c44572ddbb58887a1a879e5ba6fc5928817d9126e38139a0d536c8b3c79547878716cae8853017d483453b8ed282b5b7b3ce1d3e59ec7e7c48d2ee07d60e60189990b26cd03107c6a84a43a10ad3941267d67b491d0ab7d0ab6142baa528071a1a17d4e931c82f0c38c98434ac4bc651289efa22afb6d21a698f9746e485ce156be304996ab185e17c0607846137a802171e98d389a14ef9c0464aa35ce2c665005fca37e4a58557d1a746754f0bbd0c8502a217f57af7071aa2a39fb54331d54190a1bb046522b59ee230bb07cab243df1d6ed03e352a750ba54956c6efdf6dd2f4a59510a9fe39f3ca9c6540f2c75a386d537d3381bc982041d53d98bdd8dc7168acd9713a6d4f9b5844f0a5b77affb9a1ef460406f15ca065652d371d724b898ebce3f13f47a2b40ddbef59d993b9e4f8272746ba5f89e0f3a56d71942978189dd0a26df5c44775937424056fb056c4ec3f18d98e95c11514f147b27315708673135b934898f3d1944161bd875e636edc0505cb209642fa50da66f4ccac9aaaf309f18dac54f07d98712282b282682db853652cd7ad19ceecaa45d022c5182327f709dbc60c6cb45b6731abdb668497ceb9a8ba07e09406a333a7f23061e46e42d07b03731194b8ea836e24b7ca639d58d400aaf58f9602880b4b5508d70952bc473130d2af6bcd465cbeda5bcdc944cc400da6ad8b6d82080d2981a43ca4059b0841517c3a3f55fc8cd28334352f4bf37384d5b332bb8e0e2b17e7db3acd610912757559c511f43a7996dd921534f480aa655a2346bd8f1f251a1e3c773d5267c9b3c03e7eaab9c55528f737ca944a616c6c6e307282dcbc08ff96fced30439525547314770fbf218a5e54b75fbd892b1688a7ac88f1a39db2f70abaf187ad26a311a3fc326c119d0efc16d3506812e12aeb67d44f225f2bc98333219702f823a86fc26ac78f6eddd561effd2f19b020170a3fbfa87805f2d2af7b4727c96a6a1326297fa1664f9c4864de82d40d9558af96526e1bb62c15aa9e9a1af94e557a11885d6bfdfc44ed54aca6fad4a195fb1112d7b0d451686dfc57ed90ec4f8eaf2bf565324a2c343bfe301caf84ef757b3368e275e83a3b1d3e13f7c94c18d30a06026382ae224203aa2003371d448c7d68cc44a095bcb529676a2aeec44e3361d2578f7bbaa864c63b8f1c6c5eccc4fafaf70cd09a59de3a66a917ddf0c34c1315e2ef9681d24d28525f0eb43c667fec938e29de1bb19690aa48f814e9fdfdf60c9bd0e52fc2a025837cf2cec056c82ba5dab7d918ec012424e01ce88dd2c612042c5c7bc1f0d9607e31718b54c8c0c8ef585a69358a25c8d0364ee1eddcdb81372cbe7457b3a6a2dbe86770118010ed64de04c868d8c503455f0174561b933be7a890130317ec4a8e3315e0a2c378d43e82868cfdf42bad2901e3d86c48964946da8ab7d71e827c365da001917cb794a5050a17d3cdc33c1815fc76d855e44af44f2bf21ac3e5b832198dd04de33b0f1b7b5a23f7e5fa03b608f26f1515442b5f9659a81feb3a804c9870c69fe28dd95044cae6d0b491d9e882265fcb9e2ae4f789129327c9adf523654d1373ec1fc9e0e45784a1e0c2dc291fa9d194fcbb12d65f3e8e735e0e536cb06c5f697e8a550a2da84e9f538ab142c3b588d6f0d70371c02e2adfc819705cea48792270c786f8edd983b3e68a24cdcc851b155dcadb93c2422d9e6baa6ea15ea902f2cedcab8a86f3581289aa96b971bc0a7f6d1166c598d2101ce7cf4d3d1a4a6b43e5e067ee8eb81a2bca353c23789a42e821409897fbd9e050fb549290c1b2c973dbc39c5a2747944c523d2dd1685d49742547c956882766121756248c08472a69107a368d473d1b0a346cd2001d7ac6c94c83cf4a5ea518a5fd687ce093ccb5e5138c34d95fa8d1f78273c1bcc58fca28c85a8d414b143470c6460b65cfb758616edc14f5f119bba186b018f93613a090b7fd37d772917e88d4c00ec4cfe8b2d954435e5738b6cca805d1597515000950deb51c657186e26665c8eb1b38fd22997637a26f0e0f45b4b6f32398050e22b5d3ce1ec2698880a89e8c191001480d873498e888e0ab03a8c27867ad13e7e1f1ab2fbca7513a382faeff4ccd99b19b84ec5495f0338e2912c6370d042e7235c245267c8fbd6c87f8fad7d45e5cfae0975f4e0209fce52c65da4923523cd6adac442c58ca19cbc3fd577a542e7aeb4298cdf3682f18dc775ca3c481a53923985740fcc441272b2a050862aa2415a24b39b8f5a757dd6517344a6169c104661aab4de7b821745cbdc7eb7437c5f538ad483a62b8a27c4fac02e4eb391a7909b57bd67d313a23a69f065751e36f9edd638fa0edda367073942f1ea996ac5e04bdfcbf136324a65e48915a3bb24a6e6368e39ca32bab606621ad9c902ffb8a2484f9642cb9798fff2bf80f2fa32063a99352de09faa12c3120fe4d85a2ef9dcf36d580745e98d3dc0b9de00ce85a25924464cf52edef02f9954b658004167c7c2840c51a7397f90ca4848857d52cf63d6d0c0a3306f8b2e32ae212355820ef697239443f604128081047d8492bd50e1c020ed68288625c48742b53930757da633f666f907fdfbe1f1adbd7ce345def00ac6f956ba912ff78adeb78811443b2ceca0284e56dfa10c869ea6367cda3271765957e4779b5478ffbd600fb51ee0fe9e03a84e1124b4b95275e997cabe27a4a432de8bc82430088c9fb7beb395b9653f3a58d882da1f25744396511631c859da650f6522f830ad09c6c5c731261f4559009c58454a74e949b1ab174a02fe920a85a1c5f2e502f307cfccf74448189b97773f9996f2f7f6a32f94ad459d2f9549e50dbd1854ae4d3402c310ea1c1f68ae73ea6d1911f8bc9966036b443b732fb5ecfd490597a3a79fada7cd7d2887a090ae8b0b12a2fc6be687c0c4c35c3d1d241229f25e917e026e6bea84755dd03e0317f96e5f39cffc41c0ee632e6667461980fbcce8f520c51caaf8138e2671c1e834a9ba71aac33368c3baa8ac8bbed65d55de73a11941d1310fbe6e8031be94d24c5f0fc157ec0824101e40bbafdeb528462e4db40221e2bd8832554616a5ae5955607eb2cdd4065b92b7b6f3d3ae7566974d4ce9f7c56d4427ea11dad85688c152bd457a089a501f4ee93a2bd418a47e6a38135ff055fcec51bc3fccdf140a7184d862ded3734a4ab48413bd08bd931bab74b92fcb6d5ad5e057a78246ce9017d71d6c50358770f5b482e30ef93a83b21e2b1acbff55c0bd8d3e0020d67d9dcb53aa4472aec4cba1a638d338ca2b3047ed8bd283c84511cafadff87f33f07f2431fb997c30be2943d7d4e916e2e1a1511ba58df25a3f6b2fe9d23f4ef770cefc5842d73bb2d76ce266228f0224a8fa1a0390feb5461bc5fdead44b6adf66d6dcb69d0d2f1fa069c49765681efcc5e2285f11638d7d093093fb2495851332de0a607b7522c65fc05fe8ae022c66799fc958b87ab92199288f7d8ecf66a8e054d9628fcf2136f2392e9f681dec45f7bba2a1715ee6cab94b9d36182605095871fbaba1323bc46d90f8550ce3e6e20eac30844be6df4b6ba1662b8b81c5723b3022b474e00bec1fdee149fcf0b793d9aad604d62c062803a58b0dd820758eb1a7d3d4efd24526ee12aae344dcd15b1cf9bad157e864c5a1e09681b8fd7c76348e4d5611f7b5ee3daae53344391f702308bdfc5370099fb61a0844d1332934aeb998d765608020ab4e90a336e383573631ade4d1fdaeb72c597c484e80489075a2ee01b412b88d4652a95e724db6e2a669e2f4a1973e0b97ae131f575b60d69a370db31a52bce00b9bcd647a466de3d4053f88df306c1cb0ebb1eccdb71e7345da2bf828fab3375e1a561d9d6c35ddbd6c1c8b49c8706394d318f7e0c946c3652435a6d70e4490a7ac3cd252a81e0141b47f45ea279d1841661c85c6915b6cf496645258e73b11aaee6a85c63d480b2650eb58890868c57e8a20b602ea55605b056d4ba3267093a129ed6b6145dc804c51ee3d98ad40b76603c72054344bf5ca4a20565edba0af4bafde5b5569a5e512177b42268fd4c4f34a3a4564a644e1863ad02a8bab3e3fddd3060749bda82e1951f1634144f734d1e56941d1128d9f30992fb2ca05a30ace01135ff78a0809640a8dfbd9942af7ba1eae330e8e3889b0d0729b4eb7ecb4445b7b647cf24f14f5d261e8e00da65c5d403314706f7d24fd196b5a07b6c6abd9f0606a2e3c2d2d8f87570fd06a79a8f6dcab9da063d0f2115622c2cafb18454177e7554260e68b24c8f9c1b56aec09d0b6d3c9beb556b6a2ac0954fa9686e9f36f336749c8057307a2fa46a101c8ab0c382eac2ab3d5a6fc748ae01518e56455721e3073e9ebf66aea30fb37cc81a98db7cce4d51ff90e6ef9c1347ee39ab30a528ba10f2e35753efd14634ac6b8e68ea44fb99d6954105c8dfe1c009c1517cabfa3534343d404c6140a3405455c52a7525b3e320e61d9529b9ba174ffcf183771188106adf4864bdcb9f495db210d6d6f861ff590e808fa3148a847b8de229a9f1b696c661e64115c2e91ccce45143b33097580ab9b50b3f722c5a70c830fe28afcd1e83680aec35a0dd070e9a7c27e3d9ed8cc24e87d5ce83f1b09e957e972ae4227537aef764436d7578b315bb035fdee3adf8c3b11b6943e0c36e6c7fee9e051e623f86151cd8e487bb4415bc4b0dca6c819903248601a0bc9060a2203026ef1ab817e185d4de156c1489bea076dcb04075d7b3542f74073a8a2256758bdb4fbd10490d0f10470d9980283dd4b12f7fb09803121c73c2bd24682d31075f8fca32e1c9c48687c4c383b891bf96862d938065525d53aba509e6c340a1d46eae3b7f1833973adec9630b6453d451649a5bc51bb24ac19635cd10fd3bb9911d6e0d5a1d2cc7ffa55a7be914518bbd6a60aa03ec4ee9f0e7c2ca64f8d9fb7c9ff44938f3f752bbdab6880e64ea8c410ce6740d42505a1d42285236829a3ee3b02fbda7f88b1055275c6d1977489816b1dca4a0f1185dfc0620ece25de17bb6b0aaf36030a7f9265713567cf219764414b7135576ff03e6581a5f08553d3208f6c117f9c1d28818c0aeb1a473d30a1cd68348de191023f7460a5c2e3c580cdc86422dd907f0894ed1034b277104f3a298ae3142877adc2233cdf9733eb41a17a46cc7d529eefe1ed19d3b6f5ef7a709429c04e955c6ade6399369ca79489b469e75dd6d2a12b5097fcbb0371093fad1ceac7bf2738ca45b9f7fb709f1dc0d15850193de47543092cf484b5a2fa4bc559d791aed00ed9b753458ad498439d074d5b3f3d68a04a9e1b9655e3bdb0f65c493d69baa5b0b056c87e39c3a183a386c576b41be554fb81184f007aabc1de5ae85bfe952e9782d8a81a9ab6170dbc15ff1c0ba0865ef367c9144ee1ac404513963bde01ca74e622184c87dc97a1355d4c97147f64a66146479bde73c83340536ae11b51b9438e6e7023c645df50ff9c7a83e6721e8f04e1c322c48d6302d50310ffe6424478cbde16e47e051067edec6b1bc0a06aa7d19a45b128530ca2e03f3369c32f293c9361c16a3c63bd699a897c70330c7f8e957e2f1c4c8b68969d454abb65448c9716f6d329d4efcc340f42c5b3188c12d58c9e6729a78fb71dd69f2e4d015cdf200dd1df820d677a0d9fd8bc8d22d5d3b32bb58779d82de0d39544dfe095c1fb6f15f214419e0996d91a79aae19e456a2eda049d820480fb81a61d2915d17f7c073a9c54df9a7ea3f355aef92643978463ac210900973b731c8ea5b4d98ea23289496e44ef79a4b4df01a3d71b4ea330933e28a6aef75793b874ce16ea00d8574b08640d11e6ded324bbef009158cd144ed0475e0fb6b4f4e95024ebf61d58b1d9a6686f3ed40d361d915deb8cea2f90a653aa31fe7b53449382c84878f2e44cc7d024b57537d72459e8ca9983d97893eb9cf815c4ae5a08be3ccf0fe6e0e0de59c4df14cc6e7993f05c1fa59f4f3e573efb669b022ec30bb33a91d64a16a8c8c2ac841c36ab98fd7c7aaf9af41f84059665110d3271ee82bc923c16529733b0b35b6660a1ecb01c6e21faa59c8a49dd3a8dd4093a8a94e0c3bff4f180e40545151c8c370c002ba1e4004c620673aae23629440fdf5c6146b075ceff4e5a934b371c42def83bb114b9e4a7391aaaa610bd7e110f61790f36c0211f2d207521fa399ccce827d2feae52683e9d7c47fe2881fd05f7356f2f44bbc9d504f5fe34ffdd24167e32745221da5dd6500b9ee5157354881efdab2655f02d5c3adbe8d883e014d18855d0a0fc80f27c79d2e588b2df5a0f429a115d666885dbd0ddd7f07775290258d4a50b565c883e510339ae19520ad152f2b87d2b141a8a783ad1d766b5a9f01100041024759d1c996951e44d1f5f3c61771bde4f9dec177c00abf5fd4207f74c70207c2361fb83789db5ffb343c2bd8d800251074110757a1b8e10c63c85ea703b5910774c2b81027ecf9a9ee3bb5703ed31aed2db2393598634356ba5ecb900c1469f6d00ba0f7b44512eb4222ef95bea778f7c94a3ecba1b00cc96fed2ea0abeee3b10235d4743ef9341d01867da7c83c949cdebfd33cb18b15b6111b143d353fc15ee08fe88123982ffba914ad293001a3bcfeb61a8ece8f04fad1aefa500f736f1d07a8926baa935fed80a02a6479b2b4af40de77c8b152692252022fd0f837b571172ade82ade5582fbd867d48cf710c682d307149d6d051347ae35327789c483ba13a6c64f185cab267c83883196d286eadc89f82001a30e18659fbdeda54580edf74861590ec290ea00c463854daa09b38422c44a3003df889f1692c675fc09fc2d7720b90ba7182e727a8780d035d4c3f8580d3329032fe85b216e51338bb64df00673f9bbf9f903ec57b0a123042c3a2bccf5c4b2ee4dc220c0a1a7a0be696f1d6a71d3d8bc6f1d6dbe5f1cdc7aa0d2ee19812d77f59760b76afadd776682dfd61d3726106095c9e738637fb60615c9568acecfb8f5b3e89f80d024818675c68ed44a2284198670b64ff72d2b6ea0d47bd41b69ec344dab8c280dae44e5e0aea59007183e8348a04cab6a8bfb94fb6573e654db32fd21b973413bbda536db0bbacb169302aa6bd293326af4dc64f8d783c2350d6c6e8c894ce6fe985d97b3a6769986c75c741a197b2eb42e4b753677371f0eef7f3da39cc03f2a0720b014d57a61585d1669af9995c70ed709e7bbc16ee0e245b3ea7a684acd4d73e31ad39062075e5ded0e54efcdd2b95a6ded41db352082522c657793ea599a9de2d016eb1a964f9d77521723167a5a97fee028fb8ea510bbdaf7358528fcc75720188b076f5f888a45ae198b5347e176fdb6b609668f61d2e49b1d4651f998bacd85d6d7d1d1b8788481b79bd85b14f1c612530fc08befa8a0512c2944693b4995b46da2fae64e4c6f6463b89beab5cf050a22e14b3eb3c588b76631ed7beef3e69120fa43fbdf324f053ead315971b8e8cf7f7fe17d5f36d22e6312719ae68ec5f814887ec2a58e894550a794a4d40db9772fbb0b5f10f01fa6ee0deab1553da5f1885cf4099eedae419169c9d8b2cc42a11b6d90c7d6ae098e3d349928bfb9cb26693c0f17e74fc9c39904652a6b11eb3bb076a494038e1f955763c3d270567c6815524c1ae545d095f1f06a23c15c6f53e631adfb4977e92d5feed233a00d5986222096f7c24e61d78009c61db07a4900811cfe1edadf257c9db0357f6b531bb185a2289850cb5eb99c09598ffde638f66df66e9200909fbdb39ad7e6c774500830849fbb0d2e167540386818f273b45366771d25aabfa6761b5645998e8794f5fb30b0ac581e46d4f2108a4f44255eb51ce9715c953b28f5133120a7069b952da07178d5fdb550a740f52f5d84379559a0fe60e673ea47d81cd1c76eeb257eab9cf458d203ba02b4878e292bed184f55e1b04378ec339e7669cae86c0746625ef71db01b487755fb69b343a93daf672fbe407c0b4ee3fbf669574a70a6c6299dd09f10a621604df336548eedfd18ad9d069987c6694cd5b84206b036a67d4ae51347f9cb664d76ec08c0c84a3753b0f02ffbd127181a0ce07e1aed1de78b1056e4f6aca281f6eb4f0e853a9e412ed3722805f6c0f13ef5cdb4c9350ca693f977adf0bc1782652e86abc6827eb172e181f790121fb1436fb1525f4bef7d4fa48bb40e044360ac3c3a1c2f08554df415ad5a79d90a505fa9f141c95823385743799734ed38e3a8ac5ac1162e69fe73ee60a0b3c8151b86e7db250d0388730be08018ac3c59aa45e4774c8200e52a799a26d183b4091a0bd986f170d2daac26d1f72a683a8674b530ed8f8bf7383ab0670142dba8fdd0ce2906d280dc625b59c4fb9c888049196e518d501dece65f06b06eda4d6f3f99b311c32721184c8577ba939af2c6ab107cc8f1898aaa9b550540dd8417605b353ea42fed2b806264bd23b805c5ce4621336c033e07c8e16918f0037fda9e796c491c97078023fe382d2450523580c17690147ae0cc754b9ce60e496dd01be63c02c85053393d7db06ee01312264207a81fa06053455376e2c38627f0fe29b79efcc035819f11902561805800a4a66910b79d1d74fe324dff8c19be26dd6cffb537ac8c099d5ce276d870e439d7004ce6fd5d3de1fdc8db1fdb46506e446da0c9a87f747e946d48dffef761ae180629b10359ed581930fc92db06fb6b92e244273750203d110ee74218217654e1c72dec1f7d6c86804b211cd185c03df664f1f72d953bc7c3b85e08073742c796c273f185b8d6364c6f30c6b05ef2505abee1fcec2517babd45d54b129d502cce16942e14c6802f96ff3f36e8de76ad115c4abdbb10f2dcbe97d845d4c04bf3b3917f4543f33911a2aadadf6500f95ad811cb3350bb2a12fa155836b9e9b845e4f03b97bdb5b2f893f99e4f0e535f14b5793bfe05292973d8ef62e8d4f0821c6c517d4d9ee4deae347c86d44013d5ffc51e7dd86fd98631ff6eed21e475217705ea10da6fc29e435eb7b489328e0465365f22f165d561644e22c11969b824c3ac2e4ee69d9272d61bffcb02cd128b63152af6889c1b23a519aae95bde91b186a06582f1256ffb3ddc54562bdd7b059350043dc310cc565e0e538c3070cfbf8f17d7e2a13182657506660a0c90738aadd3d5fff63926382b6aa9065a4161aa993be25b602f27a506f7d63b6a6cbedb4c5ee6db024d2f284ff0bc5d74610e8371f08a82239b70e15dcea535c4d98a26bb8c0bd94b42ff644e883de896e8c966294b20765d4fabae51dacd8a0aba86a58a67c6d1d241202008f46de25dbd1395bc177afef6d35cab80428fd710dbf2ea3cf6bbf8ca89ff50ee6d4ba03d7f21abf9e52bf2ac9d356db0385d13df889224123a6417abac2d3d37d9db9a037fdccfd2e153d6ffc6da43bf8bb61a165f92dcc71b2b23cb7073f852fe14976bfd944d088ccff98830ae41a7ff97b9b5af1625c12b7b3e3f71e85d809c2fdd9819223600999cc9c9096adc176318b4913472698caffc5f463d446fa706b63976d89e2fb9fb1a9ec008c98aef433b984156b33fa815830d3e2590ebdf43779093dc480ce321244cbdcdb4686ec8209f3d7109193179400758c39902ab333b53c498c5d7d1c6af2e9b5948c6bb5e6649ad3d3ae45a4decbd265509a5bf2813fa62d8d840ff9b5d037eaacbf35c6daf3fc459b9fd341a2aa729305080720fe989dc13f08b30a7c9ea54815e1ac13b1612e7ac69a94be5184630be83e8fcf2d6b58b17a89f14b9c0d778f3db50b9f58bdee18f4aec38114bb9307fd8b74c3e746d591a172d7adcb7aeb71f179f1591da1f23a6b41a487570ab9e010c288a5f6f8c7c03e99a0bc6bf6602d6f87ecb29c78f5bb0b60838b060338258930e85d0428a7c374cf46f19951cc22b1d92d617d13497e114ce203a286c9b34adcb70a543a4975d989e9f7052108d3d7d048c350ea426c7a9034a5b58457a0001f0be56d34fec994a294251c887e05ec000c769c404881c54e2c1bd8480e2e86af07b715ad603d22a8e431ffba5a37189fb38a9051b44ec500b4d38a196679fbb136fdfbc02d2f70163ed16c8f1a6302bab1bcbf62bc43bdab025ce3f9c49af5b5d1da684b09a44f9114e4808834455c68671ef10fea145cda0b530890cb611f69fbade61614b9f35cff0c84bace8a310808ea5f158342a0a3f5a490fafab9e913ed833d6eb907048a1a1c3d390c1613b3bc83ee4dc60902e9843a50d35a390b6e915845e2791a6eccbaf5ba4fb1e22be0454749589eadb92fac1cb446356aa4a0c5c0bbd3f8936db2f6e1dfcfa9094388997ae0d086470deaeaced0a1bf17a19560d0f1997b8fa8938387130dc87cfc398248a18621cb33e80fe882c3147dad4ffc9e7751579c906590f3c31f21bce3d11151668b8128bab6e0403cba73f9589f520d508185cd8d23e39519232edc7439e6a0e3a7fa41dcb71622a7c658b1c40014ad46c533a5a061f06d1fd9de63b02c600979c7605822417292c7f85cfd112a12c9b586a4c9daed0a0a8e345f2d1ae17a016730dafa5e37b6786f40eae6388332ceeae4f783824604a94b4e2706110590b590a31335f987a1b64d4a359131da0ceccdb421e08731ae4ae1b9d03491f8339131b3839b43e9c2dedec70252f132a46ac91c4cca4d4540bcc6e62e0be06efd9abd132b64a728941d25353ef07dd88e0e91af9c38e38a4370946c54c611e17553bb6b4cca8b395b9affbb4ec1fbcb2f5ea7589aaa9947970bb0030eaee85dd4bfcbf47404628aa02a602c412dde10c4932e4e8fc45c62160baa733f771d27d528651e0b7184fdbd4f472d1e807c64a578c73920ab8097cd6604b03248bfd37464a01aee81336891c7bfc6820bb05aa71a4c87480d84159628ded00024acffdf1a5438d037c0dad7902fc2d058e1e84b00c54209e15a7036df8e8c57c4cb6084e6fb701002f85aab966a8e3e1d9cb86525470825baebf762cd657e4ea824a8ca8e4ac09f0c79120dc1a93b26acd4f0ea6a38ebc5c74b5e213f68d8484b4bdbb6db9b79432a514bc0c970c840c21d5344d631ed9f0c4dd275dae72e272555bffb05ff6f4d72f5d0e821e6152d450f684ce739bae3cc2a24c95ef617c5d8f3e61e4893dda67760cfd533e71fd5bb2d9c3a3f1c494eb589ff8069fb8854f4c794e75010aaeff9020cb1a07491ae86a41d9ccda9bb4c30b9f164e1beab44a421f521c1fa330c208a30eabcd167922fef636f4378bf2b115a1bfd925285e853eef085e455ef51aeae734d5c169ea1365b49f9414cde78789834ea45e8a8228d806751c3a5c24d7ffc7b59f50a3c3758ac3304e7be890a8f144199eac0597062cd3b10d17b0c78055f359765c07d79fa897b9e6f628d29e9d70c3972a04491b24a6fa7d455d7ed353250759cf9e3386f1fb5157b258ee8a5fdf2641f50f3b478a4ac31e6e7f7c8f557837bbee0bc3f443115f7eaeeaeb48f82a484c49f7d69d71c9c58bfd0f41075f40b7e07757f71270fcc237ceec7bc96c7fa0b4e0dfaf92e513688d32590ccd50680b6d936a1fe5caa97ae7b44b3441a38b03820b1fe8ac36144de8693c0d6bb3fdcd6af24b18d2d98050b725fe8535a61b813085f4a483fd404872c37ebd8080a4498cdb3d1ddcad166ade68bb76d9e043ff03a584c6f36a8beed34222052c090769c4e72e5be10429aebcf2b78fe3caac3d17caec8cfbeb707effc29a5b6382f1d72f0b5419618411c62ae5679c478f968e6b17f908128fd126e916297ec8b01d5eecb8a0860c4bc2558da46312aef267d88db65b0cd3df7a01cb6c3e9c6201ab7ab34237e3db14380bb07ec15e4d603d5ab030daee172ccbe87319c7e8e28294d23de88544fa0f76d9008cdb9f0433279fe3c718f6b6e16c3849a4debf24b84f0bb1369c95efe795f77ef3c1e93463c6738119fcbef47183324a31fe26e0c67779661c086098f83d7c6b815528dfdf4d1887e33800c3c47f7994ef63100886895fb2e13fc3e46098f83c3c730e03b08df8cf6084e154fc1d3815df3ebb2a2539f0439bebced26a1b2040f9b003a11c1526aeb3da467f29f5a1df920d855cd7c01d7d7881eb696098fed02feaa76df4a36ca8c4751b6a3fa6a81ededc56e708b142399d63c36956e7d8767e3ac7e6d336d2c038362c18a69ff42cadebbd4ace6d1f304c7fca86eef7fbc22e43d860b8cd45bf216c37dcfe978f872f6c36dc7efb85ad051077c6c7846406331b361a98c1b761aba189830daed8b0c770c1930ddb0bb7432c33e07487c1075dd869d8f5e91c7d05b68105e3e82c304cfff80d43ac1d6cd862708ebd1d33976d3873b93bca675d21e1cc6559a9e6ddaaf2e5f3d7557fdb86f14d914876473a54482ffaee9b65c7eacb5572a51907ea5f1e17ad83f4067fdd7295dbf0af4bf96cbb85c4c1b05bfe9a6d240e7a5e0ee79109794b2f8ebf70e6f28d18137f6ef4d2f818f39cfa98e7e7a2d73eeee3e73d7fa4971c91ec729cf7758d42704f24bb9cdb256484c1d1c77115c7f5e02fce835b6ff11dfcddb91789be66fda0721f368b67fca38d9e106d64dbf9dfa1c53e471e5e9ea34c0f33663cf38ce75c9eeb0ed5bd8b0d292cab1f760afce6c2556128a7a6ac107e5315d6465260fd76788113ca7155b8058592c81fa1d60db542485c15c2713064e4c310ebf6160486abd86e40dbcf17dbcf6d1a25bb43c38628c5b9d30ae17d7ceeeb3be30bbf5f224a5facc88a6c18825774e38ae2179d75bb75e36d78c3ee10c3bec0d79f361ff923722898e95d4c2cef2797cff4a88f6ff474905e7afca3ddeef02f6ab8f9c4c84cf4b3109977075ffe96eff4299916e52da0d7e94bc2c1fef82384a2d97efeb471627b9bf9364e6c6fe3c40f4760c2ce6ab34bb277827d925004d66ada2537ab5002bcd7de7f4051e5c7e87d1c7f4ae6c7f949b8ccfcfe9144b7e070c3fe79b59a70432ae9f68a31ba0d79f371b0bb158364ebd69d897fe3c744bb4a93a95a503154ed0a1c7fc46f1fd4906121567c19b910e1dcfe10cb55a81a7b6d3c3bdb1470708f086881d1ee465aa24e2e0e76927b8afdf3ea1fb962ddfdf56d3bae0ab92f09e1defbe6be64b79d12572a799b8f1bb9ed7d3bbc30f2edf00267f37155b8e1645184c7659c733cf87a769b82885f6d89f80ef6cbb6a38a655f12ad771d2d5c0a1d26efaceb2c58d00bc8e7c71563b9707c725cef03be62f846bb6ef6da578464d7c799e89fe9e527c49f2fd79dbb07b29bd970e612c9eee8495688ce86f24d6fb2287f6a79f470d51232c208238c3b7a956f891d7e3dd0578e522633cb8eaeee6e2019bf66c9d88e78aab796abd876f5f460cc8d37b2cbbfb51cc4d97a50f9c30de78883fdea6c483b930d4f28367cb06443b05f31d7b3e18dfb9ea6699b0fa946fb63fb81e1b8eac8ec1bb3eb81ec6e5cd4001deced67f4fd1b17219cdb21230e7a231b626da1df7a74ba70c3d3b6a3861af6eb1585cb2f99c50f3bd3260fcb557c65f8a553451176b890df31d70ddb332db65cd5df488270152ae6fe10137331e1b29576880867c56d23a8f37b5a14cdb4712352f081cf6ada8ebd5eae4279cfb7db5a1b4e1c369c1b4044cebe5ed486d40c952f4eafe61b812201a1e7154eafb60ffd6651d1c7fcd08742cfabf9bcea574cc1321bd69f7a868a815794e1321401060428d0e00a6078ad361f4a6b75ebd2d9b906b8ec8a227639efdad3a165db11f71a93cfe904abdb141bcfb6e3209029a4a723868af023a6fa29ad75fe8c733ffa1926bd8b5082f38dc42a99f17760b163bbe5450dfb450593ab5d7f7e35796249fcf90da397f34ecb5020853488e1eef08fd1d6982eb55bcbc10dc7c10de7fa68b1c15e0cd3afd36a7d8b71708ce1e915d98a241a49e7746b075588bff6614dc62e1270042abb5ac0c5d5fca31f8b88f1cb285b01e4071b6ac830dfb270b08130ec4794e9d52b1663ffbc627cb95532df27ca4cbbedf4b6c518e310be028f77ab5b31d5f3c6df761cdc784e50e387dbce14af1bedb6eddcee2b70aadfc58086db2f5b71d53af2d5ad974e8cb2bbd5ad900ec9b70e78c153450a5ee87f4633ffc036d4f02729fbbff2ff74d2ac94d4c118325157c9507e349e1c94ed823a1383903c5c157904e12a19fa6896bd6b9e0edf3eae314929aff8820a3ec668d96baf6d1fa9e5e1607ccdcec49f8932bd8adac7681f351bdeb8f1e3b432e405ae3b4af96d5f88b40eba47dbf1a30ececc4a77e91df68d96fac729c4210914e23005df9754cbe4cf8f6e3d7e5b59e5126e5ae79c2fb2bfc0e1f1f6d731c6efcfb5a69ef51756110f6a7cf9de5fdf58a3374f1133ccbd891dc32005ebf657ee97bd008e5dd568b811e76a21851b3faee272ad051dd7c2116e8c5b88e2c62fc7e5e416ac985b20c38d1f002e97a5e0c66fc6e53422dcf8c9b81cc5c28ddfcabd820b68b8f1a371b950d7baf133c0e5384e74054c0a377e7fd95ba2ef8db7db80e3075476edc0c90d6908852a223701ea139cb46a5c7e82179edcae95652afb84ec628eb1eb760ccb748e112c33e35ed339b4724db46ce7706c8883fd40d7dd768e836e51446c610674eef629a8dc39aea2495ae7b5f72fecae4b9b249eeae77e863e66b673845039dbac1254493fa44da7feec2cbd1dd2c3e6c9d98ed47e1cf44008b7bf8635e73b07c70737a809f790e6f48eefb094d0c59539ef393b2d6d4ef41c8f5d17a060c5149787cb514802d0e59800f58a2324b9571821e8f62b31c4f5822e5c2fc079d94440c2efd3a956a6766e289ccde84cc84b645eb601cab70eca378a177a87b2a1ba98304fe6ecb932f3fc971fdfdf070f2f99333bedcd8ca7616dc09ff136f2c11b1a1a2fadcd127e1b98a7f16c695200f8d4dfac428eddac50fc349e57fea178c6d3b04568fc8c97b6c8121a1a3fe38b488e86bc59d198f128a6f1f27dd078698bc03c8df7919200f872c687e2e7e17b78ff50fcf15f6abc0f0f8087f950f3b3e7e7521f8def669582a136e41f141b32d0cbc79fdf112f1f9f3f9a1e9e87ef9817a6e8e20b1d166b05f3000000cccd0a00339ec6cf781a3ed4a8f1ddac7cf86e56eced48bd7fea438eddac528ef2b1f2e75591253400f8d4f3aa08002c8a5f3ef8298b62eb037cf9a0b5598232027c2478055a8e291f59100cb6a8410d7c58ac15dbe0f80a7c27585274831a53950a1414a10a557802da27fcc33ae3bb59d1a0f1cdf88038d83efce5cbf7cf52a013610ea33185328263aa7d6ebf056e563cc4e6d1992aa8bc3a8011d76ad5abb0755ebebf6c5b0d5509566895a0e3b890c79c652c2a29c1364886f261f6d402713048c8b1cc0671b06790f9408228e1600709454082984ab603f29abe1f88abe67fdfd94cc86bb242449f31a3a0f0a461fee80f9955078a1589d8feb046d0a1d6ef90bff433919f2b7dfc5ae9f913f1a06a3c5194308ae5cf4ad37269f4a52f147d29cbbef4337bd14f1b92be94899e7f7ed99cd986429f99332e3dcaf3f031a7506c78aa9ce2d47cd36b5fca449ff6d510b95de9430d51faf925dab1b7a3f4261bf635694f7ab642eaf39ca168f4a66f9bd2acc93484df12106d7e5f687a9e3ad973cf178dbef48ddef40189fd2cd2ac909ad95811a3af56c8cfcc0a4179be99c600edf9b3abcd3e81fa58d1c9164858abedb98f57cfa3262bdf48fb46a76f1463d5d037847f5a9eebf674c878cea6bbe5bd6b866450a8e1e8d5f2329e7f04e3fce36ba313bb327e7a3a64d8b8b77c74eb7d360c87199481b5dabebd1d2d77f402aa1285935c0bf9efff676121a594fc929e7eb7b4f26713447e2ecbcb8f4943fc2d7d4a58d3226d68a343b21de7777359be50ebb961cbd7c4d8fdf72fbcb9ff6fbf3d1d9fa9c68bf1effeb5f42aa5efe7b889f24354bef42e59ca8b7e141322df59be49ef2f8b20d921a87d962fa4dff20b4879d2cf78cacfb87f221e54f9f1edbffc58de7fce6faf88b628949c286987f027d9e83c0f338525667f5a21294fb242eabbb436dafa2d3ffaa447c4bfbfdb5064a583997dd3bbc7001506b44ae9f34f72b4ebf8d41b42ded2cb77151b16b9a5373df58688b76465b4a1e989c45bea924579d3103ec4dd64837c43a050bb26c6c790f3e51723c67311e6aad2f7472736e5559e4bf9fae5fbc7f2fd85dd1f5fb2d890f45de272aeca735f95cfa31307bb8b28591be35bdcb29018312c8d9f10f9f363c867f9f8853176e3934cde2f9fe882bd7c5c3d3c3b3a3d3c3b3a3127b6224e0701fdc482807e62b0978f0bf6f271f5f0ece8f4f0ece8788eb71cc7591d04f4130b02fa89c15e3e2ed8cbc7d5c3b3a3d3c3d328a5141513cef566754eb7828280807e7e62317635fbacf8f02bf462188a492505c5867f0257c09850cc8debed2695147aa22b5f874a4dfa96ef969f89a4d2c78f654e2b44be747f29a5d3903e076ec2fe6c748688964931c2d2bf7ccb976c4d8c5dfa614d8c5df92d34468cff972f6ca2e7b63c0f5f68a373bfc66578c5d676fdbe9f71fbc55638df8a7bee657c4ab8f73e8efb6a3cc5bfe30d2d3688838c42e95043fe81354aecb267cfbdfc9468df5a77f7b73dd79cb3044a292a1ceae3be54329552544a2594910ea763752cb971b38b3c51860bc39d234a33a4869467d404c567f49a5fa821e541f14179a1c0509cb82a3ecbef581d2ba63a966c82c2855a2f5bc1042986b085179f6589be2c2fbfbe3fa444824794f1fec4ec59149f90ae58ce3ed98650e5b38cb8c0849434d5b9474b67347cfab8674f02a1df2c8a66fb955fb1363d03308ce09af18eadecacf0b88a3eff0a93951e57959e94310ec9e44e4761c236587439fa8d2ed79dbfa1a6bc87818b1d4be9437939c89cb78cec5384e2e3a07747af1a3120787af97528544c305414174acf7604949e2b61dc33ff8d3b7af9931a8235565a8c030c35a43c5c10c3b0e45eaebcfc2c462652fddb4382b70f159ffb9b1537a4caed396bc3456f875fbb19a1fa8ba0861debb72254ff76c514ffca277d244cc298490dd9e7c743942b5cfefe7c989037368d32288f13b5ecd07573ceb9a21353334eae0e9bb6693fa2961d6878c6b72154bfb5ad9002d095ef1f7b34a1e72c8a86e3fea619c5a7e5f9bb5472e9c1c2c293654e970fe5172363fec678962cf9a50d63bc3f17e38b01fbab51c355fd31313c1dee2e1f0f07f9593ecae320bfd7b4c7083254cac33e608fab4214266094d92815ae12758fc2c4557eeb57097bd3afe44419d4f3e885e283f2427d2bad98728d5edb0f4792a3e2888b184741a326a3d708e62a15a0caaa46ea1197e1368c9c4871f947b1283d269fb8cae970f9a3086a387addade55bd171904b1ff2cf66335297f3fd42fce5876e3b1cdb21e122a9519ef46772100528ca18f158164c2ebf5ca572f9517ea24caf50c07019235e4b0a256036bcb0e8e2f2a3c0a43775302ebf774918867fc21cec8eb43a24b15f6589be2a475a461ce4e7e2f7772c07d9a244dbe13888928583dc217190bf3be2600a7fca7739aef2395cfe2e49c77295e3b8aab7a7ffd239507cd8063f3f4a4f94d96c9098e28f2f283ddf41ba6d18631ce22a16128a8f0d595e3ec7f20d09f2d52ca9ffd33fe3416a86b0b8f4df3c1e7cdb8e6053d420435c15762c5894d99ebfc655a6e727f2cdea7dc762b65e4fd688b372782e09c587576ce9af0afdc2eec8e54ff9c2ae0697dff4c95bfa424afaea17d63bfae4f53a160a13ff8f57a18f155aa1bc628adf023544f184901cd7e6e47c141f57f5e547c9821f25c884d2841ff6e432a3fc5c4601ba8c02c6653aa5e4914ef8596a1f4a16283e0e327f88e2c3d245cd30edb7332265c7e28ee5aa7efece88abe4a88983dc76f472903f1cbd2e3fe57155c83f9489abbe890ec23c5bf00f8ae5379b1353e342f0869980f91236cfc64c62527c1417728cb342f8e55cf5dd9c4ee2df52b8cc0d20225c5cff26b8902a642c18d046dc9843a51cb2411cf49a2170a821ffa0888842505cbc4038381324524ae9e904361332cac8d3990c321999c451f98a264871f90a1750002e5f41055026238bc1b1b0280c85542e9744230e6c1b394a6d237ee8aace9fb3ce611265377ea8739c6e7c51e77011ddf860e7f8b6917de82513fb6071e38b6ce8f7c455dcf8f10937ce0f866dc4f7af860d066dcc0f7de1016e7caabaf15d703c0140577d37bee6726301ae7f597ccf303c859781858c1da4b0430c9f182e5170415d816a81420b8b152ca7279c569cb0a252854a0abb524c0930a12000a5748012090852cd51473846220388bc1b5e27d3712a2e5480d0f6c3460940b5016899006e9c0c33afbf0dc621e5f50f00e3880dc338bc8878dd36c3d4601cfd5136bb12e9b687eadf21675ded4694e99eb70f63b49f3e57fb8c7dee46bf9b957f9a461f8c29edc11b31a5cd1454d7ac109f37edb1049c9125f18da0a225220a5d30b944fc76e0748958d4101ef6fb957f73797562b156fc12c6d48fb509c7cf2f9c2744dfaebee4973a86444aab8df5e394fc1415408d5cc5951fbe7cf79e61e4b653e5872d25cb189e9861b85b32e0f8e588dae1f7a8fde1897364ef4ca08618ddf8a31b2d8a881b6d78739584403e117995b05016a7631c1cdd051c8ac6371654948f2ee2beb1a07600e420072d66afd91807fd87eca3fdb2ffc1334dde70157f0b8b9a358b08ac3b3fa7a22aa1babc8b38c4010ed78382aec3e18b2f3c0bb59f352fbc78c3f52ebab8fe0637b8a10d6d000262031bd6b00635a8810b2eb6d8220d6958b144031a506d6ddecf70fde7a27cf48a3ffecd0ae5fe73fd0cb79fdf09bf69df31f276b702d5b46c7ba9fe46966cdc512ef421f71b17b98fdcfc90b64d5993c5a1ca189fcef9993c42cb87478f268cd0b89ebc7e1888c1f051853108b017704c00ee5ce5f6e9c751f3c94d29bd820efa9f5ce5e29dd7800967ddede973414137fdd3da88be43dbb66d1b902059ecf93c6d915011be3173e3068c8a9e5f646dac4de84516c536a2f7faeb07ceffeef796c42fe27d7f91256e69e68bbc6869443fbfc8b446c4147dd16725a89e45f1f7dfac4416c534de77bff76c69e6cd0a0335f4bf41cef211bd7b0ff53e7bfea883f4e7577b8bea2372eb3dd4cb6c488df47ba22fd216c51f7aee436fc4fb698b7896fbd07f17e2150a75671cc55fe4431de1794596b0a5117d7f11efe71759122d4dbfe88bccf7bcc7c8928c491ffa8feeb153c3a20cc9baa5d2d6cad1524a6ba52125f239ee2284c4410ad2cf6ca8e5207d3ad430d4baf4bd27caf48abebba24c8ca7f4593145df07f5ef3f0ef4a1eff0853ec6a7f22e1f09e55952be7ea62cc4a238973e2b8473a9db2d88ed06b401cd8f575c56450d3be8d20f090c439fe9cf78a7c13d1dfcde8a324ba21dbdcab34565d688d3f3a5df41d129ffcadfac42cfb9d486422abf626d46aff236a40fd1a08e55af8265d87ba86b71af10ba142efd9ef9a1a7991f923f55ac4dd7979ff7fd3e441fb245e48bbe6d912534f2455f24f4def38a6bcf08232925d28f8cccaf0d8683d45da38f3e0976e99762973ecacfa56ffae8a7d0f79e98a23fe329bc22cd8f5795e520fd683bc8c13e430dbb27087544e8bdff11b2a8e8fd0f69ebcfa7a93fb9af1f2dcda8138d3e54ac9fb436231bf9dd3f9fa66d96444b33bf5a9bfad33631bf2d8df4b9485997bed7af71628afefc38a66e56a3ef66253fea3d0ed2ef9fdf393145e9cf23757ebd1353f4fb9b29a8a8231ee5a37ffefcfeb0772ed53efb5a77dc8829ee9e285339c57fa25f7b2efd908d8929f6cb2fd489941b77971e704c2cd1615ced89fc53ed939aedfffafb655bea9663b7f61ed45aec9fc8f687a6bb5bfbbcd3645dc9ec765f5fcebd1f31eede8f46d1846ca8ed574cc50fd1a7d626b30d8ba9f8916bcf07c7d4f64c437fdeac6828b51c5361bf6efc1812bd02632ab3281ae6bf5971fe85fe733d7ed84137bea24cfbc062b1e7e7c69e1bdf0235be1269371e441dd9934e8173e74626d6e54fc60e315c502d2ca7159514134a89544722afe3421bd5b229a3b7179fd92d333bd137ed3108bc59eeac7f7e60ec0fc20e629427e0f8850bb19ea891b23a0afb178b7583d67ada69560cb8c3daf17fe9f8b058acd3a9d69d97df337b664f6bdfb3eda06aefacab59e9ea4fe47599c8eb5c2ea970b07f54bd0fdf9e0e15cbeef23d1d2bcfad7cd44196ff3ef6140b0bcb73b2931fcbcaa7f2df675f7e2c2cdf26e3e32bea133cb99cfca60acbc9eb2edab0e6ae7cc696e5e4799e0adfd9dd9e8e5194401c74250450533e88ab4cefa837fd0e32de45f431fe4d42bacfb8ee9b324c8f32bd648f8895cfbefb6aae8a45752fbb3f7de6a9782a9e0d6b2eaab32cf664c39a9ba9fc4c54f9c28c636f889597decbd87940c6e5c0cd5551b1281e7c3ddbbdfceee547955ff942efb79f5e0fd1affcf478f4157df685ddabd8f8f539adbd06f455798e76ddb7225ab1221ed4ccd698aecacbaf2a5688e857ac10199fd59876f86865fcf6ff85f2ba7cf488982f6307e9f231ac74d0c53ee94dd68432c92f4a9334c597281b16b9a62799a2ec4cd2d4225f9a9ef49c89f4013199bc4f99efa578d9cbb0e6aebcca17f655e1447fa3fbd3732a2fbf5a3bae64f706733cbdc8461bd67b927f3afdc98635a69b92592129efa5783f1357543e4ec952e67b9e8aedbed0743b114b5c49b1d8b09e3e7670a54b755f7a952cb342e47bdf1fe36731ec2c11bf35f37a8fe27dcac75748f6de73577efc6498a17cf709f1deef8f1b6eef7db8797d53527e26a67cf3c320ee76b707e2aa2aef687eca9d0fe453c241d1c75927fa9cc88d3403b251a1c69bf0e676ec97939dbc138812dbd3ce65e86f2fe90784a7fc0689537e2b153533418d964f4ef8cd943de8b8729e5c868213985c98cbae1c26b77318870c5826a627070851a04111b0d0c5ca9fe30a54ae020caccb575caee20b49b8dc885f3c7671d08b0075dc75ccccb6f3b6ed398e077f7ff7617fc8ce38c8839f6deb7c109dc3793ff3f17005a183b3cd83efc6cf6306e8fa079193648a2c2e67eb8fbeea38fd3eaf3b1eb3c5e572da412e892b670ad18b6c9f80da905d3ce81c5c90d839b6b37fc2c26522bb61e7dc246dc36de7c0a0867fff4df75c67515dd73d57f18521dcbe37b7bbdc17f68768c8864ddcdcee1368f2d4cdc306e1a03f056ae7b8aa77ba27c9143c0c76129ddb525ccfa2866078e30610351ac873110ce80d1ba78926d7df86762e4696cce7174dabf1ae896e410d39e88bea453d7dd32e2a7bfd91051cc7aefa1d2ec4ecd0e562e7915e21a616e3cc2ea775d9bc1ced346eeb68a8db3ce409d1793ba228349fbde70a382640ad406198a0f8d54b98b12e9017206893020718c69f0986f15f8261fc395b430d9b833e0239e841dd8583fe3bb64ba4e5b315a2ef90db97bea1861188e3d3553f51430f7af2d3b108d4319f2813816240d78f88ab68252ca4400d6b275dc6ca56d01ea5f4baccd3413bcda32db966ae91c40b0f71a979f9e1c61a0e027165d4244b19c392594e20ae3cc568e7bcd1ddc5981b6fcc76973c5fae263b4b7548fb57665978bad1a5646965375f66a2b0893b7fb84d7b6859a665cf3224d2339bcd71a5277dda0cc3907e7e215b714940dc78b9a20f6d92d60f793ad8c1da77f4decb8fbe473fefe57b2f2d91bef43d1bce972c29a5544a29e99cdd36e59c92d229299d53523ae7b4efa0e8e4a0486a94524aa9a873502412cd39398e72544aca5129e79c54f4a21f445f0d07490fbe703db8e648cf75c731e7e220e9b7173dfdb66e52cff33c8f765f48244e4ae79c74ce49e99c93526a7f7090fef685405cca7195e33aaeeb3829394ae79c739e1ca41c37b939e79cf3e420fd4bbba7cb18a5cfd6a4945272526a5272526a524ac949a969524ac949a9699aa59d83946b8e294739ae0ad1f706c3504ee324c7711dd7755cd7711dd52810573e25bd3ffdaaab9ce3386e6a963a487a8e63072b89d6b015573ee949a3dfbed10f0e6e351cdc7ef4795329e58cda775d3767d7cd39e79c9d742992deec324e0bd16da3218dcbbae949511c796d20a5912806c36c3fb3d9f5a8fc3d344eebd8db515ff4f2ab9ec7e9e8bad975ddc5eec339e7eca4b42e9a56bff0e5ca91eda098734e8e9b93e3e60c354dd3b839e54c147dd382dbb3aba4941d14957f4acaf3e3662a726198ed2d17a54ad33429b50fa59452d3344dd39a0a31354dd3344dd3344dd3344dd3344dd3344dd3344dd3344dd3344dd3e69457fe3c6d947634aa2453a99251dee97d38279d4cf4951ecdfc4aad73707bdfbe47e5df7e2686beb0e6c695bf6d54d49e779193a1b9659dd43e9ccfd37a874ddc693339992f933a032ee09800b53a78329d6aa4ae92e29a5ebaeb1d63cce2fc64146a5833a01a5689d3311c7f421848aec77ed25df49197e56f2d6ad85d63ba32ecd8cd5491598b180dd2401deb9f271cd4844d8dbfcec0156000e10f97592457ba4c23000530c00d9800f8208019345e0020e363f070621b2a3946d7853462d07ffbaca0066830f3e1facf18d73faa5cffa6ece29716e51b5c482eeaf2154d08ba1ea24f45ec32149cf0e4861e86ebefc3e52bd4c0ba1e06c631c3afb841bcf4c039b8e7a7c138ba9ff1fc353a470fcf1f001bace2e1f909c039ecf31780717ccfaf6ad53f3f8ece21e3f9813800ab623cffe51c2ecfaf00c6817afe2078740e96e75f00e3383d3f11ac5a79fe223887caf31f8144fbe81c28cfff8371949e3f02ac223dff0438477d7e0a007195e8f995e81cdef3078932f46b3cd378661f7e84988f22423a78673c88abe237ffec10dd683b367f2a18047899e3d185129d03036cc3bf8d5c17c230fe219be1fafb00f3655cc6699e8ed06b5ae8a9a763d39e939e0e252ea0f1b99c4c20811a9fb24ea07cf42af5bd4a599c6e55e371e4ca48eaa1a02b1f9e7ebd6a8f46ae6a582848305aa5de570c7e7c1fbe660180df9e0e00e83022f520006c7873697cfcd4c72c009086df195f9f81c136433f691b4eca89c1f54731b1a0d536564e10c5f5676921c1f5473d71fd5d5860cce1ba8df7a28bb6c1c31ad470fd7bd8c286e80636b8fe5c76d3319737cc3eec58115cc5cd6cc71cf4187f067b3a3276dd8eb5b718d8867ff7351918c67fc6d74f1cf4efa17faeff4ba7e1faf3d05b5c7fdb6cb8fedfb71baebf8cfee2faefd041d73f46c7e1fabb341d1886e504c5f55f31c1f55741c1f54f49c1f537b90aae3f4a0bae7f09c90baedb085d063448721d26c618c67fb3a2c60f5b761186ab71d081849857b34118c63f3b52a365077dc55e0f6d87d4b2971824cac4153b68028fbd137d93652531ccd6f558d35a54fafdd59824476b1cf46c722d359ef29b2141db078932a1dfac4849e59f1a6f512e2a759ddb8591b583da50dbb6906af4e517c4c1b80ad9f813534fb85d64d10fe22aeeb7f71fd293a34f378b2242d380b79cc3d88a38476264cd168d9909b81d58ec7801f8f24be86de096d609ff520ac6f5effee507d3ede79050c3bf1ea583f45df5c25ddcd791c20935a4dfff2c7fd7897146a0f8d54bc8311e467801fcb511547feb5f793cb9fe3db889770f9a44e9e2a003b91aedd9f1334b894cee51fdbd63db67438d36e05a3d2f3bbef8b93f97afa882757fb87c451398dc16d519e7b899c875e746bab87c777881e32abea209ecf2ddf1c51357a1fafbb6ddf1c5935a833af45cff3f9d78aefb73cb59377ce9ff426cd5dfdb126a0c6228ca997996f9649a7f608fd8c3c1f62f7a26bbd0d7c3533c3423342378f8c81f3fa3d91907bd21a411ae7222d27a405e4d4e19e3b0b93685ca3fcc5e66ac4dcd8696ddfb0a1cc7d5637c6ff7ee6eebb1dda4858904fe8534c6dc5606e3873ecaa9b884cd9574ee3033a540845c966d1c0d6d736edd16e23a2eb46d1bd5b2e96a3277d0cad1d9e1e971c1623f401ec4c2d1f961e1b472787a5c3e2f588cb22acea9f539a04eefc40081fc133bc1ea8bfac4dc00634e1f7d5a301785e9b8a8ce8f8bfef0b8280f07b92807b9a88b528f0b3080c1038307065aebe9c1180f0c35a434ba7c0043e3e88742a84d26096d5be8e50ecb557d5574240f1349853ce22f5b1b0df94430fc9b7bce4827ed85849e7e181a22446d2469ef8fa211c80ae1577b50bacaf5ff1857f903d1f9571ad2225017aeca5c18c6088e83acecb5efcec1ec352242963a3b984df97ad135dcf0302e47ce6ec439434ae937b59466eee9c832398768fb23a232149e20c595d242c1870bea3d05a0f074a78807357a0d7f4e5166fbf95c770edcfd6768b3da4e4ccd8f3c35a471663d5ca602cd7799cfe18d3bdf34ff7467c856dc396bdcf94db5ac877808486e81a2f1ba2d9821b6e250acaf88134b4893e35afa4eb27c28bf6483380844ed97b6edb37cec60fc99a3213adcbba75f51d9095f885dbe3afa8990eff4d3319ff4a188f0bfbf7d4648b03d14bf5a32e3374baad923fd8cfb5049599ed290de48b70de55f8a1da31cbd648f5ea326dc6404a32f5da6a6bb23d88e511359d379ec4c4a25dbcb2d5a14115203dded8cb0c04a9f74c26225ac95b0628cac01b642f9d88a38d1383570ad9634077a20039d1587f21142d170a7e72c8a6645fb95d0f36ab3364b7cf41a8a8005eabbe715afaa83fc43d41a97edbb8f650a36b7453f5cef66065f5c1c74231cdcb68da687839b65a63fbabbe5ed7e9a1fdd8f3a0b8483fe63be8773ceb989b23854cfc678f3f7c3087ef5cb8fd63eec9fd6087efd70d09fc64137e247ac86fcc2a13d82ebce74a82f871b3f642f72d49ace616a1ba20ff90b95355c7f23685cc5a1f7ed990db47374ab6d748e46d2363a47e7983a4727691b2a8ca36dc03048ba19308ceb602e7eb7d070b7684180c167305c7f8fcb70fd1b49c86398c1176ec85eb8fe6203c6e18361bc73d0340f3cdcec433cf060adb5dff77dffff3264c890b1c30e3bec1023468c182e2e2e2e28140ad5d2d2d2c2c2c2c2723a9d4e2b2b2b2b2a2a2a2a292929292693c984828282522a954a241289546bada3d168241289449ee7795dd7751cc771a1502874e9d30fb71bf276e9537afb21c03834aadd7e1f8c23d3fa1fc038267defa7611c9261e8fbbcf49db6755192591a4ff9477f1a23c250c393aa75e60a149ccbeef8fdb67b9844db3c3d3c3db37b781c741e66d21edbae1dd3ae27789858c197fbb3ceb2af81ba0b073dd3f98caba4d4c693fcda8a6ed7e5b876775145eda0067250ba6ad838223a6964cf6ad5d2916d9e694fd9cbce41dfac36b22128b2614ce83bcb9ca2d2f2300f0e4e47d12cb8fe9a0caeff9491762c2d7a43f88004e1b08ebe9fb28ce8db86da0701a27dc831ed95187d3588abbaf7d86c81745f900e6fae120efa8c270fe2aa6e0a448919772495fef6d9c762e300f1b8d0cf4419d2771ac9ce545b4536880b0815d75f092eaebf47192031e5ef5976d9588c5d5973b881cb6d57fd8537468044d2f507a22c561b7142de48275c6694060e3b59f1c40eed5c3c1e35ccc118e93b068bc19cf0e9447acfbe0c7e5d0f1683c59cc05eaf2cbc2f068bc19cc4603198132d96c162b09813d8eb15f3bce73c580ce624068bc13c0f16833989c16230ef67bc9dc4282c0673129b31d8a5b608ca079db608b51d6b584cf9b73cbfdb0602c2dd677b90644376dd51163ff834f72abd68c9e5519e12798ee32ea8aed053f9a1bf60394956de47ed0392d43d7df822eb59ce7f631ca2ce645d50f6d5928523e91c946df8b320a9b561262014a01210a59faf5a737fa5a0f0e4d4eb56acb4159da37dda86479921d15f4035f29c506c782a597f71eee9f032eda3a7c3fb38f24839ee123971d09f383804d63e9da3b5a8405e682cae7f6751889470df7ded4473f52ab47d610a0297b3130d59ee05eaf7b9dc0a07b5706f4314301e9213f2c65998382b164372dd8823692ed650bd7ee6ac151c103a39491ceceeeee619ef98a4735cd53abc3dc7751dfd0ee6be4ea243b51c9dceb19d13657aa5d922281f5aef683fdf16d16ceb448be2273dbfff0fae12a26fc8b68f835146dae6e92335ae3fdbc66992c5f5f7a8c85b50c3c6b91beb63313c91ec0e2c769a8a3c99ee9c9cd32a484ce538a98a509e634e0f073d89b34efc33b261f5ece9545939ecc3c2a97efaa54208dc13c3f48a87ab42961e17b8fc9553cc4388d3e5262eb3edc11f9e9ce51f6dd838a0dd83eb2d84ebcf0ad98747c889ecc6658904fe3a427af9ac445442e9184d2a3132c742a9447b4e925e0a91a4f788da9ebbfbc755fcdddd3f2d7aaebbfef9a9ccccdcaa9883fdd3b17ee260e9f9eb9f52d8f5cf4f7f2acf9e8e14956f56ffa87ca898f22909bd16a6e6e209cae74d3e7f75fdda48b3422fbf1d6f006a569439b5a086cdea5313aa107d2e9e72219cba8f3ad8f2d862c293cb2cd75cfc7482da8adc2c57420d3d72b35cb36d4f33c645b34eafd80f174f5eb1575013364d62d1899e5a69075c34f36ace8d7ef7946542df596687317f1307bf1dd6ccded32beee3c8cc3ce9cd4ad332961fa3e40f2b10c338123d9cdd348d82e39790c66e7c71303ec3344e94c93ebef3841c7e164a578f7469858351fa3818a58b61e2cf1db7d2c1b6347bddf8a174dda86d4fc85e34168fe07255287f5e334170936924acb779ae671fbd09acdb61fe72585b87f9ab9fa8fd9c3771d0610e7acf977df4338b8a365a96fd666db6cf2c673f2d479f41d335715806ddac28d526ce7519e4a0cfcffee5cf2f4646d90686f1d53cc27ff893406ddde5ad1bfaab27a6b850fba9118e0950637e80545cff1a3cfc0776b54b853aa257dadf1a3ce2d72d29457f617f966559f631b3fecca7138f98f218d09d23ebc4def129c27a7b1e74598dc86efaa3816e78badd20f59a4994198253fe5710038f28da355ddb02c7dcdb775f0cc84fd9863e9494636c8ded0bfb7bc4689ac68fcabe2f13f31291b7bff92dc1351cd4b4ef5ca5d930060c41ae1a37e829f7ca3e4104f83f8f408aeb2fc11a40744aa2ade1297fd05f665f70cc92ed8c2a3fec24cbd7b46f5b1d9cd614d6d973ded8d7bfbee9a4658cf2ef1bce7f21704c801a3bfe7fb4fff75f56fe5c5f2ec735ebd369cb42fdf0f4c518d97300afe49f6e804e4e2e35e6647b726a5d1e86d05d43a8b8fe445c15bb493f89336edb9f867cb46640406c69f502f887a716d490baebe53efc85262a87ca1f3ff4c9ef6fa332f66a02731273d70be6a489bb66a4381cd71a8a66bef79eb5913fff06e5c3f39e5d5c861dacbe832fc830ce30fd332efae8d7fd0be7d20979b9fdb75d1cf4db313b857e7bda755cd4905744c80ad96cfdf8256a4ef84dcb9805cec89226b92e8e145cd0028681a16ba82a3bf8ed111c7e6975628b8aee65c47130b6e40b9136b61c043de3ef886377622be2509cf0e6c6232dee56affc7254ae34a5b5b6e2b3d8939d6da3bd4212cf80a4b83126097591f520fb81480d35e4a86026b53876310acee123b8cef5b4a24c17d26f5d9567e219ac730236c9828aebd94eab5b524ad98a32955210e479bd5eafd7eb35d2a9a7956790a59e40201165b121ad2791ab5b22156f895cb375a6e856b734675dee5cd01f7a2ee4289411a1e78bc4cd2a663e17d5a1f834a1189fb336a88e6f836acb0412bc7a9b9bbf1153fe37abeebd4782579eb5a1a7f0c65cf1cafb90d2efff1153ce044dfcd023c12b2362ca3f646d7858d10f2aaa453fa83476890694a07ab5247bceaedcc562ad50f4ddc562dd90657112e83e3ecde8ebf7d75ea17cf42a7eafe2876c6c45e6bee57dd40fd56fa92d5fa476cb37e4e78b35c68833faee49b7aff7a8c731c28891d0d737c27d0baa1ff5372bef43b5a50979286bd362a32ba6fcb9b7a996fb421f78b3b209853c6b63638b632a0c598e2924362595fe0efe91e57662f6a416a9456a915a2a2a1915d7a389dfb1f80b63ce751ab21b0f6a464bac4b69ada7580ce4d9c978b29e15c6d1d7a9b8dece5e11fc5b126a1871e29130f4d35de911c12f1b09ea885e459cfb533ba7433f9c8e83958784f23c97fbd0b38a8af524b1c813a1efdea6b3a8ce26f45de8e7085e852cd7c289295f826a96834658cc2c7aaecc9c525995555995555995f57abd5eafd76ba4434f75e5a4f273a4b3bd6e9ac586a69bed4419113dd990d6151bd6938a0d4fff2220f086d9ab861d4f0b289bc26538cb751d0f8a2dd9b0926cad4c46221b9e4cde5bd181595cb74dfa89aa3d5d43ed160b38478c826db880714414308c3f4ee887d4436a917242dfcd8aa4e3aa294c5170382296e80355b3212762d18e893f8e831e632ba43db40e15c52f3b1e91389d83d3edb4867cfcb78e5afff11fda2375e291d88a381d0f95c1f58ea707a7c664c032a4564c014d8a03526bf64008d79f433fd3c575476a45996652ebfa773c3e2e24a29673b5564c653b3e9d1038e58f844babe85667c393e6caa6c878b21dadc5c33051d41a763c21edd9d97462ea8babed0935acb1eb7edb725c551e5785bdaa31578595e7dacaa43e21b92ef3e037ed84bcc99ce89ba6336f883d61e4612b5838d73f32016b0011a9b8ae49d7f56f26e08d592303e2faccb6fef85fb3600872c7b82aec071df4b6359e358dbb5942d3d19143527ee3b40de68f4dc49b25b4db2d3944adf3f874d0e517e32093fe62405f02c3f8c7b8aa3f943606fc6a308c3f28a57c079d79d8e7c42e13a821f8b19378a42d60ec719087c7f58acda4db8ad8accbe2e1b079a47019c9c453fe4e051837ecc8e3e086841a3a8f3cf18071c3c8c384d2ce45ba46382613035d290a7283c70f205c25e35d86e46ee40c925d4420e7a26fb43f57fe1307e5ca87fd24862b9688df952757fef484f0707b979427fd0d2026d3a31e4877a30d6bba93f6a7d429fe8d28e3cfa7d3b7bc492312efe97778175bd35d13cbb7d8505e957749b144e235b1fc0e2a3b8464cf62aae95c6c8b484925ad3cc9867d645e79b24256de4484490565e3af5821d9cf1bbd22e6cd545e45c6c7cf9321239aba1ad3cd3260bad10a917f32d9d046beb4b14fd075f1765e273fcbb2ec639665d987d34f3c1d7226669f7cef9b7129a30c1bf695f1de378ec9e4bde9a3a7c364bb3a12afbd21b81b655713f6f7611fb99d8e286d9fa06dc427a158bed3ab7c7c59bed044df7edfaf7c2a9cd5545e0912f6bfae0ea8c46c96754d0e32452300000000001314000028140e88c462d17040240a220f3f14800b93ac4e7e4e1b08429253ca184308100018000000101140000000fc0990fc570ea9815c97ba0f2de1d608713e2d270052c097b883c0569ac017a96f52f48228bf585969c76cd70cf3c5131e2c8d874e35eeae9576b529cdafc3f29c0c5f34c5459b35c816613a03fc04abc9b4390593a69e7c81bf4fdde804fead2d8339a1964e4311bc886477f8ddc55fee31370e264ae43136309240cab702707b5d6e88e61af2f0886b685a4117ceee0916932509e06c1a2c551a0b7f9b8eb896151168e566fbcb1e3d8fcfcf001b69c3b78fd04b13614d2259f1b10ea4d792119827b88c47dd30ad6a1582f8d037eb479afa84ead88840af264cc7e09869ffc797fb3119b272fc2433b201d7a5e5442a2361581ccdf694f03d2f8bfc1486ad99b0f944860559a2529d5d4104f6f2a6a8a6540d8c2dd89f5f4e0be1610246bcaf759efd0075cfb6a6aa82b09167ffbfe2ca32d135632af5c24018ff33b3bb3c001392b568520d91fdd81aee2d1f32f9c6adbdc4991a75e88af57b646261f976d25954454589bb5af68d47ffe9243397f4d44dfa6acbfd3d85b06af7255f99264080f2049f287a2499cf81ae084c0816813a8f98310cf23a111d6b8accba403fe89e6bfb7a928ad8dec9d9fb6fa60c103e0a00065a586b8ea90c55d9a07e15abf39ed3fafe0f34e8547787bf89e07a0aeb03a4a0b901413c06475221489486c382043086c5904090138525c84c8042631334888f81e1a010c54687311e8b47a921044c8b6300421083619221c811c160a40c88a062080494cf823060286143c3013fc323d45022a2637c1719e99f55a96d1818a997b88c82cfd2a7cf33aa438c401e242af7ce020e1f036790f8eb7516dfedf853c4d5a65b6f09ce4affa8cf9c7564185661bd46652c79d349206287c274290e0e975d6b7117f566a909d0e5e88ccd354cedf1bcf6bbb559fff0881b31dbfc42ed62b239b1e429caeffbd314355bf7b40bdaf80607503eac6bf804aad9f517d8071dcd3994e1235b48d9e0d08a496dea542ef4b68ce01da611af037f3d78c76444fde7f315828b3a91b7edb7418bdcfa18bc352904b1f74990335751c96d012bed2e458a2924a08035b909364eb4cdbe61285527a8d0efd02801d6cbf2768304ddf3cf689fc5dc1b9534ee897bf892f10658d9c8b22bc3d2add7f9c3d2d5d6410e0b6f43e87254ab3341582d27bc3095e4ce724a96805e3178b8a0e7b3cb049339ed2088e009d6ca98b8c8aedba1b01969e3d666c672ef6dea803eaa80361ca6fa6cbfd5c0fb038cb6515b276b42f9bc78fe534a684ceb664514160691fb621e0b0a93f759a1696678bba9e2666d28d0ac17928fbcd70e903e32a0305101b09629055f13bc9cae421b22cb55d9208cd5011f77275948084cbbcac460b1db00e34de683d4f6ee2655da564ea7e613a2d506bb8b2c6891a742cdb61f8109f97838cea700d89dca3c7cf060ad315c9bfcf00df8dc43e37c4f37a2b1618444658507d248994de4a9c649d1f201f6b873623219c44bab4f00be3c68a238c8210101bc0dfea72bc06fec5843bbcf3d9ab319796a5796bd7e21330006c4613ae1f3bf42b594c40f76a7e15c15df359f87bd47b065b1b6b70844da7ca3de28857f55b1dd65313834b9b8e493d1b3738c6388a1bcd9f00cd3a0eb5e1d9ddd80de16984ee3d90f5acd464bde3733ae3a9c8dfe647b9bdb41b5796c86a64eeb667409887cdfd3c9ce2b170c37dd31a10b430686735cd7b77e5dca1ac25e5c876070e5a1b5d20551bd0f66940a9e4100712dfb3e2086ae7757c07abf650c1982e39190c3fb457cf55c6a8a1beb7ad552d8dbbf56e1d3471c7d4020f1c4ccdebdb615e3f57656ab236505d5fa8d36296a568512987fba84c49d9137cb115608649acbf8e88b3ca67d946f1b9b28a41471ffd47443c7df38e6aebf84dbe273f037106e999f9d2e3b9a5e0c336ce00eccca00f30c03b04f581a34fb41d564457e3a65f23494f1decf5dc5ce4564fbfdc0a92abb69191468eca19c1e15f7a08cc2fe343998bec4c8b7f7415a1efa32c9959a8385cdaa8b55f50207e8afd2f58ecc8b3b1ad03d0fbb3c9e83d5499ae1c08546f1457dd0c02117503c4f817f3ffdf62b62b94a26b65e80e984492d17fc56b5939a27d0d1147be5d59eb5ecc992569fcc2ae18d898c326c835e97341eff592ca6b797ce43673aeb08e0f3883e944903dee397140054fb2dee8729a0eadd544d686e6d4dddc330490c76f870b15de8633838f92641c27b1840a191faea9f170e21cec705f29d28249c313420cfc3cec37f581b4e81de7dc0301014e47240104b4121004538074f1e3ebdac4dc315d6f491ba8782706e886cea00679b878b29aa7adc543a840864a495f8a0a64b9732e1013088b03615ae51d7d99a413cbfc308123d9334fcd97f293ee643af2d4dc3136176e433af3d92723c8d6600c0e67b430982b93750028c78c24eb759726891e05c7e5f81a56331464df593a0ab37a6f64a20faed985cd8835c22f5458699d47c157cf18e12bdfc03864ce313743e34d3f81a06d15eaad98c1fe09ebc53d5a88d599c15708406b84fd4c501c07268512ac031d31c2a4de405ba572240b4c5b1180d9058fe0dc7e4a85e7feda9def325224164919dc8f1b79fa398de063582f9a990cfa034ec1c5b4166e17bb5ec36546fdc0263321ce85c2ced7fe6e7ca4e828fd849271700ec5d351343a35268cccc7f93499afadd6a55aa30f0c1cf513f93e8c1288cdb77ed0289b4721bfda0c6376b5e654ba736ab24412ce7937fd416f7d049afba8a4daeaff494d149b50e86f8368928e3714aef09cad78ab7fa78b8e1c1d483ae97a485c99f720ac9e6da891e45936820beeb95e47a3c98d0a57a2006ebf43d24508ff6917df9cfa42a8019a7ab9dd5f00f19ef85646f1a4645e7df984b4bc192956cf3f2c8adaadfd900132896968a5499a6b058c00273eb7517faffb8627c2695e8119d93a3f7c1edab3cd8d9194cc809a4e6219327ffc493c08323babe66f703dd72140b5fe8c3683fd22411933e37b646c3ad0b006016288d0fc83e4ded5d9dd18d7a94d47557e396cbb6f976a9e33a8e48a2574e088d53c04bdcc82a441d05b2ae331c1a6d7a07af6a017557aaefd9b393a91407290dca39e86d1a4bbc405f88d7ec07921416d0a9ca3198bac71a4a43fad4538833b3a7d91ad367956b85a98afec1e8ac3193e748e0b13e7ec20884688653d9638f488b8df34403888d721dab1c3ed3457233073f573d47c3891052b0dd3970762b50ad4e1682189a04340da0415bc7c69d45b3f7f9eb31de7773abef9b5e9f10628b0d554d742bfec4d6640ffc3175cd68249da4840fd7f4cdee893c2664d6a339624989d0fa376d36842d5b59a3d06c615b17ec6e34ed42c0bbae82eac10e53552380165c974b227e356fb0cdbd9c6e929327dcdb1f9373d923306447d0f790477a31fcd99a295a7f0c7b6fb2effb15bed03f92cfd6ac04a59e5ce953c80da51a504c6d2abfaf870a01730beff160a80b26a6710c7cee2287f5671598ee264db4c0ea819f1dc0bceac9f685da5334e1e593b82ec0c6a1097b75c02c1fb9f020648e80c87be9160b9c2cea72a0da4a5fd72016bc8e0c9716ad389eb637cf83a3d6b532108a840c5f68d1abf37a017072137f40ef9e115426566e398b90414d1990e69b0de0bca2cb6553d83b38475615972aa4d80d16252fbed40ef2f21923bf695021ba8fd485e959eb65bc96722372162ba040f0dd5b0b5c4f48ce5fff28ee81c6670d148b06dd4544c75827250a67616043e766d59e6056829fcc3fa0d68d93ccd6e52559cec1f6941635390ede9ba528bd8f9718a9418dc29ca621e3b497ceec895a77a749c5d272b94889e3cd11ad0de832c391f68702a27922d66cfc12326541b296a26bcedcc8ad5d24d8b23412babfc6a10415949db6c0279ed0ddc2597fb4101369c768ea1bb912e311bc90c1b269ed7e67241ebab3815aedb46edd626e20b0d97ae37b0d3e08a3c80a97622630cf8b392ff82a94b16a5e9e2d50541dd4279d73bf6663865a3f5ff97d294c24190e608aec6433acbf19fc694397a0a38344cc0369984a35c1da27315cd78f8709de1fac63531beae8dda42d59217f76cb3914bb275f2b2062cf24850f8204a1499317e16a6e36ee72e23274f24eb27c6cf08829fc243593f70420213f536db0e7a27453cfa106ddb6c631070dcdcb2c9b36b7b1750fc9d8f1fba9fef956971535d9f4a6efe290e398ff0905c8030c8fbb01851d24bf8569a6df9b5fc74e8bb07da807cbfbbcbbce170084de81b495c13bc46ce7d09b64deec43dc0099081d3032b8ce0afc2d89b0f99bf034d410425b674703f8ecf779d06177f18eff24c0e24e9d3c240edd517c510bd36eae5239470dfef67c2235d49de91abfefa41d5dc0a8ace49b58fa40ea52def163d5fa8c9587f5456b40cfcc383627d353ebf82690fc9e90539d193275d2354041be4008955f19965acee80a94b9419fa4f88596a80a4e0112390a5d6f813e132c90f22eb8d9a0abd7c2d4022d57c11ec9eb2a530b51e49db7bf0621b7b6b012bf8a2c0d1c089a3dd400fce83b3a6a2df6e857e6115cf81c18748455dcc0a4548522ed1007a41c46a718a0d641d1596a23810b3da338f902299641b4842efc1e296c9e22cb573907d5cd740f814311c6b8629488284a8ed37af16558217edb4a9999b8fc70e8b30710cebf6f2d55890b6d5f3c74a3d4030efe5afb30793a01ef6c18216dc866508086ba63c20b98b9b8c49f8ca9ab31c1e339f77c1abc2bdc8ceab75d2567b51b0b76064cfdef394117b0efc1e7ce7051931c7d7a3c63c9c14505a032fab990bddfaa9253023a2e92e2ba621cfa7cc2896ac11b914442b618ca0b43e7e374344329b6fe7e463403d91a4ab921ea7ed3e00276421f6b48c7f5268da17e53d3115bbd5dc2013476debf160d2b5a1580eff2563a662e787c27a99343f15ccb6a07e1071b6bec2b4d8b961b8469f07b0780805d863605f1cccb026d0de30a0e43e11dbe24e4a0a971013166366c6cb8fcce02a285c15ea57654a8937b532dfc765fbff2770c4b7ba331169c06600f14e2f9dfad5ca8b6e782182435b0dc87563a21aaa1e473bf5b4bc886a8e9465875903c8ac1c9b9e9f5c855339f5419ec0a9b3fed7094677a482d709c3ca75beb1a49cfcfaafab66d679630145a78ef65a5cabdbfd0c3101a36d305782d9b312fca4caebe993b086468db6ce2e497cbe38fcf895f9f724fa2207c500f5be10399d5c3c106b25258a91d9f65ba51b82568b45b615929a3e7027d16ac60bacd67c533c67337007609bb2fd466f3536b9212659e382265514dd9f27373e69b4f6b4a0367f652fd4517ec476695de36454d563d5bb5cf58058c6d9f1ee081eca95d316f33cc79a6111478cc661b8df271f22b44cd9bed4c0c17325b77aa8229c91bce2e6b238443a776356ad2551bb1542e0c3f1b8068e190cae88b2c3cbb832e78ac2f8f19e44bdc52876cbcd48084fdcca339159a4df66d0f71014c2a728b8a4c1b90d1bd01714f74c4e0a23914a50581d3a761500a5735b27a4e7eb5eb301ce020351bf978c105136d0d0ca470ff111d8f0b978a90a2ef3f2c6a3c75e272cb26a65da03e4e40f83a1518468eb35336f532c00909516d79b0c74331a1eba5cce37449cfa56f23453a46d3351e26fd0d370584876260d8d73935444cdb8843f47c9faf0bc293866493cbd7c18fc0444aeb20e10ed83cee3289c1b79f526fb26ae2c7bf3e364835fedf5a6dd61abffaeee37d63131de3373dae3d515e3d3c792b9d7ee4919b98d65ca7a8b7bad50a527421640ce099ded6a83220bf7555a0b3d2933cd331315583984b3938a9211dc11650b043c1b22fe41f0c362591018732e23b6125c3c8ace5c19af60419446175b0750ae856fb2fb1e33a48c4867b602896c8d7da814c58cb22e6b93b16e186caa3ccb7440e86e2824fca0c0a04786e84b0fb29c7b872600c3206b97f25e6e4481faa54ba1f67528f676593ad2d8d68267a027a093484617bfaf88a7b880e87d26b4defe00014fc3b27cbc4a0da6582827a96c5985bc5f00655072d25e596024c648e31fb7f99d6a6d5e949e6ab17cc883b8df48c5b8a19ede4473584c91c37102d32fed33722aadaf8c82d941b92cd4fa4d848794c39613e1b7f53ae4e8614039049abbaeb970321e3699ccdf0bd4127fc2408b4908e363484c23c1c4947075bd1711af3852dd58bcc7296a8487d0dac39270486fc5ca3e5fe8909d71aacc45e74426af16c3e56190fe4f66ebdfc6c483846232e3d205c47bcf0821cf3799a8e3fe31c6221869f8042372d910d933e2c6418bb8985c46cdfcb1da71016044ec6a0e5f3b84301263898a8ad0ea21c13c144cac630649c4f7b4e85d82de20100189dcb23d0698dcc2e17a0e18879f046c5ad3fe22e012d12ffc85c358a0a011a3a93557da3cf19ecb623a3085128c81f12a791d8921e6f789f012864e1b53e458c2ceb3034bbe4f4cac9bc4d6d8a9a430e74bb79e331e52d1d319c494a110accd8c2980d55f6a23ccc5b4adde616bb6d5425de80c023cb6179ee87a5454d43000b1da1e62ca5489ace30538f319f1c9811796abaf490b4b7f853812706c59b3c1d4dffaa0d89d3960ec7407e82004ddbe33720800e56b32e8118b3c0fb22baeac96cb84d044f5ae1ab3f7920088a60cb7b48003d708453bf94569c6e9aaf480a7302b8c75cf1874ac68a7bdcaf3ee6f44dabe69aef2b8c5c97bdd01a19403d3a96ee78b12e78557c51ac6c36f826f250fdc56b910aee430b365157d25f22c654bf216ea534a4859d2cf1a564c47c471f4f1f7887c3058635a8bee599cfed8654be7c0bac3bcb25e75904faadbea246eae6b9c281370a2713dc81973145953e2dae48f020b37e3a4ee15bcb047b1e3db104ec782b169a48b37b31ed8894d580d6177f8ab828ec2fac8d61a3697b69dec6847e3ed0f898a896b17e4080376055807f6829f11dc07309f346618211188e79474a70196f5e04cb0683b38c92870f474f881456e20fcb95d62403a42596dbaba07708925d522004ff9b8c8ee3b713c3185ed76e8b69e78e0e7f7c9a340435fdf78142a6d0564d127424b7f9921aebcc1ddb88deb0ab8c3607d7641c79c437184161154562ce4882e8ce113a7c0f9bb5e49ab898d545dc7bd608d2d9884818b1b5f81a2a39bc13945c7473078b384f694d55fc5d117a530e0a112d8470f32a82e6b3d5c5e4b1581c427181d8963a245ef7b0fe8fb6e16e5812b158dc23de18a71a903669d56c2e265c730d2a088c07676bbdd59bc093f423133d6ae55779c5c98e0fdd38a0752f054d421dde2fd42cf4caba5b80241c7a960dd3fac544bf10cab323d4fb229cda8acf8c9008603b7fd4cb81e8885ff06ee5c2081649707fc967ec33e15d46cbaa69316609024c3ce5db952d0c19ede2ed6a96ac41545ce434d38856ae6ba53e4fa9113f4079ec8269eb648ae56006e7b48f38c968b17f06cd10e80260cf307220793174769da05f632f13b074afae26d58b64183911c20e46ffd30b99783506af70767819d4643de59af427530dd6fa34e099df6b57d5be321c9159f8854622020fd54749792fbe05ca349be2e22866741065efc23fe431adaf5e57765a81d2bcf142c41b0a01d257c120a829f23d808bca55e038248d0fb240eebd8499a0b337a5c3e821a546b2a01582d211d7d90254e01a5a0b5030afbfd1303a912614bddb60689c532e2a16b4f36bb0ae360231d70f029f897f8bde50918a5ad5a8691d6f2714450d8bbeb788c92d45de3fef30306d10339424cd5e39ed525c1ee60e8217edf547f711b5c3d0ecbb49420ead1c962471da544d7b903a479d8ad57d516c3fe8d768b1202f6b97016af25214defd85ae8808d901982de6ceeda700f0836f6a6735b522119bfe62c8723e84cc0cb4af7abdfd0d2788d2027580374bce1476935e441498407d2d6562c0e18bc16c92ce7e93642b625052d6c8f4103ca4d09ce4c7474e226f61bdd79c9c114b26746c064a54ef28994b2a610a44e4e74da32e12aa8d8ffaddae10f66daa8e318db6001636676e19ac7f11ed958ac914af11b40253476ce68a598e6f6f703640a98900cceacf138b2f57cfb50a809b210e4a14623685566e5650ee7b1695c0d58c50b9be4896fad8531b144b72b414fa4c6c4ecc48ee3c303bc9654f7e2fa9aea43e1dae88fc58774cf8c4abd4c52635340d5573e32b34cd6409e715ce2706f059916a8807c7aba3fedc4313556cf0e801f229800ea61c4497e84eca55216cc43d75cf1bce06d8f71e1b6fbfb9f62cb0d406165921bdc36bf0ead3576c89ea9096f40c43cb391705c8ad9a2b653e6f6ef4710291ff6b8272653781fb8b7d54ac1c06010f813985ac76d8b3a10aa024d0f797d8265f1354391831309ac5695dc9f104b154336ed489807c20a992f3c40a0016098a71643ac05b7ed0052cb00035f02592a4bd2bee6d63ac215825a59055ac0829ca6e5cb9f421eaaa864b6032959a20481cbe547f69aa5318e9e690a5b4436940680c3f49b1c05ac1a99d5cdeb2ea79a0a48b4b8736e12f4b1177fb6eac3f6630ef4640111341a9f4cdbe450ea6b8d748d698af9340d673b8f2e5f963e8d99c0a02d23257ad1cc0aedd76a865b5de6e5222e95c64271afc7242d8466ab31b5078596a5349438736617a25a74823635e553522088bd7c7152fb35fef12b616119ad2a2c49a9762a6f2e89bf8bfa4897cf2799dd960cd8bb6c9a10f1c85454fc368ad8682cad0a50d3b5f90e766e0f6d365d1c6b493e7525bf8c0e8d7d7290608f5fde77e4c77a28a86a2fd232746c7e95dc34d5eba77708e8df740f01e519f61c1f18d41f9780f525a2914a6eb6d05983ef1047b3c4ecaa7bb25acd0ae3595b801e3099e655f51a15d127370ea9bb437297f6ddc81052255bccab07cdb5f9c2ff423edd2612c572d6afacabd60713c5ba05584fba97c7ab399977125ecfb2a44c0cd523a0a4ef5dfc0a717b527436d46534eb389bbb7eb66cde568af9532e68d4722f263f8200806967da93e283f32d99b5051c04dde6c5747be3c0440649e6824de45a0937a08d795382c2054fc4b3cca676d1c382c373df467f6b2700708c5cccdbcf5373388c3a84360c786fcf691e87d1030e859f457fdaa42fa8164613403992c79eb9a8717d85d70f2198405a0988cf579b15b2509d8d0c12cb83ff6eafe64ffc302721ee8cf199434cbe22d4c1fbd90f6bcf64a4d93bfda0b95f75bb32cf80e680b40fd78455c118e195ec918916da550207dacc1ae64ac31d5b3ecb1605413a45cad32b3c8fd7e37e4fd407adaef1d2cbeb3bc473ad71722d918b77bf78b66aa19f2865819f00ed36c4677d8b1b56b54c62b0cdf333e8fc40f7ed496f11e900618db2672b3c102fe88b043420b940f1a11709627e8529b54346ac1933e564a9ab578a76b708522c371ba41b67f147a6755af791ccc1537d5922370d78169920b7bc4c27fa725d62786773cd9be30d7961685d3c2d081ac1327d8bd92f122675aa0cd5672eed2ed241003f4fdca8f9175f68f691648a59559b0212d51ca900b34010820308101f4f96afe19ee2c425858588a79941eb8307347d5b389ef59a8a09da1a882597870968044345ade3501d074fe3063ffae6ecc5bb3292b3700172da0441d664089d9b888571b7c398346387e5dd36885c53b1b53fd3909cf952b514482940db0a263701133a6d52120c1a09455a065712c93c43cac2b729e5b64021ebf9118bdbd4ba621242aec6deeb77356a332a90f65b46c176ac705552b7988e228fc8f1ab340ae352e6d719af3799325ce0d293e83ab2d9ddde1fd198e98761734f1f50007ca548813934714e5c36628fb2d50656a51c79af1bb0ec0c9ad1936fdcfc5d03868a75c41a9764e0ec89663ec902b022a158a099e4685c7647b81a0ee2198dea4ae3db6b5e338571dd9f0a5cee7a403f35b6e2bf2d12a5f813851f304356b62448228ac5e923ae514ec9ce993e319f6944ee3ff7c4b9f1c8bc6c808b974eaf80ee8163363c8d4e66a4e0a22510ac08e16ac87cedac5ea6e0b857ad7429456f3db69242067473ea4cf809df3b10a072753bf05135c306b822d38e90374baa45b3b25b58d7122f182d8905d50c21b3a8b80deaacea019a3843bdd6249b3ec88b286f4a40045093b41958650873b3d31c9c8022c23c3d51098938750d0a12c3446ac74ef9455924c07664689dc130d4291f610ac373552e4a68bcc04299c6c5244813e8447d12a4a4cbe4018d4ac4a41d01c7afe42f4922019c0ddc26db74227fb9f7cd21ab956cb1ac878cf2fa13c1c55cf005691b1c017379d80b925514513ffd88f988d09c95e4b5a64d383df3e8320f9b4a82bb27f587df357ccb4daf53c779594fc5faae238fa8737c95cab99fb417d0215e507c9a438e03a5f68cfda83205fba55f44a750627aceb9bf17972a64f7e0d28f3fba1bc23c671714a99bee2d20ea1872a615f400ef3da3c05f212f05f9925a4a50b904bb8bce400b19ca84536ab72007af36fea7a76711a7be15d95aa445f26daaaf44ed153859cfcb8c6e71144e41719ef05ceefdea3bf94ef009ab678ef6d3add8cd63df79d393f7d5315a394184f9427b138495571d52043a5105986c97d657dad684b280b044f168e3aa4261473977b8a7aff92e7fb4e35dba10d68eabe53115e59213bb70eb111c45a10df47bce92acc97a26f6bdafe66bd1fec07dcd058f57a77c6e791e427a1cc6ea67eacaafcfb4104ff9b65f8735b9c6590a8e74a256a9476105f2036457a4f7ce2c45627829528a88239c6676f449e420e91ba50d34097135c0293b5b6caa0f9034b081e77066922c6e260b1574767880333df595e68ef121390211eb4ad3003d2dd49ee1c8f718a0e66bc7366f52b2e06e7caf4428136d93098b4998055f5dd63ec1c1023a638355790835aebb667c5755d91e7e35592cca37c6bbda21506be1fe272d68b8ec8afef05f96615c53f40fe7689e5ac2730292d48b7822995af701b88a06323bcea0c902018e6f464205d888d5260ea75dd8a95849d0e7afd9b58c9c0bc207914e72562bb36f66008ccf3f371043b9fe6b383811af0c187ce4eb79e37fcb532deb650668c6687b2aa89eae0e845142ce5c317446e742586079698707b1683ef95db1ceab4ce252ba212871651d4518d0fb995c9521521d03e7e0039432100b18040c415e2f851ebd63a646c11c5ab75fce4fd6ef238c62a1fad2e35862eada9a9554d1110ce74ace81c47ae7c93ff4720b1665e2d9c5e5ac397ee3993055331145b1d6307ac585e69c1bb69369252df41b8da2c950d566162abecf8f464ba26d4c31484b523fa5f6ebae2c759f923047557bad2b0d1c86fdc3307991d80a98bce948a62cdd88408d97796ce90246c1a30cbe6517774c5a2f6aedec46aba36d1b1f5a99da69a956bad14f479f946a819e0539663cf49151bcb818a4e3ffccfb65a9cc8871924548eea91243d15ec55c333224c33cebd5e896017a2b0018bde91d8fac19a30ed18baa525931d692c5f0a8f0295d2842629f616374c749e18cbe09b4973dec11506a7a0ec810f8a763f89509080d98908d14a1386fe13f334435ad12346d17cbeea3f3482d8ee5c6c55bfb96dd1409284a0fa9f3354e2252c29f64b981aa500fae912b8e4540683ba960bd88423ecd930e46f08b70b29c1612e78f33e6b94b31a0999eca8690e3823e802010ea8efafe28585da0295e54fc8d25e955ed69cc988fd04b805aec8078e22b45131798f63220e21514b8a4dd51e0f989fdeaadda462f3db54cf727fef35ad56254c1c0047038307b5cbda71d98c6baeb79f00dce0c121f1a8137366468c511cd6e561b4bfc7c2a1624e36c9ebfb7f9465855e1f8386de716afe33338397672f2fc0311a258d7278839d40090af41ba287fc9a5fa52d5091d57f1f39f8d6c69a6f4af68cb4fe2a5a2c312e75e543f25457d6aedc393bbf0facaf927465740a34e1fc58c8f3c1036461a7c510f0cbeb13ca1ab60a2288e372c444da87fc0976959d78b4ec7e6e6baa42a618a099800387f1844f05d895392f614f3b294ba7e8e618288a7a5047edbfc2c75debd9666e63c9f4478895cb5445ee0fb3a8c9ad1ca33a004cd2207ba5867b6103c4848fd55e25410d55632036960cfc12adf7a3ba0064369b668805fb03bdd3dba9ca3e29184c1e5d7a5e3e74d014e9e4177faa803fdf3879b8052e1f248e8e892457d87d2ab41bffadc655a89acf15f856fe068bbdbef1fc2b9d85a3d096510ce82ea0214497321f6be8c760c437a49ce5a25cc03613ae070e65cbdab3e04ab940ea3c67c65db8529224593dba91fbdca512cf0a8c51e6152745aed9ee6f1ca5ce1da267b310a1b7ad7f4dc25a25488c0e1557e16a6df1f62df260c6d66ee7f150ee7193273566106bc4c8f0b76c0de917237ab040497bd41c73f7ea48aa3581e8bbf46ecce1dacba18d0e44da3052cbda5da0e50f8dd69f9e62d152b62f9985ac3594d27f997dd9db74b97b17388a850f3f834ec7963a83ac3c82dc26b15d04979310a3770526a730daee5ae0b827e6e6da3a21092ef058e1269dddf46ab9424ceeab434e511708c9a88866c57b6d7cf501c2305c9304a8a2cd142e6b454b0b71635d42008ddf24f231b9fbcb3715411fa206d21842625ca6b697fb38c30f3cc5b2da564c743c37afd259015870206a815f0d21c8874399564e35f18d1f5a30bc506664b35878a8b29509e65295bfaff43b0980448758b055f9c736fc4558f45c6b9ba63800f7a1dd00705212e0a11bb85017768cfbd3babe49c14a49be02b25b8253a623864965fd2e776f9eef84599e81773967dd93412bb1c733054e257c7f4acfab2ff8f0f4907ce1edaecbe67ff23c9335310b2ce2a8cadafc1fafa3f6293953f91770048ba952656d69178252ff291578f0b1a868689e51ffc2c9567dc066f434bd887c98e80fd57a829aa1466cd62133cc7dd0384d11fca45b6559f088e83398a856455ea585fbf5f4600c6f3d59da83bdc2a1ca1a7f88c07ef0681db7d5a35315d2a04b3453b800a8742446f91d9593e6492384ac0b670e67703160c7336a60fcb62ee3aed25de59dc6ac121e3a8f22ec2ac1f3fed893a9e376b0f35d0570f6187d6c2e8f1ffe94826407624fb27f17634ec9cd2efa31184759d22cac2ff52af122c57cde0c0432e940c057864196f810a8c8639dc220b662ca054a2c8e82072d32da6e291a70c3f20da52907c55c32cf3e943de066092c796f851f2cba98a28df171f794a79b18b7213746945e5ae3b624d150e93ab265452953dfb795692a6df74b09acad94a150828266208083fd69a5c2b9d4544117aaa64986a072da7c4dc7364cdd4baa42bebc23a68259ade9a42c0004ab6a45feffe11f200e89baf701b22da5dd5fa1419f99cec8ffec7f641b94ce4e7f3ecd1fe4f65e68761c18c002db54dad8dec5a36e821dd103b2021acf5a557ccc3e50a85435855d6958563842cfa6bc4f672ee3e53901af250a128e08f41451991449f8f01f378757c6127f7cdf1a4e2fd5e76092f5ddf4cd5214371a49a020b2f2da8be90337624a342ea9186a0b8b1bc74a2159371a2062c25ffdcce086a641b518857c07d49ab888ac41ffbfcf3cd5249a3466843e2717a870e96e7830fa28b2233b81c762afc86f68240dcb524e1af7c66f2b7da59145bbb6d6df96b2e1d6dd1631ea4b147a8ce38dc4a9c099be9c0fb2785a0a8a4fcb7646dc6fdd04c7cc6175524c8ec89117c7e590a8178b1028840a54e326808a4a9e0de4b45ceb27a05fe0571e4fdead9541e4c62d0dd4cc0535438453c1a085b5dba2e8d982c165c880040e67d1fa0eddd1bc28591febe38cd7c3dbb92b60db9175fcc917e85cf3361c6093966c194bdaf6361c7bf29cbb185a77a278180ae1fdec4097d247b2badc243395bc2b43c651a538df3dd54dd02088762f7a516d746bc1efda6dbbd04b756eef79f86703730bea9d047f269f728cbaf221c564443606cfae3a88488752d59e6e018e575226007cc623283282536042e1cc65a7d18c1ee4ae92655e7f6e7059d7461b6741a908490ba89f650b8af3fe746a81fcb7b23aa5cfea01919b5988331286d5c080ed4804594f55e6f7a7b316c8bb90a6301ffb90c0a1d68e542494e47a52a1e5443302a4dc013a340f60784e6ff63f6fe648dbe87d4033fc804cf000f4d4b6892134142512efd2913c9dfdfe01a72b36a2eaf52ae74137cf32e66f5423fefdf78d414052f52a55780cb61255fa94d2d40c02d4f63e83bda1641359745aa2d487680ec330783660292ca3a5e7fde2d9ea4a9621758bd4e6c0c57aba803dcd3c339e13ac19cc88d7a039d3d926405326130c4f8a9333296396f98f571f0211395f06e0679f8969a72b732a03e141e0ad148b1eac7d3f86ffd76d6b5d2d3ecc2c68e47e2267f7b7760b9df1c0abe568e1250330cf1b64946785db0b6896f68cfade6d0e55ea3226202c3ae0e175e68e110042108067a0054b3bbfe237a65803acf6f9543598d3db5369ed81e934fe589be3bba057bcf146c1313cd3144c438df1b993dc60790c7aba81f9de958796849377b5e253169b6fe328e7eb656691841c8eaeeeaf65e9a541b66487f27b37bcadadee92cf292c881015d21f4804bdd3c91caeac4f7e4d0ec85be8a03f9e47ad01ef094a0ff205fe2462a31571bd8a605af8e328bede0ba43579562bcea0919a36a8981d78a99c25a602583e9afcf663ef10cc20460ce9bbb5e4c78ae54be973766d24378c8a2215c91c3c18432c120f9ae20044d8f3d79dd6f63d532481e7c2e6e147e7de2f94a251df07c2f8cba69fed2fe30a449e57af667c252972e133c277d34e37214180aef27d681d783511c6e80e3c7c53809b88cdfc5c9be3f9910b66027f8753a67876d375bf66cb105ce781931be8c1056d08f64ba5aa824f0e68cb17f66b0497a187bcbbae920fc685d800178bcdcabd05a981e24648f5c68cb7ee12aa555bd32cd3452329d62cde7081b19c3ef73c64ee940f8091eab07da27f3034137699374b310533837e55181a329f55cc7ce1287c4d1ce7fbc5e2d6b52385af67741bfe3a7883aaea358496b4c22dc393e71194b5d87d887240a3f6b1e02a101d1238d8d248e56267b994e6424919a14fcf6bfc85fcdb7f40ff13f432b90e2c885ac9c00e969d0752bf79e1f1e852b3aa2a43b774e42c33feca876fb332183f2791cc72c31f69a5ebc057d8171849935a008d4027fb2fbde93d28a40b007c0337d240c5e125633a6944c67d5f35b232d3306a1a12b45e1a9810b5b4480edab8f2d72d077fae4d20418196230f929b5da32510a40b5a7a2edf140cec9a1feb4d04cff737843e85478059a236a9ad1261ce92f6f7d79f0a98339666ebd1a3c3ec98d271be0d264e01535a099ee24e27929696aca23c0072267ae282a16840ec8861600da5272f8199b833469c976504bf445e20d9cad077aabd1920f58d0b28f058f11064adc66639f16683a9edec2b089e731f5a220c2a2e06a67ca296aff90595f7f5fdfedb0eb88f664fd0040d304f5644fb190bbe339f8861c3d1fc577eb911f5c96e44f7e2dca0acbaa471b9ab7069c80bcf1a002f55e20105048b6b79784c3e5c93c382011a429181cf6a0dd89b35ba9f1ba0fedc90fb40c14cebe94d42caafe696ada0448ec86423941d6f3844fa417c3e7b87077570b8b9301fe21656d80820880f56b08828fb8fb0eb548849393b18de7917e24eee2e7980b8664f1642a075f23591272ad13bc332f8227f90c0789343862989ea40a32507d95ab835c64c76a007d3209bae913adb63348abfa1d9fdb911f5fb8d7dffc6b11f749f0998a3003e0dd8882e800735f1040502c3b5393c0c5f5ccfc301293b57530ef1a4ee15fda1289523b3fdf7ea47befc40bbd6e14a5827eb2ec83e3a8c443ce5fd220f400b83c3800b17f4b310df0a50c77d4cae973cfed7e30f174a4f8d5a59a8fcc3de2f43a9f53cfa12274d7c807dea6067e2d3a1c4d0193386052165e8d0167a5bfb14607a20721997fc7689f72481f0d51e411fcd6c1048962e2c550c4709c3d1c270f4301835c57ccfc7cbd501b7c1b74aef6bc04f671f977531f4cf4e0369dc1a98052e1a1fda2468475b00347e20417059afa3fd8c77c71c3550cdce2bf2e76ca405dabebd4278db35a948e0eb8d4bd3faac735fac1025c13a0c21366940fd1868a7b635cad435fa10ddd06c81c02ae323e45bac50e6ee479089cc6989c2e26d451dc9939e6ac5ca9d67d0d42ff307bc8515f6e3baead8fedca14e7a2906086109fb80798c85a1c720fdd68012d9a7ea4b472eb65138355859db503145dcab7bf77c1c0bd11122ec39c2687aab506e2f567319faed057a1bd33f9f29c7fd4e0c4042702daa4e6a78bcaa7a6b244800ba9c3381ffdc8962dcb02fdd36f9d57c2859db012680b22668d80cb1b97dcf1950df2b08af923d9a76580a5becafbf487739ea8f0c3d9d99e926a681d6f7e549a73c42fce9dca8ddb1d963c01ab78d8c5f480208e083500448d20b18acd1e3f92854e34247a10e4cebfadfb17b765d0fb3ef9c69abfb15bffb436bec6810ce3f3519085dc714e20565ce838149280506014f08131e8c4c2ca4dc4d9a10a3a1aee184c6c6c8b29ac4ce174fad16afbf7bd6919b539c6117b41c38dc9aa9e3be322e334f94f477317736365b2e85888d8bffd2967c278cc94d50648b7fe2a76f3e82a75ac46fc341f43c2a36428ee86f9ccd2510a127dcc7049adb89801bedc8a81817f9f7eac10217213c84335b6f0b0b043c7979b8c2037e3b2e97493133747080dbe72ecb298e190480230224008efd875bc6d299db2cfd63c6ea76f4ca18fb88432074535ba8df92661e4dcc85ebba31dca195fdbedf33aa10c2f82834c164650037304892c590203ee9aab4640c2d98478011fc57bb6bc31f4d4237ff3dd3130bfb011eae3b0b4568e7ac3d8bdde904ba5e556decdfa6cf73746a6d46f2c81872d48f75055afc8529e29908097e2446903596292455a963309f190a6b02719beefd9f1d1b7b2a4098ca23700a3b43ffc7946f04f0f4f009e65b68a6e6a53ad0091497d3711554df27a906dfb0253cc916cdd961c03d773968f3f7cadeb6b07f6cd7d443e46f40dc5a2d4b684ecdadf3343107e495f2fb5ada84a1859cced1194b899526a42861682193a55d93cffc1ae935eaf1a47fa6fab19e8e9969339caa70f72dfc0d19073884e40e20cdba230c96fed2bcf150be0b55f588ea71b52ba167d1694eab2fd0ef89d79a56aedaad517ad81f3a7c6227bf216f43ca92433ff0b98ecdb1c6494d175c1e617c7a3df73a73bf789587918ccd128a5c725257db9bacd53297eb52e0b9a7b9b150302b6a3001bddbef955eadf741efc6fba157e3fdd0abe1f779fa0038844aa722047b58b6f75781df77a956aaf6db4dc40942b467ec34498132d585f2105d0e41992bfe2ece81c6ed8393779b1c7e4b206cce10b9e502d153603fce52fa3343df459e10422c3f08bec06e4ae5b85789c7ef264f0247c9f003ef23149f92cc948a2ab0455d21a3e86063bf3c39d642d07b516fbe17f7047442e6fc05e9441d0a48c3b289252cb0654c89acec47d2f027cd6e3e5b3f9e10d12fba18d7c8a6c329100e9b37a3b87606f2d42cffc3071df52fc0e7ad83ae1e4f96acee49596a7ea804449b04514c67cbf37805d248c3b7abb2cb65ee418f3e36ec061d6d23e697e8702e6c90ce8cd620f0a78e797f44b107a1620146af79eb140a6d1f4dee51125120523dea238d38a878f292dc10e8e8566aa1cb6ae2a378fb219dec4ba18a4b552e88d0500b98d1a08bea6a6ebec953932479ce5ec8abf79581341bb36d60ec0b67e46c2365aa77c3d20ad0a4573595ad71e9cc1b1276809abc26fda3dd22a841587411aca334f723c1ea110f40b908365e513f80400bde66b8e8ee9442e98ef4a67dae24b36e808317b3d3137109d50800544b2629e500f09b66c5d42282f0001997308af9e2d9447fe1b02226e4b792c977c1f7eb67c00663b82c4e8207277730e8496f12fc171abc1f103ce6301868c68b88a2a739a43b5fd5367063330fe496d3b63e9f25e2e2362f6574b32c2482fe1c908beac74df3bb3888fef1e12060c08f937aaa7c8648ea49fdd80c8832be68542b611d707fb23fd561ac36054e3ce4670653de443f15f99028963f3f00864761d5c1da8545753bd15f32e7dd96606f420e6151c0f264f2c466eafc89e2fff63bc57ffaff53ac4ff59f18fea4e9d958fe79e3eba2cfecc7dc97d748901d27afccc55a1aae8707010edc66ca1eac37937ee47ca6d5c21ad3b6c19bb51ee2d5f9506a6bf37f1be1c6d129a19045512cc43e0c724d9ab26e692cc60bbd81e50d4f7bd97db53b652062629d480ed7d431baed685c47d8cab36efa55f93ab60c4f9061f2c4d4bf0c7c38b71605c201a4700dbd252b17e7590edb2778095d1440cf880a2a84af09849474b4e165ff14bf6d01e08915d84416395c37a82eaf17590dd7007586cfba6fd0f099e114969d43b40b3076dc9c30a4e1758b3c1001805a289115b73d6e6543ec532cffb87ba3c46d749ddb43524dab2b779f0ec7d5cd57cbca9ff97a7866694150d2ee33a518cb5fd972bc82e060c3e9ab84186669f3f095446d18c43c3bae48d86090c4e77a2ffab661d89c39d90f371b7ee03ee567ddbc33d35ccbb01f8ed04f59eac31c4865fbd34a44e43ba571df5bba2b329b4a1fdbedb14eb14c89ed965e638cc0e7ed2605de87fae7bb51aa80252ad2afdf7ed507b5776154b87cb06962a2bc87e9f98a8a38ff796dbc8ac0957cdad4803ba00595ab4983ca16d37579baf80ab52d42bd5f7d55b0a8172f75bdd47aa90411fd09356dbd4881cbfd8f13ed01ad4baad3c04d28f8e7429059143ff80c6b1ce5bdac2b416ee5ec32a196a7be0aea0f998b5d354d2bdc725435495f7c717d713113c9f74db012916d2094515988a96acc9ae793fe632fb52ed47446020adc1e750987e14755acc96a5cfcfba88dcafc9333b50281880d44db115592deae6c7e228e64d37fde134834431f26b501e933bf81545fde5b423a238c5a97d5c7d35901e84627ad60ebda6b3bac74380419877ad55c83cdc3aa641a1dd84253ffaba1cd70535f0090aaee89a4a8e93c68537ec1582e9128d1410a89824f877e509f44696a14db7bdca2330f8058e86da997a58463490b34da8be0955fa1ed3d0c69d109270ae224977d63794877c73035b78fe3a8c0835df99ba74d580793c53561284315b130d89f0a16dc675d42acf3c3e5231d56e99ed38e0b4dec364a9b343c992d07f3b0c79ec13fa190117c3a9e347a73ae0d114545b0629b4f3fde837f5848df4fc6d638dc2fb25794277d41b5a4a87b91c8d21bd5b266f1d3d4c5a12fc593c32c3c21abd053e2d966e6afa123d39d2465f2d11ea9b71a35f8d268864dfbd45080f91d860ceadd4c39cf9158ba0da3b317bcd58d1a0fc53d705d8911c21e3bcaf2a3288feb5caaf840682ca32727fb7d3e7bd045990c059827ae7f4294d6ae657dbc4bd79cebb61606eedd3e340ac776357ea67dcaa6b106b85fc92f24a474a7f72d3f766702b90cf04b1aa031dfbbf54c5b831522fbb8c81ce64d727c21324ac412f09b29be8241d64ed3da809a7cee0159033d41491eb0a3d66e39b73360c1c919fccfb0f8ae54833d6d21dabfd264b466098a0e3fb3d2d6fab22ae409bb51de7e9c0e9e114b546ffd54411db4bed18a4ffe0d54112c28de90efad2c41bc194bceeea560e19e62b372404630c77067d76b0dff599cc376d3aae287be07948bf0338b8e74f9c879bd29a9699335cb7f3a8829dce2a9f758aadadebc7d1a3b17cc9e4f4b129045fe9b1a6d34bab1c8a2e3815728fb8040c81987017c2c1f4a0520808158be6738ea612f6cd8ebbcbc3199a3b270a435b7cf3060b805b2fcd4fd020c6ab580604c490aa80965677c68a70ef8931203a2a4867b37e5b5441ce34e2dc4d9662aa9903dadb5beaa515e338b42b90bb9ab03241535116959c5081d25cc7ae08a4e7a8ae877dac1c1df430f3a3a1d8c9768d3f4ff93b12a42cbc3bba26fa327e68a42c8412f5d99701cad2259ccf17514682afe13659c946f1a1cbd1ec701baaa06e01cb32b57edfe98ff9af4f3fd517e9c18a3ad90f10fe41817fc02a6725f34584fd58307008c56fa86e784429be736f00bc5e2adf3af2355ab884d67402cff9b34d485b0d81cce5abf9453b51284150cfab3e395be6fbcb2820128b74b1a5cfb2ea4beffefce6888622ae8b74d288cfa72a09236e7e5d0e8558f4547cdd90cd3b537ef66d4261dea7fbd0bf93581a36715861a20388bf678609e661aa7f277f396f291aebc30abd8fdb7c37722b892b16fc61b50e6b0bf60167ebc550ed3788027d05e4f97bfae606fc962a97096e6b20ac9327a2efb60ec0ee417d84ba765f703f500652b7dd1c9e4fa1301c70ba980559a0df6fc2b3b79c5594c62a938c541c9d8a8c5f221c1c1465971cb36c9674189b970868f539b12323897a8ea2a2bc1a9fa8f330d0ac743aba2e5603217ad823b54d55b7475aa58516f7cd03532f9ea698fe79bec4ebe9356c0e8ada8c4259288441297684e66327333e1046632b3c55aad4c95cad3bbabd48459b3d19c97681148e3686227163111110562111331888518084d90b64149275fb06c58360c0b160b8b19134114119a1d1c4808022086a22048efd10040daa6e30651a41b981ab1348332ec3886b6bc802c43fa195d1ff10437ddc7af22a8051793f94612d891ed478140f000b61012fae3e7340130fa6a14af2a3aaf566740c669befa5ba0433e221749befa52c006d248dda1fc254c1d61c0c303696faceed82e3049e25dddf2215ad5dfbcf8224ec6c402724260028968c9fb11863e03cdfeb53f49121c16001eb7979cd2e95953368d4d65e7e68724010b4c47c08270e72d6c1695fdbb5f1293816698e5d8acce6bc44eb371057f3952dc31c3a2daa0822d895b4407c21bb17da00898186add29c0ecde97665ae63269a6e9cb30eff7bd330433d6e07af741b6c268dc230b8244e9c9820ff0cc579cafd5ac7018afccfea039f505d8ab34a287afbfce0b5935bd3ade944f5d80db820e605cfe779a031693c01321f23aebf341370c63d355de63805bc3f28d9304c9fa9fd70109cb33db82e854b5467c499731f082eae1bd69677505871789f541e9c31a41f9df5642e9fc8d68151a4e50525d6ae90ebe6ad0092c00f9c62f32e5d856e92719f5e4bff7fb0bb14b350f775718c71d3122f049d67fcad512fdd6efe06af1fd531d7864e6e9df91fa5fb1a0ebd77316fb9665d7ba11d25533c8e5a740473111882a28e058f10d35d49690b88c8ec7746345fe341bd7977a3cb71f4b4aac484dbca8322e89750b384821f21566fbff87925ac0617f3bffab91c5b792be2dd54fd8afc4a6d6dbad06718b8dcbf330cc9d43edfc186a8e724128674247830fa718e1ba60dd123e9f882e0ccae87167df1d75655bbb00658312543498ac8b9f7db0398be227ff24fc08ce4e3d7833b568b3fa0ab74bbef57fe1be952e757872844bb10e2db01b1f10adde8e662d092f70c3a99422dff2b9ff20f2edd06ac491f6fe362084b0c972376bfd1667b80b1a8eec25d9861b9bb2f093468edc2cc28cc049ffef0904c5e61e0932a6a77f7270e0045b68ef26bbbc8218a876a07f7759563c2df51a714ae8434e3c5d4c47ffcc1394a22364766dee7acd6880a91e48460d2fa224c6e5c1991fd55231e0f319d1bbefec24fe6b65b9fda1f69c9ffb7204cf9b05147a0db83c1b92791f06735df539a21e0a4160690305680d32f59d798e4b6209f3c8cc4bb93b01b373e1501614cb1cc8a47ddb23d3794f0252c7a5ef84e48d3614c9caaa274567b1bdd177e8b2867835bdb00ff78ba9551092665d9be08c06a6aba4e0b19fd41e8acb6787e52ac47849750a8e74d1148685a65e2eba9677c039d55b6dc313a6297552da2c9ee2ecf94ed58b0959531bc4886d491cdb578d40b6b387b470542852ee88450f28386ce4a4d816865910e880eaad3ed34dda30bbda6ec535e26ce115ae5229d12b77a9c085a20533827d486bb8204ca9a28a9e7b437c2bf44ac74d6f1e0682e2b89d2725691cdc573bc8a9244ab89066f617bbb1e0ae7b27dedc5c711fcb6ea0475ced51ad403451e0f1a91cfe90aa5953404ba9a67b0ec455896778721d2d52275787dde557ebbb9bc1db69e938c00e42bc8d22ed72c77097e94c5a2eaf5a63b5681a5916b250c05757f50b3ad60a248306ecaaae0c99b4513e0d58127afe0e1dd0c807086be19d010ad39d92f595e9048052ba2e11314d9aaa58911e29dcf1eb452560cac7aee079c831fcfc296d5fb3ea41a1b34ca9e1717d61cf2b81c01058a6d86b2adee205eb998fe0f6c4149859b0f0004e56f4efa517cf9972cf531083f3353d66b8df1b8277da686d68af69c97ab2891568a05d236dc616f08e9c26cbc0d88feb51861536b4d28a6193b7ae86340228bd5b9366a9c62567f3a87a534107de96825521f1bbf6d3377ff1e622106c90801878b05f432b638e46458429076af5e368c21162849a122fc8173b7b5981a8b9f394c9644fb64925a05aca3b34efc7cd48dc7f8f58436aa95b290022857bacd9229004d835474f7917ef3416464495c3378dee350dea9a5a95fb9c4685aef3d0cfc05190580cfb4e4bb9262680ad5aa4ea7be2ee64e769686a145d92c835bd45fd75c60dbb06f40fc2cd82c904614b3728ec2531565baac0035e0d4f0d40ab99b517c8256503042559609494969f6ca671504c1226ff7c1460906df432bc2fdadb9a2f5e7ca0dbc37abb0f8565b62966733e2365da69c44ab86984dd106526247f729520325520b9472e6b910c909172fb09ed3381d6a591fbc79386e29f3483a607254a8ba4e5ad6bd874e5df0359d930c8413fe2d51f04f9101c4fbab049f2c8f4d0c41f165b94e4647117eef8dd6b482aa2c78e9d858412df4b150b99e6bd42b41dce057b4b71e89b0b2dd45a33c77c649862e7482c6d793662bd594559025b080bea4481c1607e3109f9d3a42819c7c70ba5955053e5395b84fb36db4e5a28e55481a3a15d46a9a93bc1fdf84125ad98167f6aee01806cb6dbd7b0237ca07b4a5ebe6e5c3a49032abf1730dc07cc71bb45cc6a0a7a2117ff22130bfd8d9a41e3ec74af025b185527b5fd3cd642c7b132e727f5cd4355b48d4650aa6d5ab816f77d3c1dd9992690929d30b2c1ac599357984420729bc6655d8ee537496c6eef340f5d424ed160804b0dcd3d5c43e8f774c98d357cd38cf39fd9b069ff3b2c09217cf99596eeb521d5f196b3db4db655217f1c5b346630877e470b725709fbd02ca146995022202bd8982096404dec879f09a3526fd5aaeb74978e2a911bb21a9239452c441eff5e2a9a574ee4b6349b8321ad047f4b700e2d14b7a5dc27b561e4bd7dccdc5d6cbb315ee3da91e73362ee3a94532cfc145e0785f12c2671876e56857a1d1ebd2722b3650e9afab515d796972dab85d2e44c94cb511d3d16ce6160f905746785c9c4f4f9b9752398bd0d0ed8c2045dd3d0da2d0aa5b9742b48cd5ca559aef7a5f57a228a3e069045fa0cab2d9012d34f2e4b29428336bcaa80b2948f5b2a198e455abd97cb5593ed6b207c72c6b3e736d17a46676cccd28af896f4cb9f08a9a1bc5cef64004008afb86edba0150847836701effac89fa15302bf20862ef6c71cf1ae59a51f33eca48801e3e5f4e51ece63d89b8527d0dbc901bc8be4dc6ba0a94713eca48e05f5e674e8c5041b69e2c0bc390dfa30834d3a11105e4e4beee1388e7041e14004024ecbbd8e97fa34c34eea78502f4e837eccb0922206cc9bd3a11f136ca411634ed20f71927b4db70364ddbf1d435b98d755067947246a2b174b53c6329e6067a37f04911e93d0bca80e7033b72b18e00a8f7818f1f4f1bdc4ac65aae0959368400084623a2c81713e6977c9cc4c1f1efe4c29f09af00578413ddfe00c4341e4755f5649666c9f064eb0ed1f0830d77bc982b8e03de6b8578e12a49ec0c6052b62224dfa35d1b74753704768eec3c7a524444bd926457283dc96a78c01e9ef16069cb4e49d394c9dccbacdb0dd580e566ac926c373498a224fe056a9d1025e6def964361b6423554829ebc07d606b7a7994167ff0a6bce3d65e194addf2d23f11243fb856bb2467b00394aa8b243577c130603fa823d275b611b14f5f18b4c19c5aa826744bbffdc1765ffb040efab07a6dcab61a5e681dd35743cfa02f97ffe43e916d97c91b363b1bf08eb33c122d53a568aad54c12255febde886ba15b11f73aac4cdaf04d1bf9043fed1ef17f820e17511be5334858303193e380efcc1965f5f4ce7aa5d6eeea45815f4ee99e3f885ad748bae460ce22b30449b87d504155220cafd05c9ee32d9749317c07a644c648b140cef5a7610a745cb5abb6d5abad1d9a9f0857224f5a177929e1b805e989a317f65a202e3bbbe14ee6bbef651f8a51c1ee642d087ab2af7aaeb058d642d061624590a42e293735dad88f3b49d6f38f0d1e22c426047f6d4347912c0b407e92777e558e009e4d4899e511d6938186ac5fbc31d972d0b6218fc3ae154f704a6bf9d121336acd2ce7ef5b67ef4987f6730929fac68d12492bd0a47944537044e0d011e6d30ac38520ec1d63e564348f822da38c0c9aad4bd09b0d3b841818c837329daaaed51c450e181b20a6bbaf27ef0468882bcf922e553133b7932e6c2fe696db285ca87047a783d23a83748ea89b3478bf90f4cb14f714ff455189928a4580c4ae399b91490621b5c3599695dc63bf83ef36e9a51c07666a2dcb36b977cc445289c9b0268d31bd24592136114866d787ed1dc7b5315382800c746b926c4548604242e6ece3f3462c072d43bee2696e317d56e5c6747c961da00778e2840243fc0602759512721a50215e18cb067c22ab3b628a8c3b41e1276c2b1bea5255a17032013d2878ddbd9839c42c63878e38f2f31118f279806696165e05fdb3d5dd75425a2ee65e9d3073ea7251129dd934829d99b38c7413482c3e97692e4c56e5a47416b673e9d3798a7624ed2a78ad0fec1a24b8288ea1efe6b4043165fa439f0e238eee69677830d68cc4885e5b6c7520ad5232ddb0e9b185080df0e99736288c0069dc52428d2b619abec9d07e8cec7163209142764ace44a504bfb12f0243569006f04e175d5b1dab69a7502dc126acb195541910e63e72035444a15c29dcca17329d526e461e7122e5e1a0fe8adebd4bb574418ed0b3d064c30fb64e2c73e457cf4a926f33e8ddf16098daed2e7c54e30719a8ce757e8a5de05781d730f917bd13f8dfbc89f01ee4198909f88ad7af996a92880074f704a995bbda3a81f110c1a9f5aef61e1911a10191f36d8abeabae541b0fedc13f442cf2fc6da7a25b00b83c7aeb723690da24a219199e03d139227175f2c5defa7ec5fd765fc70b649428353346d1fb3ee9cd6e9dd8bf0ca836816f257cb85d5cb6cf7bb67bc63705a0f0f1562bfa6ef4b4ff68e2a092d80ddb4371ce1150ae2a5a6d86a0f53895b7640efc3b6cf5d89ab227275a261fbf2e6c6dab47a552d5b80d68e55806d55bf345e21b56da17a0c951028e633769c795a3ca61fe15014c9c893fe21f8daa88023eea1dbdf1323f80977c66e1ea1325788819f8b7e743744a6f76aedfa17809b55634a90fe3ad5931858a39ff8d8fd8a490b65698de48b405014339036b88b212721a93f23d5851f2f197203257e50a9aec1b550b0cb31d908b356a82c98c3c8c3f39fbb1245d3be48f8df28829d0521b966b0d73af6e244b697c1a46d1467ee554b0aea3eb1acd19f989dab650da56442109f4713e0d0c2c254c2b478a1e113e5dbefb3994e73457784836a5f84fc1f2bd58cbf2818ff847b623a0f53946cc52f048fa676df8941ca1b537d90f0082f30dd23c4d6a832b02a3ba27c22d91966afdcaebdf8089ed1608e1e79c2b2fed05714eeb8c8a3d87429a33674a30ef5ae7d894cb2f7aec5093348643467c14086fa6a8b05c0090a34f189c1af8212064ec46d263a7c5041d665dd4f8a063e9df14fc05460c8556cae7b0192795502a442e73316f28c08ef32656a06b23b9d73d094acc9f017f83dff40970a1a12821e10187b4b284f9002fffd894299962684464f359e6cd43345617396109f1e55b482154e5761d77b703a962a68cc4104230dd3007c800c96aae21dc5b25c08bae44f4aab9611d827e686f9bb1c98e46910ab0a9ad2663ab99394fa661ad0c0b492f979402eff4d2fb2a3d9a2d18a21f01208804c6045c9852c09564151609bb9fe6cbd3b48be47840801b070fa128e89f9cbd893134c82ee06688725f234b45ca27858da4b788a53b691504c79ca7170451a41c99297cfdabc0386712423cb04faea3789ac57034e5854f3e034043ce580d8c6ccc687030d004ebcc22f71451c6b0952a2b60ff7c7437fa45728d018045ec75de6c70cd475bf12f6754d5402954a8eca170ca4ae59417e547018683da0467de39246adb6b654bda6b7c003045892e19594041e2a5a462de3e22f68c92e6dbd3d8805e9e698f65efb1c7219af9e3f42e1af82271827a08174d21f09a0f2de0e6e3879b0b7dd99b4ff01a4ff02c81834ef92012e56d38d5c445b4c1d22d6459e3dcb575b50ccf6bbc97b92dd6c234b67c5b832f1b701cde099b4a0f78e001998d7c7b57ce06a8bff8e9c704d39c088f80ef45bdd4ff3c2127b645ca4e1662b1bf3991b0032dffe78d95d078067f282f3d71ba69b5aa265864390506163e15925955edde6e40a88cc613a472d6d3a61ba3cd2c6259864759a0a990d69b165f0ba199283ac30610f1ff223a8186ded4984bef68e967790aa8f65a2630e3e635acaacbd2b5cbd5f26efdaeb60b5073f09dfcb304a335dc427185172044dd1504b02289d35683ad9c8e7b0d52be289889eac1cfe53558786e7f65202976895ff23323600f2ad2a26c98cba94a05a5d681ee2adf62bc02b9b01defa908004b632290bff40aca34c04da2c8f9abd715351922a56bd71f5fc4b33401084f432f9a65e9ea6a3204daa9bf2fa26ca02d46f3c24fff1896e5b9cf9a536411f9dd7bb80160b85cd720e7cf3f48bea0c9b86b7025feec0a4247ef7a1dd3977afad286dfa134df5bc7206d25a7f6a09ba23f171743a7428ce4f2529c76c95a4f806e694b80b8029925074d5c215f5630c43678ef0cf70980800291bf43911d6bf01487ac9a333cd7b06f89e50eb16e39e4bb8a9a8d88666b915623c91d0674330921daa2395ec1b8c5e4fc760e7e753a40998c1773b293c58e77c9d469df0dab78ca2ffbc602728848f4f83c756e284d2f2c639d8ea367728e03659b538fa748fb5ac376df3772bb6ac555bfd7838bb3abe2d127b2bf288ee3aeeb25c2d6745dd3645912d95d6ac85bcac9ab64e3c742b60b42705ae1a4630c2313a441188a339cd6114262384651986b014c1a890805106c1ba33dea24c5c2fa8ad83aaead046a1959c2b25e289cb403e9c002208e54a17bdc3b62ab7fac3cfa127895a891228412f6fca41ece183f44408e3850ee201bb133a469097b974d290e186dfb4b3d803299f7b81e3251045168d54f25b33f4174754945e7c950fb7125c2a41a29120011fbb75b9926fa527e5352faed66f4039036b24e5027fd673512865213385986d3cf35b60118693b6681eb0c30e64c94321b638f443b40205e2991922b387896ec2f4140c1c0a50efcb00871f1d72bf6c0e2d4571ea1634a17e5d20ca23e13f8127443c497a611c6e3421dede2ba2f082fd277a01c0fdfd647b87c29d04fed8c2c58d8ce27c2d3594e97eaf55d346515b55ed51c208e7428b11d8197e6e11c91ec498d664f6f8f9a88a082203387c89ff493647c432be90930099b8763df735d37b66a1a4a94b4f02010e2bd4909e42a2e7c72997a204818c15dcd95853f7a17230c5c1936e7ff345c32967801e08aa49c6f41adc788c080993b726b3223abc5c0da22b17ab428526ad198d27eded4dc68e26edfcf7029ad129b9ed0b8500051e836e56503eacfdb3ad74d996b612af2fea870a26a21232c4b02d586293db9ce1039fe98c95a1719956531c402cff4a346adf54125a292645c3ba6e06f2f29f753995674d28cb672dee86a57681cc4b4747ac2e4dddd2244ca3c1053335ea378cd8fbe89314c29f4c9ec6814f2d8ad91ded37246310d8da4d650200416714e2604b7c2c094a5446909b6034e1a589b0845382b5105e749411a193739bdbaaf3072c84bc351723f7c4a3e9915156820d551ba3e388dda621e5b1d6888011e1d052e39468e76ff1175dc7d2cf232e8ef75d9f901911be545319da1d5461a2c8b7a75d93d0adde253649fd63b3753df2c71cba68d7fbc79ea947ecafa7d84c0fb18f5e62173dc43e7a887df412db68b800bae845ecb18e30fd0ebd545ff6067d64fea0112c1b98a32e443ed7747ba47112f303f8352264018890dee7f537df0f802ffa05e03d22b422f7e95a68171142c3e91db29188049916fabb20cd912ebe3a97a37abc8222b15e997c460dd5825def7c6d5bc3bef7fd56608eaccf81bad880e49886cc99fdd40d5893af79d09861c849979c3e88952a98f217a8b462c5e0a50c2a5342d51f76c8cbd8e85eb75e1fcccfa4dfb4c73bf13bd2c2adb211a6ab9130bdc107e22110afaefba93bcfbd2eb1c4a48e9490fd8d545fd445f76662218c9bcd8124e7c00c2390e46d68c12bd59450a0521740e963ec4e06506a07d3dcdb98a7e3c42db5b7e1b1e08d53b7f15295829f4ed6e41ae5cb098197fafac1fc6235c7ff085320da97b6e0549f0a9898ef285c36bebe6b5e9d959813fcf36091fac1a84da3e4b8fb795f6298c013e75bcb27a891edf8750a207d4b8fbf22a78b2e44f67071531db848cb8d7dafa472620e77d2d80e6e46d59ecf2270e624be5f6dca9f354bfadd224269a8082abd8a2d427f14045a5a4aa3e03356c452e51ce5215fa08e44d8fbc9e72d1121d1fad4793272c3be2a6dcd925503ba306b1bd5b93b2678e820faa82b09ef5a392b8c49e37c716fb6284d8f55c34d23ba5c11a590bc90c7884d3cbc9318c050f74f313ac6736521162139e8ab563dbafdc0aaaebcb590b4fa335d30f8ad10d3f2936a1ae25f60470e3d12044051331e8789c82cbf029b832b9b589dea4005e1cb6ee9806fd92bb12b7573377be74798d1824aaca80290c3d7e9f40ae608382f6100fa5faedb74c58c65e805adc6bc3e05c1cc415a304840901348d9e4912aac730b2d0621a8a9d99266d422224dd59841c83ad458a9dc191c58ad2404f92cdb875b6edb4e05f37b29bf690773e8510350c083f00570aa944888e042bdcfddcb3c7d00993616c47c20d6c131bc203bc1c31b85bea812a688e71282433f53c7435bf3a44ca27c8394dceda69f929a7289fbf50bd4297e7929908d1d1c53a4864a9f3ff6e1086d92cee7972978c5d386229446cd098adbb973ee8e5a810a87c0dbb4abe072c7ca643f1beee560a615a78642604b7125ddfac73bd234973c9e1645b2664245b5b51b505352ef042a118fa168965045a2a75480df5e5645054158f33a962fed9725d4586a8ae80f51f1d4948b6dadd377d414b9020a11a6f5195c878ba7596029a48e14a04c1a1929fd781e2ae60480b0d828bfafab83b264e758d35f3c0739d24e8b060d2c5a166dff078a2d47fffabcd137dde43f52ee311cae75ad32bc8be33cf1f12444a6c7f9c3ce1be886442e62088eaaa038c1abc6a3607744fced24c6cc2397014a5f1f9abeccefad4eb0a6a2d0301b41edd38a9c61c0947199be397e3ee20a1da2d42d1537a7ebf3434b849bfea93b4458efea5b750852ad7b066c89dea4df22d7d8d85620a0670461dad9af3b0eb0fd6784d418512a7dea92ecbc511c2b17f93081c25c74fd6561f002a13d35a03b551f367d8b97dc85d23eff2cc8d71137838db1e57ea5fba80caf4abfeedc89c5feac03af88d8d5be21396b5879433bb9a283d07d6be30104ece7c725dfd530f5c06298c19362a5ff17b371bfc875048ec96963803d583543a0a84b9728d9465edcc7aea687d62452e9f17c511657e7eff81034607d8a7b9f418de750bebc8a428fae53eaaef18dc5eda7a94eb12477401b3d904cfe81c1c77a6605cd11fd4a82c8945f4d9959cd8f1b6f578bb2a9cb1fd31cc7a292dc3efc4205e861478a73545fb150ff33ef9ab5ff4a12248e8cc7c0f51a1b9681f7f1d71ea6ce080c311644bf6095e90db48c7365b048412a72c79636c8140e6a2f9cc2261292639a3cb076e879f7effe9289c262d52facbaac89d07c611a4e7c8ae8b7e859721733766b2fd27aa9a953c62b4a7a42c856a8d03323a49de7d489e907e41a5a77614753266fe93d87146855072b0c6f49a38eff04f82680d4ba86ad6e441c810fc76aadbeca679e325ba2ca26460360811672740d8651c02734be3cadd33be94edffe1aa58cc8d5678f1c9350e7d45fe968014789b0c9802e2d464dfc68a21160930e36526dce50e4f831cab4292704094fed0f6e408b496e5a2b74febd0291e9edcea34abb9ae8807c08dc2b8b453cea2689e80be9137b299c6f3dcf44921360a37b3f43228833ed474f76210d92db5c60b6acbd2f0ac2a0d603ca8e0608c1520804c2044e45100825380a85000c92cf900215ba2a4b8ce5502d63dd9b472fb6ada24e7009899242403d287ae2e664b54e419f988a03590bcd722f913815163bb385bcd935bd5bc4a8d43035e22577204e964e523ee21ef43e756fa1177bc62c8d2147c550e0208c73677527ada928d6f989b60850e44667523e62fe502e7a34b8b0594146a191477414c58e01e42fab5334b7ca9d2eb89292c7ab60c8e05ac43cc14aa6ce0d5454fa132585422420e00b9810f4c22ad8010ac0eaa73deb5415ecd97d516da53fda5e2da9de732597690621a219931a1bf9d13f37248015fa4fb2e006779c74d7f6286b0db5f5ed1b9fef9c7028679a23a6737c8a17a73656f94e64efd1c9c7b9aed026de00c00932d1d77d89641ec196214334f0af2faccc115edefda1ba2e2dabeed1219b256727db3fbb8ddbdbfe315f18662dd23767a09f30bd757e1e2b49bacab415ae7b8334b860637856b4ad5a061825d715111cf0f208014c2f3cfaa6bb3b424e522fb19b49252c14329a5af3263bf005e701d984be09c1a9f57d2d6d6fb01fe57021b311b6055ef1917de52a54d76411495b745ce01180c780e2fd43cc9929870efdc89d5028438dbd6bc4e549102dbf3e7edd653abeb7fa9fd0930e2fb71be862891b56b04d659570fadc9087a367d2e11704b09b12ebfe34def8cce472939b52781a3847e7e20de231fbd22fd1a04087e6d5e09e762d25b3b9fbcb4caf68054a6f51685e084342300024f8d2f248c78f88322d8998c6fd87b6e8afa3386c78369b053d1aa29119048eea28d2c57ba1be1ee3aed180a2c162b30a7d624fd09a318cd8f9260582b5f47218efce7ee36e9aa0a9016edc3c59dc336e2571597a541d3b740504f5c5de676af8962d5bdc13e88ba1bf6e44d2e686164f99aa4c18fee6e44ec93ed20f832d7d7009d03330f59daa65ab09b0082eced8a00bb2577dd62110862788a691d84184dc1c53258a267eeb3e35a6c533683db290adab38286b0f267d1f3a55eed12fc330c86436499ff28261d129875c448d006646329071b34e39750209333318f8384ee0fa95cd33221462b41395f9d3747316fd61eca20c67f1e105f09226cde6e102ee196fe898ec588b180218dd96c228873578902fb85c62a889f70b49a343c9579b48bca0ad95f761b4081cd6fb7522261b04270c069b3c57c6e7aeda272c321dbbd660eaab149a1d568a7b16f4b2ef32fc465c6cca1d5613775e4c00523be141faa71da1e596b4e774ed9ec30c2976f05d307367daad0919c7e0093ed8da68a9a6b477d196e085a030a359ceef41dd577382e2e5f1f657b670a3c1770530141ccec19b75dc1c7e434735d985e3b20d7097cf709b9733b33c23cb6e18c7fdb51a29f0ba4af08c0eeb9f39b64435be2239d14c55b3a8f4ddc90e0161bb6d83850c53f702bbd9d732114b181b0bf1027aa4aec2238e3af9a93084b91fbe7a73c2abc3265f9beb042fe4f23289f846d6e08c1eb9a858b4968e6ce195d8cdbcae856dd37a5e1c1154d39f6c6810171983d4c02538a0a51a60addb72b78974923f1af562e88137ff128203146b246b6d24c9c149f848e8cc97403bf351af415815ad009ce0b410370ae4e686fa68db12e70b84a886e31be4c892bccedeb43b0b4606e87cb42b38b6a8b795475de2d0325b231a8b2d8b02c61704b802631c34e790487353f13181d6e2af1a4594c28b805ea249cdb758677e90a7e9fd943e21330d6082caf1070980f28999944874c8c5c1d28147f0c14996110ef1d35c56fc01870fd5c261fb458f14ef1e3781ad5eb805ae44ea1ba32b648c453dde43dc0f095908e18dc8eceaf6be0d4b73ad6ce7ef0fcbfca8f0ad90c6e23494f46f344752b93f6b631b385f4290f770aa1143ef8990aaf7930d5c29ac1ccfe8c261466b3d7a8e48270f05932ee8660634e554167f057aea2c7723393a27c2de526e6b692963b6f6a3269fcbc6f7c590dca72222f1ffe6e993c0e28ca7df077e1f1a35776de6a6918034a4f78f50d8d32a72e56d177ad4f75cf7aed604a6adc5769012c92bb6697d568925b61ef31ff17994475c6d00adf3d16754ffecdbcd9682f9382106448a8f991716867274f6dbb15c421c34ec06776a27200af80fc1c7d881373bc466bbee4e67c4953d118035151135ba6956a55d44ca4d4c2d53e505ae502ac2a601980d812860970a488c9bf9c626c70a7130ba4a3e95653f0ea011aebf17437a359d086020c6b5d3b2684778e2778f4c4d07337c9edb1a35b8169f8fd844fe6d7a58040301e1e617ea773b8f7c83787309f0fc648d9d67c640a424db7824764859e777b9568644465a9ad14456195c2591bf6f6a4297f7a405e02273bb5b1aef5c9dcb3506e6259326a5b3173861f2a4da34898bcc3ea3ce22c01bce7197e8c50f4f57a03cb14d9802f7f8e6e9332b37f048bc984d9d0d49ebcc3b77e7ad5060e242dea31728a8b78189cd310d970f169199773cfad7a78e476ac5a8c2473121e7f7616a5706b32ed2afa68e79801899c12207be101c863b9728e92999716261591071b521d2b8c32eb55e8915462a2c11bbfa98455b41ba87340292214a2699f604ac8ef288487035afe1b14381f3b59c568be6272432c73006dde94585fc45f70b83d0faaa3aec0a469c2869390915378dbe3aec99e7bd890186995732b05fe19fe595d8819c9a9a6ba1c31e7bfe3ea96a070ade660ab9c82a2c17cf8d07277500b67bcdb62e1604a2204525382ac22e82035a8fa141c7aa5f60038c713aa869e603172a67dab1ce6c4ebc80ed1a8033603ec312d34509df0c8f43ef463fcbf67ff993b4ec8bc53494898d167e4c413bec3b51a0fcdbc4d591af5427b97b194da5981b292979da40914ed51bf98bed3427a1045297769859eb7d9bcb7c5b8f4d71351de0b230ba571ed0e56846960731a706cd775af43800678f8e248d3d812d64d81ec342f7c3fc9d6d7643bcff87ae282c9a89d74091078e02d6ffcc0c9a676406413679b0baabfc093fb5f5358fc4628fbbe4f979161a8a12031f45df6a20470935931da42985d51bf124f512075fa800b1089925623cb81e315af7024456f74c184ca59375845b363635ae60f26ddc63a16c4de9de1309a7231f1879ef0107999cfcfbb5eb4e28c20d7e7a273386b91cf8fe611a92790130e12064e797b026bc652a0d3fb29b657ead7c24cdf06b4a8966d9703d2b65d5e29fc0aee56e8abac01f36fd058395ffca1ce7e596bac7fe4e0fe645f01ce9b94e2659b593cca6fb60fce17823ecc5fc4ac19663ed3dcba2db18e2643e5568c10dd8d810655509078d4470c6071e1f9a7fcc02e9da9692b544cb40b2d1212aa8fc72913920af9ce8ff015a7321a50baf113934970e7ab121c68b1922638cf96b7bce47ef762f639cec9e93d0e87be5583171692bbb30824387869fdba6eaa3b984ebb327beea9f4a85cb60039852263d30bf62c2b7ce9463a61717a395233a04a9ad3b6008ece1d8f4da49bc7def583c994d28abe4bb4ec52bb3fd5124f100bef2be4e1d4d8a56a9648c1da4921b5f656e3e2ecaf5bd0c04f24e1bc96d4e1a1971420645c69963cb9bf765cca74501b54a91ba63a419e0b8b17a9a431a6e653859fa2276e5857a42d4d63251a00cbedc87d9f121d8b351ee871655c6b680adbbad527ee9efc8b433185b6f6902e5f9c5fc122b54773c0f37e05686a1ec166e69b6fe63789457c0b3621e373a01c77a9dcd87f79d0e6c3a139b1888c3814d67c4e8a67abef0ee104e7d0930945394ba89029a96ce36b1d0a211aa6ed6c306f66576dec3f4e6e829292a9c63a5dd0a12291a13a9c7fbc73c730a1866fb815a1f4a0bf5757a498ee38b31e1f7a1b435900fe93a28ed8e3af9e931012f23c41e66e85c0af07354d8e2c7cba58f4c1993169e9e0150ec1e919b4ceba57302e7530e244fa6e1043aaee15d1c881334f7531e9b8385d08270514bbc032d562528a345cab6c1a690f4adf1d88be4ed6f029a5c25a35d79930dfa6b5ce087f85b7c7e516fb92157e2803b70e21b09550ab59850f093815bd2e7b63f0182dcda1ca79a1a84a91196a25f0f934b05a419638a95af94c1d159005e40a29e9160e11fd1ac197eebc8054b5f495233e05a7b015107c38144767d19dc3f84b8bc94654e593161705480d2cd4122c478c194fd5bb39ea6fc2e40ab05086ba5e4a77749c2c0a09e0eec996828404b58b44205230d2e0348b413641b02c8803ac157e0c9d29d165a373336c507e6d380680b630fb4e8d842be580b2b8835d41d1a52c557a1ea411ef3bc31791876a6f6e03d02470c61bf99adbf56a026e24fe4ca351e1d9255bcd85902c629bde5d9d3de28efbbe812f59942581d2136c9139c5279a7e18858efe548166bce041cc29aa99bd20e293697b9960f6d2447bbd635ae4fcc30e8accaad4388d4f57ee2866e3e31ec5142cc78018fd758805d1ad9acc8da5a2b1a076e00ea569b67e5d66e85cacd25987fb475c93d39bbae599e0c85bdabbd181b944912086ba9fa1f031a28681261918e614d87a91aca8f2ec53b7b76550a9e0f3a3517473fefa051d275f404959e38698666168b4a8aa85bf2ea0afdfd7e888ec6582240792fa6c8873b77e3ed3a007e4121fc6d716f3b8ca438e063e6107e0d3ddeb821984d6e5facd4ee9aa4d95ebe1eef325b738798639bcb4524506c57b657487f67703009de611c98c53a40f620f676b9b6ced6e408e96c3f3ab29bb1388635b880ff57b5085ca47cf86a7d41061a166235e6b8c0489752cd98c8083f2a18c9f326f286b3c1120eeeff44b1220c94ef4ad710a04c6c0be0607adca8f6a6d08888375ce68756e0c41e8624e418a303b3dc66e320bb13cabd4c80c8ce44b5246fc26f0da05be930270a880f5bfa7c00f163a6722ccec851bdb1d00e10d1b098a8179ccdfb53be02175f59a51f068e99bd0c3c70fe50258ea2249ed5a7bee0d31d021492967b69ef4fccac025d5a37e31a9329bfaac0f1ed6bbd40c6eeaafcc0b1a05a38e7419364f2c430e9a51f2bcb3086c1d7fab430222625aeb50786d43aca257e08360148520a21132ce8e052fbdb089e73d28e8e9b388216a71bc7805d07f076420ede4ecd96896fd0c5d65dd9afcbac5ee2159fc2650a059af86172fa72081e9bf1dd09f4f44e86405f2b944c4403e78e40fe5a1d5b94a952e9378399a755125d88c0b0ba8e8f25e9271a53e9e3bfb8710b0ac1ddca7a1908fd80994772ad52bf8c2aaec912eb6e8c09102dd2cc997225095f010aa72904ab983ce1fc032fa10b577c261ce8a4e1d9c61bdff8c3d2840ba89772be03e732f84c45a3e9ccb83a04c3d93e71c8956b877116b3553839ea091da5846f6d6ac6f05d592029d2e9e9c6b72dce33b332abcf89fd1b16f85971fe35bacd82ba4755c687b44744ee8b54e984cebb20df4547e3f4d655c5f6a8e15baf9d73af574452ff4afa0b40ed48676dd0605f15cd015770fd7e9293f9491d429f366c0e31c27251f1efb676a235a37ca84eea140dfc74c097161d1d2943bb8988f9f5e145b5a22a06ddbf7f18d3faea5afc6fe8adedb934220d00e32aa2bb1760476f88b95ab496724aecd28f74fc87088581692fce47a8926dbc57923922489e04476b1d0c37d9c81b47313090bc61a1254380026078494a5ff352a41bb5a7ff890dfeb55c3cfd2210e2549a106d6ca21424e4baf700485c2d294ba6e804d537bf52149d9e30582f416ffd0856e3e94059221d1009840ec4e631e90b037c46d921188796c4932964c7394a41805fa7bae4ef08f1cf460395b10957d5400cc05e70896b1adf6b13dfe28e73584c8f093c8ba31181f0499e98659813ece9477508336c828f436fb9f9f74349e470388b1da83e233fd67d68d7a45561e39332e93e640ea40ec3303c2b1d1384cdaed5dfed6201f5ab0485f69a5e5c3003119d298c89e25ff0d23f1f030a7b23aba5d851c406a4a71e7f28b91fe03bd8d0a6c6382baf96c8625c35956d9f1520f29d17e7894eacfa1d759cfcf0a019c84ded5acc428fef336e0752e0801524f7f9ff216a3e09f2f54888992d0878543bd2e567ffa26a5853b20dd5e1edcce1fbb97071f869a1db39e91077f7bb38c1a04403fcb9e0234ebea2eb7a12a7c13f7d91faad170b3b57b182ea18ffe54babaad1f23ae295843b9c10d3e0fa62226526b9100de494e845fbc7d86d493e4470582c5b8715554ecc885573abd29ed2c54f15ac6e3cb2a9ee8155cfb385d12c4040c7ca06a696becae6f5c760f6618ff7ef0616ce8b94a6e765a7b57dbf146f7a38cc45125d2db7041f298b429b62e0508e044508abb591fd10adb2bf8a39821161aeefad2645da8071cafaeeda4e5c26406beeb9f329d9ff1bc5e30f8b5d568fc50ab6fc0550fa8ae59c178197a57882bdebaf2a10a41c2b0c688feb9fcae32f08a8f1aad2d6fe6d7d3229280df78c2f45a3bef3a0537cf046ad9e2abbc8c8626de886361b93dd2fc0a6f833cc529077222d70fb20e1a520bbe194f76f98175552935aefd844762893a8dfac822c0f503e69f0a1db75d6d136de0cb3fba03948cd7c0ed152e7f525f821df1e643127a826099ce2573ba4b420625be3e1da6cbc531168c6f9271be07707a0f5213e44f2a419326414984a605a0a2e93a7e1871e044b850ae12b88bd41dc87cfcdf3c1a6cc0dd8727f96860a7d67649679f540417fadc06c100ec87ce0e84c8e2214313e62e505f2fc030fd57f19e8ab2ece16fa930f34b71dd570e556aae349c09290bc8801f42720a185f5c3cf6e808a8945558309d495cb48dd524f75f443324588df37063cea9e08c7aa12f9cdb8860cf99822c2a58932c2f73e81907497292eb895851b4403f8e0f77aa756f973c199fbdf62aca5f0a3c82ea91ebd8e195d22a8901e6d67901017e2e1ab342f3c4afe662f44e3a8cf834290ea090001cf9a5df6dd1caac2f54ab497579518e2a49d3703ecfc450a743915644b4f401e02031edf420682d648d980bad0b7958bb3847bad3487b379cb0af4d4fa3c71fc32027ed81ed7f56fc0285e7a682c4942229932c3fc8eb17937ae801365b4b721f2cf4dc2ef046cfa5eb989d959327f36038826ddbb7a5febffa1ad24dc02c18363bb0c264971a47eb1ff36ffb099c84ce5eb5e71e6043f9f24fc7c201ad522b0d53470969da258fd37be2dcd0e50065d6cd641681a215957514ed9de90e7301ead122c456772392fef341e302226020bf978c321237596450c2fc633f7ffbf6fa1a906202fcc31576ed93d21fcc1b838ca2abf4d2dfc8170cee83cb5846561294133b5a55ad0f51e3990a1a59c3a30355e1f0ad800d6cbcb6d1f206828ec68f823beef37c6c977fa7e90dc5f29e00714b7ae99358e11912747d2f2005a669d71dab694785f293a2672970093ad7e23ed4c7c59b500dfd73905acf1105aca3b42c10547e6f32d6cf83afc27519ab94e944d0979b8ea3cb763613fd58abac6c080d5df478ba96ffd8eeacbbe9cfeb76f12c5220d0484466faf19808240be44e570b056e9f02c5790e3a0de17f8046df2ebfa25f625b51ecd36a66d3cf15d5f08f5d1839fb40cdb93d5c319caebaef3a6894c0486de867e60daa96a68ce80bb10af342529b3096016db93dc3eb758bf08db6e03cccecb574a907f11282a289062d6e1ad37d3225abf07a6db2be1e22a43d190d94fa8ab01de4dc5eca6c93c268b4021500c7fc2759fdb20d32de2e6fcf7add5b8623498a953ba619ead6defa67283e33968453aa5923392f9a7aaf76521ab17825356354272136df1d375c33c4b84a5858ce6ca0b69a3d82a68bc58efc5baec7cdd8e48bd087cc1f8507cb09543a2bab40063c0bcb9160e0cf7cd99bc848cc7908c67b05fe03393fd4805d83a24bd1353854d16888aa9d30759312720659ab4df92b593b88c8cdef8a37ed2ee81eb99de44ef432fa743ac1ac17ace317a978b821e771de5a6ee37bac7b7991f9af080e20539ca3603a31b1b1ac9308e1ffe45e5c12f25c372929038a5ca92e5fa0988382d3daa66674d1415c0595c22fd928c722c88f493c76c906664ec4df5032bb93dd41574f7389568eeefd941c02b4a2e8337e1f0961b1516d0d95929835cb954e7d4b4ba5545ddb41b393ef00a0c72e2581bdc5a6751ce3dab3f51009f089a2f7ba15333347fde92c156aa0ed17cf2dd4b92f984943019a0bb66bfb629bc9bc7093210388325e3ffd79c70f2143d8e70ef417725089078a8a9b179301033295f0f04c2821e2e85c056febb70a99fd4ec362879a7b9607cec9fc6878b7fdaf26d8ffb3b932ec0b47558a9357716e7cd370f286fd9b17db787c786e6db4d25586bd881513843e85daed530fd0cf81dd0695fb5e6439750b8330429b8dfba9ec1a88f85dda526ffc8c966944d8611a581f1443c5a4cff5fd283770db3724ffe67de03773676eb34a33fded1b6a34019c1175212f5e34316e3141865667e8a618f388e78e126e1cd23bb9a4d6437b53d709c7746682799a2ca3fdc74ea9869e1ee8a102005b6b06ddb47aa9936b81891a3a08493285c2f9cd2ee59ee0a277a27618a4020b2ad0353f57aca809dd4ed6a18f79e4d76de818423faa569dc4346333d625899244c103a8d0202197e21bd9f9751b74bed953a3a31d02b73216874b8d252be4508656156385f4d78f29c72ca2833062d8645217265d0a412789680247a1efbc9501598df152c823302439ed6e35bf486e7b5e979e6f8fbbe63762c76bf72c1d16c61c33614f467f7714212c4ab4524b8197b6772d644e4911c999f38b36406f27e67975da4ebf6f7746d6839f9ed3bae20a1aabbb664e272b14a58d2a2c8132a0105d4adc25b37734517da65888adaac071e7dc7b8ec61dfcd8824055488160774cca1e924ebaefa18ec6e664529696f8c61e3915d6f9e6c7843a2887a43135f606ad7c914c7073a93254e02014a0758bc8874a8d470d7ab5578230662ccbd58788f1cc31331cd09b1878f22d078aad2b8d9e4bf26afdfcc17929043290fdea6c23777d1f1b68e8c5ea8baa68e76bc498a36ee68013a9d22aa444bf318109ef1d14bed62b4feb3cc00da4d370e4ad8049311760d064b82b9c015bcaf2a42119148961f04c9284afab85e7a24239ee6eca348d349846a9970a38559018ace7d2a053cd7b00dbc234f3c0e2ed74a8c9319e96a5d91d7be448a18eb9808b1c461ab181ad9826faf2127cfcd267ab288141bc5a282b28244d26da7dd7be3611b0e69aa696ecddf935ca8f8642e5c3a0230e050c87f78459d940b5f43aaf9d4c84e51f2292c8cb7c0686a5f0181e87cc257ff49d0fba59ac66e2de3026f70704915863209e49a4e701fb0990c0fc554d4c35aca6c4fd5cb8a1459227aa681abf9ea80babb81da2ed8fed73421b45cbf97d8e6c0d4c832144b2fa70bb4338bd46ce00d6ece8f4a1f639e493cc9b84436a0871e426f37ac40e8cc5931a93bdda899aff0272d019ac15b31c96d2b75c3fa55d346cab27dabbb6656be989682d5d94fcaa8bef6afc39e6614986d5f221f37477922d0d88aab2ab56b5d4da760aff52c7ed3e7ffa7dbcf18a18c88863ffd3b127f6c4fe69b68e8e8ab2c8abf35403cc9903a95e0c205574f847e24accaac020b4a0d786dfa969f488f18408ead377f32467111193fb82ed2138a6b44eb2899ee07009b73f7c4e63fb356cab10ddf9e02ab772e6f9ee17ca968d331441a19dcfc2b2b5c5f8b5e253cd3161e1aae37034e027bdb3b11a6e9faf03e8032d3c53b0721e14f7b6ae60a08205320cf0dcc454e0ea6232640a80a3ad2ea316f375c36c76f1b920e83e831e4d2c0ac88acda6c3123b67c7706d277599508406d3f70a8e744a1e06d6c4465e198db0ad2076f47b975e348599fd1ed4481daa080da1e76e2b6aca056ffe9b79798404c4a43226447d13ee3f9252b50eb4f8833c2d578eeb586147421cad6bd908bc7d7cc54ddf0ec4f494505021d011e772159ab273b90e8839527304510cfef54079d0c1a5c0346b4fc7a42b66d1799f2b9c0661cc928a4c96cf5a1ea991d073a62adafc80a0c61434da2a4400ab884678071a27a99229f4d321aedf74d238f3a890238fac5a79a5a288cc4d1a5cf68f5f8026a7d5944422d3a9c3a1d562822b875bcf8f8c7f1951044606ed168ef328f7f1623398959c23064ebbf5135e8a58a4a2c62b4446d7d0501b84f417d52cc0a05bd82e4b0328bba7619f0eb66685d225249e0745e9cc984afb0079de42c01640fe55383e4115ef6f5244c83c57743bcebc0dec8c3391e3bed9cb42d9b354f4b2fc4d0b16dad3aabea29a4bcc9e2c9555b388dbef46fea4bad176f514b7b791701677ab559fee3f19e476f641974273740c1d0b2d640fc0cc188f3161b40b9222a7cc4d5dbba5719dc780c690f2bc55232264fd0c6b81fb3a10054ca0afbf92ef0c7065e181487ef894e3af2517acf4ea621c575f01206667c66df5f6b6746118941784f771804efc30f776817f0af95533a0489660b3a7ad5e697977c02208b92a13da417ea383284b2554b4a1b96f0ca3e7d54ca7a012776537c07352f2b5f7109b58227b86f9a971490ce243af1459ebc98a48ee0065b97436af9c7d189f57a3c140bb7519c2b054e4b841c0d56301c1d251d8d4093a44cd4b13c7dabb37871fa56cae233494d5c775be728a5e8cc432517d860423dcf23810d01c0180b8754d6a2f516cd304ed0dae5dea63aa0c2a8ee8599c0ffe01fb5d6766b84104236d97b6fb977b70dfa0c980c52a44891b2924265e523a5ca8ad4d3725f6e95142952a4488122054a9f5652a2489182e219c313a11f472ccbda702aa5d55249812285a84a89a29202a5a7566b51a89fe36cba294429a57444258bf1bd67bd11955115d28ac483ba82885c4142b55a8b427d0ad908c15902db69444cac8fecd9fade86531f13db4da1341cc99d1564c46ac2d463fa114b483ad5d9a16a2d89373c96101a9a740a660124196a620625b96f3de91b139065a4534f280d54e24ddfb0439dea4cabdca453538856f106ab3f3ae573558cad22169109d8d3aa533e9daa279e1350a760ea5fbe4e4060c9360773d55b414f080d4d04902f5abb9e16b184e87d24258fa66b3df1742a49a7ac239650ee4bc07671b52225e994e97d534fa7208a4621342849919f101a7090a750bcb18818111281101978961871911f12bc20e4d180549092fb560e5e8a8e600a633843ee5b3b78349e9328b96fbaf4b59a2abd71d34cb75e4f30dcc14d07cb11db564ca65a4d565057b396dba117cf323967fc9c3dfab1cc29bb3851f351debae84061176ca351a81b67497b9b2a4a7a3b7bf938e2a2b0a7fe825176ec91c8d56e39590b3dbd26deb1f6f47a4b572beed1590e5599eb0eae2df0496e198a33dd2275e4ed608f08b71c164311e01a31cc7ccbafd30ac56154dce5d0d7d77ad5475c6b7ccbf5953bda54a857bc536fbfa12e2b08c651b45017daa245d4331aa30bee646e390cdc42512da70de782594a29e5b42db8daa117b75a7ebad859ee65faca7da6a178737a814f1805ae144bdcedd06a6cc13bd444af6e8776e16be20b7757c42653bdcc31ebe58f5c318cbce9d74f2b0b8a20cedbbfc4efcc96782b68ce7a8b3b994def2afc914d117718f091eb5bae5fd74b1bce45e969a69969156f483da41e52d78f32785d18e6baae7756908f5c6f8a3eb2c974ec1ee143941b48f810e506f66dc331594111095e0092df12928024c3c80f095df0c95690758337a3e254ec6e17e69153f36b0ee7ba8db688d40bdbe7b70433f4e46e0a05658a85ac201dd8eeb4c2463085e4fe0c126f6a9d42425655f4d3a91f219d7af975aaaa8a825c5755248404f6fadb54aa2220add6283db99ede4e56c9fd6d25ab8a7e8a7e720655453e40fdd3454050f93101083c990c3d48982861e8491318187a980da71e0688be785d559190e65eb6d1f5aa8a826c38aa22203e9df2915f7ed954453eb2a42afad1dc8b2902d2dccb2e9d46540ad2a92eeb29015d55918f1048e3613d6fc67b3d9b0f8fe2b3018d88464d464e463ff256258f78b6a0dc7fe9342224dd1442bd2fa1489b9abb9c48ee77d34890be39ade24cffc60aaaf38890ca93db6ae2470701c97d062199263f212852f2fc8b6771434d8dc84282fdb0f573870da74e2825de8e881c65aea6db72d3af9bbd30d196185b015ea6f882f10ae3363aab89325ff32f7ac80ce32f36158cc398c74660e72193e666cd9db799d7888ce4f99e674192e7511cc9f3d651776403faac6685aebcd80af0320ca29a2cb7db31718c1297742aae20bffcc3554d59c2a485c950a7a20af2cba5ab9a32d4044593a04ec514e497635cd59420222c449ae85404925f7eb9aa294d1c59d954538ef8742aa220bf0c7355537c809c36d514203f9d8a27c82fc75cd5949f20a64d352548924e4513e49775b8aa2949949494f4742afae49777b8aa293d3fec0fa14ec512e497535cd5142124a44d3505c994229d8a4be4977f55538a4c3132da54538c4c01ea5424417ef95ed514a02942b62942843a157fe497f155150921d1901411752a8e20bface2aa8a888aa0644550a6ac3a1545905f96b9aa29ab293cd8149ea14ec510e49779b8aaa2a1265793a04ec59efc720f57551444a46eaa22224d742a8220bfbce2aa8a9a38621d89d2a9a8447e99bbaaa22852e8a62a9252a4533189fcf2cc55151531328d24e954e4c92fb3b8aaa2244ae4a62a52b2a453f103f9e5165755b484496442a553d103f9651733361e30ab8aaa3c9a9755454e3a153b905fa6b9aa2227454fde0c58f4e4d1bcacf5c41b2b4803d27e72a7f9e42e4383749241c9d2903b6343d6869677191cba6c0eb9df691f78f14e03411872a711594131ae602b282852dca192401af249b73921f7e5ead64a69bdd71d7273e904d2b082604dbf3a2905e1d1f461dc920f5e6907af9483571af24a3478a518bc920b1e4dff09c54548f924f7332bc8e52eef3acf213f964f979ba44cb17a334c1d78292be3a87a83fd3dd4493d76a867a8c70ef5bc78f6de8bf4f5ca4bd28b1e12d115c85528d7371247727d235124d7bfe6aa7c328ea41c3d24802a8ac7f7de0b6be18b0dc74af9f8e393e9eb8bfbf2a5110dd91c85b2b143361f9212e502c3b678e7e22c58b8c077711bdda2c5337c55b070c1e2d2dcc5558155b878bf058b162d2e77162c2ecd5bb8b0efe25d3c6361ed3316b7c5ebe5ee82e6f1b660d1c2da67f67234b72f4a4425a292939293d29312911c915a6c8b2d4929a5b4b2aedc4e93974c7a783103833edacc9c071269c34171d286537189a4ad5cf917d65a6bed05b0e15818064be963dc72ea697c91caafd49c5e99cbbbf2e7c3eb85b9e4a4533ebc5f7a526b9eadd45c995b735f7ef126156f5218cf47348956fc2a6272345de72eeb99e9604b1152235ab16254a5397a17d36a54e5cd806cb0f519bcd6606b10a4512ab5c0c241ee6749ab4e510c236a442b9ed14b5a8da888c0d22acdf589fa3070b4b8051f51dd5e2d7966538b44361d14d9325261abc1d63f2a5b83db85659a8337307c45b12df939718623b97635729591ab0b995c637ac50a8a33361b4eb5822cea28ee365cd4886cb21514d360bb2934853a359374aa2bfd4c249d7a42522892fb53c9015ebed0604bb55a9b77a59f11954eadc02a27048daa74a5207d23e3fdd24fa7e44b46729788e4d3bb92907823039b5627fce24c124b4a627af67a9a831b0e0f0b4b2859af727d8d92cf80e2d73dad2860e451c0c8134d62f2137a422843599956424f40c9425088640d8a10284da54a46f20394ebe39da0c293717e4eb4c1498eaf5490685abdb6e1507c01d970eaf593fb3ac3486e3c3f557c729bb20c6a744e9f1b975c4b577e5c8ebf80e488f8f2b98240b13b560f98a1d89df81e309bde9d68ded5dc858b9a1e5e731b4d43f3ac87bbc2458d8bcbf29abba28715afe67d1a1734d768aecb5db09ca6069f8818e9fa1a5ff3ec090b73775ab978e401a364d3331797e635b23c5e9ad7ebe2cae4b7e9e021d3e0d38a07914ed5fa1ad333d37579cd3dd59acb72d3ed4eabdc718e6a855572972bb65a6f2aeb2b9743ae2ba35c4964062ba1345706db9d56f22283bd8a5c41bdaa39262dc6d718a31130477c224264eb2a775650cf9b11afbcc8604daf394e5b4e3ccc1e05ec73820a933c75c4d38fe67278c8139f5697908a2fa0e682f840af6e601f83456295bb1ef50212b27218806ce5d6c36de5f55a569018ac50eed199fe1ad19bd1dd7c925bde4d21284faebf8c6c6061938cfaccbb2b68e5ce9b2ecc2ea52cbb2bcbdf37a3be46bdd60d1e4ddf0a838d78a73e9e6a79e559bd38e0ca68c3a136e2cabd28ae0f7739ad8a983697bb1db49a85bc45c0df679686e2faf0b755bc43bbb98d3ead3ac5f3669c88f880a1f4cdbba1d1a35030b02657b54a23f5bd1989a4a592b66558923bc9842777db8f883bee020385b1e1d06d4589d46b44f1a6d65735221cada0e6ba88466415e95494ab23152000703528994644a445e9d4cbedd3403a48948c63055941443a9529a592d2ab5e57adf5f8ba4c2ba7fac6b96e32d1b7d096164a29c52d2db7de64ca7a348d280543b09b6ee4e9998aa37dec993262fc751793eb0fef56728da9fa0efae47a9937c3f47a1e1e8d96d7af783360bc9eebd48bd7d7fbf066b8bcbee6a56c5e1fe3d1a879fd0f6f860faf4fc114cdeb67401a2e5e5fe3cd68f1fa00bc148bd7e74763e6f5037833b8d713a0532b5e5f0048a387d71be0cde0e1f53a2f25f37a1d8f868ad727e0cdc0af57004cddd73700d2f8eb1ff066a4783d045e6a87d74be0d1d0e1f5137833625e2f44a7605e5f0148e3e5f543c49bd3eb89d0fac68482e5f5f0d190abf6893dd7bbb88a3cb1c70a32ade2cd692557900604020203f11f4c3f64510b2a1d46e77a7dc53b24255650a7ea351ca35cb1468482d32ade5c4171a6218df681357d0b00dc5920f00fb8eb2ba8471fbdebd4bdb92850b0ac0cb1d605c7619721e3f0860c4c46ea274cc6fb467748a42e7c2f7e380521e33fc4785fc67def45c58981494aac0d07c5ad0d87e556d7b922f16ee617ef0d07c63beb703721b006a8b9183c9a17bc1a163ceee7d1a800d69c007226783425783523789c081e4d0face169ee038fa6efe26e1d783571785c9547f30658330572458f860daf260d8f4343cbd5a0c09a1cbc9a218fb3414e25ea540b8c16dcd5bbbc93f905eeea3b8de8a86b442808b532bc9a3e8cab3df168fa2fae06458b026bfa2e575bc3d5d8f0b436bc9abe0f5773c3a3e9d35ced0d90ebbbb89a1c604dbfc5dd568fa6cfe26e1d78dc96c4abe9737703c1a3e9afb85bcff603d6f479b8db128fa62f73b7123caeafe26e2878357d7cb7143c9afebd9b0a20d7ffdd5a006bfa29ee16e4d1f477b8db0b1ed7d7e16e317783b99b902d4823fa426cb98dee940bf6d152515c8b48737d966b15696ee6156c05adc000f536fa74fb46ac272531bd4f52d234264c4a22a3b90b9394e4d8d82260eeaca0ce32927bc5137b2a86b6564a494a6a9092685434222d4a73ad116950e28fed484988729f94a453a99555d70b2e5141f662581266e2c19d7efcfc28c876dc70e873bc7dd88d44865d04954674a6cfa4161bc3c76d2077bcdc743ac68e3f084a929f13374892f3736248157246e261a23e1922b20d94ce39a78c52cab844978668ee7a7c67658d315ed77677cb96b25bca18636cd9b2bba56c293b5a17d233cc69f18019033ef275d56b5d699582a01aa58f16add5b2e8e79c935ad4a2d7755d57ac964571d0190714aa3ed6787921a89431f6096c94dd52da9610476208af8ddddd52c616ca1949bee76ba9463ce462bc8c51c618658cb2bb3bca28a39c52c68e31f64443f662d868a98a7e2c0c3708a5d69c754aa99452e698724e29a59c52ce186394534e79849c5346296584f2e8db287d5d7a4073f5f2a73416e049bb925910ce5b579b97f371cb4127a59f73d61aadd910c79bf8940c443c6490c2332493ef2a86c999168e17d6ea9ba598e66c73d69bb35e84cc3ede129e209265f25b821982b2aac8c77ab9ebd1aa2221aaa21f68bd6b1dcbbaaac8073f2945a208e50e9569b5ee11188659b55a0dad67615591cf2916b2ec591b9b0c5bca6e2977d8482664171b64ba0884c9c03e254c01cadb9fdb09249b8c31c6986d29eb2feb5cc42528e2c4ed459ee63aaeb4e6e07fbab8aa8f6fc6a3f027f668f4f346bf36d5f3b67df4ec19ddb6fb72b669b7d17488f64dc332f9ce525ec2144cc154b4799419e9f22022e6682272e237bce121b64d4a1173c3438c30114334d794768abede549de9926ea286d2529a4a5769d24e62133507a5b928580b6c177d46dfb1a2cf9b417a3f9a8007298f6e5dd2f6babd9260904dbb9048cff4b30b8d5cd8043cd25cdfc2504873180664bb2a636d39ea7c64f8c34d8efb51286be71562f68c8185b711e38d4073c4836ce63cdc95a83756acb8f04616b519eebe1b44f1a67bec4f1257793433c56526a594524a38ac1a0e3eb97538a5b7e8ad4b2d79ff2a59f6143a4825b48127bf29e4a78429455c68349acd7571d9e1342e361d297e1b51c60b4d468d0f36d0458b16a8cb9c2291d9cca60339eb976bceba74916529e46796e2c2dc8394cf0020834ac96d3aa45c21a5e441ca482965a4fc4166cfb263bce16459966599cc322ae5371d4d9fda70ccd0662e0fbcc161257e83fb8aab04ea068799c89efda0754fcb51a8371f364fe7275d2294e73b0a94d12c0cdd259d62d2a9a11f45710773277354673de6f33449a7762c2a94edb0e9401d72e870aac396639dca14f701c51b48342259a03922fdc5526ac3d139ab51234b717a980d27c56152d01497e5299e82fecfae272c7439ed2173f6cce5eef01477e5bfa898e67e599ee2d6d3bbc35d76c0af8604d2a92ec5f1e7e54fa77652fcbe19ffbc34c19b413ff153fcc2fcb2e9b8f7f41900340c069694ebb116d84efa602fb0f3f2e5590d6dc56502070f29526437423e791ea42c31be0e9b8ebe858d80398bd974dc4b1529308c0e0f97b9cc79b88d56f17b9ce2d2dfffbedc14c60899e97990324c86a189d974f4e5696c3824ee64dea692b97c0b8a9349fe3ec57d59858ac37c6e2a991edec30e59f6e314d97990728675dc1f1b01b38a9f361dfd0c1b01730adcc9539c1e308c8ecc79380f327847450f982fde49f1ecf876291e739b9db4e5a4c82e6dba60189dfbf98977fe1e30a7f8c53bf4288e6141ec8f8f77c09d7ccc499b8e0e9f1f6d3912a3ac6733346d53d1a378f6a25c69ceba0e31d95f30dc725c247e9ae4214b1db264c99268cb127719de61935d2e5daeb606eba272c15a732ff765dacd38e47914b70764219a9fd7097776e22692abe4780a146f661cde4c7c0a72bcc51d8a0439d22472fc0828c70dfb10c951fa3417813417bb67be7b22867b723c84f22bc62967ccac41d864691dcf3f49659af3016283457535f2bb9644ee773ce4f8da3743f44cbfcb542d666a38d346bc6925b29fe4be05a57b443db9a334e602db4d9fd5f489373872a0d2332fe3cc61c5f349856e7435afd488ab6ca381e80eb2ee19866618067c641e46c43c0476ca037be723633818c68e011f19c31898b74eff1e303fec4a1e5d06e010873964790cf8c81263e061cc43dec213efa83c1ee84036c2254b3c2404fdd8fdf8ec9b814fa2f111580c64f00316a4e0084f00baf1621249601b67de9340c599771f1612dd32898c497eddef3d28834c48866f20f9e53e0f18255ff8e4ebd4cbddf8f59c971e5e1e0ef34e7fced3be12efc0bf4e43969134989f941fb9949f136c00ca3af23d7128e959f966bc1c1e54f2bde9c0f9a24cc6399de18db0808ffcf23bbe889f4cf631619301665a75064bdab024cfc8cf8929447226b538df7b73c639a56c81edc3f8f99d788b52a9c33ab5a8f57b8d8019be1945bc77d669b468a73a8b7e3e7b82f690597e5eedf4ce2c93257e5726bb786dcd515b35c81e05eaa5d04f902cbf2204032899cc2024912c4e8ffe369cd2e98f46113d74ea65768da859fb033276ed16a1f58039bbbcd9bc59fd56ab8e9b27b689577d51ca8c6b8db73dc7969dd4b88cbd1ebbe95dcd6ac507b06fd3817da75e9e6876abb2bce6ded330cbddc1e5edd9bc710e7625c32b2bb85e98311658b904c9cf2acbe48764054db29225543b5d7b16d8b6b4d225fd743b632ce86c32cc36326abc190178568f48c7aee90eb96e1fbbdfee7c0fd869c76edd1dedf2599655f94c3ecbfeb69cec90895d92e149177e747f564fae208aed5467138556406423c633018a508e2b38a0c0632bb0980a6c67730beb0c7fc3a653d8e365f4cdf51863b4c7a35cde0cf9389fa17890aec13c371dd9a5136f7092b34b795fd6aebcd84a8ea152abf2d1689bc867f031c9b0c69b817f0f4b81ed9e5001e465f7286b9613478ba28f3640e4396314b217c31ec92f23590111923c4ffc07a21c6432a2cca251342851a0cd6f611428059864c227bc1badab90214c0293d0c3d69a07de885889df6062f6900c3fe7fc7d370d94e78d697d12911eb30293c49929a5b92d87f57a98246627e1eea8ec1bee6cd67092b8cd9ab128406cd7400d7403f6eb11b5ded50e42b9518a904d03293aa46ce1b84d8b4eb94122daab1b45a20f182f13409ae33b1599c29af8ee66fad2b517be9beb74c3a1b7e332a52e999632bd3295c914664a9f9d2eccc43860ce7e7a7d8d37f6314586276d1ab64af83deb46e2cea4dba5c85ded50dbbdd0458e3a3af7a391b9193ec277dddc0d267aca37507a8c1e0b12442ec98fc950137bed601da60329a55b0e768a517a0d474f9d9c6ad559ffacf794e4b7249bd78139d39a968561a086a36b3dada72b36ace2ad6abd3e7b14889f4e480992e769c9542a65b7b3276d65c30185b2ac9266a54d07d66ab71cfa3a2b86c18e359775b6112d0d256353a3000b10628706787c8204b1f4a6b1c147bb2a0afa79d5776aa7de92d7a603a51cc9f1d6e19623deaa5b4ebd659b83dcdc74e2634bf8e21c09915c90719daa8ff0f55b7930ca1cb0752c6b1bb60524376d24d7b5dcc9fc2cedade427943b1b9bef33f6b6b61c32cdc5988de041caf0dbfbd628c00284d8a1011e9f2041468494742a36b5de787461ce6a0e19dc6917dc2a0a6cf71ceb8b50c0bbf1812887d58d79151cddce9b76b80422b8e5d0e140d67ee1aeb5470d7746607d8b06b4ce03660c0fe9b985611e90939a8434ba03f9758473445fef1bc2332fdf3d25a4f3c92b3b0c3e0bca17e4b7a952648a79a48837e655e2379888692e7e6ea8e6e2b113d89879c0289942275d9443b62eb94ee9f429ee90e840b69e591af540aec770470fbfe9e853eb7611b2dc5402c814f31040a63fbdc1750ace1b9789a420c49b10cc2741277d9ca99c85a8781382fa24ac6ad11767260e01ea4612f31487a0de48a2c619c8447f5ea5aba435973ddb5235c5495f46c9ad9a225b96003ff844f65e58257ab28afc8492b0811247f2cd4f48899fec04a1fcfc849c00c4c4065182480927215092bb5293dc320447220b7267fad10fbaa01026563585c90f7ff965c3f9e1aa294d4a7fd965c3295d3585488cbf8cda70625c35e5c8cb5f6ed9705eae9a0204e62fa3d87060ae9a1224e62fb36c3831574d51a2c35f5ed97074b86aca8f1dfef269c3d9e1aa294852fc65d38693e2aa29ffcba50de7574d11f266bc7cffb2dd70ee554548de8c97f15f266d38f8aa22286fc6cb2aaee2aa293c6fc6cb327f79db7064ae2a6af266bcccc35fd6361c1eae2a22f266bcdcc35fce369c1eae2a3af266bcbce22f631bce8aab8aa4bc192f737ff9da70b8ab8a8cbc192fcffce5bae1cc5c55a4e4cd7899c5595c55c4e4cd78b9c55fa61b4e8bbfece22efe32cd5f961b0ecd2111db49a208a4b9266598d4d31ce987142852a048a1b26a2080f8db7000f080900078769a4449cff4751f7e1de6fabb717a1733615afeb2c9b432f19c6aed8b0856ce538c31c6d335f1f44c9f56d74557d8eb9b07f6f9745d1477a79fd30aabd82a5183ed4eb6896e824a474ad2635a7b9d784a4e4a4e4a4e2e7c5a9d7a4a4ef2a9a7d4a453f4b4f20013f5d85f4f1a6c775abd2d53ade40bbf4753494af08e95d24facd55a14eae7381b9b968a77e477ecc8f21504405908043f279f13902c25bd1d8a1ffad0901d6ab98d36ad4c4761ba657a814d87813bce748b3b1bd3a76955fa99b3ee58c9f52425bd537fb53c86951a89c9954d9861166c07de4c3f044e4c40c4822832b0546eb0e241cf4908efb432ada20678541293dc3649eedb26e28d294ab44251e2cde9b432ad3ad3aae2ce7a12b2bb5bd240ca7881ecc5b04b84f273024abf21c84694b02763498264f9d2c1207afae03b7d18136cf78482bab3c952be0322cbc7e784ed9e5096042840a7e845b157ffe20c10f9fdc597f9c819dc746226808de6e46d7e4e94e147a8e7d1bcf76a1e217b32d8106c67b39cb751ce39e7c452890c4a2c0a52460849ca123b71862ae4b7e5903274923d9926ac038a3034a7755953623f90f557a6d655278523c89e0ca548d8424fa67fc34b12a0b9a9a4b18d1220610b3f59d5a68d96cd9b102f6009dbd9fc965c7d3b4b2d6a23c3d61afb99feb35e1fdb598c89ed6c5d407373cef3c03e0007d1dc3cac827d4e2c9e3967b7a5fd3dd3eeeb26ddd2484dc2adb576a86ddd1179eb91b55a31a892b7e42d69456c879629d6fa6eb75bc9d96dc48a6dc76ef79e64ecbafacaae36fab65d95f56dfbdb46d6b75bdfb467b7d1d715600d067f5e531864d295119ccc39e79c73d239e79c73ce39e7a473ce39e784534e2ec249e7e59c3fb0f293cecf39e784336fd24927a573523a6767cc8895872b8a86233ccf09c9c7765c2644bca9b556ce49c6c55a8588379ce562bf2639de250b088207f252cebcfa224b00bcd73f3c24645901219a936f6a86ecc5b070ce09298db2040f094b90647899f58413c2c3276d32b8c995e696b0f3d0cee724c32b29e2841980f27302ca921ffbb023467fd8c6cd367704bc511f8579cdd12172877d072a537ab1db1d912bc575d38eddae47c65e6f36af9b6dd7b4ab8a3a71cb891aceb47c618d5e1b11ca180c014a7e4b4802906c939f9010a29033ad67301ec86d460af3a416d62856c4460ecac80681135fe8c9cf89331091493a35440b43507e55f273e20b3f59d3ae9597de2daba6975ec243b49b6e3f27368768d666bf1de268bde1a09f74d3a15bb6608cb080bc356ff3dd86637e9bf1b3f391e73cbd1552188a75669e9f97f8f476ce9eb5567383ed913b7a99442a59d229d2e325932112675a99588b45e60ac5f64cd34cb7f3748a92497a269a7007af4d07cb146ff4db8f25369f4ed14f095732492c92652593c9642abdcb642a9580e44e9aae6b5b02d2305d4edc754b9369629369628bcd4b6c5e6e417287d9bb433a12794a6929264d7887da635d8ffedb72944e7a67d2e7ed369f8c1daef20ac996ac9294a9954da77492942b73d533f122e16d8952e92689614c73ca6f3f208d79896dc46ef3c936db54283ef1ce3ce9180a7bba4c126ffa27ce4496ae07956fb9248a578afa8937b267248b6cc19dcc18457112325d984ba552a964c225ecd9b5bf6e3dcbfdb92b0beb56fa07ae80f48f69236d2612dea12f7dbe233d6b6d5b02d2c036dcf5b0f2cb6808fdb49ff8bd8c86e01d7ad2a7c51d84181d99ae1bed3347096f4bc01ad3374cc230a563b740629126395e26898fd626c9711eeb61e5ed5d0f2b9b9e5954de3e7a27b3dde4a643cbdb6a3ec35dffc8d8bb58249b3ae863c2dd8e8d84b725e69db9447369e612e91a966525957d7dd7fa3a2f29e5e5249d74ba2d016bb08feebc1ba65d1eed4afc868699c0be2d0169bc8c7df3c919d432ec9aa795d64fad4e389d5c51451164ba1fb42cebbd97490dd3811592e93fafc5cf08835238ca9083c7591106d9953d9cbd774df8038a00fec8f008ec8122f8017f34d17e6822d07a3411683fb41f593ba2fdd07e34bcd39a734e39e775453827ad4bc09af97a6bc2f6c92d94fb07ac81b7de8b91f612d46a9fe6a005271cb2ecd9f9708cb1db81caef73de0e951f8c511e917b072ac307d97cb625b61fdb129bcfe69337a1cd67f3b986ae2b5c4c247ed715624f26101589b3fb1aba8632d6236febb0b24cde6ba839c9c3caf12d4f7b70831bd87eb7a235d7f5b0821e1052ed54df47a61342cbfa15a394b23feb6b1ecf47852d82ecc1b0fd77aa93329d92392e010a5172bcd637f1c68e2c7b166208b1840fc2f7e0c190b512a8f8e4f7447e4a688390a831e0d19042604dff7af7b090df83425e4200f2fb0fef4606c9185921908684c2838290dc732597c4993e6a2583ea8f9ad8e21a5b8e12cc7315cf5275b073a58a37c925dc8f428de6e33b7bfacc8af35aff0469aee7b53b71fb4419248fa2145ae2c40d51327c417e4aa00294b30cd3e016afdd5bb2a5128410428803310fa86b3dd3d72e356d0d56bb86b5a350d65aa7b6dad74e9d70ecdb2ce95a8cb11447255b8ad894b1e348c63cba5d8ddd28d6e6b4b7e1905936178fbd4e953a1fd96aa7d6b392166f367f3a48eef8d1a5ed1365f2f584b5de40de8c6759d83efb4cbb9de3ede0a633ca560e295bcf227c3677ee38d019262766fa98619631db4b4b27dcf9b89a83303931c7c76caf3d6a8f9ae976746b5f42a23d8eae69b7daed95d00620d9e6120a058a118907690433cba6437bd47ee39fb5f8da3d6d3aa36b376d3916a35c6a9c361cfb93b5b7d73e7aa649edc6db7b7da48d6e767be5b51b4f8af6a5743a695ac95a19aeb912d602dbb54f03e954f7fee9d44ee9a6f7dba74d90d9d268d361ba35ddde974bd7fe6d39f6a66cf1e976a5936eba3ba5db6b9bcee8f6d99653c2363e83d19200e2b392efda270430078cb531589b2b9ed9a36d39f1da33ab69f666b9f4d225914e75f6a41d7bed7d19d4296cd381a36b875b8ed1b5c7fbf2b5e5d8b764cbda59aa0e593b0f59fb924e2e914bb447a3996a74aa46e9d6747b6bc331dd32954ea78ce5ae9c4e2c2b3cecad617a66519c4ecf505c5fb1d94d57de5e96a36079f636ba46a7ec57f0e9f574afaf589bfd74658de660361c9d4d8fb75766b9e99072e999e96a39d341bba0d80ee61db44c9a46a367a65bba965dbbd254c26f870da7c6e892fe7c6c38d74957f6d195df61c3d1708d146f6e477e8e5672b6820379e5caa58ca353c65187445e692e3e7bc3773992cd69b715773ae4ae7d82c8dd0e9bcc92e131f8a46b1f8d05ba18c3a49f74d239697f4efa79e365ec168134813c76f8eb19e97a765d181f9d83fdba0ac33046c88c9d072963f8c2303c60ee1b21f3751ea47c5d7ff791e5a6431ec346c00c7f612360ee6abd07845cc89e4c3797e4f90c4a9552253fee477eafb3c9b308d92770b960ea8b80b9ab79de37c33acd43aedb68eb46353c9a19a33c9a197fbd9bf6a96f063deae679ad67e6db27a2a64f8c4265ca9ea8c90c6e38f5d1c8bf2d76318a4d8c51208df8f9b88637a30d910d2fa57d925a5264eb5d8a79edc6c759cfaef566acc7fb5e8d75ec5abf4816cf8599a07f89f42fb33499c7b97829fa48ad1b9f5934521ccf54ca4cbc3365ac5584b88127c35b529c280a9277c8cf09295572d703e63eb4600f99e725b49e94c914fbb1981e32d393e8ad37bbbc557bbdef23fc9aab1b0ef8edd68603763e328c0eccfd2ec2089921965b0eeb1042fceae396c3b29ee47e262dededbceb575cad2d075e4fd8fe73d19c0b172e6ed55bd5c20fde1ed27af4cd271f0f52868f06461f23789d207b31e4e441ca8fbd439fb5362113af0f3bedd13c79e30cd91d885a06040bf3bcec7c3c989c283b90bdd75d5f0112fc9b7fb12f6534024217bceee6e10e94b19b09db87304a1f581cb19190459c4702dbbd28399e88233a0573fc9451f6860098213e224b98fdb036a290903c5c453264304a1c18758891cb3acf166296fcb6fc667e7f456a5323da7a8f9a8be861bb0656fc1ed7491d47c899c3812ce7231a94e4781f396e2a1f595a5a1b11b71c99ad982be611b38569b4601c011a9ae499656fcb91ab559d439672c8b75ee39663be62181df87988ab8a9425e641ca2ffbb0203442bc10193e02f9ccf1529042454a152954a45459e52150526a3b50b979f2abd2dcc386d837c4762e82d9c076fd23773dac2c3f658c352022e4e16034c0dd8ef724470c848ce6e0312116155f377e34b03fc8e25f49038202f9682c3a65ec2064ef45aa1160258ef71e9d1f86d1e9877bc01cdf1bdbe8194412e971261ebe93efd1504796e16d44928d8440b0ac91664bc74e22e1ee2ae11e9dedad0e9649180201d6c8c74d453a7daea4c8613f6660b36f48243982dd0b02811a81349e7c1936d1291ca29c3d0804ec87854d3491df061f492fecedb40ca5cca2bce45680d7a7774a4991800d87b2d7d9eb023c29a59412d59c4475cf520534549614c26e29a5a4744a29e59c5356b12ccbaa96d5f06da50534673f2d0b76ad966559104208615b6d5956edb6c820a57c9773dea7956c3c38a794f23d08ab66278452090d6da465517800099b52dc759643774f4a454a29a59456cac448e79c524a3927a5534a29e79cf2c73b7defcd52049aabefacf5f23c47df637c11c208217cf03d0821a5f0c107217ccf7a0f5248efa995a4d67a5d15d2430c9363bd6fbd639aab10c27a5db5d68a6157adb55ed755f18e8d45247b31ac4db70629a525ae7111b21b366c08bb7ba2e2cc849042cba21076d3304011925950e941945de4b784278ee48e91888631cae1e5f770277b07840d6337840d217eef3dd8b061bcddf04108df1854453e3e8f00134729e50c1d2a63118b2ea7188ecb1de2a564fedea3425729ba96fcee240ec599f9171f87a20fac9947350d9ac488918a3192114306d640b0663e2cf60ce209b2508495e34f04127d62b0b0c4384b8c18a91823193164bc175666d98ca5f724cd361c191cf7c37f80719b996396540c182a52307e807196639b18307e18d97cc666341a99361c19238efb88e33819a3910c1932cec22243db72646c3a3164c888115954748c4c4647192c2cb7d130cb90711b51c68d91b15c058b69c349616853576608633c8b81e30fcb8d3e6f883e1d04b37602650c5b0de42477bdea190c790d44839792e923bc0e42ef20cf374fa77a2513860c1f871e193214e2d5c0cf21c3a13664d8d507860c3500831e95a350d6528144a011780422814a5e669008732d119dd23410e30ed4104400b1d8c4444c1f8bbaa4126f3480b9c17692ca5f62e4696e3690a4a26dc7eee806f6182671e2095628783e90065da14a5b78dc6c8235895bd042c3a9492af3740569c4215833bf6999161ecd7cd719cb82bd2c6ea3b398632e2f1b0e0c6d2847737527cf74b953487338862c1559050b963eba60ecc20de73ee67697f2dc98b3b81d1199c5330cc39e1191bbf86b5d5c7047443ccce3ef4ecc55b0c0e2cb0b85c131b8f311737c16f7e5abe258850a19151c8bcf440c93ddef096d3833365f7161fe7cf115322ee387c368f1184fbdfc59bc31cfb987a1f7e5bde9887fb9cbed6c76b98bcb334a0fd3d94c635e0ef3b7c5bc1ce6302ff2c5fcdeeee5f806687198dbe898bf0d0130b7e8e863b0cb6554fcb0e22f561c7b4635978bfde5faf02c839b8e0f8f8fb911bbcb6df4cbcbe9b3970b53f3971bef59fca5e69ec5595c98bfe6603017f3721e628bc7dc8ede073cb281a5f832979b8e168f78a7c561f0ceed21733cd602cbe664dce587e3a76e27338cc74d47c5e37bcbf901bfe66460ee117731b06c0e063e77b8e578f1157f5b8e172f5660175b81dd6505f602771cb0b46dc399f98a15980beeb81598cd0a6c73cee6367ac5b5b1c11dcc2b3e8f5dae38f76cc59ddc9554966057c82acdcdafb88dc666eec3ed88c833352e8ebd1cbbd1003ef2c50eb79c5b835d1f0e735bb8b8b56730ec190cbdcbdf06e372174c6b668e9f03e618bc337316b7d1d69633833b1ff9e52c6e23fa3063fef2b7bddc9d98b3b88ab360f1976799d4308cc6050c7639cd7d3de382bb8a3ddec57d3d135f8e8ff190d33906efbc9cc5e1a6a3e22cfeb69c97b3808937e6d875817906635e622e8bcfa862700773cc591cbb2e8ff7258b72cb71892ec78edde525e67666f11e9e4998db6817171d2cc2e00e89cce2b8c5f1734c0b3cf3d157dc977bb85d10199f87db1191f1284bb1e1c8c85c994718f6d1a6c2306c04cc61c92a30c597aeae60251559a567fee814cce7a74fa7e8cb6717a958c17671280a3eb98b49e250bc89b55a1b9328e9d4924e619f3f76b147239dea1af68039e62f178666d167be56eb13a3cfbd0b955aa9e4797a87ca173f9a79bacaf37445793a159fb8dce8a4b9d9ab3c639338147b565d1c3aeea0938ccd37502fe994cbe79b490335d05360a0efd040d701c75a57fede0a8ef6faca6710cbe53117877e870dc7056362bb5e617fc18e5d1e9f65efe5e57648640c050b86c2c5c525ba1c6361b9cb4581b1e458999e85e5181631cc05753b0dbb2d174537c9f32749a5082bbf748bb0acf9212e11243cc2dfd137efc6a41281e814bd558f42592a35f2244057258dbd7b4c2e5c657227a95c60b09da492e71fa540980343b227035f19327c6ac8f0efb921c30bf166c00cb193f88ecbb1a7a7a7b3d8149e3dc247d83d3ffaa7bbaec4203f9965a3f3dbe8f4b1ddfb429617e2d1c02e0264c973d4ded0cde5f8e6a2bcb4e92b58d5aa8fc63ad6044b7f91ae5d8869d7bea269f5f5a79256d256589e95ee4a73a36b17d5dc48c35a7323fbd3e92b67b95d0f2b9bf5344f0f6225475ecba7d34aad271b9187b5524f75d3b4bfad9a4adb4bd7eef692f65a374d7b69abf5dbb66ddaa9a499347bbb959c040655ab5a56ddea6559b72ccbb22ccbb2ae07f1053c60abd760cd5acd6a6655cbc22e0bbb6aadd5e77a4276ebe501737d34f45813302b06f6049bfd1a7d7453634eb0d6ad9748dfa165d3e919e92ea039eca3fb80e6b0113e4073d8f6d22dddf413c932592f994abd69d91a954ab55a262b573b227d746b34aaafd651a99e74ed0866ec1b768c6556b6d21ca51766599635ba818da43c82161592d44e0db93eafcda02c0bf6bde3907f6f25becf0de77dd29735a4147719b5b03a04c320fdb35edfa31bced5a7bde9b4551fb5acb7d54d69d3d75b94d2a64d29ed6eac33adf504ab6531c6a8c59865f43d3a6351c31e4fb30b630a2f0df65ca377355f17866daa7a0cf6c01f9d92bfb09bbdabb3d9c711da61cf756d071e897cdd2e66ec7d0cb3b05f1df4895ac37e8457c3db2b9ef40b6bd6e115318c76faecba7460bfb2eb11c3ec823fb2d70bef587b6d2aec3bb162d83c625996656910e3eb16fd76b3be935ed7553b2d5f157bbdb0d74ee11ded3aa6bddba1cd3bbab267e636b599fd5d77d28c61325bd6e90f3a2dd4549b4ed4b2430babd8ba5004b0463e833f7206b52991681f582cdda0aa5e4e9204ae200f2aebee25489c644cb01d2aa653f5a81d9dea6c84a840a7e4ab127e889a07f2c095a4a71b4e4c85ab98a3509d2603882ba3b9faaa8cda3d27f9ba80b836cdd5e7e4398190a7b95a81e6eaaf8bf1c0c21eb86aaebeebb12ad8f89b7723c9925cdf50a7d916994e75956b793360ae15fac0c66e60fa134ff20ff931e10922f93ae94fa693abdcd969bc3a5bb8dba1e178616c53cd38d4a9ebf13e8c6aeedd59ad2ccb465966594d727765a351f6cb3aa66384bbce7d615794978f232e26d793dcc9ebee60f05794906678c73a765d0177d750b6228e3bd6b1c7773b86b294d63178af9e1bfb885d87385e1826bb3cd571318134e22f4ce390a42ad323de89c7ae996a8ddd4a777ab7a9e0772ed331b852af2bfe047167a2584fcee29d39cb9915afcc19b6a9e0e76bbd752f26b0865e4a7bb78faed6f03dc9d58215efc4671d245dd67baef84cbe2d87f5327c5d015f17c35897a7f167c77b92af773bde132d5f575ddfc970fddc7468f97ab76384bb7865cf64177cc5d715288d3046785d01d6c83fc9304a984d96d543b28020600f0d0e2f4a011e30c40d2f581fd9faacd6677e9b0e9aadae6ab96279449e6f5ae7312fd8f8ce62c4179459c848cf527a61b76ea76551d3226c2dca5fd88559358f61f3d8e7314c5faef1d69df2d715200d780de50c6ad2c705e30ab2f7c22ec19e60afd7f35075f7966c25ec76c69c60e9b58c9d569ed9bbd29c76eca29ad330ac35a7bd54fae92bb7eb619d620977d8832895de8952ab84d1ce5a6cc3d144006bb08c66f7696ed647338f35c162268ab36b23c62c3ba518f59129e9c26c491be9f6801927fb68bb302fd7e6b467dac49204752a3b91dc449e915aef60132b3d33a74c9e2e923861ad203a95519add47af053437ab552d4a296e9ffc54f8b0f07222ab43ac0fb18e0959794c0172f50122ac592f7c8362b8d573bf8d0f9a9850eb6cc532c5ec3b5039bbb6e1c0ecf06acd65503ead6d70b2203a058116f08008cc57c0de94c12ddbb0a665fb0dc79eb45d6bed6671c9e24e03d942ecd9d57ed80df3b0b2ed90c0d97e3a849b0ed3a1d6036be0b76b379c0c9ae04fa5bc6d38f074adc33bbaa51a1d6240f54687f7227d1ec21e5d1c10621b9e952bf11b2b980968caa0c964ba2e13ae2b7f39d5956fdf81cadbcdb6150c7ff4cc3c906c9a7edd4c48c8756d38d7af0d07b3373d7ba61d5e9b597b68ba50c88541f3110889b537cdad74ca4ed9693b6dd9362d6a45ad64337bebf6a6d285397bf9009d8231cdd915693259ed9d5599eecb70f4698a26130a055f8fb26717f634376fb70b7d9a9b301fa0b9399256077be08f3ca14c73d34573439cb88ecb338bf858122cccd39ae0e9be0ce7b3ec42a078330f7fac09db34377ff27c50f27c11f20043f0d800d9d40b3386042b8b90d9746b0f6fa6914819a974da6e3adc74b6d376d3b79b70f6d26d74493b9451e7915849b1b42135aa0841ddede8695ab51f15090b9a90f0efabf5c018b1ac12c2aa929f1803aa97552fc7f7834c7b95beac6933ebb7d17b5dbe7332ec6ab74a2a167e0505efbbae56db60671f05231558e4628385736a72ab338a9d31ce19e79c33e2219a738285ef1ed19c31ce18e3b6e12b8a6dcccdc1c6bb688eda58b7b91c13d6477e9c0b9b8abbaec6053198412eced0c3bfb841ae5a0d771575ee369cc565fa8880c81d477734477f5114a5af649b8b43d0ee45b9558b1416b1ba126d7fefed22b1750fd9ceb35d89dfd8301333d279ecce9e11a7bf0395e7bb6f776b968dd8f13b5039da8833f23e4060f70840433f58b6e16011a7e7ed3a35b861ef7b8020ee02846cbcf63737386bcf8a00557dac8f7f5bd7c76bc72eccd9e39476be6235b23c128851cdc924d8ee406048c0aa8b0b658b9e62d99c93cb09475849b9627f60e3a50a3362e35360842830421ed83ec48a401374ad89a8d46c55e5899c640acdc800020020002314002028140c87c442c1804426ab8a451f14800e9dae4e784c1a47390e52061963083106800800000000206100008036f1c2418e93f2a89d485d257680ecdd08b2af246a2d71c985cee732ea7a8f34eb50159d836393bc07570d9da8713f224c6ef9e5e7144ec8d65fe544e2c771cef4c12e93a2af4e8083135ee1cc55ab2dbe30337735ac207b108da68c7e9da222560254d73f2fc80805e117b706a604fa9b80d37a8d963f311470443321cf2cb1fe78ed65f6c831ad7604e0c4676ff79fc4b78b233c1fe1fdd1ae86e0191a975fe37aba46194c1615a931433ad19b7891134a8e0a78a4f81ea174d3b70b9df939db52c323904dee1ba4efab28257c5531737c0d3c01618601dc7c1dc8d92fd50c75cfd09ffbf7ffa099dca36845c4fa08f80002198eb8fb05c676df6b20063fa06d96098ac2771e28fd1f306064259fc2bc7c11a817464b419cbb8541f87b6f0f7e1c30a986f2ea1ed47ae0e71a6bc2d48cb4ab67bb683b06a4b4445425466978e1a3ab84320bf1970e7297ab4a4557434b54ca9d1b633ef569a28b5c52e98fa6cf7de43f5c0779246d2835c26cf4913229e6e044283f99d53bc14747118b25923e64a7f36f81cee35b6f4c1ba6759f29717b6c68b796070ab991f13978a6e1995d130b7bce15da1834d4c029ad65319a5f5b738aacdae20101292b3430dabf46cbc3840ce378bbbafb85b6b2c67002a0d36ab27ac4b45ec867e82d08c137a5350408405014b32d144ca09687fb1b3fd9042ce0161b59ba65469e69737eee5befb98e34d2b7f39bc8cdd36698968853ed53338c313318b7334d4d30c3751f93889a0111b233f0bfb877780873cba4b76cbda8a72a44c3ce0c3392e887180cc9d6454675ee18b401b6c5cc575869a83a02c51c9f59ded4158c7ca71f06c864953937c29bb2386cc12b55a6e374fde0488249dd7ac98358e99b0a3a537ed8a3214ee28de0ee9969b0403f1cee6efc2e3839fd85d8bdd8284ba236e25574445bac8bdb88de816eca107a7892fd555a4fb924d79a7ce8fcdc54a4a026b5176df5b7acf23ab55fbb21fb0cd504c6278e9ee4bf7507d336d03e9974c6cbde37b006d51223a8761f9c18120eb6a6416cca808247ac48a34514cec8f4a297d7bf291028aa94c8dc2404dfa1a7d103242b9313ab5bdf35b9700a9b178700c74815bd6380290502247507e011196261f76707a8a8e7aa7cf8125a997bdcf228f691ca484ba2810ecb69f7dbd1321accba4144881dbc767c62f0603331cc5c8fb4f70ff6e7f4a634c219ecce32cc6365d72eb6780a0eef644286f3126b6f9a02566fb440bdd03809992e7b611e8eaafe72200e8f56d6b1b76c43799922d099227cc3ec69ee51e62a1cdf7937f942ce487f31c01528dd73341949de03a638593c3a9c001d57df34996f07d88f1a45ef6f6c464670d17bcffc778c5b2b9a51c3c8106a0d14f70f607a118c799ebfc39bd62bf43f7358c8b89eaedd01a926bf05d9506f9b7544f82dc49dcae252b662987b867edcbd071ffce8c7aecb5ec87b2c1a6e23af950f328f85c47ce3385fa84454885d8a4e18a7c28938ff80f4347587cd300b22800168574115711d194e2e588b117ef1bdc39aa80cc9cef6aa200a1cc84a027063fe26e0f8c38dafbe3195121153716200ba419ab6817b1b0fcf9a15a47ce4e4da03f1e208415be9f52e6528ac40febe45021714e559f599366c8304662101570f1e8bd6acf9d09b94d8ff3d530f4b2c2f0edac7a1b182a48739e0f5b2f81754424b260743ae85cf15d54f2908d1292f26852dcda71406d550664bb2953fd39472ab52d0aef09f1f6992781e4aa594c2018f6e4df582d2bc96aedf2845e3c786b258392a219e553906669ec30d52f5b372e9b761f6e73ec5510cab99a051aaae283fbf5684419b67918348a4896d929b207f84b4d1de61cf850d89e693f890cb3cabb80bc024fedefafe37c758a1e29549090cba9cbb3cfd996f0681a1d131ccd73454e4b13ed9d53422cb843c075756c8a94d66b57b80ba09af49a8f174596bb17b32ee3ba7855a66994c412ac1da65cd81239dd121d3b1121a1ea2b26dd263825b0e45f230e5c9c2c5a1b3f350dde78266e688050d0d9e3a795d127615fef5bf3ffaa808856af30a4ab7a15f07502746bbaf8fac862dc81dd67447afe9937ff69299f9f0e5ebbde8b5a91ec99c8c34255cc9d5ce3c77818297d5e69182ef38f73550b92f3bc8f206499eea0cae8cbcc55a2b55f50de153159f7a9cd6f9d783f55c9b0cab2c47fda3f00557f2c9c5839ab6d667c14832e835e9353867aff9dd007efabe756dea4d1b2ded74dc10d67076a3369665ffaec42645fce6b83e83fc2ebe97f1b4e865d43f2c00538d7cd553fa88e3e1ff7995380386df339c323cd1a771c9abc72feec2917425d14f297c2d7fe253fa3430ac21226563ea0528557396cdef7cf9d8065a91a4c8563cc25360f315b14b8b5e00cfa18420ead606482882b446120e12ee894a77cec2786eacee6def4ba22b2ef78e27a6430085a31724ddf36847f82fd9bdebb477f3d40e9cdb6699a15f9fdb2f1cf4a1f2e4ef82a2f94d3f67107854e44d16cf4e67fbf4dac48c5e9033b5630d0b2806175077e0cbec325710652b8e362d9ddf25f5afe9ab60a71a0204db6cea831e4b7106fba690dd8f5b83b0405a4cf5629718b1b3fc5411f5846d14ce09908576a1a92dde5d522989146aba372a6b3b17a77208f65e97208d8e815c94dd980274061b1cfa6c4827b501470b9a53b28154e61051d2a8ff4a8b92137c7b0d4750ecb6d4b7491a4123692ae66d447d6fa2152fbb6b138cecf58aa06f534b770bb898c87aff84c6ab604449f40b48987fd16269ab05177301fe01230feaf813ce5757f47790c8a022fc90ffa71ad5b514423a2d7b3f4a6930b374eadd2e6da19c6cbfd827b14d5db6019ad270ae641519e11b02efda3380f3a871c02b27b93eafdbf91ed72bf21787eb436a5d606fd7ddabb1bc4f990a942220f18de40e8bd41d8803930f968e424c6a71ce4b2f68dd703576499ab4fc80739e61ce2be3ebff42f5386c20432dc5bf528a8b64c41477a655bf648c071950647efc5ee1c520ed55270d9d69351d85bd67e3b01155d212c3ccd4f932c64dfda246bfa623833fad88fb782b339c0d51c04cb1cf6e767d2985baa462aaca2f9b22f0e3d305568f9e5d3983e77338db5a0b0b076343482eb71336f03f40c390388781fecdbe16d9202ef79de8959c0ca5dc92933a5a8b9be23500aba1aa32acc0fc5e98a12d248123c4cb83b39f10dffee82c95b9e95f61cf225f49b9a32c908cbc13be3df2e9843c906fa7005e7fe7ef0a4ef248ca260ade0e2098377368cdc55ffba72b48cfd6cdbbc74d6e1f9e5b3068a36ad33528755493a70c94ab6a299b01af0fd3355c26306fc9e77ce88f803230f6e1fdc7aa6f1265ddd4892715ec85141fb1e87c9ddaa1f827554980289cd5460b8364822fa316b0232254c324a06a2a929f39260a54f8db6c1e6c933b585b386ed8d57a67300cfdc6338e1290517de24e42bb5aea76c991a5d2e4dd844f8ae9410631eaa709b3a672a9e5cc27dc3a25c582c88204264eb96cfed265bd9152d0978b6b42bd776d87607ce2398237514aa9c6eb8d9a08398a47b44eac4cee14e5f19581856a4da31455b1f534a4933f579ead39d207d01aa12a29e683798411ae4cafe4b1c4f0ccaec0fb184ea5edb692c1a5010d7ece2bbd523af183f041249ca83cf4b0caab51bbb7b49962986881c6ae849bda46bc1e1d48118200d568336104f0c7650ba5b162f8f941959f4096a17ed1749724e13b90202501c94376fcda13c90c04b9467b4b1f8324a33ba70f3ef686274dfddc85ca6f3efbcebdd4a0d402657851990eba63bb5b149911dc49efc0ee66b6081b0ffc046a83ce23c72eb6950b143707ff6ed9a498c10d7c302928782fd7c1b08b7999f8390f9e4d7d8311348dd22b06cf590c6ade721019e2a87827205bdeea91a9802903136fd8decf75d3dd4bc3b0a3487c36e0214c5cc513f925a1701835c03a6d53c8a5e3a41cb66fb9f6e620c9cd578b04d6d266bb94dacda3477da583723d3a0151045a26b647dc8ce29c8d34b685b3018686a07f6c71d08c62141445b6551de9356119192197e60c629e2c65b7249ffd9bdd23080f2c44358f4cba123e15a3a74fe11e3513a3ea1f21630189fd53fc433ff63e2206370551e1ae5f902f4ea0de3e267d5626d8006602eb4942bc504512fd24b70e6234b82801a682fca8692bda88196c3b8af9f7bb2cd0a8e8bdf03230d8ea65f2e88aa87ce669d63211b2858fb60376aa93547ececaff4762d1d7fc4a6cd2441e083a74abf307678015a46b43481a4bd3188c50a7e69712046e59a193fa90b7862c30568f1faebe56f85aec99a141b22c1646b07c5190aef3cc0531a9afb1e6e16c5db3cf94dc2b4e4bb9a18215c67ebf3030b29e1917fcfd8fa07a11806468816ed5d967cd5dd1bdec9b6295d751b82b8c1999a9ab646a0c4364c8245deae361412b6c4951431e7db11c584ff607415eec1b07037b9bfb83c24661e3fea12b0138d6778bc4e2be1557a7ef7d8df9516a45445fcc5894af2063c32e06dd6b79a1e0d5200a473497a3605d73d9cfe1629f5092ff8799e31df56e1ee9474ee80e2410a25c8e1dfed22bba0188f3fa23cdef33a072a1facc5a1a54bb12f9c51f21a85b23ca4652a7df9a5bb49687d571160e39c698542e5315ea743aefb185958db418f7127fb92c43aee7ef8dd0111078570b54b0604a6ecc05d3f723710ba1e71276d835bb1a4de570e21772a938c476fcb61040bdb2553a8cf623c342205863d663c1c01c68e0bc9635ec32c765cc0111bec6ff7723690e7e918de6ee535b41bb3034d4d2dadad6ca9806c4eddbbb6e9fbd1003b90e377ceebd4897fd00bdfda7dc0cfffd429f564cc40aaf747a8eea0314c1d1a823021a8d199ce8e420a2617877c15ee0df6302d48b926213bb46285f41a8283979153d3c43f387f20f1be370781bd1825de748289176895e8e8a917a17eedf4b8b765f97b9a1e84238e8e5c6792e1077349e3f28bee31e59e9956784399c1d5b75ec37e4cda30327b7bf4eec2f666f4135dd0a1b0a12aa005df51cf25e3c5d7a1a80ce6fb460ebf6ed883d1795f60fda1bbe9e9acdb67516cae0699a2bb931b8a8afe89a93ecf7346d182e535fa20f09a59de4e0d5e41c350e7c8952832e413b50b4f7a89d47a492843c07f763565b33d872332af25d10e96011c06f68b06312f4035d44c811ee68bc5820381d6f802b795529a7f10b41d3611191ac4c847b07b60634abc5adffde049ac2fdf3f2f3affacd0c7a7a1d4d17eee182af03247daf63c3517278265a57728b980c549f757083483e9374a62499b4496361b774fb024db51607eef7798847736c40f856bcd06fe95ec2153588bdcfd97560fbb0c5067ef440bc60d27ccca7672e4c1e865ed70329fb7509c0c09d6f267fff014d4542b90723649f71a90491a698a8d24419324338d1055bf6076a8a04816e4aa5e92348964e2609e8d8f85e3afa3c72f8522406630dd62c65793440175671fbe4b489affba9cd29b4ad0cae631696e9c0303f1dc0cdcac2fc7f1016453edc78e0c6b2121bfb99bc204bd47d1b5004b63c3b9316e265c2f83e3566a6ebb124eb05379b02d8982a4f01cf4313b5326ae41d52d81143d7a129fea1e0c340bb62da0780b31c3d583a17d59c8b0d3a67752ebc9d0b3c77ee680a991705181a3bfaf21385bfe76c8a7cd995de421113917d5c8fb546a5e0459d454dbc711c8f2c08b0decb34b2885a1a6ab8989f152927683c1736eb26664db31a97c4de12cd5af8ea308759a6a3187346b74c69a459172bfde02290e40e1d018c5223d8e4d8451fe0bb400f587920e2df5b4b2299d3a230385d705f87fd0be33318533e489ea8010ae6b0f7f222cfeba104da19867b6b105bd4a0481773be21d21bc44fc84ea3ea1630da79340aed01a327bab60fcc12f1d0b604ba8a2a89d49126010e8eae153180c1dc9eac1ce021341289d89414791b069d1d20a6abcf3aa475bfa42f69d2afc28696cf8242ca40d1d885da1f2ad8e2d227b5c6ac05881204d36c6bfa9f8f3412059e97dbedf1def9bbeb1a2e520abd3c9d5b6675e2c7c24862a572ac24a533e55cb113b4fdaa9bebae81d73164e1aaaca49c62ee497035d2e56d791e18e20f68efa5121347c596e6056fcf1e8dba00926be9d9aa608e6555915d88095ff5022f70398dff97e29afc13ea753a9106af850832b5f97530431b1dd5f0d1e045a410c819bb741b6592d991f521b31d8809e0cb362cab39000311a31ad734e1c7eb8df4deb68260f8ddf5bc8022ee7463f442ad8ae67733b5924fa3adca060f6014144213b7f48a0d827c0ec7fcf59d70234728461d5b9a105e1d446406e55a094cfafe9cf1cb967edc3e82d98ff2c9d14ae9d98c4dc3fac5916b071264dadbe464431a539f8377f06a0b8ec67c63c88fd77d9f061a6b658c53e9d84803388cce25e22ab87277d0019335b9de154cb5e24a4583ffe50e81b0a21e5a631fe2cfe6401ba896c4f94f6f736d4abbadd8b1452e57ab6223b65a03c382f44078c1e02bb2018c80680a6fcfe68a9aaa8c32f19e94a080491826ec4213f4a93dbdc9769345ea92e6b01d0e240d4c75643bfade046d5468d29f2cadd9b58c4beb4edac70c4cbe5b61194c44cacf87e3fcd71b078b81d3183d882df740e38c0108580b577a8bb8d55645a17e072261b22cdc131a875a9a05c659c9b486cea78c1f2e73ab83f404922664cfd0a338329459d6228fec4037e74ed14916aaa75d26723222f1aa4547377f0f960e73ff07eef707aa54c98c740aff6724759cd1cd65ef8793dfbdd5617fb55d3a0b5cd76baba237c8e49ac3f73f816a48ac135735b5d2024294304088c7ac43c8885ae7a8c818064cad36c2c76c4419588cc551911729f785ceca6cd471788d2cb1ddb61444692d0b825ff4a06ac50c741b4bcf53aa13ee8fc27c6a899ed52b5ba517067c9780cea6081531cede530f7d949e01f04118c00ed2bfffae82f534507293f9831f5a409f6ba618bdb8e408cb5240867994331eee3fac6580be518e4be34d3e596e2fe0aae164b3ac81cf03bb0cc90b1ca71995602e5422639401239518a3dd3237b10cf8377af70654bf143c2e5d47d45b7e45add09bf02e397031c1b0e836bfc1f4c767b57b6691eee08d8020ec6045e09156b13c8af1e2a81a1600e812afc7cd46eb113a2439495ff89b517f31677a181a7f64b46c0e6e5034ad75ba1512c39a6f0bcb84571dc3a8da92b775837c7197cc631e7c54714b49d80863a25a69b29e783f7e0aa6ccafe4b72846c29ad80afe3ff1bf4f4d95d95a230ef80b8e14254008da69f41039886301f20a48a79d13b1b083842ce18508cde96ee3365f621947370075a657fc0df013fb0b44fe35639d7ad9b150058e0f5f960dd7bf64d682779c1512e796870004e1651e3fc10f9d0fdd57d407b207d0393bda535152f5662fa12046c798e9111b13a99e4cdc84342f509220237579910bc8ab866c940af00f4e3057ebd900dca311f0052bea22f5f2c98c83b73c93b243b781e88844a7921f5e4df33660b1abfdf09063e661a5ec89c56d27fe560083e4df56be434f5f67568f0c94fb813f02f9d5c42afe3ca298b205916525e702b17e550570c22be198f93c41f897fed5fc17f8f8f336ec7977528314cd7fb114932c094938e3cf916727e9bb73b80c4c0ecb5306dbcef43b6b0dbf0d9f0245fc70abd0206aedc7c5deb930f0100ab349c995d20dbfd738fca4be98b8e272276830bf081a461ee3082a263d70e770c234f0e066a456e0bcfaacec745f2b06a4c0fbe2c3d9aa01f2d238cf26e571879680dee6cf374f52c6a69eae86efc88452674a313552c4cd8b55d98a2cf0317564227c4de1e20f8df0e3063530ee3b504096ff138941b6af868ec9c0c3841340bc58dcd3094b83fa3be480581142278071b100d0dd659f0d35f69f9ca8f8ad19552b19ddd227fe83ace31fcbba4853a354eb5374bcc717b98542dd755112af445b1ec6ac78800aafe5ebc523337b44a1216e7db38f0242864cda7e696c1c82bf0c64117aa619bf661421b8793d76f76171b59fdbb0ce70115488589ad6e288706b5f1d6013f024d50edf946154c27ba6712819e980e9703f10700f54bd22061b2eb69303ea9c1faba9b5cd1786f2536830fbaa2640c20134b4ae2585ec4e45e280f01330b5aba08c327194c4c7586342fec7fa6ae9f834ae807452f24caf03cf46ff5b172bac22fe84a0f66e78c44acfca9129884c279e0c2c8b1a62c0214f181ea197d04061e49f68b40b0fa45dbbf4a85cb7fe70fda22539a2278c886df02810fb9479691657af811fb72e82949c53e51174c3f4916b78fd6fc80633bd5a3febb389f5515aadd39e0087ac69ae6948035c1f5c227b44114c75cc76f4b58f92c633771ff9625a32832ee5ff151ca11d72f179eae3c030047f8e4b060b22ff4edb6f902f6bcc94794895538d025bb2b4120e9b535ec0160598875bb52d45f824d0557ef26ef1d0f5fe63bf2615dc12969706d7bc2412933efe055ffad0d5ecc61d9e7edcb774e9ffe951265a86be6d146e13562a4a6f4e7e835055ec9a0876cebbf54ded226255d1ae338ebf58d78248abe7d3a488da1e77c294ca28bcf44f809e2777acab1c47450116b704a4d947ef7d20cbcbcb2666af9b83021aa03f689d61a260a027c9aff25a8b677d67d54115a88a1471d27ac1a596100814201b36d9adfccbb0c38074163c81c2a428cafc273fee41417fe01a28603a44965e0bbc4bf1d502de50f3b0c369647264de9bed3716b0bebe646a4a9dbf58721d6f0f717707b9034234d0d0c57d87ab93894273755a7362f1d5598f619d90aac27a838058924e43bc7554ac2504cdb173e4acea7f816b948c3a10d36a0cac62070613de4718ed4636c7935449658f62d11d1300435b37ccfc1c1ef01f38088c7e8d056431ebd07046080eaa9d86167de0d3576201fe87df89e98e72dfbec0580a2f0f6df7ddf0329133795e819f00d1252cc002121d5b98715ee1df96f954593d281fcd70e2574f581512193bcc34c35962c03bfed741e3f6e0a64c6f39801e815c545410c223b8ba3ce3cd59211a592e40798176e46fff43df687037a6b0d5d44b59372b505d43c7d3a6e5dfccf15db54def5042a76bf5c4f9164a27bdcd03caa9a7e98d44b933821d5871b051ae0db410ad7a2ca202ae9b29456ae66d0e3e5198859f98b8006b35d7258e722303f5177752ae6c16885331629b127865bfaf01795c4539c9503cf1d0d2dcf6213d848839d0623bc46016c0a8005bf3a1ae6b7312ba425f446f22c61c5b7c97562d3cf1c8dabe6243764a0c1dc8fc24c8fe81145d185f8fc708a601e2a9320deaccefcb3afc860e14863e55dad56a0133844253b59df8da442c1f59318c038b68859c140538b0460652da18433b8b5c8e14b31b0d82f481d4ce2c418a91d6a71ee25d3a54f532d5fde61250ff4faaeaf99ccedc5a432154429ac9efc09331867b4e2d8e02b32b6d0ba7186746b1fa1ced36809181404a6f5d1a9f2eae0c0cf8ab49b385e2df05d3490d99b87c5b8727db2cf56b02f983f00e1ad43d09104e4626e3890cfcef2274cbff73743af2b61260fd691b5562d33869097df230bd872b1b92a8239a6f1038aa932c0d16c69f9b8eeb97b817d2ce87d6881d6306eaf8a1db279498c22cd8ec55fc466a28a5560e50996a9f33f9aced512c2c5e7e153d038c2d4e1ba92424f1eae01e511b5013c1486e8fcaea387f513ee4a7030657f4166dc10b69133e34f0770f4309b1856cd4e441a20c8873bea94664efec36ee77919b50c871fa52004e51d29e824bcb7840be0c9bbd266ebab60ee15e227dbcc4d2ddfd172faaf0321dbf4a8fea018d505880abfd7582810eeac3bf02ee3a9a1be6fe1f7d34833564890beca0015c5b6b80375c92caad1018da30daf95ac1ef56e7ce6642b6c8ccbc269bf530830fecb175babbcd5de4f14241e7fa8fc191dd1f931bca8b536de36a695a6022b6b4728bae910eb56bc8d8d11ad6a471a8660d888a7a2baf44f1ca6b94996f2e504531c003881351ca89619c18621af4f0ce98d65f1cb1b7a9dc183e1719c4c1768e3e7467e5509daedbbaa077aecd93cc9887c6101c8c02f1095474d279f7f7d8c0c96dada202e29e89d4490fff76dbd3edc784096c01c84d325524de48972f6916024901db923a3961ddd432113156eadca7f7109c9fcd1a4c3661bf0ece7da92802ec29eb634ea36e3ed2b0c968c8509ecb8c9fba92da69ff347af023add0e7e877700e8a8d5262261b9414a41690fe47278059ce8ecee81b78ba9441da5c9fd7ba2928b48d426403b92cda5b4e79b74dcd447d52ecba976ebe34367fd598d6e01ddd1a47eea4ed7a1bdfeef725583734bfc611cbc08663658c25c41474c79b09019d133b124070e6e53bb8cd3fbe407778bd467ea8086002975434d02bed72a993838442e5346031cca9c29cab21304457f8efc1b258652a35baf98f90691b7fbd61bed98928d1fa6d08e5a1cdf2457fbbf11bdb2c9c5f7b3f74aec4f31a3a11f84050773afee9e2225d9bf166c7d19abc83f9987a2b123b929e9179a21ed2186a3354319eed265110d0c00b533140fae9b158bb93a0402fac08c54552325a22fbc9894d9122f9289cbe7ff7bd5977b46655e3c4a82a1785236745aca3f4dc1efc2221614c6938f5a034434e37934fd5f7e9f74e7910f3c5c3b7c020a1eca4cbb218bc6462733ebd999810f061bb7ee9ad56a2384e85ad70579115abc0d1302c2329a3eab54b35d447295c50f85e8a6eee3e4272eb674fede7665761b5ea9c0e1c1a1f61a7caaf6a84bec43437d12835bbe7bb4c75430b77f04eb60e88be347551a8e3847cb09a65d2c9bca029b762a5295b5b0d934a6ae9d04e3d1732301912e426f297cc633be040dcda0aeab1823cc5ce27bfc0855d86697a6bfe44bc5986c37652542ff72837b7fd67a27ba4c84d1b9769d84dd3d9cf98c72283c5a379ebb15bbc9af6a4a03962e5d48dca65371de6356570335acda8c2dc2133079f7a1f7a367efc1dbea5bbd24945086ee2007c109ccb053bbe032ec284bf9ca1aab1612be1e65bfa8d2fafef39e4a0a597617168010cfd69385eef8262a9bd334218c663cea76c097565356c922c7eaf60c5f1f7aed2ba4910fd36bb7e1dd69290070c590b306b1e85988741c4fdd8ae541f24567454753d74be043c978d04d9c09c8a050de4d9062903911a8f9b420cb14074d9a0a74d487bb022b95c6394caf60bc77703376e3e4b886ec82ee6d3adc6eca3330ebbdb55518ccdcc413585a9e937f898c7a0ecbf115a54af88d3844bc9f0d7b4e4fb28a9a75fee8719de20cd11b613ca35f4d6663164a26ff758d5ef80fa0f07185ac3985c85663e9a9dd82dc19917bd3e925a2ffb307eb6516cd940dc91f962ca7db6eb204c18d921d70df9a17ea39f29f34bd89652851960be203a43276c57b7e09c50f87314fc98a0279e3854d33a1a91e315d7a0af4eccd45221783c6abe04c0f1acf4ade04d380a54504f9304bbd00a8c3071c0f56ce0ca0d4a3c5c9a2fce803f41bfa1293ca5ff08a37f42036cdabf79428ecf4319d0929a773d94261d7beaf6b757340ab1974bb70b0cb9cb5508e4027f3bace2b25c8479cf9c141ef0a62175e3cc1be3dcc4f467adcdd1eca8c48518f414acb4983119fb0d5abe56b6b4baeadcd8799c8ffc40cf00ee0381a67e824d13d410f2161dcc3bac16cac0a04dad3dc6c676a811af8c92dfb238fc6771d42fe83485f69acd1ac5846173e3b1c1adca7543a174b3071ee016c26e63b75da343d24a50b71ff640c86cd811bb3936c3739dcebcc14a17f1ca2cc7a64ef2547810ad8af4a195b20b75e1f1d7cd2774280990af836ab4be783b9d5e879fedd3f773f227fba279ddc73d228c61c0f6d982d53b47ce8eff3d5e367382fedb7c033b9ea1f8767ad3de9569a7b29ec1b355d556b4111da371d7aaa9ff54bc49fe0bc31cacb2c85ae7b23a294e45d1f2797b9a8f5b51b6a1fb298157f5839705a331917a6f88a61e92332f9bdf6836df208ef83039643f88bf9170c6d68216b776cbaec0a5571f774bf2072166d8a2420e59eb67e0813ed97bebc1faba67a51885935f77f543e4d69bd980d144f04ee1ac229cca119d3b46ce5e18a1b0f1c90ebaaaccc25c55f8da44439f8d1197e762d491ef4fe00343e52fbbc34452351b84878c4f1c92f96ac9cdf4d7799fbbc02cf79c9b21b6ebe02532669ac4f0f4ebde204e6fa278eec53cf82a5b2652b20761ffe26ad2ed53331d028f17fde01e492f5614830f996739e26ac7b830680487f8f687a6f512db8c32e8b3d79bdf7521c5620856a8bd7a1c9e11b1a0b46884c0ee484ca12c21e3266e015ea95ce037eb822bc2f37ef07e545ff2b634128e59c6dfb1dc713b45b4636a190fa0a8193255243ba2dc1e4c3424b95443f45dfc960e61c0ccfed67cce18c9c9b1f468854f7beb6d165b78dc49c0bde42b35b6eae94719246b340eb0add4d59e8a5a2c7d723b1b9d0a7a89e52c90c931d6c53d5e9bb3647ed34aad6d04e5cef8d137e94b735730c8a861e74be1ee271df5a5bb59f5bdb58a8d12dbbeadecc35469b7165bebf09a1f4ca6486df43aa0dffda586e83965f743ea17a302fc7826bdd25083e0ccccb5383cb42baf866065d3d59b0deaca24163411019f7925200b86ff71e928736dc6e674d6a03a407b6b7533a9c6ebb5204dd2be66be8768e346af4bc5a7587aca92be6920226bc555c64ae2d08d12886c90190ac037fd602aff493ff1a97b78f82c347a27a09237884820a21c23b3d31c81763ad088707c442817b7488fd10054ddefea738bbc1b7e910ad80f5d9a74da5cba5f45b1fc09159d63164e2bf0e96cda628a3d2c20ae58e54e421d023e97a1342a631b67e54430540c1abf7cb4eb05b9d47d2dd567ae68a275a31029bbb2310eb2a8311b7226729026144a4c1ecf82fb9c7b20a23744c05a8fe274d16619705a12e297f68e1bcdfc7e4f82b53bc712505f12762c3e512a9616ff09a917507b313b87aa9a2a280fd4199f82da042543e3495dfd6ca3ac14f59a631469e54c496521ff808d8160eea103478f5b015118e651dbf71c99e047c65c28b8d58ebfa663aafadb0e9ac0e003ff07ca514d0ccd1cdd03bd006e013fbd3af22d8a2a8124f40b3d17cc51a07f9091117126b1f44b2e33e5a79238b0b2c1208726d92b61446a164641dbae7ec05e0009666a24ee38114ddde72c31c8882d1042eed15729a3c9ec850422f6f5c1aa073b782e72edf51b53cdaff1796b5191799fa349a5238e5ad9fd95ed353da7099117daadd0bf9c0d3994cc6faf047e1b0e6c4e4e6afc810dd53062c3263eff587356276ab48be9b1e770dda04bf3a1a31ccdea72b803f31b88b833af51cef21cc58d37a3e2ee1451eb705fd20b5c096ccfbca7e14f07536d08f05ee5aa3ace7e31a89a11b64585b5301bf38904d3e83f83b269c35fb6304a0c196e2447c9cd15b84692d85db5c5c385fae20bfd311834f08be91f33a8e190a3c07548832ea08ffe7969b4289366999a65d2665ee7dc299c321ce96afa324ca14fe05de1db85461326e835feb925b4a4cc6ca82c36e9482a6612bc0acb9dae0b7a73800f61b12c36653faac531c793c8849cd313901ae2c66cc5fd9794ce95035a3211540470d744512f11fc9174aaa66f821a935d82504189c0c27fc9d0afa444eab722314e57629421170525450b694a37fefadc1f55babe456b3c925684865ee7c6fa3321bb216e2d77300029d2becf2c5f5ecb619d5617f36e24a20be5953d7313ac499eeb4463bce57023ec8bda62584c9dedeee047c5d5b761d220310340853622ec9dea6005a04f1f7a2340485b8b6d43c6656490e0f6e7a02dd8037e83ac5957f586c286091679727536a1dd4eea9a0332f78b12254daa9ed777840d3768b55769883f6ab5f389f4a0a13a0c8d82efb0f87cb91464fc4c3bff8216cbb10a668e2b70af78dde918e18537d0162b611dd8063d5fd5e6dfa31926bab3943f8c482d5f6c8439bddb28ee7d97cbcf413a94201b0ae86f3e4aad48d309bb3e2081bd8fc91b1b4a08189f3cda6845fe92f5b3a1f00e7243de5af4864320dbffe7c910f68d6abd245f8ca356195443a5f1218aca33eadef043ab882fd7ce86d3edbb8e3ad4783a47ad7a8ff83c8b49d0cbc1f770d7531f0280c3a4d5aa793e0622d1d92a925a46f6508c314a03770b89422da59cfe58acab8e9c4ac86fd7178a53934d11483245f5e36253e0c9086a8413902773a87f9ffdc209ec697c81f85c95f335e00c2e60037b6af592b0aae801356f9203fd4b8cffe6b40e6b46149101d59902ce4f6973113edab04740c674ee09386834ef67426c1691af8d560f3456cf9162e7ee433fcf43f2b8136acd2f8e53b5af2f23d8275c3ca18c4d1fbb535a80c725c652c2d1c40a2d62190e281118b38c229b4eedabd4b3659efcfb5881a48599bdeb4d31f6004c86b1ecc1148a941df01f2d8761794dec8a95d2a53933a5917a280c3e955e26305d8277288351dc9d0a9e51a7486642a9a250e328c77394e2a2bd392c5d4a8e692f0e85ff5394c06ee84043c9c0d53fbb6f7fbb3ad172e480f40b05c361968180712da7933496435351756566a17e0d6d32e11344f3efab525a2895c70e0bc5883463f202cfb6fd02624a0898847b7bff9ee541d25c70b55b7d6047e59210588133a61f50089eb1b4e056f69351700f973716cebfcae7d90209eae0944b821e1bfc195e040b8d9549c202c38e54e705417b7b583673fde54cf419d7e4cc5c49b92450582d190b4995897c51c8c6e46d2d280ff580018a8c64ca25a1cb020b11aa58507039019637783acab38fc9762007746e06785f4bfe61c906e47a58d134e54ad36b247b6dbbe96b97a8b4aeb5c248587b0d27b33d1b6ccbdf002bfb92265e14af5038570d3206b33669b1d699801970fe4c99f481d99bbb030bd14c208ebfd76001a46368b3dc6ce045d12c05e0a03f3da48cb75b40cc490fec0ca720b1e7a6d662f702cec333a8ec747af6a86d92709d1dce1438a64fd7d633282a3c1897923f79e04b60ab2e7e828b6e3295e37119af0c12bff6001fd9d4c37e068101e1c67c5d2b95a4c12751af47178476a4bf4dc2197434adeddc56de8a2b45a08327261816e961f8f781a3deab90098776f453f601456f509146226645f8f8c4ff1b29abec7c03c68dc1487443371473f36303fbdfd258fcca0de9cffa065ba41b366fac4c2b44128da207481dc65db3c6fdbff83f58e357779fde8d30fc2ca90b850642f9ffd15c288f949dc1860b91bbe34ce821d47f7a15369e5a145a41a59651ba12f98384d7093c10a4df6e2ecb2df18bd296bd7fe9e6a3136dbf15df364fafb590cd38c73926d639f1f7f08873f65228c4a6bc963a2898d4c01efd987cd1c7255111006ccaf3c638e355096833f599545362ddf26771dc38e539fe9584628be0c578c70e3fabf3161ffee35f27a03d68f172cf4f2b0b3c44e0e98125fe706371bbae525893694dbac84421396f13e152d86abaab47af5b5510a518f4ffc3a874aea89201ed360490eb6463d212b008ad12723e866a4537d59a1d582407126aaff3a41ada22f189c5fbdf6473a5ee7900c06c192dabc643da1f6f750c3c2fbd27f7366ef100d0cc936909ebf43d454905ea596f483fb037d8266ff4bae1b296e84918875e70f3897b678dcb7ff7bfb3c607f8bebf1b61f853378bbff6c6b7f4f7bd916de20dda3774aa0512529696c5c5f1e05fbab4ec36fc63e320cdf6a301cd792dc984fc1e22709cdb7ff8dfb433be426d8ea0124c39ceff205c3727491d0e6ec19f09cdd83384601c1a9176dc6e39c9f2d28b68140c2d7be79d31f1b030fe1227819f437b2b53426b223a9dc9e8b2ec8728e3ed3ca283ca88f05946dc34230e9f927ba5e7232aaf9c0f69a237627ddf88ce73d1b4121d14213aca7870ef25732112854334153d75d72d1946257666d86c5de551ec8d3f5a58565e10850057c77bf547e9b086690a2dff740f526a6fc4b0a2930f72565d91f301a8c2fe047e5e8a00ff5000ec9f0ff9f078efca96b5f85a06a25bd1f0773e4ad6920339ea5da635dd61fbd7247143a41d1bba2387ae549d4dd76af9d3bf3d873cb90598566e77a29e1b041a1635e24966f9b1a9ec323d00602bb48fd54ac483011a74f4c1f14b97cddb7387e6015edc9496f3756bee83795ee7d5898897d62610a9822247fd605a85da196316e94f678922591fb53fdaed39ee0ae3ee5228c4f43f936356a81c25f8646c030768ecdb6ce93263e6b25004b330860ab9232e4ab2743a2b2bfda4f01b0d0e60bda7e015915734f5e32a2a8a0f7b653267e918bbb8ef9a0447c28395a193ba7d55cca60217383916393e78d3e08f591b886837e2a062ed584bb4dfa3487487783e9b1a203a52189ca2b64d73f86464e89b32e2c150c1b6ed9022dc130b7bdcb9f79340c6be64498fbe2bae1160d3433ac711649db581de604c4000fa3d904bd198e326d2d94bb61931a4eda60c98bb2593a0aca18ff4f2028991b5af1c7b6183d0affe49cf088f3a3dbadb96a68e826bc2993ca2a975ad23c914d0ef1b1d6cc074c8e379fac4e28dfded8a9b68be357cfa9048a5f51b0e079546c986514650064224891eac448e0c7b496f85b91a4b15ea912e6965bd2ff6b69bf9adf92b04ef267c7b99442a3caad6736aedc7b013c18e9e6e9d4fd347c1836061b1adf502afcb3477451ec92530286b76dd114cce01962f5051a44bff961741f3e55b633294901228c38b0260ec6b99236d99cd91654ec9143349ec70cc10551cc4a01e5ad354d8e9bede54db0f6e4dfd42dd3c5ce87b7f11b1956bb412a0824d002a21f7bbd5e73ec5ab12ba43d344640edb51ed30aca8bf94ff4116fe3c1704a52d3a3a9a4b5de02dba6249cc8e340cfad4718bece9a9acf904adb597ff3aedd25858cfb4b103e4a97ab362c601185eca13dd8267cf4e782e45cdd16654126bc725aa08750d931d5dfe4417a79e8b43c673fff1a069c6d33fcb1f0e52c3fec42bbf0e3d743f8b4ed45326f17e963e1b37cd604ac2d1bb305b8af00056e0e1d649c024884c8e77b2ec49c1292026d66ecbff8c15055cfd991cc6c92fe8cf5b144142a3a5d00897bc7ae2bd7ecf6f5d94b44ef76606efe2a02c87e0eea3a133004c20b1b10af0fbead7e023fe7c7bdc776d7106d95a4e51df88d08e82fa0301ee971d165158381e243a2b056f0502178f44721949655f6084d5920d7e4407b32303acb7a8980327f84c6c28cc1b15e1ca26d650f0e84df9d428f8ff296a321afff55ea83bdf2db3f2c44c09599203ab30087e5d80e54b79c0dab085113580d4abb534081019414b5d60a927ce2f6bcd280059c155d7258d1eafd28d476f205f8d9eab3b2f06cc9e9cb08fd64c3a7055bc5b5f1d93fe9da8afcb8005b0aada45b5eda6c88f4e319ae78e8c0d7906226e14a4bd3618d3e115285dcb0488fc1d3f13113f0a92ea06e96588ca1e0e0e8395b1398ce8513105ab5fceb804903251d09aec18e1feb40966f5d55a84ead7ed7fd4cbe3a378f522107ee97985d6f2fc14265c998c8ea52547d075778093b0c5205da47b5c776be88f11738472036651d7f78afeabcfc77c57566398e266cd2cb86b9f9b87a05a7ff25d4a5e9a4577b6f0266ede04ea9e2e65c0702601d1369b492279c0f1d5872b28cfa04b6e22a0f512c62816f55ff4d018f94d01499a5c115f669821078f697e7aee50a75fafdad31ee7c11c1185e22fb563737441c7da82ad49fd4e422afd2a2500914922b2f48c60fe7a61334e282ae8d3ed1c6c7528d7c98ce347c91c3ce3ccf93de298177a5811d97a3a3f2b284624914a615676c7b2c3be6b6f8b94e6689c4977eaaa04506e1520cf77b57bdb18f837724fd42c4e6f19231c5050df197c8dd8487d6725bf1b88277320ede446ffdd88552666da317827750613555b5ab066f183449dcbc2a506c0311847785c0e121bb0830dbcccae13d8254637e8843a1fc3acaa5dfaadb26afa9116c599f1173dd6fe9bb03c11f87bbc9d20fbb909309d16d36b80bd711ca49fab9c2f1cf35598156a78e5abde35a9c9a3ecbaf4d358fb72208af9a99c32bd352f4a3a3477931f84f48089e07e2bcd41181414d34a00e628c3db2fa83934d785c051921cd24b2fff305bc1f5c1231e8e0d6d68840e0fad59294bea1e13df6978da7c7e113a9fa28c619995cf02f015aefc8358a0c910ca927dc19e6d69ec29cebe57d644f195051f2989ae95c33b7a1114b82701f8911f9c3e2d3aa540c2d5b62d893b2114158d194a2ffc89401342d5d9653acec69f42fbb30ac1b4a385b8824e6b2b8e557968aaa1576f910180e71178d646aaadd70353e2046c7b1e1049254ce941040b51c34d294c33cd60b82488937e198da45023834bad2346437dc934f390c2af4d4cdb18ef14e5a37570b9de81d6e2a1c3a2ef8ecd9284c3023236c5721721557a44a2630e783088a619dab7d6749a5f2ae2b301420c28f39e66c406baa7950f851562b972f9c08fa61cc6bca670fc450d686d427e14b8964d65aeffd11f1262229b3f2d2e61cf6caf9e88d27d8f0b547108778a6cee9c52a2435af39cd642751632984d839aff9e4bccd0e9accaa0f37ad980558c03b28b0bf198572bf629c291545dfc253c4b7ede17d16bac35414b601db3a1e43406034ae36622fe37091c12c13a2b64c00c3988f3b815b4eb7b59e10aaab0e9c2f80ab610f79b307061425e3354b302bc0952e1a5035a433037695b3963c9d53f88f12904f926d9ebfdcf1a62395af98d6757dec0c2a0905c5c04a19a25a2379f17dd08186783e2aa6a4f670ad12dd8f72df7482fe4df5a132425f89340317465e65be491ecb81b445c6e6ce53f5b61e18c3a40d73be5a58b46dddd882e7abab0170e43606ab687af0854ce9b13e8570d2fe9b780d02747614b0098fbe4644e1d9b1a411bb35e4b99dc978880851a391c2b9ce509e95250db11517a9d11c06b9c852a565a1822a2104bc57edbeed648765f2733a02bc56ac594c197955b59fe49126bcd85704fbb2359b31bb1d77eabd3e104cd0867936d94d35b61d79ec7e0e67b1f8a248055f9c165269b1d6af13772070f8693567f71b7bdf9235fda9014b94fc007da503b957aadd3ab4781850c3a32607117da9a5ac3c3d821918f3491a5203f04df94585f14e9416018d717d7130a86164737b4e486a3d93d580c2303fe531d4013d0fa21d22d1a533d4d6af77bc34cf3ef345b6be6b86785b556ba477ef61a9149e183f9f9f7965083efb4c6fd987827855a7a145c59efb73167977ff8874197a57ca708cc4f87f0e11d4e7fd410d4b95b9938de703831841232fa45397c03f452c02368eb1f53a146d05a2cce022f851f72df9800fe5424ad0fc2b9b832a57f875a048ec12196825f71c0e12f7b14ef859726ea4cdcb8cdedd7e5ad09bce6dca20a3a8f0004f8c98989fbcefe4045635d4046d205fcd9c82e209f76efa99cac9fe540c878706063cd3bac69e94a061dcb464e847312478d68a0476b329c40bb67bb99f0dfe92bb863e5a435c9315de2998449cbe4e8fc77d87e798d749c19b8f886a1dda52f150104f4103b2f190657785f0f98ca3f88f9b9e14cd346f648eb2d39de60ee9e6f4a2b161a34933fa6bdb21e335049b7d68b7d31562aec07e8fa522ae92c24d4607e99d27700cb0e97fef78dba28ff56a99ea2f650e01ccfecfa0ffc7a63445a00579a0b99a7e95c337f380c333bcd0490e312fe4345c09ae4e639421d015cfde8856ee4c7aab401aa1892b9b829f73d6fa5f9792576465668bd7adf1cafa24fc6a917d4fa51c9ba610445660d24bf37fb1fb003006ddc34f6f5a889b08ce2225b6619b4acc9c8c3deee946b844c73cdb4a06b461ccae6f1b1712568f1d28580ac72406ef18c0ad5438c0b10c54fc6d1f7b260ee9e7a031a96ee3a7be654c1d15747c09c159def04ee86a932543372c5c9e47155676420a88abb0bc257efb66b193ec502adc3b3bc650684adcde1cced0d3a3bf7a9a47bac89c7e1c8e656602f651114284c137598b128c89e008efa1e250a0aa09cbf113c03b4f4a4b5817cd1ac1c0950c7ab4a0dc244e2c870fe809433894e52b0432857a49717da6b04d34ceec9e65d5be055f4593c198b2e72ac02079578e81193df54daa86c8986225bd10b44124341689a85a71b86e11807151f9639e40f33775df3118ac460878fe9290750cccbe517d24f5cfe548f725536111dd9149635e6fe454595fa55f8cd6d681026434ac17e5727a31bc914c31c7a88d50995af418244892acdf01fd58b1438ece69c883a96acb73d228f3d289523c1b47e6d58eb8cbd3ac52b9350b8298bfb1de7b53fbd8fea13c7e652a91f081d691751ad8f82139b607c2cf302a85e76387f36a55bb08c1a9d3e7f67c80a2b13ad381e3a356eee66a2c8b99b14e09d9092032c9c51a625e0713a49971c77a999d05ee849025ca76a19693339887470a0ec17c21ee850fcbbef9d7b8cd0bf17c797119bdc97fc9a78e09cb814fd109b910eccc3a5443f504f236b28b69b1fae5ba3b8d57ae7b17f1dc7d2cdf3c33ea88a3d073dbce87109417813203de686d05cdb6c52b4cfa2de6673cc0554922679f27e22a6aa001147d92b1e7c78634dce944f421857113e4c7e3c10f6f43996c6c591716ce84335dfbd92758e8a7b0d120913e309f976b27b88e38bde00fa6c7e17d01f8c8d3a1f6f2f0ec63c5fa0241f2826c87c49079536fa6265b80b59e8d25fe11da13c8f1e472ae43cdeadffd893f072ff7cb6fbb692a478939ed8c9a9d60a468b8040df8b257c9e3d0bafce0931e117c41fc0cf43ef0eb989e6ec947997669304b0c8e8407774a08fa16fdb326dcc2db04fb786c31d8a1580655f4364ae521e6bbb0dd13f73fffdcc496365e6b943784bccfb66c8df508e17fd71cb8ffe35560453ffd3b0454342d78af0c076a71df13221179928632a05b203d31cfe26e98ba69a41dd477320556a3ccd642cd03b8ae90e8866081244dce71a9d29736fe8d8fa45203a402ee3c0b34d7b82e863dc3b86d875882105b81574304cb44d03fdad8f6fa2e25611f5da76b041976f17fa03edab26d3d8a238ff3e64e05438715c9b22272e62c72478cbafaea1c53b8ed7345e506822e127536d39ffd7f46f4acd5bfd69c9e6b66f18ec6da92aee556c6d8aa3f6aeacccf6cc7412f3ac052368f8c66cc77e7b2d3a208a0ec48d98a2a69c03ba6adb48b6b7847658fd65934a7fdd69fa18368763a3eea3c0f6215d80ae6c6cd3a279595f8bd199b29b53db21f17e887dd86494ec947df92a0f16276de65dd4f7a0e784655523f7d445081a9cf5bd57837231ad2e75922de1c7c13d424acee4325307498e06a5c37e3722f011341e23c6242888533fd40d4871ce8309e225f80051f0d89b582f2f04ab7c6c05d09738713204d5db912b01f170af62c4df54a727ef72aadcbb06312464d49cb78ff036e301e2a0bf6a05d4cf3a33a59f527fb80782cd743d64a07f05c402fa4b4f3bc127b9b756c1891dd0bb457085dba099fd3c9efc9c09a0a915725b2c5b18dbc0f61fdf37cbb52f80446b62691f2a6d27ff339a1bd948873917532edcbdb5961a5c565180959a82305f1090fec679d94b3d180ec598128c3824cd0296bf0ffec6246ff77b2309d6690984d724f4321ee9ae96040ee3d00f7715754055af82626c0eb2326ef52285b183c8017a8308b14e9f3aa06c4dc281137714a53db77ba305424afcdc284b12719cf050069b9a65b66622c91f80d08378d4794230e8b11fb1010d0b15fa2e948b9bdc4a7bec8590dff725d568b71ede0ec0dfbf528e21aeef7138e8b827b08c62e6c4f4d4985332677d18a4308fda1eeebaaf1c19c4e26b2da91a0134759287993cbf04c12f36e5733278cbecd70ae77a242d6dd1b8628ed3d81ada4d0ce7d693bbbbde49dacf5c0ac35a3cf8fc1364ffcccd6182aeeb4b75b3381024f615067d73ded069be264e5364d1ce08c5562d1703b54527116c72894934594a2e2501c7e2f41ca5c098cb3e48b1815e7bfa112d3c7277159af8d0ebbd7d1b34f75914cde1b1ed81b813b96003272c203eb78ff79909953f80af48abcb089675da0be14f52af29d0adbb419be1354c965fe908439febbd692f6b0fb0e30212bc9cf04b02eb0cde863042207e675afe19d6a5515789387ee1ffac33f31648b0c83f990066fbbd4df09f949669ba0ed1086667ce659001f0da70a1467b4cb0ffb9ce92515331451411e4491afc00dd50feb913edbc3defb381378241b2a93cc712cd0c59ecd7fac5fcde594beb2c71596b4c0e7cd926dcdbe37cf06fd6f41d6d16f1bc2cde40338b0ea1c516eaad892c4dff4efc9d347db42c1241d7e74baa18c1aed7ef7869c0979493c14cbba210e24bce31c33bb10e7819553a0d854a8882f23609b4a38fc2e164caa5cf8c80612f6390c40a7da3d7eef8044cf6fe02889f7b31ccd9060597fa539b563a1c9a99ed5b759741ccf3814daf2963d224fd8e041e398b8f5399e13a05cb288e8e2ed7e585c7ba9fbb302bae54116993398aaa07e1cbd1fe7e630528f0296107904bb30fed8e23fc84a109dd246656b059743659cc3a9e694d2b3094108ad6591a71a28ce2c773ca15ab46f3fbb96b02c837b2dcfc71b9aa29bf9255f3fcff4385cbdf89bc04edf78988ef0c051f05bdcad6bdfa4d371e98da89e7d25a2ef4a4890e3d8b68b76b712bc287c2c0f157354041e77990d79a5723f1973c8f7fc22f706b88df9631bede1de9e927311dd38e2bf0aa34bdcb08da80f1b4ebe51a3145a4590a015dd7f9aeef6a998fe785028e835ea22c570ec415c3aeeb3459329ddf7832e9f2463fc75838858e1b3029263a394e6acd730662994f49cc128e028dc70ca3a0b85b237b4de5e3c4e33350353252fb84f95c7f64d0a9fcbfb731655cb18e9e626196c04c8f11c3a4c14e92e6968e84628f71a2061fe2756232e14cbc38eda703e39685b798f4475ce5e723f2043127fc4628d97bd1f6bf4b5156acce0da4a1a8b82ae08e06a61d1bcb33708c1b91a99df5e0637a0fff41995368846b119835e3da1606ffef888e76402e37604e2d98b4a162a0991b6f0b4146fe09ee7cf78da09eeedfcb15e1515858205614cc3bf6682eec9475a8f12283ab3d5132f101b98e8085345c21e5ee8a91ee6788ef4a85f7969ce8af50d8aec01ac995d74433c33bd927109e5c5199a9e28c8228856244412281c628f7f6df500ce95737da1c4849c0ca768c8c8e1b3fac9360ab8e96b56323657bb7e6a513c031d12bf2d0c7dc278644c66652bc1d158575e8f8cbd133a497e42720372319a535adf406159383ab33add71e9f68e9099266c04248d7f8346f12ec93ca4f14d58719045ced9f4cb4039e315a1641deb59b48138d3b56d02e2ee290b4d99359c5d65d8054fe1a4d5924b84818dad488f22f2eca8f7a31de120e6f26601bcb6561da9714247753b6d148e232e3c9ac43af34813b049b99b972c862e45b4b9dd99d97f4e01532583aa10010fc1020c608fc9ef18cfaeb8c478c8fbaee3965aa8fbc0b732ce7a24362ba11df6350e905b33b1a2a9cb49e391c65e3ad77a2408366e5fcc92e678d4b6c67d5aa097fe683e639c614faf84bbcc07d176287d5b98ca6ae9aa243ed72914a4d6f2f47e9b953df841e3db14c7a0b6510c73e6201ec0d13fa37ca5ac7d2977cd3f3f830f590b445294d12104d3bf8e44ca73cf0139105f9bfb5eee0c8617f25d3d77267d33c3f038059f86c695f2e9b452cd9bcb56c09f131cf6416a0dc41c20116772641d8678d4a43af086bb3d6c59ab802fe41623dcb521ac706cd25027c12ac2daf313e4694e05c7a2761db82a61f346dddadbf6255f68120d9521aad304bdaa6691c89cbcc3c7e2a36451978d0b381674556fd77281f4e7bf6f5dd21d811fb556c89a5577bd3e776b239c79b0a991c5c2989bbb4e06485ab5c6ce3cf75d2ffb498d5e97e2508dd54199d79a46b0f4a88cd3b4067ca91891acedea8c4bd1d6ea0899081286ac1b031751e2292a0cadd01ddfe8a78a69d348c6d748a0b58e4b2645918ddde18b0ff9b7144c43f1e4242b5f064f1d06ac57ee26cdbe9fc90c85e862102a995be2da9bec6712678d588cd9e3c6b787c9cfeecf3ec88086c70062bef4dd0c6f24e943521bd678b97c1ea4fd4babd1e39abf82d3395e7e3555da38c9be33b9f3a1b634fd3c03b3c82004fe565bb014f26464e59da4789b1df11e561c23a5296e3dcea2c244b6b9b3bbe1db149affb713b13f415adc33d44d314144a31b7153871085193e7144f7b7ddb3070c5cc1ef68046a5952dd4604ccd11e5a492425320143d43cdc263490afb718da6803aef7685c1b4b40fc80bdcc170d812d874bb63b34ac3f73de8a7b52e0c4b7fd274cb3e48dce8185bab80cc0f667caed82842a9ebcf89d76c44d334fc558cc685fb9dcce14384f83933d0f78bd14222737bf615dad0f80d63a68de70bdbeac2ab1c69d94c50e625fe5b5ce118562f62d97f2102f2c84056af635fc9e30150a0649cc36f7b139e99a87f00c096eafc95f3995f9cf1c9370a6ff29102b4055d22332bd490ceef8a9f9c4a0feb54b8b3a1a3b45e3dc3caef0f4efa92e7b155fce5a523dd16648274640ab4277f513ab47e277dd77b52a1e195caa5d537d1dfdf4bfec00f46ecb301c37e342c31ec264e69d89a57d87cfc14ade9d3a600a9b29200a2bfd3eb11120a32e1f883fd304aa6a3bb8ec2402234ed2179e360e1b5be89df8862b5dab0b676db3195ca309086e68f2bdf69c7162f55ec058c9bb12e48e6b4bd584c4bcf29e4373088632af5607737fb097436b793c743365a15415ed1a74045c4d06acad2ffe932ead968699da9d7d1391ceea9f348f16252a0aa896a3aadede26f65cc04b65e8928f335ccfdcac84089a08b49b29ae5cd01435404180639f6075468c6a2315fcb8652ecc5c0d2eafa9b58ddced4e206d1db747f4eeb55b4876f8abda55b0adfa1eb6cf7ec0255068ad13a1a5530e674fb1f743fc42f681e796947416f04e6f7bac962407cc74a6a4655e851962d7f4ae648d580011a4febc28c14ef79fd392f0e42d8099c92cb1c825ff7099bcfc4d2ce65d44b94428b0e4c38815a0237a71d5a774a87e259ae0b3ed7c66619d2e39ad6892107673b0a2a44d6b9a61f7a82bd9bd1646573ee8de5338f58e8cdd40b19a7742d7701bade58806666727c8ef18acab7cb976104dcb90a8a2bc27df4702c1bb13225c31c74a833d9302760e08ef1b67e13aa8b9484b59d4cfcdf24a0b061dc751e06eb932c0e1816f35e56ad43bcb7b3656f2504ed8bf453437be9fbea24c74bb274674001b2f579f7d2925820bc48469e5d70361636aff2862534e009252c1815984a6a28ca38467d2bc1b8b4227c8037dd7b296158553f9ef51b530838aec224f95d1238103d78e60844be1d8368591ba6d0553369a0e47a93397a54ac09ad43a3423a6325b5546db06430b35d58029cc24315383e6a5fb5289aa8b99eecfd91bccde7be988d3ffbc536edcb39afd90f42e23c9e567fd0038cc4e7dbef60e9420dd9f285a3fba0d6cd611d516db300849988aa7c2fb8a32b52b24cafc4533a3d7e1af2865861d72c6c99150a3c7c796ef64feaee051330aba1f8150e135a51b53c603cec1d1b3911d2044b0eaf6640ace1f2d9e26453a631f31fe00613ef4b300e713bffe23593e40272fc4e5d5f0953763797016d4eb5f395f3eb265d2916e10e5cacca8588e8eb61389f1b37885544c8123af7f7cea2a5dafea7efca0c5241cf9f788553ad72d5291f59f5c9232061392fcf57c82793828ca3a8148f0800063b4341d667a970cc1b768a93bf4a5e322d1b83f2f201b1965eb416ed9c9e0e652d52aa24df32759560046bf182a310d27c98063076ae53c789b313c483a816b7e738407bca283246f858aaef705d907f5330f5e423f8b89117385255857fdb76a88f9171fa06cd54c91b5d0a15e7ece489f6135a033cb817afcaea9503aff60027237d6a0f2da77dc83995d1759009d12b7c885d2705ad0152bf7f058fb2f6174c0177250a89842bf815102df61f5a3871cb343e9ce0161b90cf014eebe6ae6a8578a2e80fc6dc62884852337ac2e3155198b073aa5d2089eead62609b2e5288a912553ac094d005973068833f64d6084d6173578a1d1ecedc90815299188a40bbe89a1c3da0cd59e7cf39a271fabb83e0f9b0add581f95d4541b39ccf8565c5a52cd308b1a8ab4c133f46fcb71638cc06b22e8b0346a4836839c56857f27ec2dd1a5266049659b20c3cef767813047706cfc1a6987da0e4c1e613c9666c1d3fcf3fb89f1106a407123bdec23e03227d4f050d039ad1492110efe5bb556d0b3e78b947941e034df442e3847e3e085ed1b3fb0809dfe9e130561a5ca56e5f67309b0a119ba96719821a1fe16eb590ddd1b1870416b17ae7a3adcff35f6356b7aa7b490c688e691c9804b002366023362db0755bf5e4449fc805f7b74f78a3d0d73b56471ba1ca806e135509554bb05a869901f599cb873c510775b8110a28cbd28fafb8ce78041cee643d2a27d6217be2ef554389b2bbc102597cda88ca72ef5c58c84b92708456b5cc0d6c45b41acf9c1f9f67f6d0e6ee02c0c58aacdc370b6e47d6e644256811f3c68b1060eb4a44dd215f769957bc615131fb1e82396938c15354a86520a3f556dcf6e82c7e7eeaae14a2ac2eb0ee6ce5c67eae02d1216021023728407ccd969de2283cc77f8e3dd5a23d16a1f90505cd324cbff5cb49fd1ed5ddd5e5bfaad283f5099d30bdc3183a318c82da43d2d1224409b65f7a4c9c97609996c0fb2644dd19dc0e13ac92758396445f417789fb125bd9f19dd98b95fdd4a5662d7d25f1efe529b38f29198e07b6f920147c22b835efe6cbdd8eae8876442d54fd03b649a9a7a2fa4776081e957d0de9105847b1d4c3880f7918774655a451be3e311ac3f4d426467e55280fa358d9207c922f071d08e2076fc2a9e6d9bc5dbf420ec5f424a254204040fed559662cefc7b8e50262363a1734f22ef42012c3d7658d5b88160becca925392613031306f3926e6e5687deb90d6045a909351a497dc9b4a1da661546f5339fa9cd5813493490ec6b8ac57f4b8096fdb5393f94a7471088cace28826e33513e1a0181a797f215eaff731046e366ad546517779d95ac34245059ac1822c30d4c8fcfe442da0f1a05ab8d191d7c2af023da93a2d73452b62b81d84f99e54c7c5edede2bcf04b6f23ba0e05d9650b9b9d8ed6c6bc5252c12e78b298e9e53fee01f759dec13fcbb68ab0e4e863b0fde4ca7dd6613fccfbb8288a45769c77b9b35546e725b0d1a160ed21ae3de11ad1e9f7f42b1d3f6e34a0c0a5a5edad26ad4a65a7fcdd3a5d41b7120004d10d9ad30c96835e984cecd6f7926cd62a0560a801d2390c7050d24cba81fbe37795667e373aaf9d50f3921664ef6446a5c9c1024ea17945647b326dc856be7f0a769e0b733050026dff1e09d5d748c80fd511bc45339bb819b9d61bba41343b89afa39df229af2c0d353aede9aa1870ca6cae1a906eb9b961760a15caa88bf7c036793ad2b6cd90cda1daaa697224a9564dc4d15226c81bed198a72fd99e51eea9cc4603c92a00c2e53f1fe353f68aa9c86bc71ea36bcdfdcacd04ce0fb643692c4f3ab20dab0d2f6f2f57071e97362f961445f2232482fe0755fde2d21c08b497d9bcf88b34fdfa9c1df6b9417f1f12465cc9580fda241d32b6ae6d2324d9e0b238f7a72b6f731ff48877400482c9dcfa950d1d6e872c44b428854af518bd9c3a0e4570eb64e0459e71542a408ce1a3deb22402709aff48cf746bd2c884ef2ea50aab476fb5b22a24e55de89818f6665a01b16e563f9cf2c388b99f61716ef0a4474dc4b1ff839b5d1c0d8102142320191feaf81e7db16dc9e1bbc5d9f147783111a1f7fc5c28d280760e76b242eb444126dfdab0f768096b34a4ffa7dc84d7f0c9a2fa466dbc43308c880e58eca8d7f923dd41aae1b48c0d5c7c9d77b36e5f421d0d8aa8b6ae9632ee73fc340f44df00db6c0b0ec044398a0e57eb30d0dc6afe330dcef267439f16d4f4f041ee1532804cd8bf83c0d5fedbad9acf0f889630c0f8ce2bbd33387749bcdb63cb526192a0782402de367c5f6cad5d811e5f3c7bdecde2dc6b3faa0cb7818c02f04385dd86bcfb21c0441aca9b78aff7ac559fb7a828a63521a5bfb42842d5f3f433a25dab462a441546a3ea799024744c9a29d80e5b32e7f143326f70143edf3ac6b1044474ef566c00cc45ba27c58da7263c439fca6d660b3984b8f34f075f8a8c762add2a6330981cf3ae7d8d30a9802f946811912f98019bb51e1143fc1742e16dfcabf52438cafc45ac0b8fa5971796b6a39892ad58b336ec7de89dd8fa56ae5e93026f62a5b8c45621bbf44c813bc7a14739e22bddff16467e58c71f06d8f4a6db209ab50ea12049d39ba4c58818c51db08ad11e543e8436628d5e2c9a0911c3f86b77291c93b70e6ab9abfbceed096ec7d2c5bed0631fe785285d08ffe5c062dc5e815b71579fc0545ab43565aef5f11aa9721ef8ac6f3c85c88d78721b78c1a0d73e981f355c0588701a486a4d1332c813951213f13281aabf956db9591584ee1fc86715f87f421ad193a6376c29322c9d9100a8eb1ef1081967a8abcb151faea8640b4ad0d521cbd611911639fef7d0542b4648205008caa00fdce1df2e8b85aa1694fa509a4628234b19a0bd0212ae5c293c9e946772c9d55f12a39f4ed51055351c7c012ce2a7f9d6877c9ccfa71c3f5f4ab90d4340c1e2d583981592550810aa83f9c4cf9aa7b471ccf5517acfe9d6034e59c2e1fd955120740da44a401f191559e7723546e5ce2180030b92af8fd7c3ca5e9180269e74394476a32e53bf8c2fd59b32dfe15bfe2b54598bf65953e5512bb02f230af5eeb93aad84afeb086234f7cac5b6981c7fcda2741aecc3329a73c05300d9c5e1e2435b3ce7a14f6409525ff5b9f2470b7f92025b83027025b51123237616adf71a850005861f4f680ba8b1156504c6729f38482276d83834b29f7e1f4d43f9937d9496ea9375ebb9fb0c02f7f1da287470fbe83b77469e33b33b0d3878283275bc20f937a11dc255de73b70caddff675048e24531d773ac8eb7477f64678db1b9398350b867f064022dee4381d71cf8127372ab8288036d6a5fe4701abc4eeb97780343b2e4b421f4db4db114ce7b74240922709cd11717a29805b300cc2a1290d476bc5b58de6799e2fa53feb7111b9b8150ef2c0bef9a3e22f2ecfb66685c45d991cda29f3da3696eab3a84a8a73a630320cc8f70afa35002d327842ca2501d35eb2126df81647b2e6238489bad955cba9d37aaf8500cdb351fb11bfefe23ce9cb7951e0330d3f3ebb73898f225e59098fbd6bfef17f1abc39fb726075b614dc890eda41a59de7ba449d2cd3bb198a08d2235aa77a611d8d91b6826850f89b59428af3611e0e28e70b9a1c1e4aa40147a499cc9cee0ce48fcd94f13a971f1d7bb244fcf063c4bd381967d3d6b45fbd1620ead7f807a780c0cca28f8bb576834394aff83c48c18b56e3e5263624f5a49b8c42388869ff5dce38f7d86a6565a1907a5c062be4062b4a33fee68d6692f2918cfb044956518b24ba6e2dde2e70884bc5dc85d5122c00766f525e6167d9c91db8745f733e93670672e68593d13d07a0444268483502c1fe2bcef7cdf7c2e7f7e071e6f689e586dcb3ee53ae0c355cc29dc922e50cfa14163e31d99ca6463024df5f28f99af83d7de88a7428a512dbea9c141631e10712be4003386a5bc9f697a017110ac3e09a60f10ed73c7f4d929837e0a3ce068dab3e6e512939bd675a337ce88ae4b6d2197637472f52608df45ec11aea32fb814573a31e5deb35039620d40a84cc9a850ce307a720c63cfe044a6fd9f2ed4c2736c18ee2271f31e2bae2ee159ab26d8485b7ec52dd7c2c35c2327b3e71e8e06d5033986cf9345028bf92016bc5d81447ec90d6ed3c48dc6545d098e5505f35b6f215c588a59563241b6fa174b761aaf1246966a41d0659403866b888d9fdfce2514ff9da24fa0dbf96642cac990a111a58930f8a7442ec9c96429fdfb32bb08d809bd133814176247878a6088d68b595174bae788f8afc54224b5a09ae53708764b88f554a160602b0956a50b01cc2b7dc59f45d99125d84a69531387330b44ea7b60ddc5008cc659dc2f9e5651f3b422df3574ea0c5c8bf1c115b4044d30607d722b04b0d7351efcb05bde66e4beef450d5528f5187aaf3034daea0e954a5ddc03b1c38e6fe938add3001d77cd8c911224f6ae4190d1b0930bc43dab1d0b28dcf4e05ded8fb56f52bbf697518b696dfa5d9a1c0972a036b2e5fcb558e3a0a90f6fd204760458c7f5a0abdc91c7d3d8e556c4834b574d3f9b20a23ef678c56e6d588a05c4f835509d958d78fb301ace1a0ce6a9a12b2a5b23ddabb5b28dcc32ada80880b5f190c750611caba5db8b3a757bcb76f3172cf7dc6261a50939b7fe9741516f2d52a4cd3b4bf4b29d2f3b55b2e0779071c736b9fd3b39de02455a36aab1c6455d373d8818a114c305034b2931c87155211cbbc57bb4f04b15db2ea433f8e8a3fa5188b5a6b2bfd8a040fae8435e7c2057edad952bfe8ce39b1a7251c341b4d8dac9eb6b3f2ef05dc721bc422cbf72d2c2287022cf7a2de409d0503163227a262715b0312d5a09e041706a78151bc0051d717ba7814f41748fbd8cf94f574c3211a4e173813dcc43e179376c7e4401d32557ec32619d85ded3b67ffbd5501d4b06fb0e8ec485a0954043103c4bb7ee9188a46b9e02f216ba18c441720fec2374c2292dcf8b754d834eaa41b3f338c58f39639c86e859b2fe959c94bd92cbdcdcc2b7208a39ca179e5b431dce8ea2e2142964961268150c68d29bb7ad800f28341ea8ed43654c7807111be62c2d17b7fda38d932150833690c1477a010891f8a8729a39420348789872ab683ca71127227db18f37191cdda6609d28666986cb8df385968078b60393b7fca1e48dc760ed57e01b707641dbe69dddf9a72bed0cfaeb46d82f9bc7e534f9fb783d378bc15f3ebfcddf7f7681065463e635f4e4136b7518f49008e53c8efb37c035850dd3bc243d3ddf4c2f2f9ede94d8d6f1c23d5e4fcc727af1e72a75b2eb6c088997d9711acd2aa408f6caf1c21b3d566b104d8bcc55eaa0897a38af0717d175c4a02506d107b48a789e893f3b82129de163a3081ce4af68969c910b1c7b0cae60ecd6e6d10b98c2be026491cffb8528c9fd739460762034ad61f20d48af43ede31b27e61b81c55cb8da9d279195233016b4ef938c3d1280ff26d63dc70dd3282785f103419b0d0f61e159b5e20d5d7c953c0888116fbcb11a4159dfd86fd31e417dbd07d76d1c8345baa2e6add592dab420383799e546489ff926ed940c0113d6c7b2cf68747a6cd3c2c47094feb891153a45891db2a6367c08500a3cda3d4b8336a5d2fcfd06dba0297d00d71b7ccfa9d10920d4eb38515ad1e147cfba1ab59a4f9e721efe6b21488b28e6eb458fa6b54ed0f89299c8d4285c8317e40c8714c9838348899248cc667578a4ed672697b69f66ff2841480eccca14dca1500c5efaecfbcc254431eeb85b01f14cc18a58c2b6b5f37bd5f43f5fd98e10832c38a138615e171d4d0a44bed3f51fa6aac2527c6a32709dea3513360668b10241478dd241e9bfe8e18cd36bfe74e9f87e0cca7416602b12206a485bc4a8a0adc852cd825d867b83ecba494153e2d436ab41b91f19b0c3732633087c37548cc9574dfd382e2b2e7989356781e299d276f71743cc06aae1d6cfd1d1b1a34989538d353171d5691327a05a6f020554234e40a46acb498a554d3a1141aa6b272358d57872928e9ea09e09bd88cfcc5ee6674e13d0ec28b92ffa4aa9a02abd98d09d5e6ee8b69722bade8b15ddec858cee741ddd237d74ee9506a92ab0742129e996801ab70ea66a804ae97d543d449414c0b0fac8ce43104c462ce85de626311655850a050b75c3cc21529f598a77149941f3cce5e60fca9089e31fcae465d33c0bffa5e8b6007d177e2d4d1157ddd16751e924e4e4c3427dc2a7260679d16bcd06d852fe70e28dcaa6a44b385ac9937e0b0a3f2125d6a92ab14b8682b2d1d78546ed664a992b2efe561f976175b095886f4e4f5aff2845f7789dd5a5ae240ab98f72e2e52bd0be02b3f251568cb49a569ef74b14084f0dae364d7aa9a339842a3513b725299e5601757d9c8e98b941254d283e3e8db8a9ac4430bee1bc5fb6b1a61ad465f2ef9d58867c3d890885bcc7ea0eaf334691ac92bc731831407a2a0d42912ed905062968ced415b051572abad01e03f934b0462bb84bd3889465a1926006308daa4f14aef7166e053d8115a463a3600fb5be8debcf382af640836bbe128fb054b7f00019ee721275cbee9e867b12356ad477252785b0d092e354959d157723194afee0b9429ade0148cc0cc4be1f6dcc717bf3d08f6fbf1e403ba1050945f518d92974b98ba8dee871b46b35f9589e391616160b3ba95e556a1673ebdd83bae8288c31f6627c25bbf7397c25ba6ae4a2871bf9fc664c8f53bea8adf01b5e34c8e572c68883dc5f620e521a2f540c53159848097b1af2d6d73e9b9e9be59204a14fdd9115e76d3214d64f0ff8e2488852d33675761185a0555cf27846f1671ea71d699cc59df2c8809807e008f0a10d36efceb20f2f3a48627446b3cf088b1148622f8b51ed8b41e2555c7a509bd430448da8b67805946348d0bd7cc78b7c2cc9a312c68fc185c3d60ea96cb81d7442899b865ed67f4ee63eddc6db04ed4825430f2129a7e2f80eb9dd066581abdc379f2743e372754183324f1a44603c7ea3e167e85696f7ee8e2cecea1d46e176d40400990ff87ea6a66e3ab60514b494eca20c26edc795f5ff60054b66dece709f852fe6ff0941d1b7dad504c5bdf1a45884da8ef2c96c8f2ff55f6d773bd92d8cc6151396948834d169b20551166e0a66998b0f7c4a99f95e2a2d75e1019ee7205ec739a68d8efa567dd967caa65c6b8f233706564878ca6fe26d51fb8ba105e910325dbfa2c48d0349bc6be72911e2ad84ebf022a0056270f5a4937271302e085831677a532e627c3650b6c7b4a7e05e80a02220fc52371d0b5b69d224fd7ee8228ea1cffdcd6a0059bdac26c010232f6d6c7d98df699162bcd07fece4da5200b267955ae2551de7c1f8b663a89ba8e00e0dfdf2f3ddb43fb91feda00f75735a2b8373c3f591184ea6760d6191d2e91160581e1e492a42f6f76d2211cec315b402141514a34b238b975d85e4abf641ba48290f2830815c993e2e0ce1b12f872be6d95393d8ea989fc4096946720d8de5e709398703aa0e422ef2cccd44130421464bb69014365de421c74c74e2fe0c021cc4c2fcf07c026b3244a05e2b051c9897185adec0ac44aacc89c5044e6918350fd059c688b387a5b0c7cdbdeca642a2f63ec42f77100e8639f88d92b13d0ace250c4cbaa5e3242dbd0b891cfbecb842e1c8081dd71c548c0c01941932f20b8c09f8fb829e4ffad239586703fbeca06eed291b2b3daa3bdc99ab4283d0689df3a796ae0716985a7904feedac8d33151b7918114b44d32297213c44c446c164b623df697181568b04410ce9ae44b0ed37fc94479d3723134989b28ae29e3287cf62562ea6f39a2162034eb2080ea2bea2dfd84f8f071f2053ec477d75b66dad908e7713653aecb34457326d2fef9a11945345c653d7a274a51c7172060d4afd27b5016d661e6cc01bdc9b1bc92f7e4e89faea68e4072dfe39c6e3e8bfcd9348ce0691f2e2a46d9ea303453c22bd023eddfc8fd5d0ed84ba8ea788eb5cf18763fcc30dc00d8f38e69349ee0b9bc5cd05dad09b8926a56237426fb26916d8fef0d59d4ccc65399ac7079d03413572721bce5e0ceb2dbe8be3bfba33b668772b3c0f40949e8303e61a8f23e9e26c049cbb17b505e2f02ec6f030305b6eabbe3d01943469990da04339895a82c22685a1daeb1754e6a5c07a2935f9d055f8c8be47082000659b7c9a7a6b9f577cba6cfa4d47e12604a476cdbcb1b990470afb2fdd4359a5323a8f70e7b3ef9c5e44a3b1e21eca4aa828b2704de9ecf1b754ba07c8e4df2d6324a58ff2ef85218285978f4efc85b434ea693b5197a7620f2041a43fbb2fa42f8188a11658b4b9cd14a604383678e7550fcbba3b35a155e1566e286bed5ab54c0ee1324ed628c0143e9e0eeafcd35c68a4e674c55db4cc74e4f2c8117fdf5ebfa12c8be00181a33d56ef4b770dd61cd6d50d01c87fdfba6653714a8acf228ee94fa87dcf920ecded77740e9d0d91d624570900a4a5454f68179b2a9fe74aaa9d63b12b8624530161fad0054a60081dba5bfdd98705f0253bb465a676493e000ff288f3f93bab0063f6ac54b558b338c995402b2cbb24e69a8da1ee49a6492078279971c91c41fa041788cfc543c65679cdc0a3200a05af409bec92ee612a5c939e076bf2534827b5b84ca2111d508b40a6bacefc89f21beffc131697b8b488687d573401bd116a5d24b643440fffd686a47acef769a10f3211523afd85295078e6ca1e53421c2e7fccdc0091b27a18afc4c9fffd870912095b1733f9b6177a332745b2f5e9c57a0d186be4db659b5a78aab4cb969613790927330c20b90109aeb4d7e15b8c7a8581ff7facd83c90b63d063c42f39382315e3f25bcbbf795045c64fa259b0c21f47f1bab6bcfdfdde00ca339e8eefc8b70dc0c8b2cf8570ac66ff0db2d3088de1005bc1bfcb1a97107155f0fa0bf2716e0f891c195251f82743bd23193192dd0b930957e8e8a0eaf857dea59e29468496231dc5ccbc4c78ce0e5f231b85604f5de848a71029d627d63ccfcb0e4728651acc177adf4fe9983da72c35ecc62adc8d358c99330ce2dd126675bbad064fd23a72ef2ade655b8bf013b56530e6ce8b1bac004664ee464635ed13744cc53c45541192127aa9b4e73469d0be5b7f302d83cf157db6cca56f90a5f9901d367cf621c1fd769c0dce8887f55c70fa2a3ce5401eb0e8298b4fe1a17edd91264035c922ebc25ff7a6469277f8977fb4c94b6771ae9404d464516888201694a54e63269b139c4ff205a20580e73342dfda13c5e8c2d51cc067a1e49a9ad424a54003deac822afa0bce190c0976f6b7e99cc9907f0f1961aabcaf077648b0eee8aca2e7fcbf1b5d82cc703a150feef91c6babc67f8217a0e10893610540e977f0611488b2ab0377ac675200893dd540ae3c975cca3812629d794da7260e4f6206e1122192b2d03056a17eef7350cfd7ae0a7b14d45113bf52cdce509a0c4cbd576cc2a9e4a868e7ffd4d36ad61ad60182e0509452ead92c785f64ac9382b12a08ae2fff28f1c8b205ce978842fb0e7b3fd032baeb46b0069676eb06141877b150882fea94b3d7f1041195aa2e0fe6f2510d671c78c37aa58d66295099886a7054820f1e08456c2c3691c3530134b161c98edf06eed472130007e29b7157cba3dbe576388df1c4aab94922d25e54778ca48869f2afa5169ead51675bf9920aeb3f0d848bbe9114a2f92ed536c8496780f187ff332b2a669b20555aaf04bc8354cbcc2e8b137d6bad135fbc888a519558d5583c5f87e7cc496fa5f49ae9dd462d04b8a754b608086fbb229797d80c687b742f87b46d716f9431672cab9e3112ad0a65c5f8547b22a969882deda83085081cc68007ae3081eddacc15deb9866b304a605aa571a99815a5c67da3a074d63b034d470cf692e805b2955c02026865fac99bbbd53070dc41008c0a0dd9f160e90482e750dba0ade5de0dc6add00e488e7499a8d6dd3f44d0442c18159eb3d4fb39ee6f55fb60a84af0ac47739f06ed4eac54205010ecf1c9f69d69644ac460eeaef22421d64298526c818b1eb8d7248014564d1d5e3808ce26b8c9d7b75446dc03f892834318c850b96aaa156fb670d345191fa0a77aecb8676772ceb2d625f8b1efbcb3441d6dc9c35ae501c490d541fc75f030dae5f1cddde51d552962dcc5168fcf3fb1e06dd4797483a7c71a2936f8a439afee5e02aa423866774accf39b0fb536451fd1c1a0db6dc11fd3dffe0eec0d7aa55762137e1e34586eff704d2a1168131c06e83d2e8690d76023ce454a3cac6a4c0af8088984c6c351c3d90228d1f79afeac1848e561bfea759827750d6e36bb13b2bfab268229867a09834dedca56af3ef2702ff552a50718ae460f99088604ae300e38808b45a584227100dc66ca3f54ab511fb637e117be58901d0f9e646c31d7d49b9c5244745a2c37e2ef14d18909f043bb4fafe956d243df9f688dc09c23446d1155ec0c9683ccbe92ca1c2b0f2f0975a7733c14303b2c9840c07c54cfec9c952c550d642414a601eeba8f1e2f7b62308611bdd84c9603751cdb6a3d018dae5f10da2e7e1f4f338720fa7923e9d3c87446e1481d56c32022efa6c48ee21c99aae9a3e88e2d439ed590ca9331ee1e68909ed7e31b94d8efd1e432e1ebbf9c2bab3330e86be591e232316f815b7c1bd7ee864d749cec506c240e484a6b7bf52827a0d7d0422d57524dfce4a1903d2d6d0ed17eade7d9eb0364643a709c54152a3eac8302255c3271bdb7c09e7b306f5a291c9dd2ec9ce20dc08d6506efb7663fdfa1d1cb94e481f6e1c428b9fa4152683a61d640f22cc6e9c9346571cdd87f6a9574208ef6d098a8392d6ddc97535d089a4ba734bf8073ebba74cc026c6c7af389684c73d864c95b84a7ca822a0e74ea7e0a3438321433b28c9bf19f8d8ad50e3aa5f8611f6823a21459b985099850ccda7ca81048d38ec85fb87055d911c98bff9ee45dfe36cebef692ac1c2542aa0b782ffed6de12390d12f308ae1951b054d953b38eb0b9851cd849a9f8b678d5f68cb7c0a7bc1e84625b553bc4d38898c05240fed1b1f764934326f0395f10f58bf09c79e32c5fd2814210c01385fd20ddcca20c634d2287f1c177b34d18bc317a1650df3569be87415500f0f8b49d77afe20b4a929db947c4d957f3b7c4ebcf761c4ecbc465d8c5521ff92ba2dd61aaa662b06ca45fd2149069313611b00c50de67faf5cba762d82b8e88d40af116a788dd7524bc053a9e04b8fd02b2ad2109f38f52d58cc9a74650aa405938e884973d788b45022ae91ab0e149c45b28b47d1f49d87609922b5b4fae383e8334de8a4383e25cf17173f1e7e0f5d46f8853befcef9cf14577cff93adfaffd3bddb19e54c3dd151d390b83c71a5bdc9872f020020b77723a4c0be05ec1467319f42d980f0418493a892b81c4f4002c840ef02ad884277b6954d1fbe7f381394da36cb2022979f20fe5cdaacef2ce141f55dc067c707d70efe212675e1110553e7f1c0c78c581f7fd689079567eaa3c1bd534b702f78e2bdb806d426da35921b851d8f492088356295fa88295bb495605f64f0162e7fd41739fbfa196d30132fc5d7224ff9f2de0aae961a37829d5c16b18381033926c5ceb59d398a74634416b1b300c193edd0e3da193c5f6bfe651e1c23e5f64f46d26761a6b9a628e646f04c230cf0940320724e706835ff8da50587df00293d9051df078df865a06a698f303d481a9539f7a4ea443fa407e9c93f50835c4865a88830948a5e0ed4939e928e8293afb4ef0b3af4db4da3cfffd004d76fe5c96cda4d0cf1b60a4db4abc381e55a0ff4e0710a8e2343dc2cd42798f0cb284678b9196c7d047e5fb9d9a123cd9c17ddd7bca12f0cf7179b1ced4de88f5550714b5e78ad77c039e1adb7901d5424fed06137fee9eee1f327cee4452ad7f7e0e3b98b38cd86968663d3f9483fd60c9c325337aa5b7b07159c901e983ec9f8624068e741d7ceb811abdf4507449ad2502c52e81df9043202d274a465b27e9f5dc248fb206c086a62352d72801458254eb5d76cd13a806a544ab12b23aabc782ecefc71584d6c79ecf87282743e6fad99aee38946ea7372ba1bc06d3c582580552d55d14fc36eb44b8b23eb2c236b27ef182afae6171543d2d949fa787c6467c0505fad4642d9a3610c580ac26ff12723fa6afc38be757548b64786ba9a79eac8864e7838ff34d092d3706e90d70903d05179e7df3ae65cc4d409977b2f313cae998a9f46fdae7a6d3dfe5caa2f9f6bfb5a3cc946f55c9b7ffc9f2856c55e5746b1d9c7dac8ec7f0bc687c3c6ad8bb63114bba1e2a8579ac71e0cd203d818a05545887956ca84d9d20b056f1334599ac3c8f535179434c8f07274d6b1efe5dbb600ccfa10cc8fc00296ed5e8b1387fddd3f7fb0c1581dd801cda031094628b957c157a43ccea3f97469d185c6ece17ee0217a082213d67761c991f7596cdf870e17876434ae63c293e5863d1bed5eb038b8cae26e58fe231ff8cf765a469e0c068b157d113cfa2dc1d31884a933968f15b16069435ec006a23dce9740dcebf9b8d6dab909e55d8d72a6f36ccaceafd2702d97e7100e84e67cc432a2cae393fd6c50ed69eb52e82fbe67596232e97cd159dfc454b6159021c9ddad6b62dff890ba74bfc9c6f484284d0b35e887d75da629ca049034f5c8a0040e6fa6d48f260891fcd7245376d880c9e8ab5d9621a16a62c2d2bcf69b4b84b6e64095b5b4fd2d5513f6ae6580471575190f80cba614211e6ed201b945bb5c8ef14973c341380366e41df09684fb0a6f6de9f777c24dd996798389b2d02b4e8424cdee0e6e920410786823fd9e4734324d51a419eb79a2f98075e783bd871d220a581384631b5b75edb2115d12da48afb2163f0a7565880681d6b9644677e961bde783c9911d2791fd34f3daa35a743224a52dc0c110041e9b46345d07b229391c2a0dc1846d451ef3d5cc3327e33fa23b3cc44c81bda92395bc1736e92704b4d42ffd08cd43400e5c33442163db4bff2900adaef6a3fe99d21827198b7e1b98161278899a2faf647709123aed7f4e5070a9681057d2707e5c15cb66382894f0f6a109ed429934a436f21c91cb52628c78d68fc29cacef7f0a8195cad3eacfc31d5605257997a80b9642f87583678dd2e3316b238c407f2ce670df791fd04597af59907d526e5822b7d1599b3a06fe7979e6abeb25abc38c0870d1b16e4dfd0528919121440f0f6fc3fe781fbee343f11a39030da652281d097010c1e980e5e44ffd63aac39f3ab9135cc023f03e45048f9ce22bb90561317d3073e1ccd42ef3393c09bb7cf39f181b6ac64c384c2f5f459a291d039e8fdb272f2c3f0af9cc8d72b88e96de4b4937b9a73428b30782a40469235702bcd45404044593c96b11946ca1ad6f5a4fbe57757cf98c5a86b1ca4070ff8126d5c3e8b3d5ae34e267263bd7887374562066b90ec50d0259912a7fdd021c914e415a673c91d9b4f8d3100296debebc5bf1d2955ace4d4966cabf4d58ddc4b89e3f8376282685ac09a0640c40688316fe889c215b949482855d00e8028b76b99ffbe8069d00fed956defc1541918b566f31191fd52cef7bab0371d5316912aa24e706274a5c0d16986220bd21b4003ac6dcdf6c58319c17c82dae03c668ba42b930984c1176aa34f9fa98ceb2e130926dfac77b721dde1d48fca4cf8689e179fde65c3ffc4a16376719acfab930258febd00c4f28419f5ffe73a0608db785e4635063aefdf05fe1bf6dc404333630fed348c8d217792baf3d4b31d6553a73b6c84846c8ae5eec64e423b258697e47e78d26c5f732d7bab73e3308e4b54ec93f1314d3dda39ab66d0f14eba0acdd0dbce09f9766c40175f3934f24f6d296faf568188ff7a30d309f49cbfb956794cf30220cf6502f5303dcd742f619c24ef181814e93d80c870c3c2e5d4365664c901169078f29d080c4a23d2486471c40c4a01302c3e29717bd14ec52209700b7306aa67a8c26092c4c903c5e39d12601b9e1d253adc40adb10387a27266222aa1d560f8f01c0caf48910793381ccf5ca6a75cdf7511fde079f80b4bd6bca1221b19de9af4850467839ed9df27869ee9bfb27b4de71ed350c860ac3606b497a19dd364414e346e7fb5c0a3186119fcf592af0e53f401f93d80693a41c53016b6033fe83b6b93eb5e4bffa3d62e322c6b76818d3b16a3dcb8a1a039a7e3f1829b56810110ecb03e250a3857bffb10780e0b1a7ee888d949f7c5dda5d9a1b915b1e6808d489c13cbbdd18e89c2bef35e07a97da3ddbe64b4a2add88bf94eb68ba05941b786598e16b5b7a06db0e01ddaaefcc49bcfdb00996dd878cd5e66e453ebc794fdf7d4e8b09325a627bf3241f09e077380c8689db0fdb05ee56ede644153e96009dd562e74118bbeb493bac33987c6e73d99d589c720400d9502dd8d3e277216c7b3bd7c7111e2dd08bdf6e5caefea2058e741e3698d88b775bcd1dc6ff47678928089dfb4c81045f3663aaa9089a1703fffcece4df3ea57af6c518e9260eeb5241433870a654e34a978263a8887dde16fa6842905597f52c1435a28b03cf8830fd591e21d7fccccb19afb7c9bf405fef37a2b4017c0c321c4d483dac72dc69b11e8b6390824873086540cc81043a7dcfa856401c15271d995e255e2fdfd1f564654dac9b4eb74b58dc4aa49d44862631df5b32f59aea3a8e2c57bc83c5be2c6967d87e604e1f4b7d85ae97045b15b578962edaa3bc99f11a0f7b436bdb3621846c423621644bb9776e0a790a650a51b35fec4e41a26f21cfc49337346ba3013a8cc87e209066e30f9146ba69da36bf6d2ff29ecfdc6ce7c5134420e875d57a5d16dbcba555bbbd788e6d2ff0d4033dcf05a780f082a07fa0f47cd2047a6c64f0bdd1a8075d06e89eeb69b1bd4090dc5e3c5142da755d07455d47e9ccfd409d48d41d24b228f663d05338209df7c5bb81ba4e7a20849ecf07820baf47a3017930db9bb8d073d9793c7935cf419ee6f9c0d06f9ecfb50fda4feb71293cb410fe0369f41abdc703994e449b87d27714daaf86e7d008cf21e89a4c0c021e643f50fba7f5b89f6ca381726861e0b753148f8a27c583e25149f1a0ac0ca194524a376be1c8fbfc2464f904da20b4dbb713c420b421386b3fff3e166461feddd02e67bfe8a91de89c85de7743bb9e6ff693176455ba6bfff4b5a7703ce040177db8ff736da3c11d0664b76f1cbc486316d0435ee5e037fbb97602bbbd7ca057ddceba1d94b7fb9ce30e3d0f1134e43f97ff588fe71df4aafd3ced041108ed9c27a3b56bda677bd16cac5a8f2b834b179d19cca4cc6dc9439eb8d4180621b49fea12610423902981ce8501d2042c324414189133d06467fe460f21bce03c9c1f663f782e411b7c7a2267a88937628f9bc51ef2ae5c6ee1123c2dc1a5088549f40fbee1e41fa46204e1471e134ccc59eb68c43212c8ce97891745c2a5eaa196672eb5945a6cb30182bb7d3ba538b05f9f5e8e78e7690c72d11b417f6d467897be6d6210768190d25873c598bef4f0c6c42ad806646dbe9afd6b4129aa6dae6ba35a3f3acd027abc5fcfd0788324c6231503e1a0d741679d8e50e7202fd2dbdeb7721946f6baee3c3de7be480699ba9ed318845dbecff9a07ffcfa39ff742925329fcd67459c3086999b1d8909c0e8162ec1a024a8d9b7035cf8ec0634b14cb3c44fa804ca4c009a1a35baa9456ea029de0ca0051e00bad4f3614021201e6ebc074d4b40962edcf86fc5e5a0a96da870f91106c136724297ab6368319ca89f0abc00b85fccb622980ac12e31df8e0b67402e41138bc8121f594493cb210dc6d0cebfa0cb757ec30d9a446c253021e821fb75f7833b6c9381ecd775d47ef1cab4e90664e1996d353e87611b8370a9146b8cf81c869fcde09bfdf2620d0d5213c48b506c96bdcd6632a892b3cba0b60d6c23bd05ecf39a07839de7a59452eae9f878bf14e47d404d3f4d1b74ec9447fde08e108ca1b8f1f3fecc21a9e9ddccc932a56681117fdce883b578c323dec8c41c1b96b1b27bdef171441e35e31bfbc6ba500a4952b1517c6a82eae91c1b2a82ca8770276325ecb243336601f7906115441312cd1253006368671edcca366018301082b014b1e608f7e0d20c5b868265e08b7818d4b66197f9cf8ddcf85d2818a371c0a8ab1bf37ee9c7c3119fb8f138f87e2c63023e4134352a720b22cfe0e31cdc78f25c0637aa4d3d05c8129f85db359dc53f475ce112f6cffb5fa370c4fb758d0ee85ff7e016c16d35b27716946d5b8decf31474e27123dc9913f38e98f1363d05bb7cf3f4f16dd3538031b247fe47b3ecf433cbb243c152e888906373596663fa92e146b6f1c8e7e27e2c535a8931c6e88962882624e24d3c0263f4e36318600ceda339d436dc7818d1c0fd8b79b8f12e2214cc5ebc3cc3325c72d128ed8d6217da353108962202413f9fcb607a0497e035ef015c8226ff7cf8c546f5a65964d8e5f378ee0163688f5fa24d6d1300c8425d20a437b19f0f50b857c0080197beda1797de634f415c71d8976002c680a5364108231e89d26804e346086fe0059d7a1f7739058f5cce32fb4921208c03c01658e273de00201050dbe00b0eb2f07b18b188a2d8e36e766e45f0334bff45e8d110540c2606067209b399cd2cb431812fb18b4a8d79abdfb8ae8ebed6e11fabb85243e2d2ef880b032f5fb32bf005b5df0d58e42ab1e3eae89b012f869e95b0f4ec4dfb812075b3d396c73c1cd59d4aecb8d0b2d07a2e4aad63c2970dd4aad6842fac0970c9b2feb9b04c73025cb28e82facd3b13adc71a76a98e8a3f2e481367d8e509182edcd0000c42021108ebd6331065aa356148c0b256ac8e1512285c496936a122241726184720ed1721b8242fb7af8a33fa460b03be9037589b71747e43936189669147e24b74f76577785e79822acfc407563a0083585902c6a82e274d1d5508a3e4a265e2ac78e1c6ef5c1e81e1c67f3d5c89047c11e345419dcb32f85be2461aa9310c18a73a3f61d01042625525635555556549978836d566e1f3ac5aba58d70563b43ba8756374e5594a29a5aca27eb5c63aa385d3dd135e900a32f080101e8911616974090f89fcca1eb525c4e5df73892f5724901849d7752384613742b799a15d824bf1c4088887cfbc3cc0dbbfbe0413af3ef242ade2d531ddbd5ee3aca2f2351df25eb62b96443c8c423021cd122badf26e702966e00955a506f6ebb29106bb6cfcd13f86a5e210da5adc66dce0527c0be152bcec85ee126d2a451e8dfe52a9a594811b49b04bc42cc725f86296972f2f112a35fa306d25608fd871a9d420f789093cd4cbdb965852bf92054a30887800bb587088521587f8a091119346f24e768997bd8f9fdda17e7067097689b0c8d51b182c21ac936b9d89cc2a401678bf6e061b864016782ffb59677972a1062e8452be3ab9cd31485d4947a3d1a8d412539148fbe09234c23bcdc255553dbe42066736c33b6d1aa5e17e3201571e068c412f692afb8daafdaa667f7049bef05337b8f24d33339b3167196759c6438031727089008f004d92a639480ca242c92058a891c29512c54ce03bc0923cc275dc60f802479a36711590051583e09d8e419015d4dc2ec195ff24ea4a3bc017f25f95832bcf755cb79d2da554ab6a26519efcc1a51497e4ab27897049fae842ad9efd6b1adebc8febe439afeaba9904ad49f4b567e7b6833a1e31a59bfdf0f64fe7c1cb81fed940a010a8bb9f4086b06ad50c4d9b7ace2a698cd44fd264154ddde12544b824632a08b5da79922251721e637115eba4b7a03fcdbceddcb5caa3a7afde57f9b472b5511bf4da35bb9df31c606d56f5cdd68740cfb2b3c03eb1578f4fbdcdcb2af534cfa99771ef4e3d4ff78e4be22671b7ccfae67dd52fcbf1a05636870c3db330d6350bc3e2d9a99743565665f1cf5b78bdd9009d05bf9f911ac326967919635cb1ead9bf93631e5fec9995d57e8d316653de299728764991dbf98d923450a8d87d9cfc3af154a3679afd767819339779cc7978bbae79236f320bb3566955e539f967b33027ef4e6c77197d551b05bdeb4e513eba66bf89e24166c93296cfd9e4d5b65918faee71b3017ad76d67af6aa7d18317667bf78ebdaacaf870cb2aacba8b4e5b3be15b2bdbcc7e4ddcee9fe790272797d1271ee83be27e6ee27d49dc4fd3d0f6129257a3c10c02d9aa864bf21faf4271a1ca4b1a1fb2460a6117ee2ca1b8f21b5db6345c929cb3d3260e326b90223749ce9567efd7d908bbc82a87a7921d0669f9396b909e134a48d9f3af6998a3699394016491c701aa0735574a2104f15849035fc8cb6007c84bd13caebc3ce7a1aee4255c92926b5099166ab51ff7eb1fa3ae7c4cb549d274d46197fad24755c9954b78f2e01e2ced7739a47469ae7cc90eda5e6a44c95fd7b25f99f7699af66d3bc7bdebcede85f5f6c2a75c6badf555763e765eb99c0797dccd2b5dcd7371a91779dccc9317bb2ea3e7c514802fb450b9b29ae01da17e498285ba557623b30197e57d3742371ebe92a1088022dc836778268502286ebcf1525801ec130543ac4a7a5f1fc2b48dad465b28b719f1ae70293ef3acaa08ccce4b46e2a1ae3053f1c95bc16b59dd96d556c5afe8e56533b794b29921ec5840233d22d8c5b22aec9af2594a860ceb4b824b19e41c5c6ac069bc660e76c97104bbf4bcae0bbb2e7904e91e51a44891928c06c4ac6526659ca7d353a911bf0d8c2e8cfc8e1b3d8eb25a9655b90eefa7dd78c54fcb915676e9cba79765595565591a907edb9ad9a4a0469da8844dddfb7149aabbe7bf3dfbd44e4f330fd61c972601017899b8d4c6192e7504e210f1d42c3dea1729d02cfd69bfdaefbc156699938dd4c692b8134647df0c588731d6bf1dd7b27a33e2ea7b31f2df8e2be7bbbb459edf97523691ba2ca3bc94980703a48996ef7af757ba2e1e4f97b7be940841d5e60189ab6cf9d8a58842fd4899d16a220a15c56894c38f49e2ce92cb3fd529077e2276734ecea4d1371e9b937b502f8ebfe24ca479691b9f8836fa608259f8fc419d99238ac0ca3a22ce142172bfe823d2c408ab2566e20fa873caf160b04b33b7b4d0c1a2009738891b3075002ef133104757469b265b97a74dc508a43aacba440497b866a77e33c6c8ddd60c56569a508221a66aaadea669f9fb35a76561b35436a6321ed44ec5943d723946af6d9fdbc61b235ce21dd422cdb20573ced97362dc835550d5a1c78d43e66c6fce39ad26ee3527e6cd89cd39bd786cce69cd865f7802063c28ac3c92a3aaba21e30d0ad9e5262ee8b1c48385530b8edceec2540ba6b8707b995c8abf824eac7982d38aa062cd36a3bfd96f89bb71f59c87dd708993d131d7ddbe262e7df7393b8dbbf6e971d7e4f6c2cd79ed97d2cf0dbba134cb228d97235e95696ff5451f3f6290aa0d5de44a984447c91286391468161eb3477d22fa68b9291581104a18b0147578d6eba24355a9c15d555555514aa9fda20c8f78ea533cf5e8c69d36f1ce8cf1aaec25617777db6edeb9e6509b6b4d3bbc55e3b44c0e553eeeb0cb1296c12ecf34ecd25d86c0907383b8b0096080e222e91105243cae3ccb1e577ee5567d75774cc22519739454951a4d13e5e72b4aa7e5531593ecf04ebc95b7124f73d6e7c4c8b3f23f657bde9ed8af61e30e1843735676071c77b238d458c5d955337d06078643a574874f4a76e229fe884b24e7451ad6bc9abda1bea1f677f8e4c52595651e5c92b1db7e30b584029caa71670746b7b4944a3b8d1d863c315bdbd648bde9207d2a526fb0a9c36db91f977e1a7147daafe5a6c86d827c2d95fd4aa5396bb571e7631f1e05e00b68d15c498649451fc29d2bfb59166a9c2d235526ef300f6aa50a3da42122988f95dbef221bbf07432e8482137edc8f6f2e4c5501083767a709174621478a2bfce001a17061ca0a47ae15a638825de05b93008c1125005f34153238f7e39ba8642708bba46291c8a899cb7f00979e803136085fb091aa79ac9046b53a5d3b6d59b4b2d7e7b5e4c6527c27b1baab5b15d4a95ea8a8fc2f06b971cbca50a7601c0c0a19a59492081042fbdd58c2833de6f1c4920b39762f815e3397bbee21efdbf1123a35f1fa3635423e9e83b617d1c9e82479224fe4a845f74feec99c9c1624524522797d5984101595a778df8e9bc2e2727b493945f1e42f0dd6935fa22655a4aaea9393039c782d9806371a2491ec8a24ba487419dc1e142517a41622990fd1e2570e14ddc98a13bbcd70a93bb7024856030597a420792ca485c74398480d699b2191b6272c8d7b58332dce557452a4859663bfd0b71e2492b578b075a2b99fcc299253c4c8cda60252ca36b3a980052925455445fd18484e4d8e8a4e0a90ed445ed1a51c8d7e72323a19ddb82d8fa232ba2a1779dfd6e3aa5c46a7782baee27567b1a2e346ef482d44a2162492882447ef48de87f2aeeb50491ba8fa78e2262291489fcabb53b8b1b8c8fb4677744f46a3a3a03c25e52a2aef5e71dada8ab360e1d120bdbe3ed6d793ecbb93773448afcea2066905e9d5ab932ce950befbf69ba878b1c74df1e2cc45f1e21377e4459a13af5e913732e92ea3435ef5a9d5ebb8ee6a6a79a8399b4e923c54fec8639b12acf2d7cc0a46b902ad742e6ba7316e2f26b7a911d2a2c603a873fc63bbbb42f1e44b256f42b612c94a24f2fa1248776acfa0e4c62d5c1805243eae101fd7bb54b65c9e6f398068274a01add6834b9ed720c0178cfd93371c84a56021cdc26f8f535525bad6a35bf44a94d94aa74da38fecb54a93894054942b5be55449b8c41592d8e37ef2463b4104c29e5c3b01bcd28be998169d6878a81f0741dec82338f22408a0b7f7c990c9433ff1be1df7e49c679978f2f3913781d724f4f63ef9693237541ffafa7aac8a8dea767fce89861881e0c8931a974cce5d7a9f7322ef035d6ad69651a15607d25dfb97e37ef2bc99581c2ff22fa253e985465c12d9eb708b26e7a4f7f1be78fa42a19b98bc35cee3f5c94522d176227a7591151d7249643f396fc8d32ec8abf7e385aef4e46d195d3de8d9d6ba6794385c3aa2dda17ed3e62634bbcfdc87a1aaead185567f2be2082a3d4b7a12802f74366972a2fc1f4fc0d0b804ef177fccfa504b84f0c63ca46188086e1472785c1885243a17c6855148c31497767cdeb233d478bff8e3c22fa95f94e91a2e55956524385cca6c78e7f2ce35bb69f8863e7b8c32314352e37ca491d19654691b55d1e8236a975fa2abdb4661ed834bf147bdf8e6469a5b552ad5a1940d91d478e5a90b342b438d31c61d31164062468cc0d7992d2096bc7a6bf97255ef784bdeaaaeac6a54971656b7e2c448a17661212e71094accabaee5550c2d1572bdafead5ad6340e669848fcd42b0795d87d7753ee5b6b61afc8bafebc0c08e0ba1904ac86d1e72dbc620b70f71ea376f47f8780d4618e1d5e7be759a8da1c62befddc843afbad5708aeab65c5b38dd8e32589e2c04c9b04b4b19af94f1d4213c8fdb8b670d38f7b38622977e6ae7a6264f266f1eccf271a76f2a6524fd27e9e5d7ddf38ffbc7ca1397d6a0733f333eb3a356cad0e0ae7d9e6a5e75638c429299cbbd4b72ba9f779e9b78dda7dde93de78d4677ee735a5d798231faf66508a00b955742c9c91b4fec82836f1597164f31081cf16a1edf78a33cb1cb2565d845f3bcdb5e3cef2eedd17e9fd36a9bd19db32a3522e54be3d64579a234e2ed6ac0d4a5a75ddc6ac413472de7e9e00881f0bcc6060a4e5072e5895d8098bc2f79b4dc8ce84bff71ff70effe7dee39ed8fd7327de2fe81f99c8332ddd7ddd332cda37970dce75644ace2c6340ecef33935ced341330ddb6c4458f23cdb6ac84b9f6d36fa72a751726cae7b6763fa7216c2171edba74f9bf8f4b19ff4f0a97b7b91f4c6c8e3f1480a9207c92c743d1e0925768fb453428ee3b86b94858a8d09c4e4f3f4404cae0d72a0538e7ba4d7e2f66222cf5282e8abbb62ab01ba04c9ebc0c08e0bb94b0f1e34c38bdb0c786935f81a7929a107e2a4b4362a90e5a00755e46950a1c663f2ce03626255a4953c8680cde23904fd73bac2731a3728ec4479eb154876afb617501703bae7b4f33ef372349843f1804e41da9c946a10f4483f9de7918a72f09d96ce79cdf3ccf801793cd133371adb3d87bf2e08af17e8a133c618a3361f679cf3da288ae6b591061a596d6a3682628cf498f689120aa15c1b0dcf6140a15b1e4f88657bf9cc39e79c1ab5f0935e34f24297d19b4621dcba7b3668a3c7e3b19e771fc806da657445d26c8c8a05628294a3a4a41c0525e5731411b39c1c7427b2937bee04649693d076aa3d54551af60aabc742dd455e66e245211f02794e7c6ab3f0bbce72de8debeae8cf8b55dc0fbbc65b0d6a310b243b6fb6899621a2a86a5c79a14045ea922e84420e914b59dbc075775c186d60af8e59cbaa2adec17d6535877330c12e3bfa921594c1125aee26642fa8dfafec43e841e659b5cc5058194b439587cccccc3faae8d18017da10973a56f1b265599f9efc2acbdd43678a86978738e46569dd8ad7751df32411d69a0036e10a200a573e6ce65a286da4fe717b61f1b8790ed91400188b70c99241b5838e1216d635e45af7fe5d44aef5b8133906bc022e41ac22de21dae15ad5bb7a57ef93c7ed052525e5564a4acab194cf945fa75868348a293c1a1d3ee47d2b0f5de47da293ba458bea2b27bd87d3cf677b01c03fdbcbca2928d3485ebc2b2b0058e9c144d48329005f0180ede1b4452d6aae878768e8709b113a3da7425ac12285657accd41f0eda5e580eda5e7e380d695423ad785fbc3e9cc2fa03cb0f2b4ff1a4a85b874b562b9141fd1ae75a6f35c42006d0388d845db25bef9c22ecb272eb95117601c0edbff9c3bfeac8b58ab894ac5f42ae2097145da858b8a470adef62c2b52e255ceb872b09d75a39ed933e696ee52c2c54898997741df2f663badb56b33ae225d92f741f1eb7193e7c74b8d1f0e19d9232af14ab62c3878f3ef2a1873605e0dd59a4dc1add6a71eb7c6297df3af36017efd67ff0ba0897acb3786d844bd64b5edf84b26dc6caca697b3e9cfae05d87bc2d5abcc563badbc25efef2accd88ea2d6ebf7ec887166fb162b59e514db42aeaa187954b1f7a784c777bb057f9b519517dc5ea885764bf26bd07ab235e1fecd75f512d4ce8f4302b9e235e92889e681d7a1f7621ef1282acfa3d781d00af87308bf515af8970c93a00bcb6e19275ebf5145cb27cdc6addf398864bd6ef710b8f67b80797aca7782cc325eb2c3ce6c125eb2b3c265957f1e28e750c491d3dc503fae75feb04812f2ccc0c75f4949f1cc5bba4e092f5917709e192754d4eb30fc56a31799fd82bc81775be2b481d6434a27ab78e1276e95b8f3b3006b451896e00e8a2dd7a4b0ca2540018e307f8c29a135e137841d63fdec756b5de79dfe83e81e3ba5f4bc3529f7a3962cc0559fad67fb05eb2ba3ffbd7c4665a748a4ed4e0638c9056d4d2b036d46ed84234c3d121fc5cc0c4971e73fd63e2625607ca9dc75eddc2300cb32e7b2ed1185479ab6475f4cd40f5801d2e3e18b1ebf1156663a28d991648ff6dd29805962084dda6e8628514aa3d22c0852c174eefc2d185475c2d66fec3b4432f463bbd9a55c2fafc277babe8330b61e9c36c4cf569adca02696b82be1352765f46be132def44c73b316a96f81db309e64a0835a8810f2000c18709a4b8e4bf795dcc7c0d0697220ca2637cb515c1578c31579ca1d94ccfd9b59adc9a16ccc4206c50af2ac8b55eb9009a2664b14e834a07d75a51f5afac89168d4563d15ceb299f95d188b7bf46553c23a456ef286b2ceb177dc634d7c230fb499a6514d3349a6112c89ca86bfdab66ae5563a118d53fd8a506c698b12a9a6b5955cd35a3f5a070e5bb4eb79a6f76e15fe74bab7acc8e81715d2d1dfb57bc9f4a5f006c45cc16a2050733d34b195ef6e2ad7676aa6aa7ab1d1309e90d6a65879d1804f6ead406d63f8be656afee00e7086e65a1e05626b7fbe3209737b92337c7d5ccad7a70a9aa649650c9dcead54e75f6aa6ae7b4b2ac0d083d7bf408a80a07b7697c340ac680362e2bcf73a7b19347a6c291a35eeb98cc9df616c6d735ff457a4d2bcb2e6c5ed675ba10005c096ec41e1c7bd0cec5f652216c81537601b8956fba9337078047a410d0560da37294b2c7c06fc62e7c2c8235b6b09be71823c7132522458cf11c75a27e07b8b2c217124a3bad471d19df70b72226c7378c012973b42e1e102334c51cc822af83c51d785a89ff624e4d85c9fe0bef97fd8b399b8d163512e1529cffb847948decf1d66603047cb9d3ea979723aedcebff985f55356c8477f9a2fec125f9eba96996eab2920c5fc8738df4d8135b23aa119d8ea07e5d83839f63ded04de887cad39f78228f8aa05a8f9275d845f49347215474e2451b2ec9937a130fc252c803a2489b64917a3d45f8f28cee0bfb6c028e186be6b34b8b88141ccf8d611e940b3d90453e489669ffb24754ac99cf8c9887c92c6a5eebbc6f66961751fd1a79ab8aca3d7296218f1e30067da700a69f237e154cf5586196655996c61a6b2c8248057c21ad495fdda25404551e6a4fb0c76c69d807bbc4bbf4c5cc9c532364a646c8101b284e3c84d0225495190d64fb66e7ac75347accb942744c3b4ae4bb060ac984fa71919c20a719ac67ed511683ca466ed8054220db10366d16c957a2913845e6c51a2ec9215c923149b43107be90a73ef1985fd7740f600cbe8c6fdadd97565ecc9155cca122aa219abaa66384c395d10e578ae0caae695387c004577e4a165cf94acaa053575e068131be16c2e5b622f8d529b7d5d0ba1a76b9a008b26d35f855755d3ae2bdacc625692797e4a9799c3a0430065f327c6bc6f3a4dc7c2672e5a3279b70651c1293609cc3399cc3399c23c4c55746242142e28fa8a2b1e772842c7c58c9e658a7b8f231c8b4bc9015632976ec68755bd51402dadccc8592eab594d66559d665e59095f56ab2773d9b419587f211c6c0ac5f5806e7671dc6be038504a83a345700171271831a2ebb7cdc31c5c2580b539d8b9056d2c8116f1f0255de1cfd1c7c6bf099630f9ab9bb25db1cb1233fb60e28cfab3519e67325bb99a5a070c5007505387705a9160cb9dde9e9d6cb65ffbaeed57fc10ac473333397cb386b2ec4bdabff306c3bf63e0cb61ddbac6ddbecb76d74dbe49960976fdb76cf766babdbb18d882c0ff58336dbbf1b21221ec09db71adb39fbd56fac29112fe8d59c73721cc771f19ad7b5378cb621c12e9709e8f59cfd98238e1c5d0338199b101a0c7a80ac0573314bd78af58a24471dcac19706bc3868c09b235e1af2dc398a1abbabd4a83ff989addf71698c3156ac9e9cd8cad5ca9d46d7ddb757af6fd65d3b1ba4b8b063d139afc3f85618c67d3cf8f97c3e913d9d65458fa72302515de4e99817b33002d13d03ecb2d96f3b7679242650011883bbfc05600c1bd3c4f5c8ce7e10c995f0051613af8907439f8c4b23c88b260bb8da95d8715ac002aee73b9870296b265ebca1df8fa7520f2fcc76ed20956a6d709b55a9c15dcdaad4e82ab8eb798b3be79c9091b8b6174682b3d5de5cdfac77355b595e8dee725c4cdc6a4cace27287f0c5473bdbdba71dbe7a30d56623beb26664a78f2f0d01c3a736b2d3a76650577b85da37cb73edad7d932e9eadef566d14dc709365db8b6734aa55d3ecf6169b7491cdac55ededd94e35216adb6000768ea27ef18b31c619f1729f116fe4ec8c0a7e3a2287d5cdfbeab77338227cb13d87bc9a0753af55ed7cb56f1d17136f85797d2967f1667cb92a6e969daac77ca3c797b6d67930c6c4af89cb1dbb8ce6e28d5ebcf46a31915f4f59dceddf59dced2cae76065c18eedba1a742ad8d05dc8db32a351670b72fe06a87555c4fd32c0c5fbbf60b21b42eabf6a97d4e2d8a798f37e78454a3a1590f9f371b7c7a8e868a0d7a8ea39be67d513bf6cdfbb477e72ea3bb8af3546c6ccf9e7db35566250c5dd785de755dd7a5bcebbaaeabde755dd7c5775dd775fcaeebbaaeebba4ebe03755dd7755db7a272d2bb4eb4bd7493eb5a641b8da2453637aed33e51d04fc7d11a05fd749f4c8ba26add07c3a2a85aa7cd1551602b3aed621105b6a25b6185a260d18556542951b0e84229b28a22a56314bdc5738c3a73e64c9c115fde78432915287e3eb0922abfb61716bfe084b3b993d882b7e624ad3e16ca55670a16338bb6a66dcc7524955125c253dc2b85458f7bbd6bb4d0e4706ac7e3fa0a15ef7ae76d276b3bb5cd29c9b799e05edf6aeef50d056db8d72914f5a32814fd3143f7a33fa8ddabcb4b149be4e9246b4e32883c49219774e9835d5a9cf45ec22689923c2ed276d2fb864d72e2d49c4b7a1b6117eea4b7146c9273c82532c525d193de336caa260de94daa502825a825281e978472d2d9864dd52c526f2ea99e74fec1a66ae24831e492524e3a9fd8649d9ae5fa94213d2e619778d2e311365913494d72498f37ec629df428844d56aa59aecf14e9518af8049bace9e3e2c41f505cd2e30cbb68273d09365d13ee90fe00365dd3483d42229d0876c181790e23d53222910e1987f4129baed40abbe008814eba64d385d32cd749d9495fb1bd9024aa4ddba959ae5b142ad5268a42a5502954ea5e97386da227892371e849e29cda94e1e09c704e3827549bb2540a9542a550a9366528140a75bdc2695376aa702a9cec54e19cda84e1e09c704e3827549bb0540a9542a550a9366128540a9542a5ee859d2c1c0bc7c239b569e2e09c704e3827549b662a854aa15257aa4d73ce5ae795bad72f9c36cd933cf56854eb85732fffd5eb9e16ddb602006b37ef9664ebc6b5a0a877dcd662db38aae170140767c3b9d7b70f4d7134954addeb1a4a86426534ab5876faa07ca3eb59cac469120e0e4abc52d5ce54ea5e9f968575a7ab7d50abfbb50e3667add8e9dafa5ab7176f4eb35c570e0e0e8eb591ce1ec98317c67b844723db4ae6112ef19da99495ea14e6a9988b70098542a14220b9fdda30be566733f6e549c22e28bf58e77e3c44185455aeb3f071afaf40ddeb34a47928aa59aea7d86fce5a47a77b9d7abc4824a60924a87975a7d1a8c2e670389c1e547aa23cae6f73d67a495e5fef25ecf24d158f6f2b614f3b526488e7d7a9564f47a4d391d65e4a8aca48634f365f8544524951513955a1d1b2a88ac6a91b89dceb2a5e8a87a3ba42b874c5eb710865e1c560219b238b8ae3a39ceef591c7e35e3fb92ef2ae9b1c895a1cc2a5eb21effa270a113263cdaf4721d73124b5cf38e4f58fefb79deef58fa2ee75abc5ad3d8e0cf0c5c5e1c017d7399c9af27407ae40f932c6b29f8b0bf379894bf026f61f5f64626262229ab7ec576a2a7cf50fa41ffe58fe5c7e983f45ac5c8e86e80574d141ef3ebae770a371f2ee74e4897ee28902704527f65c128962ac7f26a2cb8b4ea9e84aecb822ab847636b131d6bf7f3e67effbdc84451e87ac00a7b8fd8f0aff0b40e7a9b0b5b172b973f62ef84aecb86c95d0a805228332c4f5cc629735c17527906896beec11cdd2b72405523f58e488364124da342900dfcd023d36e81717de058c617dbebd797aec944eef8b7762d49b674fbe9a9967fb55e6cd49291fa35d457e1ff358ca595d5e4c12f7f1bc19b1d9e057950daeb440e1ca2783409739050661bc65d4d232331df0091706c18797c26e5005f2600481402010085b438d17c4340bbd3d46624dec199663623f4dd360ad11800b027df265720c947d629fda417dcdf33c733749f1f8866f422df26b9ba3687ae66b1b18acdd9440f62bdd566b6229fd51556c8b556af9e8d5a6a78031fa5742f9f7947f2395ff22593ec22c3c4a2a9691cc942415c58eac4ee8209387bac774b77b164d4c4cce995010680402810e03040281402010080402999cb4156102da40202ed46d47016559966559966559966559965ddb5e32b81951bf62c50a93d36b97879df267768ddf17e75c0bf4cbe3b7f73119ae8569079d8fe058a73ef4a0611e113e26c4c7b59efa0185142d038f06d7a279e22299b9d64ba31a441d1d9dbe2efccda642378b759b0884f5abf3e0cd2e5804da5c17825d44bf82b8d71300afebba2e183086e7baae99cd0b745dd917afa86de2a856caccccccccccccccddf6c298b73d6533823b5b1df176a73d500fdeaca7507293a408129b23a93602835de2afebfabcd670279cd7bc18639e60681b168d823c25a28e79af9617110c7cd90b7c845d449ebfd61f343e726343011ff5896b5df6683c68b7de53b029a698c5faba8a6bf1b57a498e926be1241921a947aec56de45a87574cd1171aacd98bb5ac05a18d3a44b864754b4b0b766173ce39e79c73ce39278661d89c73ce39e79c73ce3927c6622b029b2673622fb4e9f56de914b6828491361b933fa7121d93c3addbc4461df8e2b005c6695e4466a752d7bcaeeb8af3ba40564587bcf331dd9dcfec0481ac8e6d46d4b1968e4e890a40f320f5daa6a7802f1a0b6d85b6817d3361b50ec4562300d7025cb2280f6a54028406f2e09d9971010b669e98999999f951b9ce7975dbd8d8d8b40ddff00ddff00de9ba7ed4268046bd8629187ccd5fa02c9b73ce12ce6f46456070a9e5a5d1d9d436cc725dd7bc2e21feb54d8a0e7c11e3005f588f6f8040586fd1a96d8a4a98c5ba364395d462559d1d54cf3d9feb90d7e4311d85114120d043a0cc483689dcec4270a9e5a5d1eb281553cd623d3b0c76a1cf9e6559067aca560428d3b2ac6505c62002c69891e2262e4111e19c1e418cf48ef40163c8d435f1b68bfa437fd4ef5b01b45b6f6953d46916eb965571c8fbb54de91f8d6a8b95aad1660a57b41931cf2922ecc236269b8d6962623fcff97cd373d63a1abd5b7a5d05f8c27ac8eb2940206e3c9d36f11166b16ef14d69c9958c9258a7a079b8b112f1b2558246dfcbb60d7c619d46df9912a294739c9b0bebeb6f78862a69b4427fd4eedccdf5c92b7550502bbe8936ec851b88023d10bbd7cabd1ed3613fd98c98bfac0eaea19d3dd7fe8ed3603a4b018893412a2c30d3363563335364e6860210878a21f7870b9d40c5cc951b8d6eeb383e9fd81cf17a441f0268d4381b9fe09295791f8ccb11559359077938e40dbb74b73e373ed541fda2cec562ae396b1d8d7ebea139a85fdb5ceb140775b68de7f5d846a3fe73fb096599c937d0b619c1ddc47efceeda66c47c6665b48a8d3a6dcc11d9e334195c4bb3f189986a6b12a9538c8cfc488a6f6596c5960bab896ac78799b8a13caec39566af3adca445615c0879966450769268967efc0a74a91eb72238c21893c83ab34970894b4d5115b35f4bf55bc799b55a967e1c0246186164ab4950e776120f386981420354a949e64b0f503602051dd4adfecbda08c58399604be4c8d5bbabaae2b7b7c225295be2655597535e5256156bdd2d7d540ae571c8db0dbd1823072a0ffb705c77c0431eaab8d863260f1184e0ba98a59536d925f45015aa46a7512391fe956ee87074fd5cb1dceaa40fcaebb1a37890b17feaad9874ec1e0f320b662b8d6eda63accdea40b927c74eed575d8bb1ae04ccf6d061b6579a45a975ecda577d3bddae6d36e6c4023101ca9dc832149467198ae8190b933be104e8d99d4839ca2d120b89f4cbfb7e49a1c7d385f0c5c87e215b5d6391e28408646bb35cd70e2b0fbbd5f50abb0cae60bdde4d36f18802465ea5c634798471f459f149c52755753ffa98ed1f13b7b23a50aecabfeaf4212f26f415a715ad6cccf64f239d7e3b6e68bb7679ab07aa13a834edf6a4450b15cd0c000000015314000030140c878482d160309c6cb3520f14800e8ea04e80589ba749106308210408100304000000000000000800685d59a6b1f88ab5e416248f2e9598ba86c629c6a5b8103f5a6962543b09bed89410cdd9ca4a256eeb1682581fe72ab33e62d590980b5ad3c3c9a386f26cf9a24835d67bf8d80be8f9edd29ade72da7227f53612b4583fc6bdd91ad70daeae4a23a3a1db5b85dacf6fc8f944b89b687a1da58e2ceb2f643fffc1a613e5e6c4d2ff2479b394afa07dfa0d3e9c98db1345bf5be6c9b29d42f6f6296874a2ee9d38fd5ce917cb28b6765dc862b8f115915e3e3de2fa7dddc3c8c7778fc66557f28fb8f1d81a0190bdd3217831fa3b3234cbf2db6ada48c6a011998e8e900124dec21b61dd9b2b32bd174a4f4fd0429fdbac1ceab57cd926b2f5bcd9fafdca743c08f3134e1e12691dbb0f4fb9b879154afff8c6d08cb1b2578a8db0b2875d92fe21a26e846b6517b934e52b4ccf08d7f66c0ad3059c0f8d66ecfcfe6fc4608c13e8723ad4d496f0fb1ca5f17f80ff79cfef4a5d6313fb1d924b8780dfb6345744d2d717e2376702daa241a67baa6bd388f14461f96838fa1902abd2700ea020cca028c134611b034ceb26f9c5d45b63e5c17655b6c41a47e0894064ae7dffcc996eab6a9f0f4228363cdc64bc22d5c69fe28d0b6f5ad9a283078d246bc98a45c78fe71a2da1a37d83cdb3054d4639a23167d4ecba8db2dd78fcbb0ebf2c291f1d2df97e2610fc0619829c3289fa6e29f52b285460405be789f9b063efa853957ef7f634c9267b41ac25736bc7fc01d72f3cd52474ab885ea7ae42dcf1a3e0ea0695863c29f239111776608b96f2ffac775268fb957caba44dca76b0d83a1e7c4d15175b5f9b2c80bce9c9b00fb781584be6168fb5791b155e7d02ea9ef8b7b16820f478a2b8d6174dcbe3a3823308cb88b2c18c8fe1791f69a16681e7017fc85b6a8a9ca79e7d8f7532eff458037433f36587466cf2c08996509879d7e37ef2c00657a864c806f88209fd65b65a6d19d11e0b7180763167c84c10ef7a70da03ed63073e0af3086b3f8a4051c80619f885aa027d189936ee4e9d425cf903a860291d8745917a5edf7c2e6064f661ce7b7f51c454d428af5e901ddf125f9e96df3dfd1c34a767f816fae3c081d83a62960b0e4918fc060e2dc07ac7a4edc0609a60f7978fff31717f39fbc7ce5c3705b911a32a12f771ce0f047225d106cd71b103a17a6fee85051a631c3421cb66638f8a2c5e133a09a6d20d11b3a27e0173b911a32a12f771ce0f04722515bcdabc7edf87eff2170234a7de6ac9d7e7b16ad149c9a2077ba02dbfa9f2550f196144a8610c35ed8b2ba99cfdb2d581afa982fc6c19ea0b8dbe362b55956b074062ed6ed0027c592cbd8bb2a0ed85cf2fc0facc5a3e786e66dcb9678bcaa81673a30e5f8db2210786823c0b7403dda711933c8b2f793ab877722b527150819307bd4caefe2ee812f4324a3c0b68f2ef236d57bb7729b421413bb2f069b4f09458e3d24be52e6b8c584f47bbc6d477e83c8ba3050315c69ac8c9cb46dbe27c73d60d9dee48c2a0c1a0827557de5e47aaebb59cca4aaab4d0eb987afdb8f31c4e99298070c370e5a1af1303e8a2693e61a869d9f582a50ac507505777e8aca49039b2a831ef7490451abd987b2616326ffab86b00e927ee00ce7c622dbefc6b41bb0e474d0cb4a40a7b7180b910903e009892d26c41f37ff78a55776d43edc8c022c70b19a9b231a3a672173634c50be60acc1cfdd508558af3c9b6758a144bbfab6e40f833dafbc254c565ea57f6f41bde54a404e2145b5f60f9a663f83a6c751d94395bd9af2e0c00c15d1ce1e82df263185852eeda92d612448cf8836e020d4117b25f848031eb85528187414ece02200d6e5f155ebe19e0a008beb9018b35dc56909984c1dc6c098da0c18e0bdcf660c167c0331fc53df880f5c76833083985fd4e010aa72d8e00dcebc1ab784e95acb4dcd92991067d40fb3349eaf20a74c5d16e1687a9a437dd059acc896e9b76dd880bcebd461aed84fe41beb339d2d41bc7ac9d2b9db99499a14b764fed580b471becf9ef5c6515dc19e1c2b6d0470e14225bd4f071b33ee46bb2b7f17960de7fcfe0b6e739c7778a75e6c6e2b7b11ef6f209ed6f8a4606c21db8a51fd565974336fd0b5176dfc0f6950ce0b259aa1a1abd890f3de81157c006b632c398c48b0237b5bafea556482ecd7844a6b1a75f96ba272d59ee5ca95e50f5ca25adfde20697fc7cb6ec7b04605cc503fa77ff27fd4fd23d619c5919ac061d52786b4720017f32cbfd09ad08e73d09100f2ae9956521ab4cf58599b24fc220c67a400decbcbaa6901dc739ad4176971646dccce7632917fb5efe551113dfb9c8ae7018370d21235c7c77015327c1e32b67562fb703d49ac071d4b8ef21c7dd9c22a4ee38a6d9955754912850a10d01b560a1012ecfdbd2bd57e6a3cb0c15be01bc3f5f2ce96f12f5d1e72709228b8f6ea420ef0b3591dd3521f386a7608705f65e7c7abfa75a176b76f17baf207c61abe998aa6c170dbd89563cf5ec90c178956546b3d5c5d19de25f18a968cb5ffd344121a12de6220a3c9fd9fecd50efcfc2373428189ac80b5861864e0b049b6f540c89c544802d917d25e19ea43dd9124bf554d909686bf17f0a2eed14458bc4c609fcb77541c0db78cb07d7a1bf2aa26ef612f9a9ca26894fffa37ceaa413c3ccdb6046128aa116207a7fff9a127a2f65a7b0cd94de715207455ba961b3072ecf30b8845522360b3eaee6d479edd0f691f4110a00c8526f080c66a0182689bab4667e3dc1c79d2d86b44917fd58d1f07ac5e8633033813496c8c788babbc00981501782e06952255297b2e6eea477a964db6e5e87019b553f23570db50a94b86d935540c243f08968661cb24a80ffbe8cc7ddbbc2a8795f508bb19a139472a2e19770dcdfa825544ff2069b0964e78bc0287006a2e24c75756d7440679a59b02c170fd6f2e306a66661693e085d203635f66ca6adb34abf01cb43a73a7940de49608f265e5433c7353bc37dbf8b33f07657091e8e23f978c1b751b3f1fa7347aee8d611f56ce2eb042aed0bff122a41242423fcf0d4de62e458828e460ab9004bb4d9a39d0aab0d7aab1561fd2942226b47029ac1bb1d33d76c11a382e28d9b1447b65062b831d4ff0fd74f6a51c36e5a85925904ceff883db25012196484462ff1157d8556deb574ecd74c623d50c02e78610d07c84ea80f60c52887bd52d2c9f310079506802b5da7f2df7bb12783fb5a6142b508862b992e39e47107c418db6b6f8192937979e0ebb196200abd90f6f8bbbc76d51779e109596649c3520a50a3c2f16a6668b67282b7caac15fe494c52a6d07eb1fc81ce297dbafa8bd984b1918f44efa0f62b74ace177533245d2f665608ea037d2528a58f37d1df3acf97265d44e9bb79dd251f1978308801fe977b3d3ed1748d8f92eff496125cc5349a5c848f80ca23f7e6c6888e384dcd1681c11e65af04b48143f1b6c098b363cb28505a7f071c4533bf76dae63e3d3590b0b353fdfef55659e3f549449d1cd4dda9b3d967edbd64b79798b171bb4b5c5ea1ee9257e28bec4cf53bfb765546ab2dd2ac85f3f6c65bbb53408d1d3cf19ee6dc898eb23a046372e6bcc82d7261d34c976496fbfef53b22d6123c8712ad4c700197eedc3b3736d22bf09501e1d606dc86eb5e65364c8cc6bfcd8974ad91818983adb98ccb5f684711d484c1369730b9bf05415e6099135e15c4c630e7d21d44f5929d8bafad63955ec21d55a1f68a3e9429043d013d0102257136e71aeb2075547ecaaf07319edd028d8f0eb6a2d4f203961b3c02fd733e813580be7016747771b25796250beb9d9b4d793ffc093753a7addcfc1bbebd0e3b03516f124c0a4d781ce294917dfc0dd2de55b07b3b44bdab06e540d0acdf6053ce2d5ae9bbea2fc18c255fe21f5052f9002b03da6a50d98aed1f532926fd8284a7fa66241c3e9978fd9045ef76ac8be28c28a2f56c160b10740ac9de8a30de4fce5af7aa6b3aaee3784bd877cf9c6595dca88f9292f612f9d922208955ccaecf35c29f4f76e2a66954cfa251ce2cb47fe0955ce8149df72818e4a3c7743165d09c16469785c9c6ab4d050891b9f68c8f1a76de709f4f31720c8b807e0ff2819e7462e2a8a4d5c3bd146159400372fe4d7f7d8432f2075693cd756e56c00585ba64e25b11522bb6a5524f4dc116b5347d4c22ae6fac4c8da014a49eda077128e5fb55892e1a285df1f74ced6723e609b54f6ca2ee64435e091ddc8820bf757896a0331562cb1ba8caef01edc9517acf2989ed863cac122e19ae0e6e4ef5ee8d268a8c3fa75326095796da08fb3e71e2b342c5098a0fb921874d20dabfacf6e1380c1a2d6b47cfc32182311da59d28e42260b87201c0557f71cf233183b1a47d4a02d94533486077c400f874da84a60fbebb4c00e48fd8d4790e31de14d0e163a1e0ad24b3ead00e6dadce6712f152655f0fc0e76814c95e61d813a64f65cdd137fe2bed3b8070092db6cfc2a69500c2dd4881552ef5853934e957e69e8d1165f48be14511e3c118d57424a5d10989b99fdf0dc6fb8990591c1c0f6306be15abf6743bd9ac1f5613dcccccc0fda22c44ce58f37c25579629198e11f78df69800ba578bb101e47adb97fe62a4b54f6b4e941fa2510af9c52e555ca6a0d5e09fbc0bab94ac70544f7dd3bc4ce0017c31ca67a7f94c4ba5172a0a654d0098de8ff29b0e5add368ba0814e4ba0d3062fd55ede3b81e12fbc99d1566de582658a60b82bede607db00ee315303d9b854333b30221c6e755d30392944c622963334a47f5b7bc1c1a05bb0b14e1e9bb292d8acbf6171451eaa602c8874ea8a50ed1938a67f8874d1062e9982cbdfed69993c42d4ec4a84e40c2dbf4806885aaab7004c259b9c126add8aef72875411a18a54ee9e8e9674b0c0f7a1a0de2bcf63574633aa6709eea12155e34a881b40ee4f4450676d6a05f8fd7e3d9aac2d4ae78485d6ac8e777863bbd0c2957d8f2831a6ad9cc1acf758486a54ae4f075979e5211935cfb9d638799b8636153d3ce1528a36fcc0a0e4dcc904df1ee2942b28f9560e1f917c8b8c454a78ceb29d98400095100f4411e55916d7268609e0bdaf28a48eff58288b0493519cf2267de141379e1b8aac2516e01991aee7114702638f757ac24312b31733fe74e26ef2ad81a16f5bc74c9fd4b24b692097292ebccf9c0edbc8d8a0bd51706ee49b837bda466fdb30659b9c2ee1a76c998ff47d3b01ef4ce00435d86eed3e1112e18171419f90588ada2dcc18ca472d5d3265f926761dd29ab4810f02881009af3e901146fa40671768ec98cd70ecce8936a60f3100603a53013c3f56d2d9771f83f4949f0e88029c8a3c32b322a529aa084708bb70eaa50e09c635818a17bd300e24511db2cc9cc1ed39de6f3e96569a42de732f31f9af4e3008f4b3b1a35a86086bfb226aa977a1c5b669d91c2df066168d5a4637aa8a54a3f73ee1044bf2c48ecb63fc194ecc4567f9d1501fed142f57a58cc6f2fbe03525723308ba4d6eafab62babedeb339bcfc518fc5fa8f49ddf0574f584fbc1825bd1f9d31764af66506fe7151539d1537fa6bb654f02bb76ca6f63e43c1ac85a44158dbf8abf4c4de5e61a61693e974a824ced34d730ae11161ea0ef9aaeade7d6e2dab62f9bb0787c2037c4bde33ec40b8f9658f096472dca82b88481b43ae5726529a8d1e0b3160d3443259a84e2de46176d68df461bdfa12892de14dd67c111e1fe5d47d21901003b8a63b0f0ab4e6e3877d18b6082b6da33795c11b1fa3861fb3e9247e14c8f42c45e44e30ec55aea413abab18295f5186ce622ad9c72e2999fb320f738acad799d53ef49baf149124253128d4b4ca23e4f2a25db802b11292469f3619f57885014835a07d9a0bd0213aa7ffbf00dbd38aeaea930d0517816ada6b05fb6c85511cbc077af06c86e57433c8f82296650a979f71e177522334ea46067ce8aa6da79fafc8e506ee41934381073ee26fa7652d1ae7a2511d02b116688118c045534e95150820db7d6be9986d1b2d8f2d77b47f59eb688c2f8e256978bf48eaf8a6c6669ee3932537aabefcd57b55d6c65411fb4917d466b4df6e035335287c19b3fb5e2173fe6ff0c8215339c1f2405d2965d8bb0604be06c4d525540ab035ab2213f3cc701bf034b5bb064cebb2e04f8212f53f3adb3ab0cb3e2e243fa1dbef430794c476e8001620f40a0aea8a00d0aec7baf71a617a2eff35fac9c12c9c29028eb7f03c230dab557bd44b49368b2734856d8ee954e7da6dd955402843cac32def8601798e475b41d16a443749ab0861da09fe1f6617b02bb0216ec2e687ff68e9a8968ce2af2ab997f093794ec140fcc0225f3953d45fab2457e078d3c5d9b0b22b493ad486e4ee912255cce639c66409f14122b5ca7325245a9035d0bac2a10a8c5808dcebd1d32d8cc05d2dca35fedf4dd4e206393239202145363482d30bac50bfd8273efd25bd67bf78c17c4de5a1c688d5106ed19a99a6bb738be2bf3335ee49a805c0c032b2b461f606003d964f025c5635d9eab7c4053dd0721e797f59e8a9fac5a39abcdff0b6ab26b976449953c5fef09934ac21791c05d8528857b5db586c9887c683029edb9a8a51a5fe35a2cc53caa130b5b8e552723efa725ca8be4d1538e891cc54d694198d73c31867eef060a8f4934f9993d78811ede3dc0e083be5882761ac482beb31b877dfd4944bc857025f42c445e964d7cc66a08c6d0cc6dc9aa81918ce9b1b19a9850e6a844702144e5ef46ac5ab06e22d9b876360de5aa166471d772272e47d5f1a3e5b8aadd1722578d33235df52a835d05bb8cb9932d2a23c3c7dcccf619d4c7590bed49d4f821fb59fbec3a1fad43a1d83901320be562a1396a7944e25b8b667150900bb6835186d5ec0f296a463bfb938b43faac1f69cea1e413fcfdee6bce07a81773f06bc835c8f18cdf600a7bf077880c5eeb6caecc2fcd5680965115960ced412d5db1a527338186ec294349da1b08421f1a2fed046e6ff7c354a31d469723396c61ed0d20268afa9dd1e38b7524bda52008d4f6c04ea5887bf81e8498b0a6beb25d52ebfa64c92367adba161a4316785cc705a266931dca91b5ed7f0f96f56dfc6f61ad446319c8293e4d440cf9855c0d84fe9e532fb8e59d6ededbc0abd6392286f395a4f8e5a845a16ca89e3731ae602717fce85f358a95609e32b150b5c595fd2f7b3e1c62b096320752788cc3f772df1427420f16c7f0963c3411ddc58cc1852c1200cbfd09f2a58cafbce7602681c44e8c346460b01dce4e82ba37b7fb62a195078d6146d69c663a371989852db50ca52b0c564e593228cfed30a8236a5b56d52318dd2ae8c566cc9978ea079bbc5b46a9df6868d104eed2f1a640f117684670aa7efbb380ca16a84c80f30841dede0240ad9717372f3c44537c6a45b6b52649de5f90447e568560b2063e619b2fe4a27811f058be5819138a48857d364f091a99522c75247f980e05eae4bc06762e99fe04ea8877df53c0d76593f474c1cc5300b4e81794d0709dd424521a987b3f4ff8ecdd52e4838d24436482ce9767e608297d4977ef7c2383d777bc51edaa5c51a5fae9892c68c78bea0a7f893950fe35765c8cf61a6679af3e2563d347e73c02b0892f313cd02e2e07c784992a47ed556c25c60a3893bf77753dabbfca4e16ace5460a29287e5c909aa494098b87b91b5f8ca462662e72703cc6cec49d0586cb25774cef725661c4228ab50066d4e315c334323c1d48da2a2528f8bd5e8c697ec446a46ad8db7dc8716567fbef5f4f4e1d0d9722d517ed50b66b258f73f5ec5add737388137ca32afce8964484dd9123ce25def66f385f7391c796019aee61aa1a99da5f9cb05daf83e8f7ef89448ea87a8d5964ca64d14ee7e647e64de70f2dbc341321cebcfe01160c58e24fa3b9341da71da009e305d20d1e18ae3d56589f3ed9ba9d2e33011a85a080bf800dfedb1aa06793e967d7f935ea23fd35f61c56011e2461651b7469ba2f134fb99d47273be2eccd161fde353c2663accb018f5183b5d33727606ab1bbcb150192d34f1dff643be0b8081ed38617ba037dec29bff1c223a62406f0a9b5fed5f56800271a67427c34c55a7492deb25e80509181ccf195f40d3d2cd1b6eb8dcc369c1d554df39dd666b12d53867332141ce82d4b444d05af900c5ddbc801807a2a54a4115866ee1787b12fdb2eafbc8173818b250e95afb4a911727213b07098edf661ffb215eb2c87e5c2c52b97bdea600e852bda0df49af6e1d1bed35f9836e8e535652a64b4bf68e31c72eed67bb5d9e89cf97569d0e977cc47ef7065ab2d19b197ade165da541b5b0690c3d802c740340d7fe4f8d0ecf94b4381cd80c70152d59a773ad21414ffeff206be3cf005a32957446229ed3b4a12e208634f4723a0dc961d6db83be650a7303e8191836aae2bfdfee1b327a28bc360275a0343b497acb2a360efad6ddc6a948abb60f561ed89dc400d1862de74beefdbf0bda0fcf937091e8a288068532b30b6ed04f41c1066c0a0475fe7b616e1ab365fa28b04cee7099c702b60963ab9786a6ae83ff8e26f10dc50930c4a2fdd4a008625457e42c0796c4c85118eeef93cb5ec6f6a5c91c6a6a6828fc60c3599301bfe8f52afa2817b4745e542d98e2bb78af2af7a62b8a9614e9ff258e3c4f89acb39f06bd677c9a945008ca76d1f2edf62bd72ad48836dfc96cb16799abb449fa84e7b28bff425f7fba3cb3ab1718b6473e6ec307d71c3fb3e452564c50665f1882949ffaaaa2535d4c1319e8c3dd47a05b7607802d76911cf924e7be98fd60a3d2ba9bffe52c333de1f73a8ca9f98ecb745dbab86e0e13d68127216d022c3b6b18d37def8a4aa006c35aeae62bac1a0fcec6ba6cd96f5ebe53719a920a3d05fa8afdae0a44d13886dd5023455938ab57129fe91d9edc76a5a1b4354fdbee845505deb9edb8ceecd6d9cc7f789da35c2f4729b587812da24d5fb1148ba6330d5a0307e0fe61aa6acd8d5b5f1ea6e3249f087cd4ba504d6415b8bac031a3dda644e7d810a9a18d59e552d8634b0a8e48155a5634f63497fb00ad762a7bda5346fdc19f94bdaca2e0c6aefb74875aa8cf26d1d30594cee3456aa4f6eb84f008de877acc7a59608b013e21bc501c30e00f298c5740f45b675885ba20cf775a32ac3f30319211005ddf8517afe4d28110a3ee280b371f7e62b5ed82de284e6ac630ac4b06b43dd57609861cd969f432d1ea95357efe798e04939e356cf71061207cda2fbb9df4fabf10a823b6c902d05a8acd4268b7454bb40300db1261a3408ec39783b04415a025b70e21bf2163cf949d6fa10dda3ce0c45d6f0495e765d41ad3b0fa9853299655930b30bec2d5913dc47a987e201a8dc40ebb3f7ed1bdeaf9f7c013d6ecb3ddd6825495f2d1969d1af6937f0537fa0292607a79692997f1d55dadce6618d10fcd73cb9a373a80d4398f4be33ba9960b48f2543c57f374b814deb8e5eb0ee4e82f251ad86fa3bd8deb9a66dd3a384286b4562281b40acfdc46f059d28be991720a96b089ed8e76180d3abc559680444cd2c623f8d5f9cb9edf2a2fd64d3e8f1562d08bce36f24a80de62dfce5de3c7f5d67b6ed678b586bc38bb560fc32432e99e2d0620c0210bd1dbbd01845568a029ec6ca6bb47b39f52f22af4919dddb3e447eede3d6c6123441eb16512164e99e84ff1d1fd37bb418a79e398e845283bd0fe25ba5ffef0c41f6ebd56c4f0407652d98504770a32a34b38cdacad5b66116d63bcf1e2c55a1e1b75790640568653267f582b201b02dc71842aabec773268a4614f4543037909367f3cab2b2d0dd885936c7414cd5871b1595a6af6cfeba364f740b4472d17418189503fa6c48b64a639eb12b070b8b95f20c45d9359c0665d42875352d6c041d8f884e323c59e1441d78bc39ba5facdb9bf7417ddab44315d84d693792415752b9f3ade375bf484222f46fc8329e7241aae54de79c7efbe733feae22063f82b0824e9e82010df6bb6999c9355947e273c8cfba9ceec66d0a4639106bd347a5c5f7538a586403623317c5bf7faeebe0e045f316d91ab09302f105c26e4cc38da70d445dc1f889f22de5f46d766778637d21c752e9633a9fa5857590a0cfe1199aedf54af66b7fcc166d6458a3419476ff2eed8c05cb004a64c6800d199f0971095c595ce6c676bdfd64d7546ad3857b22a784a0f1558355ec9981d5c861d0423122a518a3db86bdbb7cc4a1b0fc88fa979b67105aa2c01f58971a83c42d23b35172d5865bbaa95a72c282b41a4e67b527eeda09a01cceeb6fca74ee573711bb9c8583bb95ff7986b1a4e6b52d1921111eea2038e2ad65a4d0f70e7bbd45b7c137ee65239ab4b3ed6643339f43b462152d84e3ffbe7347a69f334573e9ef27e0c6382f2904f284c5511d63df575095b220681e28a674aae2806f76b2c1a435640d36e921829291ffe0c73a23a7a75b6ebaf9ac187863d1ef65479a045d34abe1f323317adbe1bf4f97cd2a9eba631e98720217141375a6541be7b9abdce5348a541bd7b2ebb5056d08c4455df235309b5ca24869be820bb67e269e06df5339802935cb1fb3bea430b322e0661966539ed2f116a99a8eff8657c38a094fe3eb7a80e5c4390c297327a6eb1decba248b560f932c7628302d17271a0dcd7098c02974d7966bae4c737a67764c4a60d5471397411043d2cae12b83311b3ee36619cd0d020b558dd5c47ca90bac3109c1f5aa0aa3ebf4703506288be61698c3f6d8bebf343cb01e6ca2579b4268d90e33fcbeabf69d8332926b9eedb34bff944cc860f739ae6e884693291885f4f0637219b9935500386c232cfc9f6fec7f1febabb9e7856b7752bd67e120824c6bcd35209827aad0cd5418426349dbdc48d1d7912e2a9a1ac806bbf7f419eabc8465bf20f184067fb6c15327472bfee6f4287267ba893e86dde91e4ce60912781f00f9d81f6568a678d1178eabb85826acca24a98a86c83127813b61db0d064aaab1612952b679aa6e2169009555836c56aae0453b818d9d6ccfea2e3d11db5e248e94d9ec7e43263b8f03ab6e05d559a46c93bf648e1ff04f0e2230863a4b5b14f170652c6667443e32d2abbcfe4bd5a764f4737a5511f53b438ed4cf26f4a7e4ce4bc3c6f9a721f0c8c9b6e23d0f13afb66a6799dd63ee39f2beddcb8f5b92c8937b4cd2180d15afc3f45bf8535b2d7276cd34b92dfa52a59752dc8372957afb67cbcd4c6941301550cb2d7c995762ea2a1ec95420f891a1ce2d9cf30b1654fdf2dc32c62d4312d9b35683069c6a3d4db5cfb74baa34f26265e29a54d6ad3751aa16137e44d7d0426d7189cb91c142abe2bac82773c4e574fda73d6ada1de60a7206a834cb638747c406480b79b4ceb81a3fcc39df5bada4756ceb3706684c577fa160c62ed10ae6b1be9ec95b06d82838b4d59ae2ddfd65b0793890542f6b44842ebc07e8a7b3287111d4cc7dab36f2698a0c1c8e50644d0729f059d894d612eebea4e18984046d0e5240124eb3fca78f0b25fda57ac3b24adc733a613935a6712d00676b33b32c499aef8c6399c8256901a748cdace2db35f3468000bc9de41654f726f3b9efc68041256969b0a544cdd7a4debd9cb74c069230a492fd0a0204c7d8d40960bd3b9b399fb8400de8c278d79aafe57b958b64bcd1443dce6a4426a0d452560f34ec4a7df410c0ab416ba4bc01190550e1717ebb55bbd2143e8b4351cfbef1093919dfce3f8f26277d27fe5fae58636995e6d2f3b45386b05e9c3bf1532bc6f2dae46e6399b87338ec461c73bd0372edb74a158b57da53abca9112213d58e473c160008a8cb8086b34c07d61bcd9123f8def16c45d14d2c2e933a22904b707600c8cfc68a9a0fdfd2ca83a95a95149351dd6535290721dad8725de2ddd6a3927bf9e409929b75d70a8255d57323690c23c86dbc489b309f05583f4a5d9e90d394904ced6191773bcf303beda70f5ddce55ed50416de4190cfeffbac0a2f8a6da282c7203493f8cd2612968cb3b86aa13de9c5302fbe362d0520cc02aaa71acba73230b91ce4a11b4dd97fb0a3e146dc329f6cc5492d22863d6ec5d17c72d85b6af546fcaceba45d3bd89388998016e74784f8ed8415ee08c31877074d5805bb4e1a0e7b7156c241a87da8080a52892496aace4191d6f21afed36d44b7980f65ba921b89b04f83380cacf1bb37f394a3b2f2b019990704168b18d208e0c7893f00a2ac2ae92d34415f40b98a6e39c415404d934eb0d4b7f799caa732e063c660143e764d8bff74f7943a80453b4ef5fb3f4812f139bb0fc86736d76b1c65c60df8df0f8e30083fb52a20734e3f5e8a89f66c481ea0c0bcad9d5a24b15de7c23cafd6aafc010d2687e07905f4018816eea37aa8f0d89b82cda339e586ab8c962af792cb2654349dd4d8760dbdd38714ac124e8577898a14cf1729a3b2c1ea3c99d076f0f5a972cb247ccf0b12f0f843e1330830d09a9867dd4628b033570fe804f6edcb14831fdf87b9f323a664acb77990ebe8924055bf544232495dcbf2a10406a9d61dd4cbd546d797a296f5f3388f6db247c24d54b7eab464cd1e49b2967a4976835e020845a5a0a7351c4f002df0726f188ad883cdb3490cf866f5a901603a300b5d8d8ad4a30a420ec8f26b2d78e611573f35435d2a786eaed43981b77756b19db5b7fd0c962a99ab08563edff0f634bfa9fd80c299cd1a9664e878a98b1f445824d741f1de012a1ad18d0c20e6590efa0e4d2407e4e1c3465d73a14591c59ba92dc0582d8a112a4e0e5416ca358da948ac74cb2d4562e0a1cc9273b8cb6f6d2493146e34eccffc0cadf002ac08352358d041dcb1379df890bc329582aa1139a47dad8a557a064d2cc585aa8ba693ffe524e528118850a7e0871115d5b0c9ab8eeb1cc3ac5ee8a2139d2ce0bd82db4317e4eded5ef3ffab48d05e11be289cfd5af6904ec0d9dca28ce057673cf31063308565da34bd584747c66b3b89419c778c14d503d60a0d5cc3adc1fac4b0b2db184e23ad8c29f5e66572b6afd79e5d1012a9e012ff4e695e9bb293dd8f74ce07856768edf1b667a803f0aeb036c8593898845625f5b6109e52e105f1ab969ee65b37cf76bf41bdbf4573985603e8e5e48b037a33bfb329f2df66562f2d4c793f591c3feeb3d82f855a99ede6d0f0a71a5940bd6d5dd75c121e141bfa549600233f4237a06484a521a787e25d0385b5f4c9451f9f8fec3cd87234162d76bddabfaa523e840d30ce34e9b25f244f4a86c70c82aaba3104d3ab35b34d9d6ca77ac4a703cb7cb0f63cb9514ef56403fdf1b44a1a918d2996ebf8abb72f278f972d88b796d66013eb12456e6182ad7cc480dc7706b31c31bf3556d5f239ed975492fda6d26e05a75d827caa7139f1e157bda351738447f7b083f5ae80335235a595fe2c2a6b120b4c90ac5bd2ee65699ed2c6c8dcef2d1536cf59abef3077a48b4fdef3534e4c5e50ce8e47d9fc96555374c2b35777b613f2056c4da689be1d03f1e31af09101d2e2cdeddc8e0395af5bb40bb39895b3c6c038ecadc25dccfdb2dde59653367b4df401229dc7565134985929e152312a313c9e1e5119835e6f44b0f7f9fb6a49709dc26f9368b6c56e37ff040a96b7dc36639f03e260ab4c5eed69cbc900006017c8d316e9fc9fac8864f9ec106ef63b0119255ae027df552f4fcd5424288fa81066eb5e2e16cf328cda228d750dafdda23571f4377aa2702b4d5cfb37b82df59326b1f80d432db56a9197c4156689bc05d72647f68d8a54db7f5c046243f315e1d472cf92c70cdefa04b1c1a48a17724ed1169c661ff059366fcccbc5286f5e7de86595c76cafb31f0967d3d61fc9ee16cc3a1b6f60b4c1c375ce7c34e778cf3d7c3a83db546161f4bd9776fe5fdfa0848af5896161fc40ab555133542413bfefa0bcf70e3464f47c3c14393a816336cdc13635ce63a09de462e81792f7c90d8143e1184e38052789a79d960ff8926fa215cac4c867d6aff2b4ff5c105be769947309d3a17e5c8a7bcf55120edbd3668361dd39cd4de9069231a5b81cccedb9609c6923019ffa0b7f562b715ba5399dd22d2794d5af74996fe3b1b9c9817b184dab6576bc61bd53218de28b5be306ecf0742d98a18bc40be44a36a956fe6f84565145704516c197caaa1846ae69ebcf6bf43d5a33d29ff9adf762971c80004fd578fb411bf6c9b47dc61aacc0a3259e89bbb9c02ae0dcc01244c27a254e4f9017f324044bdf11379dbeb3ddba2bb37c0c10e14ecd2b27d36ee3e98c80618b8d976557cf1e5b0eccd6b078c802fbb7074ebc04603e8d8ba55152fd77954fb963de3211bbb79aa9c133af2bcf5285d84d3adf6609385311d501c0e3311ac36e0f87735b8161acde85d9546aca7f8c54022cd29642bdb960b7bd339b6fd8acfe469903e867c025443fe92761e12e6627e4cdbaa35951f99ac941f1ed7a5c5487b9a57d3b69e8de0c4b5fae873247e9de05fcd87ffb5bd522eca7542bc125bd78aa8ffb1c9c4a509106e74aac047376bf01be082b7a0403a14ed00fcc3be06e96d5afe5b907626b21644bdb5c17fab4021fbe7f7d64c2a3275629f1f1fad582998b4829c40e3754ce351d4914d52291bb51b14edb765b1adc8358385e1962905493a149845a379a9876960f1fb1c9c26315a11fd126b3a3333dac201ace5961df881f6ba691b6cb5b5ffeb030c8349a042b7546e78c12ac0c45e594c2385bfc84528361394235e52ad423f408b517103e0eb4d3968d509342713338d8d66586fd51b72822806ece773fd806db6fcc6a369324c684e4d367b390a47a4a10b392ec8017a6f966b2c7b89ef6bee0634ae1d280c18ba81aa5a1e403e12a1217d3a85b9567f95d3f8d2c3cb3120c94f0eacabdebb8e03ec00f016bbe08ad5e0dd80d0a1149de18575eea75f59d59388f62b7cf09efac52501289ac48c031f561708120d78418754848ae1f9eb6cf836361f4aae08491c1634a3062fc21095c627757a4961a509f0500897bcc08b68c452bef51e8afb11106ab2186cdc010215a842a4379414e929acf39553861071dd9f3f73b882f447d6e1716597914d59bb3c7bfb453d64a12584a9fa0ad9110c14aa741afe23167f45451ef554212ebec755222c90ce64539daeaa02b66a0580759523d84f69a17bc5a85078909e41c58e86831ed1d87c6fb411e1d35384d2541c9d3e734c8f7cfc4fef8ecb208209b6a2d6073987c867f30f5b631cff37e192f8723e0a697e4b7337b3f23a8656f87dfc7e8ef8303d482b8b396355eb7e30868478dc1e98cc889e9bbdcff99e5620992ad14605642d6f7a22efe68350e43f8385f4ba5e733686a855bbcb9f9e738170d491f87d3978b23fb00a09c350f1d07eaae9560a9ee0fa2367600c54925461431151a96d365ab9a59d834d6f21435c7d7d1b49b14285c2a0f74b0329269b4e0af080c50487eb38b87eab7634cd87f23e906087dd8b886811042d9e789ff585d0996ee756026477b4591916fd29745485b3a24186ac87397321a5c51c7f27912d09a8ea517459a35711baf03c81fcf4b6b471082aa64a6589b775534c67fab463de294633d0d2c5e48e4b15d97c3995bcdf80e2facf76016ae76cbc3d0efe4361ae8a6a24dc0b52b111da75ea8679566787060558f9c5cd976e5f7afa995d70d04ac87267831d77634a7c7b03f14d3594553917b4ba0a37ca56d10ee52f52e7f766c712548c7a3fb9037b8ac2a57c1bf237e08ac2d8c643dfa092bb2b8ed28067f3d7c343e4f79158eecdabe0913855486aa80d4ba02b087897c636fc135f70e4d8a2ff417ac1a141a0ec6a0d2e97a91d1ffb12b4e94f6f305f4d7c4134fd8e3543e3c78f0e720b16814ea5f4e23bc453d7af30e9ba4fb03fe12bc20f3ece6681aba73d61b98830ab7742a91a664845113ea21a5e640405511edeccb2bda9ae2757c2beb2145abc3ffb6f1a0de6fd0824d24f62e39871f1b266e645528a6056bef578c49d0ce435555fc8fcb8e4751c818328444cac9475743441cd166026fe9e59906fd22e33088bed165f56f343a6296b4cdee6ed32a50bac85d9e7b5b64aaef2a297754a796f059d1258bcae534166de24894d8fdd6e22ad96e3738ff3d741fc94e6ff36ff9b452f9abe19ec55924329d05d3bf5fef37729be98a8fffc8ae6a3bfee0f5fd6785929ee81421d5b15f033c2c03d623700eb325c679fce7276896db118916f1808bba5df56c4a088b9eac4b3e540fffb4793b9b77e02990423753ad6bff5abb0e05ac4a0372dcf6f1d48a12f8267f1f7e2d314f75963c61b2e2adb35ea84045537da5bb4b989013260738ab1f5c9cc71a882c0d1013ebffbc1b88f0e11aecf6634ae224e95b5b5ebf1b0f5d28b871bb1bb951fcd16d40e134515f26d4c9492f33709a2de0ef7677c8a0d3944b741fde085c9218f8ebe8b8e78f1bbfbbf4a47309bacca933c0928648f3eb35c97ed2c8576cf881aca86b7555ae72c96df67b15e85e7bdd5540df48edc4428b922c91f09825a6e7343039a56f02c24f2025ae645b86439d6b109fbba601bf22b453746ed7d333912d1d9fe359b4e6b51f795a338c0a95eb036a019aefd6f5eb3e55754b4f44f5ce3ab7a8624accb965252a56332a68355697658374625de2e0e59c31dd856218e90ef5724cde1c4428e397dc6da094f936402f6980d7422571ec87ad1ed20f2946335f8bc130d30a8dc3e90b23537c42990e790b52b7a648d3050d2689ddecec101c9a957037cc4e41a9a8148d8d6f038e6f7d0f93465e6bdc732eb7dc3daa9f17e00b29122f28ffdbc8d02fbde8d7f13c8b22edb10387ed376f4386d81d02eb8097891f9edb9bf994a211679489de1ed8448677ff888d03fb39cd148d407e91a3db9ee4a9bd9d90894224144a321ae9ec762e0572da6b6c0948dd189c270364138c0c868cc07ce880dfd5e6163f65d3d40ca9fb595d37cfe2b9592257bd012895d7f3b1d632210cfa113d1590e5dec20a468518953461b0474b7e66edfcc949447cfd4f2acc27bf5bbe12e31befa2224546d38d721960d37bcb64b3fe70a008f32c54c1463570fc3062f5c8625b361d9c117be542e3550398f6859a8def7beefb7154b20a4d5df7e9eb2e3ad3a5c4d0e0023d85ec0e67ffbaf525b898c43fd4f54feebfaa9f45c156680b5d9415e149b5e23dcb2de2c250a830fda14b7d6ea6dbccc89837327d3fdd72ae6e241843e160731d2402aa4b9ae512776c5eb7cc1b458adb83219bd49aaa2fd88f8da1f71a0102bfc5151eeab6bddcd579b66c2f2806835b471b7225e157fbcbc8e28b4b47567b4b8f9cb2271e3c8fae6516ef49752c0b3f8aef9bc568134213e630599f98430b890c9de04017ec50f0dccf1ca5aa6301a37c7479a398bea29ae56c92eb0e7cf4e26c2b74961474de20832979d4fa55b0b7bd71a510dabe4209acb7fbbcae4b3820210ad515e9f2612d4e8186233962c92f0c6ec0cbd0270a0751bb22d1db827dc5c1203894d840332e1603fe3d0e09b0cdc1064b3442b02c7f9b31397c5926bd815a165746827f8c844b144568eff62007c0c474b16e85f78b8ef12935906e1772cf3c6acc3bf0025a215a0068a1fc029322c6864033e366fc79347efa71d249bc49eb487e02910b7f7c7523d370e8172d582a83288f16b35d14677864d0aa2e0c002cc7f23673afefb916981863beb642ff11cc53ee87729797ef8023109bac19d74e1af6ec2551e16de8d6279c460d278ab850e00708c9b66c1e5773214bfb354dbc9ce523a0ed7419d29bffc7c216e4cf40ca31255062adf05427d94b108d4aa3bf7d0d074e283378772d66faca7e58b1d5340a314b9a246ccb48278ba51bfea99202a8ff73b416bef230ef4731d109631679cea3e10643e69694643461a421915308bdbf74311677503838128cf4c0e34a568f26cd40fa97faa56ddfb452cb87154d11d38108c5f0a20941ca045d5fbc3eb4f6a4f3819f82246a89f95486a6abd196725ea04721b1f67124e08c5de2ff3cb54aa19a3a3164ace443afcf2143517d29b286fc5fcfc2a11d3b8c3fc3b8370896e902fde13860a2f6e1e3339103648ed3ae2f4e69e2ea7f789d06f48a560d550248f0e969a92d4d97195db48d4fe2040ce5d9446954ccc436bf525fd9846daab944530ce82e3bf7c0cef4239f06b4e2bbdda196f5b198ecd84b7b868e63491fe347983a1ab854e39af6c7988fd8140d496cca9891109032a36abc59c2727037de54897b2911f83f207288af404450322a119e24f383f6538d52405f7197e07b41f111a40a4e81e0c68336a8f20c21a8e835525af0e57685cdcbf9269a305ed7c2238af5416f823d396fd384a31856ebdfeb22895898b25cebe783470e21c145bcb0fbe7677896ca865d8be3614c24cd124e7a380ee8b3b54c25c6ff98a435c2db5784637210e2d321dbeef63e51ca7376222e9ae55ca3f663ea1e575643dff2c749e93e7d96e31724b261c7a83158922b88a817a55ca648ae189ba60eaa9ae62b4169c8148e7de681debe321e366eb85a88686d3f8f3dc2e4e6fc34bd94bfef2ca66a5bb1f10d79a107538fcf13375d004cd2a8ea94f540dc9807d8c0fd67bfaab30cf3ba858cb3145477241889592098e541dddc271cfea855ed6ec556274070c90bb76d43d053a9344788bf6a5790c648db45bc7173d7a3b63d48b5e874217d406e01573f8a30146ce300732875f65a5dce410f5c1e2fdaecc72320662958346cbc1c4951c37a17ac4b80af1b60b56c8a7924073b1524a8d9e35b6199acc61ab07fac9a07da3e08e0e1a3758536342cb57df936a1267a6268ead689c82580ec48ec7a574613e6216dfcbbb084c2871035f5ef9e80b9d1215335f7e5fc55477f1c88b26543845483f5098cb5b8da6badbf7827ea2e1d2c23e8f0690b91329df3a4647010d35a7c99856b581c1e9bc421ec3ea19ea30de403b792576c8c5a18e92f4b80e32d19169ea9f9529c21f4ce7d12697ffbc5907281da8e4abf2ecfc516ea91be8ca9415fafa7493492ca5d8c48be37523d9ede35d2e0a0064cd759a24bcc6b5f78932863d4571235079437472bac22639b2bd3f8fa49f6b48a1590791c9b98636c3035a46c155df103043af98f8611b84f21de71349371ec792095f45616edfd3653122c006cab84ef3c102a6fb70a6f13e05c1fcadf36c75128862e64c7975fd38547d69a89406e9baacc9eff35b5f8ea18cb5474cf2cdb3194e6eb0c103e823259d3dd0a6e039b98f5fe2ab8ff95c3166d465a6ab0ef82e079d49bd5d027ebbe346bc00cb8b96dc8157154f697b90f9ef52eaf1d7491891fbe7dea07dfa84dbb40959784cac2acf3c0cb64e768441919bf247af97e8897ceb8c9fa078cd00c4eb7ea617291fa33afd84ab2d8a5f225d1e6b9688cd4bc9508af8ae3dc599359fc419e69a6161f41263e52557961b3860831f677df49aca4d28f947a90f182bc082e46b78cb8c575b23d5610ca976a6a55d092756aaa6b0e157e1adee184682e6b4cdd0eb538d169562750d24a5511d0743c581e16cb8c59d8dabfcaef961768f7edaf961c12a2ee55aa830be47906c5e7d250cc4431d0cb1ac34ad4df48d03090bbf28f1c9bca90dae8fb6545336fffb8b2bab49b1850c07129f7cffba8b639f25d00d60edef4f188452500dcdd07aee72ebdc6a23e172f92fc7d3d802aa0f0da0fadd1f562543235052f04dac420db4f86a19d0ac787d03fb98a1ffe2851074423e29a54d4f7dda91d72efb72d3331fa1c8f7c18211cc916abedf88498ff914da2462120353a70510d6f53c83519a78092220bc341abd1376565dafc68d52b19e98fe77987dbf10b369eb399451172b711e54cbc0b1479773a5a9e5f071e9c4ccbbc5ed9affb523f132892f4c8b986a2a2e4d6b3a26383dcbb93086fb09cd3ffb2528334d29781d31f8e9cded51665461b31c41776d86b89ed432d80b528310091cfac32023e62b4d11f368d4e51e62e69e7c13065b8090b2a7a68231770d046af9cc691b4e3e63c321ffe190f1e8e5b724cc1384c1c2b420fdb2b397a1680e29eb3d1662fbcb91c6f90093f4ae4df2b926034c52ea88b720124ea3c50b7a8738e2da879b2478a5c03012c2cf56349265c52e41e0f01a178cedeb4f23508bb1414ed684b978e62c07a64fceab7a910088a56cf863dbf1a0d630381785133dbc70ea788c2bd58285808f7d7fe7a300df8d023a15b91c533223db81b767d8d71f05603cf22dc47e406e92769d449fbd68deadca55623341e0ab850bb065a9ae4aa98c9d3c0cbd262d8d46ac3e9dd359f601088c02aa36c6943960db5edfb9a6446ea095a1476e4474a95e35a98e18b8c9810ad417ee7a804d79db25b4d960ba11eb276bb146d1fc0c3635b0a824597eb4c5a77a5bd5d921512924975a4e1e2261949216445f9fbb18653ff50442488a30147c5501f44538b893379394cd859a2701fdd0ceef297e077d33f48d24125465e0fa976f381b4769567f88690cd9070f6c968f0f782d401d4fb39dd562f4b37c48b7d392f9bf1a5f3d63410e91d05017bd0180c6016884ebec57762f5c6813b0e5a3fbdb953b3ca868d3a7dea1ca9ea9dbefb59305880e3a7b0d3a0edf7f153594565ffca26b8c16fda6f780952844e6ca917cd1192c47557082a71d82cfd350852a322b3ac25cbe41d084c95054cff54e37eaa21358c3678b3d117a26360400261033da83f07f1591fc30c4703ffd5d7e1aa31d730d5be6a3e6b0e47592a6b13617f03035d9c47a22a5e47af1d7c2cfe4b562c78a783a64adca82384b5b12c48e731e558cd79be2b0916d93599506e3e1537a7288d79503f8fd7672fcba6ae8c4ae2c73c542dc2943e6d075663f4add25a023bba664a985500d971ca5fe4792d19269054f60e8c8a22205c2cf77ecdf6210b02918d9cf0b157bf17df2311af2cc82a3a3822da730467eba02cb020fbc45bdd7d5f054224a9793d450ee7acc7cc6436c152bd28db954ad5026d7f4003b3e1531944085ad8b942cd2e50277991376901ee2cd2d4a0c69beab14e50c5378d275f2c33d48149049e6f89f9b085ef03a33c2af8f04b8e2b8708032b716b579bb00a03eb578e98bc5e0a54257323923cb7bdf00064ed6e5ac48ce6c0186cc82e4938691d126f7fb5865c0c80105fa0f7805105d957782100306e6ee56eb68740be6919f65c68f08ffcc68b16043576676bb280998b6dde2269569d664e42a5d3867ac5421844936a6d4c48ff4d88e7a338880390090901b398a394e417cd938f5129fe5c7f8ae61f3eeccf663c8af8ecc8b365f6723b281631f85bd687b3dad6cef8f0d0449b37ae86c162b1f45d0acc2c8279eb68b0d830d0872412cfec6d3c8eda0b7205871c81ca6c7a682c7f1164e086282918775e47817cdcf5d1bda3995c15c46e3f030978bb3d780965e3761324b0c24facb34e94521138e91f2d83b0e66cdb124bdc5a0e3c05b581854a6646affa49b44a90a12f21fde8208b911f0d981d8d8de5d83db1d9cb7d7dce30b46e578351f671e7be6737e8f8f2e8b4c81ddf7487990f19a01701aaff82215f875a1c1d947a381df94afae04d17a433a945252f9d9dec63053c4e41292206b692d80962e01878bedb20d82995db80bb3385e562ebd95923c592c9e45b9f79f1880cb92966964170d5460b8445bc7de5b38affcd1bf7c6578e2b27184161f17186b3c61e4b8b4af2d850a27bab0c6d84df1f8c8daf135e871ac56dd4f233e5a3c2e544e9caa21bf8bf12e8f2e7b257eba7a76a6ca15bcc884e84be328fe919e98287437f51b2669c2b61b5aa86d122a50281c3c187e0a638090d54430ac447c558ae025243fd5519729992d61cfcdba78eefba690445ce264cc516ec998bb6b86d30f4116124f260d755d93374310a4cd28344836a226f93774a9d0207d7cff217d9d2d1d7a41b07536a300c21ebd3278a34e87ba936e7d2eadedac338b50debac64d9fd06919f7b34be7387ce639730d8e8c834c9cea15d38fda2d827c60b387fab43f8fc9198403f1a755088927b94523721e43b22d1f9a5c9e512f701951faa41d6827213bdf0e79fe4ac859b1b6222413d5805ebd019074117b0f8b51ac9d9eae5df7b14af4442360a935d1f6d0035bb4d814d2e246c508027a03d95396e29c6a766f3d6bafda91286d5bdb0a3450c9fcdeed01f188997fde7e8a349f6fe9bd8144c6c29a0b9a593ee443e543bee4d1f88a4087aea0acd4264ec5fa7791bd0696bccd3cee28631d4febd1346a9b488bd710c4eda5738249e8238ef0385935e9b8a4c6522f5d6c18af8204ad8f21d890d8b86824bb101886689089d74205f58db899a9e1f1c62f56a5629c8e4997ea7c9b160ae5422d9e661f97c4ea8970a7be27744aba3060ea35e3e381234cf2153c27db67f0075f74ced84b672797ae826f06cb079c7dcc9a680de7984b21c46beb239386b4a293fc5e4a699159b9168d6059132ea0b851214c8827155d3472599109f142374ede01bf6577ae98ffde6b1638b40f0d51e28c4456029b3378fbb56e8bedacc3488e11caff08e0e4aaeed470c00023f1d8f0fe795c74ea27f118ae2ad0c5c8cf0722bee0a549daa8041e64813ea9a611d83ac9626a2c04f5216d484accad448e48ff03e986f7031354c592d8c52e9a2c28d8e778cd7d01fbd2f04bdc9a0b1d00060333bd59ea59dde2a38865a4a7e9683d98b775f127fce9b603092f413327ba4976ca999d06bc0ce0af5e3eb2481dd4215c38291370001b84530320a7048adb68e132b1b282f9f9e052f836d4ddeabfd7bc9bae03df1801a7bd903bc3797a48c3aaac607918727ce7ffd4f99a088099e9394a6109683e0ee8b7affdde7ed3d760c298aaf21bc713974eabcbfd7bb08a16fc879347f54477cd02d6dd04828fc0c2040c2e2cce1453e41bd159845f00d2e53d2b9e61e18c4e22adfe877d76dc6207e3c3b05ee366057b596f69b0a6d97d245c7e63a1ee7605f13bce4a9309716b4df032523167fc08bd9960f255d9eb9ba4857cf07f824cbf8ffd8d462201309b245d577482bd862611882f3260828e8f722dcedebd82946986223bd35e52e57d036a64ebae6b3a8129c8e12c686fa9d609ce6c34f3aa69e180818583f5a45b5fb3fc4b18eb7c4e5839dde281b0cce246027f8d4d144d638f273b576649d1a06a2ae46c82f526c37db458f82b9c705b4f15702fcc6c3e45617a5d5d92d53e34dc6e54f5425da6186b55277cec64b02bcefa66863b05294cc3541839c7b9bbe050879e847b723b0d9eaa3e0de729720c379de18da300f2aae31316aa52130c175bd336762f58025b3ac9e341f0f379920bbd94dc893a150c9e10674f9de427d36a693705eae92e03ab4079f71c1fbd5f0ac2350a22f244da38d47ecd43da255a33cb5907ef5e524c8159987ad3c532ededefcd0d9d7a97540c1ffec74af116e358df7e0b443c92c144ff3eb3950e05735b0169a8d3015a895c06d7d7183e787e183e574d415f402904ef5f06ad1fadc8d6f3a88bd44102f9492f307d3633db8259cb53d75f70e710ae471f7e95e69f76953b153082b5dd622b90aa681daaf467db4bcc5cc6b8b440f15a9d4284bbd020e8c6940de1d2bdcfce0a2ee4ae902ae9032e18cc697108db1181d0d676e831d7c9f4e9f517c9ad35bad943cbec8e59475634fe94a3d8c3b1955bf8c7b6db0a796fbbd6e05fda3119a2455ffb9702b99157aed0a603b4eeae3228f0eeb9cbdba9049e93a78f585d6cc037033152454d145ebc6370e0918240d7d5a67257d24b4c071e0cd61edacbd0b223a6ac3d86b295d3c86213f820e1dd574f7911830a9ae87b2d9dedbc8c8c606862b7f4cd20076a0fd049fe941c7967656f1170aa6759b477c8101bd7ee23668bea8bafe7f4de6a17ac7abd3e7a39561ac3e08585027a8b0acdbf2677b28226d1cf3456667278a8d2c9de37aa8cc78e59eeadf82aa44a942001c84bea8474909f90f7a59762061545407a6d249702e1693599fe84bb9277f20cf7de75fc344730b5f33b8b4e4d63b581707dabbe92a5db7b8b082af012ccf37619f1e6c05c9bc72bacaed6b50b0f95c860f89a0475a0293e9e429aff2d914da2ccdb957c80085ec68cc93bdb57fa9b0a73478381b1bd181dc697cf2791f691494e3a70bab2f80be20484a1ea1f66af84466eec7dbd54026bee475048cfeab5da4d6a3a3e2442bc0510fd7902ca9347bf6935887b06ca4a36df2d26bd94b50b4ff70f5f741496fe3e8fc7364de75204cf392067d3c24c5004674094b3cce562a3f1c6c2e769add9c6cc9f3d0b56431a3d6eb195f89e075aafa21cc5bb594794ee6516883de793546ff3c893b866be9298bc9b1f7c1252326daf2d65def71d5b43dd1324f3e54d6fd739e1d957edcde0b4d37eff9713d159888ce0a7389dd931eb1a5c553289857a320292d92f2d2848f4204986fd467f1b1528e7897ae4fcb77f4d8132c0aee016d56b97b4e44bef78e42572418c10b21ffb6cbc25aa31007bce2e83f64d067ca24636491f7346bcb5c0d52154c0509970e27160370093bc58ce801e20d686b06f6c04d546bd1869b13a5cb64fb7c3b52ff5cc6f50ef37ff9fbe5493b1f3e72bf5a273bb98ed95e16b8709c54748a333553538aed06d8344554d93164baa2cacba3e95e2d3cc1bf75de10bd524dd5d12bd9e0a36d0736cb09249b82584f7cad3b9d7f576609dc2b2081d834892c6c939550c1a59b30157d23aa5b09768a0d52ad5e4f539ee824fb014d6e47d3271d9cfa33bf12ebcb76ba7c9374f53aa9f87e9daf1f1dc9a3557d5034f658ae50b192d7d189c7b25d2556cd01fe2c74eb062b00e8eda4fb0ec0f96180456053a358816e372bb5a59aa44079de464edd4db8d70803616d159da6dba7cad364b2a427044ecab0a236bf8a627233f3ed655e2ec9547a0fcf24da4f48ef5feb0dc423007d25c866b8a5d490de35b7168d81a2523bf286d60627f2298775d35e584677749ceb6a12d86205d5e128068806886a9367d78cd5495a2e07497ca39d19557b52ce3e84f3a4a6bb23d635d79bbd7bdf12c23459a13e34317e0d348353afde6704198d8c8eaa571ef97c31144c5d0079b4ba458228ecb5b0e01299112411c429abdbbced7fdbe61568ce090b682111fc69cd5ffe15473a0b610ecdacbefdba8d7bae2ebcee1f54ab4babc66b9cb2290c674624c1f45257159149d4cb0c2efef45b6c61fb77744309d8ce3515a0a136d21a014d9e30a2babc4d24e86b7dc37a0d4efeacf0fe1961bf7b02c051dd7314a751b858492bc91d156bb4bfcfd838ed3c0cd7a6e0181bffb07da98e5189f282507807b90f257250a66168e4d79f7a24a2f9b5b524d67dfa54bfb26c41975f38e29d43e2465176debbdbfc6d0adf8bcc356253a36bad51e9d2c0eeabacdce09d9b6a32c21cf8ddc3501802c1f3300a197ee329a2314593e33e6809a7e1cbc5f96d0ea36b7b01638d8299ed771b3e5a289686fc631e71a64d2bb836ed20f046d1f3128e01e1304b1851bd6f74f47f7f65991ade863ebd5d1730b4094b3f5984853aa1e8d61c2a01ade0f53ab7bbb25023af1ec03a4f0938a5b5831550a75fd020946605e587d0bb79324d826513b31e6b06222a7d82a144e28a4a1e05c18a7cd2ded3d04b1889e1ae46198ebe8b29402c6ac77cc65cf31de807eccefa482ad230d8afdc1aa6cec1f02e82fc681df50291e4011e86d7eec32d6d059e595b396ba26806b0be100db5c231da9302da6a89226371f0b60439f0631eba896bcd590e8ae7a7abff24ed1ccb3c487127c41232c671ad2791ebe5cb5853178418b9ad98ad80f57efb0f017c59af75358fdc513db145399d2532e31c097859870e93930c1b06c2e66cb30d2e4b90f446453799812102b52bf620b72bb9b7e8384a3a7cd3059aeeb5818e37427e431791b2dc6636d954ccb47a84cf9f9975780afa02282723c614b3d7dc72d67e7a878dc96ca62082cdc1c31d355ed6d6ee299d304359f00b07023079c953d3304c650c475d790b5127055e4c626efe47539af896cf444776235d5749e1fb213820d12342d10aad11d6b6b3523f1e94e11c525c73061f6c66e5e406f55a2e7077d14e7461250ee750f3d15fa7a4480d8e74a2b2630328a44105dd53187fac0619b546f06ef702774ae36a95a37a30366f2ed527dfd0effe011edbaaa623689bd47de6471b0e1a50328e429cd4887d473bf80df134eb437ec5325a88a4564a8a88c123da1ac5d37a072140ab85afd1953b43ebed922fd46e87ce412efee35d526c57e0e170e515594fc96af3cf6739cc81dc662743c650c4ba9723e6b110d0f21c47eb385f312ff50f54301fd570d06480eceed1f8380731ce1b783338e540efa6e3d6677e98242bece7139ce4a1026ca2f7f0dc27490c105e70d7e00bd3e54f6db8a45cf24148cba729923d585a5af59a04227a21ff035fc284386b035cfcc7903406e643aa4bf2e2c995e0a3ff416fdcece2ed6508b544e39731322c5f89e243be737b105ec30a6ca0c5ff356458c7c99f36f9a4575002c5c02555a1e9c422ca84b3e21636b8b84846435ce2e82d5f0952f6cb71712f8986bb124ea8811346a161cb8db897ea2db6f5ad2c93fba38e69239ce35803db8021091313f25cd160acb0511e531404d6b6392e670e72ce2163aa243bc4a48c12a8d621863799c65deb1b537019f1f8e5b63d1a20cf1615260a51bc5ed480fbab45016f9f64bcc0ab4bd75b8b474e7cb4e61b86c2c4ff7e4b6ba0177cc89c4b27eb13c528c42b1428218131215807ad663b13c3da0512c90e1716c52283d8c1992753a6772a7321992643d131e2a28eb48633691761436ade4e1006eb80b3e87688620181ed9dcd0034c681a09de7fcd3d7b0a97851f13be4b8014785c121f1e437dda94ec08e5e03d1f208d73492572b9c25c401ba4d283814e210c255df91af58646300de8d726cd827de1ab0d1c97d554efb97f00e05d0b7ab4b1f55022a02c6f4b7dbffa779ad3d02fe5464b668d459de5e922e10aecee1719b02bb8e6153584cbe0b7d5d0fd44ed09ff0f08dc7599fe00cb7f93e3b1c7c8137f42f106b281a803834a3cbb0fc6ffb911c7a40cb69cd5028116e1622a90afaa8dd7ae7114e78b25670eca861803230a546889c92bd66303524bdd5c9a81f944c5fedfe0f8700733fbd327cdc5408fcd55a3879635b6e396251b5ced475e58dea827416a616c4827b5c4b987b498dffacc7506e0393858a5ae7611b66d124023d3121f324927716a55b416fa80231a20563395de37c209e8f444508510303648bae8db0cb06adda118baecd51243a86ba380973f7150688426c94d79d60f7c60e724c9ce5a614c3d8d5b1e371306532a4aa51234710133012e15c4ce3cc4f2a5003006ed9200a0673a5e16e11509836272b7ee64dbe75077b1a82d14ab25e63676a6cf052246857fc0867caffba71be01d258f9a504bfc2905c0ea2e2ad0848f492f6eaa52fcb236e914f049a7bd02d0f3ed6b99193b7fcba7ca571cf80360f484240d67a4449a30c227a10b565443f63de0568e34ee9a1cab38647457b1ad9daca26fd796949aa6c4cda8d5449884fbad608f9cb69f5155c779b0d7a8e0db4e2742609c2582122931c405869852606f28b6d16fb6529a40643525a27c7ad11df216cb4c7539dbba4fef1419755579308a2589fdc7e1b0ab3c76ada981e484708cbc8ccc88b066f90fc5c815a953593e2094fde1656a3dcad769a0b30f640977b14b23a6829db89c0766b763a71a569bad2ba4768ce4143478294ee2e3392b02cd7117c4db629378a761c04e36456fa62db5954cdac259255099e746f1854008f65dd87aa140fef16bdd96c7de7317a7ab2bc590712eace1e54c548e8ff7c4ae8a0e9c33c17e84fa7a646a694dd51dcd2981522957630c30340010a7078d805ff23ed81c5353ba0579c9f474dd608717bf909060f68269852c2d56f492890b2ef6ae66b6fed0b734b96008bede0bfb7760682040668729f24df358586f9633c52df7d0c4068bcd714cc17270641bd60c7c839e9009661351871e4aad18af124bb4bbdd922572ddbe4f10e83a39bb0f5c5ec4e39c4bb04a7e1a84dfa175cf353cb1ea8826ab0a34f85c414bfe7c3e9a20999939fa0847846ba986432ebbe017b2a64d5492e19647b90ded71a43be7422856c17c35f22b74c8fea3c692c9d9879d8dc2287e0d1dff99b4e988bde42fa06a31c18248f9ca3105342044847466f17d73cf6d180a934b92b6abe72e0831d0d40713f40eba57f8bc6a8865b5ba5ab5a8c826b5f308138dd5dea8beeff14fabc3b0b0a729a7f41e88b2ce63029ac9e2304837b38c9ca57db47c889c92d4675a5130b6acbba7a9423549b112fe5db10f1153a9c228703e64bb0c56612276851a72bbc46bf7cf237c671b7850869304c4c4c5dfd35c75c36ab39f41183d02019d361fcdce674de0e0ecfe65534973e9db7d2c0e0604e9ea591f7b4dc01415eeff0867001b0b78d8bb02053227444426b1be1280e29ad667af968a809bcffe375c76e7a92ef4da98d235d71c5453dcb19c02949beb674519c3af4f2ba7fa932448ec7e7da3efc16003ca705bad2c60af366109ed2f1213628615611da4a0e89252cd1a7d28ebd80d305cfea13f8c4d101fbd5bdf75e95212f13ce0e2066a2800eb08bdd6fa00a3ef1047783917420b44a9e437c1b13cbb7ba338a6afc03c354016282391f90af4f1d298d86503bc6ea4497176aeb83540fb1ac628b8fac0b3fe3d3bea52ae538d4ec9ecff38a59e372ffaf9eb791dee3ce35b7a4d46878839a82c12f12a097972530ac022d2275d2164a541dc4db9bef105fb7e8a46fe704a567f0aaaf9fabd3bdaf7ea3074bedabbacaaa1cf8775749e45fd0b3e01364005d855779650985a2f4ac6ad781625b6887988d366abfe84ea8692f69bdc5098ebbd5db130b08ec4c144b0d8a1ee500d34f4bd417f02a68038db0bb0370715fd1e0b44a3043231330c89c9d4b2f1ad57ceeaeaf26fbf93f924a590bd922d5583d1a01801105bf4fa17f0f7d2c767e02c69d283a88b291df1847021e5682a1a31e6ba3515b7738d628191d872572b5185b1782708b6ee57e9739ac27dbd481d174d7255183d9208e7b153c5d76d47ea67c109476486644b5e6fa26ae4fdc84a8432f272df8c308b2944f8f3a2629b6e4dabf38e599ff214cf5cbaa44d499531f959a19082826a8d104d80a9789a3020367e2d45fe9cb71fb47c73ece53934d6688331b9e730971ad828e15dbd4e550ce6831714056b0286f2fe3c25c7f2ff11bcf79a0fd8c3655fe32a88733d96b40e2ac05a58111cc6f2d41b0cb04d121fe97a0509020327a83812c43b10e41e6efaac67459f8575201847d57c18e1d4ac2eab3d9aa327849f9f540a50511a0acf2a63634b9f946a1a709ccb96470648c73c1ce0a3cf554f90309d1231604f246d337e30068476f75f0309a8a6ce82963b3f4bcd90d7dfa2c1b6ee91118c387d20a6027514ea9970dd263c1fbec8a5e249a38d5e6d7ccddc0763006421fc1b50b434ab59be6a025395be9902b34b8ce86e399d9963384a6969013c300357b534944004475d228dd4d0fc84a70333b54914ab506028494e7fd815cee0d83e9eefb71d9d678aa0430c22d024ccb2c550700bfaab90c467b1f8dea02bca54d160555f3b6eab3ea7dca36165122c0272d03cbf12ab3e9990d398084c918050445f12331b6ab0751bfcc3fd972009f94a4c7daeb9beceb25b09b4d3aec68101d6d3c22e4468d7f4ba2cbb7e52cbc377f31320e8a014d34b3bbe7e06eb6e84e621d44629010e31097e82d1c6c1ca2bebb718c4aed198ec44b401acd89d2546ce52a39b483f132d9e76f847d7f95fe031df4fd28030feb3485d8cf873a98b86a0943c93221c5f89beef21eb42b788fe7250329e02d74ad8bd2e7ff6ecde7df9b742043748e88182a80b603fe2b3914bc89435456ed19241e0aac0118ceea97568328d4a1407da8b994afdba77411a06244bfea4af1bb062b208a823320759b20f28fff27be86dc84dff5ebc8b2b2f92fe7ff050994c49b04352e890345f60be6ad09a0300143aec47379a6770d6a8e009484b089f29076dd0ef5261c8442ce9c6db492212fb776840de738dc2542762565900401ab59362e93e3b7697e3c8d854927954679f1b5ccef0ea73769d44e9b51e1213be5ff36a0870bb0a1613370e33354595374e784820cb6f08266f9380c3e9e08dc7cf353033178d6345fec6007bfe0e8a3a7fdd5efe08235f8100c4f3f6fe71dabd08b4da65d0f8d6e25194cde0f890bac9cb7e96488705c4abac02f6483a54b496c41ecbdccb14d6de33de27c633b337044d02e4ee08bf26bd77f30110a4e90c83f73545a008acc632170b613b67adb41d93892abf95ecb85f6abb509291ffbde8574fad5cef703256adbb45cceab67c1038a485928023a95977742dee4057bb1ade6633e092d9ad91a09f727bafa2220c953680e0eb1c89cf0ce491b8fa996faed72ec2a7f063aa0020d2d0857c9b9e6b0f95af6ef91d323eb624dd5bbabfacd07f4bcfc18bdc625c66bb6d00298ff2d3f163472e9f157bf4c555de4506dcdc3a4a29b9148d029b04623cfeacd28ecb089bfa2908e35a99a3489c13e68ea97ea6cb3400caefb04b0feed31cbd8c35a6f8414267e74aca42d83d7ba80e37cc7cf88ea3eec4e0f80cfcf8c06ee6c56e815dab4436e3d25bf84306f662535b688df18b288a3bdcdeca633de8e46890ce3a62cdfb8d7528d040dd3c597852e94a20c1692eb2529d40491006daa2c3938fa79e48670b7c805d207c4c6d0655d8e7418100142d8c9ce3dd4b59bbef3a1f1b0bd64e5174941dfb1b98e9a6a9e04983c2830b3eb843d6d7aec7005ec0ec8bcf1932b22d6aa198d614ccb8e27778b71ad462bb88fdcf89a2421bd568e8539b8b1a536f2dc3ab99f0f7ec308cf83709e2185fc856f568b367121b0dca750a09f2b6d7a31544251be3f4d4d6ef481f4ae50c57b424cecfb56c2cbfe9629a9184827c908388ca353fd9818841f7e69e90bdb0affa88fba727b5f59c9320115463b5e219f49c57d1684b4906859fbaca2e49735e08ff58306cae33f9bd6572931d050a12128d9b535ae1f1f6b2f19fe762203952e577662ebe0b81687791a04771de0d30fb482bd939aef862de56733a20e6c745ad0c4a8d316996ba5f4887ebbb52d646ab38a3c4a31449ffee330779f158703faf8f02ba18ece9542087d4a47a5f020e96e3a7567f0d4701f0ff6f46eab4d865f19bc1fcf48306574067d954b035f90703779b1f590b5e5dd5f4678c07e108c87a9fa21cb89612400810610157720505eed3ce7540feba4ac024b16d40b86bf775027217f29775e93b8a3c67b6ec8d00f7e2d62e3c793f9b5280bdd68dc5f8e0b4d803d1eb3fb3fd0f8bb90cb2cd5dd176bf4871456c52c2b4874be6bb65700aa351bd0bb524be4aa233dc0bd505010b90e551975c1dcc3ce491c2eb316cb6c71f4b96cb2245505ca70d681a95d18d9d92ef71555e0c82527bcc8c11467207022f275f3cb20b416d97d88d9d576355826127205a39835ba60132a1840f2bee4f2892cc782a6b0c4ae4ba9d3ce08c4ee55aee7eee2902888bd0072fe00b0f6c269e0df8ca631d175ef716f3de093a1fc57a2b7368ee5a57e39e7aee7c695fc1e97c554cf0638b800a9c25fa57429309013a1c3e5c5372cfd7a9a02e2e9f136347d301b3ad03807afb41d3e0aacf3a6c706bd8e36bb4129ee54627bc93b5c8124841ba808f8281caab5639e8bb3c83764089c8538c6160b3e1b1a4054bf45e0de9911044d63adab5d3f0120f15c4f6935831f42d0f4a5ddc210de10f5eecbb9760a126e5a5da22d9fa0f4415b187693007ac255ec85c5f8b89966bbe26a86dc50ab0f3ee267a20350a93fcd02c6a6cea55332720e8c410330d4d7732e6d882e6ad50c08924389482a62d7947bcb83a1e2395e0b3c4243496f869518612190d83d84c3b357a997f9dbe4859bb80316635aa18dd790f860f04348684f3fb9790210ef4e98a98136e5c215a7958be5d82157cdaf75c0ece3ef8da26ae4812ba3ffe73647675ce7aebb5e7b02f65c8c5f3d1308bd516dbca269bbde1736e63fb4518f3a27870f384330497a24f9c689a49fc4e1395ff0de31acf266f2234f8f1f5da8f83568a2cf35ce5ee0627eb19bc022c9ed77504d9274c88d53ae7fa5286849726263e9ac53f42a23c34eb290b73081014e9b48ef0517c1689fa9b3a9e41c0115aeb46dc02e0dbf96c205a4e5cf77439c59678a711a41265708d0ccd40beef92260b533f8cf8da826b6aed19701ad4dee0e5fe587dd9e292ec81267b1e6c4317da90270edb52eefe9376de4c7e8d1dd44fc8f05fc7391d919298f4f23c6ec04937f4ed5a1ae9fb94b4ff7364e5295cd646b5381abc8c8636213a25a9a0a5783b744586be85f4d2f7c00a6dd37cb72393c9e2d71e7bad1e7fc7865f9b841b3b643901a09ca23bfda5e6c143cc08358490fba64f0454b126a933c1b4f82083ec2c826a4239d6adc55756c37c5706f0feab160a2a5f2079d1b806370c5b44d95cea006acbe746251c0b24d691e85e24d072451e3651eb8297dffe827de211fe0f1ac584c4e14355a98918b199f6449c796729ca82e918fd1d507abc15741f830b58c29f68d1eacfaa19416e9c5374f328c0418e9db600a2951cf84fa0d833bd479367e4f79f082ea77ebbef77ec4c1e574b81cd67c61f5131558953d0960aa081a1a81bd6e904c1ecb063995838ffade112cc18f9949a36fa211bd8ad533ce21fadceec1b5848a891c596eb0898e28a5be538c4773b85ac46daafadd5ffe72e63768257842dbeae264ce03d4ddbd2d21b621b7f4a8594535256ecc0936ec069016617d93e21e53b66a124bffc8e44731c282047c1fb41be678fc0557e28c7730ea04582b4af002ca99ae8ebc37612f39e86a61eddab554379e091367bcd47992966bb854aaf74c127b643d3918353a578fa5d59e63e89297f00f1270897536b0a981aaca53b4a2430b0e6e5b7fa39d2b88a9ac32637706fe7114c6b47c094d277b14035b00d9dc05bfb22eeacd2e3e9245521da7f34e767cf08aa42b96feaffcbeb2c01210d59293d79282a7f759b4c3a94d8a540d9a9d16a712feee526f95d871417605c9d00fa986a83cc33c35238dfb01268135a88808f68f70fe240829b26a43e1c60cb3bf4f069a0a1b5fedf44fb24cd5c9a141fa6583cad53a26d3279b0b3b4b1967321e41fec4fcbdd6d5aa1400f6cada8ebcf6abe987574077931cd419d0f38d2524f865c37151e8e67475423f5f487db820a7daf7e0fb5e751ac105f705c13de01eb57e1ce53427d60c4c4ad1fa0e4e0b922708a13c932db844447eaecea638c8c96c76a52e7595313e74d557be35d5ea27a3c4bab196b9628bdd2616dbd2959c2671acad0318081217bef141dbed91dd843348e35979e1f48b17fa104429546ebf603898993e4ec443efe213451359d47cba2b4d49f4634f8d08fd008cef83a42757524b97c31763e1335737e2082431e67392106a0c0a24ed2dc85e6ecc031e2c2110b160cc3ee8abdc66ca969cc61184f9a45b8cfe3affc118f10b932f402cae6ad51469e90dc267ffc50a4084c27ad058329b14307909326fa9a257ae32cc44db2416229a82c0453505407c4e077af75af025b7fd2ef9a3fe53b7c5f3b0fe230c335fd1c71dd86a15b4835480706198ec47ab54e386039caca31abc0e1fde65b65680387a888c0e4861b266800f44db1ab481d3013f87e8e188887214390d08048f7a106a4c492b77e648272d71df66b15022ffa1c257ec437adbbcb2401fc75b99f4a2aeda976d4d030ba44d1aaff14d97aa0e6ed1413363ac60bc272f4b1c107541529724bc0aa94f39a9020d1bd0244f66aebf13e8f1cc26609b42b748e1abe33963fde088a2cab91f38c1141fce04b3d1b57a43e304437cc29d672f723d42d236a48e126c5ef9ddb6283af2012724142e9cc10379b386c2f0114b4f5644d47f9195b59c7f8666941f216893d84bee4567f41851e08fa34708458819641e878abf26ac5a408ce7dbfcc0921da87c34755a17074f50a82eaf1db1d89bb3e2ac80e0533e539f221e19abeb3041ae0a19690bf09fdaef8bf28ff9d004f3b1977750d8312cc7afb3a5b053f09986279bc2c86ff2716826a825ebd33e752017104036a5dfb10a1a468a889eb8b5345beb04b7cd1f4f405263553bf7556741a8e0a32b36a8d989583dec446a8667a247c5e5823e44d49e8fe6dbc2dd0bd8a955b83a69c3b9ea77158651cb426346306a33abfa293df236a482d6690962005b9fc4f25d4632164ae11c8a46ec48109fd0bd0fb8ff62e7380ac0a2a9c730808f7f3f4d9fff47d905f9da30cfc0171b90e88e5f5575e23516807f4bcc1c9a18e7d41aa1f15bdc5a26098e9453e9e6d83479559df3a544794bdea6d29b722736edae6304883cbd396e8867b849736fa147003045da9e7e9af2a10b3db757bb5df6c02ed8255455f39b6235c7be4998cd1af3b9e1cc6faae85035cdb043d3c5c99f41e43546f9535826331ad030feb0367707e6438a80a01306c9364420cf9bca29f2b00cd73ff22a766af488e57651077875aad6b1e66eb5091cc0a8887dab0b3ae6ba8ad07abb4cae1559e582e970544df0fa31b8f26ae3009054dc48097bba28522e428b49f1b40f058efdbfd39f3d1d9e8931180ba60d6815ee3b5732674ad02fe9df147607d03bfc45f89596c592adaaa0527d1aa805738a7b63e30c55b034b55c096642db80df4cd005631f7527ed7d96fbe3b58dfed3d2e296c7c378a2b631ac76ac0afc547d577489a64d34c54735bf3e31e443cbcb0c4ea7bbb83008aed08901654578894183f592a6054c8bb5192f64c55bb0c97f8444a3462c34792dff97a77aa442727697a12541f6c9e2127b6c4acef89b01d60a6170f15d5f3168314396042b2f17c53f5b28eb280d456005d35e7ab082c294a2af3a1ff0498a4be5383fbca10ea721fa3d3980133831f8fe22604a4e14d24356e39f030e203aa8a24ff96aaaff59cd47e3564b5b569ac7157bfa9d89142444895571ef0ecd4c150fef59811cdf5ddef3db945e551d045c7aa174a8a5822b179104083e8f99a53ac35b915f57f44aed03d115904995048922063b77518fa534e6c1b8ccdc5732afecd605cb6f1834107d84d585ebffc712b7ba0986295bfea3892c588b8ef9727efe7765e1cd18f115428fad3bfdcd6c24205d1a45f3e4755a6ed027ae1301a5b8801ee75d944381413977b860dcb077f00eeab7385dbbf5fb20f0042d632be89b73778ac025aeda1e883772aef321f85627f39fcde0068b395e0b767ca4866bf3c7d69cc43cf4d10eadbe194841c7be302586ceb0e60e051b7819d803a5d644e17f8e5e590f67e3627eb93519d7b76ab057ff89b480f50cc3eb4283a94c72d5c2e76d692d9a9c57ea0bf2670fb68080c5a1d9b08e2640078d98ad086a221d049206ba0b2e07c98a608eea1429cfd97b360c142e814891584423e7e7966c9f75f593de2d755ee519b8a8a3442fbcbcd063c84e43f4fcacfc3de7416fbd4a847ce7b435780fadb8f81b9c86d9b4375e0d06dd1eb85533860b52a11bcfef29e51d1e497370a026807eb5e8f6f4d62dc8e0f510bbf7c8deb3fbd201ed3596a2b2dcfa10f7f79902988e5c51b3a7484e334f09a63a79c672b5c410177e176e3cb2fa71901c97131273e1fadf131bd0b93a065dbc19bc2a2d45f9e071c3d584665c0ec8cfc5f4ea6428498588608f5aaad7e5e1b29acf3b24246624965d3f39f7577500610f3a5976b9554c71a69a501f98814df8babe91885adb868b68c3ea294ec83f1662dfccf0a6370bb81276608fe8b146a1fe731b833ee135c601ac7845237d8a786cbb9f58c6ac9b31ac7e1d6e7d93474f505a028eeee2323f7d8590a79ba66fed1e2a2e1e8963c57a358eca22b325104547c7236e2336eac7242b5e8a6068eb347f91f28046fa9b5a0040edd71538144a91ce9e365bad42b6ab126fa25ff1622cda065ad8be9bce74402c4150a4d183c76ee62d1169a04985f1fdef04d606201a86faa628ff3ac9c729bcac2d1c0ff0ab53b8a80ee2dbfc7e62a8c4c454dac5e6227bcf27c9634a5d9fe4fdaaa565b81563ff0757835d68aa896080466bf3f35a4632a6b3caaada99759db54d02e4dc4977b59fbb9fc378af0d119f8679fc5599ce25fbd7afc64998dcea8f2a0d706371714e05068dc90d7d7b918564b34e20ef111f8303962b7683df283a7428bea947ff9996259f8658aca3995220a335ec3eaf9c2fed0eb50ad7d2f1275d96fe4b00a852a2febbe82640b0c8ef1770768d628e74266c2170c44399e6345800f0dad094d4fc2110192b4957fca2940dc12f7e7939128a18967d097f9708c41b4268d7a12ad0a7702a0f333b54c69d33f096d99f9ad1176ae41e75c406d3bac62ce549da6c842f1a2b91bd79bc7a272eed4b774621eab007b3c122f13d4ffa3eefad54621429dd1347fc8eccd0437a4552a47cf58629b33c4599938eadab724a1ba8a6bafba96e8246cf2c0d2d5ba1dcab055f7e2aab8eccfc9a87d093bbd367e3f4277e69703d1f8dbdb720e0d7ad6e88da9fa78c489e28216d8813dea050bcef0235c0b692c529f1a8b1f9b010cdd027a1b966a5c40d41d35079d30135ed9b60cb8790b1481d6334cea69ca8b7e5b2c662cbcabea78c4d906b7fa8cd936df99598c866c40cbf1b1033c80fd0d2d234e9c11bd74d1a8a69f4e497dee9c1e44ad01f46fd16feda7a54d42566e29659232056d066e068606d9c3c0da63aef4b7bbdeaff7eb3d8689e6bbdef43fff7a57267bf157267b31fda5a1d17ac8c82fde05cdcb8e04dec8a0c421bda56ffe3b9e2514a992a72062206f5e3a4717ab78ec91f1a5f7199aa8e98c605e6a3aa4d1fb672d70e7191cf37d81639e06eb943c192fdab064f8e3f8058ef916b8b3e7991ed54c0bf74aa518635923d18b458a91c5c01ee3f9bae574ce2d8606134dc9fb641823060dfe349fe9f33e309e20d352e9fb4a320fa301b94aa2cc450c191aac737de91d4b2830d92da9a2ca46950a8caa973294a1e3c8e03534f424a0544d91e9cb21b40b576621b100a5ea64e597a0d23d8883932a1ed2fba40a0440344e8ed7d0a72fd7f5a607bf65640061bc3ffe5a9ef097532afd7fa58ff1811d64fac09622d3eb7364a9e47da552e9bd7fd94aa60b93bdea3fcb0b8e2ba657a173993740a61f7f6870e71cfa73a2f1268f265b7560cd97fe7aef4d1f48a2c96054c97ca0d554d6079e68f8d7bd4cf6c9a00f03a78a18e96c09c722740dfa31f01132fd938d1a30aaa20a63fa26dc6d3383a4023ebdc0dd36aa3844d7a034129129a79227fa2d70cc3788ae330d528899e58d8c5c4252c91424d1405ab171a37bd0b6a08babcee13d2885c89c06e47a57c91b6fb5693eae120c3ac7912e03d12edca71f559da37bca7d4725531f1aad549abdc0310f73c2a31878ba097bbe31590c3cb3d480d4ec387dcdb7c6a3e6fd65c8789329c67b3426138cdf62bca601c16fa291f1cdf8387dcdd7e03f618c5f3c8ce82426293df6dfd063ee31debe068bfe84473f03935e050cf326dc3d0d8ed9d27f21765ded28fd183b643c8cbf303e7e1f8de9fbbec76f69fe3fd307facb7c2fe3657c1f8ea91b6aa00109076a88616412799a4b73692e7d6732fc3231bc0fc6570dc8f5a60ff42f3dd580fccfef48ccdf07baa7e960198d07fe84941e7b21326f24e67f19459e1e944264fae29350a42a8818347d09a573c43ca594d278b0cbe8df17d263bfa09b8b8f06cbd931b8db068634a261e346db7058c885ecdf42d7f0eb9bf2342b762632220c54aeccff7c1280cd68785b7da2eff8f6893e47833e9849fa0dce39dba15c171558b56fe1ec3e86e95f78bea4d7f6a583c5c7f0d7b7261458b2e42ecbefce3a82a6f8159940742d4f993c49eb416cccaefb66e79043e40b19e1b60994567d90c6e8127b9facb55fabb5f664e589d2987d139fdaaf3bfa3932864c304f8792a81a4d7d635ffea9fbc6929b0be45f9796b5e3b3656b7dc2f33c4ef3b66b7dce0bcec128467aed5be2bc78986f8903e36338d1972c0c0bf381dd8bef7a17b486fb406f84a346bec4f0cb1a5a2a71a5f75e48a9542a7d3b9c4633d342e6b3f696e66d1fe8cd7432d8db6e8658d9be06f3e0900e8a7990ee74ef95bcae548af99e7c007b25d66b1cfbda6bfc49e70fd3bd248ddebf731cd1fb7b8ef3f2fe1d07b86e7b1216e1eea5dbb623de41169269c3acda13777e5c817e10f975aff081442c25fe8144e477d758dd35200d5daed72bf19faf44befd4b0002803564b059b056a8f6eb5ec17a1dd647ac35d8b75f0ceacf130d194fe77cfa4a3a59d33f95c857e248e29c56898e1dbb631b596195ad9f804c020a3fd96616f49edaf8aec8ccfeddd0987436ae1b5c4a804daf16248d39eb9bf8f4bbbe914fad9e1a10d923ebc1a90aa60f5eb6c5955d272c344edfc8a9132f0d0621b5cab73f5ddbf9c017e25f975c1a1ecd4ecc3c597eb4eac5b64e0a465bb1afd8fa8be74bcb5a56ad3a158865afb5faf32beeb4b6eb3cef3f4613fde8e7c8e843175d2072ca33d6f0eff993276882a7b7df16fb14fff59752fb37aae66735f2681f68c5fb81915a7f23943ce9639127f2442741a64b1aa315e2cabf9c94266f9bb6699da823338f473c4823b7e9e4d3dd1d074888208b4cfacf3fd9facb813866faa7b37842dd15d5091ca9da23798b9776c1b5c41ad677a6c145e4c777d526a47951f20cf63e8dde05b6f0edd3e825ae31fa18c571b8ae192d21475fd2787c26b9c0a416a39ff95b359d992f76a4199286854bb6b6805a07b2f52de2fc4be33b9ef98969bee24823cd4c8be8e302932e2ad6b07e666ac9310acfcbe8ad4d2846893e6d637d759c8e542e2aba108be81ad65fd6bba0f9c0cee97744db5833ef2dbe4e8ae38ff5e22b9eeff38b5172fc050d062395990fa4946a3a314fbb76f54d46de88baec72f182d482caa9ddd136d436d63bde84b622740debb723b48d86d292481cef2d8ee3b89f1cc7719ce8398ee3b8772b1cc771ef1cc771dc3bc7711ce7e2398ee3b817cf713606c8521a20cbafbb7437dd2e27d7cbebe5f5d99437ad03cbf14539b6c851e6681bc7a9f1a72bd0b7ec0902603b91b51f6fcd6b069137f3fd1d206fe4fb43a07374f6ebefc4d7757d34e469c650a78c73c69f51b82d93a0d213dfafafd7d7ff40f756baf4192f2d5dbdc06efef08f96d6c35f4a2b6f64e71f638c1e1bc7e0f21485d83712f3f5180f1d686de7c07efed539eef56097fdbd1f18bfebc17a3d15ba6d02bbf8207d3a6377e9eaf7dce1726c1b6aa7bc415ecfb41074fd99bcb1ef6fadfdc0ea4e833b27fdead6ece60c96e4ce9d9dd024bac4f527ceac97d87e6cf9b63b21d25f16a1f29248741c838fe48a6e8239e79c33c618de36819549eec18d2a36325c6418ad715c65838aa16cca8d441294902d152a00161920bcf0a081e48f95264913d217449f23df491773cca0b59de37a1e2a57456d47ff448732f4583c2bdd8acaca6b288ed06dd779de4ba139948dae0cbacaa1b84a9ea6501c9a42f226664aa53365e9a1dc5f9fe9a005f4c18b0aa954aeda4176c7b9c9308a9fbc4aa694827228cb225c57f9ca7b5ce5aa9e4cef68848d5e64fd54798fca55235779e83484864e49b2c042cb9553d0ff94a890b796530f7d674fa77f4fc8c6fc9d19d57a78066de8ebbbb374457b66d03d81f91c195a2419c9830fdd43dfc4fc64126bd0a721114c82a0a92759248a791b3f626246d531ac8ebcf4f3497806128d427de8aaa7730cd138329444d0d58a072a20901691e95f194a22e44aaa248fa8c8cb5bfed5ab5b2db06afdf55a5f84ef5b323fc2d5abccc5fcdaac008d132d50c703af812084238670bc30b1e847d86bb546985412ed1019bde56e5512e94b7f2d9997f9a4f9a4f9a4a8fd984fda895944c242381fa67cfdf5d95b94cfe9799dcf97b72f6fcfc8600ce750167da0698829cfb7525b687b834e09cf07a3dc96f6827d77990a2c728ddc4850e1245b277c10fb5b681c79b2f1278fcadca0b52efac09f31c3b2ac7b9574ab9e1bc4d31595997e26b178562845bd603b1a499f46bd91e95f21ba6c45858456422ba195d04a68859d84fe8a1784c35a7b85e840ba123d7dda236f46d367054e1bcc1e799a2b79a2a1b53e7439b40642a67f725a7164da55a6759c294457429e9090ed3cd14757a73bed8b2ef52b8acfea8ae283ad56f2447db25f54dbe1bea23eabd56ab5eaa14256b55924a142340bd572a910d5b2e3d2765c2270f454886ac13015a242f244474f85e89090b55de779f42f8d0745d11fb25a3a2cbc2ce8cf95e338145943bfc7fa74543cd5cf55a67fb3ac75e078c1769de7fd9f7ecef9a269331dbd48249a5fb51f73da3945d1daaef3bcff10a44259401b235bc7994cbc86be77cc482813c7a142d632c954c87164d835f4aded3a8ffe94ae6b12b3c8137d2d6d435fd443a622d15b91b5d68561d6b2517b02f3227c9b74a0ab2214ed297d2c0e717dc33d1d8a35e88333322dcd106491e5b817712291b5ae4b64adefe5b39f3fc233f3af88d23c67449f77c8a8252aa1715c95250799fe482551a490696c02e6d159b3f24465289bc814f8e460889f18c81f32a532943cd289930fb41eb3e65ba2c7fe5a16bea6483a99a10c65687de7d8f00e915cb51ff30362cdcbca93f6edc40c8e3e9428e81ca21732faf9225105325f345f24fa510c318e2bb87163da20c9e0e8453f359dd1cf9168f4d6d7914854ed8db6a1ffa16c226fb2973c3746788748eeb6911a9038faac6da8d6354d2307327e5c4471d1dbbfa31715d9de7a3bad9fd61aed10c9a4cb8ebefe1d89ba1126756f59ef48f9b24448684992b30b73b96a3b64d62ebc71b9b066e5c2d9eac2d7975c18cb72e18bca85ade4b9b095c585eb950b53edd2ae0bcb9c693c64beb289bbfc82b96c6793b6b1cfe517bc7179c19a152dbfe06c95e5177c7dc9cd2f18cb7251b192c7e6176c6561e5175cafd01e9a5ff0cc6da7e71e02835fa6b6b134b3ace8b3a2af1ffd47f8e24cb44324cfbf168f4899dad167e589deb7d9bc9f19997943f510fd7daaf910fd8dda0fd1df1d2e6b58677e3bf188916841279936a9dafc11b61c8e5586685bf1aae064493f869925753ff70577ee3eae6d349c6118d45af08f6a5d4372b7bb767c539e2ef70db421d7ce67f0c16dd348348281218d44319f233be6678ab4f82b3bbaa05a643cd859603cd843dde0e8f4e08d9a0771e41772981eec9fff1bfc342acc78d0cb3164badc8d8317620dfa34f7fb6f0c1cf36d1a2c7373a1a10654e7e8202bf8fd2fcd2cabbb97db71dca6bd6b3a5967af2c6aee3a53dec848282d70bc26dcbd0c1cf11b031fbfe7bf490232f8e087eae8410ba511bdeb21bf223bbd0585ca4644f97a2f6224cbd7cb2d79e70059b64d7d23d554a4df48cd518a1d183b07c8b16deab796002439fe0e8dfa815a0c488ef008fa5f403f4892eb29080456aec3bdd21a38c0011b2edc72470fa09b0f83bc016d1079433b09c81bd0cb8941decc060ad292e9df903853c7b49169ee1eca2efb81b5be7f2007b2fc08044718723eeaf8cbf89f8ff8d2933733f51b28289569fd7a449ae9933a7913a5308529c42e4da34b8e5a02901c9125aa69f4572c51b9b51ef2861ce58d895e315822cbaf178aae81aaf86421b576fdf833062447e46e1afd451eb5be947f1b77ae2fdfc242ea4beca3fcfa81f53110fb9ef7638ec4c0fa58483fd012a96c693fac1f5791193a48b50308f2fd1990e4fbb58febab1a0f2cd75a29a5734e77976d636b6c1bfbd80e8c6a3a16f6516d07e6d88c8fb770e70b8334f427c4fe4e0d19f46c2db0eaf8cfdc4055c23c6da895a776499dd042f7765ae0f600baf83d79dcbe576ca6c2d604105095f892c913e976bf647efaabbdb7a3a9a05039be036e4761c5a54a13b800f1c40874b4d6d950e7c9531245a820c78ca3031f47741e72fc37499ca823dec891c8bd9d21f11637bafbc7d4bdb759e83ad91e33c5527a77317e3307e9d69d66d865c56badb5a28dd6311119eebdd9c5824b162da82459eaa23a877643a6dd9bdd9e289e458cc96d131899e41999d0d16eced92f5852fc93f79d570506afc9aee8ea1799990406c9436c64cf30cc18e3b563666bbdfc3279b2a67f6010d0468e7108ce7090281df409fdae2d57484234a029cf7963a6a8c07059d14526d30937abb5daac763fa19f04bc66874f8f17cf6d16ba8b091dd891fec598e8dc92d2c928d635b506b40edb634ac06bdc2f26b87f8ef71089e3798dbfbf0c414efc7f76c0b144c624d9ddffc6cb8ace76d6ebde3bbd8d930d150eff888728d14d799a3fbfe54dd6b1a3740fb24fa874563a5f06619a36dceec66fd3df9e1f67f7a4e162404808072388308208237230c2881c8cc8c10823a448b181141f1f1f1f1f1f1f1f1f1f1f2952a448993265ca942953a64c9932658a142952a44891328384b2d87f29b5bb3dd854ba4a2ff1d2e2ac996fbbbb73543687a3863df57ff22ceb2ef625cec47790274b0711748dfadb75a2caae1355d6640531cb5e3ebbf26ed87591e8b31618946108ca30dcfe4f427fc5414f69292de5e33d509c3491e15d8dc295285c65e16a0b573df3651f861fa6524b7c52a9542a950a572b272b28ab9e55b8ba771b8db22c7b517612fa2bf7fee4fb38e4fd7befbdf7de9bd1683fb2fb72af681be117d1df6d14492e5c6cd8bfef671663ff61d765afeeefcbdfac54e52a57d0046bc283bb5a648ebeaec2554f142b2debce4862a19ce81a128a5c1f73a1fa579356727d99c9a097553efcf03f8cb24a85ab556a492a0c4110a66046309aa6695d188661d8c1849aa6695d17866118863037d4529d166aa1167629d27cf9161a10d1cb4f854c62e9a9eb4ba0f40e7fc37bef5bd7b2ae75adb5eac153a1c6e11962b6b7a773640f55a22006460bb5500bb590d424dcb2058b155f424b7911dd5754f7a01f91721f550f0f1494135413d40e2852d6136595c486c39db5faffffffd665adb5d65a6bafeb7aecb2d65a1c2f58cc6ed662db9c1313cd771c4fa53ef5a94f7dea5161ea034950a824a970b5da1cf41d30ec6218766996048542616118861876ad6cc356abd56a656335059075575f005a0f19d901f2545dd0f50820e3705fbce16851998543dbd48f37748dfaef5d61287964b8bde56fc519ed87b5ae655dd7dab66db3b21a9986e93bc6fe620fe57dfad65a9b4aa552cec4538d007983d170efd7cbf8857998e9995f6bbb38e40d9661a721f982f495af7ce52b5ff9cab577777719ed07e69d7b4629a594524a29a594524af1cbc738175737ae4eff5fdfb784cec53ee84fc8f51d0bcbb2d27af9208c5bdb759e57258eab93cfc755d75c0a15519ef22529f9db5f4dd3d9bed86196c5341289442291c2300cc3f0e54119f660afad56a954b84aa55010866118629fd6c17cd76da3db3dccc3742214490b1214141414e4d7b56d746170b7cdfd180d3be0b65067b9fe54e301c383c4715bf62f57f4d936faeccef8203dccc308197d41442fb8fb170cb613dde7009466a9744b7856be7e90a0a0a0a0fad746c6e1ce1b762d3c6273f6ef38b289a4227d7a704071f2525eef89cac0143690f4911c4129952ea594d637eeec3e3138413be30fe648ea6f802cdffdc5bf787180b965f960b76d30dc2ba55487369ef1ef2c04cff8e72377ce39bb67f704fbfbe747af528dfe85b1241ec0a1e3fa94d56161d7ad19f65516fcbbec9a8f3e42f6efc90cfd1afa478706acd7c0f5f366ba7c6bfe2c12f3d39ff12fc8f5f46340ebb8bef61c497bda8c441ab997851de8253182285187ec4b0b62fdbdd89fe21efdfea5ac0e2bd6689f58e0a421bbf5795e13858c32c542fc3be279becd96e663469edf130d583f6fa64befd265fa2c127377e9a203cbfc8dc8fcc4fad61e70001d5606e7f4393df7835e7ffc7ace9ff149179f4e9fd3a329869ed1868884ce1645dc2b69b5ec657fb8c455cc2279e4156742ab652d2e719545f25ca92d69a51583fdc325aeb2483afb874b5c49ffe1e22f1d83fd7382286f7a8b1e3faf62e335c4957fafc434239176d4b77e56ec98c7c7c36b9bf85e8dd14a3cc06d997b4617a69218ae5b6bad569629a680c5035028a9c1115cc5c3ec2d3678b034a18d00003fd02283289ae004288b3f8902b4bd80cb0d94450f96bdacb0fed65a6bbdc1892944e10496cb077707f50946707142027181c2676ea02748512295b97e9c6effee7cc73bdeed6077c9607fc71afd57461680707b05395b0136c7b7f13f2331cf24773ef6dddfdfb53ff6bc71eaf366ba4b17dafdd6eaee6fc540234f7e61f0b377590c5db5ec8396552deba335767dcbda1c8dd0dcef317c1daa0573871e3421ca0de48422be06a92528c14a165588e082bed2f383201c010b26789efc60ab0e586020035bad15022759a21330d0c18dc90dd4042774803e31c509b43c11648429dcc9029e90822e61089eb4600a6f81e3207192848a299ab861872646c0020b54cc5a6259be8224b664496209a924b65c91b3dc496cc132831f0b8852124090c0eb2da48e04046afe20a5132f7aa8a20a9f1e28310108787cd8404f121d7488f203133af041cb0d7405932b72b89258324566b9819640041458e143f6686e202b7e680bdc2867b558b67559c4ddddcda36393d8552ca9021563941e0365ce496b09099b599665d92bc6090cc36e8659a1699ab67140553ca1ebbaee45341a8d4830578e2aba64ef7a59c4fdad790355d1246619202b4490bdcb5a95622f4ae4d825f206284500615068704179410785870dca9251ee2460a004cb830b578c0009433f5b720085ab200254ae78e2051f2841118ae02990e1f2e8dcb78a2e7ebb706f155709f56fc53bacd748d05121f4e6b6297aa5d6db18e5941f25cd3405444b47089ff4a1343333539af1bc99996d8bd9b66dfbec3dcff33ccff3605cc8c8bce7cdcccccc94645c602530dcf643acacfdb6c594626262b61634db0ccdcc36d3e27bf2019957e2799ee779321e4c4c4c4c29668301911c7119b14851e34ad16557729cf8cbf45b7e6347b8c4710755a2bd5e48065e4d7ba961df0ef722b16dc336cbaa1bf7b43dd2693df6f46f87751b9ee9b00ddbb04d0a79c39d37ee1b0b87e5e7786b3c5e6cd636fe2204fb79bf9f47fc7b2f0c3918c57a607fff8259db789c9bfca2e826ea86acbd6bdcfbf51af7dbf5466ade4099afd770918dfbfe38f9db75c9af9bc675fd5b5f274ff5cbf4f33a9bc3edce01da9079c7eb9c3664ff38459e5fb5d7bc400ffd1024426cc9f5b30fce8ff61d33a143b6df13fa366430be0f41d224db0b1420895fa0996092eb831bc8d37e17e8a15cbf202a236a040189a9832c324d6e201d08e52bb38a9fd4d06f0392263a2c544c1442e08004d4fcf804e542043fecc05344064f1055504688f4507e82aa11042450470a90e487065433c144473fb881271de8211dd687ea211dfdd5d06fc30554b002276ec80285d2413f5412148a48f697fdb3b507bc0c210a174c01872e5d74340c24598fb83c3a5febeeed6dd3b26ddbf423f11855408128dcfb4427b71d2c91c08df7892e3e98654ecb3a870399a82c62717762960ff48325b2a72ffffa84c4bfe847fa466c96da8eec31ecbb298827303ff3c931e6f8e5637ef67d3fbae6c3da8ff28b6d13fffa8b73bcdfc2a091986b945428712f2a531c6419051320216cc953eb8103872d018062880ccee0c41097081934120222783e64d088ca872d83468810c51615e49d063140821ce4c803a1bcd35dba08e5a873853a19446e20202c91254f6ea026a0e4536ea01f60c951bb429dd72037d0133ae4f8931be84a0f821005201685ca11854ad2413358f988cc152812dd0790143cb97de020fb532ca4fe1118f913c8678a8fc03881911d075962f7e1429c7efdfe8cdc0c14054f3622fdb3c49fddc8cd3324eacb51d3d9992854965dc515794763c9f1bd27a5943a8d944a0bc60666203716d9868864ca0ac48c3cef2d6223efc4a6824249f769d5d971ceb9f5eb747ca1ef3fd303cbfeed70f988ad78c6fa98a5fd58f1ccd7b3da4dc8117b14f225634f7ad5ada59023f65c71b7476b6eedb8b1e4c6f173dcb6556f149dbca1e30bfd3a799a91e7e7c953cc721d83b385ee299047a776a5e8029b25a8040d7964390a15cd0c000408003315000030100a86c322c168244bb469ce0e14800c858c46765a1e09c3288741104619431001060000080000444666886a0300ec48bf3176f1066351bd90cf449b72d2bbbbe555445c11d54206058e4a88d95146232c2436e199d7442494ab204fe722b7df1463b702f9ae0d20c4bb04e60fb24efc5f69f9c7d5abbdcf725756d51f49cf0724b5088ae1199008bf77d4906f8b534b14c1c79a25f19a226e9c77831249e8f3b27f96b4859b107c9d5c11aabbf16857ce67135fdd44052286f21863561cdede122f63684628fa73859f24593d1f2519d3e50014ebe329d4107fff6b1b3e9d80ddfccda21ba46f73d851075367bbf129f5c44431aaa02170ac77cd398cc8dc8a2baed705721c874853641e0d521cb18a18007f653763125e17c026ea57edd08e5a7771ab73fa9171ffb503ef33241db332424d36b087b19cdf12b301d40bdf4f49205bc9a993ad8d05849dc61508effb7b90e96f77aa897475af04773367c7a932b051d1afc8abc60eeb44655a7fbac1639e8c3fc3e478763c0eee471b29d9a4bd36cbe48494fcf111dd6ec7b0d793bb2ef99be8ab78faa662d25d67106e2f6c9ebdbe969e350e837a83fc08762d35624bbea3a2d0b4720bafcc99fe094a63ceaa43d7651f915364f99c0ab329e4f3a90956d2cf129ec1a2a90e07ebff315374731da585983f2c92d352d9db275068702240d7c6faaf4c5aca3cbf444635160cb0450c8446d1a9d073731c3dc43a59ce609e807ff18b6967989226c4091eed32bae7f91aef6862b5979faf24ea55a14de5e258d17cdfb745e17eeff6d838e12b1e5bb34eae46ec21439cee12dc058e4b38f908d449392d48492e8a07daf5e263ec4254c94eaf8f20eafa0d67b74f7551453d9d9283bda1c00d23b72cd7ae38411cf33e4cdce2e4e32775ed5a3ffe2c89193da551193ccc477d3c4708b9eeebc698a3195b3449d8d185791d1b2f150bb1df9f8f6cb1985a0e6ae845fca3b2ef46377d19320b2a24333d9131b6e22af0920bc21b90b74bddc27504c20d92d4455200a3ef1f8d770c6891f6c3276394e62ccc9d97a52027d00889208b6e826a078c85e18017245a6dde1a4d4b791882e0c102d451f768615fc717da694d772733c693506eadab35e5700ee57501a690f4f304f0370c3330b8d6ac8d4ea313a257ccd81fa2c82d4b82408c38b4e61db915adf6ecaec6eee7173b7ec60c62401890016db9c315c4be2bd5f098cc88ca5cd704d9fb16c26b6a776024b985f980d741e7567ebccb3375950534827b2c98ba4c70f9a753eac195247781f69b76c5f5d32bb957c4ee707f37773eab627d18d48fb9dd497bec3e0ddf2ef2e05fd9345a34d72ea51104f30bb2f97e38abed63b29aba1f9809ab95b1dccede512b6abac9cbf2bb54fa6de9b871d7ec93da2cb90b7c07bc8cf368859538e4a21a812c34ad6b1265717e04e3a494817a9dff02fc1f7abeb27b29c09d9bcfd5cd522a0f800babad0e14f22567fec02bb0ca6c51e17c26e80b66ceb9df6c47b31cca56559aa3fab11972ced1d4511912f41ad1a3143db541a3e86ea10d4b0502e2524768faeb553ae3d3470b06bc419d190651ab67298a7de6b1edb598fa3ae1adb5deca2a7ab02c05555de759bd452047e0c90578449a7082fc713b6d39919fd43c2a161d55dd0fac1f2e43602a9a970df7576f1d99566818cd15c1624af5ee56364d0aceda346e3138fb4e8f262a1498ecdfb90b40e60ef1f9dbb701341032dd0ccf324ccd228baf68f2656856c6991082e4c0c1a216b4a644bbf906dc4d6b424c341a7fd02045949c92483dacd7970d63a38dd762ff11c73e0c1603f1973b38cf30b6d56990f42b54b4ae87af5c7fd0919a885eb5ad13041ceb5d999f0b36833b52b8e935dbe97afd0b4ad66a53b43963a33f1479569046374ae50cd3c8a2037fee3a9b517ed87e15138a6aa213888e516901eae5c3b6acbafb154fcc572e5977b4aa3b2ee4076c93ed583594c40210c8d7eac4c63c9e0fe5b820207037b1f3b003a01d03c189b5376e8dc6cca4fc7a90a294cf33ae5477e86784bab01391a9718f08d6b7c6806a2fc7d50712285c7ce5ddcbaa381f07d6239d9904d25f75400f1a5d1678a1a12ae2e33dde3f8d171ab0a2af5a52b7e522acc0dd2d0b8869cca1220dfe634889f03839411e985194983897fee76efc3666b28ba3ded72605f14ab0d40c3c8cb3fd02275a4678b0ef5e798ef4b0c4e11403ffc91858d4f1d2472e6b56a4be1fdae68cbdc2877c9c0ff3b13eb88f0d1fbc2b86239ce7515838d8119048d612e0d923d083ccbb13221a210f87abbdb9c5aa38457723df0df00f1aae56d9ede3c15a72fb14d40e459ab25cf3f8c3a46575b611bc5dbe330ffb0c4d7fa45dc635077f4c644cdf6d8ab7c975e6e10fa772802a4d88b65cb37935d632820b25b765363b85d69ee19139f954fab9549b13d398715eaa515ab96634371f50489cde24e429c1cb6b4c12b42f386d4d04610a1af633a0e563c2fb594341644bb80d8c427f972945bf55acf3d704f092827c656b98e9f064ed7ec142719f0c9a0cc30626dcc176c995d6c2000d26436da1524d90cee5e830fdea880e2d61a3338fa6b7540084d0edc046b31a3421fd5838817e009a487f0c4cbc5e4359655d95853972a5bd16995631ae97d78258a7f03818cedf773bf643fd1d92f7767607ca5a97c9bcd1ec7323e0af4890c14c7ca15fb368b59e47916e704dfb0ebd2a4c3a388c989d28e3df8a1a8c2a16495a724d1a571a6e0cf45bfd13ce56946efb709b881b2b0020104af194054f1f95b089c6e9d7efca8d89f5ae43c649f06ae48c6e058915b7bff0c6a42314b5c35dd0c838e45246d9f7a170308535262582c8c99255a9591553e6523905cb0107dde829aa272b85ea30304513c00afdb407009516a732e8b93712fcd861f75501c0ea56a77915f2220c26090186c0cd7964b331ee3efd7160c1ba9ca993f81a91bf41723e1bacc57f428ddc7a12f1ef98ef72da089fd79f4b3ec77d6ff0499a56935fc750b8ea24d4785bdbcb6299cc8d3294ad90df4ca017f09f512fd1191375bbc971b3c7d0f22d8cfae91875a76abe955a67b97aada0664ce2861a91fb4bd4886b18f25373450db893188a2a87d026ae25c57897e1b8792c2bf6dd735d694c407ecdbc98d80ef9d4d7c321635cd29ac07b06f0398a98272b4748890ebb9daa42a2085dc25087d72f0a379432ca92386a9c1af3d28c20483f03d86246c84504099320b4d847e4672ace5a4f5c08ea9e933e37c3eb8c5426473259fef09b404e0b01359efa2ecdad8a8dcec93f5c2ab5568744164358dc90339d309be129f2ae53c8b9a610938ef352e4b795cede09c023376ab6f9f3f6a3a7fb9b9aa85e9583bcda6d1736cee49960208c90a3b01f88c4a0c8999356c5cd358e20ab7455b782a83861c2f4b4e02c2771465b2118d0fa841bd59793fa04061ab0c1038856c73685fdbb8a49079f409019f27650a157a2ce08450fde893e8a86981d56f41d5e261fcb5acae6d9bd9bbb5d7acb0c91af8eb1e0eb0a414fc51b8b814267020df07988d58f7974d62cc0c1b9e28ed0b163f96b67c572fd39e43369fde47a9ded70e830d2fd3561b27536d7860e140b359212d7a9e1f99b5efd4bcfbec7e041ed09fd01d8df6b255f7de64f7342280dcc1367ce5501b9970d66a04ed0293a454c57313461d8494f680e3b4c79009f9cfefe9a5f7154159cd320ebadfa915d4f328f249be4c1a967595b051d2e917d78da9872dd87d6d26bca0c99eb269d25a736ae863ccab19bbcf2e402f31256e5c9ed6f2f278ed6a413a1852e63032814621a4f0ebffd45363e6b720a5cd46cb6f01330d00ec65dda4e26bf18fd90921ef9fefa39267d5ecb1dd2b66d7b77d1471248af5cd4a2f6e9d557e15cbe8a683a7657816b5628de5f67bfc90cf7570a583069e9b2c9a6121a60f15934d495418c39812785a6fa7cc5c507b454214d9f4567666e6ef05952418a04ab1d288bdda87b16bd30d928e29a185dbccf426d54d8fe6adb269fcbccc7c0453c27a27da86258fabd08ad48b36ea7222fcb30218a5dcb59c31da0c16aa8f6a98618c5b544613bb783bda51767570f1de44456b1b0d76988a0c0845e959e5246241462b69f00f7ce357838d4a7869f5492ccb18ffcf58970d982028ef0a92f8218b4f00c2824a690ba0527a530b3b144d742f0d849b64de7580574047d39a536eb83d5f0bd8b65495c2f8be42c48b1c9382f4ce11e7673192b6b977426802b65d5dc3cb848160d4eae443901c7421eef8b37d8461e8d1ca505ef127ce7aece9d9f5c5053199fca71870f8453383750b53cf00fed83aeb7307017868f7387f820eebc6931911fd58052b49fc81ce518ed9b05ad69f96b0357c5b4c4dcb157735594cf5a8e6102f68cbce4c288f0f03ce59aceee0c6b6e6918dde1b3139994cb0c7ca809a93008c49b60744a03238024d543a2150e5d0772bff720759ed53c38160b91d1788e92c39f5d3d4daf3bf825f70e49212000dcb515510797125267d323937d41b8596e0a959caf696a22ab4f0bf5f894dc752d618d5b1b592de348fc938853bae307ff3b357fe3ca22c2870eab1e6eb2997fc0fe59c131972a50014c5364bd9905177a5a87faae75e5bb130fbc9e77bdbf1f08d95869d5d1d8762ac9a40dc8feea35eacd72ea111277d419c03c81a659b78c4bcfa62b72be0b16252ba2fc86188ead32c3e4f29319b2b7638e307be0b33e86100c257a03b34233640a680b82274d47494a74221a86681c04f7f68549914e943e980913a602d0e0384d5af7867807ecc363170300ddaf331523b8b721b762ab24c7c47093bb468c1f1b20c3531474b3cdf358da6a236cb752df6be5c5b857560bd901bd4ecf8fe64d6484d8f96c1df0dcb7c73673c3ba9dc27c6f65a441e5287009e9ffc9409c0f0e436a59aa25b58ad0208573debc769b3a5ca3315f74db96f2f25c53c201a94a74154ce3c35d8a397e49226dd445337b32231ed12b428a03e007d9b42861c456d3bb6a420ecd5e84bd51aa0be23c9448a7b0b534edd804aa8c1c2511bdaa3ecd99cc1d57d3ac5cb29671e68b3621dae3523c04089eb690babcddd8f5934eda6733bc1e1dd6313474484a6f8474b8eff19fc6397159dc9a45961c1ce442afa7af0048ebf0709c2da600d38d6eab5754d229d67baac03e22ba32f7904e4f04bab32eb8a629f0ecee80c335a498ee05f565652c73e96a5f0dce6fa12aa9c74f397b15710ed61df056a9e1a43420271784066eef28b78045dac96ec80100b9b8b3a2b222d681560de5ea22a7133e34ff7a188caf10b70795ca8adbc5400981b37b04ba5eb40f57fc5461c0dbcf251d3baa2e531950a9c6cb7d91a6eac164484520172dd03fe6ee91970b5e8bc87f48159a0df3d01e57442c5296d90cc10ee0d794eb0897c15534e0f76a45b164449e6abed1dc58a75e670122e42966adddf0214e530e0d7495234b38a882dc0ff63777e52ff0666099c1904b762274c144db9ff553ad529482b0391fdea4c80d4d080318ce1228df988970ef3b45636968914b968c7755c378351a8d627a03b4c59f68e0fa3381db6617316b346ed98de32b3408e4cfd34a75a4a21ea9ff7e63c080ead94df66234a8f36abb92e0d62a121fc20d02408510600b261d230e6931060361e4a6e06bcf5d1c1bfb703e8814a29c0feed55a7e0d2a76ef841b5bee9c395030f043b343fd14c6824e9f89a486ce6544f962cd7cfbc2cc6f034e844a002c279927ea79e8b6c953a375b40a13e219f5ac9149aa35b48971bc2c44b55bccdcd0ebc5ffb088aa525165467eb69225840e083d62bd88968caa6324dc9353cfe17ce3ec11621ca6034defb1b54550ccbc487114e68d8eea44f54325f528d00da56717d45ff19aff3e03fd0a4c575eb0c154f83344aa99917034524b53b4d772958097ce6bed4ddbbae052e9178dbc0b0248417c0d9813fc1a30870b3a809c0120898824410207f6a1e6789701b0a40136a4aa127ae58c9818fe1ac83dd5c0804d7f6e0e52867271b51b840287c27e1c79f6b127c4d89a2d05aad217fb2ff0021be61200d0320f60433c6e2f1fe7a340888ebcfe2e5012f4190c3af15b5ddc24898f52a3dc1eec70e1da29b507eae0c3cd00ee525aaaa627d5c7fd25aa5a78c0e8a49c05932d93ada7d0389fc5ec138acb5e3382d3896132a836b3be079f377874008290c50c56e31f0b40b55128841eb39fab8df8e05d6c9200d59f97a64da55812a68e363b9f3e22cec50829784a9b78679f4c76c4d0adfb53eca2da3c664b4c569b0d0e51d436da177d0b3e493ff6a60959c40fb20b6bc384073105696d48cfc71487c2d44729da3f0f27231a7dd8e9000648bc8a3bd9816e4a910a70e02fd6f9086d4cc1d8c51aa562184b51a824128e157d5fd0211d4d87536eb3f1553b61dcc76ad6ef425b1659b0d6ea7960ed1aaf0222f3e54afcc1969fa4802b78a6d0b5c0d5c0343dc22eca9e9720c76d62aff5279662789f705d4fcc5609b2807824fa253fa809adc0af2d31df2420bed642c721c63ce9c26ae070c7bb808f686177bcf160419f5e380fd2a0970a9613e89a8c8318a2682bfcc90eeb63462628af752c4f8d3fc7871ed846bf9e9054661cc0daddbfeeda10405809963cc76152fa03dd01c670c977bb3fc23380bcac856cbc869bcb19953853677d0aaf61ad668857e97bf4aa0ee8dcdbf0978e2052595c5cd85dde2a9dff90cbc89f2bd8c9fc3516c98c9fcba022819d8bd3c9fe2fae51f7f178991555798a992393298eb3bcd45b302cda8961e319e837e60803f4949dc84f3587533a2fadcc12c7b943a7c16654f8a348ab03414c2bdf4c0f1889881db782a556c4884b4b8f2ed16338857143910f5dceca8e1b3cfe579d2380b257d32dadd4e5448008fee6878e029f2fc70df15cc4718617450b474e238104cb7f4499fd4116345ea2e4f04e3746bedb475324616d7a1ea960a75a0169edb48b01c2b6713f378df9edf1a88cebf3294ef29ea363153146610734e59c6c8984d1c3cf34b1807668afcdc589348bc6b6025742ece461bd760fb31456e38ac51595356d2bdebddf906a80bd6cfc535089df03ecb34d7ead5ecaf27881cf03d921383894a6656b9754dd49fc1c610229e2fce2a0765170abe1547659d2add41e458328b3635e48209e62cce6c566ab6eb9b2a93d4010c3dd9293b466a5394c6a35525311d87d00253408f926e6b23f66050ac8625e721d10dee7386b53b4158e42dbbcb49550f2d2141ff80f1f421a04ac272bafb11ed18f45355153647882bc724f086f807ed7e98b213b5f6e0407d8bdea405c870294f33dc1fe241c29230882123e6ead91d7cb0698bfc687b307a8249fd67f909d08e37e804a26575efe1e719e2201bde86f02f74e45238c17850d558300cc330f7d3e0a342029b036f72ab03cb1b40540499c011fa39c570ca056568aa12b75f6d4d233d6e9b756fa8c42f35dddf328e8355df69b636f55bdc3713d457a4b947d10d90f17a3bff9ee8e1ec51bd4ad7d3b7a727a3554fd544ee7834644cfd092d1326824fa2c3a899e439747b7459f54bdc9f48a4cfb8f72ba0f9d84364323a2e7d113e83974025d162d8f7e8b5ea77abbe965c8de6ef7a2c0f633261a21124c2b23acea66240e49dac4ab09a7bffbbac31109b83b08cf1dd85469bb139eb48b42f6965db1073510cf1ac0216679f58100f8a44745c3106241e4e60fd5a56a535ab3c36fbf9c30beb915a230024354ff2361302cff54df299602662877412a21da41e331e5dd6d42b0fd517d5fe63cad4d104a77145ea0cd9f73db8e8f1ea7bf12c3bd66e3fdeed0cef4477d2e6c1ea7f41325f40d721f2e797ec0286c1c5638ce3523b10a9eb12ad4b3ccfb6b0dab958cb64c70f89aa986584f2fed01909e7d50db5d7b5f5fea1d52b944de0f2228f68a0f301978903699f9941e5e3bb3a81bf2da290db8c0c35e28c531f0021506e8ed8548b97fed0e12d96a543994c47aba452ade215817ce2cf6f5ad8dcb8235470e871f864e16a6f85afc31eacbb894263729adf996625c4e52b0257163872b5f5992f8122e5cb8b239ba43027ebcfbbe1f1aad321e9f1ecbcd38528a5fc6f4c874e9b2046ac02ca9ae9b8e9ffc5b449f8d46b7b2d2c837f5a15d5162def8b64c56e42402c8d1c7c7bc2ff5b683fbaa49b60d375077ced7a6b485fa708435e315e8037bf97df533091eb7eda00593c29062c2c7231c6f349aaaaa468d117708dd3ba49338e5e70762f99c6c0e62bae43b6c908442cf037af2b352f3ec41d9caa069c2e73324266c637eb8436de3ea4638aa3bc8c7e364e14c32729c4a3adcc11032fa69278e99c1a02a011069291ac006908a13cbf69ba63814c3495021852e563bf5952e4ddc440b29fe09e4c88bbf7fb82d0128d641a092ede6c2160e37b09c11cf9a24adc7c7926c4cf8c08638060ee9ed709187873ec614ee90b6655ed04f0060d5edf0a7ddf60735fe9f53171f6bb4d23fac0694639dcce13bb72732af0932b47db70880e41c9305ae732b6c29a90b7e6982a2450fd90e1846e3bafa8c382a2422b81bcc924f9d9ff9d43b3c3a653d8c4aae13ba663cd7de845180459d8608ed10d8b66cf3b4157b61953a0f532ea818e7aa2b54f7e1fc7b2c27a69d3e7149809698dc3c36ddb71506cd4fcef691d6c7edce608910c626ae26fe4b0a3c55b416a1019bf47a9ce25aa831766e6aa967454b252e57c8b5d10d7fa80c8769df530d705c6b68dbf81b040b6b0582cdbbacee44fc8b21a79eb7f5bbf651ea0beacdb0d573266cd75c37fc0e2dd0eadde713d246c3a04f128cef878215dcd6e32279afac154cc6bfe8374138bd0f49668abe96817d4ff7a32b43ef0c0199016fb1cea50dd978c14469bfe70c280a42af95a61453d014f7c1640ed59df5e084b10567827c3c499176cb6d52a9f2f50d4b6109fc4a3a8b7ec6699f36c017804e4c67c7b1c1bdd85b1c8e3f51c74ceb8acc525f898c85f054cbd2718bd4651a544ae2927600852271c12706d0a60cae6c4f4a1e3ef44aa58019194375e5cfce3c38ded306cb1be0f4f8d2cf52373e33ce409206a47cca920c36628df115cbce05983668c2290073f5702e6808c8fdeaacc6bb36820dd6950ef1abb2a8eae1649a06b934622c319776b6e1543a6ccdfc1a9c69c3eb19d2be7e6b84ca2d2c295e005513e434235c1bd3862af123ceed52437ebf0b349bec674b685dff524e23d5e22c80af9fda1a01f151838ff0ab5305f1dc657de47268de94b869353b0a01a68fa8016d910aba5ffa329a202d828018b99679d23efbeab612d8369478586b2687b3ba99c888737148f86ae3084720852ba01ad72420a5c2809de04c857f0415dee7c01f5d23fed665dff5400f930624cc248834f4e1e3b5ef5b2fb647c6ffc70208b4119ecca1e56da0b57c7e109c5849f10dbbfb9ccb42cf0b5485e90de604f0fe7c048637dfa0fffcd68154464d022f3f3423a6092e56cb723014773a19e849c2579683c3caf783a38c9a078c4c4036466a92a57829930a370ab578bb8e1c6e1c9c355147112d98309c66b20bae8b8e87280eb423ed81da719108f4b11975d9d3266ac9dc09199a3f046368d20f90effc16a8f491470f7ab1397b7d1385230b3c995679a4f475af506001d1cfe038b89393f1264d21ed136aa88bc2ca830ce6b7d5214aae0ed63e516fc8c173bacdd620ad19860f95226ef3f04255098c3e6783f4d3bfa78b592aee0790d53ea90a8c65919f4e3081e56ad4c8831532fc7650d7eb98fc6b5be77d860f681fa2f1200d3919d8a4e715a4aee270362fbf9f102696de495851a7489877defb75c0be9ab91c2617ad8b0a4e7a20f08610c01cefffd7022042ea45358408a966d8dc5925d0cfa67938e0e9dd3c3cec4ec43a2d8b6721a39ea05b01733f793c25feff2172df0177b0b886cf93c026518c8e1986fae874b60b0c52298078d622003688366a1dbb4587b0b3161cea95deba1240772da8c51996d751c84eb42885a37676a713ba3eceb4d9339de8b5a36941a2656f3e645639082202865ae0fb14d2d454b9d9ba1a9cf871a8d6a9eed144d1014c97648365553f3a64d4ce4c10c7b64aee57de59778b5635d225b57d77cfe368359badcc1eaf770209e967cf33d4c2fc16e7bb2398c3b5c580c315aecafc09fdaa43b9c8784a0c4ec798505dc4682d2b094c7e2f7071f96a371c1e9870422345dc3157d3e14f368cc5281318604e0767cd91ad158f76162a0ba9dc16e55cf6569f541484b2620d22c5964fb8ec594a34349f93119eb1cb13a417ab612fd8876f1b77d67c7bba42ab7b19a570be0ad2332a026a7c791c04bd8caef8b040408b5e6dc2fc9f01ef216e4a646ddb52053f1498d9ead9ad3a0da30b7cc8a6890bc01f76cf75f8bb003ec54f294207c8a15b3669c49e61292576b6e953a5ceda327d4a784d2421f04d439fab0aeba342246a16235139298eb1a0da68f57ae7f502f1ed8729a22af943dd6c6e3c852411d01a9e2982f5ffed2d5914214d1127e0f67580fbd56a70e30afcf4e0985e40a2a47b2b1220a4718a88047aef450f7616d3be0e751c54f15615f37a8a40ea5bda9162aa2a1b699352ec904ba19eaea58b33ea90f867c8d9c07ab55c237a037cefdc7063e621619aaf21222ac6bf1994ffcde590e65d0ece87441289453baf279391f8a7dfa0ec3943bc6e517bde758502ef0de6d61e5624d79d22f3e62de2fe6d10cd644d1f7993f811de1601d9f1a3544d264faa3be86d2047a879dc6392c1ceeb4715c814c5d5d706edfe5b21f823089496d279e784722336100ad791dfcf6e8b7ed92851f6547622ea3f41eceb8a857454c6edaf8bbf72305132cd2a3651e162d2cd9a4ac260b2ba1bb7875a166512ff6877d68a00e3ced9333971253378b9af68c32f0fc5369d6019694e4f2d8ae9f8bd5e2a63116602f7a1f38ab113096b828e5a3c4c5c8610ea46129c7d5ed7e28e072162dd6ece272e474a24462a0de18d4a065392a1e14441be8f6580eec72d12d638783d06f4417330258e797ea4b3d9397556248b2b0108cff7775502573ecce0148e0e25052e5a7d311c6b16b2620d8186fa80836c18787310514a6582b83eb9ed23cd7f2d1a833006149e9d05ea4b626e67d59a0b2fc47018b017ce5e371d32ce61007d0d5997643f3822aa1c79a99e83f1dfcc6cd6cd20aaa70fb7c1146d362f03f38b921dccd348126f31467fe6abbb46a58017b07c4bee852ae5136dafdadf3650c9b19edb2e7b9a92f54ea488bf3f2921265928130e53d9a7531737b6ff97adedf74986c9f3bb271a901fdf4a9f89536b2eda1a1a21961edf279e66a7394cc185fa18b0971c00664612d594498d114d0cd865cad2b4b8b11fd604a23a5c77e0cc944c26d1c50133dfa215bab67fc4af72fac3f7a1180f72f9bdfe7d2ae947a968df62bd48ddd09907f856685869b45944002c91345943016960fed69cbf1f90de6393362a6bab3044207687b25097f343ce53ac938fee6e40b65fbab9df214893cccc051ffd337434c03e9d714482021dfb1f9d17eaf10da4b7b416a212f285e15dacb07efa93070935bfa49c6e5ae5a363a9d7a45cf42c9cc44e96ed40f82c0ebd2a89b7e8462bf91653b7f79f9476fbef50e52d8f9770b26fbeda47fd6ec58af994c9c0fdd9c3d704ff6e267760f097037d47572c793207f88abd250c487952e7e0fda1ef3cca0139b759d0ef68ba8c357b582c253e263481b47a7554a5589ee304a04e90575165875877eebe478028bb6e11ee52bc03e72d531503980dc6a17d37a83d39581de4e4db335311b9fcbca01f38fa30e68d5534ffd4e47840ec3bcf64133af22c2532641a1c68c96275c9567c417224dba62471564dec6d9c9e6db75a1fbc5ae37eed8b4aed895d6936f1bc9b2be777798a3218b9378d579353d269801bc000c8949640174822d586e718af0f7d621ebc6e630c589e52b77c98c4221dae92778b74d1d0f743e09c5012243e2bd5d48c9668196089423e0ed38c5cf8b6a865d4c1f757283282058f254b1f12342f769138ef7c304b34199896098fcd03c925b5f45d4b9341d3f088f8677a6c8b3a10b8b61086c6f4bc88cd4a5e3f36f5e15a389795ce70ab84d7764443730fa823e2a674c5b2980863973fd88b6cb08f925ee63a9ffb68e21d6667be6a4d968bcca17fde76e99a5517bb6b0088fc369640391929b4a2ee10214e6457c6c808990564fc9420e4bbb9d4b722c68190086d0faeaa12073402c70aa5e0b91307662052d53b0746e02811a987f68edc6a33fcc7a4bf6b72b144d71201c034bade040428e9db77c3b1cd4ecdc557a1695c9bb601860a960b20aca6b14488a17bb3ac9b92f3d1db2f1181bd9ddbd9c9d7747c5e701bbae47efb0d633a4fb4fa7bd0b58acad03624354d0fcea6019572ba4420751bedfecb0110079cf97646634e5790ee133933191fe8102dab37d5d51a33561f20d8f47d324509bf5f144f6fc6f8147a210385d8591a16f4c38b276d3631be04cba119ccc11a60ee1eabccb39c061a89372ddcfdf4c042d7561e22ef582cb058a4d86b9e56acc96a5317aa1ad111f1cfd44a88baa7f2864b24caf1e5dc7bec1e006d50e0a42bb15db1a032b713f100698a3bec4190a9b6c898b3a602a1adf79d73736a34acd9b74f0cf4a73cacba3abe61e23693538116f54667492ba20495d44764d1abfd9393286d3a8496c46be3c519706181a81d460187bb0e20e3c28fd50b964d36279aed701177187c50de1a4a622a96250b7b322bbe428572d6004c0a870d75cd1ca25adc61f15d460469e72a7e10fb925cab161808080f73ea888cc71e7b69f4a77034d4be6cb8c2cfc085791183ea8077123b20934543403ff19be131014fdaaae9ed19312396bb990c03f23bb7badc36834197f65b5d7a10a50e9ca5c451a09009f323120adb5c3c8f71f335db86b4f3815b389dfd1c0ab3e06bf1e9325ba0330507168d30e85a23d2506d4b08926c7bfb12f1b961f923e72687fe3a3047efa5c221e3a217163517fe25f156de04eead58ea1ad360546ee0f6f7da875c306923649ea909129f73be70f7886faf5236c8414faac59d0bd5772f60594900ab65568ecdcc1a3f1453c29c20970b8cb413340c4f2e7ec26ae0db7974a8f69a4145487f9031a8b63cd0055af687cd69e54e50378dde2258a8404d0d36147796f8a1cd884fc16fd158bdab04552d110fa61bb90da3e568360fc3f288f30f4c941c6723699974c18ac1bfa608c15e6975ae7cbebc62e52bc91bf60956e52b6bdf59efdbab68c814c20dcc27e4d54ec9e07a41518a7721ba4ffd9379bfe731bd125fb06bf85550827619f6680b406293502fe684157938874eba52e5368e3ff1b8a8b93397b413f6aca6578e7021c06cbb363798b2e8c242b6ad9c25d47843dbdfe66e2f682bc41fc386121cc1567973db3d7187b26e9ed877d60ef334492354a344dca8221426b5acdf77216f108564e21f3ddcdc22222b02c7ff1ac4db5a11bedcfaf247b4724a9743a2af6260a1cbf36aac0862f86cffc29d161a293076ac14cb46ee080c5778497d9340b9e53ee45e427fb1f8460644c8bc1a30490294d2c155ead9110e65d94d00e56e3f3a47f2c82517a10a5fec5b3b206a8f6d51a20721f5adc0d14f2059067193e0e4143d220e0224cb073e747c1f5994e02bcc5f77be720fbb4bcb58b11441dea1bc9b778252365fa52721fca37c0e5a81c90d6e13885205341727266cf82a29449c4e819453a455ba8fd3fe65d57e65b585b60c93aa991e39810a15d8128d6e31ce17058a99276c2079babe3dad6d4b19a8e32ba012a893971cb00f65475396d7557201263ba44d77902122460e79b373034030d83b1c372d5a4f66b1389dcd923c51b0d738c44347e8a9e300e886790b228a3ba918748830c1b4706ccec61df56fe6d66e98982f19cc80cd0b7880d8fb668d0f8f8323688bde78a0d1989f51d1a4ee9451191f16a45371c907cd83e880fa5d21ba549803b3cf77e9e1b6e0d11c7ca144c876adc2af670de09b345ecb2e6621647c290f22bde3fa94c11e36708a9375c86d641b0086311686aed7badafdc9a7b0bf64d74c3385b0474c4bb047fde113199599139758c926bba5c0e857b0a0d16ad402afdf76bd42347cfc649d39f05f47a09330bfc47bc552c4ad5fe48f370fb85bf8ce4bf568915d26dbdfe8aa1b66d7335065c08c5e9f429c478014fe9dca0b2a549a84e013a44336541176c619956ea35f463ddd21543fb558dfa81baaad6044faee767b09771ff34be8f04f464321454da14405964e15e07269582a98349ff8d81ded1a53b9abba86cf07403d36082702c38a80a216147e5bf42b037c82f8ec4ebddbb4f345a10f8a8bc8dd1658b0498df280d5d1d53fdd3d9122a975be5dc8c26e4a300e2b4a20b9d4ac6ea076a9114ffc7f6c501813a9ce038792cc497628a92fcb45bd8c019d198f53c1b512b05a3326406c7e3be8066e5463a892fdfeb6297de16b39e6e0d1b913ee74a69335b9bb933986066b5922a34d5f3464a84507e8c1d9f841c92096bcd270cafd27026133e0f9bc33fc51a137359ae609ae8447905bf3e3158392b03e4ec6f8c5f7a3d856f4acdb23a4650df5b0e9a9083817982cfdf73b4f35917d94770f4ea1f37bd15acd67ad05fc34ff29bd0bcbe3547b7175b2b5824f6dea46852cf4507824f5efa9fdb9e98505f1bc38db367f930d0b2b10409a992f5f202d06103faf1220fa28a8a71a5b766cdf824fbcf0aa05f4d9aee3c25de4b4e0ce17ec0438647a94abd64175feb002c8a469b14beae8fcd8c04ebac605dfaa5cfde4a9bce0c62549b3f43eba5d8111529364fc98068e9ea30a04e5948214ccf82d22a03d22da602ff9802711eccf03829272d09a1bcd7b4bc0fc26916a203e834744cc0f5679b3bec5e8b5fc04e68365d1359cedc2cc0b512fead1fb841cd3c97f5312103a8b3d29b57d6b71b3deb63d9b9f836a7c22cbbea327365bb36fcfe06d7f6aa6f60496e62aa6ba13b5796e9cdbe7686e588c19be2a37115a56c540162647f425e39acbcf62f10a0a618be086b07efee53af80ae79606734fafaaababfdb6c804a05b96e2c136df6703a064ed37a72d3911ea8852fea12564b21c58de27f53cf19d9c5046da88b7c194d219f4c0c07e3ad3d76d63f88cf1bcce637ca6392f1ff18ffaaeaae9b6ea9a405c77d0dce2fee9dc5b5b9e6c7fa4ca3297f4fc00b03d461a1c6a31b9c2e5a8ddc12a1e6ea528e3489b1f865bfdd1510d6ebc26a6a895bc83c84c0b9b84a9a8e3b18d039a629a053af8a1881eafe0e277192735d07d56b06e14404f95f44b35d2879094ace5323017fa420cd18ae35922d36eeef1c8fdffca059534d99808b0043a1f0a62ae4c00991e709cee48db4405d8b1e320d257f1caa6edfbddc0a34ec81fc6cca15030a21f84260d1c65947185b1aed4563318e1c2214fac17746a1665cf3e9b8ae631da842888c244c2614722382e9c5251c9d55e1830bb8b1b85b5b121f64f21574fc8dc5e9ba9bb6ce52e5a39ce4a69f0368e2a4babca88fdf8c4211e78f47ebceb30bd2f9be6216b541e7a9187521f0f4dd99d62491613e25b781907aac28d53df21af1dda8331a0c9151789320c1dd97a458c6c96684f16d737dbacbc611c2c351f469c91941187998ab6f11024f27217a01bfa76a0fb8ec2731d3a5b5ebf770e3c8319dc59b8a5a5012f166140ca93bda82cd62d0b7527108b011a7132aadf451a468ef72504e5a9e1d8ecd362f768d3741ae17e825813ebc26cdf505389ee3298029f49a85afed48d61d7980bb0edcf599b327c60240940c432fc2a9d156521f4333e6d169e25b39ac6a1ecb16021ece04d0072ab9fded5bb993fe494291e23af04dc87babb4faadf7f6fbafef398659a1e238a0bf9f06ecf164a5b66b50db3fb33d5af802667c0e21e9654840c055f4a0e25c786eac868d120022067b3e1be86520a531a7ae9a72d07e7008cd9cb8b2637c0a0db1cf5605aa07e7c690da6daaac35b8dc8628de30d41ce0d3266d5541d04471ff3046180ce5874609a68a02fd6cd0f8730ca9e3a43207cd2229916154462d89812abfd7ae69587576a4576a62630fc072171cc307e8029da848c83ce719034cdc32cb31144cca2a1d7db45e92066874bfe71392f02586f587d71f7621523ccc4636bc318fb98b5e54cf5783e08a0c279fa97037cd00df12c9ecd06f64d6cc3775ff46ec1783ae7a252b61715e00298cbc475b1e1e2ecc8a605899b254ecb8b06a5f8ad6646e000b65b71266eb9433270555e8f4896f3582ee99eb0635d768e7895a69790762c68ea3704d40cafe3fbf86165e112df0bfcc7895261a19902785d334ee72f714c41ed74102224876e6e74c156e05784cb530cc2779cf91257d764c07d0ffb544941422b73962dbed74af874de67137dcd98267a8c35651048e125508d3943d33318ea231aa1c569836d15d9db549375441616427fc469639e4b6007ac800f9f1988fb558222b3246b005861f002158e2721fd2fea97d11ce6dc9db62c144db3e466a7c7f9e9382e49eb7c706cb3138899c36c4f9d490990e20ac2f9c65541c78adcbd2eb1b6b27b02c49ce66c2ea509a2ccde48826a85f46c0ac0dfeb7d6c34b3a41ab9de5264ec6277d000831bd2c5f01c2ae6bde58cb1958f60201be971c8567ee6e00585b31895c145c6b46801a3e428d3798f0d053318e3dc825a34e22558803090835ac34bfd254fc061faf051071d213b5235bc60a09167cf6150c7da4bb7c80571225bdbdfbea18800f8a00ccc3553e22013e202b9ceb3db5971607881126a6db043f6bfeaa945fbd813b217b0ec64a8dbf786b0c0f239f2de93638e9250e55a087aa31ea47632d586831dc1b3b2b7f8dad61801161c5a8f266d0bfba05cb9898dff9c3b1a65b499f28167db4373ba9bde77fcfb5ce9284b25dd58cef9493b302d0744cb5610a6d4b1cee614baaa1c4fe8cce428caf7ab21c44dbefe3af548ec9f25ba1626ddb3a0e48a08ff5e3dd8c4860b27b554ff358127b69de5406eff3af8bb79dc1bb922fc1ad5873745ff0d36b970c57c0cdfa0e9d1e51788d57700c30ecef00a2d509084c02ac2b2de1d4fc5cd9de9312540dd5ef05b291c10fefe91cf9148a14fea7a0ac3a973d5d78c53c4b55fd54bef304398c36e9ef8eaa2db85bd923dad6c98097b4d411ea8adeecdb0e13677d942acbbfc85615212025a0ff58b59ae0c72442f1c18eb1719a4c08dc10fcc018b246bef2465d05930604f936e4b48f4e4c3728189272498fd1b4dce9ccd12ee054883d10c7b68230d70fb551ea939ce43c34668024bbf9bebbbcce19c0c3b520432bec9c79fbc00014e233078e9b944d33f0b520f6854e41be6e050bc45d2125b42263eee8af730111e063ebdc87b89677f09fc9e8c0df969ada9a9b952043e4687e3371a315acd5a95c8bf68477c91576d33b97f76e0928cb66047b23592d26207473c4958fbe95f70a7d91daed8a3273b0359f26ac6797b9e7f8e52d5b8f962e51a8d88e7c3734fdb236f5255019d6e4ba8f5f7d5375f031b114486b715ec3acdedeb55797dded108cc0f4acf3d35ad96b470b89c760ddc58e0569db79b79e280e8ef41a8123ea752cdb2ee2b0d1c4468f487a979e1741d505f63f8ee48304d7b8c3c1c308b2464e32d24e87e4ca35311855b8db8b68a8958db0efd7c6083e405914734c6ff30b8f8488e45936055ed98945377c3f25ea9a832a0fabba62355c3541d854591f5a32f6a5e5475c61cd1bfaadeb62a30cd07ab0229c9f0e6a784fad577fe80beea9a8b239ec3789b2f6978513c56efb362fabda1f673501403ca4618f9e6a59eeebce0063504eb2475ea77074d829a95eb058ad56acf4711693f37da62ebc8eec10fae06519235dca931f4b4da5b673276e9650a353467f21f13d749b8d86eef2e96a413579a5ea2a41969b7839d483d14162cddb1a87303b547ba1fda0fcdf9c898b2fa0e6e9680e587c9ac5a653bbb2954d3dc7c6b603d8939af5c5acdd7323de3038a6e2c171dd9b08ffab880671303215a40f228e766a0a524d9c1bcf34c2ae4028946a8a502a923410bfe0cf57360cf772e5449a1bf5980e69df1df4d73365a9d2711dc28f6bf1d1c0fe48ae98305ab1223de033e540b53d5d7e1f45e1f67a128c01d30ea3b96290b087f5fe03c4c3666976355f78324e8830e73086feb20005f414eaa8fc5d1967b02ac688ab6e88bb7ae0634132cd2f128773a6dfb7a9d50559e5d110a09309547d84d70db107ca5f63d9e73ecf7146f281eef7ad00c56dc2b712924d32454b52b3163b23c65090ae3ce5b90f64bac833e1060668c4ec42dea20b249cb9e1359efeec45f4875ec2f7058b63d5ca52aeeddea01244f1adefd7e49d2e555c45066f86e74a311b9bc700a8f38db61547aa47d418018e7f5ba58053990f78adfdb949dba8ab25880d09d39a08173e9ce4248006ee069a7636c7ce3a125fe2e712e7e9d55663bb6ca43988a53177d07df2c6daa43d5a994cbab2a98b4d692692d7953be0aac4bd84c0a66c62d8f9dcfde03a95d3236db177173c9e18ae2563a667bea40ce7065068060749d2144e8795f288eddd16e02299fb88f6bee71a97b1dff6bffe367875b98a3966dc6b93f659d4cd508d865d5bf4d63cf431cdf24ac1de7ca7bd02cb99c2bc2ff8fcaf710582f75d1e52b3ea486ba0a0074c06c369d7376d7b03e712b7c4ea6604a43981cbbcfd20c7c714cf754368c7ff86b0993a009d63b192f5054e11527b2fb6dcfe4b5dccd874bfe9e87c6a6c61639ca2ddf7c439ec3cdea234217dc2fb053069fd5707e7a301c14b33ff637c1d5066ea72f3cd094906fe44bff58fe860016d62da32ee40d649262f0ea88cbc64ece0c86966361176c1cec5fe3b73feaff9f6580cb2477f26cd026574f9cafb9816c4e2ff1fc18849002fe382b4ed6fea35217efced2dab343c73e02a6f92d184af0017fc16e01146a0aeed668344290d2721a42d150a4f285738c6a4220138087894b218f6819bc5d2c7dcd8743b8a6970327234a12410cd8a6fc27cf1b61ae766ffb4f35b90d06031249d5b7f22056ae2e7d2f7e708fed8170678d0643fb45ca84d10142951b417fcbf88f995023948b68b31a053611eb890406c17963b21701a5a3d7926c942788606ec90d9cec9eaf464e52014aae4f18c3667a3185a7a7400c8942471d103be18ad628d5d1838212bb9d945669223b9f0f1d54d3991ad3d23bb4f195a97683c9f7bf83f99cd08d8ae34a825b5a1d440e1731af1071f154d091c4ff02585888c4ead4b24efc7fa3cccd7c05c8086e9f605ce421165cadb6e6d5a720862289c83c67fc0791f549140165dd1a1a5ae09a0677825f7869b859dd073007fe587ffb456a4ac9cd41ee77384c73a1e9e14680799f5149f0ab3927d9153b3417342334444ea9201e17c242d437c021125ca80f6a0cc12a22ddaaa1d868a9a8bdd1387e50f3245cee6734faa564f80e0326c1650ff66e75f7e2b040aba06f0e129383e2097b3e85c863c941797e0f5c596c0ae129ea91459c8ef5ff1d1c5a7857f5515b075d0f25b62ed6257080eb7d23f2ae4e3ef68e67f7b8d9708a3c2e9aad6f0164d5093e9e9b0062e6092148241f574a6f2347f61d00b9f7b5d6994cd3c7706a4e78b0c0b5342909cc3d4db47b8851501c0dca6188a2759a6f0241822349c444a85f8c276d05f515a7a2945e2c2b9f60b4ae9b36d9e96c36f2b89f64d4e2a5716d15b814adfc10848a51f2b0b3d422d736d98af89401ca4d2586ee20994f380a24a2baee666991baf5e3f8d44185db4a5743f27115ccf86afad7398952c83b49226c35d3dac2a299e0ff6a1690301efa04fd7905b721bcb9c3e2d4de5fb0f2105866a752d207e13fbc7d4338559a5b563e8194eb0ab35ab6b7886edb88f74dc822c95e3bb2e1007e03c146f93906efb5ae6f21381c244590e428d1ee85f6247c5751b3321ad4e55ddc3903ce6bc4d67097892df7e8a90b00730ccaf634ebc34699ccafff9a152f43246c24a8b785ea302fd7bfc130b902a0bfbfe3f937730f059a0a3810c48803e1f4fd24dd68bff9049f341b1512034cb58224734b3cba291c185b271904eccde93085d5d2af51798544f22d8daa2e4b6cf02204fe6c69bce2c3fbf8fd7403314653c4e32fb61e3456b0021003427842dd0feb9be55992638fdba63a5b66a740e4c122ade702bbf5eb94282acd01562bd2381dc0731233374d8e8c7a7a8e18ce7bb11b72b8cbf57ea15283cbf72ce97aae85f93c68aa6ba67b91666785ec49560ed1f384d814e78c7e9d1d49640f8c5beb6ce7ad278dbb7df290e3be47198dd8cb38f7b834ebd45202c3981ac4f81a0d0f483319d325cc688d1219bf8501d8f2fc801988e4dc66532ab478973bd9b9f0e5dfd96eeb21b07ef2ee09ef2ece84dd68a2a336b1d5f3f768338f4f786d7d42feaafc09c576eec18fffad1e9ca86d5b828601afeb692326d77f275a02e0a490a0e710acd84b5e1fe1f90d3d510d1ba80242408ea1a76a59e2af463e6ec00d6ef71ddb0e313f13afcf3ff602be0c2731833b7e8c9ae37b4adabc6e28b9fdfbf5117e463c9b580230a4cd5a03f3b4ec767042dac4cd644c451ef202de91b3163ff698c4127e5c5446de3da0c01ef48ae1867b2442187319827b8496b8674227f7cc2df63b54fa70f9986e01e1e76d9215a0e2f271224ce0e346df60420080528ee49014fe091db0490a0d3ce7ffdac34df3c74d97e37fc61f8a1d21073de24f2eedbb80b2c6fe01bfdaadfd67838b5fc3387dff40a38afb076ed4c7ca27ef420b1324a8ffb49fbc7a3f2b61b96d2338fe59a1662f3280ba39c95836d9a79e8245c7dea839de3e8a9eb46cc94deff415cb6564fdb001b7c280376a87d818cf15c73dbeb7ddf37c4c18c263e6b9430c819ca56ce79581a9ba0b3fdb21ebe39b96eb89a3b2d53200ed67eeed0e18f79bb88fdb625f71838b5e1032726999284d012711ec0b141b58a88d36bc157018dc99bb055460d3ed931b53ea19d616ced4e26a71504326636ab9bb9c87f5ddbe92991aa9d1be901a4d680637836e42720de9b4d83a28c5cc320277184e3d33d9123ee98550c7cf5d8f500d57bfae29b20b80cbf7c5e2b08f348c59b9758e65009eb363d7a0b54f7270af22cbef68dfc69b1116d729c57413c4b4a06254a1a5304e6fba7fc1bc47016fe7822128c35dd19919f2cb2977fd7a93a846c354134e7841e71a7f2ccd926475fb963e68c802fda032c04f12c2937952e9912b8eaf24b0ceef81d32c47e57a3a10b5bc037bc673197787c1c1fbe97165c4814c15d845e0018d09ed8aacf082128a309a4406c5fe11db159d9371a26c224982e52f050f4b734e8c58092d1e83326ffaaf92c4c45601c9a22b1b0a515d2f61fa009af4fda91b6763ce65c8e533010fc4ad3c0ab5a49f19545ad29ab2d89c20a045d3f31d3a2fe1a7381c467fa43f6cefa2daaa434290454602832129bb5e1916b457feeb0320d9b04eb8063fe080d1e96fa3e653216707151fc80bdf817cfc53762b7681ddabec21107a882ffe657d882a58b816c086ca601d40208d8adda31cd62c6c2edb95f9ed6759af582d3a7ddc88a9499fdb3a7689385499d74e863a1484ab6128d15676cb831042b77bd36077e7445fa6ca83d05421fe4324540899018430c9be98f3182a427b2f29933e3987978308ac5d14fbe312b4cd92127663b0483129e002cc51fde1c59b5b61a878441edc205ed4a4bad961254a5028c2e687bf83276d97e328a65fa7f84e5804ee4c8586a73bd4857e99387e97e7ec8a7b0eb7ce82229146b7304f1d44cc6aa3ad7483324c0931df41eab13020715a029007404bbb3a4fc92ccef5ef0600e28b0570fa1fe612df80dae50a30b24905d6dd55cf7a08f74f45e877a3b67ab80041f0fede3c62c0fa187ae282f02586240c21aa407726871b4e7a65e0106f1889e68bfe418521e6415987506b8e1514694844594850a90d1e4880a374833b355df3dea62e315072e0000603989ffad97cc35058d824414f4993d5dedcc1e723f950e9a559b808b902f405b949d877779e27f824122f93b90412f124613adbddb9a8e0a98ec48008c5def20f4a2422a7b693a5e3219b6451ab5bfae68e6088b1c92a240b96ddb925b4a8b7c23219a1fecebefab1f9a961d406667cadaa4871a18a231c8361aa1649154b3a62977b03901dbe5449eabc052ca040168044c5552e210b78e0cdfb1b45518d0c2391f042a704b9f9d954660c1b1d93064139b06a40337147f59538515240d633dce15ea047f4b8e9c3a113b04c7d5bf24d9f1704fa02ba4a467f24d7e1be4334403533d93dd83c81f2b90e8e49014edc22763aea85a16131e434b3820017c9351ff13f5a1843476860f911782aa1690404b1ed0d64e3791013d23618e10de0520302d041052d3601b2d6eb68f1c301b7363d89de0add5f540a265b008c7776a2a506464699db59f877ca36fac08be51d5c93c457ecc6ca00de0aa1895da19f5fed931b5de0c3dab4a67011a55fa31303fdb79348fd119bb8454145c2bd51b636e5c5f058ad4d45bf2bc0b56ab10661895ef85988cd453e3d08df6f40ff3dd55612a41b81508b0691b791593c20a73269652bfca6cc1c64ca49fe2eee79e504d7a6e99f7edd01580a84065ea0fd7300218abd4e1e266b669b69dfc4ea009ab2f5ae1ff548ce0bdbeaec71cd36d60e86231864a1685b89e58123d120f6f7454f98b9d1545393e88e798d0d2c631a8d1472fd2d4e3f7d6cc91d018280834671477cf27804d97d1e056ede050a73da84c6219985d511f3808d1acc4df42dde42b0801e98328494b535ab9dbc9fca45872cf2a6c10190c54807cb81d41ce9976bd619193a1d6c1b3ab16d896311f429758b3cd334693a713a7af08d62bbc1edbb882bce65d70f0ae187111afcc713a31024db9810971011ec4d3543f938dbbaca8fb347e8e0c41103facc2edbeed1f8ae5559f4615893b35db519169090c427d75a23445951b4f07e25ab4686466574b5c78b0cded5db6fd6231ab246721eca9e9575c3d48697b393b78b6aae504e7b223927bf6f71acb4ffaa1c692ee490c42a3d85bfa48cdba7eae73622e975089b917957bd099596dfcdaf85e500a10363619274eb07dd9f09e417dea2d7d284adb176ef1437e9ece09ddae0aa52cb36a90cefe4545b5498c18dc6808d399d28f1702d26b2f5022e0689bf8fb5c930aedcbc050873f914a417d16449a607a0c15a44bbe31ca6c975886297c6f4461b6a0b6aed388e697a9e0bfa5ba6b3a85952d3731202215a5b070ea2e4761c656904b1ca69cc61747e03ea70ca805510400b2b1da0cd3704fddace2b9f1eb5ac819e032582f3f552cb020dbdfda04c5128f806683063abf6085b8cd06973ab7b066abe613379d77977596c4480238d43d594bc6d6bc8e2d197646fb90991726f999294013808d0071608593e95767e0b6ddffaed5bb82873a095717e55fa161d5696a4fac2483aa0a665cc57b168bd72a4f2e20c0eeb87ce0907058badf467c47ac276ab556badb9725f6bad5458545cad17e645562d220cfdd28554d8ca545d40d5ee07ce09142cf6092c29b0a8640cba9a96315858548eaa0ba96d87338ea04233bb1ca9baa8e2545e6055a122eb8c1167b890c20c1e9eac8d39ea84f72716f94313b7f709dce34c40efdc25b577c4deb191c20d65585739d4c91d933aed13d69cda3e768a4ee6387b28b7890961abb4d5c2b17661369d56d5dc5cb0d814ad19a3dcc6c545b9d711020b151534c882bd8e2b472a2a9272f83d2d6f4c17c12f671ca82fcc5e1ba95e285a9283277830624a89093140f1c33128851bcaf2fd42b5346b1ff9b6cf1255622aa43c71cca507d1eddc087632120280ef922c737b2cbd694a9f18bc2e856aad7fe92fc9b2bd4e7d61040be602e08ad0059159841b94524a7328a5dc6f49dd0d1b37ce2e84bb244bc7baa66e1cbbf27b850e84c985455204f66d99fbc1dd5e480d0be6c26e1099716cba9b1b678c329fd1b3fb916fb9b68ff469b96df8c6a4d2d9dbb26d66716d6ef49d70e6f046109925aed9662cee7c67d2ddfb7511857b377009cec27dfdf94e82ecdf487a1b4111b781eb9863cbf371e81c725904453acab6dfbc21355492fd1d3749f9ce441753708f319a4086aa4b1a299e4829dba3ba2431e7dc38aa2e555dae72ec27976e8e8086140fa08690e2888730a85042cd3d13c6fc065a1154140dc4e8f245d2939a270185193471524191456ee558e312c5ddfa4a4c4ab781268f28a3e5a291b9aa0e8d4d9a7ececc540ce3a566f9d56749aaeffc8e100f751150f7ed39b6218625b1778444ad24f68ef831b8706cd91d0a63cb60320f71b8ca58a31ff3e4de087d4e3e181625c9aeef62ffb869327de90da1f4956d92e4f817a43dd0fdd83f2e4e127b47fc24f79564797dec1d361fed7360eb23e8fa09767fc10844d439f4bfa1287b382c72b54049398ee328a5eef249c4136864eee373de3f5a1fd68f38e4da73d9ce3deffb24597e7eafd7bfeceb65bfb79ff564375d9b2bba689c5b2bc98f164e92c5fbcef3f050bfeb3350b7596a84fb982487f5e3531c16752091f92e0c44bf337783c87ce7bc52d1b294e5cfb8c96ea1edf190bf4c92fb3d074e587162c909279d7462cbe4e1cb9931be50657d39338333606c60ebddad3b2cfbfcfa2e2fc83fdbb94022a7ffe1acde5d64656bd145146eab62d95f5d60f41da71fe8bc7dfcc0acb876ef6082dc92d0233d997bf7f0734eae35601f7cbdf9ca05c90f218407d21c12cf21e0269b07d23130d6b27e10c00f405ac6edbfe0b78e0ce7e57bb02c7d1e078ce047bfa0c4f3057e6068735b216fc58ae5a533235981033d79c34313b712f9dab6a7ea5be46962aa892872134f4d94f9a183b58f7f97d33ed5cb307a26fb571cd27fbd7fe8c5c873830386f56dc2fad48925d91f074a8dada02b48ff7cf78cf8e3e0907eaddd67db0be21ed63ed2eddf8037b8ffbebede060cc11b44b67ffdf62f7c83fb1b1fb66f9f16a309dd10e802875af8b64cfe56b7a71836ddcd744882e4734826e072c1b104a7c8534a9ecf79d1bdfc3b9731e2d8beb7ad717fc431ca1a0fc598a50cdabdbb5dbabf7cef2a545065327d7720f387703f79240b40dae79b76c634a48c8cbae7aaefc89fdcb63d0736176473cef54e546d68b9363c425e61c3fe93522b6de47183cc169ce127ad85a245f967037d824143b62eba18753092563a2859539c97284f2da6d69333ba29835a1660e4581435516830a38091a9a294e14194a9a525380883c99a88aba20091fda5155174c80d25073ac400e52a3e14ac2d5e70124988e0a8459353a56a222237d1daa8932f25c5340cdc2647aa2533a6b76413829342b3d4af4bcbaac0c5820e0c5b8667254875441a1f102f23ee151bebc44d14381e18981635c0f8800c10ac0491d841cce543089d1036966e50c991e224821426002065cb08503c95025d355cc504a0ba40877e21000ecd00c620814a8a1a99943476b81e4a280101382170704f788e2840951c2e257aea1613aa9713a65060ba420793981d4c5af8307531638ac10f539a1498cce0c1a4831e4c69f858a2c2d10f2156a04a40a8948c05e8c900dc132cb4a282382a82d484281642689921f40507980203225366d0c214328a4cb90102a69c61c4c8051f12d0e4055a84029660a0b200ce298616130c404103b8281c60c503aa2080850c6322a08504cc4ce08b19c2a0801815c8b2c00d2eb09d4103953430d043064aa0012136f0243c62a8ca112e090e34d1816d8b075250c31448bed870c50d6288b4f80017388001026e06399011824d8d08aae820c74640ab924692e90309a26a104a9c667d5224a518492f091d4eb0834b8a871698252e323db4b86012860f63d070f083951e1c312941121214205c569a3011440b05495242b8c00c51868816174ec228a2062650f3a4525dd981d20e46b44a00c54994a5a56ae508ee0989f984142a284a920acb0998aa98c25151c112a6c605a98a192b46ac99352e4e571c0b8b9520184d2d03272c68246125d88571a9b0a4a16a32924a580936f590634b5809d6b6202197904ac8a7a02d9d0c77e6f8e58a29b2fcee25c3dd72fc7285159167009452ca51ca514a294729178df204a3ef2ca008687e0fdb27d9b00f2b004dd9ee3588b1653fdd5094e36769307a7aba78bb75fa8825caced99b1b56a3ec3ec35d07ee4d2fc8d7dca06d83715c77ceb97372e6d831768c1da34b26eb8224ee96b25bca6e97dfb263c728658c1da3ec28a38c324a19e3cb323163262b87d5a909d6026ea46a2295c31aa99294a880c8ca473a235c58e27afa406035b1ca3e39522149e5cee7f4ad85ce9972ce38639cd339b9f5f416ae7c6feffcfd379f174be724fd3168d180ab074c17c8b085045e3083990a7071812e30e08506b0c22f8ec0a00360d470c68618108581830c724023821924a18112318cd2ec5083256330218396755406920d9a9891a466881b38c1810972a0b4068a0e96ce4062074c6850e181951e609169381929a1c3d30e4cf000b5e4891eb63039810f5134287ef072244509a490aa0062aa09551055496084083344164458391953441913b4e0c995d216469881d24514ac25181c71068930a4a061a2c1943454c6a89265c50657d460c141d31aa73392404309d983258c9e76c8b28409264dd0a08e9c407aa28996a42d437071720213a040290a4a0a96a040a20b93172a51589102cb144e524a50f154051356404d3df1650bd5096a515550a8c00b1829ae900a530516535950ada0ca0a8c983063b2206355664cb3c0e2e82ee30539967911e512f2e9935621f8a2b6058d8f92887413d4a2a284b0d4a2ae66a83db1e609352fa86941d242cb319c1c6b5a96b434e1a5a605aba6a58cda161fa0dc1842f76ab928edde2ba546a60b370e3228056a727f08822ca7d0d8e284073964e924f7d333b95f96893c70086ad1279a39871cd2ce2bb27d874a5abfd52d071064d90a69e6b89618f2658c3c886648a957847e83f33bf26cade75a60d872658ef3e473cf61fb7945e437be32b772942e7bea64f78c48faa493a20bd03c2d1531c618485c99c299989c0fc7711c3781b86d4e295d30c145104b61c098c2b3c4b20da4b84c4117cd58a61b459273afd7ebf5b2b4d7ebf5bad6fbbe1b3f5bed913dd29264912c92ab566b2dfeeab5af242a69d64a9ab537769b1323e9c6d2acd2cd8d45b247b2c7cdcdcd5bda8d55bab9b14937373716e9de48dab53737da587b648fec913d4aca4a42b24856c9d26c9245b2d64bf29d7eea794914dba46eef3fcf7a98f6db237b648f62f6e87a5ec5e8d23cf5e586946cd4f37edbeef4687597e7ddd65fef5eefb6fe7af77addc7dcf2be96f5deb6bed677deb56f29b7bdf5b0fdefc356fecbf3ac773bef5f2fefdbfbaf3ddbb565b2e29072995e49e93282e1adb5be875467ad5e52572bb62d8baf7755fa7d37b5569b5aeddfd8dccf057e58ee0b13d14cbb160ead505834d4b95cad6fdd9833dda651d480299790632d8d9a3cc6549642e458ab01140d636e39cedb7beff5968642eeeb2bc9d272d652d9fa6bc11a7a499eb4389cd73e8e7d9c8b631f27f49686be8fd9de7bff259178c619b2ff3dd14b3652de5affaaf42f7ebd8d0d6ea4793ff6c5e10d0e0e6f280a73f2fd9baf3e9bf76d70582f0e8fc45ed3f5f43fb012e9b20b87dcb7fe467fa598a9166146064a5961ace42c27f9841c6b6460e5eee51e3a6e5b87906409ba23f11ceba431522ffa0f6d1fa98b52a73f3d273974249ee5fced8174fcd8c24438f49232f7ad968dafa9f5f5c3237fbb6fbdb5a142431487d2f536bc1b4f9fd50fb49662fa301096e90dbef91aa0bdf9ef61606c1cdae023b1ecea9dcfc3b6c34434bb70c87dc543ee3589794d640ec74adc9bad29b0949698b2c4b6ee20355515c6aacc5592c7c37529a92b75a5ae9154476519eb577ee5663c24af890ef7c262393a2ff37680c572745ee635d1e15e582c47e76546575e582c47e7655e13a96b75612f3575a5bc261e92526ea92b25555bcae25076485231572b76bd26582cf0974849b8f51dec5e1f5cd6e5a2d6a3dd3096bdd61bf37ab843adb732ca8beb9d0b23addac7d2276aaff230d435730b8873523eb5cca96550edb44149d726a1daf3c1b5d92399c36372ebc71cc69cbc1eaeccb19cf6e1deff75706c3687328798fb5a9a33399451b2aa7dccc89efc6594bff4e2409a267318d962514851fe1e955dca77b55ce2f086a2c795627b24736c3a2ead135d2c63ca97b43cbb39b734c92921a59448124922a1706b54d71577bed3a71fcea760671798fbca61fd2336d3598d26f72f3abb98628f882b57fa2e4fe87b8ea39666915a5e10e5aa1754e5f4eebdd78b36f77a1e77eb7dcefb96111b5c03485feede1c521ccea2241cb634fa5669a8f54a32ad945a9aec51ff859178e5def5aa4fa94731c5deb75cdebbbef5e2287d5b71288fd899397ce3beeb5f148743ea73f439fa2f4a5d2feb09d5788a876a54ee41f8c0e509d51fe26a7cab82c0711fd41a9f970bcaec799ee7dd16c6f42dede66dc0ee81f87dfb518abfff3c8bf1ebc3d7c543f5bda7167fde577adf62f06ed43ecefd8fbb3894963e0ede76eedfefed91ec61e9db607b648fac17f4a2e0963d2e7b7466cf73755debdb0b32cab65699dd23c271ff7aee5fd87befc3e1b44735bbde1eb924dd8cb6180fdde43672fbee779d7d6ddb36346db6edf572791efa88faf5aef96d0fa46dc0b05daf398bdc9f5f23bd5e9dd4dff77ddda4e51171c91a73959f109f45ee3bbf4549947c36dff9eba5bcfd951fce77bfbfd8490e6d3012cf40ba89ec61f3b2c6879dbdaf81c3ce574a6c73dfbb9fb7fd773721df4b1c0ef95efef7f22392ec217fc3afd065c1500a6d2ff190fcf9f5ab01fb602d50e86b3df7751b0cd3af75a5eebdf7de6ef9176c1cf005c4adcb7a6fc4fbcfdefc0deec1319b9fed6367389687bebfdf4b69f31e0e6df00def5dfffa9e5871cbb7affb4336dd7d2136df360dbbfa6e227b5c1cde50f47a7d3779bd923c50e6effbbecff35c49ad56ebbecdb579ddee5ff3f5dbdb0c79bd7e8b2d8b2d7b51efbdff2ce8f27781b59bb4826a276d6bda88f57d404517db272ccadd2ff7ea7360489439295b5f6bad949b1b070e6dd8b7e89a76b5ba2818b38b7bd92399838644013d2f95fd75a215eff2f5451e1d2bd2ec3925ac77e47794d826f2787b5bdcfe7062b5bbfb78e91e238fbf97f1df6cc8d9867d8498a9d61faa434645960341fd4ca1ac23f2903885c8e33994d1c8a3718c3ced3a84f81446d95dc68a4c1d7316217dfc7854777ecbe6d2451dc96139e3b08fb084ede3ecdeb7af538597bcbd0f1c790be33fdb7b5777bee39fed276f9b0e21b09fed7d6c3adae7069111723f515bb90b602defb556d67abae46c629ddee96f1cd9b6ffd58d39948531c7b5db4714697247cf1b8abb4be9dee37fa5bbfbbbbbbf8e8ef9525aa92f31bbbbbb4bd9f25e89670d386eeb0f65594ae9fc6b4fadc9c9534d4b7878d167f2403a7a875481f6b3e883f60344dfdf27f2e8f75fe2465962590837d17a8028a6377246b18ede913e8d431bd9bf27f2f87b5797c35be4d9bafd61dedd3d7f90b3ede3cbd98661ed23718ebd54d7238f7775fdefcb20cc4d9ca38c43f24322cf6e8599fe1e39d6ac60cab1a594b2db1e48ffdcf07f7ccc896fcbb6edb728a6f2b6e9c8db8c861cb7248bcb672203c2dd1d834e868be375f1ba4c2c436a64f9cdd48a3591ed73e3a86dd52aa56cb59edcdd5dae6ddbb6ae73622da5945a5b049456abd5f2bc2298baaeebbeaf967959cff3bcd7cb3373edebf57addbb656acb0ce2ab053d7c9b733e19e22a739307f79dec6dcee944f4b97988aa39396e9b733ee9648ff6cefd0d25c49adcafc8a35b82e9e6ecbf6d3ba777623f378c55b21e77d7f1734399108f533f2cf86c02f9f4e91b86c5ce455c9490527673e1829f6a5c943cc71a9722bca524c2f1f52f4455d6e258c6a64669c1dbc54aeee224e7d8c843e6aeed13793839528b72821d81ada0ab6d3183852eeacc4af3f873c37f65eeb9303d2df8e0feb9d7e95903713a321779f450fffc8987b6ede72bf2e8768e8b56ae14c5521621c79a17a5ecb7657e81b450a30a13ef4ca7a7db18102130f742cbee1287712a87449e8ddc6085a676c54a0e6b8d8b529c1bf87e7be5fa5eece151ce6617185def2acab55e9bef36509ab9db5f7b73adb94eb016d930ecad7de5f95d6bfd50e64a67bd2e830dcb1c579ce4da15a41c3fa77d622c327dce39e7e4a490c4dbb66d734215652925bede4274b17f7a758b5c10669cb252eebe16449adc7d745ae364956b4e52b9b9fe8ef384688e2dc3a1cc61fc24a8ac23c75a106864e90df14c821c234f91f89df7e17e0fb7fe88f5822a782dccbf6d3b18dd112bcd7885c530d73fb42e8ba61c0a73c851c629ab2c221eb141b115e0e56969eba28cab5d0851c6cdf6b1418c10a12fe9853d5522cff4c2b818b91d74b47bafa35d93eb39f037d006a29b558839baebeef561e7d90f821114e589c3d6db77bd049b6e7e039b683220d77737202d0674f32e308b4ee4e96752816e300fae9fe0a479796a5ac2a226d31ec885bb6d84684686f699dec499e6ac2b46134202e4fe1851087772bf00e28efe9f1bf6342cd6020c5dc342cbfd3a58689fb69c17c47eb2874dccd1dfaf2fcfc643f35f23441eddf707995ef77a70469ef91eb8451e231d11ef3f3cf4bdf79e8ea73bffb351924322cfde5f3016bfda172f39d6c040e5b0a7f685967bda677ebf8eeee26576999a5dc278deac91bb6ceddb6fc51e2f73f45b20fdb2871099a35fc873f7425adfad5815446617a803f411791a8732156a9d1d1814ae13532cc79a930ff9ce9f3851363ffae0449f185b51369f4219191975690a137762996ae6369d8935a5f92635b226347a7c849c7888b298c359f7d8dea597e5c62df2f8cfc8e3ed3d5dff8d8b3c21916720ed2be864c431c6188c8c8c98c2c49d58a69a893b319f893bd15d0e6122bae82d711bdfb64d124b5f712bb3ca46859b4299aa941612ae23ba251bc583f219f152ba4f6c4c7053048e1318113586f840081092624184d0c406103790724a20c211007e1881f63e804c700f0158a2c383007618800e244823591a3b3d288107044003c70e78ce28800e72ace9c981093838e10628a8d161c60e1bf89431cbfa2123853178d4a0471a1f62a840831f3358010d1019e43080626080332c80110483205f086109f162481707e0828899165e50640b04b8c0c8950b5a24a0052fb04001656020b3803131886180550356e0802c1e800504c2c8704504c048400513a89aa14601aa0a7cb1c0d405aca0a10a0c50918128a5811536f0235461c8c7911e1ce0d181143cf053c30c898f0d3b6ed04184c2074ec0c10410f4e4902304051001cf0870242100097a7cb695a064a7486644820e03d841003ce82c09400f9809e8c3d346f801004722942007e90610369a8410442c0904213e18a2061130273845dc98c0e6c9557a19f141f1a2d8a52ecf235c4b688cc9b116c5a95d8a6cb72d6bdf8284952739d68e40ca40664c2a5e29a77841fd9e12d7c664b1964da498cf70f4f492b831f2c8a6bb8c69a92ac71a1253198c3d76c41cf3e7c7723ef2f09ff3c30050b11e966b71d4aa38c9b186822bd9458eb5295b324ff401a3eca74e9556e67ee6542a388a52b691630d8a52eea4f5ac5c27eb394df1e8ed5fa824531ca777c4954db79357dcc3d25dacc08db52a5672bc418e35a6a7dcb527341d3bbe62bd2bb75f86034b7b566e638fcaf5f777afcac5d13efd93caf52464124bf4d3cc62717032266a67632e2f88cc3d33f27853aec4a10c0a0a07548e178bc564efc48be986b13c71b46cb26003e4b6cc93722f123794f5e0689fe7a66dacc5c6eb520b8e77c4961a5c4038410828b821a3a25cfa2753900209051450586fe9f6e3982d9bef45795997d8e5bde019858e140398422655021538aa2880153d53277cd141e553fba9e2a1021f607e5c01240c10162c6411640542ac0e20a6853108a8645c90655e60010c2d086138cf636aeded2fde369fc58e6eb1b5a6cc946e30978b524aa90bc75af8c228a595d20bb3c9b1668586951939bccf6189fdc3bd3f84fd0ff7e1623f3ac61fb4078a3de86cf3319b476de5b881132c7225b32712ddfca853edf4e2863757b0b9b861f532d97f4a20c75aeaa2f41cf70b6ddf5f94db733c5fbed0fc29dbe3fc84f8c79756ba9747c68db0fe0685e6b73728d43f7f3afe92b88dbb25bd97562c336cdb74747272623118b8dffe050e47e7eeadb5e3c77c837a423da4651ab97a3e65b3d2daef8e1b476a46b70d911f5f487eb47fabfc986f0889399499cb8adf439d1d47f3f674c3dcdf4840bf3f0cb531f73d54cc71f19bfa37dc34fd0af4c6b83784c4bc09714f7f466fc35f12d7b6fb9c73dbb68de3388ea394524a37b06e75ab5bddea56b7ea7963dcf06697b761216ebb3184fb8dc3b1bd172290ff1681b05ff94e7cbff21da022e9d352e1c2588de96ef7adcd18010022e4dcb011420c840f6a5026706e6ceeebf36ce76a551c74518ae92aa2a2182762969ac440cd39b74d4c0a28a5b55a6d214131561bd30d17524c0e5a8c0dc49091fbe7189a8f79927b4cd298257ad5f5e4ea98aa315359c2c66ce99f498063ae72acbbddadb0c67cb16d1bc78d5953c788516bad2d578d8c128d8c159930b11a1927325932262719ac3248639ea891f15223b345a78cd1f77ddfeb2546aaccd295f6624323c3faabaa2823da4d8a2939f5ac91653d9a18d6bdaa564056575868b2d6e4182b6572828a929a2007540394112d49c96902492c29235a921293934bc5aa6a27d8406de5b3ea3bde6365d5f5db70d3c4fe53a68b3aee83c3ff7ce073103dcf0d4f001b7e07c99b80420d1fd68c82073eac9947073ebc99c7479fadf03ff0479f09e0753efa8c841f80ecc8b7c0813fc047211f1330f40a005f8e20c28d6f269f0101fafcd1672cbc013efa2cc807d97819fb0026f432ac19011f11b0810f6fd6c087352fe0e30232f017c0c0d707bc033efa6c7b89f3d2e6e5fdfbccbe7455ee81f80c021f8197e1a3cf26f012f8e8330afc0cf5de58ec5f26ebf1194194350d5f71c061bd1fc0e18d11e130f637e0f06536e050961b09fef199b4aa013b53f5000e6b0798b2ac1cc0613d82c39b3b69086331f94ebf516e28dfe9bf1bc0e1d54057f94e7f0630067058e92c85137a0a80a38456d365585901d10036adf01af05963359a2523a2ac652408e03b96844593581b100d6013909fc1676ee44ebe6325caa6c8353ef3aa24997b14945c338168009b86b895abc0c3809ff3a1ccaf62006807a2016c7ae185d4e033211bdf213c085e86ab61626a201ac0a607bc067ce658bed3ef68eef7bbe0b39ba56904949030d650128806b009023f83cfa6919019655de53349fb99246b6a69009b2af0425cfe3082e8239162037c66ffc3efa6f93480addc583ed3f13bbebfb37c36fb4ee17b7cfb7815be57f87e67f219906fa0ef77289fb1f041bedfa57c26f43dc46744be8bf8ccc8f73b1a9fb9f0fdc2370cdf317cffa4f98c01df3f937cd680ef077c476002df1f93463e9bdf15780b5c0087310b80d777e45700acbe13af220046df910143007c00187dc701b8012003c018c0e83b0bc03080d17714805f00a3ef2400bb004a26b9e600f28780d17784602110ca690530face0fac02e803ec0146dfe1815300a3effce019187dc707ef004f00a3ef98807bc0e83b39240fc60146df2180fc12c0e83b3bf265200960f49d01600180d177747000c05e6334020e9b2602be816d80b2aac695a449d0821d28ebf99113c90c796832358e0128c2716fd909c0345fe3be26de239326bb17bc90ccee11cb82a64ef482364f48e6c84d8ef3965cfdcc74512774a9ecdf115d20777777777777f7766aa828a92aab989555e59a6b14a37d924ca999a2aad4ad8a59fd15169a1e2899d333c5946e5228694a4655d5ea5ec5b01e8d2cabadd6c87ebe27e61f6bbd3716fbdf7ab302c2e1f6739fe44ccee44eeee450515152525557585868d064adc931464f62727282828a8ab1adfa4aa2c9ca5ab3c6c888464b4a52ca51a999a2a4a4aaaaacacaeaeb0b0d0441919d168324929c7186f2c56a01fac8ae666c5d6fc4ff6f08702d5d04c33667140d2c937e9b401492c8faa52b72a66f5575858593e56e6b032502bb9923b51bb811374a0b6729acfb27ad0c8b0fe2a66756f8ddd8fc95e76b57e14377138745a0672690210adec54765b6ecb31f2c88f3f6d6239af5375626e5baddb3e12cbed5c5ed0965d2624666fb9be18b918e934195d87e6c639e794f2c66a8f0eaaa79e59a43dfa13e49e8244fa670e594e1c4a90c873923cf1742b6094c024d5acb2a674af186c4ee539e77c8991c8347a54a3bc2d61459ab6424d5b81464f2de929a49e228284dc04b0b37bce39e79cf3755c98771ebbbf3049eec8459e6e22cfdbd431b79715b743279525a5d6482a8c84a8a0c51c31474f62796d6409dc9eb31dffddc26e9bd0dc604f577ecb26bc13e4ccc3210fdf725ab6e578411b7d2ec8cccdfdb66db44747fbfcf86f1fb322296f9f13fac8dddd68fd8deeed5b7c438783ccecc248641a4166aeb5bacfecfe91a8e98c3cd37bba1c969a6468d3969d7cd9436211620e7fc7fee1cccdcd798b6459469883715b8b1fdcfba03d10f7619d3f71134d06c4e1b0cbee52586577d9f2299d61d1cc9df484364aa97c29bdd69ce738ac13dec8827cdba1dd6d80b54b7c67639bc8d37f25be2d859ccd2961d726f23812d27dca294be81bbf57a2eaa804edd9a962c86846000008004316000028100a874422b1200ae334d4b50314000e758a4c624a9a4b8391388691288471d220408821600c008088cc9038005f861e700cee871f8a3f0ba43a2789f8aef0dd6dfa5ca2089ef636b7960e2a9f6797c81a0f9d09f0d6c04b801862505e3aa2e4531f8e9d50fb9c98ee40df3950850fa8ff6f5ec8628918e0ea4d4428954177b722d282354d5c7cae625514c64d46424f5af238b1dcd2c231cc1b549b8c8c4db90817089061c203dfd220445f2029cae1a05f5517225b2aa81909cea65cc04cd078f0aa1a8f8001c1e284828a6f6bd43313b790e0f8e706dae1b43e2d230b2f941cc9ac645dd47251166cf80824867385ac43f4eced2c0e1b0adf3ffccdc510f7c55bc939984560018239205919153858b419e5c7328f94ada6a2835dc9b10204f6328d919aa42c54f46108a6a8c3b2350f8dd2fef06988de19f6ad2c7e0ac748228e386b6144ed67adeefbba183f807411d3014672c98f0e884059c4c19e08f6eac41bd30a32bcfba1af16ef01e3fbe9bc75e34f08b962d39e3c30759ff90557b2959f84ededbc171e619f16da87fba9d3ae5121d50cb3124db817216984f1f29abe7bcac44db59d8ca01ceba2afae66f8fc0b089653107cb07e225fa949414143ec882a718760e1e926e01370586375efa94ad9a39e383c617fddaa4d7e7ea49dde6c8321e0b1db234d1cd50ca2525ba3493863caca091335a508ffcaa8f8491c2922db3549bd27c1581959bf406d507afbeab520a7a6535ea12f5b4cade65ab1039647ed9ef3422a8aed82c880b29142857eb4f84460f1f1aa97c551f4df6890ad0cb687c94fa516adf48abd3ee322aff6074d0afdeb1d173f401189e2f3272bf0bad59333da1b80f65f4c9ae4d59a1c02c9b0c1bd4c1bf265c3964a82df13569cf39845c06ecf8e48a10a1ef1178bb246e014b100134cffc81a145b5bce9469b8c9c7689f603a138e2bc756d1884903a72aa7489a99580e7ab2943ed0b76ca0946fc3e86b77ec72b2c6dab789a776932b1f6e249795b3286b4abefeaf5c55e5a468604ff73c813c82d6addfa33db8932d9c29fbc7dd7e324d444843061651178be7987ab92e2275e13f174b339bac8efd2e7614c0d27c36f8e4adf9f6836041ac9881387c8168ff491f7a6c4eef5d6c27f6482c179f43ee808b6bc1415f6fff62cfc82458c35ae844189b92af98e2c92439ee2cfcbf9a43370cfe2b0ddbfc99a4c605c709516e1d16187977007831ba2d5de326d8a658469083d69b62c52a70aaf46380a8859c01c72435660321683b7040ff335e8ede8375e7b349af7d8b8e94ddbd6b240e83449805b95be309f0d47018eb474a09105a200920576d7e20181361059e1f5d2c6016105a000190f2022b1044a554f40c13d7d4d821e80fbe82151a814d9d679252cacf8986d1a7c689f54495930b4a11677baa3aa996a8246460f2236a4313afb9efbec8ff2d4be7acc1780e1b9fe13c049c41892edc6b371c3c36bc2ba7893c51053335cef9886736f3817d95ef88be5a3204f325bb0e7e26856cf3de023c47e3d11ce6cef527364cfea0c60ed8136d3405a1a3cc647a3f4ba4c10c90e40e6c3eaa5873c66b3fc5c8662b06284396de67f13dacdfcbd2fb92d58f49d6a699676899628fc61bbe610ee7eabd047369229201eb77b2f02eabefb0fa4e56efdb1ae1b69942a833c80b7fdcdaff33ae3554536498057b1a74c3aaf16b80cf360574a58d55813ea4342c0f005d476a00e493d83ad43500563b4e337955fbb3944340e86a410c4128ee025936c9a9a17885e444e602e53e6c2d5eec170c4b283c7c6ea2350d2a47a238d33cba16e572a0a237f1934777acdac4106206d0e1a124df921280777dbecb714d9d712dfbe52e94df5d77ce3d294507b9f76000832f8720dad95d838ab3544715472346bfa97174e4c881636766adc72851f277c700a2de7d5f23f03847221bb6ece748c0c57aa2c0ff9ac70f1573a69f4fd95576403f74f250b791d32f90dbd01e45b8ba745f8c186692faafe3faeedb6c2772f6ebbf405e396deabfd99ea5ec93a04710450b38047da16b961189f68d6f8a1f11190b9350fc214512a7a047a2690a5e6e82436d21dfcf9ce69e24c3d5984287cf6b14e3692d14990128df0ede624ccf573599140b34befbbcf4688631dea56da1f0216c8eb7fa7863b78abbb269adecc9a0c307b40fd228d5f5437b033c34b96a5de8aa4832a5b370a93ff5cb6357b3ec99fd9a4f4ca1c17524c42f3e77dcacfb4f2ac04d83177d06a441c813676a533b7eba893f8b7921f232e0cf7d4e96af624d3ddb3c0a2cc33421b21ed1a01c7c49e75370ac052dd48889c8e0d9bf09ee3c9952c04d3d2cdfb7296bd48554b9ee7416b9fc3d5fc727d8d7b2d553939b4196ec886fa03834a03ce5a36917ff36c31d3137ef59012670bba939f226fbf0cd24be0e508b020f50df45b1a6c84e0e10896703c812b6fedf60b0b231620f2e2462ef721e101fcba1142f29650281a46d2f857bc460053d7a5d88e44228347f0dfe7eebc672f106ebe978e21bf9c2714f43b215919d57cd7070bc381becc799972d46769e0e3cb539a818b0d387804602494fa7cd6442266308a61ee7f24bb093035eac99df9eb3da458ed24c5176be1bc12a2184c8f0283d181ef0bded73092036593e3083b8fb0bce674a976dd1623ffaa88dfb3630bb130bcd818afdac4f95dc8c853bcef7d01c2eee025356c3cdd4c430eda5160ec6b4ccaac3ad84dd0c97eb67bafcea070e4cfd28653edb4d1f4bba5767fb49550d70a77ea813d3f6b55f4e59392081c71d58909b588adbbfbdcd27359bc532d781711b9e433f16020ad63fbbf4a48c091a5b003bc6ff053701d6efc73c99860adaa0b9c5b7b0c4dfd599c68920a9393c65b58f6ed180a43eb483539e7b08059cdbc9eed11b3d7d19186e5e46ea29649dfa9a2715a8282fc4d1fffd2215591abad3fcadd3b3d08262ba96e1f8d29a886be79c02e6d2f9e2c1dcb6d89190dfec0d564a4a5353bbce4878952cfc9ada48f6200985d4f180705d5c47b4b1dc8b62bf053694858f0491bee53c76c4cfe79a6a5ea0a39ba08e593f78da54c3f0505615f918fc109cc47cfc72022b8e043a82c247c210f63764df44cffd70da82be9e95408587da8e696c8fbe9468fab39ec5993a1c317e3757c5ca7e5d34f92f5cdc499e6329427745e603f31bc4ac0128e2194a2010e2158aa6e330b576e2d3c9cfdb51590e5a28849caf6a5988d33a4296eb0eb43a7a17268d87045f21429f61fe9e0ad12448b73ee2b1f1247a8e103abff60d151b649d7f2cd78259b4be1090b413e440ddd8610ea7d598d2e6216a61dc9b4b12adcbab80fc816f55d28e1b616c3494e6ce774df1d72ed3362d74eba34ffa1131537048132b93f5ca4f7fbc3699e1e79be61f716451209182c8368505bf0070a7920c880adb077305b47fe9b9a98a796392ad4329ce030a06700579652797355a2a0f2036d4aaeb2cab18f1b8ca23b9c59a1275bfb5f7ae3c6f2fe14d15f4b830bc5656b1a8ce1728da5f25ec0113842a7577310c7942b498c2e0d045c8381fa674f1e461866638377aac63507a9330620f67ec91a18dfefdf09e7487d4535e030fb0fef9cd4f22e6e687012413019300cd204db4dd0fd43c65ea45b701fae7a935ce562153ba0c7d64430154c464a3dfffabb714eea579353a7776e8c9d3f981fe816d58f20e5aad6bb45271766472365719ba311cce4e659f5258d4b47fc1d7d0018a832dbd0320804e9d68077958cd05c670c6b11f8443110d0de2b612525e9421b468c92ba0073a0409c10b7a6814bae9987a95789d51786e693d1c1ca2b71eed46f1036cc93b4036b6120e0ed113d596d046476c19fae49dc9db2b0787772377d951b48e109d694c70e80e48f3f1ea96450b76668397de674237a87313571f63d990e85c4806997c62bd521442ce14b1286f160c1f5395d0dcd94b68ba6d761decc60d94b612d64d28adb7435be773a330ffdd28dcb682f3e6eaecad8a95ece65c2b0683509b26dc045e8236b4199d10f99d51ffcd25e301677fd204449369d7493dc1370c67f5bd142989b17bf9a1137b7feea098f1e4b9e81fa0cd7daec4411c2d9c38426742ade496117e9ea4b7c53966559a951d79f799606780f4df47541cfcb8d81bb48768a9b735a2023bb7d66bc320b023434cbeef1a00a38171714a3a93da9de130a1c9d993a04b0c0024438f3fcc7cf5b2808dc7170326f6669a9f036cb04f84b37f67320356fe932b4504d927360351b6a97649921b32d4cb54f63d5a10b6495d1ad81ca21978110de10299203974fe2a03ba9108cb1704381a2d6fa9f878a9e7e0c21b04829b65285ed8ffe8149990375c668286479247e196fcdcb1765a226dd566405662f1869d50b5ae412ad52143180713bd08611a827a8ede82c921350a13e46de44da396c82e15a97be68eb4a0d3f120a2cc32beea86dddddd977d8fb33d5be0d5dc717efd20f2ecc23190eb9d9b8ed9f4378c6bc48d462a657f41769499998970ffafe3fd90c07c6071fc719c1d885503655e07034a82a1eb3225da0dd69d7e5262f59a5e92224d41e8c1a304d04281d60f863f3c2d374546475dd3dd1aad95d82ec1bfc4f104b1b47a0e03a0e2653791d410851ab13b0a0d6b6321c8beb6713fa50a36d89f5c172f1c8d68a522a5991b7b4b108468abf282d398de0060d8ddb83ac3940a637db22d3132859f99b69da34765a9e54c5ffa98acd50557d884ee4fd195dadd753789e48348b87b2073ba42f1fec6bfb5bbe8ddc0ba5bebbd2bc8295063cc2c3a0a7d3e6006e27c4883e0cde4c93890de3781321e826fae7fcaf9671e7d1cced2fc73aaf4170327c21fb211b4e9f31e93c0c33e53d9855224e59a65cdc9b0209350e30ca03db0fbb450c14f0bd5abf7858638ff8cffe11443e1dcaf5ab2c061d81c7d207a215373448acc41f6462e12f72706954515b3412493b3ba5d89bfcc5a1ecfa3cd1247c81690e88b23bd78e1a11747325726f4cac5da3ea3efad161551938faa9de1972ae4b112c7c8134316a4a1d7361c5f170c11dcc3a840b56859507528a36de6f215bc3055c7e5d97d9e367aa3cc1500a5a7a2be792014b28308a69ef3b1131544a7c6153aba4b6231b0246b0d5bd9f09600fe434ba4e19681794948033bfda5175f5bc88021bf134c309b06445071732a6e0e0b6305a2e9b3ec67201d9c66c8b8c5e2a0d4a30048b30fdbc3a01fd03ee907f9bed0cb1e71e11d09c16d7dca7eb5c7a715656f5bf3dba97754a859bbaafaee343136c1a9aa221a533054260eb257593d94adbdcda08f6983def516461494027cf99f85f6d13a5eb38b2b242516f07d380a10f691faca39aec4d386b365d457ba84d4c575c0be9d1e133db0ff5dbf404b41a880efb7061c23b124654ee94aa848907aeafa5fba7892c5a803ece4a80c6b7ae1fe5e0dc7813802d16a06ecac75c8419f840ba4da70e02085ef930449da7436112cd4a2f4185bb430d0908c140c2482b986215252cb88226f439fd2f996d110185e0ff1211277b50910d619e112d1ab6daebfe51d381dac64e9345c7d79607877dab83aa8ab16da096ca0babce3e69009e20fa6e4695c757dfc1487aedc861045c961f1080afc8907534e8d808e16016f4310f9760028ca096e18e6f22ef4d2d41c2d0e35d13e0853cc88f1b6e86841a3a07d078da62ff385a77cd0aedd1caa0d031afb8231e9fb3522d7f51462e3a3f2ee056d5abcbf699d930ef3db9e188028714bf2d95283c45f9f21918347a3c9b19aebb31298a3bfdfe0e3ba3d13f5425c0eaa4048b1c1b06fa788910fbb1c2e2c3ddbca4d2937563da24064dc45f2b682d25605469870ec824104d357003e516eccf7014c3017b4c07663d3419cd0bdbfb856ecce32fec85d16e12e7115523b56b1023f460b7d70c4ab40c89fd8dd41f0dda9e8213a096368d25e39c1e036b5a33f20a6e75517aeb87439d7b909bdb52db0161e98caf4e6ac710402e7d1cb07257e61df0e6ec2c0607a66c4d3088621dcb6183093f56e112be2803ba7367270ed2e1aae7c11c1a223c47969288ad3c1f16e913da5ae08400a01ffff5558e7275ed225862f10b6dc10c5d427251b9583b2b24c2df45f194501828558c0aab2e855694a9413d1af43aafcbd592dee5841013033123dd6cbc807245672cf88e9d205d10c1082f7c6bd7947db881a4142445e723a8e1fd123bd14965831c91d4e2c712a8e4b94eb94927e33f18386f6f7ec659bafe0b0e312f0983fa339211bc41e08d750ffe915c950b7a5fabd0c6bdfbfc764d25ee1b30bc3b0a65081fd29e303c3794d4efc490602ff5bffa7da1c6197df8cc350223deed4b351bb07dacb086b7c420acfecbb3125abbfb41b9c5d638f8338f3a825cba5bdfbd01bbfddf6dbe2caa2b1b022e733c62d03c811baa76736399bf7cde719c5bdc5b3c76f0cb8c13a47da995b1361788c366e2289ee14a4805240340cd9497e3a77b876d0ee6a1700b0ee7fc8d22ac23014934a171821484e620ef5ba6e983086d460d5077ae128a27215b945188cc1d464ce625934ee25f1b515eb9408d33a2ac7815b44e13caee848a6e044dd68395938bb9c7955505ceac504740aaa43361eaffc15cd9bd4a3ed0782d3cb3270ca438b56e1a0e4091ec77df6679341f49e27353c02d93469584768ab7980b1b06e3237c6c308cee99b8811c1278ed29841bea98620b438b535446fb632d289c4894421840cf9a22b508e77ea6c21dd9174e277d9ca372f657632d042d5dd8e72397a035ec0748fd11eceab048fe353027f772d8bef15e4fcc0712135cd5d96b83bc199ef6dfddb78e933b6c9bf5ce5f04d1bef614e762f88dcca331220eaf720411dca3f9fa1a9039cb6314766dbf1345998745e22ff4a688db33f53ebd8c34e3729274378c14376ed7ee781862f015e1c961e3b689ea61418b604dab66a10b89bd75132463891e8991c85d0468b705c28e8a6a5462356b2a295fe5be32c23db87f3f2be7500b6de4f1a478984dd12a8e492a82f0373934ec343e42c4d00b856d42acc510bc9f77161b6c09570ff0f03f4dd18ef97ccc0995a0be00bef587a7e5eb6aff31009b5cc1cda25a5bf2c86c8baac1b9398bc18c43931476dd0dc55671b2c1408ae97e09f17b4f237322b1c31e8921cce1ed205a66e8a35ca35222b1dcc6dbb49ef967ecbc470014276bac0ca3a4d83dcde96a6d465eb6cec21a6ff88d39fafb77d18c5eb014e173e35556c79daab90a5467b5f5dd275f33d459808a19726a7e93dc070a5e8b6b05d750bfe251f624f8fd51ac2118585eba9ff8e49e4d4b50ad73ee2e1a1f7e57302997bf4a812a188779d8b3369dff2e3b451398132dfe81ed9f4dadaef3dbd3686363820c8e304e6d383fc256cc004895e453aad3b64ca32c0f82dfcbb396552181ca4dbe2f7ab9bf9dc9c5578e2ec594dfaee2c35c436bb6420c6f41175b988c496dbed4f361afee92cbf247baef0e4760a08a4da1a8d32298d52eafeb1eb10dc773e368d08e05f035e732245fc97826d8a967ca93f9c61139987cbb9f2b0b82e974d38b880e84a66d0437ec89e2e32dd25ab87019687a332a5abb203165257731ac445fa0adfcd908f3d8635a18f0b91da21a8369236f546fe3260e5b6364b6ce324b8ae3bc9490578fb6b2acd801cf07282742cce3e79aaa632112d625d3366ff3a84ce86666a25a95c2a501c7a5a814f37cdc719a8fed4bd82c5d2b22a61644eac33798cd26e1ec1da05a74fe6135126053f6da48b8a50f7610392b9f01328728005036abf5a5689bf74ea5d083792b7e19d452ef561eda0b3e5323aa91df1a7ac5ab794ca0c65aaf8c273a007ee27144a96c96ecc12abc33536632e0b0fe744296758aac06302765c98d404086ad9a3fbe97c7fb488c4e738d4287439b7c68a7d95f098178b54ffc7a76cf0833dea1915ba3c6303061c15a751521ce899900ce06de80fda5cbaee3138631e4038d7d5cf482c141b9b8d2f689ab3e1af144922cd82d8dec408132460871ff34ce121cf8d638eec92d3ab3405171bb19ab5d5324f2ecfe2613026d5419cf95ec75a0a22a7b7152324d8d3a3649da5550212f30f6268b2352294b40a7516b633bd98134c1ad63ab1062deb73bb5c1193abe08127af1eac7855b712960d9c09de5805640b6e7b47e768f57d0fd2322e1f2f8b07c6ade5e8c677b7a9f86a37d50a139733ef245538b6fc623dbe3689324adb9c4ea3070ae3700c0e56fdb1c875ea13c73074024deb62bf670c302e96056d935dac9bd68bdfe00238800082570e731b58eaefbacc0c1a3c84a237b1bed22cc5932752ec5cb0780b012d2a3a21a34d5d6813468115c1e588f4cd22b7b618b4f7007a1a3e99798b33b4a220f1a6a28ed6f6e7d5b15e95a9ac3a4df3037d2291534cf6c83df8b83aee612592b713d8944ab597fbf574e6d8d97cedddadb7cd27b77691eae522ae2b75cf12cd26d5d39eea71d8fb29a3a4e0e6f746ccb985ce7d2b17a9b881cdcd86522fa7aabd9b54326b92e3c1ed2273bf9175bc8a3e91f5c1112f80cc5c474a0a135d965ef89686eb1071ea8f8b67ee86fe3c71121b214923f3d1bb1eb4a471d4f6c6c0bbb8c2a41cc27a779e74826cb841f4363c142ab1d5ef1cd71556d4839f1d7cf61a1f6fecff23d1e0dc4ebec8bc512bba43b98f3fc9b954fe947a4e4f30888d838972acde132e823fc906af13a70238773f3cb64d9025471b44826b28d465877ece1d72340730bc32d3e44d0666c74cd7acca2576faeb92d81f7f3633bb320dc0abf850b7828bcb12f1818051679227b8397d5eaf56e9d467f6df75c5b29dfc9f4afa221a0e5a6315e391c45317e54ce0db0b38a8b7bd9157a162481e1a83ce4bb36e9f91b318b5f76438e41bd4ab1df140e28da16b1f0f7ce00656604b60103bf0e543fee6be1b44744a0cc3a785f065d53128247fd207ff5e0764e8c6ee3442f900e97c52fff86b071419cb27e82d92ca402398385734c614ac3c4a745c3cf949fce4d9e9eb33c184c907801ee926fdf2f82e14237063b753278cc1cc9db7398981a8078a6912f2682b72d8ba9bf8c3bbdbae5c5f67a6687322c48ed820df8207a410d3127db35a336459e359faa753db8e9b64e5a74fbc0bbd68f3ecc8b7491f168b3ea438a0af205371656c90a877d7cbf3451a53d94dd588b0a0ab05d51d4387054bfda51069cd586b2574fca791e29149107198a3e69698f4961804ea4fb19af6ce30f1bbd6dabc692ddc1daaa301054e3f0b31ff36dbb3e068b479c65dd2960ac45ceef27bbe0e37ba6019fb0265e28cbe735d600b1a25dc2af0a02a5e417cfbd54b2b7b88b416a1825da8ca2ef8c18afd6033181d6990b129d935da670e4a8817523f85786f4177626d3614a1875e468b4e80c451f629113d7ca44f5dfcc17cca44e90703cab826a9c2d251e90b8d09fb92749d9022e6a9767d0994543e0153907971ceff3d2b5547dd5490b4c24541adc885356009de8b73e5f8d12b0768d07e9e8a9368df7063a1380f26faeb4594d7482c2536151089581320f31d61502ec3b76bbc23aadd71124d401468b77936d5141a60237ab74f1a059a4fc292c8cb49542d62641b51f9517f4e4b4205e35d479ea34c1c2549fbe22ae6e3e75cf0f07b5f0fec0cf7a3ac3a57e52ae61a6584be59630dc200548f58df5e506b91596ad1df5d59ddd1de60048f5d86deabf15c46d4c13a0f486c5e59051faba03c337a31560f7942faaae7f06e481de3b5bb95cc80b59cbb130a26d2e9fee922483e803c0524de8deb2079501f82126180515bc71a4da9fe05c8c889e0ac67c1900427fe4722e0e83153d09b7ce233b505ccd6407ef8a09c0150229f509aa9cadabe2d73afb491882278e6457c27dfb29f13b000b9f59b1f7775d4b2dde9b3b768df06bef38862d00f78c6a0027efcb4ea8df180a9cabbddb8a07a1f90db02c220ed5ce07337a94159c9ad0acaabf97cfc18c6a76948c5124533c89653f1e1b7ebefc6fc4194d115edad4a8e000282d4e822c388b0e6e008d6b9502950dc6e1cd65ed65cb168301c7a94650e1d75b8ba8f89d4920aefdaa7aa0216bb9e72273e7b2309094b766cb359cd5f4125f05f640e407bdc6fc46d715118f0377b5d8db104a80fbda851a3f5878e9738155adf2950c79d31ecaae9818bcf9094ff0310ffc04992b2897ddf7bca4ec544e2c3a898533dc05749b51959c46b94930f788c2ca3f1dd8bb8f3b9988a148d049c4a0bf9c0d779a6349aede8ef6933a66a60169e6963f9104d59e9ce3104d8a553aa82ddec1aadb2eb71392e8e13edbf8e4acae1c3434cb8c2d05165696f0b137445e1b1617abe13c593b175a24fea72a5bc9ded8ab9bcf581d933cf3384a9e87111e6e538aed7207a225e2c2e7ab38392dd88dedc2b36c1f7d612bbb63581dffa3fe24c37819d9c891b1fceb4b8a6623040a60965a16b6d33ad036b83a00f4d89fa8794e099fb588c8400e5c3689d546d21298f226860942dc832f26a9f35e719ae6c7a989ae241c1060d8f7ed01153cae2730d26ab4dbdc93bf4497a7a1197b540918d821f399c920ae80933af719ad454a1898439b830f0667ca31a0bd1798550e26c0520b12fa6417cb9ea2ec7b3f89c9dddf220c642578a4c0c8bd328247802e7aa546b87dd0c213b0ef5c18c537627efbddc83039dc0292ce94c9567b70d10034cc9554de049f50ad622be8da5116236a3fef933b2e26eefe02e606de55e62d4636bb17a85a207e01d0cb76bc05a6bc67b37eaab60101be05d8432d71253411cf80909058cda4fa143911f511dcf43c556f48a4a835b69e938a75838b2113345751048f62bad13aebb577d09762bef151e47ec318e9f373a41ff0a6672b983ee2df804ddbe7b7ffe6d9baf334e9061b701744d789b409a04e4ac9379a2d66103c1b2fae2575c83af2c051a59b37178c52090e6a92aa784a009109f3fb693240c4cb2dc6ddd83338a4a5f3074f1058fd4444e6c1aa10542f0dfa569f0eab6eb9f9c335f3674810ef421f582377eea602c81f5f531bf349da34176c92f0c170cca68b05958f120934ac262141b29a236a956ac945c2c9f91eed6500298c301ab7c8a0c0ef6de6b17d3ce01515f34d905e2fe8cf9ab8f007d539287ef969434c069006614f40c1b7a4597149093efb00deb33109f83b7b80f5ed7b10e2891017ecf67fa1d52e46a1e349e4b8eb8e2988f6e58c8fe5d5f83dc5657738255b90325e7ae688fccc6a6905803395e595d829954501406580d864502dcca92ab82eba3a8cc15246b589465b045e6d1c26d870e4bdaf6093f1fbc8ac06fd9e9c4c1c57e1a8a3ef21047ec7a2a7672135b784218b139020af0bb11055dacd2e6008bc94538586d225e4407f0a59222df705eedff0dae5c99b9440fe43254fb9012186027cb897a332c5a2670b441ede609d043b96504ad521129567300880711173cf9158aee63e4244dc85a756e601e2a9bbdc8b835df55ca336275ec0a46bd57e004154250d71b7d0a5af7bdf764a402bbb7a04ad60f109534c4c7a78e7dbf104253e6e5b67b21270d8188c216bdfa3e0c9068fb4febf64fd77dfae09cd941f944e829a4cbec44e920b90897ada103f76ef47de654fa97ead79161fdf3014fb00346b68c587d838cb363f82f359872f656fc29339d0984fdf4fb1524fd7398d97fb6126bfddb1265e92c746c011cc103f80484a23882d12020b78ef8ce56d9899602d00c5ee29747921b64b51376891dfa61e7349d618a836430fe93dab42796dec1f00ac51ddad59cd29f09496e28b178022a3f3eee7a6df7ff8effe8d816d9278f2548d0d896915d44e7a47a20cf8371496afa8131cd3b362f65140561c1d3d59c69e8edb33a1f82006af64deaca55baa410c601263e85bee9a1df45a91a75f0aa9fd986f458278ebd534f8e97b46f1dac3de888e6b0d64c9211d3e4d8d92f5acfabd0e1899ef580c659585ef4a8981c2f0469e094cc4136147791daf2169e8f49e1243730fa605b11f30beec31c3e4f38e7eb43b0839f833e0c6fe382e6f90181f10fae4663e8551fbff34258e2de6234cbe3e093052fa10509f7eb9796ebe3a32ee950d86a4a570d2ea48355dfaad4fd5750d317f78d2494a0595d850b4c076d14c1b835785b6fa3c9267420b7e495740b4d82f16998ef8f426fa09c0b217c53eec5196201ca16e3feed85b7faf8e65bdf61050512156d546cc5016c4e95805de896d876d29dc7183d2b85ea2ad2689b1938b6555ffd4bba9e61087bee70f21e29e07667543c2af980e0216876f1ed8e9f64c81f96a463dbc998d9207f1939dc489b8d9e8c5d829eaff756c5e0e859226c7aeeb5abd70014cd1a68bccfba00f2539253e5c52676294c28967b614ddf438bd5e12fab8bf5f7bd9e0241eef25426aa03b4d9907939ff0e6f904359d5b5b523cbedf1f446c48827958813775d5687e7e90311339255284ddef6980e3de797086cdc44593861ef64707a9e3c51b1e25905e1c4ad97d1e17ff842628ca50a0a939bbd5d4306f2b52b6b4796d3e3e18912134f5592272ebaac2edec337246e24a95498b8ecb03afa8e5f51d88889b2e4c4da97e1f63c78236244934ac4a9ab3eabc3f3f0858a19c92b9426177b4c879ee34b043e6aa62c9cb0f6b2383dcf9ea898c8ac8270e2d2cbe8f23e7d213146722585c9dd0edbd1e3fc08889798211a2b709a4b2f41e85c3a002307a8560162a7e5ae1075dc8e00c1a1148b8031d39237c85a2e67013c473d2ef11e60d8e8c547fd425824c405730b2641acb3f029e6983adb494a3a87b47c893912e549e424912b658e74ae52f9127348e695922b319f645e899c527324e694c82b314f725ea95c0973a4f34c12e33fe19e0f6a44ae7f6202bce86f2629d3d1b9268d715331433bbce7d507d6db4873bec344365850c314ad21fb64333f843554396cdf8e4f9bb022dc6b1279f6cc09083fa2eff7de2c17680a9dd1b2f442811060f16c1725c55ed5e51931357d4e489d67ec2f19228441772cce083b6370f16f61c2512676442e37e5a78ed45a80f3876eac07d1c21e49f2df86dcd9d921e2b5a550ab63d65ea69d27019cfbff86460a04dc6a6566376c9db9fa4260051a89522f8d084c346ee5e41e1bbf5ebe56c27bdee0d754913d408a6dd1e82d4dcf95fb440766418794741e3aaa7967a7a846d4ae29eb8ce73df30ecd077a3f6042470752603447ac787a643e6c0ceb9be6527069ad5e42522ca19c4c0c76a1856d372fc0d65541ce3007b0db447db7b102830f343fc37e25d8091daeff45a8d6c686ed408661a78d78eb23d87a1a416abb3b5166054c2f279533ab6789bba2662e141f48639c9497ad882a340a276cc98e8bedc4ce528179aa83384642356ee9daf08a037f54d8862f930abead453cf10c0778a8d7ba81a2e13cfb0cdb6fe15eb0e9ff7645b05cd0af21d19dc3e4edd9dc065218dc9af1a9eab57500b3f487dabed62d5cebb4978f48a3369ad46d08d51214dda45944eda99bfec573f187b92e80835a9eafd0cda8fe8504c6905ee6cc721ba561b59fc20d0aa3055d470516eea7112f32bf1c00906c87ce8382f923634fd525dda6bc7f0e315324a72672f74b10d416044408109c1233e370aae63a8b3995943d2c22a2647cf4c379367841253d60731612a77c03480d1c5df7a8fffa93f66bdd182e30037343f7b9b705fc6095aee90db1bd3158b0e2beb55be94b0fc275b6a8c0b3142c3fd99181e9720d8d9a3b780508ec04793cd1d4554ab04b6ca87d9756b0d275f787b103cb1094883469d94a3175f83342602ea3d0c974000d66fbe446a40227966506ae51d3d7db5cbfe43034161e4018a2b1f24530719684f6853794ff9ad02b42d8db8f784088a9239f64354ad7395fa7239bd1bcd120a3ac419b0ed67c900d836c3858d3c1360ddeec608d83d93478a383350e6ad3a00d07d138c80683361d4cf3609b06df7490a67250fce3162843b60d5afedb3c0ce71186ad58b9aaa3a95622eb5a8bc631481b6c40c31b32903b8c15e8b49ea9e89034f393978f2730af80918044028c021811283ac008e0510122018c028c102012c808e04881a201460094513790c884da248d6d50c4d459a1c3f0ca07704ca392354a18dd4a85b16335a7d18b8760312226d4903a728b327385498edda0cab0abbaa3d1d58720582326684b38b24d2d4367b52ec38b0fc0314648d42865742b25e6ae158e06af9e82c4889e504b72c42d4a063b2a5d1a5c3f0a861d3181a6d4319b149975567518bcfa00126344528d52a3b7523176ec5ac78a2ee3179fc0628c48aa51627c430ae66e2b9cc65e3d82c4109d5083e4c82d944c3b55bb1a5c7c08863562827689639b14327556e830bcf2011cd3a8648d1246b75261ec58cd69f4e221588c880935a48edca2ccb4abd26132cac3fc4d0f4e84c0858c8887b1511e43d82106492353647073bb17ea9cae541ffb1982fb8d560ba05c2351502520f4911eeb654563c3a382a0a99f185207b408315dbe4e1d016dce2ff5ee15d2ca8632072f3e9fdd67b1927ac56b6aca5ecbd1f54cc67fdd4fd8abc0d1d8bdef5ac6aae99d5a2560b324bca20c22dc02b37b78db20d8f1aec0e563fd401bc43b1dea8bbd52f6676c0da03dd3cf28ba10ae2b84645984c770bfb637c5b94da9dbe0c4d84a3492682264f1df47e99d392dbdd0496f93a8a11f2b3502602d78ad99bba6f01d7dc23a4074f260289ebb62632097b16682ec3206c05ca7683ba5bef2a7d03fd0b2c9c8c4b41949883c1287b1b983e005e54c9a2226614c28095a4a3a24c62bc1a09ac7505620b15ee04790eee488217140cf94292eb9c9602b080f474804443c58bb8874027c7312a07fb7affe112f58ba92daea29770ac48a02c79eb13bf7229bf95b099d3c0e98a08d1c30572b5f7c99bee9f8ea883a1d7c05afaf36c61ec9882b63dad060f58c2fcad7363ee9dc71644ccd5b28bc99bd709a8de29c6c72b887b6ee07f430e40f29304c32d8cd788fdcca373097427c3431cc8ec44b1121604f4daccd31678fd4e9207e92598b0e61b749f1f114f7e151876f071828897a9eba8d7a00867a14b253c66a8886a5f865486e35d3da9234c37141b65a6404e503a0f8b2d2d01f3ada032542c8efdf1d2bbc8fef4a553e4eb6f70ea1aa84daa9d21524ecbde56c62c28f8f2d7aeff9a73e578311b84fe316d22d532ca4ac65d4882d2952a2184b47dc1615037a9a9ee36c22ae43ca4667a233a6026df0f1a859672162a95773e0dd233af8ea39d4e9d60f1ac386e4199983819b706957e5dc9938e5e6a2d22b3ae73e572d8433a956eba8a5b8a3ab19e2e8f3bd366890b0da0c88146a1d19c9d221461380f69640666b923951e9b87ae14ee72893fbdad2e8fc5f7b6d0a88253d91010745de495d9f4d177f0b2418a8dddfef7bc62e37a444a5037a234e771409bd517a82b84548fb9e3eaba1054e66350f762e922fe0b23e1c7a389e05907bc0b215903d741e14dbf4ed21ec3850ea2752cd55a310464bc78b6547c00e82051e92b99e793d027d8943df6ed35c2b1b00d987d13331f5436f7da1c2a4b5c0eafd9263a950231ecef56c8f1d21afeb0fd6b4891dbe7dd18b2c7c1bcb782e0e1bdfae8063d985792308137dca2e303444861ae6b47eca807a838cd96c90f5c12a56b0938d9ff7b7e029c1380218e7c637d3ebf41f4574c7fca911e92183b8c04873b20cc5d6bf3640c54378c008c5913da543a5857dafe07b7000ac728974d6c30a4f9883121df08967d347ca8cc00084dba0262c287837b3c1a096eca6b0543f0e9b7e0163a2e1e82ac38c37bb59304951b13a472215547937db766380e5420301c5d879a0aa4e2435565d21e814ab9d6a07b9cac591a2d9c0791f4c9cb595744664c85d9a6327d0880144bfea154480746d9bb0c9021c81d3d8440c7658bf79434179a5048ab8fff5ad04566c5026521d280779b62e23efd003c5cff0ea5cd9339618a7cec2347458d0b4671bd41bc6ab0dee46e6b81b50df8db8576746aa81baffbb1597ecb1bd02621edb62b3969d497b5ab907ccb3d81b6cc5265e3c7ecdbabbf310502c261a4ef0ae81e4be520e7d2929a5e0038f5d40971070020c7cb995a958ec4bc5048b5f985e999741d1e21edebfc7c35b1d5180bf882f8482202f57b11d95c6231432c1dcdff1082bd95577bc548a797879d709f449ffa6b3fb7b956d4fae0ff0a5780dbc97f33dad6f741c9a1457affcc98142f2535f14751724339351b055b25644f25a36c6a22b4112999db02f97d4158492c95467e499ba18934fe237ecb4989bc923947f6e4ffc73822a1ab3da8a939a10d6eab58488460e91c7c2a5d045cf9318f1d59780fbca554da9f60e0d8f12980549cec03af19ec6d443aaea0ff108226f344ffc5eeccabb4d59ac0e088c1124e2b93e80907f311ba7c8c39a240f15380612c0b3729e8c1dba8ae0a53e0303c4bb1694b429dccda04a461e3057f2a2457a32f64cf4c6493ee3b4c271a22126e2a5a0421caf86321a987dddf18e6c65e3deae815995c5558c10a9a031ee65bf46bb5946cdd57f212f0c45bab9ab0849cb82c668a424df1f16f12c4532c777aaec5d67e8a3cc69bcad0d1299b235d3e406b01e34a6e737a3dce2c84637ef1228dd641cd25c55207f5f248fed06b5acb176bbeddda0220e10591f222f3f1e9ab3502cc8687dfe6476a942d41c6b19a5648507d5a888190016486ec2031218f58fe9802d4b54250f28cec42cb71cee7ed580d383f381020bfcaab86429cb2fb884c412235d9e8534c9686b72d8e119b5024dfc356a7c429e9dd2be49eaa50013c5a2edde4ad40b10f4ec6e36bff4504565c32c04e194340d769b06ef44276242a73045f5bc9f28349bb7e879b3be732a4cbbcbf065590041a01e2273f4260a229e59cb10834b8024f9b75ef11fd54888454fa4b4dfb1f962b9ca62c0a90b94d12cebd1591d78433224d3ca771a032b52da2719b6e85c62b05d9975f0a9fc4528811723c4f236b4d8c7579ee6f489a384fe28e8fed0b69e21cc5a4721b5bfd1f0ea914c6fbb05076f340b7998051eef78a8debbd28859588bcc9f8118caa710d70651d5148376e8a6965a4cdfaf03b56a21afed2544b8ddf01a10a7fb60c10bf4845d4ff3aa5825aef9235275bffa7a44158d3e3a17db9290bc5ad68ccbe0c7115eea7d2a40b454a53d2475279e9bb4f324e3c009d05c68b3807bc749831c231b5989a9f8be451543f3ce06c2d1c4577a2d9fb01c135a994dc557b9ff8e2a7ebf339b536b6d62a5e4eb3bb14dad514e12503b9008d7a6dd4205d84ce4f28e83ea0f42a7e073846c5435c0ea16c0efb45047bcd08da4729c5c1a984cecd71d2170107d5c3f68ae9ae30a1f0723a0f71ffd29c4197ca48ad2c9d3a490012527ec14463bed2d2b53d0af8fa68330e6350713346bbdd2e8f98d4536f2d42bc5be45bc1a31b1aac5ec8f300abd12044055f6e7014f151ecbaee0952e3308984db40b7c0f5f6eb929626e979deae42395f33de2405d5f9416a449921331ae8f4be884f97563ab8e1333fd1cc44a211b661262e0eb0746569777995eb11ce478233206cc523225308a49952ea3cf6f9d98e87ba18a18d029b6c96a9bdd055c82932d2077017594f59524bac7d4e79e93ba9c5153b31d94abc23a23f06a4bbd38178713876e122da5d768298fe0264661bcc7441e86fdf5d74c8f6c988c674902e364dc8aa505a6249c8b2faae10406485520263d1940f1afb0c40967bcb88170e4911175ebb30022296d1c3c596f89577acb8dd489f1467488a50b17c4942ba085322b8f160831cd4a5410355040a03145c4544a02d11d031b46afcf31956ada8af3d9e0e14ae160d5f47441ac5a485beec632fe3aa6f9bbe099afa5d65753abc4d8eb05054434504b4686bc87d21e1979cfa5c92d78b6c8edca8a3e437a88f2d34274b06eb2a9b988302098ee797d2eea91e98f528132fef01ab8a11f7b6b3bb2f6728d99d6e506242897c84cf271abf3f9aad7b831bec617621b32c46189be27e9d828103832aa0fe3bf5b23ca0edcbf82efb62132aaa22c1a06316644448686170fdc506215b476004ec0328b0898231d56a77fe4a152a2dd0c34f86100180039a268eed7411c8dd169f36003b606d9b85a78c5c45c5e0f7e65c9fb7ced7b4633e06168b1e9c51a38aeed506d149c0a3c8c2bc96a34941c297f6f622f1eee7d4c706843bca28c4b10bf2f35ec8d6c5289814909c6e2c3aef1c557220d505a484bda14d1887e9e3c678c7977a57d941c8846769d8509db1f0875357a85dbc80f836b00240f3801a35aa3f16a5615432f53e3ca9eb9c259981ce2663b46eb98f8d1b81bd3f0e28779c7d9b5803fc0712d1f1262d22b6f2cad418501d2e4d3916067d31fea4cd4490aeb5c0d65576e1ad3a3a2180a18f0a6a5fcac8b54bd1088c0b1b35a517b198a2b617e9274e27b78ce93dd2b8faa516672299364af91b4d93aad45bcbf65d05c1de974a1930970be6ffed6a33fab25a84e0b4f5b3242fd557007d4cd39dd7418544e446f63c22f08141bde3c86b4652d1c424d403f469b370fa5da6649f9e285848ceaf9299a15b620c0fe033e7c7c45fae428b95873e651ccc15a6c5f29dbf1dc0408608ac3343e5278ff750c5edec0e36d60f5c47a70bdf081949326ce307f019ddbe9023362bd27be0ff91941c39f715f6d3b5dc28b106c7d37a9b03a025dcc7e2e006075bb8b00d159e01bdfc0aa65d938736f1c83b73f477aab9b04067eef94dc5f96da6ace72710429f5970e2b5fccfc2c57fcbf7781cef3ed891a3bed20473881f1ccd03d86c665812e9ff182ac9cb098c23d694fa8811ff4caff63b4bf4a8ee92621c84cfc1e25b2b7a2c414e9eee9248fb45fd04082212d3bd6228a1e32cb64e0ea28f3c2fe64951f36ad72108dac8740ae2abaab4cb9feeb7ff58ebb6f10b0de8f8fbb8e7fb5299a6e288ad7cfa70039c26db836b413d6c79030c052f01f223873fd0e2d46853c352a1bc20c4e8b71998f448a2a98c7713d5050580d94067414fb4ff8df09161a0a3fee52f8f12b194144b9e4d2fa27c4e31d18660859702dda0c61084af32ab134eb041f158736da2802ec32b67e7e7ef7487125465091344bf0550c8ddad4b47820ad86a0345b41b3f1198fea70a71381297e8a23c62601c0220563bf6500c1ed0619f737be1546ecc9f41b0893650917dd15e055bacc9a3136430c924eb1583c4b7c9fa6492ba33609f60af48520ad620cf57c6d124c7f910971eb5c99b1bbb5913cc6c34974d67f7b0ab75b62c5cc4f9b229ca24e454a04a42068dc7d1061347a69d7fe716bdc93f49a71003bdc78dded653f2a1462a53ec47b07c6d34a793e7355ae6df83c52dc26414d0a2e0e39a3b139e11ad872a3a59b9d0db0bd22e621cff1ec79962c93d11cc96f8c76f66052198d4c1497c8aedb2418a0412393015b4ca8cb2120643b951014e057529e1ca68071080655dcb150734c989b11aace229e1cb8dd09ff63478e3677e96671d40b2b6cdabe26b6aa7a260afdf04f7238b2b39234ee0084380f125d368ee457f9f85613a38f9a89342d865d3828fc0a6548a6876beecbf0da2478e5bb9b43cd2c725d6f17c2587d92d8e76a4b9e2c0446dc8a4074fdc9527145cd85a82c092606d8d5da5de9c42c5da8804e8b03f5d1235e737523fb6d57029da1f8f06dfecc1915491a81fd1066c47869d50f022804cf6c7cfe1919a8b7e260f970cb6e14a0624e690ec750611475cafa549b041b9cc1a3aa2c2b1c4289cf2000cbfb631929bd3578936899f746891f06b46966c9fce52c3920d20d3487d088eb45fc6bdb3b9744842eeb10fe56c626a08f1d8a07fae6fa6f6fda6dd906e85de635c9f43553a073e70cd8df57a411e5d70408c09a2508db461ddbb33821933a9afad3c43b27b74930f97806807a0e7ba584085e46985ae73cfa62d60534de012bd8fc198943fb61180065ad53bfb6b0e7110d5cc0689340ab093e88c0f8e567f95d3f6313e1d9f77b460284b74fda11291eb82ffb3cad442f1a3a093fba611ae3d2d9dd5c3be31f21436a9ffe5afb9f0da96194a3e9cd85d4084f82d6ac0db87b8b053c49c8fb501b83508c0ee1cdbdcf76905ef84feab44f21fa8df63854a3119d3ec873af714dabd2cf58e862e68ee3d80efc0b7cf235a94409a23539ff9e22e5ff3828f02fd40916077a7f84e0c8fe92b3c18124c3fef663dea21ce4b366f4dee96707604ae87bdd5595bf878fd0f03e667df875bd09eb125908f84f65ae4879ecc620802e5effb2d7f1ca02431d82aca95db2d38bca8440664410f4884d8c9c59220f88c88b80337abbe65b580888b20ef5477ea6ea591fc4211dc4f0fb0da9b05e794348ad59053844ed41e2e088782ad8a443f925676dde867cfbe5925d6ce427673f21aa54bccd32eac8323cb4f59e8c8871053d988f04a3c90b1f2a6be8ca779b9b1e7b3f0e4ebaf2831a13cff758e0b9d283537a0f9822baeeef4973743f6109058a8b4f62214b8ec54a3ac53edd2c52b0c3aded385ba7fa80b119e9387bf38aaefc1c55ff122820693418e5f2d9bd86408ada058b5512514eba71da1deef87e34f1e776bbdfac200ecfb8025b068cdc681234deb41a60aa9fb8431e10cadac85984043b8a814583f20d0446b0d2c4d711b4f46793f043d9fc0e9f1601d3e29fc1855d29341bb7008b5804ac35d57c35c1e4a4920d6ae88fbe53bd7ef583eb091167410c3f4c59b284dc4027f31d019b85ac9e9122041f7623b88c0e65c2f3d4e579bc83c68d03e9f18009fc2dfa4f6289bf93e3896e886e08d17ed4267f80345a97c185865672c60124fdf54e5e268bf173fa10c39444b64414d66ef54e6ddbde6976646bc38ccb5455036bf7768101804bd734834ec5f9803e07255acc71473b9b6643643df6443a2966d697a7aed50e91db4893d5a9fbaf8096d2515c20fcf30ca1fedd5a2b778557a665b377df41a56c6de61a3e2e49f76307e54449e8db9d39c53c97ee3486102704657b82fb41c57d11e82636df1c61e043af8777a21349017ae5ecdf11aadf6001c9e76c85bd4cbb09b60a4e53961762dbbdd341f20d1720c8c1cd6399e80c8031fe256fe83e1ba3394fdad947de10bc31129c6fde559b2de0c6210f2a15e97d2a1de452be393c68cc8566f851899a778074d05da89fab4becc74816c8c92f3a8fd4ae8041f543a188cf9e7075c2440cd39af515ee07819cd4ba13e123ce49a65130ddc4678a78e111e3ba3e9014da347947899c8a3e823e02e464a81947807e4237ebef01f8ae5eac483bf1128273ba863c788c468024d911248295b3ba6d95dd5dfcadd823c37e434b2c9387623236ffb9c9de50206c58811a288bc8f4c4bfdea11ab24620b21cb5396d0074e6e535a0eb8f27e56a8b8f1dbdef08b6932719937533b2458e3e4dd735b31cc9062698c55e194b7ebc65fbb7bcfc43e6e3decad1d57a087d298a18e39c90b9e5e9b21827933a22b92fdc11de8f3bf6087551fc8f70c876c5093bb2d4618064509abe467e57d4680faa6d011cc0e6e2d057befb005ba420f946eff039299b62c83f5a2b82b58cf61448691deb857b96de47040cae0108d60fd3d1e3d59f608956cd1551690b315f40907b62b1e4f5f5d83f981d46de4eedec142133822f479fae001742749ad8ba617d3b59898710552f23e11373dff226b8fda93b1637fe1b82435f76ab289849138fac110275964a8ae3dd2a06d23e506d92b5da0fff1698dc856ca7d4fc07911111eeee4fa79a8fe1357b831b097e38a384a7ff612f1f335b75e021e9ff02a64f619e0f1451e10b4e7131d419d20b71e726a5b2348e38381476e8c2ed78aa0eb544637d6ecbc3c0f5c80dc95c476d79d387cb37c86a0ec233a8142996ac7feb072411f0c5f48ed7e3ea33571203e1561ed44673c243e9e6ff074c2165688e2270c4cced8c7e0feaccbfff5732a148be31c5a58537fabf0f5286c0e9d4786e09d29d80cb39114c3771fbe0a20e48a118ba6d0febbd9c50984cd6cc4fc2dfed349ee85f6cbf8e2a4f2b32a1b84072f39c89ac3dd418e01a437897713f8879ab895fff359fae569306ad50fa1350d1dc26461ac1702db1cf89c67a012ffe258297a74fcb7c9c73ff65523ec3aa55b073689d064808ee1723bd8305e1a714695067b38815b41d47e4867ea3ff49b7aaf96b03f7fe75f608b5359febd2c4a73b4e1bb42fcb087202ddfbd0db9d93807fdad227ae4251f241dbf03c1033bc72ecd8431acf4fdebfe7035859d1333a92452dfc6dee8d8d7886e2a06eb1146997d915e1358bd4c37e6469170b07215bba7cc8ecb8504aff6d6a4823d1546ebffb8357ae018d2ffecf5b40c13b83fe4bc68a2635826107315561bd6ddca5479e0942d927201565999b7d90baa61b3ed5e18f852414b44a94e9e2322d89fa8988bad67f8e29638411be4ef0a9343ec42d894b8a17f90c5726780eb7accf3fe11e35eb9417947564f9b1bdd6bd6611a7a96c0f965c1112a95e9188e2785642f36b2823b3d099746fa0b9247928990af75d0f95dcbc7e7797afde30b228e3f80dd11fc33cd63a715ed267f104a025e24be2a37603182c5d012ea2f20f71b72b51944d84fa8a1fcc7547b5925feb44cc0d85e56bf22a9e01eeb8862d9db6df78bce6c9e39297d3f5710b7d3ba846c117ef917bbaf9e8701c5ce365144d5d11583728012fe4f54b2894a2d2eab005a4e6459e8c9503c46191487afded4cffb828e8fafdf8bb3e2c03b7d2c40abe23ea8d2b85fc1e76511236e0169574312be07f5cbcbf802ee4923911cf4f067f4c253a449335d01a1882a6098fcef1a74828976dbab13512d328b74da45bd15d13e2bfd4ea6d233c6ba9b0eae7125889a813f166e08e308e2b1ba611b708545e88832302e2627f1d12eed55ab8767ae4e8ac72e281429a20c2f581513d80cec9b715fdbf48e63dce7fe80a681336042f25dd55045f5bd97c8e61748ebfb03b09e3ae1a7d3bfed4d9cd9c3a5cc0856591a63183903aa5dbb1e05dffd0aa48a9bb2dbf07b3268f95329e41f630abf61a79c0c176da2fe6432e73944299b429505c6e90be0837da1bb77c2f3c6a36620ca34510c4a7eb93ccb5f3a5ca5aeec1991c128bb644eb7d3b713a1f35af7b1b8ae1cec94cdaf8e9b3fdaa78139eddbcea95353221f1f11ef3f15e7add6f2f4a58046d0714fff8e541bbe6187a279c25727b3096ecb06e183ddd420ccaf5718745a0589b0d4d450111407be18846491ea8a0f5c43c57be26a018d3b3b926522c6267919004810ab71ef9aa286293bce4e4f0da963c507f7361adf92c6328a8bbcd4dadeecf2509aa5bb32d1539bdb496ef191a9316f5636e9e319b483fd7de15bc9e84dbcb610a7363cb01aaf490bf9d611fe6a88d7a30b44d3a4d2c9c1d0fcfaacb6e834aaf72920e08425bca52866e96c708cfb1e477061e2618c78ba60b587ef971b104e57f9292bcac18afcc5c0c28f8a25e1e996b49667ffbbd98e60bc2cc235dfb5dfc3196fe178edba357e6b3a1965c16bdd4102b7959300958a6509a48b725d625116d13802e836dbe76259cbf7209b0bd78a0df2b306199cfae6af758cb24de641f4e4f2ab8bc9d996881f0fd546295f4cfc6ae487b65405850362211410ad081f957ec2ea22f592af0b1c866251a00e92943f74a9ec5344befb08b03a755d58793d237b04bc197eb6d33c8247f5d69a46fc9d04da20d1a72ddfce6d6fa039209dc0a9127c1330cdd62414723a2d4f99d1166ab9000f2ac44044b84717938b28815ac40c0578919563b390fb51744eede50b964b2824d07d29311d544d585186b825e0cfd4ad54637e3f6dbb946d99e58cee61287a6d2a81bf47aac3471d72478f32f9f712b816093c3d595272bc2984f83086b354f5f056cf391c29f9b53da958704f8ad07101a154ca052ad587239d25a114efa05efb9ed51d656a77db0c818cbb80d4d6f5e030086441f457a3a2865b22f5431e7b2a10d0071b500807ad69470c108688b02df38601ef753af6db5782bca8a3a14bfa35e0c249e50458962f69854fc8a80b1faf33a045926a6d759347f5c3a4a674ea23fb9948d5ad64279668652a1528fd3b2c0c7055bf8ba6ae00df91037eb82cf0ccbb06df6e567a8a70f2cacc6043464c62f7f2ae73b92547608a7dea86714810b70d77c476e242e3604ea378de2fe7932b1491bb28f2d5c03a292852accf4601c45865c2aa0735fdc06b865517ac5ee2b54cdf85600e58afbcbba5ba9b41c5c27b59cf855f00c1672c29c275e0aead0d3b98af2d46a67e64c2d5b67416ceae1cb75a91dabb31989714a79326f25729392b0f1a23b475df687aa022d22cf10848e95eddbd166a4bea7855c507ba07fb02a366800c09b00025c1008351012aa643329acf2a1438d95d2e4c2d7efb07057ab6f89e99d5e40bab48817c442ea84bc39cd4200b2487210fc22090f0ca9270900f6675ca292bb656a6acf05f15b3b7f530ad6da3e8bb921b40a76fac9a8ba2fe9c1f50206dc1e8ee07224c23ec0405b5917af2127143f89a2a59aa784afe9fa7da7530c55024944d2017876b55998c69eafe5b7fe61c333e052918683229e446c6db659d3e9cb80db596489d441b0372348a87ec64804a95638399d6a5ca7f2588f2392bf5eb93b1dcc6acfd6f4a289e48bd9eb2c1d8879fc96b9337cf5c2e17b211d80e7d94aeeb060b00957ce5f2b92dbcbb1782fd84271e98e67c8606bc74df4e8a40ec0d3a2f61e2e00483dcbb605e611fd547ce89ec01cc4a4e00627c83d63a778d40e04a1ce7e11fc77a2004d9ec8139592aa639e3cf7c87ae088778c147087b5ee01aa42a82315cb7ba5e28f08580349ef3166fb688af46ce212c4c4e91f96649993c85ba26112fddd0e51cfab60a6a4abcdc848638b2ca4f1086fe9d28a4335fe8436a02b9070f658d0846a13020db1c27b07fba22276016e0b290699a4cc77247a435d06d2b8bdfe804a6130bd9e88fc10960511a6889ffd3cc7d957e46b95b587a6f3695e3ca27665bd00758bfd251ab3b108af4d178d4336e157d60726e5f126564d782fe9fb5eca48c8ab9221392cb42cb3a1467a8210ea253bd7949255c565f5cfbb35ede134439b70ec66cfe592ca1b795f1f074529c30cb0de2ba1be120554f15d7cd7764dd07fdf1cac13ec717a2b9d78cce224092f4bf09f91940b1b7ec85c0ecb0d724627de852bd88f50445e473a93316df13adbf656606081515998f11f13d41b14ee2bb6ecc7a46a896cc289ebf9a429de67498defe3280972ce1b2898b00a85c64a3afdd2578f19a2a3cbd91477def0696d20eecd23c01a053dfb9b2a27df2fbd03282c2b04287b1587f72330a787f534a2664d427af5452fdc5c40b91f87e2dd1ff47ad28ee7a589b9488142c1086721cfe986449a47055d74ff684b4e13d92e6aa380e51ca1413cbe8cf4234bfd906859afb9c3ec1998fad0c7f1377d05fa4877ae1aceb12e6c704ffcbd9ea76659bf7525b1a40032304bfd92cf19f4eebfaebb5cbdd6510b721ec2ef82092ab8ddb408be51801f735a634482899bb96fda2a978835bbfc14baf1febfc4ac0394cb24bf9b85bebc1f0a02a4addd7bf080d68ed1bc49103ea699446ee686861939f998ff6f1e4c376a4940bdc06abcb1f3394fc4d628d2c05829c58cf87e27279be2e216c833bbe2f9af6d7adcf4a130b0ffab323a9b8a9303e054f16f251667200bded1dc21778ab65a9b08f579dc56e0a8a58dbd48513ee7ca33a16ce9fd0574913c657de0650a231f31ffa323795a94889127cdeabee68c47875ecd5caf30abe691653d7a692deebe4b5d3049877b003ec12648b858790c6a9c7f47c74b582c5ace06d4215b2fd30efb772244e8c4e70866b15177d14773be0f082e91ec58ed184c14ace100220c0e24d690930119c13af0095760592bce4dcc64014cabd641cf510763d0f1e59d9afa0325abe0a25547d9b7260513452ae8ce684156fcd0d701d89ec1425e58c12f8fd73ca5eeb3758be299a2ea13ae0af2cf06a30211270e0eb02a5d62942d90a35aa16ca317c5c76726cdc3e8d99e7dfd05b88543e21e725d8870edf441507a11ab8184fa938c0d257b11e69198356899b283ae56297ab57db7c9864c93654611ab9159e0b09b6b1e697bf8e9e41b4b73ff1b773b77b96e16f36ac018aae1a13f2e8d06724fae384df8d25c161462b45bd1d5dc20e3acf6b34c719741558a1f49d98af719409ac2b92ee56191fae06c8ab80262599d422547d4c2eac98a5390de538ae01476534fa9d49b5cc90d97dcacad74e226eb935f38b31fc521330ba86f56cc65ba5ca568fc345a5923297c4e7563f48e3fa27b2c0e6ecf24c42cdd68a4b348431df28b0dccd98eceaef2000c749839f0c0763c20827189d1072166036c77322c158a5d3b91dc11b78c510600f91dca22edf4c085b66b3194d099dec618c70e04f354b60ff3aae92a5c8dca097f979fc282af3b1f76bf096a8b50a4bd26582a02eac75b050ef4ae080e7a525b248e0678bfe4c3ef51e8b8933d58c5f118ec49dd602e2eb57c63a0ac3373bf413514f086fe60b0035bee72b07a2065d31cf47db3c25111204e3d7a47f9d8de0e5558caeae22f7770e0bf45a6a4c3df5c3c66e8769d07211fc52f9211cfa64c4de66267e02f1e115b0c8c58f57db68c0bef59d4cbc77081611e0980784c4e94b28178d0fd74ef6ebcdf9fe0f03958443fec0a027114eb9b5c5ae1e70d5edf8bc292ad6fb9bea74fd122eb33cdef96145be368ebaab6dde19e5a51ee4fa811cf225cdc3e8c7d1985a8ba273c8f0ff3581810bae0c5b4d2e60ee522c300d4c442b4f912ced54bccc38aced36a3d9eabf488aada69ec2caf1f9b79fa21e2964a4dbe94c96f409f5d46c79275deea0777dd9aa275c0b62b33dd6fa61a60d12505a98559a55c31ae55d5961209e9601b5f4270625d9ab76922888863490624efa1bd4c211790d8c8e714071b7bcb23c5603187c531b8a6893a5e4437b118cf4c2b022f9c17690eaabde63fda95c8044316477119772da275c4a52134f588656e2d9fb09b020b2ae3d4fa0bbb94f105141c0421e2401f1759a33914995b5bca96f309bb29b005ee8570088f0e0b79a09987c66f30ba80eb58d110bc25221de21462a720764b743aa26d43dc183584a61e59c459683a4cc283c89d351276b98455ee1777576241c9dd9a6ea945115da4c2a490312079d488ae46d06a8872573504782a44d8d7d6940290cc83e6368d0c2a77d7fa44bb6d63631593db31ec8a4baa2008eec8369ebb6e4f2901c73ad4c744e92675121582c11d2dc67357ad294520b997f6654a21488fbb764b9705431dd9c6b3aeada94a209907cd658a6241b1e9d97d95fbca7a129cf02d884eb610c6c26ac5ac7a86c1da31aa82d9856b16c910fbb929a1edc2aeb99115a63993e18884b937d753b0e6fa0ad67ca7609aef1444388b84313f223557ae5498596d8ce02e1263fe0874ee5bc7174c7814d33d1d41e2b518cdf50a2e9cc5b43e5f90f02822c6e68fa0112b571ff872623808eae0f2cfe4227b17bbe28fb32c81975d1d2056515bfbf9c1309280a75337804dfba3d01326287bc7b3a19b48859281f77415f89450a2bc61e348f700c91b2aee4dbb324b0669d57ec69a6f6991939281672d5b4a0acb08b46ec17f249008b8cedc5a966ad456aa66299a4294dc9f2219793dc5a371daeb09cdc3289723dc18c9c9ff5c3c17fdf581ad7e7a9fa56f23f965483fbf359f96ecf0a740e7a26d7cbd33568b2e39192c907d68c8f8a3c6aaa26c14038c021aa9cd07b26026b3ab13b5da21de577e50c6fdb6f4d33bc17673f23407eb90caefd5018e0f801b40e0eb4a46cf1a4986027d79a3a91346a7a82de03f13ea603d7174e6ee7d60f5a8f0435ab544b0b8e450c2e9173e5cb7f3e18399ecdfc6751aa81ecca1c9f2254717a318635304ecbbf1c8b2f8ad63a9e5c6bb0541807e1ef5f04fb796a186387baf1d95a1747068731bedcd9040189ab3cea3cd5805ba8b1159142cddd47c9a7dfe96f0f72506b37dcb70a310868290b972097bed60fd5bbf04bfd1dba4673ec549a3276c828fb64a5a50d08bc146e8d7d50dde737ded990095280af5af64548bf0acebc5e9fb1b2f1f94f9152a55d572b107362244a09207d01310421c52c62f49a44ad0a14b9461f791045b2e83af5dea48d27e707414d86d01d79794cc8f68ff98cca5673af79009a4f2e854b1d7c218d6ed4d38104ae0ef64e5adcec02a2db2bf349c16e94edf990bf8904e657d4515b8d78443483f10461df67b5e77cdbffe3c7db76e68951cf94f2735b8ffa94cc25f081c42eb57aaba36d84e1d784b73af8eba9604ad0773aa4d7c4fb495ac92aebee3761e283ae5b1e7ff466cee7f834116d0a550fc2b24243bb38fa147f968f513ea829f2ef50bb9e471b4a72c26dfaf1f41870fe9a1986181ed474f4269ce54f025d64962c04fbe95eba6c8a4419402ec48e1d0365c18d31e0da740ce6143a2310d2c61287b988d8711304bc4dc28190e42ea4db1ad5c90ba51d90573fe3d0e64f8028dce4f576390a08e5ffec45bff885b58dedd45bbbd705cb650ab5bc0c2cedae2b7a4f09475ebd98bf9e35f348e05ce4cc59c11561060c9381de37514348bc438c4d43e0a16c120241c24928572014564968544649877561b415b4ab22db2fb21dd48dadde4ba3509f963e66cd9301e61af4ab95df21f61af0fee0644ffeff72e832af0bf979a08d93b051112f30f181133789e3eab748cd51ee3e972c148bc428e91d1dda966c1a08a0e6b29f38c2dcd27a6be5aa149b787fe47b6f648ac5862583758458535bafbf11c89f2e3eef6d15dd229b15042755c77c77aa5c294ee19c59d0f1c9214cae83c452ad60984346b294cd1ddee62023425c70913a0293eab14e30fed75d2cded58e53063958296ee86c1ba5b49af52d8e94ae76c3a36bab3460bebc7bc96d76d76f1bf7aa6cd68cd4b7bf32142489389cb55e4461cff189bf7eb581e555aede39c6bf31c471bae72202d597541563988702ce056b0ca314ad1cdada09b53413717450a54c8bd42e1097cbf6b61e28be2c76a8f6463629d496ee8150e9d20ac5018e9cd13d7798bccb8e9150aad6cedddc18e5ee13823e88b9e5ee1f0d2fd8979d2660dd73e531fea78f0dbfb3d882f8a93744c5dcc480f9bb79c5ab8bc6251d1fd893fd22973fab7ccb3ce28112780152b4b77e7e921c595de8cf47ead8c624b4661797f4473193ed2afcaf86878d2a693ee4e6774370ebd5a09d10d83c1bedb1bb9154b2c0ae55ada307c816974b7007a75a38a79cb09837d781c67e8e2d3c23c632eb3d633add1b139d357a92ce3cf73c4b7691b6714ebc4e7bcc9e87d71b4d7dfe6b98c79ab5a8af163b77df5e9363b2dccd486fd6de0f740c74933ad14562de8957afd9ce9b5dd3fb2fe7756eadfd3f2d3c219fed17d22fff063cf6339652f7ab53fc64a2bfac732f5d6bce5cbaf45e2dfec7bffbe46f318a3b83ef6e95f69ed7e7ed16d36bad6e6b7719cf7ebcf7c1ca9cd6b9ff10d3b2e717d5c6de8f5b1a5857e4bbb837f189779de4992332c457b49e7c14326a362fe3b6dffe31f26bde64f2b72970b96af25c912e7b85c5fa3b9967735634577bbad4e8009eca0094c28437c911ed94bf2407cd186f5fd36e6f0efb5e1cc53f45cff3eadd21d72665ca39993b16249f4979658fe49185b74f79566996007dd8d42af64b4e82f7cd1865e2dc5f533d2bb1da2c150af64c66e3c4e9aeb97581e7bfdb7e58fb911d1d2fb4e6a658d56ca8488673c7ff43cfd16f31b563a83950c0db7f106171382ee0e7b155344671b7a1563a552ffb05a173f4f912cfd639e715973b23633fe1a2dfa6878d23ce317470b861f05b4b9527fdac71ce409e200f0fbb15a5961a04c56c67c3a9e2efeacce7ba763ea98d28afc1b27bd9f67cdc57fec8ea7e31c4ecf93961df304f18ce758b357e6f8be389fe646a11d632eb38e9fde27f22780e976a19b6340778bbdf276ba5bd5dd47e86eb257272b5a7c5bbbfbebe672b0d1cd1de1cde09667acc474a4b9d4b991a3686b562c71a6cde8db60e2d7f2f646b0fc184f98154b4cc335dd5c8ee6a4a4a0d3cd21e1e9e66a688e07dd5d7b95aad23dabf47efe1a0ccf19cf57bf56de8c2bcda9e16993559a53e9a485f34eb27ba7bb6faf5042e0fb554bf1fda36a435868ef8b232d6339b51049a71622e90811e243480f9fa913e47be6fbf81f22901e59901e3b3e72b215a7d16849f1b1f890276f1953b7d587e492acd46979567ff4cfb45259a5dd3d4377dbf0fdc4fa46e18c554a0b672de7f3cc5807ff11cdb4462f194377b7aaf4eae464e703c2f3ede4646b6fced39b757af404095f484c1422a4c7270c9f27a766c32f56d2329ddd6ec674f6b765ba7bec6e58b3f011dd3d6f396f317f911e51d1deefc165d6afc5f4888a3e9d96a9cdef8b95cedadfcf732cc371866eb367b2f639cfeeee6e08983ad0dd2df4ca5484bbf0d34caf95b9e3fbe590b510e9ce68cde582c1befc120b8cac8548dd3d7b55fad2dd3c476eb3bf38ef8c2cfd67f3da8c7d56e92d457ff2967d4665d5027df9a50efeb4ec323be25abb56769ff4fa349b8b9fc32791be96dd4d43770b81847f24691ecb9a8bb5b4481a0956af4a4bba5ba4e33caa42dd1dd3dd4574d75c4bcbe5ec6e16ba1b01dd6da4575d159d913e67de72eae0fce338491d5c8e65ad0c75ee9376fca30faac9f86754f4713ef6f9a47c552af36c2b90154b1c05be5f8c8e241d65397f4473f8e368c31c8cbfd6ac58e7d5f9dabc329d1f3eb2177d5e87a767ee00e911fa107bf4f01164e781e47c9e37e3588975702ead51f8b45027d3998e9ddd197e3af7c53a917e9c3af83e86a2d3cda1a09b83a29b3b419bb827ba9be39c50a1576d4677e3e81547768ff3c8d6fe76374df7a94898eee69a454690ee5ea157dcd7dd397ac5b5d0dd45905eacf43eae14df4fb4359df08f1cd31baf3f3a11ff988b636969d871ba83d2dd3a7ad52b687cbf5c935d7bef7b9d2e7ebd65feebd5d23c73fdda8f648d7aa6f3669f559af3ac5d2bf3d9dda7ee0ed5dd2ff4aa417cbff08f60b67975c28b75423b8e53e776e78dd1f1062d5b94a00439a8569082091c27aac8e2440c1514c9aef0018499f1c84d8d0f82608182cdfb9ad0e58ca1d1004aa882d8e05880070b145838c0572271100d375ce142000c78374821c10c99962229e9d5a5d412b8c8c8b8100b9b862b252031de3a5633359dcb70dccf8c0f3f748eb249ea9c9b41d5f48f8c8c7b322995c95533359d16930f9e739d37530344529257b3e5869f92ab6ab470e17e4abee506177430f98c1795643c26a666a6860bf733e3aa1a2d5b6ef889712edc8f4a8b8cc7d824e9d03f9ee3d0c970353ea89cf36c7cf84091ca39f721c63b99981917527ec3cba8e41bb875de52bc4ca8999afe89a9d112e3a81a2d33cecdd824959c73ce468b0f3f945c6593547295ab6cb470f19f192fd1f0b02af94c8d0f3f943cc626a964a2d181a6a8e49de3d0a96ab8703f2af76ab8703f9ec7d4c4b84c573353a239e2820e269f711e4a2ee3a81a2d9ecfd8f8f081a218e7dc0795773ec438e73894626aba84f3a3aaf16a52cefdd8f8c00a4baff14ad9186de0d6f9066e2637b90b3a983847d598fc7432a14af0d3d56cd962d2c285f32d2ab837aff03af9952c494949afd491d1c903d0af135252525252ca260b75494949479600f142d9189d6c4a35997b958c96a0fc948d52369953bdba1b2e2039a2bb1ba85de6860338e76c8ee0bc654a35261a94976ab2d1c9b997c965542f536793b997698dd7c96413457bd354e19cb389821bc2078a521ee359b470f19f53962c3f745ef21f3837f90f2af7bc6db26cf19f934d961f54365cfc87fb01e59e8dcd0f28ce4f3643dc407155c62b01e9bce3c2c5a4858bc9e603586e78959cf32d1fc072c3cba84483a5a57895a4c8945ca674058893a98443d72f204a5c00645ac674ea4c9c13320d041035461c577aa94c2693ca539e29a53295525e4aa94acea93c1ba392c96432954aed5d164ee59c929a7bd4f9c9c64f8eb2b992e585caf23ad9945225a393d1c9064b96ce51a793c9e60a10a7ce39a354bf503558b2bc4ca61a8e3b8d40a63b2f79584a2aefd3cda6a3ce5158b2bc546eaac1a2e365c4b98e1767934b2f95732f95cd15936783254be7a752bb0b646c30e142152b362eb0e2dc051d4a3730c0396773016e055a4aae658b8f9f9367414239171f4ece41e99f930f01445292c9654a35289b2d3545a624991b17e82e394733c509ca4b5280f841d9f8d04141f9c9a6542373a27192f2524dca7de8bc2405e5a7ceb7f88072eea74ba51c954269f1929292864899b6f87072eec70405889f92cd162e0b103f27c7a17422ea9f92cd96991f93e3d09d4e9d7334534a8eb2d9c2e970638d9f93cd1037d6f8e1e2e3c7649382f6a68971ced96ce17e3a9b14708eea4c48c8b850c50ae7ed9d43c685587bbb0ba1e7d0b16a1a386faea64b3827b7018295c94bde390d272232272574a552a974e374a23939cd0c6a868686c671d4a099b131338303e6060f2d251b3334376e9cfc860d96dbb84163c36f38eb860dd4c94b343333361c4e189c30386170c27436ba9412a6d58d1b386adce041c4eac68dd4ea068f249c30386170f88d9a2bab171059666e380e181c35666e5ce141c40dd68d1b38606e380e1e5a5837563870703858ee9580e47096cd151ca9d50d9b2b1c0ecf518383c595ba48796a7503270c4e189c3038614a63dce85264a4bebc6c94923aafe41c8a47529b80c8820306470d1e4470dd386070d4e0a1a53d8f47d20be59e7b9ecba0fcca58ea8245e39dcd955ceac244537383c54bc6bbc4aab1613396bab871c3868d27e33336260fe5386170c2e084c109f325c6e41541733ad938b98d0e0544161b36bca5c50677a395d422024be94667630675f2128d8d199b2b59d5796b4b6b4b6b4b6b0baa04a6a4d78a05441653cad43a826532a55829538b4b6b0b3704882c2d96b7b4cc985a47984c384ca65692a945040e13ab95532b4fb1b2ca573537bcb5a5b5a5b5a5b585d339d998925046f04a5c4aa552a99bb9c2bdbc927328aeb91296d28bb3b9c22191b9d2364064f9a195d4d2c275ad23baaeb952d34a6a69e186746e6a11c1c5784cabc5e515136383aab1b18115ca4b9dcacbaa9729c626ab5e2a9b2b40785e6b0b3724d5daa2a3b565e525a1d290691aae785898b498b89892624e5da8669e88420a55cd8c2a02ab2ba62ede12105819c5f8e975c55b62c6f3f1505e149e149dcf8c57722aa8b04265d3d222d34a8ab1696d69257913f0ba785ebc2ede043c2f9cccc9f372ea828925beb4b6703a323631315d4c5d9858e20b0456dceb8aa98b6902262f26259858e24b6b4b8cd7a5f3b962eae275317559c29b80b784c784a98bb7446b0ba7836a69692575696d51bd6c4c5d5a5b3c9930644a5e32e38c17c7c9780c67a363b53a71316363a6c6c69bc0ea4a298d94e7add2b02181541736bc8b5418a9315265743ea8d419a9343a1f1b5ec9c18051c39bb1c1518306070c4e181c30ddcdc92665457743450a8b1415292b645258743e298ee694c2e2c4050d179c309c0e0d8f24cfb381c4aa94a242022bee95460909253025353a1f2d5c70c2f0d0e2a5a8e87cae94d24899d1f95c4951f14aa384045352ca8a5417a930525de084e17450386ae080b9524a03270ce73657b2e99572d5a9d4c5cb43b9739ccd95b1d4c52b0d9c305eaa34b3812318018d9219af1ea3bd89dc2879d37065e6cbeb9552e3d525a5c0744ec779f7bae27d6925753edde2d2dd985c86cee9bca4c6eb9a5e574c5ebcb4b87437a91697ee26d52222e5a592a75a49dd4dc95b5b381dcec653628997e7a5bbe94a578048b5b6703a5ccac603565764f8f2a58927646857cfd49472780c38cd7c4935c1a59b79c5bc623895ca060bb786290795a7bc4423a48a5179ca53252f85d1dd944cde9d562594679a51d5a85234475431aa1a1b4ee3049871194fd1b8a0830da7f1221b28a72979d10cca656c4a6394704a2ea32aa55c156393b22975d13934a7179c3c9b17ea4ac98b57c97f300191ea4c4b7442985ae084304c84b10024be5c5132810ea620034c0b2fafbb8941185884310512c240830b2f1d085cc6539d624ea730d0789d4e27cf33d9785e6901444411660d0a7861e28b9f53a904afd3e9e4a5bc1ca7d3e9d459f13a9d4e3ab8f052429d6cbcaeac5c0b991c64bc1baf8e411863745484d144185f5e5c17617889c1c00062900325b88c262eaf2d386e0b8ee3ba0e0c333c315e60741ca7c519326b94c238800edc4f97c2584326011e4d099a5081305e56f085966e0c2e6a10c6018c08414c0a759201638b97a78a41a16664509ee7791e4a0586189ee7755ab8600118604e5f64687c20c61862e0e0c57511038b57e7335cb020cc09e57929cff33ccff35229140a9542a13ccff33ccf4b9d549ea7038542795eca43799e8742a53ccff33c2f95f23ccff33c2f95f23ccff352a825663ccff33ccff33ccff33c2f9542a1502914caf33ccff3bcd409e57929cff33ccff33ccff3bc540a8542a55028cff33ccff352289914e7799ee7795e2a8542a1522894e7799ee779a993cacbf105153158987494ee8ef785172615cac4b9e9748af1502894a7122375427d5146cac445005b90c081046e30040534516a82065fa8515ae5280206601c815aa1542a140a4585175fa86a30850a1460f282e3b8ae24460cbe38e38b32b47ca1460cc000e3081a1a1a1b363c2fbe90a96267264685e280ca33a9542a958c890b180984a00b2e1e1004039ca044021b4c618324b6f440f1650254e000092792288d200b2dba50994e3236202326957aa552a9542a754aa55227cf06424099b450a1f2b8d8389d56395231dee9748325664c1d63e399bc542ad52971032b5470bac118364a39749c507052699124e3752955ca00541aa08028d07040186384298920063768028b23a856a9542a95ca914aa5522994161978a552a8544a0b0fe80063264625938518384c9c492593c51258a51c3abe38d9808b875a99bc2c8c703a9d4ea7521668d8a088540e1404beb0c1044e49c4d820c18e973ac243e59880cc69b501146a75f2bc2faa94773a657102140a85320d91c517a7550e544c0d0d2a150a8542a9bc94a35028142a85f2130da857c7200b2dbc98265c754279310834227232f122eeee03f027d87fa464cd86b6822078c4679059bf36e391ac4da4779c692db190ddeef29a1f2ca0bbb0bcd0dda55e6161a1bb737a459ef1b9113752432651f3636c4ab9b6526b861dc35da3d8dd4d7a657fba6b13974639781ed51906a0bb5b72a5d2dabc9304d2a3070fc5373cabf40badac0ae127b74c455a62a14b727d1a5299acc455e88fe8f822ff95fc588a4f0b8966516695ce0f4aa1bb7f6816094c60b6f6c2c03bc9fcb16e2e4c37f7042e08961366d470b0d9496dd5631addfd89f367eca2bbbf99a7384261c4e52a2232924c80a68c3b5dedd72c7e8da6eebed12ba3241861d1fe79d29b27f9d7e572b9ba6679a14108a3f249d3f04c328e138886270d368e339c556a54cbd94bfc11c8f643f87e3ab0fcf88fe83861e4bfd13882352bdc9423b432fa6573f056a56e877ea6db193784bba14de9a06a29e7042fdd5c13ba612fe805cc9ea8b955fa979c15d1ddb679455aa6360e4c37b7042e09bd9a2d59cd704042377704cf08dd5c11bab934ba3934ba3922f44aa6c64a960637846eee8c996ece095917b229da5d9666f3964c0977e5d2ca82e8c6f7bb9fc9294ed8bfe0bfe449b379cb5d1406ab33fc299ff8b87cafbbeb4bc4e273ecf34912afaf95d8a5fbc3a5d79788240bd3083f104ee90fc4953201dd66c78f3969af88b3ada507c5d688c568dd1f08bacde0c71c2776737b23ffa349c39937b1a0f923561bab855362abeecf2712ba67bd9a77355158815774f7779b365bfffe4c7ccf53a4f8f5bd634a9b515a38abb4d6f2daec88f38d8ff3456a84866712b08b91f59a2502ab745f7be3b231d7270aa7e4fa4477dac8f933d28984085684ee16ff679e4f9026938ac5afcd8a8d42bb046932f968c6efa2673be45fb57ee4ab4f5af2dfc86d5e09c08bcd8e78da56029862eb4b002f2b5ffabb4ddb7db1962d3b64650a75c7f4694dace8e88f8a4c7d48b8aa82d4ddb7fbe22dade3a74f2baa82038f5e55f13a639aa970d1dd9fe3fcb5b51bbfd5396f463a82f15f517cb95c21bd5f7f0623f1112854a6f40dd3719c405474babf6bbd878723badbb3bdcd417932c50e4738e348af76d8c06a872c3b943b7cddedead514244c99628a97eeaf367117e83af2e132077417087a8e0b7fb3067ace077ace073ee8184fd205829ef38db33a85ec6ecf7f0b12f22938740709f9b5794eb7758a8ef62a058c142c7a6228529ef81263ea52bc74b79424dbcbdcda2229b0fe47f2fd11bde3a4355b6fa3253f8c494a47b2364150246b65cc6ff9672d4be41f48d28c9fdea74f7b9b7f58297610047d088e0d3ee41f89f3701bfc5f06ab96e21b2fe224cdb0fce3101c92e69b709c21ac887bfe5147c7ffda3aa3ad8ccb0b82a07ffeb44cd27c8b790b87a4f9c6c5ef81e29cdb78e7486bb5bc39b9da2b038740aff36bd5d23996b3bf5eab25691e678ed97f190c3c0241bff469d933b6d686a4d9c759e64b8f6cfc7349d66c389b80f7e948663a96b597ff23f97cfbf9aaf5cfb758ce7d72ce1a9da47fec658f75f0f77c3d3ebe9d9c1a9eb69c5ba677924fb4e0308c2733ddfdea950e33d0618a6ef0c84130a736f10f87070fbf713ccefa778ee18bee0b78020d2f12d841108d1f574be27f72bb5fea506db62a79d1862e234544644d74b0212b94ef56e76c66ec78470f3453dc123fcffb0ef6f428c1912c83fcb3d96a6444479bbf4d66bdf6b56b6595fadb1cd70fff7ac6b6368e6f733cbd856f6963b366af8ce22fb18ce3cbbf7cade3d2da6c35f2b7795e32c6662d5dfcfb22bd13835fed10e83221b739c83f9ce938539751e7c1e58d8b4f92f3663c697ea97f974ed27140d0c56fddb8ccfafce8f19e379a4afcc3e4bcd96795da59b5b7fb2596f0a340e9fcb33bb3172902bb65585201e7c6c8c230fd70b067c181790bdfd490c55b37b73782dd62305a78e763d8edce4a631fc6f8efac5277e1293e11c557b53fb770c8f64358c8f6439d1368b0c447154ac090debd4068084aa6e8ee1d559caf6400ddee4222d2e964fca35f42da229b1dc7979214ba6b6ef83c33d1acd25ce7d18fffc46dc53058fe1988ef87efd37b672c003cac02b024003dda5d210c86346bdeca54fc0bf446b328073f69bd3e691f0b69602554db4a1524ff636c56283fc668be7f5485b21d0aba65b276e45a5a58e73fc9b6d609f49a3fe2fcb1432251120d7437925e2501c53a61e855929d550e48e86ecd2a159f16cebfa2cf2a158544a27ae4332e270de94891f8432f3b745fbc4d644d72d9a40a653b74bfda9a643b34abf64a8162b34bac2d429a4cc4bf3613d5c73719cdb6c23e466f886325ae25ecc36b65383f96c170be96fcf1b311ecc4e52a2282647f6078e6d0ab2302389213e484eefe706ef084094971b98a60d9da273071063d6cfcb0ce30280564457f321a1b477b7fb4345b2da4359b671fa0bbb5344b04395640397e92d0dd45bdfa49e247a8bb75e8d50bccab8a5706d2ab5791588961e24fd0d6eae1e141af1326200f0c4fd01f973838275662bfd5db4892d36df65ca7cd8a5eda9b8b8f4b9b1dbc21d94b82eea5bd7dffd11b17ffda6a69e2e319cbb9d559e2fa3221771d296a32f48de30c7159e7273ec693f4bff3c3b55bb562f99874f1ebbcb41c7e141c320e3556dc9074830d468460e40446624672144941110b1449ea0f143ffbd37229bb6ff371fc1767cdf158ca66d58ed35b0e0ad1c23c7fc0a765f133595ec7d3e653fc3abd55e45fc6b532bc34f4719c5ea97f403840374ddc75cb14e947b266813ce7c301918ce3047a3c7fc049de62f8c5720ceb8d7ff7f348efc45426f4e1cc3cc599bfe6b9ce4c6f1c04dd95ebccb8dad0b3ad5f9bd805e29c5b9db7c9e4c3325be4a6bbfbcbb45969ebdf88a8d1df8799004d119f9669f96952fcfb2b1be93c9a9e91b0c5e3cb3f1014af0dff3a08faa4472e9675d6fcef1c69aea593b3769b193b9e8965cc91662d44fa90d666bd89a3a5859466735c5ffe79a5f5b1d3699bf7bfbcd931f5d1dad82dd36be9257368334af3e9627d3c43afd4c53fba98fa90afd6f3f44a671f733ccedab51ffed1e3c70f1f5bdd66efccf1d74a8ca7bf14ff40d041a326e0fceb7552af4fcbde1a6789e5f18754acd4ad2d0bf96733be5466c38fbd78ad57eab74cd63ea7daaa230acd3b9df87df26342fe79cefece6653c83f3c7eadb4ece684c00181fb4137e7836eae07dd5c19dd1c0f3832bab931ba391d747339e8e6c4e8e6c2e8e6c0e0bce8e6bae8e670d0cd71d1cd6dd1cd69d1cddda09bb3413797453787453777453757836e8e06dd9c15dddc0cba3919747355747354747331e86e53734e00410388150d827e9fca1e000409f171f83420970bf679ba5c3004b8dfe6f8377ca477b98c044152048588cf14ddee2a632fd230ad5476a4bb71306a9613e310e0cc5384550bcb8fc16e263e44fafb5b8e74ca6c682fe9399c64cd023590cfaa6978369116e7b71056b9e48797fef0adce9a5b5b448434997c1623cddab5399c4872fe923effda5a4f0f9f552a8a9e692dfd3ef978fe047d3d3d6e6f843fdf620ee2e0b4bc757323b336b80fd031f52fb1a5d1718ad3eb14c7a7dd6b6536dbbfe1d17d7c0b6556ac4f648b9ad4c229e2fc417ab10a3511e78fa5d9d4e871417713f5aa87ec6f4e25f0a881f460f48a4785e9b751a552a96244ea7596fe23a5dd3ffa4a0bf3cbeed38a867c9eff44438cc29931cee1bcb9dad027c5d892352af4e12d2d91cb6524a4796622c7d3c9d2c8da252e571111dbd79d05ac7610d0dd527ab5e3a3bff0f646562ca7e380b6afe08de7c73a2158e90ca113a4fbbb5fa9ec45c734e7bbd96cb3e39871a52d5ab6bd15c77102b95c461c4f2f224204c9fe7c16f8b874b78e5e7de4eaa3abcf8749af7280f0edececb47678dc0677701c6708bacbac4bf19c0fe7c63fd36bf39f20ffdac4733e2ccebfe27bce87c373d3c4733e180cccd63e01a7e3cf33a4b93e2d97af5cbf6699b85c45365bc9796d437a9593a599004d71725e9bdbdc4aa385829607ba7b4aaf5a44ddbda457ad940d4fa0c28627badb49af6ca0d9d0a3bba1f48a470e584800c3a38ad621e2337c4cfc03f363d8fd51ac93e65ea9836f34b3cb0545a441a0cbac3f2e67f8b11bffc2176d78e3654dacd3c5f997c773703ee6168f13cc4f549b80d30edd3888c373d304f41c23447c860f14029f56f48120957d69e9d15fd29f96efe7f977768b7dccf38e8a278d7aebf1a491feb45c2729749f9c48efe21bd9a34ac7718644d5d25a8824d6277189497bc55a89ff8e9686ffd2f26d862fc272486fc67f61e32c2b8521cd5a770bf50aa789eefeea1cc759a7df273dd749ef3cc295ce5c2d908873715e6da58ab7be66c35c5aaf7f4467feb40c837db615560b916ece7057a519bf583aa64c80a6ac6e986899f56abdecee1ddd5d10dd5debd54dabbb7eed36c99c1b14761ca1ad5471913a952a1f13a02998fa9db66ab341e21f8952a120e160d0cdbda0bb3d6e0a2344c28f82c779642f49ce6b45d06d60c790ee9e1e5e6236b7d85b7f6463d36f73bc7f64f3e3bffe4793e62f0589ce88efb11d4347ca187f1896f8bfcc75de3913ab0d9db476f4a7e55c5a5aa6525431dfacd2bf56f631c7d9c5cf7766ecb93e1d43af16cfbf9e271255cc579f2427cd33add56ce88f676cfadfa7d97c56e9b5b22af371d2f049ec468c423bfe10a94fb3fd30018013a0db1cff497707e9ee0590f6d6379ad96f63b58ea97f69da79c1590570c08a062474772d448289f5b1cb550b91563470d1dda85ed18045cb5d19bfd81c1364e8950d163d9f6865e381762b9644476cc4ee1ec22f27dd587a55334677e3fbd5f0b48553763f579af3a357355ebabb469c5ea7ff757bbb459f51386347f4c3bf7e1b3f4f2a7ead46fdf6b4ec20e8f56952a67fcd862fd6d2d62612ff3e660504a978c53fdec671be4883fcbbc55cfc8ce712ff70c46fdd32ad65ad66c31bf191a8cc5bf436f187758e33a6c339e18470383dba39147ebab936e2721511a99666b2094c1c6d0c66608af4fed5ba8cbaf874c4d46f6f34e49669ae2f5217df4a95fb562c31952afeb4a2ee2ed2dd41e836ea550c61b74aa58af9542a550c0ece11ebccc1b9fed1ebf438d2b1f4fb7068451d1d172673a6dd58c154bc66332e81542a554c77dbf42a869cb652258f25fe4ba58a7f1fce9174236bb3675c5e797db541f865c5928806747b2522154ba26e1c60db23b1b688d6ee3bc976e826cebfe34b14123f4f1a5a8c5f7648fcfb4fb21dba364a770a562f8469a4f74a473a65363b8ed3b3ade3acf733d2910f23bd4896395f7eec1fcb76c45f7eec37171e701f97f7c99208bf3e8b7f297e11961f8bd5c660b7303f86e109bb9febe74a617f347fac365b8d2a944c6b74c9fda326f87eb05a88e47279bd6a61caaa851fee122b35f296bb2a9dd16b7dc9a451c4af334a5467f4ef1f59225aaed4925fa3454cc8da4d22d6d2c672d9a49b734137d702d887f4e83eae8548781c27d0ad4e26d61641c9782eb901d3fc331769907f618de65b02797703a0572ccc74ee55af74ece0766ded6b3eff88e67944ef8b303cc771c2f084d1c23c494cc5eeaea1573a88e8ce7f73f1f13863769c5d4bd684ba4d28161211badba7573a76babf59a52469afe8b731d71f29f6efcb2fb1cc26c65ff3ef8162570e4342434f5e52563a665aaca595ad56504277e3f46a051a742c1556f0655afbdb2b4192b14d2283656c692c156260a580052b0522bafbbba50ddfde2856626b9fdca4380f1e3c787cb737c2468a88602123b73762a5b0d3dde34895cc60e4f64a88841f25c719dd1f2b8711dd0da559398ab072b4c042410bb7e2d72c1490b0701c0107105838bc60e178028707583878e8ee25cdc261839584bff976ff887e1f8fe700e57c387f44717d12e9dd310873b9424c6b2e97a53012837ee3e2f11c1056274804bacc8240402cd612dd1f399fe67847ae5fabf6d2a3fa7e7bc55e0a8b6563b1acf4673499b0589ea5795e52f662ada82862adc89edd72b256374d1369484b22d68d19b06e14d1dd1fe8e0b540f408d2b36eecbc78638665838acff655c6b261816e1a9e341babee6eebb5094d1add2c1a2a34d04d5376378b4648777f2ff19f28115fb440ac192a88babb3b87234881f17d8abb159a030206fe927e8b5d802b0abb7b364b4609be5ff8f4661a0dfc4bcb565633ce8d3f1e2712ffc0daace097b11d6db521ada28c8238ad1bd09fbce1bf9f6b98d6490bbf16ce9b9dde3ffa3127d36674748cc7f145e4915e9c7f6f3ca4a4cd3e993868a48808982bada563ea5f2b897f2048e41f0ede41ceda8dfb871f9393c9cc66cf25394eff82844a596d0e854f1209d9222cfe0fe5d0160105553b24fb27f63e0fd50e893f8e54062331cea57dd162d838522398d19db5bf4e82fc2022329ab5d2c6e613ffc227f12ddb2009f203631b242afb4bfa8f2044442efeb7a3d249cbc16341df1bd9a310888667920f27e34bcb17477b53f30fa7d21b77e11a9c9c4f73750f58dc0984907250c3f2cf76fa451bc258dc0bfd7952ca02c20b56230116b2ba8beec6239df945d8bf8cd55374b39a89ee86b1ba88f049cceaa0ee6675abef1b5d6b83c96496d5ab6a2998c66b84d1788d29bad760a2d798c01a5ac6ee5ea34aaf91a4f31adedd222cdb11874982cb55f4e10bc20c09e342180fdf4fc7e57a4218edaeec3d210c2f06efdfef01566d9d40075af0c410f16df65e1bcbe5b489b646daec9922bd11f836d63b2d76f1855eb4433f414f6f918b75ba5cb15a7981b44880ce3b649cf466ebb15a79435c92309b2b8589f543fce2009ab0824c7bf47c3b393131e7e9cd3529e19344f7eff370cb749cf95a2646e1231559b124cac1287c1a1010184a48427767e9d51264d02d3e96914e59c62e97e33266482d167eb0d894fd25bff091be164e21f216916b918ce304fa313663f0fdb04ecf914e78712d448289d44671b960392c2f0cc368304a4e1889f1bfac7e0ff6ca6021a6b59967d0cc33a80847ddfde568c95973b98a60d3b73772d7e73992b3a673edecda7b1f5f2c6414da2546a1ed3e79614dc1b3228277dfd8e83ebd40c393e636dba16e53d2ea0c26583f8cc00997ee9ba7ccff451bd2f0a40d61a6db6647d919e3ad4f135d219dd9256774428042085b84200a21471090d0dfe31cbe4cf6fee22b7f334f919bb98936e673561f024bd21c0a7fa599ace5f89795e66a431f92536d8ba1c514ddbde3458a38ce4dfdf1837db2f131104c00840374f757d4a4c913a0cf6f319f4692d8be0221c987cd188119a2193d61fcc0003fe8f103191f80e18319f8a0071fccd08319f4a0ec818f9ec1fdcbf852bce33e2e7dfecdb80c80fb87f3e5cd37fe47749ce50ce7f13865372d3c693e8e13367fb436e72369f87d617e6fe19fcd5b9db11635ba1f6be1805f52d0eb1bd509fb3136fd9b61195a94a18132205046d0275a5afeda0c632dd3becf5db9ceafd10c002142a6152afeb43c7920842e3c50000f86747fb7394e22cff9c25b5aec8ff447feca60b6af304c778081d50ec41dc840c60dc820820c5a7fa0638a037e58edd04d6d5d6bfb7a1b4950689cd91681375e624c3f71e6d27e8d662338414a6f05296fc6e01963a5032f84d0810d3900930310e4804a0e847230440c34c4908118578c1c31b830521046963072e8eeaff63f416eabe78c239e7e9b360c82622dc7997119747f36a337cf2a0561b6afb06a5d2edb0fd5262e5711e8ee387b8efb3761758630d073dc5d4fbe6a6976a46a13e7df99f3e192acad718634d35bc5fae40779ce772d088a4fcebffeb196d332a6f7ff2201c17a6fe2fc27f7a91330c600e34b77db2130c8eeef36d22130747c41457779a958f40507be98d2d486e9ecced163768c7901a67126bd50a2399f5ba623cd50826ae114a05a38e5cb2f75403a326ff99ab77c1101bdacac0a91744402f4a40b2fdd0552f72776d184ba5c353c6d5de8e876d793172d100ec07437a63818e3fbc4d8c7e4491a5c3cd16da58a87586a30f17149a5ca17729180eefe5cfce722887d5a1117306c2186952a4ea5cae7da02a9bf2d8ad0726ce614695183fe7cfa8fb1896b4c76ec70717ccae4a8fe0d0ad0454fdeb213f1c53b434c835e48eecbfebaf8d88ee48bb34a5df95a12e9ebc4934673c773f6e1fbf9a16411d45e5f1469ec5a59a59e2bb5a41d655820fd602c74f491bfae30631ca991ce155efaaf40eaee2b5ce3b4cd2be2fccd68ccadcd78c78fb159747f6a60036bb36311d74ad132a9e169f3bca34e207cbfbf93fc4bead4f0b475a68e06494d03910638b4fbad8cb95c1868562986d2dd99babb5277d7755cd76b5841c587732d3d9ab48f615ab302899ba1bb7de855155a5871d3fde1e07fd9b4cd400633b07d4fdef2ec22f9c2c733c0b1590653b47853b344617d8c1f067b7af3ff955501822f5b7b5f3653c1032ab47c8f272dbc25e9ffad5b9db69c9abd322ac4fec2920a550ca08841076230a5bfb78975de9f553bbaad4f60b003181cf161fab35a2fbd7366845f3008619003dbf1e6d2b6ecfd1e72aacdb1bb5c45ff57f68214a630630a23fafb313631ad3899fc1813a029f9463631d114485e48f6477c1a9e239114f10994fc4419db25199741e2dbac588f08b960bac00617e07041a90522c893067acef7a2b54f429b918e18c137a25a3885054d60810558700016f8e86e2abd92c20b29ae90228b1449bafbb3cee36b16f318522dbd8d4fe3916de581e9ebc559ab96d696d1cc4fcb5fa6a01dfa6ee338af9de11a585f9ff8ad71054fac40ca0a8254a083eea753bcd376adecbecc487e8c29a6cd68126b8b44716c920217a4804c8193287a108515515c8922070a448082190a7640010a0a25a000bb3fbf4db2f699c2fe65b75bf8b19cafa7479dee1f93597fb90bbcdd49432afbfa31d073be1b9e29a05feb2d9b411c9cefbbf1d64dcf14d03f46deb28f2395e21fd2e76ac38c5f043de773992567e81fc31997b43ce29c7f59f8470e6270a4fe8fa466c719dab1c888112248f627e317bb5f2ad567b3a32c535a2daf68abcc4ea4f7203c0e83bdb5d95176ffc8fa9769cc878f632afbab52a9a274e7fbd5d6dd42ba6daf9c50a3f1fd602fda50078b8fc5bf717e644985542e97cbe5841077ddeaacb9387f302c3f86e1cf0439da5d584a9f6c5074e2e124c437abf6dafc6b96c83f1c2b312dacf3fef4290af1295986a175194c7c5c7ea0cd56d06dc801f4bf3963584bcfe487e1c4261d3837304cbfdb1bc16a9ac00197b4a226bcfe42128c4182223e1c2640539e962f89f499de149100874ffcfc9704a380b42212acd0dd56d66404528c40fc97e57022e8d29c08b8701bb8a10a9b248c4c40ebee2e468bd822f0a00141e86e6e890b70c0090a28a002487773371841a5491106a04014ddcd21400832e0dc13110f7477b7e4c80d3d40c00e042ca1bb4b292c000b2240a04b1436e8ee93041c0086d3c2150687eee6ca480203b2a801011e00e96e1312602a02b4195cd14177735ac47a5e50250158c4e86e118022d0d1142cfa32c68e2f5f7aa453f6257f79a13b9ca45138479f989cb4fb4e1cc78a6ef397530840d0b34a7369afcbacad2d23449a04410c97cb4848c758e984245f4f6c91584bfbe3727d9e37a4c1f1f479cb171118bebd12a22442343c93d43e0bdd6eae477e0c2b94e65820406a7cbfd60b9f389fe6728154fc9fc83f107499c5a1bffcfb6a8b82fc6999defb47d6ca6c9f5867584b5beba495b6fc37cfb6923e8e3443b94677d6eee769fb1c878ec53f9ad8c53aa71d63d6e6e2fcc7d38629fefab3d8748bc79971ab85299ed7e69ac5344cce8af3631abd5f7b1af9dfb521ad79ed3390ed87402a9862f1da2ae4df1ca9f5faf21bfca5f8f7f4e61d99662be0cc3308df77025291515a38df65d6e78f614e9d617eec7f6d0823b1bb5cb421d25b3912d404c8e5c2b73782c1c6f16d54ac80209571a4ad1c3b2b1dff119d556bb1e3977fe2f854867d0a79b7c5e397f991a29fdd4903c24d9cdc7ec4cf344669f63a79653b0494b14d22663bf49a554acb7648ac5092c092442b89951734bc64e1a5072f421640423ff1d6077a4e4eb5deb2c0092c4084ed6b058e5460050a2481026750c00214187372401c1e1490994009828432759badcdba38692f2345444a2c936c32812813a801892e5a54aa7cd3af0d699e359bcb59a728b3dd0c4fdeb2915a3805091824a045b7952a11b0e9f2450dba70e9f2a34b0bab2e36208005049080c008011a1e7083076879800e0f28f200940344e0002a0e48e1881a1c1181238e34008d0668d1002d0dd069808d113730828b11558c88810155b4141cf0e98de39615202ade721716e73ff11c77771e36c8eccbe878ad6cb66a9fa92be7cbf58f3e108788a7f4168fbb9ae808e110b90d4e34b3e34d13f0c6f37d27fa310789071e6e9a802eb335f838ed2541bfc5c20f2402fd2f0e2ddb98b75a184fd2afcdb1d949289ef38138e338dd0627ba69654aed636abb4fcb4dfc037940ead3710b041f97b3b4b771d60a0547acf3c65be0d72c910b847dec366ba0e77cb7c9c4bf198a4f7330bd16bc3687130906713992de1a27e82e27dfdf29f4f1788e4f19cd148734633a670d0613bf07580e67fd1a54018328c25aca32957d60899e1ed46d39cea3c73299f5da8f9f01f1efecb1ffd1023805a4a1802c148000055851c09055029c9000261230a51d97a313cff96a87dcf513e4395fb5345307e2c16d701e6e9a7c792cc779444b2cef98fa934fcc93a421cd77924fcb9666739c1bc7b0fbb47c7f1c679833851250031160ac546951a9f2d5490413ddf309115688483581001101ac03a4e0ab7e1b6333662fe998d63fba1fd659ef1fd99933f14f7c92b4f7864b7b7f56a788934b4b8af3efbcf96ee32d668408ad570750c10050ac0c40661ad291447a176fb366997c5f2b6fb376ab5c76407bc5e5c6e5a6bbfd036fe3a5b9bed1ac398fcbeccbbf6aa9bda4dfcf78ca7cbe3e5a38495c001b14c08902c40a30d3aa962ca78b75c66c6ee1db8df50c0a26b6fcb0a5d5a49336634c00206e544010049bbb01e945201f22fef8b1397ab5f465e4a9e76bb3632d556869424b17bfdd5c1fd3140eeaee53b3c6e0418b0c5a667a08200cb1c56a082bc67904abd74aaf86c861881921967030ac5fabd9f06f9e9986a5f8b7148207214c417ce90fc4f19628041e4d5a39041cc709047eac96ad83eee6a15932e040104382a8e9eeef555214dde07d5abea5cc6f75beed7e96cda41d928824d5d0ddb25e01214583dfcc3308f46b652ecff966958af5b1cd2e8e36cf26492f103e0071d34fa3653ade1f40f04352777b2ead0ece3beaf7b512ff931f8c3ce9950f67f4fd1168c728de39fbeb2d8c89563ebcb2a491250259a264a9c9d2fd819ef3e5591345bf8df7497bc35a38859c35d005829ec304680a13a02978000c580d60ca00bc1ebeb4952adeca6389e53662dac3d8c3cfed8c6e2b556ee358cac4c79326fe91addda0b849e00664a58adb0ac2de6866b04e5108a90948394032407747e915528f568d665abed65ba24f9aa9b7c4bfcdda6d8ad78de0dc10a985536c48e86ecff3deb755615302364e778d96e695ba6d6673e254aabc6c322b5bcc511a7d1fd6d27197f8622d657f75703992b7c4b0561397ebc889a30450a9f28d74226152445454df68163dbe2fbe68c3bfddc4a7329aedd04d9cb93ed1ebc346d7daf2d79d6fe7eb39724b34e49f585b3f89aa1d71e9df6dac1683202ec1db05710bcb64f6c579f1d76c2e7ffc0389c0d2eee03eb81b314264e619e4adeb2d234464e31311a9d11946da2bce3c833a1562b0d22c9b143d763f3a1fdd2f5a98670d5326d9da27df0325aa4264ed263942d66e92eeaee78de0cc447a632f6f894244c28f82d3d3a3f4564f8ff2e67ba01846c3521361ef72c188384e0d7beb93d6ed50770df87e3a3a383f9e4786900114c2d8e2860b00a107552ce105112a29a080f04a10c32ac1150c7014f4d0d52398e00502f0e00900dc20c09208d41441d3e3000a34d1448e11743c40470db6e040d00f36283a40911ca03acca06d5e1e9e6f27a7daec8dd1f0a4dd320dbb072cdd14e85680017474f7cd0c5dc3ba4fe8c677ecf1f17c3c39e3447ab10ac1c4fa3f9b4e669e33cfa0ee8e075667749cb0efe13697741a4960a76aa93615e13ad5271697ea1bdc4905ce06e7f5988074e908530ca9cef34ea612c7f50addd75d733a986ee03a35e4d45d731c57ea92705c8aeb38ae84eaa1e33a2ed5a9f084e3505caa3b8ee62b7528d44d8c73a6ae3315c19938ae8be192d071aa3e71a6aef41c77a5e3b8ce83d2b9d0711dcad47142e8380ed5713a702b705ca9f35c702aa56c702a701cc77542ba14bc12e78543751cd795605c678a51f9e86638231e77a2a154844b759d89a714d3751cce0d1f6e00261e9908746dea2e039ca974633a755ca94f0ee076c075d7abd5aab9e64c5cc71181f33a1e1cd79dbaaec4713d381dcee366baaeeb5040dc8eae3375dc4ee99361c1ab81a3c1d1420701eed4b1c099b812d79d93ce6338537714d50e720928758d0bb8c601065d894371a61447c395ba749de72a71414a5cd799bc9b51dd70278e4bed987864d8e1ba1894d7a538cec5751d182514a7ea4ca523cea62b39ae94c3a9643ace4b711d0e5d0c5d0c1d0ca52e35778343751d47635a954c1d0b5dd77128ce24e354347032a78e3b713680b8d0050025a3eab8983793ea381d388fe34a1d67e29270307442ba173a992ed59db812d7711de7e260e864ba94892b9d4a1c07842b71379c8a9be1386e08174317534a719e89eb38cec5712815ba1c9ca9e34e264e4827c395ba18b852a9eb4c9d8913d2755c0b5d0ca7e23c53c7719c8b83a18b4995389367e2380e88733a7878444a369cb812a7e24c3a3895ca2543c58518b8194c5cd7a1bad473ab14766492705cc7751cc7e574aac996b206978694da1e850c33b08892c40e40006592b14344c618fda4e68bd621892c5e8779453b49220a0a38a9b14d9a9071258d2535311c2107325ed81192840e1d21d386078090414303909a18ce870cee093ee01a15f0f130fd814e8821075ca26b8da101dbf21d1e367869a12103e83332f80a38da0b0a561a3c31a0dd344477a9fb89946e25f505282d31009841922ae579a89818d449a604832a553a955298290a62c8c6bb41c578414c333738d34c6a87995ca229ad4e5d0c218124948d2ea532b56860080282a4982833a2a9652388ce870b2728260e45a40549459604b186e84c31a625384b481a430b7772b164c02188ced44229678b241bc84892c18996146efc10a09443100548624125652687049290a4407a3846094944b22a07d088554a55a23919990c4044109e8955cae911c40f2ea0e2c185160f0c046c7432271c58292126254fe58b10289c6e6290c4d480aa62e2911222c40992c841882c16a0a385265c72802992644a191243d0f4dce09c4862c12788989410548c67a304442887120c3148524108d11079495c3882244695648648247282a4154c2d9f18940b051a548ccc111b01682029c64b12430c0149a7d2eac4a17440c59c86a078bc6e9029553bbc24a898140b34412a1a4c43aa1572bc50430b2af0f06e869ed410448cf7a57ad0f40022e42435634ab57072957c5433a61d8e434a958a31e99c949882e0c09d5c28d59c54d851796149c891213abc1815544082001a92f1e1dd986830d180ea40120f1ba6a0930da7185434985eb8c153824188a44f872bc94a39a6d2690036026880ad21000116527c094107943800103e206123d987a000aaf030250a1422274b0290c415a4c74d0d0098c14d3078c11a689cf1831b8c00c0a60516525e6860c50634a0c3911b5c30a43023839a220a283eb0c40694c040125e2800e56687ce878404d6500309311ed020c20a60d688055099912131a9251850041095175d70600997109f1572c8c478a9175c70c204555e6c3214002124472aa000031400c7183f52100210740008295180f8e8c861ca028b23443152c447954289600b1423b8c0031a80800158a0021558409321234376cc704ee89ad08131a5e144e8cc30fda023e33406f74587838e0bd516335a7459745774519442d01999ae703478309c5ea061a15ba14b81cbc142e184a363712b938d4ee614d3a93caf4ba54e9d892b711caa696e945c28a920c9948024d312140fe752490862a581a4d3692655c317419892e031ad30a38407500748322d51a910f3828e2192543b987828c5209351331e122f082aa6344447cc690649de134939aa04a10252a28011667490745a23e934d302174933d94605492a1d36bad49093cee9082e29c8b00001214c4424dda8b95153ca61e9783a586b0871b2c10b922252ba5122e229915462c2a3838a413191549241b5606ac9f09438d38ca91583e464436a07540ba818d495991c3339543a542aa476283d4108540ba52f429ca84802c01553cd610080c1e49ab9816299b8524e09c8e484460554979292722135744ac1068792299d4c33a552a92ba54a5e4915f382a9948292c271c3490c2b854a71a594c98749c7c4792c945c084225c3c90349369808828532b9e0050961d281103630ef35c2fcc08b2eb2c0a20a2aca1911038a38f273431120b6a241049d1dab1b5e8a0a0f4d86d6a88116369061013b5d208083047480832b62b0022742b0019daf8607947901f826a1086984b185162f2801103f08a00a0f539a0ce5804486185650210a1400110210fce0030c86176c95c1860e7280a596b446982528a10a95155460e120063060c10a9c30810816a00003c004b0839426434257d400063448419724607c71450d62f08215a840034a2080004314210d1c6cb102154431022d492f0a1d61d1a4d183327450c50b500045131c6040025e8409a00a1529424786b870583457d4a00a0a20c1002d2f0a200042488e0c71d9a031750fcab8a2063280010aa06842041c3042015aac0440a8c81017101f3c383858a65ea30765e4400655c0e005288042041c3082010a4880961dc0ac54b941e753c3094b94dcb021c60b451081802952762e900004dc903ea05aa314a67bc2c9095d133c0f983ad071a0db00d7d3f19476b84f26a76443c95590a17b817321d54289054e8769054e05150a38709456a61b343656342dccb020f3420c4b95f250a90e853a9d4a5c770b313447a597d479d186b4969d049a1937d3a0a08d804604e837ee2fd2db9d77d2429f341e58b4282c5a926e908e18c78b10f19b22449ca68346d36de5fb3e2a6d2a75cdc95e20fb22e2c88c906569cf5356c5915e7c190f990ebf567667755e2a6f06bedfa585b56f2f01ed6d7925bebcb9bbdbe9ee74babbefd4cdf540088f1bf17bcb9087102141840011e223e487101f427a08e911c223644788902041820009e213e447101f417a04e909c213642788102041800001e203e407101f407a00e901c203640788109f203e407c7c7c7ef8f8f0e9e1d3e3c3e3b3e323e447901f407ef8fcf8f1c3c78f1e3f7a7ef0fcd8f921c447101f407cf8f8f8e1c3878f1e3e7a7cf0f8d8f121a447901e407af8f4f8d1c3478f1e3d7a7af0f4d8e921a427480f901e9f9e1f3d3e7a7af4f4f4f0f4ecf408e109c20384c787e7078f0f9e1e3c3d3c3c3c3b3c427682ec00d9f1d9f9b1e363a7c74ecf0ecfcecece8b357cbf5a59a9c4b46e626e7cf001b8b7625a3103701df1057c3fac936b3277efee72babb56776743778327083f80442884bb40d05d312d107497c78038ee59f6e30d58a44877c7235c12b6ba1dd31f5d38644187b776ec30eaee706264b84a26367baffd9101d7cdfdcd8eff3b7b71f6359c57767f2693bd0db305fa47628bba1aba395ab7d17c293247338cbe36ecee00d0ddd1d0ddcd6053d3b90c317030742f74772eb4a0624147b7820a4fa4e0439763c9aab341147e14f1ad7d629b4f7a788e5cae9da35a3805d6dda1d02a1cac557723e84977678366260751929846225ff989eefc11a8bb8d429abb3b991a9da3912e46d579dd5daabb43b960b0a12642444f8e44811dc9e1f5a44911110ce622ff955c29f87e21a6359d10d31a52b3aa14a1bbb10e2dfcec795ed287c85ef409439a3528e28b4fe50654ba50b12c2a2bf060041e2ac0430e3b1881b58314ed6ae1276f953a0dcf8c479c798377789090e78f3d11dea166076e8a17532ac09a8234c5c7946649c1428a01a438e97689b120cf01416f81b226a2500b0463419ef3dd6091c26e6fa404dbf0e51883f8f646209194eefee8787b2551a8188ae2a5c58f420e75b78e664571f2919486a3d0d00d250850220065497fb6627ae3f76fb1f0a3c94456911245518a50445f58445988a410c9b09e5cf1e487273e3a38e19b55eae293a3ad7d99edd1745bf4e14c4bb1da5b7d7d3837565c2e900acd8a75660ac54811111d4ca083a8c30a2c275df427e41ff9352be00c31fdf238711311b09a04d1e435844604584346b08688b0865660320316130530a1c2046789164b8258a244891a4a9a6029d980122add9d0382e3c4e29d34ec79ce96f8d465658ee9670584550bc55d601e27069d876dba8ecd65d6432bfafb872b9d33bf85efb8f6b45cfef86705b4c1ad8045469ebc15b95c46c2173d00478490201402212d424358423149c84842042b490e493c560e39c8c106ac1c18d0dd2d1006665babf839f9ce1ae5f1613cf31441e7f1893cbe19e83cbe2f797ce3c8c389cff0b5987cb7370245a1276f45b75702bed1c460b520ce3ff32ce41ff64cbe51f847636cdedec8f18e6b5b588a9829ed633eab34a4355b6df8e37db1e20f3bb9bd1211df5e891d0a32002be8075019ddfdd9ece2e3d162d1be3e202358404380f0e3a5bfbf3ef16c8eb8d2fba0511320274f7cd223bff636ba5847271fcef78f68f8755e67fd04757fd48ceebe96c9abcbc77a25e99b536d9dcd5166648f5e389cd1417290144101cb180e15c081ecfec06b5f74d9f89885838fee0fbf6e60c10df5061c6e18ed2de6325b1dc75266240c23063012e4c314e77096d88efe913425cd2a32c657cb2a52042ee2a4fb2302e6cb3216111010a1757fb718907f9645e46612214d2695f6405943c0b08678216fac21495c6673695fac21ae1fb8ba7c20e836b35c55baf1b40db968600909a3bb3f99cdb44c8a9325240342a6747f4edc8990d5378eb386ddda2ce4e4954b329741bae8fef09cbd0749ba16cfe62873998dd56cc80ad23331d2ac7921e86e0134ab8712dddde33c9c9ce40c496b87783ee0441c2d0bc8770fd9be02b96101c13b6c68968f15fdbd583e19f099f265cac43f9f9bee6ed60f30fd3deb8714e2670bc4fa81d43f96fc50f98002d5ac1478f8f0d2fdd98aeeb37c34e9ee2fd3da11217cbf67f53cd13338ab47a7f18774c4b059a557e74b2c2fc2c23fd2c1d5eaf0f0cc9e1e1ffbf1407a7ef0f0ecfc1022c66240624284c862ef2344ec317bcc1e32214180bc4e987179756e23ed814e7c3b9a4f03f24f1c292df44ca76dd2a323fedd327c7c04c98bc873a6349152e42fd29b6325ae5d9c6fad2f56da5c4b6fbd7c36c799c338ce1a91b5453f4fc651b440e25b5b947fa43429e223c92559856635fc2bb192e8881d1ac712c9b54055482c0a82a408caac8c7d90f8b47ed087753ec1622d911cc9760843a942f9fed13fa1656aab7d16cab79ffb4e660672ff4c6b74094845f6632e635ea9cd8ee3129b5fbcf530833e95eac3fa34172b5ee29f583f53954aacb3c73f51e575e25c491e773df9a2e7999f4eb27411db2ccd31a52f3ea6e1bc8d3fc668a58e3f530761e37c3c8ab18c2d9058c3d356c3538a13f1b1d4e9629d753a8869c04fcbf686b3e660cd517d98ab24058d32001000a4af00689cdb1bdd74890b0d0440b23f2e97f84836e6725d9bc5234119db1a2c4fd893b70cabd98b44fc59a5d88e4099fc307c91b59ba43ed904c8f64364ed2699818619ae3f6943f16146f36db559352160d924b109620383e7e96e81f0fd68b5dce9e9e9619b4f905efc91a4b7a8a707145b24623b1265a41fc24c1e4f9a930fba4fd66e92518a88339e4b5e36895e374c836c76489c9f044814c27349d0ed958822bd642d9c82ef3bc1ff7ad1023d9148837e369d601a9e49eed75f82c7f125be383f49888509965a50c673c9cc3308e799712e491a9e4968782679d102d9e693fb4736fc0b9b580c3f480f4f901e1ea319866fe4f3a307d633691846c39396c78961f7c9af760c61f7c99f5d0c1b5fbcf34771b4f7c9cfb7d89de17ebec5fe65309b61e2df2cfb1186e76c5218bd4688d4c22944c28f522d2c8f9396632fe27f9948ff88ce8c18c1b921722b7f927c16423ae272ed1cb95cb51009e38b6fb663b617df9186917cf8d06b2baefdf5e1434b7c44451f3e742c6b3e7c68ac14e76cf6e38fb3990f1f5ae23cfaf0a15f7df8501f3e949cd7d6d3a3ece941b1e8c387f680e57df8d05c43d2923e7c680f39f4e1437b18431f3ed466ef0c961fe79fc1fe33ce3f83e5f02f152b85dd2761b01b1b67d389f8782ec1e4bc4538cfa09092b648d6c4caaad08b16e8af93db2bd101df5e4946faa1172d908cc26eecc6647486ebc3878ad38e3e7ca80f1f6aa4e8094e07aa5ca83430cbe6a99e658c2933032202000000d31100203820168cc60372d98c3ebbe30614000473c06096569989c3308929858c216440000040004000499a04e65f060cf844711ac373b09a503cd4e849b51c68d1fc750ae24c55c8cd31f9f216e4c8f778ac06fe179cf0f3b9486ded61b894ab7703fa6982d3059ec32c8cd5c0874e2db3522da2d918a05f9ae881d63112f8af296c14e8b857abdd4198ef0429ab297429f14e5dc89868a7f03f68328d996cb2a59652c2b68c51ff3ea73b3895582a5e68a198d9e54dffae5f76b3c27a95fc2bfcf55d028c8132f2201cfd9cfe5b4b546166653087c65b4e4a0c3efe1c34dfd33f866ee71cdfadec7ff573c4566a02dbf85b832ed860209f12a8b4be86c566f5021c055863ef73ad6a59fa8ed349f1ed4327f0c2527586c0216de65024bbd3354edb18b5af95705f2d16571e911f23d00b34eb279d8ab9f69e7abb6de5346356d43531f6de0caa7dfd0dce7a406d1ca305dbf630eb23dcda63f3eb166a84205cf5715c29e79e1ebc681b208d44b6f135d202bd09834fc0da282c572259d50b02bf6800caaf53beebe064628c0be8552570f74b35f6038e5ed20b79fb3096ed774af74fcb0e7f96f4a84d02e1ebf80c357dbd94de5f457f928c5b81723b02daa417430ff0d2f40535fad1e704a11d4c9d35b2cb06d0852e4e6d6ad089340afc4477fc4be8ed361f077e7f5e7fa764e70a7e74874d585781ed92e6cf52bb6b5d50aeb2d6f982fbb83d21c76135f45ca186de532579249787baed969768b8f903e366ca4bb3da212ecae64919eefa02b449127ebffcf3686c73be2ede100f7cf1d2e403b7208fd58b7e0d0c919af760389fad1344f169276e62fc2023279dfc1059ab16520ec7074f1c10b9b74e7d4b76a39c9ca334bbfa19e7f420bfa774f0340c35cbf70b0cf6ebe7bb051ecd5c93d106d9beacd243017dbf0047f7a6d5e1666d6388b8172f33329cebc97ced7265724a1030423a6d759d3c6a0d8264d897e2aa261d9d80e22f644cea353bb1db081bb147f2b3af93d3fbef3eff89dbf1319abbdd533a55fbcde5f5bb772b00141c670b1b90d597068749872f63653f0d8af1ad6f9c3ef1db100524d6ddaebf51f2bac2122363601da96dae0bfd51d374939fb63aae0ccb7199ffdb15026826d0f7638e684a8c7deab53855784f75a1b65ea174312d94f2a1c3fa6772d9bbe3e6cee9cc0e84c737bb66cd8557f46580a37522284f29c22773941d2ce3f8a59ba336518fa534c3943ce712677acc2cecb58cb4ae1936f687883780dbc113910d2c720aad92da02bbd1e5f3573c50b30e7e8d4b5a29ba6748bc1c852020440df77aad18258e3518da56c7e90eaee01c33fc26af4ab7bbda2658900904ce6dc8f646114c23e2afc83731ff7966eab92c223379c3d3fa810772bbf6d1b42f87897ff5b74ffff0cce94972dd7b80d0a786f5e33844833717d13e727566eeee688f9aa6be5c7016ce671735c4f866aed179ab6efb4812757df11316fd9be88a636d3b90db52c3a45072f495f17c7d520a003d34600a16319c51e93336a72586a017a5de9925297eaf987ad9dcb84b9102ba911c7922f3a05950cb1945d313a6f3d85bc8f93a25905f6e5c60dc93657b309a0687af529b77919b96fcab4b64ec62a6d0f85628f22ed2d6c7b3322da9ada3596b3690912ce6985d07fc83af2440f8ddaf28591860a57f36273a5f38a6ac808a7c5227c66490503aa28007d96e4808aa6a0e57c1435b79de547f7e93bd4f5a0265839edf1f7ce9c1ffd7a0a4d0d283725daef6cab1552afe25a56b751366a7c40641ac01a17a95c34fd733faec54aabff20e48a01a234fef0101b821cd5f2e3e53f8328c83b7c6c09ee3c3448cd9c23cdde6d5ddadf21ec72f84247b815df1d06988aa9101b716732e56d2f99884fbdbd47381381c774434dc824efce25f20150ebfdc03bf7923241b68ae41bce98ab85cd0298a611240e070e58173adf09d29c309c6125f2e39184959581f3b4d32d4bbdf00976098cfc29563c207674808ca821ec7992fa5cae20e9a561608f4ca3fffd40c6e1de948769a7e85435a0aa62aa3e29b147d4c1505307e5c290813bf16164227309cfc64be76aa9e9174bc3064f9d8c10922a9a9d63dca4d447946cd3d21e9a1950bad11696da2bf3da097690401b004fbc4df0b9473189238ddf8ec03a784f229086cfc3f201ef65685ff676c36d8fe82d56756e74d86d5e293fcaf47b14ddcfcb1a37cb088790bc981cd34b8f7f65507b44b421ea87874c18e3a30c2c8b8b5f9ea0d80daaf3ada2f164fc6e17cd0a95faf768d084f12a4f9a756df12c3f6487d10c01cae2f476e5b0f966108c02f519b5e08671018a4c38d2c0e1d0f206467c87c818abf5afa4c9b919dce68da7f291d9020d4ed36c4b568bb9ceefafe48a4d189f0ec613fc7131f93b4ea14821b3ae6245439d1884245f8dada502cc6599333536de6476f8ea175edb0cec2f188902f8ca4f1fd87295a005679bcb30fcaaa068a0433d482e34c4862aa675558cd016f062a42af471402091839eae0c8097eaa1d84af1c264dfc38a39c568c84897f196f3a228a84872a78883c6aad0a18fc77e70804da1d1b0eb86e68c031836ec90972ea569cea4a0bcc2e98aa2a695aacd4ca29f37d11f28075866957f4afc7035d87112e71e8c2fb6e021d4356f156a25a815213eff7783525ead9755543054fb19a894a7b5c3b08898a871487e49882692b5b4aab88e66bc35c0a30599318b2c3e172aee8ae5928fd703b9ce143d18ebb530ffe9bcea7aceff39c66b8f840edff5f9d6cb32c2bc0e4a3fd4ee67a2a309c3bf5c7d58f35db5a7b9cf6a8befbc70c8a9bc9ca4e417c65d92070cf15ef00da4edbe5a399b0990b7ab0fc2bf9d3047c1d45e29a323fac546ea859d2915b7d21e001457c78d69e1d52b582aa2cdc1dc3baeda4556e512b1817d22a98e7139144dc6cae596599b01473e4c0333113d8f1a183876cb713dff7e7e1a00fb3f26d5dec1e480f81ff7a303aa52492e2aebf0483db7bc2cd3f43da420ba18f035a76d236d836d90502614a2bf0904cf64a62056aed283d2fc51882a298bd19a7225654119c9fe60f5dc20796c74d6f9a0aaa1f693ed249e8a7bc043d8c2d3fbf3dd54cf84a90b41257633d59c608491a08fc668554a90bb0c284f5cb7a6df730bff14c5c9b51a84b46addc8a43ba7c006afec8bbd7e2a03b14390d932df8ae5cc77fa242fc5ccd7ff2e964233c09ab0e4fdb4d22018b2d2fe9fd774c762b733f50465e1c7e14106c154ad6eb9133b8d593d66a4a305e0e89d341159fc3234d97d060b8ea470e15ce6deb89ccb3018984839dd1e7f60f1ccc3d4e9a95ac86405bc6ca6b1ccf9ccba0bfc7dd8543c9d4582016dcac4247b3df896f43e24f463ef5779fa0a3ca8e468a39a3fb50f5098c7f37788988b23f4c2ea0e0fafb6150a4edbd7def1026192d2ec531e6fc523a0c57bf3178567be3952be45e2dd27c1679814399671ad8598ffe083bdc060d3414088c019c69e3dee36831e34511d4d30b972c56c9a0e1dbd491ac9a27fa559101de1a544ac71643e365c5662879d9bc00901cc4ab85263f6e97bc7d3bbf02e75db46bcb0aa34e2c51f34e83bc5434be7e955ff1fd670eda0cd09561e502bc235238e71283d179bc931942d13f334fe83d96d78cfe8539175fb377f73b52e9022121094487cd0f8c8123944facdf1050e10e93b42560c9a0111488194ae6b0c1454d7124423fd4e05e3b3418fed18c3d15aefe644b660cd4a0b7ea036231f8c3cbf7d66c18a8e5b7de4cad352ed67f784322a3c86306ce12db0bfafc6547ef9d99b29c497340751460b3a536e2ca23edc30e38fc2bfc693615f52649d21b807600dc8d8c68c6b2ff25da73e2e121092885ae389fea86028ae03b9701af861da0956f00f9816e8308260478f10ab1d15b54c17cf83353ff2ba53ecfec83915e2310d035ac868102e92a9a67520f845d79da5100863aa47db9ad39d4a5b3854d03f844f35fb10c37fdbd8024018a193d2454fb94ac05150cf8331227b2bde20013605d360adf32b8fd20b14a0fc713834ab44c04ef19b83d968362b9e86a2157a4ecc6a3a4b2e3ac324d16d1ad438a5b6ce038d78b64f17627784e2dcb436f4b7305f20f01ef24750a97d0410f56bcf1e7561a05dcd8b3c40f29c66506f88fb8b459bf8455aaef1d4d50c2fc596bb8f0b2fac8007b9a1811fa7e1519f3dbd5c3e6f1007b7b85c9204120e0fa21a0d21489d2f5aed7a3d93439ae4ae57d32f68bef468d730c44a14dda693d3904eaba64a4ae690567bce8781beee7dd7259860f2a169f50b75e3f9a397f8197c2b9eb469b43452dde9ff0cad7240ca4c661e7f88b18f990ccc7932e5bba8691ce9e8e81e8dd377242179c57a41befcb4d0a17cf9b4cee5f75c3dd21f4313836e1a086fd65df80e3658e906dc4e4def12654268987a5bb91227862d9870ea30538554ad37b00a4387e592dc9609ecce84a78b7e01ba0930413a7b6a4c009b88d6bda93d889b7e62571366b75164d2b91f8cdb273b5d26cce0b5176030556e9307c94f52c6aa6368c82822b3d942c586cf379a86355a07482e51f801da9ad572924f1b4bf41653bf6b8a650067c8f69f0e72aeee651c64212fefde402e426fd12db28aa709d58d327ae39f031814300c83b90025ed6b212b7622873dd68f6ac5c596ebb58df3bd91a5256736a9e31aaa14618a1d7934df215781329a4b03307dd111abb6463ae2d5373cfd5498d1e2f502e9b1136924553779aad0020a313f360dd69edc87c0e145f1550b4c5f448fdbab9b2bfacbacf723f28253032927a11c154b3ed005b573d179bfcde1298957ef135e983c679e897a67495cd08be8d45aacd3aa14c9b4a2c6a60b9d8c0c7d4896557b2121945e30ce37c0a8b2ffe81ff6109687a61eb1b2ba6df607435122ac2ab62352509d61b9631051ee14e57cfb70cf5668227fa18fe80dbb976e00f936d2d96cc2a10183a30c8fa2458d33047aa105f15ce5cbbb58f333209098e9b9f97b00f558c8208cf3fa1f8dc29fb4801532741cd9c38dba6fdcbd305163cad70cf13be4f3fe52036e6ca9a89c5b6e5cfcd9466dc0bf10c96084516fd3f2a6cec5ac2bf039b893b0971766d349d40c55fdd4c9d5c4ab9d84fe81cdd560e022aeebc83e6270d47423fa968134c42996cc666385b24555ff406bb90c03eca409b728bab8796ff37f92d93fa6623718023ffeb71710c18048f358c1d0a6cdb9575a1f585273ddccc83080a1a246018b0770ee48778162ffda5484f9902042b0c486945bf3e087e96564c18d2ad2d77b5860a93d02ed83038422970dbd9e1cefabf589eae05c40057f2e8bd7b817058a1649832421223692382efaa155869d04de80292df4c6c638e67bf9d65612d1e5a6182b1a54219d3660060076f380c9241b4582646745d25b9c9aebcf93b8de04d0ff8a887d508570326f17ae1de7c40310dc7efd4559f5c1aee090e3ab27bcf06f50457649cdba2a9dffa60590418c8e77028e67e9472448f8e17de451c5ca8f5881a4aa25debd87b8c31eef709cb8e514985d967d7105bbc6c8ccb12e810a033ebe0424cc2613f746a653827667b70a6c602c3e3327c42333283c84897cb8b0b5f2fbcadabc7c7eee963dbea561e7aef3c5d830b61f4c1357f43a3a60016efbc76711ae37b96ba67d7e293b42ddd699edfc1e51dc87abceca09f158c689e07b2189662a1de3a0e0ed15da72d30902356ca6e1f0ad32d82aebff19c83ce55962f63bd5c4224902d260a6ffeb070b613e8a9270f60d66f400997217029eab3e12ed04fca8fa6aa02adaf72fcf17c9a57271612ffed8328154ffa2b83f8bbe32ba76591b96fb0851cc410f24c403b80b9f0799642547241075fbacd83a29d1b8845376cbf2c9a46acb7e7242ded09958a6845e30f9f6a5a4d57afc2427a4e615531b2c40b2002009cbd5718d1b7e882ce7d0e250edac95ddde3401fd4a145c9f39e9f9d97b7cd872b81042b286f017f47c18b91df93f03f531cb618665cf04ee724544ce0451ab92d01a0df706a109b953d5e0bccf050bd9b8add80fba268567789c353c7d3293fdd674e6cb267c933db6a8508b9d4b0c07a156a9908a40bc748a4d2ec0d948c25919c82494a091ddfee8f0db345eac55038602c9469a5c12c376cc6fb4747b0ec8a1f5c3b06d4a25fe2ddfced2572051cd69b34d94bc6b51367034f8bec74a7223d03c2a2148bd15369f3d36a68e36e6e99d791644bf4f3f595bbf371ba00cc9096a297cde116a8d1233088366ca61a5033d97053b1bfe8cd7c834a71fd281e1cb0901714d2681a184b24d810a343ce88d5104a019fba67c90eef916203b8ae8f8a791fadbb875153456e2710d0b302fbcb03775a41675b947e706e14dde5c9cd4c230fcbcf460333522f0a9791b15c24a0fc40316bb6565dd18a422aa185327c827a0481f8300435441591e0162b8ac6fa0d62a09c50a172b505322e6b7b1a84aca2586b0e6fbd84a8c409a0f4ad2728bb6a2bea5102eaead23469efa8bec69541e1ff62ec4e01ab88814f0b913fa5638866aecc6fac381643d243dba3f0a9733845ad0aa9ef87359fb2767c68f5b15d66ea0b4018d0ea4c83ead84637e53ef6c80831a266eba9f0e994c4955a2e4aa04f80f8a77669592ac68ee6fd3919e2144f7ba0aea4aa62760ad11917436f8711569848cc4ecf1a1895a8ad01bdc1608697695b7b93a34d0b19a859140449d590a53f52cc0db3fb10ce3a42a437f09ac83f3a5209ea22b1eff355fd245bd23e65375382466b264f3c142f523027c5a52d9f01bd982c1d1bb3525b371890e4cf36600d57dd6c7583d2d0b902ec938216fcb185aed747fa0f02e37d6750db5b0049dcf316909b2f909c70985cd791fe21b88fcafbdb164705b4857141acbaa3f776ce7f0cb947da674559044e4f2d7a22699479cf65cc0dec85af328738290caf87558a206a1cdbd3fe19c9434906781768721f995c4c20287f74bcb23a43baaffbf652b424189fe56073df61a0c660b1d1b2d13d7571bcc5dc3240da13999e85aa938ee91310d03efc21d40948de6fa20c3c425cbd46d86795b4699e178a9ea9310ed00bd0ecb03b921968ba9e7ce4b6c4ccf0b65b13ab0ad38b34d166f8cfc8f338ab90228e7ace84a8334070d051a330e627f0a37140922fab6f5744797c1ffd45d8a57eafe0c355a39dab951000da84598122f0c466f433c062d1de86e53336e5d7f42278dd87c4f5ac44bf193c867a882ccf9998fcf82e3c062295c07693492745372ee9e0705ea65deaaa8228a845a09ebea6d514c142f7747c49587be04d3ad0e609704287055b3ed6c456771ee17fdea217e687dcad26f95ab9deabb2ef5f1a384ee5fec2c3d04d70c066361f4ba843d6a1263a4f9b31dbad50256034638aa68c413b9d6882b341177425e943359304bc60c864b37306c0ae7916573510529cbfcf1870be7a917ea3aa8dd41c7482d4b189f29073b848f14d6074c2540916443765dfc3226364d9aea8b2745c894be19feccb9ddbcb0bdcbbdaa705aa6036e11fc3b0db56856878e4e133f88354dc6a60db11244015206f77e07059438ebb2563b34491704e6cfe728a1f17bb067e0a536abc48c46767661bf09e57e5b500c8053248e8bf4e3c4157e1850bf2ee17730e84effc220ff3db604d6f0c9c80a1431f26216692a338c8a04f5f175e20fab407c8c62999b634451378f3dfc9342a71317623f6a9b612e56698e818cc1b30d787710d86769b4cfe8caebf9876d1e9b000a118e0086aac37c1b34e3fb4138afc38c5ae3a2dc3cee99458b7a1440e3d611c2a2944ee4bc335a6e02871336234ae85d9da3c9be804201931d6310f6035b9c1a4c290176dfc2240354d2fd03b0acfa62032b20382e60025910837e142d8702a8d4bda0091a8485eecd6101112da176d26959c4cd3852082f024f95cf3dc9a5987f6c5e5909654048c6bffba9181b49859b914ec10ed418948f56ed2fc92e8b5b9ea56521767612a745e867603c63eeae9ff7d322b40bde7f579a4f8fc1c2de4caeba0565b07f3b3f9a75db85894213cd7e120b6d2c2f7d1bfd04d58d44b481113f5cd3ef1405aa346d385533727d4e8366ed11c2e3eeaf64342a15e8c7c42bc1d969f3e620f868b14d0b1b234648e7432709a668dbcdd4c6ce43287c5c9c2b61267a012ca35acb43c85c33be97f2643f87eefd403aac8b05a48a77637d92eb7135427901ef76c923b50d35c08c896860844d82ecc7d325198757a65075d95fef930dee6a7167a57848f70164d89c09695cf2a9d746161c2afae24766f22ceb18203c529a66cd812f29addd86c1a2b54a4bb71c81744884e71435e051f09d242261df3ee4dd18be13388e3fb54b73f8182161d128b808cf839251a64e43478d2e128449b7eab825577c28708498d980cb13043d2720cf25560fc338287368e89698acc508dfd70cefaff15c1dc0a8be35636ce4702aac851f1fd24418e147d49dd9ca9e09b3a0aace75e2775078adc8f4de6e682e70f2ce702d3d4145f56812a522d73591599c58d32bdf8fba90ece85cbd3ad49034279e372626e4057ef41b74ad4bf5e6201cd8bc1386be9720ff18701967d539c69656d69ceba995d6b4ab9376c26515ee31c6ab67fa21833466703c0983c4a99e981e7f2abca0c3dbd5221a7f2ee3b2c7a70bc8fb996985e073e023bdb228063ecebd406486e91d3611a4ec6baf449576a702276193bf1a024511fa16b07e7007a0cf549ca47e36f8df0d6729d4a81efda503c00a19f2b3bfdd5c5449f7b2861e682c6f8ee841f3a26aa9e5c35550837a8baeaa32e279a47ed7f5d9115a7799a63fa6fe6eb4a60579dbbd663296f6909afcb5e420487c09b3c1e9df8041a5e278b0729998661c05c03ac8ae7283f39b2884a28897598d3d7ea0f91b42b09dde98ce1c4c00e16be6867153945e2101526498089bd99a2e2b902a753b527e6cbff5f9ad7dfc808dda868e272caf784bcaf7dc40a9d3c31bef59b87158ed1362d7813da47ad4549e42ccfe599160c1903b2e09bd2f294ce5749fa21132c330e4561427aae7c99028cb6b8eed703cbd05fe92267c6cde89680a3004bf811feacc55528784bfdd3e2860bfe3eac3bde6fe9424c9e51ea5d1699e473970d312acd0e219e943e496dcbb9c65baf415c0de9e3dd38f9505e9cce9ba96c09322daaee5a1770f0b364e235df6c38f8ed81c51a587e20a85985757d773c39fcee20ff641475dc0050f5439ec41876f725e5cdc0e0a8b27e364f03b0b6d37dcd45206ecfbf12b11638b1ff8a0a26f59a7a6581113d11c5d9fc81d13ff39bb7a8a430542b33b27cbbebacc54b511fe8f50ac47832cf1c8fc209ac8f90894d7ea02b61c16e5ab28c86c2f858fc84933c304b6e7db69697760dd2cf7e134e562acb3f9c5cca03758944976d618ae01876ea76f585d2bafd76da3eb131977eba37d84e6bcd589400d2ddbe4dda1298d25d04156936022a0485544bbfd5538f3c97fe3ed64253f5908970a50ef0ee94fd0cb18380eed6fa11c55b191193fccd5346825e5986650f8fc8ae1f8285ec37e32e5a4c3afdd043e127e590de5d3769c6f3721cbf9d1198f3d6dfce1a1eaf561a41e94a2772226a68a13540a520697f10abb31a4ec24fa631d6295ec373f974429f7c9e96d08d79cdc8b9800b0a3c67333e421cfa3dcd1a531d558fe9c047f9e6ce67167e4f644a1a81861779640b3c00dd24207f51fca5406ac1ed6af10dc9ea8aa8b69a77c9dc76ce3f163212e7f800a85f19c0caa6913c4aa6dab4112b5dbda93719083681204ddf93b8cbed41e9b50fa145a4ed8685741bb93e5ea7bdb4ed6ed6b97f1ef2dab89ae64c1b8c433aeabfe2c267fbbd4ebe78a167ecafea05e0c94a370a97d21091ce21264359fe919de54075bcdd712082b1e3b399ecc458e49ce1668073b055519885ea6d1a69ce3c970d4dc82b0156bcf611ee00cb71ac6cf2ad7993baf102a93413de6cec2d9aa6f282aa7f788482da0ed16eb8a19414eea14a9d2c382c293ec2232f2e33b1f64f75c7abd28bc7ab4763cc368f2ea61bc1d4f2730f41319e667977a7109807375d3086c80787cc97129572ad1e7ae99593625a6c44e44150ad72358db30c74481191505e9a601f3f04f9e51e02697fe4b8bb4d7425940385189588c2dce5e56388879a0fcfbfefb2fc709e59b3e8aa06c8fe9d5a5a3e5508b186a12d0ea507ab0c49e96064d711a79beebabb20355df06745bcc6ee90015125ebec91f94f17347f695219c2363a745c03da30dd9965ed4fce0a97e5f7fc03a19f75d9b217c1a6c8f86936835ed59e291b445d2c8826bd5725c4ff16c7831f11319705fc44a59bc5487d34219a470d0edad345da47c93d6e24f43e7527cc5d88aef5d99f71bdfb2fe9b43fdc81fdc25a073430e7a5fdea1dc17791bbeae525905db74e94dae03901392ab7a1b91c6f9c47723b4afc6e8256d7d84507b4fdace5c7e542becd124b7ab7a3e7774b511824f8ed9f6a057184f4accfec12d4cbf8f8a8521b2eaa3cfaef0641b6c574c15ce84c3faaea79419f768f82574fadadc39d1b9789c7bf1244ea81ce3f895e7b4d3c66536470ce8fd3c2e03ff3b3748abb83437836ba420bb026d2fc381df1018db95c98bbbce12f3b6552f4bfb1562526cb370ce0202b1db7a5861bc53e0fa72c077b0393c8a0abc27c73bce705e9c3c35008dc039f6be9f7f77f74351c56dcf1752239f52571c67d90db117e909cf1ca7bb6acf6e13f0b036e2171b51cdb80084a63d13cc3302360fdc81283db80362ab6d33c0ab9ac04bf6a3650149a5e4b083e19468464b4197e013dcb580b25a2417133e74075451ac3b25c4ef9898dff9ff738ed4800aba1a88e90468922ebe102d66a44ac668e838899f23d031f703a777cb485cfbef922718c304bcc1693673940a2e18b939cd3a4e08081c2c15ce72faca0b1060674eb0157ef84fc4f51bf79ceb3bcb139071db720fa7e0596bfb1dabca0b75abeb7cefec05cf52345e003f40cc47325082115c327bbb56a601f9e6960775af1b2487f4bc7b86907f587e0be4383556ec25bf06c2b760979fdae5a69c0ef206a4c7c2129681ce93b8e49a15097c24cd5b20009950a16b1f83bce6c62fa8b91fdaa2816b17a005e7f24b270be2e629657c4d7269a3300ef954267e285c8d943c5cb8a90bbbd6f1526606bce252fa28c8d683943745f3f56ce10dd533903489c41153d21d2d32469e2ca7c74c8c528dcc543a94e00c5d71ed4a980473fdb75dc2c6ec73ea1a081669998f617d2617f890607b226f16555c4146f838cb9f2d4df3d96e086da3e52ca9b8737944fc8040040be37006151264473e59ed93064f1ab18abb7f52436c441a84e4fca171e7108b7c403a8648fb0deeeb30cf8251511c34e717987b7b2cacc3c67c12373b902754e083eac23e375a43cbc7e47feaf4bf2ce4f1f6ab93c50af82168c119ff2f40c856b5f266bf3815a778e873c840c3f7f0b068da5c1cb3a362652b55043f73e8c8cf75ec3297c47d152b835734d3b24ccd4d3c6a301d469f003fa83e88bde354be8d71e2a797471895cabaf549df7aa16d12e0d6b3a95498764f6f67fab7332491db496f0bb9250b4c57f222a011ddc22c6a1aa5ccf8a3f7576a201c867b034a4ea558329da542dbcb33872876a25d2d71de5653762b296671b385fe1abe90538e198c5e6190bc3055a253ff3728db9e643957f493af60737e629f98934fc674bb11fe8cbb1c7f0e2ae2223982f812f129ec9ff80bb7d130bfe11ff6c858c2d13750510cf085430dd383f814f180dd0b762ae10297fb9120c8fc97d74442d9f5455b1e2b4be6273572187ba0ac64ca8792b6be3507140de58d653c5d230c570efccf4190dead784b36c48525e0dc56d9055e94a0e2171601d82b5da212a2c638194f025a3c0d85745bf9d4ee83f69eefbc74f87a18bbe5fc0c6b48f201d5572b280d3c4e1f9fbab7f33208fa4d5583d7121b9511d544cffa3adb76fa80f88c6e318bc33df3f70176fe7f44d3864a4fe16b8cef891e9ebd980fc60805ceedc1d90d48c770b49e59e2377558721afd9f72118ca3fd7eb1b180fe10511dfce6e121b518b5319649ee10fa05bdec9409dee7d947f8b74fc7f543f7413ff1bb12a15345e8ac1c368ab41875c549628a01566871c40614fde8060c871d416c748aa7c28bca22c7a53c05c568094338612e97a2008d80e5ad74a5fd1b0182f081c941c62b6430059aaa269c6b6b130f554fade8d11f2055b98ed23071494286d848135a32ed99db09ba7781d52a7dd844c4776631534c67563510230b3f79cf0090a461424b404e8deca7fda864c4a9ffc8518de362dd43ea5955bfb6907048e1925d2392189ebb5bf31314014ea48562706cf0a42eebed0e259c4d92c579ef90adcd8f3732595697b555b2976e8ae1b5352b65ff821884396e8d86b8cfc779a242152036f0b4fa78ca7ca290a732de2c8977f407f87b2db7916ff3980222f42c26dd0b522613f5844a0aeecd3cfda35def244fd7cb4aafa0d84524bb2fc16c3d0da360da2091d985c208187beaf40a65c2197294484eb532e3d3eea8591eb28167a8aade78c27c8f19db8ff122e1b541f317ab78b00fb4eb375afbce2ecbf3298ed0afb1eb91fc517777db1a8d1675ca34bb64dc1253d3a22ca62dbb17b8518b6d9022e699d52497db7d2471d314f1464b5bb0a3ccd08516a0b89dfb51140cddc8532c21f30c844e4a6b4fcde3b163ad142b7febc9f39d134ad513727521bd8f5964746b6fd907b431f1fdf83887fd1379f5ea233e3f47956270655bc8ba0d31f5176bc9211d8aebe2903613a85351966ed570eeb86b399a2064e593da978e5644f70c1f0d0c22deaa399c10e01f3321563ccc97f81685ae055e7bd04569046b6b59a17ea5d786502d3a8483c467c13b13b07a5a3eace6a480d55d042c0ab8b9e856743a510aa78248027495124210c3d843a2661005050548cf9e46cf809e77b73167b1aaa9952049c443e0fd111cc774441550ae34ceda628d8e128c8b88532b031a39296d193b4c1bfea547b3490796c6ec5c1deab4e45d91aeab07fc2c885626cdb13d82aeded52cbb2668f9cd0fd052513280a405357b56ef8ddaf19e23e34d039a39e62211d411a10812bd459fd41ec69a3c6166ca032f9d60ddce5c10bf45d0c1a40e2fe0d4f69c6b2216c5afd88323d8a41f717dff6e8893475268a667aa9c81451ae7ef8e304ffdf7031c74fe02ad3f65c6e72cc54624d1118315b17fde21fdda26ffc758831cb1c992770f9cc0fa5cecbf5ff0436936afbb8a21739909baf914e2176ac590920e18f3fb8f02954156fe9af727f698489a9074deb8bcb8b19e0137c2916b80223096c927413fb7c61d08940693fda44f42d1b78378369d9e3647f9be6d88c07aa4824753649ddb462861aac0b2742f5f9b88488b1ab3ce829f8105f31f5af3ab44c12ef903effa88380336b2f6c985c253f641c8271f02e08423b6fdbbb5a4cc14e41eda3b79106f5379041894607293874028ed358db6b862ec0964aab88f4ec4660e4a726aab9edb03ff3b4920bc5708415f24469e7e4c3354b168fc839dd56a7a276cae361f9fb6c8c45cfacceff6c0367174183a0a12f728f95d38254a49713abc7b603c0e54e5fd0d586728138836cd1ab5049ecdfd9ed906aae564f650eccf0506e2f850827470a4e2b6ef5d1766844d68641857b7f14d8b90203b270a9b1dae207745e5cbb71b17ca4daf55515ceb21ca3550f4afd5cc5051fbb460559eff3d74be0bcc4099a30ac845c603029d29d9e80df561e1ce2c816894fc0d0d40eac8020778587808ec9c4e83a7d864bcf3a2003499a478a55e8e0cb2e401d49e5701646048be2a3c08f1cb379647f734b8f118044fd9532050f46812f7e3615544593713cc2cdd68f8394f4cd321e870b4c35b33da1d67774ffb8c073156386982e0ed11bdb2fbefe66fd3e3ab28ecaa0e08f14cc4caaa784554bafe43c337623acdfbacb681e62a94f0825b21889668c2a8a02bfa9c0b9edccc897214913dd4879a12b1593f8d6e411a09f588d850f7933f4b9a46f2bd19812db4eb92ef4a1faa35d0f3b15ad0a8993f1563adc1fe26a7f123748b7e49ed9f97eabe915be9f7aeb09f988fd741aedc3c4b69cd04309195508fcd634aa7b7768bbad6aca1b089fd5b4b8e2941edf76b6096674ae71ed6cc603daef7da28757cc673006ae7fa2bdd3a173a30a28e6060625a5726f36fc93348aa8a1a1f78aa2c6cf0a3eac4f12b434f5c8b1a1abbe060346b9e96356eb40bd83ff30e40d4a8eb428f912e63233697c8c681e2eec07ea080363a02a492fe3fe5166e69ca3abd38b8cee0e3a27c3dd2aa1e16157ed3683fb9531a17ad8e21ba48c21a77792956d9ca7a8cf9e83fd070d624634aa5b71957343b51012ba7598b6df9b116cbdcf589f01f1d83a694159e003df580da6d20eb0ec4de26558d525b5163e693606f9615f43617a170c703f50c80274be85f7c003b3c786878580482ed4f13cefcbf49d9aa2dfce1f27fdf1c860113349b291e449590d4cda7317520a97448fedb596767b6057aacc6e53c3b4b1b66a5a73c7b5bef99c9a779dea496aad896e790906537dc16059a2b69404cd856b63e0f1ce6fafcae83793394d159ad77adfa6993a0c87d2daaa03422b5bcad62cb129a56918787b199ba001e4697b88ebf965439c91193fedb95b889119ae527da4fb2bab7424915c4a2a211684a94c49fa2b62fdd9ccc7714167790f89fb956560d22b4b7bd59128d503a8c1f40e817a0e07b605ec560022e0a6b4222fc4d9e6965ce5b49ea9e663ad6ab68f69360347ab40365c88258ee4e518828b32b88eeecf415e7ea968987885543ec13992c3b84aa71ce29702ce6a1530245082a1da44c5efa525a778ac4d487ce21e53ec6e88fb2295283d12128258966c5660f7271e15db0ea1dbe38d7bc4620ba6b3f4b890af48ac637bfface8da5947936f090937161d23c9c183ed1c580490bdccc560b82fac941d2fa95681506c3c464cee276c3cd379421babc8f491d213d51a901883180e1931c0183131b3c3f2340abaec56a049422dcc50cc0cd1f1d20fecadfeedec55a821c48df79efc5cbc2f1a8e3f5f4784ee8bf248dd6e44c46bd803588654d0fdeb2fcc1520c95e7c05538e7459c2e034f81fb85495c1ab499f61b57d0b9ddb308df37787507843cdfb9c1f0ef12e13bf8dbe7d924c5fdfc87ea17441b4faace2959957dc75a4f2e7a74cda623d2fb2a6f47ad35146026f194b5b8984948189f9b735aedf3b34659b488e5fda9d2cfee420a951c8427be89143e086f58e53e850036a38f65587aea6c4b8855b0751139138571fdd533bbd0a39b9d3775fab5984fdb99656b505a4b5d6c71bae3545641f3807253d7f0009f7511f2cd8b9d8e1be4d8e39a851a44088315b44070d1e0f692d1968b071042b96494019fa237e81219b1e48666c35fd349b355cd798e799df246f0e1fd9ea8c870e875ed37ff132f8f2db2ea82b43cc931801851d0f37dae5f58d6790d2f5b71e278ebe636d0ea1ded5eb7efa98184c0be0dc36f3864d0e2f17188abd49bbe14d309f9ecf7d568e31f56f95a37785462b67063cb2e07f8c3b5be331ce4754cb11629d8308cb807b45565629b6be963dc77967b941f15930157537729eeb705b3a243940ec45b869e5716950e910fac8c7f55a83da4862e6d33d834ceed5a519576604a2ea46b3c082347529c74be6f5cab5f243aa10c576ed4a9156cb893e1ebda4e669d3ae6fe22770607e10c4163edd60f21e0528499a9b36933f9d7e21b8606ee2f650663ac0cb11152e36c4a80ef43d26f7a253bec35a33fbe99e7bd4c1f4bce576d5ad3ab13943e3256328effc16e9ea1ccdcda05ac54e6f52a903284e2188d3bc184e98fb2e3c4d38cec012ba848045a008e8e43a6bf90b47687f3ee98491b8f6ff6f0baa20c8c64718cad056a3a4a6f8afd43a3aa6b91686ec04c3c0f02745f2374d47fcb9d97cd28d3b72dae7fb3d8f02c9669597a4f48a0cdb201fd479747a01519d8e80486a7e78a50408939fe9b128d449ca5b41c2be534562a64abccfa774a5dbc1590e30feabc2a787e5afc254bd067315b8640d01bcfafa4a3c809bbc899b2a234f2410398ad1c39678000cdcc889c0f36a2e0e6e3296b48f2803ab5566cc9e06d665dddf32b6394a2d008576875c5b657869122a80d7540cccf6fcc983d4ebd3654bbc58bc12275bca039ecab2cc9170ea863094daa40186c43614eac7304e31392c6d78ffdb656de28f1b7c8a31a38750ac7e94d54d45df0f926e78d2809efd3dc86330f759dec080fadf48fc8b688617411277905e441b1b17ddef86be91d187e93037add3cfb4954f3c3f3f3d16c080b9e0e92ab997462a537a819870a47b047814c3fc05232ac4d13b168ff88f8cce313498b5da2d1d35d4af04722a3fb4a3525960cadcfaf62d0b3f06b6fe05519bd400601d867dfbf4a563f9f560fba1fcd87971f3a4ab6b4f8b5936a8bc94b00ca61828c0446f5fc39bea86438257e97ec2bcc61abfe5f04ad50dfa2b18f3352ea5b0cb2003f78055b9a0db39b2df1eca0eac5294ebe6c29ee2fccabd31a180e0be69a8c60e5ab5f619921e6d5b46507d43b0c14b92b22368dc18fe8d5d1905b5a4a2dcfb354fd33e45a58905d6d7a3a77833df40aa4761e257143b7af63db7e410eaf8599f97f1abbd41caa7fefce952dfc637738e950a0b218f3317ff0b3169793084b2b27f66e5b5fc50a18116b40363704beca03744c11c4bad14cc2714504267c6279536a626a54904fefdafed12a64a627ca950f254186e1667ef99e155526fb929d7a6dbc77bc4626740954f8789b15d2b89eb6bc19fb822133a22c3d56ef6f89a00f4ac7541a6f48b6a77fa9421919b60bcab129574e78ea685734bac3403c47e668005afb1b7396abd88228364f95ab39c2855652a34bd35093dde096bf14b495f96be5a1a36f5351720b113e583fdf1d883a0545ff39e0b18d996fa77f4f5e203138a1952e5f31873d90b0eb9317dc5734af97135c8f425091e38fd28efc31d5dca036f3a881fb708128f3424841a3bad49d9dec2247299483743cc8e8485349fc27d4007208c09f8a4449ff11d6cc27ec4873761ce09fc57633d47cbf5f579e4a09d89daa67c18f95e14ee9f4313af7c728eda7599baacb2061ca9b95381d02b4ac0e0ea250635a2a78e07d18c95feb3c1b46f8d2fdf537663ec89c010bc998550175e1d726192ca41536a58653a036cdf37788a1644ddd7a0932a532f0af8d1ed22e91a72cf1eb066b97763d8c61841a4e026b1229de02f13fe1c90e66f87c1007b400c8e3d52249a3062a531f8ff7196df33017c244462dbe3d95a9b1ef74c5a5f8729e7f3af97cea70182f5e6707aebea8039962c9c024da1106da06fd9815a78a108cd353b15b0dccdfbece1d7beacad1ef33aa66148fbeb403204f14465295a28a24904753040b14e706b6fcb8486a59c2af7c7558b4697caa51ccd0d44a1a26c9f125d390098cd73d3c2f95c4d6836aae67a07be9bdf56a75927a8f14402a198bcf85fd705a0c443dbc275736b5eab0e6741daf13a8e23324ca1edbcb270bf768d834d61ddc37b006adda471c340b186a760d8b7b26d148f176166615abd29020037c29a1ce58c0c857352bd8ff4d278bd58397e7b3fd212fc22bbb3fdb28d19b678c711583bf49947ada0af6e1fba8834d858424ec049c0876a4758559a4c145aef8b2b1399e0660e6079a01d6934eec596401b00ab4bdeb5582ff3e166ccacb79965ecd554a936a122eb249cd65938ce1720af3793fa9621a76e2d28cbc4583e0af4a426926b94533fd42804680e2e83c25c661fe5352d1ca1127e5807aed8af1a968bb15c8c94bdef4506d74ce9891d45038855873e0d8c2b7e946cd6e3bdc9aa932483aaee45c6663ea8700eeb1402d712946e4b969257d9612160d718c0ac17cfc34e8f8303bb5a1bb28c7f9f97e966431f7dd9b2cfb0870ca59ef4fcaa28209ceefe6b4165ffbb23198b414610f0c7070c014c71893c9120b3be627e374c1bb252eaa247f6e7ca4a79cb0f12f9564cac52a790acd14b11d0d0c5bb85c965c076fbcd7bd56d3d70ab292b891d4a2b7ebc1b2293afef2a6e0805ebe9b5f889ff58408eef569344c4e91eab2b4201d68493650bf95013f9193c0f1b040b9ee942b4cd3cf886a3b7d66bcd50e02076eb695f5c80d777b577c13190c31746d8800d2a9cb29b9de14dd64ae34ed4c1baf680ae45e633c2ffcedbe20d64e2cc02090252f0d5ccb16c2034dc1bdc85579e40970e72752ee24a5880eacfbb5dd4e155ff54467aa1d29b46643dad452ad13a8fee80333a1409708a8c5ea460654f8b1db46ec094cef7492a705d525737594faae22b8410574bb8d8545814a45b2c086699ec8161393d585d05a5ac709509f49b60b5fa063f2f01942a7822f84c5b7252579bcfd392d74f238ced148022b51223c10820a2ffc5fd7d0c1b8860fff93e6c50cfa4773cc9d343b1f2f171fa5ff921c0c80fdcfe0267d3d1805992567ca9b7140064a89501a82ff5293c46a20d6adc1bfe15648f89e467457709eabc6e98ca04c1575f4d4910eaa2ae53172dc0db9961792786ef93006eb5df00e039ac2829245b21a69ac4c5f7702aa011c2df11225afd03548b59f4b1bd75b458c4b325a9f99e18d07e4cc0811f36e04327b17f5b166d470011682ef9304c76b90cc43a1b59a96966ff02b73a3bc5167b9fd4bb10c8bccccb24f3ab3d74071463fac931cbfef00ba67e8d5163a01ca0a1a2ba255074471c40231f309068311294e6274c7b1fcec89989b4557f63788560eebd4eadb141fa69ed13078f5e7fbf06a65f2321318e342558cd1f7afd89e4061464572e0698a45f1c77e4b7f33860f691dbba6f74bca1eb84c48fe0338d3901351c04b2dc3465fdc82ef609da390a4b8c01f0ae1d2075e6d6b21426bec76b653b77926fdfa935a64d75cf5176cfd827b75d2de1ad5acd27ba696b289442107aeab62fedfc7be24a52ec08cc1dd3c626f022eddee3753f02c03682c1e65ea4eaafea6a68c07ee187a7595c919b19c7130e7b67e472ae6fc1fd22f43b13f2609d5c84e577e2dd7459b2755bfdbf6d153ec2cda0ba121b95ffb1e5f559694c31c5d32a3455ccc79172aaa2dc0c3aa98803cab460bf26e1338863148ff1dc2f676711c216a3ec2c315d246109e7275a610c74663405636d82274d2e3699f0c870ee4c2f3efa07e4fdc26dc0c6ecb51df16b8efaa2b5847822b92cfd5a482996d5b1e7c4d9c2eda5172c6ee8778948b3fbb8d5635d37ff565d2db7bdbc9505bf89e89863097d13c52a7ba0a94063b4cab5b4ad56c47361007e328f52379ec656785c8318a36acc0ee381f0396da9495db12cf4a1891c64da71696cf83aae7541352090a72d72acf858201a98aa48d5037e69b9c9ecbe8c0914ce79104143bc3a9bf2ae66f2ac2d4b62d28add4012282d61462938645b62ab0abcea3c8f74ea1a0b5aaa53f55605e668658edd45e18b33752393aa1236ca9d56b6fc800bb452f3b98eddc92abbb3c2b480cd4f327f4841b61214203e031c800e33bfe6f5de5b63e88d325ff95ed20661bd24b9c2750c3b82f806cc7ec2dec9bbc5ed01af06aec800e4d51edc99ae88a415b9a67809e9d5ce315718811ac9367622335a30bd593d125d92a1be7325e5ed3cfb62680fa09c65af0a6ab0903aef153fa0ffa35625d9a9b49673085adf00cd464922e588e6833e8f0bc065c51743a89ed9bb32e31f48f24edacf2e3adae915fa4e25812ab5baa10c42e7b09a19d5a5cfeb4f3b61c27f80f9717b68c9d2b30272ba80d4c8f52cee968310e807844e9fbfd61a462269f58eec1d37400191209aa0950d9366657455352c07052bb61ea5b8f17c78202342af0a07a39f9f448afe3074e07fa034adb85dd7f84b26dfb96bf053bd0701295cc2f940e6a893c483e4caae3ea4ce53c0f81905829a7fbc5a573e2e540b8cc5c8400ba92e31e1464652ac074abb56156620e52dee203fb8a1dca9a3395a22ada38e13eafd6ed2cfc47e5f00ae9f073988dd3a018f479d5be0069568d6ce1c65a166c247cc246205f9faff24d1a4484aab27a7f844218ac075e6f330cb6c26ea8f85135819b0d00e0cf35700425e20648e792d9a09a9c52c7d0b332be8bf4774024e098fa0da5fcb14e8179642760c294a5586f69feb67f5c17a347a0923ccbd3d01e3fa96250085cb7cab7497e43dbd881872217d33e45abbf3df00f511228e06551c53651f2c98073288d86044bfa28369cedbd176530d736ea806bba6f940a8dc763fa177cefc6b71c779f4cd445a88ee7bd4efce5fbaa4b80ad704d271a788eff2e14d5dc9b527145bae02fbb513eec70b022e62e7e9e42681e8166f504e44ddcb2188ac1125d405f917623dfc3d40273086e9f9774f2e36c5d2cd2f80fdfe59b95e7e4d287c43ef1908058ea7fd2d0eb6875f140eee3d173b967b0e9e09a7dadbc6300fefb301fd838a1b2cf486391ea51e068284e7d780fe8d4d462ff6085a4c22b223f754d702f20d0ad30da7c8bf60b5947eba6e75e7ac6572b8db766ca42fdc2bd0e51944281f1e62545b4190d13d115c1aeea6bfc172e5e6390210edb832d25f401103c1f689c4ed293f1f059d7b83b8591aed05fb7a0feecd6b006c9bebacbcffe5971e6e9bb8f7dfebde7dbb77096ac66d9af002234deb6d43f8d92adf76a8f712fcf0c070415fd686e4c8f9b7d6551c798f4f96869bcf2df71ae51eeea89af9fb871ea578332dbd3b103e753e71de911d7986ea14404e52e191ab4ea4218d0c27c2bfeb33e41f2ea2a22b3875647df7003fba2bbcc7952c9e571d728a9e70daa692689a924bfb4f2b0fad52230d168555516cd8f18836ef3cbd028526cd8bf57426bcdb4ef6bb053c4236254d1f0bd84f27db72fd83f4a67eb005a98f594c93e2ce0eb608806e812c44d3d5f23f318b3fcff5f3f78cdc1eeb78650a9621002c51ebefcb7870271f9c703543e235fd50bd0057e383f29a40ff6873ff18e916b8aed531c60866165a540d69a1b19e08e7a3f205d23dc810b9f0fa139968ec036339e3a53c03a34e0658583dfa30aece9013448f4c388460ae9e0d36a98b64c43e77b0efb892772bd7f72fc6bda77517433e18d9e880ea6ddac00de1501d35fb9440a364d96236a4b28e4b19c8cc7ead8ccc41968d405fb123020a8d2f028137287da9a3fd8cf8bb1220780be1b6ec901080fce0280ba945e71a0652c9e6ffedd0c45c619e77e26fe20733c0a1aecc8b92370b32b6bd9fc3e9cfa0450a3c2980998bbdb475552202aa2756c4f95c80e6d87581b8a2f196e875c213bd7d6c0d3a5df63ac25bc799a8ce9081943c5496875efa742d2ceceed6d7b0fa1790c9f7e8b62a1ac086ae76c3c98ee22b56afd8a61943639edda6a3fbe093eb2c2ba678161afe4c20f873a55d01c517c4abaf848032b92c2cd1fcae815341e8acafbaf456b49e2d24f8e8dd68bb2c39f3ae96f4dff3f96fa37daf32e60b8d6f03e8678521768b8fcd9f83a1aec5ddef0a8242b97c345c4e4080247fcf4e77329c9fd8778e05d5920844a7170beb29eb3c81e978dbac2c8e2fb20a8c4a562723482541bd230aad0c206019f62b6106ec231bc20191f93e912e8c5e308adab1b2ae70d6f9902c07bbf800104b328c8275aa5f676cb452c9fbbf9aa0df0432f954ee703029ec3f03464a15861f135d320928506d8a08e0c8da43ab749d92fff0c09e01bc353504d177cfb50ba8407436d236cfcfd296d9d72e6db86f8a90acaec213d6a7ed426ec488781227335c2702fa5b85eaad8b88a7b51d1c0a627de6d2beaeea9d10f55b256b8c5986ad0153d04196131c2b20ba1627f80cd9fc217fccf12d33d7247a1ffa64a542585a1be3f54e0b9b427b9c95d590bbdd8a0cdbbbe6a4e0a84fbed5ad5e48b18efdd8adc1523471d591bb3f0d2d1f1d92ffba53f3b5bec56a2abe6a1a67ffbd2fa01cac5171dd4fcd7c61a83700ccf3ec812ba75727146a36a7058ce95c3b7df4462c4877c9f6f79b9ff7539520f11abee6d2a1c711641ca65f1e9a210abbac73ff6dea5e76889959363cbc4fb4d7cc12a565b3d5208f0df01ec09918e4518741d4a48997861e158708828f32102cdaa5c47ae76468f28754b0c459419a6273e67088609189caf739100c8482e938f78d634a8596a1f880f9665d54a872c3e45761390f3cbb6e3c05c117996e267e095f6cd9599e873f83158a1747fcc66564816b7c27ab2a139227838791310c4cca3db099e57be2c16466df4248d31bd09bd1566430bfabd6668a8719f475a0d6c1068c5570ce7f4117ed78b6021f6d7dc87e491ff381994e278f3ead57f2d6a3912d16f4614634cb060f1f03b099af391f52e62cc41293464a5446c7ef34ad34fb845e5d39b0c471b2ab83a969cedcce7b96e05193584da0227dd73da4132453aafdaf56e05ea428cedd32f73b011cc0613be4639f30fdaba7db27e603581348e1ddeb7b2d574dc4f7d0bf7eea2b3f7031649c50061c22bdc6ee0ebca0f979cbf2297ad9909f4a9a87729ce973e4598c45711aee4f6aacd06c708505b7879eb1f58f80a71e587c61a2f1af87acb881d4dc603099d46fa5535e3a3d3d04242d785ba8d1ad601f677f7ceffbd3e35524b9977d840591cf3658c0e35680388306c7891f76561ac31f4f5e5188b9ac7f89b53ce5b1c8345ee57bd5e0fe49a6fe40238b2bc9531cff9ac28e39653938e27526cb31bd36416ffb50198486988f8540777afc98003b61a52940362dbe02a1fbc4e1174a73b034d49a6e1f4b7e18b3fe6bbf1bfcd4f240946e3d1c076d695ef5f82c041b342f185d63ea3e24d4f2297fb09babddf312c00b6e368a337c5627fddf9a719b64e3d47957d66abe3cbafbffacb6116cf668d43f1d3ab9f32f45375fd7720d5015322108023edc26144287b51341ca61258ddd8cb1b2b6218cf3099e4e190f3276ff734af75e14213724fb02583cd15d7f9466d6b6477ee51f491af13d6c8e4eeb87d3a1e5e0d2a6bf6d32e083bb44fe5bfa9c425a407a049dad4199803e128f13514aa17d36925a6d74ac0f39abd14aa3e10bc43fdd74275860d820be8135a022d48a40276d17e66e46ef4a795e9caff220d13133f1c1b07b0450e3214762649b2218ff766e723c86e3bc3b9628c4fc028e46a26a9b0993329f01fbf8083f6df7c08e63f43ba013388e1148e8f341a33f471f6bfce7599357e31848050d90eb13a49fb770a8da60234c93196b2e2ec21059c673f6784e3f2e02f2563085fafb31acbc31f15024b92e6526d1cfb0dfab24d40109b8fbe6adb84b229765c98d19ce7fa0ec352fbe9764234d5f471ff0f48bf716bb7eb6910a7bbe04f2e092f5fa1ffa44b6cfa12f6620bba95b6e9cff1109bbb92cccd90b4676fd6a6ca2006f22cf250f6f0f138236fe9158e946754c0bb23c1eddd31a9cc729e7f712fc7af933c4ba436e94306e0a67872b118c4ffee9c190af24c02f1e93713cd5f7c54ba1cef402f49d6db9f168a814bc37bff668254334b7683f17b8df81f403c4be7fbade3969f3cab043d62ca11cdd173cbe5cd38d86a84da57faf2f6029ba01ce5c42862635db1a62b88a691470358397fde2f0e1766ab115c0759dca5be79c9d88c1b43436d1c6b526e06e748da49b95d121207468c09d032425bc93e79e5c9226eee609dadff4b76812dc742d36c1c77fa9444698bbea8e490599b8eb4b56435420e17fa8ea4e10f1c0e4b3e59ff81e549c2b2d3aa0ed2d44a60b8b2fd02b9dbdb8874673b92c8440ec7a0c8e64d15164825e18a5a96ce84efd9fc0654644aa0f48bcd63dd2ee05c644453e7140ac2b86b3ab5ae304d659ed5e955c134992153026d8c9b0aafbcbf52cf40e5da32391e5219985401ed32f8ba7dca24eb6fa4a02a55d848daa725249b658d25bfa2eb9b31d2069b28f8378f96fd27222fcb96b6f7745761ced20f0074b56f32a7229c32bd3a6153e7406b229682cf5ea3a013d773a84151b362f28b04d7ddb085ab88e1f08594f3a49248409a0b1be6c80f02cb65bd6de4d64fc540bcdea86a574a8cac34d8be455c0dd0a51f58a8b61cfb1320826ef155e2a34ec9015759cffb3d0371ed0df428d380d991a998d09c580f995be32c7c0594fda7a958150873a9d2082ca0437e5acfecb41570d69c83458e36b396a7c7e8c9cb9b25e6ca509c694dca496de60594ac6d8fd0834169a5a2efa7dd51238a2b3d22bbfb86039668a2862d91f8438ef6ba1ed94e16826fab98b4f47e351ce21a8b63d9f439e45cdff3652d399a3be0c0499d7b14e2b98895cc1cca8c27fc1188e762883e1fe4fe9220643779d37e69bee08299a08cdfc8726b94fc2dee8d8583b3d020f286c45219359e9194ff0e3274627cd85d841a468c4f17ba5fcc49343fe276d102bb901ced66b5e0e6e354c57f63365b46a7d8c66f224345432a52244a98e7dfafaba8b0ac2b30ff9bf70a09703becec4e4bdf14452e38d5dcad0cebc8457eb6002d035183e1debe20fdde89827fcb705dce028b598ed471a4877d380e100a33b1c54fc4bec18f11330662f7d991ba93f99c8ed0eab52dda906cca8376f8dc4c790da07368cb93145fbd7ce738cfc5f342a4b38ab2092faaac1f3aab4b503c6edb139e76b5538fdacf7a326e2b7ca2a13403357c9a54edcbfd9be15d10454159fd8a51b2d01ecf8608e98ee926b9f03498caa8e9b458de961f6243a4ba2a877c88ffa8f838954c3e4176cc37c5b67c082e50101fcc0008b9d58d330bf1aea6597ccb85a47e7bfb01f3b66edab550d0fd10e005f1670a7fbb34c1a11b684cf27fb72a3f5f350ae6ab1bbb889ad3de9467d27ace3d97eaff215bc28435e7a089c8d2615c4c5cb984d6e0ad32c5f0b07b662e041cf98b9f3049c37584c04ae97b526f261df873288ed9c546f130f16efb17be35011cc60e5ac728af7f761c5392aee92e70e23675e96a5384fceb8c8e9b4b5f3e6133edd603059df559ba01b312ff9c5138c64d3bc528ade3faf920c9bb89db2ac09d7f4d70051bae7f4afae6b75fb17badb35b7aa823856e668aa18f3c00acba71cd575a84af13af70d384e90596eac4469fe5585e44307cf8a75132d844994d2bd56c9a2b852c0e78b8b02f1f6cc5771111669e240881659e505f8453728b263d820c53ae016e2ca83c239bb727e021e53e5b7727f519944122160bb1346bc99aab8d8f2e9048006bfb51245475ce8415a3787a1f7c4b8156b9f932840f849a1097938546b4bd5cb40661a9378e2d24ab061a9e134f0a07842e1ca6af3a538869a57daad4e0fd745fc8b73f7621f388f92003840ab5e2f883639c229a0a10e056a4188bc211fa3616d74514688489b8b8e34a32d5f699e4fd2e2ac5a60c90b361c42d80bb4ab46b3f30c48370e45c48d7178fcf20dd0980884f882c2c542ec1ad74b00caac30f71636cb45b850652dd71ca17952b309789d8630f11ff9d8fbcedf3b4cf96fcbb29e638c1f091f8dbe133ed9c55d870b59f746b5c4a14c69b9f1c78525d8c6d7207222839c04a37e1fa81e1d62ac8985a172457a416cce99c1f636c343c956306903eaf85f1cc0e29cbf0605c3dc36c45b2a5f18cdfff44152ef088ab3d92a0514078238891617039f2996b0e8f8aac1a7530bdc267d554f901afd904f31c115051a0178744227db80f37dec3a9ce2588916501f6c6035af423cb7fa21ca73111f1e174759c63ecb2c2a541cb8e9c8cb8f93ed78ffa423ea477b3771ee77a99d5739f9aaaa6a45c6eec174252abfe2701453682987e6f1b14320bbe28bdb3356b6c06c8566bb4c27e8471990b263a7ab66e0176abdf2e1ef86fdc8f51b393fae8b9d1d3126f13d3b8450bc4c26de008dd6ceeeffc7a70006975044619898c926e9cea4bc064837160adb68d3b480e25928d391febd58174b069d569592beec6141860a2e4af93c2ee815897a7c8015ddc204fd01babdb5d590628a0459d6343de037e0b2730429b4ff7f63c07302df0cb6b69ffa5cae60c0fd62c2a588543f22d9ca630c92dfd002445783fa5aff8fdf1d00490247aeae114d6db0d3d3d0890e89bb084cd5a202b9e719d062109d8701bc4dd3c481dca360eef6677892a80638d62d1f4103120bf6bf3c039b08903fdac2558fea4736c2cade0d26c1395750889828c8236ee3ffc2a0905fbd3ca24e2bf5d303fd738b3e665afb5756bb14fb9ac0cd06054740393ca81499b239e476e101500de9bb6d9f9fc4a4b78a3aa1de4bfd69544be0cb7e2f640c73cf4235f6d8eb5cc4697c755adc71d90b4d8f7c64dfae36d3542a9d416c35003a36bb6d12f3ac196bb36a43658cd38b71171193f9397116236c412f5a5ac33948e28575ecad2cd52e1494ad47954797d3a3ad0ee2aae92737913e1c8d4d33ef245a6f4a38847074241a68c38ffb4f6ff00eef71643f95e8f0e7c178f727bde6e7ee2d432cdf31410cf2f011afd8ea1033930ae40d94f72a62599f280f4ecf2a23e3d47c458094b559d4db7f143c67ab04feb0caaef4aa50947e11f22bf6c201c0f44ddaa3f1d961dc9ac54217896487bd13ac018c22f7ed90c35017d7147b0aa501ae025e52a3a2f030ddd8001b6a5a897ca17d65ebcc28f25405cb6673865edf2020b5a9f1adefca59589d777216499d5d8abe730eb9f9b74a6650878ce5bbee89b1d27f76f60eb8030541a05783dd0bfb8f6778f45eecff3e6047cd00508e21ece368ecddb7356dbb7b2f6c5e8091d359571a7f455e0490877101aca4cd475db523ea8decfa3421e1c313d87d4e2dd402886bc95ff5a444a885c88b6ac36efb479ca25f0fe744587ac2adb411b011c6b150077e0dadc3f0b2ec632461bf881545bd78b10a45cf9ecc30a27765f03a99588fa24f1925eb7e015ede55631d2ac87b728f98a5d6a8cff7ed5ba2602d5833b3a55f0fa7b9ebb39c5b2725a91476512e0a83f35c326ea5f554034100372877a617b51f189c0dc1fbe0e9aced9be12e57fc727b84627802946dd2560224e80b9f00005e6d08d702e5258df60a17952ac252c50f30ae54fc833a9914af24ac1ceb1d485cbf8cfa6e84080ec13b249d6d7ba17a8fe7690bfe10812edc3535f97bcbaf3077c0de19e6568111a1eddfcbab51243e89c40dfa54ce1a125e81a94c36bb89881a81bfce57263e8b7f7ffd771bf8d0fb3f2fa36e029adac1cde757b99b209c4e267dbb50b8cee8935d75516b7f3a11cdcaf89520b97123ae4b183fb566ccacad0c3b3f6469db12dfe8d99224bc7a1782521a741b731fd4fa5d997e43d85f1fe435225262ff0f8791fd5503a172906e360a0145e823fec42f90d6ded6b89cd158076208efbb21201e8b3436fa7949cbb03ef719edb3a1409dc74a26efdc3ce8e12377750d54680b0f73fb45001e458b4437a1a78fc5234638df2415582abfe09b171c6bddbb0321d6ea5603c562e9a6c05e7e158fbff357d03d7849eb36fb2068e4c3b15bc1d75091b502b561e977daf4927470a9730ca66e157bf15194d5e084ced491e5fee3c18a3620ff9ea51c40b017de694093a1da30bd2efbbe303877c717d06647fcd79246e0e00be3beb509d6801e300abb014f1d3d0df631f6a102bba7a7b71990070a133d75b682f7a6efd1d76bb71d92b97f47cb09b1be91915ffee289fe7195252423f0110969a7100583931a57eb550674f29d019d18ca5e0da9c3389b7521b44c5d2bacbb0f0b43f108042322b98b45bac5f89094d694b7cb8f8ba50f90e57d62cae206345cd1bc0fc8137e42a24128d0abc9aff0d9b297d41f1a3a4cbf49a120facc84c5b3500eeca7b7f904155b96b07a925000f17fe74622d585909899ca29f16aa6b92736e9c715525613937268f135fa66c2350295f07a68ca5b326830f7a1b0f37f52eb079e6f949deb46fc988d2c4d645843c2c948560ab04711cfdf28a91fdb2c7bf13dc23f8ffa503211e24d0755213f2036adb0dba067fb3641346414ea9f3dbff2252f5c0a0eba1897f59da8f8a24da3470b85a67bf92ecc34d890e94929983ab503d4a70cd531c59ee19f7a7f956ef7ae6f71d4bee3fc138f44c1cd89db57913b06cf81653316c9ca185eaceb24cb859786c03e9172e17a481d37a77abe90f9568121d88b9ff413f1774e18238de7f5e8c337f3dde3d800c65fb6f908a3d48e1fb6a49aced12cc38a696d8cc7eaf1d6299bc79cf66eab32777995c6da03113805dd15c4dcdba5ad40fe65b8f37a4286d6357429bb5cc429ecbb8c2389fa2ddcd41c9536f2a13ffae9da651db576f54f4c720ac13d43425da63826e349f5519c29268b1076b35a6d8f3da97971c124e90a315c00f333f100fa77e47af47d3bfea1fa044a342f61c81d265fb3abbac38e7056eac9a4f4f2ab94b275b3ce0be9001a2a869109f877827df2e73b0bb44472a6e3d6a2b83fb4c81c2631b7715b117d01d5b6d758301bef83fb5383119003c7d1a20a4b52a7184898069f51ddc916a3cb55d1fe00f510092e97b7fd7f49d3a0139271e308d082551745fb19986923cef487bfd2bc3ae148226d1a0d184089604d4fe172565290ac07801a96037ffb49b2917ceb8239e509d65d9c23e7478f0b2d5515f03346374e9d776316614baea5da21a4872b0f1d5ec28bf1eaebcb52e6148bb1c00da5295b8311643cdbeb243fedff29ed7049c0d8053e4f165e8f3a2f8764cec1fb59aa2aa1afe4fbf1ae83202eea5516671310ffa05a16b33f7e79ee903c8e34003b894069143c1a513dc034e66ea0c3fd97cc258340ae8d5af12fcf341bfce693d6fdf7277212d56399eb03f404694cdee27d819adc8a29ba927b658b66d3f37b9b3827a08391fef6d961d3ce2ae3ce77d826046aa60de553ddf81778f94236323d30520b878398c2c238ecf188ceccd111c3bd9dd92f326083771e056fe9280cad09575cc7f8882580b5f7392d078c9d1aa6a37d3755add41c289ca6a75f595f706b68097615ec3d7d72e1358d05a0902eeed7a3c089f68eb64a5d6de164cbd79da35b12b4489bd4823fef0172ef068183fd7fdbab5d910adbf84503e9b3e64ba13e21d3befff5e8a05433a5e5d0889f8bd30d95006520fc0021e24a83bc9b1e0d01cd0a85fca2411b18151ae9b1f4d4efd5c77589d3fdedd64c2b89c498bcb2eea80a12e34e1d85e6fb717959dbf0f47ceacdb848cb5e454089930e45e52153fe34e11a68b69346f4841d6dc0b42da5a1035cf69a148ce583feb4bd6e1def73761c8707b39af279867c47f139cf3c3d50d33ddf106ef18bc878fa591fffa60670c64ee7739a72062624483fc358ee7f55d5a256a3251af94d42a7ae65627b02d672cd36f76975646e317df13e6813eaf34c411b7749a35ddcd37cb88b2f31c08a1f4abf45d1065c5694a48f209674561e4598ffc4c692aba3e6944a4a71c086e6fe612c6b35da3ac1a48777d6c32e1a0203b66e91b9a6f68bbb99eb2b6af348997003c5ec44869e32e748f0e69f29baba122e578bf3358e6a4c832da203b0aa60e758dcd59415f7b647db12ae95585c1ab50b768f7aac011abfbf4caea71a7cec625e300fd2361c135642e0e609dd30e05982e2ed0e44ccf106dae0ca36753e28f29f6d6c25508385b8e78e1347933a426c274c56ac6192c969ee17fe147c02ae90152cac3378d4163eadd1f861919cb65f604f745758e842e948b08bf802c1a0d6e9af2e6496631e7aa7c8a675df33cb2b1bccf925368ff2e3b1a2fad1edd0acc1744ec10a4df831a1cac12b8c0d285d18a1f2985af09d9c567d2945d0b7b77239bbe9931de3fd65051f353e3a57ab979a8bfd686d82cee095aa83f14e49cebd34f494142287cf71beb1723d0d07985f2b1fd489c9aef2469665d0a24dc562e71a32704cfc6e8807311ed51fc456743335548bd4ba20ba8fc85ec0b711ee60e37979227f0fc686d789e39fe31af9470398193d8dfee8cceb01d6bf5e71cdcc39dedb8abf0df99fe79b32f2336968279f15f666191541e0bbc34cb36ed25fc7f78aa65cc91f3c61fd5f76538cb1a24d3a5fcce1726fa4c10a6720459fb83e738ccf24ed832280207e71f0b9aef33b107e57b603bceca275fd9a2cf8f2ba3b7f05f78162f715e700795e5d7ede5b210f58bbdbeb4afe8c9ed4e3feb74e98675f9dea5bd6f7493f90b11c3113eaf63403669222be53fca95c1fc6e4e40839d8362226e1678750915f820468718a94a68e6e9a175bab373a6d3b1ce911cf03a3c43ca5b66a488b9c5076514ab526020ebcf6e922d96a37498e1c701aab837e62181b6c5c7b14c1516af08fc5dc4fa2cedfd9ea71ffc2a052a6236c29de9550cced4cc460e20468089f2a48838e380bc3a2ae7bfd80f13b82a80caa5ff1c2f4c0b431e7ddeb33efe63885c829885c270beea9f629c1e3d34027bed4fbdba912fdf919ae8a37a813365ef0139bfa5eb97836984012c0029fad5758de272d67cc8f89dfb165ed1e82cf096713d7a5b5df40d6b41c52e05574720618f643396446f1e607cfcea5139ba3ad371a3eb1e5ccfaaaf7c2ce994fd64b97c276d7c681d354f95ba4b4c424b906f905b5e9c9fb28d3e563c692f7a6e7c769ab6ca7a0bbe3c7a8b961af15e6399c5f49dc2b58b2a73173d11791685ec112c6f42b9fba850477c83cab38cfec7ea0c1474f8bdbec03d98d64ff467c9b3f28fc3526351b30396499954313bafc97a7f224dadea4b1fcc59ae3571320e8759169b91370847b736eb342cdc5dc55c8677a70653388d98c915c646c8a7e29ce04dfea830e28ec87b497c19f266862c71839e51bd73cd65c53b736d65149ffa7338f955f5d80adfc1f7c363d7604fe594485e5e97a8fd8c76aff60e0891860fac130f81ddb4b7ae1d02c74694a37313bc2656486af9583e1436800f109e07de6f1a468ba328739768ae92178e379522024904ac57769ff5f1070f4ad06fec4bb5bd7be0ed9cf8ed721ea153960fd11047d0021be4e71ecc1f307baf5f34d5b0f7774ff47238fba3743f915dfb8b26e70ae9b72dc241ce753c85ccd6e10a8fece03ecf58b61df7d19172b3468735e76765d083fa7baa01a80a71fbb5ea35c540ec7e9cf5c82eb2f026eac7d60afd15f165ed2cb2fe33c5069b76d128df38a9b1dfc25e515da4fb331007ac2ddcaf58cc567b049e39eb4ad06623d3146aef785c9210054d418ba128ffdc5ca97932edf59dfbb33a10151dd4188d18b0b533076fc5ddcce969e7984e4a0887451f6bf61a551d2969072c6a280b7edae04abd80f8727585d45c39ab23121aee22711b7b7acc56ad0f3d27ea1c5eb5c6bd68d6e825b4c1d28fe411362e9c7af9d93b437a24512e8da841ba48a1e50071a63ea9a4e56afeb201fe855264bad3f309081da9ef5b19c7395383b7a4623e836a4c5fd7b5071627aad3255aea3089f56802ac0a009b8f6c0bbf0088ef2462b4180c32f353e874848404087aec59d4b0f9e71c869fb4eab06f07f6727a5a5564514d2e2d281cc6be044ffa32d0f1fe5fe46b8b7ca02276fcbb9dfec121ac85824c2c4a120b6363d7fdef22ef62b160f64385c1874e3d5352b818845872a44376e803b11e2d8c00c33c2c6a2387def1ae07a808dd94c0019af02f9cc9ad1ab13945fbdea32e23ff9e7ad43a858e8ef02fa8c2b85e85545964b76127e969aaea4a610298f529d9f4d1305ca4b7be8ad2ca16f27405214e07b12b44fba0564977d5c3a970b8b97b8de2eecc6088adf8f4b2af5ebf2a469f1123aa833917d4194657a93ba724c78bd9f9a75880b5cc0a65ed882e46c5a228cc866a290433c46f7e59429a6337e339a3f6d9926f1d9ecda4ff01192f0ba83da56daf384b951a807965da3638159c94393ae981b18d28d14874f2f9d7aad6372ec152a2f46c0012abe63ec64dbe00d498f3f9819d1c0b6124493e739904ba6d8c9beaf30a00196854fbd2888dfe90ccb275d82524384622154601b5da356b3cd4a229c8c1d5770cc0d77d1f23d4c83f88a83b8ceed72d2df146bdc380f4c99b669ab06597ecab113a3be8dfb72a888ca786004f3bf862b7cc858d45e2bb88aea692c567fc69dae17e02f4b6686972358b8987cb4039000cd8d03d039eeeb9cf846d1a206db47406a9a01d9807026fa8f26ffb898cf747c6427227f3ca5573a8a4f27b4ae1a075adf8615986687b81db02b889001b9e4ce886edec64719dac8375de08ee41b289d1105059a4356b32e5d6b39e8a2258e0504b761956119e054e1a95d240d5b554d2cb2dd7c577d5cc5654f0e5be8762b5cd3d7616b1135e37554be35cf4c9dcf5e4bf8f3b840607ffc5b0f58c48e0b5d29192b9c5c9ad01ac2d34e02d094d5cf55750fda437780d3a8c9f5e6ea8ad82dac642bb980076b99a2ce9846809a122a7cec760e83e292b95dfe2e0f26562c2a6b3c8833204429fca7f1172670b7b218e82e5ff06d3edc05fa8c20bf4116c8e59b388daec3ac700a1232a805089f09315ca0731cde028c9307d0a560c4979f3a2032292ab1907d6d4b9f000d54d16fc43846b5334a0d047c4268225c746e3d54678a074549a5cc937b28082620afc8741f3a7506bfaab47dc8fc70c67c0cf61cd1fa124e13fdbf2d2c5a7423852160391837ba3cb28cee2cb410bd86c2047ee28cc3c435800c49dd98e7803945cc7a2ea6990a5af9a863c5913bc0ac5120f31cb5df80716235715aaa9e15a1bab6ac026c447a2a729ebb16b3a8d1ef9b4361d150c8b8c6933a934eba9781e6f39126473e451f5853ce26dca265d10312108f7350a3976a19d7f19710fd0db2dfcff8c952f1fcb31fb38836d6e6bb80766a0397147e9810272e8c4841ef739a42ae957e1901a5d7c1d7a15645b9bc217e03a80f52c821807a379511e525f2e4ec3372ff45c3cb6808ea5d7817bd1b3e933be9b661b6c9d48215c901c16be5ed71122d59215db73d17c55fe6d37ada0644adb446c02c588e79b4de7fd9a12bb33b4db7ec9726633394b024196bbf75ef0fa5d8ffea47e935cd06289c6cf78117366724f5e94f5d6144870bd86d56e09e65deb15325b80f2f0fe2430c48e59b50137da5c2f800117f5eac22ccac79c60319ce0547612d90fa828d11c9dec00aa0938908b8ce7402585a7c863a50811f49064984b80d58503cc835793110857955879f81ea7c020a2c9a0776f955b4b15d283a1761a0e6e8722176a050b8dd806565fa275cf54ceded2e53599cc589ae575254cf347b2b2aad630a5807b7543f46736a3f4559524675f92a9ea86e1555eb744c36af8a4f7ba4591dce7063485321b4ad34c0557f113cd93e72a9bb6bcf8035058a65b466bfa25581b2ba49bf9e442be5c8ea560df462494354ffa0bd309a679d40f8567491d51d074d8fb6313c5c0d5cc7ce4848176ab5b4ee614a41b9542c0d56b9c76c6ea2b377cb43d1090b942716e12c7d0a4bd4c86c5a234e40a8aa5e3555335e61fe4097443dd77014ea70e099190a6e1cf687097b6623127d9e588a2dd946a2f670ea60346537266fb4f8ad1d510b5db6ef37a2ba2b847623aa19727aeb20b5d2495ae9b1669b55cf693a1e1951a14c4a6faed6c2012f6a5218515343a84432cf26382d9665dd9a6245d332e7486db355129ed33285594fa568a56c78f215be5da628ec45eb9c6d06bcb529b539e39c7980232e48d4ee541f9d58cf9a5e7626e48f3eff37d3cf0dd0b3521928e42c006fce63cb8747400e0d00cb203b9118c89b53daa7bff83ceb6c49b8220ff55de8b4da693edfe614729fcd190fd92a6d5cc61e97136dd2f5fb3a4784890275a27d50447d6755271b37c31077d63326da2aa67a0a723813bab396a85d6acdf3dee827155bea645eea1a30afb2202f3540433150752ad2d70bdd709dfacbc1f0950b18f426adf17668b395e8e4c2a4188e2ec5a5d0a16fb64e96c8f640890565e28c16c4bda961edb9d2518177422b23f00612971e0e35796a076e94d909fc3b0c599bd1aa7c5bb66602697e247f8470eb8b2d1fccfdd910168def01ea43c2322f615a14bcb29070d0e2a6a241ace79ae0da98eb9bb21b4d2cbb8b3ffad09106ebcd0f28d96a06a4c9b18a962e8659c312322c651c1213712e4e6a50bac00bcb91ad42c5259252e5d426a85438ef9fd11f1084dd01b74b6a67932cb9f5964b3d1c8716d7d4f574e986463daccfb636fc52713b2e7595777b6abfd77492e8c9c3a543b3e130254ee89318ab2c2ccf7cf74aae0d924b7d586dece2b95fa900c65c1d9ad3c639ebf0e11977d7c96e222791084ddfe79afcfe374f3e154d274d5bbca2552bea2567ebba92b3ccc65b2b92237d977b4b9b1f23a34f1e24a2938224c6425f394226c4650ed0e17ed617964d579d9ffe0c584bf5e5e676cd0cfabe823c831c4d65e959c5ae81e37cef7325f080c408647484d5392679de10c86be82b25afbb4ef1bcea3fa3f2c90f0db260d6a91f1ce7d0e7aa7615ae854767526e42327d704d9b880f5789c40873e933f118ad8dbe43349d5cb50336b0fd378b2185e2dc78d46f4457b4cf6bb1a2fd8f0ac884265ad69451117dfe5fca1e56d7d22acadc543e79a3ef5122c4b573f1864c95a86ba7a438bc26560245922482149571453fe7f8d27f296b815adc9e325a90f3ae9da76b90f26ea314a4f8c9645228db3f95b738ccbd3acdc4fe6b7ee227d7d37f32eb6805325f9e832557597dbbf902aae200c2673ba5b073071891ae1ecbf310105ad5d6b06aefd3284b02e152f04963fb846fa21d95ad45c6bff2a0a365c86c44ff602222e7b5122c503b7fa5538e8a0ef7ecf96bf071e4fb46a50803b09315a139675ed3ba39d33ad9f9ec49b9f101c338ea3329ba2417238ca8ab9bf50250430d6ef93a4ef85cf51268dabccc130d712023f132342c35ef28608d6aa948bbf66ab0b1027bac71e054f31c404d2d598e444b2df4f7cb17e2c80d1184a80a86e6e69838194c664f1bb854b2671f1878ab77c7045ab2951835eb51b2b4a99ab5c450b24a9ac83bbe5edbe3220c6ef7204d9e64559d4eb245f322d9d49f590a2b93b299168abcb520d6dca2a4195250a2a02d0125e1e822227226f5ebb1d10866c3b9b2cc2f3a85387ed1515877970a59cd2970a9ec6997597ed409ef918ac61bd277f675f1845bb953cea1202ddfcca7263be452a69589ce1cc71683444b2a500efeae99a22baa8c7ec50bf10efa369d7c9be0f65bad681f5b51171a02d09fe5ed8a305d327ac13bea1908a32e38893674b3cc9063ebaed7dbb915436c5ca2d5023a8b7686468152f3ec3ad29ccdc8469720f787c2186405071917a7f3df634c27aeabe69686964ce4f5469de5c284e4215c21c59e7a7568e24164de93cb5da257cf0d785aeece6f8144dd75896051295ba84ee1c27358c99158e10e6663d701eb192deeac59a7909106ddff553bad4714573e0b67a7207d55b87b3d997fb61c96af6053163279a01f1a7d944a36b58051329ccf8309a470cebefb6b0c40367e19d72b641cbe70589990161bafcc5504d8ba724d2e11b03c5c16d486c18ebe01d8beba238540b5241c442ce133883b051f62a4898b81532beb5973af248edfacd198a82a1c31c5332567a44f987503ddd6243997278f0eead687a9f5c3baf2d3534d03c9b3df3b9aa52086fa4d44022e8d6cbc5842df2216cef66151398be24a226c38b8c5d41b3be3a642129e3f82bbeec5b2bd95d867c48199914ee0f730f620ce2bb1346c62b65fa777b78aa5c8d9bbe7dfcd885670481781b53191e8f6b17fa615df3a34d9d0781599cc4d289851c1b6e92dbe4f3aa8a4d375a55e7424646bcf89a23f928b223645ea9dc0b05abead887f16fd695d855e8790420727de8b366f1d3f002ad935a9230b61707e36a290b6090c372a0eee2520d0cf02f58260e6ffaf017dd0ae1dccb8e13dd80e1747312357b5c45e25e65db2403cb3ae772bb385f8df3dd476e4c0260ace4f9365a0a158fea2dd753cf901fd736165ab2092139d3156aafa19db655f49dc08236cc834ed8f62e4e3d33b55d8b7e444aa3c89b24b3ce9a99106c9bdcd466f85ae6e966567ce8eccbe983a36ef71800655d710a8df370a1e230129f562447a0e95368c83abea36cbf19586dd2ecf5491b7fdb27da9bb1c8bf79e89b97e1fb8918a9ae31ba51a41a743beae943fb7eb4cc65e562cd5ae2847b4f40f2ea9d2d8eec57636dedecee297c541c9ac183e7ea66ee4715fcd7ff0278421d9388eea3c4a26fecd4f2a584afd590be8a15b169cd98c95b8cd3af01d80a960c1a17356f4c73940b4226bb8238c9db79c4477ae9adf49ccb45ad6143a05f848c6188a78d99f74597505cbb3f238641f40893a4c4d8b0586eb323031e6dd05613da2a3e1adc093f5574ecddf00e960a4204969b7188d19cdfd2cb92f23db04373dcc63b3f172fce87980f8190c2c1b75e83315b855783d2b37c908a948eb6abe20d93893c55c1250388f47fd602fdd1bc98ac47a2f3d150abc7dd4b205789be6facd4dad80ac119aacbde338bb6a1f7cf8e20f6b35b911e414ab6a077db74637376880a205470c423f040ec44839526454c8c98b0a2b4ffd0bb7eb6ab0893377f164749f2a5cc80250914f6cb5342de9bf7a1dab382df310229c635e971995df62c165e543eb4f485034a5450508d2dadd949d63b0cd7a3a2df71d3ebff76fd78bdf4d2cbe4ccc1d98b0e1bbd6443b250410741e714e6a9920180aada746e839958d34ddf3cf91ecac993a389436fb2a50e360dda8224eeb38c1b2418d71de21cf0961882562cec022d0de53979e4820575b66351d6218e5c0bec16d62ae28b7220e8e5f9f60e2c51f5a2d3c338e440799b8ba38dccc2a8738b686123e915fe05c60ee96510ff39068ce88d2f4eceb8111150f7311d2db26617588e688280cb39010e925f0ac26cf9bf4dc01ca9e38225d4c1a40370d793672c72b3e92e6ab1f0bc1ed588cc155b44c08429f58edd4a5082401a853ed4bcc7baadc41c0579f983a664a18368a649b39c51f473252ede290d2541e3cead9b022929783fa7bc3756781679bd2694886f64ba007a6a29c8a2f30305dc4d12572c614782523a31344d9e7007f5dcb93d95fd66df9b1907af9f0ae5c429a7b419c0e8c7a896c75a106e77244e1bdce17e726c62500070bfade70a4b50966795ec0974205aa10026b72268eab4a7dc469a9afc472241dcc7a6e395f81b9c10780b80b70a041181610a5982e30e25eeeace7d586cc20568e452e190a2b4bf06a7e6f93ec00daac334f34389cf847898662d3ff192f92ff7e513fc62c57b53df0484f179b7eb1cb1274e5b5fe73ac41646b78616cc11c59a5de7edb00ae579b879e327ca7d4018fcd2e43ce0e2ae524aece7add3d33612574c3d1d75e01155530ea358f31aee7a1bb884d4d9526d0c749ef0229b4ed21406cb1725b8ffd21401319d1606d08b1c531af6825cdd0e762cf1900cfe6fb9e4c41f42198c245cfcaf393eb246ebfcc994c1d501bf18be9dcce426236770d0066f65dec99e9f5a037bc8ffb5d2f6e3febbbd89de995ac20813d24f1292bdf44ebd6468013a5a23f9369f49f7625645a0229548db675f20d71ae56e78045c2d5fbf42342f044608a575bc6a345162be89e12d5e71be899204973340c48f51e6eb04b4dff39f4ba8869317b4a860cc94a07440b80e9757c5d50cee13f8d27d4add1cc06bea3a0406fbda5b2fc8c6e5ff81435f1256826322e98af75613c650230d9a433ece3bd308554cd4bad5f6e592e0c8db0c94f8ec917a5066cae6e0e628203812117c9723412ff7e68045c7578481696660276c0ea2c1b389956cec0eeb051c6e7a0ae3b3d5efd129b861406ccd36c7b7587cc971d6d703443b9d3ec97467b60766a4a339ed0cfb5aa59057758ff8541d0baae981da44f0caaa13fa83d7d0ea469c2c19c4e676903c0b04b4b3b324c7aec0a8ea9d1efd4cfe96f9074f752302ceb183d81714579d7c6cbb89a3c315f5903553f6d7c33b120d382d5b06b3b9fa371dd8e6b9b2872652526919c482cba8b279b8a41856c6903e68f7d1200dd77a0b51beab282affc6cebadabb658a68cfce745150d00c9090345d5b6bf1c40f23b0d43ef469ab93cbaac67e7b7520a3c159dcfe006e895ce2f9ba058937086be07f5c6355694c21b87972ecb22bf82d8d8248ed0b4ce96ee1e15d391399802aaa79b03789a202ce755a78e6c836c7f28728aa5e629e65d6118e244d4a18732b6aeb366997dc356d410702b374258fa2c2593ea3e0010118c3da035a91f6a02f08b42346c84308fbdb1591e07b7515231058b862a67cb9cec51bfd55dc98a7f966ee474b162979a717a6a05f069855ab97d67013da9a81750e21e7f67ec801de0d8a6b8209b2b314a12bc6ef5399263c36a0ef4908cd7ad130e47930863cdda120cb1d69e0be599c3e1367874f0050061c80b12c4903a68b31ad8c763bdeedc4a0dab2422155125d698dff0c4402f8fa556aad2edfd0d44659e880910a5b44f5007926cb7ea0af2a4b447606051e61b98e4199239c4927c9293a6937f62bfabb4614b6fb304b20b8a61ddfd3c5d97f8115a8667f93a612350407a8c3a7a7db0c5ecb57525e941e6bd33c70423aca857ea91b47a9f1408519d828d0cad59b2aa5b971ad43b045ebd8595104210a8b54907303333333333333333a9334c96e26eb8c8a811ca8d48592682644a492983c38127e83cf21a6cf8d8c066c796524a29658af0d512700667caccac11bb03c9139d0f670f2c3d38aba963efcde9daabc2fe908c08e46933cc98261850684e534b8b0f1850c8652a39e3c8f4c9efe5476eabadb738d3c40216c07438a21d48cc30238ba9607fb7a778e3eb6b1998918c90f73a1d5453be7ddf3a46e64cd36634ea70a8c88a8825c6156c7de79cf38a6ef6e8f5b345a9a6933cd992bf43ae079fb3bfd512c67d1004ac2d955cf3cdf6fe45e75a64c458be3cb6e96b3d7d6d25679a8e7c3a333e4d2d5ee8d08225f4a317d0e8f3324d310c334dd31464039f31efd97adb5a77e54c134401bb7afb5853dfc6d439679a442da32440a64914236219238ce87cd77afc0d77493939d3a4e304dd1a84ab79c7f510329b5913bcc7d2b5e612aa6ad8709a44d3c4c24509d493ee588c4e6a7cb61c679a3eefd94c130f12bc5c8fe3944b4a85f339ce34793874e439669a423f6a6034f4d7bea554ae1f940a5745f0459ccc1d73735dde185c5e74b329b9cdee9eaf63e34cd3e61999527baafde75af9bbc8ae87cf67e405e3e46644d6ffc6c8e66f839039d72ed8fd6bddbd70c95d0ae16a6804cbbdaa7af67b8c29d7cc71c1d8f9628c697c4a32d8b6806aae6be633cec8ef6a88339f0ba73716a56caa429c75638f298cffb845e54c1368344d2df3bb504110663c77ae974bcdc65e73a6699a464fe469d1adbd59b5d6e99cb30f63c88a15454cc0928508e02f3ff554b7e45ec758c67899ef393ba89eece89846ce344d53cb34f5d41b962259c8d9a6832daae5cda95984032c0a0bc81ddbb35b5dcb5d73ce2604f2e1d2d415ca7ff049772921679aa60032234309bd9b15afa9a6a9659a76fc688b45e7f045e5947c751fb25ffaf73e570f3a16392dbb645642a0e98981e9b04c530c4c679a60643e437a401557af17554bf591e1348d422ffa745a78a8d6feebb1ea2b169d72a6890c50e8c88e10c48efbb6a163b7dc74c901c1cfd7cb5653b03dab6c9c69e28864623621d0dc84a04517c38e2b36630bcec99c690a31a7adb842b735c5da5c702d387b71a669e31fde807c9aa6a985870e32b88b212cba344666b7ef61bb3639d3141a89362d5f7cb1329281e100cb64c5ecd714bea78f7d1d2a679a363ba6c61cf336bdd5a97dcc39d39481c81e3797d0a14a5fce24679a3600614020003cc8ced773b87ee32874856bcdbd8b0c72fbe9ef2607344ddf9f2d3e2ed3344da218506cdf8b3dd4dde8b2692b679a46fd1e24bf19893e1dc79cddaa9eeadd936d36c699a6b514c2850b7be3637e5271a669043337473e9d31baf3e1182ad6bdb28f70c1d5aaa95a9c69da4cd3343165ca57538fb163313e63ce3485fea358741c1db6e9e033171f679a44fe2fda8cfec834b5ac88a669c3611651153020d0e64868b301c08e4d04a808e968d0662492096d3606f8807a4037200f04a6589102031dd0cd0638b00f03ea8d8ee1dac6f4bf0df87b40036ba332d0010c48710129567458a00315f00005d404365348a00311104100020b028522f0000f38c0f943116840051830fa231058804e40011d1818901409580ce49000020ea09b47f29e239fce9123208f050ca01928c0668000ba79ce04063047321b0a08408a00cc6c369b0e006045a50229cc510065e564c52409888cd1e6c8a7c311314703538112dd844023ee243f01c9005410401c6c50f230fc3911401c7e20b103b4883a314c809238083000690d9a20040fc95bb2181b1484710213948004607ce185912244ba1881860bcd1643a41c2ec0819403139c905609270620ad01138ce081002e587420491200722049520e4d0d3a21d002fc63623aa19168821131192c272d60c1091927a313d1490a4ec00924a4b86124f20e8904218528a008017445cb0acae7032b1bf7805042c082cf09747cdeb3d1d172c5ca1449bc23c5687e90a98bd016a3f941565656563e2730e38ff86f4e3c7105cbca7ccf868cff9ca841135948efa08f261620492b931b27424c8690860b74858a2bfe88bf264482222f3e7870c1c3c70acb4a12ef685c381b4cc4a8959695cf7b240d0834101805178830e2231d24fce1c42574b858020ca2d08e2a6218a68affd048cec45862c422516887a812ac121790a49569655ac1c11452489294801b489204008d0d56a74921592f749a1412e5857af131e2df32058b268eadc1864031a0d0c7480c878a4c53e863644434087d1692a499c101442e32d0c0e1e97cf1c6dcc2e3e1e19ece1792a4714324499a363e325392346ccc8c3a9e8ebf489226066138856130cd1a0c067086436a38dd35c3a1100f09f2f4107d3a5ac034181f23fe1f23ee3f12c984461f231e8f8ccb3bf7f8323a4958081049d28c012a22fa7739f2e90cf131020d09f5788fe41168887b4059040102021569e9241e8fcc100563c1586030301a180e8c0706044324e2e1f1f018358f34be3b22117bfa3db27364c88f3ed41f900fb82a0365c250cb9c4c18bb4420491a3476f98b9483b933667e0c49d2bce0a376e6b5d05ca025490a32f35a78dcd3e1f8d0b860146a412724e3e16214622e661cd4e3bb03f2e285845c4622fe20231e30a0cf3b0ce8c3c58739455ec65f661cd463d4310012eece87d35fe491748e7c100f77bae33222f097212cd082c8902d5e8af8186244041b307808d924601139108576a868050644e43fa021450491083248fe2a10753ea0167d0a568650f1304fc60a4fcf8bc4d8282412181231024f47468e980b49b3822622499a1022e22085403910d10622d0f8744043f6f372085048121b4a24e9105038041b9274087988222b3fa495e910193004242449f447b460088f218a4886d8610807ac8c4058acec00ed10b948dde1c4844030331e50cc260634dafc180c5388377214a2c8ca24fa9899954f27482136500800489234c58857a45841c1824084e003219c9083104520841b92e4df4208a1006924d363e5459e178576f447660ea20631831043927e102118c40424504882008420e02009020a9224ad0c11449344ffe97864401d084c04020f92b4f2657446a33fa231a38c2b5856bc0363b20000989c685820691850809248b0414a431fa4210022260412cd24d180800c094900367f3063c6b332c39e1851e7c70a4b924666d7cb48923422917731020d49e29d8ed118808826a45181111efe3102f31e20a0d09760a6c7e8f3022ae24313a301f9a733461f180df800874318800f889024090d911839f820860c50628082c61692746209ff114b2797e8f85811c9708aac5821e211fc8018300180250ac12b2041cc210836d0c080043bc4f0cf8bb102d32143c45d88423b42fff9c8844e228107362449e4019dfc413af1c3c91b27208880034e1820c61db2b8c3ca8744638838871d0c61072c489234851493ffa88998cc41da811ea41c75c04267458c970915992f626c6240a317119311031ac551073178e687109189920a9450a0440a3162402117634500568856627e248a71d8ce8b64e0000a38f0e18a240c938461e0c00538d4603d57a867c52487c9024231497e65f4e9980440638437c0e10d48c8431de2d0863494210c5217a42c544114daf191713943123724593163c5c35e00714309dcc0a409728302dc60c2883076ec5026580963c70e13ac58600a6dd0815bad395070a21290488421dca08632b021c9911400715292a40e489266a79511e81392508d4f070d357842d4893bd40a103584d4c09124a98a239f4e06d4f043925676bdaca4011347d2008795e99b634469a8822485618295162a56c230411ddeb3d95c718524871c6808b2d9a0010e689082b422ea783aa20edba1a8a0a283862ad0b0b2324d11022964423c8648650c820a63348f768c92bc47320b66e48764b478c9197d449d9524ded9f44766fac85186152b46a0cf2609c38c3e32a21fcc92880c472449028998577888423bc6f8c8704654c4c0c8a4608678c4cc14e9c00734c43f31a098911539c4e0054944c5045131920189423b92304c15a18f8119a379a42360912449061ce821ad318302c440481888204983b8a2103ee0c108a42f7a80010b4370708338e2e8b448d2180590243124298b2b727c614a92f41e293bfcf97456acd8950dac7cdea356aeb8c0cae73d2a08905410200aed18c9c048142698d1b212c33ce88104831205772815fd485cfa1c5dc080833e3efabd10756278883a317ce4e38981e988fabdd88844efa00f1484f0874622e9459242f0e98446d3344992c602a1101031c498428a180e91f191992649d240e063b6000d912469036668a0c5910531ce78c10accc0c2142449e291680a020f8e7cfe8d35441f2a99917e241ae3634045a49220a20ea7c88a8e1e33a350678587277254810f3b441d0efd3042107800035168c7e8ab106dfc032000f6cf07342395f0e84215a8102349225016333030323f2449f391240d8c24693c464043bef3c33d32a02fc80079be878fcf97010ab98ca1494117a021224de7f363808a489286c343923447341710324d2cf20642040811d7164446911f833d3d5a8e803c211fa2d0900f8f904c37e8c3a383a4f3833f322b1fe2ef48167dbe8c108f5e24fad1c8c714923f2f1f9219c9cc90cc48ae7046a18e5c098142a11d1ff6ec10813e222b409d231dd19424cd4b399c108443cf2120adb5d65a638c31c618636cadb5d65a6baddddddddd5d5555555555b56ad5aa55ab56ad5ab56a638c31c61863841042082184f0bdf7de7bef3de79c73ce39e75a6badb5d65a638c31c618636cadb5d65a6baddddddddd5d55555555a594524a29a534c618638c3146082184104208df7befbdf7de73ce39e79c73aeb5d65a6bad35c618638c31c6d65a6badb5d6dadddddddd5555555555a5113ed7d85a1502f34202227c22f455bcfca773e403c4c34fc447880b981fbd2480085c4892d4210294246965d2c441086b106388182b5f943061f4e14f07a6136a51c75760643e2f0d810a69466e44228e71c963658767d42198510772040114a2d00e4f0c4c67f376282afa91cc7028c4171012e487bf8747ece21d9017ccc3686ec50a286302d0286626d4a211c8231a813c443631313c4d515bdb9068132392244d0318a0c5030217a2d00eb7e2078490245168d4d9c08042b38a7e245d208224491e4f47869e0bd126f43170d5488a1f72f8401192344d9b18d10fbe90245168c706aeca305c955999a01c3d0085d448603e240aed1875245cdd88421fe3798ea8249482928e194be8410c90140046cac10334489f8ecc918eeccee86138a34e88ab106de143923422f08442401ae4f1f09024e902283c4081e364023c3809fd68c4315584462f3820d21122491a03ccecc063001d804214dac119714c153323b543a900cd4f672492e9628533e298158f87c734b9b6594800d06856749082248a8b168e88b338229a61cf3b1920f78040bd4112e2c0c87ccae88892308c229926492a618148823c3d7ec4fd01f9f0976992c00d12d189e10d8ff847a8088ff8c7040191244d16ef913ce211ff08f588010d890181824892060b69bebcc803c43f40e64ba88724695cbaf078d8c78bc7c33e6240a11f588c9e88871b14e4bf0816a327e2e242044222101231e29488915dcea020ccbdb8b8c05d2fd029732f648042588c44a2cf4854860a80ec7af92141828cb018611124c8ae1722461e8b5d2f65a80008732f3f2448901116232c820461ee858891c782b9171500d9e5320ab2cb6584c52e970fb2cbe5b1d8e5a20220ccb90461ce658405732e1f843997c7823997323c3e76eddaf5f2f2f242c4c80b112330fee1b1eb25b4c5ae9710088c5d2f1e22bb5e3cbb5ecaf0f860eea58c910fe65eb860eee5e5e585889117224660fcc383b997d016ccbd84406030f7e2216224c421c2dc8b27340275c1dc8b48f2d8b56bd72e975dbb76eddab56bd72e91e4c19ccb114fe77d30e71202813c2eccb9b88c441fe21fc29ccb28a40222ccb9b8f360ce45ca1061cec52323843917249d1fccb97c3a42987349c2429873f91ce98866626238f4c5ae5d445e8cf8e74749801071314284391723fd91091561eec5e5c72e975d2f445e8c1061eec5888f1f816040212e9873d9e5f2c29ccbcbae5d2eccbd7c17ccb9489206c80f1f452449d3c3f31ec96574443c44a30e4c0860def31f3353e437a2cec7ccc4cc14c1a23f322e331f1e92a40101688824695aae6031001038d890409d1c708cb6a8e2058e22121c1a9024e93d9dee1c611838244992de60041f74e478830ad24a08f4061cd2cac7cc8cde188956a8f8808614798349d2ca1b1390624039dcc084b432291ddc80821abbdc38812431f79159f9b04892f401f5e7c58d9595c93b39dc90244922d2061fa436a0d0c60b244992a20d3024498a951c6d28498a15981068b641809529f4477e24a9782ba0216ccc3848b28104696562030e49c486880d1f2bd3c7cc8ca48ce83d488e16f77c78886644a1effc1fe1111137d240c11a9c38f2e9b8f37be4caec704492c49172ac81a4d78ea5828af7708ba8500b050b13e2955008c8185b00c9b18624493b78c0800a2b0c03874110353621493b42a050e845bca2a3c373e56565c7cc8ae87b8878f8c3fce8450d2d02108000082000010880003e3cd48bef6293c615d2f83f724446f49c918e2164fc900d5c058d361ffa80462209031a9101fa6c3cfca11fc9c47c3aeae1df78f8c8c6c31b0fbf48c44794875fb4f9c86c36fef29d5011efbc67e399e198cf7b365f464724da8cd13c1289a649e4f170ab8ddaac176aa336ea458b3a42fe5d441f9088ad9024cd24499a28e570011ba318c52846214992e46149d2c0239f4e6844649a40f3f3e27199f1c4c4f06811893809c36c92304c4b128679114b91883d2dbb645842cf451286e18c8e7c3e4889135890637656ac106313026dc4e8210aed10397fe87f6e44331c039a9f17211ede4224628f0fd10c73a179fe2117d1e7c7008d444f02d01051680747c41c33b4300a8138d32301c56c9230cc08040a0dc9c20b2d5aa00c4bbf17d3d48f649a7c24dac48878c47e440433e2cde8f3228e88b3686961896121ffa1223d3c3cfa80cae884409c96cd347d2734dac48840438e747a804045d8e354c60302c98dc8d33285cb8a8ecd8f118f8804303e7cdf8f2c615be798a8c1e064aa9d95c71819b31d98a4c1daca3db8ff145cab1d679ade0b133476be75cd2dd8d6e40cf8acdb5453656b4b366e3962f282c7fd1d95bdf7f9ac720bcd287897bff974e1ce6f373d1a51c8099f7b65ab652bd484a277aed89c2b3519ae170d28b8c1b5de93b1ed4257840508199a4f28d52d42d7d672c558cb74058d27987456bd363653d8dc4726d4893959f4d5a51aeb95b001d15184659afa933c27d4eb371fce65bb38366c1981403a80bc1032b88b87d16c423a7b9beb94f4c6d8394b08349a90eaf536f68ebd7cc1660e0b4d261cc22599f2069bb2833c0281ba48a2c184d3ddc8a47b9e4d3ab89c961850e8c734c580429e85e61292275c1a23bba9eff05962df5b2b55cbff996573a68925a4a9c47ceabd5dacdce408f58528d1dd7ab5556fea26463309d7fd8bf172c7646bab208d24dc73aaec2094cfeb3a882612ee316e0bc28eae200b4c83f12c21104c83314d40d0408279d4e82d4e95b1e5ef6a1e019dadbf757faa3de99c23d67aed5793d0f757b783d9bcd23482bd8bebdfeceb9b2fe34c538baaa161c4530eb6e5557241d6e838d3e41f9aa616cd22209b313ac972ba6ddb73041a454c56ab987c7146f7b3cd44f8bba6d864eb9603d360f8e7894cd314aa43019182050c0d225a359e50c976df66cf1d024e973e7515f22bc99f2e34866070bebab6d6947b913d67031a4d534bbf17a3d02319a39913024d215e49f5b47dae7eaafb39d3041a7d3a465840a3cfcb4ca808cb151a42c807634375dc7a65f4a619c42b55bd9a3eb7cbe3741a41b873c578a997eb65777ba109c4be7ea5fe5d7c2fbe6f40f853c75abab9a6ff6bff8141975295436fa6cd14c7e3e14d6bfcf016baec7e1a995bacab0fdbec3d5eab5141c61a2ba2e1839cceeeb1e12a7fdd1fc96cc1d2d2858e202c738bff94d440b307c8312ab57149c531f2d9629a603a47347a90abe283712dc9bd5815679ad0d0e4c12df6d48aad5036f84ca14ccbcc6bc11171163a7afc6882060ffa5aec5dcd2933c5f139329a3bf43e6f4f9f9ba55cacece0ce256cd56a792983fc1c4d1d9c8a4b29e59e4fd7bca948c7aecebc163ab4c4071a3a4039bb5764bfe2844af2473387c85e65af62e8b6b9b5e4c0a07cced57c6fedd7571c1c638c49e8d6558cce0a07c57a45572affa97d25dfd04c4eb83e978c12327c8d1b187c711b3af3b78ab1c8197db8d98b2e346dd0d5de92edca55be29dd0a1a362cb3c6d932f25cd31daf6199be5a0965f4155de4346a506c9b5cfbf395ea5f2e0d722ad7ed5bdba770710cbd87405768d0a05a3d664e3d2fd5646b6768ec9df9df826fd3d9e8d08122058d19d82364cba44355ebdc5d7418d1f1c212c34246ec7199a6cf8f46ec99d324620969cac05e7cade23bc9ddd89b6490b155c6a5d0fd5c6e750cf355b67faeadc4b074fa7a4aae15a39cea71a6698298260c3de332a8e4ce8572819c0b0d18de738df59391bd6bf25bf30557719bfff52d381f422f40f51cfcc71ef5279b90878e222e9a2e7c5b90fdba6cfb14f7d37061c555c5e2723d573638b7a09375326515bd777739d3a44844a0d18263d9a433cbd6aa62fb229a2c405deafeda6bb5df0b6281b1061dfcf5313ec6ef57f8d7e2fce6df73ad56536385f564c3f7a272d7f5be556129a9aa5cba756d954a4e4b4b16d394850e222c3dbe132a324dd3b4f911b390a1a1c2fc5f53b555d5162e6e53682c5fb55575acee8da7a9355260b6ab9bb26aab8902db9792a96271d9770f0d14d4fa5cae52ae3599634ef38415d57c065dced77eed191a272c96dd91bd2a36b7596cc2548c9b9baffa6e9009b35974504965ac3d6ae34c930a7e9a5a5400c4c39d510c4c13298166096bdd642c1d53aeb63ffc1e1f2391cc0f8d12228c3d55ba6acf3cb6a849427bd9d47cebf3a5b6af4c0c12da5bd75e74ef5641f9cf99a623a828a77b0bb69a4ba54fce344d1a233064cde96b4b6d5c330b4d1126d4578cf17bafb96888d0bc6f45f85c6caa35169a21b06fea71f37c73df6acd99262144c7a673d8dc21e31704a8db503966f8aad279c34303047fcaf839f8562ec6dcdb8040f303edb756b37e0539d3e483e71d6743c60bd953ec71a6699aacd0f480e3636a7ac3a61ba1731ef4abb75ebac6f618e70e262bfbf743e9f4f5498d0ee0d497ffa0fa0961639883f7aae93ac68c59749b0fb1640d0ea672acade6ed96df29e74c93e606dd5e19547079a12b2839d384028d0db85dc75d2d2733c69e71a66933131a69e250ce92157c4c17943a5d5383f66df9c7a8bbcf6d530d0d16dbf6503b36d7a2bee74c53179a19cce573cda7f8f7a9c992334d335c6864a06be57c902dc5d3a9d9b4d0c0f1702174ed73636cf397334d3e346fc87591a16cb5bebdb8cd99a6a8718329ef8d8bf184ac9c749c691205d1b4c12e425710aa8a8fb90dc87f68d878efab372af49fbad8e24c93d3c440be74de64949a352647379d8beeb56a2917679ac2d0c020fe53efc5dd08bb9d2fce34a9b1912d6faf55366753cd99264d1a6b4d7dec5eadf77ca59c69f24283c68250c9f6cb327e7b1b1268cef857b0a9a8cfe9aeb59c334d1f50c788e6058b29fba99345c6a07b51320a7f2cd572ad9aadb816e44c139112514cc6322e6f255d8bb03514503d67a56cf154d55da0584d27538dbd75e59491334d464a3ec1b16d3b6ef76473c69a334d259e986f3677d82b5d2be75c27da3d746fce97eb2bf6c243092798496d705f7452396c0a8b222c4490946c62aa4a7fd0b9f541b594261e9caf2df6abd653f599097ebeffd3df630fb28f9c8fd96ca6e908c833450926a033d696be075b3fb9cc99806c517289774d1b548fa9c8da62cd120e3ec53d7d2a5cd7a59568c89a7a0eba93eebb294ab47fec6384df704e556df96ca1c33f1d2d74e8e082e5653cecc594829249ccf7ddd31dfe842b274b8235e550ba5fc6da735145c24d5df0a7fad5e6744b713e32ef91ac87124838950d32e5ca7ee3377ec4bfe52a275c3e1f8372bd3b62aa6bb751cef5fdddb4b47851d288d9265cea25dbe8f81b2b614433cbe678a974fd9cfc3136310c13c3424e50b20855f9fcc528fbc167d071a6a965a6a7690c258ae0c7f4dbbff4651f7d723e8990eb496f13368530ce6d9c6942c4526dc9053bb2e76d8560941c425584533eb7d639e5da73a669536208f6303e84eda936f5dbe24c53094a0a31dd4576dda6365bf115679afc51504288d51e742fc6b5209c6b42ce34b5845efa8a885784940c6295256bcbaab5a5bbc999a61241f48cdea63b37e7609cce99a69612354a02d1dfa4e35de6fab918b50410cfabedb197bf923ff0ba2767fb9bfcda1ce44c5315257e88f17d5fa3fb6b6c56a4a40feada5b0b4ee990dbfaed94f021aac914ce568e35feb838d314134bf61055adafd7d6ea8b6b9a7494e861b538775d97bf5a9f6de3ff319246491ea47b9db0c165eff552e7b4bc47f28a885750508287c7763aa59c65af63b2ddc1a3c677bbcfd3678bcd0eea2929d563b1657c333691923a3839dbd305d7647490ee2c5f5c133e7cfa7c0e3e194ba6ff9c549f73ca41ce57e91632a9665b2fc641ea7baf1d93113effd77050ebd6af9c72aedba5f20dec2d66aeb97e6f367ccd0d6c9ffbc1654e4ab56eb72869c3469ebdd635e62d25646c708a394fe81de36c4bd71a1c9432f2fb05993ef627a4440d3e595c92d742f83ebe4a034385aabb1a5473cda568e09ddcd6b1a67332ed48642a3983caa8aa4da5a4fb7c669c6972cf77e634bd2746a6482c318333642a2ec9e67a4fd765e0e69eb7e94a3df8eb1a199aee826ece8d8d3585af640ccff3a1fa4be57611aa18dcbe05f97bd9954e38350c4c3eb870adbac59c5bba948061b5357d0565fbaa74ba29f9c293f19faa16d98ad167542f34f96d4ea8f371f4b796f2a2a40b6f1baf9e1f5baed972950bccbdf7ca187bca9e84ce99a62b4ab620a7faaf65cecbab1c9c261dfe324d2c255b28d142ece850b2d6960f427d4ebf172528c9c236af64b8da742ee14e2cbc938b5bf9920fceb854975ca1e76466d7deb5a5cc31ce34b57c8915def2842e4e18dbf4b78d03d3607c4aaab0e4bb560daa2f2661539c696a31524205c9da735351aaa6628b4c448292294cc794a15a5f0dbee5a4a0df78ea5caddfaed612468b8e5d322620a3240a3dfbad3879b2a99a7bd3d42981824e0867fca564643afb714c50f2846f06e35cac156427978e5da31227f8bbe5cdbb45f7de9552aa09cc59af546ab9cb286142b38fd04d6d52aae57e5950b284b9244f08577264b68f8540a110109912253c26237bbe569b4af254189424c12d6e7eacad28218b3dfdc505254888efb1f28fb0d7256b67a3e4080e4ac60fca66b813365b4e8911dc8b4e9d52ade66227b708ed66946af95cddc5935589105df6af7c6c4e86cdad2138c89a64d8abc5d9569b332542500e7f635c75dbdcde4158ed5c37d8d3f9955dab0261aeb6089f52075f6c2e95fa4174aded3dba28dfdb5d4da3c407ec1afbe87c77d9b7bbd18b446a94f440ae72aafde3435ec526679a3eefd9803e9be751c283d898b9c5bc3da63ac256dd01931c5553d7afbbbd5aaa53a283d97835d6dcff8a4c55abe640b27f70a1aba770321757508203b64cd5e17cec39389772a6697e17d3c4e229b9819c5045a8a67ce6d6924f07cb0f4a6cd0fe756c12b652ebfecd38baa907e34fa88b57dce529a9c17a77ed0fa36233b6de1494d0e039c9edbe5bb95db3419196c4a064063d1dc708a1f47ed7f84b6450220339df5cfecc9b9aeedac2a194f287cfb58baa73e51b0f36fec7bc98c5e8bb4ad62871c3ade71a4b28df54cb9d624152d286c738e3ca7dc8adce41961394b0217f5bfbe8da6be3f2e55212838e4fb1e5d63f099d622ac9fb47074b89124ad6704a468d8ccdf6effd64d3d4324d9f121840e9facb14abbaf7dd2d437464c1520284123514644db6385f5d79735ff2829234629bffe07b53a7dcc7cf99a612349a3f43b59cc1e795aa71a68948c919ef35e79c8a92ed9c934b5eb056edfad208bbed82c122021728f5a59aff8ab2f7bde54cd38b8e2230a0904b7f0c9169ea16b0b711aee7adddbd67cf992614b04027831c5794cfad1579725a5a7cb008d1e143471196693263059129a89a3263eb9ed4b88619ec496f6f3e5e0eae5b4f48196b39e5624fc733b6868c334d33a1d134b5b4a8995091691a95c031f3dbbaff5fcfefa59a725afe03f2f898262d9248c84d4a6ffb332ee69a039a9f97d163317dc870b6b3fd2bfb5d4bea5348a292fa362ee46e8d31e54c534b163213b657caf6b5c89c92ce99a61622a3c5fe4c3ae724742a7539d32444d456a7fa7e5b6d396f8e334d2d2d6184d6237cf8da14e3e7e4e34cd3342d1015ac28258353b1b80bba9a9c696a11c1340d89710ad9cbc976757aecc799a696cda7334da151cc0b68ee7643ff960ea572490f3e8fc1b5627bc6fb8f156642d5a26aaf4d6f104ec7992632fec3c53471461c334d33a3f5a89bfb58e563dfedbb71626646d3d4029a9f4d19633cc90c42b8b6550ad6eb7a26751f3f639d9c699aa62c3a13b25b1ad7743e9d5ad3d452242fa57eac029410aed62915cb55cbfd491e850abf92a75331323685f5e036b572ce1815532b098a1466bb53ef773972a689239289e1811205d8ebe27aafdfdc7dc6a010b7cda6ab53955c3246169427c4b96fd9739cdfba71a138c1e39c2aaaafa8384d50bf587d5befbf6a231396632dee8acc53316b1265094ba5c2b7269b3d9bd54351026426a7afcfb55e544a393b509210d97c5fafc95eef5e2f0214242c67fadf511936251b7c41394233b69e94d2d98caa7ba018c15d83efbdddd71cdc569422cce5baf0f17cfcebabad4021c23206ffc5257932a7d27136227e2843603e7546654d4efe8593334d1ddacc7c78031afd982651683312717fc800390b8a10a68abacefb97f5379df9f098a6990f2b4a10bc5ff27a4a3ab7bd96fcc8845e5a5080e04b76ff5bee77e56e3a941f38a5d49a2aa152e85a94283ef8c972b5a64c41a5542826c96f469d4f47a1f460c2c6dc581d8becc118bb8b69ea500b0a0fde5271dd9983fe92b5ee607f9f4ef7fdbe9d3bcc0e141d7ce439ddb194535532e700b687ac30ba65b7dc6b283850cbf9fa97cea2da8f1108ca0d9caf095b3eb7af3e5773506cc022548d599cefefa08a28713863bc94656c5ea7aa9c6942a981c7091fae3ef5c6323e14a0d0e0b9bdd5ec5b3bd57e332337339e181794194ca9bab7c5b6566b4d278a0c627ba93ca7ba33d65a4481c31b8c0a46e81c5c4b558bdee0d8d88b0fbe62edea2607c58dd9be95fd39c7545bd76d447fbee4db7fefdf13a2b0c18de153d650c5059b6c2831585dc698cba94b35fc1f286bc865cc59e3eb7fab1f8341e4a8acda2bc8a66aa7286a3ceea5783267cb9f8ccb99a61f75426414414963b98f8ecde95894b11b050d9f6c7d6d6c87cbca9cb301c28272867c0de3b7bba88de973444e80f2827dd3793ad6a4c36fad38d3243a19056f7bbcd6b7e963cf398b1351388d4eb174ac77b1fab36071120a76adbd965bb6ec268c27a068a63fa564c87e41d7138b934f44b7542d776c415e8d4f074b49124e3ca1a05afcf4e972afa6732d2d3a3ea0ce34f9e0a413bf30ce9d8df962ceff38a156adf59a8acb1b9cae6de2f55b8dccc515657c5f2e279ae8b5986308e19b9ce92413b3a537c50ff5215b559c788289b8fcda9aea2454cfb5757289b6dacb96f95df038b104c33825dcb5709dda7dce349d546295832ee73ed49d6cbd764209289772b155e54295b2399b4d3c998432e8af5c8ced1a57ea892422546dbdb3fd9689443366d197767c85bf6447c8092478ba16d582be54546b3ece343d42bf7554fa535936e692334d3b3871446cb2db758cce357470b511b1df52a674953fa7ba38d3c40886ceee616c8c7f77116dd5cbe94ce7e2c914d16a57b1735ba9ed68709288575ea6de6a2ebe5d0bc6718208ff5dd24995f269730c0fe11e5ceb562ea8dc8afa38d39483134338d81abfb76c7e475988d8b229d717ff158c4b08395da3479efd5cef639c6992c1c920b8b58ad3b9b517dfecc7992641b05b7145564b7eaf698393407c8cec75594ad58b0cd0678d1340e872679359f5f5eab77f700bcef9133ad8983f3fb83a367f3d299d8b5245ce34e1e0a40fcc9a37dc97fe567b550e1f98727670b9f950beda3d7084dd7497ee74dea7878edef83519f3f0d62b95dd5439751ec20373f594bbea6ced792a679ada38b9c37a0d423519cfb86d35e64c131b277698534af6dafd8acb98e23accd52b5574369f35e3c599a6111c2774d85da5d67a97322a3f9e837f7cd6cc49d6ccbc2307fe165d6c4be573915fc741b1eae7edfbceed278bc1091c9aa3438573e7826fb2c699a6374edec05649f7f0a1f66a8647dcf0ae3bf27f74e6b2d5e0a40dad1c8cea2c9dd3f718726670c2867eac947b9d63beed45179cac41959d5a57e526aba6e691691279626080b07862605e4ace385143cbe9cea0c6296353c5b23849835c925ba7eb7a38dfdb697a2768d8e673a9f57871eb0619679a4649808c920039f2e99c9c41b55b077dad19dbbf27411e1f3d4ecc009fb2c856f292effd3c298342f5e6a67ad61e53e92764880d2a7e10b66b4ae53311119c8c41c5b84ca73aa638d3d4722286a6aff2dd74d3f52e9561786b293f74322ace66031ac5133044b7dde27a5dcefa3dffc26b6aa763ea98db26197b612764f7d62ed8cb7e5974d285c916c63925d48fd3452e38847332eea8d64265730bb0998bce5e6bbb0afee34c139c2399909e6841b6fbebe6a26459f076933baac82e42381d0b6acae5eafdf2a63ad9397f17d304eaf0c915de73dd6254cb1cdbb9cc0a8d2d8c2ae3ae6bdcd6484eaaa0fc94c29eaca59a917505275488cf97fab91b3ffeea25e3640ade0bba7de75cb79533ce3495ac712205c673c6d922bf7ce970cd9c44e13ddb6fd35f7bc9969a5058d21d63eee27a6ba5ca2e809c3cc1b9d954f5546ddb6a4f39d3344f9ce0d8cd8d2f5f63a58cdbe8a40952d74a55ff13cac798b2e284098c7f9b6c3cd5ad197f594e96d0a4ea754eb26eff985a274a70ebe5be62fba69cdad849125eb5f6dd2d4a57cfb98884187529e86bd56c12b63ec29baae13f15a7768c84d88b981323309771aef4f8a6f72f85a34fc788e7a408ca1f3756e8e06bd6b11161fd72beee53fdf3b2f612622f402743903c55d533bbb53bd72e21b0ab9bfc70e57a8ee33237fa748c9c04e13f4e7e5f26592bd9cc992650a773028436df84124aa61c4716e10fb6e75bad1e42b9eb6a6271e2033515bf5caa3997e4a407fcac77cef7e8fe1c32c7a7a9e58b20273c70d3b5b7ae96924f5d5c1d2f2ca191a813c45970b283d8ad5d498d6d5fd92a1d34cf063536d8a09aed8562920019753e2f9c931cf85a93653b5eaeab1e9ee0a0d75b8ab536165f83b0dd80d73dd82cb254b55a15e76178c8c78d131bb0c6cdaddbe6a6ab59c7c1dace2917cbd9cc9eb612344e6a10dd42e5ae9bad65b7d6090d3e4219a15b57c89926222733d8c95195bd96edb53fe6c8801b93be73468e3d55e4313e329c22d3a463974c0c4ee0d875fb8d25c3a9a0725d9cbca10bc2d7b275b67dcb118907f4e3c40de85464cb31e5222b53dd469bcba74fd6adb1c50b9eb0b15c47b9ab9b84eb2d94273150b6afb057b3169bce35a07b0777b9f5cbd149770283d9fe7ebaf6a94fc10739d3344d30222683c7891a922976303a359dfb5c37e4248d38a7bbe5914de9d853cf039a939b4849134ed060313219e36af67fefd419aebc90cde7f19f7adf93172ce931b23e06a7bbc77414ed1f7393bd153784bc38a2806efba36aac361452a5b65c672b46b5d3d432463fc7c7cc1475464c649ae6fb06c907c907080b4c40d1b1db6bc5d4d4dd5691334d312cc407269f98fdd2f992f2e9f415198ff847094c3cd19eb6059d2b389dedce38a8472758bd5bebb9fa295c6b119926139870a2c9359935c6fab5fb75b451269be866a5d8b15786cb1c39d3f401753ccc62a20936a1cee9deedfb9dec4620249d98cd8b40204e9b6422f664b64ec535616bc938d324da8cc11f92cc0413becb7295cba8da5f749c187ece0e934bbca8ac8a65934fb9b5b504f32fd79654efce973fce34b5fc009954c2ff31e5fdde93fb602ba8f3c384120eb65eec50953695cf412323269378cdcf3dc6e047ce34b5892454634bba37e3c3d9cb9f334d9b12984462df7aad1ebb5ceead68f3e116113181443739db4729dd5cbcd4fb323aa28dc923d669540ecef754a9ba73c23071c4bab79cfed3265daedc803e8d884b256be99ac376cdd354c484118ccdc57ab55ecf97649345f03b167d576be44c9322a6f2f4d61f1d8bd09926227e9cb3395bac2ce11485643a041251618208c718b3d5a25ccae65393d3424c0e21a1fe7307d9cf7f6a411343286dacd7bf73ed54d9332944afa631be29674fe6cbb160614208b6dbfb33463515be981f8944603208f6d4b9d77815ba56aba6a93f32f3c54410dbdd6fb25e6cb2e5e8643cec450788492018b6d78f4d57271daf73a6291493e401217dae39d56cb23909bf71a6a90323623298c91fde9bfce65af2a95a6eaa1f9af7ba7e1a9b4a279feac3af57d84c237cafadcdbf4f93091f96b9d4f54ffa2f94abf6a0afd1a733ff77e6dceae13db6e6544ea56b2b9ae46131fbf6d6e247f8ad6b82876d5363fc36d9afd85c73a6c90c933bbce6da3fe15b726a7437b103bb838f5d64bbb815b7b8b3260626755851b997efaeda41d61c1d9c39de2859e4071d2f9fc3f436e32ed9cfa9b7b772806ac9a8f44da774cef6e2f02a15371927435edea8ce30810393be3e55e338f73d73266f88eab1d52fb2f2a7acb5891bdcb9576f91adabc75f6898b461b1fdd8ab49e5dbadf10a4cd8f01eeb968e354e57eb90334dfe3e0293357853905b64fd67a6daaaa1cd26db546af98bf21b532a0d93f9933e1ff36cd81844c3afbba5f03fb6b6d2674ccea012eabff415d7bae5d00cefd627cba8cd26bf526578bdd1a39aedbde72f3ac7840cead4a5f4d72aee9bbe6390dbe05ceae38cef98d5440cfce2823bd9ff6aa6ce266170f53959b3289f45d8be0b8666e7aa4f35b8cd51e717986cd7df37a17b812d77cfc99a54cdab4fb50bcaf6e574d1dbbbf6bc71819537656d31531959fc1fd2640b0a3ea57a4de971e37b2dcc255daddb8ecca3539a05969049b572f5830aa30916546caa55b1e60fa14ff9265768edf5dfdb959b7a27cbe8c0744631a08fcce73dfd4836464cac00dfeae6d47cfc164fe855d826774d8d6e1fc77e4db961420528dbae5c76f271936cdf30998253d76f497e0f2e5bd83863786464182652586a19844fe14ba89eaa14443089426b6d42f59a3ba6de4e0985e75ccad5da542f6a93ee8565f491e110e98ec7e409cf7e2ee5d5da507bce344c9cb073755ffde4d9ab67f3804092c5c5a409b1997db1c7d43a6f6d31e19f52bdee4e19c6b97009f23129a12e5d2dd96c4a703ea762a9fa6f9f9b9a0457cd163a93edbcc95724304102bbf6a09c8cd56c97ec38d3b4cb313982eaae7effbe4d6faba19a1821bef8a24ad6ecbd37c6768bb0d1a9fbcbe9d3b957aa4a84d6d077b6a8b1e1528f4a0d4165bfe7b44ded9dd0db8789101836a650b6f26ecebddb0d026bddfa41c73e17ebaa2a10985aaae76bab6454fdda34f9014fc8afc5c8fa2eaa1639d33486890f9429d83adfbb9e31b6ee81733705f7a732e994623c30e181c3f92b36f8fa73f5f5114c76a00a594656b2a9642a3a2998e82046d8cdda9cbaeee363931cc885ca5fff4de5f6418503f7de8d5d2e05e1bb562c30b9814bb7dcd49bfe2493bc385598d8c07bf96ac9d2697bdacc99c401e36b6db66a516564386b101f53cd616b5d0b5b7347be30a1816a05d5ae2777d55a4acea0dfae6dbb913dd57245ce3481612203d9a69befb0595c2fa53281a3d521bbb7bb2d4ee58a334dd3d4124611134493379af6c7d8b09bdbd7b84cdc588cb1dd1595a5aeae3269a3bd25a1b7f3e93cbf99091bcbc9c698d79b11ce6e6e1283a6dddfdebd09bf3da7266bc87e6f5bbd3e67cb9f042630700138509984db3997ceb8ea435091047c1c1bbe325cd0a9edef0f105422d1af9e7cddfbcff96b0509f9fea7abf6a91eddaf11541e11e362b0e17a8faa29e74e50710453eb34ba065995df2915541ad1fe96c985727d39b69c0a23d831b89637b79552c21671416511eb96daf81ed79db6655348a1888673e34e191f940c76875412f114548d5bb536754c3e22e677bf32960fcab5da8a540ef1b6a1ab5f1d1d83bf5a192a86d877d6bdfa996c729f2cc45ab75cdc77bc4b4e39cd502184dab50fa76aa693b5ff414c85ec23634fc2c9e47482787e503d66c5d6bfc7582056f9b6b665ab2dc89e03c4b3626cb5dfd5784e557ff05ff9122eefa514e4e607d796f1dae9d4417d70a8f4014e8e8b315b1f1d37b57cf0b9da926bc23695b77d2e03953d40f650fd215b2fbaf2d203d30677fb218b6d97c93354f2b08ac519d9be6252553f46050ffdcca4d325753935db1d5e8b2fdb6feb924e32a602153bb8e9247cad5e5faa7c3350a98347d9b3b9e5b3d1414a75762dcec6784dd668a03207c6d8649e8c41a7f89793a8c841bda68e9549e97369fbe8f34890a8c461c95dcba9bfb92b3676332a70604f4567f66c2ee596cb19a8bc214ac53b7db55485cd413748d69ed2c7efdd9a0e270d54daa05449a6af953d64df65833266ae2f36c9745f32bb40650d0d9974534dd958b6ea52c353ca29eb4e7ffd1f350deabcc98dafdaaec5d6d0d066dcd99a459f6dd779052a67e8d718376cddd47beda70f54cc10f7df45eff9169371cbf04a36e6ac50ce552edf0f54c810799d9b64b345c53cbec7c33e462a6398ea223faf75b94dd98e3e8f440c91d9e4773e21b75597322a616050facb6e8ba9c6b1f50b1530a877eeda1ece567131f88596abdce47baf20f3e5bce0a083bacde6f6ab5de92f6ea87421465dbf70c5d8cb8f392eace7b8615c539b5ba96e0baadec639152ad5ba79f140450b4ddbced98eb963d5ed59a09285ff6d4cb5b7734e07595343050b2b15b3a598addb9ddcaeb09e8aac7f295f2bbcba57edea1df633a92a5588afad7226972fd65ebb0b54a8c06283f14deda978c66f81ca145e4e18e1b3bb36dd9d9282fba56e4ac854fc5e1685a7d69ba93ef9fa3e3a149e3fb93a6564bd9adf3fe155326de85c2aa6f62d1f3a7ae8e02105182a4e68ece0f2f8a4d276267b0d9526b48adaa05cfbef198c9109cf4dc9ea29c7545b857209ac774d6d0a2a05d7392530d82b2a38616ceea63c093df575356e4c9995271216bfe9fddab367f349e52102f28860548ee0e0d49f91bd6cb039f846f82967bb62aeb8d5ab297ae8e02185172a456052c2b7ec9eb2475d9008cebda896547da5e4733c84d770b1b7a47cb3455d4b083ed7836d4ec7dbe6ca0d026bddb135a6d852ae75036149b9ae8e998cd2a16a3f98eeb17ea6cf17479f91888a0f1c7bd78a979b4e3d39d7192a3d70dc9854da8cb19aac5b82860a0fda73cac909214bf6873e86ca0ef677f2f65c86707e3b1d74b366acdee062824a0e202f7b8b0ec6e80e5724430507f05f45a66f279c0daaa57203f76b4a6f8ccd7e11aa4a43c506ff18ead495edbbb5a588e828c2a212c76bf355f075b664b2c11aa87392cdc51cbaf6fa1e0d78d5ba37df7f631b999a41ebdcb871ada59addbf8a0ca66e646ead2927fc57db02153862dca55697c2a7e48c4b049537e49cb31fbbc8f19f71c3a1e2c69c4dbe97f039b758ec97069536f6d932f578b1e5a8b0b1de6b94dc5a77bee68e062a3198fa1c536bf931552ea55395357a2eb3d9fecaca29c5475460d0fcb9b965e5da6af7bd40450db7f09d92cd98b98ecc255149a39bdbd58c0fee8c0a1a51a9f856fb9d2eaa5a4ee50cd6acd699bbe5eb92dd86ca0b56375d30b28ab31fca255346f19a46c56c41b8aceb9a070492465244019b320795b93f6cf1714a2896aa66cb722ae714940d0ab551ae666bbd1f2bc63e21677b64927df319299e50a9ff565f73856b76db74c24de6cdaba955cd95a94ee1c4532ebdc576b5ce31f8ae6d16475236c138aed5fe6f79aadba6468a265ac765fdd139557deec91449c9c454d5a0ea7f53c6c8786182d7e953b68a6984effe937289152353eaebdd97a5f4161ef10f16d0fca458c21bbe3fa5ab772ae9b8126ac1c531f65435a78490334d5d58914289dfb814930ff5ade72623236512fef2c96635a332e9f345299288fdf2cd862caeb9a04b375222a1deebe66e1f946f17122c9ddce98c19dce9cc521eb1cc7e3274e61c3ba53ac511abec2dd914c32617b26d8446b87e9572afbdb85871a66966d4098152c0301b51679aac4861845250c97ecd1436e4c7d32482298b5076d56dffade49ad0937c16a127031464a52842edc6e66243159f3993896871feee4aa85c64bb8e93820865657d6e196393b5e9520e31d75375aa6dc9f7a9548a219aca29f7c5190ba1e2eba9ba3736f5da6a1c2984f005a7b3c64b9b3de9da2098f3368b5379db742905e1ac7dc9b89425537e4a5520e6731032b67abaf5103a4028ed5dbccabbca3e761452fee02faaeed2764c32543f3ce694c256f6e4cef720a80ff05dd5d3b5d417297c70cb77aa15a362ce90943d44a9ca512d7355297af0e74fd732c8bc8c943cbc8fb25be142f94ad572a6298e143c38d6c571357f2be50eedfaf98c933d6f6ec6956207d61ceb3f069f6b10aaf7c88ec7c3f3f3a2a3a5650a295aa69082e50407297588ad586417ff7bbd5c4e87c8d8b1b94e638b2add9b03938d63f457b95edb527270ce98c57faee9fe6f664223961287b5946ad1b9d7bfb829a7140e7035e9bf51c995b3b97b837aff3c99b55dee9953dc20d7c565b70a55a5b4e16d3bd9aabe9dbda5261bd6d5f9db31c8eeed7c0d71be56cc496787edf54a518353da165bbf56aab55ea6a481bd6b76f6d8ae657e1e8214343053afa332b63ee78c529d41ca6f2c36dde54ba9d8296668113ef7eeb5a9fdbf5370d1f232649a443aa408454a191eaa761b9b7b2f19f591413a5fdedd4c6e6cac67ca18665cd8ea8be15c671ac5a07879edc7562df28b1c86d7d8e2362fe95ca36b0a18969d3ac7739b72f6544bf9c2f75aed381d5b0e2a6dba82142ff8746efe66748cf96332a50b90b57ff756b7bfb1e9295cd0b8cc19b68aea0b5fa56c61b5d84cfa42e9fcbca6525a884db553bcefa928e3633329596016d79b5bbfcdd7f2b88b052799b5b6ce5cff9c52a95e6199bdc518f9174fd751292b783bb7b2a8dd5ad7c7942a287cd0b5361d7495fa560a156684ad8aada8e2dca5e0ee145ad76ad6d5dd52e07f4cee7a6f55536cbe283857702d648de573285b150a4fc1ddd7a6334c79429b7057ab56dc986ae9529ce053b2ee329d4d908ea97f55858ba9b55c0a13bea974aa276bae58b1a72c417d6450b16facbab1d514257443678ea9671b15eb4e49c2af56a6ed66840e9b1b09bed4e5427ecd3928654b3982528651c609976a5bcf538c001dc2c71d9dab7b13b6942230e694a9a68aa346984284b5ceb5bb18db9c4edf72c70bd11c5286b03af6bed66baaf54df68b3ec485e8e50b294260f0b15ac5dc0e3a8f9c12849e3236d7bddc45676f294060717a3383ef98bf7b33e5071fddb963d7da789fbb0f5c742697a3ec941e344b87fedfccfd9c11a6f06025afe58bd55b31766fca0e9a7abb5f0c239bbecc74d098ff955a0a9fba669a03d5e66af05f46fea79ce3e041a9d874bbafa33b542937f036b74de5cfdc9abca00d2264dc966c4a2dcb85300e269ff4d8cb4bfe64d1536a105dbd73bab4e3ceb63e85068e9df2d87e3ef8e0ee2441ca0cdaad7b5e8c7fa9fee832d895ed988aedf677654c81c3c9d8ffd84e293bcac8296f3c5365502d399d1b9b9fe206338c0acaf5969270b295d2c6dcb6e45aedd75cc51c64233ee73d5553c7605bd952623027fbb665a5582d759fb2c6b7d84bcdd7ca71d690020307d5bd19d415e5fbf9a18d0b52d4d09751ea8bee2de99f92c66b55eedd7cee3167ee14346684aeae695c6efa204c3943be82d03117e3e3e92d24e505ce4525a73e7b9ef1451dc5c77e4b696ccef79d2f171914517c6c1ea1620a427d33720a50423179358f2ac23555c165a0588e4fc6f65abac7ee9ab341f9046b4f75cbcb4d3ab924679a5a6238f44511144fbcd55ad4b72e2e84cc1b070b944e70744bbde9628c415038c176f83a678c45a8af5ff6dbc484ab9d39b94b3ae6cd7ea068a279f12f758e3a1bab9809e6e08b8a9fae838cfdd2a1c3840c289868c7fd9e7b2d6effe22576e3ab7aaf7e2d572f512ce150bdb6f5a6fbf079892ac1da958bcee0539c690ac5b8a05002feb2570daaa6ab3a4d3d5026e196e96aef54a9e5bc459626a048a257943b1ddb976f45f53d4089047b5c6a32cf672ad97a5440814454cfc1e852976cec24e44c138b0e1625a03ca2b9d77752b957ad644baf0e33501cd116832a9bad367ff7240f9446b0a6dc634b97d53fd68ac208d8dc2ac2f5f8da6aaea7d0e12f5294fc0065118ddbd2b64aceb8e02f54446b901dcfe6e4cac6db43070f96694249846af9d877a9b2d7511911ac98644ec1a74c3a5d7708a7ff9ab1b86ca574f79b0f8a21e64fd9767a6b52fb45e74c134a21b69bd36d9161836ced1014422c36d59ffb2f75a8b839d324fa813288d5943e6c70fd3f36dda208429dfad286aa3d3b371983128867ef9be2d63bdbc2d64e800288d5d5627c4e97fc8fca15e50fab15b3f93e572a395d6b61028a1fd4e747d662bfe5adb1d587157fc1c5dea4d35da8f8e0deeac856b9d9143edd43ecc7ebfdedb28bece11f893e2540d1c3b2b2a616b22b943cec53eba283ec1be70b143ca87b52b99cfa2df23e45b983537175f96b91554bd5231921a11fbda800c50edbdd4b36f9ebb95dacc3b6efc6fefd93ebdb9d334dcd850b0a1d245bc74ff962f6b0b526029439c0c99abbc7ab377e6cc999a62b50e430bbe9b395bf118500250e50bad2a71be34af9fc8dda408103ab09d7dab8f0f93a187da0bce1397ff7368e8da94277c3cf6d6dc17ffb78d754189436cce752b13ad5563d07dd1371416103bb55d7be2da754a53eca1a76236c6c49774a71e4c95143339f4ae58beea9df5f9c160f6d91054a1a78697ce6d3557fdd2167659a8680828636f7c15593577cba4ba19c217ef4d996379572cde55a8062869e0a9bc7f8e09b4abae603a50c4ace65d0a9e8ca5447110a191a63a81a7b7eeb9b2d72d68032866d55af5c6c71be354d2d3a46a1e7f48885e860e1c106143144e9e0523bdd6cecfd5a4050c2f04eb27e30ba776ec9f7a6908245a180c1d9b7e365c6cbaefe383e50beb05c7de98251b6f8d4f399d7428719285ee8e64b315331bac82c6a17a64e076773b3f8583a73a6893999cd08665681c2855d4a2db385aacbd7fa2da8e77ed5fd27b77e2df08a8a77c97fe55a74ccd9a06461c9550863b34af99c642858604b5d9c4bb6e824af6e285780dede37e8a26a6eb2c88ea0580136b9029a1ca864f128047928464110c33000c050b5698300431200303828208ec7c31181603c8e1f14800252746090482e910963015120484110c65118c5300cc330462943107252a1dd8ad51ec38a22b5de4b1e2187814dccdf7aa5546b88fea44d8b574da660376282dd8d51e7afc27d93a36085cd6b47b4f1d11c024fac3cabbba71dfc9d94c872eac8eef8f439620e97eaeff7dc3cd73656a3993dbdb39cd1d78cda7148e7f47abce58600472ce9b97062e568f861dc8d9a1402d84524c3ec6469fa59e5d17f0b18169e9539a550af29ed8e9dc310d96c0b8968dd6a96338ec5caeb0f13493864bc8519c9cf06d937e775a0b38aa600e8ede5486bcd418baf788de639b80b364b01e2eaa8fbf806286ac61bad57ce49cbbb87142c083baa11e8e8564582e284fbf4097db0f64b62158dc18836c1797920d3e75b479a44fc6b03fe9272c5d778564e3f0cadcd5138bfcce8af2095d07b09d6f6a1b02b83830ebd3f28dc77f234edb136821801e99517f1ca6f7f065cb687e8bbf015e945b2b81b1b7df0807a1714a7edd3c12c4df3c5d73302de157e5463f19cad81be958dd36409318ab88b182880edf1cf0a326164957d86b97de3f39f1d3d5e2ce17f6ed2e0d1e28a76d73074edbc521c426276a17c8da5569079dc4c961073813b88e968f0077cc35d5f43a529047280a685e2c89081cdc31c03afa3006a4108afcd279a7b7105d580756b3c17ec6bac075b4e1a28f459c9318eef31ea1e1006feb6d3b5e7da6d2e38f6b7ae7b469c4fb307a345adbe090752f462717fffaba8e991ec771445b9d0fbe11959111e99bf9c528fc957f88b63abe0facecd0b807f81b6410f9c725a9ca09a73440a0707d8bbc7da7ebd5e8617df3a1f792e00adaaffef55891601e5f2b6e1f5d0c4708194a918a1d65852140b6d0188d000d2e2115edb609b4d3193e514f0ea781f056c3b07f9e8c6cb5c482a17db7759c6d9ae68dc85b6a1c4984c8b238bdb0d91fc9b9ca329b93d1481ccde4534fb1008c175cb415a24688430f738196aa909b89c85e87acb79f39f35302663f6d6954079b37e120d34a6909d818ce2512ce9fb1079e03496f1e771234682a9eb8cf39c6c5d9c9de1781e18d151c0d356e8cdf80715c71c446ef76eed2c282da59af64adefd6416c9f1aaec8225644b1114467323c2e39513cb62974b1aa0b39953531ec69143ad5313c654c3a7586298ecae573737c923ca4a4a5dfe609158172a7549ff07cb832ab21c8f04453876a05f7bb5f6270e2b282f243aea56de7d27b6fcc876b8a075b67e8a900d26fb4ea1340287259faac6f16706852974d5bbe1a4220078423d330f10fac7e917a68d44a10d76f3a71da80fae2ff90074ab761635c6919620ddb63a12e1d9415267c27244a24c657f10bcd8da30a3e17c48a6b1e0f1b5c5ddaf8610180774e744e99c8870e570a28346fb04eacea836d85738621a37169755d2f950dc2645141aa6bdb7e30fcd9a4040c99097d10498d61dc6e86b43e3f630c672e167c21846d6974cacfeb5288b9269432f68c47340c22046bd4311b66d68ee2037b6c7c68b804deaa3b8f1b54e24580b1cd0c7f9f59d154271145238d4d945fc25aba3b8a48baa7794cc260648cb2ab7a6a12fae13e3375efb822e9678101ae3980cf55111d84ab6c0a2b1c8fea1b578a2f97528ed48e87811f431e1a547419908b7e1b554e355843b594d1a263ad6a8b832735377783044dda7977fed92c42e1087b51a569640037a7f323c91a241b321877ae3afff6d1042eb8308f7eb0e843a53212347caddb8a4fc790bcdc5502d8fe70e01ad3b50348639c16ba006eb53dc22684ba7af7eeeeb8687abe560f17c30751bca8c29936539dd12f0afd22689e41cd9d3ecff019c84b82a78cfd2fb1a865e841c49b40f5b68464933b0c97a4428d9d2478c1a3f330f4ff5b228518c28fb504b2da91048c672c81fabc48f3655170a825f4317b27190d85c8c9594b2a01da5e2beafbbb0c143c3abe00002558ddd42c0243aa8bee9c0bc18d4c79eaa531d039ff1f900538b221b931cc50a0ac50bf01609c17aff0d35b86e2f6e8454d39557427e4d07b183c1d3563d2864d55008fc1e6815b620edd0d50db59aa6f46f34cae3db6a8ccbf1c3755eb1a365f390111e3da1dc2d6e641e9fbfb4b545cb692317cc9b7e495a8fa84984de81094281b1ddc574dc7722e5ca67d9b80f1ae79348ab91a241d74b46ef8ea2987549370c0b61b73e42c2729bb6a5176c5d6953af601d7016c8586b7a2f1eafa955a7ed792a648e175c6eca2ff8f5a2fc7ba6682bf37c01bc4b19902b11ff42ca1876d8e5d0e2f70ac280a05d346a961af5eaf5930df3b8a89253ae2d7e1d210dd777dc274afa3e3d2f0d1c5e7f395a70731d408d2c4879ef269df22116e1219403d6b06856deb82c0d4eda75968a4348f9ed46f9b963ee3ec2f122a29b5ea3401e0e7b8b7637668ef53b034ea0c84696104e0f31b75ca51970b5c6089a56e1c29507608f42bfb4a1ee98cccf60f599a20c4f2c9d0818ee6c09e240bfdf10177ec8af507608c681ab20f6043c6abdfe431131f61111fc13c2e514d4b30949a3cd7dbdba241f9aebdd27aafe5afecaef11ac79a237de43417f72e06028a2991c37895760814d4288ba381988cafd155c10f12020dd4c0872b08aeba332f026b354ee4aafd7ed55cb721094a07adea34275f242e1d72f7b6d5b833be87502327877adbadbd2c68318aacd00d851896f486a328002c7657b2b234887eb36000fe9e353df091113259b672bf69c043ab6ef2a469be395cf1d9cf27b29f4465c56decb7150a5cddd2732eea57db291d5325b3ca397b89ba0874330ea31b178b43df601df56316a17cd1db67621532ce8c6614535d416fca672aaec13140b355ba26c5c88ba5e1d01ba2327f19f7a20efd0341c7c1fe525f7dec53366c7a5f612c4c79a0b1ab98a223bb492b828c78c8028eacf88ab1433cdc98a5892eef807965f87071b290b901dea1bef03314e1ab2d0181de6471058218b3d648d3f36c82c6391ab1a00678a82b2452907c81b52100f239decf4adb5ba459efe495ca30a46db5e48e05f69b85a74ddf3d076287684c92ef0b774c1e2416abca42fe6d9ef9c692afca41aa07658a9bcd7cc5f9b2f10a01b2284ed095d8495d08f96fb482d32df2bc133434c656bf2630f2239f247021d6f40c623fda4ee6978943290f9183af3a45c449a84d614122a381ce4ba5b40fa3e01329149301eeb4b4617604b9581266744643913e882bb83eca10c9042f90426ed5c426654c6f23086ec4a8123cc7081f646c7556d16e55813346bcdabbc0f7bda6e486e8bec4c3630d20e3c3616573b10465d115e6f054b03828f0f8e929dc7f0b736a170a546f3cf38febe912380b237ccd002d23b292adcb1ce169ba93c7665925fe303d39be84d2b6c7450bd1ac374ac174635b4a49593e1fab612cfb5e00c6398516f61398c250c7e69a288310e7e3dd6dfa2af8665f0ea6d28a9c61b63fe1a11ac80001e4d9df56fd750aed657993cae48893cfe926ff70f9e37da2d29c00233383470c2ca9d8d3e89531bdaccfb2c7b6ebcf605c96f14840f6b10a196d94a30fc09dd7598c65a534e5f6aa2c6c3040e4359c76de743c1b1761ed894db38fb05723a8bb86fb9ad76c1ab8725eb3a6c48913a354acb296ff6f037b7d5afaef0d614809ff1b5cfa2e7b65f5f6a541fd2fd3751893063d5e53ff75c2f2fbd955f0644ce62f3a6c81284568a5c2470a53626ef1d89ce3a410bc12dd6ebb5daa3e5b5fd20a6b216eb39b5ffaa9f5affa85c488f219462ab6488a59d8976cbd371e24cbe963ce044808303eec2a9180ac619b7126621045a7e95f221594014080078cdbec5913d8bd0dc074b8baefdcdbccdcabf947015eda8643891308f906fc1836075ee7f3c2f32061400d10608d29a165064ce996d569c3b1dd68357664e38c730c1050b800fd80e2a74c1f6f6b74d3b0411631ca127a7bb5fe8a222632e5ce021699e46310670ee53c494747e67a596740efcc795624871952c68c84ee9d2ebeb67560fc58196eb51f6e19eb4d5732bfa1414327d1df14d5c5d89c26f102918246f1c40b6c583e65e9ce3cae97d2927316f7e32c86550297d14eb35478a4449cb30f1a5cc18d4eb8e010270b771636015647159cbb5ec746036069b1355d20f15f790f6e3a348cb9c6af698c0d724ef4a475102cf30ec04be4388b66f01e23363a5390b407a457f51db2b9fab29ea7a46d4ce659e9432daf42e5342cc71027dcd4ffd38a87f9a95caad600ee709a0d31c1d322a08288564436740816ea77da02298f05adbbc6378ef0ea480dce6182a13167df91e56f1a5e32dc6089949ea4ad3b053a581437407716eb4babe8397d680ceded8c0adb8d9eade075471c83cf84d59edc70588d37bc349c1ee8be2f983a70ec27d9a6e9717af7ca75c6dc6db14ddb6d1e2e6922411bca4fc7777808a0056fcbabb1b17b2e891c8e34cd390cd032e3ff920080e9e63a84c438c5e67c5b2fc49b1cdf46ba2dc9b005b910894c91a301c01a79e8197626de9f4570f077be58c80cae40e75347700295db70bbc323a76e9bddbd7e8f390a1f4dcc27681f43e131dde27d0366a7ca935dc9a5752da909ab4c23899eac72bccebbadd3bfb20840d3027c52afa16c012f2496d23ff43c7e3a6ed7d23279fd72f284a0ffbb9e9896544b2238b44e7df49c5194ce2f63f895745090a8e6297c4022007fbf0097a76b40e26cc46357e93c1306671aa3220d312efdd876bdcf3e9cb38d200e33b0d59bb86430ed4e6bb4fe28d6e45f6b54cdcf01ba64d659f4f872333c4cdc0f4f6ce15a946a29bd1ff2be92b23e55ce1a1ab9ca1e004910ec8234af2037f3a8c01606cdb4008eb72f47ff124157b42ad7dfd35e81a6524d4e8dee505d49f9f13695f10751d7570fcf33dd374d51b58501556d8e5767ba1f69533ca1dbb2390b994f58b3329095e71094ecd5c206c184327f1889bc69e6ab2eeaa129e2939834a5e7dac7ca099fe61985aeceab3dd984bea9530a2d8d655ceec34bb6011400b4bfcd35d3554b90b434cd5972650273540e6efabe4f09ff0ad493ae3e2adbae5d6c7914484f3a8a31c51be3e197e7c40f7c951399dc89c0062b3525463cc02acfa6c56f7a4132e0b691e55f24ed0c1fcc081d86d832c55ce29593535702876b147dcd45598b0d1034ffeed730b391aef89cbfce196c4d12d8845128fef22f3297a604fa5f38ce16cc79501a82ca9760320a1f2dd15b3628c4e2586b7fc9cf36caf7043374e0b70f9e687181ac283242ab3eb80b1e1f9a7b66220b5574f36f1687f5d90226a6af0c7390df2635a6fd2db526bb126a71657335b88860543fc1d820ba720c52905050cf8f338dab1a3c0834fa43ef8aa2e43e30f6663a6ada09850ea1a7ca3779aad0a35ae95d584bc7aa96298b9a01dd6512236c93652d30440d1db1aae04aed5c5f7e8c1ddc42054126e07a90aaafcd020284e7b58cfdfaaa28cf8017d1dfaf5707faf30b1577e7dc062c10239be8573263a53d3eafd8b291544b520606a949c5a5c61ffb7b061d27a178282f61e838cb2c4da941c43dc5ab22851a934715740a37ac104d79c1a2c546f7097e02762a2977ea94d6481cde80d19c4048caf435038756820e3b5dc90653ce6a0de61d083a06dee8395fd53708980964a87412ca982ae20c2af45ca9e326f7b624792d47ed41d0d6f1a0c826229f9d9d5f1ed58db9583bfc303855adf855b245772ee7e36329c58694fc067c4991b0275b8337fd238518b3613c8872cd9ac110de9573e969c72e9b502d27bac2f95d74e97e9c2a2707f8567b2d8537bd351331d58857c27b97d7fc0ea20728003d84a2df801e399409f2ed14811f90e68316d6f17371605cef62ea11a09dd85c983b0f67a32e004813c5ae5291a093c151de236a20774a2b902ac56e74d5cdb54cbb1731aa397972b543a733b64c8b90622759a459a0f9e856e7d29cf512e720722913c20ade9e5e74a783820adaed250143bef0c8dae2d71cecf42511e4f2ac18a02733c872065b516fa8e5b881aaa0f427a9a6fd951ee63f7c1a67f76b91af149272fa5f7dc7597d257beef86bf4b7c06e95007bafe756caf1ffe2a3992e4729c5339e9eff10a5342187001565205f87195a339a2348292d54921569a2ce064ab7b659ec15f9f30b94234b34d0f97ec000687331b89e1448bd450dc8a4eb81c6c98063242f9c01dd15dbf221f781a5b48d476e76866c670e0feca1353cc426935a5ef07ab29fdd5991910e66cb3b2004235a3fb892dd47bac1e2e98253ab5ff2c7e4c110a4cf7b08d9e7f6edfa12774e94d50e496f2144f062f5daaf9e466ee5594068f25a253514bbef65af0190980d3ee4779de31a8f7371307a38aec663f9bb748dc88191e6355f6f5c7d44ad329da9cdf94a9530739eb82143333b33bd8183f70dfffeb24fa21aae2f4811f42be97bd68af48cd492581e12e58fe768c80db8daceaa24547c414b08f55e2e7c16a116a3a575df98529f2e8527ec987cfd25afeeae252d4ad250572e71460ff52e922bc7779da6b7261e003d811016bd8402b006042c96e1b4959c15c5245b9e02f5f9b7e4fb1e7b455429e3c423195a87f5aa73b566e7a97eefb8a6d241a494041142148cdaf657a00258881ec72299aeb3395a142679231f321d768e533eacca42071b25daecc44f71788d8a3b6a18793df1cc285822d79cc335f7580b99eb297b26f07f0e7584efdbe56832c138c6d9dc58456a3a5b1fc38ddcc21d63fff0f0ed512421f0ef72ec94e640559698bfa0ac281d6dd9ba2f1bcfc0308553b04b374817222336cb117446aa86e877490134c1fc8c72ff8a389d5d8c87ed06a700318968002dc2c5ef5676a1668c1a50fc1cf2a26b32347dc288406f13ea9c68e0bfc07ff5c07617061b7907f8766f1ee1e2a1db2e6c3425b7c294cf60e197a9c9644d059ae00302cc3a5d78725b24e3f8d224028c9e2523b479928a7bfcabe8b5a4eb9bc9262452d7f5aa211534b8af0d629150292e92d9591d0e209e106284c5f49643d5b76af07124a8cd0a46397300e061dccb324ddc745ef62535aeaabb96694f600e8c7b8abcfb2c2ac63667d9922ee4874b46d56a54993c4cdd63adfb83c675b0a44c02386cafaf2c9c015133ab82c1f0a269ed788af729d1a9b3c93fd44438c2440bc45c321ed590d96c9e5a2b2b72c27f21a86a0cd14b03c2fb03875c3f009bbc1dd91751c4593001b3c7cc4b7452bc0d6881859073c0b1d94655ff8c9398260f807ee64bbaefe8c9a1c3b014b3ca3d0c1a02a531d5aea8c5e97037bc658cf2c0cd7cd6eb48ba57f7b30b9f975d4013f4090c0caabdff67531339d5d0bb105e832a2299e969050a76afeb6c5bebfba2346217f19a7a3503d42dc9e439c3de1bf96fe2a7ef58107cf10e6e1d2408e4178299ad544b9e71520fb45e133a0f9eef7a433f5e2df2579c79c4038278e693d2041648d4a57062f3376bcfc289112a31315b8ac9b29dda5d43fb1b22ace74fce59b2d008022e157269dbdc8b8c1a7e37355792424d44f36c5e929f6f7399945ebf1c7485fcc2759aa6ed5feb01441c9c576c83011c9dd9d6d4c34cba7f143384bc431b33b951f44e3d316d11954d170a74d1f0f0db6f3b69a8e3f27d2f5bfabc021345cd0a4e02dec4871050d099ebced20616c42d9a4cc0b4a69a6e8de1f5565334b49fb0522f2580b5218bde93ade4dfe22c42104114f50626df150738e383571b186300b7cf500b20547f23a7c8754cca403db079b81db15f1f01c248c7be0b39f3e689ee72f44a6b51a87ede9fa57d7720a49bac3a506d5ad3b490cf9ae17f08e58da19d57e8794b987d96914c71d69035aac082f83fb68b1e06562c4dfb8a0b6c8f88b8f47a95e5fac8a32528c7053ccfe096b3714ad7a60013b2bcd2b19c895c2023617d328a21e8aa863b7828d21f8c64d178bec8084affbd279d70827a000d810a4d498882dd8e9e97e393a5ccd8da1d2970a7002309b2fa9dc18b741060cee13290ce529657acc5822ec93809e953e7e2a3ce3e67e0af358fbaf59f44d0e7827815eed9c2c79679ab42e208262dcc672096f788c6676cfad1a8885d381310ac9574888cb77028ccc3376ae942eda019775c8e4816364b2c49114cbaade677705a7c1d20b16e696a695cf99679a281deb57187a2d250d8b65fcad4f89dc63761b698f34d4e6db7a703901f0305b27e39421e62cb7ba31fb688c3ee71c12beb520b3d7b6e83c707ece49b94e67186b7e0e478383cf71fb360b8c8eeffe20a36a5e84b05cc96895b36979e6013b121480d3e8ae2127f3ac0d44ff323f60895f8aea7d5ac5d8c803e212ae04d5598bd7604c8947c41b5b905752774140ece15787a12cebadacf7a53eac887cafbe9fcf327c1d91cbb7dd0bf4cea69a405277ca938002a82810fb9d7111d1c6af2e2a64e7c76d4c8bb6c1853f095131c10aaceb51289ba6c4b1f05402abcfc2386dd4424091b4f055ecce64cb5daa7687a3d28064f38a09f42c75c909381eae20002528616b95593a4c82cb2112a44937963b9ebeb09dd1b77484ca4c074dc033679775f06f1d82ecd052cec32041f54dd1d35d608c13c94b5df5211675491f3f8a02e43ed559f357c72f6657635567c991b89fc0a307f569665627b976508d564f3fd1e47bf1443052a92c67c02e17a42cde94ec226ead04d6d85237eef8e936e1f78512fc1e02101f3acddc1acd8f96b878a96ef5bb096172b2d35f276c2b798c3cb00fb539494763cade811dd9ab42053a7377e9ae390ca976c8d5e3123851f03a08863f6aceee4666fdc5197cd4b9ce121c7204d41802968ba1e30c1bc3b7629f9906c39eb0a0317e1367a9bc27cc20e0016a68b50580e4f06b4e8f423ffb5e9e32731cbac5e6f481266dac4eda45ac25419a4131a506cbbc2a322cfccc3ceb457c333ff8e648e2a702d490fb2c3b6d7a5f059a5e1728611546ebeab17d04f9fdfc9d0998ca6f893c6415a0335733b2a8145f9eb3bde1eb99a635343e9b20ec97fea18272628cc4b306ea668e6e596c6204ee0cf09d24ee44edf36d64414e1a0c1abb9cd118791765f29b8c02efbc4932384d42ff804e7b3214cb3cc595f87eba962b0f66619db373e2b4916729b02e0f61fd3c52b279128f69af5967fae0391f287647d229b359529453ad2ea11500ebc236b23ba9950e3afc422f490cd04d7e9d46141b9256c36b7988b5207c08282763db8c24601ed18093475a1fb93c7253150fe0808f7e8c80c487521bcfd38818914ea8997f85a09bd7b35aa48569df5d8f39b825740c0446241e69962d0fc643805b068297cac772f2c8df812380c9a6655559c5581a0134737e533388b5a6af8cbde0cfd5005df5ac0df080cc441ff0e92997b3677bfb2fe7fc7296509177812da16e953605d0f48a0889553584c6facfaec2a123fff1415ebd89d0e4b5cc5e61e2be169f7b1a66fc58b1dfbd945a3da070ee97a3f6b8a0a08eeaa1ab431f6d6dea278a8f184efa10f3567b6ade44a61400335d6fb798e633ac661689feb7ebf3b1692b80c3db932a6b64d369587a4f080a5f18580ada5da218119472e39b2b64dc8efcc8057cf7476dae764f64fd0d55c22d3c727c38d6c83e00eca1c3537f75491b1fc1ed66c3a582f67c42f2dd5ed6942754e1a5e5a52b63bd28028d8536046b5d7eeaa90de790a2fec26d561ba18e202e1ce329be56804eec13d4e08e424deca0998806a2a88f43a017beab6cc0eac5f52d7a31567533155e90f4c8fc03b06df2f7c8ef7413adc10f1ccb0989836afaf407d38d49648e754efbd9db7fd73fe328e218910781186d9e1a75a6b588e3e9dcf34cd3a8d80117414b7ca6c0eb02352904e66f4d0b3390a49cdc780c322d8836ff5afa1dcc0400bd3125e1dfea0201ee871a60082f4f27d248fb748bc3cb8fe8f76075950bf6d3a588fb853b2e164059cc47da52caa08b331cabf3053fa5d07efe463d23b260870cbc31dc423c1e1f9c9d5d98423f4419af0fe8006cb3a3396dce938279fa984b4fb806fb1169ae28b026a3cea076b587b3560e95365b9e5db89c07a358163a627884626450b942882af6961124254f402279fe740680792bad1cffd13cd58a4f494cfe19a480dc934544c82fc8c4156c814c7bf3ea5386ea76f089d28432fbfc1a70212fe650f0041bcfb69a02e189943fa988f7bc26033a3b9de163bb48b5164fb5a68cfadc42dcab6ede3260b21aa8dc67b3953c79d5df63186cf3af21e6e434e046472b0eb2ceb5723ba037363fe36f683eceb68df9ff7405ead7b599b869901ec91fc46306e9ba84bc8bb6f268afdbca555d49c4628a5af03b6eea0fa6a8bfe8eec87cfebd95c27ef2de857e077238a8202e62aee5e2ff956b4311c12f6995a2bff50a61026c204dbb8d695adf91b3de515688609770871862d108dd59755faf95d11643806ae003466e921120ef50ed350f5a1cbf6fac54e433f174bcef64a82c8242488d33ded2d5ec57f8753df14c6acec68d7904c22a09ea9e854426d73d01382862d2ddb823801b77d4f925672e7247267c2c3eadec13f0c103b55cbc7d0c7b2e1535bc6f885729debe0898c2d51e9400f8a30335cedacd759814cd52028f1901e63477ebc1455b0fd92ee4406a2292f57fb0fb2c3bc73d0cbf4739ed8412d2a59ecab79bdb1d3dcc63da8a3551ee70a6c1c428a0b77ca5a9d420b908f631665aae68ff439e3228b9051f91899426c96c16a7300ba746bda85501d77e3e7af9ad0e0301538d052446d96f2e604dc6c288c6d726c4fac5b8a783e0e243919a6f440ec48b36603c1d13e4230228731a7712316f38a07d1fdb30417fb4f317155c49ffef7841b83639b2352b3dbba4f9c2bfc0953cf1f66f9eb88a2ade83e0c4cdb31bbdb1460e4029bb571a8b0b63aa634f9ecc66a96d297af0129452e5d8c9ef317ac6e9122e104d9d03dee6843deafe4eb7755b6ff5c390eb16bdff3807f6d13e4f870fad59908991a7069a77fe9898222d765d4407ff4e62f3e4e729d6763dc407868ede499eb20ebf52dc20e163a3837fc2620486400ef67667df58b8b815e702e9c7c94977b07a0ce21a58d0d288becc9a06204f78409bdeb5e24668803d1b6035859356ee16ae83a82f953f598f14d57b02949ee219a1195953e1afe2dda48b2d50756e6b17fb3c9a20a8076996109ab119e227ee8be21a9c4ddb3e044a0c2affebc684314ff250ec24fb40c726e926108887b3684cdde508bb80503e94531719d19e8772cd8e31d7b01b22a1b02c49a5c90b467fa5705b6dfb0337da1ffa690f009a15e0e2edb166e3b5a6343649d02841e9112d7c217e2797c0554059073f33eb5c1913ed9a0231e78031a413f61a7dc2a02d442c45ede55cf3848bae3dc101a9faa7163a467c51ca994a5bbdd2135816266abb812dc59086c6e3a2f72c14ded18df0f5242ea7faedc0b799d2d73a22a1032d8ff497dc65516d19879e707e10d979b179401966a0ffdae74dfee9b99cda48b577eed37a0fc648d93a29a6ff1b1f6cb1468deb54b2ef42bb8268f5b8326f4085ad3849cac92f45edf02e16a7cac0551655e3cf5a0cbe75637df4e85bb3e11bd124cc8ba19d9d673f41312a0f8e8bbaf2e3cfc3f1303d502e3242e589797920312b49fedc7042161b1e9b65d34ef81bf567783b78b3130052cc9bd67583b5518f70276aef7dbcba1d6f77cf0bc3ababf7ae34072812d1e7db150273c42d5b0d8d063983921d176e5a54109183934eea56bfdbe3e5aff301af9b324a0dd4e782cb78b50fc24cdc5e4845da3b715519078e9d906d48d0ea7294ee39cb49c460eadbba8e60cc7e5cb0ef1c61a1af9c98f82331550c6eef01da109db62bd22214df7ce1be11b68db056b72a8fc804e58c659fa29bee5dd766237bab440048850d0d887ff2b73c91e7f159d16bb61f4f9169fda996528ebeace802c3b531f015565d7ca29d7c62c785d624fddc15e6013ba7dadd1fe03ee421acd303acd4b6e778220339a2e651218e509c4ec0e39e99c9b25f25f6a92244d66b2f9c8472ff2e4d09ecfeab2ad2dc2e141f4b36e519617f9307e02b41a04e70c1e8dd1a8b35d0ed2205c38a83907d056502850db552cd1d2066283102b0b1d7e0c264ed28093a006419c25d2ece0d521384081505566f66569136dcbe9b527c876f101c0ff8ea191f798060e57be8ca159435a4a03407a31e12bcdbbb0cb104005a2c8304643f72a88a4437ce32333c7d47ff2ed3ad5b8c42df40226cf627fa868c1bfe30ad850b8f4b6ccef0d78c1693342a0cb3a764b2caba113f8a0ef93013a909cd1b9aaad5746bcbbcd9632d20c826dde59c44219f665ab886d4f9fd9cab72eaf7363f3ccd644251707a9c5f5bc30b8d62b0203d9da05aeeb9bb2d2daca4e37a02aca6ac48fcd2803204846862000b3af03421d52d5946155140b21d40269fe2de67297f2fa9f0ec3fedb0b7ace0caf28c3a7a735a7b7b87c197502a88de519350751708978df152fcf5a1902cf2c509751b956729f6feaf5e78bbba1626442695edf2d0278a7f0dfdb9848abc9b418103030640e840db243a2d1c90f76a4785605dd7a6c0a5190732371e1b05f370faa6ee610144f84fc920ca0ae867f78c9c598de6bcce031492601eb27d93f04ade2da8a1aa8162d564b7ca5360090d4222202cfa65223aa003ff904f84e3468e00adf6892e3f1066cea8850fde78bbccdbdc91b874fd44148a3545333e95442c93d8968a6c35c73be4ea1cd253920c3352b0ac76297e1a23613a27d652c18f53858d8728db881610ccf5c904f50841081ac5999835e667638d3a63afcc6265b30897cc588901d0e303081889edc50853ff85cb4c6137fd9b0600c261c5307edc881b9f5f39a1e0052d0b10c3754fc80811496ef0c3aab50023145d6e4f7bf2404e2e72b3c893f47698463357d710c91ba3f8748aca4579e64034892383a6b059deb084793b29c9830a0396c1f8985484bea5e14fcbfcd4bd698ae5ea84791a18aeaafcbb67b41525cdde03a5ac9197c144ba40a73b30d62f9df5c91c7012d2b78fc16e86aea734b0940a4bb1c2d24f166039ae38c25b286eaca06df77efcbaaa9bb02dbf1a0bb08d42b6063c289217eb2eefbf4fc4b4007400f197b8ad9c02b0b00c3f3bb37c6a17db852154232a7173b69e8e25ed7c679aac22e6169829d019087e211eb0882455788469f413cb703ce3947ff79db8d83625f7e5432255bd86521f512abee91dafbcd042d94d977f16662d137a0f6e3d14c6601ee1b43c5041968ce4942ef2da0714c6a62622f406d2c93a8777eb0f49b553e4a1229261e2aafea2c0bd640872bb31fc405fdcb0b6715a6c0cd3ddabb64dd817294e7bf59b0a3bab0e1cfd221005489b8707128052b635951bb8f23755a8f366b4b60c69bf5de8478db7fbd9a24a29f74dd2631158a184bb1df2d410773971a7a9991e9cc49e8442267aaa5a3ab055bf16ffe91190a3afd609668688232ef72560a9aa8d99869d7e8c98eb0e6194fda9026aa907a055da4f0a72e8c21651fce8b55c57a127832503085748dd0a6b9ecc7a24c36247c3e6640bd8a28b048f251a4e0ede41b3218a3041190a3984a2539be1eaa2a3c000c70de3c8d2c0733a346368bf737d3da330d30715f70dad901d7324f7188990296e7af9e85b8ec674848abf0578fc4637044ec7070b12f28626364345dd69722306099bb04d7fcad9ba07d9740dd800ae765322bbb04c69263705c01ac01d88a159e260b9fe4256adff0813d3c09cf39b778c078e61e3d09bb40813ad178e86f1b3456f6e5c2f63ba6c5a36dab3148927939ba4d0ba04a3adc82618004619d1874dff671c92b157b5c0416d3990fbf2d9fba26dd68b02721c03d0090555d6b337c37bbee38d52744297ef39b3b27bf9a9b745c983a4061c880c77c9e9e5fbcc8d0217f599a7c75128d29305f9f03ba0722399b16f84506fc5bda4a81c4f5a171be2e4efa1fe3c61c1e11e2fbabd242a89dc903d4e4c800f984b9038a0dd49296278c12fd718059d4137fb0347d880f1bad49767b2033ac816513aaf0dd49f338437a403149ef4b39a5cba1889c0dc680d2b3f9f18aa581c36820f90e8fae520813dac9bfd44834c78182f2f032c2e010b3b30d9c7bb9fe4abc0db65545e34078bf8dc595764e883449e44d324f9f71070e4048300d812f5468af2d095ea40aa9676ad51ffca0f2bd06139cf6aaf10d3c107fc655b4447e031aa4d8375f89299e00d406b03233de8cde2f680d09eee74fea92250f6c2bc180172ad9016bc682ea286e8cf7998bb813d5e051e74805a5f39beee620f18205bf92525897dc1901243b373369ee903ca36b6ae4765ee1df6fdda3360102d43b18aaa8341d1e3d504736b0b2380ce4750fef85e220057b112a11bb7694453f95580f2209ed96803aa6da8eb5019cba8cfcb73cd871c338787d0c44fa5b08301349616fd02fc242f9247f335e872157f5937073e4eca492d3cb9c32f12c0d292b7f7f799f5725007b4c122918e75d70fa5ab7bccefd3de13f905a4491524f6e4203be61caddf6fce95c934f54a1c686b7b43beb3d18ccfc84a8f83aeadcfb8878fa492c76ae487ce61519251662a62ff8d6b9544f756bb357e115d7a9649ffa94f93e5f96f9b32f658986a323e209a973744d60ff4c2a1decef11bc03ca52096920008ba9d439b4a9907f75f86483b7d1c4772f4e52238aa75f8cf360b4d37d1df340f835de4c397aac77519ecc5e13f1f395bd29e7c0686ae13f8eef1744f715d4bde83ef5bf9ee75fedb4c72bf857ed1dbfbfa07e2fc40d81f1857e5e71d1b68971d6e7cddf14efa91a84e1548e4fa7205a4fc43e66eca76a0083659025d6e8a29476cc4d3f38d670b101eecb6e9ef8f8ccf9ece4a96ab5750900f13dd192f280c04a11fe1ed14242c4e900e85618f5d4d50af138bda982ab32aff8ef4c693cd2b5e06b2ade49921801f0eb37da4781c970fccf15693d45f7d228ff614bcbc5ffde178e37959658d66d19782853781dfc8c2760b1288b327ba6c2aa6b4c788eea2f43a8be1e3b77942ccee2d1e0cb2da79edb2b8dc1c227e264790e7aab29b9683b514c5f4d20deb9e887eaace87755a2e3db7aeccb4b823b609be1643b97257b90fff1f9718268addedea32805c811e8f3ad15e99eba30784fb9f78deee3b2d195c8851999474bf43c02fe27dbcffe4d2d2ce5613443aa6a6884988a3bd58b979e44a41075f8179c6461492124f541ec851446f8dc7eac1e078bef2ecd5d33780e088949ecdd4d82b11d399861dc6e62be2bf4b400f39d8a9ffd489d8a81bb09ab839bf3e0cf1edf136d72ef9862bde141f9c0e8f8cb490c5ec8b3531ea777ffbdfeac334da352ee21ef61f3f7d8c8f9239445395d9fa8858171bcc6f9fbfdb3f86f5e037bee70fca749b01658e874b10989444b88804bc8254f2754de184b178d5655647fcf9b2e3a444e9cf18ccd54a7c562345ac355d641a657a21b017d49970e95df6165dd6b01365a0f4dbb90f76aafeb5cf743fb84246a1f822dc48e60f691d4fd64b05322563c891e9f50f8297f9123b0758e7719b046014618231eeed46f3c2417d55dd9c6d9a3cba2abf602591fc2e94ba67f256cede0e3f2de94405cdda2c24dc729fb0a5c01fabb5e121d544d542873bf6a60c1657742fc86fe71cda8959bba8e96945c358f29f17436aed94cb42bedd18147281f1cb646d9b5448b8cd254feed01f183cb5debf9dfb5f70183e56f175b185e5a830e317e882ffb26ac6c0d1e7df4ab75261c6c2e9d126ed727874f4372216598becfce2665f73213e6e1eb5914b91109d1aab1e180f0f306ac805323b0655fffd8632bb013383b1bbe58c093ce968ac8d4747c53bc04fc9cde531dcb89bd2556322c7703893971a826f4b8d0e775aab971b31b015f9ac4ba1397a5d1c2d881c73ed0ff87035b0796d43b806b245aa3f422375a0d83dfd842ac70cd2c02604f6d957326cff1fcc20a6f48714145eb92e2452d81a51ed930d77360b8cc81e4232182c1a0f3e4b29947caa6b18e0f59c924b45e61f74914be7384f438ae25c2960fadea804e5b8d5e64c4cae2f89e987027104dee3ce5ea013f68b3b43a2ac226c5bc83df5cc9790fbc2cb7d7bcec34cdea077548f8886299b305edff6ea43fe901396232326edce2a72b9d6272eb6c2fe85acabc541c0c1af1bede0d9de8f8c41e59a8d73280d7b0bc3e6f3382db51bf1712a6fcbe5ff2658c46da166840fce20ea4941e86d334ed90da8615afaf5cb55eee8869d6813db6c30369b2ba5bfaee56f5abc17620fac1a11fe89bcb7c1c080d24d8fbfdf6c54cffa6a4700faf74e30ac98cf8c7fa0ccd2ece6c63c567802417ae482b75c63583570fc5461a6658367339d9a3ce80a7564e1bbb7a55d59ba15342813930167e730c03230c9a0c78fed601f07bfc704232bbbc7acb0309b386089dfe2ab43adb883424c93996ce012091cbe1c4611e1deb53befe620785961a56b630c9f6bca67823dc0f217fe1c7298efad6977f3d96675f0fd453c6ae5a5a59a991fae136080358db837588672c5bee6b61f210ecfb70a3766fbc56facef62dd9dc5610a5e11c716b9ba580da7d03e03d3672bbf549b417345747e5a07320781b9a21eae0002d6bc24ce4d669a02e99b97658dd8bdc5ccdab1cbd06d49b8c195e4358d91525af22639233508c172a9b44c75ae76a541196653e862234c3f14f1c6b75ef44fb3eca17959468b3d159b58fc21ca94aa727464da5542da5c1bf10587468c586aa897813066701f25430e516358ffee8758c693aef95e93690e8a8c821a0b2c86a81e55d03c8f1acca2fd00096b4f1c79ec093b4abe4e0671863865ba236ccc351caeab18a3fb03df1ab64c39a3f5873183bc3d9c1ea3e0f260dcb34e55394478ecad40f074159cab7cc7792766f3392610f1e6d018c6cc0f4d19f840ccb71c322a433fa9f379621e9acd546fdc90cd520f432be758242187463beba55e7bf71c68fccc03bcd91d7e7eabbb63271f40afe2bef1f366c79dc66e2148c37acfbf9b01944d73ead560c39b605bb6c143bf62e7a55d48ccbcaebe5415f492679769df3b47230c0b9297e786a79a9586501c3b6465d6ff151e847b65bebae11053054c1e6c3f4c00cdfb1ce84af35321b8574526572ab55644b8030156fdfacfa4447506da32edb692afc4957ec97b2ed0e6b54b8af8a88067a989dae1ec03e333926e3615b057417a35f40fe57df2012ad33a47b09d5ef18d1e66b2ef65f3d0842eb456514b0f7c77d70fceca2ea623ae5693970bd3e01bc9cfe8b16e9b19c3e07907467cc21e58005c67707bc073a30dbfe7e3557e37305a6c5460fb3c8b1bd629f51bab2b53e8d92f718542f7b49ce22d8471e80ce7ec95e3c4971cd98f85a942ccfede12230aaa2fe95019735821a8cc12bd98971e1346fad8d78e3f680dc5af3273af9cca5126adfb4ee67251e37d34032e996d59932e1abe65fe3303f6b2fa845b064b016468f4f6c448de52f9828a0d0d2037fba898166837f980f8ce631ea0b418f20f0a646cb5e1230f4dd2b4a1bb3e95775c2c01b1d536a7cf09817036bc9e386cb969064f4b9c2555f1cf2893a569ba47472a0f46ff4ff3f13b5dee0f67d9385410067a0907e8fafccae8e60e19fbdb14db3182382d838329ceb63d5df66a4718f16c38651f0e4cec01fa7fa46cf5a7392206dd75946eab7aeb8370d09ee16870f7db1c4940dd764ff246f26b90262c4dd8c5d15563f7a6a4a10ea45c11c0497f3ae84ec606a383738b177856795ad546ccd3f7c7ab0deda6c8e80e6836ca3f5e5898a496a7ed04dab7fa89099198bf6b3dddc9cf1172bfaf37c6fb2b0d6b54f7965d8ab53b1ac0e69b38fc8d6df345f64bde773011b83ae7ba6d9a5fa423d566df93ac7837b4e50149259b653c3fa1c41100c10c40e96cf17510b8f906d9325239847ebb092bd7bc4039f213d2d56011d949f52a619d75ee7cb152c9ac87bd7550fa333c9d6196f1a76e0bcfd263c159369062b5afce3a86016eee758fb2b4be7bc423561bfc28ed1b371036a4c76cfc2d8b8b705c287892e477e7c8612ed40373ef6a947f91005da3d1373f82f7a2e010c36d0636ee49b895a6557804acef5acefb88d70b0a5eedc4ab02631e01d48daca98522a178ab8aba49f64b79de10d2e4aad5c475fe251559284a8c8186a83c3b6e7566a4d7df2932ba45b1bc111f4b20193676069e948f5a994a45116a837f00ed32c1107fd5f3cbb20490c069707e2a775927179ed995e9634d9cbe3a8f38db131abce9b89b5f6e59989f5e403e6d2b1dda99ac64f9644fb18c31c274b43ab120daf052e2b5c95cc4764d1c9146885951857d74fedd4067b455c0e220721a86d1043e3fdf00f9b8f1fbd7c90e3b60fe6eba277e58de3aaa9a027f74ebc9612dcbd7aef781e09fda97911aab98a0918a2be452540414cede4e8c00f7e87df954887f75d844e8b5b13faf81b1cb3a231b9cd5e1637628c64174f98a6e32bfd8d24bc20c1e48e6e3a51173b8f1d55e011ed06fe33db93a9e6b9d3214bd09ddd2806f49b49c070bb71e4793b1711861b35957675940aec4d7742ab6da60b42640dd084934eb3b5696a31808a97ccf758e93e9ccca56ebc5ec4c7d0ac5ea472a00017582b60f2675902e07d726ce401bdf8fb0adc67db8018979cd1edfb2cf85d6ec5abf3260517cd5e937b94b848d1d3ffd9cb32f1399f0d840f63af73fae674ef15883ee99f8da25929f7faef9108459993b74b0ef3d9d0b7310e184b7d3dcb4fa318d9fdc03222cc336aabbcb893d72e50ee635d504177e63ae361cd00e266a7107df7f4925fbc8f6443ca9fcd312f4f5eebe0bb69244e11e21f6a019e5efba43db605796a0b70d585df540ccf142463c58881a81f1ba77ca44e615334864ea7f389d5890f350cc95c4ed4277dbbb9cca6b6a79eb8aada2db23b0c762f1b1d587373bfd9e9cf368064155e6f418dcec4dfa369ba50d07bed17a885ebb220cc064633d831058685149bb31e8da4d562a89dedac0e66ad82af72741ce3c7860f3670cb6ffed25aa0a6f42aff91cf574e45958360a0807e20810b9262cb081ce7cc7680c6da7fb4601376bbf98d2a5ef2cf69b390458a2e848aa21ba00ba32c85c129cd6be029bca784f7ed6efc81a5f9a14e80d14cdc98184bb5261cf860a08b488e4307846fe9d521653e8af295a0616562fc307c302a0b8c2cdc86a6a8b5ff60fa98f8cc485c63c73f56fe3035d4a42ab639d08fa56c3de22b9b34f8776e849b90e1308396bc130a11f8bd2abd8a861447fbf0b413ca8b4b56743de09742074d4497f380774fe2b743e4569bf0bac4d2036228f4e52f1e57ff610b6b361b75b05fc87d4fe1064ced4d7b3bd4f1af4703f2e9ef8df0fbd346715c0e641395121cfe1658a26fca63ea042b3e187718fd12371b855fef19af84fb0fa9e12842827055e2227c2ce4f53c29bc15006c0b3b1d26f51ae84677c03e529027504dbcf096dd0fd010c6a2406a6c8033cd5435bf7ef8f30a7db1190ee9e7cae459c92a46f4f98fc2e324d1346b55bc4407939d26012ac5f553230fcfc2793c810398ea46c087a28147b107dfd556f93360a18b4798ba3916413c19e0b6dba7233d96def186a3b8cddf8923b4b1850f64e25fda7d49af7bcb80f762e12341fec1c868c0e734e4e8c965d0520f05405bb41658cd1654433d0ef26dc1c41472e0b40151413e55d8a54303347094940de323849e9ba02f088501be616d7e80a4d6776dfb9269556c43d14b5a98530e8b237d372b7f03722e2fb7ec9b4243b56526e118c2609c8c41591eb24107826568e2dd7a7b4c1f4751f1e6988e55686b122d882dc3f28e7351389ae890b610815db6488dd6be6c10e0dfbc91bcaf99b85a32b5b4c8a35a5b945beaa9230e29ff08a4a7e87d01507dc44de0c8aa911ff2ba995a4b48e6c8fdb7f241e87f4fc6c2555a5f1705a66d0be3b1b4bfb864cc1cd58f3951df4c72f87bcac7787ae2988c2323c4157b2105181b1e89311df1c7e5df089d0aa3575bc8227ade3d53f80234997e500342ee2c29ef009421b6d305f17b9933e4735561d9360238462780db22a0f9bb5b454591a37e8797e9a210503ec96717a5db9b1e55ab0a27165da970b384f9e4edb2bf7e5db974c105349bb237bd9984a4ac48b51c64e680e23cd15bc904264146a81402768d90bc7e55fe61e37aff36f1059d117a4249c9ead4345a57512930e843f07876db8934d1def5264fb91c7f04337bf3693201d55bf56e3ffbb6d1e5e9886af1e8f8ab60f9d5328ea211fa10a67bc8d42612ce29ded308d02d70cf6b74fc07b3918409bc69291d054759b11d57f14c4138ac18936ccf9f2521da7c518ba405a1868b3c68b0b35d0466fcc5c12cda00ff855dbfc8cccf95e8919888ffc1fc27a7ab173ebd1acfdba7fe0c6f3d3e404f2850966e7749e684c68dd0c0ac575c1c7b801c891c1ed37a9643ddb58503c9ad808839f5631f3f91b99ab5d83140d49a91406b9efb19b5c7061d0fa7225f651fd48e2b73248d2137cda827a1700c764dd0b815fbd0cd10a025170a56d732da2d4c5070c5419030a93574d813f2d27db0f913e90ac7eb8d7fcb68c9ab2272b759a2ca89c0b039b347ebcde0d2877f5a7d551eeb75dc28431b9abed909fe6e29bbf471f6c7e4be30db286c81e21f41c2a8bde054f194f5e6f3556083d6972fb9762e0c91ca1ab48fcf240645b3065ec62f082d17ea764cc4d9e0084e90da2b1df8db8b9da4c7592a444034979aa7544d5e05096a1728003ff5964502565dc08e2c9a5fd1bff06126ef10bbcccf3f781424c3ddbb30f6a86e70a3630ba20f2a8c084c80346068c50e5ac9030a51043bd7aeb1daff612cea6a42294f2d2d08949cedb8ed8ac0b5667ed52ef6997c92e6c2cc70b8213a44095c7eeaa67392ef1368612803de90b71b99442143b065a46f58fadd101fc534261b0de0d080dc46c99fb1468abc62cc9ec3f5f084bca1e9bae8cf60f7b74ce63f5609f8e7f4e049ecd2879ac1665ede25f20445daa6e0782f028a3f5763f18580287a78fb1c185297b5c48052898bff375060c41042dff6733cb408c61de090c1ee9b0e3997ba26348a269fb7830b20605570703f32b537bb811085032bff7e7180082287a5f4f0716c0c3d165667c61c2163e3231ca266e7c3903411541c3ff93d11a68183a1899afcdd9c6814088dad4dd0f07e05044e9f97e30b0040e4f1f63830b53b675aab964b2e546b965b62dbcb6dfd9dac6c6c0b50d584ba95accd43e5609509e6a171fc442a99b74ffd7414028c4d2e1fbd9b9b5a0e1d5cfd4e0c51976f1402c96bab9b7ff3a078550241d7e9f185b0b1e5eddcc9a5f9d68130fa422289b7bffaf63b0d0c5d2e8f389a915a0e1d5cfacf1b5f376714428084e564b168fcc43b67eec706cd198c5d872b1fb603f91d9f10f21a8249262711e6f9a6fdd14617cb3ff17bff54620d024672dfd493a1c6e8709d1a67281df41029f66e38e343d113fbbd2be08f2c942d0ed6b101ebc7bc1cb7d22eaee18d278da48eef5c7f60d4ae594c94630fc0b91d118a3f97b2aea70c4c1ce4147dd9087c7f2d7c684630abf115ea87a40167f0f7ec9d44d16f22d92c638fa793991a1838a19660307d517e4c3a6faa43e363caa1415ee21799ba831b44e2ebf4c23a6f135d27862818cace7775a0dae5340387fa6e5cff519fd8fbf8d06d86c195a5b6732b4f83163af407e79b5403eaa7f7838db3c5d4faa74e28a1fb81162f39171b4ee2fe23f08c7ec7eb74abe8e13a9474584e057ce3b572efc057fffd4f39f6d479c5c22785da56767f53c8299d066f75dc3e03db7ecf78042d97434bba449d4504f95d26885644de8e30d61004c08249c6637d5ef81fe4f9f4fc2ff3d8b5361ed66397f7f9cc077c70227cd529bb33cefca38d7c16a5a414aa0b3782fc932adb06d05da5504e0c0534bcd9797dd5fe8cdbd26a9f578193a77869e2cb4cc0b9174a0501296b508358de4552eb633f173728a831ae6d4bcfd21244cd8cf4a47c36b836686ad2ca4fa47b8b032f592c8963943e9f31ca5ce128f447fa48c352b59e06317e654126d17403b23fdc02c6b2f154de531f0dbfc3ebb785fb6193fce93ae6710a04e6301c8b2623fadc264fb7bb8fcb280e7027c716469fd020f8ab7c52f69e0fee387e80c071a64872d11e4939adcfff38f1b8310a2087188094257d12e06daeac3950b4bf614e6fd5f6f873a0766ad87e7c9b6915d965a599539b5972f1af43e6e6e8c1ff09cd7a96fa10b3ffa7c5d53e4e3de87a12dbeaf36792a51d1e2be9d27ef8d7003e07d23837c50054c648a73df041a99102c205a975909e71a5ade8504f7710ef1c5a3721dcc1f47fa89544ab8804f98e10064a52e37cba79c7013eee0df8a0e5c2c7c5639b5857d14373980a1e849193cca159d4aa5e193c86c97b1055ab68067a5b25850912ee50654b7833843b2d9976f7569e8a8cc1acf04b265be36e6e5142890bd56c8b429de5c28afd1bf353865f3804ef609a38f9a0df0f8e96f418c3775b24fa1e756d55018bb25038c2c6b4a189b7af09754b7d9d550d94e87c69f304c504a2340a59ad24dcf4420bcfc7d72c90600609306cb15f5733c5b0b84592814e1bcb1b26388a8ff2c20efa366dd0f885c754a0283dddf93752671eaeb7f8d92c9757874fa64e0498ad6c2ed6572c9beb9b93e3a2d3bdc04a56fc0cf5016207586f524e7983200f98a32b8695b29ef9bb6b23497fcc47056200d5729214412ce6a2e6634effca53af3031a001b6002180166606a3b14eb6092168f8fc1fbba07d3b9eda33e2937b34c0324c0852b515a8c86df4f860c50e35b8fda0ec70e6d907551266dfad78c0636cbd3cd0b40fc115065b2905eb5cc5a726dc4bdddeed116155079c5b7e57ea102c0307d8afbabe5c4daaec71a1bc893c3c0b62e7d80e93b4ed521f383e59b6f1c926879611f83504f99df6f17873dbe5b713b8f95b4a345e69758a6f528f8b0e39cfa7d760e0108bcc67c3bc90f987f622897cf67c7191859ec34745b8a13c1037457b8410957bc40b0adcb90e56e6574f8e5b979dcc600b571e8c088ea7d783bf5e5fe33b49fc78681bdc2039f2de7c250e8171ddd48112c35a65896117bbe09ee70e45c16b2bb06937070ace8dfa134db1eab6984cd0e3cba30bb3a66eb71700db21e35620764b0c0fe35559dab28bad567ea2af86401c1d00f30a2beea3ddd0478db201ced5a1003c7566a0e0c17010f262f776b5fd2af9407c3c0c524edd330439cc345de53315e407bc2886cfd6b13321bf6edb5f8fe2155ab0a4f22f775d5b47b521fa39bd17002788638e991a455b8f28ad3c1ae94c103e5b590cfe0ed35f7a35d954207be27c7539c63889f16bcfe0aa3f62329fa2f73012323d114a90d75e18f609b9d01d514c6f4cf9b54434c475c0da05b461dadd4151cfdefdfe34838c0f1ff45ace9a2c4e374b5886effd7cf0ddc698e5c7f0c5560a5fb172a0c2d26c9e374eafcbe660aece8cbb1a51ce69ce435d3460c1c291cb80f2a26f6670c2e9d030ad7cd8a4efbcd890dfd2694af82fc41239797b2a55d522e2050810903833865889e59b2814519b8a6a52c1d09269ffa9ef69155fc21911ff01e710407f3c92b03106b2b8290d6cc53b67ae068000e5ff0e587a4e0b3878ad28d0cb7a386fda9432d4bcf839fa68f0fa71fa5938f561380e96f37bd4f485e171c9e8fb0b0e445258b786a2b696c6fee88a2dcdad923e2b61b512df6444a4e48cccb6fe6652a41ccd3733911dbbb4c4485a83579e7e642ec49e1c39335d457c0e13746f80f1a2e4d81378ac644f07cde9340ffd46c30ea30b07a425ab3fa15ea9ba7483fa079c996cba34e282ddc98cb2193fe9d95bb57550f5c6ff197d2b571ab912acdce84e2f06b5ab03ce6b6d446fbfa1236a10850f40e55ec41f42e89102c02156dc3d613e8b2a0377fbc0473d9b22f739fcbb827833469509c640cb5bc8077b64f9633514a426ce0ac7a7a7097b9fbdd973a69bd63a3598d24f2409df3b0063a004b98136cf9306ee639fb1b598d1e28ce9c72310fe795e6c4d6d8c629cf65298411249e673270251ef621af25d6fe925bd8256c00a5370a89a474945f19d351cae3ed4cfcb33fbf0dd436ef4717c8940c839de2af0220c0d3fa39abb3a8ab20e7d15f5867840a1e39925fc0c8a57acfa54374d188cf9703e5ba3a930be0647e1e8a2c3f11ada9d9c8c0f5710f31386434bb0792e8d9657de4c62593b1068917d874508ae876b2038e7df3758977dc04254e7176eebb52e8ce170e4a455cf4a5f8dea26127e98c3ab54093be7a8c4894779015fa5309798e58c345f638a82775b43be4e58a523cce1c6df198157bf0ac6af2538e9f14e3b83b55dd270495d7795e71aad53d7b3cf27882380a18c79728ac16ec74e14fd3016f049c7be7aa6c1755735786116be46b1be5f24c112fbe342dfcada7850e4b2a54382f8b1ab4f35442a245d345cb523b42d1a7b1d8feb2b90ca629f3605c522be2cf00f555dfd928d64c30875d1c8e80352f027cdb08970a1cfc626248619744bd878bc06260d2b4f25125086184a0dec4ba9c2b3ddac3eef11d789e5b3bf82e65d17c488044768455d63d8c6560394c9e85a964dc466d9588c660a716aaeaf521b2233b930df9e6038617e74a52703322468511983d78e37fbe5053a17683c27a4bf4008037cf9feb056f08fe9cb6a3ede996d761f856c1e02722925c633ba97845869ba6f5496624b98339e122c050ce367982c27a08b26c0e0285e31a57560d9090efbf61c243e379f0ca726289bd7d6c0f3bcb74c664ec5f84df17df9b53e5d953b73f026d800c1533024abb03a03630ae26e93cc3333cc3333cc33386e098dd6ef63f3adb504a2949b31716f2c045683dd952ca9452c2be9cfb7edf87af006c6bad0d9e19c309330adb093d749c6440e40f27397c88b12941c45080881f1a351964bce3ecc64b1f6e59bb536dd2c287b38fd2626fc6c69f77a30228b8112206913de0a24bd5438ba7e9393d2022d76427d3b2079389e4e1389f398370d93eb72482873207e5594ad90eff923010b9039aea44b8a45ce7b7e691821b67e0d881881dd2647e7a4cb35d7a497540e7fb93a79ed65d0792c305376e8c1b36060e1f8b022026b882081d6c394cda6c1aa57ea63244e680bc66fff45932b7bd0f88c821ad6742f45c2cfb4e179138584aa7bb91df88c08133f5e02f0ba237ac21e674d261f6b96f37d8c2eaee5e7ba8962c9136fc1dc2d4cbfc4144d890f4d3e2e9912d9ebb209135309f5a5ad413e6f70d44d4e088baf0a45ab9dd6dca89fb9f00114903ca5d1ed32e65eae0490d44d0b08796cb6d4b63872add20720633ccd7657bdf9cd7628162c18d5ac18d52c18d4ac18d2ae346a1e0469171a3c6a880ebf01104c8498af3e091630a2266405a5fadcbb16975e73254eef6b21ce55dcaf690a1dcea0ddaddf73e5d651019835d253aaf2d64f656c5a08fbffce66a674afb61e03c0b4a6bbc2679410a86638d4e67b19beb6833887c61ef98394b89331d74f6c27999f936782e8d9eed42b9ddf1dfbdb49c253117f6134a85f0fabffda42d28da6fd6b37433c95e0bae2937519bcd4267972cf466bb1a32bcc807130bc6cdd79aee9fdbb4be421bed2bbe3f2b34fb6b623f0b42c90d55a1fc0d5ae34a880ac7d129e3c7292d19d42c3285644e995ef77294b5b814ecf3ce5cb2cf63e43a5a47fb1089821da2bf743458a733a180feca24ceed45ce1333449ec06909a59e4be6a34e2836ead54b3363169e48130e1df406cbadf88f2f224c383b63b44a7f39590b1259c2161bc39f1075cfd20ce4470f1f0120828812fa2b65a731d9893c1d94134ff12103912458773a7af68cdfad134490e0bda0478fd68c1d3a2e7204b54fbe5fed864d2e08a552090387eb481b061123d4396f125a9327536d06c00b224538e588b1fa240e4488804b2d76d00b132fa978084ba5e53c19ab71dfa788105891f36e91d9da5d3c8c303c0595ca8f347af440b1800f4282a196dce49ec13b67cd0801c63ed761a5769f428421bf50437743c9cea6b5373508f1c57e69f19dfd8255fd3bc608e945b23acee9df756e31dee1404c1083105e382a74e3a986e60e0fa552e95de0f39ae66ef3c7ac1ca20b5c6e73d023e763f20bc9852f6c9249ab66ac981ca5525941082ef6973569594c1a3d7aa09c348f3d711d6d85905b203b6ba6b47e68b616a552f9b121b6c0f63eafdee74ef306a5527942482d96e6a4b9ac1a459b50a110428be37f44ec35e8f04901085080e478c10f1d3ac4b891d203c8deb8e13ac8e13ac8d1849059a4c16f4d0853631b6b882c5232b2d4e84d7bf66b0e206184c4e2caff589d6b0a818549e46d92a9acae34cb2348183c5ae02ec011002284bc22e566eb355ab6d3a40b71c5e76292a9f327512eed40425ae10775497efe9673708f15e68dd67ff733dbe52a74599646477fe8d411e12044157bea8b8cee8658658084a4227d75eac12ed36d7aa110820ac35d1a2d77a3a64be614fb998cd06bdd62d027539873525b8e1a9b71f35298bf333d8cd4fa979114c6a0e32ec88d47b1888d5910d6720e7bda2a51949e3dd58a675123241429b70db9d31eafe5111406196cef449e956bfa89cddbca3b77a97ced3cb1c76fd026bc63f49275c2d3f7a48368af67b775847042cd11659e2f5b5b6c13291f3b1d59ea3c97a9894597c5a8c1a30731aa93895abecf24df31e6a511138b1f7e7f6ab3a7758cd925eafba445787cf144472d715f091d5d75be65f32a7168cfbf21348d8c9994f0e23fb6c8536d5ad0082164129f6d78c952ed2a493c9a77374c465b2f4d24d6aa0acd9fbd1e1e04096b3d5ff8e9191d7abe7bc44174fc17ed34e3cd3373441d3def537c1af918af6a04a3a3aaf1e2c507f1cd18e1c6eff728b721c3c8558b4873d6c89062ee7f5f8e1e2e7841882216b48ef07651947f7e0949049fa5977bc6fb3e76df23041168ce9a2f2f65ec075112420e91789d92b51f0b1262885b8cade3728ff816bf10b5768abe8eb551d3e541082192312a3fe718a555590f4206d14953efcec137c6c66a1022085bae767935853a080904a36a7412f6a9b385118e0e010472e4b8b42d9b56f9f10fe74611b5babb522dc80f8b19af5d709366aa94fa80bae0e229135a72b16543f8a08b0821572f43a65b6884eca1d9ea93cdd24ba7bd2bc10d12dc18c10d11dc08c18d14a287a38dcb72964e880fd2db1411542a9be22d08c94332687b989b35d3e6e20131f3d65f22176e1a11dc3803072177a8323f8d5e1774345986d8a1d1272a4dfdf3e324a40ec8ce78d12af98fd6d3e18c6d19e5f7373f6933089983d9a2e1d394cecd9e97c31b64cea7590c082171b8efba5a90f7701002074c6350cdf78f5dba14f286ddfc73fa8eeb14dbdc80597e78d0d12fe6a71642dad0c9d2381b94f5216c603d641c2b21c76476f941c81a9237767b522b5c3baa06bf3ae5a7a77bbcf37384a4c16d73b37f554dee7242d0907d1663a57e689d79ceb0248466c95dce72ccd3cdf06bb64c537beabba5cbf0fcc78dead923835e79dfea2f3b064f74d29cbdb01132888c10319c64487f55ed16d7bf30d8d572ccd882eab5b143c0f00655d752e7b13799f982e3e9e38a90f70c356d10e28535f66a70d99354d16c17ce617fa426fbb960cacf0d75b33ef24c5b5083f6d9b953427867d1c2b1d6bbdff65aa3bc2ca45919265f743d040be68666ab9ef40a7b1665a7fe4eecfeb2027ba9313e5fbc7b796910520594360bf519a42154c863fc2493e889172dbc215348bfe83a6bd9ebbceb092152a847bb4aedf86f1286440129a6ae639fba52d7d11102055d7239350bb37a6eb20b429e60521d3d9396f7cc2d4f438813ceb26616356d080d236c82f79eb7225df6529fde40f9b1250861427d9a3ec39ff8dc8f4b216409c5a91693cebff321552524bb2e69f7d3d1d28b6f2124096b3cdd39f4baff7f09098b29c7b4bdd82f28659a00c702d910f812428e600939d31d93f2f4826a845c3e619e834e9ee497214548aed4ffd90bf27f63761042045e0c6a9d7469594b09850c818d41c6ff91712d5535438810b273e9e2dc73edb7288e60f851b39fcb4988501f030cfc45973d968f8e777b0403fce2517f9e9469b6fdae9760005f6421ecf594093d310d03f482b9ef129dfbeeffc3bcd85a72db9476dad72a03ec42315331327763e9c78060005df0727aec1cc4b6b50773e148d167f2832eb197bf21021c9dd2839d053b0c808bacf34577d742c7a776a4f418414a0f15542a3b527afc1a40d600b7487dc9b6974e5ca6afb658f675514a09a5b1328862805a38aa93b417bf63f824be7143878e05c10d1c2da8548204800a06a085361fed4e9ae26ba4542a1e30c02c7c41297fc1ab5f474be9c000b238d495cc1aa4061d56ed11c6909d415285f2c518544fd4a88b31052454389d2ccb949bb4dc390d48a660f455cd92500be5e4c7fe10e3032168e7f561c61a3e060c48a4b0263dda7c3c674880240a883d31ffaad9be5b3205245048f6e8cd9a5eaab4e8d2019227dc1ab259ce2d1b45c854489c7078d51cf36c6fc22e0ba3fa9db3a4e22a26985a73881b0d7222fb12f4a09edd6cd47fc4af84ccdd7cd684f6cce27a12064912b8b38ca33dde67ce1d09127e4155fdf76450a7fb5a83e4088d67f6fc82fd3f488ce0dfe5e68948d1793631488aa0b92ca74e9f929d324539e1914242845308cdc2e7383257e93c480e3c04ec2ea854488670b86c987db60ecd49244278d74b3de90c0503ff24a6dae6dd2e7328151801461e4d87cd59c3f684f21767b94465648ee2f20bfac28e339aa7c5d031d2fab1868fd10b5b93eafb1b0fab59e685c9ff42262ddd3bf6f8c1a30708d618d98569637c77d39fb9fc74f1291d37754bb4cb652e3c2d9974921a2294cce0c29c05d7d23d713a75750b3799105ad733891699115b1cef25b92967a3c7601aa985ea2d9b3bb5d042abcf72523aafb330e9f45131d62dc71c088f45431687f68f7caccb1937c6828d37f7a35deb2bf30f58b0b13aa6ebcfe49e7ee4d0e14072a0a87102c4d178853527c2eaaf7a63a6525c6197c84dd7d9f178ba56ecd193cd982723ac485faaba90fd2c95cb28954a4a9f8cace2f7e8e9e37d301fcb470e356a30a20a37f4f35de65fd5fe6a380f4fd9c1482a52ba745bf81aa96b52549cb4304aa7e99825f1fb140b52b460bfc1ddc518a1542a3f7ae86034464c719e4fada54a77a8fffc1829c527d6793ca90bfa1eb4c1082916b468565cd7d669828c8c02bdc1be2597763f06d388287a514f6bbb0c21eb91509c3568f1d8f82eac8f52464061becee776fe7e395c9fe06476fdfefcb2b81e549ed8fb3defec3efb78aa139599a98fd641ec6bca09cdd75ab491ffbe9f0508239be8a4a77d31a8b4f03f69e268663afd29f7fd0ea3542a61788e9433ce18c9442d08a1f90573d56ab1114cf092f529d9ad020982820f8c5ca2db79f36d497c5c38ad01c4c70e1bb1c4b659d21ecfc304954a18239548e69b3f7ff1b4e4665122f77af1c5bdce554a0df21f28c1c824d28297f6dbb91c4c6592d03c83f8d4dfa14f6b748c44c2eecedbd6be22cfcc168c4022794a7690a9f40921f72316cef3c918a5b636be2356cd51a193964c3e791a81160b1dbf5fce9c6b1d6184f5c9054f625714148c2cc2bd7bf774d105533a8f2862f1b2f4a0a48baef350637dec4822520d666a84ee2979f50822ea9399478a68963c045a7cdfd797839b122161c410cbdb3b5aeeab1253598f914214ae3df7399f8e068f65c10821cc829c7b9646c9554f02f0859141f4a7054f3f97b3740b8f1141d49db42559118f1c238138cb2f6ccc7addc2f808883ce6b5a88bd9b3cc088d913f68b36a739b4346979a04237e6054a71aed828c9e4e1463a40fc6d524a6424388bd910fe5bbb07f3ae6ec1e27118cecc19a1733c3a91e7d1beac133d9ee69539475167560240f684def9d6ccfe273cb8fe0a1da9d4fb1175d522dfb83913b98549acfdb8b39be4f2895ca0b46ec80cbe27199fb73ca5a698cd401a1b3f03ffa197f34473919a1831de5dfc59645308391392047692ba9ebafa6364aa5f263052372487cfaa997840c63f10d46e2604e9ddc465e18b5f14389c1081c3079412c93ee121f36283b46dec00b9addb74f7c57d8ed06c573e778d23fcb9abf001c61a40d279df245759e4d21d61ae924a50710334e7cfc28010e203b1041a5026407ce8311366062ba3e87a50bf23f3a46d6903e197a5b44df4f886ae8e263b6781bc7da6c0bcc80082369489c163e4bee1d7fa61446a5928511342c88d0fe245f2a93f2198e27db633237853675c40cd50bb3d7e2c6c8e0ab61a40ce72c6b0be295daf6dd0819d6d13aa3cdc550b2fb8e131eaec3470f2e63640ce7b8b1b657a35f70f130c2b8e13952ceb86181ee51463b0f3552500276179451811408600e2362b0b6feb4e81b52575c768c84a18beda44fdef664ec79b860040ce8ae0f29a72e69d38c327ef098c1c8170cd2845fc9bfcf29e328619851464a0a7a30e2853c0621edb396b29793941e276a6cca09104763a40b796fac8bebf3d9b0502a95132e78dadf3e8a57c6d2b1108c6c814f3f56ca3bd683e9c5c01182112da0bce3ae4c6d30a55209c38c326e309205bf5d5ed520d7d3dfbfae8347b07050e5c936e5c617b745a95476b819235750eb4d6506d97829ff8815dc3b77a9b4b4a54ede912adc2e23d71dee1ef344a9549c073972840a8dbee6a9db4eed722353e0a4c9a88eeafda2971474d15df425a5aeb9d328954a1a8982f9996e3332a7f458a1acb129293b0285647adfbc97848df82c234f486e963d4def7fbf3c8f3881fb1f99f7e27bceb25c30d28444f8781eed9c2529ff8e1126a839eadd9e5e9fcd4a63640957dc961c1db3ac592e35469480a8d8759646a81764998405716a6cb48778418648584e4669d9755d3e75061939c267ca73696addb8eda2542a3a74e448a3072346b84de7dfe6da6ae9650132528474b4f3753d39bdd07e104117f746d7334b9b2efd1819022fbdb554fe7952333e22046e35334c8db9683f448261b7949dbd9308a552110146e2495a7abff4eb8210a5524911f985ba296684bdb6e62ca1542a39447cb1f5e6ace7729e0b7bd1acb63c571767fe0e115e2c7a9989bbfecbd9a3c72edee02ebf4b214ff52fa20b2dc725bdfab2241a2d944a050d915c2c9ea7d432a1a1810b5cd250ca44fa5ba8104a8bdc4297ab3551a2f184107b8a8bd862792ff1a34b99b83f9120528b73c6504a8b54553ddb5c2004115ae8c2c792269aab53888cd49e2305080e34446661fe1bcd9e4be856add370ff51021159e87fe5f6b26bda2c4c060e0f88c4a2aefefa56ed503ae8ccb8e1821b283fb60448041626ad4194d0a23777d20322af48b5d294bd29a1a47419341071c51f3eeee8513572761369056e9e239fe4e898aa5881e767693ee9ee6e710f2027283f82f820436415478d6e9dbeaa63166b141388a82279a75eb66c4b80e3032138e3c608c6b851021c2c104945e1a1b47cdeb22f4a8752a938f3581df4562a61800047ca0a44508148f7534de1729e151039454a3b5a6714e1b218f428958a0a4cc41478c7f4df66275ae6b13a7c9ca4c6c165542a385ca4147dec0f5d6d2e2861c040841409d5225b5dced039a5517cdbd2dba6fd9855349424228acaa597eadbd64e3f462414364440f1094f2c40a413397c88f1e300229c38e99103041710d904054434a1da7d505dd52183279289931c3ec45001044430e1430c671e3d1c207289078858e2177477b6bb0bd79a42a954ca10a9c48f353c8d088850428d1c3ec448f134527abc200511109944df95734a3e66cf98bd5291c41917108904244cb3b9b393101ed3c547a4d3fd890619df4bc93f441c010191463040841129257731c2dd3580e46083c8224e1a20a288e5fcd859d4d6ecb9aa07101e22893880082214207288ec7fd3a90dfba5c91331c4416d69c5bc642e4b63210c1e4f2d74caa02bfc306e7041841008101944898820122012883b272dc64f5b528108200a75691be352f49e0b1a68046c3c91d03f358d1d2744c63bc1069db97e658f410927109b4b5ae9a6d27d2d0b4a36b1a8263c9792a5dfbb53418926fa139e64d29ff3f55a7e6462d9bdc5974cce6e4f8d89eb76b458611e9ab59b5172895784b6a98a58dba72c81189765316a7ece1902414925d455f717bff3b53d4950420983970bb2f1cf434f3989429afcce372332dc4512bab022a34a0b9b5b5a5650128953fb4da76dcf1e741c126d6ef96fe794ec3ce21e407898e011f7ec8b359ff27a9a658c1247a4e979b36531dde7658d48778ea7b1f5c2957c72fcbbc0042318c18e1e292348273f7eac8f57a38411671d932ec528d1ba93084a1691321b9b37ed0d329c8ad06452a5838a7ae60925c27b8f9b93eb8a88776428cf6fc165c42646c9217ccdcab4a12519a327950a19627c20056490a05269ff40892170370d1fd62b43d85d08c442b32cb7f1a5aa8d1079cdcb617d47ada9cea364107829699a4d4673b54e1067f95f9022c40507258130be1c5a3c195f16ed5c4a00718cd183eeadcc66b7a551f28793cc9e0ed9ec97d50f6e8e1ba3e7a4740c7eea204787a0a40f7b1cf91a7ae6fb424176f061dbcf97f16d5d34a328954af79e923d60eb69cae4e7a04a1d950a101e395a80468e0f542a95123ddc22fcbbc386dd2cbc3c7ae03841491e1e25f5774d4c3c8b101ebe4cd975fa74ea48abe40ecb317331eafdbf06b2a9c40e26fbb8ceef60491dac6f7957f3f9acb664091d4c3207b38d9be55ca3c18182923974d999a37a5e9672df010aa7ac9bb1c6bea0871a67542a954a0a9012399cb59b7f74bb5e4597e37fe4c80124082a89436aae214c6859c555838397e9d39b4b66aed152010e203974f8302305880d4ade705aebd8f1d59b83cb58e286630e1e63e75299cbf236a45ed56bd3e3b4bec7862511a3562f73d617fd1a3ea959d420846c7b39490ddaeeffcffec68e57d350c577ec8fd14adaa6d0b0b03168767b7d06b3490f1ff3e6a566d00cb92cde5debfdfd66191cf1d9344d9d754e4f863d5caed4afefdc608e01ef51e243faaca8ca2d2811034ad4c395fe8e7fee8421b5ea25fbf4883621054331f6d276462d2132fd85edc5fb0fcab4a445adbd903c1d83ec4fa1922e584a6d8cd231e64ae6b8d05fca7fbd75cb680b8e4bb15174839930ab440bd7f9a9f275399e2eab240bb8e849abbde4e931ea2694606111621b94f4dc354a2dc6043e30011c2928b9826d69de498f97102fe9638d335e50628574d828f69f25d7cfb24174bc29a942fae28ece0c53d35285922554307cfe9c7ee47b5ba98481460f3220f0637b90e1a347193850c91494d12eb53b3dea65d91229589aea44f7e783fa2d0a79fa964dc6939b36a6282550e0650da5dda52b1579fba0e4090619bb414d6ea7fdb8c4096c109f6bf3ffa7e57c4649133a31612fa80c024209136cd10cf74ea62ddbb5c6aaa06409c5aab7a8c747d19d2b51421e4c56b9cb49b4e74c49123cbd2fe90f515daf4a9090e6512fc9dcb9e40807a5ef626bd059a1c408a79d96ce72d7e38ef48c922294a9f9edc5f3b8cf7809111899762593cb7165325a2819023e56eeb94c7d96a5130825425838dd6d33f1e869d3c148a853d5ab3e4f76ee0f4880e1c8cbf28bb51c32f84a05925fe02facc6359515b7215f347f9e5fa63c73d2652f16b43c23d3c5ec2cd71e002390f022f9a32a5ed4c69cbc2b02c92e7a4994d28dbbf3e28bebe21b7569dc94090724b9f8935849bff233193d3f9040828bd3fb694f6267e13925b9c5828c565f19d36e76125bb8eebf2245a8d2ffd5c218b3fbe8fc20239ad3a24c97c363953a15aecdc22ccb37d6aadec1c5580e44900312599c4996fd68512c7c49a8f3e4de71df5d58f0528a1644cd73d2724cf20ad46993cff59605e52757b0a9b3d5cc89f43bad15cc670b75592c973ab46190b0c21977512fae9b2edbab58525a7316a154a4fc06c80f1c46a28a544c4e43c49334414efc47cafa4845eb366afffaac3abee4e051214145f331e679b1df42b324c929ccb2ecc92551178352268929b0f8983dc6d68c2d629252f4973974fcd9a090c2b0c13ef6055df3f94219c5c2cb5299d0acf349b41c89282c3380bebc7790e239b3e5ce831c3fc8200905fa513eacfa7a447c14f7b1fc6351f847f74001e23b4440028a645a8570fb78da84388ee413ca8b18355623f4077d076d824ae5c709483cc165d4f41a79fa7fd51420249d4826394a690ca1d6c9eb558119249c4069b965fdd3a94b5ce64836615dfce794f7e96777124d9cdf835ef15f71595062802413b6a996e4cbaf6945c9948004130935d941072d5ca9e8d0e14c720944785f7fd299d3280f8925d45815a7a2eb5fe305014925da6ceaebda590e5e72124a1864a7c63f13a2d2847080a05269cfe1a3074fa007c9249a470e35780439e191030d4f27407e044939008924b24ee1929fce2e8e6e2491d032f33cde6d8c96b7179040a23f2d9ce6cbc9987c277984a79b5ceaf28d23f0e8a6a1bc367ee7d908bb5e33e73d21d3bd8b031246e8fde5fd9a52ffe545a9544ed6f03116719676473bdad85f8ab86b8472498acb1ee2012149c4267645cec98a88a5dc8fd1b119e9a90181e410cc7a8cb99ae452a32486d8c294e9596588c65c10480aa196fa58e6c2bccb07f1808410c767cfa71126fcdd4f02c920fcce9cc575c153ff4f2228028920da9c6a9e477afd653210e788b5e6f2f593f104c4627896e7448f5a9dffa06889fe5ff78c0dd90fcb7bd4ff91591fd21a3e1a37cfe6a02f1fb05bd9cdf09feafb3df0b96adfb6847a49c8f57085eaa57fadbcc6320fc8cc9d67b42c596deadda30c123c9cf136c755d57b5c7887e34bdba54db5e745a90c123b743e428992f94c34e586a40efcbea84968717426e5a1542a6bf428830e9dd279c467678f640e29cda3d48968cb721647a954cc284306247228d4d808311e33cbfdee20c7c7a1b0184d77b1650c1238a022fde5a8775a3bd537f42fc5abc8d357f30a258c333440e2862e833013571fe4fb6158208c1a18bce13cc8f123480502a0059236b8dfa6640af95dd69248d8709ad414a26b47c6c6a4f438711e3974f0c8b1863abf5c93905bff7caa6131cb9495db17a336941f5b02923498426c96763986d29d9202091a5a4d5d5acc52ed2e86068f4d39f9c1c349ce9086f6bbcbf232f3cc28e3078f1312339ccfd3937e39bfa46f1d3d4e46405206b45d6dcfa9cbac594701091930ddf2efc2b62c5ee93d888e7541928ca1183755ab9f343f685148c4b05f06d1fc6b2da74c9d8103889b81f2634bb0908481f11afd91d651cd333cd4e871031230203dfe78120dafc9941e272220f9423bdb2ec86a8f941185b742e205466c79ed4b7bba6394a40b7b86b720349eb598239070012fefa0717cb794982895ca0a6e9081e3906c61f953791051a3a555ab0438de59f081103481440b4ba23bd3f78a743de54447da33d458167880240b8d7ef165c93fcbd6ff8285c3cbe728ea46ce796506c915dacd529692c95d4f4959406205fdf4a8c89cbd011630c3c01506eeea20500108aca103080a1a397860a032502603260106f223480a0102b046c240090080fc08c2820104c0d1d82068f0581d2102f891e21ca47ba4f81069010078e4d8f103b0118767f45fe696d2e6498b82ce82542a3b3ce5440739faa4c9b00107cc014407ca8f3d3911b1f1065e74839fe6cc2cfe8761c30d78721262a30d9803480aca0f1d27272236d8e06307af0188ff5083eba0c78e1dbec30036d2b0860fdee13b0a60030ddf3d763c016c9ce177b03b9e0036ccd03d76fc006c944197cd051d6febcc8487d23d767ca5b223e5d09103888e1c41d2490a0e1b64781e39763c016c8c6107bbe30760430c980348f7d81106cc014407393ac8c989880d3098b9d73fbc64e2851fbfa0bfa0b3e8ee65617ae12c76b6b02fed6f75b20b460fa554897dfa3bb96069be942e6b6d14f90d6c6c61fb3df1b1b63299cc36b450a9bf0ab5fe99ee5f1b595063a46bcdd8dba98e05735b27e97226cdf1201b575094c627b12914d8b0c2a6c42b454b9a2c6da1781a7b46a5f2c346154c8b71fbe4d92dc68e62830a8c06a9962783a6b12a2505bf4e061f6c4c61d1b41c6408d9593bc436a4e076164e6f841032d564230af8a867b1cbdad2e541814bd1adf06b9f50a6b50aadb37142a69df0fe27f5317c38ad5e13d44f23ff2f2811bd1a1b4c30f65d7ecc9297cc344be03dd6b8e8d955de746c28a11753fc3ff9795ae86d2481af0e21d72a5d741f2101cd6296e376167404536366931beea5f4c508776c9e8c97aed9f9294225ad44d8f5d796cb3688e098d62f95ae49b13104732ec7cc5d8c721a6443087fd05ef5b6f6ef6206e3fdb433a725cf937d9a01c38ab5d0f620c7c6b4bfa8a46951941a5de9719af802f55b71a673780726bdd8b76465127b17c47e788167c85dc66b7dbc7a17cb9dfecdbe3565d2195d2c27938e6a509d4387b968636ceacb1e636c398a8b83d060a5fdfc64ccb19455410f935ba074bc20a4686787892dd813b539860e27b38d3e4c6ae196779ce62769912c9de99256065f97c56416c9a02d5cc59475ae070f1098c80261998316dfc42e63aa62e1b6b5ace19e2f08cd93c00416dbf6ba86ff965eb897314c5ee17e96f7647a69ae4b7585167aaf2f9b5fbf9cb6a239174da54ecf0a379a8bfc8ef4e0726715f8cba2976659fa9c3ea48a3f54d727e9671a63930ab45cef1df27426304185e3f22da86dd74d2602e1d123e54960728ae56bfd2483f435dd6a7574c0c414888b65c0a41479e5fac9c8f59c199b906239bb0b37dbb23979da6414cee61664860b5a965b0ac54414b899885fe7ccc27ca97d0426a158cea08513aa771350b8497fccf0d16c4c274560f209e75bcec3b30b9b45cb1387cebc1deda64e781b1ab674092f6bd1f7a85474e400128413b87cfb2661ab37329a062f1033ce30d904c27483febb8de147a80963ee205389a8a8699049266ef10c62834bf3e10a4c30a18d1232739d9c96fe1c2729e912eb5578fe7bcf4dfea3542a2f30b1c4d15e4c2eedd595e0f24de9ea0ce53d6a944a85062694581297ce4fd3ed8ce75126b126194b4da76d4bee2289fcfd74e6931be1928c462450aaa52fac2a4cbd1410ff010993c98dbdfa72c66f8c52a9381018983cc2a42b4ca6174fdddc8d8623925b3abd76e408d90910ff110393467cdba56308a1b1f4681881fcd5519123a6b59a452cfa656676d13332aa28353051c4d5621ec34a4c67cb51a3470a1a323049c4b72fbc77ce244c7b43c49541e7fd455b8eee7e389016981ca2125a1ead735079cfe8f01443a06e43860e2b8819268570f332ccc5fa8ce6c9234722449649a66c716f4ffae80144070c82334c06c1291123ddf75637883e04f1a911f2f43a8891d7bb0762d3f9e46ac5eaec93502a1511980022e119755d44fe636e6af28725916520b9516446ef9ce9e93a81891f0e565a5d16b335e9c35999e945c8d022edaa98f0e1d19f74f85e6e75cc7feca194590fcdf7f5600b5aaa19a1729ef1fdc843f582fc90ded15d36130fd66892dda46eddaf7387b4c64f2eab66ca9645edf0e6ba4b227f5b5d84ea6012158d59f250a3658d0ecae9c69c09b5fd5cce015753f1c206a14fb72f87366d48ed4bcda373c7240e6d8b980e2f9d79e7900ff731c2308183295ace27ba732ee60dd58c887f375fd79844266e30e98da7abf269833099491b9add2adf505a8e17221b5815f5d15574de7c32ce630d69bcc8ce529f35f53edcc7d81f398e60a206e4424611315a3e19073149431a649a8b1b4a2726687093166534ffa69a3cc8819fa4a41320397638074cce900cbd39659997c89276c0c40c28a56f646e53fad2b760c0a40cad7ba70eab7feb14a1542a6a388f0d9890213111f2667d33779331e4528cacc9ea46184d3011835db33f1ed7a38add28954ac5240cdb6a0c4df575b6a53301433522a647cb2eb9a81b4aa562f28573d5c7cb3ecfb22823af54d2e091c30c132f58b23d4b25d34b5b5080b80e7278c0a40b76c7d252fd8b2f6769502a9513d791c3840bc9b0d12dcb1984981763b205db3b95471731d6b2b01616654c272d9a8be6b92c245c5b16f3525493faa098600135d995a231b3cb796472856de4ed8b5762e2b6b282a559b5938ab20a8b86a8df971919f26342852579794196b82073bb3c7aecd8d183d9640a889b86b03ef3643191c2415d92cfed3325c53789c22bfb275ecca605513a13289cb3c886d039767cd9d5e801824ae54d9e90c9f0e8925a8e567e4c9c709ce8f0828e41e71ca340dca409271db664f871d95a129161c2845b2b94bd7a6839c83c0f93252047f45d96de4b861152c26ffd4989cd66075d26e115cd41dbb860fb9a4542f2ff5776a1a6429547b05bac3a6e781dcfd5c4087fb46ff138b1bd6e60528464d2c993922d6a4284a347bd905973da4fd048f11d6d3284d48316b3d0304aca0c4c84c055858c6aa9b5bce504e3de9694ced28a270d133076efcd2caaa5f5bb134aa5a283344e5c30c6af930124080a2a95144f23657708800d25bf68ecb3a47d19c4079ddda880204a7cd1752c97851599d38a58d28be5b27fcd2d63eef997f022a14335cb5ef0309629d945172643b55b06edd8e2c347105da073e59dcf6c5ff34e71357ae838691e375c70638c1bee638d3370bcb320005428c9852e1e4abee7971994e0e22cae98a7fbe995cb5283925b9c744cbbf8b196734794125bd49947c5dd65f174f85c528bdd64d22232deb4f0ffb4a0bcca338b6347bcd4a1597d352f0b745fbe58e9e3fb625097c482115a16395e993a320e8b4cd4ecfaa4999ec9aff0553b98b2d151e4feaed83ec8ab96b456d4b494b402f59a173ed58d066995b0a298d1212ac25c967653b28a738a85d2a9d57b1e4e41892a5c3d71cda4b1e97f32a32415c9ffec54c23b97957a52828afddabe348aec98c45f728a3eb7b0579bdf93c692293217b3a4414bbe9eef36414929ce122da70fb19da123c5f1437992ff339e4da330bb837e5f28bda7933f4471a96c58eb8c71a5f3a160bf3ee49cb67d331714cf7d8d87532db894412d28f9847f32e72cd9f6bc158a8ba834b1c3f1581c0e8643a140180000841a1c2b086311083040482011c7c321b95095ea011400025048285a4e2e20261a0a4943b140180a0703a170300c06c330149283200ce4589a990bffc3b57a993ff31cd98fafdc9ac42dfbb6fdb814ba3848ecce808c6da96554e19f767206c73ff0d9be6a9f2f20472b48a9245b006691f77af5affb99c6666c86b1e576a523c99ddcf0c676814198479a3aa2f43562ea7f9151ef62083db6b5e36db6796a6a142fe5a435b757e2f7e934bb347b556cf170f4ebe287f8a6330eb24e78c6aeb1b6b7c3665b333f7b489cfb9daf4251205939c6f57442da87421b2ab0ad53b2af0585926ccd6855a7c3346348ba13f6c965a5295255f55ef550c2b2a74de12dd8b6a41a997f679e5bada325d108a5252acdac62ebaf437dd0a73576a2359e878b117e5bd7b0e5808f5818884ec22e7d686085eafebbd5339652a6004a54633809fc7e385ec28fdc76187eb0291372fef4297a2d459b5f1d8380a5f17a3913949927f1cf38fdca78229b98061503227a17cbdc10c6a297fe6b0b1a70655e520be2bb1b847dbd25e2f9fe4cc0a662334f6d0c615904922fec697fb5a63cdc3c85e2cc50cffc325a33e024f33cd8db0edcc83860399bf8a75aceaf30adbd0c50855a28a3025f140139e9ba2fbc287c9abadc5011e2877b05c0e598f2c367d6ed1f2ed1b4e7e5d286e8f47505ddf90f08840ae150b18ceb7a09e2236f45e8c77775c5a926dd33b08f3a229f68c45e028df016123c808e8344a668049055a1e90264f77b7b40bb9c2d91cfb2994422a9b442ec2041c92643352b460f8f19dbb8eeccc1225c91db8d76104837fff7009356e4d4d7634fb335af4f061db381ea255dbd9a4c760ab88752e1becf866b220c5711b96450a7149acae9a9413ba801ce78898f95e3b2b918e60d2fbf0593c10cdec7fb407371a4cc94ba8926b318452c6c4745a08783b1b55302a4d5ed1c35f08062e1b15428ba1ff96e3cf5f9c84eea297efde27039dbcd60030c9c9750d9920c17b20d9d36b1e6ffc5b7d36b70cad57a72f4dacaee501d77e4345b4da952f5658bd6483482429d0df0e194344bf60bd78e5cad15fffb63451c2719530bcc1b9a32e368608a39d1cb2e8499ac20c4ea750f4690168c2d214033d92fb8aa81d6302d0cfa2383596fdc0974e7d771a31ab56ab735e89cb104ae10c6b2b369eb85d755020f24548e79069b677fd88c36d5b3bfc1801dbae97797fae6198054c037692559626a33013c4206212be112c55bb848a0a17f19897c9d01eec20b5678c8d4e7121510bef20d19dab145a53ce57596c57a984cec72b8db7d61335d2cea66a7e8b4cc188284040c57c3be14b67da14fc51e164a2a8e11262113a9aca6de4524ae6f53a7f54c256e3e5d85ec47709bfc93a5bf3fac98cafe0aa77bd1eacadd9e2a4ae200253dbee11a064ca1349e8fb5a7a48ef39248c93b502513423c2c3679f9d81716956f736f9d1e2dd2c47444e95926888a0909f47dccad0a99eb2d9223b78acd83e36841e65e21298202e8c9867048bba2f09061bf92735c64ecaddda516405a8f04d3a2edfc29a2954327aefe63b92bc7d291814d9636a074a1e7b532422063370ff17a057e75b1cc939a2a433abd7f7d51efc246b7646c3eaba81000a4c2a97cd1e028833bca3746de4be3ad893fdf67213eb852f56f48fc1ce91bcd7f57cf7f1e4542a438a4f71d0a9ca0d930c8b08e8e5bb9485186c6593b3787c0798f2bfd5e8e7e32dac819476c9e6156ebde457dc5e4b4b31e17ab69870a85245603d0fc9d1169dec8ef593de5bdd1bd8cf3a6f0d670941a13f35b86b2fd261e7a078ab50184ac300f05d7391c242ead83af6cc8c81912a864f6f66bbb3b4e3a2849397e351e4929b7ea83020d98f860468cb32523bcee323c942de67a49a083bbcb2f225c3a1d546cce0bf7ce2a37e58e0ef0c033806b59506474957b208237c27f338bef1b325ee75ac70a1fa66a63c39fcb3e7ebaf0d83b8b4a8a18ba68fbfe40e52ab79c086533ae5092535abcda1194d6726db93856400288a32fdc7ee64f238914cd30072b369a8b4121bb0c96664be8493a6b63db79e4e5a8648e446bcad2f0d953472c2c37b6ea2f661427129f857317a0e544de222e898f2e26d87d88996f5d51ad734305f5eba90eba6a27da3695b6979700c2335bcea7016325530f84d6e5a1db1061636c6a4092ba6658c1acc6669b90697bd7f1c65de25be2e85739074bf698a8c5d868855cd8cc5ee1516b0bf3cdadd6530a7ed7b2a8bba7c8c47aa7640cd052aaa5cdd718f7d0dbd17bb7060443ba5187e83389cc84027e198094d5b7d58b3217f5fb9dda5f332a25f40284c7567031380912be468480acd26d271e3645c4b3142cb3eedc5c79dc4ee26e317bc71415e4bfb765256d0b1a1d54ad5b5591a00e3e02e95be304d36270ce410f8b4ea1eb6008157b6e660b6d64e28276a730ef0ab64f75a8f5370f377b03c195ab8b4c3fa2961867694ad1f3d238a6bb6f555a9f5b63cac16ed3cbffd1e34c54759c244bfa5427ffd25ff513ecfa0922e5b90e7fe2bec370f9160f8816cdae71910dfd4b7b7e87e9925dd6093e96008569f5c233802640c5273bee1278be170104d666f6dc397613d88f2f3de9be5da73a67157e0323a81afeb256ea199673db7ebf80de01fb7706c835a754034c5985130fa97d3be5fad83782cf4925db8d80425ba4ca0b7a4efcb482dcd87e8b5f0c2b84e384f5d76297c9ec641118299cab61038c1ce56937a38b8aa12b036c83bae68b7ae6664c736b6f36807cd8111d35f969ccb2b722ab88f471618927797077b7fc1164e46a9db68c3a7ce1044b7dbbf0014a19d3f692f92e3dd8dd86cefb6dd858b2c4df38bcd9702208db1ee54e4881d445922bc49868beb505ec85d8ea852565d82fac08ac5795546d877c9e01b494670d8f1d115774b5f5c98d44a20b80060971a7620c997d1c651b2cd4579a11d4f3e7bdeb56a4c96cfb76a50aa2e92af41ca6b646790e429f748b213a96e80ee1b1a8e61f64fd205dbdf4a69f6d045b0d30f94ec7d156f34ef2ac736c8457a7a0b44e2f66b26a804ef61eaad93087f07c6b0f907429fd4ecd0d86bd31c3727319e90c9c31ad86bb0e968bf1f9e387e4e4ad755a667cd846f3bda51e3c97fa36dffa2df7b54317d93f11739e3ce211ab992d7d92f6d2ced56c7de0fbf7093be6a34909660ea719062c9676285825cd047db476877b31e567b74caae50f4e5c5756f0ef9847526d01da31ba2f3e55ab1f04f008cf3f66d56f7d055bed20ea1ac6daf7cae6163c867d9e09e9e07805d6eee15ef974447e2ef8d068e77f9195b20f9d05db68c602d51927059e0d42142a2a9f6c92c5b4fa9bd4be6a5d565458fd29a76e64f4bcc3d4f0ca211cda981114630361cf0824b25e362d2476c34f3ef7ab4275cedb8098f0e2136ea3ca939160c1e019250c2a6f946e2857f2ecbd4d2f5e77df1e6985d74c88ca6d7a6981c61176f423056146b8a4b763afe2507f2b31c1d50b59aff461796b025342edffbe8a72e09d7a29bd4fcc7c91f77c2ae9d198ab7fa20e729071788cc1cd6c0946a3c63d001e880ff2fcb4a21cc2e098ea2bd07fa276de54cd2512154fb425c38bd7ce1c41a92786db0601ac553ffbc7b9c9a37ed60d9254770f4026352dd706f95ed03365e404b6746f0c2ee43279733cb1d227225a64de074426f94c77ab6c211923608387d54076e348bcd060d01cae88778a99a00213964e577357d4859395ec07f36b94433b0052d738ec4f1b9765ba2ed1bce0e8021bf4389abce161814f76b2a64e339f5d668d998f08c113db34c5d68be43c3bbb07e0430e41067104c5d7d315a0b6e2f406695e1e60551a5c0f40e0b3d71e4c12ec9cc33e5581c76696686fdab36c756cb336d0f6fe2269b9d28a82eb5cd5b9af76cf27dac9bf812505bf47762d704b8312c73e1121874c652538c00d113f0086494c757c2ceb11336930fac37b9d35425974d28d7c720e9f83d9bcde122b96cda0f6068a3768e300b7153d802f108bc841e0760dbdb76004da0156985704ca5a913395574f0140e55c3a6182b15948888a6259362ed0c868633fd572cc15f8523a85bdfe1feba063a0fd20a3df7a184740641815704b93e36ae459c29da372c084c872385f2a61797aba4b084c58bc9bd48ede72861215e262d300f036a50649b6edb86cfd15d181db29529c6d0c1eeaec06d80eca5e194989efe77d82460c63cf3941bd3a7b3a9e64b4216262e142abf8f6c933ac8658c26870c719eff1a0b1b35564cc42874eabc14e9875540e7c8fa43be3fb5014b6ea1af84b0c27f972ffc9d1d0517574927f528e0abfddf2e7628b3da9a37c9569e26515e99a08b278222ba9040d10ad5af7e00989329b1b809fec7fbf57d581054c52117f1e34dd44bc09820dbde973849f2d4147f62a4c38e9b4429ff519db622ce7335598b76802f568d60be8c14e4c8bbc4abf43a6929fa05d0f227452a900e212840782fc739d151dcccd266fbc2d53a7db840bd4ab4c904881c9d4a922c3ec8ca3e1e433bb1fbb52aea34cef134e9bf9907a63d8431ad5350491604c7d32fb1df51e5067ade2a9421fab425ae8df3e52d5c5f9ab076b7d3aa9de82c035415e6b80ec53e89f3f4524a17be4f7d7abab0112f0b6e5baa3cfa0aaca696757ba3bcda52049256e07727f05b72e4e6f280a7aa3a7230857c12252edcf5f5138f15fe7d7201b1947322540362be59ce372ab60088ee82178c06c3549621dba481eee12dee1ca820fddb531266bd867b366940ca9b9da4be1f5a0845d74871869db709e168f594f52e0de3fe6d181b73970c37686d52c612527eaae96f568485bebf423f8b66a2eb7d9c0067098c156bb9e744b7cdd8c6edb07cc35281ebce4bdfcd076b57c4792d2d608900ff3f5781e65bf4ef053756cdc2e108a3421672ac173e35977b79f29d0e3d32d3eee4ab0c6b23eff5914db59f098a588940cd5d2fe85a05ce113c0b14d3a5e7ba318ff734b1376cf22aa7fe49a4c52991c0249ff4c680505b5ba92e7a63b7a9a94a13caa284f590b07c13a419c274b2a6e8ffef0c5cc05c9beb950100ff427c618561bcb5c53d7669de9c05f8950a79eecc5001f14fb4658883279cbabcba38d80f69afbcdae55e011e0920794a9c29da6556bce233419c973baf674a823907a5a35069312e09a72ed5d87f8bfab67ba5ab89394dbb633c901af3b0263aa287663a75b1176b9143aea7c111b5ae252fd73c93f650aa5c4b8b5a9ca252e7079311e7e81f43d6f85290abcfbd2351e1ca3fcb51df45616c1a63c7e9eb8fc3279d8c5c5122e4588640f55f7598b19aa679d8a0a58d0da9fa7353fdd432c979be3a4424777ce7236220ca39675247b4184fd8b514c29e89bef620d0ddc56da71ce197ec84b8917b5436b0c7c32c89c89daf2f7ac946bba02a9c88371923dc4ca7948f3a2776ab495302568ebecd8f6bc368582d3571ca8afcb19f5a0d9b07ca0eab0f71712edbb9ba0a439951303385f467f69c02752436b2dd4318a75a0ffd82f865b07980bcca8faf0811e0e92f72a7eda2e3cbbad87b1da47a03590292dd70ddccad32cd87daa25eecf2c50613143c234b93eb6e644614f350d113a511ad0eab9ac6840cd9766ae13659b12e0d11c3cf30cd300625acacef078abee7560e1e205613f9863e06f3f4fbcc0f6015234ee8972c5ab07129269c9433243f74d0ffb4f66fc8918020e5a9535d41ad40f416bfb535d15519f0faa301f8c879b19d3eea9667bd05e09ab484b461eea9126bb5cd29b1e3bf45bbaed0632bc15638803c9c939d551d60fd36232382842b5019fc50d01b498cbb17bdf1a7e7e57a58d804f9e31bab6b647b38c0c33f4858c15f90105f7dd4c77b481d1111a529115a6beb1b378393ca86d07b4ff5ad94f95ec2c58aeadee1d05c0bf45d1ba9fd51566cf343b03c4db380a9422e592235d2c812a46591cb5928d18c629d675410d730c605b967f0b8699c96dc3dcde2583f6265ecc41a83788923ddeb381e8ce3dcc10fea1b9852e483d38a9a2c8a910e2a90e9660a167656a67e74d1d8e0833abfcdb1aa4dcd3bafe309cd9482f41f7b8741491ac00ddd0cea81f2c7bf0f0c2383302744f0972bfc7150416346fea841bb8464171700079a39e882a41870922dfb0d9740bd5e2abb8ddd37db07184e5f8ca1cb7d221dddcb2d58f3918dccafa4486f6b80778817b4e417843f5f4263c39c2f82e10abdbc16489751c81408914d03431534a6255c0474489649fb92f8dd11dbb2e8309c2957247bd173288f3d1f9130b3bbb46764c5359f275fb9c4fc72e0d21de8264299dff68808232b518364924169ad3d6dff6858652e0afd2624ed666616f0c67f147c6681e366085dce20f4b0d321f3565d2741a1b2f863d23dc98aac00d76de4f64419dd056186465f2deb1026a7e099250f5305cd89b14e29e23ecb963b0a565c6878f7f4033028792df0dbdfca2e2e0813a085e502582fba041129f64e2eb9ab5b8a985200e62c816927e16e734871c7c5dc4e05d32071fe1f71045d2b3e020f37c8cd115a02d97fb935cc22b4bde67d97e87be8b4be6995896a5c22aa181678c0c88bd8c489c95661e9aba584b7fb08773431c835063d85c2f54220836f45a6d99eed4d8c35e32ce3a402e7eefc94919ddcb72833b880987c22bea56d7bb8f433416b04e0fb2e30bfe1d918628a5b814e12d77a044f72818e2b9594776775d980512f1ae9c0c84da58c42d966a2f1a766903a7205b5cc2e08c93f39cf5e64d8ac21ebbcab185e9c4e0c985622de786d0fa06d143b0cd7899b3197f98f1dc3c9892aa1b7084ead457983765b2715eaff3b3a977195e77f0a069153fef03850b2f66cea99ccce644661f070d04e8e79f838523be176abda3cd97fac26bfe94fb3bae9fe8f9e57b77fb7249c991e6b64ffaf523a1f9745bbb3ebbd21cd9e5387757f0191163457506c5c61e7eedd1ef695b3bb9b814f7aa9a3a55fe5169b5ae1dd3c95db5a10522b16a980fa6407bceffb1210933a7ea0e70490f1f4117b7508f24241427dd6c9864be0cad8e8bce5c38cb41069d100892647af4b9f2aa5fc39d4190e0f1d41815e4d8c4ab681e5df9a902db7f792ad9a4ac8e42dab79afc57724ea59cb2c30176019a456f9f75006b4e34c85a8e9304fe15fc7e5933bbc4f9decc83d856128b5c187a7c6d2d0dbeb64630c904fe8be77d02f96f7e6d588205ef2d2e489c67bca32182bbfb7c5c7488c763eb0eaa7d7514bc8b35305877c26e45cfd833c2d5c0374643a158dd07110382cf7705a036c546027897d48cc54e721769dcd1608122af1b3e6b197485dab99a3a29e1aaae8f88e2d8eb823cbbf694bd554f73e221aa7d2eb082ecb81f939df81e257d0ee2ea47d39d11a0235645538d3c4bb292aa394305d7e8b70a957337a44fbc15e28f7df2915e3831f502cf9c1b239abfcbe6d1a780519bc991da08d38c6ad922530ccb2b326f104b3d3646e8650fd1b82ed53f9c7a607a3f63777337b67165b806a9ebaa8105c3b4a28ab283eb43af591cbc9bbf6bb53e6d6c5a87cae034773c4005ff32a21a2d761df09864e94bd8905779e0a8812d6a4c3bda92f5da51459e2a36e1580b93e2e13c1cb94ed61b2871bc4bbd49912b9926ea50bab4d2c2bd3942bea34d831270cdef2298141f8011aa2d069d8a339f9482188394e2ea2445b2211a88156b48b81c89f8dcd24ff2657eeb5aa9c0b7ed07cfe51b2354eaba8a388912e8dd948e47fb8c75510805895cd62aaa4f740d363ef9f90e1d64fe2dc2b0119c19d5245daa0d3e27b4ad15f846bcedf4822be333afb0c2725a7d265ed482ac684f80ea9b0cd8bdbc0156885d421f98d0e72ff6bf225b6d44e186c0440311b49e2b716e5863241cad07f350b3d82736ae840f18c53ef028ba92a607f6e10588688044122f5343208c5a4191d23ad74e24502d7acdba25afcd590fe084b6062b0a6ee516a47bf6f1b7c6fbc3a49f85dc72426bf0aa4d2ae02c7fae140b07213818ba4c968800596ae42d5081e9810fffe4d8498f8a06dc9fcddffd0c564b38650ad12ed4672e01d0cba89c5637209d488f11d715ce6dc9bf1db149aeb4911e530961e0b35496685aec8a1a240e6b4ed688bf896e44267e153434a38f1dafd027c004dc7ade428961307f7b250ba732cffa97b3c0eab627f84c52e3a6fe6e9e6a94cebec2b4196286a1a8c65ecd2cf09792c12dbee1df27988ae58cddcae614dc0fc11b6e542e91baafabaca096e6d916f258ca551bfbaa799951a1dbed5ec63eed007484cf8258d5836663ccab63c54c1396cd71197875577af1d0ec18c17e159e56f37796e6d1a605c38e16cac627add8a6fd017d4bdbc61d9d8145c6a1fb5d1dcc5e44e8f641b571667ee02079ae4b8d67acd458b6623743e47d4cffa4d406a00f9029aa09bcc227df0784f94358509e8d5da74bd02d4126204f8fc822b416254fee051874a2fac3f119f927cca7a50fe22f8ebf7ff26d45e61acae3b767fe7f72a51e8b96f90f9d4b55fd36d261c66fd718bc97ebfee9900aa566d4f8f3bbfb7b127517b52c2785e9c1b2a2898254967012c6e761908ceefa93d506c9ccbf4a3763296e4c9be8b4e806f66580c4fc13750a73f1cc8edb376840fee0059c85cd972d7b7e2e85c43e30a21ee1179bb3a452d4ba224cc52f5a5c2536277e914e08ae99304ee62fa8f2ff090f5913ffb69c53158a7504015840ef7d03847ebc4737876a52681f41935cdc0cc397a6eddb3a4a48f2a0c89a5139a357befbe76b6584705a9400eefe4cf0fe44b4d63337343e35a637d044140dfbcabf0930ee7a54b0522135b28db189f63daefd1d0949b9dce4007217b76360b1c88be3ae16e3b58a88cff289e3e05deb6b7e7c1f5dce6f9c0f65588ccbdd2fde82520116b987e1386434b42c545657cebbf9fed76f2664dd2b15b3a56625d05729e689c673fc34504689156e0817c3f2da0a05b28d974d56e3330155b880cd85e29324b91ac5f2d09d626a872c938801547f1b0bbb0b26fade8ac1c22e72d2cfd9d605a05e7823d0367dcefef4eb215af21b91d60ee23d0e6e8b6a5e5b8d9d4d6245fe364bce4b08995a1f203e96b793242890700691cc6b8285e047ce641c935d274ef22f0e26a713b94a4b773cf2f060df23ef52e622c41c29773c9f98f2835068542d8a49c589bc26ed43c7763b5309b35d1b7b437a5279bfb2a82d8a94285f7a1e948c954c0049ae26ce41d87b2e5b45e896c186ee29f592b3b5559230d79ae043d9d0c9d69447c31ccd1e14571e3a909c0240403065cc685620065cb5b9a870d56fb59936e20bfb5222143e1e7ee55df3f2a4b03fae5dcdb72802dcfee8e142896b522dcd3555aa5339c6c78e626e36039294285b24cad9abb26499558c6db6574187fcb91c396422361d9701616f6096a82ec3e95cb2929e45713a0e33f70d367112f114887e107a94b70917c527408b3a807a11f643f5e1c8abbcbb5b65ad44cab12bb07ebe936fd0450171c6d9f2c03d6eadfdae07e15754a577a05a5701e9ecc389bf8763bbe12583191cc541190b9e06f8ccffd931a1caa03a83a2bae636162f257e937a529f4eb32b8a2234c539b0acd5e9935eebd2a36325d8fd0288696f58b49a47637a75bc6c1074f71992894547ee2d0fc0763ba4173d01959d590672d61d29b44063fc93e4d2090d552618469b199c345e1958f0b7a645e967d3a23f4e06955ebb036c88db3e89eaf8ac64a959bdb6887efc717aa1060a88a1db3b9c2937d260d5ecd2149eed8b2dd5dee5cbae09b22752bf65556c80559e13ab2388675d98cf7d46bc00ec418f0e466c53418ec84c138609a8dce328d90d363fa5839c2384d5f6961e22dd8d6251b6dedfdcd0b96aa3821485f881c62c155c63e85ee93a3489647ad67f782792db902a2feffc8f8d1762a920a90fd1f07039f2a902374c1bffd9095f5bea2c9b8a8219ac648b38dd2b30fbc7b4c6a8c15a035fefa5e3df555a1cf27fbf1698ef0a6da95bd755753457fe66ed9f7683c11de51b23d20c848aed6af4ccf90f384dda1ade84e2c496172767fe332663ce611157a72da89082cef5bdcf1943540475c5535c3dc42818aa5f48c0c2139d10c04b40bff0b473329bfba7342d063e6a8fe83a8ed5c0828101c0bc04e5c5bfde334337e0df83f42b970617f07fc68b00c10ead2da7898ff2a9595cee7bfa2165e6544b45abb23893a08de530f0657a5a4e81ddfe036d0acad2666934dfdc4b308166483a364a8db4c1160650ce8ab45528e82ce467d91c2bea35cca6520a2a0a1db0c6449f19c426db57e5c05ec086becae23f26910a757babafe947b414d2dd4cd464c9ff69417debe0065748d40513524c19d285ec938573000aa1d69c6bc5cb539af27c32fcef901507d6d60b262471ee2128dcd9872b42e533447021c808dd4d80cd601532065c02b4d9b92fc7c79da05497101650367e008bc3037f10250135d671d8ab62ffeb7cb0eb2205bb75ac13fcb71890379632cd7b36eef79c3a70295e8cad39c1245d12ea4a17bd5e0e904d0470057ff444480b6b471c2b6aee48ef164f184879ca72e3a35f67605c0bf9630890c017b0f98f64c8fafa7d90e4130ed9c3428014835311635cac832e5b5f64762e7382ed3e36bcb4721282e8544b9b2ebc052dd3024750c51dcc770805d6e364dbbcda8545305c6614a46874516e82831150c659092e70522e7291b7d2fdf63608da4409d379001b71e9eb2bd352e25f25d7b0c3a724c1cca1aa0da5bcc805f59c5b976cdd7300406b0a59b6db269b02a112773a7544650477d263c408f6e5b4a0c5aa765c333cb6826703100887730c98817d1efc416c0c7ff7568a454c9aae6fb29b19c6f016427ad91c1b9622d7a01fb4e9145e755402", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x10bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e448e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429": "0x0600", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x10bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e448e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x2681a28014e7d3a5bfb32a003b3571f53c408acbc28d351d6bf58f5028c4ef14", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000200000000000000000", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb344ef720e922171bf66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72": "0x66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb36a40a4449df44e82ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44": "0xba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3cc4c0361970e2d8f8e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b": "0x8e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d3b55b38df340fd3bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c": "0xbc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500b722a076567704e6175726180bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c": "0xbc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507c60662796eff8f86175726180ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44": "0xba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195089101742e48d530361757261808e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b": "0x8e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508f860e10548e5518617572618066be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72": "0x66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x10bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e448e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x10bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937cbc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba7266be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e448e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b8e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x02000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/shell-head-data b/cumulus/parachains/chain-specs/shell-head-data deleted file mode 100644 index 032a8c73e939..000000000000 --- a/cumulus/parachains/chain-specs/shell-head-data +++ /dev/null @@ -1 +0,0 @@ -0x000000000000000000000000000000000000000000000000000000000000000000c1ef26b567de07159e4ecd415fbbb0340c56a09c4d72c82516d0f3bc2b782c8003170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c11131400 \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/shell.json b/cumulus/parachains/chain-specs/shell.json deleted file mode 100644 index a02734316d32..000000000000 --- a/cumulus/parachains/chain-specs/shell.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "Shell", - "id": "shell", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.65.116.156/tcp/30334/p2p/12D3KooWMdwvej593sntpXcxpUaFcsjc1EpCr5CL1JMoKmEhgj1N", - "/ip4/34.65.105.127/tcp/30334/p2p/12D3KooWRywSWa2sQpcRuLhSeNSEs6bepLGgcdxFg8P7jtXRuiYf", - "/ip4/34.65.142.204/tcp/30334/p2p/12D3KooWDGnPd5PzgvcbSwXsCBN3kb1dWbu58sy6R7h4fJGnZtq5", - "/ip4/34.65.32.100/tcp/30334/p2p/12D3KooWSzHX7A3t6BwUQrq8R9ZVWLrfyYgkYLfpKMcRs14oFSgc" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": null, - "relay_chain": "polkadot", - "para_id": 1000, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xe8030000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x08147368656c6c", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058449e04ae95c504114c108066940e98db59ddf6af6efb57b7dde0b64469d187d03f0c9208338b0a9eb6f31f3d0dab728101fedf5603adc13d96d400acfcf610cbaa56a582dd86ca95fddffd6def4db6dc52ca94520a3b115310ff106bf4ed568cbaeacc358aede3df1a119009a9ebcf35e2d7a3228081c842f12de71abdbaa558cb26ed8b1e4708e99b4ff5c2375fd2f34d0ec57cfbd42f3fd5d97f5aa37e47cd7ed70809d6d09020c290c54f265f38c2ab0be9118597d725020bb23c10d6c13fb7f4884c8fa6e0f2cf298c88f5f3032ea882fcf98122e8e0495e70f043fae5cb1e607e1299610c252b7e1255b1c232c34fa21498e115066390603046942db480072de0c1b39330226be59f572cd8f2e5cb6b10269b007d9542fc7cf21222f843fae59b5318103d628114fe79931f283d51e9f9a75d5c15bce0350e599606d1a329c8f0cd3736e7f89cb121edeb96bb140b32b45fa273c6829cfff4c6a947537879760a23c23bf8e70f13c2fe56aaf2ec747295679dbdc5c9bfde04beba1e4db182576c487ff9f2ea456f9f1762e0c5dff89df20e8b6fb74194bf31b4cf6e71746e291684a5f3c586ac37395579a61ec5008cc780708bfa2ecea26fde116788c342c80199fb2c9bcc686ffec3968b43fae5cb97f5c688dcf8f56db1c98c2f80d87876587c47227e1bcf6ef1a5584721f676c680b09344d62b9ba61e51a1e589f85b4ef626fbed7de33bde788efa1b89ac572f72cb62581ca47e14d3de2e8daa8777b15d2e3e89a209e751c43c5174b9f82453acf90f6b9cea384248af7228e69b0ce53c117f93549cb7ab17bee72d97077f9746adc3bbf8a4270a232df8f2e5cb1720e7967bbadceec10ced97a702c5819cb3bae506f37c352a18ff62f39fb65ae4576fb1df0a5a40a6fec34f54cb154ca86fc2df8125fb46640ac6ab7754309ebfaf8efa86b7dc2587b79a9bb6b6ef06cc04418bfc1d950eaf1810ffc31cf78bd6c91675372bd6be15c380acbd415920f692b6d8715d310664eb21b082648d4d99a54264cd8378e5e2082578d7311959c20b07443d31deede0d3a4bc72e7a62ae2086946ed3be3875ec57d1d3e4128974076a2f7eb166cff61783dfb7ad9b7bb95eb12a2f7eccf15233274837de3642095cf7daee4bc74f8e45cb10428cb49b9bea85f5191e14501234268408dc378e709e0d3341d41013ecdd20f9fa66631824ffcce7ba878e744b04f03e9174db37ccdcf9ec7a1bc9ddba558107406c25e79c380ecb353d16a18037eb8abc818907576c682d8dde2d8bc00f6f5f5c586f4108c9243d639874f943bb7a8a85fe293f3acc67d894f7a7402162874e796553915a1577152fe288771163d152957cc882227505464a37f51685d5f31210cc52f9fb8bdbcfe50e41666b184406fb7ba1d6c87edf6a98eb323e51052de9473a7ffc3941482eeacc52cab2f224e5e6e294651de0dd961905b1b71dad7db39e2b4b3536e2d96809f57dd31295f5f8c083be50d849d72c5822877d0895ee5d65eaef225edcf61f4f29e5771ee3f77feded07e79e85647a2f7ed2f4e76de73bfa154ddd1fec38a0171de4fcea27f4ec5d92e049d72ab31204b2e5f42f4def22543eac5c8e88966be72a2eb496e5d975fd77579f94a95a7fd8a73bfafe8dc524cc872f9ca2d521c32c0aff240ef38f9a13b270571de3eb45fbe72c51450f49554ddc11810e750b6ff34f55cb4dad917c87e7bcb480bad686f1378d1dc6ab1a41863ba32d97a49bb302ada858025a472e894abf3450a42f2ca7f9814f515aa52b1c5b88709a99c1449bece0ee3dc87be1810e815ccc961d3c6c626dd1fde5db762f62dc58274653236e5b0491b164492b3e849fed316293aafaad8647fee3b27c526fbce2dd665caa92a3aab97bb6186fa7180f4438772bf8a2b8528af9c14f59dab8ffd175d79d41b9f7a5ad0107ce74328afe415a36c9a39afdebcbdc426e8ea2420fb904d0a23ce73edc2c8e883788b8a9372e896a5582567d1574e8a739fe430ce206bf4437bf4aa3c2487fed3a4b85e45f61f86d70e352acee64f0eed3b59f4f645611555898296216c59c31e62500620c52ce5129bd63336ad13914ddfebd7b7c7afaf17c127f7ebce27c5d245caafebb0cf022d11beae3a2b85f4a8d93b2220136a07e2e7af5bee52f5317bde1529a07a67b9e6b3e574f2edb33242cff04e5269ee1a9bbb280121bc80e50b907ac7f9c4f77c9ea4a88aa77c3a79e7aa3f5485987a2445099e689f924a348c1fea2f5ffe492a4fa83b29c2c20b509346f3897772b6cfead97fba23106fedd5a2ba6216d02b44015220be9d6c11376bc1b2f42aea1ad813285ef43376656f47cf0eaf8c08eb275b571680ba5a961220d3a328bc703eb1b39bf8c4cc5164f1dc40cccc4c58eb1b3d094b5f7566f6ecd6aecfeb797723ffd13779185f904f731faafa589f3dd97e076909db635ebec94c8cd5d7c67eacc9bbb87c930b467d2c59a31f32c0afb32b46a4192d262433faf58b4ffa6cf4ab9abdfe50d4cb70b0f4954f939d7d7d36b75aecc9d89bab2b46845da84965534bf9c345bc10b0940059f31e3e4dd8834f3333f169f6bc73e744f0a9bdf3129f144b1c8ede790efb309073e553ff2ce21dbbf31a3eb53b777ef169ddb9ea3829a4474e2c2540e67c9acdc4a7e9dfdeaec327fe3e7a62e5db2ff661a01dcf3f73be5d779358ce5567f67cbbe5e2beb5978bfad6628d4dce357feed8029a53fec396c5eaeae284ef5ce374578bd01563398b9e7565544ee7cd7f9a237417f5b7c50c3a773596d59762413a6c6a5ff7b891a38bd3dfb9d5578b952b06e52c7ae83fdc98aecc84269693a85fd9e49ce4253e356fcf69bb72ae937cafec9d677cda8dca266593e58b05d96f6cb2e4b49ce41bf5ad48d4cf6e2deb368c8bfa5c7ae7b07da67020e59dd9deb92acfcc79e7ed3f0d63e5a498c509ff3963aa32179bd61b9b9eab2f1654499c21944387d7b3532f2a16e42464137b566a51df61fb342323232323a07693fa689d6fef79fda1a85ae785a53e991e4141c6eb11145d78bc1e4191c55bba23d353a64750a8e0f5f5d91b1340760445153fdbb3c37508b57d947766f6eb33fb095f9dbdf1c9b9ab433ee9ab5b8d0535394446b98b945b7b51fec38c1951f4945b8b09794ec9f9fcb9c558d090987ffec32deebba8cf5850736b2f2a3e574cd9346b7e2dc59c9c4ebc732a4ef894bf389f2b9b28ffe917f5a938db8bfa8a3949d4cfa675d5e1b7ccc5a26193a9ebb3944fed13beba6ed46f7c6257b73aea73dcb7b8e37ee3d3babac557c7758b47d65ee38d91356f675f2c88afc5580e91ad5b0d0b5a5facc9c62676cb5d8bad2bd652d9c4fec3d65e1bf71563807e47fd22defd81a500c8ac18d599fecea7c6a676754b77648b05ad2b16645fd9d4fec31b954d137e7b0032f6762be393b249bdbd864febedcaa7fd097f66df6eed95f149bf5db1f51ffe618e3843e0b3c367893384bd397b9344fb2b954db3bdba6242d6594ef6f51fe6dd24584a808cbd5df9344bdfde5ee2937a7b0e9fd6db1bfb2c507bc627e5c2065cbe5df9a43f6bbe5d755a0af9eb0f45bb412c1522d323232e2ff3ca05942baf3296ea8b2293af58d410c553af58d250c6efab8da5a64c9db5ae7c9aea2b954deaea45bb332c3d329af24a59ca93a9b3742753f7b400e40553484f0e2f0e0f0caf0c4f0a2f0c4f0c8f0c8f0bef8bc7c5cbc2d3c20be361e169795b7867785f7860bc313c2abc2a3c2f1e973785f78497e5e9e04d7956bc123c285e94d782c782b782a7829782878207e59de0b9e0e1e0dde055f16cf06af068f0a4bc193c19bc183c2a1e0cde0b1c196e0e4e0e2e0eae8b0ba36de0d4e0b83838bca3ae82c570657066e829382f4d856687ae8223833b432ba3e9a1e5c119c1a5c0cdc0c9c061e170e09ce09ae098e08ee092e096e0b47057381ab81c3818b81fb42f4e076e05ae8a1b82abc201c149712570460e8ab60747859be25ce0b0b820b83b70154f8b77e525c19dc041816fd070683d683c7839705f7062682374111a8bb6d244e821b410d6047c85f6c25f3412d80aec054b81a7c050e02a70172be5c161cbb057582fb60a4b857542103adc97a5410420c001258a68200318b840050e70c4c7007a00bd2d1e1326400197078787d784352a7242822746208210380182261f2062b264a8092694782089d044f2a83c1f382dab048706c7056705e785ab4283d25cb059dc145c96b68246458bb25e78667026682960373430da96e685b78366a5a1a0c160a5d05ed088d058e0be7065383db83d74165a0c0d466fa1a1d05a68366c150d0637468761dde0a27052b827ac065e037771547058705758315c1d96097bb45dec11d60adb83a6413b01a381c3d81b6c171606cb86b685a6a55da159a179c158ec969dc24661b95828ec1316cb6ab149d8256c1b56080b84dd01a761b56c95cdc152591f2c0ff68ad5c16a61bfb0536c0956066b83adc1a260a378c010053c23210e28c2009cc5dad76d68a8b88f30416203459a40e2c812458a58db4a283952a40849f748920d2041a4e4031c284294c4912548945082a448911b07d332502638a0044991248a30c10125429430818408892449983800511247922461e20041740c8890587244c9910ec4a6429984e088501126458e28c14412479428c224044786286102091326471e70a35fa02040d2c42f3922b48489091089ad023d42848412489220d1a4c8910f1cf9400320a0c4910e7400090804d129502642491c592289964299102939b2e4c8124a90781b2941c2011cce832681848912244b889c38522404499a680289224b8e289104c907808492602209500edf413d5004092224944082e8c80264d80e2240920409244448942099c17250a1249848b2812247883e90c411278ecc301c74091307b8645a0c8a8b2b5bbc16597a6464f45bd4378fa7c053d826966aaaaa3a76765cb75de675ccddda39d78dd9355e755ba3b9c66b6d6b40d7dac2d71cc2ca44ea6632c176bb37cc6d9d73cbed9cd3e61cb3e55ceb1acc4d5114e51ac31aae063b08bbc1aa2184eb1aa9c11a4e9d53e8b4e1ba57c335e6edd61a1031ba95bb6e3b07371cadadd3f961d9ad5bc7bc8dd7ed2e4376ce396eae313be79a73ee6a55b5cbcddd5c63d7ad21ec6ecdb5065d7bf2b9768dd755ce6d7330ec5c734ea606e59c73d0ed6e3bc7aebb39e75a43ede61a352ad78ed9f1cdcd8dbb71cdb9beb9b971cceea6dbb91bbee11b66e76e9ccc0db36ce8fa4976ea5e2bb783ad9dd3d6ae356ce7dc3676ce717371bb3599d69c6539c78e1d376edc1c376e8d5d73ccce3576ceb9d6989949ce39b7aead6bcd39e77897dd4d63c76e97ddf23a6eccdc1caf73cd35e798991db773bcccbb8e1b6407e1766b8eb9b5b6636eae612355b09fc31a356ab4d620bb6dfddaed6ebba1baabbb3674b7edeebed696a276176aab6c5ccc3eac73eb761536754cb5d66ad4a84151356a3c2dbc2f8088b9c9a9219404121b489284091d383568d8a07183d5204a0209264a90584254840889073cc084a946c2e03039d20125482c91845472a4892690c8f1001222251f5822613840f4011f8e2c5184480992254d14498209120fe4501eb0c1478e2ce14091254c10219104134992209143c4c907acc7100128e204132020b2d1012548966082c4125e83680912444c80186209931f6e7488234c981c59d284079848a2c892234d9848e2c892224830512289234502207412c0104d247184898fcc12491021b181224b3041a20409074a1c40b2e44893220308800004308412478a3041d444089624f1038f2448847a6c80a0314309248e2c3185e088501122278e28d951d301206834004c88982071e2888e191dc209241c38b2a4899e98231d40620913444c8a289104c9124914214af20124387044891d9924479a1c4952c409243c7023eb0013498a744009920e748089243731479838cc12248e2449a2881347945082a4881224482c91040738c0441122278ec8264a8e34a60128a28409244c961c695284880926961451e2c892234a2c61a2c84900431419e2881012493650e40892254445889c38a2a38992232da31c82254c78e088075e1325477a0793c2eac489132745ce4911171539235ae4c44951512b6a468ad6c916151515751134a24545da46548d3871e2c4899366c449d13a71c2469cac13274eda48d1aa1175e2a4a88da813276c449dac91a275b2469c6cd11a71b24e8ab8883252b445ce48d116ad112d7a46b4a8888da81615151535235ab46ca4688b8a8ada48104cc5aaea7a8009121a2e45e634339ec9f88c9ca20424858c1457907cc6657cc6336fee3d7c82debc08f6d929ba3375bef9d53e0aa493882a5d58f1e29b2bef952fbef9ae20db572c5628e3e74ef9e633517ba75d2666517b27266aefc044ed1d2c7aefb493a25232199b2e277947a5642e925436919c47d6d625a36cbaa4b289e44057acf00987e4ed243de281976f6f5ff846464ff2c582487288acbd622d81ae586193be0e9175f7c238a18aaab6e942599bab363961cb99bd02b19c259aecc915eb2670a02bd88b78972c91edef12b8ed0ab2f61acedb97f0b3e9c7f34951ec3fbc649f88d7c7fa6c0ff5d43e9bb76fce42cd1b9bb8c9d9228c2ac8f67581843423a3c684ac91d1b733260452de24cc1a0cd715043090b187261481065528e37a40141518210e586c610578b0bcb0f8d5b57d8a7090072b6ab0050da290c31740a49fd9b6c0d22332c502041e3cf4cb9f966f57f551a90fe80ae37e17cf4e61014216df764ac6ed98cf9e87f149448ccf1e5cc4537ef934bde573c7b74f366a30dede660ed658e972dcf6e8671f7d674f92d743b71c143e350fe23fe3d0954f323edbc326e78cbc641e06f79b0cc53cc9b32c368771ba2851aaa892c591175bc2f0e2ca8042c514215c795d5858dc7750f814e3ed0f1be29eb0a93d46ce1a36b5c34807854ded30ee3b2c6353fb5a914d67f4ed333b220a36027afec358d427a910f3f2750a23e2e42f38841dcac97f79c3a03b287cbabcbd61500e61bfe42461436228df8611b1e4d03ec97fd8e2b7ca0de6c973e74f8a54a038d073cb455ebe5c5ca0179fb01190091ce80ae816d52e8a9a0f4212e9a22297e061ec2f5f3e8aa7e47402c543b7ae0b4621e85fbe2afa4939143e5144d867d153ff54e4775810033c94430678e81616448fbe32fa6a8fbe92437bf4d01d047250f8b4df4ec57d20c5b8819c917be2a03c2daf3f145d4eb888dbf2c10e7616efb6206bce25e7cdfb8e7b78d79939333232820248d95b182c054016447f9d075b5673238a18b07fa9dc1664edeaebbd3a4bded4f737eef76046147d8f572f4283560e91ed2bf6ee90f92f63a1bd7c734bf9f49e663c32cad5f43c328ab9c1a8f2501e44253ea73c73cb6141991c227b71bf31238afe492a501c28bac557e6835b3f6cf910f7ad6eddba45f5f1fa297f3b05e5696ef1e543d4b76c6cbce4945b950d6563e3038e5b7d598d01b9e1cf2dcb5d5cc31b46a41b23527373035e54d47f35eec309b27c3b8e5b7aaa22458164ca0514284f73956e56298a4746e38a05cd70561fcd5b4f9437d7fdd1595688e6357c9666f6975faeead3557aa7f9e53458107f1ade55da67b37496fdd15eac10cd1be635e42cddc89939afa9223b4bfbb4969b1a8ee398b796f6f9c19bb717fbe3798de3b496e835e4cc7eb69698b7f19bd6f2cd7f8894eed838155b4d361ea3eaceb4791baf89aa3cf3c6dbb8f2dbb417aa42d8f866d91fea433f0bac483a6ad2130da77c879e6828e53834dc2687460dcc88a2a7e18a01f1a7e17bd5d0701b0f2af90f6771daf0cc67e29cd9b711f7df73abc6860d973ed8b081831951f4365cd288356e131b9b6afcd988739f86cfc080d4d4c0d4c849c333b7f11fb6665c8a01a10183d1701bb7a1c165f029c79bb7119f70bc793f81f1cde28596175b0a9b9acbd855b0a9b98dd8534a578c4fa29bc081a2bc02c73dc729b76ce0e0386644d1e3780c1694e35676311684bf24935c8f33b49f7993f6cf8762fe49d9643f73c580646ef90f635ea3864f37de7cbfe053c99bef163ed978f305834f34bcd9f0192c888d1b6eddf0c582e00cedbb37693e780dc719dacff126ed87d6cbe3f850cce348559e89e3ec1846a4c67d904df65dcee7377e6144da716493fd1c399f673724ce101b8ee338522873cb6d48a11b27daaff11fd6b76af0ea4c0d07f3de87a89f133b0a9b9ae3c4a6824dadcac7bcb85eb0a9798db85ad8d4bc26ee176c6a7e13770b9b9a97e282c1a6e63671b9b0a9398db861c8c4b92fe3331890fdcda23ccd174a666253731a9f1175d8d4dca2713d9f37994f191fed9d1a9fd553aeea2388be8c53beeab3597aa739e535b0a0cdd2bc464e98c999cdcd42237d4f90355f9f9e05f531b45e9648fbcbc227f6e6eb059fb4a80f1dd2fe669aeccff84fcf447d99a89f45fd98381d26ce0b8bb3f4575c427d732b12edf773929c30fbe7959cd937dd91d6cdb5182587c87a5eb13541f6e4542ebfbebe59dae76708517847ff670852d8a4efe4843f37cb376f2f3e341a4bb05ef440e985da597d299f3849e927f4e73c9394fe4518350d1974e781d23bf6e7a3404df65736e981d23b29d4bc65c62db0f607490aee6e5e2696ee50f5f181f642eceda7e7dac5abef936c7d12f1eada9c04cac1166cd25f37f1e949202bba00cd1dafdd0e4b1d67d6bc01da855111d890072ee82086190035a9bdc3fc904fd5b367ed5354042098a08a315821c615b000554364fe3f9cb1152c981a9f30f399c5f82c659ef934bd9315f421a664939ba732e3d33974c83ea9190e877e7a0625a94461e333b2448a91b3f4995b7ed5c8093f6bd2bf84737d1a6e398f4c888a931ea02b287f5890f3e70ff249a8f98dafcfeb5fa41c260e399f45ef241320927291469c4e8e9e862f4644c69f62ce3952b1f1928b4c68b84c9c94d3f017677b1ab28af388876ed9c42b9e53f126d6786464347cbf3c948d05514c434a2a2467cc490fd015cead261d9845af847aa27ee745cf5810e743eb7084b4770ebfbdbb89fa36518160d4a321548133e4b9f3a742648ac54a95cf79c56245056f597ab93877975079d0c31ebefcf321f8a404503c93a26f4259ed827c1252179dab3cc65d9cfb316e597ac150eeec43e3ecce3e4e139d774c33333e342ee3ca3e364e79f6bc042939339bec394d54de7972967c262aef587c4dd374199fa599653ea18ff20ebb1372aeaf6c82693fdf979f31febe3c0dff61551f33e08ce734e27497aa8f49f9d07ce2631cbaaa0f279bdc7c8dcf9821fd43d09908cdf018179ae1ae49ff124e0e419fcf9bf42f41e3c921e8cf29777136e76f86bbd85e311a52d534673835430ed5482a53d0b814334e334323a728014941f219390504920273292e9722d31d76928cb4d82f9742752793133ecb79c4cf243d2b14e36b14239dc3384cc4e215b3de61b722293e41b2220747a0410c9c508529404e744b153d48f145185cd8c31540da3b45275593f3f96a3c3b64cf9dcff6ee9f53fedc0971fee4ec7744a8a1fdd7ee0d69b2ff248e10f8cf9350dfa49f7a429a3b39d70917b5132e6a4e5a1145cdd4c052b6948be8eeee6e539bd844013665a66faa995a6bdddddd5a6b3a408aa2288a821445398c8d2493003665ee280a42485110420829a7288a82d0298a720821a4ece05a6bad396fada9baa8950c11179b76db16f639e79cdb1fea412c8879d9313be7f8cdc1b5d65a6b6d9d7bad35fde65ec362e75c6bcef16e6b8dd739e75cb342fdbdf7de736d9923d8047d964c3b66cf37e79cfbf39ca63a5eebd452befeb005ec530bb1a0ddd57d8fa27c5755576a53942ff5de5b2aa32245edab1e5161801042081bb47864d53e5f5f29b4cefe7caec41142712577b009565e55105655554158555555418710c2ca21845e555505a5901e315362f4781763f1c8201674b1c9f90f13f16e07ef38f6c59ebf0765729abb258d59dd733def4cbde3dedb5d666ea6f6294dc8904fcf9d5f7c627ff18d9131b311454fe5400759bc8ed7231d404942c6ef783dca81174a613fac94cc12cf352d41afaaaa32b38c12cccb41bc5275b7bb7bd779d5555579950ddddddd3adf39bcd3aebeae657a2c69df5a6bae8fbabbdb7fb835190cb0a972483de7ddcde1d5aa0823851951f4b839bbc316b0df606bddad3933b7ee6eb1a9a5a0f0a15c7b2a1a79ef39f7babb1f15f89c73ce0ded33297ae8ea8da21646551ee72f3e1904346f4751d4a3de93cebd072184ef3de7ce39e764b0bbbbeb8a0595d8b4cc4e0602eccbbcdecdcccccdccbccbdc5a63e65edfdde57d3070ddddfd7cc21277c3f51f6ed72053e1999939a69d5b5395e95957bfd8d45aebf6b0a0d69a6badb564ee76ceb9eef6d6ecccccaddb3a397477773f570a0ba2562ad6dce291ad2b1694c3a65e7f6e5558d0934364ee614614bdf36f6c65a97573d75e74aeb5e65a6badbbb5f75e6badbdbbbbc9b9fdd4e0dab4b5d69a3f574cce22271573ee5c9b8c116c823e6129874fedcdc53746d6ceeeda150beafdf6acc61bc3396fcd2d8805393944b6eb199b9e53f1614614fd3e77cff9f3862d60dfbde7100b7aef518fffb96bcd397f8fa27eda397fae796badb926857a281384414a18a090d1e58bec150b1ca6f058c090e5f548075dfc34fdf3d22b1630e0a0e754b97a738b47065db1202aa41a6f8c0c6748f3ca2b295439e5cd6725718438a7dc3925a940712092845e4199c3a6b7165f3c32ca17830e1dcad9a042cab5653236656ca22e3651bea4413e153de50d836ca21c480b2e5002991ee5608bd7793dca81942f3a41d7b754171bb20fe5a49ef849c42f81b41003480b2e0d2590165cd8a44fb9bed5fc940369b18592405a6cf1e7c23ea5de79ae0fa405186ff1c880b4e8c2267dcb7a62b6a7dce29155aed86c5fb1f26916bdb2a9a288f8a15311488b30d8a40fa4851841405a6ce153d1eb33566a1fd83bcf5fef4c38e1cf920c90165fb0e9016901069bf4f52939f781b4d8c226fd1f7e4eb6a8319502ab5dd9312b06beaab78b47d65c63412d87c83aae2fe6a4e5ae2613a02f053e35e167665f229b5956c32722fee65c7a6e11c8fa507ff9f2e54bfbf5f62b71866c6b3977bf608002c0bd7261c5150664d61415b4155b7cceeb911538782be65931aa3ee67b72160da9bee37b3e295f399dbcb28985b4535878f996ef8967d72b44b1dae77cd68bef3bce7eaf95e815a27c2b21c093a36f7944952608e1052e9cf816c20b5cc07cc72a809c93461ac6a5578842a252020d03c888004f8ea0105ee0e25131c2318508591a15231f56d0032aa6f0cff526348c37a231062ca25883911190ca27d49d28c1410ebe0045194646404d1acdf695b38987804c19c6e0833d3c31320252ff612368bed909176d534fbaf9b27b94f376caf973ceedeb911555386fcd294f6b662eb4b706d547731ce7fbfc38cef5c88a19b46edfabf4ed4b7943efe7edf039f5dafb79777b7bcf0a295f62d3f3e69e8b8d4db0357f91041eac0a648ce1a00c2359052ef5c13b074b8fde7973eae3458843793f3f0e25f508075bc240049b1c0ec8f81e36395f4cd7fb154b1cb4fc621580a5f6516f9ff621b9f31eeac39507badb815e45c83bd0333e4d1bd83e25de81ee8e70c0e52711efdc467dec3b0b460c7abf1ee1400c5f6213f4a1fdf254d0507b551e48458735e551ffe117f79d7051e3de828c67c741958f6129d4de9c6bfbee73f64d40a64737e8f2edfa8c29c049c516d0ceedec3ffc6263d373c8fe1423d242fd82ec7b72b63fb728df37db295f6f5188a2b021cda90540a7e462434e3c29011446bfe43993a27f726882200f7af8f24c544b152a50f0953329fa4a3e392977fed33f0ce374e21b3604cae9c437a7dca2bce10c69fefc7973c5829e14723ef4c4cf0ef26473c680905e95673e778d0535576c08f5cddbd779bfbd1edda00caf6c52e569c5828aa87551ccb090646fdac1a7f6ed597b0dfb2cd0c3eb023034b05e8f6ec0822fe558aa71557595b074652e36b51acf02366ffe9aff6b4e80cc790f982dc1a7e745f0a9fd730a50f1cf31c03e0de8f5967fdac5bf1edffc87ab88f2cf73f8c4ffde7bcf55e74921f5c262505105142d4a24d32328471f9800b25972ae71bf5404309e3dc7b4e3d95d2cf5eea164e54a0e163678964550810e1664b0c1e2c90c2b70a08184192cac80315b09c2f3cdeb51118680b1c0722fc0b8dcaae2147a5e393bb7f89cddead6bcf2f6966e8528af8050ee60b5556b18665d72c220528cfa9890cab7f295b372c68248be9148e524392ba1e71c2b6fcd15a384dab5cdab284479d5a817a53698155dfbc0b0d87964ea1c557754cec89e5ca1eb4e767db0b89039027ef8d4ed10d0f2eded3dda67bfc856cef59e687271c73ab9a3874f2b658f49dfd43d507d8ab698220d5970010d46356003507ba63e5a06165b68c128082cd07205a8bda43e0640820eb410010f5860d102a8ddd587004673d88210aea8c1152f00b52b972960180cac766acdfca3adaeeeaaebca6555f51d9c80e6680c4380af475dc0c310b43c7b73f629d47c9e4037810341794513d29c65737df66efbde62931837825553bbd6045bc073aa3df1bc2a44fb8bed8b09e96fcc72497322f8cfd9c98bab3c6db5d5d630cf9f1cea6fcad3cdc9163d6e340c81cb6b6b150d82b0071504e10441a042082f00828b128c6106170c360b2860d8320413f4e00939a0d802042880812bf010c6d11562c0706bad41387fb882cbf55e8f9f1e45f4681fd3eb21a762e1cdeb5f768516601a34998a60d346f1de7befc99f1e6cda71bd62394215debd1e75218b1896eacc4cab0a8785e33d28701ca9421dc2404109a2d803171c62f8a97200051bae84e10628ac808b34e8cce08a296f6a96ea8a2990e480450a585460e906818b6a39a27d7eb6cc4c0fceec3f09683ef508016c5aa720c0a61b5052401ec12647c92198a3fee85121eef0fccc4db6cb1c9ff0464ffb5c3d50b51c018177e5d711c0a7f7627005964a08563016a0600858b0000428d0000c5cf8e10a1424014608650801ca5b4265056a6a168aeab1bab002e747b0699d73cfd7df83c20b25700db64fcf3273114515387bc50203287ef6b87665e818d0200b1da6008615f2600617482148e148085440404f8f9ad7a320d0e1ad572c52b04212a05073bbf31572fedc79db38df66915555054655f56c504ea8bb1fb16cf1623122cf574ea176f6f75cb11672de74e562ed8ac122b8ad858ba3d25a12625e8f80808246835e7af4f3c40545b8d2e50a25ccc04a1662152c7e4086e756a06d88a20b3dc8a18a28d4000baf22841f9ce19900075214010c528401873c74e1061743308ae2e57a3d42c3916b81c9d43e3d660f10a0a8b8c74f8f22d8b43e86a558f0f2b033343658ed597c4abcb3aecf67fbd51ae413cb8b4d0b79675b93bd5a7ab7dbdb77db2d5cc9668fdf1eed636a3e7f1003bbab8f7d37f5389fa6dfc1a6f51ebdb3ee28b5c2afcf1ffef9f52fea8f05a810ebef0760f8f7cf618d9c49741e09997e8f22ae963d3d8af841001618b8e00764d8d6b28f3384081674cd39e728caa773ce51ce398a72ce39aa41e79c7bce3de79e73cfbdd6f36a3ab57eddddedffde7bafbb5d7753cbdd989919a6b17639eb91a80ac28a223dcb5d0d6b188ed9ec523e75b70c0c7659a40ac6c0dc288ffa4f666687de4ead79f94737af6b4ebb9d7cfed34cc4dfaebb1dfb730a0b72ddcdce75777773ce756bedc4efb52fd5efbdf74edcaebb9b4fddddd4a57cea6e78299f5ebbeee69ecc170956555555d5d47992e7b08954c32692bbf2901cb2c939e79c73ce39e79c73ce39e7a073ceb9e69c738ec4a4162dab9ddc7b569c24276141fdde73ce39e7d8bdf71eeb2c75ad956c3d8715c29494c7c9536b7eafdf6386eff57befbdf7169e5ab3bf06dbe9f10f2a4ea2f6edee313333e4062f3629e5cc0dfa74ceb9766aed5a7bcd39e7dc73ceeddbaabbf9458a9d7bcebd76ee39f7d8b9e7dc6b90b44678c1523eb173563bb5e6e5f6e95c73ae39d79c6baeb7ef60299f7e9447bd881efdbadf7bfd5ebff7babbbb75de7bafdf7bfddeebd7ef3d2fd55cddafbbfb7577bfeeeed70dd94475bfee7eddefbd7eafdfebd7ef75f7d3d12162079bd4df7befb5a9bbfb7577eb58edd49a977f74bfeed6cddddddded6c5a66cea1dc724c62be2ebe2ebeae6e6d45a2fee7453ce5a7d6555531735744b089f21d6ca27c8b90ad9bd844b9b389726bb97372de7befbde7a512c9adb78e5b7763b78f99e173148cf355e579937ff092c5829c0f6692e38a99d939276bdeb6536b66fec1566bffdebbd844bdf71e33cb0bbeeea13c94bbe7449e0bb17337b7c7ddeccbed7193667bfdc3cdbedcdea31cd5989979c93e8c334911df41edeccccc8f99297d563bb5e6e51fce9dbb7e7beadef6c712b2e9f9be6efeb675fbf75cf7b5f75a77abb540acb01a9248241289e4ed44fd1042087777174228736ad8a49ead7abbd8a4edd49a7ff9072f376f3e77775b846cd2ddddd6e25cafd1eb44d6673bb5860b9db7652f35a165b5536b7e22e61fbc2fb46427917b2cc8676bae35d7d65dabf3e68238d984ac11dc1963145144114a7492e87cf74622d601ba62bdf9b60e37af143a608723306829030cda00061b3847a8f2ebd96afbf5a32348f1e11a05c4a00439b822062d9e1065073e58313c32a6e46241975bd6fe906a1ef19687e12d57cb31229a87b75c31215a86b7dc927b45211a06cdc3be10c5f2eb17112dc3af2b197ee5d07eb9e2be458aaa3cd0190baa547758569cebd0ab5d2cc87228c4f2950e89587225ce7a23495513f4954210b63ff659202eb2b6e1608390ad3fea417fada749a1c00333d8c1080d4798011072bc7d1a1033a41ef37a17cf5e536a1f2579d0e20e5a56a0451aa20031cef30ba0f0cceca28eff20ab5967c5f2822d7e7b5c2b839f482a00f2832a55d80296268c9105a8c637cfccc085511768bc726174f4d72b174630b0c1b71b28b02e74810a1a282a2f40b1a000010575b002961fd4200f35b8e9021cba80075e2abe7df392638912836fbe834fdb93063885e6072150c219ae2c01095788918312952750e9820d6aa81ce10c57a8410f5820031b2a50a8d0402606574a7087279801087140821168f8c00c7388998119b210421954d8028a2c9630834a16585a90061caf473ee0c1cf783d72039426342aba10842e1061e6f588ca171b90a1044be0010f64b085156a5ae0ae63dae1dd022dc30e34788309a8c0820dd440e3032d5ba05a0a5aaba6b0b3f495152ddfbc864fd637d752e9f5e80b3b5471810b82116568030fb650210b6080c30c0bbc7837b78bcd4239fb8b42943b0a5eae810186bb944fab65bf78bd9ae7137aee9cb121429e94d6bee7f0b53b2fdef973fe84d04e6df194432e52208477fedc92b96466646472689c9cd7bbf6cf55cee7559c101ba2efc56042a0bfc626ca5f9438247faeaf184902e1573659fc3fedae924e4f1109808091244e3c89524595cd824ffccdad9a8b54526f17364451b0c5f702da9d850979ee324861422035e3523e09c18b7d66b3663e6757afe29016820d6977de3021cf59ad79b539984b0b5fb2f8f6a237e2c13be7137314627a42dd771321cdc88885584984046d9d97504e048114bdb79cfccd511f52500ef553be00271bb50dc5d21d6dfa573cb276fb16eeca5939d562f31b3b7e1d12f1ebcfe9403e55555579f3169b3f742e399f59d55ec9092525fdf5f9c9099d9cd977ce6f739f06c4aeede1361a32f51baf473d88c1cbbc1ef5a07514625eb1c0800e5a7e7e7e10d0d323e707010930c2c6eb1111eaf0fc8ae50427d0f2034b75b6c8bca77da00ab688810fa280431d9a00862b3261384323c1a02a4214d994f7de7bed3d3047566ed01e0520c0a63da27d9cfb387904470134739eb17c61e5990b28c8f0cc7e049b588f544b0dfbfc24804debb326e7f7c9fad4a35f3f020214c0009fd8e6154b0bf4f034af474590c24ff85c5a572eb01e1b1c1a62c8b0cadb6c522456105d5f5d1a53585eb6290237378d2aba7523bda0b9e69e0adc738f7900e55d7bbd1eeda08c2f51d7c6b5c197d804b5065f6293ba4ae5610a1b5a786d5457aca1f2b0d71063e33eec6824d3a31d80f1f37a6e95fad80116bec4a655eab9d6bc104695479d17638105958643d52acb6a4a390d0a194f88c31eae70832b7c90830ccb196e20a1ccd894d5c0a6595653cac96a625e8f8a10c6b7d7232364f13373aa4fa0a4e79768497a1e5271ce91a83f480e69cfdeb60b4628e3f5c808620cf17a6404257c4ffb2c15bc5cde6d15ef7c960adf283fc87adac79b9c44ed5a34b9963aeeeddc5d15f7099b9c37783184f2c457d51a8d215ba36fd7b7c80f634d1025332ed9dc28efb4385fa37de2bc3d6ff03be6b0c995b864b3e7ddbe73237c6a3d32c295774ec4a7e6ce9dd81ffbce15feece9a959b4f8d42f1c68aa185c5c150bc88aac7776dd73e79ba4f4943b1ff6b9e3d54d5c4431e5655eb9888205afd80c2cd79834402bcb74a05ff8829730aad8c216cc4087981e64d1832e2ccbb22ce87a8382222d52e0458b0aa020450caa00d3833af8800595e556154d6caa7cfaebb069bd7d48beae59fb90a4ffac7101d0ccf9a6f30198d28323c0e1054448421d809a433e61df8e7c20e59bcb2108dfe44cd263da8dc1741f055aa762a9864deb2e664f5c874fcdb7a3b3699da30eefac2f1599005e8f765083a7f17ab483273ffd29275bb48e7282a5eae3c6f9f461961a8d29d323e6f99cf949fa1f7085609f90f269fdb856087618e5619f7d826d7fa80ad1827876929cfc3df687ae107346e7d92b39f9678f6787d1464dec1d7fe89aa68d67d3c4f10cd7a2a13cececd7fea85921d8d97fece8c127555393f3e6d987675f39d93fe3d393ecbc5f93eb1416d45ce325ed67f62c85f4a8c330e59d5bdaa31480b9f3ea33bede340567f65af3546c11b2a97915493103c2cfb2467966e84e73226ef094707cf399bd0fdff6c7b64bfbf2092d9fd9df9837de5179fec3a6f6a140ef3887979c30b34cbfe59d37394b1605da2704bae31c0a2e53bc73eb8277ce57799c73dcdf176453b5bcf3a964c0d4288ffe117c9a3320c0a729f44d4deb55bcd4b40e2354d33a159b9ad654935d40e0b76739f4c4b76f526aefcc357a824dce9dd8294eb668fbd9c0521d664bf747bb74f707437129e563adef3216443d48c549f13aa76207b20ed2ae26b662e31de78a5527ca1dc99d239124113f49e20ca9bcbd6513fef5ca2d8ed38de0dbb992aba6e78b0969bfbed890fecaad6d4f2c600951f6ff7c5588e78c09e95fb778a8bf94f195739cfccf37364c081b7d2597544e045f9587bdb1a02a36e1afdc525e6d18d2dc7e921cea378b1e4a29b2e6dc60e1905c7ffa93dc22c979c4535eb5cf06fdc5381fc9daa08a096c72f3cf553e49658ae65238d79a3b75eb4d96a47032eb1d752964a97794a57a916b5058aa33f7e89b6f955728304a2645bb402f4a8672f9d6b3581011385e0346cb9b7812d193240946cb497109e816c9ad38042184de91249d1c11710ea18b1347cefdcbadbd7060531fba2dc8a64c993b2588bafe15f1cd6bc40b7a8d77846ef1c87eb8fda76bdcd2abb1a092c358f292370c488d9766cce4b8b558d08dd7f069f3307be8aab309a27fe2d7a8779a433923f0d1e711df3e21f0ddae7fc91dfb3bdacfcb872c9f4fdcf0d97eb9894f42d04d7db90dbfdc86bbbb0d97433e481d28b2e6347cee94a17de83f8c139707cad3dc822d2fbf66e340bf2c877e794718673b8eff74431bfec36b64e3cd6bc869f3738d6c6cdcc9095b4f279ee4caa71cbf71cb2dc823533639a22779130ad027b975c493e4d06cd2bf04c99d5bae7fb9c721929324c999143d49326927872cbfbc864377de4344fb6ded458aee8a05b90d771127462a32eeed4c8abe25931a32c90dd9e4e67d701b52d53471e4900f92ca1498c3600e037ba7498149189702f3cca5889159ef349771293219e3d6e53ba57d64a491de691e23715cdb07465aaeed83c91b572ca78d348e9cb0869cd0923323c99939394b50b9cc9d7213f4ee90dd780f9b9a43572cc88df7e8374676e333bcdde29bbee19b19d978077a2936e555d4b7894b1c8d38fdafeb29ca6be24c72bdf39962c6a5909991c160fb4c11e352c0c4c0c064ed3345e652c46431313ee3cd4bed33054daeeca3bcb30dca37e6008a4b031628c87e795dc8a037b7164b80bee5442cf9ee90e10ca1bca24205df3cc87e796a4a4bf9e6aaaaaaea00b85db87cf3dddd5d0750fcac7c6bcecccc0e784d86976fdedded000744f2a32bad39a03907e59b3be7807e5a648539808148be259b4d8a031688e4d675591891ca29b72e388b9e9254482dca37a7248e90ca290f52c92dca53f43f1ce4798f808c6f0ee59b4cd2a03c03e5600bddb68a60a9cebca63c5f6ce2dedde71d1b0b6a5833fad6647c9bdda5d45cbe796f691fe74dce240d8ad562d6846c2f3671a97d9a94de61af9c54b2e42c5da576c4ce580318c849cb4befb03729ed43b925a753959c196c529eb7fc6cd9fa4fb7e6f2134a79bef8a4a441f98cb941e90665c7c8ae298f0d96eacc1c5e9ed2f26df190597ced95dea1dcd5220684fd391ff189ab406df1cda924e889b35047ead3c39b5359d46700de9cbaa23e4ede669b1284cf66a43eae4b1ed4d43e1b8c6fde5fd09323834d51d487086fdea4a88f00bc7973519f1e6fde5dd42700debcbda88f8f376f32d4878737ef2dea43086fb3870ed71ef5519faa79a63e9595de691d6fbeeac387376f7acae1cda19e4cdefcd21310dee44c426979caf90a9bf8e80e195ff9de42f2119bb2f0a93ae22ae8a97a429545cbb7bb2eed7371e91d32f874796193cb839eae39a82908e9bacc67f4edd594f6c9a4f48e95f6c9744c791c95956f6fbe978f48798e18849b220e0722e2f0f73653f83484d481c39beb70abafea884fd995ea097aca96a0a6f6ec28cbb75f5cda87664bef78e1134d976b0e7aa269839afae2322f32be3d93d23e3651b22aed639349c9aac49ab75a6bef5190a2288a8215849044b22ecbb2ae0bbb1666b5616c74c1306ce990c15c4b876ce244a14396b90573e9449cb7666af094de6997c252d8ca0c8c0a57a9f2ed5676e9c41bc934302a0c85a1d4d4d4cc94281d4d7a99b974a2cd5b3468dcf0133662a3196f8a520ce9a506169443ca2e65b0a97dc920e3db651741320b26e4c923e569b7c18e90577a0773c56c70b16e2e22e20ecdf388528bcc226564e44e5c2001c4f58251d92e5dbe77a202e950ad41b1c11ac040398ec8a82a9256241269a6479447f28a0f3ed8b821e546141b64d8f062a38b0d2e36b6d8c4687303c78ae344f101c4d5b2597a470e9ba5b2b1457de0709c28edb37395b89472302abb65b7d490b1bab0b03d3abaae9bec7bc41c56aae4e454507e30da02b3050cb657aec4c4d4e091e1604136bc688ece348c8d2e6ccab978643958504e17363565230c31d8d4578ed85c27c6bc4f944757ac54519eae5103e78651d699cd17365bd864a305270a0e15ea05c70798b789d2353659fce0ca3e3659f04efb0f3e8098a347cc718a39b225645766f8cc8e8c24193e0188d24a9529cad34eb385060db7b14146ef74a9e4ca3e36b8788b385268b0204ae2445921380db655aae0b0d172e335385170a2e0d011378b9a1a6cad58c9c180f0db01e7ca1171b84fdcf153d4e13a11fb00447924af482bca23233373038a8d30d8d46e8a36b8d06034d8c48972f4ed345bdac7464bef34cd966f0110c1c3468b966fa7a103475c1eb0a99d060d6ca774f10103c22fbbd8e1c6f5a64885c7858839ac284ff3c4c47843d813b784515923231c3678e24ae99d761b581025312a1ba5ddf2e1d289969487f9214aefb4036113a57dac097f905d62f540c4244b74216ac2cb134eb45b372e9d083f4754c248bbf5c3453d10d18804b49b22048ec81131c0a6f61c18052c9d6b88b8847fc889d10fe1168f6c8737c7e13a18111cde3c88f8c6c870b8b24987eff020fc87ad20220ed7dfe13ab0a01d72880c875b7bedc0a10333a2e871b862427048226463930ed9d3f3a38351e9d1a39f4dbcda0d4607e58d721d38ae46e1b872441dee03107358c951a577da858839a6288f4f8fb7d3b4a19fe4ed345d48de964f1a2f928cde69ef8936c2e09d0e6ad2061738643b6e60a631b2f51c56d4c78e89134576699f1d6f3f7accdd06171b5c5c474747103a31e775e8b074ae1c5187bb080037c5201c8848b9107187ebc4f6345ebe71a2e8d854691f9e56bd8ea4b233e52b0740fc014aefb4f344e9a577da71a234d9800a6847ca2e75c0b103874e10140e2c48070e1e59109e030b4ad2a0bc0ecf8105e9c0e1b341790aca377f4e1ca1bd337b4b15df5c75e890e9cc27a47cf3f9c4946fb3bb7c108e23ce240dca531e440e2c884927f69b22951d0762c76da2b48f0d2e6d33c586077c0ac2db6daaf04987b7db08814f948e4d946f7731eb9d76c5a8c0de9143b6414429069bda7544e945d2814ded36b874ebc81c1890f673d8d18151593964ebb384e3d2891c4410392e9db83b760071e9447d53c4a1824ded40441c296cca2171a2c421e3e236c2601f2906f360414dca2e6c6a5f2fd93a006e4a363466d4d000312393c598726070b84e24bdce741c519547a7c91f6ca67cbb8c536ef9f618674f21bb11a7c9469c37a67cbb0f71ca247c7b4e9c8d05274e538d387b0a373851bebd1467fb6993c5b7dbc4e934e26c2c33e2f49a386d8e666926ce1e99382516df9ed9e0327b0a3f6597d983c5097fdae0f2d08ab3942307df5ec569fa29bb643f6597676fd810ca790b3ef1153e7af0156b549c2b466901baa2492594966f6cd21c5e5e7fe875c21803c4e0c2ca936f3a7c7b0e174428e3db5b3bbb2bee9578e58b8276b5582158751a0b0d9a003eb7440b28df9e917174842e3fe333de6ec5d4382ba6c65ae8d4c2d0f8c388b477e6104ee8336e913022ce639cc280143d8cf1197d9a3829b77c264eca17e88a3551a8aadc79e53171167de5ec307156de228e906eb784780d9f28af714b7fc6691cc61a9f89599c459f79bbc5d7e5397cc27c557966c633a1b74c4e8c88738811810ee33f0d331865e28cf1e659148a719c21ce63dc798cc41902e395c3c81c2a50a23000906a00485814ba64c6a628547915219ba6734ad6909c6c51b7934356b9624778a128b9ce7276762b6aefb4e6c0903d578a924df8294751158c19253fc0ef7ca8bf7cf9407b27a9c651f080ce0b7573cb5db4dcd4c9e43ce233b72c57d6f92c4acbf7e9bce5304e9d871042084f98b367723a1a2a9227804f938822f814e399b32340c63367272293892698a8ca83456593a9e62dcb92ae9d14276cca71b64e0a2ab0e72dabb59e1e397bbe61707d609c2f3fa21d3b4c7c71c3c86096917c9abec55943e49a5b1b86cc397faebafb7c679d72ef5c0d203dd0f342ad5c5e6b65587037b625d2539eddb2009045797fe522075decc0e87b5eb9d001169e8b2358e141187f5dce050f54f0a6572e7610c6efe08bb7de0aa2959c456ff9f3cb2d1a7f951331e9c9c0640b2f1a2bf6803272421839b33d2ab9b4dc91e4029c53168dcb49dec4d81fce49b379a9e1b33d97b79aad85a2654a162947519e7df6780b4aefb0571811ebafca2b2c880ebfbcc427f59c4adb1b9a972b96b0204be640997066b3347d9aa03cfb1ef98e9b1c08cfe1385c479b188d0e3f79fc6a6fd86101804810009093bdfc453967c1cb7bccd0c8c06441f8e49194573e8750975b8ead00c06d08e1377adc03e07108973cfc076d624c1e7f3e9b9727b98e38f775788505b920a987f390b36708394d301e00395dc67be42cd1b8107266330e8029048f04008505b95cc8e2f18711b9fef21ead3d43e32a63398ce5992585900b009ed76e0af564b5473b3ec3e43480709c1c7e83c36d74bce42e363176449207116bb80e1deea87d968c1d39a149ce0c08394b39e4741c7ba4b347cfbe64b40f5bf941ce9e929c3d524e9329cae9ee72966ec8996536e49261cdc809218d9c59562a6510be9265e3d4e27846c36166b8cc8cd340bf7c562539e4b2fcc959916c6e7068cc98612bed4323674f8f8c9c26138c9cee999ca5d24a2b94b4f27c2521e22d9f4988983d4f5ae74a52be3d2a8730cb4aa54ace2444fce599acb1dede703989e4ed0dfb439f042f08af2bbab7665ced0d106659a95455b3a7874c424412229210f130323dcf5d7a877d96dc347bda726a616424110a86bb64dce57117ee7271171277e9f9e6854756c36d70dce291cdb8459344e7699cb1201ab72a27c5ca2d1e590d9b48a5cae291412ce8826c22491229cef875e333ae58d00d4663c969c4bf7ae2abd2cfb81589dcdf346e6dd5c1585e72c5822c1e99cd0cff611b0c08f4f1c14998bb981acf5cd927c7615cf934777ce53ec41ebdc39e136ba2f6ce53c7a2f60ee55654e59191b3e62bc78995d788ca26183975bef29b5899323973bef299ca69c4525436cd883672b68fc299a99ca527a7ffecf1a69f3d7a2eef2ace4684904bb642d9deb042382fe5687b43f3524283e99d5823aba43e9efa703f00e5619f37ad0b51eb6632d854521f9cf36ed5a053521f69c8980c3e4db642073ecd243dcdc5e002343e5595b3b3158bba4aea837ae630b2997d4507cb9994e5cc9aefa13cec4590e2acc948ce979c4bfce5a458c5997d55795579e556b45e18da9c9dbd58995724777ec524a5af2aafb9c0c82c974ddab3922cff6117db67318997672759243a3cfba2219bdc85bbb48f11edf2ec93bd3cec71c5154366f9bcde923571b6b79e932ce7973fe7964fe89625dd252d399df409a56539cfdc9272ee15277fe6d69b44add810e759e6165f4a919c82a9a8607e79e31315280e84f9252749ce85c188586fc56041649c44aaf4adaaf28dc227cb2b6f2ca822c50c0bb2646393564e13493e1361fcc54a52804d587c52e32670a018b72ce8975b15153f6351b03fa05f42ce2d223372f25b4e434e7eb751feba1c460b3abc3087ce2d877eb962432eafe45ca2c681fe9c647925a710cb2b2296574e013e91fcf285b23f2abf6455cd20390d16e4cabc0623723de9cd908f5443f218d27b3e83e43448cfedd15b5574cef9bbf65088f5d97317170a4d842e13f567228c5b7dcdca5d7549214bca3c49013639c7e293183781036155e5167fe69388a79c0ac6575ee3d92123eacfa410c92fb77c566eade58a2de0aafc49925712e7b97358b99b0ac643f9c6c82651ffe5ce05001d8b8d0500e5246a9808c64fe7375810cb852e09bd0646e47acb929349d1570e298ad27fff6608de724b9719668ee02df7965744dc5bee2dbeb47d9a57be9810ca2daf2c273de5517e12f15b5ef496cdd5245d86f961eb923812688eb9039a63b2e8ab38617b925b579c953ba7a0ff702c7a52d42d5f11f5537251b042506051b03ff4dd4679d73beb1d6b7a0a0d27dc9c2c74b2456c01e5412d9285599765d5bc057d96deb262e21b23836e798c6f9cfe3172882c26b6878958bce26591620539874dae897bc6825afb8dea9e870cf00516c12c87b145ca97bc44e373c73f9f3daf3e337ceadcf8cc7975cdaa29ddc84c6aefd0c4374646e3303030b1d1449352aedbf364d407e522f697f5a4ea2d775111bef52e2a526f511715dfbbb7aa7ecbbaa8c86f5d177551aa3cf3e6d961dee22b531fed3be7619cc66bf844e3fd68e410d9a389ed611a0b42f95053dd5fc3a71c36f1e7f0a9c6dbb319398b7ec661e2d479187fafe61f8dcfd2bf9c7ffeefc1b88d63f18d91d1f873cca988c921321a8cc65d79287f11d2c838c482c8c8c89c3364ed242c68c6170302e334fca76762c96184e83c0dffe11a3ed9784b253a4fc36d6c3c475299e10f9b512375d894a90ffdf63d4356c3de9ea90f8a1dc65f9cd9bff634f0697c5e4fe334723eb79c8a337bca2d99b83ff31c73c582c44498388b1ec61703f29ce43f0d132fd9a43d09632cc892436424d6b74892a87d55c326f67fb149d84eb668a691aa7074042831f85695512abe4b398bb9d89447a505323dca828c7f3dca220effe48a751c99d7a32cb800654646464640ecbb07cb6a6f27eff8c3a649397421ea63312094439e45c00f9bb8c1e5236c71be864c1f3ae5950329fa1edc2ecbdaab41c711d2daf76be530f22b26a4728bba5cb4aab8a4b2aa0bba4572cb2debb965412771f94a0eddb0e2e4b7e29bfb503677a90f26fb9437365dad8528cfbab5ef044a7ab4243d7eb9c716babb9b77db17dddf60f7362fb4d6f44b16d7dc77bb5f6f0668dd2d4bfbcf92146b28e695676760e9bebecae6263e95d8739c8ae71c366dc6a667bfda39a425a874aa96e973450c3ac790a1119a49002883150030301c128a8603124d54541f14000f93a65c56210a644994a3380a520a19c3082084000018112198216d00c95b065e65fd3cc27551dc8222c2552c37d1aac814fe97141a819b4296c99a44d0c5570b689f0544a4bd23e18e8d1de0f2f00bdff97c3598eb29760dc5af787fd2b9959a729a1acd1aa6e45a94c3c7897b6f483a0f1010f2d64052fc3a4ada9e639b0da1e617bb9b42bf2eb277d1acd271d20b9556c18b948106eda9a18de22bcb0a15b194f06e10a61de741ad0f151da3b048c1c4b43df4099d71e353bb50854bb6cf3c9dcf7e3dd9dbba2e8e9e73fd634e960f2d54b9d128afcfa2206ae5474fe07b6aaa7dc04ede8eadd8a4fb2dfc22bcc7b6218ab771148e8007c92b763917a6835dde339e1a1609dfc4fefedf14b48fcae013c9bb39db61c14a2fceb3ee6cc2edb17482c4934700f2c4866012a29df3dc655ac9d9b371d56678f6fc5cda5524777c83b7f612634608a35ca2a35908e8fc83ca2d01143801a4d3707e66d119998ef43a1312ee7eaf2fba9167aec609dba9dd5b69ade8d889b1a839e9fc82ee392bf60daa51b89da1e95f00ca90a99f8f4508c8ce0e3af75b18eb669a12f06f03f340ca157ad6b61c9d5f6e5723f2377c8ca82b82698eb0bc647d64524177f027205d4762662f046bde317b77e2c8de792c9c6a469dc80f3c5d50139cc255d437e030ecddcbed9035a3addc125b3650ab2e3127aee0be17362517e2322e430d31cea3ec7fb2cab225bfd434b3746227fe9a3e9b94bb6ca7fdfc697e48d7387074b893b61d2aff82fe7c222705bc7ab362635b97278c83fb29043f44a20edae8718372c329b64f74c8712c1ffba292ddc8debc6a72bd8a1d698905bdd374fc6109efa95dcc98428ada3c5b048cc4803df212ae7fb7e2a93c2e12c65092f4a2d0113a06942f67f231246d795d697878791937e83ddaaceb8ed7c5a764eec98b6fa08a81eaa2aa744fb1865f170681fc61ebb6170689cf6f6f80a529d33d0aeaf7e85ae3f07582c975ec1f2796b593b32579ddc1a57e0cf17cb8b2ba56c660b380f9e7e40decbe7aa63df7b02ce0ddcdf998ee8a076a0bd8db5ddf8fb4cdae74573cac0d542da0509eab91e79a852d465c5276c92f23d3460189e68a863753bd0a73d377d53c552f4059583f133b429434d918a0a0ac5a71c269f1d43bbad42ed93ed7e2a4b3397227c9eb937a2110a748771a822cb5d68d3430e271100e8760a0163db5e10783e00d16663a580ef36761447b7b8bd40611fe14a60fefba6b509d07f98b45cf40b246e5f967b3fd3e61d94cdc46c54d22eef565e27eb21108d8cccda5bc934a2419020efc5ffb40d463a89f09d03b9060ecd01b890d3503c279f1e0ec57dd45d8d3727c45a1475e9492a04678c1a5c7fba5f3c3c79bdb2be78e775ac81bb5299db2f8aad78770bf84080e0d4aded3f782dff3558977ffee8778f6be59e4294b1c6432aff8ddfe8538d7972502f7faf038f20423fe92fbd57f254184595bcd88267cfbf783295a5eb73efd4f2071f87ee7a778299c8a5e030295f31a7b446c182d44b43ba612551e4409543513253198f101176dc37213d22e54f5b7088b84924c0e4364f1fc2c4a1426fe562f31d12f9c7eb48f2eed985b879d096163cc379a3776f723f23470bb1ea7a6b7e7c0c897d1f1eaa1806239a600e00f716493fba261013804acfb6bf72eae4d19f63a8b9d7db623e93af8f9505208207081e2bda73650eedfa9208f9595dd773cf09a5114e44ff43e785eebaf893f1195500c4bb8b2071213617f0f1939ff25d742fcb45e0ea2c246821a9039513c854bb410ae2c2e743cdc2bc4e30f21bb287d6b7722bbe98cbf2ac0a344b0cbd4e955321e0875b00e752c4b6004988b6af3b9e5638161b9965e2d939410ef8e4c6da6326deb54dd8a4882de02961ddbf50d020cc0a0d2dabd2155e43cb6d29033751f1c9ac910250413f763be3221926e8c201d13451e81c79de799e9ede865bb874f062cbbcb3ae51221105a7ed6b379ba2cd2962cdfb7e1bb0c622d8e8cc88ada46fa45db7d59165720ca69f97b99c791e92ab4508c1ce288290fa1e20367841ff2ed32b8e73c94531fe7eef51dd680000716e1d5d8e881c742e112f10b24bba22972bc0005a0ac761714af9f24629c5a6e3feca756901ddbad75f8a42eae95dae7fa4c61e6eae4e89209e75cc028abcb396d6c14b75d1069d1c70443fc2065093e1679e0422fa20f88b8641992a139f4c956587c48ac870cdfd9699b6606ebe52762757d222a2b0b526101fa775e9ff5ffc7673a13837ae31461a5e4ae140460a6c4c7235097ba548b8f43e77d49c1c5641cf8b9f888adecb8bfb01ea0a033a7d43d3ce4b67754c5bc90094cacf3af48cd2fdbfbaff6c77313502ff851819791bfa70c2776341098c06d3ebd61649ef8d0bf317734afaf83a21163073428ba0c2dc3e6e888e81201972d544e0288dc4ef4ae3d2e78b00604f60b6c014a38628c3b958647318ba032976c4ad903af44a2ddf153fad3967005d58e846a4091ec827d20527e1e36dd76f57ee4c8dcdde9cf8bbdebc8e78e870124da16d1819f6ac93c01a58e456dfde329c5311a1af599a1abbbef95024f36a3e3aa600df54f67364b7c7f457c143450ba0e448af44558f3059e0df615a595d11f115be2b240670fe442a47251fc81ef497e3d478518a30ca0be474fc1ec000e6044205a2312b69c8c011875f496a8e316cd95c513dd9a11db7619904c666dd14f8ac6430fc82c896d95169f408364e923758985fb4692e6a50865371d35deb7798acd8a4110c96979ca6a1fc0cef3f1429345fad6c8fee0a30eac32c72b7968b8ffdc8ea684b5120020e05cbb77e8e28c3c4fa8582d11594d7f60ba1fe7fa2606334069c82843c748909e34e6a5dcd36f5219053ef6227d229ef220809aa18ff7cdd05d7f442cd688e8f46c0dd5404639b7a2b5dcefa5a5c044f68a48d35a4688e51b7681125b3055f971aefe47c648f5669c2925f6397ce1d51ab2645e2e0dbb87717947535e30dcc852264e1bf4cffc90a1a88740685b008b7d0268b577aa56e8ece9ac84962a11c4621e0310f14420da3bdfbe2e2ded15bfdb33c4f69f382b4ef740dcab7c03531a83518c56cac97d60cdc519870c729234911528c866e2929b33af148a66e38ec44943dee2609b72655b35315f2cb43625aa59eb9c70eb7c8cf617c9684e51c933622f87c2312c695881800c2211b9ffb4888b2ce340c401df4c087b47aa738a33092ddd0f4f1f4080c634bed35295050684a98dafc419048af85c6ee267ef94cf640aa02a54a641555ec9b7d245ed862ce6931000e8c7750a2520403887711d6a798b42be5e5e86181de50520a24c1e14c8233d1d4676b1fbd5de487d756e615dc7797253ac84d5a621958600a7166902ec23c657053d3dd189fddb7bf59181392c5c9b02f685e1784c8e5dc120027bddd10d3684462706aae145e52798b45f7e7bce1afd65c3ccbe9cd16a14d78611a3a60617e570819186b17c87308c63bb6df3f38cf3f0fb5bf1740c1a8c23b3ca5a3fda3dad681c8459d00310f58276fe0cf3e8501c32b87bc8af436d8c56005daf7897a5a868853dd41c06fe59b76082af400681235a6179a516607fa3aa6ab15074af0c444bdc846de40e746fe7673115a3e49441aed21ace0eee69aa4536aab617054c3f41af2468db3f4eedfdb972fe40222f65c0511d84e4983e7f793c6effeaa93ea06bd613232671ac02f409ef430e9192962a5b9359531609b4b384aa846eec0f662574624df5968013ae8835aab275586f64ac1de2f12e0457a1e76f851de4b015bdfe559d787501785218b923550d87a09f191e2b4f0ad588d80150510b9f6de8bf57cc108ba1588bd5cb9e81a803a1ad1e0b7fd34773b40978fc6e90653a0ea039ea01a2b53710334d1febde6d5765490b36000a5f4731e55a74d03cf3a967469260fc08ed094e51fdb1d9b667be2fb28108b3f04498e27e4f5f672a6ee52c0e8d11420e372aa6907418c18d55b984dec68ea6aeaba7bd73328ab26e9168b6a31e93d7216a01d209fc9d5fcfc051086eac9dbcd8879bc876b724a39be2b08f27ad117f7d2053267a919fc3acdc70002c15590ffb60a2487b0e5a3bd0c12efd5d66a2bc450c03ce000aaf97d2da5f9c0a2ab897a1e029b40ad09ef8290f7c4c1f594d3481a8f04133c49bea27d9aff27261cc3bee8c73217e55d22af784772b28d180ed6bc50d76779be2460b21e8fb10c215f2207ec98e94d07683a5f07396de7962cb9cc3bd40ad8949e9c2d24f1bb9bdd47eac0c4430963300413fa5cb1c18ba4d74b69e5d745de62c0afa8052cb2e50053e0173bcf1397d289c4e7627891144ab5226d35c1f2c02bc2583d77bbb368d11acbb6c2607f8396be26c9bdaa1ff8e0fca481ca0c956f2b97c224f66c9d93a7438a63a80c9e9c694310eb134c3f12eb6197080dda9e6b6ad46b6d06bed7c515fc6107eaf98b59f5a2e80518c2e04cf1248a48b1ae2d16a090562b54e2d8792cb217a3994608e68f9a78b08dc32b0f7d8ae284460667f965a5ff929cfdc9c5e0b3bccdcde0a1fe53c200c5e36099523e4e469c6580e751dd83cb1b2562cf8e609fc22a377d8c293c1bb4ad68efdd634c12254343f635131eafcfc2910e1df08181697b2e9cb2ce11ff651f68a67a89d5afb941516da95854959d2aa08890b91bbfed95c73f5f15b5d2fa2be4d1fcbd9f0193420d196f75141673c311ff6a28d599693b5618e73f6906046f2d04192eb46a045e8410b45494fd992b5397acf5df0f5f3db052a86762845184f604412402924e32ecaa18aaa80e0939d70be740c51672381539c9d33825759df62df1af3a25ac66dd4fafd9aa3ecdfa786a72cd0e47e662969d16b0aa1565d08b81834b7868fa037514cc3d6d4e637922e36cea616e632dd964c622cdf913a7e38cbd823146e5649caa83f96818ddd0097dfb1627125ff0aeb618462c218e2d5e53a912e0c00b157a69d97e01136431f96e2f9b9802a809404ea9e63c73a76acbef12f9ffbde0b3be1085427b4e6456a3ad3feba1c7173bc841f5c40dc0ac0f109160de47726a5b82a7ef9b0f21e6244e08404c450a6d6a88924852574889d41ee98d84b17150d222abf629c99b95e83e72482f09a3ee4a1856e9b9a3b439e0175d4e1dc9dfdb843ee0932e4a1607ecb5ea63380731946e1019d98485f0686e9c194a87972e5fa6f63392dff881624b96969e886c65c5758dbe4dd9a9d854b88d0d31c9a482b322f0bbde7655ed1dccfc59e1dc09f79880951a1ddc463bc0c0e07f2a2f78621c1e83b2a0c8d7ec916927267f652b82cc97d4a097910c89f020ca1ad881cc4c1601d52d63874b36efce62d87a55c238a61ebdffb6d25adac0329ef29688ecd6272283834db18e51fe93f054cd28d298db18e577da81524da2141d0cc9b9e28b250e6b7f2a1be7f410cc28f71f41e64d31782ddebeb2d4a3f695474aa1be179d9c4971574702b334aa00f1d4541d79a87e3fe9e7b3f358f0de1f347264226f9405ba8fe9af2c090c7479aa736cb74621bdf65618fb656774c38b047eb8c783d6fa9d359d74da4fd82383e6b6c7d7316469bd79786341b0db05a863a7af0cf299c600940cf010bc39c201e778b73ec8634f28c478470d9512d9c6d47e0a2e3f9ec306cc3d402397bb3d3479ffafd720adc480529777b07933396cc5d7ab10065efedafd71932603990fc284112916a92dc7d32745a477c17faa0e7de3db592d92c8439ab364e5cd4309fcd34d00d88b8b89d9d0293092a057addb393014f73e529724e5039485b370ca8baad5cb02629974c0adbd11e06b0258f84816bc6d4d9739aaf13d42365da7264cf14d407c2fe01da8f598cdbf5cacddc99110814174f514b70c9e3fdcf92e841d97c95b8d9a01da7bcf61c4a83fd91969177b099488847579ed9315056cd824fe5ba453437f5afcf6a967bfff076c3a4bb2ca150b5401b9c15eabe193ce7156842280a28e13378ce048a0971f55e7139b93a0acc0918dd28dfa4a84c06a2a51a0005ad9eb0cde939c37987c1050c9e0956de52403d37a4e92143abe92950f6d44e4ea3355b386230a549dd59d23f86daf9d6839d78c30aac71ce5e62524c81cedf922e9c76c5e2fe91546189694da853ec5440cbc870204203ebf520834b1841b574d878c48052217c6c90cf2c380a82cb03bb8f81b65c626e0b0b06028bdee617b22e1138401cb4d0e47d918276180eff010b0ff1959c813db1710b5328f5c419eb61f176d54b4ec01f6777cb8dbddf96f7c598e3704fb368b0ebb202c8438f0a9750060df0285a261e348da01d2f1d6f6c9c59af9bcabc1aa4338efe7a06ab64d5543dc20ba1fcff0e4e38663401e49bd4953dd61f9fa8851cf7e30a15a0223caf425312306165c06eb5efac732425de3ee9c51d567565ddf87b2b711d2f97c5eb542f86ed2b450ab189fb8b988749db7f89a2c2603bee732b80c338ceb36cd7fae73a61e1d407a04150cd62bd19d03f30371b91a6fd16ce71340890196b10abd3763bd1901b7743f8f59bfded775b1c7b499e7b1ee3a49e0c6dd495b58e868ac7f3b004be129d8920ad9c701a4a1144d78ff83816b0780ae73324c2ef8a7b3ec9cce297407bed7d268664e14240cc68f4d2af290066440b8abc62148f390175d54401987a48b24c1f30565ea180bcb8bf581de92ecf280c321eb32eb7beba3b5afb827b9df4415682b2fe31146f790b0bd02609c44ab8954bb8e38e8b6cc3a55630c6242ecee2bbc193e3b0d1f7c42707f769c37c060daeb71510c666a09f8b06eda9cac030d862b4c818b262df0cca22dc4a63542c7ed937106a09b54259c88d49a55c6a39c3d34a2296f71014a7c07b571b35c1f4f9bbe428f2ab8fbea54379fcaa6625677ba5dd5db57421b5c14a9e3992b35b8110c44a442caab50d0a2bceb7220af96eafe1e5a4137cdc51271ca34605e10d29ddf134f8088dac5cf58bd852a2d4bb896f8f012231b298602d3125a4f999f13a7519a2fc013e9a53031c0f30f570e0b3377a4bf5f043e232f3de763652e6d173f0a4720c917a617c63a785ca3617a23fd13ee19190d61152f6d584c19900333098b9b6a4e56ba0e4248fd97555dd7292565f2aa10ae56275a2c3eaaebc2e463e639fec58471c2a7786046f5ad9f6eb4f30d41ebc58f04c6c51c35fe4aaf4467d5a9f8759db3d949614e4f358ac0ba591a0184ab5ea7afebbeb72cd8ea872d392b0fe93a8086994b964a8082c50b7396c38425739eaf46940cb3fdce7a20b97f79a8966c9e29dca688c7c9b1f3ae1fdba70b29ba40e7069f2f742fc4929ae3723f607f4ad464182d0b8b43955e1976f11c9a0f9cf8a7e2eaa88cb17c51c2a80e82ca594e89074ca6a62b156db132738ab2b010f728c07fbbf3dac830670b7ec3dba647032fae1d3940e9eef7ea48086e33e02d6b6ad9824d47ffcf70ff09d332b9294aaa260f4102dcff9c3c6944edf937788abfd71cb69f619966bf191db8b80961755007a685d995f1469564934dc7f50657548834d00705bd0210a1ea937bd3524443b7cf00b791c6b8371911ca86205a51bc0117ebb4cb0089845ca0976337aa85e6e84df82ad3d2ccb44d290446fea2a3b619be4067a24ed5198642955080472e7049bea65a1f5ea6b725e319afeec4caf683f65dcf0781433b68cfdb7964e541f9c39f41a3b04cbe3671fa037c0f3d30c485dd45b056306e155b82324e189f3ccd85a2c741e1425dc5e8918b0e70ac6063db82ac7e202e84636166ee5b750d5f3ec43c496a7098b94032e4d9cdc127dc9252328f20617b3ba095de6a0359153b835e63fe830af1cbb8b520e1e55253cf70ca9f465980718e4aeeb094f1ff06bbf62119ef80feb24b66ec735cd3d5bc16f6c0c453805af24f9b6a53903fc9da9b34f5ec1d51ca03482b7f07b23aff95a99ab46619b50f30e6d06f7590f119e32d7bc6e6b6e4570c391f43adab8189ff73b3ca291a251c2a66b297a64ab577462243ea5bfefb60d5b45f98bb9ca476504b3676157e40edb8174c9153426714dfdef2777795c8fcaa0d9dffde27910993b7307a5fe1d626a28a519dd70ef2f36d21d940a0780e272dd5387606ebca7cdcc4e8ef73ea60dd99fdf72ba0b87eac0dd4c3d1a508898855be3f6a1a4beec30a068dc492eb3cd1b844c6dc4e14509a99e980b18b686f318567097c22ecac9907dd88695864545e852c7f83065fa276107c4a82902b98e0e163bb23062a094c4573e8b756c097ba22e94aadfabab907b908cd81699c07ab628d25a4b9dab8cc5da4ba41d10c10552f0f0897cbdeddeacd1fcdd74d24134199c45e6f51e21adac07c5046501c9bc0b582c31c6760013a72c65c2087fd7da7c40d3ec5741fa1b493fa8b47993d0525816b1192f28cd7023bc9496182bce43f639856a326f359b704ba992dc2906febb9849f8d5490454db87f1ca8cd83ab7ce0d3953349a7ef2d1bc46ad970d5644166e6dd075394b370ccfb8734c7c351e55f14cec14ee5d32fb7811aec50ab32ded47b5b4a75c2689ce8e9311b444466d2b6e0d12539d922035afd61b585035390daa4ec55ffa5321e243dd6f2d8d5494ca2d2dc0d77040203ac867967e2a44788ab7232119890d07103b2ab6c1194d5e7c3b503bd8ed91491fc803b01b5d05861eea051f96514b449a8630f1dd7ed1b07539e5cbd1cea27319a6f0cea5348c3d94e3a10ae69f42e84f16bf922fdd2e88fa0e3642dc039af193b0dfe5089cda711dad2cc4c543fa07aa7f2de933bff9d3f42f8c8f7ffa24ea4b335f5eb52045a46ae36237d097d13ad68acb7259f796551ac7c2518396210765bce2e563d73eb338ae053c33620d78629f61e9de6f85dc0ede045bb7b23c2e9ec8fc46cd37ebd4aa1c853f33389764d6aa47dc6a4dd6fdfb1691b2ada1dc19c655fb1e71cddd16007727eef77de19610908e0fe3246088b497a1029f469160318a45236358f769f65164fc9f3ae08b84d790f70364095618eb57fab490904c2aa01dd6ff81f5837680c6cf730a55861e284f5f518ad6e85712c95042489ef787cb1bf34d2923d3af601f2e09ee579bba0cdd929333b5bf8665a76b6cc39570eba6a74f92243b36558d38eed95bee1c14de21d43aa9fdbfbd32bc0a4fb80bba4b07e04835eea4e08156e315a20ebca38ba5b6f949b514848d019e3cbf54aec2a9bdb9843d5e10d4a93046c5d1a6dcd6000e14c44bc6089ab2d606c6c30169778bec65ad2c44eadc30e8193f76546ac966dfb7f5af83812b5cc53d5e5e97eb7eac16654ceb069bfbb56a1c15f3b2f5cee784c554a2024e23aa93bead1c59d6df34405d5489aad2b1477b38bec8f8ca9b43ca9087ba033166c30a6944fa667e83f72ca3c55f40193a5c63ba4b055fcc3b09573e951d42a73be8406e80d80efd97c37121308997201c156b31611e6952518e9c4d9ebb3f4d774a70f06ac31a2fc25404150f55ec895bffffd387d92866d8bd21af67b2b509efadf4963905dea68a27b37e508b6c365e6946330aa27b9192ddfeceaa21118bae8b474c5142b447b469bce34085e56ae2187d3ec67844c72bbd130e27b4821492dc84bc58f921d0c3bf65e5194f1aa7a559c6e8283b0bcd897f9861e5274f628b3d2cf6efcaba27ac44c487f969baf5d8674a0c921d532028a1e4d7abe8e2c54131335de02580646bfa72fd33ee3808d3c88cc8ff74ae744096815cded3856e4c4f183098e9b9d6b86d34cdeba517d37a2abcee5a961216126eb2b7e20b11c0508b9bb98531576bc6a3e1d19ef2a5d476ffca7568759b0c2dd313456b42da93ee8ff3f3b4d3ea4eeaf27b7eb25bf6e09d2a676e1a42f860ab63ec2e4179418987261e6006bf8a6847243d3d7c2271aabb0f4ab2e6695ee9e5b1799d6dca4c1d071437a784b842179c637004e2aaf80428aa4a6246aea02e0b6c8aa2a9e68bc9b311ba2331a9d6bb0442f257a2386f3aee7dd6e2e46f952142c9db8d82d50390c2b1e50e4ed32a1ca48b643ba21c71242943452829158403ae1615a679985a74fc5ce68be220f47499cfa58c109a1421c2acf9984e85909df51e847b05979f39f0b93043205469278df41a4ac75bb55cc0da143f94d590d62170d9295eba13b54379931cb6cda2a6297c76e246f40eb9be01eecc145d4465dbc720d75d2a2b3b62e2919afa76c41a9629467a08e324f53a5b2a7981dddc362a52d0e73a125812e66711652834ade530da041462dc9443f9b5c341e2dda10d54420c942bdb88863b0d12258e9a8042bfcc7a41155e84c792bb6116477497a3eaba966d492ff704e80f609768bd5835bec28f2fab00b013805ca6166a9eac6a2b6d770ae1f21fba62cf2c548aaa4cf9f11d4c0797364c4e50e0c3983866a2a89bb8a711662020f6ea0b5960dd1c42df07255046d2bab3f2965cba940ac2c3ec5ff323ffd292251542e3ca9270028740a293125a67c584bac8613272fc895edc8e7511d3a1eef141680184aea00fcb3f4ca86fce79ba57060c234a9cf2c21da3bc6f98cbc469c542e18bb3b543ea7388ec1108c207f6c4902f360702057d6055f059c505c88890ca63fa04ef46919698a2f4514ae537472ae108231143b98995c9084848ab8c6b4314fedee23605383496b64b57add89f18e2ed4f59d524b05abdf7c2d96068175c91d120a29a0e7eafd71a60e18a2df3c783a314a68b58fb53197354e1bf68cae8831003c1bc32c24d8f872ddf01064adc490c3d6102850a0eb15a7a0147cc37ae856ec2a36b3853595b668d0c4caf6f88af85c02cf230e8ced70a90aea08ed2d992db6105a8be15b083e6676a99ff8dc0a83fbdc002e69933e4b49fc09f9a3fb83f312e61dcd127e47a266dbf506a9879b24089efc5a6236d64fbf56229186e812700c0ec4d10d48b9bb3d814a363211090909c73ff8427131a67ef226269883cab2cdac8726926255bed597cd4f17ad1b8ace0e870b4f4dd19f3167f9d324c3dc4d6e7d3f9a84236688edd07044cf06583661969e81c9bb7050f9e5a702a087c118b5d4e573df4f4e804f0e9ec1705e88274397f8e41eb9d065b1a0e5dc3c783e15fbedae7620bd3d0cf3ca3503c0e54a73dff838f5811b8c0a4b633410ae4530a41be3598c2ddf7343357d3e22fd5f8016ec71cac219730a32e41107d1fbfc2738fbd52e5c2d203e7784b623ac5f5669dc6b65e6359abb1add5d8d66a6c6b35b6b51adb5a8d6dadc6b656635babb1add5d8d65ae38ab8551a44a5d6d3017dd0d2c2ff004c4f7306bc7e716a8f969700283228cc228ab3d647cd7abce536dcc458b0554c90bc7b744c48119cc1244f07ef39913f8c29d4c6f0b627cd617f402b12b2d768ced8a5e2ccf43aba650ff831ad0ce4e9f1d6f69f6c91301083e16b9dbe81c7d41920d0f48f244dace56112fb67ef8c17e8a8ffca16ff47ec89afdbe7dbbc0611849270ca0c065de20005e16b0f461d8b2dc65d98c32ad78dfe982ec607dbe7042a290a6f42a70abef7eb0c244d080b84c864571fea23a5afcd7b70381e731d34190144fa05cd179b10289f950850ce900732b616adb10aab63525cdb5acb9ee281a3e8b1a7d6b9749ccabc059f77201f352a19b7598ec747096ac20bf73ce5a1527256d0c6f8826d8508580f98348976756437d414911e4df3689ca63f555deb130f77433f66e9f778e13bc7ceab0429d6d26db87411b1e6f30de307d1ddcded3ad15d68df205668f06b734e7efdc0cd710f787212c6b4ab7ecf7ae8f18f0dcbf3a051152a9900bdccb39209e9f4f6b0f2e9d8e4222433b085009f3f449d81a360fbd35dced8f5e26bb1ec286de953f6811e13a46147943b490a22d1a906cd624ef85c09def565cfd86f08f3e0b7fbe0c743e64bee3b5f555ba62173faa90d3981e92bd6627cfd4ef65f4cd676ffa21dff84a2e4b451b8f1fd6b05ebcef5b95724cdfac9ee9a841724af94f4119b0055fa71e27d03cadb6e6496cca3ea1c9b08e06e2e3b38ef0dbd7b5abb4a69c8f98ee271777b7bac2ea9454aed8517cf39bfd37839218466069f3eccf2934d150d33aa4aa6e3ccd624dd40e778d3216a0ec7510a3c08448426424e6ed7a6e95b3b76dcf89dcb2612a82263697666574925c2e68f2d6240d8de5217f9228ae77dff6502d9efe8f1a4b1a5a13405f4a058eca097e3fc480e123f6e4639708c88974b75c33ff99661cd86f234b6c8585385f688d8a7d2b1436e0053622ce715069cdfcbfaaf22f23344c91e20d0d5c90163d325532901a48ca10e2ae2cf76c98362f519f8e502185ca36019ed4bb8b1193fffc1d398c51a3b9123cf1b1124aca1ed38a51734809141e7c7b6c4fbbc41fa41867107dc04a4a7b3fe4cd0c27d8870ac0b862d813d77287fea071e82721bb235f49855076c73aed4ebcac06927621bd866bcecf81c14622d00128bf44001e70d25b442bd4680def4136df25c7bb498cf46e723abdd4aa06c5e5f3618dd95b4733b0a96cc0388f28f2e645c3a23a4277cdac8b01f253a080177760c23ee2a7b8d337c9462cd8457b637c6ea7c683ddd47487bef47018e81165faf472d3a393887b3de67ed0103dec253fc24e5daf8f3343dab3a96684612a9e3c3cdb620ced7d8595ddf28d565fb27cfe71086835e70b8b98dbcd9ff022de443f345ea2dc9d358ae6ddc2772b7fd4d9e2f0b24df170538d0fb89bb45e09c92b8e5abffeff0bf22fe147f7e1d67adfdd7f356f1bcd2f88206f60b80173099fd3ef9ca3aa535f4d8c8051cd622e355aaa59b148683e64e4d1f56c57bce7689cbbf7565cb275c67271527074f27b1b4e52d6cd48d773a71021e5d877ad322d261e0f37c2f1328beaf0bd4dff7b6b44f4da8e3f3097f88848279a5d64b6e4dcf22fa1a91d0b347a7db7d8574503d3ddd17cba3a633c1cc857b902eb2baa1aab26efd6b9098b9caf6007a5f71b6a5d4b0f1075f65d2ec1da4644cad4937723127a0cd4bfb356a7f83e0f5ed1664e3a75f62cbe8e5f78f339c0f551a56b0f8bb1885970052f8411d3fc35daa23c15cab16ea7e893a3648e76e225796fc2003aa14354940fb94711cefe1379ae383e2392242bf288710be4fce2571a5f4138d88a5145b7248e7fe9b357bcf0baf739cd0b9fed4b9a5f6be387aa03a633ad3310e8ef957c45e1213df8874f26b5b64a9fa57700b2c95802b0cdf64bc3df6f1d1db74c26c51ed1ab8125ef0b17f6ce3aa42709b2b75b102b1589913df2204cf230aba77393b18b68cc421132ac29c44412bff8247db5c91a3e73303bbd62aa1469098931726437a7c34df4d6b74d31ad46ccd365e334dbd465a9b934cf1e22da9aa69f424d7ae9e4d7dbc6863f4265decfa1368109479de0881dd0bc024cbb5fea7113eb071b38af3a3e199be7aa0101b5f3a93cc08980dd99e34829df2204823cf42535854637ba67ab976aeebaa7fa1dbd3a906e6f4f7978ee56def1b0786a2b66fffae818a63a501e193ddf3bb11b8fcacfa26b832f972054c3552ddd618d8981a2fdccd9a5d2281b88abbebb3d1844f860883052838778d02729ba3fcc3756c4d6fdc58a33bd5e6611e293483333950a63614442b7faefc989aa5da3efa8f83c9e20a28070d2fe20f7cffb4c834437c0751b9f72f3e58fac8da379dc8b80546e9fbea5e53dcbb172aa4d11e1871408191587b76b01752a68406ebc783402fba05060cd363cf2c03490c8b7766191beca700669bd981b3cf3f220afa9f4a8e2477536de347e14acffa0ca7fd8147d8a9ebc48dc16b6176ab5cf819dac48f20eed3825fbc49fe0e33675c39ba7774e65beb945da4e89d7079482a422c436dead65030103748bfe8a151ff289293d209310a5e8b9fd1cf458bb9621a46b4fe4924e39207bb73e5b37e7a84b34a883447274e92b24df7d5072a4bed8449f0ef1cb565e3c3f1d25c299588859730a66277278929a999ab070f55c6fda4be8ab97b168b3ef0cc2b9610111f85d2cbe7db22935983f60d9dcf2a1be2eaf565f6ab8ef9a58b092a0568239c36b0773e070d5ebefce22da569f66ba73164a342c75c43ebc6b3c81f200ed014387d57285e53d7ba143be9c1071daa5068523c9c6338e96f43cbc2a2391e514759d1e0ed9070abd4d128a5d0ca4c2865f69490005d85fb0c07274c79c165f3e6be1d2607c2ecdb332cc463dc264c4c457872d3aa23e67571fbe4f6bbae9fc5b3e87a66674b22a273f6e824ba5003fc73d860ba1a5685cc0a90802bf72335a1f665dc5c6caa3841b8686f71f07b318a63e62ce44dad9931315b199c1d9b4036b18e09a585bfbb893f37749ba3757556404b6dd9592c4c610d8504548ea4c62f4aec5314e18500e1328b1bf44ff8b080f11867daf6783d01113d05d0051e1a00c3ee106abc3de5dafe6b7be8874e3230ec33652189615200ad969b74d622544093b4397e9818560af21f2af3771bb9b54a514d777815982ac8febcfe542288ac17674241c7412e29038fe5fbfa3a44a9ee05dc1a67ad5af6b7b919a99446adf0f399dc49972b1dac3ad5cbc7641d8c1684e9ff80d1dc023e693a1772327de496d43580e28c76ca01da6752cf82c461410071ba19ab8849f7bbf96ff064431f881e28fd7674eea742896fb3e058fbb0c8eec882ed6950fc640760e103e66c93b301051c7cb39a2a24770be34332d5d7a777e6b309409fc7de7a95f992d840fda36e88e663fb981dee270c329f4ccd6e48d4be5106e587f3dcf252881b7eca0840542aace17efd4123358ae32e10f19328865248cdb29216b4d48a241deb697fc5d662c0cc770444af16f551c9f9fdb9f51c986a5c652aecf58f1b99b1b4f04dbf1b49ff5ca66b5c746442e9a7ec09c79b56bf674030b8861e0289b0398976ae7788b9fd27249e3f32250fd381cb2bea9284849bed6a444bcebf82da66b91649cb1aa5124b49401882f09d8f4d594a0bdcb5933f261fde9ef109947be8c3c90e11b5e3b08961df377a11b5cca56913884de2846e709b79a79420a01f081d1d3eaa7af0d52aacd8c62b1487eca7d817e213f02b1b508dcf9d7a9b6c058f4891f9bdfa17afae3fac3449f51c4fac3ec352e1d01593aee61080a6c34cbf80bd00423faa90f18b8b4900065eb016ca78066dddc38aa000567cabe8368846ae763aeba90c440f9aa339eb5d7e339e5043c84f4ba923d92439afdda28528f8694203cdef868a298a0235be4fac4d455b5ee5ffa6182a133523cb5e873072a84fd67646a10def4ff420740753387cd20c5399a0b407e18b8512986be4cbe2bd538d4d16fe8e156e1c28a2123c62b1f56ed57927e724946535cb425203dd1ec5a948dc0d74cd660f2e9453175974812dc1595c32e1832eb110415898b5dc17da183e62a7befe549e14d1ba7a0c54980e1c9fe6243e5ce0d8e5b4c885eb7b4a9be6f41a3efe27a21397ca8ed6cb8bfc07ddbd23f2d99ffe00757a47e1c486f132f30a140ff5bffd14eaeec74a26274185a89ff2f34a6d1c0bfe2076f0ef7fdc87385f9cddb606bbf8a33988e3d7e7e6449142c9e104f125d2b4fa62c2e567693f13c38e635eaa44e7cf841d86b3c877b76a3ee53bf542bd5d15b6c3b2b68cd58febf1eb92c8514308179e9a5ce872a05564fcf4ab0ec46650164bdeb90c8cc3c1bee82c4eeef82e04ef94d1582b1bb3156ed1863aaeb17dc65533ee90974bcf29b354dde408fedf06856de401a421db5d62efdac88a4a47bc97bd80570e96b4e99065d4e04a776464b85a175c58734486102f1cc5e73c709a1b94062bc3b7f3eba2ebfff30a096e7838c985f90904589f83e32fb2a810a92d43d4daea3e87d6fd8f8ffc6c331f4de087274111feb5490ace1f97f9e2ed6f77f70f2ffa7f8b0fdf0fb79cab72361bb5a37c3aee7f83747485a11e0db7e5eaab44f77403a439e3b600cac894124cb7b411a133b8b26cc5e9824b66e1aa7a694136a99c9738c317a514090bfca9343cc96c02c54d2ac6cdd813ae73d1722a5dd497e6b870b7a7bb4b53ba9723d9631f7a8c4d14a6a39bfa808beb5bdddcd5a618013ec3caf2052ff706b4ce17611e649b315c6da9edeae7c6cb65a8fe2f2b2e564010d3e8d2bb700cc26bc7e98ee0435fc113d62b859e9a3f09de1b8abb3ad3483c6e6c8adcb210f4825e4a1012df401a4cb8c48dc156fb5f0504534b309f40bf498384f5e876017c85d95a8f882d874e2808ddb180650a4e19f231ee79b8981c9511300fbeddebef5c4cf59ca48d8fb206a01d74d5edde221c815c10452de7a8057b2d2853eae9daa8394c0298a264945524d62221ec6aa8fdce526ff7099410f36f945651d6cfc9df932d71b8c86dd239cfc6a39e770913b76c857aa23a08e6f706161e88816dfc5c096cf43bef94cab155400d6ce587b3a51bf8ef8c4103267d6e8d9cddca95d260550e955d9a6c342dd0b8704b84edce4d8b40bf93d20769df94656b45d011b730129f6f1b9cc8eef55e4e48427a1536515a04592a5c0303960f4577d898ab324c0a9f1d351cfeab0f4c4439008831d02ba4246735fe2e0aa739e0d2a572604261f4aa159137d8a3308d9683fea759ea11eb1b70921e69250ff45fa3e96af3df2b878beff7c970b0f095cc5f952480170e27650631b1022a4f4392ffbeaa94ef01a1134a8f4e789a22c35fffa6fabc7f9dea3baf6bed127507ab9d28978bf70e5d513be3f47cbfce1b269f5f45ee3eff945e1b703fa0bfe4d1c6ffb57763f6d452dfcf05ee9784a97fa1c632d5f27e60cfedc48202f421582bf38a8607c821b82ef38c8606e821b82ef38c8606e821b82ef38c1ef412200fc17ad976f67936f09758249ef41e336354f3b5433d89b682f27f2af694073d7dfea9c860630053aa584e7ea0cfc8548081efbf58238c4a6599a0676998f7a6830c8ca04c73877457ee4d30be7d6794350c517eaa25d11908d6148f3a93df7f3268c998cc337c879e14b9add235252d0c0eed8c03d326822792007a895ef60a5943dfe70602572cf070deb5a262e84c55720c7c47735bb2ff671259cdb974cc3d012c08edf400c4330cc30f26653ae1d7411cfce82b3fc1cf617e2460c792c6fae29a1defe33cae4e9865f0cce2ea6fc897250d9869855645ec50c79d814451a24ccba5752221c16ff5315e0a3670f9e5d19608065dc59f81544d77b6108a9ab9fcf391142c8a6595c452d91fd978c355d2c229fffc1ed19c34cf817e86eec6aee7edf9de30fbb822cb0def7a2b0d18f5e025b177f2afb72473347a954c5140f9c2d38fa8caca1d55f8d81999dd2f792a51b6ed20f7a4301daf2f95d8499212b93757364d6e354ac317b26f54b612b48d9243d91cfe25995a21203db99910d3a87678e79ded2182e57093d1c71cbac035acde264ef78467417412160e11e89c9f0f64baf372c4e1989be64cec9b9f7a292fde2193943e456502238a4877fa273b468265956acc5d4a941711b438bb77942aac9885e2b3fea066e1586fb62439b7e2c8b62b3357479728915f47c94063a26b441a90b41a26e5141baba5949c7c2c59517aee95a8a275f262dc808552bf079e98f0f085da752e25ede478d9d4d7e82e047c8400490f354f6de122147ce18339467834d34a453b8d109964b51a2a625bfc79cd29fc462a0d269f5afe556a9f75e33c4b09dcf1f51a1f44cd8716eb95086ad1b1263533fcd130422e7c5b70882497bb782778dc6d99f7d533ff4309cb9473a03b303a733b6c9909bd929325da0346cbe38bb475fd4a93b888ab65673943fda2ff81cbd0a9f76c60ba6fec6809886466fcbb737a2e9762bfba19a86fe690c67ecc1634d583a26722920059a9fa30fb99705984b65e19b76fc3590d98b0ccd22a7c0e60db92cd8221bd243eb998777ddc63e6be1ec0033d56e3fc1fe102c9b0804509dd6506c5c2900632ee379dfe538d6abfabe11e44b89093402811b0c2a93fc1293d9ca691e8359daa560417a7cb3da7d37855b4f1c56368f190dbd195a31019be75d87384428b1b3dd73c39e02b39918e059affa544bf030a19fcc159b9aec36f0bc5a21395fadb54f1852b61fa933f8311f4ac872e1bacc6a3a886ec21c493f6788c13ba801083222d85e3aecaa2a092c22c365994b83ea1a2d701027fedc93626a506f56f3ab87301dfd4c2dc64a54d7fb6133507db69895ee0dff8925e644ff10cf38e8781d2a0a91f12b994b5f41994a2db0787728b3d0256556f9d008133609f03c7235905184e85a5b3c4f257a3afca41ec9e1a748bb2911429ee3ca714a79ea174b50c98fc167ef0d7c2416bf1c1390b47d753a9327df6ac8a95ea8306f968b5dc5d5edeff0e95e24b64b89314173b8ddf8628554aa1ab9f8198eb5659475db6d59031fab8b6c8902a4fc9343c4d8411cfa0d71c7927eac46217053f322f9e9a5dd75b96023d518bb5e673b7942f503ed94258f8c6b6ce9ca7c2440ac3777663d949580302203326792e5ad3fe6fc8c7ab612f1feced835f084d31bcd517c4a655dcdac3e0084b1fcf651fc5a64f5254179079216ceb14d64cbc82edb5ba14716fb551c0bddde2311ebad461164737237a303578648e3caff54b13c7b9fffc21de5082132bcdb55e78c108ca3b3b384771797425c8391d1abeec24a0c04e77c398a31f478e37cae4e31b243acaa179a3fea6db9ef3c7080307efd9fdc04d781c14610257327b74ba223233237be2e9ff2fe4d24e47924e18f3215bedbe5e6099d0f8255886369f92f359acc0e8c185b22854dc423d9b9685ee643c30dc61bd6d681086e97a09e0e02607e95cdde5fc2a39d6e6d2fc4add9b0c81925663bf11122b1d640b2d71bd5ae1e2857a18e93aa4fcc66aeb63b2ebfe50bd9bb5bb1316d1920b4ff4a3f583d891cd704520e8caf22916757f45ffbe3b2eeb755d18092a69528b38a024428dd9060e20dee0d6ab4e3119234c93061494e8a9e8b7110967d74b0bbd4cb208d6f430e589df8782190836a2771c823439d56e09650d4bbe7504b41c227c0332021b5ff445fa8bdba12f8372a5340569624b9a5b62064a1f268f06651547cc32490c48023dc36dff703ac8854d9ccb4a80a8aaf302e70097e267fbcaf8c8c62e099669c4741f7a8d56bd6c90f33f284454ad7a87aeaf055c765abf9a97d52f5cf66963c11ba1e40a18a6e5e29e2b54f1803d0a4161ca43a93cd5be7bf7d1290af54f1440a2b43c11f0eab5e85ea80fb969e5f89db0faf01f74db8d286a5ca3dae65d1901ac0a36450975dc639b49d7c89224fc187bfc22a485edc512d346dde5bd53599b79afa632f5f0bd90bf987684021e8eba99dc8de4e51fa1d82a5e474794e66bf32fd0d1f07a4f8a3012eaa53a03eabed51081fb41a8323e2971588ffc382535b93f5bcf3f827dfee5b785743afe32f6bd5448072aa2579a79680efd34aeadeedacc90865f382ecd393caf50d8c13f0af58737fcbaa6fc941280b280fc397a68c69f27be67dbc8c63f6c111307c63b6181250d89ecaecc1744437b4741aecd3d2d4a231cff71417a92dccf9d084351683cb5d3a1edcb49fa0bf66bdc998e1f0c4bfd01f8749b631b720040d8831e03650fa28f81b1d6d5785d2368b37bee619e52030c6ef0394fca86201e7b50422df196e85f0217096753aae8f5372c14da7ccf447892dd2b1382050b462bb344fa014a67e2f4cac275cbc475bde0024f8830be0b45713488cc4b79d463ba1735f3540e7d63fec5f78dfca7d8aa72d93a47bf83a3b0980aad19a187963e390ec4e05098d6058a73cd3bdb284ea66b671103155321441652575d5af8627a95cb9b6685748632843bf6ec9053bff60865abd5d0f400bddfe3b91f046cd6f385d717c08b89f8028338078f783755da5e610feef1554486f9b2dc972e3e03f85bd0eecbef52c7cd9fdedbddf6fb27762eea552f1ecac088958fbf2593e4da5d12cc11962067839987405ee2cd651045a7ff08b020b0e5953dcec10627b38160b1c490c8e80919ae7eeb925cbdd22926596f007359104de868c4dab8cf8cea13134c0a0c43908c386fc790ec3f95f3773d64f7b501070e7b726f5f742692da2b3c4aee51a60bb8ca6d5779cb7af11f7f7e06c82955d88c5bc5fdb08219f0322e92b50bc4661a953933063ed611265258222e15c75524b23397d8f87b5ae443244ef3c94b7bea9e8e6dbb25d61f0f74a75edcda65aee5eb6c9049bc581c28523c0139f9c998b0c8f825234e4dc3849025809452dc7214fe03006450218d84c7bcba6ea2035d53c46b24e09cc592cc9c189248aee46af958a52441696ef0d142f2f3829f4666612bd95d99cfbe60d67f919eb0a7582ba9679019cbf6f2c20a9d7bf1cc29ec92efaa1e05cc23c86e503792325aa11d9bd54fa66b204901905ce521ca9f65c405653788648619d83f11dcae42d91cc3ac1f501fdd80b6eded079316a26b8aa099e2b3639102371478087aa50a222901a25b67346a6c6951c1967c2c81652b6f1ffa5af80c761233ddb66d747fb0c5ce0d6b1a20e55a525867358f2f4a01de5b5b49de5a9199d8d264cf6321c726520d09d5a732153d01b28c5e3230c045d86c29643807463fc74c55afafd3dd5ab92d9bd12ef059a39b4073a7a8ecd573d9145b63d063bf17835894da6eecb753189fb1ebed5d2b302bdecfab84b3b3a99a0536ca04e76a82140fc7eefe1f97d17046350735d75db8bbedac8d5e69a230198232a57a4c62d04eaa7dcd1d4fa47e480ea17e10ff502aff4df0d8814e62755143a6816a75fe5347a14a5df8620e65a1a444685a8f3d705e21957eb623b4b13b42547dd495e00b3beeaae51bd2e7bf80d476cbba8fc929e5fb104c1745a2ab9181e21378e737129062dac5abdda63992b2e7cf4d842c1353fb39729b9d2c273a5a41884b66fad18ec49f78464a7a62bd503dbfd34af07e42160c6fc034bdf1a75eb5e49ca7e9902b21cd23612cf8b3d590ffc4db3b07210e962e267a6adce230aded3c977119efce5bd356c0231b8d3831b24f1f7175b4d0cd24b92c9723ed47b46360d573442d035b8be82eb1f471efb5b9a406602b17d0b029a30fce50b2ba25bd05d0cd750ace9ae2a572020d8f501a7104d887721eb703ae99f155c95f63399c1d3b0220484723cf76010ef707d6392b06ca529017715f96bd01447db7b2bb4a97ca1e5c7aee0004c2863c00c48e0a23163ec5e393d9d38153ff38b735bf875d9d904222c47da20982d6fcd858e2e18b4edd82bb85e0fdd003d7836486dd3af8ade1fd55ed6e900fb5c4d303110a84f03a3d42b5ca0a8e7b98319d59e5b15778b07909fbe1500eb2873a9a74558051a5bb8df25f230cc9bd240083a9a2955c05c71ac0b4b2a04cd45b8cbc0545c094def6d80108152282a9ee4c3f5344093447bc6677902e7805281b5c6f031c3bc032dd27a5190de4d253b6302fbdb222a377671deaf997277bc6c9470ed7e037efb7920d517b40390195add7259c32a446db9c2e0cf322a9f5790bfa96b80ee282ee34a42db7772420ff29f8806bef1a1f5c77e62c561a6373f8fed949dbc3e1d81da3ac5d9c981ef8f5b57f342e1325f9faefa8c608f03629ffb22783b8a30c99a47cd7e6fb357c51eb4904fcc7ba9cd4c3bd9ca535f7770637e06192031b350fb0b493f9acf4ff65049a930e7117282bc89ecce8c59c7ef2010e3e964adcae55a9d3be8de83b6fbc2c6997845d77b48cfb97fc0355b53a0392e0b298f7ad354c1f900ba76d1e7757eeb929e1e701bdaa436d1aabd7f53d68ab2516c067f955f83a605e33dac3ebc8d82c56bc26c02ad0a70e4513414007174c7867a727079a4da5827010308f2e3cb2d90b1d732e178003f9008ec529d32dad8e38b068e5f2cb65e49451eb997bbbca2c7b956dbd6bd785adc2c531d666e11a326d053833098210950477ec079b2ba037bc42b97625369ee54c5bbe289beb9c17dc0cb824824331c61cbcb310f786abb8b84ce3bea14f7f590fb40f0ea069f1fcddf6a86721c5b169e0da9570bb60c8def577d7d0534ef33ac23f93c679f0d1d05b8c20deb3e0fe97d2aa2cbbb7ace0f8c53e5ac520a2c80f6868b433862298536e59af61d2d4833ccd2f98655efc55e5d1338c8422b9f765629d3147b7f02fcf5095cb4716dfa5365280ebebd8a3fd80f0917b959a612c9d0d95ca811a7b75c9826765e80515d263827b857e7b5ddaa4c780abe59f027426793e6682ef8195af528935b464e0dfb8bfdeb7323aeaa84ed5ad689d61d31855960d34b2929dc8c5363eb5b01aeca89809b19390d5724a6c9c537fd8115ed82cde14c01f37a182dcbb328dc5145219a037c1a6244b517b8188bc12ddc0a6392bb9d6822a6356dd069ff1e960a205455bc9c73dd6bf57997807410456c6fdaacd1e872b384e25b6628ebbdf01a4fba287ee08afb134de7e00f9c06abe3595fa398df17a0a178d4a1ad3ca5d1bb6f84c10734bdcff08f8f7f6aef79e8c8d10e99d74caebe2ddc6939e6c60e8a958723c14e9a32f99de88276ac6e87a8df35dcfcc6c6ce3524bab8602fc714733c093f1a8f0dbc53dd6cc5e73b7c45e049d71e362f947c0f4cb176a72b821f8f19ef910f277665f954270cc10f72a3bd6ae7b37fe9e5cb009cc49d683b9abb4cbea6fc0f62f64a2e3dc90b252ddcdfc9c29d32bbc83e75560f463aaac7538fc1191e0a8067dc90b9343960e5378fb95deae0e63c5901181f06845b8f7169a021671d36b45d25d3b86407ede780af34bbba4de722ed666b39db04bc6067c10f2ca1fe41d4213d6bce1605286b22f05681ad522d11de54dbaf2399dca346a80682651cdcb4cc12c7ecc69ea21b4654368082b5ced2885881819e8fbc00843e89701161d0798dcae303deb6bf66efc9d95e35c27a7e978e2b1b418efb9cd142cbdca6d883c16a41aef3115f30cf87d5ad4c3420f9ec7e119eea0bd24b186b280969ea5e0990cb77baf2a68331a17ae01d7240c0d2fd546bd60448bbb1fd5d430107f87e42d4cf6e622c5044886e5ed6d11de9cc3e9732e9a6efe31ac00e9470830b4eb4d29b3abcba5e07b46a4659cf0d239e58de4ccae4b8f1ca27a5301325be43b4dbe006808dcb0c06f34348e46e5e215548e9e2ddc472c0947c72439418563463ea894682474dc66a4d80bea3291e3b528b70d60563d2c182fabbaca0a0c96aa5804523bb739a9ebf116c203cbeffce0667f9d987ee5fcf5226d75dfdd3da207f5024fbdd26e5e14e4d2cd92f3036bfeb5c593f446d3383463f4fce5c945be5fbdf726dbcd34d228a0784ed5c80740ebd0d3f71743426148269553f8a4fee349602c4ed8cf029ea9f0f6bc5f43d995861ceac159d3ac80fa6e6d40380e9ba730bc2ce9e4df929db5da00cbe8b4ca517d1366376828742f7f1aaa9956a4ca025096a629e004147ed4b1ec6c5a0496558ccb8c107d166c9eaea7ed093aff19baef24d6261d603df13d4e18d5e1deb5df99f0e7edb2ac58563b852bc2039982fa8af99211600d519385617edab89b4e8c6df1eeae030cb0d6463ffef23a7e4810c37e91b57a67cbaa1b8c9a54d1650b02b66cb3af159a2be67a833058d9d2309ee546dd2df7038cbc86582ed2e42c0cb31324a51959b6930103e7f8e795d8ceeccadf08b46087d6db56dd2a8cce632010d182bd05e2a4533b97e7cce9a48844a687d043a7d5df4eb901232ed481c9870765393e12f7e3ef92fad5feb282ddf9cbe9e977adbd788f0980e02fc3f5cf6f54f5aa5dec6d4c7cafdc6da7210ecde5cb6858655d77ef0dde0a09c20346a61e713632b193acc3d8edac4247b875eaf0563aad96d855788722d0be13cabd7cde927bfc9ed2992da658abc3a1537bc4b991ddb7710a7f36a385ac69cfaac701d188f5e418390c99980ac1f29a372d7bb0a41fccb65cbacfcc8b3fa27baee451541019e0abc281b85deed9b03ad372ab4fe361b166490ac2b06b0e148468273dc9675ff8d4f8206ac6ce6521ff637d3c30d478ac3d6528da7214ebfb662b7fcc6b13637942147f7cd414f9f52145d771c31ab24138aa5ef521472e5da3f184a45867cdd6e200dd0f10608a0fe47991fed2ba9800acbf7514e411b67280562ee8b9a0d1cadbf65912f3f41ee0094ccf8a38edf75fd6bf5d4133c150b044fde160835c97f233440e3053a80d74986239dba19a3ad727265553e73d0daa191495c29de6015ec6ab8ccc7cb86574214762c80b5be9f0a3e6c48eb1113997d1b4d0dafafef00a5137a7bfa50803057727ec37b35e65cdcab581919b0bed77d09673bb0bb2b5bb24c978678eddade4eb844d50474c772e773a4684e0812519437339b55d320fe7b4c280addb94cb03fe8f60db9a191a9b911df7378f5d26b9fc01ad478e211aa3b06bc2811f36a082b491c04d732cada6ea1ef9b8e226fe96c3283dc335352e0e909b92350c021858bb3023c266cdff9a0a1b6a7f0359780dea2359b5098e150370090b59acf6fc80cbf6d8c273a509c369e2cca9587ef0f34308ee9bd1310150e55c5770d8ffdf5ec17305257ddebe396ef4f22dd1399bd3d28e6ef9eb96d91fffb15f330bd860095b030f361d0863768248116622872e186e7dcc98727e11d04f289e5aac2ec0023f11a812659877bd25441ca9de8fc8315f0d8419488be480b776916b21f1c17d20aaa31245dad0bd86104de080f9ffec8ac5c3c52ab224348f56da163eda4aa8b3b5a0a16b0190a788978fea424c9908f26068d07b8ec257affc0333cb3b41d3ae4bb87db5f3a9d226aa3f4cc163181cb13f90da5bc14fa18c5aef9bb74aa38bcc266f9ab75ec02d35bc36b49efa9b3a34335848b265b293c7fd0a483f1a2063d9cf5dbb900c9f8afd933f43bcea1452c51195c34262e07aeb790451e63c2f718a02847a968a40a18bbb9b73506c2b098d7b79737185afb5c9528ba8dc50e40e1961a5db340078f09352db5b9d9b752c9bdbb5073bda7ab9437ce9205f2290ef489cee3034622311959fb4feef9bc9279f12f1f6fcaa99d43e55f438eedf298968af6e5bdea9dd9312bdc8ac028e01883e762867e6d1ed0d1adc4f6570408e4e4cac8824b817f2f4d57623d0d87830e336203aa3820ad95194039d635cc8cde6eaa0f8f2a399355b055a926f7300f718c641af6a6274a579424379226dcc8462086f204d2803b30f22a5755b272fad395c10cd282f5ec0ed3cd7ec5cd58b615accf297756098bc134b89555cb71075235b49a3a1dc8fec72cbde65512d571f5e518e028903c9968492fc32393cc9a5ac7858665f6a8a292849189cd99677a39ee34c753dddd46262810465b727f904de44dcd8739f06499793c0f03c529ccf64333471493d2b0919491929209dd8db4b1e195dd83c14bf9b62aabedd4e128874bce750652978078557ff4933c0e0dabd3e846a132d33a0bed2e490c80024910085233eb2bf39e11c25b24e9e8a1f71381c88079eee65f278aafa72c4ce5aa71722fcc60d94540bc434c1ae9b6b3ae329cd2cf34c1996679e1dfa2cf447b5000fa22ae205262d428975101d366fb12c183aef869b160294a716d31d64dfa123f3605557f4cf018db77cacdb416f0a35c0d90d50a9ee207644d9cfd3122aa5bbcdcc5496021f2db2ddaab213fabfcd81b890f77a384e406eea2495f96f7c7f2b668ad0da5510d55c370b13c22fb68748718e6426b68e930528e1e1780c2f7e90baaa326ef504989317e1a1ff6093bfb204c876c944b9eaa68b217c32e4d9e2b275fca96315165f2cfdbaae42a8d8decb9410bcfebdc3b2ac54bcdfc888d21d85f49fb713d978ac813b389e466e60defece9130dc55647bf7498e6bf5e7305424f96aeffc4a2407d6fd0197b8be1cc602ed26d7897808a5a54cbcfe18e49142c331b70cf3db00ea5976383f8206aa110a3d0435a141e22540bbd32ec614b72165d8fe6e99e5908abc6f51414e4180fa377001153a60db8db31c94a77f3dc52872c09bddb730c0097bd4555d7b6bb43af464c7c1fc654a7ad2294ca0f7b3a6ae94576d88bac0f26c18b822f96ba0018002abc60c299561ecd83044c0b008e8d0f1de6cf1b661c4d0d73bc22a4d47233a77ecb935ff99ad64122d09636bc226ae0c87db9238308cbb83d599be7f989e63ff88fdb190521e546fcb9f934579a79f61e18e199af0c4cd0c7bb81922940735431d447981c5712327c716a09d6ccde76d6525f12c7208fc0776b9a4abbae25c671d39a0a42406962aaed383bf1f433462b9a0642c02d1a1cc74aa805a5f7e3912ce3caaa7c0195393864986af451fbce9cc70e6d0df21570f848f09fc06800fbec686fdd7c559fcefa896bb9cbbc2a04591f4cd5bde17ccf7319867f42aba9ac27f3a5e7fc20ea046ddf00d22538712851d7008d72d81316ad0b739974c3d963ca8e8299b48610bbd65dfe0f5f391d0ad003bd005209c80a0aff97017d2d42a209beab8caafe6f89728755d6b9b86d89e817988eb3de6c7e8eb9edd9b5c8bf8a7ef785816c7fac944d02e609a4ab0a907f4616f34681456f5b9c80e7c1d9b1c49b6f49904147a0f4981af89b9b1fc535f6b7ca165428896e9e82fc7deca99b8897cd793791b6b4f8db363d8c938520748f7a83f2a9d697e9588c27180a02cd1c43e2fe2c3ab565cc3e870eebf754ff6800b15d3abbbda36cff9ea910df27c778241dfb7e811a42626815225fa6d1068ae21cb2e7d0dcd2e29b96bcc46e371a852c75b1c2ffcfd30a000716028822357ecaa66d4a9160f53a564976a335561c6b7ff54291e5b3d2aa43c1b2976c358c4840a0a2816d2cdc3e24a793be592325ddb26471de0ac3a3fb582c95f5254cb372f0910cecc487e75f663350f9143498c166f19dab59ddb23ea61a134b9377153cd76a9a7bd39b2d6a58fbef16786eb191e5238e7d6d4f3d7ccd6c414114213ba363f59150906d509fc3d179b9cde2236d65782fc4b7d95fae3741a32369008271c7c835ea0e6b6d427ef1ca2cc6ade97e9c03447d4af29253d6a59c7c01c27495ce11cce358b150a7c43688ea0d37b490f1e72368b5569f79dbf09dfa002a7b7731270455b69e06e8861c06d743fc6091ce6dfa2fc0e975528984cc6e462d1d705fedd390b07d1c88449751f00e5fa9d3efae8cd0e78a87bf11aa2327010101e27b3e668e49ebfbbdc25dbc0eb25e9432c330b3d4859f65cfbd35cf859261c93d3b0a0b1bdd409e94873b6b72071e31a9e940e20e03eaab1187015fb1f01778dbd0722c0f7fdec67202625d771d97cf7df55b66ee5aa20b009530b40b8e777196e2b4ff6062d8e02f5fe1f8906dd00bbe41c99b737ab50eb28e81b3bd469098d4634ad68b5b17030d156f7226ab027a6686115cad97046e77e7514fac4442c9046108822a01b97e0813b8f50522e8f31bf10ee2d5265810e1df5d429432a0c0fd061ace752c70deabc28cd28131b0892901b03edaf5cbba4d28d38d2df110b02e8bf9aa16eef6580186c8f59db72366f387d01ba8da46b7a05fad4017db6c45910cd83e2477fc046a644e4aadec170e6e2c0a3603de5a8a82f24014d89edb1b56da418d97f97b39acb0c6993f1368a01125b1afc6520dc273dc7de5cb66b45f992c99fc6dc8f09855ef42f22ea8fdcb1ce15ea9f47135654b14cb6e9eab9a733163761516184f06ce6f03e24b2083c36cd1efd8334f14ac27efc542265b6e01216e5338bb5cb7f2e1b1fc05056985fce8d5a2b31a55671019c282c49990de758be38de7180b3948f0a5d089adcdd06e3321999a3130d9d64274dc2dce4f5181cb4a2ad0e3e92a4ea19ef82bd512c0d89a84a41a8353443540c75cb9faecd2133cf03edf5bfee36644257713a033b8ba8bf3176cb89ac2472367eb9f3ac4b2603594416bc15ac4ffb283a0a93c87370fe9eb639f708ec8d670cdf521aab75513bdadf321e4a6d0789bb301ee84df465ca206c7d3f1463d95f780cc7a61c620f7eac52aa8424a890145a62cc90110adb91ad8f3ac6d4107f79d946f430f40040609b5ff12ab35bf7e4b068abd0aab09ab52b0d6cc0a17c8e3c246f8ffa2fbec99f4ac8d1e9905c11609d6609cd0d65d44bd63fff3182d7df073704e9b427528b96fea64978ff4926e825817b7f66006f2b70e34a4aad5ca2f07e3deac062cc7b9aedf8575d6e0c5b4e74011aff618ebad67437e616b5624b48808917aecf71f4cd9f6816afcb4cc79a83b262534729433c055abaf6aa7fcc92ce49249b1c247b1ada53e87b04349c4bc11ccc271a617b6cdafbb917abdc215652601dd157133e26489d8872f73a8b1f3a6688fd4c593645e7f897632219b71aa20db141a6626cebadf72eb46c40009a1f07b01b79de9f31f7f2f9b6b3c46c7ceb786cae4d02275671609c1a0cc0526d3d62117e34b6f50f182a972fdc026e1a7e209e65209d1c2df484e4130e26ad84b533376c80ab141d10c2532028f6da76beecd8c6553e3907648a2f720ffc3f9868a50f08f4990d5c0cb6d66cb68dec1f511039f24417ea8b76dce9bd3790b290939291108db295a6198595622d7301d72bbc856e74f619268e25d64c0c4b6c1a2d4c5c00c67141406ab099cb2b069775cccfc2bf7190453b11181010e7cb23f0510c7f36bef7d20504ae67cda30c6a1fc50f412cbe002435403063d0aa0fc07465d25c35880ac53e9f401e415089784a89479c9cd899fa93cdc9f67bd0b7d7f7990bb783fcee782530c283da29cc0f8addcc14bd5fdaccc461c459ed399f822eb47059b3b4373faca5f499f5653702f422038a0b179c55201e555107b96918e506631dda351d8a1d4313f549c619d6e66db8e2803095881966df83ac54d2121ccc4314c34c52b4b927ded58821bdae757f12d38ce7facff5f97a4b68602a5f9f6c5d4bf66eb2f7de52a624659e09a009f7095f4f3e4940341210c988092605792420d28f46990d1fcae48f461939c25f2e4f2372e4d15b7cd63990f675dcdaf0a16c6d09be8fc2f64f987c1326fd08d7fc237f7f7e424e406ddef2f4e32f399c8a9c8048e5e927c9c9f479dded4afd1b914f1a512a432a47a348023a4fb8ec2f2201653f4f3f2d1a76a363699676e293e98a938ea837fa2be111d65abbfb48ae4235ba4ca9cc3b50a6f4e94806f27424f7deaeebbea15cdff32e19c893fcbe4fb43c29d08572fd4b0651f8e52ad691fe38ca6859e140daf2298a444aa156a47146cd214992a552c934ca6c984619a594526a69d759dad1d7716affd2b7a578329d4ae4e9743a9d50469e4fae65d7efb2dee86ae9090b783e9e0f1642ca727a40b93f5cb5f9fda9367f3cd63bf4c763e0d777208f7d5f6be9939b7a3f3c5e8fbf9a7e08e2baf36117f29e196973e4f67ab2975d080abaf3610ff7a0feea771c59bffbba506717ba47c8faa70be57ecf6fdcf62542ca7286b3dc1f52279289b0198716d7ec46daeca0363b09f2f420a06bad87cb9d3d5c9bfdf7887716fbd59f033950c38c74ccfbe1e13c5ca53dea3e9c591384b4da5a5b03ddf6bba6a96fb17bb5b56fbf4ed77c6bc7210c472018a64e4a23d00405e5ae5a759d8a451257dd7822ad5d71c178a586e6e5826752c4dcab62c5f7a980b958567c2d30a6c994f382058b1c1a33f20b16326aece0793cf8f0cf030060b4f0e15dc4d07979e93ceffb40101489c23014ad5d71c1786586e6e5826b52c4dcab62c5f7a980b958567c2d30a6c9240a43511cc7713422914824e924d99592d6aeb860bc3243f372c1352962ee1d4723128924c952c964329d4e7e3a75a5a75abbddddda7b6f672d89244b2593c9743aa150a892122f29e94a4bdc45e28834a14c4652e994422a9d5aa5537962697111c30fcd51367af325da90e0bf4659687252fa1046f471f430618c6843a63e6694a17c0cea4319199791e94a65dc5142d5285bbdaafb945fad54441f57af32ce60b158ad96b75a5d69cbda950f554699cbabb0441b123f6b94ad7cd8126dc8996f8d329a6fbd3e7cd147977ffc21166dc89ac7a32cc5e3980fcbd2cbb22b2deffd108fb2158f4bd186fcbe5c116d48d8afacb0883eae7896efc396961617177771e94a5d4ca616d186ccf9d06594bd7817976843b278d728cbf9d0146d48196f8eb2196f8e336ace1fbe441f5ffc8bc5872fa20d49e35f46598d7fd9e14318188781e94a6160441b32f661cc28bbf91819995116fb7046b4210bf033a3ec003f33cea899001fd2883ede3ccdce8735a20d9980af19650af81a213e4c91c253a4e84a53b45aafd3df4e91d89f0d74f3671b11c09f1d44803f5ba8007f369203fcd94342fcd94912f0a7f328e04fc7c1803f1d0b40fcd950e4f70100fd4343c61852a99a19148a245326a218c49f4e0bc09f5e1bc09f6e33c09f7e43c09f8e5bc09f9ef3d90e0316a080042040880318a000041880000270130b02886f3d007c68c9a0c15299a959a598a444950ad1ddad1d653c7c78451bd287bf9787d6879ee77d2f2f2b44ea316fa779f0f067db7a891efeec1bce873ffb472e488f901fba067d83cc22e745963163071a355efeecda1856ab540a8522c906ea20a121e7f11cfdd3fa01c77817aff330de876ff13dfc3f0f2cfdc24276532346636707173362c8809175705abcf89c568a0a25459e745de779a3acf5e127da902efe1b65305ab4fe65e745a32c86ce87a1e7e920528f753b475a7f56a1ffb322c1f9b30eb5f8b3795cfcd93860fcd93974fe6c2576feec598c3f5b87eccfa68d21f6672d43fe56c0feac41ffab540a85baf9b36d2cfeec5bce9f8d7bf167e7f29fddb3c39fedd3b517d90e3176b20e8c172e5ae4e0b0f8d64dec7a1f6cc58949090a0582a048b421557c188a36e48a0f4315de87e3388e463e1a75a523930926528fdd1d1f2afeacb81f367fd65ccf8a3fab101f223f4574a83fa841c878c5e53543135393c2f4ab552a2534d43c9da3674dab419e0e18e65bb0f9ae5ff12c6f833fac82e53361994fd1aa798969a1819971bdcc92c5e55bf150a7944914c5711c65de8723d1866cf9d12873fd689c51338bf7995e9e1c65304f9a1f964a5e2a75a5a57b633b34090f8ef2cf9a83e5cf3a6bf9b3ea70fd5969e69f75477ea93c64feacb6d69f340e993e07febb150b67455768fd89f9b302d59b492606e6e565ba5c5a58564afc79df2ac3dbb156a6d58a442291e428537d58126dc8d5974a26d328ebde34ce389d4e2894a3505d29cada1b917acc77589290e967da4385a4fc497d68110a448dd0207a44050c47259313540ae579c81ca9d9d3cc5ab50d5d157cc2232631e9572f7e0aeeb00ab38c2cf89527fdc9fd289812c96d2acdb13ca990dc7f82694f6e5279d220b9bf44736279deacc8fde1fdbfb9b961c10247b421c7c71965a4c71967e48836e4fd9c51d67d4e0bd186347d8b5176fa161fba70e12e5c74a52ebe110d9a33b0ca45ac5888d463bd43a2449425533353f2cf1b90e6b0549af6a71415d3667f09a6fe429567cd29c684699ba592c4a4119f26689a2c35e74569fa61a88c4bee2f8d32c0ec258b104724c954eadf346b4e93fe474d2ad3afd3b708593fc411a9871f088eba074547d41bdfca02508494eaa84ef325da6f997ebbcd69ee3b327d771d38ffe13e7c0664a448112024434240468a24f9a9b5480321f1a14cdf8580ac914cdf16714fd279d775a5ddcf8f1caebb7978db7ed85ca66f716dbbbd44a67f9b474f10cf3daf2bf5ba2684e4c8112121244782dc8f1cb1428de3768e4cff368f508724d3ef8ef4cc6b1d99bed74a7cfe7d5de9174469f58113e2d3e3fec3878f8b13527d7a703faa8f9faf48a6ff11011d04bb52b0de8c30c2086b87ee1d67d46c048f8e4ae3a93832fdcf885aab3cea0e918b445da96888d2daed3bd8aedbc1ebc90b00caf43ffa936980427668930247327d5104420fc3ae34fc469952b14d4a76bb8bd65e7a3d4f2459c07146cda251261a67d42cda9035a38c7e38cea839a64d17c5ae54fc46df37a22b7ac26a8d3069ecfbf3f313e5b563949cca27d645c726b924d386b9bf6c495139ec44c7a71c7aa263530e3fd1712987a0e898cca148744ccaa138caa1283a1e73388a8ec51c8e44c7610e49a263510e4ba207e6b0243afe7268121d7b393c898ebb1ca244776c7368223af6dc3944111dd71ca6a854a3ee65ee9d2adb98f7e7575f2489ea184bbffadbeccf5da61fda91bfcb5cafb9ddcd21a41e63c2631d7698090d74be42e460020337790833dfd8e93ea4638def3150a3c85e761847f7493081819b2cba96a6f0eead3ef6706a4c80cac3c3c3f36d80d6f8726d4c00dbbdcd57879b6b48ef082c35d04cd8f17aff7920fb57cfd6c323109e9d897bbf882fdb977559a9fba8bbc480e7dbb6b4d66e210c6d48ef3acfeb3c120d37efe0968c5b5ce0161f2a13cbef7f7a42f8fea79ef05d7c814b1858c7662b69fef2f14d6ce39bd8c637b18d6f621b3366e9e8d76cd602447152bcbf4a952b691e9379d68c357b1a6fc6c5a4797394d1982fd33467fe35e322bee099bff8e66330cdc360ef75308b878171fe05cef91a0c7b1738c59bd8e69335b3794c953be1694173ec75f8b366c59fa6cd9f7fa6485b6e51f690f9c9e0e7e0720807972cf00a8e36fd6f7089abb5c923e77fc2e3311dcab346f42bcad3b429cf57519ea9577992a237cbf393294bdacb7cfb295e268d37e3a27973e6cd5136f32fd33469fe4563be8835d87beb3906f790791813208fb166264226481a46f3fe26430d9b314d806870b9630697351e33b334471936af4106bf9bb85b5a4cd1c4d5c585467b8926a63906ab82c060558f6b94bd94aadc4c959be9e858b9c345a399af97d79b5894cd97695df82c73647f177c7a135a54b9d35c51e5583e780cd9ff4b1a8b35f326ac5439d68c3594fd51587fc29ad594b066b80ba4895693cf9276d2a17c96ac59492b875aa690fd45342a94cf92766bd67544bdd12509f020b4214b40da6603896b65c17f5efa68edbd6437ca2aaa7390b5768a56efb6b66dbf97dee779e148732192d64a2b4d9cad5cc082eb93f38fbffa76de078623592a9528c5194f14a7e4a3ffe10df8eb02fe52831069ec51794213b193381129c511d99f8c86548fb65441ba50f651c69889a8e26c04ee292b115c80103f117800900d0ab4d91fb45211ed4780207c5458967ea5e3cdcd0ea85127e7439bfda791469bfd210bfcf0c50ec7fee77f5224abfbdd0541d0a47bac69b3df3bbfd69a749faf6994d94e825c8df6070932c6feb4194471c2ef9ac7bc6fd1fed81f7087adb5dc6faa34fb638b74ece361fa6a5fedffafbd5df8a7ff78b3af96e28c0d22ff50045a4ab1285618e4ef2b8dd2f4d3ebd77ed816e997570fbfbfdafaa9cbb27c1449964a2b2b2ba5d87d3ab1b08c321b2ca3acfb303c6badb57aa5d42badf7adff0d59467186839c15c140f996f6e7abfde4feaff6f1e898a8a35ffdfd25a3cc4b7126542249e3a87b9227d395ebad17d8a046cc5ca8042e842428ec14926eebfe5524a4a55ebfbbbb6b5b5bdbb6079d362a6dfac9ba5940f6eb38499190970cf4bb170009d999500984b2a5df6712220159b37d8b06d38806a11108095921fa0909017981053a28cb690a656fd166d8891bb8e5da392ab6e1f978af03eb8186cb6c794b6d2a7fda19cb81fce5f8eddb1a8d95f7df9ea8bc7a89adc058babf6953a72b756834ccfbe981c23c283c20d1c72acf4f0528fb874a7892ecef792bfce5b09320bf9f868d823c28286c54066afa8f3ca0ec2f12f29889472424123a43259a3a6d1fb9bb60fb2becf9b62cd1af165bc95049928e611eb8d6eef65a6bdda248d2ededeebd2eb8fb15bed9855982804a25534fcd5a5b92a45f5e32b4f24fa9b4d84e5f326455682bf8f52bdc65212d3c43285409d0cfe39b898909ed18ae3d7d208aa3f2feaad4abd04657e585cd51067e1219e6e97ea81b8378a15a27a1427bc1ddbb6095c7b8f5257e79f9e21fe231f1a0a0bc890785a4611efd5229714d049dca77abd7aab5eaba3100bdc33234643b1731ed60096201c22c3f54c67f94f2fe23f1cf91500e77f10bfd90bf702db4e3afe0161b6eb97da0080441151e2ab6363b09f2fbb08695fa48a5a6b243a5eb56ab6ea5a2b24385870aad4d4f823c712db7d81a89161b4b10c5618d1ed73cd622fd89f293fd698badc546c14f74c12adfd2fa55910cfe69da91fd59b04aad4dff15ac42f3d7593212cafe261e8fb5d8fce524c9c433cba23f4b8630c6f8316eb12db6ecad12d758d60873d589700dd7ecedbcaf52f01ba9fc6a655f65d5a5e0d3b3aa3c59b08073a8d05c483e4d3b700eb3bca16408fb9c2c5d20c2925a6cb866f35932847b700dffa8f050a1994299aef811f7068a679280d2ef1704cd813cc95a6b14e499ea7677d2869329fab743f0b64691a3ce81a4afe3165bcfd22ccd56cf88a5b5a5e5fadded58087db27b90d3fa0541d9ba7b3779d61cf4a980743f55d943317c20fb7bd80ba232fe4d23eb576f77f7200f0a7d3c0c37ffbe0fa742efbc5028f750ee8f27e8cbe142413e5e907f2228d62848d18b74684f8f1b7fe15a240ac1eec52ff526f509c25f5e0e020a9ff0eb56d484a138cafc7b90628f40f8df0ef4624c531cbd91da9a1794bbbd207fb51734226f088adf17966238bc4fe277bc9209f7b73f1a6bf8d7d2b6e97faff5a7b97bd13b17f9b52551047ee2a87bf1362a83cf32fdd03a415227ac135f0b854e24fb4fa6f4a3209bccf4ab5190e7976df77d5f58cb3002c1d0e4a4340253282857adee55b1c86e754f24f15b71c1786586e6e5826b52c458152b4c261530d35b618271b17cadddee6eedbdf7e545a775efb5a2ab56f7aa5864b7ba2792f8adb860bc3243f372c13529626cadddee6eedbdd792ae5addab6291ddea9e48e2576bb7bb5b7befb527afb5dbddadbdf7765f8995b997ec582c56cb962693e9b5b4b4b858989d980b173b31173645cbbbd889bdb4745ac480d12283c68d0b062c40010940801007304001623ba2dcf202001f86c47668b8880143864e8bd64bcb10cf941a4f241352ecae150d796969d1f9cbc34b8cf7bc9b6f7969e9b48801e3c6e4992c30aef16f478a2792fd44435a620f23460b1d1f5adfc3cb4b8b28df0c89edb8880143a745eba5e5a5d5d2f2f2d26ab1e1f82d2f2d9367b2c0b8c66f91ed106327ebc078e1a2f522caa309b66288671a4f2452ecae150d318da3f9a10ad338dad1ff68f24c1618d7df8e144f24fb89868cad77c1b0982b3c6c63328da2fc435a2f2d302e93c5338d433cd37822916277ad6888c91b4793c91b6d091c4ddeed48f144b25fbd8d3231302f2fd3e5d2e29944d95ed66a88671a4f2452ecae150db9d692dd7dd3e974427d6f6f478a27d2271a62bd279d4472d5e1147caf15e56f88671a4f2452ecae150db12e40d1101a443444344474573642c083f2bcee3d922453a9f77c28452281b47f92a8d3ea10b387247f7f5a1d5f0e9e1cdf97c3023e44a67cc88744da3c6e4770e27363691d02f2bcb96931be8ecefdd3854efef4a194d5dbb739680c25f5f6579886bf9cf42798fa8bfc8ba9bf4cce551ea94c2754c9db4f5158c9d2b2f7dd87fe1dbe0101e9b9d3f098fd4ccaf323c9f2244925edf11f478bf3d8f77d246971d93fb4f5a2b0c99f30d959c827048c823c4940619d037992805498f428f87e0a9fbc09935efe6cdf47927ea6f2f9d9b2bf58824940fe2a3f40d69070cde4934827a4b7a3b72f52f9e5911d6a9ece844923dc05c9221210aabd3100e0cec9f497bf37f6787ff977b7b74aa5dadd411449ba48241292cf4f4891ec1f7a2ec1a71f7f759ee78d32f265265190a748cbfe61389280e24002058e1b1aa26968c1124da0c066e40c32a03d4b4c8127090fa4c083c48efff5d1a67fc59ec395a8c235f728bb2dfcd852b39f8eb7244286cd183022dfeff198e616a63954115517776ff706de5849a8c10d2f108a4112206cb8b102153ce10362e0f1a9dd088002361c99810db8700338bc40c115d6607b01146b00b2e3cfc27e93b449f398db7b73dcbd619a5368769cc7e84e3e5d0a34f764f75c769cc7465bff7932da3c56faced2ec249fa30d833fa032fe2a180442a5f15f61d00795f14fc1a010a80cd8447d8150e8b1845a76d008b4ec3f845aa6b9277ab20e99e69e08cae08de274f6077f4071fabb0455b7766b3cfa05e80309d2f2945eab409ee06dc847c3c0200dfb91fd2cdd465b2efb68b3f9749ce31a56ffc6ec0c28e8810e8204e10c5fd8f12fd13c269a81086e40c30bdec0630d3b3764e005320051a24711e600851dff92cd631298c10daac084190fa670841dff8afdd6a6a3e0a766fd145e51b3fe094e51b3be094651b37e09ea642a757759527f75833ec4fe4c73363092cfeed27f1c65d40cde4e4076f3384fbe79ac16e997ff2a9fb5e7de8ee42a92ec7fde9ece01d9c3fbc6017982b70ce2c01f0dab44bcb74fe4727f9829901d3e007df40bbc350ff0f6dddb924c81ec10baa51d2778bad276d9a24dff1b12b9d3848f71b4e589eaf25ce52692eade40daaf3de38cead3a6bfe8c70f70fca1e6aeb936e94e133f1ad6b5dc69a2e787b7d3c40f1f9e8f86f90071d97f342e17a4cd5a6b2da2779ac8ed34d183f3d18de0cd63f7e62fbfdd5b76dc08d71bae3f702e48f6b7d5078fc72a8f7ef9d79eef23c954ea7ebfcc7cd69ed40cfaf2c734a6e32f3f7f00d4f447a1b020daf49f41bb903d0103a0b0234134ac02f406e4597f641f17c8fdf5fc72111677b3652f42ccb5da1097b84011ddb9276ed926d31c4e0eb94719ada51d27686dd2fca34c81c82006e38cce18a851d45aebd766a53254a659daa43f394c89b4b4e3444f9b345bf0d6b0ced64ab5af28de87698ee803b8e62cf6fc612668ae0848e43acaa899da80fc9ac76e8d96661eb3387a7ea55997b534cbbeca14480c78e4f3d6b21351bf773c4c776cc82bb3f65299c6f5b2d03b3a6fe412d5117ec33ca26fd85bc510e4db742090a60e2405a203473e6991ec3537399064ff160ba859d1b057ce7238e2df4e615e7863dd9f285f69fc4b2ae37fbac91018f4755222d9ff522864ffa64bc8fe25c5794165fcfdbfe6b4a834fefe37a4b3a484ec37b90545abc5ca028ba582051595d5cf6a95728594149515542a942aa0a0a488a45227434e4e4ca860625232859212940f0a7592c2e9648a82c9548242a9440a2149d21348a4911346a3b109e328f68862c88430142d4124029500825f90eff392e0791d12baee02b9373b95a91606c571f7ecff82e274bba038f5a605c569d4584b92dad28e13b52aca426843d6fe50f44598aa278b69664a6bfcc6ce4966233bb51d7f4a9e27248a63ff7efd4b71baafdf511cefeb7b14f6c1688b19c410704003a84c7f871980174065fa2d56009599007da16a8e10140d09a03299f69912c26395c7a33f2620eda75068ecc671299fa92c7a0450997e4a653a01350d540a64c85d5f27f542eeffba467e9d794c085a79fa3dfa93ba95a794291018ecc84d03929429902ed8209fb566abdbd17944f692de325db921aa1e0c42ba436dd83200c13f7510fdc9e2540163c5cc0c8c8ccbc59222f79f2eff2a2fb9ff6ca1aca4504c327dda245349ee3f455f18fe6949d4ec17e103d0573f8807f099e47e57c9fdde5591fb2d8bdc7f001a2488f2d4219fdff7654b85b0b6db4b639e8751fd320294533205624409998e407cb987f73a4d7acc2b3bccfdb57af544b6f3dced519caebf6b8ad314a7fba6b7ef105ed051587b6fd70d8116aa4e2655989212ae4ea655c80a5b412e60010b5820caa10515d6d593440209245ce00217b460051d453fedae21206bf9d5ddda7bf18cecce31071fc29fe7894694ca74421ee441ede2cc5e8b047b6dcee63e9bcd5ea76ec8c067cbe5c22ef4c22f1485611886a552e914a2e850ae240cca3eca083311359f9fedb3a5a0a65042d5c9a40a5352c2d5c9b40a59614b059694741948d56873350e399bebe917d99c1c6c10db637336c762b15af7b3f9ab6d2df15ba25f6dbdd4ffcf4291240963fc62a92cef97a3ec7eb5ef1e7eb6137cb625be5bee3fd9927cb610fcba0fc5592d214318865eabd75e0159abbb7bad5e6badee5eabbb7bad5e6badeeb5babbd7eab5d6eaeeb57aadb5ba7bad5e6badeeb5babbd7eab5d6eaee5eabd75aabbb532f29f5b2b082147433f2fbeec6fbbeeffb3c4f241289a2288e2808c11169348aa108e441586b6ddbfd99a029a59492f6deaefb3c59addf2792e2388eb25a5638905da24895564a92a59235555a294ac90d2eb5fed166684dd0b91a3dcc80c964e41d1a3bb8787b010a7bf1f68ba031186fdf080ad3791a4481e80ff549414f9a9b69f3754363df6c4561353533c64b0ccc2d08381fa02fc0c4a0efc763a4dccc63a41af353648af22469ca9f3c33cbaf9a1dede730bb1c837bdc87c16f22d4b0ce6ebef74f61601c303e89df815132616f0d236941a0303206359c8fc74e38a0869d7abe4061a727e07cb2ffc92728fb93721e33b10d79cc04a8a6c634ff532992b4e53269289b18954350247378cc24477ef161d7759e088a429148248ae38836ea1847dacb34cd978e1db3d188245624248da48344a2bd4cd37ce9d831a391aadce9435234714a0e51a24a88244332318a0c69626282ca69f13538e6030b980e2b6c54bc7c6891c32206d361858d2a97ca2a5e5ec9289b2931f1490e5326a7c6712ac931b8dc517b294b5a2b81c248647808050ba18c41e0201d34d2d391354b116558e69477c0250f1e72a1502e195c7764bc64cc9789d2222412894c353016c2411897ac1e568e6563d55834d68c9523c5c5256525a596c223650915904a084b8b2ac7c2c2c2c2c2d2d203c8ca41715eafca794c8666becc1b95495d892fa59c28a6d4c02d403f54e65f84bbe15aad56ab4566f365ae6834951d2aa38c5563d1583a582cdacb34cd978e1db3176cdfc4a44c0363a120a01f2ae32a2a2c96100b092b09ebc6dad13ab166ad56abd56a9d4e709ce46853884795cba98274acdc4153698d720f3566f050e248e2776a7c143b3cbc3f19039296fa93acdd6c34763006faf1c1a1a0bc2ae808ab0666cd5a079b0e5b0a102925252525258564b1aa27882af73ae159fd79c2a3caa972af991b8b467bc1afa781657ec698773016c2411888ca380a55c262b570b489e3c1d2118359339313928989898989c9094995abe13c76c2539281cb9c0c97b81d7059e3e1a19933e68b55d2b09863708f9b77815b80a88cdf984cefe5509904070fd1272412894422d1975f33f365defccac4a14f2657785670ac28b1449b3bda2c098d4aa552a9f42759faf31bd156c00cc38a61bdb0b068e22fbff8b7dccb301ff32fcf3202615ff5e27fac61dffcd0c42ffe6594bd7881c71ad6f4f0c53162c468797d0c4ccd97895de20b9e09afa2e6d090e62eafc035bfba6fee5eb8bf6d5e21aaa839ae4f5198f8f55714d6f2f54b688ec5551aff935cbf44612a5f5f4461abafef1496f2f547d5ab60d7f2f6cd35e5afc8aeaba3d2f85fdadd01da2a8dffebbb52559ad5db3fbeaaa62c8118bf755c5acdb13e7747cdb1446c35c7febc74749766cb1dd96b39becb75b8be069f3772cdd35156f33a0d13ff8c69f9b306e6d65e2a7fb6acfe64a5fc79529a95b9b280b74ae37fa6bcfe44e59a052a53cbd3beeb5fd8fe541a2ba4d278cdb13e95a6e6582295c6bf2b59fe966797dfe5d95d0ff7bb9f71bffb1bf9733debbbc6d7dfc816d3fcc245741e4b1595c6f52aace33538e65d18e643985751736886f9184cf36894c1942a48d791e908f33a6d858cde9f8ebe545a21d93f65854123545309141482c12c983ee0fb5b22adf7b73fe683cfe293bdf5654924fb9f3772d3baf7faae3feb9bafd7f17a7620d7b734d7ab749596d666cdaca73b5898e633cc277803916012e1e5b3342bcda084830c83697ec134575caeda4c15813c2d4d6646a61c6d97661ff2240d7b2733050283388caaa7630d54567dc5174065150d62e66bd31cd227d787f17703795e2017e1790898af6fcb93f5c3ccdb9877f92eefad1ce202e510ddbbbefb767d370261fe6dfbf744657ba280a06d8e33babfa53dbb17fdfd0ebfd47285dd727d980f6910f6657299e6ed873dbcbceb2bbef769f77a177efdc51dbee60b9f36b28b8e40982e1bdd831f7a1d7ef9b08e00a899c64bd9b581bca50dd4f8a1d78d3cc4bcf9e12776d83e1d015073cc79df96fde3d3b146ccdb72889837cb2164deda409db7b481ca31a595e98146a6a4acb208cf33ef52da9ab208cf30df305f7f9829cf9a61fe3c22d78bbbb187b37b1b81ecfa6efcc17f388bf00c539e1ec8e30ffd43995de5d95f847fe31a564b2fc27fdc7c5cdcccc71a2319343f53e3c9333faa21caf7ed08c40d6fac517fe675bce28bedd8039847a78d6c69cb3c6d188cf9f2b45f32e5f9654bbe9016fcd1df7288d1cf7c8f3dd0fcccd7b1c6e8671edf6f7cda18e1ceb47f87b83ff3615847205cfff2757cbdc5dd3786294f1b2f3ca37bfb263e6bee2e9e317fe675fa05bb3a373e6da0f2ccb75c4fdb345db72bcf23f2cc8bccf2b481a2f9469e2947ef34dfc2e70e36b2e8efadaadeaaac066aa6f97e9aaff8b491eb3711c82ecfaff814229fa2b781ca345fc71f6aa6793af680ca34afd31f7444c8c8053b776083e08d06d3fc38c8c81121236d7a5f22d93f6c7c6d68c0e6141e6a9729347297293cdcc8f56f0c61cb5b5e9f219044d81b0d3e6ba6f9c64df37da599f7687b824ca9613f053472442805047f8ab479dec834a84c833bd75156a2e1c813bcf5d4d202a85c5ff4358ba8e8bd2b7b78df8da81d26ca941af553ae91234229d72703360ff193fd16c9fe37f28d4c4719886b1c797d1a4669be3fb25f21d945233e6fe4f1eb281bbf45a28a691611e127532299e6888023e78680245b9aebbd875abfb1fd1f3a1b2db22dcffa1aa8d93ef9b7f1ca5bbcf295b6b95271bfc5b8e2ce1bd99efd4574be40dcafb8ffe2eaa33651696a79cb14b0a761aed2e6dd3eb529c1db57965fcf408a7ef4d1304ad21093d8731e7e0c4a2086b4a6c046a4789bfede6ff4e54ff32739f3672ad7b45ab9c6c55ddcc5e5431b5ca2d14aa98f4a331b4c77da0952c5b3de59df7a3acaba0992754dd0c73541dc689a7fefb709c8fb3a6e9adfc3e6e968dabc10c896e7f641b6ccb77fde9b6dd3e2c05bc3ccf79507711eb3b9dfd9069774f4cbcbd2ec4d5c834660620a94bbb7c1a5d9697133f36de70d13532ad3a0cd062ed1b01f1ddb2142deefb7b497f2559ea95c67d0b9d71290321f6369e58b346d8a3f41a0afb73cbfcf7a79a6b28f444ce687f93adef69857fa85197d0a4c7764301196756b274824fbb7307892e0ed3a718240b23f0c3e8bb02a708a79031de02007cf4e8dbffc3b08e4599aa1640a04062108df53847f6b18e9a3612e26680e68d301857539a8391667830abb34a039b716030ab35f73eeadd2c080e2f8203bce6d0d766ad9dfdaec2dfb9b1f8636e4bd40202fee06de720d0383340cf6bae1a5a1f73b4178178ef9f44b8a433efd158a739f9afe5df7c44f2b53205bc0e57bf31808fec0dd480a040aa0fc7382371f10c9750f480a040a1b981bc205fd00c9024eacb866d0567328a5790268cb4e50d33ffb5fd0084a1092fd2dae8248a8559008190814076c82cadc6a0ee8a3d2f807018b90cf5b6b0d69b5585460b154a6a0a2b2f259ad52a49092a28a824a8502051494949054eae4092727264e30312969424909aa07853a31e174322dc1642a29a15422839024290924d20809a3d108641cc59c288647084391114422b00820f8fdf83e8f089ed70da1ebee13f9e6fae0adad7582e2b87b1314a747a38c6e21509c7a47cfa1c5a5ecc234f70349267197616010400fd31d4a712a18845e41f69f51976b24baf0f571834065fc497c81503613e409deba27df8569ae086cc824f632fd4c40927fff2ccd280eccfbdf1fd0fbc405925f1e66b4790c04427d39d884f10848c8feaf21647fb3ec1a09ba2c0eb374a428e6b0a49fa0e0ede69a40c12964ff5e823cc1db1361bf6badb5d65a6bad96beea83b852ae28b9fe794d4872bc4f6da9be509b34370fc873b479c9965d066580910fbbef7affb0249ac61f689b2718a477409ee0adeb488c5d6267129de2bc695ca24d1ff2242d2cae55c55e0e6dc85bbb3cccf2439648c78abbea639796667734ec77b860e8fb48f2f6e0cda2a44e4c4a5027d39ff5415ce9cfdb0e2e04e901716d7a8bf166d301798e361f6d8eb7d136dec0db78b3efb5fe686b73bcd93f479b2d47077dfc35dac69b0c9000bf7b7bb3e6267bdffd798364ffb691aed2c97b33dddedb4d7dfffb9d7f3baefb9f6a4bf3cfcff527992d88036ffdfd5d09fab0d5559e64aeb6164101710dbb2578c3200ebc95448040faf4b4d9309a55aff2a76321fbe950f8bb908e81b7d389647fcf35ecd6dafcd1b06fbd0fc52e8f0e627d80c4dacc90fd291872b534d742f61616cb63794ccbe3433ee4495c2eeb7299ac9667adacbc4e7b92b63cdd3dbc5f8d2b1fda90e563233279ded4c09c4fbf2ce3aaa1f9fa5dcdb15fcbd3468b5cdf055f1bbeb51e64fdf3d6f2e5d1a683b7174c79a63ca63c3fe63bf056436331d844a5f19fc1a00c067fb419539e264c79fe4bd95d9a75832920cdeffeec59108ad3a36d08c97a57597ee3223a5f1ef65d7e94b9b8609b57de872db1e29b55f8862cb18eb21e47b4d861a26b0bcb4adbaf6f6b12902881853694c1e70a6978a0129c4009212620811076c6254a8c316db3ef8c3cc1dbd9b3db78bc8db636471b3dc1db509e5ea8b4a95c8b82a064a866460000008317002028100c07846192648920f914001472be5e5e4e180874184541104629640c2186000008010020232334630200e2be49081a17149bf9b977d42c95346061a08395c868b7440a6acfdb077563f534a416d5e6e3dcfc5ef89780f9c847d177a6059e8b5ccf2c71060e63b1c126e55572426b893563aca535238e53666e03047f93e23b42e3eaad378327da4c87f73d769f54aa7042671e122422dc9e6c8ffe8ae82a9857a0909edfbab23ef8a9b66f29464be1231780e7f459819e3d3a0be2ef2c7928753cf1f7938f0c4e527875511feebdb86a6d69433e058636dfd35f905b91af79bf44adb6d44dc154193bb6ba74a476b701fe8241c0ec8bb9d59945b500062f1488f6b00d1ee2a4c9a3346c8a488ec589e7b5e5fa53e3d4b94c84802393214ea9937eae22620c322eb6c8658ba8bd9f4318fb23ffe25a67279896da2776b6bb02d73e13770adfbbecc1c887a64ce462fde5e2c6cd7c4a48ca05a28e414b37c67e56d3a31ece39bda6f7440c4ec787cf3b44a6eef184f4ffc772e971dd7ee45839544ee623ddc7624711bd2114a3b871895f9f28d9caec7940586d87af3858990a8e4fd64dba61c75781112205b666dd2758669101050481183cf6db1b53afaa70094ecab594c2041fade5a7487b540a9014ce33ca2679d1c84f00379388aa7b77bda2b2c2d9d4dcbaa1e7d0dba10c13039002b984dcfed0d5ef4dd3f2156b798b7dc50860e408f2be260af78cc48063a909015273cf1757f7c82ccc36288e4d476b1d7761740922bf4c662f8aaf8e66e7cfda00843c7980ddfa20c24c292c5bfb44a879b2a7e2210998655ecdd2c826031b7510fcc885718948454d51c40d75cfde34f06b2b9e1625ba56e1abe47e1c31a82cb348319dff0da691eb14a2e6c1f9418c33e14cdf7b1928e556e4f1293957955d443dd5015f2cc25e792e4a5a9de1cc1490208ad23bd956702af8e676656ef55c69e12a8b2616390bad83cf09a1a8b92f4e61d1586fd09ebfd2e5d94220f7ffbe03705cdd8d83c4070fb01e65371abbebc22ebeb22f4e82f1164f2e1c70e3d1ac2bb4b1580e39e3719bb6da0487e3d2bceb147a89227388b434a90eddb3772407311ea508c16cb592e47e61a55a1e540c79a32d52bd0a40127b2898eab5243185d35e46c03d7bc8161327c7763377631cbee06b812dc4cd946c09768554622ec2d9918d256daf6dd260171c390a431c00a08d5486eb5edaac8e096f813d1bcd9c21f3b3ed347254ad2d07c8fe3d8cc9135e76655ece18590c0299b9833f8b378e7b41629c22c221606f8784058fcaf993ff82c8e13e289710acc0fa8a9cfd156201b29085b115e414198160ea6e2c0ed2748177edf774827436364f252e41583486c0409bc65350ae87be201fb614729127a9b9d2e7373b964a8e159c10549cb915590da2a570b1d76bc5eb7049ac3e989d4d917a61c9000cd9429529c9b948885e413506974758a7973082e2725c39ca3499e4a30879d2848040cbd79694fd7121b1fbfa8d7f8d72363fb90817f948dac04b5ac39e522fbec7aa748a9421deee95cdc3907743be6d8b5882a48f886109f8b6a9ce4910d3be87e3a43506b31044c0fa7c15371d15c2e4420c10cca274c102cf447949102b14534096397fa2f7f713770c00e2eee911c482dc4ba2abcdb3b6b2a5e2a65a603fc1c2e76bd41bc7b24830cc61c916dfb678e253a69a47377a26cf4a798456c530c55c9708e0058e195d54443f34e95d73e542b173036efa52264f7b2a21303d1e92d338008d71643f8b286d428def02f20c15fd02f196c6f14f8bd689b17a851fbe06d9074549b34c9badfd32697b3911ff10ba74b2d67c006dff5de3039707c65182391498caa0bcaf32a75ad4e80668bfeaa1881dfbb51fb986b403839adf832cc7339362fc632aed5b19ba0eade76fdc1e03bd9198a770ecaf0a47184e9d51c4119185a93094736e31c14cb5205e2b87f4392809c45d0ed7a29484a5341716dada8379116ded46ca52dee31a005357c9a9bbec387913a04e3549517abd8037257fb46f808dc4bb08e4db2f479c2e401926cbd9d577feb0a00f77e925d84ab917e8244c4863ae579c8c0cf4801b22227dd6a9193793d2fd15487843e8686481e41b946e94ea918eaa36ee003efda94a139aa0a606396e4888c148c04c4810b5f2c8769dbfb6f70e9f89b26861d2d482b8c8882ca9be8aa118c93b983afba4a3bd9d20b8d851ffc0adade76f991b8242d666094329e7ee727f7cb1c21909afd9932c1dadb02176a92396dc30661c6f3c8923b8cb38ef6e5233a7d07bdd1562391e53108c7fc78f4c4d25c1bf480cac4131ab4058da74425721943c2e3084b48403f6b6da0bcf55282520eb3c0d4e810c0a3024c2cfb54769a5ec0cb5814291840d12a2cc095b1f2696026a41d0fcc8ff783ec31a5f24783307dea8baa0a1df0bf217e6f1080371cd20cf8dd8734692c0736d9bfdbb7873e6fd8c6633eb777b2cdde0c10f6a9e53af6e42df59881c592543fde89eb12f78bcab78c3d8139e3bc7eecdb1607760500d7c8aa91369a7c9f66ab8a11c012ba15d51f54a035d97089e85dbe447a063b42efd60aec43d4ad0f8ea6d9dcb52491721dbdc6a3fbe4e2f1e1f3c0bfa3a60c1a4cdbc32d2edc431d63e2e4b495aa53876f86170c0fb4b0dd35f0083f5eecbf0bf4571f402e644738f5648a804e5ea01fe18743f81d89fcd48d1272e0a3f68d9a22aaf2e61bc53edba86b008374f72b611a3b0ce6ea514602dbafdbfcfc61191cc340be65ef02914ee61cb9ff6e7b398481a455de3f3ec89dacb1c43c255fc19a184177b76e0796ad01583ae1684a2c072c9057b0f194d569d7892b478299613eb4ce33679752361452e0ecc3408c924923a7470b8d0375ad67c06496fa52a8b5e130d8bf7c6323d56afe1b69c99908c40bb09647ffafc98be5ce572f3815c2022f81ee92550c999829d85760ecb23309d0ee9ec2d2893a3e368ba80115d4d94deb397b49a39913c5baf298b1d59bf917d9765e0150454b1402a6aa87d8a6c9b4fe16c2aa335403fe43255cc408ad38bec8e5c04f43609b5802370f40a3baea19908a7debec67d6b022c71bef38a313ef20954c54f869e05e57b01f51356534f5a5d3681bd528abad2bb1966560f6e777f5a5ba5d12db28f2a05ffe5ff5505bff7b96648b1800c407d544a4ae3577ba0e802fd9dbda122ee4774701190a7035030600e8b485d4ee3e2b17c4e81ce731bcf9031b7e79b01e333cc4e1c02f31e0ea20f13e864d0cfb67e0e69c54451bc81b8a4579c014b177f456bc8d9d84e7919b1f5d5bf2dc9c3f31b96116e2f00bc92b6fb3285247ffd604e5db99ef92b6f6d1bf0d2f19a38d4e6b373a084218b16174489b366ae5e0b6a25dfe980ed9546f128c5fac5b4397a060f8bd84dab765a166d6fe47e1f3a5f48fb2d26fd2796d4bd84b35045d926e6b41fb5fda7067e12975e1dc1e3f564df9c6539ba1aa6193b5acbd949e4e3c7b9a0ebe2c748dacea6e2199edb057e6d5762529fa70eab42ae930d39115fcbc63455cbcaf9b3058f637e5a1dee02786736e4a076691b72aa3d0af7d7163c87c19544a5494522222e6d954b9aea00d8ba669cdad3db2ca5ac2655b17d88db2e5e4bbc64ad34f3b945b8b519172be698b99a2adcb34000f46a2d948cc2644e137d004c84bb3f0a8d5121249ee72ccd809f9298a187f8fc3bdd36872ec4c359a6c9eafb0ffde1c70fa1f75e9683ece70eb53a18601ba6d32a936ece38a9530c9a3634f7a449df5e8335880996f7b762d4e5858339029ad26cb7235e3eb7c6ed97270188c4c6abcda10a301f3f1244af05c6f41fbaff9c1e6cc2f1b415edf0b6ecef703b5cd28b945f7d02d7f2c6e9b9eca596e35098b7392d6f36ce3b03819c2002b36ecbc8660ecdf69e8be7e8204c71c575dacf26446716a3f6451d37c2a42dbdb92888d10e7c49a676274769968d32b2e18842888895f4a65ea5d5db06f48ead5bfe56f1aad94ab6e9cd6b075c272578a250d69d4b00a4440329f620d64dab6d31a4407744198970c08ec0224bac204ea8efc8d55f91ca6df5a88b47869b827279ba71f76cce10dcb02600d81bd9c35969e18d70bbe9eaa96c06944fea8b5a8d71b684166dcffde5d95faceba683958dcf520e0f89c06ada0c3b07ab8279d03a453b21ba9b87174312dc4c8ae2edb0917cbfcc7d3ebcf093be5f62d541cacd917b48e404b30e01de613a99c10a8ab5b13524f42b2c44d8ac10a06e6e47d88da355cc6a74e89474ee9a167b430e05a84cd854c2c118fea367f6772124ef4aee8f67fb7d8d16aad29ea93e73769084162c59ed09c561d3d3c9c5cf32361b92df24a81c61e08251971c3d349470fc8cdc3173fc08dca165e240c0076ab3376523bc58b83324180f91a1959659866c8467a09da36677790a2b217c5f0ee06f1589ad96776d058b49e22af13a8114ddec9d59a67730e604284127c8ce7a6122c7f86a1030cb4aef0244395961427c533bece3556435fc89275e18ab93108d63cc975b97b583aae0cda1a930fd34808c1ccdf2a344991b9338144d626045adf174a0191d7da065316476053577bfc8322ed2cbb568cea93e8b696934adf7ae59df4cffaed4cc524b2a05579a3009e320858ab9ba4a981b62a8f5254215605f83226851da8a2e45e64852dd41105d6ffff3ed31db3617c660033b8f84e8ba28196dbae7bc689f17d8fe857b2970d49870da54e8e401d254ce4d3bb0884fb7f9d976eb19d694c24f0a1ca314e6683eb15a53fd08aed397814ff896244ac0d0c2cfc9bac889f0d50147e2c957cc9bc37bee50426a1b6a1786b8958895f978a557ee66d3708b2ecbf9a3b8903ec25536bfdc2d9f64a82f477b86cf54bd23556fbce4bde900658012a63d184009cb9cdfd07cf1a770ef0980fb6263950842f3e92bf9cc08220923489ca9510151cd36b4b8c4d6d93a1a5b6c17a0da3b4a553cc88f1440eee21310027eb7a47c0e5336471d9f295680d25ea0e0f663f540a1eaf99cfb19bbf62a3b556e75e050cb1e777b413f48da4a8f7b578c50beb0a898d0c3cb0103299ce01c238b11411a7d06e8c1f25d56ce6f3bebd3f5e2fd4204e93587acbf7ba251cbefade6534794b5c627ac9182069b9ba57f7fb7f3797b8973ba429c155e72301ba3361245cf6f1f9f33b131a3ff1c5c2c31b611fc483a7612bf995ef1d0f17d96319c849e7ee95ad9a4613b4486037dd7a0c4e506dd0ec9162d30f7d013d0cb6b14134788ed32204a68cb4000af6ad6caf81adacac68a3fc00c9ef874332a2ddc669a2ee5b2ed35d82ed74b0013d223c875a5dd6544e9b4e0150cd8c2df23ec36a1e9563fa415e0c88698801f0deb6e20e756dc8b43c929f14fb45ed5e8d4a7cd307e151e2c4969927e80a153607b8937b39d3f147b0123886b2f52360288893bba91ef50e4e9dac770c3f927d700248dbf92d2eff4aa5585085b6ee6a55d2186f8d77675de92aab92b9e29df4f88d1fd9964506829eeb8090ac0d02eeab520be43941c65466a9c553e5d76e1b08d4db446d671154387c5dcd6e53647dfc0e6fe0df337920dcadfb0eb66245ab9a8a8bff32398029a718fa856af5414cc7d8434fab2318caa6ba709c25a9b6b11fb4dfa8edd864e9832a11561f0cbc60a6caa386f0844313ef4aeb31557fb62bbae093a929fc2d25cfc5623614fc465e80a7b9bcd3f1ddfb56aa4a7855588930a36b860f0825aa93b35215e50ce86d749674972393629b1e1463927a09f36907fc24bdac0baff43ebb5d200d44ac46c1c92085b26cdfb7e5da5212bcb81a5343e8003b8b8c234932bcc1f385a5c747410f7f30ad17d748bf96554ad97afc129df5f1564751cb96586f296a218dcad6a38b1886e7905d4134b4ef2a787b8daf5867660ff0fae41dbdd245320eba0e014805efa09b925d0a6ab579ed9294fa7e7d575282e154b9b81e6d93a8a6429fb540655393a4db8a881d33e8abdb65019778703071fbba9e627d1081fcbcb1a1a32969f09257b5ed9dac589da4c8cb5f7fef93e50bf77043092e4799ac172a0749c26b1354f0c31ea3ef5f690eb256deb1b6a537b17f7d2c14b23432ece0d6b9ff96f16a44005a9b3a1a20c44daa33690f8979f5e32aafedd98ad69c5425f3ab4a761ef52beab386470ccbbe66013812136fb09ff20700f26c1c131de8a385343f5137b18c27323d109ec3c8deacc163684b247bd1662caad3000f6a88efa0361e95c57a0f03b6f60a7916b0a0a0603985f71706fb49a4e8dd355927661ea4096a5337fa365e94e0d4f4a35eb2e49a6a4cd0964c359fcf9ee6b646f454ef417ecf390c81f588ce1f522197cfc8b63660feaff30ca842a0ff5a1b492e85173a7e2e7e661977f15b8d6107f060cd1add887b65cf75c69ef7b8fad10140179bfd35ce9e198f025665b0ab8ea9514289b45a2b12d7f4988e04ae263107d676eba5294603bec57b0543d616cab6ce74d2978a48b6dad13ef2d54ccc82ff179ffcd5c2352f5e9430e4927450f416eb0d8363a5eb2a9462bf01c1ba697e4b0edcc9a91c4b06d4a0af68794374c4d85c9e99bf9e6fa34e0622fd70463649952db89ec69a4769a31aee8b3c3be3b9029e8756dad4a49524158fa1862df5e10cff544108bcbd7f138ed4f45e037c61605716bb6f0364a0471d3ed3088532141b3d71dbbc69d22ea1815496998d9ac9c154d4595a489eb86914d8fc5ffd6c2be03cf4a6c6b9ecb78db9b4745d181b5f10ef35b7040ba9c275635e7912e2793fbe63ccf512bdbb305334a73c2dd4ccf7ddb5492a563956b39779ab1a86d2e815a6433ac8b5087f9a4fed8fd34f5535ebd5c817791747af8c778ae7d3b7c62535b236ae666c07e8248bc4d631b8d957d60a74e5e4ea5fc55b35aabfc6a82f45a45b767fbacc572e12f99a59282c9f66a794e7b100376becdf71ab206c82817c9250688af8dd2651a6156f4e5194111669366ac0d8add23c4223316c7318055b0d18f5e89de6d2eceb712aba0b8580bd34f8a42b41ae4e6de7e75565eec95cffef465fc399e868cb5db1447d435d826970783f08d7823ba8e3c9992d99acaf200122132187bd00a154e0466e4ba05cf4f780233d17016147cfef24258a1139f5b041223b35cfc0bb14394919f3f1c34bd10aea658eacc84e295d15e97292a05ea1f9e254399fdd45a0525b859e723f62546e8d81f3fd86adcbaa796ae819bfe8b39ac4e703a4e38f1867975eeba042841a8bc85564924494d2911e7d1b9f9341216dc1950a86c12090e88e2e859a8fff2fef49f28615b5473e12574c845c973b3acb9dda8f6619a5ad0d354327176686949eb11eee1f75e60e223eccec9b488fc1662f5bacea3b42fa2ddf55253b7bfa0efea77129dbf82ac6ef7313c9bc53c7a7f22fa3bd7747cbf467ab2d711f4b7b636265b9975edc7b43c779bbde587244f41d3b1c3f4e2ccad95f8783c8dd58363ad5bd0c091c2ef673201fec71f88101714adb6a418b7063e13918c84d8b0b87d12ad24682b3d5e820fa25c5a36a4dc1cb9e62d1ebdd2cd3bf3d34529b57cb4ca5ba2e94d5aef319c8975c099fc55773364d62ca51e5fa38330f1e8d3c110046cf4fd30f9418ed0fd03531d0e8cc6681dccaa9702a3907c82497482bd6c2dae3646da78088f379828042b02082b0b16bc3405f9395ddda995dd55fe6662eac66c0dbcec86ad8a3ad41cdaf9a63ab7965b65814645bd73fce6e73647138b70469771a4b739419d4c0cf4466e2bdc6855ff159a928a8ebeae6e2261b6154010c773b7472f1390cbda018fea425213941c2cc38088ffc2add409791cb25788a59d594fa14828509b97beb5fe6b09e1e596aa6abbe5904b5bcd7d3ac584f2aea7c929db96339f6892aacbe2d2e104ff4f7d404e7fb57444e464d95f47f31f0944f87c374d7b1ed817154e7fd2169c3af1448f3eaaad074fb60f59f45eb307c2bf8406dec41b50586e7c5b190c639aed21c423d2d1c9d2f72311aadbc7b14efd7640ad61749b52ae6300555eb8ed66aae199acc87dc78c9f08985a2b1b873cfb94c6190a561bdf61c756fb59b6096755fe8b20dd06742c66bbb49b6cf4c7e667644f63937b2855bc4dae91edbadcbab1cf07836cb75a6ca370208f8d3c975fa20b1101e85bece5ccb0907bdbad7d269bb171bf82344f5a5aebee838d7cdf363e075f3b33f33382e03aabfc7118d6f15ead3a816209d3ea0276085173c32dbb3cd3ce1025c800166cbb75dfc386fcdac17350fc4c3de7681ab4854b24f7704537dfced30227da9a46929c79df33870115a75756b3aa384708cfe5d08b2848cb120ec537df24186cb4b9fc1d6203354e4e4034993cd26056ca242066ef9759965c40599bd0034a1d5811a658e146622be991795f7c05ae88858b218fb2e7f70387920e7669ec2d0d3e14a5082e52e526ebbbf8b37f7e45324bbb2f3e7ee1ab4758a96e347128766183494bf79af8dca7944014a9d9d3332b10002597843df86fe8e5c6f7ec0b6dbda14fef20027bbfa782ddd495b3e0c8aa46848735d0d1eefff9cf7d3d7bedd9ebca5e3a3195f1be405713bb3f56951867eab8a9cd7c33b095a139d2c46f681bf7379b2a4c9c76dc237b3dd39be1b5ef4ff8915c155c66fdc01854ce91655390dee14eb5763f8544af6bfcc813b0793c036efed7d4caccfc8dbb7b072ce1487bccb176e87927edd3d62073d06038b4e451c9aeca2d383aea58780b9e3f0164ac85960e16307d764c42c569fb721eea9ec76c1425ccb62f3fa4643a4911cd88c6962f08e6f17ad3efec79d8f78945ed0e74eee0f37292d50261756ee861e05374078b2b7c1e76ce8de785570332c3c07dbba8ad25fa0f9199b00bd7f75e4cc0ea331edf378b0bba51d3ea63b517cac1ea7b957f0f3a45f4afd339927f0537e9a87ec4fa2afffd37bdd04cd3ea5b1f85336238f4e32bae04a62fc10d5277cfd5a4058a5e7f2864d960fa2adaff986bf1b9c5ec019733169c3ed20faea60cfb9c6418b14733bf61075922103ebc83eb3d21186fba397e5bc52bacbbdfdfafa9c81245b5ec122011b7af3aa0c14ce30cbc06cf33af03e0b0148c7f97dece0eb02cb12ae13a3563c6d1c21a07f3488633e60a1ea2c40787a5ec01a0e810f54102060cbd2b2692e5a3b6b8e86a8296f15a2ac7222752acf05cff260f0a7fa79edaf0d5698a3c93660307fdebf6a2da2f94b39059bfb57e96632f53d229fa2ed3a432d6124b404c28f95e5489c17d1cb69d92162c677b03f33ca17d0273ced5b6cca3448d1fd6dd63d36eeaaa6d684ee60bfb1ae3f666a6d3aea7dea7e4bea4cecc36ccf8998324fe9142eb4b4f9207dc3c0bbba6fc2ef672d2e92bea1dc145d59a6aa882b092a1a49daf04c6dbf53b367d35b8953b4c6daef04fedd96050ed95cc136e552da1ceaa06caa06b40dd0af792290a2de49ee90da173a09714f41e4d6af7b294c63905e1734caa66a1990dcf2ba21a15986752fb038268aed1d29b124e04255ed4fee85f8c115188f7d7da4b894c4f53cae4ebbd26cbf3377dafa25d86c6e2bdd8d9adfe8065f0a9442c8145b83532224b522cf5d3c31107bc925184c68fb159daa06d531d0e83e4bb77eb23c0579cb565bf7db03d913c63cb5590bab849209e7405a716d40d8358e99e91bf845896874cbb70bff190f32bd1caaed03a230b8dcba8dcec7f39614c0ab5b11e1ff1d70e2cff8b3e2989f98d8608e3c08acb98f27fb3590b60b930b1af49a53c62b65ed13be8509e52c8fca11252518dbe8a1c4ec4a3b4e33b53c5dcd85dcf3c4d0a4adbdce7d558f755cccca9b3b74d11c8a338c39a0c16599ae443a02661fb6a128fe89aba3d109f95561796d191f1e820afff658a000b1900c914c926a5aa9326d57c8d7df94cb72ef5b1cd19a05f49da4ae898522edc6d0ba6740ab526fc1e8ee298dddd48114d918d52c1b06a24eedd8ca5174fa598d21de647dfeb3573af4e2a86c9a206d74935ea836255ef6e4cbd6647c1986d1594b0ea00b2a7f1f3b7bd9b3ab92e6e9791dfbd234c4b31a4dd51bdb74d564cea2da7739019416cf25a677ed3c005701db800a6b5d6cdff9b5ed12689674aa1c1a73194deb2d85fc05cd50fd5205bb171f0a85c0b4c43b436283061fe4d6051dd27b3ed139c6615c02ae28275e69aa0e1b5cc2da8c744f12b34f817071a537d31ae872cd3b77aafe5ccdf00b51995c80b2c28a22e393ae84bf57cae478de7fe78aafd95a022caf795ec90b33dd1ab224a717ca6d24d0cc2c9fc8aa87dfc0a8f7b5026ee3a5ed8607278e3868d9b6eda07dec3f6a8ca773daff7fabf29770d610d3d22507aeefad63323ee0078e7c170951aae3de94d5058afe7423359c89f5836ddd0683745bd8d8e5cb7b046ade014f913c4e9ebfe1c7bce4674f0fb257fe2daeab7ba6098247eb015a0b22c92384328d2a1f50778feb88f1fa3fed60f21cf586bcf25bffb870a5292a8b286f8829e46ac793c56a8a898a64ac19fbb5752d2f5df8ed330e8d54aaad46b034d335ac4d111dd32dc3bfdb1d86ff38ce69ecdf32bd7b3e5711772f03ecb783ad9c7a5c32da9f2236daa30e47d8a364f5d2274ef9c15851fe1e9c4b7690469316e4c348c45d2abf22d44f0ee37e9b3bfc694932a5def450e00796df2bd101547e22c7f8f70192b94eb1e13055222e66c72dfd65848753df32551390bcfaf39732687ad00780f3c798e02023afceba776fd6255d5e7e2050f5584476e0124f05609771d4491ce9472a9dfcbbedcd3c9a212aca66fd34726ef451621819d7cb527dabf81c52417259ec9ff478e99c98e65801a84bd79e15b6564a0798593770675a595d77bb54cf5bec1746027b2bb0dfb029eb4eea4c1c1e4b9ad9f6210e35b1df3b5c5c79d75522a2d1b226cdc4cdddd314d4a3e287851e561dd8e75ead054100cda02ab716340b40b21469bb9c09bc1f723378c2f91ceb23f89a317b7f9eeec593bf9eb461ac8c0fbf3621193b2382545234aac3e09527a4f91ba84e41ceb4950c47c84f154a97188109b47a6bef945311d9dc5ffd71c33f8f3d6276d74a633d1259f30c1213a32e552b283fdc4902f0afb62c25ed04d5d105d329ba9fa66e50aebef68bdd953983bb54aed0278ba8c81cea2c2cd0580c7a8a83b5860d2bbf96d21d74cde3f73e205a65ed888e968e4e1d52039b7389cad095eb8573e04fe572add6f525dfd5859f4afaeeb34daf9238fafa374a52ac5ffb142f503de3cbf98eb200f0c62567b2743146439c2208b8ad16521939c5345b8944c39230f45f0cea13b1b97d2c216318310561daa76839137b6b37f272ea54cd0c4c7729dc9bc9ea7d2e74fbf974f41f9402b768ba9345284534e29408248a7f499017c50ae89ff39554d56d41b140fc11dc7e505ccee89d500bd36ce090cc89ae03d8864114dd9ad295b51f55d2c38375864a7109b1294981a908b2280a2acfd15e6a12a0fc7eb4789e977dce23cc636661314eacbe1e0a26a3812836025c23adaed11693f3dc9def0adcf235baa6d39e788fb2d0b72d60a4b452c446c405ca66a08585e7f75cb62fa4a4f62648fc8d9498a7a194aceb0d3837f0150b004b5d8d8b8fc8c0da428f56c52f4bc4a6e9126113c4b4a905284d95d8d4e960947c3bd681aca8a9b590acd0c8a3119b79337b5ef1d635ab0ffac9e691ce665be3b95b2a17872401bd474f45dc04c83d4f918849565cc75174264fafa37c6877dafb263802661ac447fd44b182a615c677ef144afbacfea7d30439f3391d62052a265043503a486f0a93063375e8a937cc08b6485eefc813b177e52c63d69e1bc2b85f613b9a4cb91d121a0012793374dc4ab3e179b9cd92fe553c33df00bc98b24c7299bade13c29af8af93082823ffbe1ff06b9725defaa51bfb6c2b0e67931b492bd7b441a8cd0a42412cb561f26c9e8724452c4c92cd9037997a9cac245a45436a43c47a48ffce21ca807674157336ae38834b8488415c9b02a3db290f4e04a15e94902cc28ca8fe5915e3aaf8d893191263fd253387c53003e3322250a8e48d9122b7a4b9e1f8c485132dfdd14f2247ef22eba0ccc54f932652dbb4d3965b8910ffc2c6b616a33136ce958dbe672180d973a3105e64015e3458c3effe124442f39e8b013c1c19a3675d26e3517d4a2fda4db200a6182da5864173209e5819720b213924450713363e3820e09001d82e597d6d179b22b5006f1008e9765c4cd2b9823a4216929ca8969847e140a50e78e32e49d60eecc006292fe156a3982709413ef3c38e916f521b14ba50715e059325a71122b66fda4a6c54b44431759b34004bcd104760f3747be6aa1e776a3e126a18199c46150e00d44d0717cfeddcccb345ad9b39697577ff11227089db9f517ce9f3c99918681b370603474870dc0b18dc90b1fcd8fc970a727015acc75cbc06f70b05cdcd71762c4e54d02e540ca99fb12137c6e8155e3bd54993ea221ef16f5a3f026b1290b11de7bf7fb243c1282836e5f002671276015292522d9f94df38a87d0d23df81da13f8a05ea79c0fb5effcd8c57e9d8d8f784b8b20d63adf0292c6a8827672cc8bfe0ab50d5edeababa45dc5a34de6a0250663c0ec4bcfb4387ba6591a431ea67222c84bdab148a3b5698f1caeeaa16bb81ba0ece9e786ead99439450ef00b7e9131eeb524183c0043e30c17363fafa822ae4c5447849371083774f311825a4cacfcf3c0ade5b6fd0847a4d31356b43b201e6d5cf442394730ce8ef7babc448a89ac345ada3639030ef881e5373ba0a5c3f3a2b5e8026d93e27c28f8f6a1df81726432104c3a71a5fc9c47691e867e6b48a94047b8573742f9a1a50b589d955f88cb4435c5c7607a7acea67a225aa12b329851b4140eeabc04642a0a2357e247c14a533a602e0698600de401dc63f80a9f768b01cd592192e0e930566d4eb67d889a1241d6353d304198a3ae12f31c8098bc80f8d385000dd1eea205998a5c7f637e3cdef5aa423f3ac57e3522230281d2948af566519f6ca7a50a39959335150c9216fb4a4286cf3014440ac1281f8761e299c4eb8c63d7ea08406857ee8c394cfa894640f093811c0be7d5c7ea12b042eaff1bc9a82531253eb09d00265e21034bf1cee3c64c6b2db98a80d78dd5021e96d138bcea0bdf7d15c47069f614247ba84641808ca4a2444dd49011244630797a6459128298e82e0c064be9326915e44cae319b380216dfe6d2dacc6e9e47367b74740a3798454682518faf64050b1ab63e1491b715bbc9963b4c795116d1348d9c0008aa59a1947cdc9a072b678fade3ff663e093ac707f2120a26932f2accaa1ec2764dbb1636dc87bc59c919f01a2bae4a221ac1ef6d6a0bdd009d392f383495aaa5d48620d2cb38248ca0c2cc422df635af3908224fb9f1878b0854c34e4b2b2786d24874e3953c7d2df1cd45f8111eb746871285b432b4aef3bd3984487bc110d7c8528ea84f7b124284c202ad17ba5ca8317dbeb821c55b0f8aa0d673b0db42b022a24ba5fb346fc5de49ad66e0e43d4b4b33bffb2a50d7e4f6254dd99f221ea9548658916dc5214b203f5a51d29e59759b34e24a5557548945942ee0e90371d3d7941be8715ad7de1c85648d2f70435573e6008e3a1ee05d2711b9229150200a3fd374b9ea3e2948f13e57c24ccea1b81ec4abc650aad1c92118923edddae77a327ba687f91fe03fd072de85e6b0d1c89cd3f794dce0f60d77adee284bd5719565d69500afc75a7938455e3121e1a60f1c6bdaca315e13cebd15aa6dad8868f56bee008b4be96a4d6b72659ad3d4ede242c3b1ab16efd8dd87a9aebd682bdc2de6e1d3e1297aa6e3c9e560961400c32fc8832fa1ebdcd5a17fa9f5cbf1b81d06143052f7f580aa6ce19ce38c23e78cb2058f80c9435935e834c8fafdb0a2cc847e18c0a298e715fbe4d15d2f0e301f9dc7add2dd8b9dab2ad1f2126bedd5da72301d9c7735bd9a87315655df2e83c592ee38e9b7c4c9447df32e39e0fcd417c93773caf01b771bdcf527c6834903360e71f60a7b53c8b660b8e71f6e724837950620ba1aaa9d5e5a05c72255c0fe32ef04a37abbd5dc43cb440fff253d62cc8765c065307a72078abcad8648be2432eeea3b82ee3f5a16a9910e6a4a7596dc9915b1318b50042bd5fae4527e9fecf19e837f9a3f0053eae611be02f04b843af99572c974685168d155f15b0e3ae55eb9fe9158b95ab714e0ea915bd2f3643189b510bb455cb72c816b9104b2839e4eebfd22967d9e192e424bf57446d219fd1057e9c3e8509aa6e438ce20d1ccc2b0a7a000ab147238767ca2fa20cee3c893987228ae6a76f4a082c471cd82c05552fc5af655ee9c4ee4b418ae8de2048a8a4e963defdcb1bca78bcc84163b1d0a702dd9634adf44d564df6153aff172f5b103c8e0035145c71be007ab61858ead72be458be238220563e672eb57fe7e5865958f56b8f7360a745807e551aa96511c319a71ce2ec559afba56f6eeae03a90b2625f6912614db9a234de0b01758181ed045dd2e2edc9c615c549e1eeafe4ba1b58dc41d6d85f88ad53a8041cd920a51426d1819b3ff6f7b179325a83cb089b03f3fef58c7a5d0dfb8d905475cf7caae640c9cf811dc704d1a357c3710375705f191dd652dd84cf01d1852576af21d8766e66fbdaf548d1612d18b84b23f738bdb6d2e775194a7d1cab13f81c4ffcee7bbaaaba5297caa7738a4f47ead369666c4e1ae3a71344e73cb72bc1238d28def03f4c1787247f5a0b62cfadf49f5ebc805ad25526ec46ee39b14c20f20fd43fc35613355a95227acf6522573657101c6123893c034df5ca09e7f5706abf2a8d07c3c9a07f4d52c00815e94f0b86839a04fb973bf63e27f891dbba28fa85940a118448dfb83a2328b448deb65e80c8c23e9159f352e528457bc311a48d8679958a22ed76e57add54a13311f6e6640e3628b8e655ad5f773e7990d100e62655ced290949cd5c8b9df2ca91fc024b43989a612677197aa109e0eb2e11c86b7e10d88206742c39ce5ad5b1f4687e493eef280b2fa6c790306407608db23843d89ecb67803d5f3f2f5ec7fb0c91ba8449b790309d6ec8c73295560d44cdc3bfa365e2eaa71be768ff997c34cbb967c55e26b158d8b85f28a19c7935e40bedb2de7e075e507d0c2d6436316c5b5721adb03a1c68bf218141c94453940c3bf167e22bdb47a0671595049806072b2daffc646301202fb6141fbc694d8c665214b4b564b05de72b929265fab2f51d7f434f08209ab920dba5faf51bd2a2c2b117c28a0aa40516ad6696db65bb5d46a4c5660885ed276ee79b54a067fa8b8d5981d1547144a79dc0ec29375a17563e9a6da8f3a98ab56aaf422c6fbf4757ba2c43ae5521270fb43d1d0e4c010e7ce0de6f1c15880ec527acc8b6b502bae83ffb8a9c6ad361e36606e1eabf8ef8a42e76a304d8c0305e9c6e83e51881f1a4c0135bee5b111a6e00007bc5e561c5fe8eb79d28e1478e9d48ea68c10d569e361e1242d6ab8878169a4636ea13b9ed40819c3628174eda31468dbd471c74552cdb66a2235bf5adbf44ff3e46b1b7c5b8d35ebb3426212519d8fe3564771b972fb1aec77b07765c6bd7d8e07da24293fa456a4e91c01907b72523572eea1c6eab7cf30c6a0b4b83e88073d99306ae05b32b747345c36532c7f5baa878a65ebb20aedbb8666007144263601cefceb17252ec9af8a3f8097cddfccd374c8c1d3c30da0ceaec22e9842d3a8fa3c3da28e8cc23cad28c3523b6f224b6dd1b020af213f8b9eef149ff90faa6d8662a79991bf1ccc88df2446fb35357ec83768fdca50263382b42f46ef612e64558c32a576256b9b1b4a356288ec4bf89ecc87b8c1c3dd26790fd6e92cce696c8010f589e650b91447518a59b95324569d2d0f55d096151d091b57d8bc11d5b7507e7032d93e59b88ce5547be379dd26769977deff0895c92fca2f7b2bf8b410032482ea90aed3c7f45059e7623e02f08a3282abe6b6779fd832d7d1d88ba6ad449a54cf162a538e66f456717ffd48bd6b466e5077f0a5ec1e496a5b24bb83e2c14a9204d250b4bb4363623f992a29ba15c7fb145c25f978c300d196e228c22431df80166923b8984fbe4d8a4e97f13e05b5493e42534ed2521c659e24fdac40606d2ca8139e384e800a251f0c677337331c3e667c2594c4322be10e5a29fbd847fa06d0fbcf203dc4327fb1874809bdbe3bd556cc610c3e8a07aa0ad67e332da610bf880ffe41bca914efd31bc2d8748f8d7241037562df237983813ab1f4fabe9b7a693d3d2184d1f92d941774239addfbc949094727c5750eef086793c2ffaa49e92d79208c0ea52bc70e9d93f447e50688f180fb28fb43f17933b9e3a07b28fca1545f75f592b0fc9430887a32958c91c4b8c741aab5bbc29758b073bfa5d6bc3ca240bc58ef91bc51604eacef49de5860a26ec33d92bfb23af629edc16736a55de97403383a5016cb2cc21d1f7ad156f98a715895d0fb5e415fe70f01ceb87ea83a5cbb47b598427c119ff7256e2c705fac35009fd414e6f3d3d9cc7c2e8bd495e8458d9f5669e028e1618dcecd8ec1b8eae7d75bab0473001f5223d0287ad44866135089353ef080fb28fb43a95e71f5e218cf9530c22a1e58da2f6a4dc69420d47a5de16b0cecbcdf52695e8f48205e6c6fc538a929cee7d3d9ccfc5c16292bf14bfbdaaea7bc5246ae24478468b7e60040492ae9c321e724fca7b4ea8a5c2c8d6e02bf3beb54dc21c010194c95a1da62a0c504e297f1898ff845b53c3d9fcd4ca73369a4ee890a1c1ff1a46329c5c4d2fb6063b1d3263dc7d2a688d7fc6e1a13a2478fca6c02801817126b9469e94e49bfd196343e8889828966a0863b422de36107bfbdaa7939821b5157e9696958e0e7b7766180a650ca6f69a951c455aaebca0b97cccd1e655b05a186bfa8bd3c5ab203f8719e2aac267ef1563945610a83302b4a4b4bf2711f282813900fc61647bfad1ac043e52c17acd2f2632163a34170dabed607383ceb022b788ad022ba645535ba689ca6ea11995b446944af896093ff2f37112797a192e6613c4074dde509d1a392888e7018bf9d53086d44bfa824fae158897ee80f647766389970aeead6db64900498d4c93ed674ca8dbf429acd7d9ab2e83462ab6f76447de1a2eafbf9c73a82471723500464ca9f9c7d10288f1403cda757228660a06b41e6a160b3a94904dd3cc31e06d609b1ce417b91f9048bcfc39b6b8a9b16ab2e268459630032f38b958498fb4e348d150ae15825b02dc677a4c5710e5ef1c6c92bca899748f889de6d957734897af16ee33f986d1e8fb8907b22ea635ca7fbaae171055a8d478aa1bfc6fb73a73a41f2256021a432850758c5729c02049ad73e28ad6565c893f35583911116a8c0d4d55c84188cbc913aaa67654d88cdc2451f47e08bc130c21cc0074822d75280baf7307a4adc161838b27f9b496820edb6f661629c1c01b1aa2ecb209b56df5469a2a656d5cb3ac858f176cae6652c818e57aa3bce95d43df4c0b14d6f29b9ae69e8bb94ea48935bc6ec63995a245342ea7ed7d5d7b2e2619db03d622f638c0ba960d6e0640620477931d8997e4d848f2484771dc89478b849e7c8d7b7eb0f47f08a07a6addb5079a15a6f0ab851f73e3d66d74590a34ad4960ff1250a0c5dc653142f6edb8d8354c095c3c9caa9192baeec9582b7dcccd84dfdca42520f528f8f4c3c469f4734e6595dd95580131ed82346b94ae1b6456da9bd2f8a130051bfdb6232c847c0016f0b0edd626b5589658ace0a10b023e514479d256c7307b73ee0750f23c8f24a5d45e31dee9242b15e211c693ed3e5deffc8219ab007dc062dc9fa2fcf193b326b884991e476f25ac292d02b1c936a5d0f029e283192d2feec251cdf427eae5495c0017ba1c6b53ecd730b7a48a74e3c1a8e5629ecff18fd79f355018530a8016a01c2fe95b0c1a2378a994b948a0ad2af31a169fa8f3d07105f17e009651f2e2efc0712dc1011fab5a756439836c55b5c3e752dad6375a45b7c89e5c15c748491a117dc54f2e38e474c1bf5fab93d5baac3607bc698e9253ece78d6062580437b56fdd6fc6cbf19e75ecf6651a7011a29544aa283257743f4f3aa10c0acb7155455a370439be3f4480d0521d152636c910e2beb9512266f67611266f408755b91cb1c2292fdd30937eebb6849fd20adb5ab19a56b64d123db0c204429059a898d7e607c18302e842093163524d1b86677ba256fa89feb0a6f5f6bee15d6389611d512337debf26460b7669372e2b7eaabb1d4220eb5f3e12c402836f36ed52f51737048c59a005717ba16caba573620d0732c5c68e437972ee2ed3e2fd142b171d81a2528c06c4cfc180990a0de30e15b4a903abc2353591d85c47e9a1db7d09593865e44d9b72dde8b1f4fd5922e0847cac3dd9d70f77ea1f3e4da8e69ad7f04140b4b6c84a85ac716a7e50959e04917f5fba6590e3dad8366cb40565193a0f2a545e02c2dc27eb51abb9e6212feb9cae31389e78009988d995a7dce6a440e5f314d84c41ced9463324463ffbe4d400a93984b7582a68f115b1cafb00324bbfc1cc4ae509c90ff1e6da10c4ec72b25cc2d9531f70936fdd7f641b8a7a667ca0b0129deab856d177edd3b478e907062c71c8497ae8897266d868c07e1a51102ddc4c18cf8b0dd55b72afab5ce1b27ba3b6667faba3cd392b2e337217fabef61386d6916fe89f93f647f0e05fd676822fa2b100dd4e1d7c29a3ca3a62bd784cd7591ec03c8cd9f7c71cf9349ca97cf2ea329891374c8f591ae26692564f403a50f20363cc17cccfce9e3d89196b4cd5fdc7b149da6c3977da8ca79cf01a67f8fa2e576792f1a2a6f67ed1c0ff7c5f8fe296c9bbe58d5d410b786d070bee67bbc562a4d0f089e54fb558af24f7837674028feef51f9e56b7780a104a37909a1710dc0f958dd820fddf50bc1d1a10c60ea3cdc95102b6c6f9b03cb0f90caaeb90ed27ec5ae1fc18db5bf6544432ccf581b8df35ff7508e262148bc3904b676a580989f56327f801f2d26d8acb5420d859df4e2d751f54f38aa8afe5b2c406430026962572fc37e7ffb0b43668b78fd581c1804d3f0d21080a2ee6fff88ab2f3a789f83f17d8255aac4deb56191ba9af475ebb37e8eaac675272a4a1e831d4c3e524fd41481b43087087e887d442655e5b13aba8c31b1800ff8b0f620db41bc37fa0fcd14989d985b768f5d280efeafa0adb9d3184790f98dacfa8e137b7f21f25494c825e05794eaeec4eb2fda0a43d6f15a6a51d4dd89d65fb05586a8c36da9a2acb313adbf5a9d25be4c463fe24005c2c3ab9aa9a4505b1562940ca740f485a4e54228781f69f659a6426c2924467fcb34b37d70598893c8e08b42f83adf5bdbcd5329e7c3b0662096b789ad12d67e68a60cfd418116b8476650a1d459c4f95de13e327b37adf067ea549bdff1dc8856d73315867764b04d223dccfb3c6c2349a77aad176b287f5c7de8b4a903fa60e3eedb64eb4b8cf1e7f61d30dbd0e7e4e1ee53ac00c27109fac9afd36b2901ac61c61a9870dd20d3bdc1a5de0670d86d3a4d0994f934fecba7d9c184444242c8997ebfb5bf3728525f4797b656bdfa42c3b4f64da95b2925b78fd29564e6e6d98bc142bcda6e9acdb42d87afc22eb2e625c30aada1163487ee3b698aec2986d1cc74c7aba6e3b9f5ffc05c1520be40f8855d77e1d889828b871861e360d2d7f5b11524830b85e99502c758195f19f42d74ed5ae6a5cc2585af3031a8bf35c9e6b8d136be42c5a036ac678a41e9bf35727b0a32a4858fa549c80bbb42c3e08030e9d239a29dc8b27a6019db32c64318eb6d50d319d9667f8a5bab3e679a9b9fcbe013c3ec867ae35d8c122663e4e87927127b189bb8a94cf5150fdac54d9fbac01f305ed7cc43bfa610fc6fed78d0c67f820a2e5ec4261607933e40896a2dd32868925503aa25c45af1c6507a66396de23460e78819a5c5a68acca196853205fba5c1e8d24ce832b851606fc510526e4c6ab109c6eddc1073ddf599427cd8b5b9459c996ff806de3fc6d6172460ee01b2c91856c5e076b7b00daa45db1b902587cf9330a4d3209171ad9c7727d8ef99694af61483916438c3b5261d0059ee9e44a0239d44d7809f126a9831fa3acabcc25dbd65987d4952c6c936eb1e453ea65b17fbc6785834ca459a502672877b7f90fa17ab9e151aab4e46a73b6d43937223accf32f5b586c18d666f19838aa4da0e9bb4df7d135866668f05228efa45605e0ce44efc39862c0bf958b1633687f75089b5508941bd10310db7c43bdf657968522eb9eca6e5f6fe0ee206c36e8f1c925e322ba5cb9bac74861391ab91d5e4df0f37b6213ae19d2a14af9f46b6fd3d24cd3e14535db35799bee0297d1259a9ddfc54f5e4799d64b4bc88079f4a594aadf74ad507374b32380dff106c8adeffa3e935ffe19ba567403ea3256662be2077071a13c77dd486a58ea11af6777e567cc1df2a2e60de05012e9a19f44cd0b76d06f3cf79fecd0d6b3207e2deb6c623e2adf154371f13fdc561590b08558832c95753ad9e59b9bc2711d8cc24f85cdf467656a8e82af3fbef323c4f959c67670f867d6eddd60190a5f7e5bb12314a2497fc5acecac8b7257eb7ecbeedfb67618385cda6a09fadfa8eb33dcf88bc724aa311cd79fbacafedc90a48186262f05504db556cfa726cde5c4ec5c02b8bf3068236e3266513d15a947678292fe715d74ee56c401b166d5536f5d7693221fd77b3bc7675c4437f187481fa8f07e782169d5881fef7da70b20a7790bcd9a09427623977625638a8de65f28676aa617b3c387f7a88238e41e17f379857f2c775aaf7b78523a5f75785be04d6a60fddf36e907f7934fe5fbcf23f7226a063ed144da1d18882b041fc052ec014ce650f2c2fad57f741a8d3d0082522bc8e7b7ef0c2a4112fa69308db53fe223c4325a32199dd3f563a59014c8fa23a6622aadba61485e8a3c58dba39d319a5e00e16be5efe1b1968252ba57f27ba219496fb6cda7966da88c31e0e645079f6c6029d74c51ed9a8c4c9dd6ec8ce39b77ab45b7f4439811d57ee4504788778cf1ebc38eec1ae9cd90669d15f5ff59d2b3fa9a9c4ad70421f950d2a5388095723737733146ec0c1afdc139ab36f8f3c9d09ca55bb95146524622bc2c840ce8d10037e093cd20e65dd6041a88eed4d49c7a505ff23d1596edfb50072f120d507e33f7a3632e45f2a6bdd1dac9a8ad43cdbf0c995c665a0e148dc8506327088a6ae7943862c337893e939296bac38c43836842277b11e8c11885c41c3035d4e8628c8d1d91b651af2865b29e4aabd0366064d2a86792a16b49a284d2a26823c86c30b3613c8391ae07d15d8f56f7eafcd430dd280b1c0a53eae51102d2b216c41c6191cce1229905e38c62fff714d841675fb1c1ad185b8696b5754c486cf1ee61b2b439593145e1ece03d10b6ae6d9229f66345eb6deb88b655a60dd1da8c69d3bf5a170c8813331614832649e65dc57b28f9d4a4cea3f1a2e09e468816b6abba66b842b2f69ca73d9b7e5d9986af12a5b5562f34f15f98ef5e2d706fbfbbe947eff53f87c1aa88f550b5ba94837ac487cc3229749535facf3a6e0529a2f2f7dcabdd0f7d7d68fd86c07993ffc5638fd8bbb396c61ee6f01cf5da24dc8975b70aced81da6e02305c6201b2c570c54a1206553c7fdb2c209b56c87ded65f53929e38ad4a1b8a8a46e0c2afcf7e9932c6300f453b82f58c53d50d87d9c5c7dddcb98251282f0dc08b27880d886e6dfbd26d60295a05e623c06057247d9c7c2050eff60416db8cd599e65fd2ed1312904a2fb22d493350ac68b4bd8fb3432276b58499217be25f99c50f5fdf0014d87236caa4b2f10794960dfbe4f7875b49b96dbd47b3d8eeddd603a9012c6dc325c2b32497346383d46fbab0db3be79084664ec8c5fd9a96d90d4a3b544f8c239415e737380796e561ede23ebd0b3ecbe4f83d23025e9255ad80ed905d3bdc0748e57e6228ae822c9afa7d280b6688474c36f4d00be98f7bdb6104c8e60309d9863ebe521a6469a4f4d305d938ad71b9995d55c4344ab047ae827c156209c59a5034d38b21d9e4879183f4703cb71aaced55f0ea86852c569589a983e76de5c05ae071411fc581b8151810020ea80cb4f9c2f30ddfb9269998391fb8f9029b06c2bdc803615dfdf24217b6f42f69652ca9452ec0b890b4c0c56ba4b2155e9d6eea4905255e27594424a25f560199963585bc14fe4d4920dd90df4259b9ed1c8ccb29b274a2dc678038d3c79218aad24bd11f4a352ce39b108b3ccb8ab60543033345e171667dc55302a9819ca1c7d68bace677c8697969b17a234d660da88fe028dae45ae1f656e23628c6d448c31d296e8b2f1bc9012060c09e3459cd327f7c1c03873df75e4437f524bb0458386d0128da804a1873092883e09f483417d604b4648bb0b77c109e1c29ba33d3bd07713d2ee8213220726443bed59576c45403f1a441046d6ccdb82fa32f0718706517b3da9a51687918484ff388987cedcc21798174f2db51713fda341a34a7b1f8ca4870e6910b5277f8b824af05a120d25e834966860814e638b6eb948a23145e9a1d33882adb8037dca0823a93d2bedd928b5b75d596a0f4b7b353c741859606cd15e0d3af0a5c22c156e0123890651aa49522a2825f430fa0c09a5aca490dacbb81d164c910a82addda972e2be541413f7a5801e3a562312e8478348a9535252477f80dd894feaee6cd2da0c893f1cd65e8c5f1701fd2e25a5f632c95246b902201391d1cc7f97522492c1d20aa2d8f9aec8348ce20f527b5f049af98f0691ece20f6c01c12cd0e18a7627337d896a30f4d16526c743fff44be9bad2de16b1e0e7a1634f5ef840bfb0b4b7452a107a488388c9c36b09fb79c84b54aca007ff61400f4f3e34d822163cf90f83022fa59da1a1ba13c594ba13c55177fb3488681cd190d25ecd43a76184e33f1a531efe4783cac39d2128e052e7b07503681b827be26c85215b9aaf868f14e8f59ec1dfb5b97ca1b3842e6bdc8de7450a19267ac59ec123fa6547cf47d12746ee88be0cf1c8fc74c7bec382291a89243320f732b4361c59ca4021238484e8b33bfad95f82da23625b2f4370c5fec2c44b9417277eb02bf60f7bf94126c3c3c3870ea3b1600b4616aef0d981ce575dc80bfba4dd404f534a79f229fdc45836ae7772e8d87a2687aead27bd75396402b1f48a1d2ec12954668af684a09019a2d93c992a84578c1ad42636e1e570e92f5e1b1a434d5885b3ca30d15d2a4acc07ab4c50772c13f43ce7758492118a3e7c297d900c13b14e30d0ebe8bfe873da361e663efaf480b2cb3c69ef7b9142e6e74507db824bf045a6c9b30cd0f391ebe8937102c3b02b667f9142420ac3103d0097602bfaecaa03db8abd8a20d8dd21f3d0b3ebe833de86725e11339d36146f28c8eddaf0d27714f465e8886f8f3e3e5b7c198a3e6bd31e87e82723f4dd3242b1c64b1239f8f9f95982620bb4b3d05930921cbbbbbb7178e8a851edf08eacbbab87ec7bc48d822cc6a2b2e84b7035ae4d03e8161d09fda7adb6929399428790ad0128f40fdba21858f918638cd1972642c0e83fcc8901e8164141e83fec8b3260f2d0b16e8c2540f41d9390016b1013f90830d9756d3c2fa042b4873991ee80a8827ebb84c49f08dc2524ed61ee268facddc18f325d11e6b7480923f4125f92fa4c8eb9d72f7aa8af7f497739997fa7d3d2e599a39cb53b2eee5a723992eefaba5cc992f6ae2597a33cbbea1254458204b67827fafc40d21ecadb952c696f1fc5e5a0d7a5f9a98528f5c3e5323d608e72146744663ffa7e63573b916d347f50d2831f49cb205eacee5a47778dd35d7b0c0eb49d7ddafbf60849bb926626dfbe80f67a8984b4b7fa76960e255b7c23692aa80f1faec811e9aedb757668cf1f7b24be3dc0e2bff88be574077e7da9c316925db5b320b74bdfac47319522bb816ec718b6bbbb2d97837a051cfb2074083dc69ce99fdc5fe8132a59b8bc32c2e616835a644c613ed50ccdc7adaa66aa2f33333333b30fde493a8957b2f5807d735f1198eda09b2add6ebb8ddbc1c89099bdd99999378e44cd7d3cbedd442184ce70b77b45551f23c7b831cab5f954df3054c3e2c6085732332f33f3aef73233af942c659432420eeb0e639392c94dcee3b1e81f005efc5bc1f857df857f319e39a6509be6e2170c86bd50ce79fcf4cca5f27b731fe627df7a4cd7695a5315436d5a85e9aee7338f1b4f264d7eaa5f8ce7f1d2759a023cb0dd08b9863da821b8a7637cc283070f19f6b5f2d19726a359f7ee96caef1a0d595fc00a69cf875de78d3cba5b9cee7659edadafeb68cf7f9dc296ef6a7d5500b457dce03fdfd642b6341f1f3d7bb6b1253a6cf113e8514aa11f3fa9827efc2463eea0f6bee8fc84a170100775c7de0b51973f811cd4defe74b90411bc753831b94acfbe321f5b40a5f7e9b708ca0b8ab4c7cf4ea4bd8b93e1013ee698f773c6cb8e55f8d90dd489ee9885baeb983ef39467266287e1295188dafb78484a7bab67e7284ef46750c378bbab392e44edda5c3c278ea174c7bfdbc5f193ee9887da63e729daf39f51380aff3ce49e2841036e01f51fd8e2284b608b9fec8a9d370b940efcc7519ebd5740e76fd11550fee3279cf1c908e99c7535ac3582383e7cd8a1bdafc3e1d1d5746b77bcbd4ffafadc7e488f1c8dfbd27407a5841e69fc6968e051e65cd7bbf656b8487ebdb72a899867d8a5237adcddd91febbf23daf41a65d679e859e9753a5b2e8a0837b6b713422bd9d2ecba5475075da5a3d3d1d5a866bab53bbb1df4a306b292e3976807426f126a2f08f620946031ae847ec4627c1b5c6046ddc1294d24e586d33997faac45a267d3694d12638c5c92c935c7f8dd80e2a17ffc3dc543a129f0e889a49c601e7b8e3737aed3ed83dd7e8b5200069f953b2e2d15cf0ea53c7bc492f3393c7363a0ed37ea9cdd5fcf6ca7de75cab443270fa53cf558597c335dfec8c137d3f7757a4e9e1b4e9d3929d41d1b15d14f0ac92196526e77ed4c9d52cfba727733bbac2cbe89cd39f8a62995e1b8cf35740a27bffa25e281d243273d1f3bdf2de6e09b9e1eeb0def2a69fda217fbb9bd65e79d6750a3f58b2f87baeba49472480e5529d41decbace85da6b28dae3a12c6e3ef4fc119aef7c86db0845e9ce891aa7dcc7e3a9778c5d51afd8eaa903e0556b438554aaaef3d56ad5e1c0d175ae0357d506ef680d35b84d0d3fa0d46da8a1a686531cd08d4bb1381b2ee6b748892b32a8edd603e535ded51aac86c92aa09f4968b5720601fdb0efdce4385a80600d1cc7c92ac3721bbc06cf3e25f2e51443b589e86712dac170541c6e53bf9eb771de786c3c83da456fa0c11163f49ef7286fc8daf3ac44e2701cae036d2a0dc7516df8ac3c365a8066784dfd60be73564dc2cf6e4395e921f31a3cf31abc7f403b8fdd75ae03bb7aa2513fd3c97be3b9f1cd092841362a8e1a87ce36be9cdd405b805a9cb43c69016a0182595a9cb40f36aec15183f7a83ec3331cb55b7af474f06fa7e4e0df1e6d1178ac94a522c73f1d3e871c1cfc6b3d7f1e73f16beac75fe3d706247bc6b61e315e83c359dd0e9db487c3db4f1b4fb38b1ae32f6a7418150757d51c8f5179b80f5507ffa1e610abc4a468c5f4c48e006ccb9d43fdc175a83e388f1ac373aaca71a8303cd6171e535db8e71d9fac7c3720379cbdc7d7b17fc67bd5ddcdc999996e8e4a34492c9ef176ee87e9332bd3c6c3dc8dbaba2263c9a315cda3521cc3da5c59e21cf913c7d0577ee969f02cbbe12cce991c079ffcf7c3a5b3eb740eceb9e19225036486fbba7f42272f5b80288bc5dd902c7696ef36d312a5bd1d1c7a8b13edf138f41616aca7c3a1b728c15e8b436f21c17a322d23f0e150864b1597afffc5775f7c77c7d70f63856fa0c3fce06ef80ddf6d86eb41fa9461f9caa34b26515e47003fda99c539ec928b2cbf1e7ce51f74f2f1c7b8e48c489fc9c137d1a59301ece0485fdd7002f4c029e9bfe13fe40d1c3c6e40b46f5f02709f8e5f79eb07f7c55f49c7c1a3c7e82e369ec8e59055eecf6755fe39a7ac73b27e643fc3e5e09b15c731896fa212df40e7b0b036d07df8b0f8e686eb409dee51a3f3503de7a939f80e5507d75179784bcd71998a83c7c4d4d5e958857322161a5c06f7754ce29c98856fa05be19cb88566050bbb4372606d943847fa60e11cc9e49d062c0f3d6ec139b209dfc42c9c237f04b0c543971cd81d72046be3c33912886fa0eb386779d83b02b0b556ab981e80efd8f100e0f82683b581de5af95c750cd7c3e472f04dfbca75ba39191d7ec3a34b279c13a70c40063b389209b36cc2392d4023802e8178873f9300b8cecf6f2e80260f3d07e74cbf21bf71fcd3f1b175a8aa1c78d496edd873ea693b761c2adc8edd088bc36188735cece0be4605e0da1bf667dfb8af9fa7e3702daf6e77319e83737a3a0ed137ec4597acc9ebba1c73e9d9bcae1963ac49909c1c6e3f9c4e3fa29f78a04b4511462f81440f423e12c915d98d9d74d7279f279f6e04154618bdd4f6070d5fa4bbc63c3332fde45aec0ecddb33edda7e4c3ff9c749529f99b61fa69f4cd9a995ae98aa745277b005f4eb25252ced2d71cefe8fe8adc5ee4892fac632dd08731ff79269fb21fa0c720203fccc3113cd7123eaebf9205aa4bde9ddb94749a4bb1957c908fa6491452e66a13d04f7707797d06bd88cd7fcf63a0c4cec5667e9553b46a90a96e0db3f1a1ebacde620d99beec2b77f370f7da5f64bdf5b742b739a99afb39c3a4bc6359593c9cab7cf5e7d7de5dbafc6f2ad115be92cf247fa481fc98408f4bb808ca4cfb75f417d057dfb0524bdbfdd076c5ddca79ad80e8ccfebf425f45b6388d8337b3e21db9ae9597b3f81f69123ddcde93b5dab524ad98325731cc50a2a69ba6b24ca0e91b043ae484572a4bb8944baac48ba9b7ed5223dbfd949eb5396695a912348dadbdf3826f140d27154634433a77f304bf41d6c1581abe918f5eec3f9afe328ec4477d38b401c9c13f7b1585de74e957e7a3b817eaa9faa19a7694fe38d775b2847618f32af29af753789a6489aa72bb0a58f7261643d36c68e1d320d5e3d5b1b280d315e9963780dd1716c57fd53d17f3982abe82fbe5b0f780479896fa2c378e53e1575eea3321c106c492198e8bcc439311e39ee53552934c3fd9ae13cc3e70c9799318397766f66f80514e36ba159cf9dbdabe16d5d407015d95f361eaf130c5486cf8091214386c3c858da1dfbd13988caf01929193ec3bf0b88860d97aeaa9fcad9b39818671b598b0d1b36fcc60b1b364e366eb8c4c4d018ee9be1b286b7c8909142c9f430c36b788d199894f6388f8e19b5573d3a36c5058d19329ca8bbe8372a94d25d741b151a75176d547e1975468d2eb556e760d4ea43cf57df8d87631a2c1d03f1d993a49e3954ca751ac63de682d21e0d8f7e05b537c3a35f4cb427c3a3672e367cb71e366a7856c3db5134d06c95abc1c9f460c3ab571bdc8b86d56032270dafe1996ae3a95143db7ce8f919329c999341532b0dde5cf524a9afd5dd511b10e834d048df3620315e390cf073dcc72ee33a9079647c8d1e323823d2536e44c695f0c7b84ed7a8fb198cb6ec5c8543154ed15d7c51194be52cbc45fbd0a8cda47f64d46ec24154c663b4547997e830eac70fc337293cf50f1e5d406b133da65e49ac4d7478062ac341a4eea2c7a0d25df4cc45a31b5f401093e13eac0352c5e0e0d1c216adbb9367fec1a30b05ec4fe206043a035d4eae27bb637b80aec200bfca75a0aaeec3f817f57317f5d360eaa77aa9415c2ef5eb961a447c5a83e8ff2ea08f9eaa4ad8e4d351dc876ddc47b56e6beccec4612ad5ca89cd1822f6348451946d573682424cc5391a0de847658d7169a00978e959724d779c9a471e83d13ee558dd8d0709ca3f1c338982b20f93dda6779dd8c4362ddb6a938871dc598c312e9c291e4aba63ccbb6258479f28d7e986289467b389dca6a32684ce4cdad3aec8db278e7da8877a08ae4e9ef22c5591e88066aeb991ccfbe4df2e29e98efd34f4f1d033a4e2e2fce2ec9cc45658e90a43c13886d25d507b5af7c6b3411490cc99090eea8fa178de6feca5a2dc65bbbce572acfbfaf98bfb8e3876b53631c9db8f8be39fee7c9874473995cabdeb582c25ed510006497b29675fb2dde223b8624ff96e3ca9ab09ea1795f9d18e39061d7a73323ffa53fe0df1d1f77b5e6e3c7c9403faf15ef16126edb17393f632d79c81d8c97f0ce5850c692f955d3df0c6836558e657c56493c77cc35a0261327212eb06fa26fa4ceac0d921e09b20ed49ed080e8ff6bab53bd2e4ec4030d273956737355003bd5f550762df91c58a008d977bbbaa3b9ec1407ccc9de3ff7a624d7c55cf609d65ab61dd7d31623e1b68ce0fbb26e69777c5fcaadd846f1ac3b80e01df3417659889177d98b24328e887edced26f8d14a4e1888c999959b294bd35cca6642921171b5298a18f1b7bec58ddf0070c9dd923735d044c09bbdaff52bf4515bbdabfb80f9b3ba0307ebf25f0103e8c6ec201748bca80e52ff79726c9dcddddddeef3da1dba93be03136874e84184b4b7444cc0f2d287c0160d647bcb377753a1df26119135e849a1d432530fffcb296ced8ec67d58c67d34760b73291bf3df5c7e54db4c5262f425852be9df4ba01f355d30dd4917a2043a840bd249a02d2f236450db76c822d85dbab20914b2942c36126823d11ed1142f3df6a7cb65c9cc2b99a3cca09432c628f9591c5c01ffd1dc68ba2e533c395cc5ed4efa894342807d9d3e6d1e6374194d3146e7c83531b923a617715d73fa5504e645cccb8b98ae791198c98bd038155c71a73561d764f5c02294171532ffe830b286c8308ceeaeef73cd47e949380cc478ccbf75c96b9a2e7d9a4c26d334714930bf38ef4e5241a34fff58917be6964b72f9c726973c97b34b13c75c128c6b02fae5aef56abd3b18eca3b16244318b6c69be6d231a44c802daeb791953be017808808734948685383cf4e53efaf178184f29475df3d3e74928a5d42dd0f394b3c0c97df3ad5ffcd63588f2263047ed7216d8b6fb342ec9724d48ee08e945cc29a5cfcb8b90d38b909e79111747e12a3ae645649ccac461dc856193935ce4a2cbd8d3720a45cf16bb8840bf751f3abe437bd021c6c5e8ed52b029cffed1168f5db1efcc64e59962a0d059ce103af43d8223c83a08343acde0357f5e57162f87575f575f17b770f29452cebf2a4b72ee71071f7419f7e27677777777b70ad063dc6cc6685a6d0ec61f8edf9a4dc6efe59de698ef7a29ff60fcbe7841c37a598e36633d94afcb6c0ee528c45f9c11cd2f00fc0ddf4e311adbb5a36c7c7b66a343abe16bbcd81d33d666866fda615e6a0fa9e6b0f6685cfb073dd3b6fa1adc78807ed2c0ab98db0e73b8fde08c44139c1242e9d8c623e5e4201769523c99c8b6864eb971e1eece5d4e721ff6a97e9d8b90653c99cae3f04b0513501e734d8b928b3e3720d3650ece397974250d399a18e3c9cc28094d3386644efe70392a6a2ccec11cf2f8eb939f8ecb772f2edb80643fb91c5b0f93cfe99b033ab92acfe4a8cfa69d3ccb5cd6e8316aca5705c35f60cbe29c0bca199f315c623e51a8188c9a1b4a439d50280ee5a84d3bcd702c65b81e58621e89ccb88b2f7c71f1c30f7609647250ca78845b8f8972d3068488cfe03e958c249fe13eec73c8f04f0737e35b0f7623d365fcda8068cf73d32627833b796a26b20c8410c3aeeb42cdadc77493bbca690b8c5f95c537d26365d7813115c6a829095baee23eacc561701ffd7ec17d2a1d0e665d38caa17cfaeea665dc75692d73a397a3fc53d2580f284e93d15cb571449cc44e4e2186f22ff6c0dcc889db9c3720da63ce3ef044b9140adbe0665ae5bf2094ff50ab2b77db330e3a63ec13fb823e3113d783a469190c030bd9d6409887f174e2647e9c5c7a8f13d7f358fde2c78f39d4e99ec794f443d7813c70bd8d7ac6d9bccd9a39a093269ad79cf28a17fbe408f91be2796de2152f6e7d72230142c82c70e219ebd6c2c87d47601ec3b893cbbaadc9d6b8efc84b8f1b0f98679ef50624fa6e3f26ccb87559bfeed74f0b5b266f8871d742c9450a53c05d2f6cb7f62ed6bbcb7337c9fae6d667b60b355eeec8cb49f6dd80ec10dc7335dc010c0c0c0da6b560bad5d8c57d1885d978aeab5eaea3bd7d4c076d6fb7130f1dddf1c293b377acf6a64b29fdbaaeabcacb3923996b2ee3835f3abfe46408d0f397f7fc6544e33aef8e9b50124d7e399fb0bf2a0f7d3d17ac1feb4fdc77447b2c064f4e7e55291df34b5e13ab0c05df5c7e9297639cd6dd0c37e3974be9d952e89315d7b5d6c1c4adc7ee2e8e39aeeb8e610deb825817b2a5f96eec5a51b272e58238485159aef9494d491d3d4119832d17eebb0355402eaa4c7417be3b596402fd6850a134886010292ab122e07217dc06da2fe7faa5525184904140bbca55dc065c78fbeeb818e2824b4581591a66f1694fc50eb3b4f7e2e2d03da5e4225348a92add25fdb4c74e83284583a85b34887a053d955aa25ce94f10f5490505c1968c101742b8e05241b0674709b63675e5a5a6020fd89c206b855f6fc07a2f7c9d019b23846fda15b01e0c5f4fc02259f1bb4b5800dff432606d9aae107e9d67737474d89c1df8a6bdb5393ef8a63d0005c8e103ebd77fbd165fdfb19e8bef0d5dcd77e363bcf0a0ed9f4b0eabae97e5e8584ff375189b83135381e8551389319cf322ed55eee32ff2cdbc74986d2181ab760cd0c7fc832fa5f3e6602e3dae57c3a563bbad1897b516e9ae590a5afddba41ed5751a09cdc7cf79967535fe35a34b1bd323176dc4e9fb36bc65da98a9e9d7f663c2559d6ec3864b1b97bc84e8ae1ff14d1b1b55c375da460d3eebcaaf1aff46ddaf816d978cf2aa107b6931c1d0cd643299dc466de2076727c661b61f2618979376dab0d4e9743ac54bfa69fb113dbad878e67cd97ce8f911b919a952fd88df440cc74442d81d97070102a15fcaeeb8bc9d89ae996d3c9189606b77ba32a141ecbc460d22099fe16db812ec6f00c115d0b767b5091abca3c1676de247b513e3372a06b0b7c141b004dbe2172c0bc1176c8b73b042b0c54a3007db622dac126c75935e69e1eb26366aaf60bb761a6a37d1a4bda1b487797b07752bc69b86cfd0f00ffe8c6f7c19dd6486ef077f86c754c62a4b29837cf776cee22e73a1369e8962d911a216354d281a9f5f83a606dc782eaeee57a28fa3f0ed33ead751be5d46fd66ead723f87699181810ed518086489118b737e9a7183f6d313128401383a361300451c178e142c810062c800ad249e7c5a585a676f051001fa84831aa355d77ed2c2b1e0adfce42d0f808cc846f3f55d1f1b11270b8083aec0e0e82f3e01c96c237ed548cf0ed385246871532510bfdd650c91a51645f862b8dc3fed27c100cf46ba1f62e8750c02129edad771bf594264ae29ff63e5f6aef639fa7f2edcca4bd24b682859b6ceb47d8e84d5b87187ae8f563a3b7d2a37fd786c9337739ac47d8e8b375acbbde24e7249f9662f4ed0bc8965983d1613d42c3351196af8fbe89daa85b4a7ba155332df7d975ec4ab6ed7537f769df9ec420f6f07a23307ed2fb88b6717723dce852eec29d2bc3037f8d0eb8ddf6ee569aeee4f6765cef0e6641d7b9af206401c56f51164cbc8edf222b4b9fb5c6557e7cf8fdd99ca84897662b903131c277a24bf7d138b4c71aa471686f2d286cfd148ee06a9168924ac997ba296461f9c0d527fdc0d5fe51d07fd823b5fbf8f9761fda8bdf4740df8df33b4350706b1042395149f80cdf4b547e96f5949d288edadb22259fdfdf191a6a4f06fad050378c22cb6ea01896a5da05740ab39278c4632b8fac212f8c6bc3ad7d3b54a269b4c8b34a93d7941162cdd86226d4d7f3dca85d2bbf2e95325316f4970a25984085124880bf5428310536475411596b81b2af769918a90a159389c2682c1d35271310bb36d2a4e34ab635598c7ecd0823fc758cbb62fcfadcd5baf4862da5e4608c305e41f47337cf397dc619218c10eebc164e6e5d5e975c08a7dc7558674378c9d074d7edb09579c38c73d8a62dd0e841ba5bd6472fc2e6ce8912c208619c52ce29a544a2b0e717a317e1d53997c7eb82179c10c229328b1e84107e47b48f1ee79cf39a978c1e43e90e23cb295931ca18655ca29925969288c0162b8816625c9185c3d281d3852974ba2025898d4811204a004407812d1347c4081a44ba63161124304135a18e0fa21d7c3ce1ca13b0c80ec820916893a4b47490214742862c216df1a8892061063126ebf820dac187164270b5314e2c8810218104aa8819bdcfd15581e88e8b10012288109d2844458020d21de4928aaec0c27f7bb48435f5c117ae2d90a6c0d2329f405484267d88929011830c39123244670b9f1ac44022862491d10c32841b421406a35e6d0c025b3a473050fa683d9323b8da9712b682e460e9940109c220425433344d187d4bb49581c57a12e30e57f4c08b0c6694d825d432a18ecbe4814d0a2c80c212260bb6744cd84c91ea6ac59d8610c2092f245eb24841162db8585de39b817c7c7c8eb0e20583cec26129584ba48535fa198950419325a4d0c2480b2b5a4d9881167ea0129eaf204443575a1ce3f649af36088b42855443bdd2b90251aff6bfae0ae9aea5044a4b5720e267dc0166cefc0b210b5cedac4384b08830ccdb1bbf4447b8f2f1b7e80a2efcb744291ebca884bae0630513c430052a3bde7f34044a9012855191157a708422e090038b455aa445aab9a205a95fc77a194acb7604ac03318ca0d4041a2184f00a1dbf91c6142a38c1083bb08172608918d4221cc18a294df0a04b64c145cc8e2270600a76042ac609385418258231c1910992d0811644b002021d3b6ab052a5000c1b634430a25311b5ec8bd1176c86d0822190214b01086218e530da418e4a093250205d188a0116249f273ce10621dda251085128c1a19c00c5432e18019524e0c00b52c01c104208e10d14fa90cc317a8adc977143ba630fd21d6326eea318b713040e09c24f0e41008215425081ca937c7c7c8c803285960583101328f0200c467881040000820fbe3d621aedf69976a7e970b0babb7bc9c7c7c703b1bb7708b24ed041135ca044132e5cf140b3babbbb83c4f676e0313cb4e2a1634b7897874e61aac8e221141e1249217ae834ed75354020c1e3c0c1a0d8203379910a1b1401e3f14a180106a7bde8588f07b2e042134135c8220c2eb889310c384ba400b52e8aaad081b17c7c7c3a0065c905bff40ce8e7cffe03304821dac11381a8888900688df41903ac17633b76b846413e9887bf4390ab7aaf98e17ff4b9efc85241e3e89020422011df1eb12abef341169e8a1fd0e07b088fc19e0871ca107977bbaf296377ec8edd32767b9b9b646c4cc69e8f7d4df6281365227314a9a5e929d0e93ea0d191b5f2db9d7c018d1eb3ce414c7cf46c6e3ccbe5a0d8624cd02efac7fa701e932ea0df1af9681f82606ec25ca731e938bf2c8cf38ddedde2f0610f570a74592806215b9a4f0225e9d11ff4c9b02a454095fcb779f469ef72e991497b2d2e3dfeb43856fb33de30d7e91ab78a711af491d8e6b465337193d3811bc699362028c75adc949ad395f4d69ff2594da914c5360cc3b0944f0efb817acae4d9a6b54c6fc13e2c3efdb09f1cb699b61e97cfcdb50dc35c6bd2dec6834d6ce3d92276aa2617cf1ce5d8e6da0fe7d08dd380a663aed3da073807e5f3744a6d546bf213a5e44ab94e9feab6f7c2511ebbe5c251a8cd3f94a7b81e18757293b7b8b86c8e71df8fcd31c79c3720db74ed876bf14f6bf22d7e99b61ed331ce08e629c7361717d3a6daaeadc706c3e7a632b9b8565fea346d304c70e369e172506d8acfb02a4f959f52ff53cac4611ffbbc8bd3aafdbca89abba82f0e535bfcba745ab6cf4b4739b6f974f1e913634a29b7396a73978ceb0185b90bf7f16f322e7ef281a7eb29caaf16ed29ca53fec56ff1de7a503782e2a8cf7f4aaec7fce2b4971a7b854a51eeb340cf639eb5b4b4eccf77a9fc1ba5f2a963d4457ea6699a928b3ae69f92eb5b1cc34e59fe833e3e2f27c61dd1de08758d7acabf23dab76c1c10cda9eb744bfdf86993ff4e593582f293cf16dfeaa7e43747d5afc7e7514eb1fa69ef63dfc55b5a6a8f961f2d2e2d3e7d7a0b877587d1cd759aa638545df25b3da2bdc6691fc856fb4056f7596bf2270e9bbcd207255f34493a4a3a4200dd222c4c7eb7f82df2c2cf67a9ad3dbfb025c4f4e5240e92a3ed2dc5b63b3ea27a1e897dc4648f1c41169ffe591b761c448e916a5bc718638cb1bb61470ca354a5d2ba8b44147a8f1fd8c1ec0661777707f923ac6f181ff00455aa0bc68fdd41e660e2e6bb71310bcd228f8f351f3f9a192dc6184d31c6e833c62c0ad3b3d581622ee3f683865775377db539e79c2847b567f2e91426bb816addcd6972ac9e5c4a082184ac87ce30dd4d0ab02618e87784f5987f41fe927e5d521a61c7341853d56885e90ec21a533e5317b73f24e6d96e3f9c20c3cf8877275d09bf115577d267ba8bcbb0a344c17427dde498ebc06bfaa92a4971310b16bd5b3ee06a7e2b85878e9f3534188afb607ebae326dd4df7318d3e1c1c56d7b9ab54d8bc3823763f32b5f644c6447326999f7c693ed6eaee6475774eb57d765841417e9d63d48eb03e9a6aa8163e4b4bbf455ca8f2df2249ed547747abbc9355a1871ca5bb1883dae30df408ebd763ac4d9c3ceb248ac5c40cdb7862c4e21468dc456a290ce1a4f6302bacc46a6f17b684e09d85ab6b6ede5d6ca627c7ba8b11a6bb250257d0672db280ee361efa2337c40aca50baa582ab2747d03f9ea2928233050b0a66e2a1671c050a5b43bc6399540f9da10f81ad85dc878383711f8b75715fd77915da1eb5ee966598fbe83031c675087d79e96a9a946537d0ee76b3200f594758cfde6c8422945e7a11487ff2e83e31ee8e934b8fecb14bc7580bbebb63d7e6dbfe63a417fd4cc47a26f0d91d50890d9600ca6fdb8f25daa22ee27fa1f29e8273ba4ad6538573506580abf22558025b2aef7e92fdb75976a569b0a76824bebd4530451b21e50c4659a66871c43958f8f61fa22642ca188cbc30e5af1c4dc109d011df0ed31cf8f617327c3b56db5d5aaac03954f827ec0e964223710e57e19b2c9aca0f013c64a4f6bef81ff48f91802cd1438e91ba83eed24297e819a9c5751a426fa1d9a96e8ef5e69b4787cb3793b9203339392d5cc90216aea064852a6461850a585cf153904214a69cb0caee90de534e08e5e6bd01d97cf3f5b8fdd836dfd7fcb4691bb6b9dc7e6c9c2637fe2f3c6fc10adf3ec920062c5dd0c2b767e1db4fb00adf6e25080ca83e725ca5bb7625d8430e89cb7ce399f084049be54ad4e5ffd75c1f7afe02aa57a2fae93d21350dd13d2e60cd15d9d6b052129ca8aec02850a87168cff60c55c8c2ca3a14ea2e8a5b591ba1f696fbf8a1509b817e900a58ac4d3b5f21b4d00921869c0c0ffccb71d2f37719e807a3c028df5fa09fea7bc9da3494ef28ab8235899b52987875205b9a2a80200944d0c2ceb600e09f3f2bc70d8d0f0307aed8af0a6d5c5ca74df5eb79939665d0e79c734e2927849a63365cb39149e91042083597366c481b6a70b84e673515870e1e46bf990d2a48bb1d779ab39ebca69e2e79418735f5633df40cbaac9867529315fbdd605c7a19f4279f9784326e816f2edf7771f1abc625b8f1d86058a7cb2a671dd29de61906793b7d004208f44cf49963957ff806fa694877fc01be818ef5bc062b03b16eeabe1337dcc77fe3ec524a29e5119cbf719667acca51a640f9e7c609c79ea9ac0d3b637153f965ed4142690e8e02382f5937dd2c168be5bdf1b024ce0e0d647e489f3e8bfc6e3c60cfce58501d3870380ecf669558c472c266957eaaf10adf4cc7b02df00d0e3f71587738707032d37908c4b2aa551b75a6faa99ae212d7b805be7171592f7fb9352eb563355ba13e7647dc7c87218f39ac1fc5b213125cc59333ccc30b7aacdbc57d9a9278a4fbd40e3caad0940711ffc349f1684f6220fe8ccf30e5bcf548a55cab6c85ee0e24606bb178e24a0f8060042da8d060877d093bfb28218267fe699f3e74774178b94e5f2c1fbabbfc729dee2e974716e9729cee2e4ea59ac0263de48ca8bcc533556d7118357eb65b8f165739ac2a7ff1c2857f5bc5bff0df9c207bc3fee285d7f40b7fe13cdac3fc85ebec0e1afec267daa3c15fb8b757e32f9ca63d1bfc8577edddf88b0fe65fb8d62d00f80b7fe1b1bd197fe12f1c0900b8208f5519ce325cc6318715ae8dbbb384dac3fc844924b015717026c7819ab376b98b8b67dcc2d5053bccfd546d5c5697310eab3bc651846a4063fce32831ec04cd43974236f508eb63228490668706319ed950f96fb819ce36d4cd68a8fc3595ad501aafe19cd9a8373cc88bf34b0dbe42face717844ece49341ee5b241e2f6d749285f39295b90d36cef4c62fb7c17d588de3e03e9c2ce8b7416cf887791ff6330a5ce5a8fb59bcf11c959fb5473795add00f07002c67c769ef268703a02e5cb132d769cc86ba6bc34fa2401b38326ee17784c79f3c930eeb6a898f0da8f415a23dc85180c79f3c73e92bcfe229d650b7bbd5767b8a92831c4e7790861a5ca5d57da843d606fa8c2aa342192a3138558551f75f54eab0b6bba8479f5b79f6971a44bceaa772a9df6ef1ec1a0f7daa96fac106fa549d40f728cec8e6d06166b809455881154da860a28a13769808cfdd6fbedb0e210159189145e8055798c2187636c736252a0425458108289880c9ce66f4db1546bfa17edbba09d013ef20d87a29c20559c080084b2cf164a7bda3b4b742c0d1e40826b2e00112507061a7bd87dadb20c0560f122520a20b2be882154e6065a7bd8dda5b201c51416aef2aed9dbebd93ac746b77bcabb3ec0ef8ddde8d04ae386897da79687708f11659b0b4b77d3b2f29213941a90fed4376c70299f2032954014516a519ecb4141a466520a2045f78820992a8e21b094f041511851e7cc109293bedfcc340ed75ea79202188095c98c1123d88c24ed1bfa0c11542f085282c2185043b3d424a4f8a8092823338418a1d015c01657e3b8e01d693507e3a8864cd4b9a3ff58afdc35e524fbaf41da4079159102b8f6141dabb1a0b9a292dc1d656a1083f36288114aa90e2043bd0394b7b3a3cf4f6d9c2436f26ed9d1e7aff7413e8eda4bd27ddda231f1f4682dc69a887090b9288020faa982245163bd0d9a8bd1c84debb1e3a4731711fc642dee5d08710815ea43dd3434782f4d095b4877ae84b5a08e8cce447034250f0820b9e30918520ecc0a02a3c7466a23dec7dc0168e773d98410665d042951c3401cb4ece43d73142f6d055b0a5000e80810959b8e20a3bb8c2ce0eed2110ae78291dd328085e1e210856bcf41959248417bc749af666badfcda9e1352e07ede721d842b2434020facc637bf5b3acb5609964a474b484f4ccacf41c04b6d80c7f3a9dfcc44327ac484a0c1e63c263d8aec763c841e3e3c0160f0de19ce1af1afeba98a8bd26f2f1f94f569e423ac6f114444b3e3eff498e89b8a145b2545445117e4e5fa524a42323a2a167178ad241fda481faa77d9e3dcb92529223f1c7d200462d244ba44b57d21d33115c2d41d21d2f92eda09742e85ed2ba676608ee8126215dc036094cbe3d52181a4d768c2a557739987fd7453195aa3be6a80a862955c166ac178766a5d47437e74af9b9009a0cce7c4d77d3997637b34c42c87dec7c84c7438f55353908c3338d3323ab94996418618cdf111adf78920840127976583f7f0855bfdd7155221f762f1b425e8992f2080eb3d6de10420877f019233347e60821d4b0f63a46d831c61865c718e31563bc628cf18a31c618638c13cb628ccccc713233333373ebf85d9b0c42f60f4218047f33841042082184ac1be8c02c7a117633d7ef08646666ae818c03da1ebd08679c587bd3b1083f9c871cbb0eccb2e871c723381b8ff4f6628c9143f1d6ae7d4a1e72dd0e7b0cf4a3365478764fef7a84e6255322e8fe3eb4029511a2f9e61b2784e63d3b9b84b9acbf454bc420d502de2c29208272c406862bcebe26d19684bfbdb1cb532d804850fecd8288382e111de18a0c82c212ebc4542f75d2134f5c444f18dd608b474f386118d4040be051134cd88b2c1f78a7679f2ad01b28e6d90d5add3cd639bda5b65ba65a3a8289c9649a31a949d1114d6c684b473c0123e9670bd36493c78728ffdaa7cf125315a24d9c10ecd35e735f73ecb34b7c9aeb2ce378e8cfdce4eca43d262d2484d1bfc0d6ee303925114581025d228a429499e6ce10145f90bf9220f9cbd4a6ba9faa1bb7dbae990810458864396af10e27f949884f22c49b4c3a5897c7b879139afb5f1a2744af7aab9aeb40ad9eea92eed837b6ec481125768c1846378beafa2dfac9827f6c6cd378688c8356d06fb3b0a6eab728055462bb4ce478e88fd397b4079f5d88f6b6e809280c45b75e82b60807505e303f79ee2998080747ffb113cf71369122489c73da03f0df6239da9be917b7417c0457e07cf620220efbd79cef0eec798797b52bf67ef66dde690bf04fcfa6fccbb72809e837ce6cd67e664e42420408de81a523eb20ed7d46dab9203eab9076f8a3856c3da0ebd8b759368bb396b05c7e8b94e0c17f2c557b3df34b2effe06f0ea6d1765577ed1f8559025b44dae457cdb2b53155acbe8447681e2683353be896fccab7d3d4f4d1d3b05277cdcccccccccc6ca5bbfe38c9a79dbdd5fee3a4779d5e9a9593bab3c24a7ce5dbfb522204509ee6b708892c3fe33334ddb1131a7ed2ddddddddddaed3d0fb63a0232494befb2d4282e8b1a058d027947cf0bbf140ee63711f4ba77f7ee6b7080458f8205537e1a22642bdf4404f988967ef25d8a270658506a1847e43c10a5ad424e967fc163521fa6c21156893a567ef2adc4a7d656a340f9110fa1bbf4548fc7cc61b0f4f6f3d9adbb591d1bf468258c02ba8f47ec2043778ee2a9f7b3427bf79e8d123c66ff8104218639c729b62a0edd8d6a39b5b0f467dd0d79b8333959d6c3cd397da9b1c3bec004da23a0d3940d72111949ddfbf911aa997189584ff1aa997c3b428bdbf40bb9b070e42081ba90cf46b24a3effee8b0cae85b5547d86869c9ac3b051aa377c3daa3934cdf1e0df7e1113642d2dd6e57e94e055b9cc4aed851e02c78e618f0ee7007d14e6aa4eea013e8d7f3dc59e8421f1741c8b214d323c4a52b3ac71863e4d8d9888de0111f5b6996c25660942d601418858dd8888d36c258942d4d9499498b1088ee3a4697524a29a59452ca2334f506baad1877e1df2ac178a9a0a8d42c76a5494c992212001000005314002028140c0805a3b16040ac6aea1e14000d92ac5672521b88398e52c820630c01000000000010001098218100208371ff2fc93ac7f3f252315e71ac01cca79290e62a604498accf2dfbc80d742185055b94cfacc7ce1912aeb01ce0638b540ddc368d8739004ffe9ff0d7a44965093e8a9654ead7512d79cae817950721717a39d74e16cbbbc08e3b2583ebad0ef1daf19f853be30a24759d125b692ced0d0dffbf1f2ce565e3829caee38324e3e6c6c8cdfb26e968bcb41df399a82a37876a5252c0e005e9b4b3fae368c80620886bb8eeb100266bfab90fdb519e662c2a2856466f6e30a7b6886cdc4840ebf0abeb307fe2110401cb57b72fff849f137bdef823518e582543f7833bee29eceed08c1db37073fb995e4aa578b7a763cffc045bc1295a97c1144108a42366f560344d8d9c4405c1fa12a52082e437240059a5800bd6da1d3e50ce9c9b243ae3ffdd1ddd75b740d9c9b35e8b75a26a4f4fda238c0ba3705e93b47d59f85d7f607e1fdcfc07f683ffc07ef41f9a0ff6b1ffe03e721fbafeb83bf99098d3860ac8c60e9d5c3af186d823a507e6393ca8b85ba0eee6edcda894ffc062286a64afc4ff869ccf83d91a082a768c3500950799e6efd7e060320d6bce1a646f579b3de1d62dbb84f3da1235087f993b8150269983ac9c6fd9461158b2dbc4aeec490ca4ac248fa184be9864155c38f3c494253e45dcde8d033a5feae7e9ef0982d1b2e7f404fba55c5fb6a36d473d171e22761a069928470998074df3c4f4feccdc6c95ce951a9471afee219b32b92ababb9b93792f113ec8b6922e41a0cbe8e3dddcb6889344b6a648f3d308f5ac8e193f45f0730007dbf4225200c7c75cf801b013e5a43fa706dc1cfa5be9523b61fbaf2b9c1810e16f6d6b7b554388b0170611086cea34944d646fde50c6a4efbbb4b660930151ce61613a6530ce52079a2c0df913c654f0e663c9d91bb6dac56e417f4b821e4ec8055c16a379b889b77467137b60accc46ec5faed1fdf6141a38d601754faec01daf80a7bcf3df2718ceab20475217d7b60267dfadc4fa438749750ca672fdd586d3ca510a60d905cb3c5388cec77a5b388ace77c9daf892f15f6d76d62007029ee2112b246ea82bec213c4a007a9089bfaacc16077bdaee682823fda97477135575841051a435618dc67b224a37f70546ae25b9c21b21df10f796568892f050eac1a906fa6b61209cb9e9b9d29843ec69d1faa63f65d242f19a16befe62974c07bd22dc60f6fde6d001cf2fd4d245304d0fb53eb243fb4f18cedb62a2c3c2511186cc96f2027806651bfc0041470ea95735870eaf15e1f0c621860ea536263b6ba7485070051b6f065ecbeb2c17d472220428c79cd5a2350f95343277a078d87494ca88b6a8fe98153a50cb728f6b8b67e531e251793b3f9e6fb3d504164989726b840fb4c0139e0c68b01682011241b8b86913e548defeae5f3af5253c26ba5c0579205e89e66d129feb101c1acfc6e0ce0155ecfec1c00f228da819d51c0e14fd77c1984110464afd6e4d86febbb837b13c42b78e3f7143b72bafaa2ee6d05b3dca948426c999a5b2ffc15e17df1fc293a3389b9c9a99f1bc0e305faaef12a4058e78c66543944b3b811bd86ca1c7bf843f83fe78ad5d08d69723f75276da2fb771a0af1cde7d3fa3249fc210ebb66720fabc17a3948a96270cfab22601bb9872499b2c8751cc518af520b98206449461a17309f47e10174b6acc0473baa703730763c4d4109eeaa2ed926c760817bdb4f87a911c81d81b11cf51a355e01bfb3899e24fc83df97cba57de979f0c7a3a72251bdefab0868172330c1b776a3180604f33c2c1b7b1e88a62ba46be8df952779884548b991141c01267f1e05a38734824fdd8c7cb6291d62a333d037c1e33d7a6935886865453d697390309317aba68fe2d0a5c35d07481d636ad9f0071dbee5e79dde3143c944beba2ee0d623cb165f83a5d526969f84b9e6b6624e9d702c242eb668a103dea0c72f36aebbb7c92ed4ccdae5e7dab9010fcdee22717312ef68634a1036dc508b3e73d4e0850b35647c67c38059d99330620d68b3595c2ef0fb0fc4c057cedc631602a4cb8d6cf0e316bb3e664af2b60382383660bae0afb910b0806a2db243c567d78dc83a773d8881180268d5ed547744d9dbfff12637da1a895d00181687ca86ca29bb004f454f8811082d75eaa5db2e95593c832299ca895bdc975f3be995a242974c01e315f1b3aa199554e168dac697b6e47213a5de549ac743741b3f1559594b917b0611df478127e48c39f0d202f82e87b0836fbaa403e44d77d10d25a9fb668e5ec978e1bae16e63649d2b512ec06c5f4a9aa0903489f68c283f68370a613147913f56ff8caf5e21c8a3880381f4b4e3efdea9540eb5f9ee3911c644955ca3aff420ec694805b411387258454ae0edc9461a9ec90caf17020308ed3f67477e297ab687e2aba46e87ce3bd3ed4aa67163c8e580c44618211f401ea63e9468558deb4d127ad8bcb5d062f437eeb8b5b14e5f8d59ecc94c090ca9f792d031e4f54f021424450c7f922f145de02d52c5e65f309ecb2687dfe7aaa551191cc95f81247d339732428747f5cb35d0750745258283648ebc76190b51511d03f080bf0a1042be73f56b9a87e043cb8a0127937b677ddc72710421840b8c80766a09e6f2ad059b30c78e5504d67d692ab204045397ed6b8cfc8ebe05b0a045b639573ad19e5aa5005ec206656b348b72a86dcf6b23ec14408ed74bf3a366ee50b82f8724698571140a9b4669286d000f08e6e844e0453950d176039592ddd1850710a372ef04aaa92a3cff407feb8e5e9a8f9b576dc0e8552e01c0c5781d227039685c777a0989d1b58ad5f3d693dd8f37f353d0c9b679a4b11715904b30254765c02d836fb7bf3806cecd432c58be3c17be7b1ea9c3906da2163dc480476429ef0394009a0557fb2d03680a4bcba0bd67a921cd681d5de6c35e40103c312ae20d0deaba44dcf4cda28fb2ec4cc254119bf12a66fe38e93b4c7e58882a4920ed63e24347c5905a25367f419512845e6a368c2372f61a798b58ea4d0030b5f19c1d5474b0874525c53bdb5989c684d3e87a300303a4d61a9d7027020c78289b91b5120b895c67964fd1b6c91207cffc64c276097bea458f8f6b78e02af1a9499367d7c6c34d3c22df09af560914abdabc72cc70f3ab4857c88cb0fae356a05bdffc93e7106c628c45e0ed8f995594f7c2ad02402961a4d6b1be37c19ab31b80aa08880ebfd7edea9a2f3d912705bcc4c5e650712d32b0745ce8376f819df356750f161b6a5d4ac5dbd88a7bc24ab7d2fdad60da6aef19a7aec0492a9d64838229be3ee77dd5dd68ddbc7d8e9d294955847456a3a61239b0ec15218797c1377d9184aeefca31b43b525ca0d388a69990501a429e97c534092891b6646445613e84e2b153d82890fabe4e429739b7c82c347bb49a4b6d24fae3666e843d6a6a2c31585ef5ca20694d7e444233f450ffafe71e4ea15ea0d79f0fad9f6cf6b2e4fe8600904cad223225e62588289b3722895994e76d57f58f0673d961570229c99d1794adee7eb35c111c7ba5de778e7f6869206cf08b3a4b56913526c0ca48eaa23e3cfa5581468dc29184965a85bde7df49592ea06c5042bcc2ae484e90f925302e965d0ff3e340f72d4041cb3a7f115edee3797bc33fcaa43b0f1948ad4397f5ca99bc85feede58f515024c62833509d6d9ac0948688449b73953c7316a678b5a8cbdfb927e2160a01e3cd4cbb2c06493c96b73c8258583dc7724afd90809f9304731a91973ac987866eb51ac9936e23b346bd9858387230f3c26336ea335cfe276a99486d8d5a0846f423ae149a43e04f1b3e1f6bbabe32f1d57e3874ca046c10b71f6da33e224761e440b85d831c65ef60c09677b4705fd2dbec273e350c5f18c274d00ca9ce8142ac7839f507c18efe1ba415d99ff888492691b870ea8f06b735d287d3d007539d825ed8fcfee6a990dd308a5cb3e95a50b8d9257242334ef5dad3880bc58f76d34cf8e0b5d3634cc6f5c016a4bbbdd3d3ed92ded10e045f5fb1306199ac4976fab3d6e253bb5bebf43235e283733d86dbc9acc6d3a0988287154781dd2932e2ee1270d1a28c9340dd5415ac132dc600ed237ff4521555fee34d337815e718bc93737846ff64d6662b03023f9aafec3659262dea610abd5f28047f76f20a254430de20872a9e7d4ac44b93f63d30062d101f2e50a62a17da01f67ed3ff5200856fb064d148a3027ff915a5cfbfd408abf495c050fd8becfd49faa86ddeb08483b2eeb80e08f72b4087c651d09fbaa7c03a8f70fddc867e4c8e7769b4a9edf3b129c560b493095facc28ae9b87220e429965497dc6bbb37f9861761fdc438d3df896ba62f0b7bbcd5871741fd4deaa25a5951774535a71c13dfc85d415111189e432c3cdc05e5aec41bb62c56a963730615776380f6455563ecca96dc60317892612aac68a3a4dd3f010a853dff920605e26f2883d95860588db52229f14236453323e050ca6f73dd2e7bdabd9aeb09f8796f52f8d6bfc15e04f8c2615e1e00427253e3e1d220c4427751c6a3ca333a8ebccb13cd8b32c33b73a683a28230d2ba83577fe95daf6f484273a8ca613bf60b090c4cd0f4fd144fb1c327164bce200b91780070aa3664848917142bcb1f193928eee96224fb0cd123015f49b25c50cc5cbb3165622e1ffc4b04a4d0f994f44c522c74b8c52305a99df21d2c4f24544a89d69a9d66e6d58b5d1ed94566abe11c6f0e38e9e6e7022c253ade8ebb8a64f6b4cf0508c91e9421e70253d204c168122e37abc8b25c44474117d7dd6cd81f63d307809bd56673cfd3fe49d90b527ed85c352862fa91648687185dd1712c5f4829240bd16ce3ed72febf0fa17c08b4cd926d2f135d90012033d4a7502f5e59c16e3889556f0db2bf894d1ad8ea0ea62169c2d23219e46a6e2ce167789d8c4718166bea6d78ee08bd878a603965514441f0098a862f2ecd910d680fa3d233c385fbf6e9eddf8057b70e9bfcc3e50744060821498830c32d56cf540b3e3febfe2e7790ba3b8fdef31c600efe32f9293889b26ce3b0537074d89f956c501f14c6df2e2a3a3063d1037ac33bddf34fe6464c0256561fee02a6814355f2818b6eebd1f59780641816a157a112ab880318ed4509171df33e70db8bfc1a5531e1e492e691247503ab4051178456599186e60dd7e05e61c92b64d8b917358756ddfc6c77638651118ea24f2f77457015290eb8a751fad7f971116c6d9e80daae2a3337be303ccaf87f2150e8945648d0a5360ed572031998097b66fbb02f29ce8112490c9a111b7e8d342a99adbe46f81e9e6a84b84e0a53b4d18487b68321cae18b23747cfa4813d8487a89b057ca623e95e39cbd0692ad440e6f8b3fda31539732494511f3a2e69d23661f5bdbab46feaf199a7a890bb2ed06ba37ef640552eb179ac0bad08536fd01845ec2184e1537d02df40632b642d485fda7d6395a0dde6e214064f5099ef1a4bbc737ab8c099eb978101d729699578065e3e9577015603a485584787603dd8357b36447233abeee6e7c8446671521ac2d6bcfb6f93aaf5c3e1f60da4cb021f0dc0d4be53d8c3a020f8b2537aed1d734a7099bed9c4e4133143c04794d5cec514815915b928ffe66b4c3122121607d1d8c22561bd604b54511b88b24ae501ab6009cc4761767e1bcd7d1aea9a84d50c2009888f363a4bbe92b109c12e53719a0ac0201fa93164ab57383469567d9cc0460ad5d5a0922c158e1784d0c8681371fa24591f45ee11bf6ac34f139e2e93fc8fe36c263699c7535b8b4ea52649a195c3b4c70e0598f4ed5ba82e7ce080889252955c3fdeb44c7f6e75ba5810e130d22c35013ab54450a412f4c81209eb0fdcbc87810d0401ebe97abce7839155c74839b95db9d7727723c9f53c4f0009f34f3cf0cdd48cba5524a6bece72b3000549b5196f0e79f293d25438fe899aae6077e4c9977ff1475390f23ceeaff6e71f38651fb796ea3f324a860d1c51f097291112c4b0ca39006b54e1fd7c131f298f3fdb2c583e42844521bfbf10068da56fdf7187f70d1310fb0eba68d1f3f732f340e6a2492c6de93500425a2e8b4d3f218f987c020fe8314ad3cf0f56a0c762e7947cfc0370413d231ab42ca9e25125bd2e53119d08e7ff190d59ea8176b50a1b88d4d23381023f42ff8cedb83f24f094a2ba6d429b2d13b56e0e9f35e100080189a24e3911aa71247038236e8fd2fd7d4a823bc0ca9c749589a4e73070573943c9c964cee691bf4e650ba4a0e9435adcb164e702de00fc1f9b2da19e18f8b684b600faaf3c00b6636840f223e9ba0929186ab1f2e5df02c8f9fef6c58a910be0b260e0a4b8123f6e964527000c2fc7a7f849b37e5b0d3cdc9dd2dc39c6a132004da5b5004a32aefa49576f88be1214c454fb6145594e12ef546b5f9f332399fdd786d253be7dd1560598001e5b0d59bc14de524d3a70a824d9a61bd77ef7a74bf00f6ce48f735a09c21683dbbe1f6320638f31c1a7ee88b39cd21c766e0d260001b9293bf7527f9c8a7dd18b24b103a1f82f13cdc1bac749b79bd86c800bd5ad5406332529fa23b04fce613e131da3bf5b244f4610c948b40f42d87860a941dd4120c89f32394a76fed97add37049928f8663c2ab8a4499c23cfc2a38739a67398317ac67fe4e4d31dca9fb8b33a34b829a7ffd1dad9d14b26b38248cdfc8ca1cf6d6f9a6f84b3ae90014dc5014351ae69472a05fab684cb3d97d1537cfdc46f508a73185957ad1e7498a44a4183a59939536880b3ad5562099669e790bcbbef4483d8cafca900db6fde0373105fc869e3bf6945392538c547883a1d163e01ba4fa111efcfcdd3cdbc58bdf264d7804d8422466356a883942ac18f529d62110f0dd96795ee10423d8b1fe03e8820714cb9a348b5d87600b85aa9ee578faf94fca3e497c9db58d1c6d6a797d196c840cd2ed67a869ce49052a07f6ee236b2290723ad2314929d2f2890fc5ad0b1dcfc934b358cdf93fdf4216a39a02ad83322a2416cbb2a700ce45d71ec842b3407434a636b7e3c180f5dbc311f5bae996cd2af8d43995d2d42f586ba202a52a7ddfebee520a1b0bf2cc7ebd164a599eb6385083e0dcc40ee16276cc3e3e85d5c7291b5d6b41ffb09ef632efb8a958700c6531da06f5eaa77ef86b013caa3a8c4a790f52508d688231c07d2c54ad947b8195f2945fbce0ec7d84c13d754ac909854d5684ab4c4a67f03acaa46d4ed44d66e020b613721e23eb6e091260d77ffb2a2f09256626b27e86066429b764d8b0d5de72ef40b08269b3cbf93cd9ecd84dfb187fdf5e60f7847e47c77e99a369facbeef368f1e0ffe25f8b9ebd15d57174fb48fde55f5e24c9df5112301a0279de61a5a0a6adb9ebb2a031276ee36d73387e1b782502ac358455239182c1bd199a08f3a6e63d256a0c5e85b6501adee961af1408530584d25e4588b9e0bb320b9b99429bc39d944cd71f853cb34a25b0b0d2a0d0d36f0200c11a25d762571c89a41ab69983af23d17dd0e3c2769d9251842c52098bb4e27e39ca29e1e32f9629c2b5345da0d3f2658bf6881efe30d6c372d532247195119679462407e71a012e345d5d344cf33bfded5f96c83f4e6fb443793a762547c9547e5670aa13c30bbf2c285fcb31c972123e0dea503fb63d11cfd95db8d4759bfdc5e13bde05f0a359e72df53bbe07589484cb0a76e5e88af9121d96821d9c2d0b9f48456d9395f5509e9dce8477dd98fa23c3a97c4ccce057ca8d3257e6bd1ca2253496a512f740cebd6b79d0f43dfc8c20c04b3fdbb54a82a2b574abf0e1728698bf9765893c2e57580a635c7ac738b74ed4ab9741b1aee89835953b963fb5bcdca1ea397400d4c9561e9ef1709b552bd2bcc61e61c90a8afbb000905535932e2f1c431a88fb47596b28f2b77e2e5002599894e9ebfcc57ffd90cd66fd0046c89c54cdb4d5cba9455af5f75af6b4bd9fd40b2e611570b20e016fc696e79794257eca8490544cf69691fe7a91cd0c5766b58e41b09c7aac2efa6e04d4d8d507c345977a41f85139109db972cbc019c7884124dd8fac30dde3d4b04f20aa5f7dfe96d8bf1a689ca3038a268853efef2aa42a16c7144ea5bf52515d417ae7c25306ef4fb5331f2c0e6786a20235f502928c52cd137f3942705938149d778b9fe1ef332bac476bc79c30eaeb4798cd4c6cbeaed99412203aa680a3c32cb1aedaf21a80fc7576aefeb6364574851432b96f5c781dbcc075480827ff236b59b5d112b0e0aab609d5a3f56f33e5f37f44551020c098f46059a1f12600b62ac0969f0ceee551a1fa422fd024bbd73842b44df498103b3d3f6bd413f05db6a707843f3d529782515d35a89bb6371b14009222aa28955180287ca638378df71b40292c7c7975e47e863b607019b7bef6d8f8201fa340864a551783707c326a42b08013a6623738fe81b0df7154725ac842226a8a702b4c5b473b0f3b581653d3140f84a2e905085013943ec910704fa73dc50b856b84c7b7da5bf363aaa67c5a53ea99519696a064ce4868e62927d222606a982162a6db051ea2a0dda2006a98a36cca178225fddd61ac8a386b0cd27281b5e8ab53753ede6ba1fd7c226035bc4486438ab70c7e2f7db34f68155a0e9f72f5ee998a11a1e212280829b2a875b1ac695f5891184d66528ebe23c1f1bf7ca2331d5a6d7e852d394f59d30453821cd2779e19b27adb3913afe4d3eb49ac39a150322860e1302cd48188dab687824337b179d408ca5c62ec109a1164a67dafd702cf74c0fdc5b5a4d45951a7ea7e04712a721eef5a807240394117d85258c296019a1ab601395ef2dd4158c6dcab0272b0a75755fd548962c395656c0a0c768be20ec7b06d3ff04e8196355a46ce5b9876d78d0e1903629ae905e017f5750ef3329c4c91a676469850df96d0067a8b52186e6926384507b6431e31743357dbcbd2de476f00fc8e0280a8faba245c22708b12585643b3bfc4d831f14fc67d2ffe8d5f531471019b2594d79b86b51f720e1e3249fc628234f8784c3f27271cb23faa5b3de11ba8e4de4269d28c22b429c99761cdcf12c5af5b212e0bf07765128082545c84484d485f18df1a884f8667ff17088d171e8d146611ec288bf6935a48a68071ccb702f97f8c14c2b479b6cb966a8188f74101d106e5c46a4a58b90400519d5eccfee18a2724464ff0fe1cf64a46a4a6f036d4207aef125877ee0b5f77283454737cfb374bdf3778f2d6ec075ee5eaa30d3a6b532379fd9c87f1b15a354e8e747b4f32097abca7c804123c116efb877432a9142271a7321486986933f4ae98a4ca4182422d028dd950e6960f1d83545963b056a55c0ec94ed8f7ef9c3450133b87e4d62076ae85afecaa7eaf0466633fbe4300eba9d457eb2cc6a248caeb21d70267f0428646c4df35f6dcdec2dd57188f3dd2ab5828d9748689cab26cbd25ba5b68a8ccd2f9992714bc43c5e74cdae9a5876dc6896f5b2e3bf05a9c50e46039ff6ff74b7da68e8c8b1cf74cd30b2d086c1cf2a12277f78b951969b7b2d44c4cb90c95677941ad416a45a34eda491b9d1bcc3db7a7eda3f241161e6fe54e1c1182ba83e8b5d3ffbfa7300a8178e35e6ecec1a836115371eba3849a4159283812bcc19bc83983925a711bc0c74c24b9fcfdcc56ecea62ac767388edc0096db85603ff8dfd0e0f8eaa43bc07606ad438d571026e21412558b60f4c3cb8b39d35860c9897f302aeae8e845e74e0431b2de4a8396e02f61bb9686269cc18bbc2379de944abfab7a50ad2afa3711950a04d3a58fd253da6e29e02defc1595e2b4e56c31dd0738e64f7079e78a6f07a62f4c3ae8259568d06859d12e826ba13dd0cfa9f6bcdc269d61db438156a585ad373809d3d0ef207ac2e72a8fd28e711f83060b2ad177583e2878dbdcb00f4ade57bac4ac288268a5690173a4dda46f4fe1521dc9c70f6f6becd5ba191d4553b6f6d1b3cf32cb13be7908dcd21a99d833690c01d723791ae77ff9d5ea3fc9b3510b5bc8333a5fd854c7a6cf0b2ec5c3c9b18263ba59ee4e59d31b90548e67692efb8c75086259b30572fe1e736e2fce05c10213f9871a0ea9de9e6664df3b5e3329502dc416e08958c58f87bd150088ed60db305153cd0863f662b9c4e1f1bdeceec780fd6781b13205b2f54337c760861558ed1ba58486d643cf77b51b5dd1369482a245e22cee8c52152996b3da9fea36d898d494a6a75f58dc1b655c3e84c0493c565f4824ee666121796a1e5b7e48e0d6ffe57160cbb53d9059f3c7f9e7df29bf898588e0bc2035c4f044ce99230674f139c3f974e72c86db78811082d657724828228d5d4364b6c4ccbdd28d7d7f218b61a15063d00e41c3694df61c6a5493ebd99648cc30b871c1b6ef7af763be22b3464a3b2915c5f1590cb93ef82ba33e7df3d0c1f6d6caad4db069abc4ba2d8e75767b6b6b389dd9e9acc7bee2ce8f8252076c122125472355480e466c6478046b907e48396d52ff409bc2ecf23b0810da212fe0603d890416804e745cc9ac727d8082c3fe22f9a16a74132b4dbcd20f3cf64d7ac058dd1cdb205a71363370c7777beab14c67a76c72bf1f9c4a94ef2525120b951e09585c12b7aa617642475a4a0a125f02347e44196abedee1b796d6e25133fb387bc211331c3341f1b215b2cfd17f17aa840801eec7a81dabf5a24a5202b7ef11e5321a0470ae8160af25a2f839179ce58042b9bda0872b8f1120d4e2c525cc19c3e101542a23b55c5171ec27b11de4201a8b147c5caff5435e0e26e7c91aba3e467bf52fb84a40da31644b83464640200a87a8b56e7e7c66d2529bb091048c4156c47968028fe845d4a1f9ed85faf352a0708c557e478f3d25624f26ccf33a03122611b95733416ca80431e39a3c31686c14a9be92177d83d479fee0274c89158afebd197abf7b227bd9ae1344041a0986bae79a5c4794821a0a3fd24e396a6df105c474a8d80c5a380c215a602a0b581aa4ab563e8df2560a6cab580c917a651214ba661a3119835c6327b9a841a6226b14da0a1f46d0fe27992d4814fd3ec6d9abfa7585b130084876c6befc177fcdcac5837ee12faa080e02be856dcf0809ca5c4e8d4fe48e3d4f0009931e1f9f419215552e2e3738c51315282b2bcb26f0e44ed0cad2ab671022f39e3c3ac3490fb578a85d3eba7c3b8b5b29047bdcc95f7f3f5709714e9abb739fc23e987c16712d884e487d4b86055f79e34939bcb25cfd71ae8741ca29ac4b341251af4e95dc059d6d5719c019c92a5f69351ddda19d55e819971be757891d7ed5c51ea8e99d8f1d42064d535f68f35222e50de90a5d87cecb60ae584319c9562c0af4f8ecd10e3a70b4a5e4f117ea4ac27b9a0e8c66aebecf507850a4512d435a89eb84aea0f7f1c6341a3c2a01a11f285ab96894d806b50b1c9b0d054f257da2d5fe063c6636c496001ca07a6f962042d452a180e7e30a97402bade149994e162d66ddd89b92aa8436445585f7f0237de7d320662a65c55516330093f450b85013df5200a211ebbf2f317f094790bb394eba2cae64d0029a702242a6a6f4757384978647548416d10d720298dabea33af40d0c608416b358c054b86ea56b447a4f914ff987b2a631c037fb188320d8232b3c82a11856a85b9e0d0afb02e5b4293de50c6b4b48492be1d1867090d1552019368fb07d0ac29a1bab3e5d28c969450a74ffbe328a1a84292db50773f055d1b93d0deb696844e8fbced29092daca1adaeee7e056565241477e15e3eb32812ba0a198d446b250a7a60604c245456c841ba74db5350b20509ed8d0a48e8e88d7be74768c4723b911b55b86859e8b9e5bd2d5dbb13977bd4d75c743deb11ba5e1c1ea10b4d2f37233ed38125b4b93dd211ca9e63afe5b0952374b73b3842df4f12d539dd085db1f6aa052a5e6d6d50deaaffd8e9b9321621a7757b761ccfc5cf5b798174c751f287534ddedfc120e9ce34ae1724d214872cbbdca072454a6bdc877797e41ea04cb3b99cb42b7dbf874274edba3354c85439a95ef28677c93f53b1522ff6ac76d96b5ebe6b67ae5ee7b61bc8ca623e954d6c37c36bbd97236140156a139420c994de88636dcabd57bb2f57e4e0a01ff1f96039a4a3bddf33a774af7fbbfb4328bcdb69b724fb3e4f1031c8f63f3b8fdf15dc5f3ec1e275ac5149f928b84733cbb5fd2d6069fc78f11d1a26cdee3420351f5a55897768924236945d990d497b1642e80fb56a123ac3e0fad002847eb81ab2f0d88d7bc64cab8c411c01734aacc51acffc7e414604ab40be7dbc09778683234f2269896a9268a74b364608b4cac65e1e2103aa26695e822c2fb7ce91e056ea7e77635c34ef87636c361544a72fbc402e6e35372faf6601a29483fd143e31121d105f3b7514d69e58201a0ea0c7daeb6a759205c5116b7efed5031ffd2f5a6c2e7248b7286bde509c93fbfac50a6a12724e9ab265f661cde0639c916f8cad718cf54619e27046c0e50b636dc70818055e541a3959be128b11c858f32cf81e7506aaa46c18ba0c23209fe88ac476ed5266909c5c01887a4cdb7848d245f5cd999c2a71e6023d919faa3c2302b4477edaf172c73e605dbc56dd6137743c3e7449d9f6f37c4b94791b5580008d94ab168f5ba03cd4ab1809c42ac1c431c7fa8726f62caa2eef6ab518d910a113edbff55645c79b3a290c97d3a33518c9575a6ee9ffd4fcb0e4461b640c7c9af0ccdee03198ee9404f58bd8feacbb433af489059c833768b760d8da7c510b64e43c43b9c05a83965e1876d6f06cca0d428721f91ba5c05d0e25727c53e45a1efae588580d6a62808eec7a09c42e39e0d1720c621792e6e791496e4b698cfc12fa6d1ec05555a91705d0c70edafed69161c5b18bd423b4204be7efbcc660313d2f2923deac76b0270d54e1d5c639159f4b0dce7f65049f751ca48199e7facdef8eaa12d97dd5e37776d7b61c45555644e86a363daab0a3b242c2d42d555afcd0b708c2c450e2c6eb5b73c953b13cd4dcb6d6c625083bdff58c0b3816ddefe023bb13e2471ef8d592a4547ef161428a98fd4f9b8e0421175262f63a891e4515f5b2c30ed426ec511b628b9f67b613cfd18fbc07fe489eb1bd984fcbee3e827f9ead1324e981e47c78aaef5b12d1521bfc82a72bd053b2b3817102bc6b352e3811c857cfef8d699d0abce53f4d942e00b92fbe2607a8179f3c5e96ca9a95bff45461641187054b33486f99b1a2bd028c2382e9f6bcaa73514fac563cec8d76f9dbcd55f1b3d9cfdd40211bd393808653714748d7ea0cf62544540ef810c3356fe337968bcc691861cc87b6ae78edc74bc05fbb5da37dd70cdf5e47d7192b7fbd7784d752fe85d32c6c035ac28943959dd942ffad0d949aff8c0846f38d45642012f81f8152e4b7111b9f95b3035a1f7ec91c3f20e457d4787105c2079cd583d083b97e7cb7d1a1034322c70ebafa61d05d9d9c7273b8d2a1c0dc0432893c1987b0d37698ae4434073267b887b34cdaf8f94e43ecdc62ffcfa0c96023a1920f74d1e12defce9c8ce8dfe17d61ff1cfe535df28df0c76c33491aed7dd21d3bc893376667c38e91a91b975995dfffa37eae69dc1439c9db2d8f6924c8c0b12b9fdb55d2fd6ebd93cfd93cc04bef9174643d799b2f2a983892b9331e1ab47da28768004aa50f3475f8c34f282d6c1630e15b85c33229a37b512ce24c8a3a8e062caac3d1a948f20caeba89a6d9b63aa7dfa78061af8d6ecaed9729e7c9c849c19818c5af6b57649f5fa6682b13c0412486823703259b47d1aabef558507293f6bea334172221cb6d3e2bdd4c121c16b58ea107bcc672b0ad0db7959ad5ac03d8c4e5dcc5f5c9958d8efb40e87fa4c2980415233a5570afed5be23ac1398271643e0cf4fcfbb2d858ce728dc9e8ee535a8dbe9660543692ed7e9c44048485833a84d507cbb24dc21b135276d8b288d21678dfcc22222f0507a28e5539e3e374d226bcb87a659bf559ec6a1cf7ee98497b41a0d5154e86c840cd54579027accb0bb68d70887fdc38ab4710288de6c8d1038235101daa0c6d2037d62ef8a6bd79594e5ba16df796597c89736b2772822a37b8370da61d5d6eda9e520087ccec9eb7f2564a759387795efb6eadf606fc14ea3879d962756e664a11c0c83bed60f2c90dd3f9b4a17b517debed14d8fab6aaaafa417fddac7738ed09ba51c7159e00096822e6d518de3b4342319a8b1704479a4893bb2298f2e659dce0764ceaa84c88578998f2ad3365823d2b6daa9bcd1fb09d465b2956876b60931da9581e3919799a0cfc0daa0535fa7e50accb2972d60273d5e49c257a5d2a20c5370c99213b5a051719cedd194bb945d9e1df41c5562b08cc076a02e7317038ac1a195376df483bd56c2d846ef69c54fa051577bf8a937b1348d938bc959a9066ca2eec663d23108e54839d080c6f1f44d8fd79c9df92e218512b15500c621b0337bad62d661e379e07ea42ffc3886976ad3691b16c516caaec2b35d6dd2e4d0aa8ceacb796cb0f7a784b244e074fb3e638ad110ad39ef9aad73ab065fc26acc9e7b6f08556f75ccab843a47ae007806005c9462cb1a39d1b302f2655e8494d7e6de77b9d2968c2b42aa4da1ed6a20cf999a3b31274e671fd3322bbb3360239495c62fea4d3591c286641c17546345100b360ee5b630b3df11ce552fa777a33272ab8635bdee5f3720aaee5832ce0021656cdfc295c0dd8ffdbdca877147ccf3e7b1bcdac2c2c0b94665b3815b3aec9d8a93622f3e8858bdcac3793a864eaf05f8fc92521f823524c0872f7e963eb053b4597bc9bcb714e2b6830f91caaf7b2049f8cc51b24b96749c226a6a9e0fc734043db674aad4c83225ee57691ac97ec69c24c59d838d2479ec136c0bb6120771a59e0a04af5c2efdbe8c071466416ae2a1929ef18e6d0558a288b1294ea90183d3498dc56e0140ff91543439fc868e6e1248e46decb63c4f39b586fab4b218158c8d868013b67b0142242d0d74147fb10748b1c95ce001d58338433b7907435fe2578d2a0320a1482eedab7d62bf594e231bb2058e44055d06bee78b8c97e2e6a775a00dd25eae193c3f48e3b7049ead8727dc23ecb1d0ce12b657b56424b6ad71d246c01236aaa7694636e765379b261d918aa89a9b6b8ccf44fa29b889e2c2d7238df51a1675df84334242acba0b5a49de1a74ef81518c37a0e05e22979a08c465305b6e850701fdda840206e5c161af9fdd451291114213c4227ad4c7409b22f862571424ad67f5b6fd2e76e7dbb190883e1917e132a1119a99b5c60285382c34d7ca6ed1d7eed9f96704180110c199240b04293dd6ecf6306ed5c6e785e9befe0ef80be17f4ffcd8e1a9450777fd694cd1a7e70f14c54e96da2b6cf5c19cf11a84c1f789444fb8c23ab96b58709ed908e00f0c1c71ac91ffe5fb2bf5af5502a6b48fafb62314314b0ff4b76668d54d4ba356ebc93d6c33ee7e37aa5bf0c2e2805ee4cc53586d059c32fd66cc7e6ad62009657e85ee34f515a3098888d50952fe66f9cca949405eea3ddbd74d1880ed979d2deff11e6f7e1e0c89e3fd4ccbdd7d7033ea881d08375c8428c68418fe721e5c709a8e0ca7d2ee833c5bce236771b03dfe292d3018fa71e44049e43127ab0423eb4cdd6e2e02e5b98ebec56344b18c1401d6d503f671b8fe35394d0cf2970594e1a0e51ac5210ea11b87d178e77958d92462c7abbac0365964ed84a1e259e11211200520a80a410077c9a82fc0d053410557304212bef298d9d26a6c26c959ec60709ca09e0b97aa9ff82177a248176653c0d3614a8920624a9b93e68244f1e5007275b68c240e0b9a81f5deaa4a3343d39ed7a5c873502a5bcb2616b8f2dc593f5c96aa567ce079b81cc0e94a888e680c94d1640c8f4622ba0bd23da6a63b0e0779c10fb292eebd965fd7c7b3909435111d95a89b56cfe3bc364e7247b09c13b64d59a7edf8d6037bed26449427ebb70618524b8018f1ab5c92cc8c3bc1ba673506ecf2b6da122f5d56c5b9db80ec7481a128ccda0b3a489c1a08967128493c7f7b80eeb9ecb556be79e91a581862b38820968896f1830e73751233130c54493e150312efd40b5e5ec49dbad661d75045725709e8eaa91f114a310d324fe215dd8bb90e118cf6c6fcef970cb0902526d62f43524037c580f0bdeff2364286593c737c1193190645e514a39bbcdaef6e1a4b5d7508a42ee6c650382a3d75d5198fa57ca6438eac7cb9774c62cfd97029a84f0109bda17834eba62521e78c0e81141235478e7f9c8f4d7260b520b41c771f8185ad74e61c6777e506cb13aaf119d09f6cf1aa7308975791d320edb0990e9e9471b81703e57a8df4f4da1a88bfd530a03824b539f0a6debb4a5ca10781076dd73badc1aff31297bb04848bfcde4c015d04359d06dbdf1053042b7c3c0e8970e2c0eff86ea8dcb2bb67b8cc5531dfceda526d6e1b50842a0698e4c43acd8ab794df658d9550eb5438f64a1f4d89ac747167bb88d09f50e58a44c7ecf9a028522781b9b77fc666375da1f214513de7aca12284c752f4cb3b83b2d7a9827fb76ef76bac041b7f465997da424c813fa806df4de7803089be0f70f245a29e30a7a053457cff9bafb96511376794fdba0f90e9444a9a69ef34a70d3f4686e190001edf29a8a3616332e0f751e727e808986d38ae090ab5d4a1d89aa501ca5345b6d1dbfd28c13e8de57d3d2867b3e7a3a122fa916a142dcf2ca6d7fae033a66012b93abba2b14558e3a6af80af11d0af34c226bdfceae3bb90249edbea84fa4c21a7acd0c636963d26148df51e780bcaeae93ba42a631c7e21ccc2400aa545560ad474ebb26b8d0be7d44821a7c60cd5b3fdc8ccfe853842becf251e62bdbceb4f387de35225bf9ea574ef15fe675da958636e05d39381f7a720ca9ad405111fb337f135e64ce20cadf302463489802d927b954012b9e2f9a41457d4c4e60327daacd1f7233147b7bd2d245a3da81a8fdacec4548a4fea61c31f11ba030f199b6b82dc01bccb521079778cc63d5d1884288c064fec84f7596bd3296e9284a428ad7afe54724c516ca29d6e5e563e5b46fe99f57b2ea68840454f6be28ef43031098228d4517c568360ebf8e2be24bf12a2267f38dae377ac7ebd9b25391af46ed58d21398610f1e8360eb61fcc9c6368118c5ec6d82da7c32bd26fd2a296985933ddd08c15494ad2389aab51572dc91b5edb0d4544c83c253fc604cbaaf6223174e8c54abea6ad72d883c4907ee11136b41760f157620eaa9548600802821adf88c4c8632e207d293a0a418231d5a493e4098af707634ff82ee06ee5b44e0a6824492eef940b721f9a2bbbae517ec592f3696e80013dfdc35402e044ec6f95e0c2d196cda8cf1ccf4fa1ddc5c9fbbb8ce67c3d2859181cc6e81e4c64af9e0fdeb85c1c1779713a09151e6430dc1d29ba9f4b26e800b1edb8b3a18fe46a4ebed6d7f36d2fc4472872ea5de128dbdf8f77732ec603ac40b1843bce4d4de7843465e9a07d44bfd293930dd43558171a1ffb2673880c757572888f8ea2ec23c951b44805e5c3b3b0f8e3288a68c9787421d17e446b9e61f187a8be8ecfc7aa23d0cdadcc230e15ca9a26a70f14ef4b1469c60b7a13023c92f01452911a3a97c17e61b4df5ef4c0980d5abd8b8398eea5cb08238bce7b72be43a673fc5b2617e8b5327f05f1dae85a7ea1f7d0ec6826655ddc56230f550da93a018b163ee31d8ce8534a99478bc98348a66cb833d9b6eb5ec37115c585dfa86c8db801f48b1a46790dc01dde3f37f1e4ba062d58f72127c50ae229427e295a6fd8614ad4f7ccb526c403b73541eb9c4b201c72bab23ad9aa3134a132916491647ac3f1087764d2af00ceac4239667ca62a8483d1b7d1072707378370e1ff46a17aa71b740362c03024868c9e554b9f9d9f695d4a0a65dc1733baeec6b2f5d42305d6b1dddd296bfcb5a5ae7a1479626196f1b2b7948dced62e40a3664136e1d2b6b7cf0bc5e3c31f5ca0fd28ddba703a2109a1752ebae92c3d9ed6214e40782fc125cbf80aa4a158c9551508d4c99569d668c8d7b583c91c2e80e9b8523b71caf234719fe8ced941ae932750a140bee88d35e0d76a2d822952d370c7b503d95999071355c8ea238e1c87b71680a4c728666825b8a7829229af00d431b11cee8c4e67d532d74b8b4a647a09e25fc87dc53acdfec98f959e67bad77cddd35b9e2c02f68c80b9e1dce0224483ed5aaf863b8e0a1e6afc1585e5ec2109ebd86c2e0aa7e2a9785f09a97ab7991bb63c7d5d9c5dcc6966b0326946bbef3793e8175040bc4dcdfd08e7d287c184b8a091316558784ff126fe118fa12978105dbadd24a98c7f46a6c29caf5b0992e184f971a386773ba188dc77ccb2ec0bd99c8503a176d8535b6934b65fae3c1da73c5f6f087b76532beae45970de61532aefac91868783d5eac28e4e37822bf1e7dfb718db5144fba4a7f7340c35be09f9a466f735d545562fc2f58cd3bd8c7984eb31a0eea9af6f8f3b8d3918cbe30d0dd1ed046c11e1e6f05153b86ab6cab39d2de3f3a11bd7950ed2c55d87545eacd43a9cc787b5315f7eb7c7dbc2e38a2c7a9007a025ffb0c9e1a4511296e7431028ae8f5fa6d7d56093a295c33d2797fab2c3ce7b79a52b081597ac1f376c5af084f1125608eddddb06de53f2c5943f107f60b96101b776fd9cf7951dff8dc4e0ae482eb6aaa7e995d36c262916e2106710e84425fd44ba3e6dc40c3d695675086dddc02bf6015b817b91ef5f3ce9085cf57bcfec6ccabf04f6875e0978bb87b89c8740bf31284c1678d41ed985a27ed8bd056a6369e90b74dbcd331a0f9b485e5699d63aeb051beace7f99cb716f973462c4678f1c4827ecafe890b5084799386a44760ad037b041a863c52982be70bb4efb3a4d045b40e13b5f8d7d38c1b4237b7c8096e44549d79ceeeb259ca93d6ba4984219c0594dba8edcf8e0cc9177f2d638c1e5cece4a85a5b05af4091d982975937e201dd7119a59d03893107213c646ee662ef19baaeb645a7918da950b72ec968ed9063c84a6285c75bd6dd741c437fa8d83a633ee690b3249b0e08365d72c5ef5cde257368c991f7a0e7a62a5ad74c835bab17f1987f53589675d07ad771b2681970b4e82202143821e64fb42fc473dea581dc00f3907a065e871b63b36893429bd261ba1ecd946a5c6fd526cb309285c5519b928798b92c1f073a795799be1031bb0ae3b6ac7c26a61d1c2ab2c7a816a1200f6cae1cfa3601db92732421c28fa0b59da4168a06d3925308885707af2e405a0d5101e98b1451d26cdcfce8d8ae6c7cc47f84426af864282a4b9d34f140b6f6841f9cfc8b96eebf073a64d63019cc2a95f25a29c10597eacd0db3b5124697bb0fdc17e32db65be5a0686ac5c53b3f128db50f6773091094d7d2c46cbc812efc977908f94f4f592e3b612552b5f17a3c48363239a4b5481df1c19852816099d6614a3bc566c35303c040e44abf83a53dce99b18a006a9d85711b240de8a8867e371ccba8ee2fb7cc4232f0046ab09a825791328a28b28479f6e249fba1300afaef3c1896e0b55012da5cd955d50ecbfc691893932c6c1cb11c17500839d6f2de8d440de41f05baddf2b23332e97c8a5bb8e401030e4cbb46160347a7987fa399743f09ea1e6ed009174e6ce4e230f9d84fe9e37669a8ab7cc2c51533eaad960b74a05ed1d7f7d015eac711a0085af0859872c524775db8b5ab01a9b0b98ce89d732be0c151a71d0b4cd0c8237160507e316f3ac92db457267a05c84b6103953a595ead162a50cefc1a87321c18777e0e1dd16fd9091df01ff58e7d724fb89311c3176902ccf0ec7f3592abdb2183692523c494e483cc9921a4addc1afbd8cfe459af415f7cd5fd6136985c04732bbe81c41d9488dfba1fa3e8b93976bf397d975732a5d4ce846ddb29f423a39abbce4a8fad1c0009dda2a45b60855d9df0f95650670cf2d69b2d8a61f983de7588d6e0589d29eafed6ff59e25746084589dd3fa5102c2130a0440499dfbd844bb6920909742c038a0d303665756c98a4e01739d45103e30b0189299e1e48bc2c33053a1aeb2d86848e13f2a541821c097ef91373c827966f870658d4034c67fe532249801f3d65217d7475d3572984f31cee826989228eef5b22c5845491849b6660f7c92e2ed4ebe0c9c9fd7b95bd0bda38eb0ba8250d6a79b9b2ca0b37b1bb53a9e9d404155e1b8303e74ed547d6a02e1c48d6ce8dfebca0a8270c418864e081187e10ec25d0b97ef9976b8c8a4f53bc3a4b846d853b5938d109bd8a4cfb215941cdb9b31595362788d5edbc366af009cd4df28662ba1cba000b3a43d841b40356a8ac581c7e197dd436811f99206112ec7409465a7b5861a594b38193f3d24305368ee0652d263aa33902f28ed7e6ff48b70bcec2d602ea9028c28eb05a34f420a130744ab4bcbc89c6b8cca5bc0b64f8f05d08c80854d64810c9d9cee36cc9bc2b10f0604cb022c15d063686e8722450fdf8735833e706a96845b6d5b48e0b0c684f70d5e39b97cf1fd0c81e08ffddc46f595aac8ac4b8ee1d010be7a4791234a422f9f2e3df424ec4c46891ce9c0f2f116883f4ca1ab02a63cd68e3d7adc22457ecfca918fe5eb25ca3a38548e83b638524c08d0f22c91086b542012a9ff50dcd107cb8190c5e515968764a849529f84f3e550dab7a8365d7e63955af5671941e99e29a01f2b6a66eff0b157724779b27c7bd05252e9452000e3fc6dfe14cf44f4caa6408001a6f3920a8d90c411a4f6a081432f852a7b35f54cac322f991d2411a46ca98daf415b10612f45880a7747a8900721c43c9172162ba6f04b711bf589bb1ebd13a792f42244718c5349740e9efd2021122f1b9ef2389e9c0971e2299fafb3afe3f52be8f9a85561c3671de78cbb03b3248d9e8c56e03dfe4b8e430d6d2f99f95e50fda1dc69f08c6e820914101ae48cf3a05440803f98725d74c56492f88ecd90e07e409aa94cf67229bbcf9803737b7410fb61b0f6c91a94ec1bc6e1998431056ef4f40185170d30f810692ecc156a1451dd9ef252a8b6426aa195c18fe9e237a5eef663aad210e1656afe1ea25f19b0350b1e7e488583659344f2f38756d48773818dea120998a5f3d0fa15954061a500f278ef43c84e5b28771f145f4120b882bb1124128a2bc3de6557898ee670d47a2803995021f33d984195f8ed40e4e2471030674eaafc3453713af5cfeeb1d475b85b00c5d8d7763aa5908272f19f3626a54380cabc25b943d999a18b6f0585d3b0769f64a0f8dbfea14b49a0c25b43d74b0c4d8652f690e2a91039bec5798ac8a54e22d6c2bafa03fed4a7cf649adb6c9697ea00ed19f9df0d2e4161aea097a3f9663a2a43e445cd12665d26e4576b0348935e99fe3e9ccb15a4ab083ea86f8a90cba53bd66b229b8ae93d6bbcd2d2ccf086af932498a33a4a281af1b725d9874d6d70fe38e315c5ec59545913e4f83cc6c2c21869b6803bc2f8e9503ce97d167bf8fb9e7a1f0f4f08b232191d8dc0542370bb953d838f0b3230f63c32eccfc82b995bde6a343b46c731d7479232c986c1c60d834c34d7e87c1ff860d6e994f4ce1ddeb0fec497c1d017740280c542093e6d27d0d673a8eb1a40ddb0d64e0fead811a3777a8f75e087d881f94bd28a278617decc4c410e275e81a7f06fd8272ff955d9ade9d281c24fa82062c0fa09863e5bfdcdceb16fae0768142e6fef3976ead0f0cd6c0beca1fbb41dfaef4aae14eb86a25a0fb9d2f1d70c09bf167fd069215c36efe345c3f60299d726dee5cd90df37f42657c69a2c6db2cb639bbc027be6bef959f5d708574ba312710614ad6ee47f6aa2b89791e8ff134607f016deb88ad3b100c49a065f6062e6ef9cacfc28097c3feac7cfe0592b642815de705bb178c88f54567aaa3cb76b6c106a3a1ff04b4cca2a9bafc3f8181172dcc72fed7f822760c920290d1a06e15282edd559f0af037d4aae632db830bd45a0cc130aa13d5a4af7ccef69a880e5ed6febfc5ce314b900eb074aa9770df3355ec9c9519f1810ed445d686a1387bf355a53ab8ef27b10ec13e45b82334af3e41aefdb0181218920227e95e7034f833b083195bd78636a9575b23998e80444fb526a0568a57bb20afcf4d584c02028cbc1d760851def0167fbcbae31e718052b1df96d6c7a01b927d10dc217c398a738b43595e8317d1b295cd507299800b3f73236f1c6540820fea994acfa1e142466197f632a8ed7a166bb1a288a13d52b8c097460a35dd8d3543a1162fe38c224dfe04a4732553a72a7cb31d4cdda6c24e5a9c09373c97fa4294b87edd8424969e1299e3ddd2be3eb10739dd5c9f1c7646131a62096a7f2cfbcc45d32ccd8aa435966590abcea105985331de19cf260875123e48e036c0d558e5170aed318f13b70a28ca55655e1fdb85c777957b2b6e75f10d442525dafe839a46ae12299c0cfc4694c4883199322bae0d752d8f20cdcbad6cb8b00053c333964c71a69dd5f4989ed422c6b512b6ee2be78a0936b507c1f2b05806adf76481b6e4856396c9994b1f307ecf631d5e2d4c7b3fa4adcd4810efd789eef1e70b562472abdc5fc77690eee9e8d1ea4e0766f4e56e007640da223fa6f295e04087c16f4fb9cf89e0b2d446bbcd7d2485812ed5c1db21e3dfec3f0f747c09d6f163f41fce474172fa2359fe23de4d5c72af14d57f826d5e16a2b23439d6f983336f2b076b07251cdd082953dbd97032a440167c4ffc539606fab913904098a19ffa024b560982ee9f8a3c93f743f857692207a4f733909fc07277e64a11c000cc029d6e4185beec04964c202920f7099bdc2ad82b76daea8d1029c90ea46a9c61fc096b202747f1576f1dcb0fccc1aa9b1a33d7112807c26b26dcaf57eb47786ca0b0064cd9f9a0e833125ff97fafe6a5c23a2c565276580f0910430dc2e21123d74dbde11545ceba84594af207f92d2a1810785cc3880ad3be08be90cc1821aa3177cc1d0e0733d078cbf3a5cfbce975f1fc899688535fb132401c264e81ad0c38349234f4c89b81cbca97f2faceb6149576fc662b70253ab4da8a6319a50faf74123b1a8dd2faca311355ea75e5d5006bd0182fbb7724ca94b8b8c9e8d0a05442862c8f7566cef706af56613e4f22195783f41aa329683448f6ef72f0b66c3d44408bb319c5e4db8e85683ae99b1a217e8e0140fc353b3da378410cf7af89a052763bd84d70863fe49335ff7021cb823f02fa4fed52c2022e37d42721ef60fa78a10411fc5d0a7bff3e6d8ef432380a2570f0bfcc3befad8c9ffc8655f18e08bcc0bf6d371de3084c287b4213e8b9cc81f3e6436f8fc039018a654057a68e3e34efc1aeef476e4454d6b53af27f1c0c7bd0914ae62eb68c4f487e148842a62d91d728ddb8f6b140b28555d67dc73a05d370215d293dfe47523d00e81d06957e52ad79f10b0200012145b47f506fea40f3d8c5f33c80e81931f2a7c269ef8ce03677a3e17e17f4f03e879d421e47aa64f0004433ae9e8efcb4ae29f8448f77f30c98a3261ca838b92ab01a36ba3765fcb1b964a7bb8b1cc62e85cbe0d61d64c5a27053d30f3378173e933244aa570f1cd9197480ff0fb2ac3a083cbfb6d55b853750f64e82adfa3db7a2c00277b6b59c782571bf26ea655f2a12c602f7bbee9d43726d7b30d00d4ef717873b2a93a8dc66d2a0f86226c99eada8ab6600fdc21b03fdfb2af0ea5d330a023e19803a0c934e273184ef7668cf980f294faf24af6555abe7d9029cb17493968617e7e981eb4e8aa9192c7902f0c478fef9f31a59a38777fe93037c5146186210b12abf6b8a7c13b8ef567b63bcf47221dbf1cf3855dda4be09f2ef18ef43634d002b5e1468194cabd9a4b6e0ebefe5d8923eebcf9c0ee17504382b2ff125e9dacce5a5feee9c9449a01cf9eaf9c561f91b760a61265a0061ffda06fea7f8713e3f2e62fabe212fd0262cab3f57deeedddfa9e1f6fb6e3444f8dd1ccb4c20c2d9d0ff53434371213b7e2e803cc96b20cb15207feaa7c60d97766fd93d49f000525b2f8e97826e2132e9a75f259229f7a37c34438bf12af7084dcbdd65461eec374a56b3ebc7e3203904f2386c01bf365f3f5b6f80ce8ca51450e399f91fbdc68705e28dae31363c8a81e29857a268a1f967e0baf5d3a18f417b0c5a265d2d2b44c7ae327bc6212c119cb85376a51099d3e77252115b807b9bff3c7ea4568400f71a0bb367cbf6aec3758c7bb4987a0d9264042ce08b0970bf92b622b1e264c09c0ee6a0fa30a377871a025c78392bf5f223432c5d1a67d32ebea96e66b7dbceace4802ca6dddc639f48904ffcd243ff07f001145555174a7fa6321fefeea1d20d53313d1fed47b475420cd49215959b7d82d1c3abe1ce20addf1290ab28571d49b4d29ee1f4083be76459486f7ad6b8ee2a77c128e7864c5a471413f50d066f6e7887070ea48c5eb08d099c1db4a3b46f008ae5a4f90d817d961984ef9f21e4fb0fb30d534ca11e57ec16dfca1fa3af94be9f705862442217200e26569296a6c4c9eb0d71776024cdba6ffdc5cfe039e15584a3b8fbada53782a31e926fd9c72aeeaee0ee575ff51f80148a5421f81ef6ef85e884d6ac93757bd348079d05d9744e1739324366ef9fbb53e2d19f5ebf26bbdad2e1687ce33958f46d87ff441467453b0b2a6b76856a85eea90a848e470f29cd26cda35f128eeabdf1108f6e3fd243a698b5ccc20e21e1369421ea1ecf4b9da392f0440c9cfb5bebe9938bd3b7ac4609710bd1b9c2a68722fcc09d95e58085420b84afcefc51048b4f1d509db83789df5b0239eaa427492d501b7fe1d267b9d13c2a1e114441b6909629cbdf9de2cfd8307610c52a7897c6f40593105db0306f8a62141454c0c23e3663c39127ab9f9ef5441c871096d853a31416b226ea5f72b034c86e9004fd14898286e14df57f46ee8b4dd25276aa9f8ac3b97f0f0d771be6352057b289dfc3a35b31d9dc89b7059af3b1b4db1d915206d7bc120dd313f07aa2fad46b0d652f4f4d276350e9bdc6a7b1668c4aeacd50a3f74132eb511665d3cf2dc53efa7f9b584f977df84eb57ede4a676bf79c323b35b5f9312a8d530fa932137d4dad5b6102b87462c656c3a6abb402f0d624d39d47f54a9f2ca43e364a757f270bd8979e9b8bef5aa999073488d113ba466918b8f980f117f48aef8edfadb2fbbb1095f5d1829fd486e200562d1f1aa0d5cfb120ad6952251ffab3f14c7ede4c0703adc85bf48129a8cef4835124688af1f6cce730c38a0418b16f30efa7fff581125dc188b89c2c9c4f7a15062548b90b8510aae7361c320c2aae17e33d22f544bcfd4139f06c182963ec421f5c34f282f9cd32601a0610af2eba62825f2df77d1b2d8ef779c14d494920ebc1e2e43b6d179fddcfd52acf0e7f613cb1b0ec620f6a18ec2afef53b6dc78d1dcd835bb22c50b9d8a1b7cb8b87484e5bcad3692011cb7096003daefd6288529614fee0c72af470cbada7b99979f50c6b38832a132c205e3fc6e671bfd6234c71234cd4a178d7c3ced167683722dc2cb734b5b68d01959ec35fd6c086527321189d887e7660444a1a957ad35bf7a29a83cda16b2150f1adf979c7b2f62a9263bc8912c899e5fcef41f6e02bc16a5f8fe507de1a3b5e1baf2fd9234ed9d49891341f6c3b0b01a01f5f453d994c4629572f89f8da8300be01e7964c322e1d43e86e7838cc3b08fa088786b98e278fd36d68a932e002c454a459884bcf9538e39e2a645a1e2ef8fa1325bb460015c5c830914ade9ad1a4af3222f9e4dd0aa2a0ed10281b246392cd2408ee7b066b221f9ad6b1ff67d1206b0d5db70b2dd39c87d61d962a3a170a591c59bae753c24e87c147faeacfa5dd5c5d9c6ec52f8976dc71c55cfd7e9f5c093fb92db0ddf44304cfd56bf3258e6a329225d19c1d91d0814768063a97eac770fe37d60a80859765962e73cc0551807cc947157fc52867d494b167e80ae6ea84ffe320c9c617ef4583791f1f746d6b0413fe8961ea7aa19746434ffb52eea8a27cc2f49f57e7d044beb83f8fbf7c0c6d8d70db5ec16d9fcf9716ad5317dab2e60f1855450c9f601871abe81b330e40ddb2606a456792d91bb3ee850eb36e1e3cd102bc1caeafdab95be1c466c5f52b64d252067eb7230b61959d29c6c9ca8416458fef1e95eec9357ab936f4acc073f02edeb05b0e2ecac65d1e3ee68ecbfd6b6bb0dc95c3eb53b3469f4292bb594de36eb062079eeef1cfc5c669b24bd5ebf1f71be6f1ab4c5e2ebb299117c460ad3199b2eceadf024e2b8eb4688c696fccd8d8bde0eefe6d0572ea6d0dd856bd655491ffc1a5e1dd5fc21b88af9c911f973d1f6e327caf2338953972838d5debb62c0d84dbea1acbbd57b1961388feab2c8581d0f4e711dd59aa0ab0b2bdaaec4a48fb37d34b44dd9d23c6d5aaab0d10ca3698d397ce18b053122e0e2549ac6fc6048ff0f7c57dd773b965313d2d8415a039cabb401f22da46bf80086a1aaac3dbef99f500bf40c296e4602f4b4ca2bbb9fb8b6bdc934c7a5e763949e19ee8e0e606f1ba66267182f6813920d7b2efc6160e68ff95b71133a2417bcaf7d26ec3a1313aa5566d7512038a7202046160c042732706c834a8027c97f31840e26b096fb329390fe30defebc9d688b7b56d12bf1392370e41abe274bda4e3dd6b8d596fd5cf9ab804ba429d184d6a2df4e20978a59634e6622c23efb1262635046ddeca1146cf0046fee29fb531800a8703ee505cecb0a8b7300492c2f1645125b7dd437dc841e584a84a306ec8b0648f777565731888269f30be29f3f6f40f0306283e8c38fcd0b0df3521374bc8f1ae714f915bb3a264c27ca531ccb27c4f9974e97c7153a75cc76b5c533f248119f0c936f7cdfc5bb716f25465689e33753bb41a724672630a3f34221770bd0e43d91bf2984e8b6592e196e985cda261530306d25808975b095fc761434e064e43a24c07ac3bafcce9800637d79068102ef869ab2a5c6385039746df0cc254f865c281fc2b18e9ce282c502d82c24bd27af47e8e6a8ba06fbd32c8451c72bc9f18e4d25ee5fdce3bcd362fe2e20eef677498cd78a87cb8cf20b43af3a322590dbff5770d41fc3eb33e917443a639c999b9dc8f7c21a72be8c29d642f7ad8654b19aa1b9af90d217c83246106aea75669cebf3bc32e0b56e0d6f9f53f2f2004ef19f53a42e13ae0d2b214e68fefde72fff8d1992766f4591f12c9829dadebc12e53c8a7dfa9fb151c17a7d704dcdc50b7453bfff4b7b1ba75d781b3f8ed14889f2e455ad3fbf0e5a318ac132d19735be1ef4d7232ef0aef0c540a967f02a8160ab01965f88d439d851cdfed1b2185d10c515ede81a5bd539910069cdf012db4170e7684568d25618923b70ee4db38a00562bf3373889674ed91a812d0729745547db4a953848022bbe7fbaabb0ed75a6e38d605081ed0aa60cf21ad8bf50ead25eb3a5ad470c68545253d2ce7894cd4ed8c2204f2d67ebea9d6e3c5f2bae72c4516c4a3259dca9579e685920ef64a3aa342e0ff00aa5523d3286ea31f50f6ed169947890a3e2b00c0d4ea5658513e2f4a972faa9dcdfa9e53a34dff194cd40c53fbd35efd4afcbba7898ffefdf1809009b32f95f8ee71ff6d3c3b1ac141a32a7e2d44b4e135028a127c4508721b7b72430f6df6c3f782651a12e8959fc493dc282a6deb2bc1588fa5a5ee451270323442af3ea7a7a69bb37f7e97fcfcbf61a9ba7b8887193af22f0a5763d4a454c12c21a516dcb11c0ebe24c07860f04194005778b3a57f610f73f2e1e809b79d16e5e9cd0b381f4973c8fe4b091766cdc50d88fd69deb6f8e06d7d2a9e0da43c2076ed295bbf395348946f45f186f5a9c1152d58b49d836e4646a2da920e5f761c64c4e332926203ad608e0a6338d0e41d1cf28b36128e2c12b260044169b2184d51718f4e9759858114ae00e0b74eb4547a68c09e5efcae8f92f100f44ef337a288084b1e1d870d3a50f51a832fca15dfa0c3671067bc6c1c5b833c12df1e016c810823b567becec469f0b4686b13bcd350b87432b056a7e03354c7bf21905a670caa4b6e7cb5bdeb30a3315208642df66d2e35ad33a1ed8b2da5b55855d359138c90df2a04bc2b5a4f5ed770faf381571b5d3cfe2cb3249ec4902cad3c6afdee3c1dc42254e27ae8197542c522572968f10b0de9425262627d3db01314ed712d00269a88401134254ad879bfe46a67a40b7e22efd38e2d45ab2032c2a39ebf1b69f7d137304a6e0f1a8faf9c19f5e4cf6f01f83ca5ba828c5f9303a16346859e07030a60972ba9fbab42512b7b9d985a13777839302b3861c91ecec4482c7bd20c74f3450c45635a20f1ad21c590ea378501333ce504164bf7a1a5a23bdd15655f39efa147e62ab05cbfac89a4733f6971bf4f4614b0bac41903eec4c09811191102810f045c286ebc42af132da406bf343ea07f3dd2e7ac0ee732ceeb53cb4542fd8d30096b1daff2f804ecf35a8b4243650ab3b289c7bf3f44951cbf89e88cccba5c300de287100af90ef48b875cfc7787ae73bd312a147b23354d2171d0b5617fad8091ab2e03fe18db81fcf115ad55f181bb15afec19e9375eee39638129c7e8d99e68ea0d29be920a5167fb0ba1e55f89468088565bb9e472179a680440d653dab8a802504daf53e1640fc072c0eab7a80ca7ab9c803b29c087cc253f0d4db110cda794e4d23cab100e52a90ad48907fc09fcc1efcee8b36b1148ee13044da4bb8606efab0ff141d3e9e98cf8a5217d15014a0cb648098ba18b7415ac8f478212815903c0ee221370cb0a610dba88bf8a27b230efc657494b4120781a08d4fe79166e316ddc3777a0f0563430eb78b8f706797302d26c0fc5c44887542812043bbf0cf3ebd6454d62d79b3f96cd0c4c93ce550c1eebc980075a2df669129677f58a2237f17db574934372c76106667dbd430e91a85e4eb3a772ecc210a9fc05d0b6672d8cd85382a28ff437a8811f22dba975a7d5862c474fe52f40456923dbadca57412698bd1d1ab93ec3bec4241fbd5c904cb310515893ae00edbfca1b06692bbc68fab07d9c5327ef66ee174fda49450e87e2a744b9d3bd56d1fe969789f80fe98ba29615d251fb29193847a65a95aa8f8f3f4045a5ca37de0c68ba57e81dea95a2c882a04be73f904fc50104090c0481248a110721a06a06387ddc37a157fb3b750347db60ffc775985dd9474a0f3cc8eb2e4f2291faca7ccc32784561a7ac5fad3b6b37cd38fa27655fb9e6cd557d14e46b658dc86bd97f08676d445e5026f836d36eda9c1174e3f4a32da511b75125bb8ae5c91e257f83f89aa8001d180ac0069c4edaa4dcdff8c165c314f2f68b3069e3fc21301ce74d3edfb01f0eb75fe27f6e0e3bb3f40adfd7c75e67c5e3a1c327e1a321933991801d142d3fe8a0d9d7691337210c421fdf3e85f893406a83d0c623ffe81cc7928ee543e7544f16bd0fef95b4668994817614458d059e94ae23f8d3376ec7ad0b8e8a8ed7bbb46911a941d7d43fd2ad06149798576b431a95e4dccd2c717f407343a57e93881cca40455a37a4cae093e7a800de1acc1f1b37020ead0def95f17132d15d60e6157541aa4c1a5d508943a1a673d4feb7360a2062e56744e875f258e1dda0450819f0ed25c145b60924cba90f7a5e3a4b28cee58e8bcac936618aae5ebee4527879fe95b2b0b22eff59dbae97aae1223878037fb5d825aab5e7705550a9f647a3e41416f986aa7197ccc2f837ed7e60953d3f602019ddabc1d196facc9c580571cdd2c0205e9cbe6c1e7c4299554aa20b3797a3614b4aa12d19657b7847de99bbeedf5405fcacdf1aed9290978450cc04f8ff30cdfd111c217495f7082aabc41ef4c2a1f170da820e8a2f2ee013413fe98c81f912b35ab5f84a1e3e901efc746d42e6a8b204dd09027f7bcbec1800f4117984e98bd4707b519606e01c7681538387ffb2666c4eae4658845f021712bb79969274a0f97d1c982353807231e1bdd4c9c7e8ab7387a5412cf1c5c8423cdb28e890af78802cd178522c798d2bde8698ffb6ef426c79174013ad269487a06fee2dc0ba92fa83121a97248b1b216a80133cd5679f779fd1b68f0315c63f8222cfdecac176c24f829d2f287ce93f9db4a464bf66f73fe021e82594eb3e401d28fb1b16334382434f7187b7b74c280219ddd1fee2b889b4381716440755da169088b3a44ec62198504b0608dacabe31fbe8192eb1bda4f20cdf164c965c34269eabbce991c099ce1096a32cf90f7db050c726f68688d2a7f7f14615ad842079dd48601843545e2281c986b1a79e056865c7e15b2635f0fbf20c882aa5972c25c08d1b4fb9aef39767771d34a408842592e02f2b368d3b7888c7d11988ee8c51dafc04f9443a81167e7a01d686f19d841fe1ae52809b8391c426f960ce947a897214389d93e93a3777510355a7f8559c96a7b1a7cc26f9e76d67ada3c1db8f90f9dcb15727e4341812b74a32e5fd6b78a9fb294a9ab29d2af034c96d303fd34255771945bb0fc7eeb238dd4ede69d2d0f50ae73a6885d0b41318394350ce9ba33afd660ff76df0fe06bd3fe2a6f7bb65f9f67b8ed259cfcd03c337e03e0aee1d085139a33c436a402caa23a685db81f743ee932178f2c45fe2877238468f639d1885e9fd3c93dd66c2d7214cd72c3dc7f66f56a29a471ae4ec35b1940a5f827af286adeae98d0ceb0429722faf94534418eb2e44d6356fdb592d29b1a6a86ed1de06713701d129ade08c238996ff75f9c569014283927a479fda624f2379aea1bc4bcd9683dbf9e42e2560cfb8fd22102ba030beeb8bc1948fd54a2b74752c9bc770502b6ed4db8f6e0fbc6543eed5bc6f3de4c035773ed860db1053106be551f2852dc514a3d1670f5a0ddf2e1eee7d3590ce6b62ebebf5888293253a95d0636f2eb28c354224a00a85599187d4ee06bb314ae573b0c3a12639abbe04c2404e8e566919e213bd18a26e15c9bc966960bfc8da7a32e374f2e1dd35f78650d570e678c9bb65d818f34e4f1dbdf2b816dd08a51535324e611a8554d2250258e4b750c75e11d530e6443fec00526984a9759c56b2a9f3089fb3ce8f2612bb5d388731b404930b0fc64a9db1f8f65c07057634c71f4eb70bdb1250c4fde6fee0ebf083e2590041128bcf98caa480311f73fe9ec3e20a7220ae1d2d5d2aa921cdb5d33806eeb10f18b837a71247310c2ea7f9bee8fb1bcc3dcb90e5758292482a45f87f6c572386c6e3701fb824b840260178dcf12376040c086687a8c9af0a39f8f4b1ccdf3a74d279436020ee031e483e0d9674e517f53d382776044fa98140a04435c65660a92d7d3b58c2553f90e84b9ea609a6093f60e0a9a891f014ab704cc581c85099a248e6677ca638af0d60e5f2d9da5cfe6dfc918c055e64760d78d85ff102ae4f54bd2fa3b67dcfa499931c7946455758d9a29006a88b139e915dc51bc7e16060a37b7b0347f4a89526933cc28d944cf826deba6c0ab24cf87a74b501b7cf6dd4e780036b2b6c548c0f5098e52e9a036a7928b2631b240caa58dd34b89d8688ef091a6b0585b388cd1326464f09809434c216d1f628e2f21c2e0e10f78b8403bf890acfde8f0a1b38755ac5e926e708dfef160ba87983f010a654ed667d11ef6463e1ec921a2ae204df4a792da6752073b6716eb215d40f5a1b19e68353fc00e4db74c3ad9ac8a38f158690305a196b75ecc2339f27b074ca64a7328d68010bbc75d9c385a474ff36b8dd9ac325fe6d387515fb2dbcd76d576165e1db47a3ef75cc4cd3398f20da57a0132edf9be9a22a74451d4649959dec7be671d219099b0566501f997aec122eb3d22c34581c141cc818b53a696db650394a2785afdc725ec73d379111ebab0c1a292265d3599e5d4c87fd2d571a0cb563b5760882f20b048f6e684059a379d13b31e6b65890113748327897d3c1fa07348e0c3841f99b44d64462f496bd6eb4bd9159b3ae7a318df2a06d96f80dc9302cebc0678d141020e3c5a0caccf61a9bb2af58a4def44f01b89f0d619d0a43ee455f4bb9636ba2e1f6fa2b6dcb4953fa5222fc0ea08dd36ea9a5ccff18dcd48e7ee2a0a8577afd9d012ad1cba1a5c0c26b1b546d411af7b22befd517523b06e4a173eaa0a4675d1675a884f9ab87d4402f7abf22218ee42e5ce040b5599ab7bf52ee1d74cdf439280026e80e3ec1240eef68d527ce6ccf6c97ceb8e796ef745e092996702bd74a27830c3aa0d2ca1e9df0d97e0be68f1f9b42397a56bb75551c1eda75c6c03e40c55b4aa3f30115bb1ced70b5403110dfa02ef1d1c579b1c11db2aeb2bc94af949a824b6215ad260bf48eb0c9fae460c8e85ca0b4bbe927e8e84b879c6d91943201834d405786e6818d00030dd30267b014ba3a4d592d3c0ea842c32a6484612aea1ad2ab6bf8ed226583a65164edea9f7950c596637bd5850ccee4becbad08d627740787d48233b06c6df21772225900192f21d7f525deb4a3c43b13a19a41e70682632e4d6db6396febc25c8dad39ae2c165889b7d60beea3c038f7fa974390d970a36771132f1bece686dcb47537f047d6c39d4d513ed0815103f4449df05f0d26798ba336077fb1179dc91e0d93c02f4762c319f8838be321fe8472ae6a1f5c9ef619dba1825f72cc6008c808d60b37c7b13e80ae5e74dfd190fe0a68db24dcc7a3e1fdb553c9e5b0af587cc67f608b34a508617f753ff339af40dfc819834099584fb0029cb35b6228dd52b2313f2d83acbb12335b583cfb16dc85a7ca0d07e4aa47f4c8217f5a3bd41e5c41d163f2439579406c9c7c1b3fcd41b4d9198c515c09392210b782ea26d01f4dafdf8c016162057e6154a6467f2eb3fe90075bbe98399fb7d0fb56b593dbc947dda443a30f02171522cf7d921e50207a95a146452b0f4c5c13911e9e8bc496bd60f47589d7af8cf2ee196ebf128eaf16b05a9525d2d8edbeb33ac0d352d18b94835a9a62d727153f8ae1ca733fb8e40f6016aeea7488212f39054a3b284d5ea0b3cb900af1718068da06d4da01612f53c5125d6f7b386a1c5b48c778f7656b3556645ee3e959775ed656bbffaeeafb39d59baec1501118a0670ce6d819948d02fd3275a1093e613754c6ce71ffa03e98e8e49c0d0c667678b52bca684425f0e1ba66244a1bf730fc3fdab78a6d4e179992609a7458c5a19961d3a264ba35d01cc04e7a52c29b59527eb458d3a446b69e07505657c1f13facf7c34a933e50e18279cf7d7a7837492dab88e4bcb7d28389b6582cae7b5e0e041cb929c0ec7f0685706af98dc4a0cbf33a7983555f06712ccc37e4be7dcfb4a9ad240b522eafc38852c303456a02b40a2f91856976ee5845f81b38d7e2cbc1cfa512016fea9daaffdacf6896fcda6cbebe5e173494df7c77576118ea0b0ab65460c1f2378195fb56911e65c37cd8bf59b857bd488262fb4b5a893c993cf4de64ee96e9eb6a0be70fb4eccb545a0b244bf1a699f48b54b9c82b004aa48612bf2eac713f6400ccda45a6ba43bcc7a6e9556962f15671862548d26d5cb385f82eb7433be076c06fc80025dc040f12853494941735613d314d165228f61a34014717cff7aec125a3f255f2bb08301da5274102e4a7a569384e8031f0324dc3927e329e0440c48a1056033c0f4cbc77fd481c0eb57ef215aa85a376cf34e9121c84d80f15a449fe26b8f13d2acaa5cd11e5d42e3495188f72c39de16009f476f0042527f9996eaff2136a3146b1c9472be40d4c3790efdb8eeded3a810377c70507ccd3451db0ff6c5675728c8751e1e621d76372e5c259c7310eef41cf6423d89a93ef5327bcbf8660e7d762a55e7dbc2467cf2629098fc5f723bb3004eb8e034bdef45448ed694fe58b9ff933047b20059982615741a5eaa4a991f8ec0128bfcde32d6a7c37d28365991f815fb4c45c918ca1518cbea30dac226bd272baa75f36a1d2238163ba5c8e6b18ae82e42b8d520bcda77f8e27a0bf06e683973beac56cf7317c31ac305095491d2252084eb89549fb015cf4ea33b15ff247ccb8cf0a8fc54640290f94fba867e66e2eb3367f070b99cc432ade3fe18e00351a2b2527377acdc9424d897812d3387d3180f1276bb9856cbb1e2c14df875a862cc3e7eb5f84ac1aa40559f7a21292f90d5f3df01b737a8789b97963b4b2475faf124d8edbac2f465863ae1f59f7d57da65a9b2d8ad397343a1f05c3e7d78e193e920e8688d57341f5b16d97b71d200a95c87e5e2017799e64e492d53321c3381ab01738c4f3fd067cbfc406206d2e07c59ea18e1e22f0ca1fb8d7cf8391eebde8551150fd3ca58d6f768a2ca08047ff3c87b57b03aac1dfeeabcc36559928fa58bb8b2e9fae422f53a028640bca6af4ea8e27adbb23fd52813d86da478652e7e704cc141e66c37522ec64707a4fe82cf1d94ae712c42d6aa6291907fa02cd26a287359d0352fc7d6193bb3c04ff483ff8ad89755f205938d52ca43f55bb3e6f8959b91789149afceaa116a774b4ccb013c6d7e31f951ed705d6ea87324f2ca991ba1bc9cd889e6736dd725f7ba60b191ca0d15c2c95bb1b97a0bfb614b7b7d4de369aae742f65b34436490a7cb24330c585d0d7096e3e192a7a242ea1182bf99aba952bb7c1b99715961d550586310fdb1929d709a167aedb3fe69fc2c285298bff0e642c2b5546fd6186aa34df5e4b48154050b1e4a7ddbfff762a7421f6739dde08a4cba8574606077eb7e00e311a2094fbb9f2abf63b018864092a6594b595075ff4eee357eea837e38a8d72a3fabac7182a2eef2a48a86a0580db935605c44b57232aa2aa80892ad7a4097467b33c2ed31cd404dd03867f63ef6491990322196c0b2d0badc990f236de84071ed8e75c60ec78bb016a572f1645853a82a6e403dbab4ab0e3a6acd6c2e1186de1dc4aba0086c7a9291e0c9cc52d37216a3feabd26e6192600aa74b2ef783c25cbfa619bf741b9e768f0a546afe7c9554b73a574308fc69d6e58305746fea774d7e85a86be24e48d428353f8d7b725d6ad576ce3c800cf11ab6c5da4ee2852f5510bdfd3bdc7024a6ec7b239c9487a76f4b677fc6b143ef2c24a39a7aff87375a050449b2955bd3f28f1ead218580c63d559510986012f2402a23ac99cfbb82dfcea84ad0a8bcaf76e56718e345a4bb8317d258bf88d53c3dc682440e40dd57d6c05ccc3ee3763ca581c7e3279f5946bb9c59a0acd94f7f5ee8887aa218915704f5ba4c6c30cf2c4ba76adeb4cdb81adfe1d2948d988f8c99aafaaf0d2b3609d349af759239636be83753e3b560a518b54f70d29133de5eaeedf6c55e0c041176de8b803e633401fb9210bc530cb1d0c48f68ba874141bbb6c3ec5eda20effbbae614615ca2df7b7fd089394fd21990feb414b9fca47891b1e6bac36f94412d08e226ac8102b907b2dc9f06590fa16650272dd19bf8462763c55445e1a3f4b568f911609f5b204da77da36c3fb0f6b74eedeecf6c9e1560d01b1109e72b0b15421ce266cb4b494a88b7923c2882fc6e86bae55402fae2281326c2edab9ec192f6db9020211bd4e497b9b940331a8c84afb70bdf0396a496e6bad75e22bc07f7ad3f51944986c04f1941569dfd03f001e34b09c8224ff4d4b46e9c1cc7d93e9181394ca519d67b925ddfe8845d54fa298c0bf45a84d6a6d0cf3b74650420360a939693ba1d9afab123a812156058e4fd0d215752d6b73b9766ce650422e2feacce56c488eb88e637f93a9d60d0b8bf10d08474d0d6c287e09acffb9f2e1c27fcdeab72d979c1f84440251818daa09e9f43ae16077128dfba5e6aa14cd55e4b25fb41ef40208e523ea43d6f024a7adb0986ea9f17cb35f58c291bc9752d41b5d1f2a2dd16e4f77c49a3aa2bc8a8be126856b1dd4c27e2c3248dd8706a220e0b060a4099d2d9a4c3c8b1422f10ca7a49cb289602d30a0ab55c4552925bc9e3c920fe4b55109b25a4f7850b964a97c662b4001ac00bec815e08211c9b9887bf1779a653f950fb36b857b610d0030e809eab35c91889c7ede961d6cc76564a02ed8021700eb47940d4097361ef412c5a2e562e563e351993ed9fcf941e38fcd3aa7184318fe293c3cca26a83b0bb1c286dd1fdcce124bd587897081ba762afd91312265fc3b174f45974c58940c58fa68a46656e27ead1d90e708b20fce15d027f173fab9ffdff117bd473041cd90958aec82326e997efaf1b96112986d7f9e61c70c2256efe3b22cab419caf841a69357589d69c601599348354bf4675cf0a85ff7f43d9997312e29e45a0659bb37fb299e479fcdec3fd1a8520043dd94e8223197a03960baeeb6635472417c914315e039802e185a1de02441c05be8fc4c10e56105086b63918d6c7c60eeb6363877547db62a3bc4d3cddc06f798cd1277b3ab8db727723befffe3a7af11d025ce47ac3629c399bc8b2ae54efaa67792934a7cf97975a45e156f05242aebad99aedaeedeede52a62403400ee50dfa0eb623487c70c004ce661fc9e94467b3a7a521f961a2019ca5d5240ca10752b6f1b36f2dede7055080b2b5b8e2a88a0d095865ab2e2385c97d2489eb081503741248f0029ccd7e8d016cf6ed8924885a0c94584114487076cb119870b6fb5dab76083252b2776d2f12c6aa935e778219e248206a5d42aeb508b5cacafa87e19582c2518b04f39b08ef94328269d55753535252566dbb565c726aa16ebfa00695e65230a8b39e41eda8ae7597ec525dbc2ca1a4b25b79be5db255149cf0b2cb35084cc85e6d8b47ed692694547b9bbe842f5b09909e4992f742d0bdd049d3c3210e4cd4a79829d00bf9ec73154320d065e071f48aff1f4ecd30147a1af1fcfe3b871cbd0ff403d35f04a293bff799f7e99d5dcf3f8ed6c47751bcf9c7d1cbf3f3133e8851472f1a7edf87f2841ee879df1982de091ea8ca2e7ac3d0f3c865ac3c26a8f359ea8139307795634a0294f27dd54959b9ec6fc5ca94ecd67aaef6a45dfbebaf27eae80f4ff7f9e34d76c94cd1fc6351479dc7fefca03f55308ba83d3d3dfe3f9e437de6b4b675ae4e30d3f0aa88a51ad4be547d8aa83dfea3eb6c8d01c237df3c3d29213054186af6ac6a8f7b5d7c96a66e25e39ef2f8a9c7c551ef62b9641c08d62fdf26a75e944735e5681747fd5dd8abca99f56b76995e94a555294b33b2f97b53565bb2a75e14e99e7328eff11c06ccaba55a7320b287578e7aeeda931a74b34f5927661a5ebdc59e97634a3253d41261d6fece39a61b5e894896e6b92ab3342fca0bafbc290be6d0d03a810ad95d88ecee6e65998490c14fd11c545a3865657edfed0fb2db2264b74bc8855396165eb9cc3ffcc2aba9f02abb877382998239d00b78055ad51e0f99f214aa18448b4baa98735af8fe602e2abb37038f0b0fb27b37c8fe22113f1095783a88a27a3508a550833c1984575df3b4b48f7f109c6c41caeed920fba72210fd5e94cffab4ef7db5d6ec79298aa6e1edeab6e59985eb4f5938168e7554bfe65b6bad157bd9b272b9aef83e19253254fe25eddc76083395712b97e17f75e57ee528ea6d873059df99757aae663b8429da38ead65a6badb5d6e644d173ee61e7aa78f1daf47dff0782f65a2539f762656bb55fbfd3adbc50b9955ff917f7d204b732612ed5141eaf9e617be39d5ddb6d470f57cfd6dc5c8dd05d4cff7a866958b1648bc562c9f6eb2effb09eb5b61b08e8e70745ade779e72e5f1bf9c7bd9ee779a1cf52986c6152dcb6d6faf09993d65a4b86b5dafa83dc1e8f23cff7ec289b47e557083aaaa3dcfbc20f64b158e5df07c151243560ee706fd1ddc1511f4bd2b57ce148d280acac86d5ac32f52bfaea2c4132ebef65e1a29b6f47f52eca843d0dc82d6f297e4c817768b5583031d6a7f8919582c52ac73216fbf2c732f6acf2168b855e79de5ac2945e8a1bb252e0fbb1ee591343ab759261c882b1ee0b9b564c4fc127e21d82f82cc81d4911b7c0243fad5564df56ebbfd6dff2d66a3968037a0ac6f1ac5df30e3e13df1f88cfc6f70f5274f378d6c4c0e2e1e6fb290847ffce1d58600271d4adeb50f45f46c68176f0962aad9904deb0d65ab97855e94df2b86467ba48de4daa954b05c6bf5fc3fab1da214c2773f8acf5fe361081ad91f597c53ad3f14df25938bd99f5faf1b4ac4b03ccdf9ff9d7f8459e4d183cbec693848df89ae585fd785ef361a3dff11ba96be48f974566d61973c933ed568a928631c34a18547c0b4c6a2eaff27673a4f871acaf37f1ebadccbf84f97bc9677db3ba2aa76452d7609e84d5d04073a69e3a8c4c43d809037b180ca7373fcda7187f987fcd87f914e692cf3ac9b306e65f3ffe8fa5fd78cf1407eb2f0dacbff7c9f3ded7082b61a8f97bfeb80ffb57cdebc686ac21c99b33bdf9f5296cceb495f2abe695c299f278b19761602e0cec759aa6f9437626e655905f8a37ef3d491679599fe2ef99c2c633edd1922a70cd5eded3b434f1cbf3c7d2c47328f63267579fd15c4f9e30f26160cef4e60b033b7f90cf7a983385b9e4c37c2d6760dd7fc1dcb3e6f5e68f1fbb6fb2605e050d0be661e39b250cacff0173a6ed2a692033eb73388c8a33c5195364f37d18eb7e6c1cbfc78f95b771ac39bf706792c5f2f2c55e663d2bbf7065e148f1ac146fbe706af4434e3e4ec93cdaf246de3753c018c1a468a56cfe906dbd89c177e123d749e57e7535979c83353eeb5f258efb25f9e38f23ebba2e7971dc9165455c43bdd1394705727f481a0463a2188fa878ef9d451103a96788a454ffc54f6d7dfb6957a9a723d9d1cb5bf5af4121aeb536a4b36d2847fd53fb0d55a5ad4079dfb58add4121e5ca825c7725d8e5d14b01542d397c3bc4d9440b91edf3705a23b9cc3f74db4df6c9b6ba267e4a664b25dbf76aada9549f7ba6e109a4a3b27786675d62d6b4abd0200ff972ea48559490905ee0623d00380d3399cf2f0a6698f67b5f772580ca60f86d94eb90fdf07df7bf6757b1ed50aeab52e5892c561cc9955cca9521ccb487aaf8771524abc4547ac1964c360966fd29aaaa1c9f07b4f37ec63bbbd6baadf556f7bc7aad3675aff551d38618a8b2c42e572c4b34f1e48a85045e72356b1daa4e348ca08a656ccdc82fc2a94af5428d5cbff6a7b45cffa7d664689f4ae3616540e98a6c1fd75a6fa933f5a6ce5e6f65603e7d65cbca293ea66b6d05d6ae1a42b54fbffd01fae1b9112307ec6367ea399833750f10b54fd770e84f71a69ea36bb0f36582a20d4409c0a142b1a2bc71efbdf7de7befbdf7de7befbdf7de7befbdf71e3552bd2fdb1257df388bad3d53f0ec5d4389ee32475db35d6b2b00e85ae7daa76bfdd43edd357b3e91dbb3076a4fd720f76fc9fd2edc2ba8687f0b97cd82dc4fc62037142fc84d78a006b50a6a4f77adafb44fbf96ec442e6707b91f24bb84212707470738383739b8b9b199b2b1a9c1414d0dcd0d6868666c30332303858c8c8a1aa8501143839898d813b1188c140c4c8a19a4480193010cf68ac1eb656a314d170c5caed60b5aadd20565494691e4d8827164b180c5129d10c5304b18824d80e0c7c4f77958b2777b97ef5d410db2d6aaa0063954a7e046670b22f9cb56829da37dc5d1de9d0de5684d0cac472244667dfdc202331c712afef82979bff7c00fafbd81697f7cef26dcba9c297e15dfbe1432db6fffb106fc9a3fbfb93a855f43f1acf1d6133f3eb3b4f07f2aee0809d7501d7545cb4f0cdc910ccadac04cfb29b7cebbba4ad515ea04a369696d822aebc712ba20f73fd1a609557bda6c322dd0e50252505566698dbb27685b4c196b0d13f6f66f98150b0670d905738bf957fbb2dfd93f8bb68a54b803af22206486596b613058ad7e85d5b7150613dffe285a11068359d1dab6229daef88eedbf88d317fe9e608a5f21401e29791b15fb495ce54d14ada5023b7fd887518100e9e4ddeb97b42571ddf7b395305f2fe2f465f6ecbaa335d63bcb74346c3fc78a4d47c5eff2268a40c86c675e2634557c8c9731583c3a76bd88fd2d4e710ce2fb59c6e0ef3a7fd411a79d79f09c1ec9459e9dbeaf58141dd7c440925fb3ad89a1fce174bffc9a819019763a7d678d7fb5912eeb1a7f5b06aa7466da566d556764ce34cca6795aa98839ad62478861f2e8be92b7795f82a75c77b9ee9620421e9db4f2726515fa94dcde14923ec5ca9b7c967ace93b06a2fad14ef250ce9689ff60866eaba9691de6c45d1753e4bc5777dcb78fd10bfbe23591a10b5a5d0b326d499aba2fdfdb6df6f642e04ae020d14526426d4a016d93efd2b868882e8ba3e537fd7a7feb0af46d987dcd4f535387272fd9c5cdf75f5ac6697aeb33de7b3b43f57996971bb07ccc6595ad8542db655387a476a6eb09ef53506b83f787fbfdaea7b6f64f3701d5f2cccba72a6378bb58441c435372a16a72c597c2c4ebbdc968553a3cc12d2b96271ba922fae3140f883ad9644e0dfb3c6867ba446fc6af3ce1ada76bfdabe37b219d9c273c8ed10cc3434b19d32d3de49595a5865fd4d5565fd69ef9aaa2f4095d3f085c433b216c74afdcffe17c7f03e81eaf9837f8080f04ffdf407c867f5043a7f6238ea9dff07a80254dc16d1bacfe5a63099303a52bedbfdd65a6badb5d65a8ff4f0a77319fef6c84ccd244198ff7d498030edf7e7d4ace9afd97ee71ad767377d2f18477777777777f7cfbbd6bab5d6dddddd1d7477ef7eadb55aefb6351cab8ca3b7d7570c3fadf56d3dc1cfbbd67b14433bb692f9171b798b2d18ab4efa59d599f54145a7bc5c3da9ec6f7de03d51a1ec0080b0533ebb67cd06cc296ba96a90e5627f506b0d557dfcbf494667de5cf61f1b84f1533395f128f4a632d9a372d4dffb9a6bb75cc9fe1789c9699d25e76fb9f8ac6221c114bfdfbbab94fdb39e47f9acc6cc308e7a8d41762d8e84f93d599a9dfa7496e651764ac6f3a87c9686cefab186b67955accc9f704d0d6d13bfc600e2b39e758aa7d764651e1797f9933036323a3c39f5a8bcaf38edd359993fcaf33a3236264c986d11ccf48bb25566fae9b27ffa4565ffefe79e5fe7fa1e95a535d40f8afecbc898a6134c7fc1e92ea83dfea3b51ef81787f7867f311032b75785cec5bb7c5e3cca31604ef994a350b527c465ebc44c7fb2bbd75b1acaa12c959dba8159f37df57c763f1b475d06a97f5ac9a360507b5c507dfc1b7b5413b33fb553afe3a84dfaac5e5270aa2968c9154b125c320bb93221821364223508f62e92304cf2c5f2c67ab184c1338bacdf4bd49a8c0c54086acdc64604df3eee81984fdb04b9760a72fd76a20699ad447f20571d0d1c516b3aa8940ad41aca0325d7ef226a8da77dfcbbc94f2bf505728d926b3b69a41e22d76f216a2d46fbf87712206a0da86b135a0ab5fb41183fad564cc8b542a14621d74f6b1572fdea968c7baa0766cb744dc8a66b43dfb51774ba0680b7c9791cb46b32b44fd772b48fdbd03e31806e501b9e9a991b36db17ea1a8fa1aef9689faeedd03e40dac71f0bfd2ee74c1de794a16b417274ada87d88b4cf54fbf8df68b191aa8182e69cda32e4c6e2d135bfe2a36bbedba16b9e0548d73caaaf507996aa28ff205d732d455d73a9f6f1af39145df3a9f699ea9a9ba0faf86bb1723741d6c11813b8dc39a61ddd8e149fd1e09eacccea2a776aab526b3592586769a22ef7c398d50c5be38ff6c7a7d6393ed92fcff129f799da44d51efb2cdcb5c7be88435cfb234b18c26c86d97fa8ac88a48dc0f00789b1eaa42c72f5bd233ac64aea8252a014b8059c82e1267b3338c2f3ce18ab18ab8cb303a56a8f8353de8db102b7e47e0f9c02a51cc5d9ddf7ee89b3c3d981542c7249c6b1dd8158873165dababb5f6b43bf37f43c128ab7fa43981163d501a39e6afdf41b2f6e5b8853e42f392547242b6b6a75695965ffdbaacad1a2ca39ea9e57ab55eeaf1888b5ca5fe8c1f2775585cb9e1552f63ccf7bd2627ade077edff7ca61f88121088252366a973387dc11c95199e75d8fb457a699478f0cb12b731975d9471dabab6dc13047a5f226e6b287b57a5ef5c27a8e4a8efac8947d4472d4736d6511b3acacec7b82699f720a466507df62990b3ed1c027f029bb8f4839b553585f5c863febca5177e5aeb2bf4b8acfc2cff98cc9753eebf06944cafe212e338864af72385d0e53b02987e76dda92533b25bb7775aea6fe5234611c5d892b49cd5c6bedae5dabe7f5bd2018dafccbc0c8c0d8985d6bedaa83a26ff3363a32b5d65abbcdd39574aded4a5c49bf109cdce7cdd55875521955b2d7b6019f683bda2b26ceae0685ae29ae27476ff2f53e65b1846d72be670f55ed418119669c5ded71d793cf5250ca7a3d545372ff536e57932b0339f72b032c8b25f08994c552f6b4076797bd21dd4375effdd4d574032783382730db9ec04c5d4d6d6393bdd3d5547bfcc6d5943d5f57151955ac8c55878afd5a5343f9ac272a4fd61355fb35e147adca4636239b8bf74cfb087c163e62fde7c51452af72b5955fe25a5d84a7a3df596d602a93bd8c0146fede8666fdf5d9f72c6cde90882cb4e0077ed6ba6d6b6d2d5be3c983b58da07fe18b57c4b5fa781fe28cc3e67b5e2adf175d6ba9f050ad3d85d8fc799f57bdefbbc0585b307f2c8d75374d776bed597f4e30d61bfd2007bc64f0cbbf6389c791f5ac1f9f7502c0d121fc82a3b70593cbafaeaf8ca11f7cafc431fef8d765dffc71f4c6d11b0243cdb5af8796bca607f3c98036e18b3a2c74e4217fca18ad0c43cd408ede2f7265186a16ba5230d32ac5c3f5f7738c3a6a50cd8d311d42400d62fdbd48b2f823eb6f79135f9e287e8d2c72804b6e3d090507b2e4f249337b67da1f900cc2f0250dad73c88e3f46ef4cc7b3ff7b16f6ca770c04a6a63c6f944ffebdf7de3b8af8873ff92edc250ef24b277fc8c3ef49d6dfa83d60bb7ec4a9f7adeff286f7ac16c6acf24beffcca5a9e178b583860257b4f852db9e61abef7e1fff0eeec5a6fb7a33dc1d0b3a31d4f1b86ad4fc9af4a660d8ed7d7afa75126dffef8c2a6896fb57e2d6fd8ecc243baf68c5f347ec5e90ff0bd2f5dbe6cc9153c6b70b857debcd1bdbe2cf9ba515f2f5c83a3feeb5f675ae37dcd691be5b17ee98dcef5eb8dceafd739be896f636b2ccb1f9d7461f259cec29e2babf4ec8aa1a3f0ec9f90ce9f90f6568a24830fa6a11024d9fb11a7ac07bfc43fc81be4f835b2f7e378fe08fa7b21f63faf0d1dbd61bf55ccd25873787f53249072e7ce588eb83aa22a7f34787fcfd34397f9ebd825f89beefed77a97f67d7d19cfd90f1f0982c3e17036afbc796fed7f58c9dba8f4bb131b6869c193f1bec04c7f7e4cf0de5de760ac3aee2ca89ee7e0e749c06180eb42762d6c1ffb5f48f39dfede8fee7fcf5bc45875b298f6ac325d23a9989ee95d26a018258e9d6c86f776770ca0f000978ce6ca840798727d7da3ab5f03a6fdfac3fb2224ccebb3b4060971dd0eeb0cdf835edf8ec27d7b4bb206d59cdab77fbdefb4e50cf62f0f6de47543b51266bde0f7fd1f5dbdd04b32ebd75df6bc33fdbea845af6b4fdb7ccf113c41e5d167c8150b0932837f9f46fe3ca4d10fefc9ecffc3c553bd4f9e2ae38d91af9873f456efd7d78ced3bd3ae62cf6a7b9775392698e4930cde6738434eeeb375fe6dbffb610d7e83dff6c57426bfaa8c2473a57595f97712665bb517a7e5a890ee4dc2d1dbe46456dbb5cbb264959fba2e27c5674e811af4fdfdfedafbde2a67e8cf3f6f91adabddb7764d29c9912c827de74ed8b7877797bf33c443c2a2ce20e8ead3afec5c1f86a6e9fa54e6b2de7596c63adbcacaee87a169cac8b455edb9bf04d3fcb4ada4d420fbb7d614f5d54de5a1fd21ef299fddefcb1fb2430e56189c02bfce21dee7c2433aa7aeebe2b3dbe47f3b177ad93a9fe96030d8d9ba10d7dc2f93657ada3926476feb1cbd2126bf96ee6ad7e5fb7edfa5987fbf99746368ad7562fd0ffb45edf8c787a31f14e2cae1b3ca19fa41219dad6d11e40b759d5a4f6b9dd5654f32df9ba90cd9495c187c49bfb2be50e42b9e66edb16dfbcb80197ed6eb4bfacc3a954753c5c411520eca9589245a720d1ad25f6b8f91fbf5bc7b3d9d7ced5b9edae33b21ae967cc938b932b1644bd6e57e0f29e5b919fcb16b8f4ef6f0839f38b3c94532b9f545379750d97edab99f40f79e303b7f0bd7dad3faf24710ebe4108fffe11ae29074146ca5fdf7c9af89813584879b6bedb95f4f7b7a390378ced09ff7e10cde8367dfff7ef47bff7dfae1cf3b3d2690bc274cfbcde368fda2ce4db6064c21aedcb5a73ba4c1e82bc81230c265ff7bbfefbbdff7a537fce1d5dcf0dedf28a743d96b4fadc151237b8dece7f5ea5eabcfbeefda75ec28f2c5291220f2f57ca3c8e5ed5aef9a1b7ed6e0a891ebd7c85164f7bc5cc9f6ef8fae4ba373d67286fbf60c53a35cd3eac5bcfde51ea101a6cc42ae5890a8ca9ffff9c3cb9b7defeda7457efeb8ef3378270c45edb3dbb66fd8b7a1a3357c7ba6feee7e1e61034f7945ae583670944757ff58a56c54becb6371884978c9250ddf8b6775d4f14ffd528d8e46fb0133d5c9fe0133bd1948fdf2e368f7155aebd3ba0417cda7f507b93e510d6a1a7ce4886da8d386f005e3e8fdbe37bef70f1c657f99f78097fcf913c5ef3d3725dff7803956db01d36ec0748f32bfdfb538cdf5dd54a8473914b9dfb17d32fd6b7632492f9d5c3fe49603a6f9a9d54149f159cd14a841f77f8867daa96d6a9533f8dfdb227de7b3761709c3ec2cae2b666d4851f80e55d28024cbbcffe827898b3a93e387c91feff7664903cedf69af385aedcb6ff5566ae4d4b23a4b6b9d61689aba1b367bd406ccb4f30f982feacc4ac24c6b55fd527c9a93af8ce956d66ac01c913053abcbfdb6c9673fc467d52015df6f295083b259e2109f058a1f7b15b833ac9c417cd6d7f2c6436798b3a16278264bd4e95135c83f2b7fd8ebab2d533c0f611662ab80cbb60659f361d8ca2acd49c5189cde5d367f6c25ccd47f74dff9cc65644e5c73bfcab01cdb8dceef1d2a75281fb2ed954798a943595dd71c88dc6fa538945ff1dd78a636f380c3461145fe9c5cff83fca2bef887fff7fee387e50cfe1fc94367f2c71147b5bebff23254617badfb43be031016ee9d8da3a5d559b917bfea5a73699f171eb338daac1c32385a557cda22fd3c8eb171647df9fd360d75badcbf83a5ed542d2d725aab9c781ad9df6cff58fbc344595aedd03c53a32ad9ff154512d5a03ab34d66da5057cc6e2ffd25f7d72cad4f4d13d49a0f14a4d54bed92562edd5369457d8bd364705937972ee2a739d95f45a50d595905eb8c74555aeb63efac4f3dfb6983a3f563b8561fd69936eb434bc3a1cafc0190e24c4dd86b4459b8d61eff9b5ea02a54d12a5465fe16bf6056595869323ebad6d5c7ff47067dfb2597279719fc3f9b0173fc1f427e08d59d5194dfa83a290ff81587601a05f811e59d1c99247f87ef47f2472ce4fbc4f7efc92f6dc87ea640aa54fe51b391bf1016ebfb4ef24cef0fbb4f7c2f59effdd86978a65dc1cff57aa78edde5bac28dcacbc2152db4370592c51fbfaf8e4fdeece58f977cf28867f13b6b0d3fd957cb0018e5afc471bfcfa1103a2a031e260dc6d145422106416281620624962186f014b9eea0e0e2d6dddd1d0032bc100a01e0060016b887d6cdf75df85f6efc5a6128610e0179a92272a4bf680720404247beeffb3e0ff4f011978138daf869f8b1fe03df718eb6c0043fad57471c6d1e3c7c8447e349e57bb1c4f1b1f0f704f3c3f1f9103fd657e2f84ed2070f1fdfc9c347f6fffe45d1fd4e1e6ef601633ada95ca06990c009fa532a8a511e9ef9f5c8180720ebaa05ae5a8cafe36d42de3dfdcfaaa430639828bca22b2897238da720a67399c5c3f5a6b6320bd2dfcd1c3dfdb1f229fb5ad9888c85133dfeebe16fc91e8ceae6d2227b2e19637f159f8263e91cffa5b6ca26b0391e7202272d4df06475d14c5d3c6d12a95233cc3f7208e7acd7896678d28be9f452edb2561be5566e10ba3334d234c900ccd1c9616c4b4d50ae77ada99322ec3df3f60a6285a81a26cff0892f7a4d2df65ade78ffe8aa3811c2d71f40b7de5cdda6beb2964bd556b8f053a532021182f77f4fdb9bd1f149d92fd796274bf3d7f78258ebe8f7e7fd73ec9d444511e98db81f06d124cffd0bd2f4cc5bf677534fc9cf02714ad98be288ae00f58cfeaa8d4a3c290064cd99f8cd2b205c6e6b4484171c5770ee5a8dba3d0caaa6aadf5b157397a7adda1cac6ff7e1cb145b238478f1c758be391eddb7c3bd73ed3cff6742b15985539f52b2fd95dc9bd7494a3956671321930c55cb130b140e851b60833eda8a86b6371563644484791cb2f0a73ebd39b4332b75923bf929fdadc7d8e2676fd88bdfc3dc1747dae1f9b2c5dae9afbde3cba0d3f3b62cfaef1c91f451739822e5c5f6f3e89871499997cd78fac6ae612570f475cb3896b45abc94398cbb356d2faa442540b93fb4cede32f37ebed159fb14e08e86428f1b613f80dded7526bf5428ff29e8ad222d504d3e22cceed91cfdae690b49167634bc6b18ea3f5eabddec5a9ad46b7ad134892a471b4b3755baffd2e295b752bd505e723049dcd9e546a7074b6b02134059e7324c779268c86d5d5955515d52e4a6a6a4a2a6ad7f454050aaaca5353e31aa973ad6b5de71aa971343c134655e5995f84afacaaa862343c332646c3f3ce20b8c70dad0bebf1b1f7743c4a84e6fea9f1931b4808904c910c8d333583e06a651df33dba86228b3461649ef452e7623411448a18f1e1fd0120430ea21e382082f408da4a93a0972801d4bb09defb04ef286825fa4aa74005bd6b2ccd4437f19ea59d786741b7a0a356d02e787f010c3a062d839e414bf5134d83f71a341436682d37681cf454eba077d05b9a07dd83f64153f50fde81d03978ef203497f7170211aa8a6084237469242441093d04ab253413bc38e109ef0f85ab2848610a5f9a40852a44c1023cf463db00b707bea1c00d821f3b073813d1c4c9d2932298a044516292d4363f8299daa820b83b70d4f446b82bf048705be06fc0b7ff010bfd11dc48ef036e23de08ee23be086e249e08ee255f84ddd683892857b93211a52aa7f608b932c1f4258722ab6bade43d09d0d3fec6ecfd757c26e3fd514bbb7d0c18ef0f3454837cde3fd7a016dedfd6b59ef77fc1673cef0f009fb1f02b64d97b10efcf43881ee21510d4c3fb17a94132ef6fa46b30ef7fc467e27b03f1deb8f76fa37724efdfba1fde8fbc1351837c78ff16410d32f2fead44d78a1079fff6ef2b435ffb59d0fbb7d48cf717fe5d55835cbc7f17a106fdbc7f1ba16be87b0b16bff3fe7de5389fe9bcb707dedf57bc9fefef3a4bf3d15483f0fbfb1135e8dfdf91e85acefb7b123ec3f99bf7f7293eb3f91d5ff3fe7ec56734afe3eb8ca511d520cf410d6a275df32d4da5464311f2fe4a489656d44aba0f33bd20346237c420097d1b815401a7172c20f4d788a6a3f7ca01b4cd855e62496c9fa83d34681f206c69d8dec076866d95ed6263600b035b1bbe3ef822d51eff16f05d527bfc7bf04d6a1f7f1e7c59c077057c33be327c2780af027ac05706460402df281cbe5a0e80af11be48f02500be3fe07b84081f8c14c1570aede34f04df2f2fece16ad80bca616fc68b225c60af0aea41b9a703f674b09703f6569c3ef063af083837363b6a68f0a7037f4833444d9c2c3d61aa01258a1025fc4531c19f1647a592f09783dae31f047f3d30d8c29f0eb23f6c4bf637a9b2bfc725fbd3b0fabc64ff1bbe2b107794fd08b8a97c4751052a7c998214a27005852738c10b11f0d75485bf238a803f248c80bf24bae06f0a12f0572509f8835202feae0c017fbb25e04f0b13f02715dada0a3bd9be9bc084255829210948e872042314a18a083ac05ed50eb057842dd833020fb0d7a507d8b3f201f6bc5061efea07f8c301017f4741c05f8e0bfe9884803f1d68eb2108814b1080f0032a1ff480075b76a0831860af8a0cb0278219604f0929ec5979027b5034c0de951a606fa7057b5237c0de140eb0b7650a7b549fad73c0227b0a0737b0011435a0c113523390410c76f85e61c1370a4ce02b8526f0fd92057b3827b077d402ece5a2b0c7b402ece95c80bda617602f091860efc9b3b51692ec2bb843f00d8317b820aa052c70224b134c60d9f508f0dd59c1170b09f06562097cb39400df28287cb598005fa913e03b85027cb728812f550af0ed82afd5b5f50a5480bb03df29c07df47d0577d3370a7057e0fb04b82df06d027cfb86c242df25c08df4bd046e23be4980fb886f2bb891f81e01ee254308f13df004de0877108f047795bf012be07fc03de58fe016c1fb80fb036f0477922f825bc913c1f783e00b656dadc40bafe46d2efcc80a5b4e36fe08b38e9c88003b09f9ae829d6a7c0b819d88be91b0535fe01b0a76daf1fd043bf9f80e017622c03708b0930edf54b0d301be9bf41421df41d4f81e82e8852ef01d45c737d38eef251fdf1fc8e1db033a7c77001fb1905c867f9220dd816f269df4ade4be0b1849c6e6c2b712e6c1cc9d743ae9f84e827930f33d9d72f81b3e4ae2c280947f011f25e9286c543a895712da5c38935410c9d278b0a1c35ea4fb74a32c8d86f7bf551e92a50dbdbff76469395e87f71adeff43b2b4fcfedfd3176569b6f7ffaaaaf835458b3efd4981847c5aa314f06995aaf1699d4a6b555aadd27a953652dab9b475fd947695b4a13a2a6da9b4a7d2ae6ac0a76db5c3a77de5804f1d29fdd4733f3e759d0d9ffa138f4fbd0a54013ef528037cea52387cea5308f8d4ab12f0a95b2de053bf62c0a71609029fda5c043eb5ba219fda27097c6aab58281bb607c09eb1d780bdc973e0a6c24d00dc34e0c64d20073ce463870e1eb0dd0d89000418b0800420008701f0b0e147ea801d1a0023e6f1398bc9b8c17181a88602843411459deb2270b5bd0483b92f70bf8d6823928c48fa2f9f4bb097bb02b89d92c04efd747363c0cc48a1ad9fbea5e021f78520c1e596f2635b00fb133e2a7a256f2b3aa974d2277d33f9766aa7a4a41ff276c29ddb02b87333f9924e0bc8386a81bb010e6ce0c73662031c680e6c60031c0037709a46f4126cf3e8916d01ec54f49d047e298d81ef0a9c321ac047543ae9938051441185ad35f02c9ccfbaa933e0b3cec0fb3712b86bcffdbe000eadec7e6300572b3b02d7f6499760ef246ce270b8241ce270b89c81a61f59e5ad9bce176667a033f0689881f3c7d19b541d4dc232381c2e8f1fd94b96603137063095d67d5f001f51690abceec79682ad14ec52704bc135c3e09bdb02b82b808dc09e11f81a81ad11d8735300878eeabe93be29f0a3abbc3505ce1766eb743fe44d01dcb98dc09d3b09873218e5d69da6a3d7085cb3a346e02f8f5d857e090e97e09ac7916495f7fc9c30697c7f10dc447c0381bbc9370eb793ef813bf746b8971e09ee277f03ee22fe07dc4c7f043794f701779437825be98be066f2447027bd104e3bd358d248df3d2c692542bc1de2c74bdab2917af84e12c47b473fde6f6c09e928987cd651dedfea7cd650de9be9fd6d93a57511ffa4972cad73efede4fded159f7593f7b73b4b6b22dedf3ee95a2bbdbf5daa41cde4fd6dae0675d2fbbb5359da8f77171026eed3301b7d6a6693458baf96268047df719696f6aea92c4dc80f9f9a3906494c4c48153bf26998633b3a2bbe5a1ad1ff7cb5341defe25f9cf89f88a5f5b0f1433ebc7056e6463e3573112a2b732242395f2ded85c7b9b1a9a1f96a693e7ec6574bcbe183be5a9a0e5f7b3f82e9df4bb08d42c256cb10d84e29c1768b10d8521d61cb2509b6554160dbc551ff70e7df40ec32d8647146670a4259997f88e44cc31fced404a58e9c2948e5c39986a09595f99b46ced42c72a62191333585ce74b481bf1b6ef82180193e1c6578d106f68204618561c862d9c0f70007f0f43d8600fc88c306b60a50000f215296e680bff1230c2f02c006f61e3d5e68dd7678175e1ca3c2f1478fb481db76b15351d1db28d034411b258a55749ac004de46594b6bc00f7d8ae61fbf5a9acd06066d173b11e07b20c083394b0b9baccc3fdc41599a03797f6b65690f787f1b6569367c4eca04a16ab0513968f8f14129ff10c91fa4b234b1c9caac2c4ddc85612b447aa29232a340ab506c39d560e5b0c9d220f0fee193a50de0fdc32a964680f70fa12ccd86f70f77961681f70fa32cad00ef1f4a599a01fe86f70fa92c2dc8fb87559646f4fea195a5e9d8f1fe22ced2841ce01d87f71775968680f7179b2c6dc8fb8b4f9696807705bcf3787f71676912787f31cad216f0fea294a531e0fdc5294bebf1fe2295a515bdbf5865693ede5fb4b2b41cde5fbcb2341d2cadc6fbb3902c6d02efcfca591a0fefcfd2591a0f7802b8084b00f318825b086eaa20d89b22801d02d8e21e80ed0e08b64d3fb053a5d81d8077c08db332ff06e88073c0d5ca82de07ee8119b0001eb85ad9ec158013801180ab95c5781c70b532187f00bc03ebc044b85ad9cfdf800d800b806dc0d5ca7a9e0078005f03ce8169c002c033601970b532161f030e00c681ab95ad78006018fe06ae56f67fc32fe06a6538ef02b6e18c87b00d5c6d3570b532bf2a626230297efcc8506ccd7c2d854e1a58e887ac10ee5cc34138ad52698d4aabd50ccbc031300cfc02a70e957a151f9cba540f4ead2e5ba4d43ea5b60a8a5be0d4ad52bfcafe3b5807a79e4b5d8771da52694f21754e87a63f3338b5b9d4a762ba4a5aaf70da4dd977d97143caa6ec4fb2422a113724cca94835c4cc290bd73935ca4278e41faca6b3ae40d2fef945e246620c92194642e877a582b1eaa433566dc99085ed16500a940262bd22986e7e0d9b1ac706ad05a168a547b2f8a08841a9ef03cb1b370b21f3180542e1a8b3a66c06bbeb90bb725135883616cc95834d617107a59eba5a07c10f6ca546593c419b3fcf76ea7e6aa7f297d3fb3320d35875d214bbecb5fb034201d37bef882b230b938e7adeed8d278b75a640ac551e5f4c323bb39ef59d59b8b377dff03e3da2cb1fe935a298d6641f6168e50e3f05a3004621a9cc7d8e55b5670933754d8d55aea9d18e55d96f7c279962d721105419f6749f72bdb98b34465959d76aa966349f5a2e339fda2a9acca7d6aa8666aeafc7ba31cad2605351611ea370786b8bd6de2fe6297baef9abcbe67b12339db11a806853f1636d2b1e2e1df32ffb3438f1664f2751fcab834d591ab8bb53760adc02ee2c0db6b3b2fe7037c23098613438940ae5825a59197a5583db664eb4caca5a8693e5723f2cddc9c56431531e2aace342ca4a972b314df32a836f963710a9ab105ebd78a87257c14c3158c67e144918fe720c76b2d1c243857532df99c23b4c8e4a45c9743b13ea46ea46ea068a9b291e2a4bb3a1c1f150d520da6c6cb02ecb90eb331609c31e599665d982e19b6968aa3ce5fe1432fdd5c2683e854df150c9a4b8acdf2c6fb11f5fafd7bfcadb4bd6248b61994ec54b850a0c53a142a686323232310fc3b68a95dc3f2363698e5cd6270dced126cc7427e77d4c18133396640c77861d5181c59ee689a689664a956a652a687056d66f9a3c545b727facbcc17e8c89897d4c798bc5c4bcb5ef504cd8c76020a0d48f0f6058a69349913531f1e30397e9f27e7c5083ea8d544c59836813dfe29a9d9c28d3c53cc974352a6a6a66ac66ae7ce6fd1d674818e64c79b3a2a9a46dc1306b9ea6bc01a1a9cafd8a796badb53136168bb131fb43d6d6fcab86878ba330dc39863bd740e57e9a9f2bb97f06ef78bae4fe1436c543856f74b91fb6b3b498a7348cc176b9657ec8776ea472bf0cdec95959bf0abca3b3b29d1d54ee8f79daa992fb63313b4ffd164b544ac343857524d6ede476260d8ee68806c967df954cca74b95fa69335f9ccfb8e3d787bc5c4bcc5a91b61dad8c7589e2a479b87cb8d06577bfa6398876a0566ba93cbfd290f55eedf69f2594a134b37365fff851a1a1383f9cb3d4cd3849922699af7bd997c0e0e76bae1c771bcf61302c66814c5680869314663acac91d5327f88a041adc79ec4942b3bcfa2e5c606db2795498f196bc5d6c076676539a83d3a689f2d5f968460a7b23217ae9345cd9960425e9190108d1a356cd818ca34683499f136ca1b7e1b43e54de887d033c75ca2597ac1c286a6c50e8ef7433e03058a8b15333f3a37345058eb821e4589c938bab531211913438e24ab6576f91939a7e7494cb9e23bcfe25a7caaf66c71d4a9b87871f48bc54579d23e96c98abd62774d309ab36951b32206b33adb9469d0807d8df2d64c5ebc8df286f33686ca5b33fd502e6f2b3edbc4eef7f2d672713a8162eee09998a4efa49bb751fea242d7bdbc5d1b1a3aef95b79cf79a94372265ad3d313f7ae00541eb0d8262abc3c63607c3dda5bd388af3232526137b128efa14bfe2bb2caec5a77c4b52142ffec5e22c0d6cad143bc5516b25075b1c162d273b4b37b79fd8e8e46255b5f4cfc9a1f92f6f373c8fcb5b67791c74f36779dbf973c50a1daba3e35d7574c496ff8f98ec13b5e40a1df2c67082080bf22bdbc9c330618845a2e8b8f8d719a205462e9e49ab856bc58a1649a2645c2b5a42f4c028c160cf82c50bd20532232c600fc36c25325688c5fee7e715fb16626f832d690364c95bdef05f5a0f3f8c30dc4db6488f6c164946a1d1427913fa167cca5b3b69f13fe50dc9ffb8286f42ef8289c5bf286fff2f2e0c0b0386778501a385f216fb5abbddddda7bcbdbcedf56faf216e5c50b18e5ad25f431cadbfd18505a2fa3bc7512932634b115f33060c4286ffde45f4679bb2f6336a3d1802c1090770502125bfecd44e9dba3bc8fd696b7d68cd25ffc5e79bb792fc9dabfe347822ede2b6fadf7beefc98fe1c3307f1e2c6f3a0f36938fb920818072727e4650508e9050cccb5841e805c4cfcfab84d24203f133fa8047806a139fe2ebdb27b5167e7dcb546738ffe4535b65f6c3a7d6ca8cf6a9859af5f0a9bd92ebceea72f8d4365911d811e4146161c287d9129a9b9d209e1a0b484e94488c2230c4d6955d47b59696eaa34f7b6ac70a974c27f9d48f1cc99584e8616104caaff82e8b12193ee55b9cca53afb2722f7ee55f2cce1e11e0538bf4b1769d822b8d82af2768a82fc11224b0f22350d104ee3cb6c8b2f4bee57299a6399ae4eb35c260b0f1befdf7ae0f6384050b7286cc080b25325668a209fce51c9a68a2096c730e393c69a2091ce61c72c821c9063714283fa62061a5f7291a0626168b758c8c8969152a54acb02b5678d715dd72ad5861cbdb8c8c6b450bf15e79eb8101411004892002c49e9b8826e2c79004979ac035cf70c18f32a48ad27b99d8cc0c0d0d0d0d5953debcafc9b1216d6c7c88ddecd0d0dcf004edd0b080a476a2670c22280cb148ebb8f8d719a289918b3fc2b566e076c133cd44fd7843da94dedfc070707272726039e43f0c632cb332997795c17668686e788276685840523bd1330611148658640677d4b713274e949cb4e0c793c4a5f7e70a72850ea9a3d3d22177765a2c58b4782c0f8f77e569ddecd0d0dcf004edb080a4d6021f3e7cf8683171e2bd6721cbf9162b34138f9637f3512cdf5164e5cd7b5947e1215bb35f61858ee2637d7cbcab4fcb091d3a74e8b8597e64816c756e2759b030b1c33905d8f6820c38601e3e8010e92bb848a3001b39d1184560887d02dc228072e1a3b54081b4a3044bac70c91cb9121309acb03042ba6005194b2350f1837d8b537989dd8b7fb1473687ed52ede90fb17d522d9395629bacac1f08db29d68a3d00b63b560e26798258d041c4091da316f451540b2173a816a010c022e57e1babeba741cd6666cc08aad584847068d0701dd9d9a12d39b2336ba107a1574f7da51ac4d7771dd45a0fb1a5ce6e983ef5ab2f3c9f5a1c1048543b3ef5aa284c21850a9e9f999c153f3230173045aeea175c1f21e5a204c97e20baaf831a81b1e4838fe8e46c6124e3533f42120369e7c511af0275a587590b5dc41150f8b1c07224957c4dd242283935113fe69038a5f739ff18e31193e739ae58b1a284a15bb02db4e05d5b3082be8fe8c36d513bcf16329a189d319090385152c25fde81ab4d494909dbbc63079312f6bc6387120ef38e1d3b9294686c7e1462c2e4471d7245e9bd4eefecb06051decc67918205d9a2bc79df02072551d4d55166b0a8910535fa0f63c908fa3ea20f37278acee19cd013274d96f85146a2a5f7b2d80a2bb0c0020b3116481e9e584f4f4f0c1b2386778d11fb59310353c4450cb3a8a9c15166b0a8f921c88913274e9ae05ee2db891327509cdc2512fcd802d9537adf820fe9f343c23055fc4f7933ff27c50fe9a2bc79ef02e705f9e2058c666934ef4a8b32339323f3330353c44593e0efbd4a51acfcf88284517aff4206cec398a948f1777661982cfcacbc35ee6737c8060579d7a09a6f14dc5674e8d0a1a35b77043fd2ee089c6e78154182040912244851519020e137835f90018711601e3e80b0406ce488a3b83e0a92fda0548e8fc2f04184422a398d642071266faa3d7e84103b47684c7ac09ec5512d3e1504f61c0c815d07d5a7ff06fb16a7722e8e7af12f16678f8eb0c86a9227e70746c70c2b443a4648e0d342875e22c613f62533a9dc2f8cc4429016e5cde66b424236356ae8d47456b8476ab2253e2cbd90f9d4a13e9b506de1eb3b12b5d6f3f53d893aabf928333ef52c1e65e453d792ba943f117dea55b03411a4837021166972f33b46301648829a266705104c7e1a47a48573b68842fab4b5bc7af86109ebd47438b202922b796e49fdd4753c2c1c013d6d2623c657183e5f7f1472ea227eec21794aef7b5a68c1c7a7bc99efe343fefc8c2e5cb818ef0c3b6386779d41e4a7cf16383827d213570b9c1e7e78b58484f09789848484b0cd44442029843d13e13124857098898888949cccfcd84b2f4817a5f72f1a068c183162740c52868c9ecd66425648c8bb0a3592a058ce8a6ff7f29603041374050d8ec84f2f2d2d2d2d619b75d061097bd6418725a6255cb3d013253fd2c859e93d2d06043463c68cd80c32282856abd56236ac0d1bded5468dddfc8d116ce79b200962d16ab55a4f702bf956ab95e44721b2567a2f4483460d1286d941c06043e5adc80fc170e75827f9ee308fb116e2471b24ac730b01d688f9f710d8e986ef208a8a8a8a8a8a8204297a6f14c5239c81b0adbe20030e42b008a2cd68725630b514223262e0b4407afdc004c3a7cb91157c60f2a616b01fd1831d094fc2a7f815df7916d7e2683f0f0b362e8adcec20d9817692d3d54a7ad0d1e1ca6cb8ae9fa84a6e98fe2e424a2c7a51ab3511a241a3468d26366c0cd9a121ef3a6464068b7b83bf6b6e7e7081ff1e71bd68263a45ea43f9b4ab7205e2ebb7116aad715deaac9dcc567cea4a443ef59c33b9ceaae8d3bef225cea44910d90ae70b9db1c9a97d508b2fb8b491723e7cda4c492c8cccd0917695b6d25069ef5a4bda544648be917af8ba44e6614428b87347c14e3afc0844d24aef8166cc080a2a6fe6070591b5f2e67d4d48a8bca12f54c2706bd81a35bc6b8d582dc76629a8c5e30809f990b483236464068b0b050afe7211142850b0cd454550b0e7a2222838cc4545450f05d7ccf4e4c7662244c668d41a35c818ae79b441c66cacf0e39039241b2263998c35c964ecf5a38d8ca13632d6f9da2c2dd5726c96825a3c1326f8cbe3259b09f69830c136e7900313ec39871c98e03043799e1f4bb255debc6fb95ce58d86f9660c77e9fdebf5b0f2863e2c76b3b79b77bdc5787ec78e1d3ba230618105d90a4444444444444182906423e1dc03b6d51764a8611c58c03c7c007194c81219211a1c1f581899010546acc16d25871f5eb85c4655ede922d49e3642f5e92e8e7af122d88f5cc9d1fe1fec4c584482594da23339413b767874dcb8801de9ab7e22fd3abc8882d084849668d4a861c306bae2669bb377cd2cde263643d3a4c97b799b9901c3344d5eec9c17c7c5a71d65ab5fd3ae92ebebebb712b5e6fafa6da5cefac9d759cea70dc5cfa73da5f3696f51fab4a9a072eddd1335583af2c30dba2205cabb9aa546d5b4681b167f3543a303cf809d2f76faa916e483912f42e46be756c24e3e7e64d1f871ac24399634ca1f7e6c99477ec8c716e9fde8ea251826fa26d9e38df976c2c4e4a445d730b1789bd88349f8cb413a097b49f826619b8304e924ec39081ec31c24489067f251a06418ecc7b22c5b240cb397be55de68fc0fef2a6fe6bb4a183a1fa1f16679f3de5c42ff55de56fcab611606f3aeb0b015f39daf976fb659074e921305a843c78f2179719895bee64ec23523f9b17db41723f9580c1c45f1c80f3d76ecd8b163c78e1d3b76bc37ba5cac56587b3a866bf6016723d8c624d40289cd2b1521828d549f2333b871337033bdc0bd833b892ab5a7ff855b04b54789ead3561ced2b8ebac0ad25073714bdc5076e2a2bebaf056156fb902b9cd4a861a103c388fa29574771a27ea6d01d33ca1b0d1a4c356cd8181acad9666d36ef6a7bb20405ca936fb2f417ca8f9e57de6cde83cd9c9fb6ad5e05b1f8fa466a6de7eb1fa9b38ef2356d5d4bc19f7653ae9d443f35ae919a026d01a61f174e706ad29aa52e4935f92b946323244667c5a32dbefe18d3f1638d1a356c9030cc661a2261982e7e7ecc24d38f36128689f3b6f256e324e6633d62d88bb5622c56ab936ec047549a89d28f637f356ad4a831921564b5fc7f5cc41011c5c4e0cfbb644c0c11d147c6101111bd37c2c010168b415b605bf57941068c83f3b0c14088d49e7e16b848ede9dfc146aacf11267d74e2666a291877d30dee2474566056fb908ed6f49328a91c9731d3391dfd8443542454de626758a386d2db286f34707ea884a1f30d8dcfe5cdfbace4e46de5ad9fbc2dca8fd705eb820bded585b015fb232a0de595bc8d8ad0a775aa52317d5ab934e9a56aa544e3e6d3c741531e27fd2405aa55aafea00621d7209baf6fabb59aafff429d35938fd1ccc07ac0603d7a9030ecb9071ec1c64e357e0c49180e738f1e3d7e64892c562be66fc047545a497f8333c670070112d2516433c6f3138346cb3c26a97563c81806f3079231ec85640cdf3c8a640cdb9c2858640c7b51d18f2319c361a6819d84bc37cad49194f1af19866bb6a9c1b6eaf382a332380ecd847d2c6120334a988c8279fa09be01bf95f56828b83ada4d6ae07682ab0b298ab164cc25633e320624631cf310e6d88f2019239231ac3ab25a4361ee249c6b4f7f0bdbf00b3cdc0706e2a8679556a96ca36a0c1eaa3dfd9f3efae3f5b8e15399984f59c8b506d55a33f9fa649d75d2d7e7a931aaacd662624fe3eb8fa363307ff9065c6da3bd79f46ec04972a2f86ec037fc088e20e922ab25c495633ecc8d452698958449fc56d6dfc23c3546457b3ca01b686059f5e98fe1fe2e63ceb0f6b48ead5fc32398eeefed9a9eaa404155796ab2388b64735667753667912c8eaacaeaeacaaa8aca84ddd60ee65f84a7a4a2764d4f55a0a0aa3c799367c2ae7fcc914cd71561d705acf7a8d48a986b733dc91822110000000400c314002030180c88c4a2d180385265c90714000d95be6064248fa320c721840c4184100018000000000000040620d0026dfc17e3ba7e998cfc5bb0d9206f2d1ba68892286bf7cc1e0f614896aa12fab3d175ec582dcc987aa0750e3f671defc7a92b7340428402c25885844c40c90597db4fa43e2030021bc5e7c63ab4556b81a001f222936bab07729ae185997b723d55614a1a76b84076e9c9b0aaf5672361ec58597606512e2dae8cf5c99bed5a730ae3613ce4b54adbf64382e158722d6dbdf01d9fdcc9fa5d580ab102ff839a04a55c87215d1ccf6a6582fc756b8cabdec363840e0d03d142ef6109d3f565f650b0b410226b9073d31379ae4ce4ee3ff148d6280d36d2555c57bb2e0589f469bcdae362818337058c5a38e942df8d071a0141ebf545e5ed3a94efa877418a952655b3c4cecba71a51c27850d0718d2f87b3ef6817175728a3c99065e00a77c02a10e6687c5ba66ba241bc9ddcf43930b1538a54b4622e7aa6c1141daf4bdc5005e21256b6fb3fba25dace6890b55b3ffb564e59ecb257d1d61327f5d7ac13635d6eda2cf476559b359f501f71d2c4fc7d34917d2eccfafd01adb67ebf6aa06d73c5c058c4d76759653eac00d5b2e75f47fa14e68a67693a4704bdf1491f238dbc0e8131368b1c9e46c737515c24919d5373ef04434373590b63f018e3f2d67fb042689ab0e20f89b7514ca97a6eca852c86001f677200c163a98c2ca6db272f7b354666d70760a1dde29da401496ee6f6dd9479c23e84083e2a31f7c833b3f108802b0350602ae7486ae8cb902b17e0ea0509de43c2504e33f2ab1dc923075ff83792dc4412df10ac557fec578517dacab7de705671303db21b000b2a391ca313f1b8aea0a97053e885d8229241a1a12df298114200a615f4834cd0d8b78e1b29dcc9e8787bfd52250efa6a387d1814ed1a68b64070531158ac484c1f89bc6d3f84b96cecf666c4878604147f8de23de33114dfc6c5247201a0df453f7771b3f25de8d18a17e9b1dd92668aeca6614199c029ad0373d48d5225f6eddf1fbd3e51ec4f5b4913815af1c5ca3eaca559a1184cbf79b4433cf7cce57ff7b570f434f94f7e3fe37fb59e44ec4715cfaed9ad925de2c500e137682fc06a4241588629a48f4aefb4e8660f67487a1d1e423737487be8e77a76230acb8ddc869556948e54a99326538981d0a7fa6add4b237c7fbd465244750b4b5c72ca8151eafa3b6cdd2fcf69c7330814e48b4834aa9ed4d2b978ea9299e1ca93bec0247d92fc123a84a12b78888f1779e8f1e1d08856879649874f0c952de8c5b7c8b4fa8d58455b89d9f733ca4dafd614ea87e95a59c2be22e1f5828c455818e606f0855a5d57e6a2af2e8e6182c3f959ce3725e698621d78375a38dfaa06f72c9b748acb4b27272619dc02d395463139f8b0f94e04293e3d4cee0533aaa78552cda212fc56db37dcd8034b58b969ec9f724e6346f7fa9dbef6fbdca34dbeb3aed38aa597295c04d88f5bb4b47be3b0812b9c511b61f76a9311770037f83e7bd36387386d9516c5eeb72899868575e52bccfe8d75715fe8ac726162d97c1d7f92ce70a7e1eb6558bdec8d1fae24540546e4c7f6e067d43085fe4b75855455757a117639c04bc88f4227bfa1e70db766d494af01226440a2abd6882cf69fdeba386d593be5236080168f957fe9033838577b413c2c47438e357714817d67da468b797e2b53060ea04c0df7ee1965fdbc8aedc458606f48f62085c963e4783e5f7c448079086891373e7e9ab1afa9ac9553bc3b98520596a02b81213b5a153810a7a6b214663afe24f093009c19bba67a87bba3756de98e5e560fc8365d9f153dfa3f47a162ea704874846e7492b814a6985dfefd20a668553d3f0e0ede4b1711987896d6196f1018535e7dab46d0f22709300724db564f8b764b4d4598d0d6f8bc9f588aaa0a36a68fb3a038c498a0408d475f50878467b8bfc34f0533a7eb82e00ba3d9d58987beae7f11a745d23dbc37258965dfa5e4a5e84ebaf088d36dc6e13c13d23d1f6ae24d3d95ac61635a706479db20ac927c9a5a8c839be7690faadf52764e8a49df9ec8cf063a6c1626a99401b329c8ce7c10ac35d01ba374097e62cd4e2931c58a9970b073e0cea728fe0c908595238850afcbca9761bb3b01354ea8065ebd35ded8aedbbe6a9cf14a7b5c0bc493b651874d36c437e046a07d040de109f9b58cfd6d2307ef651b02a3a766bf8a2a2f6c6b19c79a41fee1f7a8946fa85e1e51d95746818e3d8d6d4ead40cf6ceccf07ea0099f762f6183cc134d0b3fa939193aaf0c2926cce2efd67a09dbde147ca35e92b63d0dabca85654e3f96c641dc465decc2a1335a49006b5cf81113762371dd5d89f318bfc9f7d49d2043e7e28b4cba3e65cf9a1b9dc646fb4ed74168d7c07528311e3efa85fcc64de3058d0c4672e35deca185e0b9c5908c4219da675cafa2f6d00185649ec2c8f2fdb845d2bfcafd03e75100a654ea2ebb4a2b82e19faf1e16211e8b244ba749149a0f06114aaa4fc8d6240132c11c932f57d750400a84f3d53103232080ea8af68e42dad862bf2b8dad723e3100e81d905e4b3702da400276001795e1df198b8824b497bee5aa9ba6cc1766e311c83541a6c5ecb9ef9ded1e4d792ebf53d398d193388b0718cfe73acfa95c336cb562dafa478094b5768549dec00635fb727af479d4212a88bf9356ece548b5d829e2cb40ad643874f120abdf89f89b5dcec302d46a90f9c3a3d6510929e3a84e3fad1f9f342b818d546c8bcdaece0a6b1372f7604c3a0572d2f6cf3abf33f8c022afc9af3f41413f5b51eb08fb11d60beb995cb92ef47c954d4cdad2afcec74280ac2d9fd0aac5a2d5779e65d2f7b927e715537765f4382a89278a559c9f427b2e983435e988aeaa9940e6e97bfaabd54ec22cd91d74af633a3df3d30d50423a6ff99ab5a5d0e584ee1482dc9a15c86a972a70de09b78c162012cd78896e2d43d9369864db5bb0ce3784a1910d3702dd1ce34430dba709fe6519479564079383394a34c005c86ed4ef9a980fc9b85c789c29050b53bac24095ca8a65368e651359b6f2ce05ff406aace9391e59cc27c3b8cf99dcdf7038a85bc4a04f08e41d2e2a26c87190d8476eec16d7e4cfd1fb70b19329d1b1f616387ee3f2c0a74c252fcdd95c6a9aa10f7f7ca45db1754f3cfc9019f01dc96e644ffd4c70503e5cffb9a515c816b37aa4d0a90d8722c8aed08b024ee32f1dc0fe34bbae851f30b225e3ee24627ec7cd33640fa2c1936504f45eff8b9c5b9c6644072dd864c7957410e54930a6f8756aa5d255e0aa16323a7a102e519ca90880c0beef58336107f1b6bbfdd58311e742a161cf737e0e58bbd4155518039dd1d17d1d484d8d2275b031363c61e85e25a00507ae7c1606c022a77a9f3b9f46cf9310b7aded221092e79d7fcaae768b31ced8da35d385af86cb4ef564da42142ed18c0a60462f6dcea4e50985e06b182676eb3d9a8274b1b1f2a998ea9c178e6139cf1207630e08e82b5dca2988c4dc604513445b0442b58380d2b7563eb931d441508e2a157c75ac677d165141b5e7e84e89c0794ab557b2b9a46758a8243aae3fd8096b1198e5c72c0309884cd07b120593918de152e22f95e1c20e02fe8616f2842cd1ac532241a462be92b2c51157215efc731c5edaedf0efa9712ca20587af92e3c52bc31ddbdafe50b980a36594186c9af91619126d5e7e2c0d464341cbb68e3e0e8cebc1f870eeb5f00370e863a30b05f54b2480ad787e027488df40b73c72fe2582dc6fea7a02cc25860a5bfd574cb1de57dac7065137c048617c7810725e001007829c14fecfeb8008f2214c011b96289b2601f36dd0267ab9abfbc485b2084309e503daa724a60677cb638d04c3c18b8ea65f0a752b1d4cbc321080d93d94d0d8039ad0014d788ecc217a5c2ef6f864aebe438a06018c4ede89b266a492068fad6d1c9cd494169167f6d283cd8484f4c8a75b251f910deba48908640db65e321fe7cdcd8f1b42982501d92d0f8bbafc1d0d37f4c4c157be663eb98d931824022ee67e0020b144a8cafd19c074f07da47bddbca76d20d4d598561cddc08d5c2709a718631430713dbc36d336c4ed67bbbd91a335cc0e336d30c690882f1918c8c78c24e229661fea7f14ed624885b2b65af18868818b8ea452d69b3b0bdeaf5bec9b70f992cf62802b915c13c3d3082d9f08ee7f23ae3b6a03267e03927bed2d2677307d417dd12b58474d20df88c9035764394967b17b57447d5b3be302600a6f91f027557df1cc0909f19a60d5ff205cd62f0da572635f67fee960c7a8713f7ede103e5d6e2085c728b887cb731a105264be8b07d75c5234e3377c5fe6f2a5cdcc95ecafba411db611105b41aad951e93621f095a24520788e936326bd35d19fbdacf3b28317d4339c3d0410a2478771e10d099e99351baa2c6677e0338b3008b211df4e7ac9c24928334dec0ab353a9a3a3721ffbbc0e021b55b9cd0bbd81f7cf1d6471b1c22ca89d0c1de020b3b4f8161f77846e20753c3803a606258c2a43f0e9c1fc74ec474e3a40a17d1457b148b63661b7977bbc6578f1fafe848432429db922653930af8a0c4981a2acdc28c7f5b40cd25a4ddc582ed3168d20dd134df25ce3b9ef33b85158beb3ee7beb31fb9637084a875846b68340d2dcb876ca24a810563c7dc236457301e5bb89fbf296c17fd9c034b3113c71309f41db0c74f4150781732a078ccd11b041b1b0fcf8f6aebfcc426e1e43a3e7117a318e12909079d30bfe99d6a1a424274159e873867d2de3f393958bbce1e7ba598df1bbf67403465ba499ac02e20e73d7bb9e3d8802b6096efc8dc9550b9960769c0109bc9dd9140d256ae18a8a79e0dc931e0926eb1ca50a093185a5fa9adea00ca22748b95f9d28a10f8cfc8f604c1a6895969085195aa35e62683f173876374955635aa5b8b298b93945f824a053eb8f92d7b12c6a4736758a0f3cbd60d160930298a00c37b135d825105f884938bef1449fd2a0a6b238422324a19f0f49f4cbe2b7a844e32d53c48b4eddc2465a7ca8c24d6b7b4178317701c814bcade2d73c4d4877e9958801ec59721b1aba03e08e53dd652a717af65769efb722a0e3ca2d7b6b7ac2d9132942169a109a35995556f9b930b4a817cab4c2b006e43eb0abbbbab9874596cb78c104ddf9600d1e6b14fb27015199ed452d05419cc91529fbb48f0f719c76c5574f952c5ed7b319112a97d56d24c2db1e02c4abba7d4015a8593d9bfc1f860e431f8f914b33cc600fc8295e3a543bcce9b12adaa4e1e3791b7401e7986c6a60cec89ea4247d96c8ea604b50f2939ea2c4590379cce4ffda28fa87c9c82f12e513d49c6573f7452978c1ebf148d18c300f983708783bcb4c54657eb205651c9a5189190c2096c66a57928f533bca7efc92794d6ba875460eee3eb4a9cf785d3772aec60c1467ae601b7a439e62aa5ec9e15bc6b16a3317d8568d48072c7ed2a868a23c7234fa82769b1a9608516c56879dd1b2bc771fd74ff2d25a2eab9fe092eae6d1066b4340c3c522a764202707052e8467d426a4c3269f346aa41b64d62a939f414f0771ced54601db5ff4c0c89954463913f6a831834baef0ef84861fc27a08d11d85f69ee0d95a01999516975be59c9384ee20f66d2cf5ccde270001f3962c4bc775582306b8ab42b8dc636928f2f56f80da34d7809cf10a34815ebdf3950b61790d3c63cd880ec1215e07d5c07f5149a2a87841ef795dce5aa61dac947607b108e976cb15281c79a414e4e090102cee0f47e8e9f569149cfadbe7a5f7588232534e0c97f275c4cd2656cc1a99ad855a72f65f3ecbb64c6ccf4e15539c3af583281025326442acc99f9b29d9189bc7989fdcd26f65f24f8d515b6ac934d9eb11e84d9ba8df033cca89cd02866d3284b2910466b732d9c7e1c80467fd53295c9301ba611f819bc65fcc7668a874f4e0b80c27ab8e1db5abc2de03e564e7318bf272cbc9a65b33581428183044846ef5273d92af7666852c63e94535b305f4ab8901ebafa41507aa83144e1c05b89d97a0bbb8fcc27e5df43f355a865d30e46bc8bb088fe32cfe3e035bd4e82598c63b33eee5d60c9ded42774c0a2d6b67624b67d6fb2ffed653e637c297c78b3f2c295d2102e686b2c1347e587f6cc6c88d4590f0bdc58228448de9560d2297168c11bafed83727ed328f2ea481d234f83515e8f3cbcd035517441fbc276256a60e3e884390ad67d142092b17eac448f2e3d1dc51939b3401b3b94ca8f1df362986ab15466c152c24bb89b6eb25342ce955fd401a19c8bd379b5ad75c90bbb5c8bbec7fbbafa156b64a04be251f5f94e97e4c2d001ea06f9d4d296069621afbcf7d9b6f6aff8f6cbf7b971e1f64d58a9883022955126bd2a0dee5b98691bd82565af9a59b4afdca8351aabf45d225af64a8503a9293ea10303eab2b5ecb86471953d1b6d8729924b48354bafb767db8c65566536e5bfb34f9b119d046781d03d72ac8fca6b32ee3821a0d96f54e4aefbe860380fd8b6f0a1d8927b2399c4b8126012e79622304f82c283d5d703fb547b9f5bae49507c2a65b96bc51aecb87c6ab18b96aa9486fd352cca9dc5cbc3ede9770bb219326ad72fd9aeb79773051f658d275b54f3e7df703df9926de50675662a4496ab3aae0047a5cb99a3f924078f0ace49ef5dfc4ca555c637c72edaabd7f4f33442716524e19533bfc764393fa53218ae9f8b1b56c29f8bd419abef825984a61f545ae980e5ecdeea2ddc35f85a88b02bf2fb6d7e4728a49a7bba0157e8ff7e74ccb9eaba07a51be3052b6972b7d9b5df42ec3b0cec4a6109f84d1c4dd30dad16c00882ef575051f69e488b19e67f281472961d79b22e0dd0021a0b91c5b414d422f64fe04ae5c64fc1a75aea31012d7845ae7cce577cc31738029327df28c13e61790719e24c00ebe26cf650e385a2b04c555503e1366d5ea9f89a639d727866e1ca55872c05f83737700b86c7870f01d094692e4d6dd1355d59f155f2ea0e08cfcde61f015b0bcefb02ece6340a53a4cf2897797d71a048f6c128e53248c06234c39db8e8e749fc431299b12b8da4fd1364f86c42471f640516d3aab634fa0e0636c5a3762a92967f4dd1adc39cf708e747cfb25f7db894d2b12435090a26299dcbd33ae984835095e9a56e0d5b94c88f93c498d3f5c0e9100eed93b04d2a4f5a15cd5002a509791ae98bbb46a6b143a68eb9291ae209cd61e34e28de5d10f440a870fb48df98583bf221bd209cb8b0a8cb382591835570838646b4a39d0116132a85d6d5d598d24d718ab9f141cefeef0d2c27bf34f7afab550926fb53e89be3412b1fd8a8cfe50427ab9b04a829d98a661adcd8a18b27f84284cee32af1d852f197f41d349295b15ccfff43c64fb6c74c35c78cfe19d5b041b0f33d2d5fa2402babc10a114f21a9b1b7c80b1196b3a48f62a6e18198ca3cf90006ee701e1fb90a91951beb6dedb7d3f48f77720d48db95c543a0b2b0deee906f58d29b9ce80a447950ef9584e6b71f606a1a6176f70d2abab0f7e419f1ecaddfdf6783351449f2cb9e7d07cb195c836f79c11f1e40d6bffb5276abe9123d329800e19f7570ede026477e2d8b740a3fcc99c37615b3d37c345f47b3c6a875ed78dea90237f3988495f90b38e97cfbf66d4f7eae6b92f6baa2390299af4659cd8de5d5e874a39b1402751488d640a3038a79d693c9c4487e6b4ebc7a8539b2d01f67b89fcce82af1d9560dfd73a17b8040812e8085ff8d16c0610c0bce9ceac9326f24f913db2a6db13fedf9dcd4389c9e12ba9432befea82cdde810a49acee269456ba9002865d3a0db76cf04490abfeaecc1871803ffdd6c1a089e57af4ce646f06c749ae6d5289b59633c1b9dd6e88d8aa08e4aa219717430504b27e40249f3916e4d3477116e42723882bc638349f706c7e166b149aa04be6e8942528f8399d46f85b7ec615442c6eef9a6fa603a77fc3f92d758adc306352270927fe80217de19b012aabd9e0b9265d4d6e23648dcde23444a5db364530599386c1891ca3708e073150ef868db984203495c83b8bbbccb0d25cffa745a946086ed9e9424312daebfab6b4b36a1b4051cc850d70df0431d00cf2804293a887b0dfe320634642042094bc17b33bc457059d7436436e496425652b1d8800404d3a6610728c8ce4658863af90216776e05e2a22f485c75903582201d486f00310dc11f8894531d015807007bc9ff282968f610713dee7de751707828ef0e276287a233749fe8d019625db01c0288e3be5c70540854861871c3716d48181bb75a63e5d4c0461a9d647c3be71973d599e10503307e320a660c6d89e1046188198cabf862cf5ee0d04547e6420b5bb8d68121240b162e5ba69c9e36b2bd79450d26e652514535223c1576b97fa778e96e2144b1a8dc163402a84b7d242465d5501921d65d1694623099b50754a0a8ef32453647eacdb33a211849bd9586f1079774848ea4128b5ddea559ef07814dd7a333d285b555542e6f14ed91a0b102ca9e356b8c9681cd74c7fb9fdfb8a0c9667183595914ea1e1d2c91b5e6c53d5dc14e19fbc8e0cb422fca617c032c82cc52e43590753300149bc9bf6744ce4c9e920ee92478296d3c87a575af49d1e6209352688d0f4cd43243f19e786a5ff4ea0edb3c3a6365f9b51fd592c2525471caef80607dfe1c06c2614c45a2c398c04eed7ce82aa162e8d3f7739eceb379ea1e749eeb6d9ed0b35cc69a0d098a68dcf9cd8707ff6b8a3a33a3344f19cd939bbc6c6b6eab68bf5938d2dd34e5eb12bae685dcc06b6e802d93b46316ebcb22ae6565b96c5b0a59b590c518b24e43163964850f590591a522b22a91f5f4843faf3f801ae480cdc57735823d7430438364090e18180df6959e153adefa5dadfe6414424565a9bfe757dee29156e3072494d7303a5d60250cc415545b2cc45fc263432a6b0a58b2027a0ec0421b2063222d49ba7156b7ecd8cdf315f01878d562d47bf6da7656cda752fa487ca98fd559b5e960ecd22e6bcc7eb6c92df0272b8d20185be5631781dc086c0632238657cd5f4b7133caafc931f4037743c02b823cb4ebbbed94cf8c22e98ebede457fc703784ac373e2e249f89168ac023f7771dd318fbd626acfb2eca5d6127eb8a4ead35ad29c8face77939e8923c2361ec570c575095490c8efb6a4756b3fa7abb446daf73b4fd07d0fa06d41d0fa17737a7b85011d2c8cf6b41454d0fe90595642fbbe5b0976f34190894f335ba9fbe0781aea2bc8b4df7f8d31e9330b2f8b1fab2fcb64ddf772dd2fcdbfcddba414b0eaf42ad486ae7da3131c0e327a12c996e2c3919970de3cacb97832ef75d1f7780f5a4148947660db6758d98eb8273b97258cc402e321b0772582c59a299176961dd0b12be47b69322456c7f8c64828a56171c1371a69c71ecaa6706b01f337b73c62bcf0abebb441e12d99c92c75209caae92f75b0ab2fd13ce4ef6df131cd6a9710d0756abc58147ed0b345cd4bafeb1e97d869bdcd2fc8711ad09384a0d187889ec96d4e84a3e37625bc0fd7297d50a0c65d2e59ec5cb115b9fbcdf3bd7d6946a60fa8b14b9d4141a4ad8adc23e433f9a2abe75766d377b17a13f396045d0ab0ac63fa5f602e3c7e0f5f2208faba7f0ab2b34c00a327e259df8a38ab945332e19768c9592c3b784fb7bc6721a2192eb794d55741a9659ad20810b3b633a1d210939b9edd3e0548af85f68269584864e175dd65a072bea88700ae4a8a03e847d43331301a03184b46b83c00f2fcf77b1fb3efdf05128a6e291a24f4e7ba0300fce61387399e69af1bea3819d45d1d9e8983d6ab9466253f666f0c64da09f726381ae1347dab8b635cec5343e4a987d4fd3430e937a987c405fe6380ea1c91ec574c91dfdf59b0ea82bf73f55a0386e62013b9a93411ca5552048bae857951f51f513344a4539ac725a51a3716e4c44c3f98f65fdbc8041eee22ebae1358b2e5e9a9adfb51f1e9b2e997a3f34eade35c9ae01ceb59ab79f39ec33d84f1a76f0684af020d7bb4ecc0256501ff5cc59989a7ef0bc313210f494e0f3a4d2193cebe7af7bcbdbb072cbd0ef91b8b2af4aa915d2c0335d904e4515d3aa9105ceb4e3dfcde4784935dcaa2ea30fe69831d96182d3b1dc93f6c9a0a22ce513d13380e403156427803de79cacd53ad1d305d829e42c0fca1149468a12604ca9bdfd4ae8649ff29e78e6676dfc213d2403c24b559fbb0e22db7e0b1a03c1f32e90b385cb5ae19e5feb0bfe9ac855ca5eaa210210945af7ed370828d9617e5041babaa520576af81c18b5fe4cd3e6ecc985ca82bf4944744a0d0efd693be24fe3ea8cf164af7ad0e419427c9e1b8a4ded9082c90c2fda8923578d099edc94c2452f973828746b1ee15ea63a2b379ae5fba134fb8063f1f55486c854ff21de7b2b4ad3ab48e6b2a07434d61fc1db16e4b64ab99518e8030b52637a21757b07c57daf93b4e2371cced9870c57aeda7abe2bc91d2e8f560dddc51e51f9de2d09dd76b22a042a5d66c0e48cc78414e9c9a28c5cef920a6050696de90a1c4b4f5009114be764797e3b27d3c179494d68f3564fb24cbc1d5ff2e2e1238698126810ec55a7e84418108999124fd5a6f81986327dda0d576219d4a92da5641446ab90b8d06aee5d780d8d274a273c76bf1b9cadabd82312903e1f5f9ee37a07ce4b10ba758bb1defb71d3e6b5c054fc6f20b2302d71785178031c175c3c632bd259d2d771c14cb02de9fa2ec829c9c42d280e1600256a3e7c663b7b9162cff7ae98e71f1fe0499b4abb998079d7668e3974b23e063503f68d7c7f3e924dbe7404a9866988564d572e03d3c27a5904d8b27831b04479828479d7190b6f4dfe9365812c5ffcfd83d0a261bd6ead1d9127e871d8442fbcea1087ebbf5e35d53e9735465b4ca72b8ac0aef6816fe4c061be96b68639f8306585e96d16534b03356c6137cbe914c270b5b6fffc8b5416e416903739e71c2c50af2f26e991807c3e9add68f3de7daa21698bca21001f39485f5de76a2fe52ed31490276945bad451e6cf252868e777f8942eb1002977ef3e0fe13fe01f873e0ed060ab7ede5414be1855e146d425decb059c988a2cb326f03edbe9cb8225d0bb4dfbd341e80bed0bd4408c4f41151255278b2d0bd50ba42c192a7b1835e9b5f26c1b88459d092c92293e705d1d12be17783111f40964801ee8f876d4af1ec8cc6b0c607b1719df130334f4eb63e2e7133106e81946ff89a5f6559c838455a310c13a8642a78a991544e43733006b58fa078648766c63078c698c891e319600b6905ac92135c39e8c1e2e264827aa55cb27c861a4ba111f9a79fd1f477c5cd225e0c08b79dc187d6ef89149ad7f583f0ba97bbadb03d4c486566d2128b63296c7aa4ebb8877b4bab41b33d104995a20f2c437123edfc838a4cba5fc820ef2525b97ae277c689b39042f168ef18de4230611431434bdc9376273b5bf88d81b719a97578d525b13ee40592827c2a76e329ffa5c4f59042cd496e7562fbc4c3d29cd2f303d98dc5c9bdf4e1a71a71122bfe338a71b7e22046bce2ff3172fc6897fb7d91cd1cc3514b7519dddd03d72983b309615df4ad0e409b9e067bf13c6996253607cf8c7e925424842256ce26dce9a44ffbde997578db380a6354d5f04403d3571a24c824af958897acf269e79004e1fbccf528228b5e6e1007c7aa76183af237fbad06e9f09fd81575ea055ec7a7344846c536dd69a50c9f5622409fcf59bd22e79fb0f1ca1c73ccd20eda55a985f0c220894d045659711196af4fbdd8644c00692c529f885030ab654a7daf29a4c3d3bdc53de31e9d2be29a43f829e86c98b505aa701d178adc073ec6e73fbc31acc88004888f31ebbbbf1aa61dfd24d9a4ba75ff44c72a4245f4b2220ba75a4fb8a670d54914e65383d8c4aca7167d23d411e106b808ea4f9bbddfa1b4bb661b3c806226fb4a461ff147a86897e2e6b9883cdf1319947c52f7eb8fbb8d0b78c987a0a1fd32d2c36cc4f9ad7361c848c225c490abab15568d5dc0a2186b13ff0d2c22017cf37c08480d976078f4bc478162ccb168150a312f99c5e2952aff99d5c38dcc2cbbaca2fff79ba73955bfe45c25fb494cee4dd00dc110e6cb9cee9ed47115ded5074f34a26fd6c4408be714ab2e7368882eaf8924551a4d17fa50c34847b32419842fea9a16dd31b42efebe57c9d762b6058a56a5381e4c9884c07b146574d12cb6e68783aa27cf755b1b2d503625a692feebc4039304d5e376ed3e3f1440d42e126c25257c5ca38d7342fa65751c48468d8fba9dbe53e262cddc9e4ea24a31ebf7f70535365325bfcf66d3447a32b60236c35e644feef3c110a36612f0d257d89a1c16b02ca3b4c8bcb1c84a6a21c00b7b1db214d892e96f077d5f8149653bee3a2ba0cfc93a0c75a8c9f27335ee3ed4438231d4ff439305a853d1428037087834aa6a3f1a6daf6a4bd6ac6229adfa9b85019c03e29149dd97135ace7aa23e0725b6271c30c61d5a5f56116baa0d54b6140915d851e54a1815f43933bcc6e94df2a44ed0f8b188dc0d7bf319588adc68a13200410f4796dbf2f38fb38250d92046d35d3b3d5bd6818f345f07fa983d6140aadfad08b9f0966aa2ffdff094749651fd87215e2017b2fc57a14d9d30d73602f5806e46e6c00d578ace76579295e38cb6862f86ddf96fb45af93a173ccebde8af3c1a57f4262870fc4dd84000db5e2838a9ccda8f172a164dae66ff709a308c4ef57c758434ac39639a09610acbf55c8187dde7c13cf7a075b6709205d414e6275e95109652a994ac28966349385aa67b28cee6844f50f59cd299cd47668fa9059921b360f0682264eab1918078dbc2bda64dfac285762ab2f73e458e332f54eb36c64be1ade53f6e01958a962aee7410f40e6061a467033dce577dc1d403f1dbf4c3e6aeb3808f71322b7f470e8d9e45f7ae6309317107006e6c9303c879679006243cfbd82b8a6b7a5c1a92ea7baa2f4a72962520daab48bb0e13c52962c64c4c57469d55881eecd340a89162a8d59675a0e7b8d2fb9231fae5abb76488df937824e444d384f085963254b9ab82075e29d371ce05b3cd2241ad91045a9f8ce869b0c2231dcee45b9ad765166d137472f6aa9468fd9257693bf053acee07d7a42fb5b8be2f7a1474b2e210c5422572c8b08d6e14b8554173ed1d398490826c75aa1af58819b71794f2d21d4696dc04a7c80e4b8ea5668a5f72ae0abe65febb08d16c496ae652d41a0b8f9562101873b7a13fabdd5162d1f329b773d92f7b6a05555e5573ee7b85310a61c49fb43ee86d5a8e5ff39e07cd734e91b48d463c6f4a3c0dc8e62b325baeb6ca6fb60749a046ab48ec7f8c0759e57abc27e5f8a96bd86443e0529808a5edb5e2cef6014276428647a9550d3f8fc735bb985a52a6a53ade1b178dc4220126981660a129f620dbe1061945e63a73c79162525c0527dd45bb14950059ded2a8412e832ccf8ae68cee58b94222ce387e2cef112fe3e59a3128e4847cfdb114aa7e6bfec6080a911a95358f654f3269ea5da080ed13a459239270f2332461e0fb007883da1cf44f3a9c09c3302f304db8fb62d75540ce64608faada2a899ce690a3728397952d6271c5ba46662f2cb7ea028a486e2d4c2f71d17205fa75163b84837b2061fdc2f2608b861ec8cdd022d6129d91a570e78a0c7f86eaf199d738fe9bbad54bf7a2764a5e75f047a5baf6223ce03648b283ae55150b5230ab3af3698cc7bbed1c039aa87874f867516d06614ae36c72fb599f7bcde502b49989e4d62d208cdbec1c5c8946c6fe43d05246adebf8aace1ddfdfa8d58b379470b55d95a4c1b49b53a4fbfbd4c47cd8fc8a3c0ffb1ed2e5aacaf29ebcf3645278a42dfa568eec58e32c4c1f49b9ada464cab89988d3332842f736ead60074cd962f939c68d31c07c02bd7ba405a0fccd5b780cafad880efb1239654c8ad70a6788726814d5c713b7712e2a532008153e287c12211fe42da9a592030c15643241e62314b0acbade5b5e25afa119461b7dab121f8061f4d12c6fbc0565cb4dbaf55d75f15104414a5cad9b4f7ce8f81877c720075a966d252cf29c66e263500c20484ac826a80fab96badd5d8a6151815c704165d80411a9b4ae2448dcea7207a913b2f57494ce1c335390ac71d5e569093e72f27724fbe6062d395ecca1edb833ab36bb3ff5820f603e46c8709b696a38ad40a998dda145ab4700538c00ef0024d414ea7a6abe9c3dd30af0a01e8c8eae19d0694617acb5b122ff8e750c79ac2ac9a25da8a1766ab2c32a94989203e42b4830cda11126790e3323dfcc67ce0245344b27e31c20ccb35f7d35cf3b076c4b476efd44ee5f15df58eb5ea5c8c4777e94e23990506e567444de878576b72c9936b9313012f7942acfdd49a803fb8946ec4967420aa207c3e83317eb701b08e15dae713404f031d2c4dc076dd067bb0f23c15225a63ab7eef18137072d6a0023fa3061cea2355d29436c413cde6c22945aefb34ba8dbac456b7ce53143a629a8508c28a4429dbc45cd5e6d05916876367e553dafadcf1885367e01f7291f12cdfc3968e7d6b58c140ba03ce1b6dccc432698707d6182345aef5c5adac45f0d7ea3a9aa3f506d6a024e00e718c530b86da62e9434ef35f5bf9f8e83cc86e5e0329f506b81661196478e22f1df765666edb9200edd4fd2acd6033c5fab8769361e6e1a7904c1569cf14cdc629e1831278e50b76a3308b7f7b0688563124bc82cc9d36832aee202a4797c7d3526810de0da63617df35f4b57d33375ed21f988e8f7252621e3e8e6a3e852e41734f27eefd8c6c02f5765748655d3e5f23228057835c8c406450651fcd92afb425bba61fe04209a554206567f9546ff6b4b3ecb14cf2360a4480f3b0401914fb11300b90e0b58f6ff177f07da18b5c16394447a30e800a60e0ba156384dd97b7c66b5b44e72ef63528d9f65fcb76ca07444067084868aad3394c14e4345940ba8319e89878c18e02b5390bc6aa81687a0c45e039700d7243bc25343ab52ef7827535ded4d8276c03cf39d5a8605d16c30f844e30001f24f2126d21fc907e844d251d3b3a3986c3049419f1baa35975a42e3f810bd48ba14fc52f419ef571104bfa182b7d6f11622a4fe463397295cc574a77d12aa773dbb4f8329a6df13bfc36692a6b7fab7e7365fafbf79f4b5fc8b47eba5295f112b99809ee3c7b64feaddb86c3e8b35ac3f56668833467629d54d037dcb268696544b68d293e7709a9b067618bb220a3ee6de4a3e4028d131aa3e66693c8d04317e92a884b4c70bde512248aa87ac631c3c0988596c720528e4074d0f2b0f64470a3779c99f4f403709f739b15dc25ef2d7bcef74d98e024f3b3256875b4892644f08748889a714e8939cec067801a8e070132f046d4f046536b68953cd4819c2edc476e697b452b77577a17aea43206fd69067f516abf690416c9e75d1324778df8f2c75a0251fa008ab6fd8affe9d9d3dbd03890cef33dd43489e42b672b34a152a2a568ab6883b276e09bdbd05cb303af17cdbde2a6366647fd492f17850ad3d80c27afcd3c7f5a834ec83e0318d6fa3fc978962ca4955fefa1ffe7f1144e42276a77e5bf88e1026ed590ff37a686cf1b86e77275bbe64dfcf79a40fe383d623054b2c7fa248c235028292b619f8b28828a6f207da75faf950375853f9b32d3a3808c728fe4bb33b81c36c5391cebd16e560903ff10696339b5efd0450bfad90e3345c192046f120f356495c291fe267c74d7f7d52b33872e3ec3b7696f2a5287fa64872e21f45ccce23836efcc9ff031ae6732153499096dbaf975710e6061c77897345c5cb2620ea0398750d2130860f5c60819d52a09b1f78be8b7630c868b7367121bc52bd2686bc0ca49f03e0344d9da361aada36caccca43bca38e1db8488e5846728ccbc4f9c415fcfe6374f01b596fcd403f64466a54e8a5a52a765b819f87c2b55b3e86dd80097d49ff93ffe0fab1ee2fc7bd4b50328c26814780fb992b78ea4d6ae8b2c864100058c584c37fc2cd049afd85b28a0e64a9ad26e08167880194785c7289292888b6edad055ce91b4b2eda59eb858f7152345fcfbeb84e34ce0dc173ab75b9548718e1a1a0dddbe95592ca74247da243d0f933c30f90f0878dc21be3114ed50d302f625a9af2bb6e14d62212f124f67b5e891256b011d287b50d84a153695cec013c6b7554f30737b63a807d4923ae71c4c4090094d854a34ef6a1ec35e3eff1448406a4c5d28ec2205e53b0107384caf82ba396d8e852aa828a4c4afe2b0336d6adf5a4d1dcc2a28c88b198482c8ceabad8fe89260c64926faa33bc87c9020e900369590e374ba5bce58494673e9a5a2c32953eb2d4e58d705d5095bea59f539c4b75ea99f757c53da259a1a8a9d0411f83ce0020b517ab7b61c34e74d56aaabfbf754d29e1e1f201144ac2b5b345c3e4ed4f39d2a47b125d492fd6d0573c6e42e50d0500c0bb00a0c7533972a6a43e5011598ec0fb3120f155f4efd82388018325ed6ee5f450a5dd9cfb414b4e9a8104c6ec4e81c3f9e111eb6a6f9830cf94aad7a846cfe895d450627aa921860d342e35bc7f1fbefa2f40ff3387666b40f35cdc4cb3c16cd381bc75c12a3ef34ca3680b37fae4a869d07a6d5339fcb39ac1dc0d17e2b03ff383216700c2ff38f5483556f179ef9bdbe6fb610189406aff8a6ad4c880a3b13269822386313c23e08e55491c2f3aece16f82252ef52ddb5b35e148466d2b8ba78389024796d88170ed5f3328680a4cf6f99436ce626ce194fbeba12032c3e5c884c2db2358198cb12247a4dd7fb67d7a6b53fcc26f082510f1cb7bb9fcc7138e9c1df465eb7be388d29b50aea3f0891e6f99bae38a563e9312b551700289df6258bd538046c264c38e17697721607ee72032ee8e54c1a9ceaa2fadfce35407d4702d620ad7037041658c1992ebd86fe0d2443940a205f701cfc44b7ffafd1e22e7fad99e7b4e741632c663b083febd26d76c72ff757fc58e1b5e063e5763b8de034c233e6ddd353b720babeb1f16132e6ca02c81e21cd87785f1a68622bf67e75e3c1eb0cb6f1280c8332315c4189871ac43b00186acabf51ce912829384aca0c822b6104d7b7f566e1ccc19d1380ce1656fd11828695910191a04a85495d87591638b66047e987db4c7c217a1aff97ab17bc06d6ad08992e9b426e2a08df1f82089380e6ecf76c307c9ccdcaea8c7f2565a783b97ef3500962b877de0eb054d3f40b84934f9c6d7ccc1e2ac0fc4295b36386eb1273e6c5f543b170ec4894ee2f887c2359c0bfbfb8df68284693ec0a712ccca09178b13129eb024d9190d0cf47ed66867744345da20331f8746668b3d6df4be1b09f95e02516b1915cc1a7921d91bdc47969eec49100bfcc36aacd4e3f6d42e5b39a7f10e6816aaa82842bdbd85cc2e5d0c20764443910d3560f529b9b0871099377ef10754979b93c97041a1d6066a178a4d69e6add81f6e8e915d7d0c3a19bcbd5672945b1a0366304862732c0262db59d51038365cb1fd086542888c4972ecc8759472000428470b16ea3508b20f27921a855437a2d2f44461944186202bdeda8de39b948c6a808989ba43d3b15a04c9ab4926f13e95443d45614c51d5e7e3b024bf332c7c875ec3490067c171a3784ede565a2fdf46269a0b3c3ed2ac130afe0d825fa6ca0e6708b6edaf4c2fdedc3d5376e28f82a8a877ccd5e309aaab4379d73541f08f2030a4da0ca5698f64d814e0f1dca502c605f49c28722a579f15565026cb408d7b46612bf5399c65425a4da80be4f7a63bfe62a45a4b0c3031fc2cc419a8889db5f24fe85ea816ff87113621098003253e00444679b1db8579cc9240c89c5cd461a0e2bb9ff1c77a9f20345c06de8c0fdb4baa86fda894231dc9f12fb8e102394125ca99ff233c51b76d202ca99885be0496581f289ff0c255e3e8526f47abf6c7a87d2fab06f09008a31cb0a27411ee16d221a6ddf12ce1543fc81193770bcc0ac0411ed0f89331901eeee63da64532328b412f580b30f848ece912a65365a4ff4aa7ca0595b749084bc952da547f806350817b5026eeae0006e6a9e903ca1bcb1e2f6d91c6f905ad03b80d922e2413d067a7bb900c2be2f0d440ec6d5b53eb0cf49e3cc0eaa3ec23922e500c30e976e30e05c0fffb32fb734704e5a6b8090a9528f5ef9b0e2d0800ff1b55899cd82fa8a84091ec81384329148696cc99bb6cf5575af993d0e59270fbc10661d9de54ab96bbd559bfef1bbd1f63390fc8d29891893346278bc4d74acdca88469fb975670282cc53ae972bba622eee5bdcdd2f423b26970f02cbcc7e6d61507cbae14d3c1aaee71e6321014037c4a41349d72384d0ccc8ab846d44b5a3eeddaedd02dbe81462a24d936205d86789fd4c561c897f55ec45c6948cb9c7a5e0f540ad2d46136f53497912b2e0a626693c527a9b15ff6bf496c8f1001835c3e273ce94d0dc4710f9213714d1fd23c6f39ce042355557d0af770468a1e7e31c6df820980811560ebb100e37e5abf27cf7520d81b2b433b2860f2923238b38397c19663baf539ebaaf5b2df1cb95e4418d7a53a3bd17a926fc31b39d244794fc0d449d0956ab96950bbfcb7a7c5a5ddf80cbdee1f0f71841e8677c92df0ce03cd8cc05c46e216326d397edcdc21bef998ce5f19893e883a08851dbd95aa6d87dffaef7da4056fbf1115a39aad913ed44ea77c42b1e903e11424b4f9b93bafa8c059d379c68e907e775a44ecfa7060aed8ed3733462ba9498c9b079be7e9b0178a4447f70185547a4f9e93861a883cb1c263314899e4b61848c86e078a0d2bc06a29d832db1ec3c9d1426a9cbcba29d6ab04df23e161584d39817e792a0f4205f066e60910b18eb8c29ee3d4e9b0af1d95c218bb792813a478622705f4abcf0c49e189e7b8704ab3c120c7b8034c495d4ab1bf5eca07fb5c70866008d80c63b6bbdba1343f6f4fd2d811c927637180796456c80247c25b982b085b094ca8caa4ad62b0fce47e50349305765ebc2d682ef718b205553fbd3c34293423678114ac0b9b0a60cab22f51d5746aedace914c33be85ebce46a5fac4825885f3880b3b2af683539bff2c4b37ebc9368558fd099c59e09d1954ddb7f5dc44751e2e5c3c8f736d138eaf88549c414dbe4e626ec6d2487cda72409bb264067414d97b3ad71228b2ea84a5860ea595f66fbf13ab28d8e40156b16afb8b3dc1dfe877f16818ad1f8a18895537503aa8eb3848ddb33e35c807db4c10b6cc4927e1f0ea140b0c52a6412f8c146a5a7850ae6e0076f98fa8aa5031beca975f92a08bfdf799a4cd4bf922d0c026523c83b33659ea6475425f21ca5ddd3278633e057e64810b71e1cbad074484ef89554b0e5e556c39da21fa9eb561a24a42c76192cbde08a5bd5ebd02eab89e18fcfcbf45e90eb379af373f772610f7b49c6dc200715ffd5b23eef607aadb0fc0a60cdfc31bfcee251ea7ec904190c7f8492644d4e3806593eb8e20ae43f657dc381f41ee002a2f2572a5aca99d58d3c57896ff1e82a581a4ec5951ccdbd35439f9c19796824be0ac0c91bee12ed96c16f15b7c5bd6197570ee62963e3bcdcc69a978067236f5f8205f6ef73cb8e489b01f000e9c8b42eff11680de68ceeb83dc3b84e931e55cd221056f3c3a160ab456ab01eb9e7198c2c157d18f07e00b88dc8e425b2697ea45e3746c78dfe02e181664e48ae460297e87a26d17f3fb5ec1a47b8c184f519ee6da3fa34319bdeb9972dd3f4243d6b61ce0eed72d1394c422dce64bc299df90662e3c24d4df135b52c34aa41dffb17c43502f4e1fac803dbc3d8a1984631a06f6a274cb3814b98d0c8a7ff377401733592e86048b8a869e6a5c914d3f716c40d0d2721e8b892ced8d422d202162e6081421634a014214b6b758443054ac029b489b61a911acd2e84f6ef41dd88253a33d3c1b3f781589db0cc431d7ec37760d35261f07df1d4393be05e0ac3d53fc11e25ae2d9c08c3d292204052925172201563533fcfa215f604f80418f63da92b7951614d201d3ff3b04b7b6a0150eb13d76419478aa002013a83f1101c7cd2c839900744a5532e85cac6be3265174eaf4121f3a2710ce52d12ee48be1f62903a3f7fbce3ff92709ef5bfced4f915c56fc9d41a72d81233e977751a8f45ca03d7a91df28b82527e2cea5bbf682daf78e27698aaea1da710a1e3bd7148a151a50b81ef0d2ee3c39623650d291e6ce14ea64f49c8442e197174df9a70c34e92c02b5f15008aa4d22a2126349050368edb65206bbf15b3ac711bcf0455df0362e92750a1a4d5355156267e025804ba4f10c6d3a5d87a213a4befb169b4e610c8016ca9c912a8aa803c16b6a43678cf4367d4728775edb6efc91daf240911f93c6a0da6dc8f292551f181431048828dc4eb86c6c456ee1779593224caa4e7ed9d700a396673d55502857dee06027704acee6e32a8a7951d58d042003fc86504899f2c31d0542731995ee9a09f1920484acc0b312d000a8188d601d37e1e43785964616107d43200f57fc68f0ee82c8d31f8ef28f39791ff8362d09626923e036e1a74eac10bad62ed2f53abca6d32f54e45b86da4fe58d54b21d84c9826df5b5357b02e8c752af25d29c9ae7441e495d6290cd6c684a53aab28961728712f66b308e85a14101553483d4b2a8511d7271896905e7318c5298b1c20296bc761e14eecc76e8021d511c4d36043fd5bc373027ab8e8126d823cd47395d4a8060cb51fcc15bff717574691b4378cb219029a37e628625ecb1ff5be7644dfa192204343ccf7ceda091040d87bc232418a9c3809a8538bba9d5f6c5fef3fa5a0fc631841b15d6055cb804e5a9ed93925f74b680479a1cea6ae58da1d95f93ca14dd7af161afb9f986bdc04c6ab67d1472fa238e4b470b84598b93af5aaa2c7125e17f6a472c654f1ae1815854e28da98bafa9b8914de4e80c1fe821ffb83011ae3230941f421dfb05f8d851e6aad667bb06feb45cc0c47d5e4a838f27e5868368c7f3708a8b9d57b25a372539f3da43d5b11f8e71ed3920583cb84cc99a605c21d24831f62740afb4830145ec445996ab9eb1ddc7b361a63c7a07508c2d32ae870ce5c3da3baa5176c10b512a0c691bf395dd35ca3644fa0145f88e6530e03264de976b45ec95591639ac2c67fa46d582daeea4bbd71acf0ad93e6f8ef9c2bf4432f5620dac7dcc1000aaa5f409abf4b5635b69367a02bb977e817774273e549c3211666306281b64f1d88ad1999d5ba026fb60842761c7992fc85b4d4526ed19c3015f4f3cc1671e8ea54cb3d41b5e1b6aa93499ec227d16668c0829b8278065b180bba0904cb41137dad440a20a98a8cb3e1aef5f29337e972440e7a94d58b12c8b7ce0a5325d776adb9e4278916de933d67bfcef2ffc45a05ec758367f67e3cee28b092609e5d75dcd8f4b18f981d8ca061ba86696e786799e4e2f8490bbe5c241103f44f433651803851c6f8c0a70fd7f540011c77fae446d3b2ee52cb660a3193f04585570e2afa664132eaa804f8783a07e051018dc6708c60baaa0640a4034f196d4bfa6bbebc27b50e99c106ec24ef05c4815dc38209ce364d0a8808e61b1bfc4eb8911820a298ecfc47b40b5394c7302f1744034166482ce7201bf7b48f3fcea0ca8c0c50b9a2922d064392b0ec9309fc3d8d4dedfc620abe4f9eff4694b1c75a61895e7131fc32f5df3824bb9d0fb21ba6cfc4f03ba3127e508b441b70431b36db5205be68576f48618fd131b0ddb860f2fa244c12cde62fe46449d6917e21ff24110d203cc5e8e8a2a8a19c66299618947d63d75181e2cc257302ff3c0ae5e76baa94c2893e0b960189c01ad74ed273b7a27e64f4b9039e33fd0fe27072088da9c071057304a4fe77fc6ccebbe01c7dbe18bfda058e9874a94b0d5dc090e786c5c4927f9e95f0673772a15137b4ce5e2459870bf0672692ddf46ddb63a204e31d07648b8bc0f7aa1e33ab5ef79ac442e08409d893c58e6a5cbaa2847c85d02adc44c91098f409d3d30c126a1c1930aa691b50b0ac70b823fba749ff8fa6342efcfc5dcadaacb9c7abc1f4c7d83b7025b36090fe6670ef363d03b9943bd61b812d455316f6336b1b3379a2dc998378c2cf22397b7ab545fb924b2980dbe28b4a0ccb409ea5d9098d8ec4559dfb64a273c30eb6f172c7e51b36af6f3acca33238d1d1cf925b04a4386290df1940aa9f5e6f515d2889620c1799ff7dba19ee4e9bac35f2eade63d5d48127560b34257faaa251cc1ab6bf94d75c16ce72ef621de23bed81fc5a7cb87251edb843ddcfac2395dbcacbd0272a39993e151ff3c7d1c6fa05c03a2ca8c318c1edf205e5a5803bf4250806df48906692dd2c5e7aed27c262c67d6cae3230597d9c34024ba5cd95697345f33537e3aecf2491cd7001bd3c005810eb24c1f69d6e40a9087f8ac313536408e453be3c9019b7c92c71173559ce68c00d0d7f1c17a2b7dbbde3aea4869d2df33400edbea4cba0fa524bd08d8d4c51368d1d5a27da90645eeb877259d698e38431f780a5a03bb9e20732cbe03ada648d2bb8a6e19784c7591e05658e4da41273fc42f0be553d8bcb40c2430efa9c3c06c19488f013251604ad3778a9911012ddc66da37adb11fc2d74ba38bcb0d0084f1f023a12340bf38b088a68a85dac4c55795eb0f9ff4a9a00d0604c38380bd3c124ccc52fcf3e7070138575b2d0c1fae53f0d0418b9a3df1c701032288ce173c371496dd821c14b450d40590908e04e36800a6df3f55eef445128071a10504403b9798aa9fe218bf30b103a3ceb3630b676eaf7481f190d944e0184d7a19ac700adb67c426749834c0d44c020fdc7406faeb8078748691ef0ea1e9ddb75f8f9803619a1ca2a60bb515f997bfb90708d4e506026cf21431ac97bc86e0a1a65a768dc83d5fab9503f1386aa8e61ea00e6a707b102f083b401648469fdbd19cbbe6ce12c100623745acc54274d56621285f2a9b3db9456aaff738f6d0fe75aafe4bee1918b4afce61d9f307b40dacf0841f19538f8450b81dfcf9d9797ff7380172bfcd7254b97cf3c9d6a02e675a9a0b4995d97b847dcc468b785817469e5323633190ea64c52625f033d447cb32c91dd56011ba2c9f4a663874e16a4a4ad436c28fae819e8549c7654a079fc3ca995a1514428c2bfb78391d76b33c1e9228c5a7ba9c62cbb4e8c0b444b4d96ca188f4b8aba736a8ebbf09d45fd625bb6faf0d873eeee060bb6184dcae77e9595cf42c6c4876ccd967f5b2393f490330c90eb598c66f93716054094ffc5e34f4f51c18016de499742c395aec2d0023010d742a10b07fd1eeecd891eb66d29a0bbe5f28786abce83094180eedb624a8fce915bd1be809d0ebd8215e16bbea0199bc790e8f28625a544277767a22dca4a16cc3fe3d346417d92e40d2aca4ddadbf1ebeb9e60ec645a095de486a36dddfa66483535c42d3a6e784d358a58c9fa32eba2abb11e1b81189a4fa092a033435951c17cb577f26ac03a1900b14cbcca24fcf075f1317c0d4c8d0b112fa017d3c4ebf7a5c20743edb1e1771751ac75d69e36ad6de5cd74d087c04be71d3e4d214abf2e65bb7f56e36b047d09cb0723b8ef0a7f504e6340c49f5e1e0e512ad561ff2b68efc8d7b456cb190945ce739f3f9fe07837626401018e6da29b9807e7054eacf2b5d669bb25e5382fa10cb28226d0331985239fef9621534d521c3fe54f080cdb186790ffaf1e070cc95fd29c5a2512cd1fc06d570328925f27f5142b25ed4aa8cb5c1ebddfdff965a4f44bbca4fda705284028fbabc04e338729817d82a83b2f90b03eaa3fe2be57621a0a100c182b7647f7f7d2086d9f6c2fe8bd59ed396ea963e299e9d49792a9f73a18688b639a62adffd9728d778a197e2aed79a769227d7633a742871f784b48bbfe87bc8f29c339b654606999df3db3bacc3cc67c2bb25310a99d1c2a81c4fb3c8d934a4289781f0e76896acfde1c0461929b1a19ff760e253065cf74d00c9921e7ce4577109676fe25a64c2c9f1151239156b722a0233db3b6fb9f3554553ca86ae8fab787521436abdb474ca3bdfb921588e29b4280c969329833d889bc276f0f45aca3130c249c5cab77ce26891f2b6c1598155dcc5d1bb0bad861dc86ed535f281d88a1fb4e170e2e8ac328e7869d515d6d52d0ffdf4409a8dcd167dc0108ee9d4fda88cd51e817e1a7838b0104c70214e83f8169cd02a1e12c6a42956759ec47ebec762c1af4df42efd4756d8659799d6967a952eb246de1906c28f80b750fa44c38f2358a56edc331816ad4e3afdebf51199855c884c2a32637805628473c793f366edfef064e4c3d808409c025a7b11f443eea834bc22ba2350d1b9f9c7c6d2f3d02b26ef30098a154a40dc4cabb2cddfe5d6a1534085e0da3db8ae44bcfcabdc0fda745e5047f5d11e8b71dc1b64fae3aff5f40bf8d56ba6d854d149c43e4ea7c611ab754c664ead9fc1f31802923499f7a06edd8aa6aa480936562664c556df646e45d5f4ad0f034ff16df7904fbe8f082f161c4d800b804b365bb0bb62e719a2bb06965e857d08be3404140cf4b76ba093ddc50d1e3ccf32a1016519164e8000760b79fd0bba8dc4ca2d20c15026b04af4c3e6d16fe2107a78cb451d19f0341d4ff35006762d4eb8ba2151acacf43f66655e16f04de8643b596c13a23b2792bc636687afe7e115c6e92ca3a82be25fe7286929f90ff173ef959cd65d0700470c0f49718428e2a5fcf23a0cf5580ec28b19f708c7a46dcb7e624ee49f1108b9a2177b744468c447d92b787506a759ddf4f49d482af2340862d65fae4e75fd511d5e6fed89e4b5cde4f4289a07f9996fd90b883caeab2f90b31f04fa0117c5148c80ce22c360e8af213fbb25cd309e61e1f3a4f8c5c6f89585a06f81885f1acdf858a8d4660741853cc59b201a07935942aebd336bb7e1b4eace4914635abab0a83e61b38a6e1e275c4f155d973e6283d1df03cc95e3630fbaf96d9c28cfd5529eba442675fdfd417b50c4d0cdc970d934914c487fceecf79e6ee465eac33305267b89e4419eb641c7880f804284da67146fd3996e5deca09ebc6449c52b3cf847ba1777573953367a2b7ba4050ebd02b6c3a2fcd4dbec749cf542e43baece4c5a075a393c4d5a27fc9cca1d0b5baeb2d3d67d3596e446cc64aa7fe7539d3378f64a75bcc9e8e111a1cf94293ea97b9d9ca8c161ceac8435e019b3939a1cb1c72f747c99ca61caf18d28edc06f0c93eb74d7636f4b42518ea821b12c882e129c96d55d4b2efc5dd363d2478675772dbaf94306ff6f6e1667fc57ef25d4c036a06e43b033b1bdcec073de9ba52ca6c9835a9c006ca3665b43d23414f24dd4216a9831810c7d17332470eaab8fd4973190933a48f0a5586863ad9db8ead4bc4ca7b3194612653f3acdb75e30999696cd3da132f83970265222edefb2f233359ea2917053c29d06f9eea7ea8c7223f29328b2e2d2fe29f1b401223fb573013c1a48b837498f790d1910955fde648d661cb1c56760762334f4d87b1891b913eee4a27f62061a5b3a9280babaaec7dd554ba640d2e5d46009e85df4fd1592e60d4b51987dcd8bf14e6f3a42e8a116ec95b9389c9642500a380c484b3f5b2f906ddcdf43d5629e9bc6e86700f415b2411fbaf8ebf409cf2356a109f79eefd105dcb1acb21f752a46e260eaa6ed42964cd34c8f05b3686034379ac958d38a376ddd96f41373fc5126f6f3d0269d7f4fb5e3201945722fe23b4fc587e7db33cfff9f73cb68d5912374ce86c12ce3c0f8700f8a880d132b42b804440f3a11a129bf16815f951923d0f7567d519be8473527fc16fa5b4ff41df7159c5804c4ef7df74d00f403665197aa7e8290b6a587c883f057bbfa37bdcb0722bc44d796d5bda4f0a6f33849ef4a6faf580a4a0fd2bbcde75102f7891a1f09a61fb112f3a86211447e8a3bbde353b41a8bdd84438c0055f273f9c3d1974034601083ab7f6369c1e795a6dc0887dfad16f891d9a46d831500925731881ddb058f76dc7e2241d26731a348cb6a3e28e582592c35247000c01afc140584b2f839426bafdbc0c46e05796dc2d48698025b4d6c11aa706400db06768d9366ff8307428e45c40ada0dcfa3a6e487ae4c60801afc2bf161267bcd327c57860499020e9e4a3e963788c50f36fe50d058a87c34a00ed5e6556969293742ccbff40aae3605ae82ae600b5c53b5252573ffaa641a4d62a315c8ea02a49863d8afff288bb800cba9fff792d5df716285f03942b9c5b1df916651555ec34c15fb727136abc603213aeaf63a5b5aedb5953f526a3a49cebfff0813b8d172ad7d4e31e16ee9bcfe3652d82bf57b0afd075b8ebbee5f6f94e5f880ec7a27e08f802993d60b3695aee70fcf639a4d6a6177f9f0b0fee68f65965367c9e336f98ca4c97097385bcabd7c93d9ed9e1f0ad96c54cdb55a52e3549fe82ee69d4c88b51b0bb236f3fd5fdaef1bdbe007be280081183df237f8c044d3692df706b931cd647e4295c3e122849960e2efb50ca6183028a8ab48741be3f7f2aa60085dc3496069dd3f97dfcdbbdff9107a9c795b1cc34c4948e3423ca48f4d430fe4c39ad451972b16571b86875b2190264fddae84427aaf9c297c02e19ef2e505060193bfe0c94676ad3e262b31106a3150bcfcd24291afd9ba2274525e4aeb81a26843b7f1838f0a844b086f94053b6882f82a18eb3845cfbde27f2234f2a572bad7922f6893368744f05fedc2d65841bb9ca0f6f99cfbe0347ae8b2ddd97a2a4b508d82c929ca06c28b3f275ad8e1f99c85f79201803310bd863cd521cd701708231e17742ea24f30c10245b4b5254df8406edbb5d810351fdf84229e91c3872081d1824626c85890b781641d57f172e4149a2d0e001a23e4866b03e2640180fc2a695cfdcfb2db3c85ae63d68dc92c54797f06e18a437fd12bb08c598796061bc6f171bcff279808be54de43be1bb585ad3c6a67e681ad919390df075cef1918e87cf348578b29562a674eda21bbb362856dbfa7f6256301a862237ffdbacde0d95a3ae33673a6de215e4f8915e49de02fdf88f6155469a2728cf9957586074550cf002ced50d6e4a189ec1aea447096bd0563d7845c005151f2b466fd949c44eb90302724b99c6759670775ba7cdd3ec15e1f8217a692535b42151ffd0538246ad11baa9eb65ecc97b52fe1b862ccb07070dfb2767aacce74070cdc38c97edd58026bab6601e58164c73fd37e5f6a5002645a2dfb0851a5ad6728a50c4678ccd7409d26621b64215f5aa38641449009101bb1b7adb96bec496e1f8fa510e853b442844964473c3ef1514e84c1521739c9fa67c0d384b2d7fd1457fd02d56606f58079de2e6c57cb6fe23148f656e5fb0daca51387d17452f10424ce8f5b6a6e4e25076d80b837db50220f67738312eaec9bc77be471874af78423f6c64b284ba3e172f21d2161426b0e5b1e38ea244718d2e048b5c181410535e7a2a8b4010fc92a9fd2203506cac73c8a1b7792020d7205cb3ad08c116ae64ed11e1fc95884a91ec7af580e90d22de45703d5e5f9dd794566dcc136abea204497eb77f8a0b84aa6dcc3d380236a0fc9a0281d222639d0c5f2412feaef7ae49417330629a6a5438333ae3270d56d5144cdaee3037b246f6d919bbbb66862d4fae151cbb84a0820daa6a07d11965c0a568ec6fb4de53ac11c88b99a8a4404242a10484a12f63843160d7904f3836367ccc583e4d1a92acd5b3412846eb3c0910221365b6e1a88390206e59661e18f5edbaeb820f4e4b95c684d42f418d37adb6504eaae98961f77520fca10bf2598fd69ae1c82d0e735eaecc24f33464a95638d751d4711ce36d3787f6ae925e7e3cae7c268c6e434bfe48b222403059682b92f79f36d83360abf6039516d2055c7a15a993e084e255955a05f83185ee295e92281639a63c9a9fbb7c0dccf732a34ee78ec9d24000c7dd0f5ab1a02d79c324195443468f54755547c2493c232a8357976d3f0cc4af4fadd69282b2c6fb5aad67d9920e09424bbc66c5efde181e80cbfd27394eb3a88db93aead9b5c4a89b03d4be124e78546ac4809776f09441721580516c99cff3f7bac84f0e8bead3ff0363869a291d56fd71fdb10231340ccefc15842620d826ec805e62e8d6a5fc977175cabb78fb60a74ddd27f595b3627d77e4687da60b4ad0e342cd70984bbaf1d50547788627b9e6f6b8596818cdf20a2df70a177b8106bb30d136bf16ea4059cbf6473a687bf41421ef292b4e643526a426c0bc984ee6407c57fa58abfa46757821f08a5e9e09e081336ef99d9d69662bc26e54c2082cc21e1672f2924e412a0e3d6b733c1d3e4e70d7a40e46b72a7f284497a330c002478cae2a2ed27a2e2b2d04263c061cb280b7a78737f521429fe408be040775097e3493eb2e106d14ccbde8da700d0d85ea9138e39a0af42773264a403c2cfbf7b09318446adc83b03b616935956ca1c6bd5e7044ed07102eb29ca27022deff239ca518480477ce40b65c55417443a263c1d15d293f5d1b3edc1229c92389fc71b3a48db4a869e8364e03d1eb7c354470cf005c642cbed53491ac322c670fdce1f497da8211a06d4a1c82d9a863910f8011a951800d4664c7c279f497ebb572ae75709dd14df06c43b2a548034c92626ec5772182cf4c80d60816446a9d0814cd7973cb50e486c07f98b281491001135a00d021b5faf5742888daa9aeccfc6af9933f5e8838277ad53228e11c593018c3b08c5443902a87a62c02320c94504d6420d51f27366e456fed3fe947bbd46bb72f826db9b33dd873046546905e6ea66a6ce2da9a00fc25510faf2fa6fae4892ab985f83cd0a46add4547de02c4c6632b4fa7ee597f45b58502ceff68f0d7cce04a5d7936f7b3fbc6ad13428d60de3c41d51861f145beb3d7a8156ffa718959115388c5bc8e93bab6847cc6ad346328c1a9097ecf8db6aec8f78a5ec190cb5cde3c11fd7e06aaa9d7a16adc686ab62c211e288eed8949890922602fab0753ccf90f3ba2ca93a59ac9400e2d66d5676c284d798fe796a30b6e0fc3bb6f55acca958c78a2dd5801c65e26f881d22719cd347bcf509fdc138031c8a8a2c54f1a45823934505878c6f659a2f5cbd31665729b9ef03206448679dcdcb7d9fdecb24a840299fd1dc13f6ae6aea20c2d17c7ae3044192b1462a1ea062f09b81cec2344835a495654bf3216854655df87c2ff3e71f9b8b2986b06d4761f17ccc20bc6f851bf31a8b031440fa10526601c8da84eac80af1a839caec0941fdecf24c42bd0c1cc726abfcab42e58380e844c3554a1bfc5892dbf3efada3304d4502e828e65fbd0fe9cf6f7b3a66065420bc5166593a664adc72ab0cead1eead7a1e03b4d266ae6d62926ec06427173c3593c081980a566401ef092ef8f7019c3f4dc1b077b082b15c2f18a704782d5415560ade48a62c2fdd51b0314516b0152794feec6f6fda89b963a19da63a637c9d567baade7a23cc3dbd04ef04c8d71ab7238cc5c172978b948b05ecbdc74a57b9818cd9bf29ac0187e009dd0dbbc8d5a85653fab37fdf515931d4b97d4f3d1b1260569871825e08c612e2763942141ba4cbb5f40f6e9f30900035129028a7777f9ff8266bc0b57f00b5a31936fe1d0238833cacf169f0a7ee99a0e4aa8506a234ddc5003ad1ea89bd1ef6edcc544416ffcbc81c3a72e3901242b290d3f8bd58edeb293326cc5f866e887bb17a22deabec2e3a2eaa74c4285728488746ef4fa3efc87b4c7ee5d640f5f407ba896a1a41d72491bbffb5f3d0bde2fafd9d2c2801648f5c616161b444e971890e44b160b134578189bd0855cb3849f1391b2e23a22918994ea5302cd30e9d9c58c203f7d78796b26cf911e577d236476b36f9819522a83cb33ef40cfabd103f4b8852fc525e179032fe60e853b01005258dc240459731c96fb94c4b4e6a40ac95284cd0801ab03160e1aecda3fb744bc23e20575de3efbbc831b374ab77411f089f698950c41bb18d499d10038da82c30e27f6e9155c8f4f2cf073dc9829fa4b6f7c91371d052fbf7ad7af899bd9e011f8c195cc7888d0456cd102225fa7a84ccf7a61af256a3fff23caf49584b852f38d43be7df1437b788590dbab6b7215940c1bc3285fe9ea250dc92f113843c37c29848a6d808b170368bbdd30ac805c5c139cdbe2cc566e58a69941816bc85c399248a29567ff816055a7b079188866b876eb82087898043968662172dfc8fc2d927c0c341dd4f1d556a427efa3f9beff0c409e3d8dc059e1571e408e5d8faba91be22e7f03977a2e145f79730f207611c1ce7535ee1c12b6985cbceabbb6160ffc0fce719e6597cab9a06ae41d1060a606ef513996ef18d574909f0573e1829c658e55f4108357097d1150439ee503ec7e9ffb7e9f6a351ac3ff90d2fd405977e0611ce706753c44bfcc0806bda7a0927772d068a3f47d6a7b45f49c54cf019f2f0d2b7b0d4954eef1be400690b1727f5709c5a674233715bb07a821703b232bd40735b0278080462405e6157b09b223f200bd12f29baa961e860d511b4a6f1558876d6bf1d640c5f09adeca19f25d74043e51d5dbe8fc3c432f5152438bea59997234bf1f4b2ef634c61b8b46f915487f375a0a4328f5fdd3c784003a715d7e8957c0b7c20528b4bdf08e806eba51202d47d5fc893c89c018d076f55383148ce936804610485b772db88b9c117185bbede264dc95fdb0f424610762c748657e9eba5d0aa5144d0cf790d9bb8f3fde03f1c15768e0469057d05f9d183529f1d40175f3f7bc2e4cbb934c123ae4934995a3447884cd28fb62079809df3ad5e41319ad8939f7ef3131520f2fc26a79b394d42dfa9cbce4ac758300e30a88103c284fa71f0683580ee9df05459364827f66d88619a58f59cca59355b9884a07ae6a3a08c9695b8bd52cd447d0bf0c11d10e698b565fee08199f5830991efafebed4b3684f382cdc2e673638be9b41b5d31934d9531cf4de62eb5d81571b5e15ea0136e078395d9ff207bd785cad54fcad54e1110a3b6f1e10f3b158f897f2632e136b4451e6271602b8d7b40fe12159b4b11abd89f727a1543d1587aa7af822e82e79b451bfa2cc3d58c2b29f984b1480a1b5ea2f37b9cd16131a589cd7f734320c0ccbcee23ebca7a7545f88615eb5a5f1c2a16ecd93ab69903c7d5e419d16a6c6040b1687df645df4914e03f08a64611d2198c6d213c5553e9911776ebc183605b86fcccbba06810ecdc7312893716358c733ad3d8c29a52bced5f9c7b84d17efe610776d49dc7f93ae05f3997235f7f8e8199a86ed5e4d83bb3114baa9f5f5ef775d36a96b8774c6c47c73f02ee9a3a8175951daf2982aacbe520a382ce976a25d35b987a8c13b23aede55cbf039571f96abc797c99ba4098d0db4f16b3bf16df256652116088ece3eb3d370b15e3ecdcaa7a233f843ede2b678b43ac646997f588c3fd0ee05a6311be3b56fc40265be22b9907f50180c48a9b4ae425c20031ac90774babe30443b95e54ee8d0ecd1966cd3296eba0513ae38d95e0eb7901abdbffd050c4f39a5e040d0982d4726a344dc163f6d52668d5239e48e5563703de72c59873bedce5a452f3898bca27041b4c5091f1bcfea65622cf70f978b0d7068d2005cbbabefce420d96c388074d905c986cf04a638a71c9e1d5ca550aadf852470dedca8b0700d07e70384e472f9e3b022c1250d02b62883c453ca15f1135f99dc4a9b59a313f7bcff14229f4de222263f6f6f75d945768ebce7f7700d5b9fd7974d54c0e129b9d55ac4710418450d468d2064486d4b29eb151b452ab2d0307ed427dc512fa68e8bf2fb425dd4beefb1b6ad0263137c8a0285964d69d429b1f2903648826be0bbe09fd0c1e6a277b384a4aa805cb2c202895c0d96b91969fca69710781d29dbae9052c1172e8e26f88bc4a8460186306dbaafda0f6dda11a1bfa2dee8d24bb13d30ca9d03c1762c9b32b7c40ea898d41223bb43a7fc083c499571a579b9aa97c0948e299322323c9d605e4eefd44f07f5d65eb889a5bb6fc742df62c6334d56a5de6c8b2c67d7fd2b699b1a444b51080bab93f6814d755985a57094412bc6a545cd8683b119177941d161bba84ee3bf3326c2a42beecd8669dd2126533673e098deab96394eca6b8f984c45cc6ba3515f26d9cce6ef1c2490056dd4083ab68341d790048ad1c97102b985dacbc95195f1ebc93bd388bbcff4408b6696f51064cbe9e82a23332dbf8eb9c4a27aee4ec724d87a25545fe877f5504a0237dbd9298aec721241e6d486d228c4690822622bb39d95dc934b4cb6f4de05eb00b9d2088d82aea561c8ee0479c6dab7ea953c7fa9a9a190a04a2ee7b3bc8b41e232092ab21a39b67d5e2ddac59001cb196085f6005deeb7074938d48f40d3bafaef8eff2a46be875bd89e820eeb0eb25dc5459029ca15fad641002c967bde0afd5202686c50423bd239f98194ba69a1de34ae9eab042566cdef38f8be8058685a8b2c3457e6b15672c4b90c537615d4f27817aae374e5c245dbb6de6bbc6e61b03bfbabf30ac6a0236c4b76739d1ea709e2a62b2883ddc26aa7b0797e0dc026b96f8d4e14892dec95de27a0edb93239d18ab4ee7100e028a503a97fc0228df24148c827a8beee9708338d4635e746310981d8f2f563f82c92a9e208d42b0c77d4cdea8b31cb1091f533fd224979db31bc186e566d4f1847b44d6d42263ef4bfcf91737c0c3f54ee5dcc6aa456548b5f39b817120013b9dedf08a588a00a3d6320317e8685d54866fa6f63e2e73c6aa46b4ed45c79e3e9da9c5bb789987357f0dc62e8686e62852be734888ecff0be60fd2956b1c45a6c633196d8c656ac6289cd58c5526cb18ca5d8c52eb6b18bad5862195bb18a8dfffdaffd53ddfefcf77f41fbf15d8b57f311b78e48ccd40cf62a3754a136f9e06a37b45db9eabf08d7e624f46f983c0240aaccd36c318285ea2c3dd1c2518d9b1cfe447cb9c7cadd18ac47a1b21e9cf7b424f6e6a5db6d89aa67953348a3352367f32f60eaecad1451860a85e05985730c3b3c260f1e6cde05a3e38e50a76d5569529c1ba035de710f5068ee9c89f65e0d8d0612a7bf7afd907fe2f8e7edf16197dfa35e26b32e896bbb435580e438be3b0d598abd15366c175dd9cffc62124822bde21592a9a663fa96395143c8ade2edb8954489134bcc081f0fa196354829eae48969ef639191528c6a41d0ebb80744ad306aab507d2e3dd3b5cc111b42ee6b6f458d248ab85862b65a1f00b59480570d83a276d7cc412ff96aa3d0b5926fde0476736dd1454ec6cb4aabb4516d0b6be6a4fe0fa8bf9e0de580c902fbc47d96f4cabbb90f9ce45a0b9fd374c09ab58d42637e2f1d0f1bc061c85b6f7d7d307bd36a19075015dc32601f0d45dc2e1b8a0111c16f8dd57dddc6119aebd39be42b30d09311a4e52d7e5acbef475e1e40b4bc27c2c0c4b2535ca40e41951f373660c011893fc8299920e45c5faf0879a0b78b7c195600e548a98a810aa416237088a1c1b2754597961b97f9acddf1ea6f35d13fffff7303b6ce2b7c6a55623383c6807202bd5335e465862ade10b67238a28d8b4f0af112388c85c40f90319b71e7ce76e2d4e027c3afc455512817c992329a45402a95941e0742f4b1197a6767607f5fc30c368cca1f57685597fac89ff345818d6bff33f70b3ffb7b5e71eafe7a9b127cf7fe8fb820c46ccf44b999897e4383adb7ac0117890ead20416f623163ca1ade2d481266306e6b4830b9e6f7376a14f74199f578eb4e327b8c3fa478be46f97383baca4645fb80b9e382cf29df570037c747ca6f0e0a02d711f31db0ace08d359bad41c5bcdd7b36af24c27123deb7afcc9c716b97b119cc1ac084efd428b0c1571352b088632c64eb2a4d0956d8f178f97054415132c7c62eccb7a961258d584d5451ff31698a8bd551c3cb9eea95afb0c77f582a803bbbce581b42fa8429482e821c17778aa29757a82adf64ff579e4a758e928d81a20f68c8c19515290c73f440fc263895a090ba2c0ca24aee182f05e52641d39a40132c8cf09a3527cb817aabcbf88d506078d98cbc96eb82f411adebcaf81f271d52f7b6f542529e453b76819ef0f8c80e0940e0802b3e861d28dd39656e8bee68ce5d8c82676ebb8cb8c1e4b29e1a43ec5ed80cda90f53f838ca3e98d167c686e17225090fee818f4eb9731137af1e9ef789710845d68a24487049c94611f0c3af72dc16280cd24fcd5dbde0268ea2d4d0e4c10a5f3662cbb05a13085285c308279207caeea59b4d6fd5fee98c3e74d1cde4e416c32994b628095f088f0a2aabb2498b065c53d9bbed54db13d2887b9c306efcb996243d19d50d7d2fc7f896774d15154fee0e7adb1158fe260292f60194fa88410e0dad7963621f22b13bfd076778724101962246e9095c1b13a9b9de51f011714b66194473ede2e5c1f8f975981db21285fd6912a665dfa7b727d515550fd0f019058b0b4200ace7b2c0f0ae225d722058967fb4110a0661c63bd71f0bbf1374b8b4b100532d0e1166f2d4f33dea00556754ad71f6a0ce4baf4c901a14e174cf002e99c1ba364d5a7e5ac5c5eee23f6e657a979e4510f1c8158fc806e8a99e53e37cc9d7592bff835869d389a268ed98f9aeaae19e5b57a78b5c0db7867152df3f84363834b0a1def7f30a1cf1f2abc11a2425a8d0f14acc08bf794ff74c9fbdf4be7be2e38c8636254d929d910050cd546f05f767aa1d5883b504b4082dd3414d9f694c992d381bf643bae02733e3725471ed4656c775abd2cc76b1e24d92d1900f0a16316b401a110d0f438fb786ee071f9cf0db523f3124a3bcf834b02a4d29d51085f36deb854e63f5aa93a112383ce0387a81641039a58a810b91db338123b82f430e572bf2b1e89f4b2c4b1b6494329d24b28027e38e612cc79b6e81dc42de0b3763ebb801c3accf8c88ab7a96e9e858b5aecaff6ad8611a416a06c1bfda61b6ef5b7589515476a17433304942a2a37ebd0b284602598bb2633bf8d303c06fceb2fb0b8585a03bc7b88628462c1619cc326b170dcc76dfb347c28833ec329c5401bca53f99578e6e115418319f2f689013998dd9a4ea78f752193cd0b4cdb26a1b4eab14b45b517f2498ad83fa184d4cfbf1ed18b372139233b07b821e4d1eeb3d202e9bfde177ca63e1683dabb27263dd58fa79b69abef3c8c13484378410d10966bc5b98c98cfccac6b948a6150bb749fe3cda2ea40255cf207dd020af7f8fbe16f1a05cc5a89e50a000df584a9a610c214b35cac52dff972104821306e62bc4172c2d56c21112dac4ff55efc525ea140f27c12381af7f134b2005803f428b0c32bba55f39e6d6ccf055242fa5632379bf47eaf5b075c5e57784e1fbd3fd7d898d551ac220cb85d4d8d3b48d612757b6b2346a5a7216e25a46e14019ca01e37238e3a31459b271502153a9416cbe387fd8826a4adfbd738dd3c2c356a2947656325df3a349f984ed20c72a4340d44b66a57a2b20d93c3320472f9a45431e921098a958a288e4e04016d10dcf6dcd8582040bbce8d87a757569b061d54f7ff6131ab81e15599f8a23471f09fbabd67c42e9ece680c41b59971619eab318f06ac67e6f091b62c897dfb934f550d080b71ac3c89b84e137739b9fc388942f7ed39732de7c0a47ba9e3cc6dd418191a3f79aa890433fa4d070ab4bfd4d5bd1b49b1c6ce63a6e850e0e8fd62238173b03416b439e05b1711d35e7a3b31449921b023ee833702378470e362e01b71ffb5c2d47829360640458c08cd49e1389476b7326dfe84cd78db427727b76e7f3fbdc7282e0f6cea615cff136f98921f49fd43157f07c2cb4e182fed0c4e4b554f47e5d10ef43430d18726f767114e5ab3569efb1fe9374e165d2978b9a01427f0247d293253dfefcd9384de45c9bc4e6ea568cc9c5cd358c7234fea4a96de607cd393b87912b66c42540eb0f93126b042c0fbf62fc08d6b3079e9c4bcb74874a0783f68c6114bad9cab60761564c3b3545c5ab91f704370237463f006506edc01bb49fe9968bafeed45110f33bb4b23286e8f9cba60fa95ed6d0ba1a9236d433b3c3154a167bd38b36be82a10ed1168a71fcf2771696b91776ec2319a095a3a96e5e40950e34b49abb55bba76fd5957e3570270e97166d76de329b005ce41247a5d7091878a25900c06306f2e033425c35c03ef96fc52b68d28cb84f66976d2553bce7110f0b114f6b1d2aad7f4c4c3efb15e91207f92c4bd434ceee8d87bc846c48b77ad4b5a462e984bbc408c586c28ea437287376929a1efa51ce7d3d6c743f1a15529e8b7da9448e4d5819358892700cde802517bafc064917723f13ad291b39f3de0dd47dba4034e12dd170c2c1114b7097ed2b7ef2368d4d336f7aa4aeb9ae3f0f03ad1b812484a871dcbb27b534e5960e8f953c9ef78f00ade1ce0476d1972f53b13b76016a6980029fdacd5ec4a66542ae4ac57456ed7751e6e5083d2a8dc851039e2a461e3752c78cad50ae335932c70cd6127d9f03e5d926a9bb73437c29ad7b16eecb4b0ef4b101c19775ce6a858f06964d51c026c3924b9715fc53e41cdd7992f9373d30dc437ca1e0a0789412c579bb4fb5607e4e7bf6912f75f59fd5102aeb626dc0bf3f005cc7eec71e728c7de93b4b459c242e1b8e9285852a8162f69304fbe91837867e8434eb7bea66b7a89e6ce39ba03f9ab700a89ac100e95b11630485652f4be58efd7df8e820fc04bcb2dc259f872d7fa58ab2c30371e99471442ec303b3f1ee74bdd2cfe996f28b5697fef2ef77b86ba230b0c424becf4cd155055603736bea845336ca73e38d27881e3ca2c3133c9a6fc5c41d3d10fc7e275c708a59ee5a565fc2600d8648724bd33b969e8a053ac7117fbfd295128d0ae4b4b15f6e203499930feb9b572b37c926abef594e66ea80c41120639f090af4da637d210267a40f0eb63e28d21a1a9b395f5d5f8d140b5764fcfd007304f20d655fb7f64040c2b3704f0177e91d22ee060c6d9601b0ad6ab0a8f7e54df95ca07e55cad2bc07a55b924f87413887672bc1b198c2060151e5ef2bcb9a830e47f0bbadaa1e40ac3884be6eaafe3b8af24c7e96b90b98810c242433b5ee17b6b85f9e3ac62af78de77575f2ee4bdd0a4d26e56901db84952ac3c1011d2ec0ece2ab73265e46b4e0c5edc1f7a0497957134336e6736ec6ab424971a15c9c93189f94ba7be568d8cfda8112a5505538364fba101278e7b034c03369550f7d0cb9e45113cf9566ecb3fde71223f38255bfdf641b62f36750b1adf054e985e6591b0f8c162210e241456ac23c8894fccc43dddcf2ccf6909642cdfda3663beab060cd3ca351a536e783d5a2433f66527c0d8c479a06c4516caf2396660d1d1ec4fdabe5afc6c6ba72f0bfdbedbb76ecef25e96c4ea2309ab7a834b1a477c3bf71ef15b4951e122db1dc4e675dd0392f3d724a239a39d039d5a382c8cadc92c7445aff78f8b67b889b755d8b179157d4df078e41b769c47190ad4db82fafb171c109ed71cbcdef48dc6994fffb8d3239f03f4440234d0035a07e39d5b30561d710e69a0fd5a4fe380229cc0977768965e18852881eff4a000dbabe43ed8e5fa30ca403691c27d3082ffad6ae7bd92a3f9740de623c7e903a915155485f4172fd1de7a18a08f9bb16fffdbcfda77e993d0d2922da59449ca900aba098509369bcd368e2d961071884389b2b269e2c771400234445484080f0a45a6522ad56a457b924ce95a45a2521959ad860005d1fe8e18fb8454467425b4da84955b10908f102150b75464c88d112f802455aa95ae957ec56209f1afe4bbbd23f9200e9188994a133e4384040d7184109428f8a708cd49d779df078261a83dd13d5d13752dbca1d6b5590e47ba16532a954a25140a85e281daa13aa16837cc3412a96432b59c74edff8442919e58fa92ae89ba860aad2667aa18d24875025b30d82c8634529daa378ba9411ad1a0b972ce61d775b318d2c80b3b4d7beffb401004c330d45acf62682f8e46e3389248a55289b424e99592356ad4a8417bd3e98442a1c8542a45f2f0f0f0f0f0dcb8c1c383e3c5eb7baa12217cd624052c961d1e6270cc38120017b0175290518fa017560831c411423ffc0060082bd5cdfed83835861620b6d8ac879be9430568c860d80193830e128fe746a9643a9d50a877adaa1093e984423d49ce4a93ae8d2f2e249952a95eab55e9224b2c564bd76a904bd74aef027abd60309f9f9fd2c6e7e75d2bb717675d6bf9ec8dcfc2327ef9e2e234fc63b9f3e232a3060d9144228de3972f2ea4902c85a4c9743aa1308a2453a971fcb2468d1a35be30d456d35e1c8d46e3cececece38eae8e8e8e8e8e8e8e8e8e8e8340902f48a312a67b60afcd0c4edc74f9092204260fa28c120793c0cd1d19283c5adc78605478c0eeb53d4b47654ec9801abd1a2070d1e590e60ec756dfc374ddacb55b2788cf1a2b96c25cc715de78d5efd3e10a4bd5cdf799fae8dff8561a8add65ea9a6d162c48811c3478f9d9d9d1d1eccb3338eb8495dc2c8ea35fb09d29143089a128b0b0e529123416e85454b0a54000493c5e879b1b1669830746ec468c4ecf0782e5da3bdeba56b28182ca66bb48ffd934662252023b0d66853d616d9cf5dbd4bbc4750b4590c2ef2628d48828c4ca149d022588bc57c7109758df6a10eb528eada0c357ab17cca250bf8181a490b5d890721c410479486b45a86407f7ccad5b3984558318060361c6c66bc784ca6130a4592295d6bf9d47d213e3e3647ec2d1224fefcc0708831a96be593b194aebd4ad764af2a7f1563e95acbb35ab6d5f24a5b2d4fbc3f968ae09f170c09901157cb87b512853cec65b3d96c369bcd66b3d96c3756b2bc982d4248a248092b41acd50f12232f73c1e1486988e7744291642aa552adec6ae595ae5648622e1b14ca88a952ad740df62b9627e220244882ca179298cb46bca531fff80809f548879dfec46ee323402c7305a30931c411422e4fc29fb8d91f5e64a4f5414362a805984cf84fba5642a14812a774adf5a9abb22a9557aa527922f9a3909185a40aa1b956370624a260364738b2092b3f5a4e13f24250a278125ee44a5881d9945e2312d70f50a9643a9d502852d7723cc922e589fea69a0b195a9d5ae9d8d1e3038542a150281a8d86a2d160baf67a584cd758af6b29fecbb2ac7953d7666fb278621502d3355a2bb65ab578bceb9a8a776b752df6f6de0b335d2e988f520bd305c3489121438ce89015c9c1a2055596a6aebd7a9e85a545a66bff321a9792a96be2832c61d5e2bf30c6586cd8a26be2bb84578bdfc35b965998f50dc74cc868bec060e6f83e8c5e60e39364356529ab297900b55a4027242d569e0e1815058ad5bba06bb114ba5657f0296254e81acbab589d1e000058e189e3bb9022aca50b005684174511305c588459c3f4a0b977765f60c18ed9fd17c6159e8e971ad37c0980113e6acc9e2324c9a3a5857c1e2de457c008cbf57ab15404915caf143ce028a14a65bd28195d5bbdcccc0b5debf9172e18306874ad7c9a1a5b53e395d6d4c8e81af994d6eaae6be3bbb5bad67a0bc38505c991a07aa4452ca8e5c95558cb4aa36bb4a7a9d13554ca448b11c3c91d3a7cf488751c51344ceed0e1a3c7c58a01da779ef77dba86fffbc2300c533695f24a539de824b943878f1e71dcd9d9d9d9d161a869af457134d235fca351d7683f9248249665b1bc5256273a49eed0510a499af625d2643a85275dc37f2251ba467b14499224f9b2af9757faea4427c954486adaa754a16ab5d235fc2b96aed19ed56ab59c245ba14bd3be0573e91aeac1d84bd7f0bf60652ce624f9e3a74c376e504ca3a168281acdbbbc0a3a891fe732234a0f1d2a4b3031dbf1820e2f0c015d21c4103e3bc2672e042588911e802451a4849527644a7bbbc0cbb533040f56e8c70bd80d341610236605b612461130b21a2c5841e325071f2e6020f2834f0658a4a0142ef0d4e81aed6b62e81aed63a81e06187c2463663b789c3c2f955034ac22c798198d1a30ece09183a3c293a63d8a2453614ad7f0a752a14ad768af5aad56a52d4bafb41c4732665662852b4d7b56abe572e91a7ed7eb5561305827fa8f64cc0c0618608081f631f2bf2c4bd23449161616f2c5bebc78a52f9de82339923468d0a0d103ed652d2dba867ad02574d135fc2e23ed5fc6d96c446151a0f04a5174a293e3f8128e65dd22499215488c1816a817e0e1b9e1b41b4eab4c9c87a7f4e3c5908fd1e34263ab4b5426583c080fc1103e907abcb0228922259eb037fbc312b145ac111ba4732aed103a329043070f9f01519508d102c4476ca787db0c93c6a8023560d87173006a81c4bb81b241b980c206470c0beb0504c41ad1ca1750cd8c6cc556ab160f1f97d86a07cd0bcc74b9603e5a98ae1e24183f3a84783c0c69c9c1e288add50685c205161c312410eb558e6835b3552b36c38587cfcb0e9a9d1f17cca4d1c2078c1ea41ab79e870952811f5e7512b224071b1b940b2840161616f0b6d89616afb4a5139df50202628d68e50ba86646b662ab558b878f4b6cb583e6458810214284542142901829f260fd6109495948822d362d360fba84644896147c09c917142f2139b3f91b27713c0813923021c9f2375efd69ac1710d08856be806a664f83c64f908a07c3d006e502398e248e27e95acc93487fbac97bef55f1477e682968658a183162c4700145b94447e706be8143493d00b471c45a7f626d220426485999a0566e3f7cf613a42404311e2aa24c392561fa80d18344c41619528447470b8b1c52d0535615d45a44959284cfea508c1435b6d60c971d3b345a946a18918939461c3a3784368a060484f2817ba068403132987fcbc686a6f517860b4bac050e529167d1e2736b0542d17af8c0b018196964c8cae69a955e2f650c56cba4195960b8f8a886c70e1d397c3a0ffc803e1044813e1e0c71d823a401c5c83ad1c9212b234686cc4aae959197f245d61b376ad083201886a1aea17ca0c43ad235d98f604e2229f5902449f63c59da6dcbb61ee59205bc0ff79d1ddfd971dfd9f19d1d14cd69a34f245d098fd283d8517a088c1cf12a9108c1a645c302c3e50707a948d08d1645582b545356262a2cc86f436c2e7f8931c31c7562228b1818342d5ac0d0411ac1a0699103478dcf8b65968a1c295d36fe23fe8dbd58eed6deab6b18639cc39ccd52e91a6f6eb6aec1d0411ac16891e363d0351c1f43edeb8d891845c3a3592aeb0c1ce29c69cf755d576badf5d65ac7711c59c4e8e8e8e8e8e8e8e8d0747494f83451adf8ed87ff04cd8670c44811f3e6d282e467085bc48c20a88a10d41542402d18a41c4ea56413573766613c3636b418316080e1e6c6e7e7c7577eefbdb5ea1a0d15b3f7ea1a0d63f26180a1c4f15bd758fcc6d1b596c719bd00748de60510838d2106af3486184c1909868bec6f4d8b97a0d5583262039491a068b0183e32249b362107aa8201d5873eb14feac4f677ea84ed536e28da5e89d411100bdba77daa927cbdf72a61041bdc1489224535a0538e588c31f6809c5822882a2528c1ed08911220c8d6fbf138175fe7d9eb7eb0d96f66a0423178266beac49c21121b5802576bad496bf8b141a58a119614e140131dec8033655022efa80ccf9f5983cf7e5071d9bc89e17a8c8b0686a0811324424d0002c7bff31fa5b0fd4f2aff771fb0b0fd53b84c18a3daf4890f43d8e1a64f7cd0c13e63beaa770052c71d0f22b68a0fb618638cb13b768c31c6d81d3bc6eed6b1c518638cab63c7f83a768c31c6d831c6d85ac716638c31c68e31c618e3305b6b33768cdd3c6d9410e088b69b3ad41eae96a40052d9e95274cb6a4723d895ed573030e233c56434e5de6b8ea660a2f11c35d9dec467fed72cc240fd6a8ea3281cd10046443122a3a1d1900cae1d1bc5886c277bc865a28ca6d4d114aac2ad0bc69190cb9ca326234a435d8a3000d2b7f65e0ddc6bafb5d65a6b6db5d6560bbafbb5b6bbeec3786f775dffaa93eae4ea303e724dd96cf6ae77c954d65a6badb51d47c41195600052d96912d9f8c16d65f4284db73137446758ecbf85bdb5e74966f5b1b73f5219d5a7feb435a2137405a5c96f4f6ecac6e7f7c4c60f826fdaa858f9ba6261f0abca32895a59544ea12af0672da324b230b01bf954bfae9465cb3c7910710d8cab6f95366c15aa6b18597fe3e595ca52529c5c9636f593e9643a9d9ebae9cfdfa7d936fd39db27255138aea35cd775a4fd3abbfd728d5de7d1cef33c97909326a4a7de3ac74dfa5c8e9b95ff4a0c66b59229574b568fdf55be7e546ae244a8f4ad122bc9f8af2b2ea3cae5682b01fb010b4241fa59f185f1f5848d9bcf706d7dce39e7565ead5a7995ffc6e65a9e2df3f584cfb009fbe133fcbae233cc4a924b71b394af220b833f56fe2082a564b7cc92e5c4c2e08795ac261606ff972c26168695c4c2e0d71555f9aae233fcacf2d584070097e68b8acfb079dbf8cf17958ddfbcfdf018411e87f5f8cd202e533e7ef347f5e5e36f95af0f9f95443f7e16133bf38f9fd5c4cec41e3fcb899d813dd6e29faf2b3b56b21e56c6de2c619f4bbd5949f6ebcfd2958d5d0f869dd8fab25cc2facf1fcb0fcbff2acfcb646797799e76fe5649a98afcac72a5da1d558173aa3c452c6cfc647976a8f284fdd8f84f2410364aa93cad124a8cca9335b4f18be579b5f8c439db272bc9c67f92409cb689f37565e3ef48206c12fb149f184068762611eba3f6a032e904748cbbfc61fdcce960a41b2788237430428023da3ad83ff9cce6603c5ddb5c72ffec5c76e69a8e016b59d0b750401946df14090d684aef8cd5348066908b73ed9f3408dbfe0e31db9ab6d15e72ffeca1f5b66f4975cd366e6b5207024865df077e1f86dabcb16179d623b699fffb340ddf7b593f8f87bef1ebfc69ad31d65a9767ccce3e7e1e7e6d7a06f0c76058f5f75a3bb1e78beddfe8bfa7d7a33bf4bcb0e685a3696762480fcae0dfbd87a8ff8cc0a7c7e19fccd3f1c7616c7636c2d3c73c8732bbd09fea934980d0f43eb3d5c5d8991b521886efd5226a8df79fa9cfd367fd234fcbf0bd67eae03dfe2ed47fc391fa64a2bed3e7f0fb48ee2d2a3c654dc5dddd1d67d31bdfcb5a84fe52697f548e3cf12f68be9d11cd189279bdf00bbffb2f7b5cf8fdf975dee7cfd37f6367688cad469c315b7fde995f65dcefbc1f99670cf8d508ef39b31a5157e0d746d41a9a73588da835dabbef995e28e36af37b2e3469e0fefb1bef6e2ebd4ebeac9ffa8c98627be6e9bd6886e6bd7150eb97c15f7fcf0ebdf20cb7a74beab3d003cdf3f6d8088d30c2c9aeb7f3517b3e8be2c1bd97de5affdedb7d750fc711e4bc191be1e6b87ae2ba1f18739d97e33da76b9e876d675d2602a1bdb56a1bee4bdfda5b041d220252d9291669414aad52150e41ab65e8b62db4ddd3fcf84f4ba5b33055beac5dfd985acb8c6dcde50f226cf818fccece58dfdf013c1b4a99b26d12bbbea552697dcfb4543abaef8de386325158d6edf5da2b9e38c4221fb7c75a6e0a9728bc43184f8a67f23bcecfdd6bedb5f839734990c7c9358ee2e41c8c679773309e315b7606b98f1f8cc158adbd41762d3da6eb3ad90db2a93e80e35c251626d3603c3bee9e34f4126120223f8cfeff83cb67d5962a2746d5d9b32b47b46be9e76c3bade50d55e13118fd4fea1d115b04a432fb9456776b816a756befc5b8ba6c369bcd66b3d96c369bedb65842c42020940861e3430307244998d846ec34870e1e4028c1e106aa26a9b656bf97e56eefb5c1d8b51262edd5b5928b4280eebd38678eeb3a9b15c699e3bacef36c56b534c6ccc81b244992240f0fc9c343beb804190982b584b4c87e7cca95cbc26c9c4ac386cfa6d42025d1e6fe8b07e3cc715de779fe72d96c369bcd66b3d96c98765bac227088222589a21c3a2a0f25364742c3b689784b63d10d140d87055c6b2fc6ae9ccb97ae912d9ad16cc17061391254a4c891161f5484454b0ce3cc715de77926cbc7aac97271ce1cd7759de77d1f17763e7a8020582af9e8b1b3b3b3b3b3b3b3b3b3b3b38323870eba82c76af65222848e1c362d1a1697ba4465a236d12268e35498ccd5636399238c2337441634627678eec539af38ce65833127c4c7133f67aeeb3ceffbc0950dc7759ef77d20b8b27114ad868af142d67b3ee3388ee3582a8d331d5c9ba880223112234aab45f6b3b2c9a1a3aee0f162e9043929c1441cee2771ced3b5f1bd1f100c2add2316d35e63a9542a956ea954725ab964010f629bcd66cb369b67b37558837a091f21413f41ac5511488c380e31806c576ce2c64f10c6610138eb1af9c367e477ba86face836a0dbc2068bd82a027562a567091ac6b2e7c8e71bae67a8ee63b5d7bf9ce2f0b6663c3da91a28505b3d101c3a5d57af560d1e2316a7124c8081050500e23386258681c87a4d3b5eae3adbeefc5ea3aeffb40300c3b9717182d4030d4bad6f35ad4b5d58b235d2b7ff41ac191c51ce99af82321a3ae3949d74a4f2a0119b9e348d2b56ae44b362653cc656fe6b80f85225329956ab5727981d1a2da62cc7079d981d162341ac791542a955c5e4aa6d309852249329552a966cc9831c366b3d974747474747474747474747470e40062bd826a664d52a082d80c1e2f343b954a5da232416b1337fff113a48487214574882d2c6e3d36346c1fa3e5a26207ac46a9070d233cb2219dd3094592a9944ac5623a8b49c3348c693c761859cd5e65a55297a84cb4685c7e70908a04899f434785c5c8765c3d2fac19230c9d2337622c68f0a05229d56af5458ec45c956651367f692389542ae9daf82593c9743a9d6aadb5d65a4ba57b4b2c62489224491e1e928787bc41ea94a8d4252a13b4fa8f1f212e2d487e4c212851586a11ad18319bcfaa9c01d341a154ba46f3291244fe90234046ae8febf55324a8c512b2b2b9e2bb5e369bcd66b3052a9579eed8f785874b8f161fab97511a555d99678fca7461db27cb1305cc39db76547afb3588a95472d23b6954a39837d4547ccbb3ef5b1cdd585e3a134723f3e45187c4b71f8ae6c95d53078ed35cf8a1cee1b8a73b6c317221c7bdd6399c19765687eeefdb325761ecde7bad733adbbdae795ef737ae754e679ecc1a6584818de23242dbbee8c4cac83db60f9242af994e1707e3f9db76dbffdbf4090b7cb6bf537dc220f9b13c9d519ceebdbf717faa1fa499ebbc0f3c7b76564155787d3729f51995f9ec6925853ebba68c08f4517b3e164780325b6b752f6a42e6325df8a3c538ee1befbc4d49bf6ba514097869feb36ce1805e76f4fa7bebe2b206eea9c9833e67b66ee7326eb6ae79808a73bad9d1da955cb653c6f3778c9da16f676eac5721ecd609a11328b1a990098028da54e8043d6c9b6fdbfab0eb531bbae75e06e7bd0ddf7b2fc37baa6b3bd86c003fbf8cfce187660ff073a83fcbc826f82d19b74a65d70f6b15d0ac4416c6ecf1bde7850f8644c0245f13271e93cfa4da86960ddc7bef993dbae7cc967dee7b70284e4bc6f7de531caa6d08a0389f29c3336be8be2583470f8e0f1caa6b685953c614aa757874a659872c51c55376c5c165cb86fcf8f1d0ae9ff3672ab9e80ee1245809918d99e024bb16d919fcf552d9952bef140b63037eee39b3c7c5a1383519556ed1ae3cf2df3e9c6c5ac0c78a202071c3b9e5bf445470d1ae393f369b9c77a8c40f566d03fe6c9e77080115e70e5d220bd30d39e98a441af4e006446e55a80a591e48e901945b151272f259c98215a2dc70ec532243496aadb7c9ae6f89d8993b5422d28012379c4a71aad00db2ab1d222aa252855e39edcdde76b54ec0aa65b0db4d4a55dc5b9e54a80441d8f60eedf30aedfa6e85ba9a1ca84008a7680a511dcab74d597c783dd7c51e2efdbff5f1d7d70177d5a494721ccdb4a3b4a34f29a5945a4be9e590784225cab625edc106eb121fd8b6acd9a037c1876d4b181bb44b0861db12c5066f0fdb962e1bc425d8601edab64c6d9063e2085d28836dcbdf20ed382fd3af0947006b13b4409f3421836d4bfa6483f489136edb96b15db92d68e1b6ebf77875a09f2bfbec4a604545538c97de6b1d7b59ade5329ed54a6797d27bff6b356bbd17bb9dd18caddfca899f09c001d43d1a290796467a6fa330dcf5bdbf25c6f86baeb17fc1de85efa754b6aec2997aa3528674a1aa46ffe98aa570f1c246e8a450e8108d42b3aa119f7e0ba5493d7d1714b4267cfa2aa8cce9e9b3a035a6a7ff02a5293d7d4c6bea4f5d41696a2db1a9aeeccdf79a3c32c6713757562894d50adcd79f4ae3debf56b1f54aadb902a5b1ef4c0cd99c6981b0fdab942849d8fe2a236cff5511285dc10ac2fdcfb39f1debd7f1dc60b15ca08ba03611a168fd18635df2dc0d134130aca5ef7ab333dd77666d62529f552526ecc66efdab3cc7fdfad7ab3c3b9ebb5f5fabc0cc4a85e5fd67aecb3c282bab50eb1ff67ab9fc0bf6b207613218acf5fad8b75ebf322ff559eb5dfeea9cd7c71e8cb55ea797cbebf558e7bccc187ce61f33afcf5a3742b19618ec5f6cc95ead92aec9cc16634bf6fad6cb6c11e0fff5af370ba067187ab5fef52cafdd7a11e055d6c0d7d7075d6585f26ab56e77637fff9a27385485eebf5c0ffbd777a5eb49e62d731546d7ebff573ac7f5b007612fd7d3fdaf75edcd16a3eb5dae67e91c97c900f3faec65520d7bd7eb5d1f2b299dc14cea33d7b35eae56885f158acbb8fe05ea1ae8fa1bf7aecb6c11a0d562e91b5abae6b1ca555969405588382051e5c9240452ad45e14bd3f0f9f5bd0f7e5e16bade1de53bfad1e3bf2fea9cd16393455d3a677447e068e48dfea57346a60d7c5ffa011816c3a4aeb142ea32985a7a415c7e956571cba6a55fd4aeb7339e655c49b9d5e55c57f7c24da8aa5d1fa66bd57cc0b65f4b1b2a91db5c59a1388c3f8baed9bf2e83bd6f08871b63fcbd7d500806e397f1839ff19b740e7ed0bce2bbcec19884453cc26f750ed6d95efc259d733f9b6109fe059fa46b2038c232ecb7ac42da001d149789806a0b0de1cfdeee762a1c2222a0dad767d484e959f883eb6ecedd4fb38bf96fdce66df12916ea9ab5df9ff2eb71bca7d7601996b656986bea9c6e5bdff5fe48e7dcaff64d9d7347ba66ad66c9e675164d7159b74cd360936842100fdbbeac25ff4ad76ea557ccefb74d597a603ebc075b008800f498187c37bbbb7750c8dfe59c04103be3eb3246d6450d56f277392fd9d9f318da0319d90ad5d0849cf3931e92b033be1e83a5de75b72a37c40cc137dff080221a96c80e11141c29820980348107406801be37742cdf05f2bd297c565f50220349688009459001117e30028f9ba5b8e112a1c839e39c67f909b79d77f6cf5e7743510a235682c880107c60420a47888293a53c61c21362ccd90846bacf19c5f12c84b5a68903022a332754c10954f639a3f2e37852b98ab0c54d9f2061689fe357eb4beebd17e72f2d724901092b1be0c110309002cef5818f11b8bdc3122a1a68c2480f4131c0b93db89fc265ee08440c7a38b281162401089cfb2f5c86f260dfbf49c2f6f6fd19eecb70196a837d9ff82c61df6780cb605ab46ffcc6679b3ef1316297367de223c4ad02d2a732dfb5d65aebec854d7d17b556ea5efd07a4389da5303ef3c725c5012badd4134f1cdb86a3dbd774285e073cc5dbbfdc5b4eb5b9e7cc93fb6c826557524a29ad6faf59e9ef6ac6d4188ca78bedfe2f5cb850d1991b0ae3af87ec930a51228b0593e9e433bfd7f4b7b421dbda548e3e231fb427f7eca23ed1997bfad3ee52cda9a321d55aeb9818105495a62f9578a74ca6af6422ffea1cd3df07afe9e926ffd335d26c319a4853677aac734c17a7ea06cf09eccb999e3399678e7d9fce469f75cea5ee22e96f5c55b6de4477ea6e3b9a54c5c8f45e324f1fa6b25215a3cfba467acb954aefaea95c827f55e22825b003cfb877a82b5426cf4ff98308d3a8249fa7dba99baeb404f52bd4abf0a74a0a749bacd1190550190aa03335288cd72435e84cf50085f1231cc6033ba84138c27bf7af443e834fbbbba7e7fdbec7250e0be37f2a797ce65f8908dfbf3229fd2d4b6f2acf9e6dfa1b2e53f23fef735f32a938eb2e99e7fdd1877a00f7497f632f1856ecd78634cc9e38fea62e53c79a58d2adc7b36260fb94ed8ec4955d77996cdf6cb13602e8f4de4ade50530cd4ce802a00ed011da25162464f3f060d9511ff058c176cea8ab3c5ece5bd9775295a33ab2bfc4d9b3e4db1473b738385f1f1861f8c55463663b833a4b0498b48d4c96457fba445dce392bb01bfc90e00ff35c55817b5a68617d8c6265bae441a4762c6ba0c65fce9b29afd19e03230166aa05290b2fdc3b2fad0993f583a805261d32704fa472fcff0c177ed2f3e587e1f926c6705b090852d6cd24ba067934c098ca68dee870578d8239302abedbdf8a249e9ecfc5e9b9f69f3381353cae2a439a83a16c6fe356558189b851f543840ae8e9d01325a18fb173f90fb40a805422d8c9dc1e66861e85b53a5da66aec298f2e13d6e4123409a62bcd6da5bca36577eefd1139f6135bbc7b5e7cccf75657dfab9bcb9bcd5f260a4760620959df8b6731ea5cc461a259c510da55432b55a7bafd7a5b8efba94cc90fd52df79cf21718129df73a4ef1efcf085d13ff07b610c4df6ecc2111c6f38f7e630f999b8509222898cc8a6f98650f2bf7e6c09f3b7e89c96cde33312e7852555954478b5f14f95ca34690f94e6f230125f4977fa4c845bcbc4fa56c284c8724d9a34b14fb8b5e2b609ab842d421d7298fcf608368999948fa282628bd8d956bf2b75ce7b38da99daa40e5d69325ec157c03a3474495788fb71222076fe2286d8f9f1a8635df59c798e2a13ecdc79f7dd575a639974e3a8bc3f5cc6771e4db944f7bc42f705e775c1e90db1f3bfcef1ee2dbf65a25fa51a4f2f754ec3f7e02c9c75f7461dba1d2bd695489d506833a6ea908b14b70ecd3851765b64239e9609780aefcdc2e49fdd1b91798e9c79761d95cd6083481153ea134aa038959f2652ec950bc449d7fcde5c06a6338eabcfaf5387ecccca5cfda962fd39b64a2d935a9699f5009a44d9f9af949d1f659edd4d62e72f99f7f6e55785a52db9f2bc3727df895c2e52c8f22ba94a529c9689bb7ce68685392d1317fbb44cce173e8385c98f7acbe4de6ecc6067ee0f87c94f324f953653e6fde1526f1bedd47bf7169ae73de2649e578834cf0e6596cc8f04de3e30053eec95e25054d310be779df7c478eaa73b9b5d107d6fe2481c8961e86a857ffa93a94389645e5387afd4af4d17369c57de0dfe78c267b91cfd0f2244d3c8eabacfddddc3d27b554971f068bb14f7dcc7bdc7c46172378eaab7964993f1ed9fdde6522d9dd39927f71d0df6532605eafeccd3ddfb30c5bd529c534ae37527ebde7c961f9ca53e2c8cfe671ddad95edbd9b78db67defee7c8fd8f90a5d283b135998ae1b47f354a93ef37c2792cd6083481153ea134aa038959f2652ec950b044b68af6ce7442e63fffb1dae4ae7d8931bfff43eb333968985c94f0245d3bdaaf22b3b9f3121994c2c1326df9ffea069fcefc1aeac6527c4a75a86512783fed37b894496fa759421229719cd7ac52476ce43bd92aa4f7859afd42b1ec493e40761c254f93d57826fed06bd14f5522051e952a86099d4fc9649ce7f79a03395c2789fbbcfffab1589e4fde96d4fc978c6ecd3866cdf280ddd19fffde13275e7fcf4bc4eba4ffdd93d49e77466d7791e67b62870b7f7b6d1f6debd52d3e03df7208ad02bedfec0c7a972fc6efcc6cee4a9db336f178228c2eefef059fe50f563abbbfbd99867fe3bdcfca2ce7193027577a635bdb23e217265a3d8f4099128fb6a19c6373d984bd483a854d7710f7adddb46bbeb9e7c92a6e17bcea440dd29f3f41f7fd43490be336fec8d932d029c4acf537518df64f2d42a84cb7c9fbf5492c0cfa379e347a5a8cb330036dba9133b7f3c2f4e17fb3a8c7f5885cbfe9e9358a7b76231e35bc91300c48f8f3e0eb884fbafa438b4b44ac6b312551ed04a44ab10b6ad48b8dbda3fe9942b65e75b56a22ae50aa367fa77235732c061569ea9e333fba44a64b3691f9705f0192572a24d59eebd40beb7dfdbef2df7cebd73efb79d2b2dad92d0a710055a4369ec675bc53a31ba14280d05fcb385c1ce6faf8c9688ed0668dfd339f63fee7d0a74742ca87aa0af9d65a8bb56f72ab6caa5b2f39f96c8ceef55f267af82daa87a5e2add3eb1d0ce7f4bb762ad30e2b73557b967aeb2f3e94976fe3327e1c09c3d0f2cb7af70e7b8efc107b9f2f3429b5d41f3e386fc2ee9de3bd356613c6d959df3955a85fbd33ab1abb80c67664d03f75ec565f25b2bf60aa5c9f1e74cce926e3608a52afcb9db0583409fb8369c3ef14000698a5b7fa89c58822261f440c491f875e1030143101cf5030975288ef48fa3d723f307150e10110811dc8f5efcd1eb3f3f53296e8bce14369bfee8c5b2b330f875893f8c79efb9c725e54821f72f8cb8f3bc0e73dce3e7e8131228d9987bd7350e575dcb165bbbc24fa9b7f1578aef6fcae283ebc9ce21c107305224800c6da7f6b501dcfa637c73ec3bdeb5744fe124a8d57b9ebaeb5b21c6fb76a62a57e689b767118cdd7fdd0e5de6ac94863bc1e77400294da53ec3949edeaefb9ad73671f13ecb18e37f407d3097b65a6bad6f4b6c9ef6beadd5bfbef52360cc4c48d535d9370a4ef6a9fa0019b065dbe29f31fffd4a3b8a84d1be0dd9be3238f378cef70601a45fcb4e8c5fa5dc33d89992c2dc87b1ef2df7f954c5bd4cc65b3150975c128c6fed8f96885b01043d6bafb5d71619eb5b4ae9bdf75e77ea36de9dbabb67a7945e9fe57a6badb4d6ecb5bea58eadbdd65edbe18ec36567619c526bdd1495b8d984e109c6be67cdbe2cf60d800a001785abaeb827ccbe2cfbded3dcf70cf7ad91d515f76c6d95cdbee5d8f9922e3cd59a99aad6a48871f162a41abd76e927853eab3535d015312e5ea0cc31c528469be20bb31c7d598eff25e96365e961a5e95fe5698602c8a8218a0d5485ff9ec17b7fea7d03e8ccbf55e65067feac120274e6bf52953614e07bf03bf04f477d2e51a83ff377cfda28fdf55328f31c407e3287ad51a4793a0075aa50e6f98053793ad9d87a1c6f94ca30e421955d8763ebaff52f8fad5f34290d776baa04cac4941d6e046c76e6b8ecd96d6caef7bc7cd41e6bb590da7d7f3f2f5f4628a106fef9b273569a94c67bfa2c5f771d0c2fb6dcadef3ffb52764dd9ccba39f399fd6abecfeccc65a8def4090b8eec5057954ae53395162fae55db086b9fbbe38a77104723120e8670f082ea84ceec5b1fc1f87606436b5c6fdf054ad37afb29280deb536f7f05a521df9ededa774169566f3f00b446f5f66728cdf8f661d09ad1dbafa134fac5b74fa335e1db8781d2806f7fd31c3a536f14c6be1d4d1f8407a31090e06ab1f0f64fe5ed4fa24edff62fadf4f65789a6512924b7afb6c39caced418c67bdd59bbbf59bbdbb76a87a82cac467f6eb09a84c114c5ca6a68082a6d0465813bf7b5015de1eaa05a80a1eaaad37aac2be13f1329fc96f4ba2c8815f6fbb96ac4d350d768fef3d690107762d479b6afaa488c806f1eedeb5ae894bea0f87b11f82548fccb3678f4c417c86f42ad3971e34953548bdcd6034d91f7fe3b8d299f8a452e630f6b5ceb95b8563df540e5207eab5ae05a646a8d40a5f27319488460400000000e316000020100a05c341a1280da51c6e1f14801170926c6246a58b9324c8611842c81063000000803100223030435a01d964a9cef42787c22f5b13691c0500ddb7af0f08af2c48a760e163c1923fe9364e380cc641c6fbcfe55aee5f6270e340701eecb9ffe1e230a81a4cf2b528bcc4f5e1e03e7a3d3a524865c95bdb3cc1fe1591cf7642972703fba463e9108bcd60734da82346d1e1473556d16019cc144283df5f2222df7dc9c056dde1b11c111e98a7093db154f7ddbb469b6ae1e8ac85099406a3b5a28230a53ca0e709bf68e7c92587227bb206cf925b376291f27171799694d7864aaeed4cd1146bb9078bbe6fa73c958072fe48680befbd225efb947a9ad22d4f24301124ffe935bdb3e43458eb38729e0b8a1b12ae18a23663229b2ef5dd51b90e8285c4dddf41d27a4e9285eef202c4ddc7a78027e925436798359f3781ab63eecaf6a99af75e71e8f28d1e0b2bb74be2c4eb0434dd2805a3574ac1ee10d7241b09942ed47c17e26b0790b37786e1d7463ee3f835689bdf4ddfd67c74aac3e52eb5c4868616619c0072a09067d624308b74e1781694984f6bc10a73dbb101ad7098f9ed59225c70a98a64670831348ee0f844a15e8b5765814a7028914382704fa27c9d3241c408333526684120cecf12629f3ef7a82964fbc732bf2a4752912799206f8c60a7e1e08c89f0c26f99929dacb0e362928e3f784931d5b2d64f94fbbd20120cbd6f10460323383769ec5efa67772798ff89c96be920f1d5773c9db689d94f1a874ce666525304717ea0cbc86371e220f4649e2bd0292bf964cbb9b24d0be1707560558683061502f1fe8f8fe9646a131cf72371b3e9bbfbc419f3e9b7eaa0f4c5eead13506ba171a6e8697a6d864c3c31da250c32a4e5e7cf6cf8c5106f9a3c8bc4136c34e06a88aab5a69b1e89cdbabb70f8b8992f2f390fcc4c73adf6dfbcef00bf33ff31be00bfa18056c8a37973584675170ce96e78c7a93d01c3d8fd29a70241a72aefef766e4dae34e8e588af10f32ceaf643bd7fc181c0bc3de7133cca3718fc0c7ef43163f4a8a1768ee918b716a527cd7d3d9e86802e058fc81084d6148d0da5c58a2c821aa5850e1edf1fe5d9b416eb1df046973cda39de45c7e632540f94a19a0c079837043b38985586601715d2a0815a650e3ddf3180f4d93005e1e1090775acc92e699698e5713400846a8fd5392216e53720d8764442eb35bb8c1325e2f7aba2ef804ada3fcb17b4a1a249c782c02112b36f3822107952d015b21b4b30867bca0267229678d0248f9942dda436aa3e2b694a26bf794f15b4c82a155081a0a1603d6094a43cf79183e8ceeea8ad0a189d4971eca2ae95f798a831646a207a2e41d349c9db3e18636afb3cba029a26dcc54f5dddb37467d61c46c233425d67135e84ad9a81658adf3fc43b4769b660906dde11c3235a189ea8d023664e411a2e74cb9a4b488583d32576ee0756156ea3f3c068098ac4c9ee6d08608bcd1ab176c830eafa11b1ea000bafb322bc0e59de5ff014ee60bf5b31ac4d49955a82e10833215bda869639724ff3e128b44d760ad3f35768adbf45323f46fe11c0a4013e9ff04f547dac004cab559d599732db7cbd01deb85c28e31b305bf0657ff3c3e82a8a9500bc50a584be5482f59a4bc13ac07ef48990b92bf84c0afa3b0086b6b1c88b48a6dfd91a3440f9a7197646924833463a7deecfc3247ea1aa204a4a7bf7219c6147d70407ecf513bf27de7efb149f86deaa0a6e5c0701fb21e549cfdbc2b3a059db46fb4753df5c0c62d17022b04fe02c528126bab6add93b74e3de0f2890f0a5e9025cdec73a8db438a8b26a29948728072b08323ef760c71d50627d285ffe1a697ce7a4c724a39bbbdcf7ce302e4406929a68250a4e5ddc0387c4bb6a5415da595d5f1306d0d4b47bddec71cfdf4ea3038473fa8912364afa58e398762b3de2d5564c44e8852906edca22d9a9888fa49340a56446c23f48658e8d4fb5996eab30dab12a5da92a420155d611180b1cac69e52d6cea01d8fbcf95e49b9eac70d354304ee4ca67c9af8d3b430525c1615c9acacf503ce30b09463b6eeb12fbbcada250531f5dba85f99f6f239881b21b7e3f857a727371fa616be045804eea1beef0ac128380eb302cee9681962d9d03a46dfd8a1b4f9d086b3d8ea0196e5a952f38fb245efa787e52f43e9bd971c526fffe044838a08a55446eaf2be5ba7707a39c9d98e89477caab9367a0b8278f57e65640eb19f46f0cdb67434bb24acdef7d2a7bd79d3ceccf1777f941cf3f1be05ab86c3fecc096a6db07373b7970277ca05c3ad2a65e35c50aa4d7267495d9f8a5a4b1a4bcbbc880f23a45a2f04114ea27e7be6f00196b3ead4754606c98f53673f9d7675b98734a679f67429cc580ee3353868dfad9858520e9d5e0e8d44e410245a0e9b1a020003d922ad93342bc51fd1fd61868a1a0cd3459f5b9cb4661712fbfd357d358b2f5e7e51c46a03a3374cab3992e8ff31bb2330c62a7d07295c3d99576d3cf6659110da618273449a7d14bc3b9a8e74b725ae1474418a914c5491c1037e3b1395d2316dbf037376616e1555748cad8827d0d57ee426954f41af947f4a5424b92431dc5ed548787d5198690162b7502581d06998bfc374b15c534a39ae9a753e4775cf4683977fa9890de50b2c6e128dec7a291025591bd645bc1dad28f74fa7d59e8aaac4e7ecdf30564c23608926f808188a0bf20ba942b5b62052c9a7bfb8017466b75edd4ee92755d7c377b2df3584cbc15be51dd5a0b4fbed0bc4427ff3ba40629faf1ec13a57b86f7378159f8685636dc013dc0b43ba0e7d6a52e4b3596c91d2dfb1257506a59a4a6d6b9f9347bd3a6e23183d4ed8e28359a7f91ad99f7de7cc1da95771838ec354a6cf1ed1e295d72c73dc17149f2d3979957cdf7196a01fece4f1f0e1c18f4ddb254b1cb1cc7b244a003ab66308087c5b3d717b8fb5e02d8405a66400a0d4e66305ffe5c0fb85f4ac55b3ec3a1945030c6386a5d21cd88b0d501368da89406a213ee532c4a0819fbd39cb99cacb7ed7a8e74c9785c5947f6fe4ac93b76f94978e248b1bd33c7e008b3f9dd10998dae01201161540532aee8c31de74645958b9e15518992ef341585ebf1a5e532b85a22c9c936e90962b5d5fc529c2d2e2421e46f15ca6284439841a492b53503487b1952622189e876e944bcfeb694838ed1596a942fe4ef14423b9f69b232e7f17d0c2e656afa185721b71658faf81b241b54ee9b577017834330bbb65c843f2fcf577d8f368a9ad4fb0a314d41d99a73943bf3c18211a62804baf23c4dba7f0017ed0793471c28c1ef20c6a8d09687b2faccd4e3fc12b4aa0e0e9c59ef03ff930f148cef8586c7447d918372a04db3d1294d231c7137cfb285af52c975dfa9f7b1667fb026fa2ab491fbba61ed42667f37b823fae2eaca4193f62ef331db685ee392893c8102edaa2f1bf8a8d05dafc805ff8dc4d443b41448be19b45d7d3164351b83f0e3baf9b84e123b1c635e0d178098c6068d3a2bb2dfac9366733cdaaf3f680d001b48171799e023d9496dafe912d8892c2539a4d7e4e75969fb4579c01dd0ec0c6d59fe73a2b725992d799d70aafa7427dd8143c15aa3f4bf6756342d3444a0c9e78de027090419ab6102d0cb15d644916205378d4f7b21628b5fcfcfcd7d2720cbd14361018e35aa9b2078148b029c489cdf4b917ad0d0c2e503935c0468bd76e51ff0fb20751cc0853989f862d2a51ff360c8421cb143e01026c301a02597469541d4e62e4ea8a0b568e24e3c87eed8b755e8db2f9ed3de1bf6499d38520760178c33fcb1b92ece6ccd7fc7d43eb73f8269885dcbc962509e92c5fde53999bb0cf35347f080772db1cfdaf4c253910f12dd06004ee8c81d2cde1c125da7c8325a299bb847694cdece449b6d17c7b27f964af73b7999bacead3c23efdd2a1e98396c358fcaea78d31baad6f93d0dea7acd0a6479d04dd3dd84141c223b527d2f4f7e56a0129ef2f018e5f3e1c3510ad0ff791fd3bb20fc876f399d7bf327fe843d73f80626970559afc437913d3baf09eda026de4f94cae7789718ae3638ece85429e95ed90a0e3df38640dd55e4aa49c899a3ea30efa57d404267e32217c0dc1ff7dbd76e8aa3bfbe77bc4986c4e650d06cc8dc0c2c9987742e6a57cf947e5d453ba338156f5c4a5a11a1a15dca3f7a0d0715f6f9332ea225be84c5dd9a0f3fbc90ad9ff0dcfbb2483b10a42152cd47670b93d056bc9439ed4cb2380d320d44d041c81d9ac885c70dac87d80dc1aa1bb33ae682debd8473c792dc70ba189ee83e58a129ae7c6912ba66c7b2696b08982f667de38a13a9e8e30466d33e74a6185a86ff54a6e693e3eaa015e19450c8d0355b2517c7fffc30f31bbf9668df2a61a2488b1ea69ce70e490d959c6b83ef3a5126a6d27050e3e1cc64c229b6d931efcff62c8fcdc4823db1817858656ecaf942af59825980f9f76571856c03832cf81ad74ae273ab4b218a22af0add381e862ae2ec3e11a2a0fd8ce395238f1355db6b4368cb38de2cf621c2fd17495b9c6b0b9d7f0c311f3e1f88a2721f8527e9ed7e13368c6ddb1bb9f5003d4f93e83b8fa36cf99f71ab03a70c642d2ef3539e272010ae4dd15f33e1ee9081d3a5c5d69ec605ae254549c2e6848b64900867aee2fd0e59602dc806c08f0b06f5a0c346c096bb7c63e8e4a6e8094a04e22d8718ac9c5d9e18dccb4c931cb62e1fbc147752c6b9b9969965c1f65c25fd9a98dc2687c21bdfaab2c3354252f230fc7ade5cfff94dd4ea076d2c72a83d0490a6c68a6e1afa66325eb83a6415c94c3b4b26ad9babb3612c916b85d4332cd31fd251293422735742db1f209c987205130a3fd2493827f7e3fe7c692d622ad2ec3bf1e5f1e2f3ec931d6e6584c0d3df8524325ea33acb92d24a1f3802c9517faf937fd3fbdb4fbb2dc986042729fb22b6b5b530916b3e0706cbb21837cd9a49a517dab8d27f25cb647b6122badf616e223ae96a9df9a667234e5d9848eb76e2007b92a201dc1102435d6369d2741d78d6e2c44087f6239fdc3780a61584f360ba45fb53d9ed27f4c3c954f484d1ea9db63e57a5ef3b1032f8c9d96f2286bc1325802fc305dba2e91ddf0f061d51b824d7418160a1b9d03a5c07c4f22d2f78b0c05364a8099a3ad90ea198b904ea4f376f88a39565d99e9af48d0cf7aec991a4b15d7a836616a83fd58207f797545b39c00280f913bc63dbe02dd794e2f77ea041f6717b51174d14c618c7173e9ddeaf6037fdd0856b11d3962cd6a71bb4b4b762df56c1864e9f5685d1c2763f77f535466bd11a15b5b922b5ac0c4ab8f81946e807113c765337572349260b349cbd9a4383a2bb02188107828565140a39f0e4328393b02087e5cf344c3ed9e3784784ebae0db6f6a92fca0e04700b153e219d373ce00b190ded04f91afa5689895cd57b5487b11168c9a5ed0bf1df28b04f561beb6a4680b4e99b7464f2c136cd745ef886a6e0a148f60a09726f08970b01d2d2cd292796b2f83d43db337a910df51f719e7c886c2841d6a6ac16d0bf804c929142f94c786999cf031de8a5e08f60b16631db2c3b54dd4aec38a980facbf78536004f04fbbb0aa2ebd8b826be699f69aed999ab7143cf25d77689d738a9dc788156a2e736bdca1840b772a59ef1a1f4ed82b0427137902e6370ed00d0ca1eae1416388fa150ebbe0cb09915348ebdf04568256e670ad3a4a1c4f45623abc1ec47497e6caf440667371fb2e141f3e4a0e0c2082b083708fb4b6613c0698305c53b530af62f3f0666d2383677d7912c2e188d6c50372521e16e7fd3ac4dca7d2949016e7fdce1e730d87474f42edc4424e13451ebb1c088dbdbdec265ca11c78cc74031ae0082c598533a191c003457e6ccca26ad81e15c0a9fd46d69c1e58aaf0186620ae857c3f05524c717b9a4a086c36d4edc1586f86fad7ac66c1c2cd10d3ec867258913be810522b7d08292b0a3c90edbc9c8ba6881a4302cb668e6b7008394f3a7a80ae8aa63d9e6b8b507cba72fed356910ac5998b323cc0d8fcc1bdf67530cee03948f36fd8968fdd4078f3a8a0b44390814de06cd9418d7d1947a0808cc94cfbec082193a1311119fd131b73049a668898c79a6e2ca0cb9818b7d6194769871af00c60375f6d592e9b7834105999f18a315859d891ef87b413c6f5c1fa6e6460a3f16c7c4181467700fa676d430eaac2f60d8eac0cbadf1c8bb684176d1005d725043ea914c5fdef14abadc8d4e4c6a68f2883d944a3b5e454b50749c3103f9644c5fd74b14e74a3568fe940e504cc9eb9b0c33a38f06e1917fca9e9d092c5da750d18c7f656cc3150868f842e6b23812f0a1fba327658c7d942a9674a97710987962f12443fcc9334fbb49e06002275d66ad9c7b6d772da957bfcd2d8d47a713f5b5910fd7b1e106a1a093004d0f087c79fb675d3318f7391022d738f506ed6d44fe1d11eb1ffad4da404811dfc51d57d35bb12b29db27d07367c4e4915cca3fddd9cea35bc284eddbfaecd7604dbd3a1a432f0d97840fbbaf9baf82e10cb6f08890e5d7557f49f972775526713542827e802591d809c175268a01dd217fe8f2b6ccb6dde466686d3338f93ff102cb31af4bf2a21d4e61be23bd9945d3fc407ea543b6396f3e216bc880afef3271a1e5b850b6324219964a4710e0f5bac9fd75ea82798362b84b52e609de1b057e98b042be6ab850a1fd50fad85387a89c6f4461e68ac49cb666c12dd912e6e19c4fbf0e815d610bcfbcfd2846ebaab6732ee169a256bd5be7a34b9d10e1a58eba69f64d9b159767f20f879aa258f26eca0e2b0cfae001fae8473853545d7814d3d102e0a6f4ae85f4ce545c35520d167f1ac47cec8fa38b7d80d3ff7a5caa2bb0b2380616b51a50d63348a913c2c2827a926a797bc22d1b54d428773a63d21119577a41464dd6ee1e3f940729c3cde6cd6bf78a58e94caacba25180e96c2cb64b3302e1ed45501e417724a9d52fba17c12150082a061c199bb76ce7d9c48884cd975f9415219e850495d6189651f5c931a8bb1b301b15060054187c2a3257fd4cb4c5daed89660f775695449ad572a1dd89d5932a58c01516b4acd3cd9dd311fbfab191afc8a325765607a3cedd50c724f41a401753e5c553caf31d61254ab40d4f44fad201b4f3c82adb7fc4351031e5c604bfa12170d66e660ec1f72a1482e28ef805725683e00740eba8332119f00981ef7934418aa0fc5e5937024a993cb3862807570481f422c5cd17b7fb3523c75e786f4b896e6bdc07160bcc50ad97795d86d9547a8156b206fdab2f4fec9e981df2738088017a840f8f01dec2100715f7d92bc0b39aa98b2bf1bd7383b4a78ca0d7f7d747fe45b18b5e9786bba45bb17ede9b974eb270eb8da06abeede102a404bd3330fcf660eb843d5bc7158a2de8c20f1db852c3855929dfe7395e3447cb98547aee4349ed53c045760ad0c334b9c994ed45e4ce836c65244abad523833d83bc6f642e1c0f49d3bd27e53a40a390a21294f863158a7971e70d48e6429bd775a4daf5c34e733441ce7115af3e34fe48f959bed923264c38dc02f2de8baf46e5a64986bd3b81a87ebb349638bb5c19acc4cb2dbc5e9d1ddd69d853efa97c8b13a4f0811360998f39abf29371710684402f5a9941f0b7f181804693f1e5c7df3dddcc6d75b0ed505e394326c78900158049029131a7bb93c6011b044b4f2b18efdcaec70542ab9401703bec341dc8b75db18c17fbdd4e3a361a39aee31ed39ac50ea90c0987332e48340bc842b007ad330b26c913dc4a46709e63fce31c04472dc98090e4a7a9bface87cce10455794ae8dcb1237201bfd5c28f01e1cc50e229ed8795ab7a6dc12bc8f75444e7090814e84d1918b30de41d389ecc07685db1918f193862cfa816b94470f2b20547296f16e4e5f1b90facc20f7fcbdbba284dfd67e30aac9f5d8c96eb2ae2af22f1514e6edb6615687e5a5d0f96b7c3c682ca619e66e58693ae2f4a4ce429d1ad0246981e1a75357d69ca8851c6572c0ab1f10a22625fe051ae5e4d6f1975d7632f39eccdf813235ddba91a18b9ce3aeb1218e745b3a23e480aa5af248fb82fac1553415c0aa9cf989396069063a654949aa6be9a2e74b4fa8319703537a962494809811a7c0fd0613853ebb445204e764b98026cf914943b1925373c3776c374737af4ebb68595abd69530b294c459c9b899f5bc2097c3b88f7c85bf9448bbb0c4264c15afdd008d90798e558af7c05688b7630fe68133f49146c3d16592e14ba796eef145a760dc6ceb26c46556505294dbf4205168ee8cc39ba33d6a95fdce7820044738ef6d7b4b65d1f90ebeb9e6481de63ae8f1bbb2ce23802ad40998606515b94d4b6bc80f02e9d1027d4c1a95274bcbf126d4bd1cd8bfeb238a4078bbb0e27b7e3723757ce9bca825ed92a97e46692859851d32beae0fc20c529ec0a8a7817c4a425e85e8aeb3f6641b71b46c5c6413c003737c553e59a93a85bc05a70b98bdb430a0bc39d292ac29b3aa75edcd904a203a30cc2c96f5d09b164f21457c4cc080dd0ef3ba42130107784f9200c87a0bf8f482868bd6346de6b9a6383f1935b24ee386e5621acb9eca73ae60c62fffd324cbe300e02fa652c04122fb3151704c5f4ee10808651e749ef244a3a2f79eaa3907eca72040adb0a0a22409397197b3913e3208beb87ce2ef165323ae6237acc4ec38d6a1f57f86f1a206dfa65e484c580d1531f4bd6561928ed2a4b62b26a2b0348c6ce66db3b14564cfdd6ad318a87cc0c58bfdabe8c0e366030c9c99969fa65c24324c55ea143f91a4e1fdd0c42de450c12c628ecb68b63d591f033cb6b8a91f99c726d87d2469ed2885ff1668eae18a6a40302fa04e8a3b4426dc3a6ee731c4af197416e5434a7ce72d5d1c792bb473e59bf6c1fe7fedaa5c408e704c5b713bb91d69ad15964468addf61941e76bb019b3586556fb2adb802a841ea82cfdacde9de718c6d8854601df55fb60705c866af4fa0c9964b11ade228ddf10c255a3445d4c221cfeaefca6f5d9d324f534c68438587a4160c95d7c55a952f01032f4b3ce4d73ec30983772fbcdb84f0e51924b24d6b3bd517090cb0b48a8605bbf153d68121597dfe8e20fa2e219f77831bd318651056b29f9c959b6778dc98b8c608082a5a4c6511db69ec8e53887b14995c104535a188bf8bee7bc85bd1747c4a7264fdaf1950fa4858286019e6fd2c7d0c7509fdea02c321f45e94be203b8c7c59f77abc4062d09428bfcced5dcdfed8d4a084bef5870a18f018dc4998f8694d5411ac5be294bb6b6821037895a2cc99c55a83a0befc7c8622c6a209cca6cd92dbae8327018021274a6ab972e5cd308b019f9810e72e37a396ec7a9388b6899e4de3d0402373183aa9465b955713d6b29c05b7e13812f9d9337fa4bd98fcb3a4fb4d650ef1c80b86f8c9da8e71f1df0991bd0fb58faeed02b49a68254bb84f76ec067ddc345ebfc938a88250262e86b351850a650d0f744510593b5f2918d965c91fa4104401f15068903078e0ad090164d7f410bce46d9454590c6f5e29631177908ece7ef88db6f0768fd82161da0e378afdb7f19d909e85599782730a5576292b7baf9ad32429c76be8beec90918a4dbaba91dc8d6de5e62f65c0699a9485b94008a706d0776b5bc00282d77a6caf9d7e769d6687311506ef100b03689b2eb9268268094663924043d3e99092ac2b22817f6c7d66ba3d0af07ba4a7bac2f3e7542a1679569c13be7dd2f5e0bc178d4321dcde1d32656b25be85da7d392e33e182e93f32d4e01475632aed582bfadc6630eaf415dcce37e6f54455bd995e82b9562a796702aff536659a2d65361548f6f5185f98a24e341b1375061c530c7d9fca62c9b7624e0321601950b50c30c2971af6ef286f716ad5aeb573794f713f38cbb7259815abb887ecd9293d62b50e8705713cd37497dd74d84115a865778bc61f5266042153be31b8cf15f31ca856b393471a5512e3a40a21c5209665a65e67bb8910b93cd021bf5dbec6f79a52dda151de1e319e82879587ddea9052000cc999ae99dc2c993d0ed0d8855f028dd282829127cacd8be24aa2c1ce67c190df6d41de7ce76269d19b74e0d846f49c26d0b53e2f02794fb4bea492a7a9c29c7c844ebb647a7c80b938c7728be37871d9b295d7c0b229224819ba866d7db3b568230c28ba911651588347671dfd0cdbb1afd88fa9f208a9076b4ac303d4c8f8477f24eac4841733bd07af9506eca8abfc7c99a7ae70e1f27cc53a368f3b54672cd692488179365427db23a22dcc6b10b9bbee6fea44ad6deabc62876334479c0ae48d99a960ade877ef44e8493bdcf9c5745fa395e0681a25ad731c3cb1bec65b8ac208a91c26af773344b91ae0980c34117c8aaa9a22ecd8c5976f692832ab7f896ca80980f23f95ceb919a417d429862123c196967225941e5631e573c53639ead533007900afc73cd535c9af08c316da0fe51b6e1aebb478300a1841d4d514b5f7ad6448819cd4dafd046b657e3f2dab1ebbf2a4ea17f0befdfa363d08c0c9868752726f0448a6535d5cb965420a14e461db1522befa980f099e17facfc43f57c0672de496f5d76290c8803c72896c3176986457bd7e2ce5821606518c0a38d21af81dbfb40fb9a1f864dc5df2ef847d57a8629a916c1a1666c2ee0849a63bedae2a92d1e5477cc4bcfd0cbc685aeba5628c81108a2baf8c3c0eba7d072691327534922c6a02ea621ac423be686413173e2bc4b3180371e142d5d4a4b8c618561d9cfdb9156255a0da33527a1c0c9401ab0a3a63f23c7f574acd3716b4fed3733509a6d6c2491d023b5dcd9c1f0b1646d5e790464787bf4be6dae20113c8d7ee2fd19855cd61976c2eb27bcae9be42145ec3383234fb6c3c762080f12f8c908d0b5281dd6d0381e4100dab0127d82cf5b1ea8796562b350af8e9716bff86ef1129486469ba2685c671fcc381a31b9665e588e79b2fe0fa9035035e4e40fbd05dc800cf996fcbb11d933ccf7a44bf795004a9d6e957b8e58a205ba83c1abfe3e46d248f01fd175a15410b8f00212bab1f57617ab80460e414d97107a8aa04bbbe988b6acf8e5f231bb2338fddc12cf52102360749903c076e7742837a34ba36b8109540cd6e46ae27b27dcb3a8c15181e7e159967eb013c58caddfe5569c44bec58ff0e02ad3474e7891956e4c7e30d61c9d13e21b5b51f7bb489ff15dc66d5df340dd0b7786346969aeb8a19fab6140c98c6829cde27f979d10c7740391969eaa7dc54d30c4f074216a8fed9691ae133a4dc400f8fd6050d51d2e30a532be33ca5eba3848e62374f98a4383c3cb8be0d4d0274adcfc1b73f7a9304516d746be8ef664864a7e2f40031900dc168a38156b680360242700bb95cae94b01a0fa0510954b80c0a070c538340c4480208e140518037c93a24a0623c76fa5b4436221a22d111c6eea8504cc109bb0c9f2858b51fad22111a3ad6e894204990045ebea43e86629366724152628641bfa9f41461595ce35d6db12102be5aa3e07248ebc6a955d36a40f23d0050a42225f9cf39b611bac354c13addaf6c3b4f078f4ab159b516267a9be49505664e480b1174fb1a673a079e5c13319d72d2c6a2dd81d685b60c8fd54634da93247eb07e5dc63ca8e69edc0f8fb306db11b9ea07ec87f34071f8f25748d4b5c8b9ee31a82fc5f660c9f0bbeac6a57af018c723e7f0f9ce9a023c4dc5d7af2b90ef6a750525f55f7b6b420f159664eb90d7cb337d4fce6452d0e438049ccd839a8b927142cc1ebfc4b18d577e1758bdf903e01b7cf6b1aa1ffccb6254de65608e3962a3290ff60ad5df7b98c9936df20683a55833037d0faa3146f1489cd2996830fa195b9b69d74b9c6c45e281b32148a6f94d3224775d6205e79b7916b6a1235b567f234c9030a610a20ec2f661b7c8904d7343582768b8b0ffb53a265672e9089f9fdf8a708f50fc30dfec143ec0f5336dce479461044b8f0f4e5b8aafd06b4c7f8ebaf77f1345e838415b94de0b273150d3ebd635590ebe7a289efdd9d865228c29ed2e85dd0cfb148a650623fa293341b9bd1f8cda844aa969aa48e94d986a49cf1f936c18552492b5358cc9e88d69b6ad336bf66214e284ac884bf8e7879c64b2201e3dd8e376e20ca651b0260ef98843531b6c4ba0a4abce08115fcea63fb4c7cf951c4cbe3739514f997bb3ae92463333448ef301caa8780f3f5c5147d851088d431b35ed92f43dae73eb0061b3cb2f207f5d7c1076b881f95d3c055703f41bd0f630619cde2095a1e6f989aa7c2244000dc9dd209b5e8e885219feb27dcc2a900ed1c1c9a3f65b2ae3299595653b9ce822a0c9af19a458270a534003705e9643758aa0048a3e6239f44e6e4d12a1f03ea21e3c58aeaeaffeb03407cdb2b004ee6f273826cf8e1693c40ff7feec1968c0c2dd90b61c082f17b436567842e5a0414d73bb78c62aa3f849d885870102ee8b862813e6a0174ecb5aa7d150254758db38c67b3c8ce3a96c845c3077e3b28fb50d1426fa3897c6f09828187f588c6ed09dc10c613810c642e02023b0ff050d3ff1e206638b106d1484f04fd0175ff40957036544e33a9c2012392aa2f3ac29bd42782265a08af66fa5611b71d4ebdf4e005aacf016c24198738c99a5c3f781521e796870e467ad0136f1f33fd4299ef101939022b5ea62f595bd58a6ae93731b6f0bc2dcc0cb5c55fb2c4c131b830b6bba1a085decfe78a03e9e5e2feb33eb3970adfa659a5a8d07881b6cc6f250f8c54a258e13158e945067df27249b220deac2dbfe29dceef0e1eb5d7e3baf120d1db540c070826f71311a16ed100badfbf13a1d9c2fd4142b7fa66e2e09f1024b19566a0e17a66e8a6f68641d0802fcb451f25388332e2a87a3dedb35aa0818a05f808af2ece500911d166ced27ca994cc3cf47a32df31081056d5eb96ca3e077d83d6e7408d8e184ca076f5b826ec4697f21bf9d9b8eb5807fb430b453f5f3742611a94c9bcee11f1b821882b45af0606522999e3bf714b379332537bbefe46a98a8371f3634fea7a61836bf7ab050b7d5fb6568c5bd5bc84d7a1a708c6a7c31bfa2e4bf199138ef80112521fa265bd445121d3dc62ad9b88af72df1604360332101d457973550dfb92f4d4acacee41a88d7990fa947e09cd6dc26d448844977c230c73622a59cc6d660db5fe5e3a3beb9e12b0db0a6914bb5b788bd6425d564bf95fb12f7c3d2d404018b7f686b29f679815341a058683199f1a9bd55d7500b8b94d8c8faff4a9832331bf4f989839d37fedf34f0f1c885cd08b20b30358906bf8bf0addf07a05572228ef6d5321fe17b8bd45119f76fce6fbc8208f04c37fda22c88c6dd8bd74ca4055b78f0f84922c0e40180c5fecf61d8c1d92b46f3b250cf28870b9f0a4e4f447f1c8abdcc6adfa4aae76df26047257aa60d7987257badc87e751e543e34d3da0b6abaa579635a2494a78741dacea5f2b192f2e34d6f5c5360c9d4c211e6cc05ccc7e3f4891aedab198cd7ae1831411844b9cf7b22225ef712f3805cca9463f03a70c00f0053b0a6b40ac95db0b2fb801e4b66e5dbd1c697a4f43de25655856e3907414d2dac8ba71c1fe08581ead1cf33a0d4606cfc29f75b7300916123d2cdc103ab9bee6b8a1ff0f177451d11023e5aec46537feb75d7831f25e3f2bc3078fc6d1c70fd73bf89363f6c22d4ef2b4c4701a378ec919a3c8d70cee3d6e71523e94290fc3fc537cd1cb5c366e1cdad9cf1e953f5da601754f602f95cfd0e34a85dccbe99b2c4b1af7a99c47ddf5d87d6fd427cda8dd43385fcc0b02237b477b7d35c84cdc2b48918baae5011cb381b1b7c874defc9dcc5e6a1f3ae4f03f785e0eb134e94e3459728dd435fba0bea6ba7722f039e4d5ab16950364951d61da1f91d76af65145363eb93f37155a6a4d554c7f128b04d2e4979816870fec3283e342e3b6f8229f1134e788b907520836adb838b8bf3c59467bb1fadd761cf2fef0a2452afb138acb8068a4de0bcb980b84f49d27af28b11def275c16bdc05b60a0ddeabab306fc354e617d5e81ce80e178c4e69132f7e0b54d56e80e443bf9504b6e393b99915d171f5868636515738dbc823b3a0bae008dd7fb6847930c89ef04c9f18c61dfc6a6bb3f1485b92d3358f74e78a11e00f6c5089f2ff97f9ff6c0f9714000ad85cfb73b50846b77474877dea4d00125c23b8f13f82b79b8773e11132061e0aec14c33fecee72471421103062f7e4828d7269e238cc0f521046abd73dcb57ace5244292b252115811274802579e710e84f8a406dd249681aa77837f83c82d667bdd190e061601a19b66181d8a2e716f2453aae021e5499e71ce7220d6072a801bbbbadc9c648d9680ae3d7e5d89690ec3c33c0009e32474628832c2fdf8eb2c76c8b189d578a40eb9c61d8fcf3aa2524593a1acf9e0d59da1796ec567ae236e3b0afcec71a176d4538f3aba37865a56ccd02bed66ee76abb02c5f71c8958f0bb25786d5b84964a0169a065873d658d410f07b5d324d59e432e52ad7cdf23d5d2a2f2f146b108ced1b21fb0ba71e38b9c314a1c57051ae18d5614b0e4e2ab4458e74851a32cf75daf637fe8ea0bd33139b82c6c141caa423e5d04acd7fe369244adb246d771ad5d93cfd0e65e90cf8bc854de524622f918aa10e1ff818a70741bfc0542b8525b403b7b790680a2bb4545a5d6295517575f8c016914c79a428c776663220643928873a7502290e0f40471b60d2547b10ea8a7e081aece5ed3bfb53108124ecde6e7aecb1526448a36e116f4d040161ae3666b1b3ee82bbd1f6821332bf46a11c051db72c6c0e1128323b1ecdde01300ef58145b360f0d873bda069ddffc0bbce4cbc0bff6b267044920308583d527c36d034b91494307c187d86c91925c92a6a000ca92fcaa14d50deac86b72f7dc2e4356e006d0aa06b547f6d344d2a36534830ec764d19117e212bfaf396fe88f9dddaf30f1c22852966947fba363a581ab4c5f52904a06da57dc92417811afc641de7e014c010e579628e6463d14405a83b56d494464885fe5726df145d008a80106fdf499cab42f256f2f70aab01a97a2e044307a4f0dbf23d07ff60ad29bfaebc804c0651077bbd1532a08e4aeaeea22157925d9794074f15c245030825a034191d022bc6a2002ac54d794deb4f6bcc1fa492cbe460343c032febdf070ff28b46134c16bd0f713c6b45730185906adbef13310bd2ef6519e9a5d5e7b56b8cf4f0cbe18769e3250a62594be039297509b9398e2a01e1822729bf05efd02ba829a33225fd89ad4f040b7ae5f92badbd2c7eed7213fa0633d43bb27e8726ff1a93599f1102bc1347301c1009d00a56788fbd73689367da5859a8a8c1ac0dd96f8f5ceaad89468702a67dff410409268150ea9d81855855fbd01cc2822b59eb1c7d8735410b65d299525c570ab56c11246faa84670ac4aa4631b33bf07721cd03e3d2cadbfcd877201a30266ac3124dc019c3e8e7ff5c566c28e4830de6a9b45313587f4a0455c1c33eeca2a0aef7ce3534f7033925cc82e66626838a53e84d05fc86b1dac1741c0338e089664c357e8539a9145284b48ba53b83eaa6428d031e065ae64867445f63208bc0a6eff9418b9c511ff9f4e9a32820ed871867e5619c8d94cc107a7a5671b88c81f9942c85e145e4a8b110701b9cb25841628dd154b1106076d89b0b032be95ccab12a1550106c9e10df08c3103f717678075764f3a234333cf7ec5cbc4aa611256276dae3a63bfaa23b445c0a856d8240dd84e5972a3907b80ffe6254bda820f19b194f73aeb60f042f26e86ca626ef8920f81ac1a17185aac448341268c692bee8c4b15ed8f1a5a5acb547c219945e6afb6f02e83e0ef05f7f5f2f0202800e4287219689c66523d4cfc1872070110cdc976008c94b3476c5995ccd9a5afec1322b04dee56ac03b7f01782901e6ae3d4fe1ead6330db934eeecdff2e81c202d21611fef0e682d822fa3aa84b08a44550af70a3a9eb69ec61c6b042f5dbf1f59895800116a052cb1536d44f05c29b0bccf7046189e8dfad60fa49e8371488380649d28d730ac4c54d2d7fd6ee182ae691c4ecd2f2ea729f1c303205ae1c010638ec63ce8bb45905a477273732eafd44c10c8a72aee55fa1bcca0ddb2c21b9bd57c98e86c81c4698641ec32d58d8d089aca6ad2ffa244373d339e7a3071f29d753d90f5d2a82fb2f621cc2dfa46479a46b3720dd238b5e0305e264d4cdbaa65f7df13d26cdacf957f2872b6a7a43d60b06c29ea6753a0a9a957c227d63c4608c20dd8ecedfe20ca42cc2e224303b360ebb768e9d6667fc81ade3041dbbbd0103fa92bd6af20c59dc41e812a0909b140ed6447ab0e05a2908e82b7e1fc9eb60d37407c3a962774fe976e22033b2e3f9e012398bb9e9c72164367b8e0bd0f4dbd8faa31c124edef13e3d181821d8f863fb04a76158f044489096704985aca12587fb310286d390d96fab15837289d91a8b81096796457558480919dba05caab20f839241803e144c10b3826fc4cc84dc238616c9cd86588134c30cd500d575fb9f84fc501d0e2ca371215deaeca75b44a0500f0479d5d56b0ceb20040976d6f0d8ed0075c9c45609f7f4eaa8a80f5de5207853921a83582855e8fd3e8864e3bf21293c0050e982709a20ed32a729227b0c18d7572f30ff510a910128fe993cbf8dc1d86d0427b2b274e1cd902b8b6a9054698fa040f6c127cbbea131944a94502203588ed01b5431e0ff78213b8239f334e93110463daed1bea0d4fd88f702bfe8ed1888888703a07479014fe88042414247fb72a13f1d2ce64c9bb250399344b536710c1548e2b0eddfc809dd8119415864bc3f1b409d34dac0931971ebc3fdeff717682afe05fe1a2403b89a055bb561e7dc164177328d27d86c11921963b3e03fc5910cf29b76b8cab120783f14b737c3fe6445cd310c7de2b0be712d2c3626114565a7d0839055cc9d0697022c745f32706a8079b745279607dedcfb090653218e2f16b3f7a70f820a5129ebe7f52f2291e4703cfae064778cb13be36f5090d7d76e2348b17dc5b9bac25d6b00fbbaffde04ff1dfe270ea6ede8a6a7b799d1765c081eb3559e693fe36c2297d6875f198a56b1e3bafa33cefd192c4a91b0d85762c7a51793e25d8924c80f328c42edfbc40e1a15b0a35e4181f042c4a4231682f8e88a5aae28ef196bea40c46182a65877b456de0878950b94adb7844a5b9bd27f0a4e81700e6b1e872b650139b8b8dc0af58cc300388060f252fddcab97dda109a86d7001697f6a3b6612ba5c2e204bd1ba7c2693c0af921e2ad285b3b311fb5f44c29e356d109309341e705569b111ae13025f2fdee98770e37c37592b4d70d6511fbe7d2c446b281c6cecb1d83166f39d31b39682a9c7ca114ffc5c26be3c7d4c82a4075b38babc07be963e8ea1d06c20187839808105777a1783cf32470fd528148a417b255d5e10e4c2b5f25fd12254a9684d9f1375749ee0de5a4061b905931ae269e4b2db1bce13dc47fa008b13cdd63b21e7f1c2abe7e8d0bcb10f89feacf46340a5cc4e9b162223de007c31f2a70147b0773f256046cc66e97fbbb86da512f414f4d31dc20296e5bd2c064cd5d28719ad08b87d8eaa5f99cf132d465aebb916fab3e098001f70100acc7340453421f405f4534f174b9630e1b5476c6c8ecb6c6de7676a64b686276dbedd08394f81cf6dcdeb84d850b61c191723a40530e78a8cbf9d27328cc7acfc4586952ee0ad7c9adf867fd46cd03bd236030893e57138c73a88a8299b2edc05420845245f78888f25095752197d820c306cb42b0087ad55fc646bc318e949870901b8017f47f49510cf782603bba52a09a8a948614e086d723e9b1bd6e2649bae15ba66a29ad7173f19d1477f3ba8531dce0754c95009fa806f377921053c24a0f612598f1da56e2d3e51c3a0857582a40136ad4570e3a617f51a93a365d9a908c9f545eb589b584d0d832d69556f10081ec1745cc9daee2da686e15d0dfb04f736d453c32a3c9ac2cf6258a79a84984be5bfc0abb2f1548297bdded19957dfe207907042e75d51e00096bf5629547258884a91ecd7f7275fec6c7bdab976fd416c1bbc808350d3a693caec0b3f865c41aba1437239f4eb3b1c0c0ec109bad46337630415239b5b932001f6474a141500ce0e9e67282e6761dba9a0b6ccdf0af3ccb937fc801e639c3bc46537308364e7f1e5b667343970ced291c1057e51e9fbbc0005390bce1661d3afcf972e4a473bd184a1cb900201884a2b11613801e6764b1e073231f94a6c9fbd44cb1576583153c1d5a58c67f9e15b8944eb304fc2cdcc2df30150c8e08ba23845553f4f6cc807b0daa35671f53040e17d09dae4aa1881409fc51fe58de2001f18a7393a9bd642b2501a4d0aad71aa0f96c4cbcef7af34e402abb1d00764b3c90064644d820eef22b72251a7eb89d4da2eb0ca97c5e4bd954cc0ad5e8b3bc2a961f60e087095b1947f5517a7dc331347207c5edf228474c3695cbd65042b0a46da07061a58466301196693919603cb535505e74c49c01f58749ad53b61f63401884be77d606b940c01490074cc093cc59e237546fe8715eaa69288f0f7ec27a7768fa3aa634077e1bcebf64102818dd675bf4722e095a8a906bccf1026c2c56476698ceba92525e2c076fc0ba86d0f59daee86dd880a2010d576f5f61fd19bec6f0d7cc65d8fbbc3cc2eaf4af6a1f39884e5a0af0b9567c459f24c61bbf92bba2b9ac31483938f8b81f4dabd4927dc6804f84ce7121811362992283192253892200be22998a648c0d9405623c2d5442c515cc6dfe7484e66d9bbe9f34b8490c6b32ac222143deed0d1a2e9bf814a3aae783eff399e6712c11af8d907182642bb6c9a80805393447c765559ed7f7f126a7c1b595d02647f1f2c5c4e05cbebf0dec13d1c10e0157901abfe3aec99b3bc42f1752ffb1456b983488abbc725130a08cf11f5d21af47111f750a163d52d216ae8665ccc7c767d80ee80fd295cc41df2c37f983cc4dfefc423d3f502bc1ed7e10ff0cc481d71170f9a18bc73a1b5ed102274ec2364e8c34c5b2f84f878ef821281e6c9546a9109db2878bde5128c4b157c6d32f553417429051224c73159131e152e5ba65f7c1e06bd074094cc704111a6916968402402b1d1ae358c9c6011cdf2d4520f03ce99b866a482f563ab7b54a2bb677f7f390233ecff8785db148e9cd20641220dafb7c52456e4e3789433447c736a53824402a6b25bb1d7d215abebce6f77245bb0b0edc399eb7d19043d98b0522ceb71a27b846b0b0a8782f71d3b4dabb74028e2764dbc81cf3d0522c5dd7233feec3293114672a350d1a15d2c8133cc47392599a0c36e792f914bd424e45a5a3f938b8d7a81fc2f6fd18b2a8b75b57b10b0f890c46924e0942ba121853b5ec155a26c2fc30727766b9c25a0c4c7200d334b3e043bd7b4553ff89488f0ade705cfa8d5e0ab0c136ac34fe4739a2d686170bf9ab6b9bae6a0c9d3a7df3c5340a59184d66dbec882306a1352837a3c3315c63628f56551c8bab2015a5956fbb74a608ea36edba74270bd9a864a47e83aa8d9e4a03e7166abfa718a17b7a61a8c741e3378d962b42e4ce052eaceea7a5fcac2d8d8d7241fa30e861f85afe42f07d791d8e487dcff22392fc8ec05cf7e52427bbf240b7bf8682f5bfbe611ba65dd57e456dbd07d8af2bd5ca5dc977ca95a28e62004b55c095825451b742adbbe5609a2e00c608f78a9f839b9225b1cac0e752d0ab748ed9ba47a3116e01056e9fb75cf48c24576a7156cfa29fd65ecae94e08742bbbc611e262d1345fdc1fc635125183978250c56c05b3951d281e871d0db8a55683c184bd5a0c4f923e4f6a328eca6e5430e1a6a87a265f8e92ab2af9ed7ad76c868ffbd0a0e53d00f56b2b0afaf9da62bb586974408ffc4f44eadc6e5c33fffb861e038cdb71a6b61382d22341a920c700337c69ed5981407e3dd90250b0f9d9c12e404c9792a6bbb29d887a8c54ee13256198b670baef0fe9538cc326245b42a1d563a0298f61d5b3ccb7a5a805dc12400e562a0f62e1d757444e890337bea3b9333b823af1e4f5d3f90cce296245b40b4d22af28bf0f867ecc74ff45b8fded05b234a70e9c2ae092214e2da79f4b49244761c96ec67ae8ec224580ce275d8cb5d1c3ae64099f01fb6b548f6cf00990b4c1c09a373073c06bd94aa255163a546d3ae1fdd7c66476250c99e4b722b17b9b0f3d1df70cd71bed9a4973483d716eed4e0c0448b1e02877d5a7a2712a3be4063409cf4c0ae73ad85d406c7b17a5c19cde4f8beafd8f47d2ecd342f5ca169c94a677473a1194b346ff3b3d9322869727becb528a95c9a93ab8b36528d07640b593bacf66dcd1666e6cac8804b9b04bf542efcfcc6d24897db371ae74f36926d9de5136234d6e32534f3f193b85d39aee26dadecdbc83ee29d769f442442211de1ccb5486ccf47935fe78f64718649efd64eda3e26d5830241e7c04a9586e6f73f362f80bee42f0803303c141ba63a6ce965c993561db695a1e682cdda72dfd3b2bc58e068fe57aef48414551c024dabbc611e2254044d7fc8f92369ddfc8aaa260088270f1432c4e8e5ac458a5b400c840e16b06c6787950ab2975970f29fb98ca0ec8156e7756f9e5c32616d1188c4ea836fd59d34f2882c32b5ee209a56f296ac67cfd83cc0e4fea999d47b1b21ebc7584e00cc15ae195214bc2e7d337e3a9990d0b32b43d3057876bb81b632c471eb8ea2d688f3635c00055664942a49f16863018785a68d7974f843ff67d5fe7f18a896549163742bbbc45baa5854982e18b2a6dc8a82503afb9e397c85103d4e37e6c4201120e6bf89bbda902487d405ea74b481df8dbf2777abe4a38407094468508e5fdd49b6ef10efc95e02501585197a2cd4c4f4f722a113c23d4d08cd7cb78b49a2b91e002ffdaf9f3c1729242fa6269725a5c94bdc2a3031462502244dda5506c0914ffd8cc0d2c9f1d448807d28257cbab1edbd93ce6b4f7a1db2e2b630b28f2ee14fd21e53d89587073c9e49ba2a4868f11ddef054e1b38e23c3c97d93bad23b3c4be6ac14339057061e4e67e599e7627cb892bbfd10189fd6a1f44232cb03fe6eec19e622550d1fb3ef77607c15c446caa1bddd12b0e115dbf5cd9f0fc69830efb6dbf4c2a48c8239bb60ae2ef4d27cace65298433aa81e64b615f727268e656d4a91fa6ee18b66acadfade271937c43d5f4df925c1aeba18d6eb14f82e38036c2cd22a031f0d102e52c053b09bfdc77da58ef4ad23728120a9a4895006403a5c73ddc103482cdebd700aa2f55ea92ba34c22f73cf09468347fc5b5505741eeb44ac062eba7665f791a4bb8088b69444185d648188a08ddf3a004b67e415393e2ff07de4f3f1d20a78e61cb80907b40d32cc6afc9cdd56b8bae65385f2e4409e053313960795151edf8b98baac1691b7f2056b60e8dbb7d28e5ac544a787d0574c2ceb5ec0281647220a640efc4aaf1473c68e78da17b0c136e5e81d2f61528fc05607c4d2effd7ea591d6415b3c83390c4efd9084da16947c2672f494a5a1729e03206965a358f9fabe00088376c99dfb1c78592c43983520f5c36cce714433680a639c6e050eb96433d1731a4047344e055155b27b058bb5370ee49f0c4d2bb6f162b70a47e147d4237794989f1791ff940ab3b9daf7f7789acde31fc20b4eb9f5ab216ee8dbed1cec6859d38c4e4d1d0256078524be302884b01c7b907d72ee222f09fd237d54e2cdfe3a9dbc0da6595674bb2301045ef324f60f4c4663d7154eb101258615ccc9d29b927380337e9a05752a9b3f5df893798e4567fb2e85848a2f0863fbfc75ba1df09a09c1c7925495109ec360756b26dc1b1c811a60f2923e21c30280a145176332386165e49709622ae8b0ccbbca36ca0a1a6a3b0a692885a7e2679cae4e39699c4926af0d8c27ccd69ec44ab9e81a17a51636f2b041a62fea15c988fd3a9b3e5ace342a9376b221b3e6906fd567a8a3f7163241c4d5188beddd7aff489304aa5936f25f1291586347d79c50d412febc03c31d7d8224949b8a5c0eb8a2fcc12a42f1c7a90d0460efd84df606e4605dc569ae305d7c6bc5d8fd5adfb343303a020b267c56d8f5bebe57e316f8abd3b69add1a9268e5a8ffa24916062c5a9fd10e6b26a4cd74814e390d284a71bbcb44f1239ce3aa5c315633fb46aa2482cb8e4a32424896c456e7809568acd6d4bf0cc6ef89b6566c636d8c8fdaa89bdfd2d09ec24910df8a85ab624a2f28c89dd84013739815e902846a5d1e1c3287483e545889cca22b947297a5dae3ef218b1e7fa7e95487df79ca0c49d1410391429b0162b81d2992ee6af6c46a4db1328814d64974412479d5228feea4a69d0f5f1acf18914a4ca5562e9993f4ef8e1dc332ad7cf503e7060b250400bbdf916ba2076eee36b543272955ce07ba96ce0887c84be0b0c7dbc3b66512ee8de9ed4c79c00bf8ef772d81299df68716fd21a1c38557bbce80e9a114b831b1d14bd66d2a8325cd6f18dd52adf1614a6f6ff5f28cd3b007312d3a8ca8c3e8d23c6496006e6aebc06477112690448980d447a9f003102f8c746c0823d7d136f49a0d86cbcceddf092d6e461449142c98036a1b98053e4dd237919e5ce0fa5ab06cef68acc802cb0d7711d5b1a582131fd38ed580e98965f9fee90401015a38d61ad7c702484225e2779375b5c49a28a8e9b19128fe023407f740e52c1f3bd67abebac165a181a3d2072666f15970bd5daf93383c375fea1864e3d14348f07f7f3e020d71ddb74a86f51870e313382ff7d48018298f42307974df04ce845bb1c0caf618433de5143c517a1585a8f52af3e9c90c9b1026ff7daa4a6a43fb42f89502de936f6d519faa553181bf237f4c8af81d5a98c2c72d8c8ac6211d59f675c109f2f6e7ee1feb45615747bc0b8c89c895678048b79c2a7fc1bb858ea085336feeb17884ab3a7434998bc99e9206b48acd8fb0714d15a1e0be6802369f616860ef4417308d88ff6d2397b733b07bcd0b69df0f8ba69ad0fa9466c11ab3edc23e9926156a2d1ac94b673313e739f3e1a68c278b4a4c2557a3186683883103a8844ce01ad5515358aaa25f13ef37c1a64d892e8650f0fc819af8bb1a7244e2f6ef4492fbe1468b055a8febecb59038a9f5ffee08b6b68e9fc94f4e61ed8f08ddec2c317bb9666e8fd8269edf5c1162b40a41e54ca01c28df58de65fb667e5abc0677cb3be337eb698eeb18b130409bfed1ecac8e6624205d863bd60a8572fa21d3d8142b1b690f7fcf66caac43ed4acfacbbce9edfdc0c9ed7de8acc6199374573b098373c0165ff58587d2ee3205acff31f0d04be4bb3188008e277c318911c8f50b6dcadb01bee9363e8568821608f060d6589935a52a8dcc980ae5b297db25d5d881c0d16ed227f3eed7b4fe8589bf1f03d1a02c89f30a6f46a0c5cfdff494ece88ed75e1d00f7f13495d7d25eaa60838435508837a9019406e6e2e0b5c0ce9291540946437828edd795220dbe189d023707f5be3f8bc74d059d2fc2e4609f3850af5a05400c94e05bdd991b96574d8c3312ee0da39345d323b657d18fa37cd073d4eabf813813842025c00b6e8fcb523402a76e8f85e90029203cae631ce20bc6b8b8c0c839d8392990c4e8a8d8124efb885229c674b3ae2fdb5e55c09d41e2fc57ab482d51958ea6bb00fd0806bd43dc573cf5119cb90179fbd161f3fa3b63f49b4be3935aa79cbb75dc539d5af3e2af9f7aa6e2caa3cd7ebf73b36ff0329ef6b1ef709aa4f0c6bc80fab16161920bbcb47317bbf9ca447086e3029dc04d6af619745e0e9b5352ea7b45d4635602f38433c02d22b102b511e34acb110ba50c8407aad88147a8a74b4563c3fd8009593e73800fb2ca621bbb007ec598768c08ff0018e207467d7c75767764d6de783b54622530a288213d5f246c05cce42ade08430c83da7f663dd8cef4537bc1de491e7769c317a2840b0215ea11e49868b8fa85c5968596290069abe93d765d2bd0df35f3ac54420cc566093c3f8604ff560c6617c49e260dde750b23068685e24f38d4a625a0854e00a4f8f4c372099bd8cf4053a3139641ee2f4e0da829f582a0342e3d2f4c44daa549335739f041529d98da68b39157b9f28374d8024f7782df9709bd611251d87aeb994486e32299745568dcac4f71b8fa52dd3f7bdbd699310402a60389a98e87f8408825d1afe8d328db9e427b0a8cac7012264354c0417b6f79bde79fc245d064782bd945badf6a55c5bc28b4a7f423e07213fdb82f922dbd739bc76d3274dfe9e01070620b85de0ab1caab50adf8878a65c14fc8477ad21b521dc96428ee1189cd957341dd71da6fdb5cd8e2ccc6adc6d4b938de3ea8d5ab9b4a68650bbc0c39af4c4672eb3fb7bd6504ec855dd2bd70a56ee173b9ac60013a401c9df8aa9f1d5cdf6dcc68d01b5363e219f6b270d23ad3e6fa5c0fd92f2a5ced1b5761c02bb5119d718a700362b57087f951eca2a4dbfe6fdd400de0f35a8b00d07097a49af69c9d274cd430407ce43633c9198f0356f43549b8a1b1ef7ec8bf59825db09da1e2543c812467e1a052cf9385827980512f74baf8e99b26c25dd187ca65bee1457841a1ce666efae8174c3ec8260b51cfdac0869700355dbc6b2340f4e3297217d60727af370fa53749fad8e6be5f1d2ef46021285075fa2850ae7aba1c58361297bb00224d5ceed734dfb55c5024939b6e151de9d58449babd151eacc749ed4ce8d72ce6ee4ac744981e7cd7d4d5190ddda336a7d4003b91deda494d709c05e966ab61bab20cd94240c65aecd9ea83fcd5c8848410c2ecd3846d8aa74c0d6607255760d469c617dc5a7f1a56cf012fd5ba6236286a5f25015240a7dae59e2631e8b8e45695749b7fc439f5ce9e506dfb7fdc0f8b641a24ffa04ad588aa06341ac803d581998c7e9f043140ee45c49a5fea13837acf628272dfa2e3725b22dc68447b6f3417dda8b6c18c0c841e9d51d2ed9902cf8791d86f0b02d36562901d8f2bd94de5e8dc42a1519ed79faed024f37d5b594a99e88475e8e696f331a8bb11b3b08ca3c9c83bea8e9317c6bbca50ac8af5895695ca0aeed4c0e46251fbb42c4c2b443859ab7651c485b6b5c0fcd2522013d6c67a71aa2f694cf8181210080d17ba2d09350b247f1542733da1340e71307e3e65455d919be39b1c0c89a706abe4c9071d4264260b0741ecb171f50ecb4c7af719725c814f3b659540dfcc81635ce002a881953e73ae820a3f619735acd5563317c9ca2c9cfdc6f1186cbc0f3a0049da9a48251ec4a0a0f184a94f284c4dc81775ff80b7393d55a9c9718048906ee3cbfbe4afa98d04dacf34c1f6ae8178a1dcf4dc506302a47db215f41c6882fae30ffcd4895c1fc29eea0ab4f1e408ee524238fb89fee159a4b4689c93bcc996bb84101e2ae384357ba12ea0a385ee8d732cba454e2e2a228fac4f00885ddfc8ec6b41b71751f54aad450c9d3b579053fc5e2ca63e9e218670d03ae611b95ad2e0ce99d121e838e8da19b4661891e1dae187acb65e9e736a933a69a2007d99d0800d4f8d80c99bc0104f82cdeb74e5d87266f338620375ea0eaece3e8f0c947bb03c242812390ce5dba87233a5616c6ce4a4511b521ba01a94df9d09b4797cc31618fd31a6f580b459abbf2b85a9cea7df23f83c7b7c1022906e3f1c732c55892a1c05913dd8a3f978479199306af9909094559ceccbbc9b478b803da226014acdb0f7916cea6a3ac8cc245521a55b43dbe88869635a32d3e888c2ed31e57e7ca58674f04a0f0c84b2b44b2ed303fcbc786f5a87ef621f54fa3ce627b43f9ba507118ed287fadd4a8c178157eda2bceaa382ed7d0fa34540f59398f6e5383839dadf0b48894c20ed87b7ee5860042244329e4c808ce5e415e5544f36e6519634ea9cb989404966d58ff9abdc6c1bcb192efbf8644daf695f67126e35bf7044338a521e6043e3ccefb4a532e0edebb2afe324fc5b881435e8aba566e074a63a80405365498bdafa7d65224dc872369d3303ed1990b663c7c121d982954b72d01eb2f0ed1758c33e128de63fd98ad21ef4d3de721718ed38b7da63c2213c504585a86d26f4d9078d8e3a0c2955720104ea0cda5e0b2e17509313d95e4b6c0178e7b1099521d60e2a0ca77dbc45267d0505c18ad7bf06fffa50b9719fb06ec1570abd83112420b56d8369932564bec6ea213653f0b3fffd3653a67384096945d6ce04b20f045d231b2137740d1b446251bb59a77ed0f6db23c5810e716901eae9d66d09517edcafd61d6bab50649d469bad4a12eb7ca782c47f4e17d91c357682b01613cadd94d3be5b12ceb853f5cf90bb4388244f5b4e27ffdd5b8ab7e1846c42b03a65b95ea8dac8af66cc8a5e03ab523fa8f9ef7a3bfff729685e6d01f2e1a8938b46671fcffa88036e3d8ce186f7dfd5f6ad653c5090b1c6b05cdec584a9ff3e2dd854986c3dfa8f96d815bd065294ca7fd73ac85bd28abb277f003c4a674fc09c0df03827755d81ca4bbc36fe40b34385e09a147cbd88f4591018c6f3a05581a978dd576e92cfa163c07ff09c03403d0ab6df6edc01d1a99a77b8e9f5e7ae2c3fa022035e545ed8b272cb1c61417dafadbbb6c90aabdb0b71b04216ad1af0fc25e295400c5128d3319be35145e22de31f8d1af06eafc8416f8dc7bdabff8cc27709b3a82c164eebdaece5ed7697860f9a208b4df0d2d4878de9ba80a7fb4d19d42a24a8da5efa11bf4b9ea2c87743c06333f05402ff0d3c46d35a893683e0f42338cacc3794820018585e55eefbe0da44c26e327a0a231a7d3b0202a6e3b6c0023da06519d3f460356ea1201e45bfb04b0155db5a9a6ddf9fed77c31b111b4cbcfbae3de8815786ed0b5a5dd1e5137469562f46e83c69a7b2fe48c652c50a8d989c7324f9692319cf31701336e86e9cb1c2dae7d49838f4bf155a563ce1995b22499f63ba1095b9d11abcb05581a963158c5cdf7ecbcaaa967a478933931ca640100faad509c258d287a80015961659c9fd6998a256c7cafee841ee0d07d71a118b583f4e5a72b9c741fc7569a51bf22b2b5629364ae0c30be3761ce0d19de88af904654cacd8016fc23a1f263e5563f39444302dd93f3215f707c437b886850b14afdf5907783a5c6463719a77ed6bd262e766b5b962f2655c336de6e2ce619299a26f38c01f3db9181d50f6050f50513c029d1803300345b732c5ad8933137106551307f8e38ff544ebae485ab5a1a1e1c635e88171a98ad4dceaa58aac42a4fadddccbcda132f5775cc50df07813fa27ad3057f58ea360b8c46c208a29a76b21db7d448084c3a4aa49dbb0c7afb078995f832786c5e3e93eb6756a677bc0bb48004accb887d4e4521f91a2cea4262bdcf731c3b013298b6c48a59352cb85034ac57b6b0a2bf9dea9f1fd28be2f3e75268973ab27ce54e71ab90a6d55d5f7f8593144207e089462213fc7e70394e3f210b5891ac145862a9ca86bf89ee4c5b4d5c05eb2a4ef39ff4b8bf28e9ab13809735d454458590fb96df64cf8fe493b912f6cda05964a9deb7c8b6c52bced696e03c1b0df14ebc2d38253d3c9c6daf02e0288449316efd99a91538205bbe77665c2ecf18cf9d5b6edf725d0d2bfd90efebf84b4e16a39cf1e859914ae7d8b374e7d4914a4e81ded7a81a76d8e3d47102327254cd5488ac3d1301a68942abf739db645ad2812f483cdefae6ae1733191503c180b6dc0a00f317302d93c90ce7a44b2e7050aaa8b8d7e3787e2135856fae1df7c2a1c04b205c35545ffa145678d6500bae8b26e50ff566066bd7323a6c38576ecfd22c8117ed612e8583a8a888378156b21b9e309309673b83b053152f554a5afd7d396b7dfd53469fa65d7def613c99911c7eb9a9feaf0b71e183dc4f27b40a788ef14226ad9dd8f7306e63e1156bc19b0de370bf66a2e4b42102a00213f0f21312a73b012b16f9fbf0343045600009f07d637f37ac9152125777daf4ce9f9ea26d322e97e155c5cb994bfa74188b51434122b6028e1aa76af94060008c6c9f6f739b30554340d38b95b5b7910c0ecaecb9f9145d94ccecd6d3b6d7d7db348811e2d3b73d5da3de087f7efef63347c99d4ff02593fafe4529743c9ee9d3b42f39a95dd531fb4991b542a2f8f87086ab16e1593547f0ed2e6ac2b38aaf415138e44deef0bd45370f8587375bfdf4ead5317317a3ba70f96e2a559aa823f2333ba2f4166632ed139a8f44de20a2f9817baa712dfbbffbc8e91ef0764a32be47979cff998f324053f7bc5b521d52e3315e561314ebe8d9b181af69d25a6e761d164c43c0bbdacc8b5c569748f168c4f46f30379c273e9d57de3a510483e119156ef605daa251f13ceca2ee56fffbb5e582ed5dad167a9fb794b13ad98860fc245a460c30d84165fe65754089754675d27f2b2206f1be348c398b0773e96b4db8a8cd841e163d0d6f34cb21fc8de95a320c12b43006f94cc088407d525d3f90913d93b3f610ba758fc05ba2bf73f61776833d65d7ca4310648c5864024a8c81415c3979552b27769f6beb1f7ff58165fa53bf0fb3ee5f212d4a5baff604c6ab46ada9d329c30adddb3b6fb4c688613c436e7f886dd3f45cf4426708379e34dbc185ff6eece357820ef570ddea1bb44a670235224c4e102529558c66ed3af19214bb09eca62098510bcda95323126dc870ba02b6c270f8f32b4c204d5bb00151328c3eaa2d853a511ce35f6ab68d73cf6b922a7d2849690d4f2d14b899f33737ce9b7dde3874cc95827c0c93e1cfa5ec2b52f14c275998f6810b903db66ba750986d9a9397114d41795f2cb7c2f0f29d29aa850ac051c737bd706049d4a37983293eeca7483fdf38aee9d323736dc0061dc2cc90c4fe943afb8c7a6c48af1ab174469dacd3e2393255ce016dd96617dad1cbf192ac3a4bad9f5130e76bab322100a21d2d43e3ad0d872d3c8acde3194edbf22bbaba2607e22001e9c24f16834379a8adda23fd14a5c89d2c4a759f3ae21b8738ee441f0631498a2f65214f70a1a485039a5f470bfe8e9d2e6677f0b014faa2f7a8df5294830de7c6b15cc96f9180ff508553b6964f6441966e33c95f36ffbd733d09fd1852b9d8b350a716d583d263af396f178a5e7812bea04fd20811acc53b9fc3c3b406be7b2c0f3089289a16f0155de5cc9de76b42914bda52b1f59bc5fd6758dfcfefc3ae4f93daec8f413bd23562d81e5c148f4e336c6d5f0c5531c2af5909dee8c638e040801048a2b276524549d727392c059331dc7980194140523d61cc04774b6288b06ceb38320a62f1398e30292e58bcbb64a6e6332c3f225111418fde9e026587a093905dcece4471844aeb97fcc3337f496139d9518628c362b1ad792f7e5b874bed837ec1c11b7097d0587b2977bb675da3b51ee19eb30f51be963ae2d10390b0d1d7892b7a360dcaa5fcf5dc7d9e90d801c0ab4f121a8fb0dc1e223d312e4f705f2e5c1008a74623840ad6b009476e7fd13438749b1104628c715371f6a32238945b11d42bc3a11304b15c9ced4cb07d9ee49ce98495a9f9081ed122374f19ba0285eabb18c8121c8123a0bf40166e3c5e7236e456eef743a4492b5b9e93f481e2aaf87295c3580f621ecc0d4bc42fd9ea42ba62d1477044ac177ba5a305c15271d994da5d7ebf57abd3e778fad63cd49eee2ea527711d793542aee8b7a21250b13bfdc5f3ed970c0023080c381011054cfdc0d73794c1f56832d58c4df8d642b002813e6dc07a2bfadad19d9468834b237d95bcabd03800bc00b440b2dbad0b7cd062e763eb0ca068634dc41dfbe1d5996691fb77db1ab3da66338fb68ae3679f4856a0f6177f942b42b7571648d2eb6f0674ae559d1659c3bd93563bc9af14e95cb55a97ba9fef1e20d27913b6f830d5cec12362719261176756c4e264c3870e78f3bb387530d3d486247768c58112b92e4cecfce07be31c62d79e7fbc793b3639186f6f9afb3dfb61bb80da4b2433b0a0eef6af7ee16232b0343151f4457fb022e056787495c1abbf1061a0fc714b6a8128dc8f0584295188b745c2ae5e489425c0cafe4913b9d846cdf981b6df7a1f4582ba7529a4d7df4f19057023417e471bd49e9a37b42421a69442a71a34f725f8ce1915e12c3eb2e647b6409d3c3db0937fa646cba9d70a9361d75ea982ee9664aa9ee46694b85a1e4a704490fd7c07aba0898ecd98a80692c7786e8150d617a30d513c830d6a49e4c86084be7a7c0c8aa148c663202c3a8139d70e9b716dce8935d412310f4eea76fde923642e970949cbfb5e06caac2c0c04c18cf48eac867b8973c76374ace2693c9e96447a7d3e9a59bac0918f2b597ba1ca99f4660c8a6d4519cfa442f919e9230182b61301206137de44eafe8777cba1ba04edb4274c99b91d6136968a7a0873749dd44de58100ce5908cca215cfacd05a7f5d52a9f87e83208aad73eb241f6f4cc908d301f41c2d4157ac87530dcd62e984e35e5a7ea46cf3d71a94daf44f45e8fecb91972e941305403199c3ebcc36097f6a5e7222351e8f31c37efe893dcc7895a76a2777743bbfd06721ddf548a879457047a9cc3452c402f7bb8d59d5e22e11677ca973b1475eda7f7ce0dd44fe76f3b7d25a7d34b523f629a1c743b3a0fd11d8d6e3aaacb516f021e216f0a0c4fd77eea72943e3add7b0988f2c3e8a8a34a1f813bb4d227bae90b250d2e25bdf4c921aca2a28744a74fe9d08cd26f37b08cf5061ae2eb8956216ff1b33de4ad60db700c0b64d98c3f46f4b0577bbf7f40209b65d916923ddc4329f7f49c6edc44a25068d467f042eee1420f7721ba28a5d48ee136ed1b5cfafef1f8f666ddb90e071ff46dc4953a7688a79cdc213ef5e1e11e4672016fbe251d72e96d26a7055db316a40769599665da41df32cdc60c8c399d905a7b2ea53e34ebe15606d22e4776fecc7ab815df48da27d2c8b2ac87529ad58470360ea685e88155f330ac9a9a5741976010ed02810488ab1957cd741220aee64150827216c1aaf91e1630c00ff338620d1502441af43d1ecc3ccb67e7559e70e57f1e7b6214ae7c98c39d991121224bde66aa842daa84ec73e704ef7c584d9c72a39d37b66b029735a48e6c999f5e9c40bb640d15d93253150c539ec737aab21a556c8095bcb24c4525b6b2f3559125b6e8393b334f7a9f9bc447e5cea9e283bc6ca50fabd0e0f5a9ce953a7332b34fa60629c5e59e95b91f5458a54a39213b0753183c516140e472d65990c7c6cd3b41dac6795782a15471ab8a3e41dd0f2aa108e44095950f853e1e9d4516b79ebf1e0810c410444cc0474d133752f0116ef127af8a5bdd0f2aa1e915f443052ee8077e0555ddfdc00781e11155d69038bc7b3979c85b63943558891b6badf5dbccaae5326b41b5ce7a813009256efdc671f5db516fb3a0b973de3b6bb5d6823c64ecd6575046c5adaba85a03c316559eb225144ac8054ae0090d755c9a4ad11a73297dbc26df441f0f1f51ec982f39caa5c8e40b2b10bb26242127d4e40beb4d9e7de1bc26e0129789627e3b293131e9ce1d9844d439f19e455689b2ecf42652113763138b42d99309f5fa1218ea30fd7493975cf4279f350143eff4454e996a8966e0c62cf23c91492a95ddc42b79e8a5ee7d47cac424756a9212a5401e25a0900c94fec3740b46537ca12f812a93aa575d02dfab265dc725fded7a5fd52ed34b25d3f652c874ee3f4aeffee374d07f445e4d30b47d1726ade861dad58161cc258d4e1fd3a36f87e781d92938bb2fd52b3ef7fdd840a097d124284dcd4e5bd8625cc5099cf6b3ff989f608c979026cacc2fcac88e63e4217e2271c308445fe6b7ab2fff8377e72afe877dff4736e77f343841af57f23f625cd5f77f54302c2203bd7bf948ccb79c6014fc06b71879d2c8497b2848d24ffbaca735a452e6d8217f822dfa30abc0c0cfadcf7c983a7aae7d36adf5bc54eafd68c4f464643ff05cb8c543ca68257844d06ec75537e7c5967ccf998cced975d62ec7bc7df6c95919bcd76e66de773fa85c09ce0e87fde411cf1d0e06e70e0af690778299123a979ec814a3da3449d4665e0d594edb403b6c2fb8ace3108b88e5914696e4954226eeb4a1b4921d523a98bc386141e126b7b21636f477f07674ec3dd58bc5b2d281484faf28bf7a455f3c7edbe1ab219f131dcedf54ba19e6de6ee026b74c3a7cabd55567f9964337c302c2f0562c2b1dbed5599ac562b14c67b1582c16e92c168bc5b267b1582cd69bc562b158a1b3580360098025c3e2ce625d560c2b00aced2c16005836583db0b4b3583558345833583b9cc58261b9582d960e67b162b064b07860b15c582f2c18ac1767b19ca5c2ca81d5c26281acb35cb0582c560aeb849562b1582816ab9ec5621d876e86350001c8dc980000c0460f3568cc8071b578901103c68b4b4b0e2ae05da49ca450d26463f3448944faf89a4816bc011c795ec8850d2e4020100804028140201197d222856f28b49da09c741ab703aa04b5e9c07707d00b5289546badb5d65aabc6e28d3cbe2f6ce53a2eabd96c0d748d71e070b9171f5ffe84743b7cb2c74a5bd33161a26157e3d9d7cbc76b878fcfb2fa22abf815e4d2bf5ef42cd0b715795fb00eef1f4f08e8da8d982fbe79a70dbb367be3f5c9fb8d05bbac0f0fc8a5fdeef70ebb36cbe3f5dcb6825ba8f75b0a7681ec14fdee770dbb403648bf81301276f1cc434e72b110409f7bb865dfe71c76b1cc43d6b9317d26c22def7d7e825d1c00003c64296c9c6db815baab7b78c8b01a34fa120b69845d3de3a13c2291dcedae8ef58a5ec6786831c1ae0e6513304209c50eef170f252c94af1bc61fd77cc5232ae00dc0ae69430401b8c50f63cc458a8973cd58af5a2cef6eb66917e835038676003602b0b9f41c6b97169301437b633120d55ed6a65df6d52bfa0080a10500f3d8609e1ec0d0d678d178d9196068616c5ca0cda535565faf7665b11618a678e8988c8ec500c3148ce679691e9757cb4b65d3aeec156b178dbd7a459fca010c539e0a187a1968933a18a63c1760e8c5ec0a0ced0427cf6bf26c381bce8693c3898d0db754a7df9ee0d6ead4e6aa423e38a47258c981efc9c777db5edb6b7b6daf4baf8252c14185878787e7d2df60026f001fc3a68f2feae3bb8162b158ecd283a47f7f0c835eed02d9f4eaf502bd4036201b900dc8e6d27fd6850d2ef8923ebe5aac5d9aa6699aa6699aa6dd4b69f16a97a6699aa6699aa66936844e504ef87a1f5f1b6b97b5d65a6badb5d6059732493d86edab5dd65a1bfbb2b12f6b636dac8db5b9f42d365409ea721fdf1a6b57adb5d65a6bad356507d3a9beda556badb5d65a6b4579412abdf8f8eef0f1cd62edca7878623c319e180f0f0fcfa53fc9bc51f66a576693bdb257f6ca6c329bcc26b3b9f4261c128598c6da457978623c319e180f0f0fcfa54fb170aeeef4d52e6ad32b7a6b5fd4e665633d1bf2f14429fa92ce077943ac2f94e4e5cd871bce862305b7f8b4ab696b3daf53ac8f2fcbc7b7d2eb40dff4db0a33f3d7b3b9d2d08b2fde15bd8a7e853e0722971e87292ebdca477f03cea507a1b8f4df1397fe1fbd0bfa16402e7dca073bf9e84dbec8b4a427f2ca54ca217da31ebc4fd4a970df52d84a1bafcf46d0906fb8e15cfaed05273b2dd268f046a446f00dbb9a904f64d1675f280c9145df59847cae8eb4018918c33ba1be498e06e7f2e3e5c090e5c6ee3cec4324baabb8b583bb8a55717bf7d1b66ddb48bbed7a0d5e7c7de43ef088be0fe8383046969041dcbbc730c8c39e7b77fec2d9cc85baf321f592773713232b44e28e9ea1dce4278fdd8d94a37c33f9427a4dbe49ce44883b7aca02eec8e4281fea275fe9b1cb81c345994cbe50476ac46374fb928f87cc221ee12696d1171ed1f701a36f277d3c460f69ee68863790877d3aee8cabbeb0883b437ba89b81016178037836806ccb6c501b361ec302f862aceae1960d1b32b3f119df667c95879edaf88d7a8455f3363e1bd3363e79eb974111e3d60ac80282a12700f08879eb8ccfd71e1b9fbc333ee3965bf633ce714b7ec6bb6e6606fd324a6fd40aa2e05879fdca69ee56ab95d33ec668eecacc0ac5693a84e914dccabec9092b72c3fe99b076754eafe65bc0d05acf638161f760c1ad97ecb95f23e156c83bddb3154186ac21e3f36d84d8ba9fef25c856eb329f6f1e6ed9f87c1fe1160f311e6a498835625c216bc0f87cb914628d97cf18e6e17ed90ca26abef5653890aa79992feb4154cdc380f16c07b2653e86e9990d62cbbc8c4f0691359f41215be66dbc80191551356f781684d832eb73f84b3d0e2ff52a8f9d0f2dee4b4d41b901e524b2eac197faefa5fe2ff536bc4456bd8b97c8aa6ff1524da5941229b2ea515eea4f5e22ab1e06189a3c918928940a75251d175995db501be804d24c9a8dacfad15fea4b350365f725b2ea43edbe6c73069146bf3c9341a4c19155fff22c8a484346567d7906c57ca101d218a650744ebb7848afe6ade5213187def012bc8e0d09a912bc151836099809deb652c3ad1618cadbfa8c9482618ff9f24d5810aff57086f43437664458f5f2ac4837f372baf22c8755b3f518deea17afeb5e3773bf795ca7c00be7cdbd8f612905ab70b6e664778387532134687c520a5ecdd74fd257a4e1430ee129c8e08512677ed6ccdacd64200caf6635a748eb6450704bc6e7b39b4823c6adbd2f8f6c93c896f997cbf8a88f189fbcf406c6e73b89cc5329cf6b992477d25764cde3d0f8329c5ecda984279f3d9c37d4751918df0b0f5f6ba6f518be1f8f18f2eacbe9bb9b99416f839e071c6ef1f018206c9cdedb50e601b8054300803c8ab83beab35f7639609c8228f21e8aac2b0fed4591a00f34f2050587fcca6fc8afbcac7c059cf230be70e52e19f436e879c87e5bcf7e9071dae5a020cacbe9576e9f7d282f97cf603cb4282fa00f34f7e5f22bafdf5e62bc7c28385e0ee3375e0ee3343776315e0ee330c0094e56ad3c2c62e530049057e632c0ac0c5e057b645d0164fe22655e2f41994b7087cc5fc01d77857e61057bcc2b737f683dfb05630cd8a3af8d07200400d8a32f0faf3c9c0261030ce5e5e1f43c7c61129766b754de0211ca67618fbe3c8061052e7dbd54d6f7e8d8c530c5c99e81618fa63c85470f05abe88c9a8b83822fadbfbc7c863d2de2d6cf2e078d0543dbe1a07f794cc39cda6f868decaaf11ebef2c82e1a87f11ebec82b1860686fadaf41e38bbc5a0143db832f8cc3bc7e77ed98f19773f743eb2f971d8e197f59f9a4fdc222aefd8c2fa4b933be7157009abbd2e5c8b2d7577065c66318c6d783efcb37c9cdf876d8bf7c83f1fac9226e16ef4a0ef9fad8adc8d7d7c30057ced9efe533bef817fbf1cd5e6e3f1402c49b5d5e9a8b82a3de9ee6d6c92a5bbf32030c93b82f77dd65e37d01677cc6d77aa8e3ba0ef385455cd7e90db7281424ef200f7484bcadd6e9d728f06a4c8743dcd0f51ef3b63e5badc7b0eb9b30ca7d31876645589593ad7cf16e95a32b9fbc5c3f5a69fd6c952b3060c4589141c10c8787674432222b60d6fae4e5e13362de309391ddb48bdef46a3e06185aef86de641308b78e9813c6ad97cfcf9a974f6ec1f8cbedcbb76ee6a5c11ef43c621659d0dc8d7e1148dd1df42b8ff1455b3ffb6c63fa08a4ee0ef995d3dc182fdfac05b91c6e51709ed4cdd8d39bca7535a4b9dfcb17729782afd9ed512f8c182fdf6a566be56a6e4839986ca9b53e7639380dc8968a423fefcb638028f4f6561820ca0b788d98940814ec3abd018bdc799a43843fc5a91477ced7bdc96e3228c6e0c59a5073c3ca934521b6549f672b48de426c719f671f4ec2ad179f2e9f6728441a3a7c9ea9106bb07c9eb3206bb03ecf5e88357678cb43aec2f52618ee7c953a95c7e5137d209f2dc4d8c28a5fb87c964f0b97afc31723ebc5c785214a95ea0a97a58ebcb11f078455960392651fa701d942296c050c8988476ef6ba72f9b892add04fdb6115a59a911bd6ccd6ecd3ac902df40ad942c109a24829e67c0e5f9819e1cee3f0855911eebcca176644b8f3377ca10de017baf8beb0459862c317a2b8f8c293165f6892f28525285f883a997c6129f585a4922f1ca1be5074c3ec260cdd30bb09bb5276436f42cefbc22aea902a716384bc61767373e7411336a45d51a6553f27ce9d1ae88a32f393045e18633d7b6a3bda4eadf5f6d3aea0af9f0c42c12646e085f1d5a7695aed80116847d838904d192a95cb80e9c1863bef9952591462075620043164600640f0c9a289580c0912ca05976c0925842009cc0a4ad80c2183112748812a01052708e902fd2185076c40050f8450061cac200a5700218786035988e2044d6080091c74000a5db8f3a65457c5058c20796ee812abb42ef1bbb8c880e921ce0d5897ed8a20e091e0721817192e9e8b06d39c10842b58e0b2691f8ce67217fae30a988b8b0c95ca5d5ceef426bd3307044dd85c64f00a0445a09a13364dca6c5bec14a0dd824880ae3d9c004e10f620fbcd726b9f7d4c4b22aa0e03319f813b28c8de64e9c34718421840f053869f199ce109718a40480d3860831c5cc08923c8cc1d2740e1049c3bc1f0ac9a9d1026ca8d547801e7ee6089ee8e9fb4fb737677cbee29a482b657933ed415e86e12e732b0d160a7edcf4d7ed1d6befcfaf4eb31af04e337250d656982adc4c697a22bc6887265e49e19f0e463c7200cef57b2121408e2810d28a1020e402104324e5009e76481b1aa1bf6eea1cdacc3c1b2846ce967f3eb6f14859e05765986dc18deb28fc5876c99afcdf2eaadfb9b8f5d0e962564cb7c463f997ab10f07a4b87d5a05078888e697b18c91a572b34f7bd33e48abdf8e186918c1437463644d56f51b0ce933edc6a6b9f4ebe8b5ce1655421aadcb900e813e80c56db9918a0fc02e0874eedb69e3708970d65acbfd24b1938148180f176a3764188c63200c63552739c2ad20220d1ecb2261122644af4a9f975c0dee7c284350a37164cb7ca831ac5d4d8457f39c6d10d6b1791034b1458e51ce50487381d031f0f85d87a36f9804e9313cd0b7185ebfdac776853bcfe035cf3cccf399371336a72994300924d288371657f3de4629dd6c9f4eb625b7dd0588eddcc6711f3d9db8184779933020dc327d5ed6441adde707ee7c573184d840881d93356064cbfcdb09777612ecb50f857b9f7bd7ddf4a170dfb87e710de3b8fb8834b8cff78fd8af7ea251d022680e7099e9f4edc4712527eea8a3ced56ea6a4e4b69b2981e171df46dc68b4c168d65efbdac6932d6f38b3cf6f57b8f3dd0d03c29d313c49845530edf5bbe70f2fec57fb2042911891d89c73cef97abd5eafd7ebe523c681b618c78dd3384ca48030f57127161c1b993f38ec0cdcf9067267fbe857cc5acfb3b190a738833755319f4efddcf9ba2a0abb1348177ad64d24d2883d6fade7354fbfe699b04d784fa4a0b8f32f96e2ce47c930564d9ee6c0d05acfe30ddc79585c4d582c06db352d8687c3e5582504abe61710591304ba06d248248ddbb46bdbd370374dfba66ddcc6511269e3362ab558c79a48e7441af69308777e563184e88201426c81a60e15729c709370fb49405efbd087b27dfb8ca0da77e4c66d0191c6f679064421b8a57d52018b1d32e878e1cec6c28c1189ac3983105747a820859d26e8cc23e418d19d471197f430f4d2b7d27679e70fdb45177ddbba19ef5c37e3791f0c6fa3020450dced5991fb1babc8000caef62d08088050f1012457e5462a3e9073371bb8ede3db7d3de6ed6e6c17954aa1ee874df4a9dc92e8d35edab68deb6e6cdbe66da51157da385276ee5a97637b76dbe1c8be6ddb6328019adb43725fe4c943b46936940144f669077de1e8ce6ffbb62ce360da15040f56a48a10715d9eb7d385a504e38946d17277f48952e27acc9bdde08efa66e26278a7d067e8a77740a85ced7207753f843eeda84fe56a0f15c1113a0786f286420f9de6c61b3b1cdc4360282f77837be81bf769dfe44471a14f3bf79d3e23e80d674ce56a0f7d2a772be14e33477b08e4ae06ce18ab26169ef6fe2462dadeaf5d0eeddbb30ec7764dfbd6751b18ee28bd87ec8f44129dfbec3c8ce66960e880ab812103aef621aef6d9f9b0dd82e102ae06060feb902b5f779ae7c5abc6403c896c51e5fcc59e4e78f4354cc8266ce4ab57d2c666ce9aee51d9e67b3cc71859e30ad2def1b31c358ecda17c62323733e3d0257874541515bab36e06c416235c36e9b0e9e679811352f0041f34510407324d85db8d84db3a82d0d11144cae8862a190c893a625ccc08829850ab43089d20384687471be20b28a0b566319036b2f5b203ba7ea0012ad0820d82208405361a90e12978c1090bea6055bb622a38022666a5976308101b0001621bd05c605c64c02c21b32350025433900056871041e804b15d3e0ed1ae0dd4f101e698042440d0021a6430851b1f1996c2e5181666906922108388c707f3100e1822e601ac6a1ec9cccc0cba910a11f4dc30c64c5ea029e2f6a5d43e3fcbb16a1e31edbc735e66d0d258c94aa8e088e8a02fe46ed74e4e19782051bc5d157da0e66c94380085de9eb45c8fc0cd03b3779763bb22ee6e884e7feb6714de7c28034feb92c8b9a0ed0b5d6e26a770b9436e0c4b911d0743b825bfc52b4f67e48cc2934364f6812daa1851dd2a822157e5462a44c0c4f571e38d777b9daff576ce09ea7c6023acdab80dc7166dec268efaed5b886b1778fdd03c833e0f024320eab7b95590e596acb49ba931d630e23dacd6e1a89fa07db5df36d0853002f4f9edeb21eff6fa85aabb7d7b0dbcc87539be3bc1faac5e64b2c9cebed0861e8808d5e5be498e3b7db63d86edf6f8596b254b5943b97ddccd6ca0dbd86d6048f31869f4fc7c0c831ed3a2cfb20a3c3945603843b6db3edae198afa079fbda0131b58c1e2143b2e3413cdf8b9ff173143f636b07054320e28f90f4936e1dcf8f2cf0e4ce7b055ee85de69697c2314f4d1c69c8196b6c9695861a0c1bb7b871c648a3bca5dddd2de2297673ce1f7e3bb41404c35473e3e4ccfbe85fa0d7f092e1efc89d1a15584a267faef4e9559665974658958172e7c88d9734e3d8531c18a6bccac5ce314929a594524e125d9c94b7b1181301a910c1cee57c489906b7b96df472475e959049a4baf4d2081014943ba03c92d32ee97311981302c314b871905ec910183e95f23822ac92e720670e62328a9a8bc31057f25926931de472ededdd408e4d18782107b93248160a692e115c65232627f9417429e84d19ee8ebeb318656298c49d32fcf14ba669647348a0220b486ea4220b46ee0e37529105286e0caff490e3b4da76638deea147ba117563490bfbd0450dfaf032d2a85c64f54b5f175bfaa44f1455dd423f2addbe67ba7d11eaf64327b7dfa1dc3ed7209055a1fd58becbb7341e593adc061b5ed8e0c2c5ca458b16aa1629292b29282839a09c9ce0706262a262924add902a29014b50a80f753afd6432d9602a955c9448a416a4d12865e479289e4874220a854c425d97ea38ae84db36d406029d409a66d2ac2dd95a4935cb46d96df9d0a3f37db9234bfe5da471236bab1f5f2ae3ec908c2cee9090c9a0e7b1280949231b0484910ff286bcfe4972ecc831efc0e6ca679f3db3652b5895edf06ded11721e6bb7910959c3aa4cc2260dbcceb2aa23e3e1d1e16917bf3cc97365f69a9d5f200da4df2cb3057db71fbfb9ca36abf65ac66cb3f3676d8c2fb6a94e4424974d29cf3e19f6b8dab36f36e1d96b1f11dccd62d8727340b2d70930125f83d207abd8f4137d8ec0f3a392da4f273cd0466b95e037b3ee5a6b6d597b03f5476f069ecac5cede096fb361153f71e2c99a770dad198e9452d33e419a94de174a292e7f03753353c6899efea8977919cd28a89bd1a4949a3581a76907d96ef91a7a7f5224afe8b309b90c04aa19383f29a574cacb83aef56bf64c6add8c3dc7ad08a4bc21773bc7ec92a71214d29d76f6f292e646273c9b559cacca197923a1b89cbaf2e686d246029913c8d4be5aade4805c6e8acbc1a89493d3806c999f1c631a5097d0404545650b5316894b446a1345d09bfc662b6516d1944a71cde51803e10ec816f9f8188e5c03929d8339e79c733eb5b594da4e36a976856c61fecfb412480d902ba700128223b7c68d548440c8b5a067d18705e2311163928e3b37ce9c768181893f118bf9782927fa28eaa27bdf184582d5b4b1d45e294b29b95e72a5af9ce8a3b75fe8b10bc22d0bceeeee1afbb06bac8b6d74f9fa2485160c2dcbbbf89ae7eb23add3afa2b37cdbe08028110ae8496e06e714cc53caab5dd3344dd4b5cf547253edb39b01452055c3adeef35a6bd3d95cb690d263090788e66e956b1678dee7356e893e3f3baf6de6e5ab5dec8357f3405ea5cf12d8437a48f7cd23760e61d50ada87893ba98e4ffb50b07d1af4d9668dad49cd29d81579e24c22bd89be7837edd376421aadcf22d1b5f717ca2ba27dd1b5afef7d14c5bbb67341b01bc39b48f3ba35ed0ad9a25df4900abc18afc4e2c535a003b9edd3493694129444496951b40485f4d59fbed417ef76eae4fba33216e9217d3ae1a1d807c37e58758272aef9c1695b71ea99d61e42bfb627c927c952a27c210749dd50fe904ebb99fec9576ff2123e9160eaa80d55ab949251cc2c254b59b56e8634849a2ea5949e6efa66fadac7c63b9d1ec324898222bb197a4eb9641f2de46b5cf4100b9e3e795b7ca659039a803525e0ac6196cc2cb7669a8e6b77b2f254f2575976d27633a47712fa698a9c62327db2ab4da673dd8c692b7d2be120d1dce98417ca9f185e6791451659c8b015330c726c3f7eb18f3bb1e016ffa787b46b32f1c3169c38ed8a6c2d8873e76b9fbb2747faba1a29dfa9cb6720fc1cfcfa2de3f8e3aee676b16bcf5f0744b6b4a45dd701d922e94c81471fd39476355d4d07640b3dfd4862f18a52dee05cf9275ef24762f1f18b6b50e035abe8f9934d5cf9e624bf47c879f42382bb3dcf40ee7c0c9361e7b2dc480519a0b8db16b9ede3807407f5bbef03bd3ff9f36295c4e263907db06a327165cce6782f1e9876b9b8a854e1530dd3300dc3383d2f7ffa0c3afd30e66ce17a5e779df27b00fdc683524a2548bf9983df343b0d4160968572668267d5104344567fcba6083cfe42f9baf33453b9fda9b3c9ac20954af5bd4f5a2b6fbf0778df78785e0eee208f7362235789e4329d4f0003e88834b4ce2be9ae7d03083d745b724397605872c3c7f04697dd8c90d23dd2ed65496adb8bb8db91d8b66b3779bca98731c6637b4873b76fdb25407337500226a9a3dc5a7b2d25a5c527a4e429d6821240018598c00c98fee3743a9d4ea8ff309dfec3f493ff4095fcc709ea26a976951cf5d09e1e7aa687a91230461418638cabb8d2c1a40f04e5e3a5ef7bf61ee8035d520a8a9de80bc5585482cc3e7909d0dce89d48706a8fe149d02635edf29a7c949a263f65539a11e588cc39238bb7fd07680365df3260ffa3da5abd766540fb0fab59d0539a06da40fdeda0a8e222e3c6ed8b6d7bd5abe67e0c8f8e26377337c770129586f2f4e96cd2f948e93b9bb31fd39f9335b04595b0fadc5905bb05183446fa2140951529e5e3cae5ca57246863b77e5adbb1a56aad1e3f4ac556f7f894d87af158638d97c750acb1f295c3004fb1867c098c472a9fd81e10a6aea5965218af1f11a94b634c677bf17112f6e12d44d5fcea632b48d5bceae32844d5fc4b156ecbfc8ad7322f190cb7653efba01059f3bc235be63b055ef61901e32e7ff98cc8cef295cf087bd6e56704fd0e30be1eded5e1d9d7c3bb2db75f0faf877745f2865bd3da5a6b05ebb329563ebd977a0b862b60368514ac9aa31730b45e064e29389be28688d4a5bf3181276d9e9037373d4be085d9cdcd6efa2b60682fc130757b08abe614deb39b6fa7210fa98fe14991277a8ca2b981a82a42a4413390ac918113265b26e81604bd821b38351059f3a4d349e90cc5198f02a895c2a8b5c62a915a79aa4e8dddf9da236fed6b37632dad3ad58abaf3b2f28275d8b88dfbcb4a17eafea2bb0e2ca1959addcaccce388c0f6600b39b71dddb9a715b36543030ad19365af7ba5c36fe72eab2e1d2542e970d57066385c677b3b2a95c9fe1b2e172b95c2e1797cbc5356386eb8bd77ed2e5fa6cb87c61ccd5cfc56377a3aa868c70b815573fab35c81af1d29217af3bc291a2e4a65d164499b7e17fbf2404a24c10e500f6a127e0a00d60f3f40af410187b65c1d8530a1e88eecc2a78f5a09bd0bb998b8d88deb92ec0d51a64cbf6ec0b5543ee567758255f8db04aa248c1aa1e8223bb2893c7a3f4dbe426153c52776ecb28cc4597badd0461f3f5baf5d937a7e055245e77728fdda4d73e9a3bbf1edae5409625640bad4758257b5086b4cb471429ef61ef491f450a6e19c1a387bd28efa3e0b478c95168106bb4700152d363bb4447d118fb27ae40eff9baa0d4d748a22a05ec9ea8025df4f9689ff802fa059278c988be71cad73d28df11f69a807d24aa40dfdae4eb2391057a8bbec205bdab105b40df66ca27c4fee41302b332f629b07b7a05bae8037da35cca97fafcb28b92fabcc94fbe23ec4d7d4be9664c40185eca24f5183ed21980e6a6c046c22ad0b72cd650f344d69482077a58cae99d5e818e6283db4785253b252b6edfb453b24758d53c36e4a460579489239cdb1f350fd7c311f1b89cdbf7b8d8ed7b9d0ece1eb13d968743c2957278d56faf095ec8ddb064a764676a9a565fca291581e2e6f64b3f261fecd27c4a56702b5601c591dba59e862207372cf970355030e186252c6e3ff46e95ad6805992152703ddc32dd7e094fbb42ef97ecb44b54b2532ac2ab3e85b52b047220cc54429982558d12bb8d32e4a2e0941829e129d99951f0686eac3b573ee47ab80505cf88a923087679b364a7eb6626d758bb5082b00f3d04228192800ad8871e65ac1016ac3193a9c4d59cae497c7c72a23d9dba99931156b5941ca897253cacea921d9d76d9cbe7d857c5e2ca5a89a85fc58255d2fa28e5b4ab64a70e69174a10a18b2e0291a83abd920f8175880cca043d56f553bdea9bc894724a764a39253bf69ec8933e95cc2478f22659f604af450bef66377a97d905e74293b25659b5739fa1af3e37bbf64160c2ee04430afc5c2226ac040a567509ceedc7929bc8eac74e47894daffa455855d26155db1b96724a39d6f2f0aa1f41282090e5b1478cdcbe56a335c12e938d45c2ad58850d8adcf674b0b87d3f6334c0c20d35d8edae268a58450d3270438d89db329af474b815469d1d6e8514e659c1ad5885db3c37f48cd0cbadb0942333440a588996d2b89e5ef535302cb9094b76726e9feb6957f374b419d7733b2cd9b9fdcd062e66549b73ced9c49d555622260c012c63c1dee955f6fa6507d06462b55a8336ae0b89bc51462a9950273969eaa44589898b981242c191440c9a2e89492b3bd1c4b68928f78514ab58caebc4aaa851c38dbd8adcc4c61de4468e31ee581eafc70746f582619b1bc619127d62d12727fae8dcf4dcf8dcfcdcf0eb866191a757cc13e3c9913c3a926747f2d897074bd53c88ca2688bc71f151f59c27b5c331c70546e57255ea1eeb34ac5f6532192a33655a8665a48c9599577861d75c7918b6893e3d371247f2fc04995778a18545db399125dfed481a5931b2228885bdb18a0e24b952015eaca20347ea8d5574200a973ba7bbb18a0e20410c928a1dd8e5a9c98721091caba467f24c9ec94696fc1ccd7f7615bc21e24a874bdc818d97314c45eb63a3fc43aae1c64b32dc78e985e8b29f12494b232e979a541a37e299ea58cf6baae3d3d67a3e6dade7b510ed319c9dea509deda34ae8db76718d9c351b4806afe8b9a65329aa53a343333993f598f06454a33abdca3a1b59f3b1035d5845df3e3aed334fdf4b8834e8291362ab4f4f9d105d2e5447d660a160b8f431522d5c4aa97069769776b50f8bac613d7b416065b9f45bd7773d8595dc4aebeb4d462ea912552cb195bdbb7edd33cbe2d53e1fda97b88c0646917da3dd4c8330bcacb36c569cd929b14516af8a1f412e7863153ec6703791a453ca7863f217b38c6783f48bf194360babbc209000e7c62edc48c5088270a9cd1663b482eb61dac870b95125bab8c6a65df3876bda357334303c67330a84bcf3a75d5c5cc99b2c07fea8b05c098644b88c40ae51656078b03ef4d0b986998834425f78aa930b558ee356b7dcc621e5b9b886573327b6f0fb918b791d433f127a288653f61b88a38fa18f6fd794e0e51384e74a14dc480509621787e86a5d0ed10db1b45cd685645665a699b81812792352890b854221b0f361de39b9d5a10e8788f3ba6f235257b2a693e5341ca252974374fb9b893bb1e4100a0ebe6105faf2dd4a9853b32ff74530d47143225c6eb79c21141c7dfb7d1b0c93b8a1cf6e15162fbb68443acfdb2cf0e20abc906b98a0d9697067eea1d06be51eaa620350dc50096caec7fdb8202658c562f0e6c3f904b7f8f3865b3beab4e156ff87c801c13df40e477de8b186b699d3ae2eaeea4fb6be3ea75d51c67a33876b16743ef0ed8772782ea1f7c6719d715cfdfafdeea16f47fd81c351450f891efa26e2b22f74d217afe8312ce248a1d081085df4d8cd84bc4ff4edc81ee21e4a819b889b44f0660bbc11d74d8a2c49a47edf0d87d91c0a2b704d39b4884d2496913443d32564d96355d8e2865c5363ef248266d2916c01826dd247ee7c30b18a9952f9801bf689487137b717cee66969d3669af59412b8116f8337e26530c34008423064c810969e9b2f08a974c2a1c6343a25f9f9f141224f4c2614ca8432fd8405c94c32e7c7d2639a730373ce1a9b5f109e464673741acd9e1e243f2693e90709d81a7a4c23941e23a6d3a9449aa69e76a1f4a04c9422a38f765dd7733a15199548a72153c472e69c467a4cdf4627272258d9b06ab50a3253a9d1d7f734648a584e483262ea993da64fde911d9548a71e2986c4727a78aefc098542753323934904debc89450b76c4a205162dccef74ea399d8a24f9f139f9c989cf952793098532a14e7efa42224e925cc982648ee43dc588e42431d2d36342954828530fb766cf9ca6d7d32bcae4c3e2c32ac982c4f4b1f44c21f4142991e69c736e45e69c52957134b41bedcdcae0cd20d332cf8d37b44d42d264b66506b247f6c81e8ee3faa77fba7f9e100155b7eaca37ab98e0e2e242241623326113f60466666e261c416f77cfb76c1fe47904404706073ddc3ae2cae0e008b7e28d323838d2c3e3f87941941ff8603c83f28a2dee000ca74872ca11218cecf01840a7c89471ce504873f94f99f3292a29943eabb7d7586a51d342214d6ce9c5243391e7a434cb6aadd65a2e06253830989430ace2579a5bc170d65a9570e9d72d322232c22d7909a60060ce24dc100097250f072e4b50c4135941f0425528e229c1995e88514a5999abac999473071eadb55a6be93cd7787d0acba4949990fa189e31c6ec339395cedab5e76378b466598682a1609a06d3609aa651a69f10db26f0423eed22917e7e42efca6cd22c9bb47bce466100054301a981a13030511898b09a4d5a61192c9b9f10edf4138282a180b0cb724bca6a727272424249494931d5f909a9a7b567f79cb046c17a4e1da06074523e0a56b3af6928a7a0618b71da94df90b7654e8c524ae6988517b64e901aa4045ebde46aadd6da181eea15513e2e007a6d9bf668a794b2a3c64b789366f3614a7e548741378657716ed83d5feff48a1f4a21f6d92724d4cdf494a49ac8e24f1c7821ead573eb5ba706e950af209f2623937821a9e6b443aaa1326463b35be7a7c9cfd6db4b785dfd26a5340103ea85f28182a15e2660300143a4116fb5a94158d504abf8219b76d983766e2e7fa3a857eb5c9e968235480d721d4e7ef3d24f88a61d4093b1ef90b443aaf94841423635a8972642e1be2844bbfd6097d1c0d013211b5290cb9f6c72727242fa244a4a4a8a697e51c8d34fc87c366f3f1f51d4b770e16226a354047227b23864c3aad013a19b2a6cb81582762ed730c1a420a426b8151231831cb413694494fc502f948f2ff404aff8a86ea6c1900d10bc306473f9a49a5973f9a817a35e11646ba699f8740b18c8eca1aec6ee9deedb688c517bddb0078362a7317ddce2a9c62b2cc0d50fab98be792cc7b326d6844df7e58df69e40affadd0db68b6f64957ddb3737375a070427d5d5c4a87d5d79fb51cbb61ae16195dc892ce983553056b59474b34c33de6c65cb9f76e617abecf99c51695f69a8b1d58f1156b14acef31238ede2beddbe77c29e6dc50d7ba79bb9412f7cd41c9dcb604844efdcba5a4305bd78dd17383786575880563fab35c8160ea863a804ecd70a931a65aa66040000001315000030140a878362b158305145b9fc14000d8da65272529c474914831432c818030c0004000098010081999248002e3302ed9ebd577decbb15e557dd765d8334e0e23d9cfb577cffc74ec4038fecd5bc35b0a119d0c930f272a3a1ae0558ee0cc100b274c5eadd9c2cf8d029451d1fb675b716600b8e69f4b75d0bd43f911abee1da2143d85186648d5dd10fb59df3ed902d147c06747aa9d1fb85fa822388a0f613d086886f137874304ce61c93e75878a9e435b2c4a0268ef24a27e3d9ef1d6333ba599823b0595d1bad0fb265fd64d14e395dce27807770617ef15dd9755d37abf41bee59875acb0cd824d71b99b76e296b41b06210155196441e8367d01327210806aca417765dac381090bd700717002141f4e8925dda174e7d3cacf0997c1d8c71a8f2dc131216d2dd3757f9e18efdae45b4386bb5593e47679ebefda5aa6095abd63c2fe2162b5ad9c6dfd2b11ab819b242206a59d241ac6986c2729a963e9f1956e81914faffc6c28cfef7db1afd67bbfe4199c52f38435fb20aa8b45480eaf1e708b9428864d6add5f457d0e0bfe8b034cfc9f875e16f33d8648960695b19a74ac6ec49061cbbfdc6d9aee2c5e27c247caea0275414ab0c5b782e5d309cfd73312864f532103fd6ee7a4b5e9313c1fa18e7fd6406da3aa86fc3db444c63513c8ec38534392be690663145ac8b948992546e5c826cb52f63231709594dd4ce411237198a65b2eba253801e660d072257c75bdc74f09ce9338612d9715430d04b44ec11eb3d857b73960ce27e6ac4b668ccaa8b01568e92123e6262123f65bf9333bb0b65f0991098371494356308e6fb31f0a4049872e680d66418dc590a136f06b6e09a0a1237e39934cca2aab107469950bfd0fb62cc0c8b83f9360a609b79d5f5c892632ef63ae9a4d6b91e823b978309499f5d1a5686d2ef3e2887c45bec6efb2a2eef32daba0c7079a7cf0b60dbbde876a64f34f43f68868d33a881ee6a2e7339163a01c0d640bf985ab66ccfb45ae8da65570e59a5d468260165e996ee2b38429f3afdd7a12c738a88b1f4c56bad16b5917e932139f5fc1b02b4383a9fa3b3ab336b9294ac8b3a298181720cbff68e80f825ff870bc665be8d22fdc824059e8e1cfc61d23c67b7e17319f3702e7fec287e36fd8914d09d824a2f4e80e4bbfcde40c9877b23bb619c8b57a0e6b05f1c12be4383522c2107e9a49442903e371d2369d97984cb0449d76555e8cca3b2ac6cdcd95371cbda2b89ab872b06abc07b83a7bad16065fbb71e46f4d30558f36b29d3b0d26e967dc96234930df2283bd5f35a72ef569be5fc0883155e7918d55b009f5ae93e9cd079684f99b47eb985c4006b135ee4648632f3890b870e11ae960a70c79f32999ad2bd0e0b55d6813a60ea742d6f808a6ba741acd49e7eae1bd6f4c103f2d4e285f281678ce89d834ff2199f82c280d2286aabd9d25118870572f3e04d9a36a0547751fa260a3e0f307a19a32623463fbb96c73da88f15dcbe0e8748c720ace0a813d2b16a7acf39f62b22a6ac09d53ce7557cc1d5b31aa7b402dc8465824e5dcf053cf44cf7253299ab061c3c247785b9712bc0d79457260a4ef24c6fe8be797f57def745b0ed6c80e0fb7b42742a4168992876fe1aa2ab1991dac4eea23532916a58a0996849acac768b469e98f765342bd10810618d20b2d96da8944bec79d4b2b0e46caac9d89d932ea4d2f275f60d89cb519c8437ba4720f4ed59504fd25b523e4edb31f63a7a82a4543b8b3eef05ca583487b95878712d3f4da1d88b93e42d54f9af46d6f27e72b113cf9a9b774b518dd0a5450f3bf9edaef17cb7a8bb66c65780af482ccabfbf81d76c87fb2fd3aa51ecb069e5e9ee5923ec52d0189c3b98a63f218dd7c5c7329933c2288c6818df195ab473e732d1d7fe1a1a85e43e25d01f53b4b1021cf8f88817254c6cbac4dbac77584755ddecd60a7b0efef4588365ccf0e067ee0a80463bba5590ffba9da832509f2020ca3c78bd81320902cadc084f4fc5427633354a5dc4f934e2a740ee782ef88e8d66ece1e6d4a63ad00721c3d13500917c7f207ef43435274f33a278fc010e12768e47a52b7154a4b94107b50d92c2e1dea11e0dc11260a209b81cce254f492febed7dbec2212446fe3f22e871a12c46b47d83dea917bef7bda9e72580563eb5f3c4d80e2cb5f5ff1c53eb0d41a43aecdfb93af44f7e36fd72bf612a70ed1fc92e44520e436ccfb65975675cc1f14e28087b6f9f5b26769cb8e6a722c3a06ea18e1e7ec38abe30711b352da7235e23d10c4364f8c5f9bc2bd61f4f52f3a75819c673d8f77b176d325f3a4815abb26dc9bc5448dac62822a8a3d74791efe857a53403cdd3cae98b9cf26baf4a4bcb6059a6e4c871678a5abb07c8a26400c03f2493687b4b20df12e4e3364cf5107274b1dacd2c76765f8b8e8123ad02532404e50166eccd88b6485e2eb9ece1e1989a584cb7c43711e08ea619c1d102a5a5b6561908c884cd7f2b786b258273ce834c34103f4430429a21913cc5ee6ff448ee6b16e51a657aa3500ebf76a55b8e6978f15f141ac857225223171ff6383e08a47b2820c38da23b1b1f0fdbf2ca5c7cd1c055c61fb2e5bb78e233c313412819be9755a071a4d44e6eee334f95f720261aaebd5a6c8ee6dea5834a515dfaf7463d7fbbac8729d1448e522dc1d3582b361f89830a23600b537d91e6a755f8be798e54dbc95a7e84acbfa0939d71909b559d1fbbaeaf05f645070fe0d10b34a1a8ff5d70783b0cf2abda80994588d1dd76edd93933b600c4d3d8336d4742fae7e2369872bcb6e3fa2b88b2a73608727a8debb48d732f587abea9ecb5fbfc2cdd56b1d3362405e78b34690c2eade68c32f68ec88839b7fa71ce28838a1ea142c0c065c6e173b026598a7d24310368f50ec9f43f49844564724e226a47c87e11b14e34566521d6388326052d4c9201b6d91de1c51f8e9d54fca6bc5907f8096f2f7bf34864db1d39cc95cf6b154d645f0be1d91db2d9dbe328d542e1bb1b33c58444d6eeb789fab2e3a285e1ae9663968b1a791fd8ad1b6dbbe9ba105880f6f9b87a254612e51d6b41a0551b40a49ae8a9e87783418fad8d6e5131bb578b2113070cf15d7262b2a8133adb85e840c7bbe8777cfcb2bd0713e2df0d8761dcef7e5901e02d36eec894485a2dae60519e4594689ee33ecf842d2103de151bf02f639826fd3978396c0e9d01bedd9c27a7bc4c25b8ba9d4ddf8608302e80b7296d63768beb71009de8d3a15afa21566d06a8929ef1c5093097667eb6ef2fc97130a1c9c6be18ef22525518629f87f1f1874a29cde7c5a6d254f2476cd2838640810a1d2284b4cf86b164dacc4346d4434c2327b1c16c7607695a13a6edd3cf33274aaaa542d9d85c4bda9bfe00d443ea15863b10030c3cb6c738dfff79ef18f4b1600469f8f8879e62a60c381e399f17b51d311eef1ba81efd213166c06c8fe2704d827ef594a36396bfa3ee2116cac554c4ba488ea4f607baa2142b3ca2384a4d0ef88d26ceac3b9a3d8c7712805fe3adf18e82ba5820e236f7f903eb392520649cd6b480a3028dd2e912a0b44cb3ec33c5c6f3273402c492b3a0b515b452b28a4b5c59fc116c17b90d0a0ec82a448ed5bcf5f4ded9f5224993435bc63152af1b8dd74279f4c175a82ef0d803fc5845e25ee0b549a098ca06ea52875f5c481fd5656daacb4d6d9f2551effcd3e51bd12703ed5002a27a48e0d3748c00bb8624a8189911449ceddb054d02f795b8f5df09ee1b070e321c73db961d61980a2c72023e4080fcf5af51d5cf757c3e788836d921785dbdd59b8c1b4671cf07335aeb72069fc03ad6f60cf9225957842627e442809751c8e0b978529897b3763d707c65f460b9d61d1cb911c24ec114a47d1cc4eec6fb81db4f530abd631a9733536887cbec0f2ecf4b10220ae71de4f900339677aa49ef3aec47620c2e57c1a08ca997907ee99d645e3af36dfbfd31bb4aa06bf15dda0d76f29defdf4fcbe1ad2a917c90443ca4d93c7a2f517ef6f745f9ee9532d40cc76e5bd9114ed209682fcfbdb46b6954fe0eb9f62d69f76726209377e681c619b2b60eb94700590de0c5a38a408007a366f5ff88e5c249bb7af4c16b6348204f6d735ebaaef04ddec718bd3dd6d1fe3524a055b39c7be3eee550ee09aacffb4dcb2f8d90d4a6b6f7df60ff505a6d73adcb22417ce490fc7f0dc4a3d70585ffa438e8a17364246c303818c4bf3dc330d0a000c80bf36d94853bc3b6283fdae380048566ca35b4e55802a95cd906ca9588da56da31418008d6fa32abb626495117f81ed13012347558f1ae270c7f1eeab679334c3b9117315a3b288c40ede70214b15e6c77b580dd9766d36d3950af564bb9c9224b3c66ed7d211b97d3bbf16ed832148729f3ee4cf1a63153f21712605d5530eae2f53b18a96bc67dba2fcd570eb7054a65d872aa4031208aeb135282600c7f6daa950801456a7d01d8d07a9e5ff606b9d7053d22f3dbcb6d31b62f773a5882b0464f3070c8c529d3642165f17e629995259e9b094992f26f9a83da40940da25fae73c738f67eb21fa4c2e870800169c8883e3b5c0442266470cecbd397409883beb04eceda7b92220f370335d8deabb9473442989d3bd784b0b737d2b887c90746fc0dbc0db29d295ba81a9c9a568ddf7acb38e206c58c6b8530a5c001acbb1270c7903f0828961e6b40fabcee8fb05dd94eec40a843620e4652f6635e77d0601a396f4c89997583ac5fe71b1ef4ad4b52f3c271bc9b400a1b5df594db22d978967dbb2cb1872c369653f71255fbd429451ec3e8ca1efbe30a572ee68717591bf3f0097ab070c171f3ee11e6857c654601526667da0488b106476aefe63e5ab23cf9adb8f82eb44ce973784416fbdf3a62cddb258059b43d0435528a0bf841dad7a9118508a04fedafec935ab78e4a2cb29d57dcb4dc4a0ab133ac9002dd5a621bd63531ab07db64c2e689568fe8d1ab1b6700973379fb9968f337a57bb02e120fc16b5d59ed33917e72cadffc80a5320c80193c9909b1be42491afc06a825ad0880407fc1d8db9b6d11f6be3678b2283f3a4db0d00ccb66b2626b1fc5a7d837b4bc921ca5904b63ae4ef482317f8398afc2c4619a62f57bc5602c3eaa3290139f7c83c10814c453bfa48d4534bf258e44b12158661c3d3794561ebdfb223cdf1ef311ff86a9f3637fa2c1b74398661c815583e1a642cb340d00ee8bff18ac2dd499daa1d688e9cff0a5463e9d6d28f32075be51aff268c69181c146cd423fc71324376ac97374f4c40932ec811fbb9db8633379a758c44a671c6ece3f59b957b1fff1b79f885128b1c6ba9a71e8c85e1c8ee0b7592a342e9b6dccbd74f9822b13c805d53e0741bbb1d67f4420e96fcd38d8cfd49f804dc1c80dca97bfe0468d39be6e771a2f403ce8b677929bc6e395d185661c3e5eec21f5919d619a71e4995e245402986ccaf212311144664e6d51692d3a18eaffbf16359154e19568a7cf0defbbfa21e0ab2cde56a83597413a542d14f974330eebced71a72b6cea14d763144dba519473805bcac2336bb416364446da00cc76cd0f8695cce4772b274634e9878654561d5d409e3699f1ff8b8dd1c3e8601cd38f2d608ddc03cf97e00c4adf01e1f2e6b0687e38fda2376fe48b6837dffae8987ece72733008687b41402cdaf4dddfe452fdfa9d80f7732aba49ab5779a71f4e6b8ab4235a83e259d549b3620ed09f9c44205eea6c75006b0e731a65b822a431f658c6ed494b50bc5746bc6119f47a400237ec41cebeaaaa446d4f440b83de30885d67732b617f7b9f26d129a2033e0fdb1ebb66d65aa83a6b5eb72c631097d3ddb587a2adc9da59551e961bd99b3c1f5301516089e6bf2e5d4520371b332b48f39aa6e21dc19d19fea18edae7271f86f6d2878b257a2352046b7280f03b48cad4af38315ec142557748945fc52ad3434772fe2136cb32036abd87625bf107d45bcc95a19f96269b2aa3351a2ad2e22d5ef64aefc8f92f703de1e5219a6455786cf1d688700a5c169f0bf25549cde4e3a9d241f870962eb6c86fe4f6f03ceab5fdbc467a5872970d23414bdc4b03bc175c14915b2497c4c8b98415604f5ea0447514c86cb73c75a4f724093436627f4252bfbcb366d88eca72955b2b2a6fe98bc6b7715877b634b36ab6977a458b955de284ee22f1f0ba40cefa48887f073107bdf2c5152692402e711cb7195ab18bbe38eea8a906b89213f8961304e32ebe80af21fa52c2000676561f61d63022ee31fed75dcb4c6ca877392e392ccfaf8afd474c5661cf6f397b037d200773460cb6d09884499ae486c95fad26a0fc7f2514a09720e0b5156c348adfc90799f2eb86efd4b919ddfb5be12f875e0c00fa10009becc94cebc818a56b75d18e09ae4b9c0427cc49c71460560d1d82a6ec779ae86a6e6105522f13a4ae8d3afa8d0c2c4f70a4f1fce61b9b0d4399d4244edd5da44d18b872dda3ee46f0882c7fe5d190e57cdadec3b216c6c2754e89c5bf932e88ed2c878e8b0ce25e98a154dde6791aaa0c96184a43aa4da2b835db485f1fa4f7f6c29bc5c9e24e70405ac120f44e9fd26a91ad114f6e0e481136b471c683e1db7f1d6c38f08e1dd729de455239042b10e34607fc560a8f03146d227af7229ee3fd4bc5ad80d951dd84e748e29e8400ad43f09e3fe5c9a6ffb402de3d1641be69abc9e28680cb2d2c2b0e324f9a7ed579ec935fe3cc4076a714aabd7c79623176f37b53c8641f57fb11b2f6eaaf04013e7cd68867e09c13bd9bb28b0b60f351703cbeee3ed810b7e7ba161a448695779464ee68960936cb2ca59e8b6c8fc643a03356d42d82aa91f0693b561485ac0f58835540d17c6ee0f1af6c58d35d586face8ea0b162acfe091dee4c46080fc5563f26b0db9736cef9bcf9a72f415eea56b739b7a054281d7b268c9733a9cfa148df2828ba3979946a178a446f109ee2c06a290fdbf1a12038f937022f94e3d7c3341d3d4f2aa8d50ded7630821ba6b4503c692c4779d60cee4660b6f3ebbbeb7ecc4f60476768f43a252650fa8c1730396b8f651e39e86b4e1e3c728cc08e90ddbbf0e090724b6d5e5b1169f371197e6705fa3aa5f37a5b46420e38d018c8acc74d7c7f9a453c53cba4b825ea4d604fc4d1951579de74c0a1bbe9dd64c8202611f8ca9b6c2345b363137c1d88e3ef67136941a3309ac9f7efd7912cf130eebffae2092e3c2e1d2ed87fef4e7425d36081e8b0a5889dbc3c2f3a22d1188d307adbbd0e288bbeec422126f48c3159e3a015919b3e0198e4c618fc889e89c896b0a2a552c4d29b81da6d1846ba02fc9ac1b5abd96f1dda97f12ef1bed92d1e61c475a3d611f9b945f459cf6051a4c3962f70af4d525a44a3106e96ae58b28780d0ab0570882472d7847f465692c34c165793e819688383f182e7d4f94eeca3fce276f6edc3c042b8e45a3ab5ed7a4dee2e01763012d13a1f4eb904808569327e1db50743821af3bc32b22c2afc2829dbcc1b67b8c574956511cf4efe0d519d4fd84cb56cd7b2c2648d845814494559cc1268d64bd0aa13b007b6622dd26415a26ccd11f17917bfaaaec38ad3f160876cb6a6b385b380b8be0bafd51a954a5411ef5632a5830bcbb60a6c82a479ce8595bf6f00bed385e895bd07d238c68c958c537f0f4d6865bc606e85c7a46f35b9b1212a0f03328361d144bd85bc148103e71a72dafe2a70562e4a0d59d924e3bf3837197f333cd5317f0ce5154ee03e6488669b5518bb140bc4d4bf9972f0af14776bce86b1d1b73954de37e62b8003a0aa4e5628bce886dccae018b19ef4f504696d156822d4778f72165b9cac3788ea211d2d048650a07947e94af77d621b416a82de9bc4b8138364c3ad866712cd461c827f819a93f0c472da152a761b58590e1307e83e696fe15791018420be5622d9ab4c31411ba9461ee527f28839f5068835eb08f74eff2214209a4b281381962bae835c776dc52fe88a00914e2297f7284215e0f01e9af60a5df1a9fbaa1ccf9494c2663db31bc57d66a932037a466ac7b10e073e66111655296f50f03c5abe701f127f4b07f1a9dbdd4fc861b023de0ff6be66a25b03467c16d0f258fff2dabdb90ce87252b43e75f928bb6e472af96f1e07cc7dc18003273b928bd270ba31b41a8dba814d764b157303cc8a60fc355392e5c5de170177d7af4847a0ad5da9daa9d42d5a00e30a70aa89441c30e22531b67ecfc5fb2bae5dbaee4256af265cfa76594e538c7d2c8327c7c4f67d347fc5813037c81c30b288ebfe2d3ac68cf1de49673f3c17539070fb36cef801b6cc2d44aa7f45771ac15d9131ff3adbbc71132cf7142d207610e5cdb86e7db35394d757a6903bec303a7adec186d701a87ac08e0696904b61c6e32a4e05cbd5c4f5707107b5278e0e89ea8ac99daede145549d01f3f841b12f467b32880380d27080be1ea9d8373c2b36115595df383a637f48b9a09c7eb65d1f578ddbd69c685c38b8e3e40a85c0bba1efd3cca764191e1d84c0447976e43f11d0dbe61141d240cb051c36d12552259d6a10db39ad995bef9ee14046e70901b0a860d4a3131b0d8a0d1140f09097aa540da3bf9aa9990a8fc420a6cfb64d6330b3a010c114aa638cdb669858cb4a3140352876843b3d8ec59ad8b5207193e09b711f1e42a56a9793a9680ae9954572ded55662a815109b6b858f31454628da666c2dc289ae9e781d468ec30d9780fd6e28326a4ac1ef2d22d783f5d311d70a5e16caa28f0239e73ce2cbf1e4bd523cf9d2529ae58f27f96f3608c8c5ab2adb80ed1c426e9a2a4950390df790aa1a2365230fd60002a05fb333dda508f0dce5d792af142436dd7fce0c97e35bcd59228bb5fe7eaa235b49a6144489ad98aa0e74e9cd76fea1b0162edc06e96d7aed8424c48285bc54e0640854d5d7d8fd6ae76190c50f81270000361aa8f248fc8a1ee5e9bd7b9c9d984ccebbe61003635d967d5355f872e01b0e0e0c03f715fb59cc38af5093221abf5bb7a0138c2b6815548ea35f4f701af4706d41bfe02a48d6f3439295a8ede7f01fabd5471abbd70e55c3f7fd49ead75503ca77e35a2bb419f675d0ffde93c5b4be1beb8bdc9185e9283285e09e451e8d894ea192128cba5fcaf07eb5e2f402500570d2c2abeed44a7f70a24eaf5fb895732cc93addd30e9e9ee746e389f88e4798c73918f1017f8c3df34ceec50b873f50a98829a17d46ce205dfbeef8e5d79ced203a91e75fffc057fc5e873991a2a6342b557f8af8eec5831c4854c2fb608c99646863bf952c5feace752952c405e2f4fec2bfd6a2b838afb5d6450ec3978bc1b38d38b9fb8e6d7bd2f7390ce7c54c4e543ab548f2e7ac4204b013467c88631aac7c9f04352254177c792169c34a51220914bf11824bf09f41e2c6fbdce380a2754c0c5db7f801d7209a2919b0f9253d0ed40cc71ca84d8e53491b793949396e8932a464e48a7350ec8378cd710b408037f82e41c0d3f1d01055528a9e446d60abb11c6df8f617e3d91fe09b847d9e812c4789bc885f67d6662ee5eff09095a8c2aa307411e00172c4c7a8051234963d76bc3b9fbf2ac3e7cf7b197a5a3e6d35292a87cc34553194b7d6343ed4ac8c7128c5bdde4ac987c07d1055530ab0ef3c47acbd1a598993bcd9076a5eb1ea46d996fd06235a003c8efa44090061b1a56284d5f9856522a824698d028592c40286035d93222b2315842eedf83c64dfaa419ea7d3f88839779fc5a6a66fa89f870a79a0552a9ccba0bd0af9b9254f78c3fd3cb5e70b424ed7c299583b9b28217a232aa078bf68d5b5371e6918fc3dfbcfd227f666518abc0e9384cfef8c95952ae79cdc8478fb23f09f77346945dc7c4ba0b69d3a6c301e6c637a33cd56e310c403702240717a5cb0fc01117eb4e8b19ea71a58f8023918501a375db8d55db5944fa9c82fbbf1f44c0aa411c81d86347b62e92d0737cf646e67b12d3396a3bc4b924ff1af4826b2bb559f9da9c4c1afc1a99387a92aca2077d38d49232d13d9f2f13c91805ee2d389c72c676877b4831d2b640813525b2d7e01b4a82e7bdb31b28ecb102fa6db0fcfae2dbe5c1136d16d7523d966695217248a34beca6803638d6aa387d15771aa0cbfef1adfe2973af6e63739ee1d238c0e5e3a43ba4818e626cf3828661d440cc9d8dee2b644469ab092158b90438cb1e626cc9ddbb504d83787e6d13c978a2103762f14c0afbc9519198d04591e65c2376e480c54f712ecee46314173dde3c7e758b222b0f097a8e220b3f62feeca5874dabd799e96089651e0c72775b6011745664f1572d4328697197ed04b2bc3472391d1bae0abb1ace14178f4ce4859def01704a3dd9e0603888a2ab08e2b2f728c970b793eb4bd7e370debd3f306008f287a360ae2182735529b464566cec6077f241b957fd8f99406a02a093ae9e9843f50795a3dcecc234096b3d27da1c1362c30dcdc109179323761e8acd63fe28fc563f7da4a41de6650dab33b68d275d2b4135a2800bf013e803113dc9b4917549301cb9219bc662d4a192b3243d8739bc758a68adfc09efa4f34f0a0187cf8da87d7e3ca5b440131a25cce2f6e4453bd070a890fa00d3a06a16eb31bac39370ad74a02ebb2346492317f3671c0d3e63ae529715c32ef78b4f5f844780f179a1ed7555d2c64e68cb917ff50d0b2dbaa5d19b6b7d8adc402597eb75600518710039038b5931931b763aab718c8f28e21ae1362cc9f8b820774cc12f8483194b04afb51fc8fa539cc2397f067c517567808559282e5f0f70741a58cc8b76ced0319d70ae500b15297f7d7b520f0985f4dc85d9fdaf5ad8e65b0744c507eaa2c01f327f36cd418c10947ca52217ca75a0f4603d84ab8ede2c2b8a590d9128a63cfcf0f055073de928c98a750ebac670d8279892b14ea1849e3202515bb04780eecc7c44fb462bae69e80d6dcf308c119b941f4b497af51773fb108a97b03c4d9df490b6188d00977400ae22ae506fa22b1248e04841f290f6d39b6805067ec2a10020b3824f8129285ee8f1f6630aa2369bd48845900bb4ed529977633bcb8830c9194217fb024c3228f89571543ae80567bb85d7f2f14d7f21d281398d0aaa8af297ebdf7cff385e9a2817301907cc4757b1947c98ae570cf099560c72792f01b04ee7064be2e185656f822f16cfcb620ed857c64fe18fe8adc6bdb7273ad2bbe0c7cf320c073afd5aefefc89359e30b0d78fb853d514a6dfd3fd6fa832ab6f5d79fca3d54a4d36b4d16ab46f44980d42a4512fc2d86131bdb0aed452c61c7b0cd2575b158a65f3a1c3be85b237b8aeda9d8ef0b73235ee68ba43e89c8aa7d5cb0f967123d7e62c7329a46c3349df91123cd6c8c0151c50a0436e104b52f95697a6e7c3054f2431c574f8e9fa0cdf5aab4f94ccaa532a345f6b04fc63e883569920a9f0c1b95b211d9b64bb1c15f82c4a1002c4c2bee69596153dcd452d897f58f31d04db8eec9db5ab8578be8a4b35cb57470a4eca89fad8df3203b11ea0f30e0aca9600d54cdad1b11620497b20b4d5d5668e17b6171418de5d32cf12bd1ab65c88bab223ccbc06ce570542f3d356e41f7cd9e9e78a5b71f660365b2b7d84870e89ec6fb6c9de18525e12f94254064450df0cf837ff9fc6556fe4014c09a075dba1a43edb0ea9f4fabf56ba1358b9ebc301d2ba792220dd55bd0bcbb8b9759f44694710bd3097ff106b6d11c4adccf4e613d05dbb8c10f6ab02b94d83e83bf3a0c0dfa9f28d25f3aa4d7422bc648f99c6ba5be9134958c77fb2f97acddffc66cc99765147eeaf9ea5d9cee3f460b9a4b02d75cf76234acb905c478c08232b3deff7c7bf25df6ed4b508e4657d9bf18ff86a61afe076f9b6ac0fffb7a5a4fae9328c0c91e0152aab47fa147690cf6d933d923df5a015457b176b2b2f2fbde115eb87856649846512ca0594187cc06c0abc5e331174c89e9daa6a07afefb5999cedcfeffd0c0714dd02f5964464326e5d54fafc5f44e7b45c3327ebd51ef84a27d5b5d46fbc4686f23303bf940df2a4479b4eb1b96b3f1453baf391310f7ce27df9c278065259b34ffff453c821281ad939f0875ce296d36d308f1821982ffdf2d1c0a9124d339cd0373cdab1e1ab39822150b29f9ef3be2d99d5a39673b1c9abce0cb064715d0b011ce90ad8aaf3652cbdc6bfca2744087b93b1762fae0730f6289d4bfe64698deae84007c67c15d60a89829b7316a43cd79a9a147a802d1a108a5df8ccc7a576276cc4200cb12b6fde43cc43da4620b957362912cf6fcaf9962701759d48c55beeb13e1941f11b22853d25675d0759cfecd74043bcc32da78c879bd133ebac523666a9d9adabf6e6f0a99af3637621c5e3a36642756f980c3b9ca7c3884e9c86eeae042031cab63c880695c95d6ff72d6f00c8c629da27f7f20508837c04c51b1ecf708b2dcbf536f4d7c05b031072fabde9cc47d11d49c2277a9bebec0967efa72c8e9a49e7aee74c11693ba81491665118ddd4958084c89df49cd1c92d8c2bc0a933df5f2592e6a3a3c5097963b3d2b1d4524153cef46e0dd1142b45fa70798d1cabc660dae377f5be74130476b73b224e4a460742e985f14f5b52294d0ff2fe3a495075f74d904bee48562e65b7981c384f1247dda918ef777e3be6b45e5ab61f6e1b249b0659fd8bcb0c813c0d40e9a86d9820817185ea09bb55832f1db9af5531031f7f2492333e1a823b19e7762c701a17170a1e0217fa7360ee1a511fbaf8dee88ae53eb49d9c8574807ffaf3f1c95704042286df338f089706841da6fd50f4e8e6f2e3c42cca26b98fa3c5d273aff3871600c21a36e4497d92b23a04850ae55d7abf5a4f42664d36c7cfa6b9eff4786a1fe44eb4e25fb8cb552c920fb6483b491b80d987956703880c80463932038487c7e5e0c216f7ec44f7c30b45353f4b4d68be5ecb9274229269b85f66e96f7740c4f6c529ba129de3d662e7aab5ba2e4803115726527b13db78e1b9679aad883b4f848c9a1db77a23860ba33b01189726fd793ebda07afb428882e1f06c788a4f9db59c815ae1c7ffe4c28f9a2441919465f5501ba17d88c34162cffcbc8d578ce3dcd902074e672d41ee0cff969826e2ae0cc4b91b8aa852a8c4afd9a3a2822f99c43c6d6f75d2dfb160190ccd0ea6de18373da16e109ae7147c6d6c6428619c263f3e99125861bfb76cc33cd31d0de7bf5795e8bb8a71313935b094348617ec4ad5657bb78b3756e42081bb8657f22c30e4f5f51495b2c89923d1acd044a3ef97b8aeed1e92d890f637205516584ecae84234c2be2860a159011d175ae6adbd10bd30f2110d10d49b4e6dbb9b3129b8b79930c8033b8369994e667900393295f4411b5142ceda6a7e761f701baf47f6a3080b4416bfbf0226a884db4748d82a4a6175dc082731ac8d76b9dd5ba054a9c150254b460440f99e515bff489a2cf9e0a3a7779c6bb0ec882d3ccbc75ad492a855e4e58f3cdbcd4bd219aeeb1ead49f46301013a0563e4a35b6f8ac4e5d1600baea1db625ac2f928f7d13dddd4f6dca4134dc924a2306030932c62087d0e5c6f1505e4fd2bd9bb59bb01732814030aad9a1c494e6298e1b1c2402af2a5cb99af4a98869b4a23b025022b489d1a85a8834814e749229d830a61a4840b09a461b8054ee000c89522d25f5e4d562b0d4c852d9ed77b316ad853803c4e63248e0778f4a03a13d3e45c5e51e3565ae1c904a357e5b8f4044914bb3753f637c2a0845dced065b470a899a6d5138333b285fb1379b5859cc26a73700b5613ff7cffb12c04e206df8f7fa36e06b7e54643332dbad7724fb56172c00068693ce26b857195d2328a3c15d0f6942fdb5ae7b4900f6fbe457aabc0d574678e3be16f238bd691070952f6a301ba7b416765f52a7b7ade7a5de8593e4a071204a60fb8b8dccac986fbbe68cc874188964330f7f13e707e0f05781cf50423e3f6728d0e1b03be8d56443a3fb5f89aeebeb9dc1b271904224af8d39fc2f6ba542b89de9c8fefd97f0ddc0ac27be498deb68af940e6ee13897eeb469b577457f72bfa9d026d94fb2d4aabf576d883bb85535c97e593e7306178b37eb676ce82f45fa78417534025a7fe84f5bcadffa48b9a6c75c5b8c5df2fd8b3960678e35c8474a65f647f34afe9616e112025c92034951506ecfbfc3db88fcf381ae4a076195a17d54a5554d3ba56a118d009e5a021ee959b3a9ebd4b239a74c590c15afec000fa7f25f5e091754a2f6a925828f409cb51c5a0e1b5e9808d559252380ac7b95a0c3f3e004ffab5f5740bf5c3ea7a6e2f79514a225cc170d95f6154b37247fdd63fbe3c38fb116fb81029c798362fb21a3714b75b34c4c2037f45a635ff831c512b70a98ed2e4277c61945c9364a12cff01b4626ba4e0bc2af77e571b05726065414a8b6876d84cf191ee1c35c5d571f9949818d583a5781874103cec56e64c268a670b55841a873a24bd8ef2987e7527fbeb8aa35cd5ebf1399caada5ef15928a06c16ec7703abf85fa45c42554d36fd98533fa80e13582d8a1bc793d8a2be34c347138f682842ee069e26ca9489be0e3ef19d29fdfa598c5416eabbdd5e0571963069b001acccfc1d2728367c4235928663814318a10f70c2167ba43744d553b0b7bf073fe29aced95b3bf2c4222e5ee2e4dc14272c05e7b59a59ac9b73a90a8e839793ed3b13d88086d09b68eeacc35fe45770e1dd0858dad3200458b2ae084b839d5e66eab58c32d333b8b0453a08462c33a372ed965221dc9478d8d5c4cfc865282889dbd86480ada62108924e95d6a281ae30cf5831d7ce560029f22b6c3ba0a51b1e872fb2662ab25798409bf5b48f04c98037cb87246171224af2e8a37160b540c07e8d5c926ff113a60eb673f0ca9ab6b7219ff281a9534fe1f9e8fc1380353ff45ad7619a8bf4745760c3364152bdda821fa97297dd82806052d1d504fc9574692aa25b2e4e160b48e65ccc9573a4478ba742d8ddb8007435dd581492286fb85a13eed4a08d96aa0d40b82837088f8c456eaf025b910d2733b14abd5a0575c5813ae56b1e000c4a0c87f3ab681792c788621d08586bb49436395d046b066e86f9ed2e113b82cf30bc44561e01b44ba89ff779c802b201ef778d749ab42aec97a1c74af81df7f2654e32eea6694dc2ac39f0bbd1087531e9a75851a7afb162d7bdbd80343cc2814d10c45b04051bb1692aec32d8841147066eab0dadbb848f86e9dae9adf2794e9fffa0c0051143b55cc373dc5bd63fab5a59ce8264891a79ccb9091a0945fc83f59832ee345107329ac43a92bd5a5fa216f57be5e936a28bd006375785ddc75d313f23c3ac4e9980746b6b8d8eab9850f1ca46306dd5aba1a8ea79de6f334b21b6e4d95332958a318e3daab2425cb0bf7e00caf9c8b39fd77da59d9cdf1099127e067bcd87dbdab4cb0774f3f1ce992ad79451cc4f36f94e21b4e00d4541db802d47f2242c6b929c5df512b3fe77fdc455014ed90a0d2ddead6fb8f2922f9db39c12e43749031bfa9561fee61b3723b997a23de9800711fc7168068954d641cfb319e7c2c95662693bebc8cfa67fad26ff58e43fa975fbf2f0d110a9975877e139c3fea875eaf37bfabe9434740444888ed0efb5155818fa3a9a2632c6250f106db1d7a90cd0dadfa9b8f1d2234c1fd94db97bf78b8c93c3198c078d9d92729b09559b1c124769f2909ae4751b031b9865d7195124edd607ce14c620b54c3718f64d18f90f28ec363eeb3e94612b5857fdea838fef91188adc54fea9bd6bd16075b62662670a490a88f3eed222a09775bd9ce501d2ba41fada5db657ec4b85410335286b120051a2d05bf9c1e18243eead860c413257997840da5bdf8deddd3905ae6e9ff3230d0ce0f184483bfb3866b02b389039e07c83856eeaf097efe96f1055cc53434c9e8d78fc37bb6d3536fa4b03032e9696af41def658c05786c18282abab17058421c0e9f800adf4fba34a467afa55e1df70cff12132043a31115d75acd0b94a53afa4871dca75efd738630c4974a3724785c91e17aa0e14837f732dfb849cb0d6141c131c252a6e31eabea3db1ebc5a54a65a2798df059c4c54d3abceaf5c9a0bb116e1fdd40c2d57600a2f4d7ef1b7477ccbe4d86ecf3a5253e151b8f709a303e303467badd16ac4a18854c514673746d15e44590f4682f4d8b3df92062f84e909529b4481f4e1e637c8a7e06b05288feaf715c3a0d189ef92efb4fa6484a6ca48f7c818c4de2e0c6a2e072255e916c3c483127201d3b1619d4ca8c05911949f54337ad357f5d665a0def6ac73228606ee03c22a4c215567df632e4c1adf1f34f68c917158fb514ee57c52f76cd1d3e90528da3eedc630c380058bb1fa5fac644597ff5000a204b97ce2890be2fba3702be6d43449ddc21cce6d19a0408e9f38090e9e6c6c9503d0c97b549712d2f35638991de5f7938b7c9a1999b6f824a0eadb686f4bb7035ed124f389967d3764d6982098f0d28c87a702f14354d03aa69db9a3c048fb8eead5b3ffbcd21620e610dad556c1e86be88298105df471c938e9edc00444cde3b3b8720779d93f95408903be91023b3ef83c6592277a17059996206eb2695b675ae741830eaa1f78ecdfb9d9661f8039b2ae823178329b1b9412ea6ba4f7b5bb0075e28590575b1b5a31ca5a96e5b4fb360c113f679b3bb7df8d46465233b4c98e20672695b141fdd3f0acf6af4a71fe5c790137bf64c9ef3251fca61b2319cdce3c346846af39ad73f1d267945fc4c695aba5b8d91c5061d37ffcefb75115990176447687c19be2b550cb444653c610f4ad0cfeeb774d2bfe7a981a21b176784200546cd919d6e88c89effe6f3bcb65b2e461898201dedc881af29cb1e24877dd174885339b7132d6756e2d9c9b987eecad04c79e98dd8af42063b682e00bf42be8707c6654e914fd4757951da9a2bfa0fe73dd4f9eaae128acb6318e522c1c20eb413dfba0bcb46d0743ec4df030f51f9c4ae0fd3cc13c20eb35fc547897a686f594ea684a51759e1e5d0c4bf7463c28c6c75e295c339c10a3f55aab41540c77086822a728dd1254179f95d4ea72c458da71c5ffd99b74ad94c60ea1ebc5f70e6978566e17bb1e9316a75ffbf097b678a4a9e1b8ade66b44b7010138bb5920bd604b6568cfadd6ec8602f92e6b65ef72b88606688bd06dfd4be002a8a132af0b98504bb33e68429bacd260675f48fe1497b218941adbc285f39bead824d15f3db35653b9103194843e939ad60ef12ec18627c49d31f571fba984a05ba50fe8c25013b0ec702391bf3f0831ee13d21333ca82bbc42925aa32c9e366addc4bf07c6e40510e293bd8d3f79e43e68cab852accdae9c1f49ebd825186ea267cad88997d8002f4da2730b44dda7d9d76c652f1c6b6e20aea846b4bb09d04bbda2b3fa452c6071fd1b38f41346436175618d124ba5d50807241077bf5f06f1c16b7f9dfb4f2e103a86e1ca1d81b86c1cd503f25f5339ffb53492b0c6f3e3c29aba46f4a378d786e90ee2ee7c1cacbc1eae718f460aade1b1b1f6ab0b1e981ab0eb4cd0cc14a17a19ddf6600e8efc69a398178286c6aabf2040112a6226632a5947555e71db21059b83837e7f5b97da2a77f3bdf70470be4ce4ffab0482d8c394aee88b590f97a47d3cab03ef4087b579463e380347ed972466ed7d2118934cef58a431434754e128ca286c70ddecb7374507ac64cf7ee876fbdaeaedbb2ce4cf801e56457bff28b258c009dcdda0b87d0ed68317e02cb4fe945bf69b6dee6e76aa1104b24a097656efcbea7ebbbd42ad8e5df60acae4734a9281ceb6941844e2b7345a382cbc603c1a62cec99608e7b02c6b6e140214c14ab06b2097e99b8b5eadcbc93749c359b99a33b52f6e01fa5f5e76d1409f7135c070d10c4596bded43c2c0615f720346730adc01a903e5f7ddf4b3c0a7d26427a7b9256a995600709ce55f84dc45224f53062ef3a0a5b285890d237116fecc5782982040829b5e70927c26d192772af26507aadba66a1c263e2c2fbe7a099562cfb9b07cae0595b92d7d3d0eaaf2fe9924ca39d68ca762f991d0a5f717960c1d9f924e891751becd6244dc792a7be9e4558bf061001d981c40f82e246074ba7feb44b4ae33dd4e17b59175317d5c001a2bec8952eacfe735b318d07a79a47fe523d17c33b046e4b16fd0d2122c8619549d1a064183d6cbf983041f8bccf298171392aaaf99a2c27c07ace33002f8ff2b7b650bca8b025b214b972f638dc8a3926cef14d6ee698db033aca18c80903a33301dd9c134844971a0a41aa6442984161d8564c408286db8acdc1b441408bacc5c22960a11e687534f6537a4d25851d02542092145d2ac10bf597f2b774b67e246cf35ab1dfcba6f0d67f0d69cab68dc2eb5f050c6a097f1d8a0c9c98b02cd2d6c1481dd985be99d4623de43cf592b4d83c447dfcac0c62f610a6e72360554de5c8e7f6f26c840a4071a229d4222e1c34238797b04738065ae7a06b5c607eeaca55c571ca94d2edb4b6129b8b536f3224d04d0a8c94158bc03d173f62cce4f222cf2d25a49a6291e18f24e9a395c28e0d0e1e1dde9c82a886c6ccb57dc65b6b87a250cca9e96a52849c260d42f16dd1298cf1ae93cfd32120a30909a78ad52d40e8c922b312f6a7444a50ea2c2b25a9abc6a9ac409aa5bd251f919c5ac23dc1e9ee10779f59fa35146fe3635d3cacb816201f9177585c58664f7a0d86270b3d697a272024a5ca2b0047fe0335f3267a7a82baf01910c97a3bb147d6c86a97a5c8c4325bcfd2ca5187cacd9d79daf20b925367d1c47708207ba4a9362e8a0ca1a72d310484feb88eae896de41d347e34160496fb621c0204bd2160de853d47650391e15ff796f48391e2dcfe4693c4f516eb30c2ffe6d10cc54390caf452e54c1579dbd62eb8e0201d8ed43abc2146fa38c1d00d4a1aef500985b9418a005f114c136225ca0b2fc0af7d6c3da0ba23efcbd19a296e7d18a20faacedc8e6888754949febcae025d0f88e52deaa24241d42650d5749c136273b50cba80f59172022921be09551e095242c56898a20175b3e9a1b4f29d42aa070b20f676e797758694f5e53625d1dd2c00ff6c0b3943939a40c62b95016777e13cb1b4a3646e9dd80460550906081550340de5da36673467660ddf92da0a3d8ac5c20ccc436b0f631a0110b391a29170bd099a9d62dd0efb02cc68e0aa2dd2d393cf94774c1d135d7c139adaf3bb55a7dd4f1a4b408294f01ec5d3d6186d0158a178302526b2ffa40b609f5cd8d722b1596c7fce958231a56bfe98dfb89c0028bb78009b2cf0dc1e0dfffe6eaf765a73a6fad71b58e74e130956d755975457d010ae9e07643494bc978efdf38011592c93d3a151f17fbfeb1b3c73218a4fcb7708fcda77d6508fee0d0fd27c29ddbc186f2da9a06e2c25ea7b4698f19d4d2d6d74fbf8ad610b4300296e150792f5dd312e5c8cc41cd0cc72911d6f753ab84df7ba30229395509f72a6da0a07312667a961422c05730f6b320b96cd7dad5ab6aebe5eacc8bf07a6cc510ac1cd426db52e548c2389eb6604ecb4c2f459580e109d462be06f3b2a3d0a30c1d4147ca938427175b0e2ee23042ede0c02526ba1eae9643437b79a8acc4d4dc39c33e3432758c03657a046805ecc89c56a441bf566d08f66382f6f6e5422d54af56577195e932faea9d2683d4d59d85b3264a40594559f524ae304137cf16a89181186224af5215388cfd20d5cc4be970255371a31770a95c4931e4a804caf56aa867bdbfe18bee9eaecbedf7c04d07923564582a2c9ce7fada7d39563a073547f850dc2c4aebdadf2ec5f1d8e1ca653407c27aaff7807743d5dfb01c2cff23f101e66a8933a867d2200932d8d0f5461cea1624771b42144f5074522476eca02fe15e1a3a245846f8a1c2f15030eca53d6e1f8a834c69234640941d0751b0a20666d5a353d5698eb59a16ac88b2ef173386dc88524e8c19678644e9a08c19008092f89f318f39ea0d5435664c67a234187ef81dcbf930c84c1c73e40845617d8e1978386de3f914d8c2a7eab5c75f8b43dfc44d613574fbee170e59c44b2cf2d3086717855d1ae3d272098110d027663532cbfffb6d218f6d94012aaa49a2b790188b14416970c40715e681adf0b7eb771800f2b26d035c7c5f38ef23a99afeb1c852bda22b7bb6a3d12dc6175c26954b323a5d68200eb3ac64302bd36083b46b3206137fb19083745ddead774fd22e11e474f6f0bba0b04cef881683d4369e6729b70d1ce05eb52357b0201e010f6cc5ea5a15e621243b154636098a81d4630b6498ab54938c87e3602f4d109ef293d2473c0a2cb4b366d2deebfb7f9981517446bdaebc5a6c70d910c6b13a63592c26a068575d1fc2a98b4e9ed8ca34026cd937de8ec99efe4b3fb552dce3e6ba52607b126e66e18f51ecb2fe02850aa36b31dd9a1395093ed2f43065e99a697264ca7a2387766b51381720bcc1d6cb54c1cb84b0bd93f8fd6058f8398eac419f52ca4e3371d845f25c3c208e0ac619162d23ee8c519f8caa3c42c0aac332d3f2d5da87a0b18179511a6511a74a601fbfc9d1f9f695bbd828a28d94f00e2330035acb94d26f64fc4eb825070dfb8c1216d8a5f3b6350ae0796fb430e80cdab600840a640f94ac3bb46da733dfc0ec4879ed7049f99db8acce9bfdb03dc5f0a1c7ea6eb59c2544debf9ecbf78eb8ab9464d353fd991bc304fccda028cafa5e937f0a0e8df4d1ceac493b83f8a484a9d283ee13f6a65df0f02b70686ad03f464963d0b56d9119c3beea720c326b2ad50b86e2c828ca55492366df369ca826c47c2b5650f19f421d2f0f2b4d91e8cb7d4506deb12d61223e5906a449ccb5d4e3266fdb55f022cd99fc3d987f50e78cce58b51729f5130b05944da63dec208e219106bd63cfcb9da82428baae272b3ee29ab740e2a9ca2f0c16799453baf2b62d824c8a4ec961d8086f3962ae40799e90b76d0b152baf1996e8da4284a13edecb6ecf607780eca07b5b0262c71e3a402a4955283cf2c4cdb7de106fdca2b248a09cd2ac8fc696a0fc549f7b28403079dbb281cff88db9d6348f2db5757a4d9c3dd2f3410d49ee748961d06d5b61900b713b518da3cb44a54511e8ccf6215b9adff34b82acaa92ab70234d96387ab8b70095b4f21456dadc64bb0c00085a2b24e46ce17ab1de3c9a0e50501a52658c737f08c58d94fb861ca42f23abe2dfd59ba36200978cd135ced5e051b169a78b7f92bebc1c49d6b2e030b169e15b501f263aa7f5d5ee5a2369e95b00e6c8fdb218009c6a71ae6ce65c2505e1985fc8d243e2fd7b18539e230902fd78289889918c70d3e3d1430995bcd0abb5620d715758885e3f2950a9f82d1c0c518bdb3691a8d95d5b192b376ef908a59ae4e6afcd52cd84711791b77ab55e96e521a66b7f6f688a3be0daedb4cf204acd8ea5c8077707561fb6021856b76306fd85a7e1d31229d9e3c5fd9ae5f0c3e5b3af32f5069db8a3af4108e52d1792a56dda65c6cfc539ea87441fa4f0a0920cc97e6524a0cccb81daa5b14fb34ce5668c1ac84b2556078be8e9d55f431f60d9b96974d72647afeac0db65ca97b6e0fb794797654f3560e135fbff54072267b21c57f27d311b4e790e888d0e7b56ad294bdc21501e08e2880359f05f620554813f89855407deeb01228bc44c279e5d6dd179597c96470f7df6c30932d3689132a0791dbc49f3eac7c4d65bcc80a1b0f3e19f594a4ffd3e2bf1600c6539223e33856329b4970335e2e4747086716ba46376762e984dfb4c9d0677f6ca1527a7426c818969010b81b575ed4adceb8a9c64d03e8e8ea56d67aa66ee0681da3b37e7398f551f00c122e610d9b7041a427b7ea3385b71c0f2c3b44242bd46e6ad84fc656b823d9ff849c8e9998287bb6d5858fed93ef50acabede20a7c77ef2e5f5bec70f79c9707aa45d81740135b815ad2703b043291b3f40e3bdd3b664216e230fcb30948abafa1a46164c649665bfddbdb29bf817b87b572a797b4249e22a29d1ed528d6c935c334baf0406535287c9aac9bd3e330b6369e10b49c3980ae9e33fd7016bf87205c60f99ba1d2528db8005fecbe733bfffd4a54f5343050345c784abab321abe5791e610cefdc5f512ee907fe1744523095202eb132ec6ed5976f839672ae8d4e8c44148a904409104d91812205fa5efb0213d37da532a9839653b98b8e9a8b9528ca64d524c8f04dfe645045e3fb79d2d7e532dc8da9f13914a98af93c55e89bc757aa421eccd02fb42c2bba308aec3645508871b9814c2b5a34ff6f8473e3783168a146f6b2037e3f8bbb438cca98e9992955dd35e74bf89c4c4ac1f7fa5980f5bda640f51ee227084451a708dbf3b35f8b73626fad0da56589149b568a0b9fae15e0e672a08bb0341af252d0794bf14f19c77fe86785ed996161dcbdf088c499644386259c4a9d97a7fb2d8a00f947f7f2d937e69c8c9f971a9189d6922e5289dc2f453d6163bedeec3816dc32a1db3a9428bbd99f90140a2dfa715a9a57a6f0f70d365185c601fa15fc21f1494556891e9c0f4d11bb6ef296868262232d16dd2c7150f3ac0ecf30beca6baaae8340d40ceb11beaa49fd36e3021a45cadde4fd565042efe2e48fc8a3c0539f0cd17f024532c86fedd4d5ad8a909deaf3b2c2674a73e73a3540bbc0a2135493917596d701212dbd43664303e8125c15837ec5883f6367c7dcdb7ca8dfb59d58b15b020cb7644abdbf6132f55e882fc1ef47ad02f05ccae2a747d915737cea6a2dbaadef8a2b1d14bb2e6b10b10dc9f1daeb19e8bae0f20fd205521f2c82148440e350207216dde6330bc94b0a9f32ea5f29dfb6c393dd170c86497f1f8321667f8f34bc1b7839b581bc82a140e5cdfff350edc1af77f4b57bb085f1adaba3c6f0a4db2397c8ad5f4a3c15b841480a046b8f0a8669b8372ef389b1297e71e6c92374f0d55178d6f0686ba889ce2f454b309af46ef8d0b032f529e9bdc9053299612727b06dfd4d13f1e345fb1b5fb11d500de0295b2d0d8eb56a4ed70c529286314aed2d27882023d66abad1c4e0657092f54eb2c2fc10daa913669257808d71de3102a0e620c03505b76842988ccfc67e9a84e4137d34c23209751d17756a05a17fd4c4015c8b61a80388b01e4d70a9bbb40149eda9b56c7d0419e830fa394e5333731081a72fa0071183b0a1921e0c9451b70e52220ce1578b2cbe379d4008956423d1edb2f88bb284fdbd010dc959c6c5bf525ba2ca95462a9fe958f8d662627075eb80316bd50c30b8d4b974fb9235261572935c472a9f2c3e1ca9451b8d4c7343e380aad3cc05a09c27728462f0e50056028700683461d50802feb87289dcf49e5719e0f446e3465a011116aad2b6e4bb044cc56cb5841adae2b180044f76525d449cf6bc5442bd6d9871252510b088c790bc9692390a24588c03db06979556e0f72048225d4294956b025477899bc1a953bec653f5edca47cba4542109a8348303431dbe5f2330eede4e3ad2710bae318e9d1d3234238645c4243c91c497b38326c9cd0085f9e7fb16550798771ae2162040c5b131136e8033e48e8145a57c4313f669e9819266a5423f783805461ec6739b2629837a0d25ec54f75c7d4032968cb00af6bcf0274c18ab5c5bbdd761ebfcbcedb197dbe7641cde6194ae58428161b88c305999045f98eb48d3ef4585b5a505b58d0cab5f50bc2ffd29fe877da74b4f636f2196d0120cf640877dd5fa3d8bb95002c90556970145c4a18910b4e08558f9854c20c570fb9a46a7a4fb3ae835919999448926292986a66c3b3b5201a4540758d758efa37b62a3f4915c0c23f198f40c1b914c3525f3ad3298d1e1d272338ff16569bcf0bb8b6b3ddd9adc19b577809920f17049fe1649d44982cd6ff5e738b16a21327415c3b5637aeb4e957dab7712a8dc2b4146362e6581756ba53d4e537bf2f724d8864b1c8029aa8c2dab43639d2262e084a50c98f08f15042ab76599fba8b89d99df9a1a999d5f5966c5ba64f57ecc2771eb5206771a86d78f274434be63624f4b2b92303dc5e47a4bc9c25407d0b85ec203dc0ba815d85a564794594b1cb467c0c11b0dc4b04c5cdd61fe60638edbe4d70ff45d7a0aeeb2b45c528a2e7b306bdfe78ab5140922f2b1ccd344c8d994a22a4c623dbead08c0d8b25deff1385e1cbdf862c8f753103ed32d0a400a0356b4a13ddc3a0e648059bd7d0dc02b5da5bd2540ae1e3636492aacbde2263de4dd778bcfa6ba9a1c4fcae910c17f54be33b41d52e5cbffbc80df01c63bbf05c5eece503c859ce0e01418261245d8f6cbc742635f5e0d2400a6a58361dbaaeb817f59f187b90797efdad29995fde39d9196e67d080a21d5412e889a8f47559c128dacece4f003702f27cd8c984b1efde3d0ed3adbe5eb66c17cdcce77676591aa9fa0bdb54830b13756d3becf749ad20293c0d243853857523c8a96f03a7d3a631eb5acb4544e978558eb55cf10a3aa0a9415562e5145bed1041ad7cc00c183ecfe0c5ce396d3e96b877a4f502bf3b41469b5f9658f6ae47d139afe384af8fd42e6b4ed79815e13d2ec4c6dff02f79efd835ced007b08213961aa974996d19f911f10fa765aa5c56f52022769e6a31e35f62a75e2b569bc93f52a3590262ec06e8d4795840dc638bf8e7c974b26f2050b3e48da089fd0b0fce41730646c9e5a452c37de82e6961ae1a181d15b1796472c80d9e778b8847621f55bc241da6c18282aaa2135045683c8d67bab4153034902765eff75ac3bed9e2fe9a62e2d1b00086cd7f2ddf29974d667087251c89c86425979672ca16b74b74f8c5c95485a4d526c926e2c1dda6245e4ddc461070a9d5fd1ad666e4d882698fe7d37d641f9b760091ad6f4f24bc9463bdd187e860877c73061fded036bd49f8d95620229e7a9fa119919ae1004935cb0dc5349ba12ec61351878ecf08efba3b840017fea813bce1b644fdf061f27a351c544775d5611df213e5bdd36e3aabc0286da9507a8cb576f21e684ed7ba860e7702559521bfa9612cb9bc5915d63dc0bc4fa81b12d4d08a3af0013866ecdda2e0c4a867a5d3f70c2e369983ce5209bb12a9b51b1cd5ae43c18eb24855db5b5f00b262d0fbc7c2fbea378c5d205b785a95e8e20c0a88d367e6988f270de1ed5de10ea1d0c73b1edf2dbbc8e3499caa55495deb4835e84b11c4686f13c04c75010a6aef38029bf58efe4b870a6602f9c2d383f149c8693f797ed4692d37b59a41000075c70879775e0f7da90ba6e2995d21923e5f5ed7b547e464a836c81102fc6fe7afda0baae5a67543faa53e9b23db43c6792601e884191666e8c01f330c0e7a44a0965281f46c3589a8cab922a1c801f9193af851cc410c926d6f9bca4c6ae3217023a94627aecc6a2592a1b60d6fe9d91b3dd119911d9597dd5ec85dcd5da63ee8fc349d275b6b49ea319cd31ede314cb5cd6b5129dbd8553aa3cf04a0af03720aea56a95b51a6330c1f40e6fa4c1f92dc00bf14608fa28c3ad030e919f01144731b70fadf8520bcbf1e857795dd789953793e3c6bebbb0926fe0d3efb223838bead63f1417cab514b56e3a1f49fae21b81576c1dfab3ef0fb5f8234aba6197495da03a4f9e2d35edcf7319884d95658800414d7425ced812bed5e686a5243a2acc0a62afcca20806609e927d6cd11d6cc52aabebe343d2337403fff5bedd95934443d1dedd79e0db008d90135b0744e6d740eeeeb990b28f6d7de3cabfbbc655fe5412cb76f35bca29c5efa3eb0af269fcc3fb9ebcc79d5d5d4a787d577a33128d4d9d0afcc810cfbb401ed2affb718195dc97257d673e4db10614de3e9aa6d8f0e17d3d93fc7dafc369e78f046301c4976fd07b1b036bc67bbae7f72a4dce6567be049ab648baa2986da477e1718ff9a96df29dc231e6f857e40638eb65c7e72f811633cddc7d9ab5b1fedf9c2453dd637c18ead88f704bacf7bb123c2da040ca4258c40581530e462c22a11edbdb6857e41d431e7f2336ee26a7177442a19c6108d382db730950dff38bfddce27dc0ea4b9ff944de31b66a33a3ae2af4e648f373bbb6a78f66441b56a19e98a7800e2b2f1b2f16a69113dd33e136f0b61dbae88bf2d8841f715cfd0b73618a6d6e05a0e1ab9898d16c2aea5110b23a5b6034c6bf7ca049eb0b06695962beea3f192c55ead9b1cb569db89ae208498cc6644d73f51c214e4ca3faee6428fbbb7d6c0a13873d109c1049cde6324dc4e376f89ff7e56f433e97cf9e8ab9cd71e318b4b5c34706348a40e5ba800401c88116e88f71c9b26e75d63a44d63eaa159d20dab3c398dcf23db48f7964f287f1a8783c877bea0ef4cd0313ffcfb03579b7bc1dafd7a3a17e5a55df6b90940ca1443ee1ea35eb4e4accfc07eb98a4d9fc02523df742f8ad3fe8caf5a4bec2505ae183a23488181736a83db66de23152ce74e637b71f22624678764b761afe1ec76744f43723ddacca9924bea5f9eab3e53dea7f62415f240bd59117b2c5e2e2d5f53d6c9465f408f5d986a2b435dfa389eaa72c09df3d25990c8953a437f28a6011391296634158fc5a33a10571f1faccf8e6c349c236568261a729f7756868dfa6ecff210a0688df618f93146ad9bb8087d2a95c5a08d3471b4639777f544db145f0fbd34a505b151553ba434b65a11c428426db704a3413f180bc801c5ffd587ab57f37a7f25122bf3f1b08b3f66f65c053544834b25c623b88443a616f708d98d8b72015e6317fd2b5321192f8269d47d9279e51fe21d222fac114fb0fe70fe15947a5eb0582770c038ec2ec345a2f2a463d3bad027438ed7fea691990b6dee5ffec11ae15b36c2382dba55d4a55c78e2b719738e9d39d5450b5f53034edb96ec374a9fa810cd0b68c0366f17d81fc9066aefeb7b04708e32b4b48199956285085f70e0fcf5c3395b5182561a7736e5a4d17cda2cc240d27c318a3dfc414acc5e21cbe9627003d2c7a4405521366f11cca3a1185fa508d2bd71e860296926aa41a68af50ddf2b6aca89225c03462b985ad472981c52ac96de38b51e0cb89ee2ff1d064dfe070bcaaf62581290c15b1c9f05363a05e74171892cfc0b19fed8e8b0ad382313ece7ddf467f9e2a4fd44bf9c007647612ef610ccbde8aca832504226ac6cf794421d79fd93160187352583377d946849d2a8809827b4669616b4870140afdbda3aac212569b5c7e526a7e57e7d358df0896f8ed89d3ef53d6cdbd64abf054c8026992556eab4460c71b182e539c2438b51c09b73bc68966a97dc1d68cbf1cd6480d51b9b06f256cdaa2f88377fbaf8e9cc42ce37c6515670426d5cdbabeca7dfa188382d777094bbcb4c911f715e0ba37477c424959270587e48875833603d1f62bc98cd57cc85384766341fc6513bf39ed940280ff9a66b9163574a6c87e3b95a4852e663bb65bdd1ca16036c5bec121c6ba1c009730f4a06bbf0e97a1203fc1300860252e41a40604039f65739220d80c1c92e2a598e46cc8abf219ed172eeb4a8286ef4a34b2998bba67047b317566892f3e800e97823a361a69f48999351dfc7e59794e4b0fa9068a33945ed97503edfb4a1e961d451fa551338c7c71eba9ff530067646b8fa4f0b4cd0a98b1fde7d6730e06e3e84317c34205ce3f6d50cf26992e2da42524168dd98088122b9130074009d8c70ce5ea053d69b53c3b5fbd0f08655dab06df4bcd422b7f0877eefd534b15ca577d0b11312cef6d64675509bfe43ce72ca37fde0ae2577d3b2c9a97172fcbaaf0b6b81741004a63e2e8b05fea33396f6fc91f11546d02df1e9b85f6ad48480c7f9c19b0802ece9d2cfccdf8157ccc0ca6be995f901ebed92185e657f17d25dbca4f1aec2f12181ed121977d561305e129a1a0b89bcc4543d893adb874511a4ce454eebfa0ee542fb59956aa60859a6951e274d4bf9dfa61ae1d6c2d13ce38ce8c7dbc9207c58b8323187e1e51348b4837c1e0599f75287cb3f417cd0e81547685b0a53ae3a4a133e7c152f9ee303e3f8a2675d867a646767d2cd4121590718f8f0364f8435a4ae924aed396dd2447b1ab356e2856531dc4daf232d3ada15c9f18f3d9dbf8df8187157f0fee5f004979f056033c34f54ff3572a8c592cef6bb2e74b7cfd19a9525b81932cc63e57906941e3ed876c71e1922e700a306a6612946c72d1a961400896cc99e88d409926bc4b14f88b986799d84611fc368068fcf96fa4822116bf3fcafc8024382ba6c4f3f23671fa4854cb24c5c6b0beeaca3592306104b8f33ea60b0c24d681b2cacd0cb40e75ce2c8a3d27e81ae79dfa7ceeb0e018319a5e9ecc75b193e0d8b9f3ffc895650cf7f476bd0d1ca369569fd4e5a8ff5c034308de8489b0717518b53dfe91083ddb1fc90c99c5ca9f39db0e09d8f785d790a99e7d712314bed60e8ce7a2a6a6472741b61b2383f7abee214eb0be6656e75e6053355791a7410cdf9b4a39de2c5e54a7a6e4d2baa740f0144d4e4b184e1b31237ecaf819d2a33e79fe5f4c804a2037f51345e733c27bdd768540bf2a75df52c0569c2adee029c370acbb98594b5b064cd06e550a5bef6409603ad272c7abd29bb7463b86fe76becfe05ea39a66db18be14b91fdffdd0a70a52ab09b15e3e3116b22f9329ef38c085e0a2fbdb8b3dd183bc78cb1c74e293350c1944373ae1492ba1ce378b581cb330c9aa458801cf551373d5ef9c76d7312b8e71e18bdc188fb3ae91743dab2241e5b00986bea03adaff001303a529550ee18ba72db63c9038c2db5fe01c09e76d5d4ad6567629af3782d2e0cec6632c6446877f80ca1345c3c28a949f54d52263451f36082506482c160c9dad92227509ec984490f3225f7993ac0af08c480b8197788e0a16c6db2f817e8044b62ba1c3a63beb1fa2f8e3379acbc5c9760582664b9dc6e849872f2f53076f461e8188071612c6ecc3078d382ef52ca2017b1efc6b00361b12ea9345449c7c4e857e7e30223d0833dcd75d4a5d02311cb12bc62b7bafb1963b0cfd2b5ad40f3250ae0ab435b008a6f1681cf89dbb2b4a333b57cc9a6c73cf42c847272218340e996aab089252c14b1745a49f3bd12b2008b5ac22bfe6a88803981658395e0f3e3c3b3b5ed2ac132d97f2cc0faedcab670d339f2683c46d8580d8d6248d11eeb61f63d0669b12b8e65e6b40f586a01c702df925e03247f31260a55c4b19c08ca181a259ac3679b1eafa44bccfc41504aec279617dd7bb478c6b1444cd7f2b2e902c557150b146c4811ccf6bbcbb18bfabd008df6b218c3aa123451a649d764e38cbb9eeec60972748652395a3d89bd9b3dbf77eeeae3cd3f2e750be0b6bf856c269c60b4462083d1a231c9f1e976a9db64a262974abcb04b0947ec4262017b008204288fff542c99f50717ae0d29607139ba6a96116bfc952671f4ccbb8cbb2a53659cabad65ec849f3da0f733a0402002c4bfd17db1e48f6bcbf5b86c28b43d57c5c216a106b5475878a17218c4a7e020600586350cc81b9c5d9ba315e1e06b10bc672b022e84144ba1ef8735b1edcfb77e828cac260864373502d949526cb710bc27e65d92a5a0d8bc61d52a45df50cacf7e2bd0affd6e11afdd28ad7229f14b39eb23246209c960b579840c9ebf9a6d1e0305c8356bda44c7b08b5e5690be98c05a02c40444f94b42b1a700009f7651bb8e009a7a01eca607fe81ae92f4b84fba8960fdf328f95b9d7101df1f8eda1b3d1dbc6486a0252a26de3c352d37309f3c9d495abf046998eda35522882d2937ea59f04d1b9339eefa00beb5c3d149fc945f73d18d3b72fa914bc9b7ac1401fd6195e67ef0707350dbf8a8e98678fe6bb4370c306cc1833db7f85c8a0845296d12e5abca7f98bc684f53551f65eb0fe3a825aefa142d01c66eff49dc43ea8dbd1971640bc71bcdcd00f03e2de7d9501337d88d0b0f67fd380e5b8a1d84824cc792cc946508babfaf1f9aebd22cd57a5fb7a56d7d10b45499a309515bf6f94e858dcf5a4e08c755a73f11247af666c1790cad53db202e5ea94a230b721dc4366c5ed7e5c4071e44a5908711b603c49d2d8a7150bf7b10a47dd921f5decae06970731936c1575798dd4b29d4f85e48e7ae0a6eef2b3ace5fc0de11832979511b8df77eb3fd883cb1ba85be8a286aaae054cb992719b3fcd4d54005b527c6fdd66309d5d7cead4ceba9a4a8f69ec6ba9a8de3ecd2ada19e5be8f952b23ecf94dc4373e7e79b9dbe2ee260ce8411c784bf67452da3528ba19a4eaa2e70214b19bbabb9e07957e398696a803988ce3fadc5021b5c94c9ebd0b8818841a90b4715729735a2384db4c0c4d1e9d386af5caf34908049dc106b4d7c299fe2d8b02ea10ef39c25e76aeeab575190d31646775630e66a5a2120309075a79536afc6528f129d5d9689f20a0874b5649f96bcb7e66a0c1c9e2db7aaa60a01ca17950790fc2329a95bd7cbcdd590a96184d6d90db5b8cdd55c54fa809307d92d5ab7359ffb401c9488179ad43b15743531b4a0a902d528f78d844af6d978925ac342b17799e68f0f8c288a37afa41edda1cf9429067f66382c4f79137de65a5c27edf1c637dcadce0bd222286eff2e67cec58b75772334a2ef99774537ea7551f9cb5cc852d3ffc49acae0320c7937b74adcba6986ee6ece571188312d75decd0e38690bf72f7f8eecc01638594e2eb57ffbe86c56a091529149ffc495f26e9c7ccdf80adcc2fe5fdd93bc1b6da950423ffbfdf86e664001711838bc54fe2d85bebd13a1c1b86420d4e8e7a76e03dcef3cc2e0a4049fecedb47d0a47177637c9a04c4a3389403af9e40af87e7d87dfd40def9997ace56f35979b4673168057ef1875cbb35f0ca4ea66372392d6a75c2800fd35a58ed7dfa568f8b5ffc31822f211aece049b011bdf6e2230c45238282a4c2a5bc400c3591b1779edb19d25cef553c74fd22f6f8b89529a890f2e64dafe326b375154f34051bed27087651153335aa6996a89b2fde30d17f3bc996e70fd24fdcb217b428e81a1e20d2a7759d01a94a22ba4d417dd3dcb24ece626f00935e84add505391606121a8b26b5a8754917c9822b346cc157d24e7177f67f8d1da162475b34e9f548bde50e9cbd1918fd00ea36454edf72f30f15a76e8d6dbaed3e1e800ef8b090b48a43d88c6c2f9ab69344730d74ec1c66342f6797075f1bf2b712486108b306c561fc4f05550ec3e9340881438554e61809e9bcf9338e6ac74138592415eec7793baee10553a68e457bce35ef2811a1624abed75d0c113b85037ae306fa2d4033b6f2d014478de91c12402384ceab8da3a631a4ad9006b5866171c68c7a4067c1858e6196102d5bf641855a3f45f91262c0574f020750715b6e15f31f223693a3757397aabc24b3a8accea14538a11a6a2f05fe6bb240bfb32a714448b9511cd5823cbeb44ebf2dbc0fcc313614b6fefdd421a8f1d39a623f8a27b040f987a6c47f96076c401988c6235eac50945a57ada9c620db19499bb4857746365c58f8331ad5f6d2e5d777e09a04b76c4358eb2d6fcde630f8f4a6b845b9fb03e32397f6280079e8e0c14689998be5de70abb91118a8df2f519670c3356c84d5a93b9da1c183dcec07db2a31dbf24a6d017479358e07c811f538de75616a3f4d58bd3696ae37f83d2e8c55157f33e6c456b5f903d9cf00f73ecfe54275a8c56500c360bb58a51fc17d1d77589b672a0a83001c7051f00cb68762a8107e0708671b2007e413e06b8ca75a82aa99f0e6ad1e99dd56008a26b2a799ba40fe3a85fdb2e58d1fd0b2dda2c83580447e2466fd02703d55cf68875ee16083d9e4d4485b735b29a870d49c56917a1cd6d45afe1b14268725a216bf3ad9128fc2c28951cfbe8dae128cb46ed424abdc63e593e91090602441d6d44e04edf8add207e63caf43a7a4cba6e54e4f6ca04467c9530ee5f9c29b6d4e8e58d96da12c61680585997e2d8eed83ab47f617f05efaa2ef650e9c6e87e3a8fdeb8a2b183e0ed3a1f5d205844e4a4dc4b124d04532546f3eb8f9579a412e95e02632af3c90a4e4e28721c849a6269a9a1f3a0073db399da4cc422d6a65f263e2bdd5946e3b4f49349ac45d87a8a78cf7dc740ac9c75c78b61c965c30a2bda91e73d9798b21b325df89acaf7e4500725277aefde4358829d4a82eb7b3f11df728a03cfbfb0b88c56c32dd1c2e4651903bbb3a47f0b4e10be031578de13d881b5d8811f98c0052a90400d64a022e6c00e3cf0811358600512488a6520811ee8c0061e8126eeec29626b426d69b43bc43efa3c6a2ad64dded18b62a8b02dc8de4dd46723a4e2266fcc92e12b688c4a1b05f89b3e2f96b642daab46a24df0fe89e0c86852c05f9b2bfa2636acdb2f5395642f61e9f3dab0c0c67142fdff2b4bed0bb40bf17767e9f3cebc8c715cc2b27dc00babe682b78579983e5b04bbc2dcdb74a29fe8fe69a0486b54c8f9b084bb076c587be08bd167a9979a57fcd1d3f4d99b221fc6e1b6a694c5ce35174e4ddbed02ebbdd71fa9c22f03f6c790df02352880dd2968526283fa28ba5b41929305ec4bca1046e1a480e96ade69c17404509c7f5785819e2c2f49045e8fdd1992999f5980796df8704412216c97285fa9e06668dbe7ed0091ee335a14948b7a5e396f16ab8ede34e05cf36c89167b80afc6acd02c2664b10a6fe49e25687748339c34b008cd3b3da5905087b8f153f08c071d829ea34e54f9929c1d4f0f7328fd36a3766fea63270f2758ae44ae7ca344e22f2fea3fcad6e9aedfc80e01f1f4daa05cef247717bfa6d6a48dc013019f4bac0dc06f082dc754a2112723eff81c2e9b0c023e4011b3d67794133fda76ecb7a522c23313af16e8301cf6ef92f6a27a9c283f5ae98524132c3f60435de5634cbca69c956ea33da46852e0108a7d41ca144cd4e0841144efcd93cf6da341bf50f32ff5af1e693f6bad6230d6c12f4560e0ac63d9bcd7b779a442860c3a518d1a40f1332690f34220bc308f337c2e08a4331e818809890dd9e0a781cadade7cb9cbdfcd97ecdf4cf8ec49ad7f49f2017237509b4cf06e044336c7746406432af9d5a15127f20c0bad0e587cf60aabf71230531fd5954dd36b2560e3169a001f0142bd78f4c2c48e6ceab1851822dc4a9e9cac84df1ec3e057e20971e70b8bf4a2d73e8c87730034d1feeb45d6f8d635ed9480e9d769b392addcbb8bfd7212adb196aff5c213d2771ec1fd46f0c15f6430e37651dfbc754ea7d5e66a3096eee202f1d94e2f4d5759c79553ced9d8c9878b30a1dd0feee0fe2c0846de1512a94d1caf97103c8f0d8d515f37f15d486040a3b95d2949296f38ebf8ba27a53eea7ff0ade981cd6e5d1c1605a236b3163d8d473eda968cc6994a08f8d979dd6d3dabd24191b43c8409d2528fa2a30d8fc00decd65ffe9e35a880163a8a5db846756f56fd87636b12a9ce2c015d563c7ab6dd315c84253c287f48dc5b621a0627c904fac5d5e159985ec966f247108eb49725c37a1b6e11bfd10203de7beaf6868e5f31d081681b2a031bd5522015bbb480db17331ecc663991b85d4055687f412e8312293666c27d5462a1bd2ecce1b66e75c23d64fa42db58d0c6393db855a338d7f3d69523917c1063388170f7e0556cc7020e4a4b16b33619d7768f7d4de913d92f0988cc6e21b62f87b3adee92de736fa46c62fba5c246d27e41bee33aaec4db322eac1ed632c527b0571228929d8507bbbed63c024c380c0b109c51f3edca62f22d02fae1eec054d8ea02ae0d96e0d9b557113870247a651ffafb270322d52ab8246aef6c332f353dca3ac513bd4f0a2c725d15ec1d1273a907db645c68bd2d3ac54fb8574f58a88b0a352745296ad7f74e82843a8d5a1125ff34ed0f3431b897802a6a7f610e4a39f099cf5564a8f1aaf3d0aa299bf07d3fb9f058e524f575f4949cf80998adc7edbdb6180e3f896384b2e61b0edf881ac4d8871371b8face84f4d496e03cf0d80182a19e7ad24393d1dbbc14f758525c6df2a4940e33fa759be4c593f69c537feaccbc91bd90917921d910af0e09840f2402640cd1796ab6150cd9ac2061152b02c40349c0b9e45f12f4d005b94feaee80c5623d1616123836eff6c0dc4f0a88b17bf09149f20e2e42bc55846af837003db608da415523245b5aa4a0501f941d56471a7d7e8fe3e0abe264e87b18bfe49f64056d7de1bc37cd287889207107dcb54a81802d8a42c88437b81e20cdf6b56ab9c90fb272b04a84b30d5703c64401324cc19a184577f4377c4ac1f81144ebd285165ec621d19e805f5a33aabca220645f9e9b7b9825d343f9d2fb9db37d9c815f118aea6d8d3048bbde73ceadce552994073ca30c1effec1c8212231310faa7faa2d274c709c54dbbc53eeef6248a5863d23747b4d9b2da291943838a8ec7de2d5e21a56297b9302d56762d2a2873a49a8b22ad3742831bd2a90bc4c8d52a4634275003692de7ce04f5cfdd0d1e7b3a57a15837e5b842ab55bc3cabd0b26f7da0f790a231bde6e68c3d788c4e14873b4b8bc910a3c5b262bd0bcae2a96cece0c49cc1661d9321a9b5b232380309801a50db60e1ec1c637cb9a5a5d2a30f8e87e1ca7fd0cc128a9b2b8ed68bd435ac013cd11c315963ca92985cf384b18130eac6cbcb274c8285487455cf99c929d5e7cf129201f44d04da9bd3b65720dcd5a803d2e58089d1a5e1e268c0a1e00b970f0602c680c084af7be5cc68b818bea29325461881c6370a72451e0b327be5e7681dead969b879d68c71006b1878422d42a9043f9e6f646b96ec267b37d97bef2d939429b50bad0b110b935237a2088ee328a51f781f6534f061ada38c114568e0882d4240c2c0877352eaee45be721ce7ee55aca30c06b8518688213050e43b2c32a0450b880fe7a4d47d94b940101cc799388eab15880b04018415ef09f1df283369ae3055600a29a4a800153ff83085141698a9a2c4715cd78d3215a0e2bd51e687f7c61d13fb508129a4b0c04c153b3c4184c80e505080872788f4d0812854baae23f2de28b30314ff8d3214f86fdc31310f3b3c41a487f78c321d788fcaa78c46294d4c0008c7719ef789042847294d4c0048ca7b469995f7e8f0e128e3c490177d0efa7dea8bb5c6d1377cc88b46855c1455ca264ce845a39485b8e81bfe212f42aed78409c5904c985013d88409e1782f1624180786fd4349264cc849cd8409c9944c98508ecd920913d2719204d76025d806eb2ca9787a611ba3a82a74436f68558807fd32614231ff024c98509326384c98108e3f02264cc8897f8e091392c91a30614239390e983021084c98b19d40113911e188706cce789580fd2f13b07bad6c1c13bb290bd84334d318d8df2446ab2a8ca2bc55d5058df237ad20e0f3d9741385681346c4aa348a7241ab2a151a75695fdcf0336ef8d00d55d51845790542a33cf464ba78a8365d3c0465ba78c8365d3cb4335d3c749b2e1e8a325d5cc4ea625455caca2474e8c98411d13ca94d18514bac41993022232114db8411b93cb69d09233ac2eddc268ce8f5a2fea12813468464ba44c1fe22d68411c1a60b155a05c241a3fcbdcbb21db3621ba7d8c623dbf806db3122db981669325dfc4d338ac241ab4c4e68947f935246cb24d04c185192d68411d5189949686a5a4a8c607f916b8a8e4cd16bc2886ea60b92099b36ae25476e5e4c906018f6efa255622d0ba623d8bfa4e35f7a425573049304ef5f8a4255b304ef6fa2a1aaf97a7f93ab719c9e039f4bb4524d89cf25db129f4b37ccc46713cbd412a36144494a4ec0fea524fe252554355def5f62e25f6ae25f724255d38bf75caa29d904f95cba11f2b914c31bf85cc229c992f85c9a61ff120b1a4654f3b9e402ec4f82e24fdaf12fd150d534f2fe2523543543f0fea5231af84cb2916e457c2eb18cf0cf2557e985c4e7120cfb93c668189192e9e2e1675216b03fc9060d23b2212da1aa89c5fb939850d52cf2fe24275435b3787f520e55cdd6fb9374a86a6af1fea328fe241a7fd211aa9a1e787f1212aa9a57bc3f2909554d9a173f93708081cfa41b526c88cf241c223e936419f84c22d130a906c467128bd40ae233c97581cfa497109f493052cd67920df61f91d130a22550a86ae6fd474fa8aa8af71fe9501515ef3f72425553bcffa8095549f1fea31f348cf73e2203f6d16d64b3c0e751ed87cf239a0f9f472359053e8f704437d3c57fa445c388988c96505507de7fa484aaa278ff5112aa82e2fd4747a8ea89f71f19a12a227f82cf2320e06982cf2310601fc546373d7c1ed950e0f3a88687cf23d8e8b5c3e7910bfb8ba0505513ef2fdaa1aa21ef2f8a42554ebcbf08090d238a4d17ff1b1a87e85da4834534209f45b5097c16d9b08b6e79c41ab59a4c987642ab1abba809f6ef254effe3863b43cc822849c725c1fea21a4f8d922b5282fd4536a20df6172d1997607fd18d888928364f704537d30457c40414c542373cf0de3f14f30f35f10fe17431ae89c749281373c619cbfb8774264cb70b8d0f9d88b2318765869d46488786cddf18d89fc5669005a0189e2eb00b218756843bc86117b21803ec1fe2e264c59a97159194c08a474860452323b061942336dcf1c2864f4460439d2e6c98e3b261132e6cc8640b1b2a09810d9318b1211210d8d0c8076c48a385f5ecb4ac074a16d6f3a488f5e460613d4e68ac87c915d6b3c403d6a3c40aeb41c2b29e2333d6538505a35061c11d8af29fc2825258b00316744251fe5158b00945f94361c1272c48c4824928cadf090b0eb1a0118af26fc2823414e59f623f9bfd6a36c0b03f132fecbf84bf12620bfba74416f6e7c00dfb2761c3fea81af6df000dfb0b9961ff2035c4b03f1237d89f061bec7f440df6370286fd8bb0fe00085dd85f033664617f1b37ec9f01226ad87f081af69f6186fd3120c3fe211cec7f63d85f881bec7f018f0df60fc25383fdad0786fd81f0bcb0bfc9e3c2fe204f0bfb5b8085fd7fb037ecef832d6bd8bf0234ec5f7a19f6ef810231eccfc30df6afb1430d76127c617f1d5cd87f02b6290a086bc5eefc9851cac49a28f6471bfd0425ad8f71582dc5140ca50ef63e8b702a45559a0964634538502873a5d16a13aaaa4f3ccbd5288ab37957acb5a88a62e75af56d201b07dd6037cd3ea29969e65e87c18f03b96eb6ba0be5171fe5020777185cdcd8803b0c2e8c6091105a84d338c0f72c6e2756176e63d8a4501303bb090998162945b26f060e4371ee943b400c5ed3ab6ff89b66d5c5a5fdc3f9ac08c756fe5079f92ae6fd4d0c787f53cd570d787fd3cd5732ef7f7af94ac7fb9f6e7cb5e3fd4f335f39e0fd4f375ff178ff9497af1ef0fe2937beeaf1fe29335f41e0fd536ebecae1fd67bc7c1581f79f71e32b1fef3f63e6ab1fef3fe3e62b09b08c37a36a7c7ef9cf38949f1bc77eeed9fddcb5193eb7cdc6e7be01e0f36cd1f079ba6af83c5fa8cfb326f579dad8f079dedcf079e2b47c9eb21b9fe72c009f67cde5f3b4bd7c9e37da1ac067ea22c067fa2ac0675a6380cfd446f599deac3e531c1c3e53d9013ed3198ecfb406f399da10f099de12f0d95bee5a80d7e0cf6e83b3697683a704acffb0eec3d208589a83a510b0b4879db407d8c9c34e98a7e63bc0eeb042786abe0e2bd300cb00fb796a7e8c759c43011601b61dc6e2c0c1ae700c600b3007e07ab12ed3766376830dd65328eb291a006063069ba72cc8b6a74aeba91a767eec0ff1e6efe411e18870ee874d26c02ec2e91b5c28f34703ffa3e15cdf2b3dcff33ccffb7e52af21873f5f7cfef3d4ac60ccfc901629e7f718a55833cd44382bb7960ffdba9507a3a9f99e0d9e9fbf1decfff97200b261f91ea769664d3393cea9753a627a62da31cd4eac93918f66823de6388efb195cab949527b126fbbeb23c9dbccf626d8296dc30a1aaaec66423c2c9094331ec6c6051549db5ceb0cb91f94a45094df92f9931a135a961577162c39e039a8174a2809f4db352a44566e0a0cc221cafce9c3af2f06a9d5e37bdd7c1a09c19080a0541c15e2f48465134c61f6473f2986634e5eff99a83d2f3dd7cd0b3ddac5e2a4ae7a56e5d7df032012d714255a0076463aac120284fb08374b083726a0c24a3aa89414eb0839a809850d5acb0538db15c58856da1ac0f7e16e13436cd7c65b269a1ec5ee484a2bc1cec8966221d116de6b6967d2aad3ea93578f2a9b54aab4fa6070739a026d8bfa505624251a0d80dc49aa7e25d1d147b624d844283fdc7d79884ae42e2ce0d76469ab135ba4624e20dfb7bb356588dc1a82a7fb4eae20e205cebfbca926bb58c6bb58c6be18085fa34afac5afed06187ece1870e3dc379453822277436ef27d2c1fe4346031ddc61d0c0092600ee3068f0c2205aad730ce5473355286516e198eacf7c4351fef5826c280ab46466d2111d61f64a84d32222b4276b1c1e5c4549c0fe2209c35ccb57624dacf9caa423d6c49a1fb211088d51624351ad9a85328bb5ef2bcbd3e91f857a79e15a3860816be99835908d0c68c29eb436e7cc09896ca3ef89a886fd7b02a58e219ba9ea8765f53f5f953f415f7f445735f6116ba5cc63a5cc57261d9a721314ec9f4b1aaeb5b2544219fa9a5386f50a22af866716cd30946a85b2be13baea188f86a708c757209bcbc1446faa61f9211fa6e16f4a726a1cd3f3296f6241c378de69a238fa4ed5ff6a95e62bb775aa569aed66b94e6b94d75a00f573cc629dd637ea9fba6f789c80ab8b81ebc42cf68bcfd3f85ca759161bfeb41d3e855f7f7c1a96c887c30f678415023338bcb3be5167ad429962b33b0167114e0dc4c47483fd2bf8d59bde6c31827305bdfae0acb785356fa5a8ae53e18c70b0efeb93327b4ff07c8f8b950ae5f79f07d9709f45389f6d9fcf89d37ade136faa8c50074fd17b6eae2decf9708e3233ea14cacf7f9f454aa8ca94c45443551ee945382e9251557d277de65a35ec7f7e26a67a3a7cffb95380e1fd149fd7a1c67fffdd29beaf716762eacde0735f69e5ad5228bb0a06349f9f54ac9136f064a4460d1afb77652f1560e840be7d2a3e57c5fff3e5974f2f15e455f1ab2281f23fcf03bdf9e3c1dab737c5935203153aa1284e36431ccf5f7441136c7187e10218d601acb3798a4bf180dfced5b8f9f33c7af3e3eef04fac1656f9a3c885bec18d469f43d2763ad1fca9e54e7f0805c19b8780787cfae308be5310bc2b3477a54551dc0a8bd55da1cc24174634a31655a9f837ce33231655f5adf194d6185fac4172a171f4ad5028c1cf1e7df1479b2b4e196d0b8d27a54619e2f88ac6b7d3685f7d5e953572d752f263afcfecf734ac6763a2e29067f3c908e67edaef4bf639b1d2c85365e6dd3c9bb7f3b576bed6db1145cdd4ed438e1fd27f04535152b75419930a25f99fcfa71a7f625195ff0c13159f46d286a0bbf81e2b8e4fed388ae328de518ba258239a57d542391ad18c5e2e2594ddd79c920b55e31c7bd4cfe11d2fad1cdda98fb6854551748a23088a20288e9e07c5d1333e0d69cc13abc68735c21a618db0c6e7c7a1e7a37efe288a7b9b67f08f589e8daafc47d3b365cfc199b4f9c4a2317e3eb142908ee253f1a9e7474be9e8e2f81ea7e3f8e2ad308ae2fee97f7d5114f7a3ad4828ea9ffbba85924342553654d52f6acb158ae2be76a1cc27ec6df314d72316fdd0e62bcf16da6ca10d73a0f7c438cdc3af61f30caef17394a9a12201fbe4fb60c9eb437b0a14dd669f552950fae183352ce9434b6de3d2ce18cf56c3dcdf546c372c8a2a3a14a542a328eeb959df001d0aa5533a6b7c8fd4adf8a39dc1b486f8393cb4a21755682adcabe85015131f5e79ee55668d83c69f5e458c86a1f1dec8447e68acccf06c9c67ab3885c6ca0c1596cfe743ca426365060d4abe0af929e487c5a63cb51d5e4979fa335e25e5c3d02833e30ea04c999142bb14fafdc96615276456a5a8d293e168cc674f145569651e9d5854756251159d22f879f233495a958f0a0d73ef2c8ae2beb39599b4b130f7a48daa3ccf3db943de9ee4c6f1562994e3e7112bfb6cd207c3ef71871882cefdec1bf4b3a7a728eec471dc8aabacc267c01ac5091e8669d3d45665f50dbfd94051147def8c406b30fd1518a6bf32f3557d95bf5dd77d2b2fbad219a1ccdf0b16fee8f31d7eb1588daf4ee2778aad08e1e8cacba472aaf1152dc5530da6a7d82886eb4e34a71645951d19e5f7271a3aee381919d15014c5e2cf710787c5b123a32c31e8434fc71d158b2390ee14e8bb53a1f771876371dcd18d027d372af475dc41b138cafca0c1028b538be529daed38b1aee8d637e8cf390299312b1ffa0c3b45fd950f0950aebcc0d0a1beca9d42e5ebafd82966fcca97af98e8765ab1eda994951f2bdfa304664cfd1cd474f3d5ca53b1fb3a4f47ea5e9ea2624c64f3557dfaa29baf549e9e6e2e3169ba4e9f2cddec35f1c53de9e6cf23be5e626ce57277fc149b4f2d4c3fe43490cd27d6c995dd76bfd1576a6c7416c3f4bf97afca17a6af622bcbd6eaf5ec375fd118fa3dae5055c959256a0b971f12a05c41425760c3fe5d90f1e7c78e4a3d5660f47b6ebc392587d273e3e9c79b4ddfdd95d773b7b682743f821ff218bf7b3afaf83c7755c8e71eecac0af9b9fbd0aa909d25df2b7de393fcc71ee28ffff97c37fae0ae4af83f5a95f04995f0eae89e7cf2bbff3cd97139fc10f9dce880893d2f5e21a00f3d6e7c80e73b4b7e8f1198d8d33d79bb3094dd83ef79f206f1fce70621fdf89de756d27bfe2329a5f4dd8f27d3f7dd57fa3ef2c70fb9b147067fcc000e9f1b73f01c32f8e48f971b73a098fb6ea682b474e4e13dc8f1c1f0e66eec56602b30ee2b6757602b2f2625f7796505c98fcf8f48fffc38faf060f1473bfaefeb46991189f4fc68c1f1bb5107f921387e9e9024c99b85783f8ea3fff018ddcfe770d2175acf01c4e28fecf83d8e20f8642786d2f3a1276d90b187f318fff3244992211547db7824f3e79b98c1e48be3f8a0ed96508e9f4950142df9e1371e795ef4a1ed51c713369cbdf75c21b5853f9f471feb2fb2b9891af63ee4fdca6b05097d2f9dc8fcc41ebb0fc307cb0f39eb192ff89c25491de37f7eb63017fe98673028fe98cb17a6df63975fbc413a1f65beef6c27f3dd1e13bbcb24c155bf0f233d19a17fe82e777577379dc9cc39298c524add9dbbdd6aed461997e99837ca90350ce5e3e0f48d7e2884dc16aa11bc5ae777dd247b728d638240a795b7e1a067e3544f9ea29eafac0d4af1ee653a0de90b9ed531393aad8874fe290cdd72b862c761edb8ef3e048d32ddc44e7698f6f7e96e7e556861d1ca289515a5b2be2e0f01db5b582d45ba96d6c7bac20cad0c3def71de79baae03bbd0d3751df87d077e1d48eb0a66778d3ec9f9814cd614e52a342494140965778f324b843db095010fa93f311d7b9ce88794523c6372d5dd41b0fba07c4f444ee4c4285dc59d8f669a7d34118ef82117be58ebf875941945ae082d62abdcd7ff5aaca34cdd2973d5c1f2e0871c128af2bc2337283fcf05c1a762cdbb5f2827f72c3687cf09a92d2cbe694615f075d7343f2ffc289f1bbdfa39ee3a65e0a4ba64c0a414c96a9c8d0cac80b3c8f661cda00b9c4551c0593f9a6946fb6854d579df07065317ad42dd20c4c8111c1081114f2bd54ab6d22df5e2473c20441327353644505183050ae050f4407381fc340cd1840e009820c061baf8cc0f5c5c11c4936e62249c19ad8acfa41a02dc07272610050fcf6a616088059263ba7812403c211bcd76a8d9906880164e0a994a3f72fd08b632b2b9f93c8ad1388920305dfc3da107765c1547163094a30e8ab9568da238282a3c90fffd77a950a94ffef7e4774cb53e46391a116b229428d84716f69146140376110cd8451b767107bb6c86703f795b6663c240a06d4c2f4c5d34ea88ce939d521423acc9d537fc8318f1368ce067165e08f9b9859123c4704212254c9a3811e251ae9f5a04792244f05464f13564e02db0050b5c006587c6c891d6059e060f14f14d84e075d082082ac6c8c212264e72747e781b43fc2c02c56ba0d5c3574163031c8ca2d01c41926402d38a209af82157e8303322634486264e749e4089620a1f3a5005059c30722489922593c80e4f0ce161f4032d80000251941d1c271425eb1b9e68860a90ff58ce763948480207725c677392c1565840c019256641059c0b80b358133b30c4450ba602cea5cecc869a00837080a4f404cf11dc1294e9c5cd259b909b4bb914651ab9d9944d3447dc6cca2623aed36729344c292b5101fb772e29c1d3757329979604b9b9743345704b4d6616b7e4240337977229676e71736966c4cda518344c08496906d8bf3369074f0fdc4cba61274529e2e6126b86e0968c4c2d6e2ee5d211226e2ebdb097905071730926c42575a1614230d217b07f6712130bdc4ccaa42643dc4cc281e26652ce6c5d924e0f97f464d2dc0bdc4cb2617fd20e1a269464ba380fac689850cd15d8bf3389665a7133c9481037935c4d5c129279c52525d1e166520d769292999b49363fdc4cbac13e7232c5cd2319f6518e0f378f661db8a32755dc11140adc3cb2611fed3871f3e836819b49426898909251170d13b2191161e44514378f704677c484871bc5e7d19221178acf23254fdc3caad9e18e9010b9443e8f8e607f91180d1392f9ea8617e12cc249b959a4b372b38806e4aadc263e8b7666dc2cba0df95c009c4538a29b472c273e8f68bc9b47ad79f3c885a226c02624426ce94909ca11b6c4016ba23105a9e199c51626234c2f5c9202154a4a4a42d852939293521136252d8828e1607f2a4aa519ad1483d20ca0b0a41e2c294ae902b674c49690dc4a2cec3f44132517f6d7a1344150aa2175e10b3396f483259172483a4158d293188924c3feb3086986fd354022d5b07f15d646da010f48344e58929109581212120f96d422b9b0fffc00e985fd31408261ff212492cd0dc90ad215b19193510e1076f4640465b4435123d96886fd276b44c3fe3b8c6ad85f8ad1e846c48e8e8c908c94d8d1123b624251a3d7685483fd574636d83f65348ae18c84d02efea32edac59f08232f46345644c38a764439322f5846ae71c4c2fea2e886fdabc826aa617fae03672231dac5454e70c281111c39c201122ca1c4088e30f12a41129f5d5c7091bb1012c4c5c506bc1001122e2eb8c85d0809925d5c6cc00b1120a1810f67ddddddddddddddddddddddddddddddddddddddddddddddddfd7d20e8f17842310c4531013608dbc64e39719e6977f7180ead66bbb15a2e5a637313c391cd6c3756cbf5a2b0971a8af6b3930c67ced80deb6b95aed3eb61a89a971bcaf6b513ad9ce1f0827af76fc678ab5b36a3d56caed70b06aba9b1b1b99975db58edeaee8e691c7c45fb68adbc793138e080030e3828e1ab9acfa6bc39d92e46095fd96e94d5f21a6ed6d4d4d4d4d4f8cd172b714eb2ef268dbe7c3569b4499b34d6d72ae78bbe5e99be64beb2bdd450b49f9d3e2a6bf9eae50585fa3f9dca92cacaef54fe09f52f287fee7e51afc7260e3961db58957ea69ec27c95c3cf20fef3d5e8e7e7124f2456def37d172a69bc4a8a893483adc172430d002040035e0031ef7203e600dfbe7ac0afbe7de580370003f00212f0edab1f9ec7b7af2af03b64be7db5c303f9f61506fec747e0db57403c04be7d6581f7a1071ebe7d45c4ebf0edab215e889f3be58ba941d4b80a3f7f90ef0f83d8cc55a733c68bf97c956a01748ad2cf264c3f041bfc7c513f880571b65f18f18f7ac101899b8f30c27e9ed240068818c20a712f60db53415c202ce0c3adc0a5c0dde1667ac313c8fd717dd8f654042e042e8fb963cadc06d8f614036e8c6d4fe19b696b013753177dc1dc595b5dd52dc0cd3326809b27ce94ddb837dc3c61a959c305c0cdf366869b27cbdeb7d3e52996a97267d8932ddd40b2f15a149edfcd2f38e019533bf6f9a43f8c5e6829922a6376b7f7f7e8c3bb1bf064b8bb4182389de9e6dc226c1bee343afef059fdbe9e312da781ef19dd4685d7e7c32ad2cf771d37ca749f595b96eb4ed5977bad05e03fda274e6b94e3ea2fde6e5477dfe01cb4fd85e7f78bef7ac889a3ad1fda0e835d18caeab14b54c1c2f5c350ac9c57f73ba73f0a01fd14f51d535f54c51de145bf7b9f5c9d5e9d3315c5fdf1cacacc867b06cec719e40f856a09a30651563386be2000f7a9002d53f4ef45ccd9c0fade3dafebca78e19c9211860428bfbe4998dc788d2b498283a793260eabcdd9c273d21d3ce7113c678dde541cee8632594275f09cd4e6e62cce455994264a123c67f79c945277afb5c66ae59ae0e87433cf6b32a1e03939239d91241eec88913995e0d9c2b37b4e4aa9bbd75abb2ec7cbf96a60ceec9e9352eaeeb556cf5b1965e68373dad831714c669263a51fdc2f36f5e9dc87de99001d846d238b688d6b1340ffbeeffb6c14d501283d1c7c5f91d45775813507251315675c391989e3837206c7aaf000bf53f23318b4dfe7d928aa7e2e8aaa9fd716764b71ad60286ddf5796a7d33f0af5f2e2361287744255df4da2b6489983efa30c48bfa04fe90c0eddaaf0f0f7debbd9dd6d14555d14555f64e3293094d9ab929a04d78a04d79d6a04d74a43a3e0fa6eabb5abdf775de6819e67f31539f3929c7d2d5c3f5287aa9aace1fa9f58ca3c551f7c2594600b2b4a94cf6b618d350a652667df27361543dbe743db27b4e5289f7b7908e8f9cfba7fdef71ecfdd7bb7dff779ceb785d25ffcc670e694f343b79ff7d9d4cd3fcf73cfbd0f3defc1ef3ccf3feffb402a94a10dd71975a7ac367246ce3239a336b481e579f781a3587150924fe68cd42169b5a5d532eeb7dea09c0fbedbeffbeedd7eef59f0f3ce1ffc3ea73b74d531e48cd4b1248da2ea572d94ee0aa05fc959a597f442e933116da5060128615fcf9622e473a38f1077640972a112ec3e5dd8759fb0fbb8f243e58365e339ca900d7e2ef8a1af7bb27c92f4bec4654b911616f92d4548b2bac85b8fd4d715caea1f7263e0f96317f07cf1c359b1470a787e38c618ad1283ba6d4e5cab358e4ef41daf950f02bd93ef1f7e481059426006939f197ec2e7843d9e9b5d0c9c4b4c5b8a746d61b5d01469695da16c69c1421878ae0581baf153419f4f98be675ad0cb5419a2f8e5180afd0702813e047d17ba79625088413dee008126c8bacd7728cafd6685b2fa93f663eb13caf1f389a2706ca041e1d8c04a95315dba5baa0c1b58a95baa8c4fb4426903abb242ef7410d20f4916ebe6c66b6a6c369fce798dc1512ccb8fc78296564b913a85d29fbec784aafaabb70457ef06576f7a57acefb9d96960fb8abef75e0dc3f7783eb4550aa5e7f39c1ff7a0c7f58c794d18fac4b0fb1353ad1e08fef7e1e8c37b0ebc4328aef50ea1f8f36ea6b8f415ac5fb220c7954acf3df8a5cf41c71a7e2aca84f13ee45032dc71dfe7bd67dce1792fd57d2a8a0dac0a7ef79ef53c67c1272bb68106e7541913467c8f96483e463753cc7d36b0b0572a5daef4b9f43d9a3e072d79e28b37cca6db837bcea6ca982ede55111ffc8e246bad9f8a3261b8f76eb68165030b77eff1984a13d78e24b9074d5d773a716f02fff3b837bde7b161f23fb62bc8bd09741b1c7296c3a2f87d5fc562e9b3a928d3c57bcf83b67e7e64c71759f1bdf2a7e5c4fa9ec779e2f59c8e957bd2cafc3ff49fafe8876ec5e4e721b5bb333a3194427c86c9db7d57bbfbdc8b1e1b0c7bf7dc0fa9f87bf26f17865288109f850f12c99b5138f5837c57ac32cfc8d5eec5300c9f1b65428ff510b4b3c3a09dd8ab5c579fe33a87eebfebd92c84ebb84bfbc4aaa033a387a610aaf0f09fd55f341aada13573ce09e4a3d128a59402f1dcdd1d4867abb502e1388e0352bb0e88378e0784764c2881cc18cef37dc1ddcf53f3fd7ef5fd298f7afd9601f7b8e34312f69c30b7a9dd5d83f2e449ed5683f2844669adbfdeba9f7bd2ddee4a646cba9f8bf577fd5d77f7dfa2ececdc6e51766cb5f6735dbfd7efed74b72dd684099358ce4c166bc284f644e786e39874314fd6fd1f93eebea9b5eb5adff7ea07fbc1eeee9e94bad7ea79b26e998ca7bbbbfb44a97baddfd78d3ac984dddd08a8a161fa61c8f33ceebf6fa1f95a8c78461ff5a73f4769feaaf538cff3ae87600e5dd79e6fa16969dda837bf3beef8fc375b582d455a5a54e5fde77dacaf6b61b5d04c98aee5bdcf415b8a4c98fa3404f9286fa62d2dec2055f9e1ed7e76efffdebd2af5b9ff7accc1fb79330fefa7f7f37bff169aeb39686e69e10f1c77847ede205fe8f3bce7a1efbeefe3429cdfe05a6778e777b6850664c72fadf8a4adfff9b4b0c8f08629fdf97def7d3fb91ede735785cef73c04f4781fa44eefbf9eefdefcd0e3f9962213a6b1a7c39e372787bd9f2d4526ccb3bcf73cf0fbbcf99e07cfbb03dacab2eee9c8d0af42a1fc9e35dfbb3904c4dccde1610b8baa8ab4b430ad8a39e339a80a21fd9052b29bcedb747e772a12f0be7b201d43838577bb8b05e7a9193cc71d93be97b57e0ee8db9151569c5d0c176307a9c283be7b5df7d941afcfaecffa467f7f0eea2f8871ef2f588dcd4d0ca7e59ac16a2dd70b5663f382fa53f97da7f24fa87f41e1d0f216adc6865372b68be1626c3506a78cc129399c922bb917adc676335938e587cb22aefea982678349e7fc15ac600546bcbaab20ca576f5584c241019f4842f03eb8c350010f3e1177182aa801e8c11d860a5ee0093d1e10c9b461a8a0083e91ba3086a2f0919125498691828a49b8c348410cca1109480c230521c0a7695340239a818511480c524aac74aa318d28388948bc4811e10e03090b9f1a9cf111c7b042c330a4392845d1399150247e83e9bbdbd4ea4930fdea48382698fa8b46a9d76a1467dd6a4e83290dd377772532b40917eb6ca8122f07d3f79c604a6b6c75e766e4bbd62dca0e7d5124b65813264c62393359ac0913da139d1b8e8b7939b219a3ff31a1b4eb683c9ad6f7bd666bd2783c3309a693d53d27a5d4dd6bad3219279f1319f804a4c93c4ec2ee3929a5ee5e6bfd3e907a50989e64c61d1307194cc130fcff1dffe1531b3e1d75844eaa3ca12a4e4547854655eee44f2c5f59f264ed89e5294eac5183734a92fe537c9ed4c1926f6fc7d09bc7174110fc7c2a51379e14f153b75419356ce36e94116bd41f01abee543e91517aa7fa6586923dce897bc1fef279d7b8ae6147f9eac506c7d9a028cf7a40103cc2fb107c8f5dc2f33cef2e01de5cbbafa38fefabf75fc7bd0d8ae2ba23a32471bdfd83284b708f3c483c5d4cc2b651863297d84b7f0a8421014aaf370441320c5b9cfdf9397ffc6fb193193f74b1ea701cd6faf5dd0699eff3aaf478fafe65e4e014dc3f98d9e0d07dfcd8aee3e76355788cf9f3e3cfe0f063f38ec64ad0f74f823e6d4fc7c4e3eb98e3d531f1e77347dc8956c671776719306773155680d3e6991eb30c98ebc4d07e9ed73d787bba7cdeede952ce8cb3f341d87d48eea8efbdf793fb9e651865be6eb6fb274f7c1dfcbe2a442aee5f82c47ddff333d807e5be2f91893b4f5f951e354877874cccdd1ac467c0494b10d6f0343414f9626a7cdbc8600d35ec8c0929c9e6ffa1b1309ca5cff3467f49a4eebd27ae230f920d92455154f72512a9c4228ac052c771f9be534afa928d8f5883ed981ab66368b01d43fafc82bb27bdf75d131ba4f4349ee5fdbb1f348e15ae867e9df1b57e57bfab1d8d6721b17c37e36bfd41921cdc48c0fd83241ee0c492e57e857b1a9f83b2882b760912db2f59168e23558ee3dec6a5aed107fdfae18d1a345c5c5092d87b961a33c6c71d15352305754ba4008835589a1943c32df231347c0d5be41443c305a37e6843a4b092c23e257dc3bf7de520507f1dc8c2fe2c9f3b508b568905d2802dd2d863ac79e2d17f3b2aefffdd6c54451a7bf48c1c667c7d128fee6be9bbfe649e5094f9aa63be43f1ff45b237dbc0ddbb0bcafadeadbf0489eba7a47cb5a44b5d97c8c4dcb78c3a0230030bcb8a7d50d9750e5fb1d45b50e62e86bb265415fb41e3c8f4ed07a197c6e7ae8b81687ca5f1245b9fc536a6f1214a64b14fb2a51cead3f8ff94a72faae26ebecf8d2c57a5c70c7ffffe0c3f471db5e6da5861795b02c08fa30f1acf72894cbc7273fd7f318703c0c655e9717f869fe1de20ff4326a6f13968a52a7b33a92aa12a1a370809fc461ea41a160c1da0fffba52752496f5f8548c54b4c1b8df78c3ee8932e91894b171c7db07cdf5c7fe573b8b5d445517f557a8082acfc9089591e7483703f64be88356cc754aa72fc958c324655346eee5779961ba43b1caa5ab94f515d8f193cfa9e28aafb7abb0f5dc43beee07ec8c4f455ec0c5b52548ae94fb78e3c4c5f5fa42ad3155d700500ae2ca42e368e3aed82126365dd51766217f3d5b47de9e613e9e6b27cf07378632e6441367f60ccf74f56defc91275c759460e75ee6ab0f8c4ef907e1d4834f86fdcbc17c82c1aeea74318a1a42e95ffd3fcf1f664255dfd79befc67c08c0fd75a57f8404e038ae56b0ab62ceac703744a141abc31d060d587896180c1b184fc0c8c11977186014019fc0889960091df5b9d73175d4eb65a9a356991d7447f783068b7e2c66df18712b2b366c9c4e75dce112e8beaf2cebb883ca646fecc828e953aa83eaa02139b137eaf840efc4ee6ecfb747ab615a5bb5956beb73792c8da945ca6cc3e5b7b65aefd1bc5afd72ace7c3aeebba9b6738ee3f9b5132ec75dca92c5d98ba2b07a55f5ae7d5ae725eed3a6e7ea247bb3084fe6d23936878ee94d97b956ee8e2628b101801c107b4686551040b9a2b3c60056ba60a2aa690a20351dcbc26bc219e131e11ef098f892594e040121b10122423718411384af93373d17087c185007087e1aa01fe88d19f59e3287dc845ab455a11b2c8b875c13606ae49410788b9f8fc6df1b90cc1e79311107c46e1f981cf2f78865a7cfe5a9fcb2c3e9f8a7c7e2c68c42b3e7f3897d873c29ec71e14f6bc604fcc53f4a928a5785c51507c7ec14f7c7ec1443ea3b0e78437c46bc263c2bb2df1f953e273c981cfa7243eff063ea3847c7ec141320a89cf9f4f461451fbc0fe2b1b012e0f7ef8122717afb9c56b86e0358dbcc49f20b819353f30b5b8a16cb66e289b59dc50368bdc5036b19834e4bce28aade9812bb6a615576c4dd6155b33555071c5d814578c4971c55807ae188be28a31289eb8f985c8cd28276efe21379f9ab8b96462893bda2871471b0edcd126893bda6ce08e36423eb0f183dcfc72330a899bff889b4f46dc5c16317e60e307367e60e338ceb14787f30c2ee2c397af423098eb05e3e205dbe2050bc10b66e4050381cc57a1ef03377f65793afda38a84323cb1085bb1ef2bcbd3e97fb2c4d68cd8c225153797a7296e3ebd14373f0a15c5cd2fe28dfe68e3abd1cdcb0bea899b514fe4e63f3971f3a91c7273d98478fb98b8f92b97b8b93c2971f3e93970f3a392b819b5819b5f701e6d30fdb1467a1172f30b2ac8cda8cf37ff09899b4fe5113797468cb5af3cfd07161313827d3eb00fec03fbc03eb0cfe717fa5e4c68f67d65793afd8fde452e9274912ed245ba4817f95584f37d65598a70ca2f9f1bb1e8835820168805628158a0cf2fdde886f4a4273de949ef8d6cf44935bef2bcbca050ffa753597afe72797a77c19954d371d58bb85f70fffacc3e345fb93cfd4fcd572f4fff73f355059e3ef9f2950f4f9fbc2167e4cd57403cfdf255de94b3f2067af96a88a70fbaf115114f1f34f355069e3ee8e62b0d3c3da170689c96f50cd536500d794e1aca09803c657346dac8d4455f0ff84c6b32cd9fd90c54f6b999da807ca6372b7e669fdd26fb8d06ac67c03a11960e6129062c15c2d20bd8590bc24e20ecacf154bf05ec6c79aaff077b84a7fa7db00ef0547f052cca53fd3d58c7f1543f0578681a407ed8f6940f1b81fe1c7a8547efb0ed291d2f63db5375468e05d8f6949700db9e3ac1d8f6140e7b805e5995017a00b65f6c7bcac572d643137d006efe6edc5c8abee5e693e86ff0d06cb81925fad4cd2e387b68289bc918492b5925aca48160a01888166261fa352c0dcb6257ac8a9d6153ecc99a6cc992ec674661a2cfac6f387f66d306e7cf2c86e97f6ca633d0d5389dcda0c9b2654a03bdd76786a3c2a30c78debcc42c0376fa144fbff3279eb73fecfee88c329f9dcf8d7e6814f5c475288a92ac5186a4a128fa8942516e5dc635d7d5ae733a3bcfe733eb1bf49bc878454a1e9485737d951edecf9f3708763bbfff28aaddaaf4b841bc39e79c73ceee7ec1d90fb7af42b35968460bcd6aa1992d34bb85661e2b34f35aae0ee6ea6a5c9d8debc61573e1b86a9fade46e27d6b730ed5c229ceec5e26c5837ac180b872563cd58b49bdb0dc7bae15a379ceb867bdd70b09b1a9ba7621f4e293bcd9e86aae151b561ee3373358efa2f37289b7fbd3e33d4cba34e5f7e66deabb6bc182e3413b946acd1cdc8e6bd3eb34abaa18ad54caa8a39e35c114c4079aa3eca5178deea2a7e758481020ed76f5982ebf79001ba2ad1ea1780aa3a8c254870fd5a5f6aebe01ae3b4a4aa5c4f2f85155c6de05abd8bf95f111fd4b9cf41fd43ef3329f3ccb0db915094085697886ea80d07931125712414e5600c014a514c46549950948b48197652e699d9ca0fcd57e4cb53fedf5796a7d33f0af5a17d688dc3c320265f950b4eca7cc5bd77cc6765b3fc617a979865f84a97358ea63028f34824f3ce08b4bb69777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777707a916a8442c17564d102a44230000000001e315002030180c078462a1300e0359b21d14000f76a24a724ea10c8431a694318a18220220000000000000081200eaa783925cc8b116f54a700b934c688af5a58bc9c0854604435c07f68e83e428c0c16090d859095a1b4aa5eda5f0d935ce861c41baabe47d5d9aefc6d139f4020b82b710044fdc28e99c361fde3ad45d154e19ee463940a847658eedd754064271d47fbde75857528fd37d04ca6e6c81658a1f8a36d6e8574954e3ebe759ab4765fa5efa21ed6732cc5c614788e9c70578851d4ff61174cdb2817e3cc9c5fd484395403d8d45cfc4d5ad32df846a2ba10b936909915dd34a519647f7f75f29504114c3e2c90c63034e3eac9ef59e2174936d0f2dc650f71715cef910082803aa56fb1f6a976674b381f39604dff6788b8b2a56460c31fdcc6339baf7b5b8f642a96ebcc1430736bd56eb320468d18086f390d0bfd0f5708661b0223c9ef45af9eb137d38518bb0b9c1fcbac76b1845738327196ed2b917258b36dd570fe30cd007e22904a3b765923bc2b4219bfaa4dbc02aa930baf0b6134c682850026f31307b04d549dc4e1fa467710d73fc5bbe0294deb7cbaa13cb348d6d262ff165c5570f374407130b58c65698fb192fc56f9b59e0a0a6cd73284a2a397b5a8af913010d8f107598cee9ccdff03560b73578b02a44720f626599ca248840e69c6820f88d8ca0b3f3e8a53a3d3d86adc12d790f29ce0e2a453168920fee556ae45fa912415f3affd85641be258c7ec14751c023505acc994b1ab88d6208710c4bb732ef0b1f8f8ade30cf9ba9c42fa0983886637c93338d0373a5a5311570e55d2deb4df4701c92d6df732ebb06b848d09fcebdaa89d9477fd1ae5745b95ddb50707e8374d3168765d5644ad39ea26300b91a3d3d1681320df03c65980e2a415a49b35bc1e484eacc8c2f9085fc522c09c79754cecdac5e8d1889fc58f4ba5d14e568cfc6b5a2ae1875fd0da966d4c3f2a5e2aef8404b378abe8927a56db9c2daac7b9f477b433767e975d248393fc9ba7fa4c5fb9cac968a3b1bde4da134eb29beeb2a947a9e92270904ac66671977ada18708e064433c44458cabde84c2449c2f72614b362f1955481006671213e7745690782dea77844608ee0b223c956c4eeee0d57d04956679895da6748e20815cf10319ca38e1998fa4749f4ec6486f1b18ab95b0a1cc217e6223c50842c8fce95b006edb84cb4a801055357613edaa642ed14be4ccfdb7d6098b6a94c99eaf003e13a5186ddab8c387bdd28b1d4c7cfc1bab430383be007a64a1bf08abcdb73874dcfe7c435964a8c3c468187167868365d50a2f03dfefc5511b6fb093573b77cf87bbbd9cfd847312dde97cb1e5492fed7b60a52d44889c8af0408301c3a2dab28011a65c2e87b2217996a4e160d622553df19129c7c279b7a6a2c990c3d8f3b3a635b95c74588b7b3ea11820dc12c593e2019e0bdab5a6484c26938567727c2f1fe0843ae0423595e9b697df10a6ce46ca0cbdc05f86c28246e61999f7cd41cf8a218a0c75b060a711d7dfc247baef8802ba1cf9fae4c225493abc9892a3dca33243029f254ea05506ca068917397acbeefffd2bfa4f87032cee319613d0be3470aa183431509a1ad004ee78d223c80b4441dbfe3e05fe68a6820aebe3805118e269e6c71da25896f9c2778b642a570a765b005ae3709d52cfd5a7bb140a2ecb15a381a8143c45b443cc355d3f022935f984ce452cb0bc098744a91a47f62747cdf88c9dd67521d50dc539ab04457dca0d7dea6750e1077270b51137d37fe50c5e687179fc86c138ccd49bf90583f7a6598869534a49bd1856782d7d93dd6713f2f3e9f240644db4c76e684b34859d7b1fa418235c4e2d3fa068de93d6b5401fd84e1bef6e271a3a719973eaaf8cd91bddf109256b308fc015319c581d874f35ab47c3c44dcf04f849746545b968583aa4526eb233f2266ba29d075775fd2084151f79fc91b9657c17839c784384e9013fe3afd384bd098e364fa75c5c43d4e7eda6f8fd425eed8e2762ea5624383817d5972996cbea05bf7cc00fbf219eebde7e9c89d5f3836d0d28d33e1b6b4a0f8867cbef1a21cef483d3272fc08125408fc173c86a5e3179b57b56c918bcf8443aecd345bdae0a2c4b1d6ab24de388ca1e314a8fb6f876771dcfaa98544710641e817483638c77e2ca34587441ccfe064461d6481b8036dcff5eed8829229114d329d8f40b50bd03b26e4da738f7eb2afce72b00007cb0297917c509e945db4c52451e38878579b69a1ad0187ef76aacc8c548ead1212c7098046198fb6961592755ca4faa018dd3a1a2c1704d2e6aaafde000f45cc9c5413907e4bd29ed778484cece3d41b8ed845d341f24e6939f41acf48cb6f36bab296262e5dc298cc03214446f53366a80d8a5e0969a05da876e2041a70274082e894fdd09039c90ea6311ed135d399336a04948261402421b30df2721096864830d52986d5b9e2183b8267b840d60e5a30ae0b5400431966009083810cf0d5763005a95ad80325bbb5ea34e567154def40d1956590767ef41b1beb0d9a894dd23e278e70debe7a8a02baebab91a2890e12349d8c35795343cc57de41ef31079a4cc94c0e845c160cf3d016f748a03ed204413d6074bd4018297d51ad56d7a061e462de21ed884d8ef492d64ee3fdfa6733581876a077118c560de57dd0dfb105e92f4c12abe8addf45bee96ee8baf2428bd78832d608f3f2838390c0849569f6b74ee96e40d2452edd4c423e23f961ba6e9a29c98c257a2f0e1ee588b077b47510aa1a362d1a14bd4142c04887032c12a08859a15ffaa6cee5dd35d9a3325d00a1b25b0a2d180c3ffc89a0b286a5556efcff643344be66fb4d3a9b240f67940ea5b522b7c1370c15fd195ca2df85a61831211808f0b7025689458753583956273f4f3fd8c28f60068ee1ab81c0003877b4ec977feb44bfc5f7c451dfb060f1ffab34ef70fda776aa74f06acd45bf9b9bb276635ead6f25f92e1f79aba445ff75e41cc8cba003b8077f64905aa1561d7428fdf03c1a1ee0a62561da016061a8787d5d653e7b01cf04a1fd1fb549c3c84d84d4ff8a715618e200b28c13f727f73edea6dbab461061cb3001a56128797c620a71b4c36b90bb5e8d2bb181bdd13afdf1ca5e66f87d817008e98107c57ee587e84c359f7abb171636076b8c25631c8d907fa6d25a192a85c10825fadcf36f05bea5dd9c4d0cf2439f0a426528117a24ab57007301f4e49281f101bf97cc3349c3968edcbaa01f7c96c5be052b9f48ff59f7f68516b981cb135e29b52ca803eb16f6e30b4e7feba9e4ce8c0d4b19586a8b81ffdbaaf8f175f31a5a2dfeb53030dfb70cc479da02ca634e35330066911374c7427b02c9799de12dae203d61a4a20fae26efb69f577c66a7423e1a0f13c9bdcb4c7633b302d20eceedcbae1b0522b3edb7ac0617c2a13a37cdaa9eac446cd1a3712caa7239544f1eee9d23cf42996027322035970ec22b32821575117c2e8449030090ab1aa61a954c0b42cbe500b1816b4246e20a32205afbd40b8cdecd10de1606012438be4fe2f6d2545932466b2cb8b93fb406c5144584224604dc0a4f9dab9257985bc8b9f25ad1eacfd737e3b604f379528de2a7c7e7c3ffd48cef6b78fdcd1eee62379b32406220896d46044b6821d1f0b434a3af31f669fa32efd614ee8984872dc6a058cc3a53195613847a04cbefe899d6540b116a8cbe5979e82e509d6a9db56a09b2aa60f4d330e676365dab51cbc1e82e04f50105cbc627f60e5fdee81a897fc0e5cbe420e54b11f2fbc42c31f169b125c56ccf59cbe2efd8323586a8fea4bd93cf3daa45c6a3d24545fc4f1bd64ff3cee92f1913897a48ce3b7a46b206a49dda1ce92e8bdb4fa1243404b53899f9df77ca80c162bac62788415c0504871eb029b1d642dffa4f892b9be4eb061642a832dab10a672adae7c24952985c5daed43ad397742d82bc6b13871f1a8da35e358c7d8a1b071c8cf30708712f3e2e7adba40acdfd09f30959b78bc1ca737b9066ddd9888126ffe0304925a805c9a7ce04b703397c237b6355c0047cb4552dc888fe0e31bd57dacaf8f21b2443e85799fea4045d809dc921805ae3ed04a6f5663a7a86d6ecdc6507eb01707b6d3f6ab61c1638a9db5568521adaa73d67735878cfcbe2c9ca3d140f1ad81dc4a913b37f82a93e361ac5afa96542c3e88337fd7cf49a5ea1acb7d4d8babfef792cb880afd3aa4477eeb1a2bd6ab5341b4a6ce598f7026658c00a8efe9dc4e8275e9ea784698210ef173893e5d5c6f8fea7931b4e8584b9ef41575458067076120dcaf636d15c648b21a604e66f4c67ee022fc69c0c82c3527500c47793856d7703474df967076f8ed24ba9154d45dfd414f1752fd400b4478106d04e75cb468bee32a2ac9ed1b408c2cdec5487cef4b7ac814c13e1985e5a44194114dad2fb003b9e6c8da39f5186f2d730d4157fa1f92d41785f226a23441ae43b5a3833269b6e33255981c45ccedd3af73c4ffa87e50903827da4f7d8967eafd789bb82be1efdf13c3be78ff75121cc1cab68ef712f91ebed8dcc58406ba4cdf88a74b6137194ce9391194715e5050669aa6c68c58d152fbb911e897c18b423da60ee8dc40e9c4676cb4a0d687dc5b4621f98714e320df5572a94869e2f188854a931969ac34d3946ac4a2a71a6108285563439504ab6ac4aa63d528c36bd578b898935523cd1c920259d3ab710660c9007dcd1a4b0bec19ceb935463d264a396567d7b8deaff1e08ffe89991c85fdf4bcf76f4a710dcad9c75d88cdcbad87534228f6a1d3dce3948e452c0cbb89ed9e620e1a4197b1fcc7291be9724ac5c13fb647f8c6cc9abd7ac4979408b26c659e77af53be723a4634544f699898874b6720a12fb06e93de58c270255612a3d3a871c396918ef1321175442cd0e44017e555b09c1a4bc86fd1ec629e0e13ee9cbd601db149c61801344d55ac5bc9156524a0258c22c854c4a1b2aab84245cd2de9a54a84a1fa992b124538dc0ae15d44dcadcb18d37146bcb8613e31db9a0848d24c5d1d8c00c7713ccbb876124d1deaaac51d859cad98ee96710a72ad04a01777b47eab8b11016aaf4cbd38682e1ece984d2d060071bcf53cef31a5b28a2c2638ab223053744eaefca4c895e1499380791ebb7bd154c4b9d464513004ae338154fde448b67c0755cb67ae7d1eeacf8228db452f5582eefe0aba6aa1384c4e7f650999c8a2eb622f27e3e14f7c66cbf1118d6e8b8e8f9df82374c8c75ab13d53137a8f4c02b5e46a18d2af6c822b39b3ed0e388d9b010709d25b55e130552149d2013b2334af614a947e45990ac417584283e0e20c10d1b27c3f13df47e4461ea1a71fd45875d6a9131821355d3279c498321fbe3b8fdbd5dae6511ec7aaa37224bddfcb913aa8361f984a0920bcc6675c6a608e0dbfd656192b4ec150baf301ebce1872e050c4e597d61647fff8d66a8b0f908786e37bf4cdf716d6db718592df2fd80d42a9e28b6df0443c42227aa6c4f1853d128ee863feddec4992c1650cdeebd02683382f8d678a13beb5ec48427c23ecfe8a4d341a12559d6d181b86fd28fe6b674aee5bc1a13c132f652df1d3c9f4426f64fef970c5934ce5b0f68a0be9a110f52639463e823679905a749d71e62efce31cc386559120f226cfe62a4099eab7cb1bfad13a4ade2134537736f8034c0a0e20360a693630375815fe24425af1cac7bf4708825456e784cd3a1e5522ecf25a9639d304b11b44bb61b4fcda6148d24e9ace44720ab482ad90160764f959d9c6238a332c21d8c197e9a0a1ef183260badb4c7fe86768c6466a325aa14734b51af0df8419e35b55826d40741c44c55d5582d80b9ab61611569540bcdd8e837dbaaa746274f3b8a7feaab2166751038759558e648064ae934e2f569606e4fb87130dbe19ff71232010263a2792aa5407277da883d3e1cd1a3da1288f0bb77bbeb27aa18396730b567ec8e133836192b5b80a57c327370c7c9e1f1c03e9a91ae13e2bde7ab9462f15f00eb2d61c877b0f9e7ec108eaccb786cbd6979e089427f2561d976337ba4f4ad5868bcb95f000c0919664e8f50aed6fb5752f465a76e1ccb2068efb2a127c7c1c1c9acac109edce24fdc427ec0db328787bae14622e2611e76387d693370409525e7dce42d4f610b209258600b3ae3ebc9d5c358bac8d98605934a5600532e833ea5c5360a0817b537724d8bee104c606c31b6d2a012b99702f7852c5d010e01d3040dca86daa03336f7dd48461cd63686acd438535ba3d3c52dd481d9e35ba73074a73f7f97ac327d9936205abd9b2a915de79d1f1310ba565bbb23503d4e14903d10fddeb74ff05db00b0a789355d5b425e099bc07bccb9f3267ca3e33446947bde0a52c3222143761b169d507ad97117438a697e7b7b8a4b9c4293552fa2dfc73d0351777b71c1f4cb116b56d3a1a92ee27b6afdf83cc132ce1721006c2dd58c1997f139b82aa9fa002b2cdea7b47046620c3ebe2aa91ac80ad677fa633dcba274d2e7d0812b7e80d59e765ccbbe2a4fb45c14f00a1f78bdd71ce9b2d68a733d970254d107aceff4c77a9645e9a4cfa10357fc00ab3dedb8967d559e68b928e0153eb8fecf01999dac3fec74d7ca260e4d44bc2e9f0c2e090c6de614f0b15a2b20da4bb563c6454c0eae4aaa3ec00aaff79a235dd65a71aee752802afa80f59dfe58cfb2289df43974e08a1f60b5a71dd7b2afca132d1705bcc2075eef3547baacb5e25ccfa50055f481fa5f3ed87c62f964d1bbd437733811627a3972507968b8315181c6d55861f13ea585331263f0f15549d54056b0bed31feb5916a5933e870e5cf103acf6b4e35af65579a2e5a28057f8c0ebbde64897b5569cebb914a08a3e50ffcb079b4f2c9f2c7a97fa660e27424c2f470e2a0f0d37262ad0b81a2b2cdea7b47046620c3ebe2aa91ac80ad677fa633dcba274d2e7d0812b7e80d59e765ccbbe2a4fb45c14f00a1f5cffe780cc4ed61f76ba6b65138726225e974f0697048636730af858ad1510eda5da31e32226075725551f6085d77bcd912e6bad38d7732940157da0fe970f369f583e59f42ef5cd1c4e84985e8e1c541e1a6e4c54a071355658bc4f69e18cc4187c7c5552359015ea7ff960f389e59345ef52dfcce14488e9e5c841e5a1e1c644051a5763e53f7f4605967a86b8db7f2d54ae1aca3a13848cc9ff5e26fc5653bcb0e836471934246725aec2c9d9f723ff5250c1d86de758eb959792f53213676e93440ef915cfcbb2f88d8beed4678cc661939b4232f4d774d503ad4fe1e7a79aecd6746791102751c283ee864739d7c689b526cfb892ab55b05ca8fabbc9c30e36138ae7a2a08911a3d3e008b212ef203850ec0ca84f121a358be45560a90870ced6a7b329b8d5f3130f306db5d7f4b45c27f694a48b05ebf41062e80264ec463b441a9d623f872f4048374583cebcdbbe8000b28a4e688bc3816eec3e593db64dbf0782f692b078738c355f5b70778f71ba5d7d0aa5944309fd0254d32faba07d1ac581166c46dda2a180ea39aeac5e34aa729dec4805ce3063d926d5607bdcdbfe7a51bb8f1f6997ebcaf8811240b194b887dbb8070d1770301ae921876a93cfce4e36cbc10f2cc74342fa18077cb6d4efc3c06689752a25aa23630722c1d141fb800a9f0af7d393a12149e730ebcae9f5fd5aaf22b22709a7a8adfd6da6a8b8b8b30dec8bdf7d1ddbabdff7341fba89e2655de630975225780f38405e2dd92983b01e962a255e7c710159ed6cccd4c054b11a410f7cdfb09e5f3e5d76ac85db5a97531f558aec9e2811cf1db85bbf4779e8bb8c16c47b29df7c84522f24d2bd27732b11f46bd91006bc7e95778dd1dcaf2faf3169fc75820893d15f9f63300bf737aaaed1c95f7e2d362e4c2582a70d453fa2ca6ea323cacc60dd80875f36e623e0702bea35250afbacd3da95ce47f59437b9ddb1c0b04824dde93996c6b96c21966523a465ef67b90f5e3f40be8d62a75e7891c438009e9bc302bfe023638824eb81293b09a6742107383653d947bd848dce29fe9aaa51c19923207c205b92c1a15709e5e31cfc400208f048a94c295c29f9bd033b68e653bbcf6edbd2ae956c1f4a701fcadd2769a6d00e52a89e5491c229a0f2013850b66b04865f7555458145bcfad4542451930b76908f5ec81e3a7ab9b8cfbb6f811bb0a5a0c325aa8c6ff431d8e0991c433e0fbd4093588b32bce42339bc4cbd847829206a2a6a2edb478c1dd8cfe20b697d93992c6860aa199dcbb93599888c5bd7c9c30cc51319a1090d684307a18d0df7289b6fd667653a720460b81f48e2aa663d074210555e8da05f112f8df61af7f19aad42eb8d417cb685656b53e1d3519107defcaa4a6a24a1577e2437bfad92cebe1bec3a16182029c402899a0ffa8a084454c79001cd6ced891844100bd174aed2297a1150b51e43d927fe6d64626017288f7783e545a88062534af4591385acd8a69b48ff0651f1e57f7467045a696130b8ccf60018281f351a7326442de4b72251439750d301006285b2a477344325b6b81f6fc0a9d47b031f50d2e096af0055464d6061aefe61272e8b14c60fc8b6210e04581f44073ffd30501988eeb76b1c93bf2a5a18fa6c0f8fe2c7e169848fde7d6493d2e2d1495bde93673f740f4418f5ae332778312000dfe9916fa9ee13f5d3937b9727f3ce6006559f05678f5cf4ec94e7b96ae659a3f2f854f564c1f4ac177a1e359136a183a8cd3ca92ee598500cef80cdce8229e06ca1c989dbc2197fcef170fe4014984fd54ced2b673342ee170c376ad37a1983554f10ef3c8973e8e54b0d9faa891f4b3de4fec02f3e79c5c3c2370d8d240cdaa0918eec0d8cfc70c3211ac131aae2b018a12aba716a93dda791dfe016445ec0a0d23c384ffed6a58bc5408c3ee2de7278031dae6ec1d2d982a207a4fcc9f36e19777e105b8acdf6fa0a975f53a41277e23fb7a3c7d67192aa01bdb037c5eaed2049b633e7b4f347a8852665a6d7e2fdc98abcad01f05094ea9fea0fb8d442d9bb1e8236b5b00b7bd2281a6debcc80cb6b5a826640e5b4afc10ca83a5f3c3b530be7f9c543d2a98585f36267137b6271d3843a011a75f42c91a73d4b9d05e5c7c62d96f51a556797b0f39f5740d36bd5483f010d35acf3cbac13ff41211ad53abbdc5be7f8739ded4b0e9ae3072e0d8cc76d08dd20b093700b3b736e40e5de46dd59840d195e260fb5ba6672a3903fdb571599cca9d788871873a9ab3c85f8d28c8c78a93675ffbfbff312ebfc19519e7959e7079d45ec32baf1c14c24e64a7b19a3b49a8cfde6aa21c75c136719837c1f2a7b6188785ec8b506ca1d49dffae9e68637a3e7bf2bae36da2c57d143aa6c365fe2dbed4f458f256a106921099c898963eff3b8470ce65f2b3d300e77fa6e4a5439449e0e68b8a1ddad5608b434a387cc340539614077810572b7e5ddae6c903888fb27c790de26f13ef440afe61a66cf6aff59443825510db93ec21cc20e8b8a321c4557f6cbb0fda207a3f047a42f77983537f5745e15c1e89dcfac80da89acbf14c4fd1ddfa0747893108cae8eed6af22fb3032ed860c3e5e383a7d2b490fc7ba89e245d3d2d88834bed679c20b58779b0fd0cf02b286886f4e04ff895b37adc0db049c7f16fa16f8ac8fb7f8c8db8bca582adb3aff1e4e6d741e5121c2e337199043492e3e6b4c2a8a1bedac120a3f64e636b09a74645ddcf1834dc4d7db71c00b5ca509816c2fa2caa1166ad252daf6912101dc2365614b1612bb98f4d0ab48d06b77b0b5d082ca5e3f1c508e78d003bc370d821652df4eda49505fef8a662d7870eda1a04f3674345a521b0a2d1483f533275973d2a454f0c392ceac28e31f635f717d3ecb31db734da55f59f9e4202a1da31720edfcbb2e416a15b8b307e3f5b3381a48a11439966480ef01956d50e05bf485cabbae61aa80df0ff292b0f2e0484d1f4ce9a483acba580588b6a46716acfea886f79e4035dc7405aa5f82fa53c266f04d339f1625a8812c4c4124bf81ca2eae2d8ad89b0a3e307f8334e593f50c62089cc854ccb100f74a921899b91411140e3191033d3c9766766dbe7750cea74d3310c8d95ddfccabc02c7c5fff278f1c5e5c082e34aff787f22c850e320b2ed98598e69d11f856366e164be2f168d4121b2a8f607ccf7a479825c7134bf6a9546482c89e0c3cfc42021b973da107900304abf08006335de82bea2f618e8d832a85cfdd513e60da859416e158ef58a789030a3cbe40f97857c84577499c5682a185cf00de6a4ff8d4c60b930b765ce1f967c4fa3e337e540f4913033f2eabf0e1fe6ac88edd68ada5bac5932609d21ec04d2ce755f5f5c49568a334d5b32ebd0cd30a83c0569206d4741b794130fbc9f8a6bc00db7c80755138b433acf8a6c5f53f70195479c5531ab6df990ba65a587c9b86fd0700ea1d32064b2464407e18dd604a6e1419ce1aad74cf47afc9799c5a3401f97f16bb08a7fc00db7fa062d69eb1d329927966952b69073a443b8cadbe75460a8b2e1d68f2e6add4ce7bb0b237a68281fd1766646b13c44d88939093c74d48c624a86b4825d53b0eaa4501a40e6da837c5d012e5e1d38029d9583d6f382bb7713af87ad039c4e01626da84eceb635007cced026127586da1d00dc6ac5c732eab7fbec0e48d53e3d99417e8237a06f32dc44946181cd400e6f15e3c40a706d1f41861cfe16833479a8e63cf35fcec37f37d37cb92a0ad446cdc35bb54eaf9fd879f78abc01c4d2941621bc87372c146870a0efd32df604b5d5447512f123406085af571163208af18d6006c3b0f3a9c88c2144cd75dc9d649426dd20f3f9606d67e118ab6387c125ef8bde37df0d12484dd1409793ab428b1536c73167eb6ab45fdb6096a8731a69e53cd3a5a8072796ac59a438a5820c112370464edf98256a6cbbb0d2fd369be8e252b017e3719e57a7d4d04b6ad3a55d57fd652106449a60a03b34a2f21e1c9f89daad270f9a22e85f927f5a6e8beb65d452ee6a4974de927b6f7bf8d45b4a3d32e136e2592978ea0c3203fca58bdde3330584306fb0402c9aad3be9d68ec9f05acb9e6feb71fac984f73daa7c1ffe0c41257100d77e10510883d8724db57a29d2606392a332cf8895b43ef540d5f19e0c288109e1e377bf561dd67f2e0474a4bbf42c024001c76db8f1b7e153b20eedc67f0e3986503f37fe0c5195e7e1445bac60a7e31ce62187675677d33e3eb1b6a4a216d8c75921ad58c15237e54ba522670cef8ae2f490afbcf204a2634a843e6ad43c3accfcdcdea683427000c2f02ee2e71d42a3298dab2357aa1697b0f222872fdc61499e611702180a0e6f5bda8c3ada403a69c8e3fc8f70fc1a313f5a01f8d35ee89b21ea7f7a4844e414d2d2f9b3dd84d1450c0dec45ecd16a788e9d2a8d0e7b0774fb18d2b30b3aa70e14103705b89e20c812a09a770afcc76922952ccf6ac14826d06fc32fb2258a616aaab895885a9a587ef1d71d22c37ae257377cabd77f5f5db095d1a006a96e5030757d8ba51612bf077aa1c127be0222d0492e9eac9d54202c974ad2ed4da5557a7888bed54aa4a60abfa21b3575fbc5898dd79ad8cf6ebc808777e251e01a4979cc13883ca0c50658bd9d9428e2958eafe5bc8c54e7bac5eb4847ccb84ea2f11aee30a8da0663edfc8892b3ab528a529d92a4402eac340d7d9d057bd34c1fa16f54e0d38f94c8d625c96305d89d5e423de05e78fc4ef11875dbed05ae8cf20dac68210c343c69710781d2fb33bf67228e5e26202f83b07a9a6bde1c122084844a08df22efb6e083b1090e1c01355d6c8521dbb0e0fe603825f7f621c17ed2f560937aef022224ee6228a4947d981f49e13060b04ad163c6831724174a68e57c0ed744b26b4ec7e67b8c58d7e80130b1f083a90e8bfa00d75cc09b3c1424273b2fa59d9f05cce062a87452780115611681d01845aa6898bc41adbe11c7d157631e37d9ae16e3adf20339c79c7528f28b22318dcfc0b8d18197637daf0855410cc037b4c1002519eaa8e8155f5c0aaab387a7346a76e0dde92cc052a8cab8042d3768db45afac78697e958fe1583f182a309408e98736d8c03416992623014715962891755f31b35a387cc40c175a1160eec6c340e410fd9435ed9e84a28758203ccb0060a9472358e8b53144d38d773fbf55b4c2aa9b45bdd7512d7de9f9e0fc98dbd35562518b850bbd0bb4219bff832056ad0f90a3b9fc2c7b093c4d3becef0f4264a540a371554cea7f790a3b28bbdb6302a177b8c2181e09c5a842c3bd504e7eaf3f08f41722cc947de28ade01608625d2ff1080ac2e115e200b159bb7b2c80dd037d5ae2c37e4188843703cf38da5c28bd2439e81d10f94c81344b86854a74c908c769cb53ae28bf23ff0184214450d6bad4718ce37257440b172f0133e4a2db3629f7ccde186195186f32ea47e19c75db9a6d1b99c5dd467ae4ed3474106c29c00d48f3da62e46a06508b10fc479b442077adf68e33597b3b2baef3e00da08a03b9f3def11dfc02c070c18f0d61804da56cefe6e394e409163edf73907fdda1c21ff9c7e5cfb6ec07644b0d71d04633b112c975d1f42b3fcedf9ed453a75acbdf9a828db57fd284c2640eeb976ccb12cc3028bd8f3ab25751a3dbaba2f9fb26405977ae30d2f7e5c3bbba26de88c28dff31657b9ecff047a7036687ea04efab82de6c10999ad65030f7568c63d511700805a8ceb5441ce94c92183ec14e4226b0c34acd7dcbcac7070f9ca2ee5e4018423f41ddbba1d7046674fec79cc94d470f459c35d77609622130e6c6f101274244409b211fc6cac2bb0778440c6998b13736a21d1f0f905d82e6b6e036ef9fe742e8053fc2f15b6620e7ea8a6dabc9e340ee3e9dd88fc4381ad854758abdd480c58866fdd88758c2b698daf5111ef67cc59ea6816034257ecf81d2009248e0d81eb34c3ccf6ca40ec89d7bde6123f7f9b83e832a1e919a0cb0c523942ef9d096e16d7d9714e7f08dead8e5853e631124c023a5e99da36ace6de2901aa49b94cb5a01deceed19a6d6d76a4549b96bf1217227ee5063fd1748839f5e9e61036b916775da0617d4f762a000a1825ce2e938affcedfe9774001d0ff1b4e60e5b98d2073b37a38bbbf67617d0df21d1f17b1d63c730c07d5679c82677e76794e675fc674a7331add765874ea32474c1a16d1c09382bd848e93eab9eb5a01836721c82811a037f330e5cc11e838453d5a32a0831d17b8a94dde27210a025db458201ce24f832675b1fbf71bd84787f7c846e3f62212b04e5b3894a8c92f5dab241186f51e3b958b4f309421e35bc287e937a4b8a93d89db9673386069d6a23017661bb99987ddea1c6cc8eafb58177ab3dcd3902bcfeec81703c8af6b5042884ef0bcdd9183658dabf912d07421a6f200ac34c8cc16b539025addde5aa02e7bae349a79b01ddf69bc8ad528b3f953ac6de0808fe946100ec6b658f555765c4d3f0f36dc35f20123abc7ebf5b461180e30bd21c65f58c9378c1a3429f78ec1d54a356907aa6d61f7a0d2638200f4257ddb799c96cfed6913456e95201421dff067d2077dfdf4417beaef34ce6781073411bba1684f465d9ec43ecb69b2629cdf04442393f93e6b05d170399e63f34f3ffda703cd39302b563395ce40285b11ac7704ced03be053e44e808e9cdb07560e81a45d055a54c60a2953f237aa157b685e67936d7a44003b8d75eb178c2c3678d943c19e19009ea2e46d81745603d58758257c2b7c997ff9d82d9d9003ca274a45a2c4041198f7d22c6fee1878a2865e5e3751afc640e1da112bf284b59b3456a21d51c7c677ff43a6c5b428a4b546b4933886c4e8efc284af5e4a8eb7abc4dd22876940a49d94b5659e98ffc7a302fa0ab6d7fbae2ba1d589ba4da7bfb28e087afe06f4ca9cb18ee8f67becce9bfafae3325ffa99846e62c33638d34f18ad0f1d44fa4384655b859bc2ffa62390033dbe2301b025c187340fabba37a00dca5b7808f1b09f8eb99d6d536955efcac370f2b235078c8e78f6af7b2e92fe36b978223a5688c2f055cc9f6769a0e08ba895e4a9031890f31633d9e54b58b754d1f7627617f02d052a7e9749a9682ecb54da79268147d001fce4cadb76ae2e6160969840083daf30b1efa28bc9a40d8aef64bf23ba7dde063ff8aca1275310e735fbbde6a3a01c0a7273803fa5093c74772d117d75cb1c03dbb010e5939a2c945716fe455634bbcfb0bee6ed39ba01652b607eb936022452e209f3d0568bb22d12494cbbfc1b5cc4ca2b1a39162c608dca8532d0d4078771f5c1bd4aa1463bd46e56b3058acb13dec4e3be22a3226b64d770ade759c324fdfa4a1231fb5b7e232072573da28100667644dc39366f4ee995d7fa96c30c595a648bf2b0157dde760efe0fa01e7120422815249c36169ac6f8932629ccc343508cd26bfc31b4520f98998639133fcd4c3a4b747acdd92f90e0c8e0a052f6904b1d92f29163693032070e174e008855ffd16c5e6e9c1e6e72e33a24ddb608ab0d60d555a81e9f6019d099efed1a99fad9479d3b6de81d7fe0488e442e1bead09054505b9a114bcfdddc5b8f25ba11c8fa63754863c5d22cb7f7eac11dc17438151779b3385f2fe012eaaf403d497a1aaa83f4c65bfb7f3749b0e357b45c4b9e25de22ea6730b1d1b428c0fcb3adc63f6df19095ad270981c7b3cbfd5c7502fc05767e99fcaf0aaa9d90b262fd2028d95cf0008020c86bbde4aa900979f29d18514e5dac38197a46c469ce593b45397d40be60facb9d2a34897f4fbfe6c89d4294750c5fd6addf1a0ea20a77ec75713498d418c3675588900e454ae7865f79b1f1b3c791182ef84b3157611cbbff667162982c993cd5514e590d328713bb1d85ce960794064395ccc314ed5acf1facc3c69ad24a24afd3487e26b5a31144ca08382ba55e5ac9a15e5fd1af627116bdf3d60c8758b194d22e85b6cbc0daa3b1606a1236b1944bc348e892e79268ee3208a5781f60bd1268ada18583aca033ae87713f64d86437fbda16ac02edebba3b4b9b4ef32f8b6341e2d4f6d17d49dd24857a14bcfe1d85701e3138e86e71b1777d61a2d659f49f23f36356e839ddf1ccf86118a8c221298a408480caa521c635540259aef9050177b9033f0a9f30d20f0a34a260b4be45fea55f62fb8312e4f28b0a2fd7517f099caa33f52aadfb6fe291960af597b8b999a8e0e1168b7b12b57a477abd02b8b23bb762a6067b8a6cc57b6a4b0da3583569a0e28f45e17bc8997ba7dcd5335c7e4a739f4945ad094872a0ddc6b4265e21ec44f0949a12625f051f8044a8cd40972bb0a32cf1e420dc620d056530790195cade34d7b8a86f6e6982b2493018c5d1c213513e1a56ce1d4b1859779d0eeec03f9190661e0cb298133d623b796f17f47ec8d58cad2ce05ee7e17b676ff3666a760d1666481543479ae3a68258c130b75110392a0d43c27100f3b9a232416449d7a11be4316cfc52a636b88b05891e645b877aa9f653165537eb6619452e18d54b35309bd0b5c8ae155565e85261b6169386a3ddb934247fa647c48154f02358008903b64f04534912f6f950d763fb606cb1c50e40f5e8dd5885b94af898daa666378da148fa24d28a85e6a462ec92902f7a3ae13096e58d74a528d35ff5f4a9fba7c57fa7e3c0b4441d9d1e5f4b7fe4acb82220cde64d288a8a219bb847d15dc7d0df7c0e1d408d1a50e9b2a6469e5379ac5897ee98999d4c7ff2d98b60717bec349c5737b7e926beeb029bd597fb43ba959b6da5da3f9ebee30d873917d2576d4bc1a6fc3f92c4e2c275a272654b642b616a107d118d48af2c774f85e7fa42a0eefbf2c97b86b38b20795fe87511f16ecf98e697a2e48b405feacab52960f33854c5b34abcf4159f7a89ca35c98de9f92449fa6db94dd6237c3b011604b80a47fccc0cb4bb639f37c126be8ba281ed0c408367af805977fa0018a88d78826996d9b94e0db692ae4081e62f938d4237b5eb888c4f8bc2591593c864d3b31163416e3481faa6d2a300488b4f56df6979ba90f16b456ff2572f4235935ab4fa39ff2f5303afd49bc32789b4d1e5799c299d3d90b9ab40b1c38b3b9d4592a2860912c328c8e514ffc0e5698228ccd5983427d87e4519f7fcb27d64143f3877c3e24fbfc6acf0169a35b7bbe5cd192e2a91d68bbf27749157c7751369a9f3f8b1ffa2c37f3de52e45aef92ae2266540987700e3dc6a7dfcc8b2211b1c1a085b0cfbfedfe80e1caf4756419b982eee91af58dd5327bae7eb8fa690cde97b4f1c58e971b04ab9c885baf7212285a0b4aef200d9aac35d19d4c2a23105305d8aa9ac95ddf23e7ef20e9d86a1eac727292257db7752ba071a430ec77d0c3fccb03008f20a6b0cbd81f8ed8a703f0ee5c24ac4f6d2d5b4edf52b378b11cb30efd134e30c6575db02ddbaa762d546ddee956a9997ab9a744b3f94ff72a01177fbe3ede6db85c7070ce00c9e69d2f877670571090a5dee02f16d7ad0bcbaa60e875c2622036321c9a48f81e27cf7a3f61b5ad160126a26490d1d5feca1cb1ea915e19f824b45dcac3fdfb19e433aa2768550115eb3b3cc4643c295b7092e559abd50a2f717fb17e62da5551ebe760615edf430d6fb25139371da090f478bd600f4e32c7fe1d6302ab44ff2f31e4749aee41f7f6d87f5d6274be83fd319bc045bf38c349ced0db6ce66c6e8f2ba7a0e0bba78346f9208d6284c01ffdee4bd0ad9ac6f55063ad9064fb92e1b39c2479bf16d8d2e9d4edbd2f363c5142e40fcbbdff9dee57807059d355e60f63802727f0883ee09c433dc2bd3b1b27e3d12855963f6df7e7a1fc5cacb68cbcb9101989d7041bf138496bf86235c7b41bdb094d3f5e7fa0570a69d2c59b04f34c39e335b5f9c886b6117934c7beaa4f766f17db01cf00031213c0685e1c3aefee35424004a73250180ab5eed2893c9f8af800b710ca6e63775e03cf5e944eb2088e2d1545122e7fe7c3f6ffeaef039b3885a1e83fa1a8e0e5e27e835730f3bf2948c9518ba5df08432548c70fc9545369964c85ec84d9e061bb6e4d1d607d20d5dc0bcae2260ab9aa01c9f86e03e145912be8b2d8b18646dab1eed1a831276ae34ef317eaceb03cb7cf2c9c71ff341f8c0df5a20e0bf1cdce7f1f1139f7ead07a7b22abcc0951ec5ecfaa0f50995a90801e168071f8c219d5b8965f718ea5a7d71f2b83028ed446dc9bdf980fcf686a98a7da488f2cb635b0d89efe0f8f105d217bc72246822fba4b601315e2d2bab45de92f9ceb65201b1a69c5ab34088daa1e60364e55972f54e5daa7c006ddc732994202cf1a841ccaad27b7165d61062f26abaf2e3479eec7ee334a25c526a5946e7936eeba03f0c42692be04b29d9fc20df07ee775af981ea0b3739b9753add7e091801959e1200791ff82eed2e700d4f0151123448c5a71f04766ac431b55031725ce618269cd0a3ef83373f2d56c87e960ebd1e006191f8fbedf30430a26685663c766f9070c65f2d06f859751fb8396de5c47d1a58465eac2305dbe5d2a55424d530b7331d9e5960aca1cc5d3f8c03ad2e947e825ea9da3f937018a8587d667e00b5cd7c8a740618ff4f8e8c43584c111a986e1575d3858cd8b3090451f9fbf26069f10e1337a63d6b0102c03ad1da936c6e1b3621cba016a0cae63630117930a8349ba1ae1fb30ca610bcb959f60ef28f5f6e761a17b2fd0bc3d5d9a30d474f747e850fdf361ade5f74a6dae058007666585443eaf858c99d33d85488b53635506df929b40210679357967bfa39f3ac8594a5a77d561b2e0f347ffd8b7ea896913b7c1d5379d820f3fa3216683c611ffcadc001b9f5f7c161fad169d2c693970e559c87cd6e2b72c4aea58c03ca22b6c7b91d6b1a47654902adeabcd5cf6ac76b4c560c58d017f5d821b7abe21f78db8a705dd126e2e2e50f43be3cb4824284c13592c6b20d09064a28a132644732c0c37a59d6ca80f5e5668c2029e208fb043c81d4cf40b9297549f76f8730a37f24bf272ff0700a7e17d16ef2ae55983483cca59d66b0f255a1ed0ed4186acb21bf7041eb2db085561c42132801f093d705d4c4d2367f7286025761d2a304e499b703a7c599bd29bc2669d04cc2187e7c595037d015834cd41dacda32b55d8448b2c5979595f43930aab7200cae19f9d97cb5a89509866488da1f17b8d65b85699f943aa7f47660c946df04173367e12c5847f8cca58ba78427281fc2780a5e1fad2dc2bead183c834ce5f3cb9f40063d0cfae7727245646ee36eb347c77c9b7d65acfa9028d46e7790c4e0b565260d669d80f58a96ce0b77b22049e8ddfecb0fcd67ab3faf8aef979467e10904e706fa4ff3d6ce59415d15ea994a555fe44807f3f0b01f92c118348705da1f6daeef86c1bdf25d317d0f0a08fa5e217a9217a76080f1f8e9bf78d6aa64575c237baeea12c491bf9644ad833005a5727eccf57f419f609a93fffb99fe451fdc4d6a7cd81dfe468fd0678b06bcd4250aecdc92ee1762904522ce222ae850841f21b40bf5f0e14468466ba2783e1fc5b2c8fb548b23eeb31d2ad96b92f452bed4f818e8cb406eaecaa8c98c88d1bbc534e5f4b76dcd2352faf819f6f96df30140491a971de2a23467bb6fc3b77b590b2de2e468992c39fb5315548bd159c5d7310e9f49da122aaeeb2f7982755ec09b44b90ff4767a0c674455cddb467a8a898a3f460eb8baa826ba834004d0636105d2ae594435a2bb5084e061ae6ab5a397893b94ab0abccc3260d2d2e41cadff8c6743732c6b35e76ed67d54fbe37f256af1bd7b64e6d19d6df187c3b063839e4ae698d98d8ffba03477483461d287348656c2df11c93936aed88d819e0145291aae2df0e6f989ff2287742c0068817ad67d8e901f068931b3a052849b426aaf04653a548aadd81e2dede22afb3824500043680653a0651dcd9b812a2442e6a1fdfd000c70d5b84aa8fd66538709ae38f17026d6f41e31cb1423627a7a1e73f4f137dea6d813d72d40dcb7f47d2e5cc666f45a107e52c458ec308636689a397a873856664c0ddce8d207533c19b97f85b95d98e69258691a48b2a2ac8d37a02020b03863a80d365fb3faf59f5e8aee6bd733a1b5103cd55744c6f7627a1d74278ecbe05413cd47ad006f2842a9ba906e17af17b532d03726611b797006633132d1da86fe46091a8e2969301ec8de8d43e3f3337d2e9a65b812a8467d30a999a0945adeb35069b4f067a5b4f364e1f937b5d20bf4a49d91cd937e7b97e82b52acd0da959ba7a81a00ab520bdb9566a86cb0f5b9039589d9bd68cf44f4ccd8a2dd917ef76b530acfbc53586267c888ddbc6f0b6b1ef07387f0810afda43ba06b9ef4ded20643b9a242ee1426b7219a9983259315ca2c24dcf0e7c15a48c71cde13d0d4bb1380ca13074647d56b9e86af7dd2b8a6bb520108d3905814374e765c57ca3eac32bad383b5454106cbcef614b02c4ca4824a2d12b1c2c905760ed9b4d20120c472ae99e742eb9ec1ba4a8e8bea3653f784b9b39564158dfff163a6326de2b24ecc74cbf9b14841df10cde47815f8b3cc09f0bd23f238cfc1c205f5cf617608ba790f9b783cb0079c43b238e89e4598ffad3b64227f7404805edc9aada58bba2f641e60540e714063521fc7d78cc3dbef193db6c1017952db1e70116abc01641954fff0d697b8600a12b1571c9d8290d64754c648fe50e0be41a7bfc7a4f691a9c1ec55824ed610b6f3bce1c3827e20bef117c8edc0e3fa81a7674d22a3d9946d8fde412f8fa9476ea15afe70ed65ae0d3a7e18061f7ac1754178ca12cc6a8b8cde65c7791678a87ea80a635257c4fbf0ce2e5be48ffe43d827af2b184a734e3154d0cd91c32fa8547138b1a0b1f0a2b1144523c10e75a989f418742c86d8b7caeccbc02c94f411cfbd2e563e84caab71cb50570ed673bfc4ce4fbba72b492ba63bbc82c0fe8460ee24ab14379ae927437d3e5b410cb01dd1ed590bd836f8502dd48c990618274aa39586331cf1c457d7a00f0d59a0780b5a652628ec3f787110e603862ccc30d828750a1637c720c1404f24a44faeff7d079429bdf214c802f527f14ac0d36ebdf1bed1c9ae78b4aedbac82f73c4a10a530168b24670801bafe2cf770d78ac316d8a05c2f6c84a213376e3fd8a9efb1de313a8101910a4412e1e7576d630954928f1d4209854f40a8477d65bd4ac730291488acb127504b44fc4fbfc1a7654acefc6a4f2066e66cfd3b1684512a0dba98e8fc99d73c357e5bbf6863b3ac156807a9aff99b34463c392e282a01bcec42d0344c9b0551b8c1edb538b97e83d26001165da7d8d141e6d3494ff6d009d50725dd54133c6c25058a2b611d576692ee2b63c0771e9f0400c944d7459a061858a5ed477c59a1b12b8d4e6d2378c711c0ab6f538aaea99dfc682a849f27b553b5ca139547a359b9c17878056c1acb62e6d09a72a9c7e83c73ddac93f72d7718d83cd441dc43c92379fd8fec9f369db74d20d0c8c17831a0fdb4163e1ab237c0d1c2eb4c259ad24e8740c1870b5ac20d1df7342b104bb36e99184eff5c787348a704884a03d3b789114922a5eb15c13b042d194df13440aee0e5017c9ee8f7a33f05d41da6f81a2dc3fb9faabba0d13b30983b12be0b6a78b89fb2eb31cb6317e443829c16c1ba3c26d7936ec84de4878b9b0e8f27daf15037170e838c624e8a3f836f9e06b76c44b8151159c5d50dc06e323e741d0665b544ec1e763fe8c17866b5f89086415f760630c666340b8b1a92c41a813177f96fa602f0c540e667bd745c476018c4cf56daa9a360908816d8fa54b10416436c3ac5123ef6455ddd0da899427173e26d9dc5609ac944d1421384f568ad67be10ef6d07340fe644d00236c24c68a69b01263ef32e63aa3046c09fce533dde600c037eca4346aeee56065475660ac02c2ecf46518b3cbdf41b1ad27e27bb4129cb1cf5a052d3e61c7a7d668455f90d2a483cc95c644ea1f55d5fa75009da88275776a402fddd46eb3da3611e8cd0faa1d89d3d254d97e9485119ec603ad5539cbf0c817dde61e60d1aeedb4990a878e885b105c74d261b986b7c82377c26b2ed5b2207bc3876c431a742fb0a0c72c832af04644c53c6bdf2c90b04dc7ed58b22e79c6ebd25a5039905d5ca2fe4fcda193b2a93b48813e70c50b116fe6099d8a444e77371aa6309db97a2a2bb55fb050379d3d5289bc63fc020d2080fd8af56a36b057b8bb09a28e6b3cde1470df4f392cbdc8afe63fb2c948f80e3b7f7f435cf0f6596fc706dd89288ac714e0b7ef75eef9642f1ac96d4032aac6a9d6a3f9f0eac5bd220d37b0691fb3be586cfdc1020d762f47d9a718b291e0345353c93d4da9b51a822567ca88c3e33c0acde75d9b546cf4d67515eb4f2b0b1654f77ae96abeac24bff92cb9f6b6747f13623dbab70a9a659bbed322a39c9cdce93446f1ab49b7537bf23b5b5b5613e0bad31507f3b3168b442c607fb0dbe7cf5d3710be9bc6a12c054e4c49c01a3145a85fd7af4bfb6dc633b019abe881f2ab0411569363a68749b8e3acfba475b85f003b88c1cb5b6e044dd29dd034f15f75cfc8b04638e620bd66f72423700892040c656f2246185d4c5d04638d3b017309df39c670a47ca8941c8e3339f19cf43abe160bacbf8d173ec4e9554bc3ec145fa4b4871660a478c55e926c9096a993bb4a660c414a621b3d8565758e925d2d0ab574baedf7756f117bd6492089cd058601f9f2346769f1e123ec3880a9ed562d39cf36212ab53ddd478dd5e4be0aa7a4af6da9a1e90c9760f7976c2346e3569a1c0aa17711b66400b6a4208bad751693b87c3b7929ec0c058433f4b4a91780c7377239214f5a07cbb5642c1a792491780d97162af43d5927506771e6013680d8153fb4c93e7adad0fe3a79b807641e3694dd000e29078734ffe50a6bb06bff25cdeb64290c420b5b76a6ae72110a4caeabde753a2efc3ad32173c0bf60b84a935b5def787aed08d2f4ec75bcaec4b1025860d1c7367ee08271daf49764a62f12f6686eb01881b94e83a22f5826957f62582ed14e4d19c007cef8e312186b5d1bd966f59c8a65a56adffc526d1a06028d28c5dbe291ca0a9de084725e5f262ee3dd615b4b0a797a5d813750a325e7abc571cfa84e72d7e96ec198aa28ee9efc3d01383c7cc7aee117b4394eed94bc3d1f57abd2381e2987ac0189f0baa0e23a631846839bdaddb697e4ae5e79dff770c49a9636223fa8dbe8b2703bd730604af7a437520781fc9ecf3f2c77890ac9d3709fa12b99858d5785e38092ba965122d8e071a4750b2bc2e253b08c902304780f8040acfd01a2afe0f4000a4eebc4da7e838a158f255021a29f855a738f5b43ca7ece0342e8a4259bd2431a2265bb46970e16f6b72e37cb4534b6e13c8c136cd54631b8666075bb7a6b7e7f834800eb380c6dd030198a6a442ed974697271fc06011d1468d098b93c0f2327f6a030569367a83f9824e292a7bb3e3d5baa53bc408c3b70583464dc8023704b4dd3650be1b9201008cbfc50f94d958d5d2641c0ee6a1eb30dbd035f69add83b64025aecd8158051a3c5c3b1163e1b40b89333ee14c27ad4c10e8db4e1eb5844e5a644ac6daee1a876e627d7163a6e941b59ff6260a429bf01cdff912f1f9a1b56ce89cad8905746e3eb73aaa33fabdba582e49cff51e1c690c6203c246b02ada9baa0d58f2fdb367fa710b982ac0d146af92dc85a367e241ada40cf593c99c989b285de88b810a44b0a0e45fc59da34ec0a808a2634e618a29e715f5345539d55edeaf7db4c754693d29462201b9e3950858d7fc4394840ff04fe63a75def7fa1f464817b223e0e67a1bd483cb9006649ae4581b509c06e378072d98bc9c3b5a7c01071878a01048706085320b1e9ee6836137bee51d018105a7da87384407619a52c806a66e5618bc0097560c0dfb7adbe1091ee4eddbc6b61d2ce06650540c299f4d46f667d5f83098b9c022505a57059421ced88a485fc03a7826823dc5300a7a78bcf37d069478384472cac0c02cd67c38f87dc160078091913e08f5abbc7fa55b648a3b2643530cdedcb9d05da5ec6d365d5e0483a044065bf1810b5ef89ba25dc6971ec41e343e23bed627e3292b1199b46b3f98c9516923c338804e5a525e828b684924ead05b030a2e26fb5600ff486068056c654b3b0f70d8b6bff66c0ee32f7503342aa0a5cd2b7f5fcc81c4a3f46a9e2dd40495709ddab81478a5f001206b28cfacb49195be0f4140025e0a7b6375d4ba245f9a9a80c53f97d1070e50b376a1413c4add6c649c4e0bbaa4aca39ec930e482ff1ea36a0757cc6c20673bb352944a1a27696a6da2726e94134f36720473092cb6f0324cce185b324ac229de4d2ab14a70a13739a1c890bdf6ba1c7e35b5229449330722e35c299366d43af6d40e566f9a7fea1cc9892128dff49806755e06d93a26f1a988ea5cb7167933d0c7e96a116a47bb21af17399d5c51b5cbb4418b60ca89d776af3249d20df60f38f43af381c12a30e323636a2429359aee60a16161983e76a22cbb5825d1687cbe64add3f817cbfd01e1504b4ac3c79d8aba682bb63acfb4b5f4cb627b74a7c89bb7c07e38f8c61ae2db674f710f3d1a1356e2a3aa4089398e86611cef0117821cbd38488a308da53193173de6c601d38b891b825ed244fef6c6b1f3a1dfd86e4c00109ba0cc9d3482813188f657da66e85f45549d4188fb919e86f89fee77eba431220ae6e9360a28471aea75dd9da2892bddff49636f9481347afcc12d69a15fe20c5e95e6b017512705181f1451098a77c07ea85877b85fa6fb4e06af6af660ff859ebeea6280d147613d21bdbe91f1d34d2c6b06f2bd469451d60522ec448f18d4bd8ab700e621488398163960255bfe5f561c101d1556697962111b482298ea895f9d7be0fb84fe5fa2b3709195ec99db1482cb3caaf94dc4f5881dda33134a70400fda97e3cd5a453559cb3f207c50b91162bd3903ef4a333cdeaa752801f347f090d4434c1b97a75fae63074ea4b1e5cd93e599138855c899aa6ceac918662bb584d8cf06211cec2b927b2918c2827ce6653ecc6d81b5f49ee1c753858c2c8e382810a58504603d08c4b88b78c23ce5ecb98d740a5ca5180a480224d1baf97b2bfeebeff0b2adce55446955ce0b1b9073e84753da60556901ce6cd6ffbca803ad585a42c3532c1b494a2c1f8b6adac0627e6eb1b7823f98106486da9cb96608bf9f2709eb88cd38d1210a955006ca2c3d83bbd833a85ccf5f0221f2f9afbf8c907044f213da16122190059c4a7ec8df7d26898047895154b125ac7eb430ceb58bcff24b58eb1431bf000305720c323e6f97887966a04556fe73b5e3b8d05ceead3dc8c712bc387083c96754210fd50a2820d686d62a4df6d29d1de784ac040d84bfe48cce80f0c3466b01fa177dc7b8efaebe4e569bebf780cfcaa66f254c15f23e265d630c76b5cae029de0b9c963a8e01d2800924837b989b32a5245bf31e2ca92de55894c4982e30d5188082baad63235a7cf573642c78476bfaa08d3703d7a17251b123b4dd10595e20f09b5bde5429791bd49ef044e7f1b28a3badfa987ff5e94eb2be9ad6b783a7ebabde0477a5169561c5930e1b375616d122eb3be7188c93232cb9faf4158e59be2122552b05a547fd1e9fbbee673ce39ebe979a635038ee22fad68e3e8003d247d0d217349bbe45e0c828d04b9fe392be99da14d0d773ecf3a55e7dc6591fe8d953eb23bd456b5d01a5f8177f7bf80dfa330d773cf13ec9f8f9fec9c31d66a3e7963fbe7717f4f8093d290ebdd744cfa9456ff44b6ac7fc64952bd096efbedecfb74d53a7f79025bfd0d577fae6e35a7cd2de7b8fb5e707b2c6c49f53d037989fa7b3978f225f9f6f1c743d279e37d43075e14f84defbec6d7d6c3b9fc41bdf0bfa9e57d495c4d82f1f7bd04c65cc35f231dd5b276051ef9bd84dd2f33c57c0f133f28d128225e91b8b9cc8a7fbaecbf8293e1cf2123ec93400002024b59e4d071f319a9ea6cb4cc59b200e2bfa2345177eb845f058747b106d275c4a34ff2714a4ac79da48f00bf1cb78bb56909ca2e6b6b57c9362a19f013fdf840feadbe3d3410993cb0429405f1f7b312c9ab256c1a2ac3d5d380a296122f450b7ebbe10f8500860bf7db4bfb50bbff0922899484cbd414fd35806b3e13416e5ae57ce4c04dc54d0830791e0e049335a3a9e4146de2cc13187a03b983ed4e8b79cc1a131026d0ebd6a8fe551ff694e680c4153fd17a83c58bd3f2e60c96a1563ce86bae7d23f1eb74dfd7605b0146faaf3adf8bc689773e167018e3398726209e210f70038cfe426977a503bf4edc9dff8a5e638cc737da1fb9ea583c5d3f80ffd61177094d2d99d3bd4443b6b70779477b081971bf194913725f3940819dd02127a93a9c721f63adcfb037cd08be1137d575aabae3f91dbd937f2fcaf05f29db61899d47e2dfdfdec3f5802cc2b03aa4414c59a3c827a6bf5aa056fc51509613df4e4c2196b34b41c45db71f2f745ac5c998f8a7deb5ceb2eba2c1eee9ead180048df1542f8df08c3e2ed535cccbe20455c167c44f19ca9a4f37af397abed1e63a43468d0150571995d0ec208f46dadd92cc023487bb1b4cecf216d3660ba8e7391bc236d9825e8e07c25d2c41a1f10393c26cd0969303738e4b54e89101750354eb982e09251756353550eaca2e63eb2c1c69b5506108effe1b062e51a30d68d276d08c3b806ea66e3a11bb94b060f80aab2b06a3c319f79483606766ea936aa11ac4837ee9b349bc19129bb8f0de9d7c6cfba62189f6a6c4b8ba8fe28c6165b34d0c456fea1e8a3c7d60c7647b34f0e808ab67240031fd81c8725c125982191eee72f178703ca31cc8911be7de3e05e7e00cac3eb6e837337a4787947ab810d56afe8f1af14a3647a517b7c6e3341495011b637c6cd91c1da47214517e6a70ac3af547512d1a31af805c950ab60c663b5681721df8447f5054baaa65b841228544a42ae41ea382c98de95ac6ac8d89b6aaf40b86cda5f041b1522232d3048b645c1372dc878b8e2a14185f7b48c49ecc59cf9454cf64b410663a59911f056b402d17d2f36d4a82e723bbcbac5806d62c792952482e32cbe4e8385871fdfc8ccd452bab7d8556e81df77ae34f0cf84fc7b553ea4c54b61a55705c2e2fd3d868bac900d97a502278c8ac301330e4fc8b589097e0a9d96237afe58b27ac6d3dc32017471b058ad0c1929146d1f68126c3124d40cd3b8ce89fe4a826b6dfa671e669d491f33bc1e6bb4e13481d67a8793e1f54a50e2ca0dae1356fd446236792d4ca131af19ad30fc62ee3e8d7bc6f410ee1cc26a4c1d73cedd9d608fd189a082c8645026244c998da88ba496269c159ecaad3880aa5e9cacdcc83a5e7c7109904645422e81bf47f03b8f6bc510ebddd9c8d1a905b4d864258d44617bf4598851534395f3654e9f2abff9055c6bf2bc8f6a098d459d030fdaf25e95fe6ef12b62554a2766433508378154a1f159802414d4801a6ab48123a88b1b9f0adbd9508c282835264371303e86514c1c3445b9a241272e7d2322695ac9759a6980962127045b3626ca59d4b890930f4ff15be4e1fcac590be4240e757d6893b284d73065a13776fd288843a0198dfddc34091ff4ed733d6d01b89db5d44ca61a81c06b7788bd745e195d02c2d35d5183bc4a4e715d2e9bf5c1888935e22eced9f7f9e176f01349771adda6be0acbf68435f760be957521fcec2ee9bd3703e366e03f21a3072a96d033a81eeee238f0546b742d3dd7be9d95ed0db79216a9864ea59c3b3076aede77e30a8b3e71a316d0d8e5d996d93773def1f23868cfc88286c723aaab41e9920c94888008229a576abd018a00feeee37853e4a3700c1fd21171f7c2d227977ee01a0cde8d9866b77b3399f5bcb758e6fc620bcb9ef35644c66764a2fcb9a80a1e06d2de29fecb081dcb9815dd0f4a59901b9df463103bef6866398c31604f727d843b19575178d8dfdf2d38d6aa7be7d881fd617132d687f975e1121b357cd9452465a6d2c93eb18b57421e0b14513baf8466420c9b38a85bf424dfa4e582ddc1dcc3d053eb54792d1c635d708147e4b50710b5eff6e0b28d4cd18a71adb0b386a73fbc5f9d4273f5d3d1e56503a0d60a7adbd003d9eecf0871a45776aa00f745e9aba05c3ee95bec6946c3f605630f8e5042de83e0be9c7e538d22dd184baf71da5264e08e553491a9489ea7d7f23dea95b1275d5c4418a01f923ea2a89fc6b52568a580f295fda99857cce4ee5caefa5753ca1710ebd4ae06cd2095c16b2bceafa17ca04313710f2f433cc1bf1059b8a52c0f5b1b4881038da545012e7ea469f066bbe465994bf525f88b37335669ea782b1e05a9b92fdbe4080e710aa226a91df45ba69020db5096169b32f4c469d4c0f12654f5be93ed7c7a6c96e585e2b897855b20e093b28bf4a079bdbb9e66e91ac4ae811300c9a0f3e521efe42a338c8703cd76982034eb189acbc62361af7405c3f61e36fc07962b3b3833d3046ed77a4582b8a51a848bc6572e68cfdb9309955e7f42de508692872c4926b8e69a7187ab71062b89079cc7e74b0bc0e8bde1e30deeb70da141db6f31772488ead129a706424ffbc4e68f8c2d36b5e8b9ae2b31077735fa67540e405e08b46433d7d451b1436b107400600b958c280f64df11bfdda356c9a3bf6147706657468fb8beaf06904ec9951431a4b9af90b89a20f53a903ef547f01d89e420f1ca7e7c2235329c75a4190167afa4c7a8e39069d2983bd6be9eb223643337ae0aac186aa77f5e7cd717a98e994c4e269850ec9ed070f1df74ec7ffd53fa254be061afa26903cfcd5fb1d2bda3886ffe7f03cc5dbf58a067313a5d843e01056a640f8547d67e8f092247991eadaa7dfeb64a12d5d06a42708e5c7f87e3a6cd6c33980c3a8bfd03814fd2ccac3c2e0fc4e3c04d7ec7dca8c88be153b5eb0b4e559a212bf49e206538423eef4ae41f0f6b3182c0a58c2c1b7de41fb9da84b17f25732a34df14b805a242ca0917983c1e364dec1274dd4f2cd6e132a0ebb5972e9530e490a6be7d3deb16ef07f04df5bbaf79c0908fcb9664392540bea87d7e73d3c8ccc2e1cd577ab68eb7f293cd8c302968b50444b1ff0ee97fd8845e58b184fb4721f6ef46b121d2db06ebdb4bbec5447a8682fdb22f6df2094001889313d9fa7e4090f2338db0efdff06f510b9d291408878882c6f57431987cc5a931430e6f24942e1a60fa6f9dc2ba0c1c40a8f15ec56724a6ef955dfb9252077a19661e41380c6bb4ef435094b8e9314862a2a251525ad82e6002c48544d01828ba32496a3edf791b7b225e6ae16746df1a98e596d607c720ed1e1c78732b43e10aad657965cc8c502edc3b4ce932f093af16db9a588a8c97342848f27adbf6492ae6b4919ab617c22191071ad022f4abdfd361e9b843cd95207c166539f68831e33f202c343d86ff0e3930615ba522b73d89ed29b4c6ae20764221f519419a54b453c4d1276500e94d0117c5997739d01ade73b6f1b6225c82481d94a0880bee5d2a9118d14295abea10d0a7ae4a760e48b74c1b314083a29522748258d7dfdc350eed5fd96b70f6fee62de6ecf8ca6b69c879b65a52bf11a0b4e92389c612c0ac25fa16e53081f622af84f2942208ad1edaf6799b7e4fd73e255fdef41264261dfc6f0cd1484e7e5999756208bd905ff3ba8f55fbba1571b45021ff178e44ee6439ed601feb37cba3f4d7bf22b3dd25037fd8fa26484004d3aba2883c6ad00b82060119e815c61342a04fa15a43cf3c748dfa3aa587f175105c75c20403291c8e1e75f05eb291a38d0de6921c93af5f0542e6e2c6fd09e71b7a86ac8920d5d4e2eae19dba90c7b0c466f34dbfe3f12841e104bc9ea159626a0b5ffca717bf0cca474d536868c8d7cb22725ab186900ac40589691cbcc22dc96e1f8154220d3dcb186a244b14934d49b10885773a9b3ebd7396a05f5c2bca700bb5649e7a3b3b97a0cb5cd77b5b0311cdac2a20346975a8c4add1dba2ea0b7a6b8a40b3f5120f5ea159eb04786efde4d65118fc086f4a5457bd0d0576f25dc047cebd70e51cf0eae4e96ce38c2bb0c931f7f460cd9642e57275e77e4366368627677ab19c30fe671a019049f705f93f50d77f322113c9c3112336167dcbc89ebbe9d1262a8de74ee34250a586e1dcd53d29742ce3e6b014b4372a953731f3168505354bd01e21e65a25356ba495de44e0507a784a8fa07b23524ae69a9da5c254f584a37db1f62b015dce38dd851f78fbb84d0c3d574eb981c740bd5147b64ccd06e1058ed8bdbbdde03fa58700a6b0068e8b41e5e873a9eda7ab3079dcec000ee19baf98ae52d19c9d412315a77531518d5a9c6978e36b6128788860671838717d7a8b91b0b3b1ee563b26f88518acaa9cbd1e71ec55563bf7744d46d7c302c78278b736998d93c25c93f55a2e0ea32f280b82a59a2b9cc161c65a507822012fffb6c3203072ba727081e54f1bbb6be3ad2e3e7ad5c4a5f3f0cdf5e103a10a74e187e86381c8a344ad6d8dc357c8c60de518e2150dd8610d19dca38461bca289d84b5e01b8443e77ba2a966f26f7c0aedfbc1e2a60c84dde040db9cd9af27c76c9c46615e912d6f097cdd4ae016031578668a388b3c4c808c9d8737a03c6a5fcb3bcecc886baf314be36dc049bd37d85c5f94e75f340b4621094f490e04ca55de39be99944767df5d262ed0899f3a137717ae986dba5bbeb2fe115d2f1b614e1d852ec915de1af4a731f5c0e37ec7a7987a2718798278df804356d85c0064ba127ef49b4347c34913ef0268d7cd8a7ce9ad7f98eb2b1235ec8959b9b0b6db6c69a79a1980c5607f824da17510b1d5a639242c597a4ea6149761b89d622a61c766412d806785f4eb27c8ca408317019decaba9111f1bd493231f6552a04b1acb774b3e5bb375f9342cdb50013817bcb3261fe7a09f9b6bc67b81de49238f5dbf7f65aa6b16d43539ed8353390d7a08d82df154e703ae40a48f222f64fcaabe8d85b80e0233efdedf2a3ab50dfdf2ff88f6415965e8bc941d7a332238f46f0640a681015b17b0debca49ff114c6561dd9279a6b0bf9295a40e24ddc6c8b91bc6c5fab96347318e6fc0159b9b0725da829e24d37c0f19398be8344838d06635fe9962fd5a38e713636bb204c0fc628addf3b84f5459478e513fd3f8205ed439a288526c95bf850cc166d1039688d10a3ed14fe0923e85192dddcd6fc131c31c058c10f4c3bcbdbc27651bd3f570da1faffa4399d4a501114744376100c2f5723784d44d46e2edacb9f0bbda283d64858050fcba7323b776896b118b20dc07ad610491d29410a421540dac6f2227ad232ee132a2f3ccfada0d25d0eb3cbef4c6ef7b68b357c632164bab0e584c89ebdb7570d5e223ed6e1531da2ac84f9c415539a487d0062e97abf7e44d8874675d327616e55954edc4e96eb2ae3ae1b0d37453dbf0c868d5d5c1b08b5e685a9a00467ad53bb94d2bf05159a4527ee922fde35553c74ae277d11dac9f9f2adaf18316231cd394db5c34c236adfffddbe67ad53f93e2953da2679f45d8dd2ef6aed170559b48a650d1ae683295f298dad7657a87ae49f7a420531d2d65664de6248c2cfc93bee46ca884e1c2e18d299f1c679729d328dbe2e554bcbaa48f4c01c7d79adb1636986604421450b0984397a4c252f57f1cab05ff38cd5cb8e4eae7cfc919c5dc74013f4b6b32227d91b708f81ec5427b6df1bf45375247e233e95d35e56b56388a771adc9ee2057a2998f69b6768e8b6c7cbe848c09d0a32a450737de423a1e298e05ccd1ebc9ac3114a2d708e48a21066d737012ac4312c9d5948f375cc996f67ba0ff9c7163b6296d45a938a38944f5675c4528feae9bb66734c41ebf336770c121c0529a410a08d03c8bb05b5f1841570ac56f3d15960ce7e18b82736417348c741af45bf00117d3f61d934f5a0b2ba065bf70bcf701a2379f5b4ab0911d9f622ae615f36bb85889aa6a9579df08670cf32642260276765b1efa3161e49e80b4d7c72619f9d65063a7a29b7ad9af18826c49d9bdd108401006b19f8fc1df20be2be1de6b1d481b68c8eebd7dc00b9740d7b110c1b9c282c1a4113d223991bcf9f2d1630c6141681f8d79e056e7b328a546c8da54477772879f705597c20857d6ef094996a20b873fa837fb15a80081ff11c7063f58f2032429498cfa1dcf664d006084170dad90eaaaaf1d908bb51b94935d87e3f4c1a0770988459fee53331d441e77430a19f7528591c5eb0a4ae39d7b37dbd87abfa402a4463c1f6dff8f3b0fbcaecd1ea153eff8f1727db6227fc374f68fbf2889de93844a1c54ae09420c6e64e453ffc80149c3d99ba98013fd8890d521b60861ddf5c8d7ef7f12191925bfaa5aa5cb7bbf145c1593349dd26c95fc5ce2c78771570a2ba9c05260a3f8db0dccf32220a47061231d6312a19457c5dc552b31090e156db4b987c6b0ec59cd6f2aa09f8be72edf59ee4ee87d481f092d7a20d9b06f309f98574ad1aab78a080b0b86e4b88a95a0b0de65b32d80c1565ba415960b1dfeb6c8a9ef01cce47ad7d503d69f56938a81b4577a1080646d5bf05a95f6fe80b9631117dba983a2099829bc7d3e8bebaf41e533ce76f465d327a8674302577a6c6c665114d8032c2cf0aa687b19911c8c3aa3bf29928a3c16fc80896ea15a9d188410c9834ba7d86a75621a0d13da8a2c84a30b1a881244e3fb249f0ee5460637617c018b4cd482198fe3f20c5f9d2ed059c03537ff118d02e9c1f6053361a506ce348a775eb55f4b8fff79112b4c9763a58fba07645fd942f4e31f4c50cd235f08fd05cbd6b25191f569272a121ceb70dd0f1822178fcf5500edc80a320dba4ca885e5df37c51a400b05951804fe61117c22119d1c3656e01d45b62a36c1397c55db796f8ae37fda39c18dddf9a37d411755cf0013b6c8ab0fe8e784f00ccf8620d4a1974d4567d3bccf54bd6687c344583d1ad7cb541b222959e3f7023c509e1bb64f1a688544156f5e3181828cd44661f07d472c39a049962dc240402a0270ba4eab9e39c89ded66dd4afd090a4a5feb4c5c3fccf460c86b773c194880e598c0dd6c73f0f81a6776faa6b0204c1fad554401369b70dec0a9e24036865e51e5ac3eb3d9d5b24558e5e46511dffd218aecab5dcc0cead763d5fd65e430cf1a37d4f4ee26de9d4eb723e60ed28ccf549b8a5f3187b9f3ea5710c2abc5679667a291bfb36aa52bc526d127ff641d767b3915476cdb0554d12ec1d2ba792c287ee53e2515c099d4f699e0755293a3baa339f2c67779ce26371ac91d58cbd110f42d79965f92b7fd5497add91e601e344e956604a3f4788b2453fabd97c05f488e0d50676e6b10be7f8e75c650df159300a31a4dadcf20f1204ae00867c25d4de1ae5e5b788413bc5963f09d8f7380971390e212f5d6c81a8da9bb15ba037dd4366606852c3b9622d573389adc304a6b85b60e91e565ad38f0c359a100a5a584393d3d57b9b4e2d2c940e8ac478412278797997e9709d3ab3928b0c906b9e69cb9262080853e1c8d0a856f9d3d571f9e48908e8a930a579a8c52314eb82e8d5e1e7662a4aefccb7c447328226aff9f4ca67e594ccbe4b38e0a6fc9c24459067b3cd839081e538b305723f4ebd37e38e73e571c9400bf9d1c73ae9101ed95a6c112ce330ad16e4a1933e510784684b31f86da0c98e335f1faea06964f9fdc8f109f14e89be56763c14b2833892d15bc97a44355adadcf0a624b73c69ff2a523d00b4caed5a22b198c3020d338ff7b5b079d227c074c7e3557ce0467b692aabd9112a6e4d2b2c8890f0e697838d629a6190a0f24dc74f4bf1d7437a2f10a6ed711437a79a763e4cdd3cba2fa8eb28acc2527b9c78ff9acb08e1072418ca9e1dfffda99bec6e0bdbdc8fd016edeefde8db653ebc30178dc5f8ceade90e1c091c5cb92e059bf22664775275c1ad81fe75e70f675fa528e1cb067f872bb0952add0ccaf385395583885c71139cbfb4b730280913baf92d706aa28067ff7b4cd3c3ea2e75dc42a6c9b6d1d0ea02cebb16361a8dbcfe9ebd73f901fccf040adf33c25520d65d491be1f5d7aef10f6581056dc186a4128d9a7d5b4f7b4ec5464bdaa95c7815ba2deb154e9093946a6cb502e0127fe986cc6b4fdfe86ad548fe595966f2aec2c47caf6ba7ae44f6b746ba0959da422b7b73cb8b0b4f0bc70c51272a4949a3f80aa5392037142ae42b08f7e9f455f395e94f3f03b74e534aede5cbea9ca44f29955452ddb9c964a25a13ea934a0d884a299d3399dea4692217e91395a2ce91fa92a252fc222464914751c75dd1b5a9fce5abce8776fc28df399977a8e2ab28857c954df11596e2ed50d70bdeeab600ee50282c80ae023fc15b99e08ebb095e0f77b9145f017593d4e49534a3d7e40f835b5e7de68fafb0186fc78fc078abfbf1e51770077201aeb4dff12bbc95e9e34b25b81395e00e6985d7235ae1688c236c9d546a798648537e92906a6053a6d1d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d05c147551173d72a74773a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a373a374a3d38fa60876fc79c4d18e6fca520b8f8b8ff3eff89afc62c79762fcc09d077774328cad24bb6085d74366e1e144b823bf4028db0b3bbe520d096a6a6c3061c3460c4bc410430da01a356894a0a1a191040d1a3390983143f5a352cd1c3133233302191919229021232606660c189854185229941828d4f665db4e60389d4c61984c180c8cb5254dbb5fb837fb22cbac17acad5e6ac5ba8061940b94ce2dec29a5d4c2eb1163ccc2ebe1ee58783de00fcda4a1b0a6599ba2b845b118dc9a3a7299d1dc1575a04ff4894ace196173201f2fc2d649156c7e84f847a28efd9814234fd4b15a2ac59baa958a52b04d146cf2670c1a944a5ce4c78f01b7fc6b704b7a7c4c89fe8cfe9e4352d7b68a3d2aed08dd9deae71c7d59e534c146b54a6fcec1230fa7089b4f39b4df0d26328c884c643442c5cb9c73ce095d62d0e7933edde7f439e79c73ce391f36b1515ab7397d7ead6ffe9c73ce39e974edb9730edda5ec629b0082920bb647eff3d594af6916da9e20cee3f0e12cf6d820d6da5ab57dfc36de12ca9759dea8e96bff3e0c1fcb5deec916f0f6b50fb34cbfff61bff2448bf1c48a65b899647006e13e1b9d1b31fc036318d5608c50ca5c717c35cbb28ce21fda6b4fb59b7f9278d67d1a0e23845aca85af4415618c576bf1a27b47d967b895d58b4d7cc36739becd1e730d3c9c938f651b9ccbd962838f278455014cb6bfa6f5c0209e69d9bf8771363dcc9c73d16b3817a3fc9eb73dfb37e9ce664b1d31635821841056582b849826fe83b807e21eed637e5bd352ee6b5fab9e51bc1ccdb778490f290503f9ee65c32124e741fc5d4ab813777c97af879c7bbe4f72f7e8da11734d97a579bae0ae33686eac38eb4fa32d40793feacf2db8a413aa23e3a37432e79c73ce396974f4a7cbb9a893645fe7633848f655573d839c8b3fe977ee7306f96a4e2717e31686decd4f923d0d0a728e3e9d4f27d5158a2dfbeda78b6edbd3ed793ccb343fb7dc3548fd4d7710ee5b357c1cdddbae7f210e12f7f6d78588637cd9f5a510718c3196d40d1f0e7d19b59a39e0bbfe7d55bf8743b574754ca493a0f9dd7caa839cd349e667b2cb5eba32e992aea8135df567746199b6afa43a483a19a2076e89cdbac4270b368899629cc35edb1896510cc35e9391b32c7bcd4a91f1769341b187c12d4ccfb0599ba5c890218320b4a3cb5752647cfce8240661693fa32028ed4eba60340c7b0ceba62ba599708f49462661300e736358889cbbd68905992fe79c271c44f6c8c7fe426d4693d8d70cfb194de64edb99e65c965d95265df283e25f2969a412d5c6249e317b48a5135fd160ffd2a5a71396c985fd1582e6ac39975dfa90e24a1fdb8ad2554f3d37ea279e534fd4cf2c1f02c11d6b53735a2d3578714fccd77f30ff64208437704bd60cb7647ecb18421a70060d0d1a1a8f42e94e8986d210b53d7e0a21fe8fc91dea339cc26f69ead7392bc401b76dc35abea59153afa21f1323374c43d4c36d460a8592337407231e82a2b4456d955bea65ea6bea9b54fc0eadc5a9b9c1c86c0fb747e5b7336e6d305a3a072337cc8c8621965ad65e6a52d77933ede11e49a5ee2c1eb2bd9c91f5537276be639ea66a4c0cfd6e0926a19438d88f791e4ffdbd9af64f0392dbb6750fb97b56dc23f3f5797c255f9352bed6a46a1fce6931f5a89cfaf91ad0ac5f67501635e35133348fa3ea867a38e6791c5567fcf6d27554d6feb432460b99d2a23ef534c87c3964be7c0d08eec89732f53215f7d498c7f090d4a4e9999f64d31d9c7888b6e7d3a464d4d4a4916ad12bf3b4d65afb31292da10b05f3aa2ce367327d1919d4f378955e5f563ddf7ea7444b6921566b34d9a35ebecc43ab53ffba29234bbfb131557e8a090db7689665b8e7dc2feb9610e6b34c2fc19660dd126ccf87401bf551befc1a03f331f36386c07c7d18547dd4a772c764a3b0257bfa6c2b65f6b40707c9b63a6b8ceee446bdcd44ec09a33526e00e148f0f5fa15ebb5a131ee734ad6df8e7c46ad69cb0698fafd4b29c42054694d2f56ea2ccd9325f48efda78cc9c1a5daae89a2ee99252da504929a518a55677f94d8cd23a25955352576af274812526212521c5f9cfa6db7694ce1961f38774d27f72734ed237e1fb8473fa43a9e39194aa0d618416b832ec16bb45165534bf41dae4436afdd57f1a53482ba41042e86e02ec51b0bddcc1a4188c12db0264c9371f7dd8c35e7d533fe9121f7938d1e30ceedbf7f46f3a5e00ecf1c71e5230369a20fed8fb3ffaf3ffe54efee03e1d5b0da2ec6754032739fb1905e195d4d5b92dd59de53aae46a8bb2dc69bdf5cd4812cf99bca68cbbf795b065080a77a46cf39c7fed5a84324c61a6bacbee95f22b56e9b148c8b3a44de8dfc5ab74d059bd834df6e0459b5cd572fc9716bab4e00d714534a299d26786e04641263fdc293c902f9dd128f790f5b5447fa9aafb443edd108c9a4d8cfe085b875a396d1b7ffe07361693f232e28a97c25c5fefc1a56a394d22e530cf764126b23542c2ad83fd5f60ce33085cc0d85cc5d2b74f78983c0f777c71aacfbd137e979297d2f348918d319fe841a9dd5085e4f1066b8a51c723fd34b7cc359ab5ee23bfbab93643f9554596bfd59ef09eeebb089740d0fb9bb5edc837dad4d5c433db3cc5e7b1008ee6415bafc99803bdafb12dfa721f1a43b9f5aabaf4413e20f7507278df6f26fad0f87d48740fa4278718f3fd49954a26d976f714ffd24a75a5dce2b5906a7869fd13765fc36dfc7f283b0d6aaeb6b42340de14f4bed4bdc937d120c6a3b63e241261cb7aea66519ccb409b1ecb444fb9be1eeb97fdf2918fefe57d76a99804cc0269e99c0d313b0e8653d6fcf3c1cfa4c98b1e1669e082ccbb22ccb52daa1b0bda22b4945457c459376f6f47ddca01aaaf11994eb834b881edfd967dfc1a19be5f9c4b66477f595683b7b228a803e0f710bfb0c671955c439d3677907e74c99bec139d3d32fea5f99650f87ae5d82dde7ae7eced9c7aef45596b1af36cb32ccd62ccbb2ecdea7f1e11cfdb783af34aaede01cf5c1571d9cb2e9532ddbf43cf46956ed4f274cf4b753d69ca3ef4ed84c0fa1c0285067534c0586a6bb0dbb1a53bd1b8ae56014c32cc51e8f8d15e5d4ba512eeaf0d83cfa188659ecafc56cc69aa6d98c5fcb40d8bf42586badceb256ebfdccda5bdf7e56df39ccc639cce3c322cd4d45d0c2cb3eed67a48514f643dd379b6c8fdefb3477ec3a1632638cee4ff3e37d7c04ecf83227799a26c80176fc03d00489638c01bb58c10bf2134cf7e91e638cdbf423b6a95f8331cea9242ec528837694414c26ac4fc0f7b21d6acfc697a094c86b463f024412124a2916e9a45a32a7af094310c2128e5064832934c19253903a478a8d6a1dd9c33f127532cdc51bf8524a2939a83b586d964a29a5941e4192740409162ed8c1c676c759b727a0c2e61b892f7227f1b36d5697a32848403ac215479002162e70c211998474040976440809291aa194124897a02e50a691d01196b14ae4e17225462564132578c0842248f1841596175c6820e7c532f7c3c205af24242245549d0d8dfd8ca4bcc05d4a29a59452ca5ab15ab35a6bcdaa75ac62f48b2dbecfe884bb75395be6d427e516a896524a29a59452ca9b65d9fdec667fb35aed575be5bc72aaae812df8c09c9c1a6a1134f41f8bca7ce9d2397f88df399963bf3d709187e3cf13fd7efc1a2f0ad531f17851f7c2e8afa5aea84c83c1a121b86dd74375a883ae5a9fc7a193d7033ad9554322a8c0d8b63054051d38147390fe4815638c9ccd9678036db2acb5fedba8bf40dcbf2ec4bdf7def75c75275128ecfd5e0cf5f71d156f4445faf2a7e0623fa329b2b813fb1951b9b2b140140af5b766215028140a8542bd670ce5140fb9ef28f928aae516690d6dd35d7cecefcc3cde7bfd33edc6d872ed6356a2daa76ce26143967d7e807440b1cd2b9bbbfbc04421a194521281014516c12d63d0e9ef918f79ec31bd3dd657e6f835dbc7f6310c8bf263263f6679a7c4b2af4f62768b2897b6e097735724114b94bc2487e2dc8ce2dc44d59a55999f6cf279a2120d26651972e1dcac1a6a716e6e714e4a1da340716e4e29667c4d8faf68fa2e067de4c2579a1740106d10e68338323f466b1f8a412798dcc5a46250cc8e4151071ee9930ebaf3bba8657814af8db162d895b9ca192516bfca39a38e49cec52e5b221751c020e7e013288bf6bbc124069a6670e73f9b0ebae615e8a3026373e8d01d3a74e8d0a143870e1d3a747777ce9df38a61980442fe9d42482925a63bf922fd29657cf933baf4e85086218ad2be27cfc1f67607a3ec30aaec67b474b479ec67b4e4d23cf131bb65c6a983a7729a126d0f83d3ca9d556c99dd02c21a5f8b134aecaf948b69ef2fd5aeb47fb394fa595ee2bb65f5bc346287d8dc58c6a6a4d3dd3fc97cfaf2e98c5309095fef11ab8f7d7c0c9352ffbdf79594faf06d20d51cf760da088d45853e1ceae00b56d9bee77b213177f015e57c52cad7f32e7c79cf2b352aaf4cddc1211ecec13fe299587c3fb3aa53edf778e27b3fa1f69e7c53bef752bef7b4ac99c68687afe043087fbeb60ebe12ed3a7e33c77f593e75fab26cd74f3bc27f7e620cfce29cffec60f3efe097ad677ca3200055d91e05c21215271eafb3e1c7bbf3700ec20dbd86af608435ee496ef82edddd1d4a97d21d42287586359c83bf6916346cb1c98fb3d3584ac50c903e470451ff4d8a416c3169c3fde73810eeb3e920fe976113bf992f359ce115bf990f4b4f1051624fb1d410c8b9b9e7852fb3d882903ad62022d4f095c5d671187f12cfc24f034619a56029a594d18b3da34c815bacc52dfb6ac52494724278058b73b3de373d8cf0c63799200563332d21c2b9f9f7067183983e4c88357cf9cd4bda7ce0b179f9eafe7ca9e00bce28b621e4869a73536cf2a304e33e4bab8cf56ada57ed4ac17fa7fc7aa5604cfdc88fe27b9628edb52a6925d56ab6d23eb5d6d2b7bae21eedb5a9c9c71acd566bce254569a1f64fa355b6fb4ab46d67c5aacd6ece2aab3558b336e77d4db36fa5977da52a26f9cd95f551ec049693de373dcd597d556327d809b883fdac28d40935e70943611886a9362d443ead3e843abdcc9a66fbec524a5ffec34de08efca92d7675d8b5ed84f98a87d818b97442e92b3f9bd8d3743536fd4ef6cc4f82d1ec7e6ae9d2a7a1bbed74b3ada8d65a6b3d690ff7d8c74d2c769299f0902b93b9fdaefa86799b3becda198cc5d94b6dc7a478735ffe53615ae2501f26264d9dcd37c9b8ef43f7effd19baabf76bc64de00efa5996cf136772ea65b2951193bb989b63fc5beb49bb73ce39757dd4cfd34fd4fd53bd9ae6f4f4ad133f7a17f530df79936d2fea377b3f096ade87d1a86edbd809b873b5b72653f62ca75386bb5a5ba73de5b7277602eed098a469dade979262aff92afbfa9bebe0af5a894ab5af490b997f2dc54ec01d54e31cbbc41bcd6698d5b223155b1793ee777e849db8f9ed13765d6b3f72b9274a35286352f4e2345d46402659cc23b836d3a34bf920c4fc3d3dc3864dd95e739dd7a54674f7d7e3de6a83c18ac7bdddc5bd1f8ecf82294ea49452c297923ea42dbea4704e0c4ef81e841305db94d3f6bc3da558d5cc0f90553d227c3527e5d980706ddae317824e1e1f40324a4d312ae7eea55f6ba514088ad9cc3e86518a515b316bbf52aa65866573764ca08b4227b38bd9f789983fe79c4e6cf73bd59c526c3490a0166a31bba453c36fe6cfa943e5dc9cd813617f5afbd5d2aa594cbf492955ed4955ef66523ae9a4934e3a298d94f2504aa976efd5ee6bd7dacc62b4528cce0ce225262c09a20b1390901029e203d2fbf8fff7c10384e71521212111e10182540489c812228240ea52a7431f2810420861ad7fb36c24be7a7fc4395884c7c70d72d6faded6f3fb6b709dfaf373301a36ccd28c52dd699a474ead5b86599e38710bcbe1f18a64cd3ccecd4702c4112fc2067ffea447dcec9fcd556131c6a83bcb45c543e0cbaac559314d4a29a3c681be76b166b5482079d281544b8cbe945b68b6affe7dab255a2e30ede3f3b8dd02eec0c7709471d3e46f76cbc6a4bc8ffda6837a08a5122112fb88699afbf5678c117bab05eec8c7f4b45bf6cc700f562106534db5664094527ab56a733c3d6adaa8bd70a83d84f1d6aae9635f35ac8560afd578b1ac69eecb9f9d92ed3b08b427fe4ef6c44f527754b2e9533665e93755774aa2ee34c0c46e61b7803b6fcf1de3dcd8c6ec167047e879b193c49fcf0b08e445148a8f4525dafc2a14759e16dafe53db2de08e18e9da8479729fcdfb220f4b1122ce41f964f3413ed9a02bdeb87625dcd86f99b3c7ba2addab2beadc20a2ced59ae260c3fe8873fe98460214751e104a7ce55dd5b69223d1fdfae0abfa6e8790bb833e49e477980c4273dd622651111f6a8c1ab502c2ba6463efc5a864acf61d2fe06d1c35edb5d7aece34938d69bb057c760bbb654b2617c2a48de53887e59eb7913c1ceca7945be10f5096af07dc32d8bab71489f05597b3b13a77ce0e40f8ca1ffb0b9d388761391bb3af445b698f7d0d3c7c05e14dc53887fa9b55cea1fe694dab7f65b5f5de0a0476b3ecabf6cfb92b9db3fa6aedbec6133b2635b3b57e9635205bebbd99aece699aa629c239ec1f74f90aeb8ec9c61767e8720e834ebc48e52e66a39e082c4e273614928b9a526cd8d3b05f1f22412d1babd57a94adcb893a9adf608f61183663b055ec8bb88fbdcdf48bed7ef6f6af5f591ffb1d7ca858c52a56b18ad55a91fe48f58a361e58ad58cdd918177588c88937d8d75ab3b7c9f23b574d18e37fa6c71988ecefe3373dfc4308ac336b6f9669d95ffbce551be7eab3c1741298a441d31086768c71cd94614a712bc37fbf8b663299b437695988394daf6521e69cd344dfe7fd89f57bbe54c3b98333ade94afe844dab5d955ce45391cf63fb34d11cc3d3bf1b548a4adbb67a398f7b13f42ebf6d7ca4d886f62eda959c8b153f7d932b79175fbdd8fd8eef3e3fce4588143f9bc982c595a494524a15c4d34c8d07e171a6a8e344783726ed479d1f757ed4f991ecb25d3b101e4efc2e5a61c797514a698a2dd84ea8e7712fce41dc33f32eb13cbdf84d97a2d7030bf4f9712ece2e148a8bfaecf854487bfa148aafe8d390d2459d380df2d5f3958dd7037f8c2a8f7e95eedbc8110bce7047a52faa6d8bdb7f297a38b18bec2245b09994dcf3e9b7dc45a33804cc1b4c4ade7719241cbaf86ae6695ebe631c54efb38be169fcd4dd0c2da76b1ad3d3985e6a9ac6a47f30d9a6976fbaa6d7bec7f4dad55ed3524bd367b9d3fef432dbf057f9cfd4d86cbca6b9efaffd7c9a69ee9b9ed25cfd83c9be6f7a0dd304b99f7dcffd0c679f691fc436691f638ae16d68fac5667a7f98bf18c50a88e1afe91f5e80490789e14d3a490c7f75921a5a0d21dbd3afa11f8dea250dd7dd8c999733efaa99f7199f6efaa9b9e9e9cf197fe95afa945d7ce53a521a9562971fdb5f7db7bff765e84be93388c7bccf2c334dba63b283d8707683b554ca7457bb9897f94f4964846c4164fe9a5e4646a3549bf493c97292f9f76ff6329b7e4ecdf4d264cab499efcbccbff3be8c39697ae64b2d657467c4be7ffad3cb681999bcbd77447610fbf451c957910b8dd4a7f412d9e397c62836e970fbe9976ca84ce99c74ce39279d94ce49a78f73d1579b5e22f746a16c3441361ae579fc9ab27429a594746e196e29e5944a01357f44103f7c3671909aaf7f6bce7a86ad26d7d4d4e8229508520eb9e68f640ac5dbe15f24db4c75c83402993a71ce7f0b639f82a2e95d47e7bd53d029a8550364f30faf4386c017c93e7ccd70e7c0fd35e5774e7746c039332cabe1446fa018c811865bb5e61b906b3e876c73113be4f7b89c6fad21006eddbb613e6a30cc535424d76f40ae9f43aed5e70745320fdf80ccc3e790b17de98fdff85bdce2e12f0f0fe3780ae4ab0c54a3e9c8f0cf573d7ccdd7e88e87bf99874c7d76b0e5efe84f4dcde7a8791cafe1961255abea9a9aafb5561c5f9395a876c691a98f7339ea5f1a362339bee6251e52f339f49c92e9175b8d91e79ec72f97e7949a7fdbc81b00b78ce8193423f80626bbe61f0e52c3e939a5e6fdb31e72e4f81ddcca9143e6d59093935b389ec7e94fe5e1fd29900e6ef1c0439629193e258336428543b571681b78f0784076c0670ed03f327c910c770332dc39647a376033963db06bdee32340fdec6a597e3ae41ddee6077c91fcb603f2033e874c7703f2db5783cf4df963083ccba65680986b73f1bfc43d64683534ac5215c90df81c72ec38b06bfcddd4c73848dd38fe62ad48cebe0139fb1cb24f215f25a97fdfdf01f5ef49bbf77ebdd9adb93536e0d6bd33a6981a13deb622397f0372fe1c32dcf903feb8ba71fcddf21b011f0e8ebf9863f049537e1e9fe22b1cda3f47edd6e839655f06649b27926ffc90ac3f8514752e5210dcb15b3c553fe847dc4f7dec16b8b32df974db45aa760b03fe4626f23a0ff9cf710fd1d28fc3c7e18e3c823b4e415c8e6d29fb5e40a6581e4e0fae781c0f76f070aebc9c23b2f270727083c70d4df1706c4003c8cd40e8e14889c1e360f0828703e5897350b0e0e1ac00058f737282876382269a3c1c122481c4c3f1c721d39f87e3cf68dfaff96adf5777f5ffbbfada3bfe51bfe68dd8f9a97f7e1b874c45f070fc6fc874040fc75f48a6473c1c7f05e4209902c9b42753261e8eff8f4c49f0e8130fc7df47a6ae87e39f804c4bf070fc59999a0072fe3bd31464aa8287e38f804c831e8eff01325dc1e3fc0d9069140fc7df864c5bf070fc773275c1c3f1ef916901328df270fc79642a45a6327838feab4ca53cce9f0099d6e0e1f8d790e99487e34f43a6541e8eff0c99da0072fe03c8948a87e39f93290e1e8eff8e4cab3c1c7f01649a83c7f9e364aa8387e3af23d300646ac5c3f10740a65768d1c3f18f0e45fdcfef5fb3cef68ac7bd278fe08e7da1bec39ceeaa57f170fc73e80cf78d6cad789c3f0eb9eb4ef60e93edf0af32ddcedeb58c87533f06194960626ac42849c1c880b9002a1593c2c086a24165e0b4bd3ecc1684697b7d1a2721b069330d517f06d6c0d54cda92ece2bb019b691907eac7d80e60dbeb775925826eafaffa885b17f3c09edbab8f12f403536e4f6282403e9cfad4c7919045c4ff09813f9cfa11b7f25f8f336a38f2db36d977fd24f5332bde154fe747864fe25932682af5ebbdf11207c9f28de7815b37f40c5bbd5171903af111e7fc7164b86d7c77355f3fe7ce889da4e6b3b7563c8b05b45abcd5bfbf45721dfac43f5314502720e77f2353251ee76fabf0b72fed3d2503e63bdf329def99d4cbf807f332313ff3bbe66faef92974a37beae3ab9a1bbabb5fbfbbafbd7e9ef839043a7746ecec2f161dca374df7795cc857af3b37023e9c8a15c0a4476e21de18fbfe14aaf1bf7a0a39e7738a7331e48eaa60fbd7c89d0c4dee6068e40eb53bead39db62a777677d4a7c376675f9d49c6ee2cf5e952bba33e7405fbeecebea80bb6ff491ed128b6bf467d8af0d5d518804744409f9bba1fae522c3c6251c1003cda738a5e128473fe5388e2a1ed43819c73da643bd5b2755348f3394500464026358c804cb00c2aa105153ef701fedb703a70147cb8b7d94e7b0b32f633ea828baddacfa80b2cbbfb1cb9056d06edc1580388981f734f23cc79e7a532fb80875493668b6022cef963f2f5a895be1ed8d4f9c178a3d90d1888dd4c9447bcf1c739e766afc7ec31ffe168788896f65693aa5de3b5ef6ca884a931b63f955143dda37b4aaa1d35102e65175fee6bb32cd3b497da4b2d88a6bd7635184dd33a24c7659a868768c5d7b07c55fb4ef5362ecca9c14d7ffe8c963232c6c4a86de8fcc7180fd1b28ffda6d5ef6c74e4c8bb53f0ed20813bba9881c7f94d1463fbc3f7c5f6b7c0eb818147027794cc903942f545296ad7ae96df1c426239eee71c0e627f6a1a2fda9fb1999561add666ac4ebfc249e73369f2dd9396f5c8e075194ab857d6e03936b478481a6dfe75701cc5626aa85455d36ab5f415452e3008e17cfaf4319b19b6f9f2f51022a49b1bbe4f29e5cb996d767c8923f220077b9148ccc209768c5f63a49452ec0926501475010a2e40780212134b5aa862473969d2a51c12a5f4664c3051a2891a308184164869810fbea08521cd39872149dd016043ce0777265541459744a43d62038a592de6943a2a1d818d4db1a022842c36a5540a1ddc112ca2f8b1cee5703ae491ee060cb438e79cdc4c3202912866949c0e8877c79db2c8911b112d8c2a362713929438429655c1920748910f204b43511675811da1414623911d908aec4085d76cc2842c62e4d1c205573a105db88e441d9e986404a74e440bd7098331c60806a478f3624624ea64fa48133f588209b250820a2e5040c2174c88555a2d7cb62805a478f36a13095089e20ad70cae80420abc2085a2298f965257482a229ac14912d901a9c80e611092569060669452ca2900cd9973448e9528c410e59c7336a1896c8293263cd9549b48d4e199483e34a2e40152e40348185c78c2f03203110b4e710a4853d8128f9032a0295a00a9608c2f584102172fb0069b6f624828a594984bc99313813807a116b6a0c10c9e90042f8696ba904455f02be7a494d26a55d5db8cfd8cba88b2b1fd8cbad8418c4a74493aa28405cf0d9aa0a6dd2ea59454488a54508a54e812a9b014957ca212500e9d3973c8c7c78704515c5a7378e4d4c0a3c80947db1fdbb29faf30cb83a772ca29e9113928728215720a69180f90221f40ba787551d4c55117485d6ce922a90ba52eba48201a5d4ce9626816494c56e9e3e3e3032465952d6324911d908aec3086cb6f5e5085b209a986fec515e56c1fe3c86fde2e6a82062dc860c9670a345081185c088318638c805e3133798014f900f28a92b0e414c67d0b4988c2f62d6664d19296231e242cd4c803a4c8079057d405a1a44d331239df51d2911b78c134eb0ef5683fa31134d9fed83bda741e51338224be90133b82ca39e774f9cd0baa50fc468a2146e5a812541ca18fbc228c1ea162896c3e9b3d146fde9612cb487608d2e2a58b137ee04305cbbb2041832e76b03d22215284278b251c5cd9520b9f85160a60042a4350c11550b08417ac2c3cf1aaebd4c8022a4f3201c21ecc408b000a2daa28a51116453d50c14e6d7162b3ce395b00858c1d73ce2925168e307757c37e4c5e3e68820a0a9e70820628c0c29c73ce39a751d07624b8fb4d96229ce004252041d214aceeb73b141f1f1f26585c76c76dcff1953f0f1f44dcdda5bc32853d5fceaf3b9862cfd77c8563cfdf76a0e585f62cc27e463c00a3007b7e4e0d3caea062cfb78107893ddfc77c20be7a46455bf62c7a485264ab2b2f016c510021be2b643145280a4488d203a12bf4780167648516dbb7b8e2823de39f54412b269de8620443480802129660032bc85985146c80824b065513cf39e79c33d299d158851635e2111446bb7ab20a25b088305892c0092975f022c200a04891032d98600a1d78c1624b022868d8667635fc146b22af5edd6dd9d48109648802697b61b11d298aa40bbf0a57a862092f78c214545421562cd6fa82a26767b3e79c44629e1461cfae86f77e03bf561e73ce39e79c930b02d87c3567f8fc81972658d1831148a14404168fa8f3f106fe1076a752da5d0d7bc29c2b6c229d92ba45619bf3a12ee21c7cb90311aa8bec6eca18895e3d2a8d0358ba4fc7a6bb259bbe126dc76a5ff66866adeeaaabb61f2a98aed963fa65d97b26f52cc2e61fa53fa92d944c5c9a22b2084d13691e0043c07a2f9f094be6a87f3ca31c4c810ff7649a1fcf2807429b27c6dc3111021ae520ca36c299b84321c8a7617befd5a3bb76af51cbecb3caf59f58e0f693324af9f1e6fd5339f71cbeefa48c52460c42973427de3c191f7c3146ddc5f83531fe9bf1a0bbbb3f19a573d1dd9d4228dfebd3524a39253dd5ba6defa17e917a7ead8a37ef7d8c0d9af6fbf7dac381104238e3e15c8750c3086b8c5bbc795f1f8cd5e18b31d65021e3bbba6da88edb36d3507f378d1f8919a899c7afa2f1a6d3cc8ceab599bf19896cc6cc8c4945636606e3b755db76828989e1f6844961a8192afa3130a7146a464686fe8c0c19999919999f9179192d840c2d6589984702c6b4f98dbf96d2d8514a72f0cfc7269dcfb1d41329a59452fe7bac1a619393ce79edc4a00a52ea524a50d1f645680a2e4210570187a884a1c5cbd2121884f6330a03cb33dacf280c2fa84cd9cf88ca93dd411fec6734450b1195735ee405765a696db4d6ad85f6d96ab35c881d00e859d83f1a6b36e10ef9dd69c713c0c3f1a779c2bc03618f02f0d05911a0061a6618c0a473ee98908b37fedc8ed763be9c120a206e0ce7f5b0d8d5687c28658c98aea19a11623632ec789d0156db5f86d743000f47c70c991ea86ce0f62300c7c9b7715a8e6a276c8b3a37efc6ff710f870518d6f17ad0f7e7b8a8f358a91a6fb697c2302447bd8009b59ffdcc9d06e10d4c6ad63029f15fd4d5396f725f016f6b1088dee82c853be2c307ff419b0db7efbe9bd1a12c176f68aafe01b7f6f7511fb74fbd09eb1753fa4594ae3a52cfbae5aee6943b9589e3e6cba284db561af9dfe77109775e8dffa0eef286f24ddd416ecffa381615ffd72532d1661686f064d7ec67240431f6a56143f20f572da68c86c0c5c6d9cf6808538a8e20b47fbfa22324b1b40493ee16a8f9683fb78bf6b2ef977dbbbca218e0dfd6b8658067bda61ce0dfceb8758067117d41c0bffdb8858067bd9af0fcdb35b8c5f32c222ff6bf6d03b7f6b388b8b0feed18708bf5acd79304fcdb35702b01cf22e2c2c7bf4d835b3e9ef572d2fab769e056eb59af9f1ffff60cdcfaf12c222f3dffb60ab77a9e45e404c8bf3d835b409e457425c8bf2d835b419e45a405877f5b066ee1f02ca22937fcdb31b875c3b3ac7811f26fc3e096906759f972e4df4ee1d69167113589c0bf8dc2ad083c8b084b0efff6865b393c8be86702fff609b726f02ca2273afcdb26dcd2e15944518afcdb18b78a3c8b28cbd1d670cbf42ca22aafc7dbfbe216f61e83ad9b5eb6df207656445797c82edb93f69d5c38578b2a963a54abd42b75a85641fd388702da969cdbbe54a972e54ad1d111cb8a46f3ffb60d9aec655fb6675efcc63f55b46d5c2755a4f215cd7c243f9f66fe63fdf05d8d27536fa3fe90535a720a2968bb5f4d4ba4b4e4145294ededbbf1b75b2cd2cedc055080817fb175292424d48b65e5ca95a3a3a2a32bb01c6d4b4c6a56c5574c5856aacc2a555cc7a4d4a5ae6c8fba432dd5ba6d2ad53fc7e56c4ba7201b248394f88587221eb24bd00675d565a3d42ab54b477de2ebb565fb979396edeeae72081dfbe29cabaa4fd537ab1aab3f2dc05e2dc0ae602f6ca8cad66151b6ff9531b8e22b0c8a7355f08b89dd820539e7d81325da954fb6fa8f6ed94eb56ca7596ee0a7a3eda72cdb4f2f796fcc322ccef9e9e59c9faec04c774c5eadbab2ac24f98a6525c9b9b75d7b1b4afb193961cbaed9cfc809af6d97a20eaee2378eaf6cffec9d2054a445cb26c07e455aa29873fedbd9ac794e9db3bf8187c4af36dec6c7dc69da86f6b8957d54025f813b70e32ddbdf46eef0d0632edbdf06fe01371e7262fb1a5cf38adff863c97c6616201d996bcb606359494ae2c2b2c28565c58b2cb3ac70b1626359c934cb4a87aa75085c76cc6659498a01c7c0b2b2c5575b585694923cfb7a6fcdb2af590d9c428a3a78480b1734f00d6f578d7af9aaa33e577cd55d245491af58565058e0cee9ca69e9f578d5a702015117145f0d615f7c85e485e86b2862425928169713ec09e6055bda4e3fe3a19e9aa39db5ec1ef28ff6feb489af8cbc3f75f9ca46b5ed1b396efc9554b6fa459c9b4f818f8122cd3fea82d8f16b7e1bdfc92c7b1b997eb1656fe30220b391334db1f84a6a0eb76a06e2dcc4e22b0e485a14f547dca3f55cc2c6c3db18c9314138389d4373b8956551cf873371641e725703cdb2fd7be8a893a965c6adaa65d10b8aafa06bbf6d80cc7a4189a28af212f2157c62bf7d80cc7a09bda6ccbca6102df90a3ab1df464066112d117d9121faf202f2156c62bfcd93592fa0571319af2649be824df6db3bb38892bc88f18248c9579004fb6d5666112911718121e2f20af2156462bf9d80cc7a05bd9ea45e4f88b6f80a2eb1dff69159445b88b8401171e1f21504da6fb732ebe572b23979f9f80a2ab1dffe91592f9fd7cfe9f5d3c5573089fd764f661175f162f2e2f2154462bf0d24b3885c4eb09397afe0cf7e3b486611bdae6857907c058fd86fe3905944485aae1622215fc111ecb76fc82c2221a22919d1942ebe8222d86f0bc92c2b5dbc582f56967c057df6db4732cbca92952fd5ca17205fbd31f6db11c82c22a0265893225fbd30ecb773c82ca2222c148b8faf9e18fbed09641691cfcffc09f2d5fbb2dfd621b388829ec827507cf5c0b0df2e92594450a2c42847be7a61ecb74d99457494c5b33c9cb7594443be7a60ecb7b1cc221a72ee6d165195cd22aaf270ded69062d1162d695b244d491b823bb64aa751b1351c106dcd8aed36bed3aed8aef5e065b15d0bc28def3422ecfb9d5665fbfd4eb372916ef8875b373c8f2f31fd8d3cb378383d78f38a69c59b448ff39779e2e071738a598387336df070fce794ac44db42a6d0a481b5b2fd6f0ecce19e1e7ec880efe3f19b23076e09818031c61863e3f03f70fcd4d595f1f0b2ba6a09de2ae6c891e323b6b12dc51bdf96ec1623f6c9db90279785a2d1b7312bd55d7d1bdab664f3aa6db3d996b42971906ae32d1423168a916c836c907d62a118d1a188d56cd8a06102d9d71c22166d501f237f5d5b23a822e76aadb5fe0070ab62eeb31c81af99fbeb5a5621fed1c3672319c9db205f21797ffbc4dfdb6e703702b93a97730fcfe5b791a2d6378e7cc643750d017398800e457c77d46708595d38e414967b030381fbc6135b477da84fd49942422d23df4da19b3917b30c17612cb88a7331872f61ab7ffdb7e75c87fa0000b7aefb4b9dfdd43e5167a9235fdd18554be6be7fe4efcda9a354d1952d5594c2e2f4bdce342e724e95f10b6371cef11105639bd99ac6559cf39738c8ccc65730e8a68ec9ceb412b6fabe659bd9cfe84b0f7645b2e1a8865d4f453adea606d5b7c1ad7a0ac243f5a7b4f11d8ffd5a773c78e47812b6ee221d6df1553785b6165f3d23171737b4a219af3a87b64fa1fa3870ab4e256cd4c78b7c7544a7b0b80cdccf291eaffbacb2fd65c0b3ba5c2ea834a71811049576adff3a98b4352554d176f2e4bfbe10b8ec2d4730fb1909a1ca164294fd8c84e0a4c67e465996f6a949d5ae986f7602824fc756bb2baafe8b7f6a8243d427a0939397945a6c102f811bbf9c7329b624f197c05dbf4369b175a88caf64fc7a0e619c263ce49cff17fe9f38479f083981b29d36e999fb3997fd603bbd3e05398771c041eaffdfcfaf230a8b738e7a0951515e4cd9f26739e7bf3b342459fb877b7a189a43790a492cdbfd6e0add9f539c73a5dde1a11a6c1dea35877c75df8f701f967d1e0fda9d12a8b4af10704bb15ace603b01e92d5bcd539fd7c3f7f61f63ccb9d11dc6384df5b56c1cdfd9a5ab05094a0e0a7c770afa1bdfe121eaf3704430c61633d35f249f0349e321c8c5eef0d0104e81dcf9ceb9d3b6e96beeea36bd91dccd9f2e67f720e44d7f03a06919c93f2ce4791cf5f2d5159417be7a1bc9d10ff6070720459d256478241e20c3031eb025ea2c51814742860ac8f0830c6fdf97b0c02351010bd8afc00ff607fb3fbcfd0abcbfa5f9e33af6e537fe2eb91cc92f3674579b6cdd6df3f564fb0ff52b505f8607d47740adb5565963fd5875e0568daf03b762cd02805bd9ef2df2e5abeccaf6a2f8b3757ee49fc557f11d89fafc68d9f090af1eaee2abdac2433f4280deceb2afb5d65a6bad357e26e5b561e3ff73f6364cb908e79c081b5577febe74cf8b5724dfbd285821b8c37f70f80e2271c377300921df4125827c079b00f90e36d1f31d74a2f51d3c818fefa093047c0751b0bf832ce0f90e428180efe013037c075fb02b84c1ce77300605f80e0af1f80ece40e73b4803027c07a7a8e13b3844c377f00603f80e5ac9f90e12edf80ebe70be833bd0f11de44100be8357dc7c07b1f458c077d00700f80e1609e03ba88319be8354acbe8335e8f11d8c7280ef6014acef600a7e7c079f782b057c07816e7cf7bce861f33c7cf7b8e81e12b8da3d1f7406e80880e3c2b173e4bb1bbbda40db2970470e456aec9a4de0abee9410e19c2fb1d5efde12dc12757c8b91bf5a08eed82124dabfbaa20ecae57255978b02d54581e7a1baa6c01d5bc5067e1475220fdf430f6f4477dbb6437027bee00e7f237feddd6a320ed48b43bd36f714d09dceee5055e04eaa08eeb0f27aa4b07838a9f8823b3608eef0ef41c7231eb46fbb14752e927da5b0783d6c15469ed39d4e0edde53c0edd7159775fa33bd5eeec52b54b7669bb8d8f5517e19c7f96d5bfb5d6fab3abb6f1595662e3e1967e9b7f10b7ae3c924030a23b9d1c4e77393970e8eeb3ee543535fbaa1921a9f643b60f81acc3fb908bfc9d4096c04b20bc1e5b180fc775727238eedf54ebd52143e0efcc5ff3100f793a29ebc30ecef9cb5d244b0152b17ef86dc97f0bc35f872c99f038ff1cb20cc2934738f29504de5f66719d1fde5f6a711dfb7efa777a9be90f123892290ce00e281ee738be26e3f89c3b26ef39e0cba1bb9ad7fee21f35cfed9cbb10ec9abf9ec3b6f9874aac78a8344c582a831a32342323000000011315002028100c86c442a170384d1459f10114800f92ac546e529aa74910430821430c0102300000000200813430003bbdc2bf263da8a4f0944ef9db508f2d0a90b7a8edf14e0f181c42f4eeab7bb0d81bb00f311372a7cfcb71c1e63f3bec715be85995dbae38faba3a5a1f1010b0c429d8249db05d3dc1ba891390b5c2bf68057c9b201021e4f5b05d981314256a193e4821ab1470ceb4dc6be3b0ab56dafb7f40b9231db0ddac6e2837ab9baa9be54677633f37cab50c7dc28701f887801ee1cf6ef3cd25bd3a2600f706fb0317f04369d9a2a003f8155d692c5b876c848436700cea6e37295897554fbb730ab5015804725db67320b2a1ad73eed44ff9b23772e1564812ff648b1cb9107883a80a23604e240c3228af08aad907bd1a0defadd77828ac92223f76415b3f3bece3c11c1bb0657bda4ec86c76d84aefc608afff5bfa4864265acc3809c65e68a71742f4ec110e845ef5ef6c5e91aeed8c776a5edbec3f878c6b4def036b7f7cbad6f6ff677a10124a38773bd7235d3af7edb539e1f4b930e7e95ca3b2ab03dfb5fefb69061c9e7636b82dcddcc2e465772f0e8fde2b9103583505e073bdf3d46d3f53f73b484ce839f5c9e68a9e2906b55be32cc7b0bd873a54cdfd5791da4691cf61418c4377a6ffb137c13f3c3f5c6609f43fe461ff256f8083e3d7a524da26936a924c62434dd4cc6dd15ab3b6d31a0bde950af9c08654c2fd7cac444ec36110ff8368778369dfbd3df9334b2e97bb974744487a74a0f7028c0a65a51ff405e7d3ea6f29f3d33a5b8f0ff4639801e648dd22f75192e74b5440000642b134bfc9bb83878202170ac0f0ad11d9bc1a3616e0e8a785098e5e8666f61858d3c887da1a121af8be94efaf1278b880d7c4fceb8b70f2cf071ef3721ad44cd5346a2f44e3957361d03a006e3be836b291836a91bdbd69dfc649e8322355b5c057614a759278520c1f2039cf4e4f27187e75f1ee10e6f6e0ee1cb24b0344f473f0556449dbf96f23a9b3702301991256727e4f082e7358a7f2842ccecde1830c76169db4e50bbfce42739fde4858313bf031cba16a76758375aa36305df0e63c1f9b73d9b49b349c4148abef7eaf13747a7d8bc89bd3716dad7c9683032b90d2255426b63a4252aac31971d5003220bd64e7342149886776f3bdda45e9f4b1b5ba42224c182d8bd4af6c5e011eee6a2b2f31f166771a8f0bda80926cdd533a22fe869d95ab028ccc332cd3338a2cd7ef10a3aa53d1fadf172c76749f7d07fe623874cb7f2e28cea638f4b8f3a7637884f00fe52435d33689984b124ccc8396ec9a0c9cf6552fc627499e81c42627f672399e22c8b00ba1d72aada7a64e312cd900160359fa74d704130e0fe051fd6f1d1b3357e9b55202a9a7f73e0ddda122e0323f3ee401e128556f7a6cd89cd56fe3e6bdbe1a983b7b6cc6fcdb6f53e6f09e9b9b077c68d25ce26743e6239f1a37a7f9d5c0bce86333e6567f9b323ffbdcdc1cef4393e6893f1b32d7fcd4b8f9eaaf06e6bc1f9b316ffedb94b9f7e7e6e6ef1f9a3407004eaabd0ee692b908c825a3df98dfa7b67479a4dee1212749aa75680d0fe07988ebc848702833247543e52220cbd8bd173604253ae8f58dcecc389b061e32d72a4e595a4a8403fbeddbc3a1a569bcd55ef030392dafc3e05a942c3418ab35f1a144366514a7e6c07f67040b2eb5deecafd7f9e2f3a3ae13de28cce742f011c4a887a9b510239871510c37a761336762acd94da37c8d7aa4e6f9b7a0b77b758c62e00b4997f04de44639963d56cc133bea67d6056961c4494450b8de5ce5fa6f22c8f7fcc3b6a2dc2422d05d0231412b02d64f4761c2461586ae5fdb89da451e62d3a36274ad077f7891e5288816fdddf033937c6e67c7757830414c091bff0b8a72b9553a6cded2ea71fd63442bf226374f2a864badef11bd5eba19874749c78090dcbb355ffdf7850016b5b83a35755198c1d1d4849ca206c1cb3ab60f67766c1e87fec0b5f1a08d6cc2c5e48d7c94eb1c18aa0b165cd3a6d541756413d201ac569b9c5a6663fadf0357bbd8d4102159f62070abec258c97da55b01f77d31722b84fd8f4e2c2588b85c0f4567a352b72e1e02bf90530b02a972ffceab64fa8536e9aeea2a753c89ac1df576e3432062fc7437a6a34023712120868fe2090287a49f64d3f0708ca70f1c7289667a5876df86e5ae683e6131ab678653f2341db8a23cb26195391c69e86692af5cdba75463e6e12decf6faf8dbc08c76018db2cfc2c06be6e90a269a18d18fea0bec998a2514b3afaa4eefc5c86928c9a9c60e0c53b2e47f12f4a8f2c4ac8572c2e86b36885fa9825f79e8a315f9585587419fde7efad03f8fe23740c9db80c24deeac228d5469ac33456f1df0ad03265cc872455db094c31000cffd7ff76f3342a156cd1c1d132d54fb8165bb619d7c38a842629cbd275c1788824de3d5cb6f03aeb09907d6e4cffe197aa024997a487a3670172e16c8e871bac742025181ec49e15996b10a4b8580d7575242d3f884cbf61588df7f673c5680dd36ccfa1301ccddad086c02bcc1d16ac6c159ad4ef4212423950290e29c89fa3c27aaeff10adb88e33491357d6feafc4559ab0ea73afdcd377d06a020b72a3f6b2dfd567c239cb484f7aa41d8c5f5f09b4ab111a22bf6ce94c5277e136c302acba6e28a6805b53a362a53ed6710a3333a8ea44c75464e959c7299eaec05c248e1395591098861ec03525250c10ffe67ebc2954b3423786898df7b590b7009ce00682998a04cfa6adfcb5a418c77e16b5d6c0f6e902eb8b999e0a1a15759dd6d6edf8414a6fab32606e0b7f9797b27e4f93ef64794dffdaa00749cb5c5ba21d905457aafe9dcb7d65df21c05954add4276fd8861f0af7dc235345245bc0f3006370b89501b4ea31bd318d6aed1429985fdaaef02722aba434320d37bf6cd337f03b45310e6cd17718f259ce60afb0aff3f91541881eef8f4d3ab24cfddc86ca69243b77c6a566bee266e19d4e7e1423e09551ec7a115122ab587b02839a24c5f099e2bd93bbea309affd02c30747cc6953a89737f219d6eb4620b26c3c2ed6d83055ce13f0e7c2fd9b48922d250a65d7cbba9c0cd15a9c1aea1e931c17d9a6a0d198c20ec50b1401ed3a6d4f92b0b1c6e0db8399c59362ab07fcede430c5b5091c5bb0ce89a678ac1302c9b6cb44138cf7cd99903ca94b64d6afde7dd8492535523c9adab42bde0fa1e62a47064f80e2827a002323bcc470750330ce1a610c03b4690a51451fa26210519fd53c08021a0d906121ee3135c3dcd74e9d56ddc4fcb34bb4bcadff40f6f3d32a7476d860ff43c8fc46d32840ab89ef8fe9d35e8600541883f7a55a4e2aa06cbee145a3080f173e18a1150591490f9e216cbdcba22de66a96c0151eba83b197a22599b97582c1d49a925948058a3dd1e6933451ecef080fe5dad21d299b02909abfb4b09efbd3924e180ebf409408899384ccf3ce83d54c0976125fb64a966f5769366efefd399e571668f7a31f466fff988cdfa71c8cddaf2198ff99b04663bef9447790ff1b8f3a47854b1a0c7f9ffba66219fe1515e4dadd97b4fe091e7497bd4fcda1ef7cec9638e25f568c75f5e5e62aa10c03f8d8d0a74d493d22023f721a29e9bd84545059d681cf7c33f056db59d4e7399a3b3baaaa1c58870169945f5683e705ea0715d0a226debfe781d31991399a4e60a4252fefa8046ee5ac24a3352013b154d119b5be8ac6af60a4d26ea8a2813e62210d088f7947d59b687a49d263767fcb09db4810babf18f1bc9e9fbb5bcb482480b623610692c90e66f373820b3ab68a147deaf8ec6f9c169a07c7c60e0239777fcb0ea6a836372d1d01aa6d260d9a3ae347d3dd343335cbaa64bb3c389a2a8d2dcb1aec781aafc5d38e6380e8e0bb047bcd7520584ee6e7adaf245141b322963c7268cfa1092638cf341f1c18318eba1f57e3cffaa255d638570e5d618c6ea7fd0f53505105c1140f54b7365159a164cd9c970a53bb5bb6b3e17b142d79b54f2a8f9a5a828fae2ed59ab3a44895bc0c379094acf27fc85b1235d24c94d3454cf7b7c672c8486d6a5af18a0a5e984d6ef7da93ff49dfd349e2ffec34a642668cd3eb7deca62e318fb019ef54d5ef70112f0d574b831e0e86bbc0ec51e8ed24d21e261ce64af1171d2014df672a1943ec11bc25f318f8ac2328de8debc1ef243e24da23d6238fdda1c0b99bf6b2cdb4c79ccb03e8c636d291cd1eeb183035dc4f243340f69417013f8a779d741b2bc866e0960516938a24f6906722ad83b24050d52f5805045f29d993820168db13cd4ab14647bc36cba17b0926dc86c1136957f5641088699ba210aac1a532564bd48b2a85eb5097dc66a3bab0826cea0d81ad917a13b29612a63498cb911c467e2a1ca92787aa4f4f42714397e6d9c0588ce5170011c078bbbfb6ae689d495a26dc9321479543ebd25eb4f54d4482d2531ec0712a8abb76298d460c32b6164435820f8ada15f0010dabf6e204151dbca90735ea40e8bdc0917ce1cc2b787e107aa51d9aa39412693121b1a402b87fc929b4f5ea6c2d3ec448d49501689a97f484071c65a5e7dc01f0fd546b1c266b1f6d4d98ff1c241450255a8aada08548123afcf1cc00f2b55805b1f699d40a1bcb31b5168e5ae490b8c54cc302397ac5a09fc3e9dd401a694bea829407025c6d0daab8343bb7e8e91ccf64177edc1e2d0b937fb1e6a6fe5f41d95adadf6a16ff2a40e80ef2118abb89b56d087ea0a51e7e3c6695cba8b5f895058f32584a5f188d566b471197d30bc3c237efdc6917284bc8af970e8ea99481783e415162ef71f79c93fe2bb69d60f6f268fd841553bdc7b432aa9317141490cc12c4d3c03a9571ed50db528cee52e58be1812fb6ec0db835f78bf8edc5437f4dc07d893e4fab5ae3797a9c50795198e0b39c170b43ca685cb869c06f30c644e78151a8b99ae5516adf8a7d7e83d8880c7aa8a60fee4296ac279e2d70396afe25686f239298f1b391317f88f61db7bf5491f26f6b47bdb6ef2fd9aff89a8f377a8a599add1684e705432d3988c8ad9a432b0f380ae7480130ed3dbc5b96d5dbdbf61d1e121515cd3169d46c54d1fe7dd446905c2b7668b9a0b8faf592402f3318bb81bd1ed0d183c6e86db08c83c68536c4b9ad1d548253098520e1153a3ec20e4bc59709cc6854f908ecb338c5791b2e8206cdb6490e3c3b06449fa59fe7efa9b6c691a5135c0c37bdd86d2a0504d285eb9750853c3e9c4176b764076e4aaa063d803c355f8658398d4c5c2fb77415cf5ba1913e418cdc81ae41ed6906eec4ec1b070b2426981b11a174488efb637702a2c0d180a5d6bb81dfd631de90a4af364a837844d1c5706360a4c03b823db02c5df14f214216fd671ad15570741554cb62569925fc1f4c523a8a14f52bab558e10d4a8ac22d25de43ce1a1dec68490095dc3c2875f7e557bcfd783f8a8583370f76dc83bd795e7887605ce7685630c48f4f6e553ca2d0003a42e8c1809c178812ac04bf6d17701e301b6f79fc46ce69ccce5bf169d86a2d97b0cca02f259e52efb54eb0c9809c4f31e84e294e0e9a3026ea88839c96c6b1dd9db0111a6c1016a5b2a11dfd0ae118fda5a40c31ac86389a332d2e84565966ad5a03f01597ba0017cbf723e35d77eac690be25c052edd34d69a474e0cae1e46897b4a2ede78e3f62c31d10959050831ece719c82af5677a871198347bacc53343e0bc61d8f3bd8c87521a769ffd69eed79735f42923e705a62b0be9a27f14c1c449d4c0bc222bf8493b8b0862244b4963d9bef7b709b76c0cf5a2cf9f7ef9bef9fd929c426062f95d38e135e38a07684c1ca837faab76c56be0acf9c718de00c05781bc99212e2bbe2e1adb209c2fefd298866928f2d1067a6109bca07022ed1ca06bbb12464b9648fc6963e124278648e07dfd888a62747111c114159e8a25582c287da442c2fb46aec192ef7faa2049e77ad0e25dd5c36e6d03950f4408ef727b8a2d2ff81f049c362d18bb1c64c4957927b4ffbc605af8d05f6a87813baf35642155403311667a032ce149134f6d4f37efa149128bfaadbd4f7b395df56fb558f852be5fe1caf7d4c38cc2d1da8c60afaa439971d3bb5c207bd73b774def5d15b69d4ed5e5dd949fba750101dd41f1342ba21d6b845103fa7c1527609066c58e6d1816dded1797b53257a0f0b3ca1f3e08fa161cdd546fd437827a0c5ead3cea69ce7e5fc84a22332355cfe90ca17eb41f942d368a31c20bd45bfd0ac70764bfcea18ecf805f424332f22678b2eb9654d1f039075c67bf9f46afcc50d92c8ae97079aa291a413e820ed971516d6c4cedb80c34844ad2e66b53750a3691a18d3b48136cd971ac3b2e1fa469c9c26346d585bb3b59aada161ad8c6a6eaa476d98d1de8c868db5c4a45106efde45e2585733e2d62808479b1943f5bc4d0c3df3a74540b2ec119d33c099720e58bcb2dba109e80a46f721857699abfc137f832715f98722c8fb125244c1c965c99216ae6580366b13f919d0e0cecd3ac0e5ee15a8b51d4895e210e58319bc93c54c4926cfec773608c320a85504818b84be397dd64300b04a111fe0f1eaa8315bdd1c00abc9ca1038db07803299e6018410851ce4a1d846acbe8cd2551fe4eef018777b272d19cd4c381c5d230134517f0d3c2e700b7f2e2431fa1ce4e041361fa8a6fe645a910084b2706866a466a8e5e93b671f8781331a90310e840ee893ef3d829b603f9cae580ffa131ab5cde4749744485925645e89e69690f2e70bba28ab4f4876fd553125ecb272d3dc335882e6f1be8cf2d5770bc5053dcad832fb233d45a1e001ee960584850143e9318e8ef033689f44a8ace5328d35879b2acb67aeb708a920e99a7bf3d042a5b32304c665d1739a8eeba96f0c8a5250204f0efd07970f8e411c6bdf09d70495b5fcc5900a3babac455dcae3e224a94f64600992193b86f7b5bc4e19d1cd0b3f3c9334a27c98f086cd3f87a3217a576adef1f2ed27590e071d99c5c8034ffc9241b5091cdc77eabce8f99defe29cacb497b6e926687862c2c4607b622c34a6459b5f23eeb242f61a235b5e1352c42b4aca2bfbb67cd01f8e1d084338bab2563300fa3a9a02117b50be545d7e82da223705756f645f9a04205a87bcf26e4fae0cc0d75eda2e77766a682f5c491206f55b1d29d16051cab198ce1b46a42cd7a04a2f6c8e06b10913b326e1a2ce465e8c54ead43fd02bb25684463811b3d4fae051a809341081aa368f52b7f9582c7b2e2c7d25efe6e6d94adf7454c289f6db0ddcb4b7d3fc3bd1216a16f270a16401e6144feb287bb3c8349ea24196885c953138fa42eec9fdfccb15e63d90da5b034fb63a3208f042f2538e2fff03bbc93397662dedc228dbc6ceca466f5796a6221a0920d8d28b9750c7ad3e7911778041d4aa343b8293efeb8e964534b8bbb999e6c500344bc007f0d2e629e873a43e6546efe180dfed1f98afefe30c70b97450d4590adbd436be8fb097ddccbec0aaf76e6dbcae878b01f4c0e0efcb620b3cb0e361a73e7eb65d7789349fd7044513d6f7982b448f473c99a96c1928362219f0f31a9b2915f83b051d94aec7611273e7cfe53e41ea5f4edf415b17a4bedba9e22eb8d67500631f25e27ec5f21a3b73beea26478fe5cee2abe719f2942191ad433051b78e1065393c3d8b0854aea9deda8267c205fda7b71fdf9a1ff0c7d239196938405146973f367ddbfd89c237c6364eec0de1a70fdc24eed48a9f5ec904c1ae06bb57e76bb717bb813b047c114b9e02799cb749c003ea1288cdf4c486d6b7a039d0f0d7b3e46ad7f3ba3a2bac4156347ae0d3c88e89eae5ae4bf85a5668e94912a33e0908c9d9380a74fab95a9ddfe6d48b729d5fbd43add9a56671823deedc01b9f49bca0e7b006bff7e3ef39085ffc92d889f607234187fc7551301f225fdd8cd698c567c48dc7052a35298bd440b3c4d4a5b7dbe996525d7187a9e4742d348ea71f9c29aa532a0cecdd54786d6b61ad950d8d61b320b2234e961202cf3114bef60d5762ceca506938e1c484d283d2765d8c1c1f9af37bfc1a705d08295d238985ca80d3bccdf2617d1154cfd4271f00080057e6b153745fe5a7412881f2e31d35fb45efd39b99e4911174b87668f908bd544be5ce3c43c3c8491b67ace00384cf830e0b529741bf0a4027b0ab46f428e054c92e11e001b4ea804404f539831902405e201c0b8844710dc01438b004636611d4005514824808e14381118d209e52890100c424cdd82487d08f30178c19b024a071cb72a34fef62ce6be35c05601273d94bd69b961bd5b87e2ea3fe7eeafc43e390ec068d6c3a870e94c2c7ca68d277f758731e6b6cb57000c8cbd047c01f1be581c187b5b7a52af5635d5b97a1f442f5f391e87dcfa03cfe8902d9de50c5948fdf02a2164782494a608d37236225cb440344ee430e3e54d01426372d49b9bb65726247463e370ade1caa09090d42f946b8bb399e20a65048f84f96658df2ae8a0ea2086a65d05f2fcf9078d80ee9fba4798d6c6d7fcbeab915735520f13cf2d6dbd1c033e7a295328ac300190e9e84ea051600a98b4ce6a65be524732166ddb1314f208bd5f9f6a7d006c0472e1ccf679a4517e800991828fe5b35ed68473b2da4c96af2cab404264759930264b4007ab983ccae3acc2cd01cff02d21d448e79929675397ee37eb2f39b1db796f5cbe08d637dadf216fd96068f60e3de03c720e4e2f6062ddb594c9790009ffe0bc7ed45765c900c613b31f0576fbcc90b0ce83b6fb3d17269123d9d3ffb470cd53f91af8aaa10b2f23860c9245aa9fcffe659c0c3d8c0537fd055d1bad01e526a9abd3bf7b401c80b871456f9a74eec74d4d7065ec751a43fb6d24c36734be41e8d0f53167764cb1560302b0881fe80e01c70924e601060c606b914e9894532c4a3e18b757aedcb68249573dc629655d83f9163b961973b623a530e118360dafa18e04c26f3061058391e101f1655d2b725161a0ba1df17860bdaa2c1aa8eaeefcee6cfdb17e565081f7e372cd09d76220094a0144d7fcba5c7d50e335ebcda748e535afe4d4e5cd7acd4b4c299252cde94acab1a4efab6c3d2ff611eb3c276fd43085ee4f508458ee107287d44ac0b027c5220a8bbf7506f8e97eff22318df01ce8a20e4e41e40a35928e29ee6c4e987d4fbf0ca88ddf1c14397b22f35019f8d05b106ae2534b51c9e806d003d8a5b46dcd9ecdfd55511b4415c018cae9a72a9e7c262287453621c4b8d5a39db7bd187d4689a87d386782aff9c5c89434fe8c7650f0697c9fbde1ab4b415fc221cb8c6aba5122e87109a69c216bbe36473d75545121f30f1a87c35a606d32ab06c35ab1f8a95a1e12eb8f0060c8daba066438c23434b2736be98484e05d165833fd5332a061b919b2a463320cd090ae931a67045a266181543051a8c515f55ca1038ca2c9a5d4b9adb88177c82fd8a2b67dacadaf317dbaa9958320c97c54625f604d391bed1c5efd1959082c857cdd44845c24838ac934a8c55883cab6006855aa802a8eaf53d24bccd256823f79ea51b07e5a7febc20338d6f70c1242ef90ab820f00e788a73d2e2f2e208cce0e2f4cc2b981d756d7b973feffc9c4d83484d9e2ff7f9e41e280e8279980b17d545e9ed9632387da35dc09ed98bc84d432d06a525329e5c3259a503bff26663eedff7789b74c8bd499666e960cf8b9c3bef906f8be2d49dd67406e645cd090ce4f7df7270fb1d27451fa30934edc42a5982e92a977310d923b2a2275811b14f3b74088855ad34797b8e1ed60f4cf99fc58f08966431ec66a12444ab03cba6bbdf3a1616bae3f7975b0300c3afff6fcb8ea7a13ac457493cbfc25ada9e32e982e1a6cf76da627972722514f83e817900435dae3d72f0663346b8092411396cdb8ad5de5b35ea120dc26225a0f6380bde52a38f989a385fda7fc51e5ce41838418216ca61534c145efc09cc914db67080df951602d299b203f23edaa1393a6ff19b3f95a3d815c4cdb5e12314f0c7b09106c5628a65f358eee9d96c36367b087be8f5afca30cc6a22970ab120575ee0a7a4ae1f5ee4c6e8a7d248262d3c073d3033285c7c7222d28cb0cde4c95f5db05f47d78c7ca98184c57c4ee38dcccf2974f8c401930c595ed605fabe148ab80a091f705a59d008311a68817f7fcb459f95cab1addd7a66f6cb9208e8804a4d9f647aa425d8ae34d349d0d7163a50f6d0034a80bacb6e3e297d2c76b67014296f9b611af19d33a5f7ac8b9071e59f24a6380d231ee724addf42918256c435e158408f0ad16f65af1c18a23af345141dfbb101eb248ef7be32887def68029b296f922bd8f931572e3134023f61ed74d7e3f88e47a3c78fe32d7b558bdd4e572fc48744320b3167565e5a052149bfc88d45a2548b5b3330f4481cfdcf39b08057a3330927b9c31eadeae3afea070944d1a98216dafcb10cb62330d17b60f1e2efe4ecc34bf40f54302d4fa9d1835cfc9157ec4b8ccdfc3f5c53378d3a9f3121fa098d0964cf51099ff941633a722e2e85e7cc1b32e287ef56e61099faf9f76af095478c6cb2e79b30edd3f1c8cfd215a8c6a029929676539da26511254ac1437087ae780b8037daaf49a5d89efe1c27010e95e20b2b039713502646cb3b7af3470dc553cf16c2110ff22754f74cdf6ce0497ce69123b09e44de0ed16358cb7a21836171041c028f87be00cfdb4595dd519795d03c20da7cda46f52d7596d49b702be94c7a2f588ae2b64ffa83ea6ea5b20c7680a5a730ff9302f5ab7ff67f9320265b1545a079d87c2c55b6075df09b4d8057c5681c659cba1c2e095da5980dc9a796a3ad5e31aa20b6c03819b1580e42e64a7981916c06ab03564b00b2bb7a144f4fa48accddb2d5e7a243a14be950c8f501c9452523f7c0542ad5b745d7d5fe421095e970a3171858b95fe60f5f1455530f64f144206952b18306c9a684485fec05d654a7d00c812181757d3b9e149ede3e3bb882f94de0ebe65d687667443d16bd1597bc4b2b3c5d868115f44b96993c17732fc40ff3d153029454b282701d726ccdc1291fcdd8f780b67a32edee3fddd333b55cd12632696b16e544e5cdaa35f3f62a7a2424b01cec9ab44877472458568cc950cf6803d8c4ff9bfd1f91b56ef78258325e56f2b4feecfed251e6806e13ae297ec29d846980502f4d2fc1575af51d711cfe18fd9f0600a00ab20a566eaffe73e4a632c67295fadbecda3f88630b0f1bf05c8a4d4e432235f8088397b3c4a70c1e68b0053a6aac49d0ca0cca0667c806c1563d906ab359d1c73fb00e17cae3beb594490345015ed3a716690167de40b51b6d0bc5424f0f359054fb99c085200df09281a48e85436a1887d7cacd5cad86ca884c1dbde5d3b2dfc18b79409c47fa064d452430d98fd2b8a410b450afeecd2416440ae8b37ef7fe7c15115e15492dfc732c8c3b634a077e8964cf2a2e8fd041418f1e0f455d5d6dcbb4faf9c404fdce38fc9c04b005682c8718433db8ac3746078043e38a6cdc87c4d0eed863f3e83c4bd5c80f71f11ccb031760a1e51f1e26dd72117082532602015ee03906991902068f8e20ac22dffe2a4dc379f427b517ecf64b441c12f170b107d4e764e192b55c50751de7d08693ea8ff5a5ba5fde86a900073a364c59f6e1ad4601df3969148b778992a2eeba4e16fa534af4c1408ad2557a01cd361056f387fbc737e796e6395c55e4a32fe015394d2b1c8e37c62990a53180efd96ce5787e48107fcaa059d66bed6259f6adba40791b40f1b3f747fcd249f0e3f0a200db5a3d4c8c04ebba1bc104694d2b423210692d271625a956116df84ee3705105d25ebf579a1bf7e65371696e9fe48ef51940ab04260b98faec806eb5e13ca18b14a15cf428c42a509e13923b0f91af07a1f45f6440c99c1535c2bf2ef405f0b3610ad8008c55b3d626c115826e84529c88829a4e39c5f5a35426762ffc7e6aa96597c7f0ff9561507138fe5f9e09dc34594860021f0573228de54d93479887fab4a1878421bc3043aa2656257c602c3a2d76e668002c433bf47b3bfff559ee59618fce5994f9bff3dcb2298ab2254d6d6eec3090fe0be78b4d1ca3a89dd61c1bd577586de639da21e487bcf03ba7912ee3d9e840a2532d5f23132ecd9d551d7246edfc90889be915813cc841818f69638c14910d7896b945206808a481587dd08358b2113aed8967214f4794584fec412547aa5dcca04f4dea2073783a70f74e0eeb333324e1120c00a711005ea1621811fba200411c97d288bb18c75bf21c1a8dc93bd0979837845020c5903de7452a59f8179e66a46b3d42c70ed784d14c239ca8fd129ca6326d5a046b69d31cb056e846058870ff8954f7be279a85e0c6d5172f0ecc96737e32bfb83a2f79af3dcdb57bd988f2e32739ae2d04b210d530a24fd1701d03fd58962ddbec80e05dda843323f09b8995a07a49115e7ed34861df6e30fe0f6c1926797a38932a1d07f9ff2f83750594de88b5a0125ddfb38fbbd1b0146156b1f6b89efe2f53295888290456e06c42eb26b9a7560079128db79138d7cea7d12530dcd836da4a1e8e6ad416b26e8af1a45448798fd787fc24c5973428407de66a82745e049b40c391b0b67a853b0eb3b19359e1051e42aa8bf47d1889c2f983fcc2cc6a6b490fba577073517e3c2036c5ceb83c3ca0afd80b1492377973e256ce08d3dbb49373be673283a03af25518fdea09e9678c1d9a7a6bac0202de0213d7b30958f575341c2f66f133047eaa49a413f327dab6f176663bb9ce1205876ae541a429613d99894e08296f9bd3235f7387264c15f549e28cde630dac9649948d0d95280fb3a043f8d25a336fb351d6d492994d4b89ce46a8aedad30a437e16608d92c5c176eb4de9095fcbf4b29e053c2853c575f73463983eaac3870509b23164fb3ddc871195e157eeaffd8381036a8726a9b1b208368bfccf0dc809a28039cb2fd73dd9d4bd30b7aae769c3e4d9356892d9ac6944224f82802ccc4bb851fd6000df4f52d286fdc1affabf6e26d1bae36b67cd7689fe1d14c51dee26e6682a89a40d5516cc0c0c68b171881bfcf656bda325839a2589465d4d39b866dc4926f341f69e2aa494af9f0597b09bbf92491f92302161d1a54c9428ba0c2ad3e1982d06b87acd00e7afbd45c4407f14aeecb8ba9df46be7fea5b36ee42345c9e8c140ee5c7e77d1114721cc08cdd49a2d64a129dd816270bbe3ed244716433f4b1b89b41e2a37be71ceb57346f3bc79e97539fc8484066f4ad1a6d45951d4583ec0437a44a8dd8b3f4ce7ed4cbe2ef150d68a712c8f6c391669de52856e4c34e5a6b780f855de8778296ecc7ec524874343de43b1d1ffa6369eb56456c45ceab701b2246a8b13353651f3d17dd09f0976763a412512c38e5ad86683f05d2a913be0b2d53aa3b18d09c8161ec2ac9a8b41157a4fb8b905ae1410c61749140a9610c2523cdead96810c6f20ac2f43494536feff6fd5e0fd95cd488aa9acf95677fc7d6a64fa8a5f43e7ed891f157ee0ad7ec9031e6fe58b215f8741f92636242e717c6d44eda8b19b27b420f4c659892c222bdd1ea44a197813f57117396e37196f4d1fcf3d892f7630f2cabfea6c807a8caf0c47a888e71c9677e81c239aea5224fa147f350a56b83a5fc2fb51e10e5c3c1944f8ebf5669c448391130de8c27260315b57cf0a9ad393c58e2b48fc79a98213d0d63eaa7e960b9f76c2e7831debbe525872ffbeb6a86ed33889c568d2480da30768c3fabf89f3a8e92eff43f0a1ee6c6ffec023108e2a0c87e5a08f2bf19ba9071158c5507865ea3d5235f61bb0d0d6a3a154c7e7f2934d19ca1a8ce5226bd10bc683b49f4f3ba259064056317abc448153fb688728fd49c1dc15050a668f2f069e0c302508f59a32a8bf80e4aa2fa1cc9435243c789cc67f48f7b748da8e4ffcaf6a9a44a62e28f2a0baa0d90614f3a281c123d8252dfbcb49140f18b0505d9fc0dab6be41eda901f29ed4d686724333b18639bf0d4e53228ab4cdf7c8bc87d739d2ad3f4622a223c76d6d15b336c9d2b081b3c4f4e6e9112d90e31fc88a25ae27e3888d143287f6d4c133b240635cf890f8f9532864d89ed28942c14115a8129f284146f75f1e8b8be2b3fc93345f40b1d1988dd1b8141e7048d7e18a179cd492a4514f632c831b71b5cdc5d2c296c08e3edc4bd84bec9c46ca631c77735045e9affb18f6573cfc25aaf1d50822dffff4155adb9908befee8466e7ce31f3bad059eef0b93c72b9e158f06a87b77e168b2a67ef910fb84e5b6b17c7eeb690b873af404114a2a2be9f46e8f8e1048425c746f78fefc731c1ab83cd6d7a91fb08cebb99c9a56ae65739f31f057be9f46cce33d465c8d65f478b99604e176b6aa2a09b1537fc73a924ee431cf7d8392dc43ed6ce01a50ba7ff4fe62b53be902e03ce94f0b0e20988cb3c19d00af70bfa220601dc23d3bd6faec1de96ab650f948850246f3a8a3f75810dd8fca430b89150fa43e40aa42a8b21aac22258be0bbdc95e8f78b686e2f22f1d551e667cf2addfa3be4984208f5eceb8ffaf52c5297deae7f811f4c22b197693421a51e0e2e8356c9ad14f2b93d7b019cdc97a4d8725c600914448eac91911eb45c9eb44c352ae10d1e09bec9a80f476476dbb45110411f44644636f154f6eec5eb1629ab7d38e0b0faafe90ccf1583fb74c1172eb03d76546d99d7f9b4dfd1b81ba571050775d56ebb638056d9e2d0c5716c127e0ddef8018d47378e3c7762863ef7f87f030558f375657dea42808145802ee36c5bc16d1d97e32c4d4da1c970e9c2bbb66df29f5dea224b17b98ca9eb4703b51db5a0a8859985edde10d9ff757272825be42cc0a8109ae62c2c801a004c7db08bbad20b84195068d6c4191ba846dc1b9a7603e0c2c4b37c49d0fd1ffbde116c8a191bfb42595fc776946c8434bd0623078c6fc214f99ef9ea6ed35a5cb2e693f074136431dd27a8478c86eb3e50088e0abb26896ca5907f4b1430f8c02126ab4ab5a9b8104608f4e051702c98a216f14a207ba881de28c8540b88fac4d55fe1093dbb2a82c135f117f6875601b16692cd7d14382f926b8c8d1be349f8742e7462c78470cd062897ae19ab3ff359f9166305c51f99eeafec212adc67aec7837c15f4bea665f8f0afd5088b8bd3424b2b611da2bd47badf46609df07818b4d0934e8e951790715d7a601fa4ae010800dbbc1d00388f0861732e8c682349b0c0f49e65b407e21b0a08e9c980b70d32b47ffa798461895bc25f500ac3e4d5fb51d741e58b1f9a167bd5b9945a3ddc09dc42c67353fcb54d1319db3aa3df8c33d6eff9746dd3eb57c776d973ee434d337b9686121737d61ae79f760fe395e8e0c1f4b2bffc23fe3f628aeaba0f0abf686c981aab278e60c908d99a56376604defae8499dcb9743ec28bdacf0067557d11081b838261ef177d3cce8f8952f5aceb93ee5dec05a9b72b0570740849f14206f0f6592decae6798ef6ec2981794ead1a47d797951e8bba032fbe5e5fbc0c48a78764417561a9d163abf62d10749a9f8c0e5fe97974c43a3e22fd9b183d069094736543af9707fde8c3f3c7b70e27886391ce6a50402115338b572028b6780dafbd73c757da226163d25e60fcf33dbed867e44c71837bdcd48fa8a048a412f542044b1a57cae3f193ca693860d8c5a99ba178a2f9701aa638706080c7cdda6d30034eec565b8c9cc0a2956a98c6cde78d379d830ec1de07b796e29bd05fb3ef194f30fcf95f4a014b4648ac43335a442574d14d28bcd5cfade8b47f3a04528e3df87fc40eed310c05c72ba1084fa11f8fb00d328b4a598d2e1f308cc157ce34e372dd4a4ab4daa51fbd758a694c0b456faa04b2dfa8fb62e21578df94b8f5d7c17ccf69a7b1e78d5b855aa31ced252b4d8499dc987cb814677c6a2e1d5b0144835d35d0342391b2c9fc5675e0539b3624e8b70f0985155a0e926c89262b2a0dd9de344bbb12de55f4c2d831f8ca57ba3d7aafb0de8760ad4c2fa1dd68920c5cbb781de8f50588987d9ed8b9a5a31effdb2c7c48a326a925fca91fe34e81306ca7840bd5ed530b2d3da00b7fa47842a40cca56172c4b75e9b846e3e68b28ff9bc93b5823ed0878aedb3b3da7ace3011100281f4833bacd9e843274d8c61106431cd91683e8fbd096b0c8dee8ae9d41530e0c3af3ea547e57ce92dfc137d802ea04c069f1c7f71befb8d50398628df008960b26a1a648986d613f5575b3956c5976a3356b09810a4c6e98a1cd103d5f73bf68d0db59cf20ce28757b325444c563096dfe339d3c639d752b700bc14db2309410451bc6bb7cb7e49a24295c90a4f4942d1361d8495008e1e6c6a82cbd267a1b17a6d8884f0b3caf3d567dedff845404e6341615c74c9fd3b5d3e00f4f755dd580a402494d6241a86fd491401b118df523afcc24b24cadfc49654c1eb0cd113b1730869b3c3d72755c9449ffaaed01bcb8c0255944f86113b9ac94dc00141556b265b584924ce444eaec4baa44c4f52adff27555cda04a242ea2c3bdcf1dff2d3c2b05d4a9595ba1b2834a1315e7c06ef39013708bf2c36ef52dd5d3ac2c4ee9defa4336dfc5f1d637d300009a91ce147c742580f634c27fd45af1dcc4bec61aac8736ad200ddb153d459eb993179a5762271424842978cc607b322c03894225825b5c87dbb4de99be1c20b1f5bb5174483e64180c1c8e100a345857e695434ed0697c127aed7632bf64781a4f42efdbfef0fee4dc4bb6aea5329818334c38edfb5cdd376dedc4b68787d39b085c29912b50d5442552a62cb92041d97c954670b009fc6506502ae4988727d4fda70302c2f52611dc5874e682b6a216f0b2428a871057df407640aa4cb329d0ac730880b9908b7b4aceaa5f92edc6d362b0d4aa72f7ca1731c177aa3080f93881a6835cb1a1be1ba0c9750e2bfc10c57d91e46406eca76b4de8b2e06e076058f06c02f30c46b0af71d01560bb03729fef4c465afe1677f13172efc1b04eff5272a84e2b08d92e1a9f88179191b2842fea8b0d5b776481aa73cb297fbdc4664afede8631dababb6329cec279fcb415a1cea4b146159c24a3bfd1448a4dd15e7dd9df0614cccb864cfa7c68e9a1333e2467f9e4446b03500edbb57404a0eecd08f1247a8452c697775eb99af91c4c799861c490c2401671896b96230ec50762a6ed9d311146d9f6b5678b7ef88fb463d1299e8ad3e5c814405600265d4d10c244c1716db39659eb5f105f1a6376d9eafdb48a02d3f3c4d6e45bb207ae473c55d77313548aa64eb97a49bb58159f5fe1686bc7ad8007c93a5035804f2b05d7ea447865845c7c73f6996ee168f7958ef301bf4867a275c95d8d4c37e7f69986ce677822eb54894886f12ff924968ce47cbbcf7b25228c6ac7a30c68eaf14c9f7faf4458d6544c7564ae0909c13e0382ea518979c67dc96a73a64ef07aa354f7cb53aa5583732c54389cd7ee0dcd894b565ca96db018139a9ceb312b0d7e66775de1f9003c38b4c68210f6c3483849466794713b3c3c46be9001ddbec50c74541c8839029b8aae8912564278165c0fe124b87577cce30079f8e3f1f73d2c22b72fa98cb0baf48e27a1ea176ed20599414c4d12a3dc3e1c21d584527a4d2477c5e0b21a94d102877761815a21f829aa012f652454e14278246f284bf5ee96ccc780a986dbbd1bd150f9c564503ce8aef91b05e60e16d926fd59e0589ff5bfd2d42f9dfeaaefbd2c75f109271d1068f71c57c08f675d4d56837530ceb57f5e87294f951c481424359620220e867f95f407b2f63d28dc14dae1a5d4cc34d0f113da080207531035290ec9ef040bba745d148ba49962f854749a55e45c9788aab6fead516736ad8025a5fc63e92e4d8c69edda99e098a9785bd0ec8d7f21c024e29063abec8c5345c73a127f8cee6c020f4e5e48a2a1a0c6fd2d8b7ebfbc17e5d2e3846213f862d357b5d063cd20ac64f11fa119e2be4ecdbbb573ef290cae652d6538430ace4be6c901973c571c75d3fba6e0f7599e04da256b534dd821b4a0ac31ecf1b2177888bce6f74c796911eb660313b1bc6c741008acd0c088535da93bdc8c51a0a390a26c9c65ac70e5a7afc89b388fec086a419e9c08bbd1a5ef627f87af9ac6587a1988653fd6a2e4df44ad7fe1c44bdda46300ad05f29145283270a4504b87083d15ff538a804bc0fb3b18fc46b5d55c8c4d965a8ed80ea75980865979ce4c69e0020e78050c149ab007140e5c186525a30231dab690c92ff9c5af2141cf5811f87fd81addcc09fa12852fd50f3686df41d1c161394b00b87586a67e220c2b0b3ee2dc82f31e0ec0b0d1b31a7e6523edf4a69eeb54ca07c6d91f1ad384d18b0803169a1212643237a0a01db65fc0cea36a2b4f56192db3d1b557c56e85cc3f8fd63010ea5979358093a0842388f2f80b9da40b8f70f473ee20f44a899e13925f358303e603e6978b8073c6a5263ff649a8ec2c06fde3f988e5982168bdf7178be974766b516d312c4cbc5c3fa153c9d1b941d2c10be3fed8130ec820e785323d05e31cc68a0a5ddbe30a85a830e831e1f26a0133d6483300ffacdcbb79ab2849de617fd0f9c6029fcafa12e57bfe420010560ef8861906530e589548c69127b7322fce3bcdd899da7d1e47b7d3d0cf093db181c9c1096760976ccface6dbd19e57780666a5bd7f51364b731c5b08cc0c20c2f85f44b2118ff6dc6bb498b35b2a24c354df54bb2228430b2f43dd09675311392ab753368ef1c5932296cb7c4f7b45a5b2776012b9b52fa943b0ea6d7abe09f478cf3207b567c106a988e357705229a7ee1714373ca9f1666dca0e8bf86d70a5bc68168418d7aa561738750ca38357ed2e9c7c5b14badea0cef976453fbda87c491958a7bf9b332bfeec1bf65da27124079daadceba65fafda170a0ab00f12ca8af929c2cd95ce502a32ecfb7c0a6b7bed49c7fd0ab1b8cac78861694fd513354b6592defbcddadbbfd8cdee8e4184fd73cf9ef19f230c6e48899b91688f731dccc91ce5905971ba0779107da53723a7130fa3c984623ea27b3e7164f4409918dd16a3ec41bfb32211967b01b800634280d01aa92ed734d8f277c2031532567bf623642866da29cfafd38015e2bfb7fc6507fc6ba80182fa7af191b7ce470dc392a50219cb91ada4828180ad2d34741f83a8d1687d3b522fd53edfc122f035c689058691b8b68c28e3e2feb960cc90b5fdad2cf0063454c98056fb15f762d40ea5dd922b14222d574d4e0b87ec437e01010b8921a26bc3483357c81239004ad834996ab6e6072de1172d13b3a314f8483f731105c623213a5c561b2e2036cbedf334ed7b22f221d702a727b40c27b04162623be80905e7cc9a4d651bcc7947ad49b11b2b945ebc3c366ec451411304206741d38732f108a3d4f6c90369bc1b60122b88f935b1d74e5c7a6c501f7dc74e4030bee3e1d05af36e55dc58920df7354a602fab0d5c382c221070dfdae50918a263294749bcdd39b831e9d814e143667cdcade992ff6e6f8b5561c27448881b27fa8ffc333e1c5e62762fe753ce73f26a2d793a11c905a0a86741a82238117d246ae47f8f42bf65f3111c40222a8b89962af4259d12b6a90656c9cd752a1047a95f7614428fe5ffac7f61f567570c5462279f2180895c0c1608962c328c871488d8fcafccb37038aed4500a23396fe6cef0d42c25acfd2f2831820bb2f28367c86da23f582fdf99e80bdf05443e3cd08c54eaca4285aad8e413c69d8216bc4866384ddc42a6ab965885a083d88d21283cde1294dcae04f45487e52b9c1aea9d7cf24e8b0c5a108f09050e6e59d1410d6e7b4168ea0f7a2853c891a5c7d431b50193ad1b08ba2f69d9ac9fa57b7ddf5641de14606824d2d133d47a641d2ffda4fbb265139e28733899a45631446c5050eee5b2e8a7df90628f4334652126d874b6ed888e926d6174718dacca2a47bd9a766efc17302746d16914733c7b529a06609a1e2511a1c73cd79ca22bd62f8651d5a3f66a506accde7e704b8bf771c41e1eb04c061f364189c4b873f4e6a186c660b858102566c91e83f409ddaac4637e5e314499d009188b7b41be1394e00c7f7b3b18157e321e6525dc3d08adf567363a932577de6aad58ac56361e4c412e5214abedb7132ca68c86a5fb59e942a24b413305f8c0f6c4a0f52eb387d8fb1796a1da74240aecfba0322c880cdf72f1c39cd22c770e4cbc0b363c3c1157263f027249c500f1eb004d598da55862781a4f8122d70ddc53df28ac61da37b17d52f2b274b86d4f2ab15de37b32db7a2d97ba0d21968d9c7c0efa2315f79ce7d14a6b904446bb3ca92c827cbc4218e9099fec778799c147f6ae37083f74c5a7ce9a87885be5acf5077e3f093e6f8c24c0fe087e34af71572dad2ab3085465397cb6f0291a61f97ec23c9703b2c22d27d4b99d6c9e68f0f8740cf3a0abb434875d1111d5c7fbf86911789f053d49f3bca44652964800507de02473ce59b716257a8c059f3da51415652668b879f482db041c737ee41aaef84c3118faebcd7f2af42adb9947d13a9f568255bba055c9b7920fc636508ce79a9b98de6a05de4a6a506fb3d8b620d1002b981df8b07aafa22a099a2f84211a159374a871ca9728348ded20f3b30a49f5583d4208c42c1a9a0ccc3584b001602e2e3c47308dc1a882112e3b2cf6ae3843bcc06d6c9ab2417067ba1baafb4bb3fa623b3281504526718c7861813e1ead418eed80839790296900505adba06043d95efab3ca0a04a7e37eb7fc99c45070505a8017dac560730443f961a8d18f1de924ddab207da8a05328f7c38a45e3969e44db0c4314e0b9ce3ee404ac54b44ee800473f4b82b065f68966f982088bc9cabb83ca7803aba08e38682b20bf497c81224024f812719be280061cd0b4d15cc1c74da8362959fc19e7d01fe12fb02196c6d072622ba9d838f115397e0163f7ff490723bdd74591f12513a39e9995217def063d14a2b8ac78955c0e27c078a4a4e09414d39ed9096751032ea0341139d1302e1c0f1c55c3cea4bc1e2d0711d2c8a218305be3239d29472981f05faeafad98459f55cf4f2ac700db31cc5dd6cd6a0dd3b2650bea8222fad010786e4a8e2bfec7c595bbedfbed7561598294e2dfe452adfa908884c8b13cb5ebfdae5df7c0faab7ad5bacec19b54e84967f2a09d490cb4892aeedbac1603d9beb3b30bbe46c5728e26968fbd36be8531a91164c8edf66d29a97c267f1c241eafd97f1fb5105ad589e4fed285963dc09a45857ed6beb27392b040d1680ca457e0790fa0e0891481df039a147c10946272d7e48ffe9cef35530a2ccc969b5106d90d9d6abb0690b129cb756f8b91b3fdbaf9c2da6add27c41b20668813cd288da71e1b9335e638ac34ce12cba045d40280e6872df8a8f7046ad982c7d54375f3184ce14ddeb07029144e719917ce1266838053c6ee66a1814de84310b64ead62a96be17a0e7a10af48b2133012d920f36d652eb2faae56e715f1f0ab5c3b2d482371fbea69c19b9993444754d2594ca29934670408c81bb27115f478e81f8724eb999067937b5915555485650ed5ed7ab2576e97e138ee7f164411cfb50fbc2fd9480edbc6fc1175a2c5b7eb78a6d98a768332ab1da19e0041170097b2d9082195386c13893cdc9149614e29d3b7d9cd11c583d1669b0460d594fd919bd425616b11d283671b195ec69a603401df79db7732c04eb8599fed9dc5b62ec2d5c006b1f1f2d83dadfe4a7323b40093b9246717752cb7e65e90f62243747fe2987e856b7daeab152fc039fb6f26564833e6abd83a76a60ebeccf0d0bd6261e5a20139efd21ffdab2408860de85f0916287044d259a53f5e18efd01a2fb25d5078a44c0245000204e33e195703b8701e7bcfee2071e242ffc5fef1b18a64b6846569ac04a4347ec80fc18b374b720e3efd919dd78c2e8fcaf7e3182b4d8a7ab3167fdfa38af4d8b65bad2f82a8a60f8e9da2553f9e67e23572bcc447c072998d2118fa4787f5d65376b777dd27f698787bd990926284850ff3c5dd7657d186d4e4d3b2e6691da462a84a6a2c696c07d7e98f95629937534d08a6cf0652ad72ba6b64158e18549e183c274916d3c9dbb488b8ef5dc44b982ee0457b640f598c4065cef04ecd8cff4f9c048155231c75625a605029e381fd70b720abaf3748428bddec56d56d69e6d8906d32f95473717b571d0efbbbc53a63cffcc2e787f52d5b7b9d9b72ccc46766ca8dfa0cba132132def3b12c7132809df225714d2b5397be90865b2187157faf65fc07d9e7e7b402de36b258c51aa819da95529186bcacbc452977d3739e71f8370e65732031ee68ef6d6e6d74616df4e36a08a23ff30ac03536c2c60124438bf34a2826387723ae592f7f568f24777967fb9af202da9925a89fb58006e3db283dbe8fe38c201b9b421da8b3c9e9055c98bb2b4e9df5aaff21b4632e1dfb036558fb4a2b4669a3bf56cf60bb5c77b3aa117a4a15a518d13239e2206d09a4b53840dffe00091520df8d7e75dd39295d95882b21c454b4e209bd42b162830e8bf7f96548321abd195d698f371f1ff3ede47c121524228726f1c78a2a6e6b62316f5f400d6ca85433d2264441645cba220c317a7e9f6bdad69e29860da2d9ce801582d9371538fb0754989501bd20bd5510cdce6261cd1bf951f03fffaa11a541825e982f3d419bfc6affec3d64c9622bd93dab1e80028f7d21903a0ba14deca99079fcfee047be1b454fac45ab618ed190391cd69ba0f06d16964281e838874d30d674a05028418f28f6d4358e0ad2b3e187691c83ff119bcad2168130ac179160ffb4fafdd42a85ece6e0ed3836f8284c9fcc7badf5cfa08b6f8dd8c7de427e01671dcb9dfdfeb88efc756fad02b753f485d27fd0f10750384742e490811a0df075d8ddfb9f89b91db84317fa6a9f2f3311b441bb90d033862b2b0c4c2d4225b3a8e506f02d9a6809916169f40bdb1a2d3797a945a2e3035531ebaf0a4e5a22ff80ccda01c75bc80cb51a443ccd8118cba8f907997d1b6838c4381102cb7e118d85eb88742ba2d4a0f95500c28f3126532fe8d83e774f707a7ba15c4d572421e531e1ba9a48e30aa58f2df2481f4681d4e7a91a8060259610d72f3f492b93d817aa1931d83c134cdbc2b7cc210b0d8c59b39a1189c11abbf2fca25d2e4c9d7d5dc0c592970536423940d38adcedefe4dfb82eac5dfddbfccb4b87a9324ac25c5e1ee053662b7b8ff77860767065449710091edc4d29ddab46b14d2a6adc2941b3cfbf00da915e2fd80302fbe13439097f9c1df4fee84031a859817fb5bed1c0c059784b4dbbad6a6999763b10d92c422db5985b15f7371fc32185a012f832608ba05c8148322a76ecb4a58b305f8ecd5d1b754ae39015f3113d2217d24655704c9ab250d70d087e61283ac9556943440e8b9124e5528f6b1a95f9c8561254ad127131b99de066efef0d6e158e2b43eb83ed34efd80a36722e349d7851c3b4770ca23e7ecbd013ac9009c7846824896987a21aad29f745b60b826f636d467fd9e0775f4eaa3958b8ec6cdb55f3d1578625982c49e87ae04ac8a0de6bab2d6675200e91757c2bb587819e55c2d33ccfd11ea3e2f1ca580c0fe9156e49430c32c981fc9701e50e40f282de6968b85a51e2ad833d8a66dd101c8cc7d4f161d4e9b811329462e4c6ae3a2557d76fb94aaf870ff7dc450c59341956d140c72e1f0f39fac1a0561c5a5f5edfbe8dea88096c18f88fa291ab005ef4b2216aa29458a68f41baade82ee2b2a82dfef8b9e49f62a5649a069f27db03f547b51df5624b2d3bf161ac536a895251b01c5bc9c8ad48eaf58060d61158f9ace219d50c2ca508a2d24355a03a956a402a454aa0e531e032aab8939b72b92547547e51f27b532f8ea8a0520746e50db58a8112f8e2ac5e1459eed3ae78a16e36e939db1bc772f1b8ffe340df329d2dc963979daa1385b7f8eaf73eb4272ccda1860647b6a72e954feef0220216ed1ccce8e9bc69457002a777af9f22ad7bda26631d7eea35819c02ed20440d77cf196e08df6a3f2300efe61f79ed558f064d3f0b9321395a27e82b79f57306f9eb39d0af7c76e422602881804397bf92d2d44a7bda1f4ba809271d44bb70ae909de3994fdbe8b545444d99c14749e5487d8b050bb470e6075685859a74b31649786abc1ed2b6d4a391a6530c41bd959f0b28b98c60d631296d7e781992ea2e1dec56dd8effa14451979a531086b8a4c5fee084ab3d362512bf73c006bf11999c04a32c8f4eeca2ec226beaa6a6836a4d1df9d08f6bb0e674b95da4a1440f3d638a3455745610df21123aec08109e92333edf3a5ffdbd8d4b8ba265880616b8cdfb851dad088077c993e09c6a95cb2ac3ae40b705b141d088436924f5573beb879f80216e1141f172d22d4c1e4ea62a490644357b1d64773ec29d9ef171c8cbb37b23f265057b15220aa045525ebb81e9f744b2cb244bea8edfbf125fdc825232d730473366749b317f2387dc0274f1db006575d6b99f6c8aacb091e4fc25e3b773f9440751a52909a9949ae55ba77b6d4d42c9d0981bc22ed5e9b2ffa44230025ae146493177d735f1d22b9957ee5bb1f403b06e97018836f367281df1b48f3035563564c26d9b557e0547e2095fa815435778fd84c691f8f11d20b0e5081b8fd003146b9c759ce04f997e6b777e3d398be554d060d6aa4b37131692530c0de72f01002fc0154eb6c36e215a2b9ba11d78a68df73fcde1f7da2bb35c9318e8888abf3679812dfada81adf2a1b0acf9b7d6e473ade6bf448e515c282d6422ca9c4110020fce98f03311db4bd3e4148377e279ab0726ec545387e8ce818f0851ee904b87919cce6ae9b8772003e695dffeb83346f239bf4032c4a0ca4b165972ccee7073375c269b1f3892ba1a688052879b2972feb050b168257f6d7312f7430bf385664a798c70028f8e8d94ed3f18f30a09b56d608a366511e23401846c0aff18fe00902be637f440d0f704f10bc1f0c65df0ec7b99d0d12bef4a071e141b4f108f2f4d4b6206d81ae9a765b4c82f284132dc5abcf73ea1952007996a811fb5b4b6457023abde199091af2064132e320431942fd952c3056498d64fa05f51f22bf7316e9386603e4ca7219c2994f7b9845f076c62216b2c50604c9eb1e17c87927dc2893cd0b949164b79d9d61fd0be48d688196eee8b37907d00266c83d60b634e77b260b5fbefc8a0cb8442b1e118049424cb87af41f1c72045d7d07a20520ec027b11866771f705a6730e1e43751b74a880cf76bd4296339d0100ab47eea986981ff52e25b2eaa703764946fbd503f59667f74caefe5df9b697c35ee53c31a5007f6ff02b369c32f376cd79eb8638643e1505d9f516f0f08a10dc31d2bf0406f717a40658f9d85f8a74821239cc5c94368380cd22104fe216c1986c8cfc41e16692d7d038fb162a10492272c2a6d49dc8c2b8f0b2502dde31f63f0d5fb6166c86b0fc4b2208aad8fedd0e63532cdd22c64062926946040ba2d08a7492471c78a65a31fc0f14133c208f19214117ddcbcf057058942fbcbc4161e03e7322d4dfccb0aaf22b5978e5d272c24fa137a7254519f0edb52c4dd60e87b3a46608262dd904a925f1756d375addd971cb4f2a1c6a4a7c12daa2e88ee9fa0143f685d8ef0250dd1d607e87875c94360078bd7101c3b4a12c9278927a74848eda0ab9372818e7204fc10fdb7cc71c325af0cc343ecd59f3bd1a13152fb7277fbba9fe19c2f73f1b933e903102905149a4bc2a788436c2b70507fde4d05d1bc7fe754b9d37cd5d281030333aa96fb66d55aecb0cbdd3f7da1b21a365b6fb9d3bd64176dd31f02a3a4a206cf4007fa9c9679ba1a8568fb555e0a33e34b50f79b10d7be6cc7410c664199cd95bae9a45e56578c940c1b1dbd09f80caf048ffb6356e715935457c5ae1aeafcc326566f9de4cc490fe7de954d81056481e01d599199c571d3150e9c8126713dae268046af531b95619d89193a60b2d8ab5805b2aec567736760ddca112cbaa16e2d4759e4cffa8f665bf477d53d1964f6fcce8530092a21b9d772f013dc3aa6a0206f39f7baaaa9cd2b65956de2521a6a8be45c43d0db52ecddb49922b660b5604a1cd354cd91b836d4d65f58089b317bb44d02a9f14205b08b76188f868136d1b23a506fe4f2056489b403560d70052ada25d43b9563294bcc4abeb1a60c9abc093ade24904871266a0ec06e49b03c1319d7fb77a0815e7dfcd18a41f980105dd181baacd302bfdda9c7f0300084e40a23b1da504a871aeb02f73cd97ac9c7d95204101360c8ff53e2a8764c9cadbd090ad1adeb896f3ef8fc7129e5a2317068deb551efa5d2bf42217b55880c45009260c53f781af5b7f8e64a60eecf0db05c6892c8170089045591fc704d5f16f04dbfe4cd96a197352be4330b0be58e54652717f30a42eb86d5bac1742816a00473cce686b577db435f7585cfb5d466ba0477a75193da25fb4f50339ffeeebbdb9689192bdcaa6ddfcc73edaf9775ae78bb5ee6312d8bf95f90ecebfd5e69ee8ac9cb46e0eae81e67f958d9a1081136dca708f48c3cd561a0c5ccb01841747c4bcc58bad051054c5b03ffb01493d39ce3b6e2238ff16b5998ac60d1e461f2c37d41562b52b55fe72feed90c5519f284f863096b14ed4fdabc4275db3d389d30607a634a8cc1944cdd6e1fa911ea51f9ee97b54f3c7bab1dad92986554e8ab00c5b715c14253ca2b1af9ec9f910befe8163d522ef354f7dfb3bdf13025f5be44cd3f2e2843c53ad033c809f382f06dcc04c1e3395008e3d2593b9f16f7febb43bb7be8ee6cc7db664a6d6c288dbdfb79513b868d7866dfcb85aaf81d4d376065360a214f6cada5885b0f90e547f36350c20d8970680177930925522389cad097cd5c3b3eea7c73310712723889a4330fb7c17c069f39e600e0a26a0bb9a314821660aac6318bf907d6a3462e03bfad9540431962327bc34e4e7e36b017cdcf07f1663a89cb790a4fac4249f7ee4b8ce74b428c75dce83b65d8b3aecf96b50942ac0ca0c10fb1f83a8d25647a44b3e87870c9e97a16fbb4a4b7f55cd8cd493d952328be1f32f03ea1952b6a3270cd9ab0262904f02850e1c48daa14856e448205107e4f0b4036d3ec66ddce3cfa6d3cf339f980322210a43db702445fb8a4ac600b815f80fc11d951c7f50c218afce8573221f27062d3bc48cd9df9a76cdc2afaea9e7869831841bc3cc6fbdd93299e98a6729151657b83e6f62875e571d98a4b3df092d01dc80b64777cd0c8e119bc30487617fbbbc519250aae3e74ecd785a87605ff383ee08314218cd8e8d3c8619d6d0b25b08b0f7f78ac4108f59d452879e949a8290794dbe5390d15a8204d0f58bd450f30348b0914b78c71a4fd2ffa14c489a2f84bd92882625b66fa822540ea2c46964c857bca71101327f6b287461e0e523ab4e3298c52ab66a655f3283b16d5d613edc00adac5c64c54939f1304cda1257093071d2c378cedf910dd05260d4788cb129442005c27dad3526a7e3b39a7d2c6c78fd6eefe48d61d7232d0faef1ce7faf1d81b46c6b9ab63a7f5cb4c798e772c49dd557a1d224485286fdf2839b5eb50fbb5f8b60d090917e63b4d451924606885fba6c736bf2ca686fa384c427a0013286beb4c47c21ca6c525d1ae9107b7599cbd77b8ac45daf7ebc8ff9d7512cdec520cc3e38072d253ca9496dd868c95c1de7bcb2fef3bd765c239b84b42ef207bc75b62cd67781b7406e107bc6a6ac3650db599ea0838a17458810cd818b5a64137fa27afc622f06b188492cb114ab58c42c76318b5d6cc4109b18c428a662885d8cc514733188254662f9a0faa036bc2e2ec1cef97f3134cb59c6fe9dc2ff40e18a8246adb35705cfe3edf903856743f7c4439de7b9f9c449c56bb079eaace771dc727253f038da9c3f56793ee84e3a54799c9a4f9fd5bc0c5aa78e5a1ec6eda777051e63cdd94385e7e3fee4838a5730ebd47503df390ecb382ec1f962b2aeca84bde8f8aa162e8e5a87cd1eea8d975f3a26db7e6d87041da72815c40b3e1a71f838b31e40e51f49555ac5a164e4a22d9cf621658987b8f4650154c30ba4333cdd4ab8986c6c3d9bd20e9399329afeded505233b75e80f480ddd09ed2d8f9bc172fef3a7f894eb6a7f5fdfc96b1e5175fa3be79f7a85ab6a6ef9eecb275dd5ab68bbfe8bf1566fe9c89f015fdd25d1b040758a5a70e9c7deaedb79c0d002d2734360ce82418f1e7e457f6d7ae12502bbe999d564a520863d10c33a1d80194902e2629c72533f21c4c74818744a1190f9bdecda54bb784950b7d1c2a9a9045672314686e6143ac8850df6d895117ab103e5d57411292316b153d4b2fc9ec906870b2e4089ab15c1dc839562ca68de93ca1a5728985497d21586cb19edf551d354ec1293db0e5a32e73173801c9c28988209caa57f27576eb651c4c2f4e010282096fe0a63708f69a3f4a7b692a9fc3aa204faa4e051ad85dafbc563bfde7a11a4e7070756c638773a9ba8ae13036b61f6002f6c551e28b67703dc033867b0804f22d60be3af4c42635009c2f59d48de9b6e68692b0b838c2ce52c70d7cf4f16c695b3f576732876d8ab0c90dfed4f09dd79b3d28b5208d67c614cf83d46fb6ebb84a599c8431b181e06ad6ceb7f8e0ffec11f463e48276a618854f5342a8eee21e42ea568630a56e384003dcd006ab40f957585528357f434526e81355c1f78f8d3613f0d2c452121ae9ebed33d41f35cab4081531eb337faad9e569ed7ab6cca69c6e6690a28437fed56e51ae2f5e1a3fff5b49e119cab8197d476906169743df3d2c85037105316e55220531474bfb0d27a9a7e74535895f30a3605708e12a45a5c608a99441e198193c3d448a3d713e972d1aa98375167abe99b2c33a65c65f16fb62a188b9f6e79a80ee63197f93593b22eee50b3e97c092de008e2960ac6da655558a3194982bf53920174ca53615a3cdcad745310854554c4d9b729f6a5b78f4c79ff2c435211a0310f16c06b2af31d1f2ed06f5d76b1a54f215cdb4dc7c91d2873d690ca928dd865627c307cc4384d50d41c0a8e16421644f13dc163dc23f8843718361a6d411be31d8f781428c637dcd9a99865634f07be508abdd2f51ed85d69a688be5d85167f01c7a6a76b431e611ea646261e5cd05eb6730a85f09ebae16c7e03b6727850265e150a6abfc092a1023301c3c03d2caccfbfd58e6f3c7c00459af06ec694a2cdc843b597293b5de503fa919671dc3af8cb944daffaf94cd6b896840fb92dec6a598c375a7596b4bbea60ed9f79b5d8f2e76d775c31ad22dbef348572da344f76e969c85757b71dfaceb615e56ddb122f1cd9f82a6c54a278c00799b91e83e10425d5f19e7b1e159732d72ae72917e66d8a0ee66c0ada6b6b7e922375ed4d5fb66e82ba1501816ad6ad96cd723d708800c19600861f4d1ebd7e35ac8e6a89b992b4081eec28c668723e148c387735caad5bb76b8251c7d5e2b568ab44871f61f0359094efefe76e1ee50d17978ac0687aca595c73926dc39ce7abeb8341d974d45b6e21ff4478b6c2afa2c2f046e363138627a889314dcc8bd3c0634bbec5c15a1c6b83fa62d559c06f3113700b7253d96429bcf3f1584aab5be9cf596603636a91fbc1caec3bcffbf636aa8b4efacd7a68629e33de05bcbc484b660a31de6ba371423fec87eb16091c9a817103e71fce01707274bc1c5d83ecca0f66ee1ebc4aa35addee3895c058464194845d1dafcb0c459e41c327331471cb2c2c701c6d08d8cef4dc8912d717bc29b5a93d22009a203520fc2cd30c781fa7cc55ca2a30b39e7694e681f32c603ed50e932ad5b66920a485ac438cc369e6558ff914efcdc090fd8594214b9f3e652fd15254421c558efeb45568059fad1a16a815642a04a3e02aabf601c2d552d4091db70fa17d5c2b34a09e653bb759eb4ef19ab34cc34f446fa1bcbb5e5b0af34526d03525308493f37343f74a41b32ccdf406758e8290620f949966fb7f3aa909d4166858f50355b0dc034f20f74ae00b2772d7a4ecbaf294ca3a843ef432a899c17d766e379d1f8826684bfb993782166505e5fb2178a5888b0806974aefa33fb816cdfee28e99502a095fc6203b905bea6e79dd83d27197236d2842282f458d5a99763ba828a9d1a18bbc9a3c6c1fc29e93866e16015c2f66af753f47e9f8282b7405d177708b9b5f35cdb38783239668b79916104545e7e94a0516b12320451022ec1a6d734bfa0d2e295734d5693429d8ae316ac7f487e65b4096feee83a6a385f35dfb44cab51bae73d82db26a01d4bebe5ae283f5ba9898e52b83944c8eccccf1cd80c57471e690642d59a32780d5386ecb222697d6ac932786472acdb66aca4534386ab997080e23898a3c27e5dc566da879a0a9360d1b3c9fb8759ee801c5e4f15c5b50dc628cb791187e6288894b987ef2f101f54a9c915576209afca34f10ea5ae183525dc0146b193e031e4490acff408fcc3651e7117c3eef2ff3aac8f2dc8c7be5c02bc68f2634f143603893d9d5ddc869e89b76add8067f9762fb7fd8553bb56433851755cc75788acda8dda23ba7e6f1c69a60b6edb932cff09cdf411f45bd718c3ad034ec7a7dd0ba0c09e7d1b15a65e5e0e12af7bca2f0533cb10c00663bd80887eed81f7a0d1ffb6f8da899d65d62779932fa20535a20a688d20071b2a241f642a0709a77a875d6f0cd161bc583413de01325bca7ae0407f4006f5b57ae037fcc6ad0ceee78041b3ead096342074f0c36292cf74875dd0487164e4aef8e7a30e4fb1b311b8ab5433e05c7814f59f7140286fc13b63b2e6e5c71720b3c278d67fa0d59d2667b7ae2678bb70d651b7b0e79b5ae61b3703c27341885c7ca07e0a726f66c6263e4fd504a1b1b04bba7b8a9765fd4cb1b9edac491fe75d3cb13f287273c612d62037ece9f92a94d6efb73d6a74d8b878c36192342b40220ee292dd88d3da049616162429a45871a66e22186f2547f54d7374c3a39829889c0e84911a6e634787e94f92d7086319197fe8d021cbd8dc54829be543948cbe2b8aacec34202c541e2854a4b6a30074bde60b1313e65362908f729efba3dc3d92c714ccfb2a2131f1a9039a6d93946a4b04c24e7a8c5dade7cac4503c965d02476816d559c31373000786ad66e8695f53fb483607b91caaf4b169c6df68d6d8ba3b039132b5188479ef17c16d0deea0acb4a7f961546d801fe6295e069a96e34b9bebe6fa91266ada1fa212ead33b1001f5013249bb947a429f68e1213c3e1c85029207415b75db32bb1842fdd768eac568322a691edc48c728763b9fc7a17c5f71f48d9c669c648284e6df56aa47bd84b712297e0342ebdd31d07484b5e716474a71a064fb838bd8dd5391d30e1a537c1445246f74d4b92eedc2990b8c40ea10a857777a08469b9c8fd8b256a4d6da9827d13a11bbcd49565658e08558db8811474c0c086bd1e8a25c100f51c1ce9dc0898285ca6478d56e734a8023063239f4a30645ae0aba737fa5186d9cdb2580cc54bc20058d276dd099e59c904ffceb2dd13f8c7682b62f9e4aeacb1d434b22762707683a50d46715b63035284f337c0bcdca6b13cd4b943d24cfaab738de42092c089519287fea91fb40d8223b7116a4a0a2080bdd7dbb2f4eedede146444ac266ea2df7aadd47c7fa3ad9b9832fdc966710417ad6028bb24ceca791ff22ef5e71c57f98a2aa8a20a6b8ae88881f85f489eafabefa7c901f5910e958711cef1c78742a288e9814b8e87f0a46e45ed94616c4a0e14b5f1857818b959ba3aa0ad396a551c9e86bd385413de9a165989cde21bc5263cffa6f2db55f99d18ab9f78ad23455727ea3ffe282753397ffbcb681e103d1cdcfd5b0a6e9cbaa1bb35a14084869ab427dde546b793552df0d217a45c6e885b9cd344b972910370c6130b7bdbfab1ee51af35e68f54207c27dbe106f527d660db7abdcf05c653dcf5754f0ceda6c2f6a530684de50fb8fdb27058db71b3495b7fa061a22da7c68d02c004ce048e861253a0537156899625d67685cee75f2856bba9f8540c62e01c3ec1f5f927527d639330bd65485abb652a14aed4c6d019e4497172183ce7196056f4f98f7ea348cca50766cef58da64849e0cc30249c5192a8ce86df5641e5b1bbfb5ae7d60f5962c1f5d08a38f9e519895633c129fdb9313a46c01b7b018a2eb0461d5d0ea377cc922d56ca7698016c92f2ab43a74cc6cf49cb8efa4ef94746ca4cf543f49ed0522498177aac8e9a43e330b2fd2a4ba5fc201f576e6388e055f20c722a7659dcc29f5052795aee158b618ddf62ab74d0c5cd1320013f4d4ee186ef20852a0d6056111cff4c4eb9a8238ca97092cd2e65fb265335d1001e91ec5b456665a93fa852205be7a472f0932e199794bf2d0249a6ea49a14aac1df147ff14713d02373231c21bb9d2bf3a48a9d3942c81884bccfe2057a338c869b917adf4d4af062665a182966453cac1a89daba2e2eec89771621df36daa7e2167eca18fbda0d98cbb51e6bf0721e353fe3dfd194cd2c538c1ae3d39f22c089e96423cc5ce829a7c63d3ba68371cec95333f25d44d0dbc0e9cd950c7a140090c04599c2faf5e139df5f699a035b86e2f19840fbfc8dc6e139fa072574bca5c8291615e1b515670880bbf72a8e1a36a97772a6a090a8608bc520df35f6c7f76cc8576de4d452d8b528be9589a82769df80584939883c4dced76abf6f8e932f0c0448b65eb0207d1603b09e36129f2e10be0e41466b75a4b8328a6eea632670f7a35aedf3e300957e8da8b410c98fde0d1dc43e3aa08269b33320e694b4f25eca1b8024d6278fc6cf4aca0b53d07302c3f87d0a0a1d268585b41fcf2dfe033d19c3fd25ab9170a784739de3eff5bcbd4818bce63116a98e636f5bc6e2aae8bedcde5bce35c0fcbfd535591f0102964b91d79206005587ea61ca1d5cff8f534946364d7735171aa0bd9fcc951457791bdee3c80eb4a30bd1ebdbc12ee32c0dc2a37d23ecc21f94276e219b22a634d571eab448a59078dfa105e0ad08aad2aff3bd94fba4cbf8cd4ed81057ef11609048312e090fd9402579ef57494cc29091d810129afa4a302cc855325ce83f940dac4ae195d849d00df031cd4459885e3ce48b8250e18c441b3366639939f6901358c4ce274165e9403512220be273320ad468c087c91b406114219f00a1d1d5257e4444304aa0b8fb2708c43c0133134880d9604a017e83b4400ced98bb4449fb5ad1b80fa8138814cde6c07e67c834e1f228c4e846b514c59990b59edb4cc6a48c1e7aeeff1a5cb1962fc47f8d23e58b4222dd74b1bb346a5c5e7fac800b9ae5172cb754e331e704b7ea4d134a8be13c5332742ce79f47f21e15583e70cdb268cc0bf29b4a3220acf9ccf6d3712430a34b54f1968d5bd386e5a75964b9945cd3cfb89ef4b3e743e669bc07a61965eb3f8261043877dcde449358519d90e0733bccc8cde9098ebe03e6e0b1a41bb028047b3e9868e4c0b448b2db4763be205d89f95e2bf9650c5fc17c825ac12c319b537e83fa3805363d9b47c619518ca75d91256cdc4afd8cb316da1208b35b61dbf6f89eac053a833bee37bde98f6533eadcbc8351d893e11c85e32781ee26ed5fe6d823fb87a21274bf199f1520208209374185402d5182b2a81a9a271588e2eb8173e2ef03f96db2610503511db9757f6c07a5b0ca3862ff5202f6484eef6f4c716a85e839b02b11775964babf2fe5e8bae8cb38c91bfb487f8ca6bf34d63b1090f02cd98cdee190fe884df4fde817ad8c68cb069ed3c708e09b337b884b4c2c9157e24be6c3e502e7172c7a4ba8fb302f36bd11d8244650e1bef94d7be548dbd59ccc55eb2f6d40b2ea3390b9d33d8d9184dba8e9b0a5050555964e88d304010c6a35d2aa2e6f01a94558c75592b907fc6f82c9c04a1aa71d2bb6e4c8066db22ace1df8d14304a3509809a5efd5466fc0664106f1e911d6204eecfe18a44b7f6a1fc0014b6af3f01ed6e36e8dfde4a52189262090828c08e2c953994d9bacd5d8c134f944903af592fb94cd6540b0e3dc040c6e675125156c3215f6074dd730eab6b1ea9e238b328a2f28d336675f95f8bc0586f8315b32bcd8806ac66af669dec8c8727577a93af0c4f482055913c7f2bf4ac85763482a11dd59255a67fe0b8fcb9a0e451922396c21305adae3a8ca08d9de20e75b5563ed1146e78ccc7f902c541ceb382d045faf7c301da460333b8ccd077976cf59aed8ae75f8d8b8c0230ae6233708f6d03a0d2e95ca77d8614018f9eefa54f39bab0c73b979a08579ca1a04921b61e566773b43f70894ef91cdd27000f7ca1078ac3490222ca4f265ebaafed9d05c1d8bd406cc37159477c4ccec90e76cc6891c9e004e3af655f4a2a2328528098549e043d168c46b743ece8e94ec7797cd32bb61855a9f9261240dbafde331117037c88e4923b4f101c4393b11c5183e75ae23c9985cab1c320023c14e837e6ec5ba907931f91c528a1ceaf1f15e0450a9f1887f3e6f05161d97306e1e3fd77a012ecd025c77c23f9918563f1765007b3deb4a3808462b458406f1b182a2f168b30a8e4d0985219a927c97ae89fe29dc9f9f145b6c51539c815c98d557cde01d5b1a55fd41664fa9ef4f347d570343053045842c028bb3c2257bd0d888fc099109d3f8173c0dbf0c2a63f54a3a08861960603d22db0e9d547f9656b66ad7002cc40ebbeb4a897aabc17711074ac74b6c2a39cc19cfabe474785d0db0befd8b6301ddbb8b225e10b851cb170558361223f95cb1a06a001e0710e734b2d33618ad3fb50a00e323859f3b3f3d39acb2fa69e9fa20498601c41d3eccd79a9184285144321db3c472655c1b16430ac7f3f477348310d40592707ab5362ca77bfc8e8e0240938261dea5b51e1936be86d15ec546b6741bb02a7f2c02f84e42211f99a11b2fb24e6afa348e00bbba1a5c67644442b83437a08dc0cea55732e86409e9d0a00ecb8e63d5a6b41ae8b4c4a387cc069eb459065fe3a0ddc27ce177f30c35c58893855037ac46e81e69f64d65036aea0589f112d5df7309a736091e436c8c436ab7d78ccea01147bef111e8f711d5108776c32cff83587533b619c3ea38bcc5be221950b5e364c970fbfaa1aa774d6b710b8567de204d00b6db2c250ba75cdc61efa2c9851ffd3a83f2c4e99b751b9f5582b2f18ca3f4ccacdf93cf8bafc03f47365becaa738534c1fd2409ba614250c600f67e9c5fcde4a71f5198e273641945d96afdf4efc8cbcaefe62c8237931987bde611ac01c8cdb89c603cbff4728e37c528984041095560aceb56883624745101e72840ddb48c2b500800878a89a7007ea2b0c4056c8d8a16d41d4383b7200d78abfb175b1ce373163dc2fd49b86c7a38f9725000122b3534b6177d489e4476c3594abf088d5ebe3f1820cb135e60dc106dc381270bf225e6d26271a324cfc02a6b9a385c719cd0751f4b68a70a37ff43d06f2d53d0f8204676f433073e5351102c1ae50a5064f9d747d0b2414a0abca0eaeaa96e475925a0b22bc3e12036032166af1591d510be94456b311640681c48e2bb4aa16584da403397f658ba6a188e5bde202a3040c78123b96b433d88622d5dbb4050d8a7afd91b71a1ecca1c5b507006c4c585116c5f0f915ee5ac0b33da68140657e665a15b13d80358b5a323d09abd59546502421456b8672739de6554fda8d9ba3c8bbfd2992ffb5080ed37d74f82ca8a83479ac913f03656736567d73648a62a09dd8fb20c97549567ec652c4d978419246431e4c862c56f89374b47092584b4933b9e3a37653df8356118214e45d727911859a1666709a0a866768a919c6b7f9d14be9f1fcd4c165521956dd5c7aee11115d513bbb2d68425aceb6594a777fafe735b5706232990087a2f13ac3bccab356c287908da53faab829b2f5e48cc0cab976191012bc55cced1efe80d6ff07f7b56df8510237193c6c17c4a4fcad4f2b624332f8a2dde1e45ffed36d9a3243c9c2ca38828763d9c41e9b3763cbe522722bcda31dc4ca155f37875e13a1cb33aeb442521640f9cee068cf57ac507710664cebf527c3e5a36ebb929cbeecfd1c5871a78e56f2bad4869a4968da52a25c5819b4f46da82124888b7c03b6f8e40f5c696ca8b9c4bee281f43e2e789927277198d4239f5457316a0c69afeaa165aaff562622ec08de2a3d7362aadffafbef4b5056defba6b9ec64dc45b9859c150e5a20eefcd5765a235a15fdb25b1a25610c9e0a819857cb43a8de43fae5a0cb4dbea90d153f6817e336ae04b8980cc3a49fb30794a9261ea0018bc5996e0ed0c2d076ed98522898729c89e6c7e6bb63671ad847ff5e67206908093cd1f6d81a944563609aa2a5d7ddb55652ec2024d58e6a18ed0cc847cb950b434cdd1f552c03b26a106a061c358e241606c9111a2fb54f605a3899b05ebcc01970a8b659ce10e19edaca1d904122570ceddcdfd80ce805751e9c40e314106dae6dcfc99ba2e509998d5a3b3474c4d95a049db4f2003decc7d80469e2625e7a59e7c1211f4a1b9c7facb2655825ec6a5ce29e25d84dc3fd8560efc93e256e0118352eea96ddc250112353794ff03d72eb79f96753f073ad48e4291e620389cdd3a1b00d116027b8142218d2184e3703346e641e3afa9e52034d035467e5cd36bdd511bc663fba7422ad34a922622db258e1b0ff213bbebbdea14252699a3e1bd4d9f0cd080860c75f430fb523e83cb0913f9408868a4292878fb39a25ff75b2a1e1220d422abd9a64c3732fe8af434a560b295c6d35212641c66b93b7abdecde36fe941dd080287300522ba6f1b75be209bf5c9ee5153370ad5206b9bdc73324b2f05dfda2c3d1cd3e15099ba148184c4a69c1aeb0f3e2bb9e4d17daebccf99e6300a0197a6acbd561df94dad042ec887f9811623bf70b00fd4436794989e1e79a4d413f215fe447090efc2851fc48fd06f279a8701ed45c3b57e5fcce66fd6d95479503ab60d5bb67f28db5037abc3d0973f9345425d11ccaf14e2c27d42265f8c40b57f9ca88d4f4f500071117daa5d92172e6df97cb52b68a58e0af66689a4298baa1eebe79b714809edc426bf93cfad18deaf5c79dd20c3d2506bb01952cc9f6e85cb93c1233e0db9069872b8adb609f4c8b0d211416436677a789b9c58650cabe94075d8f77cd998964fb15cd002fd8cfd9d25a003951aae13f41cb69d533cb0a048ed8b9bacaaa2ff941af186a61d741b356bc738898229ac56c6543c4640cdb4c069ae31a2457c750e8f9a6f280fd0a1f176b20f2e8e3f399648c66f1457b7f7f634b2b26dfc931ed80f53061d9a50dfb3f2f4aa2a5e720d1786b7805ef5b467f5c16ecab2aad4bd77c82e25d7586999633dddefd1cffd01736e88473c5b6f1099574538d5a7738d6b1cc304539dc008a6ad76e246a951bd86a88d0d32bd6c1c5310a29212f7e11ca1391ab441ae5469bbac713a5065862067fe697b15764acfdd19fb4389548aefc457f27032c6984834cfa2e9d706f6258d474d725a20f22a864f49cdbad164112d7dd79af522e6197a8d1a9e0a4816ecedf400405a656a8d6fc6932ec1f88329d51afa66ac24aef5cf9e61340f4706d8204b2846db1b73d1ea0e03b7e4a5ae3479a0aa03d7d0adc3cb2bfe78148c2f324e5310fc32167f10512a4e3e6f4ed4432362957838a9f14d74cc98b4a1681f98c276618492c310f2291e2b458f159fab3f3833ae869fbe91b39985403f86ab1d9220ab6b85caa6f2650f49c6735f560bab920dcfd2646d83475eb3e077221100c84d6790786f6a21228ed03f12cd977cfc3f9248b53a155a3886954bb0aa03d34d92e26bd235194bba6280e3a7f3484cc2841e27a2542942021569acd84d7a5d418fae89fe68f88256014c5e049e4cc4770e56105887dc1c7a86ca1fe539f5efb0121e47b58385cb3f3cbfbc4abbdbc4e91c0820ff610f2902ff188dac89eaea2d7a31c3ce29b909c204735c736872cedd879806a2bf27e9a3a41ae7caed4f90f5f6b6d1922d6592295d0ef00d000fa74725f1bebbfe8f85512cd15bb74d3a78e4e72d2751b76f37297233781ce4657d6f59de775e182eb13fc37f477c2dab93e0b7a305bdefee5f7192d377acd3cfec376b8602c324dedff1bff7581e26b16f2249fba8f0075ffbf7efa902f72f0ff6f9cfebdcba141454f183145d9288420bc25808ac2e98ebc4ca5bf8bb071e45145c740085194cb1842dec037cc7b29af45107f6ebf66f78a4490be67625f0b77fad13201450d084329d17d24dac8bc394873faa0755a83f791e089e7e428cc14fd18c28eca14014ca031fe58148502fc4432d2e1ec41310fd6bbcc036a66cb9de87ed191849de9ae2ad2ab766694bd2161a5c7ce78452ba1e06c118321e63ce0be9364e178b0d168ac4a00782f75eae0be74413de72bc459ccdee3de2fa8e0dfc4d7aa382b8963c538335c3648defa371e369dcb0a81bacef67cc907283068dafc19aa1aa90345ec85dd1e8505cf8e385a71a0f3e88ef57c3060fe47d0cde8bb778d8c3d7f3700dbcc5310d63d01b3906884a388f8b0f97b0f098fee0ff014110630ff585d7fb401b2fc43d1b2c0f75f21e3cb16622794118e4fd7e066b8622ef8c19bf5aad1ea4c13ad5b0610cb8061e3f95d7248d197f5fc85db17a868c8b0545c2f0241734637b4b54a5a490e065994e56098376c9036d10a00983d756b138a607b1c92a79cbf4971504fec1f731c617775e7ab052448e860dc0279640865cdd08435a2ac87e62094e20417b599e145f22ddc33ff74b3d07a35ba562d1a0dec50a3481a7cbea93c913bde518e3d388576f31b8fa136b85df84c9ac6ed0a8f23e342c1632f8c6f79fc0bfe1cf0dd722c58c6f61b9122c6fc2bbb83be1355010c1774ebf833d5cf256d8cd7025ec346e8d1b061c67b8c6384391e06a9cc120c171460bad9c58a1920963102f19bb292326d32d21ce5ccb9de28af11d1b6098301472675248d6c9b5f4abfd8ab7b0f811ed4b7d040e7fc07055e36bfc0c04b90888a6074de3cd491be3eaa4962aef43e39f80f8f14ae271869fb622418c4156dbc0644ea71bfe981e34996c8c356ad4a8710abb26444ce6fb6eb8c449d383a7f4e7f4a2e9c45a79ab3b9417b6b7ac89c6af4edfe1cf8a06ebb4024d2cf0572cd6699c391612371eb328e32d7fce03a23f6ef7fff0512ede65b0660ee6c54a64cd60a852a811f458337caf8731e856c0932b9d4c7e59bee4562c0e9e4921bdcfebde831126e9765490b734e3da6041a342d66c45862afb1d4723a2ac901b4a114de112eeada36c87342fc4395688e242311cbdd329fc3089ea4f8fa3882bf1455fe29c1b43d538b3e17fa1111c7e7fbb92155f12c39f9063b55da17e75798eac64fc8b079f267c57b23f54a15f21bf0f5f883fa7f299f558335f3a9d1efbe9345a7b3a7d873158558ee7348f7af18f5c9ea15be3bf1a658ce1db7186247cfbe15bee5d4994f128f11b9fd83f85e16a062afc1926c54e8629cad72b6fe44c2817ee45a552a9543427d4683fe7f2ac628c2f4657121fb3faf2b8f89f7d472e8f8b71e88eae0a9f267c8b8a8146f5a85035da40fdf7e20f5d1ed1fe67432334279a8fa27a57b9ca94a21967aa14d145944aa552b9950f253acf7dab7af0ed9852fde933dd500018654319a490347f7af13d8ce1f422929338b6b7c47116fef7586419119f7b4ea4119f7bee454f153eea55a990b622c1d1ad589cfba05bb13fac2f911fe6f065d9548c2e7f3aa1def4f83fdfa1a16cf79c29346113eaf1698667a8204e412805a1aa8242a1be300c8308c3d106113ef760db204294b7eeaafb8088faf041cf5a93352da19482a812849213246895ba0f8856e97613f8ecc7323da89aa1c8f0f4f7041a39d95314f29e4623a7ef1e87484edf8d34f2bee7423cb4627156de8792f259079345ecc40f95c4f08a182eb9d28baef42b95a74295a85279ca5722195a09ad8456422b5916c025540a9742a5f04ab8e44aab952bb9d20a7f28d261ac3e55eafbbed4f721abb10883fc5cfc54295f8556422bd7b30097702905830b969488c595520ffeccb960b93ca17fc8c2aa7126c220ddeb54aa7186223d0586ac952bb9d26ae54aab556825b4125ae14236005c8a2c2f5e844ae1951763b8145a79f1a1d28bf0ca8b70c995fe852bfdca85f833172f6e7c2e30cd2ab4125a09ad64112d07c5182c478c5c3ed4873a5914136044181d105797c78201b302b35a8181419829c45c316629540aad34c1a50b9726ba7069e570e0c6e3b069e58456c22b1d13e2eac6e3b069e57040fcdeae6e3c0e9b564e0b0c1818ac6ed8845642a515182ce4ccc1d40003c60a0a5402b37acbe534ae422b63504a60f71ca7e25e65ef673a810fa2dea4528dd704be09a50adf640a416f168657157e2a35863615a6b00af5a9ef94831fb250415c4f59fc032d61b478d182454b155207d95f3030c50cdbb7a3f78ebaa329895f93c9e4f5e9823f0b8d3c71d3173efebeef1b69524fc36aaf498d334ca65cf5a22a157ee0f899c69994bedcdf15378ab88a3263c816c8fe72812ee4970b6c217790fd25892cb290dd7b4dde9e617275f2897d6e6c6fecf0c7fb0e61d4387dbb674abadd77e098a57bf7995dba3ce2771fbe88c9f03b150b4586e3ec43b1da6bc0ef587e1aef9b460f8dcca43cb9e3ccae9ead72c719f6c627f6bbe7ba118f33fbf76639e18eca170c4041e620fb0b06b07cd99205698720fb8b963124a8fa6c38e859eb7d0af5296b7a7b72c1bd1127c317e252c84fbdea51ac192651a97761df45ea512e1e358ae30ca544a63a511c5dfc283e0d0deac5ee2dcd37ce30e9b950e1efd48be3ec234fefbd2a35626f7d286fd9d338ebde64c3ff1b47acb2dc04ac921dfb65936ca031ea6451e3d580f8c4f4dc8752429c89e2fd8fb4e2898b6dc27671eb84170b85ef74e34c8ad799469bc55b374b12bec36df19d6f039cbdcdd9b1fb2dde6940b4e44ccc80f8bd1561ac6ee0f8560c2039b3e4ecf40503559e8beff4170c24d91055c5e2701c9e39179be5d6dc4705617fd87126c59ec67166ab7069824853a598de66f9ba9305b1384211a92f471071042d261509f00ec031dd320215607704223aae6b1de4708404a0301450b7c3410e474001e500840fc886304140617490c3182f0c50d089ec278ec0c584839b83c4beff6a25055b5b44989c1c2e0ee26c725adee2c2e82007ccd958cbc37738dcba453220da6fd900057155f41067dfd730b0ddc79e01dc217ede7220c4bf2ccb91357a88b316992ce40c07e92b8bc3ff06aa4c0b6263900571e56ec700882e04c42136eeba0e002277646415b1e48b34e00a62631552b861439cb24453799fcf7bb80ec7715cc8755444fc2871ca1298fb11c45aee83a23d027e8700f1247a3f6509ee1fc7c7c4d44d11bf14c02296f46c702cdb4830892f899f6beba316fbd8da2040cf365680d8897d6b6c14b1a41d3fef3b2a62f7383c0ee3cf77ec8ebfe5461b782c6239b202d8768b7b2bc57770d3143b2ed17d0dfc6077c31f8c2dee7620efe3b01bbd91e0182e471a2009f7de38dc73b83b4037a6ddaf1fd9b8ebbc6eb47dc3f570b5d817e23709f08adc73dc95622d0da08b5396f01568bf71b0a0b83efe0d83b42b6fd9f71dd40c063913510ee821ce5aee45024d90fe36cee33eceb224c7ba7185ec2d9ca0010b18e1074838210b9f46d1a0bc855b025a2c793f00e215685045ca152666300311dc200b1848800807885fc0bc6004099618c10d764046050d1022d5046922fb091e60e165b62a028b2b6e2d16537600851d28c13ac10b05aa9c21bd64e981972c4ff092250b2f4c2c91ed858924d205d95e38300412544d5962092f36916cd68ac953f358416c7a7ba3bb65e8233dda6041fb20d864e31dcbbd65d9707ace5b4650e40c0441d0f41ecbf4f5e4bc0d0e6f591bbcd516c738ebb7c15bfee0cfec0379cb06dbffc48e3604cd7a7c2b44ffcf07d22d105140fdacb5403da19540fad3ec0f1816c777bc6f2390ce83dfdf89cc774cef7d04b2fbcffeb0572c8ec502c3feb047581cbbf4a1505848d702de407510c8212cd5d02d7f2f07a4fb80f4b77d65d6589058ec8f1b90fe4fde22d12f1aec113d701cb02c07e43b76d6ffbd0d8bf47bdfe4294c77eb1b57dee281ec1e6f04d500d928c4d9eab3f460a538a7fa8057c57f4e0e8f1e20fda2099c80a0213441053f88514111587cf0103ffc60058a05281fa4c8117b7278e49868b200020158088c5bf821073f0081470f902f409c804c91fd05082ea00ac06e8a58437c61c9c6477cc1b264bbb1247d818019945b0b013210c0e28a2f4528f1050b1457cc172c4d903314f9054b07c822b28034563364747ff78b41cedcb13b86f1c2058da84a8528f064fabc8ec3d76d7bbb778d1a29f1ca294ce75d8771bbf707c6abd25e157cddb69fc2d8ae518ebd65410fd5a1b5a82efcf94edf07c35bee71237e93f7733ab9f5c66e0e25aebafbbb176b0182aaeeeb6fadb5d671163c60212d0f59c83b629f0282e0ec9a21bbad7bf7cd45d93362f7597fda35c39272ad7f60a971dfdc8fc2a514fb893059c8991786a379614818e04fecc7b41579efca052f5e5861c60a32e267bb8d08f3a99ef8128132d8881260115c7cef12e6d2dee26e6085186bc6082d6eed1723923e23b22461bb3fa5cf0a1558b7d6afbb1528c020b06203e48ac3d88a2c5cc771aa212ccb8a29e4eaf3bc2ab2a882cc521562aa60c167fa3e0fcca7f4a14a603a994c556ce0049e4e3809339d14e20cb29fa842081005824f5441a58a1f4817a958022a44a170d28a0a2cc2541896a1420ca602cc47050952aa548a0a2da41df35171844a54a9a850faa6d8429c4209342e68684c51a03e21b810e3e2850b174f4c11c5135338f102c68b17282ea829b27c532c4da18027a4280303150346a8833d63b92bc5186c032c0514e4bd2c299a90620bf984145962c88811438aa54bf613522861b29f90a2cac3c842c60c19327a00d6a09302d360053350ab1933ae9c9cc8512289276870e5091a287d67c0158dd54a461068d4a04123c614356cd4a8f1c40ca0c04fcc0004e4ca5b369e988105da468d1ba9ee9b1e6f4a90039b455b6bad756bad75d40dfbdccb2ccddd31c61c57a5ebaa785e95cffbbecf851420b6edde472cc900118bedd72df60e984c9fc9143e74f4e8e0d1b1a3a3870e1e3a76e8d0a14347478e0e1f3a3d3a3c3a3b3a3d7478e8ecd0d1a1a3a393a3e323a72787276727a7470e8f9c1d393a72747272725e35d71bd1bf6a66d9fa2f3576de50a22f427fbda1dd2d01b775f7b7e840bd9a349bfa436b39e4e5cc68d14aa0bb63b4e8abee2839769a4f2ba1a0b59c7677d8cdc5609f882a23ba5b468b3601ddeda2457bc50baf9aad3f33ed817c26fa18ed86cad4af8165286aea8aa1359cb5569453148643c4a3a8ec2182e9e8e84104db9179720f0f5151118f1e3c3d652682e5e410f9c821e22182ede881035bd55b8aa3a6aeb556d4fed3ddab16edd7dd4774b7edee4ed134cd7f961fcb677a5b73fa276aaee57ae65aa6d96ae6af6699ae6f749aeb5ad652b4e8cbee36a2bb23d0dd45e0eec6d2dd2fbaad93ee8ea145fb6aea8265284247658a034b551c184aa395384869991299b4eee6ba7decee1b2db60d862954800004464c33bc2851238216f000848313041545c1230828da4f8bf5839e302f8e3ed713b01041094d0149987ac69a09e88479412308d7b5a94470c030ab82000b7c527808b880ed252989eceb5dc480e07df08edda4946b0500f6dbccbced370aba65b5146b77c0eff29c9e872955de87e381871efceff7601f7f0fa6ffbe471ea8bc0f37f2d08369acf23eb687eebfd11b7be8ec732310aafe1e3a7b5a1615fcf69d35a50a154bc57e97c7abe02955f0b8840e305059420718c8275596d00106f2be0eed85bc36303105132b20574800bbbbfbbb876a87683187fba639af4b8e24dbf5e5c1d884393cf36ab6e06ab4e830c6230c480f437a60bc2eb7c6df1bd30d419c7962bc2becfb7b633c31165bdc1f0ae442360038cc753981dfb0ab31137e8d16618e29a12a47922af5dfe5a1f9145e57ac7a1a560aecb8bf1e82355bd46c51b3c5f594e3284e35666ab4c89154a3458e29399230f6662d30aaeec3a713f8370cd99d5e9c9d5423ed8a49a5c213eaf4e0699c996ab6a8d9c23361ee0858146bccd46891638a58b3458d19f16bb410734c115de448c264f72e6868c6998bd98a69dec5c360f5a54989355bd46c51b3c51da372ae0ad838665e994b845bc68ea622e014caa6503e109f98bc3046106797cce5f1c278612e192f8ce83b5e9830be13fe27c67752578cf17ae09161a1fefbaf468bd064aa3153b3c5e841e12d2fdeba9e170f0a0f4c118870cd24d56cf179607c202611e192f1728950e666e13b384cca91f47d5e182f8c37c525738970b5a8d1a2c60c1994e9c4b2a66fb4974ccd165e991e5c8a774131297bbd334d71378520f737e5e3cc7e8a158e36546ca8d850b9770c78bbeefb3ecfce56530762d0f47d3654441c021a94cd140fdb50b1a13205db28619b2a268fe63dbc9a52e2987afc36546ca8d850c14945808d63f679c16fa78ca7206094c9a23ed30fc427a72f8b10c4a50f2f99be6f8befa094e0f235e13b5d58534e6f9374e2c6efcab7f461f996be2b1f16b00b02676f735b6ca8d8289d3e2cdd0f3a32a2f7f65b32fd4ef7a74f02bc5b6ca8581c703c9db27c59be249678ac4f1236542c4e6733c526092fd95099a952ac1d6da87c427c4964876d926ca6609b2a1f4e6ac26a3a9dbed56432996ca8d850b1a1b2721f7cde37abc64c8d169e97238974af7377d1431f67a7377dc784fb9e377e5eeac12b86fc5e35a35d31e0a3c071b662f29bad98bc3f6b81b962c8ef671fc62d30f78a21ed7f63cd16355bd46c51b385c72161003344c055c81683935ed0e83ae0ad2630011733a894f1945ec8c066f01783e338cee380e0beeb1101460e522f5a10c3450952344830811291b8c04985c411a61412546484488881d2810b308cea24810cc43049e088f09380102acf24841a35a0f14263cbca8810c8863041406174f085010a6a01a00320bee2b31f4d5bd18832e490b8ba41d32f4b7ee21723c6bc3bc0d660051552b861a3068dd50c193160bc704123aa52210a3c99bc0ef8132f5cd03801bc17f78d2a15a2c093e9f33a0e5fb7a5d85fae5cc1c2438421dd41f7eefb1bcdba2498624d692f3313093e262fd9e037cb933a04711452a9d403a1e2418a4fea410e95624d113b6c8eeb514beac30e0adf4b205329d40bf1be82c42fe44e600c697a1bfe74d3a0bc65329964908202b2db66c6fd7dfb9c89d55780dfac4ba6c2243288e0830f5e54c81adb0824c8a14256278104af37c6b6ab919a1d91601624f8b14ee09836ead7ee34cefa4395c13ac0407edd87e9da91a8c763c81e755881d40106d276a7b1dbe6bbd79bf9df915c6116cabf23f4370eb00572d623cd5b345bbfd21c524bf7521a09418fffc3df8ddc3885ca8d0ff7555ef8e0a7f90e0c72462369def2cf21673080a67044e2ac89c043f7ab5b23c5a7977084082620022e6392927c38d6142aeee37d95203ef8395695203e3c2c11849f071bc4f0b04490f7dcc8c3111e9608e21e8f3cb46e8d83692624a0055a8a60030dec8006dd12c4f691e20018980009249e10e30125f8b44ff73e9895843760c5023f54c0043e53a8dcf8e0aff2828615ce9cf1c12d90fe1dc66315ec839f1ba75001e283bf0af6e1b8e7cab87b46b4bd230c6fd95fad6e8d090b1089aadb5afca63782df649fc3d74d636804bf8f7e71636febdf6fc4bf2daa7bee83bae7bc6e1cdbdabee99742ded008c630380ec481e3c68d3b8e3682bae79e490776ddc9ddc81dbbf0c7472fbca311246ecf9026772377ecf7372285f442f74015eaa24ea6cf3b8b4d29bff79404aab807551cd775defb2df39121e3cf5df1864630fe3c6b2dd979dc7b5cf78d69f4c6ee1bfffb419f8f08f8a49078768d74a3167f6ed482c59c61390eb9116585b5d65afbf9181fe3eededd72b9cb5dee729dcf2d53067398c31ce773bf4b170e77491d777d2e37bacf7df04371acce0ad3832a1b48bae7de92524810e4462d77fc8c78df3dc7a47dce9003b03e78bc62ae985be323c55e1c4eb16d9d68c2baf524bc23fcfa8d805204a614914567040ee322c690abceebba22ae3839c176c3e0fb41114edc1be0c009452c7d4554c16206633142378d63f9016969fc06244b8ab53f58c4b8b558c06051a202b88a7577777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777f75ba5cab52f5ce1b37befbdf7de7befbdf7de7befbd66fc0a50065605579cc0f75e514410388caf74e1d2711ea7006bbbbf5c99805b7b05027edd1b70650157a870185ff181882b88d8e20b1144f0ae7c5340c19de0968008100c810825dc5a228ec0442c5d772292b2b0d676eb60cfe00e1bd0832938cc35008a06785935a009aee3b80624b16ac095ceebbc064cb1597c196208a4e3f03ecf1b220c14a6ef1ba2892f437021610c9165882ba924c0ae055f8698b21485cf2900368e998d3224eafb41140b9c71af9924f28efd2896fbcc307379ee278aa771c637ce9eac9105bc662e8f67e6d698fefb44d1cc35b90fd8be8322bf779fee970d995c1ff03d33974755e6d698deb4f2cc90261338ce00736b4c2fc45565aea97b6beaba6bfa1765b090a6bf5088b3196648d3cf5e94214da01633cccc402dba088a6c6f99c68e09e2375a33b31961487f0e8fa8cf4699ee09707697987c3e7d6bc4781632968b99f6a29a7d23cb5333a400b07e859b9aedc0c20a2aa47003a7660668e1868d1a34565c6ac643ab4bcd0e50e381393e1772a4ec4bb1160701368ebbd38373e342cd8e8fdcf1fac89748be828cdf9727008fe3fbf2b4f02cb49ef63208c0cb91314fbec9bb5d21051bef961cf2f3d6cbe5a9f1762503c6db3197c7c8db8f54f2ad442467f8c819be67887d373c01be2f0ff7f6c55b9af0fff45d1e1cdee6f04e0a507ea2b85afdb76cef18a05b9ebfa188abf56d52cb26e590616ca3fd3ed1d6bcd0c68fbc49fe3e3a175176938c8adc27b3b4c0f0b2cbe3638e28a25bad160200809fad324b8b901fba3c37e96eb93549748b02dd5aba5db86496162437cc6dc18501eb7db652814990911aff347e26cef8d9ea22e166d1adccd272c3cb2ecf1d43467c178f8fc04574ebc5a7ac4f6669c1e1878ee06e75abb512c5ccd242f4472e8f5d528055b2e1b64c6083c92c2d3c7fe4f2f8787f9b3f90af727cf78e67d12d7724742bcce5f131d68c9309b32456b935378c3573c558337ec770b9fed7ccd225936549e4b2e4586e0dce2c13e9632e0f8f1eefef652e0f8f8f1f552e0f90f7bf4b97e785cb038390f7bf5b2e97cb43e4f21479ffebe5f2184112c39277a0f7bf652e0f93f7bf662e4fd03b0def8fabe0a5cb63c3e5b9e1fdfb5b5581c56044acefd6b4981c461c0830da50c30c6393118895448618048084d5b7e6c86884c5650b0cacbe3541c6998b01c27a8d33f7d233ce2e969db107eb265d2f37cbdd72b9dc2e2c8c01180130b2585ec5971c0b8dd50c19b706c638b362fad6d08c335b4535ceec12cef2a287ebd77d006395b62c7042db6e3130b06ead0bfcba930173f1bd2bc01cc666a0e03a8efbe2755d7b692b4e18019a42fb85f65b077be68e77498c672163a6bd5851e2b3b2a5bf140c25b07b62c56dc799896c7b258823c856ca42690af20a91841264ffcc92412891de0b3185b48f7b40deb74a5090de5b283a78a4fd3b33fdf4ed15fcefbb4fc2b1302a4ce2a1442801281a94694425cd2ca1902baa84768b6519acc98a2a218d4e53b6a2a0bb4fd0dd9f09badb89ee2e0109ba7b04dddda5bb45d0dd21e86e1074771337c89a8dd272fd175ef8f406f33335ad27a8906aba6ad4e7a146e86dd4160b3cbc4d9a6367565b48f989101291900c96965915424acbd3247299babd0737d46c0d45289adafeff4ff361bfaaa8cc36e90fe4180a7bd91de59fe667d8893e12ed443f96d73266bb7d26fa55bdd5be5c4b2234ac598d9d5915426337359677305354b6de4aa115569eb9bb05d0edaf8e651dfe47b99631743d67a7f92a5279442b6b655adace5bd1f3ecd8a163aa486a27a0bb73b4582bd3ac474a3394fca7f9eb99d59cda3e133dbabe1acbf9fc2fd73226b466554d5d679ad7b5b4e1a4abdadd2c4e08c7a36f0cba7b498b36568db4428b35bab4dac4e83455d54cd2dd1e40b296361ca435c795e3d2b9418b4ef326d34a988ab343470f2cfb208af9f0a1630706cb3a373514e622bac956d308295d55d328a7dd46dd1dd4620d547777a0bb311635cd6691b99e3966feaade98bcba9eb96694d597ada5ed6934f2f5dae9a1e34877dfebaf661bd22a44e386283937158d52d6846cb55466a4d6f25ac6ccd8590ad56e6794b2b69e371486043bf34d879c16c5d2f2c876138a52d682c8d4f2489a896a37254f6028cd07a9a4e598d02d86c25e2f357599b652a8a69647383d884a221f3b3a383d59479979e41e311e1d453d3b7278dcac68ac7c42436d3cba6768714696eee652ae65ecd79bed346139860e39451d86c0447773a0bb973873e6cc99ee6eb4e8449263656a649b61554b19ccd53c91ec60d2cad32cf28344b3d9c828652d96a1a459cd6910a134dba2943598a99e66ba46c94f60288d4828ab25d10a2b6d3574c8eb05cb31141644c78e1b90340345296b41809ca8b9da96d0ca155d85a29435a3d34cd726af97904d4d33906a3520c6b0e91596d31485fd8a9e9fd3f2d5a34fbfc8fc585e61d91625bf6afe6759d0ff18124a51a1a197ade6d1c7b24c354fb3e87dd4d4a5ae66cda475b71276951999b9062222b966aee78d09528aae65ec2c93d0ca34db96d0ca5a8a2a51d5923644452a8150256a2680db5e5354a63e8aae32b594fd2bab698692d33f91a8a94ba696321c9c9da21d1e3b787ae0e8e828737876c078c476ece0d19393796ef25aa6ab4a745371d4f5863e8165190c67358d70720d95dda0466909c391a9a5ecf55a53d466bba942b956a645228c0e7477accc69ce45422a526953d59206cbab991e050962aba54780d8ca2439a7413eb4723dd11dcc1495c54c5a0925c88924d784624d5eaf6ca6ab904dcd6bb9c6d2f2e83c428918a9b5b5145acfacae674eb3ec34d50cc55ccd9a99c6ca2c1382e95013d2a116abd1b1e3f6363a76dc5a79075315cab77cd341289683d4c4b251cc4c89c8b7892129d312a805049669506142e66996b221b9bb37d0dd1ac83114968914a1680ab49e5925227f6cb5f448941c3b91a86a4e8d4e24b65a7a24ef6036c9b77c1b800cb69636d5248254d2329358998fc07448a2438d88915974a2435694d6443593ac28caa4bbb7c840cbe759ca86d86ae9115528afe5aa0a2195b49cbe5eb5bcaa48aad069963258999636a135d368a54d48bdd16eb51b6c4565aaad3c9be4b55c9b189da651a9aa39090278d025002a04c850046b29d4e1000934d1c44d12560f58c9808a0c10e981064141bc9083aebbb560e04cb72b96d7d5acd550d8139ec04aa28f651a0d4d3f13fd59c27e2d652bac54cf325dffcc36f45125dd7dd34da445b48a6bcdaab99ab4f24cf31a253fed445313caf9d3dd17103a8d4c5a29947730d5f586229532747712a7b9aa39f632d85ad6321afb9a56ceb0f486aa2eb428fa1071b40add9f8b8f86aa4c77e3607fe043e7837c9ade60397238d5d89c5aad03fc01badb02dd5d81eea6c0c9a6bbb374f704ba1b89eec6dd584e06f8b77903bc9aba5219ac966b387d438f9abad434c768e68d0867ad1575ef6075b70ed5d7ddffff6fd3420baf2b4421c6e4208583feb5fc587e0233cfd2b6de92a4689afe1ca1698afafc6b68e85f279ba1a17fad4599f67f1aaa59654666fabf16655a6be85fb14c33cba234ab6ad9ddb7c5d402502da6a4a46add4da3c55450f70b2fa8e60fbdd1699e5976f435ff02906fbd00e44fd32813a9a9ab5ccb9850770ddd31747797491a6aafe6356eaf391aebb5ca72326cca7e3a304fdf2b5805cfbf8fc3d7daf6b603c030d8f67e70ed6dadbd7ec45acfbab5b7dbc1ad5bcf6530b1b6b35ebb0d5dd7bbae757a8bddf192c5d6fac92ec1ada9398bfd666b676ead7f33b80db7de61b743706b3bb703b033acbdfea580bb5ecacab036c6776d16dbb9b57e85ace3938987a36c90cf7238ee8f3bd6b93daa1dcb052cc21bb75fc0e2dbc29cdbdb9c032c16b6bd45516cdb165bb746b09fe7b0d639f76bed0e8b633f8b7277ef86d816dcb1db9ceb02697c2cd8d0450d8780e59c86c5f6da7620ff93c5ed66d73f6485b8cd4a816dcebe56e0d776167b36b4178bfbf7bab6e75a77fc8e32b52c67ad978361a0c9b17eea3eb7d65acfda9775bfc1edacc9f18562473fba37d604bafd3ceb425c054fe1a670fbb655d9cedd8658bcd869b8bbed2c2eb2261c16e4dc7236c563adb5d6860ba0034d6e893e94e77600f6b3f6bac5f6884dc17df80d07dd73ce5eebd641f7b0bddcf561af6d599345596b7f5815fc743dfb61ebd6beaced64380c8bdd72d8fa70d05e57c1deeb8e1d5b1feeb6869facc97ed8adb52f9b829fbc6bf187adb53c6f5547d705ce5e6bb278654da61788830d152c00b075efdccb568c91031eb1d6ad5b6b6fda6b5b777790ee66d2ddad16432e33a0c09699c1d51fb403326182288005119a943bc819c00ec63410cb06bd640733c84b584e48400905d0254aca5919015040052514296fe4f860ad707a7690da004f19e2d8a1c0c9ee94360a3dc69c41a247962dfa660c1454b019b3c56d863080ba902527870b6f730415c63c4a852c335c74961739f41037443f06a2fb76c7cebc96af8a279f934daba92bd388caf534531b4e8ea130f3bc75534e017841528d175e93e7d13079dcbd3150413e2819bf5677fa7a300a06ca23006abde10d3f31404420a94bb967c236610a3d1c483ad1808a619b940fcec3063703b61d902f492fc840840608c7272c438d15498d00cbbd6c3e38ae716fa8487201080131543e08b8467c4840120d530d281811482a32e3fcd41313928688103dd30db92758014a3e7c98e6eaace043132a60ca51c594cf0c04520e7242683c1f38868c03971f5e70ad5391130b438e73783e7e1801058cfc300306e04c7122082892c05b911140843a5456044934767c38793ebad397ba3c488cdc144e453c1f7ca4d0e43b62e3a7c8c97404d52406c44b92886d764e9e8f176177027fc6026020e9f41d5181680149dc1539db0da03b713fba1c240ce0cdd4c277a43b79345243542a6025a619306ed090e36b2961c2820fa7cfe5ed0877f02001f250d8abc1bdee8e09855b78219ec93b611c2e06dc23c472362e8b939163fa60d70796a4ef24c3c4e3c3529205797c2d8c03e3e8349094238589702e702a9870e01b2a9d9bc20f492e1c7b8bee0dbe9c01c60210819e304062820361bc70614203490421e50051d42745193654002737d840c30c4d806410c09157cf8e160b0100c0e315a800862001186bd0f0b2c400065a3030801f185e29c440811d144e9060892d5a92b00005b2486086560b464480e886231841086d0003cca2203f4ede962196784c351093812d2f1f3b336080a7cfbb614304217092634b94080049911f24ac2820012ec6f43001131cd080941a68e0d959c1c03308a3041a82bcb063f2ba0920810403962809f2a3059485823fc19de0667099378293f11d7063ac0ddc0aafc244056a0a9f813be14feecce2f852e06e84347c86c7b030685e702e9cc68a38e5207772d3f739b6d7daaebb6b84aa6be39e20090b918465e872b4a288351f682e90c471288f051bf88029a08367a092d84017441296c124e374630544928900f886ab02b876a8afc8d7d39d6e4f8e17247d5d926038f1c1c4738598724323a07490c49d49e25035aa4842ad371f4832ad52eefde070b82b5562803420f003564a52b1c4bf373438df8ae6cc0f9c0b5f8f07e4aa2e906fbd3758061858dda95322e9825d0d6c03ea5c8b51d8e6548473c1234057a33b7533140c140cd30c308647801b851fba1a97cb0f1c98a400cc70ed850290027ea1541d0db6f7e60ec140610ccfbd1a3c91eb3c9afbe262a46c075e0ea3eebd7ebdfb5dd3e906bede0c9e0b15d089c6eb3c7b3dcc03e360fbd1b86392c0568f0d24a594f081a6c3363e223f601dfc300a7d9fd9020835103383302d0073336a72668b21967e7c607881073d8f60049c1644d5e7e170c312256764f084971518908305024222a0032ba260010a44c084161c170b42380fb8ad0c50d32520a1cc15544ca1021048e9a1004e6eb06189122345565061868c273851022638d0c3018452b8819e2ba8523ac8810eb530e9cc164d6082131c66c8a0b182052b7802052208410718604501420520400d4b94208942062b888109b01cb9810da290010b54808213602089052000082494b1820a149cc0090f4c49ca31243f3461191ff440072d50410948d04406861022c76a40f25343134621831648c08821a6e458010480a4c8cf8f572ac4ed831e44210317aca0042468a2031968809529390800c90b3f5e3c3c746a5cd0e03ee3831ee4c0052d58810a4a40820e64a001435811620a162010cac1090c382e2da020430caa140e52b8b1a4b4001b6ac8a980100b408ab2449fba3b002d9a98d0a633770b1c050e0afe846f0358039e01d76275b8cecdb12ef0c66dae0bf765ac6053f01b5e8d4bc357dc0c2bc3f4c2858b2b625598124318281ae08d138de9fb3aef761dc75ddb6aeaaaddceb45c553cd4dd30ba3b77b78d1671daed7275b7b78881f4d017a15ff36a5e91885aff3966aaa7f9aaf9abf93f90d2322d65b02f7f45cf57cd5f9188ba16f14d777f2de20074370b2dde33a110c4f007dd9d6a3114734310e113ba1b6cf166d139b85c2e1c5eb61a9d99f645e8679849533f458b6267fe6c749669778f2d5e5a778b2d5e27dd3e7cf4f8e0f1b1e3a3870f1e3e76f8d0e143c7478e0f1f3d3d3d3c3d3b3d3d7a78f4ece8d1d1a3d393d3e383a78787876787a7070f0f9e1d3c3a78747872787cecf4ecf0ecececf4d8e1b1b36347c78ece4ece8e8f1e3d3d787aecf4e8d183478f1d3d74f4d0e991d3c3078f1e1e3c3c7678f4e0c183c70e1e3a78e8f0c8e1e16347cf0e9e1d3b3b7aece0b163c70e1d3b7476e4ec085084d6ac0e7dec348b8674929cde686659d443ba817cfb682ee55ac616d0dd515adc01869abad628b99da39965d14f774fd147b0a0133a0b3575c5cefc0456129da60c56d66e622d66ecca4c328d66c6709495e4183aa449ac05311b1a89884654ae6769a62594cf273a24d6403d3d9a349141759d66293bd72765edd1f5d31c4bd13fcd4789ca3f42cf27259377c1b24dfd18d29a661b9ada7eece9a1aaa36af6e869d2e46379cdb1168cbceb2c612a5ab3aaa9794b6dbfaa3946435b6fcbf949ed93bcab76ab9951cadae77fa92cfcbb64b2a19ccad6574fb35c6b5a9f555a59e45d433a76dc86866e695011fa43b9569eb06c5387deb5aa28ed33d17f363232d3f57c743d51d8d0907a9be5a32f323fabb71296897ea8c6e6f50a6a0d7db621a939cd6bce456a09fbd3aca9e659ca60b9062bd33543c9b49b556664d25e4569307355cdd3aca579cd311566da4820195d6119ca9735396dfd9749deb5aa26ed878204011952cb9c7e263ad30c259faf9ab17c7b24da6ac24c5a2daf66cc95e658996536aefcaea1a14722fa35377957cd6a3eba7e14b505d556d65aff2e35cbd4525626b1596f365a59f3a7a9d2ca150d7a17112445a789a6f9861355926ba51258b6353991a0416a2c6725b06c6b02438386103951259c111c110408d3dd5c64a5aade5025ffaa69957f03126eb0a2bba5e897adccb2d7d010941f1a5af2ae9a1cabccc8ace568bd4a2bcf57735ad26039f6cf802e47c812012cd4d4457403ed06176ec0d1dd4666edd1f311700416ea0d01a6348d661609d9545568bda15915a2d1cc2742b2d53c12d2e1d2d171e5dc9c47684a24534b19cc869e239456946628b0d256c2fe656a79c46de03ef015d0c095559406fb286bbead67999646ff3614adc17472a9b17c669306fb1355cb9ca66811d3c9a5aa2551f9242d6b32d899893e458bcea2a795262cdb4c2a66908f90d09cd6100601b51edd82b628eb24a7dbfed8155ee86e2674f3402cfaba3b8c151d86030d02a220fa891428badb033278208abcd6a8eb99a1e0f059166432994e331499b51874d42693e9e432994ca71a9cac9644d928966947e8f904e7cc382a0c8de140c93117ce4bb5adabac95838ac3d7d055bd0d31994ca7ee465b6c12a665d0dd316815e7475b1b17daa21a0aaa90d169a69d9582bba67566da0b403e66d652452d32e9d2dd308012cb3afccd4933cb1f27fa44b55b0afbf2d52c536fb6cf31f41442d7d3148a9d19a6e658bee9906342b00c05473d51f3bbe9ee02b43880245ac7e7785b09138ad1d07fe185af69d94a98ab8896d51d1d57cecd8aa2a90d0b3d65002b3575e98082034bd51a2c8a90cdbf6cfe2594665aec2c65423638ff8ae5d8792bca298e7aa3d9d2dbbf5633965398d0690ad56051804220224043806a808e808c809c00b174ec98010d8a759b20cba0d268a43a24cd4064b99644981c6525ab5acab0aaa50c6a0db65a7a44a6964732cd66a6416850cc564b8fa8ab5aca00b321c7d0214d62269113fd5962ab1161a2a62eb32d0e0cf0412da27fc432d123d188caf556ab99aba99a45660cadfda09566ba7e917943cd22f46de8ba9a51728c76438f64e0a2e6954664aa2a6acbb2352d3f434189cacfb215553f96735afe8a24c750253e44b29906a5b0d37cbd886ab77408adbce99067a095b9494e8156146592cd34a86d0e6ba3ad79a2e66ac64e149653dbc750d99a6ba979d321a756a6a62e5836775c3a74b8726e886237d94cd71208c0a6bb5fd0dd2ee8ee160489659bcd4c57f55553cb23200e4377a72df2c0a57b6845d1342d6d7fa4be8484942c41d284c90f0d423f4648264b829a0809bd7e62290acb4ccab5248216c9d4f2080d317035cdc5d0c10d1a7f20964ddb0d0643bf482896d55be325d6331f7daea14ddea512ddd447cf97c1ce32f5e99b54d3425a6db52ca49a2ea4fc4488658dec4a658aee06d3dd2c1852724407caeb55a2a69aba884c1a14d309661ad4841545d347822b462408a2112090d20ce5737a5bcbd3c86cd25601302320b03818b1e9760195e91ae5e7f67ac1cc583e6790a9e591273094e653ae2591a05f4bdb2d4dd121ff62b28409939f7ca3a131f495d792662b6b3838b6b2f67afdd0f809f26376ff2b769a4fdee65f2f989aba70d4d52cd39b1a2c0a4e0d16e5444d557dbd5254a8068b22b4a619ca89c288c0881ce9ced1a163c751c92486244a8e9da5b9d26eb59cc662a4b9d26e497270f236eb0d7d9a1687bcd0dd3a2d0e4175b7cb767b1acd2c7a1acd245bf4e9d2a8b996a9aada441f1bbabbc98f1112480888fc39f2e8fa3a3d7278b8746c6596bdda427e241a512dab2a49946b20a5209d2093201b4006b59a8d4a9b102f48e8fa423620c4869d1ead578790202942d7dc44888d90140c4280214c0771c5b2517ab3bdd16966a2d49661674e73514e1f4df30e65921661c8e96ea3d3cc34537664abe57525bbfba7c52063da15a44bafe8191464a8cf5b1a3363485a0cf2f5dba4689a661c9cbceb85ac963985e5d8114aa3bdc0c3bb86209de51b9d261afbf586be70c30b1c005a0482459116811c612b737a9222909e3e6fe9a3ab79a49aff67699496b42742579aa996b21b10d68f30dd2e9a6aa24a7e54e96e178d762b7ad5cce95ac3bb90d20ce555138946b379d57c576c488662aa67b645c9ffaa0945e8f582a966edf5424d219b3af42a8d56c25a3f54d3a4b564e85f436b5685ce1286b49a51326da8c9d090a126efc20f89a130578b3f96747793165f5abc88f07ac1eb04af9af862bdbeee1c9cfc4abba9397d9b58566f42383871a9b78fe57cf4aa8f29a20f1960514e14a6965f0ea0c59e2edd64cf5017a1b17cde705aec69b52bd75058cd34531b9ada6ca5cd0acb4545f973cc54bf7c951c1afa2c0b72ade859b422f96c5b616594fcb1fc0485729a2e918709dd7da4451e0ef0ecc063437703b5c8f391218204c87a66283f3938f998f9383871251962c3efc4768874770e3d2ea3134d8f3e9f68ec8bccf48622fd13989922a9657ea434d3f02e9586c2d0154d6d4f2b6ba9aa66552d6d484436eab98379a2a90c76223579976aae678e9dd99663a759caf28a2a71a525ed0633d7b4b47df927fa6a8a16d9b901a687da63051e60bacd2722fad5ace58f9d657e5226e151c4c3070fb13ba7b01c9ce0e084147778819945262cdbd45ab923891d43edcaaba9a22bed5616e5d8cd899e652ce79809336f4dba1b86167788dd9d8313b4e8347170f22e241aed56a4aa1906bba91fcb6ba6d96a28ecff24451d62babbd1a213490c493e4da3f347bda967564f7408508e8effd173c3c1fc1cdfc3b3c38564e86f90f293cf271ac3d0908a949f0c7d113a842406243a3a9d21e84821ea3820851675a20441ca3120e527aea1219d95cebb00f4399ec78e1e578e4b3d51f3666808293ff92274086868a806c845bbc16825ec9168792dd31b0c563e9a8f3e8a59245bd31c3b6f7f7b74fd5f5194c9e747aae173e478fd042d51922387ebcf0cc53442ca4fbe546b793569b4f2693433869c21e444912382eede6931c7871c1dddada4459c1ee064e96e15293f21baa94839861c436132b594b9866818426143345a09337f5c47f98495e91a253fba7e91eef669d1a5831f2dba92e8206f5383d93004488a16a1d1ca21b472c8eb757abd56d82d5dd5138509a93976a3c14e53e8ccb1982913326da5904d7dbd8a6859cdc1894c2d654236a76964a6280e4ede15cb39fd9b13fd73897843a6656a79e4f50a8a218191af57500e4efe7170e24a730d75a2bb85b478c383ebcc9908478b3747ba71803c00bec9db64330d1af22f35af665ac3dffcbf0f91bf5141f0e57b7474b878fef5592d7dfea646a7b5e451f56d9000913f141b7a35ab33fc6bc808a509ada68ada726ce8d1f569b412f63a7fe3aa697d5e332dc73e453faf667af4d9a8d4f99ba11a9dd692a1bf0902e401e0ca66babe9a8d8ef2d9e4c6d5dd352dde70364ee8ee558b363be8ee1e2dda2861e3830d926883b6d0a2cd916e21351b9da50c16240866dad0554dd534d76eea89c282d4f28a6455b39149c408a5ad678692a1a036a12865ed2cd79248accc4756144d856a592d6540592d65b6203d3720b04cc3eb05cb505eafd8aa0ad9d4722d63eb794387146526ea7a6613661615dd5434c34ef45c4177aba0bba1e8ee1474f797ee7ea2bbbde41485adb7253ab06267f91956d26c397d744d83d4d4956165519ad7d3bcc1517bba9b01624d171b9ac6fe44ffcc4fca9506b4e8348568341426b4c2328d86c26a6cdd693eb3510d500d8f4ef393143daab92194c59a6e55884cab620b06ddad26babb552db68e28d73256aeb9d6526aaddd2d27dd276aaa69861233a1a0a9ed4b9fb639b22851c2b472badb6bb1154337101433c3321335964d9acd46a6e8daa4882b9f686abecdaf513291d35ccf1b5a2bd51c33d334434187d87096fff9682817c5ce52b69e37f43ccb4fd1a2b5546fafde644767567fcd48bfa2a7ed693473553fa7e5cf507e4ef393b4aca5792d8f1e28099323efca37a45899535af9e8a3e71799bf6655c9513e8bd0b4cc34d867a2582e42ff5d46a7594361a7f92ad1c7b299a625ec5533cd6b51f9b10ca5543f7696b11c2b511a119a8f3e5666d9bf2b964fb35c89d057cb23d554f3998d6a685af4e5a32aad7cd5a4113d5259534dd9fa43273af4a7f92e23577e9b22f4330c4d6d4ff43639458b722a839539d75e353f46cb66d1aba62ce85d69b6bd5a7e7a3b4b289996d3b5a4e534d750f58bd08fa1b0cfb2b53c8d4cf5f3d1cb60a6ece8d7723d735ada56b5a4c1805464aee8f9e8fa6b566b78976aae59fd1c86cab52412cbab6aaa69061ac24135bf7ca313a5bd5afeaa9a5132f9ae1c86d42c839539cdb2155d8f5c67b6d94a59961dfdf96b799ab11445614fa399479f66d99a8dd0f56367492b73fae56728a52c87a11c4387189d66eccc404338fc9965ebdbe41bad84f2e5aba5ec57f38b90bc0b8966b3951f3bcb5fcdacfe99f3d16a5353b4e88ff2995374551f5d3fd7f0b17306d5e8346db6929666284b80907c627935894c199a0219993e01a23ea8e40b57763d4b32a5d0cc0888000000003315002028140e0a458301711cc489e4f5011480097c9a4c6e42174cc482284671100621641421800042000c0001a931880023ebc8a4f917736295e480c3834f10d4848a3dbe44f02cce07f03d76708415f8b2620584da6780e7a4f0e72a51f9d7b84188c268546307c5d0f082027da03e65853aa8329da77b1497e9f22b58f1b2845c5d9eb4d91d0c22a5575109c9c686815d226e668247fe8671c97b579a917bda400fdb4d1b4c3bce7b79835ef30a34e953bb2d832e43281028a78b9f2fdb7332ed61a0cd3c949ff53069c35c685e9d45cce5eaa6dcaadab3202c7ac5f1b436dc114fda13352b78410281b1c7ceba56e2e07e39847fa2b19d8f62f106e4d1c97e74a3414e8c5792adcbc9770e22d4bff0543aa0b8c2b30ba1e0786d5f56da03f1c609187a15cec8632f5ec8cb5ddb66fac8764c31500f8adaddc8b0ac2963c0979539a7d2a631c8cf00b5f25990282debd94f19292f94a92b253353c164eef03288dfb5e475e6ef973440579a5b43b6a0c989e8faa7cc4ff012a2d5b4672c8697042be5a81b5f1f583088eb9db70088a4e1793fc4cf8b0a940eaac2deada6b0b63eed129bb1bd81f7aaacd32f4e2672bf853e9910a1f5e4e44863a5c2f37fa908a302a5ecb2dae420b7acc59e9f30a2dac25a7e9b396e0298168747718ff7f03848adb164f2bbeb01610951a1647df4a5290a1c722c6b90532a25fd8e8868460c0228c9e21440af44d1d350586e9dd1799e2bc69e3de2837c5f8ab19e50ff08727db319132038f9fbd512c93db2a099538d8301efb0044244732259fbe53d656803b09cca243ef7fe54f81d7198d849b839e20af443ca940bde86103c6ab9e989db1349b418d0304579a1f27df42ec78fa90b45a3f02fc4203fe669bd5044a90c3218f8c0849fe8f1b02dbf97cd60b4e183915ff51ffe5dcc2e0d5d653beda23b1ceba39d9ece60903c1386e367133c6fc1804e9335058914964b041564eed8118f65b96e94f98f6d7d05c15bd9c596498426a87111998a5ad2cf73d236f3f7b1503d0001ce611e9a2d0ef44ae010913037235d455d1e3a3dad8e15e557bd2edc79ba4ca4ba050c8f79b3b4b1ab85c360f9b5c1a04cd428b5eccd10ee79675977ea61194d52b299cda55c5eb80c49734255a3cd2c894803f81b62ec7702e57d54046091feae5af06a6fcd9b36c1b1d1ee08ac126b2fcc66ea40a0e3814c7d473023be4ff195174679b5a42282320cf95915a8b2a6ede9641a55ef4ad45cbd91d43ae0d924ecd54c310aed3586b17f76765db96c9d8452e992472848539fbbb2f7b91ea3cd7c0ec82fdf1cb0a56bc2c07a3c25f83ce01562598cf8d43871b92aec3fc17f6f7677193b264744e1695e7c8030e6b7cf78b71dd3132a98c1cb71064326dafb6492b35ee5f288503020e2f9f57e2599bf0e7df3d6dff59c55e488e6cdd350e749669c9d7bf98eb0da20707bd766a3fe1017f0fb30a4be46eb693280a1243d98dbd18d7c5341632fe7ade366f40067f75ffb9c96eddf3dc5268a9160675c787b92c6e462de98ab993cc5462364cd6d2b3a23ac3741a711914151520348db9e6a880ef719f2a11928e4b6d3744327bcc1522034a56a80d6d3c5efc018c1cc2cc2c72e1d67f62dde78fbeb5f3b75660136899a96d16c47ad1f60ec994576cfe486ae81c32be3b408b1a0b437c64077c29d7fcaa4f0594c2a6fdbaab23d760216fbc73d4b03a70dc05cdf79f0545890c74678e7c36e8e989c97259212affc9d1d4efb264628c3d6c8e4f7c9350270614028c7fa2d6d9289e758848109305b76c6a9967ac55b003d4f922aede5e008ce296bf2c6f52b482e28d9c78fcd2087aac33ff8e5f3cb65db9268fbf2c472f3ad74f725eb6008e9eece1dc048ac1162ff228cc05ddaa4ddbab7f9da1430c3dc10f98f4f668185ade23b507093b0505c767188b8192de3713ff3c1f91413b2d6273d7b0f72574b7d36b744c6785f229964d857ea391f509821c55af026f496faf583d73c447a6c9030e9a3c55c64a683d387971ee6e1d6105aa36f770f27fee7d97fd34fb972aeb096f1c7a6ff35b3e189d34a506e8f47a17dd1ad66138fe3bb1bb8c7e40982b0068d727c06ac112d2cd6a338e19343f525c573b07b7c6d7b32814e8102ff82d751f08b02a52bd2b17ae7bde45e1cd77ea4a5754a5b442ddc7bcc2bd1cfb193f0fbed41aed1c9790af5288b53aef36a17b837d646883cbf110e43c7b39b3963bea3a5d12fdcdcef14a8cd39cb0c8555917e30702093fd19f864abadeba080703c0aab008d36b1a823868b891463a3f25a52e31687e1bd5a5a1487918518b743095ff6ad8a545008370c972e4064278a0fb083c32b2bd8a42a7e7119fa534058a3c8fa7ba999eb50a893a490f5d4b10ea4e94c027ed466e34e66d28ece57d1a2035739d206e1aaa1b37f3cb3e84119cb039588a635d795240164e9fddae3318d78b27f90b5a9149034edcc8480785fc34a0e3b8d09456961eb20c23414a25234dee133c4990ec78ada8779bf7d21fde590b48af7fddfbc31abb94679029a87bd4967f0315098fdf60167930fd6b5b5710a4806684879d70894ad8192debfd0269be3c606c6f97f689e359f10fddad1b391437e1d9cb681fa52e8a0acfd63411142b3364067b63b786eaacd10e9cca6d5f37e229ae79e2e8af5e83a76f4d670f253c9b88f52d2b390c8dca3f759f0adbfeab33db221a4b4d11945a8732e78f70860d22848d7afb92a42d233159ac9f3283c2e0ee78d7f779361c2d6d40063f171dab81bd6b94fff2182ae21b1a38d787a960de8fee426f38b3475d5faee528d873eef395d8419c41ce2ac138bf960a682c2bcfed19ccda40256c6992cc677192cdb76df223607773398fbcdc3ab1ac289ba0e7494c165a13739992ccea553f7d58fe8be44533d17eec37dd96d9f4cf490486567c29b03fd1c290cde96bfe45f0291b07cb2755d9336c39946aff671a67694f50921761c151a8166721bdf8fc34c850183a24e00af223e0acc9434a505b115211d0cb3df2d489ef3f147f016a7bfcb19c6d973b6c3cd335f931c9499e70ad2d380aa2578786ae98e719446cc5162729d8bc6a9b4132407f926868fb395557ca773537306aa2a86c48480768639c2d086d5622b2e5f26464d1992e6a6e5a4aca12e012a5ba889d53e461d0e5f86fe8693e3d2ab629100398c503c6efccf98bf7d8ff2c335748643e8db39aeab9eb4838e3675e55224b00ede60b9f63d08264fe38bd5357f6a8d727f60d8f046bbb24075ea302c9b6a345262dc7bef92ff89cfcef0d9d1afe5fb81bcc920fef34a7e9f29e15a16ffbee175b5bb823ca346d953e76667a276b021336c635631a3b31814f0b69c66919907f6d13e383a911a451ff33b2ad662175ec0037780961bd69609cfc0aaf627a8ed5343037006a6a2cad7b6595fcc6b9d0fbbde03fe5d50b548865b8144d4b7465981fe973ad2d661b9e87b9891bf45256af1ac5f6060ae4afa4d01db75d27a0c1fad49bc270a03a0f52d79c84332502ac150840b5259d06b7b43694e4972b16743ea3a3a551eabbe64155f75e324240cec434e0928cf7c03cf9f07acba32330949cdff426c7d681abfd6191b300de39578ee7ec880660223d5624523a7c0618b942d40d89d5227efd251f771e23619f79c74be5fe9d1a7dbbb8f1de2c8bac5e181099f533ae753e8fa69e703d26ede1ab3d88b8153ef204959826a2c65746156b74f96de4a229f9ad0571dfd05b2929fc327f02d8f90cd4a1b1322a95abc923d621c63580ae964d6c57a03044dc1c7829cc041fbb9b5d221379b4c693e3841118f184b253e770e9314f6de2288fb9bf188dbfe0a76141bd99f3f4b286d1e98c47b16ff117f5db3a8a9c3edb61ecc7701b67d1afd05233640ff7d64e7e0c171d93184215c41232bb10617991b4d085c7df7f2b81e5f78d747db783cb96c3cf7c56000601b41c3d9dc6b01e05307d8e5f468168d5896061d17d3636df256003fc5666b11dddf62d3c520b78cb9db0725312c373f084082f34b7325369f3ed026f3c088d18db3f13d6dab320435c88b032736a22ebfa4da3fe240ae2470c883ddfc09053305d0c3e074de804c67f09a0ce53599e0685851276ae3e22aad0a80c037d9e2d4e651c91e330cc2c9761db6de9cc4983cbde0f71bcbc89b312dc7091833f05361dd03345d85d623a1405eb796b9bc68f87a3af23a0e6c6e52c05b4950231102c7b43b9f393f8e2332142a051e8132684b80c52f81e2fec9c8f2d39bdc70f858ad175033709d736115c50a33d6440becb009574da32cb3038afeabb088dfa4e93cc661839554169288ca930bdaf6e43dd29f7ad5cebb8cbcf52e83439cf60a222284ad977adf9dd21c3539492a600e929b2a792a213d629ac9d8dae626badfa5d18a6e1c04a4ad7ef27c2d9119a5c803ccf40838dca47456843943ec8e655014eb8406bcdc4f79f4d722a1682fd98905808d16c01cbcf376c68725357ed1be9c1ae630146ff10f625aa976ecb5d67b9b3ab25a4332c1a4ad57c247ed5be980840d8e2878a809b10fe294f3e60bc459ce9a8471e405a453acb7e7a10ed69fa7db5ade8ce2a712c0db87fc9919b75dd5afe8d6aaac9314e3635f2efaf606e83af39feecfefd42ccf0bae9f028a7f5586613bbc9095c52ca8a9a16f43728ee4d402c005d260295ebf0ed6c89ee350b03ebed63537e2abf27753e9a97ae125d9ac2aad801ef4e17f8de3c3ede27baf2b2e7d8ba86439a5ade1cb69877f278bba35d33c31f1dbe679b7caaffd7739d37b94786a66dba3b3b16a71745ef54bdd93f517484876238a1c62a16cf317dcf14653f1812800c86f2cf2ebedd1d6f3fd7cf4787840719340fbc925ae8a78ef2b38f710f1074fb6da85295e5b168c2bdf253df8737458ad14b4e092752ba2642bfc479f0841264a5b60b1de6737037ffd5f14d3b87cd0dd58131c8ed6978bf08d806b47570ec8311cbbb39f2a77af8e70b01b99f79f8e7dfd074e5264a8ab42d6f8ef75b01aac17fced3db902a9a9dfee3b0411ebc189dd5f5e8f935c58aeef4f87fbdb43c6c3a70c44db4b0ec5b046ff68e0fdb12c66c5bd64ad629516c45647a38c7d4c048ebcc20bd4b0f664cbb886c5defb56e93b6ffbc22dd26fbc91bb711dd34289ea9f663e5e4db65736fe52151b0faea2587a5944c517d966fac48912dc48c1aa21edf5f33a2be21ca375b0a70de06362e210a97b7af071b436daaff2b4fac97b2385b5d123addaf81c707470800338c8e2b91c9f25955ebc80344c7fc069b1d6099c1914f6e0dacb3d0c14cc5e88e11553585d25340a84f50317384b08679e6ba3c199712d74ab63470cbfd179406afd3a929b4110b6eb64775f4d43a44d25b2d706ec5698bfadcc946b77d8f4cce05657cab944af0b0091a1a1e43df054403d67d907a35e10ef2466539aee5f1978dbceaad8ee871b3659b862cb4d4b749a3b7058b1f105429ab4873d2d08cc3fdf95568017d8b3d6207b6e10bbe841df9f04deb20cc67ca0549dd5a293628335dbdbb01a935eda5fba219c2ff9db5e910152079642e4ec320bdf06816a413990aeb538a647c5e7962ab4a9d2247435c9e8cdaabd56ab8dcb100b84075ec8dfafa943fc89bb85eef1cc1ae33bc1759c4676bb9dfd3f65dd267ee52419725c5256186d8f31cafb261d8f530c15fef6f5f8279fd312faef504f89df7e8c3e3ffe5e46a7836845a675b9c66787fb788a2118203a06e4158307f281d39df1f09f06a1040fd837c704026810f0fc4ea6f935ba2d3a3dd058c64b019a055f32ad40b1c741906280d2086f319722e9287aa9c2a1af9ec9005811b52f323e1b7c7329601945f5ddb7d16d79264ddcf3e042ba5fb3d4e0f78d9dd6fb98cce4490f2c225aa51055f05a20567500fa86020c6a9a1b2054cbbe1fe595dacbd73998592780405cb6194f9139d1e373877ae4a6f85aafb87dfef427a9ccfa14bd4774b2e1ef4d0ba685df58e5d7059a9083f7b3b2d61ff1cad13fb432191b280aaf813a94f593f03a5616b9b67eb552d14de366589506cdae7895f081614dabb5649d7703563a24911da4ff3be88ef39497c3840311332ed596134acac5c6eecc271bce8fb81ec31cc8fd4decdbe93e9b6e8367e1cb4ea7b137f4ad1730f37ccb17d34c6ba58a4bfda5b410dcba06659941e2da6b9a0b58fd1b3154f8ed5c50e6544e11a4cfcd3f52ff3c34448c2f5fc12dde6bae13a6aff49ddf4a5b02ef3d80a4914da1ebdecf05eced1a36d801923f5fc03ad2b7dfe8798dbbe1892c2f6b2ce6ac12565800f23166266a34b28dcb2445f33e423b4e5dc72d33decb451b7aa77a238c9953f665b955952699edf8f742754ce5372f905929cd0d3e667eb0045ec63c18cc97ce953b2bc53c10da228676deed336d37131ab160da800637b29c45499bdd02620a7c149e17e65b2c5e150ac0a0d31fc2f296801c4281b79268505cc980038e32a36e798439d1a16463fde11d55f86a58555a22eda54487c67e0b529e00d6aee013e709987c574dfc84fee2dd5c8d7c016ff079d08ceeb34c7c162f72f4cf810f576aff437bebb5cdf7612f6b0eafc862864a537cdd85e195607e91ee084f9243b0396f24d21e2bfa5bf55fd32c804af4d2ac9c8efecefd14d48c37d436d09937fe44f7ff8b71f8cf44fe2610639a09360634f5f7194cef7edfe43e63d9417b5e8e340332ac8606e0f13d37b642a768bbb3216c5e1022c20e4342e84114357af70d09a637a0d6707e247ce891e0b29bea2152942ed6a5c1bbd9ef031842e34f597666062039f082fff5f2ef876abbf8c210e12c68dc31ff9442b1c31e760f1ee58ea336f4070519f297fd17627adf6953e97dd35b7fb252df1fa86b53ed7cccc16b5620ca6c2514ef61193ffab06fd41659590fe9e43423994e6e9e17fcb6bfcdf1074dd1f6376e7eaf3faa20c14f16f4b86c4fb418eed02d2d9f4ae63def65bb2cc1d9da7e86c8f2cc7488791dfdc86ebcb6a797f8e82fb68c6ea0f92191af3f87099e49ab8b1828051fd8c92d4550f6ea4c7b9ff6a0dcf2beef4cae9ee5513e76a9372ac0ee17aadc0f687b5d40ef0f8b6ad867282ab0ef04eb05b9a82a08c6eaa5aaab9e5cb2589978012ade419fbabf88c316e9d393ee3b9dfd1189c09a45fa4e40dc1fd787bf6459853989c9551edc9dfd064efcb4f637780ed0cb11b7c3c309679dd6c56aca2cc7dbb9c2342c6036c34dc89c57c3f101f8d85f9d6d59cf0f66a30be53af0d677fd4f69f89b2dd2ad299527ca25bffe9cf43f8e77de17bf93b1459bd9305c1d55f7ff0704f087ff32eed358856119e8719f760036f7fc4851233b6b3d8dc1359dd5d1184ecade4a92904978a3a43523f27515a5ce66bea03c7cdf1b600f41916ff8ba4ce63d6879165367b415cf5c097e38664c0be38f46933a063daff05b0db8cfc265bad8742612f50ed608fe52249ccb8fc4f6a2f0b17ece81e8758cba9398eda40c0ca35a1a179ff32cfd7a10b8389a7c2b5166239cceb93e82070ccf97d596d7579a20a62d4253e8c16e32499f8a38f8633583f690c64b81016a9781f6fc80a07844ed897fe72449cce45ec09b7c5c8eba63d66a2045e24ee662980463751a31dc745c954545342ea31ba987451f70709300b79063d4d3e46835e77298be462a1081cf5468cd040204e3df669038cae8fc6741d994e34b85a7bfcd11280dfa46085c74eb2d624e32cd09fcbcc0d0e9fbd45e964af7c6a02b56c671293c48a5a82ceea17e14600d6ae368823941ed9fe0285fe88d808eafd9d1bab0fef601aa76774043dde19a70ad96f52585db3617bc9e4e1bbc00b1a0cdb8f2ba780ae73b80615d3f46c90131ddd3a306dfadc334e56386ffe8ada1b7cb41af9502578bcc2812bc9188c77635755d840f354cb965345fc3a28b6fc0b9ae048d405171ef363dd0c1fc39b02ac129360d1653b80a685d80a8d2320cbc6513481ee499d40af7042c497753a25b900932b194b1d685f6982a4c2796fce0849a6f2fda0e92689db0c68de313e725409732391a4a0046a8249cb42068f410f4b96b9c261972474549d415e8dd39837e9e82bfd9dad509bfaa4ffc079207abefa4fbd44d2e26447ec261e34504a8b55c4ea7a467680a4788fb70544b3a3ae8e1eaba04e54d34676476065548d7dad0fd190e1ad42e32d6c94135d3bf98f8f816f536a30316042cbfdc76aa8108190369a52b8ccce111771670869d057d8976d1699c3fe0342a38d7418063ec59d9099f6e4521832cda1b94c7c086da557c22804bf07bb301719dc571811c99970abc56bdbea7a34cd8b18326e03d00974fc48813eb40e203bbbe72dd05f4ac27a9538e608d326adca51ad3cd1aec1d997a74b3b7e9f73c0a067deea051d9316684e3e191cf8c2ac8cb4f596e832ba6831715ab40b09d5511304078918db121e1330805b3d95190a3e66bbcb4a34db6244868b5bf3c308538ad2b300796132f9b64fcfb3f4c00ff13f8f4caf8e8c8207a6c6e1536ae879695f17c061eb6bbba0be947fe075e4d67763213640174ce645b72a434f4f3e0c6c1ed3d937b3592beefe7695db9115fe928372fc8be17a587433db8b5de59d6ea7fd80a24e04f48b0e780ae629bbc4a3ec0f0b79bfc8f3639cb7e3bebfdc31348870fee7f0c0ef573b680e80b647c6dddd165850b7b34e07ff6a4e00b36c338e7c3492f4784041937d983ff97cbc3a08bf760c00d7ae37f41d9c8d6bef0161acf7e2a8af1b2afe7ca92b140a5ae5a57d531fa656feef083190788ff5975780d2312503e11ba792d921b0accaceab9b7e7537d522ba063f18e7ab543174b755c2d6fb70a40de667ba6118918221758f0e06dbb9ecff078edf2a5d7005449d877fb553e087c22e1504f3896bcdb22ba8630889c3892c0346c536ad226b3e60217341107b7ceedfae870ff8500b047b60ed60f868b6d27227b83b68a3d7055d4507e79e4b1997becba2e6c17e50dd697b99dcab7c42d9c5f4c39646e714081b77b26a43f3502da129b6b0f59bb3a0b6508e0f9d50ce9010268e2b24201e4521cd71c152b4322b9300c3c05518bbe4d7c93534c385294011c00ae7f8cc68432d510f0edf4aa121f24a3cc5091af801280c1c536e928ef3e3e4c4fb22b3be74996cfac519e7debb9fa2b54453cf86a62d85bb6fb541134ca8161b5e0129135033a0dd9c5288fd50f5d331b0c20dc093f73c29335bc7043a45cafd136e5b4cccedfe6c8355963e36bb8a6333ce035a1ce2fd57a05e5a332c3e9a36f8c3f5c019fd84226147b864b3556ccdfc4bd520fa483bd57c395e8f91e8ca56d1fc45c4217da54ec92539956446894ba89677bb0445e9c9861268a71da8bb09eebb0fcecbeb2b909461010e71f9a48874b28268c7a1c7343c38579621bebdd160eef3f135ed82ab42183f9318f319fde41e09b0eb1604e5bcae2b0ff6996415098271db9db4f58e15890e15e0bc16e08d9575cb046d2f5b545740cfc543a60380630f842f3ded9ba57184a54afce5f9bcfdb3081a7ceac8e8853d31a886148816ed2d3503b5aa12d11520d17e62594c19bb3805c7ed7b0e488639441466e61885202d987cb9dca55529d738f77289f093fdab7bc958e7c9da35a38ad40157f77c11b999b27e75331e86d21eaaa165355f4642335b2b921f98e7a94d5a4cd3fad544a522840ddaa6b8487a4d6f051a7d833fd1a02c1dc5d33e5b100d3395a0ee6ccb49af4d16ee6f17e8e704bb17d828b3d812caaf5d0e61a5f105fab1a9d22e5b0d1f77a21b1f15427ef6513d118adc17f92bf215cc05a5fee8f4fca48a6152c40c948e59462bebc010503dff0294c37407be705ea82f75174ca2ef23139c78c2a5b9fe5e4025143f3b1bc6784672628733f229b2900586045d055681be74ad1364688621c912a25d3468c42ae54ebd32ea8f57f10a1d92384790e5461386e24cf4bbdbc854936291c78a94918a2a98d4e7495d359ce3997f9bc4dedc51b0cf471680c8c06227b2a69ef6e3075e7d1eadac7e7c1228cd73f82d75c78783ced002948a6d321774badede47b7715e9f5d7c574e4f00eaaec934b54447cf60b0d5937281200c10f93e0ba34c62d89c99fac6a2f72d50f5ac1c4735f1f7ae3dcdc0b9ccaac4c0d6d559b145043da2dbb7601f9a7c81c919a14a0c92ee35cf0eacd07df77e37cfd1a78c312f88ef9f95bc10f2681d688fe7f57e0c126505ab2dfaf830e4681ed997fbf0756d805b646f9f88dc00f8340ea18bffd3dfd895faaf8fe0b5030919e4d5b1438494fcf260a46d27b6a090ae9582c6578b5580e0581ded572325f77b10657f3b8a27ca74b9d360b5a5b93c77ff34da8f240af061f462c35b0c32f135316b33f172cec77846dd10f1343b407c6b96ce49bf871eaca36fe6fab71c2c217d21cdd0634d5ef4bf1d4cbe89a9f33f457d1b647289eaf65af0f57522fdbf6aac23b6fbfe5edbb6fbff5e6776f7bf3def7df7aefbd37dffce66deff2bbfef3dad1cf128198febc61a33feb5feff6d3a3e2b7f8bdfe79999166517888ec6c8163e1f39d38783b1451e29ad229d75567018bacb1cc0ad6ac65c92ad6596289d82d9d5c1cacd138c062803a091fd1b508846b8b0ef6107e832045fa54d64be2347509838660e5de50adcf4262c744ebfd4987c5d7dab1e690291facfcc5e72d09b129584e89bf807aabd84270c0ab7a188ca64b3f211bc27a20880ca0e61ed380ab1c8020c977cbf1b33e4a744a33e73c890cd689dee9f5e9a34462005144c96a574c3ca9c6ad67591e257aab62e8a591a7dc1cf1b17589fb5b30230945a24986d5d8e1c3a186ed600867e68567a9352478635f959cd8ca2683ab4d9d7994cf4c0ede6f9c511c75e6b18912dd5abe9bc28a5bf8254a34896dcf19c26e4c51a21fd5f45e29621c66aae0b985e80a18faa844db4fb73ad4933ce2c4e88e53cace2ace9e94660666941d4ae4e0651a11930f1e1e84245c60019b3b710f10a8b6dd7fdfb1fc62b993d7a5e2170658c0400e447009e8086e6ab8f35c1b184b4b51327bd345ad2be9c47c5ceab2044a33ec9d75239fbe084e7969b85377124d104ec810947831710e7cd073f695d284c7263abcd0f2111d3919cf1922925ab6045dd1416e3c9ae84ba671e27a81e9dc39523c3528dec0ba5ab84c3a0a204570bb3cdcb87fc373ca835a288556c80ca7cb0becfbc5e00b505f9d4f04c32be0e614d863a5354a2f4de17f5f6275c373477792d6b58b19483fa1b1a80efa7534c722eb08cb696769bdf28e46f183799fbcd3a4e2dacc4c0431a3ad1f6218dc2c92e40f6c6170adeb0b6461a0089a17d66e5426be8092c2e0c896601a3825f04cfe80c16d0d40ef7eb484010d95360de4f69c8504c683c3819ca75bb2667815e0f2491883893a0210ffaca92287a98c1654df6f3317694f98777d65178e330c08c46393d02018b9e156dbae3ce3535f0931a6358cac87d839ce79c8535b6f01e706675944450299ee94343bc17880d05087fd3a5c649be4be8f5a777f1d500cc6ea45287f67d530be24996e3e54b45d4ff0a6b260474a483d7dacb2cbf3749530a024b45d0aac7660ecd7644d17001c123e675481a98588a691b3f2386834280f59da60c233071e9194adda5d23efd03c718536c42162a1cfa160382b505f14427a383ee66b4368edd27a62d5c915f981fd4fceccaba288b5c86fbcea310bfe7025b69f610b2453824d9ef1c28d1d030356eeb3ded8bbde5f405fe3898f5ee42c9b2c1488279b3d4f53a97c2e765aa5393bd305c4f7745aca31a26a4a36d64255f06e64c72e05cb9f3ea287e7c8d445a3634562871f46e7724392689f81e0dc9a8400a9bb125123ca20072b36b558444e5eb2219e9f433cf43d6caf40f19ba36cfbf86fd370299aa5ddaaa91332f029f2ed44467fbdec42ba4172d1e9a2388b99dd1b6738e02f950bede874d173b6b1305b58757a8664cffc953ce8f10175b12ff8dd329b22d4452f2b072bdc23128df3a0fff247106fa362804875c030000317eb706347c08ee6fc1e84d1c085ddf60d1f734a71aec5e62e2704315d87f8570b9a2fb0ab29bf820571524bef4e368fb9795d1dfdcdc53b955cf9c592731c02d9512ced812504e11b0dbc2385afa1d075d45e7b61b06adaa47b227e0ff3e309080799040d1aa7783d0a038509b1b0dee0d54d03d9fe259909f4b34b4884a18d5a933d056a55e04fe3529c317883412527b7ed5ced15d0d611aa8556c1805c8ede821d3cae944ada5fecc000428db07f176038d6f63a993704864d9c7e30e1ea112af8ed4b59f90360be3f255c9ff000ae9d98fe866321b087a72fa2b159b5eb3ff2070aec6a4012add92f8cd00119ffb2646d235ca16606ddfc181ca012fe609c51620b2c55c40ebebd44744168a4db2fc88c0fdedbce47f73dcc031ca8211fe3ab0e0525a81309fb6ff522364ade80ce35da76e79e2a9af00557154742a004c3e354e1718b7d231ae11a354723e560a9d69b81717d0875a99d9213f119e7cb23810af267d18fc5c57f8b6bbb8068015f605ddcd7328fe4754c404d5a8ba6ebbe9235954f6922b202e3e4e06c210445cb14280cbd9f66ed3a1bb72a9cd0a1745d45f34d704addf6ccdbb56783c3b9c75e0c8a7b227fb767187a3e000b3628e01d8fdb3f892eb5ea12434a9eac4eb05f5d86298197f1bb7e49106ea9b890f66b7ffe5d30dc7101c7a82b684bb4b40801381d533e305bb8771d8760f4bb0012cab534e114f50b5e6d3788f6c70e27f92ee353a4d8f50db0c557bd23d47a65c693bdc4ef78e191c0554f0962dc25dfe45ee073b0f44ce2aba78931dd926f72aff13b5c7a2571d5d3c5586ec96fa957f81d2f3d9378eaa9626cb7d4b7b4577c8e96de495cf53431a65bfa5bd62bbeea635429a6c34e576242c20e673721732c893344b2279602a6c6b57e103505ee7a1b4ee6fd7055d1dda0359fb6bfeff4895adf2c77b4dbf497144fa1c58fc95ea4dc35aa08eb7dea5af64afe87646f52de1ab588f136752f7b29ff23b227297f8d56c4f49eb895bd967f2d3c156df31f389566fbd7194095b9cbc58ca2acb365a159734d1f885a017bde66a7e93eac5ae83ed8ce47ebaf775d92d67fd635ea66fe49c6a768b147622f216f8d5ec4f49e72977a95ff23a99728bf422b627b4fbacbbcca771d3e9566fb179842b3fdef0c48d55ccbc24cb1ec99b5a0a9b1a60f46ad807bafa6a3793f5c4d743b68e5a3f5f7bb6e52cb3fd31ded36fb25c653b0d823b99728bf862ec47a9fba95bd947f0d2e956efb17988ab6f9ef1c4895b94bc50c91ecb9b5a0a969ad1b445d817bde46a7691f5c5d743b68cba7e9ef7b7d92d677d615e536ff25c65364f15a786adad63f602a65ebdf39904a7397891945d967ab42a3e64a2f88ba0277bd4d4ed37d78b5c87da09d47cbdfd3e488484d43c96673ed51d08216cd59266616659ead0a8d9aebfa20d40a9c9b2a293d9f4d2b953ccf8aedb575b6ad66bf43d05abbdf5170155dd3bfc1edd0d8cb70c7edf4398e0c65de942c31f40c3610d3f8d7bf4706213ee3016322c1c9c3cbfa975dcf37f8cb90381177b897125f93573825a6da231640720901e9434536df2492cb35e66fd51771b5ca510bd471720489b9854011eecea57dbea99758d0cbe7018a0128507ab4fb0a627d1f83f806aa3cb4487257a1b858f21d66289fd203c2fa57994c67b4d86782ca77d2cd2ba426c5dc50b70df9a82ecbd6c00d89399d2cb1a261367e2808b25755ab11a7d5154be0e944d4acda4757c1d7531aa94e2823a06c09f61908a0349f5268df9cfbf3b70b97afa0bf35768eaa4e4938734cbe2dd68070747b2b28b02c3d11d68442f705f1478a8402e1bb5c166cf8857add440afab5caa1325aa3554a8534ec4f8276ca2b21081e03c413546a707b5a60cba4b3adad8db1c2632b630a31c58880d1f86191b354b1b5b0c44a0111901140f0dc602eb90932cdd63921863490334bb882534dc68c356bd79d2232091538016b6b6a0d5a7ff4d309ac0f69eea74c0b4e720033056a6c734299a4d7ea7900269861fa0e53ce775dcea9a94bc343d39adbdd17347f6fa603181b28e08c47014fb183f827cdb1444cc9c0b54a6a5934b981fe1797612d2b1ead2b7c9801c6953a3e2b97172c71afe52df5b1ea0f12d6cc798db5d6d691c8d70c6e10fa4c04450108991e5fb13158ae054070cdc486d47c4a50200c9b4c011032cc7d45c6bbf7f0675724653dd82e07ef0a419aaafac59571896eaf248e80db7df95b4843e81256c00b6c5a73af8742ebcb672d1b7da70e5d41a358b588ec7d341c2a73c0643c0bd307fbbf779aef5ab610b20e5c0177a9007d3b044db7cef35f4ffc4fa01998462e244d47e2145be31bbab98b8357fea9c0999c1c84e5a7ea57701fdd122bc21865a0940f989c938d8ddcf22bff032b41397340bdba126334fa1861d2d821b6aa1504cb0b4e2ab82878bb9cd151b0756d03cfa40bce9d06ab4ce016ac687381be8740e57e3162d9179cd07446dd38b90bb85711685cb585cc723f88188589a5b3ea976cba3e81d5fe7084aed9288e4013c90e01e0975699f0411c5e13c4cf62bff317d35916da2f191cd78daef965e8140cc39afb13cef616d1e9a196c7548e400b576392a57342d22c1292e642489ab442d27685a43f9a4c0730a898ad425604db8ff9bf73b249c6cd181a732407f7abdd7647fc7db8ab24f989dd66e84a391e66f4f2ac9a5d08ecabee96d5bcfb14245f3457a82468a1b1b2aae47858737e0df6e379aadd0559383193a80c589064f754b11464693624e98d97cf261bd9cde4a367818981470a0cfda9ffe96fb2547f98177c99ac1db79620d93f6091ecd212d34352fa3fd594207f9081e33d58faf843a301d2b7a662a5604180c8507d88144e90b1c77b0813f16e52381642e4413a9b95211acc8f362112897744cc67259bb97b84105ac930788f7819ad641ecc171a845c9a05f536600599898e025b0d8d66a5f9ce68625d079a951728ed40e5c5da8a062e15149ecaf3583311581d7769e11232676a6957785d32a5592900568408f7f84b83a2219cb30b6ba15e5256528279207cc41b4c8e95a2f70e314f3e1da0e29fd8397e74708f6acfce068a92db8e98fad0ca7f5575dd1c71112ffa7a0a6e6574ec7b83969772ca8413b1436cd75dae1373720ebdfa8beec3de931a21d971cf8f58233d695f0e59519914db3025e67c2f598aef8506f813389c79b8a6a88d4d338e4ae45cbd792e4661f5c127381e1795d0c5c3e7629e74dd608691d8fb5401261674cc38c8f3325ce8c33f6eb38f931a5c725d68a03eb9bea0c5855e13b09ba6caabaac83135c13819d156038850d78753b501a19bb3ed4df02041bde9b9be74b824057eb5670e1de0136a92baaccc637971e5616ff8e7e9cd7d09a5c1416d7efc39c8f92c635b2b84508ba6f438bec09810b569409a675842aaf3ef0886fdc74159ef9ba84a15fe2911314e3d18d1553ca8925029c4fa555cc4323130d8d34fe0fa7fc8bb4a364b9cf1de2d6f60b9288529a7a4d9735647ac4bcc46f0c02d97e37facc228e908e596e6f694d18ddcd6a9df4d7253a67f4ffec04e919aa54a18a2815c495b654e01e57f622ae6dec4916aaaed19aacc6d2049ab6a5d2eaaad8b93815a62fcecbe04ec3e3a935900fdee12086437113c9bb3711937752f54aee74921fb1b6989d98eb86c0edf64513e35c38f6ac67e751765564dd0cb4b4e9edfd6a89a14e7bb2779e36db233127172e02123de3c208cd83d84cd893fa95e9c236bf6c609acd9528c1f26fbcca9bf50af5237ebcccb29d192da0580ea719c7039fb455cd40797eb2e2b714398e727f13eb487d637bf05f1ea5fc419a06104e5cdeb669386911995dd6c7c6e259ff066f8921a26a25bc3a449ca19c8bb6dd8a8c25f592acab722a6007db8bba0394c01a62d73855a93d5b48d14ad18ed74da8267b82d425771e3a488851c3cc1a2ffb02bb977e29e14f153ceef59bbaa376f9e8681007493ef37e3414eb72402c3500e1f7513f163e2dd70c1564f5bd9ee021d0cbf7c45ecd93d7e6d9d64c478d6a2d617b02138168c253e059b686e2602a62586a247841e1f68259efbf874ebf8fe03c7302ed090bad7d430b9b15efef421880764a98d244556a9a132b86c4dac3032d01500d909fc7800c70119758893d968f0510696c6dafa57d8c8ed016df964a07ba00c62397fd74a0db015936b48efe2289c7ee24e2dceb6abfdc15924bafeb19603cab1891b0d2b24fcf6526d62d8090628655b0047ef13d720f7eb55405cce0cd0cae5c1311111fadb579eb1922a8c981e310a27ef83705537da3fc6c08b90bb42584e655238624335b594bb66cf75e3d095a1b97c9ea4a36755cfa3f73bc2908deafa2f20d025f3f82f50508ceec1bf780987ee332ac02432d602673eed0e711e58860519b2940112d72c955a2c127e8bc5790425c02ab3f6671a2a38931858c652bd77a58d170862d5c3387a24d5efc193251866598be6b43209ef339299b51b53321c0877d2ea084bdf8fd6e065cd7d796585f0a7256e8829b8383299960e98d82a51de1ca0377ad3d4c4e12d46a3b3419850d0a6aed9598da48b7e12cb71dcaa74e8572ae71704904816e2107e690a9913a98aa2dd87ed69800dc08c7c64553e344afd59ce742c1955005af2b1c4d9d87be514366f7f33fc1a4abcffc01699eca3777b10b4ee4a9bb10f2e794db3f85afeaeda7e01ad1b269b07a6766e487c2ee24bf4a4db43183e6e69021bb3f667f0801b0df7f1d578dea61547130968a17fedf37a181e4718668250fa42857258aef85e48c6a64691a9a460858b4690a9160692844e9941411d2abdb2dfde444d1c5ffcf0069aa3f8880c60883807db47193f6aed0a09b4d2bd9145dbdeeda28d80afa034a283b26743308030b181163ff50d7d96b675df072286dee075e3f64b284209098d6ebf5e8225845da2251c4a66a54e56de58a0165e42f6ceadab3aa2105a0da292e2d61f92598fbcb45a6c8b1c396303e9a12839e64e7ac931e60e847d1fd866bcda5d5c4ba3e581fe10ba99b4a45f40e3fcc00204f72c0f745932d052e9a56d8d524cb62230b23cd079f744b5389a35825bb9d2a9aa3fcfa197a073d15b29cc197191f5a9b1bb353b584328f6ae8712b41db5bc0e3dfe60fc746bfb01c855c4c7914267de9a429c5fdb91326ef0d4cd843e4c49721027db1655e7c099e7103168d42f3ae8467e4d788c1d0874294085307499503473c9abdda33a6a61a32aa0867d8fdaa0196db6fcac1f127ecedb00d2820b514844a52886bf6ce3c4d3c47a49dc6032cb29c953310160dd615038943434a478375a7ba90e99a2f8c12611e7ec13850a1ea4a13ef60c6e290779e657feabb185669a835311b6c0235c2c61b0790adfeaa8890ab762ebad010c10db58f84ff0e1616485f87f5609a2817a20a149f3678ae0580a581965e39f562705da09882fe6433217f54f8b64fa31a3480f1e4c809c907d9e138e9bce4404ab02bc55300d93224d12c1c53e3e3c65334720b880a4338904f3f2b8b5a70630118309c8cc6ad8f649c409e1f5f94de664d131a1f3eb724d1d55a1e818e4bcd530729de090dd3bb080d0a45dee2e09a84f5474a03a36945f1cc3ae34baf7cc706649d2cd4a9de4f65c7ee679ccf78a2d5ffff4bf4b595f8e9d5584a255279d0d99fd6efdb0b5c71292c927bfbac515341d83896401f8ec02b4e22af0dd7fb6ec79def4b7321f7f7245bd6b0831e2dda1c9a42f6c7930925fc612bd439afb201b32458555825e085aa69119e11d28370ea8b62c4d40d96a7990010e6f07ad0e9ba6fa275d108c0bfe4df7478be008a7438aa3de44d5348b514e034934df6d4980117cbc082aa112fc260f4bed08f7206cdb71964a971090032d7bb4652d9fceb7bb72337d7ac2fd32436d6bd209aeab38e5d6fbd479e1cf5b426cf59364e160b5f806dd8832917ff2c71cdf9f43a87c2b2c65942e2b13b0df944669a0eec7422c4e94587be9bcd00e955ef4ad1dd324fac0d2584393249e9a9ac80c67ac5b205aacce72154db281c1c554a3dcc3412eeb8b01303d072968714d7d656b9d0a180ee11df4a15bca936c8220849fad013931fd3a72aeb972a0fdf2aa45a7ea1cb83b69e7c6d31bf1c622354220536823a20a72a529c8940254b969179b44a29ec5a87ace8971fe31cc479cac16d575dd109205c7641d9b50ad5e83adb71c4447b8eb6ed9a6eeab69f8d7ff281444f58c9074d029dba8e74efd721c710609b7dc60f801d216738163b888c35e37a6480cbd62eeef63e0933da08f5591416daf58d13701d20530dc0a2b3c1c91c6b6d235090017486b0d537056ad70b178612cede01c81f03e5acf1e802e775e74dee04c0483b28b5e71605ae95565d94e29bac16984e78277dc5115758e48c5a79f7701736aaff7ae9e9d68c7cdfd738c004e4e3a2cd5b66c6c8453260205c777a3fac2596b397e15d56cec5bb23685f23255651d8c0aa4005d377b7307a2306de98222560f449a4f16df7a98caafbc624589f55292f8d95631cf571942f8218cea79739e46c77a8247fa669d52bbc3eea686abd5691ba2f13a61cddfdcd80a9fe37f481d08c6b3d60c75cac448e3605fa10fd053e68c0059ced27e5f2798583f84372cb7d414a830b06001a5db0cbd44b1c19c1c76e0cdc9f58082aec25db7f9e35210c824355565a1c466fe58825522942676163f166c86afa0bb10704aa68ac017fa9bc9b16a4e0dcf558a5415ceec4242bdd546b4ed9a0c3c23cc036ba02efe26911a9da67b5032f61c1403868f3db50f2b29c7f120bc0ecf0350f8dc3400c16e48150dcc70c80f130065ed795a419bf197fdeeace02234df4a22503be046c2339d100287ada6be61f210f7345f1e986d8925e1bb0b88a663872bfa4095fc3d61cfe665fb0b395ff5da3743bbc9f6640dbf135d77976ad0474c24817457d5868a330a1acb13f4bef7bf7d426eaab4a0d8eef32e78c6636842cacd731ddabcdf8f40bd50512cc16d42889e9df9e62d75ea0157e56fc9dc063e18b6c8fbcdab952ad67c978746fcc3a520808aeefc8c170e0f5e8e645a74e864a489f700d180d91471758050ed12a75c410c701ddb434190ba8ed9ddcd8b94f5d29652cbd96eea36290159c8387cd44b98be07502b7d1e9ba95fc7eff6509b398d99324a5c45631e4989a18d463d611e43200d4c2661702c0f334f7ffe3018cf7fa7c66e417bee5b9f2df30d516cb8fb70e53e0e8dcf183dd57a858b1ef3e8fc080c04cd53642ac9efe6a5e5388484fc277c67458bdb037b836c9131d1bb6c9c77b603e72b6894eb7f00690a96b292e6731f9af2566ad8829aa61706eddfbacfcb99ee88b86ea8373ca44330185f995956119da8921926a61c0274f06f6e501da71013ab79cd3d1804fffbfc80bc20419fc2b17598d5ce42fcbc0ac83242625341257809402557da8bf374da655211dddb51bc8d56c4f801a34d0ce795eaffb2f6257937fad756009fbdc686826d6a74ee9c31ebccbdab4209adfb56484bb67d30c4624c8ef6f06ec11557ab585ff35b5d7612726da4f21f11dab75b48a3c9fa2604211a8aa6e6e8a02fa22809a18af5e0abd27f38d6d710446a85a8287f94e2d053ddf6a5ad80a06fd766b154d6ddfa3381a4df327be2218bd4b18a04a475f0e765fe113eccf7bb617251167e6d5b19aa1f71997bfb2bd3c5be744281cbdebc48cc694d464ab60415c68f546043b8d4a047df3d97f31f9c40ec081876101c0b3a8aa21334642939499f6b1cc00fcccc2b248ef229234a42bd233d61ea2ac5982c950c41d9fa207545c9f7e5148df6df1d5197d401bf543905bc56c0cffa148480836987c5291664289fb66b6aadad0a76ce4d1d21786e6c26e429e80683f3d03f5961ac8905fa60d8281108740a48d211240f1c46d163152d5c7f22d2b81b9fb5d77043422f897680ed15be9e9148de15613611ce201d5a961a9749231c1f47ae07ea38e4443a72d30c67731abe7f77e50fb37648fd334f1438aa027ebd92654b1480832a62802e92520735f2ccaa2825048364791cd452470660f08c0de8f0f118e99c9a77122beb5901a26a341efcde9b81d31f92d973f9dbbfdbe49d595a578c31b49e93d9000da3bb53401b038832c9c1b88747706900fe43a244f7cd2e4fbf23f9aa6415cb25425f50b6fb5b4d9d951bd05f3f83d46f37d61e83e367900b9622864e7a0bb3241359494954182740e8394752c7519829de8672e64c3c22adb754146283f8f250b95239f2921e04721d65ca566f7e03cd06d04fb7576303d3dec845165cc38c381f573991e91541c3ff7f34ac5ec87971b68c51f9becc568c8cdf934ba7c0af4373f17f1d98d3236107d510ffa61eff1e07947bf270a15a1c3d22e439173e21bc3038fc0a82a3896e3d5c849cda46a089d744ccc4f5dc7c05f141d700c6c86e1732c56419fad4ae3445b3899f811393948827395650342e36c4a3d3f8815c93999b71e273cb4a194f7a3bf0355da632cc3c636de9db95086f9d9bbd3a948b26700d0dd7180ef6848603e451060544ed20901a85edfc04b1910f55d0d3516f1cd22c96c13c849fa33b5b4c5885002e407a89d275de5aac37ecebd2a4c2e5c016b837020f9de936e7deff1cd4d656129e7282773f948be900c52791977919ffc2e34b5a5f7c87b5f3b7998132ef958faf6d817747d4ff9148d704c660167515fdbb54a88ad5bccd3a9390d440a908b3c278229113e6a30b2a6372171792d57293a5fe056fc96505cda410735c530d22cfecd2e178c5af61482917403617d5408affe89ec58496b80fc12348e08c18da8caa976ddf95a86c6d43a94316d0d60356849595649bd88f11abf4c8e76cb6e0843b8fae5de2d25e05e2e7a1a6dc0b18ee91b815d64f17f938a05715ecc18f8ee136a8bd098fec477babe91a88e496787c7fd4d8a435c9a6931726252363aa99f55d0dad11c2d436d804a2df826e9410492aabe2abb2c061513c426e55cc015ee486e3fe5d2f35b8f977de98d0f1e41afc14a568c8ea6dbf23c81263d76f2114884a18f0eeaac6468577b1b9c5ca3ee4e0b013fc95557009fc39d04463f891f10b1653862a8c99100c19e80c4ae3736a4943ef74cc7812feb13c340069e0574d72e9fbace026ede6d22f836059b51b9f80270c7dcaefdb454dd4baac6613cef53d2b4338dd1f4c0f76774c284da00f8f0e08bee02357896b01bf6b2d73a09a9e98b256c1c0f8d70826d283b6d69e7bc6c97cf5f87f6e9e7a9595c2323f529e342bdbc2708299ed641209b03234c93c0097338293f8ae2134940291a309fa4b439281a651a206385ece16764de1e5886a68eb3efd2f3d1e5bf2592f917272f449ef43e3c3357885545a905982ea058ab204c3b310a018718bf4e983c156a84e94fc50d58ddc566bfaa0349df2101f02f64f0e149e552077a033abea414ce3193c7024b668ff57167037882976b501adee1a61e464a7ab48a160050f1a92b8be29be63ac97c4983b015888daaec9c773fd56b9669028d184ef8e1cca35df8b3ce2255a24ee6f9b72a4c1561b493abbb5510a044efbf84664c2e862a756732b8cfe4e015436508e7c6a6c6c365592aa697f073f70dde809197a894548d47765c517275e5225d8148381b2b58ef866ec477b329985da4ce4c960db3bbbdb4d4f5648032bd9b619356e1a2de3245bb753651d9648ae5c3dd63d536c7854a28fe08fe2234ceb0f7b50d881630fade1cdcf1fec7187253fa5efd8c0ab13469656849288fdb8f06a473031471cb288499e4ce6a87ce318f5e989f12881c7b071e440c60c32ffccff0cdd1e8b06ef509d1a7f1730fa3125bbd4b864e10f208d45d553642f0f2962b5087ee48bdfd5d3edcf64223ec36c3ebf2d9c652eed3983a2287c4673673114b24cfaf99ec3e8d32f93f4a0249c5505450439081859c6fb86f14ceb3fe3179e7800eb0189036698fec97002124724580b027abeecf20dc90080a2bb32567e09777b87bc60d240fac2311883b84e2687b2c9300e9a709d9a24f582db0ca6ea67dae8fa0ad5ad1712187a11e8efb0c1f385ef5c897a117710de7e77e18512859c6046f2b4a58dbbe856f6ce35d639bfa538c2d9049c59e04ad33dcb8e495a87bb38aaab4992f6dfc5efb13f00ecb829f40ebdf1ae3d52aa92efe283b42746826d62a9c88baa77c1a01e059d88b41b899bdc771127896ca7e658b12b1b8c40829ff8b7a6ab6a9555a7a07711773afd282a32ad08047d871b73704750f583f882b5144a3fa1e9d91ac54f473c70e6fccd46861a98b721df2c3a53831ffc6d54601ade56ae3d3822a9679098800a7af13282887078451d030d9eb38fc91ecfe35bcd8643917b1d66d5be28bea303137d04ac138280bcd0d8623d7c480908d6bde33263dfc8071f7b87cd39f8bd8602869a5054477d87542b1499e0c487d56a3398839c195abc43a55c278ae594c90a766eb63283c6f1f0b0c5bf7c4ba1b9d4f263062069d088ef3877debaaa7de3561fe2463fae109eacad45a26fa6b74fe19184bfb361fa44cc9ae29fe2a4bbc7d50292b2e21ae12e2de2bbcbc3465c82540cdc20e4a54152a4ad217807197f2ac9d030084eec584229a1f76d8cbeb7be5cec18c206018f0d40837c1893ae3ee424d650f1e367334ec9bf0dbb22dbe8a3eaf61ac5923844659970745e517c79857031547025181e0bf71e569966ad0e5b065c547318e581f22c8a9e0698a7586d1d2d5420afa295cfc24afe34ec4e0f1c84181260f1ffeca482f82279cfb097d644a487d0dce3d80b7d3264a7903c4187db4cb680681086ee323787b3520084cb121ca8efb5ddb7972454f980286d3bc985552e3fbce2ec06d24261a00c80411b15e40483eeb950e051438108dd908c80dd0e9fc6c2dc1f18d9f07568df2fd51074bf4fd22f07d0628ac8ab3850d4c803dfc873eacc853c0f7c65335c4f00e4d13d79cced8aec43d2ab4630e4b3b347ba728b30402ca2983f2c4574a5fa49a57e9a0baa8bc46ef340962542e08e719049f6636939e93312afbf0303938b1333ca941a345ffa537a7d13ca1441ddd4d9f0dffd85e3b261b09fddd6c82320d6f2cbbf29a484e5f071c20b9efeaf76a0aedf867fed1da6d823218968670a225d9afef1ec31e7aa6ddbd095c6a9882348ce9570bda81c788465f04e74087bb6583ad9313e085345c63fba92527cf3d71bde1ccb7b5ece6e1b2a6d0953e8e098d671a4f64543e336178206b9099422431520a9ac00f63746626a11792d61756148895c06a078dfe988b2a14d2f96e6270e89881ea2c25b481f4c48b1d6841e15d5c9766c5106cdafdde7447dfee522be9d819718313449f026d2dc4dc40c916faaab289d921c774e85ea7dbc28d21180c172c064f9923d2d0115a118dc6ab93552212e0f05dd9a540501445721e8fd4fd41dc447be645704f65ba5356188943851c84739ba4d26db4d59539819afa918b18fd674d614c8dfa75812344d5495ad928f50ba89c053a86082c0d414ecf18c8cf2fe567b39d8cd438f1ae2a2a0511905aa12cab31b1bd00799051a3b7796a48dc1c501fdf044ccbcbf98caaa55d7044f4adaba44e9bab458901e428ded6ca215409a9aa33678794aa0dcd7cbe0ebc7fab7a9ecccb0e7ad3a6e89d490d9f7f9bba4a2d617ca1eb6d1c069561a64ce764e8eef6bdccf7de4f60c735bcfa51082f44bb0bdb87cbb86e23831bdf0454270efd0be66faad605d6888d1efb772e861764b3c36edea9711c3af0d04dc385b7b680e2a5f028a957c9341729dd5b826b71e7d31abe53808b81ced989a748cb027f92b810c81d7adf6b13609430aa830ae5331d42754ddb8abf53c6a88ec4dbbc51b10c05870768c91069cc3676ab4d21c542facf204a849ed831615ee164d8967604916515b75ad4cfd7fdb831101d41a3f7d61143f8a1e2d73e3beb722cabaed4bb5ed97453156443c9f31f50e0432aa49b54fad215c34aca70d46cdd062f9b95eeb0ecc78c5a8ef1437866f2e968c3f5db238a81c050dc0c679b231750b6697216acf4e65d33c10c4fc316a4b11012ff1578c54f03b6a2bc8fd2312d8782e6a7d3009392289eb9fec04830dd52b3ce7ef407ad37f49f6c9813e2e4777961f653e476fa650f358cd01e436fa788c0f9370c36c0e677d19f43830f0c1c78b339da443aa4797686594a1a657f6e35cc75f551543f95e6528c8e75aa18ef80ad562666e364a030cdf82d272bae8d8a78a63561a70a4f67dadc3bce7097db4f6f9419e9f82cfeaa44ffc5990ccc3c1f4c5390f3e4ee8d961c0d8e781afd57c7e894608c733a3392b2df40181a0e66273deba0d962eb87dba75195cd647d32e5d8df1de721ad766cca79c1e514e1fb51cc689b6f8ea811f3c41eeb60b5685d8c67c545c8d4a4d63f04d3997d36024df4a200b17930cc3be6bfa5349768fe6a44e4c956aec1310b8c79e2a62265051089510f2ba5466df1252e3d29c4cefe875025a0dc73c3ae11e5dda46957a1f01554c04c48de29c18eed3b602aa937af486a7a43ae1da6b919a165a30455fd643f8888b556b759264d70322082c32927ba2b87f85bd221426d30dc6b15f0c341c4196195658a333ac5c5980c72468b9101f6156a59226280472c5640a53b5fb568420e88e1985ad93e70d63b84036876c2bc98c3820ab16fc214f66f82c4e4d38014bce6c726422096a2554d5ea2e0a9a48d66b0208ac41c0e0faa3dd55f37ed022f65c2bb953e672f0809f3885c034e9a8f478896970423645c226472661f078a2aed75f00cc4e2fad1162746d220605a95eb3ecce0cfbef5453266e34460c8c297298d82abeb1ccad8726ee097dd5d1c8d498d7d2780d6df64899e342f14cea831cf4d7adfe57c946abbe0cf6beb317c176f4a373c612356821a9588a21fa2467ec0d140fb3c05de2a418978d004cf180c4de05f9631bdd561edf01043e374bde20acf38a7568c20b94383f6fd055d1cccd251c1f40f19b2d6d9bb50c2d2a6a6f4135d0a67bc2c9ee7ac15a052084d6dd5286f3e2ed7008c2d97053d86897a8164efc175361a5de81ce48228b9aeaec7844f1f098fc2e684578ce0e44174f58409c0b801e6a037667244a59c3cbfc8539dff1a27369663ef7a6e5e9450ad6ffcc356bf502365b01b0dafec6e4b7e2e9fd538b04ed6614ed1cb3f6dea86c20a41cc23c0748eef9af7c420620ccde82e429e091a328f539875274160e0667a105542f23813b504cc761f036bb0048728223c34b85123d7ce6ace31880b0e1b69e4f093a95503ef70373f085a3bcece7772a3d8e726050245fe19a3fe0e4c3710b0b0ee10330243b2e013d31c4f60d379e45c347c98faf2124a2b030d35881040bdb8cc8641890cca51910e1813399c2ff9a03efc25331eab88d83fc676867d496d5a8ad73170f80803e40f34ec7ad900d57305744f8ee679107fedad6d056e46eccd6f7995d66ec99a924f10e8757609e5a0aaf449953c225c07405c7e3ce6b8e01c41bc9dfd3152442378b6e1d128b064b3ffd1a1614b95a3ac4d53934e5fb7a93e750fc50bd78411367eeade14718612a582718d335e5ddc78f940081b826596b3dfb3a424f4817b44de80582c0b544ee101ddf9ae9d2c78be9f23178b04370d62aa15caa7a3000a24b5f3dd6735c51cd0ed03df33e391274593155f44a8155f68ab21de62063cdcb6a0483e6cb4f948f7afac3b39e279e0437cfae008fd2bce69379f006032d48b49bfa2b9104594b2b3bb0fa020952ec82900e7c791480f5357fc34679464b4391ac0115e05ba1768250611c16970336bd206d4be5fd9aad7f1264640efe4191e0042e4c947af12433c4a7ebe16bf899e2c629dd26c2b30a39ee99d0210fd33b96c7693c5804cc8b934a94e848c1beca4f32a1d7c988f5348c4246f1d039c49964244e1fff38141d3557199fb253a2111855faf437ae013fb983f4d75354bd721e6f020ccf2afef0e3a97467361fd0fa4308e94e6df07c7496818ce0c31a2c6777fc32ed012d9eeeb435ecc877d7640102b9259d6932c6e9468bc69d50ca1550b1c9135d7c628f6c4b468396bd7b94738039d331dd391b3895a44244ce967a4add5042401b3aecd8218aa23766087ec7bb4af3a14ffbdb8376eca40e95fb77f3971e3bae4e387080dea0d731dbcee095b55e72e3828ce085df5b9f93c9708ec850c551ca1bfcddccc5a9cec7974d66579c6192800b6b2ceb353ab3b76315230e187461d30ce0e0e05d6ef2ccdac58b971e0001f0eb23cb78d85dabedde21a8cef41d5881def8bfab36347b5dc6ec724eeafbbf978b7abb7eb61bc1cf1b2d4b04d9596cf9111ea4199412d6494ade48de3086b5bafd4abd8f23d2b8c4695df2106fd582425ad5c7c8b10ff6c98357dcaca9144e1df0f211955aa49375dc626c3b722bd8d745d88b1de278941ee7e8c38d355f452d2129cd00ac607c0671dbf7ff7bd473e1332b7ad84c53f2deee9b3948e3792f1feb08111d8f72e744cd6c9bcf03e9a769a4c303213a1beafdc66c27a749702aab8575a644aad71d09c671166505addc5c42a4779e61bd8eea4913abb46a0624d58072407c1d27d88fcb28297d0b1dab744fac71e5eeb4df3acdb5ccab15db3054d8295122ca4419473134d2483b7db09c1309d8d8dd412592206fa23b71c42875304a7f59cb44251c53367a2d575a818c13e3a14689ab56a785d2229807294d8e447fceb5f075f34bd78180acd48089dd061fbd84990f0b291665d8ee1d7499035799a1a3a03bd5da4ff23bea40cfaa9b08daa184968da92963251bfdaebea13eed885e127b02ae48e21bc8c830c968b0818d10dc617e785fd454692455b4bc976a820784aea0c9a3f1eebd49a1d2568ee4187c49793dbba165dc5c2554335306fe2a5491507cc6038dc45ea037f103ab1a8d3d80b4f5090d5ccf55e5812475132a90e7c640bd3f26e45ab2666be38e3178133090b80579ec77d7288622e2470b1fecab8809a2b50db7a28cd79544f0f8d1e4f519d98f66b45445a05bfaa8ec6d7ab5df7d26deede736fe218e88d400ba117cf69855ea1be52f5633ecfaad1975c007ad88eba8648d290e781b75c80e5fb82ebea3d29adfb3baff97c844ce928c70d9c05e1a49513f50f18212035ea128c8e8893e54043aed4ab72219c9cbde17f563e009553eef1afbc673ab3c31063717c5358a9d74361c4de0d9286fc804138a8374a21c057d22ad1a94bbbd9b148efb0115ab8432a294e41668c415b984704b68c5aa585a760b74d2aa2829ba6534b14a2a15ee62a19ff4e3205e68bb5bd9bd4852f378d41192b9d206fb99cd2817f41e9954dbd21d48bedeb5b26d422ad180f3fd24b60dc8779c315518c4d0213a4dd6665a05c4e1f755ce1dc747fc5ee2c87ca146b12b104f5c473d7d2f6e55553fafc276846c092bcbb24a2e368a859989f268fa3c8a8c60ae76f6d3a37ca2d9b14982ea70ca121a30596a510143baa35427edb6d60f1dbd518b5a764c8610946d19fbf8afb62c8d669420d79bfd4e8309e790cdf46420f18c14c181bebb5b87bf225892f6c4ffcd88442057230fbf25a6cf48cd7b2256e4b8f9798d078b91149aba8edb290f99936c5743103bb7730d9cdb8ee63e192fa143c68ad9614041a82ff7fac63470264cb35531dec96b07498c3bc16d53e6b4e409c5a56baa4f5061c06d935e18526a45f0ed9e924824edd1b5e6a595549ec3b01418d1909cec184084e6dfdcdf4abd05790fbc099193a3e1a0f199affa652802a26ab4886c8fda9bfa1c11e0d3f3b43b1dc89b9cc94ec963c4fe78b1efe2c86c18b8aea56a8c3a2cf4d5d501d7c774dda59bf19a80e5958011110df98a51088905cb514fa3d97e39db052bf0238a9a23ca50f90ac000a0bd9b01938c7a1a0a6f56d8a5391904d4843f82d3e7c6f24c28261cadcb3346b1817280c30171f32241e01a04eda3830f924d122421ec2192d20968f6de42fa7139fb81c5adcc6572cd9f0f60efdbe2e6ebbddc11b6b8977401a46ac06a48086bd5a317dc50e50c2c82960b60900b2052b44972ce5e558c6c015c8fdfbd3dce04856390899f4a4a303462c18b3d11f253927ce4b096f18a28c79bfed7a966ba320fd684f4ab800dac06f371edcd625ff5ece7aa3f05a0dfd995e7325d9941351297c8a804f466dc8add36b1c1df4b2dd38c11e883c506dda02e75fc54ba3dad5d97da4b3544ffb3323161ecdd51af3d19f3016be372644ed7ee6376d8af751b5c5518fdcc0c2b2a0029e1991e5b87701cd0519287585c20712d1fbcb052506a36c061834ede64e228e2430de9012ea70801eda59d191ded38006381144e98cc47ea51a70a11dda385698a965c1521a7c43aca09d86452c7cb14134146d672f50424da030b2e1694c2e5ab35ba088e591e1df194d2b526ab743112c1c31ed0d1e7f3c622642bf73159959c3a5f27d1125a4a476b4b192ae735ade3ac8d73d111ba95e132eb889c1e9c3bc706b2e389cb310743e55a46b5fd7b216c9a38e0fd4dc4ec05ceecfc92b97ed8b6e416a3413f485cfc6796d8a5befdd7b9a9031fe2b6ad06b73ae5d9801ef533dbf7f9f387881818a11235c611ba4c43bcb4afdbf9f631331768dba9e364a1ed31dfd6099e09006ecc2ff3fdf48cf07c1d2d666d33e146fdb9f799372cb430eba0f174c04d18a40b0b1bd7f3cd9cb8ab322120ec5b708bd1b070407c8360c2aa3aa03e53e69c39de422bb1d6c2168e3676f08789e2904314c7c9bacc62dbea9fb2813bfd192c520e4bae8315b245385a0d6e1340e478a73c2b02f72d16081b2b2d3b4b78ae5850b9bd6da728630173ccb5d56861067c10cd8b3e4bb9e5296546c0bbf64bc48a45169dc58cd94e40b43aeea26754cc19955b51b9ed43f8d583046bf580030208bdefba4b2ac48760b64ae47e3f405a3156722db58dadbde02ad78f73e48dd7783c55bcaa5ae2a4af0b2e8fae333df1a83256adcc2269b4a7909434fd0bea7c1c4f14c81e96a408376b081e484af0c05648cccc98887317940bee0cbdc3bbc8a090083e37170de6038c118829f91ae9018a1f8895e3d36ad4432806d8e526cc3132d59760b13921ab49b73d4d41de89199d2fc8cda8c57ceeeb5fdcfcbb8418939392108c1ede87275fe910056a7f2920e80f71bbf6e86985250bf7684e753944e0a4307a2871867b1e1584882dd2da20df820f579054188bbe66db57b3b69d91f68dc321406ab27c6e0a1b3cb3269d1258399f73673ff45d4338064bea03a307f763147487dbad7b9d5cac3fdc3ba7fa877738613f418f9b633dea744c4d807f5b7f25e09a31e84d687292fd6e5ced23a92f5cbcd8c4e98cad4121a939d3a0a7b6db860659cb0832c3024acd071c7883cf60e36b1461dd0f8ef473fa3fb330c7d2038e8ce0804656c30a9969ea840b98322d74d6f146fe22411c9e61ca079e0498fb8c868713c15e329c1b48f4cca62149177d10038ed444d80d3c10b8dba403fcffffffffffffff31c2f0a325441b914694089229c94c910a55fdca1aff541f151f7fb2b5424a29a594522623cd5cd11020d6d62cd901b80f3b0d3d0dac4fb6e5ba5a07981dac940c9392ef56f25daa8911e443653e193976b4673420d6f07810e833981f6074a0d6be92721d4a95ee9826c695151f3e6c0851c9f19bcf901863ccb480548c6072b09833d6b4aba06a0caec613ead818c2e2f9f490df222446150c0e303858ec9915cbc98be5ea1e82b9817727a9f239e5da69490d17396ce0d8a2e56508286306c606dedbd8d7c27e724ef89aff649ed33cc4089311a311fec448024c0d927b8ab97be8abad26c3d0a0b5cda7e07ab2a5d7e61699417be67e95d47ba76fba11194cc9ecbb9d327dea2d05c5c0ed43eec96aa5760bca356090d8c2d55ecf7dd204d9650d86dfee39f84da92965d3c4c8e16c8aacf102b8e6763ff95ea1bb4ca197f74d31f866c3f578a9f939a25e53ded3c92477264f20234ae75b4ede53a143f5d44829b57a2fd36ca552264d8c20179eea5fcdfe9dae49c83431ba84dceaf69c62cc35976c5f13e30704e554523e3307254baf34316e3efe7e5bf9a7af7a8e5f13a30b1ceeba73dcd263c59cd4c4d8c22c3d6caa4df5a4bccfe281efedf54a3f5f97853c9e0eefdce476c1574f72b2b07c96dab3b4ba1a2ed3c44884b312eb72c7667bcbdd9e481165d5dcfcb4cbcb3bf4a01640f8da9baad7e76ab2d7c4e8fc9f1863ccfca6d3bfa45ccab42f4da51a5fff3a3de6e79e092e915d722d55cfdf594a6b4df5a5d69249cd7dce09aebc7b3f29f7ff39a9abcddf9cce3da5d39d4b8e3d964ce7392f2d1e19e3ca0a86a420887ca9bdd79eb9e78fa5d43431aee69279d0875bb6dfddfcf692f2949ec1d5c41863e885386ee9ded7a77dba1832f99c169721308dd97a7972a85e82f2fb33db2e695b7dbcd69c8fb100ba4eed1c36d953cd879a152cd5bc7ed35b70b57aadb9a10255ffd2abaa5a870f7a0a58976a123a94d0a5b65813a3737e33631412512055a74387f2bd8570361cce63c428e404ac094ae77fdbd0506eb05fbea552b7e77e86624f4dc956932e9f6af086196cc2c91e9b0eaed48d411f65789b6ff6ea53bc1abb152387f392c790f5abddb6f56bdfed4e17221f1c2a3b84c0c4aac1b7efdc75b553321cc2a4567fb186cf5dd3c4f84cb0df4faab66d6a4ec53ee3c5189ef6a7543753fb6a6fe21023b11bb0fddbda995263b82eff051b101197fe3082bcdf9676aed666e3b9aec9803631422049e74bdaccf536f5ed9a18637c96d7b4f087488c5f84c1deeec1e66e2d93ce4d258131e7949d1c6cca6a3147c4a57fe588ff5079221d2623c6129480f55add382597963e093ba0927ea4c51c4aa872f779a6f5a11a6c351564edda9b8d2f5c21f35765e9526de7399923ef9923ef9d11f478c5a694f2a55baaadd99a1875f0f05f95eb27b7d9effd343172f843e4b9a507dbb1b8b9f2f4d43ef90e932646df64bee52514e3ca4b07478c2f1d1ea2b23a52e25fbae073a56d2ea689716565e5b9a87c3ef44345478cfe9b96cf875ad839c6cf87361d5079c99c964c679369f17c3cc64fc893c33b1b231d974c0270a85773bdd9ae977c5d4b13e36a2e9910cb0c01099c3384d0b129df74cf5ae3c970382c637cd911a3d323c618412d1e3882a59e9874afb1a4d8d99cd393096d382d201c2badb85d33b66e176b565d78c19e64eb7e21b335d96a9a95a45c5e98d302daece0b4b06c54626c61d9c4c8e2d209a2f26652cc5a7f7b9c9ef2185f0d0fcb8a081ebfb7bd58334d6caad2c44fac1072fa9e9b56394d8c1fd648114076b8ab992fe51e73dd9a183f215066e58c943352422e2c1d50894f3a53eef7583684b3a126c6cce786639b5482aee93bb76c5b1363a6350675e963da4dfa92f035317e68f331a201b6ffd694ecebb5575d6a628c31c43263e4c082fef8d919fa27c68c3531fe7f260f055bbe67df991cbae4cf1223686642208f26f3317e915c136339b927afb5463c1f223736f53f5ccbd635afd49e2646ef7026e3f118635cc16163888a7c338c30194194572f86ed8a79fa6ca68991486753848b10b066ece9ddba6cef746962ccc4b86eb0783c01e842d364be5029b8144ac63431c6a86cf493dda494dc9e9f7cae89f1f31d102c56357f4ee7ef94a5d4c408f27f50c6ffc86666424f24c69514100b212346168f77f813a306c41a56017d80c5e3c910f9643201e0220372f9643212d8c2031e88400738f0810d48400316c840043090b2c50532608109548002149840062430432e1588c091d7643212b461a10004581eb099ffccccc713620a3860b50a34e0a5cd1cf11809598001443a1b0d8835290bf0800252029c16198d0c716710a08103283580070a10f27808b0c5006c0880880702f001002445e1e2e40226473e02259b4921c1848efc07221457986082149867e18e8909265ac10004741181362d5c002e0001223bb0810c38222eb6f0400738b0010d6400032917a800052620810840e0010e68000316a08004445a3c2025d2220894e802090d0810d9410d64c0114551f48128c2bc02f4b9f1f209753e042dccc2c3097488a2e83b9e2069a4a4113da1141b29d146ca74020c9c1072821929469a208b288a52a247632425c626d8a1095948e3f3e191464a87533a9e9434b8d8a2853f463a2e31a601d2845ade534273e32911f4b9f12126b251833b92090c6002880951282362d0e746184be04411c6074900a208f34544a413e22fc2a10c0783c1f0f8783e9f288acce0c98440cc017d6ebcb8b412d010b1c6484af44f097988803e373e1fe26ca6121aa0851230ef1ec9ffe9b8a4f8c74c442786400217a2774fe7640231e8a8c0868d152f52b838e29b2d42f3c388647cc408cd0f23252525a5a38235528ef826f344fc3345247fdad0031e9824c2c8774caa80041cbc94c08b95f99c8c733c273fbc5001414ae739998c733c5fa204942c84409ee2851729f263b285179ab2f20235a24de9c28b14cd8d27e2ffff0935c98608a838c1901f3a708c8143478a4aca11df04a0a4c5c40c9331809884a1c3849944208ac4e8fcf8908ea4468c2cf2480e278345a2e19d32a2088369e1cf101e1ecf10d07f0f229d4d103234d20588c733c4f3e99411fa785a76fc0b36428e301090ffcb233c9ce3f1f19ce690274814617a788678c7c5d323e409c2399ed39b1f214f100ec7a5c727d429c3bf53c67b826078ec2083c37109d229c33fb461d9841145911930f1f32097cfb7b808e910d9fce7d5f00809c222d18822cc4a4a47db1c5184c1b15ef8f3c1e1dfd9ccf74e19ede1e488224c23c108a295ffc88e474714619cc4f19cde10e9b8f4e8788278d17199518451d94c31382288224cfcd0a6b399bf238a30d0399b33b8d802f4b991518c247ec08328c258c0059b176c40cfb2f1b0a484d8c8773a2c8257c393027a11805a9012a48b147f0ee78da4f0e43c288d28c23c353621e68036443e0c0ecb4d47237f088fd0a65306873772e32e250881f8c308e1e04f8f50e79be581bcdc78cc60f174de593c1d4f8be73346873543fee3011245911930ce9f8583bc7470300b835cc070ce46a3e385d311238a30eee5c1c0b42fa2288ac5cb0e87409d1fa1e770d8cb17d1f4f26060563bf2dec12cf5f118097d27298fa2c80c9814fa704b1461f625b4e1f0c78533461461d484c523e43b9e20abb9e41012448c1f43740429a3041934700049e91049f1745232a0cf8d102c46013b6044146142104551006e44118b0b28e531281fcfe6f3a158b484e1d068683034161a0a8d84c6a2f19ff71145982e1e1aa0cf8d900b4bfb6f3e21941c390c200403443be8800e74e0052b38a1887b4a10819103154451b42608c2091754524ad65831f21d7763bb90af0687c32c208c4651e4c5242211456588410220390045a48407ac20d2e2069a288a8220e1080928c24a9128da18204a238a7c3ca77bd351400a222d6c008128fa7ca7b34911414ae1404ae7399ae20506523acf1962c4a3a30504071a582202b126c4633c0b778874e49b01dab4e0006d5a98d3c2b2017d6e24e5e2348001e8379fd08a8a7c3332a01feee94411093e1fda9cc81978144504f80426eac1ff09817ef3090189a22fa228ca445ac80006511463047d6e705a5836197743bb90afc60b7f3eec81288ad088b4880124223b10e96c3e1feafc1e0a41064c1a305788426488960f818a480f27a5b3f9ce7f9cb3d1c816cf90d8f981430a1820d18d972fc221d2d9d810800004208001e448b9117ad04be8b3f10fe3f816313c415e7103b4e1cf8e2b34e14121f0d7811a1e16010ca0e3f1805a5a3c1f0f81f83929214e7949e9e0c0810315445184880078668dce26251e31c4914d4451c48af062124535a0010cd688a2a8232d8c8022c421d016bc5386e7f32878c9d1f16c401b35363b3aff02cfa7870e1617964d6703c48887f3397eb3c3392e9e3340de71e9e109d2f9229e2163788210e96c3a1b6679323ecfe2c271710f9030429e8e2624060e06b9e4c1c3391d239e4e914e19a11697221e0f07d47149e93017463c9c971de6706f9102fa9f2fdc12da7036cd9d1fff7109b94c508a73a7843e9b4ee9704ae7464a87f99b39386e80fe8559441045181b63c07c60e5b9c448a4b3097d3c8d23c58535473ee5e5e3617996144c1491e185e3ef1ed9f994ff803e375e3a0302710b17a228d2445a7cf01045180b843adcd9b06c3e12b4f1141697cea7f88605c446401e1f2481007d4a1a41d248f93f636fa81ba90bf9ee915dbc84361f6ef187cb58fa8018e4f23da19697cf0a925a6d05ac715e8de770588d4c6c0171389bfefc18a0cce75b62949bd0b368429b0f675a4062e888228c169ccf8787f4703838381cd6e1df21b21102daecf0ccce8f28c2200063000c02a208738028c21800d31b2f3ca5b8c4113c114511e6079fb800179f13952f44514412068f1164e2071ef8c12aa2282a69c01008218a2530010e8688a2e8c409496005061151162488a208838954140106b058c2255c1445254f4803004dd0fca1059388a2a80502182d5ab408416404086788220ee8c361e95137f6c676c161e7f74007f41e27830d1d09a0a183830c9d8e2221f4a0b34614451088a2688b48035b78c009222d3a8288a2480ba0cf0dff10e83b99cf87361916cf67868e7c08e4abc1388c4387288a3c9f7f41ca4ba7bc6fd4d8384778d08208694411a600041800460042425f446e422c1be6e838b2c1117a213e5e8810efb8cc004451c4a0fff9e292834867e31c8f8f1f9f576343e4080f00648e30cbc7d382b2a3b321b2f988f1e1e7e8f87842443a1b9087a323d4f94dcb46fec73fd4f252e288cc1002bd8b0b9e8cceb788a1c3c8076961f9f88822cc09876508e461c984388331c194b0c82321d07b144569bc7c782337f33bdfa0d08340fcf9798459a20843f289220cc6379997cfbbb8e0411d4f0be8c978f9bc8b09fc431f4fcb737ec88e28c244a107817018e18f6b429b337af391a0760175cae0705e039a451131a22892c5e7c3238aa23462018b57b882155114ad228a22554451948a534451648a288a4a114511294411455128a228024514459f88a2c813511475228a224e4451b489288a3411455126a228c28425a228aa4414459488a26812511449228aa24844510489288a1e11459123a2286a4414458c88a26811511429228aa24468818334026efedc77ac5f82d086cae79ddf07860924a730c5fa395dbd5aadad96a0d4c448520a5e49dbb6f6f518645e4d8c3e484851009251f09acb7a29e7c4d4aff21dcf69178f3b8928946cea69dd74fcda96f2ce060c151c24a170eafedb10f2baa9dba0f8442b5e572bb54dab1aff16483cb1d059377ffdef4bbb13aaa4f27b4d7ba772f84f20e1044ff6d5966bf02d4ebb4e20d9c47aea74cd36374d7ead9a98ab92ba337d6bb29d539264e253534db197beffea1a09269ad3746ec9a632a5105ee2adc6de5367abccf15b9a33482ce1fc13544d3a645d70b94a4c5f95b01faa09bf156a280193ea5f4db9a50b5f5d13e34ae82731596be61e7c505f4bce3531c6184f402289f6f261d29fd33531ea2089c4b2b6e07a6ae9737e5d99ce6b4219202490589241989e2ed6a47e530bc923f6db6c2e156c56b6ce9ac692c7c8902fc29c1c2a322071847cdf6ffff9fb544d2a22248d60497a3f4f73364c5be43f0c95cd6748182a2a2720618464e8d6b3d4ba5f53872b61a890806411ce5ba64eaab7a77afa2fd2e9902882674bcfeea04be76b08074812b1eb98a5b9af528e1d2a3976f84b6e11f2f260a80c214104b7a4166c0dc2f99ab56796e4103c934bec7cb29373e1d3a480c4100fc2d4fddc6bcafd5ebe48c6ff478c2b24859012aedea4785d7aaf5713998410ee9653c7acde6a6bbb577ca8bc3c181a10fbc03c8164100a366fce4cb1e4d6254722886d8fddfb5beae05c2b69620cb9b06476401208f80fead3fde6da54d69a0c8841386e400208365d4ad9206cd8da946e06247fe8956dfdcdf65ec1574c08891f74d57bd225a7af6d9b521323cbcb80a40fabd53fd8ed3c2dc93c8d80840f53659373b2a40b57f3d5ece15d6bc6a67aaed664ed80d81862a30718367ca8e4d80144850c123db09d70ea2fc66f3d768d01491e946bfa93c1870adde7e3f087c70b48f0e0a4b756f8bd9a9f39be83affa5de57a32a73c5d1348ecd0e46ca8baa527999ceeeba0187bf0594fde6fe94e13e3cb27d4e111eab06433c820a1c3ec56d0f9ec65af10c22f48e6e01e7b4d25985a73d05d9283e4f9a473cca52bebc548e2f0bb5cbb97987ada6c190e3d77b97bb7f7dc0caaa6b3217943cf778f1793ef0e195c6e50f7aaa1ff53ccba5cdb007bc9670bddddb7dbec61a30c1b3f545a184888393d62ec7c28c49ca9f22161c32ab9b83d572cf52e630d1a2f0292352cf85e9d4fd8acde3fa118fd55583c9f1e2f9f21d143a2864d03091ae0d2d5cd293bf766bb75869d6fd5eab9da92ddee9a1849ccc072a9b5d85a4f5df34d246558eef7584339d372eb960c29ad4dceaaff41e88bc720135bde6bdb7a6e9f849a2511834ae62b216b6fceb92d6962840149181abe526a2e9b2939b81c0918b4274c8b25ab6dd79e6a62d441f2050697b25debabe0927079619d84ab5677f3d589bb074917b43df7e6adae909b4a122e24b6ef3bf1ae36db7b690b53a9fbfa6eaeaf49b12f86a8bc0b87d520d102eff62ec6eaced9b50c755e8d5f610149165eab5287ea3e35960eb1a08db9874f49e8cb25c5245778beaf7c59314faaadb3022f57fba64e7d6e77b526c60ca7b953468c1c0eeb60024915d8d2e4ab49f8d85a9fed1d974742852617dba9703595a4eed4c44832857e4f9b5cfc2d2df95e3531663a653cc6062452e8e51a32bf73bfa22346154c1348a2c0ae5e37ed7db9ea0d6a627c8e6f321d0fc77f74c4881154c4e3d1a48038850b1bca630b154902855f7335d5d6bbf9d292eb096f77d97fad752ced2b151f244e687eec2d37596312aaf5b409fe7c9983ca1f4ed654a93241613776d630b1e6d6722f4896d0dd7ed373fa4d719a50098c75927071823ba7f4e6628b1e2449d0d5d26d6a2a95154324b8e4d48d96ae35ed5e90e911dc99d5dbb573934a698de0503ae726177a6bc9a916c1a95b373ab1563967b3a7d2adac20052c202142532b79a996d27bdcd21cc24b50c9265d32a8ce0c85909a5b377afacae78eb9996482b3e3d9fc8831a5802408d03f2dc74e3205753910d872ebc6aad4ef6dba7d92e1531689c60fe062385d652f9b904de683b51ad46e6e397debb90a8b4423c69d243d788dd3ece50bbe6ea84be5f3fe1123c6334878a0ccd7fc552fd70e9c7be9c60a21d181ec9654aa255f39756ce6003226bff12eb94d3ea84870c0f82d73a9cd65723566243748b3f75df2c95e17b644620387db0c55fe844db59c243550d9f259bda99fcf956b0d4868b0d8aa1b102ec3a5899d7bf13e0d1a9859bcf6dc7b6ecedf5bef4a13e34a46816064017f366bd59cb3d92f5bd5079858a86c269dce7e6eb9f283059c70ddc3e4782df93ebd42beba6d726e820c4ad6342b2d9ecf8e185b3c1ff781718583fc8a2df86e539a2cb562aaa4d6b1e3245d3ab533c0b042b66e6fb6d9da29c8bc470e30ab78add8ec36d936f892b9a454d1bea162e6977aa5648cc1012615abdae467de8fa9d7d8d3c4b8528218836050f1de9a9a9e6a6aea29753b1e738a7706df33a85c7b70faaf668a7749c17f4bcea55c5a0eb1dc705a5cfc3dae0930a5604eec3f4128576aaf15299acb4d4aea92aa0ae76a62ec3c27235f8d8ce3c08c42bfe5749ae052cbe95b93e1705c7e7cc498fc619861030c1b211716961ff3c9980446144cf53198da3fe7143bc6c516a1686bae6e4a155bcfe04a6d41c1546763cb67f3ae55fc5c84603ee1a673d58a5ffd5c0927c7e3e932309ef06d6ff8ebbabbadfbe785bcf0191e2343621401a613bdb4fb417fc79292e9710226973c715adadc796a9b78523ae9af35cf953a77e5c7e78b7c982583e9014613ebda9363a952d2f53e9e964c0bb3ecc064a23599feb9eaf64afae73f64c448020c261e365c6b7152a5dacad6ac7cc7c3d111e3773c1c89c3460fcc25263f099553eff1eaf96ea5c70a0e9516602cb15eef6abb9cc276df26104c2564e2d59abbb4767bed91efc4b812e3182aa10da745c827c4020c25d6ae76525f92ceb5b927d1a46c73ce55d7ef498792785e5df532bd67b9988b44af365d3dc98da94ad5209160aba41ef3c7fa945c8f9070addb67ad92c1d6c9118a49c77465729adcf220292218928233308d6877df744e3667af299711ae4d1b32d656ce26153bf23e3e6fc41386c22c623f2565e98f2db6560301a388d7ef0caa36f76cb29289f8b750fd924e2af3d632473c46423d308898cb97f267ac4a3d7b4b13638c190ee78dc4b86a940073085fd6da995abcafe1274378b7c2f7f857399842b0a770d35be8925b8d6d0f308450ad20f4b66d59277f3b043388e494cdf5566a5ead1a042388f9a0ae55e993e4d5328d81094452aaadc365f3d7b16517ce6c1840a4a5f6bbbf9bd2b6d2d22ccc1f9aa5d7aabc4d06d7748cd34cc413c61321e209a3c5132446221e8ecac3f8c1c9349d5aefef17bbd9402a8ce9034c33a99c50353ff5dc0361f8a070e57a5ee709d56ad6983df084dfbf53579b53613b82d1837b0fb663eb395feeb679f84fac14eb62ea57555f3078586bdff26b756c7973abc1dc61eeb37fe57dcc566a0c038c1dda659a8cc9b69e4c4d360e3075505dbdd09f5cec4bc13f82a103e4b4fe947bd5a54931508c433073988e597bbfc9d66373ad1f122307c66037a5d69b9fbe4e0c0d307150ebe05a4caa35b9f9aac6317048fee0735d8da5d7da6cabb9bce17193eae782ac6afd6bcfecfc8801c60d0abe061fb3f35d925f9301a60dce256475c6967f39c79a18635cc1d11836305fc89f9abfdab76f0d0dd99c6c7d5a4d552f03bdf01820178c1a563b359743ff6d658fcd505901260d69a55a757638536b4dd190e4620ace34db35745ddff232e425e48239034fc7ad4da9da33fc5566780ba75b0adbc2d6b4189031d6aa11e3b3f067627a8029c3bb05a5e46e53beb4a1cc0a86a440c507860c8ba72e4cd0ede495528de15fb6c6186cb8ba1faa1876b9b7a6b6ecf952590a4373303d86adfff5aa7a302c0593d356fde4932c4d4d8c3188c17f5c401e8e5c638d18df5d38ff69f9826aec1aaaee9d3df79917d8e1afe76dedb1bba69a1855305d589b18b25ce5f39d6a6b860d3054629401860b93d7af67493687ddbf31c06ca1d59f3a27d5594e55416cf8501902460b4efe27c6bee7eefcc71ce21d58c06441616307ffa17afdd2312460b000df54ecaa57b9941e5ea1f164961aefbe5cc97a458509182bf4337399da648ebde75a157c5535a5aced6253bed7c4d861ce188ba182f29baad327e6d3212f9522982974626ecdd27f4367ca7560a4007b395cb33df89f74362460a2d02afd642fd9540e997250706e55ef544f49f8e44bff7103cc13d253eddabb833331a70aa3038c13a4ebc6143eb9cc7a629a00155b9e16fe339652934a0b304c689341f92ca1bea95cd9fc1d32c697900ecc12761bff73ca9ae3d77f221825a44ddd64ef4aaad5d24d8252134a574cbe7333b937468c9a10b7c4f8124a182424a74fdd83caa5a9ecb50c260f9823b42a26f51f4b4ffa4eae34967c805c30464872b1aa5b275daaf9ba084cb683afcaaadeba6c0886086ce9b3dff6bed6ed94426c9861030c951606d2c22c0f3304a6fb9c74af4c39e9fc3b3186382424468911826a4ddebc98933ff5d6c4f8031384768d575a734dc6d653100304d59a64c92974f556aed5c4e899185778645e421b34544a80f981fb7fa74af9ea26e7835f3cd753d55c33bfd21589e9c1940a197b93955d3b734d8c1fe3bb27488c31b6430c0f9eeae41fa3706d6e36de24fb41d95014abca57a765b8547aed11e96c5e769884a2997aff5663a7f22907353730018554fac9b909173b255d73d8c0a1126367c31af989a594748b994dc836ada562e28996939932e58b5bab529a18bdf342dca413ad2f3166cd4d31b99e3e1e8decf07f4860c2095fb87c996bdced716f42dd4b703275de1a4ef934e1cd89a5ece61c5c5e9f89f565bcfc6ea5836c35cd0e134cf074ed958b69f76f9a2697604d1b3bc97c26dfb4890c134b3c377536c554cbfef4d6874925166cf046ebbe56b79cdbc5a94d28e1d4ff4afd6f5b7bee5de885984c82d784cd96a5934a39bdc63f62ec309104b7066792adcd0d134c414c22d18a7b7b7d1bf2fbdc1d269070db9274c57cc1f61a04f2c2e4116f3194ae5bfb3793825313e3e2c0c411aeee3d25fb3de9d41f6a6274c1c7b8e2021e63c4d8c222cd306984db6d50a6d69fca4d4d8c78acb1b5d3bd97adcdd44c16d16ebe967edfae4ede07c4441153c9de4ed0fd2ec90f13f1e07b72364e69dd7cdd10f1de3b7775cd3915746ec8172687504b39dff932a94a6d394d8c1b151689c60f134398148235e7aad84d351532bf092156314eaff4f53567980cc27127b99a2575424c04c1dcf4799a6afe6afe4e029340385bfe891b4b8672bb57fbc204103fe19ccae7cfd4d6faf4875d2a29d6ce3d6650be663e9e8c11fe64424fc4c40f909d39a926956acb96a7a50c933ee84b093aa74e13ea6bcb62c207d5c6cd15af74a8dab63db8c4bcca2fa792a97dd3037bfd5e50b69f6c425e267950edd58dd95be7fc70e2e139b6aa29d91672e375877f3029d9eede3f9bbe1d649372fd5cce6cb99eb20eda782a832f973e7edb74e0b49662dbce3b95399c03b74badf9a6c75a72e7e4e0f6b525e59cf0675a6dc5a1b1fa4ebc9cf436a12738bc77f219db769792e27d83636be206985882ccf5b76b43394ddaf0ba1bd46736e1d2c9920d0bc2e9f337bd9a6c2a9335b07bd7d45a4f767bad654cd4f0cdb972aaedebb676c234b0326f9d1273c552da4783fe73f6e7269b26462e6cf88f2d9c6072863567eac76a49d58a1d3483eaa514ff928be77cee32aca7ec7659754f4f4f01c1840c9297522d59b9b97a6ebec9189aa92735534bdb94746b2286a7cf165407dfdc9e92352ea08c4918ba17fc05a1db872bbdff610286b9af3d3fabedc4edde13ca68402e2d61987c81a9e6b3b596be4db51233f1027c0d654a4db125e55ced9dcdcb0eabe11ce38a8e229243423e1913987441dd635e6c1533f692ad26c6344cb8a0eb2de7b72e4939d96f614275e7af935b139caf89310c132df85ba9f17c2fb9a6724d8d49161cd3d91e6b6d39ec87c9040b0e3e4c69f12bd654a7da5859b1b1f25cb6b0b1f25c3e3b62617205d798fe4ac92a31365f32b102930ebeb576e7bf572a995461d7ced5a654f66a99950a4dfe54af7ed52b7f4bfd309902abe9529b49269602943f1b74fd268490d9d2ac7c3c217e814914be616396e073dfeff44ca0a05c21cb965e3f053bb9ce863f9e3179829470219b922dd7b049e884e9e0c3c9d4724c597ba789d103ea7874bc983461d7cbf652e2c7ad94a9091364b3267fd0b172d5ee352b65982c81b99964d81cf232574f235760a204f6784de59c7beac136c32409fd7eae756d7e2dd73f132430b7b7986afd3d42fab71eee374b4f95731323f854add7bda7b46fe5dae0a1c2625284a95ef3768bf183d075a97866670d1322ec3ff69e6349cdb6e06f58362b406ce8b0314405e41d174f0eff239b1e317e3ec3228f083119823b08595255acbd72652204b70b2e57869339f4a53b3009427af97cb7f5f49eef12174a860d35c1169c16975006062640989fd6ddb2af9b4971ff80a5261393ab1c848ba99af8805b2ac6d493bad0a9f297d032e981a6c52674966c77b55e334c78f09ecfb92e5b6bff9093c90e7cd9bae6e072b7ec206b31d1c1eb345bd373b5ddd4539d4db3786432c9c162ac2d7bf796716bb834311ed9cc678283fea52677f7be5792491e263780c9bdb135f549971a261b784b2efb41f8d67dbf167201f29bcf9021263570e98f57ba43d84dbea789f1e3c97c67c3e96c625c11c38406f3a9c993dba92f566f352d99593cdd6750e16b6a7972b04416ee75eb4feb57697694c462a54cbd74bde96a29960ffd8871e5853f1f1c38545478c4a822df0c0e875984c4a862a404169ca0b37313b677e75cf97b425ff28ae9fef01f530ab99d95182aae909f145caae9957db71fa2127a211a10fb8025ad988df93d742d9d36f6c98ad6f6937752aeac494e4d8c2da0ce8647c92a5c726e8c9de2f7d6d34896b144154d993b259b4ad5c418e2cc4a492a1a536eeeeebfba316e54b4d9dfd8d437e15b394a4ec1dcbf32a65cd75b9d821253a85a10a67756ebe92a2b8582da2bbdb3247fd98a8d2e9490825fab5e6e7da576ea5b8c2095314a46c14efde47dcb5cee6a86841251f03fd8535572eb99c7b8f232379f37a38c9250b4b6cbc5cbbdfbf9ea12507c6be2f4df7c7b954a9f80eea91bcb925b4a327dffb56b4b3cc1d3f56b8ee563b02d4f4d8c669474422dd5e07acd164c0e27e444afb45a29b7f64b19849a18f9133af29a924d2875e8d69c4aaac79c743f5442ff852cd104dc75ec8e5bb71194644232e9bf78b9b4e02e6b2bc1c46237d35b5dddd479b3924b2ca7fb7829fda4ad2b35311e794d89259e75f9a5c6e6379d2e6962f4945442e57cdb64f3fc65a75c13a3094a28211bb35cfbdcaaf53b46c924563e742e29b69eb37f2689d76d6aab92f03597e4cb9248f8ecd5e0f4b752d2fd2652028987c96743675f3fdf27969247f4c20455a7279b9b4b4123943802aed65899e3091b2159a92ff5ed69fe72c5085e76eff5d36f2d2d7d8b90f3b9a4bc98ffd4e5b3855b18880a4a14f1cf76f73df8e67370be4a114a129194724e39c1d5dae2264b10d190f7a76a4b1def4f2f39446ad031974d17f34e89211a634eca94be367d991d79efd87095269414a299f3c3a458257fd7241a258448cf2777bfe652fa2b1ec44aeb35f9d0ff137c3071b1450a7c940862ea532e5f595f5b53d7c32909c4af6c0bd5946cf95dcabc12403853ba1e4c6eb2abfa1f20dcc92ee16a2b534bca0fcc98f2e79a42f90e26ed8392cebba77bcb565a2ef928e183ef2f9ebd5c7aef9cae3d38b79ce13f9838c957b2440f4ea5c2e9d682ba1264b3240faa95bec94a4228e15bfd82123cc0e5a95c7339e1b7552bdf0c2094dce1217bbcd27c0b726ad57678a76daea57cb66e7a85d141491dde33de6e6fae63b89e3b9b32543ca1ce0f2f4ae8c0164af65455ae620bb9640eefaa70b2b24fb5ea4939404e4b533f65b5e46fc7613da8aadfd69afa0fb294c0e1c1345b6349e76bfc98b694bc61a9edc79673cf746a732eb6b0a182c941891bd46aa96aa5c53ab9d4c6c3c60f9550c74523a448491b363d2ba666d2a7dde6beb42e256c60f07bdfc24fdd2e75aea139b5a4fcb174b545891ad284ce92fefb2aabe21694a4a1e5bfb4ca9282b2798f1234bc5f8db9aa656d2c695341c9197ca97790b1cfd70fba45a3c40c497d2639a1eaf2f65a65505d1036847397901232b0e64bbd345d3526dd1719256358770d5d4b73b919f70f2911c3cfc46d972fa598adda0c88332fb905f4f24542615095493e96124f85c93fe402448c1230a4b9aafeb2797aab774d8c2b2aef9e202a28f982522eb95b2fad722b5bd2c80e7fda0bcd3629d636795b6d9f349a922ef0924d7d3f5baa0c2a6b5a3c9f122eb8c470e9da86cd0edd6a625c79b9e108d902439f4bba3419644eab34314e7e4e8c2b3e546489165462bccba55227d5934e13232804628e0a4ab2b0d0d95b394f06a1dab0b08481a3040bfb9ad49b09b227e76e5b3a66945c0126d5b7d8316def255f9a18399ce11857e49b11248d122b40c79c2fe738ed324becdd13e44baae024a7a6dabaf51a5366ef9e202554d8fef496bffae4d2db19a30b7e878e9229a8f3d5349bf53d3515865c80c0a0440a2bb5fffe93ccbdda4a2551784c9bb5dca5dcfad78682329e132e3ba66f9f73c9139ef972cec15d8aade598c68c1227f47450727250265fbbec3f4a9af098be564db25c4fee7109133cb1bbf5f978b532e896a0040c942441c8054a90d02bf1bafcb4bcd34c4913e3f4643420f6b14a8eb069c1718618182831429249b526e7bef6ddbc4a8af0ada59974d5a9ce5f2582775a69b165ced44d6599d01309fd17b364089f1cb2f595fc0e5b2995e7341791afd131851221402597a69da9b5264621254100c20ffcdfb5345b3fe89cdca989b1c4079325c758da09d33ee659d203e54dbdd4de521743090fa074b339b9ff3ec9a98b4b76e0e4ab941c7bf5e4538d3d253a00a594e44032fffeb6ce9b9b4969090ef49f5b4e299996bf53a68931c6151394dce0b1326c4d5bf93e98541363118f47c3f18d0f4a6ca0ffa69b4a5d2d55ceb025c69597500b0b8f8e1836bcb301e3e5f32e26b061a30525359840090d949c3bdd52b29f6baf0f44320b4e4ba9e98cb5753c9b8d6f38ec051259f054faa6b636df9bb5a689f10624b1504bbdef730725536aa515fe848ef0b06183c3611d3654ca88110305125890bc42cd999aee4e663f7f2a3214892b5ab198dfedcf275f5d3ad3c448c28a0690ac82dd4b9d2dfbc9b7eb5cb322860e1b200e07870d336c848e7ca8e3d161e3d5d8d4804415fb3c257d9f2c57737a9a184940928aa6a9adf7aa72674939092a1e6a5cb8eda269179b34a56c91a23714bbb11538c1bc74170588422017324c304f845d887498130012d0e7a58b7b3e2d020012b5b0c836416945e841ac78353c2c2ccf02009455bcb448966741415185ca640280920ab509713420ce640480820ab5097d34204e2623009453706325196c8eddfb2917088a29b8d93e6bedb9df1f27cd17e1213182c24029c553b8eff519fc9518dc8c18a498e9579ab0f725c76fe9286693df58a9263fadc44a14c949b59a42a714fe32170a35d76c133a3fd89e540b144dce85df3a1fc3c92b3ff1e939b78ae76b2c392f4fc097da26e85eeddcb5be130b3ed45e754cfe5b2c714297d9faa9e0eab657de84da6f0535419ebd1a639a504f296eacf12f6eddcf842feba5ba789dfa3f63c2dbaaa7ad15f357cca54bb0d7a48249e5a6a98aad06c512709737e97213833a57aa84d3e4524a505b62c8f629b1a95f6ba558fb24526be75c72c7eff5845212cc0d7a7a8a41e6a0ff8b44eb6fd627593d4848a94eaee92e5d6beaf688c476f9674b72bdbdb91cc1fdaea64f995423e44af786f355ad5ad766a030c27bf683ad6df37d2dd317288bf8e5a6d6b9dd54a689c14051844a10ae94ad74cec99e27e23905e17b72a9ca04792162bef4e483cb9f7298563a84520b4ea789e99b3e1f33446bd2a9f54f4a57fd7c1642766a8d7f394e50f162427837db96ef9f1a264e8370cc31e8d237e8d6b247114493fc6e55fbbf9b2e3d9440e892ad4c3e5669654f06847c73e9aed4857f68eab9e96be17cfd6f991f1c3ab9647aaf5c2e65fb03a50f6abdc9d6cf6e727943c987b54ff152cc29aff9aff7c0ee56b973effeb83947d10343876c4a9514ca5e9662f402250ff2ed92bf4daea7507d62ce0850f0b0702ec59cbd394d4e7d51ee90927cf773aec54f7a6b767829599b5c704162a0d441cac94ae1936b39a81443a1036cc75aa5c46687e64603caa0ccc1b1a7cad6d7af279b7b463c3a629c287248aa966b49a65733b173287170d2df67af520837a54581c3d4e5e44aa6ebd4432551de00953fd7d2f324e15ad30d492e63cd35b65c2696300c9436246f69e12a08d54d095307850dce4165cfdb5bfbcbffade1c1d9b8b56763271fa3a84136e65232a6509f42222869980dba7a4acd94bea74b1434bc2475cad40bbd49b75c07e50c9d7e31d896ca5532f1ca7ccbcb901c2a3388467ef8411837a098012ad8a63f5d69aefa2ec35cf86eb27bc8cf1923837c70b6a70e26568c558fc131b83c5be2c5dce2b46268d35db59accabd62b158605593967b375ab2519fc0fb7a4810206a69eb36ccc5baf06dbd37c5280f2056fadeee562eb586305353172f843a04c118e4ba300c50b89d5f23a5567069d883f91cfb310e96c72384a17dc196cf916be427d6c6a6254a348c60c3080907801850bbacbab4d28a5dc750735285b600a273ba86baa5ad9a644d102e34f4bfa7be6285980fb2b255fbc982646100b7fb845080e142cfcfc9f8a3d98f413db47b9024ccdeb93520b97aa5b8d15bcdde56cd95e3535330d4a15dab57e6a8db7d9eaf6c440a182842e673b66e94c4da9384250a6a09493b2dd757e4bdd93c2e46e6faa666f2954f281a2d0f6dbf14bb6ca5e4287423bd84ef539b8ea2d7d423763cb579bba533de63a509c00d964d8ef9c7b0ba1a62f509ab03df535d98bb1f5664b4c902fa5d6544a69ade90d97b0debfd6b37bfc74ed54422b6ec834ed27f5e75a12d4540a2183abda3fa6bc0305099fbabd2a6b9adedfef113cf95cea395790fb41453102c39dce4ef957a63715175ba8284a11b8296b3b39a957d8e62302744bad7bac5ff2959e030da19f9a2d35d7c4522f9642e84eafc1c4e4eaf9b4a104c1f542f7bdbf332d5557060a10a4f7375b0bf71d9b50a1fcc07975b1c7ce57e14b89e203d91c4c337d62a8ce54f580bd74fdeca1ff83ebc113a0f0c0357409ae6bbff5246b64a0ec80db6b29ad9a9a5a2e569e50e7870e1c9b32a56df61c48d8dacd6ed656a5d75093d9cc39e4478f1e2c2036f2d231668ca0e0a0dd767ae72a2937339703e506eef9b34dce2d9e537da2d860eebfc9bc925bb39553941accf9a052c93b95746e8b42837d955231e5607a37ddd4c49889310c1c39c408e38b18fdbfc52341394e66c112cba65e49a9dff3b12cda3de59ce325e17ad0cd9358b8c397562d29d77b5a6dc1092c2483ef25297dad5ecee9e4157025d9694a7dde0fd39eb822a5d96fb9f996f9b17e1d25386945f2a64ab22a73ccdb72561ce064152f555a2ddd7450aea4709ea8626eeb245bb6675eec899ca4422eee991a2f05f777424d8c6a8071820ad814cad678f1a7967e59361a901a6bace1e3e414cab9c7bcdf4de55a621f7201e24e4ce1925a4dfd7a0917f27a9a183b3df4a414fee43276cd16fbc3e9a458707d3a7fbbfb2bf3289c4ff9d4bf753d5f4aed4414eb9aea3eb76eea52705d4e42e11032cbc44b290c4e40f1942db9de6a33c67ee7c927dabb37b854b5f6c838f1445bdf1e3e95763536a79e74e231fbe9bcee9413bdfbcadb4b5787eabb09f7563ed99e41d6d26c4b13cee04b6eaac63a1389359e9a94af5bdded30d1ea9957295e8ba5e7e4259e777ae933b15dce0b5aa213f3c66b429695804fb59da17c9468efdcf926d9dfbca99e845a6b4f242177baf5dc635dcbdbbd934848c64e356937b92d17ee4262bde5cdd96cc6e6548bd9e0e4116bae75f716640a75d7114eae8509b6b657df0c9e71d2886fed9b5bc95b72b3b13c678b13464ca9ea49b67465f393ade99345b8afb9543db9103ae7d689229e9c2eb9c2c7ecb9f53b4904d4e678b6aefae670f90411ef957bee7d5f63a6520fa15eb1bba9feb5d5e532f4e1315edc93e3e5c410abade19c3d7f2e36590bb1ee75976a7777c974ce1342a4a5a0beb95a95ba5f3608b9de0c3ea8cb25a594b99c08629552d5c5cc5b3fc81c88b756b7d5d649faa6b69a1340a86fbd7057ee7a6f7193c1c91ffaad9dea9827f50fb5854efcc03cadb2d458a50999ad3e34995e2d766e4e79c287f6bebd606b77c3c46ac7c91e78c96549216b0ff67ffb0b39d1c37bf5a4b24dfbed9ce5b69ce481bd87739553a88badab1e277880afb1c4d83f97eddc52179cdca1956c2edf41d689a9f52776504fe792eee1943b1deb933a249f2c556afde69b4eb917277458ce264b4e6aba25994e4d8c7c3287754cbab92cb55f90b5656324732287e549a5723dd5f4d68919f9ce9fc461aa4308613b93caea89052770f096a6cf9fcd2da5dcb99337347ddc92335606e57c5005276e58d3e173aad3a7cb491b94b6f94c5b826c504dbf3e13379f0dced7b09335b8b69458793ffca9aa6ad086cdada5eedf355c5013631ade7c53994c6eae5abb7c8c1334bc6350aae720a757dbf8431d26123a398363afbadeab36b19e0bc889199edc76ec6a5542674a65ca905aa9b5bd60d3397da91f2a9d0f754ec8f0968253595328156c5f276358b834296f4fcd666f77c18918a442a7be95b34efd260c83ab739f89df6b6ccd76203038a5cee1fc9d2b77d51ff40526174fb57ee7744ab2f49c782149e6e042e66f49a76a764ebae06b4ae7a6eae7d6cc05b7b43d3974d8e4b74b5b78d3e5fe466324e3099d68e11f4ac91a5370a74cfe4eb2d04ee1a6f50ee7f2e5ef18e116d00916a073b5de4cfdd4c91594b2769f5c4befe17cb682dc6e76d93cc125995a55e0097b657a4e1364c593e5840a3f5fb55ade8abd7f29a7901a5b6b3ed72ed5ead771f14821b9f66d31d6e65b69b56962cc60a2701205f786eb39d77ebaf3ba26c6222750f0c7eb3d872aada758ce969327787353d01f9bad3565eec4096a95576eafc4f45de326ac7ccade42c80cf6f2036d4e98305933f898f2dd061d36d0129c7d616b70d564fc2468c3f9d0466324137a224ad877b572bf395e8d2de6719204864ed7b69418ec954a9e20614df76b41d5e58e00dd635533412657a5572246902e5b7aeedd63d94d6a11963377289fdbe452bf3b21822bedb94aeabef4653e19425bb22997ad252ec18910bae77aad5bdb77f8e623721284e91a4a6deca65b9db3e500424b8d39bb07593373d3e3f9fcc90fd65466a88d4185ea2df3ce084e7cc09cbba4d4b1e41e6cc73dd84daba0aaeaf5e69a4e78009535b8a4aa36abcb79b283b9e633c9491f9b3b25b7e044078c5d8213aa564cbff1cb41abb78350b59554d7aec1090e52ef93afa5b3d7569a930627375049a5e75cbbb5ebe5fdc5890d54cddf9d4ab2e7b58cf138a9c1926ae9b67aee9eb576384e68f0cff96a572b93ba63ad89714563328bdfa593f9daf950d79b9a18631c81892ca49cf05d9f724aa6f63a16bce6f25b6f9dbe3575bd9bc0425b63cacf4aa9f4de539997fe8f2724a4e3d980402da020367ca8848ef08081c92b5ed792be9a63cdc1d7d626ae704ecfd4639dacc9c4b82224c81a26ad70a6ad94838b1dbffffa3061c54fb66f557b9edeafff55c8ff5d6dcd97bb4ac90dc34415cce684ae50e5b76489a542bdc650eaaec2d6da739a18a1092a3e39e6d2e3f7948685bf6324c3e414afedabe9ce3da589f1e51302bdece050f97c8c1925989862db2ba6e93506bbfdad492918538fb5c61af3df66d6c4e8384c48b18b4da6e4aef489936a4d8c992fc2a11841018fa2a844108623792410898281200642103a346604004311002030282412880412c18856ed1c1400025560546c4228281847439238200c06e3288882188661188622290ca2304529a70572ce17aa34df4519b01c7adfb7a2546be4a3f3edbc7e5df3f2a5cb5c3f82625af1a308da8ef45ac6e2ca9281651e422b142b0af118ffe4fe7dce3eff7758cd82664f96d21aedc3b7bd1a40c7d563f4b8c66ad0d709b6cdf920c3418c3db5712464af9c3a446db762b4ef9ae2649f5043bbe3b2e48ea356d0e93b19e20cf1b314592739d84d68bdf9a4e07da45aa4ddb8bba8843dfa6cc350aeccfdf444421fb812ee2287a847cc2c42237aab22c3ae98a332466e88236025aeceab87ed7d51205fa935693d03f85380d9b4b3ce38af92271298ab3ad2638e6a0c52f39f1fe77ae7772f384f4a694e838baa0fa71923de196ff15e5f4ed185847fe982544d99efc9b0548b3d5111ca71a546fdd0c1af0500053dcfd5a6c88e28e375ea961f44c2478065c30757cb50853b41d5453af7f38f14b8ac24a937da2f0569a62d3eb0af5ce8acdbce017b1774040ebf3bb66ca0c6a423ab648acae421b2872ffe1f3d6158d2b544076fe58e6242aa1e02ddf49b7a637a77601261eaa95373c43fc2e39ddc2eacd3f66446bc35bf0c6ce50df4932c7bdc0dd5b0754f66894c89755d4399793072c70c4042f44591636155e4922ded81a5698584ee496a54c37ab280bdb3cd8640642f6045dad5102cfb4ae6ddb9390cec444c2ed2e81c011f9d2d556c9eddc81b66d2bb3973aafc55dd79b9c56557c6f6792ef0a74482922dded87ff2905c5b4ed6cd3103894808e49f34e2c4d1f9d6730792534f0ce7d7fadc58982005eb8f80c01635c1986b983f03ad3b43c407d83e2a9d837f4d486f3b5f5c49ec17e5096715031b4ce374ae1d607df1a17d931e0b27965d2502d5d7a401db378d8705c8a813e20bdd078dce4cf4ff12e782a15686e7703399257342331d1d3c98c89576418dd0b88e0a5af0af9336dfab0caf7691d9f6fdba97833008d831baf3332694a9c6703876acd8638897d37563ac2f3e5c49f65b1354e29bc65fd31e199fc88c196d59a8c79545767810579a22f2e1e002bfe2c45eac9472fb1533ce79dbad6d39f44bcef35969e80742d34ecd995e0a7e34c00c87679431633b4363bf33d1207089754b495f55a1c0df1d574184a1d3ee9a99e425c4b9be4892bd334c11b668e0c1889db4108e3f195a1427a26f0f1e0f9411a7ab343ee214c0d21bdc001a6ae6a8cb4afb3d686c7575804c1c94990b7a6f09f74075b765d4ad92b50f7c4a9521f3c0bd986247c1649379dae0f16822d8bda98c42418fe714ff3a2cfafd2fe734b76f8922ec603493a8e08860963359e4644486cbec2c4d743292d60b14f97b652aa4a6ac6b69d771cc4a7b1c9c55f4e3cdd45b79bfc7dee5a00a34e7e5b0d92e7410dc8127586c0f8ad7f9dd53fbded2cbc434aa1c91cd50dee6661bb8782c97138ad6faf1fab9c73e63def36c0d7844095eddce8670aadd46bf45eab750b0e299c22f241b0f7f5c7f9bf90a3de24d4c3ff6ae6b732811b752c5b5d16356aa35edb4c404be84428b63d5644db51f50965ab573ab97b79c9a052017857df658d5af82df9757f0d14c5089af0930febb69dc9eb2eca574dff70f6a46bfee746451a2b6890210c2365f969cceb884b265cb130f4b5480d56790326d5aaad228c38db99221f1e359288b7809c4621d315a482e3ffdd7e284c0328a6d965970972825887ce6d3d0984323753b3a72fa8f8e248cd016135002c0abdfbc153e1bad27f9025149573b14fd6f75e9886e08c58679a1bb45a5da05f4ddb9be7a512f04a7307be432c6fdd2d9cf17164cc392a80db8fcdfd4f551892a0d5e97e0d429d8e020de8fa2b52df40f480a6ed52381d9424b5e91c645092735f4611e42340555b2b7c227b5b35da1206b881e2f5ab0ca69aa7cac213713de4a9c46a1a7e3e060ae613a7b9940faba873dfb07d438609e918c17204d673224fc2f5a9f8671dc1da5b96d58ef4af83e54b0b0e9394c9b2d645ed9fc6032cb92116686052ccab9cf8b694b6414063948b8cc30cfdb03ed62137792afb881640e9aa3d4422224973ce345216307c9bd51a2f2958b6da5d27f99e47eef114a105aaa5395a176cb6d1c092ab6bcf53a7164f6f85249cbb508afb9dcadc1c34a8299c1d04b1dc52da2ed3aeac41460cb23fde5ab4fedad4fb351c14f0e0959312cd4eca21bb4bb706e0c781854bdb804b014b405b337df436c25709112ac9109c11b3a451bcab6bc756af8cd5ef7c4577ba2be02161f69cc2fa0a83537250803d39a98a6cdcf238409cb54f86cdfe6110cd34c213fe254d149b45a650f436b1d8205bd18bd132ceb9755d0a37789e403f91c7420f59a0dcb78ab7ec39cd7ca01b63160a92781619c713d67d5adf91ebca97c87135e3bf535615077a535ed50365dee072bd2a470c6711252ba0da66433fdf56cd3472a86a46449db80c0aa5b8fac194f1877d0b0a949cb962b830c853feb2293a04ca7f7762e743469f8e62ce300869d2b29c21541c8b3e500094a026979cc12ac26ba50a6b212a2d22cef4ffaa735008bb4916c2d5a72100108df57889e377b5c8a5b7d88a9996f989063120d3e3dca0fcdc73947a78fd4e738b56771c895eb4599438fe60f5f536968f9e31d9f61a99c1ec2568ca6c6b525b9a22b36e56421e7c43af72e14c93e8f602c8468dfec08f92170225ee7057ba84259d6bb38ef84c23779ce8b00bac43985e2a1f10803b9764f066da14abf6549830e6322323a11356553d5f1c2a17a08eb2c1526751ce5ea3cb97f308dc8e0525226bc9512846a799a743faef154e2a42c575a0673981f24c81069d77f1cd6c0b4d9f800e670bad9ee8db3ac6938d3a40b24d5c5633417de31a35efbb203a8f6bea99837235b4ccbe3bc578e6d605fceafd2a13f2802d0971e16c177fafc47e602e68caf3e2ac89e0537b20c7193e4863508fd7f55b9288700227432d43f12b6999443d7a2eb3cf26edde8b66dcb0bc56409c61f1441065ec13ff381fe48de811b136480fe4ca6e4235b1aada71396d102730f3c5e227daf1b183fa16609028cd27490727066c9c5cda5172aabd26c62e547c28a5b84d09d873c7607b95f0c83b8bb09e2414269e3baa9a18a67a35ec9f969d6ff55589b6729a01f5cea86d97a06d57e98556c78e0dedb1ec30be610337a6a35dd0c78a8a3f589bcd078076243f1618e320b815a39dc8b8aa9e2a028ba96f2aa3cd1321c21a26df4f156bcd080307975da62ddf323b1c6ef38f3857310a142783889a543ac016f0d5e67b59be56faad8950f4a96e811f9826faf696ec73b3efbc2e1d44e4be062f13f5fc4804b7c5d4e0f010bb98b577169a3a65c730d9cdb2b1c32151166d0d40bb07fed5f6489ed66ea2299a90b00b9c0a7e01e6054f0b71b384dc147771945bab1f3629bb6d6729a946bf39f5e30e5688733872a6d5fbe8cd99652bc3400b9630dad5c1272384b978269b9ac5b70275f6a4936d366893957bace15c56349f0afb689f23b8027e670b5353020fa2b19e405332b7dbee0892700adc1e9c699263e074ce6c128732f036c4196c408fae6cb07ac2d1449b6aa08c271cb168eb9ef6e6a75cb78209a55c214e72ea18dd3beb4e436594c12ffa76b3cfb39deeb8ef7c602f1e86034f88e0aa9a7d46449f45d41eb0dc4602050fd748109cac9641f56b2f1fe2db6cd7fe41ecd61fea3095eb7ec6b2cdb74bb6474fd85457a3b635dca6bde52d59c13ae210afe6aa57f0ee3200e564fdd0a336506e500429ca783533ff0888924d0a5689996b087f7a3dc49251f728a0abc53748402b640bde320b5fcbf536ef6801c53c4764e8338ae54d04fd13b0e67b8106aaeabcb86ac812ecf678da086169682411115e86741d7bebda4cf396b7f7bcb7f8f1814daabac88fa967f001e3ec331609e25f8dddb04ba1bc9548bf5a959b9f434231c0878664481dc9cf972d5fc8dceec45c251bfc95df6ea161baf3814f4944a45c7095c40355112e1752519c587f58482ea89ae834c669db1653789dd48929cb46d7894455671c94b669d31c47fce0d85d11a229b84a9a0197279e2201025ef9176b95a1fc9cc11507f59ca02c8752c272bf7041909b11611fcd8d2085f1f222c1f582ddb361966842f8b08921f122d651b4314ca4dd4b060c118d45ecb944fa391f80bf0872f4ba6735d5a83a685796d0b4f7dd4740689796db0837cc614827b2200d171705528c23e3021a55c901152048d51eba2f9bc72b7c445f0ac44c6c38cf25bbf69399d8450804beba8eb4a9d483e300e48a9036f8b3f9341d41448fe112c9341e622646ada5e1b0db2c2b63d4740c7db20a591458ee091a5d2d947554acb010e0a3cab7b808001123b4ebe1e5259b6240d57863f1b5f0bfc03aa83d0e492cc1eaf17aba0c6ed33e9fb936f53d10bad33880a66e4bd9fc65665a3ee20b3be7ef568388abeb1e3acfad81b4e1d5d06e18f5b8c30d392fec4813e31d9cccb1f02852800a5abf9dd9ef1056ba2c4bf6f941e225831234137c7015bdd30743278817b87a0eb0638587a34bb1c5ef832ea5f2901d89d71a076f282cb4ac9a855e30e1aa054f147c4b8e2d9b731f667aa873ef05946596f35a158475140d1f2218b9833b0cb1e8792f805e93feae199bfefd4224b2eab02b61587e6da13dfd42b2169b917d0a5e57a8701087abcce6a0868f281f633c0ce74d29092f8cf5215e10cf2e0997499940e28fd85e9ad1fc9e595bf6f765f646caaa685291656e594f742ae45004d9b6348ed91cab4def32dae565bf52ba4d282363844526f2150bbd3c2b4a690895fcd44ff5ad116084b2890d43acb2d7a11384d06a97cc48147484d478497f11d5500c78a680341f5ffb4ddf08f6cefccc5e686983e9d9cc2fd2e8c7c3e4aa8bd796739500dbf4cdf2c293d0859f42fed39ae0384fd506c0372bd3ea10a1d99d673dd3df1a2fb5ac03dafb37663bc3bff3fdd9ef446b9fa4d3aacb3f3d0417bbe36ad6b13fffe9d8245b38f7af6611adac30326034592038dec1e0d05dbe1077d4d44d8c6c0014a9fb9b78f31b6d82815285486d283dbcd3f00515ad73fa6f5be50b6aa9a0cd23b646c2a0d0cfe18306866e5db060e6634fe1f16c00dfcc19b99010be6e4697c10f1d594563d7e0f606dac264b45be437d637feb66388ff708b587afc25cd1e0072a2587b389902abc2468fc8c0700f058ee1e45d198fdc6de79b27f5db5a1856cf5e4bbf3400e010f811a7c6027e8002bf8e7548f96152c49a6c0e3dbd86d6c369e64299e3922a1c17183f4a16fc8c65e7ce14454dfcdd7145c623486aac4e9716057e78dc2d0e84bd7ab75d61fd441353ed323621c48df2dbbaf6ebc379711f64e001f445b56b4858cde9e230d00d3a19b86347f66c5ef385a812e394703c05bfad87890ffa1b02a6fc84f2b382e412a5bd0c6707171012ae0c9ed286c24b032f533828652bd98b7e894693f4e5ec1887485bb7a59498fce48467caf218798b5546faa7f9d4dca2f6d8b76c6d583c7a9aa49e0e3b146e29ec3641b3b9e97e81ee1b0666fabb17d42bbe166e0419f61ca7b78bc3f4a142c9e81fdda7693419adcf4384b0113f1cb0f60f4d70f9bf9ec5cdcaa26b6f85aa07a1ae24851c7c4870bec2b4bc498ea04195fa573882ca9daefe25d316c7b6904f0cbb1a7da57d430cd745f8552c1bac4f25affd0c6498f4208a3cdda45871471f1a03023be269ac423b263b0f616a36bc085a78cdbfe2fe1395ec96741fb03a0722c3d369afc1a01633f0d7498a85c92915cf3e40ec394a47ff353432f05f4660a95b80833b280ea1f5f0300f41b9aeafa0a65bda0cc15860c80868c96a4f7e14441cff6f6a5a00b900762360a722b6a41e4ad8ccc2c1d325d3629f54cb9fcdce715c835db41a14224fde99c6bd88f7edb9f2b052bdbd03f8136f0c30769b33228e0d76ac12b4b700305b976ce6a40f3689a1ac54582601ab69cda93bb9a95a8b4aba71d3764f5229941b8680551be0055d55876f2ae36fdbaf27f9b13c6a33d580518be1fde5fdc854ecab05bc05c10eb6dd76767a1aeef8d778c1490cd7674ae1d0da61c21dc6cbf7180658fd1f3db6d55bb484d0db6799e99365ad3e61675af9742f3f596065e6bc0f4687640adf3fbc78c2e1e42c268816d01fd8590e4625d68be2c798aaefc68d2ab34ec39df2bcb0ab0e52eeed2ab74728199efbe0d42a36fc3c598178d64851279f9374e2fcf2eb1cd54513b6aeb25f96c8950a390689acfb50f02ba1a8f0baa23acb770e7de1b8be13746aa1605e50f1fea3a67e6b31f73857a6f7a7ffb1ca8d12a5d70828d566938128909b27dd007845c8d3569436027eb44c5858c42212d0a6bcb20cafec1b0c8043afbb84c9247661aa33ccb2d6702736b10b0fb69796c9197bf7205582bfd6b91934e0b7d2e56a67c4ea9c43c30d4083e49e387a8ecf2caf07ef0733028d48676503090e102d08461a9a0e4ab233c5ff551bde6ecb2cd6de4c23f0153d985d5b922d17f6bd3f82984eaa5739e8881fe5e9903104a99bf795780a4c2e558b8c7e6c25fff1870b77adfbe72bdfa648c1cdaa0cafdaa95e206153f06d461c8ca88f4c393216e112ccd54ba7c45f031eb2acdacc6a7b9349596e29941505779c19042f0fd334ddd6a8ec00a434629fd48c8f91b17c85b2611b57980061250d3056b5102c310434d9a33c097b293d55c3070646731b3521a09fee4882c89939e6e27a7af08ed0306ad5c8e5d50b4fa7989088165452a9dd3f4ad8eb1e151f6d2c79fe18c8f6fb83d3ef7acb3e2393d08c22663f05360c573140a82d11ac324e65564a5f376440dd138bb201ed9410519e0e0ad25078c751c9d9d546cbab26c91b279a172611dc5e26e4fd32ab2bba9891d61da65a87bab6586678e38e2b0b03dc621330f08998a0934f0a8499026ada4ff7ce5cd6e19dd1e31334624184761d7b5e7783a834594ddd7e70cfef32236ae1ca9d4e484ec3061a02130fb84de88149569aab587f3bda442139b4dccdfac4f78084ba93230740de608bfdbb449c5569dfa877e9d4f2f8d7ac0c6201ee6848a582505f6d78923c88c41ad0154ff3c8d310c63d9a9a155fcae7a793076a7769c54f6724e7ff42dc6205bd476ae0d63b05c5a479f9369a51546540b42c21189db637d99a02882b5c19c8013a6c3b2f85853bd2c9a025391017f0e1f525707074f9a06e607e501459a307136166784d74928416c8ea9b1b62d8beefe1d81016fd4b17b305700231ac429da782011e080d091191e7c6200ea81c105ae2575a9b682017571afb64b9b1826a5fe256df33e834d006a08cf8b52354ba18e1457b23a271876d77d987bf03931d371e9c50f8f92bdf3c0792d63618a37676dbd9687e14e31d9264c324a56b92628b84f59fdc0c2c5ee1ab1db73cacd6419e30465d44e3a243b669cd803803b86fae6329e7e19ff916ea4cd338c3034433c9aba9f58a66e79b18eea0d801034ed90bf7e3bdf600be8aa5e8eadcc063000eaa7b20d9b84c9602b04e6ed4cbd0f8bbd5fd5bae48fce32f78c9ae393a0e7c3474430813ad810aa4341b5aa1768bbd88c27f96c4d2bb98ea35ff727593609811dbea5baf8fbf3940379b6636f3e81b09aed4d979c3624b7637a257e6d07f944fd1eb730955dccc027985a4eda25be282f84047ad234ef5ee2245590fdaafb50bc92c0ca84e3c9e20c905cafcaa8ac9026eba8c4d24e498296d7ab55a498ef2e10b0a4b0e42dfb8afc3bcb578f1c83a23bee878830898b2f865e4acb25dcf28a50945391205cb3c28081eec105914de4fba31c286c6fefad6908ff69108f9cb6f668e767ce0745bd116231d2c4cfbd667d66416b049f8ea9cdae2a123a04ef66161718b0588d299ac6cf960a191bdd261c870264dcb3279c9f540dfe50d2f586754de0d5fec929d61501caec7b3a9896c720995011f4a26320c60b4275b96c9d3b2f28ffcc5fdad5cbb90e1652884263b4131a76384427909f8b211e8d10171694fed5d9776601d5e442697cbad52f87ee79c710a421db0be3441ad23c59636434e670d6b5bd7a317a197207f36e352d4086b1ce38b852613d00d8843089a73ae82322a7214fe2eb9d29625a269c3481363cd2724df05154326807c4750a530612db45e7d0a33fb6755542d090a52bb261c580ba5b17fd8f2348c215edf06f4312a0181da597367a063a4ea0acf29544ec38f19256248e289a9f2ff34c27c4ed82c00f8789e3f7b6bd8e33f7c4acc6f399d8a7f5f4d77dfa8a5099f79d568357c84153bdbe8b5d3185494cc7aee5e45a44b63b06116cb18205a832e0272c34c44fd0583bbc3d05a7cbe2cb05626e1a9b607546b90c2dfb7a1dd09c3785a6df261bb76f867b1061ac3d313565081edd576fa1d7853152943603e8e681d5ff9bb6fb4893b93272fde6efe74056077f7fd622208b200cd41c6eccdff36b011fe08ca54d20a1a4e80661ce5a4c148d5dd5c137d658f6d373776ec21c83ad929f59a4df868c80be216c4cd5484e74cc74d02095689c965ad134b5e5da33f6c04e0077a8eca494b3bedecab0e03c75bbaf28a26d46e41f3f5e902f9e0a2feaa78e312a9325b45ffba866e8c90cb91bb299fff2adea1c3815c2d430495710800697f7946988f2c6f664aa1dc582c5ebd22fb121ec7c488fc0cbf47c0d3dc16214d5545b050739da298779b42a6dce98244d8bbb915e9c627248e141a2a7092fa05565ac7ee96028866df311b312657d62b948a4cc6f02ab5b1afced3069b1c0b658efdc3365f3ee52aaeb232c95f5e97065d62e02eeb9199aab3246b4331d58fb792f8d342220ec6ef8000b8c98d878ec668472e2105b21ab03fd288e378acaabd51067dab3882570dcf07ad3a299693ee7fc273e9d97bfe2d26f9710a75b1ba04c584a3bb0663d01c63f61ecbd81236145e2ed9fe84a74494db4b56ccfb8d5a02c8a72e097bb0bcd260e9b78fa32091be8c318cdf76d949b423164277dd6e5bb1a4b7bbfffb3083adc55956723878d0e9fff2456d4b0245d32c32860a73d5a9c5ec84f64eac7b70bbad085afdbc4e7bf5cd86f1affb7fa217bc6391703dbe5254fc0351d02279cbc0260a8400d6f30d80d88fee5be6b334b1a2bc3b885df127760c0e3beed7e139088ec912daf319cb31f51121acc55fca45507a21b746cf662074c11be673fc1eb171202e6c70ab0dafb90d8f9f089140cf8a2472857c73ce5a1586f9888a137b14d0ce89feedeaa715b0685229cecc1c5b2452f746d74e4c9ccf4cd211c92d5da6a9606a2b033b647bce0dc1cd849d30ba49f7251384700a6aa77b89f6317cab26d1fe2041d34fcbe0f481b332644a6ad2eaf0b88fd6f2d42ce82cf3ace1b57afe42137ca1cf4ced7c321538a6f7a928e4bba45920f46b39134738be23bc72e65a3dd1f714d458e71535088a5fd2d64ad7f203860978b5ef2ffb9c12cc9f1da67c32612b0770902ee39865835dcdd797637b4362fa22c748b97a1a36b444a40385b5ab83cb87470d04ebef5833667ba88ff9e5a0a9a586608c89dc190b892ab2ee40cb55fc06b632ee660e7191006b8f7323be53b0551d8feb7b8d43a1835f7fb936995ae38745c1ed57894e58d580334cfd01a1b14b937282e933253e1b8f31f05639e38886c434101caf629f7ed6343af136bcdb4125301569fdd6f5e5d7f046e1430569c708a1e3eae322de41d37701cd36f5b5663ec2702972c6b6fc8888bc78146039e117c02535108205431bda2b8217829f4de6b3bf8eddcedb4515e6194366c94b72c9898846412e5a35a97b29071d550cb4f8e2ea286731acde3a38cd38fc75cd21eaf14f21c4e36a0c27aa0ddcca0b3636662071de068b721d22d00565192cc89f4fd57f39632cde06ae28c39f50a5c42779e4908f5b561973d85a510fe9d60075ab066e6651981666f2b739449c561464d93024a6050215f6aeb4b5b88797001ef62766cf7267194f2b1b0cb6157d202b5a751bf9a07a959af7ab5936450837a940750deb8cee160b40ab01aa9fa103554919a4910d48722efeec2452f0770690e95a791d89d1013e75eff2d885dc8a36ba9a1234f937f11bd93e2705d176ee847931c18c440e04f66cdbaf439ae1656ed1b881ad1b575394dc330c54751fac88ec26aaf252560649ba8d555d93b6cf636aafacc688af067a1e2e3d99fa6624d838c3e2fea61f8eaa3df0e06b0ca22159f5833dcd93902c0ce18a49e619bc675b03407563d2ec0668e2636edd8cc9761669e9acddbf20d6f08d988c33f7349c0a3de3acb84079318434411d198720cab68eaea3bc09154eede78c81c3affba9d9b67c2bd4a2425aa22c219b2adea91b4095b4e1b326d154819227af476fac047d9055b829bbe9fda875140368d6649708a53efbe856accf62a4cc928f808f2ddf309759825564f96f146e86e6f03ad5c4760b110cf03b62991e1fc2eae83abef253198c5f4a034ed42e8f0114bf93c69884c906103503e86d5ae14df8a3798cc45f796ad744286770f4623553755ad0bdd48c8cca866704d1aaaa0025d193aa1e404bb25416d5242b079e37ace3f03507c9b787d15e309a2bf71b57e8099e5bb8772926b0e9ae66b77fb92dfe9fdd4fbbc52e432a08cc7aa9197f400547c4bb9106132b28695c7091324eafd8e922d69831488eae16db5452ae464271f5ebf6fa3036930f690bb00e31a884c03d9a80a1229b9958d82193210c234b4dc06aa1d24feccd34914d60855cd32e3b7a5681fc82f9d0333603234082f1538beae1686a4d264aa3fac888d4ed02fddb465c75270f79dab7de7990a2e2165158a041a088ba0da4b327e48a8af2512ddfe21b4534f9297c99487639373be6fd5cdb510ebda12d7d0e57a50838bc4d714fda7d4cb5b0ac089461ae196805ab21edfa815bd7f0ea0bb52c5aa1f009eccf96c1dc6964014e33e616632181196b17c549374bd0784c04ddaede20be2c628d7d1b4ee3d99ed7ee2ae21f034b8f51374941df3b9c181f25189b7fd02154fffbd3bbd67e6a5379ae94c45c909f096ad27da443588e1fccd3091a5c7dbe483581a8dcf675e462f30a9d073b73a0b89f164b7266adcf503d6ae0cac932430eb06d0d67a6d19ccfa6c3f29e228d4b76fab91d0215a222a81a8d49f096ade86ad33ab72e0e7a1bb762fd26c09a4e19131a5e25e9448f47b12515e835c02259e7893d564860b7f00396f3bada08a8bef4fe419e9f64b066400ee6284c66170acb5ff3822c019b51cba00aa2be32b986412ef6983907734d43138162770413480332867494d033b3d4d437d5851b0abea67a4a19e8cf783b1220e68800c1a0674ae0a1627c08f4f8b2f2fc7e12877aeb007b030fa5b72711649d69888c4586b6988f083169f3203ac663023a663871431dc51225bad783014b4006ec44223fd346d6fc600c819c90eaa132ea209ad6b950d8db41bb6a21f340fc7335a9e9d0c2ecf3b819c5121c63c7c421ba843c148db4b4b323dd148eb2b28df30881fa43252535934d2078bbc8eaee920db359e6b502373f9c466bc65a4cb0c8d46ba842e206aa3910e458575991bd50f70703c0312baa3912e1d1f8d549e96ff5c78c29978485efa422ecf5f314bf5386209760d2303cbd27b5305ba67cf6ca9e857acc6cf40638847914ec571b4dc327f84c4e01f46e4528d64f1823960f84e466c5d55cc068957ba76c2443916ae25e697cb5b65c0b9dce3c80d21dbc06065054d2f7eacd4a99ac9fe9245c9af420e269b0e8c035320c7549f18ec5b317f047803dbff70b18f8bc9cc1324ce36b82de2af91fca54d0d7ec1d614d244542eb8d711e55bbe5816aa6af9f4be42e4226d552d33e8da12c99e0086160b69bc0dc20ba5b99a8e7ba344ff354309e516dc3c232720912142206742f43eb1e75b627e75331e73bb57e3ea816f792a311aa5e8d8554d90ad4826de721bc0dd7c73450646dcc3b044cfe1211e854ffc5d20aacc4ffe70225524455760a0f6037065be10389f86f30b9d87166080c70c7898d868286150c7c0e6cdce3736c2df62226354fa9f6a480686af2d9013157956c4191fbdfae467c435afe39f4dafcafe70be9d763080ba84497a54acdd5fe4b32344b0b4ce4708584c99a52997bef8b68f12ee7034555530d955a517203ce0b91aad2ce1da1ec712bb4d7297273547635e07e5e2ab7ef2a1b771cf3b3dea770ccfffe25783c45ef63ad564f61e7c1c6b6943c1a1538d41ebef6658e144c64da3d2fefb41385737b0c9c0837daa2da11418d455d29f1214d9ba566861eb2fe2f1dc1321707033e6beb40a87a02cf1e408a1391f7d880bd61edb2a5fc571294f47d0e2c76fd58bfd39e4c7530df0182fbf8fd08967b58fa0fb8af62ccf0ee824374785025745c7ea078793cdbe02db29d391dc777b303ccf4627e3537aaed9af522ffc456a814cef60cfcbbd71081077e279edc6688abec5faea056429fadfc51613df7d6a8f9bd7a978842371f552be1f1b37ecef5516bffef70909187ebb9c71ce5a7750777fccad05dbd2096592dd1885b1a8750b085b5594a8052adf6182f83d63547285d10d2e0d43cf54342c7382fa8c310e722b2b5d361960ef98e0108ccc73a83e3da11ba94a53995f7b453e4fc00e8ae354d84449fac7de861b3048e22237dec99d527fe1f8e803bcf9cbdd0714cd244d27fa733b9c9c0cdb3d979cb71b1c8bf439021945c5632054a4292ec6c1f74465c2df9e7ce4bc4f66837abcc1736a5ae0af5d9e2d4a4e7593a900a10d02c6dff7ec2e25097a0c5cca624a2e67150889e2f837b2a6a4ac0b420faae41c70f0cafd4b991ec23d4e408c0cca6f833ccbc2d3e5b4135d7c968e7d1166f56d6d821608416af3f489d89a0b8792ee000310fe3b007b1f76d8f79a35fa893a37a17aff71d683a9490a11ef35b46d46e5ee12d18756d48f80d2020fcda722df6600c69d16cce73ddcc9fb5d058be44377b5db386f704e72892e310c0b21ee610e114ad2d1bcc43774f7007f58e0ff4fd974b096fafa078e4f975548869a8cf3233a0c2fa09590f89c203d7daf7afd8f68cc74c1472ac441a4819f950f23cb5ad3edd977b363ee819e74b19baee623b73c0a753ff7f60e70a4bc6130d9da33af1c9c370e7a109bb84e97d906f5e91ec33d37de93656362d27b78df150d2434a8f736372cbd76ff5d455fba73fd25ff3e02cfc34f4d339a64500d93fce8ab0df118247133b5eb5834e3a07b440f7ae8d7123890b0461b8c84a1502b4df6d6c6edcb9c6cbac7bb9ea0b8eeaf7120bb5b005f8514718a204ae4d57021f6f34fb85b2c3c3d8332e846dc992d7e024ccd78b2c7202b197b3c3a67b823906eed092724128695769763553af540512345e5fd42929c22b872c0530ca20082553f46819139cee1c7e8cfde432a868d5449623311f9a9dfddb7a5e0c34b07f2a93e5eb42c472b23970a4eea3f9009c062a711d38057b67930c2f7dd69901860767bf477e4ee36e5a29f8583702a737ecb6ded4bf498676cd1119aedde656b9defaae6a827adbf9718958b50d6cdfe2819330a0ac95246c77a2abb1e4f2de03b18b2a1edffcd21b629694f6c04d5410c9caa196351bac8c445ef094efadc71b1f6a1cc926ec152362cab2b336f93c152df3644bf91ee6bf9b4897b13e6941f907bd78b4660be062f4bc0d5d0934ec5f7afe828f3be1e2e1fae1e9acd1a2dd9fb13df3c151d9777d85e4d7b9b6d8e8c6aee64b6454ee31728336c9977d69abdf58920680e60e8ef5b1e6a83a302f87447f3de1549ca7dbf5f4a32191d72ba0425270bb7bf6f17d282b3a172cb4287b954c625118da112319485a050f5cc97c79871098303bf669d6e8903fd98dc464d6374a24de1f8eb479ffcb2a901882577f95fe9a721cf4b48fce8c3667037dd3c2ed43ba138331e13dc30be40a6dd07ea7dc2b78f527f0e866c442575230a4e3152525cd3225a9280912b287502d9c24d0fecb9f0f8ed52f600a5cdaa157061e270445124d4960c0060e2b1c210c7f1ef6294924342b7c9c033dba5d3fadf6560b87e9b7616c2bfde253b7d2e31860d38bcaccc6699979696c47600bd6c1d8387d25e3b9a9a29d15dcf63d1b9a10717a5aba28948d55d353dc2302e3ee97a9315945d07caf75cf13d30b4c4b7881a0b2ba198336408db7eeff1a72ba35452f2229fd3392d264c1e046109a6a723f283fdd0b295067689d026bd26cc986d97e0da6179199b121565e2455a6fdc4b408e76e13494a23ea8b6ca8c438880a25aaeaa490434f660c58dd74be371b083b4e14cf1a029b8c6d5b7a3f8fb1994df0628a8c0567c43d0739da80aec11785634f9aec6d4bf7f7267ad42b74d0833628cc871718424334368cf24c9c980d22531c71c6329539926d1e3d33df6df9f24c1713a059a704ecf34927c4e4282856a38a0fe2a1685247e6f03de067fa84fafc8ecdf5bf62d68e8c49dafc3c2cc531a75db46bbfac79ff77e32795e2cbb45d2419bc2ea9ee37a2b4ef05da56daac9e55273dde8292e3bfde07d48c6fea5f6b947a8efd0ef5a0e0fe263fa229d1032c8b979f1fa9fd8420eddcdb6566302cd707c662bbc3c3efd024320814b97edd27fe60b29046652381948c605c66d4360dc7f915285d1559d27eb491bf6c58d400c4c2451653e522209f8c7597e5c375f32114510a522ff96350c0dd6e0527004432d4ac2da84a032c86a0e8b75ffe6f1348b4deaa238e09a8ff7a2cf2ce82beba3073d428f6361798ce59cdfbb347c55bc1a17361168841b072cb6c1041e27d0ab3de0f891b8ef913e4c59b23144fd1b84d06887f21a646b2d96bb8894a6759791c1b243812abeefa16a114d1f14ad5a5dd3834e3997cfe62d397371f953f4256def55fb9b88c783641868c5ae4fe4b61fec596ff97ad3662df86cb0b85950bb11929d4e1815247a60c37635afbf45f0ade00407f98f41cec52bb1b73ef2fe81fcb23a6541b8ea233abfea3ebb714439d54ca433ec96d32f40e762541cf9a67c750f7a643101aeb6bee2ce9e69a27f540db51fab67f55c5bc2dac4afd505b6ec7ebad2415cf3c3b311f0e15b4be4a9b1df76d14dc00cc4927ff8ba3d00276d8166dcf9a7c01ee0df2db64e818a821fe0205eeef49f056c3ffff051f94189c6bf6c7669402418417af5447d3b237c1eb9504cfad72fea840798d2077b66fee5e74b040515336957858afb47d595ee1ca3c7bdcf8b4bf477ec1dbd687f99a1209f885cc13c087ea133b42197edf66bfd8339e1f4322cf20b9ef9a5ef8938ff1aa71fdac3ba0698ffdbc3246016712e0e1523cb10bf7f1d0806bf35552b9691ddcd4f0710f6a2ca4a003e6409", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a63": "0x", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/chain-specs/tick.json b/cumulus/parachains/chain-specs/tick.json deleted file mode 100644 index a79a0e2d3bca..000000000000 --- a/cumulus/parachains/chain-specs/tick.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "Tick", - "id": "tick_v9", - "chainType": "Live", - "bootNodes": [ - "/ip4/35.204.161.46/tcp/30333/p2p/12D3KooW9vw7UNUYQtPWK3RS8eyhjJgp4qBwbbiirYQcWLw5bCsf", - "/ip4/34.91.188.144/tcp/30333/p2p/12D3KooWDE1awihCBKPwqncHmzQZ8fT9Wc7zHBmNWZqRsB329ddx", - "/ip4/34.90.244.197/tcp/30333/p2p/12D3KooWLmYcnrT1eruNYc74Na9Cq7EqCKkDDr5N2tdHKvm4RWcw", - "/ip4/34.90.155.1/tcp/30333/p2p/12D3KooWHNQaFF8uSQBoKkXpowi1Z1pxRkxmngpq95Ngcw8JjiNj" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": null, - "relay_chain": "rococo", - "para_id": 100, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00585c3f048e464529104f107867940ef094f453424f49f16376637ad6aaf07682421e7294b8ac642f7abd38003dc832c3c2fe14033c6598fc44b8aa96091e61417f0a13a8fc712fe66abf4cadfd7f13b2b7245b4a29654a29056710dc0f450f74bfb1223aaee0035a9f54c107749f8bc8a121373444f75790a1182f20a22f0bea69501c945f0567501cb47f968098f6cfd6decfc588f45699f6bf775bdde55197680553d07ef70e1bd2efcfe34e5bfab4baa2ee5dbb31f2b2f879432ad3dea0d0f87c1ad07ef9f2e5080ecacf5b5d390d0a0d1a4372a0fdb2a0ae0535cd81cebe1673eda7dffd6c7fc786f0bfb7054dba7daa4b94822e34a8a96fb51f0a53e769a7e1a0aee1a0ad2d652d68d2fdd5e33e63b62a63baee6a6d19c6fd0e508b024513f0a1283db1ea81df986affa6c888ee0654a2508070685053deacc07fbf63501d3a5d19146a5196e8a94107be81422dcac7d5160e146a502431c1972f5fbef4c09fcf9bdd3e4802e22fd48a94ef81db8e1d29be677e1e9f4e67942dc2f22452284d2de084e90e74baf9b42d039df042039df17ada3e6b4c1fa62a22db771811d9fe746cc896b165d0b9cf2d1ca49a01baac357ddaa24177cbfab403f58da75b63ba62215e39773e3840c63f4b4c553f64fe2e04fda6759a1f20e3dfefc02492b93e65737bc8dceba0fb851444403fe7946489335e4f8467d0b7a35355bb29e2861cf5ac29fcd698e6740a6ef18320dd9fd07a9e86178dbf40fc65fbe54fa9ada5f1cb9c4e01f117da17d49c04411a9fb54081f80b100e0a7fb6167fb5da347e651a9fa757e3adf2efb7b6146ebb3be256fdb7173b008fff6243dc27632a792191040cd7e3da0cfa7e884ed5931148bc545d2d4474aae97b1d2de8fb1fbde33d2b865b2d7486561d7a035fff4f77176344ba31553f6346fcfb173382c1cd083f8ea953efb3196aead41281008b85ff7e426da90156468017d4f81923029f7fb1220cb51ef200e5ef547b17ba39568f6516b354043ef487ae2dddf8fd1e5ffe737f110a53d7a03095f2216fc78fdb529e96db8ffc37199bd3af236fbb7e2e16e3bbfb4bfa93b51b7f7effd66efcfbe34ff993b12178e8ee8e1a9f5f6a71f6c5d890fef852ebf722fdf1657c9e7eef043ecbfa2e500b8214be052ded3d8440fc85ca9fae055dd41f6ab5df7b65ea72dbdde143de3bdcea8ac28f5af5ff911f7fba93eb9d04413adf09d076191aa24131d4faa08b8e7e5ed75fd77575a1d6f3f49c1a501074970753bfb4f7b3086fa1d6cf91061404e5e521dfb5da54fefb1191f7fe40fc855abf980156d4da7677c8e769d72a53f98d0d792f377f1e8ff069d37ffae55a3f0f61eaefb66cc4320b7f8fe28c7e53c9fd74fd93b165988c35a6bb623e628e7e96defcfd95967c1d6a599a49ee6f10a6abb94ee9d0fda7b93e6d91f7a39f23adaf91f67e3122a37fced3236d296356646c882c319d8ba99661b23e592f3f3e63aad1565774f43cced351336996369f06856965284cad9f7c8d34eb9fb6d44d6f76270139bd19e254bedc7e79ec337d9ab5fdc4973fd2963a0c48d2f78b15114bdba78a43f7dd699f3115fcfd91c674b1214c659f166a37f0d78ba121aa83cea8d5f8f2e75cccdaea8a5a3fd22ad3d14bad12e1210ac4447497c7e8e5f3f848e3b7b4fec554fd40aeba871b10d3b7ad223b34a601beb002145388410d8840d4b3d7dc36f5893feb13ff8fac3e5f949f81507e7e219d7a94ff3bb55f98a00ae5cfe91deee11fcfbf39bcfd2c91f7bb2644f6e3bf03ad947fee06a93af4adde1023fafeb9afbe5521ea5f2d22b60bf46d56dcff6aee9fc6801ec6e8e24bcfbe6bf509ea153e931515347e15a2ef7781d8eda12e51941ad020a6716bb2665020fff285c2cdca13fb42ab2cbaf4b86da83e41df56fdab45fb79dcb51de8e4cb69fb8b3d609f30a56777a02ec4abf696c29c7baddc663128ae40316569d6bffd6e0bed9757f663f264fcdb3fecef9c3b806c893e70c677aabfffd4a9eefe8018b4bda7bb9b89c9aff56f4e2731976e4ecd68ffe477fe7ad19eceffe3ac398a75a150624a4d892814884dbf7683f0d7cad4659ff67532a6fefb8b11f14df6c92fd69c6250e0b58542b9481bc4090f51a020287f7f6347dcd010e567ac483644f9af4e2deda1dd8c6e8e957387612edd4ed5fe7dd7cf5ff7b74fdb27f73a59ff7effcf6edb27b7f9c6d3ab6604cc1d40e6be9ae87b9d4e5509a453353b75aaead0f7ef7f74cad1f7262fe87b9cdee99ef7db29a755087defb34ef5bf9fe994fffbf757a7f8df6fcedb7e9648e83b55dda953f5733ad5d489a028a2fe57ef74cf0edab4e250ffd56132f737a7ea50ffb9ebfab4fbeec8fb7d9e9eab8d7e2e36b7baa2f357ab4ff7596b6c19c6f529c8697c53a7e0fbe34c68595bb53ebef584d4b24e59f2fd2fad3641f7a7a5319ddba7eb1923c2d4f5e9daeaf5f12d6de9a50539953fb9979d64694ba1d4b64fd277a4f89e6d540da2fbbb3cea45f7fda74b96ec7e6aa35f6d31d548bebc265fabc19f8bf15657947f35c79661beca53fce9b05d98ab4f397df2b77efb24fffb646d72abfbee799ac75983bf599ffa1953c1edc6c87b7edefa9fd316e34df6a93f33adb6f4a5efb8a1a1a1a1a11effd30671fe9aa34337c76ac4afcadc1dd9dc9d6c893c40852e9107a4f8a04b3424069d9bca9668e80aba74693f633f6444435cd0ea68bfe497727d671b5533ca5f335a25ddef779d8abfbf9d72bf2f3bb574ddd6237b1fb5f77d398d2963ef5fd4964ec68ac07f5b850f7fb63352a2f079da694ca3b6b43195fbc9d7d3e02fb67daa33732ef6b6ea047d1fb52a697ca855f8dba7f83c0eb5a551ab0e6a4b177b5b9053b7b93ef5897f731a726f99a69a6c7fe1dc4ef95749f79735a6932fd696ba4ef5ef4fd796b6c694ba4ef1efcfbe5ce39fec988a7ff6e523f3b7896164ee31556f3d32fef9aec6f817739b5b4ce5dbf6a99fa7171b62a96b4b57cd6c656e00b259da9cfa3bae51fefb7377648ca9b64f551261ba7df2e7691fb27eff99756aa9ffe42bebd4f669df7fa653ccb44a5a33eabf988a9fa779bab51b2392f64bdadb8d917ef7fd6e0b62cadbf6a93ababf5811fede6a3f3f4f37f315730790f55713f5f737756adf1fa753fcfeae77b8c73febd47ed10231a8ff766a699da1fe9be3dbcfd3cdb1622632b7870c86ee1758aad08599bbf00dd946f70b296fa091ee1752d0a04cd7c65c1e7864fbe6eac8f6c51ea8c8286314896217b1085108918b68848884e8455c42d412951089108110b78847885f4426c420c41f442a620ca20c620b220ca20b2215e806d886282586208220468950440fc421080798469422b220ae20aa20a620a2209e204e8926882588248853c41144114034e01a201ae019a019e20b6019e019900c0f0df804a8052e01320152016ae1a90176f1103c2cb834b894a705280438044806f4c29bc193c21303ac01a401ac0267006500630061c07180532016e008e014900bb00c68058603ecc26383dfa05be03ef01fb8162e8a43c1b7b816dc071c0c0e056e8a338103811b81238193e271702eb818dc0aee06e7c2d3e051f036f81737c3dfe05bf023b8119cc887e06578187c0ca7024fe341e115c12840339e111e11a09547046df0b078581e0e5e0e9e95a7837783e6815f711c780e2018100c900b0c033c4163e913340a3c057e8563814d804a805ec02f60121e1aa0086008a0142885eb00f60002016e0183f09ef09ce051c02a9e97d786e706d70268024802580237411fa18dd044ddc533c123c19b02aa4103900b0783b8839845e4414c823b832fc1a1c169b81e38343835b896be01dc0214034e0166016a019de05ee02e6824b4179d8456426be925c0316018f00b700cb00ab0086e8157805080628052786b702a4de571e11b70156c03aec1061670044c83057c2620810840e0014814a002410400a4a701d08bf302871c1bd80a3cc2a3c25f38058c023e014f6113700998043c058f8045c052b0140e018380a3e0280c057f803dc0432ba10e3cf1b6bc2c300dd80a17015fd15dda0c4f096d85ae4293d1633415da071d463fa19dd060f0198c4501460c00d95024014282e8274ca6cb2f0aabdde789120a20694289cf1248904c76259af82041325af661420125414d305001244149f83859a24493254890d4383290dc1896890a3459822409244c54a04911264c98284050123e4c983051001d2e0cfbc46749d012274c2c11840125328ecb366162499012271850024910134c9e2059d20455e2040394c67d41735dd8271af0f941f204898f124c24e1a30492271af031d28489254f9ef8280087e3c266604913d489cf8f13261a70447365ac4f9012259630510205890f067c3080802394f0b18005941ca1c359619ffc24e1b3441252d827414d7c9cf82cd164c93b28345952811bd7844d62c993264b9c0439e18344034c9a68420912273e4a305982819e9f249860d283e3b4ec0590280952a28492209f22605c1236b084899225414b9a2ca1715dec4f124c30a100129f200c24e1e3844f8c33c23a61a200978ca3227e31052fe8aee6120d0d515e790d6c283414b8098eee871f523fa47ed8ddf51ce7de73c7f13d7ecef9c6fb063ac737f239c712ba1d9bdc21ad1d6ee4d2f7c91fce877393b9bb5f8fd9cfa58439fa79fb7bcee5bab35bae5f37cc4d267d783ecc3967f773aebbdb1f3b8b7d70ef75b7d5ddd1353becb7beebdc3d1d171daf3b27d9bbe3f3e9efb91e1c3fd47b8ff93173cdab793535aea65f4dcd0b000fd735aee6bdf7b85fcdeb1af757f35c4dd774bf570353f39c73eff97befed70cebde75ef79ceff563bf696f8f31c6e7fac99b77d34f4a77d27229253f376ae8cefb3d276f9e43776edf932bfdf97a8e1c921fbc79ce6f6e1cb3bb3bf99c0e1e782835ea34dd7befd598b3bd5f8c3b74bbf75cf773f700e0f83dc8af1dbbe71ebb7bfcba9fe3661dde7bcc9cd3ef3df7dcebf748ec7c3ecef1de6bb6decd7befcdf96477373373c374f7eb7efc9eebe7dc7beeb976eef573eddeebd7ef39c7cceff973ccafc63de67eccecef39e79c7bee397f2eddc8920e37797373e39c93fdd8397ccc4f4ae7fc9c7bced79f3f6676abfd2ef332e35876ccccd0398e9199e53a0bc7d59d03bfc78f79a5dbd7d1397773737373137b107db043a9e686cd4f124a28c08409133ce0d8d4c8a1460d7613948492274d9438094212b4e4021760e234b3916e9ef858a089922592d84a4d7c9a684209ce05960435c180938d5481200cdc2039e1b30492a0264b9c34812489274b2e102f9043fb38a90012274c0429498209264c94e0fc48dd7082890c04e590faa1c763407af86081264b9678a26489bf0972a224e8c90e3d72d8f8042971e2d3c4c7024e9ee850e3f3e4898f93262ec04412489cf8406122091f2748943c5122091f243efca47ee8d144123e4f7660964822480905902cf1644993251530556089131f284804e0c30f3ff450c2070913414d68c04912397c3059f2a36363871a344a28f17172d280cf0f9220277c9aec98b1c00e32ebc393a0274b9cf0e9e1c4920af8386942a7e46301254e98087a824409264b9648024910130c28a9808f122818263e507c98207142c905706416608209120b345962010b30c1a4a6e4f3e4494e94f830490289133e4a345982a4c912254b2451810a308124c8099f0d4a131fc7d607244d9858f2c4890f1424414c30e10489123e4e7c9470c20492d40f3d90f4f0f951c28402487c9638094212e4840f0f509af878ccb6069c3071019f0b40284d7c5c073686de959090d0eaad5642bc1212125a4128b45ac5242bb4ead54bb242ab9513f2242bb45aaddcca855656921512125ac924bb5a09f97a92dd242b2121212121974468c542429d44888584843cc98a37c90a09ad3cc90a09759215e2242b16e22442bce224422cb4ea554cb2e2d54bb2e21527d9154cb2ab5527d95dad562b976457dc4956bc5aad3cc94ebb8177972ff044c906509c4658c4fd13722196168c12e6e65426a23a3f7c643f5684747ab098dec6cfb94dd01a41b40614a7357ee9a886b684ff04f2af43ac6da45521223a7a871da1797fb2a2d1aa69ab4cbd3a9356997e9f2a5fa12b454ec9a82c17d965bdf010dd2dd431bdfae44f32f75c659babf833b95450c8e8e72cbd6befa78f6c2feacfe38b0df12ffddcab3195cc3f4de665deb121a597c966cdccdbf86ac3fa2a776a465f6d22883e41ffab11a6af47501e7294fbb7d50550f75f7aead4cffbd38e4ec9ad32758ed6d103d5f8fa44901b5ffd473f5dc391c38f3e071c3870e0c801c7968381cc3dcca94fef79daa47115cf37284e97e8d3e8476fdb4cef47cfd335fefde85dab8efa9b5c0ecfd33c1493da3d551b34e66d6cd506ad3c1413d3d8bef7ea04a5f9ed544d6ae66bfc7c9a8f6cfb64d5d86a10a5a94d509a6fec004c69be1a4169b61a5f2d9a5f3a7a1c1a100d0d0dcd3f59519aed898d776b03aaf1a37f5a75f4bd6bf5bdf50ef3c9178d86e31753e1789ecee12dcdf49a15ec71b86f4f72306d40385f63fb3eb91fbd8d1b1b941a8ab35991e27a12e922b928ae9b8fc266cb1ce51efb286e3693a3dcdb3c57f11d6c4be228f736db3acac69b7e7d87b4ada368bec6afef5c9bf593b19a1af7246edaaab4b1555963ab19cd56336bab26fa760b750f54b98a3f4f4f1fd9fbc554339a2a52219bf99907e2d9fbcf9ef19999b9b9463d19cd9fc79f165fc6684e1e8c569f62d9b67d8a178df1177bcfd325ad32b9e8fbf8eb3b52cc8f029bd87ea102295c7421094456b041ae8a90031754210d56aaa07246c6430511fc208d269c810658e899efdee43b52903e8a8b34ffc28238820f7e70851c50818216f4ccebb1f958f6086948a1d7268569ca4cc1852fb6c0a08b2f78d19333032b44410a96294e10460f16eb1d75afd3297ff7427a87ab2cca7dcd59222b43747d677bb6feb8e2451630780b31a87ba08ce91ec1036750d514b6e854ad5c85bab736d514b6e8d3d2a5ee9ad3649f9c89e8e6583da15e4d21b78aaf061ae6cde897d6a7a3d1568da095890efd018a5fe54371bac4e897c2e7b734a0d1cfd13f59d1d1f6e47d84af55f7f2a7bb46414cf7d7b97fb2a26e7bb2dbeea9ca0dc8c16dff6d4c64940f788042a9a16eb322457f14fede9b14a69e28fa7d9342f644211db51f45b628fe287a7b6234031af8c0052b304213aaf4082d1957e0108518664c210e587ad651fbfe5144b15be6a8fd2876519bc951fbab28d4ed5f66f477cfbffeefab7bde9cbf3be2ffe33e6e5f1d75ee9d269d7bb7d500648eeea69c346dcc887ff9e2b4a5d32fc7b43610f067e4a64bdb0953ccc87ef942fd27bc364850533712c4768a53eefba53fae8e7ae643d8ed755b95bed58c6e4f6fd5449345c1c20f82efc1d2bf6a76e2ce94b1280165f5a9f5f1f77d64ceccbc55ebe3e3d8f14348cea6fca7a5698e5a4e7facf791f9cb4e595b7d2abfdd57d3fb9a591eb726b2a74b1b6e55ce50feb7b96d77dcd3ed94efb89efe7594a725fb187373ea9bb241e4ef6f17604c41e5cfdf6715644ffdafaf3a14fbfa83f41508f5af4268fcf9f534faba833a4a446b0f51cfa8b549ad5e5a3af5de893c85f9ecaba3b2cab755982ddb5c8ba450804ad4fa524903f22f5af5a2a232b8381a435350a9220b175ac4d87286f3f2a2cc4b63ea5a3a457a7fc78c90b63a834d77c92c83a2877ae0f3f4a52db5767ba8f388109dd2e5569bce3468bf3bd24513cea0fdf11d56847bd1277f6cab387df2bf36d7023193c69403597522eaafa553f3bd88feb9d5881dc9e82e8f23fd1188a915979f234581ef9ea9a5cd283dd4d3eeaea8cd7739ade3e534ee811a08be078bfc19add8ceef92da8f7ceb27bca2d61fa052f32f5f2814346e52ab421ea0f20bb556143bd25f57344a8dd2a83575189120a8dc8082a0f227466489a835442d26a2d606c44454be93db2e0fe6c957ec59ac9fa79de63d4ee45e74aaff4da19b63358598dfe80c7373eaf7fbfddec98686863cd0b3cdccdcccef6d3db27ecddcccdb93cc3dffeb77eddab57358984472a68f8c7f725fdc17ff329dfdec28bb5f6d57be6bb10330bdfab4d7aa78eb9139ccbdce104b1d10c6767b92f92fbff33a0ba1fb910ad953cef18ec2dc1d991751f7d347167ffac8629f265f3eb2ed53cda1f14f34fedce66e47dae511ffda4e41f8f55aecf7a78f2cfe622a2b38e0c7c7b0ad47063108372b52be07c74f7761363f6d34a653db20d0697c8ba3b03cdc4f9f99799a3933830db174e6a77b97cd75edf2c6784517ba43b2fd02cb10f58758a650dfcb4796fd62aa989fbbefaddf0d524dd47a2ef21dcf62fa5793d9fce83d8beffcbb1f6d10f8ee250361e361de66ab265a3d0b8eaff12c253af326cf42dddbd0767b98f9d7e2a266be86e67b9a791cda2eaadaa0330f8383ce3cd47679d4a633ef6030101b64696d5a1d0cfa35cee56c0a7efcd38e4dc9380ab51806fc4983a9e0d623938132246c88a532bfd890a732f3628c88cccfbc8ae6791ad3ea8dc7bea4d5d2c39fd815b5a5d06463f2b7f9e28a2c14e64d3fad0b6a4c6f684c673467ba4ca6af31994c6f61aa9a9fa38b312210b3b097231b3035de3d97b1c58c69ba6cb4a538b428381e04df8363c372e3c6e7f0f1e7dff8c957bc51830db1f4c6c360aa1c7ece4b4683f919cdf509e6e10dad329d79196c48539a6dfb04b3552617bd01620af3501c850f54a270931b14a6305b9d79ec171b32f334cfd33018911919679ee669663c4aa76adebd4be994e9ddfb149d823f9f66a65332ef1e6a5ea54fee73d0bc8a3eb9bfa1f9957941edc6cf60446e3cfc09b59b9f36fa237604a606b6dd18b9f1a637ddd868ae1ad8909b873fa7e95a8c08dc6e9e312237404c711e8ab3f9fe1b20a6350fc55120ee424d0f54a2a66d974735bd8d87d8117f9b0d0a539cadc2c7fe614760deb441615ab355f8359ec7e10d0d46e466fbc15efe4f8d0f620af337edbc378f04df465b5aa339953eb937694e459faed00b6a2c469fdcdbd0988c3eb987d1b88c3eb9afa1f1963eb9a7d1d88c3eb99fd1984b9fdccb687c8693b4ca94f416368429172d0ff74d329d3eb9cf3e46dbd127f733e6825f6bb0af303beb2898af168dbf1b84c852d2c7e7dde12247b98f3f83a9b8c877a4a3dc4b98adca0cdb6a462b1739aa9a6895262cdb4e17c82a179daab04180b80b7ca6ee1b3be20fdf3123fe5cd4a97ef72c46a7e0bb673236c852f70f33e2404c4ba5e7f192b694a42dc5ea8fb46aa296e6244a2d88a9bf842f65cddca2aa89c2af263ab38bb1b8f5c874e8624c32b8d5dd42f9f98b7c87c70a341ab5d4fd768ac78a34fab4f46d55d2ca45d4fde6b8edc78b6e9a460b94e6a0a6ce7d50531ec20fe45fbe7cf94279e377941d5f61baf7fbc81e632acc1da6e267ec6daec498db580973039035114259737dea5e92d5ac7ba6534c8450fe36d1b6f25e6545caf7bc4d48480f961b238efa3beadb8d117ff7ee5b65215e79b3150eb001787489ac18e100d99c81162e032f944bfeb3b4f52fd3d99afcc6885819a13596cfd3339042e7cbe75fb6b4d14fad5eff63fd842fdffdcce040dd25b53abf310c7b9eee4b6aa5ef2bcb5e6a55cadeac645f7ad7124135e8c44b6afb069afd7ccdeb307b9edec7ed4824a96d19d435a624ad9fc7dfffc89fefeafcc588f0cf399fa767cb5f29e5f3346345e4cf9fb3a46d74f255eaabe457e95d250dfbd69c66d8cf88159161bf181119f63c8dfddc176d48350314fba6256dd1a073a45d18116c73d2fe73a45d5bf7a8af4b1b3de64f2291bef4b3348a5ff227fdf606c45fbc7f92464d47f14911d380f8cb8af6b6bb63f42ff977e962bc0c03b7ac4f1b759ba94ffd4c857885b514830ccca03874896490043a4bbb41aace6a96dc577ff6ad0a15195120ffe29e19d46d40fee58b74d6d6446e553e9355165de8db9a3c41ddf3cb77cdfd6247f60953a8dcacc029442bd7673519401422fa9aec13a6d0f77503545a6f33e24a117a18e308d209eadffb4ef35fec0154f4c4a11a59c8028a300cb9672b4337487003155471a243951d68190a6a62cda056867a18e3084350061085c8890dd0f7563eb066f4c46d68cde8d9ed897da12632a041153c90c6d0500fdc86a20c0df1fb569ba08e04cc16b260451ca0f8f2a5677fa6857ae50e91307b0af56f4d88ec07fe0eb4c28da7e8d3d2c953f86c10273ad4cafe6abff0fcbb9bdba28080478f7b29323dfcfe3c45a766a8bf4d9c425699509ea24ffe3a5e30228aa34056790a2f50ff27f63347ad7a560d5400610640c8b26568a8c73dff74daf6b036e47450021b7ca00644e88902021e3dfc52647a360a08bae7bd1402f4f03b4d0a017a9ec07204ff134638ca9f8b9ec072c47bb73dc1e328ffb73d81e508f7bc3df18ef2779bce3aaa4a5a978888bf6ed1ae21044bb042062be4600b528855c8b667b50230882003197441060fd2d0b33dfb55e7881f1aeae19fa2533bf014a15eb13b19b87351bef7fef27d7c0f4ea86d9fde337bf19e7f36f6bedf3b20fe42ddf3347cce7553c1df6d90f7fbf339bf8e7cb7dee13b7c7f0bbe84fe0edfe3bbfb3f8de98cdaf6a989dcf3743f7c867fe39e69d31b6704f82f42c7d4c9e5e14d8624dc3091e0d76450c52699fc9b533324f6b1be36087f3fa76189e87bb741e0efbf0dc23ffaf4645085eaf4e9fd625e9190ef3ba37f7ff29df9ef713ae5fa24ff3d900df2cb43fefba9658d923fd264a3e4679daa36a4ef981a25ffbda953d63f221948a1f5077d6f6383307dd3d23c0afef2f2fd294e9fa4fc9bf84e9bdec40d88bfd0f84b248321ba443280829afa241f6a6c6ddb2719b5b73cf61773cb83a950af5e7b1655683ffc1d225ba2184ca1f097f6730c8a68a937d6dec3678711b11bbb7f1811f8f0fb77836cff1e81df1fb51ff84d84e156a156d7f16a4ba5562b7cebf9a3f6637dfcc68644cc487cab88d15b5b95d47ac6809c88f2010f0c5127fb4f564035036f80c317fa648baea8400474fe93159d5bb5787a5adad2913627bce2bb87a9226664b45527687cebb7ca74dffa870d19d19796766364b71ff9404fd0ea92c60a9f9fc7fba1b630175da2188880ba5f4cb5cbe33d4dae5becde30896434193dede894a3fed90ef7e4507f79418014844997880a2ca80967ee6abcbbacc45c86b9fae4665e0ce9de3d744fa1fb0164ef81c86c894ec117d22947e123a105851f81de713dd0c9a070bda0100885bf184fc3200b858fd3a9a61042f857a772e0f6b35dfa8c147011822e3c447b8f644b14822d9487a8ffec1d4d88ec677f69e5a1a64b74450a47d803d4b7ca43747f2ee61b145757747f37c84d9111755f770ceade890e751b5089fad7fd42eb7e3f8fafb67435c6801e28a33cf403de0109b8d021738dc896488a210adff9e74c010b58a68005264883fb47cc08ef80c28725f082045e2891252201189ef0104b77fb71adb693204981f60b7d0fb1214b440230d0d6e08601130d3251678d47c003badafe9c3bdd5c8c08107fa15b99b5ba52716b7589a49842fd1f66a46b40e13bac883f7c224b24e50b7ddff01b33e286b8ef6d974757de7879f4fb3fad366d0745d2fd25928285ce5211205074a115032768c2462b0678508321a32e32a040fbe54b1c48b40671210ba619d01a746506930bb4068d800b01fefc03efe25e5056700f18ea8a943ec8e26f8d59b4c89856df628673f1331c0defe25e5056a0ae90dea553351245a2e8856f71331c0d941572435561a1aa54df82b22228c8d16b6aeb28fe91b6bed52047e35b5bdda10b2da2722b2a2af22d282be2965e459f57e8d1843fe77bd87b8ca5156163447edecb8fa3f9f37acb9a8f61f3ad0b23bd6591267cef98f5d76cf9fed7945b8df07963ec5c9c5005185a501f74bf0063a8a1f3733f5fdd31953f1867d01de87e01861774be8bb199ab4fdbd647f8ee518b6164d606ebeac76dd13353119ad085f240f78b2678419fa085f209e87ee1042ddc10754baddf976d75c51c9f743d89ade7f88b15217ff436318cadeac842df3b46e4c7fa5111ac030b06a2aee8934a7f5da4cff8b38dc72fd25fbfd891d27350d30ce6af2da8e9f5158604ff591f6bccb6eb4bd793461fbf44c22e4d6a176664d2d156a1ff4dbf8c9b1ba29b6345624703288801461a94094ca0824e417bd0fde20964d0d885ce9ff05bd371659fb772d59185aea8fca9e38a8e2b1888f50fea229c4d1423ab8eee16b4551d5968fc56c1878217f444f70b28504155f0199bb9a218d95726f0e1e82146e4a7b7cad6dc6218eea532712f36518cd1c6c4bd44d9a796db0f7f7cf8dee3b6ed74bec52eee047373aacc42fddd0b7b1a9487286f4534d4e445398bd155a58a2b23eddaea8a8ede5a1e64d54971527c474e7194bf945935d1eaa4f00eb21ff98f5639e592533a35dfa2d2a91115556415f24aa72eeb839a8ededf1af14b8d5f6ebcc92872484a9143324aa7a4944e451e3d29a553fe9cc5e88db2d01ad41466c9e22fad4ecad00e32a6d54991efefa670533a65bdbf5381a3a253ee1d1557e5a29569d58105f7c03ab4a015fe174dd0825627a5ca29724aa7f68b265c41fda50a3a25a553fb4511183bdce3a8d08105f700ad4dc715dcc37b9e769b8e2b7d7a461c05f22f5f7460c140f056df268a9131712fb43e5951f742f9d90be5ad32712f344aa1fe50d38105f720b3cc1214e169a012e5164c7edefa4dfd389f06edcfd991b545fb2f9e66ec87ac9aae8841fb717a877bd6e43a51cc9fa5eba7a5d59f86f01b3af7eedc5befde5ddc1effc4b73efe9396c5f3afb8c3306ef6c71153394cf5f3da2c6df43bd278a4ed16cc5bb59e2d6df4ac1df9990e5a4cdb5d96fb71ef6ffdc3dc5bd382ac6d1ba136d327fea7b96c753164c2ecf7912d6a371b59142ccb2fc47c636e4edd2d3ac8ea1209e129f73fa253ee9d3f10dfe11c64bc557e1da79d7630ffdb76e8748af9ebdbdc76a227d791bbb3e2428a2f6831052f0cbd400c3dfed9ee6c1a59702185211d94a0688b1e7fd3ee0401841a14edc00d5974f1831effdf9d010ca5218c2bb0bc608b317afcb72861ee8eac77a2c807c1f7c80d4bbf9f7e9b3885ac7fa97b6f6f5e1e2d44fbf927b713e89eb7872ee2d4a134f5de784feef751c701da453023dece4e8a7103721eced909f10ab6e3c08a16745d89ee175060034ff736ae5b63ca5aba7fb94ac694bfbbfdbb9df925e5edc608bf7bf6cd067377645b7c31746596ea8fb7ff7bf7ac55a6ccf5e7171bf25eabf0e3cfa8418d679059bfdc166c4ce54be5d61cf9e1f356e18fc367cc1f6a3fefdd6fdcb3cfd8b6525b497631a6c6ffe4f76b265add2e542c91840ab749fab41f01172061840b2e69449f9688150cc1b382998c271322e40540745e806382d131edd821b57dde35cd644c76cbf6a34f52bef545949fc50083f27a2124e7f46c62a7bc55f95132d92d40b805f181e8f4c95bc03f58d3d971cae9134cd6a77d7ecc8f8934cbf8554a291fe485afcb129156f0e07befe1d08733c596c177ceb997d17d9e951fbe8d6b22e387dfb07973da5626a62f4eff5e3e3ff95e7effc807df7b0f0659477655f8b14367c709480ecee39866327801893698133ee7cddd33921c0d73731c12468caa65c1b7beffc782b14208e17684117d8244f409ee160a7f0ec1d327e8fae41fb50773f54908210ce487ce9c50dbe5219fc71953597ffa3ec19cb938fb72ab92b2f5a3af315a1fadff897d92d57af98ca9ac2dc8a9f5d66692da4ca6b34367c7a949cb037ecee73c8e6986a964fdd8f280cf6e3d9b66fa041fee5c6f5e47ba9859be8cc0f280fcd3b22ccb7a12c25799ec16af8183b95ffdddbfbdb526d8a59cb77ff9d240f8f38f13a6fbe54b695d6b226b2da8e93a762a73ce3d7dcee36875077d3fe79aac8fdbc267f9a3af10ca87f27fe048ab526e729bc9ae39f98a0fbfca975a13597c19ff476ecb2cc8fae306b577b232d941f97725195ec105174cc4452c46bd9c4bcd31235e046edb10ff07067d1f3be595bd602d745dfc7ea8fdc47f719b0ce14be8ffb6a0efe17b48857fbc82c621fe2f0b15f43dcc60b22cbb64de562ffa76ab52fb910fdfd266861961084b5811f930422d6e37a387bf74b1d136a4ebfbd994c7df65cad11132c41149983811650a1557588b4e35753f67ae9189eebebb3023bc832bd48bf09f19d464c48ac848736da77ee03fabcaefaf599da96f6946fce343ac88dcf8bdc38ac06d7a3b5e7fa44b0a737b6e0b717777773f79c454a73e2171a21eddc99d7bae5feb9c98df737777ceb917648c31c62863b4ac187f473043f429fb17a394728bb12dab65fc18638c526e3db2961db9ec73ce39f7de39b7bb6bc1fcb8fac411bee75af51e3b2ff8718c3c114a4cd5cdfdba1f34e339e79c73cebd77a26efff43693a1730c213be79e7befb9291b218410c2665e8731a24ff2ffb44327c6e7e8eccc1c995f622ae6e220dc7de618393a84903966518b100c29a59492a5b418fef0f7c3afbcdd14896dfd7b6bdbd1276959525a966549d9966559f2a594d27a29e55b9665c9ed6789221680d0b7235b22d9a7eb077d3b1af5fa1983104a189c3e65ff9cb8ee7d0dfb75b70e7d2747bdee18b9ddc9774ca6969d82fddd11055b280f74896ca005131b544177d025aa8197886d8459023eb72f0d4e777777b96194e8e656356fbbeecc41bcbbdbbc57701cf7fc9ec30071e2a873ce3dcfc2ddddab73cec144a04fd65793c4e9147cef7f4d8b9d6cd80f2b82a993ceb9773bd7eddc5d739a47866880f2c588930442f81e742aefbdf780983e59d16841cd411821fae4de5f8c114608b7f7a4b42ccb925a84efbd081f0c013333f3ef3f4c65ea1377cbfe7d3047f489bbf9ddbbbbdbbbbb999dfbeef7dcb5f333333747e9ee6e77875f4da676e9990665773bef213cffa5ddddeddfcec1e8f429ebd3d527e79c7307319573ee39e77ceb7e0ffa73efeedefa75c1dddd7ddf414c1537c6e993b384bc999c3b07b5f79c73cf39e7dc9fa0f09d565d8cd0f9bbbbb393417747e6c5ad73ceb97fd551f81c0c117d925f4df14d384f8b613c8d69c48658cafbdeb99f9133edea13fc08ff41f80e2b82e983f025a6821046d814fedb2a53e81c7cdb7a7c0f9f730eea403678e1428696a28cee172b60029dbb936d176db84297a80a11ad270adf44f70b28cea0b304f79db434a636318cecc6887bebadcd7db5b69b22efe3bf8ff27dc3e9137cf691c5674c5647a3949d8a30599f32272b1adf61b24ff15561705906644b54032e34872e510dbaa82bca85ce5dc68c30955b8d5b0d6a1a37551868a8c2e0e2725385c1a54f4be32f9dde34be2a8c2daa30b670e91d93a3e02f558561069d3e3255185dfab4f4096a7dd4aaa31b3692dbf6290635951f35551867f469a92a0c3454aa30b6746a45973666820f7f1d9a60546194d1a7a5559ab11811ab0a634b9f96f2b4ce6b98c64cc95ff7c50daea0fe2b6a459522a727dca3de5a113734c4bfdb036f473af030238e1f6245f0170ae44ee20749f7f01d1bb2a2ee65a7fc7dab4de3d5509ac69ff272293720a7717b78042be26dae4fbc8aec219843a8810f4a35c8b24edae5b17d5a32892c05e22f949f995dba56832aae0629e0e6ae0187f6761b5f70e7ae46917bee8d92f0e0839048632450539fe21e819a76792c8f86986b7279f4db20c99688065968bd68b7b3e406a1c115d4d4a778b176d125a241153a37c2e7bc7925092bc12cd5c0af37e8ba1a150648297e8da175448190dc437f95eeeb04e2e21efa839096477ff54d49c73a68ff68ab4d813010cb3dd4981cda6f6db5690542fba566634ffdae01b17caa39d03d551d68bf64206a2c8ffefe8b8198e11efafb81d801a453bb27de6a4dbd41fbdf56fb69fca7c5875ad6a9f8ea7b8f0cdffd7bf72beada89a335a36db173a188be9fbb0310930f19aa6a74658db4be667467e8be8948d32ccafd0da90375cf83ba973fa8fb8a835639b33cdcbb3bb9b7b44bcba4d491be8384a3de571ca6f935bbbe4a5a257d3a29de2a0e247c87a538eabdbcb62ab3b9d58ca5d0f76eaba6f793a5f80ee36051efb3981204fa1e7741dffb5e1ecf89acf2107dd3979b34b33c96f250a72a0d8dd2a9fa43ddbf1f69d99ef82dedda13bfd4e49ef8a3e6764ffc8c0d99c9ae217288a3bd013d419ddbb6f5c757f4e9fd953ebde722ba3956518857ec110a93b74fbc419a2e03d11ea86e67ba6f4c151908a6cbdf6e734c15a19c92e98bcdefa35633f7df53fff4e7faf48e2ca6b2e2bfd1bfe8517394b1916f414d47febe4169ca6f01f997345aa8480f51a0c9ad55d75811eec4fa20499d046594c2e7eda1b5fa287cd62a07a8bf6345b8b5f19ee011a78e591a94a6d6cf783976445e8b15e1d4f266278dbeb5ca439c8e3620a7d6a62de67253c1cd0d79ff93f9f7672dc42b77cfcbdc1c158d945966323dada9f97aa23698b541a9a1566a7c7d3fc26c1a6b2b50ccafb14951e3a3b061a3860d99988f22fb286afe8a593af317cdcf78c52f7dc45430d3aca7d180ded7157ddb932ccb7e66e6173b02f3196f93def3f49c7b591aa6b193f80638c4e10bb51ee8c98a4289d4da3af5e35e3ec38fffb4ca1be4c557fac957cdead713cdbe9e68fc424b3f275f34ff34ff5e46fb46494a73ba3efbed1dd263bfbd23f335bfbd13f336366f7d8cac79eb65326cab269abdf5246d7b671b95fdfb4bdb46bdf74b61be50ec1b7e7d22486f506ae8cc5b8f69bb3cacadbe1f3d63451c0582ffe4a73ffecf7b1b10fc6a61187ccbd2aa5b5affc3fa47bd01cd6c56a488f92b26e6af2ba6c65fa659f3353e8a9ab7f1515c3f3f8a98b7f13046db45d96c55d2ec2f6d17953d8d569f665fa3d58c66f197c20cd15d1ea5adc6edfd68a969daa8a1194147f16da21859fcd18fbec61f51ac487ceb9f661d8945ac7f5b756a616e694bb1d9d7a3d94a3fa3951ed3accc97d1a4a3fa63b4cc51fd976672543f8c56e3973ed3aaa32592b68eea9f53c362bdd4acf70f7bfe42475bb57ef40e538db61ed9e81f56c4fad156b1cddaac5cff302b52bee7da84747ab0bc9f4fbb29e2e87b491ded420b69501cba5d68210b74f6f5b4ca148a05ea8a368934c8e9fb1505e2f7726adb7363c4faf7d6f68a80c2546e37452485cf24d2584019b1c002422c201650ca88059458400865c402422c201650ca88059458400865c4026201a58c5840898594128b08a5c4224289859412462c64845860f1ae6018e374ce39235c146e4e4a9facd09fb58b108e21841612857ed698382aaded32f373364c35363236359a49b35103d29460b218179dab41c2a0e6622ccbca32180363600c4c566a028f41a33189465b0a53992069d9f2c89a98d1e4a2222591367e192b9060cc46a202a90a648c418589c6f4529a5d48a40c060626cb60cc1460b2d214c818830a3059690aa597c15432980aa6bbf49d6530860a3059690a33a4c79607b6ad0b01c203238458cc12e49530a235739121af9057e41528b897302284a5e565eeeee66576aa66ee762f46e8e565feee672764fd3ccefcbdbcbb83d8e50ab18b8c903e3907b8382a51801a902edc9d736fcef985835cc4cecc2558cab2f71e0c26b118191999914c96cdd0d0d05c34982adb88500393a4d2cb27af885b9c1719ff62436211cd9c7b8f035c1c9528382a9913e218668676df63f667de7a64710bbdaaf8765501638c31c618638c31c668ff1ac5a0fbd6cb9ad158f4ded31941a1fe8b72bf9865b510754c05af2aeede55858c31a8e09ecbc8bc7755a1825f55387655a0a171f7666ad4b8c670e776fdf7bdab8abb7755b9aa5c55c418c36957155768ff55650a5795f7abe7786668260aa522ea3f570b30c627442d38a662e24e54895b9c10b7503729dc6297e50146c6cfe3b10bf58f5b288c30c287714bdc425da9280573fac898dfddb9f754bc2921ebe5eed6983013b29572f45008ce6573ea3585f6cf5df776f7aeb8414660e05163bef5c89c0b75c26e9357b4b823c0eac148a5cb8a0012642891640b9325fad4cfa5e4e4114608010244880be32122021b629f3708a7e057de8912e38685b3b77ef89fb5adb3c5db0fd7f1f78e826f3acd69d3d957a979dd91e0632a47d4a95d366060bd3822474444e445c6ea714445705e382d8ea84ffd8e48464666bfe5950b53b90de25fa526af6854bfa3fac2ac988e40434363c3e4887a26cb6ad4a861aae1cb860d4c650353bd777fd68c90f1bbcb2bb366da5cee72477044db43ff7eefc82b8e6a95bcc245b6fd4f9357f4a9b3d09657e49539e7f59ca607dd63c8aa89b9bb3377c74ac8dcf63d865d29c58b11bca8d6b9df7d6642b64c9c0b1b21ab19e59f1b23699707574785f2b6721ccd70541c15cad2a96acb9c25ee82bbe02e983897fa0415da5c98d01a13e7b297bbec94931586b92c2173ef0e062abfc20c99346eee6579f8b3968c9f7d5da79a3817eaed5c9c4bdce260cccda9338bef58d2d24c196df73ae5e8f284f19a5dc8885eb60c7191d22572298a5c1c7791595fbd48fe88c751fd72b5580102e45956a72c2a2f69fad31619e1a8fe488d581e5932feba45cffd7ba3e7fee36d980e914e0953f9933095950c06ed1fdf3dd4b223ee48980a42dff1dc892883893045745d95c88576472e8eeae7e9c825267b9794216147fc97be8771df1c63334d3bc534832959f222c1bfe8cc4237070686b9be8305be3cc23d0efce0ef081e1a1a92560668f3a2a43b24a4600102427f829cc63fd1558ffcb9589128f241800508080d72eadeda5d1fea8a3a9115edef71da5221da4664a8bb163be2f4bd87108b43778f8f1437280da150af60bb1ecc32b67449430b185e70b77b155ac0f0e2bd76770ec2e862f4e618c928430ce7580bdfc2b9f74a10c6e8de83b014a39496b32c6fb6ac07618c25a984658ddc68e4cda3118c51ca926595462357419fa8d02ba467a1fbd2af50cb52c116232ee8fe488b3e3995e954d0fde92ab8dc7579f37595b1050d2f5d7cc8a3a4b1c58c32c8e82afa0a17445b6801c38bbed25774155de58c2e1da5a5f4501734cee829ad829ea20b1a6770612db600a3484b37196588b10517ac056779a24fcb43ac02a6c253fa09aec25530153cc4519ef022449f564b0476cb92d1422cb16728318410579f36a74fbbdd3f36933fce98db2908af22f8cb6b21dabc3c3c3e0ed0e62de2ae089d3f6f0ffe8dbdf92e08055e8e15e1deae428d97c70a72833167549c75a9c790bd928fcc2d1945e018b22ae94a3949cb63e89fcbccddedeece396bd6b001334996a96666922c7f363964d006e7c9942e1b9c27dd9d73ef3d08618c513a29bd594a7f363964d006e7c9942e1b9c27b51c01e8019503009a8e0f3b7200407310c618a59496658d46a3e9e6f4e639fdd9e490411b9c2753ba6c709ed47204a007540e00683a3eecc80100cdc5f4489d628f1f313a76c8e9f123e647a339e7755d18869148988af4248cc8965ca9e4cda5923f9b1c326883f3644a970dce935a8e00f480ca01004dc7871d3900a0b9981ea953ecf12346c70e393d7ec4bc0080184284024100010c514408200820006bd6b001334996a96666922c7f363964d006e7c9942e1b9c27b51c01e8019503009a8e0f3b72004073313d52a7d8e3478c8e1d727afc887901003184080582000218a2881040104000180fbf98ca000778c6543ccf387e76632a22be0bf0eece612a22de35bf07e4799ae6da9fcc98aa6701df98aa01df47fc747777f9c81ef00e5341e01d123fdfc3543bff06f073a183d09b216c07e5e8ba91c3b5be237bcad8b2f3b5cd48c0d7e672c4d7eeb280af8d4603beb61724be761a0ff8ea4310f8ea5124d05538f2b5af4089c071001e210508820c205fbb4a184ca699992cbb2e23be3a15047cf52a0af8ea5718f0d5b338e0ab6f1181af4ee453e87e1c800422008107380089063060014728200108d8e93122e7c806773e880208e139008e37428401fe81ecf40ca00041f008c1c1830e383826d3cc4c965d978dcbb23095017e8e2e1f19113f1acd39afebc22e1f99011ec378f8b9244722793389a4c3e8ba48594cece92a0cf0b5aff41546be76962d88f8da5c1079a1058c229a066d032a002008408710116288223a7ced2a61c0c17993696626cb7a4b73e9e2c5875c4a9341f7210f456805f8013ccf07f144bc903722e471188087a7830054408aec0cd123c40088146048109427881002e00082877f1c1c93696626cb4a254cc5c3cfecf2910de0334c15c467427ec2c0c0c45c3eb29e8fc15405f8189e9f3232980ac7cbe8f07367dccc8c37cfcc6457cc4c0dd87346171c5f198d205fd98b90af3d3480af1d2588af2d85e76b4fd1f3b5a714e06bab40f5b5a98461e72b8f81fe88a9538e8e1db8fc3f8ec9343303e46b5f11c0d7ce02c4d7de82005f9b887e6d2d427ceda2ae42f79f0e2a210ad043798220c000840011440038780092b3b3391cbf838e9c532abe8fffd1e3ff71f0a0838e1d4e393106c3c131996666666630558f9f34978fecc7d3d0d4a851c3860d1b3dde648af9b935aea6c69b6b6a309acb46cdebd1a2c757de820b1f5f9948cb8faf0c4691186494f10367c13da05a0e00a002d0c30e1d1f1e07479a4c5dbcf4504be9294d85b9d07d17f383a6e375f8d3eff03f3ee77de47cec11e398c6e37dc0a1c3c30e1d7ad011801d50a72d07003147cc3f0e8ec96432d55c3e321dbe0653edf035393f6d6c30224c311efe0653e9f89bd34f1c1c4c151f0723c237dc8d1bde7ce346cd75e37ad2e0a128db579692a3c35756c10ea7af4c050f5fb98a8eaf5c058faf7c05c7d77d03ddd7c03f0ecc21bb644a5e24ce7fe52db4af4c94e32b6b01c0572e427d6532767ce52d9c85ee3bc663870e1e50a71d00a0434e8e4d8b319f8363ebf825992bcb016a371a8e8df62f630c2653ca2ef81c0ececd0da6b2f98973f9c8701e07e7c60d4c05ff064684a94c66f3eedf9bff1dcee53d3948a0fb74bdb0f9ba5a168c9baf5bb464e07cdd3276cb9ab15cf68c1bd624c1d4b03163aaf9ba443f9449314d792aa72a7ca5df0d4d46c33efbd2e368d78d06359b9c9c11759bb564d0fe1aadae18b4dfa46d9f62b6ba45b47f06dbea8241fb6dc86c75b5d0fe1adaf6a9b4c16c7589ae8da4fda0fdf37d6d5affc60d4cf57ee670f9c8b0cf0153953e87eb270e1c980a3e0e8cc85f3eb2987f4c25f38f11619afdd42e1fd97b0d53c1d73022bcb96df3e66db348dde31efc9a43b7f4f5447747cc571d99af3f68be02a16b2d1039dc43fbcbafabc5da25a3ee96e54267f679479ffa6966b6aa23b32346db3ec16c9956d2b64fa4ad3eada79e5b35591bd4ea298781406d0fad6379f4c7ad0280b66fa71c268e6b7d877bb2cc64fa3f9d74e8fe7a05727254ff889e96c70e32fe19a56591e03fdfb17ad6f1ea09f16a24c42b89c3240b39441b3e63aaedea53b3b62eab33ce6dd369998c9231757fa141e53b36e4a27173529090b113d7dbc4bdd0ac5db77b71f7e29b9343ee9e0619204c1c15ea58095905427d8130108f9a903ef9ef32f306208398aa533c7df2dd31d5d8bc73d99d9b77efa4ecceccbb77537687e6dddf684338cadfe66bdea4ada36c541cecddf306a9f1eedda6b2772f3715f3eeaf4dc1bcfb6c77debb376d4ae6dd5699382a343efc19351e2049c8e25720429ea787f01db785a3fc6556da6a66f277659c81694e4af9bec8eaec3267174c6b0a862bc38ad46de13b5266d9dc82fa83412f2fb38ba3da8bec479ffc1babb1dca4d2d750d11411a9746246db4591b62d22a9170c1b725124c40bd3a0177434bbf4a9491802ac9ea791302b7f848cbf3ec43199608964cd6419298381819917a6397d5a898ba354252e7d22020cccc55d64555ec16617e6229b5d3ab5543251c6af85d6d9e50af587c11060f5cc2e8ef29f5d261ad34bccec222383a998b8171af332982ae6a5543642e6b2678d897b51c13c4f4fecc234a65c50f9d59541fd65b4521704583d6f2b7171541162b4d2197df287d14a5dfae42f83a9b2adc4850819ff9c818f2449a527bd7b87bdfb92b6cb83b42da6c236d72717afa9d59216ea3f9a5da8d71217ea1f3123f285740a08cf569da48b392bef1773547ab0347154a893d9423787902309f1aaa18c14456250ffcc0b3a53b319e734dea24fee9bb7f00be31f700ffdfd9be350b841407c78c47b17f9e116ba1fc5e3774e4619ec62d02502fb9f67449c93449cfaefc354bb452a648e568f824781483b6fde07f97df3a2e5b145c6dfed3798cefcdd3a3aa7534e4e0236f72c9392883ba69aa1957d73b0f9dbb4df4f64375e1efcbdf1f2701891778300ebe51f111f7e02b6274a14d6b68e8a22aee8c38840eee68b48a4fd2e2df7ef89b87fbf9a733593a97433c48cc488f4bbb7b022fd6e84791371df3fc28a38e91a7fa1250b1be296466c48d3fe39ea91bbc7712d8be456ae2d34cc1e62e92cdd14e1df27c2bfbf8a54c86e8c6cbcf589b1047027a0dd13e0ceb904b8f7de7b58021e841042882500c618638c09883dee67c9a938952d5bfa4a5fe9d2658b2d788887560be5afab05888390492c01b2c7fdb496dbdd835192fabd372b6e5b4779ff4d11baa28b0df16dbb631b306f6855d1a82bbaf4a5ada2aebc2ffdfa4ef6a497be03f3a4ad966a90fbd2c3943ed3d65125d284ef1d6b4c2b2aea475981b2026505ca8a26b56342155415a82b23e73ba5af3b74d96a7cd7f39dbbcb2f69eb28b9f9e645452492e5ee1e47efd61c8dbca80865456662b725730e55055505ea0a87ba82ba82b2026505aa4aa7aa70a82b5c4c0c29c851f8d6c7fcfa8eccc3bcf49d9987911f13ddd720f7313fa3adcb68eba898ad06b91dba14591fb3225794694545ee5156a0ac405981b2a2d40f8a2a9484aa82aa02750555055505ea0ad415d4157eebada222ab7f6645308f7d6f35c88bfce75677f042e7afef604f7a186d1d459aa49f6f13c5c836265e542a91fa31edd2e656475b90a3113eca0a9415282b505654a19b438847eee9206ed9628673a1fc5ee43b7367f4d5c928b27e7091ae0b758574bd0442567d8b6ff19d4814897c4b24f22d91c8b76891fd58ff688d44a448d429ecfda317514b042316453122199d22c9f797d786aa02b32c54156b435981aa12b58859e216314bd4226ec1d88b5b74eafaa266a86469594a5349cc39c7d08ccc8c200c2000831600302820120b850382a428ee031400138faa4856429588831c4671140429650c23c4004200c008c00c4d6d13e983bebd7ced5df88dca9b3eb7edf4c258c9d009a5e07ef7df9f575a1e6edd4737c240e6d8d5f416bad1c60df992a0523c9659373b1e15febedaf271671fa591044e6307d543584f855e2e7693498b7daafc7b45cbc39dfae04618781fdba15e1850b86ca292add48d5bc24d8d32d0b832afd4ff21162706a629ebe0e70dbea87c656c3cd3eb47aabdc6429dfc4992aa1a57c0e10ba6568efe634c854ecb65334952286d32e54d159428961318bb56d295ea2451b183964ab47950eea47ac14fca87a7947b4b0b8f94fdf455d055f8b3b552d7899570ba5223014bc9d2d3e8555b60734c41df14d791ff6967166734083da96c79af1d8dd28351541e5a5169c108c158b914198f324da9c8ab5291c1a754f91b859e6b15d04e3955a9c8939a9504370ef767ec4ce8aa14dc28c15a2cf8f4b7e396ca2c61ec78c464498d0b87516e7d3f4a3e1596ba67b47670b917161c6b59b2c5469ecbb68f229526dc51885548e089bd14ad412c7f0960f752951f60aa7c459c0aaa0d9f864ea3e952131d4034d40aa2bf254d6a3bd0ce752e30ce53c6b0a7d6925de1e88f6bbe6c0606577bedc27171bb9a19e1ae0f1c1f14f7026721fb7d6a39b9946478a62c0bb065754f9739369a81a5e36d163275d9ae2931eec375977ef0372bba6b5d61d3b4cbaa57ad1c76d04735b27d2957d4effff1576d677b9547b0c3f772a87dc25a326cdd01e94c81ac3f4affa8536603c17f92e1297f9d98c63502e619745182bb2affcb078c1e06024e2de8df84c5d9350f6038ccf41afdf8839937815e1fc147cedfe4fbc7ed8172e6137517ed70df77044963af7141895b11c95dec46fda38f52692d0717a794dc7e742043e2f052a000d0128c03824bde8b7626280dcadd9110f3097efcfced8fc0a271b88d4b74772d3f67e13630f44cbefac0313e7fc01b96b87e5869b65e6cc5e8fcf186a880d6b156efb19de0fc2987cdfa9f256e8bb721ecec7c44a9d50921d42950fce323359cbebdb067938e82817b8a9d4daf757123c02f8fc4830d88429a150cef935b01b67f2a94fa885c721b345073f6f5d3c7d004567f8803df7942e68f5d14374c3bc38c928feb42429b1ddbbc4b1c783ddebd9acfb1a3807b1eef04d412aaa23ac9334c5907990fc51dda6fcbcb28386874d1614335f1b9edb4c1ae4cd6d4dd21346d265ff8184ab3aecd77cca4325058bb23d3b7896086780544c4acac48f7dd1d94f614a2cd910d0d84bacd98cc0029f8c01b3e07e73680273d018bc243f4f27bf007d2183e14cd01dfef5b0f6a843e024216a2e83110f878c304cc2062ba128111cf2b7e9206d14164c4b01060b24eaa8bbb54402a3a02dc6774888bc931452a3ad27b79011d355716e3f6f39e83b9f1a9ca242de518b58d285207ddf6e1e2a30abddf7ed53ec833836a3d1c4a77a9491e0410caac632481785caeba7783efbeaa3294068fc10da0179c3cbf73beac950db19e6d73b113c00d36e5d212ce57c82d20f1683eced85900833135794120d6458be00b423bfaae7fadada48f3a18e517d08ca00c7b7a80fd440081e63872247862591a5c14fd5bf846be5cc549a8480b83b7a00a38889386015b2601eaa3d19c240fe5c550469715f2148eb415186d0a4407df42c34c93cb7496f0303695d4a7b7a69438981536d2b4980d06761e99249fd8cfec7a486390b35abd7cc8cbdac6d11fe74b0f8a7c406d0fe1cead31d8eb132840376310ef755a8760266e5977ef66fa5e56c5c620e5ac91dcbc03fb46045737df94e83305e9462d70178370701342970ea4d23e125b0e6c8ecec477c761997223029b6f3a082f154e74814438a2412476198eec2ab470af228c979c850616b266e734e46b1b97bd81085ec707662025118b48055b034f12fa1c0a3f7308e24e22c1361c6c2e078b546e91a40797fed10c6713122d645d03bab2ddc70966b9fc92acd7875da2cdfb372f606f3dbf01c10d3be6108195a5f22fd99e8d33e9da8ef53eaccc3c353c93b7e70c5938cb68cead73859006d3b6b40b589cae21f5cc0cdaa36dfc80242f9c19b0a099a3888190b0233c66e59222c7c28b55bb2c9d8e2ede50fe507f319f3db715f537c9105bcd55585b15382657296121e1efa6bb491ad58883182ccdb81d8cd0f57e528cc384f42714b5365712a326f13df4809fc4db8808a176310963a50884b495553f63701d4c629123e83cfc8e73b9472a6de83cac4d5f9cee92b60b6622f39c4a4b8d9a485daa215e0e08ee3c553aa8aec0abf41ed5056e49eec48afefea824576d17e3b6eb30d89a44fc8db1efd6bb44501a07519f5cedf50115751ea422aed650e00a051490c4ce5826016222edcd15459d5714697e5436df1e68dfb07ab6c796d17a81cc7c29481460ca42feeb790d0cd4d439078aa379438e36fce16121bf744ae6de8e9100dea03deeb23034b4dde117ab6e9facc63f3189f49d5d651f6ff956c5890ed8270c88a29392afd07630323a19faf64cfec66c2879dc87b5a55fd2e78b323cae510d0fbed99f3c50244d1a1c494857546e8a5de1142788195fed7091d3c0cbdf70f7e605d3f9ec02038ab22b3a8fd521565a616c0a759e2ba6403e30a6abff61285ee2586181e040e6243736717b2d020d03c3c3a97893cb43808840a2ab5d2c1e03a32e4dda7bf132f29c3ce7b2ef61f72f604b9df7f04e0c50bfabe5c7d44537b353886a45d5d0912b8b8fd6109896247da79562abf15380606e6cb319f14d91298e965345e31806bf43fb5a404bfb8ebebba480d140257ce243feef006b55b41b6ccf223d2bc0e2d3702b6dfec00461871875ef4c732447230bade5675c8202895793c610c061ecda09f18b89d7466124f319a860aafb41e5d3c7d20ed150e7a39dca6a2b0b11332a3fe8a3e1a3a79819d7343253f3a458fb96fbe181e4730d2cda7ec44e03d1128ed011a1c5d097c1a8af72515be9b390be0634d6e38c260f0d3bb62fec3e4b5bb83099e9c8d1ae65e823eaea0effc54eda3ab923b581f7a5549deeae9fa8f45ee678e7233632f4df0b6584953f668da06d78464633b4a5b76556d92fccab8a4efa656e386a9b56577a030c4e62b339d2d35c2af75516cd3c376420423215de3e53b253cd732374bec067b56f74c36484fd4dbedabb2b8483ea9c8c52d9895e08a40a1b6525da723d03a5e07f8f7eb024a98ed20c925427e5e68849259222d04695c7a20e49cddc14d2a2afc3805b304f34b4a3a5127ded5ed1a3f585385f27939c191b42abef5477bd610030b0ab2a93e1f5a7caafd5e8a5f262770d0bdf4a40963018217b603c08bbfb368c81db5a46e42b3c94f2ee0e99e506c8b44d7767b9a738807e9edc7676afc002bf5de9edcee0f04885ed4e75e7108bb43316ef4e39d0bdbe2ec5bee818ffa04340c14f16d6dbb7fee8fc0ae06696d8d5f684d1f8fbf9f92ba90d9ecb32d69b5cf8f58deb3c0e9cffb6d2f0d5718dde600dc8c0ebcf019dbbd5a407358f5c9fa69c013cd58bbfb0bb821c455ae54bf00564e6da351290911838062f7e338c44a113988cfb068e8a7c165e9b668451d4e51b0452ae77a2f7a9b28f90b36a43accdfb05e9212e925524531a4c82dcc6e5923c869e5fab1260c13fe49de9fcb5463e0820824e48f0f9851b9ea27c1845a68a6a210e0cef1a0de376f665d309d027c0b4aeddd7a48ba001c5b2330b233f211356ef6de6343e040be81a5254e25723d0bd19b3cc105ccc18a7dc26f42f93d13f74d5c03abda4b2791c4ddf2ce2874a5ca81a63344001adce9668a1fc29de332d55769509735f92c8eaf5bb9eddc5037c724dc0d82e68550eb02c82033feae47173780c104f3d83d5c16883d6d22e896be33b483957a140c7fd455d57555625025677eb821788bb5c57b2131ffa223ec3bf5c4ac77bb94ec6bbbdc32ff656cfde058585de1360d3b700a738238ea5830aeb94329235c56e1ee81ee787cb51f5f9dad52e32d01cd57460b468a4e5eb8ec29c1b10f7ceeb636b70f913cb11d37d5cbdb8dbccad115d0f6d3ba4d37bbb2cad94c14982b5b51a5cb921782153637553285d59f876518162d7e94a2e98eec0057e86f33659cbc6f44ae1a9d6d60bd7a5c42bae57537388a4caf2e48d852cc36bd233bd5b4519c1eb2926e6fa0ae02751322a5fcb14d685ea451af5b3ad8daa863a64348ba3c4caf7a8fe30ed81be420b28ed4bb9fac68ab22d23e70a3e6d74067dbdc2ebaa8b1c2a7919631a1298e0944efea93dc1ca42fc13a085e702dafa20766d60fad635057aab67670c1adee186b81e54e161242a1da11671e7ef01126a4c3138cf7f75a35056f90cd53face84a2da773138eda5daf630240239dccda4297e39155882ee49d290cc09111193246546dca99083e2651a96030d1afba1ac845e1262605109fdb8ff34f78029b7371ffa2bdc22642778cff2524508bcbb3950000855502407a6aa4f91c1a35c9a5c3ce88064e303533ed29d025a5a94fa4c80d4f714cb529a96c75cab7decf39b0870901ec4b9cf60c4e77ffecc548efa1209ff706dcc9e0f388fec4a17f165315478c02bf215a51f4191f581018d14b5706f510bc427d9f46fcc7009042ecd69d8e1202cca9fe952c44e1111951bb1c73621f8efecfedfc8997b6480ec9d13e5148f2fd2d2dc55e61407fa58a5abcf715b341117d73ed478ef8ecf7a4e1c963988bd899905ca0bea7dddb35859741464223322a76c1f34fc3d3d1c357606bd312402fd1e3fe0a36782063a7ac634934d8350623577bc0a5bf69d56b53df50dc5b1a7d491d7560b30706e0d73749a7cc37d30fcde2b7697af242f7301a6f5076d38db9e401a0779518fee920682931bce4aef4d8865e8ca4b078d0231c62d77b34e65bc776b0dafa10ddedbcdcd805fdf592f6267a4680ef6bec75e3e90e40367253164a9b4dda4eea7c643c0b61e773abb6ab347417f39dd4cab534e624a295b5eaf9963ce60c8fbfe9551eac6d49a0769425e484443eb3f08a1877b30108b522ee48455b491ff98d64cb5be470e69425fc4d4c7e8b237b76b5c9019047b2ad0cebed4d67319b7dff31ccdc0b97e2893c2fa854b3c29fe3e003bfffdac0b63e727d0d8c84feb7371ee73d012e0a2fc7f2b5c064ba8762aa0ad5ebc029c008cfea0462387ce691acbbcd5048740e3f9500bed288a4ff917ac8afa87d1a29a62e9925478a6d9b8672a9e4123ba48db345d689805134a5155b417c335452c1e09a8c060b291ad8ccaa846094751b2070a3b73687661ea544918045238d05134b262b2727d3969296a911669b2fa960104dc68b04148d6d66554630c8bb0530f8ed0f283d4363f72151ce8901df66c2955661381ba274c1618a8e3611142e8ccc566583d44e920b4ba7cc3a47aa86a1258d121344364e63c492d9ae033c3934ea95a438e9323a29172bb03050013663e686c44490e38ac9932a4313dbe80c53e695ac314ce2d148a2868425f3aac491d44927655394b5e6b9a6a9b657b775193e19268512803e0a676d5af4c3a4423d08a621bcd42e00f279b30de8f84881e9ab7db44fcbb9d33ce30296775a5485aac4472cf0301c0eef2cce9a2a36c64413c3fcc3d0295165d0da39c40bcad3c6853ff8956bce22134faebd6e5c5e108d5092bd66e76ec11f455b84449c512f500afd470d5faa601716dd56c7196698c134ec2ec69c920614962293aac6388fca8b588b940494492ba55cf966cc131b313532423a2005a1e777a1a28079a501ecba9d3239a810a6fc1e62dacf51efaf2116fb1cf4f9473390b1657ce04b4b06e931066347af4da04d300af5e6446de20f469d1f060d44b768d2a7811b4493608c84d35b206189776f614902e7411d05311238e4cf49781b664079ab7fc0b0dc8eb108020a0ea04d0154a05e5539075f52d00b9326b7e114e4b1a921c8fe606f9fc4edda4021c6c5253a30f47a6e4e62c0dd6a82e4f348ff8d51b468c0d3d5de857461a82c9bf6f62c2e6df01862659f43ef2fc398f638f4ea6fbe93a9de9723d69323c43d85a4135d94eda75f4dbdb13ab62501771ee46f045e9ebd087c60ea68b2356f7326b82d2d627b11ebb91861fde571de3262770cbb8305bf69194fbc63c20ebea4601fb61ca08149261ee9a4efa41289a22e1892219272d1be0d6d22a489d46723a4af8eab2b6332f109e58809d2a555c42c7c2448cb96cfaa01d9bd4b3069a919e63cc6b0cfa19f7e64c44c617c809e14a4c218c0fea4bc822c179ff57cb15c97e43022f16ada4470c7380322a6e7b2208c89f82cf063136db373b7e869cec8b3f4d3c40f3368f70009ea7cef582f863278f66f9ba131b8b111087db919a333a24e5ac862f34310cbb1c7a84a7ac301470643228c99241dc780e0d197845c066318c1c0437656bcd448a09f46bdecd2c1a241a6bd37c75cceccd310d31e47fdfbbb4e334b8724098ac3bdf2044c8aabb0dae25bde6df81cb8de0c0314e674b484bc6ffe566571b7f838d01d3e50e474a8d0518631cf0901557e7d6e58cc07bbbc618330bf11e166e103175673d309a3bc38e371084ada191229ce07c8b246041386012630421969f17e1600026f3cff9e0f69ddf6d3bbcc699bfb1a84ff075df48a46243e454adde0780e3adddba65e3ef5c75ee6cbb26b81ba6c244ddb4b86e6128daa41bb1dbfa58ea09194e4c85393e82d0cb7a1dbd5824664b7ecce09b75451a3e9ef5dc17cfe81865d48809c916e8f44e63bb9f21ef77ba4faed5b9e5b91e0e96ba42848c7b0686ce8ffc49b71657b032eba59f67577fddf4115d31c45085d6f7fde041b6c31b252be3fdc6c7d9450c71553466224b3613a4dcf487b95b1880c23dd84cd2fd1377267d3440c2016285ce4b4e7a892429ec6ef72a9b8c4a1347a2bd3dbfd58c95697f46c580b27ca22d52b0f8c56408ce02c41aea5d7d1eb5d991b413ef4d10bb2bd8e3bb740495b06a02482589baab8ca8553ca1699d15bde610b4e91b50fc69a2a40671fffe7f6b8ae9040e1143ef9827bb16c207fb774fd7c3cd2c55dac405dfe747a8d6cfcbf53ce089646b3b6a4ec194f16ceb267ff106f784d16ef127146bac848f28136a9b2ff04a400f340d9e321fe7f1b685c95e3b89f2e952afdf9879e6fe235133ef9757c17fcdf5a3c6de62ca4ca970d081aa39f34a5aaecde1dcf61aa88932e8c90cafbfa840b3a5fb42d1093abd142dc34a65bbb1fdba5dda1a9a26679046ac90a543b6733bb0cd0adc863dd9837e829673e95a61a42cd8d5f7a64b582829ef3f08af8d05dcf92340d33dcaf9d1602d98e1ce995bc9e2a2e006fa123a975dcec7a912990bbf6dcd6eb38da7eb9782fc5cd0f1f77b52c78303a59d7c64d2eeeca760ecb45d58f37c098e7b7db2158b930997f5190c0cd2edb83d8160347ea63bc3ba4ebd86c47c65a9785c1ee4e90369bb60cd0f5337e443958aea5321612b7d08233d82a354370cadab4f173345491f5fd093302c41d17cf01be9282c07cc006c0402ccc2428375ecae59274365022342b323bcb18a910f909b6aec7d6113b94a1f8a1a09891f754bf7755ca3485d30249c830b509edc5fd149808fdf4889b5213e40897740ae9ed5c0425ba7c9ae15147189ab6f9bbf1168d3f83220e4e4d794ebbac476580b565b5dccee365c07b9d96c8f0df289a674ff45d6f9f08499f73313dad8ea44a92469aeb5550efeb0ec9e82128c2055dee49faf5c7b554685fa99e867e32f1137fd024e24084c93701eb00e9dc1ce023825cec0803ba8624f3c919f2b8887d67e14bd6e1cb7847a651bf8a9d17382689c678005744e93829020e309c33727ecb749c2dd200c4516f315cf0b435e2147615395e4b427f86851cdd848e3fbc23463c028727fabf6ce57034a8a6e554a9442e4f1a9c82a296e975172919e0bb440084220c93a3f67bc544bf01bf3562e99c168a60babe2e818491b1ccae81f571f33f32b9263e3b5ad761e15b541827bafc3a5826a29b9b2663bafd9cb96bbb400d1f5641c4a4dd5dd125db8dc2913f8ca892be3f8c0ca4238210692f95b2e4e4c8db25fd8cc71168413549fa161a4c980db26991b40b44f849c33ce563f44355f6f4012ae0372a11083d04889eb2e55bb25becf557e1edd74de2efa0afff1c6d2ef53a7fd1f66ab3ec63f64a67053af45764a2b0a0cfa2de2d589ea071d998163d6539ffd1f91ba48d4b1c27d098d80823abe2e185f61628d9db784f4229cd2a48f6cf3c5459c6fbcc048c95fb6a2492625c63c5801853fccc6d9adb540a92204a07a30151aa06cae430b23750cda12bdf33a8f1fb4bb1f923cdbf3f63337edef8a56b1dd8557bab05de7cbab35746d28d5090f1de6bf9ac4402a7fed5569caea777f670614663d3e981e7a4acf573ebb8a4fca1a960e0253eb90dac8acbb8634b416837474c51038d50d03ab7d110c4f4853bfd0bbfa2e2db51ed52b94c36fb41a92ef27abde60ca26cb839cf57d1622247aa68ffa5f07979502ef0d0d39376461d8bdacf8d4c01d7b0b27d95278393ada4437eaef4e7d306c5fbaa3a7f6233a47324dbf6955f11278c42e64587942243f684a0d35a942e3b447ee27b0c17c8f58983888146186ce17d562cb2d092568965cc3aaaf9035997048049fa7c08d234125c2a2b84af02cd1e5f5f592b2132aa3f6dbdd095fdb7d0a00638fcd6e27fddb4033ac8a8837f144bba7ef3166b9bf72dae41032fefcba96a85175d10d89b8a3ef2157f9112a8276879165a536401729507702d9e4b041040ac7c86e7e22fb7fc92a5be389a618de28a17294a8b3a681a6fe7f619e6e5f88e083f91230477ae0369b8623c4fd90db6f06c40b4eb1a17bef7bd51f03e9c137a4624e13d53d6f215190cf418528a631e655ec8695dcab70e1126d9a4a706598d34611619ed3b58e04be9d5e0286c04a746cf85c08777bb258b070956a4f0a816c752a3166cb84c7aec4e384df9855fdb383276d45c6aaa2691d7856e35b92bb5ebe62d86fb4504b00b39499da4d756bcce439ac4845626135cddeb9852cb5e97619dcae250d0b18c39b8ec87686437f35ff6e8e802131794c2d3eb9d3daac2462120d93e94a791e9ba7ef34cdb1ea36cb79dd714cacb705d2930625b0adb3a5a127448701ca9a9cb9602546aa7c3821d2ecd16b81a2701470f335e732850c6b430a0e5b52554cc4b118456c28e432ca43eb3ff281ae43c8dc6ceda19c395db56407a253c5c8f0debb44c049395241959aee1073fe1e3e6f29cce969756a0095df458873592ad2150a0f10280967152a8c576c11e196c562f97e98d1314a886b99a9dfbc5e1c8c28015df650047dc370cf3676cef9b395cad1453851e905e818fa23c7ac824a09fa919d67c8a123f85f0588202a3a524c9e72554ad53feeaa47119019eb5305bfb005cd6f36854238c326520267bb61c28507e2bdd20653c0d4df9bf3c3f12560d41394d6a551f1ab7f68447edc4050d9016548c0147ff9a602c63a26960aa44d87838af8f4d6cedb16afc8080639055221651bad25a067ccf3218ae2311cfae333fe8563ad8679d6018b6ea5e1250d9f3ac852d9f163d5c0e39447517b4ef38547d4d40ab9df6261102a244301288c510bf17c7a1390a39c0b6f58101bd27d66f518ba03d66f539afef143f306864be2bf8e9d637c0ad17f19dc867682ee5d841cd8f2894f0dafc1129649e36b53ef28af58373788aa142b06f90a8c8506cb92b0cb7ad83c839e3a3459f9f003e5b903192f38b0e32e9da8a2e109ecb47c1aa3a7f0e5e6586d43b40a410055a9a472f38ae82c1b0adf90667010c53e63fbae52017164bba0350f058ed4d1068a1461a65f36c25bb9b97b51f7f43670e891048941c5e8f028ba8abb08cfca69b3c97866514b84380e2dee04600e91836e1bde0ca41eef32ca7ca365a0741769710ced3e9daaa39409be83a6817c71602b6c9644f66b7f4a684d0a4d065a0c9b6140a9d2021ae6f7e9ed15f70a280df2845947d1d4732d11bd8f384e0d6731686b78831bd9b18bc6dccee26a69b6176b4cdba220136b87bae6efab85f379fb1fa5799b8c07cf13db6f38b0b912d5752fa8bfa00354f1919135e54deb3c51ca2ee529436a547de71f28361396e1e0c03ef8fc5ad0cb57bc4fd9db538d08486d976236e31392dd6e36db212f5cb9c95dd4c754118ba8f90c26bb2e76e02f45d8452deac3c0f5654740464d1596186615380afc5f14199b5931484e8e5bb4b422adf152ff72a2e9a23fa37128efd070bde089b33c8caf519c28ab440f184604decb74c9cb0a7b3eda8ee87cd6f096103e6fe1c925c52e5ee75f644616b72d58ee06acf64c75e8926e3bd9d11a0f63b72c89e071b2f1b78534ef8832972130932651e444939109bb2da6ad12505c40d698c86cf240ba397e8a5a76534c4ab9460d151d716b864ba61166c2393f2540d5b2608f74de39588f59adaf5cb4260a3ce7ebf09d8b8e4b51a9b319b1cffde334712e3a68f91301c91950b229a677673bc527c1dc3456c0dab48746d88bc67187d08c29a36b4920101cbc2111aa2866a156807e2340980e7d3c849af4126471b906adfb8fe7121bafb3ca4537a228bc213ce894137971cb55a2d6475de5ed7d26e2d9d2d626bd1e67aeef0c8c68a231b62ca3a00a20eabb3dd8dcfd56d48512a3ba27d1df269b33659cd771a9612e324fe7490c7576ecd65edd3b22d72e2129375dfecdf4ba32c58c9cf127df2395755d1f0755358aebb4fbccddaeb10679cc83dd8abbaa03f1301fbba106c3355ea7b25ab572639ac1aaafd8928a719ad164c8d661a86c81f2aaa4a924a619db0c40cf8c4fddb824e5c65b0ff95946c8a4c8f2279eafa3f7b0bda58aa21ed73c92d725b81d689f555c2a900e1b4dada01b5ecf6b72dbe53ea586a1dcca9ed9de14587e6aa54cb5e63b817ab4f70a45b707e8138d882dfb3059afa2c11c728f901a3ea9a4195041d4ce72910090491957d87033fbbac977e0dc71f6c78359c1f0e1f79c96a1592ae15e2ef81500cb9192a00af1e67efe85303d11fe4af8d64a2fbc16fdcabc9ea5c80982d8c269cbbb682962aa93357426e3a48822a92e472a3cd3b7ac80fe8926b119517c053335c0e2cbb86d8e6a7420a8cbf834feb1e80b2614d0cae396dd2aee0e46c87c269bab6fde57a6d421c68d6ac3ababfdddb949f8ad26e31f9274354ce041a55ba1373d9773b117ff58a9d8f8ba9ab9ea4eda7ca8d9341a75935103b8b10a9b376081152d9d1f6cc62cec3fbccf4154703bd45e08e814dea71c097801d769c36937d035d5d46647737b786e7508424077f6a7e24e9337a7a3a71806d9f9fa424120479485b9d3827224dfbc4dc57b9b9d8d37c9964c7def4f3b092218dbf711bf6c65d434caa22dc1b9dd197d76fc714f9de276fe0f7f8caa1513ce77113c2182447bb8e7183953fb1c10de2e08d578c8eeb694d22fd0bac20493d5e5fc68c5e92b4da1c83debc8bddeba3ac9beb02ad2b85b0b5b5c693998d01308c5219ffe3fe323534afde3257fa3b73f13bd69cd2329e0fd0e482a9f4ee26dd4a13c75a79df9a653539e154e208f66973bfddb19bd1e6eba6cdcbafbb327ad709604fd5f220d2accb1345bbe3558d2eeb474d9227f553b52ad9207994765d3ed5ea789549ff77b477875b6d774a76cb954567b7c60cdd813e31da12e9ca9268e9332978661f7eadf640ecd832e306c8703ec3d07c46d10908a4be67d7536f5946fb185dbc32ceebbe3aeea25983f776c4d1fc516cdb1bbc9fe360d62ac2c6bb47097bf3aa02cd0b4e40fbf87fe7beb457a11157db2b6890acbb8b79f8bb21fd53b14c9730c3625f123b9f9b462b2b98ba7e36bebc80c5c39976f7402bcd75408182fc44eb0825621ff7e7e5b5211f1ccc6551a871ff6ad8c5e5719999eaf9fd23ad33e18ca6b38dc9c9a91789864e278ea5d2dfb88a63d38c899714cc272e65030d4e72951ef85df27e68337389f59a327a7d2051191fca24dbce622dee18e15996f541cade0a25b6b5ac78bbaef71468bf53b1e2fc9c7c01408552e563e67159d5b8d1ac82f7a9275fd8cd9d25c2420e1d42ab6d81603ea7bd0c651de0c96f659acebb8470053b4947a72274c8d6dc19cef558a38881d7274f451a90540df08a872d7ad957270a69414b543e5b7597deaa8271a045dffb30b41a1ddba03f643a95538a7f9824e463928ae721e75b86e080b0b8dad5278c64f5e468361d6f10f1815548a0740868fe470c9beff7d10fccae5fec25d6e8a49a947b70166c2d8c8f27b8fa526a698c1f7c80bb04be415f8bb4284099f1829d58dc9a0dd698869b6a4826a9247cfd25381cb4241c5dcc92d774b613f1782da42120952c87fc9c2ef4b25c0ac1a3741be89efff32affa4ba94a21c9da33f305136ac215dd3ed4a0a2728fd68adcab1aed4477069c2524424077d81c62551895780f6017fcfa1aa8c513ac04b3b1f8424d118a857c64b4c05db29cffecf5e4d1bd5ad23ced911c34bd788537352085f1e31cf51be7bc02463df55edc77253e177f5a770ac9c4132bd002735e9ec4a85cb71551494756f12fdf37bcccec795b4888c2d98899021157a51a4ae126cdc2d37e3ceb95972ab28779dd873f1c9a624956737f9685d5e36eb6d0a32a6dbb39171e8ffe8230a2a110f89f360c23a88121a8341d200d73973720263c60db20921c1596503451955174ef3dea53c9a27ff499adc3a98a6a554a588c648d8c0550295afaf198852ac489fe21cdf3875c9ace09aa034aa01347ab9b79f4cc39ef46f65d640a09ace570a977a6dc69ff960c3b47682fb253bfabf0f08cab734562bffbe618d31716bd0a7120b584374741a98610a37790bb48cfc432769406af3e70551eb6649fc4e20e3315cd4d7c0f04130973502e69dc739212fc59deb89c1392b29f0302d2e54710813b69f96950fea376b6901c7c01194208382ad1dca694145a629aa6f20be1eff995228cbd0489ab89b5c9f48cd1c0f479b67e48638d656589999dd99ace5dd2679ea8f84694c9724b9635de61a7ac2939ab0f08b70c259f6da180f814c291954529c45494c0fa66fe5c54c8c7a3bdf4ffa1db664c962358a9bb0454a4d2bfbf0009a46590ea73e933c20ff829f7791c7025466bf0e3a3911b3015115d9bbca574e5e171768365b0c384f8b230e9dae7ad0b6bd9ee823a66c00a193cae0039bebfb2dc465f77be27eee15c369ebf45a2211d1c4af56f1456bbf8afd9314df1d000b23e4af129dddc73cac384eed232dab5d07ae8a1cef385f751ce88f34541110557daf1ae847df78c0e12c8104f4b8a5e7203c29551706047e7209f7bfd83ed1ed2da98614d7c469da7df3c084dab978fbbc7dcd0915a8723a05488fc5eff9b034d7c677722ad81d29d02e74dac6c1e949790f948a58d42ac74424bddc585ded56f8fccc1575c86d04e983f44c2c6042bb3339e6cea4593a700db7a753644fbf7b611d71d972563537726760c29664a4c750f72208b0e4bf734f3cfa5cb10a088d40286d13795af9cfa1e1029f5d75ae3ac67d322c9e1c9b012093bbf6662bce394c7e49f445174735c1deee32bca9c717659368b390e0bfa72c2b4081d4b1e0e3b54797a6d081e0ff69be2fc137c975693f9c3e44c9084733047289ce33eb4f6177d73bfbcc5aa6251194f532210b6f3c136a984317adab41b6e28c0edd66a484a0ec8f0261bc0c84a48e24be0051cac084319bd75b222c1ef49bed7094d30ee7d5a22acad46c9547031d61e0156094e202ff8352a89a14c0f67262497fd6ed1474ac8c9b14499e92d06f457307b90406f39d68161eb43129551b000a8896b52375c2b5c88e8f6be4b5397cb274a31439ab066a872ac6a18610b0fc439c4e7d575adfeb50c4685e6e8381d416cd43bd8a32c5994f48dda9aa6917e8e325392faf78dc81a115b093693d4248ad448416fcee4ee07922139bf2c83aa712c75be4802f35d814661ba70727808a6f825c5d5dbc54b2f9045193b95713959645df345828543f6acbdc012e34ecbd48d7332b19dd411c9fda734dd15ebf85271b7bd6bc9dd282b3da90ed8fdef383fc2a17c0f2827c6882f5320779d9f500b114d11e421b3a7150dbcb92c2ad7bd4684374b5820f6cb3948f17de5d52784c4a405a199b3dcce1f6fd1833a571d2e04f23211e482c88b51eeb7f548ff737af01217695d6e0ea61abebef04df6beb1717ebbeb63f197a124b56d60ac8d266bb7ec4e41ecbff16b26cd044a5fdf36c97e8e737ffa9fb4b1b1936158d4eef208be23195d82ac3a9bd257bab77ea2cef4b58e1ed03b36d00c9de514969f503b7a1eb2cc2006dff94b4c33486eb4e89ac9d418d01481c6ee5a1684b76632b52c5acec96d6996fa3a122cdc666c3e1865b7a2e5c57ce3019f4058bb919a71aa5d726a263e37fb19cbce60e516423766f884d255f8a6a0debd785cc4722ca9dd1691388ce8927dc557b808f5ac3885fa85c73c74087e793428bdbb3def20e1d3838664a3bf3016ff6946f613d9f03ec07dd8dcb29d3c2789b060116a27b0ca6b9163e8b5cd3e1902cfd29171ba49936a135fedd4d0ab1e881a31cc104678ff8693e80f45e53e909eb518f8438787b2eaff7afb7c646031b3b435ccd34f044e54f70a0f22f16be59861ffdf10d2f92828e8b3d7e5a9aa797b3d80c9225e4d1a0f3fd10c112c7b6181e389b84efceba9d54c27f814f6f4d3f8960e124c41e54ef2e021515d59af77662a963c640c86cb78298401967a21a8b7774dc0c1194a8f760646c9f7326cec696aa4a2ff5cf9990f0b806717428f7b338335b46ae23c8f9f5ec39fd5ae1a39af373a6c85421c8dc44d9745c9c951bffb80980584b086928178c4567d60d9cc82cc91d7749b0881d9cac089c51a583d3d357b8385f3d9fa4a535692cfe8cfbcffe94f1eb89437cf49434e12449ca0b18c10451f7242d847aee10f204fd2c0d55c21c817fbdc3872599b931662c7a83d7416e3e1b31bc49800b8a9517bf867e4ad8057f32c37295793c5354b5b7dd82183f80aaf15c19604acbbcba7634724cc085d06e41a674a9429a72ae51e45cfec128d102043170c78e7cb006b8152b72362c58e4f15909a43b49a183ef2536be2dd588c08414a23a97397f39741c2b9b925ad0c1799922d63fd31d19a813fbe3258efb0c99a6c9c4020be75746ba92e30a04468e3581a6caeb3add4bb1470663e19e51aa8b85053d13f71d1fe072801a35931b7c2795c0e92c66cffeb71a7106c40b4401d7270fb8f0b195785295366aee2859f027043eee9129fa6ad1503b4ad7574bb448301b819109ce710d5642ea24111d991846465ea228bb4b75ddb779c6100f4052d34e35591aa3f747c11025f2a385e1c183a0f46a276231eceb55145c872e2e86d234735b988b19fffd1826d1ee9fcd6975d0ab7769ecded38354d0e8a7581da94a22746417ca7addb93a194157facb127b9335c4bcaa924c913f55e179bc8e8bdd8c42169dbcd5067d1e94663d55c2da9bdbab58f62f31d33256ee4a72de4362c6411051c60c0a27fff9a71115e5fa3979de88548b9feb215c981d2f7fe65b5efc158afdb3cfc14d7993afad0be5d69b2c613b421f9133baa94dec410e52f74d9f95b31a59fdc514a26aa282eb3a61ef5fa6c62b7b27d60556ef64c5d737df7fe499ab7f443b31175a8d383e7062627f632094d07b6399409386c4452d7378b41508c9320b674eabe0ac79f03102d835ada03de858deb9a8130e0efccd4ba39862b982e3e85f32e86f07d9aaa0e098b843084e19c051c1a69b5024d18bfb8083bf881004709e166fd5768dacdf5745f1ab5e95671bbd1277ab5f5264959abb15c84c769788446298e1bc97759feafc2b204269e898ae676f13202cd96590c6d7c1ac0998d200dc513451b9f04284571efc6895d31a447728f525507979f938770f91959295a3d0452d50b01e7d439cb2a07f3c249f65f0be689749558132eb86839f38ffc50cf2989819c4a8527ccbe91695a441e8d36903fe02a61f140bb645e32b6cdfa660061e3a08f6ec6e433b133dfeaf0e40a6629b79c08989d83dd8d9132c6d79b9b21b45e007259558c88092a564e1c43a80fe60cb4825f97e3792bc005e4093a7d36be700324dd488d4778f44b6c008ed61e81278d2cac8a4024e595f91dab5f827c79066ed5158710f404b487e193c30d56822fffa22bf6e988a74f367e0ae06769e4bf9841d20de98dd12e4ad18e6616f6a1fc0acdf76b5c3032d744e30c1171c34d00cf0bc15176c3c4b1ad1404c88ced901a49335805a342430ce35a2e9608cfd59e10e9aada5f09f6dbc68e2f005408c4b81077fe5a7cb0fcafd9c5f207398a7767957ea76ae3b08ba0e54f13b681dfaf04b233aeefed3ae3c2d6fd7d5022731cb811abe1313251e770d29b63be207189a6a6c0ae8001e8c61520d3c45ebb39d236afdfaf25de857e7c88427e026efb840d9051f0e3e263e668a201d0bf071a93d74fa497dc9a9411280ef976bb613dbea8cab27be9942d4ba01b3234eb39885a72fd259f65a6b85dec88151e3c1e1aaea6cd08bc5e213452acc70eef23cb1bc039b31c82f8884383439eb0158ccbb3bc132a519fae608ce794459299be25f532431226e4516a7a4ef49f92c93cfa9856a448c490c99b8ed817a68bdce898daa78419a15c92b9b9fafe4baf8c794255c91d85a399a5ac11a27269990e7fc5e4a881a7f5e21cef48f7e494b499b41de3e86b89610973ed1eb897257a25cc9804defd258176c0e9c6a341d6a60adbebb82e171a61b4ea73c77d851e962ee405adcc0c8fd801f2152c17d4e25881536a5a7e29dc00f07e13c922f3875af640ee91f8b923b47aa425f1f68971defd771838e048e88365a82266156c9b9a7aea3f1109d49a847b85edae13d8c2f4c4daa7cfd3907c0d0b0f84a9d92bcca83988bc5c4e06d8ee50516d60d46b67f2d443b53e9fbeaafffbde810e34b30a19e2ccbb94e927d783d6f146a47419bcb92b3558066402bdbc7affded77e92cb72679d6c415e146d854bb8955e104f71d1527fc77c28db183d0eee7cff0fc0e97f8059c93a66e4f6de679d6cab220774ddf43cc4cdd4a05ff0500b92f00d42b2beb0b489b770504f0d7c97c8d90555f7b0ea4c1fe2791a4a8afeef58d8d90fa31af499c3aa3bb07d6105c673003bee03fe36c2f9ff085d79977797c862fb8679cfbe3333ec037f32ef578f33c163b482d9a28e016bfde0ab533678b9ccb3a4bb3ee7e73c71177ea4f5d232000aa64edabf394e922084bf34185538d2020938203178213269d019ab3cda86d6cf29e48f2f7357292834b96a8b02522fd432be0a6f3622377f03dbf75f4343270bc74d38c820eb199c6d9503a9911ac6aa6fea8974cf117d1de61053668fe0040563d9e0c68ec90df4a36aa70c309d590db2a99e04ad0d8ce83f8798b975258cd98c1b0e985081bcb322ef210f2cd3801de6846f5f1552c213f58b401cb7ffb03dfa89c72d4e37505e5a3417079b623982201d98352ab65db670433c23cfb731d0b1d2883e1ec45399baed37c8fd0ac2e23315cab86ba651b66e827b87ae4d94e8944c3716b199ba2321afde84c925ab1b505175e17fd17ce4f02a6572b012b94f8bc9b40b35ac2bd68b4fde843775f008f665eb4d7f58fec5555329e13a117921ccd8a13f257c2578af555205dd0452107667b05186dd91a603fdb29881322c7b44f79111eb8934a5d7f63548488bfee6cb39698487dca5f5a0d2380ececdf4ae30e8e68fa1e4a8521c316bf1935411a00c52715ee2dc0748abef0bedeec820630913dd5a4f0f34d0a841623e426d41a4fa6fd7ac2642854778062c65cee6ba15bb0814a1b12e4a5c83192bd2059b84cf6b14bd999eaa643764d4b7264ebda836a9bc8b98c11da97b7d103cea03b2119b4c803ba077bc66242575f7de9993571983bc48b5acb12b20e58d3edf8def535973ff6dd40e5c98fd76600657561e71631e5cdfb86ae294c3dded1276c7ff1eadf35724c74b4a8a8f9c9aa205b2520f03dcbbf6ff78fcfe1a7864b982cf43967cc2f5dbea0727421faab337338de840c78a111adc6347a4c7e31ee790fcc3c7b6acd7ee48955cc886cd71bdcb6acecacbfe3cb278b333a8bf7751d7c07d5a6b92c17a7fa30648b607a9480b956c4e74e3001bab00e5795d9712f5d65216b4f10ae008815fb8b8d60c8b893983a9791bd181a1d3f599b4a10f0194aa9058ce5216f92afe2794da619bfcad0fc88a4410634e94efca2b58065d7579595cad57353f53ad641f690750aed0928c4ce95d725e0071c2ed4b4f491abd2ad7687fac66014804dcbc8c9cee5c0ff52d1a2d2caec7fc1a075452689aa7a910b30477e65e895dcb32e81cc433eb5a07f61c64b4733928f31930709f14bac66c61e7af33a9b4af1db30b983df7da932cfde93dbce0356111ccdb97353c5f8ae42cf0e528aed450f68497b459846716bcd343d14f795b0977999f28287001054409f4ad1977717056d0e84b87ce05be45d548e629223696b22cae009ad3a1fe34b2da68dfc185e48035bd904c04f006362979051ab44d82315e17eaa10bcfe466e529d531b41ea0ff15b74fe00f6d6d364e0d787a58ffbbb944cc607aa9da19e343f9266644d02ee85868b1018c2405ace9239d00d22908739374cd9d39cd080ce20b07de2482766bd037c411e70123d4a687c48331ac445eb103f4077fc51cc068e2fa20e2067f526480a0a0403fc6f6d87b0c7e06b20fbd425b399b2c5a060a0f6802d6f26a17e8acd9106bb711f2b28bc1a95b8cac2b9c08c41ffa594ca46dfa61da0c7aa21a8a21d0089cc0005afb9fd875338c2cab2fb5a165c1aabf7f2e086f7885178ae6c0a726f420dc1e57086c8930ec64c0b69bb3e592d0f3db2ac22fe21bf43ecaca0556f0b09b3120671b28688cf362847dc702bf1c98d68501e888f2cc6a64cf8f1efca498af971043b339241c678f103cfa1c80610a04746df7665e6306f0a5693c4e735076011eabfa789351a4858c1ec7545ccccdf59c35191620d6a8313296e9e62dae9c2cfff15eddc7bc1c77fba295147c6665556010d788bae35496ce84cc93b3f3a2a9bd46716436b846cc3ee9b55341819aa18c03ec387ce6424fb24892572fa48c068f1610bf2d1a91e2990955a9c11d573ee5389b421b8b2ceea742807316f7d083e0115cba6b10dd32dae8364a75f46bc299a79d64b1a9e07cad8e22fcbd650bb54a25c40391a81eda3dead90be568af61f235a3b3b9b1dc5419ca4195abe979cb55c817afc7ca4a9e5f7255ed52a7eea40900ed3258a0c72b4baf7f16f8f25d10846934488c57eb7bbcc12e1aa1afb725248b5c1fdc3d0d3c87acb21b09da3e4fe5eea963e027090e3d958cc60d4e17f4436c72f44a76ab7eeac428d4a81a0413b82e989cc99803f5e266161150e22a667c515b8c92a780dc4c60379c447c224974adff30851333315263f8b8267c5e10a215051a2e8026e6a706e8fbc32894b61c14a5a52eecda18364f4babbc8a629cbc365e9eac42003379a10fa646ee09a507af1a97faf31fa339c91f523d2a02e7e6a9764b5143c73e982b0c93ac1b62a72373ba2744cc0140d5e62903edf59eee8f57b0c0bda5e2ba132f95866b244f733de989475f5d2d40f1fa25b6efbe0888de3f31be3acea6e9ecd2a90b27aace11bc6873b177c58bbad012c548ebc35963a47870318913378a1b2c7d4d243b07564e6af350facf15d5fde489ae58238bf8432483cd62d47b4002fa8a52383bb6615e0a4f65b809aba2952629529a351c703ef800a2d8c54b9cc596ae067187f827abb23cc7d2433101368dd7338770a886738b75b8a200c51ee54ac03849ec60fb4311b9dda0461051b248e9d3c49ea3704121b62040619e39957e16c50291a11758b12dc66e278d445e997755312c6f402f17043cc5ce422e98614183c456b5cd564408d70e7a0886b7161d15152b587113ca64f85ab6f8f2b1285447ea6ca02036dfdbc00f05d4e87deb35d2463167ff4520c7a0522b45d6da83d76b9a196def6c6d4a78509c10d2c9ac7525cd12b8dcaef41ccb322e00abd9ea1c015bc331c0caac1800428c135725348f566ffbf6836c4c5e2c687df81212a357c89983e65175b758801d02211c4de079f56de9ca49232af9a30ca093f009bb607c475a3eec674005e4aa98d66254f9a5aaa273137cddec83c88650104f2b83ae2b48eb88d8df1371be57d9ce8781160c27a691847d9ad174e20af52613c888683f0e538e8fb9a300ce390ff1bce554d48f862350f399d75d1d304f2235eb4b922145d34ffef6a270460a2ae3e6499af516673fbb815877f60d20fbebfce197d936d1906887ec8ea8ce293c308116ad2897de8d837f5b2f32f995df0566173460629cdea1d38f01c035d13543b4409a712898a2c1ab6d60901f9b8406a43240c30add6b8798c31a0dacd219f875affa69968a65246792e83b2c2c05e14897d251110034e6f318a60171f93e8eced54055dc5e55a5ed2bf4f58c44bb8d9dd574bad046742c092155fcbda6cf77479212f128c32f1d85368bc47d5412dc93c2ef4532918c11965d5f0e5213fcc4b684462225056c8f091a0c3738f2ad0b1440af873c390cefd8248aee5859a9a36d70ef3763c289e4f1c5889da2202599da9c3b08b52a9a25f254195a8f41e0067bc29a622d0df053ce3663115c8c9adfae253fb267612f0506a3e0d2f148c51f7c1d918afd98c5808ee7aece3d05aea06ee4aee023d2d0d7c2c7f1b5cdf5a6babfab972211bb0f9d24df3cb2986187dd14eb7e27b80df5ec5dcb793ea86d5ee4d500dbd118d567cacf1b341404594894a0d04603fab6306c5401055962d54ed793586e0768a145919cb8397c5b627baa462f66ee0874d580e3f541a6f04d5eaa215fd6050330d675cdcadcd0b07c72354fefd933ec5aa948c3886ad64975dd99b8d4b3fde55cc26f95c684d978def938ff336d3a741ca030720f829fd7ba8601f558dc50ae3ad6fc64305812961448f23db9e83a2944bd38c3abc00d1e9e86ef72cd8dc8a77acba6e08451cecae6b44e6faf307ac99fc96725d2491cb9fbea5f1a386148bf01b84e9f3e0ddec9a491c72307341158eecb2b72b56cdeda052b16215492d2b34f944b313e825ec5c49a0237e0e6579dcfd350a132f4e4a6dcdcfa5eacdb8cb8a8b1a0a9409a9045ba79619b308c2d33e434695a205799f9d8b3bc1d3e7ec0e3ada44ead8a947e49b477883a3e2a9b421da2e9919368d9fcd1048583d07caab2c2c43973000fc45cfa37f6ef04c2340698788df5087f1a5d73814bed98cccfd0a7996dd1c4d9103f04de4c0a9d83793c025536e4b9f3a22995c57365c8d7b882d876ff02fe01650f6eea581bc64057723ecc553b53f848a0bc8612fb5b42d87cd71df791dcaab8787631df6720194af0c8f958752317a2ee2b3b17249087626d4dba2eb577c26439a82b1a52338289ed939f96d8c97f364cc90c780d302783674914216be0d8c4a2e83801017fdc526e294508ea890c20bc55f04142fe3e5283fd2aea4b5b392831ad6231cb3554a9accc911f62ca302c3d05293b0c82b80c2ef977a408c0da1d58b18a880afefa0f8ec0abc1a966bb01b1ea93467b886256e7008d6815d3a6e757316f4aa3c1d60923f60bf557aba56e4bedfeec25facab5e0d983e2bd912d6cbcb8e33680dfe4e5b5803a38ea3980d6cc052d00a7b62b91bf64d2f6dec938319c70e6ec4017b2ab65aebc80693eb574691fe4305840e1c63512bf4c7d006ca97e449c4bc61d719d062640e4eaa82d98bc51d59dcf433c62836e3885915ea4c96487a92a7fa34b80471a258df81bb53b79bb4f86eb41c236f3c2d0dc0f17e5e7fcac1721884941a9cc0e93307bf56d045b32935b06a355b02d73a25b50ed471ff1c9b934afe2c2293ab926223bd3e221a0dce710c4d00688a33e29d0cc0c619e918c59cfcf2eee18884ab16e48139ce0eb8c02658e1e4ec4f7f1016e3681b87e40c7f3d27d1ed6aa4a6c5f44f824442bc6c2eecab34b52feaa6f2e0ef7097afc3f4024175ffb2a7a3de882ac9a595d749fbfd7aa5b32d70238b4059a9271608783fc63d35aeb2dcef7b2ddc84225a0f44c0de7494e7fe9f79d65139d8907aac99162ea68e513d277ec2bb01bb312d5e9ebea5068f82df24e0541fbdd0952ed18570e8f3451a7061123f3dfbb8d30a9d1cc1dae0a04562bc2b71beceb021c97c84a7026fc50e846b7f03edc86996df8cb664f9dd50b0faba48003eb01e435c42a61838d53d1b87d4ebaecd0308c9f5d1fe900a8859089ba846603e8d41f4f5603be3c4e120875c8feeae5bfc1281c5d826c899729a9139e74fcf042433e6f1ca7fd0e616c91156151ac8694113d4cddd01abf0714000655045292865d04fe882ac98e87759a1f3440526bdd81521b0714ad7cb9ed97916025dff8c00dce0f50c2e7e8af2a0a3bd28c6dfce387bead3a686805bf6f1374706e29d01c9bd2da67d024c3a1790b4071704f200e6c5f53225e70b70c8f4132bfa37bc1009a76b64a23c50c0e9ff851040b78d951924f9515a259060b0bf2291eabd8df143fbb542f4086604bfa81f2b38c7f12d682ceb798ab62f1ab99d48243312a52cd6c1ef60f03bae29e7c4ec80a44d32c51c0574426a2a2232324c3092c07b73d605a4449bca71e8db7aee8d81cf6cb78938864d9fd380c28fee80bca3468f471d063955c3e03856b61280a8920f3fe07f4904dc4b07b5dbab0968edda23467da8bafcf29308f950c56554946423af329092805d4eca6e4b201b7cc10a31edb0b9c3076096170c3d0d96111cb19ac4fe06b30fa113643d3a972f61a9d417486176e7a241bce30eb41ddf72457b233c0865d13dd39df9be473ec78035029a0e2d2e073aa89c7ad0c67aef69c215dac304fc9c80bae0d76dd21a5cdb0acc4029350d38a775a636c85d718b586f612a7fb4ad71fcde27b17bc1689af37a58f145af9fb51903de4e12c3b9fbcdd07fcc70c6b9d107fb18bf7e1a816a88d55c9995f6d81e0600d40fe2fada0fd4ff1b42b90f47c09ac17c46eb92e110f666886e7732b838be2fb25a635512d4ecb42e0cc21b4f9e3922167c03223823be8b5752e8f70afba92ebc5346cbe51b483684d340f889f2a59df666e66a0235381427dd47c098ad460d96834ee64bed38d1e7425259e5a15308fe5e1185ffe0d5a381944e11a8e72c59da941d75bda4c4b2b04dc585e3c5b70875d628855842ac40d5f569d1f120a132a6405d61203161c0ad374097903824b5035cddb94d81201f0b97a9487daa0ad3a4820545111da0c02e23bd30c1830fab66c4c4c9655d2a84e041ad322e1b7fada50fbb88d51b9368cbf6462254cb58a43881dce2d8c3c1b40ce64ff715e78a1ec4df1e2c47089abe3c4fc55e16a901986adb6262e6928803963d11ac96b0981a360abc908753456c74f8fdc943fbb739c7c1a56e10f49430e85e41fd488a511661ad594b307289f5c16e50e8b13f2eb607d014bc3226ebdef2a38977b704619f8b1655a5f2eb29ea1ea1dbb2538611781cebcfdb0a548f51a0fc78cf12b662533e04161e314e5bbf5c234b94f7f245676904abfa05a53e898fac868b29fa45b047129e5fa82babdd812a918da9402aaece1a606ecee07b642e3a5a054bcb600118ae5bd1633c9eb801cfc6667a6fb20bc315e9cb4c71b5c0ddef3e8fa1f7fc519340a5a2530af0b08af394cbc3ad3506c68710155466b1f94f947bda7bb5f6ccef1a456d874a0b40b6af8cac0fc7158a43e6cd4193e844329de500a41205af06b58ff5a5c8e8b9c453f63c9283767746f207e4b9867f88956eb3441281621c0faf4c3789dbf03a61a2cfe54b2f4476612a81e01d06c50064ab30bce26689f2dc697e70bff764ab38eb1d63648ca743df008f5b85ca84f310d824912b040677f818cabea999b3e32edefca10239308a15449b4853c5a030af69967c0d6fad5869c0f8ef4b8fbdf4e7ab10c4b13108c9f9e4e76ef6b48a2b9c5f6dfb4454cc53ff9dd96282cd3381c42b6d872de522c1960806f91d597c84703cdecd428a928392e2d94c6cf0b7d65e90013b03f444373a6c98d2de1b651ff1ba13655be46754f00d3fbef1a8d0402eb0994996c5e8ac2d830cf6aac3155fa15ea021f51bc078d015d6c0e6829a75e10d0a1e1b2acb9fde0480533ba07421bf42059f30a30af7d6449bb1ef1ab46a70534fc808e450158279d8144cad02602644edd7e5477f88e208bbc8644b840820c3cc03470fd08d3772c30b400f480e6a8d370f8dc6a245f0b0b95a2139d97807cd1eec83a2e8a351f5955cfec069a37074fcec578e598f63d3a644c853140cd9caf1cb40e94108f2bd51d79ec26c29c47fdac35fca42c7050499e2ff97bea29e49d9b215d944a40943d87d2e698852af0fee7450f7547461b4cc6f56afa50a7cc56751195bfe2c14481727aa9177df9422063a625263a98f2efb1a532d8b7c6788261c1e5c5f0acb09fcd01695ff5b944668ad9e02720642808bb2e8a0f90e2e84f28906ea983d5e43c5f63d5c158fed498af475a43413311cc98e6746e200d1eeb93b57dccf8fcb9316c578a2e008ca0be69f455ba70e68a7700ad8d5e595e20de741fda06cd374e7bf5efe540373a115475c5ee07ce0a7e6305af1f2ab0c7aee8e1aa99f7555ba1f39b84ae256ca0420d33540fe8c33ed0cc54529e40ccf62a5f6e5ff28b8674d45f72a17cbf6622264513e80c26c55e4926505875d33729c187703e492ae0fb5aad5f6ddc33bb7d0e811fe6e21ecf708b18892171051484dae103bf7ce537ab51c5c19013934b504082ff60deacdf0bd62d8621be8403f4e1efd52def96e5481f4c36f2568e99f00ffdf3328b18099fbcc47b6de55a9e68515c4211e8faa583e8f90a11d4e8b817d1dc437604f8b2c4287e24dc3ef416c2e8de7781fe314711dd69d8fa31ed996c7648a050b31bc0292bca2fcc271563de2cc7018eb0c5d132bafe7b31a399c64e79fb3cdd073f965e2d5002b3b362e0a51fd25a72027ec1b40442f8e7063161ba26bc3b048d1fabfcef444b73949a42ff56ad30efb40131b3c15a7103d3a8123560c951c49147be17869a4b363e0560b60afebcb64dadccce9e975423e26c47ae774817ae2692d956b86cef3d6fcafcd7f325399b9818a2c8b9ed0288e477b3f65e8bfdac52c09e658efb47be327e424aa41612892afe3dc0ba30d661d1dd8c0e6cd3dea21915448932333c627a2b230d245994495330cc9e0488a3c3663322d4d301fd30dc41aa5f1b2a127087d47e24450020a633cec04bf96c0a5a82bc9e4b90be92b6403f9193d4240707e801905304821447022a0a6925e26b638c5d718d1181fcd1b7d1785b4a4d530171e391112c6452a849e2f32af0d1b681178d42d9fa4ff4a1b720b13d923da9d2d0b29d705bee52e5fd27c51bab607b8487411e6c129a401b6a8ae708939e8ab852f9364e3b334487255d04b4a8d72410f5529054fb2e9ee3a7cad24cbb917e49878fd7c07bbbae62948195c16e52296f37372f8cef70f052436309246ddac0d7dfb6e29decdac181a80c30f5c16d9c72fa327649c23ade5164f9d2e9abb2629e69adff46ef131a42ae9050cee038a9ce3b053209c554d074d71f211492ae3e423d25866b689617089ef30738b331ad8ce240de229b9f112d399d9a20cc0d0a1034c582c840abc29f31fef4e4b384f601dc5cfe4a661b350466ab197b4bddbdade5bca94520ae60ab80a8b0ba893131e299587f24e26940e85db4a282824145e15e68e51ca1386e90b17026fdb25126d1854ce46931c2f16f5855ff585038117c6a47cb0b6c488705c8a6350880a8795d858c579a50d93916be6962399429dc7bc2ca591b44b255e690a755eb30ccb646cceb6644aed60db18046b05ef7467988ccddbdf3e1f415566dbee802c083a03e8ab489c3cf1155dce2250d8bca2f3c497ec6e24d2431ddd7919bfef01de7a8bb98df0322761f3e1c557211a40f1ebdbc987275f856800021b2a655197e6618c0f49ffd217f514ad892893d63451d24c6b8c58187591fc6661d635af6f8620e2068c2684c0236e86886df837fc7a03145c24322d83aae1d765138a0623740c2fa561c0cdd624a15e281986587560b15ae8d0d232630e3366b01cb1b0ace4b05ac988830c192b705859517da152c578438c182a6e50514969434a4aca28954261030acac91a4e4e506a40a13c2f3cef9486d3c9840693a93b43d7714d386e33c3b695ca502a91c84022695d685a36862cc3c48061320cbfcf8e84be748cbfde00a5e9ee5f6780d230f3af2f4069961d0976edaf27a134daaf5720a9224e41533969b91f6cab75ede2a373abaaaaaaaa0e805da5579f598d39185475d52104fd5a718613bcea4e17652b689c9752b1b87c0f60c666bffb540ab6731f8b82eddbe7da0de1153c11f67ded7e68cf3354a2f4a5146c277d9e72aa6037d8298f7b6666064167970b164a7aba8d52b00d173b8f5f8a5693a230ec21102fc31a191eee5879f8834ac70c0f63563cc4c17283c5c396ca431aeffe329c1fc343969728a997d2a5ab3479b87a95190ab179edf358094f536d0dc8b235397c6b6216869dc7c2b0cf50b1cce82e7d6137cdee0bf7bb942f9cc00751f1e86029e45f7d4830c82ee33b8241f695af0805d9555f8f05d9637c4228c8eef21c9bb3c770cece83143217f32a2e3f154ff966d8a5b2f22a2419af624ac9ba1ed263f84da77c12f818df8cd465934a5f4c2b6f4a99e1043ea670544a7cf452424e3ece5b02f5691c918f31fa8226975d8e296ce2634efce837dd7dfa582814569e3463f352dbb5b1612d68510c921c7e7efd07ad59229479751d5a436461368cd95c250f6d5e7d87e25097e63794654c4ee3d5359cafae612a64d9237b0414c2453887c25f9d2fb13537289e72225b33c4c2ec89ef91ad21e2e49e2bb13503581802e84bcb20d1ad75e9375bb3c4c2a426ca0c7988ad21b2446ccd1e591802284da82f5ba3c4c2b40c07bab57e3251330b6f3289e85788cd678ec4e4da71c0c48123ef08f6fd218c45f44b237e20cd90e4cd3308c9a52fb1826f41f6e92c14bf8e2d0a7e7d8be2d74bdf3a9135c11e5911fcd23ca12f5bd3c4c2ac1b19c1ef1ef92579f61991b9244d6d86eced213be652073b6a1e3d63b45f905da19643e5158b1f1cd154fef34a43077ba275b62e8560487a63ab629059c520cf3cf3780667d86d9807bb421598835dc5cec2aaad75f979e4249bba783725d7d73a112db3e2b92a00e6243f40e6a5e944c933274d27921c51f22c7327488ecd95e6fac25c5f5bfa48dfe7756b1ddb3878a16b3b77af578481e7465b3b43ed0c9ef66ac5197cbc65f4b53343b17fb0d6bab19db1bf4f075b16c2c6d15d18f44d763b83fd81ce2e20bb7a32c820b3abb7e955288c29beb1572b9a30e199b9590ddc33ab7e813b79b5c20a2323d8348717a3abaa6afc84a45edd85c146e16c31c4a03e389dc1752ebcd07fbde0ad8c5148ead563fc345e86428c517b3a248ebef8f5e569c28126d689843342326d62896f4fcb9a8b5d7bf735a1ed30b82cd3b1c76f773860e4691eea51130c6ef715e91c0a7f753309bb115b3683b0977c9ddbb2cc9b33cee1c9cd2386484618c1e07ad438d0c4eeb04b71b449243e4f26e267f3889467c41143dca8de26f58a8510bc38bd5ad1048c57a9c0981e8e313b18fdba6228f879915e9aab7b9c62d78a5daad8b5e269007db5ef4b57df7cf0666c185483773343b4c5af2bc1048924c29901ccd8b08cbe5efb929fa6203be9e334a52d05bd0f89bcf6d8637348132f670e0677822edbab1557fcacabea9f608e3d856da5a62dfab764ea17f5c5019e5a118524e8c7a974ed648a24599773f5c5ab5e1ebbf784542ad5ddeb83b7aca928003675c901120c26a1060f0906d765fce06571871f0e0c29c12ebd02043dbf2e44c1f87508b02b54a25fdf9823d855fa75249260197dad6fa92484a49e9b786efe424e48ea1d8004834a302884c1f5951cd6b527c1adf5923b805da413b779983dbbd41a08b047a511927a92f74482f439200d1ec943254a82341d0081ad314261d6779b21af6b9f106eadec7094603073d30c75d8975882e451693627cd90487f7f4b9c3e25d0e0b510fe6db9eddbdf48abdca6a82f24bfe18da40a92f449a17c16f28137397fe1073e53825d275f17b2c469f6e0914ea449a44d4cb469c66eeb74d914f5859d080e3fc011c1930806779b6113d84d97f493609705524838809b7922d15cbb2752af24ab1f98b3f3b440eab33980c92d1103589b2ece9988c2d90288417dffd0fb8d61d73a0f76f9afef193cd4ab154c307af63d83477ab5e20c3e78af65f4a57defce13ab9375c9069bba845df4ec4d6485177acfdc5c3c3b151fce5f0f71b4bc15cd43adb760b04442bd6e2b94f1ece1caabab0cafbeb047659063b0db572385a895ff9e7b88c16db951c9a639bc8efafac2535f6ffd3219c1e0a96b0c6e6f6cc5dc430ddbd95349bfa85fc7e2caafcbb8313e0e90140cea8b671815939bf98093f8e8fd852edf522a106d0651df3278edfc097179cddbdb22b8b8b8c4a8b14c11cca1f0173693b423e1f1579631145bfcea7509144678ed80c447824dad5bcf7e6a6f533bd16991531af6fda9b58cbeb891b029bb582a18d9c43cb7089bba84abe439e5f2d293f875f9852e2f7dd35d6ed3d8bc519a545f52be9f763826bfe15496e25687e39954299561c2fb9487fd9e4b5fad49b9f4a8ae1397aea92bba744e6584b8bcc933df4c9f8a41f62e3c9387dea718643715492255fce4c3c0900de34f9c88f628ee2d13f3a819ee9f7cf33e965f631e12cc4fbe00e80bbbca870122debf1686e7106340f9f4bd2f7efc86d0ba1efc27530cab2f285474cfb7c87948525c25c5e3878447f5c2fcc4635a4689fe41652aa04ab4cc1ae10a846be4e45b1be822d116fb1a61f63dc2ae94b3ef0fcb704ee23cec27b96efcd21ad9fa3b0ffb37c73e22bac59e7242e577cece813e71f99d78ea0b753ee537ec3a99e1fe899fcc3055ea7a48f7fca653df132fbd4f3ecac784f69e7494aff4281d354fa4eb9f78a9c33939f9562b753972c6d2b67147b9ed86f21b4675e83df785ea857081420de39905cfae42297659c0e5a5b36e8b0473ed9e70792559c9690197d656c946b965b1adcc58a9a4872aa9e7d349f7ec61698b8be9cb97290f98e9190c53d8796001e50c579e9d5d73ecd3402cf3e8eb41325069544e1faa348ab509362937c9fcf139724d285dcac8bdcd0517577bf530660b13c6ecd57563dc1863dc183f7a163772cd4457555555775577577577695457755773fd34dfb69d917743752caa469dead854cdbce0e9f41854ed0b531fb1a82f8aa97a36954119533be8d88588ad87d9165176128496203b2a0105a53bca4e7154e0a4e07e8620b11f6401cb342dd3b22c681a49fec05b979a26bdf334edcb3e245eb7a8206d9623ebc0ce9405d3e9e4c94e725a306901758292329d3ae9dc1c7e88b1e76a2bc66e192349ca1ded31c6969f7e8c2429638cdd526232ee13ab8375dc81154ebe368831ae8c731594b22326a5ecf618314c3a13b44ccbb40cd3324ccb304ccba8a0820a2a308c0a8c0a4cd3322a308d0a4ccba8a0820a0ca302a302d3b48c0a4c33055993b4ac03b219d71ab795d93c5c795d98b0590ab6f6e5d9dbc6b3ab284d8bbe6c0dcbcaabbcfaf0acaab1a1ce631e2ec9bbc3cd9ef8fdf43555e4952a4d98675388c4282546bf040755bc0af5808b0f4f6c78761e5e970cf9fc890d4ab339fbd69153a681a739d6f9e0c7ba02f00bf38c0b731c71519a1cae5e43694057b7a1342d57bfa134385c1d54170fae9ee345078cba4aaeee030fa5e15cfd07a5e95cdda52e93abd328cdc9d56b94c673751ba541b97a10ea3a71f5571a14577f294dcad503a03429ae3e84ba545c9d08a589e1ea394aa372750128cd8aabff50970c5707a2342b57374269585cbd004a33c3d50da0ae16573f80d2b05c1d014ae3ae8e84d27cae9e00754d575f80d2d0707506288d8bab3740696ab8ba03d465c3d521a034375c3d024af3e2ea4ab40ce6ea4bb40c0fdfe1a11eedb0068556243a4f121e03f1432dc7f34e8d878ff034817176ad488cc378e8c1ccf0b4c5c74c0cec872726cf5a9167f7e1fbe1f36dbb2c22511d1f8b4aa5001ebe633eb13ac0be76f8be764c1eeec5c379e2abc80e87427bf9e0d8b7afed8e882f1e130a119c5e3b9c5f31aec3876f75478c6f87d3038e113b3cc6757864570f33d47918d7e13b3ed51d315319d4e1dae1c0ccc8a08e1c1fbf68f19a13ba2e4785ac60157a8d27c7b7a7e6727cfa3c7c9a0a1464c7f16929d017f6d6a7a1405fd8c14f33a22fec37a2f0ec3684f81a4d78769725cf4e238b679f42cffe31e1d97d09cfce52c2b3b718e1d967043d3b4b119e7d458467971184675f01c2b3ab62fce0d9557cf0ec293d78f6140ff4e5448a6747e5e0d93d1c3cfbe9063478f6eec8b3733378f64d06cf5ed25ef0ec24173c7b47f1ec526bc1b3a3ba1c21be9bf4853aaff1b487a1c6034485bea7c6c320fbf6a9be94a6923e215ee329f90dcb3e69c1207b761a7a8ef3c48465c044097e6d37009d8f3f44c3f8e8311681c25f49e414c1497edd2940ba9c5a679f581d1c4fac4ec46284b1e94be3b63a22363157bd3ac03af1528faef38a9f6e286570d5933fed7cf450212c84b0c8e2b787ecab0a6121f42b856d534ebfeeee8dd45a778c3188318831e8acb9f5c63ceceede7a99975b7d512cc618a394aaaada72cb38ed54b59de0adcb8edd91bb6377ec2678eb612ff16277ec8ea5f6275627b22908db16259669a49256fa424d858e56c936e11f26ea9e28b14c2365a10a1dad9226fc4324b14cc342153a5a25db847f249649153a5a254da2c462a84247ab447a872a74d44a58855e89b7dedb4a22a960db563256543154525228271faab22a33337364467dc8ccec9d4c1dc72f60176cf10bb51249cb585995595632565431545252282728ef64eab8adc4e2ed6c5b7b0c55a36aec2f0a6f1d73578d32d23f7af641a2d62df51863f36a9f000843518914282ae8e9e9e9514164f97e5ec730f9f11b2361a44c6bdefefaa434ab2f8b42a958dc25965c54ac9c4af5bd79d105ccd1abfcf5f36fbd71dcdc184d61fc92496b430bb54fff34502b0912020202020202025a22c6086ce2452aa29910ec9e998ca8a889d151ef000101010101012d31d32df699999999991922a019c618889504093119f2f1f1f1f1f1f1010202020202025a428dd4488dd4488dd4887f80d4a86513a3a31de6e9611f1f1f1f1f1f1f9f2d020202020202026ae2031424c46488688b7c7c7c7c7c7c7cb6688bb6688bb6688bb66895f86cd11f693b1e8faac77dc01f1ef2f1f1f1f1f1f139e221f60d8b31029b78918a4899f0f0100ff1100ff1100ff1900a71cb344fb7d8354fe560f384339c02af7954cb4cbdcb031831313111ebee6cd33ee9f1233956f2a87d2e2f438e7db52c0b33c71848f44c7aa6b9fc16391e6c9ac3f381916f6f30bcf875c90591fd764dd336f9658e612eaf7d21c92389e589a8be7322f14dd9916fe7baf581756efa545f32dfe457726d73f9a9639fcb6333e3ba1ebb3abffab1ed5be9531a0c30116528b5ae086d5dd379e9d243aec9b7bc2ea182c96fbc1836c35d96a4ae5d89ac9c5b8e1c434e2f5dd7b1a9abbe1a66aef996719cec7034cb5c732d9beaf239d6a357a283d04b5f8e47a06b87d785c3abaf1a74bd90216557f0968bc740e410bcf4d0315d41c54f6932efa296e19d6e49d778ce8d77ba65cb963b92773424a40e83be48d7a286828784c75f246f6f1977cdcb66e8bd94246f95ca9391316fee68c508f5583779e92149a68bba251dc3c1b6ed70347d89ae5d6cde915fd1d6b44b6f3128cd18d4b5b9f43683ca704ef2f02453f230c6875d9479c892ce7d99b632dfbe563083c9bc9439e9cbb2222487c25fa499046bdf32ae9bd4eea2a0e65017d68ec57cf6618d611ebb1efe2d85622cdd61539716cf4978e9dd8329fe14d9d54a2a42fa16d923332f4f9db8bc036df77775091541efaf4ba880c1f763ab1fbe651a9546bfc647df322edbecebc16bd7726a7cffe8e8bb715d7aae72f8d9999880ce4be7190691de2ea3cbebc86da1edc8af730f8c0c59828be02f942ffd93f2470e76b5e7609772afcceda70caac47c5d420e08bbf46d7d0ed9ef19649d9d678e16c2a62ea1fc79f66d0aa2d734bc0af9c08b671204a44a85cf2f0d5e85a638fa6d2371dbf586e250ae24dfbc6f9fbf7757d3f7344dfb345c8e5d1dc2741ed65039e7a1c73ddc627fd19ac84461d8bb7deb8f33e2b587b1bd907bcf3576a170bcd983b746bf79a9542a6dae9dd7dda63699b836998cf8f0e445cfe3ba1ef12383dd1e196c2ec5e9165a9c429b1f1e1ee670c93c6449791ef9a765e251b7b86522936ef9e9e7c47b869a46726d19cf95eba396e1b4b59ed2da34432f478c8c47364c5a867bbac55e9a21083a37439fa14a35bd799a7c022ff45cbaece12894461641caf83dee7e98fe9473fa936f71954d1a835e0e7fe8443fffd6cc5cf22dc6fed2a76dea707aae72fadbfb3df7bc7d908447b96772cf33b9e73909a8c9d3bc2e019a628a26efbdb6840760fc7c5dc203a2df5050505a32cd64229d7445b47b9eb7b79b5a234d0f49dea9cb21a538ef8b6fc3ae70bd0ec723913a739267accef38c44f23e97f77a66dee9e402b66726f042ee89e2c4d9d907e5ecdca33428cece2b509ad437e4f427ee39cab7df7545788e5ae283291ee5dee779ea5347f90da37cfa9a33b1af4dff422d88e69e6fdd0f937b5eea72b4a91ac1738efa380a06d9bd8f7b4ae085f148631e0ff3301e3d7b94e2e4ec11885d4148ee397bfc6157773fd6e49e6f5784c9bd52974372cffb229396e9b445f2148de424df968b4c5a465f9a174626cffa92d9d8604073d517cf43cf51ae753828d7505f744f3a4a19c488c4d74e4ebe9313d410efb36170dd3bf110c5538e92a40a1a1dca513cef8b9e4a618e42a9e7376c83721457769d38e9e48b8ee2a17cd24f30d4b451e97af00be1bc2fbeec7e9c3e8c59e1180a2fdca719b2469f796872cdb7367d2c34b8920ff73048026f1f7313e97379d290fd761b76b5967538eddaa7626170a5673f5cbea7cae87048d366c531145e1067b09dc87e101583ed2c2cd2d4bf4d5e36854e7c8a371a1926db143ef129165e6589a62824c6d33e8fc1fe907bb40fb9a78b0fb5f821f78442625e9bd98c5fe8a5b0fcb644d91b47d836d75deedeedddddeedeedddddeedeedddddeeddf6b5a257dbddedd8bddb31faee762fe99eea42a24fc60511f87ecafaaa1f9128b98d7dd34ef50bd9c3fdd8b78bbea96edb72dce52c1116e663d72faed437e8b7c9632ebfad425d7e91080bb31e3de2acaaf264421f716b851776118bc00b9be8756797b91b8c57df54559de55db9d0191b1e9a4622954adbc6715d67329d4e9e870a2ac463087671fcf52d4ea0fd50193675095ba59dd71224e1575e9794e0e7b7de79f59692672f1b1a1a121a9ad1bcec68a85b0c1e758bb4e3090d794cb2a396d19a1815a988868686542acf2b3a5af16170f31fe2495f29bc502be29d9773e5e74345318514a8233e78eb2b3fec6255e8adfcc81b5ef95939c2201b794615f1c078eec1f35ff9f1151f06577c7ee5e7886794032f5cf1117ac68117aef8acf8ac1c6199f87acf885da667f7845a267a4d9ebd2214d173e831195a0fbd2f9ebd383cbb6e8df41015c5f30b9e5d8617adf83ca3b6d879765450cb803fa8a02023412408f2c208f2e4f0537848d4063220110c30d9bac191a26790a865f4550436c1481e8247b265441785b3c50f83faad9e160f83a489643bc0298c30c2b8c34b9b4e84a05df32632d7e6ea009a73ce4d2732d7669295f6dc6bfb6257007db56b67807dc51b78fe618b473197427518028fb4c5a5196aa4164fcbe88b34430d6bf1c819b67e5e6050cb80449d921214f40c82c160eb042550187690a8655a46c2168f1a521fb6a2787690082402899e4135b4787ebcd60e83470cb2872d9e67671b78fa2178f4e00f8fb63dbfe0cfb37bd1b36b62509a4f836a455bb30a33067599415dd2593bfad41b9ebdbf25bab51bc6718f57b3babadc98bce243971a08ad01f815a712dd5ae7574bc92b0d9ddd2ca5079bea70096f0c3dfb2644d5edbbab8aeded6a1e3f21dc9748a4904badb666f390e595f59ae3c4431e280f676c4aa4195bb4288d0c57a7a1359cca15a3a673a5b8fa0ead49a1284d8c3362f4dd8d1f91c8627dfa1c028f55c4ea423b9ccf593e569187a2babb75c9b715a7ec4af17077b688135a23ab08358c0cb5e2a10ec590417295a251712fc5e22e3c3a0ea535eb8ac2a3f554b135d28b8591412d930a9231ab78f6be08d50b950cfa18531a7581f180d2b7d587da543acd375d6613e72a9f3ec7615cd775aa3e782bae2adf7cf0525c3b1c9413df5028940d2bbc4db20abce8db0ba72c5324493b14fe8a5ad21cdb628064ed1aa7904040cf51c66da514f2e7079372a38cd8177fcbb4c4a6d22bc62f611d4ee4b24f5fdad72fb35e7ecc356abea5a9ad2d66c21acbc1a63c227d7c9ebd5d6a98b6715a92f66edf96ae75397d92a42ea7a78c82d4c91ed9837963535b462cba64664c1d49daea0d7c6c6132ce9c703bca329a05c9a16eb18799920ce815f351b5465569347bfe33d37ef453871353aca254a350a8fe1a7592924a7538a9ec86f9c30e2815644ab18a525484be0352ed744b1a053d3bd3100a3ba0ed5945aca2185d01482f5691ea84667b5352529c5b7d315eeec4a3789472431ab9d1491ec90382a00a87f170a9a054c78111eca291d1ea4b69c55617230e1c34b81863c82a4a3d0e1c5d8c34b8d587f2d99744e57248d3e4d0b34b2fb6e686160b83f9dcf0c2eb18bef24d4565775966c8f0948aa77cc6a7fa22632a8329377d323a1c9519194c754862500c7af6141457edb0dfd0e28616cfbeea7ac83f992c54ca449921eb0b16cc27354316183362ac6e08dd107a761ea2163c74914964e2c2c52f567192a38b4a22e7dd366da87037e2911b5df4893e3854b817297e7ee2142f5d048a4036b8f8c5283c1d5dec893d383acdb71bdcea3b917c4b6dcb39e671738c9b25c7a1a9b492a6390f5d8e361b8c0de3a1eb230d73cd49a5d99ea3cb919a544987e972e48c4560bab81377a211982ef2441e1d3a74987ee553065145dd6269e4d2481afdcad411f30583ec315d1b19b5b8d5d7edf08241f61d5d376982a30bae87ae9b072e7ecd0583ecab6ff3a16b22a21cdcea2bf1e82d78743dd4432fdcea23613c3f68f143d74c98fcf04387c3f90f9b6f301c2a1584f1742a48fbeceba095a7942861751fab0bae7fe87ac85fa53a205716aeae858464646462b8d597fdf8f8c84cd140403333333bb8d587354feff4ce4c4731d3754ff7000104103d70ab4f1a356902041840747c4443431337a20e090f75eb0a6ed27441d3711173abaf3f6342e32a9428e12404057116422ca4454dc74c9807b7fa98877fbab5e2281c24ec935aa522bb365f7db1f2d9d8740cc4be051144878379102e6ef5ed679fbeba0f49e61cc6c3f13ca77cdb525319dcbcf8658d210c0aa37db77141c4203a6600c430617ec386f33e7a983abd7aa7359cabd2ac2b87953c8cd1481ecea890329169c9e090465bc3cd549007ce20b9321d50b736ed437272ec43d272d2c94b2def36c8a4e4a58bae43b22e9b4abe5a495b558f0e184e47171da6f3c1dd1779e7e8e80846878e0e47731d9ed7044751515111ab0bd2e953fe21f49d37b18e9e5d07366362bae83b7a95748b5dc90e9d983061b26307d7438713bd07ae439239f6213139a9f421e1f197c953415b83f92c0c7b2a687f7c7e7d309fad618541614ada18f4857be87ac8efe9030f3e70dbb6ed276b52369b28b6a7e7f78b9f7d2a12684b0599633e1b044fcb989c5dd5b3352c509a0e810c587178f6fd82f3103cfbca1d9e5d861d9e7dabc3b3afe4f0bc33d4d1a2476c02a0eba1e3259d2fc5ee20ba9c181d00ba9c9d6b0400ddf2b06f2e8ef5edb38a5ac6343b56d1d729619069b80b8baa0883cc9ae112cff2962ff4be455b5abe507b16677d44e2b7b876382d53c5c332553b910e5e0d0f3b20195617dcfac27d1797e9706cb07c7db3f1b18a58ee5fcb0d6f99def2b90ddf3e1bdfd7e2a0b35a9cc5593ebfec0a5e8b8373b6f836c3f9e04dd70e488bb3b05a5c7f3a4b8733670f5ecb6c6971992ea76526c1203bcb8c0cb2a64c8704d10d56cbe7321c0bcb460b4b46876363f6e0b17c5bce06ab65ae7eb8b7788b4f0838a088c55b58dee2353e55904586d5e2c2b5d09842a6fb4143c6a6c321b5f816b1ba68616191dacbcfa524ad9127e50c9fde32c359dee2df975dc19be1732a832dfeb9e92b627228fc659a4966f81604076486b3fc8637d637c3f5bf6ff6e0cdf866cc9844186467cdc860cbec9660f98c169fe1fea982aca90cce709b2e277ecb8c0cce9892c58623b5f80db38ad845ea825d335a541d0e69f6e0cdf01b3611893f63ae7eb030115966130cb293bef8361d078e585d3479f6203a1c6df5b1ba581876191fab0cfac2bef2b1cca0203b97866757a9e1d963b0d6f0ec1dcb0d5fc0813507561d5860dc7042745e7cac012f2786b9a6f9b65d0f9d2fcd503aa7f3dc1719d4a66a51f3a4e77900e8723ccfbdf63c17a2cbf1e61611a2db9dfdf66f3e362f1000885ef05afa3e1703be9ea2633e2d739a1d10e6934ded16e6f3ec1d50cba876bac51e76401dd0aa7634d54ef7ec80bc787630829ef5c5b3879d921ef2594532409279fc5c46ed717ab6116f3f5cc9849e55a4da79768c8f60dd980bb1dd18d12121a263df70bbc5afb4bd381f3c202ba70074393b878801e86e8486e0b68ba49731ba4e172643c3647438ddde1036121ba29b99899f86d3e1c439643d3a1c5691e6ac261c3799cc43efa5546da48fd52492c023b1ba60903bc74a8ef9f675d3b34f72eea3c3d97c3b207273ef70b6d9832737e944e8cb599a91412cfa161ddb4abef9e07cf04a8e45d72f794b2cc5e83dba9c3873603d3a1024f5e0e2c72a2a426375c12e0ba85845ac262c593a9c3ec9fc249b4fa85e49563f340ba8d87b609f7dac2eb8c5eea3ebc1df935514046f3d64153dbb942d29225888e854f18b182b252795b395360a60b34f7a9723dbbf8df1e347c70da003d25ca4210a107c0fa0cb89bf1581b910a58da465988c5d2af12a044c986fb16fac3cc13ad813ab23b155c11c92649b871e29db98db9acbb619e305bebd48da407739da6f9fbeb2ef8848921f207dab3f446c5500ce3747829b48903c23f286e891e6dae4755e3a2fc6bc229b6bb74a5cf086e8d11379711e7ab187ce7ffa227dfa2a7da1eaf909d9fdf0e1a56fb288c73ce3485f1229b1a82f9867a496dd1d3b93b6988c9b45c9cb58916d8b4a13b19a98f2a12a54a5844152283a5242504e5e502a7082ca71620194c703ea02de0987b7c4c9d43a0d3175a009031d77a3cb00b7d9e0886ca51a9b064a24971213248d0669035a36350e64d89775e023a662977c7695de1ef82859f10332b67413b167b013cdfa229d4585cdd697cc376c0b58ccb45555555555959733c6987737537d9c219756e36ac6535fb484f5c0a86e6c89eee6ee6e2c6658866124ac1b13d21e76c24ccccd71d78eb1beb06b735c3796a337acc424e6e658eb0c8b2db118638cfa856a4577634262b711ddc2b2887116b38cb19888c5cec1a062dbbbaaaaaadfc4b001601ae384b5fafac2ad3ac3d819866119e6a42ccbb2f99130ac3152d6cc8d651896c9d8374c3ce6199e667b5bf44e462891c63362198661d80cbfe70ccb186b6cb3754d65a27b51ce60912347eec6ba31cdb4162dcb26d65a3716d3ad8e587386313337b36758337373abbeb0a7987bb197558d573bc6e8cc1d354e2f75383a7bf0fcb1ee6eac31d9b155773a0bebc6f8739514bc35bdba3aa72fbbbca22fbccb2c39c6a8c955c112b61e269167673846fb28c6c7f6eccd262dfb7975a2f5edd4dbeb4a3669dcd93ec6c7c6d8f9e034896546a06ba4930a07c3308c649255f881a7beed46547bcb703b3857380282128fe36117f3b06b399e766e87416ee79d2bb249c1b31c0f83ebdccef6c3e0fa4e733cecd2c794687457f44c316e03fa051a2244186184f1db140caef30fbc50f5ea71aeb4d74aaf42607ce1ac996f40ecfa61d7aa47f3ef26c56fb84df1bbf1bc6e9bfcfa371fbc8d88c18d8bad884170551b18bf9b918a25c7af6f60101935f96223e242ca5590b4f14612ce3677bef4714518dc7eed4893db6170b926ec0ab7a0f7825dae1d99332cc5e032b8441bd1b611fdfa16b405fd6e4cb6218edb0d8c2630c9785e21f7aa7a156a905becad4b9e3dacf1edd26528d170640e96e19cb9107c66dea278f6583af24c9acaad90a578f6299e4390ab6090e390501ce2a1678f4259b04b3a4b39b5def91b8e19473bb0afdc307e3b6de63ea267aef35b6b6c53b83f57f1d7879c7ea7ea8bced5907dcc9988af3ee4f43abd243b20ec3b995820d27532b18ff94daf7e44cf3c9b41b01983f4f3649e2222d8305e3c78911c2e82bec3ce0b0aed85c3d525cc78c0f1ed6b5b0ec7a7af2d723c7cfac2f1e92bc7a7af6d5b6e9bb40cfb903c4745cf4f1f76445f24e62a975e23cb5cc51ed9e30c8fd1b1e8987bc4e4745fa991cdf018bd0941af5578155ad2c56f303d703f4c1a346ab07c4707c4633a20aa15bfe91a1f102e4e75c70e207674406ac4f0581d2f2f31dc25cb78e87eac3e8e2e2773c93e90c11c59a65a59c954df3e0880191cadd60d1b3666a2872ed1b3cc55eee2d2e1645916b3006459a69a1d90cc55355d8f3885e078f88aec2bc784c25f3c388e0f0ad58b8719abe01fa46f4070ec937295ca2bc91e98d14b0fb1a297aedab0391cd1e880b04723767dc1ae23a5d1973ebb1fecd163c498e17ee8e2311ceb825d2186356157100c2b6297cff038c323abcbc13c6651f52926c4752621c975a6534f0f105d0ffe2c8c79cc338fd1553ea3c3514d6550e53354df894714571189beb2c21a42e5ac135ff9542b1f8ac74f73956aaaca690451b9fb8a4b8f40501a964bdf58df10d5b7f2edb3b8abbee8ac4f5f6f78e5d39fd159583cfba26f369c8d8d7489e272ae3a1c14df34655033fa307314df581854c7e9825ec6f89d38caa76250b3d117d57c8b40509a21a7577da982862bcd1611ddaba0e1d2a392ad71e932b4df93f4b0a15265ce445c51e9434e2f270d9781652b526f7a4535573f6cb88bbbb80d9738be7d6de7237acbb9c7c56bb8785449e980cc1a35666b12d99f27a8e82b9f3e7739d1dd559f7e7743f63f8f1f13fbdfb3842e3e6bb874d9f970b9718395652b4e43e54cc41f72fa6c3ae8281d10f795c9c43e6b86d13f3fe980d4f06c32b1af9a61f4e9370d7eccc3e08db9fae1e236dcc60c326b4c3632837c1e7fd84563869914ecf219240362d77732753919898b9fbed6d198ab1f33c88a13d957f99c41bee9938df8c00b99e7a54725ec62cd50bdc5a5c72ad8a59a41d4a34b8f41ec5a996eea7eccf038550c621ee72604c7753eb88741e944f6d98876e455cc5bbe199fc722c357333228c3a37332543c84096bcc48894aba253dec3efa8bd660420a233dc6988f1e8d78d153a262986b5149cb6c135f99a14a6e7ed337fce9ab7c214b4ff9525f88d1e0a5a37c61caab9f7cccc346a46f9396c184ba255d925033f44ceecd502567c849387d47be1d136a198c06da6a1fc277926f4c07dfce4da1ef2e7e5392845805834ab8045ec83e4da48751c9b7b34f9766fb7ac12e8dc126ec527fd236f976edeed026b2bc6a9e118f79945248ccce0d86c18265348de49b62eaf28b1f0a79d9f9b61de79c6ffc244c33e72c6233cb8274a95e331c34994e6d298ee36628e4db37df9a935f28e4dbb115d7b98fcc3b8e731fd1b99b961bf844cb905a6ad275d5becac91c731fd9d499eab9ca89deee23ceacbb8a2dcc5e738d5d26d79c63d7c935f7d8e5b9e65273d57cc916bfbe27be711ce7a1d73314f29c6fd703e559f4520f29a5945807c4f394c9dbf394a7a60704c54b5e9a515f7a865d9a3d85a43e7345f94ebe50c887ea4252bf8eda9a92734b8529b957f253c7fd867db2f4855aa87dab1e9c6fae2f3aafafdd3657399c6fee839b3a75fe8681645efab4d58fcc35d766363dcec17a6033c5a0f2af6349e287118b2f9e8757212c987487c3694884c320d181743e88ec6b4cf053c023c2df43fa90f614bb36e6387b902141e2d450e779c790051b360b31bc6a491659c8228b98c51064f6ba240b2ab02cb22c50f0aafd8e485818bd6a2b95b0283a795d82c514366edb8cc061214587c50c4cdc7e4bb04001b71fea75c91560bcca43799e173df45c2cb9220bd409aa535fd4922baa5872450f4eae5801caca514a559492120595531262f04085f28295ae0432b4d7255680e055fb915e97081dbd6a7e6153ff70bee844b4cca7ade8ada11d1f3d54a28f407cf4ef99b8be4469062f0e5922fd6419bcd0df5bd3b4a3f7301c3675894008bd2673ee6d0cac724e1ffdf471ae7e7c9ca1ce23f1807422f191ecac0eb02fccf7854d1eee25677705d8179b406e646eb55579c1c0c92c534c6263c0b46c6addf21f9a06de3ad7bc9a6540ddd2d8329bab2a52221fda092ad12885874c79184aa6914a9de9c4d47da1c783088c1f0da59e95f4455d7a59e9c49299382e1a751d67e236aee4915af34eb4cce38182a5644a9c51e9d6189caa33f6da0933af2b33469a869c1783159786a42f3a334e36269928930b046fdda391c6682d32aa7aa87dcc3c547df7ca564ddb33d526cd30c8aa31c6a8335aec30e6e30c85685a8c371cd5bfe8d9b7552c8cba8c5367366f58ae5c6654dd5b86f3e6a64fed56cfa8b14b1f095ebb2a9172b16d313a2986510b89c4a16e8f1d334ff3cd4a539d34434f23c55dd2ae5419e3dc302ec6c85befceb868c49aaaaa320ebc5dc681b731c650e733552d468d2369afd436ae94715c8cd1a310d5ab47df3a1c8f1fb65f78eb928ba6e6a2d72df6385d14b73be33c09755e8bb1636c1246dae28f1e6c2cbbbb9b88eecea162f9b88ea7167ba8273a83ddbe6af04006db9dc16e2ebe63da6d9288e1e1edc232fa6257c612f385699ffad21ef6abca158450b01dd32dbe5d4a41179c4a03007d696ff7adb15998f6ef999316ac2eb0582d5c686999b185193358885858565a58ad646441868c152cacaca8b650a9625c21460c152ba8a8a45421252535944aa1500105e5640a27272829a0509e169e778ac2e9648282c9d43da1ebbef565bb9df0dd4df8ee25df33bd9af6fab2dd577cb715df33bd5108a5e9ee6f0780d230f3b707a134ab34ac1e83cdbede5dca1146574c3f904156a9d6f5a4694beab784e7bd9edeb389cd50db19faf7ac811706a42ea8e42b5849931c550ad1c00000008000b315002028140c88c582d16016a7ea3e14000e83b04a64529907931c8b5118e48c318818000000040019919921d2260036373f6f90dd0d0b4787dd65f79ed4416503cf048a9f93c9971fdde4026f3b1c2edf9c266b90d9390bc20f798822e84fe7f31d75c7deb2203758bee2568760d2d6dcbb7e23dc8a179daa7f4e3441591fb3b8ebf5b6a653983dcb6542cad8ab4f971c131267284e4686df2355ec344b3a4a1d893b42ea92d3f110b714536146d209608bfb9d1c11a9fb832b74062e5f6714ddec3a40e3f57baf9f19d6452bcc83f26de20376063b997a02f6df4a3532c37b3ee7fc61b7d88016489bf1ccd710709323769b3899ea78f9a72e05a142a047ce210e0b9fee86bcdaa8581540506ffdf7caee44e9a7cec874621568ac92b42ac266144a6475aaa1047a0334a21fb4c78c6e8efd065acce6aa4ad8caaa7ac7ab527840ae7dc088a592bddac22c8d4bf7c298888acc950679ac4a1459d49629fd26b554f6854a8953b6a70916207ed685ce2441c6f685d84d21a4556689e330d9c957cda89548ddaa1bf5ec4627c05e09da6e9659b286d12c66c71ba366367a52ee85777d191d692a710d2cb462f4230a0bdfbb5a431aa3e0ee67a4c878d8ed7a9118359454cb846081be961b2bd7c43502ed4a5c73252d3c5600fcf133d2baafc861f16f7f1adf76683476c71cbdac786b477ca6fb0e97cb7b0aa23ef1c65a5d3cfe52dbe6f985a4660de81f97e4a4f3d3fac34fccc3faa5a912c8c76c86df0f763ee24590b17cfe87bb5d60441fad507e896e73012e8338f02d4207810244eff6a55268dd7e9b12cfd74602ea079232e1562b2f3ae67a82a4413eb901a11f8122b2daa25b85b2dfc224bb31c705b6d44af5fb24adc77d4645dd6d89c82767e9667a00cc6958afef054345b3e9ad4c5b68cc0cbae23ed620c128209f71560984e2fa52a01ca0e6a55001d915e1c795fda55b01d95812e535a07448431135d51d3b512e384d5225cfafa11cf157b8ed9cc78999a57d62eda0252c8b25efde8f6e37fa225a290d991d7a9e9bd32162edf87d8228032c63c72ab3f75847e92d4f7bbb7205f26b58a5797f5015723d9c9a34d55539101080d7444d88dd360db51220bd5373f5e4dc45a3ad8dbb7a632c366c5666505310898811f0fa3aa714ae96573fe23c0da94c830894ad142b042908946932cce5154003ef311341cef7502cfcf9eb06cdf8a234b403ef7711d6014b8c761aa0f5c6723e2c934196fb5ab17e57b564513886db3d077256dbcd59bd07c648b1f3b46963cfcb992eee5ae9433a3b5c272b045995e778ab7186c9d7099fdb03ae05981b261fc1478545b146101fdb234fba31d0e4532d59f9c9e18186089358f24f0c2d7b22736d78466ba2455a46781d98975a84386e3147d734e867690c2398b9c612b52c1ce49db83008e21f44ca2a07dcfcbba6feb896f219ef45d4a4d9f28f512348092206c289c00aa2dd05dd9b47f783ce00b7fd0415b7d52eee83ebd7d878a78357253f374761eeda2c8ea8b48bd3cb70a1defac6b884c7f724b64aeb2eb88d62a5eb0c833f88ed83582a29e47f9cf48669ee855608d6345f9d06bee15c1c161757990e9a46fcf0fcb528cb433911283421beea631235af1e88d3ba47712adf0361c1e533cd686e41ea66f465db2dfe0dcedb1beacb5cb5b4056748f14464e090890b1e18e4f516cf28a3b27b549396fab8926af6b695bdd5fc710db26a13d934aaf6255e25c0df8fc6528599ddf8721260d5af3daf95f5bab3490bef7aea1f95a8146822a029f6c308514bc29baac2a1597cabbe897ea68c005766b75570f306d408685b20212849cdda740baf6fe0db31463f25565146428017da79363891f2c6b20b9ffa91c8db43308cfd1171499a1098b7656ff6045b3613111b8c6740807614921d3b6636a9f64d8bc8d7e48ab74c6649cc207917de8fd9d41034746104a997004d44632d69988b7ed4aabc760a31fbc4e185189e99aed2994b1840da7d16ca8ca5666ba23ae99fcfc19eb8714379816688665ecb798d2dde9cd12a617258640a747b20984b94d90129b0dcc0c508c49affc304e418a599c0270dc9cd09bc3e8534542f261b13a9a6e50e436bad78e0b1581be5068fb3ec02d441a023cbcd0e37e87aca824bfa83c13c4f941249f04419651bb2a5f4ca38e16af930fcdc64a4166c53bd0763e33c8cdfe8dde761cfc1860cc78f4171c6b057877ad96840af2ef6d3b6556ca33614ad69a9ea3ccd2e909dc7f7be366fdbe3c3470fbeb73ba5f5ec965d5a1c157ce044f1540760bfdbf4ee9db79b5cb2afe106004e099c71e9be7dbf65bbe08d4f8a34322bfa9384d8c712191f53450a495797cbf97faefb9baed26244f15937518102c9d888864e2d972567b31299872b20cd3e9a795dd79350b8c6b150fade55d54a87ea9a9c58aab6e18666efe4085bbba39f5000aee82e795a6958cee5acb2832ff44b09a1a6b2320b8da0a2307e67688fb0dd5f1440a2f48b4519b60b8a23aab7b4f4722e5249961f0dbf45c60ba812f04e8d15c54557af738fe25f89ad3bfa0a3f56e464c96a20b66e7d214de4f4d536d51eb616e4dbb523882d9d23270bea5b4b58c65f2bbb8ea957ecf1a7a5e11793a2a5b1cd61d347065f5b88c40146f823b38c242156764d9034dab23828e5989497f60cf78be3693a1a7da5a7313491b948c277a006b5136bb81ccf091c6e7217886244e7fd31471e8a07d968e8e241eb9a3f65d40a0e2f56e87629c68f65dd55e19d0e27b5182537d404fb997c74236d1873588d165c2737137ecfdce321e04ad54412fbca200a942e0be8d19b9504af727768af129c294599ed24a8e598cf770a3443a420470e06b757589b66481ff5c11b00d095712d84b67a77168eb084d2b41b2b6c5e6734c5bd1bcc885e03d568a10bb26e53e64c12d205a9698016fcd992de5c7e92aadd2961ffc75a615d9548e407a97c29dd74f4915bf3426f3139e6e9a4b57f0d58bee193bb9d6f093585cb3f81a8be4d8654b0230ee50feec1a70a82a7ad183a2d343f9e2e92975c90e6a9d527a9942f661d7caa32b619fa64aa9dc279ad4971d90c716bc2cae297d7954b302a4696339966affe995da7e1a5a0ccec9f8835e44f7184c7cdec0bd3a407208f641892920d03a5c04ef8e2d3c8e51510dcb362dbed8fe0555fa02f8e1e9caad3fde09cd98915c6f3df67a287f992ffa9d205e34b71e1f6bf3496aecbc1f9c4b35d481625e0e1ac5cddd1ac87a2729ff4d790d980d5679e571e592121b406e77c08a6cf2acbb88b5668e1cfba810b875da01f1a26b204fe9faae811d43f57ffaf8989fc24e83075f5ab495c2f75793c50ce6baafd8fc4aabed72693b7af5406bbb9453c9994e385009af73c20005d68cb7628a08e35add2027247bbd02a663589d8814fca9ca1fdd7c699741ab4f644f1755545cb2651ff86f7c66170f9e9e2d0fe13b30d04c30bb88131d3e9774509a1ea288ccc3cbd52b0b788779560734f3e89ecc553f26c6d0ed092ece51668c12649f5ea65b0cedd607220999ba3ed64e895594ce241f292134c784ab85babe36629fbaed2e6dee1da32dca0754b9c0cc180cff424b3fdc7e5dcb6a2b6a22c7c61b1f2ca6cf8effe0b293901ba9f794927d61baab67f8fd473b9ba1cc7fc3d26c62046dd66b4ffe86f18319de5d39e0ed46cdb28b4fcfd5f6e36d5d4c2c6a167bbef9924b1b1dfa620e40e4de49f871be18168bf2d092fff4a0d0ad2636d0709fa6e2eb6daab928f00adcb5e5dd014eaa50cfafc8de3eb196e75eaf90abf4070264ac103836b0aff2ef7fc185d303c6cf783b4bdf8583da8c25bdbdb62a0afda11990c305cc71471997e25bf3c8af0564242c214879e1bffabed73d067669d6e337ad1fb736ebcab457fa7f82bb23ffb21334d7f51fcfe36b9a4602f32a8fffdc0022496d186f77a89f940f63df8bab93039e657c3945475af256524ea448147a72fccdf892f508927cd3f5fda5d48722c80e00095fef37874172e8995bed50dc1888db84a6c7ffd7c2637dfa04e401abdf6eb581bf05c9c4c5adcc27a043d970867eaba8e2e72eba7d9b60b7b9056826fb11bb22c107a72645ed296e3471031f6a4645307c8a857a76fdb138a6d872d9bd7a4aa6f3436f2d76eb568c4183720d9a36a15ae7c45ee3b3da4341c2e72370d96109c21b5bb61279f9aad3849b6caed2c57696f10848845998cfed713ca00ea29c9194d46c66c44d7ff9d0579911f98c24e7005a0f2a3c588af3c67acf52589a179c9643e8867d1b95bc312e79a57be501d38e708d4686d944b99e639cd4fcf27dcdc1a43c47690b429bdbe9d01b0e1950499959b52786a820575bd6643221283017b5fa43dbe0e6c1019ae2a0cd85469062b75434c7c1a4fad3330681744331af9a9bfca4965ccb567240b762449943183cff30fe3d0f24895f49620352231a5f8b7e477ac3f68bcf2bed0f0eb203cbfaf0e659b26fc09ce34b1c8f737645834030f26164eab1fbc3174d1c66a31c5b6d98bf08f59fb3130142b45a49e8df45ac55207c688c5469c6235fb9e391a132e190fd37cbda0eb0f03cb7c13a1a95880ee46dac0610e6075906e46f47098ca039f672b31d72d4e8aa31cba7338e49534f098f404b350828b6bfe599bd39912444e293aee169c7ed4ea774adf8b863e6ddc131f1499c53b2ca9b1d2619801a908e4b43b115f1080e68aacf24dee054fe442a24824d1d83ce281420903c65f9060989de7a27aa5d904f85568f9db4d7bd4cb13b5a3075a90aaf5c874d124b435d36680dbee6daf4a3acb4e1ac7c27f34c1827d919ae9ebd409ae74ed5c776a258a58dede1800300db3f656bb7f255f1acdb31d8757b34034ef2e4cc71e0e6cb4971d08007489cfb6f3cebe0ebf6dce3663890cd3f900258e3240759f937ec01d20dd28277264b43bbcfd1f286fb3f094619f7a94967aa9b109cb8fb257e48dbfbd34921fbc328a3311923b10e1033b97230c01be0bf6c14c43011f684b485c7c2efbeede79289f473cab939dd53b392f2d6746abf29f669784c4e2373466b2754b4830a985ddc794f25087f038ff751f7cf4a3b1544761625b9a13ed3d4ec7c4b0bcf2c56eacb088f9a2b0fa95d0f25940f2f45281c58702de98b93af830f2b8346f2ffe08c46a60f3b44dee93c601c15e79134d8733a2d071d46f3f5bde431dcfe9f9986b7f96843553ed26ca166a329bab53cfbfc42e0d63d82a9573c7ea11f74040dea7934847cb61d6c877e42a1979eba652e1f67a7e17f63cf8e794a190b8bb5bad5f8dff8cc5b121966b6213c3da2a5dc64131c07b47aa8f77841be68a1504f075caa198bff1ca658c25198bd1be4da34658abdb2bb224bdeff62e609993e4401279b602fd0194758cffe51c1df67596edcf5b397dde20f179aa6de40d40d0384a3cc3d6b953fca7932260c7104df69cac569479279b302308a4c652c8367ef4175572fa24c152ce13e5f9d9868a800b32193f78d23c753ef75668685dc248b0f570d58d8f577b31ca7aaeea4c57708325692d7023c320012c574ae4f90234320ae259e9b2eac71fe22438736f291190ebc3f51bbc4eb43b3356aa5e03b5dfac1f880045ec24a246e27366ae7b08ad18fff7616c7e08da1fa7b0414c23b462cf0721628be87de2be32c5335c94cf58e5262ae4162ee60e2d72bbe32c5cc83d54c0dc4701cc60ff645ca82b14929a5217818666afd79beb40de9e5869a2a823b7311c66652f064d4fde2137e05f97faf7e79ccdeb868ec2155750b514383f0326c61af394072943e694ccf64f70c9e923fb6460289735ffb554afae9b1b6c60a7264a12dd26cd391e9a015edd46939c837d232af65f8a21b3fb0a56910796a459708b805fca9ed8ab7b85015d2f6c79c4fb8ae456893380903402bdbcaf12efdd820382bd52c394480f3260e9de824bee6d0ecff10ad2ce11f96557530f7630d599e4511c218a076474a17f559203974ad017889bb0d63f6e44f9d367241e02434c18422b04558c9d1612064c5c717f896c3de726e0c43a2be78a53353fc87f192686478ac838ea5ecbab343b50e1cde4e53ec0fc6fe47ceb121282ac8b6653f389d8cd6d6c50ffd6433eeb2620c285fae5be86e17efce716c609234c5a2e57bad927f1fc63a2949df678b5084d627b2ca19a13fa7c8a4dd2597b724503095c652bc1f53e97d15e45ebaa73e3edd07d8a950056b62f0d8202e9b482072f9391a78d1b0323b9802883fbb0eba0bbd35676731101cb1021c2a502e9a9a9fcda573325204ee812246ab45ab7a72c6a2ede909009eee6005d92b527162fb9fcef10e689577730a35f07a02fd603d13d5a75a922a50f63f7f91267816d8f96642f7951a5ce0e2d27340e1cdbf7b0a52973d0db7246b8caf5731d17866b225b783581560aa0f6418e3ed4862bc92f43806ea824fccbd438cdbc1fa785ddb3681da9512bfe7e6ed63bff334c2092fac5cf55ae6086d426f9e7e014600cddee23df325d8de2b79b583ceaea1a6ba3dddf7e6c89dc5a8e2605b5549d30a76a0759878931a9d1092dc44bac7a4e9d8cb03ecb5d7c96dbc627a4d50aa17adebd1968388333c3b4360f3a9640524249c5bc7b3954772ab9d00a2e48e9f8bb98b3825dcab7c0e8c35b3c88fd68f79afd077f925c5b95143969c5502307e31abf6e50dc6e11edb01d68702cc487fc6660eba0b87c8371abe0968d93a7d63c2818580368bc20a18fe91ca41977dbb88bb47335cc15a31487fa3d755bc2aff721bda36aab54e87e11c365e7b9c76842b82073f0b4b6dfd6fa6ec654c80203e03e3ade0b660036008823ff77672b0a18a9315be21d50cb8ea4c5f80bda4d72de31e421b74bde0211464dcd0460e92e050ad1b7fec4fe60bd4cde82ade12a0b103db54ecf9e53e22b7188d15fac972539440a921727e8ecb0ce3576e967d5a7ea457037110bd4a6aacc0f34d7a190582915a8eee7f3f8df71a370ddeb61ceba3a9b1ba6861ba5a0ff12b9f97e7af40e065c2bf2ef42d4281b520428e684e24273a2884586400ca6dadd88bdc29906a6b2922d676af34c5d6f190e9a30b40832022d469b63c9fdb033499b5a371df9e2738dd2b0506b120f0cceeecc5d878521277f288b398bc65700c518f7c85abc6fad05dd2ff2359c65a9967a74f2142ef1bed98fa24d4c34a5b663c269a4914897527e46673ee8c6fd5fc560cb3ac59208f3135e3d310342dfc301213c9fd0d0240b9269de68581c660ed0e53068f91ae23c8f5f05da68d03bb32eda3b2c587070f50775805d4f02e6052485a6cb62f8696acae78474f1baf5dff780dc0caef085dd821a61a3242399f97017a941a36415453f348ede7f10fd262ec3afb8767653480e420b61732529cc02a07f895143eebaa554747c8a0d69444db74675c0f2e850428ee70d632fd60e9d6a19b840167fa798fe14250b44af4fa968bdf6ed1560ef0dd1b02d18bb8b666454664f6a11b5d09d544ae29271c9481394a29442146d270cf4c133212c4c62a26f9d101870ef9d05c36a2cce71ebe08762f56fde207c0b04776b66383eb571ae39ae94534c36e07672229e4c6a0ae521a9a353f860ad7a3c37a7e3d785ab5879ffc564808e0385d43d4a1cc4050d242dfc900b0e8de4775a5efb7173e8fe0bff79226b7a02465be72b621a40e54d53497197cea8f7e266db0122a62487e2810b1341cae8badcb742a3b944377614046bde10be7b56c4013f85063e3665d6008d6c832a58724fac71b985d46e917fd477b434d2aa370ae3bf7719d97fbf71bb2c992721187d79e807ba91ef39b0354ed2de44f0e275dee9c0ce96b76a0f526d16ba4964166032b1f036f674e6c9d754d0a18ca720dcec60c3a3780cd541b9cab5fe13f3af31772b96d6ffd43d2c392a88e6ca0c1239f149ce545076d43ed62dcf930718bcd156749a0d1494f96defddb1693e74ad354450b2c56c04858aa3639b60ffe119b006677656975221105a88eaa6b243725a0b71a9be67859c059d376d43b5366db517ddb323a979deaa1d3d2f34833e8984958a4409a1953fa42ff5537e7e65d3f317faec932b4dfc824991bad267677aa1d1c45492073420c08ff7390c5ef362b2f6cab9ab301887c1e74749c0e1fb39942cf95036a095da4d3c904c011f32cddb016d2afcd5be097eaf6fa95eb4feaf06db9878b76d1a9ec9aa49a3c13b28984b2b5eb84a51501ce6867a4a991b9f28c8227795f600be91555573a5297577509a433c0c7a416ad2afd6ab6547c956620c29b2a2cad218865e6ae6fb45b79620907017cddfe3a1ab35ec11086c715e48e92fc69c2349f7d60694cde18fe4fa158ce09b886f486445a986494ab7310a64ef3b9173dc123efb81a9385789cd79655a8c43c177bf3019f7a4c33dce44cc756af0ac3723e258b4c307993afdd048769c9182e6b7b7e22fd05f0f809de5bfb1e3df3cdeb31876f6efb4f6e9fd7996104cb6c25e5f530f96617ede9c9bc79bd52566f55cde905b1a34e6973db0b744db3956429fd9358b6271988a8b6cf111a0d6041534134e1d090bcd615f510e8e7a4cd7679d3c2d03f348013da857df9f7f51f25732d4336a5f182b8ad172894bb680acf0ca2c99d324d8720c325f5ebe6a9aad169e26c3576708654de08e45f3ceeeae8a994cb268411619a51c912a26741d511bfb8b14097626f3d0001c5abc7f8bc02ed5a5bcb2bb21630efe9d8bd3ac49d30e9ddb0798fc77eb1b199349adca49337e7916b3243b6a0573c82c74f0374f827e95d68e1197129f30a79d7919f863650c643f9765cecf728413c38dce16d85f262dde1be508f2ceb4cf928701faf4fa87b16d99428872e6d870a04d82931f6933082f100b97cac91cc51796b8cea65604e131cdaf3695d35fc92ce976c2ba9e7ff46ddec87c5c66c21791946131a4afd2beef586c35dea9846f707133c9cac8e34fd8486ea2c5ef993d1d99b86a943a32a12e426a9027004db224165dc28b1b152b2ec12c7dd0f6c25cd586c4306a6033164f0b4cdd991c8039ef13abb46d3259cbff474e11a4d873180bbec0a1777fd5e04346cd7b8a4b443c4732c42c0fe92d9708391fe695d44e48c09a0f46779da8bebe89ae810b75c83f2aa63318ca86719dbfbc6f13dfd13635bdf4710a76535d8253c945c5c88d6e6763af55bc4845094a6c51739dec1115b056643b5ccdbd68987c62c8d35910ad6918ebb0e852a1d039942ea869119339fa8f907f19aa9f80882285322840941f9f6fab975628234cb7d247b5d9497d3f2f15abf8a0276f5afa6f32164ea5b0704dfbc605fd43df3ad29ef431ad4b01724de8e30ec8bfb2cd46544dc5e97f8a717c0234482fcb5cd7416c5af619bbea1f10444da2396b79281d4303229da2460a323a6d4874d85386435cde0180656227a9672f773dd2e3ff97fff4f1000482c69b9dcd90619a95268737e47f9a9e433d53e85bc46293910a290292f0db961b9f8ab9b1f72e915962f11377194cff0a618e405e2191de68647b0380e396fd8595fe2946e7e96bc11d51d46992cf33f166816abdb320926e34ff61efe472ff1170a828c2206471bd26c1e0a70dcb3d25c87ada7fb1ceb635c09d114ad500690a88228d9182bc0c833b529cc7e10d9ed6a165a716f0a6fa331b08a8de31dc21049fa9fae801751efc93f895efd7cfac99f41595dc0f8c9bebd5f1fa66a8462fc263922a57b2ea6cd98dde178059f8ffb0aa40c61b209342b59e18a353417e6dfd6193a890953d4adb740e67db792346bc793a737ef2403aab5d57c4d003b0debdc26f731df72328059f3ae35c5b4e9991c50e1d76dc16eb3cecf1b25183b710bb284ef1df44519ae69fceb2c7aa83c760b3f35888a6dd3d27b3742be996822ead0631b6bc744e423f0a47abe4d493a36cf9e88c09afc90511d613fb338cd6c2e8084f790401bcf3e5ad064f021dc426fe0d250c8d52f303a42b128b2b26ca52b3936cbc9c25cd5d2d93f0f6a4c9695216fa97f914a330da724b173c07ed3dc145d791bf6230fbf4431ccfa539937e2daeea744870d211d7b3931b19d1de4a784091731caf027bb50491d9edda66aa98a27401f558393a8419c0671f41e0030e64725431653872273670d94c524e2ce9195d9242814e5f297c534d144b50086120fa896aff6aa4f5c4dc3b1c91f9f7b71d731ca69f314f26452d32c5239521d53c4f8097297e9cef8b348162be3b0f79ea80317d2f60c61ac9f2c02e6fe2582e703da1329714ad978ad41c8581d11807d6356ece260318ad81f3b9807fd80e9bd76db104a0ddd7e54459280af7d971b14a296d08851215b9315b51535de781c709ab14ada99271badd6864a0f974785a4da0eff7e94ac4291ed8d06ace3ec4094799722e9913936e13794dcd57962437a03c3432e25985831e1b4200e23f8c297f04a6d78a60dc01c1a08dd3450121e15dc27a8f73eae26c440a2886052bef4c688beaa369e5d32ab5a43e0a993e2afbd0387b045834bd2ead1343da6ff1d164b9fb26fceb1e24080fc85f6497c5ec459f78c082b05b4d442eb0eaec0f10b98f1260b8be3dc8381d9717273d977c82071bc6bcac02807423af3386a6c334c17918f5d03827c42a7ec159e175125cd89345632628a92cd8d301272f785eccde05128a3268749190aa4e81847c6272cf2fa1b13fdfbb2e69a8bbb5c4fb243072da85a96c2719ea844900b3558aaefaec386c545241dd309af1e5e8bd33312d832dbe2b7405d2990b2f8a970cab1a4374192f728749d32ea1eeaec963940aaec2aa5d6f29f7f5d04f6d512491e64262cdf6c9992d94c7bd3c4870387d94779dd1710c94c74136deeb40cf3746dd217b42dda09ec27d5324257e41ec20a96430069e78a5d59d51d73a972924e0d49faa152ac4125c77253980a9e11a77bc277f312a621b5b6236f850d2b16aab7438a96b0f638b580bd1c8bec3a3aa14579a300a0ce49e3f8dba1c0cbbfa4f691208d718f49d8fb8436fb7dd6bd5aedd57740e984cf87463e73c02e3965ebbf9d8e013be3721c4144464c42a0f570ec372e808134bf26b78ea909a0d82845b8c8b625993738548e64f1b025a9b6d3b115ac0e51101880c225d920a0e8bd4e5d8e81f5799b6f92a010fb915648e5b2556367cb642b8df6a937e6dff4dfdfec4f98f34dd61aa1241694391b083b6a88d559ab47e7a957aceda2bdd414281515f81cabb2eca85464f2f433b006c3337c1de4010cdd2d7377db1aa3dacdbf4a15e9bd047590b7168ebb20cb8112ffc8b3c6b1d378f0fbcea54f202c4c7822ed1a3fa85984ac334d98e45f2984c2227ec40c2dd42909e640e40992c7eee90e221d8cb816aba6451dafd525a5abdc8c22a2e91609dd5f3296a48b6b452453bc295331c044aa6ba82b4b53099de1be40c26902ab9998f063a553b83c00ece0c7300cb3900e7480f35ee55343f3e07fbe741b5e4ee0466012608c1d9ff791029d5ea1d4f0243430782bf06db1b89890750ccf00d61fb0728b49cda559801e12bf97440414b8f2a0d18db07f1e62a4e88384a46646c9d9472d88589593c5b9f43771633229c50d920636eed29748f4b79fad39485020be259ceea5f6c6810f3d87922abb2eeb8653d8030551242142834c13033b7c6787951ad3072763b6f33fb81ce73e7a8a54f178ad9b6ac883a48f42021918ee7c820967378a0f3b9979576e7af1d4ecca3b7c04acf13d7da059c5d7e5e1aeb6bc52d661b3e8c8d55189f138b704db41f9348d0a70123373b9aa6dbab0bd830cb56b2a2f21f05968a1cd05eb9701b6133e740e1b5177d20d4d255a1be63d7d186d61f13200d04100c040fbc820f5ff020390e54ac11621364303010f438315e4ad553f9e91ffdcc4ea9c4fe0407e1cb8f5cbae2fec4e8854a2663c7c6490a159600acd2525820317f185683add8ce749c5a3f3f0877a387f4c5efbde1defbf4f335f6ff00498af66e5fcbf8e3dabf8eb23a32e0c6a926b18b4ccd832c4115a8424e23d80bac8bb274cde8ffa98b91eb767d3dccbe18e41461d7cd8845d7228a5a63fa3566df75531f96c835c18d834377c6c1e18bb5bc541e2a389391991a7a7a1682934e63023a28b16adb64304e4e885e4a1b403064c9148c41a526188c1ebc1a6b81ec3eb6946df1a481d93c501cf510ab657d0445a30964ba2dc5e0c9cf4bf67f2a39f7c9e284aa305fc08db9cf698284f7feb1a9fd3c1143d7971e2d63c5394e5d332ac160bbc7785f9d36f685e77e90c7c8d6927109703b402ed7232b969b0f6761951b2afe960c3da8deb04229acce334afc33e521620c444fbdbcfd83d8b9121aa6c83778cf7434c0230829fd6e238cc76ea43cdefa9dd1799e3a6dc4b87182fd97a5a17b12298b3f6b312ee067999f8abba3d07ebdc308949257379c6916d88a4fb2efb34b28110a34acbeca163aa2ee7b1a6f7b4da6051ea828a06b178cc9d00ad194628e9d8ffda12713ca3dee9150f34f403e3e11fa5842c3634909234ed6f069dd6662dd1cbbfa76c0ccebe53ee227392d37e905027a758395e60696713dfac57913dfd1f8a9997bc620427a1cde3c85af3e89fda7bc3007c73b2def80112c8bff9c81cb73da84a02f8132566d739310ee578110473ba0e9d4d57306df9b200e2a2f99c24370e1cf404f2b8b3a9e066b440c3972c5b2c069eeeaf07b84652c442a38754a56fac509e348ec22f8b33f7971fca48f1c0430672f6aa13ae1ed3a57611c2a9ea600c434d61797eca26b8dab04f9428ce0a1cbe40097530038e0cd105d040368c33c7f8b25e2f61d30d39b0542554946012058d57410ebdd2c0ca75a5b2a6ac165571b0a9aba1799d0a82047bb9bb14a7766df7bd41af87bfb416d04b9865258d1b4c650f7bb607ffda59cab17f9bc75cea0e43f1677128818f97d158a66e4c3c3ae93891a4d84a1bf79fd6fa499b445bbaf6cf26be258e89e115abb634f320c36b7215d0b5a93ad26f460885546ac55ab15fc29ffd922a7206a5e7cd7a594c36bca0092e775a8f9e228a1af2bbef0a330239cf03c9d924a50cb4bdddcbe1163b706d603732bf3432efc871a01f795442e43897964bf5a75875caa1a2368ffb797f2b65d1b879c598267d6c8bf137d2df524e052d4d3fc0a50a5006a38f434694b0692c427a8d7101d4bf1a5996168cb5bae1b8a7f0042a4a0ee1746616ef0208d3d717e3ce0756ef71c3215f995ac89af76b422070d2ec729ece59f5cd345b524282b3d565ccb3347e93155daf947e2ce2113d5e26dd7cf9da4aec5e8a1cdc09ff2d9cf685f8f86c932972b7e14ff6e59daf6ca2015cb4ec48332f10faead7210fcfadcadef6e7120692a425a9b7fc2531d9517c6a39ab3558fd707471c44b5a1c33964cd793b376b9011ee6a2d0de599c0f54f58e71adb564d092f2b3767d9d7c88644d85038c3389a0c300597c78d0dc282336182bbd34480d0a98b49e24511c051a19fc52314bc23f5dd3209860814c81a4b9ab23bd4087bdf0c63ae48f2882252e53db3033d8b03318da68ee4b16b6fa445cb74914e7891dc09bcb85f5017e2df8088c7964589d68612843a8d2a8a7f9e32b64476f0188d2f240032b10e715952078e662f36911a1e7a95b27535544ffa9a755b34b33f240c05ce114c7afe7b31e6baa0bc854e7d788525143e2e05b4b08db247a74b9899a904dd42bf2d67443e1f5c2d20822c8049e1e2245942e264b16f930d29cbffd008e5c6ab1f3f3db4797106f00e1b7a534bc5ab4516b83209c28a070e55d829a8d79350f9b8b741ad99463eaa07fec17d0b26411eadbb71a6b25337b2732ed3d59459103f17d88da8954be2c9f798963c75bce2809a5f9b8bb9bef8a5b785e84d36dc8c3004ce7c6abf0bec50476869dad521f5417f09098ae5b63b0528cb6788892c500669cc84e04ac417d096e2108c46aa77e0030cf0f159d233f9438ca733c3fcaaf665ed70e01d0bc27deca488a322be291340297cf41510f1f1be0f51c37536117dd6cdeddc5c040475d4395329df65bfce59337b7735a0aed44ea03f07dd8103510404a228a64c9b4383ab25979fecea5a571d0d7d7d6af30b8b96aa8fe37a9ba2c4299581c8dc2e744c443029797080bf07bd2a19865a0bbdbed1dd98bd6fd01599b82d25c39593f1461a9b30fb25a9925f4d60045f2b3a809c51cdd2a4bc6583189989c53130d1fa7a3f6344da5effadc84a10e6062381d0673b5c6aa8e0b092c0f6544b494da00e36e7e44b5735ec8cf53bf8fc178950822a954a57941a1e40a807a2cca04c310cba204b584ac2a7314da5ef13765243fe7e1eda796395a3930efae4bbdeca3421b0cd0f7154eb28584fe7bdd1721df872d1dcb33727c4c2a59e29dac08e20d904ed3ba6c78db5d6226fcba975318beae8c16c537c3564738bc953de8ef27cde7955f58b770fc2dc00a221f6c5c8894ac8fda0661f78ce5f1f0ab8dae856b5b67da0590088d7ac652293b5aa013043c9cd6d6e925c64416ba251b3005125605c4e70df27d9b4df31913cadafebf61d6984dbb7136f9aadec5b80db32f8bede2d18ddc4453a468499243a48bb6b0838973ff8f436c36fb45cf6fe4d6fbb3ea22b00438e61e4cdcfb5483b5ec423fef9727c0826ed582400c89f505a132c49dbc1669f8d7f9537e1eba0e62112122fb01d21f0798d35dfaf3c9e816bc558235c319b8e5b21167146d7401fdd95dd2c930b619bc60ea04cb1e77728089a4df433f00fbc689e1c0276949e4b066f7fb34016df736fe318aa8189fddc15cb4cdcf58a80ff45a82d375c085ef99e525fac477870d30233a42cd5754f43bcaaf904bb0408528ba1e7af5eb664e5dca7a3abd729304a338b09f46f6ac9f62f9e5a7ca8b58eca46610c9da0a96bf3592238b5fbafe1f1ff8ec945c7e11e70da0761e79673c5097948a7e930c43e7ec06a3bea4ecef19e513b7c98b33043b23761933791fb88054d25093f188e03849fbaa4cfd5e1598ab2e984d51e4d55071342798d5d51854673edd2d0b2a26d6ea32bf3a558135090b379359bd45e0ba3874389928d35eb5c0269caa369aa0a83f5de53c5140b42eb29a0c70c0516e6c6a060c16e180a2ccc8d41c182dd301458981b838205bb6128b0303706050b76c35060616e0c0a16ec86a1c0c2dc18142cd80d438185b93dc696c04a18d5c4797a307b699d8c949193073fb170a766ad3307f885d1f8314b43fe731d69b3f711821118d5946e0e060ea2642e2dda4bd7f53067a4bdb60cb9a8de4b23aff69dfad2a9a40a4089c141fb6166adddc7adafda9f636b1eea9648671ed27b4618331e4b5709510d1787d313b7aa425ec3a00e34678a3306b0ec6128186eec48349679b048671dcfc4c89e666f9270877081c606922e1a5bdfe0d06fa8954f1f03ca347247d096ad8c28c438bba120aaaf1f4257b4096c4f3af46778d65214ce4bb382682d8dcda51ec8db6257ae9fcf26d897bab2bcabaea472e732f67aca475cad5dcb2071c8cb73ae5607be59812c5b84dfd3ff9a9209023cb12d598e4254607685a818796888986c7f45ecd1ef9c666e57907390b34059ff960d3bc86d5cf973e8e196718251e88b5117e4c6ffcb712f27e1f53fe9bd24c3190218b7152fb9b5d91776dcdea1a74ba50f041b2f1192adc6c9d18e31f3640ac1e20e0fed2aaeff0d43838cc345df6d1317e125ca2d4ae19a0f790449d57a7411ba3b86c6956b44b3cabeeb26842902ac5f7c2bca3d8de900cdccd62c7d38b621bd5f3cca7859131266002d55337fb75036ebe1fc9b311c7141c23e13aa7d5c95423d436ce318054ec4be65068c7a9b445f2186c73ebcb449da7ba654a869baa6aa03341318a3ee409bf58cc08460dbc52391bef5b2eb9953f90bdb9298d2ed320298b3634949eb7d564d26ba9530d57204521994ed976076a366ca92922d1d27d1248d90890343bed0916d7dc49ff40e99d6c5b0651da810f65fe77088096b1428349a4d9693a29334288dd805c5ee0e519de640072568539e3b9b737a9b5e6618de35adc86a8e1d78fdc497dc1c231043033aa313ea06fe2b0945f62141111cff6cca3e546c16c16fffde9467c3d73642e16a1061769e54aed6f2aea355fc8cd13c136da1b46b32a35345d084c909053fa915270d51fb5498cc7af8c2cca92900853cdbff3c532b5c0ac96c5fa8492a0877ba89e79b569e9012b4e0184b52576c0bb924fe43257505c01761e77c92cdf57ab884ca4ffe37be3e6c94316947f87366a4464037ad6dcda5dd23baf7381ad23eb258143ae820a0e407756ef276f0e8084a260a66934cfef885324975628f866dcc7dbccca06a4509fe1a395f7d3d364fcb735f4a6e709d26c19164ce48abc41c3db3b856f439bc011990df8471419368249b46ecaf926606f1f6070d27f58411a0420d4b1b2b70ba24b1c17f72a36a2e3758957d7e427556ba8a4d69a499da3621c282a39095680a46d38b53f9d993d27dc0b9b94960851e8d8a2ab46079cc524cb2c4712ae0b2c1368723a9d816d21f7e3e39bee04b2c408890d36c0aad6224e187a15559ea1bf7cbadc5454f0f49abe943ca0780959b88a7241ce2768ecbaaabf0366340700dfc950f7cea7a5ea7392504b02f8712933d88e63ee28847ea020da615da7d0ec26bfd649450d4dae4238a094e04ebd37083a7bb603fc510b15fed9a421ab0100a2dfa4d8bacd7508759763ae787bf620ace6eeb355e1c95149d777eceb391444030cbe030fa467983e26ef4417cf3fc4a196a11cb438ef8c9a14266575f47b8364a64e169800c5f0e3c0ee4397de1471b13ead9b8264ed0174e21cd458072f296c43b5d12be903f8a5cd1a82f5383189652d153a0e6701f9738af6b54823336d2f98e3da660ba747cd47f181727c63e392e13eb3e18b9b410e2044d92ea6d2828b8d887019a5545319351bf415892a5f44a315ffd786b6894fdd373db8b4dd4a4f6dccc85efc58fda1a015d6f76f193ff3486ab8b31fc388fb02211afbf2ab5b14ca5e380072711daa13827791b5dc03907ef438e16a6b1fc9d247c261049b589623f9e60a280b328dc627473ab6c26d8debfc35d150025f3149018e4a4efcfcb7783ef1d68c842a232b77c73039474a3ff954ab7c2a8ce104cd5d55816a9e6593d042b2dda9960fb915486eb2ec648eaaa06018a5349a89532d0db8f7e40cf3937d0d4bda212d599f0478df828e9b2a3a1e7ee9f1afbfa901108801b7a2177162d8bb7e442444ed33f020c1d07211d8a07d49c6bdfbbaedf1ea443acee5d158a1ac70186d592cbf51769b8e8cb6acda85fc8d236ad9451845eb854e8a720b2c4c5f6588bd9a50a60e604dd8fd0cdd350633a1413b6b410df6464d91642d4d53b75aa0b3a6dc6b809e894c7561d2af0ee431a3aac7ae543aa880b540bbd942ab8da398840d8ecc9673001fe3c0f85d2cbe8f1012355fbedf84caba2e22dc0ca1a50fb52f3ff1477a38749e261b573c1ee062b28bc018d2cc84730ba64bdf109352bbd1b65ca86b8e245f009ae9d14c84168c94fc7c722aa24cc918151bf2bcaaf1a8093d39d0742a04270c4d1b43c515aeb7f45759d7773062246c2863039f1210dd596e59bb5a2c31487df928e8a47de8da73003ede56ceccc27794e50228881616428492f0e40cae194240f0712b0e7d208874983337214042f0712fa1e2f0d2892d3821f7808f2f285cc90398951af1b261abbeef91b7d802882018636da70a9771e8b2fe22592780ddc1323f8d840d25e4561ab9dcf3e2c4587a93d7b0ad2c006d254906885f34b1c24280ebb2ca2844cc21b210a61419d0d126995031f7508993de9bf5f1711a848609a0772e6eeca1ec1e38990f6fd74e2a383c9f23d45c1d3438ef69b94c237d3f30c0d45e9dd430eb8d303838a75b0e8375e02ba4d5721a6200830cd2cf83482c1a6c201e294f0ae56d83435b1afea815ad4b7057f2066cc5c4693ce990235d9c26dfda3c6826e7bb459c74ea387babb542e47ce41c0a3e0e2b290ee98e982b787147027b5c38aeabce0677e82a48d13b80e05dc525af6da1de84c5e5bcf2ac624e637fe028a165060531c9fd043aa496bc11f999d210a724f77303a5a91b7f804c04c3ff10d8ee26c2e318cef6d9811a306d83152a437ef911da64d60a7c5bff110246cda77a5225541192b31c028f0a55236814bc06abd69167a73567bcc6aef0c526a19889c740e8816cbb997e159aeeb4dcfa14f9bf8085254e094d7747601deddb67fadbae5f0b8031dc943e26a49fa3ff3ae7f9240c50228140a0248c7bc13a64eed8233d2f55c63398296a7f543260f926ce99e0bd211400400780f290e41ade472d9329fd52d32ad9e0368c67cf68dca9c52840aa5048fe5a659d2fb19ed33a33de75092c8b1549db32ab04e8cbfa4c2cbe271185e43cab5bdfefe2429e090ea5696ac6cdedfc8435642c86027ad9e9687bba7e92c5adeb17cf65876ac2ec9dc915d60d7bde6a949d8c16a78e192bd3df9b9fe7dd0d6e3fdd4863fc4234881f60f42019eaa6dfd1b5dbc60bfcfe165129ae33833d1e0463ce4beb198754b95435a2eb22f6c128e98a46231fd6993b1d1560f39750b2dd89f6431ba1e74e4ab86b68772c03cf20f3c66b162bbd1936d65511b49cb82d84af67a23a2b8511ca510b4a3b279a13db2308e8ce99138bf4c6aef9e38f41f4300052629284e2134b33bf32b066827ad340b5decebff1bca771285d138da5bf622490210aa3077eaad19541eaf3378f25ab3488d425227cd77bd8414542596bcdede4b90911cd7f2fe462fec820c12b591752b8d019a341b495782f31d12d4102bcdc0e3f535ec4143ebfbd13aa275bbb42cff9a65b3a25d30b8886202e3cd04d1bd15bb7a093aab7ca37b7b80f1bf88df1069dcbbfbc717c29971969b43da401f5105c326c7715e0381b62beaf1821f23424e74ea92b7412236d10092270af31a8c947d139dcda2b19fd85d88951728a3d4c0f96fa1cb57293db9db443bad1824231f710569dfb824518e014e4dc1443186ea64b93f0323552788c41f69b243dd469b926e9a877e6e4658d3bdd9408ebbec465b32dfb24816088db918f474c689735a4e4f2c014072103b617d69361b9e06df990fb76e31c777064d7403eac6a4ca4636202f13a969259c5c8eeac0c4409f87fc021696259f49b5301d71789e371b70853adcc66ca3280dd4890c43cf2b065eb6377698e71c8aec7d9187db589fdfe742c3bc7d4515937c4f09ebb51eb225e1a9cb970cd76244e65c33a0e8392dc272a3a8bd4171d8bbf6e993989ce3ab000811edfd98a6e174c310c1788c71c15b4a2b4111dc9957d2efa6b6f0f3fd343e112e73e9af6488cbc7c2ea6d105901f4c980dc68380872f6392a8308dc10c71cde3c1835f9bc283fb929c9448b3073fe110b8d620a9054e8cbca8887c5e8240c4dddf1e6c78c184416b6271a48449ca6a971740025c28b443ba08d8ff2d6e0a45dd8fb143b78c14cfce91c933f0de44d11b1b51ef6ad327dabae946b43637a23897d34a59765722eb822a7a30cae9ef3a893aab60ff9a30e43dca8f901e55e591765f902e98cd194223710603fcca2f9669d9f5f66c913671ac131f900aac87db861bd0453e0e5a73dfccc70353bd611553663473a8659b26d155e103df0f5ba7afc880800a0e8a70bdaa2ceb275e40ca0d3d0454d36976a0d5d0e9865f7776ee8863a221c29e1d442dd905a1221c8a67f39eaf5d47bf3200f642edd3117f7951523970e19f975d8c710ede0d5002d5ebce5e455aab9a5a62d02e8d95e573d7c8c31a37118bbaf19ce72145a68003ede560daba74e7445e45cd638419c2246dcb9e7705217d7785a22f0490f83d40168f1c81f78b9cc22b4218ce4b8f70d8c48d4f6ef0630baefb87cb540bc73013bb331712f683c1674135723f212fe95ec3a3b95f1fb0f4963cd2f5efc211d7b762dbb2a4fa9b8f55e0f2d0138f962a4b9103e0d16637fcdb1ae2d8975da53f6d95263a20ca019961c6dacfb11de0d0219da3948b6d5bbae1340d65084c497b6474023cdc4a15540a7ed1b978e576a4e2a92b926ca0e11d3af805d52bf0ef0be7a4c76acc49326b12d68da2031433a19e823827e6b7e7c70cd8d9aaf709f18d38da012fe30094d128eec7ff4931ffdce4049ca030b101ff296123debca9c01702f37d16a339ea6d4c3cbe367910de7dcec3b2279a1122e4924b804ef78f1b0bfe9e644d1098937a7dbd5a9d2b76878c442ac8ed8f86342dc98941db103cfce13be8d320f0d46568ddc4f7f8783e56cc6869b7f0ea1eb9980fbd36169b53f154056ee54f23593cc319cf2e65cf4afd066687998428481e9c7a4950cb2c1b117d6666abf87ef2532d4d154d24343be0bb60d44be0796e0b03845a10b2c4336e078cd9a0140d2c276cb04006c759182d40fde98116317431a000026042e255f89e33f85bcd04a519502b89d44b77afcf412451a3eee848ae4bf2ce90f3cacaf384f26dad4264061f567b59092b17d40285075ad11622cb8899ed0025352c0f756aadc299cb25a853b2dbbd8fa0a67fb1a16e67942a0f9b783e2ee2d169e9334461c6430f2470d84d64540e1e8778f0ae1c205fb1daaaf13955651ff16289409b32b3904cd86d552ae55aa07cedbc08cd4a051ddc622ab2f42ed49ecfeb23487c1fad0c4f6dc807d6ad6bb39051911be9919221aafd8920f8625c4ff691ac4269ee365832692855219d0ec09d21167f28ef90d6e0aaa2742871173f05e8a99a2b6827efdf8d14f5d98272cb1f78a19a09acdee546b627649b31dcdb84f236e9d8b2626143b9b68d52f13e41f5a734a7390eb5a88ee412e307d7ed766858f6af1534f4895875ff022e7ee80eb406bdf2536ccacc2dfb396089e80a3f5e19af1b2bf29ea29a70cae52f81d204f507ac8630c57f9f76e778b6fb10e62ffc5ba0b035562c77cf63c19b4f746549db6cb275cb34de95a47ffd83b483511e9f414ae0c0b802e72ee6b04632e64ae34c79519ebc29d6209b9563c029bccbc8d3287698892710d69b07c5dcb960b8fe888ded32f03fca83330312ab55a9da366595b26760afbf784f64be49a4035d1f02f2cf1293f3323545422a65c7b61ee8252ca192041896d3263ce02cd335009c27ec1a743961e992922154426a6473d7de535ba4a7b1aa87dc670c9e2982b526aea0e51f1f2898f8f5ef2f691844cd15bbeeda1f0737e20f3af7b9c051794e3ce4a4a513ef50972b10be1913bc2b2e0b4f9d1d37e36daf5e37e766da0078412e28bcbcc280573ae3236dd92c5ea624d7ec3aaa64b8897c901e700df5f147e2547d2b80bff331c0a18d0cc6046376f93590979738705e9433cda54e0ba7f061b0bd149ae8173754a2d42410a1b4acf49ab1461c65baffbd1738a9803eebb0911718b18f6fafd2aa87ac198a8e31aca772f8ab6aa46632c5704a203f258e392ff673353e9be3d077370016d5308ba7edebbcc5a0e56f728a0e5709e131e0dab18fa992c888273d7c185521b3942834dac5aed1f378309c9c7131bcd8e231ea2723d55d3dfad585a73adddc1ea8f52eb5f789dc3042e2804e9504b3372a68d5fed67a3c600f00618529a963a2cc3360510f58a21ded21454937ed5f2f180e3d8fdb038ad2846592f51a533c43596a780bdea8ce0d064160cdc7ea2c4a85ac8b3a1e16533c0ddf7f4080d4fa2b2bde34f9e611ac1fbb83b2407aeb90263744a52ba4eef327f03f6a6ab90fc1898699e39ddc067d59eb702c92cc983bfaffd2d5a8175c978597dccac60486ea2c1918eb75b75083c3c6bba370df0dff3523bd29fe3c957b56196e97c366de1563b2c9edc9b1d485025c574ed3ab0fe042bc4fd7a9a8830e64081f80265f9efd26fec92f4bdbe8d04e163e0990f6b760b5d9cbb2250a06d762a65f4a0914b9bfdd3a6cf1c9cd1bd4a93b847e4cfba7fcf35c9d136c1022d4196d4e421e9f27b0a822c5468c0e4a4059b426a473a214bb21bd8ed81ca83ed6955d314b1fad0548e7d860cc4cd9f61bbd2665d1d274333189e6138a320d3442c129bf2b13d1b3a7b80ddde5c4b325d39de4b78af2b5ddf005cfdd358f14c148d30dd1bb4eb358656fc1fcc1ef2b1d43e82fefe4d23327c937c2654630fd122d78e0df2490cb2c5abd6336bd54a2118e9b05227f27f14b94292f1cb03c27788005458c5d09567256b3656c9f2426c106dacb7a67d29f0a244cfabdee4616f4f6eb0fa54149e7a61cff78b4891a1b1777bcc6edf417d04af4534d566585aaf66a395d10668af61e30bc79802d2aa8811aa0bbab6ab8ecf694d20da3032544d7bc3af7a0510bb2ee4174766cf9b6eee4199283c318c02d3ade6d9a00bab07619f912dfd8fb08fda186fde3eafb2b6a057dcba5fdeb3691462832a413bc5da11cdf27da8729c21d426561aa4d32d4823f5b68bcba67aae3ca9a5ba479961c6a6c4b8eaa001c855d3d09318fe1064865a6f7a231a6161e0f0633678fae30b0d422d07990e700666e96c7a028496e98795045470f88ce701d09a0dcbc61e47119e9bc2e081f613e9d622f769fc03599dd08844cfa3fb543798264476ee67f318e3d152105f9126be9acaa82882a9de299cf0b6b7e4f311217db45ce012d036d821146673ed9f0c7641bafd28e0ee89275c417024d2a5b682c5a6f61d12629ac22e7512bfa38f08e9debb58754b82a8da16c712ca409b64612eb163b81c13ac2e99eb22cc9c52a21d6b59310067930e13a67e50a89d22d647e6a9ef33305e36a546e1f9cfab8a9596b8de288d6f9c43301d1e7d7a33faf88a45f26d14b4521a6de7a726d44c13c16c2ec88e709fed24e09a6d9d6960ed02f5c0dfc202dc0e57e3183e689f15ffa4cc1c6e84445caea032b535ac486bf23e1b6dc76b547a81d4b6a728175e82b36dccf4e570039e358075228cfaabb4d70d11ea5a2fec476028f735c7ea49524ea378ecb10cd2437490e06af926ab533cbf1dbb4bed2192c63ca0008078104edaa5455a4d5aadef37a3785c75ac02d2dcf1832d9f525551f9a055e40dc0551aac2a7f0916db1c99453582d19104278ed0bd9a581142eb06a0518b39096ea87f559305553b387cdde9148d6ca54bb48b4b5af2c510a366664c7ee29543652c4d28e78e39a8f100351dd6c464c3c8631677e1cfffe952f2675fcafc92e8ff7c8cce4fb22f294664503e272969922c71e4520a506b8cbeae013d1a5dd9af3023a828c6fc76d7468c0bd4446d966eca746e20cfbdb3f0f0f98f0b681630ae5e4c4347859d9003277508e11595d04d220d225229e0f4351daf47439f257dc8120d27831212e0d6916c67b684f872e745803c5c1f410cee9db3f0d4b90daaae8f03e4e7067af28584d7e0ef4bb46072025751a2329b91cab51081926f4ee1326a488f3b90a9982ad4e24969564481e8792732165bc2653e3005cb2a3139ae4c836228b8ce1726619d74a8879988584d0d96e9667fdd2de35148b4c0280e11a39bed7046a30444ccdade6d8318abd0f53a3bc6e055f49838202e2c4dbbda72bd89e8db352a9facee52d7cd448ddec2836fccbef4ef08abb7a6213d0816181575b4fee977a0d627e8774da2d0a3069b45ecb0db30341940b27402ff7d223046db50a88ed3d6031f67388c0f542942123d99fbd0ff449812f6fe86226a4dd7047bba3b7c98d1cb138971e8a269e09c98281bb617cc6c38cdf365abc6b9a8ff908d655fd21b713fe7543eb33cff7ae07c17612da38e69309198e4adfbb1a550f898406c3eff9a64f7033087b191753f1722005151f6bfb1dbadedad93b2dc35f3e43d601e39550cd1eb75007abc8623116681f95a67fbf99fcae7826891728177b6e21c74ec2420a8364b59f9919dcb9fb15bca55a43faa39951af064762e6b718ab499b5ef71437ff9ef916eddcbe4bf7f2c96f6900f44bb17b345a9829a907d95f25e15eb3e8e0c8050c1447435ed5225e620d4265563dca99f96be084c21123f626ed5452829c99fbc15cd204a00916edc91fa0942bda19a0b8f3b658425a8098513da7f47a86592bdecc055fd40046edecd06c85a82c1954f15bec5e3ffe7c9b870b6652bebf1d059136f436f0ce4d1f9c0228c75241e46f38190661c4f7b059c9b5b52f8812d9d3bf04c445c3f80c1c48504764db62a0ec873b5f448a948f4e3c8efe8dc54df1dcac8649e8486b400c8974a4fa14b15c1a666506f4e298366f483d4b7d8e4990a006dd0399c477e0640ae4b04ee2b5d2135a896faebbfea303b2fa4168776777d2c7db2ab57acc2eb4da1f58228f094f4fd03d06999992d33caec7fbe0ca78a54ef779ffcfec03f91923f61d7811e95151e75824eff4781437301ea074f8d3f3e8ebfd328daf6083640bda02c6547ade604b07d0c5bc96492df67d2856faa7f7084ebbfe649ee63893732c8f82338e269be1bd3399415bc4ac7ab0c53cf6a75fef4d280dfa0c8eb310b9e825d75611bbc7ad6852443939af505ab3eec9ca2f1d1a21ccb3b8b65435096e093a8de5ff8445957aacc1e52f94ffdec9f0771bb4a3eb9cc24f4a1128adf25ae148c626e22c5fc56bc1829b3b2277e76a0e497e8ae1dba77c55d86be11f78c7c08b0105f9895833d2d667e68645a7d06cd648f43daa238854c130bc929cbb688a56126eb814314be654f0f6d0bb1358ba2f89ac60d2875924a21d213722d45c5fd09c84242a5df9662bb05b5a61411361511ea028d76c136a164d2da12b5be2854da445fa1386735f1129bfe7b585c505f0c7ca12f8a1a5b97038d58249854662b253725b2028957b10ab442514da9ade43760ce11aa7893789d9d6a89ff5649fec1e9f9dd894129855740a5ec0ac96c0f9dc2842ca060e00383709037985dd020b696f659d32999c8aed1395f5a1108a62829200eef54980938dbe501110d201afa1ee9ac18a98c9e38a66337993eca690ab66ab8dd248b2a64a140dbd83e37de41245fe43cc98ec8b037b8941f234d08774a6a98448841974a37641240a43413fb48f830b1bf48284bbc711be7b90cdc260ec7129ffd51e42faa625d182b85a11791644956726099737c451bc2a3ef1aa1b6c84631a9e4699bae0c27728f61aed8dd0d706931b6e0bc532c260c25cba7b63fb034a5f90ed6271bca862121ed20d0314c6b8d27b409cdda8e2b6d7a3cd0de3496a4ec0b05c976af48a6deeddba1630e46e8ada94c3fec2c6bdbe4a1cf7b408f0d8ca7aad038133caf8dc576512b0bb4bceba94c09f188336ccf81c09f8bf6cb88a16806c03a5450ecd144aeefed7c1790cd31b69688c9b3974cda24e55e3c50a294f5d1040570e85f86177996c5c680bdf518919515ff0fdedaeb6b50c63ddcf8c7c1839b4238c5454982c5704c7473eda5520449a7dc3cff68853a820d4c051f1c762935c704caf7cf5f0b54ea7638a0621f31882174d44afbda2e70e048ba98430c047e8a9d885b9cb02b6b23040d6d823e0ac7a53e308fcc64634323c31a25bcde928e0a56d55b77a58f0bbd85ce5281b73c956c3b41c420c0697fe278cb5493a6a9e5340a9135ffe49772aed15636bf78c38e0e1fe07a66d0305658d21bbb6e5273411ce6dc933890e4631807daea3616ca649c66fc0d0eb388f0296f8b5366b11c7834854723f4409c65bf4780ce8e210e763a403d214a7b8f5083a5dcc603df6901d2b8135b780eda6985574280901df191c8ef57d484c266ae30528023b24428c717b80ca668bf8dc833f99211cfb79985ea206df7a7678b57ef02a3642a7d5ca4b2542f79b25c0c0335556efbfbbf00bd36fab5ecab71c0079c90a8e0f28bbffe7ae39fb35da9e5fb7fec1ebd67af51c8cd8e39496bf5e3ac4740ee5b5fd7b0e120e2a8609299c023bc9770a08b5cff6a71e3e9c735c17b35cfa3f256da5627875957fcc65c0dd2157a8fcb5312a34448fb66dcd3cdee90699b6bd0879bfc1dd88a3e83288233d95b9b204f66bfff0f33c324f2b63b3bb48dc36fe8efc0e6cbcb8eb5251fe8cad14467a0e17551320a1a56ddb50414be1b533aeebc46ac47d894cc3d44ba0fa3bd09a5542199a85a5e79c7f8ed792a5fa45260a9cb0d6eee4846bec6eff89e1471f0b06f176fe2a96bb31c0cb45bd0535f87c0e90351f1b77368ccb803f5b3c9ef576c28960ce9fe51e8760e26c216a7cc5f0073ab6af038a78b8a4cef050972cd56560bb407b9b1ca1d84d2cf49fcb61b394dcda8768294b3306e009adc5c40acd49f62b054b0da1a829c51e4c80e9541de6b670d75088410e27dc1f863ae0cbabae84dc092600cc8123768f45ac2696705fc9264683c58dd57f3bb7713423d20c0d1932a30fa14b76f11529b487eae69887993f0ad9149e5a961836d1d63686bf51753136508baa02c306bcb4287ac9d12350d2ecc7559ed66ac8fc95b6815b88dd865ab9b7a739154b28e02005a968a8a6e6e9e48502186e195e79188262bc85784d2a9f05c92c87dfd98ef9798361fbd4fa09e20c9cbda77ec2d385e43fe630064640c98458b01f09997bdf5deeb4df1551ecd6b0f367f4d091a3edd4a71741869ed276237996bdd524ccf5709bfd757b11b088c741caa611591cb188e9382896372cfefaede7f2b8fb78eb2a94bddc128ead944ab8eff838ea24254c7a1f95188bd91ccda52014109e49830c80d18ffe0d37dce061e61dcc55b7b19ec687d33e06c113525f07bb9b2541de3ef591c07ab10d1d9855f142f36c536ebe8097867e46fc3ad64ba0609759eca7f3bd01f6d789b9307e8a20ad2dbba4788aec17883e1de78a2ca8b12927337e20dc5791b8fcf796807e7033970fdd17ede0fdea680c02aed44e808f805780befda594bede669dcbb53b0a36ab8effe9ed1c5f8977138e850a95dea2e5d138adae7683cd152d8304c8062668dfc51fb6f3949f0436449387f01d3f8032a8701e815ec4910e7d6faf89d026604c74531875be9cb0a09ec852d817960c0a5cf36c29cdb9ee50e97c96c7b389dbfe0973fe93b8d953719f17cdcbed1cbe9657a4d58750c0ef6b9dcfd5436cf84e9c63cf0e500a516e14f1b54059dc3e49061a0571e682adb1856f93c675749d60c8418c0b74ed6a6b6f9e1f8d7865d879cafae81ee1b7f897360873a6bde4707c65e505f5d3be3cf2498f62d3915d45c2d35ec8f5b1c1b9e2f6629b9481549fa35c91e88710d004080b5772342ebd6483bb8e84aa7fa3efa0c34be6580c33e926923f88b4406198d2a835170ff6a7d108f36ab37c18f424c83cc379fa313f87233e168f99de3d3f0bffb9f116229c2b578e3cc0b5737d4d6d36ba6474308256b53e4c64fefb9c53509f8b03a5275ab8ffb96d1faf92ae50cad50ae70da2b38f2d10d145ff4652a2a5872960a4ffa20ca7e634f0138d92d7092cd1fbb2cf5d1185d96807e4017edbdff3883ac9f23435020008231d13414aa2003c27c89490162ea04be714058ab1d7cc998df211a07486019245346a9cb9e70f215712256525e0275484f9874feabc7166601648d4cb1d6f9a729902fb631548b2411770fc4ad0ca9f35636962975c2d922cf8aca2a2484185f2b10a05280d28e8c6bfb07edec2bcea59582fa3b1700ad861e39679d2a493c701987f577150f95cfa3d6c35b7728b0a3a0c44c05b7d300366a532a6acbab77f5750ee0b1655a1c4803947c104414690891ab0b58242a43f9242214f63d492dbe82ebd1e7b3edb7503533a64a81490d7f20dfedc79c66232957601dec04a22f70f007ea34eac583c2e3e128fe420b70da2ba42e90f7bb15490b610a5ccb184b709b6686f88b5976b726b7b1892223e43d38762f8a94268cd86675647335f8c2c07afdc0ce23ea4c7930371f1d30ee1dd89a893de15879d0cb32f416c1e244ae34011895c2ce78327d37d47fbaf991726fbc5e81c1996f42391100548c019ce634b05354ce9914979cb8a1dbd9b5fff9c526bf900fa07aa85d4e340b84acf92b924e66ffbdfd4993936463f74ae22c4303cbd10cacdfccd940ca780db96c6a22da8baae6ac44d4c32a8e3ffb2db333047157e7a17541ecaeacf217828e2b64501c88b1c9917980179579761533fd565debb4018f3e0f10b452c7ba6c43e3b6925d414b502c4cf2fcda3f04653cded5961df03b69a51323ac50b9b4fe332465fd5fcf2f2c0b7ad183d698262448ef37e5154cc002fb98fcdbccbeb77cbfdb87650548f2d5c8a0e0be060fb929124af7e880d66d4183c3ad0fad2d2fe0845c71d21eb3f82a32bf375af2005db53c82aee88d75249b239af238682447ded84a54af576193c5fe2ab361ef02f1aa886b37f66f290a013d5363503526cdbc5e771a162dc287d4c9083fd6eb93263995434103a3a96837c0c7c017ebf5d1c9dd3cf6024b166f42da9e5e07a0e8964275a9279873e3cebd9f09801191ccb73fe9ad22cf24bb3da0b26a1443bcdc9a3cc92d41918be0c343b059d3612a3271600ad88677050224e86b0ed914c1dbb8eb42120fa715449983bf4f16901ad8536fad2e1c5a5df10c5da2154e43565ce0745a9c8eb8d979133668177b07ba55406628e0e3668d8d23e69cc26d62e218544b300261ed0382e9b19ddb81da2d202dd9872c90eeff07ebf705ac24e469e276ec663ce7ecbb15a07b248a89b6835ec548f13bd2cf020a9e9b3326450da1db258a4e67aaea1bd6f36d01032591ef201f9b47cf1fbdad65b6e6f4fc088d70e5f1db3d22701bdcf2d4be4d304171e072e8cac08714944c8e7c8221701588549ae44052c2a6ce77519defba0e4b3d9a9cff85b6635197c5e90be65c01b5a41f16272d25df702a55cffea1e766e76879f3b26cf6fb8868d679e14d2e58974a4e22d061d2f855c293defd33cdf66db1c893765cf37a8e9ba49b2a08d6beb110d5fd24b06caf6e9639c842ad6f89de820ffb1813a59dab0f0cddf9bd212bae71dc05e1bd0ee4d26d55a5de9b18f5a1d6c559ad6b61440bdea20f6aa9f346828925a0a7a6516f85235a3bd43822a4d8b5a01c613d69491f03b6446d3814ca471430b6804560ad7e45cc4e91962da46f9d9180e2da3ea9d9126d04b2c559fcd922befd14feaaae6b8322179eb6b4b695da0d230dda72efeb73df6b590c73c5b344b68b24e7d461da725e079d4b98188897e96fa4890460ca365aeadaa5f9b93449d7fee5a61becf3fbca536764d57b7bdc4adceba6c1d7a53a1fbc57b48909ff05f3041d02815f092ace74b6a1e74a04e5bd6a29a84b24121425c6ddce1fe68ed5f0726805d59a986d0cf1c0974d849c1ff286b4d8869f6550a6fa40cf8dee42efab9404bd2e74157ac4e9754a55ba01959e0b5d855e26e8be2fbd08bb5971d3d7cd193d5937985de4b19a4527d0c4df9ed35385f8fd7253b85947f87de945d84d9b9b39fa656e388bc8cb2a435f42c3673ba7a70bf59be3c68dc9028cd704cedd04a50f58201816271dd9b57b0c704db18d72eb7b8a1177961ea65669084fca58df6864f6a7594b0d4dea545011f707c488b0fd8b6508bbdb6dccf56e4bc7e0c2a5b67aa2e8ddae026264d12bc0ec13ff08a93542a41142082172cb1d8d0f4f0f29101fc075c05a25e44728d180db5075dcf0005c00d7e16a950d378201483c48d50180ef9ce73344ad0a722214b080d350676a78eaaacfcc5a45c30f908022ae536762b80c9fe133b056e9dcc81008f88f3a837320cff98cab553f1e840184f8a9cea00ec36faa0c51ab4eef810005784d95b1798ffba832b356d5dc871f80f8ab4c7d791e9781b5ea073f5365608d022fe36ad5ccc19baa8c8ba855a693df115e87781ad271944a2d32a50deda5e6206a14f8d28676ca818346c78e6a43fbcc7df4b0a9b9810175ca0182f363061962d051a56aa081670700410410801b6c18c0ca0a1992430f0e4578d881880e36341b1a6743d4d9d4463634970aaee64800706543a350205d0e1e078613d4aaeeb763a697df9f6efceac4fc06b93376a7ecced99d42770edd49bb93e8ceda65d6e516bb8afcb2cfe59fcbafcbb0cb419763b2cbb3cb429769aa5f26ba5cbb9475698bba2ef5b9f4e7d2d7a5b04b832e8d5d2abb7476a9d0a54397d22e25bab4769b75bb75db75dbe7f6cfedd78edb41a63fe0386238fe802ff1d9aa9937f13751de0e2a6fc368743ca0bcfdb304cd8e3be04cbc8689f2b60f0f0794b75d65b7ea12e56d567d12258f2bf1d9aa9a37e0a7069497d67c28515e4ad48366934479e990cd8fe8e1e30cf86cd5e948fc0712e5a542370c282f9dc120431d515e1a43dd08186eae80cf56fdf802aeb380f2d2a01c059497c280e018515efa4304909c27e0b3553a2fe23414515eea334302ca4b5d32d01888282f651d4086193ec467ab6838021e0401e5e59a6a88f232518a56c301cacb434652aa1be042dc0621cacb423c06282fcf76640030525e8e01e041ecf09c009fadb2e105b89002949783044080f2322c00af1b82282fffdcf01e3e5b1580fbf0d92a01fc87cf560939102f024479d987871fcacbae1d7c282fb76c0fe565963df9556d75f203a87368000f8fc3a4e170f13d44e27398b11c4efa105279a76cc84b27326744de721d5a6e8e990e3b7c6309329e079d1d4e3a9c88d090590eb29e8ac31cc05c555b85b00038007c03dbc03cbcc300e020ace214d7c034f00c2c03c750757c725c405a38ac1f413730185ea89f93908f590f994daca6c683a8acb5de67878ba6a58335132403cbf1c2f1638ac58ce50d7283a5bc3a307536eae576d6aab2e55273cc845a55ba46358750a3c0e7186a55e9d3d51c438d02bf2fc78c3bba06f9f9dca8b1dda490df85d020907376f79743464fe08d6159d0855443e91a491cd2209034d0e809a4818d1112ae94e94a9fb91a954a565ff942236f8e9990bd376ad486f6049aeae798dda8d9d0aad85b36295df4049ec7207855b69c40f66f0dadafb4a13581dc7e7a0b810543a21bb590889ec02f6c83720e48166d3f0c3b7be8158a04722c05d9d0ba14d44ca881be88b4ce711c3263bb5c02794b413966a5a0b9c3162c45a1a9ed966616242ac97e3f7b4b417d4b6858f05409e4bd51232202dfb235f1a167d0f7855016169a6af1e64887fadff9b454d9b654b624b62c755aaece154b21bfebb4ca86d628f024f8afbc3d9658b047cb82a749206d68f6e04b5168aae5e04b319a2a1d3c6d61216da552c622628066fbdf775683fcc677788a04923c3d0219ce40963e495d59d8b21472e31c3634db12ea10791c42dfe5e52924b542d6d0fa8ef36ad5e838af1b35969796e546ad9c14753f8bf3a227f0d408e4c579e9e0d9ab24c7ac14946366c18733e2576fd7ac68b7b26be92df5c86659ea91cd5e9c1759af8863ece97fb5745aef563a517a0d4ca86aaec01a5a167c3bb1e04b4d2c78928f053ffe58f06217167c585f16bc65cb63e68efb48a59e2169734d1cf04d3f40f22fceebc6156f86c61a51b80d8d35b2300ea1010514702f9aba65eb46cd82bf396636b45290055fac4b8843855691b155c8fed72a98d59cfc1e1c868036f66d739b93b91b89e0beb91af59d7e74ec099b7e8e42741f9554d8d0cad68ddadcf90e3ec7ac144453b47ca127f0e0bfea3271de2870049a8d024f67641fbca951e08550fb839ec06fdf65b632076ab7cf2925a029ce82ef610c0b7e0af0bc84aa48e08dd0d4943282d79d01ed9d3370125910fc9d4216fcf6e1c068eabac468eabec868ea9a6634757f58f0e0715e34c5078ff384a6460b1e27c85e9c302c8813c5822c382f0be250b1a0bd38552cf883a6be8337b58a3bf8b7aa3b7897b9430ffe85a66ac0b28920333b79289149c24ab6240050f2256125ec494006e1acd9be552843a6a56acc5557decdc776ff9131d2fffe9548648c7c489470bd9b1a249b1a455774464e6f688867e7c45979f572ef9cd87cecc6744e1dde685098e48625b11514086c3ef66280b60a29499f40725b9032463624372c89adb652c98a47a03923e7b66dbc6d5b7787a479c39218e52ab8b846433e203f8ee74e27b3b7675c90378485302654d5423d99bd619359e8fd1d496e4d4126b9732f21a75d79e1b5847c62f3b14d740fa38441db0848ee37848541534161149a7a991425de16b22eae11d0e439db1563ca2c64066d4ae94f94deba69656cdcb6312c88eb38ae3646e7755d1873ce8f993fbd29832e3e6ae714196831eb94294b784e1d308991b139e931bef0054c993b29df1631176d4a3770461bbd755339836659a47286d027a3728694335e1bd7456764619b6c338a6c5ff624b4738a194396325b3384b88ee372f0173ba7988146e7759d93edc9664617dee77932266630d98a706006c9c6077edf980470048235a012c59a4291ebac81e526ce9ca58c0d0f0896490490f30639b062af9d53a634b1f4620d9c8473e2ccbf300969d3ad51b407e1acb932b44aabb607d9fb9132426cb246adbace55ac51dcaae3aea34d5ea1eb877585e48eb2cc139aba5fcc729779b284a648e1b9bbccae405e9245537d102c65f8e035a06415be4b19fee81a50b2ea732759ad92e18b57b2e24eb65a25c3a54c10fdf146fae3f96389040a9746c28b2512f0617824a3775fc98ae3bad95ffd1ac53116a877265913c59deb5c642e329721cbc95c66a3b2fc0139edfd5ebcba2eb24bb2be18cb72ff5edfeb9764192248a3b86f14868e44f4b712c91bc50151354c3ae3899e66e49d27cb9dfa807491712c243dc97c9f312027b6bbcc57e630a50455ac7717194d7196bb0b159a9a5248a004cbdda5f6b284aaba21972a3435a534b92e32cbd9eb32a3b56a0907d9eb4264b930c662b1582b28534a1334ec7529b2dceaba0859ee5fed09428c9e8050a5f60041889ea60d326344688a47cbbd081772bf33f64e99ed09429420adea7317d2aa4d0666278f249c928d8a4bbcb862678c053e4376c6bc58629bd5b1fa0acb9f427cf75ec4032fc4e8e08b809f63cf11288408dfbd484745f84e1cdf8de56c5491ae0cb9c6629ae58b4c14963c6b14f8f06149c5e820283e145da1cf081604be462dcb1f859011c23b78b0a4e2bb57caf4bd2b59cd954c91d1c1cfd51ca120c05c8dca22603933f25da608cdf291285911597e92d51c8dc8745944c8f2bd21cb1f8740f2d1988d952cdb64314e484688eedc3999e577dd3b5a3764ef26e37cb81f97e55e9ccf50abb8f3c6555e7975136a94101c15db8a681bb28c04091421780a62a4c15a75678d565d594512565b894213d6aafb366b55773e8d1beaba731c6c88e3de959b6c9b35eab341f6726c8884831fa4e162714c8d2a3f408315d44617b24085b5ea58a35c329f998d59e637ab552db3125c61adf8ddeaadbc271d7b9bd54131cb8dead910ed4e227b7bd6ec6d96dd628dda5a3c0e694bcbe6420b768bdd0f0afe82ccb28db5aa595bece3e1410c62ab21a199ac03956c946445481f047bf18f0fb36a12a01d21d41c571299b12094e3bad97173dca49fcad41cd9a85fae9c651ae4fd3846599210765d375334c662d96d724cc462593b794ab851d58cb158ac25ab2d6c38e1fb732b67cfd98c249c34556da065c76d9f37a91362b86d65b7a5b66ecac3756f5b77c9f6d270a273ce1a7ae2cfd3d306852c9574ec8520a45348fa29d4a839f4d1482293136a679d5a3ad63ec1d5a8696f10ce22dca8ea2c16ab8a150c967e527b23a503459daa5b49810d4bdafb32a5d0cea021083e231fd4ba1f4e885df76ddbb6cd097106d29ba3d9db688e4ce41228dbbfbad113edca1ce0efe85e39fae8b4895157b97fdcbbfbb67197dfc681a6dddddd447ac081a6ee29880da71fdbe969dbb6b2869eba6f6bfa85b6156a5469b1bb5bb4fcee1e4e8687a6948b30149e7ee89c8210e9815ab1f438d870fa415573a522d2434409e46b68ea85d2db580f887cc0b233d683a11f76c67a0086e521cbdfa82a48a3c8a932ddd3109c3367187f77a694290380bd327c427616c139fc1b009e23384747c5adcbc3d2d7c9c3b3993353e4e975cc14cb614696deb6f4379887abb470ca3b7d69f2b010e770ea3bfdf7e21c76a2c66e0f7285dc6c10424f53b41c06c90b65bd988797f01513670ae6b901b51d0be97d4858572c61f1b0975fdbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddbe6c42462d193f7ed33907d5a69473fafdcbee69a5f0ca3a93904f3d0332d8279b8ca11ccc3424a300f5be19c19f3d072ce9ccdca1c42c2c4e1f30d2cff527ea9320ce6894faaaf710ccb176b8086e573953284986560913077f88bb315e6e1285c450c16e21d58be27f23864c70e9a34686874e840878e19d9cc8c4c0e646472e020470e1c5370e030a16132c5dc2026e6860d6edc80910203f3127b797139c3c5a5c58c9616961ab0b0905148b2448352895406893492318e629028863308c3d118a3112806087e617c9f2703cfeb62d03118966398dd3618cc9deefe62ee50ca50fa45534f4a26e8897b6829017ae22ab249b37c7e424f0ce3d70a48191e46ef77799368c08e3eb9c88e2e845233487eb58ac81786f57e0fffbd99c9e5ee9c7770ab01d995ec2ab9454f340a19be5f84080dc8efb3079aa22504442245684ac6fbb45dd7cd829f6399445c41f94a993e5b710b4f82d0143d3fa1283e17fca265901ba53efcc307e32383e49b4cccbcb557492dc85953d2ce18175acc5bf38b5f7c6ef1501256f2750f1fd0fbdd4ede4af2dc377aa25fa3b8ec5fced2f724296781fbfc6af5f544f144f12783a43b8585620a2b362b694ad108670d0d227526c7f55c7da4a95553c60845324faf6445368a67405e9ded5da49b3a9cc9ae86b8db0763843390f4f3fb487286f30739474a5b09f3033e969e2aae4f7bbb55617de0773a39969e2a2d7a9a36b6852adce88586419a4a7205a40e0d83bc33d68d883c6efb848cc2b0881afbd14084fe721f9542b89741e8697b13dc71a0a74dc709e477214da40a014b276aace75d080e44e8c7d558afe362454bb6cde36e2f39bf7d76e774bef27e1ef99dec46da4d054496642b90dba99d33b00a33c683221e14f580d583253d58d203160f8a8eb0200882a037a990deeadda2e03ea6acb0e3b6adbb09dd4e374a4f4ff3e5d64d29bf50b2eb687f9452d346b9de28fdb61601a59432d5b193bbe96dbd6d4d45c0d464278313f5796573dfc4a181bd1f11ccaf5193e36608b4110a9c1adf1fa73077b6f72d50475b30aa3ffaa1294a320fbfcf53d48e0933a75f81da4d814f7d296ab7053ef529503b2ff0a91f45f5aae0537f02d5bb824ffd23d5eb009ffa50540f047cea4ba07a59f0a91f81ea91804f7d0854ef047cea3f513d15f0a9ef44f5b6e053bf89ea79c1a7fead9e0bf8d47f40f5bee053dfa57a31e053ffa57a63f0a90cf6cce0539fac9e0df88403cee933e1c96c7f895209248ef068b6af802288f858b63fc4d7b27d213e97ed1bf97c6c9f00df8fed1f7aa8b3513c94f70bb2ad4379bf98ed21e5fd64b67bcafbcd6c0fa0bc9f906d5bde6fc8b600cafbd16cdf50de8fc8364f79bf9a6d00941764d97e10b065bb86f2822edb339417f4b11d4379c11fdb39e5055fb671ca0bc26cdf94170cb28d2a2f18b3fd539d8df2515e5066dba6bce0cc368ff28242b6c121db3f48b3ada3bc2091edcfd4d92899f28235db38ca3b62d92eefa8651ba6bca3918fedb3542948bbcd9daef4799153e30ee9f32d2e936724eaa0e154f8f9927b70cafbbc424fcc5d8d52af454fcd849ebaa3f5746c5ca1a726c9b21b9a3863105290b63ba94a61b2dd475ca520ede8e10c64cb1c879048a493482496ea31a11d13d8a05798272dcc5317e6a9dfe2b5887836892cbd25f4d4db5781b8528acf6edccd4826bb6eab9e137af2b17d7a213447cbdca1765e74d9b66d63de3aa1f1a5ec846c4bbddd16ecdcf98830774845609e2b7387ecd6e8a43053e2fb1d15ba2a7087054e859d152e6f37649bda9e38fd6e0bb649b523c2c4e97bb52b02e7f4c9da5d9938fdae764de8d6982729cc53bf543b2a4c9cfea87655e00e0b7cea8f9b177c52e589c339fcb16e5f57c7c93261268e89c31fd51c93669ed80b7b1b0691fc9867c43ce1e75f6070ccd4f8791d3355fa7c2d676a04befc9899d296149f85a2bdc092c26437caffa4d07e48ebd56e0684c9339b3b548db9f383b9e38d7ee829b585b553a3034237844e68e27444e88ad059e986ba2b5d13ba353a29d8ee6613a7df64904a185da1a96df433226302693177805adf16cc03d422bb18bd464f465046608cc49829f02cbf41c8df184abfa83ad262e6f4c53ae2628e803eaf05b673eec805b64f1a3db1fdb1f2280cdbdfc4b0fd1119b6efa806b6e7cc116779e70d58cabb2308595e53a9bce4e867ee8cef87639db683c8ed47d8ded10fa98422071e1d8a9e20e88abb103a5e1c774a11a7e53aed067633960d4baf4908268f9d396b4c158e89e2f7bb59ab8468cacadce9deef8ed02961a6bef7bb26cc1478831b040912430c2854b5fc5bcb6e66fb60856119a758bfade2304f3c774622924cc24ae8103290f1cd8636a462683734c8eb0d8d1b3d79326f88a69a967eae27b394de93d1d4f584843c2b344585aa98c5d58b71877ce305a31f4b0070c59d29a5ddbd6d1bc771a58bb4bbb76de338aeebba97f7b66d1cc7755de779de7671e338aeeb3acff3beefeb735dd7799ef77d1f0882ef3ccffbbe0f04c79e011cc4e1e16834e220ee8d3d3c00f16fecd1e1df0e0f41101c8dc61e1f7e78188a33903c3c1c7b8a04d1c351a00fef034fa8cea60778428d80907e882309074808c30d09074869069718585a5c649881ccd1719161869720a6d48d18932a080c0d35985441b61b667872c8ccd870030e00ecccd87043af2e8466c7ed4a47000470bbba103aa4a6a7e45193c3903a809a6f634f0e43f841d42e52bb0b206aff50db871eaa8fa5e7e1c7d2ef50e975e8204b4f2466e9813872e2d00fa939d4191c2a0df4443f8095ad46aa000250a3a8bca43293ca4e2a77513948e528952b57a1a7a1f20c9565a85c5429934a9be4540aa4d21f95a25129954aab547aa552362a2d6a9bda4ce889bea6ead0d3940dd16664e873fc587a1c4131556888886bf42c2eea435f965298a53466e9ccd28f28a5b12c7dcfbe76d1886a1ecb6b792e2158504c368bc562b1582cd66ab55aad56cb67e6e3e3e3e3e3d32ea15aace5c39e50070b8ac966423556cb158bc562b158cc9bb55aad56abd5f266de4c28d6f266b4a33fb58ed5b53a974ff7438bc966424330180c0683c15ab1582c168bc55aad56abd5a2c16ab15673b4986c2634446358cbe5f30383c16030182cf6d562b1582c16a3c16ab16dbb3dfb5aa4cbe4f39fd38b839142a621da89e8abc16030180c06ab7db5aff6d5be5a0d56e37af5cd4821d3d06927229dd829e830d38bfc016930180c0683d5601d5d5190d6287a9dd829687bf5f6d314a481349006d2401a486b8134db42bcfa48d264fa677dd2b1b7673a1404e4ac27143862368aed6cb772d4431256d26d8407e1acb93786ecf670f2a7baa2ca93356a3bb562fb469a2812c82b5a7a0472c67259fa6191edc95a55ea82a2b66fa51f4fc86e9f3f32bb957ee869bb11c8d28fddbedd18eae28af54eab58ef322edb0fbfef36d1883f635c10d9adcaf041dbd9cfce581a05927e419259b08a446b14d500d922d14e40aa6d61fb934b2c17d87eb798b0137aea2a90b7f4f2f1196389186dd8d20f1bdc05097b9551a2b5aa549b1b7325590cc4d6041fe49255966a3516f35cb6de475e2dfd6ca5a2d2137aea6f34204916d0f76ad557964a443445f3de7507fa2e846eb5d4a2a7d16f77afe48e4653fc8446533daf8d8dd28b9e9a64956a5b1924577e9c43471fe8bd87a51f9af2cad20f3d31cfb42c967e4a3e5b90fc5bf2b15d027df71e4a41ed457221b4e484aabef74b3e34d5bd88a2da87a67ab8283929d5e8a9b5206fe955aa517eb76db414e361741bee79a7e0290f4d6cdfc61cb877ef9cb0c16ee5e54bb1d1b2144614db1b1ab64b307aea2c90b7f42ab54aae92abd42ab56cbfd42ab9b8ea15d1131312ad55a5d744f5bf8fbca5171464e945b64817e9225b648b745dafe6c5264e7fa517c4e591cd7a411cb266f79b37a8a28b998d65fbbda0f6823632486e83b1f30662b44ab4aed4a597ed5290ed12114d517e8fec75a162fb37645927b6bf912dd6c2564944f4c406c90a9292802411714922a2a73e89464f4da2d93e8944445393d6b2fd399213a73f1917d7306c4891d56c8e9d5264322964e9fcad5436b1bd3fe7af0eaada66c9b105358abed944293df5748ded6f23109fbd4ab820bed5ac22b5d702e1dbde0b8c30003ee4c46f0482b317c9f7b013c11188ce5e2abc879e381a81f0ec4d127a1f89f42da85530a739cafbe1282fd97253794d64791f5306dd286f0e4cb9bd7c9f0b49b6984ce56cd449598ebd2dabfd8dd5df479226d37fb2e3efc9e6d8f137c7de8db5054d1cfa52fd6c9741d2cff126b176dc82c27aa910089bb56fe5673ddb59ce865bc8855de8890d4ecb5b2037224e49a947b2909e69f7b86d1bc7711cc98d5dd7751dd98d9ee7799ec71591b75d566888fed08818165463d68c1591f71b32e989724308bbeb3c29cccccccc2c85590a333333b314bede85741b247b1ed3ad1ed95e92556e5e94527a13c6cd175ce9cd939bd70d0c466745fd504a6959af920ef5649b5bb7757343fdcc897a61d1067945224b0f43badc7adf45a256abb80fa6bc1ff9525ed2a5a42698a55c6f5e4d451d3acbcc2fe7dfc0e889e36e60375ff4d8c3bf81d99b21cbf297ca52debcb8a59cf4e4c231414f942b95a027fa2294cf52894c21ef57fb6aac5691df4792262aa06571b58afe265318babc87a12569fd7d2449b3f77674f03b578a44a2f57a40764cd4688a084dcd6945a2528988a2e84be72aea270ce7d87297fa598ebb4a6ccb43963a6dc8cc2c302cf586e7ca75630fc7a81f98eaf252593e4720586ea4a588c8b15af57d2469328dbfb7976359ca3d29a22998d383ac56c59c1e6cb54ae6f4a2ac55394e4d24e9e14c355da6de38d7919da9382e53739ceb675d60f6be0ce520b27c1c3e6a26d31673a3928de25eceefa188119a72397de8e272aea25ef4c4b9944228e7729e23cc65fb3265d6d201e505e7f05fce55be4b8579b8899c8ccb512f8b12b24268f852515d700e5b978f211561aacbb9729f2310282f3887fb4b69c4a52c424f4ad0544b7995b470a9c4144259ae38b3f425d9bd1deb57abb1b85e862cfd65718944b7674cf44055276b2aa28d9a6cd879857c995d20ef576b9558445154242a2245a28fa8452293a7e485c68c20fc96902b28b492403133b06dc79b7a607d6011cb81c5139e011b6e22ad38b4b02a571936ec445aab8b0a160a0f260b2b86600b2d575819ee734a089c20c3fdc56e75e463c34ee4ca9dd66d7ea466a3a53071fab48e96eb9c92c51696b641dea65d4fc876a3ba3d59e97a412cad637bc4b5ac51dd6dd8268dffbe510d4bf5c8e8517c763c59c9b3905e1212ea1652e53eaa9d25bdb167dbb85a1955ae85ba89ecd6435e5b9210f98d2a1d2b102cbfd5f8bc4a2a81ba70e4914ad38eeac8922a50cb4b2d275b668d62960fb4a47a247c149f257dace34b17eb12284746e45bd6aaa6352d0cc9cef2c787a4b1672c6520b771dba81856ae756c6f0f6bdbcd541a376ac73a270ea9ba583ecbcc614b8e2a144958762b81bc32f43c123971f8e1266e14fc2ca902751f4bb16ee3d6a3ea8d6a674915c8fb587decd5e9b036ad361b9465fb62cb7a73c96c9f7e80dc7e5be4c86e14c34a3faa9ba5dba8b60d4be2a8521b92e28845245de1eae8348d9e8648b6b4d79838fd8602a3fabd65c0b405dbdd55989283362c0edbb489330392de9b71342a05f236ad69dd449d842ae92e064a487b407940f2451ea5e6164272155950931794c1055d41952004210841a8c23c671a4cda4e2969b4984e96a2839a141d58a16c2be1acb9416616fcbe2381bc366d58f0f408245d423ed1c9c8ba3dfcca5b9170ef88340a7c578b4ce1e2bcb6125896e3bce60efd6769399ea51e613bb654a02ecbf136b456e9340afcf78d9f939999524a5becde388ee3baae87f4d0f33ed11bfb21c820084e96cab6974011c3ebb4aa8656a3c077f7b66d3d2c0f398eeb7ffdeaf9de64ec71a21b7bbef2a7677e3d5fc939203758137a029df87a6810c81f7a1ab2e1150bf66cb30ab935198d3d61184ebb954a1b0b4b4b4bd38f5b4a956dd8c2a5209c17ceab05070d1c990dcddad06cd8b021a22996830fc31c540a240e781cd8dc9916b4dffe8d43662c2d715e6c90df10794b419db8b1945a5e2d758e9485a57b521a05b2bbbb7bab5dc5de299bf4747b66ef948122cb38e42bcf53c86f14bfca966d382d7f2d35b4586a68b1b0d0b2357a634b0dad2695e5cfd675da0f66ab90f4618e9938ea2e4e0c67c8824058407e80c4800ce5b0727e726239433a2c9d1f9d98ce108e90052f4e0d880f90202042406a393e3941394239351d1f9d201d211d1a8e0c677671681687c88217480b880b08101810199019101a10a29c568e2b27079623cb99e5d07288745a3a2e1d1d988e4c872496eaa46310bce2aa0dd10fc80bced5e7327172cc685cadd2e1e089541a1d44ad22f2259a380e5547cf7318721db356e1f0241cc0c485541df6ab2e68c12b7686193588428332c8089ac11862f080ca0ed290e5000753a4dcc0066854a01f61d49b6301022f58d005175b68b102159c20054e50208318800183c11750805cd08257ec0c336a108506659011348331c40837919f54059c5f50598e0508bc6041175c6ca1c50a547082143841810c6200060c065f400172410b5e2127f24f85e15880c00b1674c1c5165aac4005274881131484dd984302302da603b8ea7d142c40107a2233a9e2d903558973072a8e33076a04cead8a80f306ea12e72bea0f670d54089c97d4057c02d500672b6a03ce55d4049c33508338b32abd92ea8027a9489c8afac491d49210b7403df2292a14af407db914b58953a03af128aa8f8fc48012a8e6bc2a55a01e7ea402f9f0960a64c415508178fc56a0f20fa84045fe441250381181022c2001302623cec2e34d54a09823a002f538042ad0e90da840a8cb54209b3b805e891c485429484b4b201e8ea30097c00e446a78e8c1870218c08812061d78007153e407018478f1f143103b1cc00607488e4e0c32cc40430d29551000ecf0d87043000420c4ae0680434f0e43b87fd42e52e94da54054caa3521d2a0fc150b9acfcd328be11950d508f6814bf005548a3f83ed4378adf43e58148ed58a3f843f839f07b7800fc15df562155003500956f43e5a93b1500354855d554ad814f439da1ca5063a83afc1cc6e1dbf00f508360fe817df04b15a2d61c51bd164c9c7e11d57301e7f489a8de13eac1bc3086a85e10a97a310f0d4f563d2adecc33523da146b54c495769a166a3899ad6b52eea365aa8ad74959e751924df0ba3eff826a2604b2fca74a71f1f8aa2288aa228f230964d786290e3388ee3388e5ce989415ab1633f2f585010ecf5d3ac6eb5ab7ddaa75ddd6ad6108da85623a20dc5643321a1992cf6f3820505c15e3f94455bd4457da80f75d116650dd1886a3522da504c3613129ac9623f2f585010ecf5c32c6eb18b7dd8875ddc62d6108da85623a20d4d719c424771df9cf590cdd8ac479fd78923372aef7bf8898793575e9d1d74baf2064105e1ca6b3a99c6f2923dbaa43162114420e10403783471440d140eb0619692245420c1c0052c304505a4a040144c3cd0010eb436c0576880974c80ade00cb009d8a7042418411316411621e00fb8b0601078c102ee82b9e02d580bfee115b00af8049c0276c2286019700c180c86310cbe60284f5ec0402e6801bf62679851038e42032e830c0ee23078063c068bc13c602abc034e8375c032ce01e380a7b01446e3066c039b6ac41d508f1c8acaf223aae94d5499f3a83fce809ac49da84f1c895a3a11b5e54554988b95f498ca2b1a05b2865995742515e6496acba9a8a523a94f1c0335895fa0feb805aacca7a8a64b51594e817ae45154231e53e9aa0262c4ec9c22068ca360e71419d8c0f6ac85e60e83f17e1361ee30ecfd2e02f3300cde6f2b34c55f9c9ff00bde1738bba005ef77ad5515f8b684a69688e2fdcd3577161082b993802c98070138ce5e300bdedf7eb6174d7117ef6f4f68aa01ef6fb02d88a6207025dedf629b6cee3017ef6f3a983bbcc5fb5b1accc35abcbf51a1295ec1fbdb8ca65805ef6f55688a53f0fe26d42a1f6727ef6f57e8466bd5cbfb1b11dddaa05b8d63cd1d07bccf6560ee20f13e5705f3b009ce3eef732d9ae212bccf31a12926c1fb9c8bf3a1291ec1fb9c139ae226ef733fdc8ba6388bf7b92734c521789f83b5cae67d2e68eeb0eb7d8e8cb9c358bccf95c13c0c789f8b425347bccfc568aa88f73934688a88f73959ab6adee7665c159a52c0fb9c50ab78bccf0d7157385aab8c789f239a3ba3f7392a7055e0daa0a91a4d15d1143379bf63752d9a620fbcdf31a129eec0fb9dabf3a129e6c0fb9d139ae2d6fbdd4ff79a3bbc81f7bb16cc1dd6c0fb9d0b988797bcdf3da129b6e2fd0e46534cbcdf8541535cc5fb5d17a32966bddfa141534a64adda61465349a8106a156a68ee606007c9fbdd1298c702ef2968940ddaef6a5d114d89ac56c5b4688a3271b5aac7fb340ae4130f99c71ea01b4a59de63cf91f748005ec1f0c4b7b1278912e9422818d5834d1c0f8c89e3c58073bc30e8c90bf22e50bd58a33c995781eacd1a25444ffd25aa67852ea07ab489d34f40f510503d28704e1f47f5d8a0278f889ebc0354afd6a8cf00f56b71b185162ba85f172aa8df8b9ebe27f573523f285e3e19fd84a8dfac517d0720513f224c9c22708e157a1aa2a72b4445ea576b14c8026d5c5830e088222a4844056b2a0856f0c5a3825b05838c18555006eaa0ab20152605a8a050a3c0217a02aff850411a075a3d6c40034baca882873a72b1eac8a78e7648524754a090d4111913a77faaa31e75446b541f0341b66f81326c7f8a3ae9498a3ae9890223346c8f66b663846c9f0ed93e5fb1cd834a3a53a930e71dd496731ab574d6417de22cab499c73507f9c715065ce53aae98c466539dfa01e39dba01a718e529988d511eb8c3aca80197554450dea68090dea88491975e422a38e7c82eac8491875f433461d3d11a38e60df8a6750810e709612aba4f31915e66c466d39d7a096ce51ea13671ad424ce65d41f6732aacc39a89ace33a82ce731ea91b318d588335035800c2a288b410575004605d38055900a0c2a38fba28255a05450e84905875e50c12b2ea820510b2ad8c6ab82356fc5617822cba092ce31a83067306acb19564b6718d427ce5fd424ce50ea8ff3932a737e41359d5d5059ce2da847ceaf6ac47905f50167155405785141170b2a18822e2a980517156cb245057db4a8a0939f0afe9ca082b0145430c84905a3a0a082b16ec5405e54d2990515e6dc456d3973514be72dea13672d6a12e79ffae3bc822a735641359d535059ce4eea91330aaa116711d4204c503f219ffa11a104f52b0209ea676504f51b6a52bf2b59d48f2804f56be303f5abb92ac8c2a2824b4050c116b7e21380229ba092ce3e15e65c82da7226412d9d47509f3837a9499c45507f9cb3a832e71054d3d95559ce58d42367105423ce56d4cb4ceaf7e381fa69d181fa6dc1397de640fdba68d5efb581fa3db9a27e300dd42f6849fda2d02fd6a83e57513f2a19a8df6c5bf1079854d2d90315e6dc81da72e6402d9d5bf589f3066a12e72bea8fb306aacc7949359dada82ce72aea917306aa1167561dafa426e0492a024e455dc09154091c0375895fa0fab8056a043e456dc02b507fb8141502a74055e251d4cfa751fd98daab09dcfc8aaf60f8e82301953f523d271428e612a8403d1e810a743a042a10ea4f54a0973b518178781315a887df0a54e40fa8400538131548883b20e64bf478034e5722899723b1c319c0c38fe8e10bf0e10a28c08da84bbc1f5a43df0a0918f122c427603c0cb5655ac17022aa14a4154ba01d8e802a0569c712c887ffa82e387e53a1e4f815df0a86d28a39a2b54a87f7bd57abcaf73d58ab7678df0b6a150fef1edef768adf2a1d5aa1f5a05c4fb9fac5545deff68ad0ae24d80f7c157ab0af03e286b9591f7415aab0cd06a9510ad3ac0fb2359ab86789b4e3a41a66cceee149ab44974678d5b2ef6e117c338e8b26cc64234a25aeb52970f7dd120199d09511ad1a5b56eb5ebb64fbf885cef1574bd577780da09513b03d4ce48e50a503902542e88ca15a91b10759bfd5037980f75eb8187da438deaef505b87ea11810d79e5d083c3006a2b6aa9902a805900643704d900e379edf800c0d552d5524435d02034c34c06590c3dcb7901f1c171b5bac340843af9e861132446a7e6c4a396b567a40a5a970ae5f50f71e0c08143bc102ade14964aa5add68ffbc7d787df5f5f92f424de2395a6675fc4971ef6d853622bb6f8908aa4dad9326c9154390b5379134d95264705da51aa9b75a993d670a3b6bed58ee3a847c443918465713c9491d95197c4fc8aaf624a28e378d2691e82630f4d29c3782194a6b295110f96267a9221d5b62e15cacc4b5d0245c7ccc35269e6e3753c1c8d3d3a4a19c899eba86c4bdf68a6243b51a602c53c47fdc4118fc3e5a60ad4fa2aa634354afc8dba04ca782bbc2f7ce10bab1bf77c688ac5094d913f14a6f2c411ff52bf46892d75720ea9d2b19a582c9625592c96fd582c961dcff2301c7b58584ea50e3d890f5b1c4592f8707a1fa97e3664b1a46b90f4f7bb6ca9f7c4837968f478328ed1d3ac0a150fe685e13da1a7162f96de6be28441de9ebd42b186a32a56b17a0f3951acddc34e143f90d4337aea576e4e1c71642bd676d9dbb72f4764fbdfed59bb3e1d664d474476f2e86092b0922d89caa34a48148b208b2f366b30a6fd50211e2301be550d654a0a6d3a6e6b52d8231c81df46ba18f0c1912e9253470a51df41a36346268747ba4960409d7cf4b0a9e1517ea4f086c457c2bc75209c3537fcb17d4a29fd3fce455e4fc662d9b3f0270322cbd2874c7be33a7aa24afaf4203a3a45384bc52d8c19c5a2fb484a245fa3e82495ace88cbcdb8f4ac8b79f27dc1686a5e7becd6f9234b5f2c28b9ea86aae387afa01f29aba735db39c8fdd8ac82bcef00113046d32b412b838992752807532242022f242d6d0ebf342d04a44421766ab243e5af30617d4085a4d24313d10416d85240910a21acb4fe2d1c4f0085b608d239318b848379081ac1492c00b174904042196521522c85a7a44c10933974a842b5e2f3e84308356ab72ec408b56dd6003f65ac524218d80ca6c35690d48928c3c3084da0a8a0c0f5d13dc6d12310a4ef85941e14ad3c8e709b356b94c81044133661aa10d1ac8b82044010b59c727e080175a57f881cf448206ac209b372c89ad3c9127c8739b387c9daf670f5cf3f33571e8bb6e3f4f20378f4a0dcc105ad1af3443d2333658394df05975094546073e772eeda8c5093f2b244972866003d6aa9fa4c4c267d5e56c55121d0f70c112c5d9aa3905272061d6aa7e8bb3553a69642168c5248f25b055128fb69ab486fb6279b60a89157d19232f7de10b5ff8c26a2bbb4c524592edfded9506ade18ae02864f09bde0c4516b7cb48647be3ecb441152cdb1fcd4656a82a66a83f7a4253d3061920b2a328b647af986d9608ec1dc96cffd8a00a19d83baa62fb8e60b6b95f3405636f8761fb23fd8079aad0d4f8ad5484b9c36284c9334507ee884ee05405a0c0a9d11438154a4181f7bb2d702a8af73b2f706a02ef7b5570eac8fbde159c82e27daf039c92c0fb1e08381581f7bd2c380581f73d1270ea89f7bd1370ca89f73d1570aa89f7bd2d3875dff7bce0d403def75cc02997f7bd2f38f5f2be17034eb5bcef8dc15e19ec99c13c7c269650e20d40e2491ca1802fa008229e80218e00218cdc000528f2c381e8e13ef0a0c3909e015801dcc00300550d33c490837383f261c3a3eed0218323e6b355dc611e52f19216f89d35267e99b5c42fb794f8651712bfec73c42fff28e0975f45fc328c885f0e1ae2976342fcb2ccc82fcf08f0cb42433ffc32ad875f26aa11f9a5ac1c7e690b875fea5afd521f21bff42700bff465c32f85edfcd2a020bf3496faa5b29990ce2f1da2fdf8a544b5d36fb37afc76cbe5f333f3dbb01cbf1d64faedd88ddf9671bf3df344b0d49163053e0f0303918153527c3ec5290a7c7e8753517c3e009c9ac0e7579c3af2f91c3805c5e777e094043eff03a722f07902700a029f1782534f7c9e084e39f1790570aa89cf23c1a9fbf92538f580cf5f4eb97c1e029c7af9fc114eb57c5e0ae6a19f2c2c2c2c2cdbb6bd548f1c89e2b32c8f82b4536c64ed16cc8632ae3173fa601da3304ffd7ed17e4253e0dc11df1f03b56b8da2efaa47a5875a4f36718ae8896e2c4b3756d7beafe432c8cf632e6fbeb879dd7c31e76360495889d72d2bf841d00e9c58d1c67c074c6c0d764e49a34a0ee49c9206131bdaed2d9f3597f4b355d44fb755ef22e76d5b1905b5e2573621fe06b537be8d3c88bff1ea71dc8d1be738ef73f441fc8d0ba1541c7d1f7ddcf551b31d278adf686afc578e230fa38be310f0df3bd40f4d79817a7d755aa1a79190f7ee5f054b171fdaef9bf87dbb108af28279c27ff4c608c44b79a9e50e535e7ae3bb71a3e46efcdeb8f1bd3c2cc326c473df1c634a1eb86fa5109ac30302c97da54c78efdd6d19575e1db673406ce7ba7fdcbf12ace23824e6c6c31108b12b95b87b315dedca1bc5f6718f39d895ba8ebbc73dc61b7195b361e54e1445f136d421b437c4cfab1be92f75bc4b0dff91e7caf2904570ebadf41bc576a3d89c68c24379c13cf72d6f09ff7d65587e5c77b1bc3c7d104b9417e5e5ad94f1ce3decee1e1048f1dc4767214ba5370ed9de84585eee462044bbdd91d058b7adbc1350321a8dce8d3d23707eddb580dd2e06ec76ce6eef80e0ec762194b373d421b45d49a24ac66eb9d2426da587fa8a9df4fbfd4412e420123cbde781f57a6f4f89f54a9417ed31ad42515151515151515151515151515151515151515151515151515151515151515151515191a723b6d0893c8b0bb885df27d7429df77da391f7d3f4e5f7f07bbfe7fbb63ec2fdfc34eac8f6db557a88a77f5b0d294820d8d942dfbbdad9ede1886d7f950bab783ff4c7d2cd8e2ab885dc27b475d4869dc37595ed08e4be12c8f3bcf9d10f90f783d9c9434973a1175e547c03ab15494f0ff7397217d2e7532c684ff7908ab4bb790ac975764242434394e87a2fefd5ec05792f2f8c9e4d0b7a5d9648a0f4917c073def5d1a1921013f2ae7aacbeb83c87e07dff75e34d5d38bd2bd3c98a5f768ad673455a5675c206b4f5e3a3e27d75becbd2c7dd8359dbc91ee14d6e39f8e824294a6e837d3b49bd8f31351afae674379c139e7987ae00708b971ede68bcd2b79a0e7953a8f1c752de40824df5247e437baf9a254fa68f49683f56e16dc7ef38479c86f1bf9efa61a79f3c5cdebe68b0d1c7bb6cd454fdd849e7af3a982ab0d9ada3adb2c2c2ca4b731a784c91f696a587ef839f9e21a6d7b8d5683da266ad5dc616bb24d9b3b935ba3444faa97b4e1c77a4d367c589a487aba09e3dec06ebef8c49bd7cd1737b0ee66c88637af9b2fbcb1873fb10ae40dccbb816d24875f3499c988643359ccead83945f6011bb6188ece7c1616cf2bef88f282548108adc7c232edb89de9267e34c5f6bbe2c9d1b73a8e2de7968325d259581eb2bc85858791656179f7af87fa0a4905922b91b835c8915eacdf8812a15e5608edb7e7a1bc7328211ba27e686af24ccbddd8c3218b1b154814d75b2903897ad9260abb83f1e4a21cfcd83e1b39a8c2b6176cbb1a07b596952b424c999f744d361329c68036a5e416bd75530142141ca0e05d93293858b271dbf6644a17c8275ad8a6b041e553629dd77551b62752d27832a5458a85b3e69ec89e9887cccc94d2668ee38de3388e378ee3388e7b7a09d9bd4daef3622adb7047c87922698482b160a3e0ced61b79f0ec3f3f037906c8cd4437691cc759dac68c8cc747447dcd8528cfa3a4024ac942d4bc7c5952315754d4d77c2b658cd4d7bc9635b34675f73e333f94798e3970a77918863d03e3a2a73906b1835daa69280c39718e43688690fc30aeba630765b9c0b456b76636c7976ceeccbca3a7ee6c67ca39711ef31df54ef1639df086666eaa47d8c6fc75ae68ea8d79cd8c5a21899888d09434cfb9929589a69421a2e6f546783ca7440285e6a692e63352731ee7e1c2a6c3b49ae62e65148ed59435af46753795d7443ec764e25192654953de8fe2a8b162bbd3239035425d33aba942533b5e03e32a134e8c34df519da027265e64b6ab8935a1a8ee3425b715935633a3a991edeee9c7762fdb5d02ad2a79706d505429965c8bf1862c6d153be10d71dc9907247721cdbd70445690ffd8c85f4b242f2b8ba4ed6ea3948673fcd87d846d9d0f92ab71455c1b5ccde3485cad63bdf40847eba3deff1cd9ece520125925b429ff852491a77d6d6c37fa159194454f1dd76a5e64499c36145fe78a2e81e488605a73876d57336329645711f492d1145b8e68bc325a19abd86ea462bbbee38bc757abe8122eaad1536780bc33b29a19118e6b64c7fda0a78e22817c393d02d7bd6636e620daf1459303c785d02197d397781f9ac9f4d9261e3da8d0d4ccac553530aefa5998263333a138f6cccc70a3d71c1e9c8f5faec1b84e15c62787f419f34953ca70dfecf8adfc676d624a19aee458f81919f726ebfd4f48f251ef6d8f170fb1cbc5068ed2a5bc6ca586836a5e546c38e8a5ac794dd9a9550f5938a64e3bbe605a33962b9b455e8ec82434776cdedd1d7687c9eed8f1d91d9f53c544a3baefe072ccb8bc3b8ccfdcc1f1ee4c6ce5a4d1499b34513c47f405b24528c451698e5a3a57415b33ab99d5cc6a66f4386aea2e75fb4c8d395743cb2e1cbf1f39c3ae9a178ef27e2ee5257d7ca6bc26aebc3baa70e77108b5acc644712782e5fe52de4f0996eb352c771f651359ee64797794aa484fdc53959c38dc69edd9c4e16a5686aed85476f58e1d2693f85b339ba92e15471d83264ed7a30e375fd01a13727dc5ca501bdd865039be780a69aa6c6764ffec0c159a32bd9bb6c710d1729f16a64543a382695154779a87d40b24cd8c8ca644d18eec7d5a55dfa1743ed37d4668ee901c8baddccf95a618919c385c72148e311a94c6d0980ba1748b618ee9c68fa11cc73195968c0647a1a78e63f4d455e12af4f4a229d1745365dba3b245d5fb1fdb9da61ed974ea65a997651c5f976547bdad8665218e425544b80d920dbe62bbcf96f2b215db7d46f6622f07895d204fb69ba1a8ee1d498b48133d757fa1a7ee243d75bf930be48c8c4baef6f134e5ed9aa539f3286b6aea5fd67a1e21c8a3ac9964113d752c7aeac8dac4e91ece40c2e8a99342e6f81c6d6ceaf8da7103db719b7a95589bd32d90a4dac6658caf96e57aece8b1e342daa6b4a324c7174dd9bc3b599b3bf4ddc9221656abfe4ec7492d4c1e7e17537b49fd7ef60566e3c2a0a91e73c7c73b8e2855d6cea839e73ac3658841878647f1d91a605a8dea64ce90a1ead4a0733e0d3a349432903a34e8d0e89456e68469b5aa693497d1a96d659e62a8527c5686b285e689e63975490fe5c8505ba8862ac5676928bb0a0db5ab4c1c9acf40f356438618745aa85134cfa93db3a9d39e616ff4a833547cd499d9c4e15eebe95c7fdca6b2fdcda3f82c0ca8efc079149f05728e28bca9a8d3da590f0824ea7c1cd4c371ecc12965205138285449f339236bd569a268ded1dce5a83a334f3054293e7b539ae689e6a7bae433069a5b9184b53afda69a8054293e8b53becc13cdc30da7be4c1c9affa039cbcca179c8dd54a01f860ad4fa563feaa5a951343f551a72e2d03c4728723c6a5201cb1d86c9d803e3a2a74e06a6c5a2cdcbdabc47bd4a6c8fcfb1a7c77f252b8e8dd4bf4402858fe4afa58f9a919ad7d712497d4da964c52527e6a05a20ff4a7e46c6f23bbe6684e8a99b99d153951a79c757ad32dc6b5efe55862b6582a8ff85285ff3bf7e56d6ca3b2e84863bce7547e52092eb4502bba4dd7cd89c562596ab4ef4ccfa28515e708ecdb77a7d0c599b0be91e758e3d364268cb615a34b5bd3b0c1318174c139adaf1ee353c2dd3dce55cdd5167a8d013cd8ecaed383d8f7447dde88986e636684117770a9b0532c76dc26db3a922f7f1093d756318a508daf1454fdd855098d6f88269e520da19193d75a75820cf6d1b7705b2f426433d5cd9b5e8a91b5fb60d522604924ff3d9faaae6223dd190b556d51dbfa48d898999317d84b5aae6ddc7174df118d42a1eef4cf6d52a0e6a5477724779c920db9dd6bc6c1796f5e751eb4c95192a33b3f0a505474d771e7546a851ddcb6aa21f70a97fe5ae0f227ba3d8ecc6edf88e1d0f29a594dbc26da3df712194ca706d5c25e0d8c39d236a15d7bee6882ed7ba532b90e188430249cad19d7c383ee11959abd8c5aeee3e2bdecf92a4935408b9edc321522490a4d32390aa1959a3e812db3d9ca15205b2748f7ce1222a905c1786a370048a9f48e24a9a0a5e47bd0d84997a5958b6bb4cbd5f8e7a3f1c33b2fb981bf58230f58e645c1697edee52efd702d3b2dd59ea7d29d52bdaf0a47ac5b16bdc84aae6aa135db67b58bf0ade9a9925891f4dc930b7854d3dee94bb0ca5fc99ee3323a8d9ee33dd752ca1aa9ad8cc08846c3723b39dbd33339aed66886c375364bb1921db9d3237be68ea6e309aba5f8ca6ae383ea1a917db7d0cb2770ce386bd2ff6ce74224d753f11759c12531256c2207bc009218f3db1180cf6f3f384e49e90f487fed068b05a8d7b127ed3ce3187d90585343563738c7c2a0592f60c89b00464bb84e80f8d61b52e0189289c3577147225774411449c798893c21e5e6784594a925081040317b0c014159082025130f100922b58034b26c05654c11930814f18416dd4f8dd629ec252180dbe01db800117427bd42550461f8306003ba78c0103cbfff8207fc43c0c3b5fe493fc9728ce3fbf867f6ad5cdf93a34c52d88c0f9415a05c3f942e6ce12e7dbb9b380f357cc9380f371a0290440a001e717699501ce1f82a69438bf089ac271fe11ad0ae27c26f84ef025d0aa1fce9f62ee7017e75b807f01e691c0f948680a864de7039ccf2e9a92399f9bf0d9a7553ecee71f9abae773177c7eb5eae57c86cd1d56c1f90cc6dce1149ccf31601e76722e9dcf413475e47c8e42534f9ccfb15609713ecb682a89f3990a4d41712e723e0bf1d90a9f875a559ecf343eafc16728f0990d3e13f1b90d3ed75a65733e65f1e9129a62399fb65ac5e37ceae2d3267cead32a23cea73f738743703ed5824fb7601ec6e27cda054d31e07cfaa2a923cea74f68aa88f329ac5505389f06f169143e8db5ca87f3a98c4fa9f0e9ac553d9c4f85e60eb7cea744e0d322300f6be07c6a854f8768ea01e7d32b7c4a6b150fe753223e6d834f6baddae1fc66d19492f37b094d2539eafc76cd1d24e77708e60e15e77716cc8381f3bb094d59e0fcf6a1a929ce6f273425c5f9fdd3aad39902e7f79398f33b88a6c4f33b4aac553dcea75120890849e04644f7063722b818800183c1174fa290d113959beacd5a1001189658830dda80eab5e129513f1cf50ba27ead467daeafc90ff5f3f999385a68e1838a0a52e0a4543f2bf41ba2df9524ea4704b2c02565055ba00b0c019805d804f4019d8c000c924d1c1d50a1a7990738b0010d2cb1c287a52409154830608129a4a0c028521dd4071c0b1078c1822eb8d8428b15a8e0042970820219c4000c180cbe800214a8dea8f40a56ad93410a9142330200000000a315003030140e0945c3a128ce3259f70114800e80c668704694263992a428a49441061000060800c0000041103600a0f4d01e59f979184a7b628dd05d4f08a2ebfe4cea674702fe20de00abc5da6f53da69e8916716621fbe4875582dd4d016c104534f08104e1e279697ec63db490c73a917ca8382a157798b058c62302cb6a7feeb6f8f422ff8826be33be5882705ddc09521e86714c19b0a7a2869c02276dfce1193c69b7b27f2fe2c8c920a2209e9fc87aa9a63a5c5447495b7df2b9c85a5b2f4c9c8b6e90f56f9a85f1b3b913df0682aa9f3b64fb8e3410ec6690d4fe0adc2d6749858a53feaa57675b1eb0fbca3abd96053639c011ec14ce2e9e8eacf7a79b752c25df53d3a9552c928c06d740672ed255d45b6a2402c5d62d1506569963360ba66d928cf7b68573402e86b62a38f5415ef83872fa01fc2666632003a1492493399f49229895782d0f8500bf156fc74c273b64cdae35b495085e830ed01c277dd3fbdb98e1f97738973059b5223b57ac56054938276fb53e6567753bf63f26fcb7898293700cc5f70dac2b97b0be7d2d947399364236d67ac16eef99d425f110c23bbc5524c3dcfa7ea5bbe53c43bd49dd2c61e3df5b1d077fe071563ffb3435dfa0a8461f21a8763ac6874dc15f1ba697fd602d9b1e512a90bd02c94c1b2570f24bd03a58bb0ee8b464eebde5a140773d6634ab9ffe56af9650bfdda1451b54c7426806ed4ac0e8c5f95320b958b2ce6ecf06a64c026ed95c1422f027e36276429424e647686a355e3c12644e4d9711591150a9021d367e77ead71edbe9f0440201ccb93993d4e57c4f26cea2a8fab6d4c312e79b8e550996f521861101589a3585a86412c29c907539557ee6204508ead9e58640ee66a5112db290a268b03c46a1cc6051268c6627222f90adb60babd15006daa51248c441f9445b5d141ce1d098589530beca58938882941d15f9b60cbb41a33d69bd765138829e298a6efa372ae3af1891e146313fd7a9a83be82c2855a473ed21cb589a588d4f4dedf47cc2b5de51851e0e36ed1f95b7395b69c0b3d6773585c16a763be287f3691485a13ff59594aa840f10d1c530f2fa5ae34ab9c7b81c82a05e05ad32d02f433147fc182c4587e6eda5321997b38ab19b57752d15acbd52ad540b99a6a4a9209101c8137063ebfc99c3b8138778b41cfeb891c0c530643440514fa9167ec9f75e9ce415b1d35d6ba698afdececa58e912d7e97538d3a1713ad7e78ea0d1da0e19bc712530e0ecd207bf83fa0f0c2225a0336d155800aee6cd4fb05ca63c45c518cd2a7d93db9ddfda686b0cb96f0195324a50179cb345b99071adf3fd343960a8bef1d435c3d27c8fd7a001a195fc8f037805880cd2e5107262a94a875e180fe20e83aff74a0780ef8a703c45b8ad2fe7710114a091075ff3b8c38a51d562407fdd701222971b812b35f2686d83415bbd0a263b801176c6f47dfbf0bf82fe921821087f7a2b4c38b089ff90b156578d10d6dbec1c0d6e791d61620a08856e01c2fd07b05ad683d79619ce5bbf32b7dcde83a1c7212c18811276225793ceb410b0ca034c28bb54168cfb860805a8b0d58d74b08d74873ed62e668742d1a8131b3a4793107b9fbe90bd1c24e1455e74d8e79fd75acc3b0bb3454d42456500c58411fd82ae8c7c8d3f828b82dced534425241fef47d8b917eaebea0571962621e8609de09931c94a4160d2d34da3d3e8de549cacc6b4435790f7350845df1f867941c8fc38b3ad428f4f5b6a20d8a62fcc00fd4715a2d70051814ca09f909761bdd2b602e0aad55958655ec14a10c1b4c9ebed7211ae67c623229286094b178588609beeee7374134aaabe8453fec55119492cbfae70c35bdf1e95a6d978edca5074b32001f2c826d244e0d5c2616943e38953a8352d4ada0b1d9bd4deb58f3a115a3a42a0daaa8a842dcb4611c6f0e8cb074176aaa5cf698fbd8e46924051f1a70214fa7a2598cedfca58475e043142076b09ac55be6b2cf8ef5d26491991fd62459e82e91bcdd3b0652e66d4ba0d112b30e0a40a35c584beb1ccf040f91978b6284f31056e90586c0f6344a7c44d29c27e20690bd0184c8f6bebfd35217d21e3dbaf48a787ba678303ff82b014f4cfe681472e6cf14492508abee13f2bd828f13d06432d6b7d40b325dc2e0fe1caf424c419e2123d5467f26c163c9c7f506fd15ad0a5df8acdfa032d2b91202afd36716ac2bf0c860390dced6496ba82cb3d96d7b426058a832eddf8eadebaa27a72b74d1258ca82693305a48dad85ad4057cf0a563e5ea6422aef260093cdc13e758276bb759592f1a23356305e62e9598c455a16a50e314e6a1a14695cc4509a472a47561c224d3fa9412d41b3252626dd09f387ad9ab80db3c20d52781e63b025448d342c80decc96789435e46304797aa794f3322bd22057674a378428d426d31a7057848a71e08a9b252a18ca81d268b84270c1c0a2e8596c5d579c87f402fd071b374f990b728d216feb08d6668f215563726e20d749d3c1c2c9aac9557ce22bc9f8b893122bac6988a14454ae0a5b3234e9690509f6a45a8f6509561e39f28527b3fda3b4607dc77de50758db9aaf16f5e643e5d1466fa2999b442f93182c81b3d27d3794d0fff30a4c37ba520a65d187d091621660e6977d63d00208264afff6008d4a8141c49e431000826f96f3087ba54fb15f6a9775ceb8556a90c78f5eb50219ee5e8913c509992a88332e539389c3868bf385afcbdf08e6e41b9158fde80ea963c32401364cbd991c57c0ff6e088da4807519fffb90e6d0b9b987544419a2e02ee1c5c47d9f8b23a934779fc1a365b1a8864fff36231c9b503793cd023b3709074e390c01a2c1b7d51a54a20e25bb4d66cfb72c6631ccd2ea434a254ba6f9b92bae94630679fd02fde144e286b8f8a4362d1029d3e2fb80a073a369e6f4edb3d49731f69d406bf0e74a054911580d7cb450938da8be3016f938f40ac1acff20138e6a3847b1661892619439d792fa596596d8a868536a5e15464ef31dbe43d14a06de6ab4fef60444c7c84b7d0ba4d0e9533269b42ffe59718253d0e4fb0f0a0cdc97529c500f18502f32eb337c1df606a4801b6a8450ddceead9174432b8660ca80b8e230d566a8fe0ae6d9ea790dd0b67562ffae975d6828ad7d2581d88e136f630035bf30685b12e8a0026cf5942ab3104bd152582fd702e2f810a70705b6718f2fa755e5a593b3236f2c926ce6bc580471fc20e183a62d77025f13a88c5e8c2b87bcdde0c96900ab0db29403cba483295f5374fb4558b286bf5b4b6e9afb4d75d8d659fe2e34bcb6d06900000f92f079d87bc739181b9ee5bdaee1796ff41281feb5adc2bfb639f4321c4bacfdb6c017c6b121097f9927b3acbd24403a61e7603e06b494e060040695706d8307083bcd27a6c4c4c9ecb4097e485eea22ff57182cf1fbdc0d464eaf5ea204470a8451b21418733176d3352583962a4ec5520139408008e1d5c6d1e21a309efdebc37d147e07d24f31ea6794cc4917eda9fc4b084b272c0ec475a87e0bd1d35a975154640ece35e87f49491cbf62a46abbc9d9e4bb625075c801b916edff7421159a5dc4552bbd0d5ddd8bf9ec6b8c9e7f58b5d0ab3f78b28b01d748c85dbb5e9ffba1fd3c235e1783043ae577d6463b48f9a473b89ae3815c44850eedbd60734652fe8c002031d97eb1b4f6ced16bf1f39803c92ab9cd729e86fae3b1e64e1209fd33def8e40fa00c49141ca19f4df2af72889d1e008b79907ca44ef36d96a27fbdb61e0ae8df7733745602f0341a12bc5ed08b581199ec6b42cb086d0a1420676877f36cfafabc739bb8ebcd81530217360ea7b0914291976c1ccb2a655c8cea526306408ad86c664cf9c216cec0e2e9cc832dbb48126550912eec17dbabe10603b196275442db8a93e67ce9b068b82eaa1ea9b41e3f0d89e9c61781287c01f737227abd046605f052fe14561d12131bbef4378d447c695afa872c8b7e91314786f76466331b32cb8058b4d2536bcac6372699a54af96f55891db6dbd98b157ae02acbbcf13f3beef970e8de76a09dca64d771c86a5a35f4004a017199ca347411f9b807fa0cd449b38be75392aa10a8584994c40f2374fc7f8edbd5a521188fc39f2b06705851b3f8259133e023469f8054882b0221a6364f0a32c788038bfeafa5b60b800cfe52017f9eeea5cd2c0fb7b9be03f345e1b5cd805da071d2212c8d016a51aac2f9d488e60c0297282ee94c1bec64e9cc5998355b2e7bbd0080a8b20168e18355180b4b993ededbe2838c8005744629f61338f42e55bc62b2b76afc506d9d141dd5c11e28de96df07820fd71d9e7dd17344a6656eaf195d87b322c400b71f21b644ad9addca562646fd0eb81a844ff85b6c4866345084b97da123d0e635ff1f7da206c5240b0247147b4791580bfb7dea1a7d0503cf7785303cd5aab978f73b0dde8ca07c20252d0d932f34545fe6989098c35b8675d80f2a31bde1a78676c1575c9e6fdc06f813816716c4053a216313d14f21a0122355627edca002935b8f98109b773b9e44bdc47c0a9d351931f970680a50d4465314a74898dc7cee86a8abb485e36f46f6f8c00d9f1e9992d41c9667d876ae4f5a507f148c190c2da0a8dba2aa9f5efb714f4b930d6d26943d3636015e38ba69dc1b50720c227996b08e0aafc2fa74387e5e50eaf7f982aa52c29173476643631dddf7e6bf9d3882a87862b8aa7445be78713ca1d8e7f8c515c2b7a3b8dafe008a2c0e065d60b4858e0ae893792ba1b03e78d25fcd046cc7277472ab5a2153cb911c6400a5e1dbbadaf4692bf5e1883811be39f8c20a529bae67b53b4c3a9a0059809840fd43a4b7eadd6041a4355d8522558988c442fc8a67b72a6c5419a5f7a01ed7e0a37dd52fbdb6d44d4f26a90ff9251aa3d8fbdd99efb265544ef75e22c82e9c8d7a7e8fd221060243fdd989a5311994bd1fc475b0121b0543e9fe370573873d9593a299c1677456a634462986cab6094a88660d0b3f6f851262d2fe917c1fd48b32d86a452f9cf8fff0699809a5683f4be099bb84e080b100c1fb402067025827110f97588b0398b946090db799e198bc625f593e24a29f25387fb051514935b40ca5709fecf4f8b378040bfd80170c323402dc8c1a1627dbe18f66cb110a602578899bed47ce7113d265e27936b6ff988a679be48168cba4c731a56831b08a23ce05d2d8b3ca830ec855f90966f005573b014c5e78fdaa29371a405ef829fadecac8f467820b911eb000ffb9dafc6d1130bfbfdb87a68308eaee4362ea406662a3ab17c1d0349d1589b4554d0760faaf39b2493914097d34a5b4a2472f31852cf1b14dcc4062a3d312552d1d4805114015096b41ef4d680be8295999c489ded77f4e24aa9fc821c19cae872f1a2cef2682ef5f356c8a41d6227707e223c70a52a302d25e57e15aa2f9115ca2fa4afde266e152ad380afb43c305bb5318d7880b008c0926b3f4be08fff29fb497ae5692f0100060b2a68b4ca4c9088fcb38e6ade7b7a08b2990d4abb7c2b55c8c27e8505caae0b03bfc743313e7c2438805f7b2f8a80c9105eb4615e4940ae0d38c3e4b7547c3c035971e4d34adbfe8fb97473ed66fd46e156cbfd1146c4c6e226df4ce6ef0ced90fb008290de50c1044b0aad098d547c8136542263e64e624d2757bf648b083c0681d224e169ce5a4ee72681c34306d30b4ba7089b7dc925b7797b02c6b60050a37629039162f31f70b77dea20a827793d7ac423c42ea5a034692d1983e4a1c9c1b825e2cde4c2ec832afe1a0073d5882d60c50f5b73dc24803683815a816a852bfda6351c919ccd152ab685fd968e1c22eca9e11f71a99d1e35169101ef49bbe3ca60a7c046531d4c3fc342b9de532ca74729329a73049e75cba48033ded12bb004fcd07f56402b7cea2b782df4e20be026471ea9a31c2abf555eae6fdd3895731bcb0beb9956902906538cadbe3f25d94ad61c11499c08a9ecad3be864bb90fd4529ffead4722040473ce9c7942bbab0f49ca22f5a3e012203234b07a0c60f25a074dcf070a3b669036b8a2862d29cce24495ac7192725c7aa2625e0f0647a494960c5fe66055aa800526d91c9612259a40041d784cb6a87a5e3ccab2429fa8f01e12421366de575b3374a0d62c7a68494fe1795087948a965178ac89cde0aca2219035115893f7c17f150aa7b14c672c08749f918f12ec0b6a885f1c8104a1db8263165f79a66b3a41ee0a34529bc9eabf6a79b0615085460adffe4409550e40aa846a9dc5838bb145cc8b3e0373ae58fd1983860842cdab2a2818ca47ea5bdd8fe62c641221711c44638cbe84a7f1acdcacc5fdfa31b1d60551a99473df5d0f00c8c29580d326bca1cf872b84bb585caeda197b8aff86320a96c5ebec7042f260a6e27677afb05509b83b6f61058f0ff9b81b5e3b7027cfb8042c1b70b75adeb2712f2eebb9b1e2688231965d05032e40ef7d28ab97e4c2f4315890d27cefc236ea1ee48ea7c7f9c6b0fc7283871b0a16c0e3206720eee9cd9e735d7049bb1aeb208db1d8c1b4b34d64ba41ff8693915b496f9b0c27a63a24833af554bc9c1da244c0f047b179cc85a4fbb9092e7d014abcdbd86842161f0d46308d305d296a1d46de9d1552535c8ddff8df183beefd1cfbd1bd694c8d28acbab657bf52d246372a0c87b7a2bbb9cc02c4b84562ab9040d0f597fc2f556e7dc72155cc82c17996c57d3de12b06b05ec47e9da9ea3c10344956d8465030fc3d4e4232df8d6d64f4d99ea490562c84178c49b945c69c8e51c3859e32cbfc8ed9bcc6eb71e6b10db46a9324457229e5014df1af0e3bdc05a9c733703d1b6907c5b265ecadb7618c3415113b04c65534b15f434e1181eb2aaf62923b27429dc92766292e14e95e78691fe92e712ef341d71340f71e6cb192c85ea3371185271bf45ee57306cf0edbe2b83afc4baf235f2344b4e742088d9708b710d1b15c8c388c3427b10a2178a20bd413677c2a14e6dff51b54b804c52a24de5811633430ce7d292faaf6e47dccee29dba9677986ce58451a7d5fcce5872267625972128eec6e60186bfb69992164f2e5a91759109277b8c8e795d99537f463be852e2a9f19f59845b803a67fc16309adb3ddfb835a8cf2bfa1f6527dde6a7b33a42108459b255b6b1855a5ff057fe993d0d2028f9c2016b900bb0b52758a62a57dcb477f4faad8b26918895b33f49f9d776ea94d0952c360658835fc64d942d3f5887ea09906fa702e479548374dcffc780aacb31483234f2a482d4f870860b9ffdadd0e0a1a0c9d9250bce70339b7219a7247db1fee6eaccb853798cb4ab4f278697b2286473eb916b9dc3a4f880792346f307b605ba870a9d44385081d410625da6ba2f598c53388c54942ee2f0206a731aac2efbe65833e1fbdeaf7134e660b21f1d85c1ede0c1a93593fa4a9909146878c838f6902fe8d8ff43b16655f51200c0371678ae8e12b615a6f4aaa3b9f98a9fe4466b186b820d05b773aed7d9ee6f0b7f45d16e0e3f55ba7d88e3c52911fcf1a689f2c1ebe3f0bd5be33c9600c5dc8b67c234886d739e671ed8f71f0a6e0a37236230f45d993c4f88f8f631f964d11c5bfd3a7ed688bdaef416d13c71cbcd87c7f80ed357846cc7f1a7546d8a09e306598e87b15616a3cf13568c79e859884119c45f285e25ef7bc46485473894a2338fe26344510d5a5bba8f8982df81bebae09aa38cbf2b57783c7fc0608ab6988d437946e9c4ae8bf1790aaa82aee8b21f8351313df90045b809e34c0b48dc72499b0a3aec6ca8ea9d4594df7678975d80ccac5241569f01f7bc708f0321009ff9b93a0cdd511770ae088ed26e48bf3422fc753b6dca785bfe61d9de957dfbc1dc6a2c5346f5f943ca35a05e7db028ca3b58d979640b0f6489585243c432b803df2e23686ba91515adfc685f33b7622cc210e7e9d37b10cad945982668115901dfc06ab3a5570b3977579e5cf4c19825c3632ea9a0922ef74b5937a7cc04a27a50e659d0a658eb8e7167f7da9694066d15a5859acdfdf6463e7396d1dd05bbdece5d320ae2564ee5fd8b8dfca48bd2f15c28fbd4ba64b3cf781536ab325c6c52530b7611de849d9329ce54d45e437e07d817838c562eed1e70f3bc95bdcb7bd356abd6c394907d070c9aa52692f42d4b054d2775c6423b38f30e8c2c7cbebb1c608aa6f67fb1a8200e75e8aa11eef42f784f2a4a2664cf7c9248d311a440556f18cd236a271e1630f9fd8ec294bc7b19638119f8299d160dee84f62ea2fd6455641a25fd8114b18a19e6bc731c97f74b2324706916a86f205f5e98a32dec4fe9c50dbe7167af54f036865997a9f6680e64528e74037ea7dd6607a097711bfd333e1ee8d99f2faa8b7b91a9f2b8ce8b2d301a655e7ef377aefb2c4a496412169c4a8500d3b56995b39ae36dd200d79d7f77d7705ea0d1ea2e666a963729e5e928cc65cc75e67e6829415c442c0be965853477f23d9921bd0a7aaa2f6bb918025b7bb7d1d598c451062fa54cba611428b696967878e2e307d413848e5e6c8ad635031d0b1facd69b76407a704d3c9f6dad3c0f6b383393d9f05a630d81bdda9720f327df1f32430cfde3f542d5ae1f2a5088c3d6d0c065d48936921e30f56d357fab488c4d1b6ec9e9af2ed79928b1ef14cd40874f06b652a4d289dc2e5e9f46365e20f08bf2e57a04287cd1d8417b3ad2dd43510bf3ba881cb86c28f69af147741e91ad42aaf25ea536577e462758e89e58a23205f7f0f3dcf845e2863494f72f79aae0254a58553b82f3214e64718bfcbd5b731861a6496d0eb6285faf7d26cd3a4951fd503f950f6c3de37c5affed2c3e8e4b8b0681628e76f59754daa5cffd6a4fe7f35df71af3daa4cff79ffcb179a02202331657cfdfa3773720e2dd25ac7df72e96cffb546fd7d84307fb7928e00fefdb4907d42667dab7ffaeff4f9b66cf99cf8f8c935f87788f7273bf73d851bb081ed79592d2d5738c7833df6613d3f494b8a927a58e1cc8ddc214d3fcd428f4a9e070999cf1dd9819b2a7fa6a201f44e1e276b608e956904613c3c715788670ade36ab089f4c060fa57f477978e8dec2e0cef1be7d9aad1d4dc80e0ac59eb3747d0360fdfce460bb9ef1863aefd30547ba61a2eb827ef8eb20551d1ad2994c69792667277b1d5b98abb74338a6ea9fa742a4aa9d104915cfa60a5957096b4e1a2e5725ec37ac38ff2910b3fb2ccc0a1764dc7db14e6887ace3f1273c64d655e20ab2dffb8296af0c30ecbffe21db4ffb01bdbf1b56ae369a4b3fb54cc58971af93619363d1d80ac90dae02d89ec29baaf7d7e3f8d6efd09b86277c7ec7f182f71b9ef7926f42037c99c18e87e191f32f058eaeceb0a2d12774ff63ced2f79f96f595cd61221ed8c84d626138ca3f4f9e5659b44133bc86eac7e4b1eaadb3cc138e455b2ac80ffef178faed7726181ebe3bd566873ede79389e860ccf8462e548b269a18734d3b94a5dc68f8143d07f9ed729dc6e673df1a04844cf14b3038b3cb219748f13e30b4c8507a796743be78ca4582aa4e71dc05f2e709ee4f2109f235bed803c3f6b1b3da2f8129134a127482ec7e4359e87849f6c8e9f8c9137c921da812e913fb57d9e0bc7d32b296b7e6de593e648178b74c5cc30429e07df856c2bdb876879a5e36bdfee43b02db721d857f72c2cd6c58ceddd3d0bb6ed3204fb7219e2d5be1b81b5b833f8bdc7e03711e894d37099e5905ba91b315017eb002efa458cd49d3d030b7d21036a679de045f9dd88fb691cbd48775b1e7ccb6619804dbf9011b5b06660a1eec488dafb03815f2a1ed4185ad48b18a88b7d00376d0c0aa5606d15b624e0603114c28da307a277ae3b0143ae4004a29fd7dd9a447e4ced4a4a6aaf3351636ebbbcd15108a08880b6cd30110828525173000e79c09b17884e273a31902622c80ba8893c5de054424e29f89568c6a0eb57e62ab769c3a60ddbb66ddbb66ddb465b5b6d6cb4b1ddc6461bdb6ddab66dd3864d1bb6b5393252ce8c4e220e7183db134f720e7352ecde8a9d03857a0453c9005339158dc2a11ab9cd4604d0c62f274b42b251f375a3a1e28be83d5c64507a11c3bb22da990d0cfd15110e5188646e2322a97b08d35c87240745448e54083fa3bebcd20a01f38a907d164b1cbb95006e45d2baf476de669c0e3e269c919c56c71b5120c1d362c16fecff88ed665a929a3f32401146de72ddbe7c8caf68c9a49ae4a1a43622a6c04a69d9c7b550ea70cc54e5a3561bdb94602ac6e4d6380de3182eee872416ed03a10a4058823217733fe492cc790d7aac68b8b548d691a09e696f85910a44689c622e4e263047bcea5fb48e7b4e46e6f323e4df36b35ebe6adb59b9be562927be0044e178fd32d5228fe989adc53e88e29c3281f5ee31eed32ff4257828805412f5491ca3e891e1858755e10adf7d922c3983fbe4f5ab1886851e63402df3e90b854729d6b3662df839274f0f2504355daa01d163049658a37416586709f839a7a7444916b0660df839e7a74789acb0ca02c813e74f0da50665baaa395163039658446996b06409e829a7a7474996b06609f833e74f4589acb0c80ac813e74f05a50a3abaa83111c500f658444956b06405f8093a79b57ddaa7e51648f6bae69aeefa165d8e7cfec2a7dc7aad7711b0f2333ee2d0dc442addc294dc890bc5656ea8ab070d967aca61103766a3ffa95d52c865832337aa5b6ec43f9faab0bbd1240a444cbd182149b5d77ebd8348f9f84b63ccc49b68e91d5a6c5d984023bc4ca107bba2abd8a9658e350bb83780b2d60bffbfa00a4648181515636b0c14a3646895b184a864a398b15371d532bc9a011d7d46195e5368ddd751892f131ac6cace88f06e866219c7e8f198aeeb5c63ac2e06a7e7eb2f8591eb5f05463025fc0b9486592f2cd3c50a5c60d216b6d162972c108f85f55cb18c1518a8c29aa858660a8c4861fd28960305469ed0c2e6c46a714c13695d1c13fb0e8be47a899ced4aa8319fc4304840e588ce1b319d22e0424423861893109009a223408cff03e4f8d0911ec6e0019276e8880ee339401f0e2dc7b81ba6cb3738eaf90d46eacfd632f41407ab2828690bbb1b1149f7b2897087d84478000089faa8af271df5f21fffacaf8405f1e99ec0be1077d79102054729d0dc3152a0895590341f1e1a29b53fab7d1c196cf59efe90564b4bc9b4b1b593502c58fa63f387323f7fe8edb7b8e1a12ffb5572341e45c3dc9f3b7f651b539f845709e44eb42164376ec078bff67bfb6df9a8f50dafff610df823230c9ea2b14877ae68c3ee2493746f9b2328df26a892a4dcfd70088d6b55066610efa7343bd0a3d794d26f6708ea75a4cf3d7c1ffe2120e4cdb7a1d6067e1897f9ab6a70bf77fccdb8abef5f5ccd7d9363e7c4446f63c3bf3c93f8916db49295d2bb289ca1abbdfa52365e2bddde4841b189a9660a89079eedd4f8c25652b185fdf8597c4c6a5170ce83826c460bdf71e067090529404305027b0580b21e3203c55e3731593c27059e29de94492c87c802af3c9d8210c9589e173254fea0ff45a27d026f0596ca52f19574fd6b98aaada1d2bb777909d87d77f236024a4ea78140e92e8ff25292086e2aa2e4b59815ca0d234ea0bb11725e943e06a2debdc6b39e7c2e891bcc0ecb50ea88af21b1155384d6fbd32c8242143f96f02ca8c025933798c3258f78d7a0238e8927a23c4ffd623dbead0328aa496e60209c96e4004f9bbd62a644f524962b4c3f8c2c146cd4360983d960812184780243075c178a05a21a2fa306ac4200bf4e9f4fd4b9e9da1549af795ca76a646eadef8a0f67aa9bdb47141da24ce72375527401f727a7753b7d5ab6d765d111a8a27654f501da802e4d3a64b473129846d5fdb21d7757cb0fb01545f323259718b7360e8dbfe2f710c3d3788a103399d3c3b13f4a7fcca64d646fd5c64c98b5d19e9a515e0dd1818bd6fada374bd27fcbe222ebeaffe20d6d648e69e68dfa73d34054d090f66901040d6ecc8a22f5c96e55df670aadf519d89c003554fd0e81b693676119d6219b07388fee01e7c525df6ca9e9ae7651e6b0cd6af518d854b90ef7f26667ccbc2a519c1b53444c2acdd3d48c69a8a69f837bb4c7303133336fcb4cc7f411992c5fc5d458e21eae294b267273d420ad80211e2bbbe4811c902df10401e80403dc288790a22db073d2e194924b421712ee2d0411559380c249383cc39786292eed631d302068ceef15aa2e46719668f9b72922003f722d4f0735199f5d7dd24660ed7e55db7add9263142ce972795a4b9a5187e401738242229e17f6db823d3c1a89c693e6021c651c9456c6833008c59bad6e315007f8f8a9f5fb82db78dedbc50a3d044ce15530dc4662639c331fea70db560db13cea0746e11e7e11c054cda2d5aa1d6a9184d4d6e33577c045c75bd5964ae8379dc4e2de061d5e777067062cd01cb639af3cb22c24d286dd44083a22edc8cd9757ad200b428fa147d14bf1d0eb705fc38c5a3669641e798e1f14f51661d9add2ce5f76144dc5940672e4952666312e113301f746203e8da65ed1e163ed274216975a0429fd6bfc3d962ec92166183431443dcd0a9226755170110b4040d026d0e44e4320ce884370ef40bb27d41bc271a1f81d87587069108db43ebf51c71b26ed2f4ebcf50e2ce2fef41e7f65a0619b79fe3548f0f3dc0871f6702aaf18ac99157129057fc73aa2291a4b39152e4cc2cd776322ae879b1b818ee744609288a3a8b5727a56d3a14e426eb699442b4fe5cba17eaed5cb8bd0a6d8f7e239ad467b17840a9468034b4224d0a39171710b4e8746b67081bfdac2021718456fd86194761beee04b4bf871b4a515e8dae50b7b260b0cbf6ea63e2b2f928df3bb5ce145152813d6e50020b48884170325174f4c8d8590695d2d04c8ed5919fb0e7740f3f397986556e15bff087279b3271a28ed71468d41af42b83a10ba4a21c3b6b748efd1f2c7fb675e61be10dbc7f04cd1c877f7e5ab2d3ce608d72744dd29752cb6458c8852272703760c8610e0786e6aeec62018b00e0abe95cf3c8a52aa74f1122d77e80b312c434ee4f4128fdd376f62ecf8134f3909e6621d31c0b18647e0f282b8d8f588bca7458880221101a4ecc599e5a3806de5d514825238c7e5518559339b8704bf9dccb11770b0daa24a75fc180c26e386a23d5b202439cc5fc3a6d498c332a2864a23c5329ee32893288dbcbc1032a78d9aedaaea50574a48892ff9e4638d7b240002f014e1bc738778019823b7d81283cee9ed3891da121c8f1ed895383ecb3397501ccddaa621e26b69e20f641691979a0b0aa6e038f3843998d6f772c48efa8d714e00a18e7a5a833f794281b6fb1ac341c264ff3bcf1a117a8b8a3bc2f6352b8bbba5010324490f2a28738f14da9fe28569cb20ea2c21a2fb631cd10996f6d5f513282252448a6891802944478a3a34a06630d4e72e634e72b91a7e1094b4322e87972af5d98e808e41c946df3fc3017f4a4d2ff3afd3c3d16a635f9d41d57ceded602e8535fa784d8867e04b83eda182661cb761efd7c5173431fd05bdb215c73a0d58bb5736986e46db3eb4b3cbc4d52acfe3663250bc2320bb90548c9fb74b6d985af9b8ec021515fd8c1fadfa2d7979474b6083892b0671c506a2e9b7212ddfcba19c73a8898e31f975af95ca007ead1dc654fe7875903cfcdc94def9eefe33ca095ed907255ad4314f9d67cec107ea8c9722070c65ebaf9c875b87a2a24797cb6008818248ed0d866433275986a90de14c20102645f2ff4a80ac238ee1fc5e7a72edb78ce1e6cf1d4c6c25677f7a57979f952bd818764ed02ebad11ae969d6d30601e8c98473814a3512043da340d748faca7299441cdb3ed8e1f969877da403e04ce6aea48fb1c9aaa5822952b69bf6849e9aee23f48787f3a55bf3ab83971f5d00c8e29115baaf0b859bf27781bd7a9abfcb288befd4df04cb295be8be30b396bc18721c2ecd61e6ea789ae42cc48b6ff792ff4376cbea6f991fe15902d8152341508ce6e904a2ffc48f0ef74c3b1772ead43c7ee3bbe36c284e5e233b9c22d44a823999ef8dc704cee7a8be649ada3b89b8066e7adb44afd64dc87a91227ba33a32d2786458a3465d319cf7bf51486ba4b375a42772b46e8f987531dd04d2f7704ee086a4808851969114843aec1899062bcc8b1e135a2e0b09ed3620f98570d03db354549618647e2eedd2892fd409d47ff78444b3403611287f5ce9a804872ae95057a5861a41f573c83370a80f05b08eddd44459224814f590220d3f13615da13969b487faf8fbbeac4d5c165dfa878054a321f3f6978eea2e7c16e43e20cd971b8a02a9aca088ee970e9c124e5db3f747dd866c23d963bc267d7a8ac344c76162c1890f5997245af9686470bf3bf447f128238246d4e5da7468be2d205d984507e9c85a097a4b1cb11a83e48fc3354208b5e905fd1cf476fb0a0933191b1b1a6ac0ad424f193f141a75449a0c26520714e98e96caa8141956073658efc811ca3f1901be4545f185478a6f53517cf211dbaf1f35be01e9f55d90427ec3b8937248aaa2446242b748ed01fdf9fad695d0b7fa683ed857e4bd85453fc43cdcde4dfce06917a76c5267d1f6d29cf808ba0fe0d48cf97a3e0b425bee8f0dafca98afe563b5e002a8a97d153bd320dc61fbaf9cc0e03ad37e96da219cda3a4ec42eaa1336a3fa030fef29762482d49277f8f86989c5a1384054bf23e5a16f02d05ed9840266ee8f921e9dbe32ddc01f216d106dec897db0c41e3eea8c4e5ea0cab0de76e88de40f4a1746abeb1e4148736d10634f9caa572bcdbf1314856ecc79b69c5f8994096c8c3bf62a0010929af66d4fffa7d47935c4e8307530dcdf64edb5e7e2774f75468c8e641601c2bee7ba86f728c967304e6fd496d15110102f1634c590bc45d4647af4d045634cdb9a6b2579e3722afc4b4459d61f67d986b647135b69f359385d10a19682424be3b571a10db32c39361c54fd59ea92bfb663dadf44db6055a5fa0ff9ec0434d8abad870cbba5026d851719a5064068a9d7866023ec8a04ffae3c8177bddbc4308f74ee642d031bbe330b02b5feb215166680a145c133ad8a4d3464fc7556dd03518c6745ee2e67f8cb481c876f358d68232a53523f7cf85b31e8760b2cd0f3c0f6445656aa9707da97965cae103f29367a86de8d0e616f4a43e26acf55491cdfcc1ce799d3fca8c7c03d8606c72e8cb36eda98ab7acccd62276d41d481a9428e676d3834215eff11edcdfe1fef7a238c50beed3e734d371459105f906ebd0dbac43acce95dfec65619886b8100bd4a77230688000f3b6a87d00bc1d86a5c657b24bf8311420195e5c3c6d42184531fc01f84b78d9d0bb628aeb5b73461ebd2c0782cba5f00e00feaadd1f89d294a23c8a49d13c157615d45370049c31add5852e221f5957e41dc91c9516a23ce353a81e06ae57841aa6db064f134d7a780d9e25ac3ca3cd9c3d5be6cede3ae7f82439552aec2773bdbd7dff71bf8c6c7666a03da5c612160bf9c05a6b866be15b4525898b3241478d0ce4b1722b9a6cb026b2e99b174445b83e3ef5a60c143741639078b4efb16aee58611cf969d08fa7049ed1c1470ccf054a2bfa31194a21a4097b4763f0801bffb66f3f850a6662a525be3eb5f42fc01cb0f0a4769ab3a8e4bfd56fdec590af6cdeae6fa2c27af5bbed545ed657d0564bee74b07c1868d51b82566393432365bf7c2c2fdf3a75e874dfe5b61577e10ce7a14eef44529f99aa4d9a7b5691d961a212c8eb1c62fe5d3734f47eb5f8423069d37081bd0e16d777d86ee0396c515cc8c4eb9cf6f4c10e5c817646cd6a6d9844b96694123a07147bd3a8cfc943aa14561730a3bf013e8d3c0e624dab18f43e6b3c25538f3dfe4a0296e90910a905dd65ad388555357f4b2d9289a3b95042486c214970a9c8aea86c3016e72fcf966f8a9d9435ae6dabb65111de2977f9f1f762768be464a18e78aaefebe21d471b105b01490f04e69e8073910ef5f2c7ff304dd2966637de462acf4392b7703c3313795d7d2f505b3fc255d52cf8df8bbd9a20e6e1df723e74da01f96fd0666489291ba244accf0a7a8ff9293a8af63f0f199e5f8c74ddf667aba50eb2c7a9992b89b080c1a2b7b0090f92003903ddebd56d41a49ab29b0a7e734ca1bc8624590c9561264d2cc211ed5b8597cc5fefbdc86961dbf974c42bf08e1389abdd995c882be96d9311bad2a4c328bde2946f8f461a98882eade45b3791b42ed8894fd73720c5d74ff2e31057d2db36366ba322049cc032862cb0e45abf8e31237876e45307616598f0262f455a08fe834473aadb3b5720e6e34bbcf17637cadf5c4c61724e738d4d388d2d3be64b85a931b8bb0c6965e5f9fad2f37b9bde9ce1bbd02d8aa36ed0cb54ecbd2638aa4ada8446b9ddf79b662dcfed9cd3a1eccf33788cbedb65533bf7eb5b3525e0c34595ea939a415fac5d8fb60a4a49198bd71e0ac15ff4ab3441572dbeb37090e5b528e97194d33e04023ad692270a0c3c0016f6726e78f1a35e606c4f475bccd37c002998ac9ecd68d7eb961facb9fc137ddfbecb2baf16bb41af1e3a1f74a618dcd06b5c08524e6229f4c75955967dc396e403a688cb9c2cec219f7d07103136f1a3f395cb1871ed079340bd26cc56f0281d58581dce73603e4d153881436aae9a35b6992acb7e91535d88f634ac5dd424de3d8416fb7b50dff24127feeb7e73e3b4df75091c8c60033b719cd06dae80f2a02990070703fd15a04d150958c3f391932922523594c6882ec64924d3659012d0afbb3122b3cee2b8da9e58f59886832f790e2f30489ffe009810edaa18756e80f8919b4a1e6e3c48bcdad1b57c21e3fc659c940cd4193983689694b5dbc88fa431516000f36e619e3b1ebee23ba45a99049649ff30bbf116bd008bd009e80f7733f8177526adba8852e4c24b3ec32ca2c8b4c3a586f9df5d65b338133a62d2508c1d412fdfcf22c671782c972a621426542b7f37e36c319eed99722850083c09da047f7344c07c029983a91e93fb8e2822b719a7f62104d96816c19c81668afe82d9a44112998edf0f5c7db1f560dadebcf0fbe12575c71c411c7419f2034a1097d68c52821294862f27ce396e3297a9ede1d322a63832ebdf15862817dc004a0360a631e7e627193d14f5da757d332fc9930719932952953d9d82d4afba9c00bc6fdd262353c5e808cb7b79758a7bb9689a0073a68800e0281e5483827a368a4a4c2419633bd344a94fdf994a63f1d4e0bfb46f9f5ffdef5fe2e8e2100f8bf6318405510e434449629cecbf923af128f4a069964904936a6205f1292879eb01a0985b84a7807b48d98cfca8f46dad35bfcf386764e8da30e483d888231dfe563fb39f61aeb2701e669a263c8a9c5024a69b56b9a73161bd98f205d0985aaaef16462e8830e9aa083a8e2ca96d3f2ada26832ddef9e2fb3ae003f89c075f5b41414533288ba940b6c5265ca94664bd05026f9054c071e36a8d0af1d3cc4021e25fdcee1be436cef7cfc85f61b89a71d050c476278a2c67dff2a7ac90ff8f505f71cf7200aa2b92d1c3ee9fb1312388890614b68855798177e642bc8f0f0c293a0feec380f4367997e4a6801fc227bf8a0d713473ded0959b1cc88b11509e30485bd3fe2c4a1642e4ee84085838952880674a37cdd973b265662ec2359e95720759fd84597823d608617d33e5c8c0d2287b1bb52f67fbde1f047e8627403408568a423b95a6e5734623424624c71141c943940018c76cc33de6f6261dabeff8a5375ab7b962dab741329d13afdca8af7b6d12bf600e10a4041b521706ea0376e67d37ffc67b6291b83928ae4cf42d479ebea0bf0d1c13dffd5930ca72face20928b925d64d0f1aca06c2a00785553e1113fd9e20c680527f522aa40927f2e36057c358a95ecbe865da3cd0c4b8c3ebae4ca012a83b9eb5c557f41694ae3a5240584b02fa8b87ceacdf582a1f165cc7c32df97159e7bc8163fb36a455133772036ab7dfec05ed650bc5b2372da10b8fd6ec96e8801ea1aa487952771720db22140407d2ef27791316b4f597e2632a9a8a334a8d698fc91e9ec7d12c6ef82c4afdbe924e6345766c294b80e463c7dfc24219bd284395023db92f9d51184e8c2c7fec93206cdc506589b09d7ceb94b87ed04bbc15377e5056e1dc93344fce31eb882c0c25b00550d19438ea59b409c8a7d3470ed329259b149ccc1e4e60958be541c120610de8bd0cebc80dbe8f7119f788fb5bbf4ceee9353b09b3fc99bf93984a925fbe7ffb7e49198a5ecfad0b8b1c48a84b98b979250940c72ea1c610672688fbc4719c3fe0470861e0d65e3b206f7b8b09074ec318779ccfc5f8bee8549edd5e369cd1dcc579a63b45ad4b87169d01d7b1d1e9486fd8f4919eb4c3fe2e61f7f2e82c11b28271293a499a09c97bc95e77d0b09e49b3c4192619b9eea139cf5b28719497ed02a79d08f3b91dfda3e7630679ebe5054e53bd359df6032f2dfc2bb66902d23359c3f64991c90c25cc11596419121f9714a2bee6209e20f2453780295bc939e5d0d8e652be93cb78aabc9d442123f3e7797ad2219787ec38bccee3ae60ff4598549331a27b1c2de206f1008741d822a6f64567545fc5a55a645c421d455f491cd5a8cb461f374b324ec99f8c49fb64f0179a27924607ab3fd176740e1c2e723ac864d1c3163d3477d3bab86cfdfe44ec471ae920de28cfcd669ce9a9d0d9209bd1dede74811bb9877d0e62abeb132021e4d254c57c0c04ef0d5ec2e2483b0b92cd78d8c9e224a4dd8134391fb303f524e4427555da42355281f7092f14d1531aa4ec1b3e7fc52a1fc19272b2add36d6fcdeda7c4b39a3569e62206d2a6ab512c907891e0511230d6eb906059d3ad69c5cdaca2dde57e9ac2a6d085523180d5976f606b290917983ad8ab76e66a911bedc4513a6b05203e8b1165eb2244380de2076d62e5deb3249358986a8340df70dd2ced42ac6101f1c2ce1dd1812878c49969b18c2c1d1b6c3793dd17df49dd0028723b30835f10c46edc2e8a28d0aeb4b52062597f0c4791642c9b14a54d9b02dba52f9bde591084b7d99fb28e0c9dbd0f057ae2a8e054b52f3b2ce4b0ee28215932a145322c8c02acec81e90b95bc129f093b4562f7c4e8038a0e62f150e4bdf206d69ba397eb9e7d7e741bd2c9f6e98ff3287edc50dc009343d0cb4f3722605f299a512de0d88931474dc3b51321fafed20ae08b1f9fe00e91485f82dd1df038922955b5f79d4c728e2350a2d0fe51ac67693288d2d16c65b55bd1509630da6e17e58fdd39d21392f71ee1704ef93ad09779de7204db4645c0f72308acc4174a0405cf970bd2e19563e664d74ecc7aa4bbd9d38a757f705eabafd31b46383927c7b4d7476ae66a82c3e945614e454ec28ec96f3f6a302266d3ea9886f1a30491df5c38301543e6d56bc1c116d7597a9bfbc2ae581872b02fc871b41b2276ace10c7eab149d69f5233727447860d61a9d4a3e9599ad5a758c8ed798af42b3b476a463766f72838af6a0df5fbbce75ba23f0e990b3f9c01b7db4514679119300645b7b14a1e634632fd5a06c8f505d3724d3795493a6af093b096935b5ae42b045302abb88d79fae2db9c895bdc5891d96e89c57cc1874b2c2cbc87cbd3d6f2576f90cd05208ef6b7de3a58a8b7db8bc905cebf873fe85250b726b5ef36e2ff404084974b8f0ca94e80e2cf1ff79fbce6f11ee5435006cfe8b5e86e18a137c4cc07f31f735f8c644c9f709cb59cca133902004da730224f6d4ba4738efcd135c0afe79b454f87acfc5f15308509b20c27f208a798de479e29386ad88789dcae3089ae66c20f2c8cb7e6ffc4f0e6eccce59f2808b8859a652f60664ac80b24a5e14190cce57792c8ae444d73ada96b16d2af4fe68255cbedd64e62da6c4d061beb2c0108a3426c155a58ff75a5411216ad54e256777ce9de2b63cea6d56041514560baac8736a0b72fa383b586e3305aa882c5d096342945859156e77348b9c8924cab303671979aa933d67952c0ea849814cfc0763dd48784800e2b7d3544f39f16a44e4dd98c86d6d5c8cb45737c132fb0c8f2370017c423066b28d3c7104d99bef8e9f180c1b52eb451957176d9ebb142e2de6a7734512cca7a75847c5db7a37ed87ca5399580f84179daf8ac8d68541e8c9cad341537a1e506a58429790f2169755d23b4dc66e90545a3488068e3b755aeaade448499b5e058246443bc3d329892528663d7acaf41d9a78c1af2b98bfe994f82a3bb2f820c56f489c6c5c423dd1393d39e2cf4fd04f728fe6bce7f2e57dbd66776642db67cc8f3c68cb0d4bcd955218a1d1d4f324ebd043c3cb6039bb1163bd2d73305804fa953c9e2816456197d4e3a835da0f736781167eb64c320fb389b71e937441c453052e0e95a278af4812e4877323c095e6195e75c656c83c3d1e877f94644eb4e1c29d5e2df51114ba7997932e18d170a9f5cd70f28067ccf425b4764b151c9a421b6b63ec52a15763aea7762f728c64e4a9c9847b9b0fcb757c4be283f3b8d152c5495c7a15b4c026dd02e8f0d2c7fa31315442b0f2b2857b05f82c504e766c306efd7d55528b83a4dcf5704f47c56628c06be41f936d6e2f2f8242cb2cdf91522e0cfa34cc9ed585799d00c12c41b7b4c8245206f986a3a32ae83a9ef0b0da8ab99145b1e5d084b9cc1ccfa29d763e3b10d2ae7e65441c831a29f8747a1c4974d36e0d1456360c58ea012564b9cf0f9f8250b684c9ce5fb3af9e0786568632a469b2d62c0c176b67cab16b0e7304e182226bb30deff1b087c062962c7c6e053a4306dca80be93710ac2d2c6d6d6bac799859aa75553ec60ec28528fd423097b475a22c0015c19bc926e2420b51713da4c7d888106a08f442ff6cf0835291feb3e0a544d8120dbd74656067b5c6e7e2f08d0932a2c560a36d85e82df72cf6e4ee0c4ec0a579f9f9111c79b56a6319b9a54d827b2153436a66394b4c3bb2ab2db7066f5ba582506a9d461b2d5d5cd9151e154187aae368919642cb2306512941927ed720e2174cf85acbc0690512cf44f024b4132b17c6af6514bf04ae637858857d1f757fd409712a0a1e1ff5416e3dacf04b6243e3d4e2f697c0f71f67ad8c07070c1b1364c6bd0e2d78c6e96edee1b7563ee4ce3b60104e656fbae535f0099fec404878cb9b1ee15e58c771d8f07059661883e7f56ff3bbd0aa7ee0ba04aa7e73cb7789205169f9182e2e9c590c87d03c0ad5ae1ecd77968e9a10401f0433116364e6c0e44d221f9698e4bac7d3f10750c1ef56de6278a77a08ff7892e701000125f25ec75d4867e489be6fc468236fd5aeee67eef80182ef292b1dc65817f79434472839ab04016ce85cf6a5619716c77cf00e5beea1108d4cab4870b77fc2b7258a81870a80e8478119c2c04e028b604efbaa6a7de8cc92d6c56b8c92b0446333413f84099207be48d780c91356a472e04d3e60c99408f8e10509e48572ec297b56d224dce4b3c68253f86363a8e21a3696fa2cd95ceaa4bfb4e46e91e55504caaf4f51bc7419cec362195f3d0496bac2e544e6b4493bfa899b713782459d80aa6f61fc41b35f3766b7f47689c4f5a7392fe15723b762a56b8b24710ad1c51cabd6a959f390cb7d8fcb0925860d840b59e3f72cb92291aaed80939a9880084597f6931165c19c678ac4f199d3eff06b3139a2b79360650410b9415bd855649d37fcd209e091a5428c789f8aa678cf52361f7386837551b19f8e9b03ddb5093a4f0047e60f8e5255d8700bbe52cff9c899f859e33312753a1a696fa980e8e8ee36d719b748e36f9cb81a198e52046ea1e3c3bc3c29e754c6ed8607238225b6d8c7314c1a42fa290ff112bcbb03ee7154b565197794a656c2b069c50314000a35908dbc75c4e5fe38968793782f57adfad8b92708015eaa97d6d68df65d7841859b741f45db6ebe4416eaa9927a2d7b0635a63f82bb05499a4683706809d510303252ee798dd78ccd73d77052928a3f06a104a968da974217567bfc349457c16333424fe41d97818c0bae32a902bac6fb596463d92b1d864eb4035ebf23bb9039b076fe94f5a6042de8e5968a350029beeed7b62066e1c52f2b0a26dac22cee139d1bdd2f68e969433d5ae67f9642102bc147adea51ea1ecc88daac9745fd4976e61cad819715793fcd1a37666cffbb9eef55d3de1938819d097fd404bf1ea89bc6b605a808fe60cc3b85766076e9ddaf268b3939617653e45fb2656c5aad25c131ec3915c0a6ac706a4c0a4bae33f94a08a70c68c8e5e49a88788ba15fcb4430880308f1eb08a3296ea15904eea87e30db3e600206c8783814ff43a155d726589f90311ae16c4c08078d10b068282b9611809a914afb6bce490dbbe0ee14e4d8d9864026a2d7fc69408b9236b83cb382ab68ddb57af522885244366e5a0ea16fc722dded6d62101851dbd4a0ba13e925b74ed720a24636b41bea933cf093122cd283e240b90f575eb4139cf6abb4513a2b2d487e506b4f3386841a603b753278c57f0e0673ecf9fd4094d02dbc954d71d74faa10c0afcb8e39f11b95485c27211b4947764308af5839aafaa9856d23d92052ec8a8589fd0279d04cae8b0cba4a3fd3b69f71e2b198bcda327e81b291bd63a00e7cbc2938d46a80cc294433de8f23923e20d99c531a7ff6518e44d449c0146fde6b44c267207203c0835d0b8886610295b78b6d644fcb356ea95ed0b47f36bc7d6d3caa33a9488e804305b11442987e4dc3f711f78e17d99ff5409c71d0d4d0d698ddf2c53563c18649bc8c72a1be86e0b41ad259d4cf69660323123706666bab54b46aaa86da6da8c453df6ac5723e2b32b00b0e505099ac06b74e5257d51e42712dc924f5f0501c4fc8041490414fac59f3755a50c38fa6f0a5b5541eac219f009115382c493ccaf8023043af08f023cc3fed7b3e674725a99849ea31043a2a7da254599f0e7ce0c5e93cbdfcd8ef24c4a3fae83fa748e6022a8b14eb9d8a8b53a2c04ecd532bd51a2922050dbd0975d8d5a9e20014fcbde38fba17ab7fa63e09a5f61d3d92a56649d9081fd32e7c92eec31149b33ce3ce46504978eb7de5e247388e7c89c061e3e0b7ecc3864ff2720cb469f5752ad152c3c5fcea1485f4c1a569e3f852bf081eda0852ab624cb3e0ff096ffa15ea286c06bdcc507705f24087137917e605b451a004db64d350571bb6a2060d9570e083193e95ab15a52094281032a4775e2c2016dfde829890d8d2f3b59ef4de975ec9ec7d99010415d8fee0fc99f8f895573ece0330fec07e4eb6c13c68654378b446d34cba21481b6342e32e7f3d37aff814c05a0f81e157a07c162d218e2b07a9aa4413769d655fad2b603c3983086304224ac85d7182e96e4145ceff8229c272a4562b2c2ff239be73086b3521f330aa41561102e5cb3a42bccc884658e89b95d4d54f60518f9a1b57be8de6a77f2138ae44384e54484545311ed73983966e2238c3a01d6b947f1dfc060f087136d1b801a5f75b8929cc85656813aec4475bd461a6028c28875108056c24c4c2a10a798a1c2e5e960ceaf588780085de995180dde1313d20c109a181026ac00f2bfd6dabd620938149e8f13ec97adae980fa0467644ffc13a904f5fd532b94891b481265aed88aa86502abe4d795c1f5b9776e7113b435c0dcb1f7aec6c137ae8332931f4da9b938a50c87ae5a7766dd5d8776439e068438d62300de0adaeed6549c6bff64c5778a1c274208c84b51df18095cb99e2db66279d22abf1127bd88f9b5398237af83f1978b3aa18d2e8925353a7fa1d6e0d66b35b342f3a6c4cba040ceff7155620daed2fc040b01a74a8abef5045eadc2785d8035b871fd5cf6aa71993fbfed044f946178f5d62cb7b286b1477bcbd2fe6a1b7c300e9382bdcba5a13d3341e13646c31f5fe1e086228d7496e1486d69dacfd34d2a0157fb2ddafe4903d6c331eff6674560f5393a9e6ece572d2327f8850070f1003563008cfc23d8f2b1dbe321e3c3c24bd78c51e19dafc0cd015ef31f98b96265fe019e133ce617dcb9c0773e00361738e633c873806bfe043057f8e627f0e780f9f905610e389d4fd0e706c3f9016e2ee09f0f80cf35cef91418712a5a3e9e4b631091952d314fa531a8489491084fd2365824ca48942769192432654bc473690d2257f2e668b8bb12a4f3d138103fb492c603706a8d57625e8f572a5033a60e59c2c974fd3eb380f6c84a61a0c4e314dccad8f3dc94ad544280973ab2aa40b0fcc98e9a9131d3e731d19f6a6e1bd5028e8fd517775a3699302339f475b3cc335c92c7895f9765f63fe6c575d89ca1bf98b1739fcc4766d324611d32dee3fc0c1637a11c5e41f3d59f237c31385ce464b7eba9524f6deeaba1fc7992bdfbe39df74521f9879858b728ec30e809f99e6b75734a617e8f59eb7c63dbf7ebd9f5bbc1a7024b2fe55819fafdbe7334ec9b89efd7c990db14aa708d22fe6954c8c9f9b41c6beb0561f7bc371a8a7244371ce38bae7c10d2c1c290bcd1f8dc731cabb75efb97a9e4b7f41be64acdf8be06c485bb97c59288de48562d19a31717b97bffb92052d11fcaaa2d63f4e22297ef381643327adb41896d08a378404366571ce5ca782d28a23119dc0c4f08a4122c385d71972be3b550887e0055c627349c1314301d87d20dd77f03d7ec14a4df05a5d6e35299cdbd35d09a9d82f4bbd28254ebe2bee4acef494867f046f85df8d46f0c92e5e79b78340090726975debfd52a5a6154987d2515fd844fa73597b0cdb09be5fbe0c594a82424e0f6bf6c9373f26999f58b4360f9a21929d5c3d2ad7708e63f98a011a8286064fd62613e9f20a034c61f41f9dab63e49095afefab61f7ab286b39de38c73af196b4807c345e2651669c21f78228ebad2315250018c294da8062d962a263bad891dabacfde80617ac0a42e0498908de24d121332304c930bad0f2f1209f72b1e715aa3407a551eff63f809fb7b83eb6ab56bd13996998bab7188b04807b5803f6021d200c54782d019a4f21d1c1d480e57f3c1d0b0926f712f146ffb67ca1345a021bcf02bb6240722285ce9b0701b7913bd6c58341cc0994d0a875587829040cd781650bb622f15991b6d83dd886c1f82392cc7a77a089fe8be61b02b3dc9ce0064b22df3586e119b05e26e1e2def30622425a882d26897d2309c449c912ba2d5867ade4da7e62eb7a7a1703c20b8485c0ba7e30ad4a44860c2c752d2b186d2c5af618a47f053b253ac5026f38946e9792ba39b69b8ca23d2e05ffe400bc1905d6dfafc25948bc2ead4df228fd95ac941b31a39eba353c5e3d0796ed41bab6f9567d233c748de55404e8e777d1844395a84e7be86515f6a04bbd4f89eb6df839d4522003b5f6a1446ae1b9db506bdc41cd0c7c2d37da86c47b06937ab9fc222495386a29c112091c3ba4968a67a475544bd531eac557e162ab92dbdbd9d682644e17a1c73efa86b7010d83c40b952cc64fe0a6dd0a250bbf80dd04d3a238f0ac636f22efb05aa93889c5c9cd91fc9dec3438132960b0c23b54cca90e4a0d1cef03a2a668e6dbe9a37cadaed3c22eb55b837b9629c6c83ed3159c44ff7e8abc28f6874440bda763a89a7a84540ba4b0a2ae4cc33c2c126a4d96cca507ff2fc217eda83aa7e631c53b6598ae304f10cf2466f80688a9d368a0e28c40589ef7aa3fc7ba0d14975d092ae3944dbc374648fa67945c4ebb29ad4785d7ee9b7519e49f0e78128912174a8ae61676a99c4a1d382966440d3c9a8536e53ef83ea5833b06f01b0a53689f2c104dbb4f6c39acf1152eee54b43edc149a229396bf192108204fce3b352e94d736f0383410a9d785113d23611a975f5109d087b0293fdd4224e9f47c1239245e209586215d2ddfb7b8af0ca4d23309b20c9129db76c5fab017092f66f6477804a4105622109f984548e0139fd93c9795cf2723603a21b857a45de954f02cb50f98d202039d6f3901f1a18f8dc6470c3463b58877a9670cd38317d8a3e0f6b9852fbfe5b82a176731aaf46f457a80ba4706b967a7092b41d18c16fdd90f5fabca63a78128d387feaaabf5aab6bc62e3768aaba663f6bfdd15cf6289bcb5ca6243920844a0c8fd3967f2463f9f20c42205c7dd3a7245cd10bbb2561ae2b694ffbc78007581fb94cc3093613b96c67d6e9ac0d4ba43953dd55774217ccd974e099267275f1085e69d532c156ee4758fa76e735765915fd9a45b6c0655c756242179d7448e5bfd84494e01e2a6822ef394b71f5ab80576bb7de8c62e3cfd5ee1c579ab4dc86d3798ce41c66d969c74964c7590235ddcd39d0b763a181009dd4a9f5a78304d81ce77735fd03b94bd7ce84eda45415125beabc933395a520704465a14fe0cde4a73896740997682013df2adfef93da96e27d2c2bc4d852176612f0681c484d031194b95314c84e2a0313c9d61f6c6c286de073628cf339ae81725d68de1104b91ab651cbd7006d07efbf4fb9c78c30839353b53f2d95e6416286094714116699d4a09bc5fce5bfc65673296e01846b39a491374104984edc4b26bf8b123bb52321bca2cb485721704993750d537f69d2f9fccd00b886e5314e6dabfcb7ca62d597c8957a4305ab158f821200250a15b2735a157d8de9598506ba1a939d7bd1416d2dcec74250e65c68e0b2b612513a47d5fee43953b7be537dd0130970deb2d5154eac859f952641b1674090b833e088670442a18d5b7fa8e825040d2a09804be366ca514ca67f9bf7fae29648c2f9fdc143ade01f6718cab6ad85c22d7d7752f690dbd0a7af37257a2dc3fa69cb5398c1b4158cf90a17b37c4c030a9a28ef74010aa22f4907780adad11d0c2b17ea962aad5cfacae875b192db6390eccc9339b302e96f4a9f04d48a4895dd15877c0965c52a25c701d8676e1d1a636a1607985a1ea302630ece9e247096f13775dcebc049357e6aa10da6a3cbccda29359e679f44300cfc661a9eed71516415649766cfc68b700b60c3cee1d41e82673f74192f939e87291886c42a2946ac339bde7235594af55ff9ecb2c698910940d873ad9dd82010a0781402c5af5aaaf439fb0b3ac5c681818cf662cc1103287f48cba151686cff5b48dd54735280106995684ead48341bad2353e2a16c2a0888466ce03849efac8bf559e96be8f63448824e1078e717a545c4ab2781b103f00c69ed2093e483c6e00ce07408c5322525812ac3a80fc2118f3d44f1825314217903e04e29d06922b91601d32e00338e6e94a86988425bb0ab143f1e4745d500892304fd2154ff308dac46b7a7f3a41ba0c984a360793c034ecf0f3375dc35ce6343034fb23bc9bbb88574c4bcc727e8217ed3e1c277975d470b3cc083d06735d1db30ef0f3bf5267fd20eef8af28057dc87684e960b91eed7eeff7fadb3f39e226cb838b6a817714dca503702fcaffe121644da39b19606aff7a731fcdfda45f4681ef9f3419e8225b691339cd96c32f9ffc886b1635e442590b5794a0a6c73b220f58df2b8999c2de90ed5fdabcd7e8622be417dde91fc7a6801290e0649d7ebbe8202e8bf297ebc28c562adfaf3cf7fa721d85df99fc7f5e4b4e68dc77bdb887d6cfd31a40d892c00b649e7a9af47b7dee8bfa4b90a662d4b92ceaff7eba203f471dbaccfa99481f45b08af973da30b985224e83c02cca7d44a7ef23eceb300c2a0159400641c014223d693d83b604be011f27bf6f409eb946040e1252c8b34a8fbea6b75817aeedb0c546eca273f2d62b87732ec5b8ceac8abe1bf22f72dd1bb96ee7d01fe6faee6679d0a1413912eef03c611617c104c150f91125ba172abccdb129f390608112ba60e4ec046e51d8652b29360e0457f949936afff61327ea0195275826736a478962fa4f358ac02a5382139ef1fa83e0a203f808ae97896d21ba882cd51b376cc387e18173dcba62f69c5daf65d1cdae43c465af0329d7f5d7a9743d33e080f4648bb4eda25634a1deeb95c19a886e358531b8521d51b452bc67aa98a0486a811eaf7f9d276df2c027e474b578bdbfc83e22831f5ce0cadc6d81b7703247792530d3316a9fe549f9cb34943921da62c0a03d138c6b200039dd11f46d9a809aa9ff8ee17aec285f1fbd06f382e52a43755ac884504e18985e956a33b47eaec0f67be244335960fb8c6668b38ab43fc84ea6c32eee8441f8ecd86f1328d1cf0669ad558f1b184d4605d42b7a794802f553020296bfb84d17f8e4732114743a0011f8717ad6cf032d466f550b43dfc497ac2ed650a9f63b833fafc493b21e4dc59ea37dd304e7aa17b24793c29defa444bce010cd138cf14610739cd755838d02f44f988845a8eea543771a343da615687bc7ad712a6c0a17c4b8eda22ea515f521c40722e8634a43df60722877fbc17f120aa0366470e4a0df259bbd8aea832bbe3e379b4d2f1f2203c0cb005bdeee0ac1253f2438363b9dcf0b60f621e7bfc24b7d8d58f5eb7658bb4f3625da16cd3991e5632ee7862b3b0d60dca2a83eaca3ea00f25e197837d8c33765a8767e6ac479c11dd81589736bbc22fa5977a7b3f76a37eede131fe3cab8657e9e49be6e7bbc628a66179f2ae0c0d202d1681f883c238e8e96f7ba063fe0e08a4cc15d28663c42233b1781e5ea623d99e570c4ea79a63f30ca14a22703508c3c1b735cf7240fb9884defbaddfc79234096e4e58b628630e06c9be6d04e9ac188603ea9d823603ef999289bc559c01587d714be47074f601b2a2a91b4755584099540460a7f4768e620d7f1545f8f3011cd50ca891f46c30b1d783b1ee8a864bcac2318bd1c61d9868ce670f8550ec798bc7586ac7248905d86aaa5b5d5e277eb60b5231ab04cd02609aa998ac4209d0283ca497fc562f6cb98371e97b8169567c51e287b3420a4d0bce5e08a277102f574821271958bd325caa4f3e3da46c543d3c5ab5a75700c073562137123b8ed43f8bc86a277598fb502e887c9bbc6c3fcc06847f44384e20b7a18c26241a00ce61bea8d522c43b5e9037b37e6bc860e54bf7a8d09ea0be6ce3669b41103f0154004817841cc67a1ba5e04620d5025e270b0ba4072310b7f1ea5a2aa5ae4944bbd3878403672b83decdea01438613d85f7db94cb058dbe80f4b60f63d11ecee9566f370abb8e80c3a007be6a7d5773175261656c84ce68b168496e01d024ae5526cdbefc1d36e1178afefe5020d072692298823ae1515a9a38b7b8d55866503c94022d44eae55e79db1cbc63563a2d977c2f890453715e9bf30eff15fccb523804a12a1828015119cd0aa34dd3569822b2894174e2ea1f7f2ac6b6daad2b6c80577530a3940f6c609b7809aaaca96c5c528308eed64e3f5cc06103f6c3ef361de98878ded3272b6f14ce139d1b242cdc901bd594cb9f5cf0778a038132523aa0c58768d058e48535586ded305d477dc955fd16d7590d2b71fc3dd48dcec2596fc354af3d71adb083f3d45ec7ae9e2b2e119c07e7da9fde64c1f6bdf0f6a54f6c54e52d5c6ebf95342e2e6157477cfb5ada8f6439460d3db635b5de2f40e3920686c76f2432995bca83349acb28cc9706f3656e5c59e3933fe58295fff47d018b9f071781c19f9a0759a1daf947867d77eeba1b7d24e3f585da335f086b8ad2d792f17259403340307a0ca080148db2cd2e7133ba47c901edca60a0d012ba41085a269337805f9a9a889dc3a0a9390392b552e2e29fc5f10540fb89415977a9c84f7212675ff929de9ce55582217e1dcfdadacda9bac82a62c1d30136fa2c5008343db87c14e57e3aa1f826d3720460f89742a7b9137f95f434a3accbcef96d25e63f75535558ccaae0c13275e5a59b9b2f71e71be41de0ca767c975a0f8409937d316b9ab1abc0a8cb40f658a5178d9f6897c0ba1cc6dcdbb1482a505b21e9d30f8fa4644cb651a79efd861d187b2ae0d61b7530b38cd6949347804b887367453dd26a79e65ed2501618948aa8c83f043887e8d03a02cd0451bd1ff97125ae91e458379085edab6b556673d1067005e7192cf7e19815a9f7a6366c466939422666917590e661672e2541f047fd878dfe4707a0dd358408664140735a607c0b4142df34f240d37fb0f49781f4319573743e8c827495aea2f206d203b4545560e283e344fc447d27080f7e06d283a8f85806573919fc5a11f1c97dd2afeba1a2a42c249600eee73df9cd14dfc4db26270fb98e4f727dd89327d4eb02f5a0fd3551e7c5468e9e57bae6a68646378ed7d4b08509c4c1c1313de2a49e48388cdb7ca46475bc932d1fa9c1c5b54fcbe1f403b21ec1af53ed3d0e567c71bc0f35425875a215d92d507d1275a335ac7c92048ccbcb1539007445e60ae13d001c03416d299e7ed6a870bf6b53a2adbd2a7f9ecd4eb5f6c28220ab1c3ad181d870b7d31cc7247ad2b6ae8e5020c5e18646da4b7c7683b46ac0e8e03c081bbdd7d8e644438f20d01ba83b611136d8cb46d64c8a40a1d854bbe245892a8800aab5b696ccb3de6313500b345c14cc61515b379f28daa91663d86c65d17c586345e559ec18dc162f19aa526dffd11a67617b154d9b38b0c9ed3668a63dbcc02a545536ea2e4ec821ed9452b89a1d6f5e6a96d5182e9370aa6de8b9591bd78b841b3d8561c1f61ab32388251b3d6233d868d01132a7817807cb1c49b6b5bc6255b0f5e5625b32ca6cae791048fb977999655e66999789cc65265399c854e63295894c652ed332cbbc4c3229934cca2cf33237f126a689a39b3b3a0213a099d0dc58af79a88d14e9e714eda21c7ad68a8abdc0a16be9b059e3ccc5c82169c53cfda864c50d3b97a8154dd6fe173b432db05f5df04dd62d1300b1ea08d3472e91c81c19f4fc74c00a7903505cac07cdc2df92fa770d570ac51e1fd2db69b426cda08a94a2f2183e4993138115df634a835f07a4ee41a8f66ec827fc7d62fe97aa901ab3bc97f5bdd706a409438f95ea76068beb336f1477da46ba874bfcf4def80c7d542238bed64813a9ddcb2370c71325190443114a6197a4d8a54e9b2015bad6bddf2dd55b46139f30d8a9fd85602e769bbdb89d5b1ac9f097f1fcd5bfc5e20271cbbcbc856e3aa1904330d451974d9132011975ab15f2a6aa00add6eb4fba4858f841d3ed56b52e484eae9fb4a07fea0ee61b1d92546bee00d20a2ec56c5f17754b0947ade32900d8026efd7803cc4f635e3d208c783563369caf09209d9a3f64ca9d4d050b600437d3e6373b668cc9c03666c5a3f3753f41e2775d9a9584a8bdb2acdd03f194353a924221ca2c5bc214b7ecbc05b69a7fb976d9840a280fc7d19990c1aec74349a3df2d6ca29a2402b9e53f02e6f489fb7ec95b7efd36691cd87b11ee0aeabc8d2bdecc28408aa61f757b32119ad840a9a85413e69f23273e40113fc165ac364a8433361a33b1acf6f993167f2c863d107c282b6445b21947b20f24315c93f74f69c1ce235d84897ef18ad2f160a426224557011b861fbfded7289a188a87187c4c2f6ec4261a231c78d9272dd1c5e2426dc5f8aaa89433e1dbeae1e7547644372c629744180aba02d3d6c60c463114be5ac1e34a20fb30ac3d829d0eef49f5ad4bd663d8bbef27ae0ceb471e36196a8b8e1f6cdc7f5126ec1ac6a39a7ed7a29b82340417b673250b36f3cf998612a2cbe58673eafbe767ef244f6192fcbfd630ab94c0e61022ecd1604ec2e61c6c4c9c1a17f3d64a754ac78e50c6995dba2f99394a85700613c3fb04a263d075cc35856a235fe9d6bbc6a954b48daf5e1d42cfb71e66b42b7aa1d1dad78d8809ff6d339793a0ffdd26e2e279d5bd0e94933863fe9f287ad97fe1e0b78ad3ebf68019f0aa81dab6cca155026ed7ce7a7afe2614f9c9e583e597c7eb2d5ee58c231d5c2fcadb6b3a991047bc5fbe8d54b1bc1ffbd5510237ab0f8af097ae3aae1170ce444d4f63a944a18f0d5ff378cbbac8c669e5fe1fa875d51217c2b86cefefc898d08a815381063244c79de4c2962408cb7f9648361cbdaafecf2ab3d7946aa87ed0c026a16b863702daf0ce615782fe3e66f1667e2c3ed06f24cb04ee39ae9a0d67db874ee59eb44a34ba383161a2058ca0f21262c7ad27954ad550d07f61432b00d00ab2c66574068c66316cf07c897bc5395236541c5c95885d6f01d377ba0f1dec6912a27046e2ebab1fad484f914548dc4d72ad90421575fe98257fdc5d4028d61a9dcb0b706729972082e05a8d59d972f71fb800c758ed609b3b247a5cda7255910fa8addc593056d2782698d7cebabe5b58105bf82891e296ef7433b207e7a2c9db0c62538f47679e7089b326579b64435af474c2186adc749a04313fe913b3e91cff30a5a7a2e934e24d93a84d4879a8ad8b8f14e5edcd5677c2aa5fb401a22ff5851eff4566f77273bf2d521c99340ac0debf38c2a3592a9bd58ee11692a4d7fdcd5475c8f6194d36856f3c4e1f3a0647b8f17baa9ed2246b28d1b9337998f468283e50b0894fdb8b9ed554f9881be96da7760d00299e9a9cd2e7ac994e78e69a68e161053a63721c764c3fbbbc72bf06527064b147697bd45ca4c181fd2a1757057fd3db0e034d739449ecdc78f41920ea3a96d810a5a849b0be36fc62d7f503ba4a5b53cbad486843e7e8252e617f3640ba39c98155e011945faf7cf661311bb00b6ac4434ed080a0f0c19988698c49bf6ec1546c4c69a996bae0442a343a94f55296d0d1b85ef2563788717115c20a35d20aa24e6d110a65b76b9682a6198b1196314337b2c7687d8ec0b0d9f26a22062c7c601f532a9417a10bfe87255af2ea23e26172f2af508f9f573dc43c0e5bd4f5e36c78fe0d5a5deac36a828ed20718f17409db85c21ff59d72e7035ab5297836e57ad0338ab8ef146d307245974a9ca4f503bd7ec2e64b20a139c569d7bd805955bd58317efc89e48ead2da8d53789aa6aef339683f2be9d5663a783bea6f87352a7efdbbd8720c003f632f1d4d58763e4dd9f34bf7f1ccaf540ba61638281eddc25e44e25377a152d7053ce8ff1aa7c83f860ea3f61dc48e4b41f89858d9f01b8fed4ebca0ef91882b3c8870503cad96738cd8e72b7062c0fe0be0199163dc64543dfc913a4a009824ac2deef7cc610533809803b00b323d5ce9c36075ff0deb6c09f561a5982b3cd82e98c396d5c829fa0d9d9bfde4f0079763a977cea1fba0d1085cb52046669a96c772f3fe7205942a1511120eafd63afe89366060ce8046e46c43b0d52205c59493ac968932f8c34e3c9134733a418d91cf0a40cbdf0776ca481054e52842309dc6c7624144a8681892fab973d9f657e2f0d1a6d7bc4864c6c0dfdf77be9000f36c37534b18d1042c82664ef2de50e760dd10dea0c2c9bc64d76f364a1ae187a4c26f3349b0d87cb31dd1ff01a51b93fe005e27e3d33c6a08b2a438874aac876ecf20a803d607c6cc70ef484eb01a0a08b5dde01b00777b9d443453a71a58437d62feea795e00a0324888b591820b18b2e6e3f88dbdcb3fa65dfb84b15fb257155be558cb91f87424c1653a945b26bcf2217849f9dabd87b6296c409e6b23eaed3c3bb1d4a29e595574a9d5aa4dfb76e7141aed36bda861d76ea8341c7173b66697b9106a1dab3d30a13849e3b777a8dab1fd0fdb06ff701e18d8a4afdb063379d391fd8b9f7440c26c8f6ebd7372bdbc36c765dab1ff69d2ec46c12a7cb5a50729bf8508acb164d6e30651a4d261dcfc79a04ea6633566dcd69655626a5847047f702c680b9668281128aa12f5c60620c9d244f2bd3b08d6b61b92e23232321e699540c45d56928462829c90d31ecd07db1333bd60dbda08bd75e5016bd328961d59a997538b9989c9c725df35a98c5d6161616dabc4210a137378dc2ab4dda7b5ac6cd7e24b8b89fcb07abf152acb69ce738e52625e6068c9351a24ccba275c69819c7fd6459e58b55be33e38058566a917112ca3565cc3865d980a9667066c2772f4ad668468946513593e24c9fed36856ef11cf71359a69db1525151892a5d4b3c0bf793040bf7c356099d73d2f9a2b44d19b2a6355966ac5a4e2b2face636e5456995344494b4daa6acb8b05ab9acbcf0a2b32d2d2d2edba9be5c25f9443e69f14166e1032797e4920c19325e702c5ccbafc316164e8613199c4c4a7ab19daacb0c2a66701209e93f6a9352ae4ef7c702b59d6acba575498c4f23a33ba9601e1b4918c7366546b14194848aae8b42749dae710cc39b98c3e07e641c06729b7cb88c393fc6c2963060704ae4100cd4fb369230cfa74872fb31381ff3c2d8192fea0c26edc1b01f9d82b2df0c27302cdc6dcc0b0b6783c806d1ed575939595404639b550ab1584e06c918db56b167d5ba76aa2bd6723f18cb959dcf5219de5c17cb75652edcdd702e4671e164b690e1a214295cc87071ca94182dba1fb0a8b1d1e02c4d6ea7aab23dc3300ebbd430148661365a119f5cd68b6559afc101b16cbca2061795a2521635b8b8b4f4c30f3f98aecb8b559ce9cf24fac2fe60c309179392666ca7ca7954701109e94cb6192eaeb088ab59e3a96a345c3c3ab2dba96635318a1a2e1a45a353c5e6924d92588445910df7c3721beeda0fdb8bd3d05cea3a4ae9a5350eb9fc1483b81616196d381ff3ba9c6650b16d536e22921b2e12ddb8c1fd64bf71aa979428516e707183eb295370e0c061633b556b494909871638b88602050707c7db4e7526212159d14ffa498e1c39a4eca3eb328a335f30ca640e2639b85ead4e355e1504b48582821a8aa1212444581025e1bae8547b89a5c41996b77014c949aea5b2d41d5cece0780a163c2587fbc99ec3fde81bafd96c279f96aa849e652e2ddd66912c1e366395cd50ca99391c43f141c69af49226956e25696828699bd2751f32551e0aa2c1cdcb0cb1bca4bd2c7c813285ccea874d869bff8195e893274f7e58c9c8703ff23217d2ca6ab59ab162426728a9cc7872fb329c8f792fcb86dbaf51839bb741b9680a1b2b1b9bc7fdcc7b4ae82f7a1a629e19e53a0d75202231a330cf8c22401c4e664c016ffad78c32537fa861a9a6d164c9b802cc45000a5ba6bf2845d5890e45d53625ce74771a9a53306200983ea1307970fb9c09f80ab73f8343c19d7180334f66525499de879fcafd66944fe57e33a6156edf34a3d81956543963d5294b8b57dacf87758c04d78aa72d36e088a58656dc6f0615724962d72c39315bc39a33f4b2e68cb24d9951a8857126caed6b5795779b12552f4a9ff26d536ec73a63c56486d28bd2f51263b533986c53a8b062c849d00adef46792be5655423f2b471b5bd071e59719ab17ce877639bac08647297fa1e3b7072dc83573e17e2c8b9b1962263b0df733b12bafcfcb223393d65f5813c8b440441a4e4787d6703f969d28e898eb65c3fdcc9881d4a90c29d298d51948edadb27f33564c32becef4c60dee27ca9893b6557bedc626245ed77563738345f6833159cd40d250b25342df510cb3c142d23a8349cff46f381f7d2d3b63356375bbce182c37626e702809d382e38423de496bc399799cbeb45ee76b3e703f96e592830312ed96030bbe3aac3b45d0d09bd7c10191f7bab6a3e76d703f175f9625e784049a4e3090354180070d6abd4108a30b3af811a804a53e20a6e24abadcf64a4ad241951b6870887cd71b105dbedce40641d79ab72c6dcf4e2bdb9316d55edb40ca6dd831b46339687c28f3e17016b7719879e849165448d414a63085b8021515f9b642077de2bfa8a4c50be6baac47a57885bc0c6259c12635d8e2ca47375cf9b814a55c29050a9929d9e006325e16aa53f292b96f526a925b0da826348082b770e1610e37e12655104183329f8ab6829214e5c98d4a37528ef1a4b7d069aba88a48ef3cd4a585d890ceb7c74d3aab9921eab2e2a5d45d56c4b41729878ab3655f71e32fa5f6a2fcfc2ea54b5b7dd79328da0a29e9f69585ee43c5b44ac6ae6736a86afb7572fedbe60c6f50cb5434366850e69b1fe4a209b87484558b1812a3120174ad9ebf90b4d793911c519b68afff015d8e532ed7be5cc482ee834b474415a51d5c42c1a5c3250f2ee150223ad529cb6ea03f84d92a9187922b0c10fb51cfc6db43b7848470b280d2ae43a17ecfc3693a892e1b10753462128b72c6181fa3c5fdc4cb5b3546ee27d64861d99a23ecaa96bcd5c358d5e17e661eba6f2b924af257d227f4095c9252e9082c749f8e4e54a1e8a6876e2b8a2aedfdcd68eb1978597574e46395b2ce18655266bfb81f79c80999f299c4ae8a5dc3b04aa38c9875ec02c13eb5cb2d0aa3f65afb06e5725bd1943e5cea5f57e8f8c92dea549c454f368ddacf88ccea0754816662c47e2c3ed238af086fa431feb29bd17b7a2b8a754bd2cdc556749b1261b1b3810665b429ba798b4e3d74f3d63f140af6d88137f1f130a0aa07d4020eacc20c84828e359b481d9d9ed849208453b8e12d2861e5c71c74c386b0a7e1ad9e5643684114940373cdaa66085ca194524a29656c664b4e4b4e59dd78ada398fd7ac3be554d5bad98203d391dc5c4c498fe9d8e626262564c90386e2bd48a09d2131616161616146ac5040969c5e4490eb6ee64412b9abe231bb7183a7eefa1fbba219a9928668c2c1a1a1a1a201f1a9a6b4c5353438352d2a25b9d3a261d153088564d896868deb751f31a35f633226964cd8c510d8d1194546e30b0634471e4c6c45ca7230a2945428b641c729ad663e8b47717ddd70dd154eb344c4363cd5b3556d7bca72dc809a935d1e634b5468a9e48f338f3103b17977fdded5cfea16ed7f53724ed795b124b93c05c464f1375dd2ac67545d7bcdf0d7550746a9ee6f11a8d655936346f9bf7344d4dcdad6aa3c99ad5ad8152536ba4b0993635b6231a82c2a81b8a2a8d0edd1c74f35a7427fae2327c50b90f474846704f47d84694c1ec24d4de69a8bd780a82371d930e0946b7aa81716b3c74d963e2163534df2c1a5bb3b2a4c09bd349e55fccd13daa594d9a3e4d6d9a9a231a1a1afb287ed4de5143e83e4d0a2a068542d50ca1660843e862626234294be868fe75ab1a296ed89a21c0f6b4ae7bcd696efda744dd5054a1688dfd684763bf0e75638e502b1aff288d7f1d0d1aff7e616e51abf8d351fc51a81ae32f946c1173b4c16d43d25e2ceaba11b5176d6cded3b3868dd738111baf51e3363c1bf7ac1ab7819a5a74245842c4c6719c0435ee9d0436583b31894173cb8a7c69eac65b92f622cc5f6cf3360ee4d3d3c210a0c66d9c488ddbb04796cc1ff15ec3da9842a4c66ddc863d82e3350ee433adf58ea3e5a73efd43ad4e48a7a3d3aa3d26edc56e55536b3e533fa03b73e67e664e052e6ebdb00a2a84810b4727294e2f50abd391cc62c608e8decc1c11c19b486316f7e5dfe908a5c5044515ce6dd80f68e62836cd7b7ade46ada9b194666b3351d0f4ecb628285044341535f4f2c3e988a7e8561d930ea95330f3f07e40ddaa5375e67deb3553741f253a3a49d1a99ac79f8868682c23753493a67efd9adfb8cd67a2b8b302d9d4d4c010a0c6bd23a0c63d4b7304d8380e0be30ccd6b6a3eeb575319a99bdda7a95f77696eddb0b955816edfb0398dcd7be24cbdb13631be1175aa633ee336ea8c29313550aba8fae891504cdc88fadaa69c8eae0acd67ed5bb5e6da4a5b343556b7ca5653ad378ded90da8b9049f7a45333f12adc4fbf5b45d5166174bd114da3ae3fdf63e8b2b71824a5db869dabe8301fd82f5964e3f035ee55da337c1bb5eb1ab563991695d916dbc4906533cdcb5c16c9dc88c9ff50bfb8244363b3f593b57edd67d44f46fda80f75097963ea47636c44371e46fd28aa5bddf817d4eaa32ef58b56dc0fb5baf1a753cbe9e88b56745fcce9e83b713147377eb3a215e9ea421a4e340df9a3c472fde59aa717c7cfeb46fa9ad775454dfbc7516b84750d66af91822f29d775d9a9ed1707c9ee65af713f4c2c579dbacef4baa4d0c73a354dc65fd6f5eb3d5d3304e6918fff8c34e48474f6ebcb5fb15f6b51d3acb4ce30f2f3f43adb0fc8753e9f29657a8dfbc1a23de3846cf73a0b9da758b41f534ae964995ca76559d6afd4ace55bb5460ac6c1bdabdb55aa7cdce2759d5ee7536abf24e22f13db9aa3f6a28a1294dbfd719c42e9a9d5625c5714a1bf3efe848953926e67a7dc8feb45a4fdf8e2846c52ee47b72a93b8eca765af39aa1982c5fd64b3f2b5eebcaeeb7c5d66eb86fb49a1dbc7025d774469d7a150bfe769a85a7345cd527b9ad652617c62f8c0f041f968726ba92f3edadc5aea0b1fcdda5aaa8b8f766d2df5e4a3d1ada5b6f868d8d652597c567c6caa929603514fd0626b96e20cbff3d1b6ada5aaf868dcd6524d3e9a696ba99c8fa6b2b5d4cd475bd95aaae6b36328aa524f524f86524f86524f86524f86524f86524f8692a24a1514941494149414941494149474f93ba644950a4985b4638a0a69c71415d28e292aa41d5354483ba6a890764cb9fc9c5554a9545272562a29392b95949c954a4ace4a252567a59292b3bafc9c2851a573c4c328aa74a01ce54439ca89729413e52827ca514e94a39c283a507818e940e161a4038587910e141e463a507818e940e16174f93c524438389ef7a3505dc76389d2ae43a17ecfa321254574f931079d0d9b4a6fbba003c0bfd493cbbf6ebba0e3f9a70aba7cebb60bba1eff5448976f53e76d17743bff54522edfa6cadb2ee86afee91c5dfedc6c6abced828ee636b56fbba09bf9d52ee8bc1a9b0a6fe6a3b16c2d15f3d15ab6964a7db4d3d6522f1fcd656ba9968ff6626ba9d3477bd95aaaf4d1501b8cada5b68f16636ba9eca3c9880103f52223c654037d80a8d0a7c69d707f388d17adb7163ef4b179a92fab17262f482f54bc24bd387979d21e1fa7be58d11e1f88ca3e36b56f4b8d3e1ac71cb5c72dff768aa0dc8f8614bed65275a0c419be0ece7798e8e82039ea907692a20f5f07a746a953df8bd2520d944e7d3a506aaee81477f93559746abbfc1a2d3aa55d9650a2aac592607b1138afa721e565a97df8282214924edd9c0f5594e00d7faed81ca6bb4ed71e4c677df4ed6cbe93145542910836512274595e18483b2a21d903235c558d14d8e407595cfe4ea7631373d4a998231897778adae3975554d1901267f894ae5e5697af44b783836ec7c8e63676c7a8085ef68131aea2047bd89c7df887e343bb3676a7c88aeef36cee75ea03ba0de10dcd514485418016afbd9bfcc08a1facee0f90dc3ebc36c8d17f7d9cf36d3a456d91b6a938d6b3a1d5e62bdc8f8dd5d1ad704440206d25b53616fb6892a1a4efe9b64af85ea772dce690fbd94992a3c2f4edfb5c85694b438a0f8d2d9ad0ed18d9d89d98a4bb85f0a635ba6d15fa408ec22000fec83cb23d88e524d80e87b05cabf09023007c85bfa9372c3502b3d951588c1cba9da2a8a2fd2237b7f947efe916c16ef32f89d32d7273ec376eded3d86d8ea3ded48fef8dfd6e6851c3b9a6c90d72416c4eeb77ba94f6e99bfbe989f4c371ec37def5e6a6c28ba3c28b53bfeedeb0b11db780791804c07828a49fbda71b47dd2af4c92abc353e1c4697efd599fad9145d3e4dfd6c942ebfa67e3743df4dd27733e5bbb1ba7c00d4ef4694afa351bf9d1c5cbe4cfd3a19f54331940f2bfa30a52f1bbafc9cfa65495f36e5f275d44f5b7d5a94cbb73ed42538465d822b8d6f070a97cf528fb0cfe9552acd6ef39b0adbb3b19f91be2acf2cca087aec913342e5d869edc0757a9ea2befda21e4b2b5940d18247944e7d273774ea4b49e9d4a7daa2539f9dd2a9cf858b4e7d393c419dfa76f00875ead3c133d4a9ef85078a4e7dbfcef93c44ddf93c48628078a95dd08b2ae3524ffc954a932a6c4f46f75f47878eefd8f19c9cdb97ab520180798e8ad3a388c6f93d92e09cdfc328c7f93da238ead427d3438a4e7da81eab4e7d337a30e9d4577b2075eafba107159dfa54499dfa524e3af5f178d2a9cfc66b58d1a9cf87bf50ead4a7f3952bac8d8daa22a54695f9a10e897952e9aabdf674be527da82f5e9c078fa75257a986f88f8f9f6a0e001c2788ef2ced64e14199d182264aa7be1e6ee8d497434aa73e9c2d3af5d54ce9d4c7c345a7beda23a8531f8d1e429dfa7ee831d4a9ef5e88f37b40d1a9afc66d9cdfe3747e0f249dfa3e1ab7aa4011a2ca04f5205119999f4eaf51e3367ea0515f53617b3f707208f1997b6fa7a8539f77fe4e924e7d33e7ef1875eaa3397f278a4e7d35e7ef1c75eadbd991a2535f8f9d55a73e9e1d269dfa88d841ead407e436e7ef50d1a9cf88df9cbf93d4a96fc86f9cbfe3a4531f018ee3fc9d279dfa94702772fe8e159dfa04f0039cbfa3d4a94fc9f623cedfb9a2539f4a16edf16970d15e5559aa2a57b4c73f40a5b1457b7c225545a93d3e012a10edf187549df6f846d49c8a43448de1a9313d6acc4e8d39a249dae3d3545ad41e7fa65224ed11b5c7e771d2410c3da983d0ec11c9f324aae2390be38cc986fd4e41fcc27e32441d0417c4d07db8bbd82f47c6a883e06e619c39d90fb542434a47430a0f153c483c4c78563c5234cf51e589a2f21829a95cd1a9ee7c95a54e09e07c952c3ac573be0a944ebd385f454aa75ccea713e035ec771a7219fba17a7c86fd628cb80ff69301721dfb79d67e36b75fcefd5494885c868a92ce63543a1523e37c9d4edda67c90f13ee3d57ea77a1af643d1f80ff68bf9e12afbc9a4ece7d9380ffbd9cc3cc77e393beca7736baec37e40dc98a34ea9a4e8546ad5291e4c3a9583d4a91de7c73ce9148ef363963a955dc773d8ef94e338f643fdb05f8c0ffbc9dcfcc77e9ecd87b09f4d00ec97d3633f1d20f894a8533ecea7483af5e37c5ad42922cea7493af5733e35ead410e7d355a77acea7499d7a39fbd8ef74ed8712c27e31423c08fbc9047100d8cf43d9cf0686fd7262d84fe730f603e27e9488e749e5498a3330f603ba3007a22e11c079007155029ea3eea8bfa938ea69cd2a029ea2a9f3ece0e103881f38523c2c102b3970dc00f19c04a462ba04c81040026288b01f8fa712f093809c9804e048c00d0ffbc55c322c1374c532413b1931e701040ffba99e03048f9c0b2db9fdfe0e086b3f7b1940f00071a12531f623e23c54f6fb79ce537607c54173dc645709a14f59263621aa54cc730891f11bcb44b722b424b39f8faba8fd7e3c751d03e831001d7f31801d430c200003b8d931001df6a331801e4304e03703b811729c5a840e1c02bcf890df0892cdf84e901d415c72e07816240b7283d6b84b101bcf11644700175a82c37e3dbf11044711b7a9376c8c0072ac62d4e53a05a8b19f0e2dc08e0b2d792900ca7e18cd4f05d0b1df8cef28804581d0129d970b2dc92c135701ec979d1ae05d99b8ae120460a81fc07e2e27f25885961c2012f1e831cbc4d65e77bad0126a3f18970168ece73d8665825e255a8ceb681ab55f8eb746fb424b3cfbd17c8616c37e35d7d174b40b2d81613f18a7580172a0a80b7d39ed788e98d92fc7b19861175a82b29ff797e862bf999fa24581d092d353709f78a1253becf7f2cc7e28a1250468b14b86ccf0b15f8eebb838332c13dd0b2e87fd665c42a8500e2e87fd761c87cb8173a125d57e95a3613f1aefc1f5b8d09219f6f3798e1df6bbc7b98e010cc1bdb0df0c4e8817175a1200fbb97c0777731ddc0e1d175ae283fd7cb810dc0cfbcdf80bcea24068c98ba7e03edc8596b8d86f88efb05f00aec308cb0465b14b800871f31b36425c68c98dfd82b88aa0d432b1dd5826b61b9b0b2da961bf1a9d0dfbd9f88e65a2db39cb85960461bf207e0300fb01e036bf6199b8ae92204208c03241291017212c13db55b2e1b04c6c386e5c68898cfd640e64fbc17e3fdcc532d15d2543f7d92c0a8496b83c05f7d92eb4a4c77e3dc7f114dc678910f613e237de1389f8e1e3678800f8dc1e2182000010553b4fd5e95175ce52b5ef541dab84e7499ce1ab6af654c5cea3d2e7d4fe8e9a5d47c59ea3d2e3d43e8e9a599e1b15b33c51b4c7bfa9d4f21cb5c7b7a96d796aaa3d4dfd67aa8c7b35e636aa7d8dfaff50655ca6c69c46b596878a5b9e195586e561d21edf871a6379606a766354eb0b25a8c2161746bdac300406235c548d3528c11338dc976ab1a0891434dc1755897697aaa4e5a7aa84e55c1dba8f668fb08ff6ad1e691fedb10edd87c51e893e9a155ab2627992da63cbe30426fd3a76a69f91f681161736f1c115f75351d27a7ba7e0f5f6f806dd7518d3a9b620e87b8cfba1d7fa715de729ea148f515471e7797299e7e8f23f9ed5651e2493fd78922e77d085f7db29daa90164285da7be1aa5bb45a76a94a26aa7067086bf030a84ae08974fbb1aa59d221a52768a768a68b6530467f88cd190c2948694a621e5f2ce6aa768c7080eddb753b4a3a3a7db51ba8f4227469e130d249d8840d38908d42b4b1c418b36e8f8f0d226ccd5558a5961884ca8adc020804930ff79209f9ee8d315e8ca0a23df8f15465a1ffdb86ae20326f50382f1019bf880c98d4d7cb0baccfdf4bb890fa4b83132179aa602bb55208410427e32838824caa0db1067d06d883288487ab014b50e7430404ce7ce596eb36abc5bfde1b843ce47bc9a94e7eac7978fb5083fb28509f28effc1eac2b8b0091a8cae163793a9c200e16ebac97ea67307ba9aa97e3fe0ed403f7e03fd7853fd7cf03541d3d9c4cd69aaf072d6da4cdc2dce24bfd51f695d0de32ccbb439e7d42a3de47e98afcb3a6621e3a097ed38b6ac302282067df055be032657e5d7351579afede836eedb35de7e3fa8c47dfbe52c11edc99ef6e4691d8248def4ed9f25b9207c95470ec87615fb5ddfb0cb634c862ebefb843c2aff30ed9fdab16b2f8269d8618c7707423b88e29a4eaf41211d6cb203274748a84cc9d83c2a9a86d943d883fec3be59d801154b35edd4742dc2a08301d29dcf07baf4d7ba0a57ded35d8d77a5fef07b5aa5c66bd5258cc8cbf553f976ac16513976a32a941099542c0c90bed8fb62dccf0603840f831dde4f09bed841c04057e38eb93b77dcd52ff3c197d9763f1a72db7b7afb4afdd9547e5858e1cd6a5feb7ae47ee8b90aaf4a6dee9accb88b0bebe74409807410ccacda99127c336ed3e7c455b94ae56baa5855c289cb5de5b07685f1412d0c9020eef6206017f78349da5599fbc16c91be5655ead7cf2a5f8c62db123fe08501111aa1e34f4c16a1e318658c525e569431ca2bca18258d114608238411c2a841083b3a85a6694d185d50707041a15f7737bcb19288d24b0ec519d81dbb235bdd94dd73ab12c618638cb13bc618636cd9b13b764308bbc67e17bb63c36ea8f5a07ecc1fbd12c259af130c149ba1d074ebbaafeeeeeeeebeba1bbbdea7575f66585df9e804f88408da3509a8c59532daa1fbbc2be5635c5c8067a34ec1cb28b81fc837d601ca7b51b5f5cc8773654c128d5b741f7c4244119da2f4e242c7705ee7421c6a2f218fd9840e7e25a5a0c526dd87338f132f69b43eab94524a1cb824a5d4b9534a29a594d775d54cd3b4ab66d72a12d7b52b715d596695c87e556a2fecd77be2755dd82567928c1b78c1759f41773e5ea1c48fbef4f45f39ad1db9d019b91ff724b64ba7f529bfd385d46e3128aaa0bc9cc57d1b11663a5d39d69675c8717db35b15cb3aca759466b72c35a27ba6355cb1be42a9b42ce536ee87caad430a2f7748e937283ac59d5e723f94b332ab18cbb59b4eeb272fe53ace7e1b91b53dc13ca65bfd4248df6e83e25a262efb8bf77466992e5b75bac9c4996e3ae45ed820d6e927af65614cc7bec2c2c29dda0f08777a7ae68470a7d6b721e6a12bef89df06c55dd9b81f2f4e6d11faecda8bfaf1e5585830ce3aea25e37e702f62bd38c6a13016cb7ae15e60161557a375769dbca60cb39485e55ddd861847b6fdb472958cae9cd22cd2eedb3f9595ab1c729c15b2add4af99a396a5ced89a357271b758b4f7b445a7dceed63bbbdd22dc4ddc59de1d729a0d62a267b11f771586e5d95764d09df3badd3f23d735fd5a4962dbaee92affe45d39c6fde85ec4a49d7242b6db05ddcfc875e95090ec199349e5db13ccd3d9cf0340975e5b5959f9c5fdacb0585c374f3b78e97628ee0754c4f4cc5a39573f2397bba97e4041d7f4aed2fa6d1c11f0b27c65a5fe5801b272eb906359b975eb2bef54ec279bb85c4d62bb9bdd9e601c707b628322b3945e7506359029be508116576831832b6ce0860bb9b8b08a1a48d1607b32aa8e588793c7b45da760175547d827a2ae9c67ee470699775a087421276d5cea3e98142bdf1e8237fc38050d8466b0c58555c8200b15c94ee83e9cd8049c9c4e5da74760ac439f25f33a57ca23d8a56cefed490bdb8336380875874e0e77c235dc0967e623007b409c254fe94f70923a1d1c1c4ae7e3bda8c289323bba79e7b58fad2ad3dec4b22c3b12f2da9590ff7c58259a10324109822e8bd5fa399124845e5ea7169c32ed4d1558450f902ee480a844ca97130dca442abaafbbf19c000dcac4f37ba2eac579e66d74813f80bbcb19d8326ab1742618182f2ea75167f85063e3871d3970dcf0ec08e02a22cec387017e85388c2a2107c0615431e0400ea34a01fff17300097cc8615441e003286201875165811f5181238002271281771bbaeb1fce7de93c4e2b7278ad48fdaecd7a5953c69ec901675ae705bb94c89addaf2ac1c01f55f27d2faa30f03e4e5421f1be4e54a190c040a571862d6074f915a0c004aa042c041cd080a2cb67800212c03f80012a8c3305b004a830ce0cb1428c08c27d74999919ca6566665e5de6a0cbcccca71616fecad23d1c9d59a18fac30ceb01211b8456092a5919b01dc1c2006436338138fd115181c6134c9c06e1950da75bd0367fa4d28153ab63af0a68f7399fe3b1553d61956b0053adc58050dca7c57938e462574508541ecc295fb510a23227543b4c75f8261fbc46b7d8edd72d056e02d633d9088eb7c22d7ed9125d11261a63fc2bf2c0c76e8731dc8a7275669cbd803e7bbaf135520634fe8c54f39022f4ef9389b9ff06596cd150174a30f3346efbedbe542eec2f91b2f39ae342919d5314639e79c12ca1809218410c2180d055936c739e39c72ce182306e195419841d49c1342786a0f5e461bd9ea29e3942919fb7241346bce393fe7b4b42d49ad29aff9c538639c94ffc5286394b2081b8411c248e7b44e5d776a9157a43d29cbf6a09c4c2984d2728cd16b4fa6bd96a9489b274699c5186334d2575ac91b8c10469a2305745e9363e4cb98cb3011624b8b135a34c0c2d204960dacac50b1c281ae6342d701159525a828613229c1b404c721711ed8b6246c46340d09da07b2ec081908308c09c604a553d026aecb0857082cab089608ae357904d792443822e31048107b49e4b314d6a4bfae292d8b9338295eab933ac98a493149caa4c95d06e2ae6bca2ab3a4ab887569498dfb9913886519894c5281d925ad6985a5a5631666c91c934e2e7d0397172edb0a67699aa4f430b81f4ab51c1c1c8deff5f24251d79412156f5f178c1019434eb949696d2ccfb3ce164ac6b3c189cc719e599e8b9f8cc12df1a31db3802e976195f96a2fa29dbf5d8bd99813a29daf450d86fbd9ac8e4edb34209a3d5999c432c2294dd77b3aab50d278c1881163d22933598fd68c32946e2ff1237f5d6ea898cbf4e0c5454e96131321f2111f9d92b06ccb4b4b8b1334c0c2c2d2840dacacac50c181aeeb98d001151595252861329994b004c771481ed8b62d0946344d43c207b22c3b0208300c63c204a5748a26aeeb3242082ccb2a8208e6e4d5082411a43c1287102309eebcc9ce4bba9db0b4b959dc123f4a4ce7b2f67e70fb5fdc4e3110477fab2c14040516463a20e508167d378985e49080511ac040f26a719b9193705191a9ce17998f739ae6dc382220906919c985059df1c254f182d69cf32232042a65568f4ecf8d72d9590ad8c38ad98cdfb89fb9d578fb6a0de52d4eaa707c39296d4ec4c1b11ea7a571db8e4e9ee396f889e76eda24dd4cff50a6fa388382973b175564656ef33c8eaf85713fd6123fd9e961c6347878071047ffab1c4dff607014fc839ee9c73ef7f907b0070f01def4fb1c05f3b0148ca3df2f2eec6e3e82f3b1ce1edca5753ef7c5780be86e4730d28d662f925d9eb3cf8c45ebb2470e48664f516a1d6f14cb4cf33d3256dada072e604c58596b100212ae68e1982cddaf4be55c2b2d22528e1459584d8ea46c403e5f77653c9c0b7f7a10034384819ec007da822ebc8f363922fc8f87ae94b363fcb430f002c9297d6877cc82b684bc117aaf43992fae6a5f8d2b43e125ce82cfbf2c67c1503ac5f61f5b866279a9bdb8c4503a056fe4c8b26fdd5eccf1880873fcd74655e8b4b62ece1130448e68969fc49978cec210c132cb988d44403e08807166cbded3da31209ff79b23a21d8371869f7cac74e3bfe8c599eb902300fb64161567ae258671e6822102394a04f279823dc2f4a10f1101d8678befb6ca4b95a12c75123a5e82b0af18ab70eb1a43c8d1a40477212528e85a150688f57ec3c0bbdd1d749f321245152f5937124515f4a144371ec5d585349cb080acdeb0a0840a25494a9c2871a2244909152d3f2d19e7a99deff6669c714ec9344e1aa794534e19ab9079d741ef383636364d9690d0503a4649447bbd15d15ed72f5eb636d829aa2aa267fa94eb07823ba4bde6c9b24be6313dbb057b70cf7ec11eda330c044388c07e1441218e2cbbd9fba66a411c22b8d6615f86dca6096fb2fb20c1bdb26bd7a6d58f6a472eff997d13d7dac046c4906e56721d72d7dcc0762d2b235b4628335a3ee039741d45f775b7e9ad9289a3d3deb451d5c56e14ad5d3ce49fda6bdb5fa4ed9ddafbe0e9fbbffe11513bd0c1d322f44ae67b1ad5d0a2baf6bae9103d333d43743de8e0f518141474e3a965f1a08bef6895cc5bd7becd07b4a66aa62bbcb627f66f5f498012d2386fa14e45f8d4da8a6a4f9ef8f01c19429eeb1fadb076907f315f087b9c509de2c949ba431919e19074fb5a1725075d0b5af2515cb7eeb0dfdd822b42d9605ca28df1529c695517675ae6a1fbba2bb9e83e79e195c4f1eae25abaf034c6d81abd1aa3d908a2c8222718f703ad183a885261024e7b310695922b0ebfff75777fbebd78a8eae04cfc65bffe35ad0bc23eb43a5e7b51698813252744402743e4207e48a73e9c239e10e9d4076116375eeaa093f7c35943d772a11337c400ca04428c3136bfcf320c1a7462d4c4075b5cec2a4217fbb6554d8bdb3faabdf3a59c0f6abf55ed5d711c3eab380eb99f21db215700a845ee0746a38eefcd21f7c33a6c8fdaefc68fc46f67ce088ca783176e71fb18ce635c57745f13d748bc36b7b1b43d9b33f78363bfeedad8efc6fbefdab597e390fb51c275ff266eb4f28d3af86fee754af3da639b1974a8771b3a996bdc1fb8b40886c8f696b7d823b428cef0b70311c5991e42f7ed144dd863073b3ce09d1ff04e107867089c3a9dbf6304de4102ef2c81533ae7ef388153386718a72105555f907420e940d281a4034907920e241d305276ecd8b163c78e1d87393939393939393c827804f108e211c42388078f542a954aa50e53872a954aa552a94e89a20a88a2a86a89aa208f8989898989912143860c19320e630e655ce3db52855a1ea40a2db13910df2952428aaa1d43434843484348434843484348977724c1488191022305460a8c141829979f7a12553ba6c4193ea55d8742fd9ea70a8aaa1c4abb0e85fa3d4f85145539515452a28a87519ce153da7528d4ef7994761d0af57b9ece5154f158d281125529a238c3c7c1f1bc1f850a6de8fa534e960b023eb8021573ce395b5edc7cb5ecd9cd3de79c73ce39af44675973ce3967cf39e79c167dcfcf39e79c935ab3add9b7bde66e29691bc49014a583967682df26ed1b25d39acded07866118760ee320cb08e5656d96f2affad51fd900e0d5ce5448f67879e19985ed713eb0d39e88f5440d7664284dd7e1ed8917944019cf2b34ab3f9d746dd39e65d39e0521e4e25ae7e6e79c734e9edc8fbe6c91884294c93ca1d0f1238ef568bdf62c8d2d9c4e5db7be0ba77a4017decff36c70e80744ceedeede6c12ed590c93ee5693b09234fbe9e864f6c3c1f17efb751e122d45f7a150319099991946b91612169452638550288193bb750ad2f6e2ea6a6c0a0dca70d40eb3ac7d70d7a555218de9ec48697b1d21cdb2ac7d6cef5bdccf766bd3ea635c5c8891f949a0b872b449a4b8b08915d9b6e3077bc6fd64bfb8d0ddf2fd93e5e800c1f9e08b83868ecf4dd8d348dc2f3e09d4ed1aa3b6713ff8d79903c2cdbf9e6d19ec6a3a57cfa63dd9319ebe6b3ced3377eceec8f988694f76f4c00f78bb539031992b6db6e6386e83e2038a7d23cd7d1acf1ce3390e261e32f743fec7f6d81ef801ef669568ff016fb4db694c03c4d9a84543772d3b2d548a2b90ef2997df7d79b6b43d68618f78e7bc13766a8996f232cf127c6b5f097b44f8c864b0886edcd15956ab26c58a2611df22acf29d9d4f77aba04114f77a76d100c986a95c8e11b9d439e79c73ce2fbb24c23e89dabbecb445b0cf5f56160199bfec2c6a2f62ffba893a5544d41309bdb8ebb2df7c91ecd83124181603c3ac9448e019ba8ca8533fb263d7b0ae3b965518203228685e792107848382fa420e084cba1790eb9dcd2e8637d8a340852491a8534a5c1e1f91c430245dd8240cabfb4922aebb66da5caa44d233dff5f94c12cd2a8bda8b45e6b398bd48124924ed4523e21217768638b0671c90783b10f4bdae6d9b867de380c8db7de382c47b5de3961c4dd9652511d09544511589e68c44b64fdbd5246697f8c1d7325d568d37c0a609b3ac39a79559b2f2d55ceab565979dda347a51252ea7bf6294b85c63cc05cbe4af2c9bd7625cb020d6e535acce5fd79c32060744defa9435fbacd62feb6a739392fbb14ead1a6d2f21e59360b75c8e2581bad6b4fa93e89c49e6b05b750979914822cb4e243e9c0fbe93684aa24e614a60bfb2cb2ce360bc0530b3053b63dca93c768e5aed5a693bed9c939bd3ceaf7cd6afba9c8758e6a41963b085e10be6733ff2a22fbaca31c7b884011303e65a59b1bcc21d6366ee1f63dc0f180ac3c1b0b0d82f89edb2265be6ac3cad3c14a3b2c0a8d84f2cef582eff6d57da4b080b4b3aaf15faeed8b983c152617b2b2b160cfbf1e415a6c1fd60944a9677b5fb4afd80eecab651cab17467e9de13b5961787ddf989ee05f7d3b558d95ecb276f0bca6ec7b81f29ebd2dd3669adb8db2fcc883ccb0a37fbae1c63b956b02a594a89596904fd8ad6dbe175ec922d2e3248764fbfb6a1213a25bf1d6e4f6c50a0b81f790dd1de26572a4b7759bfb911a17ebd58a12b3084a060d8af57ae6e8583f19e5ee92e5bf5f2ae9b54c2b041a695f4b230dd598ecd4bfb01999797d7b721e691bf2c7678cff213e57ec0b8b445e4578ec160993033c63ff963bec805e3da8461b9ae18f6939765c26089c1fd60b24ebe94d2532a6fb7c2622511d13684aa2d7fa92e7f51b19f56e48a94f67acbbfd3c4ac90965fefe9795a3172cdcb26baf1709efe3ae4586c106ab70c26fbca31f995eb9f91ebe3d339ca7293fc0bfb4d22d933f42da74b9e05c3b0c3703f9875e7bd2e65cbcaf595b3d40fa808fd4a877dce53fa03c332ecf63ddd72c84d78653d595a9bb8b326b1dd969ed8d32978b70fd1a9956f2c155eada7bdcd6e1df739b726749b76794db3f86e9208a83b74f293449208ce44292792d22791cec4219a524aab5e5a966559d6653ff9399124845a96754d69c9292d2266993d4eae0045d4e28a78459cf10bd695b26b4f5a704e9e1c9760179f68da8e2e3612a824505046be80065d343abbbbbb021dac220a2baef55fe61ea2bd69f5b4f5be16b99fee1ea2bd392df9887304112eee7c03fa3d19aabaa4ee8350eefc87138109853f9f33dfc5b96999f58e7654b6eafaa4dcb3ee6e96fd384b27ddec473b0dcbec87ba589c993f5854c537745f772791d3ecdafb4277841dd286ae2d2e605e980217f3d307df38864ede3a335bf0083db4d8628bb2c5cdd7c5d7b5d43d8ac1ba6c820665be36ba12de81efb431c6ed4d2fae2231af5d893929a59fd59a3d715eb53fdb7e6c7d1c2f0345b2fd6866836410be0eba8ca7d3a9ebf23957be83a20a769f862d614b77d28a798171cccf5f958b92b8a16b239e52e4b4385e6ccd88e23074f1104a68bf28cb70e3d770a91c6e3cdfe14696118037f188999999990f27f7b51817173a6618b9ad947736e9e25bbe83c21d92ae3c2a86e713baef575e7a3852d0e0d554e261fdb6f9f83300c83ffa97bdbcd0c100e95fef5f166e4f308e7858a38c4016b3143468d335b1c20d1736b102e7c22660d88316d1622b352d849446fba1268daa1928b519b894e3db814d607b7d1ddaae539046d5901869a4f7e2b42151e5c519794aa1125f2faa86c019794abb0e7adb173aba759d82967765733f5d7bf39447db8fc2f6a4d5565cb24cb1a09442d80d6dbab95996b549ad1bebcc9e7bc530ac257cb7265bd2f658c200910c442f8ba5e44bb6130c3425d78526b45de8ba7628a3b1cf05aff968b5837c340821338410e2c0b841ee07b792eb6cd491b6179f7146c85c24da4b02e74a08658865d92470ae9c5f6c42471f331c49e9dba3bf46b91f0ce3d3d8a4fbd8e86667a327f49cd4eca453ccdc717340f8b03d69e1519c89b798b4172b47d15e3cb15114ba0f2e19ddf806b40a1567e2e5a31223814fa068140be97081b345c778a845035a0a5d918e0e0e8ee7fda8a55945072361a495977fea148c150ce7420ec2951fd1f3032ee26594d224842450409b1a40b9b08a1a28a13aa504fb7cccbc0117dc37b07cc87fa76fbbf093fbb12c6beb4e5d30413225d8b367cf9460d7380954733f289f25d69bf361fd0a62bd4f69db691d041800baf0520e08df82d62f1fb3ad4535b6d8b298df6ccd9ed6a44f50a1d9a994cf2e336ba429b546fa66d76c91ecf3d4527a2a29a5d9d454f86a7dedcd1637bdde67c84f30149da24d6795d9253d0f314f6699a8f909e6d9de594ffbf5a50cc5eda8327dda2d484f0b43e959083d1ff290d53e86e26adc0f95b32dc29fcfa8a47d15f983be48534ae5a422cbb22ccbb6292d3fab3cc438a67553e58e554d8b1b3fc13c34c3b25ff6cb38b330dbe735feccaedd9ab1f858f622979565f6f380a669b7b81f6ddbb22c3b67ef69be3e5538edb47e462e7d5679bb56f9870644dbb4f7fb9aa5d72147314b2fcb4f308e39271440ac0203292714db13d6c5abf62c2fc4fc07bc2ff0c6c2300c6b197202f669b1b10b1d844209962ef60f2611e99405658822509dfa7815d3a90f4eb9873501a53062a90d68cf5279871db38ed5be910b9d91fb5d6fa253d9ad1fe1a04e71b7f8aa44da331dab47b4675ac16c11ed99b85f37726991e30e579d82d7f24297fd82ed65f6da8e65cf7ed50d8af62e7a11dd0fa3db138ce3babe61bc61b2bdec9ba5edc10c7144a7b47a447b0de8d4c7525cebf08a6b7a4f54a1b4d3ed710ba6b3149dfad8a8ab746b4267ba51bc7593ea5a17ea0e1a4a0e99bd5070c6ba7096aceb425d9dcebdacebba2eeb5e54f5c840ebd775d10bab1bc77187dbb98a04766dab4a60d85695c0b06db34a6476ab943e3be4308c1e7b462feca21747e63a9e6bd3145938b92a1736c9e20851a98396a6c10d36ab687d492963b466fdf8303ee0e385b8f1b21681f1415cf868e118e2e5993f39c2a05342e5d288850e1e26dd39ed67dd085f79ccc23929c72bed145234b122095cd1a0ccc79c61da76d97efc6d9dba54def27610994fc56ed6a37c93a92a11bbe80207082288442089268488921c3149b2a253ad45a7fac67b9de2644e1ed75dd9f5eccc0171e266f73a75fdb219170ca4bb42a23637c96156898b6e5ea7fa924299f662acd7de08baef1c04047cbbcbb7ac127c2f88c18e3caf392dcbb2e675cdc2ae8e5ce43ab5ae8b5af75ad74529bdf84e1f9692356166662b24616666666666666666666666666666ae42eb38384983d14d5de8040d6ab81ab49074ed240d2b15fb7ca8982110c810f58996b494c48f5e6ee24a087b6096d2222dd7aa45a40541bcf3f4422e888d3bad9210c8948c1dbbe862ceb9045fd845173ef1734e56120f390408016fb1a1680651aef533bc812c31ebbab4e63805abfb50334a896aefbaaeeb8a334aa1eba3e8755dd7d56f1974fdcbb2b18aae2dfb77d7ba249b7adab27c689d6020abb32ea4c610460803ac91a814acf7a451cc3254230000000000e314000028140e09c562b1583c5064611f14800f94a6566c501b48619252c820630c01232000000002000009120022d5ac151ece860725cb82b0530ded4a88a8c2a3e987870e7aa3479e882797b8aedb64af8d76b30c7adf8c3ddd8f232a6ac3d11cf44341591a8e8012a4802f237952c5cdd5ce49a6b8f0bbc6055b1a9697231f29d3adbfe24baad4ad69ae3d19b280facb6d62b0aeed42d4ef4b9594073b645e7460e59cdb5706b6191c7f4ba304a8dfc2b251d72fe50ccbd8476869cda875f8ebbc60b804364facff0d74307f7f6a7482b4bd8c5155e1b923b715b8583520ad461611642b7caeff94a4856e0484c23bf95de137b8b9cfe1fcb7af4b6488647f88718a25c41f91aef69d59fa7f2bb5c13312e2e266f338cd7476a1b8ea026478a346fb23c28930cf892bb0dd8738fb555910bc3b63be929e365288a7d726a802b95f21530899afe444f070668ab83a75ca80283fcb20e13eaa85b4c8ede5152c54bda46850056991714f59067fb4c44e5007b3a3c4d572dea40c1962a7585da28285bf68ee48eb4f2070b146695e3a119f81f15534467dc71348cad5b3e657fbb8164e983f075e78d65df11cb838b867864265277021b91b183a0ac8bc20a5e9b5c08b334710842d86b057970899085139d6f40b74a5193a729beb9e5050b6dec67ad04065af6044c30928c75dd4650b394067f23e0618284bee5c307c924639f54a78c77bfffd8ec3d0780ef49d92ae5bde7abf44a0ba31b0b3a93f32bc6bacb7554ab4c6333a62fb1130e333683c7ca8edf7594c15303bf691971533001ec9cb539577bd5b3ff6ba4656a23a79e7d42da6d5959c0e09959f6131d3a0eaee80aa7472b256ea148851af104f0c4d1a9309666c115f9e9d1e5fef9bacbc291b431c5ce6a326c8ca2ee1fc4bd121791a283313e508c5797433dba0c7ca0f28f0f4b6d0226f18ff83e6af44838553007c2de276ea87026142a93362ceea3b88b4478590fb106b7ebef1cd4003a92089a84e35279b06db30844c65663872fee76de7d97ddc9a8427185019f7a680e5ee637cedbfb1e7e41b4d24f4d3313254285d98c816bf7481784639a54f08b17ae633eb96802a66742b6e6a8652664ed10452d5b0ba55b6bef22a25b6b32769afdde8f9383942359220482677e5e8811f16ad0af3af7f0444d4309157e438ae83b7016d2c84c603c8206033c52601f61b49d73fd390d4345673ad924d7b0742d49c92017b4767433deac82bc51562575e02675054537e2f426bf84713a13afb54c04b97b32886ed2885de3d170252d81182d9e0f7b7a4a093983718694631ca34f9a8daf35c755833001c411ebeb67868a3278661cbff1528756b2d942ede4869e514f930965647c5494e8026240ccadc2306fcaaed11ecb5acf955a88a22a7af6850e0d62b3d4ae940acb3f0ae2800b11ab7df89c5c4bf2d7989d70adc5beebbc63d6c6bba39d1877be15899a1bad20e575ee6d74d41553b2c21836a2cf681ef335e84122ccdab7b81097fb103fa7552119875bf64d73cff70a4beda6566ba764af475281f45f5fffc8f02f7d74357fb554732c5e1e4062f008f122db3565b4eee297b1aad5ef8cfc1ddb42b7a269d65a1093bda99bcada700f2292d85744ef7c31473182c6d8d7c958937b21b01ac42b3653a11621fbd8ead437a948a9aeb66015dffbaf413fd9a298f2ff60170544a6492984221a1fc34191c0a18792b0637cb735d9ca0260ba5fdc849e5ad2202c9529b6302103787971eacbeb1d9585786cdb01bd7d0abb103f43733006d5124e34f04e7a089cbdfd08ac375a9f9c5c8f540c70299983f9971f54d0d160ea3dc2daa2f49dfb0f39c84922c3a240b27ef678f10026cded7c03f1de9091d64e9f93f0a54f4cfe9b7a885703f057bda528f715dfed8e792db8e019e802dde53be3b74f3e655aab9c62e69c085d3c70eb470802dfbc613a0c42e491fc1d49898344e90002be002c8c69f0c03d1f55895f97e7d683f051982c53f900786b51155e9789e3720682c33380dd198c34c32c53d54d73b2428d8f693ad9d616c22db7b8b0a94ff5640bd66a163d6353327d1bf282b727a63c5fa9a1393d5ed73fdf51f9e330b9e393f1dd50b97ab7638c4af98d031c0f7502aa594ef4325c9f5e06bb5b4056f46321e129d6932e4fec72304472879874aadd3d40ba858c66157ddb0efff15d8720486aa4671acf3a26c13c0dc8412669991c0920c47a817e740620273d0d1d4b601d937318e5f5ccc6dc33e59361c41eac4679da6df2180a29091caee4568cda48c2c152a1450d9a67c335341375a198ace0a9ab76eb9656e9848b033192df2965c7e9546a1c2eac4a6e5e8ff007a214e7fd77bae32d3cf15a4493f5771b6e11c1ad5b5d8c7cc5b65f27f0a89c7578d3e8e8d87c61ed9d2370552f0422fef003246544d8b3df7ed598185619dd943ca1c8c19347b1d50c7a2771cf1c49d4e92600fc6cc86164c383bfe7e49ea4589ec743840aeecd9aaedf809732ee565fccd93fe295e879c7d9dab47ad570d57a520fdf67a8600f7c032e2fac33c7cf4306b0bcebdc56e35b41719357a7b35b1ff9f2d24a92ed2d9baf9a8a5cb6a1b568b7bfb70eb6bfd4f71a847a0e613aeaf016ccd6c29d280522bc84d8bd14f3443fdef14e969f94efb09547e8d3af6b70a7d965264fb7e1c542b39635b36897d1a427d51389cbe52efd309b014b93ec7552800bd351daec16b686da1af7a2dc8c66fadee5886b0809fe45fbd6a288e9780ffceb72a7373f47742aae8f277b9c0c09ff57a98c24abdacdb7d2eb433c803d5c90765190f40983eabfc2c5ba9d702ad236b0deeb5ba44a9376a0a4a82b1db0884e7dc67a6921dc4892bc86e0e07d523dd9f3ab6fe56c6ca686bdb151dc9c451db1f668850f58fd3027ddaefb9453fca2d28b446bf1826d7c6ecb1e2996378ebc38d1bcbb7c025dc008ec3017f66d973e87420b420ba619e7a1f2a81acf8d515846e835d4deaabf13e767c6584ed3c100f9690b302cf2b798268e76d70ae5ed2cc2c746190259dd6d111b29ee5249d8f96a8598096ff7654ef495e668f687e671e3e8c00eaa69dfb4e4442d5b14298042a46cd1d8360d2a67f5ac9065e81299f6c52573a0bd75f61b79c6a617d37f8d2458e6c63f63769ad770720c934d8f12058dd33614cddd31f0581f8a245a026782d288d3f005b8fbf80b30649fa5da91700cd92f501900fe8c6eee68cb5d9cfc5ef7528fe05431191de7c0f4efb920c1f2e27bedd7eec7fd0e5cd6545a6c6e5db1f304e12849646308205b5db1c9099362b2b703d64586eff87796f2c59111c9195716683038280c94b64751e4121a2cd932645ec7cbf9f234f8c8e370de6b83fc4b5dbe4b05fe54ca706c074176734bbf8a5e16b36447ff926d1f7b56d7e8f28930174a4fd505ec819b1ecdd7f60c2f93f5c0c6c071d1f6bdb03522fd4d7f58c279e7fe3e3570d3055779e1dc34295e8e439a00a74e4205f843c7801801f46c34ed1c1686b6516664418ed261a32fa72f0ea66a63e48588685b6badd53e2157b900e3509228bf203f90ec185da361fede8a292a510e433878f837348a7836b78e0fc34046b1106232fa0f84b1b01caebf28df24e0a4fc6ae20de4546314ab94368a42d878974707031cb5fa82d0698bcd9fe284c26918da4b5c55e0f6f32006fed7edb2e61b64f44356094736a4fd548e283923cae6423c65c057bf3ac295bade0bfbfa365b491e386b5062fe7ca553bd09582bb05b0f7d1da9f260608adeccd321b49ee16cad1e4cc36fcccf21cb0541f57b40aa9352084490c137442809344810ac94bb67da97643335942d83eb4a87f85a9b629eb23ba754f0c17102ebe871e65210264fd53458f029787dedcf9944b96c2046d6969d6d75ec1bf8420959373c9335d17f3d18f39b899b83eb9a2613469b2d32bfab6aaa6d0757523233afa0843c46fffc3206c34a1088781d9d4b50c75cc234c77588249ba02e641b74e9565d3e235ceb3688c4b84e86789656bea55b15cca5316164a9bea8e598b140146db8e217de89bcfc8d4ecc978a14c9793338f21b452469e2eaa7f5e0f5dc999e97f1f65967e55b96c8435a232fbcac7d54ccad91bdd5212ba0b90979cb0ad14da9d5ddfe6b5d09b70245e3c08c4d5af52e201a7dcab743b2867116841fc0057480f310bbbf6c000c461bdc5ea5fcad865f80b7dba94b194b46c2012af708345c7a4857706e052db9d9e7390a1b15a398b6ab46b188e51418dee621e82b5000fe0f1cbde95107e0d53a81bc5ca24d1247c264904961f2c1dbe20f78854e20d53f0312e63582e847936bb7e985f0e3643c32fbf4cba20402bb9004b80288853e1d7afe9b29b6ff07739ce8a8ade03f1de9c72cff12ad357c39505ad318ef705e6e7b778cabc816225def07aa3892125f403502a4dc7070d3e8654a39ff702201f12a17dc72241d07c5ef8c9a43457aba98a6fa6d4d02b2be6e78a81b7449a5cc425d4459f91df22ae4c05cdd9c1aea4fc0459ce9ea81ab8586178b5c3fcd6300b0591e086abbe987a95a06be16d81886d7f77daad19cb627034e93ab4b6ac4ce2eaba58266a763ab6f9caae3ea18b7f4a9836530dd875165eb38766c24acdb71b3e391fe824e615e2c89bcde96ccfae2ade669bcdbfd4e4c176682332b8f409178a64193a6437793a7237bcdc729d024ae53df13cffe824409d9256c3ab62551d781ab93275fde78844cde619e4fcda5ede4cc20d6c7fd4468568f6ebf315f7053e690b12b4b51339a545944c3d25a7d8f10438d96bb999a62e4873525b444d2224aba0ed16c56cb96000f4759a2db8ee49a09e3ddc2f606b4ce3853606efc2968514823dd5f853908814302a2a8fb0f5a31a914e4e372371e752ddc62215dc98734dff09e5172f786516f7c47d2809926308a6633889262a7660efce8c010903448ff158fcc578f815d4635ba81797463e73f2e18dadc4ea5b1dea731f14b7272a4598f5713479a431a9be262b14939135865b31cebd6cc1822e0d6370b10612962ca854dbd50464746ec58aba179c5836b312163f74d1ac0b9c5ee7d6d685395d9b031db4bed08c09dca387255b0fa4e52864685a0fb67792d5a8368a3fddeec29b224aeaee913b33deaa46701ea4ebe0673633ce695f7d992b9fe7bca2ebdef31f5a9836e7ebfdfd8372d9d4c482b038d172e6a815a410f3dbbba76b06c91a17491d3f3aaea78f3980a9cb6e5c4bfd6b43bd2f29d335d2403638036c969079ec061f6564503f83573a4ac4d19dfb8b1c8f1125e1502dd1c6ac8a66f770813e95123fd3e5d45395e1d6c7311752ebc6fd8d0bcc69ac914e50afbcdae5e705466818ca8d00031c6bc21b1d4998bfe8a5063ce7b8bc60293b1c7753d23a626422a3cdfaa37b04d34183a0f4b1a33c09e8913d72093a208498be7738289ff6ec4df209175a9f1e45979157378c4fd2e46f2affb51a2b2198bf1f4ff99c9e2591ad13a1b3cb120c9128f2f2946384bd0f74e8f4f9c62a8469b8b47b7c2d58ced6ab5141d51c93080cb0c67ba8b673e6f25e4a69755889d1a674db2ef94e7101204c5016a53f046cc89c1bf6e503f937a817f8c1064f1c92839ed9d5bb2e5fce82d940afb1cb2a606ee71ccbc6d740d1bd8f302bc89e30b61596ba40ca96dc1d9c2184a3a9e429a10df4265b67af7da6111eab5a3e7356e27d106c585303019f47618a8a8f6f1938c81a605262adf057d27bb7880cb26f1e7299e75f93d16c1bfba710b1c02da6fe7ca3cdd040b349c2b260854b3c8e035f1568662a3eb1e5cea4b586f99a6c9ba96dc62eca2caa183117f548ceee60983f846ba7129264de54cadc23240c7685087ba5ef6a30079d3914fd9a291fa35cd4539db9f4bac5756e7ea97747d3a903ffa81ccf6bbb022cb0d156d2f0268b87435cffdb048c5a853b32c20a7d8bb16ee6ae59320dab2c9a17934366696f3085fa85c4668798db4c5eaf5ce2eac08205972d37621456280f470603fce5c68e9f13803c96830bb2e6f51fb2e2ef8577c27c58e0c3f57ea8cfbca152237a8f00c4345da3ff7e3ddf945423ceab2991ef03bbbce0b4e73ab6c79f1197e7b224c609e20554518f345425fbd72be3692e49012d3514cb17a1fb4caddc7dbbfe7816d1fcb791764a2d1d776ffa641bcc35665a69f6694145ae7636782081dad9ce53170d25be6d3f255fd27b07bdda7947e5c0b58afd01da8151ed8a7fd8655e69cc2a96e91ad83f93ae5e69c229bf95a969b91754c583cbf02bbc705dceba4fb8b07a4e137fc282e8917082a39f1f2daecb7695f8bbaebcbd74d34bc8808fca38376ca5dc3386f2427b23ffda37d4d2ded80e25e408f82c329bbc7989b74aecb86c5cbcd9a8873570058b279edfca0c35d714cd0c9cccc0747ee7a1125d66a8d947f785d79f40064b16e70911b08f0c6b3a932c0f32e34c2992eec1f2a80ef3ad938ba232882442c26f3421a42637a06941bbf3a17cfe261e6e159b62ca87734cd450ec5037e36a98cec4ae195bf1f6e6093a806833b3da99200708179c5d2a016fb207867d4185a3c003359902cdb112e5f6633f7f0a034e2c25b25f3c7197d341df77f62b84dbd60fe133797398562e1ff5d24268625155bc54aaaa719292a68514f28e6bd6d024344b7a7a7ab75ccbdb5d02e6f86a29e79a670b56618c9be66079e6673b5b0ff78b0b59300fe5d08e5f5941a9b94223ad2e963e1f4df0cddc3af6b90a7af336f6273b7581fd06c5454e4b773cedba6cbe0783b27bfc3c65a2ac11e6a6b681eb3bc713c560654d3fce49367b549490db5756a649dc5b44bf5a9a2abebad85b8741f7b8fc990e4357e2053831bf65b38e6a44df2cb55c3b55d0083933101c25be3b0ac929faa0547a7e524f7d0eb5fe0ac18f01e1a7e9175383e7a12c9bc26c078d101bc6602ef59faf06ee2217374c9649f1b3ca6abb48b3581a83c0e9a1aa7f87a92dc47ff255b7640b4ba7c1ff8091ad42755e556cbde278c60a2b85276eec4e6a6a962ede2ebf7af1d29fef09e7747c9ec91b3201a6a1991be1bc7606236d65829f2349e0e1ac9310e89f0600340ebd5838312929065949efdc62218c0b1e1d2e8db654f6b1e29e4e1ec5773e154cca4612b7cbfc27ff599f2719e1606a016d815486716c29f8a60ef700b326c18fb183cb5a00fab851df428fe084121209e64036bed514a8798e446186529866682ebdb27f7a4085a4ad2526aa44513f29cd1e2f7f9560deea4dc4da86ee4e2cbd4b02c8e45a4cf34341efc2c3830430f39f4124581e02739efa9e5fac81e528f831892d92a78a734ad814ce55258520abde3c039923a7570aa44bd08c28a15732c8b4b5984f903651f23efc0c10ea0912c9a8fb2e4b8f4f537929cf71a4361fc86ccd0ec29025fccaed2534170a78d282d00dec328d4f309f7c5ea1d1d243d484f2b7bd85e1c353ef6c434f3d46c6464839b63c2d7601086a6320d0f58090b7a485e305071950e88efe104b583ab1f60afca8c7511a51c2596fc91f1da0c32e53e654a0c84193b2ce6c2256966dcfbcfb2f3ab4c68ee84b8e08ca86db5ab4125c0d512a254d150528ab3d31ee031a098a377d505d0833560d7d124211c549b195c2d867197ce2a87279f7a6d8e237b25e14d0b282578925a325f2d0e73fc814a16eda032bf8d4ec63f73fee3a34da8b5ba1ece3161c433ffdb4da9100cee33f99c1e815b070ea6507f34eb80ab2396dd34ace021c256d5ac88436525d99708f1d7a3312df122df65981d5340824dec1dcac4400b1b94a502ff35b757e22a839e5f581ef6de366c5e4fa051b21fd76c06ba0d9cef2d979b046180db702fb041311ab3061a60f3c77db04a71da6615977da1f0d1fe83dfb5d02c606756071f0347f3fb3f7dca008fa0f4153d6ef8b8ee3564b821f1ee24b291632ad8c3cf9d91dcbfa2347bea53006eabcf360500d1e8adce49fa3c5216da689cd9c0b5fc1681655fe8d8247872b4e9e2bc4ff4b1ea5b107ec89b00a64b69edd2258c6288df643136dcd93ef87b17c6fc2cd5b122e29abb772565532b72ca58e28fc4dad794cfc014f95857eb7f1cef77af16e03c5f81145ca52166a50ed8b54fc1b2350e4b45163898ebc030bd127cdbba5860fa198fb92c00bf4e8c12a2efe94ee44e05e7b885bc9f5f804376972ae7a8eb4b82269620aa6e14f648ff1aec27909b086ebec149a68af968fa7290a239189c2b0670b758d090875e5663828d740c5a8208f3955c02ad63a7ef25bddc6f57e6636056c4dbaa3e05b15ca5ee37ff8db31441aadc5aeaa8c3c9724e26488e375b8a9969db89536e94dc779cac9a5a3edfc6c620340ce8b3fd90127d8d8541e9cd0674657568acbb1a30998f5cc8783c9981977f0128cc29f21d0f2da4abd5ee42a230b85b216375f888680f9972f9bded69da4d8aa1f092d00ec0abb494c71000c669b4e3751519e61f8b3a5e779d9712e24866e8310f643c824f277ad0b1b90d9f3a3007c878a01470de4ad4745bfc72762afda3a5e622381ee1eba3019bafe9171f38310e63d7a3712e1cf89f0276134329fd305fab8f884df406e2e45ab8ae2d779afcd0be46fb69a1170d01d5ab3d10536cf9d5ef13516f6014c1de07c381ba06d8d1d0ae765604d802768ac455075701722a1da83777fb984986fa209e5e8cd3d1e526a605e7d5692d58745ca957b7f871a6cdf996a39741d7be36b39e7427b0013eab05b92d6dbfe599c256d6b22dd74a714bb9c6c6b7f0e6a8304e863f8ac5b33602e3481d7fc87013a2e2c1092e4a133829ed27efbbb287851166c361dfda7e72672da62ebef8b37b96466975f028a234bb7a16cf454a589ab67e34f282d92de1ff240ff3a85119a94afe877fb46d58c6f1ebcfbe5529b8605054a71f16c06690366d8359c21543b96d3518050cfa6a5cc2eb889bb1f17f759fb87d5dd7ca20fa9cf7b401b6a37cfc70a2922520d2d1c32bcd6e60f5fed8b15eeedd7a6b50c8e24f4547a4d2041a70bb0dcb9741e3335e0cb21b0ce737d97ad572228517351ea8d052c2df43f7754c0cda72c20daf2bed144d0e46e1ef96d7f3578d244273f1088396b09bcb7fe390a7f5ef6c614260807d4761aa76ad2f282ec0bce32d6a6dda335c12fc9462ef0262c003378a31dc9244b75a86e475b18ece3aebe29735abdaa48811c5abd86b83a25cd5291855c227a7249f87fe53ad8385eed8188ae4bb40087f2655f98b47ec5fabd8c25f1aba73d08a4754bd43429bd1f80fa05d9262227bffde1f3c40aabb8ad370116b5e71315d9be730bbb0cb6ed27a0cd7e19d809d6703dfa01e6554eb5034c27f4dcda950003dcbe8520dbd7f7cbe633d761c43410e486555ae44e2dbc5290adb6c820b7597ecb004372531c15f1629586c1361c5a183568d94f44bb24994787435e7cc17cd032253cea2d8ba9ab5f336b5e29f2848e81592765d2180b0c4818adb7770497fd52ee828731307cc7bc90e336cd24e72196605bf86bbb00ba814d9f622483cf4ea7ce1cb506ce9cf495a5c4855afdecf6e1c95a722d758002c695c5ea170d3cb31314d1be47caf6fe694e95424bf334994f5946923ee3f33e4d6d558647b407f4abe4ba491eac90ba32a7528b5b3113275430f6457bd29ae72ede0751fd1533f4089f2c376b44674c313841ace15c87da8d81a4b23eb7b242f5f37cf058875eff94be4a0e9981c758bccca58ec776af7fca2affeb55ba2649fc2e0a81666708b47433c0c9df8dfa8b41ce784700666cdf26cb4e7fe7026cdb4fff8b4953645152e8ddf00516c5c652a7331005b35db91686ca6837ea7975cdcbce1397d2f04cf1b92289935c39d7e99a0384781002af279f1303e03cc7b0f3c842811ddc0da0fd35265b1f938e8328a4cda8599df4a151df82ebba3c3df81c725d2af051cd0802f2548666928561f66f699276ecb50eedfa27d7f5db08d734dacc22c0f540879400e322698f52567a3f5c032514b3494705299751bb1ce933176aae90f5497ee87395dc5c289e80dae612309c6b6b64baf570ad4d824dc07ce2761c2b1acac7a1d6696b226c9170cd40d72bfd757d68fda55a9bfe590985ef837537d100cc44fa90243960312db9c0de047b5a3bb24ca10374ac1224f7b58c9620334c972d13cf67e5cb61ce6f5f96ee8d8d8544fea884b37cac9540a327ad26657459757d683e15f3ece49d4a62f1b01317d47d536d92129c7a64efda49d51dd4708ab3c8d68633ababc4d59ce48715ab85d9d89fef421cf8af09b4448ddd7248a6a4c176223fbc9785b7b20bfc8534f06951d0f2ca5ff44f255bd7c08b0a969d7248c42917fe85fdca2647e14f7cb74563c64f0e1f705849345ab71e9f68e7fc275518b19c2f46ab6b869cdd03e0a4a2964962115eba91e7705b2f242013eb9517cbcdf0518497236c5d70ccb699d3acf477ea831a676bdcc9f0fb9840cd6405a9848ef94241896d33b0229ebad82ec306e487e92a77893c9d7bce0121623741b236e3ebe2955c2bb39a49afd58a277acc67470427df9c50eecb55ba5a1460446c9a5f96ae0b6192fa5c0c5c50991d82022bd3430819e603c432fca637d560c1079c6a41e2038e305ac2212c856963b60d7aa2ca5c4548a9465abcba2bd3a85013b8589452ebc34885fe720da1811907927b0f43c1fcdcf54aaa98dafd8bcde9a5afbf0a5de5b6dd3b745cf03234b43a5dbf7f067c582f66d5aa2c488a14160bd16bf4b08d918667bc3c2ce3fea42b24876caa3063349d4d955cddd756cc417f1405638385280cbb767a04a137615b0a309fbc3804ce90bc69ce56cced9e204b1984e09e4dfc75e86ec59c31d491fc7fd7b8e36d79d8e7e6f74bf5c174f2d2aa1ad321b0652f04a757bc0e0e91c4d120e9dfbd2f1bd211340be96637618866e15dd9200e41434877b609e36884ee950de9009a42fab34d300e8d14fb57eb5569a4f0a77e3173928e27feb57206c70424591c59729a3a236d24f0816bb35c198536127a09a8ec6724756d15a7f22170098bd4390f3e96f5096fb98f56747199c2974ffc84b300a60d2e0d2bdb83560cb3e9f9a81dbfb0d157c52cbf6647086da3a3dae326ee483df257f22d54239b6580115e9fe1579fe392ae24671c45aaee6115a9a3f2466efd2f437315be5dad978851802dd381d7530371c3686e128a6ca8cbc99353f9090caa77481529ed64c388cb8db1ac92604229dda95303f7e1cf23369c993f5ddce81a5117c8140e775cd9cbec3f1c76bcbd80a198a5b64934be7919b88fb108814976cdfe085f9c552ae583f91f0f5af561b6931296be8de31abb40f5a0ea3838baa76785c383b50dad7ad72326a458b104abf3b1c3e039eb574cc63d307490d42242538cb998da72f0ce112a23aae3e24b839ed70b1dece2f3e5c8094d864c3993294e3ec3785c4e34c8d020bc4230bf4a99ca8e6fbc4df3830a99b006adf0845672cd6346dbb40100e9917f34bc98093afe0198419d93b026303987f7179aceb107979a26b45266df2e3dc1107281564ef13fee188075cf021745a8101767aba5625737dbe81f7865797ba261c60a58f48a7f8d0ecee10beaa83fd967b123c13152469946a10e80cbd3906d30086f60ff311bf0e4bc487ef6e9075051b6775f6642a1a1f8562e0c55fd8f0330878e3980cafc0e09b18df3cca9d63bf21380da66431fbe9e1337932da4f30d8329e5327ac98d3a8285152fec07a54d0e5a75662c4389457f5b2f0e289209492c9fcbdb27208062e6f7786b1020d0850120624d8cc79f08b412b539f689e08a15f61e4b7f0ab63a952f2d9e5e80b95e7a146541d3dd57d4deac76ecf57dbff815ffbcd7b834c2ca933ab5a66a06ab08754d0072b9ad69872a169f051029d22bf06b2cbc23b4845e83c6f100bdd7a05b2142d40bc4926356e7ce4aca18cf8397c1047e32526a7e74290e16f2dd75d81d1410e7074151b197c2595826147b42952ef4bebd379f7755497b1419e2e1065feb914541d9a6a3852ced3ee8e11119a69c7fedab3a523e1b59c001df8d9793442e32418c8a84c963a2357f195859fe839af3170bcf4fb71fa3ed215eb376325323d8aad9f30e70696459fede453c505ac6d6d7a8d80a444cbcd918c015939c4c67c1ccec44df4c67a92049d805cd3715cef5f33673771406465552015e861b56fd933bc5abb074e109dde07d12b59bacbd70b8190a8aed9874580ce2abfb34b9b39f4c80890218e44281aa090839c4ad1058f70305537eebd38f955576998ff7ecd180e741063f027236b404a181959143e190e318c989a988c2c8a06f082d5e2ed94713782428ff3fd693c449811bb8040e1ebb2aea91136b1a04253077b4a7afeb4330b91a26b04c7a95abd80cf5da8531a0711a4390947372971162614bb822f4e24980d6573fa88c56967722c12c1901316723780acf6fa67b2a4de0c85236e3486717ee4107f88d6f62c564ad4b4c07126c05ffbe783bce2f663851588ff6ac3485e2bc9e8abc8450c4ae2896458dae71fc9580e3c933bf9490ff8b78566d9ef36281bc09a778fb5117349fba4f3f792cc15c42e8df1f04a672a01792c6c50cc982c861e99e4165f55dee0d37033bb6893e87e2020effce1fb606cf90b551214f040c201aa2e4811b325ba7af22d11e83b019a6fcc8efc5d06061b15012a619a8192e7889389a3e4ea119e8e3cc0377d9676c14e21f34833b9a4a903d84c1ffe98fd2aa4a6e2da30c51d41e9a204205551ccd54b7f77402271d8502bd01dcc0118cbbf6d0be5c5be2e144333b82760f112683813195055d80525736e5a2a67569f094e21dd2ff9d9aa0f8cc4939c63445356b02182ee8242f126d97e7a52a68702dcee626d06a711b489593cfa77045e9c8efe5fbc5904e54013a4944f1efd0d08258949574d2dc8a370f97594f3ac9fc415e465949a8755e4f0add4803f02d7b0b13a7deeaafd3c5b3705a88b95ec24918f8f374916c4c106044d34d5dd4d51775e4ee0d05f656f64204f9649f7370023387234172cc6540310211bba5a434044d6fb2d3b5cf14ad65f9c935252df51daa0d6d22073c536e003a5dd16cecdc1b774ded9b93c033524c9aaa2da207d849a3d232ce9110e9d3146b7bb01a9c2bd04af3f28608207c20c332b8e89e31aee5140c2c6751fb7b2d6e75995ae4caaec728cdb4940e3da7e0ec68130f5342027860cade0b11ca7049e07cf26747b0d0935334d5ec2ac5fcd44024794fabd7bd2c270117f9b315f872fdea63ed4bd54b7b9571b11008f8bc35eeb0a6d20131f7db968a06940d4cebd2c3919bef165a609f6a7d7eb2f5fe18e547931e769610203f846faf67033b76c3ce9ba70a9e52e9f0d588f1113b2e76a4e6267d6553b134e96bf0b2a40ad812aa8367a5894c768d0c7241dc617aca62b6f11036a05e51265ec967518e2d62cc36947aed16bf82864d33db7815e6947c9d2730cd8631671976c2939e50a57d75a0959f85ee25fa06bbe5415796112ede653ecfc156741e023b7f572c5db03b80a4480cd5b7c515e7e215491a5caf6225075cac098ff41212b1ce7fb0fadd7f19c34905bf571a620f9f91d9a8bff6277f936c0f7b4f2f8a02b2a9af1fbea5878820ef081e4fa38aa16f7be3676f62d81623802269a6b44aa1b54cda1bcd20cb0a939ba102e3baadebd0789d0e2b935eca66f3abf5a4578ec38a61094797f8d835f7bd8ce830882dd7ae6fb75b899b0bf525674b5f1bffe8f8c0a545010bde9fb1602936b76575231d1f0374fabfe70849cc1dbf7f0c751749f3f107922dcd78dd9d9a8f02443e7f94e59a389e5e4a7d4e5735d963a10727615e45ff492b522e3bb11823399affd8ed87bc682413b13d45ac6a0af2838792da1b9d875e972bd4c2cba61602b8eb7264ad28b694ddce602c2e20046c01092300a2406afe9e1be20083f89c57474d657c39adb65e81313a8953dc1484f19e2a9f268ab0ebdc444d4b7ca1bc1c43269c8429c2ea709eb8093c2ab8b98e9d18f922d59b6b72731492ff8d5bc4bc4f044b56f67dbdcb78aa3f4710e905a9f05835ae19ef34592dcd6f2e673e34ee7602090d3025561ba863511890c0a45c70b0792009b44ac8563e25835c21a6131daa0e6d826a8f28411f691058a6490f3ad1897b7e50fd2ce5829910202b9ec8d6504ee0e5ff0e5505b979c73d371a9a9f16ae81a957b5aa7280578c44c6413698c0c439a7ba4a5c2844c0d421b77a084da763a384e8c17e7336bc53d4222951135f6308e55e34d4b81c1e8e86b8a5fcaa4b8b62b4d81c7a8d69fa351f1b40b7c355c2fa6db67b7b8fbbe5723f6342775e904aebadbb17863e528ab2097a8bfabed1d95b75d2e35e922b3cfb1cbd353b6c5c196d2f5167b6bbb174135c095d57ebab78e62eec9cb61f9631d5c65381efae4b0fb0829bc0689a2b38c2a3e472ad72066393c47be60a775a1d6294b471d08c8211ddec7af0ac6f698c3b039ef313fc290c1c131f38462a76cc5b92d5837dafbcf10a3ec010a6b574251f36a5e350b0c0b401a1b07c1050f4334d5f773c4a0a2ad77394d7de93e749930bfeca6bb4cab3d594cb00e635dbe5996ccbe5c8f2fa55f41dbad8cc6ecf098e120b791d17f2b0ec29412c13c0bd39b6d2041118952532136c766aa2f611db284473a02084a80ee63013b46caf396d8e1418e53043938d8819ece30542cb1a2f09ced678597275e39a1ebcd2b26b1d138705ace214e0559cb55ad24d49c22f8b17cea35cce0bacdb96a52d258d80426d651127638ba54f8320674851b1c6586827220de439733fdecc35fe0801eb0aa070145966c77fdc10fab8603c1df521966d0d1c74975d36bc8f2fd32fdbfd545d90ba0ca7fc8e0b13718301ee71d44866f6c4e3c61a66f57cc795f3c324302c67c759c5e6b8201a607ffddd057d860876ef8ec10e7fd257909d3d1bc79b4548769dde8af075951ce7ab0209050da15d27f2c47c76cab5f3ba3d9fc6356ffe6ce3b225bedd51c36f9f7bb7dc813d6bdcaf48739f57a042099358a07018113a739d6fde3d5f96ed6153466a2ee3c7746e7ace89a14e0eb8f7632287d5f03d8e4354559dcbeb4cc66bdd1a52dc1eafeeb45223ac97fe9ddef8aa6efc3b33bb584f520e25cd74232cf07960b2b28e40e8ec609ca670b33ddb2290e90b00219a6718564d341a12a14466652d0e28409ab855a7ba7de8fcc85cec2aa15702effbf6eeeebd52ab73db7d8e5aa0c988f9982010a5a1089efef44d9c41d6f3551dc36a5d929f00e88ea91b18eac74749a69a5d3d1eb85d7a8eafa269bad3dcd36ed0a2d0d52a42af300aa223d1d491570191df0116578348055a2f354ff86ef51c7a49ff6ef6af6f7be5d0a1b489c81245a703eb01eed0cac021910b3ee6cfd5021929f561588d0db10c6611d186c0ee08ab7efd53cf4e353233f4f7e0a1a81d566326aced3478bd3c0d70c0395fa341ae32bd5a1aa6652253c4663e0cf810fffe471eae4819252173e2975a848c373faafa8c5e3e8260f098e6430c8dcbb3722d83a5d5097fd7b27e72fb0524c6d4daa47bf53fe275b20379c45cb796713ac9375416cb68614c42a5bbb8de564ef1427b339cbc8265e83cf239be606ee5b4f8c9981b6f396d359ff894c1576189138a4c574c626d1c9b809c036cd3eb7a0728aeee28b2a23d2355808395b45184e5dfd606d416e2682408a8927daba36ee9ae01694bb21edd32213fab99205ba8064427a13ef9e73864bd76f8fa191174dd830a9590852314c6fdbdd1d659a006f1bac45f4ce71cd2d910a19d778e2421da3fb7f81731fae28d6068ffc3bd1fcee28ab4e66712020abc9517ff6ad8ed93c3bc09b8d760ab78d614c27449443db2b1f5ffe9d585ffe7752400a5830a852f9c4d1807bd1c65bc4bbeca9b8416115bb3471fdd67e9e50027b8f3141a8682e7300a34aa667abb40f9f0f592e207e26bde2b8e5e42fc50f15ff8dfdb9466d0074cf46bbbcecbb5806494c6f8859965970c20953cb86a870ca5bfd8b7959c7a96da4a254c1664af560e3d94d6f42cd8951e753a9517ac955b511fcf6a583a3e37f246fb02f9d9ebacd189fcd59ccb70aded7fd29453a1c42d742ab113e9c12c75fefe0805272b0fa21332da7472024b0b57fb7deaeab13dacbb803f6eee27e2c829b893c2f62b1f337d32c5472f278eb8601981a67d9082c3a326b90514d5e11e18a423dd594c7fedb3ccb963ab2cacacd42996ca1bd279ce00b15870d5a70fd63bf9e0e71316f64e8639f9f6799064aa702c5d30f9227e5d20e631cb1867738f0f00c1b0144dd040e4e543dbce8789bdf23706f1cdf32972c9880fde9a0759d4ba36d49102e8da790a58e21e2c3b68527f6a718e5b51961dffdfb81319134a96e74bc84cf521b84c01f0d09936c08e87554e0d5165f827823841e7c242a86959effd761ff574fef02ad3d391e1f93441f3a0a424ea9cf0df6c528a8d52f781d70b33cd0ff0be2e0d4be2eda3d2d3575b15c9ab911804f5f2867a7e5e936e5f15215a3d207a6dc84cb085054d81f85030d93cdeffcb44a282eac326f4e2bdbac70650b53febfa13496490857e7756d064134ae2eb1d9cda8847961a9d86fdec4b7242bd448a806f416d0b283f04989e786aa349e4241f6f7321dd33e022ce493a566c984168d124023a157d29d03a4192d8e12433377576b79d2c43fef677c398d0238b87c049ea15aa753e0035d366e8e07af580e7c08d54770061fb786bc26e4e67c069be91a9c81873b517516148d4980d0569db04485031af290d217649b728c7580801ca7354d4b629d1ac04cc36730aaa1e6012f03ebdee34d9beb6099ca899d054a6d1b451fa4fc1a1bebeb8cd9e82fca947ec62edf8d6d53e847019ae504bcc06adf9c19f64b9f44104fd55c0f0b73388e47b5996dbdce532c11c1eb4848ce556d106cdeb4f505718bdb7914b3e680032b84af2c1bd38bbc307723f3b3bee32be1c72c3e254ef3bccae0ae8251098d047e1f7d2d90cc2b0fbbd829b37fde62086cdff25d87cef6706b0d9fe1e41cd7b7f3300cbf6ff0868dff59b83586cbfb7071423d39ca301e61b9518034a9f46f933658f478cbf685c4408af6ade7c27899ac1a8e32bf0caf8eaa7a53da0f7255e182c137a7295eb7be3067b1e46981af57bddbaf7e232f2818db64b2b85ee0ae1300128862b3b7672c23b154ee0f4ecce5b343d7db28f9da406c555eccb0c4c5fc55b4a00cd8e90844b64606d0dc5cee5fe7ece94b9e88b5d45570b130ba034ef2909256cea4ed520f8c133b5ae8e62b1bd9351955e1c88436886932dea7f48738d44ac5335b9b2f83fe91472fb87eb10f2fd9eeb90bc9eb64dccf33ac8ddf7385e09e766b568048ac77c61eb4f6fbe081a0705996c77a828a487e7771891c018048f5bd4952e7f9f9eaa5de7a2241da6d35a17df407255ef856f66597716715e3130d2c36473681b9a468a518b7df9647a99974b8d444bd8f0e14eb38753e3383c7ca4030d85c73c5d0a4f2355740bc82ed148cddf4e4f95043c349709ad5895eea6bcbb5ba254f08b8c80b0018bde55f2ef97607243712e3a77c2d74e47684666ed16502bae4ca157bed7ff768396428289d8d964c9b0438130543e35afc7d6e5b2ac22582637c79dc021b787228ee7044c92e2cb9e87f78e4c7e4abc02d5a04bfc3119e484151a7f99b53af0651c250d4067a92658e743f04da4de4206c9808777671d22baadd37590c188677f12fb4991c37f8376700a534fbc1fd15a2ef83d7893bf582c2090b358fc71372d6a7a3293f14e434b4a27ccb315f3ed53a7f0badded64a70278bdb14d49533689a8792ab654d8f055c97daf3085875d129ed0ad172d02e44616c609bb8dbbbdd98b13a181a028cbcc6601cc95808679b423087a6e7fa33e832040695fe8a06c08e877f3ed4407df9d1ae330bc1d8036f10c027c3f29876778d8029d0837b93bf3a6d50516f2f8d358b7a2a57f2ea063dd103aba3296c4449cb9627d0483dfb1b0a7378b33dde07b0daeda48e6dce009f95180400f5f026172fc4bf7630e63140ad4d91a8c6d646d370426a111ebf75dc7c04a5082bde09802db769782e22a3835be115c7d00a70e79f370df6f5c79ab1212ecd5f190387dc189302ba8f8f86ba5d3e8d352ea03b2c2eee90923a697dad899e99b4071cb842c3fffe699db0fdf226e42b514616c706be77afce25b289a482cf31657ce16090c785740cf5ebec425c7baf9c2809e2124d06230efce0046348a0e074d6a971c71677092b05563d35a2433aeb784e396a4efa5a7d3d68ae02deecc302aad7671b80cc0dfc1f9fbef75c9046af9c1fe2259cca0d1d7a0c2f7c17079d9d1878478e288b36967894bde2509ee0699aa85087be868349b4f1265df66f693b81830813031a90f5bc830cdb910eaeece3733c3982669a01550673bfdf441b7752769c0cda26b902d44bfc4349f5f53678203b16a6b0915811ae106086c53e91d3f12a7d8520b5f20fede96aa885084948063127162125408b40557fabeb1b0a95a2898526935143c5e423fff817c3ccef857d35815241f175a6079d4b1c1edd088dde4a271eb6f3f7601bb6628a4690ec7c32523b349d58723eb791faf552dc659cedbede825d67c4a43dba76f973ebee3af4f2407490f7fc97be0d79b2a1463f40955d3ed2486e00c4595e5f1d2a34e4c1a451d8a675b4d860f5b35c621af1c1f309a8abc4a5f844e5ba209da4312187d3b088c5b5ba68eafed9e5f331a856e492fabbded635b0add2555925afa4da87b063d1ca717ad059e6076f8da0d0276c8e19c2ead6076662ba0d6d4993b8ce6c8b738acd0ece27480d0db415d15e4388dbfac303b0db084da51e289b5d01997c44780cf47078757aefb52861a48c6e9d4f91391f57dcc1dec96129d6ee13695981bbb300fbe4ff6ff1b32340d6139c52af84eb83d6fb96b3c8d88a28961d9019704451ab1aece331ee87d75388b4760b79210fe86faa9a42e29a5688721174cb75aa44c30881642a38d4e7d5bf1279dbbc02e26d7a00cdf4de6c6590b69d0002eb1eeb132630030df06261b86a13fb2ab0940d50c460a9f9c0aa1b9e4770c68bdbac9310b530912554960b8cec901461918c55976a79ff3e77d3a2e54c3d340d504c68c67c13349aed262cba9de516a464323d24a084195e957a6770e5c4f22d20479ebd182c4586d9358240c43ca562d3c1a551b31eb32985289414c526f0d9bbdc02723a42b3668b3762ea6702ffdc083aebca7e3aaa66824ff1921592d0eeb1abe41e280f213ea8754abc07f77f565a671a05b305f02703f4c5d1d61cdff79ffb14ffa2edee75ddd514837eb493a749a1f08be1bd1a2f4a67e41bce8163d267d704a97154d04f8de058a5f2f6c6ee0aa640edae4885789fc2ac86cd7407f79b6e4735916ae83e13c3c7c869b3c22638d7035fa2f9e0a58b8a238af580fceb9c0ef8e08a38f29fe255f2116af5c8f53eb933d2f0c4280a0859717b3d9fef01d6b9a7cacd3f0a6f25fc6cbf4cedcc3824ef7ad12b1599a4adb6612c03b69b388e9be198c10ef121e50d02bf4715357af866cfbb3d7ad454df1ce74840a6cd7ef5d7c1f4e8d5b494c4afff1973a39164c142432a24529ccd4702734438b1c9f6b7636a383d0b1729913a1d91c8d68fb585ac263f47ed71e9ba477de8b781c8c7897060396021cdad131168a17d6c9ce245f2ebed2224157bf79c36f550268961922c3a3c8a2497b44f6706174f4555f0147a9d926f967a51249cd6d50fab4e6be425a4cd4ae7c566dbc1fc6bc6c0861072ffc14f3bb01f9ed6274b7174057021e9ad60b8e1f805c87f333d3c83e9bb16b5cb60b00cb09f9d74be725927e5a74f63f778fb0f83eec38f99444823dc27f75ce592019588213037bce147cafac57699b9c701f4f1173f9730e99e7859e262c1de38822b3c1bcd94e5cd053b8962ee279040773dbc0e90a02aa9fab27355f3efedb96f0b634aa00bd8968f7402c39b5ac0001f2995fcda293e2bd9b8486338095b29e7a6228ff54ca323b6f11cf16fbd9bfd5a8c8fdb5054d8b2e5103ce48436affdb34328680cb63439afa914fd0b98647753638dc1642c2726f2daaddefe04ef2a6a132223f26afe164edc87a8d51e1a49ac06f628cbbd639341c569891b7f21b6f45cc5a52458e0f8ec6faf19c9767135b5d4ac984f59cd9333e629867c20576f06411532ddae75b2895251878d49145dbeba13aee926d5eaa25d335b504c1b852e132b58ec40559345dd902cba22f6bfaf5cef29ded0f61713ea6848eab1abc177c01b11f794b2e60de88e93fd180b153211d3d5abb1809f863113f369c9603ba86e42b844806c8f4d4ac84375aad38a0185e452eaadece16725bcd3082a9a1deae1c7c20e70690a989a4ead9567a4d01772be12000c78bd656c46616c9b5eaccbba2f4a2686a7397837dc837e89c441dbef5dc0104f67216df9d1293967fdd37a3531ca7b3f89da5f46b21eeb1411a10b33e6f99ac06122f23e679cb70898fd883cfd8e2cd4e01aea47af238d1e2aa7cda15be4833d45784cb0c0e72be9eb808a972dec011bb1b7c5c80c65a722e9d86257369d1e5cb44d4e62a952ddf3b26ea86ea73ce9cd12178c26f2121de5aeac2fe7ce6c5a0ac8475ce391e865ab59c7019add86e6fa259e33dc74e44491f958c004a3d1d8ae0aa1419e3416d80b7658bb96d60521ba27fae8f2f90a0f01c844bc82ce7ba73ac933053430f81ba9f68b392326f345a935de4accf1beedb58873547327392d31a4c66b7aff34fd37f8c630b2b4db08fc1b4fc8bbc9503d33abdcd35f01c58df1d18f5707fd9d4fde68423ab850d3c28b8f96a0a79cabf85525820bf792f837e598af646a5fbe24a13effd5b20545c01470a6592799be48e5d0641a183e752fa7a992fba7fa794c9054203310f5c0821d30969b7655c888f225534ddced5233e136b68cf42d9599764b5bc6794181d32a45ccfe155f4dd5618d7826f89fe90ab48b1a3250bf0eaf0d8ee9327d3e68abae71b39c620ba2a9d7c98c28310160ae9527db9836fa0a518d1233f5373c91ab7d351068a0c8b084347a1c5cb2f99de4451787ec6cbc0ee0ec2f8e636b8eb000694ddd66ba8ad28d703336b272be12ed4f1388b28cd8ae6fd117b6c002b82ca933aea2f616363250a7ea33b57e2e6723a8bfcdacd2a7d77bd680c206cf5ee3ddb2526c186b85308571effe476fcf2e4b56014da71a571511fd271dce563d2201c34994ef3fcf677b0cbde43dc525117b10280efb7b6a2ac6f465751779b2e3a868b6d8bc88c2fc365cb8edcc2401d2233c74fb4b5b704a79772e64cf9dad4721f0dc20be9a2f10bc784ab4ad8f4109df0324de9a8dbbbd28aae44f9052eba18f6428ee58503d5cb5499029f0188338e41838f7d598aeb3d196bbc10879f70859be7e630948e1bdcdf403755fcbf51a0425d92d3161cbd622402d0832a7787616d7b319587ed06feaeaaea23feca7a40871c81153e0d214e5f99d2d72b3f75cf9ac109ef2f08d25467ffd6f453cdab4eac3e8f901b92ecdddf37d167882aa0f3580ae7ef9c303be7a65aaf90df717338fe9bb2fdeb363bc31aacd7010ebce5df9b13a86a60defe1d3762ce7eef1b71ed5f38b08f91ae2eced9a662bb72959beb8d49418b332a69e14bf72241df9a6da854658399d79239322eebf3ff7e2608a7d6d4189699d3ee506e67203fae32fe9f672d9b77306e0aa8a91a26e0d543c52caf5421ec1e3b43fcb82eaa68306435d4214aac40b749f6f0aad57030496cf8cab92fcab53b5ab0a292d8ef19b8e577b7a25634f30b7cd8cbfa81687a0770556a18851baad0abfd25d63247cca3a9e1418d69834c91e26cab0b20b280670f6505dbb8cc45ab30d0883807b335e8f36bab0b43d58df36eb1e748462efcc50257552aa815884fb9cc52d60c71a136ff17572aa828d2b558ba41d4a9bbb08a21b654dac370c9f30d9f4b48ebc04acde0d4466bf2fc81e3633b0e56beb014de2b2a8ee32494b3799f59f389a41dd7acdcf8fb9bf74b327a4cbda03b40c1a11aa7c1b2cbb2fa69379815718a464631f3aee02c181583e8bc4b5c38efffb2fff46f974c228b7a66ce29599c55aa1d234914de67ff661ed2004f9395e7fe950173c16452c12eb4b062691c4b8df195a35e9310992012b262e31c4d621443a470fe40837a3ecd863fe37d4a8d4f09353854f836ac893750770f38ad4fb6d654ba58c276e16eefd68a1b08bc408825489e22991981d99d99defad6d3a43fdc48ed84b313bb81d97cfe396a57671df4d4e51d78e83b0f7fe8b8076ff4ee234e860f523fc1ca4081a1ec6038fd281519e2b114f006eafd945dc3594fa5c210ed0fe9b69b52c7f714d89bb09d8789eda761f57e9e902dd3481fa31472d20167a6012e4669a2a48362640af97059cd8a99438e310d92494a5a660e34631a76cfa4efc3d4d0f7345427740f3810ce36b64c55aa1670d027db20a3aaa481c08176b6c1355569c180835a650b9ba82b9c001a62bd3e889a458266e7446d7801cbe6a3127f2c81069f3b6f4d8a00c3dadfd2a629b3e4d36a3d146ab451544409f8c795c3f9247c888490b14dc0f185c1d6822c38f8ae7d99b03039993186c20a21c39d5378a3400616b469bf26589866e6184389428829ed04838bce9262810d366a41ed3dc69cb7a108282d10d8b1a3d34f1e6d33930fc6e44d21bac483f181742ad9112058bb5b6a3f6399caab1d0d3d9faa2c1fcfdd36f658cb98ab26443c88c41e6ae7144411ca2962334b794c3afac1464f3d573a5aa9452a419f99dd45adc607b7e47c9e6abfe5561b9b8a46161ba4b59f05fd48fb4cca2d0815d9e70fe9d8b727c8953bc21c8f7193db559b4321d80663002fa75db3a28ff7ba25fc824edc226b5a5aff946327ad785a607a2091fa60f5f238146309c74e6e4c0614f034c11d24e1a96d67a5cfa3102b5c526eb621312f16fa0c2aba6cccc376a1668f5db80d74e7a69b8c71b9af0f32e61a171d9411ba4ea19a4b959d1c182cee9cf1971a928b009fd80c65ef3937908d3ae4bf0cffce0e90a14c90c8d4c28fb106a5da4f6358c8de808d1d81a9c6a5fac83c1af47fa61b5c1a749fa6998cbbd480eda5007513f2c20c2f86531e2415fa593799686dc5b6809f3596ec3fd729d5d34c8744b75ca6d4ca8b0090f8db9fd721db83dc59e6d6e9532897f4754125a525ad32b12772bf9df6846a6c6f70f0e6a0ad5e9de9b9bdda080702e00d2fc02268283a61045c075addc347a70b05df9d7a274c0870ac7b45fe06da5064960d1577cf498c1632f78a75c5b81535848959165aa539f03bc197ad09fd56a41c34b450777ccf92a88662935b98138ed6a568f098f1b1fe9ee86b0121f631560670c4b659a5a9f8b37d49a722b76c970cc0528e464df435f46ba5ae2a648991890c248f159074e301cd6410317e8ede5d48de05552dbce39f6ffb8a494b24c4f67797534e94de9261c21784ce72255ae03265cd6edc25d33df94a38517aeae06f8d05904dde762f95a532f3f289aade41f518b9a3b9fa784edef2334641fd817c2b7b07b1f2cd61b0033c85312e4693f42ca45cb78f235012d1659c395a0fd3b7c16b991647f58b6282c2241f8b44cc46cf3a4b1bc4b5397ea7cf9157229e7394066bdad09c0f0df1853a9d761124cb82a7129401e68ba67a0f33313c47ac78023b5efde170d1ba89247b657686cc7bafde5e865f9ea0b21afe74c3246b0f6da082aba97d9da2fd33b7a1c1c0a47d092dab748e58d54e0dee8eae536f77848b5836905a1b9582c31f75e3deacb17a22c8d18e4091b58b26ce7f5f6dacf2666e029d2bea2431b95c21a08b5a20eb1ceed43db449e454b296a18e53e2a25b616f38fe54be539d56f7e3a6e92256a22d270e1e4df8ff4d088d953317156c777c1ab09bce25ded3b7e2019080f1804d2b2766894218c51dcb6e0f515eec490dd169c70f84f30a8897a1024518e1e6301e35e7a92a2aecd268a3a8d5507e9d970aa24316f492f3e655a2e4f2ca1def252bc427aff3eda89cc4f98ebcd2a6e425d73479d55e535e492f2f46f806b3053ea31d715f3b0552530e023c7da47152f3f55c2d045b1dcfd9399208dfc8cfdf3d1766055e04595479c165894ff6e076a052e8a0876dcdd0497f66aea50afeee953add8b8e641a9c8494c74717f0b54ca397794be915495cc0373aea7cf2b22b5eea15183396075f98bdfb30c60a0078146737b4ea348ab2d4c881e5c7c1f1dc4bd0f28ecb65ed584133872840fb7a72b5afbfa5e425d573a2141e8a18da77065960eba8414f75fc742bdc638cff96a550d484e984c417e98c5961495f1d5ae81d03a0f6fdd19bc8af57cae63d508a8337f148531e1da0393b5d3183179e1d3c6f2344ac130bf4c04c5becae98e70a300a5e7df7b1b08cee5d76a6771913da2e83a32ccd2d51535e28dc6241752f85b71b5d84fb2cb305a1761184ad4c1f5ea0dd52d672a107813cb6a0bfd8b26396bcbe09731989d0f2cff55cf6a0fdd8a2b242de26b3049419875523ecaae138baf5308883dd23213e3532bb260d1815223bf047dbf668a2576ccb7f2aec7f24fd37f73c3649e74cf159659dea29b35de2e05c39ff902c8cee72d4861c50b137fe75ae67e99d537f4d571c45d33b03c4032c5115344d0d42db896ad1d7fc8ec8a85d06c7514a8287b0fd9a04e7aede1b619752a0ea7befbb2536534e54a7372bd4b37ff33b2bf3719716f7da2e899a57dfe3f278c9213576a53e53d71dd8cb4fe2368b3285059c005cb1ee446c651e9470593c97949dd5c65ae5ab9aa47532e1515ee6207be7443cdc2391398d68a947aff161df0d6ed39db4464968288fd7762c1d92dd0c6faeedeb5e4d3d821f46d323b028a944b972033ab7fe886418c158ce79b09b651281544c003cb05b755f6b2591a5965001327bfcc433f86a324e0dc35296a38b273e7ad055d393508dbb327ed2e2fe5c9e1d3cb9867db8c56f474f4936c7d1f05abf9f4dd936ab4145e644683699dd42c878ad2dce3c7f4b479c501f520dc7520b71bbd4613f9cf335e57749c58394f99fa2ea7be0b941d4fd6204925a4e032bae3e052c5a16977663c7eaf1702354d77e43fb0b2a1bd3510d5742fb0eaa4700ec1bd57dc4b1fce8d6cba557058ef38eee78a1d46340f70bb4449370c3ab700afe6ce3989d4a0ef4c71063f5141cb9669937cd960d07451e0f024ca50b3a1c94ac1dc9a7e3c5aca74550c3f68ab48535d4f5d001e7ec3e1cd2e1b8c11a57a5a410e8eb77445ad6c22b0b700507fb39dfa4f71275df537df98efcf410c0ce196d9e4daa00d9da7d05b309fc7e5e40f4ea5f880c642b6244dc02a866361836234fa233b71a6d09a00e2a809ead19bac41dbc67390176114c851b75cb4313a5308194943fa25c80ecf8d0973903a41e536f54721300327cfba4681cc09201e6239625fdd68f87f3210074ceb643e57e863328a8c8a9e2adfa437cc2d2a8da1e8d971737f7870f74516548f93dbb4ee2a68b82f4753ba6a590e7180141ee5e2e58b1496e244a068a467fc49471f2a7e7f4c69031dab1e1413ae417cae6a98041d86776827e203166cf2934a633a5461ed256107d3dff9b12fa7122dafb1e69345480856ed0f20922ff60eb21df1bb9f10acf9725b6a4d7d91268f3588ce525b8ad0f00db26a5fa7fa1055ce7689c0544990bae03cfc07e1a971ec9230259e11198988a276e1c8353609a5b72604309a13535ebc8b577634d9f22a2ead406be786266136d7bc99a1ffa01e763c108fc0615ba2db4c5b059d6840f7c8d394617c8a889fb3a80f73f5b9ab04e521e2225bec14aff8a6986471683c31b926462220ca8d9e7fa13d72deeb6d282cc21722ad2da00b4f1801d26d9f17938bb6f8fb3751b4e61207ae3a66632a623dc42039ab13a294eaf64b03955ead407d14931322ad7f7da4305e66ea90ad494a8e8ec0e311c4e12386f2b6290f9afc9343bebbb035a575cc851457607cb362920c68cac42cb5bdef6d9b7baab408cc0ae3719a4c58e833b2eb37f020e04d69a7474291f835caddd243c86fc05364359a18d203f5ab289b9ae2cb2fc7c6be673e3d38b300c1234c27406b7283a9c52a3d131a8dbf8363e7d4b5b3a32ae114839485df4a8c51ab6b0746d52f366640da6938a31bb8b8644074cb21e7a5da8bbf1a789235aedb53df88ed2c16f3ebe4c07ceef1ea6d0c57f0247d041e74bae810249f7333f860e5ee3a317c5b12a6007eb388b4eee9fdc4f4047e66103bed135c341735a4d2d462507ca603fca08b4d7e6f9d3578e59e3157253bc2240e30dc02dc4f44fda40e7553c11b50d0ce719045bcc05e99cbbf493927bbc856e21107a5c9da3018e71853c4e39a144bb6fd35f52b663553b464e808e41155e5bd629849e2e9a9ea4738614462746dbe1e5d80d591cd400cd8e1b929abab68569cb04310bcdd6928bf818b032dfc23be4d3b3c50831a5c2c1e574452a669905c5bffd61514117ada2f71d6db32f51ca9891c1a8d75dca52778547eb0873ccc6dde2877d3ead3e41dd1369f8a198cb7331e0ec15be6d79d0f7a2e386d890b7c9f1e419fe2c055c340665445e9703a3e083c770929c97e74c1d6971683b2a8f9a4d09d522d774f092da0cda7770cb4ed57bbf255620824b9a60e204661c1b7a04be85b00152d610ade7b375e5172aa852c56bb861ea6b200f1779c1c8f4e0f65e1fa27eed03c91b3fecdb91aeac20632bbeecccadb7b5a4a249b0ca85fd1cfb4bd246ca9d3daa69ba755987d83a961485ca1a838ed18bf9e120ec6259222284a21963f48d91fd094e24839abb136dddcc0b6ac6ec8b0dcc0d8fc5cd7c8ce93c7d4834caf091ca9f4b75d00ba06fd1a4903eeb1df894e686bac59aa224a133d2eb6cb6e0ffd43380ebc51c433bc7982ea69832def4161c3cfd7bcbd39531974f2c2481dfb99579d8ea68b319ccb9e229dc2391fd1503eab0c168bb5bc453bc0a655e17283e88b8d3144121447752ed6a020d0a9ed5cf9c8f96ddc02f1ec33faa0cb9f1aeabc2ac8b9f9498e3291d45c650c0918f3d2588d6f8829bc633af2ca1008e7841d4ff7569ef89fc3aaf9b78b54646f725f36670b07dd3b51efc564999a2f0e888b9aee1febb42f0d25b75a8e69d782d1b84fd1a42d82f1e89d478c6935893010416eaea26a137e2239d21cebdcf75c2fa2666bd2b5e85f6a975507f1daebb3e1e62c76b927bc1c10168a0b857d03852129466d223f8b5b91825ba843c59b26b6c05f2266488a0a993eda6754d9662fd363ed51918b4dfe100fa7a09f91580e81b757e4d1e51bcbb1689552ba3b497a1fbd9ac5f2e4eabe1fca0df1f60e1aff86cf6ac008878bf299376f1f30c4ed592d5fd7c54ba9cf6a4c8a72f5fd4951f263dac02eaee29b059d8e57f18ee1db5027abca2ebd108470edc42170e30966bdfb7b84913ab48edaae3ba9eff5d59f5b578cbfe618d475394ca246bb253fedf598da2ce729c36878035c4712e3127a829c7910b30d1043395174535b4b145e2df72da433caa71f738a2377c752bd4ddc4680c2dd5c6591dba419759c9fdbd8f82a84180ce2cbb6285dd52a5dd2ac7eada7070c6df6af0da29d4bca05cf0b441e79f4f2fb04f6385e2b988a6c0f618fa62ebc0135cc0a4b7a16e0dc271d160c18280ccbcf24f2fa3e3f45faa861277a5639012baf04af35a3b9a7a43dbae302e79b80d7b9e642fde882a9ac1b3d9bc88bb4998a885619ab5cb7c7960ea526978e4dc6a2b7b95527785c9a05e97cab5cdb179d604f6c7a7d20f80fe6e2d58a77a909d61fbeecc4ce1f44cbf926e5e5dc0a5e6e6e35fcfce693dcf721c029b64ff961fa2617078d9abbd3ccc37c76be33ed24295209ebe7dec39723e78497b4a2ad4934aff3ba214328073a38e318e4a46d0246d9297c8bfa95d3d8b125248209ee0d457ea0f47438f08fdf9cccc1883fd86b540e95fb775b0b834197437aa05f7af97620fa5b054609a72c3718a0bdbe63285db354e02b28f16fd9e47b46ff6d781f349f5a3f7f51be0a243aa8f26eab4fd6949a46741d37a2ba378213f75e23afab4bd8d5d32c91da32291468545a01f9a16ba48d3ecef063b2b884785cbcf8996f32e6f3995877b73cf93b895e43b1fae0f9c725ebdee39c0c8b0ee8e415f2091bdb18039958fbc3a08884cac7182639b43767a543eb08cb9ce384e597eeaf3bf0739f348467c38788f2664448723e63859e3d00d2a24b97964439ded3c0967f80fbcfbff38ed1deae501a417b820472a4a8ae1328100cf18a9284e8c3bc8ec2a2926d3e400c329b44eccf0fe47922c65e23fcf8b5d742481b64676661a6e2b1720048e0b898bbff6ebed7904a0cf8cee06c0a2f9c84c4d3394281042a8bde47ce9133df4075f72ea828a7d481545b5ea5722905acd95e58a313dc84ea94af6a5c96904feeedd2aa7d7fc0ec93b4404bf3b4893d3144752d2e404aa382507bd13eab01515013cd541753d87333d49c39affef264535c1e74090f3cb3d677de31dea1b93e2d77bb97b63d38ae7a1371f00055054bd2c19377a4404bbd14465aa0e3720e572705b4d8d7c7aeee5d78f03c0e75bcc79f9904821229a13719ab624ac466b67e5d8f0d8fbae7974ac13a26a40c1e3092e9536c5065352e9aaa7a33a2e8bc6bc826536825013eb3559e171334585132a67e9ee01ccf5c3ec92639b4d6e6b49c9c43646cf440f63be2db17526401b61b667cae963e56a1e0c4f60553c049513549ec3aad747eafcaa7d9042b48796527d0c0154ce548852955039f154f8819c32e5b4daa4b76991668660a9d8692bc129ccd995538854852dbc8e26d9a881923021c8e7023ea02d1e5fe06fec0302d50c10efb854524fb19c775606e6edfeef694517b553d3091975fe8d297ee38f941dd6a41f085864960f062345f048ea6b6e33a76ac8b83e7c9aed91b56237670242027e907ec071dbd5d327204576dd915e032248c2ccf6fa7ce9635d40a73c28d88601fe5eaa81aeeeaa04fc79d1655b08ef989a56f3c8a733a31163a707243df76903fb81d4e6bb1210ad71dd7a1cc8230e5f6e208b93503d2f5e0050de1a0ca98bfbf96b9d84d46e90a3b9578097ac53e01055c8b3b6cf5938d696381da9601084a32acc4b0057ede58752ebc4c0c46678ab4d065cbe226a93bd66952f118b59703e5d0da6229f411d605e99e190c780308aad24dfc02785cf853a71e4b0ad3628f053fd5b15843ac6f5b677650c5112e5bab50fc1bd19ba434894e72b0762cc0871dcfa3730107b89d960fc2d77e61424bb5e7d9c5adee0c9951964a603b0d9132ea34d734ba6e7a1118a2732b69e86fed8068c8197fbb0764db826e2973b8406f938173736655be7e19d28ce7d93c4f3b4ad62ed716d9d915fd086947940f74138a992e5a13901478a8e3beb6e7b766a058ec5b9e486696b657c53f4748b0327b652cc988c1369382e9b8d79de15740a594bb5635739348a75027109e1659b81f7dc62009ca68fcd25de8b4b0a5233db6b27186c5044f052c7489f790d9c05ae97f6a3bf08235d2fb2f30e3e2b985e164c73a2c3b45ce4e71f68168d7aaab1e0c53e265850405a7dd730e0893310c78918b52fc3c96946ab644e630cbb6e6d3bd88f24af07aa8260e11ffc7b4d0b9471075ceabed0fa719817787716db11aa14aafedfc11702304ece9578e033819c56e19ae9aad79cb7ce226acb71b8174cd6ea1e67ef2079d565ca92108e1c2727b9da701e053fb727e6a0fad0e9a2463648f6e4929a847769014752b2d9e302a988d07df3721e46c5fd47b3189f5ff47d9c774de0a7b30a24a0d7d5bf11b15c6e19295861bf97d933e5eec80d011a7dbe366aef094697ab3e397e59aa21dc44aa9e11ee8417730bd797ac43960c259e6d3ef922982e4c064f83504e672b5b3f10365f41e81526d18d0b907dfa89683e764bf581b4c5935ac47acac9a107cfe54c0cc961b99e7212fff5c433ab71066c082093a40ed1bc3ee5543825e318e905fa0fd3ac4ab407a3fa747ce80154e32332cebfa27f9ab77665a4ca79997491bcaaf075838339539057d1020ca7ab6ecaa9725e96724eb64d89b29004d8b4c0c98e8d0c9f70a03c304d9723cc0c1c2bc64d3692842a670b694e04865dc5bcc12223920f8132ffe0fc97ca000f9eeb9525b84ffabff8c701789d50d547cf3f5983ed55aa9c14b9619d6f4cea303f360075461c6eaa969c03d5a5f9e28354e64ee30c2c605f010a282918f3f18752e5646fbaad3d586198726a0b1335a5f290aaeace04b6e37dd65e3d08b46e69add9bc6bb0f8a420c782f5810c71062a09d723b207b8c778b7f80a79fd3ae4631a181f6e142fc05ae436d4030cb89e6877c2b28095cf1e0c2043c83a21775b4fa7b8170d5e949e7c04f04bdade499f24fc4281b768a2c722dfb2cfdd1036c5a48e32396b1f8e062ec8fd0549edf37d522769047712120692206032383779796832588c5a2364ea2d4fd083d4adef55c82c534b89f69de5f009b4c9368355b810cb209d3bdf8a009a46b865e244ba01424dcb1b7d4bb9304c82e52cc80f0e99a86e381844146ec6411eeee9db475e7dbb7063ec46bc0cbfa72447553def67ab9a9748351559384491f9c270a196d64cef42429536c7eb4c363693723ea393a49dbc2ba2d485a294229ac425e15c60826b001906eba297edd311e6b811378b4bcda14463a9638461e8fcf36124d984be3e47a47259722cd061f80bd9952f6a4febdeb14e7777624f611883a4f1cfc28874b5e42b38e01055406550728292f8dcf88c6450222b4e2705fbe25e2e421ca49a597eaebcec877b9d7fae5a3a9aad9d47192801ce5a68ab280ddcb1818826554339d451a5feb0dbd737b0bd052ae8c44b635e347c57cd164eed9133f37f6e66d5dd32e157b3216f05f22b8c00d4868085c5788c75b7e6143dadb8e687f3ec701948cafe641864cdd537147feacaefa41e745107be62278394a210f19b15269362e552016ad84de97051c2be50371d81207382dd2047200a15ab1e14bec50b0f6ad90685f8d338a5c43cae3198c6523ad0b5424e1397895f416fa02d0c63d035d907d0adb158382ae1f6078a8c5da3d816d05bb911b3eec059453ab46231485b40b718c3a750649abc2fc116d01bca7872966762604039e5e7778472142d9fc72dd71bab79388acd9c8922ebbf06e7e8927a2a73a095b531c061e16f2460c3326af60634b06c90cf1a02bd1c812a5c18c29cb488668cff04aad6eda9cab69e4aa09a68624a111328f1f14f55b93324285125b01a991e881459304ca62f451078a99190f392e945ced47a6996aa41f29eed68845f3ef16085f8db1b5df85f543d8fb7b9e0e58e5afeec059c2f98ddda4b300e4dc7dc2e18f5560aacc4f05e29fe97c181de209fa259264abc77a0468d9d7083fc8f283781008222ea35fd2b0ee60b8bfbf30db0d813e494c7f24208a66d040a021ad65c65093af478fa6a22983e7e3ef3489b15d039b79bd0b1aa548942f47ce02a340760050fe3b11b25e03a66833f3b6cba9509f0c94da9f4d582154a6e69b3035a9cc6481b63777a4c9a4de9d274170c642af788e0de31d70be4dd6ca9de7a1dbdca8a74797c36acb9f55af9a31255a4a52002c380448cb70011f215a686d873ae4d3f11f221a7c23502d995c95970c286260383c4d7fd68d3cd2bcea28aa866c76bf7f9d87e9c9e2b09ebb0895c85dd0c4eb074678c4a293adbe1184d46722974386513f4a7946f6ba5be1b5a484d7810bf54c5fbe1c3ab77e1ef7c40faa1eb3debbdb0422f743e3e9aa4883f70e5e71fde35ff37e862cbfb8c5ea17865c03986f526cd4afe4cccda8fd3fa02afd2fe4925c8a49ae26c757d3bd934ff085345d3ee69417a43f78bccf7ef0d16af2c8a5930e7e5bc4fbf1eb60aa9c308a973bf06ff45de931019e0cfc853dcae8e655b18d35a08acb3e667efefb57fc641358635aa5ab720dedebc0f2ebcfc35d06893f810bd10fe9749afa3ffcd3118011c2f13e8cdbbde79eed00f0a25bcf36d5551b90e39a56929dd99c08f41a85f232755f3ebacde3826350ad9df9e380a3c8cf7f86bebc69acfa84db7295e551d7112a0281756c6acafb36a0a4d3fbbaa2742b63b65a7eb2523a4294be0edcaa9eb37e5aace8dc2de960804f18c8f5e14194533aaf07b4e8c10545488073c6979c8de0738cd20a520fde68e969449337167f6fdf67f4d5f8dcbca46d06c2165110c5761fb4e38a4bd3866f9e8a0e2ac9879108d0a50a79d08bfc0af7367d25fb39d8b9434a042900a9af58fb5c63704a5352a21278d5e3f257e194f1cf9493386f61ac3e3b9e0686b6f9aea6f4d0294615fb3dea4f946b2c62ec590737409e9471b3e6be9c9599d429c43754f016dd0eb54fbee6eea7deac09351b549588d312b6eb51427733b7b8a714f4f082dc2cecb038f515929cb0e81272d00aeaceee7fc0b0479cd825cc140f4bbb70a77b91af2943539a5f79c610ab3a875e63606f7e8d919b3e8a83fa573211502da1d9037c49d60978b5489784cc40d2c5a04fafeac123ffc3c5f41dd1d6344f6e2214caf664f03464fa68b917bccd0c4be959c474173b6c1fd9107edb0faf36e4ca5c002207abb3d80dc5c2422cc50ce2897b76908a2dec171ec9606a74c8ba9cb2027990fe1ce8c146e67af4ee3e677961d9c70063203bbb85900b67a5043008077912c1bd6e711529a29d009db1ad4fe35af1d7a673e89d5e9732e07549db3e53a2bf1195eae6c17778d33fde3cebe70068e0007e986cee8da891965300e484f6b81c6b2c6b80d861c1ba49e0af68ece92259c651e54bf320346930bda632de151de7b7e8c56ecf7ef6e2fb6891a39e6f54ef96acf5988ee38f2857d844f5b5ff80a2648e3dbd358857587070beb23397bec5d4957570f289faa0d085683bb35b35c60dadf791be723b7cb3133658af8229b7cfc61aeef01cfef6314b55d67db45761fe8df3a484bababdf8f708e50c1de2c92a081aa9183ede86779aaaff950d596310a4704eaf735befca2f9bd7c6128351b4263218ae4dcb96b39535d80b1e609a8238869413192aaaf6dda587d9246c7cd3ca50b1d97a534373e610783471ab50e753de49d558fc15f3a89b451e80ff68041498f2c6a79ac69ed891a00b4fd3c411aa802eb79a50618174bd8778ae4bfe36b651bda3b3174079b9bd5a3fcd59f51b11f806e73adcd127687ef606a294a691bed68fe386bb08a7ea9bddabd50762e4bf0d38010685207954b721d1e15911393e6739d76dcdd8042112c80f16d3600507b4c503b55851e22f2806426a5b917a50345c4e985a4303723c63314c690ee12937c3e40702369bd49bf381ec043e08db7a75d2334dc72e107b145a7b911a10ecd91aa22bc8ffd95d12cdf212771ebfc581003d3ffaa03ff9e6b232909a8908e7c20b3f97eb71eb6ed7056024b692c9d1096f5fec40cee0f7222feb836245ee8a4720cdae0b185c1830a62733302939a490c609c9ac13f0d834fcbebee92b54dbdab71ddf5dfb5718967fe4f6ec14720bb048f25ff147b07aa772ada5b6390c3b39307038168b39a69d5dfc4ad9a905a9c77740bdb0650042ba4b16f9ce225e798b74c4fd91d015ec3b5d047a894c44e65b34b8e23e092475e3a8e2a4fd670571fee0811e40c821a1d0e97ed610e8ba97972faa7fdcf145746a151812c1c81e2950cddc7394d399a60cb0fd2a5ba7ee643e6a4505a938b6a422f35720449e7e99484928a6fb05515aac436a463fa77e09a7f4ccd89e6df712709426dee25f6d0dc9f3aa6b90fb0b969c3e6ea996df862732cfdd766dbc1ec6373a6cb71c65c82e820798909e7483258b28dd944b332aa9c350f3a1d2b881e7bb7fda7a81f7a03427978e65858d52f1cfe7ba18fa1bc2b21cff253ca80814895f163f972764cf7e0d9c2e2006882b1345d5dd3887bf5102d2b32d0171421bbd294665c3b7d9e2b136df25c230416a0c72bb21fc8e53839c9ff6e03ff36b4dd9f113f96c860161e50e7c6f90d005be56191d36c120c088b955d28486d161c4787c9f57a75ed62670caac7e9a69999e729e6fc0616f2a1c6e13fd2bb58427265fbd7b81b01e11eec0e2092821792cafc07b8d96ff5b12c4a5fb9ed12a97783c87d87a310caa70fd6b4bd015a9687ef78f4e8a3e6fe28288e43db7be232b64a4f169296ceea9b6e49c10031023dd6eac2273dd624f5980146243fd9f9e264d46e0f40a1e49004db6bbffeedc8001edd7c62a4d4e794547c6eafcfd42236ef21221003f598e1593e991a4194eb2ac3205936524b5399504733c5cc79b0d4721c563a19daa12a8c07fd4b45a6253d3e3c270dd412ff7b91be66397b8a92b851beb3acc8649390da9c38110da3a6f2bd428ce55015c4b621be3ed52c09507c1542cc61827e89824146a9c4a12a18798c0f788f0710abbd45f73d0ab3b1d1595c9a07baaf7f06ff5353d0c7e61f1dd0e32561e1a816a681270be7d08e5a3e47d238780fcb307e53ec81a393ab8e9f3827ee59084b96f29ce4c81ee29c563994d36adfa136812596232401c8659bbcd4c1d2620b62442fedf5605926e8c5309c66aa4df3b9e0f34c5649b2c0c97cb0338ef50b1797574a240d091ffc812222e481914202533ae379845389dd225d9751e6132c5e39e1528ab462b90822d1569d11f94a4d50cecc39e2c34c4f8b1887c834b67aa1624e7494b299c04f51cce66bfbe742452e81773d1391eb656eda3286e4cb32e9ed38d0271bf6b803ca0a949f934940ef3a1244379aef3595f82593205338c54377a8963f4627f27371b44c9bf4880bd5568143f6c08783d5c45e9ca6bfc3340e700d23a54710536b742e893ab7895f655c4cd09110af16c82e69d6f2497c09ac5e07c9830f9921df3e500fc835d0c7602931a5da3db05743c2caa90ba28a25466f12fa35bb07e28de949925f284aa94f2586d0410d1e94b7b4db852f7c16ba2b77e013855f0a663e08921c7e32b9137f102c71b70f3d2518e7a593bb6ed1ef85ebe6ba08df28777536f4dac0b5063dcf56b936e6385087cfa7a786ba0d98b82fd2046405a55e732d3e6482546c1b9bfa99f333b5322a11341354acdea819cabd03ab898dc082423db0d761babcb68ae808a44d026344a15e4e543dcc6e00ecb9c857d0ad09267492213d4b3f10114c003f2f571e8227f750ea807ccafb00b4b18fec285ad024e808e032be5170ed0430002c74a4ffc4e26049f3797d018b98f4ab32cd4f5f3c4404e6a0382e4a9324ba6b760a7f9b8db5e29a312c3d7b7867732ab0a4c2dd8557f452519e96e631d51ad3cebe847a1fb27fb2eae2231b20356c82e0d02e5b6fddf96e976a35bc2519d3339ae301f3c7b08e6aa83611a4a1c0f226c0141a1e306598c6e6f9cd075b6762d9a0cc551bc72a4270ede9416ee17acf993b3ba7da90bbef254cf89109870d6855265b01d46584a2352a5b500328dc9afda41fcc5226087f542972a61d7ebb96fd381dc8d3af4589f06beebf74076c5f9fa9a67806d5d77a83fa744f75a0af80f93ec6f5d7aafbddd8940c65c7920db80b481af391c6e59ccff8420017c15ca9925218a9341f4c915fd8be27177d5d6e91ae5e294e3c587bfd2220cc55cd6b724a3d43aef5807a153e4cd18855a70186fd7afd5f0ced4f70dc232f01f8d84796c20f7eba46c7e265dbdb7f954570b79b6ebeabbd591a0f9c4b9559bfdaa2bfc93bc5f5993a1d6dcd45c90df49442d370be5fd1df85afb25966b1a14ee22674d57674cc68069351cf61a9e9e359225b9f6ecbd8483bec256c5bd94396d3e2c228abf97b1e6e6b7d1400d573c63fdb343d6ac482efa889157230c2ca1c936e4b29cc41e733a5b93835e4af991059c67ca11b70699d0bbe6705ae5599d38db0eeea2983200f96780daa88b39607f9ce649db5c130e627a61c42d47691ac2daa8822ec3c7bc6329d124cf74ad1834e8b6b992c5897437c36d3d34dd6ab338df851a263bb9e7b84cbdf730c8892616fccd60c330fc38f518edb7b25d14b04889e16ebb14c2cef2b940968a2421e9042e923864b68eab623f5e271bb4c45634d210357070db72065ea3530d1c31913ab232be78e6e54777f07fab536be7c02a7ae3a6f7b2416d0b0cca22ac663c6eaddd69314a971f109a0f9951c1f2abba6feb33dd5f47272fd3e457bf5c7d208520ef3d78b81629a3cdd6ced25a15c03bd8297b876384cbd7c9546265c18928706962fb1e8538cdaa7e3eec1fda14b57bcaf214100eba13b3395341c4c658f85697f159c5763345348c86acaa8573151ce20b5d8f0d7ed742f1756e3574c60a17594f136a010d4b5e7d1a516338d22c35065551717b1b2027e419060cd69a3bde886dfd2d478d738cdd3685210e431bb67919af3fbe7a6651d426282ff7be73f8201a4e6b9107306ae1f56072ef2d6945fcd8bf9be6f511d022a02bcf527fc240a9583b1ba5504bf995ce471486746d4d5f7dbd5ccd15b2c8c4089cf3cc7afd3a2dd86ca53833002dd3c45c356976f7b7fce9b81940edb78a95d91b993a09c29688c75c47e63dd1813ece96de243b70bd10dc1c226b2f1d78cb9a2b4fd8d0d643c3b83f1ab4911f7127f00fbbf13233261bf7a5f748351d3524ca75407bcbfa1dbbe14c9b792930245b47b68b9989c8188b7655fd17088cadbecf3457e14944bbb834bbfccc1ee3ca1bba57d3e58780722eb23eb2fa64d81c8bd80d03ee0f23e932c2049981b80f58f83e4d2626dce1f613595c191cf41c5b4e3492999d27adc6b0104348363144347022cf699c9c3cf010f3d126281abf4359034546a7c33d90ef788ed2d5bbe9a8521ca90ce6d66b87f9d7a381747c8d407f62b6d42853fd6205e03865bfc01f9e581ca2954206c8fee99cbb150e06666e2212fc81010ec2bd2a59d9d0eb598a8a7b27ce21f4ef9b3f576e3b893e8866cdf26876f763c450d32d95cac66b64b6580deb6c46863509191ea7a4f85799248b0fb1f3d322fae79a7c339a04ae0d9fd6d8251cda691c0ae088d226e9310a24b17c7057039b570cf0e4f9138adc9da1598f231e4b00ae2bf9e12f0aca0218e8c11aa442a77a8b4d86c02032923de7d0735c661e7599ee5a5c88e6bf3efe8097e92658bf2e0461d5f024d67ac6999b6e3d9ae8eb50d21094975ec60e1ab6f0b563af2aa3562bf04aa0ef8337897741990f179a7e38f0ccdcd3042411ab3a1f6a691c1c8d0809df0820c19d148f4ae0cadce500c4bec55f1f528b87a83796e8a512722b1da292c9a50b7e3b11ed7aeb3b95beb324d28b799d6d0f68e9cf5bcfce40070ec277ab0f058768a72ebdd653fc6d947aaa58b0ef508253b51561e1bde68c8f80b0a239c642503e3e5e6a9f379c69dac304597e86ad0299bbac46225f029b7d25d1576506d959147ffa97010595b4e91de666edd64ed909b6d86367bc8b5f794b3ede47c78f7be15bf641a00473d8d07aece161daf4257d0334a7ad56838f3fa065931c5b4fe561214ec046e0ec4660c55205c59493ac978b291061672c38e54c8e2bcfc3b3c3c037424d38e5862c38e38526261838c2335e92c0f4a8002024050035d5fd44a0def8eded1e8e2bcecf7202321b189537ab88e6d6d496c84904636d97b4b2977360cf70b830ccc3111fc7739205e41eb9e03724cda6dfc7653ce179618910d628e47a0f58b7000a7ba7b93c82958487f5c6d1d10a6b58b2aad678d7d2789ff03ab925a566c4e3fcb0a8bcab57d834a06737d6506cd579178a8eadd06ad7b57be04a73a191ca8760811d286c4e3d9faad328ce8c1a97d82b98a745275eb2a9d449251ab79199cba5edd871d4e955e65bfe6f6c29ce9a4edc49ca9854431e64c55155ae9f3567575c92a6541bc5a7a8fea3a7795e824fdbaac392dd281b866b7b69759d949db7c46ba6591268994d1c9dc45c301e6aa3f8c62f769232edb3e8145cbd6bd54d397a83ea7564d413321c1a9ea97a97ab341abaab790d2ed1452f71a3419d5abaaaaaaf92538407a756babaad048cf482c1b64ae7ab6bdea46388053f0d5e76ed0c90dd5ace65f357fc4e37932e6934839d1e90d69f34a9d553565cc73adb3844ddf549f7392b6db3037495b562a95485bf6d2d683f42ba316c868908b76d0c24ebafe321209b34efa659db9798bda3037e9b3a9b22d095dd7c386728045cd61bda3d47e9422ca93fa6a596febed6309134f0a8e28da9a73be47ff0ad26d599875617f59f7457a1f7baf331e7dd2877230a5ea50df147018aa9b0d619da8fe7859d46e1fae21f58a20d03a9bda20d03a581f8ab4fd7859c860ee32c2019c922fd0ba257a5fa2c7138553a4aff68e871421ea768ac684d783c43ae15979551e164aea7e89ba25da2afbdd5f914507a3f6659e8e4fdfbc14e9fdea5d8fe5e9b0f4986edadecb8136758f30f7a3c3f2de8d7856a8efa78d031c9873898a98a617e638aedfed927a4a94965f3334530fd0aca477916e121e1dd89837ed6c929840db61a56c88ad5ab49f1cf596b2bff772a913b284a58fb40e0be539358dfb085108b41726b25cdec1a8a493f674f8a86ff6a4bf5cdf972562ee65db294b05866e94974d86e8f1f0d19632489acfdab6ce9697b6a30e4695d93aab764b94c4d698965fbb85ece76a4e75c748370973a65fd75b5ef6406996680fda5c8cf4cefa1e01d2ed116c936441d090b894a60bed412bd1aeab125bad25dae6e33ad092b6796bced74ed0aed751340e81d62ed0ba67f4ae8f70aae57b8ec23ada97337abb3c451ed1f6afca166c0f3594ee9e52f71d85b95da2dd87fb095acbbb3ed22ec04e7a1f793c5bf71612d2f658bf755dbfac6da9b0bc5b29d4fda3ece9a8ae51dd219f3e522f17ac25fbb9a42c11732e982bbde3a3237cc456f8caf6ac95cdd9af949d6253dab2ed00ccbd03a0f663de9d5a660f9a44acd8e3c95a8789661f291da9fb1eadb3c3bbe96f5f867600a0e2367ea8fd16da69fd98764284886289f41e3f1ecfabaf3a806b9d20de4d9f762718da692fd4854aa7bd9d57e3f93caeaf6d35de4d3fdb80785c9f65d3decd9b8feb77d32fa72fe3b47fdd97519f107dd2c32e9275cd1af55924a29eef1ca72e63c8bf2e56f99d438d4654ac23a262d85f256141987bb3b06e0b5eef8aa84dbb1f4f4af5a144d71ed7f56baf98a64130da7560688879ebfdeba2b1a2f1d9d417c3664b30005790dea4f714701062912b5fa0618c86d7f378fa521ef551cfd91a1fc1c0ec40e334f0e5f9687bb89f746d842a2f75d0b591c983f4aece6a90d7180e271054f9a28954b87ca46a1d5b171af5518446568e98939739d0e2fb48caa32aa9c823d575d2648b6e7cd2b62f875f6ddd8f9745e5cba85bd1edb6eec538d0b057a3ee2b4aaae823aaced5b93a3f6ec944ebfaa8ca777c54e595c7c3af8e3855d1232b7de5f1f0a828ac94d85ad179d4966449a40ae2beacd061f0ef9711b00673f00c77039a4b8b608e44837816a5463c9e0de2dd58a16937772910e6e07ba0753b4407e061b3e3f5d83c88c7136fa49db4077738784d789bee59a1eeaffc083ea38785baef78780fb56ba4394e0142f886babb77c873c383ef71c17a139775cd4bbbac77a711606f828459275d16e99745b266518c6ea7467d93b39fea3d78f8a1c8950aae67539d5cc4606ea5fc51e7cbdc7ebc5452106d893017f46adb2146b41ab443cca0992eb78a19f22ec1a93b61274c027206adf452df741ffd49d201b44ece53385545ade8fa7e8db6ca22c1e82231c5ed62e6f96b5b553bc97c8735a9cbf3d5b93170b41d5785c90dda21cc1d11f2b3411508c897802f3b80902cdbc1dfebd799d2ece08afd5521f5aa30336870bb36db2e81d6ad94ba44ac6fed16495d68841009a3644ecd94e49da14d365279a8cec7c9d5f6aa248253d70f4e75a7baa414ffe188df178144b538ba7745dd5b6ca49bcb4e6cce8cd8ee1e614e0673403238b8fc794ec5d3999580f372e7b9188f6175c1299ebc3ce79c2ce57c8c6c843996bcf113d5d66abe3a6ff3d5c6453687e7642736876945697608737b8453705fdda0d6d9e99bfd9cda4ee482d6cd23ac6b8cc4d0defbf22c65aa3c47615af16e5eed587e6cb08477230f51a0c9d457255077b793a94d9959703d9b2e4ad14ac778839665fdd55b5b0ffe15841942da412686aa73fccbb073b575258a61a62456acc0f7a494b28fa0c965a38e62bf535b4ade6030935796772cb1d085d16d92d20f370993cf18c25cef14e64cdb46610eca0e19452374bbb8058f45868d5476c2e32a8ec2bba92813754cc45297526e42fc40ed5f8ca5417bd94c87e9bc64422b7c7334f4781ea76668101e4525491a0d5a078f6a7731498d31c6199d704aa8094be91d74e21884a42722d99c3e7696ada194b6ad31c845d3da0549a9871eaa8f38f5ba4a1ff55195fdc496bb6c5d4b4194c46ea66db31f1797f3d60159ba47d4aee52e304460e71e8ddf020a0f229c622015a8ab0fd3f9b47b21448b333c7471483b1a214c671a0448f5b1df11af9d298dd669d52d68519a8ae610522bf8abc2687454b730eb56756debacb7dc00301050d1aa8a1897472a9ad4f89a162c6739531aec1c371aecd5a34669309a4348c58e95687660d7ae03bb56c2aefd0f488dd665b6c2380be5c71c6643c078457dc038467dd43cdeda8060a5402def8c87cb8e1afa5e50a0ae2d3a1714d250a0ae26214c42b4a0dd56d3f9d7663be28e8648544b88ae7aec80ba9a68d78198ede8caa7405db99b89cc0075dc3168fc2e060dd92211e6fa33540ca9b21d4c3197634350ac54ec333b4840ea1e720eb46c07cb9ce106331ed6cf8c5149db9b12eda646bbd9c97cb7b7fc653fd4c7ccb173c6c365c7ccb1ea3bb37542eacc2f8ef1d49ab9b60171c5ee031eb3aa0e488dbfac2132abfa7e5f51ec3a603cfd6d34413c21f03af630c219da3151b1b700411f9ec1e8cccce672da3a226acb65b60e486d790cd2793862680f1accafec00422a0c05823af8419e125b5d1eb31d30d52542890c21843042b8744218c41c11a75c68b7d5e5cdecf2965f2d5b1c3a8346b3c3e52ef761dedddd8dd065db0abb8a65d43a71ced30b5502d66d793f12716ab7b6b4bce518a7aa9f16080475ec2d21f5aae2778d10a991f22ec37d8cbb4b219d91260e894784d4a0d639220669afc80cda146e9842d43a3ca7a6313be154c742b5df3f82396627463411e294f62edde0f544211abc142683ed89432fd894d582d7138354f0d808a7e0f170131eaa2fb4c405d0875f485cadb5d8462d4ea34eab466dd42cd90fcf3268d85b8bc3eb61236e78298b0ddbc34469d854f59e4d4286d746dbc3463d86c7c363782853a3214a7d5244c162ca140d635913af89d7c46be235f19a784dbc265e13af89d7c46be235f19a784dbc265e13af89d7c46be235f19a784dbc265e13af89d7c46b6236f15e280ad57e55b2302d0e3581288ba1180463228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c29818632296c5b311e8810a4150fb26237d86f78a6d436adfea38d47ed56ca87d26da9eb7395dbf6193b41aea181e4f9be1a18cb6a7ab6c4e3f8bda6761a2dabd86da2fd124304a0003460d096a6a5e8ce0850b1734500434342d60085ab498814dcccc9ce090d3490682404626067e202606067a00a6324ced877a797199838b4b8b1c5a5a4c713099b42c348d050e2c2ca537944a991bb20cbb8261571bae8bc40612c95a83654d2b73566aa82a9906d968a8b1f2db08c2333c9eee36c3e361e6323c9ecd5162c1a20e352d5926256392b39fbdc5ccccccd105c646ba3fa7a6c1304c0c5b5d1d5e3b703cd5345266311bede495153d518d39fa5a609de930e2d4c2b78bec0752aec2464c2488b97ebfc9a06d92d619c17c13a4496242122239699d11646fe2cae62fd224cd6b62efef90144e5dc13a6db4506af74e592caa34a643ed32f48f2015155db49b524d3bd5ae8daa741634f878c4430536d0b4241a36146518a04cc1681748e48ab270f72ee56668fd205e7bce7e2b06adaa0f0a19da005df012eb8322e509154369b820929502c600c6002271f2a44993274e9c3c79e2a449932aaaa8a28a2aaaa8a28a2aaaa8a20ae6bf99999bb9610a36d79ec31c989999999b955c2f86b63cdff70b1abf83754218e72c3222023e42788653067481c6afe0acb4b7386095ebb10cd5095445d5c7ab89430e4c98b3aaa219058dad7755d11527a4946568dd70ad149e59f9d791be319a475a5fa9f04fe0e1bb3dbd83337f9b6af10eab35a917b4c5867d66cb7eda4abfe0f72cafd9aebfd84877b1c19c668bb9cc56d5161b0b1173d667361628cc593f6d2c43cc5987475a67128147200b3496a16afda88a2af6d211880426e154e9329b841265362823535de64935bd834f6649fbbbcb4ab51eb3c1c36caf6f261178eb8a1644a45a26dab9a8d0ba862a6d6fb96cbedd66adaad0e0910e1ea99076d3a72f2b952fe1131f7d4831864cb0108b89156259950b20841042d956d026cf18cf6f4f2b25c325472ad0a030914213269bd9a0402b22b438b8de02b437051c92d49efaa6780316f55d1e0e9945b427aa4d95a3eac127e5443f9d346d83ea3bf760432983d6b5141311d35bca142a54a44c6923e6aaeea3aa872014d5bb1e82c21c6cb15cbe4c4887dc4d12e9887673b553bf658342b04994f28453712957af1d27e930131c2a499942455291d253daa8a5c48632c4a949279cbb2c3b2a21f592b10cdaac5a0a73308a40830c05df406ed20c85e5f02da575582824622d2422d4a4424a040790082fe527dd0da75438933053612e32eff266fd826c4db198df5b8c5fda4c3a492b610e3ae154d5495a67671211701256c24c5ae7e180a4432b64d04a1d1b52610ea3dd76f70f9b8a3dfb956d7d74d46fec56f69048eb74128b46dad2f267c5bbdcb21e5fb6be6c2e5b87d596ad7b8956b4ac4e62a29da4935408855344d74aa1852098ed5822e6e01073100a735438a5d196d25286acf46176f8bec2a96debc9459611e91bf82cbbcc7eb28a2e61799551266c704441b3830aa9910c5ad7522011a811a9f091888603092ba9f01c9930141532e1249c52f2fe448d5ca4461eaadbc62d33b23efc322b73e2a2d967466a36547df8eaacc8c67ee6c4e67467f051e986115ad755fab55b028a58d0f607966594a1c88cc42ff65889955e26bd42cb49fa067e4e8d9358565f71fb8175b7d5a4421e48886a8cfaa840c218575b12e6e0491b33610efeb192cbb22843c11c34b251eaf6689d2dea1bf8a1d92d13a36562a4f326fca18c65c27d9950612a9da4dd20050d494e3f1769c745cbb2e2ad1863e438c45e1e3e2abbea231ecf76c443711269531b165d9d2a010d8838c8ca0ad52b5790d447050d9c3c29eaa3820654acd4270514b0a8dd52519f145040d2efbdd72d2d0f9b3f31d7142be2f16c11afa5a5a5c587bbe51d7b6fef584bcb7b0f6bc198db498576f60acdc7b3dd3e51f91b85babb42ef66174e381742b870a940d86f36b46189978292faa490c213ec447d5244614885429196965b2d2dd76b6979333134c48cefce7e4cb3aa1ec55c9cbaf7f9c3a6ca8b74fd389d308a61d7adedcab03feed19d9a667f1b57dad6e8557956b6da86d4bd5c1468900a814e687c9fe6281ce412041742087f90c4081cdaf958542d2c485644522d0bce9d2452c9b2acea92524af94b5ad8abcf8028bb484f9600823f3809732425cc91ae6b8b982301d518afa0593b255a41a3c21c84b49530477a2759a24afad5588b6683d64e4c9f533339a9a41f618ef4a652496721bda9702a3be97dc57512895409694b7acb8170ca3ae947b40e117f4da22c047dba65eb5ef6a63ed2bdd46e89a4c05bf02cb46be46151a2425bb4a40f4b6959565816954a2252ad292448faeca3a6527403ad1fdf17497defb7706835295cf0d009ae2e335b75f96f9965d4e5e5e5e5e5e5e5e565de33737335e7843de0af201056150d12e9d010f2b00f1f9b2137ef078e50a9170b9f07daabdd2aa93460521f1533705277eaa36206415d5555d5b1ab6ee9d3af62c7eed81b6375f9deaacb7e8c55d52d630c1fae7526c70969af766f28eee08245349245c5b262f76a386b4f4e2de90a9b95747d8656fd7a4c8ad9563b645d8edf4c8858f933b37e6d4be6491b10d71f8b5eccaf6405594a49df6eec7882ebc5d0beb7d96b9dac10cb582d9172c98419fc0a35a9bdd9cf7c87ef9d7fc16d9dc4c8efc16c07ff6ddd3ed9e279a32bc45c5fd27d52fb3133bf03b17cfce80e73703bc5cca73a7ddb4b77aa2fd6287dfa6d12becda2c2dc7bd61591233ffe5953e47b566ccea3704ab8fbfe39b53d2481d6ed91077f6057dc1ee3062f3bc627e53a9d4e90769b05738f878840e3779b457d1cc44362b7118a9ad09ecc82140882174c07bae0d4ceeb6ad4657edb7f2e0e9999f9ccf0ccbb1b39f2be6143aa635fe5d0926ab325d5fb0b1afc8c4d3305c0a02ac618b9c76526c4bf87a3cd2c873c10cc5599cf8c2ce58352a3caaac72827ac166326655956c1aa9ab06a123cb250d4f89d744969916490b124251ae35fdc1edcad4fda3022707bf71c73cca50dbe0549c20b368cbda4f9ba13b224d27bdb9320dced539a3dacd84994663fab45f7af32edee03b73a5e5d6ae3a2542a5db407adaf6eba044208e11222c751a257d458258b7552e3755d0be1eeee2e122547988b9fd7b3dedddeacd4cfaaca0a6d9ef41f40988b3dae1e45c4256133f380168fd1228ef41e990d8625050db9a0c1f52c2662224e2dc9dee7283d232f780cc6add82776c5f8489764bf64f663bd2cc95ab288490cb37ebd609bfd9c704401cf590ef8c8035e7eca6e5a12c2966c873c9410c3b05b1bcc11ab4531e6b0a22e92f0076287d88b1adbac8a42bbfe03ab5624bd671537bb48d7655d58a76117a9cb9e2041926659d222454d93168c1042a81d0a31af7551a45656045ef054c43757e6040f127c96e96079fccb9cc88c442cfb912c971ba9ca8ac8ec89cc89eda91e994d252d3352a38c2f984e17f5cdf5aaa2278df2809733b2509b645e3adc32273627529aea24296556246646accc08e95d66a45a99766cc67a8157fae6fa65a2173c499e66e61dd421ef239224e97acbf6aeb40ee49bf8eb2d68a745f89912bc522f29b3a1aaaa349a3991e9886781b9ce42d7afebba8c50566473e4493116ccd6bdd4eb2f5bf772fd6accb22e1639e79c935a8f9fd767fc4521cbf6c41eb9203cbcaac714e9f11aeb648ff4c7693e961e7998ae97e245694a974fd4ae8b88baa8bbe87279c7457e9caae9da3ba8e3ba0f13c5ae58a44a9389763f4eb0ca674e6ccf158fddaa58368e52b2ac1833273647522e62fd22c926aa72a0755d547f654e5c9991ab6b2bf396655973c356c612132b84d47fc3651399df6ef65355efbd0b621d07edf3282828480438fa2e96178af75eeaa7063d78153e56f565ada4f6f60bae801042a8d5954f0b5a7fe5c67defd7dbb7f259d066845a88d387b92883e48c5f820331ca9c7c38d5435653ce893d7b1019a54c5d9ff3dbcb8939524992aa5f3db74a695d9f55c58a7427445eb3dae62ff9aa92525e7456568cf189257a0a1ae9dd890d5a9c2b65c65f2d67357de26d6a8c1163f52538705dce0ddbb0594529a53cbd9b2865945146196594dd524629a59cdb8561b4fb21e39abfae2dc80c32e7755d9f9b45af49fabc4fcf3949d5e7ad4a4e59c922962b2e2b86ac2842e2081f200e30a4f9a0699ae6830c2476643017650c0d0df9c8d819420208229f1e470c15c5283d1054e3eeee6ef54e050d88530f4837213f4220de73c213103edd2b92333439310b2361170d02529ff7a6943e5522fa265efa04c1190462ae08e62295f82580bc7b52f6f3334a19b0745ffbb3e9201669675d810db187581563c46455c5976df032558fb1ab8ef31142685901e1ab15f6b30e376cad296d5d516fc5f6ec25ac288b45a5ca852c5898be0b9fb1501e50be37f694ed8197345a543a8b4a8d2c87d447373ce6d242ca74f47d48965b2e58d682b160914464972bec33d3216fbd236bcae6c063db96ddb4954edae2653c6c38a5a452f25898f5f2506bf46131bfa4eff6624c3089fd6517e5214fea98b4cee38a32a134d5e1a33cc4ce72ac833a9ad45848224c20df60cf36d824cb8aed79d5dab0eeee082934c2c40ac1a24b0c8828e2f1f41f945ac443ede34604737bc52b683f7e60db0b7332db4a37eb72d398e3b87533d649a791d6b980b4ce45a42b1d68f14720c15c8f1fd19a3f023f6d2cb3ed139a3c7c4b76a1879214c65451e830d4be4b251434ab76d495501210ab84ba53ed2aa1daa7da274e0181b1ceb38cb410da3b37d8f7661be69324cbbbf389116ee62741b30dd0058b86dd538a0085ba503b028c10ce22308932c6221c99450081aca48cf551410439c4d44705118ce6ee56151544a0c2f55141042b889084527d5410010854104107f544c288b0a49e4a4f5cb0897cef743a8c98da397be1be9b59f5e3edaeaa13c8302a6281767241c410ad7522b4ac6d475fd26e233271c4c36d48087670c413993860f5aab9a49b157c77dd3be959ef59537e46ad361f922ad1f55dab2fe3f1c2501f5d4223cf8137842303f0198830059bbf809ec31ce4bbf7fa25b1f5f2707b97c0bf8ce65122e22555c0c311e9eb9b05100007a4af6f9e0c16c21d9fc0f29ad3c7217dbf5e0c6dc2d83242d93d953bcad580b0d0600952da292591e96416c05218d0f5c37501920f2425ac1916066677777777ec612e510da0ca809451a506628c71365c0e44b91d88321b6257eeeeca1e923de5ec1adc0fdc85912eeccaaaaa921bab695953be9222db34848b2bf86e10398eeafd0749d785c10d27c6e6f0ad1eebeff1f068405868b00429ed9492c874320b60290ce8fae1ba00c9079212d60c0b03b3bbbbdfe3e9187046e51ee612d500aa0c48195203f1a1ac18235794cb891b80380d1f0abeca7eaca3b8f9a160d556c72afbb9aeb72352175520bd94b533363ce43c8e6fa28d54e5f3f078706cb627464c7da71adc0fdcf5b85d1ca7aef83dbc68c5448d49c07a59d675653f31b31ee3f1c4f3399855fc34acaa629b601063843731f617d27d3fc408a19431ca3f1c114a1963843142d9bc52c0d78ff0dbb10f447b7fefbdf7de7bdc51f2be28df7befbdd3e9c47b056ed96077b7f468f9d5d2d2ddd7fe652d91065af78e8000b10eccf91ce0d4cbf9bd389f88c7d367d158fe9e8ecc59de1b100f2543bb2953b52fed646af7199acb37fb5902f396bfae805e85940315b5def595e8daa3faabf32eb620555555b780905a510bd0589f4180eee2c5b664e62e6868104897c4d011c4bc091999777a13326f22e62ddec489cebc8916f4748b9efab4cecc4fef66a7c5ccd0d39c32f4bd184a3b229602a9db63ff3a2135fbc56fd982ecee4ada6dcbf6be99b625112bcbb65be93e963021034714f03186ac2b85b8f44584ebd974520a12ccc118a5c4792919a999aafe7e7a2998bfbb78a901fcfd6d4f9feb7bf57a70704aaf47cac3bc9e185b18b906b03516ccc1c36c5dd456783d85e5e0656c3852a839f072d36267a151ef2d899deb1c674b02e72d975b12f23d3c6e49f467a0502814ea3b1b90564dc7d980b4eac3e506a4d51fde1b905653efd1efc1a978448fad8d04ed9105ea7027e2bc9b280ab3b0c21c94411d877613a777f848df402b300b4ebdba462cb803eddd4223d47168a75579240be6201f8146b73e4fd67b2fed84d724783c1d1b3e1e6d4fa44d54bdf92cda4d7828f8d3bbbbbb7d74dc8717eb48433e218d48254f3007a511a944269146e490148297447228cae8845352082767e7dd69c63bcd3259a6e7ecb4b8f4f0d733feda07971d6904e71285e3731a5bfda9b512208868e5e746bcf263235ef12140b5f113e30e2a46d4ce0e2aca20800d9f6ae3e7275eb9118fa29578e5467dceab1bf5c625e3c68d7a2342a3be81c7a1b143031ab525e3c67d6ed41b376edcb8b1e3c68d1d377c7ceec3376edcd8ea8ead23a2fa5cc6d601a93e2c878f564ad90f01680f5a10af82a8ea63b603a6d64d42610e061171aa56144ebdcf2f9f4d0ef5bbc2dadd3875db1a6195204eed40a3d689473ed0d903ad7450257c0e2f89eab6d5e7905338f7b9cf314ea1eef32cfbf1e90308a99102653ae2cee3772ea45e2819a59451ca3f4984533b87b78e3815adc42b32480ee114cedb095113a14dd44e38d5b551451d0ee02241cff6f41cbe4bf0523f87ef146ccac6e1db052f95e3f5f0ad84533578de5927783d3c2cd81e1a877f3b31783d3b87edc3357e367886c7c1dbd8201b9683cfb1c1383c0e9ec60fdfb039f03c2d0ed5f072e07ba0191e0a1e56d91cf8ba25a1c4a9eed0e881c7c19bc7265e0e841103468d006a5e04e0858bbba0b9a169c1b59801c0cc898793cc0e32313631303ac0bc542f2ed4a5656b31c198ea4eff3b7d187f590e96bad3afd9e9bfd8d9e9bbd879a83ecdce4e5f66e7a1fa339524c9baf3f778a25577fad6ce61dd39ec9dc3323c9e26d23a7ba56fe0e7d4b4bd7258658744ab30073be80a73900cda0050eff8080b7de74f869a89a240a377030f030303b373a5f6735037c2291bb4db6ae3b00f81e095b33591336836ae4e487d71087339bd93b3452236eec39786cdd06e5ccb7e7e7e6958a741ebdae8e73e7ca136588539b8998e1a6fba8444da80f8063e6e40861ecf0cad0f816c16ccc1bdc21c7c477c84c8959de39c8f30124eb9643f38384638f52acee1bb08acc2a99ec343a3c7c373288ff8a89be4c8269b039ff39e0d42e1d9b6c6231a87ef26397e3a695ae778c790070e3d140402abc0a3be81e7230d759c776d74e33968c0e740a31a366cdc877fb6204ffb75d9786f1d9048bbbe61c386f51273deef57283f3e7d4e026b1c88c7c34c88fafeb9ec72bc0097b4c3c1341ee7f11267081a6f4a837abfd33a8d06f51d1a14cd21a4a21e8fcaa1d981face75a0be93b3f31d0a297cccc50d751a5bb7f31b37408ee7dc8751281bc7c1f94fbf46bffe8a584f4f07a4ee7cb3219ad2e4bc8fba3cce4693f3781c1aef66a5c9a13984d49cc7a3bef32b872767a3d991731ad791731a3c39a7711a398f39d4ced6ed9c00a81cf7619cad8befa155151aeafd1c47511f399e437dfc1ce73b1b10ac38efadcb41e1cf6fbc331e368e73ce76fcd0070405ea5abb0234ed70d478acf1ae35de351a0747b6dc69d4712e6bd0ae03b51f85c041d11ddac503756da06ee8731c1cda01351f610e7ec7a0f591f8e0d8780ecdb1f19c9cfb00e9e3700e3469653bfa39f76902bce5260fb31f1f14ed845454c4f9639deb3b7fac433a8d1b1ab49b388f37f1668776b3e2dca771689c008f3ebf8192d487cf736c3cc7e7393b1bea71c3b994f7f1d9c1c1c1a128bae3e3731fa6b10171cdd97cc8e7ec6c341e37140ece0e6a0785c2390d9cefc82de73edbab395c7172be52e27cab904ab3235e5e477c8603777ce88ddfb80ff5f1d96cbc3b22ea8d1360eb80d41b8ca4e5e5d7cba5c4561bef6c074cb5f11b5b13d9ba4885e16c8f3979d4168b3047843968b4b3e1546fe7a73bc6d81125513b343a76d3e0d9e9690a8f6a3c0ea171087390dad8b6d6d892803d90877653d34e464538a50424c2a99cc3b7119ee71c728ac6733e314ee13ce7a4ec27a7bb9b6e6f1438551ffd9df39cc6369943e16c289a1d7d79493b0a9caa0fd477de9467a3b13de6727ee1488a31873a3b3955d4e15bb21f793e127370de324a29a3c479d3e0f9cbc18ae0e06c1811d91d234d1fd69ce3d0c71c0fa5e9cf1a69509a1c7aa4c91909f30eed50ef6c5087efb8092bc139c9c80cda146e38523b39e48497923185b5c24b5587308703d81e9dc377131e8fe9f01d85d7d372f8b6627b7a387c67e1f5ccb80fef5a0a15bed352ef7a0b15c2cb219ded88cdd9a7b6fd0f47efa166aca1ee7bd8dee674cf0c75dff2c2d085ba1f00cce3e61b8317ea7e8d1c49c284749184a238a9100ace4ed92b168b28b71edb11cc41297170b67edc50bf1acb69140e0a858a31e21c070747ca883a0e9dcca1509406a8768f08a7e0636c5d2c418517c0d6451254f8006c5d1c4185bfd93a18dcd6d50060eb5ef0b0752e686cb6ae850e5b3743b74e66dbba986fdd0b8cad73a9d9ba96175b6772b1752c345b576ab17559eda0d175da8eb098adab6ab71d4fa9f02f44a01415bea56ba32456db92a8e081f4119c62a14782f426321289442a91325246ba483242236a04c5881a41236854e165953d4c4421b27f9ce0e28de2a138e6204c45d890b99571a1782829e3494abad5c667c9718bc057a5bec7f868275f94fa2e19c618f59d0916127936296aa844bb11adb338a0a8fcddb4a26d2bf34083c07b6f6e1bcd8ef7927844b57b1a142d2a2a688fa83e23fa866da041da49b4ab88a54841058a14464eb220aa9d1623beea2610ed3ee239e698e1e794105ec2096184904f441152ae98b5dba9bc6728713052bb536526d46eb6d1f56c22b38c9d73523b599f4fa7ba453b29e55b3eca08633c80843106c11c77ec862de9ec2883ebd9ecbb8bc5d1444451a6bc9b95f16e76497f5f36953a222ab4b6ddc76915d22040b0f8f849812bb89e4d8729d15e0216c7a96f5a7bcc036da5e83799a049a1b615eac527247a70aa13f2835332a83ece7e92a82ead6859b3044555b862cd58ad937da2a45a619d3d41d09362ca13b57bc80efda0765b54fb9a8284da6d95ed73ac5ef6c3a5586d48fc68781f3ef5760abf668c3c01e79c11162141c24336248515a66891440a2b1499116e74a2f52b224e99be2d7f2fdf16df99efe9abb1fcb50ecc4bf44a845a67080f195232a4eed675a98be309eb0cb98494b4402bb24116d68c1b9c471c91de6273f16ee267b618ef26feb4d57837f126c687f8970d7b3791b7f9b8c7c59bb6f7b808441148d4d901d5795d73522662ce8a1d0f654b30c861748bf0cd1ebe6a5bb74986488f8850fc7c0c04eb24c1b14d8f78bcf5418f67eb5a34fe40eb1e3dd537348721b57b47f04989f03491e6e01aab4e3d28585ca90b85755c8cec139c7a435194c4ec32a9cb43518c9ed4c5112bc8459cea7868687b806c0f7c95bab5632b757f411e5b5fd1114794a130f70522a190a10b4d84535bf78f42ebb868a776907251b311a7de7b104aa152d2a96028ea9b0bdb1e8e5b60eb4f658556aaf34f8a301ca92fd351aa76946a5bf59aa16151068d8d98e3f62d7ed0a0c82189078c745cd4bd222e622c58e7e100c21c8440df77040468f7084ea55e8148d852df901c9ea8dd3b3aa25a1c8f8a036a1f6ed74ef517ae6a55bd3a9cd7763619ccad0c1f9648eb7011df2c17d59d9594155608b5851bfc615331193ef4bca20476f08ca2b0b09435628e7777777777176eb74573b19858edb668f6d8a3a02d5aa3adb25830c77f463d96e0c00fae4430a4baa86f8a1d80a15e4f8640ebaca2faa4eead2a6b5de9ac2cea92825e4e2f2eb608ffad11666666666686e727988ba249e5ea9b228a22350aa36a53df145140a9abc921da2bbc1ca295412bd547c51343f5653f907632aac68323b5a6be29a2b852a1b08aa055d43a5336a12501a4558b0c0fb5b7c4f072b6b3a9118a2c2a00ea9b028a29bbcd0cbb3b663f95155ac396598ed88f1df771c3284bfdcd74307c6719b51ca2594796111834fe96417ba96f480755eab5d9cf7bbbacbdc7755659a159d761e9c074e8b0685cde86f1c9d27b28f8a6f1658bf0e5ad224e310f01041a94a2555f3568fbadaf96d1abfd68195996d1368df4653a200db6e5d903cc4ce183d0327aa83d8ca2bda33d6a9df9e52c018d63d2d78f5bf78eb41f93ca517de76d09b9bd0f68186032a94c0105929ae2ba6f0a289ed0591c1b2db041e4214d2207ebd820f239b642caaf6fba0354ee164905f26352e12acc6debec08decd1e052717d45d1a68cb11b18ea865c41ccf40eb8454de2568efa4a0aa6194b04dd8274028a6a1ca72174208219c54ba533ca4dd8f49a50a5a6554ab7727a3da4da3a004348e48ad69348d269549655279a6a16e48743d9bee92524a29a594524e2388e8bda2f25ec132692e938a89c0ebf1190a437d87c04b9dfefe80d70344035e6ae6ef0c783d416c0eff5571802705016f0a264dc612eafbcfeb9171e3f5f8709dd7b3b339fc9d7aa3871a32522d7fe7792997bfbc9bc1c500407d36ef664aef5cea0eafe75bcdebb169f1645e0f47b315c1373c616edd084ef1d055fee5e91cd1377c7a79f85200b8fc7cd8d3a1b9fcbe9e4989d88c88998e228ca0d96c0e802d89203b87aac38f681d207dc33c50ba64871d5ed15c1e48eb2c93bec0d3d928360adf4411770b6fc3f06e7468ceef712fcedf2b6a5ef362a3c0b88bae30de7575f1a6d99648dfd08d2dba35892ea1b9dc16040fc5b7d9f603419bc3bfb29f8aee9033683a6cafd21d8249ba41f3301b0246955f236ce7af939fcfb076f25836c4aba433ced225dd62d561536256fa074fb728abaa2261a58c851b46966579b3340f27dcb62ed6d36e6350f9358c846ea75099c77c11f2b39252d225347f343c60286053217d618e7d6030739289012208041ce009288fc8b21a86e563656d422a8c0c971693e6c3ce8d1a3eec4c21334aeb960be678e82ea830b8081ec7cf9ca87c6c05957f6d0ab82d41e57308626ccf0ed91cfe133695d7045c9dd63bf95bdb7ba84921a7e41e594cac9099782a72fd3051c23f34155ac7dca4b2131ee214144e351147292afa11a7f849c18526958b160b2b5ba49a54aa750c30d1ba3d32a9d4dd97258071d01f934a9dd7c33e8318ca24aa6f77777777776f5363457928092da4f0101371148602a7d0ba395de83c68df7b6271ed5f150193faa810c191ea437d5484008b1a21b6b204351fde57816b48088e235e3e08fe817fe03315dad44ee764ecd8d09e145c08aa445039110561546195a2e8a8f231d6611cf5870a4feab5dc7048f3611fbe784a08eaab3f555021f24385214ed1c06f85f47107e15a1e40e07cbf091927ad680744be77f396d05ae7f04d348551eb9b7d137df926e05fbf1fde0fe7f766bcc3ad6348df1bc0fb4a1cb3370ec0f7e3421ac57bef3dfaa09085110c34a4d28bd23b8b4b2fe8085ebc899abfd86a6a6a620d7ddf34ed38506347448d35352f2f288c4f8dcf68eef22668629ebd5fde3a30ef5f3232bf2a8ca5241313539a9999892d64de0911aadd8f278534d3a24443f34873eb35dbe31b8b02a9f98bcbfcb1cebf9db6c078a9bae25f26a59db66932d7fead3bc93cfe8505e3c4a2d16ed66c44548b54325125664aa6cfdc87a95432bd64b236130d52d1252378f1265ee4af17db8b5f8bbdd8de005cfcc58bbf707dd38be3c5512eb61f417b9f6b9d172f2f7ff1e205e62f4e35877913d7b337f1e22e6fe2e5d9fb3bad93bd6f64b48ecbfb26e63eedc32fddac32373244d478171b4dccd6f9d438f357492d683743e3fbb964a5924ccca6bdb42db90e9361a512b5e29382c5371485c016d23383a1418c8c0c1d81cc9b389d644e2f2e322c2e30c77ec5c4fcaa30ed15eb0c89c207fc7ce9fb67daacc7b469b3680761604c9ac914636ad162621eff1273eb2c269617179717eb2ca6161818ba64042e2e2e2e2e2e2e2e32259993cb4f2e26d3634ca616ad7492698981d9b4179796ad8355a390b90a2570ed9e12726c0f1432c8e1fdee3efa71e9f5f63d4ec1dafc628c8f63673fdb3d658d967b8db2f066159968dd1bda071153fd9f18e17c9d56e3ddc8967199a3bf35629b5d4aefe0628e124a2865156972c4f385d4cea7ee43318db11322df0fe4ad71eba60ffe7b6f343998d2ecb851df6fd43954cafcf83d7ecbaf1fb1b08cbcddb5f9663f3f968923151a5529b7a8da1c6e3fd6a84a1b2120dd2e7f6973a9c3258c4b7af94ae8a7991634977fe1948bcb9f38f5e25073a2c1634000c1f89a9a6863a5d2db1c59e9eefdc15528043cbd0fb7cd3beed1c6c539a58328155e3ea935973597f23635101e8b6a539f145a1812ba5eea897c924affaa168c54fa9a5f280c85ca7e601cf20d22c7c1033c4ef6e3047be95ce854427da303c621d06a7c80f1c3bfbda881719aeb80cdd06e02f0005cfe6083d53c95fdd4fc65dc7db866076c8676f313a7e2cd0e35bf7808808b8c4700b69adfc49b9a07808b31c6a8434dcd23576393e9a83917634d90adf240704ad2becd16ff6cde22fb998fdb6d6c24dd21fba9a14030474313636646003b3168a050382d0410a3123a9d0680bdc79384cd25853426fb9197f09281cdd038f99bdf5cd2180006cf93fdc0ad074dfeea019ba1713f71aae65d73ee550fd98e1db0cd74c81d3b542993f1b8d9e0b9eddc56bd6683bfd95173595353f364643ae46b247ccd663380d76c36f5653c8078a8dec73c23966400c0db0d805892f926ff6da76c3a6c7b853c95a79916342eb617e6e45f6ca72c47ac32f4c71a71926a42d0fa0aa47d74bd6442c8fbb0cbaf9acd86f2b0a9500750d4861008e674f8cb7e7e60bc9e2482ecac70c7151e1da836d5e617cc38da1951b9c72d8908b4351b7cad81c986d86a0d7dcc5542d245f6ab3e2d371d1e75e8f01f6e1d771d6ab63e8297afa1dcf683abf49784b4adfcb2d9fa4a2f7b80c6c598cdd6edda6c35db7b289bcb2d4208e16da08dcdbbe69dcdfb88b9b6b1b90fd7f415e6faa73eaa84b6676dde97e178b21f19da83c6d9d8d8fc65db7db438d0d699cbcd07fccc0661395dcb84803052c892e5e0fa1e4a8797b21ffaab940d31f39e19a2fb099a8bd3bcab843af9d3ccfb95d0e3f1c1e3a9d96ae44fa54c08f9995f8bd56caf94ed909f798bad2d7e41acaff4643ff27a324378d8e14b8600e03c6c0fc765d3d9e8f0c73ae8a0439377f643df47a5d26b68f75a3aeca3d2252dddf48b5f9d916595100705f110265243bbad35b7d9b40ab70ebb6caa3cf7ce45951dc6417dd36d85b916a2e6d4f48ba3ddc98672100f1fb23878a021388e285ede7155ea74d1bb69986261e9231f685d171d75cd6d0e6dde55423fb86a731dbe190f966af3ab0989c6c58b33a95d94729ae1548bf7ab279ca279bf1ae2948bf72b289c7ab1c3f670d86caff2b03d1c9dbd78c3cce697ec98a83207c0f670f0b03d1c3b6c1c84c3a76db65775d83a866edd560a3353a5cb3b53955625f46efa17e5aa94f769181206fdc155187f594dddb69eb235951a189bf62a8c19539556954fe7e19070ab7cf050fdab99b73b96646ab649bddebd28ec62e323ccf569367e6263235c84b90eacfca814cc576a9b9832452302000040008314002030140c078462b16034a80ca3fc14000f99ac5c6c461967418ca41442c610424400040000000002684200043d40e1d458a1ca4d32122f284aeb711328b28a92046de899928359226350875ce557ecc2a46c352554273717a423142685999edb89f5cb11d814616f61a22c4fc1af56d47d3b8e22d85229f2bdedcc9a4047349434848e6345209cfeac17d402f3beb29059d7f92e367198f4cca125c28ca6d1e843096662bfc4fb8c6d14bfd0a92b9aaad3daf2e1c59483e4c462244813dbbe47b7dab2c48e89d9d29522fc89103da823884a2794d611a278942c42dca8611b51738e0c6c9ea1728a89b7d66c150ef7ebc0d2d59766209179a59d5ac7cc1280766c339967ad9c5d2c77a0070927250f62c876f97f3016754b3f0bd2367661d1cc10bf2f20a8b286c03d65bb5556511ec773f05ab6a7b9044089a3d24ecddd1248461110fce5cdf25c5e4c0944b6cf07db10212b5b24c4dc51211283524201c09845b4949f6d9942c616f8d5c2836fb9ad62064e3bad5cc6fea7fdb70d8b5aceb68f2b0162d87ed19af1819babd9a536984a2189e0712ab81c58bc0e84b0eb429c544b0c5c5792465264c76de54f41e6f95072c7b33827e19653aa5eb0c864c49c888997245cc5bf2c2c16508dec07254dcee478a5ea7045893453f8d8cb2a6be319f705da22e6a387be35112f64da85b2c8ff5945b1b1cb9d30ce6117941812c639c86b20edddadf0f035394bed4805e4c1ff49b1c6722c968118a51ed35a249db55db25c46c858107142c9754e7bf2f686be07e30338c6655881d007795837331ab118041d7f43d0b2944812fa3938089ba9cc94cca7b86e866a0357ef012e0419cf8ce98ba16882193df3729890529e8a954fb9263b91693ae0c7ca74bb3a0c2208f440ee382f9167dddd2c94248c3b248de0e9ea0f47d209bdaa15e8bb0e31e8ead48993d51f16201cc685705923260dfe3d778b5e17c43016146577783e662a6bba85af2eb8f375931d8b95144498912d979ba87ca808ed8b8bb44426c398d5a1d6a087efb824f5c970cbd2d10958bea9ffcdfaaf9ab285fa789c0dc1e9e2dfbbf798b7203288563db475bee52f29a599a167072e1ec9de2378e91e89070943cf528940e35113cc80a3042939479bf5f59b18be2247ee804744058181a9b6b412e06230dcb37b6c57691849b312ce896072000afcdc71c06e6d8c52ef56a53601ebee7477ec63a46661ba9008ec0b430bc727c31827ec3ce5406a3fe7682496ad5c31024339cde344527ff3dcac5838ed31a6fd48c319cabc3858f035a7adc98c1e7e31662a01b162d4ce45aca6f59baf377f0d4389f5acf5918ac3b8df9dbd000d1ecd209359c9588954746c1c2044be88d4bcc4c8bb34eaf266631ed479e02caef059e6f8eb3d05e96545028de39eea93c04f24d55b4b9c63efc8edbc46827b948b557ce92fd3e93a51939cfce6ea3c31144b56a727c219e56ac668cc25f840249f14f251f39cd87fa26f54ba9e6173774801a12c6ec73fe01554c60446eed963351f337447e6c27df09b5b1acb3062e745179e8ea38071efb3a16bbd1ad9c919e2a64a1b7b94347bbed03b6c9715053e6df08d3dadb7be4eaa6d484cab024cf8615a0cf326ecb4a8c8588633cb36589af55979159bf74767650529b449c38fb0b660fe3d939882bf70682b5ce4e0431063efbfd634a6603589e10a8a8d9ec2118213bcc60581f46a5e8d4b1eaa29073ff8a25488223380995ffccb0da7ebe83ae8e7f340e0259a392ec17dba58bb67a578a3c278728e1e72507a9ad07bb2fe656383bab6a139398117e621db7a33b1f0f0950366f5c980a44ef4e03f470a6bdcbb313f19e32df08bb7bae288a5b218d8149f1861746223b43e7970d51b82d618851d3c9edb5f53872912564c16b80303939855d3006d75b439ee4fee1b95ed225b070e821b3d2b05c367419c512f3731d62d7983019d61671c5e81259fdd6c37a2743a59b4fc0d09d869892224b50b29e11a35186a4f3fcf53c883c72765e6d9f4aabc538a7e5d10bfe7be0b717db372ad939948253343817f808a5fc286a2f0879a1169b72b34ff27c0ada6d3de61bed4e75518dab5c7b621b11fad9dae2c52d7de0e31934ea6529cb52f4f843544eb84efc67d64f8146e17ea6d55c4e816138c516203e62f0de38c1bae314aa17471e37cea61869b4787a7479180a121e727b1647466143054912c5e77ab5ba33ffb0b1b94df343b007301ebf049cd677cbe5742fc6486e317af29888759aa460eed24defd7b3e389bad6d98efe568c8a6c5fdde4a643438973b7ad8c25765cf8715b09425bcebb8ea237b7de1d7661a036e2baeaf69ee7f171a5a68f4328b8a199ac5929dc6597184c84bab85c8ef05993bf9e317e6efeff72a84b5c1f184d32424b9b4ab71e1690ac3768e3cb006d32bfd00824be16d9c4dca51cc1a69462aac23f6d711b600b91a2851ed250779413bcad8a8d07225373edc4c6fcd7b250b920b2578131c235c24d4c706e013562dfcb799f29ef6f3d465ef05cf0d4775443a96befeed1433cee9b90158122d8dd6f690a06fdc2038b0f64a625f74be3fb997829e8c69ce800b38690dc0e35e63c12b058a7878f6a4f1979758dbae1cb683721741da84bd89be8b8f85587a3a6cc0fadd3b199dc4829199b2e6dfc982190af095b1785236edf2262e54b062f3269ee23a84c76ce908ba6dbc32ed352ed6dda384e464063dae9579de74ec50bbdf560ac53d77138984be16951e840646f74546674ad0ef736ba21884512a44481a081ef1ae6dae58338a8a72c57aeb496df2d3322b2fb0975c6494b34ed1da7846ab6556ded1e646a41b5a6fee2ea8796984fd39038ec041b7d4aa70b9ef6dbc45f47874db9dd8a57f656c87e04d8336c087e8963462bda6c7929c4b55fb8bf5ea1b54d4142a4a460a2fce367b9047b0e647d976dffe2f685c37744fbbe9c241897e151a9372795df872cc58ac81b5ba9cb1c1de141d5b9f0e4afa0e15e6a12a4e9ad41889f03aaccc0b7272032b6d83d3d3f02df3434aebb67d5329ae9e3efdabe26156631d524ac9945536a593bd0896facf53bd2b8f4e6474fb01bb65987bf17ece49fc80475b121bac98bd88eadc042eda70680b40c9487194a580aa1509af07d2bc3ea9e18e76a3427cd7ea0de240ba764e07513813be67015f02a5019869481cba965b1cb6e9178406951dc3bc333e0d5ec20089bbf8ca9dcbd2fcb56453eade9d2563230ad6dd9a07870318a407656c2a9941db6c6e3c0a268579d22e6219fe819d0a45d4293e366d11dc71ea3ce367b95a714231888fd8139d90b6274b6c9d50732b2aca1d26df210550cc12250ae3de3fea8f6154f3f33d2a3942b94246522a0f04cb452befb91e41bd083b86011cb2f6a797656007b7d1db91df287fab7a978f9c5fd1f0e649aaf6f9954d892a4f4339ee51b1a074446e154a37dee550700172266d3363df22ba83ed08e280ce4be947469d816b88dc974698c505e29f1d7c3d07c35bad68f8f0e383a54fbc5759ff7d404f04a87a54b32fb7254e4ddd06fdc9759ab1d859d7b0a2314778be7d33b573a42c905bc8c683cc9a67ea45eb6c968024d4e970e4087bcdc09c83da7f2d3f0e8922e5cd62a0a42881114b1aa0980aedf9d750b39d6f5650550e902981fe1d9046fc704f93ec6c190c83c146296893e54b06a46a9ea9c94aaf95c963b18b8c7891436358c40a5217070b28409264f94e98cfb05dba0b5ca973d14c20cb8381867f4a3191584cd442c1f94a18bc881306c8d98dcec0aece346249897b58c2d0744cd5aef9a11a20f20e8aea69f028027c38c534319e4f6d79828d6812281b54a6b98aa31e0345d69a4e4161d86891089244451e5975e21b19c0c94eaa4b26163039c0f021602e3331b7fc396c8c9094fd2a610d9a0f11c8c8f350e1ed75424d3d3f5a097c7c67f80e9d42cf799ee09c8f1696e7243973f71f4d2b181dd53b8358a63ae0769d214ecf99df5cfcc7da6684c7b33bb58039fb6ad0ccd98212f79c417481bc7918f970e8deea9b5448de5af3cab8f357fac61585d23036e76bcc6370d9d2f07a2f26c76f5aa76eb2b7a914548cb6f7918d5d1c3c28db7ee43475f26fa2eeabccfe3fad5d038510b6dd8a4ac4f9f4c7f07150d974961d10a5b97e429a6094ae23e87b1801f61fab479cc4d371168c4119bb7d426035a2064ed003b787d376cfd09698a2ca1677e88b20ba596eb9397807624918e1ff44324151dedb4aa7d559f997f61a1860d0ef9de398f076f4b1e290fa07e359356ab8ba7185b953f8778179f39fbc98e890a076a0155e5686c4ec186b7b7531b2e931e1f3059d50ede6c1896a0b05fa8db88836dc18cd2f9f99feb8253a733c3286c44caa57258f85f599a98e1c51c28203a59cbcf9c4a584b77e4d51bce8285f72c0798965c91f4be8dd9d5bada09ba4c3afb82ccd5342a90538e864f3a7938c3c3bbcd0df590b49bf47616c2fc726d8698f88eb1b1fd0050f71c597edd0880241150581a64d1b165113b0d483e69fb558970f240b3bf5fe65628965f9e86f2b27f4cffb53b9dda6b9a291428661a4b7db1b047e2166a7c44514f0b1ab7026469fc11bae074e8368f352d70c7d135f6b21bb24a1924215a3880a4ab755dc9a017eada90b894dd10c27de547ab52046173f9e03d153bab1d232da64bfcdd49274fbe9f8d37fcee192a896eb51f4e6224b6b0d875638e1abb885f62a10ac5395cb113a653a53ea54204989d67fe0916274c185e09405641ae71b9906561f998425b99ef688350333c0faf069bcfc46bb1ece0a69b05d295d472967ab099b6f1245c296b878f12dc8a194154294665bebf8643a51d32764bb0769afdd7c7a905486dd1fb2513a98b2152b9e2970070e5edd8eac22a9bf5c0bf59af22a7e295456852925a1422ead599f0aa2130369adc0651a7801d029f1c230b02eb5f2d63f2a8cab486b86437a76a7b75e41b4f9790041bc6675629aed92b5583cf83cbebf0a395f33edeadfa3363a18c19c3b98ef949ac003743f135f4a762b46a53149f3a0cd62db0a977f6794265cf3ce3c4a3c252b92e75eb23ba3646227d94422546bfaa77a7d68fb99f0e8f11440d7fa95eae1ec550015953560c7f2d384d1e3ab4f21a5066452f071c3c998f0281975c1d147e1fb938b07eee3d21c4cee3a69a9cd7c5b29ffbba6db21d449969a95295620f58a424ebe4c1bdc34cd03d63614377c149d49849edcdffe6e5b06d32e7b910d0d5da70fb7541c045d9001d0c536e814c76a5666f4992c4a9b99d49428281f200ea20748164513622c73392e68f7542b855adc4026f3f0960a37571c2d29ce32a33c63f743f99306e689f29a1691a91f59c537c0a72c64bc1293f311847912947f01f3a42006e6a8bcd074182a1f513d215aa7f1e42b4f4207f4932ebccdc4d775b7363b5f8c66cc7154db2113b5c8600de677c36bad914ba68925285cd46fb3edc7ea6d6d61b51175f5362af783e69e799097501740a580f281e037259fe98a399a44d3d3dcb8be12e0fe103bd6469456cecb9303d4bbbe5ba5c731c2960285ee324e1043326979a25c13b79532beefc4e734b971ca4f73f46d99a63ee5f2aa6c0106147af4d191731d2838eee2945a42a2a278c5731f360729dacc181f8bf16ccd024d52118592e96f7301819d08060658f7a5c80c78e03ec1106ac0ee3c50af16a5d73dd2d1cfc6850bf0691bcf6a503770b396466e12dabe4be1a409cca4300107c224bac1380ebf6951ba620d0105c3e5781d148129cfb7dd65245cf6fe88606b0153945c1304d43333ae81ba3606997fe0aaf57013116bd215a0a230a1018c542f1b50619745451c9642c8475965c12eef12d1a1036d282233f5d95d32a8212d7743e724c7effc8d6119840be788e21618a208546a5679ad88d35a0c224b6002b62453239d7f7fa465f858a5dce19e89b9aeddcbe0f82dea207eb06c34e7c873ab38d1f8e79fb845c168f7c491a2fe54bf588495339230c73a28d79d8a47a2fdac432f588bf20ed922d93e549190f9aa69318a74c9dee0717d58499128f8342b3e557e12833144bc05dc28d6d441fb655b53c9740d5572bfde1d298ed48f9326a3fb8d370571a0728a20e1b10d3467608a07e9dbf5a3ad6a24283972f19c1035806ff253944a4fb79368ea4fabc7144c594f057134074116877f181156028cfdac83b08afcffd7132ab5bc833063836dd791a45f7a11931a053ddeddc7f248633e771f86388a178ab9a82249fd12678647f048a37958f7ccce122eeda6de2e7627ce80e1d29c7976d0f7a0fbfe5e4a3a66ac409f682f0274c39c799bdcdeb414d2472c0456a7ebdbdd0fdda345720c66c4b0f4840760846a7a4e1dae4bc9ff0727c3418db070820d5e35a3f477842dfa2670f8e98457d9bd2411c3695d7cd52944b159e50c9f08303a12107353aa16ac550cfac8c8d14919b799aafa248db7d4bea58d5105bc19ce2e08fe251317576ee24db55fd3502362098aea4887330de644720a2ba876e8f8772ab15cf179dcf92986dc5e2e0279a499c9c47aa2262c16a520ac6de56ed754e4f72940242ec02c4eec65a3a163bbd44ad2fb9e845598bebb9a64844e9762617c9f38beabf07db9b4a1b7d885f2893d3c6828187f5288a51aa01c7c99047a0e9888e4c74960ef114a180e07aa2c97f49e7ba4c4339d03565c2f073b3a0128533a29491cd9d01dc9c245b79bbc7b390ca82d20195a9f3c4f16aec83353fe885e7265955eaa22b9aa467e47685de73dcf1b41f546f499f9529f80a90ba9081c49695334f571642d849dfd49e9a06c4e9ba0148c23a5b5fc5cdb49e97c487d807a88888c0a3a996b62fcb897f9a1b349998d861471dff13f0b08fe6188a64c693a2c9ef1831a04282aa78cf9f2e4f7d6a35ff64abf619d951206d322b6e370da757acdd34630bd61fa6084303dd1c39cdf61fb3107f7fb0ab463677b5310b75bfbdd1169f9d30ae47f834afdc34072b778ec4606b78ffe6ebc8a0ed4f4b5b1b3524cb6769b4818336f3646a0de5da98a0fe16a17d0d994636c6acac3a3bc7c840f41deee6d13200739b5184f8c316e9fc347e8d7cbcdc2fd99e8fe263205c194177dd681d7700889892d827e18b3640ce3f3830560743f34239f658fceb3a0f13f2ddca29c7c94ef3919820c2274d403edecbd31efb572c3c2ed7a3388afbb82832b5f0bec7fd67f4c070f096b6fc54597d9a1486e45a49e9bb3126635a4ae577013024abda9a21fcf9fb9801a41dae50b859a4c95fc43379c1682c4386a5c1a014f5ccb45f194eea56f9a30361b2489baba73553b2d6c04dcffd3302069d4fe3eaf3ee21eb12af0c7ea0997c8435f19bf75d2f1403ab0409ed19869e3915fc9a43ffb6301c8fd103d49dca9230c92be15ae1c9a4481db7b84478ffa72a4a3f803d7f1f0c83435991403295d6226bf46881df2e0d86643c5cac03b6e6f3770fbfb45ca1891ef02bdd761e504fe4c0ed1d5ac13cff7d46b8e491ed7c05ed9a83b188a35d0248dd8b2ea675c8902658c232a0e91d6a6f247bbe41ef07a37fb72d474b1267aca71ff8d90f259ab4daa213249e2cb2c5610bc768cb5b12d549b1ffa4074993446d1b172fe872b7756409641b78526680dfb68e5f78ba81b9c46e1559b100c4b6de0c112363f526f3018df33a42d31828c18000e70f29e005205bf866f1eacfafc27992fa75b0ece0893b422a8db96e3a984f4b9a37c20c73344d10634ce3ebafa2382039d3a390013a6b7cc250e735d65202e0b765320f27325f391d4caabd5de4f987257b63746d8ad81d3da38542ff5fffa712df2439884ca97f9bd8faa43f73e7b723f44102a37cc94478a8ec900458d8d67c8f783896b3626542a59f89427b483b75600a14542a0d20d2f2d5ac93f7fd566fe23dc67c7aac2cb9bc8318c5c1fdfa8a8a3d80c463f3b1bab0ddb86f58a713d6fdeec0f6b3de10b3dc6a9302ecbbf6c97f64132c292069fa7fb38df5041de36a80e05a38122ffae9aa2a307d0a50db4949d57a33e2fff66fd1c6f13415187f6737c6a8ab87a65d7a195940b3cf2e0d0367ef0038bfffe57858fdbe32a3b86cde950a2553251bf48f840db97676c03b881a909b3b78b9d57b1081e08fcb656990015fd5653fbec7c6ad8c52fc9e9491acc564e13c79090e4fc27989f5f4d738270b98210269cc14fc7cd84bc3cb89d07ab218d011e7efd194ef34cb537c33723ea456ad3f6725eafad4a05a5283bd02813b9a6ad51257706df10fe17768c93a0f7903e61c8f1bb8efaaabb76363d589d64d21261df2ddc56eac43a5c26ada07ae90344a4bdd0a1069ba765145f3de6d29dc79d11367067572ae3fb462fdafb7d4513ae5423351985acd2b02f07393b256be83849b054633b125a212bd70c3ca4d3f3dd56d8765e39601c15cd7439ac1c822e879ed8e05bffe8dfaab60af4f5116075952d203c6086d06fe85ed37b055bfae95e533e2a35886b1764383d4b5ab163c67ae5734f5de532236048af5c29057ce0fefec76576816b8a59bd0f4a38cd0b8d7a3b1fb8d1ff71dd9d980120ed664d23fc60a0cefb772ede6d79cd7153d3d24ffd0e8d897611e246deff60bacefdbfebd88567c20e043ee356ffc7a53b00b10e129d91610ddf70a77fef2e5d794d27cacef8c1f8e1c07df556ebf21483e898bcd596c0baa16d0725aedd846c8b57ac7569a56836df486948cf0238e92398a37894a3983ea57d3e903b9088223ded8dbea2f431b45fa45e80cfd80a34ec452887d7b1d1ef9200d9f3a17c0bbeab8b93bf52d15f510990a81ccfa3ba2b17e94982cc89d9cbb4d1eb051437b22719cf96e9612c6e1a99faf4d08196579c81ecf0794880be897058446eaf649db88d70b9a8cd0ce238d136e487d9d9e3405a22ec0ef8fd9847fc470378af8a8c94008b38020871ff5992bdf971088078a78efa258015a51e9017941bc9dea3f7c4cc128eda5eefa30fd39f0abac4aae8afbbfa0ac1ef4f39982bbd9f4f0b4e7ab16693e0e6adbe5eae9fc2b4e54b88572336bf0f8b13629ee654d290ea9039894c5867d78ed0f308cdfcdc7a984a142fd146877308925f2e10d7f8a64180dcc3fb4241353c4337fd573eb61903246366ee98783ff555e8fe02530a4048ce040c98e2bfed9efd9522807136881dc6b7cd30cfbcd7bf0c23504b7a7d0a5960ee8596813d3dd6179e5b8492c1b4f019030de10e12cccad9bf16858e41f2ace9cc6e438ef26c6e68c99573216f09247d90c19099779180131316ed4e2486926426b1cf436fa678c7e6a24b4f013125ff6c7e07355622eac25eb8efaf23e6e61a4c2d400f6ac04de806b871fb6fffc9bec0b01750852d997012391350786fc659f402c0813dfcd4ac57a4e30b04ec4fd56815962ea123623da57cb992468a67a8ce4dbd6a01c4eeafbf4f50fc3c92e6697ad2fd4e80ebfcf322001b5987c5839c832708ac776641b726694764bd3e0985985082ff8fd5bfa5f912be00dd650383beaf21e1c295bff0c830b7f9fc4ab21d109a45e914569575e5a9ed942242edd6f393f8684d1236f08cf29e91d2541e496aef4a518cb605cac70679663ea64a592e37d847b92e83e2b042be1f65ac116d269985450b35243b6f00eecdb08822b3925ff259121a6ab06e654ccbbe502d3b12aa5e64ed0aa58320cc0e08cba56f4643c9d72fe572dc92b34518d3c21ce9015d0250e8c8faeae27b101e067fc3f2b5771b2995c7326107215e0cee6c5d3bb9be1b821bc00d76e3eccfcd9b4b5ab7fde4f34336313a2ccd6a0ae4da23b42f95bbf2d7de1a2404c407e932c6cc0fe092d078bfa1ce86ad6535bcb8816cc5458e3429fb9e1d055999978fa68e613df3c2420e0572678ce9a2e751c6dee85e400ce1addb38a16b3421ae1fa6c2ad45a1fd10656308295eb9a95cea3c928183c82464395ddb98134b5ae1d3992727625bc9ad937bbd6e59b3491fd72a39f9332218fef5c08e300be75ef3277497a5c4cd63ebe3845e850eb78324073c4041032c7f042f9774fd508da492439454148a2595b5782f9174c2d83e0310635239cba42282bf596e4d2ae717744504ad584dcaef23538e0042afc53b7a3aac2022b08066e5fd3eec155854d41984f3ff43352d4a30619e6d2ad266aa3b442b589f259415e991e01046587c1c29cf9a0f6138f5778e9a8abd2d032fd6f71693bb4887ce582419f407c6f13048e6a195a895ebf284936797d05c2a1312c7c8b3374424a87e8c187bf6c225963665cead264411dbb06b1a5e9b32a66fb329455bc0cd82eab9c26bdb9426c2297bac1ef38351b1573f8e8123ff1de472df3d374b1f3ce08f9b9268cb468f9ec3d29d4918922c70dd94918479b831b4976ce5941eb13bc331c96bfc88352e1c825bcaf14dd9294a31a5b1232a03e12863f83327c22ad2322465043ec2e17aa8a3f09042efb0879f4f58b0f55ec89c096241352e00e36104969f78286ece62098af07fe8a0564077e6c301eef6dee06e18c51e5082ae4fdfec1ebd65a4110e40771607baac2445bb6281b601d49b043364f177ba3f0aa958029ef07b9dbf4acff09a848e8a7dea75ea97b296a2abc99476cd1e8e5153810e83021bda51d84c94cd6ba6f6bd70073d0f4d510a236e45d20ae44ec0d4067de328e88c9302e5a604924245e84858458ed3a53ac6c4ccdba348f862beb47d1265990326d2983f923105a5948a0b584a000b5ac317a8c6132538860d4a60086a1d1adc4adb286998d010b4b2f0ba8f9a3b8953a5b833a1e97119ab1c156136f66e3f470e409135c01c01ed8f402223c49922050cd3ec7808893cae0703c247af1fa7191c2042228f4e1b7fc7e9f024470449ef19003d414d84627c9738d0de8d43744d80502b7aec18848febc1f0d143ba1b78b528dfb5e20f632fb048ec21c7a577461e0d5d17f7284423c7c17a36aa10989daf7f54ae0c2aa6add860d80c665d4b67e2f49886413f8110831ee2d3bc869154c411272c1165e0916623a2bf406aa2f3035894bf5c82d79c5a0d85063082eb771369f9c851ce322403f8091b2bcded7a05cc6cbfe7f0c6c5051432b8bdb23468c60c9d5b1465982c229979a934371c38114979c1bd5478ec5992cbaaabd70135e46d67f7d6ae31de629c70304e69b00b1f11cac339698ca465a1ad11e22f3c127e1590cd404dc5b8a82948017235040d84a06951828de81a0cc1d901d93d02f0930319204917a82644ead02610acc8bb3873564c207d14f857b2ec56e6c29018037c786db42071e42817c09087a7b099391001a9cfdcb6e2613261b0cce2a749a3d7125c8265fb4f61dfe10b4897b940037203875f509591e1174d1256b8057f391c0c08dc857c24c319532e2d0bd90f26f0c5fb2e2b81503a145333a1d5c578ab70d274e2fa3828b1ad1068ec1fff6f229003605404c906d5cd2abde2d58ca4744574bb7c0f354c8451c0e853ea1e1bef50f68d79e6e481b040580ed5af8e4f5b20c11dcbdc258a5121b78d47e55af7fb7b704d294b4ca15365efa96039d81bb33a9205235b7c4810a3c61a4e044f6d90bea37f4921fa36c32bb1b10dcf4d9f8e9df70b02922a6e60deb14856ec1ee7bc62e38e49c7e2c3eedefe658fb6a8440e44eb82e4094fed0a1b7cc164772501e89b1acd1b86c0af67f15a2c5e1b8b060d6e37d9b84a22069ea89735f041e2b1b7ceb9571ad8e420ac1fcbac2d64212b4696a4c7ae1efe988c8d87ad490b921168b01dc9824e8587a3f1ce290dc7a1c466e7a9f02e4d77c7e2b63b00d9addff3b8f21a5cb40b9871347383e8c24df8b6513bb1a01bddf18aba805b3d13439516823371740f20beba77416651caf1c09bf407864a77c962f920e910880ae466b54c9e4e3212cda6d88bd514124fb61fcb310a63e91411cb2dc6805c9e87d8392dd77b761ec9bd1605c3ecfae83fbd5bc12c162d12f03c354efa20a423c3bc84cc89f9b3dca78239cda3b083872da3babedd2ba9535c84a566314294c7098a7bb6fd843dcb05efcfe05b208004057131deb8ddef20bd8a03798a1808eda4d7005fdfca0de687e413d3f13e6a13f894a7d99e90813ed4a722f67af8eede3e3ce1037c2b174ebfe580d85bb9a1a1ed2142c0c2502e56eb5de3eb357a4dcdaca39eef4cc429b65a8c03ea015d3f56ff533a251a15a868adc798e87a5eaeaa58d8cd0c379bfc0c1b7c0376ead27d417e6e26bfb9817631a93a13b141a0a0f7b6d40b028c5eb330a8d3845e9592c47fb5005ce6814c748289cecb2e5ce5d3499d075beb86b7b1641fa25fed315cf7ae05abd1f7eeb3897b68e1af0cb3e8650fb1dc9ebef119a7c947b58fc3617844afa9acb376eb248b5666f758bdba118fb7ad68ae0cfa9efba7f174130352659a559a11f2093fed1690371ebb5d0df8868fc23c6eed7785b87fffd69cd1b866e8233f4a1824ee856840399206a1e7743d4d64d79a811c9184aeaefd0b17b1644dfe600710459d2114d55d3e13bb8aa0e887318d73c94e1f60c70fc9a305e5d8832e10ad394b798ddcacd87803648032c896e26ce8383f6dbcdf1b5f0ebb2d6b8a414b3fbff76dddfef9b463df38f89613ed52682d6cef1432dfb3dd677acbb5ed079b0931236342db3f359252083c362676d35a73e84d48f86475c35d352be3c3030a5e0c17d21dcebe1e7dda0340c26f84dbf4ded24b00167a086d2fcbaa3546f39107d0f9ae9a020da603da45e3157f69c968ec6b2f1ce3e9bf84245ed72d031806caebe090d16f6c5cb270162a1e30bb89366fc56cf5564da798e29cbf40d08c26ab038eaf53be3bec6ba5df23791e79b182b4c08399392a0a2435cec8592c0c0e66a0375d0c0f4616e5c887290987c73fe9e74e5b9bb52811ce957c32b7418956d8cbb55964f82978ceecc937a61246480d64e0a908bf1b46f84c3b30dc07e0d216e663f0ecda591a46362260e51ed31c6fdd2a6c20434ff79522df88a04ac421e538c1eb77065f0f6eb11c22b884c4983c4ec91a9a12a10d5c8d2a2787acfae310379a546ffef09c2eceb47e77aed489a2a8c6d970f5de47e6b705afc0d9c86c055f74af82159f9f68156a42392b6687c9b772b67056406503ffbe844efdf2925677c28aa2609eff1ccbebb10c7709ab9469cba45b8728e2329429ece58e67703bb2002bca2d83d85d117473a63067bc06024dc2ec945a445796d781a92b81c197afa46a1351194ee443aada1b7a5c6fb0dcaf1bee188cf9d9f52a746a35e84a014ff081e426b372a0f2ea4a60fb008ba3fbade8fe5767c94b877fde928651413d59f36b30d0fb8210ac74a4ae041f440139e8ceb79bd233276f7525b80e1380e60c5d09e5b8397100fad2a84e516a1635544c3e73ade8c955422bdfaa9ec41d15e8b72023636fd0f2baa2ccfce878cc3b7c997c7189cbc065b61ecb0b2b11246ef10d8cc0b6c6ca6ca52fcfdfc364310f02f2c2554258a92c4126c137584431e0a02c812c17eb99ca12ee0d531f8c4e27d79288b05ed2e0752df08ab204aee490d0dc8062c886f5c8168f020d88cac37101040a8ad47aa47b1a3c147a8199af56181098e628a170cab67e3c6572415461fd2b3744edb12d21ea942584505d4f284208315618fc4ec8e330e6d29d1e8b3c874376370688893befab1f6cd7628055131ab1ccba1a01c312359f14b8684c0f1c4da1f3128ee6e8953c93fc8455e3e6c07ac8b5ff02b391b284be6ac015170e988d94d27976124859024b4dbe467568f2de91744d9d910005af1f2e2b7e650734e48a7860cfe78c1b65b17fc12578aa1045fb4776834508f57ccd2e12fa9425300c8949e739235da02c51a1070a468fb0ad8661a6376a1ca166f88d94763026255656966815119097092bb6eece8e00c6f4dbb4c5d475fc87030764cfc5a543370612608e5f9ae3ef67385c42bfaa01c7b70b56e00b6fe112187169756163b13b039db41a5e0332711acdf30311844b6c941dc700077a67be7bbd9b9c7089faf79ea8b663fa6b9f2f4eb84450a93ae67744be3c62402c114ff355d68095880dbf0372d22e72142058ada61ff3a9b48ba5eaf253bd5d24c84ae401fd7c21faf4d1241433c2c6a62c4fd35dc58ce3383c915c2d1e443d14259815cb141d625d79177cb18566ed72061dedd73bc49973bf938f299aa21ace8c2a5dd3a22a4c5aa0932af2ffb1a062b04783188ddba25d9ddb6efdb662025ec8feb6aa410ef40b4242b52e18e52ce49d3bd9f0acf00bca120be242fea09966314766a05564d44fed404f5d5f5148c99c0bcdde663f81a1dbb2f792643b2900e1525538aec97b185d25e46f659bcdbdaac05e7f22d4f54440190220a6ff0f01fe92a2a3df59325e9df1df48037058ff45d5e37e32979c37af26ad31a836d24a8e00f98a5970e078a1d76393514a73d8e3d8b6c844b40cc54d0ef261e073a590f5b26ac3bf7e429409ccfb34306bff63a7585c0fef16b2ca82d29b38e89959ea562ec463f70e9b779721f5155518ab16a426d1a3e917dc34875d2faf9c8061523521c2f5e1a357a83ed8f2852898424b8b882641ec4ee78907f5c079de0445b383d184d65aa139ad106674b21c10575c20ceae848dc7ef83c79ea36eb4459a6b3476fa53905fd62577354f8abb9dd7d13c89266ae93f5eb5643897366e10457dc6b9ac855b4bdf977a41d35346b020110376e24ba37dcf996bf408e92184453dc2b383b2b97cf91acb92f9b858304f58111f712674556628e74856bd5bb56ebdab92ce7d9e54233ca06ff7feae1e0542c8df93e7bf76aaded561733e11825282e2cd291b9731827e4ec47859e8972a91fae6254815562a34e53b02eef865297e867df233671c646df48722713c7499b55f734e71ef80e9d70d48e9ae5774692ee3672f7bcfa84069709a5d2d686d3ab483d2de60043a8a3840ea41c5a90a4dd51e289ad5ac6c64a5b3573a7527d8c146670af6bada842cebdc8586f84e1e8f3eca5dffceebd23c6dfc69c6eb51f9aecf0b6ad7e4387f19632d4347002b4342b3dfd456acb330c22a31abf7fd974570568226536f33257dad92501791beaefbeffc38ae32857c4bd24e8c6d84a28e8ea3b9f7c91cbf04f44ae4cc4b9e56b654bd7cf12a5eb90340488bccc657afac8b8a768dd11cc2ec13972fba03c77ca1d75a240e79bc6456f53ff1216be8841d3198e58b435b91233e5877f7209950f9e29b45799f45e46e393aec5a17eb07303ca094dabee86464b2c1dfcbb5a380a30b6d1c221c843e3390da31b7ad09caf99278d376140aeb42aa19832b9662af6282fc42948e8943920a89b1533d301d958a457796f553f3739a64a011634e2550a5fda3dc4363700fa15182362cef3269b7cf58991af9ed4b588e55ffae0b9b3a1a123d6965d7f3225b10111e4d1477c1991c415b562a51f8b6c63b7673284b221e83c6a1e4579e9a0594e952a90f31e44f39583d747d796564f5d37b2c6baf9c435a099689cd3bb98fb0c82075026ca046cff7c0e0a71e44ad876a2473f2f960d393c0f84d6906638c8d21123b11956246e8ba23d8cd9f5f940d2a3e672f6918098ee6cdae79e456aed38dbcbdf9912197ab5bc9454516725a5d94c1c265e0991be396f13ea5b1bd9b20b72d5959db1723da4106aabf4e162a1f581d624b9a2d6d963f9980bdcc7d5337e334315bdfe47450b95b4ab6eeafdcf22306f1ae8011538710ded7be87654c9d77c15415f1740539636a74d9d269349b1237aaabe714cbb9a176c939863406b838844d6320c5d8fdadc2dfab06012848bc71629a1b54851186af30fcdf716e2aec75980f2c9cefc8907e7aafa04e05d7023e4722ca2641f315c1756a703229098ee1c9944af887b2cdfaf8337dc55c17c24a9cc9160c642dd9cc8f48306c5533719c3c140aec14801244db2f77fb74c64564e8a7da67c27707bfd04c5816bfab1b402013f9d05e70fce91b21b3709fb7da24cf2adcdfd3dd1f4495bf2ab01bafcef9a1b4743eb6fbd3037808533a1bb60e9e170f76decbc560a1ca62a290d8f661badfc8588f943560e3ef8ef7c76a215d3996ee20d0a9653dadf440a8a36c05b5829dad377e6c78cc3d804edcad4334f2bc48016946e0d2be4f70a4314f4b5657f3b4d4d5b790a2ae2320e57168a50a5a11a1e226a74fc1df9c1e72825f72ae20a4367ab6e576e31170ce4c0e177093fbe5b4e8a33d60f7b2b28dd46e5c2681949ced15d773b66e457550a0ab9daf4c6e0c35be08bf05609429d4c12086a560d0e7b54ab0693513867179fcfeaa4b44768134ed6c5f0f63d5154aa2696e457eaad134e9b9d21fb43c084e3f922282b68113603a654cd109eb9986aed801e6d66560cbd6960abfbec62bd13dff9fa09414f79b96089165b616ad3e653dc2543258a60dc39cc5591dbf5a633867c2cc681248c6566a4c45b28ed5848292f7d1942f818e9039d4593170e74d84125b9f2deef5c7bea7831d0e7e8f97e5f20537486b61f305cbcda3ec50f0b48e3a72fc692d676d3dc74d7780037ce5a80af750c4f83735191fd132e771a5f40d6295903de4ab990fb107ebd3bb38c9a33db7f118a7ef519831a3daeff61d9bf99b2473eb205570e624fc6276fee1551ed2388ff73bcdf1facb9c5c48660cca24854780dce2e276d220459bb871e13acd0fa797d3b41144fe6a17fdf0e83e1fa407f61b9320d0d9dc95d3cdf74e45cd7c51d4ed1c6c13be22eff85f0ef3b147dc7a1183c746ea3f38c54ab85b6dc00f21c610eaf42527401284853c57b1f5caf6b0d6433aca773f4d9318714bda92b53e11e1ac51b4f49a7cfe4130756a5a8534f33c3cb83008e80feaa08710281e338946e203f07ac29588b105b96e5786c6b911c02c2531ad167d2aadb558708f0d9b6a1d3ad4798195b8a81731052b20bfd001543302bfa59f1605cfda32770bbd77b1a87cffe4fe0a7a321c5d820f34301c823b86fbc526fc3d28a5a90cc8d28774e482739cbbcb4dfe7d28a5b25c9064f1c7a8dbfc69ac88e714e80414cb0e51aec3698be644a1ee8ed1b1adc436609787aaa784ae6f7a9da1bb1ba3f467e7217bf24c6bf74e39a5f595fa7d95045d7fd88fd68720991193aaf7ae41890717fdde17993efad3ae0d741c6f06e339c5c8bb70ac6cd6e97ada9401227da5dcc499cf513c027107f89139128f7849d374745ec160acc0799f60999d0081ae47f1c3c273d52d5748adf6b3776ea60c9ee76e300022cb810e063041ecdcb16c4686a602a8997cce1845e3ef14f78197f88eaf7c729024feb4f9d8199ba1481289574ae0190adaa5f012171592d1aff3e5b0d5cb9ef086168e7c3927fdab2d20171c86c0b8823d59f0e5dcd3d2b0d3fb057ddb52f5f4c95c12ff156638fa7e75aa5b467f8914b7e72f824e4aa228e5c722cee754d1769a909ecbb6ec2f0c77f120293583753fef6bd9fad1effb24876e82eae7f791e63f2c81d0cee16d64044bdceea51c66aa79f14b5bb18d54b8385a9e1289386e8971f32e42e5816de91477d178911a85892bb1cac7c0e835b5e0867909a3e046ac85f33ab3a434415598a13d7a222c0778207a08d5402ad39a1dd9ad8e3b3221e3925fee029f0823d40845aa17a2d61a7a874d0ac93cab3df9f70a2206d5ba39a9ad9d9c6855838a87c7f4e3203bc6567225fcd82dc60257ad8d71a516c7a8c38096370632a6cef3e65edbf8f051886e23ad8d1cc7fd9e566562519d7d0a28fafe35590a3d97675d29b41c644c2ccb08cbb15efe841d5b407357fa370a89771fd7ba597c060a7dbf372b833aefafe3c518a7848f63f6072d9e81fb904c56db3cc543daba861ca06f7602c1ddb940f9b1d38097bb72f41b1abab42416c6e8b35a5c0beceb54bb10f365e5c79dcc350721b1212813722584b28f734d32e6ca2ea552b0df82ed522bbb237f172843d15d6897d638fb8aa9706b882f609c1775f6ecc1bd84c262afad397f200cfb1939a147459563703a60bdc7ba05a9b568fb87338c4da7d826e2ee82c4628f3d646ae07420fc0a8a2623166f246af00c49207524095d3ca0e4878891b2336d45a8041cff2d11ddd073e1fc744162746d7d903876b3ef4cd2c603a5aeb97bb14659a09b1e11013df0dc5afb94e1e91c39f1ade829a80a0a1c94faed29d849b80c82254fdfe1a5edaeed23b9b68d7184c6d17bb82d1f8d3fe6e06a6fcea4d382ef38f992131893c1b314fe67c07c9c1da1bf8111ed02763b4914a0fbe78409021d76b800e966b8b5b0350eebf36063774d805b6839668e4caffe1e0997eead4b9e562afda005f71caf0ec229015d32b3d016226179d85769d6a03e6835b6edf76cdc2da1f4cb5c20c239f3d7297e04ba294484b508daa422e6a5cf5ab3c0ae44309044d295ec8fbc4142fcddcfd1b10bf4a78ea79384e4f9e6328e1a7b3262ad208956b720615862c69328ffc51bd32f0f0809469cc032f600b0ed06e44df83e65bd46c4cd9662ebdf207c87d16b74a03b6b39800ff0b3e42c0a0bbe4e414e079383363758b55f0575e1e8836a39316c21c169e4ea6946b038cc9e08aa447bd2ca163e6c6f0c7516758a5572476005bc0532343f223acc46093275a42cd801f0c6185b55325e30bb5fc74f702db6756f22f430cb433007a5e0535d3d34dbdacdc24f5c64c54391eecbc2c92b8c85f261ff7d2765845d4997ba03bb3712cee552729f7d908fd7cb4273ae13d11c16908bde9477db32b1a8c54a0aee0392a27739294470e0e5068f953d51145aad3c6746508eff4c13a72a36d8c425ae9a2642d8af5721be70b9a1f098686c2243f4f87382d95a3475ce4a1feb8bc90d36f7e0b11c8a2484b1792c88284f8d87e16a92f0a67a7ec499b790f1e29357226a9af4d176e8afac9d6cb5e8e184df8583196b4fdb129fde4d251ea1eda3531f0dcf12ecd0e55325f325d6b30a2482abc158aa5098fdebcc44ac2dc727b12955c4a879dc5cfe69cbb713ac9ef4635ce6cddbe2f0012f254b099b79433a0528304df658c29e71e2d5ef7c7c2a45febaef01c2374cab14b1e1d6ab77f42bcf8e77f967493db0edc853e5c1631215b775af6a1667eeec4a328867f2d4166cb6ada3e4c94d65a84ebab8217efd9e8bfe95f3bb1e1904f03a3dbd8048ef5939f0fd65388574627e0f40a34b4185c602ff9b97fff1f71da2afe2c3dd6e56051fc75090e9347355bf381c27609cc17b09e46f5408854968a943292214d50d019825a433cc2da931e4f311b78fa248e5cb9349a748131528c87f6a32d6e26622137185667cf136d149cf220407901110b25c297fcdf217265e134e3ff74b18b2d77b01b1257787f7e53fc68c21e5a2191648894bddc9c180b681e4b6ab1ea4e45550b37ea4b6a94de111bf2b0ba6e0c88a7af9b310764c218215d320819a9a0d9338a3763237da100442a7a024ea3f4f1b36a61b4e02b361e4d4980e257594b8da5e30fc2eb1f4d86e18762468f2bea0862fc7c9a07b8790ee497b5a8326ee4b5d7faf8e05a1263543aa1cafaf30821d429b4d3437c456f56c88711cae3c673ad82282ced1f79a2dc85160e7c3978a9b828c478c854703f630e9a329351910f0c9adfddf7b40444aea869cdf4e9166014d04bc19f881664e3903e53b890867458c3be637e2e2c368f970d67ab7e0fdcd075897a8a22735944a228cf23cd59eda02c054463e75b7c544d97208c134f92b807c2d1fa13a64c2988bca5578f59e12715975140d180851c789c55fb6eb77b7c5eeaf0d1434c898540fd5fadc2377604e5a53953ae570a87f0a190b2c694f10c9da99edae4a775ad60453d23bc3507206e3db10a4d338e9ae218b433d344217461c397140611cbc5a5441e12131ba9fedf335cd6f2712528608a1faf4ab387f0a82ab9cc7f7924dc39ec9d632767bfec834acebec645c4eaa1a0782bf93800da7fe6b1c701a7329d232ebbd8574f0b9466c8d660fea56c99956e0230b762c5dd1143da30e6aa4f4711b4c57c24cc3a49ca6f7169cdec92604d8db1938e94dd64b17a71fc70c397f903023a9a8bd1dbecdd798b301acdaa94612d8af252791c116976a86f9edf50bf2d3cd5c8fdce520d29fade910549edeb87340b5814b908167a83372b502046885eb5b0338ae206b7b0fa0f00a98b48236203630403d46f6080c318a4e0f1eba70f1dafde16de097d7b7ced8a0251f675a16a691d86d19cc224a0d3f7375584b960e15c7e6021f688b0cc7075ad615a83dae1a404905368f3944d32d5e9727c68c861497b17aa8ecc8bba707794e1e0a85ddaf0c743274c6a79aeb966a06ca21ae08063a464c27081fefb03d1f692a0ffb78abadf33bde044b448a0a7fb82a91dccc747365238ba5560457d12459f8f3fd7e731dbc31a18f514144e11419b6479875047c12fc9f559b94047cf3b132331658603016418ef53fee96d4cc8459b5d81c55524ffd65c64a0c40c2453e93a09e2de4badc7fb35613eaa986e96fd3a888328699e199b56c77d0ec5f1e608d24990269160b5913732f473452ad4c9dd6dce02fd5756412c500ec0739b06c5728827c849d00408c89214ae3e6141a60c9330d4dbed87371dd9fc5eba8af95790fb3fd6d3f0ad3da15a1d44a258f81be34f77f160b3b7f508319f7107f358590a06c27bd13747222bdb554da4bc0553bd9a9faad33ee7ad01372bbf0908063b83411dbdeddac90dcb343ba946c6ce9e9315a503b319984f255daac3ba649a2e4f393b5dbdaca2438b686a5e6fa38ad44902a12e2174b041f4edd4cb75a6c0fed3a86fa5d9aa19e08403fa1d1ce270806f0a5c6f83f89bfbe54ec8486d69c37f40097ec1345c0d2a2183974afed4810a48d13458086f0354b8f81194bad37fdc3a2e86856d239e7b9dc58993103633afd6bd119ca5f70457aad5046c9cc336caf597b0adcae234fcd40ac3ccd3d863c0c47b33a040bfe8100fa06995d54c13a0b0cda9f346b64b07a1224d3a66bb1ef7084b7c3ac6e9a741f7867c2f35e015f23f4f69f0ae919f51d1bb2a665ae3f5777f9316f6c818b57b1e2d1a2074850c4cab20a77580ce5c825f1ce8cee27886bdf2e1f939a3255ca2479541a953546b580c0526b66afab3a2cd317db31e1e85c691383ce6eeb85df29c67007c4aec7a71495b95624111a9a6f2932c58687be8a9b8f661a556ebdcc19d5e19cd461abb5c77182fe8af6abdc0cab49b7561600ae3602c3c4748f10e39b67c5892b1e4c0e31dbbe292da38f9a53baa0e4e86756ccc2ac9278c8f78544028e7dc89859dd083d2e7ce8692b163758ac87313a08aaed3f871abba05d3bf9c144bc6616e21c49fe22a3a58d18ecc7a4645c8976efb7b4dd694bc71527f5c697ede2f6f85e9cf427a6f6795fd02e6a7a7a861006f925ea9451a1cd6306feb15d34bfd7ccdb8a2b13e15fe46041fbb2f159fe670cbccb0c820c74c21b4d98b91e74b43470cea3b824a7e246fb61688966f349846b4417bcfb56ec68d37bc051b204cec2b41b5d2f571daec412d057ae9c628f54c0c5363436d281a50a8d5c147dad19d676ad92566258e63012d2d8e7227503d374b8441880827985a302464a591f84e737c6df9b40c6ab37c2a484d82ee7ae1a5b8a672c70da89f0080bd82df75967902b2b7d430e22121e12a6df43518fd8e05997878bb602fe14018e1eb0d4156745b9d04c7c4719d695626a71ebe8cec11bcaf3f606fa451a09ae3e5ac32d830bec6920ffc40ed79708c97da9cc7af58ca1c2db70e2cd200f9cb4da1b53c246e39f51e7316b4340e030553aaa9a7e7621b1bd93270533dc57ec0554871568edaed2c6add27c9a7fd636315b80eafd7e0f01d69c6d445db99bb3e4479cfe4c352e04af77ae63a0023420a1815355ca6695f0acb86279ad7ab658fec21b0268683702d44aed7990f44e3df7ba0bba4226389c8e391665bccb93db08bd7b238c1faafc53fd83c47ce8c61d6b6e061559bbe9e826930f23489e718bdf498ae245c5e67f0e8612c309d24344634dae13240d55850b784ef18320e69ed0dbf54edf6a3d4641ca98d05a97b60f0a60b4034ee55c617b36a59bc2b44e3019a99d22cddb741906d446bb6c06def5264de6500926a865a72998d428f1f4c81f5800af2f0650aacd9132e7c29446b57d8f4c4dcb7173d7464eb4fef17fde7d6ad246e1ef0fa0f1a4a56f073987f03f8c4d391af92a7734e3bc32acdab602a5cd4e9d208dc09db7b283e9deaa0d38eccf088daf17136e57ed18d49a1377c107d6316002121d1f48b0f13c0dc200c33a104898f7607644ac3ad16beb495ee2f7c7254ab2d9dd21d4c9105f03bb0ad73ed79bf4ab60812906bedc41ebbebfbc9078b18fb7c3827d6d973e34fa4ab0f1e115eac259441a021edc67b83864cb21c040603a1574c33fe939b3d31178054efb0744cb8bc522a2b9ee4685c794a8dc84720728a27deef22722fea7e5ae04568e582c1b153de3eb14e5602153d127a358e3ca2439006a1e8516e3a8c48b0ea28464b79e7ed86beebe5d142724d062ed5622566872cd7b11af2608dfe5ae6f5a86d6e22a180c026600edaaaa1144b25c8e0ca8b163f9608dac194f0714924469f441d3291ce556f27692c3c2896cee6a1077a87ba15400aa8f25641716bb5a7b7f3cdd1821be4b29a45a607b955e5d6bb4708f1aab09553982ef77dbcac4255dd312cf04088f4936bc7c5983b286ec8209edd1f5360296c16c5e7dd5d58d13d3081932d22e4846d66e284defad4b38254710a2fd75dfd7c14b790d3e6702ee464909d5ef968f0a95541e73b754398cc8e9ffc413378759e40e66d9162b3c036ebb6225fb682e7ffd59ec1847b8f66b692a91e305a2b475d7a2ab2ed11b20974a223bfa8430d0e1d039870244c854ff9e02739a0f593d0399bbf6a2faa4c70ccad5a6c6253e0fcbb50a0e957b802a21256082f941c663262cf9d2720c07117aacc6c24b1bf1934a00894a018cd3ea9793ed79a90162b0f6e70349f324d1541010186a52b50e954b38adc456e14ccf61587532938816bc21a047d4a57fe2c1b4fc578ea244c48eac44d8c0b265f29116d7d174f27a0c66541ed7d9696ac4e484e65d65e35337ca750e98738169b3202a8b4ae084a0a64478ed3ed9ff4cc2bdf2fe40f98c962d1e7cb19cc7fac10796d54c32501368960e79e198fb149274d7b090a32168eb4402bdeff918a4650e719140e71d579a8d79340a650ee85ef488140e29ed0926cbfba3af1b04af9c28fd87358e8762adbc619197042f11433c38e66fb750084f10f21b36846e30c577aec1144ebb3882902a7bcd9111fd12013bfc086550e860e14074609255f0986bbccd22634f19dc5f5872a16586bb635589d9edbb93a9adfe44d51689e4cd27889632ea7deb219afa929efaec92da7baf8108cfe641dfe793ec929852ba40cf93b7319fcd56c00902e1b886c84201bb58c4beee3c65e1da3ac4c6895df8159d455182a4dd2118196f5b3e33c87b6221fbb847d23800f48eb16160d75ef6e3073119c901be8f767d70116c67ad351d259d0858e229d08bfddf99605a9dc194277982c816ff8775b7bc20f816f7444fe7374c79b47684420467051a69fa1806b7b6e630b2b6538fb2253455b7cc688630c0c36f18c43cd9c4dddf87f61b056ccee6975aef9c255f1513e28b3c08c12c57eaa01d6c59925e12c70a6e73e5904a0e3b9155e0570f2115a0fc6f2854f9b6960d832568ff14c77d6c747f90cc65cc788afbb693f23c729f979ade141e1ec788bc2f85f1cc07662989e719188b7a4c96c0c716a122fee67a5f064bf084600d2030c5544870883c07d7ec4b261e58495d99791957c387d17c5876133b833e2f34e49e84ffab4c98c0d024eb92eb3fc2fb6acc75d260a65c89614bd1749013b92f757ffc4d1df7cd8b384cbf9acdb3dab67b18ac0f92a931c4126e14bad47f609daae1a92a10ce98734d9dbd942a27681641a0657c60b5b311ba9ed14c82007a9d1e170dba49ba0c99f71b588346a25bf0dc54649ff7622586191b17ba03d114ecbee511dcb43e3618045a6f4a93eb21026dc67c886cc0adf36b37091e2908c5a2b202a50d710513efe3f1024d2bf483cb5ded2fbd23aac851655dcf97005d7ae5155a30f1e763b8e0728d997ed615098c39f2b9500f7ab2277b29ae20eb8abcc1b583121e7f3e71e91e923c567c65120b1fe7c0a3e77369df84f56801aa53fa4a2ff987d550e6278b2571d993b7152e56fb8d52f2dcf935f4a73d58575f3ce302d4af85a4fd48edbf55ba6833d06a5758b3a7329f2fdee7087ee23c7df51d620177b289e5bf90492bfa884d8c91dfc3f7e689062efde0d1a90e973138b04bd11924d7b4cd275e87ea54b02c65704bb341a4f0c0013e0c6164b59b866b43c33e0205f83fb5459400c28307d5fb874bb31d72d8924a935cf976b2f70a8adc158946a730cdba05ca4262d0222bfc93e64e4d48108700afc797b622c006942dcd2ca3ac11a5eedc9ad025ab87fd7d5c888782d8c6248bce12ce66891054752a82a722798025035079f900ba6947c5a6533de0b129e328dea7ad4005fc514111104b9ed2a585e0816b896cae6f4c408cd1051b13183944b14fdca366548d2ede3ac6f27a417f588735e88c485f3dcd6045728bb219bd3d7af1870161b39814796bbea40bb7cf546cc8b0451c04a42a7c5b262068169308cf7827d7df8466e2ff6120597eb96aa250845f164866b51233afe6b7385d006518ec30611f23d3cfd1a2bac14d21940b07563fbc6b4e0674151363c6157cf32aa1e833407cbd3912d415fe085ec24ec9550bb6055c718fdd610e361f7663d691ddf32f92351bc5ee175e56ae8437884c7ffb5d66fea127bae193516b0ca3bcf2b6bf58ba5e5bcb5efd311a1308b11a59c2ace58be03535837ba31cb1dbeb9d31707f216d9f17bbd1f90b2371bfdf751a9c6e5c1adc64fd23ca7a16d698d9f41929e3bd07f1617b58d3e480809daa1ba089afbb81f4ebf99e54beb44a59ef6738058082bc53b9e8dc1abc940cd28ae37ef206a250f6abe4e6d992910ac3464867322a554a2b1db7f9f239cd71ff41ff0d3a2a7aef5e455009b4c63ca7431a19ef63d189e208c5c04d530180c0adc0aa7382a830169e9058f9892ab5f617291d3b07fe4636bc7d8009087c50bbe24b57adaf7bda319668f54731f86e6617047291ef273e7487295e2106a4d821f0d0459fd4a62844e37cda6432e143802c5558aaab7f70ade9712424c9b9bf932e26dc48b2298f33a9c0ce3fb8e6d78191ac6f14424217076f5bb5b42af582398a1ba0052786897e8ab610183c4c1d47380d2882578fd13d079c007f3a0c107cd7a88d52625087d53c0cc0c0739e0abab60569e53ece5e2df459ac6150900a600fdbe4175965cf021ae0e19a844fa5021ba2dc758686bf4f31fb17303c560b4f0381ca12148e027e2b3864aec39fb42ce8216167070831d16cc9632a44e3f062ab3de380428b48c142f18e28f7c0697b8621595da3fcfceb08e1bd1c11751b008785fce3972ab240795ea2a77028bf7c18a5a6164e539987d57920fdd40903781cb243e0872aafacc2a8a48493550f80012f8d5677e09f1a1f141b2fe016e6cc6d79cb092801c0de37f5986b49d33d032151fe80c8002ce4fea478e0d3527061dc2bf1fa7fc388e83ed81f5082cf24948a4cf8f4190640b86a1d90ca9031e93a341aee6d58061aa5abe20929505d1318444e96c78064e0e7f54abfa2425268b19fdf683289f2b4c59af79243ec2246356ac82ced0bd4f238c10bd96eab54dc62aa71f5042e1458cdb9f300a0b6c1b4433331a94a22a4cb811360c885ebee0db4e3d46767e0066c36caddc6e87d480ee89d4bda35ebbf04edcc755641f83048a44aae72b62317c13e98a7cd7e117a4d2492f944a22d348d9eb69624f6c69d27c7ceb10276c5700de772e217c1fefbad6e1cbc2d541df046b552f75f8594e3247dd079fa590969f6ff688c4a653dd3ad5f65752f36a3fa2f2ff3f4805bf478b3eb7cad35900d07d9a5462f93dd26d1127db2a781d9a3b830eff313718ff511377b1eb612ca6ab47a6ad8680e1f7cb6ee7103d9b9ebebf7bf0504273262ea4e00656232dcfa852fd84f1d95fb437d6486382c08ec944bab0d6ce537fdbca7e6aed7aca73b61f0fb175d85d98845ee4a48c484a6ccc8cd80bb6edff2deaa3b6b75c23f92dc17f90c49d6c5b4c8873133a0675c54f8be28dd5d6c04c32a7318d069c1bcdd8a175154f5060dca35b992c4d2dd1bedd7e2e0d23317b647c0c0f7dbc715867306d5e16c0620d19260f5ded25d010b7a5ce3d9fd8237b20afa2156ce5200e6e431188fde6ac1f8bf67afdf4903f417de42d21a902f13cb124d3cbca10f9ae4817efe714646edacf3b116c087919f719225db0db06825b3552f1789bf43a293cd8bc440142b6ff9baa00fde56013b42583b0c8201c2c1cc42ab3986fddb0534a30e286fcf96e5f0812f833c0e58867fbbadb695e36c6b41b1f36fd51ce2699f4c92c7dcca10b658f52b200d855527ea57c4ac0f777b2f4c57d07c9a987fea85f1a2f5d7e31baa188124231c0cfec5c7086530791b124fd3a43b67b8480bc28dfe28a148814764374010c9948fdf00f0da31bca19f7c99c4de82dda9854a8fb9c8b1ce52cc2c91b248bb583577300af03db7723b37861b01e163471c3df444dff8f9cecee70a0e411d5e05dd600510721c193d6ecc9b1a6ca5060208c701ea9e3ae99869a68d628e24b0a6b69414e8d21f93030895d3bcd0786caaf294a9e630cda9f24701c5ecc196e6d78b47f06715c775e41998944cb3cf42b0bfbad5f65f47365821508310107f3383dea2f5c60da445b437e190236392728804f36518fe931ae5e252c604cfd986c477cbbb510accfdddd68c83bcbd06bd25265d5daadddf701deb234694c969a2e38d0e721ce96319ccb2d9ded65cd8ed759ba88e34009d4844ba93dabbf728b3c8056a9768120645614ef7ad618e41b48be53513340da1793189dcd55d7a4cea643ac3fbd3b5f6c7249ad5491508e33175d9fd5346112213ca29f81e6def16cfa7321056ab6fde256ec437471eb75689b14ddb8df42e544a4485abc7556ac37a2309e8d3532fc2097ea5442b00d26af67c259a04e8ca7c847657df8595900b8380d6c2a998d8f9f63769300ca3f90e4aa434252c0f7a5f19d1c1023aa892270ad51fd9dcfce46cd73230412f3e3c802b8834ae95e22e4a401f0aecb5d7903ead4428afa8bd2bf1a6c865ba6e36aa40a1f757a687ec00b5f963cb0bec83cbe428b74a66f60233e0e91d3c48cf297b0da884fd9b82fb11a8118f69e4e4d7ca9c6c6992bb413a7b5145c3aa57da3686ad046f14c03893804e7dde28e7671abcbf3d83f38d2212189aafc6b1db9d67e1d19a59a5f416e1c79785eef8629574b322c53725753168fda96006c029be0887a1a2635ed3155456ea22fe42c263257b80af1993942626342cd4bba04e4cea3f90af704e7ed60efcc0c0d05144ec5a199017713996e2bb28e2303183b6de3f0a22cd7984413f7338b11736e86be769e9e5b4cf622c2ba0399b592c3e262edfe17f6369136204444c55342bb0380754b1be60fd87f76349857859183c848013bd29b64c6b46913640bf0d4305997ce7e826aeb531110625aa507040d23c115a198bce5991a28c29b96abbe30108f370f8434a6c13a642536c56a8321ec2cb738aee296231f6d66655d001a986be54e3457cfd228c45a2494b0bc3710690a2705f912befd9c442e9f8e7868b1039757ec78c638c2bfaac21cae1b57cc6999dcc9c3506f86ad7068435d6d84a87d5882b4fbb8c24d020ffe1505efb9c412b8f29b50ab679944883a55ee98480e7c39ab7ed70f62d165612cc3a48a2fbd67bd7a820bc1328265f619a7ffc487664e2aeb117721757f5dafd6d7acff45a4ba29bd5e96b6c277e392149b2c053c288760f3bb83a3f6e55dcb4eb55e5b4ddca1c2f0f2004fdc57f4a213e74067ac3fc24e931dc25d0806f4fdcd4f312ca6fc61ff0699629f9270769d08be8ee917a06fb22422da702170cbb8032315f80299917d1853acc3c140a37fa3e071b0ebb05578fac94ad38d65b64959d47a6eb82bbc11d28ef0cc64e118be834809327b1c2ea4228c5158a543fdfa306150c17d87f0b0d0444326cdf47b9316bbcf5bb9b4c92d8f4247aa3569880aa4f48eb1190404ea1fb62d766681c743c1ff9ae5c373d6080c4a13ad30bb9b013a8e25888347be6af216499be6472dbbd552822da878769fcfb948c71d03a02b45dfb43be387f35e72a3278ea6862cc71b53d77de9008910748a2151d57fb8dbd76a673a0db905a227ffdb4ef6d95a6af118966beb1311c636f45a17eff173d86626b89b4ba662622e31e82b3d0add64844cfa79ce4dfdf56b5209cfd0cb75143a61d0f89e89bc26b1323f5d3a39daad458acfa9961a1a56870f0d48a1c7bba83626650d8267d8387c883a66122cc670af8b4406911ae8d7926823a85a510aa738184885085bc3eee88fa36b2ab114d828a8c52533dae53089c7792926ed840e1b3e9ac406022dd27b512aa38c926160d8010531a50dee0964d00990659c5bcdcaaa008a820060de6634e7488a9c5d68edf81718885cbca42825ab5a693a541b3debda6dbc88d912e7d3f54e29bb45965a49b0911ea52e8dee270a087b241fb1e1f85fff9e6b37080b64e7eda97ec1ef17956a8a2089cb36657744755e604efa39e3857f18130ef3193cc965d3b880741bfc707ef86ba60e3aacaf8d1b15a23c13c7a22ee892b21103d33bf537a204db482c779445252b828a004b7e37f66da60a56364a05b424f35fee063d285a8df9c51af4864753cb235851ebd0b4c88e3188a3e4668f669ca56f12008696a23270c759cabd8f00797bc3cb2c29956377f19d80921a8f1ef88c4d668a91a0907a7ead205c071e9f67b2d4cbd434a3077d16448fad8db0021c72370a553e3c804ee00834e0a99c0f46ff45b71c45a97cd5d4227d6aca084350f5cbca37b8c844fb4ed0edfabff98215330456c028254c8db8c070e554b5ccf74d5e62f9368d8eb79ac4a2b71c7779f0cd04999b86193d04840f912005326bf97706318f63a41e39f574b91f8e3209560cf5f5c0a588732da43b5f4fe6b776f6e0cfee88710657250ccfe36ed588d206f87cef9fb356f51973296fe389b42bb585d50f90a62e10e7107893c7a21f9726cf4620d5550b88b1bcd307d7a281611af2c38358b8ae462ff947ac1670526c8c40ebeacd3dde8a334dbfb55da21074f525ab33368252983da340a2f731cb23c3c300b4c3fe6c0a3e3030b5ae0abdea6e6cefdf0dcd1b6fd4cd975e7a2b7b7eaaa89d5520e88947b6d7279df1264c19c1475f633e9130c7e8529a01050e932506b76c3319fa1694721a9c79117f0a4f37406c95b4f769c839516b53d7eaa35197f8144f52c34fc49244d3bb51b3cc0987624079a2dcfecf6cfb4b359f3bd642d4f7330a3438c01152d55a917b59c25551ab7030f92e517d83003939fd2435a7af7d434f7d2b0201f15a465ed9fbb6afdbb0805394d761e273ea595dfcb29a8737af32d15a9039f5190fdda28143dff194d0d34ea7f14cdb24a1527dc3e2a6ff7b8270ad1fab12efef26d9c19ab146615a7531be96890f80cc104851ad58e78db1e946df6bb0aff9a9d39c3a1a64b1464204f15765538da2922390f9083c82041766af9c14849fa682f5da2054cb146b3c0f2ab913bc8871aa5672c66e22621f02abc54be4f4570161f9a0ebe9c02efe3864830cef836cc297796be10dcd3eb80c1e36ae006022fc94508c05e8c46fc824b2335a6757e9e05412b00042503c88220801e49862b082a88c5735c744eccf1fc6f8ee18bccbf8b71ebd320c93d7ddd112bbfdce1fca31d2d3f9c872dd8cd489db551387fd52e0671d15bd1d713ab58fda2e8ec9ec34019a3dedbfa7c56eaa0e415d5ef122b86b1e4fab27847874184c198fe79d323f87b462fb537e38637a423923f2bbff4d95c3eae3ccfb4ffc7f5869a65121e1700663b02973c52fbca53291a10c80ed6809653820dccca72246779d8be329cd80a74796166221bb7f243da1d188a31ca9309876a33234b98df97fb9b0e4ed4054a53e5d13bea99c1692d2069b0ff8a22d165e339e62786cdab63d1a560c601e20d696a2e63f4938aa3712797c7735f19fa66c6b00319e4b4204a5fb01fcca1c777a72c023a8b4902a8069bbd05c6974b25a3e8f7a64ac7670c2a400cf32cd14c866143199993703ecf340289576c978d74ac5a8b0aff25d841742998152f962758c19721825d328d79c0b3269152553ca99e950d6f04b74ea666c877406d298487fbcca9d56103ac8ebfb82040f7113b8608e9fe23093e649808dd7b20f885e710ff45cf4e2c8bc4e6d424f2fb37935636310261dbcbe4a702bed060fdf8606cafdf696d2d8c3d2d5a39209a14ea79f9a973f5a2fba1b2f9c67ff37293c5232c30baa11a9b5d218a36788f02f5f4de64f84c6e309c8afed74bd913256f14ce2d62efe5b77d3264ea4f19d5724d340bb0525e74d4c3ba24ac37fd8682e558d22132e404e139784c005d7f7b9c6c89cda3aa8b47f979355274893495d107d9d4c394102498e08076c6a50d72c773f7c30afa3e5156f6898a2a27a4cad4642f6b50212bd356174d9d95676b766c3b192dffe1b31c922517268e7d8c255ed101599294bd89cb785c5a4bf11be54b7504b24bd887baff42f896fcaca1fc2d647faf453a950f6b76f907c706e9fefabca7eb9a4b17bd9264e479e4d1ce7f0f3b908044203d494d5070ee9cf5a78769134145ef94bfd7d70b6f21aa46409a3fb59fcb803634c3ef19b445102b2d7d154282f86b4f9e1333aa5eed3d031649002f1abcd436917a4c86ec05515734e037558c64a90688e952d00c1474c3ccffb7974422266213dcf969e62e4a8989e4a5501b88c3b0b4614d627cc01145288778a95b764f1f3c81d4bb8763483a1b6450f89f21e04af28c0200a7fa9fb0129042fbba0eb5de26ce5f32994979e8251446dd4081047fe882254917b279bac01af7b79067b04b7a47e99b490b13a0674b32ef190a5b1c351b6fadc5d95a822ab984e72e8b1d816061e8d72458d43772c5752d7a7f120549e528017146815d730514e471734f4cd8db370b1f713ea0e987cfc969c2ba7c45dce3142a150774acbd0084e432c4c7464d3f19a6a804cb0d6012d8a7eb27088ac69a60ddbbe056aba045a0477c8bb596b2f869f7705d1108bc678fae37a2323e4f406ff53e585462ace5985c354db55636fb554d375b417146409080e8d534f4916e639bd311593f5d650fbd2fbf3e66a2fe26b7baf90cb0c03043d4de2c3f236a0959e8838815d18e32afd035c554a4e8622c6e395590a695c2a592bc640a9c0095d61fe0f03598981035076e2d85723265cb6dc46dd0b9d617503d3f940f3ab58ac433170e1307d9576ffc44fd09774bd02cfc0a16192bc0c59f0a1a3da89bb2e83913ec938597edc7b03f044728aebd8b7cca0cbec9cc26771d5f51d66121c4bfd13514b524c7138dabc57302fd1f8600aecddfa60b921ed2b83d8a77d1afa895c777736eff875bbc80c71fb4e730289adf2c332253851ddd24532833030477336b50eef0aca2da8fd4210e4eb3530e866835e91dd3c05472da6da2bb43aa0930266b324f5cb274eb2a0b1ddd96acbe70e2093dab2e53d3b01d248ee10010b65797e4d6f28b605d00d136178871efb09f2cdf401455057734c0e91804fd93d92f47ce12808432e5bf0e2b6067a3be9852010edeb26d70068e451af329a76e50eb089e03993e18fb4a50f7661042d3c304fe859202686c631184d44da914ef8b57a1aea6267ce25efb4981932888cb240c771a67226e6ecf89b6cd120365ccc0f1c6995ed9ce890b7c916649e61d82cfacc821412b14a14e5a5328c1bcd2161cf8f2a9972d675077bf5739c295eeea11ed73e81ad1dd59eae38038d3289d267bd91b8957de65e88c043a80a6b4c13a83b47611f117853d3bce73a542d7be10b4b9201419a842ba6a9d5bf4989b96d8c9e27ea22890cc89a91357d67c308bb0ed5acacb854fb0a14718c5e47265d30ca874b17dc5471c7bcf5673b0d5bec5cc02df33dde3d621caeefd0ee885c905398c840a23c8d347689c30b96fe034787d2456e955bc73a1382e6cd610e2a20e7c1fb6b592100c6d008f381fd5b6b28fc1a7a072c3526cf00ab486c4652cede28545473d4cca0c5fefa70271b330959d9745ef093ceb29db11897f12952f8853bbf985ef99e95dcad85fcf05cd7e15742d2daa7cd5aa115c6b80494f1b017d01d935926ad6e2c6b62aca348e21f59dc7a3edd2e3b69b34b169889cb10cf8109a406c29040fe5ffc2a8926452c83f9109251eb5842231247633ffac6f407f2dded0f43ef12699f4847017fb92f2c72953c6ccad2b3c0a8d60e09eb8d9a273f0e563151480c0b1267831b58f1101f1fc1f0b0b9a70945b4bc24d481d88c1003323bcb1f933ac9e484de64c14c78bcb0d682c7aa1f58561c9a4b185938d28ce4b1cf7f7b09e78d950b629999f1f4cc9c4c6dcd406b60d956fe5e16267a8cb712486277b232a5510ade75e6905a8de018b3b4d854eeccc8f60f105fa8e6ee31341948f1d4f535fb8c74f226ce9914dff9b3cdc3668008dd3954a6f826770202b61726081238e3cc88c29ac9359b3add885af127d1651864866fda947478a24d8d367e8207ceb778e0605927c75934a523c49f53b5409739913ec2c4e0b482c276e318d59e88549251ccc881edfd885d7b202c5256666f95560a06d0a10a114d9f8c5fd598f5036a5951bc11644189be3c81cfb33f71976cf80cabbe495fee2e368bc6ebdc61f961e7b90ce25531440af6c3e6a72ca2790dd342dd8aa311cbc3f76e44ffbe47947c50dcb25f6f42940d53c92e70b90bc1cb92772b5ec9a61c46737c19e16f1eb348b8863b883c1f760fe54e5af702fa2439520bbe32a032205f5447eb153a670582ee0f34c6714d4d2a6fa0b068bfcd3e5fd683dedeadae008ecfbe57d8fc1635ad1ebe5b32579987fe92c5b68fd30b51d9060525990a1f219f8c4722f86e2ce023a50f16d398aebb3dedf85b6fa9aa84e954ac8600269c0535025fd00292b533515e6a6692afacba7ee7d98fdb3ab61115af68b3e8aca7ef1c16d342ca58dd6536b5680ff8579f11a7e7c2504e137b1fdd986abee550db8c41638e4b52ab0912416381a42ffe84f1e8a4f75f1d5bc6157b885bad16c09b5b53d42e1b3238a885d915457d4b15e4cb3230a0937138873e962729d660183cc22431d5a56ac416fff1242406335f5a69bc3430cec4810e2b878d998994fff0992d1e2c5b73fb25256fac7462f4069df4ff51d88f74da0d0584ac512598f0f1e0091aa7e427f71c70194a96a24f417b7d0009e78ca081ce251e756d4d96f0a34020630fb60435e9a1e7841e4d06d6b88d2b5196e48def0b4a6dad2b893d061615ec1cd567d5a89c81c4dda1ffe3da4c8187574da1d0cb10ee6f1026066098a0603400d5babac30dd282095efb8df097682ef1d7842310ec43cd34af0b00aa75cbbc3be6788deaf08ad56101e833be28502c0aba9342afb4ffde16ee60b17cbc8a1cb6e5cdd70cde3173e4333bc3b712c6f1b69a8923a7f378ef551dacec124ce64314c7e7de4807eb26f07f4e8ea302df27e726db7e1b0cd9cc4f9699ef22ab6206786ff42c2f2a661e5093a07cbbd816d68ac3ab76bcfe6b23afd3a98948fdb71b2b75e052bfaf0f6d5acd34bc9fdfc71e5306eca8ae34e65b9d0d88cb4f8f2b0354ed78e065eb8294176b1646ea97e768358ded5bd9617df66d28b97ab5c8320a1bbd93f60f7b2b8037b22c081619d197f74399d5fa768fda576b739db6b258c7f40e7bdc008af6a54b0fd173ab4ec1f1a6605594f03d07be7a65b2d9be49968d5f3dacfe0502ae061ea43358f58161e1545f2ace7309ad378210c7466fddff466d719fccb9c307303c5bf96b3b74c5ab1e7e27cd64a1f4b411b93c1aced27bf857e38f51ba6fd966b07c5117faf8fb30f9d4c3ba68ab1c0fcd524c0ab59603187a70506807ffa0557a0e14939bb7592a238deb600cad173260a16fb01b61d02c344fe8b0b03ccec6e80a65ceb1c8b37a5f3564b67fe3e9751707bb91887416faa0e54c4d70a2fd0d8c45a444cf81b64fa76b1186681e5e68eb2c53ecfbc4313e85a478768cb7f3f904ed9ffd53c9383329a537bfda74a065912dc2a32d01f7173160044739377aceee5f3cdeebb9478f13e13788cb8304033fba5e1f32770f4333c8521e2555a89cf3b64b4b2c61816213f393631d34c0e927415ca3996dc04e8724f4bbd59e05e3293d6a8a548bab3a0bfe8f396d0fae7f70b619da6cd9108615fe0022dcaf8a5b8946c6b8287c9e1a8b1dfa9ef6928628efd079eb86cfd5de67dd7b88fc1dac0541a3863386b0ee20881a83c88b666c5b37c4c8d749af35e14e676aed83249b420a8e439fe0abaaa7f2387f6829b42339870ac0471e9ad505dfd5e09926ed6bb5f0bfc1f8ffd2102c9fd0bfc65685c9c09b90ea51dadc940e5924935f3c7f86be0b525fb315ca98ff40196a1811f042978f052030b0fe1b404fa864d93d9faddd68e1984c152dcf7f00a13693c06f31116d5ada019d5e2ea21d57f2ef208b48aab5ca137b099982fa17ab1806b0abb458f4b15db4ef42a9a35bf0f1690ac532b6aeac3eebb1be78cfe947efe38e93d22f6cc82c72eaa9943362ab8294f14ffd52d901f72dcecfd505da9bb84c107f50974b8fcd5c77e742504475c81b4fce73835c2d03bdf793e52b4217bf43dd2613725d411bc173a81688fff9c0a48fd6b1ee3cc9b8c4d1a8c6f436ebc6cc84ce220eac4e339637b66f43a3c5e2bd7a0472a0c5949f8b6ac2f147d3e68075c1938038d1450ef390202cc1c9eeadcb47863b1b74e0be15d529cac5f1601eeef30a7583aa0c0271f46ee160cbd96c483a7ee83c92c1658218c90e234ef20c46cda94cd80461ec824c0737de05ea444b9ff20f5a410cb1591c1238c4f756295e884c59d8b2de024bd3760c856370ee457f83e3665ea51f3476152f8e0052a77d4de41ba124a1e373a8a7cc603c88a2c78971ac06026ed8dccde94e0c1f375fe1aa5330b031ba36136366edae11007c3b04c31bde3821f4f359dcdd53851413bb3dc5d52a96ca51939302b7bd0ebff02cafb77cabfb463fe14433d67697182f7128b4b493aa22f39131635de3991a0550734db43d61bc12c307b337f3b82ed0b0cb2e0e12dbfefe4db7ae830ee50206bb1e75c43a368e7ad12ab626b871cb73659add3e6c164539701dd469d743e06b10982618de9051260ee0e4e4d406b75cb0a4c7a095c8c9e37ff60621a02c3240183b69f1586dee2252b22d8f6f62a09b6c01fd36953d09682c92d2e9864bc0ed2e462773ced6658901eeac7d5451916abed4c32f273fd1006d9691170c6fbcaffedb96cd7bb040bedee4990d4af7af9b90705e7c6abd2890c385bdc6e01e3467cc2fe92f8923c54a5c4f438cb475bdf8f762f58b89cec2a4f6cf2ad8c0859cf6e96473ded91303b8868c39963d658f96b9466a0fc3810fc47935b0e921519d55d235eec2829aeaf6310410240cb8c6c19a8558174d226a3cf6eb111c119b637806c037dee4203b3e53f848ad2d9dc8923bcd053eff28171f713478820b8577e2e070beaf6054226ff441b53b57ee8f9b2b9bf3c898c2a5f87a0eaa24c4195c6eb2947799e72a2e13cfd09ca6cdec1c93640bf0d4d24cbc2a46d73c647b8128c7bc0f9a629a52151fd139281eeba51ce3a8024d699f6cabd11e78d405ebf279a319093c9f31a1b84a8ffbf6974d4ac3d3396e8f832a2603e75f6250363f6aae625d8bd7bf475d66e29e70efe6ff3e9a403b7fd4927f89f1b6260682f9636fbf12b03e34adbc08cbf676c1dd8c9706a1bd3e04de7ddb957b52dc42ce32a7f89943d448f3cee1be52c7915b5f35811ee0f8ecbcd5796cdf5ba5a22f6623540bff1b30a9381d97e575659383232abfbc0c38cbec509990e91cc1b977f039f1663c6b6c7f8251041bb7d97e3f84e4cc549de06f15fe2d35bdebc6c950dcb7a109e64d7cc4355ad70939528259a8528b22188683e6899f8e6d0a59300278a51c0eaa7751f14adf66579b8eca82800691cce8810fa1bf3817584533d868fd9cb26cff4288f5b417739b5cb0884c36c15b10cb2e96892dac7201a70ce35434429512cabad6aa44bc25c2d58074ca2f81982de8dcf85135fdf406fd858129ec67142d198a9bad54ded6d276d81bc016f359bb2b45bd6b188adab90459e354742bc351fad80d2f12f96425ab8e31f5eddac95bd7edcba4386bb318ead3a3df382d09db69d487082dfc18a72ff4db527fce9eaf7b0ab18baa7cfbd7ac5bb39e13516122bc3f6d260fd3a62aad98f3fa9ac5033dff7e2fca2c7ca1135221ff0d023d7c396990fd2d227466436d54e789d84e4a636d5887fb14994abc9c9dd1942b0469bfcc072c75ee77268002fbe98c32d3535a2e8bbded18f077abb1627fc57a48e572a195029a00403eb169d92cc57f41e3fad48522354860c11c9bea9ac1d91bec0d6bb8c269e9b3f58a1672b623b346a1c05f2241814f5e2c3c9890f35f9ba192ca711efca119daf0decd11a719c86542208194e3d005033c7479e2780ac21ceb317fdaf6c53e14409ab0f407ec8e62f23b6f2db2eecb47c28000978b701d666b07de146bb96868ecf18d2ea219aee455b48987225bb99f2cb8874221feda1c4b019f116b31c3e21401dd0c6f3b8e229ba4da271bd3cb86684829313b95a972950b6607ccbe5ca5d8a80570e4a9deb017888eea6c8e8562c9b9229528cf48d80886da0bf14463f9df0314ec7e3a544630f804ad06740a3b966a72a81a72a8ca4a651c7fec702f8e3ecab4a35ff3e3633844cd2cf4b01b47de02eb57e198e07b5a99772727e8f01775d4c6bf353206758688a1ceece333d35ade98fa28c40d4281a3fbf87688d682412692593a8567b6b735dff557fecfae469f99c2dcd690235d700dd365b64c144a72b9c82da2f04875ccd68477635372a75d588dabf40f83eb5ebfd6952ea5deba441d61d8c663c9b3270d39dcdb059b0828537d479cd109c5083c482b50c9a36b436576311c3b75e13e7d124f1faa715fe6501204bbbc228526f5254838cd9c4360a580da39b245d73c36788b0727568f908a7aa0063d315ce44e9662a5d3770ab2f620fddca19277c80f29715a61fe1effea3241f867918008b71a07487d58975069aaff3124d131aaf335a2d15201e42ac4e4730bd0777b3debc487cd75125ab57db174841db6b8cd0cebb9864e17e3471ab7b8734ca65123122092308324d5c24ce76cbb601c895c8cc9b5811b240b0842db90c715bc7eb4adbd07246b00f735ebf68d957ee52141321eb12846e8da96db28739288e9091250cb5382e390078288c295e9ee7911012bf8cecacd3cd87d8b1828851e59a9349ac047b8f122d4318244514f8cbfeb3ebaade0562c6a02d0f659c52d2803cac97c0b66ee322fbe87d2b4479d4b6f4819026e125801b5904efc923d94f87bfb23d39212792ff503f34a96726b457de7fa0fb13a54396b67beb29510196fdc10594142ecebd7f72a494c6b5ed04947ce27e7b22ae181e5e192b7ee284f394cd3dac5f4c532b538156029166b4acf7e645062c31570909c075724686db01f2f3bd599bf612e85a441cc038073bf05dd0c5befd6c8ea5b540a6513ea3479786333a1b98309817a4ebe5e75bb425108ed38331767f9da45ee1a4825f02cc76bc9bc4665848d157ceeec88b41794e16138c8d75727df5d912621184efc46e8899909e6acbd9880854190e68e3207dd2b1c7c0811aaf54a00ecd4271ee3a248984230eeb2b33e172ea800812248c3cb4570a9bc360efc96b174f6b9065c03cce5773ecd615194ac9e9067b1998ede86682c55926a15e9f6f631702b09cec26b09b6bd2b5b5331ac26210bef3da1c436b854c537da68c2e0ee73ab51860b06fc86beb27e36b06aa2d0890cc2a3e6408e119ea159913df0ec6e8a3d81e7311a52d72f3a6a561fba445eae626e12eb66bba6f4c8fa64abef93691d056a3530672fb563944d5abbbfefb8f80ebe1159ddc846b97b27c52c35da6ebce5d0f7a8dd3c0ee5128fca28de1fed614501638b1e73e6d30d4a5a9ed99481d73fffb07ca9dbf99d8023471d3abbfae820c8394c91a8be3b4531e4506e89e57d3112025bda19fb20e750e02016ef18a4fac923b5a8a4fb67d1cef0a19800b163ce143606ca1e48384f1d3c2dcffbd3db9590e6d6c49a0101e9b5254b0f5c13bb8c947a55d4e845460eeb1ce25df9ff6704ab99b5daf4effbd620a8f747f3ef78d857f03dceefd5bb0e12da3793a86128f680a8308ded2238c4ed82d8304603aa021c99c3977a2df719f3716ed393816a8d851c0a85b31eafe783dcb35c94328b4041f69e112ebfaa5a1c1c553440d15d7dffa013068cc93e2f8cd834ba85e0b8edbd9b4ddc95da7e0ab476e67bd6be77f9aa9b7141e8522c1ff3fe16179660b8287b97e9707151d9da5356fe1e0f15099651a1f3506b1f817ca0b36b5270102241a2b96d9513fd26d501bc62e95de143aabf1517273b58d68f40ac83c7273da220a62756582dcbcf4415f296a9281fb3e6e4e22d7e6b0578729d038e37173cfb95bf920b5fa87f3718971f3ccf0b9c5ea1364ab24a900e4d847658afae1180581da8325f4e3aa7f628314cecd0d883570612c8d39b5b5b6744895c0f30dbfbb6c12d8bd697f5e14014c2d5aeb9e31b759660d7da4af5f681f3c1c942574f2d346bdf181b5825b8875e19ea05d1e1af5760116dafe3ca385e991a10d657f7fc22495e5ab643805ce79841b0e56205c156d3a59dbc1916e7164551e513777cbaa58466556e511b55dfd295556e5916eb89a0fbd2358e30084ef830a3048298191bed069fac15a5dc17c07a11dc4836f853466d4fe114654fbff7eeb26424b8dec2df70e1b0efd0d180ef628f622a528e7c108f1f65aca59ae9165e84c6ae7ef88d22d89026fcf0c922890aca13dd4524e628046f2ff8f826c32fd2351a5db83a8d249ff3e1955226b4c5e914e22cb26fa3b487ea49d527e37915c12f12375fc333c22e51a8923e5241287e8da75d8f2232dafc2dbb00895889c3c903a6a8b67d286481db5518c40b94896b4518e62bfd1d6a8ad91ee59f0df3514b28ca2edf9232dd924b2e4eba85dceec30ebdbe1d54d95c74f87a641b4df0e115f105ed1d1e71c5d537df423bca38c65138da2892fc126c9be8bb42f44a65c1bc1efa41aa58bada1fc9ba95147da24596d6da26fa36517d127b3443f42f4f02612c7fca8c624cb9919358432924636a26bd30c35b13feeb6b6a3fc7effbe1239a38eff46120ada261287f6d1695884eaa3d1bf1a33a37760a6a4a57f23097c693c82447e17348da39b524ede349652d4f896e8327c0a6967b069a43d47a3eae458dae8f0e35836d1e13f9d2f08dbf0751208b1c5b5700133ddc25a120adaaacfb0064aabc2910a9b203d613da9404193233d92215a94ab665b3b83492393c904aa2c891541420f1308be509d7ea332b34ba55b2a635ffaa532df4b20e92059eab0adfa4a35be50a90e02d9fe8da8eff3b3ed88fa4822c2233e4db3df376770e581c8353ed2890a926420f8bd5453ba69126bd1f4259b124ec9077de907b7661539930a16f4343d69f65d908621eddfc11187367e20e88540b6736111dabf93469476966b246e82480a2249325ed925882499114e5427ea93274ed0272dfe1b7168ffc283a3491b4daf61119657a697b44d27fd1bc19bc832478c06c9523b14b4c16f0443da477e4346e347843f189d037313a6743b5aeaa2f4395eeaa2b44d98d26730ca58825dfaa781aa31e5aacfe0d288f21915654c5d35ce6611a13e1a67ab509fc12fcc82c2ae509ac6cda59c0b69a4a490a81aa8dba34894c6fcaa832e085f8a57a7d9a751a7a469a3d188e34620b859d096e0a71d1c4d278d1c006b34ed5e212312c7f791100e80403610ecba500ad0358568f4cf9aae8da5e9d3ecb7852f4ddb3ed2ac44131631124b1d0d5e23fde3b104b597481c93575c843d4904c71c608fcea31d514580a5839f5d8446baf6d1d6a6d1369929282227285f6924c94823a9c9ca4852213969fad3f862419282e62096249915956a9a926457882f91938fc1af4443dab483df12fddd6a0c92dfcea7f38f746dfc76be1d70fc743e9d20ccd23e517caa911bb88d5f90d1a681a491664d4b34e17cf2e4c91317c7b7a3f66fcea81c7a78d13fb2f6103f2b0a412c493266754d4f0a2259419a919c30ebfb764a6ac201d97340cc9a24d348b240443e8d54afc6c0015199ade94b34f4a4d98c99cc3b10cbd5ead3a92d15b8e8bf9d211f8f45597d37994820446b02e2643326e7fef87498c5240ae5b43b229c32b67c9a8c4084399e12e9db18be3ead2cd1882499165e3496218efc82f0a71303b124c9becf0835d4722822c0834725b1713f37bfd1e4d5f7812338842c6d7f33a4f18d282266112044fa9b4580f034483a418b0019d2db884ac2dbee29d17d23513736d4b791a88f6c00756d9faeeb91a420a642f7e97c3ba34e75a12459d3cf7afe74ae25c92c49564932928c45450a6d46ab4aac80e230abc81878349ff238a55e7a08d1b8596bb5b9e121f8b60a56826863e289298583684f8fda3eaba536f4744f1b299ac49c9e3c48416736e648f0b1a6699aa6699aa6514dd3344dd3344da37592dca6d9cab47ada67985e357c1fb769b63215f1c6ac59fea4b55aad6a1ad3496b9d9fd409fac443b262a9da3057b3a592693de9d806159de6abe860baf0556caa0b1c44ed5385b253e6c2a60bfe774e3aa2113834833fd5a5b553ab30e155d56ab51a7d02ec0a35e28f6835f18759a58aa8b94b9149f3efb6d56a351526cc624e85a6baf069565d1a405df3a824b8499e82686a4b6508abd0549155684c2a34cd5719c22d1519bbf04153aaa54b951d1359be74a9b2d37c1519b7567e562f6f39a54c5daa305161d2fc85c0944ecdad89a20bdde07e6f743789eede3deef3c628c087e7c6288444217ae85fad4610a310a23d8ad0458f223c789a44e8a227111e3c374e9787a264034217fd46e8a26be48d387c4fe9a8789885c474d570f764b5e59daf0afa515d615952b071a9958ba71eb24cc552a81f956ac91f517652c9eae511296963f419fcb11044beca0db3859aaa2b7a48d08c8aa5a064c9694ec1c431a5034365f461ba760aaa789a4b969dfeb657cb82c3a2d32b647531913ca2b891e5e924e2b1a46a74954ce6b98254339a23315d2b4fa22e51430c9eb8389d9d66d58e46aa7254382a9ce6a76aad29594dc9645f8c299aaf72c28cd99adf82235daa60cd2f55479a3fada674522b63ca1b533d634a85a753150d13863f7780e2e1e1f085b24fc1523bb535fa11b995944e0aa8f974baa2ab6495fe63310a4162ba58bc8e3658903535a27baf013f72a12c69638544d9af7cc635fb465da2861e342e8e445912d500ef2bbfe17d85bc313a778edc017ef419d70c16553c44a80ca3c07e8748a234ee96bc217e44ee5021519af72442f7c82884dc183d7c14de434f22bcca55c828460f3f5de267708a266593c2a92d16e73275d3a91c1b35a7b378899a754d4d8de82be75e53035ee5a22a6814c7e912ad8cd3a5324ed7699c2e16e37451148f684435c07be84a7833aed0951851f28678ef1eb943fc8c2b7481dce8793828eafd06e77917913b3cee0922683b4104453580bab87b4725e15d74d1bd579edaba977f6177d6f188fcf157ba4aa60aaa2d94cf9424bafb8e9c2ed23fd21807b154c9361be0e928d2f4078ed7a2ac55c9544df82c382c3fb8d582afb28259fc59d3ac0a62b141d26fe892c547b3d5a88a2708b352ade2615689b241cd52c8f29492d5168af4e9429148972a28a533abe925d3f76d25129584f7fb4b4621baf7e9b2a112a27bb762295e94cd84b1289b1519b3ba94281ad40dca66c65c24d8c58941f5c66a6b85a7de9edaba55565778807ad6dcd1acfcac005517feb930f066db344d3b83377c6133a6c835425ba94b05310bcd9fb40b299dda5ac1b95a4ae7e5486785a7b650b3eac2bf5714799abf82535ba9159c94ac5cc1d1709affa166b535b7d9b6dd71ba2a687d88e548a7f9f4d30b136614b9305df05145d0f446f304bd8edbd70875c19fae798b4c180647966e54c98272beaf84f2325114a0fbb3e432b9b226173661c42096a320cd1fe9f06aba6c6e58709a2bd3f477c194acb644e7a366b52522553c2731251bdd2b8a22396b7685a32a4825031267a36cd4dc771f356d14f81ba183e243a7a4e8e1675c2f1b3535225923225972aa0b3f0cc7d078d37cd1675c38a150781149a3da61d3fc906ad63c43245ce174d93088a72b260cff56b2fac0234f41d5854f33124d7f418854e3114bd54e4a87572c41b8b5f2535db86419d27c161d66a9642a994a766132950ca692a96430958c06bdf64a05d969665105b110693e8b0e0c182f5eac56ffe924fe5c58b9f2d31cfb01920535cfa84b254beda47454b252c5a3133660ba3cd68178fb3ac4503fa89fe6a77498ef8d239ad1cd08a7f9771ce5345fc5535b2faa0bff5e5154f134478ab3951767104b4a13d4ac6ac22b2688aa2052252322a2b64ff187594b98a59d2f026de369e5a64b11a8f9e50bf167c2700e4a95ac850b62a992355f2563165d05f5e461d3b603b4e19b2fa278af15cd07574a371e8f07e321f89fbd4207260cff8909c37762c2f0ad20423161f81e98307cdaad63c2f067b00763166d8fc723c22c58255196248276134ddb2211b92f87935d17df8825cf28d084618f8702714f6d69e7d39102793cf3cbe11a881e4ff37ffa8759162cdd6c3d203373a5f4f60ab5565a23c496f52ffeb11d2fb3b52365ede5b59ab59452ed7aa3e59f594cace97e5ce5382e07d894cec0e2601641834fd319887cb1afb5bf2ba8820a6be8d292b7f9d251f35eef356f2c75d4b6bf54102d07c0e6ced47667816cb79b254bdada93379c8af420075f2d325be23921448322804188d6bed451a7c0975746e8e0d362dfb6b68a9a7cf307f1a6a910bca2305ec0419c3d9b9120a26e843b421275037cf890dcc140aa3073819f71cdb8a6dd487a3bcf7e6fee86def0f0c8f2b6edb819951bf975d4a1b5bdf98268bf71fc846d1d5a5b8efbc190b6e0290b9cc63dccb296137bc66747eee1230c63d8bd401c1007c40171dcf9353482239b9855f4aca22d09243c1fe156585b7cefec603db0a026609506c647427e38ea60170a027aaf08ab2e54ebf911044d241169cf9fda0a4fcf554ca60265a94ecf544c1675c15cd119501ccc157d38d21fec42cf46aa3842bde40ea55e728bc48f3e510fa52ee2b8fa0521f2a78eca83c6f3c6991a4b1a83a6478d25b541d3ebe009ae4b86f1154a56f284ed2698a583ad2575686d4954111f145a6b64e541829757b4daf0e03070c9252a0db35e84064dc8531618e8c440404040369a562bf3b7d9b1271547d0e1be71f28a5e210e81853da930828e4a4f2a8ab02372e2755408b1e256eee563e3515104269dc8c9ad9f478510867422273306d404e859240b419d24d6a47e995035da92295ed1d3367af9f0685d3250c9409a8fca308d29ff40c0f4909b2e1c02428e9cc140accd61e673dcadb5d65a6badb535474bf7f2bc9108bbad600a691043d3b012688e2cedeb2551f613654f529b25cca9591be39fa6d6004f9e3c71d9348825c36cb41ff858a29c30fe3182485733a7d280e183c5204806852e84511a39a480d2c8aee0016937440863b02a74210b27961c1f10a8c81ce49006d2971394a3ed187922059913110701edc0095ccc6705218b9d20233d9aec1891c11438d704140b7243c5148a4001f6868ddbd9a9420c5e50912aacc8b15a10ac0615c94215768cd0e4c0808e00fd686e8bddbc2008dd0ea5f972604180c190cfd2d41ca00a64640674788277a9a56981851d298310d03085dbf415288816d1c11cb69d1dac80328c724d6fa8206a6158af2520dc09ff46ad0786623291d6c9922a88da8f4facc4bc535b5aacbcdcbfdfaa5c53b9f61c948fe51ffba8fdc47e9fd84f8b50689255e5377c99442f759cc32354ae91650766be003c3cc2a328d7c8d2233b30d3bf573acd69947bff36702600b740e11125234a7a94a3bc86f79325f55c5621bd69a4fd09a1f7c60b40068a924f24113a3f09320aee1e458814527a14fc8e1442ffdd86467847f95732bd879b3ec322fe974a47b4bc54c4ca4b240eed2ba7a7cf60fa326a39e374693bbaf4e101f8692ca2e52b6439d32d4f198be8e127cb99ee01e502f0e1b30370327c05800442f421003eb8ac46ad870f281f853450500070da00205145f4f096f7406a3a5a0cd69c0fb74e43435302970aee125dfb785bebf1601f19bebc71a48d5acefd6bf9649676af84f29a1e3da15053d3a5166beea79e5098a2c9144b5aa52714a68035d832962d3779a5536a81b6f00814d2ca78c5752034a274ef742c7570b79cdeb48c1acef7c9fdebc0161a1d0bb6d4f8ae996a94ee5debc12c8dc4f97ed054210dad86a986e91e599648eb84b44b78251ab5efa36112a2273c256dbab3a2951a4d734141562c9901b1136695d6497394a7b64ac0efce5db3a9add0b96b3421edddc862c44163360fe7e11c3660ba989c3c44698342233c1287f719afb44f7143c992877ba45d6265d609b3782059683ddcc9110a6ed5c7110a06aa2d965920cb444339bd77edde71682f01f18a3be541193f4d07b70e9ed24887ec948630ab4442c15dfa48a5af54227178f7482b2b4f9fc1413c1e1db2c32c1abea8d65307b7e73d08513bcbe80e1037e1c4f0a5d11d66a19c3be54e79bef0a72314b4b56bff5844cd513aca89d668d3b1c5b591bb05a98119dca591f6c7f251f862218110552a552a95d24e7b09afb895cf467d14be502410e20a6a65aea87c863454544ea77d2297844223bca31c0c5fdf4316c62beea1f0e581dd5802fe8c7753f82a6764d0f03bb266f210dee945618d1259a27442504574e9742c71782f85afef9a4f4cfbf948e1cbb3b41641fb3bedcff6f08a3bca6863bce26e1aad8ffde11577ad87dbe1154787f06a0a6249d9c66c0edda9dc3918ec088955228190aeedec0c61eeba6bd7b41eee36c7fee03e59860c51c6419671af5dbb11ba88dcb123443e81c474bdba70770289e9e223315de24b18f7d3c5759c38f6fc721f29515db89346ea62eedc1646e3745126aa0bd7bd9c321b3528eddd43e75174ce0be2748924ca75499446a26c883efb46d79d348e6c7424ea06bf13c7e972894894f6e90a91288da4384142b4b00426dcd0d0b8684e75e1b8832395833829dd992edc398f3bcbaed8dcbb9183aa0bc7b2e65c42285761682b5270332c05cf506d006ff8be7326cd854a227ce8a187ef99e2f9d58cb99f17471ab35713663561e805dff2a5403e8e8e9ea6524deba9fbe52ef26a3241f4de7dfb0c8ff038a6b626d1e0f0852f7ca17eb694ad1d09d8e095b5e0ebceae20cac410a0a399f5ce2c9d32beb38ec6c9aca3e115df923d4c2849c3205aca1dcdac8be09c743414c69d5117bfc0509f95c5533e21649c565bdb2bb57f81ad90e54ae5841292b355a9c62bf1003950e6b36210cb1e6aba74d37cc594611234f7407379347fda345f2b9166cd1742461242e360c080c148c2500fb3ca1758c37e9a65af938ec70b128e2486e9824f2283cd99734eb075034412c394b9574c121966ccad43258510e2a7ba80e0a74d2e08fcb4c9c15e60f77e2f30ed05366177f6d2f3127b59f2220bc9d2d4e50b6c9277dbb8833163e645a16ca0e83d24665cdb675c1b89a2e41337b67be48ed0b723315dde67421e8b1b193a7585bedd23857000154443d3d3358b8358de59cba675d3a2a92df16cd37c9aead2c2b9b3d249a28b1f7d7b8de9dec5cfb84422d1ed4522b9c34476df312279665c9f37a2ec36a2acb5f392a84ba21ab06df77eaf477634dcbf3b9b2eef9ec66c21c43061f825b225f4faf2ce5831568c1563c5583156ac45136b3ee9e508b7b697ab8b809088e4c987c972f5c2843b9d261dc7bd00bd307959f2e2f3f2d3fc18af369a9ef60b62f7f075739affa3d907afb8b67a80ad9b19038548802963cf873163e8adc315b309c3af40c4fafb1029c44f75b9a41040138644d32d9ada62dd2bb27258392d1a564ef34940252b87bb242b9aed67c14f6bede438ee1f392d18be38ab71e7b85fee1cd7b24396e1bdf75fcbba40927b715ff8ba936c91dd59c39a6f7920b6ecbcc06a6b887b45f174fa5f60418d4a628be2dbc6284ab03df41d21129584174568c7f6500b50f337b2e5c71b85a056bcba337a61778a210cd6fc0f36c4cd103775881b12d0eb10372b0b0671889be6df5947d3d9743dba9c19434defda9aae19177f1b675ca4206639e1920d504bacba9c41ecc8b207217e2659de9723a499938e86044402328238cb19b3e828c48b3bbbb30a0346cb4d6ddd3b5b6e9abf92caa9adeda89fdae2e107cd4468e641093f8d1a7ddecd75d2d1dcd99682a633566ce486c91a22688eaa98add6283663b49743c0c10a1b2edc8cc4d0c24143cb4ef3687667db5b34b505e3ced60bac65673443a2bab6cf6099e9a23526cbb6bc73e90556eaa92e242029782f4b9a6f5f94bc5ca1f946708188f2250b06982f558899312f5198302f47a80bbe17b0e0d3fc4996a2159a3f5f60cc9a74de494efb05b12c9148a452cf9d69ca8abdc0484029ae8158b2625fa5936b684e986dac2e560ead2e568c59252b8795c362f968636b470a6ea64a412de7d2c2375bbef08997258277747b9fedd5d6a965c608bd5ec381488508c3bbc34e4f234f6ec89e46eeb0865ec2024bf0aa5e1b83389500fff1ab87fa17b5151e02e1bf872e990448eea069d87181ffa82b1c51975755d48258eb350dc6bc30ba7e090df4620014039d252c503d8f364d40f39c3d61b5d18ee507743a0737c12bcb2d54a6a5da99cb5b1018a7eeb0ce18608cc3413ceb230ec1f7469187602679270c222d455247ed595a26bcb2f4f4b57e8eb4566ae9ac9f3b13877de4d4d674b10e0769a64cec4b05d485a5e1d524a96841ca8209c32493e26d1e138679dcd27ad3d58657cc39bc62eb05b1649c9dba537930b5a24b4a736918c7fa8874ab3d9a69689886717a70abe66cd547c725e3f068e61d9de6d7dc6f1ca725a9a1d13492d250414379d4300ddf34f760568dbd6c3a4311263de8375f6adf36f2e24caddde788e39d66ebbb97962ce7d78466c9b292e717429c40bc73721b575bb68d149955b797dcda9b1071682d2710efd66237b2948223c5d3b7cc736bcdd5f69cac2778ca586e6bc9528aaeb3ee409cff9807e2fcf6af08b5459a4e58e3a01cb5ac516a2777af289e4eff6af5621aa0eca1ebb9595b264c7d90385f5fd3a526a3644f8a04bb98a82e959c536676edc2ed42cfe0193c4366f866cb66ad1d7380fd7d2313fc751ecda92dbac35c0291891cbc62b003b9de7964f65c513cad28c98757fc30d4617f42248d593a88a59714d6cc6fe530fd338d4cf02af42698158a588437fd0b4d6198724ae2b047393d8b142d7c812069493b57a0c99e43abc3866c83648804c37b2d78bab2352c699c0dd223a3d1148a22131fbf89918920d13b8d1cbc12c71af127b84b248558d169e854444e1004c914694fe08eb62bd00b5f1db3baf373340182a48e22bc7fff48286c932d7f0e9e241339ec84d113868c612c118142554486fb534fb5cf4b6bf0cd16d54ffb76fb6b73521bf09d4c36999d765381dd9834f7a0362a9893c91cacfd6c2b14224fd5a5b33dbae7911f0e56a2f311c0add1f9e505b3bc87ceff4a1d2c8ee5cc4b54c0cc57c31748725a106f87a4d24c69d451bb66f413dc35228578e1f954051c65d21f05c5d4aab642de431c9ec8fa882bcf7a9d078ed4bb47de17762941d0dee542b089606a2370b1e3872860a4789931e03924cb99f66e613eb20c02880134a7ac89575d13be998438a948018f9e51e84985cd91ae11e2b574a65ae77cf7cdf0fb3a26bcd229e93d92e67438e8e90f2ee4509dfb9caebc4bdafa88e5845d4e27e84606148b55173e0d0dcd142e4be6b83fcd7de46a84d0d79ce0aeed2778e1d266ece630a141988106c11dd0cfcda1c28608d701e97438cd9ff59d5517a61b89b2ff21c8b5e38720d776ca2e4a732679aaa438db6a412c3ba0b6b4f634f2861c9a5369ce3db9f458d2ab9e4662c063a407929e46628003d3d3080cd2d01dd08ca1cdefc4305b2f78708420851b1c210b56b8b856224e23301843971366d2489a433ba0f2cebaa09c9c1fcda73f3aa08e496745101f91862fcbab3bcba9ad8e49d7a4f934a7034a22967736b37163a485a0500671beb42d8aa7d3bc77569efcc95323e7e9ef9d738a5c85913a30a9c14e0ba0a7911ad4f4377f1059689a9eed2da9194134f286231d144417290da493464c40434a83cae9337c9d58ac9066a9096dd4613b0714b6510ab0ff6e491c1f2a016d49940266fafb4c83e28e768be30b028e240fd8fef809db1f888374e68f0435f23be9332ae97624bd58f2c51b526f79a728df67356b5378743b42790a8903e529ffc672f4ef337d33aa568a8ef28902b2f6ef162457b824a2b5e794a368d634a26a986e6fba1d9125ed9168743bfaa7c3621159e60067d452c9a6dcead41649c65356ef9772d398f24f877e9670a0300a8923e528ff4cd7481cfcd17723f82323464c96e712f8395bdd4996144f6d3a28dee9625d6cd54ad14da231878e4e790d6bbc47640eb053ce618d94a39c8635be4615917294d738759972947f284f91383cdbdd863550481ca3ab6e491ca3a3f8a8a75ee60053a3d1573fbb63468a46419dc90f04c9b274edb34fb8b6b7bf6dc992742df5d29803ecd2743e69cc018e66a38ce5edd43f0a8e4a63d944970e8aacc91e61d2aa7f769cd48e6c89d03eaa417a693496b441946b2693e99359a2f01cd6e04621717c4f19bf499633ad7af894b108da2ad57f1abe5afc0b427c12ce8fc6797bd11e45250a231511158c59e50acef84aa23a426588306b36c2a9393b23588907b358244ee986a78e7a38088cc4d35c8e6e48394dfa51aad97098450026dcba3c3c4d9abffd6c4882f8c8d97e300bc6f99b0eb35af7391d0122d2bc0d69d6cb79a4cb0d67036a4ec19286e969240541fafe7c3524c02f4f6d6d41a39bedf2b4f8f28e629b15acf988f7b409afb416e1eb92dae74c2936287a692f78d345556cef9f0bd11d2dc82bf025160985ed124ce91e6b9c6db296067727e69327dab512883bda4737435a3b2369eda423ad7d44a4b58b27c00813be3c8fe6b4467db44671c432c7fdb134a4b57929d161d6103d5b657c29d109720ab2c32c217a76caf852b23384c5101a6605d1b3598c2f25343529354a6e980544cf3e8d2f25374a7aa028e92163d6007af6caf8f291353135f10962d68b9e8d1a5f3e413e56947cac5092c32c173d3b35be94e428f94152f2c30788593ff46cd5f8f201f26132f26182c32c989ecd32be94e0f8107d28b161d64bcf6e31be94d828e12152c263c62c01f4ec8f2f9f999390131c6605a0678fe3cb07c747e803c62c979e4d8e2f1fd811f0c80fb3563d9b87f1e5f3b3e45be2b3c32c1f7a76cbf8f2d9f119e2f90c49326316007a760fe32bc92c89932e89131a66f5d0b30130be7c686a6ecd0db35a7ab60fe3cbe7a607d7a387593cf4ecd5f8f2e941b221b16116d9b35dc6978f0d0f8d470eb3c69e1d80f1e593f3c3fed061d67bb600c6978f4e901a24c6ac163dfb657cf9c47cd867c2cc7ef9f0308ba567c38c2f1f224d432768bf7c884c98d9daacfed000d9b46cbbd17ea88cb582bae00781c106694bbad05e68d6c2d0ac91a1595343731b9ae1d0accda1f9f6c6f37e2f776fcc01da202a33ba09d268a0c560ae34174c6d05539b62b44fe68a0f8e76746385473e61bbb433b65634ff25a4a1d2e306a6ab6276499c300069897edf7fe08842798bbe01804188df0740fa6cb16c5e57c5648105b88c9762973ea78c182f4f5d3a388e7a04d55601c8c92e26d316c45b90e96a2cb1cf343e414b5dec094a1a577ccc183001b45fc2d725351f88e5e8667453ef154f16c9ccf33ccff360b423e2fdacd4d3880d93b6f1e969840443ba44e5343fd5d3880d12fa1b0038baa13276462d1d46303092021f5dea692405362008826007d4f9fc804188a6951c2e5551d5bc712567058757ecbd5cc159f13167698a40b203e2d569ec7e3a26218d7727e355102228f23c6fd5de27b746de83085fdee8a68ac8f282e02d09ae1a7c25cb15087eb6d610f88f59b489ec66588345774b40caa172a641b28bf18aa910efcb2ea6851ea9191159f484020fa4d0f731fa0ad1f7a56f4b052db7bad8847509068c172f56a32e36ba19dd00c141c4720bda826e66cc2aed6cb38259d3481d9c306b82372a367d359abea7b365672fc2d7cd82588e6e667674c3231c667de48a0f6a67316e15e07c3b63d6bd8c182fb51e325e6a3c9a673d62b555801be3271927b1bb418444d01edd1c412c556e6e547a304be5c6dec8e864e0c8c829400c197c5b809b204601bac790d1c5b88c2e46e79d6f779835612cb1e9c2d37c7be4f2926626cda37b173dc31ccb6c73d37cb3693e463daa10cb2ed6c57c9875d39ef77befbdf7de7bef1deb3dcf03efbdf79220386ef7c609b35bd0a807af4638f5dbe65de4799ee79122d178bf799a092e115e317979be5fd89db3bef7a64c7dfb16e02d3326e6f73dcc9894df0360c6b0f8bd0f33e6f4fbd564a9fcfe65c6acfc1e66c6a07effc38c49fddec564a97e1fc48c61f9bd1033a6c5ef879831ff3d6bb2c6dfc7cc18f2f732338687dfc798312dbf2fc064f5f0fb9e3100f8bd6bc6f8f0fb03cc98d5ef1130592ebf4fc08c09c0ef6bcc1801fc5e0133e6e5f7454c16ccef8f98313ffcdec68c71f1fb06cc9817bf4762b206f0fb24660c10bf77c08c09e2f74acc18217eff80c91ae2f7139831acdf5360c6b47e5f811903e3f74b4c16017e8f811983f2fb0ccc1899df33515bddef9ba82d192d951bd2e8f7e692e5e5e115c3eecbcb73895c98ca4d6dade054971b2aa3e2a12ef826959b12a97223224b6ef065176bb6367c8d6ec5dbb001fcb5478e6e5a8013865e72c7180b30ceeaa269a49108440862c9129b31beac64dc00314e5d3164c4f809aeab00ef6e58970cf20453885c31ceae2b457b9f0310c5f81591e54c8c71ce01dc98915b661cf94c187e118e1969570663464926cc080b7374850933b2c28419219930a39e911426cc280a1366048509332a3247b009337ac284193961c28c9640474a9830239e09334ac2841919618e8a306146449830a39d09330a320ac284e1f3308e803061f8e438fac184e18fe3a80773c5ff38fa318e783061f82ce368071386af1a4739a02b7e6a1ce160c2f051e3c8c78419dd604483d10c260c9fc53892c1a807ca45f7c612e528bf23cae88672a378bfe8e525e29a46297a74635f22a775a2d1f08a45d2ce7c88254b8c5df59e25269a30229225c62b26597cbaef8e4042083411d298e9168257fc042db59a276cf822c22c90e4c0fdb93cccba2fd7ab1e09a47bedb8df5f169f18304a9658b9058d6e463876e463548558b2c49acf12631678169f163120e8101e1810594f18909f2e674f189023cdb57473ce39a9067e39c0950d5e7ddff7cd0428f19dbfeffb94a03778c54a70a9c32ac1ab18bcba4a7cdff77d37c73c7d5182ce5189d3165edde015a5b7a1042595b841fe545bd4c506b19c315a434910bea453d8a1793a01e9d03c6544ea82f939a88c89baa07268fe9c126096d67993cad01bea82f6a02ea80cc5a12ea88f941943733061f8e105c19e21107bfaa59835e7584f6fd0d06ab871c05c31189acbd0fc8ff6a03263681c2ae385663ecdc18c4962c2f8a03237a80b3e93f98592e250ad3f3acffdc4ab1d3d2799bac12e37d88575c4f2c4399a08069a092a9db004bc986145f311f01621261221a0e833b85671db6aad9429795e71ff2bb962160d9965c9afea4a1357ccaa3fafb8ae78c56f09890f89627df345ddbf78f0837e411c75178da6516404f08c2688ef1193af1b11c0339ac0b80d62293668350a83d3402236c68c21c472fe30a1840476e8bcb00b7f92def79dfaab3ab4a62b228875bba40d5f4e18e075f5f282524e87d61b0985d6f5b2de0c830bd47cf0947a31556edbfe597fc9d3ebef29d5f4b56a248a92d705a6e174866938f8e68b48861e510da5b1e72f00b9ece98b23305bee8a551c47223d6db7a4584fbcaa2579aa54e45557fa84ad546bf0851d82f6d9b28d3f2941640de4dfd3a9bacc338820d7aafdb3160619749a0f9a6c686b3452083d0deb6f25717c85bcbcaa414f3d4b6b50d282b33c3553b6640af6e3736e40a43a6cbf74d8ae2782294562bf6ba7e882a149c5eeaccc6431cb172c350c5f1d617c166c42fc260903463339230c250783c26056657d4f68adc3f6e562f0aa82ccaa1a3983845106b184d16c456b614c17014eddcc442c5fc0e817a248061ecd37c1883191a49ac397bda8591207bd468ab532682a6194628ceb6304083feddd7ba529a78c092b9a9fa307c99269c50d9218122602631e5e31fdbd27cadc84575cbf7fe4dad353ebe92bc93fd3a58ed5a6d2d41a5e710db3e86da594921cc42b3ecd01cb663d2b2b0fb6c20a66f14ff39990c970c492f6304ff3ca8e654b4f738f09148564be7f2f6bd353b2148da18ba3d65c1231747a100443648b40b1dead8a23b72812897574d1bf90888293e92f288eb341286e83e49c56e8a93caf77dbd2f733988930cb2339d0d2f7dcddeed24b5b5c4236dac3aca95d1b678b0654697e643dbc8af95024b5a7f9f5877f7849ada9377446aba638cc534bcf55ea051397d88245d34fd16ccd5a67cc8c9931dbe9b719c39d9e9baccbea6ea22ef814ec6ebcc05cf1ef5881498171021346021198301a98262aa3441b9a2190d2fc130d75e2a4325b30c6f2d4fc001a7c0850173e97130b69687e4796e2189a7f49ce118f84234da7eb647932531b2aa568ead1cdc9375b4a30a8e78dc3e809e8113d74d1b7b310eaa557682fbaa4f3333801366aeb7e9bb219f4e2d6d625a9ecbb1e4937f2ca68ada7d006bba15e7a854882de52d0dbc739295fa2ba6c4f1913505db6874626aacbf66fb4317b7ab84dbcecfb5c51d9e8966d6a0b24a94c24cb4b5a52d63382b7b1b1098366cd3433d8f5519edadabe9d67a33c7487ead8d8d8d8cc13a909afb6872a53344c988dca26cc467b7a74c4927e034175d95e9fd02e9e864ea0ec9dd04851e8a304d456cab72f515bfced20d841535bf5db6d9cc872ca7adba84c26ab2d21a4d106933535e1479bc7e9a2b2daa23dd565fbbd32d10ddddff07e4f7a97320a19bd34026116f034c72c91293a89efa211653f869ef2244467f1d0539e72d1c802658f6a11ca43a6b34809f140318942380db03c10e90d496dde829ba6372291297a86da0e2137c0871e2277840e7e86281bf7484cd7257708219137be77df11deebc81de0bfcfe01a21d3080b7e9a77c64b648a1689f8a147512f7a12a17f6414fc9038d2a63ddbd6d3db5fd4d6f7edabdaf2be7dd4b4a7b6a62bf6d37dc585ff2ef21e5ac017da7eb7773abdddbbe9eddf7630b4e9eda28dcaaacb365dd3e5dd71ba2c0f441b5b3d1f0ceac98395e2ceb09602e49b2da506d4dcbf39cb53cfaf7abe688d77e8ac356e134794ebceb8604778c55dc65aecc8139d9e479ee0b48b9e47ee20e326acc5b84915341a96b544ed94ee54eea80674e72bd19136d4353a93b3ba2851730203b846b7a12ed29150f25c6a3ca772ee1f453d08913e0872a4ad32d21e47fa0521a2844ed4d93b3dfb8eb7ba7017c7d149171d4675e1be2f45ef79d768caf7d27f10814456f08a63f964161493572cbfa1111a898343a15098aee3ffc830f5d4c1d0881259ce7478c4c7f28f4eb4681c2d3edb343ad1a25b1c659c2ca7e14b756f24c7d468652d3e837978ce0f5e71f7e133786708af3818af8ef04a030a8ff0ce85477ca764596a640766da74cdf4d29f4296da0d8d2895fefd3305dd4baea7eb27ebba525f7e4cbada8aa46b67c95207e8a2c32beba2b3b9f8c08ed556eba2d32e3f2e3fa80beb92c32b6b5d7c604970c743f25d13b748d1c42bee975df8dc85b8305aac31dec232baebb0fd8259f49d10add1d8c818af4b0ac12bee521e5e699bc6cdf052245017dcef3656cad354d633f8bb75e338ad5e12b42932c52bd694d181af2d1cb785772592e4eae54bff05a784effb66a8d98813e401f2005500da34f94890a77d9db7a71d9de3d4945272c652a6f9664bc92b2d0555ab364a931276154444d5f86cf8d23625729ceac16fbc01854020c75de360c498918398c6693360c4b0c1acf0450fa35691f542bdf35f7807b90563bbf73e6730edec4ca760d270ab309852a6236d326517889e673ceeb86da7a008f2f80c370af2689048cfe06fe3344a2b376a9757e02f036d5524858fb27dc561e9b691383492c4518bd0596baded4ec529725d4bbbddacedbcaeebbaaa5d6d46e54ed6521a6e412341adb35a6badb5d6ca1aaa08cb24571605218a5a1a067d0d5f357c5121e6b5d60a76dc7af328a5166cbb69b59252802e214cdeca3cba773346df01945eba985e8e282f554221259d236f7ae9f6317afb471a699f4f2451140ac1d1c4abcd86af4feb62b4d6911c88d1dad5b8d1f616c325a486a4a0336c2dce65167f3671cf6d9ddd383bedb53d2f6512d4edb2c13eb14fec13ee5c0da26359653b705afb5673f0ba9755d9b66d5456832a5503087ed6ea12bb3f2b18b017b0558d896209d22f347e5d1a4d99d077aacb8c4929fd74fec974120bd3c8e229e3d62716a72ffd635162412d8b94513b957cb89dcaeda48cb659d8538964aab54d27ee522865a4cda20299482028648da5ccf65a3c55147acb5dd79f949b46e7571f16279d5f93cc1828c40e9d5fab9832a1575975e119534a19472f8d5b9346a76771d3e8df1db118d16da4f177dba3d19a524eb576ca38270c8905397965e266511a9546da2327a4a0e91412080a39ab699c3d435c48abb76bec2774439b08e464a171ebeee5aaca6a931afbc43b88e56dedeb3870348a56b824e23f307c892410a24814dd1381a10e0c7960e8fbc010f8eda150bb0765efb2ca647556679c68fae1c5a6892c953e6b8bc6daf04083523f3d6ae5a558c27831a98bb803ea4251cefd3b8daaa38c5cb38c3466a37c9bd556dde14d260b6d3f769035b7d8343d0f236afc9a4c8d9ef799ee77b7daa4a907ab344daba8afe8aba038635062a60c8a8585898b1532343dca28eb260b85c520d61677bd77f4667519c759d7aa5b611f57c32cd45b9c85e57c8e8659a8f33f0fc5826ad182a2b30aaba47f6c7b4469664c1d660ccbf9db1553a6c55fa78b726c7a161e9a1eb5ba62b2503c7234626fb319333b134a0a35de6631a68cb37a5703512337438d5b57980a356ae187aab1a41014d457fe85c2d70a098488b28272141235d6fe3c1035727f1f881a697fa0d75d100c4d5ea1b6468d4054b65975b9e168c4303c698d8232d66dc6d188282337cae3a92e4c56584dede121f853589cb6d966dfb7fd6c3fff411969a346202a5f51a937dd5d65dc661c4ee568389beac2df3d586db1e7c1bac2429f14163ab3609b71a56f379d864494ae5dd2588a7ab4cdb62eeb0e9ea0bd83d96c369b35e3b4c6813bef4681d8cfd0562f2605cfb014766624059de19bca82077e9ff730044b4ac4eb2812c2ebe070f3c230d4b4307cd19bd7690fc9b233a20bbd873a284ff743969d47bb538a04f09d37cef0058a1da98ddbc5dafa0e8225ca3d8a042a73ef8137912537f3b467e39a5e9c2b51483ed899c8223cd4fdf6f02f46ffbe8e2c6b80efde9d864780efbcd32154a6bb47865d579a1e7aef481cdd11e167c0b632c544a278210df0383cd33bd0f352480e852c6d6fa069a3b2feba51bb236d66feddc8eeaf2d51a42eb4f0a4b15e8484ae2b73809d169247705714fac8f2f66b2b44be1891ef6c54170b827fd1dd6dd4d60c8e41f0f7a5f7d2bbdd378f447d2f6acb0647ce176dbb6b61f82ea4e11dc725c1f66ee3de5eb21491e58bd6fe7914095cf80ab7916e9ed6debbee78c2d03b76e9c897eec892b4515b21920cc3f034181cbb2ee40e8e1f39ce344991405d68942281ca509eb65e455983c614d4c297d7da7ee2151344da9de933f8dede1b49efdba869bf1a5b8e76637d0d8bb8266671006ceddc41b067785b2d179668fa8ae43ab4ae8fdd29d08841ceeddbbfed2d38bee7c2d5f7464e36891f782d6b2327973962f43c7774d3b1a1c2acce40905385201c100744051f2390f1b0383bc625c459a40a4baa2c47957515b5f07d265134956cb5d5da4aedb4735afa6aabb575a652ed0bdf6c29452036775dcd7e9ebe6e9a66ab66edbcd54514aa5184578a3963b6f3e5d57489950c2bd8e9163d8dace06685a779e859e4498f274d7aec59e4498fce4f9132dcf47b166112d4412f90f57b1a7941cf1d7ad0dcf4a86791274efa9bda10c43295d3fc16b1d6b9f7de7befbdf75e9a437ff08a7578a505d17048cd87f6a3351c2541543e1b15be54fe523224e5b357c257ca5f4a587cb64af862f19792d3679fc2d7e92f9f263366f6ca67b3085f2b7ff958316366a38efa4bc98fd467a384afd45f3e4c549f6d0a5faabf94f860f9ec52f862f94b098f169f4d0a5f2dfef2f9678fc2d7fff2f13163668f9f2d86aff12f9f23336636f9d9a2f045fee5b364c6cce6e1b343e18b87bf7c86cc98d92d9f1d86af96bf92389931b37bf86c307cf5f0974fcd8c990d80cffec21700fef2e9316366fbf0d95ef8f2e12f1f243366f6eaabbf7c78cc98d92e9f7dc397cb5f3e3f66ccec003c007ff9049931b3057001fce5e3336366bf7cb616be5efef22132637c66dbf005732e8118036e4b78e579bff7965787dd8078f5c3ab5833786fdc7c9a3724bc621c5ef1e643d6e4fedc2597c9fdb94bea69c909e874f22142e4c8919e184f1155fa6cd1e78560160a9c281fcda81ea89c9e6fe1162aa79e5e3cf86dc93848db208e17d4c19531aa888c2a9e5bbb514584553c3ce46591a572523fa020962c319658eaa644e5fc88a50eadef53ef528513eb7b548eaa07b32e09a43b5f192588f1ee33b41183b4b94b06a9f2c12e7c15ce44f1aecdb92cb2fe42908634ee4b09b4b4e7852859d6110758de83e1eb5e55c32c20ce57d9d4968cf355249832a91d3a5099d410384c99140f75c14da84c8a881d262b88f35372a02c21ce4fb561b286383fb5a39a6288139e38341136343f9585324c99144c0c93c5020395491de90265b5b63065523d49260bc6655248a80b3eec0c292ed018c051419875491ca697ce2d8da3b65c12f5e32b7d0023ed7befbdf75ed11d533b5486856708956121c2436558603c3b4486c0789a9f224265588ec0a80c4bcf112ac382a487caa87a501748a88c0a87bae01f21d2033bd2aa544fdb0089e946942e0ed3eb45ff1804a23b0b0f9549c53e19a3ea09d3859f8ad10274e7254c9854ac6babbb8bbf70f1b2f68b77630b134c97cd7e46bd1604c1cf822565e1f9e1fcf9c34b6e16221f8c3b22f68cce674142fa4784838947463d4d6241d27c1823cb16e68adf1a59c040577cd6c85286c9d284050e93850e74c50f626c4182b9e20331b6b069c1835df82a1bf0553d0870be0a472380aa47b3f77a2f9dab5be66831dd84fac12bbe8bb16cc102028c258b174a9631b0a0a199650e25cb1dca162668bec612430561d69c031867974a544a45845df8a91c66a57e5c52c5930615caaf8a67ba30487a2a1e66016a66b9a92d169d7bd3a89cda6a01ab2e7c96d89c75a9e279c962d3af24478ec4623db12d20899d629dd8af24478e10218284e508b75860447a90f4c4604488b0b0f0c088f0e0d667535dbe9b951e1a597a3c4eb17b45f174fa4fa7589f8e74b90575308dd2ae2b697bbc82d3ade074b0ee48d7c3acf2f27448ee920ee727122f19f95c9ddaaa34d585779c74596f82347f6366de82780b2ab7a0deb420aef4f40a92e63b7ae3d5bcdfd7232b3c2baf2440f7de7b67df3189ec7239bc62ee478bbefd0e35add2b3881d64fdddd1bbdeddd8f33c902f587f47be37821ee8691e6f34dc70aee2431b794d9855b278ef66b555c305d901c700cdef823c9a1a6ed5dc3bfc68bec7835ba458b7e4a7b5f1a50436be92f8fc308bd50c44c667d8ddca1879b4e77de038c10bcaaa571f6af5d7bba06703d6a0b3efa90aa80befdebd83e3e54181f7debb18b3ec80d3dc65e75dd05acf8e4cdc7befad6469a7772d3c42fbfd0ceff63b8ac84a6e630fcaf96826b91b5e1de962f586b7eec77a76b0e959c4c9ac7b52a18223bd05d556e7c37cef4e643f45aee0297205ce8ca787e8696436457ff307d10c3d3d8b9881e7a5671133f098a177ef76bdf1730167480304455f811779e5ad9ec8f3bcea893c90c4a19dbb478645687701b7f182b55edbde4bb02b59aec222bcf67c08c56fa7db651280f0752fe98d226a436534d2ab5507973a7886477064c9ed694cba964abfcc22c04b24a7598ec4a195b6ab6684ad24aa74d141cff368a54cc07a1178715c8534ec2fe9437804e8895ab6a43c5a64ad6d890e80da8315710f4dd334ad2422afb81dc6085ec6d89d00281f8ddf3faafd963cd1bdeb95488ff4fe05400554666bd9b83c522b41127c6d8dc4e1fd5672d3ee95d623a988f42e89e2be1dbcdf6c83b53dd135f09d8eda28a369bcbc2ab58434bce31091a5f3500241f02fe10bfc666fcd8db4ade779bf9c56ef12beeae5fbed1e0fca43dbf143904b8a1f825cdd63ca0de7b575b15a06273d8b94a149cf2265504277b12a66cc3ddf3b10199fc15f773defdedbc57088ef09d3014d17630989a0ad432c556e362437bd056117fe1022256743e920be92c826cb8acf1b5f49ac5042e39524e895c48a5235fb1a494193be5f99fa9544a60a5f4964bc52cd164bec958409b368dfb1b47d6bf5c0f17aa99025565b5d6c255cc0ec1babf3a804ad73d6a19e748a664680008006e313002028140e884463d1683824cbd2f40114800c9aac527c4e9c87414c21638c21060801000000000000009a3000b07cc01ab8063c49a0d3c1aba45d3c4fd399e60e477aeef24381f003044b5de34a59b9e678b674986c8818c76436785f713921b20381b7b1ba8eb3e8ee5823f986c163df1451db4e0a94acbbb3c453a1ffb91bce8920931c755c077856d312732061148aea3268a93b26303b493a1d839a044f533da4f434d13b588623612bede6a0191b4126ea64b3e5de7809b9ef035499171a5342dea46644f5a53887f62dcdb46b91a1040356b7a61dd897aaca6507036c212d4de3a24a8258b2740cd70127c88dbdad5cd41c951210851cb6e63f2f25ad082d555574409187430777f0991a7a4680bbd465c02aec55be0884c63cbcab11198e604f3f746fb7df14f0c2e1447a5293c9d35119fa752480cf953002089fe93542afa537d491c9e8f412e42e798c5eae1cc3df1a4c4b208e08467aef9894cdfd4d7b83e1437b3896b8f76b9469391bad6fcb482ba4a4625243763e29da6e61904e30bf1dd1884d048a4e081eeca5ce0160d86c88d6b40c230500eba2619d45732b787417ffd7d42975a9e7a155b09972c4b59d37729cbc35004d08e4f44c115665b96840fde3522bf6f0cdc378da8a236bc857aac4482b686bab906a0b3bdac05efacaa47753ae7ee3980bb74ffb5cc6f6b3fc920bb5d669520cbf460fcb67e30e5b9dd131b78a05e23f4e62246c1eb2e9741d73a5df58ae1e655efb2d051d3cb6e09679ac7dd942f65e080d2e18fa6b98422d2dc75500d193b65941429449fecf06a90a96c475c91ac30dc89581d2dbbfc1f3543a933e1d94a378fa43f780fcf0001d679f2cb9c0ae9b5b17ba25338e1aa3c46646f59a573f561f960d4b88167ebcd253a64c2014bb89d9912c07c0f0693da9be53e017c2308977e57f92e819dec698254eee7bb2209cd65a5d7b96548bb2f688a90daf795f277eb41979cdb89d3fba6a2a9f4ba591511dddda2fd234b1762b4e3963c3b6f4328db8ec9c1bf1047e673b98920a6566765c1e199e3498318002599bf0b49ec9f93865359d4d6d91f00b955b08ec48ad44eeb622d33b1fbe9f159e1815574ef2b225ab713720c345bf285ee232efd2a46fe8c57543510258917798c4b27891671d8d8b646f53c605a233dd6eb51a6b7fbb50c0757abb186e0a43f4996601c3ec5e11036144669363c3720e9d0a23cd7af010788fb0921e2c8a012d3b2c1a36211e5ce80fefd1b6429198ea86b756154cbb1d8399477392e827e1122311e7c94cfdcb0526141735b1c17c94e391a6275ce391982b014cbdaee60aecb89e9d040e47caa72029e0da15e74d655ae74a877ca630c273ba2b545d03201046ef63108577d2f8242c50bd61771ea7f8630cb4f53c43a26ae842c2df2716da3651c7d14b7a24600341a692c6e6197a9a990ef832456c1d23212263c8485b2929192d56435ac3dee1df6f177941a5ffa8d07fe490d7b00bcb7179daa0ec65c444d5adc568941fc4f04ba13fe58832ddf0b972fbb3ab38bfb1d245ba11a0e5323515298d3a5612b026cbf60930d146d03343dd2f6f64fbc2bc544630392dd3fbedb7ce8d2ad12a14c0d400941d96fecb9c19e6d83da22349a63e9d425fce1e9a3315319e2dbe3eced12f213d32b6c1876cd82094e58bf8070807651e36aadb61165b8892fe0bde9c38b937fd5122cd021185d42efa802825ba1e8f007143b6a78bb411022652a27d5a85b203395fcab878d5eef1be2a8de1d693c2636fd8b4547f435b2de3022147be5f0c3c770e898fb4b3b321a46568274790a6e486ca549d3426b4c3ff2b4b7db6ebc211a233dda263e1e0dfffda6b6b6c2496f632b58fbe754d3e8012ca69a753442d1fa7cd16c3469f3ca1705f2bd658b518f4f98c1cc913163014e70b55201cd55b99426d50245164a9381d687a4c56917a0ab621655d849771b81805eb8e6ea6b62caad1d9c8a6f0a75f21a217f741333e17d6eea57a8d070017d5bcee9a8b5811c1c3929cab1116cc42126d3326a7f47aafd2046efbe9dab8e659b5dd5c73cf21bcecc4329aab7f805cf772907cbd2b9f11d90ef1225e84f778af492d69cc2cd82798199cce6602388f762dcf6041b213c03633c5ce87ea17001767ae058a8260c7721c73e7b62af4b1d37234a8dbed38b9854677d13e3002e1ec46111f026a0d8eabe4599791586869b53dd40cb497cbc316598e29816894aae30c5d437bc2eb5131668b81050dc8cdbc2030723289ba539ec32f58bc3501e1ead28428f2a4a9d4a6a9c836a4fb2ad29f912b1b91fc4b29b113365a7b710b3e528b72f519183a15e5abcae4dcc4857b2781ecc11ac99e313ca95222100e2e33e4bb3d200fc16f711244ce31560ce1b14c8a3ebaac602d821efd50971244f479701b4b74093908233e93d77ac33f8a4af6866079981d1ff278d8f8bf5e723d16126502efb910faac63f6f8d0f3c3e69ff5486f53b8b3a5c1a633ce33e3439e8f1bf3ef88e60b47a885cd38678c0f3f661c08934705d3d79871ce189f70f983f33178a2d6301326095c42879a1ba90d1cda427a211344a43d8704801ffd7a36d8941299cd3b58a6e12659ed57890c44674acc83d0b32e577a026ef444a531ff1f649c12a1bc0f4d54738abf40046334214d91ecb009c7499c2d6c9522b82e42971ee575b730e45a91b22793b9f1144c12c45fae159917128e498066434184c489484ea6e8b0dd08e298213ae6b71bcb3d0b69e84150dfaaf42cb203d54e779a8ddff73b4ed4117376166c61dbae956bea6142a5aa3268e6c72fcc4126ca28aa33357c90898af731922bec0534dbf3a4847a96524228f3525d2240fef656a311ccc8c8e63bb04b5bba1e00bf87bf1bbcc28a7ddd29a20d494d752131b541e0f1cd46546077923ca407422f266a7af79e80dd016a46194dc3dd19f5a6b140fc5d70a52e273bd6349b0b045429d130bb119875d5df965e16ca0f19ed0c1fc35eda02b0ffae2b973585684e6461ea1da176139752df154b30ed0a01c2b58743a72ab108b363878bb5d14c9fb8fbab985738e00ad6ede939ab2eb72f57b0759c51539cdac41106cfbc31805db7120a2e619305bd89d1d70a3e819684b967bcdcb70398b61b52b23cbe68370c269525c223a275f28c747d9e4ee10d4e24e6d17348ba45e3024f90edd61ee2d4a15dab56fd9bf6a6a4dc954f762216ad5217a150c559f870bd0ca018869f02fbd653add11e1b2b6ee45296b1caedf671571446bbb3601042b28bec51cd9ab923c5091040dbda6a71e5e4f5bf6e9b49e9b122bcb183595b613767e474d0e3a02c253b598905232b8b34027c28d841283feb659757538b10831a9f28975b0988416d9b907d288fa85fd66616a6f34a60a9b957f0701ef30841dff8a488e63240c7f98c98463d6a8d9acc06bb5d8613c348e3273a15d5d51dfd36cfc582a549fa8afdc7e25a1027fc140bea509b18f829bc92325fb86768cf43fb1d924f8213fed232db180cb3e338f04bc7d5a14006ef728af02dc3a76a3ed80b8385f9168886040aaeba14fa9baf5532e4cc548da452d38af7ffecc13ff5197be3d3e95b172ee4ea5779a558958d9fcd362cf7e5096247fe3e6e6bb26ec5fef9bf534037af8b96fb56988f826038ce5af4201084559229ffcb3b3f483542276a7c65f1b57e09c541739ffc173129565184528fdbd0d93d24f551eb7cd49af010fd18cd278dae268ac777fc4d8aa3560de8251768e16c84150412eb80d3a37a9fbd5384f0994faa2b40e332cf1177ead815a611852ee58c8e426587781639ae1d51b88f1241f7a87f86be6fb1e6b72d40e2aff2dd77f48dcee12f3aef2885e31248a7439ef3c8be9030ce7ef5a4099e957b18d8a49f3cd285510b06853a307d15665179d78ddc61aa81dd36bf8fc20465666dd1e44c87fa9724d5f6358499bc63a0634d0f591430caa16a0780c8e4b3ed5cefb6b5adc06235ae7dee8bada2053194670c6dbaaa1e8f993a0da928c58d610394d0a21fa8c5dc0149e52031c7d33feb1a7f9d8b961af4442095e01ef78f92bf3568b6db5b3b8b85c8a74a39efb0ce634ac4b18ede78a7251c976771e6db7322cc591b2c2864a9026c25112c0987e002f9db6d3c1e5aa9749beae139d230b7add81601a983333ed64bca64343a27eb7e21a0b891e6182c1a3cc4dc87806e9281fd693b381f486fefdcc8ef954fa7863a4dba0592cbe6b3f053522f62a83925582fe54be2eea9f06d039cbb7ed3ddf17aca82cc7d3659a88887a8b80d056a79e7ccad94af185d4e7aa9f1e85d3562161e6878246c8ddaebd2ae3a3e2cff4c991ddc3c43a3af076a63699b836562a4e92cf64584100b653280f285088690c7f706ebd4ae34b61e693d53f45fa148708102877348c760b83cfd465ac2c4f40e76a97a26a6db79449727ab297cb196e1a776d5403a79feb3c7cb8b865c6bc0edcdfabb276e6820b0e851671336794d876023439a0774484f98f68f2f9091b69b44936dc895b9baf79fcde7c2eb736df5a2479f03e6c454f1ec4f91f56295d037e7435ccece72b247a5c3da0bf68521456006f54fefd8c42fbb45b0e6a92da7cda048e22ff2ef228c863a00f1175b6f5745ba03eb225e0d0d8109fa7aa008ef267cf31b01cf0b6644950eddbeb9360903c203cb5301057f67f51aace40861e05fb6265e9317d9fe799c9e8d76e45202439a9d733e48dd282bd5c9439950749dca4ea04680bc8b04a8ac142c12ed14251b26621224ed881551bea97a5e4a8eecacfc1b145d8e2fa56c074fcab0cfc6c0662268005099c5516c41a6935ae823b81d260e89b385eac984ef599452d07cab09e8b411cd609447ab57609d49e4b791074c310c860f0da85d1bcda4c5214b487964dec5c21aa679407cd4bc1f799be35f0afaaf2c595ae01adcd4f76afab67ade9d452d00e3fad843b9aca7d2d39b691a40313805471d22c6a24b39a47c58ae9605fcd7c15154184b8aca719b5fb7f947d73bea1113365c393f919dcc80fa45450dec35a75a0a0fa8b6768481feced5ad5201a6ec022e8c9779ab69c144ca734a96cdf5523234bfe72cbb442d21a852de3fef316f6f98b0c7f9405e954db2790df94a4c6bd3b89a2ff5093cf2144a31b594d4183e74278589bf58277e361f0d548e914b2ac0ab29950d1052e1de1e9a4c64823bcd23b0e20903977e38edee0904113f064916103486fbef401527ce015c5c837159184020f65ce40753be130104adf1fe8013b96b79ee82d5a7fcab5c7f2b05117bc9c0bd873b70749e5e3f8d1ca3feb0a3796f4e793fe77d886dc9854be287c7fb203c2f14368c901609f886ee6b39cc79c84b5ca490a5e0c17e2055d8a0dd8012908a46f417a55e1710e314056c9f70afe1386732ffc7a0e1dd4472d9263619008e1a293db7511b1b631d5290f83561bd1bc4821169f4d0dfe485ccb90a95aaaecd625b18651b74b9fb83071ebccfdc22a24f43c6781d26d90fe15a764b92c95d77834a776ce9273d01ed02a30d413b46cb521744a15583f0f32d8890b8f57e373364919a7991a4dfe90bccd2e8c0866cf6c1813305d19c03304b280afba03189c480f5c0bb2a15550e588226009d05c7d36bcafc0f370b225ff76fe357e2c4dca28245c05f160861cb81e4b261137679ad6135c383722a299fb2da97f070dda030abdac4b1b63934be10c761507606e9a094fd23a208b8a96edf78e000088b6bd24c7de2252d00e5589f80822d5a1fb8eadffc25889e36d9ce3fd8d4241a7bf23815e6ff222aa9b925a45ad751282c2d9e7bf6713514b804c7338eb0c5f9d81df2801cd04a263454d6a4778df299a31f80468539740008cb1a0d96584a2bdf1a2211afcac1485a1a0d23ad6baea00d6bd744472e588e3a52a5e6856e21e024323ca445e3227e89310bf91715a0da5db2ce1f089a02ef81e4052b8a0379d4c77d1d376186a872d2fa9d2bda80bc3c8ba90facbcbb111fa6b58d1047b8b7c056115040bc84b552abb447e2c571a34d87112aab6e346e9f07192711172a27ca4c1d705c0f80a01330e67e57e80471d67ce8154b4ffc09658e7e795662caa1135577e177da9b2dbca544cd01860c951d56b5e48e39456f5b257019280cc45bc0ac78a2c2bb8948e5fe0d1870349cb961fb580816cb7da3c395bb0d53d441d75284c15988299154285a235356f43df61ced1eeb065756043a323b37b618de2b35f0403ce55b3c54e02d6b7b759b4cac8e8f7346fa593d92633546813295e05f5fd0d812eb50ff883d83878774751ea797277b4fb6fc9d9f0e7c7fd06c825efeb60299cb6dd023a0c7870b939b44ac20bbfeb9542be4e92b45351a7bd4ce2f9d28003650cd1fd47a865c9bd864ccda46b09dc8adbdc12344895b76e195fe1d8e00a8d6495963a54d260a210afd515ed6ffa486dd0da27c2ffd343789053d49ed2872376e1005426bab791faad2806766f860719fc1e36f0cbdbd5a21033dd1ed305f6ae5cbdb9ac0a4b2f860b9132722988956d04015c31ed5862898f01668b4bd4a28b2960f7de170459837751f552f0686087c8ef53a911d99f174aa9a52b197623c72d6d195d429c8664e4b10b1316888c8f75a29d665f6d341c61e3847760bd7a95b0d1914472e9f58e2b2974c1c749c65df754f3466cedcdb2c029898d71debdf314ec859ba64ef533b506fe461dd8452d4c6f4da13eecce1e83de317c5b0d533704aa21ba2bb4049f010c106e9955d59d9b5764cf17e071f4244f12f1037be4e7010ef1e766db4defe097d85296697abb719b1df05d0e70dd88474ae39a31dca58c9d1f0ee5eecaf789f72ecf69a3d533d7b8cf12cb066b3db689182d443d7e99fa2a3104ec6c14532ae51f012dd39b232e3010d459d991ebeba209270ec25fb6376dcedcacf69eed92ec807460781e652a340aeab6547528fabea5bccf1765c7acbc6719e1ef2a2a1a0028514efde7820be05c74dcba572d96960faf3d3b922973f0c35bd178e6ab32c75e827efe7e65f3c35132d97a95edd73b92ab65b2e5b6dd85bfef055afbd3056622f9c55a117d67ab417de4aec85b92af4c25d8ff6c25e89e5af0a5d5c6c031f3058cf72589ace7036c7b3580543cef92696c752eba382fac8cc651d2293190283db4b2637009999c5c29f9535b12816567eea4dd89dc3ebecea76a22699bc26e0649fa8213310fbb989a209cc53941357309c57f8ae3a05d7d9ab611ac13cbaa2a1b2b3dd529a8707d3c6f3f6567adc81ec5cb24dafbe0de17faba61b7d8ff752c24e612c10c19f64af831e466a88ee814eb2d08cf50a1879ee998f9bba0934f5aa2f61a08f1216dd2d44dd1ee0c37d54bd7205a54ed2217f9bb250336e948006fd5f6c6c6a9e62688a50486263df310603b1892993249fc6d4b5ce9091df651150dc8b69bd98116e7f6f4964b5e0aa8d307366d905ed3efbd4602d86ec60a39a6b77cb8c550d6f525fe99454460bb4f989686167461158c222df2d9e6fe5f2dc90846c458e88096bc9f69f71fa5679689a95deab0a4883f4bf187d8371b23240e3c799295fd279112cafea79ba81b060b6cf9940553dcd58a057bedd0b1d0c901a4917d36e8137b1e54c32ee3ab26291b450cd806fc9781794a0b97295199fb3d37fd111e8f32d8d9ae73af12bc55f61de35f9eee2ee9b6915cb821229cde67f0657a9788fa00cf5639465ff785b203da9e9dd86eaab6c4e2618e932bb590f47032f9e5ede0794d68bbf1ab005e4d6cd110ef0fbc4894779690d739f66916ae4d8a6ec0e3ea835d856b8a57d6589a399328485dd27069910f2ae52450e92ccd456bac872bdba2cc581730e7e01208d3a3fc40dc794794149e4b963cd61c750b20e17acfbe65ca99b47f4bc740f31ca0117ba2e2d3d09081ca0db924f02f919afdd833a72c376e9dcf8d601014245368d95cb8636b6959d0049f9d9c27ced458688c867e790176ea6f82b66d0f9d80a1120e6af3c07206266df1f64b3fc4ad506e225c24ba9bc6609cb5db27757ddde746fd1f53dd7d69cda72bfe4de2d5a0d3bb4493721392522881189c354b26cdb06886e4fa0e4aba1b6ef2b62df0ccde6c9bf1810f3c5238f2030118c40e4c4754579761c581a9576c0f13cef49f6d1f62c468535c774a31685e3135eb645e73c8da8c9808f602878003df179637441292ad62e0b9c9e25730bb8b48965adeee77b1dfa30e4c606153710c77e4badcbc58b1c3f40776c4a681a550d5c6d14ef038440a57dd730714372bc68984b27f6b718cff1d246fa51020db63e367abbd6d62bfd9d30c6d032bbcad7c2c237af1302e9a802ee5c1c2d1bdddb73923ded9568f84efe541598877cf1f76838d98814a35c583d03f69b90cacd299ff8dc89585369cae2423aee2ff52ba39b81596f21c137e98614516fb87eb52a1a3a18054d8a4b84b075a9f7d2e0bffc705ebf8f13ec2fed5cabc364dd790af4cff7168a8f92db8cec4c2148d16d2456a6c3b3f5955f346576c3743e94a2f9b865465415a0faef1fa31037097dc6f67b9c98b90f5783be8cf58fdd5759ad8ee725f2fc623f6afc01ff37bc2476d56637a60378e9813ef1ffeefeaf1362020f4f44fd0e57ccd4012f4d2c8053ef3c544cc96a1be8592a3824e377232fcf9dded121542732128a521985f40b78d7dfff9d79838f5150e898f3e480964fde21376c4f9b6e3cc208bc0b7a1fb7af04c60463aa15195466683068a7b26a0548c022890c4baafe59589593ac2624cc4a27ca79147a624060b4853a46b275079354e54c1a9eb658179cf7f954bc01e6355eb5633c72a7d9e52e81605359a404979d56864583dd1ea655c9be1c40431ed96e20c53837e0379847ad1573354ade09310276738992ce3738c1bb165f5625aac808765a55567d96d43c30248abe2b76e079eb96aba4ee02131128de339c6723c2b4ee84a88626152f6470b215d9cfe885bfce71b5f0dcb37b71d1ee656d0de21adacd0b27fbeba0cb2f2f319c7a0ac973595810092f1869f1667121b91a9c51381d5da64fd135ab4477f365f32de9e9980570556b6d99fb5cbe93b48fe40b1b72443a1aa79cfcb3b0c62ed846b85a8d6f3e28f666a8d9df4267efe65ba59cf68b18f55ecec443d20540d1a987d5618ebf17901daf119ac08d6f064898cda592e367deef2ebf58a2392b528947cc55dc79dfbeced2ab0fee267c6a2d308ac91aab4bb7165c567e579dda5cb6bfae49640213051ed293e38063348042c035ec05cff8c5ce37ad2b47df611b34a3dac474a09dfbdd35341302acab377dd8abf3be36e1e82362842014f30b17d6c40f02a8a0494936e81ee747a0cfbb31e16331f833c4b462fa7bc4dc8972645b385f69dd68c216edffc328468728bccbbb808738c11cf84255acc80e2dd1d36d1a1d559bf2dd11859c416f52a7e34cebdff7fe9ce67fd545a4b04eb7c1e2e1c3924cb24cf431f8d73b2aa0d40b2b6823760612c7acf608870e345e0da39aa908f80b5e68dd8b8982353edfce210322aeaf6f0dc4b4c130cb95a2d99e8c320027e3e3f92bfcfd3c679a4cd2b87101d379c1d722927d4283fae594899bc55542626616d7c1578523cf596f14f0d9b7db8042684af1574da38286b26a0d52a1d88634e8c2daa1cdefd5ae607e6a67e353a9e9f7c4d7cd3e914b8382577f29ff33a2b54cc44c7bfa0deccf138119034f007e804186f9fe15c2a397660f4f9a04020f0da272b10588aec4cac736de37cc2c9c25672d12a205cc768c3d536005056424c7f8ec262df912331498397e4630a7950af885e16ba3b647f633260380bd237c0940f218dce24011cc42abd81225a0183a55e8d98a122f9f274a9a9a3a0616f3e97b12388a06dc5baefc8a50a8008ba0a63e14be11ffc8567f1066d6eae47693fe0072b25393a04de01fffe54a4a92a12e7e508de5e598b31a602ba9165e44603e24042bff93a1aa74d0f101aaa1461ed7e5058ca66f3bc9bc997180b0d14782f32f95ec2ade704326387c4b041ab71aa92ba3afc281cef5824eb2f0123ef188fa9d3d4e498dd9c6c3530201815665fe8006f9ec0f8a467399b787978625301cf5b8dd610072a150eef6443d1f49231308c3622aeae967ee2618094cbe0e9989f4e498f74a53920902fbf9f6ca26316790eb045f600229671db7875ea3a1e2a41390771aeaa722b3eac4dfb4e16d6d5294e5fb44ec046d2a7ce348c54f2c44a73238a959c3fa260ba8d8bfa7ff8032f8f47b6c40155c0902cfd68540dd0f5f0860263faf62d670868c34b0a466e05e71447252864341e9ce335f1760fbe4ca7985f102d8c692233aecc07dbe5ade9e410c79976c364e40298bf360ffbb86fd190dc12f324102238f14f3505374d84a6ed9eb64b9997e08a0e98ea9c7df36ee2492e1e355d2d9d072759757328f09867cb25c4087ba531928171baf96144a947d628c561f093025742f53a127819923e0ce7d895ddb34ff16f4f584c0f4832323376077669850f19c68b1d388c292787860c2c4c485ca092dea0c1bdd04caed4f216e699dfe53837fe20612673b4ea2ce96fe2aec33aa0bbb70055ad67b5bd35221fc0f745db87936eece731e22eef4aec050331f8fb70913e717668c6e3064178e76e6035c0b3c5e9da6c2ecde19b7269d4cc48027f5ca61d35d03d3162158039d2ea43102488bce22aec7cf19dc6c57df2b2abbaef913615be044966253ac3362c1980c3b98d98a1e2698a25f53a9f02ed1931544c78ac4d088cb5311b815e7c2cb526e352d498aad5e93d860a49dd7ed401bd56a4ff69e1b575c2ca7fdcd79f42075245c9898f0ef2829d8d155145b9d49e4c32df64d3e9ef95a00c485568f7a5563631862773953149b2c3eabb8f042aa0f0e5d5a8e4edb6676234f54cf836841baecfd1f4a46ddf5391bfaf1a1d43a918be151a3ef091d7eeb0f08bedf062379c02d0270285ab15a24abe42ccdee5ed1e74f511681824a9cba12f8717adfa2a68db072c06a5e5e1b05b6c783b0fbddc7cb4ec0ec9c7c353b7f560963cdec7804f5d8d374377f74372b76e95ca4b82c7570a760abd7880b4aa219dbc120811dee0d8a65f5fd04fb86c010ae9682906a0a8970d949ea6c0c35abc7f58a13a7c11ababcc4420b1f8066edd032799dc37b8d164c41f13d37a3f6c5bdb45b64a3d50850d1ad252ddfb61ca06e98ff4250561fb0c095f1567dd32ea62fea820bb77de8a453340a320c6298f75f98a91df9d8a946d90a1716b8a6abde65fa13e237ddf6fae2fec7f2166721ae732c5355a3d27f8c3bdef752ff771184fc2f212e3d500b13032a0f92dc1bed7ce9baa9a0e569301195bf621c907d65003f139b6a7f7b3b96e39beeae691140ee321f7957f67b7e5ee73f3f2fd379e192eefbfd5ea6f3c0939cbe874fb2fa0f4ed2dfefe7e5740f8ca43d9fafd7fedfcfebfde7c76bffe7f3f2fa0736c9f53ff8a4777e1faf3fbfafd75f8fd76b9fdfdb6bdfe7edb5efe7f3faffc1eb28ab1f8b5a8856d6a3027a9f83036a950a4694e6e7c2722af497c7a26ec0a00507072a8caad0c6e7e356873c55a568c1093a94930ed2606429264d1d5291c3634712c7830fd792db38f138a393220b98ee85732b4fb5c51be1272e21e313a251f2a3f0e834a0cd4a910605c9d7b868d544def685bb790117089effe834b51cd40c663664fe3df97eb09b3888fc12b38fe0fd1ef65886449eb5157a832f884663044f8fae85ead46622eb3e7265e45c589f7973f498049e69101ab55bc1906960c78f2ea03e4d129f24c96d9e42f424dedb5a00de2ede74e1c77d5bfb5e620c2bcf3de05dba5240efbb14b87e65e8793ab1c900a3fefd5c9346fde2c61d80c96276a40195aace604aa061bdae2ade015152cc4874244fc93d9b2f223059d60e78230cf01f661fb28986ffeab501a7a6991e2d2bd9cc2494cc5a6e1cdcc5a95827ef94d81acf4267707b4c74e99858dc917770fab6da6ce7cbcf13c637d86d2f18e65efbe088e81fce26b31090851bfbf2b9d22933d11978212d638570aa80cc983195e047fc17c0755ab8552bda897490e1f3197e754d501ede630b176bf1177eec40176b31c8b2bbb1f6c3c643482eb9c3dd17c68ec0b273a39e40c79a80b358ca211333bdd162119a231bf6b2ade3cd4906927e9d0ecdd80409fcdcb552c211c35ae882d550ea96f7d3a5289573d0806ee565f378d7affc2aad968f1743ac590cbc7d24c78abc7b3a3f511a9d51669e000d5689a5c4aef62a67c885be3f840d5fda85fc4a82118099e269c44440eb3f237ec5251889a4f0739f422d61c15871f1c5746b8c13d169c98a931057131dd3213c049630f109e800fe050410776bae6fec554a4e4ad9262099594cec5b50e48b4cbf09f92fedba93d390c2fa3021e872e54eab018da9bc2cb730733ff0691a5f726567635d85df7bf30a58fae597bf60e81b9ffa83e6d978d74b62403a79982d325fdc6db12d67a026988f1bdc2dcfcaf013b8fd384391877133d513e83132cde27ee3e1fb08b0e5239733d25c88e003b7d6236d744536db24ba87b3de94894b70199cef8e20bea01982cd21852aa89746be5a13118313c37bea0832f46309dda87da83412890084211ba0b0c0034a8a619e30e448ea0f300d8eab1489441984fb071d083db1bbd3f7a319c911d61308cc29859e4059b0571ce2fbde8c85ad371aa30b86203491d80c35ad72a69809dbfd74fed897a02a6922b1d2b368fc84188c4b30ae4d673d5cab3653fd2326a61630b836433bd83269127aa534ccc61e3c4db036c0c65731bc8e2ec230ce54753d2c23d0b1962229fdcc88909298dd1bd1eab894abc93234dd0336f3d292284dc9599ca1ae0cca7cfed3995aeb0b30ffe08e2f8c498bfa73caf9353be14a575707299f7ca3965d3180345d10608340285e88ce8152ca8dc1f627331f4f2d3decac6d338810191a2f91aabcca63a2eb457a8c4e34d12b267b853a4e146c5c651c9d8cc6f2f3b93e09dfefc06133e7dc5ceba10080682b3c08945f3eff49b7143c5c587b6219d0f2a8e09246ec01ceac147a5ee8417e24d2f350d85037be05f635c8caf476696282b1dbb3f718660999470e6486fbedd78a276890939f6c75bc679d64c815b3a4f8ce6c95ae1a94d741877b6cb6c33ee49d6a37b05a7b24f51ef86f6e285925fe6e64aecc2a5d04f06c0e49f16e94d62181a80edc72401901e144161b437c163c36d65699b1844db641d5f716d7356d9f02c90ac2b186adc8ddaf4d8544f2484c8af2254d3ee242db0deec9a6889ab6c9421c9c0e40d0a710da1d7d28083c82643b0facd4356e2322e71c1d5485d07263d31c33705a1453f54717a4154a39fe826cdfb96e124efecc678655d623b23eb53f2af6d41759efead8295cf9e5d5f666dee8ab320702edf7d44195f2288b3b652c7825d95859310ea5adb5f29845cf4ff2095525c2e38cbfdbd668082da620e872ea8fc61df2ee435769eb8a0646f069b975829d4d29b7e25bfe531ad43153c50e6bc18e0f28cdcec26c2deee247044cdaa1bbe23442ba7c3e41cbfb21409d95fda8bebf61cfdbfdfb36d7da9c3c90acfa49f70190c55727ed90f30ea127022290c6638dfb19d127ddec3b1541c228a48cd2463a3cd4fba8ea2c4279555f27f5506f0b62ba057acdf8adfa0a76d84e656d84a7a7be969fc0918816a09b087dd73747b673cc249e436d5db6b0664b66017a3b6f630dcdc5643b08c9a644d008fc4641348e769f01604781094637c64d064aa9ab0bedafd05a5d5b332588fe1c49a50bfc77753fe6fa4e039f3a891a92b5e75bf55098dfe6d707623c1984e291fb08631d3042aeb0a51f234ca62b3a405408df32ba118e0d36db6fac6c99e2684c51d553cf0a1ea71b50b3450b7d91f8da1ffcc15b74873cbeb9813942fb73c5cce62c7ce33771b3b2dd3378191c3100af1a1428a4064f20085137fc461351a6d3c96e3667a7b907f5300b7e9d876842a599f054ec3391983913f84b7a6d9b62724e1753dc036ca60700b93f7fc634c53d00dab13f550b99ed8208fdf71296844ba5059f40a58e6e0c9cf1b121a5c5238de481a4f9bbf1bb3095d343c77593797da55819be53dbcac020c433b6229a0175e171b2af3ca565c0fe364f4a9d277650045bc2997288b548ca8c763fe6c2fb49976b47cda7e558c0c622c6e9cb3708bff6bec6a143d9f3a97c6a3d6063212306415659e7716f3bc1caf40e4199430f7b0be452de4776ce94919197ae09ed069ae15f968e8fc4c1c28e1eda618cd355b2ee49d098986d4d2ff61cf077c52705c6353686a53330540608456b49dc2388abee37c138c2156a245de50bf419f41871e981118532947c06aa320fc2d569442bd48ba21f2014016105c587621a9cc5c3b9674b60d42115bc24eb79acef266b2cbc1a2ad701105b81f05e10e2af5059fea91d2e09cb6e9f95243310df2c8388536e727b0e651c663128b7f3fc0f03710acef226855ab23dd00b04e9796d6515e3f4bb149b0d34bc6375c12c0148ada451040378b3993bb23613f05e29c80c37e0b9e8127b96b0111a1dbc98abf5ecc3b0eb4e6c0b350b3900e44e910bba0df4274befffb0652ad15113a9da3b2d19f14bcb413d5d55364fcf84ded8049b1f24fc505e1a5d8da9f80d0fadd9dc1d83f0636006142308826e567cf54002ac3c2dbf7246e4ca4a49e79ccb1941a06e35b9b1367a56c419771f01c601e4cff2d7223dd8710467ee157ef534fc37ff5d3a80c97307e78fbb28d1b50a7628151a3a1cccd88bd1eb6f6eef90102e56a73fb52d022f7ce3a9b52179e4f5095e32775a5853e3b279c3af61f08fef5591b9bcef09cd39827a77053f2e7378912510e71eae81133bd94e3b51f0cfe1e08ef280afc1822269cac77dec64fd8ccf20f72bf5fe27d2a33b92debfcba032a159cc3a8f5a5da267848410173cfa0e302a07c93454987ac03f0e2a83652ddf1ae0eada09b581e482ba697f17acb5f4401cdd66348766f7ef3d220f60042d08060a98a82d98a07251ea94fe7c640c28e7c1543e7f3ed96cf4fc62c7ae81722bb3872ebb6c1503048521c14eb147d4ef2b26734f541a9da12e2a807149a0be02ea240e95e7038a9348d205d9e0d38926b469d95079fab8ceed8c2512d8740887744a878ccc739330b290bda3062db05b2121401ef98f6fc5a1086094abe818d14fe5b032243a465c6d92a3585a4a66daac1c3d3ee818d76a53febffdc771eb34730ebd8502fc998fd83ba5c59b97d30301d6edb9b62d0cea6d22dad94ca74ec66693b9fe03c9053c9cde179e62cf948aeb47bd195314f68e205ae2368ad3cf69256ea265794dd58d70e82cf8b50379199f9ab95d9b9218c303a3f698af690586db74638723a45623709746ea9da34359f0c60b5a0459703b210b8e1843164c6a85e0c8161784224d9dbaeb19e7e61a6d90a23e172069b0658e596392afa08df7b6f402238e187be92824aaf0c42603ca5919acb1a033bb01c1dbaf01ae5007eb567591cf1a7f753858ad58d734c73055956269d060944f93f95f4e64f248447909e3374664f8e55786f9219476109d2ab2b6ecb0d20684a6fe9c1d9f46c6962ef6b5ae6a3d781708aac1eab5060fe2d693ed60ca4a129660f0a0633f0a733c979c09c33ef17327b8239aee61c5aee56b3502718837e251b37c5441da82cdb3ea6b33fec111d0eab4a428a3f4ab4022e0fa3f91aeaadeaf7d84469f697faa2dd462f6c439cdf7d8abe1ad84f721128aeed8e31f2f639414ac0957a226580827e6c694161966da7945a0754df24b6682865b8ceade89a1c97465f6a2ec646b999c3edc583778c7dabd570466836d66a08e11d745b7ec55b4cd81927235fab546d1a9a2768b9aef23ab265841d9ee445b75e5f488a14c29f7beb7e096ad4e9407160cc6abcf648df5bbe984fddf40a7184da9adc8c49a5deafde159eaf364dde5440f6861c3c10b74370aa3d5dd1df4ca434aa441f9df954ce38a4b6f4c45f41b9aa68542d3ecd52ba5a19a235a69ac57cf97c31ddd8e0623f4aeaf983ab4d22a63c2194685ba2d304c19437face011880225f056f73d4df53761b61a251968ad745db3e5063ff9fd5ec11b76102ea897eb2d2578d9b3c36697d9fa3e7effc803a7eb6113cbb32a852eaf86b98d8b7b88ae2e796eafb89c6b040bd191a9291e82456e1b3e60624016fba01780f00306e05ebb9aece6012320bc0c431a7de63046fed16cf5ab7cf1d2cafef9c66a2de59e2ada32b62e60e4230e4efc496764a25f2cb1a20f58cfcbbce388c6c585583aff8a06a22354b0f4dc048577870c81e34f57778a2c8a98f6fb21dda5ac9c8f90eedcfa2711c42b6b465a207abc6a9b61755b58f2c58d8ac3944ee1110de3e6f057659bad03b6e40c2f107d6487dad3827eb2a0d25b735055bd0a2d96a204d5b5e8814a87e309aa0ed0265fa222b7682973f55f1654779a02581c7c2d67b950e144a3392cea3a7cfe15131925de6f22c1010af7d0e9f0ab0595d617d7eb53dd686dc240bf2d88dd0f71c0bef39879b70205a78867fb85a6c8e1b0af4299ae7e55af39f76427d88c7c8502186a25025e4a0a7ecd21b83a719263895686e91dc0f780f6e89943351a03ac836d284d8e3af218ce271c460911c3d9db529e5349f4cff6c8da84d249e749e4b314d5898a62c14a5445965eba4b4140f686aa8d76d25f2e0f75c08ba8f152b7c1395f5e142ac83de5804e5d9855abb8d36825b62af28bca1ac6783cda538056d08c8f9693d2a193432418e426c55c27422920073a72b7ad0234d02f88e3f413bba4b162a9f07427756144690c1a701cd8fd053aa807d666b920817b5d3b08f297d31fce7e0c0f75424916d1ad1f335398528897a911bf27337de92139db5710e7597e75515974948d0d37250394f6fb590379030fd6ebc412358e40588aa7909baf5c6280833313930068bd1875230ef970df0c812d54626b1f058bc5a2fb98fd9efc368c6107c2b7b2b198b797ceb28cdf3bea32d201cd256e25554a7814d8b7dfa43ee2c705625580ba37d79cfc82c8702b6da938f785fb88fcc3347fd7bd9a1919a8813b40fc1bde12c1c0bd215fee42be42010359682054f620de6a8b3b58876d626f4f1b64778f308cedd15b2b16db4aeb4b256820f94bf7442c6a65fca22e18d431d2b949d829260709a133ee19eaf9dd152a465335622e66881b437de5c86e24a3b037c0d938b8de9e2860554bf2e298b64048e838ed56346dd956993f303c16eaa07cae9aa6fb52742ddbff8b0aa7b8324d5db982d24785c7691119d95b179476b64995bae3a762087483c282a5eb2e42ec847a102622aaa1619b8ec898309b73f23ef031e56c7b26560962311432cd0f8a9f4d14ba91b2ea7ebef037270d7de03fc3733c77fb7f392eb4a58c48c0c08cb6e78bcaac8cb9ca1aa381fbf6bced928fba75a73ec8a1ea2bb6be302595637a4b4ddd54588ea68adbff9b3a1ded82937f52757dd5feb169259f3b083c9ad5a9de7873d9926a4d6633b7c6bfa1240418f791a0ec3b3ef7a5cc325c2e4b76f707ad30c8071f31d63f8115c3560d32ef00d13bcae9d1009f9f74293dafa6f8947cff672aac3fefcbe798f4c77da2eaec746095e8a8bffeab07da38a3bc85428cc16c1af02778d7d6570b289b6146f6862c11e92296a2ac15ed710194fed28404d6f258d8db63700b69756677980e9d01a537855af3192ce50e7f06e1ff5fabdcecf241bbdf3d40959262412a7a32523c10e21fca4e690c5c45db523c36148da3c68ba2944fd6903da706baa9758ab2770fbf6c4ed6ae3075a60140f4c2da6295517204c041e1a0c7abab4e53b78278489946ee4153e7e822b3acc76f74fcb05320d28b82b690e36c523df2c5386cca2e00ad0401b0614218dd1e097e234a6e2d04463036322096ccd83c4708372639fbaeb1519a031e0173dc649aaac36794d94ddaa3a1ebf781c605734240293e4339e92362b69c4f0b0ebecc74275f9b328943a51f514bfc46a0a3b9f69347c02724ae3b95ddb2d8e5c9e8f00985248b9744356e7da97a8c6a6654f5d1c7a39a29f461ffa9732c8d008dd3615d0db952a08e739b374a296d5d3f3e7be7b014761f4d4d7f7d831fd8a8f8a6d24a5c727997ea68dd4decf866ba17a7b7caa3669c82e25de044c1d51de1d9b039e5edaf51a9e8bb2af60049c84ae5246772f78f909f3d4a72cee3c0b504d1af4129b0ede86211179d781a022d0be6cece1514c7711671e6de70199fd909f915a7152657aa240007539a24ec62d67dee5986492203999a4393224301378f380b1de0b96cd7997bd9bc4679620c346384d425a57989639c1390428fa5a93e1e4b3218b2a5aac484089bfc666105a7869a1ffd5bb93b66371a77664c616c60e3315cec26456a0618f5e0a82527e271b0beb17f4c39b020ccd3f5763514e624059cf028d8b7f8d6a9af6761c6256d5be2badb5a3f5940db2ee9301749eb6b6e07f9add25bbef94a3d6a225eaabbd0b055ac257627187a804a15baecbd80b81c2a83478aad42133915a8be223944bab7cb4a0dc11fa084d82258b9aea1cb0684d1b2dfa01857a86762d769ae3ff067e8bc13dc3d1df1d602d1d945c08ec88a68a8a9f7bc1d9d664584e3372365066ca0f4fd9584a9479f0b9e4e92ac91d0a97a616656f270016a8d38574945fc5bbadf29d935b35bc7af77380b72eb93383db4f4896b92dced270f03c3b6a1af892ddedf937371a599a08cba8720971292c15186195d526917d0926b56e6afca0314517f868f007f2c9ad91dd4584585e25e7fcd38221b63822e3f8e372a277f6569ff671a20dd937b7f0729d6f04c8dbdb7d5b2049cc3a632c20faac81a7c0a25525de5086afce4adf39f37307312fffb6c1e1a356dc4b814e3ea20a63865fe18d0e9b980f4b1f4986551a456ef07d281c416a18299695bb6a41b949272c5a3125b2cebc3700d0fac5d0d0471dba76207e9e3e1429e70e249b09c2815a458300267d7c75d938847d9bf7953d6b63e1e11781a130b0e469f374ea97225452496ee8f54ad08083484ad8053408a061cc54ca67c63055bb339c28097d1c635ad35c327cf2c4ab1e00fca1fe2ad9f996ba3c864c13c08026701a4fe42a9357e3bce48d7a61cfdcad90f3742c84db18d12427482542548b11f7620c0f5f18445d0a3592a7b2fda13f3ccd1ac23e2f623661b17a25adfd32263ec5beb9b6e793b210b00ea468f9db1a7317ce48c9455f09bd954552f78cc4dba4b0278139b8e067f1f9cbdb773fbc80a064b15cb00d139ec28dd753e8003c04bab90acbe10588fced5d83d5b1b6a5718d34af3b4c76d94a6bbca78dd354cb88632f6765cd0096f104bd7ca1b31ca7227daf6da356284bbe8f2c37bca902d2e98e68b9980800a63fbac06dc1f3f289dd9fff513f4132af68bc47ca6eced0b544f768868947fa91b2ff46e0ae1f834fc1a0325ae88f2275dac06488e4406f31943c7f24b313d746ead6ccfcf701c0769a329251a99c849188b35384b7f7c97fe9ad99182bbbf8627e718ccf6fca2370868ecb04465d34367518f6c4a490321da677ef7d7587189fdc6260bb06439a4c534504c4ac61af4719d10f241da9665a7a9d09cafef4cd39c92ca0f8c966a396b6c4448d9a9967acb61d17054e78963b0d4adc95adca2e04de3b6db2e51b383455449d6796135f9da3daedacb0f0812a749c97f7e7c7eeb2e14d860950d84bec462f7dca469bd36fcc5eb2febe294311852bd57a55d1a6f6967439c00b35a629eb86cb4f09aa826d8e9531107f6bf1da58fa8c49eaafb548214d672c544775ece8bbad5c4a59e8ad3f2de39019f181dfccfb5502fbc8f5b9d92f68b855da598dc61346456a897e7856156995a559431fce1c10a0a106f4b84b8d636f181c6e4f6e87973892f7a49a855bf2c96bb92bac831d86655329b86dc1db2595da981e64e59ecadb8e73a0da066453800ed1a1f28b6682f670e7efe1d90cbaebf13b3f758695f940fb95743bb2a9d8645c9531cbb7840f0a3842bbd7ebecf474c902e803b989ec9fedee8711624477d502c9de4c2e651485cfdd01f75df7f8d302cdde937eeea3d6afe1b263a57399320f45bd837498c25c8e277072be4ee23986604c28720afff0e1861d16854a7158038cbc4a5906b79ec308acb950e2201ea9263c833076dc33a8350318dec5d4196c2ac1ad40ea01417e39b509ca04829615d97154b24e43b4721952d7846221205601f3127e44bec1e89c292f4062bb36f02aa2fde0b173270799968c99dc3d991b73a23627782a9716f5d4d59177e23387f85f2a5634d180f8c2d0a968b711df2fd7bd4f96669f9ea13c385ad7c985758a5e5abc8a2ea355fde436da083a190ce95ac1c56c6102617aa339e1058d3fef4a3e29af662556b564af0a8b4ed855cd1e2d7bbf2f7531fefb2c46f42a5309cddeeee10ded1aab3820b276406007e48b4bb13217aa484c12ffc123ad6abc090866998ff760868f8db0229904aa5616ab22c8491787b41a6022d7446169e7d0bd97bff3ee4bc9c83a5e59da6fd2451382564d1ebcd501e1ce2737ea34572be3f30fcaa8fc1574725e5d1ba561c0abd82be21d38744c89f36cfa8a7c033f23fc15300f717074f7da5ad09f5e0023ddddea25bac25af0716db5d6c97bc3b0b16ccb3c841a9f8190c1c9dc36bb45e1f2e22f8e09779bd9570f37d4e1336287f9de2f6cf64994bfdf605d3026e450db153f45d583e17eb93d3d6ecb546494bf04a48513f1d1c5715d7fcfdda6e5ce8b652603c1ff1d6928f8ca69fcedc2dbca1e2c524a90cd33866805fa6499b70930e81d004c33d599fa7c6553ff135b73bfbfc20c84c5e9e527f1f18bfc9565efb6ff34e86ad96decafdea0f86c830c0ea663a5e51f671a27c2aa1082531f8c9501a4f2d769f480f9d5b4df667f54026fef7fa4c3c0784c031d15aaa63eb9d4cd3c212c6a12e1ebadceef8dd92a4d856c34ee30fce68ba7ef0f2a15e94873635c3604d5b085b3f98c86bab8890f4f365f326e066008127c7d04f4ff3201541dbf08be5fa2b2b67af4297eec8e72814470568021152253f7504d3d6ca639b6db18430801238e5bf160200a9e655b16a7de71dfb20ce8f13b9bcaad183ed3c59029992750527e78cc71e5e50d437240a75e1b2b973997a65766dcd29301a7723a1ee55dd119d723470c551f9e064dc7413fde0ee40bcdfdcf433dceabe7b7051fe7bbc669ca0e24e03c02b51742ca3ef484625a72ffcb34b94e15e233eb0fd95c9210350d2a3565a7ab461b9e702c7264167a57c38f03213d1f76a9d1af118367be86c85ba50bd2815fc2421c26cb41f2b8c2ef5ea3075c9a0b147c492d2e150139f460d7e3bb43aebf08341c8ecacfbbafed16c5e6fa561a8ef732f0cd3ea01da0f537a1e8dca5d82abe376d64d831f01108fe9324636cf0d2412b1007d2210098da7520a47e8115b5adeb671f945e69ec2b879e87e662d8ad1826cd0142dafa56b86cbb6f2f5506050b26007ba6e130703c7e6e0f49139ab91f3fad2439ffc43337975c5f9da1d4832a1543dceedbd81cc08d2a2138ef940e25bc7449214cbb1bdcc6b3a5d47471f2030943c4566ae8346f6126f01a8ba76514d13c34431d0967cd04be447be1e6873f39aaae751a084e8614b002593bc0dc85926e4c1b4fbe33b5c97ff37aabd3b2a0a5eb5858d142f7fc669059b0199fea1ffffceb8d2a220642d343c3437ee31eb8a1a7248fda7bb384dcb20292b993ddec96fc505677d431bac95b5324337222d5f6d50ce1e028de69831b28a6a883fe471a66b993db1f84f1a71c9b9bf09f519c40564047dfc62f611b606fff97cc06616d3cd31de9f87ba012d5282ed3589e724fd0edae098ce466d02f99483a91c8bd03783f7dcedda6d7bff82a42577efda5b84d48345e1f31c1b8e83798551a8d2c1a6e838be13578f64aae9ebfbc37de04c7bc1e09003f7ba612e76eab59975c42fd4aec4f5d02df2f627261e1fe9a655bc34f8e9652c3fe30c755138ff948fd1df01bf42b841272e2f8bf278ab2c603bb20cb2728af4861d703c84ad7e4413417cad212b72eb7602982edf2a64c7148326699e680c08a3ce35beb0ea0773ff301ed65a4cf519bd63798e7704c5d7c5bdffd09149cecf8dc9b6b4aa33a71d52452de42ab50e7e2c35d9a887328a685b702b19794f4810654fa2a58c712979da7aeddb4b64cf3865c1f18a19274dc058ce1a44e7c2687b96a2fc7a7625a7f326f990126aea1015e2241537e12094de971255e23a82c7d45c337e44985a58888e33b9697b16ed48032b73a54c504919cc99083f7ba8dd93e8390d4f46910b746c78b258c3e8a2dad175a2b48185e00e072527e251f4cf4493b7430147a2226cbfc81f4f58b5da84513ebc5433e72752361ca752af19356d19ea4877240854866683862795b0d207a66e341e148ba1fb46040e5029a89dd3278d5af3154308036ce73dcce2875467e189c7aef210ccd383c5f1fa7bcb00c530ab8f9f415147c386c392c6f932a09508077549835b275b9b67a1ce178ed04f52332730e206a202b22b912088985b67c5c37b81c778beed8fe709cf3d3c2131add6c7b65758a63f6e1fff88345bb5f9cff43086d82e78e683e08aaee8935f24f212f9cef2991e2ae88142263d2a84144a1916729c061918324cfe1af791a2be8f214bfba433a46dbc00f29e2b1248e4f4985209092a526194379a00f27d564ae4b48ca212be286d02f14e9a9215e71c9fd168ca25b9323e7e3d2cc8634601ba30e8654d497013904b02b424722afdc8296a448646a3f4ba2f51669a45542cbf5791c92f92ce272685c8276d20a65c7e4356dd398e7e59ce2e0be4265ff8d70af984680c24da7d2e8d3835a05db34eb462523457286e9a00d07aec91124a6663ac43442842eb9dc0deec67b6848b9f8a142093241a591e8745bd2bedffce16507839da2466b049fe249db96ea71a6f295a9d2b8f18648a4f0c83049ee97a752f440f9e70b423341864a5bf685b4db8a8146467dc2e8c14b5af5d31b943e11829929676dd63de79f6e65296c0273df73d1bee11807f6e24cc1469a863b9d6cccc3a7b379b28ae00d810abbef7ce3963be5fb73ad983d074fb6671cd5eae2ba150ae4cf9f4f07867a942ca720e8ed38e7aecaca8012c307b4354f589091605f6410951581d6191f8c10831f22cc879b7045a32070404398b05aceaed504bd04185ce140a2cc4b6d817eb118cf68c6832c35c3d9a2d13e75dd5c38ee1c8e087e849b98d0b70d90443ccf7229798ebbead0011dbdc22645e074be5f10a909d1336a20ed998ce7c311d7ae3b6cd1039f5623b6eeb3199b086e2c2f988e136291c1a1cb2e8b2c4c6e9dbe1ddb04b5e52b12840eadeba5b5415612538a01415d562f51b83c193cc09422d363702dd9732b3538a1438c39d85c4b558eeb44bcd06535962870976ed7ecd0155cae4af777fa2e8eac3289a388dc14ea6d901211aa37b01187f6cae4195aa39020109c83d8fdfd76529774688746b4d0789b16d2ffa6e3f372c397113ee471e758734577985f99966da0946f007d2b9aa93f88ae6be158459cf2fcde0133cf17313935b532eeee3d79a711398b40b616c3a9a40f741e1107716a032243bcdcfeedd49f6b277ee715f739c218d7127e1dfe88940a113395804b3f5c7ebc66bce9b949adb391c644d00e0de3edff29b81fdd044a6ec12771f2bd9f18612c0f1f7448ebf58319abb42b5849114d0764eae4edd6206bb3fbe96c790258e4c290eb4b21a6c104d25716fc2c92a8f50e06e07254aed18654b05f6f7a9e40cae9e8b2f087f2c3e646e2335559fc304b776997357034c57d3fd47f4516e063ad7c391b0bdb22326644cadefe2d32bfd20e4ac6e082743a73ab3475715e3316de1e8f40800e8f4c37d114eabf7d7e42c78ab5c3996817024100a624a0bd8417dd046a9ecf89b0ae45e236582b96fb81981a3eeabf40c947e6beb333ac86e40a65edb4f827f5153174035f2a0393af611cce9bf62d1353e1e6f5b00352fd1401c781b9ae2696888c55fd95d29717c5058484e9943889f019f8cb77e89d182d8bc227837113930870817035f69e995e56a32918287b85a1387292fa7ee451e4bf82647d4cd631bc50e17d6763f8d6339f0434228dae19c8f01445c7487a4ae9c3c64b861997f3cf8a274c43d780b1ca832be48d545a6e7c0ccec9ebd77319d3a8f202fa33e2cb74dc4ae1df8070f24f326881a13457dea5946068496e9139418affb1153dade7706c207051a92a18eab8554ad6cbcc6412711f700859ad56b332773f08a36d54b0046a22fcfa79c0d683288018a2e6dc6988b577568e2f3504e41eaef795bd6a61b2ad0b68d08572d9d8abdf2cb7abef58f4d4cd5439905a8696a44019a8fc1a704b6bca0256f4f14d0c6bf74c2cd521c867702aa5a453dd0b7a50a7ce3fad59ab34fe65c86f8e8d1da909e4a0f47ee534857e447e3316ad78a510781f4ef86c7901df9341dbcb2a83e8264e456dbd4b8d5e1bfce31122a1499e813df9e50980b9596b99215dcc5dadac39c50679f98b4fde048161d1fe4b720ce9cdd03f13c710af19a5a9e0404f3e8186389487fd57f6b941981a37907917f89e6aae6955e439b810d17f11edecfa49d2e30ad23bf071b3b05b2b8519fb20dca4e7ad1a0fb3114a14e9b19bda31584f563f2cd4be9c5dfca6943a040908fddcba8320f174b0db4794306b8d9960225c85b7bb0373cafcb01af62b5fe83737e242726ac7dfdc1cec67fa410607a92ab29438823852eb339760b14e9e041ced71d2c668c90d080271a0ae544033f6baa20ce0df3e4feb3b9a4346589f098cc095c229d381d4e7e3497753f75d201d8c92877eaaf5815629d8640139b427b9932acd8b7ece7711a91f113992f314c65c0c59976abd5eb61b318e44063290728d6859aa0cd59b4a50e9d072dd47c9cb1e9a3b4f320b4d4f0f542933304578540468450851a84e81d59a77270fdae1cf268d1419c1f33001db2805e3bd20b68e0223488e17e77c2bd06d91f69edba284704040fefbe617c81624d10d5587e392dd03ae993a8052cdae67a65ce72e681b48d34f90ab039e24a95fe1676e89c2fe4aee9af0700ceca4425ed6784f69dccf914b5f70ba4221103f7e85ec9ed986c5874403939e61bce1a28bbfb9ae532283e9d9273722e645dcc951aaf69ce288dbcd4dde856459e0349188a50a088cf81babbc23e2b5019cbe5d4dc9579e37edece88532ee007a8a049b4a2b448d3001821ec3b21f840ab8f5cf07acdec02c18b6288deb65e0d2ea90a3a876430249e089075ad6c38b1a749a2acca92a5fb51e74c83e3dadd3ec0af27a977e8ee0eea13accf4ac43161dfc8dd6c40c40045b280029da4a1617ef213411a85d8352b2ec6363f3ad62c2347c50ebe1ca2b28f38a1a33e668886586d4117ebd9854b3c2d359a37162602cc8482a55582b63d7f3192051cc5a7055f407e14c021b2d904882e4650927be8f5fa75bcbcbdffd51695ea2529ad7984bf13c83b0a2cb5e48bb73fd7f216a6448cf93ee617148a83eb0329fc93ecddc68f116dbc155fab2e6dadd60891882d9ed5b2bbfb08b8d1adb7892f15f5df96d530d7302709707601153c7290091585efb88daac46c1c197accc3052d0d4302f80a21fb9df41549ed4167969976118abb5cdcf92c31f98bf1e861e450cd95ed6a474950eb36703184e0d11708d674a1639f01abdc47ed0c18c8c1ee6cf560b4d3f7881711faa4c738e52f84a88e0ca75be27a472c05a9528991520b2be8acc20ea11d059439094aa8429812279ac85184206201f1e6cc8c13988ae32eb5fb00dc18b2474be4c400dc9ac08fd825f360972048f20d1005c5b271bfbb41f1a831935c2b8824e3afbd30307c41717d7cbdf152f55cff91de4a2c0ecc384acef319d233251b1d05062cbee5669162dff6029da5a5bfa4825d09014660d76f5cbd93ae4dc434b4b510d1cd3f5eea10afd44e7e6d6b755c2adbae5fd4f0746e01663cac4a5bec1aabda425c92b44342d2f7760e70b29ae89d907a08e56cc3f1a67c2a74d997aed49ea1655cb51cd419bf179a051a36cddcd93b2f4f9f9cc930a21ade77e5c60c87595ab0c2a0414ea51b54e2d7db355aa96dfdcf40d7b5ea51f84f3c2fd49845e43b5e3652620441c51551f41c4b398a6bebe1a60e0f15d960e82c57a8737c23e888dd9bfc6e3df4d2bec9d1d7c63f63b184a75c74090a8a96170f858072e83fababb76a6761f0a7ac074e00ed229cd502ae6284651056031b25516da322d1ecd10ebaa91dc32509f2e5a51b1a9af31d95aec468f5565df2fbf2b1aeff73fec0551031df9f7d0c960000ac2ff8be1a98b0744fc6a1d7003291503e4bb7c5b779d1178cfc6c626f68c05418aabb5ec0594a11aa2702af25708c480709c86d7cd49d936166c13f44daf4ed9649340fea408ef67360b0f5aa0dc47252cbaf7580f14a2e200870590c199a1dbf4853adaab2baf6fe868f509908b1e1762a51d0baf2d557b7c9bceb2208dd38bbb79e7f37d79fb80fd31bc28acc41747643eb1019b6a86db711d68d3c8910c88d61a5795589ffb5ede210796a91c7e0f80809e2de2918a2edeeb92676c97eeca00c8b92745b05505cb6ed00a48ca3b8e956759820a0652f995763f711d645e1e1bd2bf1a0cb9b74c7d7dadcc1b52dccfe5f4f9827f8a6fd6f20d560c5315bfefe9b8e85a4e55607bf1a3a1a2e030d64a0676200e83167469aa41cc4fb9761d5d193d917d42a1d8b887d70ec223797ab5ebf075b41b7f2e064d60537aa912ca9ea08f7155f0215a39a1f5c42abc98e1a9307ca0267cfb3e7121885ad3a116bae41f265ce56114ad48c37c50c5c3db9cfe16168badafb5066353a7de3139ca71e29a853a52e844c9adb101cf5ebf3b3bdaff228bc295b7c3e3c53331177ee05e9a227841c53c3c0c8dcbcded8ee4e49a49f57ba06c5a40ee8db07b02914b2326833344fcf788afed50cbc1a067f1e01c1828f7e84dce2c9391dcd21d40e1d217d4c2f63bb22bb3a84127ed111a0a0ba69de3aa7e1d991229fbe54a563e7c11ca6409d1b66a28ccb1c2df9aa442cb7b0586eee4f988022d1c707899c803708d2e887091994783c3a83c44f1c753e2c572ed5c67634ee0fba08a89e2dd04bb9a90e1b91320d629db74deaae8606748c972e0801913dd48e07f0f1b394f28f85761a4e5b019405b60658d311eced2c3e88134d05149c080210b60b57b072d171a4504231845d5c0e1b8285082c380f3fad55d90a356c05fa810f32704483aa2d243534cd60db96d874f285f2e22c3bb97519a351e4554dafa4794bb10ecf26416a136b56d5708de555b8a986077d2cb5bbbbbcdc1b8c5722480dac25942f1176469992f5fde41b9b1044e956912c750a94c7c38121c56e0be7ac2862834ea0228166f740cc475f6feb829aabe2c5d60c0d1c25f44ceb062d66198696976419d6ef25d87e57e779b0c1e4aa502a80ce08d8e7674e24133dfc0e32ecc3f366c138ac248b0d1d5776be9dc79df14b4bb83bd05630bfb628466e083aa07277f414a0388ef69950b65f805815ce870bfc8de5a06463957aff703f0c6e2c5615072832c8d4a5b609bfdfc852fe814b1af370377220092063501507e892d9a7dd6fcbb03a7e23b662fdc4408b5c2659a43bea1d033612a8d6a141cf812d5a80118a253c1da6b72c0408c68f160213bc350aa8c523f810249760790a2e9de878101826ae7e5595ebd60a7442b2387fc9a3fafd4b177f6c8e471c5be61d666c37038255297890dd60786bd24f2f3e786ba6390a677ca547d041252c6aa11df9e75f375af9167da046afe10b44982b4fb642e6a5ccd99a25c1541677800458901c9c2d621d4ffd1fd6bc8bf6044840f302c7ced927f21756eb350a34b90a00d2cbd1138df9a0adac2e8ccbca801df91b6685ccf731fc3320ef7b77aa092655adf3bdebca4a83f610cd78c6079aacfbc47879b206e9bbd1a76078c8e38d24386dcf77143f321d807e537a712438f852976669294d694349b4a81d83b110d6e476b73eab42bfccea124e8332da642abc5acce856cceeb70265a657e81091efa1a82e87f3edba8155c769e9f58f370f07c32bd1d0642ce5c04c3175ec168a5a078a733ad383d648e498d1e537a3446307571b0e823ba6685f5cfe6403bd7eb72a8f552a1c1954e7e3b539d48dc70a7634a2c7f6d6a9dde4786e954b667cb4b3b1b54e612c9f814ec8f92f22003f04578e4cf1eed76b95f7963359209665714275307fbdd8ea9facec4879c94409d6c3fc43eccadaa64ed709c1e97c86eb4881ab50ea1d407ceede52b100391634e8b470e79af22aa373f934fe8ada880cf262599619cb42ca9ffefe2c4ed0c5a253acead6ff67bbee144a2e73bac948dc44dcc717db43a59c8c0e353a8fe030fd95d8f4a8168743ac1c5fef00173956b0d740245e8fffd3bf54e441bf077ace12e58015d0215f65bdf8a7ad52789bf7340e8d4afb9a77967a98879f5eaba5c7341e5efa16d398402d793d6eac10c7ba23d753dde9205c50ea5d4054c8de15d0cfa6116c62472b2f7043fd25bf4156e57b9ec83461d9ec626dc3932743164ee5555a036e611a2b299ed3748c664e468ed79389a90547902e3fa74c122b6594494c8afbd33df14833e5de8d6583590a59c1dbf1c3de4b94e527a3a51ca3d09e36a245f381b267445700470db34daeff6731380d40febacb127197ef24003207002363fa5f2f01d2f3b1eb486bc457845cba9158bcd6458f2957392e13f026b9856746f6de79838281c5a517eb0dea0d1a3d5a403e244b2ae1379c3b105be69d266302557c8253c2974bbfe5460d41ca339a9d3f18f6cbf191ffd22f7b1c75559d5fee7f270a7cc5b9c4f6a2f5f9083924bf7ad168b6bd32bd4c14aaea1e1ee7547d957728890ca3797f8a5f7e5a2ef0cbdc551f6645cb464fd1937b79c3d9fa643df8e5f03f600cf4a144a4c5fe1f4ed7524916f1fa8244b7bf4ad677d4839ce000d77188c2fbf414d055e725b431560d911daa2f4c074e433bc2acc4a9c7ae7517944e0e7bc6842fcabe7ac08549d0517ab4c4a1063010dba5cb2724636808c629eaccd1d1f5a5b0840254e426709d3e028d44b9091c8c638e55e9d818f0f81bacd76baf6e0abd6cb07db6ee048d3c692b5e73a89a770d850cbf344228fafbdb98f8b04cece277db206b29e99782c34a8acc99a1e20c8e7f266f6be81866796885762e77c5b1f6b95338ed095b82073c76e40b197e7ac02f954d370cebff4143083424d4caecb6ad40887986b133f3cfb2cc0a313532c44f05948f37665388f08f4beea5ec0b8434a2bec553b5fe3fa4050d07770b5af2383afd97d0f9a32d1935f19f5cf46e2acbaa896ede21a4b71b4b08f2c5c7a321790e43fa9f682beea0fb6342c0e8eda9754fc65124fbda8c9a8456396e941993cd4f839434a12086dad93c5235889d0d1234ba6d05017cb3307163a12b185a2859abfce18779a8bb940834e7adc4f56aa4cc0d514b4c31aed5c272bd68789bf62ea315640c578b7db6dc795e986ccad672cb26df4ca7200634fe6b6a29fdfb87ed512e2e24ed41b60de416c0e22325a6e554cc2fc8919bac0b04c008557212b082ca4e14fb4d5a4d7a8f6a8074d6b1f1071d553872ae6b459edb30e41109be186f9b26fed144bdb3b949f51599e1c76aa706a273bd5424316b41c777da768a40ab924692431dc398aa16317110cd332bf1b7a7b0160062b9bf390d0a83cda5e081547c3687ea90fcb1122f1ec5cd40682ce8a0b9a67bcfe41299d66cf0298928be2e09fe6becd4c28ef688326dd982264a75cc08cfb1e5ffd7a51ddc47b6390e6827c003b5ed12e43e683580b1f28ae86b55641c706aa77bf11a59865d6edb87d33fe226e03230cfc78188294203783ddbeb9db165e82042f4790b56844e674b046d557331514030175799c9b3412075052bb3123c964c2dfcd884f7bf0b83512f0a65ed7eadab8dda951475bc4ec9f754534dfe1cf7591563daa6bb11cde86d13a8e39c4407cce5bf6ca75eccc814cd6476a619b29d5c838cab2bd2ebdce53ae912e9582f029899be4ca855f486f9fcf52521b13072adc2a38a39aee14162c9830189197027b8c0ab49baff2ae0513e81deeb1859c89cd7b545f7a234e6168f467d8f748bcc40ec465a15773dcc3502540d225a2e11afa3c8bf3e11748e910c7451acaa1df33270cf0557cb67241099b210bd8e929c2fb98f58949409bd8e6a4e5b70de5f59751c72c0930dd808d9a4e141d12dfe4c153d063d9add62a69c0542d70cf856ac2804a66abf69ad0546a047d9f5d119876e0b56f6e781e64b523da7eb54d2f64c03edb82982b3edd4119bab2ec6612e8046b66d6d0890a096589a5c3ac7cc74eaa2d6fa45d08db5ed63bf1f5e1e71209d9194a1596ca688db67253bc6d1d8a1d100e1d35d0ea402734c554a8e0932fc8829b79689b51897a46924e66f0281951fc959a0bbde0a18910a2c11b220d57233bc2b9e2c88abe724d7a4003848103ff96f32900e72962f88d67b88730fcc8b891d354b136bb1383030b84a81603b5dd08253e5a0ca3f4cef30f94ff3ba185b6a87a4b6c7eb716dc74b4053d1f0d76624aee714b3ed7f62b6367970f91313751ba2dc4de281f867e0694b23da1b0dfda8758f94b9932765e6914c15048ac1c6a1c348d79cb567b3696138bfb52c482ca27aa80b984cc134e48cd8755e117cccf7636637c7b703a9e4a3d1fddffa296697abd8f3a64ade1aabef501d50dde7b85471aca728ca91fcb8ac47c42fb0975d82792adfabb49e2c7adf4b5209dc15d64ea3d7f89ec3b188803ef6b3bfa1aeae97f3e52b440bb4d7f4225384b32becc05b3959cec208b820568cf3e0432387ccf6ca7bba93e0aad2abf10e827a9742d67cb5a200a564d03f7f08519761a28315705a37bb908e02466daa58e07501928d1b6d17b3a088394044746f888a6211957f5d24ff17c6cf28c33657cb57ee2cfa482389854e02bbc5600f9c08cee70497873f7b230fef1297544edac2baf5136bb6c6b14f9739098b4b6e9c5d1987006e254b7d8b438cc47d8c2381f6172503e77620f6c9d3ccc0318c20232d37702f796b1c186bae211932e48f363af9a418d9bd784c359f406cbf224ff78d2eab206171c222c0fe8293b805c0741024369bb2309b9abfbd02524f90bab884fbdcb4fad06cc01e82d0587a4bd8d71fc43851057094c68fa0ec101e1c384fe10346e0247e1d3c5f23d5bd7a1d281bc3fc21af819f2a8d9fbf1d01e77c83154ccdcd46eafb2762396c632dad173a3c5b1ccbe7fbf824f8c67e879acbe2a73fa40b74c061a03b3eb8958195aa6c4907baa96ddd50954079aad2b6302c0c4a49572403cf6974b6da63973ae4a0de3ef138e15cd7acee0a2eb5a764defeb47c9c2f518c6a5aca754c9c61119caf9897a84474d0f20f7e0f447ed22f0a102b8f54bbb97489a6ffe6d5f937b1a0290def42359337cb12c5437f6a9d62a7493cb6c86dc6a56b6bfd88fcb92af3df8a68acf8b39a156275065a6d41941e45f0b95c4c31d2317b84a4818ba007b72e72885d4344caafdb376042e902f075cc0a831c3df9696120c41322113e2d41f2c7869b082295585910ecd8e22647dac386d6dfb9a2086c06c838fefeff1650df395c9898a257bf293e57fd464c696aa36c91fe3cf94f74c24eae1741f2795540ff8951af22c540491284ad9962df2af344c31c1900bd76bf54c5c344772238f18f5f950bb46169803c668e578b2f3ec9a8126b1d0e6fd89ad5393f9ce026d44a169362b1a4c6e3976cd0c29308cb7ed26166c0263dbf0a3b66aade3c0a9d05e27be6ab5e7ba3fd7d145e1575e5b4cafefd123ef8e4df8a84d1ee8e82cb26d2ce7d4b245fd9969e2ee4d017f90bd48433ebf536914403ee313b4723692a06165ea4c6756d059d7607a168585526a91620c8619c91883a793819eb89089f5b3163345a44c5a6111b57f7249f449bcc355f843e42c25d49677e14112c3300e994fa672ece66c7b8b5ba776bd27b2e887c6abcb98b167b9d1bb57d21109e613848e2997cdef6c8b426bf1a469ab51fa124c1b3b444aee2977401aaa3831a92943a4371e1af63574a47089ae3f051059fa4149d82ec01af1c6eb0420af2de9b287e714a7d2c6dab73a260c8b338c4ea57778ccbde8ff63d3304628aba80c7049f6c22abbd903945731526892299ec983c5bf9d05e1aa3e29ab452270c26d8796fc2a1eee39c435534d48cc12606154c5d3faf6c1245fb1f44ce8f82ebc77eca75fdcb45d3f8c628d27ef34aa01bbea9e6bd92606e6526d2a5bc0f998bd7e41485364b7ebd0ccc21b94875346eb08cf0612710210778031054ac43419d358bb3f6a219630e48c34c39fe61b3f338d80cd6e71e0a68ecb9699780105696863d2f7f9757e859bab2419817113aa5a7b6eb358be99be5b7ef1d9e02742f00888e9a278abdc89a8cc9a01a0821892c20566f7389781ba77b405c0b5ad8c13c0a1bbb100db9828a1f71bee0cf91094cdbbc06b305467772d4e867e3400f47682600344d80fda4689cf1918c6d3928b40e6be249d06319954830d0b18c28bbbe4322d18805572bb7ba3b8288ec13b89dfc635638d2acf6f09e824d11541c69a2077bb75951aa18ca7b9f7afa5c06a15141d136ec121f0e897c36ff015a1a9986c15b4d5d4d877adf7c56edc5cee0687f4d794b788ec98a1ee88df9b91a642a58a16284bc0d1db2c820aae5e553905870da05f01259177ca4456bf10a687beb77fc907bbfcf02b26f36f5806f97652018f30b6d8faf273ce1ebf3e8bb28ac7002acba6780ad9c4eac13f4126bd31895e57dba5e195e75659607006cae202993b72f8a0de753ee9ded022c2ceb9eec8c684e655186bc2160464d45a9b28bc6000d92549ee3043e4e74d80e627e114fdaf402de97e8256f05c90f7683ec6b542c519e9e50728aa39fe83593e8eb0dd782a0c0c0f0c0e7c8e9ad02d3b20c1b0976d656cd52d25d297060946ff3d8a9ea52c2e455067c62329ea8b83b7390c00900d4c6a1e1978b112cee65b49595ed4448771c40b80add4ccd05a55a578b64eea3d5d01188ed080b1c0f456ac6d0362e6ec2d20d58fa596883e9f7cb922a25f76a8b0fc63220895c2f11a06072441b1f0b2e700cfb6262f8c4c8b5822fff50db10586e1c5c12c2bfcfe4529658b0841f7121d4e48230fbcd08965777c00851085493daa01260dd3cbdfb4e37feb3ae047c3e7d7f611f876c08fd04fd84603cee07b90d55ec5acbd3d2bd7107e36a528e477713b45bb02eacc2b2adf0a3cffb760989d166c6c5dc96c338a15e8974a376a37643bb59d38d810c2d61e181d3c2513c958c58261a783e7ce67b7b74a1ff4ab2513f921860879eda01e785ca08841a1048248a4913de9e41f798ae97c3543a71c29229c87e9cdbd6d9f47ac30716a2b65be8f727dd28dd906e926e9072b320a2499aef0d46730b26a0379c976066f3c88e3bf3b0467dae8ee8bce4710fcd87db95cab8b1891b20541b16c4a6a82c6855b7771f4f3676ff21c060c61b67abfac975e7250aa4ccf965291e6e2846301a0eef7b1a477f599f0eea79d422cb57b20ebddae6085ccb07ca06c7100f5efe77f6ffb22091efc726e6a91bff5b8d3f1d2437aaffce6ab625d6985dcf6a8997a58d694cd5e9feefcb9f746aca8929598055453f2fe52d22adb8d396dc6cf6c23385b9064c12d98d4d436002e16dcc4ed37d3af9c4643422b15b7943352042fceb75a324e13429264b26be76c43a38257efbde2e9fee310d07bf58ffe94f1ff165415917004bcb19bb15aeaabc81ce749512c224bd112188337187fc4b0f02ed90ee3543f946d1d752024129de6dcf6ce770503148a137a2d8a2f285a1be88b1e95cc765d0384e61685e3e6f72dbbfd9b53ae29945e5ceaa6dd7d63f8e4131118b02f486394073ac188b0203d401bf6b2e71852b3b84b76575f8e9fb3870aae6a5005f704cf425bc3546deeabd639332b283f5b2eefaaf5e3bf31cd92b28d03de087d4390626a6ba36bd23b122e0bfab6dd616ffece53a0b42a498a06bb38cb418aa96cfa0310d019a989606c313f5fae043f2b84959ed7733b18b1fadebc406b011b48f68aa91e261ea6b4a8b6f05aa6e426d1c930da632ebd7ba9917e0ca419100529fdacbf62790b87fd3484c2959fd2fe73eff66a52f7536bbccffbd8c4ff7856d2ee3335b09633f53103b1d85f572f14183a2b74d15d23c283876cd8699dbc3898e23f2ef097405aeb1ab76d408a5967be25fe824b4da3ca87762f76fce93f40f3211d08fc5df84f76f7b29ee759851e7771706bb3b69749682c3120a1bf5fd07f10532ee1066196202772cd91424df135d2b11d4aaa76994da272632a63dc7c36395f70498aa5e026c6e1046924a1f713d4953473754bce023183e1457b02cfc4836dba2a1cdd3106645fe5d137be86ee6c487702e5842e020854a42ec8e933cb1e5216f37ced81d4c8364b6609a75137dcc7f488dddd3a5924a65588aa2305becd201bd4997d6d6beb6566997878701fbda4d3ae7dd4cbacd3540170ba1a8f830e6a0d21884b04afeccb0eebddda385083e7dfdced2a27099e41c6e629880fd4855c147b96ce7b284e2fd061bb38f446bb100052f4c0fed281e67bd93d891880fbf3311d2c00ee122b25858a8f2cbb0a00e547b0a66e203ca911c63151493a7b72977a487bcfc7ae920fdc7f307be5ed0bc95bae14f37b659f6241ab2f537f1055e91a7bbe196cd5b9bcc80c1e90bff303038bf64b0905484d30291b61050b79d94046f8e3e9557d2d108d94427e89db76a5c81ce88230eac972e58637db70a7a60c296a2e4df988c718b11bbf0127cd59b5d6b1023c8059d45e70956422ecf2925362cde2348445c843e7789dd54d4e2fe8b3843d505939184e9b4f3e8de392714ddb66de038dae367a8d088c4ebffab394bf822a9a6f674a897a7e96e0105353f3e11473e19cd733b19c99c38e208d8c9ce50bf224851e65a89719bc7d6bd163971a1184290534743f645c9ca1826559c042a98020affdb2cc90c937aa77bce68431f43979bb49ce35bbf12e5af099087b5a4f3695c833b40684bb36dfca3e0fe709b59ee17ee87e146b5f913417ccf20d71ddf70e3a4d94d7edb1c49e6c989eee7551b652eb7c0c6f3b23f45db576f2cd39f23eddb775d9bc3a33dadb54e30c4411bffab5a674ff09abb3eadc2d9da3b4d2ec3bac5b46f72cbc25976ed6a24e86d9624837b5c612a56a15c0aecf105c08da3d8b4cba303c7ad8b86952c2004621d80550d09d3c32fe0a4b5944eaa53d8223a3b4c70db911a9be5f62ac5c2d4fe382845255731c002a369d5c7260b8ccce314c04c48a803e5fc06ba5d0620ebf38009249cbcc9269812ed81f18406f58156dbb246ba6af1276f15b5df3691869c03806c41edef31c10e8c88d8d15057d01ca2b0c2c080779ba3650958dc230d3d06c2639278f73517f2fd80eea15bfbbf278ecc9aeb856bd733486f48592df8171a4ecc2def15e2750b4f67a06c23741a8f0e837f1d3ace59f981e76e380989dca8bc00ec8b25c566b14902e8ff6c491646ba9b39ddb73da544f51f656d51f82553c0439e161db030f5463369512e10c96f8d9aa79addedaa3f00cc0e09b88120f7eedb7479254d1ca03145552c2561050dbf9b2e9feca3169aaaa05ce3b12c6e7a897cc35b0ae958163daef964806239fe843418208e45acc35671073df9e3f47184db56d415f062bb29e358222ad6151037900f361dc86144b6eb6394cbfed3497a82f7b553f416d4966b252f449ae5ac4890282d88d97f3875db8146ca95e865cacaca4deff4aa26af1df2d9dba4c77a932be465edc20d64f383f96f2457f2c55bc67c77b5b972c336cba6299e8408fb511e34e68121327fae24882d754a9cba2c31d58022e7aa23bf408ede34b763bd2e306158925091cc04004793eaa8c6c9057b8e38a79e344d604ce62b48f657947a5fc5e0878136564ca4264a6fde54d3d01be8fb1ad67401a717b52d9ea112d84772b6914d8a2269216de2d38acfa933986c618794610d8c1202a0af1545ce6a026a8fa00bc4bd0bd82f7ee8e16a024cb305cbfd7a10ed1073e5730dcebfb51a295b10314b9d687544ee78c25501eb00f802226d61548afa4ff56c235a2ac3c924b5a0ba707caf07575fb1a8f32695f50e829314c37c3bd8fecf3b4be539de7b1ebafef2f25cc25e73336b75965fbd019cb66de693a330935724384500e5b18477d468ab9afe41f1218c3b623a1b4256385050471067a0a26480f7563920bd7c41a75fcb723f182fbcd21f7d502aeb54d31a1cabc2c30dcbcec7ea58409f5176dca29a540b6b430e8fa28a8f24f03f352dc0c221fea681165da6dd61302463824c711e79b46134c71630954412900b2a92934a0e013ce0e1848f07e717dffe390db9bdae60154401c5ba8e0370b68b1782567aef157090daad1b671215ff3eddd8f44d68a979bc0ed66f51975bc39a7efd1615f77dd230b7a861cbadb58a489900b08f292a921e9b7aec49a4270f5cf2641ba4d0b09389bb1cb29a63a66331cd54ee49a097dec7c22e0b9f8097da269603d8ab2f32f7543d88534b3a534e1c1dc791a9c78017959413fba37c8761998763ec3fb2f5beef60dbe184599436cf74aaf1a4f88b142cd35ce667ef2688f07aa6d6d6c45b03ca738f9646dc8d4433c2bdac1bf3e3e3f70235ade11ead2de0789cd3631b913c85b8303a3a6aeb79644552041a4a713b79ffafdc710c95a3faa90495a3cf08b35a0d4047b5ab0f2476209b65ffb39219b1d95e1f9a39b54d8fc88138bf169fe3c5315135e48d4f242d45ab4f8e7119030f3f163dc3192fc4def918101a689e4e16438c1f8d770eaf6aa2f2fc4da2359030a6c2ebabc3478b3cf12acdaa7dea79b663015931204062882e913e7da22875448c78961afa0f2245cc05898e5550e4b8b5acf739cf65c66c931dbe0fee6293659642e29983008de02937e25d505eb55459ebc01bd3fda8ae42b9442fbff27480af3c57d3f46f275144b55bdf59321cc1c71f6175004c5e010636158670dfd13fddd89ed48954a62f44b1252b9f11fdbc2568b682d1759c08feadca0a674f579b3030c004014ac58c9388609a14975d41f7ae59e1204972335ef49355314b244e6c235fed551556cc9c9b177803742a8dad980a965746e5509b1c140ff23182ccafdf1a202d26f65d06a943cc057213e067cf242096e52cd0620e773e2276ba1d010c24ca5090a84a4894cf829c7f8018e6d2b9bd1eeaff66f44fd3cc5a45c5591135e5b49881a428fe556122643b0140df689554ca31c978533a41013dcb37c8eaa22809249a797b22455173620f713ee851ffea8de767b42b99b1a20afbcbdf64a0f51bf9b0ceb7137ff0e8f2e814750f216acc9a69bc691f59787610da92ab5563683bf91ee33565940aba8bd7c82b793c41ede6fb3ed0b20f31942e68cd4c2b70cb2b10ebfdf6f6faf212857534f134db40f4c61731c720f99acec19b4b5a0b9d78aabd38821ff4c7deaae3f8c8eebee7d127ffe6d13c8085a62d8cd88ce06fb4d080fc45d6faa892f243c17f61d537b85210678d0215fe6fb5cf3c5be6fbc3642d7877d1e6f4f77389bf2b3db38051e29ceed220ce761a0f7026e954c076a469d2cad9b079fbd014e7825c0bd9844d32a6240052a21c3dfa5c8a2c07f2fe961f5f648beadf6fbab58d145fd1fc7fc49e0f56009e4466011bd31aace5e71722e2f1c95baaf4abe39c4aa19b5e8627556e23c703a6c7bc3f538e1aea52c8e602fcca8f8051c239fdc6a5c2bee0c501ee60cd53c8441b251c1fbbbaf3a8b849e9ad7f0410dfa5dbf3320143c8f817a2fde587be39801150d54d1cb3abcf15e90fa6d9736be228dc8b2b31833d7d37fea27da7e9521d8ebbde7162d3c08c4a62134ef33531b04f9c0b0afbff0c187422d04f224e37b467f123e3c47d964ee173915622d9c2ac3f19f9e88c3854a0a2f6ed8d41d312d43716092bc0fea2cefd8534992a09ac03615589a8aa333d53a66032c4b24b503f4202bec3896e3ba0b257b4213704ed41c7464e1a12e61efdf6ddd10f6428787097f8610f4e93745ddf7047306042666a6bdc787ea2f3cab6f7d170a37477cc465e8f4696a72b3834eb0f240e450e64c9a56b2dca52ae332b1d2a33b4ec03e69647b68d7ff361a643411f811d936d95302aa99da71a193a0dc4bc9150413a89a995c4cee4fed9b3059a5b94460a6d1715bdb442e1bc66923c7be53d22d732f44fd7a5e0aa2e43dd8616ea0036070c99fe9447713c5dbf55134214593b9f038ae39b41fa390da49eeb1e5f5aed74f0de35a83af1ff8bdb7cc2d29214084ea0026348839480bd3098610437461880fa5ba643185c8ae7158b7345600572f4ffa86f543bc4900b8dd7151fea4090cb717629c5428c4395cb461b924521027de88c1ca727fafe47ce394b904acbf6363d453dc62681bf08bf02f15a3fe127ffdc97944b2852631a63d751429b6c9d94026d84e4d61c4e7feb87b6184f3102623026f71b905ecc831b0fa041780fb318388d2cb4cdc11f39f6299254fef5bb2987567c2515e20612b9865f5ad466258b712e76578347b2589d51d9a730c460e6d827ff65ccf891ed15fe9fb94125b7d4d30f4a77ae1f28450681f591b76d277ba6f863d1d3bd3b453a3e7723c8daee8e721f03026e34ffa123a7f7fce470dca35af4f75c8624d8165d4fcc05fed75fb6aaa008819c714732ce751b843565fb2b8a371fbecde1dd6caf437f7e3fb8e5c39f7173c67563df00b2c33dc2099a95d8cca0957e6c00ed47d37f7b4af93529d167a0831097930bfc16121670edf3eb3c89a2368e875655c3c603d8a160fcfa4f7da3f11ee50eb2d119fffc2163ab5cd016b955309aa1b6e3b6f341745fb82d6da014a0380ceef6e238e6f51aae04e4b683abf5ed74176edbaab4d5f62f9d6da55cac105e472126b5514f9cb7ad985b9a84705525dff7673ecba7d56555f3c70f3710c9c539f8cb736ba268dbcffbf0fd5c7a56f30036973163d2b9dad050ef22eb6cfb47e92917160f59dddad11e95d8a3658374136f8612cf14e54afe6f0697a35e9dfc9d7232b5c24a2ed03e5a0c0e125e4746399a014327ae6481a91b7331669cf9b7ed89be7a539038331873583f896ffba7a31e2072189ebfe4a2dd99c58f4ec14e95b179c641fe07bec49499ceb03bda9927ec071f22092adae04fc5190e9ef39513d88828d1a019812b91978d7684a0d880c8caa6acdebd2350aac56a8b52727faaaf96f4a2c6e79bb3d438855367afda7449cabc1bfc89640ed1d5cc1772eed88b1ff029a684913622631b3b2f4f8c3e07019f02c2d3ac485f5c51d4b69a5e9672aa403d5d24cf52118d8755679fca9c9b7d40357a07c6c4d116e1e2b8e1f147f1d8a48078da1214fcf851c02b427f2a12fbc008b9faaa2c8fbbf8fe41197bb479222252a6c5e9feab3af68ef7e9c12a80ada69d9bbbfc59c4bed15f61ad54f77e50f5cb1b7261fc2fb5d8007d315aef754c8e3bfd7f50c786fe55588903ae6025979b785f775322d48a109929a3970843dec64faf310b688d19f37da7f3dfb66315c05de16087eaba89ee2a64bcfead448c42e13e55d37f0d19a0f88e9f510cf73f35626d401f4483ef94928bcccfb8933ac050054ac681c27f95c3773c28a8f1c74cb73fa3889870bc1af9b8b04d6aa47dcd3b4df02cd43edaba2f10cd45ab5c152e3ee999754df1bbbac0547470692ef475d7323ec5356690be88f5642da4f6c6d90454019c0605de74c4720e56209adda8030122ded051eb61ca47c9c7dd8fb72f557bd6d8adb3d36033e6b9468d48742b6dee94a6ad1a19544551aaad4460e25f7917974a4e4aae5d8a287e93bb896bab51bcfd097490c5b67b6fd964efbda54c3205020f040e330e7f03c86f90fe26266c0da015306d2e30fd7cf3f8368abe0d202de228fafd23e89496225ea6668da24f647bb733cb98478fcc378230cd37c2e400d7cfaa1d343132e1e9a85caa243a87becad53a6dadb5ef39cabe2a89f694189b60ca04a63fc5f6e90627868ccf4870d39f4bbfdcf7ae948ee448dba1381a4dd38a38f4e08e81041f928e04b372be841444192ef2fdb6c89dac491be54f69ad43809fdf95ce5a47c7cfef8dfab44e0e3fbf392a6b9d1d3fbf3b1a6b1dfcf3dba3b0d661fdfc16615101707c39684febe8b0c31680ba5a67c707f883b65a870790300143add30308d101a28f9fdfa35aebecf0f37b0c6a1d03fcfc96016a9d1f3fbf493fadc3c32c4d5aebf43067e6ac750e305f4c9fd641c0a499b2d6013261cc58eb04f9f96d82b58e0f3fbf6b5ead93809fdf363dad23e4e7f7c9d53a0af8f97dd36a9d1f7e7ee3cca1d659c08c31a750eb003165cc596b1d06fcfcfe19d43a0df8f97d2750eb38609273feb4ce033c068f01023fbf67cc59eb44e0a70c3e7d6698b2d609e2e7370d33d63a13f8f98d9ab0d6a1c04f4ff97cb54e057e7ed7307b5ac7023fbf6d98aed6b9c0cf1bfc060cfcfcce29d200f040eb0cf9f94d6348eb68e0e7778d205a27ff543910ad23c4cfef0000699d217edaf0d13a1bf87983ee681d0efc6422801e0138295f65afa8e0c0f1385aa7033fbf46eb78e0e7a35a87889fffad43e427971ec09b5aa7889fdf3a3fb68e113f67efb5ce077e7ee3f0f3ed1177e2a604f074dc0f2887fbfdecb81f0ddf6fc6ba9f4f01ee27d3e17eb19dfbc178dcefd5e37e3d3eeee7dae17e2d035cd1d08f2b12fac1c315d57ab8a2a0035c111002aee807c815d1825cd1cc872bf249c015c9845c514c015704fbe18a5e0bb8a21e20aec8c5802b6a35e07a430eb89ed003ae5783c0f58222703d20095cef2788ebd12670bd1905aee75381ebc92c70bdd805ae07c3c0f55e19b85ecf90ebb93470bd96987cbba1cec9590821c4104324d900076e07d481dbfd78e07634226e3753e262d2e3e4050546e4763e45dc4e66c4ed621fb81d8c8a13506889c97c66734e8fd55e5292fe386a3e8da24bcf76c9f199d2b2743996b6e87ca6b327ba349db00ce033f569a2cb8fe10a954de912654395d5671a63a2cb1a36a2e08635e912478e4679d397125dee28005d02f78d7e9a44973e7e34aa6df45324ba049200ca1380cfb4b545974038a00bd5671fc2a2cb202aa0458dcf2e74459743841843e3b3d7ace8d203458401c0679fa2cb22236894e7f46c25f972c367ff89a2cbe952d2c586cf4ecbd2e5ec61b2a586cf3e7ba2cbf9728225f5d97d9ae872c2a05c417d76d9942e678c4a151a3e7bac9c32271ae53d43bf37e972fa4c28fc890cae44977336b5f812b867f47b125d4e1a974679c7d0ef4874397fbc380ff9d95b5b743981a8e8e27e9e4358743983c068f19fa7d0155dce9a9831b86b56743985b2689477d0145dcea1c94515389f2790145d7a2bc9979bcff3278a2edda5a4cba465e9d27b986cb1f93c674f74e92f27586a3e4f9f26ba74189446794fd9942e3d46a50aee3c634c74e93227a2d07c9e4dba741f9f4a74e9b3762d7309dc33fd33892eddfbf344a24bfff1d228ef1074e9405434ca89e8d283b206baf49a984679cd853c8b3096015dfa9073d12807fb8374495b49be843b74495d4a1af5b969b48749a3bc1b4097f4e50407dc3828941ba24f754963541a456f9754d65034ca6bbaa43e8e7a2d33259d552e6049698e6a9dedfbbd23dedf1ef1fe39ee173482e0fd4b20787f9dfb019974bcff49c7fb0fe07e3f9fc3fbc790c3fbe3b81f0db5e3fd6dd8f1feabfbcd6ae0f7b781dfbfbc9f0f0ed6fbe760bdbf00ee27db5180f72f4001deffc6fd623e7478ff1f3abcbf8dfbc180ecbc7f0276de3f00f77b01c1e3fd1dc0e3fd55f7eb09a2c7fb57a0c7fbd7b89f6b888ff717c2c7b73cb0c3fb17b1c3fb03e08a863ac7bf8801de7f040678ff9c2b126afd48f2e3fd6fb8a29a8b07253cbcbf0d5714d4d303931edebf862b027a1dc0c901de3f75453f30044041c0fba3ae88160342058868260be24410918f8f0f50f8f0fe325c916c968004886234215c84bc7f0c5704fb51801705bc3f79452fa01fa8f8e1fdef15f5042d00cc02deffafc85503420c10ef2fe38a5a420c60c0fbc7b8ded01c6a4003de1fe77a422d072471c0fbdf5cafe67a809207bcffe97a413d10600281f7b7b91ed02b024e22f0fe35d7fb8149008a04dedf743d5a2c082a41bc3f8cebcd6413706202ef4f733d1f1f0a404181f77f713dd9ac025a2af0fe33d78bd12cc0c5020ffbb980970b782f200c508181f797b95e4f5006c064e0fdc7ebb96a4386bcffe87aaddb85fee0ed843ac7dfde6e280b0d6820e72442b4845032846b886e26ba1dadfbe96e07c464033d1b70c2811707a07400d6012a1e8879e0fdb9dbc16e17eb1cd9ed7c9c20020a225a8ae062848c081f22b322de9f1af13dfcd881006fc4c4264711e06d6d9f042000eece21c077b84300232e9159c4cd222237cb1071738d076ebe1db839c5819b551bb8790043dcdc5984b8b9a3c837b7141ab8b9a71872735b91819bfb0a0cdcdc585ce0e6de224f242a70f34c8202374f252670f36c12c4cd930909dc3ca744e0e6d904046e9e4f3ce0e69925cf281a70f394820137cf2980b8795ab1809be7153fdc3cb150c0cd730b21373b1209b8d993f0e1665722c8cdde04c8cdce04026ef62907b8d99be8e1667f82879b3d4bf6280c70b34bb1c3cd3e45762b7adcec57f0b8d9b1d8b9d9b7c8148902dc4c9360dd4c95c8b4c98e9b291339dc4ca764da04086ea64f1c7133cd4280eb578c937649bd34ca6de914830d367214e047026acc015d562a41780584286204f5274997d58bcbcb0aa4a4cb4a450d62d2650553735285a07459b3a84354baac5cc8bcdc5a4e74b925d95c5074b929d97ab474b931d95e5c7ebcdc60ee658b51d1e546659381d97c5ccc36cba2cb4dcb1cf272a34d2ebadcb86c3f49badcbcb8bcdc80946c41ce64ab39e9721303f3721382b20d51e15aee04e782a24b4e490fc7847b71f9f19283b9172e4645971c95202f3919982e3927381f315d7250b89097dcccb3e892d3e2435e7234e782fb49c201715470414cbae4c0bcbce46a4ebae4c4704250bae4b2e086a874c971d172c2c7cbcee55074d929e999975d8f6be9b26342694eb978a975db38aeeb3c4f24fa3e6b41300c4571341a47191912a9549a9979f1828606060c93a9a6c6c6e674bab9c1c1891143868cff7b4932861866cc9041861966a08106142a95aaa1061b6cb8e1869c1c000080068d1a35542a2e01f8f16203888a1b41606a62562b1c03d0c981038e01e8e4c0e167c8637e45392a8747d5a84177bcad200d8398682a8737d1948eb7db5637b0cee03c710e9f27d6f1960bb9193a7a984c8ed2f135ec51f18eb71cb8853c66e7e4f0b37374fc16f6d8f08eb71dc88540784c90c3eb7813783495c37b34a5e3b9b0078777bcf5c02edc01757c17f6e8404f240a79e067fd17f6f8401bf6c0cf7a1bf6c8e175f0c8e175bc05a7d3ae3a743cebe6f0f8e6f0333358c7db2fec9a30eef82fec313a2a87df418e169c210fcf5139bce7281d6fbda7e7f03b481def853d4478c75b518b4462774e0ebf83ecced1f133dcc9e167b8a3e33d871e8d75907ec5d8387f3d1c77b09a50eb34c69f155d52202ac210e0339d4dd1250d0253858ecfd4478a2e694dcc971c3e5359145d52a12cbaecf84c6359baa443948b2df833853dd1656d25c1c2fa4c5f4d74595d4aae14e033ed99d265ed615285892eebcb49949dcfb4d5a4cb0a83f284c7671f52a2cb1aa3b2448fcf2e94449755e6c4121f9fbdf621d165f581e2e3d9e1b3076dd1659d69e9c2009f1d088b2e2b8d8b163f3efbcf155dd61f2f6378f8ecb4b2025111a687cf3e9ba2cb1a04a68a037c769f5a13f305019f5d16459755288b2e403e7b2c4b9775a872b125c867873dd1e5d64a82c587cffe6aa2cbcda5e44a023e7bcf942eb71e2655847c7617135d6e2f275114f0d95b4dbadc60509efcf0790e29d1e516a3b2c4023e4fa124badc644e2c01e2f3ac8990e872f38142c4c380cf33688b2eb799962e1af0790261d1e546e3a285033ecf9f2bbadc7ebc8c79c0e749b3a2cb0d888a3010f83c675374b90581a922029fa78f145d6e35315f24f079caa2e87213caa24b109f67acdc86362eb64ce0f3843dd125d74a8285029fe7ab892e3997922b15f83c7ba674c9f530a96281cfd3c54497dccb49940b7c9ead265d7230284f30f0b98794e8928b515922039f5b28892e3999134b867cee9a8744979c0f141e8f063e77d0165d72332d5de4cf0d8445971c8d8b16427cee9f2bbae47ebc8c19e273d3ace89203a222cc063ef76c8a2eb920305570e0330e29bae46a62be74e0738d28bae484b2e8e281cfa82c5d72431c175b30111dec892ebb56122cd8bf6ba2cb2e7757b07f37a5cbaec7514ee4b38949a3ba285d764e9a892ebb97a362ad63c4fb77b0d6f9c017f140940a1a54c1d4da266613e2b2a043ddfb532eba9697c4738994887a3e26dfcb3ab130100a180ba98432d109d16704c568366a1969325c647e485e4840252a4a413360666a2fc4bca079ff9a050d8cf7af5cc0689992985c354a6a7a6c98d8bc4e4e4eb01b2837311c2a38b2184ec4f09101858cd96b79dae5727f482f24500c54c4103403cc8c9a0c626478ff4d288b19de7f1ba2e1fd372e6868a192a05c2925a99e1a98d4f0b2c1890db01ba0dc10cba1922303801300f0a101058d590d2d35682a2eaa9f007809001536806c80b91174434c4d00efcf0995efcf6551ae92e0503200264e72ac5a385c03e8d179ffeee565372ac71f417ee076e718718b207289b8dd39b703b73b87037703b73b6788db9d23c4bddd391a1892010c5cc00215a0c0048290400420f0801f3cdf0140787e0380109aff830284f4e0f90978e1f93e040182001f3cff003df0f0c3003bf810c2432d57e7c062329fce21c0a5e1f938dc3c4503b8b906cfc771f34da906d0593a8a9602cf57dddc53e4b60200373716787ececdbd059e7fc3cd13093c93c05389d9643231a7e0f933dc3c9b984fcc2c338a3ca5c8730a3cff6f9e56e079059e58e0b9059e7f73b323e1496457c29b646702cf8771b34fc9de44f627b267f1285c8a29dc0abf020bdf024f24304d025325f06c4299c8740a9e4dd02730cd826714a2ec089f26a84ddcd5f68c3c920961f416e11aa8ef863a218bdb57dd164ffd7401fa125405eec260b7616c5c880ecd40dd6083cc061907da745ec6feed7676b341866d08b2a18a0d318a83f57ad2da85d3ea7293691c85b0af3a214ff904b17fb8e92a8deb8f7ee86ab2fa8444af449daa5f93c0d566c84baf46095cebe753937617f307b04d0a579ba1cea93fbb8cb9f4c2f5b3cd50e7f8975e5ee6597ae26516a57e3c28d89e61295096d1dbe1ed14a87b51e7989d2df63a7af4cbf56ddbb6edbdc9fd501d8cbd8d4efda911d54bd04238ecc001f405fb0f1162e2e1018e72cff380d81eb0051144f62699b7b7de0dc251fe42a3f73d1ee0280f2f4ff8277856485a995fc3cb1bf3bff7f996ace1a88ed68fbc117a35e6d798648d1bdd0e1577bf837a403c208836a2e2499e7e701577e48d6dac710335e3e7636f21eb5c1276f6906f5d1b427bc8fbedebda90d69976e6ca86a235701147b987ad8d7e481611bdb77d49ef6c197194536aef90cea1435a87623cc31f94deec39c0cff6c3b7f6ce5611477983db16d20fc048bd087d3a3d0ae73508a7d21260b16924c694402d2570e1199c3d5492f0c7f7a71f9e10d803492d3908f231bcc1ada54a2d3499c01a4f7e187194ff2c32b7a0438618e2280f0354c4882fc1fe16a83d60880f61c48b54d143f4eae028dfc81da6e7dcb74abbbe952b4536d366025bb86340024ed213db9560bc1979acccc7a1dacdebc5d941bd61b6706708f0ed375198f3ac73dee6dbb66d5bca08a959a7e88336506c606d03c553e2b91a5565fc77bc0c5561cc2ad7c609c15e21af9ca84bd1e779553d2ad746aa7abc9cee6587b86748c00206c369324d932914a7bbfb4f92dbe11d9244b67771d49eccce971e4761d157b76ddb366badb576dbb66d1b71dea86aa2554a74149da59f982158438e1dd93445c4287a8e2449d594901cb5c09d04dc437845c1af25700ddc438041186c4b13671b988d688b7d8ec23c93873f746f040042acd177086444a268ea6b137e0b301ae2d43a45ad88084233749f93cc37826e84e1c8ec7967ad4cc953b2b5cf173454d840a101f2d206d628d7e15ad03a9e8e7d558feae561130d153440dbe6b55a4b65a0e18e7b0bd3bf5398de15e6dd42be5f50b9668e23bc2bb4ce11261c318da385c6c9a2579e8b0b17987085c2387fba668f7b4dcf0f71eea1129e6f731ce1e18d766d2ae54aad25c11be75ce1d4dc0b7156b94619606ab201a63fb918ab9d3d2915b91881dc6dbcaeaba7c73d8426339c67a02a14aee39415a91498ce0953c3341514c459a92ff461b252b39e31df20950c32badda0b93dc5938bf15a71afc002d3bf5b60fad30a5d396f73d255e05cf1b4b901b3b043744aa79afd70c1f6e96dfef4f43dcfaa29d646e582f13bfcca888143b63c32933788ae64c4b01be99124d93435c96c52b9e8ca06660383c15029d12b1b184dc19ac898b0f1c11427c6dfdcd1e3dcee0ed114fd9b6bba24ec9224cebd359aa2f99e62ccd11647d157b954aa524fd36e542e958fcaa5a275ec8654b94e6453cfc6445a18d754a453f5bc60306eb36ca987ae7e30fd520f1dd146b32273cab0c9a25117f7b7cd820b2ce4a51d6a14fd232617c67a4195ab73542e22dedb9f2111f63b24c2234f7eb209a2ab9b21ba8241f6d055f795cc640bd3cf24f92261640c4faee647cf63faae592a17f53c2027f2e47f224f4e9e828cfef442467f228d58f13752f3a3775248f7366f431a317df74858d7caf6476cbee68fc078138c3f52f336a68761f3352f04c69b6cbee67f80f12627c6235684dc7cf7474e3ffa2337df7141e5eaa1ab235684747ff347467fa2ab23dddf3cfd29e4f4a31772f34e0639fde87fb8f9cedfe4bf4d4a63d015ced3c719a22b194f63f0b82226763b036a9231b48efdfe1918656b98736ed6e3766ade4441baf536a958eda8e6bbffc1f4a6efc82356848cc8d334fd91d3244f40baf7a159dd8ffe88112b3f8cc823a6effe881521a62335dffde88574a3d1db904660fce88ddc3cab5935df2c3b43223f26f627e2c364d9fccef6e2ef69fee99b55734ff34dd6e6aa5c34a5faa2023a05e9def43f746f228f581162f3a33f729a5ff3a6effe87d19fc82336356ffa1f4e6f337a6b633ad5dc344d75304eb759a629a2bdb8a2ce996f53ee5ebb56aeb91afc8640042330e2a8d92ad23931186756b98ef0b0fd234cd8d2bc289fbe4a4ae300e3e9ab60d02bd353150d307d9ae7c29d176fbdf62615ef146c6a70c15c2b5c31bd9a396c6048c0f46f1698de896d77a0bf37e79c736ede26faa6532ad6f7c2ed6f8fc61b49449544e7749f9aa566342fae94d1c338010579e14ef85ed803dbdbcda2fda48030fdef5fc65f9b8ff1a7e7e181f1387f73628deec97ff4db69fe8d8c19a6ffb4a6a9183e983e8cdb34c5bab9cdb289719b85739bf5b759326c7e5e2046ac0831bd0d69a47bd31b197dcd5728e3add9c06c6a505a810d141b2936547a4503545a4243051b184d908d13df27b638a9c889be6ddbb68de3388ee3b66ddb361aa0d2121a201aa0d2124cdfde606564c29df065de9640bfd78a29800953c3f4670cc689479f8214a8947409be8a49af8ad0147d6f9a005395134cdf964ae14ef8f645bf9854ac9f9ad1d5b5a253f445a99f1bc489beac72c9e022f6e97b2eefe9a4d3eb8c0473739a6a4213096e4d4618beb1e27d9e812b9785d200cd5a6f88ede84d9ecbc6b849e97e5eee47075eb09541d5939a3997d1f4a67705d100cd6b6960c1b8fdd6d170be41f40463f759e5ea82f086531b6d59468ae7756cbab335ba567a263301b636463a74e38bfb14c238041dbaf1e3287ae3e7c697d48cae46238ab95bb380edddf0cc3266194130460bd307713a0cb38ca311ce1819d0c678b160fa327786e9cb843b70d707d32781dca559607b49d85910860d18bd89348283a6a8941a3445dfa51847d7c78e9f7176c378b9fdadd9ab05a6af72d9b75fbbf4debed7abd1d296606a7fa6f6d0d5a8759e74c90d8d5db96a96d718768ef364d87b9b216c535fd896c09965cc38425ec76d5de9cccccc8c15716a8eea990e82b0bd22ee3023fe5ee47dbeb30b7483ee4ff8f962b9344cef13985e283e0e87349c17fa688c3d1ad437c82bf66e153448f401518abfeb4e7e71ccb917ec4fa5f0e8474aa921c3dbf8a33f38b59aeba2174fbf451f729f63b468c6e902ab728c1e1cc385e9679c2d30c5e10273ff5d0e835cc8bd3555ce6eed6f0a45264ab1c80456b21b9567427fcf5fa6697c7762ce749ba6421129a586f40f1b83b7f10b18e10ec7799f8753c319c2d4e338ceb3b553b93c6e3b895dc5fe4219470befed4df5401c2b02716a5e7e204e5bd19fe76bb1be16cb4921568cd90e392ef5d095c94db9874633efb31d721bf3bbfbd1e7199e64cc9ecbf10d360b6c851a53550f8e98bd11347b8deeb4e2a31956016eecb767b217f62463be01846fd00d2af54c61cc2a57cdb59db6cd371f2fb7f86ac64cb584973dd3810cd3ef2838ab7a54324c555830f5595ae2654ecd605ee692cb26e6652e2d717939b3c2d9a60ade525bbc9cadf3615aeaa1bda0356c278853ebc8520f9dc1983d174ecd0e01613a2af5d055f7d9f33af206d11485c108e453c3b49301e19fdc439e6b863d6b87e8f4c8de3a2bc3eb0800f793ade3283c438949a9672c31a1a1a2d4e3250d50a3e87b0ec69390ee473ff2b08769d743537702617b45b8431f264be5a2a9178c1f839ba06fb1020ddbdbe17929b636c669c4b77bc3380a0be3ad05a95ca319a6af7a793959aa2798fe68e625cd36309c315e7e782776c358fbdc73a4e77a4b0a773c6f13e22854aede122fb3116c2d99da929ac16ca278e9b4da601c7deea1e9f7065096d17f8a9ede20150e542b48c1d4d1d9fce9e9ab92681dfbd4c9aceac1945335197d56c560d57d56d54087e97b12c0f52c93e96b3eab5e80e9dbd1e599210f8ab78da7fb9b1f5d1e183f72f76dcef9dd4d921906961529ae1aacee4f808365458a0b07ab7b1837490e6108038c1f5d9e13d460e1fc0970b06e5e26dc99eefe32e18e7bb843c40c03b6ef9df343bf7c55e4c96057ddd49cb82980fc4d1b59c4fe307ada9802c8a42234a0c09b30e5d66e9bdb10032ed2346ec0a9355d62cc774bcd6298be0580cf1b9c9a4d614ccd660ece7a6a969a7510fd7c8366b66d2b4257cea23f5b5830fda97239e99f672c9955b01bffdedf9ac21ddf1e401f28076cba522951b9da7238ab7a542f156cb2be5084e98f2984f7933cf9f763d51298aa9ea8a20461018eb39c10ac6a89a39a1ce228cac46849550fa972b59451f4db3522f480a3e86f2e18bdcad95a8530a2625bb7bab94f5208eeadf7747bfb150bc1fdf61e476623ec6f9e873cbe2cfacd7b6a77b8bd5eadf49d86e79a399c2c52c3dae9b9e72ada5d9e6efe36723223a9a2b715670f60236a475a6fdbdcbdca596badf53ccff33c6badb5d603aba7ea7114b5b343efe7e6791ee7819f533330fcf1adcd366ee095d23d773d99d42cb585aa2c8ddb1db4dea1ef3deb799ce5aca744136bad2a861cfe36b099c349cfd534e853d20686a9552d7137923d232a9e4b8c9e77832c08dea0dee61492d2fd0e57b9e8aa2353334a4eaf7fa6683735131aad25a574bf91a92da95977554b52332f77a0d8db38b545e572d4c6646c9f4ef0e06c38354cff065d214cef10b695b3d65aeb799ee779d65a6beb467db657bf1b8e3393f494782e2538625c5ee2d41a958331ab5c8d2d0d60bdd78acea16fef9d42e7d0f7ee05d339f4b77bc3dc496e2d50d1572df155f7f46d7fa2b731407ba712b05f1bdc210246580465843bf5ad0cd0de9912aec07e47567861d1cf7bc1bfe10e6804bc526e184fd1ff70677c3bde7b6bb766dff392e62d99c7b72feead8df706bde871c3fc0edf66a3ec8fae6a89a7bc99aec4913699ca02ba0257018f89554b5a87e6274d919ded6d60add32f544c542dc82a256e18fbf46fd0ad8d76b4d49252464f47200740bc914640b27ed820b62fdeda284be6ef418f47c54418c1db7fb843c55bf83df8fdbda157841619c31d6bc970874ace1809c72246bca4dd540ce1ce2453332546d1739f53338073a75654cac638e77fb867480083bb57ddcf97f1700ab435a466de0dea1c2b8cf906611a6e2f0d7b78316cd362c48801ab69d034dac6ee03028405bc3c3d7d0fb44ecdd327a275444d9b81278abe057a0b36dd466a724931e81c274f1c85bdfe91d2877f04fc8ac478c4cafc23e197fe487d30fcd20b09272964cca34f9fa5126924246580e980d66235cbca4dcfa6e20d1114df9044740ee5b61d8c314c9fbbd7e9a7783b6c27285e105bb7e2d3b7d6bb892163869b9b8f11e365c4b8f138d15adafc7e8e7f7a18e1cee94463afcf17c9e826386313b3d5ec8665bc8254039c49308ef4f22ce9758526fe885578696a9dd16f5f73c573a2fce78c499ccdc0599c55215ed139d4a746fc11bfd45cb10a47cd684a0c12b378054c5fbc42f4c1c4c87d6e1a9de18e6872733ac7d9c0e2cfee4d7f13ee984c3656061a3acfc0a8ee116c998878454c1c43468c3c038bb606a9b6718db78001f0b85108260cba3159d3bf273921bd44764a104ee11ec2942bd8565074edd71b3eb53c1e16c34bfafdee11266c49718ba3421e17d8ba7179d9375f22c2e947e3e9a79a278da3aeb4a5742273c908987e0de96324c98d24c9fc64d36e48fb63699636abb67ef8332f7a71b2667e876719fbf35613bbde1f4a3f431e01bf4476309a9a2cd8fdf0bc32ea0c6f3d18452f92b6d5f970944bf4df2340f4ddebfb6c5bf87b97971fd996d6a9efadcbb62c8fa3288f97d6f5d10877dc6988dec638ab94d273a40f47d12d9ee771a2782392a6ae133d0f5ee77dd7759eb5a3a7e6db071d3581f88bec67d1bd3e5ca411ee582bce6888b4198c1c99c19eefbfcfa4284ebaec4a144751528cf47294f83d31bd9d410328bad437b086a427a69b97f980e38ce8bfef2345a9e228ea3f03e001087d347692a49a81493052142f9df4e42949e6e538fa994957307d55d7994af4aa8a7d7829923cf8aa59748b1463f07605315d6aa1b3e81538b4d5668e30c804a58e8a62d5d2a5112a97d938eac0aeeb4091e80b45efa5a8befa078fe2748abbd1a5d882e2ac7b897037d8c547abb55670286c390a1cc25bedf4a33beed20a565aaddd4b9c897e662d2d9c595a67c30e2715bd8b41e7a4cbb183d22bdba2a957ab7b81781b89c64ac590fb32a3b8ce2aadfed4698591c8c44ec099c404a6b0ce99057941b744ebb8a075366e09aec74befb3a9c6869bc164fa9a9ab7015b35268e13a36c3111663b9fd1186dabd56a9a8e241c0df08e30b4614c53d0a488c29bd2ea5e8e82a1260d3abf27cd4420e9f59a6190c9aad6c5a7ee96f33a6b3dcefaf4f9895cb49f3b6dfa59911886e18ef761d8c3f10f4e424a3ff333a491faa547c20aaf7764e69b7524fc6c5b46acfcb458e1836f67780202be0fcd02c91f5c0b2d5428210cac902c85de3d914870f76074b20303cccb6c6958c66f8745d49240bf1c16dd26c21231c056c60c775033c77cda24f367531e37da7cd1f7bd15c599fd4473866138df68612d0cb247e0d2a512ac975e8936668566a9902135695291b32d6badd771222c26c244580cd3df6868c21d1e80f810356db2c016e8721478737afaa522cc1c384f4946207119712514b4142a3af00116db2ab10006a527220c1cea21928f38a329faa04ffb3801f4a1410b01cb602733294a47835e21a053f4bbb07b3b038e6f5f806e9a26b731608036c6d1c3b0719b29f2c6356f23be4dd858c69df806acf99b70677b1c8ae3df0b99e11030b531668ca622111d16278e7127761f74d5bd68d0242160fa94e4e38d36304c2653671ad202cfdfe67479a3881b7de0103834b4d588a00fe803fadcd89c4ee0b4ac9b39adfd3bdd3f918dc8799d6d895e8c41e371a24804bab5adafe6606bda38793a9d6280f35aec1c8ef7e3af461c32fedfb3dd278eb85b0051ddb1496c4b747bf8f7851ee69018c531a203412de03ee6fcd6b944ec60b46407eb5e8e127dee44f352d1280b3387d8e356ec99392a6cd2a09cd76d224c7c8e7bcfa3e93c6e069cc121efe256847d3f96e6281940f15a6c6f6be972043caf6846b8830d2c12fde86d5e27dcb19101b4c911fa682c7ab035da44e3cccdceac22cbc372b134d16d96750f9ca1f8f4dbac8df1e3118158c019e8f3813e189c79d95f0b74d52899f41a65522d9778c69c28690b4c9f640525810983e867d214355b8d7465f6990405537246f1260df09c30c0935c41e71061ed851a72923c4c5810e22905279380e7389a3327e039c5f943748e3088879e37e0393bdc9914747d24d8327d065b228c821b3744c320ef7124eac4f9e50726c5182f220cd31f8d9ed8d55938abb33a0b67261aa0b5318ab759a2cf117d3937843b4078482ff339a0bd19f479f1a587f13c3c331f3e8da5b924d80fa64f02c2f443528934437a4122c5686eb35edc66cddc669548b759323e44fddfeff09c10080f481ab122247c23f543d2a3a9c939c98774c55155483147d1072d47eec4589e65072310d20713e3b6c551001091d9ba66bd206bce4d057e5746bd1d8b87e3f9b6e565de683c5ee66d0ba6d6655bd609465926985a2598b2e0b34d01a6ff0d097d9f3f21144de91062d2c56969db46dbb62d3e458bd201f5f5d881046b1ff5934ca197310d007ab87a07eb5eb67b75b0eeb5d536a169a5752616c12a8a4dc360fde8261bade8c528804406e844ed2e2a57554ad0fe10a188306e4bf7c4514f8c99f49a5bad8af256136db56d0ca622126ce3c1e864d7bdbad700407b2d125c582472d2cb51996480700a9c686961d0b44cb03f5607b417c42e02459ce84e6c6953a7e2f7a32e98fe684cebcca73fc242eb782f8e01833053dde71f896010e60a04c384cd1ce16cd2a03f438ced4764a619fd4866b1692018a6278e34a61838834373abcd30b23ca52d2522cc4a45c0f42969e628d2cb1b4d6f5db6653fdb16d8025b604be42c2d0cb2344b0b83ec0f6b699607900b70a8eb964ac395084d837e35823d42cd753671135e250aa64f7ae24d9cf8749c8f389b1d67809667b71ad8ea12f6696d8c9ee544cf7ecfdd106fc0e19383e7d36634f07cebb55adb0f0f0898b587075ba0cff4b1403cece1612bbadb98ced984307dd067e6d8b0d034e86f5a007db69a87b92c636371085a5a34428b5cc4993813bd603ae7b41f160ff07986c780459f43c8c33bc2c3a4278e22c178c00f7f5e22dcfbe3f0bbcdf230f87da2b756246a12ac75ec83dc2c411f47d1eb989b8d3d1ad3401ff7116222bf59d77beefbc016a62458e7604e0cc923f545dfacf0ce591763b0c8f382d0c22297351530082d1cde1602af95de62059a476b9d61faf57242183f37b63bc00afe0e37c011ecd74122b7a1b757d8674522024028409f4c7a627aa0dd01ee087b38b66f5960bd3c5638f1ad873cea166b63146d425bedfdeb9471abd1d5646d323b5f5c3347d1645d1be3e1ed89b106b3045b8ea22458eb74afb3813c98be7dd239f4c3db2cd125c98034031a748e1885d484f4ea9c208cdf73b8c3069868eafb90b4db2531d139f4c116a90638936ec0d3b87624de78306e42b50a7e2591b0bed7d2a50b2c5e107717fc89cfe3b558628b95492f520ca0b49326d1a0cb4f56635430a59813459287e3d11819b24aabb37344efd73b47f4dfa59d2312bd78bd4689de7a27a827e81c0598be0d7b20c1a2b71be935737027c09354c3f42b94f903f8e16fa10fcdaadfa190130f27bd581b0f38208c99f4c2f58d80efa41725c9688abee892b094b6c8469126ce1ce57d1643202038645b2d03fc404027a07dcc1c96466b2ac42de2ccda18391d5a8749450bb6660e314b7b5a3a87b644ce5a9aa561fa1ea803a8830ea1f82f8430294682750ed5614707177f98ac4a925e3445ffbb3b340dfad4ca8fcea16f0b00ce2ce3fc0284417c740ea903e841ece5bc310813164721c5c42748af2a1667d28b071f405a872342ebd8cf7b8fdc6a24a90a25147c622c694bb8718174022ec2565302c908df671217520cd39f419d14100082b77fe6dd70bd563adcf1e9e256db6ab503803646fb0700d240261545ef3e7808838858b55e12ac07b0871e422789b41ed9c3a4174dade0b3a2adb6d5c02fcc3008e897d4841483cea12f5e9293cea1ff5deb0338af070977bc0ff25648d55267a417e9e55b483452982c9da36261a2573eaa9529308555184d05414b4f69a026daf404a6bf8d11b7388a8a22529c4d19b3389bd1bcecadb6096db528a52d252c251f94747083929412154cbfc4f3b9f4e47309069896588069e90498929d0dba00495ec094ec5e242d9494945080a91530490ca64f0a43dae22b1f34455f32baaa4f9fe4439a916074057e815485a02ac62f9876c17492a45718c666e1a8c0064bc05a2cd24b744529ec00a9bfc3ad10d0de0d7fb7b574f10216ed8864e07929e989a32e09467acd60dc3e935e74d5bd2a9699031c9a34e8871546df0a01ad8db153402b60529113b388339a28853805a6e2ac7328e925ce48afae7bcde0213a5fd4e2f94398fe8603f37c7ade852c962631ce073f21ec6f45f10bea80b077dd8baee87ba705fb77eeb2749f3b21e02e0854e63ff0ba5717eb64dee7ae3422653e9ba8161468d2a0291a4dcd684a0a4dc35c4a61e388138d5e24b34f2a2b639d0db8679837ccd2717faa73743d34740ed1f793d3be288a9d8bb42376dd57cbd293088f7654ee7a4cdc3d71d4cbb1309276883811c799facc893decd135e91cff8ea44f748e4fb2a33e9dd3b47b752e2fc5f7ef967819d215fd1378acfa9e691470d793e913b0532984a15a6c5f224964f6fc47f499025130b44665d40aeac2b96733a7f024f144651c36ec00cf1065b2a8cc339549f9445114c5f71c25fe775d1eeb9b6faf89a6288aa60230514d00d7b3e8fbd7b40efafea6d671ec2fa369e8957d2fb1e3dcf5607f1abdf25aff041eebba469614fa62381fb4938647c3e470c093e6f2589f100928924a028a646ea32bfce0fa768228d368aacd7d7b3ec5703dc9703df9d89edd5494327f877b3d34555f58067b3d8eaa93f45c3455b98ccd9a9f6d865ccdfac1f5f30c2e3c436b1bda369b2e4eb1d395138fe73a2d716a9dea773e55c175a4a39f1e2f73e9f5f232cfd0c2f56b8871f696c0d57b826b9da145579d143091894bafd6a15f7f04d43a01b8b774f1e2bcfba82aebc8ec61db83d7741755e2c7bcf4aa78b9d9a073d42026baec66307370af18cc928341e7a83f4cbaac3347ad4d1a2d689d7a85cea11f2405ff34c14eaab53155a8d6b8d84fad0685f1f2f3b28ef155b352a085bb7a26ae4159b0161d348afef698723d00c2164c9f7b713fc074e6e8a6913927f0155a87cb41e7d4660eaecaa4419fe301a65f7fb8c838428c28706837463815c18608355b4c5a600c8126cb8bd98c104a4120014106cb08c5e807e213a10fe803db838f07a22b9e13dd0eb8ad561db40ea55c0e2617e3ac4c525da286d426faedb0b531e240b231d21072de81349c64ed712df1f2abac8b3aa7105d75775321cc5589e1c4a85c8cd69bcf55b81859ebe9737dafb5569b1a375518314ef6d9c9b656d6e38e8593e1c05de9a95d1865b88aa3a83b17cb8fab9b48a51547a3295a5f750947d15aaba8d64a2432d7c0d17dae5d60fa1b12a3ccab358eacd570703147b97f7733dd529d72b2aea67bb9d8e3397ff33a329b3099e717ec71322fa93f47ca484e56657691c2c8c9203f532930a55e30a55b329df15486a7cfc5e8aaf6acb8259ea2140563462a50283815a24cc0b486547dd517a9be6a4f5d62dbeab691c8ae0185fa1d5e9798f535a718a2deda186998c108f6b81e1c37a0b003a0ccf90ce2adc6fb6fad43e3fdb999a3be9379081cb0bf0dcf5d1bee90915bc2c54af305994d7f0399ff865a8346bd5c0e260dfa00b89ccc51f4732e7745760399512fc8fc335456224954068231d7efbe8bd671d9ad3e53c6187ea3e1e735c2b9255e7200075c6d78fa5c8f28dcb1c1865bb12845f45646c6ad5774ce0c7744d36b48a1fc88d1bfba162d964cd105313f4ec0e28394ac60491715a48007f40a0db7ce70db5133d75aad1df1d95d1cb903258aa37a5eea23731495712e2e567b62c0924415ae30810aad185c018b1754e9010b6261b22083a65591a2d5051525b44cc0a2750ce897722228638793e1ceb8b5519308f73b54cc915264b88d67dcc67604ca1062ac42b5566b5c0c27d882179a0839e9220b17903069011724acd0fa81c984b0800b636650032940f9820e1638218b58132ab2c8c2a21fc3a5dc122a4457b5d6be71c5b94a81bd30eda1ab2aebe13171a5deb4322e79391c4c1af4efe5aa5cce4ae7502e071c118c108419d7031f2d4ab0e0d69282305800b8b528e1c15c8c9b2245d463e24acab813171973fdd1519f7255780831723ddca432662ee6c274620e8b97fd83b3cc1f494f16589083295b9cc8021816fdea43572016a0f082169a6c11250b1612194ce10a59964801021890c0bac00ca030c1083d54a410028bbe5f1a73548c7bd3287f9cfb6d6ad44c8fa0d7287f18b736ca9fe676a3bce726660be0699ac1737ee349126104cf4972557ac0827076d7248d18731dfae229fa79cebc31aef985d1d62aa6d62c07b2481dcaf33cdb9c0bc6cef28519ce9c4fe6624cbac0b8168c9de50b5528e783b718aa35a0d8e84af0f65e7d4eb722d0c6d8bdfd40d29dc1b65e19bc5dee09b620d85dba1277b92b7102d3a754d628faeeeeeea2a1f64a235d0de4ee0a31c41077f912eff192d461eeb696243eeea2ab4ac448faee87b4ce8ba7af815ed51a165bccbc27d139eeaad195a7c099c0f467c85cc310835af31660fa1b6cf48de37c924010733152add59a183ca49b68ef318b5f19b93a399f3ae758e38970e662938b4d2ee62eba9a9d9a2ff2dce52a511995350dfa5e27865d7d62fcf15aeb6c880fe1811138f68005d3dfb898a328172b914a24af03c731dc9122e2625d1c45a5b87ec3ad4505335cdf725ec553948b01818b51ea917556699835863b54f246971e13d7e8e99e91f49c61d7847106e739bbc1b30b6a7efd3973148d041d85c47354e30e7b98d8c96c84833b5e76bcfcec78d9d279e7ee9c0c532e4653d46b7df7e9d36f974876bc6089d195bbdc2573676c5e09412787e86a3ef121ba1ad23d673d673d673d673d672f5639748a7e46f9f01c7a0a1f3ad54d7f02f30a9e55307577f72a8b39aa4e98bbbbdf3aa3e03b9f386ac89c75ce39a796145cc136706b490112d8c39db72e736e4ae7d45a6bad73ce397ffc85f3ccf896c0fd56e4565a4b1217defcb9fa5365b4ca884cafb547ef77f874327fad8f875b821463168f8b61ca4d894da9ef358129f704a65970e6a2c09b8c0c770c484c24d890cc400247c26d1e65eccf95c88b2722c3431f8b9e262e090e892d9c7b618e83e171c767ed7f5fd775ddfc32d71a4253dc8eefeef0ecf7bdb5dbb6bdf87a877bf7bb3bc8dc28d38fdc0ff7dd34ec79d4e659eeee56f43bdce67a6bd6dc7567786b28d4bfc9348e1dc5b2fd8befb66d7b41d219f5a13e5dd7755dd7753340fc95379af7e26f3f3232323253f446effef219173877f72fe279e36832fdcb7448e4b485e08f3f43225e3c91f15f90a7edbd4557363ffad05d3ec31cf732a4171b65dc3f5d792853d7d9ef7ea42b93cdd35c2036dff3986c6eb3361a5dd197071b63980b43300c6b4c32a410fbdf7fa41113495b34c5bd255d88a6b847c2b222f3fe4357d5f3ee64d521dab3674f20a22f62e6400aea4db159d1db1598c3db10d7f2e8101d92a9635efcf632bfd15ebcd8689e378e26d33f0a55a3c646a3abea79e36832fda3501b6da3fd0005e11a161ae25a343e55a8c6386f343daa06e9330e9c6b0c4f2e8c2f9e7b1a6e3fefd6c551dcd31fcc5d3a4453dc8f6e6dd5174d71ff71ef5deee716c5461bda681b053d2422f3a59f21113444c890454c4cf3337448f4dcd7165d8d5e7c618e33e1186b60d2774661d23f894422fdf85624faed02118d58323232df3394794fc6f34823566464c417272873f346cb75c8caccec194f403c2b7edfb69142466fdf8e2ccddbed724b388a7b9afbfaa93e9ffd1f462fc2a8551cc59d68be5942271a3248b32a94b1ca609035c63d0cd402c889e6c5130d790a625f7c21f6459ab70f8314e2bdf8226964a4299af71e09cb3e0d0dedb0ccf5169eb7c5b72f447c4b1ab102e38dd417c9a6304821f63dd208a521e91547712ef35a2d4caf951e820a80aca5fffd91faf67ff87e441ea1ff3dc532178716fe66eeac2dbcb9b61ecc4d5c87e88cfa501a05a2b5201ae466ea8339a0d15bf13f99dac5278eecd69221eb50bde2657621eb429e378e26d33f0ae5429863f950cbd5f382611a1b6533e64357e07fcffd04a22befb9399b7425e2708f3b407844effd8ccd31db0fd7e25cdbd016b4d536a08d36856a1bcd3f774da84f478ac4238187c4ab0092d89e9171f20cec567cdf6664140ec1348a7ebe715408c64b11462776f1eb14d28baee664d9d9786ae132027e1db7f0eb35521ffc4eacb900e883d7bf5e127c4a9c30c4b272fa319d14c38841f8c3a18bca127c710f0107356c6d05ebcc73d30c078e1a35de348ea49aa9bb17c7c3f56c633621cec5bdb8275c944d8b6d28ec097948612b5c122e0979c225b6319bd056db6aa12be4095ddb060e85992414f2ecccd0059dc3d2c21e2f7360fae112218fafead78587300897b4a6f7b9fbb4f6f1fc1c04febeffc7a497a957ddebfb481ba38b2f8aad39fdbff7cf5a9204233df9c1f4ab888495c5313eeac06dec463ce63b090e39aa5567610b1c0a5b610b1c02bb0087c02ebc9c61abd2ea0c1cfac194f46ac212fcfd6c2462e2cd7e6296cee95e1e356d32f3f3f97d735ee1a7ca375d3c59d2152f33e8e396e4e1d8fa936674c5e34157ae601aecb42ebee201614d3802a64ffae2ab1e232335e109a64f8a59a0d2412c5eea60fae0162f0730679e4c05faf942f8d72e3b38f9a556d139b47be2df973f5d7e1c456775d2134fd1cfb50ba62fa542a17380ada641bdc481e9d72a5a67d62a85faa592a45747cecffe27be10df4f18e94582892209467a919e905ea4275ecef7392db909d5994766b02793a2d499f7628d7b314cf8c3be18f475c1029e97c320f626c5a01b61a1734c2ef4688c0ea60e70166755706e5a877d6a31b5e89c4e148d938a9534e3221922cd0763c6157214d58213bd287e42df509db2f98d8fcc38e0790317ba571793752f1fe0560345f213917ebc2cbe2a3d25498129290a914866d2144bd6ffc84c12c2b4148235f626af3bd27aa6477dae41a32bd2ab86a551140a674ba34fa32d327ba48d5591084849241291683f41d4eb630607d86a9af8dc5bf1925dd7755dd7915e9e378e26d33f0e1c181693f9cc68f8472c853f1d105d35ab0be2c83a43e51a3878cc2b05fc4f247a7b8f3061d1d7eb7a16387fbaba4c7a855feb874fe96b3609564959ad77ba4cff3b5c04f31104902145c0167d1f990c53b01583c15e987e4ff7f252b443c449fce7de471040e80a7c13596a1aad6935b07deb91235dcdbc7d8faeea5b3b5e2030eaf3cc3cd83d71d49d30582c16ca4e2209a4449ec4903c89e42948fdd20ba95f228d5811dfc80bf24572860c5d344569ae15ef6db61a384453b603ea82bcd948fbc12f9f3b3f8aff499f49536432e98912e9e7c9eed4477677ea83d198e656a1d2adb41775268a3ce3772f3ea9d4836b620f0dc2241a101e6d241fba8241925e3430b2da994bfa3088558291641b5867445210a9268a22e9d591a24b6c892d4c3f0c0a83c2a0a057f7a483612ade1ed62b010a308cdb2c9b9adf60306e9dd114fd995b812a8da6c29f5ac335e431710dc60f161b3f1a1a12e9deb4993af2b481f54733ba820144573363f75486ae4a1f06b5f87666e66b2e90199287e7c587cf43fad2c433b759220c06a3b0d3460201c9d3f6e0236155f2b491a72061f8823c624508cdbff823323ff3e16fa490d2d7afa411127984e65f7c69bc52681ec6b532fa8ee643175d917eac0fbe90fa2069c4caf64664c85357c31e21309e441aa1214f1d790a02feccff50ffc5bff8fa30c8d035b108139f8aa2f8d914d2e80a46f8d33da1dfcd807651307d70c8d5f382c570289bd8741b8b30ba6a564c26faf8d02cf1e67036f3303e7c1e9e174ff3a55226bd6850306e26bd662aadce421f2f3d6f1c4da67f14aa460dfb19072e6262ee699e3e48a3ab99a70f028135ba92f9179fc19fcf6010a619c4b1dcf4bedfca08ad04a8246cd5565555324623220000005315003028100c8783c22179a4c879b10f1480117eae4c7854a4a7590c830621638821030020000020c0401000e02b2b8769b5b15a2457b8ac84e501a720aa00c6199e1330905696a302e0856fe3d55d758f45be186b70b9d18b1bb717c4828a4ac091629d8047bd610557a150cebf384391060f3c0c370f6e5395088ca86f81f3e65215f1caf1e1b587019d56b31687c06b92d79bc6d7c89b977806187072f3ddb655e4a64ed2bdc2d3fa3b945a7ab1ae8a5da0590fb4ff1dba33332ac590ba9453a616d40997be2c6ca14ebe2e99322f70d90c7fe62abf7a1855482f71967eb53d765d1e66a07a73f59d1b8527f36d6242277784d7cc420d7ed420a58721af585c71bb9951aad197e8641214109739ce3d033d2d6a9bc783fc92017766d11a5d2fad7b623ff569fff30641f1c2ae3ed25cfc4152fd302bafb4164f90142f8cea23ecd51f34c50babfa0bbbf223a574f1563fc12efc4ca87db4554f300b3f106a1f6ff593cdd24f94c2c75b7d453b20d629d22bcab59a5ded5d8af472495930068edf3af08c3a359e03e6b020617c3b7b9a79e0a7d0b8c4a23d07d54439570c1f946594aa59351da4c19fdaa9b8456d093be4270652470ff632b5a386be51cc36dda4e1f442d00589ddd825cde043ed440d6250b4f74c1832ed57f0b2198703991495f8b401b7b951a36e5f81f427f40e5ab7019855bb71381b08522351cc0484e669058f6b6a2d50d2a734527fd038f5b6dc9db43ad4f14501014c5c3f8c08f0d313fdb517c0e18f47d4363e71afb972f36eb666a583e98344056f2b293aa24cee0042edd2fd4b9d9e68f6b9d0ce28da91a074b3317e2626219e512c53ccbd62a947148cfc417f3feaeea24e7c2196e8cc890594ffee8e30b2a535d36a904d6fa855b0524a7c5a969e1dc435cba1caa5452c39cd17e2622ed10872e9691e81571a24181e5f74388239a401c0528a29d051b6a0209deb8202cee9e257f30ade48b3383613424715d1438e30b3a28156308373aa00505b99fae818da4adc1bc33a49d60710f2868b6eec0a37a890d8c62625a041256cc8aa598324380636e2f093e8dd27f20d8d07fa732cc886df8ce01bcb49d25943328923e94182cecb4f6fe1279a7d9b0bb890027d151e171573464c735b297e1681656168d257d2ae03e78d898be5276e6e968096671ca37bcc4925535b9f80d8f73c2c212357fe81857d9c07ce55d872ce3b0b2c19fead11e8b6144bb8d9692a3aacab3b087050721f773579d8dfbdb705a68b685ea8a4ab999a9ff60c01c9364dfa539b835aaa553c2d09faf3b79cb6c4a72999ff53523cfeac6c589f540d6368023d611a66fc7b33cfdb00ca2348a420ab76c55119cc4d2a734794a46e14a32d6315a2d066bb87f0b684da2444ca3f84ac7fc78770c62250d01d4095f9306c3ba2428401526dcb35bf58880889c88409d3e558bdeacf0d62e85af33fed2de0455f2343d4140db667399811f582836d38b2e19af1f47863e2617beae4313e6d14c4bd44f5ef06e41e06588c4842e7f2b6bfacf81d50a08679497cacbc823f94d4d9f97fe4813be783b5b34bf2d58a65de052c6d8d5a81d9acc692d0409dfcd72c492eeef3796bc2b6199f043e538338a528c2712a55449e394cb6c53e38ccb3dfc486b5790f64ac9f38f088cf94e243b81062812d04896ab25727a7974b4513409fe233e488976e5ae372c0f29c099c391afe2225e60e9ee6e03286a170cdaf04374c242667f2b5fcc428fa527628454ae6f8b0eadc7a48610ebe4e524861f2ba0b1e25e96e82cf03c865292459af8c4c6736ef8b4baf2212a631c2927eac962d6e738e5b48f513a4134526ccd5291176112be7ca77fb12630e334f467017d42dabe5ae27e3a0c9d503ea0e3bfeccd1b98a7d01502c712eba77951e019a7fef96e3a3f35c493a5e2109b20a4a9b84e466019d6b3beec23de7feb81ef58f57c1282db5875dbc43d7581a8f74fbf16e2efd9e2a1495dde41755073e515171ec84afc61b338f36bb70ae182e155477ba1d95bc1fa77f8d71c054446a4b8cb3f084c479431bfe67ca8de26f24ffd52e923c358c25d25baaeb9e20900f0f052c2ba0f98e3dd4dd9c0495747f2c2c49fb9aaec820e4a3def2ff6005626887ce5e2148252afab86b59c1bb6d55a36be5807eab4d32c0ec4d77afbf44994c246e4d625658dc29629d1795c60a183efd572798c596e21d302b1116564fd4a922279888648b7eb2aef6b400d654748c9bdfc53e967fb0ab1b6d038a867f0367640b4c8452040025e1ed2804709d403031c79c84c0140d58b0c1eb207c5c84560771011f183dfa1b01b5d5e80da0d8aa0ac1ee9366a4ebcdfb54558a2257e100c476a191954a69d09737d4e1ffd8a6eb06dc64264af1e55db8197a4b2174ec5208fa79ddbc4a7d08579433d277c92512eadb8a3d92b1ceea5d85516304713084dbafd35e3279843454cee8653dbf36c3c5727cf3a3c7a1851a7d4bb8c31c349461c32bf3960c7e074dfe0f9df7ab51e5ff05d337cc942949a5150a9565ed7976f21d3be7db2e1d23986121da49cb5fe59328b1e39ff8afdd09caf9e855de2b4688c35d256cf88966c4299ef53fd7b8139fd1fa9489b704671765d8ee35b68dc75f1414cc369eb92d477be84333c10936be7836cd632c4eddef8988bf67d7228e0ce19981b7844784780519c3f28d9c1cb0a57259880502e35cf42ca7dcdcd82462d044126ac774c2b7705f2abd16d1c6c2de21cd50b65cf358c63b6e73f9ae93b046b6d61524bce4535f64fde8ce1cf5a925d7fb44da435254c9a15a5ec5855d2e8ca9281cb6ee7f330efc9365b68821dafd0e01373a91748c5a192944c4b5d18cdaa63426a23b3d9f85ebdc38a46ecabba06eb95266e8260bce9c40d8c2db284f2c06c1e43d8246c698a104a489408f86cca99e325660dc30175012242967c0922c4aa6471e95e2a2e276781de009a7d8d8591323752fa83f3a070802a90600356f2c0ef2f0c337d90b68b52b855439672afa7c0a0c3eb5618da09345b0775f044dc8130a26f5a2564fde7069b8fffd1d75d4fd2c965fd83bb2371ec113cc65a930d3f0dd4ed95115088b1680e5e28328aa7397b2a6fa4eb178a120d85da2c6b951c82af271d7f784ad726170db3a2edc4497890bcb05541027cd439af6bc8d23be714565329fd275378e1b963b7072e18ad490306b104983f99ae85e35929b401b1a14c9b91ad8c56716d6d01ad740e280c6532832bb1b6078eb7c3b99101cc8b0ddb270ef9daf934ae39625a9e380b0b190f4b91d534056aed758944016e240173bdb6b19a184742811a6928fbff53ab927c837fc41df19286e381d6e4dfe3a08c148397d376137be8b2b27d9744171a948066e2345416a89873f7a62073f345f71c1f99879742c5490dc76f2bce5dd5819069dd4ceafe77a9169faf447ccd40dc4ef94dc58d57a2a756581bf90b8c10c18dc02ec16460df1220d8c002caf658165f75347abb16289f964da37adfe6c1cfdccae158c6da14545535b45988d0c763b9cea8a8999f87cbf76b4cea581adb041209a5a63385a5b89b993dbb6c6c580ede41ba59175460a01584260791b91c0a3d1efe87fac12371f048df6b7a2b2da84e3a4a8d8f44109ebcbcb5716113cea5f2ff12a032a09efafa2adb58d0982e5ee94dc232d96f397c30d2144df574eefc6c91cace51488c499d1b650b0c5a515a439ff51a26844c893b9c30f3330ddcb6c29b574be949221f4daa6101add7611978dc1ff9c621a193db391aed293cf2ea8980bb8db27dab96857eb7be6345a7c00f64a023403b3bc377f079c16816ec2dafe2d736eccb0a4c42e188a64fb928a2c2d17aaae1f8eb055f5a4537fffd570a708083e3a8d31799ea162ea2c9bb476500dbfb90beb713c2a016111f1fb8cedbcad45a1786f6524ff6a076dc8d94323b44318eb2265f9df08990c0405b18a25cc9090a9e9fda98c99eea8a4142fbdab42632464f2aa64797498405324dbe03aff3176b3cd3e35f0c52689507022639b3a000099884a8e6b888509f4fb6d7bc011ac8c3914c013bd11b173a29055aa9d9a96349b36094aa54adec7c1d02fcd8ee612554524654742a9bb99a61d8a95c17f593b06b1324c67eacc2c07c1f9ea11a1ec5d157006080f1f43fac1b2ec52957128a18222980bb9aac3e6932b7669d0b8b526e2ffbd1cb252c03454011d0c7edf297a52c9d8b2f98a4e1299a70a7620c77306748652851fb8b7dbda8780da10ad1b6c747dde2e522e01575b840d11c819adaf4943a66b4e1d166ab13697b0b2c2e843b157afaf6a5e878ba5c33cf17a77f80cd37d5d314a8d6d7e1313088429f8dfd1bad15d82868d948734432b6066f73bf0de34255e219f5ea96a26b644c020698c7bfdde0b0643b55091ee90fc9064d04fa7b1d30aad39f120f0fd8e38457cbf0ebcc858653028ca4e6cc1f6137ea5e511994b4a7cf17726e0ed60213e2c301e58ad34491e89528ee9a20163b57c3e0400ac06844b9de4501374032b048eb86dbe7ab58070f6ade2072eab02923fc375bd029557ecc239374cb097dc8d0626e2311d920131441a0d01095a6431336cffec551e0b743b04f07122a57e9d659aa52c6dedec2ce164106e04603012fedac1c3c083f42b282131a8306ab5faee0a3091550c2e5595f8e88f8340354d5510558456c5bb0353f25ae38ceb95fc01e8bc3fb85ae66739c3c2bc37a287bc1dc1811ec15ed01d7a58091cb2d6840fa5184a94e36240264126b02f78909527530038f3782c865a96e7902057b7fb1358eaac769d92c566836ebc2560b1844e5a89ee9a593c62115b0aa3e3682b81fb049ad5a9204d1c012f3531b95c121a174e25a703c2aa1055e750303ac013d12a8b0d28d8c2b8071a89aa2ffa06b15259d4d2a3cf958f851d7ce601df37219528c00fa462fd2bb136d047135e0240ff2993180cd13b07cb410a995c46634a71508df6af1dee1e5711d93062c2f59515a0bfcaded1687b35e34230373490f2aa10f184ecec3b69baa067694b0c7fcc12ed375998c3923702c1e160733ccb873568e4d55ba420ce6387a8c0123acbf42f1f8d47352dcb50dd94f63a11fcce174c8c288812278113a53ba92af5e1c62879b846f7ab2075bd5e0a17caded7aaf60f697088c61ebc56d5ebc0f24f9fef55690f55f3c22d40ef9b91e7f885339a7c1f3fafc299a7934ae32ab10500a80ec24c352c1facbfc6f3fb57e669373ebf79daed29ec4d6718a212cc00c20a55f5267767734806d255c64edba09fdb134f45f142fb8d29b9fa7d95bd898a1e703eb15e55702e61b4bf4ff72e552238b00aeb1e9fe2318ce9e22a25290640f1aabd888cab52d03d5b234a586341b76616389a1cc2ecfcadbd92c9788a309a2a7fb04ed2249212e556a225632ef8785442e483927537fb0df89bd5d028f058bc3aee3773339e7a6ec8a0e20e06d7de7bac78bb61d74a155a7d7c1f96aaa4aa3899dd11162cf6c4452be406b0ce1a66c5a8357f5bf7e1fb22ac5455e31921e796e35b7be032b665b4f13dbba998b2819ad5eea45206290f8e29c429ca4308220e716664f4e1503bc5d6e44054e6d37e77d6b01058e5f6f6dc3b358bebf280ee0813f38e2e954b26176c200d0b08c8896f6fcd165b9abaa891c3203b089f964aa54890beabdc0b02c88e6fafa6bafa2b309a669946c0c84e67eb1476883fab545687f2cf68abdc01e0d308001c117a0d734c5e4f8276ec265ba4015597859419e185f22e6c2439875b846b4e09914316ca11283d6d5ffc7928272b728d60b9d42c35272959a867dd958c60093a4659d8790041c21e785b0c8ca52a81d45e3dbf23b3ed68c2f065ccde147e7e05ffa06b9fa9eabaf4dbc077f703dcd4d81b1db2157d08e548468852de6420844900d712563e42208a53267b68af97a19b6666bd6cefb85bff4e13061838350e562e20710a59b245e2d4366e072963216d70c760cbf47b24ed4b29f881f6854df3f4cc901e976b034ecb34a4e0f93edf96e677ecf74aa2ab8e44c835f0fd9fba414665a7633a38ba96de1a195fa0ead544baa2c6b55cc11115961d7c3639cc14e72e90ca323984b9e4e49ac1be9abab4c674a8974d77112b01e56f05c2d7f8fbcdf2cbc33936602f05ba8957a13f4b581ef1f32274bb617e4fd39a130a9caf0a4820001ed573626b3545dbe799bfbb5fa002c391c9632d10b71f5cebb9654ac5c7b7bf3ce05f83e85303f7050fe3251099efeac80d0dfe499465be1f8a6ad9fe7a0f2ac983a9de6e89768ecc3d0a3ef442d0ce5962a710d23e8d7c46dcaea83ac275c59c5345e077aa201327958ca63e099a6b1b539a034b1a9e9aefd873684c4960a13215571ef37656f56da21f115af6ba75ae3aa5568f194b4d005f312517cda70691dbf4bac523123cad6396a8ea4bbebbe7843ceb4d95c0f7eadb94f642894e99abbe715337b42e281d2cf7ef769e584479c135dc364ade3e4d7a7f5413d485ae13f2259368549c9eb193bfcb605d160be8a1730863f757e91fcb473163f25183922040a2840e1858f570ed2c81c189c8c5f8a8aaca9d2c40c50b65e2ff0514a7f0de22cdea51e55ed2ac66e713cb9ad338d9d7a5a8b480c0dab1587ac5e561b37c1c2701a34e60266f261f6c314fc6fbada68b0891d51e45180ea2b3b70789fc5cee2a88811c1aa84da142c038afd74477a8171485112606c01e3b9c52e3739b0d6f52731014cb8d4d440d266a0b0d0c6c586b573bf6997441720877e3d46b20ff35e18202d11a327439457ab6ff084212981d4222039bf125a13a423ca1881b2e4ee417327fa2e4a6e2868b0f74d1733e01ec73920baca44f30c85dc3b7a410acbd9996bf4070ec7319609f92db3e02f76e79bccf24afd5daae13c21ef8a8b7043b49ddd194780ac90a9f2648c7a8167357a67e979623ec3851789b1e00732c8141f94ea5231c22d87ae77450a33f3bff474499392bbaa3c598a0f31d358c26ee1855634ccef9ee421f71849edbf0bf7722ecb8eba9fcf5e3b958f4ec52d034b73d195b49abcf2418521b18eb4a4899541f3ad587d428fb67a95880bfcaf3e20df626e1f39e95ca5be9cdc5cc4e2ca7794fa0ee73ea6a061741f8ee3dad02cfd4ece939008966e2cbc9d7c6f734de4cc46ff614918aab418cf0180c67f7400c92719fc48015cde48e9abec4e296bc95605b97115f3d98e8146d4eae7ea7dadfecc58ee1349530339dd3d6091e7c246169ae10c7fe5e02e0559d6e6fb49ec042c6eea3d7c514cbd85bffbbbf4c5840376b5ec3307111213036b36b498c88db0181e78b5c8b43047bb3d543f9bc8f96f4d3ebe5ae792038d7b82c8d31e218f66a5624ca68a454fbe2d4963b0afac5e968ac633ba48e60dbffd71d3c5e598a0420b22076eea641c7205fdaf0453d3b8a4bf256bc8b50c244aafcbdcd9da7782415dabd4ba2c4f2cfe8368c07f63ec9c91b93b70647d288962f4598ebeabe329de91f4581efe10cc58c75452dde64f6f2a2c2887463ccf45876b33f36ca4b848f325f0fdf888928149025d0452455fdb719092cbca63701a2d15cfdeca45e965cfcbbc52bc5d66dcfbdc5039c1f3f131a3f034dec6a6171b38113c8b85d228b88c80d7bc907c8d11b1ea99f69483d6c122216de56b3f944d7fbceae2df9cbb0d99fd6617b62476500c32d78001b65d32a5296407ce622af80d1e07e6bd523ea9ddee5751b1737d1d8f7d856cfeb5316b88778f5bdff376c66b45d3b2511be2c876e44947ca7b5770b80792805a48f611cc9d0b141a73c0e3d7cacd7984ac831652e851d524e317d0c8917d11c131da648d3a76b4a5417b96e644a9ce0af31babf68852a87012edc7439ba4c550127f24812043ab6732491a5af813a83c3701a4f5794b857d928153235267136b190e115797274aa12a8f7d49ac683ef5579f63acb9ad9aa71ca156fae383576f1c34e101a7d807305afa9c8c2912b07ef672891a3002cb3c45262c202aec0d312aa8f330b3e851d4e1a5e9b06d0e57deff5c52d493d7fe7e6ee1a03f3033d64b0c2601d5483ce79633960e8378371ed0dd3a4cb9a465bda14b234f628b07f789a22dce6c3c679cc51eccb1135872e891f5b9f10452a0592bcbe9e5aaa33da4415b3993fb6cfbe5c6fb288a03eae50ae4bd09bfd8b90b1ffc282193e8300162ca0e5e0ada4cac44d0d23f5851751552168296496cfc131dac3941f2c70f62b9ee14ab37e013e0bc0840827ef0255fe2aebdeb9dbefa63762638e0b008e42723347bca2a2820c0b20861e4acb250028dce3450179ca92add7c59a005f6a0f7faabd2c977fca17041f6a51971ce41fbe3fda02178f396c5912240841185dc7243695492ca311360f4a2133bd09787be8e1326c3feb3b66fc909a976cf9c66303818333349d28651ccd12036708005625f4fce8dd82b9c2a8dc6fc252f9bd9aae4889813420c323ab5c4b552a48a39e7f6608f4d3e1d1f610338d67211e692ad53ab33d15f299ba8c9052f0a1cb9ad61b89f7c58ad728c4aef4d0a3fcceb63f0c054708af415ac6bb4d3d4ae4600edae468ad5a03a60889b86e726209023c4ae695d456eac403af8a6acb476cf50c3c21c8daff66a8a3dd6ff98bb4c6dfca58317e892e8729571c2b7d51a09e591c4cd5d058f1c5cd813496802cb70ead8aaee76222f80bd7046315a4beececf8abe062812c23b79bd9fd97df4c7fdb8a747881167b73e173d734b07bfc767c28a292b29f947e74cbb17b3e2c6413ca0cc6ef5d44d76fb7b02100e237fe0c6cd8a91d3f46e6bdb535b72172dc269c80dcaa4e83ae4dbb7acdb730a40e9ed13a917a0659c882b11ff77b843d170432bd5f7d583b540725fb648b28b1b79187720b45771c16fdde3b370a849c89408ebb4fee96c83220e62f91e7d2607e2e022ab531456e47cab177ec0a2dcfb643b4667f2085315d53c62cefd9c40b8e49e71cc0f44c4e5830b79fb10fd0c3d58147965657e1c1af943e16904b1e9174eb1e997c100d10bb7afada81e662af6946631a18bddcd6e6a6d56448879993f7e4ead57991523615728dbc4aeefe630d15d6bbc6aab6c03dcec72612f6c16c0bc57797e39793fdefcc433d25a1cb70002da6fdd2154fc11bd1f65430eabd57158c50588ca6820a8fa63c36b7a9f31849cfae94a6037c0d8e4a2ab8564c110b340ea8c9f25de040031e7d022ab5dbf1ed8a7f0ab91de9fa47533192217bfbf955db6ea040f0721c62ff385edbfa4f407036ae3a6d2ab84ac7964dc8801665dc653f905007e657d11192418faaa487f85543f14402b2cbf6cbc8376b34467e90c11b2f58109cd120b9a3c548b16e229bfc8fb03603348af69bca4c05b4be9baee5d9648545fd1aca39585590b640ea4be7fc24d95b98ebeedfaa4ccbddac4910a5c7d93d4d5720f06e2e728048d89e13d7178dbc0176d9db51ec91dc0715405a80d54e813978010092aae6cf106290bb074d0a1c65934dbb8aa0ceee8c2a36674781f5c548d6106de93a17797d650ae090625e4bb65786645d24007a13270a8dd3a7bc5c4ee8200c15e589407def7e93111f35060b8ea1b89307d0190e5b8207d72c13d97e1b2eee06959211d5aaa08a6a425a8d477405fb78ae2346dca09667563e65cc997d3f315ece3f692bcce302463a608eb983330b79bb02c342d2dbd44226af1590e6b5b880ace51cb9f00b1bfe24032e964cbe283169679c2ff728957ab9018a148e4ddf93a056c88cc6ddffa0ce0db8da2589db6a79f4b252beb69cb05a9bd1395eb13478af92c4b2a469369359268439de951bf31eb064f69bfbb276c4f1d6526118752b8ca82553c238a06ff7dbc185e0590a41a51955854e4f994549e42926504d3558a58ab284130397a8f5371ad7bad9d3fc8ba66c1fefe6a2bb5b55bb4c10bcca7c49c88984501867787a16566a1d8006fe5aa8071c57f270754352718fa8c66779f10bc28b46ee201c7f23f76f52096ca61945ea5e6ef24e662113fd3167152e507e21710401471b094de5edfd48e6592a8efc8b13f3461f75d05ad357a66aa16cf5e320958e70d2673cb89255e042af0382a9c285594a31f76ef90901fca6e4a0f7876598ca3a04c1c016dbf6d002a89107f36c9570ec2a5f89dd550806ef3a33beba9629b0e316701c38212eef0c1e0681a87e4ca0d246007315f707b8c00a22e45fcc8010d4eed6019b5956e10378bf6665f099da34113585294885ab068fcb7769aeaca3a57101c64818d9dc99757f68ab6af6b9ee4c324d58b10c0de66ca8a9c9a0ad19914e6b16ad784438fe5691ce47e8dc675e6b577bd92bb276740f6e3ee8fccfedcf724027a7efbebb7882214f6da0d24e358ceb1d7c037acbcf611b0c569e4d8f99951a88862944b63cdd208045d920a1b0dab2005c8f3e4076fa406c0d5c1eb23570d83a67be317ba0b3a888f72432c93f4e6a1941e594b43eb48daffcc00099fb902b4f96c35c27e8ce7de861f46eb3c51a39a29e2a2b048b646f75c4f2dc9c7ba89d4ed20df72ae0c642abcff766ab4c4c96fa46de07b86ab72319520bbc4484dc96567ac7bc6ed3e91c63a57bc5b7a3ff5b7fd7d5ce3558d41e341cbfaaa15531a0b5c3570970cd79c2ef74628d6448d77f65f9c60b04288de2671ffdb2a7892b3b2717e881fc3499ee4c8caa9499fd153285e12d063f7cd98c7e492a92d9b17e7d98e0557b6a4f88d671db5de21ed85312a2cbd6b119124d0f84881e0745cc82a8fb7bac4e83388528bfb901150fe1d1d46d86a291357fb7415001719a7e49ca436a734865b68754d28e943001d218ef2d401435127bfe989f03b8c8618bd845aa3192dbdf1d12d5f859c9042fa9f361f5fe1b0c8e292c07e1b8d436402186bf00289cc5239d93817d97d097df9637d579e1d12160c2f235d482fe5dd1c8e060be773e5fa4c95b425680e0a614c93559e0e98d0b44ce21923030326987a88d063eae7d803ebb43a13273f460cf81d79c22cb2e1a8d10a28076d3a8c8ab03bacf95aff32e4028f5766551fd448f6de0e6816e697e7beda40a7e987b285ce84357500f7de6d78a8fe41103ad07cb9525fc8c842b248bf4eb80951e85b708b0f4d564db3b2a1e0b66709dc84f66d85cb606a0348099b65349e0c23be258232fed91cf3b71e62b647f3063eca3c27738d6bdcc4814515725fb7416d8231ac73808f73346d78a79f95b1e5d829d56de2f4cec4d044ffc1ef29f87888459a63a0638d22bdd04176f6272a59e65bc0bf65d1f6b5d6c4710713fd7cdb4b4ced4cdb185bb945f7e014d0fb987b581334c0e72704210ebc1736b961a6413813ecc122b769a3d8f537a8d6e7484ee864facfaf3f51332bcc2ec88b34dd4db3c1ddc0671dce1ea75c7007a6776d0547760555a2ef36fa081bc43202c1582084207fc9c93d6f160b258bbb016e92d71625f9a760812893cef89e6fd729c151062a0f356d592d1059bdcdfa932a1069c2929e08847ed7ce29fe3207f422c14888c5bfe20695931ed003f0ab5aa59ae1e2891067a36cc5ece7237115a7c65566766496e87e09ba0ad1f7ac189f0c0885be873a20f40e12a60e27fd59a92fd59d41e1ffe683745602d342704f623208a38cfc5f946d074a74bfe9fc15c3bfebf58990588d6d48ab3e04b8064cc2836966d0c0f063688adc6e4fb3fc82d659bf5374de23cf65f1e39dac29b4d5a6df768f26ed7887f33f17ab7f6833cde94be15609dd83e4847ba71ff3f17d5c5c7db5d38b6dd34e967639be6b450fc0304dc588b6b3c6c8ff52260189ea392e098b73fd887ebed8e23ba8773e00b88578def729ef633a63c036e7471cc91ea1d1b045021555c8b0cb8e9c5086cb232a11dfe316d5c421dd80196c9abff98bc9eaa14fa6fbd2585f68da0b97af81266582aa636860745b99173a802ea48f1ba5ca78c88909db0355f80b1831fe3e6709f80570994ce42a01d4f303f46ebf7cf6a88a74b0bd0ce61338c4be800b9bbef3356baa24419cd9883428ef8c2734a187ab01e70357119d9ccc26f6394b5b17231409ec17251efc2c8c9d6cd82a6762e91288bb49c93bc530b23bdf31f472bf89876bce98a813245d8b9df8115cf859964e65d44e2b05b29ffc440d77d4426ff89a48969336760c46e1a3215a3aa072979275a2f5c2798275a89cc966f91bbd6da98f606efd472a18d04354ce9f20038cd108968a9f33e233f3e45b36b5b7287231f3f397714066b10e54f168042c181860520fbce231b8f64cf57f24db74795e4a588ace03ea499430cf44606fa530d1145235e1347146bb7e1f2eef3a3932ca598a92a752324013b5d85538af4e794b3cda0cb9ca75ea0abd034e6f8eb08e2606f9cb1e0b0bd5ee46a8d74028effdba71385cf2b3dcf82614a6ced59f146e8e41be05cf7a3e9d14d6ac810bf26be90c2490c3b337151fcc267e7aefe9c55cf35bcafcdc14499b3ac552cb8885a588fe035ff3e71f42a49338daf6c30a67cba04ab7512cb4ebc4302505b4179b71c474c0a9633f623f64868ee0c8ec4a2cd8fded05faf1c51313fe6a339ae0b27fb5eeaf0bd51687e4718c87498ba24793676572166de9ad9a10d23e7d843a4af419c20dffe6192fdf13821d83aecfaced024d5bbe0a00970976ae998aaa46c0638fccf5ead94f1380edbe152aef069fdbcc99491ab864d089f794933aded2acf49f96aa2febfa9c276e6e58f050da633dd47dec3c9e3f1cc5fac19f5818581775e6c2824f11f705194108ab2e9226829aced50a677e22f2420ac828174e3dd36b0dfe05122ce1a4e7454a9749656e6d829ce77f88782c09ad18a8ede23aeee8edbdb1035f53fa0bcdaf8bb97a496c62a88778a4898f5a354137e786af04b195535928c22410d57a19b08cc0b00ac48d656463bbe0cf5b25f577219f44dcefd05b9cd523519d84004852a346a5894c191923917c42498c3fa36d260a386d836623ae491b9e34ffcd4713927ee3dddc2887f400bc663702613bafb54909cf2581ea60d69ee54638cf8e130c82777287986a7585b493837711cb11ce9af05317689ed589c37b78b804c936491ddce8c8154827c079754aa8100a5746393ba1ec0aaff178d0e5b09a57798dd3c14c3eba104fcc98a677cc59060152a0b003df559ea9aab05b738d9c6e24238c592f2a607a49deaab21691957c36a7824067eb274c4d89291f290d5cc4450a966400815c3d52a97eab5c9d7a53a34a66b688368de325404bf775210c04bacfc54f5de60ed6ef84c26c425c9819796bc1835ffa9bbc7342229fb4b43905e3ec7b2d141177cbb2aed84ae6ee339bf8c3669d9dcc5397aff1bf536ad2985a344ea28501463c31e5b5c3e5767474cc21732d9bf016b3d56e1a244127fa72dcc9ef32da8daa164284fff3423d2b8036c01774cf3651736a60602466e62327b978c4a4cf341713c4d8289038c933ea8bbdf4175e2e59177ad06d1be87ab8794fe65cf22afcb37e5b77a7c18ce5a54b49188e6d897cc991158c2599cafe87d40e6f8b7a4a92f46808c07213626bcb70a6c04540425f43374b96d8e95d95b6b0a11665dc1762114b214b0aa3a9bae7263d94458712592aa2c5d1dd5e8a86d89c099ab293ed39a767500bb5e76a6d44c0966443358e8bb1714655a0335b1518f0c7ccd1db52556b2598f7e68e433f25988ad6b4fc27b3242ec1f2f70adc159d607e9f9d428f53dfa04e91544eb6b728cba8cf924fea4da031b39b083b41479de5eb2ab00abe1e2730fe6da8f2690da044f73d62318808af58c6a84a739a29501fa74b7489f1dc6f053beee097b1690b9298e72873b6aecc1334e7c1232f8305209005e75880559d5f24f51c20630137f5fbc685d4ebfb70a0792fc7edeefd0c7ef1dc940c47601c88988a77e823d0f3ee3d38cebbb2bc728dafd0322fda83a1d212e2142afffa4c30b6d0df2af124ada78373c57104094d724351ce714714bfcc2b1442b37d2aef90381f9d759611cdd0671f3be59736b3f4b2b914f0c97d5ab6e4ebb8262bef559182aac1774e77927cc2434e80fd8ce72e6da6d937c971076f1bcf00e66728cc305d550f262d74a76b189a88d6e5a6a1e7bd166fcc9b376c6099cfaf743749b288da5419591b228ec004f3bdf4bf8f71a2c1106dc34bebd4047719b92995b0da88a7c2f66aa949f93072e43f53c3f565ad383181393d4e8d86d0b29d3fbc83ead17f444277a5f078939a94f2e6e1363f7ec27f5d882fe7e489dba1029e5eba4b530ce28ebf1e4b3e3bfea8b40e3ba255ce0fdd33b96e84685713c854d852095860be39affb67502f80bca183f4ef343521f89d1836900b2abcb692c1378f0a74512b2d29c0e0771af079e3f4ff86c08a90b99dd50db8322219e14966b87da4ce6a4a6fb0947312b4dc98b73b1714d47d9be90702edb583eafb34600784e6f2c255e5e081f75783d359184d0fbd1ecea6c881e77dba427cd19d60f1b8c0c08ccf7433fba403f96afc5b25d1cbef36cf1fbf88ef52badfd0a15f7844a2b6e202724ad22d719ef39b5d72ca02324b12cd95112a23160d29869fa0804a10acc2c279ba89cb0d0cb2a1e38216ac82a99e69af8a0d6078dffea4acba5eefdefbe4a8a4ce33458bda0e40cac2333725f3e917b942e296a11046c4c468b34e31fa0938a7bf59885c6f7418b348b6afa624c901a80b7bf484792e978d2bb12716b57883867123269ea2eca9307d08452d96949833ec6502c005aaf188c3f21027f32c280d1bf51b9220362bbc9b317f2125a115c7152444486d03ed2a30949779411455825df1d994ea2dbc81499464def0c14a0564811bd12585da0ba5203e963fa7090051a43b6d350aa00f09850936e4f1dea7797cb3a94d5921500e7fee87103711848c0a23328dc61647d73dcdcea8352c559d2168f797013c2008a2687ebf236a12f6a2308998707d2abcfa44e519a952ec4113b0220b189f0ed39c2276b713632dcd3a1dd0b82664a4009e85c26426d574dc1969f2eafb2922905750f3f36681432f8a289a8d809875cb281f9edec05133e19acb1562c46f6c2ea0903797edcf4442bb96e939ebf614063aa082a7fde4c6364b7e0d233b0c09b4b7b08dad5bce83185a51a552d2d893b2180afdf70fd805ca13209097e6a4b8c4fe92ed53acb374bfdcd5c663d7d60f111eaff44eec7912691805a4d2f4541ffbd9837005f62e2e8f5b83c3e49b880c82a15f3516af27dda129364745cffc5cacfe003e29cc8e5bb76b94b905c75b63825bbdacdfd703752f354419b84de2819c08f88db26b3d23bfad03f8c4fb6e2372569a9433944e5399bbe3d7984b5a007d7441d8b667bfb49932756b1fad63280d3be7afd20e53925033ad11181f9aba9f98d0c5f65e2d0399021754c9a01e734ade9664045ced519654fae5a2206c6d4b9b1880ee2db016f88f1f6f9f98b3ac85e44e58c1b78fad18c7bf1f5bd61f415ab0693c7336b85a64c8a04108df12cdae8b180c044127098aa48afb12f7dd384e6e44cda86ad6efde7d3c85a3b6f63406194c925bf6650ad2a2d3a93f8864480e6e45d4e2b423974466461a07e4519199bd64624cde34f9a163ec25b16e70d733b9a1b9ed7e0fcacc9d9c4a503f0c087bd4dafdc9d79b88d91759b35dc0c9370c491e1a27104804fcce6b80c29c5de86d1d9fd386f58d97a46c7d06ff0c86df24dc7078306c2d9dc78ea2883056ad4d52f2d70891b55549d06eff22ee81295a3cf0d20b8e865b9200274ef7f37648c55b2fd32ffe176d7666cc4c56d1d6540240eb04edf7c18a9b263eab538bf74333d97f164c81867857a6f814c527ffd240d3d67c0c6534799ee78bd5146ad41763332e41370d58a29cd34477522ba9638942fa14524db60e279608824e7a8f943bb8a448ee95e744bab7fc05f508acebd614995b363f83d620309cff69ef7aca5b3ac728693d4f2172b1cb68dd3affef9ca485bed03b3b45ebfc897059521b482b2f6e1977bf669fe89b9ee619cf764ffb819d5897ba0a971518de3f765f2398c06a4fac5be19555b6240beb0fc7d547d429d48b7960911a9e65ac88038f0a6c9ef03e8cccf1ba246767ba3d7ece89f20d31f51968a0682178a05d045048635944ca0ce456cf4d712aba4714e9b576f4129f59ebf80f44250b96c363c09644eff070b2b71e5ebd49ef495f475f9d780e26a81419589546094a56d05f5e29d40ab9525f129abb412a4835a6b2dde5833e9d3bcabcab3df2fb4ceff8649b87731b890f53f36df91c8caf79e6e59cc5145368528c1f84aee92f4f4feb671004eaa13031b526b91daf6c24b9529e1b067c7a3b84f31ba0eee74213a92ce646aad6b9c2ef4aa30806f5b4b27084b425c214a5055e63b017cee785123d488d2929fa45de901d74bd6fa7f4b6d6a353033a5bd6378213eef822ee4d25e20b21a42e6bdaabc3dc5f710643aa9e5a30679b56506340c175ae33cfb463e605428a52493af6c5f024af9f92da9bb40e0eb220b1c4b97de1fd589cf414013bb5bedcbcf00cf83d153a3d0f4c09d0ba5db483bb0862cc95a9bbdd6956e49aef35ee114f1a2451c3cb9577145fbfd374c022c9ac747a594eb070290f5a00d7cca430ca2c1aad2e8d5470c766e2765fe473d479f670c01d792c3cc9834e4a45df4c330e0990c2c34f12febd9117a56b82387810d77993605bfa9802fc4ff1195a07902fcbc7bfe1c805f1cbd2836ec781f60e388f0d5645fd61cf5941fcc2dd4f89175dc53f7dac0608ade04aa6f78a57a525257c0acd349845fb119e20a387f4a716c78a0407dd838a0930da3fef5fa3ff3b3a7a113467f4d01d305af8c99de15494bdb8c2793a9efc095cb4231646afebc85d64cfc19a888b30e319aaa4a90d9d9ab67c9839cff743a149bf84286848868bd0577ca0305a59b86a7e48ba74dff65e4f148d15492df8b252032f9e4891adc71180dfbb4fae62dc48e335298960439a05d824655423ec8c1e0cb004aa24919349015b9dec28fc8b0723b5411b2d984764af500155158b87ffffb3309109b6c626a85768137d4bb4dd8ff404db3f1addc800ced27c2f4c7aa4c826b0260a9f4b37a643105528b2885d5c2c3aa6f4d40bc7eb9810279682199f048ba4d19a24890317d77e4b95edd68dc89597c04c362aff04454d2b2575e9d860ddd2ea6bdfc86ddf389608df00f3dbdcedafc70eeca64ff7279c7028b7463f90b81fd48c11fd44bafd38583be5f383a78b76405f40d5571da405e971d401eaf9231f5f3a5673f999f0babe149037aab2046321938f50144ea56be6a52dc178fe7742ede0c65ce1481dc46abb0efd7caba5e2fe84e206db34362fa12215de627f529cdf351e6149d700de4c49e940a72fb1602d3e77d97158d2ee0ee12f5fdd0b0f41bd111ff5d41c3fd5009ee082cf39cd110226e589ea8cacbbb1cf5c1f197b3c5fd18e5e9ab44265a0575fd8c8d78a03e7dc20c5da9bb24f4c2816b60968cd4da12033cd221a80e0026e4e6949ab03f78a417bfacf8eb1b39f3daa58910fae19c5a96944fbdd9654518218d92812c9d44b1187e83093fc9edfa10f940438772ca01dd85b8d18a2c80ae4989332d3c01526ab557a5be8276aa9c90cf6e6c193870c5cfb66d0a5482fc790037388e0e506dc8e37451ffe88b647e39dc489a8d343e9ef9b12883520ee31a64988e19340cc0f6653f1a67b8514fc99119d47210b4a15420cfe14c476e9d94558e6a1d7035664fdcee9d4c2b3e2e83d315bb31e574ae2cb64c79d98186c636c846b49780ff234aee255fb1d8da095210322ca1dd943dbc3551ec2192a1ce6c318d2c351ce023b43d29262516cd5c42ef214165f0fb2686ea311a78d20b17ca75148263dff2b76ad03b615dfcb77c9bab86b2958147450c19c8c55a2acb1e03704eef46aa60a5f24aa1ffa7af8b8f5829320c56fc060d7ece5c3c287ba8b66f8d4007b678edb790f0de0c083379bed848ea827b85ce2d7e297303502eaec5ed0a4484dc852e27bbd1da8a6e8db30e6c56e2b8c7202df8efd7d123553754639da6124294219c933b02a440eb307fc14f4c62183824be6cdb62ac531c1958fcc930b759ceb9255c8b2326cbb66b500bba8a1da8dd7e15e82c2ca3fcf5d30dc06150daa3bacb80da321146627a8bdd1d025f1856e19d5c851daa2878e20e517dfddb92e2876ea261d7c35c217b7c235dd0a4d440339112a8b39a3746d2362f310f4c0173d3e2f742ab81396613a30f92858717af7b2a74db57c4c078e93a5011a0e305ae1cad181673719bdac2134f0588d3014ae9b954b964d2a2531c87060003865e01333019f6dc904cb1b9e54cb1038cd220a6d183a97243582cee161b84e8d804840c6993c9779013e4cd755f55243a26b7310f87face5f0a6ae4852873398c8e0758aa4b4b49227f4796855efd980ece42e47d9e090cfeda1b1d08db68c4ffc886f149511ed9c4f639dcd0acc0e09b0ec8bfc15ecca6c0ac752e66d2fbbcc413f6da20cc2010e5009bf25a8bb36f1c2f42af893d36d3ca97fc31c4a659ebd227ff3d0a6846464c4ea6911dd5f63b22e3a67a96bfbe13edd9243605522a0abb543195d0539efd8192bedf25dc35b67ae1e0fc39ee72438813c7b9a0fac1dc20b6d7b0f837e0ca3dc5bf381ee265d2e4956094bed670ba876ff9efacc84c56077d9887962842c91de3401300c636560cf92e10547be6727e5b8781037eb99156b80ae8970d128f0bedb61a5546fafba0c425b05fa6d56f26e4f582799b7270eb76ca49f60d71895c57fc8877d355a82d39147ad21d503940945f659c0a39da825ac90ec05f77fba18f0e65fe58effb7c1b09636773e7c2cd8386857bb633f0a15640284869332e8a2bc76714b206d5b9c02d5e44dd5f22bb1107807000dbd25b42eeed82fa6e0ae3bf5ed201d26871b5ded2de9332f98d212774c91f26ece2921d5a1c8b3fd8461dd57abeced68856b8f73c05a33af8e54dcdf5d9cdae16fe9bf427192b682196a9e58e053500348b6f226fc45c58fce74d63e04c4dea2ac65e56a29636991fa7d33a79aa18029a660968843356cc4013f0845e0f6d9ad143e0642991229cdb83cf587088a51f5d76c1ee215d2a502d729fa4d397dc909185a3a4abe28b6a279374362fe6107731171e5855bca6d1020e88053a402277758b09ff80e5e3485fdd9c5a9144f5c11e2c400681350c0e049f3571f6719aea9b9a92005fff629defcccf19c358bf4191f01080a1c4802810e058b16ca730e1847d43256a4db9f18c219101c25dc453acf9c3edb5b52525ce2a340c054b89e5870f84a94718663a2ec6dcc14dda733a9c005e20fc6cacea15910864a9ce808a78217d83e814ee31e87518b6ccc45fb2543b629e980af36db8e5bcafd8002a15246ccbf986182f809d546f1cfb079894104b10f548b2a38b896ca5bacdefa4fb921a9edf572c015a529c443e984077f522060bd6d851ad932a698b1290df2fde8d4868023df310122d2014a6bc617b9810c1874582b8ee5135ca2484c81ece382cd41374ad7386c071ed1cfbe0183ec14848d31802796788231ca64374ae1301bc5b3cc6830c344fadbf7f217187c0e802a0f64aef588a74c64978823c0dfe71eea99fb796c6bd5b8a8ac09618d89b5cea81f72899474c8a1a43663871b3ab353f6ce70aba7067a22d5410b5cfd7b7dc3d46d8899ac543ee52f3b0acde6d30b0077a209a207a02ca4d1ec934974e2a1b3474a77cafd42475ceac20fc3ffde2cc27eb7951420e5c4f629b8d0010abd436be784b72684b751107bc8a11c978df32ebe854d4e913669641e05d65a52ffecf95b9fb5415dd948387fc8019be23432df1de0bb419f1e14ac9e911b774644df2ec9fc450944fa1a95fe42ed971aff3be074007ad5996791551684501c75f244ee781ac4ceecf4906c93e4e6b2e74984a04f0b1909da6a1a78bd0eb2da32cedc20522e992eaff767826fd014d5d71fd1151ad44fcbbc33c35984f06034ca5bf6f8ce9f050116ba2c6770d0c2af9453a54f538a75b4003e6c14fd38c1ff1e5b2b98c88b46d2677062f59ca150ce3465001a1a09b671acd76835091ab619455619985ed1b38ccf1d8f88e9acb59a2ceaac1ce16e5f1d40c05d5d938615a1a3aea0e31dfd07ab5497b0245b72a0a429a3eeb9294a370672b0f7f3c5358eea67f82c9c349134d032839b9aff9d932a36bc51e2c80d05b411673c911b963a0b0081891718e3f61abbbf9ad57344dbd91e5433f18fe72214a7d2418101f142fdfa22785f2e024ed091e0091b4f675c94da961007b0cb016f8a594a46e2c3dba35530ee853a6ac6177fd7db8b22d3506c83503f32b85db439b30c41a31d76728deb4dd4efb3305a32fff365b0a8922d26e1700cdab25d17df9eb69c6f9d8f182d1f0d17eac033b1b4d2745626dd30584fd28b8f3d032d8feb0013713f3157ec173cf85f3b99b6341698d123c33fd247145487425f984f4744f726fbb2cf9b3c86ca9662e700c105bc179cb44072fc6debccdbfdd7cd95a5e8a7b53b9644cd56fd5dd92a9a731937f2306f88c94d9894ebd705c6ae6123920b9669f710dc150480c3281290223eeef0cd0e817e76ba601c8a56f9d1ec3f0b258ac7730eba2176608da1b58f6aba9c4c2b86141925f53f6b24d5c92a684f18953597b000bc49f1a81878675bfe7054ce40ee7f97a731431a9e6e49599edabc2a131a9ec5d800104659a9f97ff5ef5b83e61e0e388c1799e912b78ee1db9baa5fbde93eb8c23248ac64fb3443f2188ae60b9d8fb38228ef6169beedb5a1f07a94ed89ba585617a86e983370d6c0e63ae270a0c21bd39e5fe97b076377f65f5ba26b7a9395a014f36847782d720d818bed2554fae10340bf87975b231db5c0e4ac9b186af96738f5171d01117b5b5f0337134fc57ea8bbf9efc4a6b0b146b063e930154d863152abbd44b742f2fcbd39a2f48bc3ee4e9e1a9c1f5201f7f60a8bd0984901d27ef3b2cb6768e38239a113a477ad1309cf9dd790159f2afda3d8735aaacc2282a3875120173d935bf9aad78f4b0c721d7c9d297f5718bc44102def9c8b08e1813ad423863ce46cdbc120e00163add7a03ba9e730ccf9e3ffd5e3870f40e96ea6e4dbaebf99d91499650b48bf6ada82be1cb3950c8a53ead3019aae2d580301670e3907da2a496e6c83281314a926aae06e7c74ab2315dd834c77fea2a8fdf670d0ad00d5173e3e925319651ad278da5016d21bb15759f53cb9e21fb0ef269c3eb7bf10b2548ce37b123e8787c59ab9fef99a8f83852bc242088655c185a79ee6f1e7035bd232cf533d4398957808991a952b0ebba3cd488bb7a8d037ca3444958c4fedc2899d3a7c9756ba86d1b8187ca2572ec71049292afb242e356fe063362bd866058fbafd1cb4156a44145e62f04b5344b11ed693b00f3b19f2d104a93005535f54d70c67872aaa6ede134332501d92a836d432fe5d8601984741fdd99edb2a0034efd7dab63f204fe8fe7152f1cdd243c7566c75481335c2c359867575d1464eafbccfc86b19c70e946837e9bff206728e70ab1ff5c34a194ead781e4bf3ad23a6cdd36adc765d93715d0d3351e90cfe2df56b58f4441ed837219c0f720a6d319e6907a3ac909ac4b65ceb888d09aa298348f3fe1fdcdf3cf4647774dcef871e5c31e4f0a60c8201bf8360ee3c45a03e05b4b8b3eff1a0b51dae12dd4080b25814886547b060629e11c5dcadfc608711eae75325fb93323533cc1d5e2a291c5482e5f61b1f5c2a708b4dd9c91c2030be3e158c12d33a852c1235623f03aab587180794126d4f2b783045ce6619cc549d51d1133e65c68821caacd985c4ea1592e531c29d32c001a16dc81bdb6f2117b466f686d0945a5612c87215573f83e151eca21d885a54d16aa861b42da0900f7481ebc6d55f7cf7d58d5cb95e285d3560a098fd8cbf2a468ebb520188d6f7886fd1765a76c3a896f276c435bff3c6f9c0b93c08674a82681a7a3f09680250a17c4f603f2197ce84c47a92b381232189b3dbbb907bb0a9f969d263c38f062428e680764b740a911f6705e040568c533609d9e018f1413d71de4e8811f47becacb8de32d29a3b9de210c8627f69a4f4a29bae42815524bcc73035b5aa2014732449d331b41646d96b766ed86931a8f16e74a7959ea9d59a695d5f82b244df53d72f0cc498a45d5abf1bc2dad49fc016c50100fd5935a432305519eef195affc53c0f419b7eac9b70a8feb891f8bce98a778086974d71769cc9e643dbed2e7527e7f059eacdf25238f744f0a605d4885349aa38d6415b8e7f20f80bf5759aab715c42f46a0cfcc31b841e317e383d154406eb346bf5413cada481f5a1b7c027b6ec957066dfbfd42ef056bb7d6b54b836336d4c89bed350233577ed25db424dfe8e6d8600b33e7f29bd109d596113e56b5cd6147edce973ef9c3a334005e2b1bd8e5c00f55da192b44011c091d4f54315ee6f4b6cc479a39387617df85f40f5674e85b92d6e90f275b2772d2639a8773722e5ffb35dd9897e5cb2378d8326a0f471d686d9e53047ed15ed324078a430964577608360b677b78b423f7a87e735c19e5bc95930aa8893c159bc91af99b520cda343f4874dc41711c20ba274fcbadcb05944aaa6fc2341d6a96189e00477600bf27058212426ee737c0c1386abc3058120afe5c93aa5c8b2c6b583c8f20a5a010eb2f010c09899a9e545e7d02cdc7b5e0d762988ba777b1a214d3f1672b477e697f3f466e69e0a4270f8d450050dc162c178522683e613825c41fcbb9dca28f94070a4c04d0f740eeed2291730433caa13191842f81697e8b6e55b0ec711121e1591643a771f85e7dc206bf0687c59ae8a69f5d23bcac7f96267df38f80754165c1d1d71bae411e604083dc0cd4f248cd83021129d498794de8b92a6b3dc14e6818206b76b9ed2c031a9f620337e700cc2e52fb257b3f5d06805f03918441141ffeea801247c5ca64966bb618cd12095b6261a17ca2c451bdb2dcc7b0d15833e41fb9772805e50e21f642ae21e2e90b4f63d546466c10de86493f56ffbacc7928ade04b878d3149f7eee03ee55e96659fac882eb1e2c3310e1e5248a21470771bce9a72b208cef3daf7a8455cff95e579c864379ee2a26f7462c409b5441dcdfbf3b333058f6c2a8a399006299b634171d1ea9b065adb7399b7dfdf17d8aeff523534fa7d8ba52f49ec94d2d59a63b701f0029f2d20014436b262a075e4395b06181ba353a37d92855e4c795b18acc6293a39ce6dbe04303dd78460d457535e8c4bf951a6a471bcb5a00e233e3b7a35485b8d3054ea305088ead83549abd33e470aaafb8b668b61d64bde7086a20a378d656a7f30fe71f95f282e116835432eff272126bdc312c74b3538019d3a9d2c94994e3590d273adc295fd12bf823c69b8ce02c14a8fe3352999a0c98ed8163279ad24fadccce9d88ffd197447f1f91fc33f5b20dbafc86ae8e89dc3efd53a2466d4c859c0290fde3bca14dbf3bef1f99535dd9293104782773206c7ee09ed6fb10e4936c9d8b86fec820af511ae151769a1913643966d73092b801eeeb1a0531ba8c202ce0873260a813c0c0b9b76d9a90b3ac46bc1523e6956cd1e85bf01ecdddb70b933ccfd8c92dec9cef35951a31b462770e417446372985fe4ad025ffa3bba47734118458e00e8bc9a706aa21dc4affd73d8407e350559ba6c4e941c9841e4d2eca936033744db3ce653372ec4c3c9bbf4137bf951f4dffb5cba17aa6d9035f6458e321980ef8a661e3b7cbc64d30da4522a8d9798084df1b60bc29f672643ff86fc6e0e364698a588ebb7d9bf34d3b9a7ebb78de93712e81705fa0eb69e4911278131f6fd63622fe56bc47b6d3a4d56950ce962fe5eaade0f57730655ea8abf8ade76b65d2f931d066df7a5a755b32c0d4503df6cfc8bbef51fba7f345920db39f9886f56bbb90a09170b65f196dc47ad219634265f4a2efd51c5d40ae5918208f11ea4ffcc2afc46099f984410587075ff49089408b41778c83871050ef6de2b54299864a5f44946f8802e5b359b0723a4d278cef6526c6e6d3550c3801220322c47af03d60e4d111c32277700f199fc87f0ba46bc4b229c24ac4b5aaf8b087da59c1850870422316002e9126f0027ec370928a253c02dd1eae2a0dc01421f0e18051ce8ac8dbf7864fe5d8e609a48f404292011b3c73d44fb270bd81175b6489aa24f1c2fe549b686a31fcd661ff3d8a15eba18463bc08bf51ac256e58d9ae965432f4ca6cade812747158790b5dfb6234249512b252352250c46dbf2384cd9482772b24f5230270083eca9a57c703995c11f95d204710a103f4f7c4a7a94d98ec8f18f10ccba5c6c5cfba113fec12c19f435d87b837d9b87bfe6a1b3305d603827b57ea142be25e3d85c34d79cc0faf6b0caeabf1ee3dd0679bc69fd003f1adf9d2866249167d353d73262786e0383a9cf2ac9e45e97ed20f54fa30e0f4b76446fa9e89dc8979ad53b8c1339448498e0a4e0ddc3fee6a19d133ee2db25c794cbd7339245df20c98e846cb1f41a824b457eb799f665b653f6dca648cf2d2eb5b3a347e10ece05064aaaed90150333c9a025d11fbb7ba82db94440de0f55c69f2965b4a143f81f71cfd3eacf76fb6b2052e8e7ab538c922c122eb3db094e8831b3c41c6afa6c1ca8b37ff8e38c83dcfbd7a6e3e2b52f7932e1ba4c4ba88d450532e975beaf7cead8439d43dd6184765221b9b5116c27b5228c91374697ded7c0df73ad182f44d113068691a1e38e6dda12ea99045217b373764d84c54347a148084a0117c20b6234d2f54fb1298bd763586af6e24a65edefc04f3aa177ddf0c66851f1f2cc5c2c7bcdec514cd2e7394907161977cc027b71ec7807fa0d90df52a9247822ec9906dda0d7e10815feede988ec7317f4b9dcc17e1e95c64f14593f889813e7044e870ddc5a556057676d8ec890e9dfad1605eb14ea1e91293857204810959dfeabcf38f61a488621b0bfdd060fb091fbec1786a0d286570971d5f8903d73733463c01a99990b2440d05b5510459aa4ce116b0e1baa5cac18d46fe0e63dd16662c045233952ad02f73c5adb3df28ec418193a1d0febaeccd90c878a7382b86d85570dce00fb5022b8b18dc3190cd2e4979241d4ee0e0968d05bcb93f26cfed4d69dee28e88904fcdb0266b34a66858c2525cdee9f7fc2058d20cf299297f99dfdc7638265f8cf960d1a8b2449b6ef808c7010a509a54676106b66eae4bbc50d35436f8463b8a16427a6b7d3d199c950d7cc337dd24d49ffd810b892262272f507e6019ccca5fdca7b79592c2c5057e1c8b02d1e6e8652dfa097cf63859831dc30bec6f53217125c8ac2803853ef6cc3ccff71911cd793f3bf529a865183a1fa00c2a791a2c6068d34ec22461ba52eed33fb4b33f718e414051efbf8c91fd9bb7024795d7e7370eea72eb9337ae22a12ab504bf4af70855af027f183430ca53ae16a6c869784fdfe805330dd8f0b8bcd7018d24f39f13480c6a822ad88d1dae36133084dcc97015dfe6bc41c2b224b1be8640815442aae50baefa98dd6d25d2bd8b0ed2ba20e6bce714907f5e6ef7b1b205911b9044e26c54f1a1ae09a8d395f68c82da3d08b2eaff2eb2cfb5cc0ca6b431090e4b3c8bdc685de5fff6cc885638a28f5bb79633ced9baff8c9dd991006ab1e10e3e339b01f322960565e5b7da5baa282cc5b23d5218c7e0cbb46fbfee2e09189496a5e327c58ccd2573f2ca0cd11fec43515574a64f741ab4be0ea88f40e98f4cd16e5cae382f98b6c3a2a584a18818c2257ae8e0dca30d655c7b0307b6b0e7de360e10e8003a9115b8a0b9b8cc463f2dc2e8b1851eb1c823111dab5e38d45128c8b4f63c984aa990b5708669e2a19caf405998f820fef5638821a088bc0494d28ea7203f93908d68ff19bdad02fa461f44256bcc18b748518ec247c709ee95098204ad625cc6576a10c6461a8392ddf7ee84684c76422626de09168a995eacb346e4522bd016ff9a82911da422f45de69d309fb8dcd7e38aaa5e0477f08eca5ca7557132e9a7df87c15a4b67704bbe9012d0c7d2033a05f7d1da59f1f715181ef4334aafb2cd04feeeacc2de62bfc7a13b3505a1a5eb8d4f5dd0347c3672d40df958675d250879c564dc56f7f52c2633bbd233cd5e55fb41d7f02caa5eae4c67b60b0e1a87bcdf9709003f99fcaa87c4b4606da0a99cc8ede07d62f77eea0a4ded2912df9c83f47b0102af465abfb380087f8f926af6a2db9041de04d898895768e75d998a88254561e3a2b139c3169e1bdc26e180cc232e6d62f3ebbbced4043efe7a1ea930ff3ae72f05a20cb5efe1edf003a3baf381197be0bfc8775bc67ff714ec1e4af6b3ea91f246073e8e1163c125c480053c8d1b0de876201bfe3c2b67aeb149e85ea348038374d3d76709f1b9e43d91182cd96921826d209f79b9ec403ab38a0750269de10335cc3218752dcfcbe6305f8d3f479796e5e796840d86c2721028371fd64f67bf13b58cd5dcbc73732c0e057695df2d7b51a22bb11e9af6d100bd5077be3e7200ff34b0eddf20c82b28e96974b24dab505c6a4c58652b1be320089b8cd6ef715b175008f2cd32a83285f64284ccb502a767e018fde8846e61e57fc0b431950a6f985c4774e04810a8f8b2e696bce7922219a271e44d92851fc7e6b7f66c465c15c50a8b8387b24bcf6771f72d3a91435b18f39c8adc9a066dab57b949f284e5f5ecc86702ca64f2e061a3a46c3ae65a07488e34795fc0063e20c16fd2c15a364765e02b373bb907f1181f81525ab6124e0b42a639c44ad3e7526ca091d403b1371fcc17812afa986f6de0706a79b3daceeec75e682b58a2c977e7e2e60ee37c8ad2ee03240cf92059f3cddead4fa012c00be93a3d7a865aa4f985b4315b55d903acca1da5ce39c37f7b4ce6b735716aa940fd8429189220775070dd4947b4c00a23219f86ed49af4824bde54cb3ce520ca32da125669a8519212523425682a7a6395a008fd21e22666b5a2a83430b4af8262fcfd13cb88ec1b3cfdec1344cd36bde20853e1e23a491fc07595eef506abb93ed1d9fbdcd7e4c97f8b1774a510acbf3351164885d8419dfa3cad3594301f1fb8b493331f224eaf95313ade4ff3ac3b245207c65b1c3a5218e11a8d046966ff79e543d9342dce26cc0f847b3337b813484e97653c878e3f0ab050369648abc35d9366d1f58debfcb7666826f9bb7db52ffaf72d7bfb5cce5ac08b02e12a084469718d0597c4a052bcd98914a6986826fc33c682abc59a54003ead8123f29fb73dfc59a16be104225b0506b1f9f2e92d7353523cc4a8ae1795058a8e19dda6a5ba856f3e51faa77f913fc4255f2a071e8dba4f7ad0410651cf1c2e13b949a18122475407133842490be82adeb0a5da1ed6b814bfa471d2e9d12ac24afdc61153deded135afe4094159fe09cb505f0f6cc90b862340349fc8ea32108aba9ff6a618786c12910bff32e39953e165ec287e19cccf804b01efbdeb73d081e16e967583693842fd9395abfecb9d513bef39802e3c5c0847772b61c3f4d17835ce814fa6b077d6a3eba09c852b41c152e36d9314a12f83e751ea08f2fd2bec1bcb43ff3fa45f4804c6a80b44a31fbc06cd9652b6e76778307a75e13c0a5863ddf30b5c80e8b194763204209e2759404ba37b3881da740c3aff88f26753b8ae2526fb609a0689e5aa20f94657a56e79427c016be5bc9a91f438d4106782f531d0fda2efab10f016551806fcbd3869f2f8db5ddd819e81bd6d027747aaeecf89914eb3d544c29010b7dd91238100f1d354e87519fdf4c15bc8d0d15d53130a37e077151f1dd748842cb8baccdccf6819c678eb6ce6b2b03786db49c314b0bad4ddc555a9fd6a91fe54beb0804a8e886156c8dce1c6e37b64419b5b25b1428d540abc565e2167274ba6dac76934b6c34c73093295d0c84c9daef805ce05de0133182ac89d970f09d3b60e32131647c716748afad50e2deb592fd48ffeff216f5b6041547eddfd941797387e47c3813256af5b6b11eb51031081afc2de3f86c88249771e7ed5b446e9975d60c4b8dda956147ab398d9dc93ab7cb26ba06900295d9b57bf8f7718ed0adddb10cace913dec60941351a0b4970200863d35157141f88135b90bb3c66e2bcae3fa042ca1ee53acc23d9ff9a1e7aa75bac15c55b8744c10be54609f1fa906f69ed26239d500f2f44671ff6b111733d33dc1928c3e67f9b4451bf022f9d12b1a746fb1956e41528864a6dcf78b25f9e97ada66b947429eee50c042e7cc7c8548f437b227a773f1405a7d31d7e079c3d8e2d1016050fdca084a4ad4ec42d1a5a244d884596738198802c5e579638991921fc23aa302010040e78297186a44200df162460ec2474fc477a982c7094bd4e2c63352515dc6067fd1d9b8714d5dbe6146750601bcd034f6ffcdca6f6c45d2d610afce88af5db1316fdd83fbbf0c0ee6737942df0255ff62c3bd346f218bcb2a3700a5bdc5e890a694f6c12651ff647c43f830b06ecd553527de8b2acf78b5e2986fc89d5de2183fbea7367054feed41a13130ba7ec287c5bee7f11f0c9c3c840ddd063d752db25b1fa47185136324d63cd827654e813b491a1ec18f65f33921842771563f47044c494ceb3e07a429c405ab4aac3dceeafd2c17f9010b5a21d84329a5e99f053767eb62dcf5aec10e9f3ec96f0542c61e1768be520e3fedd67aa160f4d44f996e5fa9f9c142a6ebc94c4fb462400318b17f543abb6a816b1f0ec1c4808a1036d3651d216695eb9371f586f3e7b0c9d874ba55c85281169bc4a0b9297ed9b312ee1bc70b2e4a57f563a8676780d2846dddcc592d3af8209adffbea9a9d2d422956c4791aa88ec5ea0b3fc00f0880fcb86ddaca78b4745c8bd18ea602ad033796657d6ef6edda0aea8bac5518bac94284d437a3701035fd7ede4a6b6b84c90a02d236c724ee96e2f6adda5459540442dcdaa52a51452cba8d17723d121716b70ada2c21e2115029c16dadf416a698400b6dcba2c130db5277b9049b81c352835bccd7af89a35ecc03e5f3b6a36dc944f9060fc26c9ba4d2e4261f104d23714e92ca4ee889ad366501e1826ab5cbd4a0fdbbf5e79210565a75017e6d049118e6058c87eaee25928d74a8de1360c25f9ed31fdd438f8c370a8b7eb292b563a428aaa9821d7d08d7ff7b9d8bdc4085276c69af24d4188d0d770a2a93f2823fae28b4de99848bd34b2874d802daea78a51d3a9f717c787b12ca78474f6284248078d7e00c6641c3995003fae6f60231c86df1353ec907c1a937b0b4ecf0b5d1ec5030b5de9f042dfd5ed68f0edd0352b28a1301a2534c6c1a9e6abb8eb31a8aca7488fc555ccd4a519049cd781c0bd5950fbce528c4e1d785e0f426b4409ab1463172d9e83a98a123e295b9cc096c62bea0362c55a246b94ed3293bfcd85460b42cd5ee7c3fb5c847afa4771550d4399b50701dd5fae88adc05e7b60c44f9678957a9d89d0cdfba1d68c3089bf1d4f7c4a93fe56fd5e59613e61835149b9e555d8a75706e18f5eaf8988d7c5958634768a05e3118deebb4f6b81d728843149402c4209c3f98c564ca329289b090daf207f3f29c4a0f9efa7660e4df368fcf7f0251b4394e4e9e04b138982e871880e21690f007bfd712c34d619294359375e82c9d7da3fabf1299c763afc9fcc7a44b084eed363715cf206676f0058f650167dc70391cd1eca32d7ad6e464e2c1562c17daa9bf310b606c16ff125115ca126cfc0bc42dcd9ca9bcb3c242dae7d71b5131404a7743c8c0b338e412bf91f2b1a6f3132f7bb41bd203db12c290834f44c46c1b859baf275248b9aa96de535278556500ce46babd638eaeb8415624c948d569145051ed5cf99d9e98d13ab93e3980355ad1bed8c682d1de8fa05c0af78e5d85ac55b10a15b71511e89a25958139a5d1efb8b871c905ba615297e0ed22f07589f9d7c41bdcc44cb8171416da19e3f6bc5be2280b3fc636abd6d1514ab86a670b9c38425fb64cbf64219a55524ae666cdb7ca8528567b210a27cc30efc19790ecc446132a8ca804b5ff4d80801622d04f4312467c8ff01a37b6fd6972dd0551ae41c56340677d7ea78be07c019770b338168f84fd0219b3656ffa19a202b41ff65a0c9e475b39ab4d6c175086341df6d4d1091d46d530ae70019bb9a68e8e1656b80adb5e9b042f525e5ef52fa9180139c7860899cce33da37470015ad204391b702caf62b0a77beaebe20cc203b5d9725a0d9709b683180907b105a21f935dac0088512570f2c4caa2ce3de3a52cb86940c680adba699bb75790e1d5b67211f17a26889e09003613293ca4c6a604cdbf8c8e16214ebe3d93ad3992f137eb00198a2619bb377ec81ad87c33924c9f7ceb39b72f5f82127d23ed95558eabf2a6913db744b143737dcca563e9575c3d1023d3be03fc9305a0241382c848c48fabf86e49a3091a1286c616a1a2f582d245a8a26453df3a089913cf39fafca9e338c575f289fdb2988dea2753f98b9f2ff5bcf0dabc1f921e3378620e7a0c9d331ddc2367bfe95ba99608d05d5f8e735eb11f27ed2e2338d6620007d117ae47c76a6df13431dd05b9d8449f3e1b032e37956864a53310a72aa76c4ad7038bab64f942b75cd3298d37ce93b934cdc8fadf91edad8dc235100c00b5c57d35a6189e48af17c9aae53b591d02c82a8c8ec0f872ce6f11e26237542f053888d6817c8c0634a7ee46b128b6305bac737c04e56933449472b899ec0e9721a42eb598699ddcdaf3fe9366182513859d2b08e97949f1254033884be9ff310137773e84683a4294199890c081807374a8ea10ac5a8459d5d86c8490b49f302c8388969938dfe0325f7fd958dbc267535cd289336666cdbcf8b1b986961a8e316f3ab9097ca66961de015976a168e98b3b939027c76af578146d0bac1d70805b907cfe1c6ab0952b5475b9c5b01c7900afd99a843cdb3227d46bff4b875256bcfbaad91faafe40d7b291f5ee5c9fd028b223c64f78feb683bd6327e54b1338b4e44baf52a7f82469b89745fa09956352b62271df87fa11f14fcd85304892c894c05e4c279d125e88a8bafa902a8da904a61f599ae8eb809035e7a86f2ae27df46f5713fc6616ee3e914123857ed78f2836008936d3965a35c4ecaa31c7d04c490368c8f4577751750516d3b4fbfe149bdde0f5afb0254badee7fe029d2fb35beec61b771070e4d5e979e7df7123927939b6410e77f5a68cb801a1ee2d4e1d4859d08185939932d1746a527ba401293581e274e60b06d019a7267a45fbe7d85386412758fb140672dd41e0f6a96a7521948922dc437a390bad2f31555e22766153d003645cf32a6ae0c216f32aafd991ff017a17d711ede11e6936bbdc842fc4f8295cb9d78191937aac8cc9c6976ff47b8f65b1664a78ad1b89a4034a93f6beb5954ca63f8824d16a16366deea55b5c2bb71f933187e2f686481b62d5dd87afd08e686f7d0edcf35ed281739a1c5ae2677204595aa7de719be88180b8331e5e0952ba00d89f300fc5073671ac9de29c990d82aee39e64fee2b4af0e6705cbc920b646f4d8df0b47564d41adfc524013d86c1b38bc5e3e12fd305b95381a5e2ce8fc53157056ac67adf8950148a28ad2edf53a6c843398c790dfd24a975da6cc3119dbe3513c15cc806a8087a6e0a9163e33577558b2df85b92efc736450ed024745563d5de4207b66544096e6bd9bbca76eb2d0f1d8c5b28673e9fe943bbf80ce326088c98c5e6fbcb251d02b5ba952016a49e08fe0e0ec9951371a1c8a1b204128370ce9be78f28d190dcaec750c28b76d0a408b47ff4356bcab8265eae3ae570ece685fa9ee6e1564212c95b6a8ada71bb24a3ddba5a101f49ddd7c4f6968d579854e0b1db1461c526918f99b93657e689738fa263a51a581ae48d7c9287c30486b9836548b110939a5504d28a48e785e697c07c487a19f51acdfc7958feef92bb5e61bbf429e27ff5aaf29c76f543a544644017764f9d304c32e8047e2df19b0a387246db529e3d766f693765649090c00a7e0db46693629266b9121b9c227d6fbbc68d1cdee561f215e35d8cdaf40697f5b939af55b43cdd25cf1eb17b1a113344ab08bb10af5f1e4cb516651e6176b5b54d1d7b00d22eff98394dcf2fcef0853913825e24e0a34ff47e48fea5c96960675095c1ae67e8aa940e1bb25feb9a83ff45f16148f3ad0670289333fffe354bbe8d10f3d113a83754941cb68b845b0368f6f74d6e6e2926131ccc8b9e586166141adad375cebd78554f5eca88b846e13da460805b1acd61cc58eadeaa82960d26aa1b76a199f90a536562261adf7e15b49cc6966cc760aa5de7936fbe02f82846a720aea1e80c5619e6e3a2963bb814004e734f7de09c63dd162e02164154f5cef99ec76dfc34c20f98ec2948af005246bc565836afca237154088681561c096c96de2bb9cbd82589ba7a56967666843ef826d06a26c7229757b32139b7a4cdc3520c3fb28699cfb7c95de631e5a1f9735fe0168be9cd504cf3de718a6e65aa6f7f3831ab4873919c219e3fb6fb98297c194a6315de16235c618eec9c30986682233143f4047d0e01570eb48cfbce0b5f62d6760f698b8513327c1a4b41133a9331226981d2d43ea2a73aa9032998c371f57954c1886e7252664b213822ea6ea98308cd14b8d8cc92758ba882aa6f78b4a09d31031f1f73646006b344c154debb559c2d4477c5d040aa62b774a07d31630fdd01b6f005dc9f0263e6ea7807cc98ff1e2b81ce0a91795275f5df7ab9878d9c6bcb78588974aeabecfdadaa58a24f8d2942e3da37efc56f3e31ee532f7627c02225ca09e22cf4cdd9217335901cff1c307001c09b9da3c5bb56499f3f5d80ffae3365a26f74bbf54394bee47f509565908349a1da78ad51d0ba32ded797558f2337bd4bf010a3560c30196bc0cd78765c5e0bcc2b7c0ac5c045570d0e427f41520cbb76816af0ce5e00c6a4b44df2027f7d5c0f84732f161a9aca54f1f8bb95ea5d9f2897a0e3df4152ff1c970c3ed0ff1f7eacb52e85f577f248e605f7d7402a6cdea7f3053c957df025a66547db878467af54ffa5563d5e791433c541f18387bbefa87fc289ed5e70610cd579f05b849a8fa1fd774f6ea631b48d8f51d4b1ec1f537ffd8e5d75fd555445c5f32280e5d9f4cc82ebffea8562d767d3819f9e0facc4296fdf53ff9f499d7f70649f4d7c71e6a175d7fd54b11bfbecca038bb3e3900bbe0fa835a5afcf5416af2cdebf30559f6d7ffc4d7075ddf5b26d1af8f7da45dbbfe5a0e45e0fa220371fefa440476cdeb4f6569f1d70789cb87aecf3766d9afff95571fbbbe6f8844b83ee611bbfefa23b6e758005b7bec77103b4efe79ebb12072f882719f91f032b782d45f185ba71a6f0745ab978e03393f93c60716fab463e89ccd7066b2b5f9fa6a4be02755c934077a08541cb65d7a4503860bca6bf786ebcd6a11e3518c9f8b0ea2d6daa56bf58526c73254e99f25da183178cbbdfe3924680af344631cb2bba0df6c142a9c3c4fc93dabd082f776339bdbf13e3cba602db3135b9c2bdf0c050c66f5ae4f5d6dc3c95cdbc2da2d52cf0e91836266b5edbc01261d0b228ffc632700a3139531ca2b0b63d8cf0d0203e8fe13b49fdec864adee448a0b521752617d0066e4303e9c94d65b237e1d008e0b041b25c8fee6cc96c30641d6898e68658878dfda8ef769439526e76d9fcb166625827b717380ac5af57a615c404457e8a100759bfb90066850e8f805006549eb0da8b53e18e49e5e893752a6766b9d22edf911df35ec93a3cc4a433d9383110af72e191eafde6e036ac8c7c558281ccf4451dd00a6be64ddcfef1e2d121a74bc90e7e8ee5d72303011d11027e4108036fad0eb089fac89c2462e46ae4631a13867441a8589a228f257ddb201c53368be5b2660cb9ae9f3bbc52c137904de7fa9702cf0169a9bb94fb8d13c86dce313a36ae0609d099767d3ed1875364a7d3f7a96002c31a408d90a07311c329f52eea16f5c2fbcc386947a6188bcb7ee02d7d4a8e380fdfceed8bff2cc7ba085282cabcd55010d9d7243b3ba212231ba098bad35094d1adb69c597a8becef7285d07763fed0ff21a5eb0d7fc825fe31bfc1a7f90d7f082bde617fc1adfe0d7f883bc8617ec35bfe0f2127152ee3ad6b5701715cdd257d274ad165c39c9c2a468e94fadc5e4072d6e398f4231f384921506211f5055f494599649272d4d0a92efd9ec4443114006797907e554046e12a4b74b93f4b203045d97870b486c5ff42f2459f4255d442997765d1f60d0a4c9e64a3de954870798286fa3b1ae5e38d4e440664abbd4ac83174e2685f87474e4df7cba8077761a3b46657a70d89a9078889e12bc3d1af332a558e586b44165c1d8996a7b561c265cf485c40ef41a0de5acbdb0ac0df68f791a72774280a14ed2287386d7839f89e10c4c08da7cc2150b2c8e61547dfcf191e7337bd9408f2fa84b6f5454590ffa773154d467fb97123f1529af499873490bd7ca946bd8c3aaa1dcc78cf38b1ef31339285cf2ba8f39095bb9065280421c6b3978b7c9cb3c62976ee72c07947492235ddeb708d6acd9afac9996c234ad24382984955458714354172b0c805176f971acf6bf3a4edbdf0718ec251e07bbdc8c55453c6698737ca8e01dbbac1225c5bc5bda654d0ee24127962055e67fac460c0ca406b0fe2ea76a3232cd824407fde5e2cb4d9708a7255a7aa712f3bbf1d0ba1c5761de3f194dbefe0fdff3c3bcb2ae5354d4b91cf632e6122ddf58c0f5a0d30cd4b1eb5bac33ff25d882be5278926d251f35dbc37633b1ff1cea809700d4b0a8557c58b25974ba27eaa27ad53fb3912e009f541386ae63c813692d79920c912d5fa0c31bd58c73be5842e363b2d0768603452c987cb1e17382b6efb1ef82531f34c9c0b32fe2ff72f4904ed8f03846807c74ef6b12b30f6fd64d7164755aa32dc9021d4d8973c2f9ad41ac80080c1b4d9860373e0210ddce2877b1a180bb930981167c3ab3f0677e0ccbf6444e5c9185350474d473f6b7d7eed3016ee35ec0fb40787203338c68ccebcebc72fef3f6d101e2334655946ded208713d6598099d6032088b90c49404d6ef9dafccf385bb9298994ded99901b4906415c2cfc8cf110efb78b8b993bca0f968de8e35104cf1b440f01931eec25fb2f740deb0f6c1de1977e12fd97b206f58fb60ef8cbbf097ec3d9037ac7db077c65df84bf61ec81bd63ed83be32efc257b0fe40d6b1fec9d7117fe92bd07f286b50ff6ceb80b7fc9de0379c3da077b67dc85bf64ef29d94304d7fcf0189260da9909a950ee298354200b3c5513fa5593f46bbca254cf1e2ede4d6378deebc9ec17e4626478ea1fed2567c828646056519d0244648374ecc9568168b26b6a3ac1f80894cc4e648fc1bb42d937b1dd6fae03914d6c7a09c4bfc984b27dd1d8e79e194d0c6c6b81ea6000ea350d1f0f17d03a3d5ff07f30434b42f5bc44dc61c4a120a972fc7f3afa8072cab3a8360cbdc2e18629f98d7da53a69fbc2abeb4d8bfacce8228738d0d1fec47d4f97ea08da8723e879b047af7af4db17af01679061c0d06b1e3e19b53f74c4da1a65baa4e3081aab2555433b45312dd7399796eb48b3ebbf53c46617ef7a5b357a0c1ab0b8ca7184c4bce21507372fe74290e15bddf3767182f1209ac63570c1aa149d56b221087f3b2a7f80f13c5b5448dce2271d8db36f6bce7c29176be27701295ad563d9bdbac4c5ae721cc4be2c8d7402e352e3fc2f2621abfbad9cf7cb39c87a47e3e0eb3a3b5fcecd9afb92529d4b57167a90e1508e236ad716551de719658cc9a13abfc81631a37a1086960d1fd274f8d3741034f847f7ed8f961af7d1e883ef198fb234a82cea89ebeeeb10161ae8f01a25e68e613533130fc0c2a1637b2eb066f16143b4fa74216dc88e83729ca004d7f86bc5b3dea92aab5e8743a6847a861ae0424df9a9bd8120d8138ac636381780acdf15939bb2a4703e57c48dfc13709a3e09f6823dd07e12801337c5dfd007c24c2139f5d30c1d6362fe24207119a88da874b0114f749d8651a844b3d923c3c5b095a7957097ef601cd60ffb8d370fba990e62fa69d891f6c377e34440bc961feb7f043f11b6da748c574406c68377a88a4b1337871341b68976012da32358b8293ef56f2274e4860a2b0b0f6006ecb34d1d8a67fa9c9d0978086a303ff1999d1d3e30d70ed530ea8ab71bf1418c527b94084230c4024929e08ed4a59ab3631e11642cf38a61b2418c7e843c4a83245761121b5098ec470024ba0220eb0a10e70b205529acba3d2b8fa2e6e3a42ed0403a8ab968dbaa43708ec35b6c4eaaea17e7a612994b51423be870f5cd9154021d04ea8b1728f86224a7c16e17d853770f4dc2ac195166912586914d7c3f3f6619e65f33c56ef34b43809a2ef5dfb6736d33cb6511e0d2df329d59fa7e65c6c855949ba9ff629ff1f9efa279b44e16b90dbb9e2c3961cce666e07b28be534c3c8c6b31fe02eacd532accd9349734e47a072c6d0be5f5b46c6f87ae37897cded4506df9e0e99b6653df84547d53ce57756b7d1346efb2754efa547a38c9f7aee7cf83b25f9f837e9b96ae6e93c1a56dd32c2a6e4215c84de5216eca77b39b7a45f046bbb07a345b63e33973f45c17a621dd643ffbd3ff6d24a1d72db040de813b4acde2e833292373c447cc8f7323788d89f9a406a4e60b7d41500f2610b342086e7e088c13751cda16872d38cdda3763686f2ea1cfa6b24b6a5e24b3063831689fcabb93a8362a6f09d2aede2ef4d8564daadf032baa7dfb6fe8e66e86a0e18514f965586ada36a28cb88ec411c17d81ab36a794565e540ec0803730dd413b0ba77ca7f61aa19a72a2add13f76eaa15b810248fc0d246f7b6907f8468bbb37737056a0277ce1ce5595b85b59aa6aa98c946515af2f060e22bcb56f5169473f93e98936441302f2a201e6d235f851342362a65f202a9ce8f3f360473b748531ae5213cb0e71099a303de141d9ba6c5f29e5f884d62593e47b8a71ef63e914d082a2367b75a75eb1c62aec433388060e9a34683b18a45527d0401774026c252acb1ff9f7c41cc9dc6d551be4bc87d3531e7e6e291c04acdd040e01c4470c53205a594d3ac9eb04ae8793c0e83f9590f89734ba4c97cbb740ee04119d5bba50f8ac2deadaffdd1db2d699d02d1a27b05bfd73e71bc6099937b3535ee6a5d8d16f061b7452c59bad926d8448239becbdb7943b140c240c420cff826cd7f452bcd2f4edd564b5633aa6f7a1c97e250efb66790594e4c10ccbe4318951cb2be09ad9b50cac3c5135e019ab07f392ba9f6ae5ca9d1bcf293823ffd5dc0e82e2c0a9032a1ee89630092931c135b10dd13e40229281a03a8185804e11cc3947206591f8a2d6ab5e20ce7c8d73d238b19bf9afc2f99d59b339eb9c335ad985bac1c8334e6ea964a848585649197d0253c9393f6f70e455e3c227b0e0c9a540ed62a2cfc4900af321dd958fa7550a392902c46f7493aee2046bad9502c130ef3bd98fbd296efce96b26b6a393a11b9b4419f690db61eb26e37222a1fbe1ccf2ecc9d6b03387bd8f713b62921b9d5c9dd66cb8868fc9caf2c41393b43ca253081da1fb24353a3292b5cad724cd9232fad01a5c6343a9acc135dd1f8f4e84b7e30dd4419bb420e8ca5cf8841618b93109763ae4680dae913f3d5d366cd91d734f52c6291d8fa2163d66be62bf1c77e56de4026556568e3a8c2b5ff9a7da54706605354f27d46cb56c0dae99672f9ebc9a4f8f668526954add0cdd0a8d57e3d19e19ef0b92e3ca7ce586176fd0dd38c3a18391a28381f1c1f3bc6b36ba93f4e13a150a046be219dee63c6643c77dca63de8e0ebad353efce678853bac4780d70e6ab4058973f1dbc7ce1cccc21e72366a607ea7cf96306c3de3a73c73c4efab43c89a4e4f18e13b7e3741b5def3841aeadadf4b614d95c42e61559e21b7277fa41b68b825cc3359fbca8160f94fd66b2a376c9d7eb76eba86b2d4f1e35cb28f2c04a91bdd5dee478f0516f65d1371945d9d45873ad32ec525fa7219c495d2736b7e3742da6bcea7d3c57769eecbc2f754f5e0c4743c33a7d73467031ce355739dbaf746a8da0b13bfdd4697b333f662e539e9cd769140a65bf2017754d63ecedb52e5b1ae61dab18fbb0398dd4db5bfdb0398dd348ddc6b247e9b1256eaa65bf2037758e089ee168fa3160ae31e723c5c7bc3ea7b04f0c3bf3c4d3e9d47c3a3503915ea540d84a3883bdad8433547e7245d41061efc3cc275700be354f795fb70d92f2e19003527369776ade762706aadf9d7a5f8d9d31debd1fc3421677fa5629d921f1d29cd2bc69dea791974c99ca338d64ca32e67d693f6a145327e783ed09e6a7d363b0b35781f0ab149d0ffe2906f3b0985a83784abed56a3d080fb64c0bb64cca7e5527cad3679c3d227c31dbdc0f989fce9c8f180fdee680cccbb9458e472a954aa5a69c16f5eed2f216e3c19d989fae693e529f3da6979a73ce09a4f5994f2f15a7978a7997e2b931efea8679a7c7c45814f6551ebc870babf77a9ecb1c8f945df948a5d847eb33871cc65e5dfd687de633b66581d46316b312cec84f46d9ef897b7a778a39793033bc2fc8ed2e8dda075ba3f3be791bcc25e763e5c258e923dbd2b84eeb441a9e8c188fb23cea06a3daacd85517173ec10852668d3596c67e7228c65b9f5ecb032726baafceffe0ad6a4e73d4b56fc8bc729ea1a335f519efe3b933676e07058a37590ce25f175b7dd2cbed7fa97eaa0776799ecbde277f9bc6796e0f999786adc135a9d475e28ca7f294573a166463739bb7bc1a4f08df3e8db7faf1c351ffe1a84f337452868a476dbc9818db653c6a81f24a2d7a243513c4a44950d00e2026da4442d7a2415ad4a299af691be47aa8bce65ac963a69739fa1f84427da400a980f30f5e013f6885ebe6df101700b70fbf9cdb37b729105cdf8ddb56de8cfb41ba5db91edd5ba5dbc01a9c93a45da51dcc30bcce87e7e204f06efec3c379115e8e1be1e5e478463c8757c471bc1fbff10870179e8f4bcff4ce83711c1ea6413ed5191fcbbe33ce2766663a6346774c149a9e71b66d04f619d7e9f6349e5066944934a50041d5024fafdee9480b222962f02106866fc33998fd6cf4b91f8fd31a9c530740e3019961bfbe7ccf7e7db198e4d25abb2e8886c6d649d3a739e466c8a176b9aee3f1d209d0c5f278a90476fdf1b208d0e54922ec78f461056505e14bdf17445c13ffe2b05d02f8c7c362e77f437a86fd41df18b52b9a9f6451008600800f3e0784dff4369cd3a7d605a6858e889fa4c6f5e853bb433fe3240ec856836b2414194481e2d51182fed483083ba46f3d8f9855fb4adfc37e37eee92e3cec27ef89dec509e5e46ad49bf05e1a8f2f46e7c56866d81a5c73b21d856ba4b0c40067e277646133004f5e001e8eebf072eef2729cc5c3f9bd9b7b9e8b779bcd2b263bcaccaaa76352be9341946ff3af6359203667fa3a6112b6ed098573a60ff6eb19857326165c131fe5c669044324068833dd0067a470cecca28873e651d19d53b8060bce995a704d3c6b1ab901e24c3dc0992c38676ec135f18dc58dafa182aebfff025d2cefafc01cead32ad0e5bd4f82ae19ef47e8f2e1fd12cc9150608e0cfab2a6405c3364ce396fd017d750237409d7c4cba27b95ce5b84b84d194ec79aebec0fccd6e01afec9f5d7354297c832e85023422cb9f1f3686ac1730ae7c8203dc4cf2d38870205c07e7d87d0e2da1c00536e7c0dcec15ebf21f3d25c887f37aeec9ec353c117a80259b0077f87c6de1ce380f870ce4a4b09d6740ce21c0cd6b48dfdbadf42d8efc6ad77b15fe3f060b36a700edbaf099e8bfd465ecaa7b81d5283975e97c7f7c4fc79316f5ebe7c9d7679d0e65e92fbd5d3781fcf0e9aebb4ebff5ab73f1a4232de3f1933fec170f9f0afc5e55f8c133bb452fd7b91339f704dfc976ab19f7cc530ec3de8319edbdfafec579bc3e6b972485f1b5b836b6aa5f15aaf5ee95ae9353807ded25b1ebc266e47c9d6e862920b3921ce994130429c3399704dfc6cc2354f3867ba38b9acab869a0067e25b9ed0a07198203ad42c271e650264c5cff0e8119815ef431398c478fc6cc23d7e56b1c3c71ee3314c6ee4ceb24d6e3c7ff3727f9ec4f1e863b0da6863cd49510bf869f7a34034bcc904763f19f4c9267cf28a1b4b2af645d5ac781453339e4c92b2128991d11386f0c4c8c8c8680b021424d577eb5867ce47eab2dede12a9db7af76bfaaded949ea6dfead7546e07278f5a31ceaf9c11356f9a6fe6342eed67c319d17a5b79b4b344eaf6dbeef0293da5525ced0ab33ee6eb7b4c0b7dd463ef512d9fbcaf5ec6cc67778d6990f93eb69aafa727ee2e4fcb83e7aee6573e503fbd07ca9e2ccf9d76e5e3f4f91ea7cf20b134733ee480cc1cb33b339f7687e6946d90d49db1349771cafdd84e3f391f345d731a56dad821f1b68c68d5d88f6feb7dad455bb4d216b558cb6e1ba5349247d2486651391f6d5badd6b92fc8e54b0e485f365047edc71be72396ded2fb825c290f9b2635258d9db1140865532f9d3d8c7bebcdfdd8de3a733eb8b7ae69d857f5f33c17b3abd35118ead4033bc671293ba46f90795b5769bd099e8b9df2dc55fd6afe749e5bed0af5d479aef4ead993417ac8f3519e0f79f27a541f75a35eeb33d837aff219ef7be2b6e8573ee4eb7b480b2dcfa576e5834fdf83ed97c4fd647cda20a9db7aea7297719edbb2dc757abb8af70de0ca78c9fb825c193d68d62b5704cf655929b2d78c888f95bb5da72d2da25850232a853ea151e810cf15741f0592dbf932aec9f0249237743ee457540a16462b3a44a1446956a7eee6759366ad20c8d532a20c1932cedc0e1958762c6bbbf2d1aba964357b3e20ef0ecff6b30448890cefc88d6fb63b7cf915117cb1f3c5ec8a003bd2c266f14c32b3e88c68d05c41f74923a3d9a3a45d501e6921b798af3b8ddcad49776f8f8fc0351cc74f3882e41e1dd1e2c228173ee1c8cfd534ede34f32337773d3d31ed8e9d9937d227ce557642e3d994fde8f2b76799a2fa9c74ca4646eba6a57b59102c973109602d5ccd25e42c7bd3b3f894d36fa437fbe2ae5e9f2dac9a33fcdf239fda33e4a2c434ecbbc22ac23cb2eef8af7f15d9182c444b63ec328d453d7505ecafb11af4ca15257ce78b2e549e983a01b0471e28d371e4f8be24d108f14a8a2523fad9395524ad9fa49ca1691caed40d91a9d949793f21cd743d258398dc3ab001b0fc24e244580b8d18974fe8d7fd2487a0009ac9589cee635d7e67629d18d34097d682592b648e48f645b2bc614680acb720b1f892449bb30dbdddd3545df3488cf6c653d9df31f057a1fe376f0c99346cd3a6242de215118d11f8f2a6956f469565431b5c736c6b12cdac51d9986def0560aa801c46b1cead0892b2ab7f1989035de479f501aef1b226d782bbe8c1f210c29e9cbffdc286d8daea5276f6d1aaf5c0f1a347c902401c2a346e86a9c86f7017977541e83d2253ecc308a84d2ac487d5cbfcd5de8040f461dc3fbfa2aafe1adeab36bb427ded01eda438198749f0c2a61592f754679032ba0a8a24f569c40a88dd670e1e10d0dc6cc7f5d9122542031a72d320fbfd009813a6007f1f1e9e4175c823b5cc81c1f723ff87587cccb5d7714f49a8952cc93823b76c9f1e89eebe00e8b0cc15141cf5ddb4c37d91d92c954bac9eef44ba7f125ca795047c3fa213fe4330be12ba4431aa3e74bedc7f2f1d2461bbf80451427d9219325175e61c488091ec6d4785384f478c84123a6dd81cd2ac2a3a3c26635b44c28c008ec203e145c478d32f1235d01a4f865b6dbf9b0c366a56e95b6722c02de2e4241d3e827c9fb8af090d7ec473fbf78cd93a2a387dc4b2af6e3b92aefbc9eebe80ebd8fe72b52e476b608ec20e68b747f027610a6c30ea261e95cfd54f1e2bb0d4e53e94694ecd704cfd5ce5d9ef3e437ef92b067b0599188bc93526ab9287b4ce0735993159e48cbeee67acc0bb13bf1fc5844c221cd7ad0e21b32340871e1aa4c570841b9aa66318433103214524a0921c7085b4a29a59452ca2953b5769d4a256d587da4e3f76024b553a528fd8eb8416c6e4c31927803bbcc7e2ad6fd18090f7965b398be6daa5d94d2ed04fdd2316d03a18befcb4b29a594524a29a594241cc02134138ca1aa66695cbb4d95fa0b2bc6a685030add547b2d16d12ccaede0ad5da453fa54b32829c61853cda21db0c176e2831c71e5bc94b5eef0bb5d1db0b9ec8a246ff3ba14b723da1a1dc7f51967391f3637ca9d217c7754cd9a7f91339ef4376ff49914d53610ba790ee3828ff822bed11e2739a6dc6851a21411cdea29626847121834cd46d705b1b97c84cd656696416c9ac548d0604c5f382f4997a453d2e9e7e5ac524a09db05b72e553f27698b4b508843fabc64d7c62ef979920d7f5ed3a69025ee492771469048f7214fd2e2f3520b26e6d5e9693909bdb6434f3a1c20cef6de341267043d899e9469a436a2594be9a2661d19c101e208315d0867b4a0dfe92388c346c8cf7635899534ff4c41842f5b5ea242696ccaec93a4eb9a15298bf5ab544a54a3682b141dffabf175610c1e8d49679097b681d0f513ccc3cdd260cc578fae74b9e682c386e10dcb8338f3ccc100cec878be820a97d3802ed5259428230fe310768f50e2cd0c8a32f2308761bffab7d8af63fba9b0cbcf80387c7916e7c0b87c0cfba96ebfee9aeecb61ec572f0c0ff33028f372951721ebe5d47b798b775fcede4bf31127e9567f7181691a90cbcf953e57c640d73c9f055bd0b59a1ea6856ef597f335d28a57abaf0eb917319f5ff1be159818308ff196c35c436db0bdbfbcfcc5bd6b286e87676b749ec717722fe788805c8fd5f9dab6b117738ddbd8e31be3f15d49150c0cccaf82815181b90bcf4d05460ba6e4678956da5e3cd9ac96738cf7f15db962be8d632ee37ccd8563620eb91d325cbcb0b0592d2d5de280c416fbad78aceef558bdbc6cda8b5dfd58ddbbb7aa4edaf5cbd7a176c15cbe3e6917fff4172fed5a5d9e6578315e1c6a966c1e31de35ef0ca3af71405a481c90383d98c3c4589d66baad3eb91e2b217ced89c818ef9f88bc42f8e8c25c88e9c2c01cc6330e487c0c4b84afb51f07a4e5309608dfdb8fafba4ee4d599ce6fdf51b5dcdb60c328f95e6cd22c79182f56d12c89921e4f69967c8bc75ba8bc7ef58bd72baf8f344b26e9f82ca5bb70614dff66d0954f5d229942c772172f46c93638552edfd41949a41812f9aab25f6db14826868425aa7c2c0db301c411c247f70c0449bb92603e93fb11cf5f21c27745a77b657e3f21f9541debeb121f312165c5b4ccce5a8f2e8cc1f3f284e4e9c8d283a73a25f273c617c00ec226e44429a59452ce28ba787e1483369bd0f5352c7b7b3215cb6c952c38d37f61450cb3dde4d85468b025258ba1eb87a18b7246eec1a4f530ca67f6c33cd95dec137bb5b2d6fe47e77c8531930a0a5bd299cd6a658533f5a6b21ca0c79b9c92460a27ecb622c618638cf137e2638cb1ab4e5c299500a5468833b3acce59b75aa10443853270081a845e5f6666661cfc1cfc1bfc96ea057af03284e75f3e8ce1233210a7fbc618638c31c62270e4c034b9759dc20effd2ef9b4ceb8ce10cc986f4c4edecda61db9deca44f0e888d9b7df3b4ce9e659c8fcc6ea48cab240e888d8bdd26dbc19e599b1db5623675a36b568c361c6364204edfab5e2614229387cc2b79c8e4c1171200196d7721fe3c05c48171780d86d7f7014a342b3e096668c45c8324f18025d0c572780682ae96c37ece4beb1ff72007d0b5720398731aff58c985671a40574a06302766c63f9ec185e717f011ce61c1b311e852393cf740d7e939ad8f4f70e149005ddde14500736c884097e9f04dc09c1b3ffc8373b8f01e08c23938e02da001e8e20e3f019893039ae1c24300bab4c33700e6e8c850004400cc19c007b770e1814057e9f045700e11d8e18980ae7af80b738ae09a180300d0452d4ebcf72f880b6f03e620e182ae79c8341702714dcc0ee155f1e6c55d0e1fd32e98ffe5f02f9cc3ad97cb4f623847035c13939801711a90c4867398c667c4c8d8ef060ec4611ec0191c9cc33f3938878de8700ef7704de4235c13ff83fd7cc871634fc758223887911000e2700ce04c119c33e408ce710209ce29c2359173f8c5354080386c0238131fe389b55f6b4d05ff00b2f8301efb00b2760059ecd20530dcfe9e1883c7977fe00cff85c73e5086ffe2710f94e1af1809bfa00cbb5c8813d7e57b628a8f7a5decc7f352b5b0aca49e68a001493c81463c7b78420f24c843912d46800711dc21047670620a08ea40840e1f98c3102d9a90031371100287258e3cf0860eb881036d0892c50e1bbe356c400d1a30ca401a3080860b9cc1025854c00c1428c304c8a044519278d449a533f928e1c18f0f2b91001c4304a0182000c3f00028c501100c0d805f6000f44212906801b00b0a805c4800dc0212300a02a0160e00b36000888523201420f00a058056300256a108f8e407a40201e0147c40291001877ac028f08050d801af1800742200f9041dd18a0b9da023c446d8c88d2f719b46e21e3e120324dcc347021080218600000072e4c8c9c1c11142081c386e6e5cae2082b871c3868d1a358000c2c6a6a686866666a6d5a24163c60c191916eb871f7cf041868c981821409c18324610208e8d960a88e3b577fb3c059f3fe4095a70056202b39c882fc26c0288c3fce21c66388519324366c80c9921336486cc9019324366c80c9921336486cc9019324366c80c9921336486cc9019324366c80c99213364860cc4534c0171bab68bc7f484e4698935457845b9fdfe63dad5f756bc9ce4b830a623e08429282d5e8b1e8f378b65636380586bd731f7d27dc983e10c9fe1cc3cc2480705a5db46b91e98101e9a8907734728bde9c9971e297899e3019b87bcb0666d7924d331683de0ed4b1f74ef6207010dc64ca04e1efe514a4fc648e6276ea00e9e2961a5b442d2bf2d236587105608e16685402bc5b42a988782d2394f2576282614f3daa1c0e4eba1d0e4b1933259313af9b3270dd276f08076f18d67b50b3ebed52e1374c21502de0867a20c28139fcdc41cdc8e6f5e935e1749f6abdd9b2b0077efb47fb33bbca47f17d2755df726786e679be0341297a2c993227b899bd4aa801e0a0ca3f4583d14143b14f4dba1a8d9a1d8ea355266ab3d8cd6a65950da38b1346812099d7cbc3cece23fac49b6891adfd0fbe8317898516a9ba8f4d042c8fa302b845a2954200fc5bc84f35074161e8a69bb28030f856c2b4ba0611846aba4d8e9c5e899520b2bd478835cb14bb166cdc94d3ba3e8e4e7698e3bad945568daec013b41359774b292d83097cc1ea4a2d056f0a69fcbd77e79f6a08350bb1a6f58116b7d17f1117b9192eeabb56ff8f5e86142d0f493030dc6d4da752a150bdaef880b0f6febcab358f3423058ff412fa39fa75996791f84f5987db364159d0deb4a2b842f5b22f16a802d84ad0f5a21d83f3e917835907deec0ce9f87de2721ccd80aa9568a78ccdac3373c039f7b9e4787d61e0f0f6a2a10fa747c789bc5942329a71c4dc9e272b442f8c2f6a013a618dd279a27364bd164f394a92b9b46d047cfdc0eee530f05d741c59dfdf31d5093ce693a364ddacc306ac228a59ae9d3d3c1a676fa995de39e894178e4ce891d661826b14fcc6ef512f348dd37fe9c3dd2c28f8db26327ec348fc274e6b6a1be9baef2641433666d3ac898a5130bd3c6f5407d5a0d559a37ada44898fd38c3b0f9153b9f32cda34c93db41b32ccbd8f4caf5c04e7a176fe0a9e31eae993a11f3e055f1e8a3c7ad8073a6945266a669e587d1677292666fd6269ab0525788653a43e24e765376ac6ef687c9b2fd189376759b78a3136bc53e654428718413f1a63e9eec078d6e8c31ca28a39cf32ade11d31a31429fdd88768cef8ca6688aa6c876d59dcfa383995a12508144fd3c09b6d36776d5bdcfa343b324b0abce2291bd37bbea4e552c1258edd32b803f312a4ad7388fabb4213daa6e36742307257e2cfaedd98d1899afc724468aaf9dc5598d18a19f37825d475604578f8fa24c7c1d4144b3a091ed2835032d0200e640aef90270211c40bb4c47a52051c9057324d7cc57202e7c0dcca95c335f9a71e17c01733aae99f035d8550f63daa5a5bc0a4f53a55d78e8c20273522736c11c55e59c17ae99ef38e74f714e4c8c8a73582f9cd38201716820e738312f296fa5c628ab74a652ed23aecd6d214bdc3ee738c1353386738a5416e7f0ab9da0c29df345a693797ee5dcf90f007772379035af91aeb8f3d910779e5100715c70c608e7dce09af939a570e7e761b4000303230b3060bcc0c28b172f505e5e565758ad5c58c1850b972ab8b8a89ea8542d5468696199020bcb8a1456565243a9142a0a28d4090a77f66d26bc4245e5ce390f6de63cb499f3d06642a16dd302a069a42148a40c00595673d48ae56018c5a1740a31e79d52def91b881363bcf32e88d33641dc8038d0a65d139b572248df7439a691f91bed82424b8cdc89e38358c02b6a10e542aebf253eed0e23e17a55020dc67c5b1184f3f634122654ce44f7f96d0ea523de443b29b21a3ab6838988fe50a8647fab8afd6ac744910c4cc46a6038b01d7a90e0b80ee952e5f34cc445f1a6020101fd1021317512b34c149b1035c99c98a2da38a3db91340af403040404c4442a967f7c9c9872ca2951a74f8fa548f602133561a226cc444c54eab49754ecaa2369371da3f51dca7e5088888888d2ed500713c9d7da75449d3d826457dd49e7d1a1d955675706d84e3a12db49b60815dd8b70dfde5924eab56bb648f63ab7edda15504f42ad4e873a5e5087ec41c72f947562c36e3735eda4fd64912091b8b91171df2c09a840a2bf9d04f1dc15b0bd5a12f437152fdecec4979b3469d2e426a18178432fb9c9078962b80889cfab878f780a1b3111ab594cf4ada8f2745c61810669bada9affe2ce8c59163963ce3893363ac6a4e0e46bd534adc6685fb6ed63c9b7b44dfbb66d5a964d52f6ad596c335dfc835996653874e050c3a34a4f3f31fa0f1e296101249250bd5c090d6c5d0a8907344b4e229ad5974710510412ede2b712ed9a6ff83b99595e9df6a46d759d942b8306633eeee7cad73974d78cb86f97ef20c47a6a285087f6a93afbf14b96ecd7b5855186abcfb447d0ef00b68fec1f5c39842b93d043d8125e1251469ef39cf094209afca459d2f4f9f689fd136f48445146a2ba5349b64f66bb46abdaec591ac9cb5e6bd7a954bf8e1fa0a0264224a278232f8dae3c919426cb5078489e7d62ad5dc73eec23a18e5a842ebef6cca14b5db60de08c6c1f3823d9c8c8e724e4643753cf124928f1afe39eb2df2fc79bd94d123dca3b825a2346b4f78d70fbc41b368a32f2d2c8a7b7adfbf422dadbae4a5739f7934522fbf6cd16213db3abd2b36fe7d14185e9d55b95de873aa2c75de548705789e75eb2486ccf6c91fef678a8837a50876975447ccb7e411d1a9b3c78d948ca92d195f2ac8823ded4d34b788411ecf425efc371a5f68cf4fa4dca5328571e93af42573e1b92d79a5c794eb64f853aa812cd9252723f17c6a83c3d533a38c5581f3d1a403498f076aec786346d1a41178b53a4ad9a76c93480e849fca31a2f2d8d207071e37a64a734c618b522ec083b7df5b61ab7d728a3ac9bf7f195b54659ed6a3b761a237db59446d04723e8d29376a21104aea114eb114fcf28c63f61b3484a29a5a41104d6892a5ee9ddf6b865116b16394e1969a4c7680481bfc5ed1ce31629671eca49b31a25b479710a334a087bd27d71ca8d348222734f304f8c2a79905144612b2879491b3c89edd365455848918245511116581449914224254a1429444452a410458962450d9e40b1a20651aca841142b6a00c58a1a3c916190030b842e6cb8457777845bc4c4c4a452a91e0891f49139314dc3de10ce21f30b1d0c32299dd36e19514694115d524f1645fa4c0821840da1cd9ddc8499f01182d04726878443c2b9803b62e49feff76ca693594a29e511f84e08a34ffc89403128c22853548dba3e52f59443a01ad435b9f048081e0dc12328f08808e808680a50bf80ba07a89100b50f50ff7051132e12e2a2212e82c245444545463e51e6557b3a242a9fffb08038c8660aebe84617b270dc46d50365a827cab40e9fcbef633ada051dd50174249b447eb58e216c8b1eeb6817745fa72376090b4e5495c9ed6f57d4a00a796d9ee8c1e2c22b7aa25c9a0bafe8f1c1b5d1a1feb5acddbfec42cdc4fdeb4e2ca47f2d2e1746cea4d80667e2511e074d35f32a28ae31b1dcf8928b1bcfad6efc5edc78cdbbf1245bbfeab56e3c5748e33030336060c09081f1e205ebc5cbcb0f2fab950f2b172e64b87071897151a962a85a5a6c0b0b8bc7b2b2f295540a268542c1409d4e2f4e2a2a2f2a5db7ea4c2617a652c9a5c4712a6edb5a364d63d148a41552c6f574e3a52a379e3b932c31d70d67189b0c652cf1dc20ce7cd524c32e4921cfd3999e50a2ac5dc5264efbf15c68ba9c0da1c66ce2e2f45e99465da611f59bac537bd4664ffd6e743d7472aba5d4a606add4762f1266ba06bd782aa1ea2d9af639ab7d71f9d44eb7d53797d57608b76ddb7823612eff5e2ccf95fdc153bb7c7cf9e9c5512bcc3636ae2ee3a62901c37eaa17f6eb5eec57e7e58b957d21713d3ecef885cdbfb0a697959c4e6aadb5566db335b846d2677fa97bead5b3e11a9de8c28b2e1e772d6e356a8ca751cba6acb12bbdf6c98cdfa5ce62552adbd993fd6a8dedb44268eaabd88a75d454aadf365b43c33e6ff8659a9ae9a5a899b4f3cbf45a4d6d2a596eb3353847b35f133c35324fc6531fda0b6e51030b89f4158d3ecbe8e7b443fa9248f69301bab73bf3dc49d748f49cf70db194993be564966018ff70a4f2ef872997a576c9198964af713dba671c850c50bb48e78ca469f45995f9915942929902484a260acea9d79ae398d338ce568e5b79ad56db9967ed071bb196319ff9323f9759c2397c96019201ba190b77128bf7f125659425d34eb38c853ed3585eb32ca32c94bd796be5e6a8e5cf799db8e299501e7da7f2f64e323fcdfa484657aa9482ae3c774398d4d99decf524ee4c22d921f21b62f9d9abcd669665f3fbe1e8b2934d3b8974e68ca8e7ec39429189826bd8aeb8cf53c99f1d8d50b09f543afbfd7074e7b16a6255fb05b94c1418b703e3e8e5482412899389826b3e4ff3a48c44118a66b949a7bde34ffea1e8b2958942e647268a0905ca8a509d2c278031d5198964573e489fef41b23cb77a9fe45b9f651ecf1dd297da1a5c136b0c69b0355358ac3c3bcbb0c721f1cec82b68298da491b40b5e3a862c74850c9870cb60890c94b40683a872e11532783133b38433d01e092541c6c0e8c68e5e0c90f085dbdf6200e50938888193abc2b68a6157c480899c175e1103215c55a502c3c85ae8a6a46f3230a7d2e0a27d71a113b7bee5429654ca55cad960ac604ec735456eb53bf4f5150895ce8381acbea9c4ddd866dc18b7bf5d195445a9fde2af8de0460f5e0eca6a8444aad76979ba2331d95de3ecd8dd49da057da45dd0485e7004c991cb5540c847eac0917b28dd360851a0f1e07beae2579e0c0d3dd16c74bc85aa5f1ab851052118aa00030cba70f6745f1f69d5e4924cee08876449b3e0812ee4478f39caf3dca969cddd92b925864929dfd76c74949923e5cea2301679b24f8cace4424d36fc42b7c128170a5d4d053bb470747768218b76c9bb430b59f48ddcf0f2c2cb0be1fbd00ee11bed0e2d1c350b7a219a481e771c03d12ecf5747fa779d98c9cf86043112a9b6ab599199704ef70a5bc56a9d9526f9c8f5309dfe5693771bd32c5694eeaf2e3bf7c4d025799fcd955574932bcf848fc04d201f6146e9b809e46c4c4c6910638c2d99bba03101e08d1146eed1608cc61de5dc9825055130b6ac407aba43c09c1b5cd3bfe12add06fc6a6cd9eb5b600e8b6bfa1aece28d124c069d3b00225aecd7b7080a8b585652a8088ba46c82e74e1ed386738e88bf8123470e2cca934a672a61d3c3e8dd9ad55da8471c09aee99efffab638e701113882e2e1f645220e18b30066007e0ed70db79f04644304200e06e04cbfff00ceb100d7f4a9ed364022253029672c6261130b34d937fd7abd5e48741811d2d1af10726d6b74ddd5691ee62034d8eafa363afaf828bd954c3e5ecec81a0f21cc3a082bbc899fd283f1305a18868e5f744cfb49f872351b5d10d59537a6209c91a72b10e7053d545dc853da2f43e4f821860c1619d70c1affaa4cdf21009023c7fee0e1c415cf833786500c214f4808e64278291942787d71bcbe598ccccb7e5ec4e388a8171ebc301e8479b9b8fcc6e574e3f5c5e1f585899a4ba50a09090905b1eababa54adc69fbe61aaaf978d9652df1b45454535b816558b0d2121212120505b5f0cc37e54341578b1d78b33915acb84848484686c6a6b34d2fe69510c5e1a9672e76910dd79cd876dc69b711a99d3f0e2953f7dd315a8c584eb375bf44d0bc923496e8b09ef31de7a24ea9b2e9a454647b7f518a55d4cdc78106f3d32e99bf88a32f3b58a16132f0ef3d62392be89d5a76b3d1e6917132e5fbdf5cea26f62d5a26bbd8d6abef2d67ba86f62ed5a6f2736de7a2fe91bf97af514af66f2ea2a6eebfdd37abffa46d69edb485ae72ddac5448db7ce52fa460a619185901644ad7393be91ad7392be995549b7e4bea6b8ad3393d6190977d30ff7fcf0abf525fa66fe4499791516ad17d137532848eb4464ffa050876316d9a85eba56ebacbe99453133b779ebb26fe82bca4c9ad378eb2c6e47ab85e24dc5691c3d3321a12e12ea22a12e7ac59bece7e7f5f3fa89af3b1f7fe24df68a3ff167d61a6bac3116c59b5a638d3516dd597f7e5e3faf1ff9136feaab76af9f3bb1a222a122a1a2a278830909c922215924248b5ef106fbf979fdbc7e5e3ff1067bfdfcbc7e84e20d2d2a122a122a9a9f45f1860a4599f95abb4e689ebee20dfd6995aaebe8cf7f7e7e6ef82ea63fb07eb84ed71c1c2b040e2ba36563783e14c9f87c8645dff820e33a1da3ef8d07afcbeb9b090909090511e33762c8881113e33a9dfdb8b21f2ffb69fdc0b4fea215e3590fde175edf203c786f787db357f6ca5ed96bb5bacb2a06cc618a6e14bd286a15add4d817305edc1aafefaa6f155aa942ad2a5453856cb478ab97d575bafeacd49f56fda9a93fb1efe2c2c546dffaaaaffaaaaf1a40c0b4a85a8a8a8a8a502a305658507d6b78f0022124242444eb0b54eaa8eb34568345ac7f4cdc8bcac9d497f6c55ed80b7b612f6c5b99ba9b8a6a8a625117659a0bae74ceeb4d4848c866c6657eabb5eb542a4ea7e94fbcc98ea2cc7ced3a3bafd1a0b1d95176941d7519c7832f1714844efe064aacb5eb327869bcbe361ebc335e5fed87adc6ebd3781c9366cdcff0665e1dd19d134a07231714dff2b419dc8ec837724400a193827499cd833831c6ce586696b666cdd380cd928172e7594377fe87791faab8f332e663e6634c71e7ed923bef799f87f160f0913bffe265e5428b3befa2f2e65bb08092aa329d679ae77e5b95e2245d7cd73b3f2ee8ce43b9f35f7674e7a9d7576b6dcc750671a2e586100467e6a7c00599260cbb40082b2c1f4fd0edc3cb711752ff15b99bfd5a179ec5fad71e77154dd33495ecd55e32a183c70eb76d6b6eb310b6be266de736921552bf9d7b7b9fd489bdd9d2e3e91c0f97ab1eb91d2aa72f90ebf1e22fd75c247155fee20157c5fbe675e1c24b7de5ad5ca75f3c96af3cd45d78df1157e541574548bdcae1e51e5555f8117359ec3f199fa6f293274445e56dad907aeeda9b2b5df348df5454de04cf55b14d743648356282125c9325e2e2952c84ac8f74ce235921d9ebef04e28355b8f149487b44946942f741287342d1a9a09887024619db45f9a92ca6854ea531e9a1492e464ceb7a497a46dff4db2e9ca78249d74b0c3bf5d1878f110b1a8cf9e6ebd24e0a8b4535172bcad04ea9304f5e0d321d12e39ca4ec1a740599e66b768c94d5475335bd4dc752af5308b9789175091e922daf97f048be727429d5b272a3d55068e730a53616eb168afd5458adddddddddddddddbda35d565dbc4922680865a51d9a43a521964d750e7592f7c917077df2b5127403cafcf9f9b9b41573b3442afb7703c7fd22508b94af258cb40c3d6639dbf41896bd36fbc92a58ec27855aec6bc59a6caa493eaae92a0e88e9242ccbb22ccbb22ccbb22ccbb21d19e4806c7ceb37cce39bb1a0fbb843cc7a9cd7d3c51b0e62c51b97531e72b10d25caacfed5d40ac55386b62a925cfa8c879e341425979e4ae9a230b9544e01215112d1d5b62d106e7ded9b1310d75022b2af9da411d9a40a49142514392497f0c9247cb5769d4af5b3fa85652ffd8b5364f67b0171578158babbbbbbbbbbbbdb850362bae6d94db6ab3b66db5a08efe136c1b7525547e920e857f004b204a777973fb1ab35264e014445c708f4138158be382828e8d22d68cce2d288450c03cc81b0863b7d9ca26f78a865e8297da4c7bcbe10e274ffa21456943f5139a9e2d2c8e4d2f350adf5bae07c987cd86c746d2a996af5618b9ee924aff42cde8c92a60bd68679f1c276a14c250c831eea1575d8ac1ed98e3a63bb6d4ac13747ca4831cbb22ce32cc3ea89c89b5d88e96616c299150724e351331b1dfd0f2a1de587cde49d34cf08151d4ac52415e7a3dacdc35e3d3851358ba4934ca40b315dd231be524802b54cad5da75265f6fbeb278350d98c4010ceb8703e32abe280d49becd7cf3cf96a167d694614155d7f27ab297b4c5e78a96c72e927abb8540a4927b5eb50f62f964d0c1141903021e22d7e9cb4d191a028718a540271fa6267914277a5660da55db4de7426648af3419ab1b1e24d04fa3aecd449a97926af362b02019522104aaba7ee54e5ab65e80b750a74e3a7e51343ffbddc40a11cb733fdeb97e85fa06e7ae4ea614769d63709050eddfc2b0245792a4b0071eae95d5ce4ebcb6e0d127333db0d5fdb85d915e67cb0bcb9b31c723d58de3795b873fc640865794ab769bc99a0508e1ba42db0b8332eb4628b2637723d5057b916395389e52b67b13ba8ab585eb2e2a53cd92ca076a1ec1227cefb82c8711b1e7dd00e263ba459740978c4af9ecf3cf9c2b83ea9bcced9bd07cbb757ae477b2d6f39934e4496b27a21a6fbd5abce71404cc72c11be24fbf551df3820a9d7afbf729dd862573fb6b39cc5eeacd89ab2d2eea02c4f6916fd10bea6eb74775ec99bc2bde47196b768d677e3c3c153e28d6c993eed9e6edda6d764b62a8d404fb68c3c49be8eb03a20d54f474f81d0edf4eb3f2a5f975a227c335bade44b679c120125d08c541d1a6ce960e8b11663f5a00ee89d4bc02f5ed22eec51050c831bd90651eecbc8ab595374d04ad1731df4fd0f162951bbae686b9978ad999959f22b16d1af0b634419f5a069f0cd8293527a789b7a1a6066e6bee480c8739f5b6f16e586725b8bc7dc2c5ed3a8adf30b5dc7b8716f2be09a5924752194a18c28e30292293b60851da2c47ceff983b62a18a78c319040dd67638375b783130ab117341863a3933d313a9b80a9ee373ea65d7283f03f2f41833c3a78450f8a36cea95c13fbd4625ae84f6a59061a8c917d8eb6aae4a992eeebae94313289065d1db4620ba06b92af70e8e4a18cd762a2bc11f2510af9782ebf949ca0d38e34ab48916671bfa78b2f82b1773f8575d3377dd32dfbaa0bbc610cba5cc8e21f9624ee07cced2536bacd54320da9e71ece471fb319f78304377553d7b8ed17c34476ac625ee52320dec56c5771244f2aef7ea96679686868688847bc3c0467e41b055d0b7649bb131fb5cc738bcf9266c9ab2c2b69f158581e3bcaa28acb4561d769886d3f7947479fea7e7c0473e797ad789f141a43f60e49bbba53a9eb747b29db717397e0d4ed38d91a5dc71b2391ffb073cf121ddf23d7e96624cd922a9cc357be95a04e976724f384619814da0ef6213cbbcaf968153bbb6edaa08bff78489e9ff48d76098b8c2217f9742d5483ee6ba1a3768241d89bf6cd06afcf94d43eedd363d463a066c95729a5e0aea46f380b9b7dda857d6b9f9e76f11108555c6e18ca5cb879dfd6de2653ed079db43c56e18c94b4f6cc7240213a5b7b8279d84515b0536e457a8d62f0947ef38dc94e4137e7bb27b683bd57d0498823c424d91a418fb5ebca432c723e28cb1dc8c79dc85d48dfd68878d99c8f78498479263312d4f0ba5fb5438fd1d11439e54a29a5c480133408ddaf4e3182d0091a9a0401222272c21d90dcaf4e19a24311cd918e3a2307ce8e8aae588311dfd4b8b28586a36a451880a6cf0d252c99429862800e5a318593fb552118b9f1b5d6dec0196ef4605c60e4bae08a1b3de8841514e1460f66e16acd02286ef472ae165920245930861bbd19579b2ab8d1f3e16a5408377a3057c3ac70a3d772b57ae40c377a3f5c2ddb8edce809713552bda20557dce8fd12a95708b6073dbc2e9fa7b95ba0b9e0c1d7d4414c437550c6ab447ef7233fc6588a5d94d1d4fd338fc0228d59ecc8248b9522ed626614639c70381bc108238c118b1969926a631b6751aab0111fc51becb14993261d147d4c1d8d95bbd61863ecb8677c9358b21cc4403d3d3d3d371ab5eba412e3d0c7438fa673e74cdc2f3daceaa834ec57b5452c992219000000000315002030140c86c4629160388e1451f80114000e8cb64e6c541b67511a63c8186388310680000000000000c226006fb83bde808c07412f98bbced5fdfb90f86611404b0c497dd4d162ed5f1bc6dce36fe8554544dce529c36cde9ec87bc9ca0de92fba3689a4e54c36a46c65d9f7044ea17dd7db7b42d2cd4b7b73f3df3697e563d258b86577f41a3647d72b0e5ef3f3932ef42b53e692decf7ee97bdf07a47bcc499f1ceda89bf5c624dd42e732b199f535cfcb302e0ec76ed016a06ab27303bee9683c7aac4148f57bdf9bf698745e4b9cd9a65e33497bea51a02a2f55d3fd6b3e3f3b3addfadea1577cd3dbf7ad57db511fe840b3f676038fb1dc685fa26937573776e8facacc06bdf84d77bed315ba7e852e9da5a82d03eb65933425f097428e6bcdab68c7f5daf56dded86fdaf74f5fa87c88318f5e13bd6c92be06a87a64bcb89dc2a90c1df4b4dc9176f4c6371df11390f9d319be26c18ea73ff469af41bb41ef02490f354a143321a539bf25a4cf67d033bff84798addcfab01e225c60ea5e6298fb5073896b34d34638a2f289ebaf8159a1e32a6d3acfe4feda459cd2999cc0b03cd442f2a08f946dc2d7f6816e6e5cba7cc832d7b4f4fb24a2df6912f2424978d90bed155b4924d40b4d14f6fbcffaded2c8c8cb22b6e43d4ec9e9044a77c80047311a1f13d1b1919bc59fa41d666cb628722daa9b77c9a10144f15c43bb90f076d9f13a00fe0049b7cc6bf49f2c5f6ec6a30a67937a277dece39588f0e4a2be2b1253e425e786ee851fd1e32297ca603fc30f7a60c3ab6fa1709f430f70d6990a912d250cf90d1a7483ad45b94ae865bb119b5af5a12c334408b09545431b45d61c4450894604a30601b1a19d9012c0352d2fd5c71910293e4ae67fa971c4824731e28fb47d809e28b3bd4f1470d2ac243922e565cd844b1ce3e3284234e4472c37e90fb80c1b419c73d6af2cd149cae9e376aa9383265bb26ced137146c13da656af736023914b6c1b8ab942c9b5565db61808f358313f2294bed6637a8fbfb2a54a6e834882628e248b352a68b9ecc7fdd028f0466540707bf106f8c599195d7ae8dc5f6cc8668ebd3cc152ad62af3df9f6037cb3fac35c77bc127484cbec0ed1246313ed43f06cd29a7a2ad06fe069480e03c8908753b4fe2586626157a9b0d7656bef9bfd945a6cede3ba89a5b67125c85ba345a22f5531d5851e342af79db7036384e27d0bde5910672858c4be9c09522ccc5a37c26c488e9f8a69c3adf039256501b5022f49f4056585ea1fe59bdd44d7acd4818a79863e280cc04a15b00f22383674818626795abf58e8c6317705e942512625cdac37e230fe39ba4cd952b53161fb0aeb31ffc9e97a237e18673fc06bf3f2b8f6cb280970264307b1d3c96b590640d57deb858f3146321f6bcd441a14f7c8a0e5463d19c37686b35134dcfb1f0f364a32421704a46cdd8897f1c7e831d4a6989d5a0beadeba21be19c75c2be5b4ecec9ada757a8b16b7e255a9d84f8bde7ac630b4b9d0c7d0db91e5f006b71bf9c3f8de30c52dd5a1f47278abcbbd199141b3e85d7bec34ee56ba70541021b4f640d71435db0d38667c6f04e6ace2b64e14f3e8933b9fb49904b34248ce40c724bceb5dba85366611e6caba3d918efe1534b8df20bd072963962814039cd6f9e7b4065964a711c1d4e33b68241d201e6dbbf1a97662494a8ea30d046b312f44200499b7aaa51b3c0b69b93caeff34e8cc614878913f113dfc3e9a2709fa205092cbd69cfcfb2be9dae3b5022ab27bd6cceed98d492aab0a393c833df228c9b32a59519c6b956d667993ddb070417ede32350d69ecdef032f9ad435bf22b42e803f2add1e9a80fd89388d9405117fffd631e220d08f74f8230910b0f66d6ffd71bfa5183b145b3e95c65f0525bcb39afd7af1b66917f15880ee78aad12ac04dc960e561dd7f654ef2e0136770b7fffd43a1d1cd0b3b49e46124c54c3eabbfd7d27799d70d9a5facccb961af6ee5ec9e7c708f83a525bfd59e1deac64bd529d6722eb944cbef57f3f7e4928d26ddfcd7a72694e9f09659b69a7c908c6d890c2d6d3d07125d17724b739d4e88041faa04071811343c34cb54428e283404522818c41ab6982f5ee630981940fb5d85b6e00ac7b462bd82456afca1bbf3979735200123c40df2061eea2b4d287484254be9e2029d6e37c51d8b77ed5d313addad1bb1f747fc1a9c59edd62eb2c15e1ebc413066c21ec169d81243e5f8f1c1b8c2eaa63b596380c2f18dac25c37f0f4134d688913f0eb981de17480bbcc0703814c43595e9455444a14321a8043c2e798bb72669ee70694f2505ab1c9c0c7755363390cbd85793e46998f4ba228a85c99f9d1dcbd681c1cf14fca978d4f6eb8e3df90f57ad55a79d77993a9e88182ca4ceb2aef87d0bcf18e784239b16b0b9443627939924cf2d527a887acdf937d9d98758a7f3f2594192027063776fe399f3f58e8abe2265c236ef71d041b1aca069cc8c79325a05a96fb871b221c07309228ea6db10612e44d81dc14c1ca52b3ef201805a2e14f5c8fe6052253f9c863c829ef866e4ddff58974b469924136faa22e44af1f9e8b2543873e5a95ae85aab975c8a280d5a2e1de1000b6b93519f765a6042b9ab882f21dcf110329341021dc30db399043150cd1512ffafa73467c22d00b9542b74993602e29c4d660860dde570d6891c04f5a17ccc13127b4687024fb5c97752eba5f4f454d6f9bfb18e0feec7055a5db617f2e35e6eb4bbc16422f4ee6fe880feb47282ae1e0c737be94412c7519471e5fdcda9250a0fa921d2f280539b0094850f0b5b6ca8636145966539622bc1311023f28def684795b3d34639d58084b886915ffdd7ba26df47a2303ce460b2db78fb5a01bcb5f7a16e8ab970d7ddbbb8383bf2572a228f45d9430cbacdadf2cc52c29b802fde09036e2c080bbba8cf82d38243170e8b0305e82300846147a6cda012e0e385896615b952de430e5a762f53a54c6e0f9f71b290ce41d7c126307388b41697d7a17031e161f2778a14c0a98a978767048bc37fe65b1238630d02f9f41acb5c087c45bdac8371a9a13dd9d70ca876df9a017739bdeb5d0670444f3f9eb0058a0b102ad6a6cf558762902fd83441c5b291b46330924d92bf2a871aac1921d77c645bc4a037f745fe57a0457fd101c894098bf20cf13f8a4246a11e9af9c187f9c52165c863a7718589d23cfc31950eddbc6de0959fc8363120c3f329a032c84893bd45d48758b93adf8f8cfbdc9c6c7e274b48ce0111e93e3b512510bf474d391bc73a179a7782e94810e4423996c4e9c6e08bed802a67f131508ef926941afae3a58f26847a9eebfc279ef0d9ed5ef48af82935e236789e900ef27410aa8f4129239b13b56eb7151a14abe6ef524402a523f0031e2a8ec35ddd409767aebc0dd6abc5817aa48110aedf521dad9cd50bc8184d45b66ab96f8ff4c4366cdeaa806fa5aa5dbe60311a62c9b57c75f33446fb25572249b125b1310336d5033d2c08f81d181978dc8ecd4aa755c189f9a749a13f8e862f2d8209f381cbf49d3061a09b74d3c3985ace007b564137e18a94c3ade3201a5440d8917957f7a49db5f53d4823c1522a0fbc329d143169a6f10a4752f952390508ed407300ef2f6f1c6ab672e8a4e5e4ef9e59f2a270da0ddc1bcc69a04bd8000aa573eff2396284d0609229ff10746f592421f8556c2e3882f8333621c4fdc291133f57122d9976a537ffd1e07d08b040a73b466411b46f42c971718de3d06011849c8bb904227211bea6716b06e4a118f9f07c4ee630cf7507036c59772833c1b2a149fa7e8bf81dfdbc21ef8c7e3e22d4fc7fb1b395090d306546e2355e99ffd0ff0010b8ec272d796fc46d986eeb15f01091e7b93a0d3191d43c92ea5c25c2da0d89fa3580e088001c8f8ebc83b5a75dd5c9a228ad718e9ae3831b7ace35b6e526f9920c647b807c9f56bb69ce7cf50d5f39ebd890089b480bb2d465be135d0c1c2c394fa0d542b57c7684cfd4a43d92d159853a7a90ec4e2ef59f248a645d88afa0d17a3a0a338bdb018c443a5689cfc86c7b1113e5fa9a75e1cc85dbc87fd0b8004c01db0c2b509175b66aa50462a0fffecf047c9900624342674925a53f28bf4a318d78977460bf7261dc779826bb26206fd3186521d3a642702e14ee9d6da8712a7dfe644f7f9c2a5f4b2c47ee076567fa59bcf6b5b90e5389be56d85dfded829fcc8c07b63610f505286414ab48aa732622785d092421b308e86db22886092c4af29fea30b0f2dc1762552666ee0b5ef3abaf2119a355fd1a4f4053ce2cbf72a99129a0f8633302c43ba668d672256882823b121d8ce8ce9d14e23eeb0d73e9aaa287b66c2261c5bdc4935ddb7ee1583c216a90c92aa6a7e0567929a8a4e2a5fe963c778aa9d24b092d1884ac75892fe96a47831c70e8d13b8d5908f66f6f24815c947ceb0cb04e134fab0e5f16d3388374c8074bf67b852e9fa33e8080f868094a0d988f53895df50e087def56c3a782999fc0c9f01461cc5f4ae0d2188c1db38bb958166f63e4e4c92a836e57c1f2d2f4eeabd8e2ac6d077ab2cdb4ffa145a69841360f6ab63c11003d87d2c8721c3dec8e68e2ce056f855a1c8c1a79e209f179956a86886658ece22b0977406b487f5482d62f9478f05455c998569944e1a808ab30329a68e50960c5c84d44e72d5485910f05ca83f1833fd48b46132d53db692beacb827c44cf06081632d572ca25c7b266c08e91e2254f45a4df0a30dc89b19264fd8f130b7e30493949a3bbde64bcc0cac0007bccdb9248937854827cd87da01e123d7d171c7cb4f34606ecf2922056041407477385f05cd7122663a0761caaa2f578d75ec1ecf72518fd3af71073ce8511e9effc14ede4848cb3196bd25496080abc1fff5d7b5b6e04f0cd80f0a6583a4cd5faf06d16dd8cf08a7afb85145552265dc1b107059970a11ce0c3dd1161d4c939965158aef72e02bfed9144cdb40fb7618cc56bcb3f18e8530a0979ed6dcd23b1f56c71d62ee28f4385d5b126387e1ed33417eaa11cd835d6b4036d2103a8e1d09761021e3b8ce824d0871e31bb4ad0a25beb402b774b4eb889bf9f0fb95fc9d9cd32fd6d9d3e44ecbe2bbbc940eed6591015ae0ad45744125cad70ce123777ae26c5bf158be9fc0c155299b307ba5033a43f67e53f9c3f8201ba9267b223c455f787301b48f2cbbbda11014c3e57a19cf9ab1e54beb702996a8af2b59bfacbb621fc566b1164a7c635b9bd426cb9a6608d4b5bb26fc89cca093416575a8676f4cd11c8ed815324e4a6e5861685b059b3173adc3495c97fbd64dbf13f304cc88f1353d2bbaf130fa9bc0123bab895c452bdf9b45cb82154bb65ab16ee6ec611a9b5a06517f1ee81407add1e82fd6bb1ec9f522451922abd6845ffb6c9f1340ea0ab16917c5d16f2c5aeb9f20ad86c762381019c74c812311781a8cdd81511e5e3960a4d1490399a87f63a281148ae07333181f770b3c60204fb190795bf09cf8aaabc876f206ad262edb1de2e7bbaa5e4590ee6508aa9d95f6dc76f18e25d1df6e17b20274890ec15dd2bb85ebf65475af2eb187cbf31fbe899aa92c13d9905984b9e5c6ced753cf558666bfad3bc30cd1598c9b269391c4d527d68e3c03457ffa02fbc57a5c2dc87f49ae4a023398dfe77ec174862079c2c629fa46bdae5e96fbf34cae61f83eeeb24a6eb3908e1178ab581eb67ab2fc0e264e9a05f1ddb96218e5a0bd42f5c216bf571491905bf43a1e706c158e8f554dc5992c471b4bc6314e619175f344ebc56783fbd5f0bcf4b7b954b7db065948a39503d310da644e23bc6ac0d10af5f9fc3399c5ddb7c942b16b5c051b37a29fc045ed9afa0346881f49a3606f3b64045613a4182b570be02cb2e333161bae7efe3e4c1771ab74a8dd7dcf778a5fea369f17eb86fd9af6365d31a90d54c7afc9dcf1c7e2cf93c76d04e3f28061e67d85021b8a048c2cab1c1122ba0447b8aa61bcc6a285201090c4fff545174bff3461dd41f3753b573f7fd946c072637f6b65a5927230a79e23a3faa8d32d074313588673b3efeed29d11f3ed1f8a1dcd35d05e4f52dda532b5a0d861ec69fb547c3b8035c45ded75b86771d9fc4f9151075a27b2b788d6e201698aea35db22a650154faee0dc8dae5d9693b7a5145944b111f3241b4dbbe0481731ea64c0586477c6be64ece73abe1292061bfa8a158a30c763dc7bfdb0d55c556e6891bf74304acd8ad3ac054c8904560cd3e675f6a3632ba6c2c5d0e90b2674e1f9b7ea7baae50e2efbf1823558b54a0785d0c201898e04cec77e8b3dacacbcef49a907f4ab2334d0b23e1c6afcd5d32e601b6bae529d06558884738ba13dc857b546d2d09aaa2f3d31bfecbd7e3255aaf21ea51b91ef8843c4428051da7a29b07f66964abac038762fb20d2c890119c96226c389841b0e693b2578b6d6157d01d7d5be19b2b7dff2b4eea5bddab6f5ce12585c5e34c7818c40f38fcc32c421519290061af6241537836d1220c30559145b0d5d90aebaa90285c7a2349492ada3a4709a0515a030f7df31c51900bc5ff78188503cb9a7ca2971d250cd82685db0d85fb5a0ad073e102d284ecf5dd18049bc5185405550962459574c13d763dc2d71e607ef61c816a7b4cd66e643aada9a7aa1dd8937ad00d6fad829da078c7301c63ce67a5128f55faef46198e80b8f5856dedb88e045289c468321f5047128e5a0707c1c981c719aca2021ab0f64a33897d73d2ba4ba16c45749bae40012337554a637ad45080cf56889c05dba38cbb4c94cbc88d9bc45f74494b0cf81de6530888e63b0e6b18d6e21ab69d592f9986408c44e65c47ccebd5870730396d0bb44542d46e8b966e1b203bec23be79bb47f5694b2ecb4c6e294476a3a78f105cc6316ded80101cf72d725d9057305fbc7018771d3dde002bf2514911ababedfdcd2b24ef0eeef43e7ccce725d80e9e0c30ff8529eca144dc590b66b94ce380d990ca36393c841e5b46f569a5992daf4a4782b5ed374252a614afa0019a7e74e35dcfcdcd110a30c47c18652e90e4cf67c39226c50230680d73fc1957a61629359679e5d54c907b6486a8cfaebdfbc0a02e042d7833b128908e24f3df9732051a28cdc2c66550264c01ccc1df834220d0e70f799a27b2e6930ae1c3da947c3205e9fe607ae2cd8651519a9f25233794e38ac23b6567e62bb8e74da7e028582debac606c0f420d84f2608933b266016dcc85530b362d8b0ae887ca7ecb1221f6cc05f908231c6a0737ef45b677ff4d90ad019e2b4e62ddb6482ce67440229fe5f52bce29ae9cb59b5f20f0229b2b69407be8d4606cb05efe966595e518951d395c4d367d20a6a06fdb0aa37c988eec77e6801185f56795516d5701c5789ee3b25f78f97b9417e0ce586838370fca0335cae73e8ceaf0dc131647c45b253d16bb0c95174c04625b671b74dc5efa312716fc4933315936d0f75dc40bf34343058d9184c02bd238b8c956b1f734d1d31653907c8f638fc2ea66a1348b8d7a197f1f3395740a1ad05254f96d10fb8a258bbd92079f20fd4fa406ffa8a1b8bac39e4d6ac3ab23792846e8b0e17d254b395eb59987927208f4ee221c038f521d0a6899dcc9271b07449b9901ca7037d07410a4273c9feae0490d8f110cc51640cc6371081fc14e925551e11b0a163328cbdb6f2b1bb7c65b7fa16728b36f32d424f730b2759aae3ac8fb5dda88ca5c817cf43dee550a18a54a557dcb3bb5fb071e0baf7d17d7cfb21f48d36aeaddcee5d5646d8acac029a7027939932f5fa130cad32be8cecfd22006d2e19e820ba656ee5f4670b9162126854954b246d5a63c810e00310ab703398aa1a6a8b69cb57a0ae6aafb6de363df4aed06acb5a1f3525b95bb9282e04f1ae6165585db44d4dac8221f8867dba27ef5aa87b28de17624acef620a8030d41157eed4269db21f4adca9e52f6546add6159ed1e1af2ace3e4073da3044f57668416b45d281487850f35c247f3eaaa3322b8cd81a32f049841eca016d1b2ba6feeca63868f2492d76a60eda3697269b90cf60966b0d5c523a13df10b287102aa2a89003b206d3551a43a65f62fd709da02a895dc82f67a59d7ba20c147f27340a557eec5a4a1df77ad0ee4bf6be3dec1467a772952576263080e461e219fcdf4c95e17a9b95bf193c37502c0a7cdd366f74890796325d377dd27e14913877f40b8e2cb5f66e744a0d35c1da1f20eb41cb27320a880bede3b009fa8518cb54045972426c82fd9e0ff0ee783d9f9b2076c652719f8b747db263d54bb8cb05390abc2063048b6f387912cb8e60831480643264fe7e541a78e40706f21b9b86c151ed238d6fe63c80082657de4bcd94f30e3d02ce314a1aa293067ff77b6f290e8c3e8c79abea22bd82b5458e217490f2dbfa2d15b4aa499175b734fb45820e77682e0df7e11e86ab556b2f862bd3cd187267f3de2cc80225a996525aa5d3dc3ac3b753d2f709fcf6b250d473f8d435f6a37d6bde3a2876c291225e61162c1e4abc482d2dac8285cfc4d9229df879f45b8b093bc752a7749ca63704537622b93c8af7eadd847da215ed037e26653bc084c3d54c32444cb33a332cd45da8c3411eb0e68258c83655c5ca35676ee5505705713fd7ec5b93fc401d5d1f9842458f950f41ecec640535e0e45a659e9dd36d5f9088024017fd9b738506024ccc3009765cb901ad91f3df4bb25420c2eccdfbc22d39c61fdd73cd4489fdf0b53ccf8fc909b51f026bb855edc8118083bbd14634c82135f30f44215f3d2bb618a13203e6febdabf11b809ceaeb3f152f5ab7d03e58600c415ba98b3e1d3c1b3784e9625ad348588880a504b11bc962ea54664d9f0bddb3f6a1a4ca138b37ce030ab31cf1e1768e898c87f76ef2293402e89dae7e1a26f739f0d714f701f2fdc14c18c3430bd224c7ef55c59d8994d5d0bd7754004aa6f2e1a05a64432846d81709d9879eb4107c005d74e613e9a4c09f59f7b665e8e4989d466dabcfc8eb64fa6a737d1e75747e8e9d7b5a01e516512da26776482ca3c6336508738576e5b4a711b3a19177975fdfe7c0b84956607056e1f132f3459c9aeda7ed3184b92f15e8dd2acd89e2afd597d26dffb79de5363add9b6876289b5c5b18a2f7b0f1acf42167c6c80db5240f1cad20a84f68ae79a495cf8f1f781f9ac802efac211635e0ef1630db9cf1c454ff49b771c8739a89119a38239d1df1d3abb9594523328391a74f60e804c54139dbf6580407036eeb420a9213238ed890983dd99709a7d95fdaa97d248c9ec8cf2e043a165593ff126467934089470a64061853eba2ebb48a00d5801c2bf8d48b6c0b07b95c256618aedbea31b1544ef18a25e1b40bcbed88c47acd8b4bb0e1ccd48e9d7dce8fd1367a4b3754bc6e15e663f92a037f5e17ae85712611803fd9d7506955a08d579a84e96264ee396a2b67af82fd3e3d9a16dfdb2e9ad31bb6628ddcced14885541c7f56cb8538edfb9778d9ded9a215d52d2500c1bf9659c781cfb02f4712d039b4df51f46d1c770cebc5d1d382ed8b840182904a9f9161bdf5d6dec730a3f65b80c40b8d1511c44b0bc24996ebc2d12bb2624b5541bbb4b3d05e7b06b86fc1d7ad3f44d79450e0e9ddd5c1b4375521f866f168ea79ead5cba32e3148e16dade05baf6947887ea74b1c9984c63d70ca55017f5da0c59478553503962b71a6c6a9a8160f5e30bb07496802df0a081ea32ca14dd8edc8dae3d1be8c15ad6bea3170fc5507c06425a2e66e6db37fc969247ef9aa1986648e86a7c3231e99921b2937f34cb221265ecb25a5d0ea40aa3103a8bb840d907173203e3e0361ae6224bfdb4e28c2dbf52cccfdaa36834b9c3be6eec307d2d2fa379af561f910c4d62df514251f08067832d33f6659c0ca58ccdf90b3317e4b0a58402041986d8c661b2c1d37f2bb39d9c714cb56aeb6d4bdc4d0b1ca2919167b520c2d3772f7f566934903e5213ca2a52ed16a00ca675d1ae59eece06c5abe41efe7d85728c0168edbc67a28120d9ab2cc4b00a6313d2a0a129cb80df91f3de7d4269c3cd1594f2f6a0e98f0be07a28bcbc2a4a4ac05746edf376012c882ae3c685ed6b135848b0251a26e430936fc97179807ac8cabced429784dbee5a0f53e4071cd41638d7b400f415c7016fd2f88664e2d24100ebd777272b88241ac5a6d764a6ac001a515d1220f3bd25b18551a7f8dd9e871a314db842463ae62e01058c9470344e11724e30cc7eebdb19bc1975edab24b2e2f920d503804918d98db25f10ff6302cfc0aa928851947676c8761a8c521beb9ffee9d25268a7145b19e0a4b0899fdc49efb277ae535949a28cc9ce60b588f6073b41b94016ab61b9aa2425526228e28a657f062bf0624001da2e53d7f3229016058898a82b45b373acd536b6fa0b2fd496858969a5ff36d5f96d28e3cc893573d022dc8fbdd393ff2178442a97d56a6feb7fd84405a043c8d056284b714844a76694c97b0767b43f166679897a91df4f54281c525eb52fbba4ac8aecf229d4989d7517bf8fae6a0b2f39582537b39d6dfdb6fb755dbcbcf9a9b77ca62065f84c7359b9f729a7907974c99383ce2c1c9019268a6729e43c5c022dfed81efd30e3fa43a3610662caca6cb0fa44d75e9ef2b8a697d9408f099853c30507197edfa4326ac1c557fdf144d863ceb5f7c92fdc71510dd8ea9c30d540990c1e6f6f251202da70576f6b80d39beba8a2d486c8cc5191a731a6754f57840f1ac82b3f2baaaba82268a3f05a680da739a71bd0b3d9f5c3896de0cc38f560f2173e80e532dd7b284943990924deef473af8748987f5fbfd88099fbef21183f33a854fb31a4c9d99212f809106c11cb3569000230d4239e0bda41166b53e93e6437e31c05acc1443264c14f2bedce49c3f1f1fe67d9bc0ada80e26073262f454ab7dcc0173498065743c56f4a8ef360116a1cad7927f63a955dfc3eab761198842b541f9c7bc26e4fa89d436c535d2cbed1ab20acbd261978e9e0d17dbedd38b6c1d947db0e51e76699c82714159bdb63eeaa7a73966db5b6852b7acd7a86c5bbf8b5dbce3a4172c75561b5304e0e359561cccd50e8aa08d9181098a76203978463c13008f475a152d0d3f0a3317407556ba26fa3bf8ef1a1c74d258356065b1e385496b729a4a23cde43ab7de1b810478018a7344c8f5c0054453098355865dd530215ebac40bf0e7b09167328422642b426346c2b8d12916a3548fc9d310fa4f6e8e445976f4d42bf7e3ea107b003c7283fb0f089b1acd1d43dd4871b5d7e7d3856622158096aef8a318ea3c5201b168012e43ca7423e7cb85394d90c87dd519504d0d3e864d1e10cb9206cfe9a6548f217e5c160a0c6a951b3bfe4e1434545a876be3370ca0ef8b919f4ce3a9152d91bea19377a7e58acc58408d149f589c28fd45f20e6d53294d01d1de07ceb05fac3bfb12f36e1a46428582a6c8be34d687e989365ceb1a901a8807953b1b27b180b814c9fe28837de00795110d7c1a2365c6161d37e3c034500855b8676b48d6884597270890a74eb8bfd1cfdf65da3e499dc34e11fe8d254ec0d94ff139e0a4ede0c159202e50cd2bd6326c6a8b9326dbe49ddbef22ab23d4dd9ce5c68556902216d226d4663f37fc989762681ff4d617f9a8c57ada303ec22b9ab31bee9e7e767dc4b43eaf6e2687091109677120945e2d050c75389bbe1a09baa2ec895771ac938441f961e0121e99bb48b5d3380a3edeead9daa7d106f86f2221bada805d38d16f5f529901a0550e02e9e7a7ff69ee11c462e29315592c1f1920f9d646fe80f8338514c50880b61d18c9fba0a9567264d0a60801893cd1cca64ab8a8a1fa96a51cc46028d733afa934800b110fa5d503d0779c790fc3d71e92d257873524eb58d70993ba8b41290a086683003f45654f84972f53e3c404abf866d2d5208363aa8b77982291b78ffa81cc35a2bce8973ccfacfbc1c2188832f383d16e9fc8874f10f13f2998db1ba6fb427bbb566c6d643d918b8c00649559239502ab2013fb74c28a8f84176784b8322ad7b75eebf5b1727d54387040d1ad1c0dc2b75a9c6b881c6fc8853406bf20dab5ddfcb35b6c03bb9ba199cd3b3e831c23a33b62a152eb306dd7ac6457ae600f664bab929c0bab826f857d96174ed7dc9add3a286bc5f91e44026b45922a9bf4ff730fd9e85298f2ac60d510165a7eb30744a8179a2cf08f97487c7c6e3ecd370429e756e1ee55b43918cc3318ee83cfafbe9531cdac1a16181e9f972ad472cfc2e4c4506077a13c84874371c1ebe2b3691b8a0cdfaa65921d76390ae6b9105c89ce0e20b8f7bdede4b9e5c7c339d06f0f8744c0ed67956cac29304cd82f8677e681cc188bccdb74e1af85f33f77a95a8d6f105d9ea0b140944b6ff078345f209eb55f5228efa2b9bd274314b3dfe4791ac0de4f81ff97fd32fed4c95bb96c4360d870ce49355a293429561e0d9ae3bad72d05732d535eb4594142180ac99784a2040c85f09886d81e2c1e430d35958782b8f35a2e4bbfed4d9a25c9e828ba8722a232cc43af1eca4b3f3a7a6d655dbffe010bfffd13fd78f561e04b0466157c2e3c4a98b162e554637d9319213429eb6dfe6308363df70b764553a7710c2ca55afe2cb96b3c562e430e79d71a6e1d73c118dae0a1f5d88f55d1318b535331fe0d120bb35fa01a22a3232ceebdc3f4b5be56d2870ccc7270702301a02ee4e89530184a919e74f980017f59e85df9855370a183009589102e579018d9f6466cbb695c4f97a6ac1060b55c07e68101471c8189a7b69ce183481fa3280de921f819c019f4fe08255a83071c6c74a303471aaaca991d97b65d377893743fa7e7a3f6918a30f8b2e0e34173fe48dccab80509af0182c9236a00a5c6cc5d0bdb52a70649b9e3ccbd5324607198aab81c1e5b0d8a472bfac026486fd13ac2351ba0bd75fffdf572ed036ee73a48a40b6aec3c3a3e2f5c5793c971f15951f1dffc464de561ff22f494f3e4c56a6999713c658a0be3190e73a8d9ca9e2354dbf951b2a3c818dd1270bd6ccdcf94694724a756c734b9ba22e7137226ab02f60d350255a2c1dd89ebbd798d66e2a2f42db454cd6d835fd8a7904c780722e8a6275d5956b74f929f869c62bf5793da10329e152227a751c8c8f44949be6114671dcea092cd52f2f09f819d60de3f459cd284b3e26c133c5194c51b9271f42b39a2e13b5254fbe3e3c8698835194278a19b027b57451ef7cc44f7b01288ccdd3f7112b01175981f39169f33a5332c929003e838a4d17fda84c86c5858f4e8268532448112ca64e4340f8f2c9ca71b62a7da7457d5f45f6de7afa848ef8f0c903cfe183abccce5de9e5403a84439c62f6a4b21e2e8f3ab45a8f8fa4b22b89f3f8c414f672be0dd980cd576fa3ce924fbf2e7f91992f91c4e8f49438e8e9c235d56609083e13f1cb03723bb651faf1c1054f0f8ec43a9aa1f246cb1753e641f6294d5517a6db8e26d7b21266f2a2b8b08322a85be2aa92ecc95a1fc5259014e24d4af49629db60fb42cc1aea7438271bb61df6d5e3e0ecc1166fb503204e1575f6aa8d225653a1c76ccfae14caaca116693a5032eea80a0cf62eedd103f70d89a39d4cc2a64f0f62a86e30e8dcdad4841d721fbee6e423c01fd70cf8b0b8836694b2dcd5340fe1d36a319fb17f2b877d8fc918d45048129ec494c44af12e23658b5233cc4b7bfb988c832878f5338b4bcd1b5e78c09ce6395dd91425049ea40041656638e7a7e987ad5e0a7c48e2c48b937222189d1a5088bd2f6c3c86bb79455a385633921729d38bd0bddd53c9e65523c57bf1e3b6e4af1c92a75e0edee267aa35197a7a6a35fdffcfe0e33b2887d5fb5b3149d665ecdc08cefa50898dd873dc1f8283415a65fd2ebc0c5850189bdb4e1b99bb839056cce68d74aad952467ab683636827bee267445d49c0014f095d6440041ad5768a239a4c26078a59a6fa10eb38a4faba04bee570a6b9db6b13ab4557f859a845ca0cdcc6e63ca81cd844832e1b5739638f4a7bbd53e3f25e62701f07a964623df0bcea72d388b03c0466714c9e589417969c49cd237aa71c727dc01aec6bdf0bb93532d2b816528e35138f71f70728550ebdd20811103ef37a1c505a354123d95bca0df5959b41cc1cdf14aa3dd654f510a913e761e15a90f2d7b35b29b00740cc7d42108c55be5bd2086ac389a346437d1fd010373ba1e9303334fe0a82d5813836cc26e8a3a7e5c13fab925b3cee043c0b92004ab85b79f6c952d5f37412519475def8f4d43a7561afba226e349322826fef46c1c96200ec35ecda2536f820c3299987b99ae967ee638654d26c26e51eb8b6b18893326eb9c7a8d50de16698cfef9d7ae8fa9baa7df2394b3651a062aa06ee638fd5adcb2854803ff52c6b304808dca4e3146e3212cf7d150b9950d042650a77b62c2a928e8cac4dc1a0025e1ab19c586c91127371122ac2be8a92c3e05c3d01e3c069cdcb17df51cc92d1fe61b4de8f7573c8a19f56afad89839e3cf005d3d2edff68ec0cae36ca03e96f68a1d389c1e8363417b9e6e2c968786805d6730a4df38639e7de7b4ff6f95c73a641840fab5cb661f1b7d593fcb435cb573cd35728e5eb321e9e702831fdb195ddb7e68d7eb6bcfd06cdd2410d2af07874e1651eaf07bb1a47f287263afa46453c9f9ba3239d3ae04858d205d9a9c0cae2650763f05cb30e412945a5958bc4deb76aaecc1354749d00220edd2c5e7252f26c7b78adfb267e50ebcb10e76e49f2b313627ae5e12af3783b9c9c4e23702d5c681fc4996e8c5434e6b8ea11ec03d3f90f418ea552600ca7b2ce7f6859d631cdbf1a1eda94e47b5350c295c2bd4f29b3c9f02cb2971c73a2a95315f5859e2631abec67a7f957e709948b28eacec039091aaa450c2089b3a96834921a502fe5951d00642cd11acca430133b4e6335136cdc0ef3f103583da1ca7b80de3547ec7fe38aef2ff6e5c82bfd10e98d09d155b48fb86f36b7f4c27ce4ebe1579be50adf90fa1097aa88119c38cda6463ccfbabb73be2d2b758227d7d6b4910faa52dc0a9e1a83542bd1a248ebd0f767952f741dceb95bc0b6f09f55bd505ed16537d6e9059db62be41dabc929d3107aac9573460817192ea588efdfa6b433b3ba03cebf7f312c8b91acaf8a3c87abfbbc37cc5e71fa5e30a6456096464c5d2969aca64557b0e2f6949e7dad97d3aa3114386c844f56e68549313e8a886e18f9a4eaea5d217faf4f8963abc1972535ccdb5ad02cf75faa4e870e5fdaf089b616f89b5e58dafe0a30150cfc59d868a31c9b601f26201e501d60fb64af8a5f740d43602e441fe85e487960186d84d92cfbeccec87f6a0b4cde880a0014dbba684944d8d305074fb2bc6ffffa4cacda82524272af6eaa1faf257077ec58bf894a3f6249bc67a2bd871616d4f3e296cd3f3418f39c5905fdc87709ad9bcd028c9d349192dc22938b06f7c4bffbc46935e8f1127d15463a68cfc02436578de57660ef82b7278427c75d9027f47db244482205f0ad7215885b84e78c16427038761a958810ab9fe69c8e28cec60714a128f60d45f7484c3bad8417889a41defbcae5706513475fd10487c790922a7c0c084f1720cc6a9340e479b385d5f47ca0d53d55a5f9ae31b5292c47011955dff57aae9dabd809e31faaacfaf1f9a8310044128f7c8fd42f7ce71945c581420cc752d5ff7ae793be85bd8b2175f778b039ba45df140fc3e1d59d872f772b145f7ae7cdc38e56acbee38f938714ad5d2fd73f3718390ab2dfaefe6e78621295b74df4dcf895356b7e88f939f1ba43c2c751dd823eaf3b5446350b583886df0270279975aaa28b545893d7297146ad8fc521b7bc8dd1898dc8d2e42f61896eca11cedb16fa171670fc3c1ee440606f32f34b3476c6128eaf50211543b8387cd16e4aabe3b08418f66fac3373a3607ee3ea2b8828c96338985e00ec714865388f18aec5c7d80f4acfcdc26df85e7b38480422f06d0ce85c015c5562bf178daeac47be30d9e949e161b9b87c17c4444b5f19e6b0c8cc01729897932d8bb72e8350881323027d86a3dc66ac95425e018ca956147ce0199cd084309b000466ddff7cd8f3856bfaf7c62d3007993147cf53740d896fd8a2132ed173833d894cfb36916b7f17ecc61229f92ab9a3dd54286dab24ddf2e1a5c4ec2f167da172b0d4089f9188429d59c78d462b3de1587585694fca9906421863ad606b6a1928ba1579465297564f831a9480ad28f031286a7168e001cc7083b09c242ca9d82d7b5b5003380ce7e8259eddac18a793fc20884ceffb5d859b951e3fadd11a155f024a4a9260a51a079fbddfbb097a40aed54c653d3971afcf88ad453418ce7dc534686d79367b0c370a93d6540838fbe712279cdcdac53734ed8a5eb84ea29a32a24125b2d4cea476cc57b792aedf63acc3a3a5f03c7d94821993b8ea0d63aee9f83193ac492bafaec2d1d5b4944f1b0c774dbf27c8836aa717a5d8ca5ad9f1e2567ee27301ed882472681dc4017216f0f9c458189c66a6864bec630a4a63decc9c726efb6dd15940e8a343e7103f81835967919366f0c932e00cb8a8c80bf2f8bdfe62319c2c0a9016f4a420c24ded12f7816c474542e7487e273fa51bcc64bf19df4cd644b2037eeb2728b8f768db2746d5e2d9e1c83f63b20efbaf522bb6f0c28597cf9cb3d949abfece20ad11569b087b06ad8a141c277ec68763cf70b56736ad51c9159e4772e59c8ec63944725de677a6759b6adfa52cb2503330bdda17c513a408814892d33a7204aba120b499370e54bac16733738ea81756b278cdc06297c2c14df50ebb5445b8d2c8df11bced6546200dfea2318841753c7adb064351c919930038303ae527809d3507e2a9ae2a77ca7a2c8f50a06907cc113dfe9bc211c928da5e2c9b5ab9c640d0e12c5d2f4cd2a8ae21ad32648debac21ba10d697f040f2b18f521b2021d2a269ad64672fa0583ffcaf79d9756a12c1626e86a9d8bada86ed574450434c30e1c2c7391d1fe514ca19a96619b38a452291adfd188066b87552e9f5e0d4ed3aad8e5c6b53023735c1b025bcdb475c00bb8d9edf020d8c3e08efe624e1d4646c75adadc3d777bfd4727d9ed331d9b497fe3267ce2ee9bda14a03929848ef4b61c544de208c7154e78badc3c32bbd65e30c375fc6739bcae265f2bd5ca33c07ea1f4c025ee6a571983503dc822fd0722e88cd6efd68033ccf7b9414ca6b4ce630832e59e2399b8d9bc574ec344e012821077c360e2e00f291d9280450c51894461361a85f5873e6d5d46bde82e194e21dc1f580a8a63bb3cf3d873d64af7219e24da42e6b673f830b58983fcb8db6856daac2bf9e1097f9c052d2c431c20556c2a4ac27bd9fa37e97ff4a2d01e2a87c5a7e10c7a6f4cf28da8256fca30fee442e7842506a2a706176d4bdd953870264e4661d5cfea3b8f5586b8704d506ea814f8c519adb9aaea19cd8fc561e5516e5b5c147e745569518e03d7fb5126e79dc0604bb8952a45d90ee3baa82f8651f7a85e887697d162142fd85d1e6bbe46b259a3ad0ce9588a36d087a56ee5c605c0a23117e181a8ea7a27793e8dad80ce64ff5052cf4b1319b4da0aa6130b41c604fc6fac2e1572ad578a561612050944e83ee8642d574f9704b97347436dceb3e2acf2b4a1be03e1046722c4f273af6dde9c6f2d1035ef546bdf34fa2f129f3c9120fe69053ad54d00748baef7dc74b61c9437e1c3f3268b44a292043be04c901495cda8c0692bb931d0151deb098346f6fe6498f15efd6b2e4f7efa0288e7622a849e658b45663224c2eee37c7c14a8d5c41d807849027fab4ab64310007161a9b2adabc990a5746118570a565a51121591748eba4abea5c712b4592de578e31e5942aca2823fec123706367d22a2a355d4bac15a9c677787dcd60c5f3369bc2ea384742bb7d1fc1831fb2ba60b046cf54007effde30bdd1c1fc279a806fa5f821d0697461382436530658300b8853fe084f4410d439a65bfac36dd448987894ec7b49a4c9f889a0fcbd50941bfa6068631a1dd6e4352c0204943f56ad9d3d70d32f0587e9b0417da073660f9e420d544df06d0dea451c35d8c0cc8f127aa542b3d6426d8305c8c194ea202b88836ad4620b55faeba423e0b457364475a13ded8532776b50fedc9202135327074e9aad3b024dbad106f226b4fc021d6be9d15f9f2fd24a4b1529688c44eee0354655d2dbe705d8a43ecea377549328acb5815d7d534a183505d6eeb2abaa842d69c1ae90b420e15c6d35f5fe4fd4cb734042d730130e069ba51345fc54603cba2c8c38985eac5ef94e21de046b706940dce4d861133d70b8353f7a47884344ff66f918716718c12c6431846922d3bacb290c07561adfdf50bda3ec28dcfcf850c5dc068d36dea21ef63bd8f30b9080cd39eee93dfbb0d679267d5b928cf0c82e82ef6719362a9b03b7d6e586e0e846c4668a143695c1438f7214d634f5d65057a0941a337daf747a7114de3942572b955204777828544e0e82d9431a60d5add47e09b99a23f11f218bbd9f8cbf945cd2b5a6c391aa3031b4d9ae3d030d167ca5abc64bb8653056258005d2d29c863fe12a1b175f84bfb846ab4edd36a231014cbddcc68a7f575093cfc509871f4de7f8b7adc2af953eefdc6b933350e6978421e29477ab1dbda1f6ef45866b559082e798048a6e540abdcc05a810d362bcacd5fb4bca297b0a4533a82c0e8c54dd625121418a16843b8365f9b7895667b777e2fb640dbfbb30f3f3196c7022577f129f2ef91769a290ac70762a38129515dc4f6c86f18e7b277abde0bffb9837b0be0bdaf0eb417f79cd482f9cbb075127425a011ef884ff3f779676355f4fb8d957ba5af20af36d618bb3cc004160a5b9f498458a95ccf6c2207a71a365a501d171e95222cca9c8018d16a652c47df1acdf26c119ea159f1168fc114454d6bcd49efeebb9d56d2c6685719e050297fcd8141aca640c77648292c39b1cd9659039c9ad3f63e6760e661ba633d400e2a5874a65f7d7db47a3f6d6eff912e8f5333f9f152d04e193d31b199d2c6e4fc2daaed7d4cde5d40ddd4a9bf3970e7c1ec0c63069b5d5e6aa2988365d0df70bd0b430c985c977d7f04bd61bcfe3c65ef92aada611f5d6d5c03e569c88f5465a2cb9e7e85a158552631fc38c40e70b4ed29bc48d2ac4883696f7a84ee6fb2bde1149f1d1d40a2a8b026d986a73c7b3edff846e36cbddb01bc80122bd77de0db9f8599ebe9cdaee5bf697e083a1f63808088375b5accf430810aa3d1b339afc457d1a49e457bbdb838a0097da3b3a698d9f730a66387d6e6b70f5448bd93cc7aa014b2eef5b0b994cb18a3defeeb81d9636d318ad2c07849bd83a45d53a78b7f84de9ca624f947f080d9c3f00f9173f515d0157b807bb443e09f0e309b68ff636c0c03ae45c9237708b6a8b7953489577c07378ff51f032d77c12b022454a31d86cf4b4e239b249fde040ab420a1e263e90ea0eb99a0a8bc7db5518fd0623182baaa3edc0db9bd1a1cc249118c5cf401216cdd8f72ce9c4f32d01a0f6399954bff77cb304e22463b9ec1e1b1b05b5a73bba47e1ae1c70ea17221e2f6e0260afedbc85d55cb68110f484a258c184957e61efbe6a2e8bc2e44f409dcc0493fab77f2e4d2f058e832ce8588771f6170bbb397ae912095e68730092cbfb7b9e2f36b371bb1f286729b1424bcb75f7033467e32e94d246826787b117dff0a6cca95b6703d90c106f7cf8ce688314845d0e044444cf3c80c035f10b9b86b582c318057f4df6f99e4141a66f97e4b9009d058a79520f1f22b18dae269600173181a254d705beeedf7ec24a1257d948cbc1dcd086a062f4729188baa03a2d18bae85ef9f12ff281ea4398014556155e2192701d20e0d6c56910554df7b56e21390fc48f00e9f100afcd642c2c9eafa819beb24ec0406892a71fdfe961a6d3f91814f62e60bbc6607bb906276be69afabda61f3717279b22dda766df903b97651801b9fd7c9a9015d3152691443504437a9b6d73ef0289d9a2af904b763077ec581b6d871aeb42ca0e8203efa77615486791331e0817f414a28ec48ee6552b0ef75c5138f02485d4579c2ec3175d9362fc88f5cd1427c99f4a09cc31af6bd87000bcd5b7294b3d1d2b688de7affc3cf603467861bd0ea1c8c26bea6f13629e86f8df64c6244cb0ab7770dc6d536e8fd2348c33ad25b465632cf97b775dc92b94314d9b7f86d9b8c56b5eb3a399419e7433d0e06b3df0864ed8ce9fb307290eb028ba5e5962ed10b305b5c9b621aece939031ebb94dc84d03bdb29c07c6a1640aee82d7a263320f81f47a41a7b18a108ee9604ffd145da6eafec24f2c4d99bec777209f89180e8b10909582984754949ca05c02e3a5556c507da10c67a2fb4f634656caf21771ba93a4848c1aa3dc369e815c1c953236ec074bedf912c73635a0d8d4e77c8650e6b68b69a5f98e9a03554ac5a673db994cefaf7d6d0f5830d2ddb650d1957f5402f4aa1f6f7db5f0e6a575843b8c833744a4dd6901cce11f3bd2e635a43d6c36c43c9d85c908495968ecf09da104161470dc599c59e86246bfd4f1fc0a82ac1ee127b19a939c79c43fa533303e8df0f67b654296f5385f24f91d47b206d061b2429d276ea330b35e3a51b63a1060ab283c08239bcb786bd37baa2a01eba269d8b406bab0bc940eb08e9c42d5ecb131f017d3ab67f924202f3b23fda4ab852c8d5ceb1b9b83c40f7ba2f45164f12be9ee3e3cd2ace2fb3e10dfb2fe3af83f7e17c56388d0130a33edea4e8df88efd09ddb87113de1771d3eadc8c238a20ae433987c4499f3763bf615a7ead885e230d3e3602b53d207b9f18f23b4cc76de220576de48c7dd0398f0845c497cb1ec9fcc52bcdd83190a3d216be940513fba99df8c592a1759a777141e1a50e333cb7157dd32bdf1bfd0628a972d070bb6ca65cbdf8d9d5a6ab8e5b6e7ba7108cce2d064e0e178728323f7966422627a15575d225eb7733278f141206b071d0b08c11ca95e2d172754be435de4f08dc8c0938e0a90d6e3e501192252b15a076fe938f4e2bbf08c2857445389a5e0bc56b49271f8ba764e303a4004ddbaf993a537739434add717c27f95d8ceb9bea96c0d7fc6345b6cc141c6519f48cbbe541ed898d613521571d2793d8867129d96d2dd9018d07baf6392692e2fa8bddcca1b2c49185633dde6ae54a17a82ee09f5cdc58c6e641e39885c9670ad73f138c1dd93abdada0d8df3117d09c7eb9beaf5f10f46e93e2a5f9cd14045dc3abe1e37228e40fbca0aadf7a59e38ff72841238c3479e3830f7413bfe8133911e371e2f1c669ff871105a6ffda2802c49b72fbc80ef84aaa2fa1231a489ebf6341d71edbe7f0a9fa27aaf99cd9d9d78a2c6efb4e1e2541dd210a7d68924cfa8ab741a465722493735f3f801f16ca40e11a72face6b6551a44a1ed4b0a4496ea3e2ef8b74499b886a206727878a2df620cbfac2eec0bea0b9bd6c9c5b56802d51ea06f505221361c78dd0f8792fba0a95420749de18abcab4ad3a687d5866402c0cd71ccf3bc9a45a26d7b78ed543671268ee5345af1e3e34a88407872c161f92400b4f2f441b1ebdb431ff5c9bb2cbdcdf7556f6a9c478fe195fab867c98e7651b986787077fcce85ec9d3a9d1482a88fa6899e2bd283ca79d29dd57b4caf406bf795d7d2eb660ebe7d87e92ea00e9dc683d8ad6a1a7d3ae0ec8903243128dff1583a04113662ae8283e08089e9bfb24776e454d1d13d47f0b747e53a577fba98d75db70d87a992d72321033b436e74d5b9de9d90e6b27a5871de242ba38b5f34331872da6759b4bd8500ee443a06f088beb97012f3e56bcaa7cf2da7899ea8072d203f488b58febc2fd6d9b578070034ccae164935c82764b19082c4beeb48c89200843924a606672f50a3294c59c152b9d909f70e810027d13a1f43518527dfa32fc71db3108fb23995113cb01f5d8ed36e7267d080e5351efae9e602814d798f6592c6681c8d829f096a63fd5b59a6f15ceaee6bd2c663eb51a6604671104e1abe86bcfce2336e4a4aaa3be7d555a23ff5432f34e1ffb78e5bc194aff27202ae63e3b3a0cc5aeec3946a0b4ca42882cfe0c836da59b6f3b6b74d570a310750c4f4f453ced577474dc1e2d4a77ca9558e87c1b6bd6aa29c13a620be0b99b3c79476efc396912292c1680205ba3efb4e09112c8033d97fce3070a6aa0be563d0344d8eae3f1268f22bf0b67ea7f61d53b5540bf92e15cf9d74fcfb6b2141c776d87ff23b2d3c9268ccfe1aa6acfbf59ab1f61c40c614e1b942879052cbc135b86aff93e7ac8fc5998793c8cc8270928a9c0d51e4de2d67d87449d8d4320a8dbcc2138d56e604797f700885aebc148e21b20becde7925fc7966990605f6e06d6225bf268b18e2cb5e1f8338a51d15ebd754b24305dd0f5670952ae77e5f3a35d2c050417a6adbc0b3d955ac9c5b37f036407994ba22730e3399983cd75d5a2534ef08059b50a671888d5df00ba3e1fe04959836d7e2b763e8a6281ad0281a1db8fd64060eaf33c0832f05732a98e547c0de0ec43817b8ec8ff3175131a7cb7d039b6d8b9d9c26380153038414a3c520acbe82e346532bc180187806584500da76ff1a6256132d58f28f29266399768519285069ab8e5ae5cc27fca09dcd38ba269472a189114a3f720147b897f6c5b2319168c8c6d8e8f9acdb0367e6f33b21e88069134de406c291a2994a089e8927e03c85681d3a851520ddb3d770204890005d447a62cbd338df8cae5983ccc2308f3c078f3b2d1779826818ce23d44613a594b65c1f0dd3da63924b57b8a8cfbecc37c39ded6a27fcbcdb7599080954d460637c916c0519ca79d5f04628e1459f1cf87e834945c2af289764c8dc801aa4767ab0bbdf562d6776a17c7712d8a2e43ec9a89245913d833081760fa54439a5186d17904fd5930b525ac8507a5bc2fa3915deed87139bdcb66138eb2c9865833064f14cf566a53ef72f6e1d22954906e1cbb005fe6c962fa5ef4b1c818a756d28ca17b3e2debe3767ad82f24c6f1b12e7225963f96f8b086d0474c8f910368fd2163320676bfb941a335f61a798f8d6f5361aa2e8dc9a596235b1a67a0ebbd95b2579ba0b133e711ed0cc7a73c1664e1f562cc9c78b4c8e1002e4bc318ae7718ab33df7e257ec674e64b4d502151bf54de024f5a253b97fe00c07469cfdde7c8010de18e1a0da8b613f3328fdb153dff49b2a3e698fb8f5018c7e573d0ffaecbcd525616a10b6de40ea2adf796f8e8e4c9f02db1b0322391c5f7dfc2f92a9d8b4c37c051a281a72d43a1e1914c94640dced09aab81703c4e7323c0d12e55ac64f783ab8f72e58011c1e687ff1eaf8b4396480c280b8b5c79b8c2c5c4b8a344478035c5bfd077013e24b78a645349628a8b3bea564d08bc1a3f7836d6bacfc2ff07515dc308721fcc4080d024b80dc79f925111de14d30484878c0c84d13bd8a3ecc1ba8f1e5d86e7e08a6103178b557f94eecd2175b4b6009b8821b30943dfb219300524003914a0ae248d353d4b44efe5373879825ec5017462a4118a8ddd3eddaa1b03b365cf567c48fffaffd11c623cb11497b550f1e81e4116180bbfc91d4acfd780e75ea2b39878d420d75e6ddb4c92771ec94a8e3b40ad5aa37168cb489fd9d75078a4ff75c19d01dbf4be98e54b5912a236b6b848a6938d65234070e376ab4efc1031eb9263a5d7331b6349e640cfa06ca3762e5df640ca76bef05a40b360400ea254a57d73f90c96c2f5ed6df777deda223c0da3d082f34d46f64450c70130bacf1d3eadba79122649d9ca67618de8fcff42ef741c30738cd442f25c6c91cc181e6fe3d413847c6b0cb0564e36ae8c814b448c0ce19a74b0d8ac0b70808467fd0edfee25a0e16a629f4d300038f43b3ee1cc73b7616454402b55620f11f5c105290d28c29a11fb289f52284f0731f18ba396691697efab35b31e75edaf7e6783ff96dea49c9975a5bd20f233ddda7d7edd72d005b76c8b5289064595d76f5f24955ad569a865e96c3356cf83713a39cbbe2f1eccb3b7bab381ae9c4df592dba14450f2345281525a4b8c94c2e6d841c7a6e693e2ff77e2a03943a2c50e3361115b02b837d7dd06c436441df5aa81d50020dccbb47d3bc8834f2d72a7df55d4b1cd9ead8636da9fae20d7dc81c0c742699d7a49743e0d0a34cb774fc0ca7d3b0b34e427b52b9fe56386e7148a610de726225dfa6054b165e2ea2f6fe54e6af7d900d3ca00a4a35f7f35defedadb147484e196186f0e45430f64ab06394aaca5d429e8c285b19218196e5f29e32f9d5f1875469b1fcba8d02aa6d4e3db1dae3aa7bda6f94b8f4d083f28ba7c182adadf99a708473e89dc5b9e17f82e9d1dc2b6634bb50f44bacae0f1142200ed11156d331382c0233bdcf0528df216453d3e2c4f7cfaed18b2df21f7b6ff79fa6c5a607f02604acbe2e576ab7d2bcd29e49a37023becb3d37435596db32f69352b3d24a9c2a831c4cc7ac79e6f8fe1bd6f4175df989c1e0e1da6dc8f5bb2b989ec5459ba855e2507c55df2d0729dd9aa19c80992615048c8de158ab12368ce1b58efe64eb28b7841d3803a1229a4b7c679dde60393d4898dca0a91b86f526918897a5fdb838097a1be442b030fcce7e963ef73cd718fd1e6b869bc01b884d36e763a8f044384c94971df1ce7828e2d8b1ed652d95e17179ea3df5b66a482c725cea567a6a95ef40533f0a05acc92fdc4b4a473b665d871e59b2c0500c12c4e7b62ab75d86fb3141cfaa5fb9912e3c375fef5510801797dca3846e10aff94a20283ec396ec3c134ffe687062e08b84ecdce4de8dfa8c2fb754d4e6de4d2c3d6d3cedb5481cbd97219a5a0931146099b6c81ce3df12a80542a68c99f6f01099d9c8112eb8732dd7718231aad8d97c5c29cd19c3f8c4a11d551303ceeb561cc95a996c7b5386ad5ad691181fff37cd58e24306a4df9d0b3c78c0fad00e2df332d38f3a0f9de86baf9ca2c3d815c53938fc9286605b21a1046d26e8791fb39b6f2fe2a6f02c4d5cb20641b147cc31fe89a4ac16a3a88580b8dfe165400a936541f3276704bfceacfc62f7e271bdd922953356401376c9336bb34be859a11b1c6618c4c43cbf0766f126f50f8ee972e2e61c9e397d97eef802214e0d619da2f8a0a0bd69fc610061d8911ac977d378709d46b29669c4d2d141583bd1c8acd04b351b1ca6b06dd7e7dff8d15346329558427ccb88491f4a3b29b67b591e97083c6b5048b72ef4c8b73f654d1e0cb80a6dacbb8395b96b85a6eb4b8a5c2b4571bdd2b274e351a634c2af7578810551e46253516d6226f8f367a0eac741c8c28a5f3613341284cc8a11880a5cef1dbfd82850ffd7d13591100b0a3aa1595657752ca765979b7d3080c153321fd2464659b804c09ae4164da5037bbc53ea539ee674e099c8ea3c1dd02ad743c924b7dd216a0edea22bb9b835b9fe54f63f96d093546614613f426490f5100cf774a88397c4e853e279cd762752c269e85671f5e47d1a58326a2d6e3d98053b14fdafec9125ef0916dd1b9a598814388a6075452b7c32ec8aca86710bd15e611e0b51a9aff2cbeb37c41bdde0935cc449ed67294bb204b5e07db59f0930e8d35014ad366f9394ac1755a8ba7ec6c7ac4073a6dc1715b687a4c7b7c90624ee15d2a42f2afe1bbde22e46e49269259d8c25f4331afc10a5248c33a95177c20ce348c424764471f0b8db106419cab2452f49f6d270c0c8d8288dc7003b69ab7e70f3afc06e17a165b2637033bd845f9729c13791c67ba4e32c60453259dfb5659a6df4acb499c764d0c0c7b8f37e7144f2c34f1b6110eb371ce237ce011405cd2f2037a8683ad53e504833fb5953d91d7d98b61704401c62c5dfb8970aece41ac74686209787c6a04f6f4c18b0be001669277fae213898fdf6bcd388ca7da17c6db1ed28d48ddb938a897db6446566cd2684e9182a5cee459064be7411425363657b7c97a3b522faeff555a6fb56304ed32335ca69288835b2bebd53d3e507335ede6e555b9593146d238dc94d12d35e9176c27af56e733bb335010aa47ca0fc463e9639fedb418546287e66069fa3011d0e64c4984ae273549c37a10b97c47b8cdc2b539969ee5ac950edcef19f8ef0d4c0a73bc69a8e8bd80da90abab6087a492c6f860b6f24be89e24e36e6e9982fe34b310e6bab1c299ff7579b1d2790d913524ff68d48388175fc789a045e27d79bcdf561a67189c71434c090d6bdebfba6bf129cf4aaf8e06a309f41337e93ed7ae771bacc8848058572529475a7e849333e5e32dd194f17c2bb7e732e4aa1ad080c593563df559c9db5b1aa2300819f3934e29cb3cad5252bb3fc1b211c49d86fbe5664e9a3535b0d6e455b802725733e16c41e59879fcc313e39832bccbeaae9d3f4469434532ca9114aa37b5533a353683bd7a98b84161345036a8aa307daced2d80e448309ffc0b8b1017ca511926b37cff9cbab2cb81b2f7a7c589654b2693b3b6977c514be8b654be2e426d5a365ec862ac671e6d42671b25470f4b0fd3853174431f1fdbf872513c9a62246d1468663796080e744657e8c6e6b7edaeb3d797c66dd89b3cd2ebf66799102953bb3d145dc8dae2b7f9d5b772b6262d0b9e5031f7ad136e0a2b1855afb0e2dc46cd8295e5008a2fd6a52157bdee9fd0466d22a26bd02683da7910a6b6b881822acdc91427888cc23bfef9f2127eebceee6305b2d912d13ea3a07b3751162a950ee89f0da5791950a753685b1698d609170d729b88deb904b0a734f84d7b888ac54a8a339bc6d3b557aaf0eca937d6d40f152d7f235faabb02428b2ea41b9583396e34b8b8c8b33c2ca8dcdc86bf363863a9a6719932c5f6528174493218c5c22e3332bf018d665666320504ec55862c810c370713c0c6754ac30aed85cc1905c7201831421f9c5e1ccc9179e95a2bd504333793189e5db85f2828c2e8491db5c7c6685e2c2bacc790b24cad116cb0ce15a182a8e68e1848a99c56b2fc294f17c7581dede8bf1fc5c5826610b644827d96a81a86e3792a08547c8229ac3a2f2bf53fe7f86b8316ff2c8bb6e26717e72c46139cf2f563b9f2ca73c42a1ee6715579e479e5f0e697867a70557cd13ce258f3c94ebe9e2ea7393e54b4616d2f99cda156d53166bab957ba3496deb953a0ce3e2cacb27372178108a60bc689884a9b1e8610c1a5a1257f561e0852f83094730092c191486a7127a12eb88424b89774715caeaac5736f4752ecb9261e20ce5183659b64a91e619037f0c03954c019d75f8c551500904d00c837f1c8196a001cd72f8633028090aa8ac813f1e834ea280cc18f8e208a8640a4896c13f8e814e12806618fc711894240d68d6c10b15474d214ad4e3921c71bd99e2cd45469a831d9846d53fd1bb82bef52cb9b3d789466bb8ca72908b928b292323a9915c0d83d34472ce4e1a719149d98b91ec9b02561affc1b977e42d837a47b000c55925837db8a93a338e4a3bb6e9661b0a566d8e0fcb63e4777d945649f3fb138230a636149a04579db4c7b78163ed22e9d03e7b5106fc26d87dc77ed8b94737cd7b0b58f4d6f352f992e0e9bbf0c6af5ffc7b6d8d01cbb5a8369f78313c2e449bb734a1b3acbae8a35a8e8faa4e1b6b5f7286b6652000a388c281790f4518c25db40479531de491e9dbbe1b4a80d66cfde49c16c4c2bbaaac7bb8ce4577748f28ec96f6670ac6e98b5a8ec6cddbb0e1e4fd060c15d118cb57fb8bc1a7f96f0e1797801f4a38c1dda2525b7df018d504bc102480452e3f6ef47e85662a50f3419dac4be472ee679cbc6cf4b7c16d83573ee14d2b03247d91ec091b2f134dcfd6ff104f2adf426b69c10927555d04b8c739709f0add03a035247ebd6624dfcfec8d94af3aaca984541b22cd966cdbdef152fedb58fed2a428af49a57d153b18d4fc4d3839e0d3f0fe0c57c4490a5fb33d034e3f6e76649e52af68afacfade91a5b7eabc79376b54b1b0d5e7b784ef547af4bcd28ce24a92527465a07cff29a9a1f10df6e78dcff64a8fe0a889c8eedd1bee5ea1ea5df9daa4a297ed0a4c700c59c7433b84f4345efe53d9e65fe53998c83d0ecfeeb5461a27ee7abbf054e28f33329098bd05457bd1aa54e9771fd070d98761efbbc378bf7f6dd9c595b421ec7546f4a16e21c4d63bc16d968b138f6dd0d8a1cb0f1ca7ff71f786de075825e2613ef6487357b3f648c5a16b48a9db207595431559cd1692d91e49f80553e92511c9dcec32231beff22d268e01c3dcecb97b24a9f97464f45a1b9d798fda54c640076a4adad8a97546c1114a1d8385cca0ae6dc74478d71261c178306021e6ec6fbdfebe228b38253a769817ed32e2d42290fa012bc024ba9964a7932a797f821bc31214cb600f3229a365adb631c3d89c7a6fac104f5a76949b27ddecd75b1ead442a7f16f685a7930f4c21591a8a327e7e9c7aba3815db567fbab82df314d29c187fc97521eb0d7aba9ccf8797e58527c18b58509e4b798c39c08e2526746e3f5c0635729d5ab26852604f48f517206745c7a64c43404b26a8f0e8fc7aaded0dd77595cbe58ca13f9cd1bfaeebd8b39ed112e2bfd6e535476093b480f28169d4d558c26383e50ad4a8eedcf0f64bcda1b412e331ac8ad254c2e5b9ed88dd7038211db97a8bbe9570eb7237943850988562d21eb059dba290d816ddb51e729afe3cecba13c39ffdd3608f8fdac0cd490bd92bc6cd8ec86e34b62aab67117748dae72f049e4301369a8f137b7534211bbb020baed733c7bb5c1eb622cd79a5a2792c421b5308266f79c61b4ffa2f6db983d03ad1d601b71c7d8806294539f816f5db3fb13f54ea933df4d9bd435f10d2cd318da0525415e90061f2d78c561eb6727df94a41cc8501e45303b6bdd9d228ed54d0a0597d8c4a81ae0ced2036ad16403c7edba9108fd7517b2d1838445502125709b03be681a76383c3bb910b93cb186efc817f3c24b13b957df4f78e02cf95de12303e58427ff4e5578309b69cbd02ba8a0f722282c0ee05afcf7417f0562b49ff68f02dcc87f614190cc48868ac04cbf542b262a41e5f14de53e72db05e12383c86461a3de4d9e408d815fb265641b0d7f76a7937c8965981c0d172b792f4c00a30b46ca3595f043d1e4e1abd58968659d5a7de5725daddf99c626484ef8a14b6fa03c86ef02b14c49e16827b1a06cc6f4570f27dd11f0b2cbf1c0ac79384a318f53262b978fc11d96962da9a8d8b80668651804cc583eef81a7fd783a0044e6fb07dc03808c8921e8eccd2d7f8a58148187e45c54c461883fde37d9ead33a89fad3efbcfb2e1df3e8b34ecf4170f2a6554a1f1941b30713edcb533b9403cdb41524361a4e038ab035076c6918cd700ff4fb66f810882736605f6673328772709480ceb7cea76f6d23d23fe45bd1411d34d3971d373c833100d82291035dbf415ecfddb73c7627155ce2b34bf3d57d80dc966ace9faad38be713604002157ce399914c5a5bf05d8ce348ee56e7c81168233b30ac9c2423d3b9f33d273725f82fd6d7e0e3517376805a082019400e5eab4b99ad8e6a2dee32596f7a794e0eeeb8560e25c6da756e7f6ca2f838469ae50bfb5f776253ebe74a9a0697e911df1b5985d43f10e8c5e92a5e46cf928691dd054f6cf7b6002db03fd08425621346ef26c8778ef4949f70e23f7e9cebfcbad4e341b9c97ac3edac3343467fa274d4578bcca9e30adc81c57ccfffdca3ad69cd35a5526ce3a46432cfe985e4cd1dadbcc73244bb3f412e9d8f41f94bc1abf3c684fe36a56f20117889f4950eb2ca11b28288c86ae7ead021ba273f94e11d214f9391c6b82f7db1c3ef61f6c2e25ddfe911041f6e829d8164b950c1c8e835da15d94000456c4ef9ea170f4864df90c6d71636abcde5bcb3b3d005127fbd07061168b6fb587e4ef5db67d0af218088ef33e249643ca0db27a673bfd57319e958a807a051a72e64a92ccbc4fc8ee091d0699d3c5f3cc4704ecaadd08e25a48cbe533ec6d66ed7b8e990254d251fa0ddd2c1f65e33ed20ebbc8cfbdf8490ff5a755abc8ad7305aaa0ccca5e0d92d51458c80e639de01db374a7af9267139e666d6f50d8a038bbb9127f07cc24b05e609cba3383a7daa8aeac9ebbe0fd3092d575b538caee4347850b962ea2640912dd707d5975e9476b42dfd1a25faa426776297e1710a4cd5db69288159ecabd26fa2188d815ccc9a450d38120c36b2c50f3f851b4d34c5218c12022543c8562ebf09c581eaf0e4c72f270ce41e182171adf9e50eaced051cca5a390a1cd600a899af62ee4781d74bfd9092dff13b09e0a15d728839dc1478908b606d60b1ced39a6a9bd4db93852bcca906267e8e0ddd33aaf601a5459a1d4f697ac1ec06fdb8ff61c7b51c666bda5844fbc126c632461fb05d34003fc90da312aa1b740cb4d5762511fce60d0a5864997d3b683a52d8167bc370bc9b2d85081e7c84e8495655b6a7a9145063ba6095f13d6719fb8ea8fc7cc354eb2a4cb698cea09f2ce645d97aec9e2e354b294356b0d3be92b1b643783586dd6a3d71271f155294f9a5b858ef4c908de9931a696c5d1f759fcf85a9a73cd2d2137fd6482ecc618abcf72e95a263e7ee5b3cd0dbdbcbdac8219310d052f938d5a33c57eada5744aa27dadab0824edc83fbb1e2c55f1ccc4c9ed6b0f8a360bc2881d4fc0d012de8be0b824018a340180cc32b382cee035f61a02335360996ddef007327e80b4c05322a177d3f5b47b577c6f13456d387814f1278b86d420d78270249deb9b4692e5605a57d71758630feeb0337a23de36f9c50c90acbea2f6e73e8dd90e3bdfc4bca1b030bb072080ab2a244b1ac43ded48af2d4c63703b5565b9d82f29d579aa5ba3e0bce225ae9009622aff10bb4bd8b6df7a808d1009990a3f29f260dd5e85409f989971e1a24bc15d32ed567608be93f00f3f64a7995a70f3a1ad193b0392f0affef699f84747ec345a0a25d3853cf9d5f496329b8bd3b446c9aba67a76ad1912b55bfcc372987cb014e397a041115cab9709101e42c95c3667096900eb8bc24b72a20cec992601f2a908e145860bdf80c8bba3eabdf07473563aa20f059c615fb70f0b37bec18518fdc07416c413ba499f0ba637c6a12aa099b502970e4dc0546f99459f9a6c7a39cd0dd6cfcf9a4716c0676b04e791c221ec9b57e03359c1829e308e782130734797c7073f6c3b1be051fbe7f2091f51234980711c7a5260a522972ba9b0bd5d80605179bb1807767b95cc75a3ba956378362bb3aa53e74c2613a29514d8fbac4135f3c9ade2547018686ffa697c53035bd66dee02da284eb3fc313091f5c923ec65fd1a0afb4425905ae7e5583f07a1061daea02767b6147a8b6fa88530849a4d046b468ea267d3e664e099b962c70d4c6b6b34dac59dc2e026a8ee789176e6a80b9ec860eed2827cacc907281cd7cc163d19af4c31cf2ad850d84180cbcd5d986da59dab96640039b40ea06cb74af14b042be3ebc0f34bee352885c43a9152e957f03d478551a03ec1b117cda45cc228e5175e342323fca1eb090490527dacf89851caf439203b2ef37b056b3fc1d36f67c7529dedb081b5aa6461eb2bb1e32554f4b789471891c68cc96643161aab76e33ce9f24f796129cc575127a627845ecdacc27432ba9a21fa73c6dfacfc34cd403252fa2ec50e012b4cc22f707c47bda54f8d9d37b0656abe8dc80667337cc86632a5cc99558290311e69b5a3dfdeacba7c513aa34cd7ad7c25417cd3c14e46f0c6b9729bb1197e1ac2fc1af27d7d150c0fa9423d955acb52922cbd049f2c236a38b58e353884179afd6d7572735044b50779246b2c883ef50ed34cf0dcee9954eae3443a283391a20386556b64388477b2ae71643e83cff7a803c20d20248eb245f02ac3d76ff14256b122c54cb6455862ece5c0c6f02cbae2c4db3067a745a3f44169179fc4d3ec57385aa9ee0495c2258ba9bc2ce30c101609d0435bafc3644a4498cef3587c654f460fb50fd452a5ddc91db6507d25a633b925ea42924e8e8cb51f1d1615e0a7d34273570cdb6e124d35f6b2827d9370b5e4e99e8539acc9d7e530f3ce9aa1249eef1c5ea78275963d572425adbdd10b504d8d483544cc5d1763c87e1cea9883ae0caab0edf70a17343365e7e2f5a411269b38df95eb2a582851177da95974aa11ba83f0469776e5575e709d2fb625358c966f902ceb519a62efb4e0fbe634881c75132fefa7656535c6430d37ba0cb0a2642ec59c33fae1336651a197513edd5247892b6b7d4e4a854c116f1f86ebe5a1944c2c207735d382f3033347fc812b0638ecf86c78c7e7333cfe0aee95304fcac92cb69fa80321b4f27da20bc59762d0832790c3e10551d68c4aa9e329372a8516438ea8584fbdc2d8539c23da8b379a251e28089bde8e62308a91415cb9bf2bcb8b897faf16af28c8fe92f5d7284f7dfc4a6406afc40d27902b2f56a47ca399359289673296bbd913bce11c2b881c097e8ad38657a34b7a83cbbf7404e29f6c55409a8b4443c5ed6802d230b5558d2f1f00232fd11129b12035363693e5a44b5c0360206073517acc429cc80aeb18cb610f48debe0bfd8810b74d60334b1e84ac84058d2f692b0bcba28e023f906c3bb2ffb810ba7f8ef02286669a67ec6c2cabec7c806aa5fa64d2a21c142f20a7c15704ecbbfca9915c048cd157d8159556cfa5844734c09ba2aa28d4cda17ca9611d0114e079e7c7f3d92b41385450a0dff50fe49327c8d4ef4f0de2ebd042098edad7e913f89b1137c32cbf0885cdc4e089a0f61c925e12807bbf4649964dabb8d253c3e7f60c904a626a54686d0090621aca9bc811f8302a58dffa498d199a1ab47af4282481f944122e69d8696930684beb6d9fe7ef4a637fb1db34d0135accf6a26127a069643bcceb6c5eb93dbc69d85c1d44852b81748291e8b51cefdd3d4ec496a1ec050467e7c614f39b86758f6db0ac5e0a16678efd09f1930e39b534ecf306ff9f911049ec9c1267c8dfb7b2441baba50c62bccb9371bfce9b37ab19df2d71b702c15d71825bd233bb7e1f1912c32929c56b49ffa8c76c9fc7fc4cc13e68fa9df7ce5c1eca4788f6ab945f0cc45b1d5b5b624eae898196b1d8e7800974cd0af67404cb3a006bc38417ab3009f54a8a1d62d9aef08c0a2262db12d47554b341403375ded676df2bc78d1fb1a46147239d80ad96bc9d5e78a743261e960ada94cbeb04f5aa5366ab8ce76851c0971c14d68f091a2779758fb2f9e2f20daa5093908be3bec29dc840e681fab0f78d3d0cecc5bccf79f43984e5b18ebdc9b2f7927509d578d32fbe864db83651962c980970e552179833ce6f92d141a1f75fb9a1e08e6779845f8ee8da184de2b65bcfc99e822f42f6e2bf2d2346ab4be8c16bd4ea463e9c388483a3062864cc22b26a0973a716f72333721611f994af38396295272e18737eec21b510050f2d3c32bd2229269c88df1470a38d0897e14b7254fc8bd7da55d15f2e2ce6f56d8a0384e973eddf35950eb1fdc188fefc0c4d7b22d2aab92952437b88af011c7d54015139e032da9300f5e8e6def141b3281d0d85865ac2af7113474e4cbb757a93d320ab9ecc1a6984d4015f576b0d889d9e48514b5421418b6de2c1fabac60f5794c55e6d6053017b053c8d0a8df425471c183074d467efb0600028f51278636fd5d98217b7a038368f5ea0a33c1fb505041ea12eebf36ccb8b14064f444c96c8007772f63bf439670db4b8e42337ca635cf69e3d51797adcab734a59b7a3a7f673fcb5e031265cd2aa560ddb7590190c83a5ff95d6cab4f5070681279b212f3fa7962b1454a208a74655552170106d1f8040daec618bb338b204d3cefa611360b98fd042f6498b6a59b3df70ecbdf9fc73c1658e27e4faac7b32b87d5a5a314ad80ffff5f3765d7afc8639c8083b1760fd03ba4c63635435869d17835a9e73bc487f15d5db0597f44fdc81db1ac6fa7112dede6b0b76cd7fa0aef57a4bb376c166f079c85353e73a0f587ed73f177c4d742b3c92a39d5c2ab560169b833fd85d8efc669d22cdaf26b7a0b52022f26f38a3bf85cecbe9035c105d6a82b95af482e1b78e787756b01474297523c8c1d2472a31e4f689e0f204595e5b2afedf1f61697b4153fbeb2e895d7034a17561920a5d7b44d5022d8cbe0f9cf4a9f7fe8b5e260e2f6a7a943d579b091b0003e33378f09289090cbf0eab97bc1a155b096902e74b54edac8aa44ae011d39d807b926aa01b05cbaf53ba5d1ba2de9cb9eaf3b9015a450ec731648eb2388b4af90bad418133b614be5be93ea4a3a277ca3e29664617e8c401b87343bddee4a461b556a0943e3f3b8cbc8163a588eb1127a8cc6f0f7258e62350bea60eb47a633e0ab1eee4fa4b80577616c680ae541a857c6cf7bf3d3a8da0dded720cc9caa0f012083326d9ddc3f3440e558f4d661598ead78dbafdb11154044d9dafe5acd4adad48b8993e5341f151da6dd30eddc4265017ca95389a00e225a8c51450c2f7ed4982354958c13fa691e7df482df9d02d3ebfc8f362c14a59b9906654d33b27f1af7aca78f9ea0a7f62a42138ed5be680d4474c691f3abbce65f9220881972abc06cb9d070f9e765ae6d88934be410b7422d856892c6dd4bfe69f319e66a6ed3253f9ac890709f2b7c3f8704fa06d34c907cbe3bd167ea380e47438c5e22c57805667b6889d704c673c169b71ce2ceac98bfc6d11fec6e9db053eb874eb48dad5cd3d42a96adf78dc37a8690ec2b036290796874434d917d8c5ca0f318b37a3866e3732ab9b147d80711063f73b914cc82867760cffe1cd89ac08c068d9835df5c183fb2f096a5aacf7da9553f8857d5b0a32f5ec406568ed43e2033b35b781b1af32293b0123d291f71bae1d95f48680420f3dda93e4d1b06d1311dff6f2258f1c6a3b1c6204ab9839f6514682660f077f1e0a8ee54fc0b3e02da5cbe38a502afc538d9b05f57af5827f2e04f998a34085a293b70cfba68ebaa00ddca5a8602e642c07d746f41a4e670db2e658bd310a8832393f477399f5b4d7bc3c18b75d9f394db9ef3074243a0d1d09c1d4130281f71081039331830969eb7cb9597d7c4a2c931b633b123bd5919eca146bf2c7f5e74d663b12d810c6e2289271a905d5a102ed0b01e6f4ebe17bde25815fcb334dc7efcb0f4fac9184b8aed72e1dbc7da4255d7ecbc1604f485773486680873a92045561298bf3a09057be03d2439bff4cc7152e8211fb08eaab42e71d3476da700ec39a4db392fe759cd3face76a336022e8b68ad84fe8ea8f48d6ef491eb417d7c671e5cd56f3ba80b2c1012ad83149b10f211bc2ff52d083aaf5d7cc87dfb6e2a10e20e3e44a4468fbab24ee5cc0f5a575028cb1ae14a8ba6d244d22c06fbfa3d3f83f81e398d409ed0fc35e61b67bfc053ea4cef253a05aa7d6b8dc3024e36bf44eefd8aa1fd7d93266ac89ef4e6f4d88e203dce84f718049e5a378e507c3da98e7e9fc2c26f3f8c76babf492dd894b267ace8d691f260a196f29d1735703559a793de220ed3e76871384d77e4d0c35387c7a370422228407165ef2daea61f6fe196e0a0cc7b9435dba66702b4012b2619006c1c365a9191088fe058579a97e643ad9af2f7c590373a3c09d48ec1815d03e5fc9f5e5c6fde005e61218fda54f0fee7e1b74fe0a0d6dcbe02b7bc5495353dc47bd60c73eada99b366da1b08cc40a7ec0bb27d0f7a7a65ce4d3ae9bc6ca572fbceaffe8692b5ef0064a5d238b083295302b7ef58b785d1a70f52534cee5b6384b6cfacc6128f5d72438475cc0edab398c17f0d644a4f6a0e198664c4bd8a0ac3edc332f471e673a28afbc66047991ad3dae0dc94640eb63795de5cd666cdefe2aca4ef83725d7b1695fcae9d594e578d74ee38e9b158dc477eaec4c3b95113175f67c3f86f34206b47a06ba86e193cf8871d6c8e958733bc527dddb046e04c84d6bf3480620d6718a764dce4c7f2e7719f026e8f72ec31c0f5851341b038f63f24f28a1ccbfac8b7c3648806b81b99894710e97c7ede7bdc373daf7cca32528df36166fecea9dbca7dc7fa7a458e20e92302ea95d531a84dd2054452da3e197ef416eb8a1ca8bf5f41459db26199b0e9daba5637873f3159997946aaa29601936eb5bc21c529c5ac4f8fadcc2287508ce620572848327245daf0051db602d38264de81509c080c72d4732027237f0440a027cf8b1d81b2a4978d5acb3ea5969241fb955d612c5c62b3a18c1ae9cd600dbb6a1dc8349bfd32d1751984a5235de5c8ce480029bf246b5f99c4b7a94fa99969eee4dcc1c18ff8bdfce7145d911151054ea0fff47f9a1a34783ba65d0feffe1d90c37ddde2d029699bfb865b27fb008b9e8d1e97c638e058512ebc48434a141a65d982c488b49f499114e527c6d0ce3f4899adb0961a47e07245b109288ec87ffd041668c522db2dbac9b7a7c1e8fb9cfdb1e10acbeea316ebb81eb7c01a8ac3849bb804b8b7882d6e25294be57c92fecd973e26db98bef1342ef9c4502105de2e0a7973e7687fd6756e568929476c6ba894959728508e01af81da4aa715804dfadec98abd7a2b617eda2c1c023a3190a3af53ecc60311136537cc28111406070d7b7d317f9be49a04093b2584ee36080f2186a79592ad134b56ed64d9ff3f67d09075de978e0d4b2e07196e914e8918184e36346d555d1c1493e45e1e675421c9b3580a967e633c661c5fcd51ce442e11016544ea5b08d66ac7a87a7716442c3a12a57be75096ad13dc0240c3ae77b8ee83cd2e116ed544b5bbc980c151fff155feb69e915b2d97547e912a67c36f32b425a829e346fa5d10308de2da1a5d4782fd798b14a4d50e6f9945bd4f318c338237215ad6d59a34de8ed2816722e1181ea651025512d997933965065d8eb531bc3ac32827f8a7d08b76f123ab992dd9297a8ada8731cde51e05638b112c52cac74ae875461fb7f558fdd4679152fdf3b8ea97b1c2cb108637e28ebaf2297197e01c5893960c24074a8bca2c634a4c7381c29d63ab2ee06bf00f47866939adbb71b73c7e80cd1c44f3b609ebc0fb08de74d3c44bc5255c453723de5f50df2622dec586a017c87b29c84b74234121fc1c9568fc69d8e72ae25cede93bf6bcc37614d700e1196f89ccfd29e59a80768431566e77e3edb9ce658078486e4d7c2226f9f67659ded6be395160e6bbc50bfc80272dbc61922d3f5b0abbc27a1a1a99e42a88eeab486498d4a14ad1d2f290f3a02708bd9a7bb1cd7351e7f3ffe7f5b1cae73919cc95519f048855ae6475ae86775b4e9fff8d0acc16c6c883dfc3288720d571da9e1ff7bada554a4abb9425a85a7cadbe1fb88d2121112f5ddf2508986763ec159cce9292a45ddad8d66489420b5bf812452c42578d39073965f8427bef8dbcdb63f0b765023c8a226d0a39f75097dd0cd81853bd68fca745b07096c8a48e387f7cab17bde7e501f3ff74e0f28a2010ed8cea136764414b47edeb2d45c96fe48c2c16d31bc6833015255de8ce8c4b837df99ff71b9bb1140aa282c485e6a8a149d9231b3bde36a25ed7c71b645790c75c666c48ed5a060f785b22c857c896e87acddfd4044c83a2070bc51139ff1567375b75fdeb7e612ca9f0ae547ed3cd392295bf5f7067f84e2d2185c23e477db2c9887b81eec06bb0e21c7ddb13de283901dab942283d376ede0a40128c2488688a2e8fa7770db707322dcf93c9bf12ab7ec400c91559d671fab184c9c1cd375603ac5391978fb3c1385371feb3ba20113ed67f67a46d45b34257d9c4b6bd089c75d38c76eb58934c8097f770205cb5ce440cc70a5c3f29718cb93cc727c49753c9376a7de53ea00205d8427c76fb6538d6ae0d56415330682035d0a4b05f4d64b6a21f04603bcc0f7ea021b5173997f36c51c04de0961d0f3f3960011eb3a08720e08de135293dd50b2373aabe21a667b1ebc695638689e0c8580458d03af1f94dd1851d8fe551981545e4d6af12bac172602fd228eb4c5129a619ce49dca6edd33e1b168185d8ebd72574fcb6cdd883e983cde24628777f00bd3d2227722a2ec922321eb6515dc721173e94aa8674a3058cb223ab0cca4e09c04101edf051617ad7636d7042b9ed660cc9e5620e2ac06422f4172aaa2780cd1a22e95cae0b2287acf014b26257773610d5cd6ee88c03c36cdcb216e2495d4431b87e746835c0c3a51bd9992e60df75dc2409aefb1627838c1dae14d7b9cc69bc250356c7dfc8a7481514f44fd70420c93c16ff1bdbc633e93059fe5960dc9501dd8085a10d62f5c7ad916970c85c114e8483b2f5deae94569434055eedc4ac1056105885b63966c6a5b390fda0ec12de1fcaa678ea42da1fb46bf1f86f076d872403cddf05b3acc5cf4f2369eaf6945fd786cd344b39b85a0fd3cffcd432ed0842871c0818864eda2090cb51224a1b2d592f6d22a5942902101a1014115dbecf23f8f94156494611cb6f559252eecebd45e0d814159ec240fa3d2a0c145e9677a9400ab03c52cadd61951f38811dbe4f8151fb9ab6979957e06bfd311e520a88c50555f2bff2abc821a5dc9d4fbf701628dbcd72c12cd703cdfbb61634c7522c6d2d68865158277fa7b236ef2adfb00c1f24a5dc1dafd45ec6045c20a630104378298428467d0f9002840ea3137e4002388420883fe0000b0a72f8610b8e79eadaf7cec420c052d8fb53c4d8581220f58aba3718c8f62a30900b4910afe9fa25e26cd7626cbf30be18972ef60d7c03df1059d8aebfef6bb1bd1d3700c871cd3246846dd7bf02a8c366b16756ec2744388e817b441d1b9b8e050444789ee779a4f73111de208efb0911dafb52d42195fce2c6e1de1dfa7accfbeb6400628863e1fb833b6cd606ff0911de4d3864e539db7b724b22be4f7f1f0f5b139b47801f79fdb0ef789f95603384d9be01fcc0ce4363efba8e878399bd92cafd1b1883384f11411d76b842cc714dd006c3ae5fb24736758bcabd0f45f49ced9921067220fcd72b6d7499c3bc81292082e0bb6e627fdb338e4d8e0b3ef81f13fb7b1e442fef2744e4f7c46c73627a4644bcf3bfc4fb61884b7f65153815fdfdc6e63024f210fef031906d9b34265983092864a00248108210505062c847a218db1633b1905705c1050fd13037067221246f5915c40aae89002c4f94c028c8822fde81aadc410a679c7780dae1898e00065a41a4edfbfb4e5131afbe555151aaa228501515c475bfc244972b4c6c31c32c435798a0d2570afefab36718421ead5d5c09f345b3e08a1251579290fa760baf8da30220de1d6c771462f821206a2804b169fb3eec9936effbbed7d8b47d9a8b16c1c6afb14cfbe77df6b0f6a890d009dd31d69f7e776dbc01d1ddfdf39799f31dba53fc4774e18560e3cf59631ca26ee1b1e73d2e5df7c073e8b9dcfa5e1f88f788cb83edefe60eb60fb9366757263a06720f1de3d071cee50dec6998e7d765feacb3d6da8ae8f7de19fe7ddf3b1e0aad88b80c0243f0a502c7f0ab8757aa780ca4cb7f8561e6f14c83631fd818639ed7ebe5f1783c3ca667f19b7511fc0a11a64c91ba42842a578850e50a11a4ae1061ca95213ced0088b145d406b260258cd0c116a12b3680faaebcc08aae5a820fbaa0987941940cc618638c31c618637c31c6f8c310c38210f31936639f83c8f78fe1f8ec8e220ad359abf0c7bb73f3d539fb9d71048991379ade1ff190dc195f69c3a691cd0ad3fbeb5e961cc56ec1c2f41ec96735b53b832647090703bde9fdacb082e9f9b060617a3d2b56981e8f0a15a6b76363637ab214294c4f67e7ec16f68b8d73c2f468b68bcdc26eb16fb60780ed951bb67fafb059ec155bc5b6d929b60afbb551ec9a7d62d3ecbd6ff8504173e5cd9c10931c70a00c843d9f8defff8138638c73ce19f4a231b0ef1010aeb3df0431f8383ff9218e5d6f7c164e027ba00dff070676bf5cb2bc49e01818109717ccfd8263e01d02ff76093d937c5dda18d11f7e5836095f9736f8352ef7bb79bf7b048e81df122ed0dd8263e0830ffe05e3b398994c687ee54dc28746d83d02ec22c175c067c16e1260570919d82582eb7c26d8e45f1f3cc8fd82fa85813d010798200631884110061f5abd4c0b66536425feaa743274b7dc255c27982028be4c4c79bd74b936465a2bf27d883c12fe4a6333c346f22f08822319ee8656303d583633868139b079b5b80ef82f1c037f8f30771d6fc3ae125c077c17ec3362db421304c724c27cff7bc7c1ff5d117cf16a1eccfb057c91d4e17de6fd72677c3c90df07035f57206ae74ffcd67f605c077c1ff23ef09560e7bfe2df80df82611208d701df9bda311c037f2c1fc740508479c6b151b2cdcfc648f8abb289fe70e720fd60093ef89d60bb99e47108fe08069c7912fdc636ba978f63ed94fd3dd5abcad4e10780e9a205bb3f2689c6291bbff7f29dddddc515b85a853fec825885a08f9f7fdf029e3ecf33f6bee0974d0ffcde7be58d77ab9ee0d7c525132f75546495b7ab32576f0bc7f1593c985f0eb229227efe5c3a19f25ef083bfa8310f4418c88b7cb96c223e6be806ce7795ef8a044dd637114b1b23f9c517bf67b5461af28ba58d111bfdadb731d26a953639f0900f25b95330430f3f407e25d8f8c911b64d5000131c4d5000138481b7087f55719def43d825c275bef7a6f6a59ac2b1efbfd7426cad3f2144bf33b0014c9b367da6e3b178738363f85779a541d80661363c4e27824361097c3735a8b3cee1aa46014cdba7a506a6691bafd65336ebc8ca8969bb535830d6bd62b2ca55151ccb5266aec1f62ba69bb67de4de2aae835ff4e21971f1dbeebd17e37bef0d4dcfe07dcfcb6008de5b0ac5786c2f81fde6bd42f014c1403c7e04cfceeff1c08dd042a5854a8b152d555aaab458d14275bd04559660be70ec3e0e237a2b7019214496992f4b18b10020668c9052e567bb97ee5e7a2edd5720821fbe78850855ccd5b7bc95537977e4bbcadb83fdd7693fde7f771bb677f9c4d5fafc37f0ddc15e6a7d0cd0768ab9301d139b369762bed566eeb1fad625757818c694db6c3d08bb01fc1709c31dda1907bfc7806d8bf9b00968db2d989b31fbc377926855c26cf67bbf5f84d9ecf721142f8eb06beebb7b729d763b09f7127487ae510d03b1ee93d6deef72b9de5d305b68b67ec35a6dc66c1cc3341807ff7dd5b85caf31d08977c5fc7e3106f6c23b26e649cdf3f043352511aea769954bae9f79fc2760200db6eb69ca232fa6006bb05def66eb4397eb31c9c355ea12890cec88ab3c8263d87683d97adcfa1b3906e61b03edc74ff3dafa2377b8b9cb569baed2a607f9ae77954ab4d92a49efc27afc4830109311d65e9155ea700c3b98f057e50e1cc37f81ed05d1183b617d630e6e84019040e28b110648c2080324618401be186100248cd845a132dd74b30352667eef41f1c398f5e5f73c567ebd027db62671b94efee165dbcaf49dbf34356973d6cd2af0aabc77bf42430b992b168bc55a85c94ab0eec551ae939397155e61a7956d65dab0138e829db212a6c65e301218a808f692739d9c6c341df8c1d4fa6d2bec9483f2158ca37fb4e52aa75ca5a740e5c404c237c4b6652f1b4cd65a6b9afffefbeb74a3e82a23561f8e1fc9239b3fdbcbbbfcc475741866f247f82b56b85ab13e8b5eb512a9907f0387d7e97e343e1b5febcf295841d59d21f4f9063b6b2d8aac5f89ac7ce2c48a956d569f7ff5e3f834309bd587abecb4cabb557ee2b31d3ceff22e47202f2023c0d42fae409ad58b2b145308b36a310165ee989e82296431458ca3ab78f0632cf46560bba9af989a09270c24be2d1c378f2886bf12af531340700753836fd3534802892e5b422df9cb555f06f6cddf6bd2b3dd2c7ddf0796b61b13fcef592412532c358e89a22864d288f1fc2b0cff837d0fd83757699fe9cf3987fffdec2b382614eefd7afde75d7ea2a58a0557aab4d65aebdd6eb7dbed76bb27552b2fac1af3d494c6f8d35e14ec3dc15a2bb1b9e0d7115537380953ffd781adf5dbf201c0323fc1b1bcabca61b8f7ebf56f6588adab3618538731f5ced4d9733275145323c0d42d5bce197bd19177390847c138fa810883d85a6327ec948d30f56b272676f292c3bd4b2f36ec54e55ee5438c3ffbc78d39e298762f485c477f3d88e1f77df885a28c4ce8ad42910af91f5965eaaa7c85f53ab3c0d4af53b0020f12d246b8aeba338a6ce941961be81884e14bc1b45d33d4a1e779a28ccc2a14c35f7df82c187b4dd6b76036e187b04f875d2e129f85afdf060fca55f90806fa720f6cdea54b13b61cc1e641806173d455fa8aeb688dc57134123dd841971ae817985aff3a7e129d29f3b696d6d7d4ae999ff9ef5d2fea713f2689f676b9bcf0c56f06bbc277853379e6c519582882e10c388661b892c9b19b829479637a0aa6f0c454c20c47519ca9a22124be4d05cdf8211ef7cdccf8b36b3e164984e2459a11c58b24110a9ffd7dcdeb2a0cd47addfa9a3ff162cd78bf1edfb76a5a5a4cbdfa9a56ab3543eaf8fec48b2760abff562fa2183f984d57ad5eebc61451b4cab185b9ea617f9fdf67eeaef395b69ab1d526c8e3923fbe11b634f3edcd2e1919c7426169ab995f69b3c1fc8ccc8f85c4fc4adbaa655b2d816fc3639be06f53fc60abd27663fbde7391396e641c1b5ba489ffc8d49d41fa0e7efdfa2e2ecda347f82049fe085965926bb3b14ecc76f444f1fbc1f27e785ac79822d8e3c6fc8ac430f16b2e2f2dfb8a89836c60ea0fb516557471bc6f6ed970303d160ed7c92af34042f41bcf23815e19a7e66de1e86a893532bac6a9883579f4bc9f4dd67cdf8e8111adc0d72b83248a135f433303ced08ce28913e48f1bd3f5312e8ca390f87a6ee1c7a347bef73760a031f4c4b7852afca6d23a22e6068ca74edc273974b55cd98cb9a40e5836f7c7d48829c61b9828651c8f8669bb5d74e09af276d9c06df2a0eb4c7c06bea75453e3024116f935306db6f04a4c2114e6d6c06ec05378cac353414219c7fb7027f1f25a24d1f8228a712c42686cc1aa5ede969d850907b64da80b3e0203ed4f2254022f819f04b5de367aae71a9a2e68a2ab41944e6710a99c7332f5e1a1461cc6f14342e32c889af094b1b9e296d7aa478999739f129700c4c853f7102e6fa181542156a60d8f4fcca41b6d7ebf5caa1c2d73c868935b01435359fe204cdb350c8bc4806019fa65472cd13a5ade657cf2283ccd4fc4e51daf4085f8557a19cf9d04d5106f6fa19d80e1cf35c2f03b3390a5e3484bc8b9090508af1c4bf481daccf359fc465d6d4fcccaf70109aaf296f641424d10952c789a5fded35659ec673e5607a32adbf810906daef618cc3e07cdd069b7b146938586a18ae321d004ec6cfd3a922fa8ded7b32bd9cc3c7e1e3f0314e22c45fc2e46f4313679cbf5c31666fb28792fb057fc9597f39f10db171117ca664e32f77067e2f17617a1f30bdff32b0b353129db9fafd3d4223844c303d2c053f617a3aeb279d6f6e81200c2781bf4c6dfdf97a6ff3a8c8678d23c9f2584fb2c656cbab9c8c2515f131ec93dab6fce54b06e3335b568219247cfc0503ad4aff9c040602e333b24758ea32fc923d0feb706db7193e18c2aeefe0c7e00a04c38fc52a6d34cc5b057edfd3975b532f406cbb0967c4ee8efb0cc3b2c7c0d80a8fe2fbde86cdef015be7989a8bd49d128563fabf2a3bdf9dd6de68de78cc731c08f3981ffeffbc284f01ba8a971c2e648b19fe078e3cce13c4e3f198f99630400fec24d7c49fe4c2c83019ec9cf34a8699796c2b338fbe1de86aa2cf73300838c317486792072e350669b03f24893448fa70c2a3857931ccf6bdf7d01fbe47f2f83efc4c26b9ded23575f9e9e07ada791b0dbc25fc1d93d9b6a9f3369accf336bfe2792de0acbd0f0c572c71245bae1d23334373a206c54b8514362a56b058e167ffb8315b806113c3a8b05e966122171cf39e07e638e61947dc72bf20a184e97962129eb845dc12fe0a0c8c2c028f3ab0172f1ee7652fde9044b2d267bf90bd78f1628b9107b6a3434eedbccee317717676f00dac73ce1900dfe273ce39cf3ee79cf30a2fe373ce390b7dce39e7a0cf397fc140ab08f439e79c1f5fc1406b8cff9c737e1c8581560ce373ce39ff7cce39e7f584cfe79c73ce39df2230d0da33f3798df99c73ce39e74cba56f073ce39e7bcca783ee79c4f729b704112651766640f43ac150cfc3bd48409964b549af05369d2af3f5208fe8fb481413ffe22f9ef7fa410fd4e0ac99efe38f0da97071e9e38dde721cc41371051047cd6dff0c4e987bc2237e0803f3f0ef7f5e350dec0c30f79e50d38ac4aa71fba387c1f966089c377df2b0be06aa2097f1cbe9b13c31c84df872ecc093be9274eba2422890d33ff7d1e884862c35cca5e656619c023b6fea7211279a52e3ddfc04ef20d80e818fb2c4715fdf103d1ec4ceca193cba90b9497a82fa60b8c89b7d306026fa72fc2c4554c3cc5c44198a2193a85e1deafd776d25a5c5c4cecea627ea66b8bebe0f1098e8d4e261ebf05a9b1852903b80ebeab36c75d0b533987a16d3be507c30f43d7123b13bbc65d946ca3f5ebfc1a74c1b685067032f16fa71d05033d19c0670e2a116609108c965d8e2098bc25875db697d7978c4b4cb3631141f41b1b38657a385399dedb34e8647a4f53de7defb39596e7c1f4b760224cb3cc29d3f61b871f3e266d60703df9465c4f92df44bfabf46c84fc56d9243f398e5b2ed5bd1faebe67c19c9817e6c28bf9dd0f9c0ab1f661cacc7fdf61b705a9fdfade6b73626e14dc32c5df6771bf8529ad82c5dffb4eaa609122c5bb0ad72c3e850a16650b5238e6fe29602cfc59b080ede081217e4f1927b350914287555270aad757481da3161ccb596bcff3beeffb40100441700cc3300cc3301c572fc3fa19f169c63f417e4deb51841ff32b92c85b62bbc2ffb00cb3ec0fab702c3f952cca52c5f85496e3d3961bf9ea2cb68d0266bbbb1a98ed5281a181d9b014f622630bab3c8be9b691aa0523311829133f0b96a1fc0ac131186c1b0f4f0eda19277f18525d9c6b0ba76c481fbcd73851acf712478ac8e5059cca41fbf358b2603852ac27c777b908638ede58b2c6b164fd0863bd383e091331abc489c2b1711caf64b00a064e81545eb8b0c6d27659ac678136f13d0f6c9bcb96b7805cc02e2e9fb999c9f2526df2f31693658a36d68fb0f05738534cd62d6f3143117f2010fdc6a64713678d3fbb0eb73861ad7798892d26f6226c1be864be18e62756144b8a35455595858a8a8a8a8a8a2a67d9ed76bbdd6e97b3e42c394bce92b3e42cf9896a97b35cb0cb173061583b9613eb494a4a4a4a4a4a6a47454545454545b5dbed76bb5d17aa1dfe5653545559b67491929292929292a2d260a8a8a8a8a8a870941455f66ca0531886d9bb97d33fc5a078565126141414141414940623252525252525a5c168301a8c06a3c168305fa43418adabb26ce9e2050a0a0a0a0a0a4acaf322252525252505e57991f2f210183aeda717d447c5a43c2f505050505050509e17cf8be7c5f3e2790903053ae5203c849f274c0ccc7f7979d95d422828282828a82a28137cca41df1630dcfbf5fa8fc59c4cfc6da9dab66f0be804b3853b0b607a99ed2bc7fd60e00a6653647cf187f8d0931d5adfef3096b94bee626252c7bd59631deac8d9db7a9565607eaf6daee944c7eac17762e623becf5c702cebf8ccd58ba1b76c4ecc950d0ff057e0f7ab326f719dbc2a2fd5febcb004f17b38682720d65d6cdaa9050de430a68db5dd5b8653525660b142854d0a155e286a4ed0ccc8c46c578b1c45d60ae4800f38b83897495ce6e3bf91fd460f4ec18c4ccc76b5c85164ad42f0f374c66395104ac01c0a455c810197bb82295856f0f40563514196acbd20be23eebdf76299c28225082c4f422ce3751f8186baf8e2123895608733ce60c02f5967dd658b952a2b549fe791804b5815c675583ac0b20224b054559d200b96134095c004491481c50440602981159004fbba461081058c4001780450aed8047682088ee0696dc503dee7795f3e8dc4e78146b8ee3233b8f8de1814e08cb167251481084cfc5a041c701241152d020b88200a8cbaee2278124114f3d2502da104aa2fe60bc732c6545d585ab2ce99ca4a4835e5698f2a8aeac9fbbc0f0bd52e044bbc4200e686c0cb7d5dddd202866018022b370455425001138f18c8766386004a0c57611802a7151317068230e6abf49608441b6c5ed3b389cd7bb38931ce39e7cff44cadb5d6a0f9999ee7799e67139a60970f47795fcc8ffc48f2235d44a1ebf88be1c5597b1fe861cbe6c4bc0b10fd2603297921a6df695f87fd16d6c749f23dbab785e68ffab6d09ce5deb6cdd97b0eb2f135caf71cd4e26fde73908b6721767b1fb80fc07b0edaf10ec3d21379bccb41b0bf2bacb0b931f4e67b0e7ae171bce7a01c4f94e2efab8646c75f5b6802790792be6d9b4a6f0bcd18de6348fa1ad2877786f71ce4fd9d91f918177959efdfdfc84135fcb5e19114bd00ce1de1de2fbffe1e2a296de1662a6dfbd596b6d7b3a5ed636b92d2c6b34527e425e3e05773a56d87b8d216de4adbc6f869a9b485f8a36ce54e4bdb562abd98782795b68d848364f8f0bcec6d3be70556022b61cb6703e3201ce0b1988b168f5f4f5e9cae17ef469ee2b109e42c1907ff53cce9a9f6541814468547de925990b5c01e77c938f8ff290765301927cc93998750189521bf43978374a4f8132a6014590959098fe1fc250a8551a1e1957250f6b25f2608ed80996f3ded291446a58637ca417ab7c3634eaf9f622138a2302a474f07700238d08d9283c6c78fb148453f0a6399d84b0e82f138c6e3a097f178c6e3cf4e3988c6e3cf4f39c885c79fa172908dc7371e7f96ca41438f5fc89183743c8fc73d1eff781ce4f1e72f3948c8e3218f3f87c941451e1b79fcda2907c990838ed0f0d886a23f1feb1c74f4f8ef530ea23dae954f83ed8c73ff0816661cefe25b90d44003cc33ce0ce51198671c19ee1d02f38c03432904f63f609e717c9401286d178c799f07cc33ce8e52c7d40d1b301768cc8079c699953232547e32efc78039e55daeca51592a4f652af3ba8079c661a16c510200e619a72c6d388c7977e6c54e36a50d43bd4adbcd62de4701bb5bcc7bbb98572666bb5aa48e324b078093999cf1c530944ead266d2b93246a6166282728d337e064ae5e0361ccd58731ef17333fd8c5cc9f050b07a8c8d17da68424f217af13fd97bdc7356f2bbe1325e0ff58f9f72bf2c70d43d8f7abdde3c6f47fd6852501cd3009688e3886b37be98de06bebfcf7bdff6036d80ff066f20798bffc2156a2c26c5fa6ed3eeb5b6dfeb8ee3f583a3f6be5ad7030ef93241158da9c5cd7ff5d7d63ea910c723fe7cfcf9a2256a00a1621bc7c5e3c987b200d4c9cf1de9b01c130cc0fc266667e86a67ce118c63a4b95bddf2393e870139c3941e3fa191a1ad789db8b283fced973d1783a8ba73ded7961963ce29838e3cdc06cbb078f991998e7b453e82c37a07762ca3713ce9463942b01d7c151533096ca782a6a8c02829e97ebe47931f189cf5499ea4416101ca1785dbc233c9d255bc954319fa1dc9d4c3365dbb00474962c32618c04686666646a5e06ac997997cb498d8cccd3c06ca39329a3f58b7a063c11862746100884d1e4998fcc34d8369d257c9d0503adf4961006c25e2c70e65daf61b6d6d43b73c625f3ae8f898979510616d23c08c2748034e07be1cc98613772cc86692d7a8b6ec1a8b2d098361c95a5cac6f85d87af1be542f9bccce49a1fc420ba085165de1a988e25082298a2cb7bbf71587e6fdb9c98ae9c1d869f70cc1d6758a8f5bb6bf7ebaf61a17ff8216cbbca1f71cc078e09c131fc414401c78f3cf1da05810d7e7e8f099b61d96293ca522e6f305bf3f622f2def3b29741a950873a0c5f87a114fe1ce6d0953f04491ed80c5f0c75f82149248a5e8e610dc7309873f61b580fc26cb7d7ca9342a2a9ecdb85cc81cdec264d493ee198f7fe1e49e495437082dfa54418bc04c679423e11b9c8f7bc728b89f7e398a7bc3548e3792e57f672f95df9b2e018feaa700cbf27050414264591949241096c1b1e42150ca487e033c75c70171c3b22c45bf08e71d73bc11a86a14cef5d1e0912b16d5e6bda68fe36e6a01818fe254f942b11cd13e9176956f7615e11535218d836f7a4f4ccef99d29392293de3809ed476954f2fd3c936aea4c021b6276562f0c3c74f839f74ce218e8137b0077b7defe40f2138e6af619e09cbe558c4751cdc828393968762886b83b9448c49222af92fb9dffb9817c7713f09b369931c3110e3ef7bc11ff575793072f4c84d9225a8f5db6e2ff287eb5dcf247cb5c6fdfb5de46bafb4dd5ce4af481de27b6e92ef580a7eda2411e9c19c24f21036fe2b07eda8a1717dcc5f984d93ae12036186ef61f2c1b785a50ddbf093e9d198ac91c52a632e8bc564e6c3bf306cc3faf1f7ef40a14b9224ffbe63afdce35e913abcbfe5d20d329a24f94231a258c1c098d2763f8f7c92445182a5b71a6570150b764d97cbe572b1f458de7ca29cc151ee4ed882ed1761a1ebc5bfa54b7ce52099c73b72904c699425e65d5f50fe7b4bf263feefc7b87eb48d1ffe7ea31cc424e3e0c7f7c398ffd67fa48e985f728d66cc3371bdcb55da6e2f2ce5ce88616d2c658624da24e97279aebf2ecff40f63de871333e6593d58bf79b07e3feb77692375ec7feff7fe12fc1b58fcf1c25a25797b996289a5dc9d104bc14fa678c795df706ce1709d5cefc40844c7403997fa5eeca4e76958ceda49639c71900b45671c039a4bea0f712e6db797eb103fe1271cc571f97a7940b63594311c2f943024c3301cdf1bdddc501ccaddc1e18718c8f5f9afd39db17f1cc10f9fbc5048b2bc50c8ff5e24612309db258d0bf6cac0f6beb5ba9f86dd28509c3e2b50c0286006f68d0246319dbcffdf943024efea45976d245999dc7149160ba683f55affd5af9fc5c4ccac5207ebbfd7240f96588236f81cc76e667ef065faf8e4fa5c3f3ab9c627d71865bbf6785b64ebba5a2d3c8e504628239411ca53eb6a21448d4e6394a8f157361c8535e844463d3d85aed045926469bb4e63293e789dc671bf5cd83bc1938ccce8343ec994b63b4619a18c50647e7492199f64c628d769cb5ca73dea8f89296d32ef317a1ca18c50462823942709448d4e6394d1697c1aa38c51c631ea3a8de4d38fb611c46fc3514f64690bc96f91332339e211ca086584324289ca9f0f55519eca70a43255049595aa2b595c4b4deda93db52d3035550495150cf45d199d462853a2a4a2a6485d9677a5402a342f15371f1ba15c60d3bc54dc7ccc02fbd2bc54dc7c6c84323e4d4d15b1696e4628a3d39e8a62daf0d41e6fd408452c6d2c96d3d4b86fd43842a91283b0f2bcfd6494cd125f1cf7167f356ef2572b5204494c8220f9ad56498a187cdbede53828bcaebc47970bb730f9f947b1f4152c2c6da6d7839622cc1fd3b168d9e9908cf285e1dbc82731cc61d87a96fe90fcd5ae1c4bac35763dd631afc152e6c19f8139c60975f834a309fefe1958387e0ccc31ce769561092b5bd024cbdbcbd4e28fba5c124bd65fdb6abfb41317fea2886494f05933a5ed924f97947267d89c98a494bbd3fa966be6c92877c6fd99966be67f2c5b6c8ea58d7c325babdf213853ee8f8929c7dfadb7bda95fa6b77a991b73f70dc119990f65744ceb7769db26298594424a21a5dca87dbd2b53261945eb27a3681288d5aaf4d246924f2b9206c7fc57b6d5af6cb7dfe2aff08f9f62bfedf6d2a48ea54f915b41b62db3cb41172ae3802f43962ff0c7d1d68226f9e35f1097b63df31897369a1334efa3ccb770698b296f2f93f5bbb4699c16598e250813cb16345961b994c15234bd324f91faf322facd85ba51e62df1fd8149a24db329c01a596005b6ed65e6fc60d45e5abd67da6e96f1b3e0ab85c5252f509ccabe98915353b5fda61b7b2e697ad1aab9176afb3726249645693426f6cd9f11150902e46568edc4a9b9cfa14aede7a8eda34b679b635271e7e39870299313f7a852cbb2e8edd9f4d954a97d241e2fcba969fa2cd3a3477fbba54bdea82d6272e28c3e772ab58fae2aee55202f6bbaddceb45dcf55fda61bdaa2371d4ea57dedd123a3241667f42baad4a24a4b4e5a5acba5acaa436b395409fa39f365b934295dd5cfa9a1b9a494fd9c3f1fa7ae488ffb1f388e7cee7ca2df2b6c5871b70a23a8004285900a9d6d838318be6da6ec1514f0bdc2879689863241f7a760b39059516545918a50252bcaa2eb8621d93f805f72f723dfbfda2b24c1dd69be5788b25788e1ee35df2c64c0820723df2c5880a110d200ec03b00bc41c0111f346fc2c6a575587ded036c64886bb7bcc511577f75a0e656d7cd8a8b0a1493125451477f71437eeee57dc5dbe5528c2dd5d85272aec702aad650a329bf128a98113a381a31da1a93ed2f6c6f4c3dd41df2f11bcaab43994c8abaad5e1d0b6355f40bc9e5e4efb7503ed44d75c0ce8ca744bcf1cb51c4aa486ae687b4b73a04927cba23fd0dbd1998ba1a9d5e188565589963bd121ad9acb9d38d8166559b32977fe50d5223f6b59b486a33129aae55036264611285ec0aeb21448e6e323e3d139aae9a0e9daeefcf808d15019473519327c806834b44707a7d264474c4a6d9ad4b4b66c9a84ae0970400e6c0d4d32a3861e7dd3ede86c9970b8f4d973c9b7e9a3b45ccae6d21429ada9b8cfa1e851abe668339a5a1d0e7d744597fced4cd7f691d25fa2a9b7a36799d45409baea1e497d9ddab62913f45125a7d292afa94a2d8a73f71df75bc34dddfd886f14479c45dbb3651fbd1da52cabeabee996531f556a71ebf9a812f5e87c54a955d9afa1abda9e2bdaf2406b2a90a117d0742df2b5dcf92b2d97ce664738a61507bbca8e684c7476703426b3198ec6a4a8456fb753773b9992a038b4e5d1b26852fa82bbc770d955c61625e5d27507654a82d68a68a8921d36a7a634776f21f9a651c2dd57ee1f76f71f1e3304897bd50956e0ee27dc71be5be4c0bd556f44da1cbaae4c385655a965323d74d7ee4e3384090fbbca52dd598463cf25b9f454a29deba9db01020a3a6120f1ec08a13e270a038d510bf24112fae181a1d3aab573e9a6ea60b8bbcd9e09e3ee32cef6ac7dcba4cba534b4a6e228e2ee44dc7d48134d34d184bbfbc580bb23f12d23d5d2d0755569e87a3edb2a25a5e8924771699b635a1f29fd1adad2501d13f4d9f41f552af2338c8a56b5c8e895da74c9d7d01f625719dba6b8f486435bb6c9dd61b8abaac4beaab64aeca9f433945d5125e8fab5f4762ac9f1605799127b2aedec049d3d403c3d32767a7c4e9ea01f1a8cdacf0f0c211e3448076dcfb5658f98d81db665529768a8126da74d9376d4a4f5a4eddc4e9a7adb5959a61d25f6549acdda55d5e998d8221477ae485b66c5f75e590d6ddb148753694bc89668e7d1d7d0db4d5d1f3dfadc49fbf6546a69279b3bd7f673a84e7d1588bbebb83b0bdbc98dbbcb5a944ddbf476e656b46582fe2da7aea9921c519b43d92313ada934f40524555d85b83b0a221d6eddc104ade578dcd05cee54c2c1b2e89a94e3a1c3ad3bd001a4445026940906255a7bead8f485a6f3860ea99de80e5a921f49702f24a548391587bb0b69d51b1136fdd1aaea90235860e6881ad8a0001182c002291cd0a8e1c4e724fc002be60331f0e14930009c63020854ec0004aa16ae1d7c3800f644fa2c20024514a1b38417035e30a801065ec0610645a0b8c083cfdd8300f151944b4a6f67113a80946d99d4a6d387bbf7c8a52d8bd65e89d69e3854ad3d4e0c45692b93cab6e0dbe503971667e11eba08652e2877afe10a4146cfd7f87565a2bdb0818593c38ac59a7c13770f80bbf370f71dac1c77d7e1ee39dc9dc8ddb5bb0d1601fe739e00cfaeb255898643713b4e83177695b12b5abba54c473b2d0ec9fdc761eeeed39a72ffff4799d616656f27d2e7b87031bb21a607171c5a4dfcdbf36be8122dcd9dba96e9c7aaae2bd112755dd5a19f1919fd8c956364f4b31609bdfdb38c705aa5a474fd6f91d05bcce86735f4969e482bcab2a7bb67dfad1646dfad155aa4bbabe09b54c2dd0517d8f48d3e2997e650a5258ff32ed0f8980b343e9726a147ec2a3bdbb356e42e8383d9193988035d3be85ecc05dd75bd9adbbaa18f0ef20c846601e230f474bed7b15f18b48debe00ccfb1df7b33de712f78f1bdf91b00bef882b866c8bddf051d5f5296f1f7c5587f35c6fae9ea7b31eb3601df957b57e38cde6bc3f7e230066c832ffe34be46c0f77ef8c27051dc9b71688497c1d6adb9f744986fd4fdf0bd38175dac592b1878bc35c2ebdd64228c754f167201dd29d101d8b5630b5c9d63dac337bbb780fb83ebd8f7de7efdea8b2f126e885fdc8b3d8cf3bd3f77e78677c418e30fc77581b1c69727cb441542162e29930237e07a5885ab6fbe8e85e0675ded38fdfc8d2e02b2c38cb8eedd990a70bedfd5e0256f86c2389ce52b942fc6faf1b88a5def5e9047db88e1b998f585f8de7bc17b6717631de4efaeb0ce4a6e8997649dbb12f10dc18b6f601678455e913dfb75dd0fe34bea9d355601637cbfab91eeeae68a1ebede6d05dd7befb5c101f8c415be47e108e20bc30defcdf8eabbe3aec032b00a2c62107b375f7cb188417db39765dc7c637775c77bef8ccb02b33278437df1bdb37bbf1a4c7335be9e7833667173c658637d65607c5360d65ddd50e37befecaec02c305f1dea7b6fd05fd792dc8277f35d5dfdbaabd54cacc186c50580be187f1844ef3ec123eeb8175f7cefd571d075eeee35dc7d88bbc7dc63be4921319ce0828941e65fc4075fb61499c00f922072fa8007061f787121b01c78101fc8000d02b312012013508300396d60023001164cc871aae091017bed08f9a03544d049de004d807581ce3b85185e9a1022461413aee3450a2c72bc48e11ca30ba82d44f1bc68e17392c0c2cb8f2ca250c878d48c0d6ee4f9e0af0be09edd6b39b43d9fddab95166757197a3b3adb5cbaea76d09a4a4b734cdf13560b17ec704032af40508515e8e57c622c920390328c7dac50488f342338c3d86632936197023c60f7b530b8d239e40a210dec5846c69ace69e58061d87831e8fbd148c1ce051f2fc414006b96f68173839def70bd992e07ac53649d1aec5a10b2c309d7d00e59470e06d8a9b09261a479c02e078a5cc8b29cb033fa6183ab4c7a4bfa00517208754cee592187275060f5c2064fc2300d6861d1bb1103cad03dd01aa67498f162ac1c2c168cb07e01cad0410413d0a1830c12b0f3c40a942b3b9109090205207d5c37043b1580726081323e56d8ca413c74e415ac1c600e3256100977d810e560ad768c446a34aa765be700b1401933e4c712894a015c60c70a77b038ea61e7e5eddd0f868fe5cdf85e983644a6958b70c7c7025568e170b1d04056286854187911c6800c6121075628037fc89f201e42c0518329bc59065a8ddac5df0057204bef783db4d08debd9649857c3b30a695906d42e64d5ac827278da5d114618d337fae6cbc0ee454bbfe0b5e0b158dd6815ae9ebc42879d6ce766a4aca3b3478052003fa8392d4d1bd0c096aaa90d64600a14274d98b04b4828cd480048683862240622427c0460c74ce827c6420b00bc5601161b355a94295400a35ea085ca056020b2315b716214bf2b5646408414952915984054046288b980c0038e684802128a5405242045aa3183054af9f014b4c241170c48cd6400a1a0115921a8c22604204082d6820009008f1c44424839800164bcc428c10634900127321809027ad168196c6182911a2e00adc04f024208918020406acc70315e29e0286028e0301acc23017fc13ef0bcdc1ce01b601bac6a3072c132c056f052b6dd9b7085a7825401a3c0272e4dcc8c278363eed62d2c7a2cbc0a43ac6fbef773770772f714a42bdb6413ec340276dac7f722c664e37288b1c0cef34690851ce4a027d0a3518c5386f8a0ecb48f550d4bc5ab00bbd50c9a86cc426cbf31cc110a7dac2cf4c205bb906a47832487555046c0934c2261ecc1ce6b62e78d296cb01b5b1d0fec56af160667783b1e104e2744151aa0838eb273c1f6679d989df015d3840e5e0ba1104823bb328db0cd3ada870dd8c7faaaecb2f8a5d039624fbe7ad439ac1c5e0be00c5f8a8ff5d9469a916685423c01ce90a7a0c397224fe9e065d9b5b069dc17b558a167a3eb8bd137eb641c5a087902c4a00ce0f63e3026cfbc13adfb89d9d363ce1967308779c552a133180328e312c28a013ff06650c3d03bfa862a642f3b311663885dab4a0e319fb6095fd041f74087b2e8bd09268680832e32d8c2822c4c49449a60c28727a2211b2e04a9b9242061c7c57685600d340401d2040c5050b5420278a01a70e3013db8410c567082106c80ca8e8c85a21d0630b50960d7262801cc1135e082e5034e701000121a8e0401a223c70a2c50d444c10a0936a0011c9a14ad50a1e65670b57ac083243872d704134f7002921a50d4c4dc60052a40c1094200020e2440ca018a0430830c4180f088010c54f0821240edd0410e62008315603981092e30a5871d0aa0043037a8c1094c60a5034f76688d07510c09260848f48005584830822230e00302d09a0c3c887062c818c080051180800f4fd09a0002c02307d18c598bd41e042462008316a88004232882031850809427360480870b336641307a706462b43711042478d00216a8000b0946c0010c28c007290878f2830f14d980c4c68e6c0929f8e8e16aed60858aa7283d1c9181870208e8a1890911ce72f716be570cf0551399093d054f0a380ae1103a03180398caf5c13d99e7ca441d9c935bc85fb3c25d81558029b20af8e5a1b835ab191999bcb58b6c6d9266544154c18a5985e107e6eff3bc7c9d5d6538a6dc7ab6ac7677a77177d4dd6d7c6b197799ccddb1ef7c841b3d92fa38cfa26dd351ec1fada56c2e7d36fd36fd194debb99e4ab43fbf5573cfa6df361d7dbef30bdc3df49db1b83b0bbeb30448289be4c1dd5bbe49262cfc807c80bb8bbe33106e834c26abe195daa41c7a7b24f5515a7a637f55916a39f4d1a4dcb9ba7be93b8feebe7de325dc65c8109211240348460c193064fcc8f091d1238347860c2121a1202120a1184230847e847c847a8478846404090505050105c5088211f413e413d413c41324034808280808082806100ca01f201fa01e201e201931846204c5008a1123068c183f317c62f4c4e089210386108c2018403062c08001e307860f8c1e183c3064fc08fd04fd00fdc4f881f1f3f3e3f3d3f3c3f323c347c827c807c827860f0c9f1f1f1f9f1e1f1e1f193d423d413d403d317a60f4fcf4f8f4f4f4f0f4c8e011e209e201e289c10383e787c787a7878787e7d9b4653afa675354a9fd195bcb31a9478fa47ecba4bafb0b78bbfbfbbe60bc4d6f3af68ddad3082482c2f775c1dd4ff8be54ee4cd05a2efddba944c5a1abbb93ee5e7ac5edc2e1ee35beaf0b7797f17d6f70e1d934f639f4f6341e3dfada8d4955621f87862a6157594dc5edb438247455693be7d90303e9c747088d2103a9270846ad1643460c201aad26240305eaa90109a132601cc5f88171eed05a9669dd6157598b4372acc3dd5fbe5dcadd71b8fbaaae2bfab9f36b686e656ad1f5736ada9e6d0ec5a1371d2efd363dd7f6937269db9eb85545fad3dd87dcdd74f71bdadd6db8fb8cfb5dddbd876faf6257190d5552b4e45c77682bbbb3d3b49eeb517a7377cf1df3b8bb0adfbe3d1a50895eb5db999ebd1a7811592f73e7a03bc2b098571a8ff789288ae287f83d1206d813fde25f5893f02f0e47ed6407e3c1c613a73b949f071b433a3f0b7687c62638e0ffca1d0b368ebf62bd47c2e043e18f7f614d567fc3b2091145567fbf096bc3461bf06d984bf9a934e1f72a538fdff884f54e3fb4fa0ff664fc3b96bbfca4090ef957e52effea57e513a71fba99a421ff086b82437e56b9cb8f61c845f2af604e7768f521cce90e85cf823de1c1c6d0ea9dee10eb4598f89924b28141fff834e417ff833d0989f810ebef37593dac09eb032b9afe40d11c2d1314880e559c032ae000950e41e8e0830ebb5a2e5dfa59cbaeb21ddacae6d4942d6a73a0ca210227707713b87b580277b7e2ee2490d19ead8e695d551c3f1b1264c81022a89ffd037638ec6ade324175ce95e914e20777181487e55224237695ede8f8127700eb248a93d4673397e27e63575913ba54743b69ea8fac47d6a3733b5de45a555d4fdd97c085ef264244d06409fe40132877290768c2018f390082c07058b93b9011b8bb08dc9dcadd43e0ee2070f70fb87b11a107683915884e91bbd3a474800353ad508c0d6880882a2c8021650829ed097e3280017777296f8bf0a122458a058680616fa7bc141cb5c214af80536002ee51462b0b09b80be11e01f7201c022d94fb0997e252b0e307b43d38c0dd1daa010c686fd00bc040b4b62c05ffd00e71c7ae00293e3c25a005220501517a68891c8a1fc0c9003cb436dc5fc0d18ee0c0d18e08d1e168475a2644e7ca649e2b93c9a2b4dc793b8754a41c0f21baf49603c710b5c644a448ab1ee14e1d9102ec50807b94baa02a01083f14c1dd2f97231f2c4810906407ee7e7b30c20a38ab47630877c73e886c04a107173d3cc1ddf389046c414203a0acccc0ddbd072c20cce53263e286bb5f249ae0c30d4b34000841ee9e2160043a40c905b61eb8b368ebee9795f2cb42b9bb27e9e0eed7c6eb7067cba2b8b42dcac1915475d5b5ea8dfd5a0ebb676b7f3b51f6cf214ce6a3375ddade9870393e25ac37ee4996f033c9177767aa15b56a922dee49a66a402021a937b46712236793ecf0a23687aea8522e4d92e39e4b9192d0e89638dbb376b6284e97848e8bbbebac2839871c9fe086bb63dd936e08f791f5f4c87874724bd4f548893d95685b37ba2ba1d54880aeba35654a82ae4a367e5f6cf5897b0f313f6ef0245c110aae84e7d025da7974bf9d2b5243d51cbbca5a26682e55a29d389d1d165592b6292e5d758ec11b6ee98944d4842ed56eea0c6dcf9beec4ede84edc6cb6aaed6cb67132dc0cee2bad88bbb349b954087b3b734929919bbbd7549c9c267429f6edf96aae095d2a6a99a0391cdf4b55627a7059aa412e5a0a80bbaf275afba6da89aeb7f36929121213cb5443d7cfa5bf44bd21e562f8599aa4fa6057d9517a9bcd6c50ee2ee4db26039696ead422ee40b0c1675052c21d65cf56bd1171f79d137737c2a64ad2da9fe98943d796095a74ae4ce7b9329de7ca74169dedf9023e020f0167c14186b2ea8df64c5a94a9cd9deb9994d6722aed75aa7a9361c59225e5d25545428f9eada1ebb7678e15eb5c4f9c122d871efdaa2221fdedbc411335b7a4e9bcada81295455719f00c0c70d51be4ee82db12008ffbd571612eb87b98206cdc1677bfe106be4503fe015f3a821233c48abb07a120c0cc009a982c51c244d3b2ebba12b97bcc521076cda9b4a21575afda3527470790b233dc3d4696eed478aca80e3de2f132b63d93d03529e9fc16556ad3554d579d8e5252aaf4e7cf4073eab7276e5573bfaa482f8bf1132306d09af46aee97a86bd2b3288e89654f23a3375a0a6274e21e5ddb9396b2a8baa47db496cb49caa53895861e3d928aa239213f701c393f97a6e792676fdf9433559696e2ce5c534d5ddb9c4a4bf2c2e98013050ed4c344eb61d37428611f41e048c709c6dd7538403d4c9f7353d5a39629c8a6bdc0dd6da8cdb8bb5a8385935303e773624cedd912d1e16847723c7c9c34ce16ce3f5f37a073c7c460c2e808232ddb4808a3284f5aa31ac631403246464645607c4995a1389508d351cafef96afbe712213f86ecf89cf91b49123a1cedc8b66185bbb73994486d3d97e862b0c187bbd7ce211b4ef7da3964c3925b7ae6b001081b9c1c09245cb420a19a42322508244f4e489820696f486a4890b84e5d6bdf746b73e82d655ff6b9f407a0fe4c07101e40869832d4a0c22f794fdcedb91a0f77bf345cf1981e5c68a0f2a45caafb3687b23484ee4e030d2f7717000d42ee6e54438889060d35f239351e68d27a167177a7c1c1dc5e98a1cb0c5966b072672862862933ccf0c4cff5d4d538d753573bd55bd3a94b82b247681c117224470c922a476c1c11009723631725841c21c3114290900108215f64a8095982bb7b8dc7b99e4270b423493955486e899a5bcac59094538de048caa5429272692d871281a18626e55421aa901a9a944b8518e9d1e6502249b954881121233123610c6162e8328316c410439518a678d3aab6672d77e2be760eb1ab6c673663736acae6d096095aa4c8dd717efbd90f1c47748408c1db71cd2612812b85a6a3940977c7d531044307dc5d068baa2b3a805aedd431e996dcdde6eea8120e59ed1cfa2135f7216b2e4d4ad72038da91da393444875a0e25826448111f3786080dc9d1d1e1684c76589409654a52a4539172a98e8a944b8b9272a96e87659372a9ae8865ba31e198684db91357a4535bf6763b8b746a9b9453752e853bc36f4e0b3dee77c49db947958ad472275a5ba2de6e3454c71a19a934a3dbeda4a5442f6b69a7dafecb4ea51a8ad6525aca94b432ad3a9496435714095d5f5dd101e8e4d8b4c803d11224c50ec280203404c1819017426c5c790262c58504804c71d101206200e4890b22f0c8807a643c3aadaaae392c9efc886257d90e8f921ddacab234d48891518fd0b7285aa2a9b7154542625abfb69ecfa6b8afa128fbcf9ecfb6b4f3db1e21365d5122efc38b930f1e7737a241438ddcce7445dbf3c71077bf3e5e3e428fe9c1a54714dcdd7b24f1b3a29c36ada12bad28971629b145e851d389fb9c22b5f633261aba7ececf7e96944b6b3755e9737ed663851e343d707af0888941e567ed8d8945571d1c8dc9aa16e1684c703426b3198ec6240051313164d083003d467719fb3396857fd95943734cabee5b16adddd4d8eb507409f73f5e862ea94a72e9e74e1aaa3b3adbb3e642c7cb72698a94b639b4967eae5d3a71afaeeae7d296493d3a7f899a5b624f74c8cb68a88e6d6a5754a7aeba2fdb13b7aa398462b06c493b6f3a7465d3184244887c0d6dcf5c52caa2b51d5adcdd87ef1dbbbdc36747e8eea910a1184488ecf8e2ee4a3c56ee9e74f4028f1eee8ea4c49e3b7844b93bea83470bdcbdc6b23abc6cf1981e5cce51c7152b553ca6071708e80022ca0d1ed3838b8e9b8e1a121f1ed3838b0e1a3a60e8b8f1981e5c74b874e81c4be448c2637a70c9d12587167777d90b3cd6f3c6443b73694e92da7ecba47bf6763b713e971679198b2ab1a7d2f9e36538677bd6d49675c1ea4e5cec6546a8d1371dd550964569eaaafba45c8a1eb1e78e97ad68ed44959ebd9d9fa3de1e3dfa479392d2b55573df3241736c9b4b8d8c58261bcb74d2d0a337323a95be655124b56553255a8b22d13e97e2d834772ad150dc27e5d225dab9b649e78a2a416fafb6e98da6d32a25a5b76797a8b7db99944b6969cba62c2dd5992f6bd9f4f646356a14a1c11a31416bb913a7e9e86b689b435974d5a16bec69a94e6dfffc1c8a2e69d1a34fcaa53addf9a3654f24f58d50dc99a3a13ad6085dd59688cf0f93d1b3e93faa6b6a8d5a35f748e9e3d4628fb2b733c7cb8c8c505d53fb28ba2ab5cfe6d293095df248e9a34c6b9197a1eca9a47b1b5ddcfd08654f25213760b01105f4a64bd7223768ee4ef3f989412d52bb0102773f5291723cd0dab926e962604f1f7b680a19d84332c8f03dc4629b2f309bcc22db14ddfdc4f99cd9ac488c060d3582c3051c4bee6e5443893d77cc664568d45695860e6973a8121abe71fce0ee4545682005c111037725f6dc81c308ee2e801774dcdd86176e7077242f502087fa606f37f38525b87b0d3514c7c4e6541c4b34f5364444e3ee34cc7c130db9fb0c35cef67c61362bf239b359111a2a52cedd7d4b958d11d8a86223081b4f6cdc60e38684251b45dc860f1b34b60d166cd05ca951448d279bd770ea82438df6860400be6b00f1d488d578d560d5d04bb800e64b1717b6dc2c544a5ca6a23ca607172db819bc5c9b08e582d3dde93ca6079722178af8a0e1313db8b890e3c28dbb0b341ed3830b8d246262536e8c27b8bbdf6ee9d18a0a2992e998906a6f7e910c06101311221da690222126d18e57db9e183c30643d32dd892a3deb02fda6db110e6559f30895a1694595e4a04a5236f74645b3198d4d71b3999a16e958a3676fb793167b231c22b120463f2bca9db4a636656244c4e86bb993c8b7f0b2db8d09e9cf67cff644d71695e165b51c5a04070e1c46df943b3f2997aab56f9954b4a6d270a0e95a84464e4d5b5d9027f23938fe7fe805a11e1f59104e4f2cc8abece7f01062be51cde859948de1674649eaadc8e876d2be87167b7455df08a7e751a51665ba9d468062e018e1f4c48218c57e090f94c8d768427bd0a0a146d8267429fd172f14f423d341736a0f2323b6095d327a24d58887510f1e453ddf02909fb1689bae32bcceb31f48c10bf9170fe34748c6f333191e65cfa1d779197a436b3a6f646424c448487bde9868b79376ae4c34daf92abae4d15a8ee9d92674e988897d24f557f408c7947bb4962a5157ddabedb7aa3a647d54867ff1e2c58b977d0e5592263daad4a24b7f3e8b43dbf4763bff764b7bf4bccecb94da2436fda347575469c91be11cc582b4290e5d3a7ffc4e0676763d307a50f030e1ee41be7956b079966c9ed80e106274720f0d3f14d153a4a74bcf097a763d473e323e2d77f71e25dc7d856f9f261f1a7c62f8a4f081800f035ef8fe397f8afcccd83f9ebbe7f8f6c1818fd48f103f36f886d10386a7c3f78f096e7cc7d0e2ee45be63e076bac470c1c081910218521ba806a0a10db4b36380016202c4fa40029f2d3e100111000947400c701ff20d1401a02000f56047c88e508b17ee2ef3229b9aa1931d699143f692798b21533a5036e81c69d1ea845a76b4e8c1dd3d274bce548b1fdcdd739c74bbc504727284b4a0e2ee5e039297a948391e3620519172e9e7d480e4654c46684da5cd8c5e5643db135d694bd0dc9b2faba1ba135d6d40520392cf996f031225f6542acaa90109aad39d4aaf7e2ec8e348b14005492c514387e0ecc06be8ed96f670f7157ce384715f82027981c26b687bd67431a03515c78b9c1730f80bdb0b0110897ac271dae1e89410d0e2202982b3e3060e0fcebf70368e9f4068a88e08ca9ee84acbf1508bb0351405424375448c0c6969e7da3221528be440712a8ef6c67422a12fe454206d8e49c581840e515794869c0ac4dbc16be2ee33f8b6d9407127cb32bdda7e0d5d9954203fc38911b9906d1734ee46dc67ba13559a19197d4e4dd91555f24f7b56c91b19bd4e2ec8cb705eb44a4929eec52bd152a525b167d7a414f7b9f4d94f005512a21ef083a2cdc295cd4201360b37b88e8e2ebd2115a14a8a5816cde1d45aee5c8b8a6eb7148945934e5d91ee44958a5a94658b5a2615ada9b4a21665694568bab6452c9a943b95682dcaa249e7aab62c9314095d7545b75bba54a4d4a64b8a96d61387ae32a41a9a4b712bdaa2b5478f58172c8ba248371a5a7bb55d71bcac2977e25e558bfcbe81b16f90f68d07dc5de6fb864b0b9c8382063728bca8f07ca34002cd46c1849bf1e591af97bbbb92d7c9ddd2736d5926a5f667dcce74cda97f84635a697f3e8b2ab14cba476b6aae486d7369512d87d258b496a1e855df5ca72f77ada48b340cae632c20080f75dc5d00be4bed3effe27527ada87653df05171e27a63b6932a41bcaba1ba94183861a31fa7f5991971935791bbe894c4680cf6922931180a88969e86bf819dbd2502424f47308f02f0c31fa4752736aabb6b7932909d1cf1e45919ad01ad38d964bd954a9c8cb72332394e9762a79239f9f1a0fd3e873e7ff8ae6d02424f5cd9f1935ad674a4b91d01c7ad474ded035d673c4e857f573d4f6ff6b39947db57d231c1c992c26e473da1cba9e42623e478c1e3dfaa6dbeda4a5baa6f66fb7548697b54cd036a7d25ef89951cba235a3d749cad572e79273ad29b5e992dbd1a93b698f1e7dcb32fdf89991d1ebbc6c555b1aaae48d8cd8f4f62dbba6486c8a7e9b43714da7ee5134c7cb54a4b455737f7e6d3d97ac2ad2d772e749a39d9f4b4ad11555a2b28ffeeda4a98fe254f68b7c8d1ab7db8963362b4203473b4283893a2443523fa94aa8f42cf3e6891a650ad1c000040000800083140020381c108945a3e1781c07a29c7314800a82aa5070481b09a32c8c4114050d424801101801000180c16840002d0914b03846483b7912c43f49f5fbbb568d35d8f65fc5533b31d4d304094a55cd854e2d01bdc0b6dc0f55f72da1bb862ece4057ae1b5000c5b65474863d509cf5b62e2b1d85082313dbd6d220904878b13d04fd893e1e0ce7ffd23285a82aba075d4fcb92634662e8be6e7368163ff1709b2d6c0f028a1e8afce1c178a33e60de51130a692a6eced8d76b14db9bf785412debaa799e502bd51295c2ebe4877a91137f9fac67edd73bf8e8205c4e72cb26871e2cc2f3240482f3c7e1c8bb0a54bcf43ff6f333ff990b63e1377982d796ff48e3bec1bdc48766766912b8010ec6559f8cb0e30d535ea8b2cdacb22af471a41a44e369e6f021b0b92a82cd9ef4f1368171b8e78b795d453bffadfe7a2159271b8655ca9cd80274a2f1878f96d2772663398ef162f4401c7fd25e9fd0f2f61c115c4769b367365bc734347da4356542f3977c69a89b98e3dfc68ff69e8a3eda83c77ed0e329c8c45b35179c9e4931fc9aaec1160a4137febd361acaed537e14257ebbbcd5694de6e4b75a1679b856476d303a6b7fb787ccc4104ef4aa458845c120672e6e7b2242ff26b679274572e4d16c981db0c8d58db11fffde125288c6e8327accf23fd2c3b6590cdfa67177006c8d91313c59ca08d313453457c3133196fe2b3818c4bcc7bcfcce09162d9390bc38b0f4f24f604cc6d8eadc5947062113007b09993b0ce6d9c9381efd6ab3e147e6e522da44899f9db2ff6741663ea0cad012b2e162ec4ef06deec2ceb46b7b22ff00328038ed6723ec4b12cdcf75db451c04499a1426ee463f383707b75503ca1aea2bdfb36c656ff1b0dfda4b7e4b8c5ff5ad6073915106098da8e5efb2b4a2701f5017cbe35dd2511dda35b2254792c7c7d9d364150a1c4a1ede9571b04ea7d3dc49a4480c94a7c78678d458f4f29d29793aa190c2533eeae7965567df76431334f90fef21e801b71783cb80212824bf59de2d090bff6874cec7aff5d250e263a1739573c7b927ed4c5e3a8aae6670bd034837fdc90d33c54ffa47a0a24fe0711fca900c86827e3011838587e976ab74f8d4658027a9395734a007a8980e4d95b87d9fec1b71e1e15f0c446b756278e1e15d1e2af1aa62ffe0896dd921608acfcb6c51d8679bf720de75b0fa5f0ba92a10e57638e0bc8687af692aaa3e23aa5b6f78f8f79f52d3a56a5649d271b1b341f4a4207f14009b2e73b6b295aefff1cd6f09176c0431036716241e18aafd02e2c9b2612bf643d4e0bd9e46454233266a049bd7be82ac29f87bc15af7e721ad30e36c8ee23e670fd9dfabd2009d836fd46b6ca26fb86f7e984cf17abbccfedbc01a36cafb77e5b7cb4f89f07d9961a6f177042f86abc7076a3650ddde8ca76e755bb0c21801fd7c5d831eb1c1b5695a601f051b2ee684adb3984dd456869bf9ecec636605e4c3014c2a88d5bbb336fd6a1fb5ce4e25f7b249cdbc8590e2a686efabafbf18114cde13a0d4f576cf3e1b4c36b1c67664fefe1c044a4c674705c78418427c321eb834f80fb4d18cd0da6e4a14e6a169937d677390ba51f2e49bc9ca1d68f48c0d6306018e5148fcb3dab357e9c7bc162e567ece15883cfaf7c174cf419a72e32e91fc730b0106ca2876ba19919ab9b62f4e0a584a330bdf2a2d9c97864cb3bc39f6a38265c83d1bce708fb6f5f48c303e99f6ebbf3173135ba8ce8ae5df23ffa21b577cc8323e5428e7cf28573f72776b03815b4a45d13997ca714825947d49c2d47222e1081a9991dfc14f35e6f6fbbc050704b90ec3834d21e16c89ac424867b4661dccc6a63216c02a462de1aac7244968658bbf9e1a86bcef1ec9b9c288f48899b829c806d77b85bfa653fb5f19cfd0f2fb4d5f169dde81fd9c152d37b03c00ba434e4bbbffb59379032767a0122c21028140de89e310c8b0ddc9d1cbdf278fff60e815cd26f0d47ba6a47a79f35c7576fe62380386e44f113ef4849ccc6033dcdfb264b41d5f8a9073af15bb4c87da81a4b0ed190542b2c774900149351267c09c83d9460796d673a59629b3bcbeb931647b98ffdce8f44849f12434e3726eb19950eec61efc7320b16978720c35ebb9739870d346b636480596da985072f1bd064ae395395880db2b789d982d493eb0426d9349f399971799193abcb47f90cdaeb135d90d3afcdc934c6c9af59c816b17a89975a43450b326cd1462d894e098456a0e1651ca9f22b66a1c772faccf15b79cc90dfdd28c8ad21b87c602de412b41c350e4a2ff73108771078624cbbd68a3989a0ce6502dd0024ddbf33135051ae7d58bd62f1d15baeaaf88e903ac77f07530b24090d8073b6129190b42c0fb39dab3842bed06ffd76c58e623ae20d9303ec10cda63af6803647192c9a3cb3b0230f8555c9db4789a11cc4a9a6ee8e9e565e15ffe349d35f9b90bf11ab91124c0abf0a647dcddcb0f5c7c27cc0abbcff42c88303d147ce1e0c616ea0ddd11eab28146d9b9e88e8782d4e2242cf6c5286c8698b1659c1d9aaaa78d6877ed354c7b37cfed50d2371bad854928cebd9e774a1405be9917378fc43d0880f91aa94052f984b277d50a016508c89ffd869bb217cd913c18a360eb5861f54673cecafe1e22eaee72f73eda4b1cf8146e9bbe7ef608ddefa9edb8e98ab357645a6dd305e427d0fe795176da337cdee1ae00796360a5c7b061f51740cebb15c52204e56e295d55d5c2c022e96569ec3d3ee1da3fda91bc72605b54886afc66866474986807578117185dc7094a2b50eb0c3ad993fe3da7cf8d298b82c46a1e364af0775c3d34a18dbf6e69f535fcc5d4396463caeed9e575ed1d0ecc7b21cf263d0a959c079b89dfec75812c96fd757a26f04f93ec1eee19a7dc4d96c17b1ac3063a3d908ebd513686e77e6d925f57846e5849ebf3df07aae318843779a18119fd9a8847d5b04eaaf935d2c03ecc4484e4d13da1324765bfe9bcf592bed312eaac92a92fbddb0d40ff966864e6f5de8d7620b1f6acc05a8fb83485383a6eb84897e99412567fcb5fec258f022cfd1ae1b0dee7feb722c923ba2fa2f040fbd49262e6cfd79551702d4af41d83f70d33b645ab6901c6b89fc992d9699a26a0464248e9ac62719b07576e16f31b8af49be27394daf6708649aac52aaf82c8fdc97d6db79d81ee347a5529ef69cb1cac3955cbb74d71292fbabc763bb1f232fa52cb344b5d33e2e24dcbf0d5d9c7274615f779c3b9e8e98dc4315af6ced804f45f731f35aeed63cae769c59077f9c955969963ffb54eba6536050a59369cdda72d084b7887febfe79fb5e25ece785ef5d96514bd69c0955f2c7be9060dee1d8460a4f1bd55c8ea0d871f995d54709646ee4c5afd680cf460e4af731e845b997b07c1bfdda0f59fed167acbb865ff206d1b6c1f435833785a79c7f45fd3ccca47560beee1fa27ac501be5f359a64780ba54c7df11b93e3500db8a9fe0b1097d00f338b77ebc7eac84e4e32a13890d8d42cf1c7cf70e3d99b53446bedd24f3f732edc754c3d4ae551d653e2b9b92f0062ca908f95b77810322fd7aa731978232e0506e6d32390fdb2f1ade9d1d2c5c3bb45897420f98cf5824417c58d6f914f67e773baf4a369ea1fbdb6b28c81a84d1c41523b28d1b9a63f1698dbf45465281be044361e6fb7717387c1342c0bfe71c37b722bb337b141109795c5c6551d618691c9969b3624bb3e65d8d0de69155b924f7a184728eb0a00bf31096ef36214d3050d5ad3a859cb8c6306c8eaff0b56066efc513e7f25830fc01c2e3f0ec67ff4a8a4ffff3df47e6d7bb3e5d3f82acb2670ebcbdf8bb7f4dc02f4e03043ec66296ef767ed68e3dfed24b96d05673e6333c371e78d9bfd08053e185a2ed7ecba8f1895ade7b3f32b70f50845a92ae521bc34635a7d0cd2a48b917fa2b2c1748998d3a4ecf3997f725377da5c85eb41b4f0600f6f39750415b5bf9ad403ebc56e6ea760054a595f96c25d63b2cdbc456fa6f8ce4eec48efc17355c9f27232aeab22b47b08664582afa462b1bd75e34ad7388a9d9296a0a169e1792092035f228842351fe37bd7828780a6e568a383332202e6d5adecac4aca1efc042c24a372e6250500ec55aba793018a3e45d7a3eb27a24a4e5e8ecdd6d3f203f4c49dbdffe5c377d7bf5e43761a427ce3a4f145e52a14a34d473bb008a4eb44036541d1a688d9967753888c48db9ed66448560b2ba2ccc58b441d63fc92216dc3da2b33fc729ed30372348278867887e9577be7887843594c3e72ad0581d0d6112d30b7e6b759cc21e1a5d526acfa03bbf5e053f4df5d50e4177c3d5dabc30dbe04aa13919737b3380bc1fa8dfd55bfa22ab64f7ab6d8b02509be4e24308afee4788f8dde63492f9dd78e2cff5fb4b38dc0984824dc8eb6e41e727d71cbc6e9ea547efeaf3e9abb1b5e767df0c8ce41be6804ff3f7a20223821fdc163b7254b63eb7a63cb78d7e571a1ae751cd86b40f5e91afc30dd6d88ae2af1d188b2d9e5e5beb56d04aed6e2c48f933be1e8fabb19e9943fb198f8d9d34e85a423650609e9dc156405699b00bc5c35654f3754423c63a20579742d5192254db083792a20400010f749ea6e94b03b1836ea623a64bdb8b7a06f6665d024da3a983c36811790f4d9b3146fde86af0354c8deef32c2762f11beec210fcc09180988e123573270e441f677874c81bd922c034b6d5c61672bef2cbfacb0313218f176d5d1fde7ee7ef7d954bec981e9dc86e6ad61dc08f7c2f2b5f4385df49e83c08245a496c0c0c925be4ed1a9161db324a06e525a91d182a13e887b134226396caf40ffa3e7b5e3f57715c82f476fa89781db337c097da40374f8fd62ce161949c8c4157108e42e7c681ba66c07e8ac425a9adfea1300ffaaf4eb69f580b89e51a3436c63c366bb012be601bc5e781cbb1f0f5ba0df9b936279d5d79f4806dde2db1496ccd44e648dfc4b2b77f11083bc4d842ce357f320bfbe5a6c52e60679f2746818150cf84319fe4be873612afff33b2eeff457a1b0190dba1532ce05a65456dafaf72437f8f108365d5655a3b83c36e258ce62b0fab2743e4b13c63cda13a6cad6363d913a695fbb6c884fbfbc111b371700cfeddafc38ff6e51beeb655a92c41cfca91e47eaa1631fa0801ec5ff89af8818d626bca41b4549ecbf96c580e129822828a42ceeed1ed4e7130383694a3645b6d5b6a36c0b95de638ddc6a8f1b3b8c75b60773e743228530f21dd791bf15d3ccfda12fb402ac5bd84bf616f69c018279fb53ce4232ca7e4d3f56c9940cb3b771063cc28bf66e75aa4e8d566e961e981ff44f2c1ff6d3beb87d04dcad35710ed87dc06817ce21c1f64dc08dc27a8279436739e2112465adb8377f0d0c7a544ecea98cf14846a9888453192d0f65f7a513caf1caa1663a0d6c66121dc07fdf33db2339d86748617470f8745a741d3308d1d6c10b3cc60a25378abf2a4a124c3e97fbf005e9cb0f7c8c75b7fd68c1b36275d23ba8e1f237aee9316d1bb2f4afd959085c59235f736ac63e337647766afc3abb79d6a1e548509ae7bd3b3c758af6363fa3fb9487be94e2795a273c143b29a5afcbd33cdebf61578157e26f3996b2600c4ed4d2491ecd6e3cbf7727f64095b363ae6a48ce5429839adac78c90e2cc2705dabd433344e5a0600f7d4003ddd44fd7e3a6573273f054342a404a4926d2a1fa040f655faef2ea597f7294d232a320711915724ed8b2329d04c6d42a9da9a2601c7053dc7c067a970e288e6aa8f073011c876c6a3306efe8aa168f1ce4019c8e1e88f04967a4d95f0eb9f863c7d7ccb63416a3cf1f4b7e58430e72240e1f9c7f58d7e41e501806336644310ee546e8642316e2e8ff28e990bb219b99f71bf7045c944316591358b8bbe5e665670d3049c9eb13fc7c41010ae3e40781f5ee88857a9827bdf230e7938c83cc4afa47630bcbb6caf8088dac398c05ac110f49b06ba288dc576fe0f0187bd376eb4fba6da57c576ba35dfd94d1065e90e12b2e39fe1e71e2a9e0062389687eb4716e45113f1c6af53a43d84370114e92feae3c7232bb3bf8d18b44296d17fc95501d0a56ccca8a51644b93ee1f8236a9c43f3a1123a1e18a4b705cf7cbfcab3fb0d5a59bc8d135996a59cf9485332cdb8b124cbaebf237c0307df3356032ab7387cc817d874e5ff4bdf3c52e73c7b8131d3f731aa6afbefa53163d6ff70145bdb6c0344fcf97a4f2af6d443ea50d6d3849ec73075d2270b324cd574d705dc8591399cb76ec659c1ced5054e1366e3c923bd51ff51281efe2e3398ac7323f8f2c4f951033f3b7c2699fb1f0a3ef073207d1b36bf24e1c72779cbf0aa01d1b782769bb94d7bc4b6eb89f31ec4be93b50bad79d8b78f596301ce1beac7fc29d8bf04ec0004fe81dedc95e53a576ca8e3bd3d62f64d7610f41bdf9a3aab9bb012486fd0c2d10f1e8c48b9901a116372c75171f0c78ecaa0e41f677be54efc5d641a3a4eeb22fc00e7952ad3140e98dbc482bf80d6697afc5ffe6d7132d0c7a7954fdf6a1d64dba437e4ce4a524cff29e9f80f1aa18c01ff8275ab77d595211a836bb516e53000df4f44ca53a766cb886f34733e4cf05a4d7630d00bc950f341ec9f96a5000378e780f533c0ba0a394b7c99bccbaea1fe00a04b55d207137a21fdff94a469f7ee89a56b42d52106c3dc5de4adfc7f1f0ad9afbb56f959e78fd6be74d66095861f546616e647092a8b736b055d53d3aaf6c583b35375c7c19fe712e2201091bfcbf0b0576f22ec145a0e2961e3a95a7ef866892c965abd3eac85e8eec25050a1c0ff7d979a074e4482aebf161e2cdbb20b26b15649911720232da1fd5b184fdfff5982c54690a0dcfdfa1df6be46dd590d4bae71e79e6f622cf5f967e0e64acf957048bd4790dee3769eec46b9d8638af171c4e612c82419659818daaa1e4a9fd19ab4583b08a85ce91b9477640098d6f759674e017dfdbd7a9592196af8cdf278eac2e061e53899dfe73db9a069b8337f523c69922cde01ec7de2955f0b65bb0036e2fd81ef93f795de4fa2de2f143742c276d4d987af73a8d1ad1c9ee3bdaf32f23470dbdba8f3ee937accc6ffcb659fe1623c57ec3d07c6bf2c2bbffd9a28751217c1d82f1464bc3d579d0d958606848422c9257b71616d7d2b6c4a86d1b82df9e7ecf15ebd5b9a7c9ce04e8b74dfd9da43d07a34388506c89cc567efcfe43da1465f4a3b448d352de3c89bded698af5eb4f0fc7fc2abc247c45397304beb71c0a79d2418fb2080263d423f3884415bb0995933965f21fb587cc63e7354663f21f86d2bed1684a7c09d40000f463e027ded157485f762b90c3990bd793496a8e9a226724c3a38552a97560a2e72efaefcbfebc6cf03b31aa28a8e12fdaa52a27eb0087aa595a275ca52abc83015bb81fb0f9ed8f30dee6548c54b3841310b60cc1cbf7ce215256fc79dd179fa94ff2818266d8f829939ec7d5ea4b0a7c67d884a82d1ed20447961a45e883e053417bf6047ffa818d4aee8f2ef65be553bbd386e174bb8e774519c8cf3ab972c72f8d3ebd6033c6890a2dfcead5eb1c02ead203aaf1a2233f7df296dbe4ea3d1926d00df57104d20ac1d8d57382fbf68c47f25c8c7e85030ee1d742c27f3584d53a816571edb56c3f5fe5807bc088df05393b29c4bb79b1cfa8912dc506af4b2c67efd1fc4619fa6f431a883caf0ee8cff37e7f5168a071eb7799c85cdfe05e53df0df6fd29405eb5f875dd3dfc801ff8bab3fd5b8b9bc2adacea0836f98752b0cfa47229b814908ebac06a2467ea1d62bb66907f55208de9c573c187777dade6ea0e069338d8ef6f5e1fce2f69418781265efc32a533cfe38a4b07ea17b3aabea495a769996b06498a29b309e3504d8cdeef77823ac6541d628f8f36c621c20e5bb44387b22901f6015cd09d8babb13eed3bdba2794d05679aab057ff6345747762d4715876a67eedcec4f4eb5e212c05f230cac92a407c4a18dee7a07a6ebd21ea0adf6a4fd44d171af1bd7fbb534e0f9e466c077c0317868feb878684c7babe0e82d37f4fac813df5761739127ab340d5066083766728be816d3e4d497c1acb13758b3f71eab5ffedee2f08385769160b158431bc5321b4e8e49a76a3dc28ff04eb155690a5d31600d90715f6a32740bd77f90ab4edaaf0ec4abd13e2f7f9476ee86f9175c3dbdde01b1ce39f9d64db0b1ab95f7aea795f7c3d33d87bcc24fd7a7f555f779c83175cfcee4762a05afade226586c0134fadfad1e4f5f0e3ee0e6cde1c345e46c60e478095aab6a0dfba49fe8ff6a3342c5afa3b6d788c0d2279ccdbab1e6a8d2fad614ed5d564b747e48167c4f6bce43d8245a3abbd88cbfd620f42471f1a1272d9732a82677f752104a57c1376226213941a5df5dee615943abc6f51b66336ff51b1a05fe80b3fa0e27f01573f2cca3f9fa1e83cdfc9efe58b6d3f5da013f24e381261c246aba7ac4e29b95b62dd7a01319a839a33fd220e1b96bf4f7aa44f60cd5cbe137af4c7f5eda5a4a8c2576032550755b37f835e9f96cd0fbe40e3cafc6e6e6475c6192faea063705ce6ebae4126a019ae356bc313800ea88dbf08b9c5183b0c075d10ac5e507eb37faab86f412db737d0ed4b95d8f4fbce0f62f31d12777ab78547da74e21c759d7a7e68f20fc2d5e7ffdd7fdf5d78bc329b52cbb0ebcc08039b18175092afe2080c942c288679aed4b71039e81112c7712dfde71bb16f6a5285808a37e8a0830ca12037aecc9eb8d644d989d958be07840bf94475cd80e60c3a54d70094da19602a16d745c133251d598ab97586b097d74b7063d3426159230a27e6e2c6a1811ea3dba1e6458556a10e4aa38ce087f87ee3629d3464cc61b899da234db890a904879e3d018e39e17c23cfb7dc710a6251687c068b2f51878af49441b92a074ec2639d86da108fd116944c145ad1ba8c2f256e8433265d44e3da7e82eabef9080fdbeaaa4b11f5f80747c6fba05eddc9482caa0a459d9bbb65f8f60729805f8cab72c4cea89a62b8be50f0fc4fa8a2dab5af77005336fd580d4d4cefb17ec591dc099e71eb8be53b0149826457ad02f0e37c73b3051bf30d37531aa6fa893564a8e5179a1610ef558db052fc127f26ff165eac462b0d0d64cf8dd45efd5cce8c1a72934e5ca3b98f92a13e943cf7cf0cf46c8dafca7b81ac058308111925b7eb68f2a351557241b259d4761cdb016de05d680323cd82405e18a721df50b2c4e2268adc6ae837660c081cf9c8ed00907b1797883fa715fb86b964e69032f574546064d6a0ec52e864b2218f8dc70b59755b561ae40961dbbc8bcc5e6454ecab52e8cf51db309bcb45b195fb3b10d7a73bf644ed0b7391870e71ed1c561c332d65a98b1458f8de49654aebe0d52a10ebe27208beb18b697be1dfb24f3da33ee18209dd6751f25c3a982bc7b27ae23a6c35d4d30c715601fa361b3eb09c6d563c790aa28fc113657ed4b2e54a225012a3c891e6fba2a2d919f34b0f776b43c98d3cfa4bd7c95e34adc3ca1bbc18a47188b747acd7b950be7fce2bde210ced4300d4b55fd1141972a5699502c1a22c1a1b5ad0fb2a956057973e10a7f8e58c726d61f9d8d5067278e0c613bb937e0acbab03bc6d2318cb20dd761b6a8d04485ac58cd5c0c2c6019f41676807ef52ea398968f666bd72bc56a6502f0e84ef9bdc5ee2153b00faca38872b6cf80f265591f09091cd1e600acab5e44fbf0d3fbd13c67b0fd120146ed7319122c5a37ef755ba5746de531b981ff3c799c0bfcb961921970724d1d52cb5efb0f27c2c301613400970691dc63385913b34f57fcb4ac374550ce1022264f285d4e2df8742d2277dc13b8d9ee4638492b9420f5d30129243ad9cf8469cb728245e0b550d364eb2c9d2a4936290226f2bfe23effdb408e4a0c435dae64158f4442a005001400950e4cb609b1e5e72e153d68fc5cbbf7bf3950963ca2786508b6f4d39fb3214aadf002aac6d61135f921abcd78695a849900abd2e0f0a7a86ce9f99f8ec5389438e3d6cbf93e5e02ed93a79767646f24c09706c840a81998187a651a288dd06d3184c3ba495360f0f6aaab5efcce22aa292776b5d8f8a734648ac346067a23917dd13427313d072022e9541c7b9196daf19b6013d08c8b1f30e00804121e1ace519d93224a86a39fa3860057f81fb388636fb10bb480a45658d0908e2b7716b022ca905df3469e9daaa9a82c0c97c1a9c41bc0f96fc183b4e5f69d86dae9f2b92e0929936c2f2b74c8571573b6d137cef1fa08b163781755fde574d00362581c5f1f6f3fd34209894e20728f1db885b3e606fe9ef1d0d2258e9c062d227fa56b822a9f20527a659bb09c56d102fb057895981006a0dfb568f3fa73fb81eb77d7d4ac30a12100dc930bc54c3c009ce92a186898c45e109720e368a4903b880b96ab285c6b808f43304471492620bdc2c1e2b3110cfec2a604fd31aa96684274381a776af70dc47c138e6c98ec1fc1e03ebc30f6227a892d2a40c5786b99d1c5467566ca46d91029853b442a4c312e4b847e9aed24533d84c7eea782f0f2c40d7ee7db1e05e176dd98153bc386df7d19b339b7aa4ce52f8da1b74dd06d343ef81bbc3f0979665061125f9a12d3c3904223efd6bb4d505f353f661f5fe182e47650243da35d835568a3f6039a91e95d7b0ee9a9061961ca002271ad8c1dd3ba31e4dd74924e9470b6a3448ed36b172e167d69f487102fd1230d93c792ef08fc0b8ddc60a10e7a890f5664a1f545c00e7da3a1aae5dc4834a82c1c44665ef01f21ee8b756ff633aa3c4675815ce802c6bb4410640874eac35194e88f5c436d49a3d17a258a375643ccfe4830f93b1cf50b67b6a5f3fa60f9ed5252fb09570f438f7e2e8ea3b3060c43eb82d5e123296661bfeae4e0ffa0e22d5cabe58d75e7d5b885093f6039d4f2cc5658c5e12c328769e7a3ce97748cc4b19f4753eb7dd3634b1c318ecd020ec55cb74457aa6d34f9256a8ba6cca7b020f3f631d1409a0e992436c2f81195ddfbbee34e987e1d58062e1c0001a303b56ded4eb4cd1e5691593c9bd2248d004cf2009595bb0e8101b808a101dfc1227a4c90135ce8b47e1923af891333f6eb0ba5224c60ad3890ecdc83c28b01b7a39b385a089dd6e24602e7d5afe138d15d46e90c6416fd099ba6ccd137df9cc9061e71780f31dcc9d1dd7b0288c860068252903b73c4861b7f5b137563a478ad9ebb1e0063a5673893890c89bb557320d271e6b31808a2fee191d44ba49488fd540212f810abbfd7c52208b3ce0945adcdb7f2a3641bcbbbb152643ccffaecdfaafefa5943720787f4aed052553d618642789015101d7b90375c4e1170208c476aa63fd3ba80821fdc011b9d8ba3a5b6f04109093ff101616535540357620323aceafa2b1423039084cef1c3bdd10c8d728295730b9034e2726eeafdb32b38e64933cf1c71677608c1003c759b89fb386268453b9f2685f6e7a3a275185d43fc14be4fc278408c4d055e0da1dbc8a94f9ab236c214e0f72933a8c9e65fe69c045f8b3d35806a1a25982e90bb1b11720f6b5ccae0904263a18af90c607daf7bd07a6afa701dc4cbcdbe9e443b8157e82604aa9621420933bc74fff68952004b829e451befe0c4e400b0c9beab8fe0f5442c9f0571f13081380c4f44e23a4d000dec4206e10fa77cedfb76cbcce51e6c1eb6c1db916e8f7c5de03f5f9cecdddf2c089de8db60f5d9423d359cd9443bd971c33cb79f370801738d10f2ccc461e6a400b90cdea64417e5f115c1b197484a14b23534078876cc662ba7e043c8f93fa7af33b7340a2c205759359ea59065d8af1182945c6841e71f3981915f3b19dc7a78e6b2591552866923d39c8cd7635423a0d600d03bc81e3cc9d95cdb2a1cbc7b388a8b1788cdaa0c5277b07920f06dc252b1e10c0a9682733fbd77fe44fe3587470c5435dbcfdc5edc6ae88174f73545c374a45f88d91fa15a677e40ebcb8a68a9241f52373f542fe14198a5512700084e4cdbc95e6d5c464d2b16a11d166643000421fdc793cd999221ec7e040347b34df78f27b04bedf23d07d964d0417862135ec236bfda4d241e36550c0a6808b73ce57caaa825501b4ee9c00576b9f2aeeb0211014d6a66d4adc1da0d82f76717f26f171b473659e9c1c37991dcf82ca5665678ec100d0efd8bb7c55b74154fc8e2e2a283dbc135a31a09ace2073d24163e29f78abe90a60ed79e1dcb4c776b9efa0be2651f9586dfa64b7ec04f6d7863173096033da2f9116d5b5dd82d17e05d29244c30c56004f684eb02ed7fdee1c1d2b127c32833c7e89889cac97e3a1bc3886df087203c48e61a1ad5a9e39f97757accc8ad237c286780d25e01fe56afef321132cb0ed40d5ab803aaa4112426d6628db1edc427494667dba6a49d79f4a1ef0f18233f1a50729f292eb42c31acced992b0cf4620198fefc62cbca40754ee3fc9b4c28c10c1e86f0a4084aa26d4bfd04ebad627dabadb7ba35ad658d3556b0da0a56b6de7a6b5bd15ad65803d64dee37d6002274a58fbd7256a4d719bce6a769df4605cb87a06451309d83e543a8334331084f119823a9bf4520bd02e1dc8bc4d5b5e1b35fe7bc9106933888fd1e196f3ff6b14ca996b2f285f0ee5d2ecac9c517c2d7e09d0a2130f2373ca21b70d4ba055c6f65657d1dddded10614763665bff0f2ea37aa91061ad2f8461adc68c31b6f60831ad3a8218d9f86bea0ec483ec2725df92f0ac84587b9a50e1e5fb701707852dbce1fc411fa2da820f93256fa48bb2aab929719417fae66bdb6bae87d10774c2fef0e64a121285231b39565f465d7f5dbfd3fffb1c76834ed0b3a690e070992f0c0f0c38eea01b7cf07d0f430d93d87f591b8c187c97fd0cb4f8cc6cd50bd73f37916bab08b6da439ad17dc3cbf40e91279c1575a4fb87d7e81e627aa8ede4b7781c858bff37ff77a6b6c1d1618c85da45b5b8e9a6b0b3b891c8ccb0af25f4e93b5c0004aac3b3cd3fb12f819e50422b67eb0dec126cb30a2f4f248accdd2815749c89c4e61aa4b83e74adf5fa4f78300a500e74a83feededec1f103aee35af968583ae5b31fdf157337fb1e1207d7b473740d3f01c1d5697fd6432f61ca22699a9a977af61217deed12b73919a83dd5da62e8903997e45a0cf53a3b0fa6bea24714aef3547f86c3fa0939069c687294f53f69b9146fade69432c6abdbbd0a2f66defc76c0fcd3b8ce84dbb292abdd5c5cdcdf60afacc1b874b97ae1602a2f60ac004090e7f00e560920bbb4594eff7a59f9c69751df4f76c4b0601bc04c4a936d2aa4e38c04a350acc371f9633c42cf3aacd478315ee46b8bbb561a0b6e3db1268595c6504ca8f7cb034783f646f7acc85b20e68668daf260c4fdd33ab4b050cabd204b69f4159da211a92f0c147bf8649617a12e6f307bb9a185d07b24993784f5e7747134203876cad2bf278fe3a199b952a8b421eda7244cfe9dbdd1ec67152be39fb2ce68f749a9586790331dff7455cfd1e7a641137e4ac2a83556957aa5c1488efe10f58f9d2161bd651ae7dfe1eb2db7b47696d7d215d06a5fc4d65523cdf02cd3bea126b7ddc95cdd4d1c136e51b3a5e14778b7cc4a374e05472906943bf4e883ccb245c7dff61b239b4994a2b387309ee8e8be4b2cada28d03b89dc7809835d793d3f6218cca3ec26c5107d80c4707cff6116a09ebbf013258938fe0e4fca0b6924538cf34e34243a7277496a72a16ebcd3b134782104f3227d21515e2bcd3aba4b6090f191ca08b864709bebb84ce13ba89908fffc7534b2a2c58b5e4d449db61f7e1e2c632adcc48b6e211cf895e19354a458da742c742b627529742e961f9001b82ef4ef8bd23f855df25d71a8025870b547eed5b6f29b26c180549ae3e3c53797922c680b38278b5456981797307d18d0eb02527b571da9780048b6f26efd9174d14947a2568b8410a685c33e7472a3bdad93a7c5d2cb32a0941a02452cb82eb2e29880ee4f0c16fc8dab84045da0e8dfa014d398a58d875bb40f757568983a2388be071ed7a5eb16b09dd6bd43ca97f51c8a9096e8f656a2e791ef9133713f05824c6435a353cd40c255173231ecaa43654ea6cd9df10afcd9579d73de290a4018ef75673d4ba9bedc7787acad6466339d1a832d1ccacee8135b4b7f951890a4b12d807d8d9649d26dc98635a0cc57182c87a7871fd250f3dd933fc6e885ac9cb9b19bbaa8b39095dc52def8314fce07a3c5a49d3fba3ca2c54d48820a2bc2136e3ed694042c657f31933d068f0390ce9f204ba56a068fcd1ed08132fd8e420efaa83439fa2e673bfe76044b15d98a7c5f328ffd2a678a920a3e53362cbb38d1946ee190218f9377579af11c449aff0b85ac9cd012736d2a14a940785118084484ddab957a8f2234d57d636032d90c2d87958a5f0b82a33a55380457d7f6d7515449546cf6d2c2b08d71f1932c0db6c0adce6621eccfd9e4c4197f093699bb3df99d13c9ffcde5524e36fae50353a82df7e795d47c5226658374de57a4504c9379485deb5db32eff502d7155f533175535f4dab12e5e7d6040c0f1166c4aed12be3492de054371b7e27050f65c2b107e30ca662e4f93c24d7d4542efc2015049b1c6464c0abb14ac189e34185bc5abc560ad71910be6c1ea04a3d09b70a1e2e378fa323a57034470925047470d51dc3d62fbd56d40cafffa6720885ed72d58326b5c571da87d575d77138665f4a243b13a093749019401789945d4f3fa181ff00299bbe4ffa01faa901d7a0b551c69bdba89beb9a3651cde62ccf6da83b98915308d1c28f2213db9219c9107867c9ca9a082b1902b31fe64bfb5d462c139c67d515c017ade26ea498e957fccc14fce233b7718b075f0afdd0fa13ee981d001ac04ffeba58318ab8b90c58e7570de74cbd9fe355e8cd4346c97aca4fe35fcfbba72cfbedba0ce816f01986076feeb1170d96a48238a995c815ab3555eef81cbbca74d560df6d287617656bd78e4f53d4dfedec314da729e6b35e43ebd59e8bfa74d5c3a1e1d35dfc3a1ae1bfb9313d76a7ce6efe1d410ab6922075c7fe99a50c7c5f1e76d23e690de5d0f461eb53177ae43a437f201f4b98bcd81945613c39a713feebcc10aefc90949b82ee44551e87f183d6ae150f5b49e16b1c3480836db43a9c2199d0e18f9c15ad3ac840c57ab504408e1c3f791d7d64bd0a350bce732d0aaf9f11f09ab039cd52069b0461bdfd39e9e3e4aa436f61a0ff0c3a532528043f0cddf719b59a1c6d267b67959d66bf9f289745e22e483c20f3663fafa4c54c302d11b71931dd12b09814241275c2c58e4d9197c08261a0c4202db4ee3218c4cf31f24387db3c0b3431a447db8fb5a117a46aeeff39bf89d0a627ab9cb9793d9d1b6502703fa755c7dccce0b58da3e3a2b0baed0462b30d550afbcc1f388998702044aa100e77bef37c5747adbb251f38cb9121923194d6ccd0a9a7e7399186fe5ddf16fca944d60d3000a980503ffe1c8431f641f6ae14a0e51021cdef0d9ae056cc6ee8b46284b50b2001d37cce59667f6e07b4ba1e0387cdc8aa02bee431500849c1524541ecc7d8376b410c7f9d5772cfa3a393fa21dafc4db532b3304869853a87b0511c1d7e30d2240dbc29ddf0c83bdd5eaf4312a54b4f7f1273afa5fa3dc4d1eb371f8a2f7d041024be718499c2d6240af54809ea5563b302cd03ac0decd783387fa6a25a05c6d0700b5297f3a4e3c7f60fc09468ce423fe4087faf63d83077fbea3afc66e7f92801c6b7c8058d1e91fccb68ceac91bc9dcdba6bdc7e1d5d4bdffa5581816ad775f878435ff005742b3173e8d2281f67d09c8b966351f6da36f737fb5e0ee6fc4ac3761a8439509094d3c6ae2460d33db077473fde23f532b5fd3a77321df0f7038beece57f32bb7880efb214b3856f56aa1c43b306ac0883882edee9dc8aa18d6df719e38540825a575db5d7b953c0204b15da2eb909a409a1d39cb04f8b0d744dd917c71b25b4e573907637ec11570f0b20e2aaa1d00c98bbd397085ade3821e8cce36e8ab4394a47cce761b2f4b84bd55e48680007f9201f0800f0c4731e863254506384733b644dc63b34639e6e775a13f332679bdcf313ccf06086ea8594cc4a2a97839581b9305eb69537950d59cb4a52eeb3284c0e768909ee4967b15a2ccd7b5039218fd113247d27607813a9d7a77aa4c3533e2d9e16bd910d8f0873360ee995286a7c62e841cabf3d88aa5fd76de16dc24c108c1483d873fb9af41014c2703effc2784d5cbd3c42fe10ba44a3a100fab81350104b80ce04be6a22d19685b2ca14bb58c3d08b33ef4d90c8a108067804a87842605adc8606a052070b30d039f93f3565460f0a5195843aeebc9435391dc08b33efe774fea70f170635e3ab9a59b27739e8612e48b530b00102a260c1687bdb1066fc4e37eabab31ceeb587d58ed36b4f368ef97fce05b83020a81daa4b828137202947ccfe4b4297d6c047590671bcddec9fbda7eeb932b54d21c9d2bec04a92baffe96db27768b81335a36d29158252394b98d5325ef0d501987e3628b36d4f596994c5c59971238b711ae05640c58890ef6d3df11e0db802ff99158e8f680c94e37623a0d49815076b3d5ca01a2f7fe6bdb70377c9bf77e1fd29a3fb86e6d3af24452a132b699210153edb3b931390fa9e144a01ee6fa77711117a8ca11215435fb4d830cb0fa578ffade4829bb18a8ccc34e288180ff8d7806ab24cc7335448d9a1f5c8605448edd335326e9adca59dffb46852c12527667ac13fbe53c7a327878f7d0d5e6bc4d3714150ffa82003631eeff2e2fbca1655363ef0b7c41d1a1b977f765ed1a94688c22bc240ceb0f1942aaa28ed1356c813c5928b768351497a743a4fa442a6087b5c08807c89b94241c2618f32e2e36dffa11e9fc252f646e6c16070dd7c5c5565dfbc44d2a9485b2016c9c3b6a662e99321e743832d723246083c3ee215b3013d5b6d49305e308cdebbc237f6e206cb30feb1104d44473230e15af123d089c8135a7b1bdee95df4e309c518f2094350adbeb19b1350f76cdd033a97c3954cef032c5fa25a2587142a1cabb283aaa118123bd4c3d0e3c2317bf82bb19a8fb6ceb69cda1f2e3e4416ec1146c0833b486c1bceaf647245842f1e5ebdac0c9832e0e040c8a26175df718a5a594e8ff67dee2c3087f77fd136b11200350afa8a1a9bf119cfecd045ddd98840c7d9373aefb79634fb97a947eca8a55245ea45cf2eab4c62f742afc200d14d118aa87993568c3bd9d77740fccba0dd3a393e77f23d99acd1b8c52f68bcaeb455d0fd3e172bd813e56f4f97341795676057edefb994e24b82e2ec2a81869ecb9c7112e831db7193a699b527e437d40f33fe81623d633c1a16fcb17f8653fd8df9d0e9b0a0ab4cec886242472830a3aeab89518dfd8c9206b88a7987d70813a0641e076e483ee3324e6d6dbd01cde1efe0ac769da745cdf179337c8f786962ada594da4de5db41f8e487652aa9c8b198a65f844494f791695e359640a6bc03cd69a41685ce05c82d86f857b1fa894ef1c772f49f05fa955ee9d0ec9719e5f268cfb0070f568e3cc025c6135d4ed1f31e6ac19fcfe7fdfeaad507e4820faca2808df6ef678dc1ca58ddabc66016335d3510299448ef340fa984f9b084b74b288bd8284bc54e284a6c1aeb11607df59d8260c7c1e56125ddd00534105073fdb1df8c65f247d4d161fca9c5a023ce19922fe0cf9b4622032ce1b67b4e52fe061d79b18a9762bb6f67655f5ee0e66791f294d5f404b3fb6ed5a406fb2b91d7549c9b7be827c0e83342a330898139d8e11ecf1b0318a7e02dc623a7fad06836d6ae64abb01634cf14dd49361042d0374f9dcf338eb3bf00bbfe94987186111b535ededaa2d7c55d4c6a21841052fa233f20c411bad1dc971ad32735fc076c042508669d53568eb0879a86688c51caef2ae4cc056017627276c0cada8c15214b4441f14837a29a62518dc5114d71d4a0018cf3f79aa4fc4f996c84a27e5b2583affb171b1f4fa4cd0e67ef5361627ebc46873f8befea76d936aa07715e6273b276f28ac6ee05372f48c49f2bd5c2e6525da1d1d55eed612d639289a50807dbe74416b262c2c15d3d252f2c24bfa7d4fd39310006288243aab357a68aedbd01681ce60c985f9f21d8d2df23a92d28214f2991ebabbc5cd2efc595fef59f4db9805ef5cc9d9262b1ff021a357f33db54069c2bb7fbf23fc99b82fe005e90d50f6d27bb783222405ffce1ab0ece9bcdda230ac27769302540171d37d6060ced682e6ed53c436807752b158f95c5a2222a13a8668e334c946259a5199e4cf1249114ca973c19980301544fcd4dd5e379723c49508279f43c518e7d0276c34ad7811f88815e69cb25584f79afec750ffb561a2f99cffde7ff0643ad7319b1072837f2bcbc1c03e1846b7e74de74e1f400415333010867271083946d07a218991ef1e06d4c5656c5d1bb2c7069d8150ac596b0660357700c5589d1782b90d1785f781c18eb9a17906f32e4306f934d21140a7a4431f5f3676c93f711225ee37799279e5c888f24fda3b6b8c07843189f81ba6cb8727846ff85f4a08910cbb479035d310f756462ac2f5116acd77a3147e613717ec6efac390d704af8e0e15a14a14eafa2bbd4225e06a7f218a10d7c2e9eeed3f0801eeec85b18031725f6dbd24314f18c16d5280cee338619cc56bba32e6316fd719fcd7fc12ab7a6ba7373ba7897e0bf576af332acc07cc6ab0f31b06518d85841bc0265135d497bc4242bfb39f2997121240e3d7352ed3018a8957b57576e60e5d2ea09cbe60f1dfe412cb3b380769d2463186e20178462b3c81341693e5b8f27cca8a224974b9630c08fdad04dc290596e4b5a753b9a15dd452f96b5c1470b8a73e9ef270ba2331637efd4657006206f2dac6c2e92d1884f4083c946c9c85e20429951516b66343302e08ca228d891fb6dacb3db0882f724c2c198a8222b899ccefca28f7b23b61068893260f6c293ac57b26dae9bbefcbb90a3f9ea1c71cd6e001ca8317ec2c43e5085856f2ec60890d79dc336e9f962808437a3a2a2bf2303d2b34f20f5674fbbf7bfcb28301f9a6ecefa812a0115b0a1dee3844e5b40002a01c83d447878130601e41cf24a4da647954d2bcf2f9b5a784f8c9de790be3aa785ca279baf77568a111e06c29774227adff10fd49ba76273f37714424e16b47081bce53affa032b0f6236ddad2dde8d0105ca98f785f22b8fe523766b91fa367ca67db6f3f7d0586021ee89724d03b20ce2bff4549ec3046d1ba072e3770d3e4a6df249050fe2093110c09c639b7e5ed08af8a1439a280ca5defd8e452a5c72f3a2d41195fb20ba3de3799600ddddb92b76a4965a0819cde2628a69910b16f0ce8d2a0643beb4ac71a06c8529824e8e89f2698c6daad18086edc8ad4a5ae6779455eeb80934cc3bd1df1c637568c2ff4aaea6976ecd667af9f75d4ffc9deb04053a978ad4ce9cb098de5f43b380123d4b71659df7b8d9a57e03f7bc23bc61879828c4a37df2033f5593ad74025afb41b55a081b3fda5837c358c3a8273120603a205de290554a5240eec7dc069f6880c315dad635dd3205f188766f5df7433d294a0f8621559865e0939b14d8e6c1ab2d65f91de29f1ec45060b4490dbef191ff55c83d1c5cf134590e999c0cb363e6784404b3df676399b736d0edbe303e883498cd5751bb5dd1ff5af8e386b7b970b1c0d103ef9521d67e9d98cf977161315903decba4266b8b96cfe989ef38f29f3b84a4e698526acac20e712551ea3529fdc62686df8f714a26ff9d0c93c5e6943f1fc415cb11af9f9503768fe84b4ee2fbfcb7fd1b8728eee29922654ce3e9b88322637c0b5788cf9175b06e85624051bee6c00082332ea2594987f2f412e893c10ddf990d8cfcaaf49c50e9f6dd49bcffef78ea25dfb593bd72b7c67c9e59f616cc9f00a1eb86ce20231446274931fc7a28304908a0167408858db61746dc80c2b18cda65d47c1671492750e955d61a83f2d7091382558149f834914529728394a9073d71f2d462840f3f361de1a594117b87633c784a44397a98ae1df859c641e8e31fee61daa9e14a7cd8372ce7928f9cf55a097c9f3223f93ce69a8de0172201a1cb8d9b75a4811708396000c7644cee7a6770ca6ada376a182d133ef1878b810aa89d4c0b2d61c50edf1d3017f64cabc6f5153ee7037f617ebc5327e352265bbb1c3559409cbc8865bf7f9e50363bffd2157d1d898c31c4e873c25bd04364ade9ec4101efa8bde7c03d1bebc18a440a8e6976896f1c2a15a66129d13d721f969ee8fd839c18dd467eaa63625dbe4d3e8738252ada90081424c6d1d5b7da44cb12d7e12583fc7252744e8e6480c207fb8c581105870b52fcd8f82e4458cb32ecf9813fe2a6426cc77af30e185b4102e0930518d7f6e1402efa26b9c8b494ac0b3154a663a99398072bdc2afe244ba633bb1db3f7eb7ea452e244b02da2fb14684901badf28af04fc6af6781e4c0d96f2a3ee6762d0471d590e45b3f9eec281ae959b60b52e4cb2bdc86541faed1f68bfb4aebea23670618d8905d58309d6768f0e8218467ad466a53268313b9b6ab381b96a7b09f57e3625dc83d493f68d41a083fcd36f40c2c7357e99ed610fb3dcf5a70a33d7fbf3025e34fa035c8be348cfe148b5f0be8d6d08b8795254c87b64b67cc361a26660d1b3de623698c952ad8e034ec0bfb940a175595331f7042ae9c574ca25e1504f71ff1ad9f2761c35b396b81d1b1394f10ef6f5a81d7cb790d19a7fb58543f820d769f5fbdd9a365902b7c7ccc61c392c36598324ecaf16e3db117e36560ea582a0c7717e89980995649c8d27f183690ef1fd506e3f82dd4ee6dbd184cb88a6222a9101c75c7061e7850affed1940b0ee1edf1079c596448be62b9e85151e02bf00f2ea5eb90e624af697342d3bb2f7a6d2dadb4687dfbde0976160e099ddb453b149afe1377e291acc2b13e829b8085448d8801e162182c14aca3232236f6a34c14b07b82d30a97b514147c6ad836a87c4cdf858b42feba7b602fdc1ec2edc6f256e1944a71fcc9159a063a8bc949b8bdd987fafdfb43133cc2f5bfc05270c797db375141f0d0108954295481c81345a3404ea5d282909848ca39e186002768cbac3e24bcf4e37d9fbbce1c7ae704f11af7a7386c1182813ef1d2c7a00e4f06ac78e9432d52d4e922b8851c96ef0e44db43b529ec321433b372473efc8602f99502aed86b55d9f34b806b3c5544843e2cc8cfd0831994a9af598f6e2934b9e0b0e1a79f0ef27ba513dbc90c9bd334e5380bc99b4a3c7e4bb9dbbb142c71ce81227e9f0c9d62d07c0560194441b1c27c05e1d29aa67d079800259efad056d29d70b1d0a1a05a2ee5fb670325bee8bc1b38f34a6ee8f5afb089180a1be65962bed8dc494f63877cf8918803a238f1eb140ce5112e6592f4a7557a1dccc8444b7d7dfd8c688ccd05b402015392beb760ff8fef67e4ea919b4a5e20940f42497a7f5304897375b90cbd1203035737ad8cc3101d954972818e97ace12dba89449292f4eeadda4339cd6a23260544e0ee4601a8cb5c6d2942a9284504716648fab4fd3e178db9ac03b5aea0e12d4ea58d829c76ae601ad30063e231416e19a477b91d59a67ec4111e97b68dc55180a7f41d64628371575e787c73073ffab57d1fd3f21218f03c7f05e0426f962f6c04c58ffe8c349962aef17faefdba97cd9805cf3b2b971f3d055452a5d951783f88f2a3bfb5dc9b774dd46c2d50eee3550e12f175c636708d99556e36e4e3c20cec3af49a5fd15cecd988de7344621c310ee7641e2509568293b0eb20d98be3dda5deefd6a8122636271bb938c3b04178619723f609b87d92a07ebc8d07365d6a838c4470704d917781adcbb85dabcfd9079e44a338d6c064deb35b2d74a3f4f0562c68ef04bd49fa1ab819fcb1a03684e429b4b8be4e55848b83492fe3e5545f56322bdf4ce7c62cd4e53098c740e17a5d001b9e5d81af1840586beb973dcb422866a6215781f855a1155f272e85c1f3415da4b193fb5b580b53204d9575cd2bc171de3a2081e18b893cba1650ac28fc0888c61d9b85e5db68de85d494fe77a64f3895986739b58dd52b15fd364128072b06f42d56ff2a0ae3b8f6e83b548c763dde757d4ebfc1edf5ec60a2a94914f6007b5ec2fcfcc4dab06a068ce433a192268c80aa0a6e4c484a58306aae642fc024c11d9011b115a2a371baffd624bc1fa42250f9b3f83099dc4b50a568943944425c57912555c554ac3e5a196218f22976095606cf0f438fffd69e1f07a94ba8ee6c9dd69fee6ce5aedc50620fa75b1ed54929b3f8e27ce3c56325110e68a943bc18806f390027221502a438085b9ba80319860316ac05d1a2a7b6e823b418a191e2d92c52c00742c32b3286041b3421b787881916b1267aa573f4b4341bdd195c8b7e8dbc88baac436ed16cc4e398c848c3ae239a24741d2d332df263116e5d399d48f673025daebc2ad3c09ee0495a4314baa828132bdc82f40a486226b44dd9d591b86b08265c7e442c202cc17e72e4ef9e61f02b372c90674986ec3d1be166352c26bf1cc681ea25a60b38de4274b1a1691d739a0978f422fa8d9c4ba0cb9e7862a2e77556fb57799b6c1af50a56ebc12fc351a29cebcaf092fffff02cd2736e07fda702d53f533859b7da9f3fd01967b04732955f3fba09a1c07a3da0fb5ff99bbf6d3f3f4299e3c6a103845b8b0869044d80a6033b67931cc1ff5d7921dca62871fb78a1313c99859089b26de04feff31cc107362f911f730e7b5a998eeeded339a35ac0faf0994bb0595d19d87feb5c2ffd683304cbef400a42aed6ecc30d1a312a68080d39896e1a5cfa9adfc50a281e8ae400712baaa12310b0bdd0c71e9f0d93df8f2bfb69e497cab2c3dfe4753d9a5c2ea1525822e3bc3d3406553df2847eef4e8b92275bbbb0e84a716f8c6b7fb608d998c384d9d81bfbf23dc6d7513253f0db04bd1c37ed32b9c80a43038377ececbded71e91caf3c3bd035a6e751d414fe61cdbdbc4527f194f00d610add3e399fefb178f374ad2e967f95d9bfc7784654fd3d19b57979d4dea42d9aeb1cc2a50e5c52c486729a326f265f5552ebf06b4724003a70c90bab151a5c61f6026823e5174cee83bd86ad9e38dfd40f1060f7eb3c724e38afbd2e200c3dc6ff7ecbaf02296abca6e14c9d1c20263fc353b8295a340e4b6b59c30f352e499ef67acedd236a3cf17db59fef3117cc7992e6ee7e44c8795d446cdafd6f719821ef84809ebd7e527845f905c6217843affb24128ccdf00c310285373fc4f468706835421252eafcf15382c8c2fab1cb0dce480437c1d1537ff11ce21efe6aed8ef615938e0a90d4a050f06d0617122366cd2ef8843f12852bd4ebd7a20e7a09f886d5d7a6543b0557c3929670b98fc0f797e5ef844f2489c37a2e95261464d3aca3fd39fde3a63c0b5afb06ef61efd3a2773edea207ac061786933442c3db4e0d9d21362564aa9240141ff67573216db883426fc8809950fe8d650743a1499d0fb5fb085ce3e5b6cf2de4c0bba490bb702a16f5c9eadd6e01160274c31bc7ec739283e5cbb3b25e3cec98940fcfa7ec7e2b1737bb80edee986f4679d3b0fcabe600bd6c9a96b53b4d62b5aeaa46992f0534b5b53806a2f9f01336d21d3d8c76f2f1fc492d3f1b1002963775113dd06506ae8540d05bfa438f7cd6bd214c88b59d86b291bc2f5ceddd5dabbad9e86eae6504ccf9f72b145912e8899dfe1249146ec16c4e62000781cdd267a15f5e1ea47edff28d53ff3c5872b189b8bcba9a63015c07ddf7fff9ef28b4f4c4492cdf92b011a3343a14e09b0c127f2e5b107e6aa79074c85d47f97c1e4cd6903c15373da296513114043e65eb5fbb0a8b0f40ce567e32a745070e69b24c03cfdb0d4b4954c47eba0e2d535bb07329e0cf4a77ed871a014ee041f5623818ee25a7d42d8dc9f9d2a5a047a54d26d59eeb17f1793a4412dff56908b8f61feff89ed1fc64dea9fd9ec059019cb6516cb0e0622d5d9c7d81e118984a1f2d3900e97d494fd5c4635ea14f58c366d6b3772986ab319ced3625b1200028a02a15c4ec6fd190c66428a1789a50850bdef9ba25252c43e8324a3503a1b8d028f79ad22a6cc6a990e786cfab04e5297ce00f57854d1086eb80fb7c8274d53a836b1267316f1dad8e418ee0029ab994b0d9da000fd24034212409423050c8d2bd399108b74b7e30427b9678f88d230229b76eb0231c1d368ac845bf03a840ac0dfeeb2632eda9697d0bbce5d8cc1ce3b79ab5b022f47b696960ad7b9cac16d1653c3a37d5290dc945a7bf901ec80f4964d561814979644f69cc0e00e4201c71f0b02262183cc27d51f960f096849419510d3cdac35548b99a2545d7a476aab3a90ebb7d00a0f39c234c892970ff8d607692e19154f47e14a2e57dc8ea087c5c417493b41b3c5c3810087c82bf2c4f6eb8ec4035deb94906ff18d9f8c71c126d2dce1c62866141fd17c81fbaf94280602490311585b940ae2515a2f98b7e01bc4ceb01a62b70610f7e43025791e03a917a4fcc17b65e24214deaded3e84b4f39be16b39214c38ec409f74bede8b44311d897083e8e7c36a6fc94268c7f53bbffb32370cc21f3bb0063a7048a5c8372bb7502f9130cefff31e4a1e506193be415f13e7a31e47fc69dbc4b5122e3707cdf212b0a0e103fb4facb85e58c1fe164a06fedf54a3a7aec4dd932eda67650dc632127d5a63e54617f377869ababd980b757928647b9ac0b9cdd7b3cf257ccaab1e3b407d6e0cfd2bdb6b5027ceb051ca86a54654e619924b7b6f148366baaa6b3af78bf4c14789148c2b671784f65e1cd7faa7a4177cc44506e14ebfd415a4ea0cea2fb9801df7d3f265117cf1c6784ed5c34df19b28f5bb1ecf7c53ba667b050ceec4851a172ab5c4c4c98bcdbe24f52cc69f222f62b880073e2f5c57330b2b41f5086deb51424c3d7426232040397e0558204c8a6e4242aef5521951c9d8246f6addf2ca4b25f63bbc595889c3f1f707ef806748e0cabcf3cab21cc17f06d4afa1ba8b42b25d252435bb9e008a9791c5e047559041905d91a2cd18b9d1c9ccd8296123b032f55fca7ee389e40fc1286836ff54fd22a0affa3b42b06ff2d2c2f713c304d26c15472d6743dbd8e24f29cc432130a9c8c623e66a62a6de96ee998c6b8d55097c63f246e74f75df9b97bd3bc9007b1bbf6abcc212f27c78f2fdcecc6bf402405e671c2e21733c02a2be1f5d961aeb9c2e8efc506c0e424831fb04c7c4e8607caad5a691f712e837a7447b68ea10f1a18e37542251da007bb8630da60a2cf50d7e25a2fa74277f6d89d4470c07086a231dfae19bacbc27e7124beea8bca8f1c6d76c0aa52d9144e2bce40710dac7f629d08be218ca833e57dd64a052298e73e632280376dff7b1fd918b2dfd130cc07330c54ff406e4c420805eae57a55b352c6bc59e0a4ac872a0669f0c64c99fb7b32fcf4497606b38c120ec8fb01bcb171ff75dd9a170b17ca39b33dec8000da454032cc559008bc85f752b2857362fece307870dd76672e56cd5db0631e01f866691618b67b723d3254c8d05481ecc384165e0271d5938a15f0e7562e45c13a685191f55f8a547c7398c0ab64b0e2d1184015e3dfba3d9888b2593676c356f0e2d791589c95128b5cd1e812296b89198d29cf842dc402b4aecc2f9bf3b04f813ce7c7e0c240d8922d30712d3747b9d51b2eb2b85c5a6799dcad3772b0d71bdb2c670369ab503888824b8b1bc6627112b656783da92c1c019222baa0a047f7c6c05777524c52e575e44da8e2ceea586c4bc837e6ea59be6125bcf946060cce37e241df10091b0be31f5cb1ef19d33762e5597d831af1f50d8d0bb36ff4b37d83f8532e41a7b96ffc73e82568883dde3762f100bfb1189f49c8073191ad65681e3d667fb484c120885c923fdc795e4cc43aa40cacd712bf91827acd407ee3168e88f27d8a575798df2820a9a0eddf4ccdeb37b27e0ed0872d82f3c4b5037997b35c9af80679edda372c6f49914e074ee788ddcd89d56f0d7732ac7f1bf6703e0f3ae1c2dbfa850eee63031a3c581b5610adb299612cfaec9b160d2bea284adc52d5be476875f8a1da439171afe3c41bc14d20ed4298af57dff880d39d8c199995f4d241e980f66650a8827d6800026247251c94dbb33f1233559ce8c5e3fe8cbb8f788604191597c4504bd649c6b2de5d38c8994124df6a88f8410558d7032c2742852d74e4847aa95507fe0b81c91640e6a5e378d65d9b780aca69187630988bc803104672c87829fdc7b8ef054b32af4c06102a34ffb7a381aa3a6cb49bb8456d37a2762d471f438bfc96a97ad1801be83c4da92b7c69d2c07b571d2d61b95d125d904afc23707949694e7a56250aee9139cd29c9c47c6b740eadbb3d96cb40a0c475175ab79905a36df99d76722b335086f13bb010ee7f010c6355241ee631c96173bdee3f28b913050e5bd97d4391bd7eabe7cceb3e9260accb88ed38f3f050b09bf27dece3ff5466bfd0fb5e0524efca1abe7fdcefd5df1bb01a414226cf38f785868c8c8c7cd494d916ad7ace657525081d3b1107e216b86fe9b7c390c56c8a3f743667a98c67abb99d643963056402f6a3126433b3b1d51d7ecc54c8e02870dd08a9dd0e0bf5e7b7d7cb3cd25ea08c608089d28c5344699ebfb41011f1aca4096919f219e396b8eb9ac12343c9a6d20c1c5e0fc84b6d7a32229c180e66dea49b5eeab1100266b5139e6687905dde328e18f02666b20ae0211a6ddb2e2eb951e2c53052ed277dc2d1e42aac5b3c708995c03f687e3e19c7bcf2652422aa2e4def23e37f68efb8fed829fae40fa1e714f41c5161bac8446f56dd01a986ef6589e73b005b398caead0ab6dcdf6287e8ee6587d5c1a0f5f65ccf89815ee7c1eabcda690629a4d5c26f5280831332d977e690d40650e96a622496465b4b201a46180b7ee7ae8d6099618c58447d46bfb0fbb1f1ff2165382caab9bb4090bf23a98719aa7e412d08d160a23abbea1b0adcd056927f12c2f45bcd4cd845f7ba5d48b6dea48162f6db3295faddf36b7ea98a39da1f72128a4e2a902f0ef685cd73b7b7307e10a6fc2e50f921d396018bf96a038e6877e05ad1b8e22857a1c0c0e228d7911746ab4872ec2d1b76b5b509013f2a06833758fce79df89d516eeb28040861c083ba61681efc19f0d65330a6abd454ec52bb26bcb5c5462505dd6014200bfaf784e6db8e0e7bde7a2b8fab6b5001fcf8846b25d3433da05dd9db63ca4867a64a83f9baf5a5ac8dd09a351aaaed2e30f3ff71051bda8ee5c66e5746e218d9e9dcd603fec71ec577dfcd747bff4fcec8a88295600d89807a1216d9859a3cf61d344b74bf62a535fe1bc4a20bc3989c8163213d8466aad8660bead3f288030b8d7251985ca3ee8c6140089feadee5b312758cbcba7e5d836b369de1c4a460a06c8c5e6011a7bc39e53230ec04302431477fb0f42697a56cec473be8cfa96439dd081b9cdfd440b6da43a4da0371d7a0085bb001c7018080504b5a942c44b44dcd17a47530fc5bab6f02c52299e6bf14082f2cbdb58466a7f318a6a1718b32d329458aa3b70769ad69025e45eb282412413f63d7f0272e90f4485791f3b3035381626fb847c10bc94a779c1e372c019c78ebd674f4fd95404342dcba8cc0578731ec1f6b05805d87335ba4eff02125b01f91c2dc24ebd54608f3a6e8010717a5398b227d2ae5422b1985a7b4a48cce274d3d035d558e3cd1298ff87c2a2948416be065b2660ba6400c0d3a9d720b8ce78394edc9b98bb4074790be20d6e5080f31d970c0b786bf0d6308dce7f05c6c6b4837ba7dd46c58c7d61beacd407397dabb791bdaa316ad21104395e36ccfc4c09eb98e1fed343107f766c622a6088746d0ec3943a9da3de224ce65e8e920527a78dced5711b1bf0eaade5a549da20d04d0abcdb322959eaa1b5abc028107dea63f52c29508450ad4946989f7e5f89e2fcadc4f1185443d0a87eac7010caffbcdb54b8bbbd531e9eb4ac00ad5d66af17e6b63fd2ad061b373440093d93c2e07a0e9292f5667c9bf62b74c5684de263a2222c040b3bbcd3e6413797dfd771bc584312929bcec0db720a75cd01527daa05bb5f9c60503bc23b2c0a490e01cfb0e015263e25071e306d98d8fada630ae6eb57b87745a4db8433383098277c40f3b536f38a5cf40c6c19dbe1e20c9d3677c4bbf984059a0ce8eeaab8cccf95a8211268005f0cfc03b4a371b432790f06edcc28b13b2a63f88be35cd15820e7e81a636f6b69a960b764d5b862b84e4a12434c9c0b6bab6730737c5e9baa6038e65a0f8d44967ac48a5491a09608fdfa0e884c7cfebda84919587a532a6fb5a730a8e5362583cabd75a466e180d86a3d7db20c531b06cddda08af13098606077c5e934104e03eb28a00c2657c1d018f2dc4004eab0c3447a082676476bccecc976095d5d566d078be1429b65124d074ea250094688e12f6b29487efbbe44c9f9cd699e5379c55db09aa2292a28619e48c038c7100f1481fbf6ac54594766d0c796611ea1b7d0d6ae33b465391a71c09dcb7e5fa3494c0ca459eee1881e357bbd9e78f23770631a6258bb26e90749c859d0cc1365dd0d9ea1d9c1347d641a5b857dd377d56df917aaa4cd16f43e9827786aa0208fee4c736c53cc48e283d57a99a6b684377c4a2c9254a73f598036bc54483ede292ea72726b81112a6e570c6736acf96059606eedd753c14cc647f66535878ecb21e5ab71ad094f7c0be56300601014004c5a318c5b044276a2533e2d0aa4f7ed00c538d3b03db61c87e22dbecd84b17e512096999563ff190299d1ad2d7b5142c132d953894702d6a54f62a3668457d4a4577648dbe0411701799dc168e08f64a403e0b1b10230559a64352aebb8d46ab38f930ac01c2b3d0b4341dbe5df0b3229d0f257742f74d2a1d307f2f2cda34d6cd2e5750bda0cbb68b9ad1b2d4b59c179081989580c6ee9d2b965722ac0d5236eeaef7eabb2c557b94ae1e8ef92a123bf0f397c96dec2ee90281ec0fdf9308b6524c88c474c8c14e9cee016eafd6749e5b8850c0cd256fd61d873a3c46cd0e8ad331da71401b919fa33fa536b1176e97d9fb54ea0e0943aad6be9de143d92a454f8d085645e60313722d515bcc2e90a194c5c04ef97482732cf1bbc3af0f362d86bad2e6f0e60f92cc2f63c6b27381234a88d0e3be489b75d0bf725356b4f91e8f25a024c008b35975b16c3331c41c4be0a1fc24f5d45a1f8961af668987140ecfa1eef0b23dc66609217d9a7dafe5ab75061350049666f2c132cd193e0cb7f965bfcb83b8a84a3349d8b0b8e34d6e5794c075dcb70d81e51a88c66f14f973d9bb592980d0f3afb8bfc55c9dbd58b8c26c82267c83156d3e7439fa1af0b86dbdf76fedcc22e32dc1d9841ff282f83952be1cddd2987c971616d9c3b7185d550dddf9ead0cf59b2f853419582947a8b9fa62572593973b578cc25e7cc64bf727d7a3ecdaa49e0fe03fef9662f231996ff80028d6ec3915e27512578d083516c53be09c295516ca12c07a8e63cbec023d102d9afe978c23e4b9e0de5bc440a9aeff141c24315f94945e425d50b50cc54d73330fd9b3a414234199689a6c4598e49a354c4af4038eb644a766e023e20b9643afdcef44be0d648ad36b3229967525a2dfa1a08f02be16c3906f69cac2232061127ba6dc33b3f4bb94d23913ef9c13f87e79eda3d2c5042dc5dd2980e69559f8d1978acef56d75ab2b9beed636ee9a94e1c847c6691d6744fb3609729a514c245d992302ca6d86151d860d9ebb87249040102491b68a54500c6d4be4f1091f008e463bbc3071d111edf93e89832ae82b9f22a576a0f0d45b0ce982ad388290210aa37f10909c9203c2da8000f95c59d3eb3698bb51ff663d831924714121dec2cdbcd38b10f2520477f9149cafee5009867605890331615a9cba3bf17264a9cce80ae469a09882a3a13a724bdcf4d84dd1b8eff5f41433f86829a045f102d75479164d0d048e25416e9108de2386cbd9ff700d6881057091632283abadaaf526720073e9c973cbe47b472e71023a4c0cc5445854b3f35916e933970e3e98a01aae40e8005216465fe94ba65e4f01356c0eb6174d5393bea1cc0a3d08760f39ae66ba385280a497ba9d7590cbc6ea30fd0531121f94ba60585a94e2f3112557c8b8d9d2471ecd4a20af102db1e216e21e56006c28a34e450b678260d92680dd8b6a3ff8ed505c35ec37ccf92c20438692ef7fda78fbd0a591281c519a140734ab8f5a1c4a058c7f1903101efa9ca1818b247652f2661b17494c24b1a1908aba95329d8603bd4503c83f8a6c64b010a4aa8163809e052b7796a98cb3bb8ca7e177180a4eba545e9679702c4c63702635e35eb0c960209c7e40dd4db93b0b598b5203c737a14ea4a961e4763b1b9bd3d0b3c817f496131c51ddb29fa4ca92ce64f580f350d9d9a57df55df7779668021c16f3494dc0f81fa0d62c29a275f6aed18100ea66c57508aef6774a04bccd8af90dd50443b05267a71196d1e206015ff69c7b60860d6330604eb3238ef319383452cefb870021399478a2f131f579ad5c23e6bb140af01d8731aea67d1a8070091d61d94996680cfec887ede44e89ad09daf7a8613833eb26337564467ff36377fa2b9bcc8b660c2c4c9f64ac65e63cd05982efd31830e0051432e1596cacb131abc40860f2887201e4b10429ad30b92942017906f958a9912fa512f3e8131b51e6c008fb72d1b0d4493204311d4063ddffc4051081ce11345e772c7857b9be687a48a134571eed2367efc8fc8d370e6e99a863436263f376a7c44e696dbb98497263ee1fa7df381a63b8c2ca25fd8ad811ace83c6f99c3a9211b0d27abc7186fbac1700972c5578f4621cfd3fa1fc8a176e5c784fd9285ca8dce3f3e5b365c96ce61c4a14ba337dbd6debcabd91d0cba399d840e1804a2cbfc2ad4cb9d2237a9571837b5a9307442632352a3b032d9b99fe554bf6a262b0577101d81e05c9f4ea081dcefd6894b844288f19e37e9da7a3d6ba17d4674e2c6606f6257791859319314140aec0034a2d2a2f98d67b6481148d283788df47dbd8dac0d661754efd8cafd31477c95a639c5a46d0aae6190af13a13fc13cadc4d14e8f3000fdf136f82d711d8eb8d6026b53ab44453cceb6a2f8f7e9cd0385a596faf8d74d85b0a024ae7b42e921987e2114776a7d442632453f94d5da4c75bf5336f2bb65fbd0196e3325ea0b8a2ecd0522b338d607e4d711db3bca424d9d23849daebe5fbb6b56bb29dd70a416167471b58b52bed2b6288af12bd21e476f147630a8c2556ed693f5c838fb040a87304160fab67dc3ebe073867f10f1dbaad2a40ac0f48c3102f4b962f615c11935cf076bd2abae1dcc9cc4f73eef2a1eaf2ff947a532de78ea55707ee2d6808190a3d90b4a617a13964ba96fdaf17ea8c568a0cac69f7dca46de090e22b3e9df64ef30ede27aa7c9b48b15c8450663bb56f37c013d7a02db1f9dea9b96faf9499623e52a23ece90abcc0c483bff1970c0e1a911584eb4bc2fa102b34122aaa3e385705a3b012e1165b14e9d0ecb5782cc18fc6b1ad1f836f5b99416dc57601b15c7d8ade24a64554ba60da9b5648841d880295f07bfc2ef0b28356ee0e1e5c7d4d38ec98c4bb3d2176d00b4f110d7e776fbc14a766c9bd73fd1ef428fd1171485b7a1971a5e757eebc939f4078adc75509587508e3eea64d1c3df209a06ee884fd431a61ab812ac8ca268bf95f544854bfeaf322b6205471e353a6b260a47fa989acb46c2e5049e17aa0c1ede97b2cf73619ff5206bb0103f0923a18d395aa8b2f888baf1532a8db807051ad1382ac2ac7d718880558a852dd895738e7bccfa97a564def026a3270ddf42b4e2875ca939d284273ad0b5dc68d8267d2512daa697a976b5e1d66f81f36edb7fda77899ec0a65385d2a28eaa68f7a456946b1f7574fc8704383be32cefbbf2bb4bb70587743fff0fc9705c0ee8ccac1329efac8d2fdc447507cb1cd3ebc4bb74304859cdaf3107a28cb959e3234fc1c62064577c78687f118005a083c43a87bf9d3ab6e26e1bae52185802f6e80301f878eafca83fd596ddf81d9ea00eeaaa642d75c665cd40f6e15883e00845da9c5f6ad3e571608889e5cab24caaf7f265a815ccd3905872c6977ad5186da050fb9a1657c34a6294f93b0b59d6f77c236314948ca59e0a6f988a2b82069a5f85e86321cc03ec30244577c16292bebdbf6ea25f0fde3c215664e952074b8577839106f55a30dfb1722a1104bb5bc17602233ae7361f9467ca1fe9969bfc1dab9fbfbc3432b5bc74d1e79fcf832ceddb2c29e6b20e30af4f700d0843de9f7e7618025b5ada09c8dff7cb81e7a196d6b8ce299812e92da8de4b4704c7cbf8fff46376ee0077ce018146c23c7e1e45d3ae87dab3e63b451168bd6472c73b470a5d53a0f49a136b2281feae11a39a30a38e19195b4e83a0bb238daf1d3dd7834cfffc8af65d51334f254781d6f946675c2f192dcc8218fa85e49a20e24dfd9784ccc7b840b1b38c360a9c10b44bdaa9a7824473205f1601be6c5a02b75166d6b4498c5e52c0390bad06e7f1bc49c40e489437db05690e28dc843dfcfaf6a06aaa6e64ca4b1e02c9ba5dd0913acca1709593e66d3165309d1032c088e4871ed769ab6d80455c6284f6351fd031bb32e04b3caf5ea2f16bace3853b26301f25a7d28d1a1a0fee9b4b3b3cf91c64bd5b0af3c78cdc4f0a3938e5673ee680abfd1d29c891a003c3111a6b17d98468ae3597a1fc743173b9d8981288c196a58ba13e89d3e61e000613dce6097f224a53504b8c5b361166e047d36d32c2658d7b1967725870d76c17a2173fb0549bd9c58ec5fdd21a5bc6736502c2381e94cdb005f249d79521a627f1c807cce930cf351cb4d18c2269ac0874ea6174ed17a0ac4b4db8c06dcc738680f1048d82fa49f82288dd25205b20b9c1f826903f37a10a2d159df7bb32ca678b6f42e551f019ade5e7d0227464ce37e849bb1673c02e0789464044013efdf303c4cfa60f92b2b16a98b1e14fa014c2b244cc605f4cdcdfa5981e85725fdee41ee352fb1129439b227a35006f3a5695e08bd19f7df9ed9b63b4896fd09e6a4093ee9a191b9d662365c81e9fefdfb22a04b643507056e1bfb9f9f71aacd4aff8ec46bf214105e7d870b788cd065efe2d895410533cc46f92ebc3b4837c6a9c32166f476ad28dbc53145fe7b0140fae918f1c86c0d20fff2b4d1b514da8a584d0b590a38e553bc1f769d9c5b9367a62617d30c6abcdb85929083997ecbb35a7604a70ca2fe0f2c32d973708724ef5857001ee3bed4aaa69828e4d84569563b55efac6604b12e1349aeb50c5f103bedd3b6856b3b5517b792ab87dc6ad8abdbcc0b9359f80dbcdf906bebd5e3acfa946097617ec7d3004dc574dc53d484a8b6ead0ea55dbf2ebc569276811fe7fb6328f96118bfc471438b6b3a8437b922365f67b8b7ce17538ed7c3ef018f8429a54c6ddc596a904f4129ff0c427863c8f17fee24621012ffdd6590c9f16241d5cf56608077b65a64f96b5bf1f3564d135c4c01cdb80d65f83799797e1077d0ec7d962b9205a570bbe2d2cae596d3e2050621b084f1ff76ec279f5042cc88963eeef3d7e1c4af7a0bfa7287a8a4b1a0caca643a680bd665f9b849b78a13c434a7c5ec39d0fd873ccbd4ea1b26ef869192fba25d99fcef0969c8c68b9b7b0658667b24056e474646b18c4abc28832f64ec36b9801e37c10924fc6c87e1ff97831d0ae24afd97f2624b68f681163ff320c108b11725d1bfa4c97b1fabfe2608c9f0923f4636192acbbb61ac85d3e7401715e31c1b22b1a729651ee50c45bf22441c062cd9586daffc4ea63e6d4085691280f1dda53143ab498a06aa630ce637dbb0f8d11ec5a6b7043c8769f8e9bac7ca3de667ae7692e976950e497188e31e724078e27e7ae03cb4e9dc154f80501893c73d451b8a92738462fe021064f0d114baa9a2f7367137bd521d5b5475afd3aead6da3646a89518d19fd1b0a1c0a38fe68cfec33a92a4ae6beac0e9b8c833d6844d0881298c1081b70427b5f0bd2f219a3e8273fcd92a8967497b15edec4f59e377c5f932bba22ee43dd4761f69b34476730f4df0de16b717f3fc650b9471034dd2b2b586541815cbaaf1b617f297a1054ca6ad840b4096531fc5cf7ba00cd16372843dc7cba8ee904fd7bca743abe7fad530413429166ce95e8db6639eab91c07a7c8a43c3ca8fcb7748331182c9067db57160766629b706e6ec7179c0ada1f8b1d841db5a0a792bf2f29e35fa410206d606e58282eeec8809976c7769a100d37df64b4409248922623f017fdeaa140015192bb7af6a048195056664c264ca05ecc62485b6f797da742a2036c2d2464464025f4ba0b7c40d4247e5f202e68045f3b15b3dc63a37284d3f585b5ccdd301208cac6221fed03c9b10470a999549fd701fd47726d88ee8fae4398c840801e5268685b2f37df56893da90fa660ca130f2bc691d1fea9444cbef1af0d97594fd7575fc534f6a16b41cf971c04337adf2a125a9e0987f5c2939b46402b63cf74f1e05cbbef3331f5adcfa7ff960171bcbd08d0e2325120e06526e3df11dc835193212c7f14c900c09a4d53064f6e2009747e62aa3837d74c25c594c1764b198da279571c1ebd8024137849441ea52160d3660f434450c1fd23e521930559842a4cede53e63a3b432ebc6ed7b1dad2eb9a6f635feeb1b3f0ae3af5ca6a0eafa3f28800ea48701683c64e03fa4ef5ec4403eddc362d94d13c1943835cf41a5468545d5e147e0a5aad1710a5de60ed004ec4cc7989f0ec6cf4b02942a83e0d50a064669750d95e550ac9e34ae4d0a09b7e620b49cbbb5c1ffb93739306dc8e176b3503b12fe79c6c5f5c1dfa8334384149550c2f8a994c283a59f4dd07595f06d3e882ad6d6b8890474474e96ad0d28381f0861ac4873637ddb38b375957e0e2f9993bba72f55493049e585f48c9193e2c5df0c0f3bd65a48120caf81b96d0ce6efc7b68f90730d1105c259c37ba2ba9cd4f33d0be2cdf6171040004bdd9457909ea8f3a64caba4763e3f9063301452bf56a035da44e3cfe663af801b470a56a1be6223af8224afdc1a9f10d902fa15f4a50503a24df89a5905870338b89f8748c95d7d6c107df213406fcc003fe105def0358a79480c4c7685ce0cf90f629594bed2ed364170d51ce047288625af755486e0ea0524ca2a8ae8d3e312e53cc55bb4a0c9a6d75b804a5ead4998f0cf326b7e8994f3e501a43aa807614d21cb5538613b9dee6412904f62cd6875764ab9242a5c5d08dcfca6071a0c23d796e6fdf5c41c5aa75600423a925ae921f9638253884284a3f0091957e38d195f660c428e910c456caa18954f28189a8748710034a3039040e8e54fff0bf704f2b4e33430ce41c37fbfd1c6e5f8a8e7ed5cc64f39d7d1db87a75203ac0745427921c7c6351f764fe522b8491a2651884a947b302d0ffa6222439664b9a7e5a2dc1fe0206eb38327eb3f5fcd481ba63f738898ffa68a0f7ee6d7ef6a6bf14fc0e994d64b5f8bfbff2d7c961e4615264d039c3d7a71af68004def4233066d8ba75cd4b43a2b10d6a55e3447bb6fe62f98bb6bcfea53b8e9eb65d8d46a4bbc1f028dd4706d85ad3b1d2b862327a0763c7c3f7b92033c11980df708392f2d74c9d23457aa9acd7d7cc74d579cc3ab38fe87aacd23a67ffedc176347fdd755e5bea0440942ea2690085e9a53a3cbece3bf49b23e9c945c1e0e793b95fc64a7111f208e9df5575ce21768dd33c52659eab9a2e8302ca503c5de70894d387e499aaaa7369cc918a7cffade0ea433e87b6b4bf04ceb3c5ae114b1080489336fc7f4f5afff5d5d6dfee2a0911e5f0f25fe5d572f44dcf2c3e6a04298d90d68eda4aaedc74a80303411b5005204c0328c7f63f12d9ddddddee3fd0f4adfeeb62e63eecffb71d061568110a101008ad710cd01aa7733d15cbf399a2723d86022b6e2829dad15abb9e0a13791b1a221cb10dccba5e0a9063198537f5c13a109b3cd14962b9d80118babc8955492608c30c5a03815c680de6b2604630438e485809900d7acc92606e3cc3a8fd54282ad708b3e9b821ae05adb505b48e8b829be3cdb781d1ebe29df1b60085803e628edc2195702f4c50a00922d2e07143848448838d6be1435c830e54d891862c3a46a0210d2e68562669cf14565152e6fa72db3a40a4d6da1c601c758044698dd303481d80d8a0354e0180fca1350e01609eb4c621009005748000d13a48dc78c1031cc8f0d2c68b13ccf0628b2a5e402ffa054aeb2071e325e6c5dd540efacf45bd0c397259d30485465756fe27120c554482c17eb4d11a670041c8d891f41283012a1d0cc4fc585959c130b0466b1c2132c069ad71e088f4a28f6020cab31ff2638d1f69747e883a3f3e4d7e28d13a48dcf871801f3d7ce0c1871d1c34b8d13a48dce8f830636565a5e3238cd67ca8a07590b8d1f181c4c74cc7474c0bf967d8053ef497d62e39767df621181a1ae906ff63199529101ed1d060af2b0749371ea26249d8f5a211268140a32d61fec1286c04b22ae985e669aa2624981bd0078a4b34180d12124683c10081f1212121651a098834b9940149246540ca0e1a89a8ca43d848576e238dac9b8c7a2932eca240a32d02fde7c8cdc6560661aaa61a6d695b924b120c8daea81094aca29448301890a770c8e28094619648b280f45713e9081aeb6383b5bfa6a101511e44c9b63e7914c24e24182ad40bcc1134196635918e68224dd86b4b4946493fc5a778f618657303f251966ff0ebd053b194542320d7684b18354482a1a971e9fa5df3208a0a7589aa916463d1d0542f05d695bfc06412cd8fea41301990aa07c17cc82b1f1206a4cf6e825cdf2403938346a1cbdafaba8afcb5ff937dc8abfc22ecaf4c7ab264890f26344f32aa1a8da42a5f535157f68446bac115057303d2d553d70e79f595057229db0fb2324982a1c12e23f45fd6a67e7c321bebaa01f218e8a5eba97ce61f1be9b28610912af7414323b9948daccbb2b27d24a3b285612e656e81f0e70969a2f1609475bd1498c841202b63d4278f347601504d4561365f5554a88864f39564f3150dcd8c74037a2a5446697d84b24436d6654922919549180d06722a9825ba46a25cd55018cd4da6c9886891a4310986465334213d7359efd20dd6d2936992c954e6d913097349349a625949a6094a8c0ccc8806cba8101109e6da169090e59abac1379553550d05935d2e02a2af90750302400700e0dee041068f252e7b7011c3250c97232e4ab4d801803680e8622600433a015801220801784200ae0e00ee10a28a104908c00e0194d111000c043044003041c8118409827801c842003c50803414008e026451001114200304f002014640801721a220c40cb83000d6e9483d469d1e71e8f440d2038e1e3c3880053a3da018a003066042c7039dce110738c01807b03a076862002e18c0006b7486b06200520620071044047abcf4e80c510421ccc0e38701e2e80ce105029818828d0e025480002a3a0980a293800b7412a080041c61080d20a00a9d0454c180333060059d05d060014ccc41016128808a02987486f04302e660401c1cb007078cd1618009180064016e38804ac701106880141a206a80918e0282e804d1800e112e444c1d085852e7015740d23a0fa8e2014f3c40011d22c8d021a2051d2294e844208e4e04cae84440b7d694689d0850a003012f742070461459e81441844e115f748af8748a60a253c4033a12b0424702553a1260220123121d3a921c1dc9041dc93b457ca1082d7428d0050a40a143014d81017426304567021ae84c60029d22d0d043060065740070c5055ac70227e80c608ed61a94d61940161d0bb8058298801e5a6b4fb4ce047250013f742a908512742a307528f0871eb1c7055e1085132d5258f840470358ba60494247065a6b6d050d2b68d0a1446765080e1b7430e97088e834299e4e6ba1e3037fe8e20f4498c00f5188811f86a041077d28411f28408710f8e0061fc4a0e30852e8b8426badf1610f7ca0c30b3ea0a30c7b90b287173ae8d043177a9062e4610836f000050f420cd15a6b77f0c11d741a16600737ec20461a88b0831075f0411a26508721e8c0461a8c68adb5cbba01bd6052bc545448bbf472fd08c3a8907f56e395ff078af5b1915eac8f4d4603a335100c735096409685ed280a29db8351d20b06f210955f4b2f200b876e30e9e5250a295214525e34e58142cafe31e3438a424abe66f491235148915ea4174df399d73ce8358d44437393611945a32928a4d0d4549f8d307569ff48987fb21d146876b4618711ecf0c0025a0f371c718310202120770310dce0fa67dce08526e48e20eea0b27f728775071943a470071daa97c2ba8a4ca035fd36fe81f206286f30c1f5950d9337f420e40fe50d76b416040e15c0ed081c6660471d9a7e3b86b0a3d5b10627d4e18330eac8a28e2a3deaf8d4415347933a8cd421d531441d42d4d1f0d0063bd000471b6b28010d1f88d161a20161b441056da8a24a942443da1023db30441b8068435b031bc8c00638d8e00436a4616325a142d737b1963cd6447504c3becaa827b407b1aee7404529b99a584b94680f5235d11a470037d69561afb38a0a55d708dbf8277b29feaf6de39f4c447db0eb2b1b2be49f79b2c7b2c73c20077dae3c7bf453f17082008213000e101c007078dcc171e1b470585a3aa30c66e451d054142589b0cca59aca0249984b20ff4b9a9160a2a0c15eb2329b286868a048e2e69f90601ef4368ef96565210b936a5cb230904b1805f2ece5e5f2d7a0a73cc316755d9e3fdb2ee9a7e298a42bd7afdd028da88a92ae17613092cd2fb1f9647f695b973f284b8f3dfb1b290381a80c93fe6a428271e9b2b6a7b268b025bd8d8465d95b4344bbaaa89ab791b4480e1ab4213de4a0c31c45b4d638f09abaaea7c2e409512847e9310717e6b8714de9ca855cdf04fb5c8dacaa9a0903015a6b581838100627b4d66862f23b210a5d46c2c086d61e95299787aecffc0951e8322286188841460c1d9b5f120613880107ad3531b8d11a672546e44afe2f28413051e83292619e640c22188305c61083d6389ccf304f3206375a6b587f8da62e3c430636c870d3830c1028431332dce18389bc7a5206dc5aeb4086799232fca0b5965f5b42b27fa2a92165a0a3b5c601fd194661d737f1cc8798810c3344610606b4d6a2107286169ca1c9197c98210dad350e24d1448e8f1c51e41822e558801c40c4818738e688838d38ca88c3067164218a83268e25712811878f3816104703831d6e8081086028a36501862a60d06048020607861e606870ccd15a6b70b001870fe0080305705001071c7048008e1e6fc0b146eb2071e38c37c278e38d296fd0bc11e50d236fc8d65a7be3e50d22de58f9021dbe30071bad83c48d2fa0f1852ebe5082d641e2c6173e5f595ada9454517e234dc9d48531774282c14056b632eb12e9cab1c73017dd6009a3304a0aaab2ae4fae6e9e483094be2c2b4b305676594524cf7c8867ae613e6465917589442efdcb6b6c46caac0aca6b8b0d1a36341b1916bac002122c24808d39b08103364680052460a1085ab80017b24045162e80052d68811a09830d87061b0b8882145a6bed0a6d5c218d2884e10a595c210a70a828ff0879ccdde683b91128a4483097963c514891f207429e0c34c2461e28a4487fbd8d54850aac6147158c34a9021855d88076825536d6902a8c51052bb4d666ac20b202115608812e32071b66d8c08b2aaaac215a430a9435ec1a3ed690d6002289cf3c7ba224ab9cca83de094df6355378436b8d09249090b4ffc7738d324bcb0f1f532c0f46c1fcc0242a7e78a417cc8705a8905e6e7e8ae7067b3ef9f2c73c3797571486c1405f512b6c88a2a6a238c0718243a7e4ec318fc7d223cce3c9b257bf32e3996b2bab3c50517eb9a8c6f828ec066b5848e0e6a2b0feaf5ae334514d4581a88f0d9661a29154733948c2987f3c733dba30eb7303a27aa8c186574da8c10729ac254f9080ceac254f88d232cc32f2041c8028a73293594b3cf3214e40e18827b0a1b51a2a8865418102133741f46714a63ed6d5040a3368584d4589444ca29086196a84d1851a5954a1064d143562d47851830244a801841a4eb0e36b2eff080179e65bfacaca56b62ece193f18821c30359575d94859f53630181e619f5cf915c4050163d04f8946395bd2a6a4ec318f7e6ce4f283a58a1f3e3c1855535112a80102460f5ed8b10474023102608bf85183d7c6011880021816113684024978200b13e400882eb4d6fed05af3034d6b6d090200e2878fea4148c4489a0a65adb50db4ce068c28d16922351a1ae9b184b9cd13690972092f2a70426badf5610fad353db4d6f2700720ecc080ce1d1f9080b66e2e285158e9083b82a2739790043e8491043b3a950a50a746e95423adb596043474aac3a4ca02e191a5a5c77e8d66a4cb2a523d26f994cbb2b1c14658f5d563d6274bd7c8da8004835d2e12b934d2d625923080814d6909a3dce6834830982809334858c30a90205b6b7540c2103d90d0d23a48dc38021d9a9404957d8da6864847f8b4d6f2115ed05aa3431236d6129a26ad83c48d219c23c41ce1a57590b87184091c416a2dab3e6429992628313656050343933de6b91ea42bff489ecaa2912a4aa2f9299e4d93a686d048dbf2117a4c93fd938a098d5b4b7cd01ca1f9cac2fea1a497eb452fe90f51591a0730420f8cd00123f83082028a3085226c5184a908144823491a475a6b8d083e20421729f02214a232ec2f6bebcf97b5a5cc5a02a5b2d0a0a2b5360734f8d05a43a2f540a309adb5391021b6d6e4906934a2a061c4b60e1237d07068f8e881c6025a07891b584655a3cbca304ac2b6f5f2983fa9ac25124cf69564f395837130908a6449672840087868ada9813de60f7a2767242113c491336070c6a7b516872aae644ab692e47722c814ff27b029d94a72c6196368adc1619aa0c40c8189d6da1b84400621b42104336c200428428811c28b197530030e66c061c61a66986146196678d13a48dce858c00c33b2087d90219255dd5c56e8434c24203ff4bff8902ceaf2ea339661976523bd5098582549aadce62fcb46a2f1d0e86a04f20c1b0db9bea686f24fcdc8aade09f6d87ce5a9ac69aa984c13141a4d69989b8caae2238cddb80dc83d95670fcde444821955a940402418fdd93f916024e97a914565d495a5ccaab06ac8cb0568fe8bd0e0eba9509fadca63f3d5ffb53d365fd1581f1b9a97f7606694260a099d30154ad35f4224204024180cdb967e1722019160b05d1dc92ceba291308ac6478551d26549365ffda03902f2cc8242e3431a6118454930157515a191aecf40be2d094692300ae4da290fbdd0602edd80b2ec5588483f7c4819f6245d39919e8479338bfc3f42242030130085b20f4c13982c8fae0c932698ac729b0f515905ee95603c0a1a28fc89946117855de07a6ca4fdaf291448cab011139204f3e34757e6439246352f99a8a6a23ed9cdf5545e927ef8780c1b79965eb6248140eea191fc4196b5291195ff8281c9d94b2fd80b76fd4de53758f4976864dd482fefd908ab5eb2a04830d7cb0f9a1f5dd953a140ee11fd4fa191aabf2ce945ff94aaf20f4918e5791076e94120cf20ec7f5159f5d27fb23e880104316e20c68d1845e4200b39b0c9c1921c3c200742e0000938c03808c00dceb8814807418cf18131303086017ae8000e1d90a1832a3af8e86008323230861c63b43106150cd88167074576f0b28307ec0000657ca18c22947182328e94c142861a64900165075aecc00440c84078f9811c3f38426b4da6f5f8c1143d7ef0c3075bf041183ed0400ffad08336f4608b1e44d1830e0faec0031af060033ce8ec400b3bf802007290c1c40664b081192990810da2d091071bf820031d75b4d65a0d9ab4d65a0d80480119347034686910a2b5f67f6d180cb3405236b2a4caa58a028d241b0bf458ca4618b366f4ebff9c47514879f9bff60d96b2c766a428a4c0d4c0bc0fb7d1d68e428af5b181428a04f3e3ffda9295493ea451145230cfcb8b95492f21ebdaa29b6c5473b904f28a2a22c160faa9582109731b30ded0038c34c0d032600075652e7a273288406b5513949681109a0cf290fd93305ec210230c28196625c9b0d19030e070838b7e1b4b5744c04802c60b180b00a307182d7ca0831d6898230a5fa461c6175e6c51c51755be107d41f3451497246c5bd21d4f8582e21a657280e149176074e833ea0a31e8620a87480ca680440c7cb406233dfe608e5d306d89045efacad28211eda647177068addd3c92afb966907074c03903bb60387400c003566217b2b506e382365a6b6eb8e1b8600d17a4d13a48dc80b9bea2f66b09a3804830377af444fb6758456596e5c4e62b18977ed0d87c45e343d23212e6129498982a5610239c732fee4919a001813cd3484f85cafc89ac7a2aef23c810e92b26daff0a51492420120c104926469a8004e3f16014cd131a49576ee95156fd271bcd485cb42d7cd0a1a1987b2c3d6a410c1763e800e0072d50f22e50400bdad0021ab80089fe6ae4b1f408e3e2041fe0220a174db8e8b4a0091754f0b400db02ca1614d882056eb040092c4083059a05920544ac808d15a0b102339c4021458291a658566669981126619406593799fe4fce281b2c0a29d75b7a844121e52b6b083663e9d1132d56d09abe79245a64418b38b4d634a5474f68a294400b2ab4f8684113458b26961e3d6962a8818d3ef0988cb6a8eb9b844621aaa294c44819e60f9232976e70132c3bea68436bcd899b8c027976594a28ecab5f020381b2c72c3dc2f408f3601e38de30e20edddc700238b4d6481080d7567622cfb010956117cc67df406c6b8d053db2c0436549d54ff10ca33e35d4074b12c82f09543d26fd48db58206a8a1118854954a41929c3a82a0fe42f5110a98a2b91f47faef212a63fe41516a286611186ff901e5834a13d68a4ff939fd45414167268ad3d150a3423fa47d2238b04b406722aab3ec3a82a44b2d04075240babb586515786bd939b8cd2d4e80354922c6ed05a8d131f2ca234c162081631585080082c7a6001c41574b8c28e2be068e38a34ae30e30a1bb4d6046667d945214b486b8d0dadb535b4d6d4d05a4b031a5a6b6768ad99a1b55686d61a195a6b6368ad89a1b51686d6da1cad35395a6b71b4d6c0d05a83a3b5f6466bed0bad352fb4d6dc68ad75a1b5c685d6da16b4d05acb426b0d0bad35365a6b5768ad59a1b55685d6da1aad352ab4d6a6d05a93426b2d0aadb59696c415349eec311a211fcc8f68adc55c184b04e47ad111ee218972d16f2ad4f59a0289442e6114c8a99055dd802c9119ad3528c8c8c4bc252426bf13ff452c2856cca1b5f684ff229fdd04b1a20c2bbcb0c2b242b7d69a15527a5891a47590b861858c152f6a382113daf819ff7c5ba78ef00ab55ebbe9fc2addebfaef334d3241385678f8accd7b47171f8651566157fcae96b2e60bab7e1f13ca5136678df7fbe5dbfea8bb72bffec888ac6bc83489ac4bcfbc18e150417f76fd8ff3d5d725ac53a0d766bbe5f39d77ad937e9470a4f0353b07fdbea3f3d11885f90f6bea24b5feeecb79041c2860fbe4ab55bffa923e21467c5ff56a27b5f3b5fc3ce1a8a17dee08addc144e095f739c60eb83301642eae06fa8dd7e0fdacf34c938e134c1d6192d9c12da98afde9783020e13aed3db663cb174477fbe25fca67bcaa8ab75f92974f9a978942069ad5beb08a1a499bafcf18040a33d4d3232472e26a1d011ce183849c016ef49dfadd8beadef8f202f333eb2211c244ca72e6bfe9d9f5b682f13d314b304e7083ef39e8e61b6193fb7fd23a32f26d3240a657d24e608270d579dbef731be716287d00858cab7784ff99fb17dae0832c3997dde273385fb422238f6e7e67c594b8cdf9e68388badf5fcbed64d9df321e08a1dba3cb3931f5dac9f69a2e19ca1f37b3fb585efb584957e260e7084f0fcef746af19c58473a3fd3a441d4277b6aae0f698e19eee4d30fda9c25c693c6cf3481fc33cc330534c2d324e3c40b921821351505052708d561bc15d617ebccd7d6cf345199e2d9fe208f8c8c134864b67f12275e90bc642325d374fd94cb43fb9dbcb6961899a6d756354d2b3ce000a1eaac69760e42acebcd3f88336fb8e78dd2ede7a8abbc91eb6dac2491e3837d5d5aab6d9dd2466d610fa8cd594a3ae1c6596e083fd35484c303fd55eed7f94a8b75b6a2d0f59926ece6a7783c20d0db4cd3a3324d988709ce0ea4d7ecdeefd65bbbf30b855386d4946a67df750fbf5c9770c890ef625ae5857e73859736e18c61bfd2fdcf6f9523d0a61c1d38ebde5b8c65dd73faa41fc911c3e17d71f47cff39a5fe20ec35569269aab19288ac25d3546381622c2707f8e27d6b75f15e2af3d597755d44a07070e020adcf6d776f42e72e3a111305e706d7bd73fe62add77dbc8e6383eaf046bf97ce2a9d46c9a981a631bb19e3f4ecbe1e798112b2ae22f9454fa629267368f0ae73ac35cdb74e79f70ceace4fe79d6f69bc72ee3030b4efc5f7689d6fe3fc3288f4ed3de77caebee84e8341e5bef7427f3a533c35fe02efb9a185186abddd7e78fd0773239e699a82e345b5114eb7a7cd583e7c3506357f7449e1dc59d28fb2220205c481c1cb182d741babcdd4560ff258956786f3824bafd3795ea82b7d95839a3c4e17174eb70e462ae17e4e5317dce9f66269a39bb46adf53382df059e3ad5247a7f4626cc3e102e677e7bd37de7ff97fb7f84775a5dbbe9bf8ee9f2cb8cfbd3bed84334b2dadafc0d149ddabef659433be7fa60904a2a64cc1d142627ff8c96da7c67bee99715430e7fe6a1dc4cf615ba3c452b0df43bc23843bdafa78a3406b2aa9c3fafcb9a4f84f80bd7a8c3b62f9a2eb383fd38471b2d87bc27ba573b7d4e1593fd334e260f15ea5cfb92c2dce3867ff4cd3c5b9824e59a1c3d277cd2f73fe4c13c53101adfb5fd29dad7bf8a87fa68953023977d65b436bb77e10e7cf345991ad74477dd7081dd4ef85382490f9be68dd7697e6f93b7ea629b32cce08369e1066f7fc9dbcaee1679a36a70ae8348d7a43f97b6bf8fb334d3522a011ff3bbd6e697ed9c29a10e897163e385dff94363aa64180e7e7ea9ec74ab374ba7ea649fb5fd3f45450b733d2f96a9d55c78f43601c4d53cc9429ae74f94f4bfcec9d10ba14985aeca473f55f42575f8c076ef09e1b5fb8b37c187bad327442231e4f9eb051150df1abfacebbdf6774d2c651fa9eef8532df1adf8342c5c9bc67ce77bbfbf9cbf320ec506cdcc934d9f8a5c488be979d73fa3d8dd3edf799269bafa6699a72b6f3bd0fc627dfa79b7a3f7971e205498cc895883c344d16d397bed3d4ad4b4731fe6b3e6b7174982d7df34af999a6231fc873dbfba2a53abac3998a26b57a626be57bf53e879f69da96e783b9118f089356764eefc3d83e3735cdf0334dd3945f5b425e5b4ba6699ab0be9584b362ba2ddd535bd7ff99a6ec6bae08395d35c64ea9cb7750e2cf34bd1889d9ef24c810ac3d1fcc3f441ec3dec34901a8e2d78f62f7f8783b3a3fd3242363c4c8cb9398204f5d50a6699a3c1e1116633325525b31b677baabf1beed01397fdebc73b68edab81de5ae9eceda5c63cdce39fee8a82bf42c9ffd9af1753535eaf7396787f63afaa0ccc6d06d97565efc336ebcdfdd7af5c6f03af9defe1cf2540fba9189020a144b74add5fdddab956658cccbf5e6f75927861a57e9f5334d5656511e49479ec72e173dfc186737adbdf73da7ef5bf89870972fc6b8a5c3b83efce4679aa629fb2795c652f9d71d7d7367a8ed7b906804e57ae0ce52c6fb6884f4edc71dd89852f9563e1d9fded7a3b80e6b8ab5ddf952f97e3f52b6d65ee5c7e7315feadc07060a79a7b471dafa7b627d2307acd696deedd6fe7ed6e1cf344d53964757f664da808eb54ecfb73e1ae57d79467b93697a12653a69b39d316fbaa7abf8892a1dbfdb379f529c9dc238f1a094375f3c31c6f66969a4097bb5dd79bb6c5ddb88f33481409f8940b957c6fa2e3ffce0d533cfc40c7932fddee9ec8e4fd2ba61764e5cd56f4208e3a5faf9839f69f2540d54a7dd4987e5ded13da74834f12a1dee689fce8ed6a967984808f3525edff19d7bde1bd69782c26a46f8932c716c218ed023ac7ad3f91f0f464dd35522a78cf76bfc9ca9a5d27da6699a3ef41f915f35d3b44492793174d2e91ded73db750c44626dacce29ad72caba27ac19e197a9a28fc47c4de54ea6e96b2abf9860024249ef85afe763edeeb4400c3c32efd6f6befd38df87d5c84b171d966eebc4afbaf999a69725f285563b775962f7f2decf34550ff25479eda9f2ba4aa2c88ed6baf78edfdf37edfc4c931022d63a7ba9bdf7c569ddbdcf3481fcaa7917cd2130ef6c2f74776e8ce5d49f69d294e74537d934c9dc5433d37453f91302eb8b30ba4d7dcb7a2dfc4c938c8c8c1dc55c9f1d8911324dfa29919527916b9fa6eb33ca02319e8af288ac4b4fd39589ac20baa26caa91a73393a16bbd3396116238abfb4c93a4234f16da462871f1ab6f7f7f769642971fcb0302799ea6cf1593aac8344d1326b26e126e4eea3294f4e9b97584144884cdc8389d72bfc31fe7fbad1d1024acd4ef7cea0c2d7c7fe54706c6d18d8344183504240a5131d3240a51d3141a554b62f0dd7bef49edbf59739dd3f454acd034e5a7227344b659ca5b1d7e2ebeaffe99f6960f576c2dd6f9fee59f7cc4950ec25c5dbd56d28bb3fb4cd395611e9927a427a46c14b240cc64f1dc59571a1f844fe1f5cf34792e988ae9c332fa9317dae93b7ea609f350faa67b995e8731e6df747fa66902d3e7b634564b21bdd2a1fc4cd33465a13d4d159092eadff4655b2375d1dacf34fd5f9b48ac4e57f7d3d28ff2efc4a169c23c19667d3cd5b5047c76fa73e999feae79ebcf34d958570dccb3f47e7cef20a5344e2b3fd3a42bf7587a9aa64966e6c5c69d2c71373bfbbcd6aa2f841bfa679a32554dc9547559f9871170fe4f7f4add3a87f5fd4c93679a244cc8b28000f2d1ea2dadbcae5efb20fe4cd334c5979065796a2e8f07880c5c1e6c74793c0dc0c0057e30c0c705306081065400021460c0048828c287048a901c1081222040c4038a206267a30738a0ca7f3c9e8c5121221a108200032e2b73221620e9031450c5b2c92090003aa184000b5f4d457d30ff48435ce000d00015e8d41e379e4fce1c7b0a3001024437800b08915996007c04f112809a0b00f1300c00003a1e3f5caa7828022d3516c853535135351688012cd2caf314c1c9aa3c061a00c2e0428609381ff2aac5858c15d80224d1304ae4428404d0a4e08534669a8cf039236080bc6400033e2e60810a5060024548408a00041e40c4014aa064a50a01342974218d99d6387bb8b2ea8de010a18cb4f695b58446c23e99e8b5346117cc675e435171227ca0d0f9b8a15d17111aa9f21f3e447ed954a369a2c11fdd9acc95615308739b98d75625c5c1831db8c480a092f2f2228384f4a38aa67c64fb934c4e2e26d9fe24922449959429a42a9af27c8d7e8f0b18faa72021e3e2810c7834c86ab103123152f5204fb61fe4b1f9aae5093568b882a5063ca690615a420209295fade5481127c958b101284784cc34991122c54855342582f6242048481f98afd12f441f9922c9122a4a6c3c95e5c940fec9f0ebd61a15ec7f6bca7373fde8039f1d792a540d91d6384686c05eb7c65902345ae224b39610b12c281a64197910f6cc5a1264642dc1fe8b18c9ac25dac9278f945816147d79d620ea89d65a470aaa8a2bc188680ff216141068548493e493fd9d7c902bab9a68b299803c6344b2fc7b1309e528faab26f4574d544d60a11ce5c99325ad7190581f9b907515d17f59594d4561164888fe4cf439cf78aa78e8a5a0304f150fb5d6eec8b01f7de09d542f6222c4e697709800813c679815f264ee6911dd649e2138473a586589b0777273fd48031c234b3c812d5090d638323016a18f88bdf16b4893377e5d3342283bb4213efb2b5796101068a6358e129acaf24c652d0181668a80403320d0cc57d6120f39364252cd809cca941e3101c2a89a4f02f24c559ffc50886454d544e51f287f594aacab4986f927c9664256f53a645557114cc967ca72a2354e906be61a819a6810f5117203aa98b4c651e2e691d86189d6da149e61d591d638494c71f0e6917424adf2bae2c82001a3be438c2a1ea2a66018801236aaa890f4c30776c178569670a08dd6383f282928ec435486592129739baf2a3fe2ff080f484b807c08f436926fd06334364a8d42a3cc28324a8c02a3b4c6897951b00b261b85b07eeaca7804093280150ca06161812baec0010fc098825d30af2d244c3cb1466bed69a0352d5c3c50c6e6ab0743611e90fc5440200f617b68ad21318630b4d60413259a9228525a8341f3a2d3041badb5255db8a0c385cc94d6a801b446d39a9107614c554874a05469cd2b4a3a024a1590aa073909090948d5835a11ec8209f95f19a66489ce1333aecf2897dc79a2c411cf6bab52420073a0ae4c77340087d626cf041285284f857140f253b9f1ebf20bb4d6a2681d0d0c6950f8acfa3540208422884183d64220faaca2a4ea2f0da23e596441998eccd080a304e6e6a74897b55f021080000420882037d945697d59f92fb791665ec4c45ab207180cbb86e4e08bf69811d8d7e8bf820a401095656137523523841351688d13c405933d5350d284e40b48ea68ad4d2e9200510515ad4dc1841d9e614cfeaf0c1b8155161d1d2644574757d15a6b1cfb21eb898d05fa204f0dd1a091f584b5c4ba9e033741f41133ad71a6eaa7585030279cdb5a9b4249665595bdfe933111e2412eec41236d85a46ae61ae55ccd5416855154a8215e8d8a3ca5b153197679f618c6a4354e85c29919a8b2a8cbaa4652e52090e71f372eca281085bd3af2d7281b6ded58fa641785a5caa52a6465d8285fd6758146983f76d00c0cf6d811d805e3d71b91a9ebabafa9699d216cd45454765978468279e90fedde80b00be6067b30cc45640849a335ce8facf28a0a5157c6282d8546d54b2e6121cc6d30cbc80a1682c441b384e69f80301008900779c680dc64d4e522fd4e2eebba88803cf322ad711c505351ad711a804d815d4c3cc0a1a65882e40b2c1a958a1ad550988cce8c8f66e11bb994511bbb60b4fe0cfbca737d467942d6b53df9459811f9a918a0b50eb48e1246aa1263b48cc2163e0f76bd08f49f4c651ffa64d4e5562789345ae3302067e9064b54380b005d17916c8140334c84b4c651406b1c18982a5f23d3860c1b5a6b34d77f8d37c1bec69bc8e8a135ce105fe34d9208a235ce0164643a3260c86c914595d641e24647268a8c1219234ab8d641e2868c04641620d343a6215187d65a43620d304ca48966c246138d04e3211a29a6c618d139820d472ce108221c113a021ec199e68881028a898a2989dc42899028948451db8a428a645594873ed96b2a4a1f8942ca8bae24cc6da828a4bc6861a1e827760f1d8b86ad81ae8830b9505c0834fd1936f24f1522b707f7e646e1ab26e870fb701130445ac9f6c0031aaa12aa0a3a5509cce359c2e4c81327449cf0105962c60913284f3c9e499aa417697a9126d0537990476465179630cc45d80563c46cc23c416b5c0874c73bed959fc7e28657ef9d72cb6b31856fd74f8e82c50e38afddd45ed776c2685dff91699261a9c3ddf543ebb9bacd32e23658b7f3d30f75ac357bfc100b1b209d6e6d8e7a4659a3cc6bd810dffba49558caebb81a596a802ebe5d9d8bf5d649ed7fa6c9f3c299014b1aeedf39e9942f67cf72c28a858eec4e27743b5a7ffbec9ec28206e736ac386389efa3f6ea4f4d45612311cb199ceb9be5ddb23e96576b33d8eaf495f5457fda6577144b19ee9356e7f7bfd067ac1923c3be2f1fee09f1844fbffd99a60ca3409f511f1b4ff6356390f06247affd5ca58ed19d450c10febc745f19dd42e91e11963038bde7a6d46976fe50ff1c7767ea6aa56faf8edb9d6091e3e3cd0fb3a637ba7cb5fbc4915ddafb6cd6b83ab7d2c180dd3ded34bfbfadbf6d0d1c7562e8f43a3cafb32fe737268cb8caf874746c5dae5fc87a5bb8edbe2f3a6be17fa6090420f86b8459a03cc514d32462f142cd3a3ef5e9eeed97a174c3e6f7a4d4d1de4c7374cfd28597a5fd9f56ee2ae5e71df230c1c2850875bef535cdd437fdaf61d982dcf4baedd0a3eb6d9f6b23bf0b73a63a4e577774f7334ddbb22e2d44e726fe492995baca027ed05fe32a697d4f56bbfd4199050b1a5ff77a6bdecfc6fb8bd6a5bd36473773fc4c13be02c53afebe1a4fbbe3ddff1179624458ccb358214feccfc158af862f3b590548238dd0e38c3ad66ce91ad9453d7574afe77e271f60a1c2fce772ccb46a4b31b59b650af3c538e573aff57eb9650958a4e053e25c9ddfbf7acef851b0daeef7d1dd76b7bac42c5078126718e774677f5e4b3fd3122c4fa8786b77f7df576d7e6fa16051e3f5f36ced7671de8833fd10617182fbbbb3be53ef67eb743ec3d204ad9fe3ebfcf583145b2648d719d24bdfda2835d59f699aa60db02ce1bdce12fb677b278e8e3fd324f361510274d26d0973a498e2ece8679aa62909962464e9144f49e37df49d87080b12bed64adfa32fafa515d7cf342d89c11e730a34036314588e9021cdd6df9355bf19e37fa6c9084b1a5f617ce89e9dd84517ed679af65f415e6662a008588c609dd33bbebeff165e9a8b20f5855acbbcb3d5eec1f89a83050b112c8d774678a9dbd1524a3d37f82f2b7b42e483bc2c79311293552142050b1a10d3f92076d1b7fb7cff88d524444d530dcb1068c4b7be0ae3a45262bd59ceb01fe7a5fe4fedcdee5da689182bab8edc5c5062906011828df5e9eb24a4f9d2ea2c152c66e8391f3edff8c9bcb79d4178f4baa6ae4eec6fe79d6f5880605ffc77dbddaed03a941a60f981db6e5b8ca57578e9aed2088b0f6894cedec7f1e1ba35cd45587a609f8e2f63ad79469bad1ec2c203b7adfc68a97e3a08cb0e68d43466572dbdee9cad47b094011f5759e9ce4eb090416595aea9857a6318a1fe4cd35f2228311c6019c371bc305e7969c50f63aa83a95fee57e774a8a99c94450cfce0e3adb7c6975ee9560a4b0e5ede99e347292b95353a0e6cbdf7ea6775861a421b596ea05d4a28f7959e21dc30eaaa62b1c17d8ff63ecf95dac7d661555cc90b84efe691bc3c0e182c3570eaee62963afaa636eacf10161acc7b71a6cfe168af84fe2c33c8f745bc7ffe7d5be915b18481e7b476cead1f9481e78ced8b0ee69d6ba6f7c302867c3bc79730524be9ac8f2306cb175fa573927eccf06574c8e2c5b51a6328e76b9af1cb186189819df2056181019d92e505734a962e6a9cb2c69c6fb60ef77d178b0bb46f8db1aebb4e3a37bd9ffca22798a5050fbeb723a43ea796ef260b17785e08bf460d6774f8f5679a7cb06c81df75fdbca76fe8faba6761c13feafe6ed4d0be2a1d6559c15f0c5d7c96c2e76a84550b49a37348b79cfb52ec52088b0aaa96ce592cef962c2978326bfdaedeba33a652a3206a6bad843e7dfe671d594e50779e9fb55f08b34b99057c6f5a39fda9a3d741162ce8c3d78e7ea610c247efe708962b72c6b04a7fefe2b43bcb0db09880a50458cbfc5bbb85b63eec7f736597c50aff2ca995f1c107f1b39885045a6b5bb5acf3df0ccb08f0a58eca2df3f4f9e4869f69a2024b15573a4de7d5194f8965c57fc839425cf186f86bd6f0fd70f79b32d687a1dbfb27aeb2d2070ddd9dbff9a4d31947f899262bab282bab8e48b1c2070abfbe5beafe317e788a674aacec61634bef7dd7f9a51a43f999263dc0fc1abba5115bd7f2d6cf34dd5c594524ab3cbb134e56f250719d77d25daf9b36bf5e62050ff2d5082365e50ef1baf9b4de58c2eb78be2233311e58b1c33bce1eaf936fe7fc6a7c3264a50ebe2fb6fab3bb57422864850e92be7da7d3bf33bef0d24f9195393c9d19ba2befce2e4667e5e057bba35b3fcd0e6b5a3f23cc53adc401cfff77d967bc5b5638c45d9db4d577de763f7f4756def0aede4e359df84d993f7f26222b77e8b9a3bb9b42ab7185fa7ea6e9033f4d321f20f2c48a1beaf5eb7e6f7dee3c95e729acd851a77c305156ea98f83afdfee6ebf2a597a80d4fb7ad17bfb3114e9c7d9ad8701da4eef3a4504fb72bfe4c1308fb132b6b98fe627e763abab7fe193fd3e4b1767524fb252610c885d4aca8c1ddabe72b5fc29bb5bc9f696212f363ca083966aca4c1de8f3b6ff812ba67e7f9299ee921d3a48bacd0f168b5febae289e5bbdfcf344d13122b68782e73c5d5ebce4e3a7d9f699a262756ce00ed8def528b9d8b2ff1fd4c934c2847d1d53f89b2628618a9cdf9e1dbfa3d77ff50d324334d3757867dae6662ae3f324d30582943cc3e278655d7d7fafd7e64a6a9062b6480d7b94b2fa6577fbed085acabc834829531d0089f4e7927ceeed7b91874d573fe83d071cdbe6b18ec751ea75b39f7e709f3679a42230c8f304f4d9539364dd8122b73cc7cadbe0ee737277c357ea649e625bb94bcc4786e32678d1539a49df7e3737bd68c298c71d8fc1c5b0b1f7574cf8ac1206f7c304efd5ea76f5a57a78331a6aec0a121f63be1d5984aeadabe21f7fcd7b4e67b6fa67aae7c815e2fc4eb0686cfe1b696be95d0b9d7051aa7c37b3b3864850b755f8ba7763c3376f8cacf3489feb5cdca167c46fa3b53afdadf7efa334d426484bc4089c1aa5045a6699aa4586963befaf0dae950c76c33b0a285bf13bef7efcdeae6eb0965250b75babbf3d333ea8ddd692556b04037b5d63775cfd1877e251d2db1c24674bea7cc31eb2d259cf0334dd31413ca515ec25c8ab9ac508ec20963e50a105ffadeebdbf94f5f8dc97e09bd6285e7ae1fc539bfbbf1dd19a3c14a1560be6fad73dbc229f3db19acac111f8cbb5ab71553875b57234b880d56a830ddcd5e779d6fe2fb8e82b132857cb1d5757ff6f79b57a490a976d95db47053a7a9fe62250a0fca4ded7415ffd3fcdc0df65c9f65bfc46737413861ac4081422debab734f2cf57bc5322b7b94ac3c81c6bf3f37dceec2afef7d86aca841a9dd5b67b7efce38db1964c509fae7db181de25dafc4ef88952668e8f4ac74eb28df9d187fa6e9a92b7bb2c2843add762dadcd7a4aea6e09f0d11deb8cff6f3baab512e0bc927eac35c3c77ad624bc634aadb4f2298ed01d09d9cdfdf7b974f91f5bfa99260dac1c2146fd647dd06a9d35a6360d99affc9c63acd91dccdb086e5b77f7cd34babbf2becf34f9f59f9522541a1f4cbc32e68a73c4da513d5788b07d6ea71dcb67299594a2f1b29bf0cd572dfd9badfd4cd3939521389c69bcd6a7d7f83adb33eab3f92fad936a69e3bc51628aac08e1bde8efb59418badfaab11533a2f5acb3ebaa69dc74d7cf34c9ac04e1efa355fb8dd7c6286ff4746005084fee791d426d7d4e5d3daffce0dd52b8b5d31931aecef900575877be14ea77cfdb7e3cd324f399023d5972316932c54a0f2096be9fbe77c2fdeec653feb16932b2c20307e967872eed7bf749b983f7de9b7b46e92c95bad23270acd6cdd7f5ceea6e7f2a6a9a56c8f0196785cfcd2ae77bbe3ffac00f11b23286c33b570ce17ef79e3a5cd181c410634ce9cef221d6fe99a66992b9d9d4f54e34b12286add669f8e8ef08b1d3f4c53579714c5edc9217a7c40727052b39f85cefc30effc5b75ff7b582831ddfc7fa515b8ab5e37783bc9d53bbad630ab37e76c5062fd39bed7d9946e7dce7679a6e7e8a47e4218fc8954859a981fdecf2e69a9fc478cbc8c43c087b0d5668a0abcc136ea8a3c52ff59c417d9d2bdd5a4afb62966fad84615da5ff28a6554badadafc8605757dfbc97e2382bae5ba6caebea45c7780e56c0a8506aa739e62db39339bebc80402ee46526864813d3c40963e50bed764af72fe78e4eb59da618ce0b56bc783d31b4184b0c5f6f993fd3f4204dc9c8c43c481fa9984c1336c5b23eefc511f111235a89817eede4b6f7e9e92e524aadc0006f2bb79befd61ba37b5b8b951748baf59d366607f39b3a8f56bab03be37f3ae3fce28e9889cd8a0b32756eafb630bbd7d7ef334d98122b2db01346b8e37d9b1ddbff8f0c9498bbc2c59bf1c11459d9e2caf8565820afc590e20ba78bf9b353b2b202fb66fe1d6bb6f723f3950512324d5f59a01c65450bfa974e5da7741b5ffb5e5181c6efe6970fe2e726ae6464429f1d99269999981822d31463b392827fb1c22caf3f18a1d7e9a159418186eeeea731cc90ceabb7e7b23c367e7992c428b17282ebb3da4937feeabbc2c7bc8262250bfcd7a3d71ca3db5ab1fc4cd3cd954d93cc0cc8434fa669ae6041a9cb6badb5ee6d7ab7fd4c1396610ef2e477628994952bb2c5d7abd63ad6b8eb739f6a9a6492c4c484564c30b347b7563ff4877fa38082032b254062c58aaca99450e6fdb0d4b83a5f21418df97dde70c6f7eacffc99a69995113059a962dfe77ead96575e9ff271fe8065b49ea1c4f8490aadf583fb7b1752b73b4af83efb20e3cd367af52a67def6f181ea7f89e77d36df0c61de83436b9ffb9c9b5a5cafd5837c9badbbd76187a1f69a87acadbbd445df8f07682b761e1f7db06e99dd123250a870eef07646591d5e7aa1844fea6a643976902e57683594ae5e373fc4a903bd5acbbffba1abd1a9140e1ddc62dfd34d981fd64af31c6676d8ed0be7631c71a57288d0494d657d4fc6aaab1b89e260718cd6d9975d7cf7550787bdbfbea8abbf8c70bfbf21bf78a994d342fcfb3ebdc3c1e7a87d30c3fc4e29fc4c931bdcdbbb62e934ddda59e81c3b6c8e534e4a9fb351ce7beb70bf69cceeebc315ebf7da60ef475cadccef5f760e1bac75774b2d29f6e72ec38ac98bae28242f2f4d627e04720f70d66063d48ff5bdd46d2c9f7fa60986a386fcaabdf473cdf2fe85f7334da1cf8ec4589c344c091d3febf14d2ba9cf2e3874e4fd72c532e229f79410a321bed3eae696d8bd3c27fee19cbc380df8f050c139437cf16f8572db17238e6e031c33cced383ea7535a772f96d3c4e182538608dfed792dcd33eb1d7f89740419e8ad6e575b5dfc5ca7d728a0401163843386275d8d783f77317c743a67ebb6da2baffeea411e219c3050bf535ebf38bf87f7df1c75ca7cf57e3b6d96ff7268aff8a9f5e92e7e74db389ebf4d65c51bca5ca5a4608078be175d8e15672ba98643ea87fb52475d75f2baf7c6acd1a5df482bd6efe517acf498e7b31b66275d5e2f582dedbcd6d6b7a9ddee46ac703f3befdbb2eafb601720dcb7eeedfeded72a2917a07d1046d37967a54ec7ab7f7bbd3e0ace16b0e3aaf1746aa7fb5a731b7bc71bb3751a5a1c2d955ad8394a68a5c5f662a7fb6661d60761b2c6133fa969aeb4dee71f281c2c40079f950eafe767a58d6c049ea7ae8c080f33ee849fe55be8ee438a7110aeb49766f7248c18677d599eaf285045f10082bdd2423cadae2fce1ba37e2b7b1e3f80d2ca19e39555ebb8dd6512e3837c2b96f7e1abe9b5d95d1e3db814c3a8e1c5af5e47dde34176d5ebd3f5420d1f5e56457988f0d8019dd255adfd778ef2ce4ff6894719d95fcf08b79bdb4277fb73f3483e981b79e1ec80071958c65b9de76aa7bc133e1e6358a76faed9513a79e8003a8e39c2baa5d63cc478704b39f3ce55be3de5cd41ce786bed0fc3ed4e7e96c20307383f38a3d4db5fc70b77141e37c8b73afd31de683d637f36905ae2ac1fee99ed8bd23ee15183bda79c514f3a27a4d04d273c68309d93f4d9979f8bcf1d42e13103fa74adb73a5b9ff58ba5c7f3d945d8cd4f913cc2c874eb2d67a5d5eb8dd66623254c78c8e0baf7f0a5553f963112c3030cfd113aced4ed79f7c67886c71759bf4add61fa327caff3e3d19583dca3ab1789aa8b8717f7dd1b1f62e851d7eaf5334d324f96f08801761fad9452ee882db61a0670c24cb1c3d5461af30be095915677e9bb525edc85954e5e273794dbd65add059b5e5ca947286b9dee640b667638c39a21adf6de9a677870a1ad833e259ef1ca18dde680c716ef1eeefbe87c3c71cd4f033c586025a570cfdfeea2a3d819e1b1029b2fb6f6baab91d6578487162f6edf583a84596fec94870aea947b5ffcde5dc5f3e30d78a420ee7b658c70ef5a7d3efdf04041bceffad3fbd69c337e7984c709b4bd59be8d4fc648ed8c4bf0c8e23ec791ce6a9de3f7741f79e181854bace93ffb3747aa297c3caec86e66372bddb0cae79b521e2670bae6692fbd447894a03a1dff7dbf7bb0e2173fd3a4011e56bcdffbd29833d5ae21ac9f696ac28304d11f42fca88613cf8aef679abec06304f22bbd34db0d795441359477cb58e5b4383efd3c08fb83b0bbe1f207192ff58967d63146dfb25a52d1b8f821cf18b3e33ba5d63b53c1a50ff3d508a301173e38fc153b1d75760d9fc47ba82fdfe766843f85b8e8415a4c6fad1fad74335f3ae39207692bbcf8c967b38df6eac9050ff4b98b903e75b7d166cf2e77d8724a38b7ab0e5a8f78dbe13d496bce113a8edbdfadc39b5fe93b0aa7f45921a5c3ab34ce81cafc5ef5bc1fc4f0d5e801173944f73d1d7d2fdd53183f0ed051dff7238cfa217d0b07a778bbfb9c6fea09eb7b83c3d3553da39b176677ed1dda2d74391f94d4de5cdd00b18df2ce87fa5aaf31da91a7d459bbb332c7fb32acc3ee97dfe1ebf6967b43e7d2869d9f3ea7b93e77bc35fd307161c3b30efafbabd7659c114e1316d3c4650d70ce5ce3cc73fffcc7ee334d2e6ab8eee7d6b76e7ffad3a0adc4daef84f46599331d52dfec165f2c75d5756a232e68b8eeddbf5aa8e7b3bafa19ecbcd9d129e18df0550b5dcc80adfb7af584fa62fd544e934b1932d44f5f2b5d5b3765a664d8b53a489d8516d6b7378e21de8d3d667cddbdab2914837bb1be7d4831d42e561706f73457b99da57457ebe6921723319c2f5ce6d0f65d1d5f84543a0c3395e3ebfcb72d7cd0c69127cd96ba7d4c21a57082816a3721fe7aa57baeab4ee20287c4d5df7eadeeee9df3bf216b8cfef327a654528d5dbe805d6b386dbc187a61d2ebb0638f7a52af36bbb8016dcdeef694bfe73fe85d70335b9a1d4a87a3ad313ee1c20518f5b5704afb51c3979dcb16327412678f14ebe7b4db335cdad87266a8f1a6cee92c63ec818b163085d93d0a2fb413eeeb3e50b86481de077f423cddfe4c9313172c48bd3d6b9f2e66f7ee661736b6d72ba7b4f4e77ba7f7679ab4f62b38aa25f56cdf6fd6ff26154a0f71b10296db499ded9670e2cff4334da051a8ba5441e3aff3563737dcda25756518a8891a2ac8344d9347844d2e6b6427dfcd10d6edb3deaa91ccb850616637b775f8cdaa3d46f79926212e53a0fb7def8f5a6eb91f4f4ff59fcc639344898b14f2ac933ef8667e53564c43e01205e7a07c97ba8bb7f4195d8d0b14b0a5d61f94ce3a7d3ce537e0f20437f7c56fce075fdeb56e28157051a34ea85fd7ea11ce5ca30d322426c810fdd9454f6e1e091417274cea90fecb6ef5d5d9ca14b83441cb7c77f5b7a1a36f1d3341da7cedc5d445f92eb5db6509ceea5ae557ea2feb495d09d4a975ff5e3395966e9b845bef968e6298ab83d82b12deda2b6bcef542fbf2c223d408ddc73bf1e75d9d7569b8bfd54e8ae5c5d155a98d50a1dd7b6b2b65f678a52e02a4efb573ebb24ff7282682d7fa36e647ffa3537bd1706dad7697f10f416339ad76bf0e42ed7e86bb6ee25b679e7f2114c2cb6b77c46ee5cfa82934c3e98d33ad2fc70c33742833255ba0205bb804c1a3ce6fba3bb3d61fab0b101e8435420add8bd9cd4b3f1ecc675c7e50abbf18ffd2c7f7bd9b93b8f820bf88dda6146fb827cc4e042e3dd8ff76fabe7ea7d67f43e0c20348a35b9ae986743b78e367075b62cff5de48b5bb50d3cf3485fe894b195446c7b95aacdf77ac15042e64687ba19e133eed3c5bbfd6658c6c219c7b4e0937f6ec13e41711171dd447a18b18f251e89203e95cbe594398a3fbeaa411171cb87b523eecd49d7634da245c6e001fcd586a97a39cd9ceeb6283ed6e863846e933e788dfa50631da58a5bfa7adbe76bf0b0d1c74784f7df58c7f25de2e3398f7dfdafc51be3bbbab4b18db9d8c12e6f7f6ff7cd20b171940dfdbb9bf1b3b1ab50b1852622bdf733cb57e1a5e10c88570b270f9c2ee0d65953566f76f3febe285ab0e636bb594ee334d4c5c62406186fadd577774be272e30f85ca37c98ca3dad7bcfe4f2829a6dcd7447fcced999a54b17f85257afdb72becfef621717c0f9727c4a854b0bacf34b23cd194efd2412172edebee7249ed1fda5f9067bf4574d50e1b2458e2ee77ccf5919a23e180c9529a630e2c20287f55d755a4fc7d9cd9b8cf20b0ac865057fdd7d7baf7fbe1be7988d9454172d5cb5d95d38a1dc90fe7b9f69aa8a38171548e7649d70c6fc36ac764f934b0ae43f0baba6d0bfc63d6513970b0ab47df8d53cb3d4d5e53a5d4ef0fa45f8f07c072db42f1e71c9e246796f96f2d9e8aa3f75c1c2d98ce7db7ae3be11fa74b9a2ee28adbfc416ee7f54ba98c0ceec3ff19cd35a8d2f752981bbf1ebb4d8e3e3ab5d7fa64926261b85b096e262459e0fba87f7c1b71a4e4c02f7d3eba5515badef743a0279a9cf77925afd79ebe8528575d2f2876a1f8489a2c50ffef07d9c33acd442ec741fe0b4375e59b38eef520af9402f7511bbc56ed6a7ff1569d983dc715ee9dcd3bf9dc6d7488b1ee28df861945a47775f8c799038df9a6d767252afeef100b76fea70c36783b4dc01d74bf7ac7b5a774f62db628747dfa97650c75c079bb5833e5ffd2b718c960ed33e3c1fc6faa8a398ce3950683d56afcfde491f4239380db3db79ffac56d6ede200bfeaeb5fe9adf4da083963b4c0013a5ce973b7b3a5f3566f7903d5f0699aa3b67a472cf507b7dc41801637e02cb77b31c3edffeaa57658bb3a02b28464a0a50e7767cc3efd5559edbeb00d07686103025ad64061851abe0d35d6bfaffb4cd392163548a0250dffa276f6edaaa1bd6f573a7294136ebfaeafc7f95ea64078d4c42312f9344d530b1ace60438966ae9f72594f3091408b19648e16fa85f6d51d23d4d548e649d05206eb2aa4d9d53bb57612ab7e8a9535a1850c3062bde57d37ddab98e68fe77f7b3e1b894259cb18aa3fb75dfcb91f8deffd57140e59799a9eb488c1551ac33047bef7dd4ab7a5d139ceaa10913097a64984c5e81639b03872d49a4e27379675d7bbf353916901038e0fb3dbd41fc259dff67080d002c7fde79e1f3bc670ffd337e67527b36be928ae51ba2f54ecf28631cb7ab7fdbc5bbc10b786b8de2c1ddd71cb1637de7eb8659c59ee19b374564b17b800339dcf3aed6285efb56c6147aced7badf8379cd3b23e208d8296361cd0a2052de37ced22ccf7c90de54d4655167593513c68c9c2a497ce5d25d433de77186bc142dd71d6eb2cdd5b57f7f7334d56b4b07105ba65acf9fd3aaeaf9fb402de913a9c0f7fae42a7650d6d7fef3be38b9bee9df5679a4ad0420504b44c41ef6b7f4ee7d22b86324c84bc6020d0cccb6535f1f2f212f354a811b44841d607a340dda5737452f876ffc5505aa0209d52fb523ef63babcd2f315eb43c614ab640d8002d6af8add4e1f8e2fde9d7eacf344d934539a1a5095a42ec36eb4be794dad9cf901626c4fa78d7fdd2c9591de325cc0c5f53abed7e89a9a42d4ad078422ce3951fa9d43909bafebf93d7e9e89ef46f4182850ebb74ae429b1d4afd99a69623e8addfe17bebb454d2e96964a7d16df8b4d3f955285f8cc4287981e2a4c508b1c24c9dcd58c32dab5b7f23afad252d45f8499dd36f420d5da67b7b9468214274b7ea1b7f53baa4050d59e79d3a477b9fa658be96214848efcb57468b25854e63d17206ce2ebe7ddf4fdde2f8ae162154ec649e70feddaefa8c66380aa3c61f7dfe76f5fd679a5a82b0f19417df4cdfd59ea56e0182a5737adef152a82b8e2f89961f646cb38bd3e5d64fce5c7d00639d77d76addaeb35a586509792982e4c5484c90214a626e5a7a80a7c7d79fb395bfb1bf91161edc67638d8ee29a75ceb8cabc3ca78c961d50baafddf7f34f28dd9d2168296347ea5caeb4c6379dfc4b46fe98f5bdf4de2bb33b37c643c7505ee9dab7bebe75e078ba095dc613ca7f7fc5d09e5d7e387ea536d7785b72e053eb8925b50ecef9317a6eaeece691bc9ca00507ffe27bf9ed96155a0ae70dead4175a17f1add669ed36900fabbd5abf96f641f99f69b2f0b5d4e065cd12ee5aa5e7f9b26ba141a5b5650694d69630fcd617b3bbbf39bec55606345f7b9d7690de0927f61630a276d6da97b1a4544bf72d5fe018f7cedb23f547337e2d5e54f8fea0a3d739fa30a5a29618c4bf9eeb9cf0dd77f2de13b4c0003a3c2bdef3e98c936a90b53d375756e4e5488cc895805a5e40299d9962eb24953f9fc42d5d5cfc0feb1d2dd6b86a88448b0baab315ce99e9cb0ab7b7b4803a5de3c7ac637cd85dfc4cd3a53d2d5ce44b7fbba5785becf789281b4fcb1654e318ffe17bb6d8459baffe92a28505b3ca7f0fe62a21c63877a06505fe5e47fd56521bdfbe2d5abcbbee3143a7ef2abc574a8b0ae05bf8ee13e3fa2f4e376a4981d3d8f1d319bb4cf5d5b50505b4beb91fdc51bec30fe69613bc7efb6fee8df7f63c7316b5e68fd09f46e7cfe5d782c5c61b42baedbc507b7d167585bdfeaadb1e23f677756cd2628209ef8518eb79a17657bbcf2aafc95a4ae01ec67ded76fb94b458f1a2dcd24e9b67bdd4c978b590405ad7f9fa75edf1ebd39822d3547d963968c7542d23888e757552c34877d6ceb654b11dcbf8a2d3f81eddb47e80e50f3446e7e6c393c689a37c7ea0364b1c31a5526248a5637da834cf97b1ee296daef93dc6870cfde9a6f4f57ef24dc72c963dec3ba97498bebfff5bb1e8e1e19ddd3d966fd61d750581a82979f08bb1fb8735deb5e2bf789077c239eb7d3a4b083d56e6b182e50e8e9f8b153a3ce78b5f59ec8027b533ba2de3de595efb99a6cac645581ddee56b9ce76fecded5cb428707ddbe55e2a831bd9ada396007addc917e761f3aa16503e5a7382848122a58e410e7a5b9da5a5d57af367b6458e220efa5b5e2fcd405050a0b1c3c3be95b3aeb32bd6fe91bb6d3b5e6fb767c8cb1769f6ca42408cb1d9edf740c3f9eb0a8e430c7978112c5280862082184538f060023110020302c2291070432d174cead2914800359885482464a168823d228c66114034114638c31841864903108215658015271d852fd8f5cdb18825a249c7da9c2d644c4a0a28955bf33b758e07eb5216765afd03258bb968ab37d6062bd11e28472a706902ca47ab247c5fb4e322e12038e11e2763743a4176026b24a7e01b87a3d5df618e07461e946487363bec3c0b3a32f91319e712edb88c5414a70bc9e2220c8e6f9ce4fc1f9c31fa940365cc77a199c5f4e1cb9ab907a87a6df849d6cc2d0b2f7224464a6aa11ad6f04600c048200b4f32f2820f170d1d624b24663d2cff411de63346f70516ea118f6a81041ee9ef2e17a544b54c102df55a09955812bddc7498e34a1de8f903ab689543acf4b4325151cedb354b00f8e5f92b05dd35e6665644df3bf0de1471164e472e185254af5e76941191f4267f7921d3d78f7b594985c6752e37a537a17ae578c385541a10bc6486c5f5e8a8ca4bda4ed533a07e98b37cef8708ffb9139d7e25cfed5e62d078444590c4ac76264fa3091931df9fbf1b1b7fdb9e56c64214f93fd888be8d25e88a3d42bdddee868e2a3911d732e41b058338403f45add53593d465e70faf330a2667de34b476a66842a480b02de7a90450a71a12e2a76082bef787c0c030ec26d58c4fdf735d7fc37a1bbb3749fc819d49d0e9f9b817031640974f6465565f37d817e01c23af57a023ad2a066b0f0a0391567b80b1e4c7d669342fe7fe3bf5fa730787d711bf081e9bf9dd8319bd89be53dabfe6e708a2a6d96fe4c379027b07088669088c3a2e8c7e63fa84b0dcf8cc0e6493782543ecd7c1c355eec13fc82e188c7789720f6cd9e8e36209a203c12d9801cc500e66a6e4e8afda447df66baf3073e9a7ff5c50af0258b58f3a002bead528225e99e14c46a6f5bc1a5de5a367eb62ec03764f8ad8453b7ad8dd99ff2e107321adebbd8cfca0757b47a0fb6e40676224cabfc1fdecc7d0bcc0d920ea5ccd2aa69b60b8cbdd41791e6652580d70c7f986f4dd0ff23c9c09b96c7c4532bb6c3a86fbba1722938e55ab209be4494625a0ab325080e253aacb61d90603a570a47f1467bb08c2fc1e5dbecff0c465911390d6b3809245c2bc6132d9c4da781854d6c3b14c2e8387eb09a9bf1332b0bcc006adac572ec56a00972899f2dd29208e0e8e61be0b320deb2ed01a8b8609771662de9009deedc3ecce12beabfe4c051768f293a69a7298392d8338cf7e446902313344dfd07a3c300e666b03cf193a0f60f3c1d60e788fdaca5680dc79f61a851c9fb3b3f9850d72364e43f802fb0752d7600651a5788e09ce5328ee5d1b03beafe65737556207847aa48f18b4cd44237cd5a3ee29a1bea34a3e611d77fa5b38c0278546c951922ad4005f6e0b4c98650a943d66b6a9cdfd74ddb03b0c37eff570c8bd33a2c3c17a65461818d48d0caeeffc2b5d8b2a0c859b3d3335a0ecbebfaa7d8a7a9b339a6a349a1d4f0aa908d30718b6b1432486418bb8c4a183b276fc72494c07e4de0cd2afbb4b5972d4c6a68632c2abb8ffbc80883a2fa31ad130bb17736d7857f0f7f325179a49e7f39de8f91def8f61c0b3faf6298c4ce565a87825d519912f0f97fb2629c22850f8cd9543d8f521c205601a4987a6776ffab694858f2759a6ddeb2b13ecabb26b2d5487dc1a572de07c918854b2502044caf1810b62378048c30b81ed5312ec1c8362977f2596716222668e4bb70676ea99c51a7d5bcb50dac3a72d03726cf293da2a622de702356086691c3e18d4b1228ada8bb8ce0c38959cc59296ac24631c748b3763f3308d70af0d2e87a1540d1a00ab5bdc4111be81146156defa07003b740d2bee87f8bb18f804cfffa55321ec608c9fb783f851829e5622424f9bfbaf575418a99740987be4b3214f22486ba519a018add4761d38a31f7b31d1474a51f069dd1ed47b7c3af0e406ab59f289901ebb861c4b6810286292b083fb78716dbf02e82611fbf17ce4dc151ccca3292534dd53f8e28ddaecfe5475af829d95b4bd395a7a8370b39678dac7161969b6b5edd0ba8a0762b75ba5c65dc6c9f76bbc53beea9ea0fd8f586516a4463c20a65cdeea2a5bb00584b83bd337ebffb029496085a9c433b7dfe100be23c2e5b7326bf3035050bcf93973eccda6cc98fb12103364f3b6de3236e033dbdbce1ddad14418d0cf4e9f37834a2b28330761cd17845835b8709fbffeea3c4000e8a996cfa2d673e17769d6f0e9e30dd81e452dc5c0c54e0d05fabfc271a5e2b71e4dfe41f04f1bd6c81e50b0d6419398a01a36cb0cea0b5b1f7ecf259bfe4bfe34238039b816fb4dbcde4f16f6b1c88cf0dc16debd0cb40a90414e30bf5fa92c62e9d666ae3ac3e871fb8c427c8c3330b9e9ac6417472f78034fdd8459f7a76c2e19807b286039f0ee276f85b3894cb73ee72cb8c247a19193e775b1b8b5254326fb841197f2ad537847aa35b6bbfd4acd1c63a761529945f5d0a66a55974f92034975143cc6d3d5b926fcaed0c166bf92ed6eee9cb3afd270091759d933627958c751cd63988c92ad883e55ba03f44d48e0ba47b1458470442d98495281e7c40089d26ebb159ba03d6f6ce556cbc5b9d1eb7df7d66d1ddc4277795bd10c0e634ba031a9c8fe95ad3df042aa7bf5b2a604294420b92d7a8f10a6d57f37639d5dac07e86349dc8876739052d3084a9276d94a559b34bfcc80584c1b8842b31b63bb618f549cc72bfb79f60889edd4b3c82bdf967d781b8a01d62a8839f723e68f4cc20070a2814bb45aa913aade9ae21168f9511d2dc1f9e4cd873863b4b8b10a34e8fc0e27b39d0e235033bd499cf1b1f72d00436bd15126cd773b53ae38cbbed640a0a578a75fb0ea88fe02200c02bd9daed02bcb3b690f85bebdef821162d47d3da58c0b2175a5cd15c4f944b849d2a9364c9aa90b43c18a6d3f6f28d9f15856352ca008578e7efa626a601035229d3f3e767bd397a160378a098c6f64a14009920494faf6f7892d336a0b79a16cfa96e862802da77cd18b37a877b9f103c18beed8317d1f8333acd5ba51ae0d25a279bcf47b648f6bcd245e19df2075d72a78c26b4cda656fd40ac03c8c3420a2b56c887336313b61138014ad4b92275495e76822b9457cf7414179ad960aa317d63a8f8724db19626ee1f151aa048cf40f0ab98d490070fcc441dd289cdc02d39bf2d881739170970cfb5a1ce8af261336da875e0acfa86039ddee1ff6bb477fbd8c09f9b937f6e6ccf3bac625c9177a4feebce9c2f56447e584238b2cdc456f06cd8cbf3fd5737c0a2f73c300a79a6f8e5b90ad669910a41a5e071c2946e0d50bf1de0dc4966b65d2df28ddf0c53491263802d220577eb39a5002722b22aa635fbaa521103c0561b531a50a8e32ca19a0ce2a94b8d2eda450f97c019c023ada1c5c95883a824ac8f3a9b7dc6fe5e274cbe46e54de7a369d66a6252c271cd54e0616283daa7e564e39a097a6b01f15dee18f43dd6c3462844a8a3dc1fa19e41a5b34f4bfb70ec2abfba3164d55f0191f703e7a4f3de15a2262b82b09af28d4604992155209d2abbec962b7eb96e99a8265e9eb6f7b5531ed33a2d02fdc102fb2c49685ad2de64c885f74c065faf78a5c07521f7441dc423d0b1e7aef528adc0a4c4e5df161d714139f44ca3039763c2fb23733c785e431775d11f86083b932f30dd3ebdf0d02aa8896bc5a19cc97274bb627a188a13069c0014b381069b29570c2ae1b2d07b0290e2cbf20333ef49988e242d7c0fc78061d569cb905e5c760c27759fc2d9a38c49ea68c2bb10f7c11d0e8770c38a0f7b05e84e7cc9caa315c3d1b5f84156455ceb2ebe8e3e23ac9e0e5a687b40171c582b1a4d9d0b611916654961190a3277ed3fd118384cd04358501a411045f35f4a4c53af2deadf985cdd80020af61520e335979b952d2541dc5c5314c1b46c03bf388de2e99507835138bc9f360d3b8764f26d3de69250b95337154cae27e485e991b6e1474e71b44a39c78485530a110b31d0466387413225f64a34f3a528b1541212d8aaf3a11ad76ceba18c51bb64d5826914561851e9455ffda5372b672a582c1ae390e0c265ade75ea435d72a3956eddd23746e8a4cc57a1c9af4f8538dbdf881180c3ef45b52df251197d4aa27f4c8781c31ae8762eb85fa73df961b5a4b9b5b450d073113b479b0de26426e35b080b80d85cc962c3a52f99c496867fb7a4c042c1f917c1b2e29dce654b0c5466cadbb556331d5f97a6a342fc63563e936c7a55a5ba3b0c1af7ba4ba55224a489b8e9a6e43a206b5115435a0469405caad0d2c772d9fe1e375fdc7dd9d6071df53480b2d9ecbc2d1047f8b5d1eff42d74c071ba463d0856b37ab8d885866c826cdebfd72618c885e13b2b1dc20d6472e3b234fd802c431949f8beeac3a5d2d00f75df632e980b22c5403c08d231e2a764299f2f16eb0fdb039cb28f9105325a6a3af6e6f9554f0d393c34a4bd38a0353c65cfeef4dc746b596af435dfbddd19c9cfb9cff3474fd423034efb5ce515a209c63cc044e6f875c08a0a867abd354969ae93d3dfd4fecd309afdfb7aaa870d4268875f12a8836b08a8605fa2bd262d0793be20ba0d84575fd427a47158a2c1776e27eaaef24c1583614afa197d7c07dcdcaaea8402865d34db8826e01244f6cb9f87a91e890703f985145b0a8573a1bee4a1d02b2e49e78607ef1fb5294229f3881edf906860b9a00d730a5cf527f28cd462537e751fb71f7b12a1186e9ee46323304e0e59b1079cdd9babe190fd256a34220147a1de9c01948014a7a8615e46e8b659ab9db5600ddbfde0d4d435e882677a81a2539688c51ed5974460835849219cf756916c0f07c21c931a7b9717bbee31f03576fd0d54ef8af63c71b99bd55de66093cc54521ad236730777059b39b6af10a28fb153cb6fe510097400cb4e3d2cbda1bc9b30ba3f2b75dd4b1e6cbb8d3b1c5b94d21948069a7d07a991281ad3f2f74c703ebfcaa43a12b89db7af3491ab01120fda86efb69f6a182c7e3565ea4a8ac5109407038a4fa2da2ffb8c419af5203fa74810384550309e24569b3f7500672eb87c4ad6b4292d53e5d18fb00267f9a258719436f69c9c6a1b7ec7a659b014f787f66903a58573f83447e219d8311bb8eea143218bdd10062e220490fef93473f4a6466df3136295ff9ecfeddd6f4b81c9f81de51480badedb2be55410ffd932946c3ec0cf36e97bd7c79ea7a0ecd572678ef0d15a401ebc097599432f936e5008bfeea9fea5695316e612e579365d966e4096a4d09264164f69c72972e8de09d48be479cf64fa08df13cf2d79452aaea2e43362a45a4228391efd06568858180e89c354d492b360c73772e6fb743d3c79bcb378083b8687adcbcf1e52bda617ddc08358b4ec392d917aa1f7ec683349af8f2b90575bd1048a9a85d62c85cf0952af592d21d1e49481d1cf194dd44d492ae2075615e7e164ea2970bc82360b556806492916f9702ecac82290c55fe51fd5b2f0f05929b74bdbf2bef396ae4664e52b56a16323e7b3e3306f83487673a069f3eb3f0687c80328d2d5a178082f20f104172e1957009eb31f0cac96de3d97a7c9421326ddd4da4851ca61439c3930c523d7123d1d246ba97ae1364b46883f698f833b168254cad7fca32d5046007e0fc98e342c52bac4cd94b2a8cb45484a3b2b3bbe188256755d2c17194629dbbd06912483dce73d4d1b2170194da0174e494fed534ab96e00fad8ee0b695b0b26ec2f43413ac2395088c419ee366cee7f87b596a5fb0b95efdc61a14b289856d8dfc333dc5c2f22b751c7fc25baa1d66fa8680c5a7cc359f59ba03e09016bdd3fdea7f0bbb9568a4487291430e96619cc9a8686be9d0493b5d534b5de3df8453624568b2b45645a2dc6ff8014a1bfc650c40d1b212172330b16850601035283bdcb8f03f4420659c7fb5533e458498dedf8114f6ea2b3e36be28d07b3f948a8f49b7c9120b56ece853a9f9f6f2ed82b29bcd9d3a94bced4581b3e8c257e159c22d95d7df7b48dcb932d9f9878898db8dcf88d9c087d1780e7b46f5fe9b43f48ca236125bc6e08f9ba64b69344190612b53a84b2a11ba15736f1f25480916e5641f632ad002d5124b4bd780dddb291f96e22b2b33a4f547de4b2eeee6eee573646f6bb8a567fe0b37509e82f735e666d94e942e62b3fd2a6944ec89e171224482b915a91f3b54054a2adcd408c00d66b41778aa297a6615d7a3f661265b035f19417116e2d0842a1b4ae99b5796ca23d9e2814bd7e6feb4d72f1a47f471cd57804675f0eb0b20e12eb1bdfe1c647c70175fa448a0560b4a17932342588e3253440816037696712b66865bab0afd171abe368c0d02a9171e5ad3bd895d78451f3aedc9811c6f6014cc6832f12e45a945d885d9e67509b4f3a7bf1dc1b18f892207b752b9b7b6e170c1fc75d06589245df45f8f190148255815b6d56d331e92f9807bf6a917cc75d903a3f6cbaaccb95292b53a318e2eb0e5bfca2b0d67eb1d30145009fd6c792f176b8bee444904610e6b42a5103a6ff4818d179f67222e8f3cc4ce81dab8c6a7a81bc7b5b20c4c8339c684aea0d2d5132c51da79efdd36eb9e5dbb0e0260e64c8a87e60b80371d4ba5073ae4263f15f669ae659cbae7019f7ed3b58222787eb73c4d24798bcaa62af38fa1f89f7a1a509caa18eaa7429145b735862ba697b312d675ef84c91c4646955f139fb68fecc5aea00b0758096678b4c10d2d816b68a38e8370c2386faa8a07c8c0259995e6e101b5322a783944ef113b848e395fce916960601c41ad7f62b94a3d5c9d086c8c4e29ba4782c11314568ed1af56c64297f5333245f058ff960677fd4ad672193b2f1e6aee3116c44be95abaab085916d2a5b2c5e56570aece69ade63397cb857a2260d6e344245ff7bd804145ba08a13e4226da89dcd4c0417bf1d0b83d66bc91cc76fb753c9dedf50a53f97d77c8351c7ef9fa876ab13a0aa37ee0dcd2a55f7b9a138bcbc70c1573a2b00af4a34269414626f80a222c6bc21ba05f2bfcf97a35dc74da9aa2c36b11f8e036e1392ad2dd74b724e9e68b9cb566f5362515c31461a547b63d6374beafb4bb5621892fad55373bd6a8a7a209d27a5879e31a208b1fc707a9af0cd957144850317734e2b633707e8e100bc5fa2e976e99bf4776a7887d4026fbc871773809666482240ed4598cc7f4a122f09c59958f598e212755b41dffa4f613b8c9605a1e4e927272797f727369195a7f764cd430f35051d5eb3c2a729552259166e1885a877d9c8b25875d0072ad3c25c14d08eb9ae3045f666e0ff0249eedd9d8ff4959f9345ba99918bafa8666a35f5062e60c993d2a5131568415f8649cf86f039dfafaf4c189101ed3525f0003c064eff94e42422882124f7481057e7cfe8744447ebfae088cc45db8eae322f87fbc9c7d4c7c4900c1bec8d02790e6e9a4c273f7ed00c0d4a5ac1c3dea663b0577e5725d4cb481eef014c3cabccd27deea069d865c3d6a090b2a8703ed712c4f352308493c57811263707734d274669f89a6a994ad58069a75b690ae8eb780c26e3c03cafd9bc59e0820d6c912c298989c51a5a9928d1a34effa694846841ef3e522a34608920c104e23655e303a5e156366a1887e37bb89411faa108f361192a1d5cca1e12a20da62c425aa8fefecbc98830afbef044fd6c58f0ee232431c28907710664bf0e3eb413c34a369878c9136b7f799d7117861cbad136e3230bd7e5388194d73801435072b83880da40df8fdc3b2c7f8580e90c625fef538c307d5150509c75d387c1bdceb9e3b59ff496f28bdedebdb9cd824ccdfc700eb00290c89385e2e1cc18fdd87d5568e32e3db0931a2dceaa2980bbbd74473dfe33d3b09010d6cc4f8638e22350a613b1fa94164a1081e6637a64cb30b8d78784dfc0aaf353712860d376efcc30108742b50e2364e5fca5230824539c6ed5344c48651250a427eaf4aa85edda3ce35a940d94806ce402f72c18e3e65b23701d18bfe45de13cc4294dc86f0d1196e930c953a9979f4956d62a7ee5e45bbbd837ede7d15e2d07e87c667a7459246ab6c6824ff4e5a44d7eccf2c172ee669647188ae788c4918d23d24b4db41b7e0f0b7d11d94e57aad85cf5ea84c59b8082c1f3b20d51bac9799f6b85d6475de715d81d580e2472bdf7b707d710816b8bed267c95d6931e6bf82091ed30b3fe866c68a0736f1164d98b7d3704ef0d2e9aada444f78f43f89ad5006d4108c5671ce0b7def1aafcd8c1a650c04bed4418bd488e079d720024ea6aab98047efca642cb1feb244293333307b359077ad1bef288fae70d79da99eb4e291d0bce2061c98a26f70c97334690a2d31f28466e3ff880f185b3e3df14db2a51f72e1ed24556aca3a1f3b32d5648b3c0a9b34ca52a0137a284e5edc42f02147dfeea68dcf62a7ef2942acc5aa7c1eae9c88368a8e3578f2d4cc2973e9154cdde8919d735254bbcbc53dceec3c97092145fb59ccb384f646ff7d7e32890a5006e0bde96cbd6bfc9ea88f07addab05c68ee90abb14a1c9cc7c4baa7474c14905b062687b580f08d08a7543a4f1a40106b3b22eecc3b4a1c4ce902eb1afcedf4012d221ea34633aea2ebdf3dcbe8dd840cd49ffeafc38874f3d45bee45f009b5ed1394b879554bd94c36f90061e47a246e9520662f45d09cebc46750ac900332839344b6ffc8adc5afc20fb9323586ee22aaeff8ec931c954d1223359e326f14e8e0f4dacb8460bd8682780eb7a0f7d4f74dc53ff3b1c7e258e58edd4db6df29361f1280140f4bdc9f4648e5398256877412a5668f730acf79791d11d11b07623de8b0c7cc8c9db5f33ea94f0994f1a8d0d2a52c0608e0bff66baa91111e754c1d0083cf44b99cdbd3e0c853b1959c72fa137e5418ffefc767bbc5f1fbafe0a6a061ab8e9c83e711736c4113aa8c049099265415bc9373a74058f84f9b8d5dc3e85e92633443af6912abd890078c3f4e8d44b98c7a48f73c3f406b92636e16ae52992634c663b6088634a9fdecd8186fe24b4ffdadc9186ce7ab26443d9401a59a3ef1fed885561612a6fe8215d957d05c9d4c83804562b386c33839ac62ea4d1ee27922451e522bfee81e5236d0686501a7a5e978a49365939e9c25a2d1b6f4edf272131e7d3a13dc96094b2c44cb1c627527a73ac68e053c71225d0daf3f5672e5eab4354a41ea4890035109f0c382d28b0b78d05c43f360b485617262423b5eb43640377161e6cf71db5f454639aebc021a3d0e3956248c12096b45918e143c8f803a1b5198b4d45142969e8c9f3ab2b095c346870fae99dd70c237479c12b482674f526942e32f8bf9c11eb983a6cbdda7737a5f15653fc6255c559733dd8ab2440de0929af942a38c01c261e8967d39679370df163853d79bafab2b74061a28a48c1adefdeacb48c763bc955df734ee45c875f71b0c39f8eaf072332f131e35877ea3ccf40bb20d09ec3ef1041514d0e2128fc9df35f63523cb4e9db6db064f6100d94339a93cf0f5d9fd67cce934a0f6ddef0456fbc9e2c6e6e8635c0db5aa7601e4f46e4864d1b6aa6b438d211c80a77a50a8f75aa41a42e9603639041987850717110cdf7ef0c56ede93ee444447c692f3840f77e814475e707ab25133d11820a71c783cc679217cde58f11bab413459325a41d147038b9c2a8d1e6bb07c63cb710b8a5945ad8372e8445e05352da5a7289bbf749e10db6a821f1ed17ef50da9fc110469786f1ec42aed12ab7d4055ffb9b740f96786874506cfe6cca4127d67e0745f04303db87dd05eaf3579a2bb846000cd53df45aa46820237ea10c372a71497769ef1439770815efb22c98abe53fc7790ae0309b437da44b0074f47446a1c31e4c6b2b0b53865cce31c5ce692722b578a99c83aca663c19bae3354dc3e0e646488dd9d79cb8ed49c31cc51f30133886a23de1b36db6ed903cb672637b8ff7ac44c1316e0f2533acb7c78da1713df1411550e154194ff5b9a1f9dd02192d4c54e359c9e20327d6185234179cf7be2945de302244917535c231847ce6ce3534bfc3b2f5c3b1c25eb49d7735753855eb6ba4cf77279d8349b58411359a597bb688154a711c1427afcba6584d43448b810d033e69fe9fca0b0f4a25c2e259998a0f5ddf971aa1340161760949af3161da3bffa9e2f2074baa88e2c31994240d4fb1c16a073f3333852072fdbd6174cef0df7e00dc02368bd0132167cdad2d970a355cd00ba2509fae6a3e895162094a6c87d1e0263b27e11d742aec51ca3d24b412008b5db5c305bf337d1384d2a996d55239b5bc1398cca4e030dd4721b45e510d95fa72defea9857eed6c9bc94f28437ebf20902d04b6c7460822849c1d01a2d2f1668794a901aaa60a92f503183079f8af0b5b9251b4ed74ce2b104691d891b064e943ece418b513225866ede2f84ee57949ba0e74ce7638f1938f78522657d0acbf4223b48ec74649d1a1c9f5035d178f6fbaba9de4e5d411b96b785d310c543c52595c865bb5b047374669773353b364da05da834048433e3a642ee09b6b4f993196354fd17fad8e80e4e5bef63f0b9a948b0c99a02b85b883c104397b966cb10836ed71ddb2ad417274df520246a2214092e81682d7c41be829ff276b76c812351e131d3d30bb5fbebfc2944b521b5273e9c17f5000246f3a740218ae7fbb51ec5e7967410f0370fe77eb59fa5145c2d29dc37aad3dd8fe3faedf0856fd9a6ea815f50481bf8452f2ecbc8f20d81c843eca53fb463e935840ecd83ebe2400d5862ee85e46881c188ab2f66a38a0bb5d84f195e20d8f341820d7822852f62302502a07f34f956da013ab86c6b28aff31543256d82ba351de702eed61b67727712efd3727c0c1eb608bb802d7d7a28d2269cd7cc3712e9d5341af0a10691d03837797f5430f271a849c33353524755c5cfa9c12b43a67010b55d3beef214e508bd157dd2129422582a55d51d475d47c259d4b77929c9c926845bf7903cf46c0a5fce344f33ffd2d56d8f03d503c9a73e92f2f762ebd9ec648a9f7eeffbde984f384ef155287b8bc5ee89f3b8f266b5c867ffb05cd2ce67c77d72ec7c31a5de4b2b580cebb1330d4c192b75db6cf3158a10f20bde986570976cffc3d9bb805e4ea3cdb2f3b1cce59f3680d0b9bd56d07e91f3420b1a46f5cd03df57791aec25758a080243dbf12027d7ec1f3f48cf5fb383c85074eb05ef250d83e486bc2e876a9a20db890a53fc92edf12225b2f435278118c295accd40df7db502392b9627a27b4ad9f075bd43a4a1d8ea9e085c8252ec7bd1e847d2361f33c8a4e793bd959eca8e86312c4ec09246c16cfd24061de3fa71abb6d725941f53d9e95ae50bbd1074f3eb60df802cfffbbfaf0895ce2904304700ad7acbfd927bf578e409dcfe6fe09a061657e9e8b4efa362e89c8d33155bc4a8e0afb7855ac7da70aeaae4ed420f25acc434ee220f8a8aab0828e42619639a1bcdda3eb1d0ab81bcd4ffc30727271f31968898d65e2e0513a9a4fa83e7da0f13fc801beb2194b1861a370be0f0a9fb4c7974ea65a1cb330764290e3a53fe76713ba5836406c7ddda7624b028cc555d84e5ae1bc8c205466e4745298d1a3770324fa7504f880959ffc42ad579bbf6df472c412fd626823754315336ef99d56fbe8c2e6feb798937bd564e93561eaf904f633fc9bcc42923c827e3ac5c34bc67e8b1019c571ead34b2149edb7c148c2d03a65f31c051d74974da04487b60677c615de5103b833c069a468867a1cc7aa56607b007bedf71f481232e9720029168823d481254bfcb0b684904a41c91a939657c06489568b74c6e8494cfb6f739762cf4e7c375215a2e06b48cd2093b0d6e07f2c01f73da1bb786a74346ee3599494fb9b40dadb3967ffbdb4f24444ee447f3d05c1266c4234e14b66606aa5006dbf8524573e0f76986507e6b80081d2dbe791cdfa01a541509b338e2f86df9b717a74776b26bb6afe59766710a05ca2600f5ea612f6dbc1aa0e6c61a14e92441804cfe7dc4067ad0d1b6937f227e9e14dc6b8199e7c83ff2409fde1414e328f1c1a0210fc8d26916dbb5a2f3c2185070a3f3c9303bd70ef7a6a2bbacc652e98f63615678963dde51a0102ce854cdbb20b6051be55557eecca3ca0589e366590874830235b15c797ecc66f8e1ca7c742e105fb2ac7f852424b1186d7c3dbbdd2dd2f3fad6c8afbdbdf979078b5ddc3874198d44582997bda7b2406977afbaf1e6b9c2b3d6e302b8b037d5be456c838c967c6b9b9ec93f9a681d091a77443d5a17b11958a0605b781cd97ec3954375dc731181cabc7fc6384f1340f559605e0c60a55d8bb8430659c1cd68df11d1036915cab1a9e6d7453c4755ca2b44479a75493ac35c09890ce69bc3065b567ce157586956cd6973e3b8bf8fe3839dd1b3ebdbb7f49df296d1ba8de5744f58e6834b37a862b8cfc1bd94e4b955927b913e5283f256286194273f07cdc633372f3d227ace7e36385ad83127b66cf5477fd8010de5d1537b2bc34c5fac12b81411833af3cd812cbddbab0284b34acba2c342a1c430c1d385aaf4203a21abdd28774512e9b0230fa7e569e9f8eae33b6a96b9eec9e433a72e6718ed5377d9da89391ceb6d781e8ef85a54c2f5b02e6d9ae94fbbbd0c758cbe36b4bace85acf6921ff3980155cc36c21a4d5c1c1519dfc2666cf26caed26ff69c34c86bc4b670dd31c8617e72b157a3dcd81919ecd769352ffce37436cb55eb07ef972fbc86238e30cb032655203a39ea8f56e3eb78e256f0c87ecfa0e17f631ac7f325b33ed27039ed1d73b9ba0d378f64c31c149ec78e8e9f2a6bdd7d29ff439305f86eaf6c6fd3dc6f61e89f7e675c88dbc2d98db1a65b19675029569b4bcaceb4f6865ee5054365ac45ae2bd287392bb0c677e834a6f74dae4bf48d9348e632e457edae613438c2b9e009b80f9fbfdeb013265713465278d636f0d196deaee4019dfbd6f4cb89979316b3a70278f449f1afda47ef854dc2e6728e1cc0bb555ed4141e71589a8da0881b03551aa67b2d926904e0ff8caa31e4202e44db0d107ccb6b65453e03a6367cb98b2ff9676274c4b49266413c857f0ff748f11198dc5311f96958651a613020285dbb476df844868297326b3bc21607b7bcd2b809f09c4d4cc6c92572f12ef9eeb6199525093c3ba0bbbb5b60f8cbe3c65e5195fbf7caedf07f4d091ee4e4ef42686bbf13a6c491fbbc1f1d2b484936a3ab3500b62db2de7c59bb77164daff612380f66c3b3220bb1ed3a1eef1fc8becdd5e2cd39b8a1298e851048b35c465151832fbc3e7f50d91df698f4d0c2b39c7151b5599796a2fbfba04ad9f986085b786af2f19ae7d1e63b694f46fd546405178150cc84423b6b7dd6a93c2812838cdf758383cee0f9f622a37dd1bd420378dd2b04d201f5d99d0f7412aaf5a609e79846342fdd91d204fe2d55fd3645e91a3b81112354418d5983c259a0695fa004de5e6b8960588eb4bba32eb8df1f13b38328e665a2c35ccc5b3af9323bcbed8954d21caa12c7f46fc7821a00bbc611c3a5d914f478ad7aca9f20ec6a094073d4e1f33ba518cad1a30e7bd9eeba92ecc01414bea1101814facaf25f146c0607a96b18329ae2e32d501e81694a39d4ded120fab44473715c62d078c0e9250fbfae9c38b251d7b445cb5764514da2f4f3cfc9df36fc366b7385aa2948805a9f1fb2d1a1b2290b281cb2f66f63dfc7220911631e33cc1df112b7f09ec3d2a8dba8a803837652a30b9afeab85238f4739b08de706eeeb96762829b3cf8c7baa52d61fc28f853e74e868b31c2d69c211a1c81663ed74362210ae5ad7a1921b2a8b417c214de270c19adcb13ebbb5c7d1413b0308e7f8206ea45b31c054e784cb1d927426ab5d5368b806569dcfc811217aa99864a9256c5b00c945e58d5189c395a5112055adfa0e551a20940229288efeb9d2184405d3ca91b011705f5eb70910027fcb49cac063e858afbc2c0c556bedcef85c71d54eb68dc84dbbc1bb09cf1d22bcbecdedb09f7a33db2b1fe12701de60c56373305e2c6041e423cc0611df727a0186389eb0348383a866ff607aebe5aba9e7952f56abc32cff428ff94e4d6e153d7a2d774088bea021fb1ed93588a68a2f6e1d66e884e07e460e0f7651743d14e5cc0b4404ce3fdf7d4fb48d52611fb298192be1cd60a70bcaf4893965b07deb47cb7f3387ff62a93f396b0b726ffea1e79d23e92d39c8b83bbcebec2d86accdc42ecb08e1208fea49b96ea3ace8b1a2d23973b43c3af11af6ca9a1d1c940b4e216d27fca24b95a51f79583c8ff4ec19b3320c45965ed073691866de57712255c5e9ff9fe7dddfd6b22b400e806a4fe449b88b34fa2e155aaef3d20ff356f899b976a514f91bcd49336431efdae40a2ceedd2eedfce523e15f40817fea2ce1cbc89a9a8ee3cfe47fa624c81b47cdef97367d16b4ed853dae413a28fb7ce509207ec3610e99e2b6738c07609c05fe130123832f71438f09057745849b97cad917b9fe00c34d4509f672718ea17f1b881d82fff208e1b8abc7f33ceaf791919c4b6cca73cfb050023132059ffff5351f868c81c3054387c48c2d8db03119adb11eb31bec559e5ab4391d870f4c040c49110789c9e2f7a31eddc15162ea6f00fb12de473e53b4bd40e79cf43f56e56ddc3a3afea069edebfe3ed33b2a240fb74a6d4aac8a810d9ff43c54185be4b454dc74f68b5a06585ed793f8eddcb72432114d27c66cb075bd05c31e751a3ae38ec1c4c26e3928c58c65eabc2a8de87869d1fbf8e6f3ebdbad1b482be75abfcdb169e9c93ff7cee5981f290cbe7a32727edc0c79064b211dbc3c472428cef544bc7cfef416839e2a6517783c4a892cdbbdc0c386e8564f8e4d9d5c086ba284a5492e77804e1ef2b23f005e536b54dd13fc7fbfbf08d07dad72a710a811812cb6f742cbd3ca4c572fd9e9d91e8c6ef02bd143d050438dd1b8113b1bdbb6ab9d65fc644d44e0e5e13597b6f73a4f3d8913637c6ceadbeef2f3060bb0afa3e5c53d2ba4b96c870f3b4c2913c9f5299db2d88e8938927ab57a7c9b4f67674677d209d3cf4f45df881b42b674f6b0fc49ac43afe0fb1f093f327b56cb2c324c35f7efed09a209f0b9ef66b7cd5c4097c2b6f79177aa5a3fc27d9d5194136efd8839b97f50f85eb9e12ab6d7575d9bf69c1a6aa52f2852c75806a4ecd834d67d2203f8b6688455c809984dccb291a1d54072df02e48b34336ce67546d5af0da829732fa50779c93fe5ea8c3df85c08fdfa8bec69074251e424669b3b7916ec4f0d1538301d7fed12a4ced68606159db729e06242e9ec32020b06cf4c85fde7275f11a7cd3e3898f36e1434b6f134c761de33fb22a15abb6ab54f319fe5787b5ed9d7ac7b85ccc20b9a3bd4956e6bef1030c7aece39a58e0247346cf97df655d430b24be324aaa27aa33470e69fd9d9f188960c410f0f207339bff60f1c12b2e521d094301ed0ac9f1afa3100cb84d7957ec802998355bccaf20df1f78a541bf8865df94389443facc6b1cd3f0b26bb06668ec7c8bfa28b7a40dd2dc05d35feafa0164aace098e7751125f6bf42b66e889b3577889981a380d5fb111cc90584d3f0fd8f4051940be82748fe295451d36b5c4bfc60b3eab5162855fc512d293ec875e9ab6c4d66f2ea91bce7483bdbfd0188f85dcae69196b05cc46bfc0e14a47cb15dc5e38c44c4af57b0babd568e9a22e7372db49df8d300f39b0dbcfc9f51f792bf3c4485290ef155cf6f11bb5928d987bd54ff78987fdaabcbd6f7f5b58e73f5f876bf9e2fcc523e953bedc73817fddca565b3dbebda565dffdf035d02506c76fb494243daa7e7c1826292a1fd9d94115fbb5a73af281b0bf258d5ec8e5196943329a45406c610b25f7d411588cce814696e50f199232f449268eead939535576dcd76729ba426aceb55b38a944c97051a6f0704a5321e85ea2a1a9bb977002af7c33977c5ad37c97ddd8ba570d3728886176ff26d1174f2c56ff152d6630d81f32b3558112e0e1f2fef9c0f6d56d884ac0464aeea6873016f76b36e7f33a2574f6a6f72c7880b5fdc9dfebdac6dd7f3cc375c267106b45408b83f52a7b860e608537131ccf1e7e4fc35dd6544ecec4cb3386fd51bc41823027fcc65bfb23a9db783260d4ff528e72ee08f5448280cfe87113c349046066e4b0b3145421eaf244e9ed66b8b98485a1feef80f7f9a2fe554c44bc221c41906d00eb61305caf39381797111a2e8ef2578a34042974ae2b91eeaa3436f3d8a2160caf2eea2d93f3cd0d531150d5b79f8c1669a8d07cbab5cca815c8930480ee8065d93ae92fdd85a459a7e0ffe43d704bceeef08f2a9cbd23b72ab8c06ba83d3cfc69482d2cf789021ed926b0c48003d3c4c760acb93c5ee3127876b6066337d423562f5ce0c3cf84b7952ec9f6de24cd0708f453b3a866b3d90a1357993ac968498f7bd6e62a8430474658659019bb3f0c51b29eb5418ed04c261480b63aadae1a9fcec69e28fdcc1fe42d3229b0728a49021c97135d12a16fd870dccec6a8a9c37daef55b95838732a5a195e8c1eb2af6ee9de7cf0f67e39fd88f57f47deb5193c77393cbdb80f740b8878ed7d84af8540601656f7d6aa63a35cba4780bd6d94d724b47382489e217ee411eac49adeeadd51ee3e9453e3ccb14a107e38eb2ce658096d7bbb25f4944b1ff35f8ac166ae02e02c3c612295865578a614bfac76102072c4479ea547daf3570bcb3e074c2c0731efb2f339b0971f064f89d12170d708aafc1a63352ae21956d4eb5af8b5257ccf2e17d8b974521b6954dd3e21e6e63dc531f80ab46c59659e092ab746e8713c52b81713119fcf05c28cdb36d34cf04f9c24efb9c39490d19928dfea17363a6f39e979bbd99935e7c7155abcfc512096274084614493434a6773cba0048cf0dd4f57527b6c17ea873104852c1d168eb4e673de7e43da5a06cf2ea360869aef6fd84b63c83e5fcb5f3bfba18d75d6003a8615a7d22751727a1541ec82bc93737fc74cf1500d96e003bc9f70392685afe1b36fe60b603aa2afd0d38f571390e80ded1fb64a24d97677e48cc5848d6c46165767d45eafa6819544cce4796c249c76a5890f08c9580723d0b9af3a33e90f70ec9b86629d57bd6419826d2783ecf6b987308aec5bfc280a53fec1052a974cd5ba207a0acd06c35bfb3b1e9cd8dfdd46546f3305c0e8af9c075eb3a42d7b5acdfc4c0ff90ed42420aa434f3b19b5f5c23ef0d8c8a0b0fc7520860816eb05ecc65875e3e05dbd018a9e6c8a00f0ee0826bfdfdac58cdcb7cce1bb890e01ad63a6d1d0ef7af97e95ea354bde69a94ffd1b48a757060b48c6d0af0019174eb159135e5f4691dea3cc3ab14f0e311d053b6432660f0e65bcc744ac6942eef590217bb2b262ebb488e080144c08f0ab353f2e7df61680289dc541b561d3776a25bd95785d43c6c0e829b39cceb828fbae08564d37a4c80ea480be6dad9cde8c30e9fd1ca207b8e98074ea94f566d696695ed137030345eb29e4926813e1851c86593b63adde3162c6b4fb770486ad106eedccb8908c3697e035e0833e645b9a2a0d8cc12d093e3e48f07de459cb6ecf91f61444680137be2c564d486fa7327147bcf5e35bae13e4d13e67426ac3ba500ea65120a57b50a679702f3e24aed82d777d802f2f01acacf70bd842c1d82c4b9bef68ad50328f9d4c8b4314d96ca076374fbb4e404e8b8778811aad7de0c0a969c4c636171569bd5747e90d2cca245b3c56ec47c5c21b5ef28b6b23b5a504d2862460b6795e2aefc87132016ce82d944b0ca85a5f3d766f3dbb2917ef8d4495ce8a83a103e9f5a2f3a50f1e15a3a25cb44d2a4ebfc03ae593eed5b0e7c256c2e4021fd9056bdcad2a5b24522fcec3ec1f17a5a121ba25cb8e63fda5dafe5fc27f2ad203e25d0b70a3729a80983e791e4c7aff4d3681475bb64acf0da1e4d053191ec960052a2223fa1be3ab3cb875fe16cd7e5cb3c66c8f53042ca0bb06839d03c16d7343c8063f00d9ffb0b4093ffb8c01040963c5acd2808187dcef78e3e2cb4c4b375509a9570fd2e0cfa7414a8129ecb639de5d23032d59dd82e5012a166bb40289b0a33b65c162fc5d965d3e6b527e65302a76e9000a57f1f588bc0abaa29cf7697991665d17b454cc013c811173f781e97ef4f15ec51e7efc9e6f4975552c096807f3fa092d7b98563021ede2f3731e7a5bd4a35b9df9a425a382d3034916ac2fe6406254e02a2c2b66d8f22110b59508ec318c50e9afc71203f7a917d8f05289cba6659b200996215e9dac8060bffee1fa2f0515b87689f27897260315cc06cd4fd38e8557994eb10ab87947f373457860cf582399b1d4c66c3e67c1a89a16e9ec8d492e3db3e7d57e9cef1a35a176b39dad4601e7d0f86e9951c2551ab03ec0e5a25bc10c29e5fed73ed51858608586d2757ff152c899b459ec8a92fdd708048a02ae2e01754493e0e40e9abec284b6a137d233411ba592e00822111632164b6b2b7cd81355111a259e6a6c8fe7d566bdf3ae8f865735e15b1743a431e24d55a1efe7a3c20efb45d55fd1ce7664a78712042abc54fe28aadd4b891bb5aca8c415727d69b148ac530c863996fcc16516505a52c17a2fb371a3cf9e29e8f7a266e531eb757d8441b5ac3d0cf0c7f4a608075d755d445ea05b0a9be7c3941840cf52e34de10dd25d3e0eb1dc2a3f9c49e2473f3ac825bb5824f1a71c365ce6948c0af0dde04f4ce638b077ead7e4fc8020e24f8f9c48efbc4745ba709d869185681937ebaa29e2e502d7178032f770866238c5777a104d3661a4619794ade199073b3a04505771c314c3ffb1a30855e9c2237fb4ac52954a59c44f9d751f10d4191e98b71b7ccfa3b0198a35c93d0e9a3119be5edaab24ccf13ea910b863ac89ab20454dbf42e8bd3d149d3d634e7fa34ebd6a57878608123a103ad2e7bd138d5b2e40d490f6c5447aa399f2f02fcbec199e9abc4b727308c66ab44c174ba39faf51908c1f78293c407473f32671a35a010d4e4d37a17b84560ad0803af4e03ad99bdc0b05caae9c6e941ce53b4275a1408be9501f4c136ae0ac790dae2c9df7253187a54ea71a527b1a4b740ff8037ff52172c3a56881f1120ebb9b5f39b7d85fde4a8e385ecc46981307a13c441d0c5504c04a24cacb6cc1da5b1bd0f9e311ed6b6f6e96e0016d7718c6a87733228cd3fd05d84adebcc15acd759425a71b6bdfb1d6243e86cd89be3328f1fad58a75ada473e12b757edb3dafa586dc85b9bfeae66b8eb275f561f67966be86d55bd3b28cfa17ab320ce184aec8db9bac37185bc39a0fc500e1bbc7a8fd97743d467816a948c0322da96f71bc4fa21b6a3725445b71ff7f6342fe81c5d8f25dc748b6a5bdcb52d0aca899dfab8941953bb6456c288212e1fa1c21c26bb2769a1436af53235bd7d7f0acde4e433194d069e26bdf8136567bb3600d06334ec2e003658f9595727a2ed38fbd94dcd37e1ecc08f0e5b8ffe806d0c319fdf616a76c6040f26130fd76313dd72fb2fddb7ec792a5b795837e5fe7c819d67ee7797dbe035db219d019915bb59e85989690ec66e31e061e0d365882bac7b8463ecd8a5619119998c15b57fe634b17d733b098d6fb5bb24f4a2481a0460664d93a5b45bddb5b137cbc2f404802ef42c13933666d9346bb821216f36eedebeee68915b089ecdf1467ca4bb2ef7efc9a65bc08b04f3965b7cfc4db7a9ac58b4ed212b8506b95ef32a93953d2a79c8d67ad37eff9ab4d82751056d9d7e92e927efe967dba596c49007c46e60b39b964b47da9b511503df3f9fd96603bbe683bbdc7d77c35fa14b9627f4f970dbcf39fc67eb8623bebde977d2c646bcbddd4c7b90a32780557103286132146bc4d71683b9ef3b55254c7a4cba6d7998f6afbbf2e3153afa9bf777c269b40b2776fd3e210edcc635df649a3798c90d9faf4e58761fd6d9fdce98251c682f725f99cff7adb300b35cf821c0f16b8c23dd81dfa3f72891dce799d5133bc2150ca379877944d2e9934b772bc2ad3ee04749f6d762f6deed554d7e420590ee189cf7e9a67fbe643f1a556fe26e3f228345e35e6154c0e04ca2e7116db3f5a992f362c663b0d61f5a0795853b9d405f2b69ec5cdd7c26e75ac9ff09936f8b434fbd6c74f4fe621f64f678c518390527319b759161e6233cd4a96b31eea67fddee07dc606f23e8ff850383d5595b971ec01f2cdb2ae30cccc6bc9ce0951ae407ca9968d87f44af0b238e0952911d92f24e3dcff2b4c26fa92bfdc083c0beb1e18fe6e90cacbc1e237f5e08ea9851f2bbf073cdbf1b9354c1f8df33dda1c6ff7021df8b490a26ffb70c3d2a599ef3ef9f7a9f7f8ff5993f3cd37972396f2685b85e60fdff31839046f02e078ac0759b528431403376f0a9d1d318f042f372f4165d6711dbf57c84848005481a6195f13de6df4e801b424d634d336a741e4564a82c4989a1bc1b63aaedd924c1d95a1bd20e84cda23b5d5a5b5293070d84c27663749a17fd80271ce3c893abcbee385d7ca97e83f1555e24b134f3507a16f2359039cc619201735406dc412518084a46d15233c55a0c67dbd7bc7e708007b7f1da4a20c87f8d2549e961ad0e0b4eb60e3f24fa08ab06bd88812318c65ef1211cea73c2a8e6e7466b8cfe0f087a46a07daaff4ecd4fdc018bbde1946a01538def08d2045f60ae09d5a41b5b52eeb66c060fcf3c32ba4dafdee511098bfbcc7383825b1e7998b9a5de36493bc84d2cf9ef569413a325ccff067e7d2c7ec819d3b0bc43b3107190fcbbf57397dc549f1eaf7f39afd4215ff71d32aebcbda4b01d598673c8ad647233b6ec8e8aa409c7a9236b154f2320e6bbe13a4dce7e57615f2b3fe32d6bff61e4a2fdb1865f71acf57e3c900d1eb0de6ebbca04b81d6850da99ee7e20999692a76980f338a5e05fdb8183f2b9312092b302e3fc30a9729f71ec3a3030ceed3034d2d54d0ad0b93cd642bde334628b317c09f755b4b63fb13a2790336c2543b4bbeeafe35b5f3e58e6230d1140c461bd33ae5725b03f6e9d3131eac2e543e425a75ee63de630392146a69a958774687da64512aa014e95011cfb5cb2e1c23dc97c577f3d5822afaf249cbc72d362c129c49a15b32b24bc07e606f7c0f59721e5dc208ad1e34fff00646c12c6dbe51ae668861983772fff14da2735ae412788bf29252ec274ff30479e593a594da7211d4e9b7eba0243f0298bfc7d699ecf5006fe89efb22d5433a6a24dd8f729ae3d02933fa4e116cf4416d3ff1c1aa7ec39494aba7ebec675a9e6b6cff3c5c51b163dea5d3e8f510311784af1e0771a516673c80e46bbd9df4fd82c903c43da60a04d8dc56f7cc70637aca532eed72f9356f833f3e6f6eeeea4d8155d262dbcba8fe08f9066411be0962bc21868107b82fd251bf29d0ebacc754201ad5b5f5ec56714f05b5c9a3b0ef1fd051e61eb347f611fc3ae44ec312a16e1a1d630000d51751f8b02b43303e075507ad06fe13eb683fb57adfc854722f880fa03d4f41f7aa4a47b90ed4426e7f7d994b6954d4a0edd9efc83e51296967b51680bb6ab178a1a0bf1da407b5e362159d9a52bffed461f183724aaf7b74dbeef5b14a167322fface4a04129ed15595c969b59df05cb487ec4239dbb4b09e15e85f65d5db25e89f0019ab772ac8a76f5ca7cf903657958a8f9f89dd03c4ad99427084a51dd7e978bf31c11e6430c7b7435f704565b772ca7d58a93eaa9d4420d9bfb3f0bbc583cac1c681581ce7c1597566804ee7ab9636bdf114a0bb29f95367f34b4d9302a18433b62684191f452f046ffeb323b5f3ef61d3caed9e492bdd839c9e19ff7c28059a83969132a79df7b0a8505c6b27483c35d5b9ca8dbc32a56554d5a6e662153ff59696df09deb1371c4c2f201e05356f35821a09abb047ede0e1e80f106ff81b61c0a2d5299a4dce33864fd5c3b5ba9a4031d4cb07eb5be394c012898e38ea9949ed6a6ae1b3e4b2b3c89bac2a671d9bfee37fe9fd4903288995a8ebe6996f2e8e1be18d98534f9033d307a94e87bdca35b0bcede67f5839b13d0c53f59727e2ff430e99809c0dadce7945148112dae8b71542f9f93f7affbb1ec421a4cdafc5db230e1af549c8732538234ad536713c61d87c8235ed11271b5e88f94c0d326c7b1cafd2be945c1e3fc85f5e35fbe5dfd4670ab01ace5fcabfce231c2aa1199e2d0ba09bc42bf6475a0bc5ea08270ba078dde3dfadb9b745eec51eddfe5cbc7d25610f8d1fb4e21d61e4c7209ea92e4a3377e8823a9db0462ecac81f4df6bb06ca7b4a07f4627c59ce30e45e49c61f6226061ca1dd7e02f63940dc09dfb2bfe0cb0e7a4ff381b1fe4ac80159d33aa19e3b469e3d0f9136562d8c0279cc6eebb7f7c8715fbd2b6bae51342731309ce0ac09b98cae7be6b719724f63dbdf0c4f43bdeda9d7063f6de3283013dce62254ec1b57bfaa3ba8808603e4b970c13f6a85a09fc094153d3d51dfe89d95298f1cc719eafa597d6bbcae6b61e500f6197ae733eb54c53eb75f895cdf56d837d8cc1400fa817d14f0b66150adfcd0a3ef24f7c0aef24532eeec4033fc8c64669f9b01a3d04eaf93e534d68a0319c2cce18cf3740721914cfe38c4e0e889aee8eb3250a521dbde68136cc9034962ecdacea2f9cb0c3d7fefa3ed30aa217df0a4b1b63d38e70672633ced5e9a034f54da27ccc671b3b4f4ff5f927cd09cd60ff91e70d324396776337e8f047672e4957f342d4b3de36fdc65cb7bd9c82f1e7c2c1b0d06ff847c8bcff3c8bce5c1f7257dc67b71a96577d6802c702753566fc78600210f1ac68809eef7202dc69ff618225fde24605493ff67af8ae75f30bf5c23992d7b1dfbf43b3e3a8ed4c2ccc624898d0fb3250468f518f161be345350190596af86fb92da70a442c7f253599d5c90ac720ce62e785488e39d7f5026cc3edd7963e8e3d145b668d280fb0b7b8b852a8d70095d5270ccfc971336740583ce225c6399d1c87cc5e2eb6d62d39e3de2f84f1b96974cf6dcdbab94bb0d9c5780e3d0a825f2eed3c90f2c67f1de47ab5dea585727c1ef5f7c55e76b348906cec53243ed9919d1742c7546573b0aea02b391df37df1e6f558ad68e645c68f933493112b1cb9ad764ef3f2cf54c93fb58a7fb0a8b3af3a0d507fb0522b7e0a18b70d771e551ff928cd0f3d2b8d7b3b7318b8a706c6d2ceb3f6fdbf7ebb1561e74fe27996f55ecf0995c04291576ab2e31e74d4109d0131b337d0b32952b346bf4b295ca2c11037e277432c4bc82473e58480b687e5d50cc1c2dab472e62706b7ddf12e7b33b985bd413e84645b32eb2d5f33dda972ceaa0d0b43bffa564c66bf63d35affa07a6faefda369975e40c32bdab297094260152ee3f7ec294bb1c0d40f7701f0c7b5a7ffabad8228c4b50ecc4fe01faa7449157c9ab452f8ee655dfa7796f7b281e362cdaf87ae527bc32ec19e000b5ad1b6498cfb6d94137e5355138514d228d3882d4337b6f0fffdde417dca605ce9f3aef5e8f2e4f5bedeb5bf7fdd28785e864c766c375e9372014db2f4f142354b7d936b3461e94a62a27863fea7b6c96a82e686cf5f584678313bae900cc72839a2cd596b97e9d9537e3a41bec98d3c8f4138d7c68d2d2b8776f51e32c88ae21c8e2cb47829801fa7b92adc2abfe808a043698e05e709f60a8246f734efdf59f23f7f51838cdf443379e1c7b7a06420b47caaa8c38c89169c934a32d975f3ae04f77ec28a789f95e42763e71c54b6bc9f5cdc1b13023938d50738d730ca5e3607a148f9a069cf9a9058c42bca5721c1633f7f07bc0cdd9ca38a49295eecca2c72442475947bb92197a7870378b601366d9ed7aae0c78793fdcee52cbd3f2d35f7322e12e688e290c56eb4a582a2d0b459510fd3422169135099b8a8582dbb8cc5617a9520f442342522908ca301c6a719c7228107dd6fea3f5d7450595e1e3d27d1a7868820159bc1c0064afe0976685a84523dbfb4565aec28657014ba195eeaedc8e7ad32dad8dcd205311f96f1b847781cbd82695c61f8fdaeb2ae24b5cb32118888e311b9c0cbece2e109ba3da5c52eefbeef5bbf7a7f559180bb998fff549d6109bba27196d1fa1fe2a6ed47fd5a8aed6b0febbe14c908ca72317b4e5d2b3abca33055a736eff60b8d459088eb85f31e6acf38a4c8d1f85691010141f1cb769e4bb93cd3ade7b3bad1125a3a4e1ea15a71a75a0d8aaf0dea0c8f11a9bc374fdbecd66243be190bc8a6a86f2c42dcea6e9f8ee253d112bd8206f9735b3616affcd374b5e607d3dd4c4d895fd479fd7d72752e24680c3dbfdcd94f42d8a3b55b679d15be8d2aa4397919e365744e7a377f84f2a2f3a464dfdc60a581af3e4cb084c5d651ab59d41e3b1d93f345c33a119ee708fb0b44af89885facbb7b1be83620500a5bb5f69f4f2f573993f78d7a31fd563e26cf1913035e3bb383ceb7391d1b68025813ddb4d9bab82f436ed09f106db14decfff9b59c3bbf06076fe725078f2518fb984089cd6efc40f067601812802beac1ee432967a10160cbb7d1126f19076811936476e55e35f9322ec621f557228de102258fe707f4fde92d654372846e49ca2ebefc6e3faedf7fa18c452f9767cbed51154c18b1cfd2533cf1b4b875bc4ad0bde0c7131c7b7728b221753700c931e1d67ebb93c695e775128d8b22d3b335a53863eb693c1bbd8646502f7a8ddc334405292413a8da47b96f2f8bfb49880588d6bee14332f7dc37fb22adb0acdb05b7fe457fa900a62493523450c872177a611593fdff8869d5b75a0a40deb0a27c4d43e0c7442485ea8fc17d0a44a10ea3ef0e9a109d0d6090223f4bdf624c0181b741149c833de721082d195b47afbcb8f7b800cb55b1e1e3416e86ac9fd853f4999706e1dc23e082966784a9dfb83ae27c7617683b7daad61aeb9c24c4eec95467160c44a7220ee2f16e8becea115410c7eadad6b13803ea4d6b4d323c39205e7254c8c47beef8ab816ed3f53f77703fce5959fa69ebda239ed0c14f27535f002eff721ef81ec73d747104eb0e8f55bc178a111a2e251fa15e854db6082203af4957d6240dfa2439043cd8013df2ff9a1e50cb6c9605a2832630a543246a9379a709a86fa56a1ea1976ee12e364a3a763c5c7a899288cd68ad0a9b7398b234668fa199901f28307b3ad31a88d6b91b684ecc346202ec7e4fb6af5659a05075fd2fd8453aec9ca26c8ba72493707772ee13ffbdbb6160d2a025cd0e79a0d30ae0a802c054c25fe18492ee93e3a40a04226fb388e2d69947caca3a2706be730c746b1c1b0e3278e34245a3001fff7cb62a290557f8ecf9390ec3704c7655965c5da8d7bd5a42ec22dda51a00fc3eabf60696893f452c1bdacc183c06cde822450eb411a59740e891f0f0b8bec2f969e47eca6a7af0f855b59a73d79da6d032dd754ae67fb5afaf7657dab90974a21bd06d0ff7f20a923d85ce718da8630ef0d1d98b0889110f7dd0517b0a57d1be53832d42792db46e42604dd6cca83c680b2ae63c95816c580e9be60641c59a01ff623b1a573f9366ae50ffc5b6806bcaf569a8277b7843dbd6a6a3f2426dc80702b23147534784802c85915bb00f24f21c33c1eab000eb7ada30d2d25af18bac4985e632277d6d068deb660fcdefda52c81381081b30095b3e6c0ac96191d692b3bd89418dc0ccbf286b35fc6145ff8b056557778fc0d4b20a4421991e4ebb33768acda99331b85f387bb3d0d8896af8a65b2352041bd83e656c16a805c112c3485678473fc8534707c57c605023da70723402711a51981ce099d2fd11bdb0be6b64e7cd1b657a0002c391ae2395a9b65b24ee123060ce5e9f152ec363004e33bce6112034128b95c5ee47b231069a093a25b4b76d963f7d871eab0970182b9ac3a3218cbce9f6fa74185c84e1f30ee6eec096b803cf654db6a714178ea26eadf30c08b174dcc101463e75f6721e3173828dddc6aa5bc859c4d8cc0b698b357988593c2343c52444a55614c167016ed9ccb24c2657c26b0c65291058baddf40b8e605289ccdb21982e6f43ee60951831f02caebdadae03bf64fd07768439ac27be7a34535109eab765334ccd0d297bc77b0201a34c2f4f156a8f27851ca78d8c91d13604cbad17ac332bab51941007f1aff452769c1313de03c695440b54df394b0289a469ff8aa1464c3322b0ef34aba69ca5adcfa3a10a522068dc5c43952aee49105aa922dafb25d050be000f2f5df9e7d8930423cd5c422ee62b207d995d02b6ad719862bfdf2af34e390cce6307bdca343f810cf4491b710898430f73beaaae11c07bc5862ca356e1d3bd38fd97c6754a44da4d70879f2e0321ab1b1ea64cb54987e93fd8791389ce91b66a39db665e88581158e1aa07d22ccd28d4b8eb28ca4e92d89661f5f472225efd0963d2aab810da40c89edb540466996c0c6d6ec38cafeae9f428b1d4824894673573ff7601327a0ed8e8d272f32db4a2dd2b0e94f79b2414a1e9dfada6f39b60c78ad2b54f4173abe059434740770629465488dca3420789a95093426022cb08427a745ea4f51ca526f3be1d71a8b256909b215876efaa3261c42d2c1a305407a2056e168beb70f9ef8b164e50e1850a5def5351a20ba16b41b24be833423366e273e082bc8a09c16b6d004d542979c42681d91fc38ddaf7593df9b0ab047aa334e2087c93b593b8e604d06717949d51cd0b183b17706d3270eca0d87e6de2e013d09e93e0c658224725a7de447f6ba0fa7a84314c87c89c7f3e5c15277e41d9fa4254c491e6e28e440b104075be9051e15b4c3dbe658623c213ffaf6e7fbf5e24bfe17ff637724e15bf896c41d32ff43a713b76596646fbb49eee909eabdab62dce0d24cd8014cf437734c816e853d8dfde6b5a6cbb7f989fb8119fdb0e8a3913763ec4da4f6a51e8fdbe3719f79c61f114b3efed7bfff7c262bffb65a2f9371b9d0be42eacf486e43fa0ff616dc5c29cbc64c0fc115cbc51f1ac60572fb17da735fbd5bb7d5bc4f5eb8824066e2db8797c5a2db0f335287b823087f06c1f3f37dd1d2f0f168bcd2f5c50189e2bcefebb9553e3dca5f0cfad31dd7e5e73cae5e003c7b0aea858f5cee1fc1da0fecfbdaf9b0c388f43dd943ffb32713648ed1caf822ceefc9ef21387001e9666d54f88a5d897e9a82c5287b072e4a3c5a99fe3669b67ae79dc00ed3801f5a5b973f6439d35a1d23d0c960802b156831521b5dbf001535fbeef5f0fd496a11ee6d362ada0efafb71a3598f133d8525ab3e50197724d4a8db08a76096ef2e9cef3fd1f12b47974d1aa43e6cfbb188b2eb1f840fa6f84e8bb84049659819f18942b8e3012e829df9864e95b06528fbdeee278f2f84337698fc119987b558d963deb1905598e720630557ace849190eda3467b2325d618e32b21ff9b7c29d39da53d0b5e18543a1bb08da6ccdc8708dc9d7737fa10418a332eb69ab4f4f5a4cdcc41583126de88447a041fa3cc46d7da3feaae5f4b6a97f1f6cde5b7ae6ce44dd9829dc34f4a519b11d380f419a179cdd29a2f3e07d236db249e1428ffda9d9efc507db7d9de26cccef2ee77d857210d7d1272059131f947acf063e38ee830670e1f4da74d718e5d371a6f49e34e0544aee6b6ea729c419cfb7d3d3e56244785f26874916585aacfa6ff0ea4c3313a00569d0e64c316e9e95bc209335e029ae8c8edfdff82cdfa014f90c87eaa568585adce0f7263a7334764d85d168e324ae9633f9ccc9a9b1f389e62700ef5b471b85264880edbf379c2e337e7fc9da46e5e84d8e293765f58e831a0ee51af436c3a884959a3ccec036ed5f832377be97466783e520fa8d7012595fc85d0b7b87a34264a62112cc1e78a4459a7dd79a9c681399e36fcd1c444a83031a9ff775feb26ae3f510489ef264b6f617321ffe6d99350e5929ee6e92692f09b8b998bd1f0b0128ca0925163892af02d998ec655df9920a639d2a1655d8e5559ca41005960dac0414ce1c0f032195f2c453d233b64fab3fa0b89c5cbc17f85517e0e98f2cf8e1d23da6d9e7cb8f38b14d9241b4317f85c8e83e48fe7fccc97af456397050b669fbf3d86ad4058acc9edfd9d5ad7e780712ace14f6a499984e247697b43ced370432aee0643cafb60943f649ad4fe29e88e02d703acbbdb577cd12492d0994b71a4156777935bd922b709cbdc1b9e858f6df23a88cfaacf920516d8f331d89388c0c0243b0dd1b35905926ae3e8e12556ca9b88f7fedb56976fd20d9a54cb7b90c1003b06a3d0be1bde4dfafce4ff60f4433ff7b1dc30a72b71d9f93e7e289fd17501d8f78954676a9d63bfe10eaa67f3810737d211647edbff5e54f74be80690e014e624ed273624f779d427acdcb0e41a48a3e3da5c2631530bed6f4fcaf0ed0b506c01821dcce8dc5e3c98fbca12121e93c35e82f3f1adc9994c135a9297bbca0178f44780a4327f651181f653644473d6e735990df62473cfbdb00b0f45a3e9c128ba0d5d27109bb760663771d690fdc04182036eecca9bd46c27ea06cc95eaf03b04e3be9894dc508111f1db586436f328ed64542136fd5a0b9445cbf5ba26f7bc0843e4256e36810cdae5a3566eb87a95f26da01ad2858dd970a462c69d7481bf3b195480c6d1331b8eedf57a604002ccbddada8b93c3dc51ee67b1f8176ee26071edb6bbe9368b2d23536453c05828056e1775dab0281bbab12b5bb214d429e40913bd23c343b63a4c9494d930dc0946b41e476465e5f4b6c5e575cca189d0ec0dc4f30e4bae6cb265ec0c40a7e358dac4669ab80961949057d4efcaaa1f598bf1aac38d8502313e4e9d6a92d4477d429f693c44f0e0f9790da658092242f9e5e17e00a00247b8849148788d45f2cd0c93d30422be13ff1b707557983fcc3e7c20994889d76cb3179d9b03cca83fac15f0ec055fe354ecf188ea76decba541723c3e03da5771f045f7ffed6eb1fab9adcdaef7fd3b38cb558fadd12ff1d7fbcedfa809053ad77978b4af7c60585d7b335bc2e915bbac9548ec66e1dbfbe3dc2b1e8c1599a79bed0a9c1aa4eb66b46fddbaea9ea3edb97ea29aaf4e78628eba36d448dc73283415dc11406300926639571fedd8148a09a87f10c167c1b527a9c37fb9b1e6bcf826b4086d6df0c0178e2124db423b028ed9bdf5e16075a7252d1f36e0c50d8542208659bb4aedbce98153844fa91e5b6c17b1c0334cf4dd3e8a7936ca5b24dc0773f3b0d12bd4da67970bb578201af9b301156200eabfb41f3580b46438f030c30c33cc30c30c33cc1a667c0edd482335899629a5a4ec08cf3244f53822654a52ca54195a45aafe9350aa8d8991fddf01e601df010cfd9f3d2415aa1e66cf8cb8720d39ecaccc94cd9742cab410ccb3d6b1b4cdbd2927420e6b45a92eb3dd6e9f41ae752d950e22f3c53d829cd7749a9a3a90cdf6aac8ea777c0c08cbfcc4d4871121a6fe40895b62d34d8cd2fdf86ced0a4f91a9aecc3ece3ba14ca7b921bce6831f3d2d3de9b4c478e10a9a3d9aeae377f4ecd71afa131a3d503195bad7fd16e2e47924dbc5be86709d1f6212347830c59fca71b1f4a2b92315afed1f74549fd36c475a44ca8a719dcfef9385a68e4dcafd8ea2b33057b6141a3a8e6a8909736522bd7538d0cc919748f962e8adb9a8c9b112dbe1eda57b146aa64013073a889de3865261faee073470a8457ffca03b9d7f5ebdb1a71b1fd6727db3ddc0d5562e3c96584345eda5a545c6dbe83bed285e2a1d313b7b770d1bed93b6b574175b2d5db07c095858b34663ac516a2dad337f6bd4583c994ef39634e532d6a4a198fab50aa93fbda3098d5ec4d851ae0979fb4567b0e56b0f1b37ad6eb83466ecb14f6d4815f78e4f089a32969527956de969a918040d194d3d1bd23d4df5e793069a3118b1e5749a17595eb3468ce4e830a5abd5aa964c5f38d08491a8196f5beeef623e1a302e13d939a99fef64eb14345fa0ebecdbc49bce556abcf05fbccaafa75e5a5a5280694ad305aea3def36871b1e62d978a63609f4c6d6b08351f4d1b18ced99e275767ed59e941d8bc7098cbdba95a4d1d5c6ae30236b7a6c3582b63abba6981597e1ff6295163db1b16bedd7ae63c4db55e3d46a6840a5661cccc3459e1a7a2942f2e30adb9c864b972410515a8c02d2d2e2868546955497dfb4c89d16a124193ca6ae5891da2db55abbe030d2aabd1f276ad2c797dd129787a8998ead5c7d6f545630af2f1d6989be12533d49472de1e5df26b46943c495998d6dd59a677987d9a51ae2567aab54399d23a1205312d5adf9aaf5f9f21d08492df8d3ffdabf6a93d4159b4eb7c3a99102296ce4b4b8b4b4b4b061044b0410616b4b4f83f16999e8940f3492ba3af4bcc583be49eb0f6e7b3c9acdcd0b34e18bd5a485317d7dbab2b3218683859aa50a2c6e82045a7cecb26aa7573133a4739353e8d269e8eba57d569ad626d65b2ddeeead049cc08df3159cad6d95cf598df092fd963bf676cfb513674961cd59d1c5b62f447672bd96eb470ade3b6f0a8a584a55a568b2957edb2210b349324a71e457fb621bbd424e1c5143696d822f1c4f2913d3bd7145e83a4577b23e3da5d6ff68fb46f9a88c89a3b82d023725c4d858d296e249952c7ae6bff2c2b33a2ca161d577abdcef15aa4fd33528d1bbf525ca548765e5adc8feaf68e4a049fd5be26c2c60e528b8836d7c68719039b2e543553a85335a79e2e17ce0dd1ba93b8e19efa660be54799caa53a8ff58c8c9511365a2463c26d44d46c8cd3268bf364a4b22d7acfd6160b6cb60a9b3a4cb1f332cbe60ac5583b9b96f73a996d63456ac28596a9d55e5c1e8b0a1f98b1a9a2b1e5d68ede72a966baa1222da43a936bbb83d05a9b2914a6bb6d8fc714433d1b29d6b95f7d75b62efd7e130527c58e7551594abede40d190d5e6326ee6ec7df3c4a63f3ff4a7bd72f9c689768554b1446795336f9ad085db1a4bde52e2451b2694263bdc566e266be89b25501f5ddda39a991f574aa4fb54e9385ea6733a49705e7a65acf55ac6bc90f0444f9fdaeed9de532f9b23fe8e7653d576d67bdfc60864a98fb7b3fa20755a37d814c11e5542ade526475ec78a071b223665bbb77e859707e566086fda9211eeb3f48d2a44d3de84f8ac782688d4b44f224a0dfbf310887638571de5a7fd90cbba1129cb9760e3c3fda91feef2950d7dd343fb62cbe87c53ba54f308363cb07c474f9872b5d4df1dd025e3b95fd81e3d221dbcefdad1a57d07dd620ea71b53af3d96ceecd8041b1c0eda76f29337f7a3363728627d56fa57c416e3b6b141157b647f84eb9ba3b380020edca68673b48b4fb9d2c7bcdbd080cbd9a67307a1cf4b3333206aed4c6b7553b9be645849191d26a57b020ba864408f01cc4b0414b8c2c03590520398000101a8c00c1c00409619133a1820801f819930c21566a50001664a7803400060ed5284e82f13b1e4ed45259ad0d212f325b89c00e32e0e337305264b096f05064b8c4c67b041e4c064719998430e4c162b2f33ccc5c5808d21c7c5a5804d2107264b092f33565c5c0cd8107260b29c00e326b8b818b019044b4c0b92e56702f9136462623e66b30144052c1df3319acd1f2ab145dd65a9157d9f0a367e30c6d297b6ce3ec56afbf05ddc29b50f5aba8f5e5a5a5caec85c99e1e3da2bc46fcebe738c9b3d945aa9d1ca3baf47b3e4473725de3f8cee1744b0c9433565eca87795f050d7b688f9ef20c4877774bac4d0592b1552bd961dedcc577f6eef775aade3a4d3ec34d653ed6d3a0e2da6ce9d6f4f4ace39d4f3f9b58bd27222928359d7aab373082d3c1707a3a3f4970ffb9dbf862335fa522c6553cef8f30d669cd6f6b394e8187283ff2ca62b5b2b62c46ba3135385e787f3d039d938aede1457eb6ec858d760bcb83cbd293d9fd2a9812c11f34a3fcfd6224e83f1939d9470a5d65dbd4163f9e2c62ad9a74789e9e60ce565bdb6c832198f9ab1be255dbf9dcd48112a43b1e24a4ca1cbc4ce44c629c4d25daf5b9bda313e4f6d4346dcd5a75d8c5fa7f969467489cfbec1268c5c97fdbff8b793a3635626d880f19cb6dd13e61ff667b9accd177ded972fcaf7e6ed36838d17ceabd152aa3fd737bb12817ba8810d21841042888010428863ad01a18484108690518a29087d12c871240b3210c42010c22010842084080831861081914811620c2355ed95beeac8c66904865b3dd3f3c027fcfb2350297fb8bfd44deae945af017c26ba93363fca94c1dc5f4ac50109cd1523a25e67cf29aab71190cedfd449948c77910c429763c3066bed805666de555694445e8d03e15750d99d386a18b3f1f4b6543d53ab5255dad47061fb30f8167db7942fed7f8416fd37f64bfc85b441460338d0d4b332d7a4d56b22c2b037a1f8976c8c090b265f2b9df373257c1b77517839655e3062014ab15f820eb2f47a91f96cd93cd9920444d5b119419306ef9446cbe4a0f76fdf18935868cb9ef05c46b42e6157e8409c3d1eaf22de3fd884f43d203d05d0c4e50d41061d1cb0561e43916f37e97ef586b60409ab21a447e6ff8a923ede7e0fcd9e3012e7bc332e4274f1484cb8dec288e4b4f9db87318d9098a02f0ab0be1bb0432b4a84937c10f097a414c96b33defac14ddecf1369ae93f133c16e60b5f99325009f65a6ae7546b92d93a4f3f79d71819582bda6f5239d149eee40d7d73cf52bfea3c3618799211b10624404f91ac63e4e277907f40ef8182918e063b503bf49b5e661f003ae18fec4081add49da4546105050e04329c71d1bf99f67e25ef02ce10d9a354720994a1dc15042c198a834621b416a48531c6693a9a5009c8cc1d458694613e22e3ed2e3e892e287dcbd98dca537104398b080354a40bdf300bba291322947512f68068a4c722066082806fe289ab0fe0e2a04eb201c998e674f99b37d2631f5b83eaada38fcfa24011ae8df7d3bbb39335f203170d5428645ad56c8ce418b513e4ca7e34c854133a930d4dfa241849f3489c51414c4f41acd8965e2a1c14598e02bd04a4d4c0cf69797de30450af8f23d750f3e2b343a9c09ec9e28d8d16839e7e3843140a28e7aad9f087c2d8f10f657532bb56bffa3b610368d398c463ed17136637370d17dda00ada9441c7ba13c3545c1c2ee4578978e77a0a7110cc23ceb650c970d4ccee298f2136b4dbcdd6713d1264ff04960a43b5bc7456545ca06efd10892cef8642c0f1b74081e0a90d924d9e9ac22e3971dcf1232d2b2d75927232ebb9c0522d940ec0c49391a258d7fdaf15d22c6886de0ca6a688fa61a0a9514dd9bb8c0391c7b94a8bdce5a676694d7921605ae93e8862cf250b502d776d60477e0bf39a36e5848464509db946bc443e4b5938f8900d248b52b588b52cfcbd959886853d4bd949ead3262b565af4fd927ea135896b005c10b51b15a8b4629692c31df1b0da5e1c08597e2649e3c28f09aae2a4593aca8a28da2f2af04c9cd2f3bf64f0a8e9fa946b426c4c620dc4e56410b37cb4770a6869f25addcb63481ab1d90cae82dd7cbb3ef50fd9a7c715f6a526d44e7d6981bff3dc8d4a63547bf03f3952e1b9489404c656789283512e0336494183f46cc02e28b6dc37651de95fe3a39a38c4ab356889cb5622078664596d1455fd10ef30c464d4850f3393a7dd69fb1f5741984d626bf7b71", - "0x88e6ce2679720956901983b443d43d714e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000100000000000000000", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a63": "0x", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x08aad9fa2249f87a210a0f93400b7f90e47b810c6d65caa0ca3f5af982904c2a33d47753f0cca9dd8da00c70e82ec4fc5501a69c49a5952a643d18802837c88212", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0x64000000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd783ab1dc80a5347fe6c6f20ea02b9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3838746573742d70617261636861696e", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x08aad9fa2249f87a210a0f93400b7f90e47b810c6d65caa0ca3f5af982904c2a33d47753f0cca9dd8da00c70e82ec4fc5501a69c49a5952a643d18802837c88212", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/track.json b/cumulus/parachains/chain-specs/track.json deleted file mode 100644 index 7b6da2b451c0..000000000000 --- a/cumulus/parachains/chain-specs/track.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "Track", - "id": "track_v9", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.90.214.205/tcp/30333/p2p/12D3KooWSNvfxTYrtxqAGmYM1VAtg6YMuAGWvjQ28UvoYoBBgANr", - "/ip4/34.91.145.171/tcp/30333/p2p/12D3KooWJdoJVgsUSqF5uovCDnAo7mQBjaaXroo6chzebNPnX5ep", - "/ip4/34.91.225.237/tcp/30333/p2p/12D3KooWHD8iRVnrXHCzNTtN2nE7DAmFc13k8Ltyng7X7TjRbhod", - "/ip4/34.90.240.154/tcp/30333/p2p/12D3KooWHhUfiS39qTD75GgD5YPqugSyyT81Jw1dnGDLqqZ6vWsD" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": null, - "relay_chain": "rococo", - "para_id": 120, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0x78000000", - "0x88e6ce2679720956901983b443d43d714e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3838746573742d70617261636861696e", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd783ab1dc80a5347fe6c6f20ea02b9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x087cbe9e22352a3a87f6fd5b1eac65e82ced57476ce6040e8ba180212d42430f44ecce8a310d1595d13f6a005cb961b5c8249e5a4ca34afb14849323459d70f402", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00585c3f048e464529104f107867940ef094f453424f49f16376637ad6aaf07682421e7294b8ac642f7abd38003dc832c3c2fe14033c6598fc44b8aa96091e61417f0a13a8fc712fe66abf4cadfd7f13b2b7245b4a29654a29056710dc0f450f74bfb1223aaee0035a9f54c107749f8bc8a121373444f75790a1182f20a22f0bea69501c945f0567501cb47f968098f6cfd6decfc588f45699f6bf775bdde55197680553d07ef70e1bd2efcfe34e5bfab4baa2ee5dbb31f2b2f879432ad3dea0d0f87c1ad07ef9f2e5080ecacf5b5d390d0a0d1a4372a0fdb2a0ae0535cd81cebe1673eda7dffd6c7fc786f0bfb7054dba7daa4b94822e34a8a96fb51f0a53e769a7e1a0aee1a0ad2d652d68d2fdd5e33e63b62a63baee6a6d19c6fd0e508b024513f0a1283db1ea81df986affa6c888ee0654a2508070685053deacc07fbf63501d3a5d19146a5196e8a94107be81422dcac7d5160e146a502431c1972f5fbef4c09fcf9bdd3e4802e22fd48a94ef81db8e1d29be677e1e9f4e67942dc2f22452284d2de084e90e74baf9b42d039df042039df17ada3e6b4c1fa62a22db771811d9fe746cc896b165d0b9cf2d1ca49a01baac357ddaa24177cbfab403f58da75b63ba62215e39773e3840c63f4b4c553f64fe2e04fda6759a1f20e3dfefc02492b93e65737bc8dceba0fb851444403fe7946489335e4f8467d0b7a35355bb29e2861cf5ac29fcd698e6740a6ef18320dd9fd07a9e86178dbf40fc65fbe54fa9ada5f1cb9c4e01f117da17d49c04411a9fb54081f80b100e0a7fb6167fb5da347e651a9fa757e3adf2efb7b6146ebb3be256fdb7173b008fff6243dc27632a792191040cd7e3da0cfa7e884ed5931148bc545d2d4474aae97b1d2de8fb1fbde33d2b865b2d7486561d7a035fff4f77176344ba31553f6346fcfb173382c1cd083f8ea953efb3196aead41281008b85ff7e426da90156468017d4f81923029f7fb1220cb51ef200e5ef547b17ba39568f6516b354043ef487ae2dddf8fd1e5ffe737f110a53d7a03095f2216fc78fdb529e96db8ffc37199bd3af236fbb7e2e16e3bbfb4bfa93b51b7f7effd66efcfbe34ff993b12178e8ee8e1a9f5f6a71f6c5d890fef852ebf722fdf1657c9e7eef043ecbfa2e500b8214be052ded3d8440fc85ca9fae055dd41f6ab5df7b65ea72dbdde143de3bdcea8ac28f5af5ff911f7fba93eb9d04413adf09d076191aa24131d4faa08b8e7e5ed75fd77575a1d6f3f49c1a501074970753bfb4f7b3086fa1d6cf91061404e5e521dfb5da54fefb1191f7fe40fc855abf980156d4da7677c8e769d72a53f98d0d792f377f1e8ff069d37ffae55a3f0f61eaefb66cc4320b7f8fe28c7e53c9fd74fd93b165988c35a6bb623e628e7e96defcfd95967c1d6a599a49ee6f10a6abb94ee9d0fda7b93e6d91f7a39f23adaf91f67e3122a37fced3236d296356646c882c319d8ba99661b23e592f3f3e63aad1565774f43cced351336996369f06856965284cad9f7c8d34eb9fb6d44d6f76270139bd19e254bedc7e79ec337d9ab5fdc4973fd2963a0c48d2f78b15114bdba78a43f7dd699f3115fcfd91c674b1214c659f166a37f0d78ba121aa83cea8d5f8f2e75cccdaea8a5a3fd22ad3d14bad12e1210ac4447497c7e8e5f3f848e3b7b4fec554fd40aeba871b10d3b7ad223b34a601beb002145388410d8840d4b3d7dc36f5893feb13ff8fac3e5f949f81507e7e219d7a94ff3bb55f98a00ae5cfe91deee11fcfbf39bcfd2c91f7bb2644f6e3bf03ad947fee06a93af4adde1023fafeb9afbe5521ea5f2d22b60bf46d56dcff6aee9fc6801ec6e8e24bcfbe6bf509ea153e931515347e15a2ef7781d8eda12e51941ad020a6716bb2665020fff285c2cdca13fb42ab2cbaf4b86da83e41df56fdab45fb79dcb51de8e4cb69fb8b3d609f30a56777a02ec4abf696c29c7baddc663128ae40316569d6bffd6e0bed9757f663f264fcdb3fecef9c3b806c893e70c677aabfffd4a9eefe8018b4bda7bb9b89c9aff56f4e2731976e4ecd68ffe477fe7ad19eceffe3ac398a75a150624a4d892814884dbf7683f0d7cad4659ff67532a6fefb8b11f14df6c92fd69c6250e0b58542b9481bc4090f51a020287f7f6347dcd010e567ac483644f9af4e2deda1dd8c6e8e957387612edd4ed5fe7dd7cf5ff7b74fdb27f73a59ff7effcf6edb27b7f9c6d3ab6604cc1d40e6be9ae87b9d4e5509a453353b75aaead0f7ef7f74cad1f7262fe87b9cdee99ef7db29a755087defb34ef5bf9fe994fffbf757a7f8df6fcedb7e9648e83b55dda953f5733ad5d489a028a2fe57ef74cf0edab4e250ffd56132f737a7ea50ffb9ebfab4fbeec8fb7d9e9eab8d7e2e36b7baa2f357ab4ff7596b6c19c6f529c8697c53a7e0fbe34c68595bb53ebef584d4b24e59f2fd2fad3641f7a7a5319ddba7eb1923c2d4f5e9daeaf5f12d6de9a50539953fb9979d64694ba1d4b64fd277a4f89e6d540da2fbbb3cea45f7fda74b96ec7e6aa35f6d31d548bebc265fabc19f8bf15657947f35c79661beca53fce9b05d98ab4f397df2b77efb24fffb646d72abfbee799ac75983bf599ffa1953c1edc6c87b7edefa9fd316e34df6a93f33adb6f4a5efb8a1a1a1a1a11effd30671fe9aa34337c76ac4afcadc1dd9dc9d6c893c40852e9107a4f8a04b3424069d9bca9668e80aba74693f633f6444435cd0ea68bfe497727d671b5533ca5f335a25ddef779d8abfbf9d72bf2f3bb574ddd6237b1fb5f77d398d2963ef5fd4964ec68ac07f5b850f7fb63352a2f079da694ca3b6b43195fbc9d7d3e02fb67daa33732ef6b6ea047d1fb52a697ca855f8dba7f83c0eb5a551ab0e6a4b177b5b9053b7b93ef5897f731a726f99a69a6c7fe1dc4ef95749f79735a6932fd696ba4ef5ef4fd796b6c694ba4ef1efcfbe5ce39fec988a7ff6e523f3b7896164ee31556f3d32fef9aec6f817739b5b4ce5dbf6a99fa7171b62a96b4b57cd6c656e00b259da9cfa3bae51fefb7377648ca9b64f551261ba7df2e7691fb27eff99756aa9ffe42bebd4f669df7fa653ccb44a5a33eabf988a9fa779bab51b2392f64bdadb8d917ef7fd6e0b62cadbf6a93ababf5811fede6a3f3f4f37f315730790f55713f5f737756adf1fa753fcfeae77b8c73febd47ed10231a8ff766a699da1fe9be3dbcfd3cdb1622632b7870c86ee1758aad08599bbf00dd946f70b296fa091ee1752d0a04cd7c65c1e7864fbe6eac8f6c51ea8c8286314896217b1085108918b68848884e8455c42d412951089108110b78847885f4426c420c41f442a620ca20c620b220ca20b2215e806d886282586208220468950440fc421080798469422b220ae20aa20a620a2209e204e8926882588248853c41144114034e01a201ae019a019e20b6019e019900c0f0df804a8052e01320152016ae1a90176f1103c2cb834b894a705280438044806f4c29bc193c21303ac01a401ac0267006500630061c07180532016e008e014900bb00c68058603ecc26383dfa05be03ef01fb8162e8a43c1b7b816dc071c0c0e056e8a338103811b81238193e271702eb818dc0aee06e7c2d3e051f036f81737c3dfe05bf023b8119cc887e06578187c0ca7024fe341e115c12840339e111e11a09547046df0b078581e0e5e0e9e95a7837783e6815f711c780e2018100c900b0c033c4163e913340a3c057e8563814d804a805ec02f60121e1aa0086008a0142885eb00f60002016e0183f09ef09ce051c02a9e97d786e706d70268024802580237411fa18dd044ddc533c123c19b02aa4103900b0783b8839845e4414c823b832fc1a1c169b81e38343835b896be01dc0214034e0166016a019de05ee02e6824b4179d8456426be925c0316018f00b700cb00ab0086e8157805080628052786b702a4de571e11b70156c03aec1061670044c83057c2620810840e0014814a002410400a4a701d08bf302871c1bd80a3cc2a3c25f38058c023e014f6113700998043c058f8045c052b0140e018380a3e0280c057f803dc0432ba10e3cf1b6bc2c300dd80a17015fd15dda0c4f096d85ae4293d1633415da071d463fa19dd060f0198c4501460c00d95024014282e8274ca6cb2f0aabdde789120a20694289cf1248904c76259af82041325af661420125414d305001244149f83859a24493254890d4383290dc1896890a3459822409244c54a04911264c98284050123e4c983051001d2e0cfbc46749d012274c2c11840125328ecb366162499012271850024910134c9e2059d20455e2040394c67d41735dd8271af0f941f204898f124c24e1a30492271af031d28489254f9ef8280087e3c266604913d489cf8f13261a70447365ac4f9012259630510205890f067c3080802394f0b18005941ca1c359619ffc24e1b3441252d827414d7c9cf82cd164c93b28345952811bd7844d62c993264b9c0439e18344034c9a68420912273e4a305982819e9f249860d283e3b4ec0590280952a28492209f22605c1236b084899225414b9a2ca1715dec4f124c30a100129f200c24e1e3844f8c33c23a61a200978ca3227e31052fe8aee6120d0d515e790d6c283414b8098eee871f523fa47ed8ddf51ce7de73c7f13d7ecef9c6fb063ac737f239c712ba1d9bdc21ad1d6ee4d2f7c91fce877393b9bb5f8fd9cfa58439fa79fb7bcee5bab35bae5f37cc4d267d783ecc3967f773aebbdb1f3b8b7d70ef75b7d5ddd1353becb7beebdc3d1d171daf3b27d9bbe3f3e9efb91e1c3fd47b8ff93173cdab793535aea65f4dcd0b000fd735aee6bdf7b85fcdeb1af757f35c4dd774bf570353f39c73eff97befed70cebde75ef79ceff563bf696f8f31c6e7fac99b77d34f4a77d27229253f376ae8cefb3d276f9e43776edf932bfdf97a8e1c921fbc79ce6f6e1cb3bb3bf99c0e1e782835ea34dd7befd598b3bd5f8c3b74bbf75cf773f700e0f83dc8af1dbbe71ebb7bfcba9fe3661dde7bcc9cd3ef3df7dcebf748ec7c3ecef1de6bb6decd7befcdf96477373373c374f7eb7efc9eebe7dc7beeb976eef573eddeebd7ef39c7cceff973ccafc63de67eccecef39e79c7bee397f2eddc8920e37797373e39c93fdd8397ccc4f4ae7fc9c7bced79f3f6676abfd2ef332e35876ccccd0398e9199e53a0bc7d59d03bfc78f79a5dbd7d1397773737373137b107db043a9e686cd4f124a28c08409133ce0d8d4c8a1460d7613948492274d9438094212b4e4021760e234b3916e9ef858a089922592d84a4d7c9a684209ce05960435c180938d5481200cdc2039e1b30492a0264b9c34812489274b2e102f9043fb38a90012274c0429498209264c94e0fc48dd7082890c04e590faa1c763407af86081264b9678a26489bf0972a224e8c90e3d72d8f8042971e2d3c4c7024e9ee850e3f3e4898f93262ec04412489cf8406122091f2748943c5122091f243efca47ee8d144123e4f7660964822480905902cf1644993251530556089131f284804e0c30f3ff450c2070913414d68c04912397c3059f2a36363871a344a28f17172d280cf0f9220277c9aec98b1c00e32ebc393a0274b9cf0e9e1c4920af8386942a7e46301254e98087a824409264b9648024910130c28a9808f122818263e507c98207142c905706416608209120b345962010b30c1a4a6e4f3e4494e94f830490289133e4a345982a4c912254b2451810a308124c8099f0d4a131fc7d607244d9858f2c4890f1424414c30e10489123e4e7c9470c20492d40f3d90f4f0f951c28402487c9638094212e4840f0f509af878ccb6069c3071019f0b40284d7c5c073686de959090d0eaad5642bc1212125a4128b45ac5242bb4ead54bb242ab9513f2242bb45aaddcca855656921512125ac924bb5a09f97a92dd242b2121212121974468c542429d44888584843cc98a37c90a09ad3cc90a09759215e2242b16e22442bce224422cb4ea554cb2e2d54bb2e21527d9154cb2ab5527d95dad562b976457dc4956bc5aad3cc94ebb8177972ff044c906509c4658c4fd13722196168c12e6e65426a23a3f7c643f5684747ab098dec6cfb94dd01a41b40614a7357ee9a886b684ff04f2af43ac6da45521223a7a871da1797fb2a2d1aa69ab4cbd3a9356997e9f2a5fa12b454ec9a82c17d965bdf010dd2dd431bdfae44f32f75c659babf833b95450c8e8e72cbd6befa78f6c2feacfe38b0df12ffddcab3195cc3f4de665deb121a597c966cdccdbf86ac3fa2a776a465f6d22883e41ffab11a6af47501e7294fbb7d50550f75f7aead4cffbd38e4ec9ad32758ed6d103d5f8fa44901b5ffd473f5dc391c38f3e071c3870e0c801c7968381cc3dcca94fef79daa47115cf37284e97e8d3e8476fdb4cef47cfd335fefde85dab8efa9b5c0ecfd33c1493da3d551b34e66d6cd506ad3c1413d3d8bef7ea04a5f9ed544d6ae66bfc7c9a8f6cfb64d5d86a10a5a94d509a6fec004c69be1a4169b61a5f2d9a5f3a7a1c1a100d0d0dcd3f59519aed898d776b03aaf1a37f5a75f4bd6bf5bdf50ef3c9178d86e31753e1789ecee12dcdf49a15ec71b86f4f72306d40385f63fb3eb91fbd8d1b1b941a8ab35991e27a12e922b928ae9b8fc266cb1ce51efb286e3693a3dcdb3c57f11d6c4be228f736db3acac69b7e7d87b4ada368bec6afef5c9bf593b19a1af7246edaaab4b1555963ab19cd56336bab26fa760b750f54b98a3f4f4f1fd9fbc554339a2a52219bf99907e2d9fbcf9ef19999b9b9463d19cd9fc79f165fc6684e1e8c569f62d9b67d8a178df1177bcfd325ad32b9e8fbf8eb3b52cc8f029bd87ea102295c7421094456b041ae8a90031754210d56aaa07246c6430511fc208d269c810658e899efdee43b52903e8a8b34ffc28238820f7e70851c50818216f4ccebb1f958f6086948a1d7268569ca4cc1852fb6c0a08b2f78d19333032b44410a96294e10460f16eb1d75afd3297ff7427a87ab2cca7dcd59222b43747d677bb6feb8e2451630780b31a87ba08ce91ec1036750d514b6e854ad5c85bab736d514b6e8d3d2a5ee9ad3649f9c89e8e6583da15e4d21b78aaf061ae6cde897d6a7a3d1568da095890efd018a5fe54371bac4e897c2e7b734a0d1cfd13f59d1d1f6e47d84af55f7f2a7bb46414cf7d7b97fb2a26e7bb2dbeea9ca0dc8c16dff6d4c64940f788042a9a16eb322457f14fede9b14a69e28fa7d9342f644211db51f45b628fe287a7b6234031af8c0052b304213aaf4082d1957e0108518664c210e587ad651fbfe5144b15be6a8fd2876519bc951fbab28d4ed5f66f477cfbffeefab7bde9cbf3be2ffe33e6e5f1d75ee9d269d7bb7d500648eeea69c346dcc887ff9e2b4a5d32fc7b43610f067e4a64bdb0953ccc87ef942fd27bc364850533712c4768a53eefba53fae8e7ae643d8ed755b95bed58c6e4f6fd5449345c1c20f82efc1d2bf6a76e2ce94b1280165f5a9f5f1f77d64ceccbc55ebe3e3d8f14348cea6fca7a5698e5a4e7facf791f9cb4e595b7d2abfdd57d3fb9a591eb726b2a74b1b6e55ce50feb7b96d77dcd3ed94efb89efe7594a725fb187373ea9bb241e4ef6f17604c41e5cfdf6715644ffdafaf3a14fbfa83f41508f5af4268fcf9f534faba833a4a446b0f51cfa8b549ad5e5a3af5de893c85f9ecaba3b2cab755982ddb5c8ba450804ad4fa524903f22f5af5a2a232b8381a435350a9220b175ac4d87286f3f2a2cc4b63ea5a3a457a7fc78c90b63a834d77c92c83a2877ae0f3f4a52db5767ba8f388109dd2e5569bce3468bf3bd24513cea0fdf11d56847bd1277f6cab387df2bf36d7023193c69403597522eaafa553f3bd88feb9d5881dc9e82e8f23fd1188a915979f234581ef9ea9a5cd283dd4d3eeaea8cd7739ade3e534ee811a08be078bfc19add8ceef92da8f7ceb27bca2d61fa052f32f5f2814346e52ab421ea0f20bb556143bd25f57344a8dd2a83575189120a8dc8082a0f227466489a835442d26a2d606c44454be93db2e0fe6c957ec59ac9fa79de63d4ee45e74aaff4da19b63358598dfe80c7373eaf7fbfddec98686863cd0b3cdccdcccef6d3db27ecddcccdb93cc3dffeb77eddab57358984472a68f8c7f725fdc17ff329dfdec28bb5f6d57be6bb10330bdfab4d7aa78eb9139ccbdce104b1d10c6767b92f92fbff33a0ba1fb910ad953cef18ec2dc1d991751f7d347167ffac8629f265f3eb2ed53cda1f14f34fedce66e47dae511ffda4e41f8f55aecf7a78f2cfe622a2b38e0c7c7b0ad47063108372b52be07c74f7761363f6d34a653db20d0697c8ba3b03cdc4f9f99799a3933830db174e6a77b97cd75edf2c6784517ba43b2fd02cb10f58758a650dfcb4796fd62aa989fbbefaddf0d524dd47a2ef21dcf62fa5793d9fce83d8beffcbb1f6d10f8ee250361e361de66ab265a3d0b8eaff12c253af326cf42dddbd0767b98f9d7e2a266be86e67b9a791cda2eaadaa0330f8383ce3cd47679d4a633ef6030101b64696d5a1d0cfa35cee56c0a7efcd38e4dc9380ab51806fc4983a9e0d623938132246c88a532bfd890a732f3628c88cccfbc8ae6791ad3ea8dc7bea4d5d2c39fd815b5a5d06463f2b7f9e28a2c14e64d3fad0b6a4c6f684c673467ba4ca6af31994c6f61aa9a9fa38b312210b3b097231b3035de3d97b1c58c69ba6cb4a538b428381e04df8363c372e3c6e7f0f1e7dff8c957bc51830db1f4c6c360aa1c7ece4b4683f919cdf509e6e10dad329d79196c48539a6dfb04b3552617bd01620af3501c850f54a270931b14a6305b9d79ec171b32f334cfd33018911919679ee669663c4aa76adebd4be994e9ddfb149d823f9f66a65332ef1e6a5ea54fee73d0bc8a3eb9bfa1f9957941edc6cf60446e3cfc09b59b9f36fa237604a606b6dd18b9f1a637ddd868ae1ad8909b873fa7e95a8c08dc6e9e312237404c711e8ab3f9fe1b20a6350fc55120ee424d0f54a2a66d974735bd8d87d8117f9b0d0a539cadc2c7fe614760deb441615ab355f8359ec7e10d0d46e466fbc15efe4f8d0f620af337edbc378f04df465b5aa339953eb937694e459faed00b6a2c469fdcdbd0988c3eb987d1b88c3eb9afa1f1963eb9a7d1d88c3eb99fd1984b9fdccb687c8693b4ca94f416368429172d0ff74d329d3eb9cf3e46dbd127f733e6825f6bb0af303beb2898af168dbf1b84c852d2c7e7dde12247b98f3f83a9b8c877a4a3dc4b98adca0cdb6a462b1739aa9a6895262cdb4e17c82a179daab04180b80b7ca6ee1b3be20fdf3123fe5cd4a97ef72c46a7e0bb673236c852f70f33e2404c4ba5e7f192b694a42dc5ea8fb46aa296e6244a2d88a9bf842f65cddca2aa89c2af263ab38bb1b8f5c874e8624c32b8d5dd42f9f98b7c87c70a341ab5d4fd768ac78a34fab4f46d55d2ca45d4fde6b8edc78b6e9a460b94e6a0a6ce7d50531ec20fe45fbe7cf94279e377941d5f61baf7fbc81e632acc1da6e267ec6daec498db580973039035114259737dea5e92d5ac7ba6534c8450fe36d1b6f25e6545caf7bc4d48480f961b238efa3beadb8d117ff7ee5b65215e79b3150eb001787489ac18e100d99c81162e032f944bfeb3b4f52fd3d99afcc6885819a13596cfd3339042e7cbe75fb6b4d14fad5eff63fd842fdffdcce040dd25b53abf310c7b9eee4b6aa5ef2bcb5e6a55cadeac645f7ad7124135e8c44b6afb069afd7ccdeb307b9edec7ed4824a96d19d435a624ad9fc7dfffc89fefeafcc588f0cf399fa767cb5f29e5f3346345e4cf9fb3a46d74f255eaabe457e95d250dfbd69c66d8cf88159161bf181119f63c8dfddc176d48350314fba6256dd1a073a45d18116c73d2fe73a45d5bf7a8af4b1b3de64f2291bef4b3348a5ff227fdf606c45fbc7f92464d47f14911d380f8cb8af6b6bb63f42ff977e962bc0c03b7ac4f1b759ba94ffd4c857885b514830ccca03874896490043a4bbb41aace6a96dc577ff6ad0a15195120ffe29e19d46d40fee58b74d6d6446e553e9355165de8db9a3c41ddf3cb77cdfd6247f60953a8dcacc029442bd7673519401422fa9aec13a6d0f77503545a6f33e24a117a18e308d209eadffb4ef35fec0154f4c4a11a59c8028a300cb9672b4337487003155471a243951d68190a6a62cda056867a18e3084350061085c8890dd0f7563eb066f4c46d68cde8d9ed897da12632a041153c90c6d0500fdc86a20c0df1fb569ba08e04cc16b260451ca0f8f2a5677fa6857ae50e91307b0af56f4d88ec07fe0eb4c28da7e8d3d2c953f86c10273ad4cafe6abff0fcbb9bdba28080478f7b29323dfcfe3c45a766a8bf4d9c425699509ea24ffe3a5e30228aa34056790a2f50ff27f63347ad7a560d5400610640c8b26568a8c73dff74daf6b036e47450021b7ca00644e88902021e3dfc52647a360a08bae7bd1402f4f03b4d0a017a9ec07204ff134638ca9f8b9ec072c47bb73dc1e328ffb73d81e508f7bc3df18ef2779bce3aaa4a5a978888bf6ed1ae21044bb042062be4600b528855c8b667b50230882003197441060fd2d0b33dfb55e7881f1aeae19fa2533bf014a15eb13b19b87351bef7fef27d7c0f4ea86d9fde337bf19e7f36f6bedf3b20fe42ddf3347cce7553c1df6d90f7fbf339bf8e7cb7dee13b7c7f0bbe84fe0edfe3bbfb3f8de98cdaf6a989dcf3743f7c867fe39e69d31b6704f82f42c7d4c9e5e14d8624dc3091e0d76450c52699fc9b533324f6b1be36087f3fa76189e87bb741e0efbf0dc23ffaf4645085eaf4e9fd625e9190ef3ba37f7ff29df9ef713ae5fa24ff3d900df2cb43fefba9658d923fd264a3e4679daa36a4ef981a25ffbda953d63f221948a1f5077d6f6383307dd3d23c0afef2f2fd294e9fa4fc9bf84e9bdec40d88bfd0f84b248321ba443280829afa241f6a6c6ddb2719b5b73cf61773cb83a950af5e7b1655683ffc1d225ba2184ca1f097f6730c8a68a937d6dec3678711b11bbb7f1811f8f0fb77836cff1e81df1fb51ff84d84e156a156d7f16a4ba5562b7cebf9a3f6637dfcc68644cc487cab88d15b5b95d47ac6809c88f2010f0c5127fb4f564035036f80c317fa648baea8400474fe93159d5bb5787a5adad2913627bce2bb87a9226664b45527687cebb7ca74dffa870d19d19796766364b71ff9404fd0ea92c60a9f9fc7fba1b630175da2188880ba5f4cb5cbe33d4dae5becde30896434193dede894a3fed90ef7e4507f79418014844997880a2ca80967ee6abcbbacc45c86b9fae4665e0ce9de3d744fa1fb0164ef81c86c894ec117d22947e123a105851f81de713dd0c9a070bda0100885bf184fc3200b858fd3a9a61042f857a772e0f6b35dfa8c147011822e3c447b8f644b14822d9487a8ffec1d4d88ec677f69e5a1a64b74450a47d803d4b7ca43747f2ee61b145757747f37c84d9111755f770ceade890e751b5089fad7fd42eb7e3f8fafb67435c6801e28a33cf403de0109b8d021738dc896488a210adff9e74c010b58a68005264883fb47cc08ef80c28725f082045e2891252201189ef0104b77fb71adb693204981f60b7d0fb1214b440230d0d6e08601130d3251678d47c003badafe9c3bdd5c8c08107fa15b99b5ba52716b7589a49842fd1f66a46b40e13bac883f7c224b24e50b7ddff01b33e286b8ef6d974757de7879f4fb3fad366d0745d2fd25928285ce5211205074a115032768c2462b0678508321a32e32a040fbe54b1c48b40671210ba619d01a746506930bb4068d800b01fefc03efe25e5056700f18ea8a943ec8e26f8d59b4c89856df628673f1331c0defe25e5056a0ae90dea553351245a2e8856f71331c0d941572435561a1aa54df82b22228c8d16b6aeb28fe91b6bed52047e35b5bdda10b2da2722b2a2af22d282be2965e459f57e8d1843fe77bd87b8ca5156163447edecb8fa3f9f37acb9a8f61f3ad0b23bd6591267cef98f5d76cf9fed7945b8df07963ec5c9c5005185a501f74bf0063a8a1f3733f5fdd31953f1867d01de87e01861774be8bb199ab4fdbd647f8ee518b6164d606ebeac76dd13353119ad085f240f78b2678419fa085f209e87ee1042ddc10754baddf976d75c51c9f743d89ade7f88b15217ff436318cadeac842df3b46e4c7fa5111ac030b06a2aee8934a7f5da4cff8b38dc72fd25fbfd891d27350d30ce6af2da8e9f5158604ff591f6bccb6eb4bd793461fbf44c22e4d6a176664d2d156a1ff4dbf8c9b1ba29b6345624703288801461a94094ca0824e417bd0fde20964d0d885ce9ff05bd371659fb772d59185aea8fca9e38a8e2b1888f50fea229c4d1423ab8eee16b4551d5968fc56c1878217f444f70b28504155f0199bb9a218d95726f0e1e82146e4a7b7cad6dc6218eea532712f36518cd1c6c4bd44d9a796db0f7f7cf8dee3b6ed74bec52eee047373aacc42fddd0b7b1a9487286f4534d4e445398bd155a58a2b23eddaea8a8ede5a1e64d54971527c474e7194bf945935d1eaa4f00eb21ff98f5639e592533a35dfa2d2a91115556415f24aa72eeb839a8ededf1af14b8d5f6ebcc92872484a9143324aa7a4944e451e3d29a553fe9cc5e88db2d01ad41466c9e22fad4ecad00e32a6d54991efefa670533a65bdbf5381a3a253ee1d1557e5a29569d58105f7c03ab4a015fe174dd0825627a5ca29724aa7f68b265c41fda50a3a25a553fb4511183bdce3a8d08105f700ad4dc715dcc37b9e769b8e2b7d7a461c05f22f5f7460c140f056df268a9131712fb43e5951f742f9d90be5ad32712f344aa1fe50d38105f720b3cc1214e169a012e5164c7edefa4dfd389f06edcfd991b545fb2f9e66ec87ac9aae8841fb717a877bd6e43a51cc9fa5eba7a5d59f86f01b3af7eedc5befde5ddc1effc4b73efe9396c5f3afb8c3306ef6c71153394cf5f3da2c6df43bd278a4ed16cc5bb59e2d6df4ac1df9990e5a4cdb5d96fb71ef6ffdc3dc5bd382ac6d1ba136d327fea7b96c753164c2ecf7912d6a371b59142ccb2fc47c636e4edd2d3ac8ea1209e129f73fa253ee9d3f10dfe11c64bc557e1da79d7630ffdb76e8748af9ebdbdc76a227d791bbb3e2428a2f6831052f0cbd400c3dfed9ee6c1a59702185211d94a0688b1e7fd3ee0401841a14edc00d5974f1831effdf9d010ca5218c2bb0bc608b317afcb72861ee8eac77a2c807c1f7c80d4bbf9f7e9b3885ac7fa97b6f6f5e1e2d44fbf927b713e89eb7872ee2d4a134f5de784feef751c701da453023dece4e8a7103721eced909f10ab6e3c08a16745d89ee175060034ff736ae5b63ca5aba7fb94ac694bfbbfdbb9df925e5edc608bf7bf6cd067377645b7c31746596ea8fb7ff7bf7ac55a6ccf5e7171bf25eabf0e3cfa8418d679059bfdc166c4ce54be5d61cf9e1f356e18fc367cc1f6a3fefdd6fdcb3cfd8b6525b497631a6c6ffe4f76b265add2e542c91840ab749fab41f01172061840b2e69449f9688150cc1b382998c271322e40540745e806382d131edd821b57dde35cd644c76cbf6a34f52bef545949fc50083f27a2124e7f46c62a7bc55f95132d92d40b805f181e8f4c95bc03f58d3d971cae9134cd6a77d7ecc8f8934cbf8554a291fe485afcb129156f0e07befe1d08733c596c177ceb997d17d9e951fbe8d6b22e387dfb07973da5626a62f4eff5e3e3ff95e7effc807df7b0f0659477655f8b14367c709480ecee39866327801893698133ee7cddd33921c0d73731c12468caa65c1b7beffc782b14208e17684117d8244f409ee160a7f0ec1d327e8fae41fb50773f54908210ce487ce9c50dbe5219fc71953597ffa3ec19cb938fb72ab92b2f5a3af315a1fadff897d92d57af98ca9ac2dc8a9f5d66692da4ca6b34367c7a949cb037ecee73c8e6986a964fdd8f280cf6e3d9b66fa041fee5c6f5e47ba9859be8cc0f280fcd3b22ccb7a12c25799ec16af8183b95ffdddbfbdb526d8a59cb77ff9d240f8f38f13a6fbe54b695d6b226b2da8e93a762a73ce3d7dcee36875077d3fe79aac8fdbc267f9a3af10ca87f27fe048ab526e729bc9ae39f98a0fbfca975a13597c19ff476ecb2cc8fae306b577b232d941f97725195ec105174cc4452c46bd9c4bcd31235e046edb10ff07067d1f3be595bd602d745dfc7ea8fdc47f719b0ce14be8ffb6a0efe17b48857fbc82c621fe2f0b15f43dcc60b22cbb64de562ffa76ab52fb910fdfd266861961084b5811f930422d6e37a387bf74b1d136a4ebfbd994c7df65cad11132c41149983811650a1557588b4e35753f67ae9189eebebb3023bc832bd48bf09f19d464c48ac848736da77ee03fabcaefaf599da96f6946fce343ac88dcf8bdc38ac06d7a3b5e7fa44b0a737b6e0b717777773f79c454a73e2171a21eddc99d7bae5feb9c98df737777ceb917648c31c62863b4ac187f473043f429fb17a394728bb12dab65fc18638c526e3db2961db9ec73ce39f7de39b7bb6bc1fcb8fac411bee75af51e3b2ff8718c3c114a4cd5cdfdba1f34e339e79c73cebd77a26efff43693a1730c213be79e7befb9291b218410c2665e8731a24ff2ffb44327c6e7e8eccc1c995f622ae6e220dc7de618393a84903966518b100c29a59492a5b418fef0f7c3afbcdd14896dfd7b6bdbd1276959525a966549d9966559f2a594d27a29e55b9665c9ed6789221680d0b7235b22d9a7eb077d3b1af5fa1983104a189c3e65ff9cb8ee7d0dfb75b70e7d2747bdee18b9ddc9774ca6969d82fddd11055b280f74896ca005131b544177d025aa8197886d8459023eb72f0d4e777777b96194e8e656356fbbeecc41bcbbdbbc57701cf7fc9ec30071e2a873ce3dcfc2ddddab73cec144a04fd65793c4e9147cef7f4d8b9d6cd80f2b82a993ceb9773bd7eddc5d739a47866880f2c588930442f81e742aefbdf780983e59d16841cd411821fae4de5f8c114608b7f7a4b42ccb925a84efbd081f0c013333f3ef3f4c65ea1377cbfe7d3047f489bbf9ddbbbbdbbbbb999dfbeef7dcb5f333333747e9ee6e77875f4da676e9990665773bef213cffa5ddddeddfcec1e8f429ebd3d527e79c7307319573ee39e77ceb7e0ffa73efeedefa75c1dddd7ddf414c1537c6e993b384bc999c3b07b5f79c73cf39e7dc9fa0f09d565d8cd0f9bbbbb393417747e6c5ad73ceb97fd551f81c0c117d925f4df14d384f8b613c8d69c48658cafbdeb99f9133edea13fc08ff41f80e2b82e983f025a6821046d814fedb2a53e81c7cdb7a7c0f9f730eea403678e1428696a28cee172b60029dbb936d176db84297a80a11ad270adf44f70b28cea0b304f79db434a636318cecc6887bebadcd7db5b69b22efe3bf8ff27dc3e9137cf691c5674c5647a3949d8a30599f32272b1adf61b24ff15561705906644b54032e34872e510dbaa82bca85ce5dc68c30955b8d5b0d6a1a37551868a8c2e0e2725385c1a54f4be32f9dde34be2a8c2daa30b670e91d93a3e02f558561069d3e3255185dfab4f4096a7dd4aaa31b3692dbf6290635951f35551867f469a92a0c3454aa30b6746a45973666820f7f1d9a60546194d1a7a5559ab11811ab0a634b9f96f2b4ce6b98c64cc95ff7c50daea0fe2b6a459522a727dca3de5a113734c4bfdb036f473af030238e1f6245f0170ae44ee20749f7f01d1bb2a2ee65a7fc7dab4de3d5509ac69ff272293720a7717b78042be26dae4fbc8aec219843a8810f4a35c8b24edae5b17d5a32892c05e22f949f995dba56832aae0629e0e6ae0187f6761b5f70e7ae46917bee8d92f0e0839048632450539fe21e819a76792c8f86986b7279f4db20c99688065968bd68b7b3e406a1c115d4d4a778b176d125a241153a37c2e7bc7925092bc12cd5c0af37e8ba1a150648297e8da175448190dc437f95eeeb04e2e21efa839096477ff54d49c73a68ff68ab4d813010cb3dd4981cda6f6db5690542fba566634ffdae01b17caa39d03d551d68bf64206a2c8ffefe8b8198e11efafb81d801a453bb27de6a4dbd41fbdf56fb69fca7c5875ad6a9f8ea7b8f0cdffd7bf72beada89a335a36db173a188be9fbb0310930f19aa6a74658db4be667467e8be8948d32ccafd0da90375cf83ba973fa8fb8a835639b33cdcbb3bb9b7b44bcba4d491be8384a3de571ca6f935bbbe4a5a257d3a29de2a0e247c87a538eabdbcb62ab3b9d58ca5d0f76eaba6f793a5f80ee36051efb3981204fa1e7741dffb5e1ecf89acf2107dd3979b34b33c96f250a72a0d8dd2a9fa43ddbf1f69d99ef82dedda13bfd4e49ef8a3e6764ffc8c0d99c9ae217288a3bd013d419ddbb6f5c757f4e9fd953ebde722ba3956518857ec110a93b74fbc419a2e03d11ea86e67ba6f4c151908a6cbdf6e734c15a19c92e98bcdefa35633f7df53fff4e7faf48e2ca6b2e2bfd1bfe8517394b1916f414d47febe4169ca6f01f997345aa8480f51a0c9ad55d75811eec4fa20499d046594c2e7eda1b5fa287cd62a07a8bf6345b8b5f19ee011a78e591a94a6d6cf783976445e8b15e1d4f266278dbeb5ca439c8e3620a7d6a62de67253c1cd0d79ff93f9f7672dc42b77cfcbdc1c158d945966323dada9f97aa23698b541a9a1566a7c7d3fc26c1a6b2b50ccafb14951e3a3b061a3860d99988f22fb286afe8a593af317cdcf78c52f7dc45430d3aca7d180ded7157ddb932ccb7e66e6173b02f3196f93def3f49c7b591aa6b193f80638c4e10bb51ee8c98a4289d4da3af5e35e3ec38fffb4ca1be4c557fac957cdead713cdbe9e68fc424b3f275f34ff34ff5e46fb46494a73ba3efbed1dd263bfbd23f335bfbd13f336366f7d8cac79eb65326cab269abdf5246d7b671b95fdfb4bdb46bdf74b61be50ec1b7e7d22486f506ae8cc5b8f69bb3cacadbe1f3d63451c0582ffe4a73ffecf7b1b10fc6a61187ccbd2aa5b5affc3fa47bd01cd6c56a488f92b26e6af2ba6c65fa659f3353e8a9ab7f1515c3f3f8a98b7f13046db45d96c55d2ec2f6d17953d8d569f665fa3d58c66f197c20cd15d1ea5adc6edfd68a969daa8a1194147f16da21859fcd18fbec61f51ac487ceb9f661d8945ac7f5b756a616e694bb1d9d7a3d94a3fa3951ed3accc97d1a4a3fa63b4cc51fd976672543f8c56e3973ed3aaa32592b68eea9f53c362bdd4acf70f7bfe42475bb57ef40e538db61ed9e81f56c4fad156b1cddaac5cff302b52bee7da84747ab0bc9f4fbb29e2e87b491ded420b69501cba5d68210b74f6f5b4ca148a05ea8a368934c8e9fb1505e2f7726adb7363c4faf7d6f68a80c2546e37452485cf24d2584019b1c002422c201650ca88059458400865c402422c201650ca88059458400865c4026201a58c5840898594128b08a5c4224289859412462c64845860f1ae6018e374ce39235c146e4e4a9facd09fb58b108e21841612857ed698382aaded32f373364c35363236359a49b35103d29460b218179dab41c2a0e6622ccbca32180363600c4c566a028f41a33189465b0a53992069d9f2c89a98d1e4a2222591367e192b9060cc46a202a90a648c418589c6f4529a5d48a40c060626cb60cc1460b2d214c818830a3059690aa597c15432980aa6bbf49d6530860a3059690a33a4c79607b6ad0b01c203238458cc12e49530a235739121af9057e41528b897302284a5e565eeeee66576aa66ee762f46e8e565feee672764fd3ccefcbdbcbb83d8e50ab18b8c903e3907b8382a51801a902edc9d736fcef985835cc4cecc2558cab2f71e0c26b118191999914c96cdd0d0d05c34982adb88500393a4d2cb27af885b9c1719ff62436211cd9c7b8f035c1c9528382a9913e218668676df63f667de7a64710bbdaaf8765501638c31c618638c31c668ff1ac5a0fbd6cb9ad158f4ded31941a1fe8b72bf9865b510754c05af2aeede55858c31a8e09ecbc8bc7755a1825f55387655a0a171f7666ad4b8c670e776fdf7bdab8abb7755b9aa5c55c418c36957155768ff55650a5795f7abe7786668260aa522ea3f570b30c627442d38a662e24e54895b9c10b7503729dc6297e50146c6cfe3b10bf58f5b288c30c287714bdc425da9280573fac898dfddb9f754bc2921ebe5eed6983013b29572f45008ce6573ea3585f6cf5df776f7aeb8414660e05163bef5c89c0b75c26e9357b4b823c0eac148a5cb8a0012642891640b9325fad4cfa5e4e4114608010244880be32122021b629f3708a7e057de8912e38685b3b77ef89fb5adb3c5db0fd7f1f78e826f3acd69d3d957a979dd91e0632a47d4a95d366060bd3822474444e445c6ea714445705e382d8ea84ffd8e48464666bfe5950b53b90de25fa526af6854bfa3fac2ac988e40434363c3e4887a26cb6ad4a861aae1cb860d4c650353bd777fd68c90f1bbcb2bb366da5cee72477044db43ff7eefc82b8e6a95bcc245b6fd4f9357f4a9b3d09657e49539e7f59ca607dd63c8aa89b9bb3377c74ac8dcf63d865d29c58b11bca8d6b9df7d6642b64c9c0b1b21ab19e59f1b23699707574785f2b6721ccd70541c15cad2a96acb9c25ee82bbe02e983897fa0415da5c98d01a13e7b297bbec94931586b92c2173ef0e062abfc20c99346eee6579f8b3968c9f7d5da79a3817eaed5c9c4bdce260cccda9338bef58d2d24c196df73ae5e8f284f19a5dc8885eb60c7191d22572298a5c1c7791595fbd48fe88c751fd72b5580102e45956a72c2a2f69fad31619e1a8fe488d581e5932feba45cffd7ba3e7fee36d980e914e0953f9933095950c06ed1fdf3dd4b223ee48980a42dff1dc892883893045745d95c88576472e8eeae7e9c825267b9794216147fc97be8771df1c63334d3bc534832959f222c1bfe8cc4237070686b9be8305be3cc23d0efce0ef081e1a1a92560668f3a2a43b24a4600102427f829cc63fd1558ffcb9589128f241800508080d72eadeda5d1fea8a3a9115edef71da5221da4664a8bb163be2f4bd87108b43778f8f1437280da150af60bb1ecc32b67449430b185e70b77b155ac0f0e2bd76770ec2e862f4e618c928430ce7580bdfc2b9f74a10c6e8de83b014a39496b32c6fb6ac07618c25a984658ddc68e4cda3118c51ca926595462357419fa8d02ba467a1fbd2af50cb52c116232ee8fe488b3e3995e954d0fde92ab8dc7579f37595b1050d2f5d7cc8a3a4b1c58c32c8e82afa0a17445b6801c38bbed25774155de58c2e1da5a5f4501734cee829ad829ea20b1a6770612db600a3484b37196588b10517ac056779a24fcb43ac02a6c253fa09aec25530153cc4519ef022449f564b0476cb92d1422cb16728318410579f36a74fbbdd3f36933fce98db2908af22f8cb6b21dabc3c3c3e0ed0e62de2ae089d3f6f0ffe8dbdf92e08055e8e15e1deae428d97c70a72833167549c75a9c790bd928fcc2d1945e018b22ae94a3949cb63e89fcbccddedeece396bd6b001334996a96666922c7f363964d006e7c9942e1b9c27dd9d73ef3d08618c513a29bd594a7f363964d006e7c9942e1b9c27b51c01e8019503009a8e0f3b7200407310c618a59496658d46a3e9e6f4e639fdd9e490411b9c2753ba6c709ed47204a007540e00683a3eecc80100cdc5f4489d628f1f313a76c8e9f123e647a339e7755d18869148988af4248cc8965ca9e4cda5923f9b1c326883f3644a970dce935a8e00f480ca01004dc7871d3900a0b9981ea953ecf12346c70e393d7ec4bc0080184284024100010c514408200820006bd6b001334996a96666922c7f363964d006e7c9942e1b9c27b51c01e8019503009a8e0f3b72004073313d52a7d8e3478c8e1d727afc887901003184080582000218a2881040104000180fbf98ca000778c6543ccf387e76632a22be0bf0eece612a22de35bf07e4799ae6da9fcc98aa6701df98aa01df47fc747777f9c81ef00e5341e01d123fdfc3543bff06f073a183d09b216c07e5e8ba91c3b5be237bcad8b2f3b5cd48c0d7e672c4d7eeb280af8d4603beb61724be761a0ff8ea4310f8ea5124d05538f2b5af4089c071001e210508820c205fbb4a184ca699992cbb2e23be3a15047cf52a0af8ea5718f0d5b338e0ab6f1181af4ee453e87e1c800422008107380089063060014728200108d8e93122e7c806773e880208e139008e37428401fe81ecf40ca00041f008c1c1830e383826d3cc4c965d978dcbb23095017e8e2e1f19113f1acd39afebc22e1f99011ec378f8b9244722793389a4c3e8ba48594cece92a0cf0b5aff41546be76962d88f8da5c1079a1058c229a066d032a002008408710116288223a7ced2a61c0c17993696626cb7a4b73e9e2c5875c4a9341f7210f456805f8013ccf07f144bc903722e471188087a7830054408aec0cd123c40088146048109427881002e00082877f1c1c93696626cb4a254cc5c3cfecf2910de0334c15c467427ec2c0c0c45c3eb29e8fc15405f8189e9f3232980ac7cbe8f07367dccc8c37cfcc6457cc4c0dd87346171c5f198d205fd98b90af3d3480af1d2588af2d85e76b4fd1f3b5a714e06bab40f5b5a98461e72b8f81fe88a9538e8e1db8fc3f8ec9343303e46b5f11c0d7ce02c4d7de82005f9b887e6d2d427ceda2ae42f79f0e2a210ad043798220c000840011440038780092b3b3391cbf838e9c532abe8fffd1e3ff71f0a0838e1d4e393106c3c131996666666630558f9f34978fecc7d3d0d4a851c3860d1b3dde648af9b935aea6c69b6b6a309acb46cdebd1a2c757de820b1f5f9948cb8faf0c4691186494f10367c13da05a0e00a002d0c30e1d1f1e07479a4c5dbcf4504be9294d85b9d07d17f383a6e375f8d3eff03f3ee77de47cec11e398c6e37dc0a1c3c30e1d7ad011801d50a72d07003147cc3f0e8ec96432d55c3e321dbe0653edf035393f6d6c30224c311efe0653e9f89bd34f1c1c4c151f0723c237dc8d1bde7ce346cd75e37ad2e0a128db579692a3c35756c10ea7af4c050f5fb98a8eaf5c058faf7c05c7d77d03ddd7c03f0ecc21bb644a5e24ce7fe52db4af4c94e32b6b01c0572e427d6532767ce52d9c85ee3bc663870e1e50a71d00a0434e8e4d8b319f8363ebf825992bcb016a371a8e8df62f630c2653ca2ef81c0ececd0da6b2f98973f9c8701e07e7c60d4c05ff064684a94c66f3eedf9bff1dcee53d3948a0fb74bdb0f9ba5a168c9baf5bb464e07cdd3276cb9ab15cf68c1bd624c1d4b03163aaf9ba443f9449314d792aa72a7ca5df0d4d46c33efbd2e368d78d06359b9c9c11759bb564d0fe1aadae18b4dfa46d9f62b6ba45b47f06dbea8241fb6dc86c75b5d0fe1adaf6a9b4c16c7589ae8da4fda0fdf37d6d5affc60d4cf57ee670f9c8b0cf0153953e87eb270e1c980a3e0e8cc85f3eb2987f4c25f38f11619afdd42e1fd97b0d53c1d73022bcb96df3e66db348dde31efc9a43b7f4f5447747cc571d99af3f68be02a16b2d1039dc43fbcbafabc5da25a3ee96e54267f679479ffa6966b6aa23b32346db3ec16c9956d2b64fa4ad3eada79e5b35591bd4ea298781406d0fad6379f4c7ad0280b66fa71c268e6b7d877bb2cc64fa3f9d74e8fe7a05727254ff889e96c70e32fe19a56591e03fdfb17ad6f1ea09f16a24c42b89c3240b39441b3e63aaedea53b3b62eab33ce6dd369998c9231757fa141e53b36e4a27173529090b113d7dbc4bdd0ac5db77b71f7e29b9343ee9e0619204c1c15ea58095905427d8130108f9a903ef9ef32f306208398aa533c7df2dd31d5d8bc73d99d9b77efa4ecceccbb77537687e6dddf684338cadfe66bdea4ada36c541cecddf306a9f1eedda6b2772f3715f3eeaf4dc1bcfb6c77debb376d4ae6dd5699382a343efc19351e2049c8e25720429ea787f01db785a3fc6556da6a66f277659c81694e4af9bec8eaec3267174c6b0a862bc38ad46de13b5266d9dc82fa83412f2fb38ba3da8bec479ffc1babb1dca4d2d750d11411a9746246db4591b62d22a9170c1b725124c40bd3a0177434bbf4a9491802ac9ea791302b7f848cbf3ec43199608964cd6419298381819917a6397d5a898ba354252e7d22020cccc55d64555ec16617e6229b5d3ab5543251c6af85d6d9e50af587c11060f5cc2e8ef29f5d261ad34bccec222383a998b8171af332982ae6a5543642e6b2678d897b51c13c4f4fecc234a65c50f9d59541fd65b4521704583d6f2b7171541162b4d2197df287d14a5dfae42f83a9b2adc4850819ff9c818f2449a527bd7b87bdfb92b6cb83b42da6c236d72717afa9d59216ea3f9a5da8d71217ea1f3123f285740a08cf569da48b392bef1773547ab0347154a893d9423787902309f1aaa18c14456250ffcc0b3a53b319e734dea24fee9bb7f00be31f700ffdfd9be350b841407c78c47b17f9e116ba1fc5e3774e4619ec62d02502fb9f67449c93449cfaefc354bb452a648e568f824781483b6fde07f97df3a2e5b145c6dfed3798cefcdd3a3aa7534e4e0236f72c9392883ba69aa1957d73b0f9dbb4df4f64375e1efcbdf1f2701891778300ebe51f111f7e02b6274a14d6b68e8a22aee8c38840eee68b48a4fd2e2df7ef89b87fbf9a733593a97433c48cc488f4bbb7b022fd6e84791371df3fc28a38e91a7fa1250b1be296466c48d3fe39ea91bbc7712d8be456ae2d34cc1e62e92cdd14e1df27c2bfbf8a54c86e8c6cbcf589b1047027a0dd13e0ceb904b8f7de7b58021e841042882500c618638c09883dee67c9a938952d5bfa4a5fe9d2658b2d788887560be5afab05888390492c01b2c7fdb496dbdd835192fabd372b6e5b4779ff4d11baa28b0df16dbb631b306f6855d1a82bbaf4a5ada2aebc2ffdfa4ef6a497be03f3a4ad966a90fbd2c3943ed3d65125d284ef1d6b4c2b2aea475981b2026505ca8a26b56342155415a82b23e73ba5af3b74d96a7cd7f39dbbcb2f69eb28b9f9e645452492e5ee1e47efd61c8dbca80865456662b725730e55055505ea0a87ba82ba82b2026505aa4aa7aa70a82b5c4c0c29c851f8d6c7fcfa8eccc3bcf49d9987911f13ddd720f7313fa3adcb68eba898ad06b91dba14591fb3225794694545ee5156a0ac405981b2a2d40f8a2a9484aa82aa02750555055505ea0ad415d4157eebada222ab7f6645308f7d6f35c88bfce75677f042e7afef604f7a186d1d459aa49f6f13c5c836265e542a91fa31edd2e656475b90a3113eca0a9415282b505654a19b438847eee9206ed9628673a1fc5ee43b7367f4d5c928b27e7091ae0b758574bd0442567d8b6ff19d4814897c4b24f22d91c8b76891fd58ff688d44a448d429ecfda317514b042316453122199d22c9f797d786aa02b32c54156b435981aa12b58859e216314bd4226ec1d88b5b74eafaa266a86469594a5349cc39c7d08ccc8c200c2000831600302820120b850382a428ee031400138faa4856429588831c4671140429650c23c4004200c008c00c4d6d13e983bebd7ced5df88dca9b3eb7edf4c258c9d009a5e07ef7df9f575a1e6edd4737c240e6d8d5f416bad1c60df992a0523c9659373b1e15febedaf271671fa591044e6307d543584f855e2e7693498b7daafc7b45cbc39dfae04618781fdba15e1850b86ca292add48d5bc24d8d32d0b832afd4ff21162706a629ebe0e70dbea87c656c3cd3eb47aabdc6429dfc4992aa1a57c0e10ba6568efe634c854ecb65334952286d32e54d159428961318bb56d295ea2451b183964ab47950eea47ac14fca87a7947b4b0b8f94fdf455d055f8b3b552d7899570ba5223014bc9d2d3e8555b60734c41df14d791ff6967166734083da96c79af1d8dd28351541e5a5169c108c158b914198f324da9c8ab5291c1a754f91b859e6b15d04e3955a9c8939a9504370ef767ec4ce8aa14dc28c15a2cf8f4b7e396ca2c61ec78c464498d0b87516e7d3f4a3e1596ba67b47670b917161c6b59b2c5469ecbb68f229526dc51885548e089bd14ad412c7f0960f752951f60aa7c459c0aaa0d9f864ea3e952131d4034d40aa2bf254d6a3bd0ce752e30ce53c6b0a7d6925de1e88f6bbe6c0606577bedc27171bb9a19e1ae0f1c1f14f7026721fb7d6a39b9946478a62c0bb065754f9739369a81a5e36d163275d9ae2931eec375977ef0372bba6b5d61d3b4cbaa57ad1c76d04735b27d2957d4effff1576d677b9547b0c3f772a87dc25a326cdd01e94c81ac3f4affa8536603c17f92e1297f9d98c63502e619745182bb2affcb078c1e06024e2de8df84c5d9350f6038ccf41afdf8839937815e1fc147cedfe4fbc7ed8172e6137517ed70df77044963af7141895b11c95dec46fda38f52692d0717a794dc7e742043e2f052a000d0128c03824bde8b7626280dcadd9110f3097efcfced8fc0a271b88d4b74772d3f67e13630f44cbefac0313e7fc01b96b87e5869b65e6cc5e8fcf186a880d6b156efb19de0fc2987cdfa9f256e8bb721ecec7c44a9d50921d42950fce323359cbebdb067938e82817b8a9d4daf757123c02f8fc4830d88429a150cef935b01b67f2a94fa885c721b345073f6f5d3c7d004567f8803df7942e68f5d14374c3bc38c928feb42429b1ddbbc4b1c783ddebd9acfb1a3807b1eef04d412aaa23ac9334c5907990fc51dda6fcbcb28386874d1614335f1b9edb4c1ae4cd6d4dd21346d265ff8184ab3aecd77cca4325058bb23d3b7896086780544c4acac48f7dd1d94f614a2cd910d0d84bacd98cc0029f8c01b3e07e73680273d018bc243f4f27bf007d2183e14cd01dfef5b0f6a843e024216a2e83110f878c304cc2062ba128111cf2b7e9206d14164c4b01060b24eaa8bbb54402a3a02dc6774888bc931452a3ad27b79011d355716e3f6f39e83b9f1a9ca242de518b58d285207ddf6e1e2a30abddf7ed53ec833836a3d1c4a77a9491e0410caac632481785caeba7783efbeaa3294068fc10da0179c3cbf73beac950db19e6d73b113c00d36e5d212ce57c82d20f1683eced85900833135794120d6458be00b423bfaae7fadada48f3a18e517d08ca00c7b7a80fd440081e63872247862591a5c14fd5bf846be5cc549a8480b83b7a00a38889386015b2601eaa3d19c240fe5c550469715f2148eb415186d0a4407df42c34c93cb7496f0303695d4a7b7a69438981536d2b4980d06761e99249fd8cfec7a486390b35abd7cc8cbdac6d11fe74b0f8a7c406d0fe1cead31d8eb132840376310ef755a8760266e5977ef66fa5e56c5c620e5ac91dcbc03fb46045737df94e83305e9462d70178370701342970ea4d23e125b0e6c8ecec477c761997223029b6f3a082f154e74814438a2412476198eec2ab470af228c979c850616b266e734e46b1b97bd81085ec707662025118b48055b034f12fa1c0a3f7308e24e22c1361c6c2e078b546e91a40797fed10c6713122d645d03bab2ddc70966b9fc92acd7875da2cdfb372f606f3dbf01c10d3be6108195a5f22fd99e8d33e9da8ef53eaccc3c353c93b7e70c5938cb68cead73859006d3b6b40b589cae21f5cc0cdaa36dfc80242f9c19b0a099a3888190b0233c66e59222c7c28b55bb2c9d8e2ede50fe507f319f3db715f537c9105bcd55585b15382657296121e1efa6bb491ad58883182ccdb81d8cd0f57e528cc384f42714b5365712a326f13df4809fc4db8808a176310963a50884b495553f63701d4c629123e83cfc8e73b9472a6de83cac4d5f9cee92b60b6622f39c4a4b8d9a485daa215e0e08ee3c553aa8aec0abf41ed5056e49eec48afefea824576d17e3b6eb30d89a44fc8db1efd6bb44501a07519f5cedf50115751ea422aed650e00a051490c4ce5826016222edcd15459d5714697e5436df1e68dfb07ab6c796d17a81cc7c29481460ca42feeb790d0cd4d439078aa379438e36fce16121bf744ae6de8e9100dea03deeb23034b4dde117ab6e9facc63f3189f49d5d651f6ff956c5890ed8270c88a29392afd07630323a19faf64cfec66c2879dc87b5a55fd2e78b323cae510d0fbed99f3c50244d1a1c494857546e8a5de1142788195fed7091d3c0cbdf70f7e605d3f9ec02038ab22b3a8fd521565a616c0a759e2ba6403e30a6abff61285ee2586181e040e6243736717b2d020d03c3c3a97893cb43808840a2ab5d2c1e03a32e4dda7bf132f29c3ce7b2ef61f72f604b9df7f04e0c50bfabe5c7d44537b353886a45d5d0912b8b8fd6109896247da79562abf15380606e6cb319f14d91298e965345e31806bf43fb5a404bfb8ebebba480d140257ce243feef006b55b41b6ccf223d2bc0e2d3702b6dfec00461871875ef4c732447230bade5675c8202895793c610c061ecda09f18b89d7466124f319a860aafb41e5d3c7d20ed150e7a39dca6a2b0b11332a3fe8a3e1a3a79819d7343253f3a458fb96fbe181e4730d2cda7ec44e03d1128ed011a1c5d097c1a8af72515be9b390be0634d6e38c260f0d3bb62fec3e4b5bb83099e9c8d1ae65e823eaea0effc54eda3ab923b581f7a5549deeae9fa8f45ee678e7233632f4df0b6584953f668da06d78464633b4a5b76556d92fccab8a4efa656e386a9b56577a030c4e62b339d2d35c2af75516cd3c376420423215de3e53b253cd732374bec067b56f74c36484fd4dbedabb2b8483ea9c8c52d9895e08a40a1b6525da723d03a5e07f8f7eb024a98ed20c925427e5e68849259222d04695c7a20e49cddc14d2a2afc3805b304f34b4a3a5127ded5ed1a3f585385f27939c191b42abef5477bd610030b0ab2a93e1f5a7caafd5e8a5f262770d0bdf4a40963018217b603c08bbfb368c81db5a46e42b3c94f2ee0e99e506c8b44d7767b9a738807e9edc7676afc002bf5de9edcee0f04885ed4e75e7108bb43316ef4e39d0bdbe2ec5bee818ffa04340c14f16d6dbb7fee8fc0ae06696d8d5f684d1f8fbf9f92ba90d9ecb32d69b5cf8f58deb3c0e9cffb6d2f0d5718dde600dc8c0ebcf019dbbd5a407358f5c9fa69c013cd58bbfb0bb821c455ae54bf00564e6da351290911838062f7e338c44a113988cfb068e8a7c165e9b668451d4e51b0452ae77a2f7a9b28f90b36a43accdfb05e9212e925524531a4c82dcc6e5923c869e5fab1260c13fe49de9fcb5463e0820824e48f0f9851b9ea27c1845a68a6a210e0cef1a0de376f665d309d027c0b4aeddd7a48ba001c5b2330b233f211356ef6de6343e040be81a5254e25723d0bd19b3cc105ccc18a7dc26f42f93d13f74d5c03abda4b2791c4ddf2ce2874a5ca81a63344001adce9668a1fc29de332d55769509735f92c8eaf5bb9eddc5037c724dc0d82e68550eb02c82033feae47173780c104f3d83d5c16883d6d22e896be33b483957a140c7fd455d57555625025677eb821788bb5c57b2131ffa223ec3bf5c4ac77bb94ec6bbbdc32ff656cfde058585de1360d3b700a738238ea5830aeb94329235c56e1ee81ee787cb51f5f9dad52e32d01cd57460b468a4e5eb8ec29c1b10f7ceeb636b70f913cb11d37d5cbdb8dbccad115d0f6d3ba4d37bbb2cad94c14982b5b51a5cb921782153637553285d59f876518162d7e94a2e98eec0057e86f33659cbc6f44ae1a9d6d60bd7a5c42bae57537388a4caf2e48d852cc36bd233bd5b4519c1eb2926e6fa0ae02751322a5fcb14d685ea451af5b3ad8daa863a64348ba3c4caf7a8fe30ed81be420b28ed4bb9fac68ab22d23e70a3e6d74067dbdc2ebaa8b1c2a7919631a1298e0944efea93dc1ca42fc13a085e702dafa20766d60fad635057aab67670c1adee186b81e54e161242a1da11671e7ef01126a4c3138cf7f75a35056f90cd53face84a2da773138eda5daf630240239dccda4297e39155882ee49d290cc09111193246546dca99083e2651a96030d1afba1ac845e1262605109fdb8ff34f78029b7371ffa2bdc22642778cff2524508bcbb3950000855502407a6aa4f91c1a35c9a5c3ce88064e303533ed29d025a5a94fa4c80d4f714cb529a96c75cab7decf39b0870901ec4b9cf60c4e77ffecc548efa1209ff706dcc9e0f388fec4a17f165315478c02bf215a51f4191f581018d14b5706f510bc427d9f46fcc7009042ecd69d8e1202cca9fe952c44e1111951bb1c73621f8efecfedfc8997b6480ec9d13e5148f2fd2d2dc55e61407fa58a5abcf715b341117d73ed478ef8ecf7a4e1c963988bd899905ca0bea7dddb35859741464223322a76c1f34fc3d3d1c357606bd312402fd1e3fe0a36782063a7ac634934d8350623577bc0a5bf69d56b53df50dc5b1a7d491d7560b30706e0d73749a7cc37d30fcde2b7697af242f7301a6f5076d38db9e401a0779518fee920682931bce4aef4d8865e8ca4b078d0231c62d77b34e65bc776b0dafa10ddedbcdcd805fdf592f6267a4680ef6bec75e3e90e40367253164a9b4dda4eea7c643c0b61e773abb6ab347417f39dd4cab534e624a295b5eaf9963ce60c8fbfe9551eac6d49a0769425e484443eb3f08a1877b30108b522ee48455b491ff98d64cb5be470e69425fc4d4c7e8b237b76b5c9019047b2ad0cebed4d67319b7dff31ccdc0b97e2893c2fa854b3c29fe3e003bfffdac0b63e727d0d8c84feb7371ee73d012e0a2fc7f2b5c064ba8762aa0ad5ebc029c008cfea0462387ce691acbbcd5048740e3f9500bed288a4ff917ac8afa87d1a29a62e9925478a6d9b8672a9e4123ba48db345d689805134a5155b417c335452c1e09a8c060b291ad8ccaa846094751b2070a3b73687661ea544918045238d05134b262b2727d3969296a911669b2fa960104dc68b04148d6d66554630c8bb0530f8ed0f283d4363f72151ce8901df66c2955661381ba274c1618a8e3611142e8ccc566583d44e920b4ba7cc3a47aa86a1258d121344364e63c492d9ae033c3934ea95a438e9323a29172bb03050013663e686c44490e38ac9932a4313dbe80c53e695ac314ce2d148a2868425f3aac491d44927655394b5e6b9a6a9b657b775193e19268512803e0a676d5af4c3a4423d08a621bcd42e00f279b30de8f84881e9ab7db44fcbb9d33ce30296775a5485aac4472cf0301c0eef2cce9a2a36c64413c3fcc3d0295165d0da39c40bcad3c6853ff8956bce22134faebd6e5c5e108d5092bd66e76ec11f455b84449c512f500afd470d5faa601716dd56c7196698c134ec2ec69c920614962293aac6388fca8b588b940494492ba55cf966cc131b313532423a2005a1e777a1a28079a501ecba9d3239a810a6fc1e62dacf51efaf2116fb1cf4f9473390b1657ce04b4b06e931066347af4da04d300af5e6446de20f469d1f060d44b768d2a7811b4493608c84d35b206189776f614902e7411d05311238e4cf49781b664079ab7fc0b0dc8eb108020a0ea04d0154a05e5539075f52d00b9326b7e114e4b1a921c8fe606f9fc4edda4021c6c5253a30f47a6e4e62c0dd6a82e4f348ff8d51b468c0d3d5de857461a82c9bf6f62c2e6df01862659f43ef2fc398f638f4ea6fbe93a9de9723d69323c43d85a4135d94eda75f4dbdb13ab62501771ee46f045e9ebd087c60ea68b2356f7326b82d2d627b11ebb91861fde571de3262770cbb8305bf69194fbc63c20ebea4601fb61ca08149261ee9a4efa41289a22e1892219272d1be0d6d22a489d46723a4af8eab2b6332f109e58809d2a555c42c7c2448cb96cfaa01d9bd4b3069a919e63cc6b0cfa19f7e64c44c617c809e14a4c218c0fea4bc822c179ff57cb15c97e43022f16ada4470c7380322a6e7b2208c89f82cf063136db373b7e869cec8b3f4d3c40f3368f70009ea7cef582f863278f66f9ba131b8b111087db919a333a24e5ac862f34310cbb1c7a84a7ac301470643228c99241dc780e0d197845c066318c1c0437656bcd448a09f46bdecd2c1a241a6bd37c75cceccd310d31e47fdfbbb4e334b8724098ac3bdf2044c8aabb0dae25bde6df81cb8de0c0314e674b484bc6ffe566571b7f838d01d3e50e474a8d0518631cf0901557e7d6e58cc07bbbc618330bf11e166e103175673d309a3bc38e371084ada191229ce07c8b246041386012630421969f17e1600026f3cff9e0f69ddf6d3bbcc699bfb1a84ff075df48a46243e454adde0780e3adddba65e3ef5c75ee6cbb26b81ba6c244ddb4b86e6128daa41bb1dbfa58ea09194e4c85393e82d0cb7a1dbd5824664b7ecce09b75451a3e9ef5dc17cfe81865d48809c916e8f44e63bb9f21ef77ba4faed5b9e5b91e0e96ba42848c7b0686ce8ffc49b71657b032eba59f67577fddf4115d31c45085d6f7fde041b6c31b252be3fdc6c7d9450c71553466224b3613a4dcf487b95b1880c23dd84cd2fd1377267d3440c2016285ce4b4e7a892429ec6ef72a9b8c4a1347a2bd3dbfd58c95697f46c580b27ca22d52b0f8c56408ce02c41aea5d7d1eb5d991b413ef4d10bb2bd8e3bb740495b06a02482589baab8ca8553ca1699d15bde610b4e91b50fc69a2a40671fffe7f6b8ae9040e1143ef9827bb16c207fb774fd7c3cd2c55dac405dfe747a8d6cfcbf53ce089646b3b6a4ec194f16ceb267ff106f784d16ef127146bac848f28136a9b2ff04a400f340d9e321fe7f1b685c95e3b89f2e952afdf9879e6fe235133ef9757c17fcdf5a3c6de62ca4ca970d081aa39f34a5aaecde1dcf61aa88932e8c90cafbfa840b3a5fb42d1093abd142dc34a65bbb1fdba5dda1a9a26679046ac90a543b6733bb0cd0adc863dd9837e829673e95a61a42cd8d5f7a64b582829ef3f08af8d05dcf92340d33dcaf9d1602d98e1ce995bc9e2a2e006fa123a975dcec7a912990bbf6dcd6eb38da7eb9782fc5cd0f1f77b52c78303a59d7c64d2eeeca760ecb45d58f37c098e7b7db2158b930997f5190c0cd2edb83d8160347ea63bc3ba4ebd86c47c65a9785c1ee4e90369bb60cd0f5337e443958aea5321612b7d08233d82a354370cadab4f173345491f5fd093302c41d17cf01be9282c07cc006c0402ccc2428375ecae59274365022342b323bcb18a910f909b6aec7d6113b94a1f8a1a09891f754bf7755ca3485d30249c830b509edc5fd149808fdf4889b5213e40897740ae9ed5c0425ba7c9ae15147189ab6f9bbf1168d3f83220e4e4d794ebbac476580b565b5dccee365c07b9d96c8f0df289a674ff45d6f9f08499f73313dad8ea44a92469aeb5550efeb0ec9e82128c2055dee49faf5c7b554685fa99e867e32f1137fd024e24084c93701eb00e9dc1ce023825cec0803ba8624f3c919f2b8887d67e14bd6e1cb7847a651bf8a9d17382689c678005744e93829020e309c33727ecb749c2dd200c4516f315cf0b435e2147615395e4b427f86851cdd848e3fbc23463c028727fabf6ce57034a8a6e554a9442e4f1a9c82a296e975172919e0bb440084220c93a3f67bc544bf01bf3562e99c168a60babe2e818491b1ccae81f571f33f32b9263e3b5ad761e15b541827bafc3a5826a29b9b2663bafd9cb96bbb400d1f5641c4a4dd5dd125db8dc2913f8ca892be3f8c0ca4238210692f95b2e4e4c8db25fd8cc71168413549fa161a4c980db26991b40b44f849c33ce563f44355f6f4012ae0372a11083d04889eb2e55bb25becf557e1edd74de2efa0afff1c6d2ef53a7fd1f66ab3ec63f64a67053af45764a2b0a0cfa2de2d589ea071d998163d6539ffd1f91ba48d4b1c27d098d80823abe2e185f61628d9db784f4229cd2a48f6cf3c5459c6fbcc048c95fb6a2492625c63c5801853fccc6d9adb540a92204a07a30151aa06cae430b23750cda12bdf33a8f1fb4bb1f923cdbf3f63337edef8a56b1dd8557bab05de7cbab35746d28d5090f1de6bf9ac4402a7fed5569caea777f670614663d3e981e7a4acf573ebb8a4fca1a960e0253eb90dac8acbb8634b416837474c51038d50d03ab7d110c4f4853bfd0bbfa2e2db51ed52b94c36fb41a92ef27abde60ca26cb839cf57d1622247aa68ffa5f07979502ef0d0d39376461d8bdacf8d4c01d7b0b27d95278393ada4437eaef4e7d306c5fbaa3a7f6233a47324dbf6955f11278c42e64587942243f684a0d35a942e3b447ee27b0c17c8f58983888146186ce17d562cb2d092568965cc3aaaf9035997048049fa7c08d234125c2a2b84af02cd1e5f5f592b2132aa3f6dbdd095fdb7d0a00638fcd6e27fddb4033ac8a8837f144bba7ef3166b9bf72dae41032fefcba96a85175d10d89b8a3ef2157f9112a8276879165a536401729507702d9e4b041040ac7c86e7e22fb7fc92a5be389a618de28a17294a8b3a681a6fe7f619e6e5f88e083f91230477ae0369b8623c4fd90db6f06c40b4eb1a17bef7bd51f03e9c137a4624e13d53d6f215190cf418528a631e655ec8695dcab70e1126d9a4a706598d34611619ed3b58e04be9d5e0286c04a746cf85c08777bb258b070956a4f0a816c752a3166cb84c7aec4e384df9855fdb383276d45c6aaa2691d7856e35b92bb5ebe62d86fb4504b00b39499da4d756bcce439ac4845626135cddeb9852cb5e97619dcae250d0b18c39b8ec87686437f35ff6e8e802131794c2d3eb9d3daac2462120d93e94a791e9ba7ef34cdb1ea36cb79dd714cacb705d2930625b0adb3a5a127448701ca9a9cb9602546aa7c3821d2ecd16b81a2701470f335e732850c6b430a0e5b52554cc4b118456c28e432ca43eb3ff281ae43c8dc6ceda19c395db56407a253c5c8f0debb44c049395241959aee1073fe1e3e6f29cce969756a0095df458873592ad2150a0f10280967152a8c576c11e196c562f97e98d1314a886b99a9dfbc5e1c8c28015df650047dc370cf3676cef9b395cad1453851e905e818fa23c7ac824a09fa919d67c8a123f85f0588202a3a524c9e72554ad53feeaa47119019eb5305bfb005cd6f36854238c326520267bb61c28507e2bdd20653c0d4df9bf3c3f12560d41394d6a551f1ab7f68447edc4050d9016548c0147ff9a602c63a26960aa44d87838af8f4d6cedb16afc8080639055221651bad25a067ccf3218ae2311cfae333fe8563ad8679d6018b6ea5e1250d9f3ac852d9f163d5c0e39447517b4ef38547d4d40ab9df6261102a244301288c510bf17c7a1390a39c0b6f58101bd27d66f518ba03d66f539afef143f306864be2bf8e9d637c0ad17f19dc867682ee5d841cd8f2894f0dafc1129649e36b53ef28af58373788aa142b06f90a8c8506cb92b0cb7ad83c839e3a3459f9f003e5b903192f38b0e32e9da8a2e109ecb47c1aa3a7f0e5e6586d43b40a410055a9a472f38ae82c1b0adf90667010c53e63fbae52017164bba0350f058ed4d1068a1461a65f36c25bb9b97b51f7f43670e891048941c5e8f028ba8abb08cfca69b3c97866514b84380e2dee04600e91836e1bde0ca41eef32ca7ca365a0741769710ced3e9daaa39409be83a6817c71602b6c9644f66b7f4a684d0a4d065a0c9b6140a9d2021ae6f7e9ed15f70a280df2845947d1d4732d11bd8f384e0d6731686b78831bd9b18bc6dccee26a69b6176b4cdba220136b87bae6efab85f379fb1fa5799b8c07cf13db6f38b0b912d5752fa8bfa00354f1919135e54deb3c51ca2ee529436a547de71f28361396e1e0c03ef8fc5ad0cb57bc4fd9db538d08486d976236e31392dd6e36db212f5cb9c95dd4c754118ba8f90c26bb2e76e02f45d8452deac3c0f5654740464d1596186615380afc5f14199b5931484e8e5bb4b422adf152ff72a2e9a23fa37128efd070bde089b33c8caf519c28ab440f184604decb74c9cb0a7b3eda8ee87cd6f096103e6fe1c925c52e5ee75f644616b72d58ee06acf64c75e8926e3bd9d11a0f63b72c89e071b2f1b78534ef8832972130932651e444939109bb2da6ad12505c40d698c86cf240ba397e8a5a76534c4ab9460d151d716b864ba61166c2393f2540d5b2608f74de39588f59adaf5cb4260a3ce7ebf09d8b8e4b51a9b319b1cffde334712e3a68f91301c91950b229a677673bc527c1dc3456c0dab48746d88bc67187d08c29a36b4920101cbc2111aa2866a156807e2340980e7d3c849af4126471b906adfb8fe7121bafb3ca4537a228bc213ce894137971cb55a2d6475de5ed7d26e2d9d2d626bd1e67aeef0c8c68a231b62ca3a00a20eabb3dd8dcfd56d48512a3ba27d1df269b33659cd771a9612e324fe7490c7576ecd65edd3b22d72e2129375dfecdf4ba32c58c9cf127df2395755d1f0755358aebb4fbccddaeb10679cc83dd8abbaa03f1301fbba106c3355ea7b25ab572639ac1aaafd8928a719ad164c8d661a86c81f2aaa4a924a619db0c40cf8c4fddb824e5c65b0ff95946c8a4c8f2279eafa3f7b0bda58aa21ed73c92d725b81d689f555c2a900e1b4dada01b5ecf6b72dbe53ea586a1dcca9ed9de14587e6aa54cb5e63b817ab4f70a45b707e8138d882dfb3059afa2c11c728f901a3ea9a4195041d4ce72910090491957d87033fbbac977e0dc71f6c78359c1f0e1f79c96a1592ae15e2ef81500cb9192a00af1e67efe85303d11fe4af8d64a2fbc16fdcabc9ea5c80982d8c269cbbb682962aa93357426e3a48822a92e472a3cd3b7ac80fe8926b119517c053335c0e2cbb86d8e6a7420a8cbf834feb1e80b2614d0cae396dd2aee0e46c87c269bab6fde57a6d421c68d6ac3ababfdddb949f8ad26e31f9274354ce041a55ba1373d9773b117ff58a9d8f8ba9ab9ea4eda7ca8d9341a75935103b8b10a9b376081152d9d1f6cc62cec3fbccf4154703bd45e08e814dea71c097801d769c36937d035d5d46647737b786e7508424077f6a7e24e9337a7a3a71806d9f9fa424120479485b9d3827224dfbc4dc57b9b9d8d37c9964c7def4f3b092218dbf711bf6c65d434caa22dc1b9dd197d76fc714f9de276fe0f7f8caa1513ce77113c2182447bb8e7183953fb1c10de2e08d578c8eeb694d22fd0bac20493d5e5fc68c5e92b4da1c83debc8bddeba3ac9beb02ad2b85b0b5b5c693998d01308c5219ffe3fe323534afde3257fa3b73f13bd69cd2329e0fd0e482a9f4ee26dd4a13c75a79df9a653539e154e208f66973bfddb19bd1e6eba6cdcbafbb327ad709604fd5f220d2accb1345bbe3558d2eeb474d9227f553b52ad9207994765d3ed5ea789549ff77b477875b6d774a76cb954567b7c60cdd813e31da12e9ca9268e9332978661f7eadf640ecd832e306c8703ec3d07c46d10908a4be67d7536f5946fb185dbc32ceebbe3aeea25983f776c4d1fc516cdb1bbc9fe360d62ac2c6bb47097bf3aa02cd0b4e40fbf87fe7beb457a11157db2b6890acbb8b79f8bb21fd53b14c9730c3625f123b9f9b462b2b98ba7e36bebc80c5c39976f7402bcd75408182fc44eb0825621ff7e7e5b5211f1ccc6551a871ff6ad8c5e5719999eaf9fd23ad33e18ca6b38dc9c9a91789864e278ea5d2dfb88a63d38c899714cc272e65030d4e72951ef85df27e68337389f59a327a7d2051191fca24dbce622dee18e15996f541cade0a25b6b5ac78bbaef71468bf53b1e2fc9c7c01408552e563e67159d5b8d1ac82f7a9275fd8cd9d25c2420e1d42ab6d81603ea7bd0c651de0c96f659acebb8470053b4947a72274c8d6dc19cef558a38881d7274f451a90540df08a872d7ad957270a69414b543e5b7597deaa8271a045dffb30b41a1ddba03f643a95538a7f9824e463928ae721e75b86e080b0b8dad5278c64f5e468361d6f10f1815548a0740868fe470c9beff7d10fccae5fec25d6e8a49a947b70166c2d8c8f27b8fa526a698c1f7c80bb04be415f8bb4284099f1829d58dc9a0dd698869b6a4826a9247cfd25381cb4241c5dcc92d774b613f1782da42120952c87fc9c2ef4b25c0ac1a3741be89efff32affa4ba94a21c9da33f305136ac215dd3ed4a0a2728fd68adcab1aed4477069c2524424077d81c62551895780f6017fcfa1aa8c513ac04b3b1f8424d118a857c64b4c05db29cffecf5e4d1bd5ad23ced911c34bd788537352085f1e31cf51be7bc02463df55edc77253e177f5a770ac9c4132bd002735e9ec4a85cb71551494756f12fdf37bcccec795b4888c2d98899021157a51a4ae126cdc2d37e3ceb95972ab28779dd873f1c9a624956737f9685d5e36eb6d0a32a6dbb39171e8ffe8230a2a110f89f360c23a88121a8341d200d73973720263c60db20921c1596503451955174ef3dea53c9a27ff499adc3a98a6a554a588c648d8c0550295afaf198852ac489fe21cdf3875c9ace09aa034aa01347ab9b79f4cc39ef46f65d640a09ace570a977a6dc69ff960c3b47682fb253bfabf0f08cab734562bffbe618d31716bd0a7120b584374741a98610a37790bb48cfc432769406af3e70551eb6649fc4e20e3315cd4d7c0f04130973502e69dc739212fc59deb89c1392b29f0302d2e54710813b69f96950fea376b6901c7c01194208382ad1dca694145a629aa6f20be1eff995228cbd0489ab89b5c9f48cd1c0f479b67e48638d656589999dd99ace5dd2679ea8f84694c9724b9635de61a7ac2939ab0f08b70c259f6da180f814c291954529c45494c0fa66fe5c54c8c7a3bdf4ffa1db664c962358a9bb0454a4d2bfbf0009a46590ea73e933c20ff829f7791c7025466bf0e3a3911b3015115d9bbca574e5e171768365b0c384f8b230e9dae7ad0b6bd9ee823a66c00a193cae0039bebfb2dc465f77be27eee15c369ebf45a2211d1c4af56f1456bbf8afd9314df1d000b23e4af129dddc73cac384eed232dab5d07ae8a1cef385f751ce88f34541110557daf1ae847df78c0e12c8104f4b8a5e7203c29551706047e7209f7bfd83ed1ed2da98614d7c469da7df3c084dab978fbbc7dcd0915a8723a05488fc5eff9b034d7c677722ad81d29d02e74dac6c1e949790f948a58d42ac74424bddc585ded56f8fccc1575c86d04e983f44c2c6042bb3339e6cea4593a700db7a753644fbf7b611d71d972563537726760c29664a4c750f72208b0e4bf734f3cfa5cb10a088d40286d13795af9cfa1e1029f5d75ae3ac67d322c9e1c9b012093bbf6662bce394c7e49f445174735c1deee32bca9c717659368b390e0bfa72c2b4081d4b1e0e3b54797a6d081e0ff69be2fc137c975693f9c3e44c9084733047289ce33eb4f6177d73bfbcc5aa6251194f532210b6f3c136a984317adab41b6e28c0edd66a484a0ec8f0261bc0c84a48e24be0051cac084319bd75b222c1ef49bed7094d30ee7d5a22acad46c9547031d61e0156094e202ff8352a89a14c0f67262497fd6ed1474ac8c9b14499e92d06f457307b90406f39d68161eb43129551b000a8896b52375c2b5c88e8f6be4b5397cb274a31439ab066a872ac6a18610b0fc439c4e7d575adfeb50c4685e6e8381d416cd43bd8a32c5994f48dda9aa6917e8e325392faf78dc81a115b093693d4248ad448416fcee4ee07922139bf2c83aa712c75be4802f35d814661ba70727808a6f825c5d5dbc54b2f9045193b95713959645df345828543f6acbdc012e34ecbd48d7332b19dd411c9fda734dd15ebf85271b7bd6bc9dd282b3da90ed8fdef383fc2a17c0f2827c6882f5320779d9f500b114d11e421b3a7150dbcb92c2ad7bd4684374b5820f6cb3948f17de5d52784c4a405a199b3dcce1f6fd1833a571d2e04f23211e482c88b51eeb7f548ff737af01217695d6e0ea61abebef04df6beb1717ebbeb63f197a124b56d60ac8d266bb7ec4e41ecbff16b26cd044a5fdf36c97e8e737ffa9fb4b1b1936158d4eef208be23195d82ac3a9bd257bab77ea2cef4b58e1ed03b36d00c9de514969f503b7a1eb2cc2006dff94b4c33486eb4e89ac9d418d01481c6ee5a1684b76632b52c5acec96d6996fa3a122cdc666c3e1865b7a2e5c57ce3019f4058bb919a71aa5d726a263e37fb19cbce60e516423766f884d255f8a6a0debd785cc4722ca9dd1691388ce8927dc557b808f5ac3885fa85c73c74087e793428bdbb3def20e1d3838664a3bf3016ff6946f613d9f03ec07dd8dcb29d3c2789b060116a27b0ca6b9163e8b5cd3e1902cfd29171ba49936a135fedd4d0ab1e881a31cc104678ff8693e80f45e53e909eb518f8438787b2eaff7afb7c646031b3b435ccd34f044e54f70a0f22f16be59861ffdf10d2f92828e8b3d7e5a9aa797b3d80c9225e4d1a0f3fd10c112c7b6181e389b84efceba9d54c27f814f6f4d3f8960e124c41e54ef2e021515d59af77662a963c640c86cb78298401967a21a8b7774dc0c1194a8f760646c9f7326cec696aa4a2ff5cf9990f0b806717428f7b338335b46ae23c8f9f5ec39fd5ae1a39af373a6c85421c8dc44d9745c9c951bffb80980584b086928178c4567d60d9cc82cc91d7749b0881d9cac089c51a583d3d357b8385f3d9fa4a535692cfe8cfbcffe94f1eb89437cf49434e12449ca0b18c10451f7242d847aee10f204fd2c0d55c21c817fbdc3872599b931662c7a83d7416e3e1b31bc49800b8a9517bf867e4ad8057f32c37295793c5354b5b7dd82183f80aaf15c19604acbbcba7634724cc085d06e41a674a9429a72ae51e45cfec128d102043170c78e7cb006b8152b72362c58e4f15909a43b49a183ef2536be2dd588c08414a23a97397f39741c2b9b925ad0c1799922d63fd31d19a813fbe3258efb0c99a6c9c4020be75746ba92e30a04468e3581a6caeb3add4bb1470663e19e51aa8b85053d13f71d1fe072801a35931b7c2795c0e92c66cffeb71a7106c40b4401d7270fb8f0b195785295366aee2859f027043eee9129fa6ad1503b4ad7574bb448301b819109ce710d5642ea24111d991846465ea228bb4b75ddb779c6100f4052d34e35591aa3f747c11025f2a385e1c183a0f46a276231eceb55145c872e2e86d234735b988b19fffd1826d1ee9fcd6975d0ab7769ecded38354d0e8a7581da94a22746417ca7addb93a194157facb127b9335c4bcaa924c913f55e179bc8e8bdd8c42169dbcd5067d1e94663d55c2da9bdbab58f62f31d33256ee4a72de4362c6411051c60c0a27fff9a71115e5fa3979de88548b9feb215c981d2f7fe65b5efc158afdb3cfc14d7993afad0be5d69b2c613b421f9133baa94dec410e52f74d9f95b31a59fdc514a26aa282eb3a61ef5fa6c62b7b27d60556ef64c5d737df7fe499ab7f443b31175a8d383e7062627f632094d07b6399409386c4452d7378b41508c9320b674eabe0ac79f03102d835ada03de858deb9a8130e0efccd4ba39862b982e3e85f32e86f07d9aaa0e098b843084e19c051c1a69b5024d18bfb8083bf881004709e166fd5768dacdf5745f1ab5e95671bbd1277ab5f5264959abb15c84c769788446298e1bc97759feafc2b204269e898ae676f13202cd96590c6d7c1ac0998d200dc513451b9f04284571efc6895d31a447728f525507979f938770f91959295a3d0452d50b01e7d439cb2a07f3c249f65f0be689749558132eb86839f38ffc50cf2989819c4a8527ccbe91695a441e8d36903fe02a61f140bb645e32b6cdfa660061e3a08f6ec6e433b133dfeaf0e40a6629b79c08989d83dd8d9132c6d79b9b21b45e007259558c88092a564e1c43a80fe60cb4825f97e3792bc005e4093a7d36be700324dd488d4778f44b6c008ed61e81278d2cac8a4024e595f91dab5f827c79066ed5158710f404b487e193c30d56822fffa22bf6e988a74f367e0ae06769e4bf9841d20de98dd12e4ad18e6616f6a1fc0acdf76b5c3032d744e30c1171c34d00cf0bc15176c3c4b1ad1404c88ced901a49335805a342430ce35a2e9608cfd59e10e9aada5f09f6dbc68e2f005408c4b81077fe5a7cb0fcafd9c5f207398a7767957ea76ae3b08ba0e54f13b681dfaf04b233aeefed3ae3c2d6fd7d5022731cb811abe1313251e770d29b63be207189a6a6c0ae8001e8c61520d3c45ebb39d236afdfaf25de857e7c88427e026efb840d9051f0e3e263e668a201d0bf071a93d74fa497dc9a9411280ef976bb613dbea8cab27be9942d4ba01b3234eb39885a72fd259f65a6b85dec88151e3c1e1aaea6cd08bc5e213452acc70eef23cb1bc039b31c82f8884383439eb0158ccbb3bc132a519fae608ce794459299be25f532431226e4516a7a4ef49f92c93cfa9856a448c490c99b8ed817a68bdce898daa78419a15c92b9b9fafe4baf8c794255c91d85a399a5ac11a27269990e7fc5e4a881a7f5e21cef48f7e494b499b41de3e86b89610973ed1eb897257a25cc9804defd258176c0e9c6a341d6a60adbebb82e171a61b4ea73c77d851e962ee405adcc0c8fd801f2152c17d4e25881536a5a7e29dc00f07e13c922f3875af640ee91f8b923b47aa425f1f68971defd771838e048e88365a82266156c9b9a7aea3f1109d49a847b85edae13d8c2f4c4daa7cfd3907c0d0b0f84a9d92bcca83988bc5c4e06d8ee50516d60d46b67f2d443b53e9fbeaafffbde810e34b30a19e2ccbb94e927d783d6f146a47419bcb92b3558066402bdbc7affded77e92cb72679d6c415e146d854bb8955e104f71d1527fc77c28db183d0eee7cff0fc0e97f8059c93a66e4f6de679d6cab220774ddf43cc4cdd4a05ff0500b92f00d42b2beb0b489b770504f0d7c97c8d90555f7b0ea4c1fe2791a4a8afeef58d8d90fa31af499c3aa3bb07d6105c673003bee03fe36c2f9ff085d79977797c862fb8679cfbe3333ec037f32ef578f33c163b482d9a28e016bfde0ab533678b9ccb3a4bb3ee7e73c71177ea4f5d232000aa64edabf394e922084bf34185538d2020938203178213269d019ab3cda86d6cf29e48f2f7357292834b96a8b02522fd432be0a6f3622377f03dbf75f4343270bc74d38c820eb199c6d9503a9911ac6aa6fea8974cf117d1de61053668fe0040563d9e0c68ec90df4a36aa70c309d590db2a99e04ad0d8ce83f8798b975258cd98c1b0e985081bcb322ef210f2cd3801de6846f5f1552c213f58b401cb7ffb03dfa89c72d4e37505e5a3417079b623982201d98352ab65db670433c23cfb731d0b1d2883e1ec45399baed37c8fd0ac2e23315cab86ba651b66e827b87ae4d94e8944c3716b199ba2321afde84c925ab1b505175e17fd17ce4f02a6572b012b94f8bc9b40b35ac2bd68b4fde843775f008f665eb4d7f58fec5555329e13a117921ccd8a13f257c2578af555205dd0452107667b05186dd91a603fdb29881322c7b44f79111eb8934a5d7f63548488bfee6cb39698487dca5f5a0d2380ececdf4ae30e8e68fa1e4a8521c316bf1935411a00c52715ee2dc0748abef0bedeec820630913dd5a4f0f34d0a841623e426d41a4fa6fd7ac2642854778062c65cee6ba15bb0814a1b12e4a5c83192bd2059b84cf6b14bd999eaa643764d4b7264ebda836a9bc8b98c11da97b7d103cea03b2119b4c803ba077bc66242575f7de9993571983bc48b5acb12b20e58d3edf8def535973ff6dd40e5c98fd76600657561e71631e5cdfb86ae294c3dded1276c7ff1eadf35724c74b4a8a8f9c9aa205b2520f03dcbbf6ff78fcfe1a7864b982cf43967cc2f5dbea0727421faab337338de840c78a111adc6347a4c7e31ee790fcc3c7b6acd7ee48955cc886cd71bdcb6acecacbfe3cb278b333a8bf7751d7c07d5a6b92c17a7fa30648b607a9480b956c4e74e3001bab00e5795d9712f5d65216b4f10ae008815fb8b8d60c8b893983a9791bd181a1d3f599b4a10f0194aa9058ce5216f92afe2794da619bfcad0fc88a4410634e94efca2b58065d7579595cad57353f53ad641f690750aed0928c4ce95d725e0071c2ed4b4f491abd2ad7687fac66014804dcbc8c9cee5c0ff52d1a2d2caec7fc1a075452689aa7a910b30477e65e895dcb32e81cc433eb5a07f61c64b4733928f31930709f14bac66c61e7af33a9b4af1db30b983df7da932cfde93dbce0356111ccdb97353c5f8ae42cf0e528aed450f68497b459846716bcd343d14f795b0977999f28287001054409f4ad1977717056d0e84b87ce05be45d548e629223696b22cae009ad3a1fe34b2da68dfc185e48035bd904c04f006362979051ab44d82315e17eaa10bcfe466e529d531b41ea0ff15b74fe00f6d6d364e0d787a58ffbbb944cc607aa9da19e343f9266644d02ee85868b1018c2405ace9239d00d22908739374cd9d39cd080ce20b07de2482766bd037c411e70123d4a687c48331ac445eb103f4077fc51cc068e2fa20e2067f526480a0a0403fc6f6d87b0c7e06b20fbd425b399b2c5a060a0f6802d6f26a17e8acd9106bb711f2b28bc1a95b8cac2b9c08c41ffa594ca46dfa61da0c7aa21a8a21d0089cc0005afb9fd875338c2cab2fb5a165c1aabf7f2e086f7885178ae6c0a726f420dc1e57086c8930ec64c0b69bb3e592d0f3db2ac22fe21bf43ecaca0556f0b09b3120671b28688cf362847dc702bf1c98d68501e888f2cc6a64cf8f1efca498af971043b339241c678f103cfa1c80610a04746df7665e6306f0a5693c4e735076011eabfa789351a4858c1ec7545ccccdf59c35191620d6a8313296e9e62dae9c2cfff15eddc7bc1c77fba295147c6665556010d788bae35496ce84cc93b3f3a2a9bd46716436b846cc3ee9b55341819aa18c03ec387ce6424fb24892572fa48c068f1610bf2d1a91e2990955a9c11d573ee5389b421b8b2ceea742807316f7d083e0115cba6b10dd32dae8364a75f46bc299a79d64b1a9e07cad8e22fcbd650bb54a25c40391a81eda3dead90be568af61f235a3b3b9b1dc5419ca4195abe979cb55c817afc7ca4a9e5f7255ed52a7eea40900ed3258a0c72b4baf7f16f8f25d10846934488c57eb7bbcc12e1aa1afb725248b5c1fdc3d0d3c87acb21b09da3e4fe5eea963e027090e3d958cc60d4e17f4436c72f44a76ab7eeac428d4a81a0413b82e989cc99803f5e266161150e22a667c515b8c92a780dc4c60379c447c224974adff30851333315263f8b8267c5e10a215051a2e8026e6a706e8fbc32894b61c14a5a52eecda18364f4babbc8a629cbc365e9eac42003379a10fa646ee09a507af1a97faf31fa339c91f523d2a02e7e6a9764b5143c73e982b0c93ac1b62a72373ba2744cc0140d5e62903edf59eee8f57b0c0bda5e2ba132f95866b244f733de989475f5d2d40f1fa25b6efbe0888de3f31be3acea6e9ecd2a90b27aace11bc6873b177c58bbad012c548ebc35963a47870318913378a1b2c7d4d243b07564e6af350facf15d5fde489ae58238bf8432483cd62d47b4002fa8a52383bb6615e0a4f65b809aba2952629529a351c703ef800a2d8c54b9cc596ae067187f827abb23cc7d2433101368dd7338770a886738b75b8a200c51ee54ac03849ec60fb4311b9dda0461051b248e9d3c49ea3704121b62040619e39957e16c50291a11758b12dc66e278d445e997755312c6f402f17043cc5ce422e98614183c456b5cd564408d70e7a0886b7161d15152b587113ca64f85ab6f8f2b1285447ea6ca02036dfdbc00f05d4e87deb35d2463167ff4520c7a0522b45d6da83d76b9a196def6c6d4a78509c10d2c9ac7525cd12b8dcaef41ccb322e00abd9ea1c015bc331c0caac1800428c135725348f566ffbf6836c4c5e2c687df81212a357c89983e65175b758801d02211c4de079f56de9ca49232af9a30ca093f009bb607c475a3eec674005e4aa98d66254f9a5aaa273137cddec83c88650104f2b83ae2b48eb88d8df1371be57d9ce8781160c27a691847d9ad174e20af52613c888683f0e538e8fb9a300ce390ff1bce554d48f862350f399d75d1d304f2235eb4b922145d34ffef6a270460a2ae3e6499af516673fbb815877f60d20fbebfce197d936d1906887ec8ea8ce293c308116ad2897de8d837f5b2f32f995df0566173460629cdea1d38f01c035d13543b4409a712898a2c1ab6d60901f9b8406a43240c30add6b8798c31a0dacd219f875affa69968a65246792e83b2c2c05e14897d251110034e6f318a60171f93e8eced54055dc5e55a5ed2bf4f58c44bb8d9dd574bad046742c092155fcbda6cf77479212f128c32f1d85368bc47d5412dc93c2ef4532918c11965d5f0e5213fcc4b684462225056c8f091a0c3738f2ad0b1440af873c390cefd8248aee5859a9a36d70ef3763c289e4f1c5889da2202599da9c3b08b52a9a25f254195a8f41e0067bc29a622d0df053ce3663115c8c9adfae253fb267612f0506a3e0d2f148c51f7c1d918afd98c5808ee7aece3d05aea06ee4aee023d2d0d7c2c7f1b5cdf5a6babfab972211bb0f9d24df3cb2986187dd14eb7e27b80df5ec5dcb793ea86d5ee4d500dbd118d567cacf1b341404594894a0d04603fab6306c5401055962d54ed793586e0768a145919cb8397c5b627baa462f66ee0874d580e3f541a6f04d5eaa215fd6050330d675cdcadcd0b07c72354fefd933ec5aa948c3886ad64975dd99b8d4b3fde55cc26f95c684d978def938ff336d3a741ca030720f829fd7ba8601f558dc50ae3ad6fc64305812961448f23db9e83a2944bd38c3abc00d1e9e86ef72cd8dc8a77acba6e08451cecae6b44e6faf307ac99fc96725d2491cb9fbea5f1a386148bf01b84e9f3e0ddec9a491c72307341158eecb2b72b56cdeda052b16215492d2b34f944b313e825ec5c49a0237e0e6579dcfd350a132f4e4a6dcdcfa5eacdb8cb8a8b1a0a9409a9045ba79619b308c2d33e434695a205799f9d8b3bc1d3e7ec0e3ada44ead8a947e49b477883a3e2a9b421da2e9919368d9fcd1048583d07caab2c2c43973000fc45cfa37f6ef04c2340698788df5087f1a5d73814bed98cccfd0a7996dd1c4d9103f04de4c0a9d83793c025536e4b9f3a22995c57365c8d7b882d876ff02fe01650f6eea581bc64057723ecc553b53f848a0bc8612fb5b42d87cd71df791dcaab8787631df6720194af0c8f958752317a2ee2b3b17249087626d4dba2eb577c26439a82b1a52338289ed939f96d8c97f364cc90c780d302783674914216be0d8c4a2e83801017fdc526e294508ea890c20bc55f04142fe3e5283fd2aea4b5b392831ad6231cb3554a9accc911f62ca302c3d05293b0c82b80c2ef977a408c0da1d58b18a880afefa0f8ec0abc1a966bb01b1ea93467b886256e7008d6815d3a6e757316f4aa3c1d60923f60bf557aba56e4bedfeec25facab5e0d983e2bd912d6cbcb8e33680dfe4e5b5803a38ea3980d6cc052d00a7b62b91bf64d2f6dec938319c70e6ec4017b2ab65aebc80693eb574691fe4305840e1c63512bf4c7d006ca97e449c4bc61d719d062640e4eaa82d98bc51d59dcf433c62836e3885915ea4c96487a92a7fa34b80471a258df81bb53b79bb4f86eb41c236f3c2d0dc0f17e5e7fcac1721884941a9cc0e93307bf56d045b32935b06a355b02d73a25b50ed471ff1c9b934afe2c2293ab926223bd3e221a0dce710c4d00688a33e29d0cc0c619e918c59cfcf2eee18884ab16e48139ce0eb8c02658e1e4ec4f7f1016e3681b87e40c7f3d27d1ed6aa4a6c5f44f824442bc6c2eecab34b52feaa6f2e0ef7097afc3f4024175ffb2a7a3de882ac9a595d749fbfd7aa5b32d70238b4059a9271608783fc63d35aeb2dcef7b2ddc84225a0f44c0de7494e7fe9f79d65139d8907aac99162ea68e513d277ec2bb01bb312d5e9ebea5068f82df24e0541fbdd0952ed18570e8f3451a7061123f3dfbb8d30a9d1cc1dae0a04562bc2b71beceb021c97c84a7026fc50e846b7f03edc86996df8cb664f9dd50b0faba48003eb01e435c42a61838d53d1b87d4ebaecd0308c9f5d1fe900a8859089ba846603e8d41f4f5603be3c4e120875c8feeae5bfc1281c5d826c899729a9139e74fcf042433e6f1ca7fd0e616c91156151ac8694113d4cddd01abf0714000655045292865d04fe882ac98e87759a1f3440526bdd81521b0714ad7cb9ed97916025dff8c00dce0f50c2e7e8af2a0a3bd28c6dfce387bead3a686805bf6f1374706e29d01c9bd2da67d024c3a1790b4071704f200e6c5f53225e70b70c8f4132bfa37bc1009a76b64a23c50c0e9ff851040b78d951924f9515a259060b0bf2291eabd8df143fbb542f4086604bfa81f2b38c7f12d682ceb798ab62f1ab99d48243312a52cd6c1ef60f03bae29e7c4ec80a44d32c51c0574426a2a2232324c3092c07b73d605a4449bca71e8db7aee8d81cf6cb78938864d9fd380c28fee80bca3468f471d063955c3e03856b61280a8920f3fe07f4904dc4b07b5dbab0968edda23467da8bafcf29308f950c56554946423af329092805d4eca6e4b201b7cc10a31edb0b9c3076096170c3d0d96111cb19ac4fe06b30fa113643d3a972f61a9d417486176e7a241bce30eb41ddf72457b233c0865d13dd39df9be473ec78035029a0e2d2e073aa89c7ad0c67aef69c215dac304fc9c80bae0d76dd21a5cdb0acc4029350d38a775a636c85d718b586f612a7fb4ad71fcde27b17bc1689af37a58f145af9fb51903de4e12c3b9fbcdd07fcc70c6b9d107fb18bf7e1a816a88d55c9995f6d81e0600d40fe2fada0fd4ff1b42b90f47c09ac17c46eb92e110f666886e7732b838be2fb25a635512d4ecb42e0cc21b4f9e3922167c03223823be8b5752e8f70afba92ebc5346cbe51b483684d340f889f2a59df666e66a0235381427dd47c098ad460d96834ee64bed38d1e7425259e5a15308fe5e1185ffe0d5a381944e11a8e72c59da941d75bda4c4b2b04dc585e3c5b70875d628855842ac40d5f569d1f120a132a6405d61203161c0ad374097903824b5035cddb94d81201f0b97a9487daa0ad3a4820545111da0c02e23bd30c1830fab66c4c4c9655d2a84e041ad322e1b7fada50fbb88d51b9368cbf6462254cb58a43881dce2d8c3c1b40ce64ff715e78a1ec4df1e2c47089abe3c4fc55e16a901986adb6262e6928803963d11ac96b0981a360abc908753456c74f8fdc943fbb739c7c1a56e10f49430e85e41fd488a511661ad594b307289f5c16e50e8b13f2eb607d014bc3226ebdef2a38977b704619f8b1655a5f2eb29ea1ea1dbb2538611781cebcfdb0a548f51a0fc78cf12b662533e04161e314e5bbf5c234b94f7f245676904abfa05a53e898fac868b29fa45b047129e5fa82babdd812a918da9402aaece1a606ecee07b642e3a5a054bcb600118ae5bd1633c9eb801cfc6667a6fb20bc315e9cb4c71b5c0ddef3e8fa1f7fc519340a5a2530af0b08af394cbc3ad3506c68710155466b1f94f947bda7bb5f6ccef1a456d874a0b40b6af8cac0fc7158a43e6cd4193e844329de500a41205af06b58ff5a5c8e8b9c453f63c9283767746f207e4b9867f88956eb3441281621c0faf4c3789dbf03a61a2cfe54b2f4476612a81e01d06c50064ab30bce26689f2dc697e70bff764ab38eb1d63648ca743df008f5b85ca84f310d824912b040677f818cabea999b3e32edefca10239308a15449b4853c5a030af69967c0d6fad5869c0f8ef4b8fbdf4e7ab10c4b13108c9f9e4e76ef6b48a2b9c5f6dfb4454cc53ff9dd96282cd3381c42b6d872de522c1960806f91d597c84703cdecd428a928392e2d94c6cf0b7d65e90013b03f444373a6c98d2de1b651ff1ba13655be46754f00d3fbef1a8d0402eb0994996c5e8ac2d830cf6aac3155fa15ea021f51bc078d015d6c0e6829a75e10d0a1e1b2acb9fde0480533ba07421bf42059f30a30af7d6449bb1ef1ab46a70534fc808e450158279d8144cad02602644edd7e5477f88e208bbc8644b840820c3cc03470fd08d3772c30b400f480e6a8d370f8dc6a245f0b0b95a2139d97807cd1eec83a2e8a351f5955cfec069a37074fcec578e598f63d3a644c853140cd9caf1cb40e94108f2bd51d79ec26c29c47fdac35fca42c7050499e2ff97bea29e49d9b215d944a40943d87d2e698852af0fee7450f7547461b4cc6f56afa50a7cc56751195bfe2c14481727aa9177df9422063a625263a98f2efb1a532d8b7c6788261c1e5c5f0acb09fcd01695ff5b944668ad9e02720642808bb2e8a0f90e2e84f28906ea983d5e43c5f63d5c158fed498af475a43413311cc98e6746e200d1eeb93b57dccf8fcb9316c578a2e008ca0be69f455ba70e68a7700ad8d5e595e20de741fda06cd374e7bf5efe540373a115475c5ee07ce0a7e6305af1f2ab0c7aee8e1aa99f7555ba1f39b84ae256ca0420d33540fe8c33ed0cc54529e40ccf62a5f6e5ff28b8674d45f72a17cbf6622264513e80c26c55e4926505875d33729c187703e492ae0fb5aad5f6ddc33bb7d0e811fe6e21ecf708b18892171051484dae103bf7ce537ab51c5c19013934b504082ff60deacdf0bd62d8621be8403f4e1efd52def96e5481f4c36f2568e99f00ffdf3328b18099fbcc47b6de55a9e68515c4211e8faa583e8f90a11d4e8b817d1dc437604f8b2c4287e24dc3ef416c2e8de7781fe314711dd69d8fa31ed996c7648a050b31bc0292bca2fcc271563de2cc7018eb0c5d132bafe7b31a399c64e79fb3cdd073f965e2d5002b3b362e0a51fd25a72027ec1b40442f8e7063161ba26bc3b048d1fabfcef444b73949a42ff56ad30efb40131b3c15a7103d3a8123560c951c49147be17869a4b363e0560b60afebcb64dadccce9e975423e26c47ae774817ae2692d956b86cef3d6fcafcd7f325399b9818a2c8b9ed0288e477b3f65e8bfdac52c09e658efb47be327e424aa41612892afe3dc0ba30d661d1dd8c0e6cd3dea21915448932333c627a2b230d245994495330cc9e0488a3c3663322d4d301fd30dc41aa5f1b2a127087d47e24450020a633cec04bf96c0a5a82bc9e4b90be92b6403f9193d4240707e801905304821447022a0a6925e26b638c5d718d1181fcd1b7d1785b4a4d530171e391112c6452a849e2f32af0d1b681178d42d9fa4ff4a1b720b13d923da9d2d0b29d705bee52e5fd27c51bab607b8487411e6c129a401b6a8ae708939e8ab852f9364e3b334487255d04b4a8d72410f5529054fb2e9ee3a7cad24cbb917e49878fd7c07bbbae62948195c16e52296f37372f8cef70f052436309246ddac0d7dfb6e29decdac181a80c30f5c16d9c72fa327649c23ade5164f9d2e9abb2629e69adff46ef131a42ae9050cee038a9ce3b053209c554d074d71f211492ae3e423d25866b689617089ef30738b331ad8ce240de229b9f112d399d9a20cc0d0a1034c582c840abc29f31fef4e4b384f601dc5cfe4a661b350466ab197b4bddbdade5bca94520ae60ab80a8b0ba893131e299587f24e26940e85db4a282824145e15e68e51ca1386e90b17026fdb25126d1854ce46931c2f16f5855ff585038117c6a47cb0b6c488705c8a6350880a8795d858c579a50d93916be6962399429dc7bc2ca591b44b255e690a755eb30ccb646cceb6644aed60db18046b05ef7467988ccddbdf3e1f415566dbee802c083a03e8ab489c3cf1155dce2250d8bca2f3c497ec6e24d2431ddd7919bfef01de7a8bb98df0322761f3e1c557211a40f1ebdbc987275f856800021b2a655197e6618c0f49ffd217f514ad892893d63451d24c6b8c58187591fc6661d635af6f8620e2068c2684c0236e86886df837fc7a03145c24322d83aae1d765138a0623740c2fa561c0cdd624a15e281986587560b15ae8d0d232630e3366b01cb1b0ace4b05ac988830c192b705859517da152c578438c182a6e50514969434a4aca28954261030acac91a4e4e506a40a13c2f3cef9486d3c9840693a93b43d7714d386e33c3b695ca502a91c84022695d685a36862cc3c48061320cbfcf8e84be748cbfde00a5e9ee5f6780d230f3af2f4069961d0976edaf27a134daaf5720a9224e41533969b91f6cab75ede2a373abaaaaaaaa0e805da5579f598d39185475d52104fd5a718613bcea4e17652b689c9752b1b87c0f60c666bffb540ab6731f8b82eddbe7da0de1153c11f67ded7e68cf3354a2f4a5146c277d9e72aa6037d8298f7b6666064167970b164a7aba8d52b00d173b8f5f8a5693a230ec21102fc31a191eee5879f8834ac70c0f63563cc4c17283c5c396ca431aeffe329c1fc343969728a997d2a5ab3479b87a95190ab179edf358094f536d0dc8b235397c6b6216869dc7c2b0cf50b1cce82e7d6137cdee0bf7bb942f9cc00751f1e86029e45f7d4830c82ee33b8241f695af0805d9555f8f05d9637c4228c8eef21c9bb3c770cece83143217f32a2e3f154ff966d8a5b2f22a2419af624ac9ba1ed263f84da77c12f818df8cd465934a5f4c2b6f4a99e1043ea670544a7cf452424e3ece5b02f5691c918f31fa8226975d8e296ce2634efce837dd7dfa582814569e3463f352dbb5b1612d68510c921c7e7efd07ad59229479751d5a436461368cd95c250f6d5e7d87e25097e63794654c4ee3d5359cafae612a64d9237b0414c2453887c25f9d2fb13537289e72225b33c4c2ec89ef91ad21e2e49e2bb13503581802e84bcb20d1ad75e9375bb3c4c2a426ca0c7988ad21b2446ccd1e591802284da82f5ba3c4c2b40c07bab57e3251330b6f3289e85788cd678ec4e4da71c0c48123ef08f6fd218c45f44b237e20cd90e4cd3308c9a52fb1826f41f6e92c14bf8e2d0a7e7d8be2d74bdf3a9135c11e5911fcd23ca12f5bd3c4c2ac1b19c1ef1ef92579f61991b9244d6d86eced213be652073b6a1e3d63b45f905da19643e5158b1f1cd154fef34a43077ba275b62e8560487a63ab629059c520cf3cf3780667d86d9807bb421598835dc5cec2aaad75f979e4249bba783725d7d73a112db3e2b92a00e6243f40e6a5e944c933274d27921c51f22c7327488ecd95e6fac25c5f5bfa48dfe7756b1ddb3878a16b3b77af578481e7465b3b43ed0c9ef66ac5197cbc65f4b53343b17fb0d6bab19db1bf4f075b16c2c6d15d18f44d763b83fd81ce2e20bb7a32c820b3abb7e955288c29beb1572b9a30e199b9590ddc33ab7e813b79b5c20a2323d8348717a3abaa6afc84a45edd85c146e16c31c4a03e389dc1752ebcd07fbde0ad8c5148ead563fc345e86428c517b3a248ebef8f5e569c28126d689843342326d62896f4fcb9a8b5d7bf735a1ed30b82cd3b1c76f773860e4691eea51130c6ef715e91c0a7f753309bb115b3683b0977c9ddbb2cc9b33cee1c9cd2386484618c1e07ad438d0c4eeb04b71b449243e4f26e267f3889467c41143dca8de26f58a8510bc38bd5ad1048c57a9c0981e8e313b18fdba6228f879915e9aab7b9c62d78a5daad8b5e269007db5ef4b57df7cf0666c185483773343b4c5af2bc1048924c29901ccd8b08cbe5efb929fa6203be9e334a52d05bd0f89bcf6d8637348132f670e0677822edbab1557fcacabea9f608e3d856da5a62dfab764ea17f5c5019e5a118524e8c7a974ed648a24599773f5c5ab5e1ebbf784542ad5ddeb83b7aca928003675c901120c26a1060f0906d765fce06571871f0e0c29c12ebd02043dbf2e44c1f87508b02b54a25fdf9823d855fa75249260197dad6fa92484a49e9b786efe424e48ea1d8004834a302884c1f5951cd6b527c1adf5923b805da413b779983dbbd41a08b047a511927a92f74482f439200d1ec943254a82341d0081ad314261d6779b21af6b9f106eadec7094603073d30c75d8975882e451693627cd90487f7f4b9c3e25d0e0b510fe6db9eddbdf48abdca6a82f24bfe18da40a92f449a17c16f28137397fe1073e53825d275f17b2c469f6e0914ea449a44d4cb469c66eeb74d914f5859d080e3fc011c1930806779b6113d84d97f493609705524838809b7922d15cbb2752af24ab1f98b3f3b440eab33980c92d1103589b2ece9988c2d90288417dffd0fb8d61d73a0f76f9afef193cd4ab154c307af63d83477ab5e20c3e78af65f4a57defce13ab9375c9069bba845df4ec4d6485177acfdc5c3c3b151fce5f0f71b4bc15cd43adb760b04442bd6e2b94f1ece1caabab0cafbeb047659063b0db572385a895ff9e7b88c16db951c9a639bc8efafac2535f6ffd3219c1e0a96b0c6e6f6cc5dc430ddbd95349bfa85fc7e2caafcbb8313e0e90140cea8b671815939bf98093f8e8fd852edf522a106d0651df3278edfc097179cddbdb22b8b8b8c4a8b14c11cca1f0173693b423e1f1579631145bfcea7509144678ed80c447824dad5bcf7e6a6f533bd16991531af6fda9b58cbeb891b029bb582a18d9c43cb7089bba84abe439e5f2d293f875f9852e2f7dd35d6ed3d8bc519a545f52be9f763826bfe15496e25687e39954299561c2fb9487fd9e4b5fad49b9f4a8ae1397aea92bba744e6584b8bcc933df4c9f8a41f62e3c9387dea718643715492255fce4c3c0900de34f9c88f628ee2d13f3a819ee9f7cf33e965f631e12cc4fbe00e80bbbca870122debf1686e7106340f9f4bd2f7efc86d0ba1efc27530cab2f285474cfb7c87948525c25c5e3878447f5c2fcc4635a4689fe41652aa04ab4cc1ae10a846be4e45b1be822d116fb1a61f63dc2ae94b3ef0fcb704ee23cec27b96efcd21ad9fa3b0ffb37c73e22bac59e7242e577cece813e71f99d78ea0b753ee537ec3a99e1fe899fcc3055ea7a48f7fca653df132fbd4f3ecac784f69e7494aff4281d354fa4eb9f78a9c33939f9562b753972c6d2b67147b9ed86f21b4675e83df785ea857081420de39905cfae42297659c0e5a5b36e8b0473ed9e70792559c9690197d656c946b965b1adcc58a9a4872aa9e7d349f7ec61698b8be9cb97290f98e9190c53d8796001e50c579e9d5d73ecd3402cf3e8eb41325069544e1faa348ab509362937c9fcf139724d285dcac8bdcd0517577bf530660b13c6ecd57563dc1863dc183f7a163772cd4457555555775577577577695457755773fd34dfb69d917743752caa469dead854cdbce0e9f41854ed0b531fb1a82f8aa97a36954119533be8d88588ad87d9165176128496203b2a0105a53bca4e7154e0a4e07e8620b11f6401cb342dd3b22c681a49fec05b979a26bdf334edcb3e245eb7a8206d9623ebc0ce9405d3e9e4c94e725a306901758292329d3ae9dc1c7e88b1e76a2bc66e192349ca1ded31c6969f7e8c2429638cdd526232ee13ab8375dc81154ebe368831ae8c731594b22326a5ecf618314c3a13b44ccbb40cd3324ccb304ccba8a0820a2a308c0a8c0a4cd3322a308d0a4ccba8a0820a0ca302a302d3b48c0a4c33055993b4ac03b219d71ab795d93c5c795d98b0590ab6f6e5d9dbc6b3ab284d8bbe6c0dcbcaabbcfaf0acaab1a1ce631e2ec9bbc3cd9ef8fdf43555e4952a4d98675388c4282546bf040755bc0af5808b0f4f6c78761e5e970cf9fc890d4ab339fbd69153a681a739d6f9e0c7ba02f00bf38c0b731c71519a1cae5e43694057b7a1342d57bfa134385c1d54170fae9ee345078cba4aaeee030fa5e15cfd07a5e95cdda52e93abd328cdc9d56b94c673751ba541b97a10ea3a71f5571a14577f294dcad503a03429ae3e84ba545c9d08a589e1ea394aa372750128cd8aabff50970c5707a2342b57374269585cbd004a33c3d50da0ae16573f80d2b05c1d014ae3ae8e84d27cae9e00754d575f80d2d0707506288d8bab3740696ab8ba03d465c3d521a034375c3d024af3e2ea4ab40ce6ea4bb40c0fdfe1a11eedb0068556243a4f121e03f1432dc7f34e8d878ff034817176ad488cc378e8c1ccf0b4c5c74c0cec872726cf5a9167f7e1fbe1f36dbb2c22511d1f8b4aa5001ebe633eb13ac0be76f8be764c1eeec5c379e2abc80e87427bf9e0d8b7afed8e882f1e130a119c5e3b9c5f31aec3876f75478c6f87d3038e113b3cc6757864570f33d47918d7e13b3ed51d315319d4e1dae1c0ccc8a08e1c1fbf68f19a13ba2e4785ac60157a8d27c7b7a7e6727cfa3c7c9a0a1464c7f16929d017f6d6a7a1405fd8c14f33a22fec37a2f0ec3684f81a4d78769725cf4e238b679f42cffe31e1d97d09cfce52c2b3b718e1d967043d3b4b119e7d458467971184675f01c2b3ab62fce0d9557cf0ec293d78f6140ff4e5448a6747e5e0d93d1c3cfbe9063478f6eec8b3733378f64d06cf5ed25ef0ec24173c7b47f1ec526bc1b3a3ba1c21be9bf4853aaff1b487a1c6034485bea7c6c320fbf6a9be94a6923e215ee329f90dcb3e69c1207b761a7a8ef3c48465c044097e6d37009d8f3f44c3f8e8311681c25f49e414c1497edd2940ba9c5a679f581d1c4fac4ec46284b1e94be3b63a22363157bd3ac03af1528faef38a9f6e286570d5933fed7cf450212c84b0c8e2b787ecab0a6121f42b856d534ebfeeee8dd45a778c3188318831e8acb9f5c63ceceede7a99975b7d512cc618a394aaaada72cb38ed54b59de0adcb8edd91bb6377ec2678eb612ff16277ec8ea5f6275627b22908db16259669a49256fa424d858e56c936e11f26ea9e28b14c2365a10a1dad9226fc4324b14cc342153a5a25db847f249649153a5a254da2c462a84247ab447a872a74d44a58855e89b7dedb4a22a960db563256543154525228271faab22a33337364467dc8ccec9d4c1dc72f60176cf10bb51249cb585995595632565431545252282728ef64eab8adc4e2ed6c5b7b0c55a36aec2f0a6f1d73578d32d23f7af641a2d62df51863f36a9f000843518914282ae8e9e9e9514164f97e5ec730f9f11b2361a44c6bdefefaa434ab2f8b42a958dc25965c54ac9c4af5bd79d105ccd1abfcf5f36fbd71dcdc184d61fc92496b430bb54fff34502b0912020202020202025a22c6086ce2452aa29910ec9e998ca8a889d151ef000101010101012d31d32df699999999991922a019c618889504093119f2f1f1f1f1f1f1010202020202025a428dd4488dd4488dd4887f80d4a86513a3a31de6e9611f1f1f1f1f1f1f9f2d020202020202026ae2031424c46488688b7c7c7c7c7c7c7cb6688bb6688bb6688bb66895f86cd11f693b1e8faac77dc01f1ef2f1f1f1f1f1f139e221f60d8b31029b78918a4899f0f0100ff1100ff1100ff1900a71cb344fb7d8354fe560f384339c02af7954cb4cbdcb031831313111ebee6cd33ee9f1233956f2a87d2e2f438e7db52c0b33c71848f44c7aa6b9fc16391e6c9ac3f381916f6f30bcf875c90591fd764dd336f9658e612eaf7d21c92389e589a8be7322f14dd9916fe7baf581756efa545f32dfe457726d73f9a9639fcb6333e3ba1ebb3abffab1ed5be9531a0c30116528b5ae086d5dd379e9d243aec9b7bc2ea182c96fbc1836c35d96a4ae5d89ac9c5b8e1c434e2f5dd7b1a9abbe1a66aef996719cec7034cb5c732d9beaf239d6a357a283d04b5f8e47a06b87d785c3abaf1a74bd90216557f0968bc740e410bcf4d0315d41c54f6932efa296e19d6e49d778ce8d77ba65cb963b92773424a40e83be48d7a286828784c75f246f6f1977cdcb66e8bd94246f95ca9391316fee68c508f5583779e92149a68bba251dc3c1b6ed70347d89ae5d6cde915fd1d6b44b6f3128cd18d4b5b9f43683ca704ef2f02453f230c6875d9479c892ce7d99b632dfbe563083c9bc9439e9cbb2222487c25fa499046bdf32ae9bd4eea2a0e65017d68ec57cf6618d611ebb1efe2d85622cdd61539716cf4978e9dd8329fe14d9d54a2a42fa16d923332f4f9db8bc036df77775091541efaf4ba880c1f763ab1fbe651a9546bfc647df322edbecebc16bd7726a7cffe8e8bb715d7aae72f8d9999880ce4be7190691de2ea3cbebc86da1edc8af730f8c0c59828be02f942ffd93f2470e76b5e7609772afcceda70caac47c5d420e08bbf46d7d0ed9ef19649d9d678e16c2a62ea1fc79f66d0aa2d734bc0af9c08b671204a44a85cf2f0d5e85a638fa6d2371dbf586e250ae24dfbc6f9fbf7757d3f7344dfb345c8e5d1dc2741ed65039e7a1c73ddc627fd19ac84461d8bb7deb8f33e2b587b1bd907bcf3576a170bcd983b746bf79a9542a6dae9dd7dda63699b836998cf8f0e445cfe3ba1ef12383dd1e196c2ec5e9165a9c429b1f1e1ee670c93c6449791ef9a765e251b7b86522936ef9e9e7c47b869a46726d19cf95eba396e1b4b59ed2da34432f478c8c47364c5a867bbac55e9a21083a37439fa14a35bd799a7c022ff45cbaece12894461641caf83dee7e98fe9473fa936f71954d1a835e0e7fe8443fffd6cc5cf22dc6fed2a76dea707aae72fadbfb3df7bc7d908447b96772cf33b9e73909a8c9d3bc2e019a628a26efbdb6840760fc7c5dc203a2df5050505a32cd64229d7445b47b9eb7b79b5a234d0f49dea9cb21a538ef8b6fc3ae70bd0ec723913a739267accef38c44f23e97f77a66dee9e402b66726f042ee89e2c4d9d907e5ecdca33428cece2b509ad437e4f427ee39cab7df7545788e5ae283291ee5dee779ea5347f90da37cfa9a33b1af4dff422d88e69e6fdd0f937b5eea72b4a91ac1738efa380a06d9bd8f7b4ae085f148631e0ff3301e3d7b94e2e4ec11885d4148ee397bfc6157773fd6e49e6f5784c9bd52974372cffb229396e9b445f2148de424df968b4c5a465f9a174626cffa92d9d8604073d517cf43cf51ae753828d7505f744f3a4a19c488c4d74e4ebe9313d410efb36170dd3bf110c5538e92a40a1a1dca513cef8b9e4a618e42a9e7376c83721457769d38e9e48b8ee2a17cd24f30d4b451e97af00be1bc2fbeec7e9c3e8c59e1180a2fdca719b2469f796872cdb7367d2c34b8920ff73048026f1f7313e97379d290fd761b76b5967538eddaa7626170a5673f5cbea7cae87048d366c531145e1067b09dc87e101583ed2c2cd2d4bf4d5e36854e7c8a371a1926db143ef129165e6589a62824c6d33e8fc1fe907bb40fb9a78b0fb5f821f78442625e9bd98c5fe8a5b0fcb644d91b47d836d75deedeedddddeedeedddddeedeedddddeeddf6b5a257dbddedd8bddb31faee762fe99eea42a24fc60511f87ecafaaa1f9128b98d7dd34ef50bd9c3fdd8b78bbea96edb72dce52c1116e663d72faed437e8b7c9632ebfad425d7e91080bb31e3de2acaaf264421f716b851776118bc00b9be8756797b91b8c57df54559de55db9d0191b1e9a4622954adbc6715d67329d4e9e870a2ac463087671fcf52d4ea0fd50193675095ba59dd71224e1575e9794e0e7b7de79f59692672f1b1a1a121a9ad1bcec68a85b0c1e758bb4e3090d794cb2a396d19a1815a988868686542acf2b3a5af16170f31fe2495f29bc502be29d9773e5e74345318514a8233e78eb2b3fec6255e8adfcc81b5ef95939c2201b794615f1c078eec1f35ff9f1151f06577c7ee5e7886794032f5cf1117ac68117aef8acf8ac1c6199f87acf885da667f7845a267a4d9ebd2214d173e831195a0fbd2f9ebd383cbb6e8df41015c5f30b9e5d8617adf83ca3b6d879765450cb803fa8a02023412408f2c208f2e4f0537848d4063220110c30d9bac191a26790a865f4550436c1481e8247b265441785b3c50f83faad9e160f83a489643bc0298c30c2b8c34b9b4e84a05df32632d7e6ea009a73ce4d2732d7669295f6dc6bfb6257007db56b67807dc51b78fe618b473197427518028fb4c5a5196aa4164fcbe88b34430d6bf1c819b67e5e6050cb80449d921214f40c82c160eb042550187690a8655a46c2168f1a521fb6a2787690082402899e4135b4787ebcd60e83470cb2872d9e67671b78fa2178f4e00f8fb63dbfe0cfb37bd1b36b62509a4f836a455bb30a33067599415dd2593bfad41b9ebdbf25bab51bc6718f57b3babadc98bce243971a08ad01f815a712dd5ae7574bc92b0d9ddd2ca5079bea70096f0c3dfb2644d5edbbab8aeded6a1e3f21dc9748a4904badb666f390e595f59ae3c4431e280f676c4aa4195bb4288d0c57a7a1359cca15a3a673a5b8fa0ead49a1284d8c3362f4dd8d1f91c8627dfa1c028f55c4ea423b9ccf593e569187a2babb75c9b715a7ec4af17077b688135a23ab08358c0cb5e2a10ec590417295a251712fc5e22e3c3a0ea535eb8ac2a3f554b135d28b8591412d930a9231ab78f6be08d50b950cfa18531a7581f180d2b7d587da543acd375d6613e72a9f3ec7615cd775aa3e782bae2adf7cf0525c3b1c9413df5028940d2bbc4db20abce8db0ba72c5324493b14fe8a5ad21cdb628064ed1aa7904040cf51c66da514f2e7079372a38cd8177fcbb4c4a6d22bc62f611d4ee4b24f5fdad72fb35e7ecc356abea5a9ad2d66c21acbc1a63c227d7c9ebd5d6a98b6715a92f66edf96ae75397d92a42ea7a78c82d4c91ed9837963535b462cba64664c1d49daea0d7c6c6132ce9c703bca329a05c9a16eb18799920ce815f351b5465569347bfe33d37ef453871353aca254a350a8fe1a7592924a7538a9ec86f9c30e2815644ab18a525484be0352ed744b1a053d3bd3100a3ba0ed5945aca2185d01482f5691ea84667b5352529c5b7d315eeec4a3789472431ab9d1491ec90382a00a87f170a9a054c78111eca291d1ea4b69c55617230e1c34b81863c82a4a3d0e1c5d8c34b8d587f2d99744e57248d3e4d0b34b2fb6e686160b83f9dcf0c2eb18bef24d4565775966c8f0948aa77cc6a7fa22632a8329377d323a1c9519194c754862500c7af6141457edb0dfd0e28616cfbeea7ac83f992c54ca449921eb0b16cc27354316183362ac6e08dd107a761ea2163c74914964e2c2c52f567192a38b4a22e7dd366da87037e2911b5df4893e3854b817297e7ee2142f5d048a4036b8f8c5283c1d5dec893d383acdb71bdcea3b917c4b6dcb39e671738c9b25c7a1a9b492a6390f5d8e361b8c0de3a1eb230d73cd49a5d99ea3cb919a544987e972e48c4560bab81377a211982ef2441e1d3a74987ee553065145dd6269e4d2481afdcad411f30583ec315d1b19b5b8d5d7edf08241f61d5d376982a30bae87ae9b072e7ecd0583ecab6ff3a16b22a21cdcea2bf1e82d78743dd4432fdcea23613c3f68f143d74c98fcf04387c3f90f9b6f301c2a1584f1742a48fbeceba095a7942861751fab0bae7fe87ac85fa53a205716aeae858464646462b8d597fdf8f8c84cd140403333333bb8d587354feff4ce4c4731d3754ff7000104103d70ab4f1a356902041840747c4443431337a20e090f75eb0a6ed27441d3711173abaf3f6342e32a9428e12404057116422ca4454dc74c9807b7fa98877fbab5e2281c24ec935aa522bb365f7db1f2d9d8740cc4be051144878379102e6ef5ed679fbeba0f49e61cc6c3f13ca77cdb525319dcbcf8658d210c0aa37db77141c4203a6600c430617ec386f33e7a983abd7aa7359cabd2ac2b87953c8cd1481ecea890329169c9e090465bc3cd549007ce20b9321d50b736ed437272ec43d272d2c94b2def36c8a4e4a58bae43b22e9b4abe5a495b558f0e184e47171da6f3c1dd1779e7e8e80846878e0e47731d9ed7044751515111ab0bd2e953fe21f49d37b18e9e5d07366362bae83b7a95748b5dc90e9d983061b26307d7438713bd07ae439239f6213139a9f421e1f197c953415b83f92c0c7b2a687f7c7e7d309fad618541614ada18f4857be87ac8efe9030f3e70dbb6ed276b52369b28b6a7e7f78b9f7d2a12684b0599633e1b044fcb989c5dd5b3352c509a0e810c587178f6fd82f3103cfbca1d9e5d861d9e7dabc3b3afe4f0bc33d4d1a2476c02a0eba1e3259d2fc5ee20ba9c181d00ba9c9d6b0400ddf2b06f2e8ef5edb38a5ac6343b56d1d729619069b80b8baa0883cc9ae112cff2962ff4be455b5abe507b16677d44e2b7b876382d53c5c332553b910e5e0d0f3b20195617dcfac27d1797e9706cb07c7db3f1b18a58ee5fcb0d6f99def2b90ddf3e1bdfd7e2a0b35a9cc5593ebfec0a5e8b8373b6f836c3f9e04dd70e488bb3b05a5c7f3a4b8733670f5ecb6c6971992ea76526c1203bcb8c0cb2a64c8704d10d56cbe7321c0bcb460b4b46876363f6e0b17c5bce06ab65ae7eb8b7788b4f0838a088c55b58dee2353e55904586d5e2c2b5d09842a6fb4143c6a6c321b5f816b1ba68616191dacbcfa524ad9127e50c9fde32c359dee2df975dc19be1732a832dfeb9e92b627228fc659a4966f81604076486b3fc8637d637c3f5bf6ff6e0cdf866cc9844186467cdc860cbec9660f98c169fe1fea982aca90cce709b2e277ecb8c0cce9892c58623b5f80db38ad845ea825d335a541d0e69f6e0cdf01b3611893f63ae7eb030115966130cb293bef8361d078e585d3479f6203a1c6df5b1ba581876191fab0cfac2bef2b1cca0203b97866757a9e1d963b0d6f0ec1dcb0d5fc0813507561d5860dc7042745e7cac012f2786b9a6f9b65d0f9d2fcd503aa7f3dc1719d4a66a51f3a4e77900e8723ccfbdf63c17a2cbf1e61611a2db9dfdf66f3e362f1000885ef05afa3e1703be9ea2633e2d739a1d10e6934ded16e6f3ec1d50cba876bac51e76401dd0aa7634d54ef7ec80bc787630829ef5c5b3879d921ef2594532409279fc5c46ed717ab6116f3f5cc9849e55a4da79768c8f60dd980bb1dd18d12121a263df70bbc5afb4bd381f3c202ba70074393b878801e86e8486e0b68ba49731ba4e172643c3647438ddde1036121ba29b99899f86d3e1c439643d3a1c5691e6ac261c3799cc43efa5546da48fd52492c023b1ba60903bc74a8ef9f675d3b34f72eea3c3d97c3b207273ef70b6d9832737e944e8cb599a91412cfa161ddb4abef9e07cf04a8e45d72f794b2cc5e83dba9c3873603d3a1024f5e0e2c72a2a426375c12e0ba85845ac262c593a9c3ec9fc249b4fa85e49563f340ba8d87b609f7dac2eb8c5eea3ebc1df935514046f3d64153dbb942d29225888e854f18b182b252795b395360a60b34f7a9723dbbf8df1e347c70da003d25ca4210a107c0fa0cb89bf1581b910a58da465988c5d2af12a044c986fb16fac3cc13ad813ab23b155c11c92649b871e29db98db9acbb619e305bebd48da407739da6f9fbeb2ef8848921f207dab3f446c5500ce3747829b48903c23f286e891e6dae4755e3a2fc6bc229b6bb74a5cf086e8d11379711e7ab187ce7ffa227dfa2a7da1eaf909d9fdf0e1a56fb288c73ce3485f1229b1a82f9867a496dd1d3b93b6988c9b45c9cb58916d8b4a13b19a98f2a12a54a5844152283a5242504e5e502a7082ca71620194c703ea02de0987b7c4c9d43a0d3175a009031d77a3cb00b7d9e0886ca51a9b064a24971213248d0669035a36350e64d89775e023a662977c7695de1ef82859f10332b67413b167b013cdfa229d4585cdd697cc376c0b58ccb45555555555959733c6987737537d9c219756e36ac6535fb484f5c0a86e6c89eee6ee6e2c6658866124ac1b13d21e76c24ccccd71d78eb1beb06b735c3796a337acc424e6e658eb0c8b2db118638cfa856a4577634262b711ddc2b2887116b38cb19888c5cec1a062dbbbaaaaaadfc4b001601ae384b5fafac2ad3ac3d819866119e6a42ccbb2f99130ac3152d6cc8d651896c9d8374c3ce6199e667b5bf44e462891c63362198661d80cbfe70ccb186b6cb3754d65a27b51ce60912347eec6ba31cdb4162dcb26d65a3716d3ad8e587386313337b36758337373abbeb0a7987bb197558d573bc6e8cc1d354e2f75383a7bf0fcb1ee6eac31d9b155773a0bebc6f8739514bc35bdba3aa72fbbbca22fbccb2c39c6a8c955c112b61e269167673846fb28c6c7f6eccd262dfb7975a2f5edd4dbeb4a3669dcd93ec6c7c6d8f9e034896546a06ba4930a07c3308c649255f881a7beed46547bcb703b3857380282128fe36117f3b06b399e766e87416ee79d2bb249c1b31c0f83ebdccef6c3e0fa4e733cecd2c794687457f44c316e03fa051a2244186184f1db140caef30fbc50f5ea71aeb4d74aaf42607ce1ac996f40ecfa61d7aa47f3ef26c56fb84df1bbf1bc6e9bfcfa371fbc8d88c18d8bad884170551b18bf9b918a25c7af6f60101935f96223e242ca5590b4f14612ce3677bef4714518dc7eed4893db6170b926ec0ab7a0f7825dae1d99332cc5e032b8441bd1b611fdfa16b405fd6e4cb6218edb0d8c2630c9785e21f7aa7a156a905becad4b9e3dacf1edd26528d170640e96e19cb9107c66dea278f6583af24c9acaad90a578f6299e4390ab6090e390501ce2a1678f4259b04b3a4b39b5def91b8e19473bb0afdc307e3b6de63ea267aef35b6b6c53b83f57f1d7879c7ea7ea8bced5907dcc9988af3ee4f43abd243b20ec3b995820d27532b18ff94daf7e44cf3c9b41b01983f4f3649e2222d8305e3c78911c2e82bec3ce0b0aed85c3d525cc78c0f1ed6b5b0ec7a7af2d723c7cfac2f1e92bc7a7af6d5b6e9bb40cfb903c4745cf4f1f76445f24e62a975e23cb5cc51ed9e30c8fd1b1e8987bc4e4745fa991cdf018bd0941af5578155ad2c56f303d703f4c1a346ab07c4707c4633a20aa15bfe91a1f102e4e75c70e207674406ac4f0581d2f2f31dc25cb78e87eac3e8e2e2773c93e90c11c59a65a59c954df3e0880191cadd60d1b3666a2872ed1b3cc55eee2d2e1645916b3006459a69a1d90cc55355d8f3885e078f88aec2bc784c25f3c388e0f0ad58b8719abe01fa46f4070ec937295ca2bc91e98d14b0fb1a297aedab0391cd1e880b04723767dc1ae23a5d1973ebb1fecd163c498e17ee8e2311ceb825d2186356157100c2b6297cff038c323abcbc13c6651f52926c4752621c975a6534f0f105d0ffe2c8c79cc338fd1553ea3c3514d6550e53354df894714571189beb2c21a42e5ac135ff9542b1f8ac74f73956aaaca690451b9fb8a4b8f40501a964bdf58df10d5b7f2edb3b8abbee8ac4f5f6f78e5d39fd159583cfba26f369c8d8d7489e272ae3a1c14df34655033fa307314df581854c7e9825ec6f89d38caa76250b3d117d57c8b40509a21a7577da982862bcd1611ddaba0e1d2a392ad71e932b4df93f4b0a15265ce445c51e9434e2f270d9781652b526f7a4535573f6cb88bbbb80d9738be7d6de7237acbb9c7c56bb8785449e980cc1a35666b12d99f27a8e82b9f3e7739d1dd559f7e7743f63f8f1f13fbdfb3842e3e6bb874d9f970b9718395652b4e43e54cc41f72fa6c3ae8281d10f795c9c43e6b86d13f3fe980d4f06c32b1af9a61f4e9370d7eccc3e08db9fae1e236dcc60c326b4c3632837c1e7fd84563869914ecf219240362d77732753919898b9fbed6d198ab1f33c88a13d957f99c41bee9938df8c00b99e7a54725ec62cd50bdc5a5c72ad8a59a41d4a34b8f41ec5a996eea7eccf038550c621ee72604c7753eb88741e944f6d98876e455cc5bbe199fc722c357333228c3a37332543c84096bcc48894aba253dec3efa8bd660420a233dc6988f1e8d78d153a262986b5149cb6c135f99a14a6e7ed337fce9ab7c214b4ff9525f88d1e0a5a37c61caab9f7cccc346a46f9396c184ba255d925033f44ceecd502567c849387d47be1d136a198c06da6a1fc277926f4c07dfce4da1ef2e7e5392845805834ab8045ec83e4da48751c9b7b34f9766fb7ac12e8dc126ec527fd236f976edeed026b2bc6a9e118f79945248ccce0d86c18265348de49b62eaf28b1f0a79d9f9b61de79c6ffc244c33e72c6233cb8274a95e331c34994e6d298ee36628e4db37df9a935f28e4dbb115d7b98fcc3b8e731fd1b99b961bf844cb905a6ad275d5becac91c731fd9d499eab9ca89deee23ceacbb8a2dcc5e738d5d26d79c63d7c935f7d8e5b9e65273d57cc916bfbe27be711ce7a1d73314f29c6fd703e559f4520f29a5945807c4f394c9dbf394a7a60704c54b5e9a515f7a865d9a3d85a43e7345f94ebe50c887ea4252bf8eda9a92734b8529b957f253c7fd867db2f4855aa87dab1e9c6fae2f3aafafdd3657399c6fee839b3a75fe8681645efab4d58fcc35d766363dcec17a6033c5a0f2af6349e287118b2f9e8757212c987487c3694884c320d181743e88ec6b4cf053c023c2df43fa90f614bb36e6387b902141e2d450e779c790051b360b31bc6a491659c8228b98c51064f6ba240b2ab02cb22c50f0aafd8e485818bd6a2b95b0283a795d82c514366edb8cc061214587c50c4cdc7e4bb04001b71fea75c91560bcca43799e173df45c2cb9220bd409aa535fd4922baa5872450f4eae5801caca514a559492120595531262f04085f28295ae0432b4d7255680e055fb915e97081dbd6a7e6153ff70bee844b4cca7ade8ada11d1f3d54a28f407cf4ef99b8be4469062f0e5922fd6419bcd0df5bd3b4a3f7301c3675894008bd2673ee6d0cac724e1ffdf471ae7e7c9ca1ce23f1807422f191ecac0eb02fccf7854d1eee25677705d8179b406e646eb55579c1c0c92c534c6263c0b46c6addf21f9a06de3ad7bc9a6540ddd2d8329bab2a52221fda092ad12885874c79184aa6914a9de9c4d47da1c783088c1f0da59e95f4455d7a59e9c49299382e1a751d67e236aee4915af34eb4cce38182a5644a9c51e9d6189caa33f6da0933af2b33469a869c1783159786a42f3a334e36269928930b046fdda391c6682d32aa7aa87dcc3c547df7ca564ddb33d526cd30c8aa31c6a8335aec30e6e30c85685a8c371cd5bfe8d9b7552c8cba8c5367366f58ae5c6654dd5b86f3e6a64fed56cfa8b14b1f095ebb2a9172b16d313a2986510b89c4a16e8f1d334ff3cd4a539d34434f23c55dd2ae5419e3dc302ec6c85befceb868c49aaaaa320ebc5dc681b731c650e733552d468d2369afd436ae94715c8cd1a310d5ab47df3a1c8f1fb65f78eb928ba6e6a2d72df6385d14b73be33c09755e8bb1636c1246dae28f1e6c2cbbbb9b88eecea162f9b88ea7167ba8273a83ddbe6af04006db9dc16e2ebe63da6d9288e1e1edc232fa6257c612f385699ffad21ef6abca158450b01dd32dbe5d4a41179c4a03007d696ff7adb15998f6ef999316ac2eb0582d5c686999b185193358885858565a58ad646441868c152cacaca8b650a9625c21460c152ba8a8a45421252535944aa1500105e5640a27272829a0509e169e778ac2e9648282c9d43da1ebbef565bb9df0dd4df8ee25df33bd9af6fab2dd577cb715df33bd5108a5e9ee6f0780d230f3b707a134ab34ac1e83cdbede5dca1146574c3f904156a9d6f5a4694beab784e7bd9edeb389cd50db19faf7ac811706a42ea8e42b5849931c550ad1c00000008000b315002028140c88c582d16016a7ea3e14000e83b04a64529907931c8b5118e48c318818000000040019919921d2260036373f6f90dd0d0b4787dd65f79ed4416503cf048a9f93c9971fdde4026f3b1c2edf9c266b90d9390bc20f798822e84fe7f31d75c7deb2203758bee2568760d2d6dcbb7e23dc8a179daa7f4e3441591fb3b8ebf5b6a653983dcb6542cad8ab4f971c131267284e4686df2355ec344b3a4a1d893b42ea92d3f110b714536146d209608bfb9d1c11a9fb832b74062e5f6714ddec3a40e3f57baf9f19d6452bcc83f26de20376063b997a02f6df4a3532c37b3ee7fc61b7d88016489bf1ccd710709323769b3899ea78f9a72e05a142a047ce210e0b9fee86bcdaa8581540506ffdf7caee44e9a7cec874621568ac92b42ac266144a6475aaa1047a0334a21fb4c78c6e8efd065acce6aa4ad8caaa7ac7ab527840ae7dc088a592bddac22c8d4bf7c298888acc950679ac4a1459d49629fd26b554f6854a8953b6a70916207ed685ce2441c6f685d84d21a4556689e330d9c957cda89548ddaa1bf5ec4627c05e09da6e9659b286d12c66c71ba366367a52ee85777d191d692a710d2cb462f4230a0bdfbb5a431aa3e0ee67a4c878d8ed7a9118359454cb846081be961b2bd7c43502ed4a5c73252d3c5600fcf133d2baafc861f16f7f1adf76683476c71cbdac786b477ca6fb0e97cb7b0aa23ef1c65a5d3cfe52dbe6f985a4660de81f97e4a4f3d3fac34fccc3faa5a912c8c76c86df0f763ee24590b17cfe87bb5d60441fad507e896e73012e8338f02d4207810244eff6a55268dd7e9b12cfd74602ea079232e1562b2f3ae67a82a4413eb901a11f8122b2daa25b85b2dfc224bb31c705b6d44af5fb24adc77d4645dd6d89c82767e9667a00cc6958afef054345b3e9ad4c5b68cc0cbae23ed620c128209f71560984e2fa52a01ca0e6a55001d915e1c795fda55b01d95812e535a07448431135d51d3b512e384d5225cfafa11cf157b8ed9cc78999a57d62eda0252c8b25efde8f6e37fa225a290d991d7a9e9bd32162edf87d8228032c63c72ab3f75847e92d4f7bbb7205f26b58a5797f5015723d9c9a34d55539101080d7444d88dd360db51220bd5373f5e4dc45a3ad8dbb7a632c366c5666505310898811f0fa3aa714ae96573fe23c0da94c830894ad142b042908946932cce5154003ef311341cef7502cfcf9eb06cdf8a234b403ef7711d6014b8c761aa0f5c6723e2c934196fb5ab17e57b564513886db3d077256dbcd59bd07c648b1f3b46963cfcb992eee5ae9433a3b5c272b045995e778ab7186c9d7099fdb03ae05981b261fc1478545b146101fdb234fba31d0e4532d59f9c9e18186089358f24f0c2d7b22736d78466ba2455a46781d98975a84386e3147d734e867690c2398b9c612b52c1ce49db83008e21f44ca2a07dcfcbba6feb896f219ef45d4a4d9f28f512348092206c289c00aa2dd05dd9b47f783ce00b7fd0415b7d52eee83ebd7d878a78357253f374761eeda2c8ea8b48bd3cb70a1defac6b884c7f724b64aeb2eb88d62a5eb0c833f88ed83582a29e47f9cf48669ee855608d6345f9d06bee15c1c161757990e9a46fcf0fcb528cb433911283421beea631235af1e88d3ba47712adf0361c1e533cd686e41ea66f465db2dfe0dcedb1beacb5cb5b4056748f14464e090890b1e18e4f516cf28a3b27b549396fab8926af6b695bdd5fc710db26a13d934aaf6255e25c0df8fc6528599ddf8721260d5af3daf95f5bab3490bef7aea1f95a8146822a029f6c308514bc29baac2a1597cabbe897ea68c005766b75570f306d408685b20212849cdda740baf6fe0db31463f25565146428017da79363891f2c6b20b9ffa91c8db43308cfd1171499a1098b7656ff6045b3613111b8c6740807614921d3b6636a9f64d8bc8d7e48ab74c6649cc207917de8fd9d41034746104a997004d44632d69988b7ed4aabc760a31fbc4e185189e99aed2994b1840da7d16ca8ca5666ba23ae99fcfc19eb8714379816688665ecb798d2dde9cd12a617258640a747b20984b94d90129b0dcc0c508c49affc304e418a599c0270dc9cd09bc3e8534542f261b13a9a6e50e436bad78e0b1581be5068fb3ec02d441a023cbcd0e37e87aca824bfa83c13c4f941249f04419651bb2a5f4ca38e16af930fcdc64a4166c53bd0763e33c8cdfe8dde761cfc1860cc78f4171c6b057877ad96840af2ef6d3b6556ca33614ad69a9ea3ccd2e909dc7f7be366fdbe3c3470fbeb73ba5f5ec965d5a1c157ce044f1540760bfdbf4ee9db79b5cb2afe106004e099c71e9be7dbf65bbe08d4f8a34322bfa9384d8c712191f53450a495797cbf97faefb9baed26244f15937518102c9d888864e2d972567b31299872b20cd3e9a795dd79350b8c6b150fade55d54a87ea9a9c58aab6e18666efe4085bbba39f5000aee82e795a6958cee5acb2832ff44b09a1a6b2320b8da0a2307e67688fb0dd5f1440a2f48b4519b60b8a23aab7b4f4722e5249961f0dbf45c60ba812f04e8d15c54557af738fe25f89ad3bfa0a3f56e464c96a20b66e7d214de4f4d536d51eb616e4dbb523882d9d23270bea5b4b58c65f2bbb8ea957ecf1a7a5e11793a2a5b1cd61d347065f5b88c40146f823b38c242156764d9034dab23828e5989497f60cf78be3693a1a7da5a7313491b948c277a006b5136bb81ccf091c6e7217886244e7fd31471e8a07d968e8e241eb9a3f65d40a0e2f56e87629c68f65dd55e19d0e27b5182537d404fb997c74236d1873588d165c2737137ecfdce321e04ad54412fbca200a942e0be8d19b9504af727768af129c294599ed24a8e598cf770a3443a420470e06b757589b66481ff5c11b00d095712d84b67a77168eb084d2b41b2b6c5e6734c5bd1bcc885e03d568a10bb26e53e64c12d205a9698016fcd992de5c7e92aadd2961ffc75a615d9548e407a97c29dd74f4915bf3426f3139e6e9a4b57f0d58bee193bb9d6f093585cb3f81a8be4d8654b0230ee50feec1a70a82a7ad183a2d343f9e2e92975c90e6a9d527a9942f661d7caa32b619fa64aa9dc279ad4971d90c716bc2cae297d7954b302a4696339966affe995da7e1a5a0ccec9f8835e44f7184c7cdec0bd3a407208f641892920d03a5c04ef8e2d3c8e51510dcb362dbed8fe0555fa02f8e1e9caad3fde09cd98915c6f3df67a287f992ffa9d205e34b71e1f6bf3496aecbc1f9c4b35d481625e0e1ac5cddd1ac87a2729ff4d790d980d5679e571e592121b406e77c08a6cf2acbb88b5668e1cfba810b875da01f1a26b204fe9faae811d43f57ffaf8989fc24e83075f5ab495c2f75793c50ce6baafd8fc4aabed72693b7af5406bbb9453c9994e385009af73c20005d68cb7628a08e35add2027247bbd02a663589d8814fca9ca1fdd7c699741ab4f644f1755545cb2651ff86f7c66170f9e9e2d0fe13b30d04c30bb88131d3e9774509a1ea288ccc3cbd52b0b788779560734f3e89ecc553f26c6d0ed092ece51668c12649f5ea65b0cedd607220999ba3ed64e895594ce241f292134c784ab85babe36629fbaed2e6dee1da32dca0754b9c0cc180cff424b3fdc7e5dcb6a2b6a22c7c61b1f2ca6cf8effe0b293901ba9f794927d61baab67f8fd473b9ba1cc7fc3d26c62046dd66b4ffe86f18319de5d39e0ed46cdb28b4fcfd5f6e36d5d4c2c6a167bbef9924b1b1dfa620e40e4de49f871be18168bf2d092fff4a0d0ad2636d0709fa6e2eb6daab928f00adcb5e5dd014eaa50cfafc8de3eb196e75eaf90abf4070264ac103836b0aff2ef7fc185d303c6cf783b4bdf8583da8c25bdbdb62a0afda11990c305cc71471997e25bf3c8af0564242c214879e1bffabed73d067669d6e337ad1fb736ebcab457fa7f82bb23ffb21334d7f51fcfe36b9a4602f32a8fffdc0022496d186f77a89f940f63df8bab93039e657c3945475af256524ea448147a72fccdf892f508927cd3f5fda5d48722c80e00095fef37874172e8995bed50dc1888db84a6c7ffd7c2637dfa04e401abdf6eb581bf05c9c4c5adcc27a043d970867eaba8e2e72eba7d9b60b7b9056826fb11bb22c107a72645ed296e3471031f6a4645307c8a857a76fdb138a6d872d9bd7a4aa6f3436f2d76eb568c4183720d9a36a15ae7c45ee3b3da4341c2e72370d96109c21b5bb61279f9aad3849b6caed2c57696f10848845998cfed713ca00ea29c9194d46c66c44d7ff9d0579911f98c24e7005a0f2a3c588af3c67acf52589a179c9643e8867d1b95bc312e79a57be501d38e708d4686d944b99e639cd4fcf27dcdc1a43c47690b429bdbe9d01b0e1950499959b52786a820575bd6643221283017b5fa43dbe0e6c1019ae2a0cd85469062b75434c7c1a4fad3330681744331af9a9bfca4965ccb567240b762449943183cff30fe3d0f24895f49620352231a5f8b7e477ac3f68bcf2bed0f0eb203cbfaf0e659b26fc09ce34b1c8f737645834030f26164eab1fbc3174d1c66a31c5b6d98bf08f59fb3130142b45a49e8df45ac55207c688c5469c6235fb9e391a132e190fd37cbda0eb0f03cb7c13a1a95880ee46dac0610e6075906e46f47098ca039f672b31d72d4e8aa31cba7338e49534f098f404b350828b6bfe599bd39912444e293aee169c7ed4ea774adf8b863e6ddc131f1499c53b2ca9b1d2619801a908e4b43b115f1080e68aacf24dee054fe442a24824d1d83ce281420903c65f9060989de7a27aa5d904f85568f9db4d7bd4cb13b5a3075a90aaf5c874d124b435d36680dbee6daf4a3acb4e1ac7c27f34c1827d919ae9ebd409ae74ed5c776a258a58dede1800300db3f656bb7f255f1acdb31d8757b34034ef2e4cc71e0e6cb4971d08007489cfb6f3cebe0ebf6dce3663890cd3f900258e3240759f937ec01d20dd28277264b43bbcfd1f286fb3f094619f7a94967aa9b109cb8fb257e48dbfbd34921fbc328a3311923b10e1033b97230c01be0bf6c14c43011f684b485c7c2efbeede79289f473cab939dd53b392f2d6746abf29f669784c4e2373466b2754b4830a985ddc794f25087f038ff751f7cf4a3b1544761625b9a13ed3d4ec7c4b0bcf2c56eacb088f9a2b0fa95d0f25940f2f45281c58702de98b93af830f2b8346f2ffe08c46a60f3b44dee93c601c15e79134d8733a2d071d46f3f5bde431dcfe9f9986b7f96843553ed26ca166a329bab53cfbfc42e0d63d82a9573c7ea11f74040dea7934847cb61d6c877e42a1979eba652e1f67a7e17f63cf8e794a190b8bb5bad5f8dff8cc5b121966b6213c3da2a5dc64131c07b47aa8f77841be68a1504f075caa198bff1ca658c25198bd1be4da34658abdb2bb224bdeff62e609993e4401279b602fd0194758cffe51c1df67596edcf5b397dde20f179aa6de40d40d0384a3cc3d6b953fca7932260c7104df69cac569479279b302308a4c652c8367ef4175572fa24c152ce13e5f9d9868a800b32193f78d23c753ef75668685dc248b0f570d58d8f577b31ca7aaeea4c57708325692d7023c320012c574ae4f90234320ae259e9b2eac71fe22438736f291190ebc3f51bbc4eb43b3356aa5e03b5dfac1f880045ec24a246e27366ae7b08ad18fff7616c7e08da1fa7b0414c23b462cf0721628be87de2be32c5335c94cf58e5262ae4162ee60e2d72bbe32c5cc83d54c0dc4701cc60ff645ca82b14929a5217818666afd79beb40de9e5869a2a823b7311c66652f064d4fde2137e05f97faf7e79ccdeb868ec2155750b514383f0326c61af394072943e694ccf64f70c9e923fb6460289735ffb554afae9b1b6c60a7264a12dd26cd391e9a015edd46939c837d232af65f8a21b3fb0a56910796a459708b805fca9ed8ab7b85015d2f6c79c4fb8ae456893380903402bdbcaf12efdd820382bd52c394480f3260e9de824bee6d0ecff10ad2ce11f96557530f7630d599e4511c218a076474a17f559203974ad017889bb0d63f6e44f9d367241e02434c18422b04558c9d1612064c5c717f896c3de726e0c43a2be78a53353fc87f192686478ac838ea5ecbab343b50e1cde4e53ec0fc6fe47ceb121282ac8b6653f389d8cd6d6c50ffd6433eeb2620c285fae5be86e17efce716c609234c5a2e57bad927f1fc63a2949df678b5084d627b2ca19a13fa7c8a4dd2597b724503095c652bc1f53e97d15e45ebaa73e3edd07d8a950056b62f0d8202e9b482072f9391a78d1b0323b9802883fbb0eba0bbd35676731101cb1021c2a502e9a9a9fcda573325204ee812246ab45ab7a72c6a2ede909009eee6005d92b527162fb9fcef10e689577730a35f07a02fd603d13d5a75a922a50f63f7f91267816d8f96642f7951a5ce0e2d27340e1cdbf7b0a52973d0db7246b8caf5731d17866b225b783581560aa0f6418e3ed4862bc92f43806ea824fccbd438cdbc1fa785ddb3681da9512bfe7e6ed63bff334c2092fac5cf55ae6086d426f9e7e014600cddee23df325d8de2b79b583ceaea1a6ba3dddf7e6c89dc5a8e2605b5549d30a76a0759878931a9d1092dc44bac7a4e9d8cb03ecb5d7c96dbc627a4d50aa17adebd1968388333c3b4360f3a9640524249c5bc7b3954772ab9d00a2e48e9f8bb98b3825dcab7c0e8c35b3c88fd68f79afd077f925c5b95143969c5502307e31abf6e50dc6e11edb01d68702cc487fc6660eba0b87c8371abe0968d93a7d63c2818580368bc20a18fe91ca41977dbb88bb47335cc15a31487fa3d755bc2aff721bda36aab54e87e11c365e7b9c76842b82073f0b4b6dfd6fa6ec654c80203e03e3ade0b660036008823ff77672b0a18a9315be21d50cb8ea4c5f80bda4d72de31e421b74bde0211464dcd0460e92e050ad1b7fec4fe60bd4cde82ade12a0b103db54ecf9e53e22b7188d15fac972539440a921727e8ecb0ce3576e967d5a7ea457037110bd4a6aacc0f34d7a190582915a8eee7f3f8df71a370ddeb61ceba3a9b1ba6861ba5a0ff12b9f97e7af40e065c2bf2ef42d4281b520428e684e24273a2884586400ca6dadd88bdc29906a6b2922d676af34c5d6f190e9a30b40832022d469b63c9fdb033499b5a371df9e2738dd2b0506b120f0cceeecc5d878521277f288b398bc65700c518f7c85abc6fad05dd2ff2359c65a9967a74f2142ef1bed98fa24d4c34a5b663c269a4914897527e46673ee8c6fd5fc560cb3ac59208f3135e3d310342dfc301213c9fd0d0240b9269de68581c660ed0e53068f91ae23c8f5f05da68d03bb32eda3b2c587070f50775805d4f02e6052485a6cb62f8696acae78474f1baf5dff780dc0caef085dd821a61a3242399f97017a941a36415453f348ede7f10fd262ec3afb8767653480e420b61732529cc02a07f895143eebaa554747c8a0d69444db74675c0f2e850428ee70d632fd60e9d6a19b840167fa798fe14250b44af4fa968bdf6ed1560ef0dd1b02d18bb8b666454664f6a11b5d09d544ae29271c9481394a29442146d270cf4c133212c4c62a26f9d101870ef9d05c36a2cce71ebe08762f56fde207c0b04776b66383eb571ae39ae94534c36e07672229e4c6a0ae521a9a353f860ad7a3c37a7e3d785ab5879ffc564808e0385d43d4a1cc4050d242dfc900b0e8de4775a5efb7173e8fe0bff79226b7a02465be72b621a40e54d53497197cea8f7e266db0122a62487e2810b1341cae8badcb742a3b944377614046bde10be7b56c4013f85063e3665d6008d6c832a58724fac71b985d46e917fd477b434d2aa370ae3bf7719d97fbf71bb2c992721187d79e807ba91ef39b0354ed2de44f0e275dee9c0ce96b76a0f526d16ba4964166032b1f036f674e6c9d754d0a18ca720dcec60c3a3780cd541b9cab5fe13f3af31772b96d6ffd43d2c392a88e6ca0c1239f149ce545076d43ed62dcf930718bcd156749a0d1494f96defddb1693e74ad354450b2c56c04858aa3639b60ffe119b006677656975221105a88eaa6b243725a0b71a9be67859c059d376d43b5366db517ddb323a979deaa1d3d2f34833e8984958a4409a1953fa42ff5537e7e65d3f317faec932b4dfc824991bad267677aa1d1c45492073420c08ff7390c5ef362b2f6cab9ab301887c1e74749c0e1fb39942cf95036a095da4d3c904c011f32cddb016d2afcd5be097eaf6fa95eb4feaf06db9878b76d1a9ec9aa49a3c13b28984b2b5eb84a51501ce6867a4a991b9f28c8227795f600be91555573a5297577509a433c0c7a416ad2afd6ab6547c956620c29b2a2cad218865e6ae6fb45b79620907017cddfe3a1ab35ec11086c715e48e92fc69c2349f7d60694cde18fe4fa158ce09b886f486445a986494ab7310a64ef3b9173dc123efb81a9385789cd79655a8c43c177bf3019f7a4c33dce44cc756af0ac3723e258b4c307993afdd048769c9182e6b7b7e22fd05f0f809de5bfb1e3df3cdeb31876f6efb4f6e9fd7996104cb6c25e5f530f96617ede9c9bc79bd52566f55cde905b1a34e6973db0b744db3956429fd9358b6271988a8b6cf111a0d6041534134e1d090bcd615f510e8e7a4cd7679d3c2d03f348013da857df9f7f51f25732d4336a5f182b8ad172894bb680acf0ca2c99d324d8720c325f5ebe6a9aad169e26c3576708654de08e45f3ceeeae8a994cb268411619a51c912a26741d511bfb8b14097626f3d0001c5abc7f8bc02ed5a5bcb2bb21630efe9d8bd3ac49d30e9ddb0798fc77eb1b199349adca49337e7916b3243b6a0573c82c74f0374f827e95d68e1197129f30a79d7919f863650c643f9765cecf728413c38dce16d85f262dde1be508f2ceb4cf928701faf4fa87b16d99428872e6d870a04d82931f6933082f100b97cac91cc51796b8cea65604e131cdaf3695d35fc92ce976c2ba9e7ff46ddec87c5c66c21791946131a4afd2beef586c35dea9846f707133c9cac8e34fd8486ea2c5ef993d1d99b86a943a32a12e426a9027004db224165dc28b1b152b2ec12c7dd0f6c25cd586c4306a6033164f0b4cdd991c8039ef13abb46d3259cbff474e11a4d873180bbec0a1777fd5e04346cd7b8a4b443c4732c42c0fe92d9708391fe695d44e48c09a0f46779da8bebe89ae810b75c83f2aa63318ca86719dbfbc6f13dfd13635bdf4710a76535d8253c945c5c88d6e6763af55bc4845094a6c51739dec1115b056643b5ccdbd68987c62c8d35910ad6918ebb0e852a1d039942ea869119339fa8f907f19aa9f80882285322840941f9f6fab975628234cb7d247b5d9497d3f2f15abf8a0276f5afa6f32164ea5b0704dfbc605fd43df3ad29ef431ad4b01724de8e30ec8bfb2cd46544dc5e97f8a717c0234482fcb5cd7416c5af619bbea1f10444da2396b79281d4303229da2460a323a6d4874d85386435cde0180656227a9672f773dd2e3ff97fff4f1000482c69b9dcd90619a95268737e47f9a9e433d53e85bc46293910a290292f0db961b9f8ab9b1f72e915962f11377194cff0a618e405e2191de68647b0380e396fd8595fe2946e7e96bc11d51d46992cf33f166816abdb320926e34ff61efe472ff1170a828c2206471bd26c1e0a70dcb3d25c87ada7fb1ceb635c09d114ad500690a88228d9182bc0c833b529cc7e10d9ed6a165a716f0a6fa331b08a8de31dc21049fa9fae801751efc93f895efd7cfac99f41595dc0f8c9bebd5f1fa66a8462fc263922a57b2ea6cd98dde178059f8ffb0aa40c61b209342b59e18a353417e6dfd6193a890953d4adb740e67db792346bc793a737ef2403aab5d57c4d003b0debdc26f731df72328059f3ae35c5b4e9991c50e1d76dc16eb3cecf1b25183b710bb284ef1df44519ae69fceb2c7aa83c760b3f35888a6dd3d27b3742be996822ead0631b6bc744e423f0a47abe4d493a36cf9e88c09afc90511d613fb338cd6c2e8084f790401bcf3e5ad064f021dc426fe0d250c8d52f303a42b128b2b26ca52b3936cbc9c25cd5d2d93f0f6a4c9695216fa97f914a330da724b173c07ed3dc145d791bf6230fbf4431ccfa539937e2daeea744870d211d7b3931b19d1de4a784091731caf027bb50491d9edda66aa98a27401f558393a8419c0671f41e0030e64725431653872273670d94c524e2ce9195d9242814e5f297c534d144b50086120fa896aff6aa4f5c4dc3b1c91f9f7b71d731ca69f314f26452d32c5239521d53c4f8097297e9cef8b348162be3b0f79ea80317d2f60c61ac9f2c02e6fe2582e703da1329714ad978ad41c8581d11807d6356ece260318ad81f3b9807fd80e9bd76db104a0ddd7e54459280af7d971b14a296d08851215b9315b51535de781c709ab14ada99271badd6864a0f974785a4da0eff7e94ac4291ed8d06ace3ec4094799722e9913936e13794dcd57962437a03c3432e25985831e1b4200e23f8c297f04a6d78a60dc01c1a08dd3450121e15dc27a8f73eae26c440a2886052bef4c688beaa369e5d32ab5a43e0a993e2afbd0387b045834bd2ead1343da6ff1d164b9fb26fceb1e24080fc85f6497c5ec459f78c082b05b4d442eb0eaec0f10b98f1260b8be3dc8381d9717273d977c82071bc6bcac02807423af3386a6c334c17918f5d03827c42a7ec159e175125cd89345632628a92cd8d301272f785eccde05128a3268749190aa4e81847c6272cf2fa1b13fdfbb2e69a8bbb5c4fb243072da85a96c2719ea844900b3558aaefaec386c545241dd309af1e5e8bd33312d832dbe2b7405d2990b2f8a970cab1a4374192f728749d32ea1eeaec963940aaec2aa5d6f29f7f5d04f6d512491e64262cdf6c9992d94c7bd3c4870387d94779dd1710c94c74136deeb40cf3746dd217b42dda09ec27d5324257e41ec20a96430069e78a5d59d51d73a972924e0d49faa152ac4125c77253980a9e11a77bc277f312a621b5b6236f850d2b16aab7438a96b0f638b580bd1c8bec3a3aa14579a300a0ce49e3f8dba1c0cbbfa4f691208d718f49d8fb8436fb7dd6bd5aedd57740e984cf87463e73c02e3965ebbf9d8e013be3721c4144464c42a0f570ec372e808134bf26b78ea909a0d82845b8c8b625993738548e64f1b025a9b6d3b115ac0e51101880c225d920a0e8bd4e5d8e81f5799b6f92a010fb915648e5b2556367cb642b8df6a937e6dff4dfdfec4f98f34dd61aa1241694391b083b6a88d559ab47e7a957aceda2bdd414281515f81cabb2eca85464f2f433b006c3337c1de4010cdd2d7377db1aa3dacdbf4a15e9bd047590b7168ebb20cb8112ffc8b3c6b1d378f0fbcea54f202c4c7822ed1a3fa85984ac334d98e45f2984c2227ec40c2dd42909e640e40992c7eee90e221d8cb816aba6451dafd525a5abdc8c22a2e91609dd5f3296a48b6b452453bc295331c044aa6ba82b4b53099de1be40c26902ab9998f063a553b83c00ece0c7300cb3900e7480f35ee55343f3e07fbe741b5e4ee0466012608c1d9ff791029d5ea1d4f0243430782bf06db1b89890750ccf00d61fb0728b49cda559801e12bf97440414b8f2a0d18db07f1e62a4e88384a46646c9d9472d88589593c5b9f43771633229c50d920636eed29748f4b79fad39485020be259ceea5f6c6810f3d87922abb2eeb8653d8030551242142834c13033b7c6787951ad3072763b6f33fb81ce73e7a8a54f178ad9b6ac883a48f42021918ee7c820967378a0f3b9979576e7af1d4ecca3b7c04acf13d7da059c5d7e5e1aeb6bc52d661b3e8c8d55189f138b704db41f9348d0a70123373b9aa6dbab0bd830cb56b2a2f21f05968a1cd05eb9701b6133e740e1b5177d20d4d255a1be63d7d186d61f13200d04100c040fbc820f5ff020390e54ac11621364303010f438315e4ad553f9e91ffdcc4ea9c4fe0407e1cb8f5cbae2fec4e8854a2663c7c6490a159600acd2525820317f185683add8ce749c5a3f3f0877a387f4c5efbde1defbf4f335f6ff00498af66e5fcbf8e3dabf8eb23a32e0c6a926b18b4ccd832c4115a8424e23d80bac8bb274cde8ffa98b91eb767d3dccbe18e41461d7cd8845d7228a5a63fa3566df75531f96c835c18d834377c6c1e18bb5bc541e2a389391991a7a7a1682934e63023a28b16adb64304e4e885e4a1b403064c9148c41a526188c1ebc1a6b81ec3eb6946df1a481d93c501cf510ab657d0445a30964ba2dc5e0c9cf4bf67f2a39f7c9e284aa305fc08db9cf698284f7feb1a9fd3c1143d7971e2d63c5394e5d332ac160bbc7785f9d36f685e77e90c7c8d6927109703b402ed7232b969b0f6761951b2afe960c3da8deb04229acce334afc33e521620c444fbdbcfd83d8b9121aa6c83778cf7434c0230829fd6e238cc76ea43cdefa9dd1799e3a6dc4b87182fd97a5a17b12298b3f6b312ee067999f8abba3d07ebdc308949257379c6916d88a4fb2efb34b28110a34acbeca163aa2ee7b1a6f7b4da6051ea828a06b178cc9d00ad194628e9d8ffda12713ca3dee9150f34f403e3e11fa5842c3634909234ed6f069dd6662dd1cbbfa76c0ccebe53ee227392d37e905027a758395e60696713dfac57913dfd1f8a9997bc620427a1cde3c85af3e89fda7bc3007c73b2def80112c8bff9c81cb73da84a02f8132566d739310ee578110473ba0e9d4d57306df9b200e2a2f99c24370e1cf404f2b8b3a9e066b440c3972c5b2c069eeeaf07b84652c442a38754a56fac509e348ec22f8b33f7971fca48f1c0430672f6aa13ae1ed3a57611c2a9ea600c434d61797eca26b8dab04f9428ce0a1cbe40097530038e0cd105d040368c33c7f8b25e2f61d30d39b0542554946012058d57410ebdd2c0ca75a5b2a6ac165571b0a9aba1799d0a82047bb9bb14a7766df7bd41af87bfb416d04b9865258d1b4c650f7bb607ffda59cab17f9bc75cea0e43f1677128818f97d158a66e4c3c3ae93891a4d84a1bf79fd6fa499b445bbaf6cf26be258e89e115abb634f320c36b7215d0b5a93ad26f460885546ac55ab15fc29ffd922a7206a5e7cd7a594c36bca0092e775a8f9e228a1af2bbef0a330239cf03c9d924a50cb4bdddcbe1163b706d603732bf3432efc871a01f795442e43897964bf5a75875caa1a2368ffb797f2b65d1b879c598267d6c8bf137d2df524e052d4d3fc0a50a5006a38f434694b0692c427a8d7101d4bf1a5996168cb5bae1b8a7f0042a4a0ee1746616ef0208d3d717e3ce0756ef71c3215f995ac89af76b422070d2ec729ece59f5cd345b524282b3d565ccb3347e93155daf947e2ce2113d5e26dd7cf9da4aec5e8a1cdc09ff2d9cf685f8f86c932972b7e14ff6e59daf6ca2015cb4ec48332f10faead7210fcfadcadef6e7120692a425a9b7fc2531d9517c6a39ab3558fd707471c44b5a1c33964cd793b376b9011ee6a2d0de599c0f54f58e71adb564d092f2b3767d9d7c88644d85038c3389a0c300597c78d0dc282336182bbd34480d0a98b49e24511c051a19fc52314bc23f5dd3209860814c81a4b9ab23bd4087bdf0c63ae48f2882252e53db3033d8b03318da68ee4b16b6fa445cb74914e7891dc09bcb85f5017e2df8088c7964589d68612843a8d2a8a7f9e32b64476f0188d2f240032b10e715952078e662f36911a1e7a95b27535544ffa9a755b34b33f240c05ce114c7afe7b31e6baa0bc854e7d788525143e2e05b4b08db247a74b9899a904dd42bf2d67443e1f5c2d20822c8049e1e2245942e264b16f930d29cbffd008e5c6ab1f3f3db4797106f00e1b7a534bc5ab4516b83209c28a070e55d829a8d79350f9b8b741ad99463eaa07fec17d0b26411eadbb71a6b25337b2732ed3d59459103f17d88da8954be2c9f798963c75bce2809a5f9b8bb9bef8a5b785e84d36dc8c3004ce7c6abf0bec50476869dad521f5417f09098ae5b63b0528cb6788892c500669cc84e04ac417d096e2108c46aa77e0030cf0f159d233f9438ca733c3fcaaf665ed70e01d0bc27deca488a322be291340297cf41510f1f1be0f51c37536117dd6cdeddc5c040475d4395329df65bfce59337b7735a0aed44ea03f07dd8103510404a228a64c9b4383ab25979fecea5a571d0d7d7d6af30b8b96aa8fe37a9ba2c4299581c8dc2e744c443029797080bf07bd2a19865a0bbdbed1dd98bd6fd01599b82d25c39593f1461a9b30fb25a9925f4d60045f2b3a809c51cdd2a4bc6583189989c53130d1fa7a3f6344da5effadc84a10e6062381d0673b5c6aa8e0b092c0f6544b494da00e36e7e44b5735ec8cf53bf8fc178950822a954a57941a1e40a807a2cca04c310cba204b584ac2a7314da5ef13765243fe7e1eda796395a3930efae4bbdeca3421b0cd0f7154eb28584fe7bdd1721df872d1dcb33727c4c2a59e29dac08e20d904ed3ba6c78db5d6226fcba975318beae8c16c537c3564738bc953de8ef27cde7955f58b770fc2dc00a221f6c5c8894ac8fda0661f78ce5f1f0ab8dae856b5b67da0590088d7ac652293b5aa013043c9cd6d6e925c64416ba251b3005125605c4e70df27d9b4df31913cadafebf61d6984dbb7136f9aadec5b80db32f8bede2d18ddc4453a468499243a48bb6b0838973ff8f436c36fb45cf6fe4d6fbb3ea22b00438e61e4cdcfb5483b5ec423fef9727c0826ed582400c89f505a132c49dbc1669f8d7f9537e1eba0e62112122fb01d21f0798d35dfaf3c9e816bc558235c319b8e5b21167146d7401fdd95dd2c930b619bc60ea04cb1e77728089a4df433f00fbc689e1c0276949e4b066f7fb34016df736fe318aa8189fddc15cb4cdcf58a80ff45a82d375c085ef99e525fac477870d30233a42cd5754f43bcaaf904bb0408528ba1e7af5eb664e5dca7a3abd729304a338b09f46f6ac9f62f9e5a7ca8b58eca46610c9da0a96bf3592238b5fbafe1f1ff8ec945c7e11e70da0761e79673c5097948a7e930c43e7ec06a3bea4ecef19e513b7c98b33043b23761933791fb88054d25093f188e03849fbaa4cfd5e1598ab2e984d51e4d55071342798d5d51854673edd2d0b2a26d6ea32bf3a558135090b379359bd45e0ba3874389928d35eb5c0269caa369aa0a83f5de53c5140b42eb29a0c70c0516e6c6a060c16e180a2ccc8d41c182dd301458981b838205bb6128b0303706050b76c35060616e0c0a16ec86a1c0c2dc18142cd80d438185b93dc696c04a18d5c4797a307b699d8c949193073fb170a766ad3307f885d1f8314b43fe731d69b3f711821118d5946e0e060ea2642e2dda4bd7f53067a4bdb60cb9a8de4b23aff69dfad2a9a40a4089c141fb6166adddc7adafda9f636b1eea9648671ed27b4618331e4b5709510d1787d313b7aa425ec3a00e34678a3306b0ec6128186eec48349679b048671dcfc4c89e666f9270877081c606922e1a5bdfe0d06fa8954f1f03ca347247d096ad8c28c438bba120aaaf1f4257b4096c4f3af46778d65214ce4bb382682d8dcda51ec8db6257ae9fcf26d897bab2bcabaea472e732f67aca475cad5dcb2071c8cb73ae5607be59812c5b84dfd3ff9a9209023cb12d598e4254607685a818796888986c7f45ecd1ef9c666e57907390b34059ff960d3bc86d5cf973e8e196718251e88b5117e4c6ffcb712f27e1f53fe9bd24c3190218b7152fb9b5d91776dcdea1a74ba50f041b2f1192adc6c9d18e31f3640ac1e20e0fed2aaeff0d43838cc345df6d1317e125ca2d4ae19a0f790449d57a7411ba3b86c6956b44b3cabeeb26842902ac5f7c2bca3d8de900cdccd62c7d38b621bd5f3cca7859131266002d55337fb75036ebe1fc9b311c7141c23e13aa7d5c95423d436ce318054ec4be65068c7a9b445f2186c73ebcb449da7ba654a869baa6aa03341318a3ee409bf58cc08460dbc52391bef5b2eb9953f90bdb9298d2ed320298b3634949eb7d564d26ba9530d57204521994ed976076a366ca92922d1d27d1248d90890343bed0916d7dc49ff40e99d6c5b0651da810f65fe77088096b1428349a4d9693a29334288dd805c5ee0e519de640072568539e3b9b737a9b5e6618de35adc86a8e1d78fdc497dc1c231043033aa313ea06fe2b0945f62141111cff6cca3e546c16c16fffde9467c3d73642e16a1061769e54aed6f2aea355fc8cd13c136da1b46b32a35345d084c909053fa915270d51fb5498cc7af8c2cca92900853cdbff3c532b5c0ac96c5fa8492a0877ba89e79b569e9012b4e0184b52576c0bb924fe43257505c01761e77c92cdf57ab884ca4ffe37be3e6c94316947f87366a4464037ad6dcda5dd23baf7381ad23eb258143ae820a0e407756ef276f0e8084a260a66934cfef885324975628f866dcc7dbccca06a4509fe1a395f7d3d364fcb735f4a6e709d26c19164ce48abc41c3db3b856f439bc011990df8471419368249b46ecaf926606f1f6070d27f58411a0420d4b1b2b70ba24b1c17f72a36a2e3758957d7e427556ba8a4d69a499da3621c282a39095680a46d38b53f9d993d27dc0b9b94960851e8d8a2ab46079cc524cb2c4712ae0b2c1368723a9d816d21f7e3e39bee04b2c408890d36c0aad6224e187a15559ea1bf7cbadc5454f0f49abe943ca0780959b88a7241ce2768ecbaaabf0366340700dfc950f7cea7a5ea7392504b02f8712933d88e63ee28847ea020da615da7d0ec26bfd649450d4dae4238a094e04ebd37083a7bb603fc510b15fed9a421ab0100a2dfa4d8bacd7508759763ae787bf620ace6eeb355e1c95149d777eceb391444030cbe030fa467983e26ef4417cf3fc4a196a11cb438ef8c9a14266575f47b8364a64e169800c5f0e3c0ee4397de1471b13ead9b8264ed0174e21cd458072f296c43b5d12be903f8a5cd1a82f5383189652d153a0e6701f9738af6b54823336d2f98e3da660ba747cd47f181727c63e392e13eb3e18b9b410e2044d92ea6d2828b8d887019a5545319351bf415892a5f44a315ffd786b6894fdd373db8b4dd4a4f6dccc85efc58fda1a015d6f76f193ff3486ab8b31fc388fb02211afbf2ab5b14ca5e380072711daa13827791b5dc03907ef438e16a6b1fc9d247c261049b589623f9e60a280b328dc627473ab6c26d8debfc35d150025f3149018e4a4efcfcb7783ef1d68c842a232b77c73039474a3ff954ab7c2a8ce104cd5d55816a9e6593d042b2dda9960fb915486eb2ec648eaaa06018a5349a89532d0db8f7e40cf3937d0d4bda212d599f0478df828e9b2a3a1e7ee9f1afbfa901108801b7a2177162d8bb7e442444ed33f020c1d07211d8a07d49c6bdfbbaedf1ea443acee5d158a1ac70186d592cbf51769b8e8cb6acda85fc8d236ad9451845eb854e8a720b2c4c5f6588bd9a50a60e604dd8fd0cdd350633a1413b6b410df6464d91642d4d53b75aa0b3a6dc6b809e894c7561d2af0ee431a3aac7ae543aa880b540bbd942ab8da398840d8ecc9673001fe3c0f85d2cbe8f1012355fbedf84caba2e22dc0ca1a50fb52f3ff1477a38749e261b573c1ee062b28bc018d2cc84730ba64bdf109352bbd1b65ca86b8e245f009ae9d14c84168c94fc7c722aa24cc918151bf2bcaaf1a8093d39d0742a04270c4d1b43c515aeb7f45759d7773062246c2863039f1210dd596e59bb5a2c31487df928e8a47de8da73003ede56ceccc27794e50228881616428492f0e40cae194240f0712b0e7d208874983337214042f0712fa1e2f0d2892d3821f7808f2f285cc90398951af1b261abbeef91b7d802882018636da70a9771e8b2fe22592780ddc1323f8d840d25e4561ab9dcf3e2c4587a93d7b0ad2c006d254906885f34b1c24280ebb2ca2844cc21b210a61419d0d126995031f7508993de9bf5f1711a848609a0772e6eeca1ec1e38990f6fd74e2a383c9f23d45c1d3438ef69b94c237d3f30c0d45e9dd430eb8d303838a75b0e8375e02ba4d5721a6200830cd2cf83482c1a6c201e294f0ae56d83435b1afea815ad4b7057f2066cc5c4693ce990235d9c26dfda3c6826e7bb459c74ea387babb542e47ce41c0a3e0e2b290ee98e982b787147027b5c38aeabce0677e82a48d13b80e05dc525af6da1de84c5e5bcf2ac624e637fe028a165060531c9fd043aa496bc11f999d210a724f77303a5a91b7f804c04c3ff10d8ee26c2e318cef6d9811a306d83152a437ef911da64d60a7c5bff110246cda77a5225541192b31c028f0a55236814bc06abd69167a73567bcc6aef0c526a19889c740e8816cbb997e159aeeb4dcfa14f9bf8085254e094d7747601deddb67fadbae5f0b8031dc943e26a49fa3ff3ae7f9240c50228140a0248c7bc13a64eed8233d2f55c63398296a7f543260f926ce99e0bd211400400780f290e41ade472d9329fd52d32ad9e0368c67cf68dca9c52840aa5048fe5a659d2fb19ed33a33de75092c8b1549db32ab04e8cbfa4c2cbe271185e43cab5bdfefe2429e090ea5696ac6cdedfc8435642c86027ad9e9687bba7e92c5adeb17cf65876ac2ec9dc915d60d7bde6a949d8c16a78e192bd3df9b9fe7dd0d6e3fdd4863fc4234881f60f42019eaa6dfd1b5dbc60bfcfe165129ae33833d1e0463ce4beb198754b95435a2eb22f6c128e98a46231fd6993b1d1560f39750b2dd89f6431ba1e74e4ab86b68772c03cf20f3c66b162bbd1936d65511b49cb82d84af67a23a2b8511ca510b4a3b279a13db2308e8ce99138bf4c6aef9e38f41f4300052629284e2134b33bf32b066827ad340b5decebff1bca771285d138da5bf622490210aa3077eaad19541eaf3378f25ab3488d425227cd77bd8414542596bcdede4b90911cd7f2fe462fec820c12b591752b8d019a341b495782f31d12d4102bcdc0e3f535ec4143ebfbd13aa275bbb42cff9a65b3a25d30b8886202e3cd04d1bd15bb7a093aab7ca37b7b80f1bf88df1069dcbbfbc717c29971969b43da401f5105c326c7715e0381b62beaf1821f23424e74ea92b7412236d10092270af31a8c947d139dcda2b19fd85d88951728a3d4c0f96fa1cb57293db9db443bad1824231f710569dfb824518e014e4dc1443186ea64b93f0323552788c41f69b243dd469b926e9a877e6e4658d3bdd9408ebbec465b32dfb24816088db918f474c689735a4e4f2c014072103b617d69361b9e06df990fb76e31c777064d7403eac6a4ca4636202f13a969259c5c8eeac0c4409f87fc021696259f49b5301d71789e371b70853adcc66ca3280dd4890c43cf2b065eb6377698e71c8aec7d9187db589fdfe742c3bc7d4515937c4f09ebb51eb225e1a9cb970cd76244e65c33a0e8392dc272a3a8bd4171d8bbf6e993989ce3ab000811edfd98a6e174c310c1788c71c15b4a2b4111dc9957d2efa6b6f0f3fd343e112e73e9af6488cbc7c2ea6d105901f4c980dc68380872f6392a8308dc10c71cde3c1835f9bc283fb929c9448b3073fe110b8d620a9054e8cbca8887c5e8240c4dddf1e6c78c184416b6271a48449ca6a971740025c28b443ba08d8ff2d6e0a45dd8fb143b78c14cfce91c933f0de44d11b1b51ef6ad327dabae946b43637a23897d34a59765722eb822a7a30cae9ef3a893aab60ff9a30e43dca8f901e55e591765f902e98cd194223710603fcca2f9669d9f5f66c913671ac131f900aac87db861bd0453e0e5a73dfccc70353bd611553663473a8659b26d155e103df0f5ba7afc880800a0e8a70bdaa2ceb275e40ca0d3d0454d36976a0d5d0e9865f7776ee8863a221c29e1d442dd905a1221c8a67f39eaf5d47bf3200f642edd3117f7951523970e19f975d8c710ede0d5002d5ebce5e455aab9a5a62d02e8d95e573d7c8c31a37118bbaf19ce72145a68003ede560daba74e7445e45cd638419c2246dcb9e7705217d7785a22f0490f83d40168f1c81f78b9cc22b4218ce4b8f70d8c48d4f6ef0630baefb87cb540bc73013bb331712f683c1674135723f212fe95ec3a3b95f1fb0f4963cd2f5efc211d7b762dbb2a4fa9b8f55e0f2d0138f962a4b9103e0d16637fcdb1ae2d8975da53f6d95263a20ca019961c6dacfb11de0d0219da3948b6d5bbae1340d65084c497b6474023cdc4a15540a7ed1b978e576a4e2a92b926ca0e11d3af805d52bf0ef0be7a4c76acc49326b12d68da2031433a19e823827e6b7e7c70cd8d9aaf709f18d38da012fe30094d128eec7ff4931ffdce4049ca030b101ff296123debca9c01702f37d16a339ea6d4c3cbe367910de7dcec3b2279a1122e4924b804ef78f1b0bfe9e644d1098937a7dbd5a9d2b76878c442ac8ed8f86342dc98941db103cfce13be8d320f0d46568ddc4f7f8783e56cc6869b7f0ea1eb9980fbd36169b53f154056ee54f23593cc319cf2e65cf4afd066687998428481e9c7a4950cb2c1b117d6666abf87ef2532d4d154d24343be0bb60d44be0796e0b03845a10b2c4336e078cd9a0140d2c276cb04006c759182d40fde98116317431a000026042e255f89e33f85bcd04a519502b89d44b77afcf412451a3eee848ae4bf2ce90f3cacaf384f26dad4264061f567b59092b17d40285075ad11622cb8899ed0025352c0f756aadc299cb25a853b2dbbd8fa0a67fb1a16e67942a0f9b783e2ee2d169e9334461c6430f2470d84d64540e1e8778f0ae1c205fb1daaaf13955651ff16289409b32b3904cd86d552ae55aa07cedbc08cd4a051ddc622ab2f42ed49ecfeb23487c1fad0c4f6dc807d6ad6bb39051911be9919221aafd8920f8625c4ff691ac4269ee365832692855219d0ec09d21167f28ef90d6e0aaa2742871173f05e8a99a2b6827efdf8d14f5d98272cb1f78a19a09acdee546b627649b31dcdb84f236e9d8b2626143b9b68d52f13e41f5a734a7390eb5a88ee412e307d7ed766858f6af1534f4895875ff022e7ee80eb406bdf2536ccacc2dfb396089e80a3f5e19af1b2bf29ea29a70cae52f81d204f507ac8630c57f9f76e778b6fb10e62ffc5ba0b035562c77cf63c19b4f746549db6cb275cb34de95a47ffd83b483511e9f414ae0c0b802e72ee6b04632e64ae34c79519ebc29d6209b9563c029bccbc8d3287698892710d69b07c5dcb960b8fe888ded32f03fca83330312ab55a9da366595b26760afbf784f64be49a4035d1f02f2cf1293f3323545422a65c7b61ee8252ca192041896d3263ce02cd335009c27ec1a743961e992922154426a6473d7de535ba4a7b1aa87dc670c9e2982b526aea0e51f1f2898f8f5ef2f691844cd15bbeeda1f0737e20f3af7b9c051794e3ce4a4a513ef50972b10be1913bc2b2e0b4f9d1d37e36daf5e37e766da0078412e28bcbcc280573ae3236dd92c5ea624d7ec3aaa64b8897c901e700df5f147e2547d2b80bff331c0a18d0cc6046376f93590979738705e9433cda54e0ba7f061b0bd149ae8173754a2d42410a1b4acf49ab1461c65baffbd1738a9803eebb0911718b18f6fafd2aa87ac198a8e31aca772f8ab6aa46632c5704a203f258e392ff673353e9be3d077370016d5308ba7edebbcc5a0e56f728a0e5709e131e0dab18fa992c888273d7c185521b3942834dac5aed1f378309c9c7131bcd8e231ea2723d55d3dfad585a73adddc1ea8f52eb5f789dc3042e2804e9504b3372a68d5fed67a3c600f00618529a963a2cc3360510f58a21ded21454937ed5f2f180e3d8fdb038ad2846592f51a533c43596a780bdea8ce0d064160cdc7ea2c4a85ac8b3a1e16533c0ddf7f4080d4fa2b2bde34f9e611ac1fbb83b2407aeb90263744a52ba4eef327f03f6a6ab90fc1898699e39ddc067d59eb702c92cc983bfaffd2d5a8175c978597dccac60486ea2c1918eb75b75083c3c6bba370df0dff3523bd29fe3c957b56196e97c366de1563b2c9edc9b1d485025c574ed3ab0fe042bc4fd7a9a8830e64081f80265f9efd26fec92f4bdbe8d04e163e0990f6b760b5d9cbb2250a06d762a65f4a0914b9bfdd3a6cf1c9cd1bd4a93b847e4cfba7fcf35c9d136c1022d4196d4e421e9f27b0a822c5468c0e4a4059b426a473a214bb21bd8ed81ca83ed6955d314b1fad0548e7d860cc4cd9f61bbd2665d1d274333189e6138a320d3442c129bf2b13d1b3a7b80ddde5c4b325d39de4b78af2b5ddf005cfdd358f14c148d30dd1bb4eb358656fc1fcc1ef2b1d43e82fefe4d23327c937c2654630fd122d78e0df2490cb2c5abd6336bd54a2118e9b05227f27f14b94292f1cb03c27788005458c5d09567256b3656c9f2426c106dacb7a67d29f0a244cfabdee4616f4f6eb0fa54149e7a61cff78b4891a1b1777bcc6edf417d04af4534d566585aaf66a395d10668af61e30bc79802d2aa8811aa0bbab6ab8ecf694d20da3032544d7bc3af7a0510bb2ee4174766cf9b6eee4199283c318c02d3ade6d9a00bab07619f912dfd8fb08fda186fde3eafb2b6a057dcba5fdeb3691462832a413bc5da11cdf27da8729c21d426561aa4d32d4823f5b68bcba67aae3ca9a5ba479961c6a6c4b8eaa001c855d3d09318fe1064865a6f7a231a6161e0f0633678fae30b0d422d07990e700666e96c7a028496e98795045470f88ce701d09a0dcbc61e47119e9bc2e081f613e9d622f769fc03599dd08844cfa3fb543798264476ee67f318e3d152105f9126be9acaa82882a9de299cf0b6b7e4f311217db45ce012d036d821146673ed9f0c7641bafd28e0ee89275c417024d2a5b682c5a6f61d12629ac22e7512bfa38f08e9debb58754b82a8da16c712ca409b64612eb163b81c13ac2e99eb22cc9c52a21d6b59310067930e13a67e50a89d22d647e6a9ef33305e36a546e1f9cfab8a9596b8de288d6f9c43301d1e7d7a33faf88a45f26d14b4521a6de7a726d44c13c16c2ec88e709fed24e09a6d9d6960ed02f5c0dfc202dc0e57e3183e689f15ffa4cc1c6e84445caea032b535ac486bf23e1b6dc76b547a81d4b6a728175e82b36dccf4e570039e358075228cfaabb4d70d11ea5a2fec476028f735c7ea49524ea378ecb10cd2437490e06af926ab533cbf1dbb4bed2192c63ca0008078104edaa5455a4d5aadef37a3785c75ac02d2dcf1832d9f525551f9a055e40dc0551aac2a7f0916db1c99453582d19104278ed0bd9a581142eb06a0518b39096ea87f559305553b387cdde9148d6ca54bb48b4b5af2c510a366664c7ee29543652c4d28e78e39a8f100351dd6c464c3c8631677e1cfffe952f2675fcafc92e8ff7c8cce4fb22f294664503e272969922c71e4520a506b8cbeae013d1a5dd9af3023a828c6fc76d7468c0bd4446d966eca746e20cfbdb3f0f0f98f0b681630ae5e4c4347859d9003277508e11595d04d220d225229e0f4351daf47439f257dc8120d27831212e0d6916c67b684f872e745803c5c1f410cee9db3f0d4b90daaae8f03e4e7067af28584d7e0ef4bb46072025751a2329b91cab51081926f4ee1326a488f3b90a9982ad4e24969564481e8792732165bc2653e3005cb2a3139ae4c836228b8ce1726619d74a8879988584d0d96e9667fdd2de35148b4c0280e11a39bed7046a30444ccdade6d8318abd0f53a3bc6e055f49838202e2c4dbbda72bd89e8db352a9facee52d7cd448ddec2836fccbef4ef08abb7a6213d0816181575b4fee977a0d627e8774da2d0a3069b45ecb0db30341940b27402ff7d223046db50a88ed3d6031f67388c0f542942123d99fbd0ff449812f6fe86226a4dd7047bba3b7c98d1cb138971e8a269e09c98281bb617cc6c38cdf365abc6b9a8ff908d655fd21b713fe7543eb33cff7ae07c17612da38e69309198e4adfbb1a550f898406c3eff9a64f7033087b191753f1722005151f6bfb1dbadedad93b2dc35f3e43d601e39550cd1eb75007abc8623116681f95a67fbf99fcae7826891728177b6e21c74ec2420a8364b59f9919dcb9fb15bca55a43faa39951af064762e6b718ab499b5ef71437ff9ef916eddcbe4bf7f2c96f6900f44bb17b345a9829a907d95f25e15eb3e8e0c8050c1447435ed5225e620d4265563dca99f96be084c21123f626ed5452829c99fbc15cd204a00916edc91fa0942bda19a0b8f3b658425a8098513da7f47a86592bdecc055fd40046edecd06c85a82c1954f15bec5e3ffe7c9b870b6652bebf1d059136f436f0ce4d1f9c0228c75241e46f38190661c4f7b059c9b5b52f8812d9d3bf04c445c3f80c1c48504764db62a0ec873b5f448a948f4e3c8efe8dc54df1dcac8649e8486b400c8974a4fa14b15c1a666506f4e298366f483d4b7d8e4990a006dd0399c477e0640ae4b04ee2b5d2135a896faebbfea303b2fa4168776777d2c7db2ab57acc2eb4da1f58228f094f4fd03d06999992d33caec7fbe0ca78a54ef779ffcfec03f91923f61d7811e95151e75824eff4781437301ea074f8d3f3e8ebfd328daf6083640bda02c6547ade604b07d0c5bc96492df67d2856faa7f7084ebbfe649ee63893732c8f82338e269be1bd3399415bc4ac7ab0c53cf6a75fef4d280dfa0c8eb310b9e825d75611bbc7ad6852443939af505ab3eec9ca2f1d1a21ccb3b8b65435096e093a8de5ff8445957aacc1e52f94ffdec9f0771bb4a3eb9cc24f4a1128adf25ae148c626e22c5fc56bc1829b3b2277e76a0e497e8ae1dba77c55d86be11f78c7c08b0105f9895833d2d667e68645a7d06cd648f43daa238854c130bc929cbb688a56126eb814314be654f0f6d0bb1358ba2f89ac60d2875924a21d213722d45c5fd09c84242a5df9662bb05b5a61411361511ea028d76c136a164d2da12b5be2854da445fa1386735f1129bfe7b585c505f0c7ca12f8a1a5b97038d58249854662b253725b2028957b10ab442514da9ade43760ce11aa7893789d9d6a89ff5649fec1e9f9dd894129855740a5ec0ac96c0f9dc2842ca060e00383709037985dd020b696f659d32999c8aed1395f5a1108a62829200eef54980938dbe501110d201afa1ee9ac18a98c9e38a66337993eca690ab66ab8dd248b2a64a140dbd83e37de41245fe43cc98ec8b037b8941f234d08774a6a98448841974a37641240a43413fb48f830b1bf48284bbc711be7b90cdc260ec7129ffd51e42faa625d182b85a11791644956726099737c451bc2a3ef1aa1b6c84631a9e4699bae0c27728f61aed8dd0d706931b6e0bc532c260c25cba7b63fb034a5f90ed6271bca862121ed20d0314c6b8d27b409cdda8e2b6d7a3cd0de3496a4ec0b05c976af48a6deeddba1630e46e8ada94c3fec2c6bdbe4a1cf7b408f0d8ca7aad038133caf8dc576512b0bb4bceba94c09f188336ccf81c09f8bf6cb88a16806c03a5450ecd144aeefed7c1790cd31b69688c9b3974cda24e55e3c50a294f5d1040570e85f86177996c5c680bdf518919515ff0fdedaeb6b50c63ddcf8c7c1839b4238c5454982c5704c7473eda5520449a7dc3cff68853a820d4c051f1c762935c704caf7cf5f0b54ea7638a0621f31882174d44afbda2e70e048ba98430c047e8a9d885b9cb02b6b23040d6d823e0ac7a53e308fcc64634323c31a25bcde928e0a56d55b77a58f0bbd85ce5281b73c956c3b41c420c0697fe278cb5493a6a9e5340a9135ffe49772aed15636bf78c38e0e1fe07a66d0305658d21bbb6e5273411ce6dc933890e4631807daea3616ca649c66fc0d0eb388f0296f8b5366b11c7834854723f4409c65bf4780ce8e210e763a403d214a7b8f5083a5dcc603df6901d2b8135b780eda6985574280901df191c8ef57d484c266ae30528023b24428c717b80ca668bf8dc833f99211cfb79985ea206df7a7678b57ef02a3642a7d5ca4b2542f79b25c0c0335556efbfbbf00bd36fab5ecab71c0079c90a8e0f28bbffe7ae39fb35da9e5fb7fec1ebd67af51c8cd8e39496bf5e3ac4740ee5b5fd7b0e120e2a8609299c023bc9770a08b5cff6a71e3e9c735c17b35cfa3f256da5627875957fcc65c0dd2157a8fcb5312a34448fb66dcd3cdee90699b6bd0879bfc1dd88a3e83288233d95b9b204f66bfff0f33c324f2b63b3bb48dc36fe8efc0e6cbcb8eb5251fe8cad14467a0e17551320a1a56ddb50414be1b533aeebc46ac47d894cc3d44ba0fa3bd09a5542199a85a5e79c7f8ed792a5fa45260a9cb0d6eee4846bec6eff89e1471f0b06f176fe2a96bb31c0cb45bd0535f87c0e90351f1b77368ccb803f5b3c9ef576c28960ce9fe51e8760e26c216a7cc5f0073ab6af038a78b8a4cef050972cd56560bb407b9b1ca1d84d2cf49fcb61b394dcda8768294b3306e009adc5c40acd49f62b054b0da1a829c51e4c80e9541de6b670d75088410e27dc1f863ae0cbabae84dc092600cc8123768f45ac2696705fc9264683c58dd57f3bb7713423d20c0d1932a30fa14b76f11529b487eae69887993f0ad9149e5a961836d1d63686bf51753136508baa02c306bcb4287ac9d12350d2ecc7559ed66ac8fc95b6815b88dd865ab9b7a739154b28e02005a968a8a6e6e9e48502186e195e79188262bc85784d2a9f05c92c87dfd98ef9798361fbd4fa09e20c9cbda77ec2d385e43fe630064640c98458b01f09997bdf5deeb4df1551ecd6b0f367f4d091a3edd4a71741869ed276237996bdd524ccf5709bfd757b11b088c741caa611591cb188e9382896372cfefaede7f2b8fb78eb2a94bddc128ead944ab8eff838ea24254c7a1f95188bd91ccda52014109e49830c80d18ffe0d37dce061e61dcc55b7b19ec687d33e06c113525f07bb9b2541de3ef591c07ab10d1d9855f142f36c536ebe8097867e46fc3ad64ba0609759eca7f3bd01f6d789b9307e8a20ad2dbba4788aec17883e1de78a2ca8b12927337e20dc5791b8fcf796807e7033970fdd17ede0fdea680c02aed44e808f805780befda594bede669dcbb53b0a36ab8effe9ed1c5f8977138e850a95dea2e5d138adae7683cd152d8304c8062668dfc51fb6f3949f0436449387f01d3f8032a8701e815ec4910e7d6faf89d026604c74531875be9cb0a09ec852d817960c0a5cf36c29cdb9ee50e97c96c7b389dbfe0973fe93b8d953719f17cdcbed1cbe9657a4d58750c0ef6b9dcfd5436cf84e9c63cf0e500a516e14f1b54059dc3e49061a0571e682adb1856f93c675749d60c8418c0b74ed6a6b6f9e1f8d7865d879cafae81ee1b7f897360873a6bde4707c65e505f5d3be3cf2498f62d3915d45c2d35ec8f5b1c1b9e2f6629b9481549fa35c91e88710d004080b5772342ebd6483bb8e84aa7fa3efa0c34be6580c33e926923f88b4406198d2a835170ff6a7d108f36ab37c18f424c83cc379fa313f87233e168f99de3d3f0bffb9f116229c2b578e3cc0b5737d4d6d36ba6474308256b53e4c64fefb9c53509f8b03a5275ab8ffb96d1faf92ae50cad50ae70da2b38f2d10d145ff4652a2a5872960a4ffa20ca7e634f0138d92d7092cd1fbb2cf5d1185d96807e4017edbdff3883ac9f23435020008231d13414aa2003c27c89490162ea04be714058ab1d7cc998df211a07486019245346a9cb9e70f215712256525e0275484f9874feabc7166601648d4cb1d6f9a729902fb631548b2411770fc4ad0ca9f35636962975c2d922cf8aca2a2484185f2b10a05280d28e8c6bfb07edec2bcea59582fa3b1700ad861e39679d2a493c701987f577150f95cfa3d6c35b7728b0a3a0c44c05b7d300366a532a6acbab77f5750ee0b1655a1c4803947c104414690891ab0b58242a43f9242214f63d492dbe82ebd1e7b3edb7503533a64a81490d7f20dfedc79c66232957601dec04a22f70f007ea34eac583c2e3e128fe420b70da2ba42e90f7bb15490b610a5ccb184b709b6686f88b5976b726b7b1892223e43d38762f8a94268cd86675647335f8c2c07afdc0ce23ea4c7930371f1d30ee1dd89a893de15879d0cb32f416c1e244ae34011895c2ce78327d37d47fbaf991726fbc5e81c1996f42391100548c019ce634b05354ce9914979cb8a1dbd9b5fff9c526bf900fa07aa85d4e340b84acf92b924e66ffbdfd4993936463f74ae22c4303cbd10cacdfccd940ca780db96c6a22da8baae6ac44d4c32a8e3ffb2db333047157e7a17541ecaeacf217828e2b64501c88b1c9917980179579761533fd565debb4018f3e0f10b452c7ba6c43e3b6925d414b502c4cf2fcda3f04653cded5961df03b69a51323ac50b9b4fe332465fd5fcf2f2c0b7ad183d698262448ef37e5154cc002fb98fcdbccbeb77cbfdb87650548f2d5c8a0e0be060fb929124af7e880d66d4183c3ad0fad2d2fe0845c71d21eb3f82a32bf375af2005db53c82aee88d75249b239af238682447ded84a54af576193c5fe2ab361ef02f1aa886b37f66f290a013d5363503526cdbc5e771a162dc287d4c9083fd6eb93263995434103a3a96837c0c7c017ebf5d1c9dd3cf6024b166f42da9e5e07a0e8964275a9279873e3cebd9f09801191ccb73fe9ad22cf24bb3da0b26a1443bcdc9a3cc92d41918be0c343b059d3612a3271600ad88677050224e86b0ed914c1dbb8eb42120fa715449983bf4f16901ad8536fad2e1c5a5df10c5da2154e43565ce0745a9c8eb8d979133668177b07ba55406628e0e3668d8d23e69cc26d62e218544b300261ed0382e9b19ddb81da2d202dd9872c90eeff07ebf705ac24e469e276ec663ce7ecbb15a07b248a89b6835ec548f13bd2cf020a9e9b3326450da1db258a4e67aaea1bd6f36d01032591ef201f9b47cf1fbdad65b6e6f4fc088d70e5f1db3d22701bdcf2d4be4d304171e072e8cac08714944c8e7c8221701588549ae44052c2a6ce77519defba0e4b3d9a9cff85b6635197c5e90be65c01b5a41f16272d25df702a55cffea1e766e76879f3b26cf6fb8868d679e14d2e58974a4e22d061d2f855c293defd33cdf66db1c893765cf37a8e9ba49b2a08d6beb110d5fd24b06caf6e9639c842ad6f89de820ffb1813a59dab0f0cddf9bd212bae71dc05e1bd0ee4d26d55a5de9b18f5a1d6c559ad6b61440bdea20f6aa9f346828925a0a7a6516f85235a3bd43822a4d8b5a01c613d69491f03b6446d3814ca471430b6804560ad7e45cc4e91962da46f9d9180e2da3ea9d9126d04b2c559fcd922befd14feaaae6b8322179eb6b4b695da0d230dda72efeb73df6b590c73c5b344b68b24e7d461da725e079d4b98188897e96fa4890460ca365aeadaa5f9b93449d7fee5a61becf3fbca536764d57b7bdc4adceba6c1d7a53a1fbc57b48909ff05f3041d02815f092ace74b6a1e74a04e5bd6a29a84b24121425c6ddce1fe68ed5f0726805d59a986d0cf1c0974d849c1ff286b4d8869f6550a6fa40cf8dee42efab9404bd2e74157ac4e9754a55ba01959e0b5d855e26e8be2fbd08bb5971d3d7cd193d5937985de4b19a4527d0c4df9ed35385f8fd7253b85947f87de945d84d9b9b39fa656e388bc8cb2a435f42c3673ba7a70bf59be3c68dc9028cd704cedd04a50f58201816271dd9b57b0c704db18d72eb7b8a1177961ea65669084fca58df6864f6a7594b0d4dea545011f707c488b0fd8b6508bbdb6dccf56e4bc7e0c2a5b67aa2e8ddae026264d12bc0ec13ff08a93542a41142082172cb1d8d0f4f0f29101fc075c05a25e44728d180db5075dcf0005c00d7e16a950d378201483c48d50180ef9ce73344ad0a722214b080d350676a78eaaacfcc5a45c30f908022ae536762b80c9fe133b056e9dcc81008f88f3a837320cff98cab553f1e840184f8a9cea00ec36faa0c51ab4eef810005784d95b1798ffba832b356d5dc871f80f8ab4c7d791e9781b5ea073f5365608d022fe36ad5ccc19baa8c8ba855a693df115e87781ad271944a2d32a50deda5e6206a14f8d28676ca818346c78e6a43fbcc7df4b0a9b9810175ca0182f363061962d051a56aa081670700410410801b6c18c0ca0a1992430f0e4578d881880e36341b1a6743d4d9d4463634970aaee64800706543a350205d0e1e078613d4aaeeb763a697df9f6efceac4fc06b93376a7ecced99d42770edd49bb93e8ceda65d6e516bb8afcb2cfe59fcbafcbb0cb419763b2cbb3cb429769aa5f26ba5cbb9475698bba2ef5b9f4e7d2d7a5b04b832e8d5d2abb7476a9d0a54397d22e25bab4769b75bb75db75dbe7f6cfedd78edb41a63fe0386238fe802ff1d9aa9937f13751de0e2a6fc368743ca0bcfdb304cd8e3be04cbc8689f2b60f0f0794b75d65b7ea12e56d567d12258f2bf1d9aa9a37e0a7069497d67c28515e4ad48366934479e990cd8fe8e1e30cf86cd5e948fc0712e5a542370c282f9dc120431d515e1a43dd08186eae80cf56fdf802aeb380f2d2a01c059497c280e018515efa4304909c27e0b3553a2fe23414515eea334302ca4b5d32d01888282f651d4086193ec467ab6838021e0401e5e59a6a88f232518a56c301cacb434652aa1be042dc0621cacb423c06282fcf76640030525e8e01e041ecf09c009fadb2e105b89002949783044080f2322c00af1b82282fffdcf01e3e5b1580fbf0d92a01fc87cf560939102f024479d987871fcacbae1d7c282fb76c0fe565963df9556d75f203a87368000f8fc3a4e170f13d44e27398b11c4efa105279a76cc84b27326744de721d5a6e8e990e3b7c6309329e079d1d4e3a9c88d090590eb29e8ac31cc05c555b85b00038007c03dbc03cbcc300e020ace214d7c034f00c2c03c750757c725c405a38ac1f413730185ea89f93908f590f994daca6c683a8acb5de67878ba6a58335132403cbf1c2f1638ac58ce50d7283a5bc3a307536eae576d6aab2e55273cc845a55ba46358750a3c0e7186a55e9d3d51c438d02bf2fc78c3bba06f9f9dca8b1dda490df85d020907376f79743464fe08d6159d0855443e91a491cd2209034d0e809a4818d1112ae94e94a9fb91a954a565ff942236f8e9990bd376ad486f6049aeae798dda8d9d0aad85b36295df4049ec7207855b69c40f66f0dadafb4a13581dc7e7a0b810543a21bb590889ec02f6c83720e48166d3f0c3b7be8158a04722c05d9d0ba14d44ca881be88b4ce711c3263bb5c02794b413966a5a0b9c3162c45a1a9ed966616242ac97e3f7b4b417d4b6858f05409e4bd51232202dfb235f1a167d0f7855016169a6af1e64887fadff9b454d9b654b624b62c755aaece154b21bfebb4ca86d628f024f8afbc3d9658b047cb82a749206d68f6e04b5168aae5e04b319a2a1d3c6d61216da552c622628066fbdf775683fcc677788a04923c3d0219ce40963e495d59d8b21472e31c3634db12ea10791c42dfe5e52924b542d6d0fa8ef36ad5e838af1b35969796e546ad9c14753f8bf3a227f0d408e4c579e9e0d9ab24c7ac14946366c18733e2576fd7ac68b7b26be92df5c86659ea91cd5e9c1759af8863ece97fb5745aef563a517a0d4ca86aaec01a5a167c3bb1e04b4d2c78928f053ffe58f06217167c585f16bc65cb63e68efb48a59e2169734d1cf04d3f40f22fceebc6156f86c61a51b80d8d35b2300ea1010514702f9aba65eb46cd82bf396636b45290055fac4b8843855691b155c8fed72a98d59cfc1e1c868036f66d739b93b91b89e0beb91af59d7e74ec099b7e8e42741f9554d8d0cad68ddadcf90e3ec7ac144453b47ca127f0e0bfea3271de2870049a8d024f67641fbca951e08550fb839ec06fdf65b632076ab7cf2925a029ce82ef610c0b7e0af0bc84aa48e08dd0d4943282d79d01ed9d3370125910fc9d4216fcf6e1c068eabac468eabec868ea9a6634757f58f0e0715e34c5078ff384a6460b1e27c85e9c302c8813c5822c382f0be250b1a0bd38552cf883a6be8337b58a3bf8b7aa3b7897b9430ffe85a66ac0b28920333b79289149c24ab6240050f2256125ec494006e1acd9be552843a6a56acc5557decdc776ff9131d2fffe9548648c7c489470bd9b1a249b1a455774464e6f688867e7c45979f572ef9cd87cecc6744e1dde685098e48625b11514086c3ef66280b60a29499f40725b9032463624372c89adb652c98a47a03923e7b66dbc6d5b7787a479c39218e52ab8b846433e203f8ee74e27b3b7675c90378485302654d5423d99bd619359e8fd1d496e4d4126b9732f21a75d79e1b5847c62f3b14d740fa38441db0848ee37848541534161149a7a991425de16b22eae11d0e439db1563ca2c64066d4ae94f94deba69656cdcb6312c88eb38ae3646e7755d1873ce8f993fbd29832e3e6ae714196831eb94294b784e1d308991b139e931bef0054c993b29df1631176d4a3770461bbd755339836659a47286d027a3728694335e1bd7456764619b6c338a6c5ff624b4738a194396325b3384b88ee372f0173ba7988146e7759d93edc9664617dee77932266630d98a706006c9c6077edf980470048235a012c59a4291ebac81e526ce9ca58c0d0f0896490490f30639b062af9d53a634b1f4620d9c8473e2ccbf300969d3ad51b407e1acb932b44aabb607d9fb9132426cb246adbace55ac51dcaae3aea34d5ea1eb877585e48eb2cc139aba5fcc729779b284a648e1b9bbccae405e9245537d102c65f8e035a06415be4b19fee81a50b2ea732759ad92e18b57b2e24eb65a25c3a54c10fdf146fae3f96389040a9746c28b2512f0617824a3775fc98ae3bad95ffd1ac53116a877265913c59deb5c642e329721cbc95c66a3b2fc0139edfd5ebcba2eb24bb2be18cb72ff5edfeb9764192248a3b86f14868e44f4b712c91bc50151354c3ae3899e66e49d27cb9dfa807491712c243dc97c9f312027b6bbcc57e630a50455ac7717194d7196bb0b159a9a5248a004cbdda5f6b284aaba21972a3435a534b92e32cbd9eb32a3b56a0907d9eb4264b930c662b1582b28534a1334ec7529b2dceaba0859ee5fed09428c9e8050a5f60041889ea60d326344688a47cbbd081772bf33f64e99ed09429420adea7317d2aa4d0666278f249c928d8a4bbcb862678c053e4376c6bc58629bd5b1fa0acb9f427cf75ec4032fc4e8e08b809f63cf11288408dfbd484745f84e1cdf8de56c5491ae0cb9c6629ae58b4c14963c6b14f8f06149c5e820283e145da1cf081604be462dcb1f859011c23b78b0a4e2bb57caf4bd2b59cd954c91d1c1cfd51ca120c05c8dca22603933f25da608cdf291285911597e92d51c8dc8745944c8f2bd21cb1f8740f2d1988d952cdb64314e484688eedc3999e577dd3b5a3764ef26e37cb81f97e55e9ccf50abb8f3c6555e7975136a94101c15db8a681bb28c04091421780a62a4c15a75678d565d594512565b894213d6aafb366b55773e8d1beaba731c6c88e3de959b6c9b35eab341f6726c8884831fa4e162714c8d2a3f408315d44617b24085b5ea58a35c329f998d59e637ab552db3125c61adf8ddeaadbc271d7b9bd54131cb8dead910ed4e227b7bd6ec6d96dd628dda5a3c0e694bcbe6420b768bdd0f0afe82ccb28db5aa595bece3e1410c62ab21a199ac03956c946445481f047bf18f0fb36a12a01d21d41c571299b12094e3bad97173dca49fcad41cd9a85fae9c651ae4fd3846599210765d375334c662d96d724cc462593b794ab851d58cb158ac25ab2d6c38e1fb732b67cfd98c249c34556da065c76d9f37a91362b86d65b7a5b66ecac3756f5b77c9f6d270a273ce1a7ae2cfd3d306852c9574ec8520a45348fa29d4a839f4d1482293136a679d5a3ad63ec1d5a8696f10ce22dca8ea2c16ab8a150c967e527b23a503459daa5b49810d4bdafb32a5d0cea021083e231fd4ba1f4e885df76ddbb6cd097106d29ba3d9db688e4ce41228dbbfbad113edca1ce0efe85e39fae8b4895157b97fdcbbfbb67197dfc681a6dddddd447ac081a6ee29880da71fdbe969dbb6b2869eba6f6bfa85b6156a5469b1bb5bb4fcee1e4e8687a6948b30149e7ee89c8210e9815ab1f438d870fa415573a522d2434409e46b68ea85d2db580f887cc0b233d683a11f76c67a0086e521cbdfa82a48a3c8a932ddd3109c3367187f77a694290380bd327c427616c139fc1b009e23384747c5adcbc3d2d7c9c3b3993353e4e975cc14cb614696deb6f4379887abb470ca3b7d69f2b010e770ea3bfdf7e21c76a2c66e0f7285dc6c10424f53b41c06c90b65bd988797f01513670ae6b901b51d0be97d4858572c61f1b0975fdbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddbe6c42462d193f7ed33907d5a69473fafdcbee69a5f0ca3a93904f3d0332d8279b8ca11ccc3424a300f5be19c19f3d072ce9ccdca1c42c2c4e1f30d2cff527ea9320ce6894faaaf710ccb176b8086e573953284986560913077f88bb315e6e1285c450c16e21d58be27f23864c70e9a34686874e840878e19d9cc8c4c0e646472e020470e1c5370e030a16132c5dc2026e6860d6edc80910203f3127b797139c3c5a5c58c9616961ab0b0905148b2448352895406893492318e629028863308c3d118a3112806087e617c9f2703cfeb62d03118966398dd3618cc9deefe62ee50ca50fa45534f4a26e8897b6829017ae22ab249b37c7e424f0ce3d70a48191e46ef77799368c08e3eb9c88e2e845233487eb58ac81786f57e0fffbd99c9e5ee9c7770ab01d995ec2ab9454f340a19be5f84080dc8efb3079aa22504442245684ac6fbb45dd7cd829f6399445c41f94a993e5b710b4f82d0143d3fa1283e17fca265901ba53efcc307e32383e49b4cccbcb557492dc85953d2ce18175acc5bf38b5f7c6ef1501256f2750f1fd0fbdd4ede4af2dc377aa25fa3b8ec5fced2f724296781fbfc6af5f544f144f12783a43b8585620a2b362b694ad108670d0d227526c7f55c7da4a95553c60845324faf6445368a67405e9ded5da49b3a9cc9ae86b8db0763843390f4f3fb487286f30739474a5b09f3033e969e2aae4f7bbb55617de0773a39969e2a2d7a9a36b6852adce88586419a4a7205a40e0d83bc33d68d883c6efb848cc2b0881afbd14084fe721f9542b89741e8697b13dc71a0a74dc709e477214da40a014b276aace75d080e44e8c7d558afe362454bb6cde36e2f39bf7d76e774bef27e1ef99dec46da4d054496642b90dba99d33b00a33c683221e14f580d583253d58d203160f8a8eb0200882a037a990deeadda2e03ea6acb0e3b6adbb09dd4e374a4f4ff3e5d64d29bf50b2eb687f9452d346b9de28fdb61601a59432d5b193bbe96dbd6d4d45c0d464278313f5796573dfc4a181bd1f11ccaf5193e36608b4110a9c1adf1fa73077b6f72d50475b30aa3ffaa1294a320fbfcf53d48e0933a75f81da4d814f7d296ab7053ef529503b2ff0a91f45f5aae0537f02d5bb824ffd23d5eb009ffa50540f047cea4ba07a59f0a91f81ea91804f7d0854ef047cea3f513d15f0a9ef44f5b6e053bf89ea79c1a7fead9e0bf8d47f40f5bee053dfa57a31e053ffa57a63f0a90cf6cce0539fac9e0df88403cee933e1c96c7f895209248ef068b6af802288f858b63fc4d7b27d213e97ed1bf97c6c9f00df8fed1f7aa8b3513c94f70bb2ad4379bf98ed21e5fd64b67bcafbcd6c0fa0bc9f906d5bde6fc8b600cafbd16cdf50de8fc8364f79bf9a6d00941764d97e10b065bb86f2822edb339417f4b11d4379c11fdb39e5055fb671ca0bc26cdf94170cb28d2a2f18b3fd539d8df2515e5066dba6bce0cc368ff28242b6c121db3f48b3ada3bc2091edcfd4d92899f28235db38ca3b62d92eefa8651ba6bca3918fedb3542948bbcd9daef4799153e30ee9f32d2e936724eaa0e154f8f9927b70cafbbc424fcc5d8d52af454fcd849ebaa3f5746c5ca1a726c9b21b9a3863105290b63ba94a61b2dd475ca520ede8e10c64cb1c879048a493482496ea31a11d13d8a05798272dcc5317e6a9dfe2b5887836892cbd25f4d4db5781b8528acf6edccd4826bb6eab9e137af2b17d7a213447cbdca1765e74d9b66d63de3aa1f1a5ec846c4bbddd16ecdcf98830774845609e2b7387ecd6e8a43053e2fb1d15ba2a7087054e859d152e6f37649bda9e38fd6e0bb649b523c2c4e97bb52b02e7f4c9da5d9938fdae764de8d6982729cc53bf543b2a4c9cfea87655e00e0b7cea8f9b177c52e589c339fcb16e5f57c7c93261268e89c31fd51c93669ed80b7b1b0691fc9867c43ce1e75f6070ccd4f8791d3355fa7c2d676a04befc9899d296149f85a2bdc092c26437caffa4d07e48ebd56e0684c9339b3b548db9f383b9e38d7ee829b585b553a3034237844e68e27444e88ad059e986ba2b5d13ba353a29d8ee6613a7df64904a185da1a96df433226302693177805adf16cc03d422bb18bd464f465046608cc49829f02cbf41c8df184abfa83ad262e6f4c53ae2628e803eaf05b673eec805b64f1a3db1fdb1f2280cdbdfc4b0fd1119b6efa806b6e7cc116779e70d58cabb2308595e53a9bce4e867ee8cef87639db683c8ed47d8ded10fa98422071e1d8a9e20e88abb103a5e1c774a11a7e53aed067633960d4baf4908268f9d396b4c158e89e2f7bb59ab8468cacadce9deef8ed02961a6bef7bb26cc1478831b040912430c2854b5fc5bcb6e66fb60856119a758bfade2304f3c774622924cc24ae8103290f1cd8636a462683734c8eb0d8d1b3d79326f88a69a967eae27b394de93d1d4f584843c2b344585aa98c5d58b71877ce305a31f4b0070c59d29a5ddbd6d1bc771a58bb4bbb76de338aeebba97f7b66d1cc7755de779de7671e338aeeb3acff3beefeb735dd7799ef77d1f0882ef3ccffbbe0f04c79e011cc4e1e16834e220ee8d3d3c00f16fecd1e1df0e0f41101c8dc61e1f7e78188a33903c3c1c7b8a04d1c351a00fef034fa8cea60778428d80907e882309074808c30d09074869069718585a5c649881ccd1719161869720a6d48d18932a080c0d35985441b61b667872c8ccd870030e00ecccd87043af2e8466c7ed4a47000470bbba103aa4a6a7e45193c3903a809a6f634f0e43f841d42e52bb0b206aff50db871eaa8fa5e7e1c7d2ef50e975e8204b4f2466e9813872e2d00fa939d4191c2a0df4443f8095ad46aa000250a3a8bca43293ca4e2a77513948e528952b57a1a7a1f20c9565a85c5429934a9be4540aa4d21f95a25129954aab547aa552362a2d6a9bda4ce889bea6ead0d3940dd16664e873fc587a1c4131556888886bf42c2eea435f965298a53466e9ccd28f28a5b12c7dcfbe76d1886a1ecb6b792e2158504c368bc562b1582cd66ab55aad56cb67e6e3e3e3e3e3d32ea15aace5c39e50070b8ac966423556cb158bc562b158cc9bb55aad56abd5f266de4c28d6f266b4a33fb58ed5b53a974ff7438bc966424330180c0683c15ab1582c168bc55aad56abd5a2c16ab15673b4986c2634446358cbe5f30383c16030182cf6d562b1582c16a3c16ab16dbb3dfb5aa4cbe4f39fd38b839142a621da89e8abc16030180c06ab7db5aff6d5be5a0d56e37af5cd4821d3d06927229dd829e830d38bfc016930180c0683d5601d5d5190d6287a9dd829687bf5f6d314a481349006d2401a486b8134db42bcfa48d264fa677dd2b1b7673a1404e4ac27143862368aed6cb772d4431256d26d8407e1acb93786ecf670f2a7baa2ca93356a3bb562fb469a2812c82b5a7a0472c67259fa6191edc95a55ea82a2b66fa51f4fc86e9f3f32bb957ee869bb11c8d28fddbedd18eae28af54eab58ef322edb0fbfef36d1883f635c10d9adcaf041dbd9cfce581a05927e419259b08a446b14d500d922d14e40aa6d61fb934b2c17d87eb798b0137aea2a90b7f4f2f1196389186dd8d20f1bdc05097b9551a2b5aa549b1b7325590cc4d6041fe49255966a3516f35cb6de475e2dfd6ca5a2d2137aea6f34204916d0f76ad557964a443445f3de7507fa2e846eb5d4a2a7d16f77afe48e4653fc8446533daf8d8dd28b9e9a64956a5b1924577e9c43471fe8bd87a51f9af2cad20f3d31cfb42c967e4a3e5b90fc5bf2b15d027df71e4a41ed457221b4e484aabef74b3e34d5bd88a2da87a67ab8283929d5e8a9b5206fe955aa517eb76db414e361741bee79a7e0290f4d6cdfc61cb877ef9cb0c16ee5e54bb1d1b2144614db1b1ab64b307aea2c90b7f42ab54aae92abd42ab56cbfd42ab9b8ea15d1131312ad55a5d744f5bf8fbca5171464e945b64817e9225b648b745dafe6c5264e7fa517c4e591cd7a411cb266f79b37a8a28b998d65fbbda0f6823632486e83b1f30662b44ab4aed4a597ed5290ed12114d517e8fec75a162fb37645927b6bf912dd6c2564944f4c406c90a9292802411714922a2a73e89464f4da2d93e8944445393d6b2fd399213a73f1917d7306c4891d56c8e9d5264322964e9fcad5436b1bd3fe7af0eaada66c9b105358abed944293df5748ded6f23109fbd4ab820bed5ac22b5d702e1dbde0b8c30003ee4c46f0482b317c9f7b013c11188ce5e2abc879e381a81f0ec4d127a1f89f42da85530a739cafbe1282fd97253794d64791f5306dd286f0e4cb9bd7c9f0b49b6984ce56cd449598ebd2dabfd8dd5df479226d37fb2e3efc9e6d8f137c7de8db5054d1cfa52fd6c9741d2cff126b176dc82c27aa910089bb56fe5673ddb59ce865bc8855de8890d4ecb5b2037224e49a947b2909e69f7b86d1bc7711cc98d5dd7751dd98d9ee7799ec71591b75d566888fed08818165463d68c1591f71b32e989724308bbeb3c29cccccccc2c85590a333333b314bede85741b247b1ed3ad1ed95e92556e5e94527a13c6cd175ce9cd939bd70d0c466745fd504a6959af920ef5649b5bb7757343fdcc897a61d1067945224b0f43badc7adf45a256abb80fa6bc1ff9525ed2a5a42698a55c6f5e4d451d3acbcc2fe7dfc0e889e36e60375ff4d8c3bf81d99b21cbf297ca52debcb8a59cf4e4c231414f942b95a027fa2294cf52894c21ef57fb6aac5691df4792262aa06571b58afe265318babc87a12569fd7d2449b3f77674f03b578a44a2f57a40764cd4688a084dcd6945a2528988a2e84be72aea270ce7d87297fa598ebb4a6ccb43963a6dc8cc2c302cf586e7ca75630fc7a81f98eaf252593e4720586ea4a588c8b15af57d2469328dbfb7976359ca3d29a22998d383ac56c59c1e6cb54ae6f4a2ac55394e4d24e9e14c355da6de38d7919da9382e53739ceb675d60f6be0ce520b27c1c3e6a26d31673a3928de25eceefa188119a72397de8e272aea25ef4c4b9944228e7729e23cc65fb3265d6d201e505e7f05fce55be4b8579b8899c8ccb512f8b12b24268f852515d700e5b978f211561aacbb9729f2310282f3887fb4b69c4a52c424f4ad0544b7995b470a9c4144259ae38b3f425d9bd1deb57abb1b85e862cfd65718944b7674cf44055276b2aa28d9a6cd879857c995d20ef576b9558445154242a2245a28fa8452293a7e485c68c20fc96902b28b492403133b06dc79b7a607d6011cb81c5139e011b6e22ad38b4b02a571936ec445aab8b0a160a0f260b2b86600b2d575819ee734a089c20c3fdc56e75e463c34ee4ca9dd66d7ea466a3a53071fab48e96eb9c92c51696b641dea65d4fc876a3ba3d59e97a412cad637bc4b5ac51dd6dd8268dffbe510d4bf5c8e8517c763c59c9b3905e1212ea1652e53eaa9d25bdb167dbb85a1955ae85ba89ecd6435e5b9210f98d2a1d2b102cbfd5f8bc4a2a81ba70e4914ad38eeac8922a50cb4b2d275b668d62960fb4a47a247c149f257dace34b17eb12284746e45bd6aaa6352d0cc9cef2c787a4b1672c6520b771dba81856ae756c6f0f6bdbcd541a376ac73a270ea9ba583ecbcc614b8e2a144958762b81bc32f43c123971f8e1266e14fc2ca902751f4bb16ee3d6a3ea8d6a674915c8fb587decd5e9b036ad361b9465fb62cb7a73c96c9f7e80dc7e5be4c86e14c34a3faa9ba5dba8b60d4be2a8521b92e28845245de1eae8348d9e8648b6b4d79838fd8602a3fabd65c0b405dbdd55989283362c0edbb489330392de9b71342a05f236ad69dd449d842ae92e064a487b407940f2451ea5e6164272155950931794c1055d41952004210841a8c23c671a4cda4e2969b4984e96a2839a141d58a16c2be1acb9416616fcbe2381bc366d58f0f408245d423ed1c9c8ba3dfcca5b9170ef88340a7c578b4ce1e2bcb6125896e3bce60efd6769399ea51e613bb654a02ecbf136b456e9340afcf78d9f939999524a5becde388ee3baae87f4d0f33ed11bfb21c820084e96cab6974011c3ebb4aa8656a3c077f7b66d3d2c0f398eeb7ffdeaf9de64ec71a21b7bbef2a7677e3d5fc939203758137a029df87a6810c81f7a1ab2e1150bf66cb30ab935198d3d61184ebb954a1b0b4b4b4bd38f5b4a956dd8c2a5209c17ceab05070d1c990dcddad06cd8b021a22996830fc31c540a240e781cd8dc9916b4dffe8d43662c2d715e6c90df10794b419db8b1945a5e2d758e9485a57b521a05b2bbbb7bab5dc5de299bf4747b66ef948122cb38e42bcf53c86f14bfca966d382d7f2d35b4586a68b1b0d0b2357a634b0dad2695e5cfd675da0f66ab90f4618e9938ea2e4e0c67c8824058407e80c4800ce5b0727e726239433a2c9d1f9d98ce108e90052f4e0d880f90202042406a393e3941394239351d1f9d201d211d1a8e0c677671681687c88217480b880b08101810199019101a10a29c568e2b27079623cb99e5d07288745a3a2e1d1d988e4c872496eaa46310bce2aa0dd10fc80bced5e7327172cc685cadd2e1e089541a1d44ad22f2259a380e5547cf7318721db356e1f0241cc0c485541df6ab2e68c12b7686193588428332c8089ac11862f080ca0ed290e5000753a4dcc0066854a01f61d49b6301022f58d005175b68b102159c20054e50208318800183c11750805cd08257ec0c336a108506659011348331c40837919f54059c5f50598e0508bc6041175c6ca1c50a547082143841810c6200060c065f400172410b5e2127f24f85e15880c00b1674c1c5165aac4005274881131484dd984302302da603b8ea7d142c40107a2233a9e2d903558973072a8e33076a04cead8a80f306ea12e72bea0f670d54089c97d4057c02d500672b6a03ce55d4049c33508338b32abd92ea8027a9489c8afac491d49210b7403df2292a14af407db914b58953a03af128aa8f8fc48012a8e6bc2a55a01e7ea402f9f0960a64c415508178fc56a0f20fa84045fe441250381181022c2001302623cec2e34d54a09823a002f538042ad0e90da840a8cb54209b3b805e891c485429484b4b201e8ea30097c00e446a78e8c1870218c08812061d78007153e407018478f1f143103b1cc00607488e4e0c32cc40430d29551000ecf0d87043000420c4ae0680434f0e43b87fd42e52e94da54054caa3521d2a0fc150b9acfcd328be11950d508f6814bf005548a3f83ed4378adf43e58148ed58a3f843f839f07b7800fc15df562155003500956f43e5a93b1500354855d554ad814f439da1ca5063a83afc1cc6e1dbf00f508360fe817df04b15a2d61c51bd164c9c7e11d57301e7f489a8de13eac1bc3086a85e10a97a310f0d4f563d2adecc33523da146b54c495769a166a3899ad6b52eea365aa8ad74959e751924df0ba3eff826a2604b2fca74a71f1f8aa2288aa228f230964d786290e3388ee3388e5ce989415ab1633f2f585010ecf5d3ac6eb5ab7ddaa75ddd6ad6108da85623a20dc5643321a1992cf6f3820505c15e3f94455bd4457da80f75d116650dd1886a3522da504c3613129ac9623f2f585010ecf5c32c6eb18b7dd8875ddc62d6108da85623a20d4d719c424771df9cf590cdd8ac479fd78923372aef7bf8898793575e9d1d74baf2064105e1ca6b3a99c6f2923dbaa43162114420e10403783471440d140eb0619692245420c1c0052c304505a4a040144c3cd0010eb436c0576880974c80ade00cb009d8a7042418411316411621e00fb8b0601078c102ee82b9e02d580bfee115b00af8049c0276c2286019700c180c86310cbe60284f5ec0402e6801bf62679851038e42032e830c0ee23078063c068bc13c602abc034e8375c032ce01e380a7b01446e3066c039b6ac41d508f1c8acaf223aae94d5499f3a83fce809ac49da84f1c895a3a11b5e54554988b95f498ca2b1a05b2865995742515e6496acba9a8a523a94f1c0335895fa0feb805aacca7a8a64b51594e817ae45154231e53e9aa0262c4ec9c22068ca360e71419d8c0f6ac85e60e83f17e1361ee30ecfd2e02f3300cde6f2b34c55f9c9ff00bde1738bba005ef77ad5515f8b684a69688e2fdcd3577161082b993802c98070138ce5e300bdedf7eb6174d7117ef6f4f68aa01ef6fb02d88a6207025dedf629b6cee3017ef6f3a983bbcc5fb5b1accc35abcbf51a1295ec1fbdb8ca65805ef6f55688a53f0fe26d42a1f6727ef6f57e8466bd5cbfb1b11dddaa05b8d63cd1d07bccf6560ee20f13e5705f3b009ce3eef732d9ae212bccf31a12926c1fb9c8bf3a1291ec1fb9c139ae226ef733fdc8ba6388bf7b92734c521789f83b5cae67d2e68eeb0eb7d8e8cb9c358bccf95c13c0c789f8b425347bccfc568aa88f73934688a88f73959ab6adee7665c159a52c0fb9c50ab78bccf0d7157385aab8c789f239a3ba3f7392a7055e0daa0a91a4d15d1143379bf63752d9a620fbcdf31a129eec0fb9dabf3a129e6c0fb9d139ae2d6fbdd4ff79a3bbc81f7bb16cc1dd6c0fb9d0b988797bcdf3da129b6e2fd0e46534cbcdf8541535cc5fb5d17a32966bddfa141534a64adda61465349a8106a156a68ee606007c9fbdd1298c702ef2968940ddaef6a5d114d89ac56c5b4688a3271b5aac7fb340ae4130f99c71ea01b4a59de63cf91f748005ec1f0c4b7b1278912e9422818d5834d1c0f8c89e3c58073bc30e8c90bf22e50bd58a33c995781eacd1a25444ffd25aa67852ea07ab489d34f40f510503d28704e1f47f5d8a0278f889ebc0354afd6a8cf00f56b71b185162ba85f172aa8df8b9ebe27f573523f285e3e19fd84a8dfac517d0720513f224c9c22708e157a1aa2a72b4445ea576b14c8026d5c5830e088222a4844056b2a0856f0c5a3825b05838c18555006eaa0ab20152605a8a050a3c0217a02aff850411a075a3d6c40034baca882873a72b1eac8a78e7648524754a090d4111913a77faaa31e75446b541f0341b66f81326c7f8a3ae9498a3ae9890223346c8f66b663846c9f0ed93e5fb1cd834a3a53a930e71dd496731ab574d6417de22cab499c73507f9c715065ce53aae98c466539dfa01e39dba01a718e529988d511eb8c3aca80197554450dea68090dea88491975e422a38e7c82eac8491875f433461d3d11a38e60df8a6750810e709612aba4f31915e66c466d39d7a096ce51ea13671ad424ce65d41f6732aacc39a89ace33a82ce731ea91b318d588335035800c2a288b410575004605d38055900a0c2a38fba28255a05450e84905875e50c12b2ea820510b2ad8c6ab82356fc5617822cba092ce31a83067306acb19564b6718d427ce5fd424ce50ea8ff3932a737e41359d5d5059ce2da847ceaf6ac47905f50167155405785141170b2a18822e2a980517156cb245057db4a8a0939f0afe9ca082b0145430c84905a3a0a082b16ec5405e54d2990515e6dc456d3973514be72dea13672d6a12e79ffae3bc822a735641359d535059ce4eea91330aaa116711d4204c503f219ffa11a104f52b0209ea676504f51b6a52bf2b59d48f2804f56be303f5abb92ac8c2a2824b4050c116b7e21380229ba092ce3e15e65c82da7226412d9d47509f3837a9499c45507f9cb3a832e71054d3d95559ce58d42367105423ce56d4cb4ceaf7e381fa69d181fa6dc1397de640fdba68d5efb581fa3db9a27e300dd42f6849fda2d02fd6a83e57513f2a19a8df6c5bf1079854d2d90315e6dc81da72e6402d9d5bf589f3066a12e72bea8fb306aacc7949359dada82ce72aea917306aa1167561dafa426e0492a024e455dc09154091c0375895fa0fab8056a043e456dc02b507fb8141502a74055e251d4cfa751fd98daab09dcfc8aaf60f8e82301953f523d271428e612a8403d1e810a743a042a10ea4f54a0973b518178781315a887df0a54e40fa8400538131548883b20e64bf478034e5722899723b1c319c0c38fe8e10bf0e10a28c08da84bbc1f5a43df0a0918f122c427603c0cb5655ac17022aa14a4154ba01d8e802a0569c712c887ffa82e387e53a1e4f815df0a86d28a39a2b54a87f7bd57abcaf73d58ab7678df0b6a150fef1edef768adf2a1d5aa1f5a05c4fb9fac5545deff68ad0ae24d80f7c157ab0af03e286b9591f7415aab0cd06a9510ad3ac0fb2359ab86789b4e3a41a66cceee149ab44974678d5b2ef6e117c338e8b26cc64234a25aeb52970f7dd120199d09511ad1a5b56eb5ebb64fbf885cef1574bd577780da09513b03d4ce48e50a503902542e88ca15a91b10759bfd5037980f75eb8187da438deaef505b87ea11810d79e5d083c3006a2b6aa9902a805900643704d900e379edf800c0d552d5524435d02034c34c06590c3dcb7901f1c171b5bac340843af9e861132446a7e6c4a396b567a40a5a970ae5f50f71e0c08143bc102ade14964aa5add68ffbc7d787df5f5f92f424de2395a6675fc4971ef6d853622bb6f8908aa4dad9326c9154390b5379134d95264705da51aa9b75a993d670a3b6bed58ee3a847c443918465713c9491d95197c4fc8aaf624a28e378d2691e82630f4d29c3782194a6b295110f96267a9221d5b62e15cacc4b5d0245c7ccc35269e6e3753c1c8d3d3a4a19c899eba86c4bdf68a6243b51a602c53c47fdc4118fc3e5a60ad4fa2aa634354afc8dba04ca782bbc2f7ce10bab1bf77c688ac5094d913f14a6f2c411ff52bf46892d75720ea9d2b19a582c9625592c96fd582c961dcff2301c7b58584ea50e3d890f5b1c4592f8707a1fa97e3664b1a46b90f4f7bb6ca9f7c4837968f478328ed1d3ac0a150fe685e13da1a7162f96de6be28441de9ebd42b186a32a56b17a0f3951acddc34e143f90d4337aea576e4e1c71642bd676d9dbb72f4764fbdfed59bb3e1d664d474476f2e86092b0922d89caa34a48148b208b2f366b30a6fd50211e2301be550d654a0a6d3a6e6b52d8231c81df46ba18f0c1912e9253470a51df41a36346268747ba4960409d7cf4b0a9e1517ea4f086c457c2bc75209c3537fcb17d4a29fd3fce455e4fc662d9b3f0270322cbd2874c7be33a7aa24afaf4203a3a45384bc52d8c19c5a2fb484a245fa3e82495ace88cbcdb8f4ac8b79f27dc1686a5e7becd6f9234b5f2c28b9ea86aae387afa01f29aba735db39c8fdd8ac82bcef00113046d32b412b838992752807532242022f242d6d0ebf342d04a44421766ab243e5af30617d4085a4d24313d10416d85240910a21acb4fe2d1c4f0085b608d239318b848379081ac1492c00b174904042196521522c85a7a44c10933974a842b5e2f3e84308356ab72ec408b56dd6003f65ac524218d80ca6c35690d48928c3c3084da0a8a0c0f5d13dc6d12310a4ef85941e14ad3c8e709b356b94c81044133661aa10d1ac8b82044010b59c727e080175a57f881cf448206ac209b372c89ad3c9127c8739b387c9daf670f5cf3f33571e8bb6e3f4f20378f4a0dcc105ad1af3443d2333658394df05975094546073e772eeda8c5093f2b244972866003d6aa9fa4c4c267d5e56c55121d0f70c112c5d9aa3905272061d6aa7e8bb3553a69642168c5248f25b055128fb69ab486fb6279b60a89157d19232f7de10b5ff8c26a2bbb4c524592edfded9506ade18ae02864f09bde0c4516b7cb48647be3ecb441152cdb1fcd4656a82a66a83f7a4253d3061920b2a328b647af986d9608ec1dc96cffd8a00a19d83baa62fb8e60b6b95f3405636f8761fb23fd8079aad0d4f8ad5484b9c36284c9334507ee884ee05405a0c0a9d11438154a4181f7bb2d702a8af73b2f706a02ef7b5570eac8fbde159c82e27daf039c92c0fb1e08381581f7bd2c380581f73d1270ea89f7bd1370ca89f73d1570aa89f7bd2d3875dff7bce0d403def75cc02997f7bd2f38f5f2be17034eb5bcef8dc15e19ec99c13c7c269650e20d40e2491ca1802fa008229e80218e00218cdc000528f2c381e8e13ef0a0c3909e015801dcc00300550d33c490837383f261c3a3eed0218323e6b355dc611e52f19216f89d35267e99b5c42fb794f8651712bfec73c42fff28e0975f45fc328c885f0e1ae2976342fcb2ccc82fcf08f0cb42433ffc32ad875f26aa11f9a5ac1c7e690b875fea5afd521f21bff42700bff465c32f85edfcd2a020bf3496faa5b29990ce2f1da2fdf8a544b5d36fb37afc76cbe5f333f3dbb01cbf1d64faedd88ddf9671bf3df344b0d49163053e0f0303918153527c3ec5290a7c7e8753517c3e009c9ac0e7579c3af2f91c3805c5e777e094043eff03a722f07902700a029f1782534f7c9e084e39f1790570aa89cf23c1a9fbf92538f580cf5f4eb97c1e029c7af9fc114eb57c5e0ae6a19f2c2c2c2c2cdbb6bd548f1c89e2b32c8f82b4536c64ed16cc8632ae3173fa601da3304ffd7ed17e4253e0dc11df1f03b56b8da2efaa47a5875a4f36718ae8896e2c4b3756d7beafe432c8cf632e6fbeb879dd7c31e76360495889d72d2bf841d00e9c58d1c67c074c6c0d764e49a34a0ee49c9206131bdaed2d9f3597f4b355d44fb755ef22e76d5b1905b5e2573621fe06b537be8d3c88bff1ea71dc8d1be738ef73f441fc8d0ba1541c7d1f7ddcf551b31d278adf686afc578e230fa38be310f0df3bd40f4d79817a7d755aa1a79190f7ee5f054b171fdaef9bf87dbb108af28279c27ff4c608c44b79a9e50e535e7ae3bb71a3e46efcdeb8f1bd3c2cc326c473df1c634a1eb86fa5109ac30302c97da54c78efdd6d19575e1db673406ce7ba7fdcbf12ace23824e6c6c31108b12b95b87b315dedca1bc5f6718f39d895ba8ebbc73dc61b7195b361e54e1445f136d421b437c4cfab1be92f75bc4b0dff91e7caf2904570ebadf41bc576a3d89c68c24379c13cf72d6f09ff7d65587e5c77b1bc3c7d104b9417e5e5ad94f1ce3decee1e1048f1dc4767214ba5370ed9de84585eee462044bbdd91d058b7adbc1350321a8dce8d3d23707eddb580dd2e06ec76ce6eef80e0ec762194b373d421b45d49a24ac66eb9d2426da587fa8a9df4fbfd4412e420123cbde781f57a6f4f89f54a9417ed31ad42515151515151515151515151515151515151515151515151515151515151515151515191a723b6d0893c8b0bb885df27d7429df77da391f7d3f4e5f7f07bbfe7fbb63ec2fdfc34eac8f6db557a88a77f5b0d294820d8d942dfbbdad9ede1886d7f950bab783ff4c7d2cd8e2ab885dc27b475d4869dc37595ed08e4be12c8f3bcf9d10f90f783d9c9434973a1175e547c03ab15494f0ff7397217d2e7532c684ff7908ab4bb790ac975764242434394e87a2fefd5ec05792f2f8c9e4d0b7a5d9648a0f4917c073def5d1a1921013f2ae7aacbeb83c87e07dff75e34d5d38bd2bd3c98a5f768ad673455a5675c206b4f5e3a3e27d75becbd2c7dd8359dbc91ee14d6e39f8e824294a6e837d3b49bd8f31351afae674379c139e7987ae00708b971ede68bcd2b79a0e7953a8f1c752de40824df5247e437baf9a254fa68f49683f56e16dc7ef38479c86f1bf9efa61a79f3c5cdebe68b0d1c7bb6cd454fdd849e7af3a982ab0d9ada3adb2c2c2ca4b731a784c91f696a587ef839f9e21a6d7b8d5683da266ad5dc616bb24d9b3b935ba3444faa97b4e1c77a4d367c589a487aba09e3dec06ebef8c49bd7cd1737b0ee66c88637af9b2fbcb1873fb10ae40dccbb816d24875f3499c988643359ccead83945f6011bb6188ece7c1616cf2bef88f282548108adc7c232edb89de9267e34c5f6bbe2c9d1b73a8e2de7968325d259581eb2bc85858791656179f7af87fa0a4905922b91b835c8915eacdf8812a15e5608edb7e7a1bc7328211ba27e686af24ccbddd8c3218b1b154814d75b2903897ad9260abb83f1e4a21cfcd83e1b39a8c2b6176cbb1a07b596952b424c999f744d361329c68036a5e416bd75530142141ca0e05d93293858b271dbf6644a17c8275ad8a6b041e553629dd77551b62752d27832a5458a85b3e69ec89e9887cccc94d2668ee38de3388e378ee3388e7b7a09d9bd4daef3622adb7047c87922698482b160a3e0ced61b79f0ec3f3f037906c8cd4437691cc759dac68c8cc747447dcd8528cfa3a4024ac942d4bc7c5952315754d4d77c2b658cd4d7bc9635b34675f73e333f94798e3970a77918863d03e3a2a73906b1835daa69280c39718e43688690fc30aeba630765b9c0b456b76636c7976ceeccbca3a7ee6c67ca39711ef31df54ef1639df086666eaa47d8c6fc75ae68ea8d79cd8c5a21899888d09434cfb9929589a69421a2e6f546783ca7440285e6a692e63352731ee7e1c2a6c3b49ae62e65148ed59435af46753795d7443ec764e25192654953de8fe2a8b162bbd3239035425d33aba942533b5e03e32a134e8c34df519da027265e64b6ab8935a1a8ee3425b715935633a3a991edeee9c7762fdb5d02ad2a79706d505429965c8bf1862c6d153be10d71dc9907247721cdbd70445690ffd8c85f4b242f2b8ba4ed6ea3948673fcd87d846d9d0f92ab71455c1b5ccde3485cad63bdf40847eba3deff1cd9ece520125925b429ff852491a77d6d6c37fa159194454f1dd76a5e64499c36145fe78a2e81e488605a73876d57336329645711f492d1145b8e68bc325a19abd86ea462bbbee38bc757abe8122eaad1536780bc33b29a19118e6b64c7fda0a78e22817c393d02d7bd6636e620daf1459303c785d02197d397781f9ac9f4d9261e3da8d0d4ccac553530aefa5998263333a138f6cccc70a3d71c1e9c8f5faec1b84e15c62787f419f34953ca70dfecf8adfc676d624a19aee458f81919f726ebfd4f48f251ef6d8f170fb1cbc5068ed2a5bc6ca586836a5e546c38e8a5ac794dd9a9550f5938a64e3bbe605a33962b9b455e8ec82434776cdedd1d7687c9eed8f1d91d9f53c544a3baefe072ccb8bc3b8ccfdcc1f1ee4c6ce5a4d1499b34513c47f405b24528c451698e5a3a57415b33ab99d5cc6a66f4386aea2e75fb4c8d395743cb2e1cbf1f39c3ae9a178ef27e2ee5257d7ca6bc26aebc3baa70e77108b5acc644712782e5fe52de4f0996eb352c771f651359ee64797794aa484fdc53959c38dc69edd9c4e16a5686aed85476f58e1d2693f85b339ba92e15471d83264ed7a30e375fd01a13727dc5ca501bdd865039be780a69aa6c6764ffec0c159a32bd9bb6c710d1729f16a64543a382695154779a87d40b24cd8c8ca644d18eec7d5a55dfa1743ed37d4668ee901c8baddccf95a618919c385c72148e311a94c6d0980ba1748b618ee9c68fa11cc73195968c0647a1a78e63f4d455e12af4f4a229d1745365dba3b245d5fb1fdb9da61ed974ea65a997651c5f976547bdad8665218e425544b80d920dbe62bbcf96f2b215db7d46f6622f07895d204fb69ba1a8ee1d498b48133d757fa1a7ee243d75bf930be48c8c4baef6f134e5ed9aa539f3286b6aea5fd67a1e21c8a3ac9964113d752c7aeac8dac4e91ece40c2e8a99342e6f81c6d6ceaf8da7103db719b7a95589bd32d90a4dac6658caf96e57aece8b1e342daa6b4a324c7174dd9bc3b599b3bf4ddc9221656abfe4ec7492d4c1e7e17537b49fd7ef60566e3c2a0a91e73c7c73b8e2855d6cea839e73ac3658841878647f1d91a605a8dea64ce90a1ead4a0733e0d3a349432903a34e8d0e89456e68469b5aa693497d1a96d659e62a8527c5686b285e689e63975490fe5c8505ba8862ac5676928bb0a0db5ab4c1c9acf40f356438618745aa85134cfa93db3a9d39e616ff4a833547cd499d9c4e15eebe95c7fdca6b2fdcda3f82c0ca8efc079149f05728e28bca9a8d3da590f0824ea7c1cd4c371ecc12965205138285449f339236bd569a268ded1dce5a83a334f3054293e7b539ae689e6a7bae433069a5b9184b53afda69a8054293e8b53becc13cdc30da7be4c1c9affa039cbcca179c8dd54a01f860ad4fa563feaa5a951343f551a72e2d03c4728723c6a5201cb1d86c9d803e3a2a74e06a6c5a2cdcbdabc47bd4a6c8fcfb1a7c77f252b8e8dd4bf4402858fe4afa58f9a919ad7d712497d4da964c52527e6a05a20ff4a7e46c6f23bbe6684e8a99b99d153951a79c757ad32dc6b5efe55862b6582a8ff85285ff3bf7e56d6ca3b2e84863bce7547e52092eb4502bba4dd7cd89c562596ab4ef4ccfa28515e708ecdb77a7d0c599b0be91e758e3d364268cb615a34b5bd3b0c1318174c139adaf1ee353c2dd3dce55cdd5167a8d013cd8ecaed383d8f7447dde88986e636684117770a9b0532c76dc26db3a922f7f1093d756318a508daf1454fdd855098d6f88269e520da19193d75a75820cf6d1b7705b2f426433d5cd9b5e8a91b5fb60d522604924ff3d9faaae6223dd190b556d51dbfa48d898999317d84b5aae6ddc7174df118d42a1eef4cf6d52a0e6a5477724779c920db9dd6bc6c1796f5e751eb4c95192a33b3f0a505474d771e7546a851ddcb6aa21f70a97fe5ae0f227ba3d8ecc6edf88e1d0f29a594dbc26da3df712194ca706d5c25e0d8c39d236a15d7bee6882ed7ba532b90e188430249cad19d7c383ee11959abd8c5aeee3e2bdecf92a4935408b9edc321522490a4d32390aa1959a3e812db3d9ca15205b2748f7ce1222a905c1786a370048a9f48e24a9a0a5e47bd0d84997a5958b6bb4cbd5f8e7a3f1c33b2fb981bf58230f58e645c1697edee52efd702d3b2dd59ea7d29d52bdaf0a47ac5b16bdc84aae6aa135db67b58bf0ade9a9925891f4dc930b7854d3dee94bb0ca5fc99ee3323a8d9ee33dd752ca1aa9ad8cc08846c3723b39dbd33339aed66886c375364bb1921db9d3237be68ea6e309aba5f8ca6ae383ea1a917db7d0cb2770ce386bd2ff6ce74224d753f11759c12531256c2207bc009218f3db1180cf6f3f384e49e90f487fed068b05a8d7b127ed3ce3187d90585343563738c7c2a0592f60c89b00464bb84e80f8d61b52e0189289c3577147225774411449c798893c21e5e6784594a925081040317b0c014159082025130f100922b58034b26c05654c11930814f18416dd4f8dd629ec252180dbe01db800117427bd42550461f8306003ba78c0103cbfff8207fc43c0c3b5fe493fc9728ce3fbf867f6ad5cdf93a34c52d88c0f9415a05c3f942e6ce12e7dbb9b380f357cc9380f371a0290440a001e717699501ce1f82a69438bf089ac271fe11ad0ae27c26f84ef025d0aa1fce9f62ee7017e75b807f01e691c0f948680a864de7039ccf2e9a92399f9bf0d9a7553ecee71f9abae773177c7eb5eae57c86cd1d56c1f90cc6dce1149ccf31601e76722e9dcf413475e47c8e42534f9ccfb15609713ecb682a89f3990a4d41712e723e0bf1d90a9f875a559ecf343eafc16728f0990d3e13f1b90d3ed75a65733e65f1e9129a62399fb65ac5e37ceae2d3267cead32a23cea73f738743703ed5824fb7601ec6e27cda054d31e07cfaa2a923cea74f68aa88f329ac5505389f06f169143e8db5ca87f3a98c4fa9f0e9ac553d9c4f85e60eb7cea744e0d322300f6be07c6a854f8768ea01e7d32b7c4a6b150fe753223e6d834f6baddae1fc66d19492f37b094d2539eafc76cd1d24e77708e60e15e77716cc8381f3bb094d59e0fcf6a1a929ce6f273425c5f9fdd3aad39902e7f79398f33b88a6c4f33b4aac553dcea75120890849e04644f7063722b818800183c1174fa290d113959beacd5a1001189658830dda80eab5e129513f1cf50ba27ead467daeafc90ff5f3f999385a68e1838a0a52e0a4543f2bf41ba2df9524ea4704b2c02565055ba00b0c019805d804f4019d8c000c924d1c1d50a1a7990738b0010d2cb1c287a52409154830608129a4a0c028521dd4071c0b1078c1822eb8d8428b15a8e0042970820219c4000c180cbe800214a8dea8f40a56ad93410a9142330200000000a315003030140e0945c3a128ce3259f70114800e80c668704694263992a428a49441061000060800c0000041103600a0f4d01e59f979184a7b628dd05d4f08a2ebfe4cea674702fe20de00abc5da6f53da69e8916716621fbe4875582dd4d016c104534f08104e1e279697ec63db490c73a917ca8382a157798b058c62302cb6a7feeb6f8f422ff8826be33be5882705ddc09521e86714c19b0a7a2869c02276dfce1193c69b7b27f2fe2c8c920a2209e9fc87aa9a63a5c5447495b7df2b9c85a5b2f4c9c8b6e90f56f9a85f1b3b913df0682aa9f3b64fb8e3410ec6690d4fe0adc2d6749858a53feaa57675b1eb0fbca3abd96053639c011ec14ce2e9e8eacf7a79b752c25df53d3a9552c928c06d740672ed255d45b6a2402c5d62d1506569963360ba66d928cf7b68573402e86b62a38f5415ef83872fa01fc2666632003a1492493399f49229895782d0f8500bf156fc74c273b64cdae35b495085e830ed01c277dd3fbdb98e1f97738973059b5223b57ac56054938276fb53e6567753bf63f26fcb7898293700cc5f70dac2b97b0be7d2d947399364236d67ac16eef99d425f110c23bbc5524c3dcfa7ea5bbe53c43bd49dd2c61e3df5b1d077fe071563ffb3435dfa0a8461f21a8763ac6874dc15f1ba697fd602d9b1e512a90bd02c94c1b2570f24bd03a58bb0ee8b464eebde5a140773d6634ab9ffe56af9650bfdda1451b54c7426806ed4ac0e8c5f95320b958b2ce6ecf06a64c026ed95c1422f027e36276429424e647686a355e3c12644e4d9711591150a9021d367e77ead71edbe9f0440201ccb93993d4e57c4f26cea2a8fab6d4c312e79b8e550996f521861101589a3585a86412c29c907539557ee6204508ead9e58640ee66a5112db290a268b03c46a1cc6051268c6627222f90adb60babd15006daa51248c441f9445b5d141ce1d098589530beca58938882941d15f9b60cbb41a33d69bd765138829e298a6efa372ae3af1891e146313fd7a9a83be82c2855a473ed21cb589a588d4f4dedf47cc2b5de51851e0e36ed1f95b7395b69c0b3d6773585c16a763be287f3691485a13ff59594aa840f10d1c530f2fa5ae34ab9c7b81c82a05e05ad32d02f433147fc182c4587e6eda5321997b38ab19b57752d15acbd52ad540b99a6a4a9209101c8137063ebfc99c3b8138778b41cfeb891c0c530643440514fa9167ec9f75e9ce415b1d35d6ba698afdececa58e912d7e97538d3a1713ad7e78ea0d1da0e19bc712530e0ecd207bf83fa0f0c2225a0336d155800aee6cd4fb05ca63c45c518cd2a7d93db9ddfda686b0cb96f0195324a50179cb345b99071adf3fd343960a8bef1d435c3d27c8fd7a001a195fc8f037805880cd2e5107262a94a875e180fe20e83aff74a0780ef8a703c45b8ad2fe7710114a091075ff3b8c38a51d562407fdd701222971b812b35f2686d83415bbd0a263b801176c6f47dfbf0bf82fe921821087f7a2b4c38b089ff90b156578d10d6dbec1c0d6e791d61620a08856e01c2fd07b05ad683d79619ce5bbf32b7dcde83a1c7212c18811276225793ceb410b0ca034c28bb54168cfb860805a8b0d58d74b08d74873ed62e668742d1a8131b3a4793107b9fbe90bd1c24e1455e74d8e79fd75acc3b0bb3454d42456500c58411fd82ae8c7c8d3f828b82dced534425241fef47d8b917eaebea0571962621e8609de09931c94a4160d2d34da3d3e8de549cacc6b4435790f7350845df1f867941c8fc38b3ad428f4f5b6a20d8a62fcc00fd4715a2d70051814ca09f909761bdd2b602e0aad55958655ec14a10c1b4c9ebed7211ae67c623229286094b178588609beeee7374134aaabe8453fec55119492cbfae70c35bdf1e95a6d978edca5074b32001f2c826d244e0d5c2616943e38953a8352d4ada0b1d9bd4deb58f3a115a3a42a0daaa8a842dcb4611c6f0e8cb074176aaa5cf698fbd8e46924051f1a70214fa7a2598cedfca58475e043142076b09ac55be6b2cf8ef5d26491991fd62459e82e91bcdd3b0652e66d4ba0d112b30e0a40a35c584beb1ccf040f91978b6284f31056e90586c0f6344a7c44d29c27e20690bd0184c8f6bebfd35217d21e3dbaf48a787ba678303ff82b014f4cfe681472e6cf14492508abee13f2bd828f13d06432d6b7d40b325dc2e0fe1caf424c419e2123d5467f26c163c9c7f506fd15ad0a5df8acdfa032d2b91202afd36716ac2bf0c860390dced6496ba82cb3d96d7b426058a832eddf8eadebaa27a72b74d1258ca82693305a48dad85ad4057cf0a563e5ea6422aef260093cdc13e758276bb759592f1a23356305e62e9598c455a16a50e314e6a1a14695cc4509a472a47561c224d3fa9412d41b3252626dd09f387ad9ab80db3c20d52781e63b025448d342c80decc96789435e46304797aa794f3322bd22057674a378428d426d31a7057848a71e08a9b252a18ca81d268b84270c1c0a2e8596c5d579c87f402fd071b374f990b728d216feb08d6668f215563726e20d749d3c1c2c9aac9557ce22bc9f8b893122bac6988a14454ae0a5b3234e9690509f6a45a8f6509561e39f28527b3fda3b4607dc77de50758db9aaf16f5e643e5d1466fa2999b442f93182c81b3d27d3794d0fff30a4c37ba520a65d187d091621660e6977d63d00208264afff6008d4a8141c49e431000826f96f3087ba54fb15f6a9775ceb8556a90c78f5eb50219ee5e8913c509992a88332e539389c3868bf385afcbdf08e6e41b9158fde80ea963c32401364cbd991c57c0ff6e088da4807519fffb90e6d0b9b987544419a2e02ee1c5c47d9f8b23a934779fc1a365b1a8864fff36231c9b503793cd023b3709074e390c01a2c1b7d51a54a20e25bb4d66cfb72c6631ccd2ea434a254ba6f9b92bae94630679fd02fde144e286b8f8a4362d1029d3e2fb80a073a369e6f4edb3d49731f69d406bf0e74a054911580d7cb450938da8be3016f938f40ac1acff20138e6a3847b1661892619439d792fa596596d8a868536a5e15464ef31dbe43d14a06de6ab4fef60444c7c84b7d0ba4d0e9533269b42ffe59718253d0e4fb0f0a0cdc97529c500f18502f32eb337c1df606a4801b6a8450ddceead9174432b8660ca80b8e230d566a8fe0ae6d9ea790dd0b67562ffae975d6828ad7d2581d88e136f630035bf30685b12e8a0026cf5942ab3104bd152582fd702e2f810a70705b6718f2fa755e5a593b3236f2c926ce6bc580471fc20e183a62d77025f13a88c5e8c2b87bcdde0c96900ab0db29403cba483295f5374fb4558b286bf5b4b6e9afb4d75d8d659fe2e34bcb6d06900000f92f079d87bc739181b9ee5bdaee1796ff41281feb5adc2bfb639f4321c4bacfdb6c017c6b121097f9927b3acbd24403a61e7603e06b494e060040695706d8307083bcd27a6c4c4c9ecb4097e485eea22ff57182cf1fbdc0d464eaf5ea204470a8451b21418733176d3352583962a4ec5520139408008e1d5c6d1e21a309efdebc37d147e07d24f31ea6794cc4917eda9fc4b084b272c0ec475a87e0bd1d35a975154640ece35e87f49491cbf62a46abbc9d9e4bb625075c801b916edff7421159a5dc4552bbd0d5ddd8bf9ec6b8c9e7f58b5d0ab3f78b28b01d748c85dbb5e9ffba1fd3c235e1783043ae577d6463b48f9a473b89ae3815c44850eedbd60734652fe8c002031d97eb1b4f6ced16bf1f39803c92ab9cd729e86fae3b1e64e1209fd33def8e40fa00c49141ca19f4df2af72889d1e008b79907ca44ef36d96a27fbdb61e0ae8df7733745602f0341a12bc5ed08b581199ec6b42cb086d0a1420676877f36cfafabc739bb8ebcd81530217360ea7b0914291976c1ccb2a655c8cea526306408ad86c664cf9c216cec0e2e9cc832dbb48126550912eec17dbabe10603b196275442db8a93e67ce9b068b82eaa1ea9b41e3f0d89e9c61781287c01f737227abd046605f052fe14561d12131bbef4378d447c695afa872c8b7e91314786f76466331b32cb8058b4d2536bcac6372699a54af96f55891db6dbd98b157ae02acbbcf13f3beef970e8de76a09dca64d771c86a5a35f4004a017199ca347411f9b807fa0cd449b38be75392aa10a8584994c40f2374fc7f8edbd5a521188fc39f2b06705851b3f8259133e023469f8054882b0221a6364f0a32c788038bfeafa5b60b800cfe52017f9eeea5cd2c0fb7b9be03f345e1b5cd805da071d2212c8d016a51aac2f9d488e60c0297282ee94c1bec64e9cc5998355b2e7bbd0080a8b20168e18355180b4b993ededbe2838c8005744629f61338f42e55bc62b2b76afc506d9d141dd5c11e28de96df07820fd71d9e7dd17344a6656eaf195d87b322c400b71f21b644ad9addca562646fd0eb81a844ff85b6c4866345084b97da123d0e635ff1f7da206c5240b0247147b4791580bfb7dea1a7d0503cf7785303cd5aab978f73b0dde8ca07c20252d0d932f34545fe6989098c35b8675d80f2a31bde1a78676c1575c9e6fdc06f813816716c4053a216313d14f21a0122355627edca002935b8f98109b773b9e44bdc47c0a9d351931f970680a50d4465314a74898dc7cee86a8abb485e36f46f6f8c00d9f1e9992d41c9667d876ae4f5a507f148c190c2da0a8dba2aa9f5efb714f4b930d6d26943d3636015e38ba69dc1b50720c227996b08e0aafc2fa74387e5e50eaf7f982aa52c29173476643631dddf7e6bf9d3882a87862b8aa7445be78713ca1d8e7f8c515c2b7a3b8dafe008a2c0e065d60b4858e0ae893792ba1b03e78d25fcd046cc7277472ab5a2153cb911c6400a5e1dbbadaf4692bf5e1883811be39f8c20a529bae67b53b4c3a9a0059809840fd43a4b7eadd6041a4355d8522558988c442fc8a67b72a6c5419a5f7a01ed7e0a37dd52fbdb6d44d4f26a90ff9251aa3d8fbdd99efb265544ef75e22c82e9c8d7a7e8fd221060243fdd989a5311994bd1fc475b0121b0543e9fe370573873d9593a299c1677456a634462986cab6094a88660d0b3f6f851262d2fe917c1fd48b32d86a452f9cf8fff0699809a5683f4be099bb84e080b100c1fb402067025827110f97588b0398b946090db799e198bc625f593e24a29f25387fb051514935b40ca5709fecf4f8b378040bfd80170c323402dc8c1a1627dbe18f66cb110a602578899bed47ce7113d265e27936b6ff988a679be48168cba4c731a56831b08a23ce05d2d8b3ca830ec855f90966f005573b014c5e78fdaa29371a405ef829fadecac8f467820b911eb000ffb9dafc6d1130bfbfdb87a68308eaee4362ea406662a3ab17c1d0349d1589b4554d0760faaf39b2493914097d34a5b4a2472f31852cf1b14dcc4062a3d312552d1d4805114015096b41ef4d680be8295999c489ded77f4e24aa9fc821c19cae872f1a2cef2682ef5f356c8a41d6227707e223c70a52a302d25e57e15aa2f9115ca2fa4afde266e152ad380afb43c305bb5318d7880b008c0926b3f4be08fff29fb497ae5692f0100060b2a68b4ca4c9088fcb38e6ade7b7a08b2990d4abb7c2b55c8c27e8505caae0b03bfc743313e7c2438805f7b2f8a80c9105eb4615e4940ae0d38c3e4b7547c3c035971e4d34adbfe8fb97473ed66fd46e156cbfd1146c4c6e226df4ce6ef0ced90fb008290de50c1044b0aad098d547c8136542263e64e624d2757bf648b083c0681d224e169ce5a4ee72681c34306d30b4ba7089b7dc925b7797b02c6b60050a37629039162f31f70b77dea20a827793d7ac423c42ea5a034692d1983e4a1c9c1b825e2cde4c2ec832afe1a0073d5882d60c50f5b73dc24803683815a816a852bfda6351c919ccd152ab685fd968e1c22eca9e11f71a99d1e35169101ef49bbe3ca60a7c046531d4c3fc342b9de532ca74729329a73049e75cba48033ded12bb004fcd07f56402b7cea2b782df4e20be026471ea9a31c2abf555eae6fdd3895731bcb0beb9956902906538cadbe3f25d94ad61c11499c08a9ecad3be864bb90fd4529ffead4722040473ce9c7942bbab0f49ca22f5a3e012203234b07a0c60f25a074dcf070a3b669036b8a2862d29cce24495ac7192725c7aa2625e0f0647a494960c5fe66055aa800526d91c9612259a40041d784cb6a87a5e3ccab2429fa8f01e12421366de575b3374a0d62c7a68494fe1795087948a965178ac89cde0aca2219035115893f7c17f150aa7b14c672c08749f918f12ec0b6a885f1c8104a1db8263165f79a66b3a41ee0a34529bc9eabf6a79b0615085460adffe4409550e40aa846a9dc5838bb145cc8b3e0373ae58fd1983860842cdab2a2818ca47ea5bdd8fe62c641221711c44638cbe84a7f1acdcacc5fdfa31b1d60551a99473df5d0f00c8c29580d326bca1cf872b84bb585caeda197b8aff86320a96c5ebec7042f260a6e27677afb05509b83b6f61058f0ff9b81b5e3b7027cfb8042c1b70b75adeb2712f2eebb9b1e2688231965d05032e40ef7d28ab97e4c2f4315890d27cefc236ea1ee48ea7c7f9c6b0fc7283871b0a16c0e3206720eee9cd9e735d7049bb1aeb208db1d8c1b4b34d64ba41ff8693915b496f9b0c27a63a24833af554bc9c1da244c0f047b179cc85a4fbb9092e7d014abcdbd86842161f0d46308d305d296a1d46de9d1552535c8ddff8df183beefd1cfbd1bd694c8d28acbab657bf52d246372a0c87b7a2bbb9cc02c4b84562ab9040d0f597fc2f556e7dc72155cc82c17996c57d3de12b06b05ec47e9da9ea3c10344956d8465030fc3d4e4232df8d6d64f4d99ea490562c84178c49b945c69c8e51c3859e32cbfc8ed9bcc6eb71e6b10db46a9324457229e5014df1af0e3bdc05a9c733703d1b6907c5b265ecadb7618c3415113b04c65534b15f434e1181eb2aaf62923b27429dc92766292e14e95e78691fe92e712ef341d71340f71e6cb192c85ea3371185271bf45ee57306cf0edbe2b83afc4baf235f2344b4e742088d9708b710d1b15c8c388c3427b10a2178a20bd413677c2a14e6dff51b54b804c52a24de5811633430ce7d292faaf6e47dccee29dba9677986ce58451a7d5fcce5872267625972128eec6e60186bfb69992164f2e5a91759109277b8c8e795d99537f463be852e2a9f19f59845b803a67fc16309adb3ddfb835a8cf2bfa1f6527dde6a7b33a42108459b255b6b1855a5ff057fe993d0d2028f9c2016b900bb0b52758a62a57dcb477f4faad8b26918895b33f49f9d776ea94d0952c360658835fc64d942d3f5887ea09906fa702e479548374dcffc780aacb31483234f2a482d4f870860b9ffdadd0e0a1a0c9d9250bce70339b7219a7247db1fee6eaccb853798cb4ab4f278697b2286473eb916b9dc3a4f880792346f307b605ba870a9d44385081d410625da6ba2f598c53388c54942ee2f0206a731aac2efbe65833e1fbdeaf7134e660b21f1d85c1ede0c1a93593fa4a9909146878c838f6902fe8d8ff43b16655f51200c0371678ae8e12b615a6f4aaa3b9f98a9fe4466b186b820d05b773aed7d9ee6f0b7f45d16e0e3f55ba7d88e3c52911fcf1a689f2c1ebe3f0bd5be33c9600c5dc8b67c234886d739e671ed8f71f0a6e0a37236230f45d993c4f88f8f631f964d11c5bfd3a7ed688bdaef416d13c71cbcd87c7f80ed357846cc7f1a7546d8a09e306598e87b15616a3cf13568c79e859884119c45f285e25ef7bc46485473894a2338fe26344510d5a5bba8f8982df81bebae09aa38cbf2b57783c7fc0608ab6988d437946e9c4ae8bf1790aaa82aee8b21f8351313df90045b809e34c0b48dc72499b0a3aec6ca8ea9d4594df7678975d80ccac5241569f01f7bc708f0321009ff9b93a0cdd511770ae088ed26e48bf3422fc753b6dca785bfe61d9de957dfbc1dc6a2c5346f5f943ca35a05e7db028ca3b58d979640b0f6489585243c432b803df2e23686ba91515adfc685f33b7622cc210e7e9d37b10cad945982668115901dfc06ab3a5570b3977579e5cf4c19825c3632ea9a0922ef74b5937a7cc04a27a50e659d0a658eb8e7167f7da9694066d15a5859acdfdf6463e7396d1dd05bbdece5d320ae2564ee5fd8b8dfca48bd2f15c28fbd4ba64b3cf781536ab325c6c52530b7611de849d9329ce54d45e437e07d817838c562eed1e70f3bc95bdcb7bd356abd6c394907d070c9aa52692f42d4b054d2775c6423b38f30e8c2c7cbebb1c608aa6f67fb1a8200e75e8aa11eef42f784f2a4a2664cf7c9248d311a440556f18cd236a271e1630f9fd8ec294bc7b19638119f8299d160dee84f62ea2fd6455641a25fd8114b18a19e6bc731c97f74b2324706916a86f205f5e98a32dec4fe9c50dbe7167af54f036865997a9f6680e64528e74037ea7dd6607a097711bfd333e1ee8d99f2faa8b7b91a9f2b8ce8b2d301a655e7ef377aefb2c4a496412169c4a8500d3b56995b39ae36dd200d79d7f77d7705ea0d1ea2e666a963729e5e928cc65cc75e67e6829415c442c0be965853477f23d9921bd0a7aaa2f6bb918025b7bb7d1d598c451062fa54cba611428b696967878e2e307d413848e5e6c8ad635031d0b1facd69b76407a704d3c9f6dad3c0f6b383393d9f05a630d81bdda9720f327df1f32430cfde3f542d5ae1f2a5088c3d6d0c065d48936921e30f56d357fab488c4d1b6ec9e9af2ed79928b1ef14cd40874f06b652a4d289dc2e5e9f46365e20f08bf2e57a04287cd1d8417b3ad2dd43510bf3ba881cb86c28f69af147741e91ad42aaf25ea536577e462758e89e58a23205f7f0f3dcf845e2863494f72f79aae0254a58553b82f3214e64718bfcbd5b731861a6496d0eb6285faf7d26cd3a4951fd503f950f6c3de37c5affed2c3e8e4b8b0681628e76f59754daa5cffd6a4fe7f35df71af3daa4cff79ffcb179a02202331657cfdfa3773720e2dd25ac7df72e96cffb546fd7d84307fb7928e00fefdb4907d42667dab7ffaeff4f9b66cf99cf8f8c935f87788f7273bf73d851bb081ed79592d2d5738c7833df6613d3f494b8a927a58e1cc8ddc214d3fcd428f4a9e070999cf1dd9819b2a7fa6a201f44e1e276b608e956904613c3c715788670ade36ab089f4c060fa57f477978e8dec2e0cef1be7d9aad1d4dc80e0ac59eb3747d0360fdfce460bb9ef1863aefd30547ba61a2eb827ef8eb20551d1ad2994c69792667277b1d5b98abb74338a6ea9fa742a4aa9d104915cfa60a5957096b4e1a2e5725ec37ac38ff2910b3fb2ccc0a1764dc7db14e6887ace3f1273c64d655e20ab2dffb8296af0c30ecbffe21db4ffb01bdbf1b56ae369a4b3fb54cc58971af93619363d1d80ac90dae02d89ec29baaf7d7e3f8d6efd09b86277c7ec7f182f71b9ef7926f42037c99c18e87e191f32f058eaeceb0a2d12774ff63ced2f79f96f595cd61221ed8c84d626138ca3f4f9e5659b44133bc86eac7e4b1eaadb3cc138e455b2ac80ffef178faed7726181ebe3bd566873ede79389e860ccf8462e548b269a18734d3b94a5dc68f8143d07f9ed729dc6e673df1a04844cf14b3038b3cb219748f13e30b4c8507a796743be78ca4582aa4e71dc05f2e709ee4f2109f235bed803c3f6b1b3da2f8129134a127482ec7e4359e87849f6c8e9f8c9137c921da812e913fb57d9e0bc7d32b296b7e6de593e648178b74c5cc30429e07df856c2bdb876879a5e36bdfee43b02db721d857f72c2cd6c58ceddd3d0bb6ed3204fb7219e2d5be1b81b5b833f8bdc7e03711e894d37099e5905ba91b315017eb002efa458cd49d3d030b7d21036a679de045f9dd88fb691cbd48775b1e7ccb6619804dbf9011b5b06660a1eec488dafb03815f2a1ed4185ad48b18a88b7d00376d0c0aa5606d15b624e0603114c28da307a277ae3b0143ae4004a29fd7dd9a447e4ced4a4a6aaf3351636ebbbcd15108a08880b6cd30110828525173000e79c09b17884e273a31902622c80ba8893c5de054424e29f89568c6a0eb57e62ab769c3a60ddbb66ddbb66ddb465b5b6d6cb4b1ddc6461bdb6ddab66dd3864d1bb6b5393252ce8c4e220e7183db134f720e7352ecde8a9d03857a0453c9005339158dc2a11ab9cd4604d0c62f274b42b251f375a3a1e28be83d5c64507a11c3bb22da990d0cfd15110e5188646e2322a97b08d35c87240745448e54083fa3bebcd20a01f38a907d164b1cbb95006e45d2baf476de669c0e3e269c919c56c71b5120c1d362c16fecff88ed665a929a3f32401146de72ddbe7c8caf68c9a49ae4a1a43622a6c04a69d9c7b550ea70cc54e5a3561bdb94602ac6e4d6380de3182eee872416ed03a10a4058823217733fe492cc790d7aac68b8b548d691a09e696f85910a44689c622e4e263047bcea5fb48e7b4e46e6f323e4df36b35ebe6adb59b9be562927be0044e178fd32d5228fe989adc53e88e29c3281f5ee31eed32ff4257828805412f5491ca3e891e1858755e10adf7d922c3983fbe4f5ab1886851e63402df3e90b854729d6b3662df839274f0f2504355daa01d163049658a37416586709f839a7a7444916b0660df839e7a74789acb0ca02c813e74f0da50665baaa395163039658446996b06409e829a7a7474996b06609f833e74f4589acb0c80ac813e74f05a50a3abaa83111c500f658444956b06405f8093a79b57ddaa7e51648f6bae69aeefa165d8e7cfec2a7dc7aad7711b0f2333ee2d0dc442addc294dc890bc5656ea8ab070d967aca61103766a3ffa95d52c865832337aa5b6ec43f9faab0bbd1240a444cbd182149b5d77ebd8348f9f84b63ccc49b68e91d5a6c5d984023bc4ca107bba2abd8a9658e350bb83780b2d60bffbfa00a4648181515636b0c14a3646895b184a864a398b15371d532bc9a011d7d46195e5368ddd751892f131ac6cace88f06e866219c7e8f198aeeb5c63ac2e06a7e7eb2f8591eb5f05463025fc0b9486592f2cd3c50a5c60d216b6d162972c108f85f55cb18c1518a8c29aa858660a8c4861fd28960305469ed0c2e6c46a714c13695d1c13fb0e8be47a899ced4aa8319fc4304840e588ce1b319d22e0424423861893109009a223408cff03e4f8d0911ec6e0019276e8880ee339401f0e2dc7b81ba6cb3738eaf90d46eacfd632f41407ab2828690bbb1b1149f7b2897087d84478000089faa8af271df5f21fffacaf8405f1e99ec0be1077d79102054729d0dc3152a0895590341f1e1a29b53fab7d1c196cf59efe90564b4bc9b4b1b593502c58fa63f387323f7fe8edb7b8e1a12ffb5572341e45c3dc9f3b7f651b539f845709e44eb42164376ec078bff67bfb6df9a8f50dafff610df823230c9ea2b14877ae68c3ee2493746f9b2328df26a892a4dcfd70088d6b55066610efa7343bd0a3d794d26f6708ea75a4cf3d7c1ffe2120e4cdb7a1d6067e1897f9ab6a70bf77fccdb8abef5f5ccd7d9363e7c4446f63c3bf3c93f8916db49295d2bb289ca1abbdfa52365e2bddde4841b189a9660a89079eedd4f8c25652b185fdf8597c4c6a5170ce83826c460bdf71e067090529404305027b0580b21e3203c55e3731593c27059e29de94492c87c802af3c9d8210c9589e173254fea0ff45a27d026f0596ca52f19574fd6b98aaada1d2bb777909d87d77f236024a4ea78140e92e8ff25292086e2aa2e4b59815ca0d234ea0bb11725e943e06a2debdc6b39e7c2e891bcc0ecb50ea88af21b1155384d6fbd32c8242143f96f02ca8c025933798c3258f78d7a0238e8927a23c4ffd623dbead0328aa496e60209c96e4004f9bbd62a644f524962b4c3f8c2c146cd4360983d960812184780243075c178a05a21a2fa306ac4200bf4e9f4fd4b9e9da1549af795ca76a646eadef8a0f67aa9bdb47141da24ce72375527401f727a7753b7d5ab6d765d111a8a27654f501da802e4d3a64b473129846d5fdb21d7757cb0fb01545f323259718b7360e8dbfe2f710c3d3788a103399d3c3b13f4a7fcca64d646fd5c64c98b5d19e9a515e0dd1818bd6fada374bd27fcbe222ebeaffe20d6d648e69e68dfa73d34054d090f66901040d6ecc8a22f5c96e55df670aadf519d89c003554fd0e81b693676119d6219b07388fee01e7c525df6ca9e9ae7651e6b0cd6af518d854b90ef7f26667ccbc2a519c1b53444c2acdd3d48c69a8a69f837bb4c7303133336fcb4cc7f411992c5fc5d458e21eae294b267273d420ad80211e2bbbe4811c902df10401e80403dc288790a22db073d2e194924b421712ee2d0411559380c249383cc39786292eed631d302068ceef15aa2e46719668f9b72922003f722d4f0735199f5d7dd24660ed7e55db7add9263142ce972795a4b9a5187e401738242229e17f6db823d3c1a89c693e6021c651c9456c6833008c59bad6e315007f8f8a9f5fb82db78dedbc50a3d044ce15530dc4662639c331fea70db560db13cea0746e11e7e11c054cda2d5aa1d6a9184d4d6e33577c045c75bd5964ae8379dc4e2de061d5e777067062cd01cb639af3cb22c24d286dd44083a22edc8cd9757ad200b428fa147d14bf1d0eb705fc38c5a3669641e798e1f14f51661d9add2ce5f76144dc5940672e4952666312e113301f746203e8da65ed1e163ed274216975a0429fd6bfc3d962ec92166183431443dcd0a9226755170110b4040d026d0e44e4320ce884370ef40bb27d41bc271a1f81d87587069108db43ebf51c71b26ed2f4ebcf50e2ce2fef41e7f65a0619b79fe3548f0f3dc0871f6702aaf18ac99157129057fc73aa2291a4b39152e4cc2cd776322ae879b1b818ee744609288a3a8b5727a56d3a14e426eb699442b4fe5cba17eaed5cb8bd0a6d8f7e239ad467b17840a9468034b4224d0a39171710b4e8746b67081bfdac2021718456fd86194761beee04b4bf871b4a515e8dae50b7b260b0cbf6ea63e2b2f928df3bb5ce145152813d6e50020b48884170325174f4c8d8590695d2d04c8ed5919fb0e7740f3f397986556e15bff087279b3271a28ed71468d41af42b83a10ba4a21c3b6b748efd1f2c7fb675e61be10dbc7f04cd1c877f7e5ab2d3ce608d72744dd29752cb6458c8852272703760c8610e0786e6aeec62018b00e0abe95cf3c8a52aa74f1122d77e80b312c434ee4f4128fdd376f62ecf8134f3909e6621d31c0b18647e0f282b8d8f588bca7458880221101a4ecc599e5a3806de5d514825238c7e5518559339b8704bf9dccb11770b0daa24a75fc180c26e386a23d5b202439cc5fc3a6d498c332a2864a23c5329ee32893288dbcbc1032a78d9aedaaea50574a48892ff9e4638d7b240002f014e1bc738778019823b7d81283cee9ed3891da121c8f1ed895383ecb3397501ccddaa621e26b69e20f641691979a0b0aa6e038f3843998d6f772c48efa8d714e00a18e7a5a833f794281b6fb1ac341c264ff3bcf1a117a8b8a3bc2f6352b8bbba5010324490f2a28738f14da9fe28569cb20ea2c21a2fb631cd10996f6d5f513282252448a6891802944478a3a34a06630d4e72e634e72b91a7e1094b4322e87972af5d98e808e41c946df3fc3017f4a4d2ff3afd3c3d16a635f9d41d57ceded602e8535fa784d8867e04b83eda182661cb761efd7c5173431fd05bdb215c73a0d58bb5736986e46db3eb4b3cbc4d52acfe3663250bc2320bb90548c9fb74b6d985af9b8ec021515fd8c1fadfa2d7979474b6083892b0671c506a2e9b7212ddfcba19c73a8898e31f975af95ca007ead1dc654fe7875903cfcdc94def9eefe33ca095ed907255ad4314f9d67cec107ea8c9722070c65ebaf9c875b87a2a24797cb6008818248ed0d866433275986a90de14c20102645f2ff4a80ac238ee1fc5e7a72edb78ce1e6cf1d4c6c25677f7a57979f952bd818764ed02ebad11ae969d6d30601e8c98473814a3512043da340d748faca7299441cdb3ed8e1f969877da403e04ce6aea48fb1c9aaa5822952b69bf6849e9aee23f48787f3a55bf3ab83971f5d00c8e29115baaf0b859bf27781bd7a9abfcb288befd4df04cb295be8be30b396bc18721c2ecd61e6ea789ae42cc48b6ff792ff4376cbea6f991fe15902d8152341508ce6e904a2ffc48f0ef74c3b1772ead43c7ee3bbe36c284e5e233b9c22d44a823999ef8dc704cee7a8be649ada3b89b8066e7adb44afd64dc87a91227ba33a32d2786458a3465d319cf7bf51486ba4b375a42772b46e8f987531dd04d2f7704ee086a4808851969114843aec1899062bcc8b1e135a2e0b09ed3620f98570d03db354549618647e2eedd2892fd409d47ff78444b3403611287f5ce9a804872ae95057a5861a41f573c83370a80f05b08eddd44459224814f590220d3f13615da13969b487faf8fbbeac4d5c165dfa878054a321f3f6978eea2e7c16e43e20cd971b8a02a9aca088ee970e9c124e5db3f747dd866c23d963bc267d7a8ac344c76162c1890f5997245af9686470bf3bf447f128238246d4e5da7468be2d205d984507e9c85a097a4b1cb11a83e48fc3354208b5e905fd1cf476fb0a0933191b1b1a6ac0ad424f193f141a75449a0c26520714e98e96caa8141956073658efc811ca3f1901be4545f185478a6f53517cf211dbaf1f35be01e9f55d90427ec3b8937248aaa2446242b748ed01fdf9fad695d0b7fa683ed857e4bd85453fc43cdcde4dfce06917a76c5267d1f6d29cf808ba0fe0d48cf97a3e0b425bee8f0dafca98afe563b5e002a8a97d153bd320dc61fbaf9cc0e03ad37e96da219cda3a4ec42eaa1336a3fa030fef29762482d49277f8f86989c5a1384054bf23e5a16f02d05ed9840266ee8f921e9dbe32ddc01f216d106dec897db0c41e3eea8c4e5ea0cab0de76e88de40f4a1746abeb1e4148736d10634f9caa572bcdbf1314856ecc79b69c5f8994096c8c3bf62a0010929af66d4fffa7d47935c4e8307530dcdf64edb5e7e2774f75468c8e641601c2bee7ba86f728c967304e6fd496d15110102f1634c590bc45d4647af4d045634cdb9a6b2579e3722afc4b4459d61f67d986b647135b69f359385d10a19682424be3b571a10db32c39361c54fd59ea92bfb663dadf44db6055a5fa0ff9ec0434d8abad870cbba5026d851719a5064068a9d7866023ec8a04ffae3c8177bddbc4308f74ee642d031bbe330b02b5feb215166680a145c133ad8a4d3464fc7556dd03518c6745ee2e67f8cb481c876f358d68232a53523f7cf85b31e8760b2cd0f3c0f6445656aa9707da97965cae103f29367a86de8d0e616f4a43e26acf55491cdfcc1ce799d3fca8c7c03d8606c72e8cb36eda98ab7acccd62276d41d481a9428e676d3834215eff11edcdfe1fef7a238c50beed3e734d371459105f906ebd0dbac43acce95dfec65619886b8100bd4a77230688000f3b6a87d00bc1d86a5c657b24bf8311420195e5c3c6d42184531fc01f84b78d9d0bb628aeb5b73461ebd2c0782cba5f00e00feaadd1f89d294a23c8a49d13c157615d45370049c31add5852e221f5957e41dc91c9516a23ce353a81e06ae57841aa6db064f134d7a780d9e25ac3ca3cd9c3d5be6cede3ae7f82439552aec2773bdbd7dff71bf8c6c7666a03da5c612160bf9c05a6b866be15b4525898b3241478d0ce4b1722b9a6cb026b2e99b174445b83e3ef5a60c143741639078b4efb16aee58611cf969d08fa7049ed1c1470ccf054a2bfa31194a21a4097b4763f0801bffb66f3f850a6662a525be3eb5f42fc01cb0f0a4769ab3a8e4bfd56fdec590af6cdeae6fa2c27af5bbed545ed657d0564bee74b07c1868d51b82566393432365bf7c2c2fdf3a75e874dfe5b61577e10ce7a14eef44529f99aa4d9a7b5691d961a212c8eb1c62fe5d3734f47eb5f8423069d37081bd0e16d777d86ee0396c515cc8c4eb9cf6f4c10e5c817646cd6a6d9844b96694123a07147bd3a8cfc943aa14561730a3bf013e8d3c0e624dab18f43e6b3c25538f3dfe4a0296e90910a905dd65ad388555357f4b2d9289a3b95042486c214970a9c8aea86c3016e72fcf966f8a9d9435ae6dabb65111de2977f9f1f762768be464a18e78aaefebe21d471b105b01490f04e69e8073910ef5f2c7ff304dd2966637de462acf4392b7703c3313795d7d2f505b3fc255d52cf8df8bbd9a20e6e1df723e74da01f96fd0666489291ba244accf0a7a8ff9293a8af63f0f199e5f8c74ddf667aba50eb2c7a9992b89b080c1a2b7b0090f92003903ddebd56d41a49ab29b0a7e734ca1bc8624590c9561264d2cc211ed5b8597cc5fefbdc86961dbf974c42bf08e1389abdd995c882be96d9311bad2a4c328bde2946f8f461a98882eade45b3791b42ed8894fd73720c5d74ff2e31057d2db36366ba322049cc032862cb0e45abf8e31237876e45307616598f0262f455a08fe834473aadb3b5720e6e34bbcf17637cadf5c4c61724e738d4d388d2d3be64b85a931b8bb0c6965e5f9fad2f37b9bde9ce1bbd02d8aa36ed0cb54ecbd2638aa4ada8446b9ddf79b662dcfed9cd3a1eccf33788cbedb65533bf7eb5b3525e0c34595ea939a415fac5d8fb60a4a49198bd71e0ac15ff4ab3441572dbeb37090e5b528e97194d33e04023ad692270a0c3c0016f6726e78f1a35e606c4f475bccd37c002998ac9ecd68d7eb961facb9fc137ddfbecb2baf16bb41af1e3a1f74a618dcd06b5c08524e6229f4c75955967dc396e403a688cb9c2cec219f7d07103136f1a3f395cb1871ed079340bd26cc56f0281d58581dce73603e4d153881436aae9a35b6992acb7e91535d88f634ac5dd424de3d8416fb7b50dff24127feeb7e73e3b4df75091c8c60033b719cd06dae80f2a02990070703fd15a04d150958c3f391932922523594c6882ec64924d3659012d0afbb3122b3cee2b8da9e58f59886832f790e2f30489ffe009810edaa18756e80f8919b4a1e6e3c48bcdad1b57c21e3fc659c940cd4193983689694b5dbc88fa431516000f36e619e3b1ebee23ba45a99049649ff30bbf116bd008bd009e80f7733f8177526adba8852e4c24b3ec32ca2c8b4c3a586f9df5d65b338133a62d2508c1d412fdfcf22c671782c972a621426542b7f37e36c319eed99722850083c09da047f7344c07c029983a91e93fb8e2822b719a7f62104d96816c19c81668afe82d9a44112998edf0f5c7db1f560dadebcf0fbe12575c71c411c7419f2034a1097d68c52821294862f27ce396e3297a9ede1d322a63832ebdf15862817dc004a0360a631e7e627193d14f5da757d332fc9930719932952953d9d82d4afba9c00bc6fdd262353c5e808cb7b79758a7bb9689a0073a68800e0281e5483827a368a4a4c2419633bd344a94fdf994a63f1d4e0bfb46f9f5ffdef5fe2e8e2100f8bf6318405510e434449629cecbf923af128f4a069964904936a6205f1292879eb01a0985b84a7807b48d98cfca8f46dad35bfcf386764e8da30e483d888231dfe563fb39f61aeb2701e669a263c8a9c5024a69b56b9a73161bd98f205d0985aaaef16462e8830e9aa083a8e2ca96d3f2ada26832ddef9e2fb3ae003f89c075f5b41414533288ba940b6c5265ca94664bd05026f9054c071e36a8d0af1d3cc4021e25fdcee1be436cef7cfc85f61b89a71d050c476278a2c67dff2a7ac90ff8f505f71cf7200aa2b92d1c3ee9fb1312388890614b68855798177e642bc8f0f0c293a0feec380f4367997e4a6801fc227bf8a0d713473ded0959b1cc88b11509e30485bd3fe2c4a1642e4ee84085838952880674a37cdd973b265662ec2359e95720759fd84597823d608617d33e5c8c0d2287b1bb52f67fbde1f047e8627403408568a423b95a6e5734623424624c71141c943940018c76cc33de6f6261dabeff8a5375ab7b962dab741329d13afdca8af7b6d12bf600e10a4041b521706ea0376e67d37ffc67b6291b83928ae4cf42d479ebea0bf0d1c13dffd5930ca72face20928b925d64d0f1aca06c2a00785553e1113fd9e20c680527f522aa40927f2e36057c358a95ecbe865da3cd0c4b8c3ebae4ca012a83b9eb5c557f41694ae3a5240584b02fa8b87ceacdf582a1f165cc7c32df97159e7bc8163fb36a455133772036ab7dfec05ed650bc5b2372da10b8fd6ec96e8801ea1aa487952771720db22140407d2ef27791316b4f597e2632a9a8a334a8d698fc91e9ec7d12c6ef82c4afdbe924e6345766c294b80e463c7dfc24219bd284395023db92f9d51184e8c2c7fec93206cdc506589b09d7ceb94b87ed04bbc15377e5056e1dc93344fce31eb882c0c25b00550d19438ea59b409c8a7d3470ed329259b149ccc1e4e60958be541c120610de8bd0cebc80dbe8f7119f788fb5bbf4ceee9353b09b3fc99bf93984a925fbe7ffb7e49198a5ecfad0b8b1c48a84b98b979250940c72ea1c610672688fbc4719c3fe0470861e0d65e3b206f7b8b09074ec318779ccfc5f8bee8549edd5e369cd1dcc579a63b45ad4b87169d01d7b1d1e9486fd8f4919eb4c3fe2e61f7f2e82c11b28271293a499a09c97bc95e77d0b09e49b3c4192619b9eea139cf5b28719497ed02a79d08f3b91dfda3e7630679ebe5054e53bd359df6032f2dfc2bb66902d23359c3f64991c90c25cc11596419121f9714a2bee6209e20f2453780295bc939e5d0d8e652be93cb78aabc9d442123f3e7797ad2219787ec38bccee3ae60ff4598549331a27b1c2de206f1008741d822a6f64567545fc5a55a645c421d455f491cd5a8cb461f374b324ec99f8c49fb64f0179a27924607ab3fd176740e1c2e723ac864d1c3163d3477d3bab86cfdfe44ec471ae920de28cfcd669ce9a9d0d9209bd1dede74811bb9877d0e62abeb132021e4d254c57c0c04ef0d5ec2e2483b0b92cd78d8c9e224a4dd8134391fb303f524e4427555da42355281f7092f14d1531aa4ec1b3e7fc52a1fc19272b2add36d6fcdeda7c4b39a3569e62206d2a6ab512c907891e0511230d6eb906059d3ad69c5cdaca2dde57e9ac2a6d085523180d5976f606b290917983ad8ab76e66a911bedc4513a6b05203e8b1165eb2244380de2076d62e5deb3249358986a8340df70dd2ced42ac6101f1c2ce1dd1812878c49969b18c2c1d1b6c3793dd17df49dd0028723b30835f10c46edc2e8a28d0aeb4b52062597f0c4791642c9b14a54d9b02dba52f9bde591084b7d99fb28e0c9dbd0f057ae2a8e054b52f3b2ce4b0ee28215932a145322c8c02acec81e90b95bc129f093b4562f7c4e8038a0e62f150e4bdf206d69ba397eb9e7d7e741bd2c9f6e98ff3287edc50dc009343d0cb4f3722605f299a512de0d88931474dc3b51321fafed20ae08b1f9fe00e91485f82dd1df038922955b5f79d4c728e2350a2d0fe51ac67693288d2d16c65b55bd1509630da6e17e58fdd39d21392f71ee1704ef93ad09779de7204db4645c0f72308acc4174a0405cf970bd2e19563e664d74ecc7aa4bbd9d38a757f705eabafd31b46383927c7b4d7476ae66a82c3e945614e454ec28ec96f3f6a302266d3ea9886f1a30491df5c38301543e6d56bc1c116d7597a9bfbc2ae581872b02fc871b41b2276ace10c7eab149d69f5233727447860d61a9d4a3e9599ad5a758c8ed798af42b3b476a463766f72838af6a0df5fbbce75ba23f0e990b3f9c01b7db4514679119300645b7b14a1e634632fd5a06c8f505d3724d3795493a6af093b096935b5ae42b045302abb88d79fae2db9c895bdc5891d96e89c57cc1874b2c2cbc87cbd3d6f2576f90cd05208ef6b7de3a58a8b7db8bc905cebf873fe85250b726b5ef36e2ff404084974b8f0ca94e80e2cf1ff79fbce6f11ee5435006cfe8b5e86e18a137c4cc07f31f735f8c644c9f709cb59cca133902004da730224f6d4ba4738efcd135c0afe79b454f87acfc5f15308509b20c27f208a798de479e29386ad88789dcae3089ae66c20f2c8cb7e6ffc4f0e6eccce59f2808b8859a652f60664ac80b24a5e14190cce57792c8ae444d73ada96b16d2af4fe68255cbedd64e62da6c4d061beb2c0108a3426c155a58ff75a5411216ad54e256777ce9de2b63cea6d56041514560baac8736a0b72fa383b586e3305aa882c5d096342945859156e77348b9c8924cab303671979aa933d67952c0ea849814cfc0763dd48784800e2b7d3544f39f16a44e4dd98c86d6d5c8cb45737c132fb0c8f2370017c423066b28d3c7104d99bef8e9f180c1b52eb451957176d9ebb142e2de6a7734512cca7a75847c5db7a37ed87ca5399580f84179daf8ac8d68541e8c9cad341537a1e506a58429790f2169755d23b4dc66e90545a3488068e3b755aeaade448499b5e058246443bc3d329892528663d7acaf41d9a78c1af2b98bfe994f82a3bb2f820c56f489c6c5c423dd1393d39e2cf4fd04f728fe6bce7f2e57dbd66776642db67cc8f3c68cb0d4bcd955218a1d1d4f324ebd043c3cb6039bb1163bd2d73305804fa953c9e2816456197d4e3a835da0f736781167eb64c320fb389b71e937441c453052e0e95a278af4812e4877323c095e6195e75c656c83c3d1e877f94644eb4e1c29d5e2df51114ba7997932e18d170a9f5cd70f28067ccf425b4764b151c9a421b6b63ec52a15763aea7762f728c64e4a9c9847b9b0fcb757c4be283f3b8d152c5495c7a15b4c026dd02e8f0d2c7fa31315442b0f2b2857b05f82c504e766c306efd7d55528b83a4dcf5704f47c56628c06be41f936d6e2f2f8242cb2cdf91522e0cfa34cc9ed585799d00c12c41b7b4c8245206f986a3a32ae83a9ef0b0da8ab99145b1e5d084b9cc1ccfa29d763e3b10d2ae7e65441c831a29f8747a1c4974d36e0d1456360c58ea012564b9cf0f9f8250b684c9ce5fb3af9e0786568632a469b2d62c0c176b67cab16b0e7304e182226bb30deff1b087c062962c7c6e053a4306dca80be93710ac2d2c6d6d6bac799859aa75553ec60ec28528fd423097b475a22c0015c19bc926e2420b51713da4c7d888106a08f442ff6cf0835291feb3e0a544d8120dbd74656067b5c6e7e2f08d0932a2c560a36d85e82df72cf6e4ee0c4ec0a579f9f9111c79b56a6319b9a54d827b2153436a66394b4c3bb2ab2db7066f5ba582506a9d461b2d5d5cd9151e154187aae368919642cb2306512941927ed720e2174cf85acbc0690512cf44f024b4132b17c6af6514bf04ae637858857d1f757fd409712a0a1e1ff5416e3dacf04b6243e3d4e2f697c0f71f67ad8c07070c1b1364c6bd0e2d78c6e96edee1b7563ee4ce3b60104e656fbae535f0099fec404878cb9b1ee15e58c771d8f07059661883e7f56ff3bbd0aa7ee0ba04aa7e73cb7789205169f9182e2e9c590c87d03c0ad5ae1ecd77968e9a10401f0433116364e6c0e44d221f9698e4bac7d3f10750c1ef56de6278a77a08ff7892e701000125f25ec75d4867e489be6fc468236fd5aeee67eef80182ef292b1dc65817f79434472839ab04016ce85cf6a5619716c77cf00e5beea1108d4cab4870b77fc2b7258a81870a80e8478119c2c04e028b604efbaa6a7de8cc92d6c56b8c92b0446333413f84099207be48d780c91356a472e04d3e60c99408f8e10509e48572ec297b56d224dce4b3c68253f86363a8e21a3696fa2cd95ceaa4bfb4e46e91e55504caaf4f51bc7419cec362195f3d0496bac2e544e6b4493bfa899b713782459d80aa6f61fc41b35f3766b7f47689c4f5a7392fe15723b762a56b8b24710ad1c51cabd6a959f390cb7d8fcb0925860d840b59e3f72cb92291aaed80939a9880084597f6931165c19c678ac4f199d3eff06b3139a2b79360650410b9415bd855649d37fcd209e091a5428c789f8aa678cf52361f7386837551b19f8e9b03ddb5093a4f0047e60f8e5255d8700bbe52cff9c899f859e33312753a1a696fa980e8e8ee36d719b748e36f9cb81a198e52046ea1e3c3bc3c29e754c6ed8607238225b6d8c7314c1a42fa290ff112bcbb03ee7154b565197794a656c2b069c50314000a35908dbc75c4e5fe38968793782f57adfad8b92708015eaa97d6d68df65d7841859b741f45db6ebe4416eaa9927a2d7b0635a63f82bb05499a4683706809d510303252ee798dd78ccd73d77052928a3f06a104a968da974217567bfc349457c16333424fe41d97818c0bae32a902bac6fb596463d92b1d864eb4035ebf23bb9039b076fe94f5a6042de8e5968a350029beeed7b62066e1c52f2b0a26dac22cee139d1bdd2f68e969433d5ae67f9642102bc147adea51ea1ecc88daac9745fd4976e61cad819715793fcd1a37666cffbb9eef55d3de1938819d097fd404bf1ea89bc6b605a808fe60cc3b85766076e9ddaf268b3939617653e45fb2656c5aad25c131ec3915c0a6ac706a4c0a4bae33f94a08a70c68c8e5e49a88788ba15fcb4430880308f1eb08a3296ea15904eea87e30db3e600206c8783814ff43a155d726589f90311ae16c4c08078d10b068282b9611809a914afb6bce490dbbe0ee14e4d8d9864026a2d7fc69408b9236b83cb382ab68ddb57af522885244366e5a0ea16fc722dded6d62101851dbd4a0ba13e925b74ed720a24636b41bea933cf093122cd283e240b90f575eb4139cf6abb4513a2b2d487e506b4f3386841a603b753278c57f0e0673ecf9fd4094d02dbc954d71d74faa10c0afcb8e39f11b95485c27211b4947764308af5839aafaa9856d23d92052ec8a8589fd0279d04cae8b0cba4a3fd3b69f71e2b198bcda327e81b291bd63a00e7cbc2938d46a80cc294433de8f23923e20d99c531a7ff6518e44d449c0146fde6b44c267207203c0835d0b8886610295b78b6d644fcb356ea95ed0b47f36bc7d6d3caa33a9488e804305b11442987e4dc3f711f78e17d99ff5409c71d0d4d0d698ddf2c53563c18649bc8c72a1be86e0b41ad259d4cf69660323123706666bab54b46aaa86da6da8c453df6ac5723e2b32b00b0e505099ac06b74e5257d51e42712dc924f5f0501c4fc8041490414fac59f3755a50c38fa6f0a5b5541eac219f009115382c493ccaf8023043af08f023cc3fed7b3e674725a99849ea31043a2a7da254599f0e7ce0c5e93cbdfcd8ef24c4a3fae83fa748e6022a8b14eb9d8a8b53a2c04ecd532bd51a2922050dbd0975d8d5a9e20014fcbde38fba17ab7fa63e09a5f61d3d92a56649d9081fd32e7c92eec31149b33ce3ce46504978eb7de5e247388e7c89c061e3e0b7ecc3864ff2720cb469f5752ad152c3c5fcea1485f4c1a569e3f852bf081eda0852ab624cb3e0ff096ffa15ea286c06bdcc507705f24087137917e605b451a004db64d350571bb6a2060d9570e083193e95ab15a52094281032a4775e2c2016dfde829890d8d2f3b59ef4de975ec9ec7d99010415d8fee0fc99f8f895573ece0330fec07e4eb6c13c68654378b446d34cba21481b6342e32e7f3d37aff814c05a0f81e157a07c162d218e2b07a9aa4413769d655fad2b603c3983086304224ac85d7182e96e4145ceff8229c272a4562b2c2ff239be73086b3521f330aa41561102e5cb3a42bccc884658e89b95d4d54f60518f9a1b57be8de6a77f2138ae44384e54484545311ed73983966e2238c3a01d6b947f1dfc060f087136d1b801a5f75b8929cc85656813aec4475bd461a6028c28875108056c24c4c2a10a798a1c2e5e960ceaf588780085de995180dde1313d20c109a181026ac00f2bfd6dabd620938149e8f13ec97adae980fa0467644ffc13a904f5fd532b94891b481265aed88aa86502abe4d795c1f5b9776e7113b435c0dcb1f7aec6c137ae8332931f4da9b938a50c87ae5a7766dd5d8776439e068438d62300de0adaeed6549c6bff64c5778a1c274208c84b51df18095cb99e2db66279d22abf1127bd88f9b5398237af83f1978b3aa18d2e8925353a7fa1d6e0d66b35b342f3a6c4cba040ceff7155620daed2fc040b01a74a8abef5045eadc2785d8035b871fd5cf6aa71993fbfed044f946178f5d62cb7b286b1477bcbd2fe6a1b7c300e9382bdcba5a13d3341e13646c31f5fe1e086228d7496e1486d69dacfd34d2a0157fb2ddafe4903d6c331eff6674560f5393a9e6ece572d2327f8850070f1003563008cfc23d8f2b1dbe321e3c3c24bd78c51e19dafc0cd015ef31f98b96265fe019e133ce617dcb9c0773e00361738e633c873806bfe043057f8e627f0e780f9f905610e389d4fd0e706c3f9016e2ee09f0f80cf35cef91418712a5a3e9e4b631091952d314fa531a8489491084fd2365824ca48942769192432654bc473690d2257f2e668b8bb12a4f3d138103fb492c603706a8d57625e8f572a5033a60e59c2c974fd3eb380f6c84a61a0c4e314dccad8f3dc94ad544280973ab2aa40b0fcc98e9a9131d3e731d19f6a6e1bd5028e8fd517775a3699302339f475b3cc335c92c7895f9765f63fe6c575d89ca1bf98b1739fcc4766d324611d32dee3fc0c1637a11c5e41f3d59f237c31385ce464b7eba9524f6deeaba1fc7992bdfbe39df74521f9879858b728ec30e809f99e6b75734a617e8f59eb7c63dbf7ebd9f5bbc1a7024b2fe55819fafdbe7334ec9b89efd7c990db14aa708d22fe6954c8c9f9b41c6beb0561f7bc371a8a7244371ce38bae7c10d2c1c290bcd1f8dc731cabb75efb97a9e4b7f41be64acdf8be06c485bb97c59288de48562d19a31717b97bffb92052d11fcaaa2d63f4e22297ef381643327adb41896d08a378404366571ce5ca782d28a23119dc0c4f08a4122c385d71972be3b550887e0055c627349c1314301d87d20dd77f03d7ec14a4df05a5d6e35299cdbd35d09a9d82f4bbd28254ebe2bee4acef494867f046f85df8d46f0c92e5e79b78340090726975debfd52a5a6154987d2515fd844fa73597b0cdb09be5fbe0c594a82424e0f6bf6c9373f26999f58b4360f9a21929d5c3d2ad7708e63f98a011a8286064fd62613e9f20a034c61f41f9dab63e49095afefab61f7ab286b39de38c73af196b4807c345e2651669c21f78228ebad2315250018c294da8062d962a263bad891dabacfde80617ac0a42e0498908de24d121332304c930bad0f2f1209f72b1e715aa3407a551eff63f809fb7b83eb6ab56bd13996998bab7188b04807b5803f6021d200c54782d019a4f21d1c1d480e57f3c1d0b0926f712f146ffb67ca1345a021bcf02bb6240722285ce9b0701b7913bd6c58341cc0994d0a875587829040cd781650bb622f15991b6d83dd886c1f82392cc7a77a089fe8be61b02b3dc9ce0064b22df3586e119b05e26e1e2def30622425a882d26897d2309c449c912ba2d5867ade4da7e62eb7a7a1703c20b8485c0ba7e30ad4a44860c2c752d2b186d2c5af618a47f053b253ac5026f38946e9792ba39b69b8ca23d2e05ffe400bc1905d6dfafc25948bc2ead4df228fd95ac941b31a39eba353c5e3d0796ed41bab6f9567d233c748de55404e8e777d1844395a84e7be86515f6a04bbd4f89eb6df839d4522003b5f6a1446ae1b9db506bdc41cd0c7c2d37da86c47b06937ab9fc222495386a29c112091c3ba4968a67a475544bd531eac557e162ab92dbdbd9d682644e17a1c73efa86b7010d83c40b952cc64fe0a6dd0a250bbf80dd04d3a238f0ac636f22efb05aa93889c5c9cd91fc9dec3438132960b0c23b54cca90e4a0d1cef03a2a668e6dbe9a37cadaed3c22eb55b837b9629c6c83ed3159c44ff7e8abc28f6874440bda763a89a7a84540ba4b0a2ae4cc33c2c126a4d96cca507ff2fc217eda83aa7e631c53b6598ae304f10cf2466f80688a9d368a0e28c40589ef7aa3fc7ba0d14975d092ae3944dbc374648fa67945c4ebb29ad4785d7ee9b7519e49f0e78128912174a8ae61676a99c4a1d382966440d3c9a8536e53ef83ea5833b06f01b0a53689f2c104dbb4f6c39acf1152eee54b43edc149a229396bf192108204fce3b352e94d736f0383410a9d785113d23611a975f5109d087b0293fdd4224e9f47c1239245e209586215d2ddfb7b8af0ca4d23309b20c9129db76c5fab017092f66f6477804a4105622109f984548e0139fd93c9795cf2723603a21b857a45de954f02cb50f98d202039d6f3901f1a18f8dc6470c3463b58877a9670cd38317d8a3e0f6b9852fbfe5b82a176731aaf46f457a80ba4706b967a7092b41d18c16fdd90f5fabca63a78128d387feaaabf5aab6bc62e3768aaba663f6bfdd15cf6289bcb5ca6243920844a0c8fd3967f2463f9f20c42205c7dd3a7245cd10bbb2561ae2b694ffbc78007581fb94cc3093613b96c67d6e9ac0d4ba43953dd55774217ccd974e099267275f1085e69d532c156ee4758fa76e735765915fd9a45b6c0655c756242179d7448e5bfd84494e01e2a6822ef394b71f5ab80576bb7de8c62e3cfd5ee1c579ab4dc86d3798ce41c66d969c74964c7590235ddcd39d0b763a181009dd4a9f5a78304d81ce77735fd03b94bd7ce84eda45415125beabc933395a520704465a14fe0cde4a73896740997682013df2adfef93da96e27d2c2bc4d852176612f0681c484d031194b95314c84e2a0313c9d61f6c6c286de073628cf339ae81725d68de1104b91ab651cbd7006d07efbf4fb9c78c30839353b53f2d95e6416286094714116699d4a09bc5fce5bfc65673296e01846b39a491374104984edc4b26bf8b123bb52321bca2cb485721704993750d537f69d2f9fccd00b886e5314e6dabfcb7ca62d597c8957a4305ab158f821200250a15b2735a157d8de9598506ba1a939d7bd1416d2dcec74250e65c68e0b2b612513a47d5fee43953b7be537dd0130970deb2d5154eac859f952641b1674090b833e088670442a18d5b7fa8e825040d2a09804be366ca514ca67f9bf7fae29648c2f9fdc143ade01f6718cab6ad85c22d7d7752f690dbd0a7af37257a2dc3fa69cb5398c1b4158cf90a17b37c4c030a9a28ef74010aa22f4907780adad11d0c2b17ea962aad5cfacae875b192db6390eccc9339b302e96f4a9f04d48a4895dd15877c0965c52a25c701d8676e1d1a636a1607985a1ea302630ece9e247096f13775dcebc049357e6aa10da6a3cbccda29359e679f44300cfc661a9eed71516415649766cfc68b700b60c3cee1d41e82673f74192f939e87291886c42a2946ac339bde7235594af55ff9ecb2c698910940d873ad9dd82010a0781402c5af5aaaf439fb0b3ac5c681818cf662cc1103287f48cba151686cff5b48dd54735280106995684ead48341bad2353e2a16c2a0888466ce03849efac8bf559e96be8f63448824e1078e717a545c4ab2781b103f00c69ed2093e483c6e00ce07408c5322525812ac3a80fc2118f3d44f1825314217903e04e29d06922b91601d32e00338e6e94a86988425bb0ab143f1e4745d500892304fd2154ff308dac46b7a7f3a41ba0c984a360793c034ecf0f3375dc35ce6343034fb23bc9bbb88574c4bcc727e8217ed3e1c277975d470b3cc083d06735d1db30ef0f3bf5267fd20eef8af28057dc87684e960b91eed7eeff7fadb3f39e226cb838b6a817714dca503702fcaffe121644da39b19606aff7a731fcdfda45f4681ef9f3419e8225b691339cd96c32f9ffc886b1635e442590b5794a0a6c73b220f58df2b8999c2de90ed5fdabcd7e8622be417dde91fc7a6801290e0649d7ebbe8202e8bf297ebc28c562adfaf3cf7fa721d85df99fc7f5e4b4e68dc77bdb887d6cfd31a40d892c00b649e7a9af47b7dee8bfa4b90a662d4b92ceaff7eba203f471dbaccfa99481f45b08af973da30b985224e83c02cca7d44a7ef23eceb300c2a0159400641c014223d693d83b604be011f27bf6f409eb946040e1252c8b34a8fbea6b75817aeedb0c546eca273f2d62b87732ec5b8ceac8abe1bf22f72dd1bb96ee7d01fe6faee6679d0a1413912eef03c611617c104c150f91125ba172abccdb129f390608112ba60e4ec046e51d8652b29360e0457f949936afff61327ea0195275826736a478962fa4f358ac02a5382139ef1fa83e0a203f808ae97896d21ba882cd51b376cc387e18173dcba62f69c5daf65d1cdae43c465af0329d7f5d7a9743d33e080f4648bb4eda25634a1deeb95c19a886e358531b8521d51b452bc67aa98a0486a811eaf7f9d276df2c027e474b578bdbfc83e22831f5ce0cadc6d81b7703247792530d3316a9fe549f9cb34943921da62c0a03d138c6b200039dd11f46d9a809aa9ff8ee17aec285f1fbd06f382e52a43755ac884504e18985e956a33b47eaec0f67be244335960fb8c6668b38ab43fc84ea6c32eee8441f8ecd86f1328d1cf0669ad558f1b184d4605d42b7a794802f553020296bfb84d17f8e4732114743a0011f8717ad6cf032d466f550b43dfc497ac2ed650a9f63b833fafc493b21e4dc59ea37dd304e7aa17b24793c29defa444bce010cd138cf14610739cd755838d02f44f988845a8eea543771a343da615687bc7ad712a6c0a17c4b8eda22ea515f521c40722e8634a43df60722877fbc17f120aa0366470e4a0df259bbd8aea832bbe3e379b4d2f1f2203c0cb005bdeee0ac1253f2438363b9dcf0b60f621e7bfc24b7d8d58f5eb7658bb4f3625da16cd3991e5632ee7862b3b0d60dca2a83eaca3ea00f25e197837d8c33765a8767e6ac479c11dd81589736bbc22fa5977a7b3f76a37eede131fe3cab8657e9e49be6e7bbc628a66179f2ae0c0d202d1681f883c238e8e96f7ba063fe0e08a4cc15d28663c42233b1781e5ea623d99e570c4ea79a63f30ca14a22703508c3c1b735cf7240fb9884defbaddfc79234096e4e58b628630e06c9be6d04e9ac188603ea9d823603ef999289bc559c01587d714be47074f601b2a2a91b4755584099540460a7f4768e620d7f1545f8f3011cd50ca891f46c30b1d783b1ee8a864bcac2318bd1c61d9868ce670f8550ec798bc7586ac7248905d86aaa5b5d5e277eb60b5231ab04cd02609aa998ac4209d0283ca497fc562f6cb98371e97b8169567c51e287b3420a4d0bce5e08a277102f574821271958bd325caa4f3e3da46c543d3c5ab5a75700c073562137123b8ed43f8bc86a277598fb502e887c9bbc6c3fcc06847f44384e20b7a18c26241a00ce61bea8d522c43b5e9037b37e6bc860e54bf7a8d09ea0be6ce3669b41103f0154004817841cc67a1ba5e04620d5025e270b0ba4072310b7f1ea5a2aa5ae4944bbd3878403672b83decdea01438613d85f7db94cb058dbe80f4b60f63d11ecee9566f370abb8e80c3a007be6a7d5773175261656c84ce68b168496e01d024ae5526cdbefc1d36e1178afefe5020d072692298823ae1515a9a38b7b8d55866503c94022d44eae55e79db1cbc63563a2d977c2f890453715e9bf30eff15fccb523804a12a1828015119cd0aa34dd3569822b2894174e2ea1f7f2ac6b6daad2b6c80577530a3940f6c609b7809aaaca96c5c528308eed64e3f5cc06103f6c3ef361de98878ded3272b6f14ce139d1b242cdc901bd594cb9f5cf0778a038132523aa0c58768d058e48535586ded305d477dc955fd16d7590d2b71fc3dd48dcec2596fc354af3d71adb083f3d45ec7ae9e2b2e119c07e7da9fde64c1f6bdf0f6a54f6c54e52d5c6ebf95342e2e6157477cfb5ada8f6439460d3db635b5de2f40e3920686c76f2432995bca83349acb28cc9706f3656e5c59e3933fe58295fff47d018b9f071781c19f9a0759a1daf947867d77eeba1b7d24e3f585da335f086b8ad2d792f17259403340307a0ca080148db2cd2e7133ba47c901edca60a0d012ba41085a269337805f9a9a889dc3a0a9390392b552e2e29fc5f10540fb89415977a9c84f7212675ff929de9ce55582217e1dcfdadacda9bac82a62c1d30136fa2c5008343db87c14e57e3aa1f826d3720460f89742a7b9137f95f434a3accbcef96d25e63f75535558ccaae0c13275e5a59b9b2f71e71be41de0ca767c975a0f8409937d316b9ab1abc0a8cb40f658a5178d9f6897c0ba1cc6dcdbb1482a505b21e9d30f8fa4644cb651a79efd861d187b2ae0d61b7530b38cd6949347804b887367453dd26a79e65ed2501618948aa8c83f043887e8d03a02cd0451bd1ff97125ae91e458379085edab6b556673d1067005e7192cf7e19815a9f7a6366c466939422666917590e661672e2541f047fd878dfe4707a0dd358408664140735a607c0b4142df34f240d37fb0f49781f4319573743e8c827495aea2f206d203b4545560e283e344fc447d27080f7e06d283a8f85806573919fc5a11f1c97dd2afeba1a2a42c249600eee73df9cd14dfc4db26270fb98e4f727dd89327d4eb02f5a0fd3551e7c5468e9e57bae6a68646378ed7d4b08509c4c1c1313de2a49e48388cdb7ca46475bc932d1fa9c1c5b54fcbe1f403b21ec1af53ed3d0e567c71bc0f35425875a215d92d507d1275a335ac7c92048ccbcb1539007445e60ae13d001c03416d299e7ed6a870bf6b53a2adbd2a7f9ecd4eb5f6c28220ab1c3ad181d870b7d31cc7247ad2b6ae8e5020c5e18646da4b7c7683b46ac0e8e03c081bbdd7d8e644438f20d01ba83b611136d8cb46d64c8a40a1d854bbe245892a8800aab5b696ccb3de6313500b345c14cc61515b379f28daa91663d86c65d17c586345e559ec18dc162f19aa526dffd11a67617b154d9b38b0c9ed3668a63dbcc02a545536ea2e4ec821ed9452b89a1d6f5e6a96d5182e9370aa6de8b9591bd78b841b3d8561c1f61ab32388251b3d6233d868d01132a7817807cb1c49b6b5bc6255b0f5e5625b32ca6cae791048fb977999655e66999789cc65265399c854e63295894c652ed332cbbc4c3229934cca2cf33237f126a689a39b3b3a0213a099d0dc58af79a88d14e9e714eda21c7ad68a8abdc0a16be9b059e3ccc5c82169c53cfda864c50d3b97a8154dd6fe173b432db05f5df04dd62d1300b1ea08d3472e91c81c19f4fc74c00a7903505cac07cdc2df92fa770d570ac51e1fd2db69b426cda08a94a2f2183e4993138115df634a835f07a4ee41a8f66ec827fc7d62fe97aa901ab3bc97f5bdd706a409438f95ea76068beb336f1477da46ba874bfcf4def80c7d542238bed64813a9ddcb2370c71325190443114a6197a4d8a54e9b2015bad6bddf2dd55b46139f30d8a9fd85602e769bbdb89d5b1ac9f097f1fcd5bfc5e20271cbbcbc856e3aa1904330d451974d9132011975ab15f2a6aa00add6eb4fba4858f841d3ed56b52e484eae9fb4a07fea0ee61b1d92546bee00d20a2ec56c5f17754b0947ade32900d8026efd7803cc4f635e3d208c783563369caf09209d9a3f64ca9d4d050b600437d3e6373b668cc9c03666c5a3f3753f41e2775d9a9584a8bdb2acdd03f194353a924221ca2c5bc214b7ecbc05b69a7fb976d9840a280fc7d19990c1aec74349a3df2d6ca29a2402b9e53f02e6f489fb7ec95b7efd36691cd87b11ee0aeabc8d2bdecc28408aa61f757b32119ad840a9a85413e69f23273e40113fc165ac364a8433361a33b1acf6f993167f2c863d107c282b6445b21947b20f24315c93f74f69c1ce235d84897ef18ad2f160a426224557011b861fbfded7289a188a87187c4c2f6ec4261a231c78d9272dd1c5e2426dc5f8aaa89433e1dbeae1e7547644372c629744180aba02d3d6c60c463114be5ac1e34a20fb30ac3d829d0eef49f5ad4bd663d8bbef27ae0ceb471e36196a8b8e1f6cdc7f5126ec1ac6a39a7ed7a29b82340417b673250b36f3cf998612a2cbe58673eafbe767ef244f6192fcbfd630ab94c0e61022ecd1604ec2e61c6c4c9c1a17f3d64a754ac78e50c6995dba2f99394a85700613c3fb04a263d075cc35856a235fe9d6bbc6a954b48daf5e1d42cfb71e66b42b7aa1d1dad78d8809ff6d339793a0ffdd26e2e279d5bd0e94933863fe9f287ad97fe1e0b78ad3ebf68019f0aa81dab6cca155026ed7ce7a7afe2614f9c9e583e597c7eb2d5ee58c231d5c2fcadb6b3a991047bc5fbe8d54b1bc1ffbd5510237ab0f8af097ae3aae1170ce444d4f63a944a18f0d5ff378cbbac8c669e5fe1fa875d51217c2b86cefefc898d08a815381063244c79de4c2962408cb7f9648361cbdaafecf2ab3d7946aa87ed0c026a16b863702daf0ce615782fe3e66f1667e2c3ed06f24cb04ee39ae9a0d67db874ee59eb44a34ba383161a2058ca0f21262c7ad27954ad550d07f61432b00d00ab2c66574068c66316cf07c897bc5395236541c5c95885d6f01d377ba0f1dec6912a27046e2ebab1fad484f914548dc4d72ad90421575fe98257fdc5d4028d61a9dcb0b706729972082e05a8d59d972f71fb800c758ed609b3b247a5cda7255910fa8addc593056d2782698d7cebabe5b58105bf82891e296ef7433b207e7a2c9db0c62538f47679e7089b326579b64435af474c2186adc749a04313fe913b3e91cff30a5a7a2e934e24d93a84d4879a8ad8b8f14e5edcd5677c2aa5fb401a22ff5851eff4566f77273bf2d521c99340ac0debf38c2a3592a9bd58ee11692a4d7fdcd5475c8f6194d36856f3c4e1f3a0647b8f17baa9ed2246b28d1b9337998f468283e50b0894fdb8b9ed554f9881be96da7760d00299e9a9cd2e7ac994e78e69a68e161053a63721c764c3fbbbc72bf06527064b147697bd45ca4c181fd2a1757057fd3db0e034d739449ecdc78f41920ea3a96d810a5a849b0be36fc62d7f503ba4a5b53cbad486843e7e8252e617f3640ba39c98155e011945faf7cf661311bb00b6ac4434ed080a0f0c19988698c49bf6ec1546c4c69a996bae0442a343a94f55296d0d1b85ef2563788717115c20a35d20aa24e6d110a65b76b9682a6198b1196314337b2c7687d8ec0b0d9f26a22062c7c601f532a9417a10bfe87255af2ea23e26172f2af508f9f573dc43c0e5bd4f5e36c78fe0d5a5deac36a828ed20718f17409db85c21ff59d72e7035ab5297836e57ad0338ab8ef146d307245974a9ca4f503bd7ec2e64b20a139c569d7bd805955bd58317efc89e48ead2da8d53789aa6aef339683f2be9d5663a783bea6f87352a7efdbbd8720c003f632f1d4d58763e4dd9f34bf7f1ccaf540ba61638281eddc25e44e25377a152d7053ce8ff1aa7c83f860ea3f61dc48e4b41f89858d9f01b8fed4ebca0ef91882b3c8870503cad96738cd8e72b7062c0fe0be0199163dc64543dfc913a4a009824ac2deef7cc610533809803b00b323d5ce9c36075ff0deb6c09f561a5982b3cd82e98c396d5c829fa0d9d9bfde4f0079763a977cea1fba0d1085cb52046669a96c772f3fe7205942a1511120eafd63afe89366060ce8046e46c43b0d52205c59493ac968932f8c34e3c9134733a418d91cf0a40cbdf0776ca481054e52842309dc6c7624144a8681892fab973d9f657e2f0d1a6d7bc4864c6c0dfdf77be9000f36c37534b18d1042c82664ef2de50e760dd10dea0c2c9bc64d76f364a1ae187a4c26f3349b0d87cb31dd1ff01a51b93fe005e27e3d33c6a08b2a438874aac876ecf20a803d607c6cc70ef484eb01a0a08b5dde01b00777b9d443453a71a58437d62feea795e00a0324888b591820b18b2e6e3f88dbdcb3fa65dfb84b15fb257155be558cb91f87424c1653a945b26bcf2217849f9dabd87b6296c409e6b23eaed3c3bb1d4a29e595574a9d5aa4dfb76e7141aed36bda861d76ea8341c7173b66697b9106a1dab3d30a13849e3b777a8dab1fd0fdb06ff701e18d8a4afdb063379d391fd8b9f7440c26c8f6ebd7372bdbc36c765dab1ff69d2ec46c12a7cb5a50729bf8508acb164d6e30651a4d261dcfc79a04ea6633566dcd69655626a5847047f702c680b9668281128aa12f5c60620c9d244f2bd3b08d6b61b92e23232321e699540c45d56928462829c90d31ecd07db1333bd60dbda08bd75e5016bd328961d59a997538b9989c9c725df35a98c5d6161616dabc4210a137378dc2ab4dda7b5ac6cd7e24b8b89fcb07abf152acb69ce738e52625e6068c9351a24ccba275c69819c7fd6459e58b55be33e38058566a917112ca3565cc3865d980a9667066c2772f4ad668468946513593e24c9fed36856ef11cf71359a69db1525151892a5d4b3c0bf793040bf7c356099d73d2f9a2b44d19b2a6355966ac5a4e2b2face636e5456995344494b4daa6acb8b05ab9acbcf0a2b32d2d2d2edba9be5c25f9443e69f14166e1032797e4920c19325e702c5ccbafc316164e8613199c4c4a7ab19daacb0c2a66701209e93f6a9352ae4ef7c702b59d6acba575498c4f23a33ba9601e1b4918c7366546b14194848aae8b42749dae710cc39b98c3e07e641c06729b7cb88c393fc6c2963060704ae4100cd4fb369230cfa74872fb31381ff3c2d8192fea0c26edc1b01f9d82b2df0c27302cdc6dcc0b0b6783c806d1ed575939595404639b550ab1584e06c918db56b167d5ba76aa2bd6723f18cb959dcf5219de5c17cb75652edcdd702e4671e164b690e1a214295cc87071ca94182dba1fb0a8b1d1e02c4d6ea7aab23dc3300ebbd430148661365a119f5cd68b6559afc101b16cbca2061795a2521635b8b8b4f4c30f3f98aecb8b559ce9cf24fac2fe60c309179392666ca7ca7954701109e94cb6192eaeb088ab59e3a96a345c3c3ab2dba96635318a1a2e1a45a353c5e6924d92588445910df7c3721beeda0fdb8bd3d05cea3a4ae9a5350eb9fc1483b81616196d381ff3ba9c6650b16d536e22921b2e12ddb8c1fd64bf71aa979428516e707183eb295370e0c061633b556b494909871638b88602050707c7db4e7526212159d14ffa498e1c39a4eca3eb328a335f30ca640e2639b85ead4e355e1504b48582821a8aa1212444581025e1bae8547b89a5c41996b77014c949aea5b2d41d5cece0780a163c2587fbc99ec3fde81bafd96c279f96aa849e652e2ddd66912c1e366395cd50ca99391c43f141c69af49226956e25696828699bd2751f32551e0aa2c1cdcb0cb1bca4bd2c7c813285ccea874d869bff8195e893274f7e58c9c8703ff23217d2ca6ab59ab162426728a9cc7872fb329c8f792fcb86dbaf51839bb741b9680a1b2b1b9bc7fdcc7b4ae82f7a1a629e19e53a0d75202231a330cf8c22401c4e664c016ffad78c32537fa861a9a6d164c9b802cc45000a5ba6bf2845d5890e45d53625ce74771a9a53306200983ea1307970fb9c09f80ab73f8343c19d7180334f66525499de879fcafd66944fe57e33a6156edf34a3d81956543963d5294b8b57dacf87758c04d78aa72d36e088a58656dc6f0615724962d72c39315bc39a33f4b2e68cb24d9951a8857126caed6b5795779b12552f4a9ff26d536ec73a63c56486d28bd2f51263b533986c53a8b062c849d00adef46792be5655423f2b471b5bd071e59719ab17ce877639bac08647297fa1e3b7072dc83573e17e2c8b9b1962263b0df733b12bafcfcb223393d65f5813c8b440441a4e4787d6703f969d28e898eb65c3fdcc9881d4a90c29d298d51948edadb27f33564c32becef4c60dee27ca9893b6557bedc626245ed77563738345f6833159cd40d250b25342df510cb3c142d23a8349cff46f381f7d2d3b63356375bbce182c37626e702809d382e38423de496bc399799cbeb45ee76b3e703f96e592830312ed96030bbe3aac3b45d0d09bd7c10191f7bab6a3e76d703f175f9625e784049a4e3090354180070d6abd4108a30b3af811a804a53e20a6e24abadcf64a4ad241951b6870887cd71b105dbedce40641d79ab72c6dcf4e2bdb9316d55edb40ca6dd831b46339687c28f3e17016b7719879e849165448d414a63085b8021515f9b642077de2bfa8a4c50be6baac47a57885bc0c6259c12635d8e2ca47375cf9b814a55c29050a9929d9e006325e16aa53f292b96f526a925b0da826348082b770e1610e37e12655104183329f8ab6829214e5c98d4a37528ef1a4b7d069aba88a48ef3cd4a585d890ceb7c74d3aab9921eab2e2a5d45d56c4b41729878ab3655f71e32fa5f6a2fcfc2ea54b5b7dd79328da0a29e9f69585ee43c5b44ac6ae6736a86afb7572fedbe60c6f50cb5434366850e69b1fe4a209b87484558b1812a3120174ad9ebf90b4d793911c519b68afff015d8e532ed7be5cc482ee834b474415a51d5c42c1a5c3250f2ee150223ad529cb6ea03f84d92a9187922b0c10fb51cfc6db43b7848470b280d2ae43a17ecfc3693a892e1b10753462128b72c6181fa3c5fdc4cb5b3546ee27d64861d99a23ecaa96bcd5c358d5e17e661eba6f2b924af257d227f4095c9252e9082c749f8e4e54a1e8a6876e2b8a2aedfdcd68eb1978597574e46395b2ce18655266bfb81f79c80999f299c4ae8a5dc3b04aa38c9875ec02c13eb5cb2d0aa3f65afb06e5725bd1943e5cea5f57e8f8c92dea549c454f368ddacf88ccea0754816662c47e2c3ed238af086fa431feb29bd17b7a2b8a754bd2cdc556749b1261b1b3810665b429ba798b4e3d74f3d63f140af6d88137f1f130a0aa07d4020eacc20c84828e359b481d9d9ed849208453b8e12d2861e5c71c74c386b0a7e1ad9e5643684114940373cdaa66085ca194524a29656c664b4e4b4e59dd78ada398fd7ac3be554d5bad98203d391dc5c4c498fe9d8e626262564c90386e2bd48a09d2131616161616146ac5040969c5e4490eb6ee64412b9abe231bb7183a7eefa1fbba219a9928668c2c1a1a1a1a201f1a9a6b4c5353438352d2a25b9d3a261d153088564d896868deb751f31a35f633226964cd8c510d8d1194546e30b0634471e4c6c45ca7230a2945428b641c729ad663e8b47717ddd70dd154eb344c4363cd5b3556d7bca72dc809a935d1e634b5468a9e48f338f3103b17977fdded5cfea16ed7f53724ed795b124b93c05c464f1375dd2ac67545d7bcdf0d7550746a9ee6f11a8d655936346f9bf7344d4dcdad6aa3c99ad5ad8152536ba4b0993635b6231a82c2a81b8a2a8d0edd1c74f35a7427fae2327c50b90f474846704f47d84694c1ec24d4de69a8bd780a82371d930e0946b7aa81716b3c74d963e2163534df2c1a5bb3b2a4c09bd349e55fccd13daa594d9a3e4d6d9a9a231a1a1afb287ed4de5143e83e4d0a2a068542d50ca1660843e862626234294be868fe75ab1a296ed89a21c0f6b4ae7bcd696efda744dd5054a1688dfd684763bf0e75638e502b1aff288d7f1d0d1aff7e616e51abf8d351fc51a81ae32f946c1173b4c16d43d25e2ceaba11b5176d6cded3b3868dd738111baf51e3363c1bf7ac1ab7819a5a74245842c4c6719c0435ee9d0436583b31894173cb8a7c69eac65b92f622cc5f6cf3360ee4d3d3c210a0c66d9c488ddbb04796cc1ff15ec3da9842a4c66ddc863d82e3350ee433adf58ea3e5a73efd43ad4e48a7a3d3aa3d26edc56e55536b3e533fa03b73e67e664e052e6ebdb00a2a84810b4727294e2f50abd391cc62c608e8decc1c11c19b486316f7e5dfe908a5c5044515ce6dd80f68e62836cd7b7ade46ada9b194666b3351d0f4ecb628285044341535f4f2c3e988a7e8561d930ea95330f3f07e40ddaa5375e67deb3553741f253a3a49d1a99ac79f8868682c23753493a67efd9adfb8cd67a2b8b302d9d4d4c010a0c6bd23a0c63d4b7304d8380e0be30ccd6b6a3eeb575319a99bdda7a95f77696eddb0b955816edfb0398dcd7be24cbdb13631be1175aa633ee336ea8c29313550aba8fae891504cdc88fadaa69c8eae0acd67ed5bb5e6da4a5b343556b7ca5653ad378ded90da8b9049f7a45333f12adc4fbf5b45d5166174bd114da3ae3fdf63e8b2b71824a5db869dabe8301fd82f5964e3f035ee55da337c1bb5eb1ab563991695d916dbc4906533cdcb5c16c9dc88c9ff50bfb8244363b3f593b57edd67d44f46fda80f75097963ea47636c44371e46fd28aa5bddf817d4eaa32ef58b56dc0fb5baf1a753cbe9e88b56745fcce9e83b713147377eb3a215e9ea421a4e340df9a3c472fde59aa717c7cfeb46fa9ad775454dfbc7516b84750d66af91822f29d775d9a9ed1707c9ee65af713f4c2c579dbacef4baa4d0c73a354dc65fd6f5eb3d5d3304e6918fff8c34e48474f6ebcb5fb15f6b51d3acb4ce30f2f3f43adb0fc8753e9f29657a8dfbc1a23de3846cf73a0b9da758b41f534ae964995ca76559d6afd4ace55bb5460ac6c1bdabdb55aa7cdce2759d5ee7536abf24e22f13db9aa3f6a28a1294dbfd719c42e9a9d5625c5714a1bf3efe848953926e67a7dc8feb45a4fdf8e2846c52ee47b72a93b8eca765af39aa1982c5fd64b3f2b5eebcaeeb7c5d66eb86fb49a1dbc7025d774469d7a150bfe769a85a7345cd527b9ad652617c62f8c0f041f968726ba92f3edadc5aea0b1fcdda5aaa8b8f766d2df5e4a3d1ada5b6f868d8d652597c567c6caa929603514fd0626b96e20cbff3d1b6ada5aaf868dcd6524d3e9a696ba99c8fa6b2b5d4cd475bd95aaae6b36328aa524f524f86524f86524f86524f86524f86524f8692a24a1514941494149414941494149474f93ba644950a4985b4638a0a69c71415d28e292aa41d5354483ba6a890764cb9fc9c5554a9545272562a29392b95949c954a4ace4a252567a59292b3bafc9c2851a573c4c328aa74a01ce54439ca89729413e52827ca514e94a39c283a507818e940e161a4038587910e141e463a507818e940e16174f93c524438389ef7a3505dc76389d2ae43a17ecfa321254574f931079d0d9b4a6fbba003c0bfd493cbbf6ebba0e3f9a70aba7cebb60bba1eff5448976f53e76d17743bff54522edfa6cadb2ee86afee91c5dfedc6c6abced828ee636b56fbba09bf9d52ee8bc1a9b0a6fe6a3b16c2d15f3d15ab6964a7db4d3d6522f1fcd656ba9968ff6626ba9d3477bd95aaaf4d1501b8cada5b68f16636ba9eca3c9880103f52223c654037d80a8d0a7c69d707f388d17adb7163ef4b179a92fab17262f482f54bc24bd387979d21e1fa7be58d11e1f88ca3e36b56f4b8d3e1ac71cb5c72dff768aa0dc8f8614bed65275a0c419be0ece7798e8e82039ea907692a20f5f07a746a953df8bd2520d944e7d3a506aaee81477f93559746abbfc1a2d3aa55d9650a2aac592607b1138afa721e565a97df8282214924edd9c0f5594e00d7faed81ca6bb4ed71e4c677df4ed6cbe93145542910836512274595e18483b2a21d903235c558d14d8e407595cfe4ea7631373d4a998231897778adae3975554d1901267f894ae5e5697af44b783836ec7c8e63676c7a8085ef68131aea2047bd89c7df887e343bb3676a7c88aeef36cee75ea03ba0de10dcd514485418016afbd9bfcc08a1facee0f90dc3ebc36c8d17f7d9cf36d3a456d91b6a938d6b3a1d5e62bdc8f8dd5d1ad704440206d25b53616fb6892a1a4efe9b64af85ea772dce690fbd94992a3c2f4edfb5c85694b438a0f8d2d9ad0ed18d9d89d98a4bb85f0a635ba6d15fa408ec22000fec83cb23d88e524d80e87b05cabf09023007c85bfa9372c3502b3d951588c1cba9da2a8a2fd2237b7f947efe916c16ef32f89d32d7273ec376eded3d86d8ea3ded48fef8dfd6e6851c3b9a6c90d72416c4eeb77ba94f6e99bfbe989f4c371ec37def5e6a6c28ba3c28b53bfeedeb0b11db780791804c07828a49fbda71b47dd2af4c92abc353e1c4697efd599fad9145d3e4dfd6c942ebfa67e3743df4dd27733e5bbb1ba7c00d4ef4694afa351bf9d1c5cbe4cfd3a19f54331940f2bfa30a52f1bbafc9cfa65495f36e5f275d44f5b7d5a94cbb73ed42538465d822b8d6f070a97cf528fb0cfe9552acd6ef39b0adbb3b19f91be2acf2cca087aec913342e5d869edc0757a9ea2befda21e4b2b5940d18247944e7d273774ea4b49e9d4a7daa2539f9dd2a9cf858b4e7d393c419dfa76f00875ead3c133d4a9ef85078a4e7dbfcef93c44ddf93c48628078a95dd08b2ae3524ffc954a932a6c4f46f75f47878eefd8f19c9cdb97ab520180798e8ad3a388c6f93d92e09cdfc328c7f93da238ead427d3438a4e7da81eab4e7d337a30e9d4577b2075eafba107159dfa54499dfa524e3af5f178d2a9cfc66b58d1a9cf87bf50ead4a7f3952bac8d8daa22a54695f9a10e897952e9aabdf674be527da82f5e9c078fa75257a986f88f8f9f6a0e001c2788ef2ced64e14199d182264aa7be1e6ee8d497434aa73e9c2d3af5d54ce9d4c7c345a7beda23a8531f8d1e429dfa7ee831d4a9ef5e88f37b40d1a9afc66d9cdfe3747e0f249dfa3e1ab7aa4011a2ca04f5205119999f4eaf51e3367ea0515f53617b3f707208f1997b6fa7a8539f77fe4e924e7d33e7ef1875eaa3397f278a4e7d35e7ef1c75eadbd991a2535f8f9d55a73e9e1d269dfa88d841ead407e436e7ef50d1a9cf88df9cbf93d4a96fc86f9cbfe3a4531f018ee3fc9d279dfa94702772fe8e159dfa04f0039cbfa3d4a94fc9f623cedfb9a2539f4a16edf16970d15e5559aa2a57b4c73f40a5b1457b7c225545a93d3e012a10edf187549df6f846d49c8a43448de1a9313d6acc4e8d39a249dae3d3545ad41e7fa65224ed11b5c7e771d2410c3da983d0ec11c9f324aae2390be38cc986fd4e41fcc27e32441d0417c4d07db8bbd82f47c6a883e06e619c39d90fb542434a47430a0f153c483c4c78563c5234cf51e589a2f21829a95cd1a9ee7c95a54e09e07c952c3ac573be0a944ebd385f454aa75ccea713e035ec771a7219fba17a7c86fd628cb80ff69301721dfb79d67e36b75fcefd5494885c868a92ce63543a1523e37c9d4edda67c90f13ee3d57ea77a1af643d1f80ff68bf9e12afbc9a4ece7d9380ffbd9cc3cc77e393beca7736baec37e40dc98a34ea9a4e8546ad5291e4c3a9583d4a91de7c73ce9148ef363963a955dc773d8ef94e338f643fdb05f8c0ffbc9dcfcc77e9ecd87b09f4d00ec97d3633f1d20f894a8533ecea7483af5e37c5ad42922cea7493af5733e35ead410e7d355a77acea7499d7a39fbd8ef74ed8712c27e31423c08fbc9047100d8cf43d9cf0686fd7262d84fe730f603e27e9488e749e5498a3330f603ba3007a22e11c079007155029ea3eea8bfa938ea69cd2a029ea2a9f3ece0e103881f38523c2c102b3970dc00f19c04a462ba04c81040026288b01f8fa712f093809c9804e048c00d0ffbc55c322c1374c532413b1931e701040ffba99e03048f9c0b2db9fdfe0e086b3f7b1940f00071a12531f623e23c54f6fb79ce537607c54173dc645709a14f59263621aa54cc730891f11bcb44b722b424b39f8faba8fd7e3c751d03e831001d7f31801d430c200003b8d931001df6a331801e4304e03703b811729c5a840e1c02bcf890df0892cdf84e901d415c72e07816240b7283d6b84b101bcf11644700175a82c37e3dbf11044711b7a9376c8c0072ac62d4e53a05a8b19f0e2dc08e0b2d792900ca7e18cd4f05d0b1df8cef28804581d0129d970b2dc92c135701ec979d1ae05d99b8ae120460a81fc07e2e27f25885961c2012f1e831cbc4d65e77bad0126a3f18970168ece73d8665825e255a8ceb681ab55f8eb746fb424b3cfbd17c8616c37e35d7d174b40b2d81613f18a7580172a0a80b7d39ed788e98d92fc7b19861175a82b29ff797e862bf999fa24581d092d353709f78a1253becf7f2cc7e28a1250468b14b86ccf0b15f8eebb838332c13dd0b2e87fd665c42a8500e2e87fd761c87cb8173a125d57e95a3613f1aefc1f5b8d09219f6f3798e1df6bbc7b98e010cc1bdb0df0c4e8817175a1200fbb97c0777731ddc0e1d175ae283fd7cb810dc0cfbcdf80bcea24068c98ba7e03edc8596b8d86f88efb05f00aec308cb0465b14b800871f31b36425c68c98dfd82b88aa0d432b1dd5826b61b9b0b2da961bf1a9d0dfbd9f88e65a2db39cb85960461bf207e0300fb01e036bf6199b8ae92204208c03241291017212c13db55b2e1b04c6c386e5c68898cfd640e64fbc17e3fdcc532d15d2543f7d92c0a8496b83c05f7d92eb4a4c77e3dc7f114dc678910f613e237de1389f8e1e3678800f8dc1e2182000010553b4fd5e95175ce52b5ef541dab84e7499ce1ab6af654c5cea3d2e7d4fe8e9a5d47c59ea3d2e3d43e8e9a599e1b15b33c51b4c7bfa9d4f21cb5c7b7a96d796aaa3d4dfd67aa8c7b35e636aa7d8dfaff50655ca6c69c46b596878a5b9e195586e561d21edf871a6379606a766354eb0b25a8c2161746bdac300406235c548d3528c11338dc976ab1a0891434dc1755897697aaa4e5a7aa84e55c1dba8f668fb08ff6ad1e691fedb10edd87c51e893e9a155ab2627992da63cbe30426fd3a76a69f91f681161736f1c115f75351d27a7ba7e0f5f6f806dd7518d3a9b620e87b8cfba1d7fa715de729ea148f515471e7797299e7e8f23f9ed5651e2493fd78922e77d085f7db29daa90164285da7be1aa5bb45a76a94a26aa7067086bf030a84ae08974fbb1aa59d221a52768a768a68b6530467f88cd190c2948694a621e5f2ce6aa768c7080eddb753b4a3a3a7db51ba8f4227469e130d249d8840d38908d42b4b1c418b36e8f8f0d226ccd5558a5961884ca8adc020804930ff79209f9ee8d315e8ca0a23df8f15465a1ffdb86ae20326f50382f1019bf880c98d4d7cb0baccfdf4bb890fa4b83132179aa602bb55208410427e32838824caa0db1067d06d883288487ab014b50e7430404ce7ce596eb36abc5bfde1b843ce47bc9a94e7eac7978fb5083fb28509f28effc1eac2b8b0091a8cae163793a9c200e16ebac97ea67307ba9aa97e3fe0ed403f7e03fd7853fd7cf03541d3d9c4cd69aaf072d6da4cdc2dce24bfd51f695d0de32ccbb439e7d42a3de47e98afcb3a6621e3a097ed38b6ac302282067df055be032657e5d7351579afede836eedb35de7e3fa8c47dfbe52c11edc99ef6e4691d8248def4ed9f25b9207c95470ec87615fb5ddfb0cb634c862ebefb843c2aff30ed9fdab16b2f8269d8618c7707423b88e29a4eaf41211d6cb203274748a84cc9d83c2a9a86d943d883fec3be59d801154b35edd4742dc2a08301d29dcf07baf4d7ba0a57ded35d8d77a5fef07b5aa5c66bd5258cc8cbf553f976ac16513976a32a941099542c0c90bed8fb62dccf0603840f831dde4f09bed841c04057e38eb93b77dcd52ff3c197d9763f1a72db7b7afb4afdd9547e5858e1cd6a5feb7ae47ee8b90aaf4a6dee9accb88b0bebe74409807410ccacda99127c336ed3e7c455b94ae56baa5855c289cb5de5b07685f1412d0c9020eef6206017f78349da5599fbc16c91be5655ead7cf2a5f8c62db123fe08501111aa1e34f4c16a1e318658c525e569431ca2bca18258d114608238411c2a841083b3a85a6694d185d50707041a15f7737bcb19288d24b0ec519d81dbb235bdd94dd73ab12c618638cb13bc618636cd9b13b764308bbc67e17bb63c36ea8f5a07ecc1fbd12c259af130c149ba1d074ebbaafeeeeeeeebeba1bbbdea7575f66585df9e804f88408da3509a8c59532daa1fbbc2be5635c5c8067a34ec1cb28b81fc837d601ca7b51b5f5cc8773654c128d5b741f7c4244119da2f4e242c7705ee7421c6a2f218fd9840e7e25a5a0c526dd87338f132f69b43eab94524a1cb824a5d4b9534a29a594d775d54cd3b4ab66d72a12d7b52b715d596695c87e556a2fecd77be2755dd82567928c1b78c1759f41773e5ea1c48fbef4f45f39ad1db9d019b91ff724b64ba7f529bfd385d46e3128aaa0bc9cc57d1b11663a5d39d69675c8717db35b15cb3aca759466b72c35a27ba6355cb1be42a9b42ce536ee87caad430a2f7748e937283ac59d5e723f94b332ab18cbb59b4eeb272fe53ace7e1b91b53dc13ca65bfd4248df6e83e25a262efb8bf77466992e5b75bac9c4996e3ae45ed820d6e927af65614cc7bec2c2c29dda0f08777a7ae68470a7d6b721e6a12bef89df06c55dd9b81f2f4e6d11faecda8bfaf1e5585830ce3aea25e37e702f62bd38c6a13016cb7ae15e60161557a375769dbca60cb39485e55ddd861847b6fdb472958cae9cd22cd2eedb3f9595ab1c729c15b2add4af99a396a5ced89a357271b758b4f7b445a7dceed63bbbdd22dc4ddc59de1d729a0d62a267b11f771586e5d95764d09df3badd3f23d735fd5a4962dbaee92affe45d39c6fde85ec4a49d7242b6db05ddcfc875e95090ec199349e5db13ccd3d9cf0340975e5b5959f9c5fdacb0585c374f3b78e97628ee0754c4f4cc5a39573f2397bba97e4041d7f4aed2fa6d1c11f0b27c65a5fe5801b272eb906359b975eb2bef54ec279bb85c4d62bb9bdd9e601c707b628322b3945e7506359029be508116576831832b6ce0860bb9b8b08a1a48d1607b32aa8e588793c7b45da760175547d827a2ae9c67ee470699775a087421276d5cea3e98142bdf1e8237fc38050d8466b0c58555c8200b15c94ee83e9cd8049c9c4e5da74760ac439f25f33a57ca23d8a56cefed490bdb8336380875874e0e77c235dc0967e623007b409c254fe94f70923a1d1c1c4ae7e3bda8c289323bba79e7b58fad2ad3dec4b22c3b12f2da9590ff7c58259a10324109822e8bd5fa399124845e5ea7169c32ed4d1558450f902ee480a844ca97130dca442abaafbbf19c000dcac4f37ba2eac579e66d74813f80bbcb19d8326ab1742618182f2ea75167f85063e3871d3970dcf0ec08e02a22cec387017e85388c2a2107c0615431e0400ea34a01fff17300097cc8615441e003286201875165811f5181238002271281771bbaeb1fce7de93c4e2b7278ad48fdaecd7a5953c69ec901675ae705bb94c89addaf2ac1c01f55f27d2faa30f03e4e5421f1be4e54a190c040a571862d6074f915a0c004aa042c041cd080a2cb67800212c03f80012a8c3305b004a830ce0cb1428c08c27d74999919ca6566665e5de6a0cbcccca71616fecad23d1c9d59a18fac30ceb01211b8456092a5919b01dc1c2006436338138fd115181c6134c9c06e1950da75bd0367fa4d28153ab63af0a68f7399fe3b1553d61956b0053adc58050dca7c57938e462574508541ecc295fb510a23227543b4c75f8261fbc46b7d8edd72d056e02d633d9088eb7c22d7ed9125d11261a63fc2bf2c0c76e8731dc8a7275669cbd803e7bbaf135520634fe8c54f39022f4ef9389b9ff06596cd150174a30f3346efbedbe542eec2f91b2f39ae342919d5314639e79c12ca1809218410c2180d055936c739e39c72ce182306e195419841d49c1342786a0f5e461bd9ea29e3942919fb7241346bce393fe7b4b42d49ad29aff9c538639c94ffc5286394b2081b8411c248e7b44e5d776a9157a43d29cbf6a09c4c2984d2728cd16b4fa6bd96a9489b274699c5186334d2575ac91b8c10469a2305745e9363e4cb98cb3011624b8b135a34c0c2d204960dacac50b1c281ae6342d701159525a828613229c1b404c721711ed8b6246c46340d09da07b2ec081908308c09c604a553d026aecb0857082cab089608ae357904d792443822e31048107b49e4b314d6a4bfae292d8b9338295eab933ac98a493149caa4c95d06e2ae6bca2ab3a4ab887569498dfb9913886519894c5281d925ad6985a5a5631666c91c934e2e7d0397172edb0a67699aa4f430b81f4ab51c1c1c8deff5f24251d79412156f5f178c1019434eb949696d2ccfb3ce164ac6b3c189cc719e599e8b9f8cc12df1a31db3802e976195f96a2fa29dbf5d8bd99813a29daf450d86fbd9ac8e4edb34209a3d5999c432c2294dd77b3aab50d278c1881163d22933598fd68c32946e2ff1237f5d6ea898cbf4e0c5454e96131321f2111f9d92b06ccb4b4b8b1334c0c2c2d2840dacacac50c181aeeb98d001151595252861329994b004c771481ed8b62d0946344d43c207b22c3b0208300c63c204a5748a26aeeb3242082ccb2a8208e6e4d5082411a43c1287102309eebcc9ce4bba9db0b4b959dc123f4a4ce7b2f67e70fb5fdc4e3110477fab2c14040516463a20e508167d378985e49080511ac040f26a719b9193705191a9ce17998f739ae6dc382220906919c985059df1c254f182d69cf32232042a65568f4ecf8d72d9590ad8c38ad98cdfb89fb9d578fb6a0de52d4eaa707c39296d4ec4c1b11ea7a571db8e4e9ee396f889e76eda24dd4cff50a6fa388382973b175564656ef33c8eaf85713fd6123fd9e961c6347878071047ffab1c4dff607014fc839ee9c73ef7f907b0070f01def4fb1c05f3b0148ca3df2f2eec6e3e82f3b1ce1edca5753ef7c5780be86e4730d28d662f925d9eb3cf8c45ebb2470e48664f516a1d6f14cb4cf33d3256dada072e604c58596b100212ae68e1982cddaf4be55c2b2d22528e1459584d8ea46c403e5f77653c9c0b7f7a10034384819ec007da822ebc8f363922fc8f87ae94b363fcb430f002c9297d6877cc82b684bc117aaf43992fae6a5f8d2b43e125ce82cfbf2c67c1503ac5f61f5b866279a9bdb8c4503a056fe4c8b26fdd5eccf1880873fcd74655e8b4b62ece1130448e68969fc49978cec210c132cb988d44403e08807166cbded3da31209ff79b23a21d8371869f7cac74e3bfe8c599eb902300fb64161567ae258671e6822102394a04f279823dc2f4a10f1101d8678befb6ca4b95a12c75123a5e82b0af18ab70eb1a43c8d1a40477212528e85a150688f57ec3c0bbdd1d749f321245152f5937124515f4a144371ec5d585349cb080acdeb0a0840a25494a9c2871a2244909152d3f2d19e7a99deff6669c714ec9344e1aa794534e19ab9079d741ef383636364d9690d0503a4649447bbd15d15ed72f5eb636d829aa2aa267fa94eb07823ba4bde6c9b24be6313dbb057b70cf7ec11eda330c044388c07e1441218e2cbbd9fba66a411c22b8d6615f86dca6096fb2fb20c1bdb26bd7a6d58f6a472eff997d13d7dac046c4906e56721d72d7dcc0762d2b235b4628335a3ee039741d45f775b7e9ad9289a3d3deb451d5c56e14ad5d3ce49fda6bdb5fa4ed9ddafbe0e9fbbffe11513bd0c1d322f44ae67b1ad5d0a2baf6bae9103d333d43743de8e0f518141474e3a965f1a08bef6895cc5bd7becd07b4a66aa62bbcb627f66f5f498012d2386fa14e45f8d4da8a6a4f9ef8f01c19429eeb1fadb076907f315f087b9c509de2c949ba431919e19074fb5a1725075d0b5af2515cb7eeb0dfdd822b42d9605ca28df1529c695517675ae6a1fbba2bb9e83e79e195c4f1eae25abaf034c6d81abd1aa3d908a2c8222718f703ad183a885261024e7b310695922b0ebfff75777fbebd78a8eae04cfc65bffe35ad0bc23eb43a5e7b51698813252744402743e4207e48a73e9c239e10e9d4076116375eeaa093f7c35943d772a11337c400ca04428c3136bfcf320c1a7462d4c4075b5cec2a4217fbb6554d8bdb3faabdf3a59c0f6abf55ed5d711c3eab380eb99f21db215700a845ee0746a38eefcd21f7c33a6c8fdaefc68fc46f67ce088ca783176e71fb18ce635c57745f13d748bc36b7b1b43d9b33f78363bfeedad8efc6fbefdab597e390fb51c275ff266eb4f28d3af86fee754af3da639b1974a8771b3a996bdc1fb8b40886c8f696b7d823b428cef0b70311c5991e42f7ed144dd863073b3ce09d1ff04e107867089c3a9dbf6304de4102ef2c81533ae7ef388153386718a72105555f907420e940d281a4034907920e241d305276ecd8b163c78e1d87393939393939393c827804f108e211c42388078f542a954aa50e53872a954aa552a94e89a20a88a2a86a89aa208f8989898989912143860c19320e630e655ce3db52855a1ea40a2db13910df2952428aaa1d43434843484348434843484348977724c1488191022305460a8c141829979f7a12553ba6c4193ea55d8742fd9ea70a8aaa1c4abb0e85fa3d4f85145539515452a28a87519ce153da7528d4ef7994761d0af57b9ece5154f158d281125529a238c3c7c1f1bc1f850a6de8fa534e960b023eb8021573ce395b5edc7cb5ecd9cd3de79c73ce39af44675973ce3967cf39e79c167dcfcf39e79c935ab3add9b7bde66e29691bc49014a583967682df26ed1b25d39acded07866118760ee320cb08e5656d96f2affad51fd900e0d5ce5448f67879e19985ed713eb0d39e88f5440d7664284dd7e1ed8917944019cf2b34ab3f9d746dd39e65d39e0521e4e25ae7e6e79c734e9edc8fbe6c91884294c93ca1d0f1238ef568bdf62c8d2d9c4e5db7be0ba77a4017decff36c70e80744ceedeede6c12ed590c93ee5693b09234fbe9e864f6c3c1f17efb751e122d45f7a150319099991946b91612169452638550288193bb750ad2f6e2ea6a6c0a0dca70d40eb3ac7d70d7a555218de9ec48697b1d21cdb2ac7d6cef5bdccf766bd3ea635c5c8891f949a0b872b449a4b8b08915d9b6e3077bc6fd64bfb8d0ddf2fd93e5e800c1f9e08b83868ecf4dd8d348dc2f3e09d4ed1aa3b6713ff8d79903c2cdbf9e6d19ec6a3a57cfa63dd9319ebe6b3ced3377eceec8f988694f76f4c00f78bb539031992b6db6e6386e83e2038a7d23cd7d1acf1ce3390e261e32f743fec7f6d81ef801ef669568ff016fb4db694c03c4d9a84543772d3b2d548a2b90ef2997df7d79b6b43d68618f78e7bc13766a8996f232cf127c6b5f097b44f8c864b0886edcd15956ab26c58a2611df22acf29d9d4f77aba04114f77a76d100c986a95c8e11b9d439e79c73ce2fbb24c23e89dabbecb445b0cf5f56160199bfec2c6a2f62ffba893a5544d41309bdb8ebb2df7c91ecd83124181603c3ac9448e019ba8ca8533fb263d7b0ae3b965518203228685e792107848382fa420e084cba1790eb9dcd2e8637d8a340852491a8534a5c1e1f91c430245dd8240cabfb4922aebb66da5caa44d233dff5f94c12cd2a8bda8b45e6b398bd48124924ed4523e21217768638b0671c90783b10f4bdae6d9b867de380c8db7de382c47b5de3961c4dd9652511d09544511589e68c44b64fdbd5246697f8c1d7325d568d37c0a609b3ac39a79559b2f2d55ceab565979dda347a51252ea7bf6294b85c63cc05cbe4af2c9bd7625cb020d6e535acce5fd79c32060744defa9435fbacd62feb6a739392fbb14ead1a6d2f21e59360b75c8e2581bad6b4fa93e89c49e6b05b750979914822cb4e243e9c0fbe93684aa24e614a60bfb2cb2ce360bc0530b3053b63dca93c768e5aed5a693bed9c939bd3ceaf7cd6afba9c8758e6a41963b085e10be6733ff2a22fbaca31c7b884011303e65a59b1bcc21d6366ee1f63dc0f180ac3c1b0b0d82f89edb2265be6ac3cad3c14a3b2c0a8d84f2cef582eff6d57da4b080b4b3aaf15faeed8b983c152617b2b2b160cfbf1e415a6c1fd60944a9677b5fb4afd80eecab651cab17467e9de13b5961787ddf989ee05f7d3b558d95ecb276f0bca6ec7b81f29ebd2dd3669adb8db2fcc883ccb0a37fbae1c63b956b02a594a89596904fd8ad6dbe175ec922d2e3248764fbfb6a1213a25bf1d6e4f6c50a0b81f790dd1de26572a4b7759bfb911a17ebd58a12b3084a060d8af57ae6e8583f19e5ee92e5bf5f2ae9b54c2b041a695f4b230dd598ecd4bfb01999797d7b721e691bf2c7678cff213e57ec0b8b445e4578ec160993033c63ff963bec805e3da8461b9ae18f6939765c26089c1fd60b24ebe94d2532a6fb7c2622511d13684aa2d7fa92e7f51b19f56e48a94f67acbbfd3c4ac90965fefe9795a3172cdcb26baf1709efe3ae4586c106ab70c26fbca31f995eb9f91ebe3d339ca7293fc0bfb4d22d933f42da74b9e05c3b0c3703f9875e7bd2e65cbcaf595b3d40fa808fd4a877dce53fa03c332ecf63ddd72c84d78653d595a9bb8b326b1dd969ed8d32978b70fd1a9956f2c155eada7bdcd6e1df739b726749b76794db3f86e9208a83b74f293449208ce44292792d22791cec4219a524aab5e5a966559d6653ff9399124845a96754d69c9292d2266993d4eae0045d4e28a78459cf10bd695b26b4f5a704e9e1c9760179f68da8e2e3612a824505046be80065d343abbbbbb021dac220a2baef55fe61ea2bd69f5b4f5be16b99fee1ea2bd392df9887304112eee7c03fa3d19aabaa4ee8350eefc87138109853f9f33dfc5b96999f58e7654b6eafaa4dcb3ee6e96fd384b27ddec473b0dcbec87ba589c993f5854c537745f772791d3ecdafb4277841dd286ae2d2e605e980217f3d307df38864ede3a335bf0083db4d8628bb2c5cdd7c5d7b5d43d8ac1ba6c820665be36ba12de81efb431c6ed4d2fae2231af5d893929a59fd59a3d715eb53fdb7e6c7d1c2f0345b2fd6866836410be0eba8ca7d3a9ebf23957be83a20a769f862d614b77d28a798171cccf5f958b92b8a16b239e52e4b4385e6ccd88e23074f1104a68bf28cb70e3d770a91c6e3cdfe14696118037f188999999990f27f7b51817173a6618b9ad947736e9e25bbe83c21d92ae3c2a86e713baef575e7a3852d0e0d554e261fdb6f9f83300c83ffa97bdbcd0c100e95fef5f166e4f308e7858a38c4016b3143468d335b1c20d1736b102e7c22660d88316d1622b352d849446fba1268daa1928b519b894e3db814d607b7d1ddaae539046d5901869a4f7e2b42151e5c519794aa1125f2faa86c019794abb0e7adb173aba759d82967765733f5d7bf39447db8fc2f6a4d5565cb24cb1a09442d80d6dbab95996b549ad1bebcc9e7bc530ac257cb7265bd2f658c200910c442f8ba5e44bb6130c3425d78526b45de8ba7628a3b1cf05aff968b5837c340821338410e2c0b841ee07b792eb6cd491b6179f7146c85c24da4b02e74a08658865d92470ae9c5f6c42471f331c49e9dba3bf46b91f0ce3d3d8a4fbd8e86667a327f49cd4eca453ccdc717340f8b03d69e1519c89b798b4172b47d15e3cb15114ba0f2e19ddf806b40a1567e2e5a31223814fa068140be97081b345c778a845035a0a5d918e0e0e8ee7fda8a55945072361a495977fea148c150ce7420ec2951fd1f3032ee26594d224842450409b1a40b9b08a1a28a13aa504fb7cccbc0117dc37b07cc87fa76fbbf093fbb12c6beb4e5d30413225d8b367cf9460d7380954733f289f25d69bf361fd0a62bd4f69db691d041800baf0520e08df82d62f1fb3ad4535b6d8b298df6ccd9ed6a44f50a1d9a994cf2e336ba429b546fa66d76c91ecf3d4527a2a29a5d9d454f86a7dedcd1637bdde67c84f30149da24d6795d9253d0f314f6699a8f909e6d9de594ffbf5a50cc5eda8327dda2d484f0b43e959083d1ff290d53e86e26adc0f95b32dc29fcfa8a47d15f983be48534ae5a422cbb22ccbb6292d3fab3cc438a67553e58e554d8b1b3fc13c34c3b25ff6cb38b330dbe735feccaedd9ab1f858f622979565f6f380a669b7b81f6ddbb22c3b67ef69be3e5538edb47e462e7d5679bb56f9870644dbb4f7fb9aa5d72147314b2fcb4f308e39271440ac0203292714db13d6c5abf62c2fc4fc07bc2ff0c6c2300c6b197202f669b1b10b1d844209962ef60f2611e99405658822509dfa7815d3a90f4eb9873501a53062a90d68cf5279871db38ed5be910b9d91fb5d6fa253d9ad1fe1a04e71b7f8aa44da331dab47b4675ac16c11ed99b85f37726991e30e579d82d7f24297fd82ed65f6da8e65cf7ed50d8af62e7a11dd0fa3db138ce3babe61bc61b2bdec9ba5edc10c7144a7b47a447b0de8d4c7525cebf08a6b7a4f54a1b4d3ed710ba6b3149dfad8a8ab746b4267ba51bc7593ea5a17ea0e1a4a0e99bd5070c6ba7096aceb425d9dcebdacebba2eeb5e54f5c840ebd775d10bab1bc77187dbb98a04766dab4a60d85695c0b06db34a6476ab943e3be4308c1e7b462feca21747e63a9e6bd3145938b92a1736c9e20851a98396a6c10d36ab687d492963b466fdf8303ee0e385b8f1b21681f1415cf868e118e2e5993f39c2a05342e5d288850e1e26dd39ed67dd085f79ccc23929c72bed145234b122095cd1a0ccc79c61da76d97efc6d9dba54def27610994fc56ed6a37c93a92a11bbe80207082288442089268488921c3149b2a253ad45a7fac67b9de2644e1ed75dd9f5eccc0171e266f73a75fdb219170ca4bb42a23637c96156898b6e5ea7fa924299f662acd7de08baef1c04047cbbcbb7ac127c2f88c18e3caf392dcbb2e675cdc2ae8e5ce43ab5ae8b5af75ad74529bdf84e1f9692356166662b24616666666666666666666666666666ae42eb38384983d14d5de8040d6ab81ab49074ed240d2b15fb7ca8982110c810f58996b494c48f5e6ee24a087b6096d2222dd7aa45a40541bcf3f4422e888d3bad9210c8948c1dbbe862ceb9045fd845173ef1734e56120f390408016fb1a1680651aef533bc812c31ebbab4e63805abfb50334a896aefbaaeeb8a334aa1eba3e8755dd7d56f1974fdcbb2b18aae2dfb77d7ba249b7adab27c689d6020abb32ea4c610460803ac91a814acf7a451cc3254230000000000e314000028140e09c562b1583c5064611f14800f94a6566c501b48619252c820630c01232000000002000009120022d5ac151ece860725cb82b0530ded4a88a8c2a3e987870e7aa3479e882797b8aedb64af8d76b30c7adf8c3ddd8f232a6ac3d11cf44341591a8e8012a4802f237952c5cdd5ce49a6b8f0bbc6055b1a9697231f29d3adbfe24baad4ad69ae3d19b280facb6d62b0aeed42d4ef4b9594073b645e7460e59cdb5706b6191c7f4ba304a8dfc2b251d72fe50ccbd8476869cda875f8ebbc60b804364facff0d74307f7f6a7482b4bd8c5155e1b923b715b8583520ad461611642b7caeff94a4856e0484c23bf95de137b8b9cfe1fcb7af4b6488647f88718a25c41f91aef69d59fa7f2bb5c13312e2e266f338cd7476a1b8ea026478a346fb23c28930cf892bb0dd8738fb555910bc3b63be929e365288a7d726a802b95f21530899afe444f070668ab83a75ca80283fcb20e13eaa85b4c8ede5152c54bda46850056991714f59067fb4c44e5007b3a3c4d572dea40c1962a7585da28285bf68ee48eb4f2070b146695e3a119f81f15534467dc71348cad5b3e657fbb8164e983f075e78d65df11cb838b867864265277021b91b183a0ac8bc20a5e9b5c08b334710842d86b057970899085139d6f40b74a5193a729beb9e5050b6dec67ad04065af6044c30928c75dd4650b394067f23e0618284bee5c307c924639f54a78c77bfffd8ec3d0780ef49d92ae5bde7abf44a0ba31b0b3a93f32bc6bacb7554ab4c6333a62fb1130e333683c7ca8edf7594c15303bf691971533001ec9cb539577bd5b3ff6ba4656a23a79e7d42da6d5959c0e09959f6131d3a0eaee80aa7472b256ea148851af104f0c4d1a9309666c115f9e9d1e5fef9bacbc291b431c5ce6a326c8ca2ee1fc4bd121791a283313e508c5797433dba0c7ca0f28f0f4b6d0226f18ff83e6af44838553007c2de276ea87026142a93362ceea3b88b4478590fb106b7ebef1cd4003a92089a84e35279b06db30844c65663872fee76de7d97ddc9a8427185019f7a680e5ee637cedbfb1e7e41b4d24f4d3313254285d98c816bf7481784639a54f08b17ae633eb96802a66742b6e6a8652664ed10452d5b0ba55b6bef22a25b6b32769afdde8f9383942359220482677e5e8811f16ad0af3af7f0444d4309157e438ae83b7016d2c84c603c8206033c52601f61b49d73fd390d4345673ad924d7b0742d49c92017b4767433deac82bc51562575e02675054537e2f426bf84713a13afb54c04b97b32886ed2885de3d170252d81182d9e0f7b7a4a093983718694631ca34f9a8daf35c755833001c411ebeb67868a3278661cbff1528756b2d942ede4869e514f930965647c5494e8026240ccadc2306fcaaed11ecb5acf955a88a22a7af6850e0d62b3d4ae940acb3f0ae2800b11ab7df89c5c4bf2d7989d70adc5beebbc63d6c6bba39d1877be15899a1bad20e575ee6d74d41553b2c21836a2cf681ef335e84122ccdab7b81097fb103fa7552119875bf64d73cff70a4beda6566ba764af475281f45f5fffc8f02f7d74357fb554732c5e1e4062f008f122db3565b4eee297b1aad5ef8cfc1ddb42b7a269d65a1093bda99bcada700f2292d85744ef7c31473182c6d8d7c958937b21b01ac42b3653a11621fbd8ead437a948a9aeb66015dffbaf413fd9a298f2ff60170544a6492984221a1fc34191c0a18792b0637cb735d9ca0260ba5fdc849e5ad2202c9529b6302103787971eacbeb1d9585786cdb01bd7d0abb103f43733006d5124e34f04e7a089cbdfd08ac375a9f9c5c8f540c70299983f9971f54d0d160ea3dc2daa2f49dfb0f39c84922c3a240b27ef678f10026cded7c03f1de9091d64e9f93f0a54f4cfe9b7a885703f057bda528f715dfed8e792db8e019e802dde53be3b74f3e655aab9c62e69c085d3c70eb470802dfbc613a0c42e491fc1d49898344e90002be002c8c69f0c03d1f55895f97e7d683f051982c53f900786b51155e9789e3720682c33380dd198c34c32c53d54d73b2428d8f693ad9d616c22db7b8b0a94ff5640bd66a163d6353327d1bf282b727a63c5fa9a1393d5ed73fdf51f9e330b9e393f1dd50b97ab7638c4af98d031c0f7502aa594ef4325c9f5e06bb5b4056f46321e129d6932e4fec72304472879874aadd3d40ba858c66157ddb0efff15d8720486aa4671acf3a26c13c0dc8412669991c0920c47a817e740620273d0d1d4b601d937318e5f5ccc6dc33e59361c41eac4679da6df2180a29091caee4568cda48c2c152a1450d9a67c335341375a198ace0a9ab76eb9656e9848b033192df2965c7e9546a1c2eac4a6e5e8ff007a214e7fd77bae32d3cf15a4493f5771b6e11c1ad5b5d8c7cc5b65f27f0a89c7578d3e8e8d87c61ed9d2370552f0422fef003246544d8b3df7ed598185619dd943ca1c8c19347b1d50c7a2771cf1c49d4e92600fc6cc86164c383bfe7e49ea4589ec743840aeecd9aaedf809732ee565fccd93fe295e879c7d9dab47ad570d57a520fdf67a8600f7c032e2fac33c7cf4306b0bcebdc56e35b41719357a7b35b1ff9f2d24a92ed2d9baf9a8a5cb6a1b568b7bfb70eb6bfd4f71a847a0e613aeaf016ccd6c29d280522bc84d8bd14f3443fdef14e969f94efb09547e8d3af6b70a7d965264fb7e1c542b39635b36897d1a427d51389cbe52efd309b014b93ec7552800bd351daec16b686da1af7a2dc8c66fadee5886b0809fe45fbd6a288e9780ffceb72a7373f47742aae8f277b9c0c09ff57a98c24abdacdb7d2eb433c803d5c90765190f40983eabfc2c5ba9d702ad236b0deeb5ba44a9376a0a4a82b1db0884e7dc67a6921dc4892bc86e0e07d523dd9f3ab6fe56c6ca686bdb151dc9c451db1f668850f58fd3027ddaefb9453fca2d28b446bf1826d7c6ecb1e2996378ebc38d1bcbb7c025dc008ec3017f66d973e87420b420ba619e7a1f2a81acf8d515846e835d4deaabf13e767c6584ed3c100f9690b302cf2b798268e76d70ae5ed2cc2c746190259dd6d111b29ee5249d8f96a8598096ff7654ef495e668f687e671e3e8c00eaa69dfb4e4442d5b14298042a46cd1d8360d2a67f5ac9065e81299f6c52573a0bd75f61b79c6a617d37f8d2458e6c63f63769ad770720c934d8f12058dd33614cddd31f0581f8a245a026782d288d3f005b8fbf80b30649fa5da91700cd92f501900fe8c6eee68cb5d9cfc5ef7528fe05431191de7c0f4efb920c1f2e27bedd7eec7fd0e5cd6545a6c6e5db1f304e12849646308205b5db1c9099362b2b703d64586eff87796f2c59111c9195716683038280c94b64751e4121a2cd932645ec7cbf9f234f8c8e370de6b83fc4b5dbe4b05fe54ca706c074176734bbf8a5e16b36447ff926d1f7b56d7e8f28930174a4fd505ec819b1ecdd7f60c2f93f5c0c6c071d1f6bdb03522fd4d7f58c279e7fe3e3570d3055779e1dc34295e8e439a00a74e4205f843c7801801f46c34ed1c1686b6516664418ed261a32fa72f0ea66a63e48588685b6badd53e2157b900e3509228bf203f90ec185da361fede8a292a510e433878f837348a7836b78e0fc34046b1106232fa0f84b1b01caebf28df24e0a4fc6ae20de4546314ab94368a42d878974707031cb5fa82d0698bcd9fe284c26918da4b5c55e0f6f32006fed7edb2e61b64f44356094736a4fd548e283923cae6423c65c057bf3ac295bade0bfbfa365b491e386b5062fe7ca553bd09582bb05b0f7d1da9f260608adeccd321b49ee16cad1e4cc36fcccf21cb0541f57b40aa9352084490c137442809344810ac94bb67da97643335942d83eb4a87f85a9b629eb23ba754f0c17102ebe871e65210264fd53458f029787dedcf9944b96c2046d6969d6d75ec1bf8420959373c9335d17f3d18f39b899b83eb9a2613469b2d32bfab6aaa6d0757523233afa0843c46fffc3206c34a1088781d9d4b50c75cc234c77588249ba02e641b74e9565d3e235ceb3688c4b84e86789656bea55b15cca5316164a9bea8e598b140146db8e217de89bcfc8d4ecc978a14c9793338f21b452469e2eaa7f5e0f5dc999e97f1f65967e55b96c8435a232fbcac7d54ccad91bdd5212ba0b90979cb0ad14da9d5ddfe6b5d09b70245e3c08c4d5af52e201a7dcab743b2867116841fc0057480f310bbbf6c000c461bdc5ea5fcad865f80b7dba94b194b46c2012af708345c7a4857706e052db9d9e7390a1b15a398b6ab46b188e51418dee621e82b5000fe0f1cbde95107e0d53a81bc5ca24d1247c264904961f2c1dbe20f78854e20d53f0312e63582e847936bb7e985f0e3643c32fbf4cba20402bb9004b80288853e1d7afe9b29b6ff07739ce8a8ade03f1de9c72cff12ad357c39505ad318ef705e6e7b778cabc816225def07aa3892125f403502a4dc7070d3e8654a39ff702201f12a17dc72241d07c5ef8c9a43457aba98a6fa6d4d02b2be6e78a81b7449a5cc425d4459f91df22ae4c05cdd9c1aea4fc0459ce9ea81ab8586178b5c3fcd6300b0591e086abbe987a95a06be16d81886d7f77daad19cb627034e93ab4b6ac4ce2eaba58266a763ab6f9caae3ea18b7f4a9836530dd875165eb38766c24acdb71b3e391fe824e615e2c89bcde96ccfae2ade669bcdbfd4e4c176682332b8f409178a64193a6437793a7237bcdc729d024ae53df13cffe824409d9256c3ab62551d781ab93275fde78844cde619e4fcda5ede4cc20d6c7fd4468568f6ebf315f7053e690b12b4b51339a545944c3d25a7d8f10438d96bb999a62e4873525b444d2224aba0ed16c56cb96000f4759a2db8ee49a09e3ddc2f606b4ce3853606efc2968514823dd5f853908814302a2a8fb0f5a31a914e4e372371e752ddc62215dc98734dff09e5172f786516f7c47d2809926308a6633889262a7660efce8c010903448ff158fcc578f815d4635ba81797463e73f2e18dadc4ea5b1dea731f14b7272a4598f5713479a431a9be262b14939135865b31cebd6cc1822e0d6370b10612962ca854dbd50464746ec58aba179c5836b312163f74d1ac0b9c5ee7d6d685395d9b031db4bed08c09dca387255b0fa4e52864685a0fb67792d5a8368a3fddeec29b224aeaee913b33deaa46701ea4ebe0673633ce695f7d992b9fe7bca2ebdef31f5a9836e7ebfdfd8372d9d4c482b038d172e6a815a410f3dbbba76b06c91a17491d3f3aaea78f3980a9cb6e5c4bfd6b43bd2f29d335d2403638036c969079ec061f6564503f83573a4ac4d19dfb8b1c8f1125e1502dd1c6ac8a66f770813e95123fd3e5d45395e1d6c7311752ebc6fd8d0bcc69ac914e50afbcdae5e705466818ca8d00031c6bc21b1d4998bfe8a5063ce7b8bc60293b1c7753d23a626422a3cdfaa37b04d34183a0f4b1a33c09e8913d72093a208498be7738289ff6ec4df209175a9f1e45979157378c4fd2e46f2affb51a2b2198bf1f4ff99c9e2591ad13a1b3cb120c9128f2f2946384bd0f74e8f4f9c62a8469b8b47b7c2d58ced6ab5141d51c93080cb0c67ba8b673e6f25e4a69755889d1a674db2ef94e7101204c5016a53f046cc89c1bf6e503f937a817f8c1064f1c92839ed9d5bb2e5fce82d940afb1cb2a606ee71ccbc6d740d1bd8f302bc89e30b61596ba40ca96dc1d9c2184a3a9e429a10df4265b67af7da6111eab5a3e7356e27d106c585303019f47618a8a8f6f1938c81a605262adf057d27bb7880cb26f1e7299e75f93d16c1bfba710b1c02da6fe7ca3cdd040b349c2b260854b3c8e035f1568662a3eb1e5cea4b586f99a6c9ba96dc62eca2caa183117f548ceee60983f846ba7129264de54cadc23240c7685087ba5ef6a30079d3914fd9a291fa35cd4539db9f4bac5756e7ea97747d3a903ffa81ccf6bbb022cb0d156d2f0268b87435cffdb048c5a853b32c20a7d8bb16ee6ae59320dab2c9a17934366696f3085fa85c4668798db4c5eaf5ce2eac08205972d37621456280f470603fce5c68e9f13803c96830bb2e6f51fb2e2ef8577c27c58e0c3f57ea8cfbca152237a8f00c4345da3ff7e3ddf945423ceab2991ef03bbbce0b4e73ab6c79f1197e7b224c609e20554518f345425fbd72be3692e49012d3514cb17a1fb4caddc7dbbfe7816d1fcb791764a2d1d776ffa641bcc35665a69f6694145ae7636782081dad9ce53170d25be6d3f255fd27b07bdda7947e5c0b58afd01da8151ed8a7fd8655e69cc2a96e91ad83f93ae5e69c229bf95a969b91754c583cbf02bbc705dceba4fb8b07a4e137fc282e8917082a39f1f2daecb7695f8bbaebcbd74d34bc8808fca38376ca5dc3386f2427b23ffda37d4d2ded80e25e408f82c329bbc7989b74aecb86c5cbcd9a8873570058b279edfca0c35d714cd0c9cccc0747ee7a1125d66a8d947f785d79f40064b16e70911b08f0c6b3a932c0f32e34c2992eec1f2a80ef3ad938ba232882442c26f3421a42637a06941bbf3a17cfe261e6e159b62ca87734cd450ec5037e36a98cec4ae195bf1f6e6093a806833b3da99200708179c5d2a016fb207867d4185a3c003359902cdb112e5f6633f7f0a034e2c25b25f3c7197d341df77f62b84dbd60fe133797398562e1ff5d24268625155bc54aaaa719292a68514f28e6bd6d024344b7a7a7ab75ccbdb5d02e6f86a29e79a670b56618c9be66079e6673b5b0ff78b0b59300fe5d08e5f5941a9b94223ad2e963e1f4df0cddc3af6b90a7af336f6273b7581fd06c5454e4b773cedba6cbe0783b27bfc3c65a2ac11e6a6b681eb3bc713c560654d3fce49367b549490db5756a649dc5b44bf5a9a2abebad85b8741f7b8fc990e4357e2053831bf65b38e6a44df2cb55c3b55d0083933101c25be3b0ac929faa0547a7e524f7d0eb5fe0ac18f01e1a7e9175383e7a12c9bc26c078d101bc6602ef59faf06ee2217374c9649f1b3ca6abb48b3581a83c0e9a1aa7f87a92dc47ff255b7640b4ba7c1ff8091ad42755e556cbde278c60a2b85276eec4e6a6a962ede2ebf7af1d29fef09e7747c9ec91b3201a6a1991be1bc7606236d65829f2349e0e1ac9310e89f0600340ebd5838312929065949efdc62218c0b1e1d2e8db654f6b1e29e4e1ec5773e154cca4612b7cbfc27ff599f2719e1606a016d815486716c29f8a60ef700b326c18fb183cb5a00fab851df428fe084121209e64036bed514a8798e446186529866682ebdb27f7a4085a4ad2526aa44513f29cd1e2f7f9560deea4dc4da86ee4e2cbd4b02c8e45a4cf34341efc2c3830430f39f4124581e02739efa9e5fac81e528f831892d92a78a734ad814ce55258520abde3c039923a7570aa44bd08c28a15732c8b4b5984f903651f23efc0c10ea0912c9a8fb2e4b8f4f537929cf71a4361fc86ccd0ec29025fccaed2534170a78d282d00dec328d4f309f7c5ea1d1d243d484f2b7bd85e1c353ef6c434f3d46c6464839b63c2d7601086a6320d0f58090b7a485e305071950e88efe104b583ab1f60afca8c7511a51c2596fc91f1da0c32e53e654a0c84193b2ce6c2256966dcfbcfb2f3ab4c68ee84b8e08ca86db5ab4125c0d512a254d150528ab3d31ee031a098a377d505d0833560d7d124211c549b195c2d867197ce2a87279f7a6d8e237b25e14d0b282578925a325f2d0e73fc814a16eda032bf8d4ec63f73fee3a34da8b5ba1ece3161c433ffdb4da9100cee33f99c1e815b070ea6507f34eb80ab2396dd34ace021c256d5ac88436525d99708f1d7a3312df122df65981d5340824dec1dcac4400b1b94a502ff35b757e22a839e5f581ef6de366c5e4fa051b21fd76c06ba0d9cef2d979b046180db702fb041311ab3061a60f3c77db04a71da6615977da1f0d1fe83dfb5d02c606756071f0347f3fb3f7dca008fa0f4153d6ef8b8ee3564b821f1ee24b291632ad8c3cf9d91dcbfa2347bea53006eabcf360500d1e8adce49fa3c5216da689cd9c0b5fc1681655fe8d8247872b4e9e2bc4ff4b1ea5b107ec89b00a64b69edd2258c6288df643136dcd93ef87b17c6fc2cd5b122e29abb772565532b72ca58e28fc4dad794cfc014f95857eb7f1cef77af16e03c5f81145ca52166a50ed8b54fc1b2350e4b45163898ebc030bd127cdbba5860fa198fb92c00bf4e8c12a2efe94ee44e05e7b885bc9f5f804376972ae7a8eb4b82269620aa6e14f648ff1aec27909b086ebec149a68af968fa7290a239189c2b0670b758d090875e5663828d740c5a8208f3955c02ad63a7ef25bddc6f57e6636056c4dbaa3e05b15ca5ee37ff8db31441aadc5aeaa8c3c9724e26488e375b8a9969db89536e94dc779cac9a5a3edfc6c620340ce8b3fd90127d8d8541e9cd0674657568acbb1a30998f5cc8783c9981977f0128cc29f21d0f2da4abd5ee42a230b85b216375f888680f9972f9bded69da4d8aa1f092d00ec0abb494c71000c669b4e3751519e61f8b3a5e779d9712e24866e8310f643c824f277ad0b1b90d9f3a3007c878a01470de4ad4745bfc72762afda3a5e622381ee1eba3019bafe9171f38310e63d7a3712e1cf89f0276134329fd305fab8f884df406e2e45ab8ae2d779afcd0be46fb69a1170d01d5ab3d10536cf9d5ef13516f6014c1de07c381ba06d8d1d0ae765604d802768ac455075701722a1da83777fb984986fa209e5e8cd3d1e526a605e7d5692d58745ca957b7f871a6cdf996a39741d7be36b39e7427b0013eab05b92d6dbfe599c256d6b22dd74a714bb9c6c6b7f0e6a8304e863f8ac5b33602e3481d7fc87013a2e2c1092e4a133829ed27efbbb287851166c361dfda7e72672da62ebef8b37b96466975f028a234bb7a16cf454a589ab67e34f282d92de1ff240ff3a85119a94afe877fb46d58c6f1ebcfbe5529b8605054a71f16c06690366d8359c21543b96d3518050cfa6a5cc2eb889bb1f17f759fb87d5dd7ca20fa9cf7b401b6a37cfc70a2922520d2d1c32bcd6e60f5fed8b15eeedd7a6b50c8e24f4547a4d2041a70bb0dcb9741e3335e0cb21b0ce737d97ad572228517351ea8d052c2df43f7754c0cda72c20daf2bed144d0e46e1ef96d7f3578d244273f1088396b09bcb7fe390a7f5ef6c614260807d4761aa76ad2f282ec0bce32d6a6dda335c12fc9462ef0262c003378a31dc9244b75a86e475b18ece3aebe29735abdaa48811c5abd86b83a25cd5291855c227a7249f87fe53ad8385eed8188ae4bb40087f2655f98b47ec5fabd8c25f1aba73d08a4754bd43429bd1f80fa05d9262227bffde1f3c40aabb8ad370116b5e71315d9be730bbb0cb6ed27a0cd7e19d809d6703dfa01e6554eb5034c27f4dcda950003dcbe8520dbd7f7cbe633d761c43410e486555ae44e2dbc5290adb6c820b7597ecb004372531c15f1629586c1361c5a183568d94f44bb24994787435e7cc17cd032253cea2d8ba9ab5f336b5e29f2848e81592765d2180b0c4818adb7770497fd52ee828731307cc7bc90e336cd24e72196605bf86bbb00ba814d9f622483cf4ea7ce1cb506ce9cf495a5c4855afdecf6e1c95a722d758002c695c5ea170d3cb31314d1be47caf6fe694e95424bf334994f5946923ee3f33e4d6d558647b407f4abe4ba491eac90ba32a7528b5b3113275430f6457bd29ae72ede0751fd1533f4089f2c376b44674c313841ace15c87da8d81a4b23eb7b242f5f37cf058875eff94be4a0e9981c758bccca58ec776af7fca2affeb55ba2649fc2e0a81666708b47433c0c9df8dfa8b41ce784700666cdf26cb4e7fe7026cdb4fff8b4953645152e8ddf00516c5c652a7331005b35db91686ca6837ea7975cdcbce1397d2f04cf1b92289935c39d7e99a0384781002af279f1303e03cc7b0f3c842811ddc0da0fd35265b1f938e8328a4cda8599df4a151df82ebba3c3df81c725d2af051cd0802f2548666928561f66f699276ecb50eedfa27d7f5db08d734dacc22c0f540879400e322698f52567a3f5c032514b3494705299751bb1ce933176aae90f5497ee87395dc5c289e80dae612309c6b6b64baf570ad4d824dc07ce2761c2b1acac7a1d6696b226c9170cd40d72bfd757d68fda55a9bfe590985ef837537d100cc44fa90243960312db9c0de047b5a3bb24ca10374ac1224f7b58c9620334c972d13cf67e5cb61ce6f5f96ee8d8d8544fea884b37cac9540a327ad26657459757d683e15f3ece49d4a62f1b01317d47d536d92129c7a64efda49d51dd4708ab3c8d68633ababc4d59ce48715ab85d9d89fef421cf8af09b4448ddd7248a6a4c176223fbc9785b7b20bfc8534f06951d0f2ca5ff44f255bd7c08b0a969d7248c42917fe85fdca2647e14f7cb74563c64f0e1f705849345ab71e9f68e7fc275518b19c2f46ab6b869cdd03e0a4a2964962115eba91e7705b2f242013eb9517cbcdf0518497236c5d70ccb699d3acf477ea831a676bdcc9f0fb9840cd6405a9848ef94241896d33b0229ebad82ec306e487e92a77893c9d7bce0121623741b236e3ebe2955c2bb39a49afd58a277acc67470427df9c50eecb55ba5a1460446c9a5f96ae0b6192fa5c0c5c50991d82022bd3430819e603c432fca637d560c1079c6a41e2038e305ac2212c856963b60d7aa2ca5c4548a9465abcba2bd3a85013b8589452ebc34885fe720da1811907927b0f43c1fcdcf54aaa98dafd8bcde9a5afbf0a5de5b6dd3b745cf03234b43a5dbf7f067c582f66d5aa2c488a14160bd16bf4b08d918667bc3c2ce3fea42b24876caa3063349d4d955cddd756cc417f1405638385280cbb767a04a137615b0a309fbc3804ce90bc69ce56cced9e204b1984e09e4dfc75e86ec59c31d491fc7fd7b8e36d79d8e7e6f74bf5c174f2d2aa1ad321b0652f04a757bc0e0e91c4d120e9dfbd2f1bd211340be96637618866e15dd9200e41434877b609e36884ee950de9009a42fab34d300e8d14fb57eb5569a4f0a77e3173928e27feb57206c70424591c59729a3a236d24f0816bb35c198536127a09a8ec6724756d15a7f22170098bd4390f3e96f5096fb98f56747199c2974ffc84b300a60d2e0d2bdb83560cb3e9f9a81dbfb0d157c52cbf6647086da3a3dae326ee483df257f22d54239b6580115e9fe1579fe392ae24671c45aaee6115a9a3f2466efd2f437315be5dad978851802dd381d7530371c3686e128a6ca8cbc99353f9090caa77481529ed64c388cb8db1ac92604229dda95303f7e1cf23369c993f5ddce81a5117c8140e775cd9cbec3f1c76bcbd80a198a5b64934be7919b88fb108814976cdfe085f9c552ae583f91f0f5af561b6931296be8de31abb40f5a0ea3838baa76785c383b50dad7ad72326a458b104abf3b1c3e039eb574cc63d307490d42242538cb998da72f0ce112a23aae3e24b839ed70b1dece2f3e5c8094d864c3993294e3ec3785c4e34c8d020bc4230bf4a99ca8e6fbc4df3830a99b006adf0845672cd6346dbb40100e9917f34bc98093afe0198419d93b026303987f7179aceb107979a26b45266df2e3dc1107281564ef13fee188075cf021745a8101767aba5625737dbe81f7865797ba261c60a58f48a7f8d0ecee10beaa83fd967b123c13152469946a10e80cbd3906d30086f60ff311bf0e4bc487ef6e9075051b6775f6642a1a1f8562e0c55fd8f0330878e3980cafc0e09b18df3cca9d63bf21380da66431fbe9e1337932da4f30d8329e5327ac98d3a8285152fec07a54d0e5a75662c4389457f5b2f0e289209492c9fcbdb27208062e6f7786b1020d0850120624d8cc79f08b412b539f689e08a15f61e4b7f0ab63a952f2d9e5e80b95e7a146541d3dd57d4deac76ecf57dbff815ffbcd7b834c2ca933ab5a66a06ab08754d0072b9ad69872a169f051029d22bf06b2cbc23b4845e83c6f100bdd7a05b2142d40bc4926356e7ce4aca18cf8397c1047e32526a7e74290e16f2dd75d81d1410e7074151b197c2595826147b42952ef4bebd379f7755497b1419e2e1065feb914541d9a6a3852ced3ee8e11119a69c7fedab3a523e1b59c001df8d9793442e32418c8a84c963a2357f195859fe839af3170bcf4fb71fa3ed215eb376325323d8aad9f30e70696459fede453c505ac6d6d7a8d80a444cbcd918c015939c4c67c1ccec44df4c67a92049d805cd3715cef5f33673771406465552015e861b56fd933bc5abb074e109dde07d12b59bacbd70b8190a8aed9874580ce2abfb34b9b39f4c80890218e44281aa090839c4ad1058f70305537eebd38f955576998ff7ecd180e741063f027236b404a181959143e190e318c989a988c2c8a06f082d5e2ed94713782428ff3fd693c449811bb8040e1ebb2aea91136b1a04253077b4a7afeb4330b91a26b04c7a95abd80cf5da8531a0711a4390947372971162614bb822f4e24980d6573fa88c56967722c12c1901316723780acf6fa67b2a4de0c85236e3486717ee4107f88d6f62c564ad4b4c07126c05ffbe783bce2f663851588ff6ac3485e2bc9e8abc8450c4ae2896458dae71fc9580e3c933bf9490ff8b78566d9ef36281bc09a778fb5117349fba4f3f792cc15c42e8df1f04a672a01792c6c50cc982c861e99e4165f55dee0d37033bb6893e87e2020effce1fb606cf90b551214f040c201aa2e4811b325ba7af22d11e83b019a6fcc8efc5d06061b15012a619a8192e7889389a3e4ea119e8e3cc0377d9676c14e21f34833b9a4a903d84c1ffe98fd2aa4a6e2da30c51d41e9a204205551ccd54b7f77402271d8502bd01dcc0118cbbf6d0be5c5be2e144333b82760f112683813195055d80525736e5a2a67569f094e21dd2ff9d9aa0f8cc4939c63445356b02182ee8242f126d97e7a52a68702dcee626d06a711b489593cfa77045e9c8efe5fbc5904e54013a4944f1efd0d08258949574d2dc8a370f97594f3ac9fc415e465949a8755e4f0add4803f02d7b0b13a7deeaafd3c5b3705a88b95ec24918f8f374916c4c106044d34d5dd4d51775e4ee0d05f656f64204f9649f7370023387234172cc6540310211bba5a434044d6fb2d3b5cf14ad65f9c935252df51daa0d6d22073c536e003a5dd16cecdc1b774ded9b93c033524c9aaa2da207d849a3d232ce9110e9d3146b7bb01a9c2bd04af3f28608207c20c332b8e89e31aee5140c2c6751fb7b2d6e75995ae4caaec728cdb4940e3da7e0ec68130f5342027860cade0b11ca7049e07cf26747b0d0935334d5ec2ac5fcd44024794fabd7bd2c270117f9b315f872fdea63ed4bd54b7b9571b11008f8bc35eeb0a6d20131f7db968a06940d4cebd2c3919bef165a609f6a7d7eb2f5fe18e547931e769610203f846faf67033b76c3ce9ba70a9e52e9f0d588f1113b2e76a4e6267d6553b134e96bf0b2a40ad812aa8367a5894c768d0c7241dc617aca62b6f11036a05e51265ec967518e2d62cc36947aed16bf82864d33db7815e6947c9d2730cd8631671976c2939e50a57d75a0959f85ee25fa06bbe5415796112ede653ecfc156741e023b7f572c5db03b80a4480cd5b7c515e7e215491a5caf6225075cac098ff41212b1ce7fb0fadd7f19c34905bf571a620f9f91d9a8bff6277f936c0f7b4f2f8a02b2a9af1fbea5878820ef081e4fa38aa16f7be3676f62d81623802269a6b44aa1b54cda1bcd20cb0a939ba102e3baadebd0789d0e2b935eca66f3abf5a4578ec38a61094797f8d835f7bd8ce830882dd7ae6fb75b899b0bf525674b5f1bffe8f8c0a545010bde9fb1602936b76575231d1f0374fabfe70849cc1dbf7f0c751749f3f107922dcd78dd9d9a8f02443e7f94e59a389e5e4a7d4e5735d963a10727615e45ff492b522e3bb11823399affd8ed87bc682413b13d45ac6a0af2838792da1b9d875e972bd4c2cba61602b8eb7264ad28b694ddce602c2e20046c01092300a2406afe9e1be20083f89c57474d657c39adb65e81313a8953dc1484f19e2a9f268ab0ebdc444d4b7ca1bc1c43269c8429c2ea709eb8093c2ab8b98e9d18f922d59b6b72731492ff8d5bc4bc4f044b56f67dbdcb78aa3f4710e905a9f05835ae19ef34592dcd6f2e673e34ee7602090d3025561ba863511890c0a45c70b0792009b44ac8563e25835c21a6131daa0e6d826a8f28411f691058a6490f3ad1897b7e50fd2ce5829910202b9ec8d6504ee0e5ff0e5505b979c73d371a9a9f16ae81a957b5aa7280578c44c6413698c0c439a7ba4a5c2844c0d421b77a084da763a384e8c17e7336bc53d4222951135f6308e55e34d4b81c1e8e86b8a5fcaa4b8b62b4d81c7a8d69fa351f1b40b7c355c2fa6db67b7b8fbbe5723f6342775e904aebadbb17863e528ab2097a8bfabed1d95b75d2e35e922b3cfb1cbd353b6c5c196d2f5167b6bbb174135c095d57ebab78e62eec9cb61f9631d5c65381efae4b0fb0829bc0689a2b38c2a3e472ad72066393c47be60a775a1d6294b471d08c8211ddec7af0ac6f698c3b039ef313fc290c1c131f38462a76cc5b92d5837dafbcf10a3ec010a6b574251f36a5e350b0c0b401a1b07c1050f4334d5f773c4a0a2ad77394d7de93e749930bfeca6bb4cab3d594cb00e635dbe5996ccbe5c8f2fa55f41dbad8cc6ecf098e120b791d17f2b0ec29412c13c0bd39b6d2041118952532136c766aa2f611db284473a02084a80ee63013b46caf396d8e1418e53043938d8819ece30542cb1a2f09ced678597275e39a1ebcd2b26b1d138705ace214e0559cb55ad24d49c22f8b17cea35cce0bacdb96a52d258d80426d651127638ba54f8320674851b1c6586827220de439733fdecc35fe0801eb0aa070145966c77fdc10fab8603c1df521966d0d1c74975d36bc8f2fd32fdbfd545d90ba0ca7fc8e0b13718301ee71d44866f6c4e3c61a66f57cc795f3c324302c67c759c5e6b8201a607ffddd057d860876ef8ec10e7fd257909d3d1bc79b4548769dde8af075951ce7ab0209050da15d27f2c47c76cab5f3ba3d9fc6356ffe6ce3b225bedd51c36f9f7bb7dc813d6bdcaf48739f57a042099358a07018113a739d6fde3d5f96ed6153466a2ee3c7746e7ace89a14e0eb8f7632287d5f03d8e4354559dcbeb4cc66bdd1a52dc1eafeeb45223ac97fe9ddef8aa6efc3b33bb584f520e25cd74232cf07960b2b28e40e8ec609ca670b33ddb2290e90b00219a6718564d341a12a14466652d0e28409ab855a7ba7de8fcc85cec2aa15702effbf6eeeebd52ab73db7d8e5aa0c988f9982010a5a1089efef44d9c41d6f3551dc36a5d929f00e88ea91b18eac74749a69a5d3d1eb85d7a8eafa269bad3dcd36ed0a2d0d52a42af300aa223d1d491570191df0116578348055a2f354ff86ef51c7a49ff6ef6af6f7be5d0a1b489c81245a703eb01eed0cac021910b3ee6cfd5021929f561588d0db10c6611d186c0ee08ab7efd53cf4e353233f4f7e0a1a81d566326aced3478bd3c0d70c0395fa341ae32bd5a1aa6652253c4663e0cf810fffe471eae4819252173e2975a848c373faafa8c5e3e8260f098e6430c8dcbb3722d83a5d5097fd7b27e72fb0524c6d4daa47bf53fe275b20379c45cb796713ac9375416cb68614c42a5bbb8de564ef1427b339cbc8265e83cf239be606ee5b4f8c9981b6f396d359ff894c1576189138a4c574c626d1c9b809c036cd3eb7a0728aeee28b2a23d2355808395b45184e5dfd606d416e2682408a8927daba36ee9ae01694bb21edd32213fab99205ba8064427a13ef9e73864bd76f8fa191174dd830a9590852314c6fdbdd1d659a006f1bac45f4ce71cd2d910a19d778e2421da3fb7f81731fae28d6068ffc3bd1fcee28ab4e66712020abc9517ff6ad8ed93c3bc09b8d760ab78d614c27449443db2b1f5ffe9d585ffe7752400a5830a852f9c4d1807bd1c65bc4bbeca9b8416115bb3471fdd67e9e50027b8f3141a8682e7300a34aa667abb40f9f0f592e207e26bde2b8e5e42fc50f15ff8dfdb9466d0074cf46bbbcecbb5806494c6f8859965970c20953cb86a870ca5bfd8b7959c7a96da4a254c1664af560e3d94d6f42cd8951e753a9517ac955b511fcf6a583a3e37f246fb02f9d9ebacd189fcd59ccb70aded7fd29453a1c42d742ab113e9c12c75fefe0805272b0fa21332da7472024b0b57fb7deaeab13dacbb803f6eee27e2c829b893c2f62b1f337d32c5472f278eb8601981a67d9082c3a326b90514d5e11e18a423dd594c7fedb3ccb963ab2cacacd42996ca1bd279ce00b15870d5a70fd63bf9e0e71316f64e8639f9f6799064aa702c5d30f9227e5d20e631cb1867738f0f00c1b0144dd040e4e543dbce8789bdf23706f1cdf32972c9880fde9a0759d4ba36d49102e8da790a58e21e2c3b68527f6a718e5b51961dffdfb81319134a96e74bc84cf521b84c01f0d09936c08e87554e0d5165f827823841e7c242a86959effd761ff574fef02ad3d391e1f93441f3a0a424ea9cf0df6c528a8d52f781d70b33cd0ff0be2e0d4be2eda3d2d3575b15c9ab911804f5f2867a7e5e936e5f15215a3d207a6dc84cb085054d81f85030d93cdeffcb44a282eac326f4e2bdbac70650b53febfa13496490857e7756d064134ae2eb1d9cda8847961a9d86fdec4b7242bd448a806f416d0b283f04989e786aa349e4241f6f7321dd33e022ce493a566c984168d124023a157d29d03a4192d8e12433377576b79d2c43fef677c398d0238b87c049ea15aa753e0035d366e8e07af580e7c08d54770061fb786bc26e4e67c069be91a9c81873b517516148d4980d0569db04485031af290d217649b728c7580801ca7354d4b629d1ac04cc36730aaa1e6012f03ebdee34d9beb6099ca899d054a6d1b451fa4fc1a1bebeb8cd9e82fca947ec62edf8d6d53e847019ae504bcc06adf9c19f64b9f44104fd55c0f0b73388e47b5996dbdce532c11c1eb4848ce556d106cdeb4f505718bdb7914b3e680032b84af2c1bd38bbc307723f3b3bee32be1c72c3e254ef3bccae0ae8251098d047e1f7d2d90cc2b0fbbd829b37fde62086cdff25d87cef6706b0d9fe1e41cd7b7f3300cbf6ff0868dff59b83586cbfb7071423d39ca301e61b9518034a9f46f933658f478cbf685c4408af6ade7c27899ac1a8e32bf0caf8eaa7a53da0f7255e182c137a7295eb7be3067b1e46981af57bddbaf7e232f2818db64b2b85ee0ae1300128862b3b7672c23b154ee0f4ecce5b343d7db28f9da406c555eccb0c4c5fc55b4a00cd8e90844b64606d0dc5cee5fe7ece94b9e88b5d45570b130ba034ef2909256cea4ed520f8c133b5ae8e62b1bd9351955e1c88436886932dea7f48738d44ac5335b9b2f83fe91472fb87eb10f2fd9eeb90bc9eb64dccf33ac8ddf7385e09e766b568048ac77c61eb4f6fbe081a0705996c77a828a487e7771891c018048f5bd4952e7f9f9eaa5de7a2241da6d35a17df407255ef856f66597716715e3130d2c36473681b9a468a518b7df9647a99974b8d444bd8f0e14eb38753e3383c7ca4030d85c73c5d0a4f2355740bc82ed148cddf4e4f95043c349709ad5895eea6bcbb5ba254f08b8c80b0018bde55f2ef97607243712e3a77c2d74e47684666ed16502bae4ca157bed7ff768396428289d8d964c9b0438130543e35afc7d6e5b2ac22582637c79dc021b787228ee7044c92e2cb9e87f78e4c7e4abc02d5a04bfc3119e484151a7f99b53af0651c250d4067a92658e743f04da4de4206c9808777671d22baadd37590c188677f12fb4991c37f8376700a534fbc1fd15a2ef83d7893bf582c2090b358fc71372d6a7a3293f14e434b4a27ccb315f3ed53a7f0badded64a70278bdb14d49533689a8792ab654d8f055c97daf3085875d129ed0ad172d02e44616c609bb8dbbbdd98b13a181a028cbcc6601cc95808679b423087a6e7fa33e832040695fe8a06c08e877f3ed4407df9d1ae330bc1d8036f10c027c3f29876778d8029d0837b93bf3a6d50516f2f8d358b7a2a57f2ea063dd103aba3296c4449cb9627d0483dfb1b0a7378b33dde07b0daeda48e6dce009f95180400f5f026172fc4bf7630e63140ad4d91a8c6d646d370426a111ebf75dc7c04a5082bde09802db769782e22a3835be115c7d00a70e79f370df6f5c79ab1212ecd5f190387dc189302ba8f8f86ba5d3e8d352ea03b2c2eee90923a697dad899e99b4071cb842c3fffe699db0fdf226e42b514616c706be77afce25b289a482cf31657ce16090c785740cf5ebec425c7baf9c2809e2124d06230efce0046348a0e074d6a971c71677092b05563d35a2433aeb784e396a4efa5a7d3d68ae02deecc302aad7671b80cc0dfc1f9fbef75c9046af9c1fe2259cca0d1d7a0c2f7c17079d9d1878478e288b36967894bde2509ee0699aa85087be868349b4f1265df66f693b81830813031a90f5bc830cdb910eaeece3733c3982669a01550673bfdf441b7752769c0cda26b902d44bfc4349f5f53678203b16a6b0915811ae106086c53e91d3f12a7d8520b5f20fede96aa885084948063127162125408b40557fabeb1b0a95a2898526935143c5e423fff817c3ccef857d35815241f175a6079d4b1c1edd088dde4a271eb6f3f7601bb6628a4690ec7c32523b349d58723eb791faf552dc659cedbede825d67c4a43dba76f973ebee3af4f2407490f7fc97be0d79b2a1463f40955d3ed2486e00c4595e5f1d2a34e4c1a451d8a675b4d860f5b35c621af1c1f309a8abc4a5f844e5ba209da4312187d3b088c5b5ba68eafed9e5f331a856e492fabbded635b0add2555925afa4da87b063d1ca717ad059e6076f8da0d0276c8e19c2ead6076662ba0d6d4993b8ce6c8b738acd0ece27480d0db415d15e4388dbfac303b0db084da51e289b5d01997c44780cf47078757aefb52861a48c6e9d4f91391f57dcc1dec96129d6ee13695981bbb300fbe4ff6ff1b32340d6139c52af84eb83d6fb96b3c8d88a28961d9019704451ab1aece331ee87d75388b4760b79210fe86faa9a42e29a5688721174cb75aa44c30881642a38d4e7d5bf1279dbbc02e26d7a00cdf4de6c6590b69d0002eb1eeb132630030df06261b86a13fb2ab0940d50c460a9f9c0aa1b9e4770c68bdbac9310b530912554960b8cec901461918c55976a79ff3e77d3a2e54c3d340d504c68c67c13349aed262cba9de516a464323d24a084195e957a6770e5c4f22d20479ebd182c4586d9358240c43ca562d3c1a551b31eb32985289414c526f0d9bbdc02723a42b3668b3762ea6702ffdc083aebca7e3aaa66824ff1921592d0eeb1abe41e280f213ea8754abc07f77f565a671a05b305f02703f4c5d1d61cdff79ffb14ffa2edee75ddd514837eb493a749a1f08be1bd1a2f4a67e41bce8163d267d704a97154d04f8de058a5f2f6c6ee0aa640edae4885789fc2ac86cd7407f79b6e4735916ae83e13c3c7c869b3c22638d7035fa2f9e0a58b8a238af580fceb9c0ef8e08a38f29fe255f2116af5c8f53eb933d2f0c4280a0859717b3d9fef01d6b9a7cacd3f0a6f25fc6cbf4cedcc3824ef7ad12b1599a4adb6612c03b69b388e9be198c10ef121e50d02bf4715357af866cfbb3d7ad454df1ce74840a6cd7ef5d7c1f4e8d5b494c4afff1973a39164c142432a24529ccd4702734438b1c9f6b7636a383d0b1729913a1d91c8d68fb585ac263f47ed71e9ba477de8b781c8c7897060396021cdad131168a17d6c9ce245f2ebed2224157bf79c36f550268961922c3a3c8a2497b44f6706174f4555f0147a9d926f967a51249cd6d50fab4e6be425a4cd4ae7c566dbc1fc6bc6c0861072ffc14f3bb01f9ed6274b7174057021e9ad60b8e1f805c87f333d3c83e9bb16b5cb60b00cb09f9d74be725927e5a74f63f778fb0f83eec38f99444823dc27f75ce592019588213037bce147cafac57699b9c701f4f1173f9730e99e7859e262c1de38822b3c1bcd94e5cd053b8962ee279040773dbc0e90a02aa9fab27355f3efedb96f0b634aa00bd8968f7402c39b5ac0001f2995fcda293e2bd9b8486338095b29e7a6228ff54ca323b6f11cf16fbd9bfd5a8c8fdb5054d8b2e5103ce48436affdb34328680cb63439afa914fd0b98647753638dc1642c2726f2daaddefe04ef2a6a132223f26afe164edc87a8d51e1a49ac06f628cbbd639341c569891b7f21b6f45cc5a52458e0f8ec6faf19c9767135b5d4ac984f59cd9333e629867c20576f06411532ddae75b2895251878d49145dbeba13aee926d5eaa25d335b504c1b852e132b58ec40559345dd902cba22f6bfaf5cef29ded0f61713ea6848eab1abc177c01b11f794b2e60de88e93fd180b153211d3d5abb1809f863113f369c9603ba86e42b844806c8f4d4ac84375aad38a0185e452eaadece16725bcd3082a9a1deae1c7c20e70690a989a4ead9567a4d01772be12000c78bd656c46616c9b5eaccbba2f4a2686a7397837dc837e89c441dbef5dc0104f67216df9d1293967fdd37a3531ca7b3f89da5f46b21eeb1411a10b33e6f99ac06122f23e679cb70898fd883cfd8e2cd4e01aea47af238d1e2aa7cda15be4833d45784cb0c0e72be9eb808a972dec011bb1b7c5c80c65a722e9d86257369d1e5cb44d4e62a952ddf3b26ea86ea73ce9cd12178c26f2121de5aeac2fe7ce6c5a0ac8475ce391e865ab59c7019add86e6fa259e33dc74e44491f958c004a3d1d8ae0aa1419e3416d80b7658bb96d60521ba27fae8f2f90a0f01c844bc82ce7ba73ac933053430f81ba9f68b392326f345a935de4accf1beedb58873547327392d31a4c66b7aff34fd37f8c630b2b4db08fc1b4fc8bbc9503d33abdcd35f01c58df1d18f5707fd9d4fde68423ab850d3c28b8f96a0a79cabf85525820bf792f837e598af646a5fbe24a13effd5b20545c01470a6592799be48e5d0641a183e752fa7a992fba7fa794c9054203310f5c0821d30969b7655c888f225534ddced5233e136b68cf42d9599764b5bc6794181d32a45ccfe155f4dd5618d7826f89fe90ab48b1a3250bf0eaf0d8ee9327d3e68abae71b39c620ba2a9d7c98c28310160ae9527db9836fa0a518d1233f5373c91ab7d351068a0c8b084347a1c5cb2f99de4451787ec6cbc0ee0ec2f8e636b8eb000694ddd66ba8ad28d703336b272be12ed4f1388b28cd8ae6fd117b6c002b82ca933aea2f616363250a7ea33b57e2e6723a8bfcdacd2a7d77bd680c206cf5ee3ddb2526c186b85308571effe476fcf2e4b56014da71a571511fd271dce563d2201c34994ef3fcf677b0cbde43dc525117b10280efb7b6a2ac6f465751779b2e3a868b6d8bc88c2fc365cb8edcc2401d2233c74fb4b5b704a79772e64cf9dad4721f0dc20be9a2f10bc784ab4ad8f4109df0324de9a8dbbbd28aae44f9052eba18f6428ee58503d5cb5499029f0188338e41838f7d598aeb3d196bbc10879f70859be7e630948e1bdcdf403755fcbf51a0425d92d3161cbd622402d0832a7787616d7b319587ed06feaeaaea23feca7a40871c81153e0d214e5f99d2d72b3f75cf9ac109ef2f08d25467ffd6f453cdab4eac3e8f901b92ecdddf37d167882aa0f3580ae7ef9c303be7a65aaf90df717338fe9bb2fdeb363bc31aacd7010ebce5df9b13a86a60defe1d3762ce7eef1b71ed5f38b08f91ae2eced9a662bb72959beb8d49418b332a69e14bf72241df9a6da854658399d79239322eebf3ff7e2608a7d6d4189699d3ee506e67203fae32fe9f672d9b77306e0aa8a91a26e0d543c52caf5421ec1e3b43fcb82eaa68306435d4214aac40b749f6f0aad57030496cf8cab92fcab53b5ab0a292d8ef19b8e577b7a25634f30b7cd8cbfa81687a0770556a18851baad0abfd25d63247cca3a9e1418d69834c91e26cab0b20b280670f6505dbb8cc45ab30d0883807b335e8f36bab0b43d58df36eb1e748462efcc50257552aa815884fb9cc52d60c71a136ff17572aa828d2b558ba41d4a9bbb08a21b654dac370c9f30d9f4b48ebc04acde0d4466bf2fc81e3633b0e56beb014de2b2a8ee32494b3799f59f389a41dd7acdcf8fb9bf74b327a4cbda03b40c1a11aa7c1b2cbb2fa69379815718a464631f3aee02c181583e8bc4b5c38efffb2fff46f974c228b7a66ce29599c55aa1d234914de67ff661ed2004f9395e7fe950173c16452c12eb4b062691c4b8df195a35e9310992012b262e31c4d621443a470fe40837a3ecd863fe37d4a8d4f09353854f836ac893750770f38ad4fb6d654ba58c276e16eefd68a1b08bc408825489e22991981d99d99defad6d3a43fdc48ed84b313bb81d97cfe396a57671df4d4e51d78e83b0f7fe8b8076ff4ee234e860f523fc1ca4081a1ec6038fd281519e2b114f006eafd945dc3594fa5c210ed0fe9b69b52c7f714d89bb09d8789eda761f57e9e902dd3481fa31472d20167a6012e4669a2a48362640af97059cd8a99438e310d92494a5a660e34631a76cfa4efc3d4d0f7345427740f3810ce36b64c55aa1670d027db20a3aaa481c08176b6c1355569c180835a650b9ba82b9c001a62bd3e889a458266e7446d7801cbe6a3127f2c81069f3b6f4d8a00c3dadfd2a629b3e4d36a3d146ab451544409f8c795c3f9247c888490b14dc0f185c1d6822c38f8ae7d99b03039993186c20a21c39d5378a3400616b469bf26589866e6184389428829ed04838bce9262810d366a41ed3dc69cb7a108282d10d8b1a3d34f1e6d33930fc6e44d21bac483f181742ad9112058bb5b6a3f6399caab1d0d3d9faa2c1fcfdd36f658cb98ab26443c88c41e6ae7144411ca2962334b794c3afac1464f3d573a5aa9452a419f99dd45adc607b7e47c9e6abfe5561b9b8a46161ba4b59f05fd48fb4cca2d0815d9e70fe9d8b727c8953bc21c8f7193db559b4321d80663002fa75db3a28ff7ba25fc824edc226b5a5aff946327ad785a607a2091fa60f5f238146309c74e6e4c0614f034c11d24e1a96d67a5cfa3102b5c526eb621312f16fa0c2aba6cccc376a1668f5db80d74e7a69b8c71b9af0f32e61a171d9411ba4ea19a4b959d1c182cee9cf1971a928b009fd80c65ef3937908d3ae4bf0cffce0e90a14c90c8d4c28fb106a5da4f6358c8de808d1d81a9c6a5fac83c1af47fa61b5c1a749fa6998cbbd480eda5007513f2c20c2f86531e2415fa593799686dc5b6809f3596ec3fd729d5d34c8744b75ca6d4ca8b0090f8db9fd721db83dc59e6d6e9532897f4754125a525ad32b12772bf9df6846a6c6f70f0e6a0ad5e9de9b9bdda080702e00d2fc02268283a61045c075addc347a70b05df9d7a274c0870ac7b45fe06da5064960d1577cf498c1632f78a75c5b81535848959165aa539f03bc197ad09fd56a41c34b450777ccf92a88662935b98138ed6a568f098f1b1fe9ee86b0121f631560670c4b659a5a9f8b37d49a722b76c970cc0528e464df435f46ba5ae2a648991890c248f159074e301cd6410317e8ede5d48de05552dbce39f6ffb8a494b24c4f67797534e94de9261c21784ce72255ae03265cd6edc25d33df94a38517aeae06f8d05904dde762f95a532f3f289aade41f518b9a3b9fa784edef2334641fd817c2b7b07b1f2cd61b0033c85312e4693f42ca45cb78f235012d1659c395a0fd3b7c16b991647f58b6282c2241f8b44cc46cf3a4b1bc4b5397ea7cf9157229e7394066bdad09c0f0df1853a9d761124cb82a7129401e68ba67a0f33313c47ac78023b5efde170d1ba89247b657686cc7bafde5e865f9ea0b21afe74c3246b0f6da082aba97d9da2fd33b7a1c1c0a47d092dab748e58d54e0dee8eae536f77848b5836905a1b9582c31f75e3deacb17a22c8d18e4091b58b26ce7f5f6dacf2666e029d2bea2431b95c21a08b5a20eb1ceed43db449e454b296a18e53e2a25b616f38fe54be539d56f7e3a6e92256a22d270e1e4df8ff4d088d953317156c777c1ab09bce25ded3b7e2019080f1804d2b2766894218c51dcb6e0f515eec490dd169c70f84f30a8897a1024518e1e6301e35e7a92a2aecd268a3a8d5507e9d970aa24316f492f3e655a2e4f2ca1def252bc427aff3eda89cc4f98ebcd2a6e425d73479d55e535e492f2f46f806b3053ea31d715f3b0552530e023c7da47152f3f55c2d045b1dcfd9399208dfc8cfdf3d1766055e04595479c165894ff6e076a052e8a0876dcdd0497f66aea50afeee953add8b8e641a9c8494c74717f0b54ca397794be915495cc0373aea7cf2b22b5eea15183396075f98bdfb30c60a0078146737b4ea348ab2d4c881e5c7c1f1dc4bd0f28ecb65ed584133872840fb7a72b5afbfa5e425d573a2141e8a18da77065960eba8414f75fc742bdc638cff96a550d484e984c417e98c5961495f1d5ae81d03a0f6fdd19bc8af57cae63d508a8337f148531e1da0393b5d3183179e1d3c6f2344ac130bf4c04c5becae98e70a300a5e7df7b1b08cee5d76a6771913da2e83a32ccd2d51535e28dc6241752f85b71b5d84fb2cb305a1761184ad4c1f5ea0dd52d672a107813cb6a0bfd8b26396bcbe09731989d0f2cff55cf6a0fdd8a2b242de26b3049419875523ecaae138baf5308883dd23213e3532bb260d1815223bf047dbf668a2576ccb7f2aec7f24fd37f73c3649e74cf159659dea29b35de2e05c39ff902c8cee72d4861c50b137fe75ae67e99d537f4d571c45d33b03c4032c5115344d0d42db896ad1d7fc8ec8a85d06c7514a8287b0fd9a04e7aede1b619752a0ea7befbb2536534e54a7372bd4b37ff33b2bf3719716f7da2e899a57dfe3f278c9213576a53e53d71dd8cb4fe2368b3285059c005cb1ee446c651e9470593c97949dd5c65ae5ab9aa47532e1515ee6207be7443cdc2391398d68a947aff161df0d6ed39db4464968288fd7762c1d92dd0c6faeedeb5e4d3d821f46d323b028a944b972033ab7fe886418c158ce79b09b651281544c003cb05b755f6b2591a5965001327bfcc433f86a324e0dc35296a38b273e7ad055d393508dbb327ed2e2fe5c9e1d3cb9867db8c56f474f4936c7d1f05abf9f4dd936ab4145e644683699dd42c878ad2dce3c7f4b479c501f520dc7520b71bbd4613f9cf335e57749c58394f99fa2ea7be0b941d4fd6204925a4e032bae3e052c5a16977663c7eaf1702354d77e43fb0b2a1bd3510d5742fb0eaa4700ec1bd57dc4b1fce8d6cba557058ef38eee78a1d46340f70bb4449370c3ab700afe6ce3989d4a0ef4c71063f5141cb9669937cd960d07451e0f024ca50b3a1c94ac1dc9a7e3c5aca74550c3f68ab48535d4f5d001e7ec3e1cd2e1b8c11a57a5a410e8eb77445ad6c22b0b700507fb39dfa4f71275df537df98efcf410c0ce196d9e4daa00d9da7d05b309fc7e5e40f4ea5f880c642b6244dc02a866361836234fa233b71a6d09a00e2a809ead19bac41dbc67390176114c851b75cb4313a5308194943fa25c80ecf8d0973903a41e536f54721300327cfba4681cc09201e6239625fdd68f87f3210074ceb643e57e863328a8c8a9e2adfa437cc2d2a8da1e8d971737f7870f74516548f93dbb4ee2a68b82f4753ba6a590e7180141ee5e2e58b1496e244a068a467fc49471f2a7e7f4c69031dab1e1413ae417cae6a98041d86776827e203166cf2934a633a5461ed256107d3dff9b12fa7122dafb1e69345480856ed0f20922ff60eb21df1bb9f10acf9725b6a4d7d91268f3588ce525b8ad0f00db26a5fa7fa1055ce7689c0544990bae03cfc07e1a971ec9230259e11198988a276e1c8353609a5b72604309a13535ebc8b577634d9f22a2ead406be786266136d7bc99a1ffa01e763c108fc0615ba2db4c5b059d6840f7c8d394617c8a889fb3a80f73f5b9ab04e521e2225bec14aff8a6986471683c31b926462220ca8d9e7fa13d72deeb6d282cc21722ad2da00b4f1801d26d9f17938bb6f8fb3751b4e61207ae3a66632a623dc42039ab13a294eaf64b03955ead407d14931322ad7f7da4305e66ea90ad494a8e8ec0e311c4e12386f2b6290f9afc9343bebbb035a575cc851457607cb362920c68cac42cb5bdef6d9b7baab408cc0ae3719a4c58e833b2eb37f020e04d69a7474291f835caddd243c86fc05364359a18d203f5ab289b9ae2cb2fc7c6be673e3d38b300c1234c27406b7283a9c52a3d131a8dbf8363e7d4b5b3a32ae114839485df4a8c51ab6b0746d52f366640da6938a31bb8b8644074cb21e7a5da8bbf1a789235aedb53df88ed2c16f3ebe4c07ceef1ea6d0c57f0247d041e74bae810249f7333f860e5ee3a317c5b12a6007eb388b4eee9fdc4f4047e66103bed135c341735a4d2d462507ca603fca08b4d7e6f9d3578e59e3157253bc2240e30dc02dc4f44fda40e7553c11b50d0ce719045bcc05e99cbbf493927bbc856e21107a5c9da3018e71853c4e39a144bb6fd35f52b663553b464e808e41155e5bd629849e2e9a9ea4738614462746dbe1e5d80d591cd400cd8e1b929abab68569cb04310bcdd6928bf818b032dfc23be4d3b3c50831a5c2c1e574452a669905c5bffd61514117ada2f71d6db32f51ca9891c1a8d75dca52778547eb0873ccc6dde2877d3ead3e41dd1369f8a198cb7331e0ec15be6d79d0f7a2e386d890b7c9f1e419fe2c055c340665445e9703a3e083c770929c97e74c1d6971683b2a8f9a4d09d522d774f092da0cda7770cb4ed57bbf255620824b9a60e204661c1b7a04be85b00152d610ade7b375e5172aa852c56bb861ea6b200f1779c1c8f4e0f65e1fa27eed03c91b3fecdb91aeac20632bbeecccadb7b5a4a249b0ca85fd1cfb4bd246ca9d3daa69ba755987d83a961485ca1a838ed18bf9e120ec6259222284a21963f48d91fd094e24839abb136dddcc0b6ac6ec8b0dcc0d8fc5cd7c8ce93c7d4834caf091ca9f4b75d00ba06fd1a4903eeb1df894e686bac59aa224a133d2eb6cb6e0ffd43380ebc51c433bc7982ea69832def4161c3cfd7bcbd39531974f2c2481dfb99579d8ea68b319ccb9e229dc2391fd1503eab0c168bb5bc453bc0a655e17283e88b8d3144121447752ed6a020d0a9ed5cf9c8f96ddc02f1ec33faa0cb9f1aeabc2ac8b9f9498e3291d45c650c0918f3d2588d6f8829bc633af2ca1008e7841d4ff7569ef89fc3aaf9b78b54646f725f36670b07dd3b51efc564999a2f0e888b9aee1febb42f0d25b75a8e69d782d1b84fd1a42d82f1e89d478c6935893010416eaea26a137e2239d21cebdcf75c2fa2666bd2b5e85f6a975507f1daebb3e1e62c76b927bc1c10168a0b857d03852129466d223f8b5b91825ba843c59b26b6c05f2266488a0a993eda6754d9662fd363ed51918b4dfe100fa7a09f91580e81b757e4d1e51bcbb1689552ba3b497a1fbd9ac5f2e4eabe1fca0df1f60e1aff86cf6ac008878bf299376f1f30c4ed592d5fd7c54ba9cf6a4c8a72f5fd4951f263dac02eaee29b059d8e57f18ee1db5027abca2ebd108470edc42170e30966bdfb7b84913ab48edaae3ba9eff5d59f5b578cbfe618d475394ca246bb253fedf598da2ce729c36878035c4712e3127a829c7910b30d1043395174535b4b145e2df72da433caa71f738a2377c752bd4ddc4680c2dd5c6591dba419759c9fdbd8f82a84180ce2cbb6285dd52a5dd2ac7eada7070c6df6af0da29d4bca05cf0b441e79f4f2fb04f6385e2b988a6c0f618fa62ebc0135cc0a4b7a16e0dc271d160c18280ccbcf24f2fa3e3f45faa861277a5639012baf04af35a3b9a7a43dbae302e79b80d7b9e642fde882a9ac1b3d9bc88bb4998a885619ab5cb7c7960ea526978e4dc6a2b7b95527785c9a05e97cab5cdb179d604f6c7a7d20f80fe6e2d58a77a909d61fbeecc4ce1f44cbf926e5e5dc0a5e6e6e35fcfce693dcf721c029b64ff961fa2617078d9abbd3ccc37c76be33ed24295209ebe7dec39723e78497b4a2ad4934aff3ba214328073a38e318e4a46d0246d9297c8bfa95d3d8b125248209ee0d457ea0f47438f08fdf9cccc1883fd86b540e95fb775b0b834197437aa05f7af97620fa5b054609a72c3718a0bdbe63285db354e02b28f16fd9e47b46ff6d781f349f5a3f7f51be0a243aa8f26eab4fd6949a46741d37a2ba378213f75e23afab4bd8d5d32c91da32291468545a01f9a16ba48d3ecef063b2b884785cbcf8996f32e6f3995877b73cf93b895e43b1fae0f9c725ebdee39c0c8b0ee8e415f2091bdb18039958fbc3a08884cac7182639b43767a543eb08cb9ce384e597eeaf3bf0739f348467c38788f2664448723e63859e3d00d2a24b97964439ded3c0967f80fbcfbff38ed1deae501a417b820472a4a8ae1328100cf18a9284e8c3bc8ec2a2926d3e400c329b44eccf0fe47922c65e23fcf8b5d742481b64676661a6e2b1720048e0b898bbff6ebed7904a0cf8cee06c0a2f9c84c4d3394281042a8bde47ce9133df4075f72ea828a7d481545b5ea5722905acd95e58a313dc84ea94af6a5c96904feeedd2aa7d7fc0ec93b4404bf3b4893d3144752d2e404aa382507bd13eab01515013cd541753d87333d49c39affef264535c1e74090f3cb3d677de31dea1b93e2d77bb97b63d38ae7a1371f00055054bd2c19377a4404bbd14465aa0e3720e572705b4d8d7c7aeee5d78f03c0e75bcc79f9904821229a13719ab624ac466b67e5d8f0d8fbae7974ac13a26a40c1e3092e9536c5065352e9aaa7a33a2e8bc6bc826536825013eb3559e171334585132a67e9ee01ccf5c3ec92639b4d6e6b49c9c43646cf440f63be2db17526401b61b667cae963e56a1e0c4f60553c049513549ec3aad747eafcaa7d9042b48796527d0c0154ce548852955039f154f8819c32e5b4daa4b76991668660a9d8692bc129ccd995538854852dbc8e26d9a881923021c8e7023ea02d1e5fe06fec0302d50c10efb854524fb19c775606e6edfeef694517b553d3091975fe8d297ee38f941dd6a41f085864960f062345f048ea6b6e33a76ac8b83e7c9aed91b56237670242027e907ec071dbd5d327204576dd915e032248c2ccf6fa7ce9635d40a73c28d88601fe5eaa81aeeeaa04fc79d1655b08ef989a56f3c8a733a31163a707243df76903fb81d4e6bb1210ad71dd7a1cc8230e5f6e208b93503d2f5e0050de1a0ca98bfbf96b9d84d46e90a3b9578097ac53e01055c8b3b6cf5938d696381da9601084a32acc4b0057ede58752ebc4c0c46678ab4d065cbe226a93bd66952f118b59703e5d0da6229f411d605e99e190c780308aad24dfc02785cf853a71e4b0ad3628f053fd5b15843ac6f5b677650c5112e5bab50fc1bd19ba434894e72b0762cc0871dcfa3730107b89d960fc2d77e61424bb5e7d9c5adee0c9951964a603b0d9132ea34d734ba6e7a1118a2732b69e86fed8068c8197fbb0764db826e2973b8406f938173736655be7e19d28ce7d93c4f3b4ad62ed716d9d915fd086947940f74138a992e5a13901478a8e3beb6e7b766a058ec5b9e486696b657c53f4748b0327b652cc988c1369382e9b8d79de15740a594bb5635739348a75027109e1659b81f7dc62009ca68fcd25de8b4b0a5233db6b27186c5044f052c7489f790d9c05ae97f6a3bf08235d2fb2f30e3e2b985e164c73a2c3b45ce4e71f68168d7aaab1e0c53e265850405a7dd730e0893310c78918b52fc3c96946ab644e630cbb6e6d3bd88f24af07aa8260e11ffc7b4d0b9471075ceabed0fa719817787716db11aa14aafedfc11702304ece9578e033819c56e19ae9aad79cb7ce226acb71b8174cd6ea1e67ef2079d565ca92108e1c2727b9da701e053fb727e6a0fad0e9a2463648f6e4929a847769014752b2d9e302a988d07df3721e46c5fd47b3189f5ff47d9c774de0a7b30a24a0d7d5bf11b15c6e19295861bf97d933e5eec80d011a7dbe366aef094697ab3e397e59aa21dc44aa9e11ee8417730bd797ac43960c259e6d3ef922982e4c064f83504e672b5b3f10365f41e81526d18d0b907dfa89683e764bf581b4c5935ac47acac9a107cfe54c0cc961b99e7212fff5c433ab71066c082093a40ed1bc3ee5543825e318e905fa0fd3ac4ab407a3fa747ce80154e32332cebfa27f9ab77665a4ca79997491bcaaf075838339539057d1020ca7ab6ecaa9725e96724eb64d89b29004d8b4c0c98e8d0c9f70a03c304d9723cc0c1c2bc64d3692842a670b694e04865dc5bcc12223920f8132ffe0fc97ca000f9eeb9525b84ffabff8c701789d50d547cf3f5983ed55aa9c14b9619d6f4cea303f360075461c6eaa969c03d5a5f9e28354e64ee30c2c605f010a282918f3f18752e5646fbaad3d586198726a0b1335a5f290aaeace04b6e37dd65e3d08b46e69add9bc6bb0f8a420c782f5810c71062a09d723b207b8c778b7f80a79fd3ae4631a181f6e142fc05ae436d4030cb89e6877c2b28095cf1e0c2043c83a21775b4fa7b8170d5e949e7c04f04bdade499f24fc4281b768a2c722dfb2cfdd1036c5a48e32396b1f8e062ec8fd0549edf37d522769047712120692206032383779796832588c5a2364ea2d4fd083d4adef55c82c534b89f69de5f009b4c9368355b810cb209d3bdf8a009a46b865e244ba01424dcb1b7d4bb9304c82e52cc80f0e99a86e381844146ec6411eeee9db475e7dbb7063ec46bc0cbfa72447553def67ab9a9748351559384491f9c270a196d64cef42429536c7eb4c363693723ea393a49dbc2ba2d485a294229ac425e15c60826b001906eba297edd311e6b811378b4bcda14463a9638461e8fcf36124d984be3e47a47259722cd061f80bd9952f6a4febdeb14e7777624f611883a4f1cfc28874b5e42b38e01055406550728292f8dcf88c6450222b4e2705fbe25e2e421ca49a597eaebcec877b9d7fae5a3a9aad9d47192801ce5a68ab280ddcb1818826554339d451a5feb0dbd737b0bd052ae8c44b635e347c57cd164eed9133f37f6e66d5dd32e157b3216f05f22b8c00d4868085c5788c75b7e6143dadb8e687f3ec701948cafe641864cdd537147feacaefa41e745107be62278394a210f19b15269362e552016ad84de97051c2be50371d81207382dd2047200a15ab1e14bec50b0f6ad90685f8d338a5c43cae3198c6523ad0b5424e1397895f416fa02d0c63d035d907d0adb158382ae1f6078a8c5da3d816d05bb911b3eec059453ab46231485b40b718c3a750649abc2fc116d01bca7872966762604039e5e7778472142d9fc72dd71bab79388acd9c8922ebbf06e7e8927a2a73a095b531c061e16f2460c3326af60634b06c90cf1a02bd1c812a5c18c29cb488668cff04aad6eda9cab69e4aa09a68624a111328f1f14f55b93324285125b01a991e881459304ca62f451078a99190f392e945ced47a6996aa41f29eed68845f3ef16085f8db1b5df85f543d8fb7b9e0e58e5afeec059c2f98ddda4b300e4dc7dc2e18f5560aacc4f05e29fe97c181de209fa259264abc77a0468d9d7083fc8f283781008222ea35fd2b0ee60b8bfbf30db0d813e494c7f24208a66d040a021ad65c65093af478fa6a22983e7e3ef3489b15d039b79bd0b1aa548942f47ce02a340760050fe3b11b25e03a66833f3b6cba9509f0c94da9f4d582154a6e69b3035a9cc6481b63777a4c9a4de9d274170c642af788e0de31d70be4dd6ca9de7a1dbdca8a74797c36acb9f55af9a31255a4a52002c380448cb70011f215a686d873ae4d3f11f221a7c23502d995c95970c286260383c4d7fd68d3cd2bcea28aa866c76bf7f9d87e9c9e2b09ebb0895c85dd0c4eb074678c4a293adbe1184d46722974386513f4a7946f6ba5be1b5a484d7810bf54c5fbe1c3ab77e1ef7c40faa1eb3debbdb0422f743e3e9aa4883f70e5e71fde35ff37e862cbfb8c5ea17865c03986f526cd4afe4cccda8fd3fa02afd2fe4925c8a49ae26c757d3bd934ff085345d3ee69417a43f78bccf7ef0d16af2c8a5930e7e5bc4fbf1eb60aa9c308a973bf06ff45de931019e0cfc853dcae8e655b18d35a08acb3e667efefb57fc641358635aa5ab720dedebc0f2ebcfc35d06893f810bd10fe9749afa3ffcd3118011c2f13e8cdbbde79eed00f0a25bcf36d5551b90e39a56929dd99c08f41a85f232755f3ebacde3826350ad9df9e380a3c8cf7f86bebc69acfa84db7295e551d7112a0281756c6acafb36a0a4d3fbbaa2742b63b65a7eb2523a4294be0edcaa9eb37e5aace8dc2de960804f18c8f5e14194533aaf07b4e8c10545488073c6979c8de0738cd20a520fde68e969449337167f6fdf67f4d5f8dcbca46d06c2165110c5761fb4e38a4bd3866f9e8a0e2ac9879108d0a50a79d08bfc0af7367d25fb39d8b9434a042900a9af58fb5c63704a5352a21278d5e3f257e194f1cf9493386f61ac3e3b9e0686b6f9aea6f4d0294615fb3dea4f946b2c62ec590737409e9471b3e6be9c9599d429c43754f016dd0eb54fbee6eea7deac09351b549588d312b6eb51427733b7b8a714f4f082dc2cecb038f515929cb0e81272d00aeaceee7fc0b0479cd825cc140f4bbb70a77b91af2943539a5f79c610ab3a875e63606f7e8d919b3e8a83fa573211502da1d9037c49d60978b5489784cc40d2c5a04fafeac123ffc3c5f41dd1d6344f6e2214caf664f03464fa68b917bccd0c4be959c474173b6c1fd9107edb0faf36e4ca5c002207abb3d80dc5c2422cc50ce2897b76908a2dec171ec9606a74c8ba9cb2027990fe1ce8c146e67af4ee3e677961d9c70063203bbb85900b67a5043008077912c1bd6e711529a29d009db1ad4fe35af1d7a673e89d5e9732e07549db3e53a2bf1195eae6c17778d33fde3cebe70068e0007e986cee8da891965300e484f6b81c6b2c6b80d861c1ba49e0af68ece92259c651e54bf320346930bda632de151de7b7e8c56ecf7ef6e2fb6891a39e6f54ef96acf5988ee38f2857d844f5b5ff80a2648e3dbd358857587070beb23397bec5d4957570f289faa0d085683bb35b35c60dadf791be723b7cb3133658af8229b7cfc61aeef01cfef6314b55d67db45761fe8df3a484bababdf8f708e50c1de2c92a081aa9183ede86779aaaff950d596310a4704eaf735befca2f9bd7c6128351b4263218ae4dcb96b39535d80b1e609a8238869413192aaaf6dda587d9246c7cd3ca50b1d97a534373e610783471ab50e753de49d558fc15f3a89b451e80ff68041498f2c6a79ac69ed891a00b4fd3c411aa802eb79a50618174bd8778ae4bfe36b651bda3b3174079b9bd5a3fcd59f51b11f806e73adcd127687ef606a294a691bed68fe386bb08a7ea9bddabd50762e4bf0d38010685207954b721d1e15911393e6739d76dcdd8042112c80f16d3600507b4c503b55851e22f2806426a5b917a50345c4e985a4303723c63314c690ee12937c3e40702369bd49bf381ec043e08db7a75d2334dc72e107b145a7b911a10ecd91aa22bc8ffd95d12cdf212771ebfc581003d3ffaa03ff9e6b232909a8908e7c20b3f97eb71eb6ed7056024b692c9d1096f5fec40cee0f7222feb836245ee8a4720cdae0b185c1830a62733302939a490c609c9ac13f0d834fcbebee92b54dbdab71ddf5dfb5718967fe4f6ec14720bb048f25ff147b07aa772ada5b6390c3b39307038168b39a69d5dfc4ad9a905a9c77740bdb0650042ba4b16f9ce225e798b74c4fd91d015ec3b5d047a894c44e65b34b8e23e092475e3a8e2a4fd670571fee0811e40c821a1d0e97ed610e8ba97972faa7fdcf145746a151812c1c81e2950cddc7394d399a60cb0fd2a5ba7ee643e6a4505a938b6a422f35720449e7e99484928a6fb05515aac436a463fa77e09a7f4ccd89e6df712709426dee25f6d0dc9f3aa6b90fb0b969c3e6ea996df862732cfdd766dbc1ec6373a6cb71c65c82e820798909e7483258b28dd944b332aa9c350f3a1d2b881e7bb7fda7a81f7a03427978e65858d52f1cfe7ba18fa1bc2b21cff253ca80814895f163f972764cf7e0d9c2e2006882b1345d5dd3887bf5102d2b32d0171421bbd294665c3b7d9e2b136df25c230416a0c72bb21fc8e53839c9ff6e03ff36b4dd9f113f96c860161e50e7c6f90d005be56191d36c120c088b955d28486d161c4787c9f57a75ed62670caac7e9a69999e729e6fc0616f2a1c6e13fd2bb58427265fbd7b81b01e11eec0e2092821792cafc07b8d96ff5b12c4a5fb9ed12a97783c87d87a310caa70fd6b4bd015a9687ef78f4e8a3e6fe28288e43db7be232b64a4f169296ceea9b6e49c10031023dd6eac2273dd624f5980146243fd9f9e264d46e0f40a1e49004db6bbffeedc8001edd7c62a4d4e794547c6eafcfd42236ef21221003f598e1593e991a4194eb2ac3205936524b5399504733c5cc79b0d4721c563a19daa12a8c07fd4b45a6253d3e3c270dd412ff7b91be66397b8a92b851beb3acc8649390da9c38110da3a6f2bd428ce55015c4b621be3ed52c09507c1542cc61827e89824146a9c4a12a18798c0f788f0710abbd45f73d0ab3b1d1595c9a07baaf7f06ff5353d0c7e61f1dd0e32561e1a816a681270be7d08e5a3e47d238780fcb307e53ec81a393ab8e9f3827ee59084b96f29ce4c81ee29c563994d36adfa136812596232401c8659bbcd4c1d2620b62442fedf5605926e8c5309c66aa4df3b9e0f34c5649b2c0c97cb0338ef50b1797574a240d091ffc812222e481914202533ae379845389dd225d9751e6132c5e39e1528ab462b90822d1569d11f94a4d50cecc39e2c34c4f8b1887c834b67aa1624e7494b299c04f51cce66bfbe742452e81773d1391eb656eda3286e4cb32e9ed38d0271bf6b803ca0a949f934940ef3a1244379aef3595f82593205338c54377a8963f4627f27371b44c9bf4880bd5568143f6c08783d5c45e9ca6bfc3340e700d23a54710536b742e893ab7895f655c4cd09110af16c82e69d6f2497c09ac5e07c9830f9921df3e500fc835d0c7602931a5da3db05743c2caa90ba28a25466f12fa35bb07e28de949925f284aa94f2586d0410d1e94b7b4db852f7c16ba2b77e013855f0a663e08921c7e32b9137f102c71b70f3d2518e7a593bb6ed1ef85ebe6ba08df28777536f4dac0b5063dcf56b936e6385087cfa7a786ba0d98b82fd2046405a55e732d3e6482546c1b9bfa99f333b5322a11341354acdea819cabd03ab898dc082423db0d761babcb68ae808a44d026344a15e4e543dcc6e00ecb9c857d0ad09267492213d4b3f10114c003f2f571e8227f750ea807ccafb00b4b18fec285ad024e808e032be5170ed0430002c74a4ffc4e26049f3797d018b98f4ab32cd4f5f3c4404e6a0382e4a9324ba6b760a7f9b8db5e29a312c3d7b7867732ab0a4c2dd8557f452519e96e631d51ad3cebe847a1fb27fb2eae2231b20356c82e0d02e5b6fddf96e976a35bc2519d3339ae301f3c7b08e6aa83611a4a1c0f226c0141a1e306598c6e6f9cd075b6762d9a0cc551bc72a4270ede9416ee17acf993b3ba7da90bbef254cf89109870d6855265b01d46584a2352a5b500328dc9afda41fcc5226087f542972a61d7ebb96fd381dc8d3af4589f06beebf74076c5f9fa9a67806d5d77a83fa744f75a0af80f93ec6f5d7aafbddd8940c65c7920db80b481af391c6e59ccff8420017c15ca9925218a9341f4c915fd8be27177d5d6e91ae5e294e3c587bfd2220cc55cd6b724a3d43aef5807a153e4cd18855a70186fd7afd5f0ced4f70dc232f01f8d84796c20f7eba46c7e265dbdb7f954570b79b6ebeabbd591a0f9c4b9559bfdaa2bfc93bc5f5993a1d6dcd45c90df49442d370be5fd1df85afb25966b1a14ee22674d57674cc68069351cf61a9e9e359225b9f6ecbd8483bec256c5bd94396d3e2c228abf97b1e6e6b7d1400d573c63fdb343d6ac482efa889157230c2ca1c936e4b29cc41e733a5b93835e4af991059c67ca11b70699d0bbe6705ae5599d38db0eeea2983200f96780daa88b39607f9ce649db5c130e627a61c42d47691ac2daa8822ec3c7bc6329d124cf74ad1834e8b6b992c5897437c36d3d34dd6ab338df851a263bb9e7b84cbdf730c8892616fccd60c330fc38f518edb7b25d14b04889e16ebb14c2cef2b940968a2421e9042e923864b68eab623f5e271bb4c45634d210357070db72065ea3530d1c31913ab232be78e6e54777f07fab536be7c02a7ae3a6f7b2416d0b0cca22ac663c6eaddd69314a971f109a0f9951c1f2abba6feb33dd5f47272fd3e457bf5c7d208520ef3d78b81629a3cdd6ced25a15c03bd8297b876384cbd7c9546265c18928706962fb1e8538cdaa7e3eec1fda14b57bcaf214100eba13b3395341c4c658f85697f159c5763345348c86acaa8573151ce20b5d8f0d7ed742f1756e3574c60a17594f136a010d4b5e7d1a516338d22c35065551717b1b2027e419060cd69a3bde886dfd2d478d738cdd3685210e431bb67919af3fbe7a6651d426282ff7be73f8201a4e6b9107306ae1f56072ef2d6945fcd8bf9be6f511d022a02bcf527fc240a9583b1ba5504bf995ce471486746d4d5f7dbd5ccd15b2c8c4089cf3cc7afd3a2dd86ca53833002dd3c45c356976f7b7fce9b81940edb78a95d91b993a09c29688c75c47e63dd1813ece96de243b70bd10dc1c226b2f1d78cb9a2b4fd8d0d643c3b83f1ab4911f7127f00fbbf13233261bf7a5f748351d3524ca75407bcbfa1dbbe14c9b792930245b47b68b9989c8188b7655fd17088cadbecf3457e14944bbb834bbfccc1ee3ca1bba57d3e58780722eb23eb2fa64d81c8bd80d03ee0f23e932c2049981b80f58f83e4d2626dce1f613595c191cf41c5b4e3492999d27adc6b0104348363144347022cf699c9c3cf010f3d126281abf4359034546a7c33d90ef788ed2d5bbe9a8521ca90ce6d66b87f9d7a381747c8d407f62b6d42853fd6205e03865bfc01f9e581ca2954206c8fee99cbb150e06666e2212fc81010ec2bd2a59d9d0eb598a8a7b27ce21f4ef9b3f576e3b893e8866cdf26876f763c450d32d95cac66b64b6580deb6c46863509191ea7a4f85799248b0fb1f3d322fae79a7c339a04ae0d9fd6d8251cda691c0ae088d226e9310a24b17c7057039b570cf0e4f9138adc9da1598f231e4b00ae2bf9e12f0aca0218e8c11aa442a77a8b4d86c02032923de7d0735c661e7599ee5a5c88e6bf3efe8097e92658bf2e0461d5f024d67ac6999b6e3d9ae8eb50d21094975ec60e1ab6f0b563af2aa3562bf04aa0ef8337897741990f179a7e38f0ccdcd3042411ab3a1f6a691c1c8d0809df0820c19d148f4ae0cadce500c4bec55f1f528b87a83796e8a512722b1da292c9a50b7e3b11ed7aeb3b95beb324d28b799d6d0f68e9cf5bcfce40070ec277ab0f058768a72ebdd653fc6d947aaa58b0ef508253b51561e1bde68c8f80b0a239c642503e3e5e6a9f379c69dac304597e86ad0299bbac46225f029b7d25d1576506d959147ffa97010595b4e91de666edd64ed909b6d86367bc8b5f794b3ede47c78f7be15bf641a00473d8d07aece161daf4257d0334a7ad56838f3fa065931c5b4fe561214ec046e0ec4660c55205c59493ac978b291061672c38e54c8e2bcfc3b3c3c037424d38e5862c38e38526261838c2335e92c0f4a8002024050035d5fd44a0def8eded1e8e2bcecf7202321b189537ab88e6d6d496c84904636d97b4b2977360cf70b830ccc3111fc7739205e41eb9e03724cda6dfc7653ce179618910d628e47a0f58b7000a7ba7b93c82958487f5c6d1d10a6b58b2aad678d7d2789ff03ab925a566c4e3fcb0a8bcab57d834a06737d6506cd579178a8eadd06ad7b57be04a73a191ca8760811d286c4e3d9faad328ce8c1a97d82b98a745275eb2a9d449251ab79199cba5edd871d4e955e65bfe6f6c29ce9a4edc49ca9854431e64c55155ae9f3567575c92a6541bc5a7a8fea3a7795e824fdbaac392dd281b866b7b69759d949db7c46ba6591268994d1c9dc45c301e6aa3f8c62f769232edb3e8145cbd6bd54d397a83ea7564d413321c1a9ea97a97ab341abaab790d2ed1452f71a3419d5abaaaaaaf92538407a756babaad048cf482c1b64ae7ab6bdea46388053f0d5e76ed0c90dd5ace65f357fc4e37932e6934839d1e90d69f34a9d553565cc73adb3844ddf549f7392b6db3037495b562a95485bf6d2d683f42ba316c868908b76d0c24ebafe321209b34efa659db9798bda3037e9b3a9b22d095dd7c386728045cd61bda3d47e9422ca93fa6a596febed6309134f0a8e28da9a73be47ff0ad26d599875617f59f7457a1f7baf331e7dd2877230a5ea50df147018aa9b0d619da8fe7859d46e1fae21f58a20d03a9bda20d03a581f8ab4fd7859c860ee32c2019c922fd0ba257a5fa2c7138553a4aff68e871421ea768ac684d783c43ae15979551e164aea7e89ba25da2afbdd5f914507a3f6659e8e4fdfbc14e9fdea5d8fe5e9b0f4986edadecb8136758f30f7a3c3f2de8d7856a8efa78d031c9873898a98a617e638aedfed927a4a94965f3334530fd0aca477916e121e1dd89837ed6c929840db61a56c88ad5ab49f1cf596b2bff772a913b284a58fb40e0be539358dfb085108b41726b25cdec1a8a493f674f8a86ff6a4bf5cdf972562ee65db294b05866e94974d86e8f1f0d19632489acfdab6ce9697b6a30e4695d93aab764b94c4d698965fbb85ece76a4e75c748370973a65fd75b5ef6406996680fda5c8cf4cefa1e01d2ed116c936441d090b894a60bed412bd1aeab125bad25dae6e33ad092b6796bced74ed0aed751340e81d62ed0ba67f4ae8f70aae57b8ec23ada97337abb3c451ed1f6afca166c0f3594ee9e52f71d85b95da2dd87fb095acbbb3ed22ec04e7a1f793c5bf71612d2f658bf755dbfac6da9b0bc5b29d4fda3ece9a8ae51dd219f3e522f17ac25fbb9a42c11732e982bbde3a3237cc456f8caf6ac95cdd9af949d6253dab2ed00ccbd03a0f663de9d5a660f9a44acd8e3c95a8789661f291da9fb1eadb3c3bbe96f5f867600a0e2367ea8fd16da69fd98764284886289f41e3f1ecfabaf3a806b9d20de4d9f762718da692fd4854aa7bd9d57e3f93caeaf6d35de4d3fdb80785c9f65d3decd9b8feb77d32fa72fe3b47fdd97519f107dd2c32e9275cd1af55924a29eef1ca72e63c8bf2e56f99d438d4654ac23a262d85f256141987bb3b06e0b5eef8aa84dbb1f4f4af5a144d71ed7f56baf98a64130da7560688879ebfdeba2b1a2f1d9d417c3664b30005790dea4f714701062912b5fa0618c86d7f378fa521ef551cfd91a1fc1c0ec40e334f0e5f9687bb89f746d842a2f75d0b591c983f4aece6a90d7180e271054f9a28954b87ca46a1d5b171af5518446568e98939739d0e2fb48caa32aa9c823d575d2648b6e7cd2b62f875f6ddd8f9745e5cba85bd1edb6eec538d0b057a3ee2b4aaae823aaced5b93a3f6ec944ebfaa8ca777c54e595c7c3af8e3855d1232b7de5f1f0a828ac94d85ad179d4966449a40ae2beacd061f0ef9711b00673f00c77039a4b8b608e44837816a5463c9e0de2dd58a16937772910e6e07ba0753b4407e061b3e3f5d83c88c7136fa49db4077738784d789bee59a1eeaffc083ea38785baef78780fb56ba4394e0142f886babb77c873c383ef71c17a139775cd4bbbac77a711606f828459275d16e99745b266518c6ea7467d93b39fea3d78f8a1c8950aae67539d5cc4606ea5fc51e7cbdc7ebc5452106d893017f46adb2146b41ab443cca0992eb78a19f22ec1a93b61274c027206adf452df741ffd49d201b44ece53385545ade8fa7e8db6ca22c1e82231c5ed62e6f96b5b553bc97c8735a9cbf3d5b93170b41d5785c90dda21cc1d11f2b3411508c897802f3b80902cdbc1dfebd799d2ece08afd5521f5aa30336870bb36db2e81d6ad94ba44ac6fed16495d68841009a3644ecd94e49da14d365279a8cec7c9d5f6aa248253d70f4e75a7baa414ffe188df178144b538ba7745dd5b6ca49bcb4e6cce8cd8ee1e614e0673403238b8fc794ec5d3999580f372e7b9188f6175c1299ebc3ce79c2ce57c8c6c843996bcf113d5d66abe3a6ff3d5c6453687e7642736876945697608737b8453705fdda0d6d9e99bfd9cda4ee482d6cd23ac6b8cc4d0defbf22c65aa3c47615af16e5eed587e6cb08477230f51a0c9d457255077b793a94d9959703d9b2e4ad14ac778839665fdd55b5b0ffe15841942da412686aa73fccbb073b575258a61a62456acc0f7a494b28fa0c965a38e62bf535b4ade6030935796772cb1d085d16d92d20f370993cf18c25cef14e64cdb46610eca0e19452374bbb8058f45868d5476c2e32a8ec2bba92813754cc45297526e42fc40ed5f8ca5417bd94c87e9bc64422b7c7334f4781ea76668101e4525491a0d5a078f6a7731498d31c6199d704aa8094be91d74e21884a42722d99c3e7696ada194b6ad31c845d3da0549a9871eaa8f38f5ba4a1ff55195fdc496bb6c5d4b4194c46ea66db31f1797f3d60159ba47d4aee52e304460e71e8ddf020a0f229c622015a8ab0fd3f9b47b21448b333c7471483b1a214c671a0448f5b1df11af9d298dd669d52d68519a8ae610522bf8abc2687454b730eb56756debacb7dc00301050d1aa8a1897472a9ad4f89a162c6739531aec1c371aecd5a34669309a4348c58e95687660d7ae03bb56c2aefd0f488dd665b6c2380be5c71c6643c078457dc038467dd43cdeda8060a5402def8c87cb8e1afa5e50a0ae2d3a1714d250a0ae26214c42b4a0dd56d3f9d7663be28e8648544b88ae7aec80ba9a68d78198ede8caa7405db99b89cc0075dc3168fc2e060dd92211e6fa33540ca9b21d4c3197634350ac54ec333b4840ea1e720eb46c07cb9ce106331ed6cf8c5149db9b12eda646bbd9c97cb7b7fc653fd4c7ccb173c6c365c7ccb1ea3bb37542eacc2f8ef1d49ab9b60171c5ee031eb3aa0e488dbfac2132abfa7e5f51ec3a603cfd6d34413c21f03af630c219da3151b1b700411f9ec1e8cccce672da3a226acb65b60e486d790cd2793862680f1accafec00422a0c05823af8419e125b5d1eb31d30d52542890c21843042b8744218c41c11a75c68b7d5e5cdecf2965f2d5b1c3a8346b3c3e52ef761dedddd8dd065db0abb8a65d43a71ced30b5502d66d793f12716ab7b6b4bce518a7aa9f16080475ec2d21f5aae2778d10a991f22ec37d8cbb4b219d91260e894784d4a0d639220669afc80cda146e9842d43a3ca7a6313be154c742b5df3f82396627463411e294f62edde0f544211abc142683ed89432fd894d582d7138354f0d808a7e0f170131eaa2fb4c405d0875f485cadb5d8462d4ea34eab466dd42cd90fcf3268d85b8bc3eb61236e78298b0ddbc34469d854f59e4d4286d746dbc3463d86c7c363782853a3214a7d5244c162ca140d635913af89d7c46be235f19a784dbc265e13af89d7c46be235f19a784dbc265e13af89d7c46be235f19a784dbc265e13af89d7c46b6236f15e280ad57e55b2302d0e3581288ba1180463228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c29818632296c5b311e8810a4150fb26237d86f78a6d436adfea38d47ed56ca87d26da9eb7395dbf6193b41aea181e4f9be1a18cb6a7ab6c4e3f8bda6761a2dabd86da2fd124304a0003460d096a6a5e8ce0850b1734500434342d60085ab498814dcccc9ce090d3490682404626067e202606067a00a6324ced877a797199838b4b8b1c5a5a4c713099b42c348d050e2c2ca537944a991bb20cbb8261571bae8bc40612c95a83654d2b73566aa82a9906d968a8b1f2db08c2333c9eee36c3e361e6323c9ecd5162c1a20e352d5926256392b39fbdc5ccccccd105c646ba3fa7a6c1304c0c5b5d1d5e3b703cd5345266311bede495153d518d39fa5a609de930e2d4c2b78bec0752aec2464c2488b97ebfc9a06d92d619c17c13a4496242122239699d11646fe2cae62fd224cd6b62efef90144e5dc13a6db4506af74e592caa34a643ed32f48f2015155db49b524d3bd5ae8daa741634f878c4430536d0b4241a36146518a04cc1681748e48ab270f72ee56668fd205e7bce7e2b06adaa0f0a19da005df012eb8322e509154369b820929502c600c6002271f2a44993274e9c3c79e2a449932aaaa8a28a2aaaa8a28a2aaaa8a20ae6bf99999bb9610a36d79ec31c989999999b955c2f86b63cdff70b1abf83754218e72c3222023e42788653067481c6afe0acb4b7386095ebb10cd5095445d5c7ab89430e4c98b3aaa219058dad7755d11527a4946568dd70ad149e59f9d791be319a475a5fa9f04fe0e1bb3dbd83337f9b6af10eab35a917b4c5867d66cb7eda4abfe0f72cafd9aebfd84877b1c19c668bb9cc56d5161b0b1173d667361628cc593f6d2c43cc5987475a67128147200b3496a16afda88a2af6d211880426e154e9329b841265362823535de64935bd834f6649fbbbcb4ab51eb3c1c36caf6f261178eb8a1644a45a26dab9a8d0ba862a6d6fb96cbedd66adaad0e0910e1ea99076d3a72f2b952fe1131f7d4831864cb0108b89156259950b20841042d956d026cf18cf6f4f2b25c325472ad0a030914213269bd9a0402b22b438b8de02b437051c92d49efaa6780316f55d1e0e9945b427aa4d95a3eac127e5443f9d346d83ea3bf760432983d6b5141311d35bca142a54a44c6923e6aaeea3aa872014d5bb1e82c21c6cb15cbe4c4887dc4d12e9887673b553bf658342b04994f28453712957af1d27e930131c2a499942455291d253daa8a5c48632c4a949279cbb2c3b2a21f592b10cdaac5a0a73308a40830c05df406ed20c85e5f02da575582824622d2422d4a4424a040790082fe527dd0da75438933053612e32eff266fd826c4db198df5b8c5fda4c3a492b610e3ae154d5495a67671211701256c24c5ae7e180a4432b64d04a1d1b52610ea3dd76f70f9b8a3dfb956d7d74d46fec56f69048eb74128b46dad2f267c5bbdcb21e5fb6be6c2e5b87d596ad7b8956b4ac4e62a29da4935408855344d74aa1852098ed5822e6e01073100a735438a5d196d25286acf46176f8bec2a96debc9459611e91bf82cbbcc7eb28a2e61799551266c704441b3830aa9910c5ad7522011a811a9f091888603092ba9f01c9930141532e1249c52f2fe448d5ca4461eaadbc62d33b23efc322b73e2a2d967466a36547df8eaacc8c67ee6c4e67467f051e986115ad755fab55b028a58d0f607966594a1c88cc42ff65889955e26bd42cb49fa067e4e8d9358565f71fb8175b7d5a4421e48886a8cfaa840c218575b12e6e0491b33610efeb192cbb22843c11c34b251eaf6689d2dea1bf8a1d92d13a36562a4f326fca18c65c27d9950612a9da4dd20050d494e3f1769c745cbb2e2ad1863e438c45e1e3e2abbea231ecf76c443711269531b165d9d2a010d8838c8ca0ad52b5790d447050d9c3c29eaa3820654acd4270514b0a8dd52519f145040d2efbdd72d2d0f9b3f31d7142be2f16c11afa5a5a5c587bbe51d7b6fef584bcb7b0f6bc198db498576f60acdc7b3dd3e51f91b85babb42ef66174e381742b870a940d86f36b46189978292faa490c213ec447d5244614885429196965b2d2dd76b6979333134c48cefce7e4cb3aa1ec55c9cbaf7f9c3a6ca8b74fd389d308a61d7adedcab03feed19d9a667f1b57dad6e8557956b6da86d4bd5c1468900a814e687c9fe6281ce412041742087f90c4081cdaf958542d2c485644522d0bce9d2452c9b2acea92524af94b5ad8abcf8028bb484f9600823f3809732425cc91ae6b8b982301d518afa0593b255a41a3c21c84b49530477a2759a24afad5588b6683d64e4c9f533339a9a41f618ef4a652496721bda9702a3be97dc57512895409694b7acb8170ca3ae947b40e117f4da22c047dba65eb5ef6a63ed2bdd46e89a4c05bf02cb46be46151a2425bb4a40f4b6959565816954a2252ad292448faeca3a6527403ad1fdf17497defb7706835295cf0d009ae2e335b75f96f9965d4e5e5e5e5e5e5e5e565de33737335e7843de0af201056150d12e9d010f2b00f1f9b2137ef078e50a9170b9f07daabdd2aa93460521f1533705277eaa36206415d5555d5b1ab6ee9d3af62c7eed81b6375f9deaacb7e8c55d52d630c1fae7526c70969af766f28eee08245349245c5b262f76a386b4f4e2de90a9b95747d8656fd7a4c8ad9563b645d8edf4c8858f933b37e6d4be6491b10d71f8b5eccaf6405594a49df6eec7882ebc5d0beb7d96b9dac10cb582d9172c98419fc0a35a9bdd9cf7c87ef9d7fc16d9dc4c8efc16c07ff6ddd3ed9e279a32bc45c5fd27d52fb3133bf03b17cfce80e73703bc5cca73a7ddb4b77aa2fd6287dfa6d12becda2c2dc7bd61591233ffe5953e47b566ccea3704ab8fbfe39b53d2481d6ed91077f6057dc1ee3062f3bc627e53a9d4e90769b05738f878840e3779b457d1cc44362b7118a9ad09ecc82140882174c07bae0d4ceeb6ad4657edb7f2e0e9999f9ccf0ccbb1b39f2be6143aa635fe5d0926ab325d5fb0b1afc8c4d3305c0a02ac618b9c76526c4bf87a3cd2c873c10cc5599cf8c2ce58352a3caaac72827ac166326655956c1aa9ab06a123cb250d4f89d744969916490b124251ae35fdc1edcad4fda3022707bf71c73cca50dbe0549c20b368cbda4f9ba13b224d27bdb9320dced539a3dacd84994663fab45f7af32edee03b73a5e5d6ae3a2542a5db407adaf6eba044208e11222c751a257d458258b7552e3755d0be1eeee2e122547988b9fd7b3dedddeacd4cfaaca0a6d9ef41f40988b3dae1e45c4256133f380168fd1228ef41e990d8625050db9a0c1f52c2662224e2dc9dee7283d232f780cc6add82776c5f8489764bf64f663bd2cc95ab288490cb37ebd609bfd9c704401cf590ef8c8035e7eca6e5a12c2966c873c9410c3b05b1bcc11ab4531e6b0a22e92f0076287d88b1adbac8a42bbfe03ab5624bd671537bb48d7655d58a76117a9cb9e2041926659d222454d93168c1042a81d0a31af7551a45656045ef054c43757e6040f127c96e96079fccb9cc88c442cfb912c971ba9ca8ac8ec89cc89eda91e994d252d3352a38c2f984e17f5cdf5aaa2278df2809733b2509b645e3adc32273627529aea24296556246646accc08e95d66a45a99766cc67a8157fae6fa65a2173c499e66e61dd421ef239224e97acbf6aeb40ee49bf8eb2d68a745f89912bc522f29b3a1aaaa349a3991e9886781b9ce42d7afebba8c50566473e4493116ccd6bdd4eb2f5bf772fd6accb22e1639e79c935a8f9fd767fc4521cbf6c41eb9203cbcaac714e9f11aeb648ff4c7693e961e7998ae97e245694a974fd4ae8b88baa8bbe87279c7457e9caae9da3ba8e3ba0f13c5ae58a44a9389763f4eb0ca674e6ccf158fddaa58368e52b2ac1833273647522e62fd22c926aa72a0755d547f654e5c9991ab6b2bf396655973c356c612132b84d47fc3651399df6ef65355efbd0b621d07edf3282828480438fa2e96178af75eeaa7063d78153e56f565ada4f6f60bae801042a8d5954f0b5a7fe5c67defd7dbb7f259d066845a88d387b92883e48c5f820331ca9c7c38d5435653ce893d7b1019a54c5d9ff3dbcb8939524992aa5f3db74a695d9f55c58a7427445eb3dae62ff9aa92525e7456568cf189257a0a1ae9dd890d5a9c2b65c65f2d67357de26d6a8c1163f52538705dce0ddbb0594529a53cbd9b2865945146196594dd524629a59cdb8561b4fb21e39abfae2dc80c32e7755d9f9b45af49fabc4fcf3949d5e7ad4a4e59c922962b2e2b86ac2842e2081f200e30a4f9a0699ae6830c2476643017650c0d0df9c8d819420208229f1e470c15c5283d1054e3eeee6ef54e050d88530f4837213f4220de73c213103edd2b92333439310b2361170d02529ff7a6943e5522fa265efa04c1190462ae08e62295f82580bc7b52f6f3334a19b0745ffbb3e9201669675d810db187581563c46455c5976df032558fb1ab8ef31142685901e1ab15f6b30e376cad296d5d516fc5f6ec25ac288b45a5ca852c5898be0b9fb1501e50be37f694ed8197345a543a8b4a8d2c87d447373ce6d242ca74f47d48965b2e58d682b160914464972bec33d3216fbd236bcae6c063db96ddb4954edae2653c6c38a5a452f25898f5f2506bf46131bfa4eff6624c3089fd6517e5214fea98b4cee38a32a134d5e1a33cc4ce72ac833a9ad45848224c20df60cf36d824cb8aed79d5dab0eeee082934c2c40ac1a24b0c8828e2f1f41f945ac443ede34604737bc52b683f7e60db0b7332db4a37eb72d398e3b87533d649a791d6b980b4ce45a42b1d68f14720c15c8f1fd19a3f023f6d2cb3ed139a3c7c4b76a1879214c65451e830d4be4b251434ab76d495501210ab84ba53ed2aa1daa7da274e0181b1ceb38cb410da3b37d8f7661be69324cbbbf389116ee62741b30dd0058b86dd538a0085ba503b028c10ce22308932c6221c99450081aca48cf551410439c4d44705118ce6ee56151544a0c2f55141042b889084527d5410010854104107f544c288b0a49e4a4f5cb0897cef743a8c98da397be1be9b59f5e3edaeaa13c8302a6281767241c410ad7522b4ac6d475fd26e233271c4c36d48087670c413993860f5aab9a49b157c77dd3be959ef59537e46ad361f922ad1f55dab2fe3f1c2501f5d4223cf8137842303f0198830059bbf809ec31ce4bbf7fa25b1f5f2707b97c0bf8ce65122e22555c0c311e9eb9b05100007a4af6f9e0c16c21d9fc0f29ad3c7217dbf5e0c6dc2d83242d93d953bcad580b0d0600952da292591e96416c05218d0f5c37501920f2425ac1916066677777777ec612e510da0ca809451a506628c71365c0e44b91d88321b6257eeeeca1e923de5ec1adc0fdc85912eeccaaaaa921bab695953be9222db34848b2bf86e10398eeafd0749d785c10d27c6e6f0ad1eebeff1f068405868b00429ed9492c874320b60290ce8fae1ba00c9079212d60c0b03b3bbbbdfe3e9187046e51ee612d500aa0c48195203f1a1ac18235794cb891b80380d1f0abeca7eaca3b8f9a160d556c72afbb9aeb72352175520bd94b533363ce43c8e6fa28d54e5f3f078706cb627464c7da71adc0fdcf5b85d1ca7aef83dbc68c5448d49c07a59d675653f31b31ee3f1c4f3399855fc34acaa629b601063843731f617d27d3fc408a19431ca3f1c114a1963843142d9bc52c0d78ff0dbb10f447b7fefbdf7de7bdc51f2be28df7befbdd3e9c47b056ed96077b7f468f9d5d2d2ddd7fe652d91065af78e8000b10eccf91ce0d4cbf9bd389f88c7d367d158fe9e8ecc59de1b100f2543bb2953b52fed646af7199acb37fb5902f396bfae805e85940315b5def595e8daa3faabf32eb620555555b780905a510bd0589f4180eee2c5b664e62e6868104897c4d011c4bc091999777a13326f22e62ddec489cebc8916f4748b9efab4cecc4fef66a7c5ccd0d39c32f4bd184a3b229602a9db63ff3a2135fbc56fd982ecee4ada6dcbf6be99b625112bcbb65be93e963021034714f03186ac2b85b8f44584ebd974520a12ccc118a5c4792919a999aafe7e7a2998bfbb78a901fcfd6d4f9feb7bf57a70704aaf47cac3bc9e185b18b906b03516ccc1c36c5dd456783d85e5e0656c3852a839f072d36267a151ef2d899deb1c674b02e72d975b12f23d3c6e49f467a0502814ea3b1b90564dc7d980b4eac3e506a4d51fde1b905653efd1efc1a978448fad8d04ed9105ea7027e2bc9b280ab3b0c21c94411d877613a777f848df402b300b4ebdba462cb803eddd4223d47168a75579240be6201f8146b73e4fd67b2fed84d724783c1d1b3e1e6d4fa44d54bdf92cda4d7828f8d3bbbbbb7d74dc8717eb48433e218d48254f3007a511a944269146e490148297447228cae8845352082767e7dd69c63bcd3259a6e7ecb4b8f4f0d733feda07971d6904e71285e3731a5bfda9b512208868e5e746bcf263235ef12140b5f113e30e2a46d4ce0e2aca20800d9f6ae3e7275eb9118fa29578e5467dceab1bf5c625e3c68d7a2342a3be81c7a1b143031ab525e3c67d6ed41b376edcb8b1e3c68d1d377c7ceec3376edcd8ea8ead23a2fa5cc6d601a93e2c878f564ad90f01680f5a10af82a8ea63b603a6d64d42610e061171aa56144ebdcf2f9f4d0ef5bbc2dadd3875db1a6195204eed40a3d689473ed0d903ad7450257c0e2f89eab6d5e7905338f7b9cf314ea1eef32cfbf1e90308a99102653ae2cee3772ea45e2819a59451ca3f4984533b87b78e3815adc42b32480ee114cedb095113a14dd44e38d5b551451d0ee02241cff6f41cbe4bf0523f87ef146ccac6e1db052f95e3f5f0ad84533578de5927783d3c2cd81e1a877f3b31783d3b87edc3357e367886c7c1dbd8201b9683cfb1c1383c0e9ec60fdfb039f03c2d0ed5f072e07ba0191e0a1e56d91cf8ba25a1c4a9eed0e881c7c19bc7265e0e841103468d006a5e04e0858bbba0b9a169c1b59801c0cc898793cc0e32313631303ac0bc542f2ed4a5656b31c198ea4eff3b7d187f590e96bad3afd9e9bfd8d9e9bbd879a83ecdce4e5f66e7a1fa339524c9baf3f778a25577fad6ce61dd39ec9dc3323c9e26d23a7ba56fe0e7d4b4bd7258658744ab30073be80a73900cda0050eff8080b7de74f869a89a240a377030f030303b373a5f6735037c2291bb4db6ae3b00f81e095b33591336836ae4e487d71087339bd93b3452236eec39786cdd06e5ccb7e7e7e6958a741ebdae8e73e7ca136588539b8998e1a6fba8444da80f8063e6e40861ecf0cad0f816c16ccc1bdc21c7c477c84c8959de39c8f30124eb9643f38384638f52acee1bb08acc2a99ec343a3c7c373288ff8a89be4c8269b039ff39e0d42e1d9b6c6231a87ef26397e3a695ae778c790070e3d140402abc0a3be81e7230d759c776d74e33968c0e740a31a366cdc877fb6204ffb75d9786f1d9048bbbe61c386f51273deef57283f3e7d4e026b1c88c7c34c88fafeb9ec72bc0097b4c3c1341ee7f11267081a6f4a837abfd33a8d06f51d1a14cd21a4a21e8fcaa1d981face75a0be93b3f31d0a297cccc50d751a5bb7f31b37408ee7dc8751281bc7c1f94fbf46bffe8a584f4f07a4ee7cb3219ad2e4bc8fba3cce4693f3781c1aef66a5c9a13984d49cc7a3bef32b872767a3d991731ad791731a3c39a7711a398f39d4ced6ed9c00a81cf7619cad8befa155151aeafd1c47511f399e437dfc1ce73b1b10ac38efadcb41e1cf6fbc331e368e73ce76fcd0070405ea5abb0234ed70d478acf1ae35de351a0747b6dc69d4712e6bd0ae03b51f85c041d11ddac503756da06ee8731c1cda01351f610e7ec7a0f591f8e0d8780ecdb1f19c9cfb00e9e3700e3469653bfa39f76902bce5260fb31f1f14ed845454c4f9639deb3b7fac433a8d1b1ab49b388f37f1668776b3e2dca771689c008f3ebf8192d487cf736c3cc7e7393b1bea71c3b994f7f1d9c1c1c1a128bae3e3731fa6b10171cdd97cc8e7ec6c341e37140ece0e6a0785c2390d9cefc82de73edbab395c7172be52e27cab904ab3235e5e477c8603777ce88ddfb80ff5f1d96cbc3b22ea8d1360eb80d41b8ca4e5e5d7cba5c4561bef6c074cb5f11b5b13d9ba4885e16c8f3979d4168b3047843968b4b3e1546fe7a73bc6d81125513b343a76d3e0d9e9690a8f6a3c0ea171087390dad8b6d6d892803d90877653d34e464538a50424c2a99cc3b7119ee71c728ac6733e314ee13ce7a4ec27a7bb9b6e6f1438551ffd9df39cc6369943e16c289a1d7d79493b0a9caa0fd477de9467a3b13de6727ee1488a31873a3b3955d4e15bb21f793e127370de324a29a3c479d3e0f9cbc18ae0e06c1811d91d234d1fd69ce3d0c71c0fa5e9cf1a69509a1c7aa4c91909f30eed50ef6c5087efb8092bc139c9c80cda146e38523b39e48497923185b5c24b5587308703d81e9dc377131e8fe9f01d85d7d372f8b6627b7a387c67e1f5ccb80fef5a0a15bed352ef7a0b15c2cb219ded88cdd9a7b6fd0f47efa166aca1ee7bd8dee674cf0c75dff2c2d085ba1f00cce3e61b8317ea7e8d1c49c284749184a238a9100ace4ed92b168b28b71edb11cc41297170b67edc50bf1acb69140e0a858a31e21c070747ca883a0e9dcca1509406a8768f08a7e0636c5d2c418517c0d6451254f8006c5d1c4185bfd93a18dcd6d50060eb5ef0b0752e686cb6ae850e5b3743b74e66dbba986fdd0b8cad73a9d9ba96175b6772b1752c345b576ab17559eda0d175da8eb098adab6ab71d4fa9f02f44a01415bea56ba32456db92a8e081f4119c62a14782f426321289442a91325246ba483242236a04c5881a41236854e165953d4c4421b27f9ce0e28de2a138e6204c45d890b99571a1782829e3494abad5c667c9718bc057a5bec7f868275f94fa2e19c618f59d0916127936296aa844bb11adb338a0a8fcddb4a26d2bf34083c07b6f6e1bcd8ef7927844b57b1a142d2a2a688fa83e23fa866da041da49b4ab88a54841058a14464eb220aa9d1623beea2610ed3ee239e698e1e794105ec2096184904f441152ae98b5dba9bc6728713052bb536526d46eb6d1f56c22b38c9d73523b599f4fa7ba453b29e55b3eca08633c80843106c11c77ec862de9ec2883ebd9ecbb8bc5d1444451a6bc9b95f16e76497f5f36953a222ab4b6ddc76915d22040b0f8f849812bb89e4d8729d15e0216c7a96f5a7bcc036da5e83799a049a1b615eac527247a70aa13f2835332a83ece7e92a82ead6859b3044555b862cd58ad937da2a45a619d3d41d09362ca13b57bc80efda0765b54fb9a8284da6d95ed73ac5ef6c3a5586d48fc68781f3ef5760abf668c3c01e79c11162141c24336248515a66891440a2b1499116e74a2f52b224e99be2d7f2fdf16df99efe9abb1fcb50ecc4bf44a845a67080f195232a4eed675a98be309eb0cb98494b4402bb24116d68c1b9c471c91de6273f16ee267b618ef26feb4d57837f126c687f8970d7b3791b7f9b8c7c59bb6f7b808441148d4d901d5795d73522662ce8a1d0f654b30c861748bf0cd1ebe6a5bb74986488f8850fc7c0c04eb24c1b14d8f78bcf5418f67eb5a34fe40eb1e3dd537348721b57b47f04989f03491e6e01aab4e3d28585ca90b85755c8cec139c7a435194c4ec32a9cb43518c9ed4c5112bc8459cea7868687b806c0f7c95bab5632b757f411e5b5fd1114794a130f70522a190a10b4d84535bf78f42ebb868a776907251b311a7de7b104aa152d2a96028ea9b0bdb1e8e5b60eb4f658556aaf34f8a301ca92fd351aa76946a5bf59aa16151068d8d98e3f62d7ed0a0c82189078c745cd4bd222e622c58e7e100c21c8440df77040468f7084ea55e8148d852df901c9ea8dd3b3aa25a1c8f8a036a1f6ed74ef517ae6a55bd3a9cd7763619ccad0c1f9648eb7011df2c17d59d9594155608b5851bfc615331193ef4bca20476f08ca2b0b09435628e7777777777176eb74573b19858edb668f6d8a3a02d5aa3adb25830c77f463d96e0c00fae4430a4baa86f8a1d80a15e4f8640ebaca2faa4eead2a6b5de9ac2cea92825e4e2f2eb608ffad11666666666686e727988ba249e5ea9b228a22350aa36a53df145140a9abc921da2bbc1ca295412bd547c51343f5653f907632aac68323b5a6be29a2b852a1b08aa055d43a5336a12501a4558b0c0fb5b7c4f072b6b3a9118a2c2a00ea9b028a29bbcd0cbb3b663f95155ac396598ed88f1df771c3284bfdcd74307c6719b51ca2594796111834fe96417ba96f480755eab5d9cf7bbbacbdc7755659a159d761e9c074e8b0685cde86f1c9d27b28f8a6f1658bf0e5ad224e310f01041a94a2555f3568fbadaf96d1abfd68195996d1368df4653a200db6e5d903cc4ce183d0327aa83d8ca2bda33d6a9df9e52c018d63d2d78f5bf78eb41f93ca517de76d09b9bd0f68186032a94c0105929ae2ba6f0a289ed0591c1b2db041e4214d2207ebd820f239b642caaf6fba0354ee164905f26352e12acc6debec08decd1e052717d45d1a68cb11b18ea865c41ccf40eb8454de2568efa4a0aa6194b04dd8274028a6a1ca72174208219c54ba533ca4dd8f49a50a5a6554ab7727a3da4da3a004348e48ad69348d269549655279a6a16e48743d9bee92524a29a594524e2388e8bda2f25ec132692e938a89c0ebf1190a437d87c04b9dfefe80d70344035e6ae6ef0c783d416c0eff5571802705016f0a264dc612eafbcfeb9171e3f5f8709dd7b3b339fc9d7aa3871a32522d7fe7792997bfbc9bc1c500407d36ef664aef5cea0eafe75bcdebb169f1645e0f47b315c1373c616edd084ef1d055fee5e91cd1377c7a79f85200b8fc7cd8d3a1b9fcbe9e4989d88c88998e228ca0d96c0e802d89203b87aac38f681d207dc33c50ba64871d5ed15c1e48eb2c93bec0d3d928360adf4411770b6fc3f06e7468ceef712fcedf2b6a5ef362a3c0b88bae30de7575f1a6d99648dfd08d2dba35892ea1b9dc16040fc5b7d9f603419bc3bfb29f8aee9033683a6cafd21d8249ba41f3301b0246955f236ce7af939fcfb076f25836c4aba433ced225dd62d561536256fa074fb728abaa2261a58c851b46966579b3340f27dcb62ed6d36e6350f9358c846ea75099c77c11f2b39252d225347f343c60286053217d618e7d6030739289012208041ce009288fc8b21a86e563656d422a8c0c971693e6c3ce8d1a3eec4c21334aeb960be678e82ea830b8081ec7cf9ca87c6c05957f6d0ab82d41e57308626ccf0ed91cfe133695d7045c9dd63bf95bdb7ba84921a7e41e594cac9099782a72fd3051c23f34155ac7dca4b2131ee214144e351147292afa11a7f849c18526958b160b2b5ba49a54aa750c30d1ba3d32a9d4dd97258071d01f934a9dd7c33e8318ca24aa6f77777777776f5363457928092da4f0101371148602a7d0ba395de83c68df7b6271ed5f150193faa810c191ea437d5484008b1a21b6b204351fde57816b48088e235e3e08fe817fe03315dad44ee764ecd8d09e145c08aa445039110561546195a2e8a8f231d6611cf5870a4feab5dc7048f3611fbe784a08eaab3f555021f24385214ed1c06f85f47107e15a1e40e07cbf091927ad680744be77f396d05ae7f04d348551eb9b7d137df926e05fbf1fde0fe7f766bcc3ad6348df1bc0fb4a1cb3370ec0f7e3421ac57bef3dfaa09085110c34a4d28bd23b8b4b2fe8085ebc899abfd86a6a6a620d7ddf34ed38506347448d35352f2f288c4f8dcf68eef22668629ebd5fde3a30ef5f3232bf2a8ca5241313539a9999892d64de0911aadd8f278534d3a24443f34873eb35dbe31b8b02a9f98bcbfcb1cebf9db6c078a9bae25f26a59db66932d7fead3bc93cfe8505e3c4a2d16ed66c44548b54325125664aa6cfdc87a95432bd64b236130d52d1252378f1265ee4af17db8b5f8bbdd8de005cfcc58bbf707dd38be3c5512eb61f417b9f6b9d172f2f7ff1e205e62f4e35877913d7b337f1e22e6fe2e5d9fb3bad93bd6f64b48ecbfb26e63eedc32fddac32373244d478171b4dccd6f9d438f357492d683743e3fbb964a5924ccca6bdb42db90e9361a512b5e29382c5371485c016d23383a1418c8c0c1d81cc9b389d644e2f2e322c2e30c77ec5c4fcaa30ed15eb0c89c207fc7ce9fb67daacc7b469b3680761604c9ac914636ad162621eff1273eb2c269617179717eb2ca6161818ba64042e2e2e2e2e2e2e2e32259993cb4f2e26d3634ca616ad7492698981d9b4179796ad8355a390b90a2570ed9e12726c0f1432c8e1fdee3efa71e9f5f63d4ec1dafc628c8f63673fdb3d658d967b8db2f066159968dd1bda071153fd9f18e17c9d56e3ddc8967199a3bf35629b5d4aefe0628e124a2865156972c4f385d4cea7ee43318db11322df0fe4ad71eba60ffe7b6f343998d2ecb851df6fd43954cafcf83d7ecbaf1fb1b08cbcddb5f9663f3f968923151a5529b7a8da1c6e3fd6a84a1b2120dd2e7f6973a9c3258c4b7af94ae8a7991634977fe1948bcb9f38f5e25073a2c1634000c1f89a9a6863a5d2db1c59e9eefdc15528043cbd0fb7cd3beed1c6c539a58328155e3ea935973597f23635101e8b6a539f145a1812ba5eea897c924affaa168c54fa9a5f280c85ca7e601cf20d22c7c1033c4ef6e3047be95ce854427da303c621d06a7c80f1c3bfbda881719aeb80cdd06e02f0005cfe6083d53c95fdd4fc65dc7db866076c8676f313a7e2cd0e35bf7808808b8c4700b69adfc49b9a07808b31c6a8434dcd23576393e9a83917634d90adf240704ad2becd16ff6cde22fb998fdb6d6c24dd21fba9a14030474313636646003b3168a050382d0410a3123a9d0680bdc79384cd25853426fb9197f09281cdd038f99bdf5cd2180006cf93fdc0ad074dfeea019ba1713f71aae65d73ee550fd98e1db0cd74c81d3b542993f1b8d9e0b9eddc56bd6683bfd95173595353f364643ae46b247ccd663380d76c36f5653c8078a8dec73c23966400c0db0d805892f926ff6da76c3a6c7b853c95a79916342eb617e6e45f6ca72c47ac32f4c71a71926a42d0fa0aa47d74bd6442c8fbb0cbaf9acd86f2b0a9500750d4861008e674f8cb7e7e60bc9e2482ecac70c7151e1da836d5e617cc38da1951b9c72d8908b4351b7cad81c986d86a0d7dcc5542d245f6ab3e2d371d1e75e8f01f6e1d771d6ab63e8297afa1dcf683abf49784b4adfcb2d9fa4a2f7b80c6c598cdd6edda6c35db7b289bcb2d4208e16da08dcdbbe69dcdfb88b9b6b1b90fd7f415e6faa73eaa84b6676dde97e178b21f19da83c6d9d8d8fc65db7db438d0d699cbcd07fccc0661395dcb84803052c892e5e0fa1e4a8797b21ffaab940d31f39e19a2fb099a8bd3bcab843af9d3ccfb95d0e3f1c1e3a9d96ae44fa54c08f9995f8bd56caf94ed909f798bad2d7e41acaff4643ff27a324378d8e14b8600e03c6c0fc765d3d9e8f0c73ae8a0439377f643df47a5d26b68f75a3aeca3d2252dddf48b5f9d916595100705f110265243bbad35b7d9b40ab70ebb6caa3cf7ce45951dc6417dd36d85b916a2e6d4f48ba3ddc98672100f1fb23878a021388e285ede7155ea74d1bb69986261e9231f685d171d75cd6d0e6dde55423fb86a731dbe190f966af3ab0989c6c58b33a95d94729ae1548bf7ab279ca279bf1ae2948bf72b289c7ab1c3f670d86caff2b03d1c9dbd78c3cce697ec98a83207c0f670f0b03d1c3b6c1c84c3a76db65775d83a866edd560a3353a5cb3b53955625f46efa17e5aa94f769181206fdc155187f594dddb69eb235951a189bf62a8c19539556954fe7e19070ab7cf050fdab99b73b96646ab649bddebd28ec62e323ccf569367e6263235c84b90eacfca814cc576a9b9832452302000040008314002030140c078462b16034a80ca3fc14000f99ac5c6c461967418ca41442c610424400040000000002684200043d40e1d458a1ca4d32122f284aeb711328b28a92046de899928359226350875ce557ecc2a46c352554273717a423142685999edb89f5cb11d814616f61a22c4fc1af56d47d3b8e22d85229f2bdedcc9a4047349434848e6345209cfeac17d402f3beb29059d7f92e367198f4cca125c28ca6d1e843096662bfc4fb8c6d14bfd0a92b9aaad3daf2e1c59483e4c462244813dbbe47b7dab2c48e89d9d29522fc89103da823884a2794d611a278942c42dca8611b51738e0c6c9ea1728a89b7d66c150ef7ebc0d2d59766209179a59d5ac7cc1280766c339967ad9c5d2c77a0070927250f62c876f97f3016754b3f0bd2367661d1cc10bf2f20a8b286c03d65bb5556511ec773f05ab6a7b9044089a3d24ecddd1248461110fce5cdf25c5e4c0944b6cf07db10212b5b24c4dc51211283524201c09845b4949f6d9942c616f8d5c2836fb9ad62064e3bad5cc6fea7fdb70d8b5aceb68f2b0162d87ed19af1819babd9a536984a2189e0712ab81c58bc0e84b0eb429c544b0c5c5792465264c76de54f41e6f95072c7b33827e19653aa5eb0c864c49c888997245cc5bf2c2c16508dec07254dcee478a5ea7045893453f8d8cb2a6be319f705da22e6a387be35112f64da85b2c8ff5945b1b1cb9d30ce6117941812c639c86b20edddadf0f035394bed4805e4c1ff49b1c6722c968118a51ed35a249db55db25c46c858107142c9754e7bf2f686be07e30338c6655881d007795837331ab118041d7f43d0b2944812fa3938089ba9cc94cca7b86e866a0357ef012e0419cf8ce98ba16882193df3729890529e8a954fb9263b91693ae0c7ca74bb3a0c2208f440ee382f9167dddd2c94248c3b248de0e9ea0f47d209bdaa15e8bb0e31e8ead48993d51f16201cc685705923260dfe3d778b5e17c43016146577783e662a6bba85af2eb8f375931d8b95144498912d979ba87ca808ed8b8bb44426c398d5a1d6a087efb824f5c970cbd2d10958bea9ffcdfaaf9ab285fa789c0dc1e9e2dfbbf798b7203288563db475bee52f29a599a167072e1ec9de2378e91e89070943cf528940e35113cc80a3042939479bf5f59b18be2247ee804744058181a9b6b412e06230dcb37b6c57691849b312ce896072000afcdc71c06e6d8c52ef56a53601ebee7477ec63a46661ba9008ec0b430bc727c31827ec3ce5406a3fe7682496ad5c31024339cde344527ff3dcac5838ed31a6fd48c319cabc3858f035a7adc98c1e7e31662a01b162d4ce45aca6f59baf377f0d4389f5acf5918ac3b8df9dbd000d1ecd209359c9588954746c1c2044be88d4bcc4c8bb34eaf266631ed479e02caef059e6f8eb3d05e96545028de39eea93c04f24d55b4b9c63efc8edbc46827b948b557ce92fd3e93a51939cfce6ea3c31144b56a727c219e56ac668cc25f840249f14f251f39cd87fa26f54ba9e6173774801a12c6ec73fe01554c60446eed963351f337447e6c27df09b5b1acb3062e745179e8ea38071efb3a16bbd1ad9c919e2a64a1b7b94347bbed03b6c9715053e6df08d3dadb7be4eaa6d484cab024cf8615a0cf326ecb4a8c8588633cb36589af55979159bf74767650529b449c38fb0b660fe3d939882bf70682b5ce4e0431063efbfd634a6603589e10a8a8d9ec2118213bcc60581f46a5e8d4b1eaa29073ff8a25488223380995ffccb0da7ebe83ae8e7f340e0259a392ec17dba58bb67a578a3c278728e1e72507a9ad07bb2fe656383bab6a139398117e621db7a33b1f0f0950366f5c980a44ef4e03f470a6bdcbb313f19e32df08bb7bae288a5b218d8149f1861746223b43e7970d51b82d618851d3c9edb5f53872912564c16b80303939855d3006d75b439ee4fee1b95ed225b070e821b3d2b05c367419c512f3731d62d7983019d61671c5e81259fdd6c37a2743a59b4fc0d09d869892224b50b29e11a35186a4f3fcf53c883c72765e6d9f4aabc538a7e5d10bfe7be0b717db372ad939948253343817f808a5fc286a2f0879a1169b72b34ff27c0ada6d3de61bed4e75518dab5c7b621b11fad9dae2c52d7de0e31934ea6529cb52f4f843544eb84efc67d64f8146e17ea6d55c4e816138c516203e62f0de38c1bae314aa17471e37cea61869b4787a7479180a121e727b1647466143054912c5e77ab5ba33ffb0b1b94df343b007301ebf049cd677cbe5742fc6486e317af29888759aa460eed24defd7b3e389bad6d98efe568c8a6c5fdde4a643438973b7ad8c25765cf8715b09425bcebb8ea237b7de1d7661a036e2baeaf69ee7f171a5a68f4328b8a199ac5929dc6597184c84bab85c8ef05993bf9e317e6efeff72a84b5c1f184d32424b9b4ab71e1690ac3768e3cb006d32bfd00824be16d9c4dca51cc1a69462aac23f6d711b600b91a2851ed250779413bcad8a8d07225373edc4c6fcd7b250b920b2578131c235c24d4c706e013562dfcb799f29ef6f3d465ef05cf0d4775443a96befeed1433cee9b90158122d8dd6f690a06fdc2038b0f64a625f74be3fb997829e8c69ce800b38690dc0e35e63c12b058a7878f6a4f1979758dbae1cb683721741da84bd89be8b8f85587a3a6cc0fadd3b199dc4829199b2e6dfc982190af095b1785236edf2262e54b062f3269ee23a84c76ce908ba6dbc32ed352ed6dda384e464063dae9579de74ec50bbdf560ac53d77138984be16951e840646f74546674ad0ef736ba21884512a44481a081ef1ae6dae58338a8a72c57aeb496df2d3322b2fb0975c6494b34ed1da7846ab6556ded1e646a41b5a6fee2ea8796984fd39038ec041b7d4aa70b9ef6dbc45f47874db9dd8a57f656c87e04d8336c087e8963462bda6c7929c4b55fb8bf5ea1b54d4142a4a460a2fce367b9047b0e647d976dffe2f685c37744fbbe9c241897e151a9372795df872cc58ac81b5ba9cb1c1de141d5b9f0e4afa0e15e6a12a4e9ad41889f03aaccc0b7272032b6d83d3d3f02df3434aebb67d5329ae9e3efdabe26156631d524ac9945536a593bd0896facf53bd2b8f4e6474fb01bb65987bf17ece49fc80475b121bac98bd88eadc042eda70680b40c9487194a580aa1509af07d2bc3ea9e18e76a3427cd7ea0de240ba764e07513813be67015f02a5019869481cba965b1cb6e9178406951dc3bc333e0d5ec20089bbf8ca9dcbd2fcb56453eade9d2563230ad6dd9a07870318a407656c2a9941db6c6e3c0a268579d22e6219fe819d0a45d4293e366d11dc71ea3ce367b95a714231888fd8139d90b6274b6c9d50732b2aca1d26df210550cc12250ae3de3fea8f6154f3f33d2a3942b94246522a0f04cb452befb91e41bd083b86011cb2f6a797656007b7d1db91df287fab7a978f9c5fd1f0e649aaf6f9954d892a4f4339ee51b1a074446e154a37dee550700172266d3363df22ba83ed08e280ce4be947469d816b88dc974698c505e29f1d7c3d07c35bad68f8f0e383a54fbc5759ff7d404f04a87a54b32fb7254e4ddd06fdc9759ab1d859d7b0a2314778be7d33b573a42c905bc8c683cc9a67ea45eb6c968024d4e970e4087bcdc09c83da7f2d3f0e8922e5cd62a0a42881114b1aa0980aedf9d750b39d6f5650550e902981fe1d9046fc704f93ec6c190c83c146296893e54b06a46a9ea9c94aaf95c963b18b8c7891436358c40a5217070b28409264f94e98cfb05dba0b5ca973d14c20cb8381867f4a3191584cd442c1f94a18bc881306c8d98dcec0aece346249897b58c2d0744cd5aef9a11a20f20e8aea69f028027c38c534319e4f6d79828d6812281b54a6b98aa31e0345d69a4e4161d86891089244451e5975e21b19c0c94eaa4b26163039c0f021602e3331b7fc396c8c9094fd2a610d9a0f11c8c8f350e1ed75424d3d3f5a097c7c67f80e9d42cf799ee09c8f1696e7243973f71f4d2b181dd53b8358a63ae0769d214ecf99df5cfcc7da6684c7b33bb58039fb6ad0ccd98212f79c417481bc7918f970e8deea9b5448de5af3cab8f357fac61585d23036e76bcc6370d9d2f07a2f26c76f5aa76eb2b7a914548cb6f7918d5d1c3c28db7ee43475f26fa2eeabccfe3fad5d038510b6dd8a4ac4f9f4c7f07150d974961d10a5b97e429a6094ae23e87b1801f61fab479cc4d371168c4119bb7d426035a2064ed003b787d376cfd09698a2ca1677e88b20ba596eb9397807624918e1ff44324151dedb4aa7d559f997f61a1860d0ef9de398f076f4b1e290fa07e359356ab8ba7185b953f8778179f39fbc98e890a076a0155e5686c4ec186b7b7531b2e931e1f3059d50ede6c1896a0b05fa8db88836dc18cd2f9f99feb8253a733c3286c44caa57258f85f599a98e1c51c28203a59cbcf9c4a584b77e4d51bce8285f72c0798965c91f4be8dd9d5bada09ba4c3afb82ccd5342a90538e864f3a7938c3c3bbcd0df590b49bf47616c2fc726d8698f88eb1b1fd0050f71c597edd0880241150581a64d1b165113b0d483e69fb558970f240b3bf5fe65628965f9e86f2b27f4cffb53b9dda6b9a291428661a4b7db1b047e2166a7c44514f0b1ab7026469fc11bae074e8368f352d70c7d135f6b21bb24a1924215a3880a4ab755dc9a017eada90b894dd10c27de547ab52046173f9e03d153bab1d232da64bfcdd49274fbe9f8d37fcee192a896eb51f4e6224b6b0d875638e1abb885f62a10ac5395cb113a653a53ea54204989d67fe0916274c185e09405641ae71b9906561f998425b99ef688350333c0faf069bcfc46bb1ece0a69b05d295d472967ab099b6f1245c296b878f12dc8a194154294665bebf8643a51d32764bb0769afdd7c7a905486dd1fb2513a98b2152b9e2970070e5edd8eac22a9bf5c0bf59af22a7e295456852925a1422ead599f0aa2130369adc0651a7801d029f1c230b02eb5f2d63f2a8cab486b86437a76a7b75e41b4f9790041bc6675629aed92b5583cf83cbebf0a395f33edeadfa3363a18c19c3b98ef949ac003743f135f4a762b46a53149f3a0cd62db0a977f6794265cf3ce3c4a3c252b92e75eb23ba3646227d94422546bfaa77a7d68fb99f0e8f11440d7fa95eae1ec550015953560c7f2d384d1e3ab4f21a5066452f071c3c998f0281975c1d147e1fb938b07eee3d21c4cee3a69a9cd7c5b29ffbba6db21d449969a95295620f58a424ebe4c1bdc34cd03d63614377c149d49849edcdffe6e5b06d32e7b910d0d5da70fb7541c045d9001d0c536e814c76a5666f4992c4a9b99d49428281f200ea20748164513622c73392e68f7542b855adc4026f3f0960a37571c2d29ce32a33c63f743f99306e689f29a1691a91f59c537c0a72c64bc1293f311847912947f01f3a42006e6a8bcd074182a1f513d215aa7f1e42b4f4207f4932ebccdc4d775b7363b5f8c66cc7154db2113b5c8600de677c36bad914ba68925285cd46fb3edc7ea6d6d61b51175f5362af783e69e799097501740a580f281e037259fe98a399a44d3d3dcb8be12e0fe103bd6469456cecb9303d4bbbe5ba5c731c2960285ee324e1043326979a25c13b79532beefc4e734b971ca4f73f46d99a63ee5f2aa6c0106147af4d191731d2838eee2945a42a2a278c5731f360729dacc181f8bf16ccd024d52118592e96f7301819d08060658f7a5c80c78e03ec1106ac0ee3c50af16a5d73dd2d1cfc6850bf0691bcf6a503770b396466e12dabe4be1a409cca4300107c224bac1380ebf6951ba620d0105c3e5781d148129cfb7dd65245cf6fe88606b0153945c1304d43333ae81ba3606997fe0aaf57013116bd215a0a230a1018c542f1b50619745451c9642c8475965c12eef12d1a1036d282233f5d95d32a8212d7743e724c7effc8d6119840be788e21618a208546a5679ad88d35a0c224b6002b62453239d7f7fa465f858a5dce19e89b9aeddcbe0f82dea207eb06c34e7c873ab38d1f8e79fb845c168f7c491a2fe54bf588495339230c73a28d79d8a47a2fdac432f588bf20ed922d93e549190f9aa69318a74c9dee0717d58499128f8342b3e557e12833144bc05dc28d6d441fb655b53c9740d5572bfde1d298ed48f9326a3fb8d370571a0728a20e1b10d3467608a07e9dbf5a3ad6a24283972f19c1035806ff253944a4fb79368ea4fabc7144c594f057134074116877f181156028cfdac83b08afcffd7132ab5bc833063836dd791a45f7a11931a053ddeddc7f248633e771f86388a178ab9a82249fd12678647f048a37958f7ccce122eeda6de2e7627ce80e1d29c7976d0f7a0fbfe5e4a3a66ac409f682f0274c39c799bdcdeb414d2472c0456a7ebdbdd0fdda345720c66c4b0f4840760846a7a4e1dae4bc9ff0727c3418db070820d5e35a3f477842dfa2670f8e98457d9bd2411c3695d7cd52944b159e50c9f08303a12107353aa16ac550cfac8c8d14919b799aafa248db7d4bea58d5105bc19ce2e08fe251317576ee24db55fd3502362098aea4887330de644720a2ba876e8f8772ab15cf179dcf92986dc5e2e0279a499c9c47aa2262c16a520ac6de56ed754e4f72940242ec02c4eec65a3a163bbd44ad2fb9e845598bebb9a64844e9762617c9f38beabf07db9b4a1b7d885f2893d3c6828187f5288a51aa01c7c99047a0e9888e4c74960ef114a180e07aa2c97f49e7ba4c4339d03565c2f073b3a0128533a29491cd9d01dc9c245b79bbc7b390ca82d20195a9f3c4f16aec83353fe885e7265955eaa22b9aa467e47685de73dcf1b41f546f499f9529f80a90ba9081c49695334f571642d849dfd49e9a06c4e9ba0148c23a5b5fc5cdb49e97c487d807a88888c0a3a996b62fcb897f9a1b349998d861471dff13f0b08fe6188a64c693a2c9ef1831a04282aa78cf9f2e4f7d6a35ff64abf619d951206d322b6e370da757acdd34630bd61fa6084303dd1c39cdf61fb3107f7fb0ab463677b5310b75bfbdd1169f9d30ae47f834afdc34072b778ec4606b78ffe6ebc8a0ed4f4b5b1b3524cb6769b4818336f3646a0de5da98a0fe16a17d0d994636c6acac3a3bc7c840f41deee6d13200739b5184f8c316e9fc347e8d7cbcdc2fd99e8fe263205c194177dd681d7700889892d827e18b3640ce3f3830560743f34239f658fceb3a0f13f2ddca29c7c94ef3919820c2274d403edecbd31efb572c3c2ed7a3388afbb82832b5f0bec7fd67f4c070f096b6fc54597d9a1486e45a49e9bb3126635a4ae577013024abda9a21fcf9fb9801a41dae50b859a4c95fc43379c1682c4386a5c1a014f5ccb45f194eea56f9a30361b2489baba73553b2d6c04dcffd3302069d4fe3eaf3ee21eb12af0c7ea0997c8435f19bf75d2f1403ab0409ed19869e3915fc9a43ffb6301c8fd103d49dca9230c92be15ae1c9a4481db7b84478ffa72a4a3f803d7f1f0c83435991403295d6226bf46881df2e0d86643c5cac03b6e6f3770fbfb45ca1891ef02bdd761e504fe4c0ed1d5ac13cff7d46b8e491ed7c05ed9a83b188a35d0248dd8b2ea675c8902658c232a0e91d6a6f247bbe41ef07a37fb72d474b1267aca71ff8d90f259ab4daa213249e2cb2c5610bc768cb5b12d549b1ffa4074993446d1b172fe872b7756409641b78526680dfb68e5f78ba81b9c46e1559b100c4b6de0c112363f526f3018df33a42d31828c18000e70f29e005205bf866f1eacfafc27992fa75b0ece0893b422a8db96e3a984f4b9a37c20c73344d10634ce3ebafa2382039d3a390013a6b7cc250e735d65202e0b765320f27325f391d4caabd5de4f987257b63746d8ad81d3da38542ff5fffa712df2439884ca97f9bd8faa43f73e7b723f44102a37cc94478a8ec900458d8d67c8f783896b3626542a59f89427b483b75600a14542a0d20d2f2d5ac93f7fd566fe23dc67c7aac2cb9bc8318c5c1fdfa8a8a3d80c463f3b1bab0ddb86f58a713d6fdeec0f6b3de10b3dc6a9302ecbbf6c97f64132c292069fa7fb38df5041de36a80e05a38122ffae9aa2a307d0a50db4949d57a33e2fff66fd1c6f13415187f6737c6a8ab87a65d7a195940b3cf2e0d0367ef0038bfffe57858fdbe32a3b86cde950a2553251bf48f840db97676c03b881a909b3b78b9d57b1081e08fcb656990015fd5653fbec7c6ad8c52fc9e9491acc564e13c79090e4fc27989f5f4d738270b98210269cc14fc7cd84bc3cb89d07ab218d011e7efd194ef34cb537c33723ea456ad3f6725eafad4a05a5283bd02813b9a6ad51257706df10fe17768c93a0f7903e61c8f1bb8efaaabb76363d589d64d21261df2ddc56eac43a5c26ada07ae90344a4bdd0a1069ba765145f3de6d29dc79d11367067572ae3fb462fdafb7d4513ae5423351985acd2b02f07393b256be83849b054633b125a212bd70c3ca4d3f3dd56d8765e39601c15cd7439ac1c822e879ed8e05bffe8dfaab60af4f5116075952d203c6086d06fe85ed37b055bfae95e533e2a35886b1764383d4b5ab163c67ae5734f5de532236048af5c29057ce0fefec76576816b8a59bd0f4a38cd0b8d7a3b1fb8d1ff71dd9d980120ed664d23fc60a0cefb772ede6d79cd7153d3d24ffd0e8d897611e246deff60bacefdbfebd88567c20e043ee356ffc7a53b00b10e129d91610ddf70a77fef2e5d794d27cacef8c1f8e1c07df556ebf21483e898bcd596c0baa16d0725aedd846c8b57ac7569a56836df486948cf0238e92398a37894a3983ea57d3e903b9088223ded8dbea2f431b45fa45e80cfd80a34ec452887d7b1d1ef9200d9f3a17c0bbeab8b93bf52d15f510990a81ccfa3ba2b17e94982cc89d9cbb4d1eb051437b22719cf96e9612c6e1a99faf4d08196579c81ecf0794880be897058446eaf649db88d70b9a8cd0ce238d136e487d9d9e3405a22ec0ef8fd9847fc470378af8a8c94008b38020871ff5992bdf971088078a78efa258015a51e9017941bc9dea3f7c4cc128eda5eefa30fd39f0abac4aae8afbbfa0ac1ef4f39982bbd9f4f0b4e7ab16693e0e6adbe5eae9fc2b4e54b88572336bf0f8b13629ee654d290ea9039894c5867d78ed0f308cdfcdc7a984a142fd146877308925f2e10d7f8a64180dcc3fb4241353c4337fd573eb61903246366ee98783ff555e8fe02530a4048ce040c98e2bfed9efd9522807136881dc6b7cd30cfbcd7bf0c23504b7a7d0a5960ee8596813d3dd6179e5b8492c1b4f019030de10e12cccad9bf16858e41f2ace9cc6e438ef26c6e68c99573216f09247d90c19099779180131316ed4e2486926426b1cf436fa678c7e6a24b4f013125ff6c7e07355622eac25eb8efaf23e6e61a4c2d400f6ac04de806b871fb6fffc9bec0b01750852d997012391350786fc659f402c0813dfcd4ac57a4e30b04ec4fd56815962ea123623da57cb992468a67a8ce4dbd6a01c4eeafbf4f50fc3c92e6697ad2fd4e80ebfcf322001b5987c5839c832708ac776641b726694764bd3e0985985082ff8fd5bfa5f912be00dd650383beaf21e1c295bff0c830b7f9fc4ab21d109a45e914569575e5a9ed942242edd6f393f8684d1236f08cf29e91d2541e496aef4a518cb605cac70679663ea64a592e37d847b92e83e2b042be1f65ac116d269985450b35243b6f00eecdb08822b3925ff259121a6ab06e654ccbbe502d3b12aa5e64ed0aa58320cc0e08cba56f4643c9d72fe572dc92b34518d3c21ce9015d0250e8c8faeae27b101e067fc3f2b5771b2995c7326107215e0cee6c5d3bb9be1b821bc00d76e3eccfcd9b4b5ab7fde4f34336313a2ccd6a0ae4da23b42f95bbf2d7de1a2404c407e932c6cc0fe092d078bfa1ce86ad6535bcb8816cc5458e3429fb9e1d055999978fa68e613df3c2420e0572678ce9a2e751c6dee85e400ce1addb38a16b3421ae1fa6c2ad45a1fd10656308295eb9a95cea3c928183c82464395ddb98134b5ae1d3992727625bc9ad937bbd6e59b3491fd72a39f9332218fef5c08e300be75ef3277497a5c4cd63ebe3845e850eb78324073c4041032c7f042f9774fd508da492439454148a2595b5782f9174c2d83e0310635239cba42282bf596e4d2ae717744504ad584dcaef23538e0042afc53b7a3aac2022b08066e5fd3eec155854d41984f3ff43352d4a30619e6d2ad266aa3b442b589f259415e991e01046587c1c29cf9a0f6138f5778e9a8abd2d032fd6f71693bb4887ce582419f407c6f13048e6a195a895ebf284936797d05c2a1312c7c8b3374424a87e8c187bf6c225963665cead264411dbb06b1a5e9b32a66fb329455bc0cd82eab9c26bdb9426c2297bac1ef38351b1573f8e8123ff1de472df3d374b1f3ce08f9b9268cb468f9ec3d29d4918922c70dd94918479b831b4976ce5941eb13bc331c96bfc88352e1c825bcaf14dd9294a31a5b1232a03e12863f83327c22ad2322465043ec2e17aa8a3f09042efb0879f4f58b0f55ec89c096241352e00e36104969f78286ece62098af07fe8a0564077e6c301eef6dee06e18c51e5082ae4fdfec1ebd65a4110e40771607baac2445bb6281b601d49b043364f177ba3f0aa958029ef07b9dbf4acff09a848e8a7dea75ea97b296a2abc99476cd1e8e5153810e83021bda51d84c94cd6ba6f6bd70073d0f4d510a236e45d20ae44ec0d4067de328e88c9302e5a604924245e84858458ed3a53ac6c4ccdba348f862beb47d1265990326d2983f923105a5948a0b584a000b5ac317a8c6132538860d4a60086a1d1adc4adb286998d010b4b2f0ba8f9a3b8953a5b833a1e97119ab1c156136f66e3f470e409135c01c01ed8f402223c49922050cd3ec7808893cae0703c247af1fa7191c2042228f4e1b7fc7e9f024470449ef19003d414d84627c9738d0de8d43744d80502b7aec18848febc1f0d143ba1b78b528dfb5e20f632fb048ec21c7a577461e0d5d17f7284423c7c17a36aa10989daf7f54ae0c2aa6add860d80c665d4b67e2f49886413f8110831ee2d3bc869154c411272c1165e0916623a2bf406aa2f3035894bf5c82d79c5a0d85063082eb771369f9c851ce322403f8091b2bcded7a05cc6cbfe7f0c6c5051432b8bdb23468c60c9d5b1465982c229979a934371c38114979c1bd5478ec5992cbaaabd70135e46d67f7d6ae31de629c70304e69b00b1f11cac339698ca465a1ad11e22f3c127e1590cd404dc5b8a82948017235040d84a06951828de81a0cc1d901d93d02f0930319204917a82644ead02610acc8bb3873564c207d14f857b2ec56e6c29018037c786db42071e42817c09087a7b099391001a9cfdcb6e2613261b0cce2a749a3d7125c8265fb4f61dfe10b4897b940037203875f509591e1174d1256b8057f391c0c08dc857c24c319532e2d0bd90f26f0c5fb2e2b81503a145333a1d5c578ab70d274e2fa3828b1ad1068ec1fff6f229003605404c906d5cd2abde2d58ca4744574bb7c0f354c8451c0e853ea1e1bef50f68d79e6e481b040580ed5af8e4f5b20c11dcbdc258a5121b78d47e55af7fb7b704d294b4ca15365efa96039d81bb33a9205235b7c4810a3c61a4e044f6d90bea37f4921fa36c32bb1b10dcf4d9f8e9df70b02922a6e60deb14856ec1ee7bc62e38e49c7e2c3eedefe658fb6a8440e44eb82e4094fed0a1b7cc164772501e89b1acd1b86c0af67f15a2c5e1b8b060d6e37d9b84a22069ea89735f041e2b1b7ceb9571ad8e420ac1fcbac2d64212b4696a4c7ae1efe988c8d87ad490b921168b01dc9824e8587a3f1ce290dc7a1c466e7a9f02e4d77c7e2b63b00d9addff3b8f21a5cb40b9871347383e8c24df8b6513bb1a01bddf18aba805b3d13439516823371740f20beba77416651caf1c09bf407864a77c962f920e910880ae466b54c9e4e3212cda6d88bd514124fb61fcb310a63e91411cb2dc6805c9e87d8392dd77b761ec9bd1605c3ecfae83fbd5bc12c162d12f03c354efa20a423c3bc84cc89f9b3dca78239cda3b083872da3babedd2ba9535c84a566314294c7098a7bb6fd843dcb05efcfe05b208004057131deb8ddef20bd8a03798a1808eda4d7005fdfca0de687e413d3f13e6a13f894a7d99e90813ed4a722f67af8eede3e3ce1037c2b174ebfe580d85bb9a1a1ed2142c0c2502e56eb5de3eb357a4dcdaca39eef4cc429b65a8c03ea015d3f56ff533a251a15a868adc798e87a5eaeaa58d8cd0c379bfc0c1b7c0376ead27d417e6e26bfb9817631a93a13b141a0a0f7b6d40b028c5eb330a8d3845e9592c47fb5005ce6814c748289cecb2e5ce5d3499d075beb86b7b1641fa25fed315cf7ae05abd1f7eeb3897b68e1af0cb3e8650fb1dc9ebef119a7c947b58fc3617844afa9acb376eb248b5666f758bdba118fb7ad68ae0cfa9efba7f174130352659a559a11f2093fed1690371ebb5d0df8868fc23c6eed7785b87fffd69cd1b866e8233f4a1824ee856840399206a1e7743d4d64d79a811c9184aeaefd0b17b1644dfe600710459d2114d55d3e13bb8aa0e887318d73c94e1f60c70fc9a305e5d8832e10ad394b798ddcacd87803648032c896e26ce8383f6dbcdf1b5f0ebb2d6b8a414b3fbff76dddfef9b463df38f89613ed52682d6cef1432dfb3dd677acbb5ed079b0931236342db3f359252083c362676d35a73e84d48f86475c35d352be3c3030a5e0c17d21dcebe1e7dda0340c26f84dbf4ded24b00167a086d2fcbaa3546f39107d0f9ae9a020da603da45e3157f69c968ec6b2f1ce3e9bf84245ed72d031806caebe090d16f6c5cb270162a1e30bb89366fc56cf5564da798e29cbf40d08c26ab038eaf53be3bec6ba5df23791e79b182b4c08399392a0a2435cec8592c0c0e66a0375d0c0f4616e5c887290987c73fe9e74e5b9bb52811ce957c32b7418956d8cbb55964f82978ceecc937a61246480d64e0a908bf1b46f84c3b30dc07e0d216e663f0ecda591a46362260e51ed31c6fdd2a6c20434ff79522df88a04ac421e538c1eb77065f0f6eb11c22b884c4983c4ec91a9a12a10d5c8d2a2787acfae310379a546ffef09c2eceb47e77aed489a2a8c6d970f5de47e6b705afc0d9c86c055f74af82159f9f68156a42392b6687c9b772b67056406503ffbe844efdf2925677c28aa2609eff1ccbebb10c7709ab9469cba45b8728e2329429ece58e67703bb2002bca2d83d85d117473a63067bc06024dc2ec945a445796d781a92b81c197afa46a1351194ee443aada1b7a5c6fb0dcaf1bee188cf9d9f52a746a35e84a014ff081e426b372a0f2ea4a60fb008ba3fbade8fe5767c94b877fde928651413d59f36b30d0fb8210ac74a4ae041f440139e8ceb79bd233276f7525b80e1380e60c5d09e5b8397100fad2a84e516a1635544c3e73ade8c955422bdfaa9ec41d15e8b72023636fd0f2baa2ccfce878cc3b7c997c7189cbc065b61ecb0b2b11246ef10d8cc0b6c6ca6ca52fcfdfc364310f02f2c2554258a92c4126c137584431e0a02c812c17eb99ca12ee0d531f8c4e27d79288b05ed2e0752df08ab204aee490d0dc8062c886f5c8168f020d88cac37101040a8ad47aa47b1a3c147a8199af56181098e628a170cab67e3c6572415461fd2b3744edb12d21ea942584505d4f284208315618fc4ec8e330e6d29d1e8b3c874376370688893befab1f6cd7628055131ab1ccba1a01c312359f14b8684c0f1c4da1f3128ee6e8953c93fc8455e3e6c07ac8b5ff02b391b284be6ac015170e988d94d27976124859024b4dbe467568f2de91744d9d910005af1f2e2b7e650734e48a7860cfe78c1b65b17fc12578aa1045fb4776834508f57ccd2e12fa9425300c8949e739235da02c51a1070a468fb0ad8661a6376a1ca166f88d94763026255656966815119097092bb6eece8e00c6f4dbb4c5d475fc87030764cfc5a543370612608e5f9ae3ef67385c42bfaa01c7b70b56e00b6fe112187169756163b13b039db41a5e0332711acdf30311844b6c941dc700077a67be7bbd9b9c7089faf79ea8b663fa6b9f2f4eb84450a93ae67744be3c62402c114ff355d68095880dbf0372d22e72142058ada61ff3a9b48ba5eaf253bd5d24c84ae401fd7c21faf4d1241433c2c6a62c4fd35dc58ce3383c915c2d1e443d14259815cb141d625d79177cb18566ed72061dedd73bc49973bf938f299aa21ace8c2a5dd3a22a4c5aa0932af2ffb1a062b04783188ddba25d9ddb6efdb662025ec8feb6aa410ef40b4242b52e18e52ce49d3bd9f0acf00bca120be242fea09966314766a05564d44fed404f5d5f5148c99c0bcdde663f81a1dbb2f792643b2900e1525538aec97b185d25e46f659bcdbdaac05e7f22d4f54440190220a6ff0f01fe92a2a3df59325e9df1df48037058ff45d5e37e32979c37af26ad31a836d24a8e00f98a5970e078a1d76393514a73d8e3d8b6c844b40cc54d0ef261e073a590f5b26ac3bf7e429409ccfb34306bff63a7585c0fef16b2ca82d29b38e89959ea562ec463f70e9b779721f5155518ab16a426d1a3e917dc34875d2faf9c8061523521c2f5e1a357a83ed8f2852898424b8b882641ec4ee78907f5c079de0445b383d184d65aa139ad106674b21c10575c20ceae848dc7ef83c79ea36eb4459a6b3476fa53905fd62577354f8abb9dd7d13c89266ae93f5eb5643897366e10457dc6b9ac855b4bdf977a41d35346b020110376e24ba37dcf996bf408e92184453dc2b383b2b97cf91acb92f9b858304f58111f712674556628e74856bd5bb56ebdab92ce7d9e54233ca06ff7feae1e0542c8df93e7bf76aaded561733e11825282e2cd291b9731827e4ec47859e8972a91fae6254815562a34e53b02eef865297e867df233671c646df48722713c7499b55f734e71ef80e9d70d48e9ae5774692ee3672f7bcfa84069709a5d2d686d3ab483d2de60043a8a3840ea41c5a90a4dd51e289ad5ac6c64a5b3573a7527d8c146670af6bada842cebdc8586f84e1e8f3eca5dffceebd23c6dfc69c6eb51f9aecf0b6ad7e4387f19632d4347002b4342b3dfd456acb330c22a31abf7fd974570568226536f33257dad92501791beaefbeffc38ae32857c4bd24e8c6d84a28e8ea3b9f7c91cbf04f44ae4cc4b9e56b654bd7cf12a5eb90340488bccc657afac8b8a768dd11cc2ec13972fba03c77ca1d75a240e79bc6456f53ff1216be8841d3198e58b435b91233e5877f7209950f9e29b45799f45e46e393aec5a17eb07303ca094dabee86464b2c1dfcbb5a380a30b6d1c221c843e3390da31b7ad09caf99278d376140aeb42aa19832b9662af6282fc42948e8943920a89b1533d301d958a457796f553f3739a64a011634e2550a5fda3dc4363700fa15182362cef3269b7cf58991af9ed4b588e55ffae0b9b3a1a123d6965d7f3225b10111e4d1477c1991c415b562a51f8b6c63b7673284b221e83c6a1e4579e9a0594e952a90f31e44f39583d747d796564f5d37b2c6baf9c435a099689cd3bb98fb0c82075026ca046cff7c0e0a71e44ad876a2473f2f960d393c0f84d6906638c8d21123b11956246e8ba23d8cd9f5f940d2a3e672f6918098ee6cdae79e456aed38dbcbdf9912197ab5bc9454516725a5d94c1c265e0991be396f13ea5b1bd9b20b72d5959db1723da4106aabf4e162a1f581d624b9a2d6d963f9980bdcc7d5337e334315bdfe47450b95b4ab6eeafdcf22306f1ae8011538710ded7be87654c9d77c15415f1740539636a74d9d269349b1237aaabe714cbb9a176c939863406b838844d6320c5d8fdadc2dfab06012848bc71629a1b54851186af30fcdf716e2aec75980f2c9cefc8907e7aafa04e05d7023e4722ca2641f315c1756a703229098ee1c9944af887b2cdfaf8337dc55c17c24a9cc9160c642dd9cc8f48306c5533719c3c140aec14801244db2f77fb74c64564e8a7da67c27707bfd04c5816bfab1b402013f9d05e70fce91b21b3709fb7da24cf2adcdfd3dd1f4495bf2ab01bafcef9a1b4743eb6fbd3037808533a1bb60e9e170f76decbc560a1ca62a290d8f661badfc8588f943560e3ef8ef7c76a215d3996ee20d0a9653dadf440a8a36c05b5829dad377e6c78cc3d804edcad4334f2bc48016946e0d2be4f70a4314f4b5657f3b4d4d5b790a2ae2320e57168a50a5a11a1e226a74fc1df9c1e72825f72ae20a4367ab6e576e31170ce4c0e177093fbe5b4e8a33d60f7b2b28dd46e5c2681949ced15d773b66e457550a0ab9daf4c6e0c35be08bf05609429d4c12086a560d0e7b54ab0693513867179fcfeaa4b44768134ed6c5f0f63d5154aa2696e457eaad134e9b9d21fb43c084e3f922282b68113603a654cd109eb9986aed801e6d66560cbd6960abfbec62bd13dff9fa09414f79b96089165b616ad3e653dc2543258a60dc39cc5591dbf5a633867c2cc681248c6566a4c45b28ed5848292f7d1942f818e9039d4593170e74d84125b9f2deef5c7bea7831d0e7e8f97e5f20537486b61f305cbcda3ec50f0b48e3a72fc692d676d3dc74d7780037ce5a80af750c4f83735191fd132e771a5f40d6295903de4ab990fb107ebd3bb38c9a33db7f118a7ef519831a3daeff61d9bf99b2473eb205570e624fc6276fee1551ed2388ff73bcdf1facb9c5c48660cca24854780dce2e276d220459bb871e13acd0fa797d3b41144fe6a17fdf0e83e1fa407f61b9320d0d9dc95d3cdf74e45cd7c51d4ed1c6c13be22eff85f0ef3b147dc7a1183c746ea3f38c54ab85b6dc00f21c610eaf42527401284853c57b1f5caf6b0d6433aca773f4d9318714bda92b53e11e1ac51b4f49a7cfe4130756a5a8534f33c3cb83008e80feaa08710281e338946e203f07ac29588b105b96e5786c6b911c02c2531ad167d2aadb558708f0d9b6a1d3ad4798195b8a81731052b20bfd001543302bfa59f1605cfda32770bbd77b1a87cffe4fe0a7a321c5d820f34301c823b86fbc526fc3d28a5a90cc8d28774e482739cbbcb4dfe7d28a5b25c9064f1c7a8dbfc69ac88e714e80414cb0e51aec3698be644a1ee8ed1b1adc436609787aaa784ae6f7a9da1bb1ba3f467e7217bf24c6bf74e39a5f595fa7d95045d7fd88fd68720991193aaf7ae41890717fdde17993efad3ae0d741c6f06e339c5c8bb70ac6cd6e97ada9401227da5dcc499cf513c027107f89139128f7849d374745ec160acc0799f60999d0081ae47f1c3c273d52d5748adf6b3776ea60c9ee76e300022cb810e063041ecdcb16c4686a602a8997cce1845e3ef14f78197f88eaf7c729024feb4f9d8199ba1481289574ae0190adaa5f012171592d1aff3e5b0d5cb9ef086168e7c3927fdab2d20171c86c0b8823d59f0e5dcd3d2b0d3fb057ddb52f5f4c95c12ff156638fa7e75aa5b467f8914b7e72f824e4aa228e5c722cee754d1769a909ecbb6ec2f0c77f120293583753fef6bd9fad1effb24876e82eae7f791e63f2c81d0cee16d64044bdceea51c66aa79f14b5bb18d54b8385a9e1289386e8971f32e42e5816de91477d178911a85892bb1cac7c0e835b5e0867909a3e046ac85f33ab3a434415598a13d7a222c0778207a08d5402ad39a1dd9ad8e3b3221e3925fee029f0823d40845aa17a2d61a7a874d0ac93cab3df9f70a2206d5ba39a9ad9d9c6855838a87c7f4e3203bc6567225fcd82dc60257ad8d71a516c7a8c38096370632a6cef3e65edbf8f051886e23ad8d1cc7fd9e566562519d7d0a28fafe35590a3d97675d29b41c644c2ccb08cbb15efe841d5b407357fa370a89771fd7ba597c060a7dbf372b833aefafe3c518a7848f63f6072d9e81fb904c56db3cc543daba861ca06f7602c1ddb940f9b1d38097bb72f41b1abab42416c6e8b35a5c0beceb54bb10f365e5c79dcc350721b1212813722584b28f734d32e6ca2ea552b0df82ed522bbb237f172843d15d6897d638fb8aa9706b882f609c1775f6ecc1bd84c262afad397f200cfb1939a147459563703a60bdc7ba05a9b568fb87338c4da7d826e2ee82c4628f3d646ae07420fc0a8a2623166f246af00c49207524095d3ca0e4878891b2336d45a8041cff2d11ddd073e1fc744162746d7d903876b3ef4cd2c603a5aeb97bb14659a09b1e11013df0dc5afb94e1e91c39f1ade829a80a0a1c94faed29d849b80c82254fdfe1a5edaeed23b9b68d7184c6d17bb82d1f8d3fe6e06a6fcea4d382ef38f992131893c1b314fe67c07c9c1da1bf8111ed02763b4914a0fbe78409021d76b800e966b8b5b0350eebf36063774d805b6839668e4caffe1e0997eead4b9e562afda005f71caf0ec229015d32b3d016226179d85769d6a03e6835b6edf76cdc2da1f4cb5c20c239f3d7297e04ba294484b508daa422e6a5cf5ab3c0ae44309044d295ec8fbc4142fcddcfd1b10bf4a78ea79384e4f9e6328e1a7b3262ad208956b720615862c69328ffc51bd32f0f0809469cc032f600b0ed06e44df83e65bd46c4cd9662ebdf207c87d16b74a03b6b39800ff0b3e42c0a0bbe4e414e079383363758b55f0575e1e8836a39316c21c169e4ea6946b038cc9e08aa447bd2ca163e6c6f0c7516758a5572476005bc0532343f223acc46093275a42cd801f0c6185b55325e30bb5fc74f702db6756f22f430cb433007a5e0535d3d34dbdacdc24f5c64c54391eecbc2c92b8c85f261ff7d2765845d4997ba03bb3712cee552729f7d908fd7cb4273ae13d11c16908bde9477db32b1a8c54a0aee0392a27739294470e0e5068f953d51145aad3c6746508eff4c13a72a36d8c425ae9a2642d8af5721be70b9a1f098686c2243f4f87382d95a3475ce4a1feb8bc90d36f7e0b11c8a2484b1792c88284f8d87e16a92f0a67a7ec499b790f1e29357226a9af4d176e8afac9d6cb5e8e184df8583196b4fdb129fde4d251ea1eda3531f0dcf12ecd0e55325f325d6b30a2482abc158aa5098fdebcc44ac2dc727b12955c4a879dc5cfe69cbb713ac9ef4635ce6cddbe2f0012f254b099b79433a0528304df658c29e71e2d5ef7c7c2a45febaef01c2374cab14b1e1d6ab77f42bcf8e77f967493db0edc853e5c1631215b775af6a1667eeec4a328867f2d4166cb6ada3e4c94d65a84ebab8217efd9e8bfe95f3bb1e1904f03a3dbd8048ef5939f0fd65388574627e0f40a34b4185c602ff9b97fff1f71da2afe2c3dd6e56051fc75090e9347355bf381c27609cc17b09e46f5408854968a943292214d50d019825a433cc2da931e4f311b78fa248e5cb9349a748131528c87f6a32d6e26622137185667cf136d149cf220407901110b25c297fcdf217265e134e3ff74b18b2d77b01b1257787f7e53fc68c21e5a2191648894bddc9c180b681e4b6ab1ea4e45550b37ea4b6a94de111bf2b0ba6e0c88a7af9b310764c218215d320819a9a0d9338a3763237da100442a7a024ea3f4f1b36a61b4e02b361e4d4980e257594b8da5e30fc2eb1f4d86e18762468f2bea0862fc7c9a07b8790ee497b5a8326ee4b5d7faf8e05a1263543aa1cafaf30821d429b4d3437c456f56c88711cae3c673ad82282ced1f79a2dc85160e7c3978a9b828c478c854703f630e9a329351910f0c9adfddf7b40444aea869cdf4e9166014d04bc19f881664e3903e53b890867458c3be637e2e2c368f970d67ab7e0fdcd075897a8a22735944a228cf23cd59eda02c054463e75b7c544d97208c134f92b807c2d1fa13a64c2988bca5578f59e12715975140d180851c789c55fb6eb77b7c5eeaf0d1434c898540fd5fadc2377604e5a53953ae570a87f0a190b2c694f10c9da99edae4a775ad60453d23bc3507206e3db10a4d338e9ae218b433d344217461c397140611cbc5a5441e12131ba9fedf335cd6f2712528608a1faf4ab387f0a82ab9cc7f7924dc39ec9d632767bfec834acebec645c4eaa1a0782bf93800da7fe6b1c701a7329d232ebbd8574f0b9466c8d660fea56c99956e0230b762c5dd1143da30e6aa4f4711b4c57c24cc3a49ca6f7169cdec92604d8db1938e94dd64b17a71fc70c397f903023a9a8bd1dbecdd798b301acdaa94612d8af252791c116976a86f9edf50bf2d3cd5c8fdce520d29fade910549edeb87340b5814b908167a83372b502046885eb5b0338ae206b7b0fa0f00a98b48236203630403d46f6080c318a4e0f1eba70f1dafde16de097d7b7ced8a0251f675a16a691d86d19cc224a0d3f7375584b960e15c7e6021f688b0cc7075ad615a83dae1a404905368f3944d32d5e9727c68c861497b17aa8ecc8bba707794e1e0a85ddaf0c743274c6a79aeb966a06ca21ae08063a464c27081fefb03d1f692a0ffb78abadf33bde044b448a0a7fb82a91dccc747365238ba5560457d12459f8f3fd7e731dbc31a18f514144e11419b6479875047c12fc9f559b94047cf3b132331658603016418ef53fee96d4cc8459b5d81c55524ffd65c64a0c40c2453e93a09e2de4badc7fb35613eaa986e96fd3a888328699e199b56c77d0ec5f1e608d24990269160b5913732f473452ad4c9dd6dce02fd5756412c500ec0739b06c5728827c849d00408c89214ae3e6141a60c9330d4dbed87371dd9fc5eba8af95790fb3fd6d3f0ad3da15a1d44a258f81be34f77f160b3b7f508319f7107f358590a06c27bd13747222bdb554da4bc0553bd9a9faad33ee7ad01372bbf0908063b83411dbdeddac90dcb343ba946c6ce9e9315a503b319984f255daac3ba649a2e4f393b5dbdaca2438b686a5e6fa38ad44902a12e2174b041f4edd4cb75a6c0fed3a86fa5d9aa19e08403fa1d1ce270806f0a5c6f83f89bfbe54ec8486d69c37f40097ec1345c0d2a2183974afed4810a48d13458086f0354b8f81194bad37fdc3a2e86856d239e7b9dc58993103633afd6bd119ca5f70457aad5046c9cc336caf597b0adcae234fcd40ac3ccd3d863c0c47b33a040bfe8100fa06995d54c13a0b0cda9f346b64b07a1224d3a66bb1ef7084b7c3ac6e9a741f7867c2f35e015f23f4f69f0ae919f51d1bb2a665ae3f5777f9316f6c818b57b1e2d1a2074850c4cab20a77580ce5c825f1ce8cee27886bdf2e1f939a3255ca2479541a953546b580c0526b66afab3a2cd317db31e1e85c691383ce6eeb85df29c67007c4aec7a71495b95624111a9a6f2932c58687be8a9b8f661a556ebdcc19d5e19cd461abb5c77182fe8af6abdc0cab49b7561600ae3602c3c4748f10e39b67c5892b1e4c0e31dbbe292da38f9a53baa0e4e86756ccc2ac9278c8f78544028e7dc89859dd083d2e7ce8692b163758ac87313a08aaed3f871abba05d3bf9c144bc6616e21c49fe22a3a58d18ecc7a4645c8976efb7b4dd694bc71527f5c697ede2f6f85e9cf427a6f6795fd02e6a7a7a861006f925ea9451a1cd6306feb15d34bfd7ccdb8a2b13e15fe46041fbb2f159fe670cbccb0c820c74c21b4d98b91e74b43470cea3b824a7e246fb61688966f349846b4417bcfb56ec68d37bc051b204cec2b41b5d2f571daec412d057ae9c628f54c0c5363436d281a50a8d5c147dad19d676ad92566258e63012d2d8e7227503d374b8441880827985a302464a591f84e737c6df9b40c6ab37c2a484d82ee7ae1a5b8a672c70da89f0080bd82df75967902b2b7d430e22121e12a6df43518fd8e05997878bb602fe14018e1eb0d4156745b9d04c7c4719d695626a71ebe8cec11bcaf3f606fa451a09ae3e5ac32d830bec6920ffc40ed79708c97da9cc7af58ca1c2db70e2cd200f9cb4da1b53c246e39f51e7316b4340e030553aaa9a7e7621b1bd93270533dc57ec0554871568edaed2c6add27c9a7fd636315b80eafd7e0f01d69c6d445db99bb3e4479cfe4c352e04af77ae63a0023420a1815355ca6695f0acb86279ad7ab658fec21b0268683702d44aed7990f44e3df7ba0bba4226389c8e391665bccb93db08bd7b238c1faafc53fd83c47ce8c61d6b6e061559bbe9e826930f23489e718bdf498ae245c5e67f0e8612c309d24344634dae13240d55850b784ef18320e69ed0dbf54edf6a3d4641ca98d05a97b60f0a60b4034ee55c617b36a59bc2b44e3019a99d22cddb741906d446bb6c06def5264de6500926a865a72998d428f1f4c81f5800af2f0650aacd9132e7c29446b57d8f4c4dcb7173d7464eb4fef17fde7d6ad246e1ef0fa0f1a4a56f073987f03f8c4d391af92a7734e3bc32acdab602a5cd4e9d208dc09db7b283e9deaa0d38eccf088daf17136e57ed18d49a1377c107d6316002121d1f48b0f13c0dc200c33a104898f7607644ac3ad16beb495ee2f7c7254ab2d9dd21d4c9105f03bb0ad73ed79bf4ab60812906bedc41ebbebfbc9078b18fb7c3827d6d973e34fa4ab0f1e115eac259441a021edc67b83864cb21c040603a1574c33fe939b3d31178054efb0744cb8bc522a2b9ee4685c794a8dc84720728a27deef22722fea7e5ae04568e582c1b153de3eb14e5602153d127a358e3ca2439006a1e8516e3a8c48b0ea28464b79e7ed86beebe5d142724d062ed5622566872cd7b11af2608dfe5ae6f5a86d6e22a180c026600edaaaa1144b25c8e0ca8b163f9608dac194f0714924469f441d3291ce556f27692c3c2896cee6a1077a87ba15400aa8f25641716bb5a7b7f3cdd1821be4b29a45a607b955e5d6bb4708f1aab09553982ef77dbcac4255dd312cf04088f4936bc7c5983b286ec8209edd1f5360296c16c5e7dd5d58d13d3081932d22e4846d66e284defad4b38254710a2fd75dfd7c14b790d3e6702ee464909d5ef968f0a95541e73b754398cc8e9ffc413378759e40e66d9162b3c036ebb6225fb682e7ffd59ec1847b8f66b692a91e305a2b475d7a2ab2ed11b20974a223bfa8430d0e1d039870244c854ff9e02739a0f593d0399bbf6a2faa4c70ccad5a6c6253e0fcbb50a0e957b802a21256082f941c663262cf9d2720c07117aacc6c24b1bf1934a00894a018cd3ea9793ed79a90162b0f6e70349f324d1541010186a52b50e954b38adc456e14ccf61587532938816bc21a047d4a57fe2c1b4fc578ea244c48eac44d8c0b265f29116d7d174f27a0c66541ed7d9696ac4e484e65d65e35337ca750e98738169b3202a8b4ae084a0a64478ed3ed9ff4cc2bdf2fe40f98c962d1e7cb19cc7fac10796d54c32501368960e79e198fb149274d7b090a32168eb4402bdeff918a4650e719140e71d579a8d79340a650ee85ef488140e29ed0926cbfba3af1b04af9c28fd87358e8762adbc619197042f11433c38e66fb750084f10f21b36846e30c577aec1144ebb3882902a7bcd9111fd12013bfc086550e860e14074609255f0986bbccd22634f19dc5f5872a16586bb635589d9edbb93a9adfe44d51689e4cd27889632ea7deb219afa929efaec92da7baf8108cfe641dfe793ec929852ba40cf93b7319fcd56c00902e1b886c84201bb58c4beee3c65e1da3ac4c6895df8159d455182a4dd2118196f5b3e33c87b6221fbb847d23800f48eb16160d75ef6e3073119c901be8f767d70116c67ad351d259d0858e229d08bfddf99605a9dc194277982c816ff8775b7bc20f816f7444fe7374c79b47684420467051a69fa1806b7b6e630b2b6538fb2253455b7cc688630c0c36f18c43cd9c4dddf87f61b056ccee6975aef9c255f1513e28b3c08c12c57eaa01d6c59925e12c70a6e73e5904a0e3b9155e0570f2115a0fc6f2854f9b6960d832568ff14c77d6c747f90cc65cc788afbb693f23c729f979ade141e1ec788bc2f85f1cc07662989e719188b7a4c96c0c716a122fee67a5f064bf084600d2030c5544870883c07d7ec4b261e58495d99791957c387d17c5876133b833e2f34e49e84ffab4c98c0d024eb92eb3fc2fb6acc75d260a65c89614bd1749013b92f757ffc4d1df7cd8b384cbf9acdb3dab67b18ac0f92a931c4126e14bad47f609daae1a92a10ce98734d9dbd942a27681641a0657c60b5b311ba9ed14c82007a9d1e170dba49ba0c99f71b588346a25bf0dc54649ff7622586191b17ba03d114ecbee511dcb43e3618045a6f4a93eb21026dc67c886cc0adf36b37091e2908c5a2b202a50d710513efe3f1024d2bf483cb5ded2fbd23aac851655dcf97005d7ae5155a30f1e763b8e0728d997ed615098c39f2b9500f7ab2277b29ae20eb8abcc1b583121e7f3e71e91e923c567c65120b1fe7c0a3e77369df84f56801aa53fa4a2ff987d550e6278b2571d993b7152e56fb8d52f2dcf935f4a73d58575f3ce302d4af85a4fd48edbf55ba6833d06a5758b3a7329f2fdee7087ee23c7df51d620177b289e5bf90492bfa884d8c91dfc3f7e689062efde0d1a90e973138b04bd11924d7b4cd275e87ea54b02c65704bb341a4f0c0013e0c6164b59b866b43c33e0205f83fb5459400c28307d5fb874bb31d72d8924a935cf976b2f70a8adc158946a730cdba05ca4262d0222bfc93e64e4d48108700afc797b622c006942dcd2ca3ac11a5eedc9ad025ab87fd7d5c888782d8c6248bce12ce66891054752a82a722798025035079f900ba6947c5a6533de0b129e328dea7ad4005fc514111104b9ed2a585e0816b896cae6f4c408cd1051b13183944b14fdca366548d2ede3ac6f27a417f588735e88c485f3dcd6045728bb219bd3d7af1870161b39814796bbea40bb7cf546cc8b0451c04a42a7c5b262068169308cf7827d7df8466e2ff6120597eb96aa250845f164866b51233afe6b7385d006518ec30611f23d3cfd1a2bac14d21940b07563fbc6b4e0674151363c6157cf32aa1e833407cbd3912d415fe085ec24ec9550bb6055c718fdd610e361f7663d691ddf32f92351bc5ee175e56ae8437884c7ffb5d66fea127bae193516b0ca3bcf2b6bf58ba5e5bcb5efd311a1308b11a59c2ace58be03535837ba31cb1dbeb9d31707f216d9f17bbd1f90b2371bfdf751a9c6e5c1adc64fd23ca7a16d698d9f41929e3bd07f1617b58d3e480809daa1ba089afbb81f4ebf99e54beb44a59ef6738058082bc53b9e8dc1abc940cd28ae37ef206a250f6abe4e6d992910ac3464867322a554a2b1db7f9f239cd71ff41ff0d3a2a7aef5e455009b4c63ca7431a19ef63d189e208c5c04d530180c0adc0aa7382a830169e9058f9892ab5f617291d3b07fe4636bc7d8009087c50bbe24b57adaf7bda319668f54731f86e6617047291ef273e7487295e2106a4d821f0d0459fd4a62844e37cda6432e143802c5558aaab7f70ade9712424c9b9bf932e26dc48b2298f33a9c0ce3fb8e6d78191ac6f14424217076f5bb5b42af582398a1ba0052786897e8ab610183c4c1d47380d2882578fd13d079c007f3a0c107cd7a88d52625087d53c0cc0c0739e0abab60569e53ece5e2df459ac6150900a600fdbe4175965cf021ae0e19a844fa5021ba2dc758686bf4f31fb17303c560b4f0381ca12148e027e2b3864aec39fb42ce8216167070831d16cc9632a44e3f062ab3de380428b48c142f18e28f7c0697b8621595da3fcfceb08e1bd1c11751b008785fce3972ab240795ea2a77028bf7c18a5a6164e539987d57920fdd40903781cb243e0872aafacc2a8a48493550f80012f8d5677e09f1a1f141b2fe016e6cc6d79cb092801c0de37f5986b49d33d032151fe80c8002ce4fea478e0d3527061dc2bf1fa7fc388e83ed81f5082cf24948a4cf8f4190640b86a1d90ca9031e93a341aee6d58061aa5abe20929505d1318444e96c78064e0e7f54abfa2425268b19fdf683289f2b4c59af79243ec2246356ac82ced0bd4f238c10bd96eab54dc62aa71f5042e1458cdb9f300a0b6c1b4433331a94a22a4cb811360c885ebee0db4e3d46767e0066c36caddc6e87d480ee89d4bda35ebbf04edcc755641f83048a44aae72b62317c13e98a7cd7e117a4d2492f944a22d348d9eb69624f6c69d27c7ceb10276c5700de772e217c1fefbad6e1cbc2d541df046b552f75f8594e3247dd079fa590969f6ff688c4a653dd3ad5f65752f36a3fa2f2ff3f4805bf478b3eb7cad35900d07d9a5462f93dd26d1127db2a781d9a3b830eff313718ff511377b1eb612ca6ab47a6ad8680e1f7cb6ee7103d9b9ebebf7bf0504273262ea4e00656232dcfa852fd84f1d95fb437d6486382c08ec944bab0d6ce537fdbca7e6aed7aca73b61f0fb175d85d98845ee4a48c484a6ccc8cd80bb6edff2deaa3b6b75c23f92dc17f90c49d6c5b4c8873133a0675c54f8be28dd5d6c04c32a7318d069c1bcdd8a175154f5060dca35b992c4d2dd1bedd7e2e0d23317b647c0c0f7dbc715867306d5e16c0620d19260f5ded25d010b7a5ce3d9fd8237b20afa2156ce5200e6e431188fde6ac1f8bf67afdf4903f417de42d21a902f13cb124d3cbca10f9ae4817efe714646edacf3b116c087919f719225db0db06825b3552f1789bf43a293cd8bc440142b6ff9baa00fde56013b42583b0c8201c2c1cc42ab3986fddb0534a30e286fcf96e5f0812f833c0e58867fbbadb695e36c6b41b1f36fd51ce2699f4c92c7dcca10b658f52b200d855527ea57c4ac0f777b2f4c57d07c9a987fea85f1a2f5d7e31baa188124231c0cfec5c7086530791b124fd3a43b67b8480bc28dfe28a148814764374010c9948fdf00f0da31bca19f7c99c4de82dda9854a8fb9c8b1ce52cc2c91b248bb583577300af03db7723b37861b01e163471c3df444dff8f9cecee70a0e411d5e05dd600510721c193d6ecc9b1a6ca5060208c701ea9e3ae99869a68d628e24b0a6b69414e8d21f93030895d3bcd0786caaf294a9e630cda9f24701c5ecc196e6d78b47f06715c775e41998944cb3cf42b0bfbad5f65f47365821508310107f3383dea2f5c60da445b437e190236392728804f36518fe931ae5e252c604cfd986c477cbbb510accfdddd68c83bcbd06bd25265d5daadddf701deb234694c969a2e38d0e721ce96319ccb2d9ded65cd8ed759ba88e34009d4844ba93dabbf728b3c8056a9768120645614ef7ad618e41b48be53513340da1793189dcd55d7a4cea643ac3fbd3b5f6c7249ad5491508e33175d9fd5346112213ca29f81e6def16cfa7321056ab6fde256ec437471eb75689b14ddb8df42e544a4485abc7556ac37a2309e8d3532fc2097ea5442b00d26af67c259a04e8ca7c847657df8595900b8380d6c2a998d8f9f63769300ca3f90e4aa434252c0f7a5f19d1c1023aa892270ad51fd9dcfce46cd73230412f3e3c802b8834ae95e22e4a401f0aecb5d7903ead4428afa8bd2bf1a6c865ba6e36aa40a1f757a687ec00b5f963cb0bec83cbe428b74a66f60233e0e91d3c48cf297b0da884fd9b82fb11a8118f69e4e4d7ca9c6c6992bb413a7b5145c3aa57da3686ad046f14c03893804e7dde28e7671abcbf3d83f38d2212189aafc6b1db9d67e1d19a59a5f416e1c79785eef8629574b322c53725753168fda96006c029be0887a1a2635ed3155456ea22fe42c263257b80af1993942626342cd4bba04e4cea3f90af704e7ed60efcc0c0d05144ec5a199017713996e2bb28e2303183b6de3f0a22cd7984413f7338b11736e86be769e9e5b4cf622c2ba0399b592c3e262edfe17f6369136204444c55342bb0380754b1be60fd87f76349857859183c848013bd29b64c6b46913640bf0d4305997ce7e826aeb531110625aa507040d23c115a198bce5991a28c29b96abbe30108f370f8434a6c13a642536c56a8321ec2cb738aee296231f6d66655d001a986be54e3457cfd228c45a2494b0bc3710690a2705f912befd9c442e9f8e7868b1039757ec78c638c2bfaac21cae1b57cc6999dcc9c3506f86ad7068435d6d84a87d5882b4fbb8c24d020ffe1505efb9c412b8f29b50ab679944883a55ee98480e7c39ab7ed70f62d165612cc3a48a2fbd67bd7a820bc1328265f619a7ffc487664e2aeb117721757f5dafd6d7acff45a4ba29bd5e96b6c277e392149b2c053c288760f3bb83a3f6e55dcb4eb55e5b4ddca1c2f0f2004fdc57f4a213e74067ac3fc24e931dc25d0806f4fdcd4f312ca6fc61ff0699629f9270769d08be8ee917a06fb22422da702170cbb8032315f80299917d1853acc3c140a37fa3e071b0ebb05578fac94ad38d65b64959d47a6eb82bbc11d28ef0cc64e118be834809327b1c2ea4228c5158a543fdfa306150c17d87f0b0d0444326cdf47b9316bbcf5bb9b4c92d8f4247aa3569880aa4f48eb1190404ea1fb62d766681c743c1ff9ae5c373d6080c4a13ad30bb9b013a8e25888347be6af216499be6472dbbd552822da878769fcfb948c71d03a02b45dfb43be387f35e72a3278ea6862cc71b53d77de9008910748a2151d57fb8dbd76a673a0db905a227ffdb4ef6d95a6af118966beb1311c636f45a17eff173d86626b89b4ba662622e31e82b3d0add64844cfa79ce4dfdf56b5209cfd0cb75143a61d0f89e89bc26b1323f5d3a39daad458acfa9961a1a56870f0d48a1c7bba83626650d8267d8387c883a66122cc670af8b4406911ae8d7926823a85a510aa738184885085bc3eee88fa36b2ab114d828a8c52533dae53089c7792926ed840e1b3e9ac406022dd27b512aa38c926160d8010531a50dee0964d00990659c5bcdcaaa008a820060de6634e7488a9c5d68edf81718885cbca42825ab5a693a541b3debda6dbc88d912e7d3f54e29bb45965a49b0911ea52e8dee270a087b241fb1e1f85fff9e6b37080b64e7eda97ec1ef17956a8a2089cb36657744755e604efa39e3857f18130ef3193cc965d3b880741bfc707ef86ba60e3aacaf8d1b15a23c13c7a22ee892b21103d33bf537a204db482c779445252b828a004b7e37f66da60a56364a05b424f35fee063d285a8df9c51af4864753cb235851ebd0b4c88e3188a3e4668f669ca56f12008696a23270c759cabd8f00797bc3cb2c29956377f19d80921a8f1ef88c4d668a91a0907a7ead205c071e9f67b2d4cbd434a3077d16448fad8db0021c72370a553e3c804ee00834e0a99c0f46ff45b71c45a97cd5d4227d6aca084350f5cbca37b8c844fb4ed0edfabff98215330456c028254c8db8c070e554b5ccf74d5e62f9368d8eb79ac4a2b71c7779f0cd04999b86193d04840f912005326bf97706318f63a41e39f574b91f8e3209560cf5f5c0a588732da43b5f4fe6b776f6e0cfee88710657250ccfe36ed588d206f87cef9fb356f51973296fe389b42bb585d50f90a62e10e7107893c7a21f9726cf4620d5550b88b1bcd307d7a281611af2c38358b8ae462ff947ac1670526c8c40ebeacd3dde8a334dbfb55da21074f525ab33368252983da340a2f731cb23c3c300b4c3fe6c0a3e3030b5ae0abdea6e6cefdf0dcd1b6fd4cd975e7a2b7b7eaaa89d5520e88947b6d7279df1264c19c1475f633e9130c7e8529a01050e932506b76c3319fa1694721a9c79117f0a4f37406c95b4f769c839516b53d7eaa35197f8144f52c34fc49244d3bb51b3cc0987624079a2dcfecf6cfb4b359f3bd642d4f7330a3438c01152d55a917b59c25551ab7030f92e517d83003939fd2435a7af7d434f7d2b0201f15a465ed9fbb6afdbb0805394d761e273ea595dfcb29a8737af32d15a9039f5190fdda28143dff194d0d34ea7f14cdb24a1527dc3e2a6ff7b8270ad1fab12efef26d9c19ab146615a7531be96890f80cc104851ad58e78db1e946df6bb0aff9a9d39c3a1a64b1464204f15765538da2922390f9083c82041766af9c14849fa682f5da2054cb146b3c0f2ab913bc8871aa5672c66e22621f02abc54be4f4570161f9a0ebe9c02efe3864830cef836cc297796be10dcd3eb80c1e36ae006022fc94508c05e8c46fc824b2335a6757e9e05412b00042503c88220801e49862b082a88c5735c744eccf1fc6f8ee18bccbf8b71ebd320c93d7ddd112bbfdce1fca31d2d3f9c872dd8cd489db551387fd52e0671d15bd1d713ab58fda2e8ec9ec34019a3dedbfa7c56eaa0e415d5ef122b86b1e4fab27847874184c198fe79d323f87b462fb537e38637a423923f2bbff4d95c3eae3ccfb4ffc7f5869a65121e1700663b02973c52fbca53291a10c80ed6809653820dccca72246779d8be329cd80a74796166221bb7f243da1d188a31ca9309876a33234b98df97fb9b0e4ed4054a53e5d13bea99c1692d2069b0ff8a22d165e339e62786cdab63d1a560c601e20d696a2e63f4938aa3712797c7735f19fa66c6b00319e4b4204a5fb01fcca1c777a72c023a8b4902a8069bbd05c6974b25a3e8f7a64ac7670c2a400cf32cd14c866143199993703ecf340289576c978d74ac5a8b0aff25d841742998152f962758c19721825d328d79c0b3269152553ca99e950d6f04b74ea666c877406d298487fbcca9d56103ac8ebfb82040f7113b8608e9fe23093e649808dd7b20f885e710ff45cf4e2c8bc4e6d424f2fb37935636310261dbcbe4a702bed060fdf8606cafdf696d2d8c3d2d5a39209a14ea79f9a973f5a2fba1b2f9c67ff37293c5232c30baa11a9b5d218a36788f02f5f4de64f84c6e309c8afed74bd913256f14ce2d62efe5b77d3264ea4f19d5724d340bb0525e74d4c3ba24ac37fd8682e558d22132e404e139784c005d7f7b9c6c89cda3aa8b47f979355274893495d107d9d4c394102498e08076c6a50d72c773f7c30afa3e5156f6898a2a27a4cad4642f6b50212bd356174d9d95676b766c3b192dffe1b31c922517268e7d8c255ed101599294bd89cb785c5a4bf11be54b7504b24bd887baff42f896fcaca1fc2d647faf453a950f6b76f907c706e9fefabca7eb9a4b17bd9264e479e4d1ce7f0f3b908044203d494d5070ee9cf5a78769134145ef94bfd7d70b6f21aa46409a3fb59fcb803634c3ef19b445102b2d7d154282f86b4f9e1333aa5eed3d031649002f1abcd436917a4c86ec05515734e037558c64a90688e952d00c1474c3ccffb7974422266213dcf969e62e4a8989e4a5501b88c3b0b4614d627cc01145288778a95b764f1f3c81d4bb8763483a1b6450f89f21e04af28c0200a7fa9fb0129042fbba0eb5de26ce5f32994979e8251446dd4081047fe882254917b279bac01af7b79067b04b7a47e99b490b13a0674b32ef190a5b1c351b6fadc5d95a822ab984e72e8b1d816061e8d72458d43772c5752d7a7f120549e528017146815d730514e471734f4cd8db370b1f713ea0e987cfc969c2ba7c45dce3142a150774acbd0084e432c4c7464d3f19a6a804cb0d6012d8a7eb27088ac69a60ddbbe056aba045a0477c8bb596b2f869f7705d1108bc678fae37a2323e4f406ff53e585462ace5985c354db55636fb554d375b417146409080e8d534f4916e639bd311593f5d650fbd2fbf3e66a2fe26b7baf90cb0c03043d4de2c3f236a0959e8838815d18e32afd035c554a4e8622c6e395590a695c2a592bc640a9c0095d61fe0f03598981035076e2d85723265cb6dc46dd0b9d617503d3f940f3ab58ac433170e1307d9576ffc44fd09774bd02cfc0a16192bc0c59f0a1a3da89bb2e83913ec938597edc7b03f044728aebd8b7cca0cbec9cc26771d5f51d66121c4bfd13514b524c7138dabc57302fd1f8600aecddfa60b921ed2b83d8a77d1afa895c777736eff875bbc80c71fb4e730289adf2c332253851ddd24532833030477336b50eef0aca2da8fd4210e4eb3530e866835e91dd3c05472da6da2bb43aa0930266b324f5cb274eb2a0b1ddd96acbe70e2093dab2e53d3b01d248ee10010b65797e4d6f28b605d00d136178871efb09f2cdf401455057734c0e91804fd93d92f47ce12808432e5bf0e2b6067a3be9852010edeb26d70068e451af329a76e50eb089e03993e18fb4a50f7661042d3c304fe859202686c631184d44da914ef8b57a1aea6267ce25efb4981932888cb240c771a67226e6ecf89b6cd120365ccc0f1c6995ed9ce890b7c916649e61d82cfacc821412b14a14e5a5328c1bcd2161cf8f2a9972d675077bf5739c295eeea11ed73e81ad1dd59eae38038d3289d267bd91b8957de65e88c043a80a6b4c13a83b47611f117853d3bce73a542d7be10b4b9201419a842ba6a9d5bf4989b96d8c9e27ea22890cc89a91357d67c308bb0ed5acacb854fb0a14718c5e47265d30ca874b17dc5471c7bcf5673b0d5bec5cc02df33dde3d621caeefd0ee885c905398c840a23c8d347689c30b96fe034787d2456e955bc73a1382e6cd610e2a20e7c1fb6b592100c6d008f381fd5b6b28fc1a7a072c3526cf00ab486c4652cede28545473d4cca0c5fefa70271b330959d9745ef093ceb29db11897f12952f8853bbf985ef99e95dcad85fcf05cd7e15742d2daa7cd5aa115c6b80494f1b017d01d935926ad6e2c6b62aca348e21f59dc7a3edd2e3b69b34b169889cb10cf8109a406c29040fe5ffc2a8926452c83f9109251eb5842231247633ffac6f407f2dded0f43ef12699f4847017fb92f2c72953c6ccad2b3c0a8d60e09eb8d9a273f0e563151480c0b1267831b58f1101f1fc1f0b0b9a70945b4bc24d481d88c1003323bcb1f933ac9e484de64c14c78bcb0d682c7aa1f58561c9a4b185938d28ce4b1cf7f7b09e78d950b629999f1f4cc9c4c6dcd406b60d956fe5e16267a8cb712486277b232a5510ade75e6905a8de018b3b4d854eeccc8f60f105fa8e6ee31341948f1d4f535fb8c74f226ce9914dff9b3cdc3668008dd3954a6f826770202b61726081238e3cc88c29ac9359b3add885af127d1651864866fda947478a24d8d367e8207ceb778e0605927c75934a523c49f53b5409739913ec2c4e0b482c276e318d59e88549251ccc881edfd885d7b202c5256666f95560a06d0a10a114d9f8c5fd598f5036a5951bc11644189be3c81cfb33f71976cf80cabbe495fee2e368bc6ebdc61f961e7b90ce25531440af6c3e6a72ca2790dd342dd8aa311cbc3f76e44ffbe47947c50dcb25f6f42940d53c92e70b90bc1cb92772b5ec9a61c46737c19e16f1eb348b8863b883c1f760fe54e5af702fa2439520bbe32a032205f5447eb153a670582ee0f34c6714d4d2a6fa0b068bfcd3e5fd683dedeadae008ecfbe57d8fc1635ad1ebe5b32579987fe92c5b68fd30b51d9060525990a1f219f8c4722f86e2ce023a50f16d398aebb3dedf85b6fa9aa84e954ac8600269c0535025fd00292b533515e6a6692afacba7ee7d98fdb3ab61115af68b3e8aca7ef1c16d342ca58dd6536b5680ff8579f11a7e7c2504e137b1fdd986abee550db8c41638e4b52ab0912416381a42ffe84f1e8a4f75f1d5bc6157b885bad16c09b5b53d42e1b3238a885d915457d4b15e4cb3230a0937138873e962729d660183cc22431d5a56ac416fff1242406335f5a69bc3430cec4810e2b878d998994fff0992d1e2c5b73fb25256fac7462f4069df4ff51d88f74da0d0584ac512598f0f1e0091aa7e427f71c70194a96a24f417b7d0009e78ca081ce251e756d4d96f0a34020630fb60435e9a1e7841e4d06d6b88d2b5196e48def0b4a6dad2b893d061615ec1cd567d5a89c81c4dda1ffe3da4c8187574da1d0cb10ee6f1026066098a0603400d5babac30dd282095efb8df097682ef1d7842310ec43cd34af0b00aa75cbbc3be6788deaf08ad56101e833be28502c0aba9342afb4ffde16ee60b17cbc8a1cb6e5cdd70cde3173e4333bc3b712c6f1b69a8923a7f378ef551dacec124ce64314c7e7de4807eb26f07f4e8ea302df27e726db7e1b0cd9cc4f9699ef22ab6206786ff42c2f2a661e5093a07cbbd816d68ac3ab76bcfe6b23afd3a98948fdb71b2b75e052bfaf0f6d5acd34bc9fdfc71e5306eca8ae34e65b9d0d88cb4f8f2b0354ed78e065eb8294176b1646ea97e768358ded5bd9617df66d28b97ab5c8320a1bbd93f60f7b2b8037b22c081619d197f74399d5fa768fda576b739db6b258c7f40e7bdc008af6a54b0fd173ab4ec1f1a6605594f03d07be7a65b2d9be49968d5f3dacfe0502ae061ea43358f58161e1545f2ace7309ad378210c7466fddff466d719fccb9c307303c5bf96b3b74c5ab1e7e27cd64a1f4b411b93c1aced27bf857e38f51ba6fd966b07c5117faf8fb30f9d4c3ba68ab1c0fcd524c0ab59603187a70506807ffa0557a0e14939bb7592a238deb600cad173260a16fb01b61d02c344fe8b0b03ccec6e80a65ceb1c8b37a5f3564b67fe3e9751707bb91887416faa0e54c4d70a2fd0d8c45a444cf81b64fa76b1186681e5e68eb2c53ecfbc4313e85a478768cb7f3f904ed9ffd53c9383329a537bfda74a065912dc2a32d01f7173160044739377aceee5f3cdeebb9478f13e13788cb8304033fba5e1f32770f4333c8521e2555a89cf3b64b4b2c61816213f393631d34c0e927415ca3996dc04e8724f4bbd59e05e3293d6a8a548bab3a0bfe8f396d0fae7f70b619da6cd9108615fe0022dcaf8a5b8946c6b8287c9e1a8b1dfa9ef6928628efd079eb86cfd5de67dd7b88fc1dac0541a3863386b0ee20881a83c88b666c5b37c4c8d749af35e14e676aed83249b420a8e439fe0abaaa7f2387f6829b42339870ac0471e9ad505dfd5e09926ed6bb5f0bfc1f8ffd2102c9fd0bfc65685c9c09b90ea51dadc940e5924935f3c7f86be0b525fb315ca98ff40196a1811f042978f052030b0fe1b404fa864d93d9faddd68e1984c152dcf7f00a13693c06f31116d5ada019d5e2ea21d57f2ef208b48aab5ca137b099982fa17ab1806b0abb458f4b15db4ef42a9a35bf0f1690ac532b6aeac3eebb1be78cfe947efe38e93d22f6cc82c72eaa9943362ab8294f14ffd52d901f72dcecfd505da9bb84c107f50974b8fcd5c77e742504475c81b4fce73835c2d03bdf793e52b4217bf43dd2613725d411bc173a81688fff9c0a48fd6b1ee3cc9b8c4d1a8c6f436ebc6cc84ce220eac4e339637b66f43a3c5e2bd7a0472a0c5949f8b6ac2f147d3e68075c1938038d1450ef390202cc1c9eeadcb47863b1b74e0be15d529cac5f1601eeef30a7583aa0c0271f46ee160cbd96c483a7ee83c92c1658218c90e234ef20c46cda94cd80461ec824c0737de05ea444b9ff20f5a410cb1591c1238c4f756295e884c59d8b2de024bd3760c856370ee457f83e3665ea51f3476152f8e0052a77d4de41ba124a1e373a8a7cc603c88a2c78971ac06026ed8dccde94e0c1f375fe1aa5330b031ba36136366edae11007c3b04c31bde3821f4f359dcdd53851413bb3dc5d52a96ca51939302b7bd0ebff02cafb77cabfb463fe14433d67697182f7128b4b493aa22f39131635de3991a0550734db43d61bc12c307b337f3b82ed0b0cb2e0e12dbfefe4db7ae830ee50206bb1e75c43a368e7ad12ab626b871cb73659add3e6c164539701dd469d743e06b10982618de9051260ee0e4e4d406b75cb0a4c7a095c8c9e37ff60621a02c3240183b69f1586dee2252b22d8f6f62a09b6c01fd36953d09682c92d2e9864bc0ed2e462773ced6658901eeac7d5451916abed4c32f273fd1006d9691170c6fbcaffedb96cd7bb040bedee4990d4af7af9b90705e7c6abd2890c385bdc6e01e3467cc2fe92f8923c54a5c4f438cb475bdf8f762f58b89cec2a4f6cf2ad8c0859cf6e96473ded91303b8868c39963d658f96b9466a0fc3810fc47935b0e921519d55d235eec2829aeaf6310410240cb8c6c19a8558174d226a3cf6eb111c119b637806c037dee4203b3e53f848ad2d9dc8923bcd053eff28171f713478820b8577e2e070beaf6054226ff441b53b57ee8f9b2b9bf3c898c2a5f87a0eaa24c4195c6eb2947799e72a2e13cfd09ca6cdec1c93640bf0d4d24cbc2a46d73c647b8128c7bc0f9a629a52151fd139281eeba51ce3a8024d699f6cabd11e78d405ebf279a319093c9f31a1b84a8ffbf6974d4ac3d3396e8f832a2603e75f6250363f6aae625d8bd7bf475d66e29e70efe6ff3e9a403b7fd4927f89f1b6260682f9636fbf12b03e34adbc08cbf676c1dd8c9706a1bd3e04de7ddb957b52dc42ce32a7f89943d448f3cee1be52c7915b5f35811ee0f8ecbcd5796cdf5ba5a22f6623540bff1b30a9381d97e575659383232abfbc0c38cbec509990e91cc1b977f039f1663c6b6c7f8251041bb7d97e3f84e4cc549de06f15fe2d35bdebc6c950dcb7a109e64d7cc4355ad70939528259a8528b22188683e6899f8e6d0a59300278a51c0eaa7751f14adf66579b8eca82800691cce8810fa1bf3817584533d868fd9cb26cff4288f5b417739b5cb0884c36c15b10cb2e96892dac7201a70ce35434429512cabad6aa44bc25c2d58074ca2f81982de8dcf85135fdf406fd858129ec67142d198a9bad54ded6d276d81bc016f359bb2b45bd6b188adab90459e354742bc351fad80d2f12f96425ab8e31f5eddac95bd7edcba4386bb318ead3a3df382d09db69d487082dfc18a72ff4db527fce9eaf7b0ab18baa7cfbd7ac5bb39e13516122bc3f6d260fd3a62aad98f3fa9ac5033dff7e2fca2c7ca1135221ff0d023d7c396990fd2d227466436d54e789d84e4a636d5887fb14994abc9c9dd1942b0469bfcc072c75ee77268002fbe98c32d3535a2e8bbded18f077abb1627fc57a48e572a195029a00403eb169d92cc57f41e3fad48522354860c11c9bea9ac1d91bec0d6bb8c269e9b3f58a1672b623b346a1c05f2241814f5e2c3c9890f35f9ba192ca711efca119daf0decd11a719c86542208194e3d005033c7479e2780ac21ceb317fdaf6c53e14409ab0f407ec8e62f23b6f2db2eecb47c28000978b701d666b07de146bb96868ecf18d2ea219aee455b48987225bb99f2cb8874221feda1c4b019f116b31c3e21401dd0c6f3b8e229ba4da271bd3cb86684829313b95a972950b6607ccbe5ca5d8a80570e4a9deb017888eea6c8e8562c9b9229528cf48d80886da0bf14463f9df0314ec7e3a544630f804ad06740a3b966a72a81a72a8ca4a651c7fec702f8e3ecab4a35ff3e3633844cd2cf4b01b47de02eb57e198e07b5a99772727e8f01775d4c6bf353206758688a1ceece333d35ade98fa28c40d4281a3fbf87688d682412692593a8567b6b735dff557fecfae469f99c2dcd690235d700dd365b64c144a72b9c82da2f04875ccd68477635372a75d588dabf40f83eb5ebfd6952ea5deba441d61d8c663c9b3270d39dcdb059b0828537d479cd109c5083c482b50c9a36b436576311c3b75e13e7d124f1faa715fe6501204bbbc228526f5254838cd9c4360a580da39b245d73c36788b0727568f908a7aa0063d315ce44e9662a5d3770ab2f620fddca19277c80f29715a61fe1effea3241f867918008b71a07487d58975069aaff3124d131aaf335a2d15201e42ac4e4730bd0777b3debc487cd75125ab57db174841db6b8cd0cebb9864e17e3471ab7b8734ca65123122092308324d5c24ce76cbb601c895c8cc9b5811b240b0842db90c715bc7eb4adbd07246b00f735ebf68d957ee52141321eb12846e8da96db28739288e9091250cb5382e390078288c295e9ee7911012bf8cecacd3cd87d8b1828851e59a9349ac047b8f122d4318244514f8cbfeb3ebaade0562c6a02d0f659c52d2803cac97c0b66ee322fbe87d2b4479d4b6f4819026e125801b5904efc923d94f87bfb23d39212792ff503f34a96726b457de7fa0fb13a54396b67beb29510196fdc10594142ecebd7f72a494c6b5ed04947ce27e7b22ae181e5e192b7ee284f394cd3dac5f4c532b538156029166b4acf7e645062c31570909c075724686db01f2f3bd599bf612e85a441cc038073bf05dd0c5befd6c8ea5b540a6513ea3479786333a1b98309817a4ebe5e75bb425108ed38331767f9da45ee1a4825f02cc76bc9bc4665848d157ceeec88b41794e16138c8d75727df5d912621184efc46e8899909e6acbd9880854190e68e3207dd2b1c7c0811aaf54a00ecd4271ee3a248984230eeb2b33e172ea800812248c3cb4570a9bc360efc96b174f6b9065c03cce5773ecd615194ac9e9067b1998ede86682c55926a15e9f6f631702b09cec26b09b6bd2b5b5331ac26210bef3da1c436b854c537da68c2e0ee73ab51860b06fc86beb27e36b06aa2d0890cc2a3e6408e119ea159913df0ec6e8a3d81e7311a52d72f3a6a561fba445eae626e12eb66bba6f4c8fa64abef93691d056a3530672fb563944d5abbbfefb8f80ebe1159ddc846b97b27c52c35da6ebce5d0f7a8dd3c0ee5128fca28de1fed614501638b1e73e6d30d4a5a9ed99481d73fffb07ca9dbf99d8023471d3abbfae820c8394c91a8be3b4531e4506e89e57d3112025bda19fb20e750e02016ef18a4fac923b5a8a4fb67d1cef0a19800b163ce143606ca1e48384f1d3c2dcffbd3db9590e6d6c49a0101e9b5254b0f5c13bb8c947a55d4e845460eeb1ce25df9ff6704ab99b5daf4effbd620a8f747f3ef78d857f03dceefd5bb0e12da3793a86128f680a8308ded2238c4ed82d8304603aa021c99c3977a2df719f3716ed393816a8d851c0a85b31eafe783dcb35c94328b4041f69e112ebfaa5a1c1c553440d15d7dffa013068cc93e2f8cd834ba85e0b8edbd9b4ddc95da7e0ab476e67bd6be77f9aa9b7141e8522c1ff3fe16179660b8287b97e9707151d9da5356fe1e0f15099651a1f3506b1f817ca0b36b5270102241a2b96d9513fd26d501bc62e95de143aabf1517273b58d68f40ac83c7273da220a62756582dcbcf4415f296a9281fb3e6e4e22d7e6b0578729d038e37173cfb95bf920b5fa87f3718971f3ccf0b9c5ea1364ab24a900e4d847658afae1180581da8325f4e3aa7f628314cecd0d883570612c8d39b5b5b6744895c0f30dbfbb6c12d8bd697f5e14014c2d5aeb9e31b759660d7da4af5f681f3c1c942574f2d346bdf181b5825b8875e19ea05d1e1af5760116dafe3ca385e991a10d657f7fc22495e5ab643805ce79841b0e56205c156d3a59dbc1916e7164551e513777cbaa58466556e511b55dfd295556e5916eb89a0fbd2358e30084ef830a3048298191bed069fac15a5dc17c07a11dc4836f853466d4fe114654fbff7eeb26424b8dec2df70e1b0efd0d180ef628f622a528e7c108f1f65aca59ae9165e84c6ae7ef88d22d89026fcf0c922890aca13dd4524e628046f2ff8f826c32fd2351a5db83a8d249ff3e1955226b4c5e914e22cb26fa3b487ea49d527e37915c12f12375fc333c22e51a8923e5241287e8da75d8f2232dafc2dbb00895889c3c903a6a8b67d286481db5518c40b94896b4518e62bfd1d6a8ad91ee59f0df3514b28ca2edf9232dd924b2e4eba85dceec30ebdbe1d54d95c74f87a641b4df0e115f105ed1d1e71c5d537df423bca38c65138da2892fc126c9be8bb42f44a65c1bc1efa41aa58bada1fc9ba95147da24596d6da26fa36517d127b3443f42f4f02612c7fca8c624cb9919358432924636a26bd30c35b13feeb6b6a3fc7effbe1239a38eff46120ada261287f6d1695884eaa3d1bf1a33a37760a6a4a57f23097c693c82447e17348da39b524ede349652d4f896e8327c0a6967b069a43d47a3eae458dae8f0e35836d1e13f9d2f08dbf0751208b1c5b5700133ddc25a120adaaacfb0064aabc2910a9b203d613da9404193233d92215a94ab665b3b83492393c904aa2c891541420f1308be509d7ea332b34ba55b2a635ffaa532df4b20e92059eab0adfa4a35be50a90e02d9fe8da8eff3b3ed88fa4822c2233e4db3df376770e581c8353ed2890a926420f8bd5453ba69126bd1f4259b124ec9077de907b7661539930a16f4343d69f65d908621eddfc11187367e20e88540b6736111dabf93469476966b246e82480a2249325ed925882499114e5427ea93274ed0272dfe1b7168ffc283a3491b4daf61119657a697b44d27fd1bc19bc832478c06c9523b14b4c16f0443da477e4346e347843f189d037313a6743b5aeaa2f4395eeaa2b44d98d26730ca58825dfaa781aa31e5aacfe0d288f21915654c5d35ce6611a13e1a67ab509fc12fcc82c2ae509ac6cda59c0b69a4a490a81aa8dba34894c6fcaa832e085f8a57a7d9a751a7a469a3d188e34620b859d096e0a71d1c4d278d1c006b34ed5e212312c7f791100e80403610ecba500ad0358568f4cf9aae8da5e9d3ecb7852f4ddb3ed2ac44131631124b1d0d5e23fde3b104b597481c93575c843d4904c71c608fcea31d514580a5839f5d8446baf6d1d6a6d1369929282227285f6924c94823a9c9ca4852213969fad3f862419282e62096249915956a9a926457882f91938fc1af4443dab483df12fddd6a0c92dfcea7f38f746dfc76be1d70fc743e9d20ccd23e517caa911bb88d5f90d1a681a491664d4b34e17cf2e4c91317c7b7a3f66fcea81c7a78d13fb2f6103f2b0a412c493266754d4f0a2259419a919c30ebfb764a6ac201d97340cc9a24d348b240443e8d54afc6c0015199ade94b34f4a4d98c99cc3b10cbd5ead3a92d15b8e8bf9d211f8f45597d37994820446b02e2643326e7fef87498c5240ae5b43b229c32b67c9a8c4084399e12e9db18be3ead2cd1882499165e3496218efc82f0a71303b124c9becf0835d4722822c0834725b1713f37bfd1e4d5f7812338842c6d7f33a4f18d282266112044fa9b4580f034483a418b0019d2db884ac2dbee29d17d23513736d4b791a88f6c00756d9faeeb91a420a642f7e97c3ba34e75a12459d3cf7afe74ae25c92c49564932928c45450a6d46ab4aac80e230abc81878349ff238a55e7a08d1b8596bb5b9e121f8b60a56826863e289298583684f8fda3eaba536f4744f1b299ac49c9e3c48416736e648f0b1a6699aa6699aa6514dd3344dd3344da37592dca6d9cab47ada67985e357c1fb769b63215f1c6ac59fea4b55aad6a1ad3496b9d9fd409fac443b262a9da3057b3a592693de9d806159de6abe860baf0556caa0b1c44ed5385b253e6c2a60bfe774e3aa2113834833fd5a5b553ab30e155d56ab51a7d02ec0a35e28f6835f18759a58aa8b94b9149f3efb6d56a351526cc624e85a6baf069565d1a405df3a824b8499e82686a4b6508abd0549155684c2a34cd5719c22d1519bbf04153aaa54b951d1359be74a9b2d37c1519b7567e562f6f39a54c5daa305161d2fc85c0944ecdad89a20bdde07e6f743789eede3deef3c628c087e7c6288444217ae85fad4610a310a23d8ad0458f223c789a44e8a227111e3c374e9787a264034217fd46e8a26be48d387c4fe9a8789885c474d570f764b5e59daf0afa515d615952b071a9958ba71eb24cc552a81f956ac91f517652c9eae511296963f419fcb11044beca0db3859aaa2b7a48d08c8aa5a064c9694ec1c431a5034365f461ba760aaa789a4b969dfeb657cb82c3a2d32b647531913ca2b891e5e924e2b1a46a74954ce6b98254339a23315d2b4fa22e51430c9eb8389d9d66d58e46aa7254382a9ce6a76aad29594dc9645f8c299aaf72c28cd99adf82235daa60cd2f55479a3fada674522b63ca1b533d634a85a753150d13863f7780e2e1e1f085b24fc1523bb535fa11b995944e0aa8f974baa2ab6495fe63310a4162ba58bc8e3658903535a27baf013f72a12c69638544d9af7cc635fb465da2861e342e8e445912d500ef2bbfe17d85bc313a778edc017ef419d70c16553c44a80ca3c07e8748a234ee96bc217e44ee5021519af72442f7c82884dc183d7c14de434f22bcca55c828460f3f5de267708a266593c2a92d16e73275d3a91c1b35a7b378899a754d4d8de82be75e53035ee5a22a6814c7e912ad8cd3a5324ed7699c2e16e37451148f684435c07be84a7833aed0951851f28678ef1eb943fc8c2b7481dce8793828eafd06e77917913b3cee0922683b4104453580bab87b4725e15d74d1bd579edaba977f6177d6f188fcf157ba4aa60aaa2d94cf9424bafb8e9c2ed23fd21807b154c9361be0e928d2f4078ed7a2ac55c9544df82c382c3fb8d582afb28259fc59d3ac0a62b141d26fe892c547b3d5a88a2708b352ade2615689b241cd52c8f29492d5168af4e9429148972a28a533abe925d3f76d25129584f7fb4b4621baf7e9b2a112a27bb762295e94cd84b1289b1519b3ba94281ad40dca66c65c24d8c58941f5c66a6b85a7de9edaba55565778807ad6dcd1acfcac005517feb930f066db344d3b83377c6133a6c835425ba94b05310bcd9fb40b299dda5ac1b95a4ae7e5486785a7b650b3eac2bf5714799abf82535ba9159c94ac5cc1d1709affa166b535b7d9b6dd71ba2a687d88e548a7f9f4d30b136614b9305df05145d0f446f304bd8edbd70875c19fae798b4c180647966e54c98272beaf84f2325114a0fbb3e432b9b226173661c42096a320cd1fe9f06aba6c6e58709a2bd3f477c194acb644e7a366b52522553c2731251bdd2b8a22396b7685a32a4825031267a36cd4dc771f356d14f81ba183e243a7a4e8e1675c2f1b3535225923225972aa0b3f0cc7d078d37cd1675c38a150781149a3da61d3fc906ad63c43245ce174d93088a72b260cff56b2fac0234f41d5854f33124d7f418854e3114bd54e4a87572c41b8b5f2535db86419d27c161d66a9642a994a766132950ca692a96430958c06bdf64a05d969665105b110693e8b0e0c182f5eac56ffe924fe5c58b9f2d31cfb01920535cfa84b254beda47454b252c5a3133660ba3cd68178fb3ac4503fa89fe6a77498ef8d239ad1cd08a7f9771ce5345fc5535b2faa0bff5e5154f134478ab3951767104b4a13d4ac6ac22b2688aa2052252322a2b64ff187594b98a59d2f026de369e5a64b11a8f9e50bf167c2700e4a95ac850b62a992355f2563165d05f5e461d3b603b4e19b2fa278af15cd07574a371e8f07e321f89fbd4207260cff8909c37762c2f0ad20423161f81e98307cdaad63c2f067b00763166d8fc723c22c58255196248276134ddb2211b92f87935d17df8825cf28d084618f8702714f6d69e7d39102793cf3cbe11a881e4ff37ffa8759162cdd6c3d203373a5f4f60ab5565a23c496f52ffeb11d2fb3b52365ede5b59ab59452ed7aa3e59f594cace97e5ce5382e07d894cec0e2601641834fd319887cb1afb5bf2ba8820a6be8d292b7f9d251f35eef356f2c75d4b6bf54102d07c0e6ced47667816cb79b254bdada93379c8af420075f2d325be23921448322804188d6bed451a7c0975746e8e0d362dfb6b68a9a7cf307f1a6a910bca2305ec0419c3d9b9120a26e843b421275037cf890dcc140aa3073819f71cdb8a6dd487a3bcf7e6fee86def0f0c8f2b6edb819951bf975d4a1b5bdf98268bf71fc846d1d5a5b8efbc190b6e0290b9cc63dccb296137bc66747eee1230c63d8bd401c1007c40171dcf9353482239b9855f4aca22d09243c1fe156585b7cefec603db0a026609506c647427e38ea60170a027aaf08ab2e54ebf911044d241169cf9fda0a4fcf554ca60265a94ecf544c1675c15cd119501ccc157d38d21fec42cf46aa3842bde40ea55e728bc48f3e510fa52ee2b8fa0521f2a78eca83c6f3c6991a4b1a83a6478d25b541d3ebe009ae4b86f1154a56f284ed2698a583ad2575686d4954111f145a6b64e541829757b4daf0e03070c9252a0db35e84064dc8531618e8c440404040369a562bf3b7d9b1271547d0e1be71f28a5e210e81853da930828e4a4f2a8ab02372e2755408b1e256eee563e3515104269dc8c9ad9f478510867422273306d404e859240b419d24d6a47e995035da92295ed1d3367af9f0685d3250c9409a8fca308d29ff40c0f4909b2e1c02428e9cc140accd61e673dcadb5d65a6badb535474bf7f2bc9108bbad600a691043d3b012688e2cedeb2551f613654f529b25cca9591be39fa6d6004f9e3c71d9348825c36cb41ff858a29c30fe3182485733a7d280e183c5204806852e84511a39a480d2c8aee0016937440863b02a74210b27961c1f10a8c81ce49006d2971394a3ed187922059913110701edc0095ccc6705218b9d20233d9aec1891c11438d704140b7243c5148a4001f6868ddbd9a9420c5e50912aacc8b15a10ac0615c94215768cd0e4c0808e00fd686e8bddbc2008dd0ea5f972604180c190cfd2d41ca00a64640674788277a9a56981851d298310d03085dbf415288816d1c11cb69d1dac80328c724d6fa8206a6158af2520dc09ff46ad0786623291d6c9922a88da8f4facc4bc535b5aacbcdcbfdfaa5c53b9f61c948fe51ffba8fdc47e9fd84f8b50689255e5377c99442f759cc32354ae91650766be003c3cc2a328d7c8d2233b30d3bf573acd69947bff36702600b740e11125234a7a94a3bc86f79325f55c5621bd69a4fd09a1f7c60b40068a924f24113a3f09320aee1e458814527a14fc8e1442ffdd86467847f95732bd879b3ec322fe974a47b4bc54c4ca4b240eed2ba7a7cf60fa326a39e374693bbaf4e101f8692ca2e52b6439d32d4f198be8e127cb99ee01e502f0e1b30370327c05800442f421003eb8ac46ad870f281f853450500070da00205145f4f096f7406a3a5a0cd69c0fb74e43435302970aee125dfb785bebf1601f19bebc71a48d5acefd6bf9649676af84f29a1e3da15053d3a5166beea79e5098a2c9144b5aa52714a68035d832962d3779a5536a81b6f00814d2ca78c5752034a274ef742c7570b79cdeb48c1acef7c9fdebc0161a1d0bb6d4f8ae996a94ee5debc12c8dc4f97ed054210dad86a986e91e599648eb84b44b78251ab5efa36112a2273c256dbab3a2951a4d734141562c9901b1136695d6497394a7b64ac0efce5db3a9add0b96b3421edddc862c44163360fe7e11c3660ba989c3c44698342233c1287f719afb44f7143c992877ba45d6265d609b3782059683ddcc9110a6ed5c7110a06aa2d965920cb444339bd77edde71682f01f18a3be541193f4d07b70e9ed24887ec948630ab4442c15dfa48a5af54227178f7482b2b4f9fc1413c1e1db2c32c1abea8d65307b7e73d08513bcbe80e1037e1c4f0a5d11d66a19c3be54e79bef0a72314b4b56bff5844cd513aca89d668d3b1c5b591bb05a98119dca591f6c7f251f862218110552a552a95d24e7b09afb895cf467d14be502410e20a6a65aea87c863454544ea77d2297844223bca31c0c5fdf4316c62beea1f0e581dd5802fe8c7753f82a6764d0f03bb266f210dee945618d1259a27442504574e9742c71782f85afef9a4f4cfbf948e1cbb3b41641fb3bedcff6f08a3bca6863bce26e1aad8ffde11577ad87dbe1154787f06a0a6249d9c66c0edda9dc3918ec088955228190aeedec0c61eeba6bd7b41eee36c7fee03e59860c51c6419671af5dbb11ba88dcb123443e81c474bdba70770289e9e223315de24b18f7d3c5759c38f6fc721f29515db89346ea62eedc1646e3745126aa0bd7bd9c321b3528eddd43e75174ce0be2748924ca75499446a26c883efb46d79d348e6c7424ea06bf13c7e972894894f6e90a91288da4384142b4b00426dcd0d0b8684e75e1b8832395833829dd992edc398f3bcbaed8dcbb9183aa0bc7b2e65c42285761682b5270332c05cf506d006ff8be7326cd854a227ce8a187ef99e2f9d58cb99f17471ab35713663561e805dff2a5403e8e8e9ea6524deba9fbe52ef26a3241f4de7dfb0c8ff038a6b626d1e0f0852f7ca17eb694ad1d09d8e095b5e0ebceae20cac410a0a399f5ce2c9d32beb38ec6c9aca3e115df923d4c2849c3205aca1dcdac8be09c743414c69d5117bfc0509f95c5533e21649c565bdb2bb57f81ad90e54ae5841292b355a9c62bf1003950e6b36210cb1e6aba74d37cc594611234f7407379347fda345f2b9166cd1742461242e360c080c148c2500fb3ca1758c37e9a65af938ec70b128e2486e9824f2283cd99734eb075034412c394b9574c121966ccad43258510e2a7ba80e0a74d2e08fcb4c9c15e60f77e2f30ed05366177f6d2f3127b59f2220bc9d2d4e50b6c9277dbb8833163e645a16ca0e83d24665cdb675c1b89a2e41337b67be48ed0b723315dde67421e8b1b193a7585bedd23857000154443d3d3358b8358de59cba675d3a2a92df16cd37c9aead2c2b9b3d249a28b1f7d7b8de9dec5cfb84422d1ed4522b9c34476df312279665c9f37a2ec36a2acb5f392a84ba21ab06df77eaf477634dcbf3b9b2eef9ec66c21c43061f825b225f4faf2ce5831568c1563c5583156ac45136b3ee9e508b7b697ab8b809088e4c987c972f5c2843b9d261dc7bd00bd307959f2e2f3f2d3fc18af369a9ef60b62f7f075739affa3d907afb8b67a80ad9b19038548802963cf873163e8adc315b309c3af40c4fafb1029c44f75b9a41040138644d32d9ada62dd2bb27258392d1a564ef34940252b87bb242b9aed67c14f6bede438ee1f392d18be38ab71e7b85fee1cd7b24396e1bdf75fcbba40927b715ff8ba936c91dd59c39a6f7920b6ecbcc06a6b887b45f174fa5f60418d4a628be2dbc6284ab03df41d21129584174568c7f6500b50f337b2e5c71b85a056bcba337a61778a210cd6fc0f36c4cd103775881b12d0eb10372b0b0671889be6df5947d3d9743dba9c19434defda9aae19177f1b675ca4206639e1920d504bacba9c41ecc8b207217e2659de9723a499938e86044402328238cb19b3e828c48b3bbbb30a0346cb4d6ddd3b5b6e9abf92caa9adeda89fdae2e107cd4468e641093f8d1a7ddecd75d2d1dcd99682a633566ce486c91a22688eaa98add6283663b49743c0c10a1b2edc8cc4d0c24143cb4ef3687667db5b34b505e3ced60bac65673443a2bab6cf6099e9a23526cbb6bc73e90556eaa92e242029782f4b9a6f5f94bc5ca1f946708188f2250b06982f558899312f5198302f47a80bbe17b0e0d3fc4996a2159a3f5f60cc9a74de494efb05b12c9148a452cf9d69ca8abdc0484029ae8158b2625fa5936b684e986dac2e560ead2e568c59252b8795c362f968636b470a6ea64a412de7d2c2375bbef08997258277747b9fedd5d6a965c608bd5ec381488508c3bbc34e4f234f6ec89e46eeb0865ec2024bf0aa5e1b83389500fff1ab87fa17b5151e02e1bf872e990448eea069d87181ffa82b1c51975755d48258eb350dc6bc30ba7e090df4620014039d252c503d8f364d40f39c3d61b5d18ee507743a0737c12bcb2d54a6a5da99cb5b1018a7eeb0ce18608cc3413ceb230ec1f7469187602679270c222d455247ed595a26bcb2f4f4b57e8eb4566ae9ac9f3b13877de4d4d674b10e0769a64cec4b05d485a5e1d524a96841ca8209c32493e26d1e138679dcd27ad3d58657cc39bc62eb05b1649c9dba537930b5a24b4a736918c7fa8874ab3d9a69689886717a70abe66cd547c725e3f068e61d9de6d7dc6f1ca725a9a1d13492d250414379d4300ddf34f760568dbd6c3a4311263de8375f6adf36f2e24caddde788e39d66ebbb97962ce7d78466c9b292e717429c40bc73721b575bb68d149955b797dcda9b1071682d2710efd66237b2948223c5d3b7cc736bcdd5f69cac2778ca586e6bc9528aaeb3ee409cff9807e2fcf6af08b5459a4e58e3a01cb5ac516a2777af289e4eff6af5621aa0eca1ebb9595b264c7d90385f5fd3a526a3644f8a04bb98a82e959c536676edc2ed42cfe0193c4366f866cb66ad1d7380fd7d2313fc751ecda92dbac35c0291891cbc62b003b9de7964f65c513cad28c98757fc30d4617f42248d593a88a59714d6cc6fe530fd338d4cf02af42698158a588437fd0b4d6198724ae2b047393d8b142d7c812069493b57a0c99e43abc3866c83648804c37b2d78bab2352c699c0dd223a3d1148a22131fbf89918920d13b8d1cbc12c71af127b84b248558d169e854444e1004c914694fe08eb62bd00b5f1db3baf373340182a48e22bc7fff48286c932d7f0e9e241339ec84d113868c612c118142554486fb534fb5cf4b6bf0cd16d54ffb76fb6b73521bf09d4c36999d765381dd9834f7a0362a9893c91cacfd6c2b14224fd5a5b33dbae7911f0e56a2f311c0add1f9e505b3bc87ceff4a1d2c8ee5cc4b54c0cc57c31748725a106f87a4d24c69d451bb66f413dc35228578e1f954051c65d21f05c5d4aab642de431c9ec8fa882bcf7a9d078ed4bb47de17762941d0dee542b089606a2370b1e3872860a4789931e03924cb99f66e613eb20c02880134a7ac89575d13be998438a948018f9e51e84985cd91ae11e2b574a65ae77cf7cdf0fb3a26bcd229e93d92e67438e8e90f2ee4509dfb9caebc4bdafa88e5845d4e27e84606148b55173e0d0dcd142e4be6b83fcd7de46a84d0d79ce0aeed2778e1d266ece630a141988106c11dd0cfcda1c28608d701e97438cd9ff59d5517a61b89b2ff21c8b5e38720d776ca2e4a732679aaa438db6a412c3ba0b6b4f634f2861c9a5369ce3db9f458d2ab9e4662c063a407929e46628003d3d3080cd2d01dd08ca1cdefc4305b2f78708420851b1c210b56b8b856224e23301843971366d2489a433ba0f2cebaa09c9c1fcda73f3aa08e496745101f91862fcbab3bcba9ad8e49d7a4f934a7034a22967736b37163a485a0500671beb42d8aa7d3bc77569efcc95323e7e9ef9d738a5c85913a30a9c14e0ba0a7911ad4f4377f1059689a9eed2da9194134f286231d144417290da493464c40434a83cae9337c9d58ac9066a9096dd4613b0714b6510ab0ff6e491c1f2a016d49940266fafb4c83e28e768be30b028e240fd8fef809db1f888374e68f0435f23be9332ae97624bd58f2c51b526f79a728df67356b5378743b42790a8903e529ffc672f4ef337d33aa568a8ef28902b2f6ef162457b824a2b5e794a368d634a26a986e6fba1d9125ed9168743bfaa7c3621159e60067d452c9a6dcead41649c65356ef9772d398f24f877e9670a0300a8923e528ff4cd7481cfcd17723f82323464c96e712f8395bdd4996144f6d3a28dee9625d6cd54ad14da231878e4e790d6bbc47640eb053ce618d94a39c8635be4615917294d738759972947f284f91383cdbdd863550481ca3ab6e491ca3a3f8a8a75ee60053a3d1573fbb63468a46419dc90f04c9b274edb34fb8b6b7bf6dc992742df5d29803ecd2743e69cc018e66a38ce5edd43f0a8e4a63d944970e8aacc91e61d2aa7f769cd48e6c89d03eaa417a693496b441946b2693e99359a2f01cd6e04621717c4f19bf499633ad7af894b108da2ad57f1abe5afc0b427c12ce8fc6797bd11e45250a231511158c59e50acef84aa23a426588306b36c2a9393b23588907b358244ee986a78e7a38088cc4d35c8e6e48394dfa51aad97098450026dcba3c3c4d9abffd6c4882f8c8d97e300bc6f99b0eb35af7391d0122d2bc0d69d6cb79a4cb0d67036a4ec19286e969240541fafe7c3524c02f4f6d6d41a39bedf2b4f8f28e629b15acf988f7b409afb416e1eb92dae74c2936287a692f78d345556cef9f0bd11d2dc82bf025160985ed124ce91e6b9c6db296067727e69327dab512883bda4737435a3b2369eda423ad7d44a4b58b27c00813be3c8fe6b4467db44671c432c7fdb134a4b57929d161d6103d5b657c29d109720ab2c32c217a76caf852b23384c5101a6605d1b3598c2f25343529354a6e980544cf3e8d2f25374a7aa028e92163d6007af6caf8f291353135f10962d68b9e8d1a5f3e413e56947cac5092c32c173d3b35be94e428f94152f2c30788593ff46cd5f8f201f26132f26182c32c989ecd32be94e0f8107d28b161d64bcf6e31be94d828e12152c263c62c01f4ec8f2f9f999390131c6605a0678fe3cb07c747e803c62c979e4d8e2f1fd811f0c80fb3563d9b87f1e5f3b3e45be2b3c32c1f7a76cbf8f2d9f119e2f90c49326316007a760fe32bc92c89932e89131a66f5d0b30130be7c686a6ecd0db35a7ab60fe3cbe7a607d7a387593cf4ecd5f8f2e941b221b16116d9b35dc6978f0d0f8d470eb3c69e1d80f1e593f3c3fed061d67bb600c6978f4e901a24c6ac163dfb657cf9c47cd867c2cc7ef9f0308ba567c38c2f1f224d432768bf7c884c98d9daacfed000d9b46cbbd17ea88cb582bae00781c106694bbad05e68d6c2d0ac91a1595343731b9ae1d0accda1f9f6c6f37e2f776fcc01da202a33ba09d268a0c560ae34174c6d05539b62b44fe68a0f8e76746385473e61bbb433b65634ff25a4a1d2e306a6ab6276499c300069897edf7fe08842798bbe01804188df0740fa6cb16c5e57c5648105b88c9762973ea78c182f4f5d3a388e7a04d55601c8c92e26d316c45b90e96a2cb1cf343e414b5dec094a1a577ccc183001b45fc2d725351f88e5e8667453ef154f16c9ccf33ccff360b423e2fdacd4d3880d93b6f1e969840443ba44e5343fd5d3880d12fa1b0038baa13276462d1d46303092021f5dea692405362008826007d4f9fc804188a6951c2e5551d5bc712567058757ecbd5cc159f13167698a40b203e2d569ec7e3a26218d7727e355102228f23c6fd5de27b746de83085fdee8a68ac8f282e02d09ae1a7c25cb15087eb6d610f88f59b489ec66588345774b40caa172a641b28bf18aa910efcb2ea6851ea9191159f484020fa4d0f731fa0ad1f7a56f4b052db7bad8847509068c172f56a32e36ba19dd00c141c4720bda826e66cc2aed6cb38259d3481d9c306b82372a367d359abea7b365672fc2d7cd82588e6e667674c3231c667de48a0f6a67316e15e07c3b63d6bd8c182fb51e325e6a3c9a673d62b555801be3271927b1bb418444d01edd1c412c556e6e547a304be5c6dec8e864e0c8c829400c197c5b809b204601bac790d1c5b88c2e46e79d6f779835612cb1e9c2d37c7be4f2926626cda37b173dc31ccb6c73d37cb3693e463daa10cb2ed6c57c9875d39ef77befbdf7de7bef1deb3dcf03efbdf79220386ef7c609b35bd0a807af4638f5dbe65de4799ee79122d178bf799a092e115e317979be5fd89db3bef7a64c7dfb16e02d3326e6f73dcc9894df0360c6b0f8bd0f33e6f4fbd564a9fcfe65c6acfc1e66c6a07effc38c49fddec564a97e1fc48c61f9bd1033a6c5ef879831ff3d6bb2c6dfc7cc18f2f732338687dfc798312dbf2fc064f5f0fb9e3100f8bd6bc6f8f0fb03cc98d5ef1130592ebf4fc08c09c0ef6bcc1801fc5e0133e6e5f7454c16ccef8f98313ffcdec68c71f1fb06cc9817bf4762b206f0fb24660c10bf77c08c09e2f74acc18217eff80c91ae2f7139831acdf5360c6b47e5f811903e3f74b4c16017e8f811983f2fb0ccc1899df33515bddef9ba82d192d951bd2e8f7e692e5e5e115c3eecbcb73895c98ca4d6dade054971b2aa3e2a12ef826959b12a97223224b6ef065176bb6367c8d6ec5dbb001fcb5478e6e5a8013865e72c7180b30ceeaa269a49108440862c9129b31beac64dc00314e5d3164c4f809aeab00ef6e58970cf20453885c31ceae2b457b9f0310c5f81591e54c8c71ce01dc98915b661cf94c187e118e1969570663464926cc080b7374850933b2c28419219930a39e911426cc280a1366048509332a3247b009337ac284193961c28c9640474a9830239e09334ac2841919618e8a306146449830a39d09330a320ac284e1f3308e803061f8e438fac184e18fe3a80773c5ff38fa318e783061f82ce368071386af1a4739a02b7e6a1ce160c2f051e3c8c78419dd604483d10c260c9fc53892c1a807ca45f7c612e528bf23cae88672a378bfe8e525e29a46297a74635f22a775a2d1f08a45d2ce7c88254b8c5df59e25269a30229225c62b26597cbaef8e4042083411d298e9168257fc042db59a276cf822c22c90e4c0fdb93cccba2fd7ab1e09a47bedb8df5f169f18304a9658b9058d6e463876e463548558b2c49acf12631678169f163120e8101e1810594f18909f2e674f189023cdb57473ce39a9067e39c0950d5e7ddff7cd0428f19dbfeffb94a03778c54a70a9c32ac1ab18bcba4a7cdff77d37c73c7d5182ce5189d3165edde015a5b7a1042595b841fe545bd4c506b19c315a434910bea453d8a1793a01e9d03c6544ea82f939a88c89baa07268fe9c126096d67993cad01bea82f6a02ea80cc5a12ea88f941943733061f8e105c19e21107bfaa59835e7584f6fd0d06ab871c05c31189acbd0fc8ff6a03263681c2ae385663ecdc18c4962c2f8a03237a80b3e93f98592e250ad3f3acffdc4ab1d3d2799bac12e37d88575c4f2c4399a08069a092a9db004bc986145f311f01621261221a0e833b85671db6aad9429795e71ff2bb962160d9965c9afea4a1357ccaa3fafb8ae78c56f09890f89627df345ddbf78f0837e411c75178da6516404f08c2688ef1193af1b11c0339ac0b80d62293668350a83d3402236c68c21c472fe30a1840476e8bcb00b7f92def79dfaab3ab4a62b228875bba40d5f4e18e075f5f282524e87d61b0985d6f5b2de0c830bd47cf0947a31556edbfe597fc9d3ebef29d5f4b56a248a92d705a6e174866938f8e68b48861e510da5b1e72f00b9ece98b23305bee8a551c47223d6db7a4584fbcaa2579aa54e45557fa84ad546bf0851d82f6d9b28d3f2941640de4dfd3a9bacc338820d7aafdb3160619749a0f9a6c686b3452083d0deb6f25717c85bcbcaa414f3d4b6b50d282b33c3553b6640af6e3736e40a43a6cbf74d8ae2782294562bf6ba7e882a149c5eeaccc6431cb172c350c5f1d617c166c42fc260903463339230c250783c26056657d4f68adc3f6e562f0aa82ccaa1a3983845106b184d16c456b614c17014eddcc442c5fc0e817a248061ecd37c1883191a49ac397bda8591207bd468ab532682a6194628ceb6304083feddd7ba529a78c092b9a9fa307c99269c50d9218122602631e5e31fdbd27cadc84575cbf7fe4dad353ebe92bc93fd3a58ed5a6d2d41a5e710db3e86da594921cc42b3ecd01cb663d2b2b0fb6c20a66f14ff39990c970c492f6304ff3ca8e654b4f738f09148564be7f2f6bd353b2148da18ba3d65c1231747a100443648b40b1dead8a23b72812897574d1bf90888293e92f288eb341286e83e49c56e8a93caf77dbd2f733988930cb2339d0d2f7dcddeed24b5b5c4236dac3aca95d1b678b0654697e643dbc8af95024b5a7f9f5877f7849ada9377446aba638cc534bcf55ea051397d88245d34fd16ccd5a67cc8c9931dbe9b719c39d9e9baccbea6ea22ef814ec6ebcc05cf1ef5881498171021346021198301a98262aa3441b9a2190d2fc130d75e2a4325b30c6f2d4fc001a7c0850173e97130b69687e4796e2189a7f49ce118f84234da7eb647932531b2aa568ead1cdc9375b4a30a8e78dc3e809e8113d74d1b7b310eaa557682fbaa4f3333801366aeb7e9bb219f4e2d6d625a9ecbb1e4937f2ca68ada7d006bba15e7a854882de52d0dbc739295fa2ba6c4f1913505db6874626aacbf66fb4317b7ab84dbcecfb5c51d9e8966d6a0b24a94c24cb4b5a52d63382b7b1b1098366cd3433d8f5519edadabe9d67a33c7487ead8d8d8d8cc13a909afb6872a53344c988dca26cc467b7a74c4927e034175d95e9fd02e9e864ea0ec9dd04851e8a304d456cab72f515bfced20d841535bf5db6d9cc872ca7adba84c26ab2d21a4d106933535e1479bc7e9a2b2daa23dd565fbbd32d10ddddff07e4f7a97320a19bd34026116f034c72c91293a89efa211653f869ef2244467f1d0539e72d1c802658f6a11ca43a6b34809f140318942380db03c10e90d496dde829ba6372291297a86da0e2137c0871e2277840e7e86281bf7484cd7257708219137be77df11deebc81de0bfcfe01a21d3080b7e9a77c64b648a1689f8a147512f7a12a17f6414fc9038d2a63ddbd6d3db5fd4d6f7edabdaf2be7dd4b4a7b6a62bf6d37dc585ff2ef21e5ac017da7eb7773abdddbbe9eddf7630b4e9eda28dcaaacb365dd3e5dd71ba2c0f441b5b3d1f0ceac98395e2ceb09602e49b2da506d4dcbf39cb53cfaf7abe688d77e8ac356e134794ebceb8604778c55dc65aecc8139d9e479ee0b48b9e47ee20e326acc5b84915341a96b544ed94ee54eea80674e72bd19136d4353a93b3ba2851730203b846b7a12ed29150f25c6a3ca772ee1f453d08913e0872a4ad32d21e47fa0521a2844ed4d93b3dfb8eb7ba7017c7d149171d4675e1be2f45ef79d768caf7d27f10814456f08a63f964161493572cbfa1111a898343a15098aee3ffc830f5d4c1d0881259ce7478c4c7f28f4eb4681c2d3edb343ad1a25b1c659c2ca7e14b756f24c7d468652d3e837978ce0f5e71f7e133786708af3818af8ef04a030a8ff0ce85477ca764596a640766da74cdf4d29f4296da0d8d2895fefd3305dd4baea7eb27ebba525f7e4cbada8aa46b67c95207e8a2c32beba2b3b9f8c08ed556eba2d32e3f2e3fa80beb92c32b6b5d7c604970c743f25d13b748d1c42bee975df8dc85b8305aac31dec232baebb0fd8259f49d10add1d8c818af4b0ac12bee521e5e699bc6cdf052245017dcef3656cad354d633f8bb75e338ad5e12b42932c52bd694d181af2d1cb785772592e4eae54bff05a784effb66a8d98813e401f2005500da34f94890a77d9db7a71d9de3d4945272c652a6f9664bc92b2d0555ab364a931276154444d5f86cf8d23625729ceac16fbc01854020c75de360c498918398c6693360c4b0c1acf0450fa35691f542bdf35f7807b90563bbf73e6730edec4ca760d270ab309852a6236d326517889e673ceeb86da7a008f2f80c370af2689048cfe06fe3344a2b376a9757e02f036d5524858fb27dc561e9b691383492c4518bd0596baded4ec529725d4bbbddacedbcaeebbaaa5d6d46e54ed6521a6e412341adb35a6badb5d6ca1aaa08cb24571605218a5a1a067d0d5f357c5121e6b5d60a76dc7af328a5166cbb69b59252802e214cdeca3cba773346df01945eba985e8e282f554221259d236f7ae9f6317afb471a699f4f2451140ac1d1c4abcd86af4feb62b4d6911c88d1dad5b8d1f616c325a486a4a0336c2dce65167f3671cf6d9ddd383bedb53d2f6512d4edb2c13eb14fec13ee5c0da26359653b705afb5673f0ba9755d9b66d5456832a5503087ed6ea12bb3f2b18b017b0558d896209d22f347e5d1a4d99d077aacb8c4929fd74fec974120bd3c8e229e3d62716a72ffd635162412d8b94513b957cb89dcaeda48cb659d8538964aab54d27ee522865a4cda20299482028648da5ccf65a3c55147acb5dd79f949b46e7571f16279d5f93cc1828c40e9d5fab9832a1575975e119534a19472f8d5b9346a76771d3e8df1db118d16da4f177dba3d19a524eb576ca38270c8905397965e266511a9546da2327a4a0e91412080a39ab699c3d435c48abb76bec2774439b08e464a171ebeee5aaca6a931afbc43b88e56dedeb3870348a56b824e23f307c892410a24814dd1381a10e0c7960e8fbc010f8eda150bb0765efb2ca647556679c68fae1c5a6892c953e6b8bc6daf04083523f3d6ae5a558c27831a98bb803ea4251cefd3b8daaa38c5cb38c3466a37c9bd556dde14d260b6d3f769035b7d8343d0f236afc9a4c8d9ef799ee77b7daa4a907ab344daba8afe8aba038635062a60c8a8585898b1532343dca28eb260b85c520d61677bd77f4667519c759d7aa5b611f57c32cd45b9c85e57c8e8659a8f33f0fc5826ad182a2b30aaba47f6c7b4469664c1d660ccbf9db1553a6c55fa78b726c7a161e9a1eb5ba62b2503c7234626fb319333b134a0a35de6631a68cb37a5703512337438d5b57980a356ae187aab1a41014d457fe85c2d70a098488b28272141235d6fe3c1035727f1f881a697fa0d75d100c4d5ea1b6468d4054b65975b9e168c4303c698d8232d66dc6d188282337cae3a92e4c56584dede121f853589cb6d966dfb7fd6c3fff411969a346202a5f51a937dd5d65dc661c4ee568389beac2df3d586db1e7c1bac2429f14163ab3609b71a56f379d864494ae5dd2588a7ab4cdb62eeb0e9ea0bd83d96c369b35e3b4c6813bef4681d8cfd0562f2605cfb014766624059de19bca82077e9ff730044b4ac4eb2812c2ebe070f3c230d4b4307cd19bd7690fc9b233a20bbd873a284ff743969d47bb538a04f09d37cef0058a1da98ddbc5dafa0e8225ca3d8a042a73ef8137912537f3b467e39a5e9c2b51483ed899c8223cd4fdf6f02f46ffbe8e2c6b80efde9d864780efbcd32154a6bb47865d579a1e7aef481cdd11e167c0b632c544a278210df0383cd33bd0f352480e852c6d6fa069a3b2feba51bb236d66feddc8eeaf2d51a42eb4f0a4b15e8484ae2b73809d169247705714fac8f2f66b2b44be1891ef6c54170b827fd1dd6dd4d60c8e41f0f7a5f7d2bbdd378f447d2f6acb0647ce176dbb6b61f82ea4e11dc725c1f66ee3de5eb21491e58bd6fe7914095cf80ab7916e9ed6debbee78c2d03b76e9c897eec892b4515b21920cc3f034181cbb2ee40e8e1f39ce344991405d68942281ca509eb65e455983c614d4c297d7da7ee2151344da9de933f8dede1b49efdba869bf1a5b8e76637d0d8bb8266671006ceddc41b067785b2d179668fa8ae43ab4ae8fdd29d08841ceeddbbfed2d38bee7c2d5f7464e36891f782d6b2327973962f43c7774d3b1a1c2acce40905385201c100744051f2390f1b0383bc625c459a40a4baa2c47957515b5f07d265134956cb5d5da4aedb4735afa6aabb575a652ed0bdf6c29452036775dcd7e9ebe6e9a66ab66edbcd54514aa5184578a3963b6f3e5d57489950c2bd8e9163d8dace06685a779e859e4498f274d7aec59e4498fce4f9132dcf47b166112d4412f90f57b1a7941cf1d7ad0dcf4a86791274efa9bda10c43295d3fc16b1d6b9f7de7befbdf75e9a437ff08a7578a505d17048cd87f6a3351c2541543e1b15be54fe523224e5b357c257ca5f4a587cb64af862f19792d3679fc2d7e92f9f263366f6ca67b3085f2b7ff958316366a38efa4bc98fd467a384afd45f3e4c549f6d0a5faabf94f860f9ec52f862f94b098f169f4d0a5f2dfef2f9678fc2d7fff2f13163668f9f2d86aff12f9f23336636f9d9a2f045fee5b364c6cce6e1b343e18b87bf7c86cc98d92d9f1d86af96bf92389931b37bf86c307cf5f0974fcd8c990d80cffec21700fef2e9316366fbf0d95ef8f2e12f1f243366f6eaabbf7c78cc98d92e9f7dc397cb5f3e3f66ccec003c007ff9049931b3057001fce5e3336366bf7cb616be5efef22132637c66dbf005732e8118036e4b78e579bff7965787dd8078f5c3ab5833786fdc7c9a3724bc621c5ef1e643d6e4fedc2597c9fdb94bea69c909e874f22142e4c8919e184f1155fa6cd1e78560160a9c281fcda81ea89c9e6fe1162aa79e5e3cf86dc93848db208e17d4c19531aa888c2a9e5bbb514584553c3ce46591a572523fa020962c319658eaa644e5fc88a50eadef53ef528513eb7b548eaa07b32e09a43b5f192588f1ee33b41183b4b94b06a9f2c12e7c15ce44f1aecdb92cb2fe42908634ee4b09b4b4e7852859d6110758de83e1eb5e55c32c20ce57d9d4968cf355249832a91d3a5099d410384c99140f75c14da84c8a881d262b88f35372a02c21ce4fb561b286383fb5a39a6288139e38341136343f9585324c99144c0c93c5020395491de90265b5b63065523d49260bc6655248a80b3eec0c292ed018c051419875491ca697ce2d8da3b65c12f5e32b7d0023ed7befbdf75ed11d533b5486856708956121c2436558603c3b4486c0789a9f224265588ec0a80c4bcf112ac382a487caa87a501748a88c0a87bae01f21d2033bd2aa544fdb0089e946942e0ed3eb45ff1804a23b0b0f9549c53e19a3ea09d3859f8ad10274e7254c9854ac6babbb8bbf70f1b2f68b77630b134c97cd7e46bd1604c1cf822565e1f9e1fcf9c34b6e16221f8c3b22f68cce674142fa4784838947463d4d6241d27c1823cb16e68adf1a59c040577cd6c85286c9d284050e93850e74c50f626c4182b9e20331b6b069c1835df82a1bf0553d0870be0a472380aa47b3f77a2f9dab5be66831dd84fac12bbe8bb16cc102028c258b174a9631b0a0a199650e25cb1dca162668bec612430561d69c031867974a544a45845df8a91c66a57e5c52c5930615caaf8a67ba30487a2a1e66016a66b9a92d169d7bd3a89cda6a01ab2e7c96d89c75a9e279c962d3af24478ec4623db12d20899d629dd8af24478e10218284e508b75860447a90f4c4604488b0b0f0c088f0e0d667535dbe9b951e1a597a3c4eb17b45f174fa4fa7589f8e74b90575308dd2ae2b697bbc82d3ade074b0ee48d7c3acf2f27448ee920ee727122f19f95c9ddaaa34d585779c74596f82347f6366de82780b2ab7a0deb420aef4f40a92e63b7ae3d5bcdfd7232b3c2baf2440f7de7b67df3189ec7239bc62ee478bbefd0e35add2b3881d64fdddd1bbdeddd8f33c902f587f47be37821ee8691e6f34dc70aee2431b794d9855b278ef66b555c305d901c700cdef823c9a1a6ed5dc3bfc68bec7835ba458b7e4a7b5f1a50436be92f8fc308bd50c44c667d8ddca1879b4e77de038c10bcaaa571f6af5d7bba06703d6a0b3efa90aa80befdebd83e3e54181f7debb18b3ec80d3dc65e75dd05acf8e4cdc7befad6469a7772d3c42fbfd0ceff63b8ac84a6e630fcaf96826b91b5e1de962f586b7eec77a76b0e959c4c9ac7b52a18223bd05d556e7c37cef4e643f45aee0297205ce8ca787e8696436457ff307d10c3d3d8b9881e7a5671133f098a177ef76bdf1730167480304455f811779e5ad9ec8f3bcea893c90c4a19dbb478645687701b7f182b55edbde4bb02b59aec222bcf67c08c56fa7db651280f0752fe98d226a436534d2ab5507973a7886477064c9ed694cba964abfcc22c04b24a7598ec4a195b6ab6684ad24aa74d141cff368a54cc07a1178715c8534ec2fe9437804e8895ab6a43c5a64ad6d890e80da8315710f4dd334ad2422afb81dc6085ec6d89d00281f8ddf3faafd963cd1bdeb95488ff4fe05400554666bd9b83c522b41127c6d8dc4e1fd5672d3ee95d623a988f42e89e2be1dbcdf6c83b53dd135f09d8eda28a369bcbc2ab58434bce31091a5f3500241f02fe10bfc666fcd8db4ade779bf9c56ef12beeae5fbed1e0fca43dbf143904b8a1f825cdd63ca0de7b575b15a06273d8b94a149cf2265504277b12a66cc3ddf3b10199fc15f773defdedbc57088ef09d3014d17630989a0ad432c556e362437bd056117fe1022256743e920be92c826cb8acf1b5f49ac5042e39524e895c48a5235fb1a494193be5f99fa9544a60a5f4964bc52cd164bec958409b368dfb1b47d6bf5c0f17aa99025565b5d6c255cc0ec1babf3a804ad73d6a19e748a664680008006e313002028140e884463d1683824cbd2f40114800c9aac527c4e9c87414c21638c21060801000000000000009a3000b07cc01ab8063c49a0d3c1aba45d3c4fd399e60e477aeef24381f003044b5de34a59b9e678b674986c8818c76436785f713921b20381b7b1ba8eb3e8ee5823f986c163df1451db4e0a94acbbb3c453a1ffb91bce8920931c755c077856d312732061148aea3268a93b26303b493a1d839a044f533da4f434d13b588623612bede6a0191b4126ea64b3e5de7809b9ef035499171a5342dea46644f5a53887f62dcdb46b91a1040356b7a61dd897aaca6507036c212d4de3a24a8258b2740cd70127c88dbdad5cd41c951210851cb6e63f2f25ad082d555574409187430777f0991a7a4680bbd465c02aec55be0884c63cbcab11198e604f3f746fb7df14f0c2e1447a5293c9d35119fa752480cf953002089fe93542afa537d491c9e8f412e42e798c5eae1cc3df1a4c4b208e08467aef9894cdfd4d7b83e1437b3896b8f76b9469391bad6fcb482ba4a4625243763e29da6e61904e30bf1dd1884d048a4e081eeca5ce0160d86c88d6b40c230500eba2619d45732b787417ffd7d42975a9e7a155b09972c4b59d37729cbc35004d08e4f44c115665b96840fde3522bf6f0cdc378da8a236bc857aac4482b686bab906a0b3bdac05efacaa47753ae7ee3980bb74ffb5cc6f6b3fc920bb5d669520cbf460fcb67e30e5b9dd131b78a05e23f4e62246c1eb2e9741d73a5df58ae1e655efb2d051d3cb6e09679ac7dd942f65e080d2e18fa6b98422d2dc75500d193b65941429449fecf06a90a96c475c91ac30dc89581d2dbbfc1f3543a933e1d94a378fa43f780fcf0001d679f2cb9c0ae9b5b17ba25338e1aa3c46646f59a573f561f960d4b88167ebcd253a64c2014bb89d9912c07c0f0693da9be53e017c2308977e57f92e819dec698254eee7bb2209cd65a5d7b96548bb2f688a90daf795f277eb41979cdb89d3fba6a2a9f4ba591511dddda2fd234b1762b4e3963c3b6f4328db8ec9c1bf1047e673b98920a6566765c1e199e3498318002599bf0b49ec9f93865359d4d6d91f00b955b08ec48ad44eeb622d33b1fbe9f159e1815574ef2b225ab713720c345bf285ee232efd2a46fe8c57543510258917798c4b27891671d8d8b646f53c605a233dd6eb51a6b7fbb50c0757abb186e0a43f4996601c3ec5e11036144669363c3720e9d0a23cd7af010788fb0921e2c8a012d3b2c1a36211e5ce80fefd1b6429198ea86b756154cbb1d8399477392e827e1122311e7c94cfdcb0526141735b1c17c94e391a6275ce391982b014cbdaee60aecb89e9d040e47caa72029e0da15e74d655ae74a877ca630c273ba2b545d03201046ef63108577d2f8242c50bd61771ea7f8630cb4f53c43a26ae842c2df2716da3651c7d14b7a24600341a692c6e6197a9a990ef832456c1d23212263c8485b2929192d56435ac3dee1df6f177941a5ffa8d07fe490d7b00bcb7179daa0ec65c444d5adc568941fc4f04ba13fe58832ddf0b972fbb3ab38bfb1d245ba11a0e5323515298d3a5612b026cbf60930d146d03343dd2f6f64fbc2bc544630392dd3fbedb7ce8d2ad12a14c0d400941d96fecb9c19e6d83da22349a63e9d425fce1e9a3315319e2dbe3eced12f213d32b6c1876cd82094e58bf8070807651e36aadb61165b8892fe0bde9c38b937fd5122cd021185d42efa802825ba1e8f007143b6a78bb411022652a27d5a85b203395fcab878d5eef1be2a8de1d693c2636fd8b4547f435b2de3022147be5f0c3c770e898fb4b3b321a46568274790a6e486ca549d3426b4c3ff2b4b7db6ebc211a233dda263e1e0dfffda6b6b6c2496f632b58fbe754d3e8012ca69a753442d1fa7cd16c3469f3ca1705f2bd658b518f4f98c1cc913163014e70b55201cd55b99426d50245164a9381d687a4c56917a0ab621655d849771b81805eb8e6ea6b62caad1d9c8a6f0a75f21a217f741333e17d6eea57a8d070017d5bcee9a8b5811c1c3929cab1116cc42126d3326a7f47aafd2046efbe9dab8e659b5dd5c73cf21bcecc4329aab7f805cf772907cbd2b9f11d90ef1225e84f778af492d69cc2cd82798199cce6602388f762dcf6041b213c03633c5ce87ea17001767ae058a8260c7721c73e7b62af4b1d37234a8dbed38b9854677d13e3002e1ec46111f026a0d8eabe4599791586869b53dd40cb497cbc316598e29816894aae30c5d437bc2eb5131668b81050dc8cdbc2030723289ba539ec32f58bc3501e1ead28428f2a4a9d4a6a9c836a4fb2ad29f912b1b91fc4b29b113365a7b710b3e528b72f519183a15e5abcae4dcc4857b2781ecc11ac99e313ca95222100e2e33e4bb3d200fc16f711244ce31560ce1b14c8a3ebaac602d821efd50971244f479701b4b74093908233e93d77ac33f8a4af6866079981d1ff278d8f8bf5e723d16126502efb910faac63f6f8d0f3c3e69ff5486f53b8b3a5c1a633ce33e3439e8f1bf3ef88e60b47a885cd38678c0f3f661c08934705d3d79871ce189f70f983f33178a2d6301326095c42879a1ba90d1cda427a211344a43d8704801ffd7a36d8941299cd3b58a6e12659ed57890c44674acc83d0b32e577a026ef444a531ff1f649c12a1bc0f4d54738abf40046334214d91ecb009c7499c2d6c9522b82e42971ee575b730e45a91b22793b9f1144c12c45fae159917128e498066434184c489484ea6e8b0dd08e298213ae6b71bcb3d0b69e84150dfaaf42cb203d54e779a8ddff73b4ed4117376166c61dbae956bea6142a5aa3268e6c72fcc4126ca28aa33357c90898af731922bec0534dbf3a4847a96524228f3525d2240fef656a311ccc8c8e63bb04b5bba1e00bf87bf1bbcc28a7ddd29a20d494d752131b541e0f1cd46546077923ca407422f266a7af79e80dd016a46194dc3dd19f5a6b140fc5d70a52e273bd6349b0b045429d130bb119875d5df965e16ca0f19ed0c1fc35eda02b0ffae2b973585684e6461ea1da176139752df154b30ed0a01c2b58743a72ab108b363878bb5d14c9fb8fbab985738e00ad6ede939ab2eb72f57b0759c51539cdac41106cfbc31805db7120a2e619305bd89d1d70a3e819684b967bcdcb70398b61b52b23cbe68370c269525c223a275f28c747d9e4ee10d4e24e6d17348ba45e3024f90edd61ee2d4a15dab56fd9bf6a6a4dc954f762216ad5217a150c559f870bd0ca018869f02fbd653add11e1b2b6ee45296b1caedf671571446bbb3601042b28bec51cd9ab923c5091040dbda6a71e5e4f5bf6e9b49e9b122bcb183595b613767e474d0e3a02c253b598905232b8b34027c28d841283feb659757538b10831a9f28975b0988416d9b907d288fa85fd66616a6f34a60a9b957f0701ef30841dff8a488e63240c7f98c98463d6a8d9acc06bb5d8613c348e3273a15d5d51dfd36cfc582a549fa8afdc7e25a1027fc140bea509b18f829bc92325fb86768cf43fb1d924f8213fed232db180cb3e338f04bc7d5a14006ef728af02dc3a76a3ed80b8385f9168886040aaeba14fa9baf5532e4cc548da452d38af7ffecc13ff5197be3d3e95b172ee4ea5779a558958d9fcd362cf7e5096247fe3e6e6bb26ec5fef9bf534037af8b96fb56988f826038ce5af4201084559229ffcb3b3f483542276a7c65f1b57e09c541739ffc173129565184528fdbd0d93d24f551eb7cd49af010fd18cd278dae268ac777fc4d8aa3560de8251768e16c84150412eb80d3a37a9fbd5384f0994faa2b40e332cf1177ead815a611852ee58c8e426587781639ae1d51b88f1241f7a87f86be6fb1e6b72d40e2aff2dd77f48dcee12f3aef2885e31248a7439ef3c8be9030ce7ef5a4099e957b18d8a49f3cd285510b06853a307d15665179d78ddc61aa81dd36bf8fc20465666dd1e44c87fa9724d5f6358499bc63a0634d0f591430caa16a0780c8e4b3ed5cefb6b5adc06235ae7dee8bada2053194670c6dbaaa1e8f993a0da928c58d610394d0a21fa8c5dc0149e52031c7d33feb1a7f9d8b961af4442095e01ef78f92bf3568b6db5b3b8b85c8a74a39efb0ce634ac4b18ede78a7251c976771e6db7322cc591b2c2864a9026c25112c0987e002f9db6d3c1e5aa9749beae139d230b7add81601a983333ed64bca64343a27eb7e21a0b891e6182c1a3cc4dc87806e9281fd693b381f486fefdcc8ef954fa7863a4dba0592cbe6b3f053522f62a83925582fe54be2eea9f06d039cbb7ed3ddf17aca82cc7d3659a88887a8b80d056a79e7ccad94af185d4e7aa9f1e85d3562161e6878246c8ddaebd2ae3a3e2cff4c991ddc3c43a3af076a63699b836562a4e92cf64584100b653280f285088690c7f706ebd4ae34b61e693d53f45fa148708102877348c760b83cfd465ac2c4f40e76a97a26a6db79449727ab297cb196e1a776d5403a79feb3c7cb8b865c6bc0edcdfabb276e6820b0e851671336794d876023439a0774484f98f68f2f9091b69b44936dc895b9baf79fcde7c2eb736df5a2479f03e6c454f1ec4f91f56295d037e7435ccece72b247a5c3da0bf68521456006f54fefd8c42fbb45b0e6a92da7cda048e22ff2ef228c863a00f1175b6f5745ba03eb225e0d0d8109fa7aa008ef267cf31b01cf0b6644950eddbeb9360903c203cb5301057f67f51aace40861e05fb6265e9317d9fe799c9e8d76e45202439a9d733e48dd282bd5c9439950749dca4ea04680bc8b04a8ac142c12ed14251b26621224ed881551bea97a5e4a8eecacfc1b145d8e2fa56c074fcab0cfc6c0662268005099c5516c41a6935ae823b81d260e89b385eac984ef599452d07cab09e8b411cd609447ab57609d49e4b791074c310c860f0da85d1bcda4c5214b487964dec5c21aa679407cd4bc1f799be35f0afaaf2c595ae01adcd4f76afab67ade9d452d00e3fad843b9aca7d2d39b691a40313805471d22c6a24b39a47c58ae9605fcd7c15154184b8aca719b5fb7f947d73bea1113365c393f919dcc80fa45450dec35a75a0a0fa8b6768481feced5ad5201a6ec022e8c9779ab69c144ca734a96cdf5523234bfe72cbb442d21a852de3fef316f6f98b0c7f9405e954db2790df94a4c6bd3b89a2ff5093cf2144a31b594d4183e74278589bf58277e361f0d548e914b2ac0ab29950d1052e1de1e9a4c64823bcd23b0e20903977e38edee0904113f064916103486fbef401527ce015c5c837159184020f65ce40753be130104adf1fe8013b96b79ee82d5a7fcab5c7f2b05117bc9c0bd873b70749e5e3f8d1ca3feb0a3796f4e793fe77d886dc9854be287c7fb203c2f14368c901609f886ee6b39cc79c84b5ca490a5e0c17e2055d8a0dd8012908a46f417a55e1710e314056c9f70afe1386732ffc7a0e1dd4472d9263619008e1a293db7511b1b631d5290f83561bd1bc4821169f4d0dfe485ccb90a95aaaecd625b18651b74b9fb83071ebccfdc22a24f43c6781d26d90fe15a764b92c95d77834a776ce9273d01ed02a30d413b46cb521744a15583f0f32d8890b8f57e373364919a7991a4dfe90bccd2e8c0866cf6c1813305d19c03304b280afba03189c480f5c0bb2a15550e588226009d05c7d36bcafc0f370b225ff76fe357e2c4dca28245c05f160861cb81e4b261137679ad6135c383722a299fb2da97f070dda030abdac4b1b63934be10c761507606e9a094fd23a208b8a96edf78e000088b6bd24c7de2252d00e5589f80822d5a1fb8eadffc25889e36d9ce3fd8d4241a7bf23815e6ff222aa9b925a45ad751282c2d9e7bf6713514b804c7338eb0c5f9d81df2801cd04a263454d6a4778df299a31f80468539740008cb1a0d96584a2bdf1a2211afcac1485a1a0d23ad6baea00d6bd744472e588e3a52a5e6856e21e024323ca445e3227e89310bf91715a0da5db2ce1f089a02ef81e4052b8a0379d4c77d1d376186a872d2fa9d2bda80bc3c8ba90facbcbb111fa6b58d1047b8b7c056115040bc84b552abb447e2c571a34d87112aab6e346e9f07192711172a27ca4c1d705c0f80a01330e67e57e80471d67ce8154b4ffc09658e7e795662caa1135577e177da9b2dbca544cd01860c951d56b5e48e39456f5b257019280cc45bc0ac78a2c2bb8948e5fe0d1870349cb961fb580816cb7da3c395bb0d53d441d75284c15988299154285a235356f43df61ced1eeb065756043a323b37b618de2b35f0403ce55b3c54e02d6b7b759b4cac8e8f7346fa593d92633546813295e05f5fd0d812eb50ff883d83878774751ea797277b4fb6fc9d9f0e7c7fd06c825efeb60299cb6dd023a0c7870b939b44ac20bbfeb9542be4e92b45351a7bd4ce2f9d28003650cd1fd47a865c9bd864ccda46b09dc8adbdc12344895b76e195fe1d8e00a8d6495963a54d260a210afd515ed6ffa486dd0da27c2ffd343789053d49ed2872376e1005426bab791faad2806766f860719fc1e36f0cbdbd5a21033dd1ed305f6ae5cbdb9ac0a4b2f860b9132722988956d04015c31ed5862898f01668b4bd4a28b2960f7de170459837751f552f0686087c8ef53a911d99f174aa9a52b197623c72d6d195d429c8664e4b10b1316888c8f75a29d665f6d341c61e3847760bd7a95b0d1914472e9f58e2b2974c1c749c65df754f3466cedcdb2c029898d71debdf314ec859ba64ef533b506fe461dd8452d4c6f4da13eecce1e83de317c5b0d533704aa21ba2bb4049f010c106e9955d59d9b5764cf17e071f4244f12f1037be4e7010ef1e766db4defe097d85296697abb719b1df05d0e70dd88474ae39a31dca58c9d1f0ee5eecaf789f72ecf69a3d533d7b8cf12cb066b3db689182d443d7e99fa2a3104ec6c14532ae51f012dd39b232e3010d459d991ebeba209270ec25fb6376dcedcacf69eed92ec807460781e652a340aeab6547528fabea5bccf1765c7acbc6719e1ef2a2a1a0028514efde7820be05c74dcba572d96960faf3d3b922973f0c35bd178e6ab32c75e827efe7e65f3c35132d97a95edd73b92ab65b2e5b6dd85bfef055afbd3056622f9c55a117d67ab417de4aec85b92af4c25d8ff6c25e89e5af0a5d5c6c031f3058cf72589ace7036c7b3580543cef92696c752eba382fac8cc651d2293190283db4b2637009999c5c29f9535b12816567eea4dd89dc3ebecea76a22699bc26e0649fa8213310fbb989a209cc53941357309c57f8ae3a05d7d9ab611ac13cbaa2a1b2b3dd529a8707d3c6f3f6567adc81ec5cb24dafbe0de17faba61b7d8ff752c24e612c10c19f64af831e466a88ee814eb2d08cf50a1879ee998f9bba0934f5aa2f61a08f1216dd2d44dd1ee0c37d54bd7205a54ed2217f9bb250336e948006fd5f6c6c6a9e62688a50486263df310603b1892993249fc6d4b5ce9091df651150dc8b69bd98116e7f6f4964b5e0aa8d307366d905ed3efbd4602d86ec60a39a6b77cb8c550d6f525fe99454460bb4f989686167461158c222df2d9e6fe5f2dc90846c458e88096bc9f69f71fa5679689a95deab0a4883f4bf187d8371b23240e3c799295fd279112cafea79ba81b060b6cf9940553dcd58a057bedd0b1d0c901a4917d36e8137b1e54c32ee3ab26291b450cd806fc9781794a0b97295199fb3d37fd111e8f32d8d9ae73af12bc55f61de35f9eee2ee9b6915cb821229cde67f0657a9788fa00cf5639465ff785b203da9e9dd86eaab6c4e2618e932bb590f47032f9e5ede0794d68bbf1ab005e4d6cd110ef0fbc4894779690d739f66916ae4d8a6ec0e3ea835d856b8a57d6589a399328485dd27069910f2ae52450e92ccd456bac872bdba2cc581730e7e01208d3a3fc40dc794794149e4b963cd61c750b20e17acfbe65ca99b47f4bc740f31ca0117ba2e2d3d09081ca0db924f02f919afdd833a72c376e9dcf8d601014245368d95cb8636b6959d0049f9d9c27ced458688c867e790176ea6f82b66d0f9d80a1120e6af3c07206266df1f64b3fc4ad506e225c24ba9bc6609cb5db27757ddde746fd1f53dd7d69cda72bfe4de2d5a0d3bb4493721392522881189c354b26cdb06886e4fa0e4aba1b6ef2b62df0ccde6c9bf1810f3c5238f2030118c40e4c4754579761c581a9576c0f13cef49f6d1f62c468535c774a31685e3135eb645e73c8da8c9808f602878003df179637441292ad62e0b9c9e25730bb8b48965adeee77b1dfa30e4c606153710c77e4badcbc58b1c3f40776c4a681a550d5c6d14ef038440a57dd730714372bc68984b27f6b718cff1d246fa51020db63e367abbd6d62bfd9d30c6d032bbcad7c2c237af1302e9a802ee5c1c2d1bdddb73923ded9568f84efe541598877cf1f76838d98814a35c583d03f69b90cacd299ff8dc89585369cae2423aee2ff52ba39b81596f21c137e98614516fb87eb52a1a3a18054d8a4b84b075a9f7d2e0bffc705ebf8f13ec2fed5cabc364dd790af4cff7168a8f92db8cec4c2148d16d2456a6c3b3f5955f346576c3743e94a2f9b865465415a0faef1fa31037097dc6f67b9c98b90f5783be8cf58fdd5759ad8ee725f2fc623f6afc01ff37bc2476d56637a60378e9813ef1ffeefeaf1362020f4f44fd0e57ccd4012f4d2c8053ef3c544cc96a1be8592a3824e377232fcf9dded121542732128a521985f40b78d7dfff9d79838f5150e898f3e480964fde21376c4f9b6e3cc208bc0b7a1fb7af04c60463aa15195466683068a7b26a0548c022890c4baafe59589593ac2624cc4a27ca79147a624060b4853a46b275079354e54c1a9eb658179cf7f954bc01e6355eb5633c72a7d9e52e81605359a404979d56864583dd1ea655c9be1c40431ed96e20c53837e0379847ad1573354ade09310276738992ce3738c1bb165f5625aac808765a55567d96d43c30248abe2b76e079eb96aba4ee02131128de339c6723c2b4ee84a88626152f6470b215d9cfe885bfce71b5f0dcb37b71d1ee656d0de21adacd0b27fbeba0cb2f2f319c7a0ac973595810092f1869f1667121b91a9c51381d5da64fd135ab4477f365f32de9e9980570556b6d99fb5cbe93b48fe40b1b72443a1aa79cfcb3b0c62ed846b85a8d6f3e28f666a8d9df4267efe65ba59cf68b18f55ecec443d20540d1a987d5618ebf17901daf119ac08d6f064898cda592e367deef2ebf58a2392b528947cc55dc79dfbeced2ab0fee267c6a2d308ac91aab4bb7165c567e579dda5cb6bfae49640213051ed293e38063348042c035ec05cff8c5ce37ad2b47df611b34a3dac474a09dfbdd35341302acab377dd8abf3be36e1e82362842014f30b17d6c40f02a8a0494936e81ee747a0cfbb31e16331f833c4b462fa7bc4dc8972645b385f69dd68c216edffc328468728bccbbb808738c11cf84255acc80e2dd1d36d1a1d559bf2dd11859c416f52a7e34cebdff7fe9ce67fd545a4b04eb7c1e2e1c3924cb24cf431f8d73b2aa0d40b2b6823760612c7acf608870e345e0da39aa908f80b5e68dd8b8982353edfce210322aeaf6f0dc4b4c130cb95a2d99e8c320027e3e3f92bfcfd3c679a4cd2b87101d379c1d722927d4283fae594899bc55542626616d7c1578523cf596f14f0d9b7db8042684af1574da38286b26a0d52a1d88634e8c2daa1cdefd5ae607e6a67e353a9e9f7c4d7cd3e914b8382577f29ff33a2b54cc44c7bfa0deccf138119034f007e804186f9fe15c2a397660f4f9a04020f0da272b10588aec4cac736de37cc2c9c25672d12a205cc768c3d536005056424c7f8ec262df912331498397e4630a7950af885e16ba3b647f633260380bd237c0940f218dce24011cc42abd81225a0183a55e8d98a122f9f274a9a9a3a0616f3e97b12388a06dc5baefc8a50a8008ba0a63e14be11ffc8567f1066d6eae47693fe0072b25393a04de01fffe54a4a92a12e7e508de5e598b31a602ba9165e44603e24042bff93a1aa74d0f101aaa1461ed7e5058ca66f3bc9bc997180b0d14782f32f95ec2ade704326387c4b041ab71aa92ba3afc281cef5824eb2f0123ef188fa9d3d4e498dd9c6c3530201815665fe8006f9ec0f8a467399b787978625301cf5b8dd610072a150eef6443d1f49231308c3622aeae967ee2618094cbe0e9989f4e498f74a53920902fbf9f6ca26316790eb045f600229671db7875ea3a1e2a41390771aeaa722b3eac4dfb4e16d6d5294e5fb44ec046d2a7ce348c54f2c44a73238a959c3fa260ba8d8bfa7ff8032f8f47b6c40155c0902cfd68540dd0f5f0860263faf62d670868c34b0a466e05e71447252864341e9ce335f1760fbe4ca7985f102d8c692233aecc07dbe5ade9e410c79976c364e40298bf360ffbb86fd190dc12f324102238f14f3505374d84a6ed9eb64b9997e08a0e98ea9c7df36ee2492e1e355d2d9d072759757328f09867cb25c4087ba531928171baf96144a947d628c561f093025742f53a127819923e0ce7d895ddb34ff16f4f584c0f4832323376077669850f19c68b1d388c292787860c2c4c485ca092dea0c1bdd04caed4f216e699dfe53837fe20612673b4ea2ce96fe2aec33aa0bbb70055ad67b5bd35221fc0f745db87936eece731e22eef4aec050331f8fb70913e717668c6e3064178e76e6035c0b3c5e9da6c2ecde19b7269d4cc48027f5ca61d35d03d3162158039d2ea43102488bce22aec7cf19dc6c57df2b2abbaef913615be044966253ac3362c1980c3b98d98a1e2698a25f53a9f02ed1931544c78ac4d088cb5311b815e7c2cb526e352d498aad5e93d860a49dd7ed401bd56a4ff69e1b575c2ca7fdcd79f42075245c9898f0ef2829d8d155145b9d49e4c32df64d3e9ef95a00c485568f7a5563631862773953149b2c3eabb8f042aa0f0e5d5a8e4edb6676234f54cf836841baecfd1f4a46ddf5391bfaf1a1d43a918be151a3ef091d7eeb0f08bedf062379c02d0270285ab15a24abe42ccdee5ed1e74f511681824a9cba12f8717adfa2a68db072c06a5e5e1b05b6c783b0fbddc7cb4ec0ec9c7c353b7f560963cdec7804f5d8d374377f74372b76e95ca4b82c7570a760abd7880b4aa219dbc120811dee0d8a65f5fd04fb86c010ae9682906a0a8970d949ea6c0c35abc7f58a13a7c11ababcc4420b1f8066edd032799dc37b8d164c41f13d37a3f6c5bdb45b64a3d50850d1ad252ddfb61ca06e98ff4250561fb0c095f1567dd32ea62fea820bb77de8a453340a320c6298f75f98a91df9d8a946d90a1716b8a6abde65fa13e237ddf6fae2fec7f2166721ae732c5355a3d27f8c3bdef752ff771184fc2f212e3d500b13032a0f92dc1bed7ce9baa9a0e569301195bf621c907d65003f139b6a7f7b3b96e39beeae691140ee321f7957f67b7e5ee73f3f2fd379e192eefbfd5ea6f3c0939cbe874fb2fa0f4ed2dfefe7e5740f8ca43d9fafd7fedfcfebfde7c76bffe7f3f2fa0736c9f53ff8a4777e1faf3fbfafd75f8fd76b9fdfdb6bdfe7edb5efe7f3faffc1eb28ab1f8b5a8856d6a3027a9f83036a950a4694e6e7c2722af497c7a26ec0a00507072a8caad0c6e7e356873c55a568c1093a94930ed2606429264d1d5291c3634712c7830fd792db38f138a393220b98ee85732b4fb5c51be1272e21e313a251f2a3f0e834a0cd4a910605c9d7b868d544def685bb790117089effe834b51cd40c663664fe3df97eb09b3888fc12b38fe0fd1ef65886449eb5157a832f884663044f8fae85ead46622eb3e7265e45c589f7973f498049e69101ab55bc1906960c78f2ea03e4d129f24c96d9e42f424dedb5a00de2ede74e1c77d5bfb5e620c2bcf3de05dba5240efbb14b87e65e8793ab1c900a3fefd5c9346fde2c61d80c96276a40195aace604aa061bdae2ade015152cc4874244fc93d9b2f223059d60e78230cf01f661fb28986ffeab501a7a6991e2d2bd9cc2494cc5a6e1cdcc5a95827ef94d81acf4267707b4c74e99858dc917770fab6da6ce7cbcf13c637d86d2f18e65efbe088e81fce26b31090851bfbf2b9d22933d11978212d638570aa80cc983195e047fc17c0755ab8552bda897490e1f3197e754d501ede630b176bf1177eec40176b31c8b2bbb1f6c3c643482eb9c3dd17c68ec0b273a39e40c79a80b358ca211333bdd162119a231bf6b2ade3cd4906927e9d0ecdd80409fcdcb552c211c35ae882d550ea96f7d3a5289573d0806ee565f378d7affc2aad968f1743ac590cbc7d24c78abc7b3a3f511a9d51669e000d5689a5c4aef62a67c885be3f840d5fda85fc4a82118099e269c44440eb3f237ec5251889a4f0739f422d61c15871f1c5746b8c13d169c98a931057131dd3213c049630f109e800fe050410776bae6fec554a4e4ad9262099594cec5b50e48b4cbf09f92fedba93d390c2fa3021e872e54eab018da9bc2cb730733ff0691a5f726567635d85df7bf30a58fae597bf60e81b9ffa83e6d978d74b62403a79982d325fdc6db12d67a026988f1bdc2dcfcaf013b8fd384391877133d513e83132cde27ee3e1fb08b0e5239733d25c88e003b7d6236d744536db24ba87b3de94894b70199cef8e20bea01982cd21852aa89746be5a13118313c37bea0832f46309dda87da83412890084211ba0b0c0034a8a619e30e448ea0f300d8eab1489441984fb071d083db1bbd3f7a319c911d61308cc29859e4059b0571ce2fbde8c85ad371aa30b86203491d80c35ad72a69809dbfd74fed897a02a6922b1d2b368fc84188c4b30ae4d673d5cab3653fd2326a61630b836433bd83269127aa534ccc61e3c4db036c0c65731bc8e2ec230ce54753d2c23d0b1962229fdcc88909298dd1bd1eab894abc93234dd0336f3d292284dc9599ca1ae0cca7cfed3995aeb0b30ffe08e2f8c498bfa73caf9353be14a575707299f7ca3965d3180345d10608340285e88ce8152ca8dc1f627331f4f2d3decac6d338810191a2f91aabcca63a2eb457a8c4e34d12b267b853a4e146c5c651c9d8cc6f2f3b93e09dfefc06133e7dc5ceba10080682b3c08945f3eff49b7143c5c587b6219d0f2a8e09246ec01ceac147a5ee8417e24d2f350d85037be05f635c8caf476696282b1dbb3f718660999470e6486fbedd78a276890939f6c75bc679d64c815b3a4f8ce6c95ae1a94d741877b6cb6c33ee49d6a37b05a7b24f51ef86f6e285925fe6e64aecc2a5d04f06c0e49f16e94d62181a80edc72401901e144161b437c163c36d65699b1844db641d5f716d7356d9f02c90ac2b186adc8ddaf4d8544f2484c8af2254d3ee242db0deec9a6889ab6c9421c9c0e40d0a710da1d7d28083c82643b0facd4356e2322e71c1d5485d07263d31c33705a1453f54717a4154a39fe826cdfb96e124efecc678655d623b23eb53f2af6d41759efead8295cf9e5d5f666dee8ab320702edf7d44195f2288b3b652c7825d95859310ea5adb5f29845cf4ff2095525c2e38cbfdbd668082da620e872ea8fc61df2ee435769eb8a0646f069b975829d4d29b7e25bfe531ad43153c50e6bc18e0f28cdcec26c2deee247044cdaa1bbe23442ba7c3e41cbfb21409d95fda8bebf61cfdbfdfb36d7da9c3c90acfa49f70190c55727ed90f30ea127022290c6638dfb19d127ddec3b1541c228a48cd2463a3cd4fba8ea2c4279555f27f5506f0b62ba057acdf8adfa0a76d84e656d84a7a7be969fc0918816a09b087dd73747b673cc249e436d5db6b0664b66017a3b6f630dcdc5643b08c9a644d008fc4641348e769f01604781094637c64d064aa9ab0bedafd05a5d5b332588fe1c49a50bfc77753fe6fa4e039f3a891a92b5e75bf55098dfe6d707623c1984e291fb08631d3042aeb0a51f234ca62b3a405408df32ba118e0d36db6fac6c99e2684c51d553cf0a1ea71b50b3450b7d91f8da1ffcc15b74873cbeb9813942fb73c5cce62c7ce33771b3b2dd3378191c3100af1a1428a4064f20085137fc461351a6d3c96e3667a7b907f5300b7e9d876842a599f054ec3391983913f84b7a6d9b62724e1753dc036ca60700b93f7fc634c53d00dab13f550b99ed8208fdf71296844ba5059f40a58e6e0c9cf1b121a5c5238de481a4f9bbf1bb3095d343c77593797da55819be53dbcac020c433b6229a0175e171b2af3ca565c0fe364f4a9d277650045bc2997288b548ca8c763fe6c2fb49976b47cda7e558c0c622c6e9cb3708bff6bec6a143d9f3a97c6a3d6063212306415659e7716f3bc1caf40e4199430f7b0be452de4776ce94919197ae09ed069ae15f968e8fc4c1c28e1eda618cd355b2ee49d098986d4d2ff61cf077c52705c6353686a53330540608456b49dc2388abee37c138c2156a245de50bf419f41871e981118532947c06aa320fc2d569442bd48ba21f2014016105c587621a9cc5c3b9674b60d42115bc24eb79acef266b2cbc1a2ad701105b81f05e10e2af5059fea91d2e09cb6e9f95243310df2c8388536e727b0e651c663128b7f3fc0f03710acef226855ab23dd00b04e9796d6515e3f4bb149b0d34bc6375c12c0148ada451040378b3993bb23613f05e29c80c37e0b9e8127b96b0111a1dbc98abf5ecc3b0eb4e6c0b350b3900e44e910bba0df4274befffb0652ad15113a9da3b2d19f14bcb413d5d55364fcf84ded8049b1f24fc505e1a5d8da9f80d0fadd9dc1d83f0636006142308826e567cf54002ac3c2dbf7246e4ca4a49e79ccb1941a06e35b9b1367a56c419771f01c601e4cff2d7223dd8710467ee157ef534fc37ff5d3a80c97307e78fbb28d1b50a7628151a3a1cccd88bd1eb6f6eef90102e56a73fb52d022f7ce3a9b52179e4f5095e32775a5853e3b279c3af61f08fef5591b9bcef09cd39827a77053f2e7378912510e71eae81133bd94e3b51f0cfe1e08ef280afc1822269cac77dec64fd8ccf20f72bf5fe27d2a33b92debfcba032a159cc3a8f5a5da267848410173cfa0e302a07c93454987ac03f0e2a83652ddf1ae0eada09b581e482ba697f17acb5f4401cdd66348766f7ef3d220f60042d08060a98a82d98a07251ea94fe7c640c28e7c1543e7f3ed96cf4fc62c7ae81722bb3872ebb6c1503048521c14eb147d4ef2b26734f541a9da12e2a807149a0be02ea240e95e7038a9348d205d9e0d38926b469d95079fab8ceed8c2512d8740887744a878ccc739330b290bda3062db05b2121401ef98f6fc5a1086094abe818d14fe5b032243a465c6d92a3585a4a66daac1c3d3ee818d76a53febffdc771eb34730ebd8502fc998fd83ba5c59b97d30301d6edb9b62d0cea6d22dad94ca74ec66693b9fe03c9053c9cde179e62cf948aeb47bd195314f68e205ae2368ad3cf69256ea265794dd58d70e82cf8b50379199f9ab95d9b9218c303a3f698af690586db74638723a45623709746ea9da34359f0c60b5a0459703b210b8e1843164c6a85e0c8161784224d9dbaeb19e7e61a6d90a23e172069b0658e596392afa08df7b6f402238e187be92824aaf0c42603ca5919acb1a033bb01c1dbaf01ae5007eb567591cf1a7f753858ad58d734c73055956269d060944f93f95f4e64f248447909e3374664f8e55786f9219476109d2ab2b6ecb0d20684a6fe9c1d9f46c6962ef6b5ae6a3d781708aac1eab5060fe2d693ed60ca4a129660f0a0633f0a733c979c09c33ef17327b8239aee61c5aee56b3502718837e251b37c5441da82cdb3ea6b33fec111d0eab4a428a3f4ab4022e0fa3f91aeaadeaf7d84469f697faa2dd462f6c439cdf7d8abe1ad84f721128aeed8e31f2f639414ac0957a226580827e6c694161966da7945a0754df24b6682865b8ceade89a1c97465f6a2ec646b999c3edc583778c7dabd570466836d66a08e11d745b7ec55b4cd81927235fab546d1a9a2768b9aef23ab265841d9ee445b75e5f488a14c29f7beb7e096ad4e9407160cc6abcf648df5bbe984fddf40a7184da9adc8c49a5deafde159eaf364dde5440f6861c3c10b74370aa3d5dd1df4ca434aa441f9df954ce38a4b6f4c45f41b9aa68542d3ecd52ba5a19a235a69ac57cf97c31ddd8e0623f4aeaf983ab4d22a63c2194685ba2d304c19437face011880225f056f73d4df53761b61a251968ad745db3e5063ff9fd5ec11b76102ea897eb2d2578d9b3c36697d9fa3e7effc803a7eb6113cbb32a852eaf86b98d8b7b88ae2e796eafb89c6b040bd191a9291e82456e1b3e60624016fba01780f00306e05ebb9aece6012320bc0c431a7de63046fed16cf5ab7cf1d2cafef9c66a2de59e2ada32b62e60e4230e4efc496764a25f2cb1a20f58cfcbbce388c6c585583aff8a06a22354b0f4dc048577870c81e34f57778a2c8a98f6fb21dda5ac9c8f90eedcfa2711c42b6b465a207abc6a9b61755b58f2c58d8ac3944ee1110de3e6f057659bad03b6e40c2f107d6487dad3827eb2a0d25b735055bd0a2d96a204d5b5e8814a87e309aa0ed0265fa222b7682973f55f1654779a02581c7c2d67b950e144a3392cea3a7cfe15131925de6f22c1010af7d0e9f0ab0595d617d7eb53dd686dc240bf2d88dd0f71c0bef39879b70205a78867fb85a6c8e1b0af4299ae7e55af39f76427d88c7c8502186a25025e4a0a7ecd21b83a719263895686e91dc0f780f6e89943351a03ac836d284d8e3af218ce271c460911c3d9db529e5349f4cff6c8da84d249e749e4b314d5898a62c14a5445965eba4b4140f686aa8d76d25f2e0f75c08ba8f152b7c1395f5e142ac83de5804e5d9855abb8d36825b62af28bca1ac6783cda538056d08c8f9693d2a193432418e426c55c27422920073a72b7ad0234d02f88e3f413bba4b162a9f07427756144690c1a701cd8fd053aa807d666b920817b5d3b08f297d31fce7e0c0f75424916d1ad1f335398528897a911bf27337de92139db5710e7597e75515974948d0d37250394f6fb590379030fd6ebc412358e40588aa7909baf5c6280833313930068bd1875230ef970df0c812d54626b1f058bc5a2fb98fd9efc368c6107c2b7b2b198b797ceb28cdf3bea32d201cd256e25554a7814d8b7dfa43ee2c705625580ba37d79cfc82c8702b6da938f785fb88fcc3347fd7bd9a1919a8813b40fc1bde12c1c0bd215fee42be42010359682054f620de6a8b3b58876d626f4f1b64778f308cedd15b2b16db4aeb4b256820f94bf7442c6a65fca22e18d431d2b949d829260709a133ee19eaf9dd152a465335622e66881b437de5c86e24a3b037c0d938b8de9e2860554bf2e298b64048e838ed56346dd956993f303c16eaa07cae9aa6fb52742ddbff8b0aa7b8324d5db982d24785c7691119d95b179476b64995bae3a762087483c282a5eb2e42ec847a102622aaa1619b8ec898309b73f23ef031e56c7b26560962311432cd0f8a9f4d14ba91b2ea7ebef037270d7de03fc3733c77fb7f392eb4a58c48c0c08cb6e78bcaac8cb9ca1aa381fbf6bced928fba75a73ec8a1ea2bb6be302595637a4b4ddd54588ea68adbff9b3a1ded82937f52757dd5feb169259f3b083c9ad5a9de7873d9926a4d6633b7c6bfa1240418f791a0ec3b3ef7a5cc325c2e4b76f707ad30c8071f31d63f8115c3560d32ef00d13bcae9d1009f9f74293dafa6f8947cff672aac3fefcbe798f4c77da2eaec746095e8a8bffeab07da38a3bc85428cc16c1af02778d7d6570b289b6146f6862c11e92296a2ac15ed710194fed28404d6f258d8db63700b69756677980e9d01a537855af3192ce50e7f06e1ff5fabdcecf241bbdf3d40959262412a7a32523c10e21fca4e690c5c45db523c36148da3c68ba2944fd6903da706baa9758ab2770fbf6c4ed6ae3075a60140f4c2da6295517204c041e1a0c7abab4e53b78278489946ee4153e7e822b3acc76f74fcb05320d28b82b690e36c523df2c5386cca2e00ad0401b0614218dd1e097e234a6e2d04463036322096ccd83c4708372639fbaeb1519a031e0173dc649aaac36794d94ddaa3a1ebf781c605734240293e4339e92362b69c4f0b0ebecc74275f9b328943a51f514bfc46a0a3b9f69347c02724ae3b95ddb2d8e5c9e8f00985248b9744356e7da97a8c6a6654f5d1c7a39a29f461ffa9732c8d008dd3615d0db952a08e739b374a296d5d3f3e7be7b014761f4d4d7f7d831fd8a8f8a6d24a5c727997ea68dd4decf866ba17a7b7caa3669c82e25de044c1d51de1d9b039e5edaf51a9e8bb2af60049c84ae5246772f78f909f3d4a72cee3c0b504d1af4129b0ede86211179d781a022d0be6cece1514c7711671e6de70199fd909f915a7152657aa240007539a24ec62d67dee5986492203999a4393224301378f380b1de0b96cd7997bd9bc4679620c346384d425a57989639c1390428fa5a93e1e4b3218b2a5aac484089bfc666105a7869a1ffd5bb93b66371a77664c616c60e3315cec26456a0618f5e0a82527e271b0beb17f4c39b020ccd3f5763514e624059cf028d8b7f8d6a9af6761c6256d5be2badb5a3f5940db2ee9301749eb6b6e07f9add25bbef94a3d6a225eaabbd0b055ac257627187a804a15baecbd80b81c2a83478aad42133915a8be223944bab7cb4a0dc11fa084d82258b9aea1cb0684d1b2dfa01857a86762d769ae3ff067e8bc13dc3d1df1d602d1d945c08ec88a68a8a9f7bc1d9d664584e3372365066ca0f4fd9584a9479f0b9e4e92ac91d0a97a616656f270016a8d38574945fc5bbadf29d935b35bc7af77380b72eb93383db4f4896b92dced270f03c3b6a1af892ddedf937371a599a08cba8720971292c15186195d526917d0926b56e6afca0314517f868f007f2c9ad91dd4584585e25e7fcd38221b63822e3f8e372a277f6569ff671a20dd937b7f0729d6f04c8dbdb7d5b2049cc3a632c20faac81a7c0a25525de5086afce4adf39f37307312fffb6c1e1a356dc4b814e3ea20a63865fe18d0e9b980f4b1f4986551a456ef07d281c416a18299695bb6a41b949272c5a3125b2cebc3700d0fac5d0d0471dba76207e9e3e1429e70e249b09c2815a458300267d7c75d938847d9bf7953d6b63e1e11781a130b0e469f374ea97225452496ee8f54ad08083484ad8053408a061cc54ca67c63055bb339c28097d1c635ad35c327cf2c4ab1e00fca1fe2ad9f996ba3c864c13c08026701a4fe42a9357e3bce48d7a61cfdcad90f3742c84db18d12427482542548b11f7620c0f5f18445d0a3592a7b2fda13f3ccd1ac23e2f623661b17a25adfd32263ec5beb9b6e793b210b00ea468f9db1a7317ce48c9455f09bd954552f78cc4dba4b0278139b8e067f1f9cbdb773fbc80a064b15cb00d139ec28dd753e8003c04bab90acbe10588fced5d83d5b1b6a5718d34af3b4c76d94a6bbca78dd354cb88632f6765cd0096f104bd7ca1b31ca7227daf6da356284bbe8f2c37bca902d2e98e68b9980800a63fbac06dc1f3f289dd9fff513f4132af68bc47ca6eced0b544f768868947fa91b2ff46e0ae1f834fc1a0325ae88f2275dac06488e4406f31943c7f24b313d746ead6ccfcf701c0769a329251a99c849188b35384b7f7c97fe9ad99182bbbf8627e718ccf6fca2370868ecb04465d34367518f6c4a490321da677ef7d7587189fdc6260bb06439a4c534504c4ac61af4719d10f241da9665a7a9d09cafef4cd39c92ca0f8c966a396b6c4448d9a9967acb61d17054e78963b0d4adc95adca2e04de3b6db2e51b383455449d6796135f9da3daedacb0f0812a749c97f7e7c7eeb2e14d860950d84bec462f7dca469bd36fcc5eb2febe294311852bd57a55d1a6f6967439c00b35a629eb86cb4f09aa826d8e9531107f6bf1da58fa8c49eaafb548214d672c544775ece8bbad5c4a59e8ad3f2de39019f181dfccfb5502fbc8f5b9d92f68b855da598dc61346456a897e7856156995a559431fce1c10a0a106f4b84b8d636f181c6e4f6e87973892f7a49a855bf2c96bb92bac831d86655329b86dc1db2595da981e64e59ecadb8e73a0da066453800ed1a1f28b6682f670e7efe1d90cbaebf13b3f758695f940fb95743bb2a9d8645c9531cbb7840f0a3842bbd7ebecf474c902e803b989ec9fedee8711624477d502c9de4c2e651485cfdd01f75df7f8d302cdde937eeea3d6afe1b263a57399320f45bd837498c25c8e277072be4ee23986604c28720afff0e1861d16854a7158038cbc4a5906b79ec308acb950e2201ea9263c833076dc33a8350318dec5d4196c2ac1ad40ea01417e39b509ca04829615d97154b24e43b4721952d7846221205601f3127e44bec1e89c292f4062bb36f02aa2fde0b173270799968c99dc3d991b73a23627782a9716f5d4d59177e23387f85f2a5634d180f8c2d0a968b711df2fd7bd4f96669f9ea13c385ad7c985758a5e5abc8a2ea355fde436da083a190ce95ac1c56c6102617aa339e1058d3fef4a3e29af662556b564af0a8b4ed855cd1e2d7bbf2f7531fefb2c46f42a5309cddeeee10ded1aab3820b276406007e48b4bb13217aa484c12ffc123ad6abc090866998ff760868f8db0229904aa5616ab22c8491787b41a6022d7446169e7d0bd97bff3ee4bc9c83a5e59da6fd2451382564d1ebcd501e1ce2737ea34572be3f30fcaa8fc1574725e5d1ba561c0abd82be21d38744c89f36cfa8a7c033f23fc15300f717074f7da5ad09f5e0023ddddea25bac25af0716db5d6c97bc3b0b16ccb3c841a9f8190c1c9dc36bb45e1f2e22f8e09779bd9570f37d4e1336287f9de2f6cf64994bfdf605d3026e450db153f45d583e17eb93d3d6ecb546494bf04a48513f1d1c5715d7fcfdda6e5ce8b652603c1ff1d6928f8ca69fcedc2dbca1e2c524a90cd33866805fa6499b70930e81d004c33d599fa7c6553ff135b73bfbfc20c84c5e9e527f1f18bfc9565efb6ff34e86ad96decafdea0f86c830c0ea663a5e51f671a27c2aa1082531f8c9501a4f2d769f480f9d5b4df667f54026fef7fa4c3c0784c031d15aaa63eb9d4cd3c212c6a12e1ebadceef8dd92a4d856c34ee30fce68ba7ef0f2a15e94873635c3604d5b085b3f98c86bab8890f4f365f326e066008127c7d04f4ff3201541dbf08be5fa2b2b67af4297eec8e72814470568021152253f7504d3d6ca639b6db18430801238e5bf160200a9e655b16a7de71dfb20ce8f13b9bcaad183ed3c59029992750527e78cc71e5e50d437240a75e1b2b973997a65766dcd29301a7723a1ee55dd119d723470c551f9e064dc7413fde0ee40bcdfdcf433dceabe7b7051fe7bbc669ca0e24e03c02b51742ca3ef484625a72ffcb34b94e15e233eb0fd95c9210350d2a3565a7ab461b9e702c7264167a57c38f03213d1f76a9d1af118367be86c85ba50bd2815fc2421c26cb41f2b8c2ef5ea3075c9a0b147c492d2e150139f460d7e3bb43aebf08341c8ecacfbbafed16c5e6fa561a8ef732f0cd3ea01da0f537a1e8dca5d82abe376d64d831f01108fe9324636cf0d2412b1007d2210098da7520a47e8115b5adeb671f945e69ec2b879e87e662d8ad1826cd0142dafa56b86cbb6f2f5506050b26007ba6e130703c7e6e0f49139ab91f3fad2439ffc43337975c5f9da1d4832a1543dceedbd81cc08d2a2138ef940e25bc7449214cbb1bdcc6b3a5d47471f2030943c4566ae8346f6126f01a8ba76514d13c34431d0967cd04be447be1e6873f39aaae751a084e8614b002593bc0dc85926e4c1b4fbe33b5c97ff37aabd3b2a0a5eb5858d142f7fc669059b0199fea1ffffceb8d2a220642d343c3437ee31eb8a1a7248fda7bb384dcb20292b993ddec96fc505677d431bac95b5324337222d5f6d50ce1e028de69831b28a6a883fe471a66b993db1f84f1a71c9b9bf09f519c40564047dfc62f611b606fff97cc06616d3cd31de9f87ba012d5282ed3589e724fd0edae098ce466d02f99483a91c8bd03783f7dcedda6d7bff82a42577efda5b84d48345e1f31c1b8e83798551a8d2c1a6e838be13578f64aae9ebfbc37de04c7bc1e09003f7ba612e76eab59975c42fd4aec4f5d02df2f627261e1fe9a655bc34f8e9652c3fe30c755138ff948fd1df01bf42b841272e2f8bf278ab2c603bb20cb2728af4861d703c84ad7e4413417cad212b72eb7602982edf2a64c7148326699e680c08a3ce35beb0ea0773ff301ed65a4cf519bd63798e7704c5d7c5bdffd09149cecf8dc9b6b4aa33a71d52452de42ab50e7e2c35d9a887328a685b702b19794f4810654fa2a58c712979da7aeddb4b64cf3865c1f18a19274dc058ce1a44e7c2687b96a2fc7a7625a7f326f990126aea1015e2241537e12094de971255e23a82c7d45c337e44985a58888e33b9697b16ed48032b73a54c504919cc99083f7ba8dd93e8390d4f46910b746c78b258c3e8a2dad175a2b48185e00e072527e251f4cf4493b7430147a2226cbfc81f4f58b5da84513ebc5433e72752361ca752af19356d19ea4877240854866683862795b0d207a66e341e148ba1fb46040e5029a89dd3278d5af3154308036ce73dcce2875467e189c7aef210ccd383c5f1fa7bcb00c530ab8f9f415147c386c392c6f932a09508077549835b275b9b67a1ce178ed04f52332730e206a202b22b912088985b67c5c37b81c778beed8fe709cf3d3c2131add6c7b65758a63f6e1fff88345bb5f9cff43086d82e78e683e08aaee8935f24f212f9cef2991e2ae88142263d2a84144a1916729c061918324cfe1af791a2be8f214bfba433a46dbc00f29e2b1248e4f4985209092a526194379a00f27d564ae4b48ca212be286d02f14e9a9215e71c9fd168ca25b9323e7e3d2cc8634601ba30e8654d497013904b02b424722afdc8296a448646a3f4ba2f51669a45542cbf5791c92f92ce272685c8276d20a65c7e4356dd398e7e59ce2e0be4265ff8d70af984680c24da7d2e8d3835a05db34eb462523457286e9a00d07aec91124a6663ac43442842eb9dc0deec67b6848b9f8a142093241a591e8745bd2bedffce16507839da2466b049fe249db96ea71a6f295a9d2b8f18648a4f0c83049ee97a752f440f9e70b423341864a5bf685b4db8a8146467dc2e8c14b5af5d31b943e11829929676dd63de79f6e65296c0273df73d1bee11807f6e24cc1469a863b9d6cccc3a7b379b28ae00d810abbef7ce3963be5fb73ad983d074fb6671cd5eae2ba150ae4cf9f4f07867a942ca720e8ed38e7aecaca8012c307b4354f589091605f6410951581d6191f8c10831f22cc879b7045a32070404398b05aceaed504bd04185ce140a2cc4b6d817eb118cf68c6832c35c3d9a2d13e75dd5c38ee1c8e087e849b98d0b70d90443ccf7229798ebbead0011dbdc22645e074be5f10a909d1336a20ed998ce7c311d7ae3b6cd1039f5623b6eeb3199b086e2c2f988e136291c1a1cb2e8b2c4c6e9dbe1ddb04b5e52b12840eadeba5b5415612538a01415d562f51b83c193cc09422d363702dd9732b3538a1438c39d85c4b558eeb44bcd06535962870976ed7ecd0155cae4af777fa2e8eac3289a388dc14ea6d901211aa37b01187f6cae4195aa39020109c83d8fdfd76529774688746b4d0789b16d2ffa6e3f372c397113ee471e758734577985f99966da0946f007d2b9aa93f88ae6be158459cf2fcde0133cf17313935b532eeee3d79a711398b40b616c3a9a40f741e1107716a032243bcdcfeedd49f6b277ee715f739c218d7127e1dfe88940a113395804b3f5c7ebc66bce9b949adb391c644d00e0de3edff29b81fdd044a6ec12771f2bd9f18612c0f1f7448ebf58319abb42b5849114d0764eae4edd6206bb3fbe96c790258e4c290eb4b21a6c104d25716fc2c92a8f50e06e07254aed18654b05f6f7a9e40cae9e8b2f087f2c3e646e2335559fc304b776997357034c57d3fd47f4516e063ad7c391b0bdb22326644cadefe2d32bfd20e4ac6e082743a73ab3475715e3316de1e8f40800e8f4c37d114eabf7d7e42c78ab5c3996817024100a624a0bd8417dd046a9ecf89b0ae45e236582b96fb81981a3eeabf40c947e6beb333ac86e40a65edb4f827f5153174035f2a0393af611cce9bf62d1353e1e6f5b00352fd1401c781b9ae2696888c55fd95d29717c5058484e9943889f019f8cb77e89d182d8bc227837113930870817035f69e995e56a32918287b85a1387292fa7ee451e4bf82647d4cd631bc50e17d6763f8d6339f0434228dae19c8f01445c7487a4ae9c3c64b861997f3cf8a274c43d780b1ca832be48d545a6e7c0ccec9ebd77319d3a8f202fa33e2cb74dc4ae1df8070f24f326881a13457dea5946068496e9139418affb1153dade7706c207051a92a18eab8554ad6cbcc6412711f700859ad56b332773f08a36d54b0046a22fcfa79c0d683288018a2e6dc6988b577568e2f3504e41eaef795bd6a61b2ad0b68d08572d9d8abdf2cb7abef58f4d4cd5439905a8696a44019a8fc1a704b6bca0256f4f14d0c6bf74c2cd521c867702aa5a453dd0b7a50a7ce3fad59ab34fe65c86f8e8d1da909e4a0f47ee534857e447e3316ad78a510781f4ef86c7901df9341dbcb2a83e8264e456dbd4b8d5e1bfce31122a1499e813df9e50980b9596b99215dcc5dadac39c50679f98b4fde048161d1fe4b720ce9cdd03f13c710af19a5a9e0404f3e8186389487fd57f6b941981a37907917f89e6aae6955e439b810d17f11edecfa49d2e30ad23bf071b3b05b2b8519fb20dca4e7ad1a0fb3114a14e9b19bda31584f563f2cd4be9c5dfca6943a040908fddcba8320f174b0db4794306b8d9960225c85b7bb0373cafcb01af62b5fe83737e242726ac7dfdc1cec67fa410607a92ab29438823852eb339760b14e9e041ced71d2c668c90d080271a0ae544033f6baa20ce0df3e4feb3b9a4346589f098cc095c229d381d4e7e3497753f75d201d8c92877eaaf5815629d8640139b427b9932acd8b7ece7711a91f113992f314c65c0c59976abd5eb61b318e44063290728d6859aa0cd59b4a50e9d072dd47c9cb1e9a3b4f320b4d4f0f542933304578540468450851a84e81d59a77270fdae1cf268d1419c1f33001db2805e3bd20b68e0223488e17e77c2bd06d91f69edba284704040fefbe617c81624d10d5587e392dd03ae993a8052cdae67a65ce72e681b48d34f90ab039e24a95fe1676e89c2fe4aee9af0700ceca4425ed6784f69dccf914b5f70ba4221103f7e85ec9ed986c5874403939e61bce1a28bbfb9ae532283e9d9273722e645dcc951aaf69ce288dbcd4dde856459e0349188a50a088cf81babbc23e2b5019cbe5d4dc9579e37edece88532ee007a8a049b4a2b448d3001821ec3b21f840ab8f5cf07acdec02c18b6288deb65e0d2ea90a3a876430249e089075ad6c38b1a749a2acca92a5fb51e74c83e3dadd3ec0af27a977e8ee0eea13accf4ac43161dfc8dd6c40c40045b280029da4a1617ef213411a85d8352b2ec6363f3ad62c2347c50ebe1ca2b28f38a1a33e668886586d4117ebd9854b3c2d359a37162602cc8482a55582b63d7f3192051cc5a7055f407e14c021b2d904882e4650927be8f5fa75bcbcbdffd51695ea2529ad7984bf13c83b0a2cb5e48bb73fd7f216a6448cf93ee617148a83eb0329fc93ecddc68f116dbc155fab2e6dadd60891882d9ed5b2bbfb08b8d1adb7892f15f5df96d530d7302709707601153c7290091585efb88daac46c1c197accc3052d0d4302f80a21fb9df41549ed4167969976118abb5cdcf92c31f98bf1e861e450cd95ed6a474950eb36703184e0d11708d674a1639f01abdc47ed0c18c8c1ee6cf560b4d3f7881711faa4c738e52f84a88e0ca75be27a472c05a9528991520b2be8acc20ea11d059439094aa8429812279ac85184206201f1e6cc8c13988ae32eb5fb00dc18b2474be4c400dc9ac08fd825f360972048f20d1005c5b271bfbb41f1a831935c2b8824e3afbd30307c41717d7cbdf152f55cff91de4a2c0ecc384acef319d233251b1d05062cbee5669162dff6029da5a5bfa4825d09014660d76f5cbd93ae4dc434b4b510d1cd3f5eea10afd44e7e6d6b755c2adbae5fd4f0746e01663cac4a5bec1aabda425c92b44342d2f7760e70b29ae89d907a08e56cc3f1a67c2a74d997aed49ea1655cb51cd419bf179a051a36cddcd93b2f4f9f9cc930a21ade77e5c60c87595ab0c2a0414ea51b54e2d7db355aa96dfdcf40d7b5ea51f84f3c2fd49845e43b5e3652620441c51551f41c4b398a6bebe1a60e0f15d960e82c57a8737c23e888dd9bfc6e3df4d2bec9d1d7c63f63b184a75c74090a8a96170f858072e83fababb76a6761f0a7ac074e00ed229cd502ae6284651056031b25516da322d1ecd10ebaa91dc32509f2e5a51b1a9af31d95aec468f5565df2fbf2b1aeff73fec0551031df9f7d0c960000ac2ff8be1a98b0744fc6a1d7003291503e4bb7c5b779d1178cfc6c626f68c05418aabb5ec0594a11aa2702af25708c480709c86d7cd49d936166c13f44daf4ed9649340fea408ef67360b0f5aa0dc47252cbaf7580f14a2e200870590c199a1dbf4853adaab2baf6fe868f509908b1e1762a51d0baf2d557b7c9bceb2208dd38bbb79e7f37d79fb80fd31bc28acc41747643eb1019b6a86db711d68d3c8910c88d61a5795589ffb5ede210796a91c7e0f80809e2de2918a2edeeb92676c97eeca00c8b92745b05505cb6ed00a48ca3b8e956759820a0652f995763f711d645e1e1bd2bf1a0cb9b74c7d7dadcc1b52dccfe5f4f9827f8a6fd6f20d560c5315bfefe9b8e85a4e55607bf1a3a1a2e030d64a0676200e83167469aa41cc4fb9761d5d193d917d42a1d8b887d70ec223797ab5ebf075b41b7f2e064d60537aa912ca9ea08f7155f0215a39a1f5c42abc98e1a9307ca0267cfb3e7121885ad3a116bae41f265ce56114ad48c37c50c5c3db9cfe16168badafb5066353a7de3139ca71e29a853a52e844c9adb101cf5ebf3b3bdaff228bc295b7c3e3c53331177ee05e9a227841c53c3c0c8dcbcded8ee4e49a49f57ba06c5a40ee8db07b02914b2326833344fcf788afed50cbc1a067f1e01c1828f7e84dce2c9391dcd21d40e1d217d4c2f63bb22bb3a84127ed111a0a0ba69de3aa7e1d991229fbe54a563e7c11ca6409d1b66a28ccb1c2df9aa442cb7b0586eee4f988022d1c707899c803708d2e887091994783c3a83c44f1c753e2c572ed5c67634ee0fba08a89e2dd04bb9a90e1b91320d629db74deaae8606748c972e0801913dd48e07f0f1b394f28f85761a4e5b019405b60658d311eced2c3e88134d05149c080210b60b57b072d171a4504231845d5c0e1b8285082c380f3fad55d90a356c05fa810f32704483aa2d243534cd60db96d874f285f2e22c3bb97519a351e4554dafa4794bb10ecf26416a136b56d5708de555b8a986077d2cb5bbbbbcdc1b8c5722480dac25942f1176469992f5fde41b9b1044e956912c750a94c7c38121c56e0be7ac2862834ea0228166f740cc475f6feb829aabe2c5d60c0d1c25f44ceb062d66198696976419d6ef25d87e57e779b0c1e4aa502a80ce08d8e7674e24133dfc0e32ecc3f366c138ac248b0d1d5776be9dc79df14b4bb83bd05630bfb628466e083aa07277f414a0388ef69950b65f805815ce870bfc8de5a06463957aff703f0c6e2c5615072832c8d4a5b609bfdfc852fe814b1af370377220092063501507e892d9a7dd6fcbb03a7e23b662fdc4408b5c2659a43bea1d033612a8d6a141cf812d5a80118a253c1da6b72c0408c68f160213bc350aa8c523f810249760790a2e9de878101826ae7e5595ebd60a7442b2387fc9a3fafd4b177f6c8e471c5be61d666c37038255297890dd60786bd24f2f3e786ba6390a677ca547d041252c6aa11df9e75f375af9167da046afe10b44982b4fb642e6a5ccd99a25c1541677800458901c9c2d621d4ffd1fd6bc8bf6044840f302c7ced927f21756eb350a34b90a00d2cbd1138df9a0adac2e8ccbca801df91b6685ccf731fc3320ef7b77aa092655adf3bdebca4a83f610cd78c6079aacfbc47879b206e9bbd1a76078c8e38d24386dcf77143f321d807e537a712438f852976669294d694349b4a81d83b110d6e476b73eab42bfccea124e8332da642abc5acce856cceeb70265a657e81091efa1a82e87f3edba8155c769e9f58f370f07c32bd1d0642ce5c04c3175ec168a5a078a733ad383d648e498d1e537a3446307571b0e823ba6685f5cfe6403bd7eb72a8f552a1c1954e7e3b539d48dc70a7634a2c7f6d6a9dde4786e954b667cb4b3b1b54e612c9f814ec8f92f22003f04578e4cf1eed76b95f7963359209665714275307fbdd8ea9facec4879c94409d6c3fc43eccadaa64ed709c1e97c86eb4881ab50ea1d407ceede52b100391634e8b470e79af22aa373f934fe8ada880cf262599619cb42ca9ffefe2c4ed0c5a253acead6ff67bbee144a2e73bac948dc44dcc717db43a59c8c0e353a8fe030fd95d8f4a8168743ac1c5fef00173956b0d740245e8fffd3bf54e441bf077ace12e58015d0215f65bdf8a7ad52789bf7340e8d4afb9a77967a98879f5eaba5c7341e5efa16d398402d793d6eac10c7ba23d753dde9205c50ea5d4054c8de15d0cfa6116c62472b2f7043fd25bf4156e57b9ec83461d9ec626dc3932743164ee5555a036e611a2b299ed3748c664e468ed79389a90547902e3fa74c122b6594494c8afbd33df14833e5de8d6583590a59c1dbf1c3de4b94e527a3a51ca3d09e36a245f381b267445700470db34daeff6731380d40febacb127197ef24003207002363fa5f2f01d2f3b1eb486bc457845cba9158bcd6458f2957392e13f026b9856746f6de79838281c5a517eb0dea0d1a3d5a403e244b2ae1379c3b105be69d266302557c8253c2974bbfe5460d41ca339a9d3f18f6cbf191ffd22f7b1c75559d5fee7f270a7cc5b9c4f6a2f5f9083924bf7ad168b6bd32bd4c14aaea1e1ee7547d957728890ca3797f8a5f7e5a2ef0cbdc551f6645cb464fd1937b79c3d9fa643df8e5f03f600cf4a144a4c5fe1f4ed7524916f1fa8244b7bf4ad677d4839ce000d77188c2fbf414d055e725b431560d911daa2f4c074e433bc2acc4a9c7ae7517944e0e7bc6842fcabe7ac08549d0517ab4c4a1063010dba5cb2724636808c629eaccd1d1f5a5b0840254e426709d3e028d44b9091c8c638e55e9d818f0f81bacd76baf6e0abd6cb07db6ee048d3c692b5e73a89a770d850cbf344228fafbdb98f8b04cece277db206b29e99782c34a8acc99a1e20c8e7f266f6be81866796885762e77c5b1f6b95338ed095b82073c76e40b197e7ac02f954d370cebff4143083424d4caecb6ad40887986b133f3cfb2cc0a313532c44f05948f37665388f08f4beea5ec0b8434a2bec553b5fe3fa4050d07770b5af2383afd97d0f9a32d1935f19f5cf46e2acbaa896ede21a4b71b4b08f2c5c7a321790e43fa9f682beea0fb6342c0e8eda9754fc65124fbda8c9a8456396e941993cd4f839434a12086dad93c5235889d0d1234ba6d05017cb3307163a12b185a2859abfce18779a8bb940834e7adc4f56aa4cc0d514b4c31aed5c272bd68789bf62ea315640c578b7db6dc795e986ccad672cb26df4ca7200634fe6b6a29fdfb87ed512e2e24ed41b60de416c0e22325a6e554cc2fc8919bac0b04c008557212b082ca4e14fb4d5a4d7a8f6a8074d6b1f1071d553872ae6b459edb30e41109be186f9b26fed144bdb3b949f51599e1c76aa706a273bd5424316b41c777da768a40ab924692431dc398aa16317110cd332bf1b7a7b0160062b9bf390d0a83cda5e081547c3687ea90fcb1122f1ec5cd40682ce8a0b9a67bcfe41299d66cf0298928be2e09fe6becd4c28ef688326dd982264a75cc08cfb1e5ffd7a51ddc47b6390e6827c003b5ed12e43e683580b1f28ae86b55641c706aa77bf11a59865d6edb87d33fe226e03230cfc78188294203783ddbeb9db165e82042f4790b56844e674b046d557331514030175799c9b3412075052bb3123c964c2dfcd884f7bf0b83512f0a65ed7eadab8dda951475bc4ec9f754534dfe1cf7591563daa6bb11cde86d13a8e39c4407cce5bf6ca75eccc814cd6476a619b29d5c838cab2bd2ebdce53ae912e9582f029899be4ca855f486f9fcf52521b13072adc2a38a39aee14162c9830189197027b8c0ab49baff2ae0513e81deeb1859c89cd7b545f7a234e6168f467d8f748bcc40ec465a15773dcc3502540d225a2e11afa3c8bf3e11748e910c7451acaa1df33270cf0557cb67241099b210bd8e929c2fb98f58949409bd8e6a4e5b70de5f59751c72c0930dd808d9a4e141d12dfe4c153d063d9add62a69c0542d70cf856ac2804a66abf69ad0546a047d9f5d119876e0b56f6e781e64b523da7eb54d2f64c03edb82982b3edd4119bab2ec6612e8046b66d6d0890a096589a5c3ac7cc74eaa2d6fa45d08db5ed63bf1f5e1e71209d9194a1596ca688db67253bc6d1d8a1d100e1d35d0ea402734c554a8e0932fc8829b79689b51897a46924e66f0281951fc959a0bbde0a18910a2c11b220d57233bc2b9e2c88abe724d7a4003848103ff96f32900e72962f88d67b88730fcc8b891d354b136bb1383030b84a81603b5dd08253e5a0ca3f4cef30f94ff3ba185b6a87a4b6c7eb716dc74b4053d1f0d76624aee714b3ed7f62b6367970f91313751ba2dc4de281f867e0694b23da1b0dfda8758f94b9932765e6914c15048ac1c6a1c348d79cb567b3696138bfb52c482ca27aa80b984cc134e48cd8755e117cccf7636637c7b703a9e4a3d1fddffa296697abd8f3a64ade1aabef501d50dde7b85471aca728ca91fcb8ac47c42fb0975d82792adfabb49e2c7adf4b5209dc15d64ea3d7f89ec3b188803ef6b3bfa1aeae97f3e52b440bb4d7f4225384b32becc05b3959cec208b820568cf3e0432387ccf6ca7bba93e0aad2abf10e827a9742d67cb5a200a564d03f7f08519761a28315705a37bb908e02466daa58e07501928d1b6d17b3a088394044746f888a6211957f5d24ff17c6cf28c33657cb57ee2cfa482389854e02bbc5600f9c08cee70497873f7b230fef1297544edac2baf5136bb6c6b14f9739098b4b6e9c5d1987006e254b7d8b438cc47d8c2381f6172503e77620f6c9d3ccc0318c20232d37702f796b1c186bae211932e48f363af9a418d9bd784c359f406cbf224ff78d2eab206171c222c0fe8293b805c0741024369bb2309b9abfbd02524f90bab884fbdcb4fad06cc01e82d0587a4bd8d71fc43851057094c68fa0ec101e1c384fe10346e0247e1d3c5f23d5bd7a1d281bc3fc21af819f2a8d9fbf1d01e77c83154ccdcd46eafb2762396c632dad173a3c5b1ccbe7fbf824f8c67e879acbe2a73fa40b74c061a03b3eb8958195aa6c4907baa96ddd50954079aad2b6302c0c4a49572403cf6974b6da63973ae4a0de3ef138e15cd7acee0a2eb5a764defeb47c9c2f518c6a5aca754c9c61119caf9897a84474d0f20f7e0f447ed22f0a102b8f54bbb97489a6ffe6d5f937b1a0290def42359337cb12c5437f6a9d62a7493cb6c86dc6a56b6bfd88fcb92af3df8a68acf8b39a156275065a6d41941e45f0b95c4c31d2317b84a4818ba007b72e72885d4344caafdb376042e902f075cc0a831c3df9696120c41322113e2d41f2c7869b082295585910ecd8e22647dac386d6dfb9a2086c06c838fefeff1650df395c9898a257bf293e57fd464c696aa36c91fe3cf94f74c24eae1741f2795540ff8951af22c540491284ad9962df2af344c31c1900bd76bf54c5c344772238f18f5f950bb46169803c668e578b2f3ec9a8126b1d0e6fd89ad5393f9ce026d44a169362b1a4c6e3976cd0c29308cb7ed26166c0263dbf0a3b66aade3c0a9d05e27be6ab5e7ba3fd7d145e1575e5b4cafefd123ef8e4df8a84d1ee8e82cb26d2ce7d4b245fd9969e2ee4d017f90bd48433ebf536914403ee313b4723692a06165ea4c6756d059d7607a168585526a91620c8619c91883a793819eb89089f5b3163345a44c5a6111b57f7249f449bcc355f843e42c25d49677e14112c3300e994fa672ece66c7b8b5ba776bd27b2e887c6abcb98b167b9d1bb57d21109e613848e2997cdef6c8b426bf1a469ab51fa124c1b3b444aee2977401aaa3831a92943a4371e1af63574a47089ae3f051059fa4149d82ec01af1c6eb0420af2de9b287e714a7d2c6dab73a260c8b338c4ea57778ccbde8ff63d3304628aba80c7049f6c22abbd903945731526892299ec983c5bf9d05e1aa3e29ab452270c26d8796fc2a1eee39c435534d48cc12606154c5d3faf6c1245fb1f44ce8f82ebc77eca75fdcb45d3f8c628d27ef34aa01bbea9e6bd92606e6526d2a5bc0f998bd7e41485364b7ebd0ccc21b94875346eb08cf0612710210778031054ac43419d358bb3f6a219630e48c34c39fe61b3f338d80cd6e71e0a68ecb9699780105696863d2f7f9757e859bab2419817113aa5a7b6eb358be99be5b7ef1d9e02742f00888e9a278abdc89a8cc9a01a0821892c20566f7389781ba77b405c0b5ad8c13c0a1bbb100db9828a1f71bee0cf91094cdbbc06b305467772d4e867e3400f47682600344d80fda4689cf1918c6d3928b40e6be249d06319954830d0b18c28bbbe4322d18805572bb7ba3b8288ec13b89dfc635638d2acf6f09e824d11541c69a2077bb75951aa18ca7b9f7afa5c06a15141d136ec121f0e897c36ff015a1a9986c15b4d5d4d877adf7c56edc5cee0687f4d794b788ec98a1ee88df9b91a642a58a16284bc0d1db2c820aae5e553905870da05f01259177ca4456bf10a687beb77fc907bbfcf02b26f36f5806f97652018f30b6d8faf273ce1ebf3e8bb28ac7002acba6780ad9c4eac13f4126bd31895e57dba5e195e75659607006cae202993b72f8a0de753ee9ded022c2ceb9eec8c684e655186bc2160464d45a9b28bc6000d92549ee3043e4e74d80e627e114fdaf402de97e8256f05c90f7683ec6b542c519e9e50728aa39fe83593e8eb0dd782a0c0c0f0c0e7c8e9ad02d3b20c1b0976d656cd52d25d297060946ff3d8a9ea52c2e455067c62329ea8b83b7390c00900d4c6a1e1978b112cee65b49595ed4448771c40b80add4ccd05a55a578b64eea3d5d01188ed080b1c0f456ac6d0362e6ec2d20d58fa596883e9f7cb922a25f76a8b0fc63220895c2f11a06072441b1f0b2e700cfb6262f8c4c8b5822fff50db10586e1c5c12c2bfcfe4529658b0841f7121d4e48230fbcd08965777c00851085493daa01260dd3cbdfb4e37feb3ae047c3e7d7f611f876c08fd04fd84603cee07b90d55ec5acbd3d2bd7107e36a528e477713b45bb02eacc2b2adf0a3cffb760989d166c6c5dc96c338a15e8974a376a37643bb59d38d810c2d61e181d3c2513c958c58261a783e7ce67b7b74a1ff4ab2513f921860879eda01e785ca08841a1048248a4913de9e41f798ae97c3543a71c29229c87e9cdbd6d9f47ac30716a2b65be8f727dd28dd906e926e9072b320a2499aef0d46730b26a0379c976066f3c88e3bf3b0467dae8ee8bce4710fcd87db95cab8b1891b20541b16c4a6a82c6855b7771f4f3676ff21c060c61b67abfac975e7250aa4ccf965291e6e2846301a0eef7b1a477f599f0eea79d422cb57b20ebddae6085ccb07ca06c7100f5efe77f6ffb22091efc726e6a91bff5b8d3f1d2437aaffce6ab625d6985dcf6a8997a58d694cd5e9feefcb9f746aca8929598055453f2fe52d22adb8d396dc6cf6c23385b9064c12d98d4d436002e16dcc4ed37d3af9c4643422b15b7943352042fceb75a324e13429264b26be76c43a38257efbde2e9fee310d07bf58ffe94f1ff165415917004bcb19bb15aeaabc81ce749512c224bd112188337187fc4b0f02ed90ee3543f946d1d752024129de6dcf6ce770503148a137a2d8a2f285a1be88b1e95cc765d0384e61685e3e6f72dbbfd9b53ae29945e5ceaa6dd7d63f8e4131118b02f486394073ac188b0203d401bf6b2e71852b3b84b76575f8e9fb3870aae6a5005f704cf425bc3546deeabd639332b283f5b2eefaaf5e3bf31cd92b28d03de087d4390626a6ba36bd23b122e0bfab6dd616ffece53a0b42a498a06bb38cb418aa96cfa0310d019a989606c313f5fae043f2b84959ed7733b18b1fadebc406b011b48f68aa91e261ea6b4a8b6f05aa6e426d1c930da632ebd7ba9917e0ca419100529fdacbf62790b87fd3484c2959fd2fe73eff66a52f7536bbccffbd8c4ff7856d2ee3335b09633f53103b1d85f572f14183a2b74d15d23c283876cd8699dbc3898e23f2ef097405aeb1ab76d408a5967be25fe824b4da3ca87762f76fce93f40f3211d08fc5df84f76f7b29ee759851e7771706bb3b69749682c3120a1bf5fd07f10532ee1066196202772cd91424df135d2b11d4aaa76994da272632a63dc7c36395f70498aa5e026c6e1046924a1f713d4953473754bce023183e1457b02cfc4836dba2a1cdd3106645fe5d137be86ee6c487702e5842e020854a42ec8e933cb1e5216f37ced81d4c8364b6609a75137dcc7f488dddd3a5924a65588aa2305becd201bd4997d6d6beb6566997878701fbda4d3ae7dd4cbacd3540170ba1a8f830e6a0d21884b04afeccb0eebddda385083e7dfdced2a27099e41c6e629880fd4855c147b96ce7b284e2fd061bb38f446bb100052f4c0fed281e67bd93d891880fbf3311d2c00ee122b25858a8f2cbb0a00e547b0a66e203ca911c63151493a7b72977a487bcfc7ae920fdc7f307be5ed0bc95bae14f37b659f6241ab2f537f1055e91a7bbe196cd5b9bcc80c1e90bff303038bf64b0905484d30291b61050b79d94046f8e3e9557d2d108d94427e89db76a5c81ce88230eac972e58637db70a7a60c296a2e4df988c718b11bbf0127cd59b5d6b1023c8059d45e70956422ecf2925362cde2348445c843e7789dd54d4e2fe8b3843d505939184e9b4f3e8de392714ddb66de038dae367a8d088c4ebffab394bf822a9a6f674a897a7e96e0105353f3e11473e19cd733b19c99c38e208d8c9ce50bf224851e65a89719bc7d6bd163971a1184290534743f645c9ca1826559c042a98020affdb2cc90c937aa77bce68431f43979bb49ce35bbf12e5af099087b5a4f3695c833b40684bb36dfca3e0fe709b59ee17ee87e146b5f913417ccf20d71ddf70e3a4d94d7edb1c49e6c989eee7551b652eb7c0c6f3b23f45db576f2cd39f23eddb775d9bc3a33dadb54e30c4411bffab5a674ff09abb3eadc2d9da3b4d2ec3bac5b46f72cbc25976ed6a24e86d9624837b5c612a56a15c0aecf105c08da3d8b4cba303c7ad8b86952c2004621d80550d09d3c32fe0a4b5944eaa53d8223a3b4c70db911a9be5f62ac5c2d4fe382845255731c002a369d5c7260b8ccce314c04c48a803e5fc06ba5d0620ebf38009249cbcc9269812ed81f18406f58156dbb246ba6af1276f15b5df3691869c03806c41edef31c10e8c88d8d15057d01ca2b0c2c080779ba3650958dc230d3d06c2639278f73517f2fd80eea15bfbbf278ecc9aeb856bd733486f48592df8171a4ecc2def15e2750b4f67a06c23741a8f0e837f1d3ace59f981e76e380989dca8bc00ec8b25c566b14902e8ff6c491646ba9b39ddb73da544f51f656d51f82553c0439e161db030f5463369512e10c96f8d9aa79addedaa3f00cc0e09b88120f7eedb7479254d1ca03145552c2561050dbf9b2e9feca3169aaaa05ce3b12c6e7a897cc35b0ae958163daef964806239fe843418208e45acc35671073df9e3f47184db56d415f062bb29e358222ad6151037900f361dc86144b6eb6394cbfed3497a82f7b553f416d4966b252f449ae5ac4890282d88d97f3875db8146ca95e865cacaca4deff4aa26af1df2d9dba4c77a932be465edc20d64f383f96f2457f2c55bc67c77b5b972c336cba6299e8408fb511e34e68121327fae24882d754a9cba2c31d58022e7aa23bf408ede34b763bd2e306158925091cc04004793eaa8c6c9057b8e38a79e344d604ce62b48f657947a5fc5e0878136564ca4264a6fde54d3d01be8fb1ad67401a717b52d9ea112d84772b6914d8a2269216de2d38acfa933986c618794610d8c1202a0af1545ce6a026a8fa00bc4bd0bd82f7ee8e16a024cb305cbfd7a10ed1073e5730dcebfb51a295b10314b9d687544ee78c25501eb00f802226d61548afa4ff56c235a2ac3c924b5a0ba707caf07575fb1a8f32695f50e829314c37c3bd8fecf3b4be539de7b1ebafef2f25cc25e73336b75965fbd019cb66de693a330935724384500e5b18477d468ab9afe41f1218c3b623a1b4256385050471067a0a26480f7563920bd7c41a75fcb723f182fbcd21f7d502aeb54d31a1cabc2c30dcbcec7ea58409f5176dca29a540b6b430e8fa28a8f24f03f352dc0c221fea681165da6dd61302463824c711e79b46134c71630954412900b2a92934a0e013ce0e1848f07e717dffe390db9bdae60154401c5ba8e0370b68b1782567aef157090daad1b671215ff3eddd8f44d68a979bc0ed66f51975bc39a7efd1615f77dd230b7a861cbadb58a489900b08f292a921e9b7aec49a4270f5cf2641ba4d0b09389bb1cb29a63a66331cd54ee49a097dec7c22e0b9f8097da269603d8ab2f32f7543d88534b3a534e1c1dc791a9c78017959413fba37c8761998763ec3fb2f5beef60dbe184599436cf74aaf1a4f88b142cd35ce667ef2688f07aa6d6d6c45b03ca738f9646dc8d4433c2bdac1bf3e3e3f70235ade11ead2de0789cd3631b913c85b8303a3a6aeb79644552041a4a713b79ffafdc710c95a3faa90495a3cf08b35a0d4047b5ab0f2476209b65ffb39219b1d95e1f9a39b54d8fc88138bf169fe3c5315135e48d4f242d45ab4f8e7119030f3f163dc3192fc4def918101a689e4e16438c1f8d770eaf6aa2f2fc4da2359030a6c2ebabc3478b3cf12acdaa7dea79b663015931204062882e913e7da22875448c78961afa0f2245cc05898e5550e4b8b5acf739cf65c66c931dbe0fee6293659642e29983008de02937e25d505eb55459ebc01bd3fda8ae42b9442fbff27480af3c57d3f46f275144b55bdf59321cc1c71f6175004c5e010636158670dfd13fddd89ed48954a62f44b1252b9f11fdbc2568b682d1759c08feadca0a674f579b3030c004014ac58c9388609a14975d41f7ae59e1204972335ef49355314b244e6c235fed551556cc9c9b177803742a8dad980a965746e5509b1c140ff23182ccafdf1a202d26f65d06a943cc057213e067cf242096e52cd0620e773e2276ba1d010c24ca5090a84a4894cf829c7f8018e6d2b9bd1eeaff66f44fd3cc5a45c5591135e5b49881a428fe556122643b0140df689554ca31c978533a41013dcb37c8eaa22809249a797b22455173620f713ee851ffea8de767b42b99b1a20afbcbdf64a0f51bf9b0ceb7137ff0e8f2e814750f216acc9a69bc691f59787610da92ab5563683bf91ee33565940aba8bd7c82b793c41ede6fb3ed0b20f31942e68cd4c2b70cb2b10ebfdf6f6faf212857534f134db40f4c61731c720f99acec19b4b5a0b9d78aabd38821ff4c7deaae3f8c8eebee7d127ffe6d13c8085a62d8cd88ce06fb4d080fc45d6faa892f243c17f61d537b85210678d0215fe6fb5cf3c5be6fbc3642d7877d1e6f4f77389bf2b3db38051e29ceed220ce761a0f7026e954c076a469d2cad9b079fbd014e7825c0bd9844d32a6240052a21c3dfa5c8a2c07f2fe961f5f648beadf6fbab58d145fd1fc7fc49e0f56009e4466011bd31aace5e71722e2f1c95baaf4abe39c4aa19b5e8627556e23c703a6c7bc3f538e1aea52c8e602fcca8f8051c239fdc6a5c2bee0c501ee60cd53c8441b251c1fbbbaf3a8b849e9ad7f0410dfa5dbf3320143c8f817a2fde587be39801150d54d1cb3abcf15e90fa6d9736be228dc8b2b31833d7d37fea27da7e9521d8ebbde7162d3c08c4a62134ef33531b04f9c0b0afbff0c187422d04f224e37b467f123e3c47d964ee173915622d9c2ac3f19f9e88c3854a0a2f6ed8d41d312d43716092bc0fea2cefd8534992a09ac03615589a8aa333d53a66032c4b24b503f4202bec3896e3ba0b257b4213704ed41c7464e1a12e61efdf6ddd10f6428787097f8610f4e93745ddf7047306042666a6bdc787ea2f3cab6f7d170a37477cc465e8f4696a72b3834eb0f240e450e64c9a56b2dca52ae332b1d2a33b4ec03e69647b68d7ff361a643411f811d936d95302aa99da71a193a0dc4bc9150413a89a995c4cee4fed9b3059a5b94460a6d1715bdb442e1bc66923c7be53d22d732f44fd7a5e0aa2e43dd8616ea0036070c99fe9447713c5dbf55134214593b9f038ae39b41fa390da49eeb1e5f5aed74f0de35a83af1ff8bdb7cc2d29214084ea0026348839480bd3098610437461880fa5ba643185c8ae7158b7345600572f4ffa86f543bc4900b8dd7151fea4090cb717629c5428c4395cb461b924521027de88c1ca727fafe47ce394b904acbf6363d453dc62681bf08bf02f15a3fe127ffdc97944b2852631a63d751429b6c9d94026d84e4d61c4e7feb87b6184f3102623026f71b905ecc831b0fa041780fb318388d2cb4cdc11f39f6299254fef5bb2987567c2515e20612b9865f5ad466258b712e76578347b2589d51d9a730c460e6d827ff65ccf891ed15fe9fb94125b7d4d30f4a77ae1f28450681f591b76d277ba6f863d1d3bd3b453a3e7723c8daee8e721f03026e34ffa123a7f7fce470dca35af4f75c8624d8165d4fcc05fed75fb6aaa008819c714732ce751b843565fb2b8a371fbecde1dd6caf437f7e3fb8e5c39f7173c67563df00b2c33dc2099a95d8cca0957e6c00ed47d37f7b4af93529d167a0831097930bfc16121670edf3eb3c89a2368e875655c3c603d8a160fcfa4f7da3f11ee50eb2d119fffc2163ab5cd016b955309aa1b6e3b6f341745fb82d6da014a0380ceef6e238e6f51aae04e4b683abf5ed74176edbaab4d5f62f9d6da55cac105e472126b5514f9cb7ad985b9a84705525dff7673ecba7d56555f3c70f3710c9c539f8cb736ba268dbcffbf0fd5c7a56f30036973163d2b9dad050ef22eb6cfb47e92917160f59dddad11e95d8a3658374136f8612cf14e54afe6f0697a35e9dfc9d7232b5c24a2ed03e5a0c0e125e4746399a014327ae6481a91b7331669cf9b7ed89be7a539038331873583f896ffba7a31e2072189ebfe4a2dd99c58f4ec14e95b179c641fe07bec49499ceb03bda9927ec071f22092adae04fc5190e9ef39513d88828d1a019812b91978d7684a0d880c8caa6acdebd2350aac56a8b52727faaaf96f4a2c6e79bb3d438855367afda7449cabc1bfc89640ed1d5cc1772eed88b1ff029a684913622631b3b2f4f8c3e07019f02c2d3ac485f5c51d4b69a5e9672aa403d5d24cf52118d8755679fca9c9b7d40357a07c6c4d116e1e2b8e1f147f1d8a48078da1214fcf851c02b427f2a12fbc008b9faaa2c8fbbf8fe41197bb479222252a6c5e9feab3af68ef7e9c12a80ada69d9bbbfc59c4bed15f61ad54f77e50f5cb1b7261fc2fb5d8007d315aef754c8e3bfd7f50c786fe55588903ae6025979b785f775322d48a109929a3970843dec64faf310b688d19f37da7f3dfb66315c05de16087eaba89ee2a64bcfead448c42e13e55d37f0d19a0f88e9f510cf73f35626d401f4483ef94928bcccfb8933ac050054ac681c27f95c3773c28a8f1c74cb73fa3889870bc1af9b8b04d6aa47dcd3b4df02cd43edaba2f10cd45ab5c152e3ee999754df1bbbac0547470692ef475d7323ec5356690be88f5642da4f6c6d90454019c0605de74c4720e56209adda8030122ded051eb61ca47c9c7dd8fb72f557bd6d8adb3d36033e6b9468d48742b6dee94a6ad1a19544551aaad4460e25f7917974a4e4aae5d8a287e93bb896bab51bcfd097490c5b67b6fd964efbda54c3205020f040e330e7f03c86f90fe26266c0da015306d2e30fd7cf3f8368abe0d202de228fafd23e89496225ea6668da24f647bb733cb98478fcc378230cd37c2e400d7cfaa1d343132e1e9a85caa243a87becad53a6dadb5ef39cabe2a89f694189b60ca04a63fc5f6e90627868ccf4870d39f4bbfdcf7ae948ee448dba1381a4dd38a38f4e08e81041f928e04b372be841444192ef2fdb6c89dac491be54f69ad43809fdf95ce5a47c7cfef8dfab44e0e3fbf392a6b9d1d3fbf3b1a6b1dfcf3dba3b0d661fdfc16615101707c39684febe8b0c31680ba5a67c707f883b65a870790300143add30308d101a28f9fdfa35aebecf0f37b0c6a1d03fcfc96016a9d1f3fbf493fadc3c32c4d5aebf43067e6ac750e305f4c9fd641c0a499b2d6013261cc58eb04f9f96d82b58e0f3fbf6b5ead93809fdf363dad23e4e7f7c9d53a0af8f97dd36a9d1f7e7ee3cca1d659c08c31a750eb003165cc596b1d06fcfcfe19d43a0df8f97d2750eb38609273feb4ce033c068f01023fbf67cc59eb44e0a70c3e7d6698b2d609e2e7370d33d63a13f8f98d9ab0d6a1c04f4ff97cb54e057e7ed7307b5ac7023fbf6d98aed6b9c0cf1bfc060cfcfcce29d200f040eb0cf9f94d6348eb68e0e7778d205a27ff543910ad23c4cfef0000699d217edaf0d13a1bf87983ee681d0efc6422801e0138295f65afa8e0c0f1385aa7033fbf46eb78e0e7a35a87889fffad43e427971ec09b5aa7889fdf3a3fb68e113f67efb5ce077e7ee3f0f3ed1177e2a604f074dc0f2887fbfdecb81f0ddf6fc6ba9f4f01ee27d3e17eb19dfbc178dcefd5e37e3d3eeee7dae17e2d035cd1d08f2b12fac1c315d57ab8a2a0035c111002aee807c815d1825cd1cc872bf249c015c9845c514c015704fbe18a5e0bb8a21e20aec8c5802b6a35e07a430eb89ed003ae5783c0f58222703d20095cef2788ebd12670bd1905aee75381ebc92c70bdd805ae07c3c0f55e19b85ecf90ebb93470bd96987cbba1cec9590821c4104324d900076e07d481dbfd78e07634226e3753e262d2e3e4050546e4763e45dc4e66c4ed621fb81d8c8a13506889c97c66734e8fd55e5292fe386a3e8da24bcf76c9f199d2b2743996b6e87ca6b327ba349db00ce033f569a2cb8fe10a954de912654395d5671a63a2cb1a36a2e08635e912478e4679d397125dee28005d02f78d7e9a44973e7e34aa6df45324ba049200ca1380cfb4b545974038a00bd5671fc2a2cb202aa0458dcf2e74459743841843e3b3d7ace8d203458401c0679fa2cb22236894e7f46c25f972c367ff89a2cbe952d2c586cf4ecbd2e5ec61b2a586cf3e7ba2cbf9728225f5d97d9ae872c2a05c417d76d9942e678c4a151a3e7bac9c32271ae53d43bf37e972fa4c28fc890cae44977336b5f812b867f47b125d4e1a974679c7d0ef4874397fbc380ff9d95b5b743981a8e8e27e9e4358743983c068f19fa7d0155dce9a9831b86b56743985b2689477d0145dcea1c94515389f2790145d7a2bc9979bcff3278a2edda5a4cba465e9d27b986cb1f93c674f74e92f27586a3e4f9f26ba74189446794fd9942e3d46a50aee3c634c74e93227a2d07c9e4dba741f9f4a74e9b3762d7309dc33fd33892eddfbf344a24bfff1d228ef1074e9405434ca89e8d283b206baf49a984679cd853c8b3096015dfa9073d12807fb8374495b49be843b74495d4a1af5b969b48749a3bc1b4097f4e50407dc3828941ba24f754963541a456f9754d65034ca6bbaa43e8e7a2d33259d552e6049698e6a9dedfbbd23dedf1ef1fe39ee173482e0fd4b20787f9dfb019974bcff49c7fb0fe07e3f9fc3fbc790c3fbe3b81f0db5e3fd6dd8f1feabfbcd6ae0f7b781dfbfbc9f0f0ed6fbe760bdbf00ee27db5180f72f4001deffc6fd623e7478ff1f3abcbf8dfbc180ecbc7f0276de3f00f77b01c1e3fd1dc0e3fd55f7eb09a2c7fb57a0c7fbd7b89f6b888ff717c2c7b73cb0c3fb17b1c3fb03e08a863ac7bf8801de7f040678ff9c2b126afd48f2e3fd6fb8a29a8b07253cbcbf0d5714d4d303931edebf862b027a1dc0c901de3f75453f30044041c0fba3ae88160342058868260be24410918f8f0f50f8f0fe325c916c968004886234215c84bc7f0c5704fb51801705bc3f79452fa01fa8f8e1fdef15f5042d00cc02deffafc85503420c10ef2fe38a5a420c60c0fbc7b8ded01c6a4003de1fe77a422d072471c0fbdf5cafe67a809207bcffe97a413d10600281f7b7b91ed02b024e22f0fe35d7fb8149008a04dedf743d5a2c082a41bc3f8cebcd6413706202ef4f733d1f1f0a404181f77f713dd9ac025a2af0fe33d78bd12cc0c5020ffbb980970b782f200c508181f797b95e4f5006c064e0fdc7ebb96a4386bcffe87aaddb85fee0ed843ac7dfde6e280b0d6820e72442b4845032846b886e26ba1dadfbe96e07c464033d1b70c2811707a07400d6012a1e8879e0fdb9dbc16e17eb1cd9ed7c9c20020a225a8ae062848c081f22b322de9f1af13dfcd881006fc4c4264711e06d6d9f042000eece21c077b84300232e9159c4cd222237cb1071738d076ebe1db839c5819b551bb8790043dcdc5984b8b9a3c837b7141ab8b9a71872735b91819bfb0a0cdcdc585ce0e6de224f242a70f34c8202374f252670f36c12c4cd930909dc3ca744e0e6d904046e9e4f3ce0e69925cf281a70f394820137cf2980b8795ab1809be7153fdc3cb150c0cd730b21373b1209b8d993f0e1665722c8cdde04c8cdce04026ef62907b8d99be8e1667f82879b3d4bf6280c70b34bb1c3cd3e45762b7adcec57f0b8d9b1d8b9d9b7c8148902dc4c9360dd4c95c8b4c98e9b291339dc4ca764da04086ea64f1c7133cd4280eb578c937649bd34ca6de914830d367214e047026acc015d562a41780584286204f5274997d58bcbcb0aa4a4cb4a450d62d2650553735285a07459b3a84354baac5cc8bcdc5a4e74b925d95c5074b929d97ab474b931d95e5c7ebcdc60ee658b51d1e546659381d97c5ccc36cba2cb4dcb1cf272a34d2ebadcb86c3f49badcbcb8bcdc80946c41ce64ab39e9721303f3721382b20d51e15aee04e782a24b4e490fc7847b71f9f19283b9172e4645971c95202f3919982e3927381f315d7250b89097dcccb3e892d3e2435e7234e782fb49c201715470414cbae4c0bcbce46a4ebae4c4704250bae4b2e086a874c971d172c2c7cbcee55074d929e999975d8f6be9b26342694eb978a975db38aeeb3c4f24fa3e6b41300c4571341a47191912a9549a9979f1828606060c93a9a6c6c6e674bab9c1c1891143868cff7b4932861866cc9041861966a08106142a95aaa1061b6cb8e1869c1c000080068d1a35542a2e01f8f16203888a1b41606a62562b1c03d0c981038e01e8e4c0e167c8637e45392a8747d5a84177bcad200d8398682a8737d1948eb7db5637b0cee03c710e9f27d6f1960bb9193a7a984c8ed2f135ec51f18eb71cb8853c66e7e4f0b37374fc16f6d8f08eb71dc88540784c90c3eb7813783495c37b34a5e3b9b0078777bcf5c02edc01757c17f6e8404f240a79e067fd17f6f8401bf6c0cf7a1bf6c8e175f0c8e175bc05a7d3ae3a743cebe6f0f8e6f0333358c7db2fec9a30eef82fec313a2a87df418e169c210fcf5139bce7281d6fbda7e7f03b481def853d4478c75b518b4462774e0ebf83ecced1f133dcc9e167b8a3e33d871e8d75907ec5d8387f3d1c77b09a50eb34c69f155d52202ac210e0339d4dd1250d0253858ecfd4478a2e694dcc971c3e5359145d52a12cbaecf84c6359baa443948b2df833853dd1656d25c1c2fa4c5f4d74595d4aae14e033ed99d265ed615285892eebcb49949dcfb4d5a4cb0a83f284c7671f52a2cb1aa3b2448fcf2e94449755e6c4121f9fbdf621d165f581e2e3d9e1b3076dd1659d69e9c2009f1d088b2e2b8d8b163f3efbcf155dd61f2f6378f8ecb4b2025111a687cf3e9ba2cb1a04a68a037c769f5a13f305019f5d16459755288b2e403e7b2c4b9775a872b125c867873dd1e5d64a82c587cffe6aa2cbcda5e44a023e7bcf942eb71e2655847c7617135d6e2f275114f0d95b4dbadc60509efcf0790e29d1e516a3b2c4023e4fa124badc644e2c01e2f3ac8990e872f38142c4c380cf33688b2eb799962e1af0790261d1e546e3a285033ecf9f2bbadc7ebc8c79c0e749b3a2cb0d888a3010f83c675374b90581a922029fa78f145d6e35315f24f079caa2e87213caa24b109f67acdc86362eb64ce0f3843dd125d74a8285029fe7ab892e3997922b15f83c7ba674c9f530a96281cfd3c54497dccb49940b7c9ead265d7230284f30f0b98794e8928b515922039f5b28892e3999134b867cee9a8744979c0f141e8f063e77d0165d72332d5de4cf0d8445971c8d8b16427cee9f2bbae47ebc8c19e273d3ace89203a222cc063ef76c8a2eb920305570e0330e29bae46a62be74e0738d28bae484b2e8e281cfa82c5d72431c175b30111dec892ebb56122cd8bf6ba2cb2e7757b07f37a5cbaec7514ee4b38949a3ba285d764e9a892ebb97a362ad63c4fb77b0d6f9c017f140940a1a54c1d4da266613e2b2a043ddfb532eba9697c4738994887a3e26dfcb3ab130100a180ba98432d109d16704c568366a1969325c647e485e4840252a4a413360666a2fc4bca079ff9a050d8cf7af5cc0689992985c354a6a7a6c98d8bc4e4e4eb01b2837311c2a38b2184ec4f09101858cd96b79dae5727f482f24500c54c4103403cc8c9a0c626478ff4d288b19de7f1ba2e1fd372e6868a192a05c2925a99e1a98d4f0b2c1890db01ba0dc10cba1922303801300f0a101058d590d2d35682a2eaa9f007809001536806c80b91174434c4d00efcf0995efcf6551ae92e0503200264e72ac5a385c03e8d179ffeee565372ac71f417ee076e718718b207289b8dd39b703b73b87037703b73b6788db9d23c4bddd391a1892010c5cc00215a0c0048290400420f0801f3cdf0140787e0380109aff830284f4e0f90978e1f93e040182001f3cff003df0f0c3003bf810c2432d57e7c062329fce21c0a5e1f938dc3c4503b8b906cfc771f34da906d0593a8a9602cf57dddc53e4b60200373716787ececdbd059e7fc3cd13093c93c05389d9643231a7e0f933dc3c9b984fcc2c338a3ca5c8730a3cff6f9e56e079059e58e0b9059e7f73b323e1496457c29b646702cf8771b34fc9de44f627b267f1285c8a29dc0abf020bdf024f24304d025325f06c4299c8740a9e4dd02730cd826714a2ec089f26a84ddcd5f68c3c920961f416e11aa8ef863a218bdb57dd164ffd7401fa125405eec260b7616c5c880ecd40dd6083cc061907da745ec6feed7676b341866d08b2a18a0d318a83f57ad2da85d3ea7293691c85b0af3a214ff904b17fb8e92a8deb8f7ee86ab2fa8444af449daa5f93c0d566c84baf46095cebe753937617f307b04d0a579ba1cea93fbb8cb9f4c2f5b3cd50e7f8975e5ee6597ae26516a57e3c28d89e61295096d1dbe1ed14a87b51e7989d2df63a7af4cbf56ddbb6edbdc9fd501d8cbd8d4efda911d54bd04238ecc001f405fb0f1162e2e1018e72cff380d81eb0051144f62699b7b7de0dc251fe42a3f73d1ee0280f2f4ff8277856485a995fc3cb1bf3bff7f996ace1a88ed68fbc117a35e6d798648d1bdd0e1577bf837a403c208836a2e2499e7e701577e48d6dac710335e3e7636f21eb5c1276f6906f5d1b427bc8fbedebda90d69976e6ca86a235701147b987ad8d7e481611bdb77d49ef6c197194536aef90cea1435a87623cc31f94deec39c0cff6c3b7f6ce5611477983db16d20fc048bd087d3a3d0ae73508a7d21260b16924c694402d2570e1199c3d5492f0c7f7a71f9e10d803492d3908f231bcc1ada54a2d3499c01a4f7e187194ff2c32b7a0438618e2280f0354c4882fc1fe16a83d60880f61c48b54d143f4eae028dfc81da6e7dcb74abbbe952b4536d366025bb86340024ed213db9560bc1979acccc7a1dacdebc5d941bd61b6706708f0ed375198f3ac73dee6dbb66d5bca08a959a7e88336506c606d03c553e2b91a5565fc77bc0c5561cc2ad7c609c15e21af9ca84bd1e779553d2ad746aa7abc9cee6587b86748c00206c369324d932914a7bbfb4f92dbe11d9244b67771d49eccce971e4761d157b76ddb366badb576dbb66d1b71dea86aa2554a74149da59f982158438e1dd93445c4287a8e2449d594901cb5c09d04dc437845c1af25700ddc438041186c4b13671b988d688b7d8ec23c93873f746f040042acd177086444a268ea6b137e0b301ae2d43a45ad88084233749f93cc37826e84e1c8ec7967ad4cc953b2b5cf173454d840a101f2d206d628d7e15ad03a9e8e7d558feae561130d153440dbe6b55a4b65a0e18e7b0bd3bf5398de15e6dd42be5f50b9668e23bc2bb4ce11261c318da385c6c9a2579e8b0b17987085c2387fba668f7b4dcf0f71eea1129e6f731ce1e18d766d2ae54aad25c11be75ce1d4dc0b7156b94619606ab201a63fb918ab9d3d2915b91881dc6dbcaeaba7c73d8426339c67a02a14aee39415a91498ce0953c3341514c459a92ff461b252b39e31df20950c32badda0b93dc5938bf15a71afc002d3bf5b60fad30a5d396f73d255e05cf1b4b901b3b043744aa79afd70c1f6e96dfef4f43dcfaa29d646e582f13bfcca888143b63c32933788ae64c4b01be99124d93435c96c52b9e8ca06660383c15029d12b1b184dc19ac898b0f1c11427c6dfdcd1e3dcee0ed114fd9b6bba24ec9224cebd359aa2f99e62ccd11647d157b954aa524fd36e542e958fcaa5a275ec8654b94e6453cfc6445a18d754a453f5bc60306eb36ca987ae7e30fd520f1dd146b32273cab0c9a25117f7b7cd820b2ce4a51d6a14fd232617c67a4195ab73542e22dedb9f2111f63b24c2234f7eb209a2ab9b21ba8241f6d055f795cc640bd3cf24f92261640c4faee647cf63faae592a17f53c2027f2e47f224f4e9e828cfef442467f228d58f13752f3a3775248f7366f431a317df74858d7caf6476cbee68fc078138c3f52f336a68761f3352f04c69b6cbee67f80f12627c6235684dc7cf7474e3ffa2337df7141e5eaa1ab235684747ff347467fa2ab23dddf3cfd29e4f4a31772f34e0639fde87fb8f9cedfe4bf4d4a63d015ced3c719a22b194f63f0b82226763b036a9231b48efdfe1918656b98736ed6e3766ade4441baf536a958eda8e6bbffc1f4a6efc82356848cc8d334fd91d3244f40baf7a159dd8ffe88112b3f8cc823a6effe881521a62335dffde88574a3d1db904660fce88ddc3cab5935df2c3b43223f26f627e2c364d9fccef6e2ef69fee99b55734ff34dd6e6aa5c34a5faa2023a05e9def43f746f228f581162f3a33f729a5ff3a6effe87d19fc82336356ffa1f4e6f337a6b633ad5dc344d75304eb759a629a2bdb8a2ce996f53ee5ebb56aeb91afc8640042330e2a8d92ad23931186756b98ef0b0fd234cd8d2bc289fbe4a4ae300e3e9ab60d02bd353150d307d9ae7c29d176fbdf62615ef146c6a70c15c2b5c31bd9a396c6048c0f46f1698de896d77a0bf37e79c736ede26faa6532ad6f7c2ed6f8fc61b49449544e7749f9aa566342fae94d1c338010579e14ef85ed803dbdbcda2fda48030fdef5fc65f9b8ff1a7e7e181f1387f73628deec97ff4db69fe8d8c19a6ffb4a6a9183e983e8cdb34c5bab9cdb289719b85739bf5b759326c7e5e2046ac0831bd0d69a47bd31b197dcd5728e3add9c06c6a505a810d141b2936547a4503545a4243051b184d908d13df27b638a9c889be6ddbb68de3388ee3b66ddb361aa0d2121a201aa0d2124cdfde606564c29df065de9640bfd78a29800953c3f4670cc689479f8214a8947409be8a49af8ad0147d6f9a005395134cdf964ae14ef8f645bf9854ac9f9ad1d5b5a253f445a99f1bc489beac72c9e022f6e97b2eefe9a4d3eb8c0473739a6a4213096e4d4618beb1e27d9e812b9785d200cd5a6f88ede84d9ecbc6b849e97e5eee47075eb09541d5939a3997d1f4a67705d100cd6b6960c1b8fdd6d170be41f40463f759e5ea82f086531b6d59468ae7756cbab335ba567a263301b636463a74e38bfb14c238041dbaf1e3287ae3e7c697d48cae46238ab95bb380edddf0cc3266194130460bd307713a0cb38ca311ce1819d0c678b160fa327786e9cb843b70d707d32781dca559607b49d85910860d18bd89348283a6a8941a3445dfa51847d7c78e9f7176c378b9fdadd9ab05a6af72d9b75fbbf4debed7abd1d296606a7fa6f6d0d5a8759e74c90d8d5db96a96d718768ef364d87b9b216c535fd896c09965cc38425ec76d5de9cccccc8c15716a8eea990e82b0bd22ee3023fe5ee47dbeb30b7483ee4ff8f962b9344cef13985e283e0e87349c17fa688c3d1ad437c82bf66e153448f401518abfeb4e7e71ccb917ec4fa5f0e8474aa921c3dbf8a33f38b59aeba2174fbf451f729f63b468c6e902ab728c1e1cc385e9679c2d30c5e10273ff5d0e835cc8bd3555ce6eed6f0a45264ab1c80456b21b9567427fcf5fa6697c7762ce749ba6421129a586f40f1b83b7f10b18e10ec7799f8753c319c2d4e338ceb3b553b93c6e3b895dc5fe4219470befed4df5401c2b02716a5e7e204e5bd19fe76bb1be16cb4921568cd90e392ef5d095c94db9874633efb31d721bf3bbfbd1e7199e64cc9ecbf10d360b6c851a53550f8e98bd11347b8deeb4e2a31956016eecb767b217f62463be01846fd00d2af54c61cc2a57cdb59db6cd371f2fb7f86ac64cb584973dd3810cd3ef2838ab7a54324c555830f5595ae2654ecd605ee692cb26e6652e2d717939b3c2d9a60ade525bbc9cadf3615aeaa1bda0356c278853ebc8520f9dc1983d174ecd0e01613a2af5d055f7d9f33af206d11485c108e453c3b49301e19fdc439e6b863d6b87e8f4c8de3a2bc3eb0800f793ade3283c438949a9672c31a1a1a2d4e3250d50a3e87b0ec69390ee473ff2b08769d743537702617b45b8431f264be5a2a9178c1f839ba06fb1020ddbdbe17929b636c669c4b77bc3380a0be3ad05a95ca319a6af7a793959aa2798fe68e625cd36309c315e7e782776c358fbdc73a4e77a4b0a773c6f13e22854aede122fb3116c2d99da929ac16ca278e9b4da601c7deea1e9f7065096d17f8a9ede20150e542b48c1d4d1d9fce9e9ab92681dfbd4c9aceac1945335197d56c560d57d56d54087e97b12c0f52c93e96b3eab5e80e9dbd1e599210f8ab78da7fb9b1f5d1e183f72f76dcef9dd4d921906961529ae1aacee4f808365458a0b07ab7b1837490e6108038c1f5d9e13d460e1fc0970b06e5e26dc99eefe32e18e7bb843c40c03b6ef9df343bf7c55e4c96057ddd49cb82980fc4d1b59c4fe307ada9802c8a42234a0c09b30e5d66e9bdb10032ed2346ec0a9355d62cc774bcd6298be0580cf1b9c9a4d614ccd660ece7a6a969a7510fd7c8366b66d2b4257cea23f5b5830fda97239e99f672c9955b01bffdedf9ac21ddf1e401f28076cba522951b9da7238ab7a542f156cb2be5084e98f2984f7933cf9f763d51298aa9ea8a20461018eb39c10ac6a89a39a1ce228cac46849550fa972b59451f4db3522f480a3e86f2e18bdcad95a8530a2625bb7bab94f5208eeadf7747bfb150bc1fdf61e476623ec6f9e873cbe2cfacd7b6a77b8bd5eadf49d86e79a399c2c52c3dae9b9e72ada5d9e6efe36723223a9a2b715670f60236a475a6fdbdcbdca596badf53ccff33c6badb5d603aba7ea7114b5b343efe7e6791ee7819f533330fcf1adcd366ee095d23d773d99d42cb585aa2c8ddb1db4dea1ef3deb799ce5aca744136bad2a861cfe36b099c349cfd534e853d20686a9552d7137923d232a9e4b8c9e77832c08dea0dee61492d2fd0e57b9e8aa2353334a4eaf7fa6683735131aad25a574bf91a92da95977554b52332f77a0d8db38b545e572d4c6646c9f4ef0e06c38354cff065d214cef10b695b3d65aeb799ee779d65a6beb467db657bf1b8e3393f494782e2538625c5ee2d41a958331ab5c8d2d0d60bdd78acea16fef9d42e7d0f7ee05d339f4b77bc3dc496e2d50d1572df155f7f46d7fa2b731407ba712b05f1bdc210246580465843bf5ad0cd0de9912aec07e47567861d1cf7bc1bfe10e6804bc526e184fd1ff70677c3bde7b6bb766dff392e62d99c7b72feead8df706bde871c3fc0edf66a3ec8fae6a89a7bc99aec4913699ca02ba0257018f89554b5a87e6274d919ded6d60add32f544c542dc82a256e18fbf46fd0ad8d76b4d49252464f47200740bc914640b27ed820b62fdeda284be6ef418f47c54418c1db7fb843c55bf83df8fdbda157841619c31d6bc970874ace1809c72246bca4dd540ce1ce2453332546d1739f53338073a75654cac638e77fb867480083bb57ddcf97f1700ab435a466de0dea1c2b8cf906611a6e2f0d7b78316cd362c48801ab69d034dac6ee03028405bc3c3d7d0fb44ecdd327a275444d9b81278abe057a0b36dd466a724931e81c274f1c85bdfe91d2877f04fc8ac478c4cafc23e197fe487d30fcd20b09272964cca34f9fa5126924246580e980d66235cbca4dcfa6e20d1114df9044740ee5b61d8c314c9fbbd7e9a7783b6c27285e105bb7e2d3b7d6bb892163869b9b8f11e365c4b8f138d15adafc7e8e7f7a18e1cee94463afcf17c9e826386313b3d5ec8665bc8254039c49308ef4f22ce9758526fe885578696a9dd16f5f73c573a2fce78c499ccdc0599c55215ed139d4a746fc11bfd45cb10a47cd684a0c12b378054c5fbc42f4c1c4c87d6e1a9de18e6872733ac7d9c0e2cfee4d7f13ee984c3656061a3acfc0a8ee116c998878454c1c43468c3c038bb606a9b6718db78001f0b85108260cba3159d3bf273921bd44764a104ee11ec2942bd8565074edd71b3eb53c1e16c34bfafdee11266c49718ba3421e17d8ba7179d9375f22c2e947e3e9a79a278da3aeb4a5742273c908987e0de96324c98d24c9fc64d36e48fb63699636abb67ef8332f7a71b2667e876719fbf35613bbde1f4a3f431e01bf4476309a9a2cd8fdf0bc32ea0c6f3d18452f92b6d5f970944bf4df2340f4ddebfb6c5bf87b97971fd996d6a9efadcbb62c8fa3288f97d6f5d10877dc6988dec638ab94d273a40f47d12d9ee771a2782392a6ae133d0f5ee77dd7759eb5a3a7e6db071d3581f88bec67d1bd3e5ca411ee582bce6888b4198c1c99c19eefbfcfa4284ebaec4a144751528cf47294f83d31bd9d410328bad437b086a427a69b97f980e38ce8bfef2345a9e228ea3f03e001087d347692a49a81493052142f9df4e42949e6e538fa994957307d55d7994af4aa8a7d7829923cf8aa59748b1463f07605315d6aa1b3e81538b4d5668e30c804a58e8a62d5d2a5112a97d938eac0aeeb4091e80b45efa5a8befa078fe2748abbd1a5d882e2ac7b897037d8c547abb55670286c390a1cc25bedf4a33beed20a565aaddd4b9c897e662d2d9c595a67c30e2715bd8b41e7a4cbb183d22bdba2a957ab7b81781b89c64ac590fb32a3b8ce2aadfed4698591c8c44ec099c404a6b0ce99057941b744ebb8a075366e09aec74befb3a9c6869bc164fa9a9ab7015b35268e13a36c3111663b9fd1186dabd56a9a8e241c0df08e30b4614c53d0a488c29bd2ea5e8e82a1260d3abf27cd4420e9f59a6190c9aad6c5a7ee96f33a6b3dcefaf4f9895cb49f3b6dfa59911886e18ef761d8c3f10f4e424a3ff333a491faa547c20aaf7764e69b7524fc6c5b46acfcb458e1836f67780202be0fcd02c91f5c0b2d5428210cac902c85de3d914870f76074b20303cccb6c6958c66f8745d49240bf1c16dd26c21231c056c60c775033c77cda24f367531e37da7cd1f7bd15c599fd4473866138df68612d0cb247e0d2a512ac975e8936668566a9902135695291b32d6badd771222c26c244580cd3df6868c21d1e80f810356db2c016e8721478737afaa522cc1c384f4946207119712514b4142a3af00116db2ab10006a527220c1cea21928f38a329faa04ffb3801f4a1410b01cb602733294a47835e21a053f4bbb07b3b038e6f5f806e9a26b731608036c6d1c3b0719b29f2c6356f23be4dd858c69df806acf99b70677b1c8ae3df0b99e11030b531668ca622111d16278e7127761f74d5bd68d0242160fa94e4e38d36304c2653671ad202cfdfe67479a3881b7de0103834b4d588a00fe803fadcd89c4ee0b4ac9b39adfd3bdd3f918dc8799d6d895e8c41e371a24804bab5adafe6606bda38793a9d6280f35aec1c8ef7e3af461c32fedfb3dd278eb85b0051ddb1496c4b747bf8f7851ee69018c531a203412de03ee6fcd6b944ec60b46407eb5e8e127dee44f352d1280b3387d8e356ec99392a6cd2a09cd76d224c7c8e7bcfa3e93c6e069cc121efe256847d3f96e6281940f15a6c6f6be972043caf6846b8830d2c12fde86d5e27dcb19101b4c911fa682c7ab035da44e3cccdceac22cbc372b134d16d96750f9ca1f8f4dbac8df1e3118158c019e8f3813e189c79d95f0b74d52899f41a65522d9778c69c28690b4c9f640525810983e867d214355b8d7465f6990405537246f1260df09c30c0935c41e71061ed851a72923c4c5810e22905279380e7389a3327e039c5f943748e3088879e37e0393bdc9914747d24d8327d065b228c821b3744c320ef7124eac4f9e50726c5182f220cd31f8d9ed8d55938abb33a0b67261aa0b5318ab759a2cf117d3937843b4078482ff339a0bd19f479f1a587f13c3c331f3e8da5b924d80fa64f02c2f443528934437a4122c5686eb35edc66cddc669548b759323e44fddfeff09c10080f481ab122247c23f543d2a3a9c939c98774c55155483147d1072d47eec4589e65072310d20713e3b6c551001091d9ba66bd206bce4d057e5746bd1d8b87e3f9b6e565de683c5ee66d0ba6d6655bd609465926985a2598b2e0b34d01a6ff0d097d9f3f21144de91062d2c56969db46dbb62d3e458bd201f5f5d881046b1ff5934ca197310d007ab87a07eb5eb67b75b0eeb5d536a169a5752616c12a8a4dc360fde8261bade8c528804406e844ed2e2a57554ad0fe10a188306e4bf7c4514f8c99f49a5bad8af256136db56d0ca622126ce3c1e864d7bdbad700407b2d125c582472d2cb51996480700a9c686961d0b44cb03f5607b417c42e02459ce84e6c6953a7e2f7a32e98fe684cebcca73fc242eb782f8e01833053dde71f896010e60a04c384cd1ce16cd2a03f438ced4764a619fd4866b1692018a6278e34a61838834373abcd30b23ca52d2522cc4a45c0f42969e628d2cb1b4d6f5db6653fdb16d8025b604be42c2d0cb2344b0b83ec0f6b699607900b70a8eb964ac395084d837e35823d42cd753671135e250aa64f7ae24d9cf8749c8f389b1d67809667b71ad8ea12f6696d8c9ee544cf7ecfdd106fc0e19383e7d36634f07cebb55adb0f0f0898b587075ba0cff4b1403cece1612bbadb98ced984307dd067e6d8b0d034e86f5a007db69a87b92c636371085a5a34428b5cc4993813bd603ae7b41f160ff07986c780459f43c8c33bc2c3a4278e22c178c00f7f5e22dcfbe3f0bbcdf230f87da2b756246a12ac75ec83dc2c411f47d1eb989b8d3d1ad3401ff7116222bf59d77beefbc016a62458e7604e0cc923f545dfacf0ce591763b0c8f382d0c22297351530082d1cde1602af95de62059a476b9d61faf57242183f37b63bc00afe0e37c011ecd74122b7a1b757d8674522024028409f4c7a627aa0dd01ee087b38b66f5960bd3c5638f1ad873cea166b63146d425bedfdeb9471abd1d5646d323b5f5c3347d1645d1be3e1ed89b106b3045b8ea22458eb74afb3813c98be7dd239f4c3db2cd125c98034031a748e1885d484f4ea9c208cdf73b8c3069868eafb90b4db2531d139f4c116a90638936ec0d3b87624de78306e42b50a7e2591b0bed7d2a50b2c5e107717fc89cfe3b558628b95492f520ca0b49326d1a0cb4f56635430a59813459287e3d11819b24aabb37344efd73b47f4dfa59d2312bd78bd4689de7a27a827e81c0598be0d7b20c1a2b71be935737027c09354c3f42b94f903f8e16fa10fcdaadfa190130f27bd581b0f38208c99f4c2f58d80efa41725c9688abee892b094b6c8469126ce1ce57d1643202038645b2d03fc404027a07dcc1c96466b2ac42de2ccda18391d5a8749450bb6660e314b7b5a3a87b644ce5a9aa561fa1ea803a8830ea1f82f8430294682750ed5614707177f98ac4a925e3445ffbb3b340dfad4ca8fcea16f0b00ce2ce3fc0284417c740ea903e841ece5bc310813164721c5c42748af2a1667d28b071f405a872342ebd8cf7b8fdc6a24a90a25147c622c694bb8718174022ec2565302c908df671217520cd39f419d14100082b77fe6dd70bd563adcf1e9e256db6ab503803646fb0700d240261545ef3e7808838858b55e12ac07b0871e422789b41ed9c3a4174dade0b3a2adb6d5c02fcc3008e897d4841483cea12f5e9293cea1ff5deb0338af070977bc0ff25648d55267a417e9e55b483452982c9da36261a2573eaa9529308555184d05414b4f69a026daf404a6bf8d11b7388a8a22529c4d19b3389bd1bcecadb6096db528a52d252c251f94747083929412154cbfc4f3b9f4e47309069896588069e90498929d0dba00495ec094ec5e242d9494945080a91530490ca64f0a43dae22b1f34455f32baaa4f9fe4439a916074057e815485a02ac62f9876c17492a45718c666e1a8c0064bc05a2cd24b744529ec00a9bfc3ad10d0de0d7fb7b574f10216ed8864e07929e989a32e09467acd60dc3e935e74d5bd2a9699031c9a34e8871546df0a01ad8db153402b60529113b388339a28853805a6e2ac7328e925ce48afae7bcde0213a5fd4e2f94398fe8603f37c7ade852c962631ce073f21ec6f45f10bea80b077dd8baee87ba705fb77eeb2749f3b21e02e0854e63ff0ba5717eb64dee7ae3422653e9ba8161468d2a0291a4dcd684a0a4dc35c4a61e388138d5e24b34f2a2b639d0db8679837ccd2717faa73743d34740ed1f793d3be288a9d8bb42376dd57cbd293088f7654ee7a4cdc3d71d4cbb1309276883811c799facc893decd135e91cff8ea44f748e4fb2a33e9dd3b47b752e2fc5f7ef967819d215fd1378acfa9e691470d793e913b0532984a15a6c5f224964f6fc47f499025130b44665d40aeac2b96733a7f024f144651c36ec00cf1065b2a8cc339549f9445114c5f71c25fe775d1eeb9b6faf89a6288aa60230514d00d7b3e8fbd7b40efafea6d671ec2fa369e8957d2fb1e3dcf5607f1abdf25aff041eebba469614fa62381fb4938647c3e470c093e6f2589f100928924a028a646ea32bfce0fa768228d368aacd7d7b3ec5703dc9703df9d89edd5494327f877b3d34555f58067b3d8eaa93f45c3455b98ccd9a9f6d865ccdfac1f5f30c2e3c436b1bda369b2e4eb1d395138fe73a2d716a9dea773e55c175a4a39f1e2f73e9f5f232cfd0c2f56b8871f696c0d57b826b9da145579d143091894bafd6a15f7f04d43a01b8b774f1e2bcfba82aebc8ec61db83d7741755e2c7bcf4aa78b9d9a073d42026baec66307370af18cc928341e7a83f4cbaac3347ad4d1a2d689d7a85cea11f2405ff34c14eaab53155a8d6b8d84fad0685f1f2f3b28ef155b352a085bb7a26ae4159b0161d348afef698723d00c2164c9f7b713fc074e6e8a6913927f0155a87cb41e7d4660eaecaa4419fe301a65f7fb8c838428c28706837463815c18608355b4c5a600c8126cb8bd98c104a4120014106cb08c5e807e213a10fe803db838f07a22b9e13dd0eb8ad561db40ea55c0e2617e3ac4c525da286d426faedb0b531e240b231d21072de81349c64ed712df1f2abac8b3aa7105d75775321cc5589e1c4a85c8cd69bcf55b81859ebe9737dafb5569b1a375518314ef6d9c9b656d6e38e8593e1c05de9a95d1865b88aa3a83b17cb8fab9b48a51547a3295a5f750947d15aaba8d64a2432d7c0d17dae5d60fa1b12a3ccab358eacd570703147b97f7733dd529d72b2aea67bb9d8e3397ff33a329b3099e717ec71322fa93f47ca484e56657691c2c8c9203f532930a55e30a55b329df15486a7cfc5e8aaf6acb8259ea2140563462a50283815a24cc0b486547dd517a9be6a4f5d62dbeab691c8ae0185fa1d5e9798f535a718a2deda186998c108f6b81e1c37a0b003a0ccf90ce2adc6fb6fad43e3fdb999a3be9379081cb0bf0dcf5d1bee90915bc2c54af305994d7f0399ff865a8346bd5c0e260dfa00b89ccc51f4732e7745760399512fc8fc335456224954068231d7efbe8bd671d9ad3e53c6187ea3e1e735c2b9255e7200075c6d78fa5c8f28dcb1c1865bb12845f45646c6ad5774ce0c7744d36b48a1fc88d1bfba162d964cd105313f4ec0e28394ac60491715a48007f40a0db7ce70db5133d75aad1df1d95d1cb903258aa37a5eea23731495712e2e567b62c0924415ae30810aad185c018b1754e9010b6261b22083a65591a2d5051525b44cc0a2750ce897722228638793e1ceb8b5519308f73b54cc915264b88d67dcc67604ca1062ac42b5566b5c0c27d882179a0839e9220b17903069011724acd0fa81c984b0800b636650032940f9820e1638218b58132ab2c8c2a21fc3a5dc122a4457b5d6be71c5b94a81bd30eda1ab2aebe13171a5deb4322e79391c4c1af4efe5aa5cce4ae7502e071c118c108419d7031f2d4ab0e0d69282305800b8b528e1c15c8c9b2245d463e24acab813171973fdd1519f7255780831723ddca432662ee6c274620e8b97fd83b3cc1f494f16589083295b9cc8021816fdea43572016a0f082169a6c11250b1612194ce10a59964801021890c0bac00ca030c1083d54a410028bbe5f1a73548c7bd3287f9cfb6d6ad44c8fa0d7287f18b736ca9fe676a3bce726660be0699ac1737ee349126104cf4972557ac0827076d7248d18731dfae229fa79cebc31aef985d1d62aa6d62c07b2481dcaf33cdb9c0bc6cef28519ce9c4fe6624cbac0b8168c9de50b5528e783b718aa35a0d8e84af0f65e7d4eb722d0c6d8bdfd40d29dc1b65e19bc5dee09b620d85dba1277b92b7102d3a754d628faeeeeeea2a1f64a235d0de4ee0a31c41077f912eff192d461eeb696243eeea2ab4ac448faee87b4ce8ba7af815ed51a165bccbc27d139eeaad195a7c099c0f467c85cc310835af31660fa1b6cf48de37c924010733152add59a183ca49b68ef318b5f19b93a399f3ae758e38970e662938b4d2ee62eba9a9d9a2ff2dce52a511995350dfa5e27865d7d62fcf15aeb6c880fe1811138f68005d3dfb898a328172b914a24af03c731dc9122e2625d1c45a5b87ec3ad4505335cdf725ec553948b01818b51ea917556699835863b54f246971e13d7e8e99e91f49c61d7847106e739bbc1b30b6a7efd3973148d041d85c47354e30e7b98d8c96c84833b5e76bcfcec78d9d279e7ee9c0c532e4653d46b7df7e9d36f974876bc6089d195bbdc2573676c5e09412787e86a3ef121ba1ad23d673d673d673d673d672f5639748a7e46f9f01c7a0a1f3ad54d7f02f30a9e55307577f72a8b39aa4e98bbbbdf3aa3e03b9f386ac89c75ce39a796145cc136706b490112d8c39db72e736e4ae7d45a6bad73ce397ffc85f3ccf896c0fd56e4565a4b1217defcb9fa5365b4ca884cafb547ef77f874327fad8f875b821463168f8b61ca4d894da9ef358129f704a65970e6a2c09b8c0c770c484c24d890cc400247c26d1e65eccf95c88b2722c3431f8b9e262e090e892d9c7b618e83e171c767ed7f5fd775ddfc32d71a4253dc8eefeef0ecf7bdb5dbb6bdf87a877bf7bb3bc8dc28d38fdc0ff7dd34ec79d4e659eeee56f43bdce67a6bd6dc7567786b28d4bfc9348e1dc5b2fd8befb66d7b41d219f5a13e5dd7755dd7753340fc95379af7e26f3f3232323253f446effef219173877f72fe279e36832fdcb7448e4b485e08f3f43225e3c91f15f90a7edbd4557363ffad05d3ec31cf732a4171b65dc3f5d792853d7d9ef7ea42b93cdd35c2036dff3986c6eb3361a5dd197071b63980b43300c6b4c32a410fbdf7fa41113495b34c5bd255d88a6b847c2b222f3fe4357d5f3ee64d521dab3674f20a22f62e6400aea4db159d1db1598c3db10d7f2e8101d92a9635efcf632bfd15ebcd8689e378e26d33f0a55a3c646a3abea79e36832fda3501b6da3fd0005e11a161ae25a343e55a8c6386f343daa06e9330e9c6b0c4f2e8c2f9e7b1a6e3fefd6c551dcd31fcc5d3a4453dc8f6e6dd5174d71ff71ef5deee716c5461bda681b053d2422f3a59f21113444c890454c4cf3337448f4dcd7165d8d5e7c618e33e1186b60d2774661d23f894422fdf85624faed02118d58323232df3394794fc6f34823566464c417272873f346cb75c8caccec194f403c2b7edfb69142466fdf8e2ccddbed724b388a7b9afbfaa93e9ffd1f462fc2a8551cc59d68be5942271a3248b32a94b1ca609035c63d0cd402c889e6c5130d790a625f7c21f6459ab70f8314e2bdf8226964a4299af71e09cb3e0d0dedb0ccf5169eb7c5b72f447c4b1ab102e38dd417c9a6304821f63dd208a521e91547712ef35a2d4caf951e820a80aca5fffd91faf67ff87e441ea1ff3dc532178716fe66eeac2dbcb9b61ecc4d5c87e88cfa501a05a2b5201ae466ea8339a0d15bf13f99dac5278eecd69221eb50bde2657621eb429e378e26d33f0ae5429863f950cbd5f382611a1b6533e64357e07fcffd04a22befb9399b7425e2708f3b407844effd8ccd31db0fd7e25cdbd016b4d536a08d36856a1bcd3f774da84f478ac4238187c4ab0092d89e9171f20cec567cdf6664140ec1348a7ebe715408c64b11462776f1eb14d28baee664d9d9786ae132027e1db7f0eb35521ffc4eacb900e883d7bf5e127c4a9c30c4b272fa319d14c38841f8c3a18bca127c710f0107356c6d05ebcc73d30c078e1a35de348ea49aa9bb17c7c3f56c633621cec5bdb8275c944d8b6d28ec097948612b5c122e0979c225b6319bd056db6aa12be4095ddb060e85992414f2ecccd0059dc3d2c21e2f7360fae112218fafead78587300897b4a6f7b9fbb4f6f1fc1c04febeffc7a497a957ddebfb481ba38b2f8aad39fdbff7cf5a9204233df9c1f4ab888495c5313eeac06dec463ce63b090e39aa5567610b1c0a5b610b1c02bb0087c02ebc9c61abd2ea0c1cfac194f46ac212fcfd6c2462e2cd7e6296cee95e1e356d32f3f3f97d735ee1a7ca375d3c59d2152f33e8e396e4e1d8fa936674c5e34157ae601aecb42ebee201614d3802a64ffae2ab1e232335e109a64f8a59a0d2412c5eea60fae0162f0730679e4c05faf942f8d72e3b38f9a556d139b47be2df973f5d7e1c456775d2134fd1cfb50ba62fa542a17380ada641bdc481e9d72a5a67d62a85faa592a45747cecffe27be10df4f18e94582892209467a919e905ea4275ecef7392db909d5994766b02793a2d499f7628d7b314cf8c3be18f475c1029e97c320f626c5a01b61a1734c2ef4688c0ea60e70166755706e5a877d6a31b5e89c4e148d938a9534e3221922cd0763c6157214d58213bd287e42df509db2f98d8fcc38e0790317ba571793752f1fe0560345f213917ebc2cbe2a3d25498129290a914866d2144bd6ffc84c12c2b4148235f626af3bd27aa6477dae41a32bd2ab86a551140a674ba34fa32d327ba48d5591084849241291683f41d4eb630607d86a9af8dc5bf1925dd7755dd7915e9e378e26d33f0e1c181693f9cc68f8472c853f1d105d35ab0be2c83a43e51a3878cc2b05fc4f247a7b8f3061d1d7eb7a16387fbaba4c7a855feb874fe96b3609564959ad77ba4cff3b5c04f31104902145c0167d1f990c53b01583c15e987e4ff7f252b443c449fce7de471040e80a7c13596a1aad6935b07deb91235dcdbc7d8faeea5b3b5e2030eaf3cc3cd83d71d49d30582c16ca4e2209a4449ec4903c89e42948fdd20ba95f228d5811dfc80bf24572860c5d344569ae15ef6db61a384453b603ea82bcd948fbc12f9f3b3f8aff499f49536432e98912e9e7c9eed4477677ea83d198e656a1d2adb41775268a3ce3772f3ea9d4836b620f0dc2241a101e6d241fba8241925e3430b2da994bfa3088558291641b5867445210a9268a22e9d591a24b6c892d4c3f0c0a83c2a0a057f7a483612ade1ed62b010a308cdb2c9b9adf60306e9dd114fd995b812a8da6c29f5ac335e431710dc60f161b3f1a1a12e9deb4993af2b481f54733ba820144573363f75486ae4a1f06b5f87666e66b2e90199287e7c587cf43fad2c433b759220c06a3b0d3460201c9d3f6e0236155f2b491a72061f8823c624508cdbff823323ff3e16fa490d2d7afa411127984e65f7c69bc52681ec6b532fa8ee643175d917eac0fbe90fa2069c4caf64664c85357c31e21309e441aa1214f1d790a02feccff50ffc5bff8fa30c8d035b108139f8aa2f8d914d2e80a46f8d33da1dfcd807651307d70c8d5f382c570289bd8741b8b30ba6a564c26faf8d02cf1e67036f3303e7c1e9e174ff3a55226bd6850306e26bd662aadce421f2f3d6f1c4da67f14aa460dfb19072e6262ee699e3e48a3ab99a70f028135ba92f9179fc19fcf6010a619c4b1dcf4bedfca08ad04a8246cd5565555324623220000005315003028100c8783c22179a4c879b10f1480117eae4c7854a4a7590c830621638821030020000020c0401000e02b2b8769b5b15a2457b8ac84e501a720aa00c6199e1330905696a302e0856fe3d55d758f45be186b70b9d18b1bb717c4828a4ac091629d8047bd610557a150cebf384391060f3c0c370f6e5395088ca86f81f3e65215f1caf1e1b587019d56b31687c06b92d79bc6d7c89b977806187072f3ddb655e4a64ed2bdc2d3fa3b945a7ab1ae8a5da0590fb4ff1dba33332ac590ba9453a616d40997be2c6ca14ebe2e99322f70d90c7fe62abf7a1855482f71967eb53d765d1e66a07a73f59d1b8527f36d6242277784d7cc420d7ed420a58721af585c71bb9951aad197e8641214109739ce3d033d2d6a9bc783fc92017766d11a5d2fad7b623ff569fff30641f1c2ae3ed25cfc4152fd302bafb4164f90142f8cea23ecd51f34c50babfa0bbbf223a574f1563fc12efc4ca87db4554f300b3f106a1f6ff593cdd24f94c2c75b7d453b20d629d22bcab59a5ded5d8af472495930068edf3af08c3a359e03e6b020617c3b7b9a79e0a7d0b8c4a23d07d54439570c1f946594aa59351da4c19fdaa9b8456d093be4270652470ff632b5a386be51cc36dda4e1f442d00589ddd825cde043ed440d6250b4f74c1832ed57f0b2198703991495f8b401b7b951a36e5f81f427f40e5ab7019855bb71381b08522351cc0484e669058f6b6a2d50d2a734527fd038f5b6dc9db43ad4f14501014c5c3f8c08f0d313fdb517c0e18f47d4363e71afb972f36eb666a583e98344056f2b293aa24cee0042edd2fd4b9d9e68f6b9d0ce28da91a074b3317e2626219e512c53ccbd62a947148cfc417f3feaeea24e7c2196e8cc890594ffee8e30b2a535d36a904d6fa855b0524a7c5a969e1dc435cba1caa5452c39cd17e2622ed10872e9691e81571a24181e5f74388239a401c0528a29d051b6a0209deb8202cee9e257f30ade48b3383613424715d1438e30b3a28156308373aa00505b99fae818da4adc1bc33a49d60710f2868b6eec0a37a890d8c62625a041256cc8aa598324380636e2f093e8dd27f20d8d07fa732cc886df8ce01bcb49d25943328923e94182cecb4f6fe1279a7d9b0bb890027d151e171573464c735b297e1681656168d257d2ae03e78d898be5276e6e968096671ca37bcc4925535b9f80d8f73c2c212357fe81857d9c07ce55d872ce3b0b2c19fead11e8b6144bb8d9692a3aacab3b087050721f773579d8dfbdb705a68b685ea8a4ab999a9ff60c01c9364dfa539b835aaa553c2d09faf3b79cb6c4a72999ff53523cfeac6c589f540d6368023d611a66fc7b33cfdb00ca2348a420ab76c55119cc4d2a734794a46e14a32d6315a2d066bb87f0b684da2444ca3f84ac7fc78770c62250d01d4095f9306c3ba2428401526dcb35bf58880889c88409d3e558bdeacf0d62e85af33fed2de0455f2343d4140db667399811f582836d38b2e19af1f47863e2617beae4313e6d14c4bd44f5ef06e41e06588c4842e7f2b6bfacf81d50a08679497cacbc823f94d4d9f97fe4813be783b5b34bf2d58a65de052c6d8d5a81d9acc692d0409dfcd72c492eeef3796bc2b6199f043e538338a528c2712a55449e394cb6c53e38ccb3dfc486b5790f64ac9f38f088cf94e243b81062812d04896ab25727a7974b4513409fe233e488976e5ae372c0f29c099c391afe2225e60e9ee6e03286a170cdaf04374c242667f2b5fcc428fa527628454ae6f8b0eadc7a48610ebe4e524861f2ba0b1e25e96e82cf03c865292459af8c4c6736ef8b4baf2212a631c2927eac962d6e738e5b48f513a4134526ccd5291176112be7ca77fb12630e334f467017d42dabe5ae27e3a0c9d503ea0e3bfeccd1b98a7d01502c712eba77951e019a7fef96e3a3f35c493a5e2109b20a4a9b84e466019d6b3beec23de7feb81ef58f57c1282db5875dbc43d7581a8f74fbf16e2efd9e2a1495dde41755073e515171ec84afc61b338f36bb70ae182e155477ba1d95bc1fa77f8d71c054446a4b8cb3f084c479431bfe67ca8de26f24ffd52e923c358c25d25baaeb9e20900f0f052c2ba0f98e3dd4dd9c0495747f2c2c49fb9aaec820e4a3def2ff6005626887ce5e2148252afab86b59c1bb6d55a36be5807eab4d32c0ec4d77afbf44994c246e4d625658dc29629d1795c60a183efd572798c596e21d302b1116564fd4a922279888648b7eb2aef6b400d654748c9bdfc53e967fb0ab1b6d038a867f0367640b4c8452040025e1ed2804709d403031c79c84c0140d58b0c1eb207c5c84560771011f183dfa1b01b5d5e80da0d8aa0ac1ee9366a4ebcdfb54558a2257e100c476a191954a69d09737d4e1ffd8a6eb06dc64264af1e55db8197a4b2174ec5208fa79ddbc4a7d08579433d277c92512eadb8a3d92b1ceea5d85516304713084dbafd35e3279843454cee8653dbf36c3c5727cf3a3c7a1851a7d4bb8c31c349461c32bf3960c7e074dfe0f9df7ab51e5ff05d337cc942949a5150a9565ed7976f21d3be7db2e1d23986121da49cb5fe59328b1e39ff8afdd09caf9e855de2b4688c35d256cf88966c4299ef53fd7b8139fd1fa9489b704671765d8ee35b68dc75f1414cc369eb92d477be84333c10936be7836cd632c4eddef8988bf67d7228e0ce19981b7844784780519c3f28d9c1cb0a57259880502e35cf42ca7dcdcd82462d044126ac774c2b7705f2abd16d1c6c2de21cd50b65cf358c63b6e73f9ae93b046b6d61524bce4535f64fde8ce1cf5a925d7fb44da435254c9a15a5ec5855d2e8ca9281cb6ee7f330efc9365b68821dafd0e01373a91748c5a192944c4b5d18cdaa63426a23b3d9f85ebdc38a46ecabba06eb95266e8260bce9c40d8c2db284f2c06c1e43d8246c698a104a489408f86cca99e325660dc30175012242967c0922c4aa6471e95e2a2e276781de009a7d8d8591323752fa83f3a070802a90600356f2c0ef2f0c337d90b68b52b855439672afa7c0a0c3eb5618da09345b0775f044dc8130a26f5a2564fde7069b8fffd1d75d4fd2c965fd83bb2371ec113cc65a930d3f0dd4ed95115088b1680e5e28328aa7397b2a6fa4eb178a120d85da2c6b951c82af271d7f784ad726170db3a2edc4497890bcb05541027cd439af6bc8d23be714565329fd275378e1b963b7072e18ad490306b104983f99ae85e35929b401b1a14c9b91ad8c56716d6d01ad740e280c6532832bb1b6078eb7c3b99101cc8b0ddb270ef9daf934ae39625a9e380b0b190f4b91d534056aed758944016e240173bdb6b19a184742811a6928fbff53ab927c837fc41df19286e381d6e4dfe3a08c148397d376137be8b2b27d9744171a948066e2345416a89873f7a62073f345f71c1f99879742c5490dc76f2bce5dd5819069dd4ceafe77a9169faf447ccd40dc4ef94dc58d57a2a756581bf90b8c10c18dc02ec16460df1220d8c002caf658165f75347abb16289f964da37adfe6c1cfdccae158c6da14545535b45988d0c763b9cea8a8999f87cbf76b4cea581adb041209a5a63385a5b89b993dbb6c6c580ede41ba59175460a01584260791b91c0a3d1efe87fac12371f048df6b7a2b2da84e3a4a8d8f44109ebcbcb5716113cea5f2ff12a032a09efafa2adb58d0982e5ee94dc232d96f397c30d2144df574eefc6c91cace51488c499d1b650b0c5a515a439ff51a26844c893b9c30f3330ddcb6c29b574be949221f4daa6101add7611978dc1ff9c621a193db391aed293cf2ea8980bb8db27dab96857eb7be6345a7c00f64a023403b3bc377f079c16816ec2dafe2d736eccb0a4c42e188a64fb928a2c2d17aaae1f8eb055f5a4537fffd570a708083e3a8d31799ea162ea2c9bb476500dbfb90beb713c2a016111f1fb8cedbcad45a1786f6524ff6a076dc8d94323b44318eb2265f9df08990c0405b18a25cc9090a9e9fda98c99eea8a4142fbdab42632464f2aa64797498405324dbe03aff3176b3cd3e35f0c52689507022639b3a000099884a8e6b888509f4fb6d7bc011ac8c3914c013bd11b173a29055aa9d9a96349b36094aa54adec7c1d02fcd8ee612554524654742a9bb99a61d8a95c17f593b06b1324c67eacc2c07c1f9ea11a1ec5d157006080f1f43fac1b2ec52957128a18222980bb9aac3e6932b7669d0b8b526e2ffbd1cb252c03454011d0c7edf297a52c9d8b2f98a4e1299a70a7620c77306748652851fb8b7dbda8780da10ad1b6c747dde2e522e01575b840d11c819adaf4943a66b4e1d166ab13697b0b2c2e843b157afaf6a5e878ba5c33cf17a77f80cd37d5d314a8d6d7e1313088429f8dfd1bad15d82868d948734432b6066f73bf0de34255e219f5ea96a26b644c020698c7bfdde0b0643b55091ee90fc9064d04fa7b1d30aad39f120f0fd8e38457cbf0ebcc858653028ca4e6cc1f6137ea5e511994b4a7cf17726e0ed60213e2c301e58ad34491e89528ee9a20163b57c3e0400ac06844b9de4501374032b048eb86dbe7ab58070f6ade2072eab02923fc375bd029557ecc239374cb097dc8d0626e2311d920131441a0d01095a6431336cffec551e0b743b04f07122a57e9d659aa52c6dedec2ce164106e04603012fedac1c3c083f42b282131a8306ab5faee0a3091550c2e5595f8e88f8340354d5510558456c5bb0353f25ae38ceb95fc01e8bc3fb85ae66739c3c2bc37a287bc1dc1811ec15ed01d7a58091cb2d6840fa5184a94e36240264126b02f78909527530038f3782c865a96e7902057b7fb1358eaac769d92c566836ebc2560b1844e5a89ee9a593c62115b0aa3e3682b81fb049ad5a9204d1c012f3531b95c121a174e25a703c2aa1055e750303ac013d12a8b0d28d8c2b8071a89aa2ffa06b15259d4d2a3cf958f851d7ce601df37219528c00fa462fd2bb136d047135e0240ff2993180cd13b07cb410a995c46634a71508df6af1dee1e5711d93062c2f59515a0bfcaded1687b35e34230373490f2aa10f184ecec3b69baa067694b0c7fcc12ed375998c3923702c1e160733ccb873568e4d55ba420ce6387a8c0123acbf42f1f8d47352dcb50dd94f63a11fcce174c8c288812278113a53ba92af5e1c62879b846f7ab2075bd5e0a17caded7aaf60f697088c61ebc56d5ebc0f24f9fef55690f55f3c22d40ef9b91e7f885339a7c1f3fafc299a7934ae32ab10500a80ec24c352c1facbfc6f3fb57e669373ebf79daed29ec4d6718a212cc00c20a55f5267767734806d255c64edba09fdb134f45f142fb8d29b9fa7d95bd898a1e703eb15e55702e61b4bf4ff72e552238b00aeb1e9fe2318ce9e22a25290640f1aabd888cab52d03d5b234a586341b76616389a1cc2ecfcadbd92c9788a309a2a7fb04ed2249212e556a225632ef8785442e483927537fb0df89bd5d028f058bc3aee3773339e7a6ec8a0e20e06d7de7bac78bb61d74a155a7d7c1f96aaa4aa3899dd11162cf6c4452be406b0ce1a66c5a8357f5bf7e1fb22ac5455e31921e796e35b7be032b665b4f13dbba998b2819ad5eea45206290f8e29c429ca4308220e716664f4e1503bc5d6e44054e6d37e77d6b01058e5f6f6dc3b358bebf280ee0813f38e2e954b26176c200d0b08c8896f6fcd165b9abaa891c3203b089f964aa54890beabdc0b02c88e6fafa6bafa2b309a669946c0c84e67eb1476883fab545687f2cf68abdc01e0d308001c117a0d734c5e4f8276ec265ba4015597859419e185f22e6c2439875b846b4e09914316ca11283d6d5ffc7928272b728d60b9d42c35272959a867dd958c60093a4659d8790041c21e785b0c8ca52a81d45e3dbf23b3ed68c2f065ccde147e7e05ffa06b9fa9eabaf4dbc077f703dcd4d81b1db2157d08e548468852de6420844900d712563e42208a53267b68af97a19b6666bd6cefb85bff4e13061838350e562e20710a59b245e2d4366e072963216d70c760cbf47b24ed4b29f881f6854df3f4cc901e976b034ecb34a4e0f93edf96e677ecf74aa2ab8e44c835f0fd9fba414665a7633a38ba96de1a195fa0ead544baa2c6b55cc11115961d7c3639cc14e72e90ca323984b9e4e49ac1be9abab4c674a8974d77112b01e56f05c2d7f8fbcdf2cbc33936602f05ba8957a13f4b581ef1f32274bb617e4fd39a130a9caf0a4820001ed573626b3545dbe799bfbb5fa002c391c9632d10b71f5cebb9654ac5c7b7bf3ce05f83e85303f7050fe3251099efeac80d0dfe499465be1f8a6ad9fe7a0f2ac983a9de6e89768ecc3d0a3ef442d0ce5962a710d23e8d7c46dcaea83ac275c59c5345e077aa201327958ca63e099a6b1b539a034b1a9e9aefd873684c4960a13215571ef37656f56da21f115af6ba75ae3aa5568f194b4d005f312517cda70691dbf4bac523123cad6396a8ea4bbebbe7843ceb4d95c0f7eadb94f642894e99abbe715337b42e281d2cf7ef769e584479c135dc364ade3e4d7a7f5413d485ae13f2259368549c9eb193bfcb605d160be8a1730863f757e91fcb473163f25183922040a2840e1858f570ed2c81c189c8c5f8a8aaca9d2c40c50b65e2ff0514a7f0de22cdea51e55ed2ac66e713cb9ad338d9d7a5a8b480c0dab1587ac5e561b37c1c2701a34e60266f261f6c314fc6fbada68b0891d51e45180ea2b3b70789fc5cee2a88811c1aa84da142c038afd74477a8171485112606c01e3b9c52e3739b0d6f52731014cb8d4d440d266a0b0d0c6c586b573bf6997441720877e3d46b20ff35e18202d11a327439457ab6ff084212981d4222039bf125a13a423ca1881b2e4ee417327fa2e4a6e2868b0f74d1733e01ec73920baca44f30c85dc3b7a410acbd9996bf4070ec7319609f92db3e02f76e79bccf24afd5daae13c21ef8a8b7043b49ddd194780ac90a9f2648c7a8167357a67e979623ec3851789b1e00732c8141f94ea5231c22d87ae77450a33f3bff474499392bbaa3c598a0f31d358c26ee1855634ccef9ee421f71849edbf0bf7722ecb8eba9fcf5e3b958f4ec52d034b73d195b49abcf2418521b18eb4a4899541f3ad587d428fb67a95880bfcaf3e20df626e1f39e95ca5be9cdc5cc4e2ca7794fa0ee73ea6a061741f8ee3dad02cfd4ece939008966e2cbc9d7c6f734de4cc46ff614918aab418cf0180c67f7400c92719fc48015cde48e9abec4e296bc95605b97115f3d98e8146d4eae7ea7dadfecc58ee1349530339dd3d6091e7c246169ae10c7fe5e02e0559d6e6fb49ec042c6eea3d7c514cbd85bffbbbf4c5840376b5ec3307111213036b36b498c88db0181e78b5c8b43047bb3d543f9bc8f96f4d3ebe5ae792038d7b82c8d31e218f66a5624ca68a454fbe2d4963b0afac5e968ac633ba48e60dbffd71d3c5e598a0420b22076eea641c7205fdaf0453d3b8a4bf256bc8b50c244aafcbdcd9da7782415dabd4ba2c4f2cfe8368c07f63ec9c91b93b70647d288962f4598ebeabe329de91f4581efe10cc58c75452dde64f6f2a2c2887463ccf45876b33f36ca4b848f325f0fdf888928149025d0452455fdb719092cbca63701a2d15cfdeca45e965cfcbbc52bc5d66dcfbdc5039c1f3f131a3f034dec6a6171b38113c8b85d228b88c80d7bc907c8d11b1ea99f69483d6c122216de56b3f944d7fbceae2df9cbb0d99fd6617b62476500c32d78001b65d32a5296407ce622af80d1e07e6bd523ea9ddee5751b1737d1d8f7d856cfeb5316b88778f5bdff376c66b45d3b2511be2c876e44947ca7b5770b80792805a48f611cc9d0b141a73c0e3d7cacd7984ac831652e851d524e317d0c8917d11c131da648d3a76b4a5417b96e644a9ce0af31babf68852a87012edc7439ba4c550127f24812043ab6732491a5af813a83c3701a4f5794b857d928153235267136b190e115797274aa12a8f7d49ac683ef5579f63acb9ad9aa71ca156fae383576f1c34e101a7d807305afa9c8c2912b07ef672891a3002cb3c45262c202aec0d312aa8f330b3e851d4e1a5e9b06d0e57deff5c52d493d7fe7e6ee1a03f3033d64b0c2601d5483ce79633960e8378371ed0dd3a4cb9a465bda14b234f628b07f789a22dce6c3c679cc51eccb1135872e891f5b9f10452a0592bcbe9e5aaa33da4415b3993fb6cfbe5c6fb288a03eae50ae4bd09bfd8b90b1ffc282193e8300162ca0e5e0ada4cac44d0d23f5851751552168296496cfc131dac3941f2c70f62b9ee14ab37e013e0bc0840827ef0255fe2aebdeb9dbefa63762638e0b008e42723347bca2a2820c0b20861e4acb250028dce3450179ca92add7c59a005f6a0f7faabd2c977fca17041f6a51971ce41fbe3fda02178f396c5912240841185dc7243695492ca311360f4a2133bd09787be8e1326c3feb3b66fc909a976cf9c66303818333349d28651ccd12036708005625f4fce8dd82b9c2a8dc6fc252f9bd9aae4889813420c323ab5c4b552a48a39e7f6608f4d3e1d1f610338d67211e692ad53ab33d15f299ba8c9052f0a1cb9ad61b89f7c58ad728c4aef4d0a3fcceb63f0c054708af415ac6bb4d3d4ae4600edae468ad5a03a60889b86e726209023c4ae695d456eac403af8a6acb476cf50c3c21c8daff66a8a3dd6ff98bb4c6dfca58317e892e8729571c2b7d51a09e591c4cd5d058f1c5cd813496802cb70ead8aaee76222f80bd7046315a4beececf8abe062812c23b79bd9fd97df4c7fdb8a747881167b73e173d734b07bfc767c28a292b29f947e74cbb17b3e2c6413ca0cc6ef5d44d76fb7b02100e237fe0c6cd8a91d3f46e6bdb535b72172dc269c80dcaa4e83ae4dbb7acdb730a40e9ed13a917a0659c882b11ff77b843d170432bd5f7d583b540725fb648b28b1b79187720b45771c16fdde3b370a849c89408ebb4fee96c83220e62f91e7d2607e2e022ab531456e47cab177ec0a2dcfb643b4667f2085315d53c62cefd9c40b8e49e71cc0f44c4e5830b79fb10fd0c3d58147965657e1c1af943e16904b1e9174eb1e997c100d10bb7afada81e662af6946631a18bddcd6e6a6d56448879993f7e4ead57991523615728dbc4aeefe630d15d6bbc6aab6c03dcec72612f6c16c0bc57797e39793fdefcc433d25a1cb70002da6fdd2154fc11bd1f65430eabd57158c50588ca6820a8fa63c36b7a9f31849cfae94a6037c0d8e4a2ab8564c110b340ea8c9f25de040031e7d022ab5dbf1ed8a7f0ab91de9fa47533192217bfbf955db6ea040f0721c62ff385edbfa4f407036ae3a6d2ab84ac7964dc8801665dc653f905007e657d11192418faaa487f85543f14402b2cbf6cbc8376b34467e90c11b2f58109cd120b9a3c548b16e229bfc8fb03603348af69bca4c05b4be9baee5d9648545fd1aca39585590b640ea4be7fc24d95b98ebeedfaa4ccbddac4910a5c7d93d4d5720f06e2e728048d89e13d7178dbc0176d9db51ec91dc0715405a80d54e813978010092aae6cf106290bb074d0a1c65934dbb8aa0ceee8c2a36674781f5c548d6106de93a17797d650ae090625e4bb65786645d24007a13270a8dd3a7bc5c4ee8200c15e589407def7e93111f35060b8ea1b89307d0190e5b8207d72c13d97e1b2eee06959211d5aaa08a6a425a8d477405fb78ae2346dca09667563e65cc997d3f315ece3f692bcce302463a608eb983330b79bb02c342d2dbd44226af1590e6b5b880ace51cb9f00b1bfe24032e964cbe283169679c2ff728957ab9018a148e4ddf93a056c88cc6ddffa0ce0db8da2589db6a79f4b252beb69cb05a9bd1395eb13478af92c4b2a469369359268439de951bf31eb064f69bfbb276c4f1d6526118752b8ca82553c238a06ff7dbc185e0590a41a51955854e4f994549e42926504d3558a58ab284130397a8f5371ad7bad9d3fc8ba66c1fefe6a2bb5b55bb4c10bcca7c49c88984501867787a16566a1d8006fe5aa8071c57f270754352718fa8c66779f10bc28b46ee201c7f23f76f52096ca61945ea5e6ef24e662113fd3167152e507e21710401471b094de5edfd48e6592a8efc8b13f3461f75d05ad357a66aa16cf5e320958e70d2673cb89255e042af0382a9c285594a31f76ef90901fca6e4a0f7876598ca3a04c1c016dbf6d002a89107f36c9570ec2a5f89dd550806ef3a33beba9629b0e316701c38212eef0c1e0681a87e4ca0d246007315f707b8c00a22e45fcc8010d4eed6019b5956e10378bf6665f099da34113585294885ab068fcb7769aeaca3a57101c64818d9dc99757f68ab6af6b9ee4c324d58b10c0de66ca8a9c9a0ad19914e6b16ad784438fe5691ce47e8dc675e6b577bd92bb276740f6e3ee8fccfedcf724027a7efbebb7882214f6da0d24e358ceb1d7c037acbcf611b0c569e4d8f99951a88862944b63cdd208045d920a1b0dab2005c8f3e4076fa406c0d5c1eb23570d83a67be317ba0b3a888f72432c93f4e6a1941e594b43eb48daffcc00099fb902b4f96c35c27e8ce7de861f46eb3c51a39a29e2a2b048b646f75c4f2dc9c7ba89d4ed20df72ae0c642abcff766ab4c4c96fa46de07b86ab72319520bbc4484dc96567ac7bc6ed3e91c63a57bc5b7a3ff5b7fd7d5ce3558d41e341cbfaaa15531a0b5c3570970cd79c2ef74628d6448d77f65f9c60b04288de2671ffdb2a7892b3b2717e881fc3499ee4c8caa9499fd153285e12d063f7cd98c7e492a92d9b17e7d98e0557b6a4f88d671db5de21ed85312a2cbd6b119124d0f84881e0745cc82a8fb7bac4e83388528bfb901150fe1d1d46d86a291357fb7415001719a7e49ca436a734865b68754d28e943001d218ef2d401435127bfe989f03b8c8618bd845aa3192dbdf1d12d5f859c9042fa9f361f5fe1b0c8e292c07e1b8d436402186bf00289cc5239d93817d97d097df9637d579e1d12160c2f235d482fe5dd1c8e060be773e5fa4c95b425680e0a614c93559e0e98d0b44ce21923030326987a88d063eae7d803ebb43a13273f460cf81d79c22cb2e1a8d10a28076d3a8c8ab03bacf95aff32e4028f5766551fd448f6de0e6816e697e7beda40a7e987b285ce84357500f7de6d78a8fe41103ad07cb9525fc8c842b248bf4eb80951e85b708b0f4d564db3b2a1e0b66709dc84f66d85cb606a0348099b65349e0c23be258232fed91cf3b71e62b647f3063eca3c27738d6bdcc4814515725fb7416d8231ac73808f73346d78a79f95b1e5d829d56de2f4cec4d044ffc1ef29f87888459a63a0638d22bdd04176f6272a59e65bc0bf65d1f6b5d6c4710713fd7cdb4b4ced4cdb185bb945f7e014d0fb987b581334c0e72704210ebc1736b961a6413813ecc122b769a3d8f537a8d6e7484ee864facfaf3f51332bcc2ec88b34dd4db3c1ddc0671dce1ea75c7007a6776d0547760555a2ef36fa081bc43202c1582084207fc9c93d6f160b258bbb016e92d71625f9a760812893cef89e6fd729c151062a0f356d592d1059bdcdfa932a1069c2929e08847ed7ce29fe3207f422c14888c5bfe20695931ed003f0ab5aa59ae1e2891067a36cc5ece7237115a7c65566766496e87e09ba0ad1f7ac189f0c0885be873a20f40e12a60e27fd59a92fd59d41e1ffe683745602d342704f623208a38cfc5f946d074a74bfe9fc15c3bfebf58990588d6d48ab3e04b8064cc2836966d0c0f063688adc6e4fb3fc82d659bf5374de23cf65f1e39dac29b4d5a6df768f26ed7887f33f17ab7f6833cde94be15609dd83e4847ba71ff3f17d5c5c7db5d38b6dd34e967639be6b450fc0304dc588b6b3c6c8ff52260189ea392e098b73fd887ebed8e23ba8773e00b88578def729ef633a63c036e7471cc91ea1d1b045021555c8b0cb8e9c5086cb232a11dfe316d5c421dd80196c9abff98bc9eaa14fa6fbd2585f68da0b97af81266582aa636860745b99173a802ea48f1ba5ca78c88909db0355f80b1831fe3e6709f80570994ce42a01d4f303f46ebf7cf6a88a74b0bd0ce61338c4be800b9bbef3356baa24419cd9883428ef8c2734a187ab01e70357119d9ccc26f6394b5b17231409ec17251efc2c8c9d6cd82a6762e91288bb49c93bc530b23bdf31f472bf89876bce98a813245d8b9df8115cf859964e65d44e2b05b29ffc440d77d4426ff89a48969336760c46e1a3215a3aa072979275a2f5c2798275a89cc966f91bbd6da98f606efd472a18d04354ce9f20038cd108968a9f33e233f3e45b36b5b7287231f3f397714066b10e54f168042c181860520fbce231b8f64cf57f24db74795e4a588ace03ea499430cf44606fa530d1145235e1347146bb7e1f2eef3a3932ca598a92a752324013b5d85538af4e794b3cda0cb9ca75ea0abd034e6f8eb08e2606f9cb1e0b0bd5ee46a8d74028effdba71385cf2b3dcf82614a6ced59f146e8e41be05cf7a3e9d14d6ac810bf26be90c2490c3b337151fcc267e7aefe9c55cf35bcafcdc14499b3ac552cb8885a588fe035ff3e71f42a49338daf6c30a67cba04ab7512cb4ebc4302505b4179b71c474c0a9633f623f64868ee0c8ec4a2cd8fded05faf1c51313fe6a339ae0b27fb5eeaf0bd51687e4718c87498ba24793676572166de9ad9a10d23e7d843a4af419c20dffe6192fdf13821d83aecfaced024d5bbe0a00970976ae998aaa46c0638fccf5ead94f1380edbe152aef069fdbcc99491ab864d089f794933aded2acf49f96aa2febfa9c276e6e58f050da633dd47dec3c9e3f1cc5fac19f5818581775e6c2824f11f705194108ab2e9226829aced50a677e22f2420ac828174e3dd36b0dfe05122ce1a4e7454a9749656e6d829ce77f88782c09ad18a8ede23aeee8edbdb1035f53fa0bcdaf8bb97a496c62a88778a4898f5a354137e786af04b195535928c22410d57a19b08cc0b00ac48d656463bbe0cf5b25f577219f44dcefd05b9cd523519d84004852a346a5894c191923917c42498c3fa36d260a386d836623ae491b9e34ffcd4713927ee3dddc2887f400bc663702613bafb54909cf2581ea60d69ee54638cf8e130c82777287986a7585b493837711cb11ce9af05317689ed589c37b78b804c936491ddce8c8154827c079754aa8100a5746393ba1ec0aaff178d0e5b09a57798dd3c14c3eba104fcc98a677cc59060152a0b003df559ea9aab05b738d9c6e24238c592f2a607a49deaab21691957c36a7824067eb274c4d89291f290d5cc4450a966400815c3d52a97eab5c9d7a53a34a66b688368de325404bf775210c04bacfc54f5de60ed6ef84c26c425c9819796bc1835ffa9bbc7342229fb4b43905e3ec7b2d141177cbb2aed84ae6ee339bf8c3669d9dcc5397aff1bf536ad2985a344ea28501463c31e5b5c3e5767474cc21732d9bf016b3d56e1a244127fa72dcc9ef32da8daa164284fff3423d2b8036c01774cf3651736a60602466e62327b978c4a4cf341713c4d8289038c933ea8bbdf4175e2e59177ad06d1be87ab8794fe65cf22afcb37e5b77a7c18ce5a54b49188e6d897cc991158c2599cafe87d40e6f8b7a4a92f46808c07213626bcb70a6c04540425f43374b96d8e95d95b6b0a11665dc1762114b214b0aa3a9bae7263d94458712592aa2c5d1dd5e8a86d89c099ab293ed39a767500bb5e76a6d44c0966443358e8bb1714655a0335b1518f0c7ccd1db52556b2598f7e68e433f25988ad6b4fc27b3242ec1f2f70adc159d607e9f9d428f53dfa04e91544eb6b728cba8cf924fea4da031b39b083b41479de5eb2ab00abe1e2730fe6da8f2690da044f73d62318808af58c6a84a739a29501fa74b7489f1dc6f053beee097b1690b9298e72873b6aecc1334e7c1232f8305209005e75880559d5f24f51c20630137f5fbc685d4ebfb70a0792fc7edeefd0c7ef1dc940c47601c88988a77e823d0f3ee3d38cebbb2bc728dafd0322fda83a1d212e2142afffa4c30b6d0df2af124ada78373c57104094d724351ce714714bfcc2b1442b37d2aef90381f9d759611cdd0671f3be59736b3f4b2b914f0c97d5ab6e4ebb8262bef559182aac1774e77927cc2434e80fd8ce72e6da6d937c971076f1bcf00e66728cc305d550f262d74a76b189a88d6e5a6a1e7bd166fcc9b376c6099cfaf743749b288da5419591b228ec004f3bdf4bf8f71a2c1106dc34bebd4047719b92995b0da88a7c2f66aa949f93072e43f53c3f565ad383181393d4e8d86d0b29d3fbc83ead17f444277a5f078939a94f2e6e1363f7ec27f5d882fe7e489dba1029e5eba4b530ce28ebf1e4b3e3bfea8b40e3ba255ce0fdd33b96e84685713c854d852095860be39affb67502f80bca183f4ef343521f89d1836900b2abcb692c1378f0a74512b2d29c0e0771af079e3f4ff86c08a90b99dd50db8322219e14966b87da4ce6a4a6fb0947312b4dc98b73b1714d47d9be90702edb583eafb34600784e6f2c255e5e081f75783d359184d0fbd1ecea6c881e77dba427cd19d60f1b8c0c08ccf7433fba403f96afc5b25d1cbef36cf1fbf88ef52badfd0a15f7844a2b6e202724ad22d719ef39b5d72ca02324b12cd95112a23160d29869fa0804a10acc2c279ba89cb0d0cb2a1e38216ac82a99e69af8a0d6078dffea4acba5eefdefbe4a8a4ce33458bda0e40cac2333725f3e917b942e296a11046c4c468b34e31fa0938a7bf59885c6f7418b348b6afa624c901a80b7bf484792e978d2bb12716b57883867123269ea2eca9307d08452d96949833ec6502c005aaf188c3f21027f32c280d1bf51b9220362bbc9b317f2125a115c7152444486d03ed2a30949779411455825df1d994ea2dbc81499464def0c14a0564811bd12585da0ba5203e963fa7090051a43b6d350aa00f09850936e4f1dea7797cb3a94d5921500e7fee87103711848c0a23328dc61647d73dcdcea8352c559d2168f797013c2008a2687ebf236a12f6a2308998707d2abcfa44e519a952ec4113b0220b189f0ed39c2276b713632dcd3a1dd0b82664a4009e85c26426d574dc1969f2eafb2922905750f3f36681432f8a289a8d809875cb281f9edec05133e19acb1562c46f6c2ea0903797edcf4442bb96e939ebf614063aa082a7fde4c6364b7e0d233b0c09b4b7b08dad5bce83185a51a552d2d893b2180afdf70fd805ca13209097e6a4b8c4fe92ed53acb374bfdcd5c663d7d60f111eaff44eec7912691805a4d2f4541ffbd9837005f62e2e8f5b83c3e49b880c82a15f3516af27dda129364745cffc5cacfe003e29cc8e5bb76b94b905c75b63825bbdacdfd703752f354419b84de2819c08f88db26b3d23bfad03f8c4fb6e2372569a9433944e5399bbe3d7984b5a007d7441d8b667bfb49932756b1fad63280d3be7afd20e53925033ad11181f9aba9f98d0c5f65e2d0399021754c9a01e734ade9664045ced519654fae5a2206c6d4b9b1880ee2db016f88f1f6f9f98b3ac85e44e58c1b78fad18c7bf1f5bd61f415ab0693c7336b85a64c8a04108df12cdae8b180c044127098aa48afb12f7dd384e6e44cda86ad6efde7d3c85a3b6f63406194c925bf6650ad2a2d3a93f8864480e6e45d4e2b423974466461a07e4519199bd64624cde34f9a163ec25b16e70d733b9a1b9ed7e0fcacc9d9c4a503f0c087bd4dafdc9d79b88d91759b35dc0c9370c491e1a27104804fcce6b80c29c5de86d1d9fd386f58d97a46c7d06ff0c86df24dc7078306c2d9dc78ea2883056ad4d52f2d70891b55549d06eff22ee81295a3cf0d20b8e865b9200274ef7f37648c55b2fd32ffe176d7666cc4c56d1d6540240eb04edf7c18a9b263eab538bf74333d97f164c81867857a6f814c527ffd240d3d67c0c6534799ee78bd5146ad41763332e41370d58a29cd34477522ba9638942fa14524db60e279608824e7a8f943bb8a448ee95e744bab7fc05f508acebd614995b363f83d620309cff69ef7aca5b3ac728693d4f2172b1cb68dd3affef9ca485bed03b3b45ebfc897059521b482b2f6e1977bf669fe89b9ee619cf764ffb819d5897ba0a971518de3f765f2398c06a4fac5be19555b6240beb0fc7d547d429d48b7960911a9e65ac88038f0a6c9ef03e8cccf1ba246767ba3d7ece89f20d31f51968a0682178a05d045048635944ca0ce456cf4d712aba4714e9b576f4129f59ebf80f44250b96c363c09644eff070b2b71e5ebd49ef495f475f9d780e26a81419589546094a56d05f5e29d40ab9525f129abb412a4835a6b2dde5833e9d3bcabcab3df2fb4ceff8649b87731b890f53f36df91c8caf79e6e59cc5145368528c1f84aee92f4f4feb671004eaa13031b526b91daf6c24b9529e1b067c7a3b84f31ba0eee74213a92ce646aad6b9c2ef4aa30806f5b4b27084b425c214a5055e63b017cee785123d488d2929fa45de901d74bd6fa7f4b6d6a353033a5bd6378213eef822ee4d25e20b21a42e6bdaabc3dc5f710643aa9e5a30679b56506340c175ae33cfb463e605428a52493af6c5f024af9f92da9bb40e0eb220b1c4b97de1fd589cf414013bb5bedcbcf00cf83d153a3d0f4c09d0ba5db483bb0862cc95a9bbdd6956e49aef35ee114f1a2451c3cb9577145fbfd374c022c9ac747a594eb070290f5a00d7cca430ca2c1aad2e8d5470c766e2765fe473d479f670c01d792c3cc9834e4a45df4c330e0990c2c34f12febd9117a56b82387810d77993605bfa9802fc4ff1195a07902fcbc7bfe1c805f1cbd2836ec781f60e388f0d5645fd61cf5941fcc2dd4f89175dc53f7dac0608ade04aa6f78a57a525257c0acd349845fb119e20a387f4a716c78a0407dd838a0930da3fef5fa3ff3b3a7a113467f4d01d305af8c99de15494bdb8c2793a9efc095cb4231646afebc85d64cfc19a888b30e319aaa4a90d9d9ab67c9839cff743a149bf84286848868bd0577ca0305a59b86a7e48ba74dff65e4f148d15492df8b252032f9e4891adc71180dfbb4fae62dc48e335298960439a05d824655423ec8c1e0cb004aa24919349015b9dec28fc8b0723b5411b2d984764af500155158b87ffffb3309109b6c626a85768137d4bb4dd8ff404db3f1addc800ced27c2f4c7aa4c826b0260a9f4b37a643105528b2885d5c2c3aa6f4d40bc7eb9810279682199f048ba4d19a24890317d77e4b95edd68dc89597c04c362aff04454d2b2575e9d860ddd2ea6bdfc86ddf389608df00f3dbdcedafc70eeca64ff7279c7028b7463f90b81fd48c11fd44bafd38583be5f383a78b76405f40d5571da405e971d401eaf9231f5f3a5673f999f0babe149037aab2046321938f50144ea56be6a52dc178fe7742ede0c65ce1481dc46abb0efd7caba5e2fe84e206db34362fa12215de627f529cdf351e6149d700de4c49e940a72fb1602d3e77d97158d2ee0ee12f5fdd0b0f41bd111ff5d41c3fd5009ee082cf39cd110226e589ea8cacbbb1cf5c1f197b3c5fd18e5e9ab44265a0575fd8c8d78a03e7dc20c5da9bb24f4c2816b60968cd4da12033cd221a80e0026e4e6949ab03f78a417bfacf8eb1b39f3daa58910fae19c5a96944fbdd9654518218d92812c9d44b1187e83093fc9edfa10f940438772ca01dd85b8d18a2c80ae4989332d3c01526ab557a5be8276aa9c90cf6e6c193870c5cfb66d0a5482fc790037388e0e506dc8e37451ffe88b647e39dc489a8d343e9ef9b12883520ee31a64988e19340cc0f6653f1a67b8514fc99119d47210b4a15420cfe14c476e9d94558e6a1d7035664fdcee9d4c2b3e2e83d315bb31e574ae2cb64c79d98186c636c846b49780ff234aee255fb1d8da095210322ca1dd943dbc3551ec2192a1ce6c318d2c351ce023b43d29262516cd5c42ef214165f0fb2686ea311a78d20b17ca75148263dff2b76ad03b615dfcb77c9bab86b2958147450c19c8c55a2acb1e03704eef46aa60a5f24aa1ffa7af8b8f5829320c56fc060d7ece5c3c287ba8b66f8d4007b678edb790f0de0c083379bed848ea827b85ce2d7e297303502eaec5ed0a4484dc852e27bbd1da8a6e8db30e6c56e2b8c7202df8efd7d123553754639da6124294219c933b02a440eb307fc14f4c62183824be6cdb62ac531c1958fcc930b759ceb9255c8b2326cbb66b500bba8a1da8dd7e15e82c2ca3fcf5d30dc06150daa3bacb80da321146627a8bdd1d025f1856e19d5c851daa2878e20e517dfddb92e2876ea261d7c35c217b7c235dd0a4d440339112a8b39a3746d2362f310f4c0173d3e2f742ab81396613a30f92858717af7b2a74db57c4c078e93a5011a0e305ae1cad181673719bdac2134f0588d3014ae9b954b964d2a2531c87060003865e01333019f6dc904cb1b9e54cb1038cd220a6d183a97243582cee161b84e8d804840c6993c9779013e4cd755f55243a26b7310f87face5f0a6ae4852873398c8e0758aa4b4b49227f4796855efd980ece42e47d9e090cfeda1b1d08db68c4ffc886f149511ed9c4f639dcd0acc0e09b0ec8bfc15ecca6c0ac752e66d2fbbcc413f6da20cc2010e5009bf25a8bb36f1c2f42af893d36d3ca97fc31c4a659ebd227ff3d0a6846464c4ea6911dd5f63b22e3a67a96bfbe13edd9243605522a0abb543195d0539efd8192bedf25dc35b67ae1e0fc39ee72438813c7b9a0fac1dc20b6d7b0f837e0ca3dc5bf381ee265d2e4956094bed670ba876ff9efacc84c56077d9887962842c91de3401300c636560cf92e10547be6727e5b8781037eb99156b80ae8970d128f0bedb61a5546fafba0c425b05fa6d56f26e4f582799b7270eb76ca49f60d71895c57fc8877d355a82d39147ad21d503940945f659c0a39da825ac90ec05f77fba18f0e65fe58effb7c1b09636773e7c2cd8386857bb633f0a15640284869332e8a2bc76714b206d5b9c02d5e44dd5f22bb1107807000dbd25b42eeed82fa6e0ae3bf5ed201d26871b5ded2de9332f98d212774c91f26ece2921d5a1c8b3fd8461dd57abeced68856b8f73c05a33af8e54dcdf5d9cdae16fe9bf427192b682196a9e58e053500348b6f226fc45c58fce74d63e04c4dea2ac65e56a29636991fa7d33a79aa18029a660968843356cc4013f0845e0f6d9ad143e0642991229cdb83cf587088a51f5d76c1ee215d2a502d729fa4d397dc909185a3a4abe28b6a279374362fe6107731171e5855bca6d1020e88053a402277758b09ff80e5e3485fdd9c5a9144f5c11e2c400681350c0e049f3571f6719aea9b9a92005fff629defcccf19c358bf4191f01080a1c4802810e058b16ca730e1847d43256a4db9f18c219101c25dc453acf9c3edb5b52525ce2a340c054b89e5870f84a94718663a2ec6dcc14dda733a9c005e20fc6cacea15910864a9ce808a78217d83e814ee31e87518b6ccc45fb2543b629e980af36db8e5bcafd8002a15246ccbf986182f809d546f1cfb079894104b10f548b2a38b896ca5bacdefa4fb921a9edf572c015a529c443e984077f522060bd6d851ad932a698b1290df2fde8d4868023df310122d2014a6bc617b9810c1874582b8ee5135ca2484c81ece382cd41374ad7386c071ed1cfbe0183ec14848d31802796788231ca64374ae1301bc5b3cc6830c344fadbf7f217187c0e802a0f64aef588a74c64978823c0dfe71eea99fb796c6bd5b8a8ac09618d89b5cea81f72899474c8a1a43663871b3ab353f6ce70aba7067a22d5410b5cfd7b7dc3d46d8899ac543ee52f3b0acde6d30b0077a209a207a02ca4d1ec934974e2a1b3474a77cafd42475ceac20fc3ffde2cc27eb7951420e5c4f629b8d0010abd436be784b72684b751107bc8a11c978df32ebe854d4e913669641e05d65a52ffecf95b9fb5415dd948387fc8019be23432df1de0bb419f1e14ac9e911b774644df2ec9fc450944fa1a95fe42ed971aff3be074007ad5996791551684501c75f244ee781ac4ceecf4906c93e4e6b2e74984a04f0b1909da6a1a78bd0eb2da32cedc20522e992eaff767826fd014d5d71fd1151ad44fcbbc33c35984f06034ca5bf6f8ce9f050116ba2c6770d0c2af9453a54f538a75b4003e6c14fd38c1ff1e5b2b98c88b46d2677062f59ca150ce3465001a1a09b671acd76835091ab619455619985ed1b38ccf1d8f88e9acb59a2ceaac1ce16e5f1d40c05d5d938615a1a3aea0e31dfd07ab5497b0245b72a0a429a3eeb9294a370672b0f7f3c5358eea67f82c9c349134d032839b9aff9d932a36bc51e2c80d05b411673c911b963a0b0081891718e3f61abbbf9ad57344dbd91e5433f18fe72214a7d2418101f142fdfa22785f2e024ed091e0091b4f675c94da961007b0cb016f8a594a46e2c3dba35530ee853a6ac6177fd7db8b22d3506c83503f32b85db439b30c41a31d76728deb4dd4efb3305a32fff365b0a8922d26e1700cdab25d17df9eb69c6f9d8f182d1f0d17eac033b1b4d2745626dd30584fd28b8f3d032d8feb0013713f3157ec173cf85f3b99b6341698d123c33fd247145487425f984f4744f726fbb2cf9b3c86ca9662e700c105bc179cb44072fc6debccdbfdd7cd95a5e8a7b53b9644cd56fd5dd92a9a731937f2306f88c94d9894ebd705c6ae6123920b9669f710dc150480c3281290223eeef0cd0e817e76ba601c8a56f9d1ec3f0b258ac7730eba2176608da1b58f6aba9c4c2b86141925f53f6b24d5c92a684f18953597b000bc49f1a81878675bfe7054ce40ee7f97a731431a9e6e49599edabc2a131a9ec5d800104659a9f97ff5ef5b83e61e0e388c1799e912b78ee1db9baa5fbde93eb8c23248ac64fb3443f2188ae60b9d8fb38228ef6169beedb5a1f07a94ed89ba585617a86e983370d6c0e63ae270a0c21bd39e5fe97b076377f65f5ba26b7a9395a014f36847782d720d818bed2554fae10340bf87975b231db5c0e4ac9b186af96738f5171d01117b5b5f0337134fc57ea8bbf9efc4a6b0b146b063e930154d863152abbd44b742f2fcbd39a2f48bc3ee4e9e1a9c1f5201f7f60a8bd0984901d27ef3b2cb6768e38239a113a477ad1309cf9dd790159f2afda3d8735aaacc2282a3875120173d935bf9aad78f4b0c721d7c9d297f5718bc44102def9c8b08e1813ad423863ce46cdbc120e00163add7a03ba9e730ccf9e3ffd5e3870f40e96ea6e4dbaebf99d91499650b48bf6ada82be1cb3950c8a53ead3019aae2d580301670e3907da2a496e6c83281314a926aae06e7c74ab2315dd834c77fea2a8fdf670d0ad00d5173e3e925319651ad278da5016d21bb15759f53cb9e21fb0ef269c3eb7bf10b2548ce37b123e8787c59ab9fef99a8f83852bc242088655c185a79ee6f1e7035bd232cf533d4398957808991a952b0ebba3cd488bb7a8d037ca3444958c4fedc2899d3a7c9756ba86d1b8187ca2572ec71049292afb242e356fe063362bd866058fbafd1cb4156a44145e62f04b5344b11ed693b00f3b19f2d104a93005535f54d70c67872aaa6ede134332501d92a836d432fe5d8601984741fdd99edb2a0034efd7dab63f204fe8fe7152f1cdd243c7566c75481335c2c359867575d1464eafbccfc86b19c70e946837e9bff206728e70ab1ff5c34a194ead781e4bf3ad23a6cdd36adc765d93715d0d3351e90cfe2df56b58f4441ed837219c0f720a6d319e6907a3ac909ac4b65ceb888d09aa298348f3fe1fdcdf3cf4647774dcef871e5c31e4f0a60c8201bf8360ee3c45a03e05b4b8b3eff1a0b51dae12dd4080b25814886547b060629e11c5dcadfc608711eae75325fb93323533cc1d5e2a291c5482e5f61b1f5c2a708b4dd9c91c2030be3e158c12d33a852c1235623f03aab587180794126d4f2b783045ce6619cc549d51d1133e65c68821caacd985c4ea1592e531c29d32c001a16dc81bdb6f2117b466f686d0945a5612c87215573f83e151eca21d885a54d16aa861b42da0900f7481ebc6d55f7cf7d58d5cb95e285d3560a098fd8cbf2a468ebb520188d6f7886fd1765a76c3a896f276c435bff3c6f9c0b93c08674a82681a7a3f09680250a17c4f603f2197ce84c47a92b381232189b3dbbb907bb0a9f969d263c38f062428e680764b740a911f6705e040568c533609d9e018f1413d71de4e8811f47becacb8de32d29a3b9de210c8627f69a4f4a29bae42815524bcc73035b5aa2014732449d331b41646d96b766ed86931a8f16e74a7959ea9d59a695d5f82b244df53d72f0cc498a45d5abf1bc2dad49fc016c50100fd5935a432305519eef195affc53c0f419b7eac9b70a8feb891f8bce98a778086974d71769cc9e643dbed2e7527e7f059eacdf25238f744f0a605d4885349aa38d6415b8e7f20f80bf5759aab715c42f46a0cfcc31b841e317e383d154406eb346bf5413cada481f5a1b7c027b6ec957066dfbfd42ef056bb7d6b54b836336d4c89bed350233577ed25db424dfe8e6d8600b33e7f29bd109d596113e56b5cd6147edce973ef9c3a334005e2b1bd8e5c00f55da192b44011c091d4f54315ee6f4b6cc479a39387617df85f40f5674e85b92d6e90f275b2772d2639a8773722e5ffb35dd9897e5cb2378d8326a0f471d686d9e53047ed15ed324078a430964577608360b677b78b423f7a87e735c19e5bc95930aa8893c159bc91af99b520cda343f4874dc41711c20ba274fcbadcb05944aaa6fc2341d6a96189e00477600bf27058212426ee737c0c1386abc3058120afe5c93aa5c8b2c6b583c8f20a5a010eb2f010c09899a9e545e7d02cdc7b5e0d762988ba777b1a214d3f1672b477e697f3f466e69e0a4270f8d450050dc162c178522683e613825c41fcbb9dca28f94070a4c04d0f740eeed2291730433caa13191842f81697e8b6e55b0ec711121e1591643a771f85e7dc206bf0687c59ae8a69f5d23bcac7f96267df38f80754165c1d1d71bae411e604083dc0cd4f248cd83021129d498794de8b92a6b3dc14e6818206b76b9ed2c031a9f620337e700cc2e52fb257b3f5d06805f03918441141ffeea801247c5ca64966bb618cd12095b6261a17ca2c451bdb2dcc7b0d15833e41fb9772805e50e21f642ae21e2e90b4f63d546466c10de86493f56ffbacc7928ade04b878d3149f7eee03ee55e96659fac882eb1e2c3310e1e5248a21470771bce9a72b208cef3daf7a8455cff95e579c864379ee2a26f7462c409b5441dcdfbf3b333058f6c2a8a399006299b634171d1ea9b065adb7399b7dfdf17d8aeff523534fa7d8ba52f49ec94d2d59a63b701f0029f2d20014436b262a075e4395b06181ba353a37d92855e4c795b18acc6293a39ce6dbe04303dd78460d457535e8c4bf951a6a471bcb5a00e233e3b7a35485b8d3054ea305088ead83549abd33e470aaafb8b668b61d64bde7086a20a378d656a7f30fe71f95f282e116835432eff272126bdc312c74b3538019d3a9d2c94994e3590d273adc295fd12bf823c69b8ce02c14a8fe3352999a0c98ed8163279ad24fadccce9d88ffd197447f1f91fc33f5b20dbafc86ae8e89dc3efd53a2466d4c859c0290fde3bca14dbf3bef1f99535dd9293104782773206c7ee09ed6fb10e4936c9d8b86fec820af511ae151769a1913643966d73092b801eeeb1a0531ba8c202ce0873260a813c0c0b9b76d9a90b3ac46bc1523e6956cd1e85bf01ecdddb70b933ccfd8c92dec9cef35951a31b462770e417446372985fe4ad025ffa3bba47734118458e00e8bc9a706aa21dc4affd73d8407e350559ba6c4e941c9841e4d2eca936033744db3ce653372ec4c3c9bbf4137bf951f4dffb5cba17aa6d9035f6458e321980ef8a661e3b7cbc64d30da4522a8d9798084df1b60bc29f672643ff86fc6e0e364698a588ebb7d9bf34d3b9a7ebb78de93712e81705fa0eb69e4911278131f6fd63622fe56bc47b6d3a4d56950ce962fe5eaade0f57730655ea8abf8ade76b65d2f931d066df7a5a755b32c0d4503df6cfc8bbef51fba7f345920db39f9886f56bbb90a09170b65f196dc47ad219634265f4a2efd51c5d40ae5918208f11ea4ffcc2afc46099f984410587075ff49089408b41778c83871050ef6de2b54299864a5f44946f8802e5b359b0723a4d278cef6526c6e6d3550c3801220322c47af03d60e4d111c32277700f199fc87f0ba46bc4b229c24ac4b5aaf8b087da59c1850870422316002e9126f0027ec370928a253c02dd1eae2a0dc01421f0e18051ce8ac8dbf7864fe5d8e609a48f404292011b3c73d44fb270bd81175b6489aa24f1c2fe549b686a31fcd661ff3d8a15eba18463bc08bf51ac256e58d9ae965432f4ca6cade812747158790b5dfb6234249512b252352250c46dbf2384cd9482772b24f5230270083eca9a57c703995c11f95d204710a103f4f7c4a7a94d98ec8f18f10ccba5c6c5cfba113fec12c19f435d87b837d9b87bfe6a1b3305d603827b57ea142be25e3d85c34d79cc0faf6b0caeabf1ee3dd0679bc69fd003f1adf9d2866249167d353d73262786e0383a9cf2ac9e45e97ed20f54fa30e0f4b76446fa9e89dc8979ad53b8c1339448498e0a4e0ddc3fee6a19d133ee2db25c794cbd7339245df20c98e846cb1f41a824b457eb799f665b653f6dca648cf2d2eb5b3a347e10ece05064aaaed90150333c9a025d11fbb7ba82db94440de0f55c69f2965b4a143f81f71cfd3eacf76fb6b2052e8e7ab538c922c122eb3db094e8831b3c41c6afa6c1ca8b37ff8e38c83dcfbd7a6e3e2b52f7932e1ba4c4ba88d450532e975beaf7cead8439d43dd6184765221b9b5116c27b5228c91374697ded7c0df73ad182f44d113068691a1e38e6dda12ea99045217b373764d84c54347a148084a0117c20b6234d2f54fb1298bd763586af6e24a65edefc04f3aa177ddf0c66851f1f2cc5c2c7bcdec514cd2e7394907161977cc027b71ec7807fa0d90df52a9247822ec9906dda0d7e10815feede988ec7317f4b9dcc17e1e95c64f14593f889813e7044e870ddc5a556057676d8ec890e9dfad1605eb14ea1e91293857204810959dfeabcf38f61a488621b0bfdd060fb091fbec1786a0d286570971d5f8903d73733463c01a99990b2440d05b5510459aa4ce116b0e1baa5cac18d46fe0e63dd16662c045233952ad02f73c5adb3df28ec418193a1d0febaeccd90c878a7382b86d85570dce00fb5022b8b18dc3190cd2e4979241d4ee0e0968d05bcb93f26cfed4d69dee28e88904fcdb0266b34a66858c2525cdee9f7fc2058d20cf299297f99dfdc7638265f8cf960d1a8b2449b6ef808c7010a509a54676106b66eae4bbc50d35436f8463b8a16427a6b7d3d199c950d7cc337dd24d49ffd810b892262272f507e6019ccca5fdca7b79592c2c5057e1c8b02d1e6e8652dfa097cf63859831dc30bec6f53217125c8ac2803853ef6cc3ccff71911cd793f3bf529a865183a1fa00c2a791a2c6068d34ec22461ba52eed33fb4b33f718e414051efbf8c91fd9bb7024795d7e7370eea72eb9337ae22a12ab504bf4af70855af027f183430ca53ae16a6c869784fdfe805330dd8f0b8bcd7018d24f39f13480c6a822ad88d1dae36133084dcc97015dfe6bc41c2b224b1be8640815442aae50baefa98dd6d25d2bd8b0ed2ba20e6bce714907f5e6ef7b1b205911b9044e26c54f1a1ae09a8d395f68c82da3d08b2eaff2eb2cfb5cc0ca6b431090e4b3c8bdc685de5fff6cc885638a28f5bb79633ced9baff8c9dd991006ab1e10e3e339b01f322960565e5b7da5baa282cc5b23d5218c7e0cbb46fbfee2e09189496a5e327c58ccd2573f2ca0cd11fec43515574a64f741ab4be0ea88f40e98f4cd16e5cae382f98b6c3a2a584a18818c2257ae8e0dca30d655c7b0307b6b0e7de360e10e8003a9115b8a0b9b8cc463f2dc2e8b1851eb1c823111dab5e38d45128c8b4f63c984aa990b5708669e2a19caf405998f820fef5638821a088bc0494d28ea7203f93908d68ff19bdad02fa461f44256bcc18b748518ec247c709ee95098204ad625cc6576a10c6461a8392ddf7ee84684c76422626de09168a995eacb346e4522bd016ff9a82911da422f45de69d309fb8dcd7e38aaa5e0477f08eca5ca7557132e9a7df87c15a4b67704bbe9012d0c7d2033a05f7d1da59f1f715181ef4334aafb2cd04feeeacc2de62bfc7a13b3505a1a5eb8d4f5dd0347c3672d40df958675d250879c564dc56f7f52c2633bbd233cd5e55fb41d7f02caa5eae4c67b60b0e1a87bcdf9709003f99fcaa87c4b4606da0a99cc8ede07d62f77eea0a4ded2912df9c83f47b0102af465abfb380087f8f926af6a2db9041de04d898895768e75d998a88254561e3a2b139c3169e1bdc26e180cc232e6d62f3ebbbced4043efe7a1ea930ff3ae72f05a20cb5efe1edf003a3baf381197be0bfc8775bc67ff714ec1e4af6b3ea91f246073e8e1163c125c480053c8d1b0de876201bfe3c2b67aeb149e85ea348038374d3d76709f1b9e43d91182cd96921826d209f79b9ec403ab38a0750269de10335cc3218752dcfcbe6305f8d3f479796e5e796840d86c2721028371fd64f67bf13b58cd5dcbc73732c0e057695df2d7b51a22bb11e9af6d100bd5077be3e7200ff34b0eddf20c82b28e96974b24dab505c6a4c58652b1be320089b8cd6ef715b175008f2cd32a83285f64284ccb502a767e018fde8846e61e57fc0b431950a6f985c4774e04810a8f8b2e696bce7922219a271e44d92851fc7e6b7f66c465c15c50a8b8387b24bcf6771f72d3a91435b18f39c8adc9a066dab57b949f284e5f5ecc86702ca64f2e061a3a46c3ae65a07488e34795fc0063e20c16fd2c15a364765e02b373bb907f1181f81525ab6124e0b42a639c44ad3e7526ca091d403b1371fcc17812afa986f6de0706a79b3daceeec75e682b58a2c977e7e2e60ee37c8ad2ee03240cf92059f3cddead4fa012c00be93a3d7a865aa4f985b4315b55d903acca1da5ce39c37f7b4ce6b735716aa940fd8429189220775070dd4947b4c00a23219f86ed49af4824bde54cb3ce520ca32da125669a8519212523425682a7a6395a008fd21e22666b5a2a83430b4af8262fcfd13cb88ec1b3cfdec1344cd36bde20853e1e23a491fc07595eef506abb93ed1d9fbdcd7e4c97f8b1774a510acbf3351164885d8419dfa3cad3594301f1fb8b493331f224eaf95313ade4ff3ac3b245207c65b1c3a5218e11a8d046966ff79e543d9342dce26cc0f847b3337b813484e97653c878e3f0ab050369648abc35d9366d1f58debfcb7666826f9bb7db52ffaf72d7bfb5cce5ac08b02e12a084469718d0597c4a052bcd98914a6986826fc33c682abc59a54003ead8123f29fb73dfc59a16be104225b0506b1f9f2e92d7353523cc4a8ae1795058a8e19dda6a5ba856f3e51faa77f913fc4255f2a071e8dba4f7ad0410651cf1c2e13b949a18122475407133842490be82adeb0a5da1ed6b814bfa471d2e9d12ac24afdc61153deded135afe4094159fe09cb505f0f6cc90b862340349fc8ea32108aba9ff6a618786c12910bff32e39953e165ec287e19cccf804b01efbdeb73d081e16e967583693842fd9395abfecb9d513bef39802e3c5c0847772b61c3f4d17835ce814fa6b077d6a3eba09c852b41c152e36d9314a12f83e751ea08f2fd2bec1bcb43ff3fa45f4804c6a80b44a31fbc06cd9652b6e76778307a75e13c0a5863ddf30b5c80e8b194763204209e2759404ba37b3881da740c3aff88f26753b8ae2526fb609a0689e5aa20f94657a56e79427c016be5bc9a91f438d4106782f531d0fda2efab10f016551806fcbd3869f2f8db5ddd819e81bd6d027747aaeecf89914eb3d544c29010b7dd91238100f1d354e87519fdf4c15bc8d0d15d53130a37e077151f1dd748842cb8baccdccf6819c678eb6ce6b2b03786db49c314b0bad4ddc555a9fd6a91fe54beb0804a8e886156c8dce1c6e37b64419b5b25b1428d540abc565e2167274ba6dac76934b6c34c73093295d0c84c9daef805ce05de0133182ac89d970f09d3b60e32131647c716748afad50e2deb592fd48ffeff216f5b6041547eddfd941797387e47c3813256af5b6b11eb51031081afc2de3f86c88249771e7ed5b446e9975d60c4b8dda956147ab398d9dc93ab7cb26ba06900295d9b57bf8f7718ed0adddb10cace913dec60941351a0b4970200863d35157141f88135b90bb3c66e2bcae3fa042ca1ee53acc23d9ff9a1e7aa75bac15c55b8744c10be54609f1fa906f69ed26239d500f2f44671ff6b111733d33dc1928c3e67f9b4451bf022f9d12b1a746fb1956e41528864a6dcf78b25f9e97ada66b947429eee50c042e7cc7c8548f437b227a773f1405a7d31d7e079c3d8e2d1016050fdca084a4ad4ec42d1a5a244d884596738198802c5e579638991921fc23aa302010040e78297186a44200df162460ec2474fc477a982c7094bd4e2c63352515dc6067fd1d9b8714d5dbe6146750601bcd034f6ffcdca6f6c45d2d610afce88af5db1316fdd83fbbf0c0ee6737942df0255ff62c3bd346f218bcb2a3700a5bdc5e890a694f6c12651ff647c43f830b06ecd553527de8b2acf78b5e2986fc89d5de2183fbea7367054feed41a13130ba7ec287c5bee7f11f0c9c3c840ddd063d752db25b1fa47185136324d63cd827654e813b491a1ec18f65f33921842771563f47044c494ceb3e07a429c405ab4aac3dceeafd2c17f9010b5a21d84329a5e99f053767eb62dcf5aec10e9f3ec96f0542c61e1768be520e3fedd67aa160f4d44f996e5fa9f9c142a6ebc94c4fb462400318b17f543abb6a816b1f0ec1c4808a1036d3651d216695eb9371f586f3e7b0c9d874ba55c85281169bc4a0b9297ed9b312ee1bc70b2e4a57f563a8676780d2846dddcc592d3af8209adffbea9a9d2d422956c4791aa88ec5ea0b3fc00f0880fcb86ddaca78b4745c8bd18ea602ad033796657d6ef6edda0aea8bac5518bac94284d437a3701035fd7ede4a6b6b84c90a02d236c724ee96e2f6adda5459540442dcdaa52a51452cba8d17723d121716b70ada2c21e2115029c16dadf416a698400b6dcba2c130db5277b9049b81c352835bccd7af89a35ecc03e5f3b6a36dc944f9060fc26c9ba4d2e4261f104d23714e92ca4ee889ad366501e1826ab5cbd4a0fdbbf5e79210565a75017e6d049118e6058c87eaee25928d74a8de1360c25f9ed31fdd438f8c370a8b7eb292b563a428aaa9821d7d08d7ff7b9d8bdc4085276c69af24d4188d0d770a2a93f2823fae28b4de99848bd34b2874d802daea78a51d3a9f717c787b12ca78474f6284248078d7e00c6641c3995003fae6f60231c86df1353ec907c1a937b0b4ecf0b5d1ec5030b5de9f042dfd5ed68f0edd0352b28a1301a2534c6c1a9e6abb8eb31a8aca7488fc555ccd4a519049cd781c0bd5950fbce528c4e1d785e0f426b4409ab1463172d9e83a98a123e295b9cc096c62bea0362c55a246b94ed3293bfcd85460b42cd5ee7c3fb5c847afa4771550d4399b50701dd5fae88adc05e7b60c44f9678957a9d89d0cdfba1d68c3089bf1d4f7c4a93fe56fd5e59613e61835149b9e555d8a75706e18f5eaf8988d7c5958634768a05e3118deebb4f6b81d728843149402c4209c3f98c564ca329289b090daf207f3f29c4a0f9efa7660e4df368fcf7f0251b4394e4e9e04b138982e871880e21690f007bfd712c34d619294359375e82c9d7da3fabf1299c763afc9fcc7a44b084eed363715cf206676f0058f650167dc70391cd1eca32d7ad6e464e2c1562c17daa9bf310b606c16ff125115ca126cfc0bc42dcd9ca9bcb3c242dae7d71b5131404a7743c8c0b338e412bf91f2b1a6f3132f7bb41bd203db12c290834f44c46c1b859baf275248b9aa96de535278556500ce46babd638eaeb8415624c948d569145051ed5cf99d9e98d13ab93e3980355ad1bed8c682d1de8fa05c0af78e5d85ac55b10a15b71511e89a25958139a5d1efb8b871c905ba615297e0ed22f07589f9d7c41bdcc44cb8171416da19e3f6bc5be2280b3fc636abd6d1514ab86a670b9c38425fb64cbf64219a55524ae666cdb7ca8528567b210a27cc30efc19790ecc446132a8ca804b5ff4d80801622d04f4312467c8ff01a37b6fd6972dd0551ae41c56340677d7ea78be07c019770b338168f84fd0219b3656ffa19a202b41ff65a0c9e475b39ab4d6c175086341df6d4d1091d46d530ae70019bb9a68e8e1656b80adb5e9b042f525e5ef52fa9180139c7860899cce33da37470015ad204391b702caf62b0a77beaebe20cc203b5d9725a0d9709b683180907b105a21f935dac0088512570f2c4caa2ce3de3a52cb86940c680adba699bb75790e1d5b67211f17a26889e09003613293ca4c6a604cdbf8c8e16214ebe3d93ad3992f137eb00198a2619bb377ec81ad87c33924c9f7ceb39b72f5f82127d23ed95558eabf2a6913db744b143737dcca563e9575c3d1023d3be03fc9305a0241382c848c48fabf86e49a3091a1286c616a1a2f582d245a8a26453df3a089913cf39fafca9e338c575f289fdb2988dea2753f98b9f2ff5bcf0dabc1f921e3378620e7a0c9d331ddc2367bfe95ba99608d05d5f8e735eb11f27ed2e2338d6620007d117ae47c76a6df13431dd05b9d8449f3e1b032e37956864a53310a72aa76c4ad7038bab64f942b75cd3298d37ce93b934cdc8fadf91edad8dc235100c00b5c57d35a6189e48af17c9aae53b591d02c82a8c8ec0f872ce6f11e26237542f053888d6817c8c0634a7ee46b128b6305bac737c04e56933449472b899ec0e9721a42eb598699ddcdaf3fe9366182513859d2b08e97949f1254033884be9ff310137773e84683a4294199890c081807374a8ea10ac5a8459d5d86c8490b49f302c8388969938dfe0325f7fd958dbc267535cd289336666cdbcf8b1b986961a8e316f3ab9097ca66961de015976a168e98b3b939027c76af578146d0bac1d70805b907cfe1c6ab0952b5475b9c5b01c7900afd99a843cdb3227d46bff4b875256bcfbaad91faafe40d7b291f5ee5c9fd028b223c64f78feb683bd6327e54b1338b4e44baf52a7f82469b89745fa09956352b62271df87fa11f14fcd85304892c894c05e4c279d125e88a8bafa902a8da904a61f599ae8eb809035e7a86f2ae27df46f5713fc6616ee3e914123857ed78f2836008936d3965a35c4ecaa31c7d04c490368c8f4577751750516d3b4fbfe149bdde0f5afb0254badee7fe029d2fb35beec61b771070e4d5e979e7df7123927939b6410e77f5a68cb801a1ee2d4e1d4859d08185939932d1746a527ba401293581e274e60b06d019a7267a45fbe7d85386412758fb140672dd41e0f6a96a7521948922dc437a390bad2f31555e22766153d003645cf32a6ae0c216f32aafd991ff017a17d711ede11e6936bbdc842fc4f8295cb9d78191937aac8cc9c6976ff47b8f65b1664a78ad1b89a4034a93f6beb5954ca63f8824d16a16366deea55b5c2bb71f933187e2f686481b62d5dd87afd08e686f7d0edcf35ed281739a1c5ae2677204595aa7de719be88180b8331e5e0952ba00d89f300fc5073671ac9de29c990d82aee39e64fee2b4af0e6705cbc920b646f4d8df0b47564d41adfc524013d86c1b38bc5e3e12fd305b95381a5e2ce8fc53157056ac67adf8950148a28ad2edf53a6c843398c790dfd24a975da6cc3119dbe3513c15cc806a8087a6e0a9163e33577558b2df85b92efc736450ed024745563d5de4207b66544096e6bd9bbca76eb2d0f1d8c5b28673e9fe943bbf80ce326088c98c5e6fbcb251d02b5ba952016a49e08fe0e0ec9951371a1c8a1b204128370ce9be78f28d190dcaec750c28b76d0a408b47ff4356bcab8265eae3ae570ece685fa9ee6e1564212c95b6a8ada71bb24a3ddba5a101f49ddd7c4f6968d579854e0b1db1461c526918f99b93657e689738fa263a51a581ae48d7c9287c30486b9836548b110939a5504d28a48e785e697c07c487a19f51acdfc7958feef92bb5e61bbf429e27ff5aaf29c76f543a544644017764f9d304c32e8047e2df19b0a387246db529e3d766f693765649090c00a7e0db46693629266b9121b9c227d6fbbc68d1cdee561f215e35d8cdaf40697f5b939af55b43cdd25cf1eb17b1a113344ab08bb10af5f1e4cb516651e6176b5b54d1d7b00d22eff98394dcf2fcef0853913825e24e0a34ff47e48fea5c96960675095c1ae67e8aa940e1bb25feb9a83ff45f16148f3ad0670289333fffe354bbe8d10f3d113a83754941cb68b845b0368f6f74d6e6e2926131ccc8b9e586166141adad375cebd78554f5eca88b846e13da460805b1acd61cc58eadeaa82960d26aa1b76a199f90a536562261adf7e15b49cc6966cc760aa5de7936fbe02f82846a720aea1e80c5619e6e3a2963bb814004e734f7de09c63dd162e02164154f5cef99ec76dfc34c20f98ec2948af005246bc565836afca237154088681561c096c96de2bb9cbd82589ba7a56967666843ef826d06a26c7229757b32139b7a4cdc3520c3fb28699cfb7c95de631e5a1f9735fe0168be9cd504cf3de718a6e65aa6f7f3831ab4873919c219e3fb6fb98297c194a6315de16235c618eec9c30986682233143f4047d0e01570eb48cfbce0b5f62d6760f698b8513327c1a4b41133a9331226981d2d43ea2a73aa9032998c371f57954c1886e7252664b213822ea6ea98308cd14b8d8cc92758ba882aa6f78b4a09d31031f1f73646006b344c154debb559c2d4477c5d040aa62b774a07d31630fdd01b6f005dc9f0263e6ea7807cc98ff1e2b81ce0a91795275f5df7ab9878d9c6bcb78588974aeabecfdadaa58a24f8d2942e3da37efc56f3e31ee532f7627c02225ca09e22cf4cdd9217335901cff1c307001c09b9da3c5bb56499f3f5d80ffae3365a26f74bbf54394bee47f509565908349a1da78ad51d0ba32ded797558f2337bd4bf010a3560c30196bc0cd78765c5e0bcc2b7c0ac5c045570d0e427f41520cbb76816af0ce5e00c6a4b44df2027f7d5c0f84732f161a9aca54f1f8bb95ea5d9f2897a0e3df4152ff1c970c3ed0ff1f7eacb52e85f577f248e605f7d7402a6cdea7f3053c957df025a66547db878467af54ffa5563d5e791433c541f18387bbefa87fc289ed5e70610cd579f05b849a8fa1fd774f6ea631b48d8f51d4b1ec1f537ffd8e5d75fd555445c5f32280e5d9f4cc82ebffea8562d767d3819f9e0facc4296fdf53ff9f499d7f70649f4d7c71e6a175d7fd54b11bfbecca038bb3e3900bbe0fa835a5afcf5416af2cdebf30559f6d7ffc4d7075ddf5b26d1af8f7da45dbbfe5a0e45e0fa220371fefa440476cdeb4f6569f1d70789cb87aecf3766d9afff95571fbbbe6f8844b83ee611bbfefa23b6e758005b7bec77103b4efe79ebb12072f882719f91f032b782d45f185ba71a6f0745ab978e03393f93c60716fab463e89ccd7066b2b5f9fa6a4be02755c934077a08541cb65d7a4503860bca6bf786ebcd6a11e3518c9f8b0ea2d6daa56bf58526c73254e99f25da183178cbbdfe3924680af344631cb2bba0df6c142a9c3c4fc93dabd082f776339bdbf13e3cba602db3135b9c2bdf0c050c66f5ae4f5d6dc3c95cdbc2da2d52cf0e91836266b5edbc01261d0b228ffc632700a3139531ca2b0b63d8cf0d0203e8fe13b49fdec864adee448a0b521752617d0066e4303e9c94d65b237e1d008e0b041b25c8fee6cc96c30641d6898e68658878dfda8ef769439526e76d9fcb166625827b717380ac5af57a615c404457e8a100759bfb90066850e8f805006549eb0da8b53e18e49e5e893752a6766b9d22edf911df35ec93a3cc4a433d9383110af72e191eafde6e036ac8c7c558281ccf4451dd00a6be64ddcfef1e2d121a74bc90e7e8ee5d72303011d11027e4108036fad0eb089fac89c2462e46ae4631a13867441a8589a228f257ddb201c53368be5b2660cb9ae9f3bbc52c137904de7fa9702cf0169a9bb94fb8d13c86dce313a36ae0609d099767d3ed1875364a7d3f7a96002c31a408d90a07311c329f52eea16f5c2fbcc386947a6188bcb7ee02d7d4a8e380fdfceed8bff2cc7ba085282cabcd55010d9d7243b3ba212231ba098bad35094d1adb69c597a8becef7285d07763fed0ff21a5eb0d7fc825fe31bfc1a7f90d7f082bde617fc1adfe0d7f883bc8617ec35bfe0f2127152ee3ad6b5701715cdd257d274ad165c39c9c2a468e94fadc5e4072d6e398f4231f384921506211f5055f494599649272d4d0a92efd9ec4443114006797907e554046e12a4b74b93f4b203045d97870b486c5ff42f2459f4255d442997765d1f60d0a4c9e64a3de954870798286fa3b1ae5e38d4e440664abbd4ac83174e2685f87474e4df7cba8077761a3b46657a70d89a9078889e12bc3d1af332a558e586b44165c1d8996a7b561c265cf485c40ef41a0de5acbdb0ac0df68f791a72774280a14ed2287386d7839f89e10c4c08da7cc2150b2c8e61547dfcf191e7337bd9408f2fa84b6f5454590ffa773154d467fb97123f1529af499873490bd7ca946bd8c3aaa1dcc78cf38b1ef31339285cf2ba8f39095bb9065280421c6b3978b7c9cb3c62976ee72c07947492235ddeb708d6acd9afac9996c234ad24382984955458714354172b0c805176f971acf6bf3a4edbdf0718ec251e07bbdc8c55453c6698737ca8e01dbbac1225c5bc5bda654d0ee24127962055e67fac460c0ca406b0fe2ea76a3232cd824407fde5e2cb4d9708a7255a7aa712f3bbf1d0ba1c5761de3f194dbefe0fdff3c3bcb2ae5354d4b91cf632e6122ddf58c0f5a0d30cd4b1eb5bac33ff25d882be5278926d251f35dbc37633b1ff1cea809700d4b0a8557c58b25974ba27eaa27ad53fb3912e009f541386ae63c813692d79920c912d5fa0c31bd58c73be5842e363b2d0768603452c987cb1e17382b6efb1ef82531f34c9c0b32fe2ff72f4904ed8f03846807c74ef6b12b30f6fd64d7164755aa32dc9021d4d8973c2f9ad41ac80080c1b4d9860373e0210ddce2877b1a180bb930981167c3ab3f0677e0ccbf6444e5c9185350474d473f6b7d7eed3016ee35ec0fb40787203338c68ccebcebc72fef3f6d101e2334655946ded208713d6598099d6032088b90c49404d6ef9dafccf385bb9298994ded99901b4906415c2cfc8cf110efb78b8b993bca0f968de8e35104cf1b440f01931eec25fb2f740deb0f6c1de1977e12fd97b206f58fb60ef8cbbf097ec3d9037ac7db077c65df84bf61ec81bd63ed83be32efc257b0fe40d6b1fec9d7117fe92bd07f286b50ff6ceb80b7fc9de0379c3da077b67dc85bf64ef29d94304d7fcf0189260da9909a950ee298354200b3c5513fa5593f46bbca254cf1e2ede4d6378deebc9ec17e4626478ea1fed2567c828646056519d0244648374ecc9568168b26b6a3ac1f80894cc4e648fc1bb42d937b1dd6fae03914d6c7a09c4bfc984b27dd1d8e79e194d0c6c6b81ea6000ea350d1f0f17d03a3d5ff07f30434b42f5bc44dc61c4a120a972fc7f3afa8072cab3a8360cbdc2e18629f98d7da53a69fbc2abeb4d8bfacce8228738d0d1fec47d4f97ea08da8723e879b047af7af4db17af01679061c0d06b1e3e19b53f74c4da1a65baa4e3081aab2555433b45312dd7399796eb48b3ebbf53c46617ef7a5b357a0c1ab0b8ca7184c4bce21507372fe74290e15bddf3767182f1209ac63570c1aa149d56b221087f3b2a7f80f13c5b5448dce2271d8db36f6bce7c29176be27701295ad563d9bdbac4c5ae721cc4be2c8d7402e352e3fc2f2621abfbad9cf7cb39c87a47e3e0eb3a3b5fcecd9afb92529d4b57167a90e1508e236ad716551de719658cc9a13abfc81631a37a1086960d1fd274f8d3741034f847f7ed8f961af7d1e883ef198fb234a82cea89ebeeeb10161ae8f01a25e68e613533130fc0c2a1637b2eb066f16143b4fa74216dc88e83729ca004d7f86bc5b3dea92aab5e8743a6847a861ae0424df9a9bd8120d8138ac636381780acdf15939bb2a4703e57c48dfc13709a3e09f6823dd07e12801337c5dfd007c24c2139f5d30c1d6362fe24207119a88da874b0114f749d8651a844b3d923c3c5b095a7957097ef601cd60ffb8d370fba990e62fa69d891f6c377e34440bc961feb7f043f11b6da748c574406c68377a88a4b1337871341b68976012da32358b8293ef56f2274e4860a2b0b0f6006ecb34d1d8a67fa9c9d0978086a303ff1999d1d3e30d70ed530ea8ab71bf1418c527b94084230c4024929e08ed4a59ab3631e11642cf38a61b2418c7e843c4a83245761121b5098ec470024ba0220eb0a10e70b205529acba3d2b8fa2e6e3a42ed0403a8ab968dbaa43708ec35b6c4eaaea17e7a612994b51423be870f5cd9154021d04ea8b1728f86224a7c16e17d853770f4dc2ac195166912586914d7c3f3f6619e65f33c56ef34b43809a2ef5dfb6736d33cb6511e0d2df329d59fa7e65c6c855949ba9ff629ff1f9efa279b44e16b90dbb9e2c3961cce666e07b28be534c3c8c6b31fe02eacd532accd9349734e47a072c6d0be5f5b46c6f87ae37897cded4506df9e0e99b6653df84547d53ce57756b7d1346efb2754efa547a38c9f7aee7cf83b25f9f837e9b96ae6e93c1a56dd32c2a6e4215c84de5216eca77b39b7a45f046bbb07a345b63e33973f45c17a621dd643ffbd3ff6d24a1d72db040de813b4acde2e833292373c447cc8f7323788d89f9a406a4e60b7d41500f2610b342086e7e088c13751cda16872d38cdda3763686f2ea1cfa6b24b6a5e24b3063831689fcabb93a8362a6f09d2aede2ef4d8564daadf032baa7dfb6fe8e66e86a0e18514f965586ada36a28cb88ec411c17d81ab36a794565e540ec0803730dd413b0ba77ca7f61aa19a72a2add13f76eaa15b810248fc0d246f7b6907f8468bbb37737056a0277ce1ce5595b85b59aa6aa98c946515af2f060e22bcb56f5169473f93e98936441302f2a201e6d235f851342362a65f202a9ce8f3f360473b748531ae5213cb0e71099a303de141d9ba6c5f29e5f884d62593e47b8a71ef63e914d082a2367b75a75eb1c62aec433388060e9a34683b18a45527d0401774026c252acb1ff9f7c41cc9dc6d551be4bc87d3531e7e6e291c04acdd040e01c4470c53205a594d3ac9eb04ae8793c0e83f9590f89734ba4c97cbb740ee04119d5bba50f8ac2deadaffdd1db2d699d02d1a27b05bfd73e71bc6099937b3535ee6a5d8d16f061b7452c59bad926d8448239becbdb7943b140c240c420cff826cd7f452bcd2f4edd564b5633aa6f7a1c97e250efb66790594e4c10ccbe4318951cb2be09ad9b50cac3c5135e019ab07f392ba9f6ae5ca9d1bcf293823ffd5dc0e82e2c0a9032a1ee89630092931c135b10dd13e40229281a03a8185804e11cc3947206591f8a2d6ab5e20ce7c8d73d238b19bf9afc2f99d59b339eb9c335ad985bac1c8334e6ea964a848585649197d0253c9393f6f70e455e3c227b0e0c9a540ed62a2cfc4900af321dd958fa7550a392902c46f7493aee2046bad9502c130ef3bd98fbd296efce96b26b6a393a11b9b4419f690db61eb26e37222a1fbe1ccf2ecc9d6b03387bd8f713b62921b9d5c9dd66cb8868fc9caf2c41393b43ca253081da1fb24353a3292b5cad724cd9232fad01a5c6343a9acc135dd1f8f4e84b7e30dd4419bb420e8ca5cf8841618b93109763ae4680dae913f3d5d366cd91d734f52c6291d8fa2163d66be62bf1c77e56de4026556568e3a8c2b5ff9a7da54706605354f27d46cb56c0dae99672f9ebc9a4f8f668526954add0cdd0a8d57e3d19e19ef0b92e3ca7ce586176fd0dd38c3a18391a28381f1c1f3bc6b36ba93f4e13a150a046be219dee63c6643c77dca63de8e0ebad353efce678853bac4780d70e6ab4058973f1dbc7ce1cccc21e72366a607ea7cf96306c3de3a73c73c4efab43c89a4e4f18e13b7e3741b5def3841aeadadf4b614d95c42e61559e21b7277fa41b68b825cc3359fbca8160f94fd66b2a376c9d7eb76eba86b2d4f1e35cb28f2c04a91bdd5dee478f0516f65d1371945d9d45873ad32ec525fa7219c495d2736b7e3742da6bcea7d3c57769eecbc2f754f5e0c4743c33a7d73467031ce355739dbaf746a8da0b13bfdd4697b333f662e539e9cd769140a65bf2017754d63ecedb52e5b1ae61dab18fbb0398dd4db5bfdb0398dd348ddc6b247e9b1256eaa65bf2037758e089ee168fa3160ae31e723c5c7bc3ea7b04f0c3bf3c4d3e9d47c3a3503915ea540d84a3883bdad8433547e7245d41061efc3cc275700be354f795fb70d92f2e19003527369776ade762706aadf9d7a5f8d9d31debd1fc3421677fa5629d921f1d29cd2bc69dea791974c99ca338d64ca32e67d693f6a145327e783ed09e6a7d363b0b35781f0ab149d0ffe2906f3b0985a83784abed56a3d080fb64c0bb64cca7e5527cad3679c3d227c31dbdc0f989fce9c8f180fdee680cccbb9458e472a954aa5a69c16f5eed2f216e3c19d989fae693e529f3da6979a73ce09a4f5994f2f15a7978a7997e2b931efea8679a7c7c45814f6551ebc870babf77a9ecb1c8f945df948a5d847eb33871cc65e5dfd687de633b66581d46316b312cec84f46d9ef897b7a778a39793033bc2fc8ed2e8dda075ba3f3be791bcc25e763e5c258e923dbd2b84eeb441a9e8c188fb23cea06a3daacd85517173ec10852668d3596c67e7228c65b9f5ecb032726baafceffe0ad6a4e73d4b56fc8bc729ea1a335f519efe3b933676e07058a37590ce25f175b7dd2cbed7fa97eaa0776799ecbde277f9bc6796e0f999786adc135a9d475e28ca7f294573a166463739bb7bc1a4f08df3e8db7faf1c351ffe1a84f337452868a476dbc9818db653c6a81f24a2d7a243513c4a44950d00e2026da4442d7a2415ad4a299af691be47aa8bce65ac963a69739fa1f84427da400a980f30f5e013f6885ebe6df101700b70fbf9cdb37b729105cdf8ddb56de8cfb41ba5db91edd5ba5dbc01a9c93a45da51dcc30bcce87e7e204f06efec3c379115e8e1be1e5e478463c8757c471bc1fbff10870179e8f4bcff4ce83711c1ea6413ed5191fcbbe33ce2766663a6346774c149a9e71b66d04f619d7e9f6349e5066944934a50041d5024fafdee9480b222962f02106866fc33998fd6cf4b91f8fd31a9c530740e3019961bfbe7ccf7e7db198e4d25abb2e8886c6d649d3a739e466c8a176b9aee3f1d209d0c5f278a90476fdf1b208d0e54922ec78f461056505e14bdf17445c13ffe2b05d02f8c7c362e77f437a86fd41df18b52b9a9f6451008600800f3e0784dff4369cd3a7d605a6858e889fa4c6f5e853bb433fe3240ec856836b2414194481e2d51182fed483083ba46f3d8f9855fb4adfc37e37eee92e3cec27ef89dec509e5e46ad49bf05e1a8f2f46e7c56866d81a5c73b21d856ba4b0c40067e277646133004f5e001e8eebf072eef2729cc5c3f9bd9b7b9e8b779bcd2b263bcaccaaa76352be9341946ff3af6359203667fa3a6112b6ed098573a60ff6eb19857326165c131fe5c669044324068833dd0067a470cecca28873e651d19d53b8060bce995a704d3c6b1ab901e24c3dc0992c38676ec135f18dc58dafa182aebfff025d2cefafc01cead32ad0e5bd4f82ae19ef47e8f2e1fd12cc9150608e0cfab2a6405c3364ce396fd017d750237409d7c4cba27b95ce5b84b84d194ec79aebec0fccd6e01afec9f5d7354297c832e85023422cb9f1f3686ac1730ae7c8203dc4cf2d38870205c07e7d87d0e2da1c00536e7c0dcec15ebf21f3d25c887f37aeec9ec353c117a80259b0077f87c6de1ce380f870ce4a4b09d6740ce21c0cd6b48dfdbadf42d8efc6ad77b15fe3f060b36a700edbaf099e8bfd465ecaa7b81d5283975e97c7f7c4fc79316f5ebe7c9d7679d0e65e92fbd5d3781fcf0e9aebb4ebff5ab73f1a4232de3f1933fec170f9f0afc5e55f8c133bb452fd7b91339f704dfc976ab19f7cc530ec3de8319edbdfafec579bc3e6b972485f1b5b836b6aa5f15aaf5ee95ae9353807ded25b1ebc266e47c9d6e862920b3921ce994130429c3399704dfc6cc2354f3867ba38b9acab869a0067e25b9ed0a07198203ad42c271e650264c5cff0e8119815ef431398c478fc6cc23d7e56b1c3c71ee3314c6ee4ceb24d6e3c7ff3727f9ec4f1e863b0da6863cd49510bf869f7a34034bcc904763f19f4c9267cf28a1b4b2af645d5ac781453339e4c92b2128991d11386f0c4c8c8c8680b021424d577eb5867ce47eab2dede12a9db7af76bfaaded949ea6dfead7546e07278f5a31ceaf9c11356f9a6fe6342eed67c319d17a5b79b4b344eaf6dbeef0293da5525ced0ab33ee6eb7b4c0b7dd463ef512d9fbcaf5ec6cc67778d6990f93eb69aafa727ee2e4fcb83e7aee6573e503fbd07ca9e2ccf9d76e5e3f4f91ea7cf20b134733ee480cc1cb33b339f7687e6946d90d49db1349771cafdd84e3f391f345d731a56dad821f1b68c68d5d88f6feb7dad455bb4d216b558cb6e1ba5349247d2486651391f6d5badd6b92fc8e54b0e485f365047edc71be72396ded2fb825c290f9b2635258d9db1140865532f9d3d8c7bebcdfdd8de3a733eb8b7ae69d857f5f33c17b3abd35118ead4033bc671293ba46f90795b5769bd099e8b9df2dc55fd6afe749e5bed0af5d479aef4ead993417ac8f3519e0f79f27a541f75a35eeb33d837aff219ef7be2b6e8573ee4eb7b480b2dcfa576e5834fdf83ed97c4fd647cda20a9db7aea7297719edbb2dc757abb8af70de0ca78c9fb825c193d68d62b5704cf655929b2d78c888f95bb5da72d2da25850232a853ea151e810cf15741f0592dbf932aec9f0249237743ee457540a16462b3a44a1446956a7eee6759366ad20c8d532a20c1932cedc0e1958762c6bbbf2d1aba964357b3e20ef0ecff6b30448890cefc88d6fb63b7cf915117cb1f3c5ec8a003bd2c266f14c32b3e88c68d05c41f74923a3d9a3a45d501e6921b798af3b8ddcad49776f8f8fc0351cc74f3882e41e1dd1e2c228173ee1c8cfd534ede34f32337773d3d31ed8e9d9937d227ce557642e3d994fde8f2b76799a2fa9c74ca4646eba6a57b59102c973109602d5ccd25e42c7bd3b3f894d36fa437fbe2ae5e9f2dac9a33fcdf239fda33e4a2c434ecbbc22ac23cb2eef8af7f15d9182c444b63ec328d453d7505ecafb11af4ca15257ce78b2e549e983a01b0471e28d371e4f8be24d108f14a8a2523fad9395524ad9fa49ca1691caed40d91a9d949793f21cd743d258398dc3ab001b0fc24e244580b8d18974fe8d7fd2487a0009ac9589cee635d7e67629d18d34097d682592b648e48f645b2bc614680acb720b1f892449bb30dbdddd3545df3488cf6c653d9df31f057a1fe376f0c99346cd3a6242de215118d11f8f2a6956f469565431b5c736c6b12cdac51d9986def0560aa801c46b1cead0892b2ab7f1989035de479f501aef1b226d782bbe8c1f210c29e9cbffdc286d8daea5276f6d1aaf5c0f1a347c902401c2a346e86a9c86f7017977541e83d2253ecc308a84d2ac487d5cbfcd5de8040f461dc3fbfa2aafe1adeab36bb427ded01eda438198749f0c2a61592f754679032ba0a8a24f569c40a88dd670e1e10d0dc6cc7f5d9122542031a72d320fbfd009813a6007f1f1e9e4175c823b5cc81c1f723ff87587cccb5d7714f49a8952cc93823b76c9f1e89eebe00e8b0cc15141cf5ddb4c37d91d92c954bac9eef44ba7f125ca795047c3fa213fe4330be12ba4431aa3e74bedc7f2f1d2461bbf80451427d9219325175e61c488091ec6d4785384f478c84123a6dd81cd2ac2a3a3c26635b44c28c008ec203e145c478d32f1235d01a4f865b6dbf9b0c366a56e95b6722c02de2e4241d3e827c9fb8af090d7ec473fbf78cd93a2a387dc4b2af6e3b92aefbc9eebe80ebd8fe72b52e476b608ec20e68b747f027610a6c30ea261e95cfd54f1e2bb0d4e53e94694ecd704cfd5ce5d9ef3e437ef92b067b0599188bc93526ab9287b4ce0735993159e48cbeee67acc0bb13bf1fc5844c221cd7ad0e21b32340871e1aa4c570841b9aa66318433103214524a0921c7085b4a29a59452ca2953b5769d4a256d587da4e3f76024b553a528fd8eb8416c6e4c31927803bbcc7e2ad6fd18090f7965b398be6daa5d94d2ed04fdd2316d03a18befcb4b29a594524a29a594241cc02134138ca1aa66695cbb4d95fa0b2bc6a685030add547b2d16d12ccaede0ad5da453fa54b32829c61853cda21db0c176e2831c71e5bc94b5eef0bb5d1db0b9ec8a246ff3ba14b723da1a1dc7f51967391f3637ca9d217c7754cd9a7f91339ef4376ff49914d53610ba790ee3828ff822bed11e2739a6dc6851a21411cdea29626847121834cd46d705b1b97c84cd656696416c9ac548d0604c5f382f4997a453d2e9e7e5ac524a09db05b72e553f27698b4b508843fabc64d7c62ef979920d7f5ed3a69025ee492771469048f7214fd2e2f3520b26e6d5e9693909bdb6434f3a1c20cef6de341267043d899e9469a436a2594be9a2661d19c101e208315d0867b4a0dfe92388c346c8cf7635899534ff4c41842f5b5ea242696ccaec93a4eb9a15298bf5ab544a54a3682b141dffabf175610c1e8d49679097b681d0f513ccc3cdd260cc578fae74b9e682c386e10dcb8338f3ccc100cec878be820a97d3802ed5259428230fe310768f50e2cd0c8a32f2308761bffab7d8af63fba9b0cbcf80387c7916e7c0b87c0cfba96ebfee9aeecb61ec572f0c0ff33028f372951721ebe5d47b798b775fcede4bf31127e9567f7181691a90cbcf953e57c640d73c9f055bd0b59a1ea6856ef597f335d28a57abaf0eb917319f5ff1be159818308ff196c35c436db0bdbfbcfcc5bd6b286e87676b749ec717722fe788805c8fd5f9dab6b117738ddbd8e31be3f15d49150c0cccaf82815181b90bcf4d05460ba6e4678956da5e3cd9ac96738cf7f15db962be8d632ee37ccd8563620eb91d325cbcb0b0592d2d5de280c416fbad78aceef558bdbc6cda8b5dfd58ddbbb7aa4edaf5cbd7a176c15cbe3e6917fff4172fed5a5d9e6578315e1c6a966c1e31de35ef0ca3af71405a481c90383d98c3c4589d66baad3eb91e2b217ced89c818ef9f88bc42f8e8c25c88e9c2c01cc6330e487c0c4b84afb51f07a4e5309608dfdb8fafba4ee4d599ce6fdf51b5dcdb60c328f95e6cd22c79182f56d12c89921e4f69967c8bc75ba8bc7ef58bd72baf8f344b26e9f82ca5bb70614dff66d0954f5d229942c772172f46c93638552edfd41949a41812f9aab25f6db14826868425aa7c2c0db301c411c247f70c0449bb92603e93fb11cf5f21c27745a77b657e3f21f9541debeb121f312165c5b4ccce5a8f2e8cc1f3f284e4e9c8d283a73a25f273c617c00ec226e44429a59452ce28ba787e1483369bd0f5352c7b7b3215cb6c952c38d37f61450cb3dde4d85468b025258ba1eb87a18b7246eec1a4f530ca67f6c33cd95dec137bb5b2d6fe47e77c8531930a0a5bd299cd6a658533f5a6b21ca0c79b9c92460a27ecb622c618638cf137e2638cb1ab4e5c299500a5468833b3acce59b75aa10443853270081a845e5f6666661cfc1cfc1bfc96ea057af03284e75f3e8ce1233210a7fbc618638c31c62270e4c034b9759dc20effd2ef9b4ceb8ce10cc986f4c4edecda61db9deca44f0e888d9b7df3b4ce9e659c8fcc6ea48cab240e888d8bdd26dbc19e599b1db5623675a36b568c361c6364204edfab5e2614229387cc2b79c8e4c1171200196d7721fe3c05c48171780d86d7f7014a342b3e096668c45c8324f18025d0c572780682ae96c37ece4beb1ff72007d0b5720398731aff58c985671a40574a06302766c63f9ec185e717f011ce61c1b311e852393cf740d7e939ad8f4f70e149005ddde14500736c884097e9f04dc09c1b3ffc8373b8f01e08c23938e02da001e8e20e3f019893039ae1c24300bab4c33700e6e8c850004400cc19c007b770e1814057e9f045700e11d8e18980ae7af80b738ae09a180300d0452d4ebcf72f880b6f03e620e182ae79c8341702714dcc0ee155f1e6c55d0e1fd32e98ffe5f02f9cc3ad97cb4f623847035c13939801711a90c4867398c667c4c8d8ef060ec4611ec0191c9cc33f3938878de8700ef7704de4235c13ff83fd7cc871634fc758223887911000e2700ce04c119c33e408ce710209ce29c2359173f8c5354080386c0238131fe389b55f6b4d05ff00b2f8301efb00b2760059ecd20530dcfe9e1883c7977fe00cff85c73e5086ffe2710f94e1af1809bfa00cbb5c8813d7e57b628a8f7a5decc7f352b5b0aca49e68a001493c81463c7b78420f24c843912d46800711dc21047670620a08ea40840e1f98c3102d9a90031371100287258e3cf0860eb881036d0892c50e1bbe356c400d1a30ca401a3080860b9cc1025854c00c1428c304c8a044519278d449a533f928e1c18f0f2b91001c4304a0182000c3f00028c501100c0d805f6000f44212906801b00b0a805c4800dc0212300a02a0160e00b36000888523201420f00a058056300256a108f8e407a40201e0147c40291001877ac028f08050d801af1800742200f9041dd18a0b9da023c446d8c88d2f719b46e21e3e120324dcc347021080218600000072e4c8c9c1c11142081c386e6e5cae2082b871c3868d1a358000c2c6a6a686866666a6d5a24163c60c191916eb871f7cf041868c981821409c18324610208e8d960a88e3b577fb3c059f3fe4095a70056202b39c882fc26c0288c3fce21c66388519324366c80c9921336486cc9019324366c80c9921336486cc9019324366c80c9921336486cc9019324366c80c99213364860cc4534c0171bab68bc7f484e4698935457845b9fdfe63dad5f756bc9ce4b830a623e08429282d5e8b1e8f378b65636380586bd731f7d27dc983e10c9fe1cc3cc2480705a5db46b91e98101e9a8907734728bde9c9971e297899e3019b87bcb0666d7924d331683de0ed4b1f74ef6207010dc64ca04e1efe514a4fc648e6276ea00e9e2961a5b442d2bf2d236587105608e16685402bc5b42a988782d2394f2576282614f3daa1c0e4eba1d0e4b1933259313af9b3270dd276f08076f18d67b50b3ebed52e1374c21502de0867a20c28139fcdc41cdc8e6f5e935e1749f6abdd9b2b0077efb47fb33bbca47f17d2755df726786e679be0341297a2c993227b899bd4aa801e0a0ca3f4583d14143b14f4dba1a8d9a1d8ea355266ab3d8cd6a65950da38b1346812099d7cbc3cece23fac49b6891adfd0fbe8317898516a9ba8f4d042c8fa302b845a2954200fc5bc84f35074161e8a69bb28030f856c2b4ba0611846aba4d8e9c5e899520b2bd478835cb14bb166cdc94d3ba3e8e4e7698e3bad945568daec013b41359774b292d83097cc1ea4a2d056f0a69fcbd77e79f6a08350bb1a6f58116b7d17f1117b9192eeabb56ff8f5e86142d0f493030dc6d4da752a150bdaef880b0f6febcab358f3423058ff412fa39fa75996791f84f5987db364159d0deb4a2b842f5b22f16a802d84ad0f5a21d83f3e917835907deec0ce9f87de2721ccd80aa9568a78ccdac3373c039f7b9e4787d61e0f0f6a2a10fa747c789bc5942329a71c4dc9e272b442f8c2f6a013a618dd279a27364bd164f394a92b9b46d047cfdc0eee530f05d741c59dfdf31d5093ce693a364ddacc306ac228a59ae9d3d3c1a676fa995de39e894178e4ce891d661826b14fcc6ef512f348dd37fe9c3dd2c28f8db26327ec348fc274e6b6a1be9baef2641433666d3ac898a5130bd3c6f5407d5a0d559a37ada44898fd38c3b0f9153b9f32cda34c93db41b32ccbd8f4caf5c04e7a176fe0a9e31eae993a11f3e055f1e8a3c7ad8073a6945266a669e587d1677292666fd6269ab0525788653a43e24e765376ac6ef687c9b2fd189376759b78a3136bc53e654428718413f1a63e9eec078d6e8c31ca28a39cf32ade11d31a31429fdd88768cef8ca6688aa6c876d59dcfa383995a12508144fd3c09b6d36776d5bdcfa343b324b0abce2291bd37bbea4e552c1258edd32b803f312a4ad7388fabb4213daa6e36742307257e2cfaedd98d1899afc724468aaf9dc5598d18a19f37825d475604578f8fa24c7c1d4144b3a091ed2835032d0200e640aef90270211c40bb4c47a52051c9057324d7cc57202e7c0dcca95c335f9a71e17c01733aae99f035d8550f63daa5a5bc0a4f53a55d78e8c20273522736c11c55e59c17ae99ef38e74f714e4c8c8a73582f9cd38201716820e738312f296fa5c628ab74a652ed23aecd6d214bdc3ee738c1353386738a5416e7f0ab9da0c29df345a693797ee5dcf90f007772379035af91aeb8f3d910779e5100715c70c608e7dce09af939a570e7e761b4000303230b3060bcc0c28b172f505e5e565758ad5c58c1850b972ab8b8a89ea8542d5468696199020bcb8a1456565243a9142a0a28d4090a77f66d26bc4245e5ce390f6de63cb499f3d06642a16dd302a069a42148a40c00595673d48ae56018c5a1740a31e79d52def91b881363bcf32e88d33641dc8038d0a65d139b572248df7439a691f91bed82424b8cdc89e38358c02b6a10e542aebf253eed0e23e17a55020dc67c5b1184f3f634122654ce44f7f96d0ea523de443b29b21a3ab6838988fe50a8647fab8afd6ac744910c4cc46a6038b01d7a90e0b80ee952e5f34cc445f1a6020101fd1021317512b34c149b1035c99c98a2da38a3db91340af403040404c4442a967f7c9c9872ca2951a74f8fa548f602133561a226cc444c54eab49754ecaa2369371da3f51dca7e5088888888d2ed500713c9d7da75449d3d826457dd49e7d1a1d955675706d84e3a12db49b60815dd8b70dfde5924eab56bb648f63ab7edda15504f42ad4e873a5e5087ec41c72f947562c36e3735eda4fd64912091b8b91171df2c09a840a2bf9d04f1dc15b0bd5a12f437152fdecec4979b3469d2e426a18178432fb9c9078962b80889cfab878f780a1b3111ab594cf4ada8f2745c61810669bada9affe2ce8c59163963ce3893363ac6a4e0e46bd534adc6685fb6ed63c9b7b44dfbb66d5a964d52f6ad596c335dfc835996653874e050c3a34a4f3f31fa0f1e296101249250bd5c090d6c5d0a8907344b4e229ad5974710510412ede2b712ed9a6ff83b99595e9df6a46d759d942b8306633eeee7cad73974d78cb86f97ef20c47a6a285087f6a93afbf14b96ecd7b5855186abcfb447d0ef00b68fec1f5c39842b93d043d8125e1251469ef39cf094209afca459d2f4f9f689fd136f48445146a2ba5349b64f66bb46abdaec591ac9cb5e6bd7a954bf8e1fa0a0264224a278232f8dae3c919426cb5078489e7d62ad5dc73eec23a18e5a842ebef6cca14b5db60de08c6c1f3823d9c8c8e724e4643753cf124928f1afe39eb2df2fc79bd94d123dca3b825a2346b4f78d70fbc41b368a32f2d2c8a7b7adfbf422dadbae4a5739f7934522fbf6cd16213db3abd2b36fe7d14185e9d55b95de873aa2c75de548705789e75eb2486ccf6c91fef678a8837a50876975447ccb7e411d1a9b3c78d948ca92d195f2ac8823ded4d34b788411ecf425efc371a5f68cf4fa4dca5328571e93af42573e1b92d79a5c794eb64f853aa812cd9252723f17c6a83c3d533a38c5581f3d1a403498f076aec786346d1a41178b53a4ad9a76c93480e849fca31a2f2d8d207071e37a64a734c618b522ec083b7df5b61ab7d728a3ac9bf7f195b54659ed6a3b761a237db59446d04723e8d29376a21104aea114eb114fcf28c63f61b3484a29a5a41104d6892a5ee9ddf6b865116b16394e1969a4c7680481bfc5ed1ce31629671eca49b31a25b479710a334a087bd27d71ca8d348222734f304f8c2a79905144612b2879491b3c89edd365455848918245511116581449914224254a1429444452a410458962450d9e40b1a20651aca841142b6a00c58a1a3c916190030b842e6cb8457777845bc4c4c4a452a91e0891f49139314dc3de10ce21f30b1d0c32299dd36e19514694115d524f1645fa4c0821840da1cd9ddc8499f01182d04726878443c2b9803b62e49feff76ca693594a29e511f84e08a34ffc89403128c22853548dba3e52f59443a01ad435b9f048081e0dc12328f08808e808680a50bf80ba07a89100b50f50ff7051132e12e2a2212e82c245444545463e51e6557b3a242a9fffb08038c8660aebe84617b270dc46d50365a827cab40e9fcbef633ada051dd50174249b447eb58e216c8b1eeb6817745fa72376090b4e5495c9ed6f57d4a00a796d9ee8c1e2c22b7aa25c9a0bafe8f1c1b5d1a1feb5acddbfec42cdc4fdeb4e2ca47f2d2e1746cea4d80667e2511e074d35f32a28ae31b1dcf8928b1bcfad6efc5edc78cdbbf1245bbfeab56e3c5748e33030336060c09081f1e205ebc5cbcb0f2fab950f2b172e64b87071897151a962a85a5a6c0b0b8bc7b2b2f295540a268542c1409d4e2f4e2a2a2f2a5db7ea4c2617a652c9a5c4712a6edb5a364d63d148a41552c6f574e3a52a379e3b932c31d70d67189b0c652cf1dc20ce7cd524c32e4921cfd3999e50a2ac5dc5264efbf15c68ba9c0da1c66ce2e2f45e99465da611f59bac537bd4664ffd6e743d7472aba5d4a606add4762f1266ba06bd782aa1ea2d9af639ab7d71f9d44eb7d53797d57608b76ddb7823612eff5e2ccf95fdc153bb7c7cf9e9c5512bcc3636ae2ee3a62901c37eaa17f6eb5eec57e7e58b957d21713d3ecef885cdbfb0a697959c4e6aadb5566db335b846d2677fa97bead5b3e11a9de8c28b2e1e772d6e356a8ca751cba6acb12bbdf6c98cdfa5ce62552adbd993fd6a8dedb44268eaabd88a75d454aadf365b43c33e6ff8659a9ae9a5a899b4f3cbf45a4d6d2a596eb3353847b35f133c35324fc6531fda0b6e51030b89f4158d3ecbe8e7b443fa9248f69301bab73bf3dc49d748f49cf70db194993be564966018ff70a4f2ef872997a576c9198964af713dba671c850c50bb48e78ca469f45995f9915942929902484a260acea9d79ae398d338ce568e5b79ad56db9967ed071bb196319ff9323f9759c2397c96019201ba190b77128bf7f125659425d34eb38c853ed3585eb32ca32c94bd796be5e6a8e5cf799db8e299501e7da7f2f64e323fcdfa484657aa9482ae3c774398d4d99decf524ee4c22d921f21b62f9d9abcd669665f3fbe1e8b2934d3b8974e68ca8e7ec39429189826bd8aeb8cf53c99f1d8d50b09f543afbfd7074e7b16a6255fb05b94c1418b703e3e8e5482412899389826b3e4ff3a48c44118a66b949a7bde34ffea1e8b2958942e647268a0905ca8a509d2c278031d5198964573e489fef41b23cb77a9fe45b9f651ecf1dd297da1a5c136b0c69b0355358ac3c3bcbb0c721f1cec82b68298da491b40b5e3a862c74850c9870cb60890c94b40683a872e11532783133b38433d01e092541c6c0e8c68e5e0c90f085dbdf6200e50938888193abc2b68a6157c480899c175e1103215c55a502c3c85ae8a6a46f3230a7d2e0a27d71a113b7bee5429654ca55cad960ac604ec735456eb53bf4f5150895ce8381acbea9c4ddd866dc18b7bf5d195445a9fde2af8de0460f5e0eca6a8444aad76979ba2331d95de3ecd8dd49da057da45dd0485e7004c991cb5540c847eac0917b28dd360851a0f1e07beae2579e0c0d3dd16c74bc85aa5f1ab851052118aa00030cba70f6745f1f69d5e4924cee08876449b3e0812ee4478f39caf3dca969cddd92b925864929dfd76c74949923e5cea2301679b24f8cace4424d36fc42b7c128170a5d4d053bb470747768218b76c9bb430b59f48ddcf0f2c2cb0be1fbd00ee11bed0e2d1c350b7a219a481e771c03d12ecf5747fa779d98c9cf86043112a9b6ab599199704ef70a5bc56a9d9526f9c8f5309dfe5693771bd32c5694eeaf2e3bf7c4d025799fcd955574932bcf848fc04d201f6146e9b809e46c4c4c6910638c2d99bba03101e08d1146eed1608cc61de5dc9825055130b6ac407aba43c09c1b5cd3bfe12add06fc6a6cd9eb5b600e8b6bfa1aece28d124c069d3b00225aecd7b7080a8b585652a8088ba46c82e74e1ed386738e88bf8123470e2cca934a672a61d3c3e8dd9ad55da8471c09aee99efffab638e701113882e2e1f645220e18b30066007e0ed70db79f04644304200e06e04cbfff00ceb100d7f4a9ed364022253029672c6261130b34d937fd7abd5e48741811d2d1af10726d6b74ddd5691ee62034d8eafa363afaf828bd954c3e5ecec81a0f21cc3a082bbc899fd283f1305a18868e5f744cfb49f872351b5d10d59537a6209c91a72b10e7053d545dc853da2f43e4f821860c1619d70c1affaa4cdf21009023c7fee0e1c415cf833786500c214f4808e64278291942787d71bcbe598ccccb7e5ec4e388a8171ebc301e8479b9b8fcc6e574e3f5c5e1f585899a4ba50a09090905b1eababa54adc69fbe61aaaf978d9652df1b45454535b816558b0d2121212120505b5f0cc37e54341578b1d78b33915acb84848484686c6a6b34d2fe69510c5e1a9672e76910dd79cd876dc69b711a99d3f0e2953f7dd315a8c584eb375bf44d0bc923496e8b09ef31de7a24ea9b2e9a454647b7f518a55d4cdc78106f3d32e99bf88a32f3b58a16132f0ef3d62392be89d5a76b3d1e6917132e5fbdf5cea26f62d5a26bbd8d6abef2d67ba86f62ed5a6f2736de7a2fe91bf97af514af66f2ea2a6eebfdd37abffa46d69edb485ae72ddac5448db7ce52fa460a619185901644ad7393be91ad7392be995549b7e4bea6b8ad3393d6190977d30ff7fcf0abf525fa66fe4499791516ad17d137532848eb4464ffa050876316d9a85eba56ebacbe99453133b779ebb26fe82bca4c9ad378eb2c6e47ab85e24dc5691c3d3321a12e12ea22a12e7ac59bece7e7f5f3fa89af3b1f7fe24df68a3ff167d61a6bac3116c59b5a638d3516dd597f7e5e3faf1ff9136feaab76af9f3bb1a222a122a1a2a278830909c922215924248b5ef106fbf979fdbc7e5e3ff1067bfdfcbc7e84e20d2d2a122a122a9a9f45f1860a4599f95abb4e689ebee20dfd6995aaebe8cf7f7e7e6ef82ea63fb07eb84ed71c1c2b040e2ba36563783e14c9f87c8645dff820e33a1da3ef8d07afcbeb9b090909090511e33762c8881113e33a9dfdb8b21f2ffb69fdc0b4fea215e3590fde175edf203c786f787db357f6ca5ed96bb5bacb2a06cc618a6e14bd286a15add4d817305edc1aafefaa6f155aa942ad2a5453856cb478ab97d575bafeacd49f56fda9a93fb1efe2c2c546dffaaaaffaaaaf1a40c0b4a85a8a8a8a8a502a305658507d6b78f0022124242444eb0b54eaa8eb34568345ac7f4cdc8bcac9d497f6c55ed80b7b612f6c5b99ba9b8a6a8a625117659a0bae74ceeb4d4848c866c6657eabb5eb542a4ea7e94fbcc98ea2cc7ced3a3bafd1a0b1d95176941d7519c7832f1714844efe064aacb5eb327869bcbe361ebc335e5fed87adc6ebd3781c9366cdcff0665e1dd19d134a07231714dff2b419dc8ec837724400a193827499cd833831c6ce586696b666cdd380cd928172e7594377fe87791faab8f332e663e6634c71e7ed923bef799f87f160f0913bffe265e5428b3befa2f2e65bb08092aa329d679ae77e5b95e2245d7cd73b3f2ee8ce43b9f35f7674e7a9d7576b6dcc750671a2e586100467e6a7c00599260cbb40082b2c1f4fd0edc3cb711752ff15b99bfd5a179ec5fad71e77154dd33495ecd55e32a183c70eb76d6b6eb310b6be266de736921552bf9d7b7b9fd489bdd9d2e3e91c0f97ab1eb91d2aa72f90ebf1e22fd75c247155fee20157c5fbe675e1c24b7de5ad5ca75f3c96af3cd45d78df1157e541574548bdcae1e51e5555f8117359ec3f199fa6f293274445e56dad907aeeda9b2b5df348df5454de04cf55b14d743648356282125c9325e2e2952c84ac8f74ce235921d9ebef04e28355b8f149487b44946942f741287342d1a9a09887024619db45f9a92ca6854ea531e9a1492e464ceb7a497a46dff4db2e9ca78249d74b0c3bf5d1878f110b1a8cf9e6ebd24e0a8b4535172bcad04ea9304f5e0d321d12e39ca4ec1a740599e66b768c94d5475335bd4dc752af5308b9789175091e922daf97f048be727429d5b272a3d55068e730a53616eb168afd5458adddddddddddddddbda35d565dbc4922680865a51d9a43a521964d750e7592f7c917077df2b5127403cafcf9f9b9b41573b3442afb7703c7fd22508b94af258cb40c3d6639dbf41896bd36fbc92a58ec27855aec6bc59a6caa493eaae92a0e88e9242ccbb22ccbb22ccbb22ccbb21d19e4806c7ceb37cce39bb1a0fbb843cc7a9cd7d3c51b0e62c51b97531e72b10d25caacfed5d40ac55386b62a925cfa8c879e341425979e4ae9a230b9544e01215112d1d5b62d106e7ded9b1310d75022b2af9da411d9a40a49142514392497f0c9247cb5769d4af5b3fa85652ffd8b5364f67b0171578158babbbbbbbbbbbbdb850362bae6d94db6ab3b66db5a08efe136c1b7525547e920e857f004b204a777973fb1ab35264e014445c708f4138158be382828e8d22d68cce2d288450c03cc81b0863b7d9ca26f78a865e8297da4c7bcbe10e274ffa21456943f5139a9e2d2c8e4d2f350adf5bae07c987cd86c746d2a996af5618b9ee924aff42cde8c92a60bd68679f1c276a14c250c831eea1575d8ac1ed98e3a63bb6d4ac13747ca4831cbb22ce32cc3ea89c89b5d88e96616c299150724e351331b1dfd0f2a1de587cde49d34cf08151d4ac52415e7a3dacdc35e3d3851358ba4934ca40b315dd231be524802b54cad5da75265f6fbeb278350d98c4010ceb8703e32abe280d49becd7cf3cf96a167d694614155d7f27ab297b4c5e78a96c72e927abb8540a4927b5eb50f62f964d0c1141903021e22d7e9cb4d191a028718a540271fa6267914277a5660da55db4de7426648af3419ab1b1e24d04fa3aecd449a97926af362b02019522104aaba7ee54e5ab65e80b750a74e3a7e51343ffbddc40a11cb733fdeb97e85fa06e7ae4ea614769d63709050eddfc2b0245792a4b0071eae95d5ce4ebcb6e0d127333db0d5fdb85d915e67cb0bcb9b31c723d58de3795b873fc640865794ab769bc99a0508e1ba42db0b8332eb4628b2637723d5057b916395389e52b67b13ba8ab585eb2e2a53cd92ca076a1ec1227cefb82c8711b1e7dd00e263ba459740978c4af9ecf3cf9c2b83ea9bcced9bd07cbb757ae477b2d6f39934e4496b27a21a6fbd5abce71404cc72c11be24fbf551df3820a9d7afbf729dd862573fb6b39cc5eeacd89ab2d2eea02c4f6916fd10bea6eb74775ec99bc2bde47196b768d677e3c3c153e28d6c993eed9e6edda6d764b62a8d404fb68c3c49be8eb03a20d54f474f81d0edf4eb3f2a5f975a227c335bade44b679c120125d08c541d1a6ce960e8b11663f5a00ee89d4bc02f5ed22eec51050c831bd90651eecbc8ab595374d04ad1731df4fd0f162951bbae686b9978ad999959f22b16d1af0b634419f5a069f0cd8293527a789b7a1a6066e6bee480c8739f5b6f16e586725b8bc7dc2c5ed3a8adf30b5dc7b8716f2be09a5924752194a18c28e30292293b60851da2c47ceff983b62a18a78c319040dd67638375b783130ab117341863a3933d313a9b80a9ee373ea65d7283f03f2f41833c3a78450f8a36cea95c13fbd4625ae84f6a59061a8c917d8eb6aae4a992eeebae94313289065d1db4620ba06b92af70e8e4a18cd762a2bc11f2510af9782ebf949ca0d38e34ab48916671bfa78b2f82b1773f8575d3377dd32dfbaa0bbc610cba5cc8e21f9624ee07cced2536bacd54320da9e71ece471fb319f78304377553d7b8ed17c34476ac625ee52320dec56c5771244f2aef7ea96679686868688847bc3c0467e41b055d0b7649bb131fb5cc738bcf9266c9ab2c2b69f158581e3bcaa28acb4561d769886d3f7947479fea7e7c0473e797ad789f141a43f60e49bbba53a9eb747b29db717397e0d4ed38d91a5dc71b2391ffb073cf121ddf23d7e96624cd922a9cc357be95a04e976724f384619814da0ef6213cbbcaf968153bbb6edaa08bff78489e9ff48d76098b8c2217f9742d5483ee6ba1a3768241d89bf6cd06afcf94d43eedd363d463a066c95729a5e0aea46f380b9b7dda857d6b9f9e76f11108555c6e18ca5cb879dfd6de2653ed079db43c56e18c94b4f6cc7240213a5b7b8279d84515b0536e457a8d62f0947ef38dc94e4137e7bb27b683bd57d0498823c424d91a418fb5ebca432c723e28cb1dc8c79dc85d48dfd68878d99c8f78498479263312d4f0ba5fb5438fd1d11439e54a29a5c480133408ddaf4e3182d0091a9a0401222272c21d90dcaf4e19a24311cd918e3a2307ce8e8aae588311dfd4b8b28586a36a451880a6cf0d252c99429862800e5a318593fb552118b9f1b5d6dec0196ef4605c60e4bae08a1b3de8841514e1460f66e16acd02286ef472ae165920245930861bbd19579b2ab8d1f3e16a5408377a3057c3ac70a3d772b57ae40c377a3f5c2ddb8edce809713552bda20557dce8fd12a95708b6073dbc2e9fa7b95ba0b9e0c1d7d4414c437550c6ab447ef7233fc6588a5d94d1d4fd338fc0228d59ecc8248b9522ed626614639c70381bc108238c118b1969926a631b6751aab0111fc51becb14993261d147d4c1d8d95bbd61863ecb8677c9358b21cc4403d3d3d3d371ab5eba412e3d0c7438fa673e74cdc2f3daceaa834ec57b5452c992219000000000315002030140c86c4629160388e1451f80114000e8cb64e6c541b67511a63c8186388310680000000000000c226006fb83bde808c07412f98bbced5fdfb90f86611404b0c497dd4d162ed5f1bc6dce36fe8554544dce529c36cde9ec87bc9ca0de92fba3689a4e54c36a46c65d9f7044ea17dd7db7b42d2cd4b7b73f3df3697e563d258b86577f41a3647d72b0e5ef3f3932ef42b53e692decf7ee97bdf07a47bcc499f1ceda89bf5c624dd42e732b199f535cfcb302e0ec76ed016a06ab27303bee9683c7aac4148f57bdf9bf698745e4b9cd9a65e33497bea51a02a2f55d3fd6b3e3f3b3addfadea1577cd3dbf7ad57db511fe840b3f676038fb1dc685fa26937573776e8facacc06bdf84d77bed315ba7e852e9da5a82d03eb65933425f097428e6bcdab68c7f5daf56dded86fdaf74f5fa87c88318f5e13bd6c92be06a87a64bcb89dc2a90c1df4b4dc9176f4c6371df11390f9d319be26c18ea73ff469af41bb41ef02490f354a143321a539bf25a4cf67d033bff84798addcfab01e225c60ea5e6298fb5073896b34d34638a2f289ebaf8159a1e32a6d3acfe4feda459cd2999cc0b03cd442f2a08f946dc2d7f6816e6e5cba7cc832d7b4f4fb24a2df6912f2424978d90bed155b4924d40b4d14f6fbcffaded2c8c8cb22b6e43d4ec9e9044a77c80047311a1f13d1b1919bc59fa41d666cb628722daa9b77c9a10144f15c43bb90f076d9f13a00fe0049b7cc6bf49f2c5f6ec6a30a67937a277dece39588f0e4a2be2b1253e425e786ee851fd1e32297ca603fc30f7a60c3ab6fa1709f430f70d6990a912d250cf90d1a7483ad45b94ae865bb119b5af5a12c334408b09545431b45d61c4450894604a30601b1a19d9012c0352d2fd5c71910293e4ae67fa971c4824731e28fb47d809e28b3bd4f1470d2ac243922e565cd844b1ce3e3284234e4472c37e90fb80c1b419c73d6af2cd149cae9e376aa9383265bb26ced137146c13da656af736023914b6c1b8ab942c9b5565db61808f358313f2294bed6637a8fbfb2a54a6e834882628e248b352a68b9ecc7fdd028f0466540707bf106f8c599195d7ae8dc5f6cc8668ebd3cc152ad62af3df9f6037cb3fac35c77bc127484cbec0ed1246313ed43f06cd29a7a2ad06fe069480e03c8908753b4fe2586626157a9b0d7656bef9bfd945a6cede3ba89a5b67125c85ba345a22f5531d5851e342af79db7036384e27d0bde5910672858c4be9c09522ccc5a37c26c488e9f8a69c3adf039256501b5022f49f4056585ea1fe59bdd44d7acd4818a79863e280cc04a15b00f22383674818626795abf58e8c6317705e942512625cdac37e230fe39ba4cd952b53161fb0aeb31ffc9e97a237e18673fc06bf3f2b8f6cb280970264307b1d3c96b590640d57deb858f3146321f6bcd441a14f7c8a0e5463d19c37686b35134dcfb1f0f364a32421704a46cdd8897f1c7e831d4a6989d5a0beadeba21be19c75c2be5b4ecec9ada757a8b16b7e255a9d84f8bde7ac630b4b9d0c7d0db91e5f006b71bf9c3f8de30c52dd5a1f47278abcbbd199141b3e85d7bec34ee56ba70541021b4f640d71435db0d38667c6f04e6ace2b64e14f3e8933b9fb49904b34248ce40c724bceb5dba85366611e6caba3d918efe1534b8df20bd072963962814039cd6f9e7b4065964a711c1d4e33b68241d201e6dbbf1a97662494a8ea30d046b312f44200499b7aaa51b3c0b69b93caeff34e8cc614878913f113dfc3e9a2709fa205092cbd69cfcfb2be9dae3b5022ab27bd6cceed98d492aab0a393c833df228c9b32a59519c6b956d667993ddb070417ede32350d69ecdef032f9ad435bf22b42e803f2add1e9a80fd89388d9405117fffd631e220d08f74f8230910b0f66d6ffd71bfa5183b145b3e95c65f0525bcb39afd7af1b66917f15880ee78aad12ac04dc960e561dd7f654ef2e0136770b7fffd43a1d1cd0b3b49e46124c54c3eabbfd7d27799d70d9a5facccb961af6ee5ec9e7c708f83a525bfd59e1deac64bd529d6722eb944cbef57f3f7e4928d26ddfcd7a72694e9f09659b69a7c908c6d890c2d6d3d07125d17724b739d4e88041faa04071811343c34cb54428e283404522818c41ab6982f5ee630981940fb5d85b6e00ac7b462bd82456afca1bbf3979735200123c40df2061eea2b4d287484254be9e2029d6e37c51d8b77ed5d313addad1bb1f747fc1a9c59edd62eb2c15e1ebc413066c21ec169d81243e5f8f1c1b8c2eaa63b596380c2f18dac25c37f0f4134d688913f0eb981de17480bbcc0703814c43595e9455444a14321a8043c2e798bb72669ee70694f2505ab1c9c0c7755363390cbd85793e46998f4ba228a85c99f9d1dcbd681c1cf14fca978d4f6eb8e3df90f57ad55a79d77993a9e88182ca4ceb2aef87d0bcf18e784239b16b0b9443627939924cf2d527a887acdf937d9d98758a7f3f2594192027063776fe399f3f58e8abe2265c236ef71d041b1aca069cc8c79325a05a96fb871b221c07309228ea6db10612e44d81dc14c1ca52b3ef201805a2e14f5c8fe6052253f9c863c829ef866e4ddff58974b469924136faa22e44af1f9e8b2543873e5a95ae85aab975c8a280d5a2e1de1000b6b93519f765a6042b9ab882f21dcf110329341021dc30db399043150cd1512ffafa73467c22d00b9542b74993602e29c4d660860dde570d6891c04f5a17ccc13127b4687024fb5c97752eba5f4f454d6f9bfb18e0feec7055a5db617f2e35e6eb4bbc16422f4ee6fe880feb47282ae1e0c737be94412c7519471e5fdcda9250a0fa921d2f280539b0094850f0b5b6ca8636145966539622bc1311023f28def684795b3d34639d58084b886915ffdd7ba26df47a2303ce460b2db78fb5a01bcb5f7a16e8ab970d7ddbbb8383bf2572a228f45d9430cbacdadf2cc52c29b802fde09036e2c080bbba8cf82d38243170e8b0305e82300846147a6cda012e0e385896615b952de430e5a762f53a54c6e0f9f71b290ce41d7c126307388b41697d7a17031e161f2778a14c0a98a978767048bc37fe65b1238630d02f9f41acb5c087c45bdac8371a9a13dd9d70ca876df9a017739bdeb5d0670444f3f9eb0058a0b102ad6a6cf558762902fd83441c5b291b46330924d92bf2a871aac1921d77c645bc4a037f745fe57a0457fd101c894098bf20cf13f8a4246a11e9af9c187f9c52165c863a7718589d23cfc31950eddbc6de0959fc8363120c3f329a032c84893bd45d48758b93adf8f8cfbdc9c6c7e274b48ce0111e93e3b512510bf474d391bc73a179a7782e94810e4423996c4e9c6e08bed802a67f131508ef926941afae3a58f26847a9eebfc279ef0d9ed5ef48af82935e236789e900ef27410aa8f4129239b13b56eb7151a14abe6ef524402a523f0031e2a8ec35ddd409767aebc0dd6abc5817aa48110aedf521dad9cd50bc8184d45b66ab96f8ff4c4366cdeaa806fa5aa5dbe60311a62c9b57c75f33446fb25572249b125b1310336d5033d2c08f81d181978dc8ecd4aa755c189f9a749a13f8e862f2d8209f381cbf49d3061a09b74d3c3985ace007b564137e18a94c3ade3201a5440d8917957f7a49db5f53d4823c1522a0fbc329d143169a6f10a4752f952390508ed407300ef2f6f1c6ab672e8a4e5e4ef9e59f2a270da0ddc1bcc69a04bd8000aa573eff2396284d0609229ff10746f592421f8556c2e3882f8333621c4fdc291133f57122d9976a537ffd1e07d08b040a73b466411b46f42c971718de3d06011849c8bb904227211bea6716b06e4a118f9f07c4ee630cf7507036c59772833c1b2a149fa7e8bf81dfdbc21ef8c7e3e22d4fc7fb1b395090d306546e2355e99ffd0ff0010b8ec272d796fc46d986eeb15f01091e7b93a0d3191d43c92ea5c25c2da0d89fa3580e088001c8f8ebc83b5a75dd5c9a228ad718e9ae3831b7ace35b6e526f9920c647b807c9f56bb69ce7cf50d5f39ebd890089b480bb2d465be135d0c1c2c394fa0d542b57c7684cfd4a43d92d159853a7a90ec4e2ef59f248a645d88afa0d17a3a0a338bdb018c443a5689cfc86c7b1113e5fa9a75e1cc85dbc87fd0b8004c01db0c2b509175b66aa50462a0fffecf047c9900624342674925a53f28bf4a318d78977460bf7261dc779826bb26206fd3186521d3a642702e14ee9d6da8712a7dfe644f7f9c2a5f4b2c47ee076567fa59bcf6b5b90e5389be56d85dfded829fcc8c07b63610f505286414ab48aa732622785d092421b308e86db22886092c4af29fea30b0f2dc1762552666ee0b5ef3abaf2119a355fd1a4f4053ce2cbf72a99129a0f8633302c43ba668d672256882823b121d8ce8ce9d14e23eeb0d73e9aaa287b66c2261c5bdc4935ddb7ee1583c216a90c92aa6a7e0567929a8a4e2a5fe963c778aa9d24b092d1884ac75892fe96a47831c70e8d13b8d5908f66f6f24815c947ceb0cb04e134fab0e5f16d3388374c8074bf67b852e9fa33e8080f868094a0d988f53895df50e087def56c3a782999fc0c9f01461cc5f4ae0d2188c1db38bb958166f63e4e4c92a836e57c1f2d2f4eeabd8e2ac6d077ab2cdb4ffa145a69841360f6ab63c11003d87d2c8721c3dec8e68e2ce056f855a1c8c1a79e209f179956a86886658ece22b0977406b487f5482d62f9478f05455c998569944e1a808ab30329a68e50960c5c84d44e72d5485910f05ca83f1833fd48b46132d53db692beacb827c44cf06081632d572ca25c7b266c08e91e2254f45a4df0a30dc89b19264fd8f130b7e30493949a3bbde64bcc0cac0007bccdb9248937854827cd87da01e123d7d171c7cb4f34606ecf2922056041407477385f05cd7122663a0761caaa2f578d75ec1ecf72518fd3af71073ce8511e9effc14ede4848cb3196bd25496080abc1fff5d7b5b6e04f0cd80f0a6583a4cd5faf06d16dd8cf08a7afb85145552265dc1b107059970a11ce0c3dd1161d4c939965158aef72e02bfed9144cdb40fb7618cc56bcb3f18e8530a0979ed6dcd23b1f56c71d62ee28f4385d5b126387e1ed33417eaa11cd835d6b4036d2103a8e1d09761021e3b8ce824d0871e31bb4ad0a25beb402b774b4eb889bf9f0fb95fc9d9cd32fd6d9d3e44ecbe2bbbc940eed6591015ae0ad45744125cad70ce123777ae26c5bf158be9fc0c155299b307ba5033a43f67e53f9c3f8201ba9267b223c455f787301b48f2cbbbda11014c3e57a19cf9ab1e54beb702996a8af2b59bfacbb621fc566b1164a7c635b9bd426cb9a6608d4b5bb26fc89cca093416575a8676f4cd11c8ed815324e4a6e5861685b059b3173adc3495c97fbd64dbf13f304cc88f1353d2bbaf130fa9bc0123bab895c452bdf9b45cb82154bb65ab16ee6ec611a9b5a06517f1ee81407add1e82fd6bb1ec9f522451922abd6845ffb6c9f1340ea0ab16917c5d16f2c5aeb9f20ad86c762381019c74c812311781a8cdd81511e5e3960a4d1490399a87f63a281148ae07333181f770b3c60204fb190795bf09cf8aaabc876f206ad262edb1de2e7bbaa5e4590ee6508aa9d95f6dc76f18e25d1df6e17b20274890ec15dd2bb85ebf65475af2eb187cbf31fbe899aa92c13d9905984b9e5c6ced753cf558666bfad3bc30cd1598c9b269391c4d527d68e3c03457ffa02fbc57a5c2dc87f49ae4a023398dfe77ec174862079c2c629fa46bdae5e96fbf34cae61f83eeeb24a6eb3908e1178ab581eb67ab2fc0e264e9a05f1ddb96218e5a0bd42f5c216bf571491905bf43a1e706c158e8f554dc5992c471b4bc6314e619175f344ebc56783fbd5f0bcf4b7b954b7db065948a39503d310da644e23bc6ac0d10af5f9fc3399c5ddb7c942b16b5c051b37a29fc045ed9afa0346881f49a3606f3b64045613a4182b570be02cb2e333161bae7efe3e4c1771ab74a8dd7dcf778a5fea369f17eb86fd9af6365d31a90d54c7afc9dcf1c7e2cf93c76d04e3f28061e67d85021b8a048c2cab1c1122ba0447b8aa61bcc6a285201090c4fff545174bff3461dd41f3753b573f7fd946c072637f6b65a5927230a79e23a3faa8d32d074313588673b3efeed29d11f3ed1f8a1dcd35d05e4f52dda532b5a0d861ec69fb547c3b8035c45ded75b86771d9fc4f9151075a27b2b788d6e201698aea35db22a650154faee0dc8dae5d9693b7a5145944b111f3241b4dbbe0481731ea64c0586477c6be64ece73abe1292061bfa8a158a30c763dc7bfdb0d55c556e6891bf74304acd8ad3ac054c8904560cd3e675f6a3632ba6c2c5d0e90b2674e1f9b7ea7baae50e2efbf1823558b54a0785d0c201898e04cec77e8b3dacacbcef49a907f4ab2334d0b23e1c6afcd5d32e601b6bae529d06558884738ba13dc857b546d2d09aaa2f3d31bfecbd7e3255aaf21ea51b91ef8843c4428051da7a29b07f66964abac038762fb20d2c890119c96226c389841b0e693b2578b6d6157d01d7d5be19b2b7dff2b4eea5bddab6f5ce12585c5e34c7818c40f38fcc32c421519290061af6241537836d1220c30559145b0d5d90aebaa90285c7a2349492ada3a4709a0515a030f7df31c51900bc5ff78188503cb9a7ca2971d250cd82685db0d85fb5a0ad073e102d284ecf5dd18049bc5185405550962459574c13d763dc2d71e607ef61c816a7b4cd66e643aada9a7aa1dd8937ad00d6fad829da078c7301c63ce67a5128f55faef46198e80b8f5856dedb88e045289c468321f5047128e5a0707c1c981c719aca2021ab0f64a33897d73d2ba4ba16c45749bae40012337554a637ad45080cf56889c05dba38cbb4c94cbc88d9bc45f74494b0cf81de6530888e63b0e6b18d6e21ab69d592f9986408c44e65c47ccebd5870730396d0bb44542d46e8b966e1b203bec23be79bb47f5694b2ecb4c6e294476a3a78f105cc6316ded80101cf72d725d9057305fbc7018771d3dde002bf2514911ababedfdcd2b24ef0eeef43e7ccce725d80e9e0c30ff8529eca144dc590b66b94ce380d990ca36393c841e5b46f569a5992daf4a4782b5ed374252a614afa0019a7e74e35dcfcdcd110a30c47c18652e90e4cf67c39226c50230680d73fc1957a61629359679e5d54c907b6486a8cfaebdfbc0a02e042d7833b128908e24f3df9732051a28cdc2c66550264c01ccc1df834220d0e70f799a27b2e6930ae1c3da947c3205e9fe607ae2cd8651519a9f25233794e38ac23b6567e62bb8e74da7e028582debac606c0f420d84f2608933b266016dcc85530b362d8b0ae887ca7ecb1221f6cc05f908231c6a0737ef45b677ff4d90ad019e2b4e62ddb6482ce67440229fe5f52bce29ae9cb59b5f20f0229b2b69407be8d4606cb05efe966595e518951d395c4d367d20a6a06fdb0aa37c988eec77e6801185f56795516d5701c5789ee3b25f78f97b9417e0ce586838370fca0335cae73e8ceaf0dc131647c45b253d16bb0c95174c04625b671b74dc5efa312716fc4933315936d0f75dc40bf34343058d9184c02bd238b8c956b1f734d1d31653907c8f638fc2ea66a1348b8d7a197f1f3395740a1ad05254f96d10fb8a258bbd92079f20fd4fa406ffa8a1b8bac39e4d6ac3ab23792846e8b0e17d254b395eb59987927208f4ee221c038f521d0a6899dcc9271b07449b9901ca7037d07410a4273c9feae0490d8f110cc51640cc6371081fc14e925551e11b0a163328cbdb6f2b1bb7c65b7fa16728b36f32d424f730b2759aae3ac8fb5dda88ca5c817cf43dee550a18a54a557dcb3bb5fb071e0baf7d17d7cfb21f48d36aeaddcee5d5646d8acac029a7027939932f5fa130cad32be8cecfd22006d2e19e820ba656ee5f4670b9162126854954b246d5a63c810e00310ab703398aa1a6a8b69cb57a0ae6aafb6de363df4aed06acb5a1f3525b95bb9282e04f1ae6165585db44d4dac8221f8867dba27ef5aa87b28de17624acef620a8030d41157eed4269db21f4adca9e52f6546add6159ed1e1af2ace3e4073da3044f57668416b45d281487850f35c247f3eaaa3322b8cd81a32f049841eca016d1b2ba6feeca63868f2492d76a60eda3697269b90cf60966b0d5c523a13df10b287102aa2a89003b206d3551a43a65f62fd709da02a895dc82f67a59d7ba20c147f27340a557eec5a4a1df77ad0ee4bf6be3dec1467a772952576263080e461e219fcdf4c95e17a9b95bf193c37502c0a7cdd366f74890796325d377dd27e14913877f40b8e2cb5f66e744a0d35c1da1f20eb41cb27320a880bede3b009fa8518cb54045972426c82fd9e0ff0ee783d9f9b2076c652719f8b747db263d54bb8cb05390abc2063048b6f387912cb8e60831480643264fe7e541a78e40706f21b9b86c151ed238d6fe63c80082657de4bcd94f30e3d02ce314a1aa293067ff77b6f290e8c3e8c79abea22bd82b5458e217490f2dbfa2d15b4aa499175b734fb45820e77682e0df7e11e86ab556b2f862bd3cd187267f3de2cc80225a996525aa5d3dc3ac3b753d2f709fcf6b250d473f8d435f6a37d6bde3a2876c291225e61162c1e4abc482d2dac8285cfc4d9229df879f45b8b093bc752a7749ca63704537622b93c8af7eadd847da215ed037e26653bc084c3d54c32444cb33a332cd45da8c3411eb0e68258c83655c5ca35676ee5505705713fd7ec5b93fc401d5d1f9842458f950f41ecec640535e0e45a659e9dd36d5f9088024017fd9b738506024ccc3009765cb901ad91f3df4bb25420c2eccdfbc22d39c61fdd73cd4489fdf0b53ccf8fc909b51f026bb855edc8118083bbd14634c82135f30f44215f3d2bb618a13203e6febdabf11b809ceaeb3f152f5ab7d03e58600c415ba98b3e1d3c1b3784e9625ad348588880a504b11bc962ea54664d9f0bddb3f6a1a4ca138b37ce030ab31cf1e1768e898c87f76ef2293402e89dae7e1a26f739f0d714f701f2fdc14c18c3430bd224c7ef55c59d8994d5d0bd7754004aa6f2e1a05a64432846d81709d9879eb4107c005d74e613e9a4c09f59f7b665e8e4989d466dabcfc8eb64fa6a737d1e75747e8e9d7b5a01e516512da26776482ca3c6336508738576e5b4a711b3a19177975fdfe7c0b84956607056e1f132f3459c9aeda7ed3184b92f15e8dd2acd89e2afd597d26dffb79de5363add9b6876289b5c5b18a2f7b0f1acf42167c6c80db5240f1cad20a84f68ae79a495cf8f1f781f9ac802efac211635e0ef1630db9cf1c454ff49b771c8739a89119a38239d1df1d3abb9594523328391a74f60e804c54139dbf6580407036eeb420a9213238ed890983dd99709a7d95fdaa97d248c9ec8cf2e043a165593ff126467934089470a64061853eba2ebb48a00d5801c2bf8d48b6c0b07b95c256618aedbea31b1544ef18a25e1b40bcbed88c47acd8b4bb0e1ccd48e9d7dce8fd1367a4b3754bc6e15e663f92a037f5e17ae85712611803fd9d7506955a08d579a84e96264ee396a2b67af82fd3e3d9a16dfdb2e9ad31bb6628ddcced14885541c7f56cb8538edfb9778d9ded9a215d52d2500c1bf9659c781cfb02f4712d039b4df51f46d1c770cebc5d1d382ed8b840182904a9f9161bdf5d6dec730a3f65b80c40b8d1511c44b0bc24996ebc2d12bb2624b5541bbb4b3d05e7b06b86fc1d7ad3f44d79450e0e9ddd5c1b4375521f866f168ea79ead5cba32e3148e16dade05baf6947887ea74b1c9984c63d70ca55017f5da0c59478553503962b71a6c6a9a8160f5e30bb07496802df0a081ea32ca14dd8edc8dae3d1be8c15ad6bea3170fc5507c06425a2e66e6db37fc969247ef9aa1986648e86a7c3231e99921b2937f34cb221265ecb25a5d0ea40aa3103a8bb840d907173203e3e0361ae6224bfdb4e28c2dbf52cccfdaa36834b9c3be6eec307d2d2fa379af561f910c4d62df514251f08067832d33f6659c0ca58ccdf90b3317e4b0a58402041986d8c661b2c1d37f2bb39d9c714cb56aeb6d4bdc4d0b1ca2919167b520c2d3772f7f566934903e5213ca2a52ed16a00ca675d1ae59eece06c5abe41efe7d85728c0168edbc67a28120d9ab2cc4b00a6313d2a0a129cb80df91f3de7d4269c3cd1594f2f6a0e98f0be07a28bcbc2a4a4ac05746edf376012c882ae3c685ed6b135848b0251a26e430936fc97179807ac8cabced429784dbee5a0f53e4071cd41638d7b400f415c7016fd2f88664e2d24100ebd777272b88241ac5a6d764a6ac001a515d1220f3bd25b18551a7f8dd9e871a314db842463ae62e01058c9470344e11724e30cc7eebdb19bc1975edab24b2e2f920d503804918d98db25f10ff6302cfc0aa928851947676c8761a8c521beb9ffee9d25268a7145b19e0a4b0899fdc49efb277ae535949a28cc9ce60b588f6073b41b94016ab61b9aa2425526228e28a657f062bf0624001da2e53d7f3229016058898a82b45b373acd536b6fa0b2fd496858969a5ff36d5f96d28e3cc893573d022dc8fbdd393ff2178442a97d56a6feb7fd84405a043c8d056284b714844a76694c97b0767b43f166679897a91df4f54281c525eb52fbba4ac8aecf229d4989d7517bf8fae6a0b2f39582537b39d6dfdb6fb755dbcbcf9a9b77ca62065f84c7359b9f729a7907974c99383ce2c1c9019268a6729e43c5c022dfed81efd30e3fa43a3610662caca6cb0fa44d75e9ef2b8a697d9408f099853c30507197edfa4326ac1c557fdf144d863ceb5f7c92fdc71510dd8ea9c30d540990c1e6f6f251202da70576f6b80d39beba8a2d486c8cc5191a731a6754f57840f1ac82b3f2baaaba82268a3f05a680da739a71bd0b3d9f5c3896de0cc38f560f2173e80e532dd7b284943990924deef473af8748987f5fbfd88099fbef21183f33a854fb31a4c9d99212f809106c11cb3569000230d4239e0bda41166b53e93e6437e31c05acc1443264c14f2bedce49c3f1f1fe67d9bc0ada80e26073262f454ab7dcc0173498065743c56f4a8ef360116a1cad7927f63a955dfc3eab761198842b541f9c7bc26e4fa89d436c535d2cbed1ab20acbd261978e9e0d17dbedd38b6c1d947db0e51e76699c82714159bdb63eeaa7a73966db5b6852b7acd7a86c5bbf8b5dbce3a4172c75561b5304e0e359561cccd50e8aa08d9181098a76203978463c13008f475a152d0d3f0a3317407556ba26fa3bf8ef1a1c74d258356065b1e385496b729a4a23cde43ab7de1b810478018a7344c8f5c0054453098355865dd530215ebac40bf0e7b09167328422642b426346c2b8d12916a3548fc9d310fa4f6e8e445976f4d42bf7e3ea107b003c7283fb0f089b1acd1d43dd4871b5d7e7d3856622158096aef8a318ea3c5201b168012e43ca7423e7cb85394d90c87dd519504d0d3e864d1e10cb9206cfe9a6548f217e5c160a0c6a951b3bfe4e1434545a876be3370ca0ef8b919f4ce3a9152d91bea19377a7e58acc58408d149f589c28fd45f20e6d53294d01d1de07ceb05fac3bfb12f36e1a46428582a6c8be34d687e989365ceb1a901a8807953b1b27b180b814c9fe28837de00795110d7c1a2365c6161d37e3c034500855b8676b48d6884597270890a74eb8bfd1cfdf65da3e499dc34e11fe8d254ec0d94ff139e0a4ede0c159202e50cd2bd6326c6a8b9326dbe49ddbef22ab23d4dd9ce5c68556902216d226d4663f37fc989762681ff4d617f9a8c57ada303ec22b9ab31bee9e7e767dc4b43eaf6e2687091109677120945e2d050c75389bbe1a09baa2ec895771ac938441f961e0121e99bb48b5d3380a3edeead9daa7d106f86f2221bada805d38d16f5f529901a0550e02e9e7a7ff69ee11c462e29315592c1f1920f9d646fe80f8338514c50880b61d18c9fba0a9567264d0a60801893cd1cca64ab8a8a1fa96a51cc46028d733afa934800b110fa5d503d0779c790fc3d71e92d257873524eb58d70993ba8b41290a086683003f45654f84972f53e3c404abf866d2d5208363aa8b77982291b78ffa81cc35a2bce8973ccfacfbc1c2188832f383d16e9fc8874f10f13f2998db1ba6fb427bbb566c6d643d918b8c00649559239502ab2013fb74c28a8f84176784b8322ad7b75eebf5b1727d54387040d1ad1c0dc2b75a9c6b881c6fc8853406bf20dab5ddfcb35b6c03bb9ba199cd3b3e831c23a33b62a152eb306dd7ac6457ae600f664bab929c0bab826f857d96174ed7dc9add3a286bc5f91e44026b45922a9bf4ff730fd9e85298f2ac60d510165a7eb30744a8179a2cf08f97487c7c6e3ecd370429e756e1ee55b43918cc3318ee83cfafbe9531cdac1a16181e9f972ad472cfc2e4c4506077a13c84874371c1ebe2b3691b8a0cdfaa65921d76390ae6b9105c89ce0e20b8f7bdede4b9e5c7c339d06f0f8744c0ed67956cac29304cd82f8677e681cc188bccdb74e1af85f33f77a95a8d6f105d9ea0b140944b6ff078345f209eb55f5228efa2b9bd274314b3dfe4791ac0de4f81ff97fd32fed4c95bb96c4360d870ce49355a293429561e0d9ae3bad72d05732d535eb4594142180ac99784a2040c85f09886d81e2c1e430d35958782b8f35a2e4bbfed4d9a25c9e828ba8722a232cc43af1eca4b3f3a7a6d655dbffe010bfffd13fd78f561e04b0466157c2e3c4a98b162e554637d9319213429eb6dfe6308363df70b764553a7710c2ca55afe2cb96b3c562e430e79d71a6e1d73c118dae0a1f5d88f55d1318b535331fe0d120bb35fa01a22a3232ceebdc3f4b5be56d2870ccc7270702301a02ee4e89530184a919e74f980017f59e85df9855370a183009589102e579018d9f6466cbb695c4f97a6ac1060b55c07e68101471c8189a7b69ce183481fa3280de921f819c019f4fe08255a83071c6c74a303471aaaca991d97b65d377893743fa7e7a3f6918a30f8b2e0e34173fe48dccab80509af0182c9236a00a5c6cc5d0bdb52a70649b9e3ccbd5324607198aab81c1e5b0d8a472bfac026486fd13ac2351ba0bd75fffdf572ed036ee73a48a40b6aec3c3a3e2f5c5793c971f15951f1dffc464de561ff22f494f3e4c56a6999713c658a0be3190e73a8d9ca9e2354dbf951b2a3c818dd1270bd6ccdcf94694724a756c734b9ba22e7137226ab02f60d350255a2c1dd89ebbd798d66e2a2f42db454cd6d835fd8a7904c780722e8a6275d5956b74f929f869c62bf5793da10329e152227a751c8c8f44949be6114671dcea092cd52f2f09f819d60de3f459cd284b3e26c133c5194c51b9271f42b39a2e13b5254fbe3e3c8698835194278a19b027b57451ef7cc44f7b01288ccdd3f7112b01175981f39169f33a5332c929003e838a4d17fda84c86c5858f4e8268532448112ca64e4340f8f2c9ca71b62a7da7457d5f45f6de7afa848ef8f0c903cfe183abccce5de9e5403a84439c62f6a4b21e2e8f3ab45a8f8fa4b22b89f3f8c414f672be0dd980cd576fa3ce924fbf2e7f91992f91c4e8f49438e8e9c235d56609083e13f1cb03723bb651faf1c1054f0f8ec43a9aa1f246cb1753e641f6294d5517a6db8e26d7b21266f2a2b8b08322a85be2aa92ecc95a1fc5259014e24d4af49629db60fb42cc1aea7438271bb61df6d5e3e0ecc1166fb503204e1575f6aa8d225653a1c76ccfae14caaca116693a5032eea80a0cf62eedd103f70d89a39d4cc2a64f0f62a86e30e8dcdad4841d721fbee6e423c01fd70cf8b0b8836694b2dcd5340fe1d36a319fb17f2b877d8fc918d45048129ec494c44af12e23658b5233cc4b7bfb988c832878f5338b4bcd1b5e78c09ce6395dd91425049ea40041656638e7a7e987ad5e0a7c48e2c48b937222189d1a5088bd2f6c3c86bb79455a385633921729d38bd0bddd53c9e65523c57bf1e3b6e4af1c92a75e0edee267aa35197a7a6a35fdffcfe0e33b2887d5fb5b3149d665ecdc08cefa50898dd873dc1f8283415a65fd2ebc0c5850189bdb4e1b99bb839056cce68d74aad952467ab683636827bee267445d49c0014f095d6440041ad5768a239a4c26078a59a6fa10eb38a4faba04bee570a6b9db6b13ab4557f859a845ca0cdcc6e63ca81cd844832e1b5739638f4a7bbd53e3f25e62701f07a964623df0bcea72d388b03c0466714c9e589417969c49cd237aa71c727dc01aec6bdf0bb93532d2b816528e35138f71f70728550ebdd20811103ef37a1c505a354123d95bca0df5959b41cc1cdf14aa3dd654f510a913e761e15a90f2d7b35b29b00740cc7d42108c55be5bd2086ac389a346437d1fd010373ba1e9303334fe0a82d5813836cc26e8a3a7e5c13fab925b3cee043c0b92004ab85b79f6c952d5f37412519475def8f4d43a7561afba226e349322826fef46c1c96200ec35ecda2536f820c3299987b99ae967ee638654d26c26e51eb8b6b18893326eb9c7a8d50de16698cfef9d7ae8fa9baa7df2394b3651a062aa06ee638fd5adcb2854803ff52c6b304808dca4e3146e3212cf7d150b9950d042650a77b62c2a928e8cac4dc1a0025e1ab19c586c91127371122ac2be8a92c3e05c3d01e3c069cdcb17df51cc92d1fe61b4de8f7573c8a19f56afad89839e3cf005d3d2edff68ec0cae36ca03e96f68a1d389c1e8363417b9e6e2c968786805d6730a4df38639e7de7b4ff6f95c73a641840fab5cb661f1b7d593fcb435cb573cd35728e5eb321e9e702831fdb195ddb7e68d7eb6bcfd06cdd2410d2af07874e1651eaf07bb1a47f287263afa46453c9f9ba3239d3ae04858d205d9a9c0cae2650763f05cb30e412945a5958bc4deb76aaecc1354749d00220edd2c5e7252f26c7b78adfb267e50ebcb10e76e49f2b313627ae5e12af3783b9c9c4e23702d5c681fc4996e8c5434e6b8ea11ec03d3f90f418ea552600ca7b2ce7f6859d631cdbf1a1eda94e47b5350c295c2bd4f29b3c9f02cb2971c73a2a95315f5859e2631abec67a7f957e709948b28eacec039091aaa450c2089b3a96834921a502fe5951d00642cd11acca430133b4e6335136cdc0ef3f103583da1ca7b80de3547ec7fe38aef2ff6e5c82bfd10e98d09d155b48fb86f36b7f4c27ce4ebe1579be50adf90fa1097aa88119c38cda6463ccfbabb73be2d2b758227d7d6b4910faa52dc0a9e1a83542bd1a248ebd0f767952f741dceb95bc0b6f09f55bd505ed16537d6e9059db62be41dabc929d3107aac9573460817192ea588efdfa6b433b3ba03cebf7f312c8b91acaf8a3c87abfbbc37cc5e71fa5e30a6456096464c5d2969aca64557b0e2f6949e7dad97d3aa3114386c844f56e68549313e8a886e18f9a4eaea5d217faf4f8963abc1972535ccdb5ad02cf75faa4e870e5fdaf089b616f89b5e58dafe0a30150cfc59d868a31c9b601f26201e501d60fb64af8a5f740d43602e441fe85e487960186d84d92cfbeccec87f6a0b4cde880a0014dbba684944d8d305074fb2bc6ffffa4cacda82524272af6eaa1faf257077ec58bf894a3f6249bc67a2bd871616d4f3e296cd3f3418f39c5905fdc87709ad9bcd028c9d349192dc22938b06f7c4bffbc46935e8f1127d15463a68cfc02436578de57660ef82b7278427c75d9027f47db244482205f0ad7215885b84e78c16427038761a958810ab9fe69c8e28cec60714a128f60d45f7484c3bad8417889a41defbcae5706513475fd10487c790922a7c0c084f1720cc6a9340e479b385d5f47ca0d53d55a5f9ae31b5292c47011955dff57aae9dabd809e31faaacfaf1f9a8310044128f7c8fd42f7ce71945c581420cc752d5ff7ae793be85bd8b2175f778b039ba45df140fc3e1d59d872f772b145f7ae7cdc38e56acbee38f938714ad5d2fd73f3718390ab2dfaefe6e78621295b74df4dcf895356b7e88f939f1ba43c2c751dd823eaf3b5446350b583886df0270279975aaa28b545893d7297146ad8fc521b7bc8dd1898dc8d2e42f61896eca11cedb16fa171670fc3c1ee440606f32f34b3476c6128eaf50211543b8387cd16e4aabe3b08418f66fac3373a3607ee3ea2b8828c96338985e00ec714865388f18aec5c7d80f4acfcdc26df85e7b38480422f06d0ce85c015c5562bf178daeac47be30d9e949e161b9b87c17c4444b5f19e6b0c8cc01729897932d8bb72e8350881323027d86a3dc66ac95425e018ca956147ce0199cd084309b000466ddff7cd8f3856bfaf7c62d3007993147cf53740d896fd8a2132ed173833d894cfb36916b7f17ecc61229f92ab9a3dd54286dab24ddf2e1a5c4ec2f167da172b0d4089f9188429d59c78d462b3de1587585694fca9906421863ad606b6a1928ba1579465297564f831a9480ad28f031286a7168e001cc7083b09c242ca9d82d7b5b5003380ce7e8259eddac18a793fc20884ceffb5d859b951e3fadd11a155f024a4a9260a51a079fbddfbb097a40aed54c653d3971afcf88ad453418ce7dc534686d79367b0c370a93d6540838fbe712279cdcdac53734ed8a5eb84ea29a32a24125b2d4cea476cc57b792aedf63acc3a3a5f03c7d94821993b8ea0d63aee9f83193ac492bafaec2d1d5b4944f1b0c774dbf27c8836aa717a5d8ca5ad9f1e2567ee27301ed882472681dc4017216f0f9c458189c66a6864bec630a4a63decc9c726efb6dd15940e8a343e7103f81835967919366f0c932e00cb8a8c80bf2f8bdfe62319c2c0a9016f4a420c24ded12f7816c474542e7487e273fa51bcc64bf19df4cd644b2037eeb2728b8f768db2746d5e2d9e1c83f63b20efbaf522bb6f0c28597cf9cb3d949abfece20ad11569b087b06ad8a141c277ec68763cf70b56736ad51c9159e4772e59c8ec63944725de677a6759b6adfa52cb2503330bdda17c513a408814892d33a7204aba120b499370e54bac16733738ea81756b278cdc06297c2c14df50ebb5445b8d2c8df11bced6546200dfea2318841753c7adb064351c919930038303ae527809d3507e2a9ae2a77ca7a2c8f50a06907cc113dfe9bc211c928da5e2c9b5ab9c640d0e12c5d2f4cd2a8ae21ad32648debac21ba10d697f040f2b18f521b2021d2a269ad64672fa0583ffcaf79d9756a12c1626e86a9d8bada86ed574450434c30e1c2c7391d1fe514ca19a96619b38a452291adfd188066b87552e9f5e0d4ed3aad8e5c6b53023735c1b025bcdb475c00bb8d9edf020d8c3e08efe624e1d4646c75adadc3d777bfd4727d9ed331d9b497fe3267ce2ee9bda14a03929848ef4b61c544de208c7154e78badc3c32bbd65e30c375fc6739bcae265f2bd5ca33c07ea1f4c025ee6a571983503dc822fd0722e88cd6efd68033ccf7b9414ca6b4ce630832e59e2399b8d9bc574ec344e012821077c360e2e00f291d9280450c51894461361a85f5873e6d5d46bde82e194e21dc1f580a8a63bb3cf3d873d64af7219e24da42e6b673f830b58983fcb8db6856daac2bf9e1097f9c052d2c431c20556c2a4ac27bd9fa37e97ff4a2d01e2a87c5a7e10c7a6f4cf28da8256fca30fee442e7842506a2a706176d4bdd953870264e4661d5cfea3b8f5586b8704d506ea814f8c519adb9aaea19cd8fc561e5516e5b5c147e745569518e03d7fb5126e79dc0604bb8952a45d90ee3baa82f8651f7a85e887697d162142fd85d1e6bbe46b259a3ad0ce9588a36d087a56ee5c605c0a23117e181a8ea7a27793e8dad80ce64ff5052cf4b1319b4da0aa6130b41c604fc6fac2e1572ad578a561612050944e83ee8642d574f9704b97347436dceb3e2acf2b4a1be03e1046722c4f273af6dde9c6f2d1035ef546bdf34fa2f129f3c9120fe69053ad54d00748baef7dc74b61c9437e1c3f3268b44a292043be04c901495cda8c0692bb931d0151deb098346f6fe6498f15efd6b2e4f7efa0288e7622a849e658b45663224c2eee37c7c14a8d5c41d807849027fab4ab64310007161a9b2adabc990a5746118570a565a51121591748eba4abea5c712b4592de578e31e5942aca2823fec123706367d22a2a355d4bac15a9c677787dcd60c5f3369bc2ea384742bb7d1fc1831fb2ba60b046cf54007effde30bdd1c1fc279a806fa5f821d0697461382436530658300b8853fe084f4410d439a65bfac36dd448987894ec7b49a4c9f889a0fcbd50941bfa6068631a1dd6e4352c0204943f56ad9d3d70d32f0587e9b0417da073660f9e420d544df06d0dea451c35d8c0cc8f127aa542b3d6426d8305c8c194ea202b88836ad4620b55faeba423e0b457364475a13ded8532776b50fedc9202135327074e9aad3b024dbad106f226b4fc021d6be9d15f9f2fd24a4b1529688c44eee0354655d2dbe705d8a43ecea377549328acb5815d7d534a183505d6eeb2abaa842d69c1ae90b420e15c6d35f5fe4fd4cb734042d730130e069ba51345fc54603cba2c8c38985eac5ef94e21de046b706940dce4d861133d70b8353f7a47884344ff66f918716718c12c6431846922d3bacb290c07561adfdf50bda3ec28dcfcf850c5dc068d36dea21ef63bd8f30b9080cd39eee93dfbb0d679267d5b928cf0c82e82ef6719362a9b03b7d6e586e0e846c4668a143695c1438f7214d634f5d65057a0941a337daf747a7114de3942572b955204777828544e0e82d9431a60d5add47e09b99a23f11f218bbd9f8cbf945cd2b5a6c391aa3031b4d9ae3d030d167ca5abc64bb8653056258005d2d29c863fe12a1b175f84bfb846ab4edd36a231014cbddcc68a7f575093cfc509871f4de7f8b7adc2af953eefdc6b933350e6978421e29477ab1dbda1f6ef45866b559082e798048a6e540abdcc05a810d362bcacd5fb4bca297b0a4533a82c0e8c54dd625121418a16843b8365f9b7895667b777e2fb640dbfbb30f3f3196c7022577f129f2ef91769a290ac70762a38129515dc4f6c86f18e7b277abde0bffb9837b0be0bdaf0eb417f79cd482f9cbb075127425a011ef884ff3f779676355f4fb8d957ba5af20af36d618bb3cc004160a5b9f498458a95ccf6c2207a71a365a501d171e95222cca9c8018d16a652c47df1acdf26c119ea159f1168fc114454d6bcd49efeebb9d56d2c6685719e050297fcd8141aca640c77648292c39b1cd9659039c9ad3f63e6760e661ba633d400e2a5874a65f7d7db47a3f6d6eff912e8f5333f9f152d04e193d31b199d2c6e4fc2daaed7d4cde5d40ddd4a9bf3970e7c1ec0c63069b5d5e6aa2988365d0df70bd0b430c985c977d7f04bd61bcfe3c65ef92aada611f5d6d5c03e569c88f5465a2cb9e7e85a158552631fc38c40e70b4ed29bc48d2ac4883696f7a84ee6fb2bde1149f1d1d40a2a8b026d986a73c7b3edff846e36cbddb01bc80122bd77de0db9f8599ebe9cdaee5bf697e083a1f63808088375b5accf430810aa3d1b339afc457d1a49e457bbdb838a0097da3b3a698d9f730a66387d6e6b70f5448bd93cc7aa014b2eef5b0b994cb18a3defeeb81d9636d318ad2c07849bd83a45d53a78b7f84de9ca624f947f080d9c3f00f9173f515d0157b807bb443e09f0e309b68ff636c0c03ae45c9237708b6a8b7953489577c07378ff51f032d77c12b022454a31d86cf4b4e239b249fde040ab420a1e263e90ea0eb99a0a8bc7db5518fd0623182baaa3edc0db9bd1a1cc249118c5cf401216cdd8f72ce9c4f32d01a0f6399954bff77cb304e22463b9ec1e1b1b05b5a73bba47e1ae1c70ea17221e2f6e0260afedbc85d55cb68110f484a258c184957e61efbe6a2e8bc2e44f409dcc0493fab77f2e4d2f058e832ce8588771f6170bbb397ae912095e68730092cbfb7b9e2f36b371bb1f286729b1424bcb75f7033467e32e94d246826787b117dff0a6cca95b6703d90c106f7cf8ce688314845d0e044444cf3c80c035f10b9b86b582c318057f4df6f99e4141a66f97e4b9009d058a79520f1f22b18dae269600173181a254d705beeedf7ec24a1257d948cbc1dcd086a062f4729188baa03a2d18bae85ef9f12ff281ea4398014556155e2192701d20e0d6c56910554df7b56e21390fc48f00e9f100afcd642c2c9eafa819beb24ec0406892a71fdfe961a6d3f91814f62e60bbc6607bb906276be69afabda61f3717279b22dda766df903b97651801b9fd7c9a9015d3152691443504437a9b6d73ef0289d9a2af904b763077ec581b6d871aeb42ca0e8203efa77615486791331e0817f414a28ec48ee6552b0ef75c5138f02485d4579c2ec3175d9362fc88f5cd1427c99f4a09cc31af6bd87000bcd5b7294b3d1d2b688de7affc3cf603467861bd0ea1c8c26bea6f13629e86f8df64c6244cb0ab7770dc6d536e8fd2348c33ad25b465632cf97b775dc92b94314d9b7f86d9b8c56b5eb3a399419e7433d0e06b3df0864ed8ce9fb307290eb028ba5e5962ed10b305b5c9b621aece939031ebb94dc84d03bdb29c07c6a1640aee82d7a263320f81f47a41a7b18a108ee9604ffd145da6eafec24f2c4d99bec777209f89180e8b10909582984754949ca05c02e3a5556c507da10c67a2fb4f634656caf21771ba93a4848c1aa3dc369e815c1c953236ec074bedf912c73635a0d8d4e77c8650e6b68b69a5f98e9a03554ac5a673db994cefaf7d6d0f5830d2ddb650d1957f5402f4aa1f6f7db5f0e6a575843b8c833744a4dd6901cce11f3bd2e635a43d6c36c43c9d85c908495968ecf09da104161470dc599c59e86246bfd4f1fc0a82ac1ee127b19a939c79c43fa533303e8df0f67b654296f5385f24f91d47b206d061b2429d276ea330b35e3a51b63a1060ab283c08239bcb786bd37baa2a01eba269d8b406bab0bc940eb08e9c42d5ecb131f017d3ab67f924202f3b23fda4ab852c8d5ceb1b9b83c40f7ba2f45164f12be9ee3e3cd2ace2fb3e10dfb2fe3af83f7e17c56388d0130a33edea4e8df88efd09ddb87113de1771d3eadc8c238a20ae433987c4499f3763bf615a7ead885e230d3e3602b53d207b9f18f23b4cc76de220576de48c7dd0398f0845c497cb1ec9fcc52bcdd83190a3d216be940513fba99df8c592a1759a777141e1a50e333cb7157dd32bdf1bfd0628a972d070bb6ca65cbdf8d9d5a6ab8e5b6e7ba7108cce2d064e0e178728323f7966422627a15575d225eb7733278f141206b071d0b08c11ca95e2d172754be435de4f08dc8c0938e0a90d6e3e501192252b15a076fe938f4e2bbf08c2857445389a5e0bc56b49271f8ba764e303a4004ddbaf993a537739434add717c27f95d8ceb9bea96c0d7fc6345b6cc141c6519f48cbbe541ed898d613521571d2793d8867129d96d2dd9018d07baf6392692e2fa8bddcca1b2c49185633dde6ae54a17a82ee09f5cdc58c6e641e39885c9670ad73f138c1dd93abdada0d8df3117d09c7eb9beaf5f10f46e93e2a5f9cd14045dc3abe1e37228e40fbca0aadf7a59e38ff72841238c3479e3830f7413bfe8133911e371e2f1c669ff871105a6ffda2802c49b72fbc80ef84aaa2fa1231a489ebf6341d71edbe7f0a9fa27aaf99cd9d9d78a2c6efb4e1e2541dd210a7d68924cfa8ab741a465722493735f3f801f16ca40e11a72face6b6551a44a1ed4b0a4496ea3e2ef8b74499b886a206727878a2df620cbfac2eec0bea0b9bd6c9c5b56802d51ea06f505221361c78dd0f8792fba0a95420749de18abcab4ad3a687d5866402c0cd71ccf3bc9a45a26d7b78ed543671268ee5345af1e3e34a88407872c161f92400b4f2f441b1ebdb431ff5c9bb2cbdcdf7556f6a9c478fe195fab867c98e7651b986787077fcce85ec9d3a9d1482a88fa6899e2bd283ca79d29dd57b4caf406bf795d7d2eb660ebe7d87e92ea00e9dc683d8ad6a1a7d3ae0ec8903243128dff1583a04113662ae8283e08089e9bfb24776e454d1d13d47f0b747e53a577fba98d75db70d87a992d72321033b436e74d5b9de9d90e6b27a5871de242ba38b5f34331872da6759b4bd8500ee443a06f088beb97012f3e56bcaa7cf2da7899ea8072d203f488b58febc2fd6d9b578070034ccae164935c82764b19082c4beeb48c89200843924a606672f50a3294c59c152b9d909f70e810027d13a1f43518527dfa32fc71db3108fb23995113cb01f5d8ed36e7267d080e5351efae9e602814d798f6592c6681c8d829f096a63fd5b59a6f15ceaee6bd2c663eb51a6604671104e1abe86bcfce2336e4a4aaa3be7d555a23ff5432f34e1ffb78e5bc194aff27202ae63e3b3a0cc5aeec3946a0b4ca42882cfe0c836da59b6f3b6b74d570a310750c4f4f453ced577474dc1e2d4a77ca9558e87c1b6bd6aa29c13a620be0b99b3c79476efc396912292c1680205ba3efb4e09112c8033d97fce3070a6aa0be563d0344d8eae3f1268f22bf0b67ea7f61d53b5540bf92e15cf9d74fcfb6b2141c776d87ff23b2d3c9268ccfe1aa6acfbf59ab1f61c40c614e1b942879052cbc135b86aff93e7ac8fc5998793c8cc8270928a9c0d51e4de2d67d87449d8d4320a8dbcc2138d56e604797f700885aebc148e21b20becde7925fc7966990605f6e06d6225bf268b18e2cb5e1f8338a51d15ebd754b24305dd0f5670952ae77e5f3a35d2c050417a6adbc0b3d955ac9c5b37f036407994ba22730e3399983cd75d5a2534ef08059b50a671888d5df00ba3e1fe04959836d7e2b763e8a6281ad0281a1db8fd64060eaf33c0832f05732a98e547c0de0ec43817b8ec8ff3175131a7cb7d039b6d8b9d9c26380153038414a3c520acbe82e346532bc180187806584500da76ff1a6256132d58f28f29266399768519285069ab8e5ae5cc27fca09dcd38ba269472a189114a3f720147b897f6c5b2319168c8c6d8e8f9acdb0367e6f33b21e88069134de406c291a2994a089e8927e03c85681d3a851520ddb3d770204890005d447a62cbd338df8cae5983ccc2308f3c078f3b2d1779826818ce23d44613a594b65c1f0dd3da63924b57b8a8cfbecc37c39ded6a27fcbcdb7599080954d460637c916c0519ca79d5f04628e1459f1cf87e834945c2af289764c8dc801aa4767ab0bbdf562d6776a17c7712d8a2e43ec9a89245913d833081760fa54439a5186d17904fd5930b525ac8507a5bc2fa3915deed87139bdcb66138eb2c9865833064f14cf566a53ef72f6e1d22954906e1cbb005fe6c962fa5ef4b1c818a756d28ca17b3e2debe3767ad82f24c6f1b12e7225963f96f8b086d0474c8f910368fd2163320676bfb941a335f61a798f8d6f5361aa2e8dc9a596235b1a67a0ebbd95b2579ba0b133e711ed0cc7a73c1664e1f562cc9c78b4c8e1002e4bc318ae7718ab33df7e257ec674e64b4d502151bf54de024f5a253b97fe00c07469cfdde7c8010de18e1a0da8b613f3328fdb153dff49b2a3e698fb8f5018c7e573d0ffaecbcd525616a10b6de40ea2adf796f8e8e4c9f02db1b0322391c5f7dfc2f92a9d8b4c37c051a281a72d43a1e1914c94640dced09aab81703c4e7323c0d12e55ac64f783ab8f72e58011c1e687ff1eaf8b4396480c280b8b5c79b8c2c5c4b8a344478035c5bfd077013e24b78a645349628a8b3bea564d08bc1a3f7836d6bacfc2ff07515dc308721fcc4080d024b80dc79f925111de14d30484878c0c84d13bd8a3ecc1ba8f1e5d86e7e08a6103178b557f94eecd2175b4b6009b8821b30943dfb219300524003914a0ae248d353d4b44efe5373879825ec5017462a4118a8ddd3eddaa1b03b365cf567c48fffaffd11c623cb11497b550f1e81e4116180bbfc91d4acfd780e75ea2b39878d420d75e6ddb4c92771ec94a8e3b40ad5aa37168cb489fd9d75078a4ff75c19d01dbf4be98e54b5912a236b6b848a6938d65234070e376ab4efc1031eb9263a5d7331b6349e640cfa06ca3762e5df640ca76bef05a40b360400ea254a57d73f90c96c2f5ed6df777deda223c0da3d082f34d46f64450c70130bacf1d3eadba79122649d9ca67618de8fcff42ef741c30738cd442f25c6c91cc181e6fe3d413847c6b0cb0564e36ae8c814b448c0ce19a74b0d8ac0b70808467fd0edfee25a0e16a629f4d300038f43b3ee1cc73b7616454402b55620f11f5c105290d28c29a11fb289f52284f0731f18ba396691697efab35b31e75edaf7e6783ff96dea49c9975a5bd20f233ddda7d7edd72d005b76c8b5289064595d76f5f24955ad569a865e96c3356cf83713a39cbbe2f1eccb3b7bab381ae9c4df592dba14450f2345281525a4b8c94c2e6d841c7a6e693e2ff77e2a03943a2c50e3361115b02b837d7dd06c436441df5aa81d50020dccbb47d3bc8834f2d72a7df55d4b1cd9ead8636da9fae20d7dc81c0c742699d7a49743e0d0a34cb774fc0ca7d3b0b34e427b52b9fe56386e7148a610de726225dfa6054b165e2ea2f6fe54e6af7d900d3ca00a4a35f7f35defedadb147484e196186f0e45430f64ab06394aaca5d429e8c285b19218196e5f29e32f9d5f1875469b1fcba8d02aa6d4e3db1dae3aa7bda6f94b8f4d083f28ba7c182adadf99a708473e89dc5b9e17f82e9d1dc2b6634bb50f44bacae0f1142200ed11156d331382c0233bdcf0528df216453d3e2c4f7cfaed18b2df21f7b6ff79fa6c5a607f02604acbe2e576ab7d2bcd29e49a37023becb3d37435596db32f69352b3d24a9c2a831c4cc7ac79e6f8fe1bd6f4175df989c1e0e1da6dc8f5bb2b989ec5459ba855e2507c55df2d0729dd9aa19c80992615048c8de158ab12368ce1b58efe64eb28b7841d3803a1229a4b7c679dde60393d4898dca0a91b86f526918897a5fdb838097a1be442b030fcce7e963ef73cd718fd1e6b869bc01b884d36e763a8f044384c94971df1ce7828e2d8b1ed652d95e17179ea3df5b66a482c725cea567a6a95ef40533f0a05acc92fdc4b4a473b665d871e59b2c0500c12c4e7b62ab75d86fb3141cfaa5fb9912e3c375fef5510801797dca3846e10aff94a20283ec396ec3c134ffe687062e08b84ecdce4de8dfa8c2fb754d4e6de4d2c3d6d3cedb5481cbd97219a5a0931146099b6c81ce3df12a80542a68c99f6f01099d9c8112eb8732dd7718231aad8d97c5c29cd19c3f8c4a11d551303ceeb561cc95a996c7b5386ad5ad691181fff37cd58e24306a4df9d0b3c78c0fad00e2df332d38f3a0f9de86baf9ca2c3d815c53938fc9286605b21a1046d26e8791fb39b6f2fe2a6f02c4d5cb20641b147cc31fe89a4ac16a3a88580b8dfe165400a936541f3276704bfceacfc62f7e271bdd922953356401376c9336bb34be859a11b1c6618c4c43cbf0766f126f50f8ee972e2e61c9e397d97eef802214e0d619da2f8a0a0bd69fc610061d8911ac977d378709d46b29669c4d2d141583bd1c8acd04b351b1ca6b06dd7e7dff8d15346329558427ccb88491f4a3b29b67b591e97083c6b5048b72ef4c8b73f654d1e0cb80a6dacbb8395b96b85a6eb4b8a5c2b4571bdd2b274e351a634c2af7578810551e46253516d6226f8f367a0eac741c8c28a5f3613341284cc8a11880a5cef1dbfd82850ffd7d13591100b0a3aa1595657752ca765979b7d3080c153321fd2464659b804c09ae4164da5037bbc53ea539ee674e099c8ea3c1dd02ad743c924b7dd216a0edea22bb9b835b9fe54f63f96d093546614613f426490f5100cf774a88397c4e853e279cd762752c269e85671f5e47d1a58326a2d6e3d98053b14fdafec9125ef0916dd1b9a598814388a6075452b7c32ec8aca86710bd15e611e0b51a9aff2cbeb37c41bdde0935cc449ed67294bb204b5e07db59f0930e8d35014ad366f9394ac1755a8ba7ec6c7ac4073a6dc1715b687a4c7b7c90624ee15d2a42f2afe1bbde22e46e49269259d8c25f4331afc10a5248c33a95177c20ce348c424764471f0b8db106419cab2452f49f6d270c0c8d8288dc7003b69ab7e70f3afc06e17a165b2637033bd845f9729c13791c67ba4e32c60453259dfb5659a6df4acb499c764d0c0c7b8f37e7144f2c34f1b6110eb371ce237ce011405cd2f2037a8683ad53e504833fb5953d91d7d98b61704401c62c5dfb8970aece41ac74686209787c6a04f6f4c18b0be001669277fae213898fdf6bcd388ca7da17c6db1ed28d48ddb938a897db6446566cd2684e9182a5cee459064be7411425363657b7c97a3b522faeff555a6fb56304ed32335ca69288835b2bebd53d3e507335ede6e555b9593146d238dc94d12d35e9176c27af56e733bb335010aa47ca0fc463e9639fedb418546287e66069fa3011d0e64c4984ae273549c37a10b97c47b8cdc2b539969ee5ac950edcef19f8ef0d4c0a73bc69a8e8bd80da90abab6087a492c6f860b6f24be89e24e36e6e9982fe34b310e6bab1c299ff7579b1d2790d913524ff68d48388175fc789a045e27d79bcdf561a67189c71434c090d6bdebfba6bf129cf4aaf8e06a309f41337e93ed7ae771bacc8848058572529475a7e849333e5e32dd194f17c2bb7e732e4aa1ad080c593563df559c9db5b1aa2300819f3934e29cb3cad5252bb3fc1b211c49d86fbe5664e9a3535b0d6e455b802725733e16c41e59879fcc313e39832bccbeaae9d3f4469434532ca9114aa37b5533a353683bd7a98b84161345036a8aa307daced2d80e448309ffc0b8b1017ca511926b37cff9cbab2cb81b2f7a7c589654b2693b3b6977c514be8b654be2e426d5a365ec862ac671e6d42671b25470f4b0fd3853174431f1fdbf872513c9a62246d1468663796080e744657e8c6e6b7edaeb3d797c66dd89b3cd2ebf66799102953bb3d145dc8dae2b7f9d5b772b6262d0b9e5031f7ad136e0a2b1855afb0e2dc46cd8295e5008a2fd6a52157bdee9fd0466d22a26bd02683da7910a6b6b881822acdc91427888cc23bfef9f2127eebceee6305b2d912d13ea3a07b3751162a950ee89f0da5791950a753685b1698d609170d729b88deb904b0a734f84d7b888ac54a8a339bc6d3b557aaf0eca937d6d40f152d7f235faabb02428b2ea41b9583396e34b8b8c8b33c2ca8dcdc86bf363863a9a6719932c5f6528174493218c5c22e3332bf018d665666320504ec55862c810c370713c0c6754ac30aed85cc1905c7201831421f9c5e1ccc9179e95a2bd504333793189e5db85f2828c2e8491db5c7c6685e2c2bacc790b24cad116cb0ce15a182a8e68e1848a99c56b2fc294f17c7581dede8bf1fc5c5826610b644827d96a81a86e3792a08547c8229ac3a2f2bf53fe7f86b8316ff2c8bb6e26717e72c46139cf2f563b9f2ca73c42a1ee6715579e479e5f0e697867a70557cd13ce258f3c94ebe9e2ea7393e54b4616d2f99cda156d53166bab957ba3496deb953a0ce3e2cacb27372178108a60bc689884a9b1e8610c1a5a1257f561e0852f83094730092c191486a7127a12eb88424b89774715caeaac5736f4752ecb9261e20ce5183659b64a91e619037f0c03954c019d75f8c551500904d00c837f1c8196a001cd72f8633028090aa8ac813f1e834ea280cc18f8e208a8640a4896c13f8e814e12806618fc711894240d68d6c10b15474d214ad4e3921c71bd99e2cd45469a831d9846d53fd1bb82bef52cb9b3d789466bb8ca72908b928b292323a9915c0d83d34472ce4e1a719149d98b91ec9b02561affc1b977e42d837a47b000c55925837db8a93a338e4a3bb6e9661b0a566d8e0fcb63e4777d945649f3fb138230a636149a04579db4c7b78163ed22e9d03e7b5106fc26d87dc77ed8b94737cd7b0b58f4d6f352f992e0e9bbf0c6af5ffc7b6d8d01cbb5a8369f78313c2e449bb734a1b3acbae8a35a8e8faa4e1b6b5f7286b6652000a388c281790f4518c25db40479531de491e9dbbe1b4a80d66cfde49c16c4c2bbaaac7bb8ce4577748f28ec96f6670ac6e98b5a8ec6cddbb0e1e4fd060c15d118cb57fb8bc1a7f96f0e1797801f4a38c1dda2525b7df018d504bc102480452e3f6ef47e85662a50f3419dac4be472ee679cbc6cf4b7c16d83573ee14d2b03247d91ec091b2f134dcfd6ff104f2adf426b69c10927555d04b8c739709f0add03a035247ebd6624dfcfec8d94af3aaca984541b22cd966cdbdef152fedb58fed2a428af49a57d153b18d4fc4d3839e0d3f0fe0c57c4490a5fb33d034e3f6e76649e52af68afacfade91a5b7eabc79376b54b1b0d5e7b784ef547af4bcd28ce24a92527465a07cff29a9a1f10df6e78dcff64a8fe0a889c8eedd1bee5ea1ea5df9daa4a297ed0a4c700c59c7433b84f4345efe53d9e65fe53998c83d0ecfeeb5461a27ee7abbf054e28f33329098bd05457bd1aa54e9771fd070d98761efbbc378bf7f6dd9c595b421ec7546f4a16e21c4d63bc16d968b138f6dd0d8a1cb0f1ca7ff71f786de075825e2613ef6487357b3f648c5a16b48a9db207595431559cd1692d91e49f80553e92511c9dcec32231beff22d268e01c3dcecb97b24a9f97464f45a1b9d798fda54c640076a4adad8a97546c1114a1d8385cca0ae6dc74478d71261c178306021e6ec6fbdfebe228b38253a769817ed32e2d42290fa012bc024ba9964a7932a797f821bc31214cb600f3229a365adb631c3d89c7a6fac104f5a76949b27ddecd75b1ead442a7f16f685a7930f4c21591a8a327e7e9c7aba3815db567fbab82df314d29c187fc97521eb0d7aba9ccf8797e58527c18b58509e4b798c39c08e2526746e3f5c0635729d5ab26852604f48f517206745c7a64c43404b26a8f0e8fc7aaded0dd77595cbe58ca13f9cd1bfaeebd8b39ed112e2bfd6e535476093b480f28169d4d558c26383e50ad4a8eedcf0f64bcda1b412e331ac8ad254c2e5b9ed88dd7038211db97a8bbe9570eb7237943850988562d21eb059dba290d816ddb51e729afe3cecba13c39ffdd3608f8fdac0cd490bd92bc6cd8ec86e34b62aab67117748dae72f049e4301369a8f137b7534211bbb020baed733c7bb5c1eb622cd79a5a2792c421b5308266f79c61b4ffa2f6db983d03ad1d601b71c7d8806294539f816f5db3fb13f54ea933df4d9bd435f10d2cd318da0525415e90061f2d78c561eb6727df94a41cc8501e45303b6bdd9d228ed54d0a0597d8c4a81ae0ced2036ad16403c7edba9108fd7517b2d1838445502125709b03be681a76383c3bb910b93cb186efc817f3c24b13b957df4f78e02cf95de12303e58427ff4e5578309b69cbd02ba8a0f722282c0ee05afcf7417f0562b49ff68f02dcc87f614190cc48868ac04cbf542b262a41e5f14de53e72db05e12383c86461a3de4d9e408d815fb265641b0d7f76a7937c8965981c0d172b792f4c00a30b46ca3595f043d1e4e1abd58968659d5a7de5725daddf99c626484ef8a14b6fa03c86ef02b14c49e16827b1a06cc6f4570f27dd11f0b2cbf1c0ac79384a318f53262b978fc11d96962da9a8d8b80668651804cc583eef81a7fd783a0044e6fb07dc03808c8921e8eccd2d7f8a58148187e45c54c461883fde37d9ead33a89fad3efbcfb2e1df3e8b34ecf4170f2a6554a1f1941b30713edcb533b9403cdb41524361a4e038ab035076c6918cd700ff4fb66f810882736605f6673328772709480ceb7cea76f6d23d23fe45bd1411d34d3971d373c833100d82291035dbf415ecfddb73c7627155ce2b34bf3d57d80dc966ace9faad38be713604002157ce399914c5a5bf05d8ce348ee56e7c81168233b30ac9c2423d3b9f33d273725f82fd6d7e0e3517376805a082019400e5eab4b99ad8e6a2dee32596f7a794e0eeeb8560e25c6da756e7f6ca2f838469ae50bfb5f776253ebe74a9a0697e911df1b5985d43f10e8c5e92a5e46cf928691dd054f6cf7b6002db03fd08425621346ef26c8778ef4949f70e23f7e9cebfcbad4e341b9c97ac3edac3343467fa274d4578bcca9e30adc81c57ccfffdca3ad69cd35a5526ce3a46432cfe985e4cd1dadbcc73244bb3f412e9d8f41f94bc1abf3c684fe36a56f20117889f4950eb2ca11b28288c86ae7ead021ba273f94e11d214f9391c6b82f7db1c3ef61f6c2e25ddfe911041f6e829d8164b950c1c8e835da15d94000456c4ef9ea170f4864df90c6d71636abcde5bcb3b3d005127fbd07061168b6fb587e4ef5db67d0af218088ef33e249643ca0db27a673bfd57319e958a807a051a72e64a92ccbc4fc8ee091d0699d3c5f3cc4704ecaadd08e25a48cbe533ec6d66ed7b8e990254d251fa0ddd2c1f65e33ed20ebbc8cfbdf8490ff5a755abc8ad7305aaa0ccca5e0d92d51458c80e639de01db374a7af9267139e666d6f50d8a038bbb9127f07cc24b05e609cba3383a7daa8aeac9ebbe0fd3092d575b538caee4347850b962ea2640912dd707d5975e9476b42dfd1a25faa426776297e1710a4cd5db69288159ecabd26fa2188d815ccc9a450d38120c36b2c50f3f851b4d34c5218c12022543c8562ebf09c581eaf0e4c72f270ce41e182171adf9e50eaced051cca5a390a1cd600a899af62ee4781d74bfd9092dff13b09e0a15d728839dc1478908b606d60b1ced39a6a9bd4db93852bcca906267e8e0ddd33aaf601a5459a1d4f697ac1ec06fdb8ff61c7b51c666bda5844fbc126c632461fb05d34003fc90da312aa1b740cb4d5762511fce60d0a5864997d3b683a52d8167bc370bc9b2d85081e7c84e8495655b6a7a9145063ba6095f13d6719fb8ea8fc7cc354eb2a4cb698cea09f2ce645d97aec9e2e354b294356b0d3be92b1b643783586dd6a3d71271f155294f9a5b858ef4c908de9931a696c5d1f759fcf85a9a73cd2d2137fd6482ecc618abcf72e95a263e7ee5b3cd0dbdbcbdac8219310d052f938d5a33c57eada5744aa27dadab0824edc83fbb1e2c55f1ccc4c9ed6b0f8a360bc2881d4fc0d012de8be0b824018a340180cc32b382cee035f61a02335360996ddef007327e80b4c05322a177d3f5b47b577c6f13456d387814f1278b86d420d78270249deb9b4692e5605a57d71758630feeb0337a23de36f9c50c90acbea2f6e73e8dd90e3bdfc4bca1b030bb072080ab2a244b1ac43ded48af2d4c63703b5565b9d82f29d579aa5ba3e0bce225ae9009622aff10bb4bd8b6df7a808d1009990a3f29f260dd5e85409f989971e1a24bc15d32ed567608be93f00f3f64a7995a70f3a1ad193b0392f0affef699f84747ec345a0a25d3853cf9d5f496329b8bd3b446c9aba67a76ad1912b55bfcc372987cb014e397a041115cab9709101e42c95c3667096900eb8bc24b72a20cec992601f2a908e145860bdf80c8bba3eabdf07473563aa20f059c615fb70f0b37bec18518fdc07416c413ba499f0ba637c6a12aa099b502970e4dc0546f99459f9a6c7a39cd0dd6cfcf9a4716c0676b04e791c221ec9b57e03359c1829e308e782130734797c7073f6c3b1be051fbe7f2091f51234980711c7a5260a522972ba9b0bd5d80605179bb1807767b95cc75a3ba956378362bb3aa53e74c2613a29514d8fbac4135f3c9ade2547018686ffa697c53035bd66dee02da284eb3fc313091f5c923ec65fd1a0afb4425905ae7e5583f07a1061daea02767b6147a8b6fa88530849a4d046b468ea267d3e664e099b962c70d4c6b6b34dac59dc2e026a8ee789176e6a80b9ec860eed2827cacc907281cd7cc163d19af4c31cf2ad850d84180cbcd5d986da59dab96640039b40ea06cb74af14b042be3ebc0f34bee352885c43a9152e957f03d478551a03ec1b117cda45cc228e5175e342323fca1eb090490527dacf89851caf439203b2ef37b056b3fc1d36f67c7529dedb081b5aa6461eb2bb1e32554f4b789471891c68cc96643161aab76e33ce9f24f796129cc575127a627845ecdacc27432ba9a21fa73c6dfacfc34cd403252fa2ec50e012b4cc22f707c47bda54f8d9d37b0656abe8dc80667337cc86632a5cc99558290311e69b5a3dfdeacba7c513aa34cd7ad7c25417cd3c14e46f0c6b9729bb1197e1ac2fc1af27d7d150c0fa9423d955acb52922cbd049f2c236a38b58e353884179afd6d7572735044b50779246b2c883ef50ed34cf0dcee9954eae3443a283391a20386556b64388477b2ae71643e83cff7a803c20d20248eb245f02ac3d76ff14256b122c54cb6455862ece5c0c6f02cbae2c4db3067a745a3f44169179fc4d3ec57385aa9ee0495c2258ba9bc2ce30c101609d0435bafc3644a4498cef3587c654f460fb50fd452a5ddc91db6507d25a633b925ea42924e8e8cb51f1d1615e0a7d34273570cdb6e124d35f6b2827d9370b5e4e99e8539acc9d7e530f3ce9aa1249eef1c5ea78275963d572425adbdd10b504d8d483544cc5d1763c87e1cea9883ae0caab0edf70a17343365e7e2f5a411269b38df95eb2a582851177da95974aa11ba83f0469776e5575e709d2fb625358c966f902ceb519a62efb4e0fbe634881c75132fefa7656535c6430d37ba0cb0a2642ec59c33fae1336651a197513edd5247892b6b7d4e4a854c116f1f86ebe5a1944c2c207735d382f3033347fc812b0638ecf86c78c7e7333cfe0aee95304fcac92cb69fa80321b4f27da20bc59762d0832790c3e10551d68c4aa9e329372a8516438ea8584fbdc2d8539c23da8b379a251e28089bde8e62308a91415cb9bf2bcb8b897faf16af28c8fe92f5d7284f7dfc4a6406afc40d27902b2f56a47ca399359289673296bbd913bce11c2b881c097e8ad38657a34b7a83cbbf7404e29f6c55409a8b4443c5ed6802d230b5558d2f1f00232fd11129b12035363693e5a44b5c0360206073517acc429cc80aeb18cb610f48debe0bfd8810b74d60334b1e84ac84058d2f692b0bcba28e023f906c3bb2ffb810ba7f8ef02286669a67ec6c2cabec7c806aa5fa64d2a21c142f20a7c15704ecbbfca9915c048cd157d8159556cfa5844734c09ba2aa28d4cda17ca9611d0114e079e7c7f3d92b41385450a0dff50fe49327c8d4ef4f0de2ebd042098edad7e913f89b1137c32cbf0885cdc4e089a0f61c925e12807bbf4649964dabb8d253c3e7f60c904a626a54686d0090621aca9bc811f8302a58dffa498d199a1ab47af4282481f944122e69d8696930684beb6d9fe7ef4a637fb1db34d0135accf6a26127a069643bcceb6c5eb93dbc69d85c1d44852b81748291e8b51cefdd3d4ec496a1ec050467e7c614f39b86758f6db0ac5e0a16678efd09f1930e39b534ecf306ff9f911049ec9c1267c8dfb7b2441baba50c62bccb9371bfce9b37ab19df2d71b702c15d71825bd233bb7e1f1912c32929c56b49ffa8c76c9fc7fc4cc13e68fa9df7ce5c1eca4788f6ab945f0cc45b1d5b5b624eae898196b1d8e7800974cd0af67404cb3a006bc38417ab3009f54a8a1d62d9aef08c0a2262db12d47554b341403375ded676df2bc78d1fb1a46147239d80ad96bc9d5e78a743261e960ada94cbeb04f5aa5366ab8ce76851c0971c14d68f091a2779758fb2f9e2f20daa5093908be3bec29dc840e681fab0f78d3d0cecc5bccf79f43984e5b18ebdc9b2f7927509d578d32fbe864db83651962c980970e552179833ce6f92d141a1f75fb9a1e08e6779845f8ee8da184de2b65bcfc99e822f42f6e2bf2d2346ab4be8c16bd4ea463e9c388483a3062864cc22b26a0973a716f72333721611f994af38396295272e18737eec21b510050f2d3c32bd2229269c88df1470a38d0897e14b7254fc8bd7da55d15f2e2ce6f56d8a0384e973eddf35950eb1fdc188fefc0c4d7b22d2aab92952437b88af011c7d54015139e032da9300f5e8e6def141b3281d0d85865ac2af7113474e4cbb757a93d320ab9ecc1a6984d4015f576b0d889d9e48514b5421418b6de2c1fabac60f5794c55e6d6053017b053c8d0a8df425471c183074d467efb0600028f51278636fd5d98217b7a038368f5ea0a33c1fb505041ea12eebf36ccb8b14064f444c96c8007772f63bf439670db4b8e42337ca635cf69e3d51797adcab734a59b7a3a7f673fcb5e031265cd2aa560ddb7590190c83a5ff95d6cab4f5070681279b212f3fa7962b1454a208a74655552170106d1f8040daec618bb338b204d3cefa611360b98fd042f6498b6a59b3df70ecbdf9fc73c1658e27e4faac7b32b87d5a5a314ad80ffff5f3765d7afc8639c8083b1760fd03ba4c63635435869d17835a9e73bc487f15d5db0597f44fdc81db1ac6fa7112dede6b0b76cd7fa0aef57a4bb376c166f079c85353e73a0f587ed73f177c4d742b3c92a39d5c2ab560169b833fd85d8efc669d22cdaf26b7a0b52022f26f38a3bf85cecbe9035c105d6a82b95af482e1b78e787756b01474297523c8c1d2472a31e4f689e0f204595e5b2afedf1f61697b4153fbeb2e895d7034a17561920a5d7b44d5022d8cbe0f9cf4a9f7fe8b5e260e2f6a7a943d579b091b0003e33378f09289090cbf0eab97bc1a155b096902e74b54edac8aa44ae011d39d807b926aa01b05cbaf53ba5d1ba2de9cb9eaf3b9015a450ec731648eb2388b4af90bad418133b614be5be93ea4a3a277ca3e29664617e8c401b87343bddee4a461b556a0943e3f3b8cbc8163a588eb1127a8cc6f0f7258e62350bea60eb47a633e0ab1eee4fa4b80577616c680ae541a857c6cf7bf3d3a8da0dded720cc9caa0f012083326d9ddc3f3440e558f4d661598ead78dbafdb11154044d9dafe5acd4adad48b8993e5341f151da6dd30eddc4265017ca95389a00e225a8c51450c2f7ed4982354958c13fa691e7df482df9d02d3ebfc8f362c14a59b9906654d33b27f1af7aca78f9ea0a7f62a42138ed5be680d4474c691f3abbce65f9220881972abc06cb9d070f9e765ae6d88934be410b7422d856892c6dd4bfe69f319e66a6ed3253f9ac890709f2b7c3f8704fa06d34c907cbe3bd167ea380e47438c5e22c57805667b6889d704c673c169b71ce2ceac98bfc6d11fec6e9db053eb874eb48dad5cd3d42a96adf78dc37a8690ec2b036290796874434d917d8c5ca0f318b37a3866e3732ab9b147d80711063f73b914cc82867760cffe1cd89ac08c068d9835df5c183fb2f096a5aacf7da9553f8857d5b0a32f5ec406568ed43e2033b35b781b1af32293b0123d291f71bae1d95f48680420f3dda93e4d1b06d1311dff6f2258f1c6a3b1c6204ab9839f6514682660f077f1e0a8ee54fc0b3e02da5cbe38a502afc538d9b05f57af5827f2e04f998a34085a293b70cfba68ebaa00ddca5a8602e642c07d746f41a4e670db2e658bd310a8832393f477399f5b4d7bc3c18b75d9f394db9ef3074243a0d1d09c1d4130281f71081039331830969eb7cb9597d7c4a2c931b633b123bd5919eca146bf2c7f5e74d663b12d810c6e2289271a905d5a102ed0b01e6f4ebe17bde25815fcb334dc7efcb0f4fac9184b8aed72e1dbc7da4255d7ecbc1604f485773486680873a92045561298bf3a09057be03d2439bff4cc7152e8211fb08eaab42e71d3476da700ec39a4db392fe759cd3face76a336022e8b68ad84fe8ea8f48d6ef491eb417d7c671e5cd56f3ba80b2c1012ad83149b10f211bc2ff52d083aaf5d7cc87dfb6e2a10e20e3e44a4468fbab24ee5cc0f5a575028cb1ae14a8ba6d244d22c06fbfa3d3f83f81e398d409ed0fc35e61b67bfc053ea4cef253a05aa7d6b8dc3024e36bf44eefd8aa1fd7d93266ac89ef4e6f4d88e203dce84f718049e5a378e507c3da98e7e9fc2c26f3f8c76babf492dd894b267ace8d691f260a196f29d1735703559a793de220ed3e76871384d77e4d0c35387c7a370422228407165ef2daea61f6fe196e0a0cc7b9435dba66702b4012b2619006c1c365a9191088fe058579a97e643ad9af2f7c590373a3c09d48ec1815d03e5fc9f5e5c6fde005e61218fda54f0fee7e1b74fe0a0d6dcbe02b7bc5495353dc47bd60c73eada99b366da1b08cc40a7ec0bb27d0f7a7a65ce4d3ae9bc6ca572fbceaffe8692b5ef0064a5d238b083295302b7ef58b785d1a70f52534cee5b6384b6cfacc6128f5d72438475cc0edab398c17f0d644a4f6a0e198664c4bd8a0ac3edc332f471e673a28afbc66047991ad3dae0dc94640eb63795de5cd666cdefe2aca4ef83725d7b1695fcae9d594e578d74ee38e9b158dc477eaec4c3b95113175f67c3f86f34206b47a06ba86e193cf8871d6c8e958733bc527dddb046e04c84d6bf3480620d6718a764dce4c7f2e7719f026e8f72ec31c0f5851341b038f63f24f28a1ccbfac8b7c3648806b81b99894710e97c7ede7bdc373daf7cca32528df36166fecea9dbca7dc7fa7a458e20e92302ea95d531a84dd2054452da3e197ef416eb8a1ca8bf5f41459db26199b0e9daba5637873f3159997946aaa29601936eb5bc21c529c5ac4f8fadcc2287508ce620572848327245daf0051db602d38264de81509c080c72d4732027237f0440a027cf8b1d81b2a4978d5acb3ea5969241fb955d612c5c62b3a18c1ae9cd600dbb6a1dc8349bfd32d1751984a5235de5c8ce480029bf246b5f99c4b7a94fa99969eee4dcc1c18ff8bdfce7145d911151054ea0fff47f9a1a34783ba65d0feffe1d90c37ddde2d029699bfb865b27fb008b9e8d1e97c638e058512ebc48434a141a65d982c488b49f499114e527c6d0ce3f4899adb0961a47e07245b109288ec87ffd041668c522db2dbac9b7a7c1e8fb9cfdb1e10acbeea316ebb81eb7c01a8ac3849bb804b8b7882d6e25294be57c92fecd973e26db98bef1342ef9c4502105de2e0a7973e7687fd6756e568929476c6ba894959728508e01af81da4aa715804dfadec98abd7a2b617eda2c1c023a3190a3af53ecc60311136537cc28111406070d7b7d317f9be49a04093b2584ee36080f2186a79592ad134b56ed64d9ff3f67d09075de978e0d4b2e07196e914e8918184e36346d555d1c1493e45e1e675421c9b3580a967e633c661c5fcd51ce442e11016544ea5b08d66ac7a87a7716442c3a12a57be75096ad13dc0240c3ae77b8ee83cd2e116ed544b5bbc980c151fff155feb69e915b2d97547e912a67c36f32b425a829e346fa5d10308de2da1a5d4782fd798b14a4d50e6f9945bd4f318c338237215ad6d59a34de8ed2816722e1181ea651025512d997933965065d8eb531bc3ac32827f8a7d08b76f123ab992dd9297a8ada8731cde51e05638b112c52cac74ae875461fb7f558fdd4679152fdf3b8ea97b1c2cb108637e28ebaf2297197e01c5893960c24074a8bca2c634a4c7381c29d63ab2ee06bf00f47866939adbb71b73c7e80cd1c44f3b609ebc0fb08de74d3c44bc5255c453723de5f50df2622dec586a017c87b29c84b74234121fc1c9568fc69d8e72ae25cede93bf6bcc37614d700e1196f89ccfd29e59a80768431566e77e3edb9ce658078486e4d7c2226f9f67659ded6be395160e6bbc50bfc80272dbc61922d3f5b0abbc27a1a1a99e42a88eeab486498d4a14ad1d2f290f3a02708bd9a7bb1cd7351e7f3ffe7f5b1cae73919cc95519f048855ae6475ae86775b4e9fff8d0acc16c6c883dfc3288720d571da9e1ff7bada554a4abb9425a85a7cadbe1fb88d2121112f5ddf2508986763ec159cce9292a45ddad8d66489420b5bf812452c42578d39073965f8427bef8dbcdb63f0b765023c8a226d0a39f75097dd0cd81853bd68fca745b07096c8a48e387f7cab17bde7e501f3ff74e0f28a2010ed8cea136764414b47edeb2d45c96fe48c2c16d31bc6833015255de8ce8c4b837df99ff71b9bb1140aa282c485e6a8a149d9231b3bde36a25ed7c71b645790c75c666c48ed5a060f785b22c857c896e87acddfd4044c83a2070bc51139ff1567375b75fdeb7e612ca9f0ae547ed3cd392295bf5f7067f84e2d2185c23e477db2c9887b81eec06bb0e21c7ddb13de283901dab942283d376ede0a40128c2488688a2e8fa7770db707322dcf93c9bf12ab7ec400c91559d671fab184c9c1cd375603ac5391978fb3c1385371feb3ba20113ed67f67a46d45b34257d9c4b6bd089c75d38c76eb58934c8097f770205cb5ce440cc70a5c3f29718cb93cc727c49753c9376a7de53ea00205d8427c76fb6538d6ae0d56415330682035d0a4b05f4d64b6a21f04603bcc0f7ea021b5173997f36c51c04de0961d0f3f3960011eb3a08720e08de135293dd50b2373aabe21a667b1ebc695638689e0c8580458d03af1f94dd1851d8fe551981545e4d6af12bac172602fd228eb4c5129a619ce49dca6edd33e1b168185d8ebd72574fcb6cdd883e983cde24628777f00bd3d2227722a2ec922321eb6515dc721173e94aa8674a3058cb223ab0cca4e09c04101edf051617ad7636d7042b9ed660cc9e5620e2ac06422f4172aaa2780cd1a22e95cae0b2287acf014b26257773610d5cd6ee88c03c36cdcb216e2495d4431b87e746835c0c3a51bd9992e60df75dc2409aefb1627838c1dae14d7b9cc69bc250356c7dfc8a7481514f44fd70420c93c16ff1bdbc633e93059fe5960dc9501dd8085a10d62f5c7ad916970c85c114e8483b2f5deae94569434055eedc4ac1056105885b63966c6a5b390fda0ec12de1fcaa678ea42da1fb46bf1f86f076d872403cddf05b3acc5cf4f2369eaf6945fd786cd344b39b85a0fd3cffcd432ed0842871c0818864eda2090cb51224a1b2d592f6d22a5942902101a1014115dbecf23f8f94156494611cb6f559252eecebd45e0d814159ec240fa3d2a0c145e9677a9400ab03c52cadd61951f38811dbe4f8151fb9ab6979957e06bfd311e520a88c50555f2bff2abc821a5dc9d4fbf701628dbcd72c12cd703cdfbb61634c7522c6d2d68865158277fa7b236ef2adfb00c1f24a5dc1dafd45ec6045c20a630104378298428467d0f9002840ea3137e4002388420883fe0000b0a72f8610b8e79eadaf7cec420c052d8fb53c4d8581220f58aba3718c8f62a30900b4910afe9fa25e26cd7626cbf30be18972ef60d7c03df1059d8aebfef6bb1bd1d3700c871cd3246846dd7bf02a8c366b16756ec2744388e817b441d1b9b8e050444789ee779a4f73111de208efb0911dafb52d42195fce2c6e1de1dfa7accfbeb6400628863e1fb833b6cd606ff0911de4d3864e539db7b724b22be4f7f1f0f5b139b47801f79fdb0ef789f95603384d9be01fcc0ce4363efba8e878399bd92cafd1b1883384f11411d76b842cc714dd006c3ae5fb24736758bcabd0f45f49ced9921067220fcd72b6d7499c3bc81292082e0bb6e627fdb338e4d8e0b3ef81f13fb7b1e442fef2744e4f7c46c73627a4644bcf3bfc4fb61884b7f65153815fdfdc6e63024f210fef031906d9b34265983092864a00248108210505062c847a218db1633b1905705c1050fd13037067221246f5915c40aae89002c4f94c028c8822fde81aadc410a679c7780dae1898e00065a41a4edfbfb4e5131afbe555151aaa228501515c475bfc244972b4c6c31c32c435798a0d2570afefab36718421ead5d5c09f345b3e08a1251579290fa760baf8da30220de1d6c771462f821206a2804b169fb3eec9936effbbed7d8b47d9a8b16c1c6afb14cfbe77df6b0f6a890d009dd31d69f7e776dbc01d1ddfdf39799f31dba53fc4774e18560e3cf59631ca26ee1b1e73d2e5df7c073e8b9dcfa5e1f88f788cb83edefe60eb60fb9366757263a06720f1de3d071cee50dec6998e7d765feacb3d6da8ae8f7de19fe7ddf3b1e0aad88b80c0243f0a502c7f0ab8757aa780ca4cb7f8561e6f14c83631fd818639ed7ebe5f1783c3ca667f19b7511fc0a11a64c91ba42842a578850e50a11a4ae1061ca95213ced0088b145d406b260258cd0c116a12b3680faaebcc08aae5a820fbaa0987941940cc618638c31c618637c31c6f8c310c38210f31936639f83c8f78fe1f8ec8e220ad359abf0c7bb73f3d539fb9d71048991379ade1ff190dc195f69c3a691cd0ad3fbeb5e961cc56ec1c2f41ec96735b53b832647090703bde9fdacb082e9f9b060617a3d2b56981e8f0a15a6b76363637ab214294c4f67e7ec16f68b8d73c2f468b68bcdc26eb16fb60780ed951bb67fafb059ec155bc5b6d929b60afbb551ec9a7d62d3ecbd6ff8504173e5cd9c10931c70a00c843d9f8defff8138638c73ce19f4a231b0ef1010aeb3df0431f8383ff9218e5d6f7c164e027ba00dff070676bf5cb2bc49e01818109717ccfd8263e01d02ff76093d937c5dda18d11f7e5836095f9736f8352ef7bb79bf7b048e81df122ed0dd8263e0830ffe05e3b398994c687ee54dc28746d83d02ec22c175c067c16e1260570919d82582eb7c26d8e45f1f3cc8fd82fa85813d010798200631884110061f5abd4c0b66536425feaa743274b7dc255c27982028be4c4c79bd74b936465a2bf27d883c12fe4a6333c346f22f08822319ee8656303d583633868139b079b5b80ef82f1c037f8f30771d6fc3ae125c077c17ec3362db421304c724c27cff7bc7c1ff5d117cf16a1eccfb057c91d4e17de6fd72677c3c90df07035f57206ae74ffcd67f605c077c1ff23ef09560e7bfe2df80df82611208d701df9bda311c037f2c1fc740508479c6b151b2cdcfc648f8abb289fe70e720fd60093ef89d60bb99e47108fe08069c7912fdc636ba978f63ed94fd3dd5abcad4e10780e9a205bb3f2689c6291bbff7f29dddddc515b85a853fec825885a08f9f7fdf029e3ecf33f6bee0974d0ffcde7be58d77ab9ee0d7c525132f75546495b7ab32576f0bc7f1593c985f0eb229227efe5c3a19f25ef083bfa8310f4418c88b7cb96c223e6be806ce7795ef8a044dd637114b1b23f9c517bf67b5461af28ba58d111bfdadb731d26a953639f0900f25b95330430f3f407e25d8f8c911b64d5000131c4d5000138481b7087f55719def43d825c275bef7a6f6a59ac2b1efbfd7426cad3f2144bf33b0014c9b367da6e3b178738363f85779a541d80661363c4e27824361097c3735a8b3cee1aa46014cdba7a506a6691bafd65336ebc8ca8969bb535830d6bd62b2ca55151ccb5266aec1f62ba69bb67de4de2aae835ff4e21971f1dbeebd17e37bef0d4dcfe07dcfcb6008de5b0ac5786c2f81fde6bd42f014c1403c7e04cfceeff1c08dd042a5854a8b152d555aaab458d14275bd04559660be70ec3e0e237a2b7019214496992f4b18b10020668c9052e567bb97ee5e7a2edd5720821fbe78850855ccd5b7bc95537977e4bbcadb83fdd7693fde7f771bb677f9c4d5fafc37f0ddc15e6a7d0cd0768ab9301d139b369762bed566eeb1fad625757818c694db6c3d08bb01fc1709c31dda1907bfc7806d8bf9b00968db2d989b31fbc377926855c26cf67bbf5f84d9ecf721142f8eb06beebb7b729d763b09f7127487ae510d03b1ee93d6deef72b9de5d305b68b67ec35a6dc66c1cc3341807ff7dd5b85caf31d08977c5fc7e3106f6c23b26e649cdf3f043352511aea769954bae9f79fc2760200db6eb69ca232fa6006bb05def66eb4397eb31c9c355ea12890cec88ab3c8263d87683d97adcfa1b3906e61b03edc74ff3dafa2377b8b9cb569baed2a607f9ae77954ab4d92a49efc27afc4830109311d65e9155ea700c3b98f057e50e1cc37f81ed05d1183b617d630e6e84019040e28b110648c2080324618401be186100248cd845a132dd74b30352667eef41f1c398f5e5f73c567ebd027db62671b94efee165dbcaf49dbf34356973d6cd2af0aabc77bf42430b992b168bc55a85c94ab0eec551ae939397155e61a7956d65dab0138e829db212a6c65e301218a808f692739d9c6c341df8c1d4fa6d2bec9483f2158ca37fb4e52aa75ca5a740e5c404c237c4b6652f1b4cd65a6b9afffefbeb74a3e82a23561f8e1fc9239b3fdbcbbbfcc475741866f247f82b56b85ab13e8b5eb512a9907f0387d7e97e343e1b5febcf295841d59d21f4f9063b6b2d8aac5f89ac7ce2c48a956d569f7ff5e3f834309bd587abecb4cabb557ee2b31d3ceff22e47202f2023c0d42fae409ad58b2b145308b36a310165ee989e82296431458ca3ab78f0632cf46560bba9af989a09270c24be2d1c378f2886bf12af531340700753836fd3534802892e5b422df9cb555f06f6cddf6bd2b3dd2c7ddf0796b61b13fcef592412532c358e89a22864d288f1fc2b0cff837d0fd83757699fe9cf3987fffdec2b382614eefd7afde75d7ea2a58a0557aab4d65aebdd6eb7dbed76bb27552b2fac1af3d494c6f8d35e14ec3dc15a2bb1b9e0d7115537380953ffd781adf5dbf201c0323fc1b1bcabca61b8f7ebf56f6588adab3618538731f5ced4d9733275145323c0d42d5bce197bd19177390847c138fa810883d85a6327ec948d30f56b272676f292c3bd4b2f36ec54e55ee5438c3ffbc78d39e298762f485c477f3d88e1f77df885a28c4ce8ad42910af91f5965eaaa7c85f53ab3c0d4af53b0020f12d246b8aeba338a6ce941961be81884e14bc1b45d33d4a1e779a28ccc2a14c35f7df82c187b4dd6b76036e187b04f875d2e129f85afdf060fca55f90806fa720f6cdea54b13b61cc1e641806173d455fa8aeb688dc57134123dd841971ae817985aff3a7e129d29f3b696d6d7d4ae999ff9ef5d2fea713f2689f676b9bcf0c56f06bbc277853379e6c519582882e10c388661b892c9b19b829479637a0aa6f0c454c20c47519ca9a22124be4d05cdf8211ef7cdccf8b36b3e164984e2459a11c58b24110a9ffd7dcdeb2a0cd47addfa9a3ff162cd78bf1edfb76a5a5a4cbdfa9a56ab3543eaf8fec48b2760abff562fa2183f984d57ad5eebc61451b4cab185b9ea617f9fdf67eeaef395b69ab1d526c8e3923fbe11b634f3edcd2e1919c7426169ab995f69b3c1fc8ccc8f85c4fc4adbaa655b2d816fc3639be06f53fc60abd27663fbde7391396e641c1b5ba489ffc8d49d41fa0e7efdfa2e2ecda347f82049fe085965926bb3b14ecc76f444f1fbc1f27e785ac79822d8e3c6fc8ac430f16b2e2f2dfb8a89836c60ea0fb516557471bc6f6ed970303d160ed7c92af34042f41bcf23815e19a7e66de1e86a893532bac6a9883579f4bc9f4dd67cdf8e8111adc0d72b83248a135f433303ced08ce28913e48f1bd3f5312e8ca390f87a6ee1c7a347bef73760a031f4c4b7852afca6d23a22e6068ca74edc273974b55cd98cb9a40e5836f7c7d48829c61b9828651c8f8669bb5d74e09af276d9c06df2a0eb4c7c06bea75453e3024116f935306db6f04a4c2114e6d6c06ec05378cac353414219c7fb7027f1f25a24d1f8228a712c42686cc1aa5ede969d850907b64da80b3e0203ed4f2254022f819f04b5de367aae71a9a2e68a2ab41944e6710a99c7332f5e1a1461cc6f14342e32c889af094b1b9e296d7aa478999739f129700c4c853f7102e6fa181542156a60d8f4fcca41b6d7ebf5caa1c2d73c868935b01435359fe204cdb350c8bc4806019fa65472cd13a5ade657cf2283ccd4fc4e51daf4085f8557a19cf9d04d5106f6fa19d80e1cf35c2f03b3390a5e3484bc8b9090508af1c4bf481daccf359fc465d6d4fcccaf70109aaf296f641424d10952c789a5fded35659ec673e5607a32adbf810906daef618cc3e07cdd069b7b146938586a18ae321d004ec6cfd3a922fa8ded7b32bd9cc3c7e1e3f0314e22c45fc2e46f4313679cbf5c31666fb28792fb057fc9597f39f10db171117ca664e32f77067e2f17617a1f30bdff32b0b353129db9fafd3d4223844c303d2c053f617a3aeb279d6f6e81200c2781bf4c6dfdf97a6ff3a8c8678d23c9f2584fb2c656cbab9c8c2515f131ec93dab6fce54b06e3335b568219247cfc0503ad4aff9c040602e333b24758ea32fc923d0feb706db7193e18c2aeefe0c7e00a04c38fc52a6d34cc5b057edfd3975b532f406cbb0967c4ee8efb0cc3b2c7c0d80a8fe2fbde86cdef015be7989a8bd49d128563fabf2a3bdf9dd6de68de78cc731c08f3981ffeffbc284f01ba8a971c2e648b19fe078e3cce13c4e3f198f99630400fec24d7c49fe4c2c83019ec9cf34a8699796c2b338fbe1de86aa2cf73300838c317486792072e350669b03f24893448fa70c2a3857931ccf6bdf7d01fbe47f2f83efc4c26b9ded23575f9e9e07ada791b0dbc25fc1d93d9b6a9f3369accf336bfe2792de0acbd0f0c572c71245bae1d23334373a206c54b8514362a56b058e167ffb8315b806113c3a8b05e966122171cf39e07e638e61947dc72bf20a184e97962129eb845dc12fe0a0c8c2c028f3ab0172f1ee7652fde9044b2d267bf90bd78f1628b9107b6a3434eedbccee317717676f00dac73ce1900dfe273ce39cf3ee79cf30a2fe373ce390b7dce39e7a0cf397fc140ab08f439e79c1f5fc1406b8cff9c737e1c8581560ce373ce39ff7cce39e7f584cfe79c73ce39df2230d0da33f3798df99c73ce39e74cba56f073ce39e7bcca783ee79c4f729b704112651766640f43ac150cfc3bd48409964b549af05369d2af3f5208fe8fb481413ffe22f9ef7fa410fd4e0ac99efe38f0da97071e9e38dde721cc41371051047cd6dff0c4e987bc2237e0803f3f0ef7f5e350dec0c30f79e50d38ac4aa71fba387c1f966089c377df2b0be06aa2097f1cbe9b13c31c84df872ecc093be9274eba2422890d33ff7d1e884862c35cca5e656619c023b6fea7211279a52e3ddfc04ef20d80e818fb2c4715fdf103d1ec4ceca193cba90b9497a82fa60b8c89b7d306026fa72fc2c4554c3cc5c44198a2193a85e1deafd776d25a5c5c4cecea627ea66b8bebe0f1098e8d4e261ebf05a9b1852903b80ebeab36c75d0b533987a16d3be507c30f43d7123b13bbc65d946ca3f5ebfc1a74c1b685067032f16fa71d05033d19c0670e2a116609108c965d8e2098bc25875db697d7978c4b4cb3631141f41b1b38657a385399dedb34e8647a4f53de7defb39596e7c1f4b760224cb3cc29d3f61b871f3e266d60703df9465c4f92df44bfabf46c84fc56d9243f398e5b2ed5bd1faebe67c19c9817e6c28bf9dd0f9c0ab1f661cacc7fdf61b705a9fdfade6b73626e14dc32c5df6771bf8529ad82c5dffb4eaa609122c5bb0ad72c3e850a16650b5238e6fe29602cfc59b080ede081217e4f1927b350914287555270aad757481da3161ccb596bcff3beeffb40100441700cc3300cc3301c572fc3fa19f169c63f417e4deb51841ff32b92c85b62bbc2ffb00cb3ec0fab702c3f952cca52c5f85496e3d3961bf9ea2cb68d0266bbbb1a98ed5281a181d9b014f622630bab3c8be9b691aa0523311829133f0b96a1fc0ac131186c1b0f4f0eda19277f18525d9c6b0ba76c481fbcd73851acf712478ac8e5059cca41fbf358b2603852ac27c777b908638ede58b2c6b164fd0863bd383e091331abc489c2b1711caf64b00a064e81545eb8b0c6d27659ac678136f13d0f6c9bcb96b7805cc02e2e9fb999c9f2526df2f31693658a36d68fb0f05738534cd62d6f3143117f2010fdc6a64713678d3fbb0eb73861ad7798892d26f6226c1be864be18e62756144b8a35455595858a8a8a8a8a8a2a67d9ed76bbdd6e97b3e42c394bce92b3e42cf9896a97b35cb0cb173061583b9613eb494a4a4a4a4a4a6a47454545454545b5dbed76bb5d17aa1dfe5653545559b67491929292929292a2d260a8a8a8a8a8a870941455f66ca0531886d9bb97d33fc5a078565126141414141414940623252525252525a5c168301a8c06a3c168305fa43418adabb26ce9e2050a0a0a0a0a0a4acaf322252525252505e57991f2f210183aeda717d447c5a43c2f505050505050509e17cf8be7c5f3e2790903053ae5203c849f274c0ccc7f7979d95d422828282828a82a28137cca41df1630dcfbf5fa8fc59c4cfc6da9dab66f0be804b3853b0b607a99ed2bc7fd60e00a6653647cf187f8d0931d5adfef3096b94bee626252c7bd59631deac8d9db7a9565607eaf6daee944c7eac17762e623becf5c702cebf8ccd58ba1b76c4ecc950d0ff057e0f7ab326f719dbc2a2fd5febcb004f17b38682720d65d6cdaa9050de430a68db5dd5b8653525660b142854d0a155e286a4ed0ccc8c46c578b1c45d60ae4800f38b83897495ce6e3bf91fd460f4ec18c4ccc76b5c85164ad42f0f374c66395104ac01c0a455c810197bb82295856f0f40563514196acbd20be23eebdf76299c28225082c4f422ce3751f8186baf8e2123895608733ce60c02f5967dd658b952a2b549fe791804b5815c675583ac0b20224b054559d200b96134095c004491481c50440602981159004fbba461081058c4001780450aed8047682088ee0696dc503dee7795f3e8dc4e78146b8ee3233b8f8de1814e08cb167251481084cfc5a041c701241152d020b88200a8cbaee2278124114f3d2502da104aa2fe60bc732c6545d585ab2ce99ca4a4835e5698f2a8aeac9fbbc0f0bd52e044bbc4200e686c0cb7d5dddd202866018022b370455425001138f18c8766386004a0c57611802a7151317068230e6abf49608441b6c5ed3b389cd7bb38931ce39e7cff44cadb5d6a0f9999ee7799e67139a60970f47795fcc8ffc48f2235d44a1ebf88be1c5597b1fe861cbe6c4bc0b10fd2603297921a6df695f87fd16d6c749f23dbab785e68ffab6d09ce5deb6cdd97b0eb2f135caf71cd4e26fde73908b6721767b1fb80fc07b0edaf10ec3d21379bccb41b0bf2bacb0b931f4e67b0e7ae171bce7a01c4f94e2efab8646c75f5b6802790792be6d9b4a6f0bcd18de6348fa1ad2877786f71ce4fd9d91f918177959efdfdfc84135fcb5e19114bd00ce1de1de2fbffe1e2a296de1662a6dfbd596b6d7b3a5ed636b92d2c6b34527e425e3e05773a56d87b8d216de4adbc6f869a9b485f8a36ce54e4bdb562abd98782795b68d848364f8f0bcec6d3be70556022b61cb6703e3201ce0b1988b168f5f4f5e9cae17ef469ee2b109e42c1907ff53cce9a9f6541814468547de925990b5c01e77c938f8ff290765301927cc93998750189521bf43978374a4f8132a6014590959098fe1fc250a8551a1e1957250f6b25f2608ed80996f3ded291446a58637ca417ab7c3634eaf9f622138a2302a474f07700238d08d9283c6c78fb148453f0a6399d84b0e82f138c6e3a097f178c6e3cf4e3988c6e3cf4f39c885c79fa172908dc7371e7f96ca41438f5fc89183743c8fc73d1eff781ce4f1e72f3948c8e3218f3f87c941451e1b79fcda2907c990838ed0f0d886a23f1feb1c74f4f8ef530ea23dae954f83ed8c73ff0816661cefe25b90d44003cc33ce0ce51198671c19ee1d02f38c03432904f63f609e717c9401286d178c799f07cc33ce8e52c7d40d1b301768cc8079c699953232547e32efc78039e55daeca51592a4f652af3ba8079c661a16c510200e619a72c6d388c7977e6c54e36a50d43bd4adbcd62de4701bb5bcc7bbb98572666bb5aa48e324b078093999cf1c530944ead266d2b93246a6166282728d337e064ae5e0361ccd58731ef17333fd8c5cc9f050b07a8c8d17da68424f217af13fd97bdc7356f2bbe1325e0ff58f9f72bf2c70d43d8f7abdde3c6f47fd6852501cd3009688e3886b37be98de06bebfcf7bdff6036d80ff066f20798bffc2156a2c26c5fa6ed3eeb5b6dfeb8ee3f583a3f6be5ad7030ef93241158da9c5cd7ff5d7d63ea910c723fe7cfcf9a2256a00a1621bc7c5e3c987b200d4c9cf1de9b01c130cc0fc266667e86a67ce118c63a4b95bddf2393e870139c3941e3fa191a1ad789db8b283fced973d1783a8ba73ded7961963ce29838e3cdc06cbb078f991998e7b453e82c37a07762ca3713ce9463942b01d7c151533096ca782a6a8c02829e97ebe47931f189cf5499ea4416101ca1785dbc233c9d255bc954319fa1dc9d4c3365dbb00474962c32618c04686666646a5e06ac997997cb498d8cccd3c06ca39329a3f58b7a063c11862746100884d1e4998fcc34d8369d257c9d0503adf4961006c25e2c70e65daf61b6d6d43b73c625f3ae8f898979510616d23c08c2748034e07be1cc98613772cc86692d7a8b6ec1a8b2d098361c95a5cac6f85d87af1be542f9bccce49a1fc420ba085165de1a988e25082298a2cb7bbf71587e6fdb9c98ae9c1d869f70cc1d6758a8f5bb6bf7ebaf61a17ff8216cbbca1f71cc078e09c131fc414401c78f3cf1da05810d7e7e8f099b61d96293ca522e6f305bf3f622f2def3b29741a950873a0c5f87a114fe1ce6d0953f04491ed80c5f0c75f82149248a5e8e610dc7309873f61b580fc26cb7d7ca9342a2a9ecdb85cc81cdec264d493ee198f7fe1e49e495437082dfa54418bc04c679423e11b9c8f7bc728b89f7e398a7bc3548e3792e57f672f95df9b2e018feaa700cbf27050414264591949241096c1b1e42150ca487e033c75c70171c3b22c45bf08e71d73bc11a86a14cef5d1e0912b16d5e6bda68fe36e6a01818fe254f942b11cd13e9176956f7615e11535218d836f7a4f4ccef99d29392293de3809ed476954f2fd3c936aea4c021b6276562f0c3c74f839f74ce218e8137b0077b7defe40f2138e6af619e09cbe558c4751cdc828393968762886b83b9448c49222af92fb9dffb9817c7713f09b369931c3110e3ef7bc11ff575793072f4c84d9225a8f5db6e2ff287eb5dcf247cb5c6fdfb5de46bafb4dd5ce4af481de27b6e92ef580a7eda2411e9c19c24f21036fe2b07eda8a1717dcc5f984d93ae12036186ef61f2c1b785a50ddbf093e9d198ac91c52a632e8bc564e6c3bf306cc3faf1f7ef40a14b9224ffbe63afdce35e913abcbfe5d20d329a24f94231a258c1c098d2763f8f7c92445182a5b71a6570150b764d97cbe572b1f458de7ca29cc151ee4ed882ed1761a1ebc5bfa54b7ce52099c73b72904c699425e65d5f50fe7b4bf263feefc7b87eb48d1ffe7ea31cc424e3e0c7f7c398ffd67fa48e985f728d66cc3371bdcb55da6e2f2ce5ce88616d2c658624da24e97279aebf2ecff40f63de871333e6593d58bf79b07e3feb77692375ec7feff7fe12fc1b58fcf1c25a25797b996289a5dc9d104bc14fa678c795df706ce1709d5cefc40844c7403997fa5eeca4e76958ceda49639c71900b45671c039a4bea0f712e6db797eb103fe1271cc571f97a7940b63594311c2f943024c3301cdf1bdddc501ccaddc1e18718c8f5f9afd39db17f1cc10f9fbc5048b2bc50c8ff5e24612309db258d0bf6cac0f6beb5ba9f86dd28509c3e2b50c0286006f68d0246319dbcffdf943024efea45976d245999dc7149160ba683f55affd5af9fc5c4ccac5207ebbfd7240f96588236f81cc76e667ef065faf8e4fa5c3f3ab9c627d71865bbf6785b64ebba5a2d3c8e504628239411ca53eb6a21448d4e6394a8f157361c8535e844463d3d85aed045926469bb4e63293e789dc671bf5cd83bc1938ccce8343ec994b63b4619a18c50647e7492199f64c628d769cb5ca73dea8f89296d32ef317a1ca18c50462823942709448d4e6394d1697c1aa38c51c631ea3a8de4d38fb611c46fc3514f64690bc96f91332339e211ca086584324289ca9f0f55519eca70a43255049595aa2b595c4b4deda93db52d3035550495150cf45d199d462853a2a4a2a6485d9677a5402a342f15371f1ba15c60d3bc54dc7ccc02fbd2bc54dc7c6c84323e4d4d15b1696e4628a3d39e8a62daf0d41e6fd408452c6d2c96d3d4b86fd43842a91283b0f2bcfd6494cd125f1cf7167f356ef2572b5204494c8220f9ad56498a187cdbede53828bcaebc47970bb730f9f947b1f4152c2c6da6d7839622cc1fd3b168d9e9908cf285e1dbc82731cc61d87a96fe90fcd5ae1c4bac35763dd631afc152e6c19f8139c60975f834a309fefe1958387e0ccc31ce769561092b5bd024cbdbcbd4e28fba5c124bd65fdb6abfb41317fea2886494f05933a5ed924f97947267d89c98a494bbd3fa966be6c92877c6fd99966be67f2c5b6c8ea58d7c325babdf213853ee8f8929c7dfadb7bda95fa6b77a991b73f70dc119990f65744ceb7769db26298594424a21a5dca87dbd2b53261945eb27a3681288d5aaf4d246924f2b9206c7fc57b6d5af6cb7dfe2aff08f9f62bfedf6d2a48ea54f915b41b62db3cb41172ae3802f43962ff0c7d1d68226f9e35f1097b63df31897369a1334efa3ccb770698b296f2f93f5bbb4699c16598e250813cb16345961b994c15234bd324f91faf322facd85ba51e62df1fd8149a24db329c01a596005b6ed65e6fc60d45e5abd67da6e96f1b3e0ab85c5252f509ccabe98915353b5fda61b7b2e697ad1aab9176afb3726249645693426f6cd9f11150902e46568edc4a9b9cfa14aede7a8eda34b679b635271e7e39870299313f7a852cbb2e8edd9f4d954a97d241e2fcba969fa2cd3a3477fbba54bdea82d6272e28c3e772ab58fae2aee55202f6bbaddceb45dcf55fda61bdaa2371d4ea57dedd123a3241667f42baad4a24a4b4e5a5acba5acaa436b395409fa39f365b934295dd5cfa9a1b9a494fd9c3f1fa7ae488ffb1f388e7cee7ca2df2b6c5871b70a23a8004285900a9d6d838318be6da6ec1514f0bdc2879689863241f7a760b39059516545918a50252bcaa2eb8621d93f805f72f723dfbfda2b24c1dd69be5788b25788e1ee35df2c64c0820723df2c5880a110d200ec03b00bc41c0111f346fc2c6a575587ded036c64886bb7bcc511577f75a0e656d7cd8a8b0a1493125451477f71437eeee57dc5dbe5528c2dd5d85272aec702aad650a329bf128a98113a381a31da1a93ed2f6c6f4c3dd41df2f11bcaab43994c8abaad5e1d0b6355f40bc9e5e4efb7503ed44d75c0ce8ca744bcf1cb51c4aa486ae687b4b73a04927cba23fd0dbd1998ba1a9d5e188565589963bd121ad9acb9d38d8166559b32977fe50d5223f6b59b486a33129aae55036264611285ec0aeb21448e6e323e3d139aae9a0e9daeefcf808d15019473519327c806834b44707a7d264474c4a6d9ad4b4b66c9a84ae0970400e6c0d4d32a3861e7dd3ede86c9970b8f4d973c9b7e9a3b45ccae6d21429ada9b8cfa1e851abe668339a5a1d0e7d744597fced4cd7f691d25fa2a9b7a36799d45409baea1e497d9ddab62913f45125a7d292afa94a2d8a73f71df75bc34dddfd886f14479c45dbb3651fbd1da52cabeabee996531f556a71ebf9a812f5e87c54a955d9afa1abda9e2bdaf2406b2a90a117d0742df2b5dcf92b2d97ce664738a61507bbca8e684c7476703426b3198ec6a4a8456fb753773b9992a038b4e5d1b26852fa82bbc770d955c61625e5d27507654a82d68a68a8921d36a7a634776f21f9a651c2dd57ee1f76f71f1e3304897bd50956e0ee27dc71be5be4c0bd556f44da1cbaae4c385655a965323d74d7ee4e3384090fbbca52dd598463cf25b9f454a29deba9db01020a3a6120f1ec08a13e270a038d510bf24112fae181a1d3aab573e9a6ea60b8bbcd9e09e3ee32cef6ac7dcba4cba534b4a6e228e2ee44dc7d48134d34d184bbfbc580bb23f12d23d5d2d0755569e87a3edb2a25a5e8924771699b635a1f29fd1adad2501d13f4d9f41f552af2338c8a56b5c8e895da74c9d7d01f625719dba6b8f486435bb6c9dd61b8abaac4beaab64aeca9f433945d5125e8fab5f4762ac9f1605799127b2aedec049d3d403c3d32767a7c4e9ea01f1a8cdacf0f0c211e3448076dcfb5658f98d81db665529768a8126da74d9376d4a4f5a4eddc4e9a7adb5959a61d25f6549acdda55d5e998d8221477ae485b66c5f75e590d6ddb148753694bc89668e7d1d7d0db4d5d1f3dfadc49fbf6546a69279b3bd7f673a84e7d1588bbebb83b0bdbc98dbbcb5a944ddbf476e656b46582fe2da7aea9921c519b43d92313ada934f40524555d85b83b0a221d6eddc104ade578dcd05cee54c2c1b2e89a94e3a1c3ad3bd001a4445026940906255a7bead8f485a6f3860ea99de80e5a921f49702f24a548391587bb0b69d51b1136fdd1aaea90235860e6881ad8a0001182c002291cd0a8e1c4e724fc002be60331f0e14930009c63020854ec0004aa16ae1d7c3800f644fa2c20024514a1b38417035e30a801065ec0610645a0b8c083cfdd8300f151944b4a6f67113a80946d99d4a6d387bbf7c8a52d8bd65e89d69e3854ad3d4e0c45692b93cab6e0dbe503971667e11eba08652e2877afe10a4146cfd7f87565a2bdb0818593c38ac59a7c13770f80bbf370f71dac1c77d7e1ee39dc9dc8ddb5bb0d1601fe739e00cfaeb255898643713b4e83177695b12b5abba54c473b2d0ec9fdc761eeeed39a72ffff4799d616656f27d2e7b87031bb21a607171c5a4dfcdbf36be8122dcd9dba96e9c7aaae2bd112755dd5a19f1919fd8c956364f4b31609bdfdb38c705aa5a474fd6f91d05bcce86735f4969e482bcab2a7bb67dfad1646dfad155aa4bbabe09b54c2dd0517d8f48d3e2997e650a5258ff32ed0f8980b343e9726a147ec2a3bdbb356e42e8383d9193988035d3be85ecc05dd75bd9adbbaa18f0ef20c846601e230f474bed7b15f18b48debe00ccfb1df7b33de712f78f1bdf91b00bef882b866c8bddf051d5f5296f1f7c5587f35c6fae9ea7b31eb3601df957b57e38cde6bc3f7e230066c832ffe34be46c0f77ef8c27051dc9b71688497c1d6adb9f744986fd4fdf0bd38175dac592b1878bc35c2ebdd64228c754f167201dd29d101d8b5630b5c9d63dac337bbb780fb83ebd8f7de7efdea8b2f126e885fdc8b3d8cf3bd3f77e78677c418e30fc77581b1c69727cb441542162e29930237e07a5885ab6fbe8e85e0675ded38fdfc8d2e02b2c38cb8eedd990a70bedfd5e0256f86c2389ce52b942fc6faf1b88a5def5e9047db88e1b998f585f8de7bc17b6717631de4efaeb0ce4a6e8997649dbb12f10dc18b6f601678455e913dfb75dd0fe34bea9d355601637cbfab91eeeae68a1ebede6d05dd7befb5c101f8c415be47e108e20bc30defcdf8eabbe3aec032b00a2c62107b375f7cb188417db39765dc7c637775c77bef8ccb02b33278437df1bdb37bbf1a4c7335be9e7833667173c658637d65607c5360d65ddd50e37befecaec02c305f1dea7b6fd05fd792dc8277f35d5dfdbaabd54cacc186c50580be187f1844ef3ec123eeb8175f7cefd571d075eeee35dc7d88bbc7dc63be4921319ce0828941e65fc4075fb61499c00f922072fa8007061f787121b01c78101fc8000d02b312012013508300396d60023001164cc871aae091017bed08f9a03544d049de004d807581ce3b85185e9a1022461413aee3450a2c72bc48e11ca30ba82d44f1bc68e17392c0c2cb8f2ca250c878d48c0d6ee4f9e0af0be09edd6b39b43d9fddab95166757197a3b3adb5cbaea76d09a4a4b734cdf13560b17ec704032af40508515e8e57c622c920390328c7dac50488f342338c3d86632936197023c60f7b530b8d239e40a210dec5846c69ace69e58061d87831e8fbd148c1ce051f2fc414006b96f68173839def70bd992e07ac53649d1aec5a10b2c309d7d00e59470e06d8a9b09261a479c02e078a5cc8b29cb033fa6183ab4c7a4bfa00517208754cee592187275060f5c2064fc2300d6861d1bb1103cad03dd01aa67498f162ac1c2c168cb07e01cad0410413d0a1830c12b0f3c40a942b3b9109090205207d5c37043b1580726081323e56d8ca413c74e415ac1c600e3256100977d810e560ad768c446a34aa765be700b1401933e4c712894a015c60c70a77b038ea61e7e5eddd0f868fe5cdf85e983644a6958b70c7c7025568e170b1d04056286854187911c6800c6121075628037fc89f201e42c0518329bc59065a8ddac5df0057204bef783db4d08debd9649857c3b30a695906d42e64d5ac827278da5d114618d337fae6cbc0ee454bbfe0b5e0b158dd6815ae9ebc42879d6ce766a4aca3b3478052003fa8392d4d1bd0c096aaa90d64600a14274d98b04b4828cd480048683862240622427c0460c74ce827c6420b00bc5601161b355a94295400a35ea085ca056020b2315b716214bf2b5646408414952915984054046288b980c0038e684802128a5405242045aa3183054af9f014b4c241170c48cd6400a1a0115921a8c22604204082d6820009008f1c44424839800164bcc428c10634900127321809027ad168196c6182911a2e00adc04f024208918020406acc70315e29e0286028e0301acc23017fc13ef0bcdc1ce01b601bac6a3072c132c056f052b6dd9b7085a7825401a3c0272e4dcc8c278363eed62d2c7a2cbc0a43ac6fbef773770772f714a42bdb6413ec340276dac7f722c664e37288b1c0cef34690851ce4a027d0a3518c5386f8a0ecb48f550d4bc5ab00bbd50c9a86cc426cbf31cc110a7dac2cf4c205bb906a47832487555046c0934c2261ecc1ce6b62e78d296cb01b5b1d0fec56af160667783b1e104e2744151aa0838eb273c1f6679d989df015d3840e5e0ba1104823bb328db0cd3ada870dd8c7faaaecb2f8a5d039624fbe7ad439ac1c5e0be00c5f8a8ff5d9469a916685423c01ce90a7a0c397224fe9e065d9b5b069dc17b558a167a3eb8bd137eb641c5a087902c4a00ce0f63e3026cfbc13adfb89d9d363ce1967308779c552a133180328e312c28a013ff06650c3d03bfa862a642f3b311663885dab4a0e319fb6095fd041f74087b2e8bd09268680832e32d8c2822c4c49449a60c28727a2211b2e04a9b9242061c7c57685600d340401d2040c5050b5420278a01a70e3013db8410c567082106c80ca8e8c85a21d0630b50960d7262801cc1135e082e5034e701000121a8e0401a223c70a2c50d444c10a0936a0011c9a14ad50a1e65670b57ac083243872d704134f7002921a50d4c4dc60052a40c1094200020e2440ca018a0430830c4180f088010c54f0821240edd0410e62008315603981092e30a5871d0aa0043037a8c1094c60a5034f76688d07510c09260848f48005584830822230e00302d09a0c3c887062c818c080051180800f4fd09a0002c02307d18c598bd41e042462008316a88004232882031850809427360480870b336641307a706462b43711042478d00216a8000b0946c0010c28c007290878f2830f14d980c4c68e6c0929f8e8e16aed60858aa7283d1c9181870208e8a1890911ce72f716be570cf0551399093d054f0a380ae1103a03180398caf5c13d99e7ca441d9c935bc85fb3c25d81558029b20af8e5a1b835ab191999bcb58b6c6d9266544154c18a5985e107e6eff3bc7c9d5d6538a6dc7ab6ac7677a77177d4dd6d7c6b197799ccddb1ef7c841b3d92fa38cfa26dd351ec1fada56c2e7d36fd36fd194debb99e4ab43fbf5573cfa6df361d7dbef30bdc3df49db1b83b0bbeb30448289be4c1dd5bbe49262cfc807c80bb8bbe33106e834c26abe195daa41c7a7b24f5515a7a637f55916a39f4d1a4dcb9ba7be93b8feebe7de325dc65c8109211240348460c193064fcc8f091d1238347860c2121a1202120a1184230847e847c847a8478846404090505050105c5088211f413e413d413c41324034808280808082806100ca01f201fa01e201e201931846204c5008a1123068c183f317c62f4c4e089210386108c2018403062c08001e307860f8c1e183c3064fc08fd04fd00fdc4f881f1f3f3e3f3d3f3c3f323c347c827c807c827860f0c9f1f1f1f9f1e1f1e1f193d423d413d403d317a60f4fcf4f8f4f4f4f0f4c8e011e209e201e289c10383e787c787a7878787e7d9b4653afa675354a9fd195bcb31a9478fa47ecba4bafb0b78bbfbfbbe60bc4d6f3af68ddad3082482c2f775c1dd4ff8be54ee4cd05a2efddba944c5a1abbb93ee5e7ac5edc2e1ee35beaf0b7797f17d6f70e1d934f639f4f6341e3dfada8d4955621f87862a6157594dc5edb438247455693be7d90303e9c747088d2103a9270846ad1643460c201aad26240305eaa90109a132601cc5f88171eed05a9669dd6157598b4372acc3dd5fbe5dcadd71b8fbaaae2bfab9f36b686e656ad1f5736ada9e6d0ec5a1371d2efd363dd7f6937269db9eb85545fad3dd87dcdd74f71bdadd6db8fb8cfb5dddbd876faf6257190d5552b4e45c77682bbbb3d3b49eeb517a7377cf1df3b8bb0adfbe3d1a50895eb5db999ebd1a7811592f73e7a03bc2b098571a8ff789288ae287f83d1206d813fde25f5893f02f0e47ed6407e3c1c613a73b949f071b433a3f0b7687c62638e0ffca1d0b368ebf62bd47c2e043e18f7f614d567fc3b2091145567fbf096bc3461bf06d984bf9a934e1f72a538fdff884f54e3fb4fa0ff664fc3b96bbfca4090ef957e52effea57e513a71fba99a421ff086b82437e56b9cb8f61c845f2af604e7768f521cce90e85cf823de1c1c6d0ea9dee10eb4598f89924b28141fff834e417ff833d0989f810ebef37593dac09eb032b9afe40d11c2d1314880e559c032ae000950e41e8e0830ebb5a2e5dfa59cbaeb21ddacae6d4942d6a73a0ca210227707713b87b580277b7e2ee2490d19ead8e695d551c3f1b1264c81022a89ffd037638ec6ade324175ce95e914e20777181487e55224237695ede8f8127700eb248a93d4673397e27e63575913ba54743b69ea8fac47d6a3733b5de45a555d4fdd97c085ef264244d06409fe40132877290768c2018f390082c07058b93b9011b8bb08dc9dcadd43e0ee2070f70fb87b11a107683915884e91bbd3a474800353ad508c0d6880882a2c8021650829ed097e3280017777296f8bf0a122458a058680616fa7bc141cb5c214af80536002ee51462b0b09b80be11e01f7201c022d94fb0997e252b0e307b43d38c0dd1daa010c686fd00bc040b4b62c05ffd00e71c7ae00293e3c25a005220501517a68891c8a1fc0c9003cb436dc5fc0d18ee0c0d18e08d1e168475a2644e7ca649e2b93c9a2b4dc793b8754a41c0f21baf49603c710b5c644a448ab1ee14e1d9102ec50807b94baa02a01083f14c1dd2f97231f2c4810906407ee7e7b30c20a38ab47630877c73e886c04a107173d3cc1ddf389046c414203a0acccc0ddbd072c20cce53263e286bb5f249ae0c30d4b34000841ee9e2160043a40c905b61eb8b368ebee9795f2cb42b9bb27e9e0eed7c6eb7067cba2b8b42dcac1915475d5b5ea8dfd5a0ebb676b7f3b51f6cf214ce6a3375ddade9870393e25ac37ee4996f033c9177767aa15b56a922dee49a66a402021a937b46712236793ecf0a23687aea8522e4d92e39e4b9192d0e89638dbb376b6284e97848e8bbbebac2839871c9fe086bb63dd936e08f791f5f4c87874724bd4f548893d95685b37ba2ba1d54880aeba35654a82ae4a367e5f6cf5897b0f313f6ef0245c110aae84e7d025da7974bf9d2b5243d51cbbca5a26682e55a29d389d1d165592b6292e5d758ec11b6ee98944d4842ed56eea0c6dcf9beec4ede84edc6cb6aaed6cb67132dc0cee2bad88bbb349b954087b3b734929919bbbd7549c9c267429f6edf96aae095d2a6a99a0391cdf4b55627a7059aa412e5a0a80bbaf275afba6da89aeb7f36929121213cb5443d7cfa5bf44bd21e562f8599aa4fa6057d9517a9bcd6c50ee2ee4db26039696ead422ee40b0c1675052c21d65cf56bd1171f79d137737c2a64ad2da9fe98943d796095a74ae4ce7b9329de7ca74169dedf9023e020f0167c14186b2ea8df64c5a94a9cd9deb9994d6722aed75aa7a9361c59225e5d25545428f9eada1ebb7678e15eb5c4f9c122d871efdaa2221fdedbc411335b7a4e9bcada81295455719f00c0c70d51be4ee82db12008ffbd571612eb87b98206cdc1677bfe106be4503fe015f3a821233c48abb07a120c0cc009a982c51c244d3b2ebba12b97bcc521076cda9b4a21575afda3527470790b233dc3d4696eed478aca80e3de2f132b63d93d03529e9fc16556ad3554d579d8e5252aaf4e7cf4073eab7276e5573bfaa482f8bf1132306d09af46aee97a86bd2b3288e89654f23a3375a0a6274e21e5ddb9396b2a8baa47db496cb49caa53895861e3d928aa239213f701c393f97a6e792676fdf9433559696e2ce5c534d5ddb9c4a4bf2c2e98013050ed4c344eb61d37428611f41e048c709c6dd7538403d4c9f7353d5a39629c8a6bdc0dd6da8cdb8bb5a8385935303e773624cedd912d1e16847723c7c9c34ce16ce3f5f37a073c7c460c2e808232ddb4808a3284f5aa31ac631403246464645607c4995a1389508d351cafef96afbe712213f86ecf89cf91b49123a1cedc8b66185bbb73994486d3d97e862b0c187bbd7ce211b4ef7da3964c3925b7ae6b001081b9c1c09245cb420a19a42322508244f4e489820696f486a4890b84e5d6bdf746b73e82d655ff6b9f407a0fe4c07101e40869832d4a0c22f794fdcedb91a0f77bf345cf1981e5c68a0f2a45caafb3687b23484ee4e030d2f7717000d42ee6e54438889060d35f239351e68d27a167177a7c1c1dc5e98a1cb0c5966b072672862862933ccf0c4cff5d4d538d753573bd55bd3a94b82b247681c117224470c922a476c1c11009723631725841c21c3114290900108215f64a8095982bb7b8dc7b99e4270b423493955486e899a5bcac59094538de048caa5429272692d871281a18626e55421aa901a9a944b8518e9d1e6502249b954881121233123610c6162e8328316c410439518a678d3aab6672d77e2be760eb1ab6c673663736acae6d096095aa4c8dd717efbd90f1c47748408c1db71cd2612812b85a6a3940977c7d531044307dc5d068baa2b3a805aedd431e996dcdde6eea8120e59ed1cfa2135f7216b2e4d4ad72038da91da393444875a0e25826448111f3786080dc9d1d1e1684c76589409654a52a4539172a98e8a944b8b9272a96e87659372a9ae8865ba31e198684db91357a4535bf6763b8b746a9b9453752e853bc36f4e0b3dee77c49db947958ad472275a5ba2de6e3454c71a19a934a3dbeda4a5442f6b69a7dafecb4ea51a8ad6525aca94b432ad3a9496435714095d5f5dd101e8e4d8b4c803d11224c50ec280203404c1819017426c5c790262c58504804c71d101206200e4890b22f0c8807a643c3aadaaae392c9efc886257d90e8f921ddacab234d48891518fd0b7285aa2a9b7154542625abfb69ecfa6b8afa128fbcf9ecfb6b4f3db1e21365d5122efc38b930f1e7737a241438ddcce7445dbf3c71077bf3e5e3e428fe9c1a54714dcdd7b24f1b3a29c36ada12bad28971629b145e851d389fb9c22b5f633261aba7ececf7e96944b6b3755e9737ed663851e343d707af0888941e567ed8d8945571d1c8dc9aa16e1684c703426b3198ec6240051313164d083003d467719fb3396857fd95943734cabee5b16adddd4d8eb507409f73f5e862ea94a72e9e74e1aaa3b3adbb3e642c7cb72698a94b639b4967eae5d3a71afaeeae7d296493d3a7f899a5b624f74c8cb68a88e6d6a5754a7aeba2fdb13b7aa398462b06c493b6f3a7465d3184244887c0d6dcf5c52caa2b51d5adcdd87ef1dbbbdc36747e8eea910a1184488ecf8e2ee4a3c56ee9e74f4028f1eee8ea4c49e3b7844b93bea83470bdcbdc6b23abc6cf1981e5cce51c7152b553ca6071708e80022ca0d1ed3838b8e9b8e1a121f1ed3838b0e1a3a60e8b8f1981e5c74b874e81c4be448c2637a70c9d12587167777d90b3cd6f3c6443b73694e92da7ecba47bf6763b713e971679198b2ab1a7d2f9e36538677bd6d49675c1ea4e5cec6546a8d1371dd550964569eaaafba45c8a1eb1e78e97ad68ed44959ebd9d9fa3de1e3dfa479392d2b55573df3241736c9b4b8d8c58261bcb74d2d0a337323a95be655124b56553255a8b22d13e97e2d834772ad150dc27e5d225dab9b649e78a2a416fafb6e98da6d32a25a5b76797a8b7db99944b6969cba62c2dd5992f6bd9f4f646356a14a1c11a31416bb913a7e9e86b689b435974d5a16bec69a94e6dfffc1c8a2e69d1a34fcaa53addf9a3654f24f58d50dc99a3a13ad6085dd59688cf0f93d1b3e93faa6b6a8d5a35f748e9e3d4628fb2b733c7cb8c8c505d53fb28ba2ab5cfe6d293095df248e9a34c6b9197a1eca9a47b1b5ddcfd08654f25213760b01105f4a64bd7223768ee4ef3f989412d52bb0102773f5291723cd0dab926e962604f1f7b680a19d84332c8f03dc4629b2f309bcc22db14ddfdc4f99cd9ac488c060d3582c3051c4bee6e5443893d77cc664568d45695860e6973a8121abe71fce0ee4545682005c111037725f6dc81c308ee2e801774dcdd86176e7077242f502087fa606f37f38525b87b0d3514c7c4e6541c4b34f5364444e3ee34cc7c130db9fb0c35cef67c61362bf239b359111a2a52cedd7d4b958d11d8a86223081b4f6cdc60e38684251b45dc860f1b34b60d166cd05ca951448d279bd770ea82438df6860400be6b00f1d488d578d560d5d04bb800e64b1717b6dc2c544a5ca6a23ca607172db819bc5c9b08e582d3dde93ca6079722178af8a0e1313db8b890e3c28dbb0b341ed3830b8d246262536e8c27b8bbdf6ee9d18a0a2992e998906a6f7e910c06101311221da690222126d18e57db9e183c30643d32dd892a3deb02fda6db110e6559f30895a1694595e4a04a5236f74645b3198d4d71b3999a16e958a3676fb793167b231c22b120463f2bca9db4a636656244c4e86bb993c8b7f0b2db8d09e9cf67cff644d71695e165b51c5a04070e1c46df943b3f2997aab56f9954b4a6d270a0e95a84464e4d5b5d9027f23938fe7fe805a11e1f59104e4f2cc8abece7f01062be51cde859948de1674649eaadc8e876d2be87167b7455df08a7e751a51665ba9d468062e018e1f4c48218c57e090f94c8d768427bd0a0a146d8267429fd172f14f423d341736a0f2323b6095d327a24d58887510f1e453ddf02909fb1689bae32bcceb31f48c10bf9170fe34748c6f333191e65cfa1d779197a436b3a6f646424c448487bde9868b79376ae4c34daf92abae4d15a8ee9d92674e988897d24f557f408c7947bb4962a5157ddabedb7aa3a647d54867ff1e2c58b977d0e5592263daad4a24b7f3e8b43dbf4763bff764b7bf4bccecb94da2436fda347575469c91be11cc582b4290e5d3a7ffc4e0676763d307a50f030e1ee41be7956b079966c9ed80e106274720f0d3f14d153a4a74bcf097a763d473e323e2d77f71e25dc7d856f9f261f1a7c62f8a4f081800f035ef8fe397f8afcccd83f9ebbe7f8f6c1818fd48f103f36f886d10386a7c3f78f096e7cc7d0e2ee45be63e076bac470c1c081910218521ba806a0a10db4b36380016202c4fa40029f2d3e100111000947400c701ff20d1401a02000f56047c88e508b17ee2ef3229b9aa1931d699143f692798b21533a5036e81c69d1ea845a76b4e8c1dd3d274bce548b1fdcdd739c74bbc504727284b4a0e2ee5e039297a948391e3620519172e9e7d480e4654c46684da5cd8c5e5643db135d694bd0dc9b2faba1ba135d6d40520392cf996f031225f6542acaa90109aad39d4aaf7e2ec8e348b14005492c514387e0ecc06be8ed96f670f7157ce384715f82027981c26b687bd67431a03515c78b9c1730f80bdb0b0110897ac271dae1e89410d0e2202982b3e3060e0fcebf70368e9f4068a88e08ca9ee84acbf1508bb0351405424375448c0c6969e7da3221528be440712a8ef6c67422a12fe454206d8e49c581840e515794869c0ac4dbc16be2ee33f8b6d9407127cb32bdda7e0d5d9954203fc38911b9906d1734ee46dc67ba13559a19197d4e4dd91555f24f7b56c91b19bd4e2ec8cb705eb44a4929eec52bd152a525b167d7a414f7b9f4d94f005512a21ef083a2cdc295cd4201360b37b88e8e2ebd2115a14a8a5816cde1d45aee5c8b8a6eb7148945934e5d91ee44958a5a94658b5a2615ada9b4a21665694568bab6452c9a943b95682dcaa249e7aab62c9314095d7545b75bba54a4d4a64b8a96d61387ae32a41a9a4b712bdaa2b5478f58172c8ba248371a5a7bb55d71bcac2977e25e558bfcbe81b16f90f68d07dc5de6fb864b0b9c8382063728bca8f07ca34002cd46c1849bf1e591af97bbbb92d7c9ddd2736d5926a5f667dcce74cda97f84635a697f3e8b2ab14cba476b6aae486d7369512d87d258b496a1e855df5ca72f77ada48b340cae632c20080f75dc5d00be4bed3effe27527ada87653df05171e27a63b6932a41bcaba1ba94183861a31fa7f5991971935791bbe894c4680cf6922931180a88969e86bf819dbd2502424f47308f02f0c31fa4752736aabb6b7932909d1cf1e45919ad01ad38d964bd954a9c8cb72332394e9762a79239f9f1a0fd3e873e7ff8ae6d02424f5cd9f1935ad674a4b91d01c7ad474ded035d673c4e857f573d4f6ff6b39947db57d231c1c992c26e473da1cba9e42623e478c1e3dfaa6dbeda4a5baa6f66fb7548697b54cd036a7d25ef89951cba235a3d749cad572e79273ad29b5e992dbd1a93b698f1e7dcb32fdf89991d1ebbc6c555b1aaae48d8cd8f4f62dbba6486c8a7e9b43714da7ee5134c7cb54a4b455737f7e6d3d97ac2ad2d772e749a39d9f4b4ad11555a2b28ffeeda4a98fe254f68b7c8d1ab7db8963362b4203473b4283893a2443523fa94aa8f42cf3e6891a650ad1c000040000800083140020381c108945a3e1781c07a29c7314800a82aa5070481b09a32c8c4114050d424801101801000180c16840002d0914b03846483b7912c43f49f5fbbb568d35d8f65fc5533b31d4d304094a55cd854e2d01bdc0b6dc0f55f72da1bb862ece4057ae1b5000c5b65474863d509cf5b62e2b1d85082313dbd6d220904878b13d04fd893e1e0ce7ffd23285a82aba075d4fcb92634662e8be6e7368163ff1709b2d6c0f028a1e8afce1c178a33e60de51130a692a6eced8d76b14db9bf785412debaa799e502bd51295c2ebe4877a91137f9fac67edd73bf8e8205c4e72cb26871e2cc2f3240482f3c7e1c8bb0a54bcf43ff6f333ff990b63e1377982d796ff48e3bec1bdc48766766912b8010ec6559f8cb0e30d535ea8b2cdacb22af471a41a44e369e6f021b0b92a82cd9ef4f1368171b8e78b795d453bffadfe7a2159271b8655ca9cd80274a2f1878f96d2772663398ef162f4401c7fd25e9fd0f2f61c115c4769b367365bc734347da4356542f3977c69a89b98e3dfc68ff69e8a3eda83c77ed0e329c8c45b35179c9e4931fc9aaec1160a4137febd361acaed537e14257ebbbcd5694de6e4b75a1679b856476d303a6b7fb787ccc4104ef4aa458845c120672e6e7b2242ff26b679274572e4d16c981db0c8d58db11fffde125288c6e8327accf23fd2c3b6590cdfa67177006c8d91313c59ca08d313453457c3133196fe2b3818c4bcc7bcfcce09162d9390bc38b0f4f24f604cc6d8eadc5947062113007b09993b0ce6d9c9381efd6ab3e147e6e522da44899f9db2ff6741663ea0cad012b2e162ec4ef06deec2ceb46b7b22ff00328038ed6723ec4b12cdcf75db451c04499a1426ee463f383707b75503ca1aea2bdfb36c656ff1b0dfda4b7e4b8c5ff5ad6073915106098da8e5efb2b4a2701f5017cbe35dd2511dda35b2254792c7c7d9d364150a1c4a1ede9571b04ea7d3dc49a4480c94a7c78678d458f4f29d29793aa190c2533eeae7965567df76431334f90fef21e801b71783cb80212824bf59de2d090bff6874cec7aff5d250e263a1739573c7b927ed4c5e3a8aae6670bd034837fdc90d33c54ffa47a0a24fe0711fca900c86827e3011838587e976ab74f8d4658027a9395734a007a8980e4d95b87d9fec1b71e1e15f0c446b756278e1e15d1e2af1aa62ffe0896dd921608acfcb6c51d8679bf720de75b0fa5f0ba92a10e57638e0bc8687af692aaa3e23aa5b6f78f8f79f52d3a56a5649d271b1b341f4a4207f14009b2e73b6b295aefff1cd6f09176c0431036716241e18aafd02e2c9b2612bf643d4e0bd9e46454233266a049bd7be82ac29f87bc15af7e721ad30e36c8ee23e670fd9dfabd2009d836fd46b6ca26fb86f7e984cf17abbccfedbc01a36cafb77e5b7cb4f89f07d9961a6f177042f86abc7076a3650ddde8ca76e755bb0c21801fd7c5d831eb1c1b5695a601f051b2ee684adb3984dd456869bf9ecec636605e4c3014c2a88d5bbb336fd6a1fb5ce4e25f7b249cdbc8590e2a686efabafbf18114cde13a0d4f576cf3e1b4c36b1c67664fefe1c044a4c674705c78418427c321eb834f80fb4d18cd0da6e4a14e6a169937d677390ba51f2e49bc9ca1d68f48c0d6306018e5148fcb3dab357e9c7bc162e567ece15883cfaf7c174cf419a72e32e91fc730b0106ca2876ba19919ab9b62f4e0a584a330bdf2a2d9c97864cb3bc39f6a38265c83d1bce708fb6f5f48c303e99f6ebbf3173135ba8ce8ae5df23ffa21b577cc8323e5428e7cf28573f72776b03815b4a45d13997ca714825947d49c2d47222e1081a9991dfc14f35e6f6fbbc050704b90ec3834d21e16c89ac424867b4661dccc6a63216c02a462de1aac7244968658bbf9e1a86bcef1ec9b9c288f48899b829c806d77b85bfa653fb5f19cfd0f2fb4d5f169dde81fd9c152d37b03c00ba434e4bbbffb59379032767a0122c21028140de89e310c8b0ddc9d1cbdf278fff60e815cd26f0d47ba6a47a79f35c7576fe62380386e44f113ef4849ccc6033dcdfb264b41d5f8a9073af15bb4c87da81a4b0ed190542b2c774900149351267c09c83d9460796d673a59629b3bcbeb931647b98ffdce8f44849f12434e3726eb19950eec61efc7320b16978720c35ebb9739870d346b636480596da985072f1bd064ae395395880db2b789d982d493eb0426d9349f399971799193abcb47f90cdaeb135d90d3afcdc934c6c9af59c816b17a89975a43450b326cd1462d894e098456a0e1651ca9f22b66a1c772faccf15b79cc90dfdd28c8ad21b87c602de412b41c350e4a2ff73108771078624cbbd68a3989a0ce6502dd0024ddbf33135051ae7d58bd62f1d15baeaaf88e903ac77f07530b24090d8073b6129190b42c0fb39dab3842bed06ffd76c58e623ae20d9303ec10cda63af6803647192c9a3cb3b0230f8555c9db4789a11cc4a9a6ee8e9e565e15ffe349d35f9b90bf11ab91124c0abf0a647dcddcb0f5c7c27cc0abbcff42c88303d147ce1e0c616ea0ddd11eab28146d9b9e88e8782d4e2242cf6c5286c8698b1659c1d9aaaa78d6877ed354c7b37cfed50d2371bad854928cebd9e774a1405be9917378fc43d0880f91aa94052f984b277d50a016508c89ffd869bb217cd913c18a360eb5861f54673cecafe1e22eaee72f73eda4b1cf8146e9bbe7ef608ddefa9edb8e98ab357645a6dd305e427d0fe795176da337cdee1ae00796360a5c7b061f51740cebb15c52204e56e295d55d5c2c022e96569ec3d3ee1da3fda91bc72605b54886afc66866474986807578117185dc7094a2b50eb0c3ad993fe3da7cf8d298b82c46a1e364af0775c3d34a18dbf6e69f535fcc5d4396463caeed9e575ed1d0ecc7b21cf263d0a959c079b89dfec75812c96fd757a26f04f93ec1eee19a7dc4d96c17b1ac3063a3d908ebd513686e77e6d925f57846e5849ebf3df07aae318843779a18119fd9a8847d5b04eaaf935d2c03ecc4484e4d13da1324765bfe9bcf592bed312eaac92a92fbddb0d40ff966864e6f5de8d7620b1f6acc05a8fb83485383a6eb84897e99412567fcb5fec258f022cfd1ae1b0dee7feb722c923ba2fa2f040fbd49262e6cfd79551702d4af41d83f70d33b645ab6901c6b89fc992d9699a26a0464248e9ac62719b07576e16f31b8af49be27394daf6708649aac52aaf82c8fdc97d6db79d81ee347a5529ef69cb1cac3955cbb74d71292fbabc763bb1f232fa52cb344b5d33e2e24dcbf0d5d9c7274615f779c3b9e8e98dc4315af6ced804f45f731f35aeed63cae769c59077f9c955969963ffb54eba6536050a59369cdda72d084b7887febfe79fb5e25ece785ef5d96514bd69c0955f2c7be9060dee1d8460a4f1bd55c8ea0d871f995d54709646ee4c5afd680cf460e4af731e845b997b07c1bfdda0f59fed167acbb865ff206d1b6c1f435833785a79c7f45fd3ccca47560beee1fa27ac501be5f359a64780ba54c7df11b93e3500db8a9fe0b1097d00f338b77ebc7eac84e4e32a13890d8d42cf1c7cf70e3d99b53446bedd24f3f732edc754c3d4ae551d653e2b9b92f0062ca908f95b77810322fd7aa731978232e0506e6d32390fdb2f1ade9d1d2c5c3bb45897420f98cf5824417c58d6f914f67e773baf4a369ea1fbdb6b28c81a84d1c41523b28d1b9a63f1698dbf45465281be044361e6fb7717387c1342c0bfe71c37b722bb337b141109795c5c6551d618691c9969b3624bb3e65d8d0de69155b924f7a184728eb0a00bf31096ef36214d3050d5ad3a859cb8c6306c8eaff0b56066efc513e7f25830fc01c2e3f0ec67ff4a8a4ffff3df47e6d7bb3e5d3f82acb2670ebcbdf8bb7f4dc02f4e03043ec66296ef767ed68e3dfed24b96d05673e6333c371e78d9bfd08053e185a2ed7ecba8f1895ade7b3f32b70f50845a92ae521bc34635a7d0cd2a48b917fa2b2c1748998d3a4ecf3997f725377da5c85eb41b4f0600f6f39750415b5bf9ad403ebc56e6ea760054a595f96c25d63b2cdbc456fa6f8ce4eec48efc17355c9f27232aeab22b47b08664582afa462b1bd75e34ad7388a9d9296a0a169e1792092035f228842351fe37bd7828780a6e568a383332202e6d5adecac4aca1efc042c24a372e6250500ec55aba793018a3e45d7a3eb27a24a4e5e8ecdd6d3f203f4c49dbdffe5c377d7bf5e43761a427ce3a4f145e52a14a34d473bb008a4eb44036541d1a688d9967753888c48db9ed66448560b2ba2ccc58b441d63fc92216dc3da2b33fc729ed30372348278867887e9577be7887843594c3e72ad0581d0d6112d30b7e6b759cc21e1a5d526acfa03bbf5e053f4df5d50e4177c3d5dabc30dbe04aa13919737b3380bc1fa8dfd55bfa22ab64f7ab6d8b02509be4e24308afee4788f8dde63492f9dd78e2cff5fb4b38dc0984824dc8eb6e41e727d71cbc6e9ea547efeaf3e9abb1b5e767df0c8ce41be6804ff3f7a20223821fdc163b7254b63eb7a63cb78d7e571a1ae751cd86b40f5e91afc30dd6d88ae2af1d188b2d9e5e5beb56d04aed6e2c48f933be1e8fabb19e9943fb198f8d9d34e85a423650609e9dc156405699b00bc5c35654f3754423c63a20579742d5192254db083792a20400010f749ea6e94b03b1836ea623a64bdb8b7a06f6665d024da3a983c36811790f4d9b3146fde86af0354c8deef32c2762f11beec210fcc09180988e123573270e441f677874c81bd922c034b6d5c61672bef2cbfacb0313218f176d5d1fde7ee7ef7d954bec981e9dc86e6ad61dc08f7c2f2b5f4385df49e83c08245a496c0c0c925be4ed1a9161db324a06e525a91d182a13e887b134226396caf40ffa3e7b5e3f57715c82f476fa89781db337c097da40374f8fd62ce161949c8c4157108e42e7c681ba66c07e8ac425a9adfea1300ffaaf4eb69f580b89e51a3436c63c366bb012be601bc5e781cbb1f0f5ba0df9b936279d5d79f4806dde2db1496ccd44e648dfc4b2b77f11083bc4d842ce357f320bfbe5a6c52e60679f2746818150cf84319fe4be873612afff33b2eeff457a1b0190dba1532ce05a65456dafaf72437f8f108365d5655a3b83c36e258ce62b0fab2743e4b13c63cda13a6cad6363d913a695fbb6c884fbfbc111b371700cfeddafc38ff6e51beeb655a92c41cfca91e47eaa1631fa0801ec5ff89af8818d626bca41b4549ecbf96c580e129822828a42ceeed1ed4e7130383694a3645b6d5b6a36c0b95de638ddc6a8f1b3b8c75b60773e743228530f21dd791bf15d3ccfda12fb402ac5bd84bf616f69c018279fb53ce4232ca7e4d3f56c9940cb3b771063cc28bf66e75aa4e8d566e961e981ff44f2c1ff6d3beb87d04dcad35710ed87dc06817ce21c1f64dc08dc27a8279436739e2112465adb8377f0d0c7a544ecea98cf14846a9888453192d0f65f7a513caf1caa1663a0d6c66121dc07fdf33db2339d86748617470f8745a741d3308d1d6c10b3cc60a25378abf2a4a124c3e97fbf005e9cb0f7c8c75b7fd68c1b36275d23ba8e1f237aee9316d1bb2f4afd959085c59235f736ac63e337647766afc3abb79d6a1e548509ae7bd3b3c758af6363fa3fb9487be94e2795a273c143b29a5afcbd33cdebf61578157e26f3996b2600c4ed4d2491ecd6e3cbf7727f64095b363ae6a48ce5429839adac78c90e2cc2705dabd433344e5a0600f7d4003ddd44fd7e3a6573273f054342a404a4926d2a1fa040f655faef2ea597f7294d232a320711915724ed8b2329d04c6d42a9da9a2601c7053dc7c067a970e288e6aa8f073011c876c6a3306efe8aa168f1ce4019c8e1e88f04967a4d95f0eb9f863c7d7ccb63416a3cf1f4b7e58430e72240e1f9c7f58d7e41e501806336644310ee546e8642316e2e8ff28e990bb219b99f71bf7045c944316591358b8bbe5e665670d3049c9eb13fc7c41010ae3e40781f5ee88857a9827bdf230e7938c83cc4afa47630bcbb6caf8088dac398c05ac110f49b06ba288dc576fe0f0187bd376eb4fba6da57c576ba35dfd94d1065e90e12b2e39fe1e71e2a9e0062389687eb4716e45113f1c6af53a43d84370114e92feae3c7232bb3bf8d18b44296d17fc95501d0a56ccca8a51644b93ee1f8236a9c43f3a1123a1e18a4b705cf7cbfcab3fb0d5a59bc8d135996a59cf9485332cdb8b124cbaebf237c0307df3356032ab7387cc817d874e5ff4bdf3c52e73c7b8131d3f731aa6afbefa53163d6ff70145bdb6c0344fcf97a4f2af6d443ea50d6d3849ec73075d2270b324cd574d705dc8591399cb76ec659c1ced5054e1366e3c923bd51ff51281efe2e3398ac7323f8f2c4f951033f3b7c2699fb1f0a3ef073207d1b36bf24e1c72779cbf0aa01d1b782769bb94d7bc4b6eb89f31ec4be93b50bad79d8b78f596301ce1beac7fc29d8bf04ec0004fe81dedc95e53a576ca8e3bd3d62f64d7610f41bdf9a3aab9bb012486fd0c2d10f1e8c48b9901a116372c75171f0c78ecaa0e41f677be54efc5d641a3a4eeb22fc00e7952ad3140e98dbc482bf80d6697afc5ffe6d7132d0c7a7954fdf6a1d64dba437e4ce4a524cff29e9f80f1aa18c01ff8275ab77d595211a836bb516e53000df4f44ca53a766cb886f34733e4cf05a4d7630d00bc950f341ec9f96a5000378e780f533c0ba0a394b7c99bccbaea1fe00a04b55d207137a21fdff94a469f7ee89a56b42d52106c3dc5de4adfc7f1f0ad9afbb56f959e78fd6be74d66095861f546616e647092a8b736b055d53d3aaf6c583b35375c7c19fe712e2201091bfcbf0b0576f22ec145a0e2961e3a95a7ef866892c965abd3eac85e8eec25050a1c0ff7d979a074e4482aebf161e2cdbb20b26b15649911720232da1fd5b184fdfff5982c54690a0dcfdfa1df6be46dd590d4bae71e79e6f622cf5f967e0e64acf957048bd4790dee3769eec46b9d8638af171c4e612c82419659818daaa1e4a9fd19ab4583b08a85ce91b9477640098d6f759674e017dfdbd7a9592196af8cdf278eac2e061e53899dfe73db9a069b8337f523c69922cde01ec7de2955f0b65bb0036e2fd81ef93f795de4fa2de2f143742c276d4d987af73a8d1ad1c9ee3bdaf32f23470dbdba8f3ee937accc6ffcb659fe1623c57ec3d07c6bf2c2bbffd9a28751217c1d82f1464bc3d579d0d958606848422c9257b71616d7d2b6c4a86d1b82df9e7ecf15ebd5b9a7c9ce04e8b74dfd9da43d07a34388506c89cc567efcfe43da1465f4a3b448d352de3c89bded698af5eb4f0fc7fc2abc247c45397304beb71c0a79d2418fb2080263d423f3884415bb0995933965f21fb587cc63e7354663f21f86d2bed1684a7c09d40000f463e027ded157485f762b90c3990bd793496a8e9a226724c3a38552a97560a2e72efaefcbfebc6cf03b31aa28a8e12fdaa52a27eb0087aa595a275ca52abc83015bb81fb0f9ed8f30dee6548c54b3841310b60cc1cbf7ce215256fc79dd179fa94ff2818266d8f829939ec7d5ea4b0a7c67d884a82d1ed20447961a45e883e053417bf6047ffa818d4aee8f2ef65be553bbd386e174bb8e774519c8cf3ab972c72f8d3ebd6033c6890a2dfcead5eb1c02ead203aaf1a2233f7df296dbe4ea3d1926d00df57104d20ac1d8d57382fbf68c47f25c8c7e85030ee1d742c27f3584d53a816571edb56c3f5fe5807bc088df05393b29c4bb79b1cfa8912dc506af4b2c67efd1fc4619fa6f431a883caf0ee8cff37e7f5168a071eb7799c85cdfe05e53df0df6fd29405eb5f875dd3dfc801ff8bab3fd5b8b9bc2adacea0836f98752b0cfa47229b814908ebac06a2467ea1d62bb66907f55208de9c573c187777dade6ea0e069338d8ef6f5e1fce2f69418781265efc32a533cfe38a4b07ea17b3aabea495a769996b06498a29b309e3504d8cdeef77823ac6541d628f8f36c621c20e5bb44387b22901f6015cd09d8babb13eed3bdba2794d05679aab057ff6345747762d4715876a67eedcec4f4eb5e212c05f230cac92a407c4a18dee7a07a6ebd21ea0adf6a4fd44d171af1bd7fbb534e0f9e466c077c0317868feb878684c7babe0e82d37f4fac813df5761739127ab340d5066083766728be816d3e4d497c1acb13758b3f71eab5ffedee2f08385769160b158431bc5321b4e8e49a76a3dc28ff04eb155690a5d31600d90715f6a32740bd77f90ab4edaaf0ec4abd13e2f7f9476ee86f9175c3dbdde01b1ce39f9d64db0b1ab95f7aea795f7c3d33d87bcc24fd7a7f555f779c83175cfcee4762a05afade226586c0134fadfad1e4f5f0e3ee0e6cde1c345e46c60e478095aab6a0dfba49fe8ff6a3342c5afa3b6d788c0d2279ccdbab1e6a8d2fad614ed5d564b747e48167c4f6bce43d8245a3abbd88cbfd620f42471f1a1272d9732a82677f752104a57c1376226213941a5df5dee615943abc6f51b66336ff51b1a05fe80b3fa0e27f01573f2cca3f9fa1e83cdfc9efe58b6d3f5da013f24e381261c246aba7ac4e29b95b62dd7a01319a839a33fd220e1b96bf4f7aa44f60cd5cbe137af4c7f5eda5a4a8c2576032550755b37f835e9f96cd0fbe40e3cafc6e6e6475c6192faea063705ce6ebae4126a019ae356bc313800ea88dbf08b9c5183b0c075d10ac5e507eb37faab86f412db737d0ed4b95d8f4fbce0f62f31d12777ab78547da74e21c759d7a7e68f20fc2d5e7ffdd7fdf5d78bc329b52cbb0ebcc08039b18175092afe2080c942c288679aed4b71039e81112c7712dfde71bb16f6a5285808a37e8a0830ca12037aecc9eb8d644d989d958be07840bf94475cd80e60c3a54d70094da19602a16d745c133251d598ab97586b097d74b7063d3426159230a27e6e2c6a1811ea3dba1e6458556a10e4aa38ce087f87ee3629d3464cc61b899da234db890a904879e3d018e39e17c23cfb7dc710a6251687c068b2f51878af49441b92a074ec2639d86da108fd116944c145ad1ba8c2f256e8433265d44e3da7e82eabef9080fdbeaaa4b11f5f80747c6fba05eddc9482caa0a459d9bbb65f8f60729805f8cab72c4cea89a62b8be50f0fc4fa8a2dab5af77005336fd580d4d4cefb17ec591dc099e71eb8be53b0149826457ad02f0e37c73b3051bf30d37531aa6fa893564a8e5179a1610ef558db052fc127f26ff165eac462b0d0d64cf8dd45efd5cce8c1a72934e5ca3b98f92a13e943cf7cf0cf46c8dafca7b81ac058308111925b7eb68f2a351557241b259d4761cdb016de05d680323cd82405e18a721df50b2c4e2268adc6ae837660c081cf9c8ed00907b1797883fa715fb86b964e69032f574546064d6a0ec52e864b2218f8dc70b59755b561ae40961dbbc8bcc5e6454ecab52e8cf51db309bcb45b195fb3b10d7a73bf644ed0b7391870e71ed1c561c332d65a98b1458f8de49654aebe0d52a10ebe27208beb18b697be1dfb24f3da33ee18209dd6751f25c3a982bc7b27ae23a6c35d4d30c715601fa361b3eb09c6d563c790aa28fc113657ed4b2e54a225012a3c891e6fba2a2d919f34b0f776b43c98d3cfa4bd7c95e34adc3ca1bbc18a47188b747acd7b950be7fce2bde210ced4300d4b55fd1141972a5699502c1a22c1a1b5ad0fb2a956057973e10a7f8e58c726d61f9d8d5067278e0c613bb937e0acbab03bc6d2318cb20dd761b6a8d04485ac58cd5c0c2c6019f41676807ef52ea398968f666bd72bc56a6502f0e84ef9bdc5ee2153b00faca38872b6cf80f265591f09091cd1e600acab5e44fbf0d3fbd13c67b0fd120146ed7319122c5a37ef755ba5746de531b981ff3c799c0bfcb961921970724d1d52cb5efb0f27c2c301613400970691dc63385913b34f57fcb4ac374550ce1022264f285d4e2df8742d2277dc13b8d9ee4638492b9420f5d30129243ad9cf8469cb728245e0b550d364eb2c9d2a4936290226f2bfe23effdb408e4a0c435dae64158f4442a005001400950e4cb609b1e5e72e153d68fc5cbbf7bf3950963ca2786508b6f4d39fb3214aadf002aac6d61135f921abcd78695a849900abd2e0f0a7a86ce9f99f8ec5389438e3d6cbf93e5e02ed93a79767646f24c09706c840a81998187a651a288dd06d3184c3ba495360f0f6aaab5efcce22aa292776b5d8f8a734648ac346067a23917dd13427313d072022e9541c7b9196daf19b6013d08c8b1f30e00804121e1ace519d93224a86a39fa3860057f81fb388636fb10bb480a45658d0908e2b7716b022ca905df3469e9daaa9a82c0c97c1a9c41bc0f96fc183b4e5f69d86dae9f2b92e0929936c2f2b74c8571573b6d137cef1fa08b163781755fde574d00362581c5f1f6f3fd34209894e20728f1db885b3e606fe9ef1d0d2258e9c062d227fa56b822a9f20527a659bb09c56d102fb057895981006a0dfb568f3fa73fb81eb77d7d4ac30a12100dc930bc54c3c009ce92a186898c45e109720e368a4903b880b96ab285c6b808f43304471492620bdc2c1e2b3110cfec2a604fd31aa96684274381a776af70dc47c138e6c98ec1fc1e03ebc30f6227a892d2a40c5786b99d1c5467566ca46d91029853b442a4c312e4b847e9aed24533d84c7eea782f0f2c40d7ee7db1e05e176dd98153bc386df7d19b339b7aa4ce52f8da1b74dd06d343ef81bbc3f0979665061125f9a12d3c3904223efd6bb4d505f353f661f5fe182e47650243da35d835568a3f6039a91e95d7b0ee9a9061961ca002271ad8c1dd3ba31e4dd74924e9470b6a3448ed36b172e167d69f487102fd1230d93c792ef08fc0b8ddc60a10e7a890f5664a1f545c00e7da3a1aae5dc4834a82c1c44665ef01f21ee8b756ff633aa3c4675815ce802c6bb4410640874eac35194e88f5c436d49a3d17a258a375643ccfe4830f93b1cf50b67b6a5f3fa60f9ed5252fb09570f438f7e2e8ea3b3060c43eb82d5e123296661bfeae4e0ffa0e22d5cabe58d75e7d5b885093f6039d4f2cc5658c5e12c328769e7a3ce97748cc4b19f4753eb7dd3634b1c318ecd020ec55cb74457aa6d34f9256a8ba6cca7b020f3f631d1409a0e992436c2f81195ddfbbee34e987e1d58062e1c0001a303b56ded4eb4cd1e5691593c9bd2248d004cf2009595bb0e8101b808a101dfc1227a4c90135ce8b47e1923af891333f6eb0ba5224c60ad3890ecdc83c28b01b7a39b385a089dd6e24602e7d5afe138d15d46e90c6416fd099ba6ccd137df9cc9061e71780f31dcc9d1dd7b0288c860068252903b73c4861b7f5b137563a478ad9ebb1e0063a5673893890c89bb557320d271e6b31808a2fee191d44ba49488fd540212f810abbfd7c52208b3ce0945adcdb7f2a3641bcbbbb152643ccffaecdfaafefa5943720787f4aed052553d618642789015101d7b90375c4e1170208c476aa63fd3ba80821fdc011b9d8ba3a5b6f04109093ff101616535540357620323aceafa2b1423039084cef1c3bdd10c8d728295730b9034e2726eeafdb32b38e64933cf1c71677608c1003c759b89fb386268453b9f2685f6e7a3a275185d43fc14be4fc278408c4d055e0da1dbc8a94f9ab236c214e0f72933a8c9e65fe69c045f8b3d35806a1a25982e90bb1b11720f6b5ccae0904263a18af90c607daf7bd07a6afa701dc4cbcdbe9e443b8157e82604aa9621420933bc74fff68952004b829e451befe0c4e400b0c9beab8fe0f5442c9f0571f13081380c4f44e23a4d000dec4206e10fa77cedfb76cbcce51e6c1eb6c1db916e8f7c5de03f5f9cecdddf2c089de8db60f5d9423d359cd9443bd971c33cb79f370801738d10f2ccc461e6a400b90cdea64417e5f115c1b197484a14b23534078876cc662ba7e043c8f93fa7af33b7340a2c205759359ea59065d8af1182945c6841e71f3981915f3b19dc7a78e6b2591552866923d39c8cd7635423a0d600d03bc81e3cc9d95cdb2a1cbc7b388a8b1788cdaa0c5277b07920f06dc252b1e10c0a9682733fbd77fe44fe3587470c5435dbcfdc5edc6ae88174f73545c374a45f88d91fa15a677e40ebcb8a68a9241f52373f542fe14198a5512700084e4cdbc95e6d5c464d2b16a11d166643000421fdc793cd999221ec7e040347b34df78f27b04bedf23d07d964d0417862135ec236bfda4d241e36550c0a6808b73ce57caaa825501b4ee9c00576b9f2aeeb0211014d6a66d4adc1da0d82f76717f26f171b473659e9c1c37991dcf82ca5665678ec100d0efd8bb7c55b74154fc8e2e2a283dbc135a31a09ace2073d24163e29f78abe90a60ed79e1dcb4c776b9efa0be2651f9586dfa64b7ec04f6d7863173096033da2f9116d5b5dd82d17e05d29244c30c56004f684eb02ed7fdee1c1d2b127c32833c7e89889cac97e3a1bc3886df087203c48e61a1ad5a9e39f97757accc8ad237c286780d25e01fe56afef321132cb0ed40d5ab803aaa4112426d6628db1edc427494667dba6a49d79f4a1ef0f18233f1a50729f292eb42c31acced992b0cf4620198fefc62cbca40754ee3fc9b4c28c10c1e86f0a4084aa26d4bfd04ebad627dabadb7ba35ad658d3556b0da0a56b6de7a6b5bd15ad65803d64dee37d6002274a58fbd7256a4d719bce6a769df4605cb87a06451309d83e543a8334331084f119823a9bf4520bd02e1dc8bc4d5b5e1b35fe7bc9106933888fd1e196f3ff6b14ca996b2f285f0ee5d2ecac9c517c2d7e09d0a2130f2373ca21b70d4ba055c6f65657d1dddded10614763665bff0f2ea37aa91061ad2f8461adc68c31b6f60831ad3a8218d9f86bea0ec483ec2725df92f0ac84587b9a50e1e5fb701707852dbce1fc411fa2da820f93256fa48bb2aab929719417fae66bdb6bae87d10774c2fef0e64a121285231b39565f465d7f5dbfd3fffb1c76834ed0b3a690e070992f0c0f0c38eea01b7cf07d0f430d93d87f591b8c187c97fd0cb4f8cc6cd50bd73f37916bab08b6da439ad17dc3cbf40e91279c1575a4fb87d7e81e627aa8ede4b7781c858bff37ff77a6b6c1d1618c85da45b5b8e9a6b0b3b891c8ccb0af25f4e93b5c0004aac3b3cd3fb12f819e50422b67eb0dec126cb30a2f4f248accdd2815749c89c4e61aa4b83e74adf5fa4f78300a500e74a83feededec1f103aee35af968583ae5b31fdf157337fb1e1207d7b473740d3f01c1d5697fd6432f61ca22699a9a977af61217deed12b73919a83dd5da62e8903997e45a0cf53a3b0fa6bea24714aef3547f86c3fa0939069c687294f53f69b9146fade69432c6abdbbd0a2f66defc76c0fcd3b8ce84dbb292abdd5c5cdcdf60afacc1b874b97ae1602a2f60ac004090e7f00e560920bbb4594eff7a59f9c69751df4f76c4b0601bc04c4a936d2aa4e38c04a350acc371f9633c42cf3aacd478315ee46b8bbb561a0b6e3db1268595c6504ca8f7cb034783f646f7acc85b20e68668daf260c4fdd33ab4b050cabd204b69f4159da211a92f0c147bf8649617a12e6f307bb9a185d07b24993784f5e7747134203876cad2bf278fe3a199b952a8b421eda7244cfe9dbdd1ec67152be39fb2ce68f749a9586790331dff7455cfd1e7a641137e4ac2a83556957aa5c1488efe10f58f9d2161bd651ae7dfe1eb2db7b47696d7d215d06a5fc4d65523cdf02cd3bea126b7ddc95cdd4d1c136e51b3a5e14778b7cc4a374e05472906943bf4e883ccb245c7dff61b239b4994a2b387309ee8e8be4b2cada28d03b89dc7809835d793d3f6218cca3ec26c5107d80c4707cff6116a09ebbf013258938fe0e4fca0b6924538cf34e34243a7277496a72a16ebcd3b134782104f3227d21515e2bcd3aba4b6090f191ca08b864709bebb84ce13ba89908fffc7534b2a2c58b5e4d449db61f7e1e2c632adcc48b6e211cf895e19354a458da742c742b627529742e961f9001b82ef4ef8bd23f855df25d71a8025870b547eed5b6f29b26c180549ae3e3c53797922c680b38278b5456981797307d18d0eb02527b571da9780048b6f26efd9174d14947a2568b8410a685c33e7472a3bdad93a7c5d2cb32a0941a02452cb82eb2e29880ee4f0c16fc8dab84045da0e8dfa014d398a58d875bb40f757568983a2388be071ed7a5eb16b09dd6bd43ca97f51c8a9096e8f656a2e791ef9133713f05824c6435a353cd40c255173231ecaa43654ea6cd9df10afcd9579d73de290a4018ef75673d4ba9bedc7787acad6466339d1a832d1ccacee8135b4b7f951890a4b12d807d8d9649d26dc98635a0cc57182c87a7871fd250f3dd933fc6e885ac9cb9b19bbaa8b39095dc52def8314fce07a3c5a49d3fba3ca2c54d48820a2bc2136e3ed694042c657f31933d068f0390ce9f204ba56a068fcd1ed08132fd8e420efaa83439fa2e673bfe76044b15d98a7c5f328ffd2a678a920a3e53362cbb38d1946ee190218f9377579af11c449aff0b85ac9cd012736d2a14a940785118084484ddab957a8f2234d57d636032d90c2d87958a5f0b82a33a55380457d7f6d7515449546cf6d2c2b08d71f1932c0db6c0adce6621eccfd9e4c4197f093699bb3df99d13c9ffcde5524e36fae50353a82df7e795d47c5226658374de57a4504c9379485deb5db32eff502d7155f533175535f4dab12e5e7d6040c0f1166c4aed12be3492de054371b7e27050f65c2b107e30ca662e4f93c24d7d4542efc2015049b1c6464c0abb14ac189e34185bc5abc560ad71910be6c1ea04a3d09b70a1e2e378fa323a57034470925047470d51dc3d62fbd56d40cafffa6720885ed72d58326b5c571da87d575d77138665f4a243b13a093749019401789945d4f3fa181ff00299bbe4ffa01faa901d7a0b551c69bdba89beb9a3651cde62ccf6da83b98915308d1c28f2213db9219c9107867c9ca9a082b1902b31fe64bfb5d462c139c67d515c017ade26ea498e957fccc14fce233b7718b075f0afdd0fa13ee981d001ac04ffeba58318ab8b90c58e7570de74cbd9fe355e8cd4346c97aca4fe35fcfbba72cfbedba0ce816f01986076feeb1170d96a48238a995c815ab3555eef81cbbca74d560df6d287617656bd78e4f53d4dfedec314da729e6b35e43ebd59e8bfa74d5c3a1e1d35dfc3a1ae1bfb9313d76a7ce6efe1d410ab6922075c7fe99a50c7c5f1e76d23e690de5d0f461eb53177ae43a437f201f4b98bcd81945613c39a713feebcc10aefc90949b82ee44551e87f183d6ae150f5b49e16b1c3480836db43a9c2199d0e18f9c15ad3ac840c57ab504408e1c3f791d7d64bd0a350bce732d0aaf9f11f09ab039cd52069b0461bdfd39e9e3e4aa436f61a0ff0c3a532528043f0cddf719b59a1c6d267b67959d66bf9f289745e22e483c20f3663fafa4c54c302d11b71931dd12b09814241275c2c58e4d9197c08261a0c4202db4ee3218c4cf31f24387db3c0b3431a447db8fb5a117a46aeeff39bf89d0a627ab9cb9793d9d1b6502703fa755c7dccce0b58da3e3a2b0baed0462b30d550afbcc1f388998702044aa100e77bef37c5747adbb251f38cb9121923194d6ccd0a9a7e7399186fe5ddf16fca944d60d3000a980503ffe1c8431f641f6ae14a0e51021cdef0d9ae056cc6ee8b46284b50b2001d37cce59667f6e07b4ba1e0387cdc8aa02bee431500849c1524541ecc7d8376b410c7f9d5772cfa3a393fa21dafc4db532b3304869853a87b0511c1d7e30d2240dbc29ddf0c83bdd5eaf4312a54b4f7f1273afa5fa3dc4d1eb371f8a2f7d041024be718499c2d6240af54809ea5563b302cd03ac0decd783387fa6a25a05c6d0700b5297f3a4e3c7f60fc09468ce423fe4087faf63d83077fbea3afc66e7f92801c6b7c8058d1e91fccb68ceac91bc9dcdba6bdc7e1d5d4bdffa5581816ad775f878435ff005742b3173e8d2281f67d09c8b966351f6da36f737fb5e0ee6fc4ac3761a8439509094d3c6ae2460d33db077473fde23f532b5fd3a77321df0f7038beece57f32bb7880efb214b3856f56aa1c43b306ac0883882edee9dc8aa18d6df719e38540825a575db5d7b953c0204b15da2eb909a409a1d39cb04f8b0d744dd917c71b25b4e573907637ec11570f0b20e2aaa1d00c98bbd397085ade3821e8cce36e8ab4394a47cce761b2f4b84bd55e48680007f9201f0800f0c4731e863254506384733b644dc63b34639e6e775a13f332679bdcf313ccf06086ea8594cc4a2a97839581b9305eb69537950d59cb4a52eeb3284c0e768909ee4967b15a2ccd7b5039218fd113247d27607813a9d7a77aa4c3533e2d9e16bd910d8f0873360ee995286a7c62e841cabf3d88aa5fd76de16dc24c108c1483d873fb9af41014c2703effc2784d5cbd3c42fe10ba44a3a100fab81350104b80ce04be6a22d19685b2ca14bb58c3d08b33ef4d90c8a108067804a87842605adc8606a052070b30d039f93f3565460f0a5195843aeebc9435391dc08b33efe774fea70f170635e3ab9a59b27739e8612e48b530b00102a260c1687bdb1066fc4e37eabab31ceeb587d58ed36b4f368ef97fce05b83020a81daa4b828137202947ccfe4b4297d6c047590671bcddec9fbda7eeb932b54d21c9d2bec04a92baffe96db27768b81335a36d29158252394b98d5325ef0d501987e3628b36d4f596994c5c59971238b711ae05640c58890ef6d3df11e0db802ff99158e8f680c94e37623a0d49815076b3d5ca01a2f7fe6bdb70377c9bf77e1fd29a3fb86e6d3af24452a132b699210153edb3b931390fa9e144a01ee6fa77711117a8ca11215435fb4d830cb0fa578ffade4829bb18a8ccc34e288180ff8d7806ab24cc7335448d9a1f5c8605448edd335326e9adca59dffb46852c12527667ac13fbe53c7a327878f7d0d5e6bc4d3714150ffa82003631eeff2e2fbca1655363ef0b7c41d1a1b977f765ed1a94688c22bc240ceb0f1942aaa28ed1356c813c5928b768351497a743a4fa442a6087b5c08807c89b94241c2618f32e2e36dffa11e9fc252f646e6c16070dd7c5c5565dfbc44d2a9485b2016c9c3b6a662e99321e743832d723246083c3ee215b3013d5b6d49305e308cdebbc237f6e206cb30feb1104d44473230e15af123d089c8135a7b1bdee95df4e309c518f2094350adbeb19b1350f76cdd033a97c3954cef032c5fa25a2587142a1cabb283aaa118123bd4c3d0e3c2317bf82bb19a8fb6ceb69cda1f2e3e4416ec1146c0833b486c1bceaf647245842f1e5ebdac0c9832e0e040c8a26175df718a5a594e8ff67dee2c3087f77fd136b11200350afa8a1a9bf119cfecd045ddd98840c7d9373aefb79634fb97a947eca8a55245ea45cf2eab4c62f742afc200d14d118aa87993568c3bd9d77740fccba0dd3a393e77f23d99acd1b8c52f68bcaeb455d0fd3e172bd813e56f4f97341795676057edefb994e24b82e2ec2a81869ecb9c7112e831db7193a699b527e437d40f33fe81623d633c1a16fcb17f8653fd8df9d0e9b0a0ab4cec886242472830a3aeab89518dfd8c9206b88a7987d70813a0641e076e483ee3324e6d6dbd01cde1efe0ac769da745cdf179337c8f786962ada594da4de5db41f8e487652aa9c8b198a65f844494f791695e359640a6bc03cd69a41685ce05c82d86f857b1fa894ef1c772f49f05fa955ee9d0ec9719e5f268cfb0070f568e3cc025c6135d4ed1f31e6ac19fcfe7fdfeaad507e4820faca2808df6ef678dc1ca58ddabc66016335d3510299448ef340fa984f9b084b74b288bd8284bc54e284a6c1aeb11607df59d8260c7c1e56125ddd00534105073fdb1df8c65f247d4d161fca9c5a023ce19922fe0cf9b4622032ce1b67b4e52fe061d79b18a9762bb6f67655f5ee0e66791f294d5f404b3fb6ed5a406fb2b91d7549c9b7be827c0e83342a330898139d8e11ecf1b0318a7e02dc623a7fad06836d6ae64abb01634cf14dd49361042d0374f9dcf338eb3bf00bbfe94987186111b535ededaa2d7c55d4c6a21841052fa233f20c411bad1dc971ad32735fc076c042508669d53568eb0879a86688c51caef2ae4cc056017627276c0cada8c15214b4441f14837a29a62518dc5114d71d4a0018cf3f79aa4fc4f996c84a27e5b2583affb171b1f4fa4cd0e67ef5361627ebc46873f8befea76d936aa07715e6273b276f28ac6ee05372f48c49f2bd5c2e6525da1d1d55eed612d639289a50807dbe74416b262c2c15d3d252f2c24bfa7d4fd39310006288243aab357a68aedbd01681ce60c985f9f21d8d2df23a92d28214f2991ebabbc5cd2efc595fef59f4db9805ef5cc9d9262b1ff021a357f33db54069c2bb7fbf23fc99b82fe005e90d50f6d27bb783222405ffce1ab0ece9bcdda230ac27769302540171d37d6060ced682e6ed53c436807752b158f95c5a2222a13a8668e334c946259a5199e4cf1249114ca973c19980301544fcd4dd5e379723c49508279f43c518e7d0276c34ad7811f88815e69cb25584f79afec750ffb561a2f99cffde7ff0643ad7319b1072837f2bcbc1c03e1846b7e74de74e1f400415333010867271083946d07a218991ef1e06d4c5656c5d1bb2c7069d8150ac596b0660357700c5589d1782b90d1785f781c18eb9a17906f32e4306f934d21140a7a4431f5f3676c93f711225ee37799279e5c888f24fda3b6b8c07843189f81ba6cb8727846ff85f4a08910cbb479035d310f756462ac2f5116acd77a3147e613717ec6efac390d704af8e0e15a14a14eafa2bbd4225e06a7f218a10d7c2e9eeed3f0801eeec85b18031725f6dbd24314f18c16d5280cee338619cc56bba32e6316fd719fcd7fc12ab7a6ba7373ba7897e0bf576af332acc07cc6ab0f31b06518d85841bc0265135d497bc4242bfb39f2997121240e3d7352ed3018a8957b57576e60e5d2ea09cbe60f1dfe412cb3b380769d2463186e20178462b3c81341693e5b8f27cca8a224974b9630c08fdad04dc290596e4b5a753b9a15dd452f96b5c1470b8a73e9ef270ba2331637efd4657006206f2dac6c2e92d1884f4083c946c9c85e20429951516b66343302e08ca228d891fb6dacb3db0882f724c2c198a8222b899ccefca28f7b23b61068893260f6c293ac57b26dae9bbefcbb90a3f9ea1c71cd6e001ca8317ec2c43e5085856f2ec60890d79dc336e9f962808437a3a2a2bf2303d2b34f20f5674fbbf7bfcb28301f9a6ecefa812a0115b0a1dee3844e5b40002a01c83d447878130601e41cf24a4da647954d2bcf2f9b5a784f8c9de790be3aa785ca279baf77568a111e06c29774227adff10fd49ba76273f37714424e16b47081bce53affa032b0f6236ddad2dde8d0105ca98f785f22b8fe523766b91fa367ca67db6f3f7d0586021ee89724d03b20ce2bff4549ec3046d1ba072e3770d3e4a6df249050fe2093110c09c639b7e5ed08af8a1439a280ca5defd8e452a5c72f3a2d41195fb20ba3de3799600ddddb92b76a4965a0819cde2628a69910b16f0ce8d2a0643beb4ac71a06c8529824e8e89f2698c6daad18086edc8ad4a5ae6779455eeb80934cc3bd1df1c637568c2ff4aaea6976ecd667af9f75d4ffc9deb04053a978ad4ce9cb098de5f43b380123d4b71659df7b8d9a57e03f7bc23bc61879828c4a37df2033f5593ad74025afb41b55a081b3fda5837c358c3a8273120603a205de290554a5240eec7dc069f6880c315dad635dd3205f188766f5df7433d294a0f8621559865e0939b14d8e6c1ab2d65f91de29f1ec45060b4490dbef191ff55c83d1c5cf134590e999c0cb363e6784404b3df676399b736d0edbe303e883498cd5751bb5dd1ff5af8e386b7b970b1c0d103ef9521d67e9d98cf977161315903decba4266b8b96cfe989ef38f29f3b84a4e698526acac20e712551ea3529fdc62686df8f714a26ff9d0c93c5e6943f1fc415cb11af9f9503768fe84b4ee2fbfcb7fd1b8728eee29922654ce3e9b88322637c0b5788cf9175b06e85624051bee6c00082332ea2594987f2f412e893c10ddf990d8cfcaaf49c50e9f6dd49bcffef78ea25dfb593bd72b7c67c9e59f616cc9f00a1eb86ce20231446274931fc7a28304908a0167408858db61746dc80c2b18cda65d47c1671492750e955d61a83f2d7091382558149f834914529728394a9073d71f2d462840f3f361de1a594117b87633c784a44397a98ae1df859c641e8e31fee61daa9e14a7cd8372ce7928f9cf55a097c9f3223f93ce69a8de0172201a1cb8d9b75a4811708396000c7644cee7a6770ca6ada376a182d133ef1878b810aa89d4c0b2d61c50edf1d3017f64cabc6f5153ee7037f617ebc5327e352265bbb1c3559409cbc8865bf7f9e50363bffd2157d1d898c31c4e873c25bd04364ade9ec4101efa8bde7c03d1bebc18a440a8e6976896f1c2a15a66129d13d721f969ee8fd839c18dd467eaa63625dbe4d3e8738252ada90081424c6d1d5b7da44cb12d7e12583fc7252744e8e6480c207fb8c581105870b52fcd8f82e4458cb32ecf9813fe2a6426cc77af30e185b4102e0930518d7f6e1402efa26b9c8b494ac0b3154a663a99398072bdc2afe244ba633bb1db3f7eb7ea452e244b02da2fb14684901badf28af04fc6af6781e4c0d96f2a3ee6762d0471d590e45b3f9eec281ae959b60b52e4cb2bdc86541faed1f68bfb4aebea23670618d8905d58309d6768f0e8218467ad466a53268313b9b6ab381b96a7b09f57e3625dc83d493f68d41a083fcd36f40c2c7357e99ed610fb3dcf5a70a33d7fbf3025e34fa035c8be348cfe148b5f0be8d6d08b8795254c87b64b67cc361a26660d1b3de623698c952ad8e034ec0bfb940a175595331f7042ae9c574ca25e1504f71ff1ad9f2761c35b396b81d1b1394f10ef6f5a81d7cb790d19a7fb58543f820d769f5fbdd9a365902b7c7ccc61c392c36598324ecaf16e3db117e36560ea582a0c7717e89980995649c8d27f183690ef1fd506e3f82dd4ee6dbd184cb88a6222a9101c75c7061e7850affed1940b0ee1edf1079c596448be62b9e85151e02bf00f2ea5eb90e624af697342d3bb2f7a6d2dadb4687dfbde0976160e099ddb453b149afe1377e291acc2b13e829b8085448d8801e162182c14aca3232236f6a34c14b07b82d30a97b514147c6ad836a87c4cdf858b42feba7b602fdc1ec2edc6f256e1944a71fcc9159a063a8bc949b8bdd987fafdfb43133cc2f5bfc05270c797db375141f0d0108954295481c81345a3404ea5d282909848ca39e186002768cbac3e24bcf4e37d9fbbce1c7ae704f11af7a7386c1182813ef1d2c7a00e4f06ac78e9432d52d4e922b8851c96ef0e44db43b529ec321433b372473efc8602f99502aed86b55d9f34b806b3c5544843e2cc8cfd0831994a9af598f6e2934b9e0b0e1a79f0ef27ba513dbc90c9bd334e5380bc99b4a3c7e4bb9dbbb142c71ce81227e9f0c9d62d07c0560194441b1c27c05e1d29aa67d079800259efad056d29d70b1d0a1a05a2ee5fb670325bee8bc1b38f34a6ee8f5afb089180a1be65962bed8dc494f63877cf8918803a238f1eb140ce5112e6592f4a7557a1dccc8444b7d7dfd8c688ccd05b402015392beb760ff8fef67e4ea919b4a5e20940f42497a7f5304897375b90cbd1203035737ad8cc3101d954972818e97ace12dba89449292f4eeadda4339cd6a23260544e0ee4601a8cb5c6d2942a9284504716648fab4fd3e178db9ac03b5aea0e12d4ea58d829c76ae601ad30063e231416e19a477b91d59a67ec4111e97b68dc55180a7f41d64628371575e787c73073ffab57d1fd3f21218f03c7f05e0426f962f6c04c58ffe8c349962aef17faefdba97cd9805cf3b2b971f3d055452a5d951783f88f2a3bfb5dc9b774dd46c2d50eee3550e12f175c636708d99556e36e4e3c20cec3af49a5fd15cecd988de7344621c310ee7641e2509568293b0eb20d98be3dda5deefd6a8122636271bb938c3b04178619723f609b87d92a07ebc8d07365d6a838c4470704d917781adcbb85dabcfd9079e44a338d6c064deb35b2d74a3f4f0562c68ef04bd49fa1ab819fcb1a03684e429b4b8be4e55848b83492fe3e5545f56322bdf4ce7c62cd4e53098c740e17a5d001b9e5d81af1840586beb973dcb422866a6215781f855a1155f272e85c1f3415da4b193fb5b580b53204d9575cd2bc171de3a2081e18b893cba1650ac28fc0888c61d9b85e5db68de85d494fe77a64f3895986739b58dd52b15fd364128072b06f42d56ff2a0ae3b8f6e83b548c763dde757d4ebfc1edf5ec60a2a94914f6007b5ec2fcfcc4dab06a068ce433a192268c80aa0a6e4c484a58306aae642fc024c11d9011b115a2a371baffd624bc1fa42250f9b3f83099dc4b50a568943944425c57912555c554ac3e5a196218f22976095606cf0f438fffd69e1f07a94ba8ee6c9dd69fee6ce5aedc50620fa75b1ed54929b3f8e27ce3c56325110e68a943bc18806f390027221502a438085b9ba80319860316ac05d1a2a7b6e823b418a191e2d92c52c00742c32b3286041b3421b787881916b1267aa573f4b4341bdd195c8b7e8dbc88baac436ed16cc4e398c848c3ae239a24741d2d332df263116e5d399d48f673025daebc2ad3c09ee0495a4314baa828132bdc82f40a486226b44dd9d591b86b08265c7e442c202cc17e72e4ef9e61f02b372c90674986ec3d1be166352c26bf1cc681ea25a60b38de4274b1a1691d739a0978f422fa8d9c4ba0cb9e7862a2e77556fb57799b6c1af50a56ebc12fc351a29cebcaf092fffff02cd2736e07fda702d53f533859b7da9f3fd01967b04732955f3fba09a1c07a3da0fb5ff99bbf6d3f3f4299e3c6a103845b8b0869044d80a6033b67931cc1ff5d7921dca62871fb78a1313c99859089b26de04feff31cc107362f911f730e7b5a998eeeded339a35ac0faf0994bb0595d19d87feb5c2ffd683304cbef400a42aed6ecc30d1a312a68080d39896e1a5cfa9adfc50a281e8ae400712baaa12310b0bdd0c71e9f0d93df8f2bfb69e497cab2c3dfe4753d9a5c2ea1525822e3bc3d3406553df2847eef4e8b92275bbbb0e84a716f8c6b7fb608d998c384d9d81bfbf23dc6d7513253f0db04bd1c37ed32b9c80a43038377ececbded71e91caf3c3bd035a6e751d414fe61cdbdbc4527f194f00d610add3e399fefb178f374ad2e967f95d9bfc7784654fd3d19b57979d4dea42d9aeb1cc2a50e5c52c486729a326f265f5552ebf06b4724003a70c90bab151a5c61f6026823e5174cee83bd86ad9e38dfd40f1060f7eb3c724e38afbd2e200c3dc6ff7ecbaf02296abca6e14c9d1c20263fc353b8295a340e4b6b59c30f352e499ef67acedd236a3cf17db59fef3117cc7992e6ee7e44c8795d446cdafd6f719821ef84809ebd7e527845f905c6217843affb24128ccdf00c310285373fc4f468706835421252eafcf15382c8c2fab1cb0dce480437c1d1537ff11ce21efe6aed8ef615938e0a90d4a050f06d0617122366cd2ef8843f12852bd4ebd7a20e7a09f886d5d7a6543b0557c3929670b98fc0f797e5ef844f2489c37a2e95261464d3aca3fd39fde3a63c0b5afb06ef61efd3a2773edea207ac061786933442c3db4e0d9d21362564aa9240141ff67573216db883426fc8809950fe8d650743a1499d0fb5fb085ce3e5b6cf2de4c0bba490bb702a16f5c9eadd6e01160274c31bc7ec739283e5cbb3b25e3cec98940fcfa7ec7e2b1737bb80edee986f4679d3b0fcabe600bd6c9a96b53b4d62b5aeaa46992f0534b5b53806a2f9f01336d21d3d8c76f2f1fc492d3f1b1002963775113dd06506ae8540d05bfa438f7cd6bd214c88b59d86b291bc2f5ceddd5dabbad9e86eae6504ccf9f72b145912e8899dfe1249146ec16c4e62000781cdd267a15f5e1ea47edff28d53ff3c5872b189b8bcba9a63015c07ddf7fff9ef28b4f4c4492cdf92b011a3343a14e09b0c127f2e5b107e6aa79074c85d47f97c1e4cd6903c15373da296513114043e65eb5fbb0a8b0f40ce567e32a745070e69b24c03cfdb0d4b4954c47eba0e2d535bb07329e0cf4a77ed871a014ee041f5623818ee25a7d42d8dc9f9d2a5a047a54d26d59eeb17f1793a4412dff56908b8f61feff89ed1fc64dea9fd9ec059019cb6516cb0e0622d5d9c7d81e118984a1f2d3900e97d494fd5c4635ea14f58c366d6b3772986ab319ced3625b1200028a02a15c4ec6fd190c66428a1789a50850bdef9ba25252c43e8324a3503a1b8d028f79ad22a6cc6a990e786cfab04e5297ce00f57854d1086eb80fb7c8274d53a836b1267316f1dad8e418ee0029ab994b0d9da000fd24034212409423050c8d2bd399108b74b7e30427b9678f88d230229b76eb0231c1d368ac845bf03a840ac0dfeeb2632eda9697d0bbce5d8cc1ce3b79ab5b022f47b696960ad7b9cac16d1653c3a37d5290dc945a7bf901ec80f4964d561814979644f69cc0e00e4201c71f0b02262183cc27d51f960f096849419510d3cdac35548b99a2545d7a476aab3a90ebb7d00a0f39c234c892970ff8d607692e19154f47e14a2e57dc8ea087c5c417493b41b3c5c3810087c82bf2c4f6eb8ec4035deb94906ff18d9f8c71c126d2dce1c62866141fd17c81fbaf94280602490311585b940ae2515a2f98b7e01bc4ceb01a62b70610f7e43025791e03a917a4fcc17b65e24214deaded3e84b4f39be16b39214c38ec409f74bede8b44311d897083e8e7c36a6fc94268c7f53bbffb32370cc21f3bb0063a7048a5c8372bb7502f9130cefff31e4a1e506193be415f13e7a31e47fc69dbc4b5122e3707cdf212b0a0e103fb4facb85e58c1fe164a06fedf54a3a7aec4dd932eda67650dc632127d5a63e54617f377869ababd980b757928647b9ac0b9cdd7b3cf257ccaab1e3b407d6e0cfd2bdb6b5027ceb051ca86a54654e619924b7b6f148366baaa6b3af78bf4c14789148c2b671784f65e1cd7faa7a4177cc44506e14ebfd415a4ea0cea2fb9801df7d3f265117cf1c6784ed5c34df19b28f5bb1ecf7c53ba667b050ceec4851a172ab5c4c4c98bcdbe24f52cc69f222f62b880073e2f5c57330b2b41f5086deb51424c3d7426232040397e0558204c8a6e4242aef5521951c9d8246f6addf2ca4b25f63bbc595889c3f1f707ef806748e0cabcf3cab21cc17f06d4afa1ba8b42b25d252435bb9e008a9791c5e047559041905d91a2cd18b9d1c9ccd8296123b032f55fca7ee389e40fc1286836ff54fd22a0affa3b42b06ff2d2c2f713c304d26c15472d6743dbd8e24f29cc432130a9c8c623e66a62a6de96ee998c6b8d55097c63f246e74f75df9b97bd3bc9007b1bbf6abcc212f27c78f2fdcecc6bf402405e671c2e21733c02a2be1f5d961aeb9c2e8efc506c0e424831fb04c7c4e8607caad5a691f712e837a7447b68ea10f1a18e37542251da007bb8630da60a2cf50d7e25a2fa74277f6d89d4470c07086a231dfae19bacbc27e7124beea8bca8f1c6d76c0aa52d9144e2bce40710dac7f629d08be218ca833e57dd64a052298e73e632280376dff7b1fd918b2dfd130cc07330c54ff406e4c420805eae57a55b352c6bc59e0a4ac872a0669f0c64c99fb7b32fcf4497606b38c120ec8fb01bcb171ff75dd9a170b17ca39b33dec8000da454032cc559008bc85f752b2857362fece307870dd76672e56cd5db0631e01f866691618b67b723d3254c8d05481ecc384165e0271d5938a15f0e7562e45c13a685191f55f8a547c7398c0ab64b0e2d1184015e3dfba3d9888b2593676c356f0e2d791589c95128b5cd1e812296b89198d29cf842dc402b4aecc2f9bf3b04f813ce7c7e0c240d8922d30712d3747b9d51b2eb2b85c5a6799dcad3772b0d71bdb2c670369ab503888824b8b1bc6627112b656783da92c1c019222baa0a047f7c6c05777524c52e575e44da8e2ceea586c4bc837e6ea59be6125bcf946060cce37e241df10091b0be31f5cb1ef19d33762e5597d831af1f50d8d0bb36ff4b37d83f8532e41a7b96ffc73e82568883dde3762f100bfb1189f49c8073191ad65681e3d667fb484c120885c923fdc795e4cc43aa40cacd712bf91827acd407ee3168e88f27d8a575798df2820a9a0eddf4ccdeb37b27e0ed0872d82f3c4b5037997b35c9af80679edda372c6f49914e074ee788ddcd89d56f0d7732ac7f1bf6703e0f3ae1c2dbfa850eee63031a3c581b5610adb299612cfaec9b160d2bea284adc52d5be476875f8a1da439171afe3c41bc14d20ed4298af57dff880d39d8c199995f4d241e980f66650a8827d6800026247251c94dbb33f1233559ce8c5e3fe8cbb8f788604191597c4504bd649c6b2de5d38c8994124df6a88f8410558d7032c2742852d74e4847aa95507fe0b81c91640e6a5e378d65d9b780aca69187630988bc803104672c87829fdc7b8ef054b32af4c06102a34ffb7a381aa3a6cb49bb8456d37a2762d471f438bfc96a97ad1801be83c4da92b7c69d2c07b571d2d61b95d125d904afc23707949694e7a56250aee9139cd29c9c47c6b740eadbb3d96cb40a0c475175ab79905a36df99d76722b335086f13bb010ee7f010c6355241ee631c96173bdee3f28b913050e5bd97d4391bd7eabe7cceb3e9260accb88ed38f3f050b09bf27dece3ff5466bfd0fb5e0524efca1abe7fdcefd5df1bb01a414226cf38f785868c8c8c7cd494d916ad7ace657525081d3b1107e216b86fe9b7c390c56c8a3f743667a98c67abb99d643963056402f6a3126433b3b1d51d7ecc54c8e02870dd08a9dd0e0bf5e7b7d7cb3cd25ea08c608089d28c5344699ebfb41011f1aca4096919f219e396b8eb9ac12343c9a6d20c1c5e0fc84b6d7a32229c180e66dea49b5eeab1100266b5139e6687905dde328e18f02666b20ae0211a6ddb2e2eb951e2c53052ed277dc2d1e42aac5b3c708995c03f687e3e19c7bcf2652422aa2e4def23e37f68efb8fed829fae40fa1e714f41c5161bac8446f56dd01a986ef6589e73b005b398caead0ab6dcdf6287e8ee6587d5c1a0f5f65ccf89815ee7c1eabcda690629a4d5c26f5280831332d977e690d40650e96a622496465b4b201a46180b7ee7ae8d6099618c58447d46bfb0fbb1f1ff2165382caab9bb4090bf23a98719aa7e412d08d160a23abbea1b0adcd056927f12c2f45bcd4cd845f7ba5d48b6dea48162f6db3295faddf36b7ea98a39da1f72128a4e2a902f0ef685cd73b7b7307e10a6fc2e50f921d396018bf96a038e6877e05ad1b8e22857a1c0c0e228d7911746ab4872ec2d1b76b5b509013f2a06833758fce79df89d516eeb28040861c083ba61681efc19f0d65330a6abd454ec52bb26bcb5c5462505dd6014200bfaf784e6db8e0e7bde7a2b8fab6b5001fcf8846b25d3433da05dd9db63ca4867a64a83f9baf5a5ac8dd09a351aaaed2e30f3ff71051bda8ee5c66e5746e218d9e9dcd603fec71ec577dfcd747bff4fcec8a88295600d89807a1216d9859a3cf61d344b74bf62a535fe1bc4a20bc3989c8163213d8466aad8660bead3f288030b8d7251985ca3ee8c6140089feadee5b312758cbcba7e5d836b369de1c4a460a06c8c5e6011a7bc39e53230ec04302431477fb0f42697a56cec473be8cfa96439dd081b9cdfd440b6da43a4da0371d7a0085bb001c7018080504b5a942c44b44dcd17a47530fc5bab6f02c52299e6bf14082f2cbdb58466a7f318a6a1718b32d329458aa3b70769ad69025e45eb282412413f63d7f0272e90f4485791f3b3035381626fb847c10bc94a779c1e372c019c78ebd674f4fd95404342dcba8cc0578731ec1f6b05805d87335ba4eff02125b01f91c2dc24ebd54608f3a6e8010717a5398b227d2ae5422b1985a7b4a48cce274d3d035d558e3cd1298ff87c2a2948416be065b2660ba6400c0d3a9d720b8ce78394edc9b98bb4074790be20d6e5080f31d970c0b786bf0d6308dce7f05c6c6b4837ba7dd46c58c7d61beacd407397dabb791bdaa316ad21104395e36ccfc4c09eb98e1fed343107f766c622a6088746d0ec3943a9da3de224ce65e8e920527a78dced5711b1bf0eaade5a549da20d04d0abcdb322959eaa1b5abc028107dea63f52c29508450ad4946989f7e5f89e2fcadc4f1185443d0a87eac7010caffbcdb54b8bbbd531e9eb4ac00ad5d66af17e6b63fd2ad061b373440093d93c2e07a0e9292f5667c9bf62b74c5684de263a2222c040b3bbcd3e6413797dfd771bc584312929bcec0db720a75cd01527daa05bb5f9c60503bc23b2c0a490e01cfb0e015263e25071e306d98d8fada630ae6eb57b87745a4db8433383098277c40f3b536f38a5cf40c6c19dbe1e20c9d3677c4bbf984059a0ce8eeaab8cccf95a8211268005f0cfc03b4a371b432790f06edcc28b13b2a63f88be35cd15820e7e81a636f6b69a960b764d5b862b84e4a12434c9c0b6bab6730737c5e9baa6038e65a0f8d44967ac48a5491a09608fdfa0e884c7cfebda84919587a532a6fb5a730a8e5362583cabd75a466e180d86a3d7db20c531b06cddda08af13098606077c5e934104e03eb28a00c2657c1d018f2dc4004eab0c3447a082676476bccecc976095d5d566d078be1429b65124d074ea250094688e12f6b29487efbbe44c9f9cd699e5379c55db09aa2292a28619e48c038c7100f1481fbf6ac54594766d0c796611ea1b7d0d6ae33b465391a71c09dcb7e5fa3494c0ca459eee1881e357bbd9e78f23770631a6258bb26e90749c859d0cc1365dd0d9ea1d9c1347d641a5b857dd377d56df917aaa4cd16f43e9827786aa0208fee4c736c53cc48e283d57a99a6b684377c4a2c9254a73f598036bc54483ede292ea72726b81112a6e570c6736acf96059606eedd753c14cc647f66535878ecb21e5ab71ad094f7c0be56300601014004c5a318c5b044276a2533e2d0aa4f7ed00c538d3b03db61c87e22dbecd84b17e512096999563ff190299d1ad2d7b5142c132d953894702d6a54f62a3668457d4a4577648dbe0411701799dc168e08f64a403e0b1b10230559a64352aebb8d46ab38f930ac01c2b3d0b4341dbe5df0b3229d0f257742f74d2a1d307f2f2cda34d6cd2e5750bda0cbb68b9ad1b2d4b59c179081989580c6ee9d2b965722ac0d5236eeaef7eabb2c557b94ae1e8ef92a123bf0f397c96dec2ee90281ec0fdf9308b6524c88c474c8c14e9cee016eafd6749e5b8850c0cd256fd61d873a3c46cd0e8ad331da71401b919fa33fa536b1176e97d9fb54ea0e0943aad6be9de143d92a454f8d085645e60313722d515bcc2e90a194c5c04ef97482732cf1bbc3af0f362d86bad2e6f0e60f92cc2f63c6b27381234a88d0e3be489b75d0bf725356b4f91e8f25a024c008b35975b16c3331c41c4be0a1fc24f5d45a1f8961af668987140ecfa1eef0b23dc66609217d9a7dafe5ab75061350049666f2c132cd193e0cb7f965bfcb83b8a84a3349d8b0b8e34d6e5794c075dcb70d81e51a88c66f14f973d9bb592980d0f3afb8bfc55c9dbd58b8c26c82267c83156d3e7439fa1af0b86dbdf76fedcc22e32dc1d9841ff282f83952be1cddd2987c971616d9c3b7185d550dddf9ead0cf59b2f853419582947a8b9fa62572593973b578cc25e7cc64bf727d7a3ecdaa49e0fe03fef9662f231996ff80028d6ec3915e27512578d083516c53be09c295516ca12c07a8e63cbec023d102d9afe978c23e4b9e0de5bc440a9aeff141c24315f94945e425d50b50cc54d73330fd9b3a414234199689a6c4598e49a354c4af4038eb644a766e023e20b9643afdcef44be0d648ad36b3229967525a2dfa1a08f02be16c3906f69cac2232061127ba6dc33b3f4bb94d23913ef9c13f87e79eda3d2c5042dc5dd2980e69559f8d1978acef56d75ab2b9beed636ee9a94e1c847c6691d6744fb3609729a514c245d992302ca6d86151d860d9ebb87249040102491b68a54500c6d4be4f1091f008e463bbc3071d111edf93e89832ae82b9f22a576a0f0d45b0ce982ad388290210aa37f10909c9203c2da8000f95c59d3eb3698bb51ff663d831924714121dec2cdbcd38b10f2520477f9149cafee5009867605890331615a9cba3bf17264a9cce80ae469a09882a3a13a724bdcf4d84dd1b8eff5f41433f86829a045f102d75479164d0d048e25416e9108de2386cbd9ff700d6881057091632283abadaaf526720073e9c973cbe47b472e71023a4c0cc5445854b3f35916e933970e3e98a01aae40e8005216465fe94ba65e4f01356c0eb6174d5393bea1cc0a3d08760f39ae66ba385280a497ba9d7590cbc6ea30fd0531121f94ba60585a94e2f3112557c8b8d9d2471ecd4a20af102db1e216e21e56006c28a34e450b678260d92680dd8b6a3ff8ed505c35ec37ccf92c20438692ef7fda78fbd0a591281c519a140734ab8f5a1c4a058c7f1903101efa9ca1818b247652f2661b17494c24b1a1908aba95329d8603bd4503c83f8a6c64b010a4aa8163809e052b7796a98cb3bb8ca7e177180a4eba545e9679702c4c63702635e35eb0c960209c7e40dd4db93b0b598b5203c737a14ea4a961e4763b1b9bd3d0b3c817f496131c51ddb29fa4ca92ce64f580f350d9d9a57df55df7779668021c16f3494dc0f81fa0d62c29a275f6aed18100ea66c57508aef6774a04bccd8af90dd50443b05267a71196d1e206015ff69c7b60860d6330604eb3238ef319383452cefb870021399478a2f131f579ad5c23e6bb140af01d8731aea67d1a8070091d61d94996680cfec887ede44e89ad09daf7a8613833eb26337564467ff36377fa2b9bcc8b660c2c4c9f64ac65e63cd05982efd31830e0051432e1596cacb131abc40860f2887201e4b10429ad30b92942017906f958a9912fa512f3e8131b51e6c008fb72d1b0d4493204311d4063ddffc4051081ce11345e772c7857b9be687a48a134571eed2367efc8fc8d370e6e99a863436263f376a7c44e696dbb98497263ee1fa7df381a63b8c2ca25fd8ad811ace83c6f99c3a9211b0d27abc7186fbac1700972c5578f4621cfd3fa1fc8a176e5c784fd9285ca8dce3f3e5b365c96ce61c4a14ba337dbd6debcabd91d0cba399d840e1804a2cbfc2ad4cb9d2237a9571837b5a9307442632352a3b032d9b99fe554bf6a262b0577101d81e05c9f4ea081dcefd6894b844288f19e37e9da7a3d6ba17d4674e2c6606f6257791859319314140aec0034a2d2a2f98d67b6481148d283788df47dbd8dac0d661754efd8cafd31477c95a639c5a46d0aae6190af13a13fc13cadc4d14e8f3000fdf136f82d711d8eb8d6026b53ab44453cceb6a2f8f7e9cd0385a596faf8d74d85b0a024ae7b42e921987e2114776a7d442632453f94d5da4c75bf5336f2bb65fbd0196e3325ea0b8a2ecd0522b338d607e4d711db3bca424d9d23849daebe5fbb6b56bb29dd70a416167471b58b52bed2b6288af12bd21e476f147630a8c2556ed693f5c838fb040a87304160fab67dc3ebe073867f10f1dbaad2a40ac0f48c3102f4b962f615c11935cf076bd2abae1dcc9cc4f73eef2a1eaf2ff947a532de78ea55707ee2d6808190a3d90b4a617a13964ba96fdaf17ea8c568a0cac69f7dca46de090e22b3e9df64ef30ede27aa7c9b48b15c8450663bb56f37c013d7a02db1f9dea9b96faf9499623e52a23ece90abcc0c483bff1970c0e1a911584eb4bc2fa102b34122aaa3e385705a3b012e1165b14e9d0ecb5782cc18fc6b1ad1f836f5b99416dc57601b15c7d8ade24a64554ba60da9b5648841d880295f07bfc2ef0b28356ee0e1e5c7d4d38ec98c4bb3d2176d00b4f110d7e776fbc14a766c9bd73fd1ef428fd1171485b7a1971a5e757eebc939f4078adc75509587508e3eea64d1c3df209a06ee884fd431a61ab812ac8ca268bf95f544854bfeaf322b6205471e353a6b260a47fa989acb46c2e5049e17aa0c1ede97b2cf73619ff5206bb0103f0923a18d395aa8b2f888baf1532a8db807051ad1382ac2ac7d718880558a852dd895738e7bccfa97a564def026a3270ddf42b4e2875ca939d284273ad0b5dc68d8267d2512daa697a976b5e1d66f81f36edb7fda77899ec0a65385d2a28eaa68f7a456946b1f7574fc8704383be32cefbbf2bb4bb70587743fff0fc9705c0ee8ccac1329efac8d2fdc447507cb1cd3ebc4bb74304859cdaf3107a28cb959e3234fc1c62064577c78687f118005a083c43a87bf9d3ab6e26e1bae52185802f6e80301f878eafca83fd596ddf81d9ea00eeaaa642d75c665cd40f6e15883e00845da9c5f6ad3e571608889e5cab24caaf7f265a815ccd3905872c6977ad5186da050fb9a1657c34a6294f93b0b59d6f77c236314948ca59e0a6f988a2b82069a5f85e86321cc03ec30244577c16292bebdbf6ea25f0fde3c215664e952074b8577839106f55a30dfb1722a1104bb5bc17602233ae7361f9467ca1fe9969bfc1dab9fbfbc3432b5bc74d1e79fcf832ceddb2c29e6b20e30af4f700d0843de9f7e7618025b5ada09c8dff7cb81e7a196d6b8ce299812e92da8de4b4704c7cbf8fff46376ee0077ce018146c23c7e1e45d3ae87dab3e63b451168bd6472c73b470a5d53a0f49a136b2281feae11a39a30a38e19195b4e83a0bb238daf1d3dd7834cfffc8af65d51334f254781d6f946675c2f192dcc8218fa85e49a20e24dfd9784ccc7b840b1b38c360a9c10b44bdaa9a7824473205f1601be6c5a02b75166d6b4498c5e52c0390bad06e7f1bc49c40e489437db05690e28dc843dfcfaf6a06aaa6e64ca4b1e02c9ba5dd0913acca1709593e66d3165309d1032c088e4871ed769ab6d80455c6284f6351fd031bb32e04b3caf5ea2f16bace3853b26301f25a7d28d1a1a0fee9b4b3b3cf91c64bd5b0af3c78cdc4f0a3938e5673ee680abfd1d29c891a003c3111a6b17d98468ae3597a1fc743173b9d8981288c196a58ba13e89d3e61e000613dce6097f224a53504b8c5b361166e047d36d32c2658d7b1967725870d76c17a2173fb0549bd9c58ec5fdd21a5bc6736502c2381e94cdb005f249d79521a627f1c807cce930cf351cb4d18c2269ac0874ea6174ed17a0ac4b4db8c06dcc738680f1048d82fa49f82288dd25205b20b9c1f826903f37a10a2d159df7bb32ca678b6f42e551f019ade5e7d0227464ce37e849bb1673c02e0789464044013efdf303c4cfa60f92b2b16a98b1e14fa014c2b244cc605f4cdcdfa5981e85725fdee41ee352fb1129439b227a35006f3a5695e08bd19f7df9ed9b63b4896fd09e6a4093ee9a191b9d662365c81e9fefdfb22a04b643507056e1bfb9f9f71aacd4aff8ec46bf214105e7d870b788cd065efe2d895410533cc46f92ebc3b4837c6a9c32166f476ad28dbc53145fe7b0140fae918f1c86c0d20fff2b4d1b514da8a584d0b590a38e553bc1f769d9c5b9367a62617d30c6abcdb85929083997ecbb35a7604a70ca2fe0f2c32d973708724ef5857001ee3bed4aaa69828e4d84569563b55efac6604b12e1349aeb50c5f103bedd3b6856b3b5517b792ab87dc6ad8abdbcc0b9359f80dbcdf906bebd5e3acfa946097617ec7d3004dc574dc53d484a8b6ead0ea55dbf2ebc569276811fe7fb6328f96118bfc471438b6b3a8437b922365f67b8b7ce17538ed7c3ef018f8429a54c6ddc596a904f4129ff0c427863c8f17fee24621012ffdd6590c9f16241d5cf56608077b65a64f96b5bf1f3564d135c4c01cdb80d65f83799797e1077d0ec7d962b9205a570bbe2d2cae596d3e2050621b084f1ff76ec279f5042cc88963eeef3d7e1c4af7a0bfa7287a8a4b1a0caca643a680bd665f9b849b78a13c434a7c5ec39d0fd873ccbd4ea1b26ef869192fba25d99fcef0969c8c68b9b7b0658667b24056e474646b18c4abc28832f64ec36b9801e37c10924fc6c87e1ff97831d0ae24afd97f2624b68f681163ff320c108b11725d1bfa4c97b1fabfe2608c9f0923f4636192acbbb61ac85d3e7401715e31c1b22b1a729651ee50c45bf22441c062cd9586daffc4ea63e6d4085691280f1dda53143ab498a06aa630ce637dbb0f8d11ec5a6b7043c8769f8e9bac7ca3de667ae7692e976950e497188e31e724078e27e7ae03cb4e9dc154f80501893c73d451b8a92738462fe021064f0d114baa9a2f7367137bd521d5b5475afd3aead6da3646a89518d19fd1b0a1c0a38fe68cfec33a92a4ae6beac0e9b8c833d6844d0881298c1081b70427b5f0bd2f219a3e8273fcd92a8967497b15edec4f59e377c5f932bba22ee43dd4761f69b34476730f4df0de16b717f3fc650b9471034dd2b2b586541815cbaaf1b617f297a1054ca6ad840b4096531fc5cf7ba00cd16372843dc7cba8ee904fd7bca743abe7fad530413429166ce95e8db6639eab91c07a7c8a43c3ca8fcb7748331182c9067db57160766629b706e6ec7179c0ada1f8b1d841db5a0a792bf2f29e35fa410206d606e58282eeec8809976c7769a100d37df64b4409248922623f017fdeaa140015192bb7af6a048195056664c264ca05ecc62485b6f797da742a2036c2d2464464025f4ba0b7c40d4247e5f202e68045f3b15b3dc63a37284d3f585b5ccdd301208cac6221fed03c9b10470a999549fd701fd47726d88ee8fae4398c840801e5268685b2f37df56893da90fa660ca130f2bc691d1fea9444cbef1af0d97594fd7575fc534f6a16b41cf971c04337adf2a125a9e0987f5c2939b46402b63cf74f1e05cbbef3331f5adcfa7ff960171bcbd08d0e2325120e06526e3df11dc835193212c7f14c900c09a4d53064f6e2009747e62aa3837d74c25c594c1764b198da279571c1ebd8024137849441ea52160d3660f434450c1fd23e521930559842a4cede53e63a3b432ebc6ed7b1dad2eb9a6f635feeb1b3f0ae3af5ca6a0eafa3f28800ea48701683c64e03fa4ef5ec4403eddc362d94d13c1943835cf41a5468545d5e147e0a5aad1710a5de60ed004ec4cc7989f0ec6cf4b02942a83e0d50a064669750d95e550ac9e34ae4d0a09b7e620b49cbbb5c1ffb93739306dc8e176b3503b12fe79c6c5f5c1dfa8334384149550c2f8a994c283a59f4dd07595f06d3e882ad6d6b8890474474e96ad0d28381f0861ac4873637ddb38b375957e0e2f9993bba72f55493049e585f48c9193e2c5df0c0f3bd65a48120caf81b96d0ce6efc7b68f90730d1105c259c37ba2ba9cd4f33d0be2cdf6171040004bdd9457909ea8f3a64caba4763e3f9063301452bf56a035da44e3cfe663af801b470a56a1be6223af8224afdc1a9f10d902fa15f4a50503a24df89a5905870338b89f8748c95d7d6c107df213406fcc003fe105def0358a79480c4c7685ce0cf90f629594bed2ed364170d51ce047288625af755486e0ea0524ca2a8ae8d3e312e53cc55bb4a0c9a6d75b804a5ead4998f0cf326b7e8994f3e501a43aa807614d21cb5538613b9dee6412904f62cd6875764ab9242a5c5d08dcfca6071a0c23d796e6fdf5c41c5aa75600423a925ae921f9638253884284a3f0091957e38d195f660c428e910c456caa18954f28189a8748710034a3039040e8e54fff0bf704f2b4e33430ce41c37fbfd1c6e5f8a8e7ed5cc64f39d7d1db87a75203ac0745427921c7c6351f764fe522b8491a2651884a947b302d0ffa6222439664b9a7e5a2dc1fe0206eb38327eb3f5fcd481ba63f738898ffa68a0f7ee6d7ef6a6bf14fc0e994d64b5f8bfbff2d7c961e4615264d039c3d7a71af68004def4233066d8ba75cd4b43a2b10d6a55e3447bb6fe62f98bb6bcfea53b8e9eb65d8d46a4bbc1f028dd4706d85ad3b1d2b862327a0763c7c3f7b92033c11980df708392f2d74c9d23457aa9acd7d7cc74d579cc3ab38fe87aacd23a67ffedc176347fdd755e5bea0440942ea2690085e9a53a3cbece3bf49b23e9c945c1e0e793b95fc64a7111f208e9df5575ce21768dd33c52659eab9a2e8302ca503c5de70894d387e499aaaa7369cc918a7cffade0ea433e87b6b4bf04ceb3c5ae114b1080489336fc7f4f5afff5d5d6dfee2a0911e5f0f25fe5d572f44dcf2c3e6a04298d90d68eda4aaedc74a80303411b5005204c0328c7f63f12d9ddddddee3fd0f4adfeeb62e63eecffb71d061568110a101008ad710cd01aa7733d15cbf399a2723d86022b6e2829dad15abb9e0a13791b1a221cb10dccba5e0a9063198537f5c13a109b3cd14962b9d80118babc8955492608c30c5a03815c680de6b2604630438e485809900d7acc92606e3cc3a8fd54282ad708b3e9b821ae05adb505b48e8b829be3cdb781d1ebe29df1b60085803e628edc2195702f4c50a00922d2e07143848448838d6be1435c830e54d891862c3a46a0210d2e68562669cf14565152e6fa72db3a40a4d6da1c601c758044698dd303481d80d8a0354e0180fca1350e01609eb4c621009005748000d13a48dc78c1031cc8f0d2c68b13ccf0628b2a5e402ffa054aeb2071e325e6c5dd540efacf45bd0c397259d30485465756fe27120c554482c17eb4d11a670041c8d891f41283012a1d0cc4fc585959c130b0466b1c2132c069ad71e088f4a28f6020cab31ff2638d1f69747e883a3f3e4d7e28d13a48dcf871801f3d7ce0c1871d1c34b8d13a48dce8f830636565a5e3238cd67ca8a07590b8d1f181c4c74cc7474c0bf967d8053ef497d62e39767df621181a1ae906ff63199529101ed1d060af2b0749371ea26249d8f5a211268140a32d61fec1286c04b22ae985e669aa2624981bd0078a4b34180d12124683c10081f1212121651a098834b9940149246540ca0e1a89a8ca43d848576e238dac9b8c7a2932eca240a32d02fde7c8cdc6560661aaa61a6d695b924b120c8daea81094aca29448301890a770c8e28094619648b280f45713e9081aeb6383b5bfa6a101511e44c9b63e7914c24e24182ad40bcc1134196635918e68224dd86b4b4946493fc5a778f618657303f251966ff0ebd053b194542320d7684b18354482a1a971e9fa5df3208a0a7589aa916463d1d0542f05d695bfc06412cd8fea41301990aa07c17cc82b1f1206a4cf6e825cdf2403938346a1cbdafaba8afcb5ff937dc8abfc22ecaf4c7ab264890f26344f32aa1a8da42a5f535157f68446bac115057303d2d553d70e79f595057229db0fb2324982a1c12e23f45fd6a67e7c321bebaa01f218e8a5eba97ce61f1be9b28610912af7414323b9948daccbb2b27d24a3b285612e656e81f0e70969a2f1609475bd1498c841202b63d4278f347601504d4561365f5554a88864f39564f3150dcd8c74037a2a5446697d84b24436d6654922919549180d06722a9825ba46a25cd55018cd4da6c9886891a4310986465334213d7359efd20dd6d2936992c954e6d913097349349a625949a6094a8c0ccc8806cba8101109e6da169090e59abac1379553550d05935d2e02a2af90750302400700e0dee041068f252e7b7011c3250c97232e4ab4d801803680e8622600433a015801220801784200ae0e00ee10a28a104908c00e0194d111000c043044003041c8118409827801c842003c50803414008e026451001114200304f002014640801721a220c40cb83000d6e9483d469d1e71e8f440d2038e1e3c3880053a3da018a003066042c7039dce110738c01807b03a076862002e18c0006b7486b06200520620071044047abcf4e80c510421ccc0e38701e2e80ce105029818828d0e025480002a3a0980a293800b7412a080041c61080d20a00a9d0454c180333060059d05d060014ccc41016128808a02987486f04302e660401c1cb007078cd1618009180064016e38804ac701106880141a206a80918e0282e804d1800e112e444c1d085852e7015740d23a0fa8e2014f3c40011d22c8d021a2051d2294e844208e4e04cae84440b7d694689d0850a003012f742070461459e81441844e115f748af8748a60a253c4033a12b0424702553a1260220123121d3a921c1dc9041dc93b457ca1082d7428d0050a40a143014d81017426304567021ae84c60029d22d0d043060065740070c5055ac70227e80c608ed61a94d61940161d0bb8058298801e5a6b4fb4ce047250013f742a908512742a307528f0871eb1c7055e1085132d5258f840470358ba60494247065a6b6d050d2b68d0a1446765080e1b7430e97088e834299e4e6ba1e3037fe8e20f4498c00f5188811f86a041077d28411f28408710f8e0061fc4a0e30852e8b8426badf1610f7ca0c30b3ea0a30c7b90b287173ae8d043177a9062e4610836f000050f420cd15a6b77f0c11d741a16600737ec20461a88b0831075f0411a26508721e8c0461a8c68adb5cbba01bd6052bc545448bbf472fd08c3a8907f56e395ff078af5b1915eac8f4d4603a335100c735096409685ed280a29db8351d20b06f210955f4b2f200b876e30e9e5250a295214525e34e58142cafe31e3438a424abe66f491235148915ea4174df399d73ce8358d44437393611945a32928a4d0d4549f8d307569ff48987fb21d146876b4618711ecf0c0025a0f371c718310202120770310dce0fa67dce08526e48e20eea0b27f728775071943a470071daa97c2ba8a4ca035fd36fe81f206286f30c1f5950d9337f420e40fe50d76b416040e15c0ed081c6660471d9a7e3b86b0a3d5b10627d4e18330eac8a28e2a3deaf8d4415347933a8cd421d531441d42d4d1f0d0063bd000471b6b28010d1f88d161a20161b441056da8a24a942443da1023db30441b8068435b031bc8c00638d8e00436a4616325a142d737b1963cd6447504c3becaa827b407b1aee7404529b99a584b94680f5235d11a470037d69561afb38a0a55d708dbf8277b29feaf6de39f4c447db0eb2b1b2be49f79b2c7b2c73c20077dae3c7bf453f17082008213000e101c007078dcc171e1b470585a3aa30c66e451d054142589b0cca59aca0249984b20ff4b9a9160a2a0c15eb2329b286868a048e2e69f90601ef4368ef96565210b936a5cb230904b1805f2ece5e5f2d7a0a73cc316755d9e3fdb2ee9a7e298a42bd7afdd028da88a92ae17613092cd2fb1f9647f695b973f284b8f3dfb1b290381a80c93fe6a428271e9b2b6a7b268b025bd8d8465d95b4344bbaaa89ab791b4480e1ab4213de4a0c31c45b4d638f09abaaea7c2e409512847e9310717e6b8714de9ca855cdf04fb5c8dacaa9a0903015a6b581838100627b4d66862f23b210a5d46c2c086d61e95299787aecffc0951e8322286188841460c1d9b5f120613880107ad3531b8d11a672546e44afe2f28413051e83292619e640c22188305c61083d6389ccf304f3206375a6b587f8da62e3c430636c870d3830c1028431332dce18389bc7a5206dc5aeb4086799232fca0b5965f5b42b27fa2a92165a0a3b5c601fd194661d737f1cc8798810c3344610606b4d6a2107286169ca1c9197c98210dad350e24d1448e8f1c51e41822e558801c40c4818738e688838d38ca88c3067164218a83268e25712811878f3816104703831d6e8081086028a36501862a60d06048020607861e606870ccd15a6b70b001870fe0080305705001071c7048008e1e6fc0b146eb2071e38c37c278e38d296fd0bc11e50d236fc8d65a7be3e50d22de58f9021dbe30071bad83c48d2fa0f1852ebe5082d641e2c6173e5f595ada9454517e234dc9d48531774282c14056b632eb12e9cab1c73017dd6009a3304a0aaab2ae4fae6e9e483094be2c2b4b305676594524cf7c8867ae613e6465917589442efdcb6b6c46caac0aca6b8b0d1a36341b1916bac002122c24808d39b08103364680052460a1085ab80017b24045162e80052d68811a09830d87061b0b8882145a6bed0a6d5c218d2884e10a595c210a70a828ff0879ccdde683b91128a4483097963c514891f207429e0c34c2461e28a4487fbd8d54850aac6147158c34a9021855d88076825536d6902a8c51052bb4d666ac20b202115608812e32071b66d8c08b2aaaac215a430a9435ec1a3ed690d6002289cf3c7ba224ab9cca83de094df6355378436b8d09249090b4ffc7738d324bcb0f1f532c0f46c1fcc0242a7e78a417cc8705a8905e6e7e8ae7067b3ef9f2c73c3797571486c1405f512b6c88a2a6a238c0718243a7e4ec318fc7d223cce3c9b257bf32e3996b2bab3c50517eb9a8c6f828ec066b5848e0e6a2b0feaf5ae334514d4581a88f0d9661a29154733948c2987f3c733dba30eb7303a27aa8c186574da8c10729ac254f9080ceac254f88d232cc32f2041c8028a73293594b3cf3214e40e18827b0a1b51a2a8865418102133741f46714a63ed6d5040a3368584d4589444ca29086196a84d1851a5954a1064d143562d47851830244a801841a4eb0e36b2eff080179e65bfacaca56b62ece193f18821c30359575d94859f53630181e619f5cf915c4050163d04f8946395bd2a6a4ec318f7e6ce4f283a58a1f3e3c1855535112a80102460f5ed8b10474023102608bf85183d7c6011880021816113684024978200b13e400882eb4d6fed05af3034d6b6d090200e2878fea4148c4489a0a65adb50db4ce068c28d16922351a1ae9b184b9cd13690972092f2a70426badf5610fad353db4d6f2700720ecc080ce1d1f9080b66e2e285158e9083b82a2739790043e8491043b3a950a50a746e95423adb596043474aac3a4ca02e191a5a5c77e8d66a4cb2a523d26f994cbb2b1c14658f5d563d6274bd7c8da8004835d2e12b934d2d625923080814d6909a3dce6834830982809334858c30a90205b6b7540c2103d90d0d23a48dc38021d9a9404957d8da6864847f8b4d6f2115ed05aa3431236d6129a26ad83c48d219c23c41ce1a57590b87184091c416a2dab3e6429992628313656050343933de6b91ea42bff489ecaa2912a4aa2f9299e4d93a686d048dbf2117a4c93fd938a098d5b4b7cd01ca1f9cac2fea1a497eb452fe90f51591a0730420f8cd00123f83082028a3085226c5184a908144823491a475a6b8d083e20421729f02214a232ec2f6bebcf97b5a5cc5a02a5b2d0a0a2b5360734f8d05a43a2f540a309adb5391021b6d6e4906934a2a061c4b60e1237d07068f8e881c6025a07891b584655a3cbca304ac2b6f5f2983fa9ac25124cf69564f395837130908a6449672840087868ada9813de60f7a2767242113c491336070c6a7b516872aae644ab692e47722c814ff27b029d94a72c6196368adc1619aa0c40c8189d6da1b84400621b42104336c200428428811c28b197530030e66c061c61a66986146196678d13a48dce858c00c33b2087d90219255dd5c56e8434c24203ff4bff8902ceaf2ea339661976523bd5098582549aadce62fcb46a2f1d0e86a04f20c1b0db9bea686f24fcdc8aade09f6d87ce5a9ac69aa984c13141a4d69989b8caae2238cddb80dc83d95670fcde444821955a940402418fdd93f916024e97a914565d495a5ccaab06ac8cb0568fe8bd0e0eba9509fadca63f3d5ffb53d365fd1581f1b9a97f7606694260a099d30154ad35f4224204024180cdb967e1722019160b05d1dc92ceba291308ac6478551d26549365ffda03902f2cc8242e3431a6118454930157515a191aecf40be2d094692300ae4da290fbdd0602edd80b2ec5588483f7c4819f6245d39919e8479338bfc3f42242030130085b20f4c13982c8fae0c932698ac729b0f515905ee95603c0a1a28fc89946117855de07a6ca4fdaf291448cab011139204f3e34757e6439246352f99a8a6a23ed9cdf5545e927ef8780c1b79965eb6248140eea191fc4196b5291195ff8281c9d94b2fd80b76fd4de53758f4976864dd482fefd908ab5eb2a04830d7cb0f9a1f5dd953a140ee11fd4fa191aabf2ce945ff94aaf20f4918e5791076e94120cf20ec7f5159f5d27fb23e880104316e20c68d1845e4200b39b0c9c1921c3c200742e0000938c03808c00dceb8814807418cf18131303086017ae8000e1d90a1832a3af8e86008323230861c63b43106150cd88167074576f0b28307ec0000657ca18c22947182328e94c142861a64900165075aecc00440c84078f9811c3f38426b4da6f5f8c1143d7ef0c3075bf041183ed0400ffad08336f4608b1e44d1830e0faec0031af060033ce8ec400b3bf802007290c1c40664b081192990810da2d091071bf820031d75b4d65a0d9ab4d65a0d80480119347034686910a2b5f67f6d180cb3405236b2a4caa58a028d241b0bf458ca4618b366f4ebff9c47514879f9bff60d96b2c766a428a4c0d4c0bc0fb7d1d68e428af5b181428a04f3e3ffda9295493ea451145230cfcb8b95492f21ebdaa29b6c5473b904f28a2a22c160faa9582109731b30ded0038c34c0d032600075652e7a273288406b5513949681109a0cf290fd93305ec210230c28196625c9b0d19030e070838b7e1b4b5744c04802c60b180b00a307182d7ca0831d6898230a5fa461c6175e6c51c51755be107d41f3451497246c5bd21d4f8582e21a657280e149176074e833ea0a31e8620a87480ca680440c7cb406233dfe608e5d306d89045efacad28211eda647177068addd3c92afb966907074c03903bb60387400c003566217b2b506e382365a6b6eb8e1b8600d17a4d13a48dc80b9bea2f66b09a3804830377af444fb6758456596e5c4e62b18977ed0d87c45e343d23212e6129498982a5610239c732fee4919a001813cd3484f85cafc89ac7a2aef23c810e92b26daff0a51492420120c104926469a8004e3f16014cd131a49576ee95156fd271bcd485cb42d7cd0a1a1987b2c3d6a410c1763e800e0072d50f22e50400bdad0021ab80089fe6ae4b1f408e3e2041fe0220a174db8e8b4a0091754f0b400db02ca1614d882056eb040092c4083059a05920544ac808d15a0b102339c4021458291a658566669981126619406593799fe4fce281b2c0a29d75b7a844121e52b6b083663e9d1132d56d09abe79245a64418b38b4d634a5474f68a294400b2ab4f8684113458b26961e3d6962a8818d3ef0988cb6a8eb9b844621aaa294c44819e60f9232976e70132c3bea68436bcd899b8c027976594a28ecab5f020381b2c72c3dc2f408f3601e38de30e20edddc700238b4d6481080d7567622cfb010956117cc67df406c6b8d053db2c0436549d54ff10ca33e35d4074b12c82f09543d26fd48db58206a8a1118854954a41929c3a82a0fe42f5110a98a2b91f47faef212a63fe41516a286611186ff901e5834a13d68a4ff939fd45414167268ad3d150a3423fa47d2238b04b406722aab3ec3a82a44b2d04075240babb586515786bd939b8cd2d4e80354922c6ed05a8d131f2ca234c162081631585080082c7a6001c41574b8c28e2be068e38a34ae30e30a1bb4d6046667d945214b486b8d0dadb535b4d6d4d05a4b031a5a6b6768ad99a1b55686d61a195a6b6368ad89a1b51686d6da1cad35395a6b71b4d6c0d05a83a3b5f6466bed0bad352fb4d6dc68ad75a1b5c685d6da16b4d05acb426b0d0bad35365a6b5768ad59a1b55685d6da1aad352ab4d6a6d05a93426b2d0aadb59696c415349eec311a211fcc8f68adc55c184b04e47ad111ee218972d16f2ad4f59a0289442e6114c8a99055dd802c9119ad3528c8c8c4bc252426bf13ff452c2856cca1b5f684ff229fdd04b1a20c2bbcb0c2b242b7d69a15527a5891a47590b861858c152f6a382113daf819ff7c5ba78ef00ab55ebbe9fc2addebfaef334d3241385678f8accd7b47171f8651566157fcae96b2e60bab7e1f13ca5136678df7fbe5dbfea8bb72bffec888ac6bc83489ac4bcfbc18e150417f76fd8ff3d5d725ac53a0d766bbe5f39d77ad937e9470a4f0353b07fdbea3f3d11885f90f6bea24b5feeecb79041c2860fbe4ab55bffa923e21467c5ff56a27b5f3b5fc3ce1a8a17dee08addc144e095f739c60eb83301642eae06fa8dd7e0fdacf34c938e134c1d6192d9c12da98afde9783020e13aed3db663cb174477fbe25fca67bcaa8ab75f92974f9a978942069ad5beb08a1a499bafcf18040a33d4d3232472e26a1d011ce183849c016ef49dfadd8beadef8f202f333eb2211c244ca72e6bfe9d9f5b682f13d314b304e7083ef39e8e61b6193fb7fd23a32f26d3240a657d24e608270d579dbef731be716287d00858cab7784ff99fb17dae0832c3997dde273385fb422238f6e7e67c594b8cdf9e68388badf5fcbed64d9df321e08a1dba3cb3931f5dac9f69a2e19ca1f37b3fb585efb584957e260e7084f0fcef746af19c58473a3fd3a441d4277b6aae0f698e19eee4d30fda9c25c693c6cf3481fc33cc330534c2d324e3c40b921821351505052708d561bc15d617ebccd7d6cf345199e2d9fe208f8c8c134864b67f12275e90bc642325d374fd94cb43fb9dbcb6961899a6d756354d2b3ce000a1eaac69760e42acebcd3f88336fb8e78dd2ede7a8abbc91eb6dac2491e3837d5d5aab6d9dd2466d610fa8cd594a3ae1c6596e083fd35484c303fd55eed7f94a8b75b6a2d0f59926ece6a7783c20d0db4cd3a3324d988709ce0ea4d7ecdeefd65bbbf30b855386d4946a67df750fbf5c9770c890ef625ae5857e73859736e18c61bfd2fdcf6f9523d0a61c1d38ebde5b8c65dd73faa41fc911c3e17d71f47cff39a5fe20ec35569269aab19288ac25d3546381622c2707f8e27d6b75f15e2af3d597755d44a07070e020adcf6d776f42e72e3a111305e706d7bd73fe62add77dbc8e6383eaf046bf97ce2a9d46c9a981a631bb19e3f4ecbe1e798112b2ae22f9454fa629267368f0ae73ac35cdb74e79f70ceace4fe79d6f69bc72ee3030b4efc5f7689d6fe3fc3288f4ed3de77caebee84e8341e5bef7427f3a533c35fe02efb9a185186abddd7e78fd0773239e699a82e345b5114eb7a7cd583e7c3506357f7449e1dc59d28fb2220205c481c1cb182d741babcdd4560ff258956786f3824bafd3795ea82b7d95839a3c4e17174eb70e462ae17e4e5317dce9f66269a39bb46adf53382df059e3ad5247a7f4626cc3e102e677e7bd37de7ff97fb7f84775a5dbbe9bf8ee9f2cb8cfbd3bed84334b2dadafc0d149ddabef659433be7fa60904a2a64cc1d142627ff8c96da7c67bee99715430e7fe6a1dc4cf615ba3c452b0df43bc23843bdafa78a3406b2aa9c3fafcb9a4f84f80bd7a8c3b62f9a2eb383fd38471b2d87bc27ba573b7d4e1593fd334e260f15ea5cfb92c2dce3867ff4cd3c5b9824e59a1c3d277cd2f73fe4c13c53101adfb5fd29dad7bf8a87fa68953023977d65b436bb77e10e7cf345991ad74477dd7081dd4ef85382490f9be68dd7697e6f93b7ea629b32cce08369e1066f7fc9dbcaee1679a36a70ae8348d7a43f97b6bf8fb334d3522a011ff3bbd6e697ed9c29a10e897163e385dff94363aa64180e7e7ea9ec74ab374ba7ea649fb5fd3f45450b733d2f96a9d55c78f43601c4d53cc9429ae74f94f4bfcec9d10ba14985aeca473f55f42575f8c076ef09e1b5fb8b37c187bad327442231e4f9eb051150df1abfacebbdf6774d2c651fa9eef8532df1adf8342c5c9bc67ce77bbfbf9cbf320ec506cdcc934d9f8a5c488be979d73fa3d8dd3edf799269bafa6699a72b6f3bd0fc627dfa79b7a3f7971e205498cc895883c344d16d397bed3d4ad4b4731fe6b3e6b7174982d7df34af999a6231fc873dbfba2a53abac3998a26b57a626be57bf53e879f69da96e783b9118f089356764eefc3d83e3735cdf0334dd3945f5b425e5b4ba6699ab0be9584b362ba2ddd535bd7ff99a6ec6bae08395d35c64ea9cb7750e2cf34bd1889d9ef24c810ac3d1fcc3f441ec3dec34901a8e2d78f62f7f8783b3a3fd3242363c4c8cb9398204f5d50a6699a3c1e1116633325525b31b677baabf1beed01397fdebc73b68edab81de5ae9eceda5c63cdce39fee8a82bf42c9ffd9af1753535eaf7396787f63afaa0ccc6d06d97565efc336ebcdfdd7af5c6f03af9defe1cf2540fba9189020a144b74add5fdddab956658cccbf5e6f75927861a57e9f5334d5656511e49479ec72e173dfc186737adbdf73da7ef5bf89870972fc6b8a5c3b83efce4679aa629fb2795c652f9d71d7d7367a8ed7b906804e57ae0ce52c6fb6884f4edc71dd89852f9563e1d9fded7a3b80e6b8ab5ddf952f97e3f52b6d65ee5c7e7315feadc07060a79a7b471dafa7b627d2307acd696deedd6fe7ed6e1cf344d53964757f664da808eb54ecfb73e1ae57d79467b93697a12653a69b39d316fbaa7abf8892a1dbfdb379f529c9dc238f1a094375f3c31c6f66969a4097bb5dd79bb6c5ddb88f33481409f8940b957c6fa2e3ffce0d533cfc40c7932fddee9ec8e4fd2ba61764e5cd56f4208e3a5faf9839f69f2540d54a7dd4987e5ded13da74834f12a1dee689fce8ed6a967984808f3525edff19d7bde1bd69782c26a46f8932c716c218ed023ac7ad3f91f0f464dd35522a78cf76bfc9ca9a5d27da6699a3ef41f915f35d3b44492793174d2e91ded73db750c44626dacce29ad72caba27ac19e197a9a28fc47c4de54ea6e96b2abf9860024249ef85afe763edeeb4400c3c32efd6f6befd38df87d5c84b171d966eebc4afbaf999a69725f285563b775962f7f2decf34550ff25479eda9f2ba4aa2c88ed6baf78edfdf37edfc4c931022d63a7ba9bdf7c569ddbdcf3481fcaa7917cd2130ef6c2f74776e8ce5d49f69d294e74537d934c9dc5433d37453f91302eb8b30ba4d7dcb7a2dfc4c938c8c8c1dc55c9f1d8911324dfa29919527916b9fa6eb33ca02319e8af288ac4b4fd39589ac20baa26caa91a73393a16bbd3396116238abfb4c93a4234f16da462871f1ab6f7f7f769642971fcb0302799ea6cf1593aac8344d1326b26e126e4eea3294f4e9b97584144884cdc8389d72bfc31fe7fbad1d1024acd4ef7cea0c2d7c7fe54706c6d18d8344183504240a5131d3240a51d3141a554b62f0dd7bef49edbf59739dd3f454acd034e5a7227344b659ca5b1d7e2ebeaffe99f6960f576c2dd6f9fee59f7cc4950ec25c5dbd56d28bb3fb4cd395611e9927a427a46c14b240cc64f1dc59571a1f844fe1f5cf34792e988ae9c332fa9317dae93b7ea609f350faa67b995e8731e6df747fa66902d3e7b634564b21bdd2a1fc4cd33465a13d4d159092eadff4655b2375d1dacf34fd5f9b48ac4e57f7d3d28ff2efc4a169c23c19667d3cd5b5047c76fa73e999feae79ebcf34d958570dccb3f47e7cef20a5344e2b3fd3a42bf7587a9aa64966e6c5c69d2c71373bfbbcd6aa2f841bfa679a32554dc9547559f9871170fe4f7f4add3a87f5fd4c93679a244cc8b28000f2d1ea2dadbcae5efb20fe4cd334c5979065796a2e8f07880c5c1e6c74793c0dc0c0057e30c0c705306081065400021460c0048828c287048a901c1081222040c4038a206267a30738a0ca7f3c9e8c5121221a108200032e2b73221620e9031450c5b2c92090003aa184000b5f4d457d30ff48435ce000d00015e8d41e379e4fce1c7b0a3001024437800b08915996007c04f112809a0b00f1300c00003a1e3f5caa7828022d3516c853535135351688012cd2caf314c1c9aa3c061a00c2e0428609381ff2aac5858c15d80224d1304ae4428404d0a4e08534669a8cf039236080bc6400033e2e60810a5060024548408a00041e40c4014aa064a50a01342974218d99d6387bb8b2ea8de010a18cb4f695b58446c23e99e8b5346117cc675e435171227ca0d0f9b8a15d17111aa9f21f3e447ed954a369a2c11fdd9acc95615308739b98d75625c5c1831db8c480a092f2f2228384f4a38aa67c64fb934c4e2e26d9fe24922449959429a42a9af27c8d7e8f0b18faa72021e3e2810c7834c86ab103123152f5204fb61fe4b1f9aae5093568b882a5063ca690615a420209295fade5481127c958b101284784cc34991122c54855342582f6242048481f98afd12f441f9922c9122a4a6c3c95e5c940fec9f0ebd61a15ec7f6bca7373fde8039f1d792a540d91d6384686c05eb7c65902345ae224b39610b12c281a64197910f6cc5a1264642dc1fe8b18c9ac25dac9278f945816147d79d620ea89d65a470aaa8a2bc188680ff216141068548493e493fd9d7c902bab9a68b299803c6344b2fc7b1309e528faab26f4574d544d60a11ce5c99325ad7190581f9b907515d17f59594d4561164888fe4cf439cf78aa78e8a5a0304f150fb5d6eec8b01f7de09d542f6222c4e697709800813c679815f264ee6911dd649e2138473a586589b0777273fd48031c234b3c812d5090d638323016a18f88bdf16b4893377e5d3342283bb4213efb2b5796101068a6358e129acaf24c652d0181668a80403320d0cc57d6120f39364252cd809cca941e3101c2a89a4f02f24c559ffc50886454d544e51f287f594aacab4986f927c9664256f53a645557114cc967ca72a2354e906be61a819a6810f5117203aa98b4c651e2e691d86189d6da149e61d591d638494c71f0e6917424adf2bae2c82001a3be438c2a1ea2a66018801236aaa890f4c30776c178569670a08dd6383f282928ec435486592129739baf2a3fe2ff080f484b807c08f436926fd06334364a8d42a3cc28324a8c02a3b4c6897951b00b261b85b07eeaca7804093280150ca06161812baec0010fc098825d30af2d244c3cb1466bed69a0352d5c3c50c6e6ab0743611e90fc5440200f617b68ad21318630b4d60413259a9228525a8341f3a2d3041badb5255db8a0c385cc94d6a801b446d39a9107614c554874a05469cd2b4a3a024a1590aa073909090948d5835a11ec8209f95f19a66489ce1333aecf2897dc79a2c411cf6bab52420073a0ae4c77340087d626cf041285284f857140f253b9f1ebf20bb4d6a2681d0d0c6950f8acfa3540208422884183d64220faaca2a4ea2f0da23e596441998eccd080a304e6e6a74897b55f021080000420882037d945697d59f92fb791665ec4c45ab207180cbb86e4e08bf69811d8d7e8bf820a401095656137523523841351688d13c405933d5350d284e40b48ea68ad4d2e9200510515ad4dc1841d9e614cfeaf0c1b8155161d1d2644574757d15a6b1cfb21eb898d05fa204f0dd1a091f584b5c4ba9e033741f41133ad71a6eaa7585030279cdb5a9b4249665595bdfe933111e2412eec41236d85a46ae61ae55ccd5416855154a8215e8d8a3ca5b153197679f618c6a4354e85c29919a8b2a8cbaa4652e52090e71f372eca281085bd3af2d7281b6ded58fa641785a5caa52a6465d8285fd6758146983f76d00c0cf6d811d805e3d71b91a9ebabafa9699d216cd45454765978468279e90fedde80b00be6067b30cc45640849a335ce8facf28a0a5157c6282d8546d54b2e6121cc6d30cbc80a1682c441b384e69f80301008900779c680dc64d4e522fd4e2eebba88803cf322ad711c505351ad711a804d815d4c3cc0a1a65882e40b2c1a958a1ad550988cce8c8f66e11bb994511bbb60b4fe0cfbca737d467942d6b53df9459811f9a918a0b50eb48e1246aa1263b48cc2163e0f76bd08f49f4c651ffa64d4e5562789345ae3302067e9064b54380b005d17916c8140334c84b4c651406b1c18982a5f23d3860c1b5a6b34d77f8d37c1bec69bc8e8a135ce105fe34d9208a235ce0164643a3260c86c914595d641e24647268a8c1219234ab8d641e2868c04641620d343a6215187d65a43620d304ca48966c246138d04e3211a29a6c618d139820d472ce108221c113a021ec199e68881028a898a2989dc42899028948451db8a428a645594873ed96b2a4a1f8942ca8bae24cc6da828a4bc6861a1e827760f1d8b86ad81ae8830b9505c0834fd1936f24f1522b707f7e646e1ab26e870fb701130445ac9f6c0031aaa12aa0a3a5509cce359c2e4c81327449cf0105962c60913284f3c9e499aa417697a9126d0537990476465179630cc45d80563c46cc23c416b5c0874c73bed959fc7e28657ef9d72cb6b31856fd74f8e82c50e38afddd45ed776c2685dff91699261a9c3ddf543ebb9bacd32e23658b7f3d30f75ac357bfc100b1b209d6e6d8e7a4659a3cc6bd810dffba49558caebb81a596a802ebe5d9d8bf5d649ed7fa6c9f3c299014b1aeedf39e9942f67cf72c28a858eec4e27743b5a7ffbec9ec28206e736ac386389efa3f6ea4f4d45612311cb199ceb9be5ddb23e96576b33d8eaf495f5457fda6577144b19ee9356e7f7bfd067ac1923c3be2f1fee09f1844fbffd99a60ca3409f511f1b4ff6356390f06247affd5ca58ed19d450c10febc745f19dd42e91e11963038bde7a6d46976fe50ff1c7767ea6aa56faf8edb9d6091e3e3cd0fb3a637ba7cb5fbc4915ddafb6cd6b83ab7d2c180dd3ded34bfbfadbf6d0d1c7562e8f43a3cafb32fe737268cb8caf874746c5dae5fc87a5bb8edbe2f3a6be17fa6090420f86b8459a03cc514d32462f142cd3a3ef5e9eeed97a174c3e6f7a4d4d1de4c7374cfd28597a5fd9f56ee2ae5e71df230c1c2850875bef535cdd437fdaf61d982dcf4baedd0a3eb6d9f6b23bf0b73a63a4e577774f7334ddbb22e2d44e726fe492995baca027ed05fe32a697d4f56bbfd4199050b1a5ff77a6bdecfc6fb8bd6a5bd36473773fc4c13be02c53afebe1a4fbbe3ddff1179624458ccb358214feccfc158af862f3b590548238dd0e38c3ad66ce91ad9453d7574afe77e271f60a1c2fce772ccb46a4b31b59b650af3c538e573aff57eb9650958a4e053e25c9ddfbf7acef851b0daeef7d1dd76b7bac42c5078126718e774677f5e4b3fd3122c4fa8786b77f7df576d7e6fa16051e3f5f36ced7671de8833fd10617182fbbbb3be53ef67eb743ec3d204ad9fe3ebfcf583145b2648d719d24bdfda2835d59f699aa60db02ce1bdce12fb677b278e8e3fd324f361510274d26d0973a498e2ece8679aa62909962464e9144f49e37df49d87080b12bed64adfa32fafa515d7cf342d89c11e730a34036314588e9021cdd6df9355bf19e37fa6c9084b1a5f617ce89e9dd84517ed679af65f415e6662a008588c609dd33bbebeff165e9a8b20f5855acbbcb3d5eec1f89a83050b112c8d774678a9dbd1524a3d37f82f2b7b42e483bc2c79311293552142050b1a10d3f92076d1b7fb7cff88d524444d530dcb1068c4b7be0ae3a45262bd59ceb01fe7a5fe4fedcdee5da689182bab8edc5c5062906011828df5e9eb24a4f9d2ea2c152c66e8391f3edff8c9bcb79d4178f4baa6ae4eec6fe79d6f5880605ffc77dbddaed03a941a60f981db6e5b8ca57578e9aed2088b0f6894cedec7f1e1ba35cd45587a609f8e2f63ad79469bad1ec2c203b7adfc68a97e3a08cb0e68d43466572dbdee9cad47b094011f5759e9ce4eb090416595aea9857a6318a1fe4cd35f2228311c6019c371bc305e7969c50f63aa83a95fee57e774a8a99c94450cfce0e3adb7c6975ee9560a4b0e5ede99e347292b95353a0e6cbdf7ea6775861a421b596ea05d4a28f7959e21dc30eaaa62b1c17d8ff63ecf95dac7d661555cc90b84efe691bc3c0e182c3570eaee62963afaa636eacf10161acc7b71a6cfe168af84fe2c33c8f745bc7ffe7d5be915b18481e7b476cead1f9481e78ced8b0ee69d6ba6f7c302867c3bc79730524be9ac8f2306cb175fa573927eccf06574c8e2c5b51a6328e76b9af1cb186189819df2056181019d92e505734a962e6a9cb2c69c6fb60ef77d178b0bb46f8db1aebb4e3a37bd9ffca22798a5050fbeb723a43ea796ef260b17785e08bf460d6774f8f5679a7cb06c81df75fdbca76fe8faba6761c13feafe6ed4d0be2a1d6559c15f0c5d7c96c2e76a84550b49a37348b79cfb52ec52088b0aaa96ce592cef962c2978326bfdaedeba33a652a3206a6bad843e7dfe671d594e50779e9fb55f08b34b99057c6f5a39fda9a3d741162ce8c3d78e7ea610c247efe708962b72c6b04a7fefe2b43bcb0db09880a50458cbfc5bbb85b63eec7f736597c50aff2ca995f1c107f1b39885045a6b5bb5acf3df0ccb08f0a58eca2df3f4f9e4869f69a2024b15573a4de7d5194f8965c57fc839425cf186f86bd6f0fd70f79b32d687a1dbfb27aeb2d2070ddd9dbff9a4d31947f899262bab282bab8e48b1c2070abfbe5beafe317e788a674aacec61634bef7dd7f9a51a43f999263dc0fc1abba5115bd7f2d6cf34dd5c594524ab3cbb134e56f250719d77d25daf9b36bf5e62050ff2d5082365e50ef1baf9b4de58c2eb78be2233311e58b1c33bce1eaf936fe7fc6a7c3264a50ebe2fb6fab3bb57422864850e92be7da7d3bf33bef0d24f9195393c9d19ba2befce2e4667e5e057bba35b3fcd0e6b5a3f23cc53adc401cfff77d967bc5b5638c45d9db4d577de763f7f4756def0aede4e359df84d993f7f26222b77e8b9a3bb9b42ab7185fa7ea6e9033f4d321f20f2c48a1beaf5eb7e6f7dee3c95e729acd851a77c305156ea98f83afdfee6ebf2a597a80d4fb7ad17bfb3114e9c7d9ad8701da4eef3a4504fb72bfe4c1308fb132b6b98fe627e763abab7fe193fd3e4b1767524fb252610c885d4aca8c1ddabe72b5fc29bb5bc9f696212f363ca083966aca4c1de8f3b6ff812ba67e7f9299ee921d3a48bacd0f168b5febae289e5bbdfcf344d13122b68782e73c5d5ebce4e3a7d9f699a262756ce00ed8def528b9d8b2ff1fd4c934c2847d1d53f89b2628618a9cdf9e1dbfa3d77ff50d324334d3757867dae6662ae3f324d30582943cc3e278655d7d7fafd7e64a6a9062b6480d7b94b2fa6577fbed085acabc834829531d0089f4e7927ceeed7b91874d573fe83d071cdbe6b18ec751ea75b39f7e709f3679a42230c8f304f4d9539364dd8122b73cc7cadbe0ee737277c357ea649e625bb94bcc4786e32678d1539a49df7e3737bd68c298c71d8fc1c5b0b1f7574cf8ac1206f7c304efd5ea76f5a57a78331a6aec0a121f63be1d5984aeadabe21f7fcd7b4e67b6fa67aae7c815e2fc4eb0686cfe1b696be95d0b9d7051aa7c37b3b3864850b755f8ba7763c3376f8cacf3489feb5cdca167c46fa3b53afdadf7efa334d426484bc4089c1aa5045a6699aa4586963befaf0dae950c76c33b0a285bf13bef7efcdeae6eb0965250b75babbf3d333ea8ddd692556b04037b5d63775cfd1877e251d2db1c24674bea7cc31eb2d259cf0334dd31413ca515ec25c8ab9ac508ec20963e50a105ffadeebdbf94f5f8dc97e09bd6285e7ae1fc539bfbbf1dd19a3c14a1560be6fad73dbc229f3db19acac111f8cbb5ab71553875b57234b880d56a830ddcd5e779d6fe2fb8e82b132857cb1d5757ff6f79b57a490a976d95db47053a7a9fe62250a0fca4ded7415ffd3fcdc0df65c9f65bfc46737413861ac4081422debab734f2cf57bc5322b7b94ac3c81c6bf3f37dceec2afef7d86aca841a9dd5b67b7efce38db1964c509fae7db181de25dafc4ef88952668e8f4ac74eb28df9d187fa6e9a92b7bb2c2843add762dadcd7a4aea6e09f0d11deb8cff6f3baab512e0bc927eac35c3c77ad624bc634aadb4f2298ed01d09d9cdfdf7b974f91f5bfa99260dac1c2146fd647dd06a9d35a6360d99affc9c63acd91dccdb086e5b77f7cd34babbf2becf34f9f59f9522541a1f4cbc32e68a73c4da513d5788b07d6ea71dcb67299594a2f1b29bf0cd572dfd9badfd4cd3939521389c69bcd6a7d7f83adb33eab3f92fad936a69e3bc51628aac08e1bde8efb59418badfaab11533a2f5acb3ebaa69dc74d7cf34c9ac04e1efa355fb8dd7c6286ff4746005084fee791d426d7d4e5d3daffce0dd52b8b5d31931aecef900575877be14ea77cfdb7e3cd324f399023d5972316932c54a0f2096be9fbe77c2fdeec653feb16932b2c20307e967872eed7bf749b983f7de9b7b46e92c95bad23270acd6cdd7f5ceea6e7f2a6a9a56c8f0196785cfcd2ae77bbe3ffac00f11b23286c33b570ce17ef79e3a5cd181c410634ce9cef221d6fe99a66992b9d9d4f54e34b12286add669f8e8ef08b1d3f4c53579714c5edc9217a7c40727052b39f85cefc30effc5b75ff7b582831ddfc7fa515b8ab5e37783bc9d53bbad630ab37e76c5062fd39bed7d9946e7dce7679a6e7e8a47e4218fc8954859a981fdecf2e69a9fc478cbc8c43c087b0d5668a0abcc136ea8a3c52ff59c417d9d2bdd5a4afb62966fad84615da5ff28a6554badadafc8605757dfbc97e2382bae5ba6caebea45c7780e56c0a8506aa739e62db39339bebc80402ee46526864813d3c40963e50bed764af72fe78e4eb59da618ce0b56bc783d31b4184b0c5f6f993fd3f4204dc9c8c43c481fa9984c1336c5b23eefc511f111235a89817eede4b6f7e9e92e524aadc0006f2bb79befd61ba37b5b8b951748baf59d366607f39b3a8f56bab03be37f3ae3fce28e9889cd8a0b32756eafb630bbd7d7ef334d98122b2db01346b8e37d9b1ddbff8f0c9498bbc2c59bf1c11459d9e2caf8565820afc590e20ba78bf9b353b2b202fb66fe1d6bb6f723f3950512324d5f59a01c65450bfa974e5da7741b5ffb5e5181c6efe6970fe2e726ae6464429f1d99269999981822d31463b392827fb1c22caf3f18a1d7e9a159418186eeeea731cc90ceabb7e7b23c367e7992c428b17282ebb3da4937feeabbc2c7bc8262250bfcd7a3d71ca3db5ab1fc4cd3cd954d93cc0cc8434fa669ae6041a9cb6badb5ee6d7ab7fd4c1396610ef2e477628994952bb2c5d7abd63ad6b8eb739f6a9a6492c4c484564c30b347b7563ff4877fa38082032b254062c58aaca99450e6fdb0d4b83a5f21418df97dde70c6f7eacffc99a69995113059a962dfe77ead96575e9ff271fe8065b49ea1c4f8490aadf583fb7b1752b73b4af83efb20e3cd367af52a67def6f181ea7f89e77d36df0c61de83436b9ffb9c9b5a5cafd5837c9badbbd76187a1f69a87acadbbd445df8f07682b761e1f7db06e99dd123250a870eef07646591d5e7aa1844fea6a643976902e57683594ae5e373fc4a903bd5acbbffba1abd1a9140e1ddc62dfd34d981fd64af31c6676d8ed0be7631c71a57288d0494d657d4fc6aaab1b89e260718cd6d9975d7cf7550787bdbfbea8abbf8c70bfbf21bf78a994d342fcfb3ebdc3c1e7a87d30c3fc4e29fc4c931bdcdbbb62e934ddda59e81c3b6c8e534e4a9fb351ce7beb70bf69cceeebc315ebf7da60ef475cadccef5f760e1bac75774b2d29f6e72ec38ac98bae28242f2f4d627e04720f70d66063d48ff5bdd46d2c9f7fa60986a386fcaabdf473cdf2fe85f7334da1cf8ec4589c344c091d3febf14d2ba9cf2e3874e4fd72c532e229f79410a321bed3eae696d8bd3c27fee19cbc380df8f050c139437cf16f8572db17238e6e031c33cced383ea7535a772f96d3c4e182538608dfed792dcd33eb1d7f89740419e8ad6e575b5dfc5ca7d728a0401163843386275d8d783f77317c743a67ebb6da2baffeea411e219c3050bf535ebf38bf87f7df1c75ca7cf57e3b6d96ff7268aff8a9f5e92e7e74db389ebf4d65c51bca5ca5a4608078be175d8e15672ba98643ea87fb52475d75f2baf7c6acd1a5df482bd6efe517acf498e7b31b66275d5e2f582dedbcd6d6b7a9ddee46ac703f3befdbb2eafb601720dcb7eeedfeded72a2917a07d1046d37967a54ec7ab7f7bbd3e0ace16b0e3aaf1746aa7fb5a731b7bc71bb3751a5a1c2d955ad8394a68a5c5f662a7fb6661d60761b2c6133fa969aeb4dee71f281c2c40079f950eafe767a58d6c049ea7ae8c080f33ee849fe55be8ee438a7110aeb49766f7248c18677d599eaf285045f10082bdd2423cadae2fce1ba37e2b7b1e3f80d2ca19e39555ebb8dd6512e3837c2b96f7e1abe9b5d95d1e3db814c3a8e1c5af5e47dde34176d5ebd3f5420d1f5e56457988f0d8019dd255adfd778ef2ce4ff6894719d95fcf08b79bdb4277fb73f3483e981b79e1ec80071958c65b9de76aa7bc133e1e6358a76faed9513a79e8003a8e39c2baa5d63cc478704b39f3ce55be3de5cd41ce786bed0fc3ed4e7e96c20307383f38a3d4db5fc70b77141e37c8b73afd31de683d637f36905ae2ac1fee99ed8bd23ee15183bda79c514f3a27a4d04d273c68309d93f4d9979f8bcf1d42e13103fa74adb73a5b9ff58ba5c7f3d945d8cd4f913cc2c874eb2d67a5d5eb8dd66623254c78c8e0baf7f0a5553f963112c3030cfd113aced4ed79f7c67886c71759bf4add61fa327caff3e3d19583dca3ab1789aa8b8717f7dd1b1f62e851d7eaf5334d324f96f08801761fad9452ee882db61a0670c24cb1c3d5461af30be095915677e9bb525edc85954e5e273794dbd65add059b5e5ca947286b9dee640b667638c39a21adf6de9a677870a1ad833e259ef1ca18dde680c716ef1eeefbe87c3c71cd4f033c586025a570cfdfeea2a3d819e1b1029b2fb6f6baab91d6578487162f6edf583a84596fec94870aea947b5ffcde5dc5f3e30d78a420ee7b658c70ef5a7d3efdf04041bceffad3fbd69c337e7984c709b4bd59be8d4fc648ed8c4bf0c8e23ec791ce6a9de3f7741f79e181854bace93ffb3747aa297c3caec86e66372bddb0cae79b521e2670bae6692fbd447894a03a1dff7dbf7bb0e2173fd3a4011e56bcdffbd29833d5ae21ac9f696ac28304d11f42fca88613cf8aef679abec06304f22bbd34db0d795441359477cb58e5b4383efd3c08fb83b0bbe1f207192ff58967d63146dfb25a52d1b8f821cf18b3e33ba5d63b53c1a50ff3d508a301173e38fc153b1d75760d9fc47ba82fdfe766843f85b8e8415a4c6fad1fad74335f3ae39207692bbcf8c967b38df6eac9050ff4b98b903e75b7d166cf2e77d8724a38b7ab0e5a8f78dbe13d496bce113a8edbdfadc39b5fe93b0aa7f45921a5c3ab34ce81cafc5ef5bc1fc4f0d5e801173944f73d1d7d2fdd53183f0ed051dff7238cfa217d0b07a778bbfb9c6fea09eb7b83c3d3553da39b176677ed1dda2d74391f94d4de5cdd00b18df2ce87fa5aaf31da91a7d459bbb332c7fb32acc3ee97dfe1ebf6967b43e7d2869d9f3ea7b93e77bc35fd307161c3b30efafbabd7659c114e1316d3c4650d70ce5ce3cc73fffcc7ee334d2e6ab8eee7d6b76e7ffad3a0adc4daef84f46599331d52dfec165f2c75d5756a232e68b8eeddbf5aa8e7b3bafa19ecbcd9d129e18df0550b5dcc80adfb7af584fa62fd544e934b1932d44f5f2b5d5b3765a664d8b53a489d8516d6b7378e21de8d3d667cddbdab2914837bb1be7d4831d42e561706f73457b99da57457ebe6921723319c2f5ce6d0f65d1d5f84543a0c3395e3ebfcb72d7cd0c69127cd96ba7d4c21a57082816a3721fe7aa57baeab4ee20287c4d5df7eadeeee9df3bf216b8cfef327a654528d5dbe805d6b386dbc187a61d2ebb0638f7a52af36bbb8016dcdeef694bfe73fe85d70335b9a1d4a87a3ad313ee1c20518f5b5704afb51c3979dcb16327412678f14ebe7b4db335cdad87266a8f1a6cee92c63ec818b163085d93d0a2fb413eeeb3e50b86481de077f423cddfe4c9313172c48bd3d6b9f2e66f7ee661736b6d72ba7b4f4e77ba7f7679ab4f62b38aa25f56cdf6fd6ff26154a0f71b10296db499ded9670e2cff4334da051a8ba5441e3aff3563737dcda25756518a8891a2ac8344d9347844d2e6b6427dfcd10d6edb3deaa91ccb850616637b775f8cdaa3d46f79926212e53a0fb7def8f5a6eb91f4f4ff59fcc639344898b14f2ac933ef8667e53564c43e01205e7a07c97ba8bb7f4195d8d0b14b0a5d61f94ce3a7d3ce537e0f20437f7c56fce075fdeb56e28157051a34ea85fd7ea11ce5ca30d322426c810fdd9454f6e1e091417274cea90fecb6ef5d5d9ca14b83441cb7c77f5b7a1a36f1d3341da7cedc5d445f92eb5db6509ceea5ae557ea2feb495d09d4a975ff5e3395966e9b845bef968e6298ab83d82b12deda2b6bcef542fbf2c223d408ddc73bf1e75d9d7569b8bfd54e8ae5c5d155a98d50a1dd7b6b2b65f678a52e02a4efb573ebb24ff7282682d7fa36e647ffa3537bd1706dad7697f10f416339ad76bf0e42ed7e86bb6ee25b679e7f2114c2cb6b77c46ee5cfa82934c3e98d33ad2fc70c33742833255ba0205bb804c1a3ce6fba3bb3d61fab0b101e8435420add8bd9cd4b3f1ecc675c7e50abbf18ffd2c7f7bd9b93b8f820bf88dda6146fb827cc4e042e3dd8ff76fabe7ea7d67f43e0c20348a35b9ae986743b78e367075b62cff5de48b5bb50d3cf3485fe894b195446c7b95aacdf77ac15042e64687ba19e133eed3c5bbfd6658c6c219c7b4e0937f6ec13e41711171dd447a18b18f251e89203e95cbe594398a3fbeaa411171cb87b523eecd49d7634da245c6e001fcd586a97a39cd9ceeb6283ed6e863846e933e788dfa50631da58a5bfa7adbe76bf0b0d1c74784f7df58c7f25de2e3398f7dfdafc51be3bbbab4b18db9d8c12e6f7f6ff7cd20b171940dfdbb9bf1b3b1ab50b1852622bdf733cb57e1a5e10c88570b270f9c2ee0d65953566f76f3febe285ab0e636bb594ee334d4c5c62406186fadd577774be272e30f85ca37c98ca3dad7bcfe4f2829a6dcd7447fcced999a54b17f85257afdb72becfef621717c0f9727c4a854b0bacf34b23cd194efd2412172edebee7249ed1fda5f9067bf4574d50e1b2458e2ee77ccf5919a23e180c9529a630e2c20287f55d755a4fc7d9cd9b8cf20b0ac865057fdd7d7baf7fbe1be7988d9454172d5cb5d95d38a1dc90fe7b9f69aa8a38171548e7649d70c6fc36ac764f934b0ae43f0baba6d0bfc63d6513970b0ab47df8d53cb3d4d5e53a5d4ef0fa45f8f07c072db42f1e71c9e246796f96f2d9e8aa3f75c1c2d98ce7db7ae3be11fa74b9a2ee28adbfc416ee7f54ba98c0ceec3ff19cd35a8d2f752981bbf1ebb4d8e3e3ab5d7fa64926261b85b096e262459e0fba87f7c1b71a4e4c02f7d3eba5515badef743a0279a9cf77925afd79ebe8528575d2f2876a1f8489a2c50ffef07d9c33acd442ec741fe0b4375e59b38eef520af9402f7511bbc56ed6a7ff1569d983dc715ee9dcd3bf9dc6d7488b1ee28df861945a47775f8c799038df9a6d767252afeef100b76fea70c36783b4dc01d74bf7ac7b5a774f62db628747dfa97650c75c079bb5833e5ffd2b718c960ed33e3c1fc6faa8a398ce3950683d56afcfde491f4239380db3db79ffac56d6ede200bfeaeb5fe9adf4da083963b4c0013a5ce973b7b3a5f3566f7903d5f0699aa3b67a472cf507b7dc41801637e02cb77b31c3edffeaa57658bb3a02b28464a0a50e7767cc3efd5559edbeb00d07686103025ad64061851abe0d35d6bfaffb4cd392163548a0250dffa276f6edaaa1bd6f573a7294136ebfaeafc7f95ea64078d4c42312f9344d530b1ace60438966ae9f72594f3091408b19648e16fa85f6d51d23d4d548e649d05206eb2aa4d9d53bb57612ab7e8a9535a1850c3062bde57d37ddab98e68fe77f7b3e1b894259cb18aa3fb75dfcb91f8deffd57140e59799a9eb488c1551ac33047bef7dd4ab7a5d139ceaa10913097a64984c5e81639b03872d49a4e27379675d7bbf353916901038e0fb3dbd41fc259dff67080d002c7fde79e1f3bc670ffd337e67527b36be928ae51ba2f54ecf28631cb7ab7fdbc5bbc10b786b8de2c1ddd71cb1637de7eb8659c59ee19b374564b17b800339dcf3aed6285efb56c6147aced7badf8379cd3b23e208d8296361cd0a2052de37ced22ccf7c90de54d4655167593513c68c9c2a497ce5d25d433de77186bc142dd71d6eb2cdd5b57f7f7334d56b4b07105ba65acf9fd3aaeaf9fb402de913a9c0f7fae42a7650d6d7fef3be38b9bee9df5679a4ad0420504b44c41ef6b7f4ee7d22b86324c84bc6020d0cccb6535f1f2f212f354a811b44841d607a340dda5737452f876ffc5505aa0209d52fb523ef63babcd2f315eb43c614ab640d8002d6af8add4e1f8e2fde9d7eacf344d934539a1a5095a42ec36eb4be794dad9cf901626c4fa78d7fdd2c9591de325cc0c5f53abed7e89a9a42d4ad078422ce3951fa9d43909bafebf93d7e9e89ef46f4182850ebb74ae429b1d4afd99a69623e8addfe17bebb454d2e96964a7d16df8b4d3f955285f8cc4287981e2a4c508b1c24c9dcd58c32dab5b7f23afad252d45f8499dd36f420d5da67b7b9468214274b7ea1b7f53baa4050d59e79d3a477b9fa658be96214848efcb57468b25854e63d17206ce2ebe7ddf4fdde2f8ae162154ec649e70feddaefa8c66380aa3c61f7dfe76f5fd679a5a82b0f19417df4cdfd59ea56e0182a5737adef152a82b8e2f89961f646cb38bd3e5d64fce5c7d00639d77d76addaeb35a586509792982e4c5484c90214a626e5a7a80a7c7d79fb395bfb1bf91161edc67638d8ee29a75ceb8cabc3ca78c961d50baafddf7f34f28dd9d2168296347ea5caeb4c6379dfc4b46fe98f5bdf4de2bb33b37c643c7505ee9dab7bebe75e078ba095dc613ca7f7fc5d09e5d7e387ea536d7785b72e053eb8925b50ecef9317a6eaeece691bc9ca00507ffe27bf9ed96155a0ae70dead4175a17f1add669ed36900fabbd5abf96f641f99f69b2f0b5d4e065cd12ee5aa5e7f9b26ba141a5b5650694d69630fcd617b3bbbf39bec55606345f7b9d7690de0927f61630a276d6da97b1a4544bf72d5fe018f7cedb23f547337e2d5e54f8fea0a3d739fa30a5a29618c4bf9eeb9cf0dd77f2de13b4c0003a3c2bdef3e98c936a90b53d375756e4e5488cc895805a5e40299d9962eb24953f9fc42d5d5cfc0feb1d2dd6b86a88448b0baab315ce99e9cb0ab7b7b4803a5de3c7ac637cd85dfc4cd3a53d2d5ce44b7fbba5785becf789281b4fcb1654e318ffe17bb6d8459baffe92a28505b3ca7f0fe62a21c63877a06505fe5e47fd56521bdfbe2d5abcbbee3143a7ef2abc574a8b0ae05bf8ee13e3fa2f4e376a4981d3d8f1d319bb4cf5d5b50505b4beb91fdc51bec30fe69613bc7efb6fee8df7f63c7316b5e68fd09f46e7cfe5d782c5c61b42baedbc507b7d167585bdfeaadb1e23f677756cd2628209ef8518eb79a17657bbcf2aafc95a4ae01ec67ded76fb94b458f1a2dcd24e9b67bdd4c978b590405ad7f9fa75edf1ebd39822d3547d963968c7542d23888e757552c34877d6ceb654b11dcbf8a2d3f81eddb47e80e50f3446e7e6c393c689a37c7ea0364b1c31a5526248a5637da834cf97b1ee296daef93dc6870cfde9a6f4f57ef24dc72c963dec3ba97498bebfff5bb1e8e1e19ddd3d966fd61d750581a82979f08bb1fb8735deb5e2bf789077c239eb7d3a4b083d56e6b182e50e8e9f8b153a3ce78b5f59ec8027b533ba2de3de595efb99a6cac645581ddee56b9ce76fecded5cb428707ddbe55e2a831bd9ada396007addc917e761f3aa16503e5a7382848122a58e410e7a5b9da5a5d57af367b6458e220efa5b5e2fcd405050a0b1c3c3be95b3aeb32bd6fe91bb6d3b5e6fb767c8cb1769f6ca42408cb1d9edf740c3f9eb0a8e430c7978112c5280862082184538f060023110020302c2291070432d174cead2914800359885482464a168823d228c66114034114638c31841864903108215658015271d852fd8f5cdb18825a249c7da9c2d644c4a0a28955bf33b758e07eb5216765afd03258bb968ab37d6062bd11e28472a706902ca47ab247c5fb4e322e12038e11e2763743a4176026b24a7e01b87a3d5df618e07461e946487363bec3c0b3a32f91319e712edb88c5414a70bc9e2220c8e6f9ce4fc1f9c31fa940365cc77a199c5f4e1cb9ab907a87a6df849d6cc2d0b2f7224464a6aa11ad6f04600c048200b4f32f2820f170d1d624b24663d2cff411de63346f70516ea118f6a81041ee9ef2e17a544b54c102df55a09955812bddc7498e34a1de8f903ab689543acf4b4325151cedb354b00f8e5f92b05dd35e6665644df3bf0de1471164e472e185254af5e76941191f4267f7921d3d78f7b594985c6752e37a537a17ae578c385541a10bc6486c5f5e8a8ca4bda4ed533a07e98b37cef8708ffb9139d7e25cfed5e62d078444590c4ac76264fa3091931df9fbf1b1b7fdb9e56c64214f93fd888be8d25e88a3d42bdddee868e2a3911d732e41b058338403f45add53593d465e70faf330a2667de34b476a66842a480b02de7a90450a71a12e2a76082bef787c0c030ec26d58c4fdf735d7fc37a1bbb3749fc819d49d0e9f9b817031640974f6465565f37d817e01c23af57a023ad2a066b0f0a0391567b80b1e4c7d669342fe7fe3bf5fa730787d711bf081e9bf9dd8319bd89be53dabfe6e708a2a6d96fe4c379027b07088669088c3a2e8c7e63fa84b0dcf8cc0e6493782543ecd7c1c355eec13fc82e188c7789720f6cd9e8e36209a203c12d9801cc500e66a6e4e8afda447df66baf3073e9a7ff5c50af0258b58f3a002bead528225e99e14c46a6f5bc1a5de5a367eb62ec03764f8ad8453b7ad8dd99ff2e107321adebbd8cfca0757b47a0fb6e40676224cabfc1fdecc7d0bcc0d920ea5ccd2aa69b60b8cbdd41791e6652580d70c7f986f4dd0ff23c9c09b96c7c4532bb6c3a86fbba1722938e55ab209be4494625a0ab325080e253aacb61d90603a570a47f1467bb08c2fc1e5dbecff0c465911390d6b3809245c2bc6132d9c4da781854d6c3b14c2e8387eb09a9bf1332b0bcc006adac572ec56a00972899f2dd29208e0e8e61be0b320deb2ed01a8b8609771662de9009deedc3ecce12beabfe4c051768f293a69a7298392d8338cf7e446902313344dfd07a3c300e666b03cf193a0f60f3c1d60e788fdaca5680dc79f61a851c9fb3b3f9850d72364e43f802fb0752d7600651a5788e09ce5328ee5d1b03beafe65737556207847aa48f18b4cd44237cd5a3ee29a1bea34a3e611d77fa5b38c0278546c951922ad4005f6e0b4c98650a943d66b6a9cdfd74ddb03b0c37eff570c8bd33a2c3c17a65461818d48d0caeeffc2b5d8b2a0c859b3d3335a0ecbebfaa7d8a7a9b339a6a349a1d4f0aa908d30718b6b1432486418bb8c4a183b276fc72494c07e4de0cd2afbb4b5972d4c6a68632c2abb8ffbc80883a2fa31ad130bb17736d7857f0f7f325179a49e7f39de8f91def8f61c0b3faf6298c4ce565a87825d519912f0f97fb2629c22850f8cd9543d8f521c205601a4987a6776ffab694858f2759a6ddeb2b13ecabb26b2d5487dc1a572de07c918854b2502044caf1810b62378048c30b81ed5312ec1c8362977f2596716222668e4bb70676ea99c51a7d5bcb50dac3a72d03726cf293da2a622de702356086691c3e18d4b1228ada8bb8ce0c38959cc59296ac24631c748b3763f3308d70af0d2e87a1540d1a00ab5bdc4111be81146156defa07003b740d2bee87f8bb18f804cfffa55321ec608c9fb783f851829e5622424f9bfbaf575418a99740987be4b3214f22486ba519a018add4761d38a31f7b31d1474a51f069dd1ed47b7c3af0e406ab59f289901ebb861c4b6810286292b083fb78716dbf02e82611fbf17ce4dc151ccca3292534dd53f8e28ddaecfe5475af829d95b4bd395a7a8370b39678dac7161969b6b5edd0ba8a0762b75ba5c65dc6c9f76bbc53beea9ea0fd8f586516a4463c20a65cdeea2a5bb00584b83bd337ebffb029496085a9c433b7dfe100be23c2e5b7326bf3035050bcf93973eccda6cc98fb12103364f3b6de3236e033dbdbce1ddad14418d0cf4e9f37834a2b28330761cd17845835b8709fbffeea3c4000e8a996cfa2d673e17769d6f0e9e30dd81e452dc5c0c54e0d05fabfc271a5e2b71e4dfe41f04f1bd6c81e50b0d6419398a01a36cb0cea0b5b1f7ecf259bfe4bfe34238039b816fb4dbcde4f16f6b1c88cf0dc16debd0cb40a90414e30bf5fa92c62e9d666ae3ac3e871fb8c427c8c3330b9e9ac6417472f78034fdd8459f7a76c2e19807b286039f0ee276f85b3894cb73ee72cb8c247a19193e775b1b8b5254326fb841197f2ad537847aa35b6bbfd4acd1c63a761529945f5d0a66a55974f92034975143cc6d3d5b926fcaed0c166bf92ed6eee9cb3afd270091759d933627958c751cd63988c92ad883e55ba03f44d48e0ba47b1458470442d98495281e7c40089d26ebb159ba03d6f6ce556cbc5b9d1eb7df7d66d1ddc4277795bd10c0e634ba031a9c8fe95ad3df042aa7bf5b2a604294420b92d7a8f10a6d57f37639d5dac07e86349dc8876739052d3084a9276d94a559b34bfcc80584c1b8842b31b63bb618f549cc72bfb79f60889edd4b3c82bdf967d781b8a01d62a8839f723e68f4cc20070a2814bb45aa913aade9ae21168f9511d2dc1f9e4cd873863b4b8b10a34e8fc0e27b39d0e235033bd499cf1b1f72d00436bd15126cd773b53ae38cbbed640a0a578a75fb0ea88fe02200c02bd9daed02bcb3b690f85bebdef821162d47d3da58c0b2175a5cd15c4f944b849d2a9364c9aa90b43c18a6d3f6f28d9f15856352ca008578e7efa626a601035229d3f3e767bd397a160378a098c6f64a14009920494faf6f7892d336a0b79a16cfa96e862802da77cd18b37a877b9f103c18beed8317d1f8333acd5ba51ae0d25a279bcf47b648f6bcd245e19df2075d72a78c26b4cda656fd40ac03c8c3420a2b56c887336313b61138014ad4b92275495e76822b9457cf7414179ad960aa317d63a8f8724db19626ee1f151aa048cf40f0ab98d490070fcc441dd289cdc02d39bf2d881739170970cfb5a1ce8af261336da875e0acfa86039ddee1ff6bb477fbd8c09f9b937f6e6ccf3bac625c9177a4feebce9c2f56447e584238b2cdc456f06cd8cbf3fd5737c0a2f73c300a79a6f8e5b90ad669910a41a5e071c2946e0d50bf1de0dc4966b65d2df28ddf0c53491263802d220577eb39a5002722b22aa635fbaa521103c0561b531a50a8e32ca19a0ce2a94b8d2eda450f97c019c023ada1c5c95883a824ac8f3a9b7dc6fe5e274cbe46e54de7a369d66a6252c271cd54e0616283daa7e564e39a097a6b01f15dee18f43dd6c3462844a8a3dc1fa19e41a5b34f4bfb70ec2abfba3164d55f0191f703e7a4f3de15a2262b82b09af28d4604992155209d2abbec962b7eb96e99a8265e9eb6f7b5531ed33a2d02fdc102fb2c49685ad2de64c885f74c065faf78a5c07521f7441dc423d0b1e7aef528adc0a4c4e5df161d714139f44ca3039763c2fb23733c785e431775d11f86083b932f30dd3ebdf0d02aa8896bc5a19cc97274bb627a188a13069c0014b381069b29570c2ae1b2d07b0290e2cbf20333ef49988e242d7c0fc78061d569cb905e5c760c27759fc2d9a38c49ea68c2bb10f7c11d0e8770c38a0f7b05e84e7cc9caa315c3d1b5f84156455ceb2ebe8e3e23ac9e0e5a687b40171c582b1a4d9d0b611916654961190a3277ed3fd118384cd04358501a411045f35f4a4c53af2deadf985cdd80020af61520e335979b952d2541dc5c5314c1b46c03bf388de2e99507835138bc9f360d3b8764f26d3de69250b95337154cae27e485e991b6e1474e71b44a39c78485530a110b31d0466387413225f64a34f3a528b1541212d8aaf3a11ad76ceba18c51bb64d5826914561851e9455ffda5372b672a582c1ae390e0c265ade75ea435d72a3956eddd23746e8a4cc57a1c9af4f8538dbdf881180c3ef45b52df251197d4aa27f4c8781c31ae8762eb85fa73df961b5a4b9b5b450d073113b479b0de26426e35b080b80d85cc962c3a52f99c496867fb7a4c042c1f917c1b2e29dce654b0c5466cadbb556331d5f97a6a342fc63563e936c7a55a5ba3b0c1af7ba4ba55224a489b8e9a6e43a206b5115435a0469405caad0d2c772d9fe1e375fdc7dd9d6071df53480b2d9ecbc2d1047f8b5d1eff42d74c071ba463d0856b37ab8d885866c826cdebfd72618c885e13b2b1dc20d6472e3b234fd802c431949f8beeac3a5d2d00f75df632e980b22c5403c08d231e2a764299f2f16eb0fdb039cb28f9105325a6a3af6e6f9554f0d393c34a4bd38a0353c65cfeef4dc746b596af435dfbddd19c9cfb9cff3474fd423034efb5ce515a209c63cc044e6f875c08a0a867abd354969ae93d3dfd4fecd309afdfb7aaa870d4268875f12a8836b08a8605fa2bd262d0793be20ba0d84575fd427a47158a2c1776e27eaaef24c1583614afa197d7c07dcdcaaea8402865d34db8826e01244f6cb9f87a91e890703f985145b0a8573a1bee4a1d02b2e49e78607ef1fb5294229f3881edf906860b9a00d730a5cf527f28cd462537e751fb71f7b12a1186e9ee46323304e0e59b1079cdd9babe190fd256a34220147a1de9c01948014a7a8615e46e8b659ab9db5600ddbfde0d4d435e882677a81a2539688c51ed5974460835849219cf756916c0f07c21c931a7b9717bbee31f03576fd0d54ef8af63c71b99bd55de66093cc54521ad236730777059b39b6af10a28fb153cb6fe510097400cb4e3d2cbda1bc9b30ba3f2b75dd4b1e6cbb8d3b1c5b94d21948069a7d07a991281ad3f2f74c703ebfcaa43a12b89db7af3491ab01120fda86efb69f6a182c7e3565ea4a8ac5109407038a4fa2da2ffb8c419af5203fa74810384550309e24569b3f7500672eb87c4ad6b4292d53e5d18fb00267f9a258719436f69c9c6a1b7ec7a659b014f787f66903a58573f83447e219d8311bb8eea143218bdd10062e220490fef93473f4a6466df3136295ff9ecfeddd6f4b81c9f81de51480badedb2be55410ffd932946c3ec0cf36e97bd7c79ea7a0ecd572678ef0d15a401ebc097599432f936e5008bfeea9fea5695316e612e579365d966e4096a4d09264164f69c72972e8de09d48be479cf64fa08df13cf2d79452aaea2e43362a45a4228391efd06568858180e89c354d492b360c73772e6fb743d3c79bcb378083b8687adcbcf1e52bda617ddc08358b4ec392d917aa1f7ec683349af8f2b90575bd1048a9a85d62c85cf0952af592d21d1e49481d1cf194dd44d492ae2075615e7e164ea2970bc82360b556806492916f9702ecac82290c55fe51fd5b2f0f05929b74bdbf2bef396ae4664e52b56a16323e7b3e3306f83487673a069f3eb3f0687c80328d2d5a178082f20f104172e1957009eb31f0cac96de3d97a7c9421326ddd4da4851ca61439c3930c523d7123d1d246ba97ae1364b46883f698f833b168254cad7fca32d5046007e0fc98e342c52bac4cd94b2a8cb45484a3b2b3bbe188256755d2c17194629dbbd06912483dce73d4d1b2170194da0174e494fed534ab96e00fad8ee0b695b0b26ec2f43413ac2395088c419ee366cee7f87b596a5fb0b95efdc61a14b289856d8dfc333dc5c2f22b751c7fc25baa1d66fa8680c5a7cc359f59ba03e09016bdd3fdea7f0bbb9568a4487291430e96619cc9a8686be9d0493b5d534b5de3df8453624568b2b45645a2dc6ff8014a1bfc650c40d1b212172330b16850601035283bdcb8f03f4420659c7fb5533e458498dedf8114f6ea2b3e36be28d07b3f948a8f49b7c9120b56ece853a9f9f6f2ed82b29bcd9d3a94bced4581b3e8c257e159c22d95d7df7b48dcb932d9f9878898db8dcf88d9c087d1780e7b46f5fe9b43f48ca236125bc6e08f9ba64b69344190612b53a84b2a11ba15736f1f25480916e5641f632ad002d5124b4bd780dddb291f96e22b2b33a4f547de4b2eeee6eee573646f6bb8a567fe0b37509e82f735e666d94e942e62b3fd2a6944ec89e171224482b915a91f3b54054a2adcd408c00d66b41778aa297a6615d7a3f661265b035f19417116e2d0842a1b4ae99b5796ca23d9e2814bd7e6feb4d72f1a47f471cd57804675f0eb0b20e12eb1bdfe1c647c70175fa448a0560b4a17932342588e3253440816037696712b66865bab0afd171abe368c0d02a9171e5ad3bd895d78451f3aedc9811c6f6014cc6832f12e45a945d885d9e67509b4f3a7bf1dc1b18f892207b752b9b7b6e170c1fc75d06589245df45f8f190148255815b6d56d331e92f9807bf6a917cc75d903a3f6cbaaccb95292b53a318e2eb0e5bfca2b0d67eb1d30145009fd6c792f176b8bee444904610e6b42a5103a6ff4818d179f67222e8f3cc4ce81dab8c6a7a81bc7b5b20c4c8339c684aea0d2d5132c51da79efdd36eb9e5dbb0e0260e64c8a87e60b80371d4ba5073ae4263f15f669ae659cbae7019f7ed3b58222787eb73c4d24798bcaa62af38fa1f89f7a1a509caa18eaa7429145b735862ba697b312d675ef84c91c4646955f139fb68fecc5aea00b0758096678b4c10d2d816b68a38e8370c2386faa8a07c8c0259995e6e101b5322a783944ef113b848e395fce916960601c41ad7f62b94a3d5c9d086c8c4e29ba4782c11314568ed1af56c64297f5333245f058ff960677fd4ad672193b2f1e6aee3116c44be95abaab085916d2a5b2c5e56570aece69ade63397cb857a2260d6e344245ff7bd804145ba08a13e4226da89dcd4c0417bf1d0b83d66bc91cc76fb753c9dedf50a53f97d77c8351c7ef9fa876ab13a0aa37ee0dcd2a55f7b9a138bcbc70c1573a2b00af4a34269414626f80a222c6bc21ba05f2bfcf97a35dc74da9aa2c36b11f8e036e1392ad2dd74b724e9e68b9cb566f5362515c31461a547b63d6374beafb4bb5621892fad55373bd6a8a7a209d27a5879e31a208b1fc707a9af0cd957144850317734e2b633707e8e100bc5fa2e976e99bf4776a7887d4026fbc871773809666482240ed4598cc7f4a122f09c59958f598e212755b41dffa4f613b8c9605a1e4e927272797f727369195a7f764cd430f35051d5eb3c2a729552259166e1885a877d9c8b25875d0072ad3c25c14d08eb9ae3045f666e0ff0249eedd9d8ff4959f9345ba99918bafa8666a35f5062e60c993d2a5131568415f8649cf86f039dfafaf4c189101ed3525f0003c064eff94e42422882124f7481057e7cfe8744447ebfae088cc45db8eae322f87fbc9c7d4c7c4900c1bec8d02790e6e9a4c273f7ed00c0d4a5ac1c3dea663b0577e5725d4cb481eef014c3cabccd27deea069d865c3d6a090b2a8703ed712c4f352308493c57811263707734d274669f89a6a994ad58069a75b690ae8eb780c26e3c03cafd9bc59e0820d6c912c298989c51a5a9928d1a34effa694846841ef3e522a34608920c104e23655e303a5e156366a1887e37bb89411faa108f361192a1d5cca1e12a20da62c425aa8fefecbc98830afbef044fd6c58f0ee232431c28907710664bf0e3eb413c34a369878c9136b7f799d7117861cbad136e3230bd7e5388194d73801435072b83880da40df8fdc3b2c7f8580e90c625fef538c307d5150509c75d387c1bdceb9e3b59ff496f28bdedebdb9cd824ccdfc700eb00290c89385e2e1cc18fdd87d5568e32e3db0931a2dceaa2980bbbd74473dfe33d3b09010d6cc4f8638e22350a613b1fa94164a1081e6637a64cb30b8d78784dfc0aaf353712860d376efcc30108742b50e2364e5fca5230824539c6ed5344c48651250a427eaf4aa85edda3ce35a940d94806ce402f72c18e3e65b23701d18bfe45de13cc4294dc86f0d1196e930c953a9979f4956d62a7ee5e45bbbd837ede7d15e2d07e87c667a7459246ab6c6824ff4e5a44d7eccf2c172ee669647188ae788c4918d23d24b4db41b7e0f0b7d11d94e57aad85cf5ea84c59b8082c1f3b20d51bac9799f6b85d6475de715d81d580e2472bdf7b707d710816b8bed267c95d6931e6bf82091ed30b3fe866c68a0736f1164d98b7d3704ef0d2e9aada444f78f43f89ad5006d4108c5671ce0b7def1aafcd8c1a650c04bed4418bd488e079d720024ea6aab98047efca642cb1feb244293333307b359077ad1bef288fae70d79da99eb4e291d0bce2061c98a26f70c97334690a2d31f28466e3ff880f185b3e3df14db2a51f72e1ed24556aca3a1f3b32d5648b3c0a9b34ca52a0137a284e5edc42f02147dfeea68dcf62a7ef2942acc5aa7c1eae9c88368a8e3578f2d4cc2973e9154cdde8919d735254bbcbc53dceec3c97092145fb59ccb384f646ff7d7e32890a5006e0bde96cbd6bfc9ea88f07addab05c68ee90abb14a1c9cc7c4baa7474c14905b062687b580f08d08a7543a4f1a40106b3b22eecc3b4a1c4ce902eb1afcedf4012d221ea34633aea2ebdf3dcbe8dd840cd49ffeafc38874f3d45bee45f009b5ed1394b879554bd94c36f90061e47a246e9520662f45d09cebc46750ac900332839344b6ffc8adc5afc20fb9323586ee22aaeff8ec931c954d1223359e326f14e8e0f4dacb8460bd8682780eb7a0f7d4f74dc53ff3b1c7e258e58edd4db6df29361f1280140f4bdc9f4648e5398256877412a5668f730acf79791d11d11b07623de8b0c7cc8c9db5f33ea94f0994f1a8d0d2a52c0608e0bff66baa91111e754c1d0083cf44b99cdbd3e0c853b1959c72fa137e5418ffefc767bbc5f1fbafe0a6a061ab8e9c83e711736c4113aa8c049099265415bc9373a74058f84f9b8d5dc3e85e92633443af6912abd890078c3f4e8d44b98c7a48f73c3f406b92636e16ae52992634c663b6088634a9fdecd8186fe24b4ffdadc9186ce7ab26443d9401a59a3ef1fed885561612a6fe8215d957d05c9d4c83804562b386c33839ac62ea4d1ee27922451e522bfee81e5236d0686501a7a5e978a49365939e9c25a2d1b6f4edf272131e7d3a13dc96094b2c44cb1c627527a73ac68e053c71225d0daf3f5672e5eab4354a41ea4890035109f0c382d28b0b78d05c43f360b485617262423b5eb43640377161e6cf71db5f454639aebc021a3d0e3956248c12096b45918e143c8f803a1b5198b4d45142969e8c9f3ab2b095c346870fae99dd70c237479c12b482674f526942e32f8bf9c11eb983a6cbdda7737a5f15653fc6255c559733dd8ab2440de0929af942a38c01c261e8967d39679370df163853d79bafab2b74061a28a48c1adefdeacb48c763bc955df734ee45c875f71b0c39f8eaf072332f131e35877ea3ccf40bb20d09ec3ef1041514d0e2128fc9df35f63523cb4e9db6db064f6100d94339a93cf0f5d9fd67cce934a0f6ddef0456fbc9e2c6e6e8635c0db5aa7601e4f46e4864d1b6aa6b438d211c80a77a50a8f75aa41a42e9603639041987850717110cdf7ef0c56ede93ee444447c692f3840f77e814475e707ab25133d11820a71c783cc679217cde58f11bab413459325a41d147038b9c2a8d1e6bb07c63cb710b8a5945ad8372e8445e05352da5a7289bbf749e10db6a821f1ed17ef50da9fc110469786f1ec42aed12ab7d4055ffb9b740f96786874506cfe6cca4127d67e0745f04303db87dd05eaf3579a2bb846000cd53df45aa46820237ea10c372a71497769ef1439770815efb22c98abe53fc7790ae0309b437da44b0074f47446a1c31e4c6b2b0b53865cce31c5ce692722b578a99c83aca663c19bae3354dc3e0e646488dd9d79cb8ed49c31cc51f30133886a23de1b36db6ed903cb672637b8ff7ac44c1316e0f2533acb7c78da1713df1411550e154194ff5b9a1f9dd02192d4c54e359c9e20327d6185234179cf7be2945de302244917535c231847ce6ce3534bfc3b2f5c3b1c25eb49d7735753855eb6ba4cf77279d8349b58411359a597bb688154a711c1427afcba6584d43448b810d033e69fe9fca0b0f4a25c2e259998a0f5ddf971aa1340161760949af3161da3bffa9e2f2074baa88e2c31994240d4fb1c16a073f3333852072fdbd6174cef0df7e00dc02368bd0132167cdad2d970a355cd00ba2509fae6a3e895162094a6c87d1e0263b27e11d742aec51ca3d24b412008b5db5c305bf337d1384d2a996d55239b5bc1398cca4e030dd4721b45e510d95fa72defea9857eed6c9bc94f28437ebf20902d04b6c7460822849c1d01a2d2f1668794a901aaa60a92f503183079f8af0b5b9251b4ed74ce2b104691d891b064e943ece418b513225866ede2f84ee57949ba0e74ce7638f1938f78522657d0acbf4223b48ec74649d1a1c9f5035d178f6fbaba9de4e5d411b96b785d310c543c52595c865bb5b047374669773353b364da05da834048433e3a642ee09b6b4f993196354fd17fad8e80e4e5bef63f0b9a948b0c99a02b85b883c104397b966cb10836ed71ddb2ad417274df520246a2214092e81682d7c41be829ff276b76c812351e131d3d30bb5fbebfc2944b521b5273e9c17f5000246f3a740218ae7fbb51ec5e7967410f0370fe77eb59fa5145c2d29dc37aad3dd8fe3faedf0856fd9a6ea815f50481bf8452f2ecbc8f20d81c843eca53fb463e935840ecd83ebe2400d5862ee85e46881c188ab2f66a38a0bb5d84f195e20d8f341820d7822852f62302502a07f34f956da013ab86c6b28aff31543256d82ba351de702eed61b67727712efd3727c0c1eb608bb802d7d7a28d2269cd7cc3712e9d5341af0a10691d03837797f5430f271a849c33353524755c5cfa9c12b43a67010b55d3beef214e508bd157dd2129422582a55d51d475d47c259d4b77929c9c926845bf7903cf46c0a5fce344f33ffd2d56d8f03d503c9a73e92f2f762ebd9ec648a9f7eeffbde984f384ef155287b8bc5ee89f3b8f266b5c867ffb05cd2ce67c77d72ec7c31a5de4b2b580cebb1330d4c192b75db6cf3158a10f20bde986570976cffc3d9bb805e4ea3cdb2f3b1cce59f3680d0b9bd56d07e91f3420b1a46f5cd03df57791aec25758a080243dbf12027d7ec1f3f48cf5fb383c85074eb05ef250d83e486bc2e876a9a20db890a53fc92edf12225b2f435278118c295accd40df7db502392b9627a27b4ad9f075bd43a4a1d8ea9e085c8252ec7bd1e847d2361f33c8a4e793bd959eca8e86312c4ec09246c16cfd24061de3fa71abb6d725941f53d9e95ae50bbd1074f3eb60df802cfffbbfaf0895ce2904304700ad7acbfd927bf578e409dcfe6fe09a061657e9e8b4efa362e89c8d33155bc4a8e0afb7855ac7da70aeaae4ed420f25acc434ee220f8a8aab0828e42619639a1bcdda3eb1d0ab81bcd4ffc30727271f31968898d65e2e0513a9a4fa83e7da0f13fc801beb2194b1861a370be0f0a9fb4c7974ea65a1cb330764290e3a53fe76713ba5836406c7ddda7624b028cc555d84e5ae1bc8c205466e4745298d1a3770324fa7504f880959ffc42ad579bbf6df472c412fd626823754315336ef99d56fbe8c2e6feb798937bd564e93561eaf904f633fc9bcc42923c827e3ac5c34bc67e8b1019c571ead34b2149edb7c148c2d03a65f31c051d74974da04487b60677c615de5103b833c069a468867a1cc7aa56607b007bedf71f481232e9720029168823d481254bfcb0b684904a41c91a939657c06489568b74c6e8494cfb6f739762cf4e7c375215a2e06b48cd2093b0d6e07f2c01f73da1bb786a74346ee3599494fb9b40dadb3967ffbdb4f24444ee447f3d05c1266c4234e14b66606aa5006dbf8524573e0f76986507e6b80081d2dbe791cdfa01a541509b338e2f86df9b717a74776b26bb6afe59766710a05ca2600f5ea612f6dbc1aa0e6c61a14e92441804cfe7dc4067ad0d1b6937f227e9e14dc6b8199e7c83ff2409fde1414e328f1c1a0210fc8d26916dbb5a2f3c2185070a3f3c9303bd70ef7a6a2bbacc652e98f63615678963dde51a0102ce854cdbb20b6051be55557eecca3ca0589e366590874830235b15c797ecc66f8e1ca7c742e105fb2ac7f852424b1186d7c3dbbdd2dd2f3fad6c8afbdbdf979078b5ddc3874198d44582997bda7b2406977afbaf1e6b9c2b3d6e302b8b037d5be456c838c967c6b9b9ec93f9a681d091a77443d5a17b11958a0605b781cd97ec3954375dc731181cabc7fc6384f1340f559605e0c60a55d8bb8430659c1cd68df11d1036915cab1a9e6d7453c4755ca2b44479a75493ac35c09890ce69bc3065b567ce157586956cd6973e3b8bf8fe3839dd1b3ebdbb7f49df296d1ba8de5744f58e6834b37a862b8cfc1bd94e4b955927b913e5283f256286194273f07cdc633372f3d227ace7e36385ad83127b66cf5477fd8010de5d1537b2bc34c5fac12b81411833af3cd812cbddbab0284b34acba2c342a1c430c1d385aaf4203a21abdd28774512e9b0230fa7e569e9f8eae33b6a96b9eec9e433a72e6718ed5377d9da89391ceb6d781e8ef85a54c2f5b02e6d9ae94fbbbd0c758cbe36b4bace85acf6921ff3980155cc36c21a4d5c1c1519dfc2666cf26caed26ff69c34c86bc4b670dd31c8617e72b157a3dcd81919ecd769352ffce37436cb55eb07ef972fbc86238e30cb032655203a39ea8f56e3eb78e256f0c87ecfa0e17f631ac7f325b33ed27039ed1d73b9ba0d378f64c31c149ec78e8e9f2a6bdd7d29ff439305f86eaf6c6fd3dc6f61e89f7e675c88dbc2d98db1a65b19675029569b4bcaceb4f6865ee5054365ac45ae2bd287392bb0c677e834a6f74dae4bf48d9348e632e457edae613438c2b9e009b80f9fbfdeb013265713465278d636f0d196deaee4019dfbd6f4cb89979316b3a70278f449f1afda47ef854dc2e6728e1cc0bb555ed4141e71589a8da0881b03551aa67b2d926904e0ff8caa31e4202e44db0d107ccb6b65453e03a6367cb98b2ff9676274c4b49266413c857f0ff748f11198dc5311f96958651a613020285dbb476df844868297326b3bc21607b7bcd2b809f09c4d4cc6c92572f12ef9eeb6199525093c3ba0bbbb5b60f8cbe3c65e5195fbf7caedf07f4d091ee4e4ef42686bbf13a6c491fbbc1f1d2b484936a3ab3500b62db2de7c59bb77164daff612380f66c3b3220bb1ed3a1eef1fc8becdd5e2cd39b8a1298e851048b35c465151832fbc3e7f50d91df698f4d0c2b39c7151b5599796a2fbfba04ad9f986085b786af2f19ae7d1e63b694f46fd546405178150cc84423b6b7dd6a93c2812838cdf758383cee0f9f622a37dd1bd420378dd2b04d201f5d99d0f7412aaf5a609e79846342fdd91d204fe2d55fd3645e91a3b81112354418d5983c259a0695fa004de5e6b8960588eb4bba32eb8df1f13b38328e665a2c35ccc5b3af9323bcbed8954d21caa12c7f46fc7821a00bbc611c3a5d914f478ad7aca9f20ec6a094073d4e1f33ba518cad1a30e7bd9eeba92ecc01414bea1101814facaf25f146c0607a96b18329ae2e32d501e81694a39d4ded120fab44473715c62d078c0e9250fbfae9c38b251d7b445cb5764514da2f4f3cfc9df36fc366b7385aa2948805a9f1fb2d1a1b2290b281cb2f66f63dfc7220911631e33cc1df112b7f09ec3d2a8dba8a803837652a30b9afeab85238f4739b08de706eeeb96762829b3cf8c7baa52d61fc28f853e74e868b31c2d69c211a1c81663ed74362210ae5ad7a1921b2a8b417c214de270c19adcb13ebbb5c7d1413b0308e7f8206ea45b31c054e784cb1d927426ab5d5368b806569dcfc811217aa99864a9256c5b00c945e58d5189c395a5112055adfa0e551a20940229288efeb9d2184405d3ca91b011705f5eb70910027fcb49cac063e858afbc2c0c556bedcef85c71d54eb68dc84dbbc1bb09cf1d22bcbecdedb09f7a33db2b1fe12701de60c56373305e2c6041e423cc0611df727a0186389eb0348383a866ff607aebe5aba9e7952f56abc32cff428ff94e4d6e153d7a2d774088bea021fb1ed93588a68a2f6e1d66e884e07e460e0f7651743d14e5cc0b4404ce3fdf7d4fb48d52611fb298192be1cd60a70bcaf4893965b07deb47cb7f3387ff62a93f396b0b726ffea1e79d23e92d39c8b83bbcebec2d86accdc42ecb08e1208fea49b96ea3ace8b1a2d23973b43c3af11af6ca9a1d1c940b4e216d27fca24b95a51f79583c8ff4ec19b3320c45965ed073691866de57712255c5e9ff9fe7dddfd6b22b400e806a4fe449b88b34fa2e155aaef3d20ff356f899b976a514f91bcd49336431efdae40a2ceedd2eedfce523e15f40817fea2ce1cbc89a9a8ee3cfe47fa624c81b47cdef97367d16b4ed853dae413a28fb7ce509207ec3610e99e2b6738c07609c05fe130123832f71438f09057745849b97cad917b9fe00c34d4509f672718ea17f1b881d82fff208e1b8abc7f33ceaf791919c4b6cca73cfb050023132059ffff5351f868c81c3054387c48c2d8db03119adb11eb31bec559e5ab4391d870f4c040c49110789c9e2f7a31eddc15162ea6f00fb12de473e53b4bd40e79cf43f56e56ddc3a3afea069edebfe3ed33b2a240fb74a6d4aac8a810d9ff43c54185be4b454dc74f68b5a06585ed793f8eddcb72432114d27c66cb075bd05c31e751a3ae38ec1c4c26e3928c58c65eabc2a8de87869d1fbf8e6f3ebdbad1b482be75abfcdb169e9c93ff7cee5981f290cbe7a32727edc0c79064b211dbc3c472428cef544bc7cfef416839e2a6517783c4a892cdbbdc0c386e8564f8e4d9d5c086ba284a5492e77804e1ef2b23f005e536b54dd13fc7fbfbf08d07dad72a710a811812cb6f742cbd3ca4c572fd9e9d91e8c6ef02bd143d050438dd1b8113b1bdbb6ab9d65fc644d44e0e5e13597b6f73a4f3d8913637c6ceadbeef2f3060bb0afa3e5c53d2ba4b96c870f3b4c2913c9f5299db2d88e8938927ab57a7c9b4f67674677d209d3cf4f45df881b42b674f6b0fc49ac43afe0fb1f093f327b56cb2c324c35f7efed09a209f0b9ef66b7cd5c4097c2b6f79177aa5a3fc27d9d5194136efd8839b97f50f85eb9e12ab6d7575d9bf69c1a6aa52f2852c75806a4ecd834d67d2203f8b6688455c809984dccb291a1d54072df02e48b34336ce67546d5af0da829732fa50779c93fe5ea8c3df85c08fdfa8bec69074251e424669b3b7916ec4f0d1538301d7fed12a4ced68606159db729e06242e9ec32020b06cf4c85fde7275f11a7cd3e3898f36e1434b6f134c761de33fb22a15abb6ab54f319fe5787b5ed9d7ac7b85ccc20b9a3bd4956e6bef1030c7aece39a58e0247346cf97df655d430b24be324aaa27aa33470e69fd9d9f188960c410f0f207339bff60f1c12b2e521d094301ed0ac9f1afa3100cb84d7957ec802998355bccaf20df1f78a541bf8865df94389443facc6b1cd3f0b26bb06668ec7c8bfa28b7a40dd2dc05d35feafa0164aace098e7751125f6bf42b66e889b3577889981a380d5fb111cc90584d3f0fd8f4051940be82748fe295451d36b5c4bfc60b3eab5162855fc512d293ec875e9ab6c4d66f2ea91bce7483bdbfd0188f85dcae69196b05cc46bfc0e14a47cb15dc5e38c44c4af57b0babd568e9a22e7372db49df8d300f39b0dbcfc9f51f792bf3c4485290ef155cf6f11bb5928d987bd54ff78987fdaabcbd6f7f5b58e73f5f876bf9e2fcc523e953bedc73817fddca565b3dbebda565dffdf035d02506c76fb494243daa7e7c1826292a1fd9d94115fbb5a73af281b0bf258d5ec8e5196943329a45406c610b25f7d411588cce814696e50f199232f449268eead939535576dcd76729ba426aceb55b38a944c97051a6f0704a5321e85ea2a1a9bb977002af7c33977c5ad37c97ddd8ba570d3728886176ff26d1174f2c56ff152d6630d81f32b3558112e0e1f2fef9c0f6d56d884ac0464aeea6873016f76b36e7f33a2574f6a6f72c7880b5fdc9dfebdac6dd7f3cc375c267106b45408b83f52a7b860e608537131ccf1e7e4fc35dd6544ecec4cb3386fd51bc41823027fcc65bfb23a9db783260d4ff528e72ee08f5448280cfe87113c349046066e4b0b3145421eaf244e9ed66b8b98485a1feef80f7f9a2fe554c44bc221c41906d00eb61305caf39381797111a2e8ef2578a34042974ae2b91eeaa3436f3d8a2160caf2eea2d93f3cd0d531150d5b79f8c1669a8d07cbab5cca815c8930480ee8065d93ae92fdd85a459a7e0ffe43d704bceeef08f2a9cbd23b72ab8c06ba83d3cfc69482d2cf789021ed926b0c48003d3c4c760acb93c5ee3127876b6066337d423562f5ce0c3cf84b7952ec9f6de24cd0708f453b3a866b3d90a1357993ac968498f7bd6e62a8430474658659019bb3f0c51b29eb5418ed04c261480b63aadae1a9fcec69e28fdcc1fe42d3229b0728a49021c97135d12a16fd870dccec6a8a9c37daef55b95838732a5a195e8c1eb2af6ee9de7cf0f67e39fd88f57f47deb5193c77393cbdb80f740b8878ed7d84af8540601656f7d6aa63a35cba4780bd6d94d724b47382489e217ee411eac49adeeadd51ee3e9453e3ccb14a107e38eb2ce658096d7bbb25f4944b1ff35f8ac166ae02e02c3c612295865578a614bfac76102072c4479ea547daf3570bcb3e074c2c0731efb2f339b0971f064f89d12170d708aafc1a63352ae21956d4eb5af8b5257ccf2e17d8b974521b6954dd3e21e6e63dc531f80ab46c59659e092ab746e8713c52b81713119fcf05c28cdb36d34cf04f9c24efb9c39490d19928dfea17363a6f39e979bbd99935e7c7155abcfc512096274084614493434a6773cba0048cf0dd4f57527b6c17ea873104852c1d168eb4e673de7e43da5a06cf2ea360869aef6fd84b63c83e5fcb5f3bfba18d75d6003a8615a7d22751727a1541ec82bc93737fc74cf1500d96e003bc9f70392685afe1b36fe60b603aa2afd0d38f571390e80ded1fb64a24d97677e48cc5848d6c46165767d45eafa6819544cce4796c249c76a5890f08c9580723d0b9af3a33e90f70ec9b86629d57bd6419826d2783ecf6b987308aec5bfc280a53fec1052a974cd5ba207a0acd06c35bfb3b1e9cd8dfdd46546f3305c0e8af9c075eb3a42d7b5acdfc4c0ff90ed42420aa434f3b19b5f5c23ef0d8c8a0b0fc7520860816eb05ecc65875e3e05dbd018a9e6c8a00f0ee0826bfdfdac58cdcb7cce1bb890e01ad63a6d1d0ef7af97e95ea354bde69a94ffd1b48a757060b48c6d0af0019174eb159135e5f4691dea3cc3ab14f0e311d053b6432660f0e65bcc744ac6942eef590217bb2b262ebb488e080144c08f0ab353f2e7df61680289dc541b561d3776a25bd95785d43c6c0e829b39cceb828fbae08564d37a4c80ea480be6dad9cde8c30e9fd1ca207b8e98074ea94f566d696695ed137030345eb29e4926813e1851c86593b63adde3162c6b4fb770486ad106eedccb8908c3697e035e0833e645b9a2a0d8cc12d093e3e48f07de459cb6ecf91f61444680137be2c564d486fa7327147bcf5e35bae13e4d13e67426ac3ba500ea65120a57b50a679702f3e24aed82d777d802f2f01acacf70bd842c1d82c4b9bef68ad50328f9d4c8b4314d96ca076374fbb4e404e8b8778811aad7de0c0a969c4c636171569bd5747e90d2cca245b3c56ec47c5c21b5ef28b6b23b5a504d2862460b6795e2aefc87132016ce82d944b0ca85a5f3d766f3dbb2917ef8d4495ce8a83a103e9f5a2f3a50f1e15a3a25cb44d2a4ebfc03ae593eed5b0e7c256c2e4021fd9056bdcad2a5b24522fcec3ec1f17a5a121ba25cb8e63fda5dafe5fc27f2ad203e25d0b70a3729a80983e791e4c7aff4d3681475bb64acf0da1e4d053191ec960052a2223fa1be3ab3cb875fe16cd7e5cb3c66c8f53042ca0bb06839d03c16d7343c8063f00d9ffb0b4093ffb8c01040963c5acd2808187dcef78e3e2cb4c4b375509a9570fd2e0cfa7414a8129ecb639de5d23032d59dd82e5012a166bb40289b0a33b65c162fc5d965d3e6b527e65302a76e9000a57f1f588bc0abaa29cf7697991665d17b454cc013c811173f781e97ef4f15ec51e7efc9e6f4975552c096807f3fa092d7b98563021ede2f3731e7a5bd4a35b9df9a425a382d3034916ac2fe6406254e02a2c2b66d8f22110b59508ec318c50e9afc71203f7a917d8f05289cba6659b200996215e9dac8060bffee1fa2f0515b87689f27897260315cc06cd4fd38e8557994eb10ab87947f373457860cf582399b1d4c66c3e67c1a89a16e9ec8d492e3db3e7d57e9cef1a35a176b39dad4601e7d0f86e9951c2551ab03ec0e5a25bc10c29e5fed73ed51858608586d2757ff152c899b459ec8a92fdd708048a02ae2e01754493e0e40e9abec284b6a137d233411ba592e00822111632164b6b2b7cd81355111a259e6a6c8fe7d566bdf3ae8f865735e15b1743a431e24d55a1efe7a3c20efb45d55fd1ce7664a78712042abc54fe28aadd4b891bb5aca8c415727d69b148ac530c863996fcc16516505a52c17a2fb371a3cf9e29e8f7a266e531eb757d8441b5ac3d0cf0c7f4a608075d755d445ea05b0a9be7c3941840cf52e34de10dd25d3e0eb1dc2a3f9c49e2473f3ac825bb5824f1a71c365ce6948c0af0dde04f4ce638b077ead7e4fc8020e24f8f9c48efbc4745ba709d869185681937ebaa29e2e502d7178032f770866238c5777a104d3661a4619794ade199073b3a04505771c314c3ffb1a30855e9c2237fb4ac52954a59c44f9d751f10d4191e98b71b7ccfa3b0198a35c93d0e9a3119be5edaab24ccf13ea910b863ac89ab20454dbf42e8bd3d149d3d634e7fa34ebd6a57878608123a103ad2e7bd138d5b2e40d490f6c5447aa399f2f02fcbec199e9abc4b727308c66ab44c174ba39faf51908c1f78293c407473f32671a35a010d4e4d37a17b84560ad0803af4e03ad99bdc0b05caae9c6e941ce53b4275a1408be9501f4c136ae0ac790dae2c9df7253187a54ea71a527b1a4b740ff8037ff52172c3a56881f1120ebb9b5f39b7d85fde4a8e385ecc46981307a13c441d0c5504c04a24cacb6cc1da5b1bd0f9e311ed6b6f6e96e0016d7718c6a87733228cd3fd05d84adebcc15acd759425a71b6bdfb1d6243e86cd89be3328f1fad58a75ada473e12b757edb3dafa586dc85b9bfeae66b8eb275f561f67966be86d55bd3b28cfa17ab320ce184aec8db9bac37185bc39a0fc500e1bbc7a8fd97743d467816a948c0322da96f71bc4fa21b6a3725445b71ff7f6342fe81c5d8f25dc748b6a5bdcb52d0aca899dfab8941953bb6456c288212e1fa1c21c26bb2769a1436af53235bd7d7f0acde4e433194d069e26bdf8136567bb3600d06334ec2e003658f9595727a2ed38fbd94dcd37e1ecc08f0e5b8ffe806d0c319fdf616a76c6040f26130fd76313dd72fb2fddb7ec792a5b795837e5fe7c819d67ee7797dbe035db219d019915bb59e85989690ec66e31e061e0d365882bac7b8463ecd8a5619119998c15b57fe634b17d733b098d6fb5bb24f4a2481a0460664d93a5b45bddb5b137cbc2f404802ef42c13933666d9346bb821216f36eedebeee68915b089ecdf1467ca4bb2ef7efc9a65bc08b04f3965b7cfc4db7a9ac58b4ed212b8506b95ef32a93953d2a79c8d67ad37eff9ab4d82751056d9d7e92e927efe967dba596c49007c46e60b39b964b47da9b511503df3f9fd96603bbe683bbdc7d77c35fa14b9627f4f970dbcf39fc67eb8623bebde977d2c646bcbddd4c7b90a32780557103286132146bc4d71683b9ef3b55254c7a4cba6d7998f6afbbf2e3153afa9bf777c269b40b2776fd3e210edcc635df649a3798c90d9faf4e58761fd6d9fdce98251c682f725f99cff7adb300b35cf821c0f16b8c23dd81dfa3f72891dce799d5133bc2150ca379877944d2e9934b772bc2ad3ee04749f6d762f6deed554d7e420590ee189cf7e9a67fbe643f1a556fe26e3f228345e35e6154c0e04ca2e7116db3f5a992f362c663b0d61f5a0795853b9d405f2b69ec5cdd7c26e75ac9ff09936f8b434fbd6c74f4fe621f64f678c518390527319b759161e6233cd4a96b31eea67fddee07dc606f23e8ff850383d5595b971ec01f2cdb2ae30cccc6bc9ce0951ae407ca9968d87f44af0b238e0952911d92f24e3dcff2b4c26fa92bfdc083c0beb1e18fe6e90cacbc1e237f5e08ea9851f2bbf073cdbf1b9354c1f8df33dda1c6ff7021df8b490a26ffb70c3d2a599ef3ef9f7a9f7f8ff5993f3cd37972396f2685b85e60fdff31839046f02e078ac0759b528431403376f0a9d1d318f042f372f4165d6711dbf57c84848005481a6195f13de6df4e801b424d634d336a741e4564a82c4989a1bc1b63aaedd924c1d95a1bd20e84cda23b5d5a5b5293070d84c27663749a17fd80271ce3c893abcbee385d7ca97e83f1555e24b134f3507a16f2359039cc619201735406dc412518084a46d15233c55a0c67dbd7bc7e708007b7f1da4a20c87f8d2549e961ad0e0b4eb60e3f24fa08ab06bd88812318c65ef1211cea73c2a8e6e7466b8cfe0f087a46a07daaff4ecd4fdc018bbde1946a01538def08d2045f60ae09d5a41b5b52eeb66c060fcf3c32ba4dafdee511098bfbcc7383825b1e7998b9a5de36493bc84d2cf9ef569413a325ccff067e7d2c7ec819d3b0bc43b3107190fcbbf57397dc549f1eaf7f39afd4215ff71d32aebcbda4b01d598673c8ad647233b6ec8e8aa409c7a9236b154f2320e6bbe13a4dce7e57615f2b3fe32d6bff61e4a2fdb1865f71acf57e3c900d1eb0de6ebbca04b81d6850da99ee7e20999692a76980f338a5e05fdb8183f2b9312092b302e3fc30a9729f71ec3a3030ceed3034d2d54d0ad0b93cd642bde334628b317c09f755b4b63fb13a2790336c2543b4bbeeafe35b5f3e58e6230d1140c461bd33ae5725b03f6e9d3131eac2e543e425a75ee63de630392146a69a958774687da64512aa014e95011cfb5cb2e1c23dc97c577f3d5822afaf249cbc72d362c129c49a15b32b24bc07e606f7c0f59721e5dc208ad1e34fff00646c12c6dbe51ae668861983772fff14da2735ae412788bf29252ec274ff30479e593a594da7211d4e9b7eba0243f0298bfc7d699ecf5006fe89efb22d5433a6a24dd8f729ae3d02933fa4e116cf4416d3ff1c1aa7ec39494aba7ebec675a9e6b6cff3c5c51b163dea5d3e8f510311784af1e0771a516673c80e46bbd9df4fd82c903c43da60a04d8dc56f7cc70637aca532eed72f9356f833f3e6f6eeeea4d8155d262dbcba8fe08f9066411be0962bc21868107b82fd251bf29d0ebacc754201ad5b5f5ec56714f05b5c9a3b0ef1fd051e61eb347f611fc3ae44ec312a16e1a1d630000d51751f8b02b43303e075507ad06fe13eb683fb57adfc854722f880fa03d4f41f7aa4a47b90ed4426e7f7d994b6954d4a0edd9efc83e51296967b51680bb6ab178a1a0bf1da407b5e362159d9a52bffed461f183724aaf7b74dbeef5b14a167322fface4a04129ed15595c969b59df05cb487ec4239dbb4b09e15e85f65d5db25e89f0019ab772ac8a76f5ca7cf903657958a8f9f89dd03c4ad99427084a51dd7e978bf31c11e6430c7b7435f704565b772ca7d58a93eaa9d4420d9bfb3f0bbc583cac1c681581ce7c1597566804ee7ab9636bdf114a0bb29f95367f34b4d9302a18433b62684191f452f046ffeb323b5f3ef61d3caed9e492bdd839c9e19ff7c28059a83969132a79df7b0a8505c6b27483c35d5b9ca8dbc32a56554d5a6e662153ff59696df09deb1371c4c2f201e05356f35821a09abb047ede0e1e80f106ff81b61c0a2d5299a4dce33864fd5c3b5ba9a4031d4cb07eb5be394c012898e38ea9949ed6a6ae1b3e4b2b3c89bac2a671d9bfee37fe9fd4903288995a8ebe6996f2e8e1be18d98534f9033d307a94e87bdca35b0bcede67f5839b13d0c53f59727e2ff430e99809c0dadce7945148112dae8b71542f9f93f7affbb1ec421a4cdafc5db230e1af549c8732538234ad536713c61d87c8235ed11271b5e88f94c0d326c7b1cafd2be945c1e3fc85f5e35fbe5dfd4670ab01ace5fcabfce231c2aa1199e2d0ba09bc42bf6475a0bc5ea08270ba078dde3dfadb9b745eec51eddfe5cbc7d25610f8d1fb4e21d61e4c7209ea92e4a3377e8823a9db0462ecac81f4df6bb06ca7b4a07f4627c59ce30e45e49c61f6226061ca1dd7e02f63940dc09dfb2bfe0cb0e7a4ff381b1fe4ac80159d33aa19e3b469e3d0f9136562d8c0279cc6eebb7f7c8715fbd2b6bae51342731309ce0ac09b98cae7be6b719724f63dbdf0c4f43bdeda9d7063f6de3283013dce62254ec1b57bfaa3ba8808603e4b970c13f6a85a09fc094153d3d51dfe89d95298f1cc719eafa597d6bbcae6b61e500f6197ae733eb54c53eb75f895cdf56d837d8cc1400fa817d14f0b66150adfcd0a3ef24f7c0aef24532eeec4033fc8c64669f9b01a3d04eaf93e534d68a0319c2cce18cf3740721914cfe38c4e0e889aee8eb3250a521dbde68136cc9034962ecdacea2f9cb0c3d7fefa3ed30aa217df0a4b1b63d38e70672633ced5e9a034f54da27ccc671b3b4f4ff5f927cd09cd60ff91e70d324396776337e8f047672e4957f342d4b3de36fdc65cb7bd9c82f1e7c2c1b0d06ff847c8bcff3c8bce5c1f7257dc67b71a96577d6802c702753566fc78600210f1ac68809eef7202dc69ff618225fde24605493ff67af8ae75f30bf5c23992d7b1dfbf43b3e3a8ed4c2ccc624898d0fb3250468f518f161be345350190596af86fb92da70a442c7f253599d5c90ac720ce62e785488e39d7f5026cc3edd7963e8e3d145b668d280fb0b7b8b852a8d70095d5270ccfc971336740583ce225c6399d1c87cc5e2eb6d62d39e3de2f84f1b96974cf6dcdbab94bb0d9c5780e3d0a825f2eed3c90f2c67f1de47ab5dea585727c1ef5f7c55e76b348906cec53243ed9919d1742c7546573b0aea02b391df37df1e6f558ad68e645c68f933493112b1cb9ad764ef3f2cf54c93fb58a7fb0a8b3af3a0d507fb0522b7e0a18b70d771e551ff928cd0f3d2b8d7b3b7318b8a706c6d2ceb3f6fdbf7ebb1561e74fe27996f55ecf0995c04291576ab2e31e74d4109d0131b337d0b32952b346bf4b295ca2c11037e277432c4bc82473e58480b687e5d50cc1c2dab472e62706b7ddf12e7b33b985bd413e84645b32eb2d5f33dda972ceaa0d0b43bffa564c66bf63d35affa07a6faefda369975e40c32bdab297094260152ee3f7ec294bb1c0d40f7701f0c7b5a7ffabad8228c4b50ecc4fe01faa7449157c9ab452f8ee655dfa7796f7b281e362cdaf87ae527bc32ec19e000b5ad1b6498cfb6d94137e5355138514d228d3882d4337b6f0fffdde417dca605ce9f3aef5e8f2e4f5bedeb5bf7fdd28785e864c766c375e9372014db2f4f142354b7d936b3461e94a62a27863fea7b6c96a82e686cf5f584678313bae900cc72839a2cd596b97e9d9537e3a41bec98d3c8f4138d7c68d2d2b8776f51e32c88ae21c8e2cb47829801fa7b92adc2abfe808a043698e05e709f60a8246f734efdf59f23f7f51838cdf443379e1c7b7a06420b47caaa8c38c89169c934a32d975f3ae04f77ec28a789f95e42763e71c54b6bc9f5cdc1b13023938d50738d730ca5e3607a148f9a069cf9a9058c42bca5721c1633f7f07bc0cdd9ca38a49295eecca2c72442475947bb92197a7870378b601366d9ed7aae0c78793fdcee52cbd3f2d35f7322e12e688e290c56eb4a582a2d0b459510fd3422169135099b8a8582dbb8cc5617a9520f442342522908ca301c6a719c7228107dd6fea3f5d7450595e1e3d27d1a7868820159bc1c0064afe0976685a84523dbfb4565aec28657014ba195eeaedc8e7ad32dad8dcd205311f96f1b847781cbd82695c61f8fdaeb2ae24b5cb32118888e311b9c0cbece2e109ba3da5c52eefbeef5bbf7a7f559180bb998fff549d6109bba27196d1fa1fe2a6ed47fd5a8aed6b0febbe14c908ca72317b4e5d2b3abca33055a736eff60b8d459088eb85f31e6acf38a4c8d1f85691010141f1cb769e4bb93cd3ade7b3bad1125a3a4e1ea15a71a75a0d8aaf0dea0c8f11a9bc374fdbecd66243be190bc8a6a86f2c42dcea6e9f8ee253d112bd8206f9735b3616affcd374b5e607d3dd4c4d895fd479fd7d72752e24680c3dbfdcd94f42d8a3b55b679d15be8d2aa4397919e365744e7a377f84f2a2f3a464dfdc60a581af3e4cb084c5d651ab59d41e3b1d93f345c33a119ee708fb0b44af89885facbb7b1be83620500a5bb5f69f4f2f573993f78d7a31fd563e26cf1913035e3bb383ceb7391d1b68025813ddb4d9bab82f436ed09f106db14decfff9b59c3bbf06076fe725078f2518fb984089cd6efc40f067601812802beac1ee432967a10160cbb7d1126f19076811936476e55e35f9322ec621f557228de102258fe707f4fde92d654372846e49ca2ebefc6e3faedf7fa18c452f9767cbed51154c18b1cfd2533cf1b4b875bc4ad0bde0c7131c7b7728b221753700c931e1d67ebb93c695e775128d8b22d3b335a53863eb693c1bbd8646502f7a8ddc334405292413a8da47b96f2f8bfb49880588d6bee14332f7dc37fb22adb0acdb05b7fe457fa900a62493523450c872177a611593fdff8869d5b75a0a40deb0a27c4d43e0c7442485ea8fc17d0a44a10ea3ef0e9a109d0d6090223f4bdf624c0181b741149c833de721082d195b47afbcb8f7b800cb55b1e1e3416e86ac9fd853f4999706e1dc23e082966784a9dfb83ae27c7617683b7daad61aeb9c24c4eec95467160c44a7220ee2f16e8becea115410c7eadad6b13803ea4d6b4d323c39205e7254c8c47beef8ab816ed3f53f77703fce5959fa69ebda239ed0c14f27535f002eff721ef81ec73d747104eb0e8f55bc178a111a2e251fa15e854db6082203af4957d6240dfa2439043cd8013df2ff9a1e50cb6c9605a2832630a543246a9379a709a86fa56a1ea1976ee12e364a3a763c5c7a899288cd68ad0a9b7398b234668fa199901f28307b3ad31a88d6b91b684ecc346202ec7e4fb6af5659a05075fd2fd8453aec9ca26c8ba72493707772ee13ffbdbb6160d2a025cd0e79a0d30ae0a802c054c25fe18492ee93e3a40a04226fb388e2d69947caca3a2706be730c746b1c1b0e3278e34245a3001fff7cb62a290557f8ecf9390ec3704c7655965c5da8d7bd5a42ec22dda51a00fc3eabf60696893f452c1bdacc183c06cde822450eb411a59740e891f0f0b8bec2f969e47eca6a7af0f855b59a73d79da6d032dd754ae67fb5afaf7657dab90974a21bd06d0ff7f20a923d85ce718da8630ef0d1d98b0889110f7dd0517b0a57d1be53832d42792db46e42604dd6cca83c680b2ae63c95816c580e9be60641c59a01ff623b1a573f9366ae50ffc5b6806bcaf569a8277b7843dbd6a6a3f2426dc80702b23147534784802c85915bb00f24f21c33c1eab000eb7ada30d2d25af18bac4985e632277d6d068deb660fcdefda52c81381081b30095b3e6c0ac96191d692b3bd89418dc0ccbf286b35fc6145ff8b056557778fc0d4b20a4421991e4ebb33768acda99331b85f387bb3d0d8896af8a65b2352041bd83e656c16a805c112c3485678473fc8534707c57c605023da70723402711a51981ce099d2fd11bdb0be6b64e7cd1b657a0002c391ae2395a9b65b24ee123060ce5e9f152ec363004e33bce6112034128b95c5ee47b231069a093a25b4b76d963f7d871eab0970182b9ac3a3218cbce9f6fa74185c84e1f30ee6eec096b803cf654db6a714178ea26eadf30c08b174dcc101463e75f6721e3173828dddc6aa5bc859c4d8cc0b698b357988593c2343c52444a55614c167016ed9ccb24c2657c26b0c65291058baddf40b8e605289ccdb21982e6f43ee60951831f02caebdadae03bf64fd07768439ac27be7a34535109eab765334ccd0d297bc77b0201a34c2f4f156a8f27851ca78d8c91d13604cbad17ac332bab51941007f1aff452769c1313de03c695440b54df394b0289a469ff8aa1464c3322b0ef34aba69ca5adcfa3a10a522068dc5c43952aee49105aa922dafb25d050be000f2f5df9e7d8930423cd5c422ee62b207d995d02b6ad719862bfdf2af34e390cce6307bdca343f810cf4491b710898430f73beaaae11c07bc5862ca356e1d3bd38fd97c6754a44da4d70879f2e0321ab1b1ea64cb54987e93fd8791389ce91b66a39db665e88581158e1aa07d22ccd28d4b8eb28ca4e92d89661f5f472225efd0963d2aab810da40c89edb540466996c0c6d6ec38cafeae9f428b1d4824894673573ff7601327a0ed8e8d272f32db4a2dd2b0e94f79b2414a1e9dfada6f39b60c78ad2b54f4173abe059434740770629465488dca3420789a95093426022cb08427a745ea4f51ca526f3be1d71a8b256909b215876efaa3261c42d2c1a305407a2056e168beb70f9ef8b164e50e1850a5def5351a20ba16b41b24be833423366e273e082bc8a09c16b6d004d542979c42681d91fc38ddaf7593df9b0ab047aa334e2087c93b593b8e604d06717949d51cd0b183b17706d3270eca0d87e6de2e013d09e93e0c658224725a7de447f6ba0fa7a84314c87c89c7f3e5c15277e41d9fa4254c491e6e28e440b104075be9051e15b4c3dbe658623c213ffaf6e7fbf5e24bfe17ff637724e15bf896c41d32ff43a713b76596646fbb49eee909eabdab62dce0d24cd8014cf437734c816e853d8dfde6b5a6cbb7f989fb8119fdb0e8a3913763ec4da4f6a51e8fdbe3719f79c61f114b3efed7bfff7c262bffb65a2f9371b9d0be42eacf486e43fa0ff616dc5c29cbc64c0fc115cbc51f1ac60572fb17da735fbd5bb7d5bc4f5eb8824066e2db8797c5a2db0f335287b823087f06c1f3f37dd1d2f0f168bcd2f5c50189e2bcefebb9553e3dca5f0cfad31dd7e5e73cae5e003c7b0aea858f5cee1fc1da0fecfbdaf9b0c388f43dd943ffb32713648ed1caf822ceefc9ef21387001e9666d54f88a5d897e9a82c5287b072e4a3c5a99fe3669b67ae79dc00ed3801f5a5b973f6439d35a1d23d0c960802b156831521b5dbf001535fbeef5f0fd496a11ee6d362ada0efafb71a3598f133d8525ab3e50197724d4a8db08a76096ef2e9cef3fd1f12b47974d1aa43e6cfbb188b2eb1f840fa6f84e8bb84049659819f18942b8e3012e829df9864e95b06528fbdeee278f2f84337698fc119987b558d963deb1905598e720630557ace849190eda3467b2325d618e32b21ff9b7c29d39da53d0b5e18543a1bb08da6ccdc8708dc9d7737fa10418a332eb69ab4f4f5a4cdcc41583126de88447a041fa3cc46d7da3feaae5f4b6a97f1f6cde5b7ae6ce44dd9829dc34f4a519b11d380f419a179cdd29a2f3e07d236db249e1428ffda9d9efc507db7d9de26cccef2ee77d857210d7d1272059131f947acf063e38ee830670e1f4da74d718e5d371a6f49e34e0544aee6b6ea729c419cfb7d3d3e56244785f26874916585aacfa6ff0ea4c3313a00569d0e64c316e9e95bc209335e029ae8c8edfdff82cdfa014f90c87eaa568585adce0f7263a7334764d85d168e324ae9633f9ccc9a9b1f389e62700ef5b471b85264880edbf379c2e337e7fc9da46e5e84d8e293765f58e831a0ee51af436c3a884959a3ccec036ed5f832377be97466783e520fa8d7012595fc85d0b7b87a34264a62112cc1e78a4459a7dd79a9c681399e36fcd1c444a83031a9ff775feb26ae3f510489ef264b6f617321ffe6d99350e5929ee6e92692f09b8b998bd1f0b0128ca0925163892af02d998ec655df9920a639d2a1655d8e5559ca41005960dac0414ce1c0f032195f2c453d233b64fab3fa0b89c5cbc17f85517e0e98f2cf8e1d23da6d9e7cb8f38b14d9241b4317f85c8e83e48fe7fccc97af456397050b669fbf3d86ad4058acc9edfd9d5ad7e780712ace14f6a499984e247697b43ced370432aee0643cafb60943f649ad4fe29e88e02d703acbbdb577cd12492d0994b71a4156777935bd922b709cbdc1b9e858f6df23a88cfaacf920516d8f331d89388c0c0243b0dd1b35905926ae3e8e12556ca9b88f7fedb56976fd20d9a54cb7b90c1003b06a3d0be1bde4dfafce4ff60f4433ff7b1dc30a72b71d9f93e7e289fd17501d8f78954676a9d63bfe10eaa67f3810737d211647edbff5e54f74be80690e014e624ed273624f779d427acdcb0e41a48a3e3da5c2631530bed6f4fcaf0ed0b506c01821dcce8dc5e3c98fbca12121e93c35e82f3f1adc9994c135a9297bbca0178f44780a4327f651181f653644473d6e735990df62473cfbdb00b0f45a3e9c128ba0d5d27109bb760663771d690fdc04182036eecca9bd46c27ea06cc95eaf03b04e3be9894dc508111f1db586436f328ed64542136fd5a0b9445cbf5ba26f7bc0843e4256e36810cdae5a3566eb87a95f26da01ad2858dd970a462c69d7481bf3b195480c6d1331b8eedf57a604002ccbddada8b93c3dc51ee67b1f8176ee26071edb6bbe9368b2d23536453c05828056e1775dab0281bbab12b5bb214d429e40913bd23c343b63a4c9494d930dc0946b41e476465e5f4b6c5e575cca189d0ec0dc4f30e4bae6cb265ec0c40a7e358dac4669ab80961949057d4efcaaa1f598bf1aac38d8502313e4e9d6a92d4477d429f693c44f0e0f9790da658092242f9e5e17e00a00247b8849148788d45f2cd0c93d30422be13ff1b707557983fcc3e7c20994889d76cb3179d9b03cca83fac15f0ec055fe354ecf188ea76decba541723c3e03da5771f045f7ffed6eb1fab9adcdaef7fd3b38cb558fadd12ff1d7fbcedfa809053ad77978b4af7c60585d7b335bc2e915bbac9548ec66e1dbfbe3dc2b1e8c1599a79bed0a9c1aa4eb66b46fddbaea9ea3edb97ea29aaf4e78628eba36d448dc73283415dc11406300926639571fedd8148a09a87f10c167c1b527a9c37fb9b1e6bcf826b4086d6df0c0178e2124db423b028ed9bdf5e16075a7252d1f36e0c50d8542208659bb4aedbce98153844fa91e5b6c17b1c0334cf4dd3e8a7936ca5b24dc0773f3b0d12bd4da67970bb578201af9b301156200eabfb41f3580b46438f030c30c33cc30c30c33cc1a667c0edd482335899629a5a4ec08cf3244f53822654a52ca54195a45aafe9350aa8d8991fddf01e601df010cfd9f3d2415aa1e66cf8cb8720d39ecaccc94cd9742cab410ccb3d6b1b4cdbd2927420e6b45a92eb3dd6e9f41ae752d950e22f3c53d829cd7749a9a3a90cdf6aac8ea777c0c08cbfcc4d4871121a6fe40895b62d34d8cd2fdf86ced0a4f91a9aecc3ece3ba14ca7b921bce6831f3d2d3de9b4c478e10a9a3d9aeae377f4ecd71afa131a3d503195bad7fd16e2e47924dbc5be86709d1f6212347830c59fca71b1f4a2b92315afed1f74549fd36c475a44ca8a719dcfef9385a68e4dcafd8ea2b33057b6141a3a8e6a8909736522bd7538d0cc919748f962e8adb9a8c9b112dbe1eda57b146aa64013073a889de3865261faee073470a8457ffca03b9d7f5ebdb1a71b1fd6727db3ddc0d5562e3c96584345eda5a545c6dbe83bed285e2a1d313b7b770d1bed93b6b574175b2d5db07c095858b34663ac516a2dad337f6bd4583c994ef39634e532d6a4a198fab50aa93fbda3098d5ec4d851ae0979fb4567b0e56b0f1b37ad6eb83466ecb14f6d4815f78e4f089a32969527956de969a918040d194d3d1bd23d4df5e793069a3118b1e5749a17595eb3468ce4e830a5abd5aa964c5f38d08491a8196f5beeef623e1a302e13d939a99fef64eb14345fa0ebecdbc49bce556abcf05fbccaafa75e5a5a5280694ad305aea3def36871b1e62d978a63609f4c6d6b08351f4d1b18ced99e275767ed59e941d8bc7098cbdba95a4d1d5c6ae30236b7a6c3582b63abba6981597e1ff6295163db1b16bedd7ae63c4db55e3d46a6840a5661cccc3459e1a7a2942f2e30adb9c864b972410515a8c02d2d2e2868546955497dfb4c89d16a124193ca6ae5891da2db55abbe030d2aabd1f276ad2c797dd129787a8998ead5c7d6f545630af2f1d6989be12533d49472de1e5df26b46943c495998d6dd59a677987d9a51ae2567aab54399d23a1205312d5adf9aaf5f9f21d08492df8d3ffdabf6a93d4159b4eb7c3a99102296ce4b4b8b4b4b4b061044b0410616b4b4f83f16999e8940f3492ba3af4bcc583be49eb0f6e7b3c9acdcd0b34e18bd5a485317d7dbab2b3218683859aa50a2c6e82045a7cecb26aa7573133a4739353e8d269e8eba57d569ad626d65b2ddeeead049cc08df3159cad6d95cf598df092fd963bf676cfb513674961cd59d1c5b62f447672bd96eb470ade3b6f0a8a584a55a568b2957edb2210b349324a71e457fb621bbd424e1c5143696d822f1c4f2913d3bd7145e83a4577b23e3da5d6ff68fb46f9a88c89a3b82d023725c4d858d296e249952c7ae6bff2c2b33a2ca161d577abdcef15aa4fd33528d1bbf525ca548765e5adc8feaf68e4a049fd5be26c2c60e528b8836d7c68719039b2e543553a85335a79e2e17ce0dd1ba93b8e19efa660be54799caa53a8ff58c8c9511365a2463c26d44d46c8cd3268bf364a4b22d7acfd6160b6cb60a9b3a4cb1f332cbe60ac5583b9b96f73a996d63456ac28596a9d55e5c1e8b0a1f98b1a9a2b1e5d68ede72a966baa1222da43a936bbb83d05a9b2914a6bb6d8fc714433d1b29d6b95f7d75b62efd7e130527c58e7551594abede40d190d5e6326ee6ec7df3c4a63f3ff4a7bd72f9c689768554b1446795336f9ad085db1a4bde52e2451b2694263bdc566e266be89b25501f5ddda39a991f574aa4fb54e9385ea6733a49705e7a65acf55ac6bc90f0444f9fdaeed9de532f9b23fe8e7653d576d67bdfc60864a98fb7b3fa20755a37d814c11e5542ade526475ec78a071b223665bbb77e859707e566086fda9211eeb3f48d2a44d3de84f8ac782688d4b44f224a0dfbf310887638571de5a7fd90cbba1129cb9760e3c3fda91feef2950d7dd343fb62cbe87c53ba54f308363cb07c474f9872b5d4df1dd025e3b95fd81e3d221dbcefdad1a57d07dd620ea71b53af3d96ceecd8041b1c0eda76f29337f7a3363728627d56fa57c416e3b6b141157b647f84eb9ba3b380020edca68673b48b4fb9d2c7bcdbd080cbd9a67307a1cf4b3333206aed4c6b7553b9be645849191d26a57b020ba864408f01cc4b0414b8c2c03590520398000101a8c00c1c00409619133a1820801f819930c21566a50001664a7803400060ed5284e82f13b1e4ed45259ad0d212f325b89c00e32e0e337305264b096f05064b8c4c67b041e4c064719998430e4c162b2f33ccc5c5808d21c7c5a5804d2107264b092f33565c5c0cd8107260b29c00e326b8b818b019044b4c0b92e56702f9136462623e66b30144052c1df3319acd1f2ab145dd65a9157d9f0a367e30c6d297b6ce3ec56afbf05ddc29b50f5aba8f5e5a5a5caec85c99e1e3da2bc46fcebe738c9b3d945aa9d1ca3baf47b3e4473725de3f8cee1744b0c9433565eca87795f050d7b688f9ef20c4877774bac4d0592b1552bd961dedcc577f6eef775aade3a4d3ec34d653ed6d3a0e2da6ce9d6f4f4ace39d4f3f9b58bd27222928359d7aab373082d3c1707a3a3f4970ffb9dbf862335fa522c6553cef8f30d669cd6f6b394e8187283ff2ca62b5b2b62c46ba3135385e787f3d039d938aede1457eb6ec858d760bcb83cbd293d9fd2a9812c11f34a3fcfd6224e83f1939d9470a5d65dbd4163f9e2c62ad9a74789e9e60ce565bdb6c832198f9ab1be255dbf9dcd48112a43b1e24a4ca1cbc4ce44c629c4d25daf5b9bda313e4f6d4346dcd5a75d8c5fa7f969467489cfbec1268c5c97fdbff8b793a3635626d880f19cb6dd13e61ff667b9accd177ded972fcaf7e6ed36838d17ceabd152aa3fd737bb12817ba8810d21841042888010428863ad01a18484108690518a29087d12c871240b3210c42010c22010842084080831861081914811620c2355ed95beeac8c66904865b3dd3f3c027fcfb2350297fb8bfd44deae945af017c26ba93363fca94c1dc5f4ac50109cd1523a25e67cf29aab71190cedfd449948c77910c429763c3066bed805666de555694445e8d03e15750d99d386a18b3f1f4b6543d53ab5255dad47061fb30f8167db7942fed7f8416fd37f64bfc85b441460338d0d4b332d7a4d56b22c2b037a1f8976c8c090b265f2b9df373257c1b77517839655e3062014ab15f820eb2f47a91f96cd93cd9920444d5b119419306ef9446cbe4a0f76fdf18935868cb9ef05c46b42e6157e8409c3d1eaf22de3fd884f43d203d05d0c4e50d41061d1cb0561e43916f37e97ef586b60409ab21a447e6ff8a923ede7e0fcd9e3012e7bc332e4274f1484cb8dec288e4b4f9db87318d9098a02f0ab0be1bb0432b4a84937c10f097a414c96b33defac14ddecf1369ae93f133c16e60b5f99325009f65a6ae7546b92d93a4f3f79d71819582bda6f5239d149eee40d7d73cf52bfea3c3618799211b10624404f91ac63e4e277907f40ef8182918e063b503bf49b5e661f003ae18fec4081add49da4546105050e04329c71d1bf99f67e25ef02ce10d9a354720994a1dc15042c198a834621b416a48531c6693a9a5009c8cc1d458694613e22e3ed2e3e892e287dcbd98dca537104398b080354a40bdf300bba291322947512f68068a4c722066082806fe289ab0fe0e2a04eb201c998e674f99b37d2631f5b83eaada38fcfa24011ae8df7d3bbb39335f203170d5428645ad56c8ce418b513e4ca7e34c854133a930d4dfa241849f3489c51414c4f41acd8965e2a1c14598e02bd04a4d4c0cf69797de30450af8f23d750f3e2b343a9c09ec9e28d8d16839e7e3843140a28e7aad9f087c2d8f10f657532bb56bffa3b610368d398c463ed17136637370d17dda00ada9441c7ba13c3545c1c2ee4578978e77a0a7110cc23ceb650c970d4ccee298f2136b4dbcdd6713d1264ff04960a43b5bc7456545ca06efd10892cef8642c0f1b74081e0a90d924d9e9ac22e3971dcf1232d2b2d75927232ebb9c0522d940ec0c49391a258d7fdaf15d22c6886de0ca6a688fa61a0a9514dd9bb8c0391c7b94a8bdce5a676694d7921605ae93e8862cf250b502d776d60477e0bf39a36e5848464509db946bc443e4b5938f8900d248b52b588b52cfcbd959886853d4bd949ead3262b565af4fd927ea135896b005c10b51b15a8b4629692c31df1b0da5e1c08597e2649e3c28f09aae2a4593aca8a28da2f2af04c9cd2f3bf64f0a8e9fa946b426c4c620dc4e56410b37cb4770a6869f25addcb63481ab1d90cae82dd7cbb3ef50fd9a7c715f6a526d44e7d6981bff3dc8d4a63547bf03f3952e1b9489404c656789283512e0336494183f46cc02e28b6dc37651de95fe3a39a38c4ab356889cb5622078664596d1455fd10ef30c464d4850f3393a7dd69fb1f5741984d626bf7b71", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000100000000000000000", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a63": "0x", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x087cbe9e22352a3a87f6fd5b1eac65e82ced57476ce6040e8ba180212d42430f44ecce8a310d1595d13f6a005cb961b5c8249e5a4ca34afb14849323459d70f402", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/trick.json b/cumulus/parachains/chain-specs/trick.json deleted file mode 100644 index f626e9d3f596..000000000000 --- a/cumulus/parachains/chain-specs/trick.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "Trick", - "id": "trick_v9", - "chainType": "Live", - "bootNodes": [ - "/ip4/34.91.144.206/tcp/30333/p2p/12D3KooWHrjwgK7w18wCYuLAYPm4EvYtxsnWCcPqmz9nxvDXgEPs", - "/ip4/34.91.198.14/tcp/30333/p2p/12D3KooWMkaC5D6fpJRGDXkri4X8UCNrfRjmLGhUnJaH4yLdZJoB", - "/ip4/35.204.157.238/tcp/30333/p2p/12D3KooWMmWxFRPW9XzaSe7jGhSxmfbkcxUNaUh9npHSg4HvCG5N", - "/ip4/34.90.169.248/tcp/30333/p2p/12D3KooWCaDuTzTxgKWimXxYjCLXhaRRZWjNAeMHDjnFVXmHBLss" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": null, - "relay_chain": "rococo", - "para_id": 110, - "consensusEngine": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da942cd783ab1dc80a5347fe6c6f20ea02b9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x0874fd88a7f24b55490cddcda8ed2a01d82f30d7ef71239cc3bcac517f82eff27a460818fed125abecc27af0ee8d3604267c19a3d425f0afac7f4b37ca9ebdff26", - "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00585c3f048e464529104f107867940ef094f453424f49f16376637ad6aaf07682421e7294b8ac642f7abd38003dc832c3c2fe14033c6598fc44b8aa96091e61417f0a13a8fc712fe66abf4cadfd7f13b2b7245b4a29654a29056710dc0f450f74bfb1223aaee0035a9f54c107749f8bc8a121373444f75790a1182f20a22f0bea69501c945f0567501cb47f968098f6cfd6decfc588f45699f6bf775bdde55197680553d07ef70e1bd2efcfe34e5bfab4baa2ee5dbb31f2b2f879432ad3dea0d0f87c1ad07ef9f2e5080ecacf5b5d390d0a0d1a4372a0fdb2a0ae0535cd81cebe1673eda7dffd6c7fc786f0bfb7054dba7daa4b94822e34a8a96fb51f0a53e769a7e1a0aee1a0ad2d652d68d2fdd5e33e63b62a63baee6a6d19c6fd0e508b024513f0a1283db1ea81df986affa6c888ee0654a2508070685053deacc07fbf63501d3a5d19146a5196e8a94107be81422dcac7d5160e146a502431c1972f5fbef4c09fcf9bdd3e4802e22fd48a94ef81db8e1d29be677e1e9f4e67942dc2f22452284d2de084e90e74baf9b42d039df042039df17ada3e6b4c1fa62a22db771811d9fe746cc896b165d0b9cf2d1ca49a01baac357ddaa24177cbfab403f58da75b63ba62215e39773e3840c63f4b4c553f64fe2e04fda6759a1f20e3dfefc02492b93e65737bc8dceba0fb851444403fe7946489335e4f8467d0b7a35355bb29e2861cf5ac29fcd698e6740a6ef18320dd9fd07a9e86178dbf40fc65fbe54fa9ada5f1cb9c4e01f117da17d49c04411a9fb54081f80b100e0a7fb6167fb5da347e651a9fa757e3adf2efb7b6146ebb3be256fdb7173b008fff6243dc27632a792191040cd7e3da0cfa7e884ed5931148bc545d2d4474aae97b1d2de8fb1fbde33d2b865b2d7486561d7a035fff4f77176344ba31553f6346fcfb173382c1cd083f8ea953efb3196aead41281008b85ff7e426da90156468017d4f81923029f7fb1220cb51ef200e5ef547b17ba39568f6516b354043ef487ae2dddf8fd1e5ffe737f110a53d7a03095f2216fc78fdb529e96db8ffc37199bd3af236fbb7e2e16e3bbfb4bfa93b51b7f7effd66efcfbe34ff993b12178e8ee8e1a9f5f6a71f6c5d890fef852ebf722fdf1657c9e7eef043ecbfa2e500b8214be052ded3d8440fc85ca9fae055dd41f6ab5df7b65ea72dbdde143de3bdcea8ac28f5af5ff911f7fba93eb9d04413adf09d076191aa24131d4faa08b8e7e5ed75fd77575a1d6f3f49c1a501074970753bfb4f7b3086fa1d6cf91061404e5e521dfb5da54fefb1191f7fe40fc855abf980156d4da7677c8e769d72a53f98d0d792f377f1e8ff069d37ffae55a3f0f61eaefb66cc4320b7f8fe28c7e53c9fd74fd93b165988c35a6bb623e628e7e96defcfd95967c1d6a599a49ee6f10a6abb94ee9d0fda7b93e6d91f7a39f23adaf91f67e3122a37fced3236d296356646c882c319d8ba99661b23e592f3f3e63aad1565774f43cced351336996369f06856965284cad9f7c8d34eb9fb6d44d6f76270139bd19e254bedc7e79ec337d9ab5fdc4973fd2963a0c48d2f78b15114bdba78a43f7dd699f3115fcfd91c674b1214c659f166a37f0d78ba121aa83cea8d5f8f2e75cccdaea8a5a3fd22ad3d14bad12e1210ac4447497c7e8e5f3f848e3b7b4fec554fd40aeba871b10d3b7ad223b34a601beb002145388410d8840d4b3d7dc36f5893feb13ff8fac3e5f949f81507e7e219d7a94ff3bb55f98a00ae5cfe91deee11fcfbf39bcfd2c91f7bb2644f6e3bf03ad947fee06a93af4adde1023fafeb9afbe5521ea5f2d22b60bf46d56dcff6aee9fc6801ec6e8e24bcfbe6bf509ea153e931515347e15a2ef7781d8eda12e51941ad020a6716bb2665020fff285c2cdca13fb42ab2cbaf4b86da83e41df56fdab45fb79dcb51de8e4cb69fb8b3d609f30a56777a02ec4abf696c29c7baddc663128ae40316569d6bffd6e0bed9757f663f264fcdb3fecef9c3b806c893e70c677aabfffd4a9eefe8018b4bda7bb9b89c9aff56f4e2731976e4ecd68ffe477fe7ad19eceffe3ac398a75a150624a4d892814884dbf7683f0d7cad4659ff67532a6fefb8b11f14df6c92fd69c6250e0b58542b9481bc4090f51a020287f7f6347dcd010e567ac483644f9af4e2deda1dd8c6e8e957387612edd4ed5fe7dd7cf5ff7b74fdb27f73a59ff7effcf6edb27b7f9c6d3ab6604cc1d40e6be9ae87b9d4e5509a453353b75aaead0f7ef7f74cad1f7262fe87b9cdee99ef7db29a755087defb34ef5bf9fe994fffbf757a7f8df6fcedb7e9648e83b55dda953f5733ad5d489a028a2fe57ef74cf0edab4e250ffd56132f737a7ea50ffb9ebfab4fbeec8fb7d9e9eab8d7e2e36b7baa2f357ab4ff7596b6c19c6f529c8697c53a7e0fbe34c68595bb53ebef584d4b24e59f2fd2fad3641f7a7a5319ddba7eb1923c2d4f5e9daeaf5f12d6de9a50539953fb9979d64694ba1d4b64fd277a4f89e6d540da2fbbb3cea45f7fda74b96ec7e6aa35f6d31d548bebc265fabc19f8bf15657947f35c79661beca53fce9b05d98ab4f397df2b77efb24fffb646d72abfbee799ac75983bf599ffa1953c1edc6c87b7edefa9fd316e34df6a93f33adb6f4a5efb8a1a1a1a1a11effd30671fe9aa34337c76ac4afcadc1dd9dc9d6c893c40852e9107a4f8a04b3424069d9bca9668e80aba74693f633f6444435cd0ea68bfe497727d671b5533ca5f335a25ddef779d8abfbf9d72bf2f3bb574ddd6237b1fb5f77d398d2963ef5fd4964ec68ac07f5b850f7fb63352a2f079da694ca3b6b43195fbc9d7d3e02fb67daa33732ef6b6ea047d1fb52a697ca855f8dba7f83c0eb5a551ab0e6a4b177b5b9053b7b93ef5897f731a726f99a69a6c7fe1dc4ef95749f79735a6932fd696ba4ef5ef4fd796b6c694ba4ef1efcfbe5ce39fec988a7ff6e523f3b7896164ee31556f3d32fef9aec6f817739b5b4ce5dbf6a99fa7171b62a96b4b57cd6c656e00b259da9cfa3bae51fefb7377648ca9b64f551261ba7df2e7691fb27eff99756aa9ffe42bebd4f669df7fa653ccb44a5a33eabf988a9fa779bab51b2392f64bdadb8d917ef7fd6e0b62cadbf6a93ababf5811fede6a3f3f4f37f315730790f55713f5f737756adf1fa753fcfeae77b8c73febd47ed10231a8ff766a699da1fe9be3dbcfd3cdb1622632b7870c86ee1758aad08599bbf00dd946f70b296fa091ee1752d0a04cd7c65c1e7864fbe6eac8f6c51ea8c8286314896217b1085108918b68848884e8455c42d412951089108110b78847885f4426c420c41f442a620ca20c620b220ca20b2215e806d886282586208220468950440fc421080798469422b220ae20aa20a620a2209e204e8926882588248853c41144114034e01a201ae019a019e20b6019e019900c0f0df804a8052e01320152016ae1a90176f1103c2cb834b894a705280438044806f4c29bc193c21303ac01a401ac0267006500630061c07180532016e008e014900bb00c68058603ecc26383dfa05be03ef01fb8162e8a43c1b7b816dc071c0c0e056e8a338103811b81238193e271702eb818dc0aee06e7c2d3e051f036f81737c3dfe05bf023b8119cc887e06578187c0ca7024fe341e115c12840339e111e11a09547046df0b078581e0e5e0e9e95a7837783e6815f711c780e2018100c900b0c033c4163e913340a3c057e8563814d804a805ec02f60121e1aa0086008a0142885eb00f60002016e0183f09ef09ce051c02a9e97d786e706d70268024802580237411fa18dd044ddc533c123c19b02aa4103900b0783b8839845e4414c823b832fc1a1c169b81e38343835b896be01dc0214034e0166016a019de05ee02e6824b4179d8456426be925c0316018f00b700cb00ab0086e8157805080628052786b702a4de571e11b70156c03aec1061670044c83057c2620810840e0014814a002410400a4a701d08bf302871c1bd80a3cc2a3c25f38058c023e014f6113700998043c058f8045c052b0140e018380a3e0280c057f803dc0432ba10e3cf1b6bc2c300dd80a17015fd15dda0c4f096d85ae4293d1633415da071d463fa19dd060f0198c4501460c00d95024014282e8274ca6cb2f0aabdde789120a20694289cf1248904c76259af82041325af661420125414d305001244149f83859a24493254890d4383290dc1896890a3459822409244c54a04911264c98284050123e4c983051001d2e0cfbc46749d012274c2c11840125328ecb366162499012271850024910134c9e2059d20455e2040394c67d41735dd8271af0f941f204898f124c24e1a30492271af031d28489254f9ef8280087e3c266604913d489cf8f13261a70447365ac4f9012259630510205890f067c3080802394f0b18005941ca1c359619ffc24e1b3441252d827414d7c9cf82cd164c93b28345952811bd7844d62c993264b9c0439e18344034c9a68420912273e4a305982819e9f249860d283e3b4ec0590280952a28492209f22605c1236b084899225414b9a2ca1715dec4f124c30a100129f200c24e1e3844f8c33c23a61a200978ca3227e31052fe8aee6120d0d515e790d6c283414b8098eee871f523fa47ed8ddf51ce7de73c7f13d7ecef9c6fb063ac737f239c712ba1d9bdc21ad1d6ee4d2f7c91fce877393b9bb5f8fd9cfa58439fa79fb7bcee5bab35bae5f37cc4d267d783ecc3967f773aebbdb1f3b8b7d70ef75b7d5ddd1353becb7beebdc3d1d171daf3b27d9bbe3f3e9efb91e1c3fd47b8ff93173cdab793535aea65f4dcd0b000fd735aee6bdf7b85fcdeb1af757f35c4dd774bf570353f39c73eff97befed70cebde75ef79ceff563bf696f8f31c6e7fac99b77d34f4a77d27229253f376ae8cefb3d276f9e43776edf932bfdf97a8e1c921fbc79ce6f6e1cb3bb3bf99c0e1e782835ea34dd7befd598b3bd5f8c3b74bbf75cf773f700e0f83dc8af1dbbe71ebb7bfcba9fe3661dde7bcc9cd3ef3df7dcebf748ec7c3ecef1de6bb6decd7befcdf96477373373c374f7eb7efc9eebe7dc7beeb976eef573eddeebd7ef39c7cceff973ccafc63de67eccecef39e79c7bee397f2eddc8920e37797373e39c93fdd8397ccc4f4ae7fc9c7bced79f3f6676abfd2ef332e35876ccccd0398e9199e53a0bc7d59d03bfc78f79a5dbd7d1397773737373137b107db043a9e686cd4f124a28c08409133ce0d8d4c8a1460d7613948492274d9438094212b4e4021760e234b3916e9ef858a089922592d84a4d7c9a684209ce05960435c180938d5481200cdc2039e1b30492a0264b9c34812489274b2e102f9043fb38a90012274c0429498209264c94e0fc48dd7082890c04e590faa1c763407af86081264b9678a26489bf0972a224e8c90e3d72d8f8042971e2d3c4c7024e9ee850e3f3e4898f93262ec04412489cf8406122091f2748943c5122091f243efca47ee8d144123e4f7660964822480905902cf1644993251530556089131f284804e0c30f3ff450c2070913414d68c04912397c3059f2a36363871a344a28f17172d280cf0f9220277c9aec98b1c00e32ebc393a0274b9cf0e9e1c4920af8386942a7e46301254e98087a824409264b9648024910130c28a9808f122818263e507c98207142c905706416608209120b345962010b30c1a4a6e4f3e4494e94f830490289133e4a345982a4c912254b2451810a308124c8099f0d4a131fc7d607244d9858f2c4890f1424414c30e10489123e4e7c9470c20492d40f3d90f4f0f951c28402487c9638094212e4840f0f509af878ccb6069c3071019f0b40284d7c5c073686de959090d0eaad5642bc1212125a4128b45ac5242bb4ead54bb242ab9513f2242bb45aaddcca855656921512125ac924bb5a09f97a92dd242b2121212121974468c542429d44888584843cc98a37c90a09ad3cc90a09759215e2242b16e22442bce224422cb4ea554cb2e2d54bb2e21527d9154cb2ab5527d95dad562b976457dc4956bc5aad3cc94ebb8177972ff044c906509c4658c4fd13722196168c12e6e65426a23a3f7c643f5684747ab098dec6cfb94dd01a41b40614a7357ee9a886b684ff04f2af43ac6da45521223a7a871da1797fb2a2d1aa69ab4cbd3a9356997e9f2a5fa12b454ec9a82c17d965bdf010dd2dd431bdfae44f32f75c659babf833b95450c8e8e72cbd6befa78f6c2feacfe38b0df12ffddcab3195cc3f4de665deb121a597c966cdccdbf86ac3fa2a776a465f6d22883e41ffab11a6af47501e7294fbb7d50550f75f7aead4cffbd38e4ec9ad32758ed6d103d5f8fa44901b5ffd473f5dc391c38f3e071c3870e0c801c7968381cc3dcca94fef79daa47115cf37284e97e8d3e8476fdb4cef47cfd335fefde85dab8efa9b5c0ecfd33c1493da3d551b34e66d6cd506ad3c1413d3d8bef7ea04a5f9ed544d6ae66bfc7c9a8f6cfb64d5d86a10a5a94d509a6fec004c69be1a4169b61a5f2d9a5f3a7a1c1a100d0d0dcd3f59519aed898d776b03aaf1a37f5a75f4bd6bf5bdf50ef3c9178d86e31753e1789ecee12dcdf49a15ec71b86f4f72306d40385f63fb3eb91fbd8d1b1b941a8ab35991e27a12e922b928ae9b8fc266cb1ce51efb286e3693a3dcdb3c57f11d6c4be228f736db3acac69b7e7d87b4ada368bec6afef5c9bf593b19a1af7246edaaab4b1555963ab19cd56336bab26fa760b750f54b98a3f4f4f1fd9fbc554339a2a52219bf99907e2d9fbcf9ef19999b9b9463d19cd9fc79f165fc6684e1e8c569f62d9b67d8a178df1177bcfd325ad32b9e8fbf8eb3b52cc8f029bd87ea102295c7421094456b041ae8a90031754210d56aaa07246c6430511fc208d269c810658e899efdee43b52903e8a8b34ffc28238820f7e70851c50818216f4ccebb1f958f6086948a1d7268569ca4cc1852fb6c0a08b2f78d19333032b44410a96294e10460f16eb1d75afd3297ff7427a87ab2cca7dcd59222b43747d677bb6feb8e2451630780b31a87ba08ce91ec1036750d514b6e854ad5c85bab736d514b6e8d3d2a5ee9ad3649f9c89e8e6583da15e4d21b78aaf061ae6cde897d6a7a3d1568da095890efd018a5fe54371bac4e897c2e7b734a0d1cfd13f59d1d1f6e47d84af55f7f2a7bb46414cf7d7b97fb2a26e7bb2dbeea9ca0dc8c16dff6d4c64940f788042a9a16eb322457f14fede9b14a69e28fa7d9342f644211db51f45b628fe287a7b6234031af8c0052b304213aaf4082d1957e0108518664c210e587ad651fbfe5144b15be6a8fd2876519bc951fbab28d4ed5f66f477cfbffeefab7bde9cbf3be2ffe33e6e5f1d75ee9d269d7bb7d500648eeea69c346dcc887ff9e2b4a5d32fc7b43610f067e4a64bdb0953ccc87ef942fd27bc364850533712c4768a53eefba53fae8e7ae643d8ed755b95bed58c6e4f6fd5449345c1c20f82efc1d2bf6a76e2ce94b1280165f5a9f5f1f77d64ceccbc55ebe3e3d8f14348cea6fca7a5698e5a4e7facf791f9cb4e595b7d2abfdd57d3fb9a591eb726b2a74b1b6e55ce50feb7b96d77dcd3ed94efb89efe7594a725fb187373ea9bb241e4ef6f17604c41e5cfdf6715644ffdafaf3a14fbfa83f41508f5af4268fcf9f534faba833a4a446b0f51cfa8b549ad5e5a3af5de893c85f9ecaba3b2cab755982ddb5c8ba450804ad4fa524903f22f5af5a2a232b8381a435350a9220b175ac4d87286f3f2a2cc4b63ea5a3a457a7fc78c90b63a834d77c92c83a2877ae0f3f4a52db5767ba8f388109dd2e5569bce3468bf3bd24513cea0fdf11d56847bd1277f6cab387df2bf36d7023193c69403597522eaafa553f3bd88feb9d5881dc9e82e8f23fd1188a915979f234581ef9ea9a5cd283dd4d3eeaea8cd7739ade3e534ee811a08be078bfc19add8ceef92da8f7ceb27bca2d61fa052f32f5f2814346e52ab421ea0f20bb556143bd25f57344a8dd2a83575189120a8dc8082a0f227466489a835442d26a2d606c44454be93db2e0fe6c957ec59ac9fa79de63d4ee45e74aaff4da19b63358598dfe80c7373eaf7fbfddec98686863cd0b3cdccdcccef6d3db27ecddcccdb93cc3dffeb77eddab57358984472a68f8c7f725fdc17ff329dfdec28bb5f6d57be6bb10330bdfab4d7aa78eb9139ccbdce104b1d10c6767b92f92fbff33a0ba1fb910ad953cef18ec2dc1d991751f7d347167ffac8629f265f3eb2ed53cda1f14f34fedce66e47dae511ffda4e41f8f55aecf7a78f2cfe622a2b38e0c7c7b0ad47063108372b52be07c74f7761363f6d34a653db20d0697c8ba3b03cdc4f9f99799a3933830db174e6a77b97cd75edf2c6784517ba43b2fd02cb10f58758a650dfcb4796fd62aa989fbbefaddf0d524dd47a2ef21dcf62fa5793d9fce83d8beffcbb1f6d10f8ee250361e361de66ab265a3d0b8eaff12c253af326cf42dddbd0767b98f9d7e2a266be86e67b9a791cda2eaadaa0330f8383ce3cd47679d4a633ef6030101b64696d5a1d0cfa35cee56c0a7efcd38e4dc9380ab51806fc4983a9e0d623938132246c88a532bfd890a732f3628c88cccfbc8ae6791ad3ea8dc7bea4d5d2c39fd815b5a5d06463f2b7f9e28a2c14e64d3fad0b6a4c6f684c673467ba4ca6af31994c6f61aa9a9fa38b312210b3b097231b3035de3d97b1c58c69ba6cb4a538b428381e04df8363c372e3c6e7f0f1e7dff8c957bc51830db1f4c6c360aa1c7ece4b4683f919cdf509e6e10dad329d79196c48539a6dfb04b3552617bd01620af3501c850f54a270931b14a6305b9d79ec171b32f334cfd33018911919679ee669663c4aa76adebd4be994e9ddfb149d823f9f66a65332ef1e6a5ea54fee73d0bc8a3eb9bfa1f9957941edc6cf60446e3cfc09b59b9f36fa237604a606b6dd18b9f1a637ddd868ae1ad8909b873fa7e95a8c08dc6e9e312237404c711e8ab3f9fe1b20a6350fc55120ee424d0f54a2a66d974735bd8d87d8117f9b0d0a539cadc2c7fe614760deb441615ab355f8359ec7e10d0d46e466fbc15efe4f8d0f620af337edbc378f04df465b5aa339953eb937694e459faed00b6a2c469fdcdbd0988c3eb987d1b88c3eb9afa1f1963eb9a7d1d88c3eb99fd1984b9fdccb687c8693b4ca94f416368429172d0ff74d329d3eb9cf3e46dbd127f733e6825f6bb0af303beb2898af168dbf1b84c852d2c7e7dde12247b98f3f83a9b8c877a4a3dc4b98adca0cdb6a462b1739aa9a6895262cdb4e17c82a179daab04180b80b7ca6ee1b3be20fdf3123fe5cd4a97ef72c46a7e0bb673236c852f70f33e2404c4ba5e7f192b694a42dc5ea8fb46aa296e6244a2d88a9bf842f65cddca2aa89c2af263ab38bb1b8f5c874e8624c32b8d5dd42f9f98b7c87c70a341ab5d4fd768ac78a34fab4f46d55d2ca45d4fde6b8edc78b6e9a460b94e6a0a6ce7d50531ec20fe45fbe7cf94279e377941d5f61baf7fbc81e632acc1da6e267ec6daec498db580973039035114259737dea5e92d5ac7ba6534c8450fe36d1b6f25e6545caf7bc4d48480f961b238efa3beadb8d117ff7ee5b65215e79b3150eb001787489ac18e100d99c81162e032f944bfeb3b4f52fd3d99afcc6885819a13596cfd3339042e7cbe75fb6b4d14fad5eff63fd842fdffdcce040dd25b53abf310c7b9eee4b6aa5ef2bcb5e6a55cadeac645f7ad7124135e8c44b6afb069afd7ccdeb307b9edec7ed4824a96d19d435a624ad9fc7dfffc89fefeafcc588f0cf399fa767cb5f29e5f3346345e4cf9fb3a46d74f255eaabe457e95d250dfbd69c66d8cf88159161bf181119f63c8dfddc176d48350314fba6256dd1a073a45d18116c73d2fe73a45d5bf7a8af4b1b3de64f2291bef4b3348a5ff227fdf606c45fbc7f92464d47f14911d380f8cb8af6b6bb63f42ff977e962bc0c03b7ac4f1b759ba94ffd4c857885b514830ccca03874896490043a4bbb41aace6a96dc577ff6ad0a15195120ffe29e19d46d40fee58b74d6d6446e553e9355165de8db9a3c41ddf3cb77cdfd6247f60953a8dcacc029442bd7673519401422fa9aec13a6d0f77503545a6f33e24a117a18e308d209eadffb4ef35fec0154f4c4a11a59c8028a300cb9672b4337487003155471a243951d68190a6a62cda056867a18e3084350061085c8890dd0f7563eb066f4c46d68cde8d9ed897da12632a041153c90c6d0500fdc86a20c0df1fb569ba08e04cc16b260451ca0f8f2a5677fa6857ae50e91307b0af56f4d88ec07fe0eb4c28da7e8d3d2c953f86c10273ad4cafe6abff0fcbb9bdba28080478f7b29323dfcfe3c45a766a8bf4d9c425699509ea24ffe3a5e30228aa34056790a2f50ff27f63347ad7a560d5400610640c8b26568a8c73dff74daf6b036e47450021b7ca00644e88902021e3dfc52647a360a08bae7bd1402f4f03b4d0a017a9ec07204ff134638ca9f8b9ec072c47bb73dc1e328ffb73d81e508f7bc3df18ef2779bce3aaa4a5a978888bf6ed1ae21044bb042062be4600b528855c8b667b50230882003197441060fd2d0b33dfb55e7881f1aeae19fa2533bf014a15eb13b19b87351bef7fef27d7c0f4ea86d9fde337bf19e7f36f6bedf3b20fe42ddf3347cce7553c1df6d90f7fbf339bf8e7cb7dee13b7c7f0bbe84fe0edfe3bbfb3f8de98cdaf6a989dcf3743f7c867fe39e69d31b6704f82f42c7d4c9e5e14d8624dc3091e0d76450c52699fc9b533324f6b1be36087f3fa76189e87bb741e0efbf0dc23ffaf4645085eaf4e9fd625e9190ef3ba37f7ff29df9ef713ae5fa24ff3d900df2cb43fefba9658d923fd264a3e4679daa36a4ef981a25ffbda953d63f221948a1f5077d6f6383307dd3d23c0afef2f2fd294e9fa4fc9bf84e9bdec40d88bfd0f84b248321ba443280829afa241f6a6c6ddb2719b5b73cf61773cb83a950af5e7b1655683ffc1d225ba2184ca1f097f6730c8a68a937d6dec3678711b11bbb7f1811f8f0fb77836cff1e81df1fb51ff84d84e156a156d7f16a4ba5562b7cebf9a3f6637dfcc68644cc487cab88d15b5b95d47ac6809c88f2010f0c5127fb4f564035036f80c317fa648baea8400474fe93159d5bb5787a5adad2913627bce2bb87a9226664b45527687cebb7ca74dffa870d19d19796766364b71ff9404fd0ea92c60a9f9fc7fba1b630175da2188880ba5f4cb5cbe33d4dae5becde30896434193dede894a3fed90ef7e4507f79418014844997880a2ca80967ee6abcbbacc45c86b9fae4665e0ce9de3d744fa1fb0164ef81c86c894ec117d22947e123a105851f81de713dd0c9a070bda0100885bf184fc3200b858fd3a9a61042f857a772e0f6b35dfa8c147011822e3c447b8f644b14822d9487a8ffec1d4d88ec677f69e5a1a64b74450a47d803d4b7ca43747f2ee61b145757747f37c84d9111755f770ceade890e751b5089fad7fd42eb7e3f8fafb67435c6801e28a33cf403de0109b8d021738dc896488a210adff9e74c010b58a68005264883fb47cc08ef80c28725f082045e2891252201189ef0104b77fb71adb693204981f60b7d0fb1214b440230d0d6e08601130d3251678d47c003badafe9c3bdd5c8c08107fa15b99b5ba52716b7589a49842fd1f66a46b40e13bac883f7c224b24e50b7ddff01b33e286b8ef6d974757de7879f4fb3fad366d0745d2fd25928285ce5211205074a115032768c2462b0678508321a32e32a040fbe54b1c48b40671210ba619d01a746506930bb4068d800b01fefc03efe25e5056700f18ea8a943ec8e26f8d59b4c89856df628673f1331c0defe25e5056a0ae90dea553351245a2e8856f71331c0d941572435561a1aa54df82b22228c8d16b6aeb28fe91b6bed52047e35b5bdda10b2da2722b2a2af22d282be2965e459f57e8d1843fe77bd87b8ca5156163447edecb8fa3f9f37acb9a8f61f3ad0b23bd6591267cef98f5d76cf9fed7945b8df07963ec5c9c5005185a501f74bf0063a8a1f3733f5fdd31953f1867d01de87e01861774be8bb199ab4fdbd647f8ee518b6164d606ebeac76dd13353119ad085f240f78b2678419fa085f209e87ee1042ddc10754baddf976d75c51c9f743d89ade7f88b15217ff436318cadeac842df3b46e4c7fa5111ac030b06a2aee8934a7f5da4cff8b38dc72fd25fbfd891d27350d30ce6af2da8e9f5158604ff591f6bccb6eb4bd793461fbf44c22e4d6a176664d2d156a1ff4dbf8c9b1ba29b6345624703288801461a94094ca0824e417bd0fde20964d0d885ce9ff05bd371659fb772d59185aea8fca9e38a8e2b1888f50fea229c4d1423ab8eee16b4551d5968fc56c1878217f444f70b28504155f0199bb9a218d95726f0e1e82146e4a7b7cad6dc6218eea532712f36518cd1c6c4bd44d9a796db0f7f7cf8dee3b6ed74bec52eee047373aacc42fddd0b7b1a9487286f4534d4e445398bd155a58a2b23eddaea8a8ede5a1e64d54971527c474e7194bf945935d1eaa4f00eb21ff98f5639e592533a35dfa2d2a91115556415f24aa72eeb839a8ededf1af14b8d5f6ebcc92872484a9143324aa7a4944e451e3d29a553fe9cc5e88db2d01ad41466c9e22fad4ecad00e32a6d54991efefa670533a65bdbf5381a3a253ee1d1557e5a29569d58105f7c03ab4a015fe174dd0825627a5ca29724aa7f68b265c41fda50a3a25a553fb4511183bdce3a8d08105f700ad4dc715dcc37b9e769b8e2b7d7a461c05f22f5f7460c140f056df268a9131712fb43e5951f742f9d90be5ad32712f344aa1fe50d38105f720b3cc1214e169a012e5164c7edefa4dfd389f06edcfd991b545fb2f9e66ec87ac9aae8841fb717a877bd6e43a51cc9fa5eba7a5d59f86f01b3af7eedc5befde5ddc1effc4b73efe9396c5f3afb8c3306ef6c71153394cf5f3da2c6df43bd278a4ed16cc5bb59e2d6df4ac1df9990e5a4cdb5d96fb71ef6ffdc3dc5bd382ac6d1ba136d327fea7b96c753164c2ecf7912d6a371b59142ccb2fc47c636e4edd2d3ac8ea1209e129f73fa253ee9d3f10dfe11c64bc557e1da79d7630ffdb76e8748af9ebdbdc76a227d791bbb3e2428a2f6831052f0cbd400c3dfed9ee6c1a59702185211d94a0688b1e7fd3ee0401841a14edc00d5974f1831effdf9d010ca5218c2bb0bc608b317afcb72861ee8eac77a2c807c1f7c80d4bbf9f7e9b3885ac7fa97b6f6f5e1e2d44fbf927b713e89eb7872ee2d4a134f5de784feef751c701da453023dece4e8a7103721eced909f10ab6e3c08a16745d89ee175060034ff736ae5b63ca5aba7fb94ac694bfbbfdbb9df925e5edc608bf7bf6cd067377645b7c31746596ea8fb7ff7bf7ac55a6ccf5e7171bf25eabf0e3cfa8418d679059bfdc166c4ce54be5d61cf9e1f356e18fc367cc1f6a3fefdd6fdcb3cfd8b6525b497631a6c6ffe4f76b265add2e542c91840ab749fab41f01172061840b2e69449f9688150cc1b382998c271322e40540745e806382d131edd821b57dde35cd644c76cbf6a34f52bef545949fc50083f27a2124e7f46c62a7bc55f95132d92d40b805f181e8f4c95bc03f58d3d971cae9134cd6a77d7ecc8f8934cbf8554a291fe485afcb129156f0e07befe1d08733c596c177ceb997d17d9e951fbe8d6b22e387dfb07973da5626a62f4eff5e3e3ff95e7effc807df7b0f0659477655f8b14367c709480ecee39866327801893698133ee7cddd33921c0d73731c12468caa65c1b7beffc782b14208e17684117d8244f409ee160a7f0ec1d327e8fae41fb50773f54908210ce487ce9c50dbe5219fc71953597ffa3ec19cb938fb72ab92b2f5a3af315a1fadff897d92d57af98ca9ac2dc8a9f5d66692da4ca6b34367c7a949cb037ecee73c8e6986a964fdd8f280cf6e3d9b66fa041fee5c6f5e47ba9859be8cc0f280fcd3b22ccb7a12c25799ec16af8183b95ffdddbfbdb526d8a59cb77ff9d240f8f38f13a6fbe54b695d6b226b2da8e93a762a73ce3d7dcee36875077d3fe79aac8fdbc267f9a3af10ca87f27fe048ab526e729bc9ae39f98a0fbfca975a13597c19ff476ecb2cc8fae306b577b232d941f97725195ec105174cc4452c46bd9c4bcd31235e046edb10ff07067d1f3be595bd602d745dfc7ea8fdc47f719b0ce14be8ffb6a0efe17b48857fbc82c621fe2f0b15f43dcc60b22cbb64de562ffa76ab52fb910fdfd266861961084b5811f930422d6e37a387bf74b1d136a4ebfbd994c7df65cad11132c41149983811650a1557588b4e35753f67ae9189eebebb3023bc832bd48bf09f19d464c48ac848736da77ee03fabcaefaf599da96f6946fce343ac88dcf8bdc38ac06d7a3b5e7fa44b0a737b6e0b717777773f79c454a73e2171a21eddc99d7bae5feb9c98df737777ceb917648c31c62863b4ac187f473043f429fb17a394728bb12dab65fc18638c526e3db2961db9ec73ce39f7de39b7bb6bc1fcb8fac411bee75af51e3b2ff8718c3c114a4cd5cdfdba1f34e339e79c73cebd77a26efff43693a1730c213be79e7befb9291b218410c2665e8731a24ff2ffb44327c6e7e8eccc1c995f622ae6e220dc7de618393a84903966518b100c29a59492a5b418fef0f7c3afbcdd14896dfd7b6bdbd1276959525a966549d9966559f2a594d27a29e55b9665c9ed6789221680d0b7235b22d9a7eb077d3b1af5fa1983104a189c3e65ff9cb8ee7d0dfb75b70e7d2747bdee18b9ddc9774ca6969d82fddd11055b280f74896ca005131b544177d025aa8197886d8459023eb72f0d4e777777b96194e8e656356fbbeecc41bcbbdbbc57701cf7fc9ec30071e2a873ce3dcfc2ddddab73cec144a04fd65793c4e9147cef7f4d8b9d6cd80f2b82a993ceb9773bd7eddc5d739a47866880f2c588930442f81e742aefbdf780983e59d16841cd411821fae4de5f8c114608b7f7a4b42ccb925a84efbd081f0c013333f3ef3f4c65ea1377cbfe7d3047f489bbf9ddbbbbdbbbbb999dfbeef7dcb5f333333747e9ee6e77875f4da676e9990665773bef213cffa5ddddeddfcec1e8f429ebd3d527e79c7307319573ee39e77ceb7e0ffa73efeedefa75c1dddd7ddf414c1537c6e993b384bc999c3b07b5f79c73cf39e7dc9fa0f09d565d8cd0f9bbbbb393417747e6c5ad73ceb97fd551f81c0c117d925f4df14d384f8b613c8d69c48658cafbdeb99f9133edea13fc08ff41f80e2b82e983f025a6821046d814fedb2a53e81c7cdb7a7c0f9f730eea403678e1428696a28cee172b60029dbb936d176db84297a80a11ad270adf44f70b28cea0b304f79db434a636318cecc6887bebadcd7db5b69b22efe3bf8ff27dc3e9137cf691c5674c5647a3949d8a30599f32272b1adf61b24ff15561705906644b54032e34872e510dbaa82bca85ce5dc68c30955b8d5b0d6a1a37551868a8c2e0e2725385c1a54f4be32f9dde34be2a8c2daa30b670e91d93a3e02f558561069d3e3255185dfab4f4096a7dd4aaa31b3692dbf6290635951f35551867f469a92a0c3454aa30b6746a45973666820f7f1d9a60546194d1a7a5559ab11811ab0a634b9f96f2b4ce6b98c64cc95ff7c50daea0fe2b6a459522a727dca3de5a113734c4bfdb036f473af030238e1f6245f0170ae44ee20749f7f01d1bb2a2ee65a7fc7dab4de3d5509ac69ff272293720a7717b78042be26dae4fbc8aec219843a8810f4a35c8b24edae5b17d5a32892c05e22f949f995dba56832aae0629e0e6ae0187f6761b5f70e7ae46917bee8d92f0e0839048632450539fe21e819a76792c8f86986b7279f4db20c99688065968bd68b7b3e406a1c115d4d4a778b176d125a241153a37c2e7bc7925092bc12cd5c0af37e8ba1a150648297e8da175448190dc437f95eeeb04e2e21efa839096477ff54d49c73a68ff68ab4d813010cb3dd4981cda6f6db5690542fba566634ffdae01b17caa39d03d551d68bf64206a2c8ffefe8b8198e11efafb81d801a453bb27de6a4dbd41fbdf56fb69fca7c5875ad6a9f8ea7b8f0cdffd7bf72beada89a335a36db173a188be9fbb0310930f19aa6a74658db4be667467e8be8948d32ccafd0da90375cf83ba973fa8fb8a835639b33cdcbb3bb9b7b44bcba4d491be8384a3de571ca6f935bbbe4a5a257d3a29de2a0e247c87a538eabdbcb62ab3b9d58ca5d0f76eaba6f793a5f80ee36051efb3981204fa1e7741dffb5e1ecf89acf2107dd3979b34b33c96f250a72a0d8dd2a9fa43ddbf1f69d99ef82dedda13bfd4e49ef8a3e6764ffc8c0d99c9ae217288a3bd013d419ddbb6f5c757f4e9fd953ebde722ba3956518857ec110a93b74fbc419a2e03d11ea86e67ba6f4c151908a6cbdf6e734c15a19c92e98bcdefa35633f7df53fff4e7faf48e2ca6b2e2bfd1bfe8517394b1916f414d47febe4169ca6f01f997345aa8480f51a0c9ad55d75811eec4fa20499d046594c2e7eda1b5fa287cd62a07a8bf6345b8b5f19ee011a78e591a94a6d6cf783976445e8b15e1d4f266278dbeb5ca439c8e3620a7d6a62de67253c1cd0d79ff93f9f7672dc42b77cfcbdc1c158d945966323dada9f97aa23698b541a9a1566a7c7d3fc26c1a6b2b50ccafb14951e3a3b061a3860d99988f22fb286afe8a593af317cdcf78c52f7dc45430d3aca7d180ded7157ddb932ccb7e66e6173b02f3196f93def3f49c7b591aa6b193f80638c4e10bb51ee8c98a4289d4da3af5e35e3ec38fffb4ca1be4c557fac957cdead713cdbe9e68fc424b3f275f34ff34ff5e46fb46494a73ba3efbed1dd263bfbd23f335bfbd13f336366f7d8cac79eb65326cab269abdf5246d7b671b95fdfb4bdb46bdf74b61be50ec1b7e7d22486f506ae8cc5b8f69bb3cacadbe1f3d63451c0582ffe4a73ffecf7b1b10fc6a61187ccbd2aa5b5affc3fa47bd01cd6c56a488f92b26e6af2ba6c65fa659f3353e8a9ab7f1515c3f3f8a98b7f13046db45d96c55d2ec2f6d17953d8d569f665fa3d58c66f197c20cd15d1ea5adc6edfd68a969daa8a1194147f16da21859fcd18fbec61f51ac487ceb9f661d8945ac7f5b756a616e694bb1d9d7a3d94a3fa3951ed3accc97d1a4a3fa63b4cc51fd976672543f8c56e3973ed3aaa32592b68eea9f53c362bdd4acf70f7bfe42475bb57ef40e538db61ed9e81f56c4fad156b1cddaac5cff302b52bee7da84747ab0bc9f4fbb29e2e87b491ded420b69501cba5d68210b74f6f5b4ca148a05ea8a368934c8e9fb1505e2f7726adb7363c4faf7d6f68a80c2546e37452485cf24d2584019b1c002422c201650ca88059458400865c402422c201650ca88059458400865c4026201a58c5840898594128b08a5c4224289859412462c64845860f1ae6018e374ce39235c146e4e4a9facd09fb58b108e21841612857ed698382aaded32f373364c35363236359a49b35103d29460b218179dab41c2a0e6622ccbca32180363600c4c566a028f41a33189465b0a53992069d9f2c89a98d1e4a2222591367e192b9060cc46a202a90a648c418589c6f4529a5d48a40c060626cb60cc1460b2d214c818830a3059690aa597c15432980aa6bbf49d6530860a3059690a33a4c79607b6ad0b01c203238458cc12e49530a235739121af9057e41528b897302284a5e565eeeee66576aa66ee762f46e8e565feee672764fd3ccefcbdbcbb83d8e50ab18b8c903e3907b8382a51801a902edc9d736fcef985835cc4cecc2558cab2f71e0c26b118191999914c96cdd0d0d05c34982adb88500393a4d2cb27af885b9c1719ff62436211cd9c7b8f035c1c9528382a9913e218668676df63f667de7a64710bbdaaf8765501638c31c618638c31c668ff1ac5a0fbd6cb9ad158f4ded31941a1fe8b72bf9865b510754c05af2aeede55858c31a8e09ecbc8bc7755a1825f55387655a0a171f7666ad4b8c670e776fdf7bdab8abb7755b9aa5c55c418c36957155768ff55650a5795f7abe7786668260aa522ea3f570b30c627442d38a662e24e54895b9c10b7503729dc6297e50146c6cfe3b10bf58f5b288c30c287714bdc425da9280573fac898dfddb9f754bc2921ebe5eed6983013b29572f45008ce6573ea3585f6cf5df776f7aeb8414660e05163bef5c89c0b75c26e9357b4b823c0eac148a5cb8a0012642891640b9325fad4cfa5e4e4114608010244880be32122021b629f3708a7e057de8912e38685b3b77ef89fb5adb3c5db0fd7f1f78e826f3acd69d3d957a979dd91e0632a47d4a95d366060bd3822474444e445c6ea714445705e382d8ea84ffd8e48464666bfe5950b53b90de25fa526af6854bfa3fac2ac988e40434363c3e4887a26cb6ad4a861aae1cb860d4c650353bd777fd68c90f1bbcb2bb366da5cee72477044db43ff7eefc82b8e6a95bcc245b6fd4f9357f4a9b3d09657e49539e7f59ca607dd63c8aa89b9bb3377c74ac8dcf63d865d29c58b11bca8d6b9df7d6642b64c9c0b1b21ab19e59f1b23699707574785f2b6721ccd70541c15cad2a96acb9c25ee82bbe02e983897fa0415da5c98d01a13e7b297bbec94931586b92c2173ef0e062abfc20c99346eee6579f8b3968c9f7d5da79a3817eaed5c9c4bdce260cccda9338bef58d2d24c196df73ae5e8f284f19a5dc8885eb60c7191d22572298a5c1c7791595fbd48fe88c751fd72b5580102e45956a72c2a2f69fad31619e1a8fe488d581e5932feba45cffd7ba3e7fee36d980e914e0953f9933095950c06ed1fdf3dd4b223ee48980a42dff1dc892883893045745d95c88576472e8eeae7e9c825267b9794216147fc97be8771df1c63334d3bc534832959f222c1bfe8cc4237070686b9be8305be3cc23d0efce0ef081e1a1a92560668f3a2a43b24a4600102427f829cc63fd1558ffcb9589128f241800508080d72eadeda5d1fea8a3a9115edef71da5221da4664a8bb163be2f4bd87108b43778f8f1437280da150af60bb1ecc32b67449430b185e70b77b155ac0f0e2bd76770ec2e862f4e618c928430ce7580bdfc2b9f74a10c6e8de83b014a39496b32c6fb6ac07618c25a984658ddc68e4cda3118c51ca926595462357419fa8d02ba467a1fbd2af50cb52c116232ee8fe488b3e3995e954d0fde92ab8dc7579f37595b1050d2f5d7cc8a3a4b1c58c32c8e82afa0a17445b6801c38bbed25774155de58c2e1da5a5f4501734cee829ad829ea20b1a6770612db600a3484b37196588b10517ac056779a24fcb43ac02a6c253fa09aec25530153cc4519ef022449f564b0476cb92d1422cb16728318410579f36a74fbbdd3f36933fce98db2908af22f8cb6b21dabc3c3c3e0ed0e62de2ae089d3f6f0ffe8dbdf92e08055e8e15e1deae428d97c70a72833167549c75a9c790bd928fcc2d1945e018b22ae94a3949cb63e89fcbccddedeece396bd6b001334996a96666922c7f363964d006e7c9942e1b9c27dd9d73ef3d08618c513a29bd594a7f363964d006e7c9942e1b9c27b51c01e8019503009a8e0f3b7200407310c618a59496658d46a3e9e6f4e639fdd9e490411b9c2753ba6c709ed47204a007540e00683a3eecc80100cdc5f4489d628f1f313a76c8e9f123e647a339e7755d18869148988af4248cc8965ca9e4cda5923f9b1c326883f3644a970dce935a8e00f480ca01004dc7871d3900a0b9981ea953ecf12346c70e393d7ec4bc0080184284024100010c514408200820006bd6b001334996a96666922c7f363964d006e7c9942e1b9c27b51c01e8019503009a8e0f3b72004073313d52a7d8e3478c8e1d727afc887901003184080582000218a2881040104000180fbf98ca000778c6543ccf387e76632a22be0bf0eece612a22de35bf07e4799ae6da9fcc98aa6701df98aa01df47fc747777f9c81ef00e5341e01d123fdfc3543bff06f073a183d09b216c07e5e8ba91c3b5be237bcad8b2f3b5cd48c0d7e672c4d7eeb280af8d4603beb61724be761a0ff8ea4310f8ea5124d05538f2b5af4089c071001e210508820c205fbb4a184ca699992cbb2e23be3a15047cf52a0af8ea5718f0d5b338e0ab6f1181af4ee453e87e1c800422008107380089063060014728200108d8e93122e7c806773e880208e139008e37428401fe81ecf40ca00041f008c1c1830e383826d3cc4c965d978dcbb23095017e8e2e1f19113f1acd39afebc22e1f99011ec378f8b9244722793389a4c3e8ba48594cece92a0cf0b5aff41546be76962d88f8da5c1079a1058c229a066d032a002008408710116288223a7ced2a61c0c17993696626cb7a4b73e9e2c5875c4a9341f7210f456805f8013ccf07f144bc903722e471188087a7830054408aec0cd123c40088146048109427881002e00082877f1c1c93696626cb4a254cc5c3cfecf2910de0334c15c467427ec2c0c0c45c3eb29e8fc15405f8189e9f3232980ac7cbe8f07367dccc8c37cfcc6457cc4c0dd87346171c5f198d205fd98b90af3d3480af1d2588af2d85e76b4fd1f3b5a714e06bab40f5b5a98461e72b8f81fe88a9538e8e1db8fc3f8ec9343303e46b5f11c0d7ce02c4d7de82005f9b887e6d2d427ceda2ae42f79f0e2a210ad043798220c000840011440038780092b3b3391cbf838e9c532abe8fffd1e3ff71f0a0838e1d4e393106c3c131996666666630558f9f34978fecc7d3d0d4a851c3860d1b3dde648af9b935aea6c69b6b6a309acb46cdebd1a2c757de820b1f5f9948cb8faf0c4691186494f10367c13da05a0e00a002d0c30e1d1f1e07479a4c5dbcf4504be9294d85b9d07d17f383a6e375f8d3eff03f3ee77de47cec11e398c6e37dc0a1c3c30e1d7ad011801d50a72d07003147cc3f0e8ec96432d55c3e321dbe0653edf035393f6d6c30224c311efe0653e9f89bd34f1c1c4c151f0723c237dc8d1bde7ce346cd75e37ad2e0a128db579692a3c35756c10ea7af4c050f5fb98a8eaf5c058faf7c05c7d77d03ddd7c03f0ecc21bb644a5e24ce7fe52db4af4c94e32b6b01c0572e427d6532767ce52d9c85ee3bc663870e1e50a71d00a0434e8e4d8b319f8363ebf825992bcb016a371a8e8df62f630c2653ca2ef81c0ececd0da6b2f98973f9c8701e07e7c60d4c05ff064684a94c66f3eedf9bff1dcee53d3948a0fb74bdb0f9ba5a168c9baf5bb464e07cdd3276cb9ab15cf68c1bd624c1d4b03163aaf9ba443f9449314d792aa72a7ca5df0d4d46c33efbd2e368d78d06359b9c9c11759bb564d0fe1aadae18b4dfa46d9f62b6ba45b47f06dbea8241fb6dc86c75b5d0fe1adaf6a9b4c16c7589ae8da4fda0fdf37d6d5affc60d4cf57ee670f9c8b0cf0153953e87eb270e1c980a3e0e8cc85f3eb2987f4c25f38f11619afdd42e1fd97b0d53c1d73022bcb96df3e66db348dde31efc9a43b7f4f5447747cc571d99af3f68be02a16b2d1039dc43fbcbafabc5da25a3ee96e54267f679479ffa6966b6aa23b32346db3ec16c9956d2b64fa4ad3eada79e5b35591bd4ea298781406d0fad6379f4c7ad0280b66fa71c268e6b7d877bb2cc64fa3f9d74e8fe7a05727254ff889e96c70e32fe19a56591e03fdfb17ad6f1ea09f16a24c42b89c3240b39441b3e63aaedea53b3b62eab33ce6dd369998c9231757fa141e53b36e4a27173529090b113d7dbc4bdd0ac5db77b71f7e29b9343ee9e0619204c1c15ea58095905427d8130108f9a903ef9ef32f306208398aa533c7df2dd31d5d8bc73d99d9b77efa4ecceccbb77537687e6dddf684338cadfe66bdea4ada36c541cecddf306a9f1eedda6b2772f3715f3eeaf4dc1bcfb6c77debb376d4ae6dd5699382a343efc19351e2049c8e25720429ea787f01db785a3fc6556da6a66f277659c81694e4af9bec8eaec3267174c6b0a862bc38ad46de13b5266d9dc82fa83412f2fb38ba3da8bec479ffc1babb1dca4d2d750d11411a9746246db4591b62d22a9170c1b725124c40bd3a0177434bbf4a9491802ac9ea791302b7f848cbf3ec43199608964cd6419298381819917a6397d5a898ba354252e7d22020cccc55d64555ec16617e6229b5d3ab5543251c6af85d6d9e50af587c11060f5cc2e8ef29f5d261ad34bccec222383a998b8171af332982ae6a5543642e6b2678d897b51c13c4f4fecc234a65c50f9d59541fd65b4521704583d6f2b7171541162b4d2197df287d14a5dfae42f83a9b2adc4850819ff9c818f2449a527bd7b87bdfb92b6cb83b42da6c236d72717afa9d59216ea3f9a5da8d71217ea1f3123f285740a08cf569da48b392bef1773547ab0347154a893d9423787902309f1aaa18c14456250ffcc0b3a53b319e734dea24fee9bb7f00be31f700ffdfd9be350b841407c78c47b17f9e116ba1fc5e3774e4619ec62d02502fb9f67449c93449cfaefc354bb452a648e568f824781483b6fde07f97df3a2e5b145c6dfed3798cefcdd3a3aa7534e4e0236f72c9392883ba69aa1957d73b0f9dbb4df4f64375e1efcbdf1f2701891778300ebe51f111f7e02b6274a14d6b68e8a22aee8c38840eee68b48a4fd2e2df7ef89b87fbf9a733593a97433c48cc488f4bbb7b022fd6e84791371df3fc28a38e91a7fa1250b1be296466c48d3fe39ea91bbc7712d8be456ae2d34cc1e62e92cdd14e1df27c2bfbf8a54c86e8c6cbcf589b1047027a0dd13e0ceb904b8f7de7b58021e841042882500c618638c09883dee67c9a938952d5bfa4a5fe9d2658b2d788887560be5afab05888390492c01b2c7fdb496dbdd835192fabd372b6e5b4779ff4d11baa28b0df16dbb631b306f6855d1a82bbaf4a5ada2aebc2ffdfa4ef6a497be03f3a4ad966a90fbd2c3943ed3d65125d284ef1d6b4c2b2aea475981b2026505ca8a26b56342155415a82b23e73ba5af3b74d96a7cd7f39dbbcb2f69eb28b9f9e645452492e5ee1e47efd61c8dbca80865456662b725730e55055505ea0a87ba82ba82b2026505aa4aa7aa70a82b5c4c0c29c851f8d6c7fcfa8eccc3bcf49d9987911f13ddd720f7313fa3adcb68eba898ad06b91dba14591fb3225794694545ee5156a0ac405981b2a2d40f8a2a9484aa82aa02750555055505ea0ad415d4157eebada222ab7f6645308f7d6f35c88bfce75677f042e7afef604f7a186d1d459aa49f6f13c5c836265e542a91fa31edd2e656475b90a3113eca0a9415282b505654a19b438847eee9206ed9628673a1fc5ee43b7367f4d5c928b27e7091ae0b758574bd0442567d8b6ff19d4814897c4b24f22d91c8b76891fd58ff688d44a448d429ecfda317514b042316453122199d22c9f797d786aa02b32c54156b435981aa12b58859e216314bd4226ec1d88b5b74eafaa266a86469594a5349cc39c7d08ccc8c200c2000831600302820120b850382a428ee031400138faa4856429588831c4671140429650c23c4004200c008c00c4d6d13e983bebd7ced5df88dca9b3eb7edf4c258c9d009a5e07ef7df9f575a1e6edd4737c240e6d8d5f416bad1c60df992a0523c9659373b1e15febedaf271671fa591044e6307d543584f855e2e7693498b7daafc7b45cbc39dfae04618781fdba15e1850b86ca292add48d5bc24d8d32d0b832afd4ff21162706a629ebe0e70dbea87c656c3cd3eb47aabdc6429dfc4992aa1a57c0e10ba6568efe634c854ecb65334952286d32e54d159428961318bb56d295ea2451b183964ab47950eea47ac14fca87a7947b4b0b8f94fdf455d055f8b3b552d7899570ba5223014bc9d2d3e8555b60734c41df14d791ff6967166734083da96c79af1d8dd28351541e5a5169c108c158b914198f324da9c8ab5291c1a754f91b859e6b15d04e3955a9c8939a9504370ef767ec4ce8aa14dc28c15a2cf8f4b7e396ca2c61ec78c464498d0b87516e7d3f4a3e1596ba67b47670b917161c6b59b2c5469ecbb68f229526dc51885548e089bd14ad412c7f0960f752951f60aa7c459c0aaa0d9f864ea3e952131d4034d40aa2bf254d6a3bd0ce752e30ce53c6b0a7d6925de1e88f6bbe6c0606577bedc27171bb9a19e1ae0f1c1f14f7026721fb7d6a39b9946478a62c0bb065754f9739369a81a5e36d163275d9ae2931eec375977ef0372bba6b5d61d3b4cbaa57ad1c76d04735b27d2957d4effff1576d677b9547b0c3f772a87dc25a326cdd01e94c81ac3f4affa8536603c17f92e1297f9d98c63502e619745182bb2affcb078c1e06024e2de8df84c5d9350f6038ccf41afdf8839937815e1fc147cedfe4fbc7ed8172e6137517ed70df77044963af7141895b11c95dec46fda38f52692d0717a794dc7e742043e2f052a000d0128c03824bde8b7626280dcadd9110f3097efcfced8fc0a271b88d4b74772d3f67e13630f44cbefac0313e7fc01b96b87e5869b65e6cc5e8fcf186a880d6b156efb19de0fc2987cdfa9f256e8bb721ecec7c44a9d50921d42950fce323359cbebdb067938e82817b8a9d4daf757123c02f8fc4830d88429a150cef935b01b67f2a94fa885c721b345073f6f5d3c7d004567f8803df7942e68f5d14374c3bc38c928feb42429b1ddbbc4b1c783ddebd9acfb1a3807b1eef04d412aaa23ac9334c5907990fc51dda6fcbcb28386874d1614335f1b9edb4c1ae4cd6d4dd21346d265ff8184ab3aecd77cca4325058bb23d3b7896086780544c4acac48f7dd1d94f614a2cd910d0d84bacd98cc0029f8c01b3e07e73680273d018bc243f4f27bf007d2183e14cd01dfef5b0f6a843e024216a2e83110f878c304cc2062ba128111cf2b7e9206d14164c4b01060b24eaa8bbb54402a3a02dc6774888bc931452a3ad27b79011d355716e3f6f39e83b9f1a9ca242de518b58d285207ddf6e1e2a30abddf7ed53ec833836a3d1c4a77a9491e0410caac632481785caeba7783efbeaa3294068fc10da0179c3cbf73beac950db19e6d73b113c00d36e5d212ce57c82d20f1683eced85900833135794120d6458be00b423bfaae7fadada48f3a18e517d08ca00c7b7a80fd440081e63872247862591a5c14fd5bf846be5cc549a8480b83b7a00a38889386015b2601eaa3d19c240fe5c550469715f2148eb415186d0a4407df42c34c93cb7496f0303695d4a7b7a69438981536d2b4980d06761e99249fd8cfec7a486390b35abd7cc8cbdac6d11fe74b0f8a7c406d0fe1cead31d8eb132840376310ef755a8760266e5977ef66fa5e56c5c620e5ac91dcbc03fb46045737df94e83305e9462d70178370701342970ea4d23e125b0e6c8ecec477c761997223029b6f3a082f154e74814438a2412476198eec2ab470af228c979c850616b266e734e46b1b97bd81085ec707662025118b48055b034f12fa1c0a3f7308e24e22c1361c6c2e078b546e91a40797fed10c6713122d645d03bab2ddc70966b9fc92acd7875da2cdfb372f606f3dbf01c10d3be6108195a5f22fd99e8d33e9da8ef53eaccc3c353c93b7e70c5938cb68cead73859006d3b6b40b589cae21f5cc0cdaa36dfc80242f9c19b0a099a3888190b0233c66e59222c7c28b55bb2c9d8e2ede50fe507f319f3db715f537c9105bcd55585b15382657296121e1efa6bb491ad58883182ccdb81d8cd0f57e528cc384f42714b5365712a326f13df4809fc4db8808a176310963a50884b495553f63701d4c629123e83cfc8e73b9472a6de83cac4d5f9cee92b60b6622f39c4a4b8d9a485daa215e0e08ee3c553aa8aec0abf41ed5056e49eec48afefea824576d17e3b6eb30d89a44fc8db1efd6bb44501a07519f5cedf50115751ea422aed650e00a051490c4ce5826016222edcd15459d5714697e5436df1e68dfb07ab6c796d17a81cc7c29481460ca42feeb790d0cd4d439078aa379438e36fce16121bf744ae6de8e9100dea03deeb23034b4dde117ab6e9facc63f3189f49d5d651f6ff956c5890ed8270c88a29392afd07630323a19faf64cfec66c2879dc87b5a55fd2e78b323cae510d0fbed99f3c50244d1a1c494857546e8a5de1142788195fed7091d3c0cbdf70f7e605d3f9ec02038ab22b3a8fd521565a616c0a759e2ba6403e30a6abff61285ee2586181e040e6243736717b2d020d03c3c3a97893cb43808840a2ab5d2c1e03a32e4dda7bf132f29c3ce7b2ef61f72f604b9df7f04e0c50bfabe5c7d44537b353886a45d5d0912b8b8fd6109896247da79562abf15380606e6cb319f14d91298e965345e31806bf43fb5a404bfb8ebebba480d140257ce243feef006b55b41b6ccf223d2bc0e2d3702b6dfec00461871875ef4c732447230bade5675c8202895793c610c061ecda09f18b89d7466124f319a860aafb41e5d3c7d20ed150e7a39dca6a2b0b11332a3fe8a3e1a3a79819d7343253f3a458fb96fbe181e4730d2cda7ec44e03d1128ed011a1c5d097c1a8af72515be9b390be0634d6e38c260f0d3bb62fec3e4b5bb83099e9c8d1ae65e823eaea0effc54eda3ab923b581f7a5549deeae9fa8f45ee678e7233632f4df0b6584953f668da06d78464633b4a5b76556d92fccab8a4efa656e386a9b56577a030c4e62b339d2d35c2af75516cd3c376420423215de3e53b253cd732374bec067b56f74c36484fd4dbedabb2b8483ea9c8c52d9895e08a40a1b6525da723d03a5e07f8f7eb024a98ed20c925427e5e68849259222d04695c7a20e49cddc14d2a2afc3805b304f34b4a3a5127ded5ed1a3f585385f27939c191b42abef5477bd610030b0ab2a93e1f5a7caafd5e8a5f262770d0bdf4a40963018217b603c08bbfb368c81db5a46e42b3c94f2ee0e99e506c8b44d7767b9a738807e9edc7676afc002bf5de9edcee0f04885ed4e75e7108bb43316ef4e39d0bdbe2ec5bee818ffa04340c14f16d6dbb7fee8fc0ae06696d8d5f684d1f8fbf9f92ba90d9ecb32d69b5cf8f58deb3c0e9cffb6d2f0d5718dde600dc8c0ebcf019dbbd5a407358f5c9fa69c013cd58bbfb0bb821c455ae54bf00564e6da351290911838062f7e338c44a113988cfb068e8a7c165e9b668451d4e51b0452ae77a2f7a9b28f90b36a43accdfb05e9212e925524531a4c82dcc6e5923c869e5fab1260c13fe49de9fcb5463e0820824e48f0f9851b9ea27c1845a68a6a210e0cef1a0de376f665d309d027c0b4aeddd7a48ba001c5b2330b233f211356ef6de6343e040be81a5254e25723d0bd19b3cc105ccc18a7dc26f42f93d13f74d5c03abda4b2791c4ddf2ce2874a5ca81a63344001adce9668a1fc29de332d55769509735f92c8eaf5bb9eddc5037c724dc0d82e68550eb02c82033feae47173780c104f3d83d5c16883d6d22e896be33b483957a140c7fd455d57555625025677eb821788bb5c57b2131ffa223ec3bf5c4ac77bb94ec6bbbdc32ff656cfde058585de1360d3b700a738238ea5830aeb94329235c56e1ee81ee787cb51f5f9dad52e32d01cd57460b468a4e5eb8ec29c1b10f7ceeb636b70f913cb11d37d5cbdb8dbccad115d0f6d3ba4d37bbb2cad94c14982b5b51a5cb921782153637553285d59f876518162d7e94a2e98eec0057e86f33659cbc6f44ae1a9d6d60bd7a5c42bae57537388a4caf2e48d852cc36bd233bd5b4519c1eb2926e6fa0ae02751322a5fcb14d685ea451af5b3ad8daa863a64348ba3c4caf7a8fe30ed81be420b28ed4bb9fac68ab22d23e70a3e6d74067dbdc2ebaa8b1c2a7919631a1298e0944efea93dc1ca42fc13a085e702dafa20766d60fad635057aab67670c1adee186b81e54e161242a1da11671e7ef01126a4c3138cf7f75a35056f90cd53face84a2da773138eda5daf630240239dccda4297e39155882ee49d290cc09111193246546dca99083e2651a96030d1afba1ac845e1262605109fdb8ff34f78029b7371ffa2bdc22642778cff2524508bcbb3950000855502407a6aa4f91c1a35c9a5c3ce88064e303533ed29d025a5a94fa4c80d4f714cb529a96c75cab7decf39b0870901ec4b9cf60c4e77ffecc548efa1209ff706dcc9e0f388fec4a17f165315478c02bf215a51f4191f581018d14b5706f510bc427d9f46fcc7009042ecd69d8e1202cca9fe952c44e1111951bb1c73621f8efecfedfc8997b6480ec9d13e5148f2fd2d2dc55e61407fa58a5abcf715b341117d73ed478ef8ecf7a4e1c963988bd899905ca0bea7dddb35859741464223322a76c1f34fc3d3d1c357606bd312402fd1e3fe0a36782063a7ac634934d8350623577bc0a5bf69d56b53df50dc5b1a7d491d7560b30706e0d73749a7cc37d30fcde2b7697af242f7301a6f5076d38db9e401a0779518fee920682931bce4aef4d8865e8ca4b078d0231c62d77b34e65bc776b0dafa10ddedbcdcd805fdf592f6267a4680ef6bec75e3e90e40367253164a9b4dda4eea7c643c0b61e773abb6ab347417f39dd4cab534e624a295b5eaf9963ce60c8fbfe9551eac6d49a0769425e484443eb3f08a1877b30108b522ee48455b491ff98d64cb5be470e69425fc4d4c7e8b237b76b5c9019047b2ad0cebed4d67319b7dff31ccdc0b97e2893c2fa854b3c29fe3e003bfffdac0b63e727d0d8c84feb7371ee73d012e0a2fc7f2b5c064ba8762aa0ad5ebc029c008cfea0462387ce691acbbcd5048740e3f9500bed288a4ff917ac8afa87d1a29a62e9925478a6d9b8672a9e4123ba48db345d689805134a5155b417c335452c1e09a8c060b291ad8ccaa846094751b2070a3b73687661ea544918045238d05134b262b2727d3969296a911669b2fa960104dc68b04148d6d66554630c8bb0530f8ed0f283d4363f72151ce8901df66c2955661381ba274c1618a8e3611142e8ccc566583d44e920b4ba7cc3a47aa86a1258d121344364e63c492d9ae033c3934ea95a438e9323a29172bb03050013663e686c44490e38ac9932a4313dbe80c53e695ac314ce2d148a2868425f3aac491d44927655394b5e6b9a6a9b657b775193e19268512803e0a676d5af4c3a4423d08a621bcd42e00f279b30de8f84881e9ab7db44fcbb9d33ce30296775a5485aac4472cf0301c0eef2cce9a2a36c64413c3fcc3d0295165d0da39c40bcad3c6853ff8956bce22134faebd6e5c5e108d5092bd66e76ec11f455b84449c512f500afd470d5faa601716dd56c7196698c134ec2ec69c920614962293aac6388fca8b588b940494492ba55cf966cc131b313532423a2005a1e777a1a28079a501ecba9d3239a810a6fc1e62dacf51efaf2116fb1cf4f9473390b1657ce04b4b06e931066347af4da04d300af5e6446de20f469d1f060d44b768d2a7811b4493608c84d35b206189776f614902e7411d05311238e4cf49781b664079ab7fc0b0dc8eb108020a0ea04d0154a05e5539075f52d00b9326b7e114e4b1a921c8fe606f9fc4edda4021c6c5253a30f47a6e4e62c0dd6a82e4f348ff8d51b468c0d3d5de857461a82c9bf6f62c2e6df01862659f43ef2fc398f638f4ea6fbe93a9de9723d69323c43d85a4135d94eda75f4dbdb13ab62501771ee46f045e9ebd087c60ea68b2356f7326b82d2d627b11ebb91861fde571de3262770cbb8305bf69194fbc63c20ebea4601fb61ca08149261ee9a4efa41289a22e1892219272d1be0d6d22a489d46723a4af8eab2b6332f109e58809d2a555c42c7c2448cb96cfaa01d9bd4b3069a919e63cc6b0cfa19f7e64c44c617c809e14a4c218c0fea4bc822c179ff57cb15c97e43022f16ada4470c7380322a6e7b2208c89f82cf063136db373b7e869cec8b3f4d3c40f3368f70009ea7cef582f863278f66f9ba131b8b111087db919a333a24e5ac862f34310cbb1c7a84a7ac301470643228c99241dc780e0d197845c066318c1c0437656bcd448a09f46bdecd2c1a241a6bd37c75cceccd310d31e47fdfbbb4e334b8724098ac3bdf2044c8aabb0dae25bde6df81cb8de0c0314e674b484bc6ffe566571b7f838d01d3e50e474a8d0518631cf0901557e7d6e58cc07bbbc618330bf11e166e103175673d309a3bc38e371084ada191229ce07c8b246041386012630421969f17e1600026f3cff9e0f69ddf6d3bbcc699bfb1a84ff075df48a46243e454adde0780e3adddba65e3ef5c75ee6cbb26b81ba6c244ddb4b86e6128daa41bb1dbfa58ea09194e4c85393e82d0cb7a1dbd5824664b7ecce09b75451a3e9ef5dc17cfe81865d48809c916e8f44e63bb9f21ef77ba4faed5b9e5b91e0e96ba42848c7b0686ce8ffc49b71657b032eba59f67577fddf4115d31c45085d6f7fde041b6c31b252be3fdc6c7d9450c71553466224b3613a4dcf487b95b1880c23dd84cd2fd1377267d3440c2016285ce4b4e7a892429ec6ef72a9b8c4a1347a2bd3dbfd58c95697f46c580b27ca22d52b0f8c56408ce02c41aea5d7d1eb5d991b413ef4d10bb2bd8e3bb740495b06a02482589baab8ca8553ca1699d15bde610b4e91b50fc69a2a40671fffe7f6b8ae9040e1143ef9827bb16c207fb774fd7c3cd2c55dac405dfe747a8d6cfcbf53ce089646b3b6a4ec194f16ceb267ff106f784d16ef127146bac848f28136a9b2ff04a400f340d9e321fe7f1b685c95e3b89f2e952afdf9879e6fe235133ef9757c17fcdf5a3c6de62ca4ca970d081aa39f34a5aaecde1dcf61aa88932e8c90cafbfa840b3a5fb42d1093abd142dc34a65bbb1fdba5dda1a9a26679046ac90a543b6733bb0cd0adc863dd9837e829673e95a61a42cd8d5f7a64b582829ef3f08af8d05dcf92340d33dcaf9d1602d98e1ce995bc9e2a2e006fa123a975dcec7a912990bbf6dcd6eb38da7eb9782fc5cd0f1f77b52c78303a59d7c64d2eeeca760ecb45d58f37c098e7b7db2158b930997f5190c0cd2edb83d8160347ea63bc3ba4ebd86c47c65a9785c1ee4e90369bb60cd0f5337e443958aea5321612b7d08233d82a354370cadab4f173345491f5fd093302c41d17cf01be9282c07cc006c0402ccc2428375ecae59274365022342b323bcb18a910f909b6aec7d6113b94a1f8a1a09891f754bf7755ca3485d30249c830b509edc5fd149808fdf4889b5213e40897740ae9ed5c0425ba7c9ae15147189ab6f9bbf1168d3f83220e4e4d794ebbac476580b565b5dccee365c07b9d96c8f0df289a674ff45d6f9f08499f73313dad8ea44a92469aeb5550efeb0ec9e82128c2055dee49faf5c7b554685fa99e867e32f1137fd024e24084c93701eb00e9dc1ce023825cec0803ba8624f3c919f2b8887d67e14bd6e1cb7847a651bf8a9d17382689c678005744e93829020e309c33727ecb749c2dd200c4516f315cf0b435e2147615395e4b427f86851cdd848e3fbc23463c028727fabf6ce57034a8a6e554a9442e4f1a9c82a296e975172919e0bb440084220c93a3f67bc544bf01bf3562e99c168a60babe2e818491b1ccae81f571f33f32b9263e3b5ad761e15b541827bafc3a5826a29b9b2663bafd9cb96bbb400d1f5641c4a4dd5dd125db8dc2913f8ca892be3f8c0ca4238210692f95b2e4e4c8db25fd8cc71168413549fa161a4c980db26991b40b44f849c33ce563f44355f6f4012ae0372a11083d04889eb2e55bb25becf557e1edd74de2efa0afff1c6d2ef53a7fd1f66ab3ec63f64a67053af45764a2b0a0cfa2de2d589ea071d998163d6539ffd1f91ba48d4b1c27d098d80823abe2e185f61628d9db784f4229cd2a48f6cf3c5459c6fbcc048c95fb6a2492625c63c5801853fccc6d9adb540a92204a07a30151aa06cae430b23750cda12bdf33a8f1fb4bb1f923cdbf3f63337edef8a56b1dd8557bab05de7cbab35746d28d5090f1de6bf9ac4402a7fed5569caea777f670614663d3e981e7a4acf573ebb8a4fca1a960e0253eb90dac8acbb8634b416837474c51038d50d03ab7d110c4f4853bfd0bbfa2e2db51ed52b94c36fb41a92ef27abde60ca26cb839cf57d1622247aa68ffa5f07979502ef0d0d39376461d8bdacf8d4c01d7b0b27d95278393ada4437eaef4e7d306c5fbaa3a7f6233a47324dbf6955f11278c42e64587942243f684a0d35a942e3b447ee27b0c17c8f58983888146186ce17d562cb2d092568965cc3aaaf9035997048049fa7c08d234125c2a2b84af02cd1e5f5f592b2132aa3f6dbdd095fdb7d0a00638fcd6e27fddb4033ac8a8837f144bba7ef3166b9bf72dae41032fefcba96a85175d10d89b8a3ef2157f9112a8276879165a536401729507702d9e4b041040ac7c86e7e22fb7fc92a5be389a618de28a17294a8b3a681a6fe7f619e6e5f88e083f91230477ae0369b8623c4fd90db6f06c40b4eb1a17bef7bd51f03e9c137a4624e13d53d6f215190cf418528a631e655ec8695dcab70e1126d9a4a706598d34611619ed3b58e04be9d5e0286c04a746cf85c08777bb258b070956a4f0a816c752a3166cb84c7aec4e384df9855fdb383276d45c6aaa2691d7856e35b92bb5ebe62d86fb4504b00b39499da4d756bcce439ac4845626135cddeb9852cb5e97619dcae250d0b18c39b8ec87686437f35ff6e8e802131794c2d3eb9d3daac2462120d93e94a791e9ba7ef34cdb1ea36cb79dd714cacb705d2930625b0adb3a5a127448701ca9a9cb9602546aa7c3821d2ecd16b81a2701470f335e732850c6b430a0e5b52554cc4b118456c28e432ca43eb3ff281ae43c8dc6ceda19c395db56407a253c5c8f0debb44c049395241959aee1073fe1e3e6f29cce969756a0095df458873592ad2150a0f10280967152a8c576c11e196c562f97e98d1314a886b99a9dfbc5e1c8c28015df650047dc370cf3676cef9b395cad1453851e905e818fa23c7ac824a09fa919d67c8a123f85f0588202a3a524c9e72554ad53feeaa47119019eb5305bfb005cd6f36854238c326520267bb61c28507e2bdd20653c0d4df9bf3c3f12560d41394d6a551f1ab7f68447edc4050d9016548c0147ff9a602c63a26960aa44d87838af8f4d6cedb16afc8080639055221651bad25a067ccf3218ae2311cfae333fe8563ad8679d6018b6ea5e1250d9f3ac852d9f163d5c0e39447517b4ef38547d4d40ab9df6261102a244301288c510bf17c7a1390a39c0b6f58101bd27d66f518ba03d66f539afef143f306864be2bf8e9d637c0ad17f19dc867682ee5d841cd8f2894f0dafc1129649e36b53ef28af58373788aa142b06f90a8c8506cb92b0cb7ad83c839e3a3459f9f003e5b903192f38b0e32e9da8a2e109ecb47c1aa3a7f0e5e6586d43b40a410055a9a472f38ae82c1b0adf90667010c53e63fbae52017164bba0350f058ed4d1068a1461a65f36c25bb9b97b51f7f43670e891048941c5e8f028ba8abb08cfca69b3c97866514b84380e2dee04600e91836e1bde0ca41eef32ca7ca365a0741769710ced3e9daaa39409be83a6817c71602b6c9644f66b7f4a684d0a4d065a0c9b6140a9d2021ae6f7e9ed15f70a280df2845947d1d4732d11bd8f384e0d6731686b78831bd9b18bc6dccee26a69b6176b4cdba220136b87bae6efab85f379fb1fa5799b8c07cf13db6f38b0b912d5752fa8bfa00354f1919135e54deb3c51ca2ee529436a547de71f28361396e1e0c03ef8fc5ad0cb57bc4fd9db538d08486d976236e31392dd6e36db212f5cb9c95dd4c754118ba8f90c26bb2e76e02f45d8452deac3c0f5654740464d1596186615380afc5f14199b5931484e8e5bb4b422adf152ff72a2e9a23fa37128efd070bde089b33c8caf519c28ab440f184604decb74c9cb0a7b3eda8ee87cd6f096103e6fe1c925c52e5ee75f644616b72d58ee06acf64c75e8926e3bd9d11a0f63b72c89e071b2f1b78534ef8832972130932651e444939109bb2da6ad12505c40d698c86cf240ba397e8a5a76534c4ab9460d151d716b864ba61166c2393f2540d5b2608f74de39588f59adaf5cb4260a3ce7ebf09d8b8e4b51a9b319b1cffde334712e3a68f91301c91950b229a677673bc527c1dc3456c0dab48746d88bc67187d08c29a36b4920101cbc2111aa2866a156807e2340980e7d3c849af4126471b906adfb8fe7121bafb3ca4537a228bc213ce894137971cb55a2d6475de5ed7d26e2d9d2d626bd1e67aeef0c8c68a231b62ca3a00a20eabb3dd8dcfd56d48512a3ba27d1df269b33659cd771a9612e324fe7490c7576ecd65edd3b22d72e2129375dfecdf4ba32c58c9cf127df2395755d1f0755358aebb4fbccddaeb10679cc83dd8abbaa03f1301fbba106c3355ea7b25ab572639ac1aaafd8928a719ad164c8d661a86c81f2aaa4a924a619db0c40cf8c4fddb824e5c65b0ff95946c8a4c8f2279eafa3f7b0bda58aa21ed73c92d725b81d689f555c2a900e1b4dada01b5ecf6b72dbe53ea586a1dcca9ed9de14587e6aa54cb5e63b817ab4f70a45b707e8138d882dfb3059afa2c11c728f901a3ea9a4195041d4ce72910090491957d87033fbbac977e0dc71f6c78359c1f0e1f79c96a1592ae15e2ef81500cb9192a00af1e67efe85303d11fe4af8d64a2fbc16fdcabc9ea5c80982d8c269cbbb682962aa93357426e3a48822a92e472a3cd3b7ac80fe8926b119517c053335c0e2cbb86d8e6a7420a8cbf834feb1e80b2614d0cae396dd2aee0e46c87c269bab6fde57a6d421c68d6ac3ababfdddb949f8ad26e31f9274354ce041a55ba1373d9773b117ff58a9d8f8ba9ab9ea4eda7ca8d9341a75935103b8b10a9b376081152d9d1f6cc62cec3fbccf4154703bd45e08e814dea71c097801d769c36937d035d5d46647737b786e7508424077f6a7e24e9337a7a3a71806d9f9fa424120479485b9d3827224dfbc4dc57b9b9d8d37c9964c7def4f3b092218dbf711bf6c65d434caa22dc1b9dd197d76fc714f9de276fe0f7f8caa1513ce77113c2182447bb8e7183953fb1c10de2e08d578c8eeb694d22fd0bac20493d5e5fc68c5e92b4da1c83debc8bddeba3ac9beb02ad2b85b0b5b5c693998d01308c5219ffe3fe323534afde3257fa3b73f13bd69cd2329e0fd0e482a9f4ee26dd4a13c75a79df9a653539e154e208f66973bfddb19bd1e6eba6cdcbafbb327ad709604fd5f220d2accb1345bbe3558d2eeb474d9227f553b52ad9207994765d3ed5ea789549ff77b477875b6d774a76cb954567b7c60cdd813e31da12e9ca9268e9332978661f7eadf640ecd832e306c8703ec3d07c46d10908a4be67d7536f5946fb185dbc32ceebbe3aeea25983f776c4d1fc516cdb1bbc9fe360d62ac2c6bb47097bf3aa02cd0b4e40fbf87fe7beb457a11157db2b6890acbb8b79f8bb21fd53b14c9730c3625f123b9f9b462b2b98ba7e36bebc80c5c39976f7402bcd75408182fc44eb0825621ff7e7e5b5211f1ccc6551a871ff6ad8c5e5719999eaf9fd23ad33e18ca6b38dc9c9a91789864e278ea5d2dfb88a63d38c899714cc272e65030d4e72951ef85df27e68337389f59a327a7d2051191fca24dbce622dee18e15996f541cade0a25b6b5ac78bbaef71468bf53b1e2fc9c7c01408552e563e67159d5b8d1ac82f7a9275fd8cd9d25c2420e1d42ab6d81603ea7bd0c651de0c96f659acebb8470053b4947a72274c8d6dc19cef558a38881d7274f451a90540df08a872d7ad957270a69414b543e5b7597deaa8271a045dffb30b41a1ddba03f643a95538a7f9824e463928ae721e75b86e080b0b8dad5278c64f5e468361d6f10f1815548a0740868fe470c9beff7d10fccae5fec25d6e8a49a947b70166c2d8c8f27b8fa526a698c1f7c80bb04be415f8bb4284099f1829d58dc9a0dd698869b6a4826a9247cfd25381cb4241c5dcc92d774b613f1782da42120952c87fc9c2ef4b25c0ac1a3741be89efff32affa4ba94a21c9da33f305136ac215dd3ed4a0a2728fd68adcab1aed4477069c2524424077d81c62551895780f6017fcfa1aa8c513ac04b3b1f8424d118a857c64b4c05db29cffecf5e4d1bd5ad23ced911c34bd788537352085f1e31cf51be7bc02463df55edc77253e177f5a770ac9c4132bd002735e9ec4a85cb71551494756f12fdf37bcccec795b4888c2d98899021157a51a4ae126cdc2d37e3ceb95972ab28779dd873f1c9a624956737f9685d5e36eb6d0a32a6dbb39171e8ffe8230a2a110f89f360c23a88121a8341d200d73973720263c60db20921c1596503451955174ef3dea53c9a27ff499adc3a98a6a554a588c648d8c0550295afaf198852ac489fe21cdf3875c9ace09aa034aa01347ab9b79f4cc39ef46f65d640a09ace570a977a6dc69ff960c3b47682fb253bfabf0f08cab734562bffbe618d31716bd0a7120b584374741a98610a37790bb48cfc432769406af3e70551eb6649fc4e20e3315cd4d7c0f04130973502e69dc739212fc59deb89c1392b29f0302d2e54710813b69f96950fea376b6901c7c01194208382ad1dca694145a629aa6f20be1eff995228cbd0489ab89b5c9f48cd1c0f479b67e48638d656589999dd99ace5dd2679ea8f84694c9724b9635de61a7ac2939ab0f08b70c259f6da180f814c291954529c45494c0fa66fe5c54c8c7a3bdf4ffa1db664c962358a9bb0454a4d2bfbf0009a46590ea73e933c20ff829f7791c7025466bf0e3a3911b3015115d9bbca574e5e171768365b0c384f8b230e9dae7ad0b6bd9ee823a66c00a193cae0039bebfb2dc465f77be27eee15c369ebf45a2211d1c4af56f1456bbf8afd9314df1d000b23e4af129dddc73cac384eed232dab5d07ae8a1cef385f751ce88f34541110557daf1ae847df78c0e12c8104f4b8a5e7203c29551706047e7209f7bfd83ed1ed2da98614d7c469da7df3c084dab978fbbc7dcd0915a8723a05488fc5eff9b034d7c677722ad81d29d02e74dac6c1e949790f948a58d42ac74424bddc585ded56f8fccc1575c86d04e983f44c2c6042bb3339e6cea4593a700db7a753644fbf7b611d71d972563537726760c29664a4c750f72208b0e4bf734f3cfa5cb10a088d40286d13795af9cfa1e1029f5d75ae3ac67d322c9e1c9b012093bbf6662bce394c7e49f445174735c1deee32bca9c717659368b390e0bfa72c2b4081d4b1e0e3b54797a6d081e0ff69be2fc137c975693f9c3e44c9084733047289ce33eb4f6177d73bfbcc5aa6251194f532210b6f3c136a984317adab41b6e28c0edd66a484a0ec8f0261bc0c84a48e24be0051cac084319bd75b222c1ef49bed7094d30ee7d5a22acad46c9547031d61e0156094e202ff8352a89a14c0f67262497fd6ed1474ac8c9b14499e92d06f457307b90406f39d68161eb43129551b000a8896b52375c2b5c88e8f6be4b5397cb274a31439ab066a872ac6a18610b0fc439c4e7d575adfeb50c4685e6e8381d416cd43bd8a32c5994f48dda9aa6917e8e325392faf78dc81a115b093693d4248ad448416fcee4ee07922139bf2c83aa712c75be4802f35d814661ba70727808a6f825c5d5dbc54b2f9045193b95713959645df345828543f6acbdc012e34ecbd48d7332b19dd411c9fda734dd15ebf85271b7bd6bc9dd282b3da90ed8fdef383fc2a17c0f2827c6882f5320779d9f500b114d11e421b3a7150dbcb92c2ad7bd4684374b5820f6cb3948f17de5d52784c4a405a199b3dcce1f6fd1833a571d2e04f23211e482c88b51eeb7f548ff737af01217695d6e0ea61abebef04df6beb1717ebbeb63f197a124b56d60ac8d266bb7ec4e41ecbff16b26cd044a5fdf36c97e8e737ffa9fb4b1b1936158d4eef208be23195d82ac3a9bd257bab77ea2cef4b58e1ed03b36d00c9de514969f503b7a1eb2cc2006dff94b4c33486eb4e89ac9d418d01481c6ee5a1684b76632b52c5acec96d6996fa3a122cdc666c3e1865b7a2e5c57ce3019f4058bb919a71aa5d726a263e37fb19cbce60e516423766f884d255f8a6a0debd785cc4722ca9dd1691388ce8927dc557b808f5ac3885fa85c73c74087e793428bdbb3def20e1d3838664a3bf3016ff6946f613d9f03ec07dd8dcb29d3c2789b060116a27b0ca6b9163e8b5cd3e1902cfd29171ba49936a135fedd4d0ab1e881a31cc104678ff8693e80f45e53e909eb518f8438787b2eaff7afb7c646031b3b435ccd34f044e54f70a0f22f16be59861ffdf10d2f92828e8b3d7e5a9aa797b3d80c9225e4d1a0f3fd10c112c7b6181e389b84efceba9d54c27f814f6f4d3f8960e124c41e54ef2e021515d59af77662a963c640c86cb78298401967a21a8b7774dc0c1194a8f760646c9f7326cec696aa4a2ff5cf9990f0b806717428f7b338335b46ae23c8f9f5ec39fd5ae1a39af373a6c85421c8dc44d9745c9c951bffb80980584b086928178c4567d60d9cc82cc91d7749b0881d9cac089c51a583d3d357b8385f3d9fa4a535692cfe8cfbcffe94f1eb89437cf49434e12449ca0b18c10451f7242d847aee10f204fd2c0d55c21c817fbdc3872599b931662c7a83d7416e3e1b31bc49800b8a9517bf867e4ad8057f32c37295793c5354b5b7dd82183f80aaf15c19604acbbcba7634724cc085d06e41a674a9429a72ae51e45cfec128d102043170c78e7cb006b8152b72362c58e4f15909a43b49a183ef2536be2dd588c08414a23a97397f39741c2b9b925ad0c1799922d63fd31d19a813fbe3258efb0c99a6c9c4020be75746ba92e30a04468e3581a6caeb3add4bb1470663e19e51aa8b85053d13f71d1fe072801a35931b7c2795c0e92c66cffeb71a7106c40b4401d7270fb8f0b195785295366aee2859f027043eee9129fa6ad1503b4ad7574bb448301b819109ce710d5642ea24111d991846465ea228bb4b75ddb779c6100f4052d34e35591aa3f747c11025f2a385e1c183a0f46a276231eceb55145c872e2e86d234735b988b19fffd1826d1ee9fcd6975d0ab7769ecded38354d0e8a7581da94a22746417ca7addb93a194157facb127b9335c4bcaa924c913f55e179bc8e8bdd8c42169dbcd5067d1e94663d55c2da9bdbab58f62f31d33256ee4a72de4362c6411051c60c0a27fff9a71115e5fa3979de88548b9feb215c981d2f7fe65b5efc158afdb3cfc14d7993afad0be5d69b2c613b421f9133baa94dec410e52f74d9f95b31a59fdc514a26aa282eb3a61ef5fa6c62b7b27d60556ef64c5d737df7fe499ab7f443b31175a8d383e7062627f632094d07b6399409386c4452d7378b41508c9320b674eabe0ac79f03102d835ada03de858deb9a8130e0efccd4ba39862b982e3e85f32e86f07d9aaa0e098b843084e19c051c1a69b5024d18bfb8083bf881004709e166fd5768dacdf5745f1ab5e95671bbd1277ab5f5264959abb15c84c769788446298e1bc97759feafc2b204269e898ae676f13202cd96590c6d7c1ac0998d200dc513451b9f04284571efc6895d31a447728f525507979f938770f91959295a3d0452d50b01e7d439cb2a07f3c249f65f0be689749558132eb86839f38ffc50cf2989819c4a8527ccbe91695a441e8d36903fe02a61f140bb645e32b6cdfa660061e3a08f6ec6e433b133dfeaf0e40a6629b79c08989d83dd8d9132c6d79b9b21b45e007259558c88092a564e1c43a80fe60cb4825f97e3792bc005e4093a7d36be700324dd488d4778f44b6c008ed61e81278d2cac8a4024e595f91dab5f827c79066ed5158710f404b487e193c30d56822fffa22bf6e988a74f367e0ae06769e4bf9841d20de98dd12e4ad18e6616f6a1fc0acdf76b5c3032d744e30c1171c34d00cf0bc15176c3c4b1ad1404c88ced901a49335805a342430ce35a2e9608cfd59e10e9aada5f09f6dbc68e2f005408c4b81077fe5a7cb0fcafd9c5f207398a7767957ea76ae3b08ba0e54f13b681dfaf04b233aeefed3ae3c2d6fd7d5022731cb811abe1313251e770d29b63be207189a6a6c0ae8001e8c61520d3c45ebb39d236afdfaf25de857e7c88427e026efb840d9051f0e3e263e668a201d0bf071a93d74fa497dc9a9411280ef976bb613dbea8cab27be9942d4ba01b3234eb39885a72fd259f65a6b85dec88151e3c1e1aaea6cd08bc5e213452acc70eef23cb1bc039b31c82f8884383439eb0158ccbb3bc132a519fae608ce794459299be25f532431226e4516a7a4ef49f92c93cfa9856a448c490c99b8ed817a68bdce898daa78419a15c92b9b9fafe4baf8c794255c91d85a399a5ac11a27269990e7fc5e4a881a7f5e21cef48f7e494b499b41de3e86b89610973ed1eb897257a25cc9804defd258176c0e9c6a341d6a60adbebb82e171a61b4ea73c77d851e962ee405adcc0c8fd801f2152c17d4e25881536a5a7e29dc00f07e13c922f3875af640ee91f8b923b47aa425f1f68971defd771838e048e88365a82266156c9b9a7aea3f1109d49a847b85edae13d8c2f4c4daa7cfd3907c0d0b0f84a9d92bcca83988bc5c4e06d8ee50516d60d46b67f2d443b53e9fbeaafffbde810e34b30a19e2ccbb94e927d783d6f146a47419bcb92b3558066402bdbc7affded77e92cb72679d6c415e146d854bb8955e104f71d1527fc77c28db183d0eee7cff0fc0e97f8059c93a66e4f6de679d6cab220774ddf43cc4cdd4a05ff0500b92f00d42b2beb0b489b770504f0d7c97c8d90555f7b0ea4c1fe2791a4a8afeef58d8d90fa31af499c3aa3bb07d6105c673003bee03fe36c2f9ff085d79977797c862fb8679cfbe3333ec037f32ef578f33c163b482d9a28e016bfde0ab533678b9ccb3a4bb3ee7e73c71177ea4f5d232000aa64edabf394e922084bf34185538d2020938203178213269d019ab3cda86d6cf29e48f2f7357292834b96a8b02522fd432be0a6f3622377f03dbf75f4343270bc74d38c820eb199c6d9503a9911ac6aa6fea8974cf117d1de61053668fe0040563d9e0c68ec90df4a36aa70c309d590db2a99e04ad0d8ce83f8798b975258cd98c1b0e985081bcb322ef210f2cd3801de6846f5f1552c213f58b401cb7ffb03dfa89c72d4e37505e5a3417079b623982201d98352ab65db670433c23cfb731d0b1d2883e1ec45399baed37c8fd0ac2e23315cab86ba651b66e827b87ae4d94e8944c3716b199ba2321afde84c925ab1b505175e17fd17ce4f02a6572b012b94f8bc9b40b35ac2bd68b4fde843775f008f665eb4d7f58fec5555329e13a117921ccd8a13f257c2578af555205dd0452107667b05186dd91a603fdb29881322c7b44f79111eb8934a5d7f63548488bfee6cb39698487dca5f5a0d2380ececdf4ae30e8e68fa1e4a8521c316bf1935411a00c52715ee2dc0748abef0bedeec820630913dd5a4f0f34d0a841623e426d41a4fa6fd7ac2642854778062c65cee6ba15bb0814a1b12e4a5c83192bd2059b84cf6b14bd999eaa643764d4b7264ebda836a9bc8b98c11da97b7d103cea03b2119b4c803ba077bc66242575f7de9993571983bc48b5acb12b20e58d3edf8def535973ff6dd40e5c98fd76600657561e71631e5cdfb86ae294c3dded1276c7ff1eadf35724c74b4a8a8f9c9aa205b2520f03dcbbf6ff78fcfe1a7864b982cf43967cc2f5dbea0727421faab337338de840c78a111adc6347a4c7e31ee790fcc3c7b6acd7ee48955cc886cd71bdcb6acecacbfe3cb278b333a8bf7751d7c07d5a6b92c17a7fa30648b607a9480b956c4e74e3001bab00e5795d9712f5d65216b4f10ae008815fb8b8d60c8b893983a9791bd181a1d3f599b4a10f0194aa9058ce5216f92afe2794da619bfcad0fc88a4410634e94efca2b58065d7579595cad57353f53ad641f690750aed0928c4ce95d725e0071c2ed4b4f491abd2ad7687fac66014804dcbc8c9cee5c0ff52d1a2d2caec7fc1a075452689aa7a910b30477e65e895dcb32e81cc433eb5a07f61c64b4733928f31930709f14bac66c61e7af33a9b4af1db30b983df7da932cfde93dbce0356111ccdb97353c5f8ae42cf0e528aed450f68497b459846716bcd343d14f795b0977999f28287001054409f4ad1977717056d0e84b87ce05be45d548e629223696b22cae009ad3a1fe34b2da68dfc185e48035bd904c04f006362979051ab44d82315e17eaa10bcfe466e529d531b41ea0ff15b74fe00f6d6d364e0d787a58ffbbb944cc607aa9da19e343f9266644d02ee85868b1018c2405ace9239d00d22908739374cd9d39cd080ce20b07de2482766bd037c411e70123d4a687c48331ac445eb103f4077fc51cc068e2fa20e2067f526480a0a0403fc6f6d87b0c7e06b20fbd425b399b2c5a060a0f6802d6f26a17e8acd9106bb711f2b28bc1a95b8cac2b9c08c41ffa594ca46dfa61da0c7aa21a8a21d0089cc0005afb9fd875338c2cab2fb5a165c1aabf7f2e086f7885178ae6c0a726f420dc1e57086c8930ec64c0b69bb3e592d0f3db2ac22fe21bf43ecaca0556f0b09b3120671b28688cf362847dc702bf1c98d68501e888f2cc6a64cf8f1efca498af971043b339241c678f103cfa1c80610a04746df7665e6306f0a5693c4e735076011eabfa789351a4858c1ec7545ccccdf59c35191620d6a8313296e9e62dae9c2cfff15eddc7bc1c77fba295147c6665556010d788bae35496ce84cc93b3f3a2a9bd46716436b846cc3ee9b55341819aa18c03ec387ce6424fb24892572fa48c068f1610bf2d1a91e2990955a9c11d573ee5389b421b8b2ceea742807316f7d083e0115cba6b10dd32dae8364a75f46bc299a79d64b1a9e07cad8e22fcbd650bb54a25c40391a81eda3dead90be568af61f235a3b3b9b1dc5419ca4195abe979cb55c817afc7ca4a9e5f7255ed52a7eea40900ed3258a0c72b4baf7f16f8f25d10846934488c57eb7bbcc12e1aa1afb725248b5c1fdc3d0d3c87acb21b09da3e4fe5eea963e027090e3d958cc60d4e17f4436c72f44a76ab7eeac428d4a81a0413b82e989cc99803f5e266161150e22a667c515b8c92a780dc4c60379c447c224974adff30851333315263f8b8267c5e10a215051a2e8026e6a706e8fbc32894b61c14a5a52eecda18364f4babbc8a629cbc365e9eac42003379a10fa646ee09a507af1a97faf31fa339c91f523d2a02e7e6a9764b5143c73e982b0c93ac1b62a72373ba2744cc0140d5e62903edf59eee8f57b0c0bda5e2ba132f95866b244f733de989475f5d2d40f1fa25b6efbe0888de3f31be3acea6e9ecd2a90b27aace11bc6873b177c58bbad012c548ebc35963a47870318913378a1b2c7d4d243b07564e6af350facf15d5fde489ae58238bf8432483cd62d47b4002fa8a52383bb6615e0a4f65b809aba2952629529a351c703ef800a2d8c54b9cc596ae067187f827abb23cc7d2433101368dd7338770a886738b75b8a200c51ee54ac03849ec60fb4311b9dda0461051b248e9d3c49ea3704121b62040619e39957e16c50291a11758b12dc66e278d445e997755312c6f402f17043cc5ce422e98614183c456b5cd564408d70e7a0886b7161d15152b587113ca64f85ab6f8f2b1285447ea6ca02036dfdbc00f05d4e87deb35d2463167ff4520c7a0522b45d6da83d76b9a196def6c6d4a78509c10d2c9ac7525cd12b8dcaef41ccb322e00abd9ea1c015bc331c0caac1800428c135725348f566ffbf6836c4c5e2c687df81212a357c89983e65175b758801d02211c4de079f56de9ca49232af9a30ca093f009bb607c475a3eec674005e4aa98d66254f9a5aaa273137cddec83c88650104f2b83ae2b48eb88d8df1371be57d9ce8781160c27a691847d9ad174e20af52613c888683f0e538e8fb9a300ce390ff1bce554d48f862350f399d75d1d304f2235eb4b922145d34ffef6a270460a2ae3e6499af516673fbb815877f60d20fbebfce197d936d1906887ec8ea8ce293c308116ad2897de8d837f5b2f32f995df0566173460629cdea1d38f01c035d13543b4409a712898a2c1ab6d60901f9b8406a43240c30add6b8798c31a0dacd219f875affa69968a65246792e83b2c2c05e14897d251110034e6f318a60171f93e8eced54055dc5e55a5ed2bf4f58c44bb8d9dd574bad046742c092155fcbda6cf77479212f128c32f1d85368bc47d5412dc93c2ef4532918c11965d5f0e5213fcc4b684462225056c8f091a0c3738f2ad0b1440af873c390cefd8248aee5859a9a36d70ef3763c289e4f1c5889da2202599da9c3b08b52a9a25f254195a8f41e0067bc29a622d0df053ce3663115c8c9adfae253fb267612f0506a3e0d2f148c51f7c1d918afd98c5808ee7aece3d05aea06ee4aee023d2d0d7c2c7f1b5cdf5a6babfab972211bb0f9d24df3cb2986187dd14eb7e27b80df5ec5dcb793ea86d5ee4d500dbd118d567cacf1b341404594894a0d04603fab6306c5401055962d54ed793586e0768a145919cb8397c5b627baa462f66ee0874d580e3f541a6f04d5eaa215fd6050330d675cdcadcd0b07c72354fefd933ec5aa948c3886ad64975dd99b8d4b3fde55cc26f95c684d978def938ff336d3a741ca030720f829fd7ba8601f558dc50ae3ad6fc64305812961448f23db9e83a2944bd38c3abc00d1e9e86ef72cd8dc8a77acba6e08451cecae6b44e6faf307ac99fc96725d2491cb9fbea5f1a386148bf01b84e9f3e0ddec9a491c72307341158eecb2b72b56cdeda052b16215492d2b34f944b313e825ec5c49a0237e0e6579dcfd350a132f4e4a6dcdcfa5eacdb8cb8a8b1a0a9409a9045ba79619b308c2d33e434695a205799f9d8b3bc1d3e7ec0e3ada44ead8a947e49b477883a3e2a9b421da2e9919368d9fcd1048583d07caab2c2c43973000fc45cfa37f6ef04c2340698788df5087f1a5d73814bed98cccfd0a7996dd1c4d9103f04de4c0a9d83793c025536e4b9f3a22995c57365c8d7b882d876ff02fe01650f6eea581bc64057723ecc553b53f848a0bc8612fb5b42d87cd71df791dcaab8787631df6720194af0c8f958752317a2ee2b3b17249087626d4dba2eb577c26439a82b1a52338289ed939f96d8c97f364cc90c780d302783674914216be0d8c4a2e83801017fdc526e294508ea890c20bc55f04142fe3e5283fd2aea4b5b392831ad6231cb3554a9accc911f62ca302c3d05293b0c82b80c2ef977a408c0da1d58b18a880afefa0f8ec0abc1a966bb01b1ea93467b886256e7008d6815d3a6e757316f4aa3c1d60923f60bf557aba56e4bedfeec25facab5e0d983e2bd912d6cbcb8e33680dfe4e5b5803a38ea3980d6cc052d00a7b62b91bf64d2f6dec938319c70e6ec4017b2ab65aebc80693eb574691fe4305840e1c63512bf4c7d006ca97e449c4bc61d719d062640e4eaa82d98bc51d59dcf433c62836e3885915ea4c96487a92a7fa34b80471a258df81bb53b79bb4f86eb41c236f3c2d0dc0f17e5e7fcac1721884941a9cc0e93307bf56d045b32935b06a355b02d73a25b50ed471ff1c9b934afe2c2293ab926223bd3e221a0dce710c4d00688a33e29d0cc0c619e918c59cfcf2eee18884ab16e48139ce0eb8c02658e1e4ec4f7f1016e3681b87e40c7f3d27d1ed6aa4a6c5f44f824442bc6c2eecab34b52feaa6f2e0ef7097afc3f4024175ffb2a7a3de882ac9a595d749fbfd7aa5b32d70238b4059a9271608783fc63d35aeb2dcef7b2ddc84225a0f44c0de7494e7fe9f79d65139d8907aac99162ea68e513d277ec2bb01bb312d5e9ebea5068f82df24e0541fbdd0952ed18570e8f3451a7061123f3dfbb8d30a9d1cc1dae0a04562bc2b71beceb021c97c84a7026fc50e846b7f03edc86996df8cb664f9dd50b0faba48003eb01e435c42a61838d53d1b87d4ebaecd0308c9f5d1fe900a8859089ba846603e8d41f4f5603be3c4e120875c8feeae5bfc1281c5d826c899729a9139e74fcf042433e6f1ca7fd0e616c91156151ac8694113d4cddd01abf0714000655045292865d04fe882ac98e87759a1f3440526bdd81521b0714ad7cb9ed97916025dff8c00dce0f50c2e7e8af2a0a3bd28c6dfce387bead3a686805bf6f1374706e29d01c9bd2da67d024c3a1790b4071704f200e6c5f53225e70b70c8f4132bfa37bc1009a76b64a23c50c0e9ff851040b78d951924f9515a259060b0bf2291eabd8df143fbb542f4086604bfa81f2b38c7f12d682ceb798ab62f1ab99d48243312a52cd6c1ef60f03bae29e7c4ec80a44d32c51c0574426a2a2232324c3092c07b73d605a4449bca71e8db7aee8d81cf6cb78938864d9fd380c28fee80bca3468f471d063955c3e03856b61280a8920f3fe07f4904dc4b07b5dbab0968edda23467da8bafcf29308f950c56554946423af329092805d4eca6e4b201b7cc10a31edb0b9c3076096170c3d0d96111cb19ac4fe06b30fa113643d3a972f61a9d417486176e7a241bce30eb41ddf72457b233c0865d13dd39df9be473ec78035029a0e2d2e073aa89c7ad0c67aef69c215dac304fc9c80bae0d76dd21a5cdb0acc4029350d38a775a636c85d718b586f612a7fb4ad71fcde27b17bc1689af37a58f145af9fb51903de4e12c3b9fbcdd07fcc70c6b9d107fb18bf7e1a816a88d55c9995f6d81e0600d40fe2fada0fd4ff1b42b90f47c09ac17c46eb92e110f666886e7732b838be2fb25a635512d4ecb42e0cc21b4f9e3922167c03223823be8b5752e8f70afba92ebc5346cbe51b483684d340f889f2a59df666e66a0235381427dd47c098ad460d96834ee64bed38d1e7425259e5a15308fe5e1185ffe0d5a381944e11a8e72c59da941d75bda4c4b2b04dc585e3c5b70875d628855842ac40d5f569d1f120a132a6405d61203161c0ad374097903824b5035cddb94d81201f0b97a9487daa0ad3a4820545111da0c02e23bd30c1830fab66c4c4c9655d2a84e041ad322e1b7fada50fbb88d51b9368cbf6462254cb58a43881dce2d8c3c1b40ce64ff715e78a1ec4df1e2c47089abe3c4fc55e16a901986adb6262e6928803963d11ac96b0981a360abc908753456c74f8fdc943fbb739c7c1a56e10f49430e85e41fd488a511661ad594b307289f5c16e50e8b13f2eb607d014bc3226ebdef2a38977b704619f8b1655a5f2eb29ea1ea1dbb2538611781cebcfdb0a548f51a0fc78cf12b662533e04161e314e5bbf5c234b94f7f245676904abfa05a53e898fac868b29fa45b047129e5fa82babdd812a918da9402aaece1a606ecee07b642e3a5a054bcb600118ae5bd1633c9eb801cfc6667a6fb20bc315e9cb4c71b5c0ddef3e8fa1f7fc519340a5a2530af0b08af394cbc3ad3506c68710155466b1f94f947bda7bb5f6ccef1a456d874a0b40b6af8cac0fc7158a43e6cd4193e844329de500a41205af06b58ff5a5c8e8b9c453f63c9283767746f207e4b9867f88956eb3441281621c0faf4c3789dbf03a61a2cfe54b2f4476612a81e01d06c50064ab30bce26689f2dc697e70bff764ab38eb1d63648ca743df008f5b85ca84f310d824912b040677f818cabea999b3e32edefca10239308a15449b4853c5a030af69967c0d6fad5869c0f8ef4b8fbdf4e7ab10c4b13108c9f9e4e76ef6b48a2b9c5f6dfb4454cc53ff9dd96282cd3381c42b6d872de522c1960806f91d597c84703cdecd428a928392e2d94c6cf0b7d65e90013b03f444373a6c98d2de1b651ff1ba13655be46754f00d3fbef1a8d0402eb0994996c5e8ac2d830cf6aac3155fa15ea021f51bc078d015d6c0e6829a75e10d0a1e1b2acb9fde0480533ba07421bf42059f30a30af7d6449bb1ef1ab46a70534fc808e450158279d8144cad02602644edd7e5477f88e208bbc8644b840820c3cc03470fd08d3772c30b400f480e6a8d370f8dc6a245f0b0b95a2139d97807cd1eec83a2e8a351f5955cfec069a37074fcec578e598f63d3a644c853140cd9caf1cb40e94108f2bd51d79ec26c29c47fdac35fca42c7050499e2ff97bea29e49d9b215d944a40943d87d2e698852af0fee7450f7547461b4cc6f56afa50a7cc56751195bfe2c14481727aa9177df9422063a625263a98f2efb1a532d8b7c6788261c1e5c5f0acb09fcd01695ff5b944668ad9e02720642808bb2e8a0f90e2e84f28906ea983d5e43c5f63d5c158fed498af475a43413311cc98e6746e200d1eeb93b57dccf8fcb9316c578a2e008ca0be69f455ba70e68a7700ad8d5e595e20de741fda06cd374e7bf5efe540373a115475c5ee07ce0a7e6305af1f2ab0c7aee8e1aa99f7555ba1f39b84ae256ca0420d33540fe8c33ed0cc54529e40ccf62a5f6e5ff28b8674d45f72a17cbf6622264513e80c26c55e4926505875d33729c187703e492ae0fb5aad5f6ddc33bb7d0e811fe6e21ecf708b18892171051484dae103bf7ce537ab51c5c19013934b504082ff60deacdf0bd62d8621be8403f4e1efd52def96e5481f4c36f2568e99f00ffdf3328b18099fbcc47b6de55a9e68515c4211e8faa583e8f90a11d4e8b817d1dc437604f8b2c4287e24dc3ef416c2e8de7781fe314711dd69d8fa31ed996c7648a050b31bc0292bca2fcc271563de2cc7018eb0c5d132bafe7b31a399c64e79fb3cdd073f965e2d5002b3b362e0a51fd25a72027ec1b40442f8e7063161ba26bc3b048d1fabfcef444b73949a42ff56ad30efb40131b3c15a7103d3a8123560c951c49147be17869a4b363e0560b60afebcb64dadccce9e975423e26c47ae774817ae2692d956b86cef3d6fcafcd7f325399b9818a2c8b9ed0288e477b3f65e8bfdac52c09e658efb47be327e424aa41612892afe3dc0ba30d661d1dd8c0e6cd3dea21915448932333c627a2b230d245994495330cc9e0488a3c3663322d4d301fd30dc41aa5f1b2a127087d47e24450020a633cec04bf96c0a5a82bc9e4b90be92b6403f9193d4240707e801905304821447022a0a6925e26b638c5d718d1181fcd1b7d1785b4a4d530171e391112c6452a849e2f32af0d1b681178d42d9fa4ff4a1b720b13d923da9d2d0b29d705bee52e5fd27c51bab607b8487411e6c129a401b6a8ae708939e8ab852f9364e3b334487255d04b4a8d72410f5529054fb2e9ee3a7cad24cbb917e49878fd7c07bbbae62948195c16e52296f37372f8cef70f052436309246ddac0d7dfb6e29decdac181a80c30f5c16d9c72fa327649c23ade5164f9d2e9abb2629e69adff46ef131a42ae9050cee038a9ce3b053209c554d074d71f211492ae3e423d25866b689617089ef30738b331ad8ce240de229b9f112d399d9a20cc0d0a1034c582c840abc29f31fef4e4b384f601dc5cfe4a661b350466ab197b4bddbdade5bca94520ae60ab80a8b0ba893131e299587f24e26940e85db4a282824145e15e68e51ca1386e90b17026fdb25126d1854ce46931c2f16f5855ff585038117c6a47cb0b6c488705c8a6350880a8795d858c579a50d93916be6962399429dc7bc2ca591b44b255e690a755eb30ccb646cceb6644aed60db18046b05ef7467988ccddbdf3e1f415566dbee802c083a03e8ab489c3cf1155dce2250d8bca2f3c497ec6e24d2431ddd7919bfef01de7a8bb98df0322761f3e1c557211a40f1ebdbc987275f856800021b2a655197e6618c0f49ffd217f514ad892893d63451d24c6b8c58187591fc6661d635af6f8620e2068c2684c0236e86886df837fc7a03145c24322d83aae1d765138a0623740c2fa561c0cdd624a15e281986587560b15ae8d0d232630e3366b01cb1b0ace4b05ac988830c192b705859517da152c578438c182a6e50514969434a4aca28954261030acac91a4e4e506a40a13c2f3cef9486d3c9840693a93b43d7714d386e33c3b695ca502a91c84022695d685a36862cc3c48061320cbfcf8e84be748cbfde00a5e9ee5f6780d230f3af2f4069961d0976edaf27a134daaf5720a9224e41533969b91f6cab75ede2a373abaaaaaaaa0e805da5579f598d39185475d52104fd5a718613bcea4e17652b689c9752b1b87c0f60c666bffb540ab6731f8b82eddbe7da0de1153c11f67ded7e68cf3354a2f4a5146c277d9e72aa6037d8298f7b6666064167970b164a7aba8d52b00d173b8f5f8a5693a230ec21102fc31a191eee5879f8834ac70c0f63563cc4c17283c5c396ca431aeffe329c1fc343969728a997d2a5ab3479b87a95190ab179edf358094f536d0dc8b235397c6b6216869dc7c2b0cf50b1cce82e7d6137cdee0bf7bb942f9cc00751f1e86029e45f7d4830c82ee33b8241f695af0805d9555f8f05d9637c4228c8eef21c9bb3c770cece83143217f32a2e3f154ff966d8a5b2f22a2419af624ac9ba1ed263f84da77c12f818df8cd465934a5f4c2b6f4a99e1043ea670544a7cf452424e3ece5b02f5691c918f31fa8226975d8e296ce2634efce837dd7dfa582814569e3463f352dbb5b1612d68510c921c7e7efd07ad59229479751d5a436461368cd95c250f6d5e7d87e25097e63794654c4ee3d5359cafae612a64d9237b0414c2453887c25f9d2fb13537289e72225b33c4c2ec89ef91ad21e2e49e2bb13503581802e84bcb20d1ad75e9375bb3c4c2a426ca0c7988ad21b2446ccd1e591802284da82f5ba3c4c2b40c07bab57e3251330b6f3289e85788cd678ec4e4da71c0c48123ef08f6fd218c45f44b237e20cd90e4cd3308c9a52fb1826f41f6e92c14bf8e2d0a7e7d8be2d74bdf3a9135c11e5911fcd23ca12f5bd3c4c2ac1b19c1ef1ef92579f61991b9244d6d86eced213be652073b6a1e3d63b45f905da19643e5158b1f1cd154fef34a43077ba275b62e8560487a63ab629059c520cf3cf3780667d86d9807bb421598835dc5cec2aaad75f979e4249bba783725d7d73a112db3e2b92a00e6243f40e6a5e944c933274d27921c51f22c7327488ecd95e6fac25c5f5bfa48dfe7756b1ddb3878a16b3b77af578481e7465b3b43ed0c9ef66ac5197cbc65f4b53343b17fb0d6bab19db1bf4f075b16c2c6d15d18f44d763b83fd81ce2e20bb7a32c820b3abb7e955288c29beb1572b9a30e199b9590ddc33ab7e813b79b5c20a2323d8348717a3abaa6afc84a45edd85c146e16c31c4a03e389dc1752ebcd07fbde0ad8c5148ead563fc345e86428c517b3a248ebef8f5e569c28126d689843342326d62896f4fcb9a8b5d7bf735a1ed30b82cd3b1c76f773860e4691eea51130c6ef715e91c0a7f753309bb115b3683b0977c9ddbb2cc9b33cee1c9cd2386484618c1e07ad438d0c4eeb04b71b449243e4f26e267f3889467c41143dca8de26f58a8510bc38bd5ad1048c57a9c0981e8e313b18fdba6228f879915e9aab7b9c62d78a5daad8b5e269007db5ef4b57df7cf0666c185483773343b4c5af2bc1048924c29901ccd8b08cbe5efb929fa6203be9e334a52d05bd0f89bcf6d8637348132f670e0677822edbab1557fcacabea9f608e3d856da5a62dfab764ea17f5c5019e5a118524e8c7a974ed648a24599773f5c5ab5e1ebbf784542ad5ddeb83b7aca928003675c901120c26a1060f0906d765fce06571871f0e0c29c12ebd02043dbf2e44c1f87508b02b54a25fdf9823d855fa75249260197dad6fa92484a49e9b786efe424e48ea1d8004834a302884c1f5951cd6b527c1adf5923b805da413b779983dbbd41a08b047a511927a92f74482f439200d1ec943254a82341d0081ad314261d6779b21af6b9f106eadec7094603073d30c75d8975882e451693627cd90487f7f4b9c3e25d0e0b510fe6db9eddbdf48abdca6a82f24bfe18da40a92f449a17c16f28137397fe1073e53825d275f17b2c469f6e0914ea449a44d4cb469c66eeb74d914f5859d080e3fc011c1930806779b6113d84d97f493609705524838809b7922d15cbb2752af24ab1f98b3f3b440eab33980c92d1103589b2ece9988c2d90288417dffd0fb8d61d73a0f76f9afef193cd4ab154c307af63d83477ab5e20c3e78af65f4a57defce13ab9375c9069bba845df4ec4d6485177acfdc5c3c3b151fce5f0f71b4bc15cd43adb760b04442bd6e2b94f1ece1caabab0cafbeb047659063b0db572385a895ff9e7b88c16db951c9a639bc8efafac2535f6ffd3219c1e0a96b0c6e6f6cc5dc430ddbd95349bfa85fc7e2caafcbb8313e0e90140cea8b671815939bf98093f8e8fd852edf522a106d0651df3278edfc097179cddbdb22b8b8b8c4a8b14c11cca1f0173693b423e1f1579631145bfcea7509144678ed80c447824dad5bcf7e6a6f533bd16991531af6fda9b58cbeb891b029bb582a18d9c43cb7089bba84abe439e5f2d293f875f9852e2f7dd35d6ed3d8bc519a545f52be9f763826bfe15496e25687e39954299561c2fb9487fd9e4b5fad49b9f4a8ae1397aea92bba744e6584b8bcc933df4c9f8a41f62e3c9387dea718643715492255fce4c3c0900de34f9c88f628ee2d13f3a819ee9f7cf33e965f631e12cc4fbe00e80bbbca870122debf1686e7106340f9f4bd2f7efc86d0ba1efc27530cab2f285474cfb7c87948525c25c5e3878447f5c2fcc4635a4689fe41652aa04ab4cc1ae10a846be4e45b1be822d116fb1a61f63dc2ae94b3ef0fcb704ee23cec27b96efcd21ad9fa3b0ffb37c73e22bac59e7242e577cece813e71f99d78ea0b753ee537ec3a99e1fe899fcc3055ea7a48f7fca653df132fbd4f3ecac784f69e7494aff4281d354fa4eb9f78a9c33939f9562b753972c6d2b67147b9ed86f21b4675e83df785ea857081420de39905cfae42297659c0e5a5b36e8b0473ed9e70792559c9690197d656c946b965b1adcc58a9a4872aa9e7d349f7ec61698b8be9cb97290f98e9190c53d8796001e50c579e9d5d73ecd3402cf3e8eb41325069544e1faa348ab509362937c9fcf139724d285dcac8bdcd0517577bf530660b13c6ecd57563dc1863dc183f7a163772cd4457555555775577577577695457755773fd34dfb69d917743752caa469dead854cdbce0e9f41854ed0b531fb1a82f8aa97a36954119533be8d88588ad87d9165176128496203b2a0105a53bca4e7154e0a4e07e8620b11f6401cb342dd3b22c681a49fec05b979a26bdf334edcb3e245eb7a8206d9623ebc0ce9405d3e9e4c94e725a306901758292329d3ae9dc1c7e88b1e76a2bc66e192349ca1ded31c6969f7e8c2429638cdd526232ee13ab8375dc81154ebe368831ae8c731594b22326a5ecf618314c3a13b44ccbb40cd3324ccb304ccba8a0820a2a308c0a8c0a4cd3322a308d0a4ccba8a0820a0ca302a302d3b48c0a4c33055993b4ac03b219d71ab795d93c5c795d98b0590ab6f6e5d9dbc6b3ab284d8bbe6c0dcbcaabbcfaf0acaab1a1ce631e2ec9bbc3cd9ef8fdf43555e4952a4d98675388c4282546bf040755bc0af5808b0f4f6c78761e5e970cf9fc890d4ab339fbd69153a681a739d6f9e0c7ba02f00bf38c0b731c71519a1cae5e43694057b7a1342d57bfa134385c1d54170fae9ee345078cba4aaeee030fa5e15cfd07a5e95cdda52e93abd328cdc9d56b94c673751ba541b97a10ea3a71f5571a14577f294dcad503a03429ae3e84ba545c9d08a589e1ea394aa372750128cd8aabff50970c5707a2342b57374269585cbd004a33c3d50da0ae16573f80d2b05c1d014ae3ae8e84d27cae9e00754d575f80d2d0707506288d8bab3740696ab8ba03d465c3d521a034375c3d024af3e2ea4ab40ce6ea4bb40c0fdfe1a11eedb0068556243a4f121e03f1432dc7f34e8d878ff034817176ad488cc378e8c1ccf0b4c5c74c0cec872726cf5a9167f7e1fbe1f36dbb2c22511d1f8b4aa5001ebe633eb13ac0be76f8be764c1eeec5c379e2abc80e87427bf9e0d8b7afed8e882f1e130a119c5e3b9c5f31aec3876f75478c6f87d3038e113b3cc6757864570f33d47918d7e13b3ed51d315319d4e1dae1c0ccc8a08e1c1fbf68f19a13ba2e4785ac60157a8d27c7b7a7e6727cfa3c7c9a0a1464c7f16929d017f6d6a7a1405fd8c14f33a22fec37a2f0ec3684f81a4d78769725cf4e238b679f42cffe31e1d97d09cfce52c2b3b718e1d967043d3b4b119e7d458467971184675f01c2b3ab62fce0d9557cf0ec293d78f6140ff4e5448a6747e5e0d93d1c3cfbe9063478f6eec8b3733378f64d06cf5ed25ef0ec24173c7b47f1ec526bc1b3a3ba1c21be9bf4853aaff1b487a1c6034485bea7c6c320fbf6a9be94a6923e215ee329f90dcb3e69c1207b761a7a8ef3c48465c044097e6d37009d8f3f44c3f8e8311681c25f49e414c1497edd2940ba9c5a679f581d1c4fac4ec46284b1e94be3b63a22363157bd3ac03af1528faef38a9f6e286570d5933fed7cf450212c84b0c8e2b787ecab0a6121f42b856d534ebfeeee8dd45a778c3188318831e8acb9f5c63ceceede7a99975b7d512cc618a394aaaada72cb38ed54b59de0adcb8edd91bb6377ec2678eb612ff16277ec8ea5f6275627b22908db16259669a49256fa424d858e56c936e11f26ea9e28b14c2365a10a1dad9226fc4324b14cc342153a5a25db847f249649153a5a254da2c462a84247ab447a872a74d44a58855e89b7dedb4a22a960db563256543154525228271faab22a33337364467dc8ccec9d4c1dc72f60176cf10bb51249cb585995595632565431545252282728ef64eab8adc4e2ed6c5b7b0c55a36aec2f0a6f1d73578d32d23f7af641a2d62df51863f36a9f000843518914282ae8e9e9e9514164f97e5ec730f9f11b2361a44c6bdefefaa434ab2f8b42a958dc25965c54ac9c4af5bd79d105ccd1abfcf5f36fbd71dcdc184d61fc92496b430bb54fff34502b0912020202020202025a22c6086ce2452aa29910ec9e998ca8a889d151ef000101010101012d31d32df699999999991922a019c618889504093119f2f1f1f1f1f1f1010202020202025a428dd4488dd4488dd4887f80d4a86513a3a31de6e9611f1f1f1f1f1f1f9f2d020202020202026ae2031424c46488688b7c7c7c7c7c7c7cb6688bb6688bb6688bb66895f86cd11f693b1e8faac77dc01f1ef2f1f1f1f1f1f139e221f60d8b31029b78918a4899f0f0100ff1100ff1100ff1900a71cb344fb7d8354fe560f384339c02af7954cb4cbdcb031831313111ebee6cd33ee9f1233956f2a87d2e2f438e7db52c0b33c71848f44c7aa6b9fc16391e6c9ac3f381916f6f30bcf875c90591fd764dd336f9658e612eaf7d21c92389e589a8be7322f14dd9916fe7baf581756efa545f32dfe457726d73f9a9639fcb6333e3ba1ebb3abffab1ed5be9531a0c30116528b5ae086d5dd379e9d243aec9b7bc2ea182c96fbc1836c35d96a4ae5d89ac9c5b8e1c434e2f5dd7b1a9abbe1a66aef996719cec7034cb5c732d9beaf239d6a357a283d04b5f8e47a06b87d785c3abaf1a74bd90216557f0968bc740e410bcf4d0315d41c54f6932efa296e19d6e49d778ce8d77ba65cb963b92773424a40e83be48d7a286828784c75f246f6f1977cdcb66e8bd94246f95ca9391316fee68c508f5583779e92149a68bba251dc3c1b6ed70347d89ae5d6cde915fd1d6b44b6f3128cd18d4b5b9f43683ca704ef2f02453f230c6875d9479c892ce7d99b632dfbe563083c9bc9439e9cbb2222487c25fa499046bdf32ae9bd4eea2a0e65017d68ec57cf6618d611ebb1efe2d85622cdd61539716cf4978e9dd8329fe14d9d54a2a42fa16d923332f4f9db8bc036df77775091541efaf4ba880c1f763ab1fbe651a9546bfc647df322edbecebc16bd7726a7cffe8e8bb715d7aae72f8d9999880ce4be7190691de2ea3cbebc86da1edc8af730f8c0c59828be02f942ffd93f2470e76b5e7609772afcceda70caac47c5d420e08bbf46d7d0ed9ef19649d9d678e16c2a62ea1fc79f66d0aa2d734bc0af9c08b671204a44a85cf2f0d5e85a638fa6d2371dbf586e250ae24dfbc6f9fbf7757d3f7344dfb345c8e5d1dc2741ed65039e7a1c73ddc627fd19ac84461d8bb7deb8f33e2b587b1bd907bcf3576a170bcd983b746bf79a9542a6dae9dd7dda63699b836998cf8f0e445cfe3ba1ef12383dd1e196c2ec5e9165a9c429b1f1e1ee670c93c6449791ef9a765e251b7b86522936ef9e9e7c47b869a46726d19cf95eba396e1b4b59ed2da34432f478c8c47364c5a867bbac55e9a21083a37439fa14a35bd799a7c022ff45cbaece12894461641caf83dee7e98fe9473fa936f71954d1a835e0e7fe8443fffd6cc5cf22dc6fed2a76dea707aae72fadbfb3df7bc7d908447b96772cf33b9e73909a8c9d3bc2e019a628a26efbdb6840760fc7c5dc203a2df5050505a32cd64229d7445b47b9eb7b79b5a234d0f49dea9cb21a538ef8b6fc3ae70bd0ec723913a739267accef38c44f23e97f77a66dee9e402b66726f042ee89e2c4d9d907e5ecdca33428cece2b509ad437e4f427ee39cab7df7545788e5ae283291ee5dee779ea5347f90da37cfa9a33b1af4dff422d88e69e6fdd0f937b5eea72b4a91ac1738efa380a06d9bd8f7b4ae085f148631e0ff3301e3d7b94e2e4ec11885d4148ee397bfc6157773fd6e49e6f5784c9bd52974372cffb229396e9b445f2148de424df968b4c5a465f9a174626cffa92d9d8604073d517cf43cf51ae753828d7505f744f3a4a19c488c4d74e4ebe9313d410efb36170dd3bf110c5538e92a40a1a1dca513cef8b9e4a618e42a9e7376c83721457769d38e9e48b8ee2a17cd24f30d4b451e97af00be1bc2fbeec7e9c3e8c59e1180a2fdca719b2469f796872cdb7367d2c34b8920ff73048026f1f7313e97379d290fd761b76b5967538eddaa7626170a5673f5cbea7cae87048d366c531145e1067b09dc87e101583ed2c2cd2d4bf4d5e36854e7c8a371a1926db143ef129165e6589a62824c6d33e8fc1fe907bb40fb9a78b0fb5f821f78442625e9bd98c5fe8a5b0fcb644d91b47d836d75deedeedddddeedeedddddeedeedddddeeddf6b5a257dbddedd8bddb31faee762fe99eea42a24fc60511f87ecafaaa1f9128b98d7dd34ef50bd9c3fdd8b78bbea96edb72dce52c1116e663d72faed437e8b7c9632ebfad425d7e91080bb31e3de2acaaf264421f716b851776118bc00b9be8756797b91b8c57df54559de55db9d0191b1e9a4622954adbc6715d67329d4e9e870a2ac463087671fcf52d4ea0fd50193675095ba59dd71224e1575e9794e0e7b7de79f59692672f1b1a1a121a9ad1bcec68a85b0c1e758bb4e3090d794cb2a396d19a1815a988868686542acf2b3a5af16170f31fe2495f29bc502be29d9773e5e74345318514a8233e78eb2b3fec6255e8adfcc81b5ef95939c2201b794615f1c078eec1f35ff9f1151f06577c7ee5e7886794032f5cf1117ac68117aef8acf8ac1c6199f87acf885da667f7845a267a4d9ebd2214d173e831195a0fbd2f9ebd383cbb6e8df41015c5f30b9e5d8617adf83ca3b6d879765450cb803fa8a02023412408f2c208f2e4f0537848d4063220110c30d9bac191a26790a865f4550436c1481e8247b265441785b3c50f83faad9e160f83a489643bc0298c30c2b8c34b9b4e84a05df32632d7e6ea009a73ce4d2732d7669295f6dc6bfb6257007db56b67807dc51b78fe618b473197427518028fb4c5a5196aa4164fcbe88b34430d6bf1c819b67e5e6050cb80449d921214f40c82c160eb042550187690a8655a46c2168f1a521fb6a2787690082402899e4135b4787ebcd60e83470cb2872d9e67671b78fa2178f4e00f8fb63dbfe0cfb37bd1b36b62509a4f836a455bb30a33067599415dd2593bfad41b9ebdbf25bab51bc6718f57b3babadc98bce243971a08ad01f815a712dd5ae7574bc92b0d9ddd2ca5079bea70096f0c3dfb2644d5edbbab8aeded6a1e3f21dc9748a4904badb666f390e595f59ae3c4431e280f676c4aa4195bb4288d0c57a7a1359cca15a3a673a5b8fa0ead49a1284d8c3362f4dd8d1f91c8627dfa1c028f55c4ea423b9ccf593e569187a2babb75c9b715a7ec4af17077b688135a23ab08358c0cb5e2a10ec590417295a251712fc5e22e3c3a0ea535eb8ac2a3f554b135d28b8591412d930a9231ab78f6be08d50b950cfa18531a7581f180d2b7d587da543acd375d6613e72a9f3ec7615cd775aa3e782bae2adf7cf0525c3b1c9413df5028940d2bbc4db20abce8db0ba72c5324493b14fe8a5ad21cdb628064ed1aa7904040cf51c66da514f2e7079372a38cd8177fcbb4c4a6d22bc62f611d4ee4b24f5fdad72fb35e7ecc356abea5a9ad2d66c21acbc1a63c227d7c9ebd5d6a98b6715a92f66edf96ae75397d92a42ea7a78c82d4c91ed9837963535b462cba64664c1d49daea0d7c6c6132ce9c703bca329a05c9a16eb18799920ce815f351b5465569347bfe33d37ef453871353aca254a350a8fe1a7592924a7538a9ec86f9c30e2815644ab18a525484be0352ed744b1a053d3bd3100a3ba0ed5945aca2185d01482f5691ea84667b5352529c5b7d315eeec4a3789472431ab9d1491ec90382a00a87f170a9a054c78111eca291d1ea4b69c55617230e1c34b81863c82a4a3d0e1c5d8c34b8d587f2d99744e57248d3e4d0b34b2fb6e686160b83f9dcf0c2eb18bef24d4565775966c8f0948aa77cc6a7fa22632a8329377d323a1c9519194c754862500c7af6141457edb0dfd0e28616cfbeea7ac83f992c54ca449921eb0b16cc27354316183362ac6e08dd107a761ea2163c74914964e2c2c52f567192a38b4a22e7dd366da87037e2911b5df4893e3854b817297e7ee2142f5d048a4036b8f8c5283c1d5dec893d383acdb71bdcea3b917c4b6dcb39e671738c9b25c7a1a9b492a6390f5d8e361b8c0de3a1eb230d73cd49a5d99ea3cb919a544987e972e48c4560bab81377a211982ef2441e1d3a74987ee553065145dd6269e4d2481afdcad411f30583ec315d1b19b5b8d5d7edf08241f61d5d376982a30bae87ae9b072e7ecd0583ecab6ff3a16b22a21cdcea2bf1e82d78743dd4432fdcea23613c3f68f143d74c98fcf04387c3f90f9b6f301c2a1584f1742a48fbeceba095a7942861751fab0bae7fe87ac85fa53a205716aeae858464646462b8d597fdf8f8c84cd140403333333bb8d587354feff4ce4c4731d3754ff7000104103d70ab4f1a356902041840747c4443431337a20e090f75eb0a6ed27441d3711173abaf3f6342e32a9428e12404057116422ca4454dc74c9807b7fa98877fbab5e2281c24ec935aa522bb365f7db1f2d9d8740cc4be051144878379102e6ef5ed679fbeba0f49e61cc6c3f13ca77cdb525319dcbcf8658d210c0aa37db77141c4203a6600c430617ec386f33e7a983abd7aa7359cabd2ac2b87953c8cd1481ecea890329169c9e090465bc3cd549007ce20b9321d50b736ed437272ec43d272d2c94b2def36c8a4e4a58bae43b22e9b4abe5a495b558f0e184e47171da6f3c1dd1779e7e8e80846878e0e47731d9ed7044751515111ab0bd2e953fe21f49d37b18e9e5d07366362bae83b7a95748b5dc90e9d983061b26307d7438713bd07ae439239f6213139a9f421e1f197c953415b83f92c0c7b2a687f7c7e7d309fad618541614ada18f4857be87ac8efe9030f3e70dbb6ed276b52369b28b6a7e7f78b9f7d2a12684b0599633e1b044fcb989c5dd5b3352c509a0e810c587178f6fd82f3103cfbca1d9e5d861d9e7dabc3b3afe4f0bc33d4d1a2476c02a0eba1e3259d2fc5ee20ba9c181d00ba9c9d6b0400ddf2b06f2e8ef5edb38a5ac6343b56d1d729619069b80b8baa0883cc9ae112cff2962ff4be455b5abe507b16677d44e2b7b876382d53c5c332553b910e5e0d0f3b20195617dcfac27d1797e9706cb07c7db3f1b18a58ee5fcb0d6f99def2b90ddf3e1bdfd7e2a0b35a9cc5593ebfec0a5e8b8373b6f836c3f9e04dd70e488bb3b05a5c7f3a4b8733670f5ecb6c6971992ea76526c1203bcb8c0cb2a64c8704d10d56cbe7321c0bcb460b4b46876363f6e0b17c5bce06ab65ae7eb8b7788b4f0838a088c55b58dee2353e55904586d5e2c2b5d09842a6fb4143c6a6c321b5f816b1ba68616191dacbcfa524ad9127e50c9fde32c359dee2df975dc19be1732a832dfeb9e92b627228fc659a4966f81604076486b3fc8637d637c3f5bf6ff6e0cdf866cc9844186467cdc860cbec9660f98c169fe1fea982aca90cce709b2e277ecb8c0cce9892c58623b5f80db38ad845ea825d335a541d0e69f6e0cdf01b3611893f63ae7eb030115966130cb293bef8361d078e585d3479f6203a1c6df5b1ba581876191fab0cfac2bef2b1cca0203b97866757a9e1d963b0d6f0ec1dcb0d5fc0813507561d5860dc7042745e7cac012f2786b9a6f9b65d0f9d2fcd503aa7f3dc1719d4a66a51f3a4e77900e8723ccfbdf63c17a2cbf1e61611a2db9dfdf66f3e362f1000885ef05afa3e1703be9ea2633e2d739a1d10e6934ded16e6f3ec1d50cba876bac51e76401dd0aa7634d54ef7ec80bc787630829ef5c5b3879d921ef2594532409279fc5c46ed717ab6116f3f5cc9849e55a4da79768c8f60dd980bb1dd18d12121a263df70bbc5afb4bd381f3c202ba70074393b878801e86e8486e0b68ba49731ba4e172643c3647438ddde1036121ba29b99899f86d3e1c439643d3a1c5691e6ac261c3799cc43efa5546da48fd52492c023b1ba60903bc74a8ef9f675d3b34f72eea3c3d97c3b207273ef70b6d9832737e944e8cb599a91412cfa161ddb4abef9e07cf04a8e45d72f794b2cc5e83dba9c3873603d3a1024f5e0e2c72a2a426375c12e0ba85845ac262c593a9c3ec9fc249b4fa85e49563f340ba8d87b609f7dac2eb8c5eea3ebc1df935514046f3d64153dbb942d29225888e854f18b182b252795b395360a60b34f7a9723dbbf8df1e347c70da003d25ca4210a107c0fa0cb89bf1581b910a58da465988c5d2af12a044c986fb16fac3cc13ad813ab23b155c11c92649b871e29db98db9acbb619e305bebd48da407739da6f9fbeb2ef8848921f207dab3f446c5500ce3747829b48903c23f286e891e6dae4755e3a2fc6bc229b6bb74a5cf086e8d11379711e7ab187ce7ffa227dfa2a7da1eaf909d9fdf0e1a56fb288c73ce3485f1229b1a82f9867a496dd1d3b93b6988c9b45c9cb58916d8b4a13b19a98f2a12a54a5844152283a5242504e5e502a7082ca71620194c703ea02de0987b7c4c9d43a0d3175a009031d77a3cb00b7d9e0886ca51a9b064a24971213248d0669035a36350e64d89775e023a662977c7695de1ef82859f10332b67413b167b013cdfa229d4585cdd697cc376c0b58ccb45555555555959733c6987737537d9c219756e36ac6535fb484f5c0a86e6c89eee6ee6e2c6658866124ac1b13d21e76c24ccccd71d78eb1beb06b735c3796a337acc424e6e658eb0c8b2db118638cfa856a4577634262b711ddc2b2887116b38cb19888c5cec1a062dbbbaaaaaadfc4b001601ae384b5fafac2ad3ac3d819866119e6a42ccbb2f99130ac3152d6cc8d651896c9d8374c3ce6199e667b5bf44e462891c63362198661d80cbfe70ccb186b6cb3754d65a27b51ce60912347eec6ba31cdb4162dcb26d65a3716d3ad8e587386313337b36758337373abbeb0a7987bb197558d573bc6e8cc1d354e2f75383a7bf0fcb1ee6eac31d9b155773a0bebc6f8739514bc35bdba3aa72fbbbca22fbccb2c39c6a8c955c112b61e269167673846fb28c6c7f6eccd262dfb7975a2f5edd4dbeb4a3669dcd93ec6c7c6d8f9e034896546a06ba4930a07c3308c649255f881a7beed46547bcb703b3857380282128fe36117f3b06b399e766e87416ee79d2bb249c1b31c0f83ebdccef6c3e0fa4e733cecd2c794687457f44c316e03fa051a2244186184f1db140caef30fbc50f5ea71aeb4d74aaf42607ce1ac996f40ecfa61d7aa47f3ef26c56fb84df1bbf1bc6e9bfcfa371fbc8d88c18d8bad884170551b18bf9b918a25c7af6f60101935f96223e242ca5590b4f14612ce3677bef4714518dc7eed4893db6170b926ec0ab7a0f7825dae1d99332cc5e032b8441bd1b611fdfa16b405fd6e4cb6218edb0d8c2630c9785e21f7aa7a156a905becad4b9e3dacf1edd26528d170640e96e19cb9107c66dea278f6583af24c9acaad90a578f6299e4390ab6090e390501ce2a1678f4259b04b3a4b39b5def91b8e19473bb0afdc307e3b6de63ea267aef35b6b6c53b83f57f1d7879c7ea7ea8bced5907dcc9988af3ee4f43abd243b20ec3b995820d27532b18ff94daf7e44cf3c9b41b01983f4f3649e2222d8305e3c78911c2e82bec3ce0b0aed85c3d525cc78c0f1ed6b5b0ec7a7af2d723c7cfac2f1e92bc7a7af6d5b6e9bb40cfb903c4745cf4f1f76445f24e62a975e23cb5cc51ed9e30c8fd1b1e8987bc4e4745fa991cdf018bd0941af5578155ad2c56f303d703f4c1a346ab07c4707c4633a20aa15bfe91a1f102e4e75c70e207674406ac4f0581d2f2f31dc25cb78e87eac3e8e2e2773c93e90c11c59a65a59c954df3e0880191cadd60d1b3666a2872ed1b3cc55eee2d2e1645916b3006459a69a1d90cc55355d8f3885e078f88aec2bc784c25f3c388e0f0ad58b8719abe01fa46f4070ec937295ca2bc91e98d14b0fb1a297aedab0391cd1e880b04723767dc1ae23a5d1973ebb1fecd163c498e17ee8e2311ceb825d2186356157100c2b6297cff038c323abcbc13c6651f52926c4752621c975a6534f0f105d0ffe2c8c79cc338fd1553ea3c3514d6550e53354df894714571189beb2c21a42e5ac135ff9542b1f8ac74f73956aaaca690451b9fb8a4b8f40501a964bdf58df10d5b7f2edb3b8abbee8ac4f5f6f78e5d39fd159583cfba26f369c8d8d7489e272ae3a1c14df34655033fa307314df581854c7e9825ec6f89d38caa76250b3d117d57c8b40509a21a7577da982862bcd1611ddaba0e1d2a392ad71e932b4df93f4b0a15265ce445c51e9434e2f270d9781652b526f7a4535573f6cb88bbbb80d9738be7d6de7237acbb9c7c56bb8785449e980cc1a35666b12d99f27a8e82b9f3e7739d1dd559f7e7743f63f8f1f13fbdfb3842e3e6bb874d9f970b9718395652b4e43e54cc41f72fa6c3ae8281d10f795c9c43e6b86d13f3fe980d4f06c32b1af9a61f4e9370d7eccc3e08db9fae1e236dcc60c326b4c3632837c1e7fd84563869914ecf219240362d77732753919898b9fbed6d198ab1f33c88a13d957f99c41bee9938df8c00b99e7a54725ec62cd50bdc5a5c72ad8a59a41d4a34b8f41ec5a996eea7eccf038550c621ee72604c7753eb88741e944f6d98876e455cc5bbe199fc722c357333228c3a37332543c84096bcc48894aba253dec3efa8bd660420a233dc6988f1e8d78d153a262986b5149cb6c135f99a14a6e7ed337fce9ab7c214b4ff9525f88d1e0a5a37c61caab9f7cccc346a46f9396c184ba255d925033f44ceecd502567c849387d47be1d136a198c06da6a1fc277926f4c07dfce4da1ef2e7e5392845805834ab8045ec83e4da48751c9b7b34f9766fb7ac12e8dc126ec527fd236f976edeed026b2bc6a9e118f79945248ccce0d86c18265348de49b62eaf28b1f0a79d9f9b61de79c6ffc244c33e72c6233cb8274a95e331c34994e6d298ee36628e4db37df9a935f28e4dbb115d7b98fcc3b8e731fd1b99b961bf844cb905a6ad275d5becac91c731fd9d499eab9ca89deee23ceacbb8a2dcc5e738d5d26d79c63d7c935f7d8e5b9e65273d57cc916bfbe27be711ce7a1d73314f29c6fd703e559f4520f29a5945807c4f394c9dbf394a7a60704c54b5e9a515f7a865d9a3d85a43e7345f94ebe50c887ea4252bf8eda9a92734b8529b957f253c7fd867db2f4855aa87dab1e9c6fae2f3aafafdd3657399c6fee839b3a75fe8681645efab4d58fcc35d766363dcec17a6033c5a0f2af6349e287118b2f9e8757212c987487c3694884c320d181743e88ec6b4cf053c023c2df43fa90f614bb36e6387b902141e2d450e779c790051b360b31bc6a491659c8228b98c51064f6ba240b2ab02cb22c50f0aafd8e485818bd6a2b95b0283a795d82c514366edb8cc061214587c50c4cdc7e4bb04001b71fea75c91560bcca43799e173df45c2cb9220bd409aa535fd4922baa5872450f4eae5801caca514a559492120595531262f04085f28295ae0432b4d7255680e055fb915e97081dbd6a7e6153ff70bee844b4cca7ade8ada11d1f3d54a28f407cf4ef99b8be4469062f0e5922fd6419bcd0df5bd3b4a3f7301c3675894008bd2673ee6d0cac724e1ffdf471ae7e7c9ca1ce23f1807422f191ecac0eb02fccf7854d1eee25677705d8179b406e646eb55579c1c0c92c534c6263c0b46c6addf21f9a06de3ad7bc9a6540ddd2d8329bab2a52221fda092ad12885874c79184aa6914a9de9c4d47da1c783088c1f0da59e95f4455d7a59e9c49299382e1a751d67e236aee4915af34eb4cce38182a5644a9c51e9d6189caa33f6da0933af2b33469a869c1783159786a42f3a334e36269928930b046fdda391c6682d32aa7aa87dcc3c547df7ca564ddb33d526cd30c8aa31c6a8335aec30e6e30c85685a8c371cd5bfe8d9b7552c8cba8c5367366f58ae5c6654dd5b86f3e6a64fed56cfa8b14b1f095ebb2a9172b16d313a2986510b89c4a16e8f1d334ff3cd4a539d34434f23c55dd2ae5419e3dc302ec6c85befceb868c49aaaaa320ebc5dc681b731c650e733552d468d2369afd436ae94715c8cd1a310d5ab47df3a1c8f1fb65f78eb928ba6e6a2d72df6385d14b73be33c09755e8bb1636c1246dae28f1e6c2cbbbb9b88eecea162f9b88ea7167ba8273a83ddbe6af04006db9dc16e2ebe63da6d9288e1e1edc232fa6257c612f385699ffad21ef6abca158450b01dd32dbe5d4a41179c4a03007d696ff7adb15998f6ef999316ac2eb0582d5c686999b185193358885858565a58ad646441868c152cacaca8b650a9625c21460c152ba8a8a45421252535944aa1500105e5640a27272829a0509e169e778ac2e9648282c9d43da1ebbef565bb9df0dd4df8ee25df33bd9af6fab2dd577cb715df33bd5108a5e9ee6f0780d230f3b707a134ab34ac1e83cdbede5dca1146574c3f904156a9d6f5a4694beab784e7bd9edeb389cd50db19faf7ac811706a42ea8e42b5849931c550ad1c00000008000b315002028140c88c582d16016a7ea3e14000e83b04a64529907931c8b5118e48c318818000000040019919921d2260036373f6f90dd0d0b4787dd65f79ed4416503cf048a9f93c9971fdde4026f3b1c2edf9c266b90d9390bc20f798822e84fe7f31d75c7deb2203758bee2568760d2d6dcbb7e23dc8a179daa7f4e3441591fb3b8ebf5b6a653983dcb6542cad8ab4f971c131267284e4686df2355ec344b3a4a1d893b42ea92d3f110b714536146d209608bfb9d1c11a9fb832b74062e5f6714ddec3a40e3f57baf9f19d6452bcc83f26de20376063b997a02f6df4a3532c37b3ee7fc61b7d88016489bf1ccd710709323769b3899ea78f9a72e05a142a047ce210e0b9fee86bcdaa8581540506ffdf7caee44e9a7cec874621568ac92b42ac266144a6475aaa1047a0334a21fb4c78c6e8efd065acce6aa4ad8caaa7ac7ab527840ae7dc088a592bddac22c8d4bf7c298888acc950679ac4a1459d49629fd26b554f6854a8953b6a70916207ed685ce2441c6f685d84d21a4556689e330d9c957cda89548ddaa1bf5ec4627c05e09da6e9659b286d12c66c71ba366367a52ee85777d191d692a710d2cb462f4230a0bdfbb5a431aa3e0ee67a4c878d8ed7a9118359454cb846081be961b2bd7c43502ed4a5c73252d3c5600fcf133d2baafc861f16f7f1adf76683476c71cbdac786b477ca6fb0e97cb7b0aa23ef1c65a5d3cfe52dbe6f985a4660de81f97e4a4f3d3fac34fccc3faa5a912c8c76c86df0f763ee24590b17cfe87bb5d60441fad507e896e73012e8338f02d4207810244eff6a55268dd7e9b12cfd74602ea079232e1562b2f3ae67a82a4413eb901a11f8122b2daa25b85b2dfc224bb31c705b6d44af5fb24adc77d4645dd6d89c82767e9667a00cc6958afef054345b3e9ad4c5b68cc0cbae23ed620c128209f71560984e2fa52a01ca0e6a55001d915e1c795fda55b01d95812e535a07448431135d51d3b512e384d5225cfafa11cf157b8ed9cc78999a57d62eda0252c8b25efde8f6e37fa225a290d991d7a9e9bd32162edf87d8228032c63c72ab3f75847e92d4f7bbb7205f26b58a5797f5015723d9c9a34d55539101080d7444d88dd360db51220bd5373f5e4dc45a3ad8dbb7a632c366c5666505310898811f0fa3aa714ae96573fe23c0da94c830894ad142b042908946932cce5154003ef311341cef7502cfcf9eb06cdf8a234b403ef7711d6014b8c761aa0f5c6723e2c934196fb5ab17e57b564513886db3d077256dbcd59bd07c648b1f3b46963cfcb992eee5ae9433a3b5c272b045995e778ab7186c9d7099fdb03ae05981b261fc1478545b146101fdb234fba31d0e4532d59f9c9e18186089358f24f0c2d7b22736d78466ba2455a46781d98975a84386e3147d734e867690c2398b9c612b52c1ce49db83008e21f44ca2a07dcfcbba6feb896f219ef45d4a4d9f28f512348092206c289c00aa2dd05dd9b47f783ce00b7fd0415b7d52eee83ebd7d878a78357253f374761eeda2c8ea8b48bd3cb70a1defac6b884c7f724b64aeb2eb88d62a5eb0c833f88ed83582a29e47f9cf48669ee855608d6345f9d06bee15c1c161757990e9a46fcf0fcb528cb433911283421beea631235af1e88d3ba47712adf0361c1e533cd686e41ea66f465db2dfe0dcedb1beacb5cb5b4056748f14464e090890b1e18e4f516cf28a3b27b549396fab8926af6b695bdd5fc710db26a13d934aaf6255e25c0df8fc6528599ddf8721260d5af3daf95f5bab3490bef7aea1f95a8146822a029f6c308514bc29baac2a1597cabbe897ea68c005766b75570f306d408685b20212849cdda740baf6fe0db31463f25565146428017da79363891f2c6b20b9ffa91c8db43308cfd1171499a1098b7656ff6045b3613111b8c6740807614921d3b6636a9f64d8bc8d7e48ab74c6649cc207917de8fd9d41034746104a997004d44632d69988b7ed4aabc760a31fbc4e185189e99aed2994b1840da7d16ca8ca5666ba23ae99fcfc19eb8714379816688665ecb798d2dde9cd12a617258640a747b20984b94d90129b0dcc0c508c49affc304e418a599c0270dc9cd09bc3e8534542f261b13a9a6e50e436bad78e0b1581be5068fb3ec02d441a023cbcd0e37e87aca824bfa83c13c4f941249f04419651bb2a5f4ca38e16af930fcdc64a4166c53bd0763e33c8cdfe8dde761cfc1860cc78f4171c6b057877ad96840af2ef6d3b6556ca33614ad69a9ea3ccd2e909dc7f7be366fdbe3c3470fbeb73ba5f5ec965d5a1c157ce044f1540760bfdbf4ee9db79b5cb2afe106004e099c71e9be7dbf65bbe08d4f8a34322bfa9384d8c712191f53450a495797cbf97faefb9baed26244f15937518102c9d888864e2d972567b31299872b20cd3e9a795dd79350b8c6b150fade55d54a87ea9a9c58aab6e18666efe4085bbba39f5000aee82e795a6958cee5acb2832ff44b09a1a6b2320b8da0a2307e67688fb0dd5f1440a2f48b4519b60b8a23aab7b4f4722e5249961f0dbf45c60ba812f04e8d15c54557af738fe25f89ad3bfa0a3f56e464c96a20b66e7d214de4f4d536d51eb616e4dbb523882d9d23270bea5b4b58c65f2bbb8ea957ecf1a7a5e11793a2a5b1cd61d347065f5b88c40146f823b38c242156764d9034dab23828e5989497f60cf78be3693a1a7da5a7313491b948c277a006b5136bb81ccf091c6e7217886244e7fd31471e8a07d968e8e241eb9a3f65d40a0e2f56e87629c68f65dd55e19d0e27b5182537d404fb997c74236d1873588d165c2737137ecfdce321e04ad54412fbca200a942e0be8d19b9504af727768af129c294599ed24a8e598cf770a3443a420470e06b757589b66481ff5c11b00d095712d84b67a77168eb084d2b41b2b6c5e6734c5bd1bcc885e03d568a10bb26e53e64c12d205a9698016fcd992de5c7e92aadd2961ffc75a615d9548e407a97c29dd74f4915bf3426f3139e6e9a4b57f0d58bee193bb9d6f093585cb3f81a8be4d8654b0230ee50feec1a70a82a7ad183a2d343f9e2e92975c90e6a9d527a9942f661d7caa32b619fa64aa9dc279ad4971d90c716bc2cae297d7954b302a4696339966affe995da7e1a5a0ccec9f8835e44f7184c7cdec0bd3a407208f641892920d03a5c04ef8e2d3c8e51510dcb362dbed8fe0555fa02f8e1e9caad3fde09cd98915c6f3df67a287f992ffa9d205e34b71e1f6bf3496aecbc1f9c4b35d481625e0e1ac5cddd1ac87a2729ff4d790d980d5679e571e592121b406e77c08a6cf2acbb88b5668e1cfba810b875da01f1a26b204fe9faae811d43f57ffaf8989fc24e83075f5ab495c2f75793c50ce6baafd8fc4aabed72693b7af5406bbb9453c9994e385009af73c20005d68cb7628a08e35add2027247bbd02a663589d8814fca9ca1fdd7c699741ab4f644f1755545cb2651ff86f7c66170f9e9e2d0fe13b30d04c30bb88131d3e9774509a1ea288ccc3cbd52b0b788779560734f3e89ecc553f26c6d0ed092ece51668c12649f5ea65b0cedd607220999ba3ed64e895594ce241f292134c784ab85babe36629fbaed2e6dee1da32dca0754b9c0cc180cff424b3fdc7e5dcb6a2b6a22c7c61b1f2ca6cf8effe0b293901ba9f794927d61baab67f8fd473b9ba1cc7fc3d26c62046dd66b4ffe86f18319de5d39e0ed46cdb28b4fcfd5f6e36d5d4c2c6a167bbef9924b1b1dfa620e40e4de49f871be18168bf2d092fff4a0d0ad2636d0709fa6e2eb6daab928f00adcb5e5dd014eaa50cfafc8de3eb196e75eaf90abf4070264ac103836b0aff2ef7fc185d303c6cf783b4bdf8583da8c25bdbdb62a0afda11990c305cc71471997e25bf3c8af0564242c214879e1bffabed73d067669d6e337ad1fb736ebcab457fa7f82bb23ffb21334d7f51fcfe36b9a4602f32a8fffdc0022496d186f77a89f940f63df8bab93039e657c3945475af256524ea448147a72fccdf892f508927cd3f5fda5d48722c80e00095fef37874172e8995bed50dc1888db84a6c7ffd7c2637dfa04e401abdf6eb581bf05c9c4c5adcc27a043d970867eaba8e2e72eba7d9b60b7b9056826fb11bb22c107a72645ed296e3471031f6a4645307c8a857a76fdb138a6d872d9bd7a4aa6f3436f2d76eb568c4183720d9a36a15ae7c45ee3b3da4341c2e72370d96109c21b5bb61279f9aad3849b6caed2c57696f10848845998cfed713ca00ea29c9194d46c66c44d7ff9d0579911f98c24e7005a0f2a3c588af3c67acf52589a179c9643e8867d1b95bc312e79a57be501d38e708d4686d944b99e639cd4fcf27dcdc1a43c47690b429bdbe9d01b0e1950499959b52786a820575bd6643221283017b5fa43dbe0e6c1019ae2a0cd85469062b75434c7c1a4fad3330681744331af9a9bfca4965ccb567240b762449943183cff30fe3d0f24895f49620352231a5f8b7e477ac3f68bcf2bed0f0eb203cbfaf0e659b26fc09ce34b1c8f737645834030f26164eab1fbc3174d1c66a31c5b6d98bf08f59fb3130142b45a49e8df45ac55207c688c5469c6235fb9e391a132e190fd37cbda0eb0f03cb7c13a1a95880ee46dac0610e6075906e46f47098ca039f672b31d72d4e8aa31cba7338e49534f098f404b350828b6bfe599bd39912444e293aee169c7ed4ea774adf8b863e6ddc131f1499c53b2ca9b1d2619801a908e4b43b115f1080e68aacf24dee054fe442a24824d1d83ce281420903c65f9060989de7a27aa5d904f85568f9db4d7bd4cb13b5a3075a90aaf5c874d124b435d36680dbee6daf4a3acb4e1ac7c27f34c1827d919ae9ebd409ae74ed5c776a258a58dede1800300db3f656bb7f255f1acdb31d8757b34034ef2e4cc71e0e6cb4971d08007489cfb6f3cebe0ebf6dce3663890cd3f900258e3240759f937ec01d20dd28277264b43bbcfd1f286fb3f094619f7a94967aa9b109cb8fb257e48dbfbd34921fbc328a3311923b10e1033b97230c01be0bf6c14c43011f684b485c7c2efbeede79289f473cab939dd53b392f2d6746abf29f669784c4e2373466b2754b4830a985ddc794f25087f038ff751f7cf4a3b1544761625b9a13ed3d4ec7c4b0bcf2c56eacb088f9a2b0fa95d0f25940f2f45281c58702de98b93af830f2b8346f2ffe08c46a60f3b44dee93c601c15e79134d8733a2d071d46f3f5bde431dcfe9f9986b7f96843553ed26ca166a329bab53cfbfc42e0d63d82a9573c7ea11f74040dea7934847cb61d6c877e42a1979eba652e1f67a7e17f63cf8e794a190b8bb5bad5f8dff8cc5b121966b6213c3da2a5dc64131c07b47aa8f77841be68a1504f075caa198bff1ca658c25198bd1be4da34658abdb2bb224bdeff62e609993e4401279b602fd0194758cffe51c1df67596edcf5b397dde20f179aa6de40d40d0384a3cc3d6b953fca7932260c7104df69cac569479279b302308a4c652c8367ef4175572fa24c152ce13e5f9d9868a800b32193f78d23c753ef75668685dc248b0f570d58d8f577b31ca7aaeea4c57708325692d7023c320012c574ae4f90234320ae259e9b2eac71fe22438736f291190ebc3f51bbc4eb43b3356aa5e03b5dfac1f880045ec24a246e27366ae7b08ad18fff7616c7e08da1fa7b0414c23b462cf0721628be87de2be32c5335c94cf58e5262ae4162ee60e2d72bbe32c5cc83d54c0dc4701cc60ff645ca82b14929a5217818666afd79beb40de9e5869a2a823b7311c66652f064d4fde2137e05f97faf7e79ccdeb868ec2155750b514383f0326c61af394072943e694ccf64f70c9e923fb6460289735ffb554afae9b1b6c60a7264a12dd26cd391e9a015edd46939c837d232af65f8a21b3fb0a56910796a459708b805fca9ed8ab7b85015d2f6c79c4fb8ae456893380903402bdbcaf12efdd820382bd52c394480f3260e9de824bee6d0ecff10ad2ce11f96557530f7630d599e4511c218a076474a17f559203974ad017889bb0d63f6e44f9d367241e02434c18422b04558c9d1612064c5c717f896c3de726e0c43a2be78a53353fc87f192686478ac838ea5ecbab343b50e1cde4e53ec0fc6fe47ceb121282ac8b6653f389d8cd6d6c50ffd6433eeb2620c285fae5be86e17efce716c609234c5a2e57bad927f1fc63a2949df678b5084d627b2ca19a13fa7c8a4dd2597b724503095c652bc1f53e97d15e45ebaa73e3edd07d8a950056b62f0d8202e9b482072f9391a78d1b0323b9802883fbb0eba0bbd35676731101cb1021c2a502e9a9a9fcda573325204ee812246ab45ab7a72c6a2ede909009eee6005d92b527162fb9fcef10e689577730a35f07a02fd603d13d5a75a922a50f63f7f91267816d8f96642f7951a5ce0e2d27340e1cdbf7b0a52973d0db7246b8caf5731d17866b225b783581560aa0f6418e3ed4862bc92f43806ea824fccbd438cdbc1fa785ddb3681da9512bfe7e6ed63bff334c2092fac5cf55ae6086d426f9e7e014600cddee23df325d8de2b79b583ceaea1a6ba3dddf7e6c89dc5a8e2605b5549d30a76a0759878931a9d1092dc44bac7a4e9d8cb03ecb5d7c96dbc627a4d50aa17adebd1968388333c3b4360f3a9640524249c5bc7b3954772ab9d00a2e48e9f8bb98b3825dcab7c0e8c35b3c88fd68f79afd077f925c5b95143969c5502307e31abf6e50dc6e11edb01d68702cc487fc6660eba0b87c8371abe0968d93a7d63c2818580368bc20a18fe91ca41977dbb88bb47335cc15a31487fa3d755bc2aff721bda36aab54e87e11c365e7b9c76842b82073f0b4b6dfd6fa6ec654c80203e03e3ade0b660036008823ff77672b0a18a9315be21d50cb8ea4c5f80bda4d72de31e421b74bde0211464dcd0460e92e050ad1b7fec4fe60bd4cde82ade12a0b103db54ecf9e53e22b7188d15fac972539440a921727e8ecb0ce3576e967d5a7ea457037110bd4a6aacc0f34d7a190582915a8eee7f3f8df71a370ddeb61ceba3a9b1ba6861ba5a0ff12b9f97e7af40e065c2bf2ef42d4281b520428e684e24273a2884586400ca6dadd88bdc29906a6b2922d676af34c5d6f190e9a30b40832022d469b63c9fdb033499b5a371df9e2738dd2b0506b120f0cceeecc5d878521277f288b398bc65700c518f7c85abc6fad05dd2ff2359c65a9967a74f2142ef1bed98fa24d4c34a5b663c269a4914897527e46673ee8c6fd5fc560cb3ac59208f3135e3d310342dfc301213c9fd0d0240b9269de68581c660ed0e53068f91ae23c8f5f05da68d03bb32eda3b2c587070f50775805d4f02e6052485a6cb62f8696acae78474f1baf5dff780dc0caef085dd821a61a3242399f97017a941a36415453f348ede7f10fd262ec3afb8767653480e420b61732529cc02a07f895143eebaa554747c8a0d69444db74675c0f2e850428ee70d632fd60e9d6a19b840167fa798fe14250b44af4fa968bdf6ed1560ef0dd1b02d18bb8b666454664f6a11b5d09d544ae29271c9481394a29442146d270cf4c133212c4c62a26f9d101870ef9d05c36a2cce71ebe08762f56fde207c0b04776b66383eb571ae39ae94534c36e07672229e4c6a0ae521a9a353f860ad7a3c37a7e3d785ab5879ffc564808e0385d43d4a1cc4050d242dfc900b0e8de4775a5efb7173e8fe0bff79226b7a02465be72b621a40e54d53497197cea8f7e266db0122a62487e2810b1341cae8badcb742a3b944377614046bde10be7b56c4013f85063e3665d6008d6c832a58724fac71b985d46e917fd477b434d2aa370ae3bf7719d97fbf71bb2c992721187d79e807ba91ef39b0354ed2de44f0e275dee9c0ce96b76a0f526d16ba4964166032b1f036f674e6c9d754d0a18ca720dcec60c3a3780cd541b9cab5fe13f3af31772b96d6ffd43d2c392a88e6ca0c1239f149ce545076d43ed62dcf930718bcd156749a0d1494f96defddb1693e74ad354450b2c56c04858aa3639b60ffe119b006677656975221105a88eaa6b243725a0b71a9be67859c059d376d43b5366db517ddb323a979deaa1d3d2f34833e8984958a4409a1953fa42ff5537e7e65d3f317faec932b4dfc824991bad267677aa1d1c45492073420c08ff7390c5ef362b2f6cab9ab301887c1e74749c0e1fb39942cf95036a095da4d3c904c011f32cddb016d2afcd5be097eaf6fa95eb4feaf06db9878b76d1a9ec9aa49a3c13b28984b2b5eb84a51501ce6867a4a991b9f28c8227795f600be91555573a5297577509a433c0c7a416ad2afd6ab6547c956620c29b2a2cad218865e6ae6fb45b79620907017cddfe3a1ab35ec11086c715e48e92fc69c2349f7d60694cde18fe4fa158ce09b886f486445a986494ab7310a64ef3b9173dc123efb81a9385789cd79655a8c43c177bf3019f7a4c33dce44cc756af0ac3723e258b4c307993afdd048769c9182e6b7b7e22fd05f0f809de5bfb1e3df3cdeb31876f6efb4f6e9fd7996104cb6c25e5f530f96617ede9c9bc79bd52566f55cde905b1a34e6973db0b744db3956429fd9358b6271988a8b6cf111a0d6041534134e1d090bcd615f510e8e7a4cd7679d3c2d03f348013da857df9f7f51f25732d4336a5f182b8ad172894bb680acf0ca2c99d324d8720c325f5ebe6a9aad169e26c3576708654de08e45f3ceeeae8a994cb268411619a51c912a26741d511bfb8b14097626f3d0001c5abc7f8bc02ed5a5bcb2bb21630efe9d8bd3ac49d30e9ddb0798fc77eb1b199349adca49337e7916b3243b6a0573c82c74f0374f827e95d68e1197129f30a79d7919f863650c643f9765cecf728413c38dce16d85f262dde1be508f2ceb4cf928701faf4fa87b16d99428872e6d870a04d82931f6933082f100b97cac91cc51796b8cea65604e131cdaf3695d35fc92ce976c2ba9e7ff46ddec87c5c66c21791946131a4afd2beef586c35dea9846f707133c9cac8e34fd8486ea2c5ef993d1d99b86a943a32a12e426a9027004db224165dc28b1b152b2ec12c7dd0f6c25cd586c4306a6033164f0b4cdd991c8039ef13abb46d3259cbff474e11a4d873180bbec0a1777fd5e04346cd7b8a4b443c4732c42c0fe92d9708391fe695d44e48c09a0f46779da8bebe89ae810b75c83f2aa63318ca86719dbfbc6f13dfd13635bdf4710a76535d8253c945c5c88d6e6763af55bc4845094a6c51739dec1115b056643b5ccdbd68987c62c8d35910ad6918ebb0e852a1d039942ea869119339fa8f907f19aa9f80882285322840941f9f6fab975628234cb7d247b5d9497d3f2f15abf8a0276f5afa6f32164ea5b0704dfbc605fd43df3ad29ef431ad4b01724de8e30ec8bfb2cd46544dc5e97f8a717c0234482fcb5cd7416c5af619bbea1f10444da2396b79281d4303229da2460a323a6d4874d85386435cde0180656227a9672f773dd2e3ff97fff4f1000482c69b9dcd90619a95268737e47f9a9e433d53e85bc46293910a290292f0db961b9f8ab9b1f72e915962f11377194cff0a618e405e2191de68647b0380e396fd8595fe2946e7e96bc11d51d46992cf33f166816abdb320926e34ff61efe472ff1170a828c2206471bd26c1e0a70dcb3d25c87ada7fb1ceb635c09d114ad500690a88228d9182bc0c833b529cc7e10d9ed6a165a716f0a6fa331b08a8de31dc21049fa9fae801751efc93f895efd7cfac99f41595dc0f8c9bebd5f1fa66a8462fc263922a57b2ea6cd98dde178059f8ffb0aa40c61b209342b59e18a353417e6dfd6193a890953d4adb740e67db792346bc793a737ef2403aab5d57c4d003b0debdc26f731df72328059f3ae35c5b4e9991c50e1d76dc16eb3cecf1b25183b710bb284ef1df44519ae69fceb2c7aa83c760b3f35888a6dd3d27b3742be996822ead0631b6bc744e423f0a47abe4d493a36cf9e88c09afc90511d613fb338cd6c2e8084f790401bcf3e5ad064f021dc426fe0d250c8d52f303a42b128b2b26ca52b3936cbc9c25cd5d2d93f0f6a4c9695216fa97f914a330da724b173c07ed3dc145d791bf6230fbf4431ccfa539937e2daeea744870d211d7b3931b19d1de4a784091731caf027bb50491d9edda66aa98a27401f558393a8419c0671f41e0030e64725431653872273670d94c524e2ce9195d9242814e5f297c534d144b50086120fa896aff6aa4f5c4dc3b1c91f9f7b71d731ca69f314f26452d32c5239521d53c4f8097297e9cef8b348162be3b0f79ea80317d2f60c61ac9f2c02e6fe2582e703da1329714ad978ad41c8581d11807d6356ece260318ad81f3b9807fd80e9bd76db104a0ddd7e54459280af7d971b14a296d08851215b9315b51535de781c709ab14ada99271badd6864a0f974785a4da0eff7e94ac4291ed8d06ace3ec4094799722e9913936e13794dcd57962437a03c3432e25985831e1b4200e23f8c297f04a6d78a60dc01c1a08dd3450121e15dc27a8f73eae26c440a2886052bef4c688beaa369e5d32ab5a43e0a993e2afbd0387b045834bd2ead1343da6ff1d164b9fb26fceb1e24080fc85f6497c5ec459f78c082b05b4d442eb0eaec0f10b98f1260b8be3dc8381d9717273d977c82071bc6bcac02807423af3386a6c334c17918f5d03827c42a7ec159e175125cd89345632628a92cd8d301272f785eccde05128a3268749190aa4e81847c6272cf2fa1b13fdfbb2e69a8bbb5c4fb243072da85a96c2719ea844900b3558aaefaec386c545241dd309af1e5e8bd33312d832dbe2b7405d2990b2f8a970cab1a4374192f728749d32ea1eeaec963940aaec2aa5d6f29f7f5d04f6d512491e64262cdf6c9992d94c7bd3c4870387d94779dd1710c94c74136deeb40cf3746dd217b42dda09ec27d5324257e41ec20a96430069e78a5d59d51d73a972924e0d49faa152ac4125c77253980a9e11a77bc277f312a621b5b6236f850d2b16aab7438a96b0f638b580bd1c8bec3a3aa14579a300a0ce49e3f8dba1c0cbbfa4f691208d718f49d8fb8436fb7dd6bd5aedd57740e984cf87463e73c02e3965ebbf9d8e013be3721c4144464c42a0f570ec372e808134bf26b78ea909a0d82845b8c8b625993738548e64f1b025a9b6d3b115ac0e51101880c225d920a0e8bd4e5d8e81f5799b6f92a010fb915648e5b2556367cb642b8df6a937e6dff4dfdfec4f98f34dd61aa1241694391b083b6a88d559ab47e7a957aceda2bdd414281515f81cabb2eca85464f2f433b006c3337c1de4010cdd2d7377db1aa3dacdbf4a15e9bd047590b7168ebb20cb8112ffc8b3c6b1d378f0fbcea54f202c4c7822ed1a3fa85984ac334d98e45f2984c2227ec40c2dd42909e640e40992c7eee90e221d8cb816aba6451dafd525a5abdc8c22a2e91609dd5f3296a48b6b452453bc295331c044aa6ba82b4b53099de1be40c26902ab9998f063a553b83c00ece0c7300cb3900e7480f35ee55343f3e07fbe741b5e4ee0466012608c1d9ff791029d5ea1d4f0243430782bf06db1b89890750ccf00d61fb0728b49cda559801e12bf97440414b8f2a0d18db07f1e62a4e88384a46646c9d9472d88589593c5b9f43771633229c50d920636eed29748f4b79fad39485020be259ceea5f6c6810f3d87922abb2eeb8653d8030551242142834c13033b7c6787951ad3072763b6f33fb81ce73e7a8a54f178ad9b6ac883a48f42021918ee7c820967378a0f3b9979576e7af1d4ecca3b7c04acf13d7da059c5d7e5e1aeb6bc52d661b3e8c8d55189f138b704db41f9348d0a70123373b9aa6dbab0bd830cb56b2a2f21f05968a1cd05eb9701b6133e740e1b5177d20d4d255a1be63d7d186d61f13200d04100c040fbc820f5ff020390e54ac11621364303010f438315e4ad553f9e91ffdcc4ea9c4fe0407e1cb8f5cbae2fec4e8854a2663c7c6490a159600acd2525820317f185683add8ce749c5a3f3f0877a387f4c5efbde1defbf4f335f6ff00498af66e5fcbf8e3dabf8eb23a32e0c6a926b18b4ccd832c4115a8424e23d80bac8bb274cde8ffa98b91eb767d3dccbe18e41461d7cd8845d7228a5a63fa3566df75531f96c835c18d834377c6c1e18bb5bc541e2a389391991a7a7a1682934e63023a28b16adb64304e4e885e4a1b403064c9148c41a526188c1ebc1a6b81ec3eb6946df1a481d93c501cf510ab657d0445a30964ba2dc5e0c9cf4bf67f2a39f7c9e284aa305fc08db9cf698284f7feb1a9fd3c1143d7971e2d63c5394e5d332ac160bbc7785f9d36f685e77e90c7c8d6927109703b402ed7232b969b0f6761951b2afe960c3da8deb04229acce334afc33e521620c444fbdbcfd83d8b9121aa6c83778cf7434c0230829fd6e238cc76ea43cdefa9dd1799e3a6dc4b87182fd97a5a17b12298b3f6b312ee067999f8abba3d07ebdc308949257379c6916d88a4fb2efb34b28110a34acbeca163aa2ee7b1a6f7b4da6051ea828a06b178cc9d00ad194628e9d8ffda12713ca3dee9150f34f403e3e11fa5842c3634909234ed6f069dd6662dd1cbbfa76c0ccebe53ee227392d37e905027a758395e60696713dfac57913dfd1f8a9997bc620427a1cde3c85af3e89fda7bc3007c73b2def80112c8bff9c81cb73da84a02f8132566d739310ee578110473ba0e9d4d57306df9b200e2a2f99c24370e1cf404f2b8b3a9e066b440c3972c5b2c069eeeaf07b84652c442a38754a56fac509e348ec22f8b33f7971fca48f1c0430672f6aa13ae1ed3a57611c2a9ea600c434d61797eca26b8dab04f9428ce0a1cbe40097530038e0cd105d040368c33c7f8b25e2f61d30d39b0542554946012058d57410ebdd2c0ca75a5b2a6ac165571b0a9aba1799d0a82047bb9bb14a7766df7bd41af87bfb416d04b9865258d1b4c650f7bb607ffda59cab17f9bc75cea0e43f1677128818f97d158a66e4c3c3ae93891a4d84a1bf79fd6fa499b445bbaf6cf26be258e89e115abb634f320c36b7215d0b5a93ad26f460885546ac55ab15fc29ffd922a7206a5e7cd7a594c36bca0092e775a8f9e228a1af2bbef0a330239cf03c9d924a50cb4bdddcbe1163b706d603732bf3432efc871a01f795442e43897964bf5a75875caa1a2368ffb797f2b65d1b879c598267d6c8bf137d2df524e052d4d3fc0a50a5006a38f434694b0692c427a8d7101d4bf1a5996168cb5bae1b8a7f0042a4a0ee1746616ef0208d3d717e3ce0756ef71c3215f995ac89af76b422070d2ec729ece59f5cd345b524282b3d565ccb3347e93155daf947e2ce2113d5e26dd7cf9da4aec5e8a1cdc09ff2d9cf685f8f86c932972b7e14ff6e59daf6ca2015cb4ec48332f10faead7210fcfadcadef6e7120692a425a9b7fc2531d9517c6a39ab3558fd707471c44b5a1c33964cd793b376b9011ee6a2d0de599c0f54f58e71adb564d092f2b3767d9d7c88644d85038c3389a0c300597c78d0dc282336182bbd34480d0a98b49e24511c051a19fc52314bc23f5dd3209860814c81a4b9ab23bd4087bdf0c63ae48f2882252e53db3033d8b03318da68ee4b16b6fa445cb74914e7891dc09bcb85f5017e2df8088c7964589d68612843a8d2a8a7f9e32b64476f0188d2f240032b10e715952078e662f36911a1e7a95b27535544ffa9a755b34b33f240c05ce114c7afe7b31e6baa0bc854e7d788525143e2e05b4b08db247a74b9899a904dd42bf2d67443e1f5c2d20822c8049e1e2245942e264b16f930d29cbffd008e5c6ab1f3f3db4797106f00e1b7a534bc5ab4516b83209c28a070e55d829a8d79350f9b8b741ad99463eaa07fec17d0b26411eadbb71a6b25337b2732ed3d59459103f17d88da8954be2c9f798963c75bce2809a5f9b8bb9bef8a5b785e84d36dc8c3004ce7c6abf0bec50476869dad521f5417f09098ae5b63b0528cb6788892c500669cc84e04ac417d096e2108c46aa77e0030cf0f159d233f9438ca733c3fcaaf665ed70e01d0bc27deca488a322be291340297cf41510f1f1be0f51c37536117dd6cdeddc5c040475d4395329df65bfce59337b7735a0aed44ea03f07dd8103510404a228a64c9b4383ab25979fecea5a571d0d7d7d6af30b8b96aa8fe37a9ba2c4299581c8dc2e744c443029797080bf07bd2a19865a0bbdbed1dd98bd6fd01599b82d25c39593f1461a9b30fb25a9925f4d60045f2b3a809c51cdd2a4bc6583189989c53130d1fa7a3f6344da5effadc84a10e6062381d0673b5c6aa8e0b092c0f6544b494da00e36e7e44b5735ec8cf53bf8fc178950822a954a57941a1e40a807a2cca04c310cba204b584ac2a7314da5ef13765243fe7e1eda796395a3930efae4bbdeca3421b0cd0f7154eb28584fe7bdd1721df872d1dcb33727c4c2a59e29dac08e20d904ed3ba6c78db5d6226fcba975318beae8c16c537c3564738bc953de8ef27cde7955f58b770fc2dc00a221f6c5c8894ac8fda0661f78ce5f1f0ab8dae856b5b67da0590088d7ac652293b5aa013043c9cd6d6e925c64416ba251b3005125605c4e70df27d9b4df31913cadafebf61d6984dbb7136f9aadec5b80db32f8bede2d18ddc4453a468499243a48bb6b0838973ff8f436c36fb45cf6fe4d6fbb3ea22b00438e61e4cdcfb5483b5ec423fef9727c0826ed582400c89f505a132c49dbc1669f8d7f9537e1eba0e62112122fb01d21f0798d35dfaf3c9e816bc558235c319b8e5b21167146d7401fdd95dd2c930b619bc60ea04cb1e77728089a4df433f00fbc689e1c0276949e4b066f7fb34016df736fe318aa8189fddc15cb4cdcf58a80ff45a82d375c085ef99e525fac477870d30233a42cd5754f43bcaaf904bb0408528ba1e7af5eb664e5dca7a3abd729304a338b09f46f6ac9f62f9e5a7ca8b58eca46610c9da0a96bf3592238b5fbafe1f1ff8ec945c7e11e70da0761e79673c5097948a7e930c43e7ec06a3bea4ecef19e513b7c98b33043b23761933791fb88054d25093f188e03849fbaa4cfd5e1598ab2e984d51e4d55071342798d5d51854673edd2d0b2a26d6ea32bf3a558135090b379359bd45e0ba3874389928d35eb5c0269caa369aa0a83f5de53c5140b42eb29a0c70c0516e6c6a060c16e180a2ccc8d41c182dd301458981b838205bb6128b0303706050b76c35060616e0c0a16ec86a1c0c2dc18142cd80d438185b93dc696c04a18d5c4797a307b699d8c949193073fb170a766ad3307f885d1f8314b43fe731d69b3f711821118d5946e0e060ea2642e2dda4bd7f53067a4bdb60cb9a8de4b23aff69dfad2a9a40a4089c141fb6166adddc7adafda9f636b1eea9648671ed27b4618331e4b5709510d1787d313b7aa425ec3a00e34678a3306b0ec6128186eec48349679b048671dcfc4c89e666f9270877081c606922e1a5bdfe0d06fa8954f1f03ca347247d096ad8c28c438bba120aaaf1f4257b4096c4f3af46778d65214ce4bb382682d8dcda51ec8db6257ae9fcf26d897bab2bcabaea472e732f67aca475cad5dcb2071c8cb73ae5607be59812c5b84dfd3ff9a9209023cb12d598e4254607685a818796888986c7f45ecd1ef9c666e57907390b34059ff960d3bc86d5cf973e8e196718251e88b5117e4c6ffcb712f27e1f53fe9bd24c3190218b7152fb9b5d91776dcdea1a74ba50f041b2f1192adc6c9d18e31f3640ac1e20e0fed2aaeff0d43838cc345df6d1317e125ca2d4ae19a0f790449d57a7411ba3b86c6956b44b3cabeeb26842902ac5f7c2bca3d8de900cdccd62c7d38b621bd5f3cca7859131266002d55337fb75036ebe1fc9b311c7141c23e13aa7d5c95423d436ce318054ec4be65068c7a9b445f2186c73ebcb449da7ba654a869baa6aa03341318a3ee409bf58cc08460dbc52391bef5b2eb9953f90bdb9298d2ed320298b3634949eb7d564d26ba9530d57204521994ed976076a366ca92922d1d27d1248d90890343bed0916d7dc49ff40e99d6c5b0651da810f65fe77088096b1428349a4d9693a29334288dd805c5ee0e519de640072568539e3b9b737a9b5e6618de35adc86a8e1d78fdc497dc1c231043033aa313ea06fe2b0945f62141111cff6cca3e546c16c16fffde9467c3d73642e16a1061769e54aed6f2aea355fc8cd13c136da1b46b32a35345d084c909053fa915270d51fb5498cc7af8c2cca92900853cdbff3c532b5c0ac96c5fa8492a0877ba89e79b569e9012b4e0184b52576c0bb924fe43257505c01761e77c92cdf57ab884ca4ffe37be3e6c94316947f87366a4464037ad6dcda5dd23baf7381ad23eb258143ae820a0e407756ef276f0e8084a260a66934cfef885324975628f866dcc7dbccca06a4509fe1a395f7d3d364fcb735f4a6e709d26c19164ce48abc41c3db3b856f439bc011990df8471419368249b46ecaf926606f1f6070d27f58411a0420d4b1b2b70ba24b1c17f72a36a2e3758957d7e427556ba8a4d69a499da3621c282a39095680a46d38b53f9d993d27dc0b9b94960851e8d8a2ab46079cc524cb2c4712ae0b2c1368723a9d816d21f7e3e39bee04b2c408890d36c0aad6224e187a15559ea1bf7cbadc5454f0f49abe943ca0780959b88a7241ce2768ecbaaabf0366340700dfc950f7cea7a5ea7392504b02f8712933d88e63ee28847ea020da615da7d0ec26bfd649450d4dae4238a094e04ebd37083a7bb603fc510b15fed9a421ab0100a2dfa4d8bacd7508759763ae787bf620ace6eeb355e1c95149d777eceb391444030cbe030fa467983e26ef4417cf3fc4a196a11cb438ef8c9a14266575f47b8364a64e169800c5f0e3c0ee4397de1471b13ead9b8264ed0174e21cd458072f296c43b5d12be903f8a5cd1a82f5383189652d153a0e6701f9738af6b54823336d2f98e3da660ba747cd47f181727c63e392e13eb3e18b9b410e2044d92ea6d2828b8d887019a5545319351bf415892a5f44a315ffd786b6894fdd373db8b4dd4a4f6dccc85efc58fda1a015d6f76f193ff3486ab8b31fc388fb02211afbf2ab5b14ca5e380072711daa13827791b5dc03907ef438e16a6b1fc9d247c261049b589623f9e60a280b328dc627473ab6c26d8debfc35d150025f3149018e4a4efcfcb7783ef1d68c842a232b77c73039474a3ff954ab7c2a8ce104cd5d55816a9e6593d042b2dda9960fb915486eb2ec648eaaa06018a5349a89532d0db8f7e40cf3937d0d4bda212d599f0478df828e9b2a3a1e7ee9f1afbfa901108801b7a2177162d8bb7e442444ed33f020c1d07211d8a07d49c6bdfbbaedf1ea443acee5d158a1ac70186d592cbf51769b8e8cb6acda85fc8d236ad9451845eb854e8a720b2c4c5f6588bd9a50a60e604dd8fd0cdd350633a1413b6b410df6464d91642d4d53b75aa0b3a6dc6b809e894c7561d2af0ee431a3aac7ae543aa880b540bbd942ab8da398840d8ecc9673001fe3c0f85d2cbe8f1012355fbedf84caba2e22dc0ca1a50fb52f3ff1477a38749e261b573c1ee062b28bc018d2cc84730ba64bdf109352bbd1b65ca86b8e245f009ae9d14c84168c94fc7c722aa24cc918151bf2bcaaf1a8093d39d0742a04270c4d1b43c515aeb7f45759d7773062246c2863039f1210dd596e59bb5a2c31487df928e8a47de8da73003ede56ceccc27794e50228881616428492f0e40cae194240f0712b0e7d208874983337214042f0712fa1e2f0d2892d3821f7808f2f285cc90398951af1b261abbeef91b7d802882018636da70a9771e8b2fe22592780ddc1323f8d840d25e4561ab9dcf3e2c4587a93d7b0ad2c006d254906885f34b1c24280ebb2ca2844cc21b210a61419d0d126995031f7508993de9bf5f1711a848609a0772e6eeca1ec1e38990f6fd74e2a383c9f23d45c1d3438ef69b94c237d3f30c0d45e9dd430eb8d303838a75b0e8375e02ba4d5721a6200830cd2cf83482c1a6c201e294f0ae56d83435b1afea815ad4b7057f2066cc5c4693ce990235d9c26dfda3c6826e7bb459c74ea387babb542e47ce41c0a3e0e2b290ee98e982b787147027b5c38aeabce0677e82a48d13b80e05dc525af6da1de84c5e5bcf2ac624e637fe028a165060531c9fd043aa496bc11f999d210a724f77303a5a91b7f804c04c3ff10d8ee26c2e318cef6d9811a306d83152a437ef911da64d60a7c5bff110246cda77a5225541192b31c028f0a55236814bc06abd69167a73567bcc6aef0c526a19889c740e8816cbb997e159aeeb4dcfa14f9bf8085254e094d7747601deddb67fadbae5f0b8031dc943e26a49fa3ff3ae7f9240c50228140a0248c7bc13a64eed8233d2f55c63398296a7f543260f926ce99e0bd211400400780f290e41ade472d9329fd52d32ad9e0368c67cf68dca9c52840aa5048fe5a659d2fb19ed33a33de75092c8b1549db32ab04e8cbfa4c2cbe271185e43cab5bdfefe2429e090ea5696ac6cdedfc8435642c86027ad9e9687bba7e92c5adeb17cf65876ac2ec9dc915d60d7bde6a949d8c16a78e192bd3df9b9fe7dd0d6e3fdd4863fc4234881f60f42019eaa6dfd1b5dbc60bfcfe165129ae33833d1e0463ce4beb198754b95435a2eb22f6c128e98a46231fd6993b1d1560f39750b2dd89f6431ba1e74e4ab86b68772c03cf20f3c66b162bbd1936d65511b49cb82d84af67a23a2b8511ca510b4a3b279a13db2308e8ce99138bf4c6aef9e38f41f4300052629284e2134b33bf32b066827ad340b5decebff1bca771285d138da5bf622490210aa3077eaad19541eaf3378f25ab3488d425227cd77bd8414542596bcdede4b90911cd7f2fe462fec820c12b591752b8d019a341b495782f31d12d4102bcdc0e3f535ec4143ebfbd13aa275bbb42cff9a65b3a25d30b8886202e3cd04d1bd15bb7a093aab7ca37b7b80f1bf88df1069dcbbfbc717c29971969b43da401f5105c326c7715e0381b62beaf1821f23424e74ea92b7412236d10092270af31a8c947d139dcda2b19fd85d88951728a3d4c0f96fa1cb57293db9db443bad1824231f710569dfb824518e014e4dc1443186ea64b93f0323552788c41f69b243dd469b926e9a877e6e4658d3bdd9408ebbec465b32dfb24816088db918f474c689735a4e4f2c014072103b617d69361b9e06df990fb76e31c777064d7403eac6a4ca4636202f13a969259c5c8eeac0c4409f87fc021696259f49b5301d71789e371b70853adcc66ca3280dd4890c43cf2b065eb6377698e71c8aec7d9187db589fdfe742c3bc7d4515937c4f09ebb51eb225e1a9cb970cd76244e65c33a0e8392dc272a3a8bd4171d8bbf6e993989ce3ab000811edfd98a6e174c310c1788c71c15b4a2b4111dc9957d2efa6b6f0f3fd343e112e73e9af6488cbc7c2ea6d105901f4c980dc68380872f6392a8308dc10c71cde3c1835f9bc283fb929c9448b3073fe110b8d620a9054e8cbca8887c5e8240c4dddf1e6c78c184416b6271a48449ca6a971740025c28b443ba08d8ff2d6e0a45dd8fb143b78c14cfce91c933f0de44d11b1b51ef6ad327dabae946b43637a23897d34a59765722eb822a7a30cae9ef3a893aab60ff9a30e43dca8f901e55e591765f902e98cd194223710603fcca2f9669d9f5f66c913671ac131f900aac87db861bd0453e0e5a73dfccc70353bd611553663473a8659b26d155e103df0f5ba7afc880800a0e8a70bdaa2ceb275e40ca0d3d0454d36976a0d5d0e9865f7776ee8863a221c29e1d442dd905a1221c8a67f39eaf5d47bf3200f642edd3117f7951523970e19f975d8c710ede0d5002d5ebce5e455aab9a5a62d02e8d95e573d7c8c31a37118bbaf19ce72145a68003ede560daba74e7445e45cd638419c2246dcb9e7705217d7785a22f0490f83d40168f1c81f78b9cc22b4218ce4b8f70d8c48d4f6ef0630baefb87cb540bc73013bb331712f683c1674135723f212fe95ec3a3b95f1fb0f4963cd2f5efc211d7b762dbb2a4fa9b8f55e0f2d0138f962a4b9103e0d16637fcdb1ae2d8975da53f6d95263a20ca019961c6dacfb11de0d0219da3948b6d5bbae1340d65084c497b6474023cdc4a15540a7ed1b978e576a4e2a92b926ca0e11d3af805d52bf0ef0be7a4c76acc49326b12d68da2031433a19e823827e6b7e7c70cd8d9aaf709f18d38da012fe30094d128eec7ff4931ffdce4049ca030b101ff296123debca9c01702f37d16a339ea6d4c3cbe367910de7dcec3b2279a1122e4924b804ef78f1b0bfe9e644d1098937a7dbd5a9d2b76878c442ac8ed8f86342dc98941db103cfce13be8d320f0d46568ddc4f7f8783e56cc6869b7f0ea1eb9980fbd36169b53f154056ee54f23593cc319cf2e65cf4afd066687998428481e9c7a4950cb2c1b117d6666abf87ef2532d4d154d24343be0bb60d44be0796e0b03845a10b2c4336e078cd9a0140d2c276cb04006c759182d40fde98116317431a000026042e255f89e33f85bcd04a519502b89d44b77afcf412451a3eee848ae4bf2ce90f3cacaf384f26dad4264061f567b59092b17d40285075ad11622cb8899ed0025352c0f756aadc299cb25a853b2dbbd8fa0a67fb1a16e67942a0f9b783e2ee2d169e9334461c6430f2470d84d64540e1e8778f0ae1c205fb1daaaf13955651ff16289409b32b3904cd86d552ae55aa07cedbc08cd4a051ddc622ab2f42ed49ecfeb23487c1fad0c4f6dc807d6ad6bb39051911be9919221aafd8920f8625c4ff691ac4269ee365832692855219d0ec09d21167f28ef90d6e0aaa2742871173f05e8a99a2b6827efdf8d14f5d98272cb1f78a19a09acdee546b627649b31dcdb84f236e9d8b2626143b9b68d52f13e41f5a734a7390eb5a88ee412e307d7ed766858f6af1534f4895875ff022e7ee80eb406bdf2536ccacc2dfb396089e80a3f5e19af1b2bf29ea29a70cae52f81d204f507ac8630c57f9f76e778b6fb10e62ffc5ba0b035562c77cf63c19b4f746549db6cb275cb34de95a47ffd83b483511e9f414ae0c0b802e72ee6b04632e64ae34c79519ebc29d6209b9563c029bccbc8d3287698892710d69b07c5dcb960b8fe888ded32f03fca83330312ab55a9da366595b26760afbf784f64be49a4035d1f02f2cf1293f3323545422a65c7b61ee8252ca192041896d3263ce02cd335009c27ec1a743961e992922154426a6473d7de535ba4a7b1aa87dc670c9e2982b526aea0e51f1f2898f8f5ef2f691844cd15bbeeda1f0737e20f3af7b9c051794e3ce4a4a513ef50972b10be1913bc2b2e0b4f9d1d37e36daf5e37e766da0078412e28bcbcc280573ae3236dd92c5ea624d7ec3aaa64b8897c901e700df5f147e2547d2b80bff331c0a18d0cc6046376f93590979738705e9433cda54e0ba7f061b0bd149ae8173754a2d42410a1b4acf49ab1461c65baffbd1738a9803eebb0911718b18f6fafd2aa87ac198a8e31aca772f8ab6aa46632c5704a203f258e392ff673353e9be3d077370016d5308ba7edebbcc5a0e56f728a0e5709e131e0dab18fa992c888273d7c185521b3942834dac5aed1f378309c9c7131bcd8e231ea2723d55d3dfad585a73adddc1ea8f52eb5f789dc3042e2804e9504b3372a68d5fed67a3c600f00618529a963a2cc3360510f58a21ded21454937ed5f2f180e3d8fdb038ad2846592f51a533c43596a780bdea8ce0d064160cdc7ea2c4a85ac8b3a1e16533c0ddf7f4080d4fa2b2bde34f9e611ac1fbb83b2407aeb90263744a52ba4eef327f03f6a6ab90fc1898699e39ddc067d59eb702c92cc983bfaffd2d5a8175c978597dccac60486ea2c1918eb75b75083c3c6bba370df0dff3523bd29fe3c957b56196e97c366de1563b2c9edc9b1d485025c574ed3ab0fe042bc4fd7a9a8830e64081f80265f9efd26fec92f4bdbe8d04e163e0990f6b760b5d9cbb2250a06d762a65f4a0914b9bfdd3a6cf1c9cd1bd4a93b847e4cfba7fcf35c9d136c1022d4196d4e421e9f27b0a822c5468c0e4a4059b426a473a214bb21bd8ed81ca83ed6955d314b1fad0548e7d860cc4cd9f61bbd2665d1d274333189e6138a320d3442c129bf2b13d1b3a7b80ddde5c4b325d39de4b78af2b5ddf005cfdd358f14c148d30dd1bb4eb358656fc1fcc1ef2b1d43e82fefe4d23327c937c2654630fd122d78e0df2490cb2c5abd6336bd54a2118e9b05227f27f14b94292f1cb03c27788005458c5d09567256b3656c9f2426c106dacb7a67d29f0a244cfabdee4616f4f6eb0fa54149e7a61cff78b4891a1b1777bcc6edf417d04af4534d566585aaf66a395d10668af61e30bc79802d2aa8811aa0bbab6ab8ecf694d20da3032544d7bc3af7a0510bb2ee4174766cf9b6eee4199283c318c02d3ade6d9a00bab07619f912dfd8fb08fda186fde3eafb2b6a057dcba5fdeb3691462832a413bc5da11cdf27da8729c21d426561aa4d32d4823f5b68bcba67aae3ca9a5ba479961c6a6c4b8eaa001c855d3d09318fe1064865a6f7a231a6161e0f0633678fae30b0d422d07990e700666e96c7a028496e98795045470f88ce701d09a0dcbc61e47119e9bc2e081f613e9d622f769fc03599dd08844cfa3fb543798264476ee67f318e3d152105f9126be9acaa82882a9de299cf0b6b7e4f311217db45ce012d036d821146673ed9f0c7641bafd28e0ee89275c417024d2a5b682c5a6f61d12629ac22e7512bfa38f08e9debb58754b82a8da16c712ca409b64612eb163b81c13ac2e99eb22cc9c52a21d6b59310067930e13a67e50a89d22d647e6a9ef33305e36a546e1f9cfab8a9596b8de288d6f9c43301d1e7d7a33faf88a45f26d14b4521a6de7a726d44c13c16c2ec88e709fed24e09a6d9d6960ed02f5c0dfc202dc0e57e3183e689f15ffa4cc1c6e84445caea032b535ac486bf23e1b6dc76b547a81d4b6a728175e82b36dccf4e570039e358075228cfaabb4d70d11ea5a2fec476028f735c7ea49524ea378ecb10cd2437490e06af926ab533cbf1dbb4bed2192c63ca0008078104edaa5455a4d5aadef37a3785c75ac02d2dcf1832d9f525551f9a055e40dc0551aac2a7f0916db1c99453582d19104278ed0bd9a581142eb06a0518b39096ea87f559305553b387cdde9148d6ca54bb48b4b5af2c510a366664c7ee29543652c4d28e78e39a8f100351dd6c464c3c8631677e1cfffe952f2675fcafc92e8ff7c8cce4fb22f294664503e272969922c71e4520a506b8cbeae013d1a5dd9af3023a828c6fc76d7468c0bd4446d966eca746e20cfbdb3f0f0f98f0b681630ae5e4c4347859d9003277508e11595d04d220d225229e0f4351daf47439f257dc8120d27831212e0d6916c67b684f872e745803c5c1f410cee9db3f0d4b90daaae8f03e4e7067af28584d7e0ef4bb46072025751a2329b91cab51081926f4ee1326a488f3b90a9982ad4e24969564481e8792732165bc2653e3005cb2a3139ae4c836228b8ce1726619d74a8879988584d0d96e9667fdd2de35148b4c0280e11a39bed7046a30444ccdade6d8318abd0f53a3bc6e055f49838202e2c4dbbda72bd89e8db352a9facee52d7cd448ddec2836fccbef4ef08abb7a6213d0816181575b4fee977a0d627e8774da2d0a3069b45ecb0db30341940b27402ff7d223046db50a88ed3d6031f67388c0f542942123d99fbd0ff449812f6fe86226a4dd7047bba3b7c98d1cb138971e8a269e09c98281bb617cc6c38cdf365abc6b9a8ff908d655fd21b713fe7543eb33cff7ae07c17612da38e69309198e4adfbb1a550f898406c3eff9a64f7033087b191753f1722005151f6bfb1dbadedad93b2dc35f3e43d601e39550cd1eb75007abc8623116681f95a67fbf99fcae7826891728177b6e21c74ec2420a8364b59f9919dcb9fb15bca55a43faa39951af064762e6b718ab499b5ef71437ff9ef916eddcbe4bf7f2c96f6900f44bb17b345a9829a907d95f25e15eb3e8e0c8050c1447435ed5225e620d4265563dca99f96be084c21123f626ed5452829c99fbc15cd204a00916edc91fa0942bda19a0b8f3b658425a8098513da7f47a86592bdecc055fd40046edecd06c85a82c1954f15bec5e3ffe7c9b870b6652bebf1d059136f436f0ce4d1f9c0228c75241e46f38190661c4f7b059c9b5b52f8812d9d3bf04c445c3f80c1c48504764db62a0ec873b5f448a948f4e3c8efe8dc54df1dcac8649e8486b400c8974a4fa14b15c1a666506f4e298366f483d4b7d8e4990a006dd0399c477e0640ae4b04ee2b5d2135a896faebbfea303b2fa4168776777d2c7db2ab57acc2eb4da1f58228f094f4fd03d06999992d33caec7fbe0ca78a54ef779ffcfec03f91923f61d7811e95151e75824eff4781437301ea074f8d3f3e8ebfd328daf6083640bda02c6547ade604b07d0c5bc96492df67d2856faa7f7084ebbfe649ee63893732c8f82338e269be1bd3399415bc4ac7ab0c53cf6a75fef4d280dfa0c8eb310b9e825d75611bbc7ad6852443939af505ab3eec9ca2f1d1a21ccb3b8b65435096e093a8de5ff8445957aacc1e52f94ffdec9f0771bb4a3eb9cc24f4a1128adf25ae148c626e22c5fc56bc1829b3b2277e76a0e497e8ae1dba77c55d86be11f78c7c08b0105f9895833d2d667e68645a7d06cd648f43daa238854c130bc929cbb688a56126eb814314be654f0f6d0bb1358ba2f89ac60d2875924a21d213722d45c5fd09c84242a5df9662bb05b5a61411361511ea028d76c136a164d2da12b5be2854da445fa1386735f1129bfe7b585c505f0c7ca12f8a1a5b97038d58249854662b253725b2028957b10ab442514da9ade43760ce11aa7893789d9d6a89ff5649fec1e9f9dd894129855740a5ec0ac96c0f9dc2842ca060e00383709037985dd020b696f659d32999c8aed1395f5a1108a62829200eef54980938dbe501110d201afa1ee9ac18a98c9e38a66337993eca690ab66ab8dd248b2a64a140dbd83e37de41245fe43cc98ec8b037b8941f234d08774a6a98448841974a37641240a43413fb48f830b1bf48284bbc711be7b90cdc260ec7129ffd51e42faa625d182b85a11791644956726099737c451bc2a3ef1aa1b6c84631a9e4699bae0c27728f61aed8dd0d706931b6e0bc532c260c25cba7b63fb034a5f90ed6271bca862121ed20d0314c6b8d27b409cdda8e2b6d7a3cd0de3496a4ec0b05c976af48a6deeddba1630e46e8ada94c3fec2c6bdbe4a1cf7b408f0d8ca7aad038133caf8dc576512b0bb4bceba94c09f188336ccf81c09f8bf6cb88a16806c03a5450ecd144aeefed7c1790cd31b69688c9b3974cda24e55e3c50a294f5d1040570e85f86177996c5c680bdf518919515ff0fdedaeb6b50c63ddcf8c7c1839b4238c5454982c5704c7473eda5520449a7dc3cff68853a820d4c051f1c762935c704caf7cf5f0b54ea7638a0621f31882174d44afbda2e70e048ba98430c047e8a9d885b9cb02b6b23040d6d823e0ac7a53e308fcc64634323c31a25bcde928e0a56d55b77a58f0bbd85ce5281b73c956c3b41c420c0697fe278cb5493a6a9e5340a9135ffe49772aed15636bf78c38e0e1fe07a66d0305658d21bbb6e5273411ce6dc933890e4631807daea3616ca649c66fc0d0eb388f0296f8b5366b11c7834854723f4409c65bf4780ce8e210e763a403d214a7b8f5083a5dcc603df6901d2b8135b780eda6985574280901df191c8ef57d484c266ae30528023b24428c717b80ca668bf8dc833f99211cfb79985ea206df7a7678b57ef02a3642a7d5ca4b2542f79b25c0c0335556efbfbbf00bd36fab5ecab71c0079c90a8e0f28bbffe7ae39fb35da9e5fb7fec1ebd67af51c8cd8e39496bf5e3ac4740ee5b5fd7b0e120e2a8609299c023bc9770a08b5cff6a71e3e9c735c17b35cfa3f256da5627875957fcc65c0dd2157a8fcb5312a34448fb66dcd3cdee90699b6bd0879bfc1dd88a3e83288233d95b9b204f66bfff0f33c324f2b63b3bb48dc36fe8efc0e6cbcb8eb5251fe8cad14467a0e17551320a1a56ddb50414be1b533aeebc46ac47d894cc3d44ba0fa3bd09a5542199a85a5e79c7f8ed792a5fa45260a9cb0d6eee4846bec6eff89e1471f0b06f176fe2a96bb31c0cb45bd0535f87c0e90351f1b77368ccb803f5b3c9ef576c28960ce9fe51e8760e26c216a7cc5f0073ab6af038a78b8a4cef050972cd56560bb407b9b1ca1d84d2cf49fcb61b394dcda8768294b3306e009adc5c40acd49f62b054b0da1a829c51e4c80e9541de6b670d75088410e27dc1f863ae0cbabae84dc092600cc8123768f45ac2696705fc9264683c58dd57f3bb7713423d20c0d1932a30fa14b76f11529b487eae69887993f0ad9149e5a961836d1d63686bf51753136508baa02c306bcb4287ac9d12350d2ecc7559ed66ac8fc95b6815b88dd865ab9b7a739154b28e02005a968a8a6e6e9e48502186e195e79188262bc85784d2a9f05c92c87dfd98ef9798361fbd4fa09e20c9cbda77ec2d385e43fe630064640c98458b01f09997bdf5deeb4df1551ecd6b0f367f4d091a3edd4a71741869ed276237996bdd524ccf5709bfd757b11b088c741caa611591cb188e9382896372cfefaede7f2b8fb78eb2a94bddc128ead944ab8eff838ea24254c7a1f95188bd91ccda52014109e49830c80d18ffe0d37dce061e61dcc55b7b19ec687d33e06c113525f07bb9b2541de3ef591c07ab10d1d9855f142f36c536ebe8097867e46fc3ad64ba0609759eca7f3bd01f6d789b9307e8a20ad2dbba4788aec17883e1de78a2ca8b12927337e20dc5791b8fcf796807e7033970fdd17ede0fdea680c02aed44e808f805780befda594bede669dcbb53b0a36ab8effe9ed1c5f8977138e850a95dea2e5d138adae7683cd152d8304c8062668dfc51fb6f3949f0436449387f01d3f8032a8701e815ec4910e7d6faf89d026604c74531875be9cb0a09ec852d817960c0a5cf36c29cdb9ee50e97c96c7b389dbfe0973fe93b8d953719f17cdcbed1cbe9657a4d58750c0ef6b9dcfd5436cf84e9c63cf0e500a516e14f1b54059dc3e49061a0571e682adb1856f93c675749d60c8418c0b74ed6a6b6f9e1f8d7865d879cafae81ee1b7f897360873a6bde4707c65e505f5d3be3cf2498f62d3915d45c2d35ec8f5b1c1b9e2f6629b9481549fa35c91e88710d004080b5772342ebd6483bb8e84aa7fa3efa0c34be6580c33e926923f88b4406198d2a835170ff6a7d108f36ab37c18f424c83cc379fa313f87233e168f99de3d3f0bffb9f116229c2b578e3cc0b5737d4d6d36ba6474308256b53e4c64fefb9c53509f8b03a5275ab8ffb96d1faf92ae50cad50ae70da2b38f2d10d145ff4652a2a5872960a4ffa20ca7e634f0138d92d7092cd1fbb2cf5d1185d96807e4017edbdff3883ac9f23435020008231d13414aa2003c27c89490162ea04be714058ab1d7cc998df211a07486019245346a9cb9e70f215712256525e0275484f9874feabc7166601648d4cb1d6f9a729902fb631548b2411770fc4ad0ca9f35636962975c2d922cf8aca2a2484185f2b10a05280d28e8c6bfb07edec2bcea59582fa3b1700ad861e39679d2a493c701987f577150f95cfa3d6c35b7728b0a3a0c44c05b7d300366a532a6acbab77f5750ee0b1655a1c4803947c104414690891ab0b58242a43f9242214f63d492dbe82ebd1e7b3edb7503533a64a81490d7f20dfedc79c66232957601dec04a22f70f007ea34eac583c2e3e128fe420b70da2ba42e90f7bb15490b610a5ccb184b709b6686f88b5976b726b7b1892223e43d38762f8a94268cd86675647335f8c2c07afdc0ce23ea4c7930371f1d30ee1dd89a893de15879d0cb32f416c1e244ae34011895c2ce78327d37d47fbaf991726fbc5e81c1996f42391100548c019ce634b05354ce9914979cb8a1dbd9b5fff9c526bf900fa07aa85d4e340b84acf92b924e66ffbdfd4993936463f74ae22c4303cbd10cacdfccd940ca780db96c6a22da8baae6ac44d4c32a8e3ffb2db333047157e7a17541ecaeacf217828e2b64501c88b1c9917980179579761533fd565debb4018f3e0f10b452c7ba6c43e3b6925d414b502c4cf2fcda3f04653cded5961df03b69a51323ac50b9b4fe332465fd5fcf2f2c0b7ad183d698262448ef37e5154cc002fb98fcdbccbeb77cbfdb87650548f2d5c8a0e0be060fb929124af7e880d66d4183c3ad0fad2d2fe0845c71d21eb3f82a32bf375af2005db53c82aee88d75249b239af238682447ded84a54af576193c5fe2ab361ef02f1aa886b37f66f290a013d5363503526cdbc5e771a162dc287d4c9083fd6eb93263995434103a3a96837c0c7c017ebf5d1c9dd3cf6024b166f42da9e5e07a0e8964275a9279873e3cebd9f09801191ccb73fe9ad22cf24bb3da0b26a1443bcdc9a3cc92d41918be0c343b059d3612a3271600ad88677050224e86b0ed914c1dbb8eb42120fa715449983bf4f16901ad8536fad2e1c5a5df10c5da2154e43565ce0745a9c8eb8d979133668177b07ba55406628e0e3668d8d23e69cc26d62e218544b300261ed0382e9b19ddb81da2d202dd9872c90eeff07ebf705ac24e469e276ec663ce7ecbb15a07b248a89b6835ec548f13bd2cf020a9e9b3326450da1db258a4e67aaea1bd6f36d01032591ef201f9b47cf1fbdad65b6e6f4fc088d70e5f1db3d22701bdcf2d4be4d304171e072e8cac08714944c8e7c8221701588549ae44052c2a6ce77519defba0e4b3d9a9cff85b6635197c5e90be65c01b5a41f16272d25df702a55cffea1e766e76879f3b26cf6fb8868d679e14d2e58974a4e22d061d2f855c293defd33cdf66db1c893765cf37a8e9ba49b2a08d6beb110d5fd24b06caf6e9639c842ad6f89de820ffb1813a59dab0f0cddf9bd212bae71dc05e1bd0ee4d26d55a5de9b18f5a1d6c559ad6b61440bdea20f6aa9f346828925a0a7a6516f85235a3bd43822a4d8b5a01c613d69491f03b6446d3814ca471430b6804560ad7e45cc4e91962da46f9d9180e2da3ea9d9126d04b2c559fcd922befd14feaaae6b8322179eb6b4b695da0d230dda72efeb73df6b590c73c5b344b68b24e7d461da725e079d4b98188897e96fa4890460ca365aeadaa5f9b93449d7fee5a61becf3fbca536764d57b7bdc4adceba6c1d7a53a1fbc57b48909ff05f3041d02815f092ace74b6a1e74a04e5bd6a29a84b24121425c6ddce1fe68ed5f0726805d59a986d0cf1c0974d849c1ff286b4d8869f6550a6fa40cf8dee42efab9404bd2e74157ac4e9754a55ba01959e0b5d855e26e8be2fbd08bb5971d3d7cd193d5937985de4b19a4527d0c4df9ed35385f8fd7253b85947f87de945d84d9b9b39fa656e388bc8cb2a435f42c3673ba7a70bf59be3c68dc9028cd704cedd04a50f58201816271dd9b57b0c704db18d72eb7b8a1177961ea65669084fca58df6864f6a7594b0d4dea545011f707c488b0fd8b6508bbdb6dccf56e4bc7e0c2a5b67aa2e8ddae026264d12bc0ec13ff08a93542a41142082172cb1d8d0f4f0f29101fc075c05a25e44728d180db5075dcf0005c00d7e16a950d378201483c48d50180ef9ce73344ad0a722214b080d350676a78eaaacfcc5a45c30f908022ae536762b80c9fe133b056e9dcc81008f88f3a837320cff98cab553f1e840184f8a9cea00ec36faa0c51ab4eef810005784d95b1798ffba832b356d5dc871f80f8ab4c7d791e9781b5ea073f5365608d022fe36ad5ccc19baa8c8ba855a693df115e87781ad271944a2d32a50deda5e6206a14f8d28676ca818346c78e6a43fbcc7df4b0a9b9810175ca0182f363061962d051a56aa081670700410410801b6c18c0ca0a1992430f0e4578d881880e36341b1a6743d4d9d4463634970aaee64800706543a350205d0e1e078613d4aaeeb763a697df9f6efceac4fc06b93376a7ecced99d42770edd49bb93e8ceda65d6e516bb8afcb2cfe59fcbafcbb0cb419763b2cbb3cb429769aa5f26ba5cbb9475698bba2ef5b9f4e7d2d7a5b04b832e8d5d2abb7476a9d0a54397d22e25bab4769b75bb75db75dbe7f6cfedd78edb41a63fe0386238fe802ff1d9aa9937f13751de0e2a6fc368743ca0bcfdb304cd8e3be04cbc8689f2b60f0f0794b75d65b7ea12e56d567d12258f2bf1d9aa9a37e0a7069497d67c28515e4ad48366934479e990cd8fe8e1e30cf86cd5e948fc0712e5a542370c282f9dc120431d515e1a43dd08186eae80cf56fdf802aeb380f2d2a01c059497c280e018515efa4304909c27e0b3553a2fe23414515eea334302ca4b5d32d01888282f651d4086193ec467ab6838021e0401e5e59a6a88f232518a56c301cacb434652aa1be042dc0621cacb423c06282fcf76640030525e8e01e041ecf09c009fadb2e105b89002949783044080f2322c00af1b82282fffdcf01e3e5b1580fbf0d92a01fc87cf560939102f024479d987871fcacbae1d7c282fb76c0fe565963df9556d75f203a87368000f8fc3a4e170f13d44e27398b11c4efa105279a76cc84b27326744de721d5a6e8e990e3b7c6309329e079d1d4e3a9c88d090590eb29e8ac31cc05c555b85b00038007c03dbc03cbcc300e020ace214d7c034f00c2c03c750757c725c405a38ac1f413730185ea89f93908f590f994daca6c683a8acb5de67878ba6a58335132403cbf1c2f1638ac58ce50d7283a5bc3a307536eae576d6aab2e55273cc845a55ba46358750a3c0e7186a55e9d3d51c438d02bf2fc78c3bba06f9f9dca8b1dda490df85d020907376f79743464fe08d6159d0855443e91a491cd2209034d0e809a4818d1112ae94e94a9fb91a954a565ff942236f8e9990bd376ad486f6049aeae798dda8d9d0aad85b36295df4049ec7207855b69c40f66f0dadafb4a13581dc7e7a0b810543a21bb590889ec02f6c83720e48166d3f0c3b7be8158a04722c05d9d0ba14d44ca881be88b4ce711c3263bb5c02794b413966a5a0b9c3162c45a1a9ed966616242ac97e3f7b4b417d4b6858f05409e4bd51232202dfb235f1a167d0f7855016169a6af1e64887fadff9b454d9b654b624b62c755aaece154b21bfebb4ca86d628f024f8afbc3d9658b047cb82a749206d68f6e04b5168aae5e04b319a2a1d3c6d61216da552c622628066fbdf775683fcc677788a04923c3d0219ce40963e495d59d8b21472e31c3634db12ea10791c42dfe5e52924b542d6d0fa8ef36ad5e838af1b35969796e546ad9c14753f8bf3a227f0d408e4c579e9e0d9ab24c7ac14946366c18733e2576fd7ac68b7b26be92df5c86659ea91cd5e9c1759af8863ece97fb5745aef563a517a0d4ca86aaec01a5a167c3bb1e04b4d2c78928f053ffe58f06217167c585f16bc65cb63e68efb48a59e2169734d1cf04d3f40f22fceebc6156f86c61a51b80d8d35b2300ea1010514702f9aba65eb46cd82bf396636b45290055fac4b8843855691b155c8fed72a98d59cfc1e1c868036f66d739b93b91b89e0beb91af59d7e74ec099b7e8e42741f9554d8d0cad68ddadcf90e3ec7ac144453b47ca127f0e0bfea3271de2870049a8d024f67641fbca951e08550fb839ec06fdf65b632076ab7cf2925a029ce82ef610c0b7e0af0bc84aa48e08dd0d4943282d79d01ed9d3370125910fc9d4216fcf6e1c068eabac468eabec868ea9a6634757f58f0e0715e34c5078ff384a6460b1e27c85e9c302c8813c5822c382f0be250b1a0bd38552cf883a6be8337b58a3bf8b7aa3b7897b9430ffe85a66ac0b28920333b79289149c24ab6240050f2256125ec494006e1acd9be552843a6a56acc5557decdc776ff9131d2fffe9548648c7c489470bd9b1a249b1a455774464e6f688867e7c45979f572ef9cd87cecc6744e1dde685098e48625b11514086c3ef66280b60a29499f40725b9032463624372c89adb652c98a47a03923e7b66dbc6d5b7787a479c39218e52ab8b846433e203f8ee74e27b3b7675c90378485302654d5423d99bd619359e8fd1d496e4d4126b9732f21a75d79e1b5847c62f3b14d740fa38441db0848ee37848541534161149a7a991425de16b22eae11d0e439db1563ca2c64066d4ae94f94deba69656cdcb6312c88eb38ae3646e7755d1873ce8f993fbd29832e3e6ae714196831eb94294b784e1d308991b139e931bef0054c993b29df1631176d4a3770461bbd755339836659a47286d027a3728694335e1bd7456764619b6c338a6c5ff624b4738a194396325b3384b88ee372f0173ba7988146e7759d93edc9664617dee77932266630d98a706006c9c6077edf980470048235a012c59a4291ebac81e526ce9ca58c0d0f0896490490f30639b062af9d53a634b1f4620d9c8473e2ccbf300969d3ad51b407e1acb932b44aabb607d9fb9132426cb246adbace55ac51dcaae3aea34d5ea1eb877585e48eb2cc139aba5fcc729779b284a648e1b9bbccae405e9245537d102c65f8e035a06415be4b19fee81a50b2ea732759ad92e18b57b2e24eb65a25c3a54c10fdf146fae3f96389040a9746c28b2512f0617824a3775fc98ae3bad95ffd1ac53116a877265913c59deb5c642e329721cbc95c66a3b2fc0139edfd5ebcba2eb24bb2be18cb72ff5edfeb9764192248a3b86f14868e44f4b712c91bc50151354c3ae3899e66e49d27cb9dfa807491712c243dc97c9f312027b6bbcc57e630a50455ac7717194d7196bb0b159a9a5248a004cbdda5f6b284aaba21972a3435a534b92e32cbd9eb32a3b56a0907d9eb4264b930c662b1582b28534a1334ec7529b2dceaba0859ee5fed09428c9e8050a5f60041889ea60d326344688a47cbbd081772bf33f64e99ed09429420adea7317d2aa4d0666278f249c928d8a4bbcb862678c053e4376c6bc58629bd5b1fa0acb9f427cf75ec4032fc4e8e08b809f63cf11288408dfbd484745f84e1cdf8de56c5491ae0cb9c6629ae58b4c14963c6b14f8f06149c5e820283e145da1cf081604be462dcb1f859011c23b78b0a4e2bb57caf4bd2b59cd954c91d1c1cfd51ca120c05c8dca22603933f25da608cdf291285911597e92d51c8dc8745944c8f2bd21cb1f8740f2d1988d952cdb64314e484688eedc3999e577dd3b5a3764ef26e37cb81f97e55e9ccf50abb8f3c6555e7975136a94101c15db8a681bb28c04091421780a62a4c15a75678d565d594512565b894213d6aafb366b55773e8d1beaba731c6c88e3de959b6c9b35eab341f6726c8884831fa4e162714c8d2a3f408315d44617b24085b5ea58a35c329f998d59e637ab552db3125c61adf8ddeaadbc271d7b9bd54131cb8dead910ed4e227b7bd6ec6d96dd628dda5a3c0e694bcbe6420b768bdd0f0afe82ccb28db5aa595bece3e1410c62ab21a199ac03956c946445481f047bf18f0fb36a12a01d21d41c571299b12094e3bad97173dca49fcad41cd9a85fae9c651ae4fd3846599210765d375334c662d96d724cc462593b794ab851d58cb158ac25ab2d6c38e1fb732b67cfd98c249c34556da065c76d9f37a91362b86d65b7a5b66ecac3756f5b77c9f6d270a273ce1a7ae2cfd3d306852c9574ec8520a45348fa29d4a839f4d1482293136a679d5a3ad63ec1d5a8696f10ce22dca8ea2c16ab8a150c967e527b23a503459daa5b49810d4bdafb32a5d0cea021083e231fd4ba1f4e885df76ddbb6cd097106d29ba3d9db688e4ce41228dbbfbad113edca1ce0efe85e39fae8b4895157b97fdcbbfbb67197dfc681a6dddddd447ac081a6ee29880da71fdbe969dbb6b2869eba6f6bfa85b6156a5469b1bb5bb4fcee1e4e8687a6948b30149e7ee89c8210e9815ab1f438d870fa415573a522d2434409e46b68ea85d2db580f887cc0b233d683a11f76c67a0086e521cbdfa82a48a3c8a932ddd3109c3367187f77a694290380bd327c427616c139fc1b009e23384747c5adcbc3d2d7c9c3b3993353e4e975cc14cb614696deb6f4379887abb470ca3b7d69f2b010e770ea3bfdf7e21c76a2c66e0f7285dc6c10424f53b41c06c90b65bd988797f01513670ae6b901b51d0be97d4858572c61f1b0975fdbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddbe6c42462d193f7ed33907d5a69473fafdcbee69a5f0ca3a93904f3d0332d8279b8ca11ccc3424a300f5be19c19f3d072ce9ccdca1c42c2c4e1f30d2cff527ea9320ce6894faaaf710ccb176b8086e573953284986560913077f88bb315e6e1285c450c16e21d58be27f23864c70e9a34686874e840878e19d9cc8c4c0e646472e020470e1c5370e030a16132c5dc2026e6860d6edc80910203f3127b797139c3c5a5c58c9616961ab0b0905148b2448352895406893492318e629028863308c3d118a3112806087e617c9f2703cfeb62d03118966398dd3618cc9deefe62ee50ca50fa45534f4a26e8897b6829017ae22ab249b37c7e424f0ce3d70a48191e46ef77799368c08e3eb9c88e2e845233487eb58ac81786f57e0fffbd99c9e5ee9c7770ab01d995ec2ab9454f340a19be5f84080dc8efb3079aa22504442245684ac6fbb45dd7cd829f6399445c41f94a993e5b710b4f82d0143d3fa1283e17fca265901ba53efcc307e32383e49b4cccbcb557492dc85953d2ce18175acc5bf38b5f7c6ef1501256f2750f1fd0fbdd4ede4af2dc377aa25fa3b8ec5fced2f724296781fbfc6af5f544f144f12783a43b8585620a2b362b694ad108670d0d227526c7f55c7da4a95553c60845324faf6445368a67405e9ded5da49b3a9cc9ae86b8db0763843390f4f3fb487286f30739474a5b09f3033e969e2aae4f7bbb55617de0773a39969e2a2d7a9a36b6852adce88586419a4a7205a40e0d83bc33d68d883c6efb848cc2b0881afbd14084fe721f9542b89741e8697b13dc71a0a74dc709e477214da40a014b276aace75d080e44e8c7d558afe362454bb6cde36e2f39bf7d76e774bef27e1ef99dec46da4d054496642b90dba99d33b00a33c683221e14f580d583253d58d203160f8a8eb0200882a037a990deeadda2e03ea6acb0e3b6adbb09dd4e374a4f4ff3e5d64d29bf50b2eb687f9452d346b9de28fdb61601a59432d5b193bbe96dbd6d4d45c0d464278313f5796573dfc4a181bd1f11ccaf5193e36608b4110a9c1adf1fa73077b6f72d50475b30aa3ffaa1294a320fbfcf53d48e0933a75f81da4d814f7d296ab7053ef529503b2ff0a91f45f5aae0537f02d5bb824ffd23d5eb009ffa50540f047cea4ba07a59f0a91f81ea91804f7d0854ef047cea3f513d15f0a9ef44f5b6e053bf89ea79c1a7fead9e0bf8d47f40f5bee053dfa57a31e053ffa57a63f0a90cf6cce0539fac9e0df88403cee933e1c96c7f895209248ef068b6af802288f858b63fc4d7b27d213e97ed1bf97c6c9f00df8fed1f7aa8b3513c94f70bb2ad4379bf98ed21e5fd64b67bcafbcd6c0fa0bc9f906d5bde6fc8b600cafbd16cdf50de8fc8364f79bf9a6d00941764d97e10b065bb86f2822edb339417f4b11d4379c11fdb39e5055fb671ca0bc26cdf94170cb28d2a2f18b3fd539d8df2515e5066dba6bce0cc368ff28242b6c121db3f48b3ada3bc2091edcfd4d92899f28235db38ca3b62d92eefa8651ba6bca3918fedb3542948bbcd9daef4799153e30ee9f32d2e936724eaa0e154f8f9927b70cafbbc424fcc5d8d52af454fcd849ebaa3f5746c5ca1a726c9b21b9a3863105290b63ba94a61b2dd475ca520ede8e10c64cb1c879048a493482496ea31a11d13d8a05798272dcc5317e6a9dfe2b5887836892cbd25f4d4db5781b8528acf6edccd4826bb6eab9e137af2b17d7a213447cbdca1765e74d9b66d63de3aa1f1a5ec846c4bbddd16ecdcf98830774845609e2b7387ecd6e8a43053e2fb1d15ba2a7087054e859d152e6f37649bda9e38fd6e0bb649b523c2c4e97bb52b02e7f4c9da5d9938fdae764de8d6982729cc53bf543b2a4c9cfea87655e00e0b7cea8f9b177c52e589c339fcb16e5f57c7c93261268e89c31fd51c93669ed80b7b1b0691fc9867c43ce1e75f6070ccd4f8791d3355fa7c2d676a04befc9899d296149f85a2bdc092c26437caffa4d07e48ebd56e0684c9339b3b548db9f383b9e38d7ee829b585b553a3034237844e68e27444e88ad059e986ba2b5d13ba353a29d8ee6613a7df64904a185da1a96df433226302693177805adf16cc03d422bb18bd464f465046608cc49829f02cbf41c8df184abfa83ad262e6f4c53ae2628e803eaf05b673eec805b64f1a3db1fdb1f2280cdbdfc4b0fd1119b6efa806b6e7cc116779e70d58cabb2308595e53a9bce4e867ee8cef87639db683c8ed47d8ded10fa98422071e1d8a9e20e88abb103a5e1c774a11a7e53aed067633960d4baf4908268f9d396b4c158e89e2f7bb59ab8468cacadce9deef8ed02961a6bef7bb26cc1478831b040912430c2854b5fc5bcb6e66fb60856119a758bfade2304f3c774622924cc24ae8103290f1cd8636a462683734c8eb0d8d1b3d79326f88a69a967eae27b394de93d1d4f584843c2b344585aa98c5d58b71877ce305a31f4b0070c59d29a5ddbd6d1bc771a58bb4bbb76de338aeebba97f7b66d1cc7755de779de7671e338aeeb3acff3beefeb735dd7799ef77d1f0882ef3ccffbbe0f04c79e011cc4e1e16834e220ee8d3d3c00f16fecd1e1df0e0f41101c8dc61e1f7e78188a33903c3c1c7b8a04d1c351a00fef034fa8cea60778428d80907e882309074808c30d09074869069718585a5c649881ccd1719161869720a6d48d18932a080c0d35985441b61b667872c8ccd870030e00ecccd87043af2e8466c7ed4a47000470bbba103aa4a6a7e45193c3903a809a6f634f0e43f841d42e52bb0b206aff50db871eaa8fa5e7e1c7d2ef50e975e8204b4f2466e9813872e2d00fa939d4191c2a0df4443f8095ad46aa000250a3a8bca43293ca4e2a77513948e528952b57a1a7a1f20c9565a85c5429934a9be4540aa4d21f95a25129954aab547aa552362a2d6a9bda4ce889bea6ead0d3940dd16664e873fc587a1c4131556888886bf42c2eea435f965298a53466e9ccd28f28a5b12c7dcfbe76d1886a1ecb6b792e2158504c368bc562b1582cd66ab55aad56cb67e6e3e3e3e3e3d32ea15aace5c39e50070b8ac966423556cb158bc562b158cc9bb55aad56abd5f266de4c28d6f266b4a33fb58ed5b53a974ff7438bc966424330180c0683c15ab1582c168bc55aad56abd5a2c16ab15673b4986c2634446358cbe5f30383c16030182cf6d562b1582c16a3c16ab16dbb3dfb5aa4cbe4f39fd38b839142a621da89e8abc16030180c06ab7db5aff6d5be5a0d56e37af5cd4821d3d06927229dd829e830d38bfc016930180c0683d5601d5d5190d6287a9dd829687bf5f6d314a481349006d2401a486b8134db42bcfa48d264fa677dd2b1b7673a1404e4ac27143862368aed6cb772d4431256d26d8407e1acb93786ecf670f2a7baa2ca93356a3bb562fb469a2812c82b5a7a0472c67259fa6191edc95a55ea82a2b66fa51f4fc86e9f3f32bb957ee869bb11c8d28fddbedd18eae28af54eab58ef322edb0fbfef36d1883f635c10d9adcaf041dbd9cfce581a05927e419259b08a446b14d500d922d14e40aa6d61fb934b2c17d87eb798b0137aea2a90b7f4f2f1196389186dd8d20f1bdc05097b9551a2b5aa549b1b7325590cc4d6041fe49255966a3516f35cb6de475e2dfd6ca5a2d2137aea6f34204916d0f76ad557964a443445f3de7507fa2e846eb5d4a2a7d16f77afe48e4653fc8446533daf8d8dd28b9e9a64956a5b1924577e9c43471fe8bd87a51f9af2cad20f3d31cfb42c967e4a3e5b90fc5bf2b15d027df71e4a41ed457221b4e484aabef74b3e34d5bd88a2da87a67ab8283929d5e8a9b5206fe955aa517eb76db414e361741bee79a7e0290f4d6cdfc61cb877ef9cb0c16ee5e54bb1d1b2144614db1b1ab64b307aea2c90b7f42ab54aae92abd42ab56cbfd42ab9b8ea15d1131312ad55a5d744f5bf8fbca5171464e945b64817e9225b648b745dafe6c5264e7fa517c4e591cd7a411cb266f79b37a8a28b998d65fbbda0f6823632486e83b1f30662b44ab4aed4a597ed5290ed12114d517e8fec75a162fb37645927b6bf912dd6c2564944f4c406c90a9292802411714922a2a73e89464f4da2d93e8944445393d6b2fd399213a73f1917d7306c4891d56c8e9d5264322964e9fcad5436b1bd3fe7af0eaada66c9b105358abed944293df5748ded6f23109fbd4ab820bed5ac22b5d702e1dbde0b8c30003ee4c46f0482b317c9f7b013c11188ce5e2abc879e381a81f0ec4d127a1f89f42da85530a739cafbe1282fd97253794d64791f5306dd286f0e4cb9bd7c9f0b49b6984ce56cd449598ebd2dabfd8dd5df479226d37fb2e3efc9e6d8f137c7de8db5054d1cfa52fd6c9741d2cff126b176dc82c27aa910089bb56fe5673ddb59ce865bc8855de8890d4ecb5b2037224e49a947b2909e69f7b86d1bc7711cc98d5dd7751dd98d9ee7799ec71591b75d566888fed08818165463d68c1591f71b32e989724308bbeb3c29cccccccc2c85590a333333b314bede85741b247b1ed3ad1ed95e92556e5e94527a13c6cd175ce9cd939bd70d0c466745fd504a6959af920ef5649b5bb7757343fdcc897a61d1067945224b0f43badc7adf45a256abb80fa6bc1ff9525ed2a5a42698a55c6f5e4d451d3acbcc2fe7dfc0e889e36e60375ff4d8c3bf81d99b21cbf297ca52debcb8a59cf4e4c231414f942b95a027fa2294cf52894c21ef57fb6aac5691df4792262aa06571b58afe265318babc87a12569fd7d2449b3f77674f03b578a44a2f57a40764cd4688a084dcd6945a2528988a2e84be72aea270ce7d87297fa598ebb4a6ccb43963a6dc8cc2c302cf586e7ca75630fc7a81f98eaf252593e4720586ea4a588c8b15af57d2469328dbfb7976359ca3d29a22998d383ac56c59c1e6cb54ae6f4a2ac55394e4d24e9e14c355da6de38d7919da9382e53739ceb675d60f6be0ce520b27c1c3e6a26d31673a3928de25eceefa188119a72397de8e272aea25ef4c4b9944228e7729e23cc65fb3265d6d201e505e7f05fce55be4b8579b8899c8ccb512f8b12b24268f852515d700e5b978f211561aacbb9729f2310282f3887fb4b69c4a52c424f4ad0544b7995b470a9c4144259ae38b3f425d9bd1deb57abb1b85e862cfd65718944b7674cf44055276b2aa28d9a6cd879857c995d20ef576b9558445154242a2245a28fa8452293a7e485c68c20fc96902b28b492403133b06dc79b7a607d6011cb81c5139e011b6e22ad38b4b02a571936ec445aab8b0a160a0f260b2b86600b2d575819ee734a089c20c3fdc56e75e463c34ee4ca9dd66d7ea466a3a53071fab48e96eb9c92c51696b641dea65d4fc876a3ba3d59e97a412cad637bc4b5ac51dd6dd8268dffbe510d4bf5c8e8517c763c59c9b3905e1212ea1652e53eaa9d25bdb167dbb85a1955ae85ba89ecd6435e5b9210f98d2a1d2b102cbfd5f8bc4a2a81ba70e4914ad38eeac8922a50cb4b2d275b668d62960fb4a47a247c149f257dace34b17eb12284746e45bd6aaa6352d0cc9cef2c787a4b1672c6520b771dba81856ae756c6f0f6bdbcd541a376ac73a270ea9ba583ecbcc614b8e2a144958762b81bc32f43c123971f8e1266e14fc2ca902751f4bb16ee3d6a3ea8d6a674915c8fb587decd5e9b036ad361b9465fb62cb7a73c96c9f7e80dc7e5be4c86e14c34a3faa9ba5dba8b60d4be2a8521b92e28845245de1eae8348d9e8648b6b4d79838fd8602a3fabd65c0b405dbdd55989283362c0edbb489330392de9b71342a05f236ad69dd449d842ae92e064a487b407940f2451ea5e6164272155950931794c1055d41952004210841a8c23c671a4cda4e2969b4984e96a2839a141d58a16c2be1acb9416616fcbe2381bc366d58f0f408245d423ed1c9c8ba3dfcca5b9170ef88340a7c578b4ce1e2bcb6125896e3bce60efd6769399ea51e613bb654a02ecbf136b456e9340afcf78d9f939999524a5becde388ee3baae87f4d0f33ed11bfb21c820084e96cab6974011c3ebb4aa8656a3c077f7b66d3d2c0f398eeb7ffdeaf9de64ec71a21b7bbef2a7677e3d5fc939203758137a029df87a6810c81f7a1ab2e1150bf66cb30ab935198d3d61184ebb954a1b0b4b4b4bd38f5b4a956dd8c2a5209c17ceab05070d1c990dcddad06cd8b021a22996830fc31c540a240e781cd8dc9916b4dffe8d43662c2d715e6c90df10794b419db8b1945a5e2d758e9485a57b521a05b2bbbb7bab5dc5de299bf4747b66ef948122cb38e42bcf53c86f14bfca966d382d7f2d35b4586a68b1b0d0b2357a634b0dad2695e5cfd675da0f66ab90f4618e9938ea2e4e0c67c8824058407e80c4800ce5b0727e726239433a2c9d1f9d98ce108e90052f4e0d880f90202042406a393e3941394239351d1f9d201d211d1a8e0c677671681687c88217480b880b08101810199019101a10a29c568e2b27079623cb99e5d07288745a3a2e1d1d988e4c872496eaa46310bce2aa0dd10fc80bced5e7327172cc685cadd2e1e089541a1d44ad22f2259a380e5547cf7318721db356e1f0241cc0c485541df6ab2e68c12b7686193588428332c8089ac11862f080ca0ed290e5000753a4dcc0066854a01f61d49b6301022f58d005175b68b102159c20054e50208318800183c11750805cd08257ec0c336a108506659011348331c40837919f54059c5f50598e0508bc6041175c6ca1c50a547082143841810c6200060c065f400172410b5e2127f24f85e15880c00b1674c1c5165aac4005274881131484dd984302302da603b8ea7d142c40107a2233a9e2d903558973072a8e33076a04cead8a80f306ea12e72bea0f670d54089c97d4057c02d500672b6a03ce55d4049c33508338b32abd92ea8027a9489c8afac491d49210b7403df2292a14af407db914b58953a03af128aa8f8fc48012a8e6bc2a55a01e7ea402f9f0960a64c415508178fc56a0f20fa84045fe441250381181022c2001302623cec2e34d54a09823a002f538042ad0e90da840a8cb54209b3b805e891c485429484b4b201e8ea30097c00e446a78e8c1870218c08812061d78007153e407018478f1f143103b1cc00607488e4e0c32cc40430d29551000ecf0d87043000420c4ae0680434f0e43b87fd42e52e94da54054caa3521d2a0fc150b9acfcd328be11950d508f6814bf005548a3f83ed4378adf43e58148ed58a3f843f839f07b7800fc15df562155003500956f43e5a93b1500354855d554ad814f439da1ca5063a83afc1cc6e1dbf00f508360fe817df04b15a2d61c51bd164c9c7e11d57301e7f489a8de13eac1bc3086a85e10a97a310f0d4f563d2adecc33523da146b54c495769a166a3899ad6b52eea365aa8ad74959e751924df0ba3eff826a2604b2fca74a71f1f8aa2288aa228f230964d786290e3388ee3388e5ce989415ab1633f2f585010ecf5d3ac6eb5ab7ddaa75ddd6ad6108da85623a20dc5643321a1992cf6f3820505c15e3f94455bd4457da80f75d116650dd1886a3522da504c3613129ac9623f2f585010ecf5c32c6eb18b7dd8875ddc62d6108da85623a20d4d719c424771df9cf590cdd8ac479fd78923372aef7bf8898793575e9d1d74baf2064105e1ca6b3a99c6f2923dbaa43162114420e10403783471440d140eb0619692245420c1c0052c304505a4a040144c3cd0010eb436c0576880974c80ade00cb009d8a7042418411316411621e00fb8b0601078c102ee82b9e02d580bfee115b00af8049c0276c2286019700c180c86310cbe60284f5ec0402e6801bf62679851038e42032e830c0ee23078063c068bc13c602abc034e8375c032ce01e380a7b01446e3066c039b6ac41d508f1c8acaf223aae94d5499f3a83fce809ac49da84f1c895a3a11b5e54554988b95f498ca2b1a05b2865995742515e6496acba9a8a523a94f1c0335895fa0feb805aacca7a8a64b51594e817ae45154231e53e9aa0262c4ec9c22068ca360e71419d8c0f6ac85e60e83f17e1361ee30ecfd2e02f3300cde6f2b34c55f9c9ff00bde1738bba005ef77ad5515f8b684a69688e2fdcd3577161082b993802c98070138ce5e300bdedf7eb6174d7117ef6f4f68aa01ef6fb02d88a6207025dedf629b6cee3017ef6f3a983bbcc5fb5b1accc35abcbf51a1295ec1fbdb8ca65805ef6f55688a53f0fe26d42a1f6727ef6f57e8466bd5cbfb1b11dddaa05b8d63cd1d07bccf6560ee20f13e5705f3b009ce3eef732d9ae212bccf31a12926c1fb9c8bf3a1291ec1fb9c139ae226ef733fdc8ba6388bf7b92734c521789f83b5cae67d2e68eeb0eb7d8e8cb9c358bccf95c13c0c789f8b425347bccfc568aa88f73934688a88f73959ab6adee7665c159a52c0fb9c50ab78bccf0d7157385aab8c789f239a3ba3f7392a7055e0daa0a91a4d15d1143379bf63752d9a620fbcdf31a129eec0fb9dabf3a129e6c0fb9d139ae2d6fbdd4ff79a3bbc81f7bb16cc1dd6c0fb9d0b988797bcdf3da129b6e2fd0e46534cbcdf8541535cc5fb5d17a32966bddfa141534a64adda61465349a8106a156a68ee606007c9fbdd1298c702ef2968940ddaef6a5d114d89ac56c5b4688a3271b5aac7fb340ae4130f99c71ea01b4a59de63cf91f748005ec1f0c4b7b1278912e9422818d5834d1c0f8c89e3c58073bc30e8c90bf22e50bd58a33c995781eacd1a25444ffd25aa67852ea07ab489d34f40f510503d28704e1f47f5d8a0278f889ebc0354afd6a8cf00f56b71b185162ba85f172aa8df8b9ebe27f573523f285e3e19fd84a8dfac517d0720513f224c9c22708e157a1aa2a72b4445ea576b14c8026d5c5830e088222a4844056b2a0856f0c5a3825b05838c18555006eaa0ab20152605a8a050a3c0217a02aff850411a075a3d6c40034baca882873a72b1eac8a78e7648524754a090d4111913a77faaa31e75446b541f0341b66f81326c7f8a3ae9498a3ae9890223346c8f66b663846c9f0ed93e5fb1cd834a3a53a930e71dd496731ab574d6417de22cab499c73507f9c715065ce53aae98c466539dfa01e39dba01a718e529988d511eb8c3aca80197554450dea68090dea88491975e422a38e7c82eac8491875f433461d3d11a38e60df8a6750810e709612aba4f31915e66c466d39d7a096ce51ea13671ad424ce65d41f6732aacc39a89ace33a82ce731ea91b318d588335035800c2a288b410575004605d38055900a0c2a38fba28255a05450e84905875e50c12b2ea820510b2ad8c6ab82356fc5617822cba092ce31a83067306acb19564b6718d427ce5fd424ce50ea8ff3932a737e41359d5d5059ce2da847ceaf6ac47905f50167155405785141170b2a18822e2a980517156cb245057db4a8a0939f0afe9ca082b0145430c84905a3a0a082b16ec5405e54d2990515e6dc456d3973514be72dea13672d6a12e79ffae3bc822a735641359d535059ce4eea91330aaa116711d4204c503f219ffa11a104f52b0209ea676504f51b6a52bf2b59d48f2804f56be303f5abb92ac8c2a2824b4050c116b7e21380229ba092ce3e15e65c82da7226412d9d47509f3837a9499c45507f9cb3a832e71054d3d95559ce58d42367105423ce56d4cb4ceaf7e381fa69d181fa6dc1397de640fdba68d5efb581fa3db9a27e300dd42f6849fda2d02fd6a83e57513f2a19a8df6c5bf1079854d2d90315e6dc81da72e6402d9d5bf589f3066a12e72bea8fb306aacc7949359dada82ce72aea917306aa1167561dafa426e0492a024e455dc09154091c0375895fa0fab8056a043e456dc02b507fb8141502a74055e251d4cfa751fd98daab09dcfc8aaf60f8e82301953f523d271428e612a8403d1e810a743a042a10ea4f54a0973b518178781315a887df0a54e40fa8400538131548883b20e64bf478034e5722899723b1c319c0c38fe8e10bf0e10a28c08da84bbc1f5a43df0a0918f122c427603c0cb5655ac17022aa14a4154ba01d8e802a0569c712c887ffa82e387e53a1e4f815df0a86d28a39a2b54a87f7bd57abcaf73d58ab7678df0b6a150fef1edef768adf2a1d5aa1f5a05c4fb9fac5545deff68ad0ae24d80f7c157ab0af03e286b9591f7415aab0cd06a9510ad3ac0fb2359ab86789b4e3a41a66cceee149ab44974678d5b2ef6e117c338e8b26cc64234a25aeb52970f7dd120199d09511ad1a5b56eb5ebb64fbf885cef1574bd577780da09513b03d4ce48e50a503902542e88ca15a91b10759bfd5037980f75eb8187da438deaef505b87ea11810d79e5d083c3006a2b6aa9902a805900643704d900e379edf800c0d552d5524435d02034c34c06590c3dcb7901f1c171b5bac340843af9e861132446a7e6c4a396b567a40a5a970ae5f50f71e0c08143bc102ade14964aa5add68ffbc7d787df5f5f92f424de2395a6675fc4971ef6d853622bb6f8908aa4dad9326c9154390b5379134d95264705da51aa9b75a993d670a3b6bed58ee3a847c443918465713c9491d95197c4fc8aaf624a28e378d2691e82630f4d29c3782194a6b295110f96267a9221d5b62e15cacc4b5d0245c7ccc35269e6e3753c1c8d3d3a4a19c899eba86c4bdf68a6243b51a602c53c47fdc4118fc3e5a60ad4fa2aa634354afc8dba04ca782bbc2f7ce10bab1bf77c688ac5094d913f14a6f2c411ff52bf46892d75720ea9d2b19a582c9625592c96fd582c961dcff2301c7b58584ea50e3d890f5b1c4592f8707a1fa97e3664b1a46b90f4f7bb6ca9f7c4837968f478328ed1d3ac0a150fe685e13da1a7162f96de6be28441de9ebd42b186a32a56b17a0f3951acddc34e143f90d4337aea576e4e1c71642bd676d9dbb72f4764fbdfed59bb3e1d664d474476f2e86092b0922d89caa34a48148b208b2f366b30a6fd50211e2301be550d654a0a6d3a6e6b52d8231c81df46ba18f0c1912e9253470a51df41a36346268747ba4960409d7cf4b0a9e1517ea4f086c457c2bc75209c3537fcb17d4a29fd3fce455e4fc662d9b3f0270322cbd2874c7be33a7aa24afaf4203a3a45384bc52d8c19c5a2fb484a245fa3e82495ace88cbcdb8f4ac8b79f27dc1686a5e7becd6f9234b5f2c28b9ea86aae387afa01f29aba735db39c8fdd8ac82bcef00113046d32b412b838992752807532242022f242d6d0ebf342d04a44421766ab243e5af30617d4085a4d24313d10416d85240910a21acb4fe2d1c4f0085b608d239318b848379081ac1492c00b174904042196521522c85a7a44c10933974a842b5e2f3e84308356ab72ec408b56dd6003f65ac524218d80ca6c35690d48928c3c3084da0a8a0c0f5d13dc6d12310a4ef85941e14ad3c8e709b356b94c81044133661aa10d1ac8b82044010b59c727e080175a57f881cf448206ac209b372c89ad3c9127c8739b387c9daf670f5cf3f33571e8bb6e3f4f20378f4a0dcc105ad1af3443d2333658394df05975094546073e772eeda8c5093f2b244972866003d6aa9fa4c4c267d5e56c55121d0f70c112c5d9aa3905272061d6aa7e8bb3553a69642168c5248f25b055128fb69ab486fb6279b60a89157d19232f7de10b5ff8c26a2bbb4c524592edfded9506ade18ae02864f09bde0c4516b7cb48647be3ecb441152cdb1fcd4656a82a66a83f7a4253d3061920b2a328b647af986d9608ec1dc96cffd8a00a19d83baa62fb8e60b6b95f3405636f8761fb23fd8079aad0d4f8ad5484b9c36284c9334507ee884ee05405a0c0a9d11438154a4181f7bb2d702a8af73b2f706a02ef7b5570eac8fbde159c82e27daf039c92c0fb1e08381581f7bd2c380581f73d1270ea89f7bd1370ca89f73d1570aa89f7bd2d3875dff7bce0d403def75cc02997f7bd2f38f5f2be17034eb5bcef8dc15e19ec99c13c7c269650e20d40e2491ca1802fa008229e80218e00218cdc000528f2c381e8e13ef0a0c3909e015801dcc00300550d33c490837383f261c3a3eed0218323e6b355dc611e52f19216f89d35267e99b5c42fb794f8651712bfec73c42fff28e0975f45fc328c885f0e1ae2976342fcb2ccc82fcf08f0cb42433ffc32ad875f26aa11f9a5ac1c7e690b875fea5afd521f21bff42700bff465c32f85edfcd2a020bf3496faa5b29990ce2f1da2fdf8a544b5d36fb37afc76cbe5f333f3dbb01cbf1d64faedd88ddf9671bf3df344b0d49163053e0f0303918153527c3ec5290a7c7e8753517c3e009c9ac0e7579c3af2f91c3805c5e777e094043eff03a722f07902700a029f1782534f7c9e084e39f1790570aa89cf23c1a9fbf92538f580cf5f4eb97c1e029c7af9fc114eb57c5e0ae6a19f2c2c2c2c2cdbb6bd548f1c89e2b32c8f82b4536c64ed16cc8632ae3173fa601da3304ffd7ed17e4253e0dc11df1f03b56b8da2efaa47a5875a4f36718ae8896e2c4b3756d7beafe432c8cf632e6fbeb879dd7c31e76360495889d72d2bf841d00e9c58d1c67c074c6c0d764e49a34a0ee49c9206131bdaed2d9f3597f4b355d44fb755ef22e76d5b1905b5e2573621fe06b537be8d3c88bff1ea71dc8d1be738ef73f441fc8d0ba1541c7d1f7ddcf551b31d278adf686afc578e230fa38be310f0df3bd40f4d79817a7d755aa1a79190f7ee5f054b171fdaef9bf87dbb108af28279c27ff4c608c44b79a9e50e535e7ae3bb71a3e46efcdeb8f1bd3c2cc326c473df1c634a1eb86fa5109ac30302c97da54c78efdd6d19575e1db673406ce7ba7fdcbf12ace23824e6c6c31108b12b95b87b315dedca1bc5f6718f39d895ba8ebbc73dc61b7195b361e54e1445f136d421b437c4cfab1be92f75bc4b0dff91e7caf2904570ebadf41bc576a3d89c68c24379c13cf72d6f09ff7d65587e5c77b1bc3c7d104b9417e5e5ad94f1ce3decee1e1048f1dc4767214ba5370ed9de84585eee462044bbdd91d058b7adbc1350321a8dce8d3d23707eddb580dd2e06ec76ce6eef80e0ec762194b373d421b45d49a24ac66eb9d2426da587fa8a9df4fbfd4412e420123cbde781f57a6f4f89f54a9417ed31ad42515151515151515151515151515151515151515151515151515151515151515151515191a723b6d0893c8b0bb885df27d7429df77da391f7d3f4e5f7f07bbfe7fbb63ec2fdfc34eac8f6db557a88a77f5b0d294820d8d942dfbbdad9ede1886d7f950bab783ff4c7d2cd8e2ab885dc27b475d4869dc37595ed08e4be12c8f3bcf9d10f90f783d9c9434973a1175e547c03ab15494f0ff7397217d2e7532c684ff7908ab4bb790ac975764242434394e87a2fefd5ec05792f2f8c9e4d0b7a5d9648a0f4917c073def5d1a1921013f2ae7aacbeb83c87e07dff75e34d5d38bd2bd3c98a5f768ad673455a5675c206b4f5e3a3e27d75becbd2c7dd8359dbc91ee14d6e39f8e824294a6e837d3b49bd8f31351afae674379c139e7987ae00708b971ede68bcd2b79a0e7953a8f1c752de40824df5247e437baf9a254fa68f49683f56e16dc7ef38479c86f1bf9efa61a79f3c5cdebe68b0d1c7bb6cd454fdd849e7af3a982ab0d9ada3adb2c2c2ca4b731a784c91f696a587ef839f9e21a6d7b8d5683da266ad5dc616bb24d9b3b935ba3444faa97b4e1c77a4d367c589a487aba09e3dec06ebef8c49bd7cd1737b0ee66c88637af9b2fbcb1873fb10ae40dccbb816d24875f3499c988643359ccead83945f6011bb6188ece7c1616cf2bef88f282548108adc7c232edb89de9267e34c5f6bbe2c9d1b73a8e2de7968325d259581eb2bc85858791656179f7af87fa0a4905922b91b835c8915eacdf8812a15e5608edb7e7a1bc7328211ba27e686af24ccbddd8c3218b1b154814d75b2903897ad9260abb83f1e4a21cfcd83e1b39a8c2b6176cbb1a07b596952b424c999f744d361329c68036a5e416bd75530142141ca0e05d93293858b271dbf6644a17c8275ad8a6b041e553629dd77551b62752d27832a5458a85b3e69ec89e9887cccc94d2668ee38de3388e378ee3388e7b7a09d9bd4daef3622adb7047c87922698482b160a3e0ced61b79f0ec3f3f037906c8cd4437691cc759dac68c8cc747447dcd8528cfa3a4024ac942d4bc7c5952315754d4d77c2b658cd4d7bc9635b34675f73e333f94798e3970a77918863d03e3a2a73906b1835daa69280c39718e43688690fc30aeba630765b9c0b456b76636c7976ceeccbca3a7ee6c67ca39711ef31df54ef1639df086666eaa47d8c6fc75ae68ea8d79cd8c5a21899888d09434cfb9929589a69421a2e6f546783ca7440285e6a692e63352731ee7e1c2a6c3b49ae62e65148ed59435af46753795d7443ec764e25192654953de8fe2a8b162bbd3239035425d33aba942533b5e03e32a134e8c34df519da027265e64b6ab8935a1a8ee3425b715935633a3a991edeee9c7762fdb5d02ad2a79706d505429965c8bf1862c6d153be10d71dc9907247721cdbd70445690ffd8c85f4b242f2b8ba4ed6ea3948673fcd87d846d9d0f92ab71455c1b5ccde3485cad63bdf40847eba3deff1cd9ece520125925b429ff852491a77d6d6c37fa159194454f1dd76a5e64499c36145fe78a2e81e488605a73876d57336329645711f492d1145b8e68bc325a19abd86ea462bbbee38bc757abe8122eaad1536780bc33b29a19118e6b64c7fda0a78e22817c393d02d7bd6636e620daf1459303c785d02197d397781f9ac9f4d9261e3da8d0d4ccac553530aefa5998263333a138f6cccc70a3d71c1e9c8f5faec1b84e15c62787f419f34953ca70dfecf8adfc676d624a19aee458f81919f726ebfd4f48f251ef6d8f170fb1cbc5068ed2a5bc6ca586836a5e546c38e8a5ac794dd9a9550f5938a64e3bbe605a33962b9b455e8ec82434776cdedd1d7687c9eed8f1d91d9f53c544a3baefe072ccb8bc3b8ccfdcc1f1ee4c6ce5a4d1499b34513c47f405b24528c451698e5a3a57415b33ab99d5cc6a66f4386aea2e75fb4c8d395743cb2e1cbf1f39c3ae9a178ef27e2ee5257d7ca6bc26aebc3baa70e77108b5acc644712782e5fe52de4f0996eb352c771f651359ee64797794aa484fdc53959c38dc69edd9c4e16a5686aed85476f58e1d2693f85b339ba92e15471d83264ed7a30e375fd01a13727dc5ca501bdd865039be780a69aa6c6764ffec0c159a32bd9bb6c710d1729f16a64543a382695154779a87d40b24cd8c8ca644d18eec7d5a55dfa1743ed37d4668ee901c8baddccf95a618919c385c72148e311a94c6d0980ba1748b618ee9c68fa11cc73195968c0647a1a78e63f4d455e12af4f4a229d1745365dba3b245d5fb1fdb9da61ed974ea65a997651c5f976547bdad8665218e425544b80d920dbe62bbcf96f2b215db7d46f6622f07895d204fb69ba1a8ee1d498b48133d757fa1a7ee243d75bf930be48c8c4baef6f134e5ed9aa539f3286b6aea5fd67a1e21c8a3ac9964113d752c7aeac8dac4e91ece40c2e8a99342e6f81c6d6ceaf8da7103db719b7a95589bd32d90a4dac6658caf96e57aece8b1e342daa6b4a324c7174dd9bc3b599b3bf4ddc9221656abfe4ec7492d4c1e7e17537b49fd7ef60566e3c2a0a91e73c7c73b8e2855d6cea839e73ac3658841878647f1d91a605a8dea64ce90a1ead4a0733e0d3a349432903a34e8d0e89456e68469b5aa693497d1a96d659e62a8527c5686b285e689e63975490fe5c8505ba8862ac5676928bb0a0db5ab4c1c9acf40f356438618745aa85134cfa93db3a9d39e616ff4a833547cd499d9c4e15eebe95c7fdca6b2fdcda3f82c0ca8efc079149f05728e28bca9a8d3da590f0824ea7c1cd4c371ecc12965205138285449f339236bd569a268ded1dce5a83a334f3054293e7b539ae689e6a7bae433069a5b9184b53afda69a8054293e8b53becc13cdc30da7be4c1c9affa039cbcca179c8dd54a01f860ad4fa563feaa5a951343f551a72e2d03c4728723c6a5201cb1d86c9d803e3a2a74e06a6c5a2cdcbdabc47bd4a6c8fcfb1a7c77f252b8e8dd4bf4402858fe4afa58f9a919ad7d712497d4da964c52527e6a05a20ff4a7e46c6f23bbe6684e8a99b99d153951a79c757ad32dc6b5efe55862b6582a8ff85285ff3bf7e56d6ca3b2e84863bce7547e52092eb4502bba4dd7cd89c562596ab4ef4ccfa28515e708ecdb77a7d0c599b0be91e758e3d364268cb615a34b5bd3b0c1318174c139adaf1ee353c2dd3dce55cdd5167a8d013cd8ecaed383d8f7447dde88986e636684117770a9b0532c76dc26db3a922f7f1093d756318a508daf1454fdd855098d6f88269e520da19193d75a75820cf6d1b7705b2f426433d5cd9b5e8a91b5fb60d522604924ff3d9faaae6223dd190b556d51dbfa48d898999317d84b5aae6ddc7174df118d42a1eef4cf6d52a0e6a5477724779c920db9dd6bc6c1796f5e751eb4c95192a33b3f0a505474d771e7546a851ddcb6aa21f70a97fe5ae0f227ba3d8ecc6edf88e1d0f29a594dbc26da3df712194ca706d5c25e0d8c39d236a15d7bee6882ed7ba532b90e188430249cad19d7c383ee11959abd8c5aeee3e2bdecf92a4935408b9edc321522490a4d32390aa1959a3e812db3d9ca15205b2748f7ce1222a905c1786a370048a9f48e24a9a0a5e47bd0d84997a5958b6bb4cbd5f8e7a3f1c33b2fb981bf58230f58e645c1697edee52efd702d3b2dd59ea7d29d52bdaf0a47ac5b16bdc84aae6aa135db67b58bf0ade9a9925891f4dc930b7854d3dee94bb0ca5fc99ee3323a8d9ee33dd752ca1aa9ad8cc08846c3723b39dbd33339aed66886c375364bb1921db9d3237be68ea6e309aba5f8ca6ae383ea1a917db7d0cb2770ce386bd2ff6ce74224d753f11759c12531256c2207bc009218f3db1180cf6f3f384e49e90f487fed068b05a8d7b127ed3ce3187d90585343563738c7c2a0592f60c89b00464bb84e80f8d61b52e0189289c3577147225774411449c798893c21e5e6784594a925081040317b0c014159082025130f100922b58034b26c05654c11930814f18416dd4f8dd629ec252180dbe01db800117427bd42550461f8306003ba78c0103cbfff8207fc43c0c3b5fe493fc9728ce3fbf867f6ad5cdf93a34c52d88c0f9415a05c3f942e6ce12e7dbb9b380f357cc9380f371a0290440a001e717699501ce1f82a69438bf089ac271fe11ad0ae27c26f84ef025d0aa1fce9f62ee7017e75b807f01e691c0f948680a864de7039ccf2e9a92399f9bf0d9a7553ecee71f9abae773177c7eb5eae57c86cd1d56c1f90cc6dce1149ccf31601e76722e9dcf413475e47c8e42534f9ccfb15609713ecb682a89f3990a4d41712e723e0bf1d90a9f875a559ecf343eafc16728f0990d3e13f1b90d3ed75a65733e65f1e9129a62399fb65ac5e37ceae2d3267cead32a23cea73f738743703ed5824fb7601ec6e27cda054d31e07cfaa2a923cea74f68aa88f329ac5505389f06f169143e8db5ca87f3a98c4fa9f0e9ac553d9c4f85e60eb7cea744e0d322300f6be07c6a854f8768ea01e7d32b7c4a6b150fe753223e6d834f6baddae1fc66d19492f37b094d2539eafc76cd1d24e77708e60e15e77716cc8381f3bb094d59e0fcf6a1a929ce6f273425c5f9fdd3aad39902e7f79398f33b88a6c4f33b4aac553dcea75120890849e04644f7063722b818800183c1174fa290d113959beacd5a1001189658830dda80eab5e129513f1cf50ba27ead467daeafc90ff5f3f999385a68e1838a0a52e0a4543f2bf41ba2df9524ea4704b2c02565055ba00b0c019805d804f4019d8c000c924d1c1d50a1a7990738b0010d2cb1c287a52409154830608129a4a0c028521dd4071c0b1078c1822eb8d8428b15a8e0042970820219c4000c180cbe800214a8dea8f40a56ad93410a9142330200000000a315003030140e0945c3a128ce3259f70114800e80c668704694263992a428a49441061000060800c0000041103600a0f4d01e59f979184a7b628dd05d4f08a2ebfe4cea674702fe20de00abc5da6f53da69e8916716621fbe4875582dd4d016c104534f08104e1e279697ec63db490c73a917ca8382a157798b058c62302cb6a7feeb6f8f422ff8826be33be5882705ddc09521e86714c19b0a7a2869c02276dfce1193c69b7b27f2fe2c8c920a2209e9fc87aa9a63a5c5447495b7df2b9c85a5b2f4c9c8b6e90f56f9a85f1b3b913df0682aa9f3b64fb8e3410ec6690d4fe0adc2d6749858a53feaa57675b1eb0fbca3abd96053639c011ec14ce2e9e8eacf7a79b752c25df53d3a9552c928c06d740672ed255d45b6a2402c5d62d1506569963360ba66d928cf7b68573402e86b62a38f5415ef83872fa01fc2666632003a1492493399f49229895782d0f8500bf156fc74c273b64cdae35b495085e830ed01c277dd3fbdb98e1f97738973059b5223b57ac56054938276fb53e6567753bf63f26fcb7898293700cc5f70dac2b97b0be7d2d947399364236d67ac16eef99d425f110c23bbc5524c3dcfa7ea5bbe53c43bd49dd2c61e3df5b1d077fe071563ffb3435dfa0a8461f21a8763ac6874dc15f1ba697fd602d9b1e512a90bd02c94c1b2570f24bd03a58bb0ee8b464eebde5a140773d6634ab9ffe56af9650bfdda1451b54c7426806ed4ac0e8c5f95320b958b2ce6ecf06a64c026ed95c1422f027e36276429424e647686a355e3c12644e4d9711591150a9021d367e77ead71edbe9f0440201ccb93993d4e57c4f26cea2a8fab6d4c312e79b8e550996f521861101589a3585a86412c29c907539557ee6204508ead9e58640ee66a5112db290a268b03c46a1cc6051268c6627222f90adb60babd15006daa51248c441f9445b5d141ce1d098589530beca58938882941d15f9b60cbb41a33d69bd765138829e298a6efa372ae3af1891e146313fd7a9a83be82c2855a473ed21cb589a588d4f4dedf47cc2b5de51851e0e36ed1f95b7395b69c0b3d6773585c16a763be287f3691485a13ff59594aa840f10d1c530f2fa5ae34ab9c7b81c82a05e05ad32d02f433147fc182c4587e6eda5321997b38ab19b57752d15acbd52ad540b99a6a4a9209101c8137063ebfc99c3b8138778b41cfeb891c0c530643440514fa9167ec9f75e9ce415b1d35d6ba698afdececa58e912d7e97538d3a1713ad7e78ea0d1da0e19bc712530e0ecd207bf83fa0f0c2225a0336d155800aee6cd4fb05ca63c45c518cd2a7d93db9ddfda686b0cb96f0195324a50179cb345b99071adf3fd343960a8bef1d435c3d27c8fd7a001a195fc8f037805880cd2e5107262a94a875e180fe20e83aff74a0780ef8a703c45b8ad2fe7710114a091075ff3b8c38a51d562407fdd701222971b812b35f2686d83415bbd0a263b801176c6f47dfbf0bf82fe921821087f7a2b4c38b089ff90b156578d10d6dbec1c0d6e791d61620a08856e01c2fd07b05ad683d79619ce5bbf32b7dcde83a1c7212c18811276225793ceb410b0ca034c28bb54168cfb860805a8b0d58d74b08d74873ed62e668742d1a8131b3a4793107b9fbe90bd1c24e1455e74d8e79fd75acc3b0bb3454d42456500c58411fd82ae8c7c8d3f828b82dced534425241fef47d8b917eaebea0571962621e8609de09931c94a4160d2d34da3d3e8de549cacc6b4435790f7350845df1f867941c8fc38b3ad428f4f5b6a20d8a62fcc00fd4715a2d70051814ca09f909761bdd2b602e0aad55958655ec14a10c1b4c9ebed7211ae67c623229286094b178588609beeee7374134aaabe8453fec55119492cbfae70c35bdf1e95a6d978edca5074b32001f2c826d244e0d5c2616943e38953a8352d4ada0b1d9bd4deb58f3a115a3a42a0daaa8a842dcb4611c6f0e8cb074176aaa5cf698fbd8e46924051f1a70214fa7a2598cedfca58475e043142076b09ac55be6b2cf8ef5d26491991fd62459e82e91bcdd3b0652e66d4ba0d112b30e0a40a35c584beb1ccf040f91978b6284f31056e90586c0f6344a7c44d29c27e20690bd0184c8f6bebfd35217d21e3dbaf48a787ba678303ff82b014f4cfe681472e6cf14492508abee13f2bd828f13d06432d6b7d40b325dc2e0fe1caf424c419e2123d5467f26c163c9c7f506fd15ad0a5df8acdfa032d2b91202afd36716ac2bf0c860390dced6496ba82cb3d96d7b426058a832eddf8eadebaa27a72b74d1258ca82693305a48dad85ad4057cf0a563e5ea6422aef260093cdc13e758276bb759592f1a23356305e62e9598c455a16a50e314e6a1a14695cc4509a472a47561c224d3fa9412d41b3252626dd09f387ad9ab80db3c20d52781e63b025448d342c80decc96789435e46304797aa794f3322bd22057674a378428d426d31a7057848a71e08a9b252a18ca81d268b84270c1c0a2e8596c5d579c87f402fd071b374f990b728d216feb08d6668f215563726e20d749d3c1c2c9aac9557ce22bc9f8b893122bac6988a14454ae0a5b3234e9690509f6a45a8f6509561e39f28527b3fda3b4607dc77de50758db9aaf16f5e643e5d1466fa2999b442f93182c81b3d27d3794d0fff30a4c37ba520a65d187d091621660e6977d63d00208264afff6008d4a8141c49e431000826f96f3087ba54fb15f6a9775ceb8556a90c78f5eb50219ee5e8913c509992a88332e539389c3868bf385afcbdf08e6e41b9158fde80ea963c32401364cbd991c57c0ff6e088da4807519fffb90e6d0b9b987544419a2e02ee1c5c47d9f8b23a934779fc1a365b1a8864fff36231c9b503793cd023b3709074e390c01a2c1b7d51a54a20e25bb4d66cfb72c6631ccd2ea434a254ba6f9b92bae94630679fd02fde144e286b8f8a4362d1029d3e2fb80a073a369e6f4edb3d49731f69d406bf0e74a054911580d7cb450938da8be3016f938f40ac1acff20138e6a3847b1661892619439d792fa596596d8a868536a5e15464ef31dbe43d14a06de6ab4fef60444c7c84b7d0ba4d0e9533269b42ffe59718253d0e4fb0f0a0cdc97529c500f18502f32eb337c1df606a4801b6a8450ddceead9174432b8660ca80b8e230d566a8fe0ae6d9ea790dd0b67562ffae975d6828ad7d2581d88e136f630035bf30685b12e8a0026cf5942ab3104bd152582fd702e2f810a70705b6718f2fa755e5a593b3236f2c926ce6bc580471fc20e183a62d77025f13a88c5e8c2b87bcdde0c96900ab0db29403cba483295f5374fb4558b286bf5b4b6e9afb4d75d8d659fe2e34bcb6d06900000f92f079d87bc739181b9ee5bdaee1796ff41281feb5adc2bfb639f4321c4bacfdb6c017c6b121097f9927b3acbd24403a61e7603e06b494e060040695706d8307083bcd27a6c4c4c9ecb4097e485eea22ff57182cf1fbdc0d464eaf5ea204470a8451b21418733176d3352583962a4ec5520139408008e1d5c6d1e21a309efdebc37d147e07d24f31ea6794cc4917eda9fc4b084b272c0ec475a87e0bd1d35a975154640ece35e87f49491cbf62a46abbc9d9e4bb625075c801b916edff7421159a5dc4552bbd0d5ddd8bf9ec6b8c9e7f58b5d0ab3f78b28b01d748c85dbb5e9ffba1fd3c235e1783043ae577d6463b48f9a473b89ae3815c44850eedbd60734652fe8c002031d97eb1b4f6ced16bf1f39803c92ab9cd729e86fae3b1e64e1209fd33def8e40fa00c49141ca19f4df2af72889d1e008b79907ca44ef36d96a27fbdb61e0ae8df7733745602f0341a12bc5ed08b581199ec6b42cb086d0a1420676877f36cfafabc739bb8ebcd81530217360ea7b0914291976c1ccb2a655c8cea526306408ad86c664cf9c216cec0e2e9cc832dbb48126550912eec17dbabe10603b196275442db8a93e67ce9b068b82eaa1ea9b41e3f0d89e9c61781287c01f737227abd046605f052fe14561d12131bbef4378d447c695afa872c8b7e91314786f76466331b32cb8058b4d2536bcac6372699a54af96f55891db6dbd98b157ae02acbbcf13f3beef970e8de76a09dca64d771c86a5a35f4004a017199ca347411f9b807fa0cd449b38be75392aa10a8584994c40f2374fc7f8edbd5a521188fc39f2b06705851b3f8259133e023469f8054882b0221a6364f0a32c788038bfeafa5b60b800cfe52017f9eeea5cd2c0fb7b9be03f345e1b5cd805da071d2212c8d016a51aac2f9d488e60c0297282ee94c1bec64e9cc5998355b2e7bbd0080a8b20168e18355180b4b993ededbe2838c8005744629f61338f42e55bc62b2b76afc506d9d141dd5c11e28de96df07820fd71d9e7dd17344a6656eaf195d87b322c400b71f21b644ad9addca562646fd0eb81a844ff85b6c4866345084b97da123d0e635ff1f7da206c5240b0247147b4791580bfb7dea1a7d0503cf7785303cd5aab978f73b0dde8ca07c20252d0d932f34545fe6989098c35b8675d80f2a31bde1a78676c1575c9e6fdc06f813816716c4053a216313d14f21a0122355627edca002935b8f98109b773b9e44bdc47c0a9d351931f970680a50d4465314a74898dc7cee86a8abb485e36f46f6f8c00d9f1e9992d41c9667d876ae4f5a507f148c190c2da0a8dba2aa9f5efb714f4b930d6d26943d3636015e38ba69dc1b50720c227996b08e0aafc2fa74387e5e50eaf7f982aa52c29173476643631dddf7e6bf9d3882a87862b8aa7445be78713ca1d8e7f8c515c2b7a3b8dafe008a2c0e065d60b4858e0ae893792ba1b03e78d25fcd046cc7277472ab5a2153cb911c6400a5e1dbbadaf4692bf5e1883811be39f8c20a529bae67b53b4c3a9a0059809840fd43a4b7eadd6041a4355d8522558988c442fc8a67b72a6c5419a5f7a01ed7e0a37dd52fbdb6d44d4f26a90ff9251aa3d8fbdd99efb265544ef75e22c82e9c8d7a7e8fd221060243fdd989a5311994bd1fc475b0121b0543e9fe370573873d9593a299c1677456a634462986cab6094a88660d0b3f6f851262d2fe917c1fd48b32d86a452f9cf8fff0699809a5683f4be099bb84e080b100c1fb402067025827110f97588b0398b946090db799e198bc625f593e24a29f25387fb051514935b40ca5709fecf4f8b378040bfd80170c323402dc8c1a1627dbe18f66cb110a602578899bed47ce7113d265e27936b6ff988a679be48168cba4c731a56831b08a23ce05d2d8b3ca830ec855f90966f005573b014c5e78fdaa29371a405ef829fadecac8f467820b911eb000ffb9dafc6d1130bfbfdb87a68308eaee4362ea406662a3ab17c1d0349d1589b4554d0760faaf39b2493914097d34a5b4a2472f31852cf1b14dcc4062a3d312552d1d4805114015096b41ef4d680be8295999c489ded77f4e24aa9fc821c19cae872f1a2cef2682ef5f356c8a41d6227707e223c70a52a302d25e57e15aa2f9115ca2fa4afde266e152ad380afb43c305bb5318d7880b008c0926b3f4be08fff29fb497ae5692f0100060b2a68b4ca4c9088fcb38e6ade7b7a08b2990d4abb7c2b55c8c27e8505caae0b03bfc743313e7c2438805f7b2f8a80c9105eb4615e4940ae0d38c3e4b7547c3c035971e4d34adbfe8fb97473ed66fd46e156cbfd1146c4c6e226df4ce6ef0ced90fb008290de50c1044b0aad098d547c8136542263e64e624d2757bf648b083c0681d224e169ce5a4ee72681c34306d30b4ba7089b7dc925b7797b02c6b60050a37629039162f31f70b77dea20a827793d7ac423c42ea5a034692d1983e4a1c9c1b825e2cde4c2ec832afe1a0073d5882d60c50f5b73dc24803683815a816a852bfda6351c919ccd152ab685fd968e1c22eca9e11f71a99d1e35169101ef49bbe3ca60a7c046531d4c3fc342b9de532ca74729329a73049e75cba48033ded12bb004fcd07f56402b7cea2b782df4e20be026471ea9a31c2abf555eae6fdd3895731bcb0beb9956902906538cadbe3f25d94ad61c11499c08a9ecad3be864bb90fd4529ffead4722040473ce9c7942bbab0f49ca22f5a3e012203234b07a0c60f25a074dcf070a3b669036b8a2862d29cce24495ac7192725c7aa2625e0f0647a494960c5fe66055aa800526d91c9612259a40041d784cb6a87a5e3ccab2429fa8f01e12421366de575b3374a0d62c7a68494fe1795087948a965178ac89cde0aca2219035115893f7c17f150aa7b14c672c08749f918f12ec0b6a885f1c8104a1db8263165f79a66b3a41ee0a34529bc9eabf6a79b0615085460adffe4409550e40aa846a9dc5838bb145cc8b3e0373ae58fd1983860842cdab2a2818ca47ea5bdd8fe62c641221711c44638cbe84a7f1acdcacc5fdfa31b1d60551a99473df5d0f00c8c29580d326bca1cf872b84bb585caeda197b8aff86320a96c5ebec7042f260a6e27677afb05509b83b6f61058f0ff9b81b5e3b7027cfb8042c1b70b75adeb2712f2eebb9b1e2688231965d05032e40ef7d28ab97e4c2f4315890d27cefc236ea1ee48ea7c7f9c6b0fc7283871b0a16c0e3206720eee9cd9e735d7049bb1aeb208db1d8c1b4b34d64ba41ff8693915b496f9b0c27a63a24833af554bc9c1da244c0f047b179cc85a4fbb9092e7d014abcdbd86842161f0d46308d305d296a1d46de9d1552535c8ddff8df183beefd1cfbd1bd694c8d28acbab657bf52d246372a0c87b7a2bbb9cc02c4b84562ab9040d0f597fc2f556e7dc72155cc82c17996c57d3de12b06b05ec47e9da9ea3c10344956d8465030fc3d4e4232df8d6d64f4d99ea490562c84178c49b945c69c8e51c3859e32cbfc8ed9bcc6eb71e6b10db46a9324457229e5014df1af0e3bdc05a9c733703d1b6907c5b265ecadb7618c3415113b04c65534b15f434e1181eb2aaf62923b27429dc92766292e14e95e78691fe92e712ef341d71340f71e6cb192c85ea3371185271bf45ee57306cf0edbe2b83afc4baf235f2344b4e742088d9708b710d1b15c8c388c3427b10a2178a20bd413677c2a14e6dff51b54b804c52a24de5811633430ce7d292faaf6e47dccee29dba9677986ce58451a7d5fcce5872267625972128eec6e60186bfb69992164f2e5a91759109277b8c8e795d99537f463be852e2a9f19f59845b803a67fc16309adb3ddfb835a8cf2bfa1f6527dde6a7b33a42108459b255b6b1855a5ff057fe993d0d2028f9c2016b900bb0b52758a62a57dcb477f4faad8b26918895b33f49f9d776ea94d0952c360658835fc64d942d3f5887ea09906fa702e479548374dcffc780aacb31483234f2a482d4f870860b9ffdadd0e0a1a0c9d9250bce70339b7219a7247db1fee6eaccb853798cb4ab4f278697b2286473eb916b9dc3a4f880792346f307b605ba870a9d44385081d410625da6ba2f598c53388c54942ee2f0206a731aac2efbe65833e1fbdeaf7134e660b21f1d85c1ede0c1a93593fa4a9909146878c838f6902fe8d8ff43b16655f51200c0371678ae8e12b615a6f4aaa3b9f98a9fe4466b186b820d05b773aed7d9ee6f0b7f45d16e0e3f55ba7d88e3c52911fcf1a689f2c1ebe3f0bd5be33c9600c5dc8b67c234886d739e671ed8f71f0a6e0a37236230f45d993c4f88f8f631f964d11c5bfd3a7ed688bdaef416d13c71cbcd87c7f80ed357846cc7f1a7546d8a09e306598e87b15616a3cf13568c79e859884119c45f285e25ef7bc46485473894a2338fe26344510d5a5bba8f8982df81bebae09aa38cbf2b57783c7fc0608ab6988d437946e9c4ae8bf1790aaa82aee8b21f8351313df90045b809e34c0b48dc72499b0a3aec6ca8ea9d4594df7678975d80ccac5241569f01f7bc708f0321009ff9b93a0cdd511770ae088ed26e48bf3422fc753b6dca785bfe61d9de957dfbc1dc6a2c5346f5f943ca35a05e7db028ca3b58d979640b0f6489585243c432b803df2e23686ba91515adfc685f33b7622cc210e7e9d37b10cad945982668115901dfc06ab3a5570b3977579e5cf4c19825c3632ea9a0922ef74b5937a7cc04a27a50e659d0a658eb8e7167f7da9694066d15a5859acdfdf6463e7396d1dd05bbdece5d320ae2564ee5fd8b8dfca48bd2f15c28fbd4ba64b3cf781536ab325c6c52530b7611de849d9329ce54d45e437e07d817838c562eed1e70f3bc95bdcb7bd356abd6c394907d070c9aa52692f42d4b054d2775c6423b38f30e8c2c7cbebb1c608aa6f67fb1a8200e75e8aa11eef42f784f2a4a2664cf7c9248d311a440556f18cd236a271e1630f9fd8ec294bc7b19638119f8299d160dee84f62ea2fd6455641a25fd8114b18a19e6bc731c97f74b2324706916a86f205f5e98a32dec4fe9c50dbe7167af54f036865997a9f6680e64528e74037ea7dd6607a097711bfd333e1ee8d99f2faa8b7b91a9f2b8ce8b2d301a655e7ef377aefb2c4a496412169c4a8500d3b56995b39ae36dd200d79d7f77d7705ea0d1ea2e666a963729e5e928cc65cc75e67e6829415c442c0be965853477f23d9921bd0a7aaa2f6bb918025b7bb7d1d598c451062fa54cba611428b696967878e2e307d413848e5e6c8ad635031d0b1facd69b76407a704d3c9f6dad3c0f6b383393d9f05a630d81bdda9720f327df1f32430cfde3f542d5ae1f2a5088c3d6d0c065d48936921e30f56d357fab488c4d1b6ec9e9af2ed79928b1ef14cd40874f06b652a4d289dc2e5e9f46365e20f08bf2e57a04287cd1d8417b3ad2dd43510bf3ba881cb86c28f69af147741e91ad42aaf25ea536577e462758e89e58a23205f7f0f3dcf845e2863494f72f79aae0254a58553b82f3214e64718bfcbd5b731861a6496d0eb6285faf7d26cd3a4951fd503f950f6c3de37c5affed2c3e8e4b8b0681628e76f59754daa5cffd6a4fe7f35df71af3daa4cff79ffcb179a02202331657cfdfa3773720e2dd25ac7df72e96cffb546fd7d84307fb7928e00fefdb4907d42667dab7ffaeff4f9b66cf99cf8f8c935f87788f7273bf73d851bb081ed79592d2d5738c7833df6613d3f494b8a927a58e1cc8ddc214d3fcd428f4a9e070999cf1dd9819b2a7fa6a201f44e1e276b608e956904613c3c715788670ade36ab089f4c060fa57f477978e8dec2e0cef1be7d9aad1d4dc80e0ac59eb3747d0360fdfce460bb9ef1863aefd30547ba61a2eb827ef8eb20551d1ad2994c69792667277b1d5b98abb74338a6ea9fa742a4aa9d104915cfa60a5957096b4e1a2e5725ec37ac38ff2910b3fb2ccc0a1764dc7db14e6887ace3f1273c64d655e20ab2dffb8296af0c30ecbffe21db4ffb01bdbf1b56ae369a4b3fb54cc58971af93619363d1d80ac90dae02d89ec29baaf7d7e3f8d6efd09b86277c7ec7f182f71b9ef7926f42037c99c18e87e191f32f058eaeceb0a2d12774ff63ced2f79f96f595cd61221ed8c84d626138ca3f4f9e5659b44133bc86eac7e4b1eaadb3cc138e455b2ac80ffef178faed7726181ebe3bd566873ede79389e860ccf8462e548b269a18734d3b94a5dc68f8143d07f9ed729dc6e673df1a04844cf14b3038b3cb219748f13e30b4c8507a796743be78ca4582aa4e71dc05f2e709ee4f2109f235bed803c3f6b1b3da2f8129134a127482ec7e4359e87849f6c8e9f8c9137c921da812e913fb57d9e0bc7d32b296b7e6de593e648178b74c5cc30429e07df856c2bdb876879a5e36bdfee43b02db721d857f72c2cd6c58ceddd3d0bb6ed3204fb7219e2d5be1b81b5b833f8bdc7e03711e894d37099e5905ba91b315017eb002efa458cd49d3d030b7d21036a679de045f9dd88fb691cbd48775b1e7ccb6619804dbf9011b5b06660a1eec488dafb03815f2a1ed4185ad48b18a88b7d00376d0c0aa5606d15b624e0603114c28da307a277ae3b0143ae4004a29fd7dd9a447e4ced4a4a6aaf3351636ebbbcd15108a08880b6cd30110828525173000e79c09b17884e273a31902622c80ba8893c5de054424e29f89568c6a0eb57e62ab769c3a60ddbb66ddbb66ddb465b5b6d6cb4b1ddc6461bdb6ddab66dd3864d1bb6b5393252ce8c4e220e7183db134f720e7352ecde8a9d03857a0453c9005339158dc2a11ab9cd4604d0c62f274b42b251f375a3a1e28be83d5c64507a11c3bb22da990d0cfd15110e5188646e2322a97b08d35c87240745448e54083fa3bebcd20a01f38a907d164b1cbb95006e45d2baf476de669c0e3e269c919c56c71b5120c1d362c16fecff88ed665a929a3f32401146de72ddbe7c8caf68c9a49ae4a1a43622a6c04a69d9c7b550ea70cc54e5a3561bdb94602ac6e4d6380de3182eee872416ed03a10a4058823217733fe492cc790d7aac68b8b548d691a09e696f85910a44689c622e4e263047bcea5fb48e7b4e46e6f323e4df36b35ebe6adb59b9be562927be0044e178fd32d5228fe989adc53e88e29c3281f5ee31eed32ff4257828805412f5491ca3e891e1858755e10adf7d922c3983fbe4f5ab1886851e63402df3e90b854729d6b3662df839274f0f2504355daa01d163049658a37416586709f839a7a7444916b0660df839e7a74789acb0ca02c813e74f0da50665baaa395163039658446996b06409e829a7a7474996b06609f833e74f4589acb0c80ac813e74f05a50a3abaa83111c500f658444956b06405f8093a79b57ddaa7e51648f6bae69aeefa165d8e7cfec2a7dc7aad7711b0f2333ee2d0dc442addc294dc890bc5656ea8ab070d967aca61103766a3ffa95d52c865832337aa5b6ec43f9faab0bbd1240a444cbd182149b5d77ebd8348f9f84b63ccc49b68e91d5a6c5d984023bc4ca107bba2abd8a9658e350bb83780b2d60bffbfa00a4648181515636b0c14a3646895b184a864a398b15371d532bc9a011d7d46195e5368ddd751892f131ac6cace88f06e866219c7e8f198aeeb5c63ac2e06a7e7eb2f8591eb5f05463025fc0b9486592f2cd3c50a5c60d216b6d162972c108f85f55cb18c1518a8c29aa858660a8c4861fd28960305469ed0c2e6c46a714c13695d1c13fb0e8be47a899ced4aa8319fc4304840e588ce1b319d22e0424423861893109009a223408cff03e4f8d0911ec6e0019276e8880ee339401f0e2dc7b81ba6cb3738eaf90d46eacfd632f41407ab2828690bbb1b1149f7b2897087d84478000089faa8af271df5f21fffacaf8405f1e99ec0be1077d79102054729d0dc3152a0895590341f1e1a29b53fab7d1c196cf59efe90564b4bc9b4b1b593502c58fa63f387323f7fe8edb7b8e1a12ffb5572341e45c3dc9f3b7f651b539f845709e44eb42164376ec078bff67bfb6df9a8f50dafff610df823230c9ea2b14877ae68c3ee2493746f9b2328df26a892a4dcfd70088d6b55066610efa7343bd0a3d794d26f6708ea75a4cf3d7c1ffe2120e4cdb7a1d6067e1897f9ab6a70bf77fccdb8abef5f5ccd7d9363e7c4446f63c3bf3c93f8916db49295d2bb289ca1abbdfa52365e2bddde4841b189a9660a89079eedd4f8c25652b185fdf8597c4c6a5170ce83826c460bdf71e067090529404305027b0580b21e3203c55e3731593c27059e29de94492c87c802af3c9d8210c9589e173254fea0ff45a27d026f0596ca52f19574fd6b98aaada1d2bb777909d87d77f236024a4ea78140e92e8ff25292086e2aa2e4b59815ca0d234ea0bb11725e943e06a2debdc6b39e7c2e891bcc0ecb50ea88af21b1155384d6fbd32c8242143f96f02ca8c025933798c3258f78d7a0238e8927a23c4ffd623dbead0328aa496e60209c96e4004f9bbd62a644f524962b4c3f8c2c146cd4360983d960812184780243075c178a05a21a2fa306ac4200bf4e9f4fd4b9e9da1549af795ca76a646eadef8a0f67aa9bdb47141da24ce72375527401f727a7753b7d5ab6d765d111a8a27654f501da802e4d3a64b473129846d5fdb21d7757cb0fb01545f323259718b7360e8dbfe2f710c3d3788a103399d3c3b13f4a7fcca64d646fd5c64c98b5d19e9a515e0dd1818bd6fada374bd27fcbe222ebeaffe20d6d648e69e68dfa73d34054d090f66901040d6ecc8a22f5c96e55df670aadf519d89c003554fd0e81b693676119d6219b07388fee01e7c525df6ca9e9ae7651e6b0cd6af518d854b90ef7f26667ccbc2a519c1b53444c2acdd3d48c69a8a69f837bb4c7303133336fcb4cc7f411992c5fc5d458e21eae294b267273d420ad80211e2bbbe4811c902df10401e80403dc288790a22db073d2e194924b421712ee2d0411559380c249383cc39786292eed631d302068ceef15aa2e46719668f9b72922003f722d4f0735199f5d7dd24660ed7e55db7add9263142ce972795a4b9a5187e401738242229e17f6db823d3c1a89c693e6021c651c9456c6833008c59bad6e315007f8f8a9f5fb82db78dedbc50a3d044ce15530dc4662639c331fea70db560db13cea0746e11e7e11c054cda2d5aa1d6a9184d4d6e33577c045c75bd5964ae8379dc4e2de061d5e777067062cd01cb639af3cb22c24d286dd44083a22edc8cd9757ad200b428fa147d14bf1d0eb705fc38c5a3669641e798e1f14f51661d9add2ce5f76144dc5940672e4952666312e113301f746203e8da65ed1e163ed274216975a0429fd6bfc3d962ec92166183431443dcd0a9226755170110b4040d026d0e44e4320ce884370ef40bb27d41bc271a1f81d87587069108db43ebf51c71b26ed2f4ebcf50e2ce2fef41e7f65a0619b79fe3548f0f3dc0871f6702aaf18ac99157129057fc73aa2291a4b39152e4cc2cd776322ae879b1b818ee744609288a3a8b5727a56d3a14e426eb699442b4fe5cba17eaed5cb8bd0a6d8f7e239ad467b17840a9468034b4224d0a39171710b4e8746b67081bfdac2021718456fd86194761beee04b4bf871b4a515e8dae50b7b260b0cbf6ea63e2b2f928df3bb5ce145152813d6e50020b48884170325174f4c8d8590695d2d04c8ed5919fb0e7740f3f397986556e15bff087279b3271a28ed71468d41af42b83a10ba4a21c3b6b748efd1f2c7fb675e61be10dbc7f04cd1c877f7e5ab2d3ce608d72744dd29752cb6458c8852272703760c8610e0786e6aeec62018b00e0abe95cf3c8a52aa74f1122d77e80b312c434ee4f4128fdd376f62ecf8134f3909e6621d31c0b18647e0f282b8d8f588bca7458880221101a4ecc599e5a3806de5d514825238c7e5518559339b8704bf9dccb11770b0daa24a75fc180c26e386a23d5b202439cc5fc3a6d498c332a2864a23c5329ee32893288dbcbc1032a78d9aedaaea50574a48892ff9e4638d7b240002f014e1bc738778019823b7d81283cee9ed3891da121c8f1ed895383ecb3397501ccddaa621e26b69e20f641691979a0b0aa6e038f3843998d6f772c48efa8d714e00a18e7a5a833f794281b6fb1ac341c264ff3bcf1a117a8b8a3bc2f6352b8bbba5010324490f2a28738f14da9fe28569cb20ea2c21a2fb631cd10996f6d5f513282252448a6891802944478a3a34a06630d4e72e634e72b91a7e1094b4322e87972af5d98e808e41c946df3fc3017f4a4d2ff3afd3c3d16a635f9d41d57ceded602e8535fa784d8867e04b83eda182661cb761efd7c5173431fd05bdb215c73a0d58bb5736986e46db3eb4b3cbc4d52acfe3663250bc2320bb90548c9fb74b6d985af9b8ec021515fd8c1fadfa2d7979474b6083892b0671c506a2e9b7212ddfcba19c73a8898e31f975af95ca007ead1dc654fe7875903cfcdc94def9eefe33ca095ed907255ad4314f9d67cec107ea8c9722070c65ebaf9c875b87a2a24797cb6008818248ed0d866433275986a90de14c20102645f2ff4a80ac238ee1fc5e7a72edb78ce1e6cf1d4c6c25677f7a57979f952bd818764ed02ebad11ae969d6d30601e8c98473814a3512043da340d748faca7299441cdb3ed8e1f969877da403e04ce6aea48fb1c9aaa5822952b69bf6849e9aee23f48787f3a55bf3ab83971f5d00c8e29115baaf0b859bf27781bd7a9abfcb288befd4df04cb295be8be30b396bc18721c2ecd61e6ea789ae42cc48b6ff792ff4376cbea6f991fe15902d8152341508ce6e904a2ffc48f0ef74c3b1772ead43c7ee3bbe36c284e5e233b9c22d44a823999ef8dc704cee7a8be649ada3b89b8066e7adb44afd64dc87a91227ba33a32d2786458a3465d319cf7bf51486ba4b375a42772b46e8f987531dd04d2f7704ee086a4808851969114843aec1899062bcc8b1e135a2e0b09ed3620f98570d03db354549618647e2eedd2892fd409d47ff78444b3403611287f5ce9a804872ae95057a5861a41f573c83370a80f05b08eddd44459224814f590220d3f13615da13969b487faf8fbbeac4d5c165dfa878054a321f3f6978eea2e7c16e43e20cd971b8a02a9aca088ee970e9c124e5db3f747dd866c23d963bc267d7a8ac344c76162c1890f5997245af9686470bf3bf447f128238246d4e5da7468be2d205d984507e9c85a097a4b1cb11a83e48fc3354208b5e905fd1cf476fb0a0933191b1b1a6ac0ad424f193f141a75449a0c26520714e98e96caa8141956073658efc811ca3f1901be4545f185478a6f53517cf211dbaf1f35be01e9f55d90427ec3b8937248aaa2446242b748ed01fdf9fad695d0b7fa683ed857e4bd85453fc43cdcde4dfce06917a76c5267d1f6d29cf808ba0fe0d48cf97a3e0b425bee8f0dafca98afe563b5e002a8a97d153bd320dc61fbaf9cc0e03ad37e96da219cda3a4ec42eaa1336a3fa030fef29762482d49277f8f86989c5a1384054bf23e5a16f02d05ed9840266ee8f921e9dbe32ddc01f216d106dec897db0c41e3eea8c4e5ea0cab0de76e88de40f4a1746abeb1e4148736d10634f9caa572bcdbf1314856ecc79b69c5f8994096c8c3bf62a0010929af66d4fffa7d47935c4e8307530dcdf64edb5e7e2774f75468c8e641601c2bee7ba86f728c967304e6fd496d15110102f1634c590bc45d4647af4d045634cdb9a6b2579e3722afc4b4459d61f67d986b647135b69f359385d10a19682424be3b571a10db32c39361c54fd59ea92bfb663dadf44db6055a5fa0ff9ec0434d8abad870cbba5026d851719a5064068a9d7866023ec8a04ffae3c8177bddbc4308f74ee642d031bbe330b02b5feb215166680a145c133ad8a4d3464fc7556dd03518c6745ee2e67f8cb481c876f358d68232a53523f7cf85b31e8760b2cd0f3c0f6445656aa9707da97965cae103f29367a86de8d0e616f4a43e26acf55491cdfcc1ce799d3fca8c7c03d8606c72e8cb36eda98ab7acccd62276d41d481a9428e676d3834215eff11edcdfe1fef7a238c50beed3e734d371459105f906ebd0dbac43acce95dfec65619886b8100bd4a77230688000f3b6a87d00bc1d86a5c657b24bf8311420195e5c3c6d42184531fc01f84b78d9d0bb628aeb5b73461ebd2c0782cba5f00e00feaadd1f89d294a23c8a49d13c157615d45370049c31add5852e221f5957e41dc91c9516a23ce353a81e06ae57841aa6db064f134d7a780d9e25ac3ca3cd9c3d5be6cede3ae7f82439552aec2773bdbd7dff71bf8c6c7666a03da5c612160bf9c05a6b866be15b4525898b3241478d0ce4b1722b9a6cb026b2e99b174445b83e3ef5a60c143741639078b4efb16aee58611cf969d08fa7049ed1c1470ccf054a2bfa31194a21a4097b4763f0801bffb66f3f850a6662a525be3eb5f42fc01cb0f0a4769ab3a8e4bfd56fdec590af6cdeae6fa2c27af5bbed545ed657d0564bee74b07c1868d51b82566393432365bf7c2c2fdf3a75e874dfe5b61577e10ce7a14eef44529f99aa4d9a7b5691d961a212c8eb1c62fe5d3734f47eb5f8423069d37081bd0e16d777d86ee0396c515cc8c4eb9cf6f4c10e5c817646cd6a6d9844b96694123a07147bd3a8cfc943aa14561730a3bf013e8d3c0e624dab18f43e6b3c25538f3dfe4a0296e90910a905dd65ad388555357f4b2d9289a3b95042486c214970a9c8aea86c3016e72fcf966f8a9d9435ae6dabb65111de2977f9f1f762768be464a18e78aaefebe21d471b105b01490f04e69e8073910ef5f2c7ff304dd2966637de462acf4392b7703c3313795d7d2f505b3fc255d52cf8df8bbd9a20e6e1df723e74da01f96fd0666489291ba244accf0a7a8ff9293a8af63f0f199e5f8c74ddf667aba50eb2c7a9992b89b080c1a2b7b0090f92003903ddebd56d41a49ab29b0a7e734ca1bc8624590c9561264d2cc211ed5b8597cc5fefbdc86961dbf974c42bf08e1389abdd995c882be96d9311bad2a4c328bde2946f8f461a98882eade45b3791b42ed8894fd73720c5d74ff2e31057d2db36366ba322049cc032862cb0e45abf8e31237876e45307616598f0262f455a08fe834473aadb3b5720e6e34bbcf17637cadf5c4c61724e738d4d388d2d3be64b85a931b8bb0c6965e5f9fad2f37b9bde9ce1bbd02d8aa36ed0cb54ecbd2638aa4ada8446b9ddf79b662dcfed9cd3a1eccf33788cbedb65533bf7eb5b3525e0c34595ea939a415fac5d8fb60a4a49198bd71e0ac15ff4ab3441572dbeb37090e5b528e97194d33e04023ad692270a0c3c0016f6726e78f1a35e606c4f475bccd37c002998ac9ecd68d7eb961facb9fc137ddfbecb2baf16bb41af1e3a1f74a618dcd06b5c08524e6229f4c75955967dc396e403a688cb9c2cec219f7d07103136f1a3f395cb1871ed079340bd26cc56f0281d58581dce73603e4d153881436aae9a35b6992acb7e91535d88f634ac5dd424de3d8416fb7b50dff24127feeb7e73e3b4df75091c8c60033b719cd06dae80f2a02990070703fd15a04d150958c3f391932922523594c6882ec64924d3659012d0afbb3122b3cee2b8da9e58f59886832f790e2f30489ffe009810edaa18756e80f8919b4a1e6e3c48bcdad1b57c21e3fc659c940cd4193983689694b5dbc88fa431516000f36e619e3b1ebee23ba45a99049649ff30bbf116bd008bd009e80f7733f8177526adba8852e4c24b3ec32ca2c8b4c3a586f9df5d65b338133a62d2508c1d412fdfcf22c671782c972a621426542b7f37e36c319eed99722850083c09da047f7344c07c029983a91e93fb8e2822b719a7f62104d96816c19c81668afe82d9a44112998edf0f5c7db1f560dadebcf0fbe12575c71c411c7419f2034a1097d68c52821294862f27ce396e3297a9ede1d322a63832ebdf15862817dc004a0360a631e7e627193d14f5da757d332fc9930719932952953d9d82d4afba9c00bc6fdd262353c5e808cb7b79758a7bb9689a0073a68800e0281e5483827a368a4a4c2419633bd344a94fdf994a63f1d4e0bfb46f9f5ffdef5fe2e8e2100f8bf6318405510e434449629cecbf923af128f4a069964904936a6205f1292879eb01a0985b84a7807b48d98cfca8f46dad35bfcf386764e8da30e483d888231dfe563fb39f61aeb2701e669a263c8a9c5024a69b56b9a73161bd98f205d0985aaaef16462e8830e9aa083a8e2ca96d3f2ada26832ddef9e2fb3ae003f89c075f5b41414533288ba940b6c5265ca94664bd05026f9054c071e36a8d0af1d3cc4021e25fdcee1be436cef7cfc85f61b89a71d050c476278a2c67dff2a7ac90ff8f505f71cf7200aa2b92d1c3ee9fb1312388890614b68855798177e642bc8f0f0c293a0feec380f4367997e4a6801fc227bf8a0d713473ded0959b1cc88b11509e30485bd3fe2c4a1642e4ee84085838952880674a37cdd973b265662ec2359e95720759fd84597823d608617d33e5c8c0d2287b1bb52f67fbde1f047e8627403408568a423b95a6e5734623424624c71141c943940018c76cc33de6f6261dabeff8a5375ab7b962dab741329d13afdca8af7b6d12bf600e10a4041b521706ea0376e67d37ffc67b6291b83928ae4cf42d479ebea0bf0d1c13dffd5930ca72face20928b925d64d0f1aca06c2a00785553e1113fd9e20c680527f522aa40927f2e36057c358a95ecbe865da3cd0c4b8c3ebae4ca012a83b9eb5c557f41694ae3a5240584b02fa8b87ceacdf582a1f165cc7c32df97159e7bc8163fb36a455133772036ab7dfec05ed650bc5b2372da10b8fd6ec96e8801ea1aa487952771720db22140407d2ef27791316b4f597e2632a9a8a334a8d698fc91e9ec7d12c6ef82c4afdbe924e6345766c294b80e463c7dfc24219bd284395023db92f9d51184e8c2c7fec93206cdc506589b09d7ceb94b87ed04bbc15377e5056e1dc93344fce31eb882c0c25b00550d19438ea59b409c8a7d3470ed329259b149ccc1e4e60958be541c120610de8bd0cebc80dbe8f7119f788fb5bbf4ceee9353b09b3fc99bf93984a925fbe7ffb7e49198a5ecfad0b8b1c48a84b98b979250940c72ea1c610672688fbc4719c3fe0470861e0d65e3b206f7b8b09074ec318779ccfc5f8bee8549edd5e369cd1dcc579a63b45ad4b87169d01d7b1d1e9486fd8f4919eb4c3fe2e61f7f2e82c11b28271293a499a09c97bc95e77d0b09e49b3c4192619b9eea139cf5b28719497ed02a79d08f3b91dfda3e7630679ebe5054e53bd359df6032f2dfc2bb66902d23359c3f64991c90c25cc11596419121f9714a2bee6209e20f2453780295bc939e5d0d8e652be93cb78aabc9d442123f3e7797ad2219787ec38bccee3ae60ff4598549331a27b1c2de206f1008741d822a6f64567545fc5a55a645c421d455f491cd5a8cb461f374b324ec99f8c49fb64f0179a27924607ab3fd176740e1c2e723ac864d1c3163d3477d3bab86cfdfe44ec471ae920de28cfcd669ce9a9d0d9209bd1dede74811bb9877d0e62abeb132021e4d254c57c0c04ef0d5ec2e2483b0b92cd78d8c9e224a4dd8134391fb303f524e4427555da42355281f7092f14d1531aa4ec1b3e7fc52a1fc19272b2add36d6fcdeda7c4b39a3569e62206d2a6ab512c907891e0511230d6eb906059d3ad69c5cdaca2dde57e9ac2a6d085523180d5976f606b290917983ad8ab76e66a911bedc4513a6b05203e8b1165eb2244380de2076d62e5deb3249358986a8340df70dd2ced42ac6101f1c2ce1dd1812878c49969b18c2c1d1b6c3793dd17df49dd0028723b30835f10c46edc2e8a28d0aeb4b52062597f0c4791642c9b14a54d9b02dba52f9bde591084b7d99fb28e0c9dbd0f057ae2a8e054b52f3b2ce4b0ee28215932a145322c8c02acec81e90b95bc129f093b4562f7c4e8038a0e62f150e4bdf206d69ba397eb9e7d7e741bd2c9f6e98ff3287edc50dc009343d0cb4f3722605f299a512de0d88931474dc3b51321fafed20ae08b1f9fe00e91485f82dd1df038922955b5f79d4c728e2350a2d0fe51ac67693288d2d16c65b55bd1509630da6e17e58fdd39d21392f71ee1704ef93ad09779de7204db4645c0f72308acc4174a0405cf970bd2e19563e664d74ecc7aa4bbd9d38a757f705eabafd31b46383927c7b4d7476ae66a82c3e945614e454ec28ec96f3f6a302266d3ea9886f1a30491df5c38301543e6d56bc1c116d7597a9bfbc2ae581872b02fc871b41b2276ace10c7eab149d69f5233727447860d61a9d4a3e9599ad5a758c8ed798af42b3b476a463766f72838af6a0df5fbbce75ba23f0e990b3f9c01b7db4514679119300645b7b14a1e634632fd5a06c8f505d3724d3795493a6af093b096935b5ae42b045302abb88d79fae2db9c895bdc5891d96e89c57cc1874b2c2cbc87cbd3d6f2576f90cd05208ef6b7de3a58a8b7db8bc905cebf873fe85250b726b5ef36e2ff404084974b8f0ca94e80e2cf1ff79fbce6f11ee5435006cfe8b5e86e18a137c4cc07f31f735f8c644c9f709cb59cca133902004da730224f6d4ba4738efcd135c0afe79b454f87acfc5f15308509b20c27f208a798de479e29386ad88789dcae3089ae66c20f2c8cb7e6ffc4f0e6eccce59f2808b8859a652f60664ac80b24a5e14190cce57792c8ae444d73ada96b16d2af4fe68255cbedd64e62da6c4d061beb2c0108a3426c155a58ff75a5411216ad54e256777ce9de2b63cea6d56041514560baac8736a0b72fa383b586e3305aa882c5d096342945859156e77348b9c8924cab303671979aa933d67952c0ea849814cfc0763dd48784800e2b7d3544f39f16a44e4dd98c86d6d5c8cb45737c132fb0c8f2370017c423066b28d3c7104d99bef8e9f180c1b52eb451957176d9ebb142e2de6a7734512cca7a75847c5db7a37ed87ca5399580f84179daf8ac8d68541e8c9cad341537a1e506a58429790f2169755d23b4dc66e90545a3488068e3b755aeaade448499b5e058246443bc3d329892528663d7acaf41d9a78c1af2b98bfe994f82a3bb2f820c56f489c6c5c423dd1393d39e2cf4fd04f728fe6bce7f2e57dbd66776642db67cc8f3c68cb0d4bcd955218a1d1d4f324ebd043c3cb6039bb1163bd2d73305804fa953c9e2816456197d4e3a835da0f736781167eb64c320fb389b71e937441c453052e0e95a278af4812e4877323c095e6195e75c656c83c3d1e877f94644eb4e1c29d5e2df51114ba7997932e18d170a9f5cd70f28067ccf425b4764b151c9a421b6b63ec52a15763aea7762f728c64e4a9c9847b9b0fcb757c4be283f3b8d152c5495c7a15b4c026dd02e8f0d2c7fa31315442b0f2b2857b05f82c504e766c306efd7d55528b83a4dcf5704f47c56628c06be41f936d6e2f2f8242cb2cdf91522e0cfa34cc9ed585799d00c12c41b7b4c8245206f986a3a32ae83a9ef0b0da8ab99145b1e5d084b9cc1ccfa29d763e3b10d2ae7e65441c831a29f8747a1c4974d36e0d1456360c58ea012564b9cf0f9f8250b684c9ce5fb3af9e0786568632a469b2d62c0c176b67cab16b0e7304e182226bb30deff1b087c062962c7c6e053a4306dca80be93710ac2d2c6d6d6bac799859aa75553ec60ec28528fd423097b475a22c0015c19bc926e2420b51713da4c7d888106a08f442ff6cf0835291feb3e0a544d8120dbd74656067b5c6e7e2f08d0932a2c560a36d85e82df72cf6e4ee0c4ec0a579f9f9111c79b56a6319b9a54d827b2153436a66394b4c3bb2ab2db7066f5ba582506a9d461b2d5d5cd9151e154187aae368919642cb2306512941927ed720e2174cf85acbc0690512cf44f024b4132b17c6af6514bf04ae637858857d1f757fd409712a0a1e1ff5416e3dacf04b6243e3d4e2f697c0f71f67ad8c07070c1b1364c6bd0e2d78c6e96edee1b7563ee4ce3b60104e656fbae535f0099fec404878cb9b1ee15e58c771d8f07059661883e7f56ff3bbd0aa7ee0ba04aa7e73cb7789205169f9182e2e9c590c87d03c0ad5ae1ecd77968e9a10401f0433116364e6c0e44d221f9698e4bac7d3f10750c1ef56de6278a77a08ff7892e701000125f25ec75d4867e489be6fc468236fd5aeee67eef80182ef292b1dc65817f79434472839ab04016ce85cf6a5619716c77cf00e5beea1108d4cab4870b77fc2b7258a81870a80e8478119c2c04e028b604efbaa6a7de8cc92d6c56b8c92b0446333413f84099207be48d780c91356a472e04d3e60c99408f8e10509e48572ec297b56d224dce4b3c68253f86363a8e21a3696fa2cd95ceaa4bfb4e46e91e55504caaf4f51bc7419cec362195f3d0496bac2e544e6b4493bfa899b713782459d80aa6f61fc41b35f3766b7f47689c4f5a7392fe15723b762a56b8b24710ad1c51cabd6a959f390cb7d8fcb0925860d840b59e3f72cb92291aaed80939a9880084597f6931165c19c678ac4f199d3eff06b3139a2b79360650410b9415bd855649d37fcd209e091a5428c789f8aa678cf52361f7386837551b19f8e9b03ddb5093a4f0047e60f8e5255d8700bbe52cff9c899f859e33312753a1a696fa980e8e8ee36d719b748e36f9cb81a198e52046ea1e3c3bc3c29e754c6ed8607238225b6d8c7314c1a42fa290ff112bcbb03ee7154b565197794a656c2b069c50314000a35908dbc75c4e5fe38968793782f57adfad8b92708015eaa97d6d68df65d7841859b741f45db6ebe4416eaa9927a2d7b0635a63f82bb05499a4683706809d510303252ee798dd78ccd73d77052928a3f06a104a968da974217567bfc349457c16333424fe41d97818c0bae32a902bac6fb596463d92b1d864eb4035ebf23bb9039b076fe94f5a6042de8e5968a350029beeed7b62066e1c52f2b0a26dac22cee139d1bdd2f68e969433d5ae67f9642102bc147adea51ea1ecc88daac9745fd4976e61cad819715793fcd1a37666cffbb9eef55d3de1938819d097fd404bf1ea89bc6b605a808fe60cc3b85766076e9ddaf268b3939617653e45fb2656c5aad25c131ec3915c0a6ac706a4c0a4bae33f94a08a70c68c8e5e49a88788ba15fcb4430880308f1eb08a3296ea15904eea87e30db3e600206c8783814ff43a155d726589f90311ae16c4c08078d10b068282b9611809a914afb6bce490dbbe0ee14e4d8d9864026a2d7fc69408b9236b83cb382ab68ddb57af522885244366e5a0ea16fc722dded6d62101851dbd4a0ba13e925b74ed720a24636b41bea933cf093122cd283e240b90f575eb4139cf6abb4513a2b2d487e506b4f3386841a603b753278c57f0e0673ecf9fd4094d02dbc954d71d74faa10c0afcb8e39f11b95485c27211b4947764308af5839aafaa9856d23d92052ec8a8589fd0279d04cae8b0cba4a3fd3b69f71e2b198bcda327e81b291bd63a00e7cbc2938d46a80cc294433de8f23923e20d99c531a7ff6518e44d449c0146fde6b44c267207203c0835d0b8886610295b78b6d644fcb356ea95ed0b47f36bc7d6d3caa33a9488e804305b11442987e4dc3f711f78e17d99ff5409c71d0d4d0d698ddf2c53563c18649bc8c72a1be86e0b41ad259d4cf69660323123706666bab54b46aaa86da6da8c453df6ac5723e2b32b00b0e505099ac06b74e5257d51e42712dc924f5f0501c4fc8041490414fac59f3755a50c38fa6f0a5b5541eac219f009115382c493ccaf8023043af08f023cc3fed7b3e674725a99849ea31043a2a7da254599f0e7ce0c5e93cbdfcd8ef24c4a3fae83fa748e6022a8b14eb9d8a8b53a2c04ecd532bd51a2922050dbd0975d8d5a9e20014fcbde38fba17ab7fa63e09a5f61d3d92a56649d9081fd32e7c92eec31149b33ce3ce46504978eb7de5e247388e7c89c061e3e0b7ecc3864ff2720cb469f5752ad152c3c5fcea1485f4c1a569e3f852bf081eda0852ab624cb3e0ff096ffa15ea286c06bdcc507705f24087137917e605b451a004db64d350571bb6a2060d9570e083193e95ab15a52094281032a4775e2c2016dfde829890d8d2f3b59ef4de975ec9ec7d99010415d8fee0fc99f8f895573ece0330fec07e4eb6c13c68654378b446d34cba21481b6342e32e7f3d37aff814c05a0f81e157a07c162d218e2b07a9aa4413769d655fad2b603c3983086304224ac85d7182e96e4145ceff8229c272a4562b2c2ff239be73086b3521f330aa41561102e5cb3a42bccc884658e89b95d4d54f60518f9a1b57be8de6a77f2138ae44384e54484545311ed73983966e2238c3a01d6b947f1dfc060f087136d1b801a5f75b8929cc85656813aec4475bd461a6028c28875108056c24c4c2a10a798a1c2e5e960ceaf588780085de995180dde1313d20c109a181026ac00f2bfd6dabd620938149e8f13ec97adae980fa0467644ffc13a904f5fd532b94891b481265aed88aa86502abe4d795c1f5b9776e7113b435c0dcb1f7aec6c137ae8332931f4da9b938a50c87ae5a7766dd5d8776439e068438d62300de0adaeed6549c6bff64c5778a1c274208c84b51df18095cb99e2db66279d22abf1127bd88f9b5398237af83f1978b3aa18d2e8925353a7fa1d6e0d66b35b342f3a6c4cba040ceff7155620daed2fc040b01a74a8abef5045eadc2785d8035b871fd5cf6aa71993fbfed044f946178f5d62cb7b286b1477bcbd2fe6a1b7c300e9382bdcba5a13d3341e13646c31f5fe1e086228d7496e1486d69dacfd34d2a0157fb2ddafe4903d6c331eff6674560f5393a9e6ece572d2327f8850070f1003563008cfc23d8f2b1dbe321e3c3c24bd78c51e19dafc0cd015ef31f98b96265fe019e133ce617dcb9c0773e00361738e633c873806bfe043057f8e627f0e780f9f905610e389d4fd0e706c3f9016e2ee09f0f80cf35cef91418712a5a3e9e4b631091952d314fa531a8489491084fd2365824ca48942769192432654bc473690d2257f2e668b8bb12a4f3d138103fb492c603706a8d57625e8f572a5033a60e59c2c974fd3eb380f6c84a61a0c4e314dccad8f3dc94ad544280973ab2aa40b0fcc98e9a9131d3e731d19f6a6e1bd5028e8fd517775a3699302339f475b3cc335c92c7895f9765f63fe6c575d89ca1bf98b1739fcc4766d324611d32dee3fc0c1637a11c5e41f3d59f237c31385ce464b7eba9524f6deeaba1fc7992bdfbe39df74521f9879858b728ec30e809f99e6b75734a617e8f59eb7c63dbf7ebd9f5bbc1a7024b2fe55819fafdbe7334ec9b89efd7c990db14aa708d22fe6954c8c9f9b41c6beb0561f7bc371a8a7244371ce38bae7c10d2c1c290bcd1f8dc731cabb75efb97a9e4b7f41be64acdf8be06c485bb97c59288de48562d19a31717b97bffb92052d11fcaaa2d63f4e22297ef381643327adb41896d08a378404366571ce5ca782d28a23119dc0c4f08a4122c385d71972be3b550887e0055c627349c1314301d87d20dd77f03d7ec14a4df05a5d6e35299cdbd35d09a9d82f4bbd28254ebe2bee4acef494867f046f85df8d46f0c92e5e79b78340090726975debfd52a5a6154987d2515fd844fa73597b0cdb09be5fbe0c594a82424e0f6bf6c9373f26999f58b4360f9a21929d5c3d2ad7708e63f98a011a8286064fd62613e9f20a034c61f41f9dab63e49095afefab61f7ab286b39de38c73af196b4807c345e2651669c21f78228ebad2315250018c294da8062d962a263bad891dabacfde80617ac0a42e0498908de24d121332304c930bad0f2f1209f72b1e715aa3407a551eff63f809fb7b83eb6ab56bd13996998bab7188b04807b5803f6021d200c54782d019a4f21d1c1d480e57f3c1d0b0926f712f146ffb67ca1345a021bcf02bb6240722285ce9b0701b7913bd6c58341cc0994d0a875587829040cd781650bb622f15991b6d83dd886c1f82392cc7a77a089fe8be61b02b3dc9ce0064b22df3586e119b05e26e1e2def30622425a882d26897d2309c449c912ba2d5867ade4da7e62eb7a7a1703c20b8485c0ba7e30ad4a44860c2c752d2b186d2c5af618a47f053b253ac5026f38946e9792ba39b69b8ca23d2e05ffe400bc1905d6dfafc25948bc2ead4df228fd95ac941b31a39eba353c5e3d0796ed41bab6f9567d233c748de55404e8e777d1844395a84e7be86515f6a04bbd4f89eb6df839d4522003b5f6a1446ae1b9db506bdc41cd0c7c2d37da86c47b06937ab9fc222495386a29c112091c3ba4968a67a475544bd531eac557e162ab92dbdbd9d682644e17a1c73efa86b7010d83c40b952cc64fe0a6dd0a250bbf80dd04d3a238f0ac636f22efb05aa93889c5c9cd91fc9dec3438132960b0c23b54cca90e4a0d1cef03a2a668e6dbe9a37cadaed3c22eb55b837b9629c6c83ed3159c44ff7e8abc28f6874440bda763a89a7a84540ba4b0a2ae4cc33c2c126a4d96cca507ff2fc217eda83aa7e631c53b6598ae304f10cf2466f80688a9d368a0e28c40589ef7aa3fc7ba0d14975d092ae3944dbc374648fa67945c4ebb29ad4785d7ee9b7519e49f0e78128912174a8ae61676a99c4a1d382966440d3c9a8536e53ef83ea5833b06f01b0a53689f2c104dbb4f6c39acf1152eee54b43edc149a229396bf192108204fce3b352e94d736f0383410a9d785113d23611a975f5109d087b0293fdd4224e9f47c1239245e209586215d2ddfb7b8af0ca4d23309b20c9129db76c5fab017092f66f6477804a4105622109f984548e0139fd93c9795cf2723603a21b857a45de954f02cb50f98d202039d6f3901f1a18f8dc6470c3463b58877a9670cd38317d8a3e0f6b9852fbfe5b82a176731aaf46f457a80ba4706b967a7092b41d18c16fdd90f5fabca63a78128d387feaaabf5aab6bc62e3768aaba663f6bfdd15cf6289bcb5ca6243920844a0c8fd3967f2463f9f20c42205c7dd3a7245cd10bbb2561ae2b694ffbc78007581fb94cc3093613b96c67d6e9ac0d4ba43953dd55774217ccd974e099267275f1085e69d532c156ee4758fa76e735765915fd9a45b6c0655c756242179d7448e5bfd84494e01e2a6822ef394b71f5ab80576bb7de8c62e3cfd5ee1c579ab4dc86d3798ce41c66d969c74964c7590235ddcd39d0b763a181009dd4a9f5a78304d81ce77735fd03b94bd7ce84eda45415125beabc933395a520704465a14fe0cde4a73896740997682013df2adfef93da96e27d2c2bc4d852176612f0681c484d031194b95314c84e2a0313c9d61f6c6c286de073628cf339ae81725d68de1104b91ab651cbd7006d07efbf4fb9c78c30839353b53f2d95e6416286094714116699d4a09bc5fce5bfc65673296e01846b39a491374104984edc4b26bf8b123bb52321bca2cb485721704993750d537f69d2f9fccd00b886e5314e6dabfcb7ca62d597c8957a4305ab158f821200250a15b2735a157d8de9598506ba1a939d7bd1416d2dcec74250e65c68e0b2b612513a47d5fee43953b7be537dd0130970deb2d5154eac859f952641b1674090b833e088670442a18d5b7fa8e825040d2a09804be366ca514ca67f9bf7fae29648c2f9fdc143ade01f6718cab6ad85c22d7d7752f690dbd0a7af37257a2dc3fa69cb5398c1b4158cf90a17b37c4c030a9a28ef74010aa22f4907780adad11d0c2b17ea962aad5cfacae875b192db6390eccc9339b302e96f4a9f04d48a4895dd15877c0965c52a25c701d8676e1d1a636a1607985a1ea302630ece9e247096f13775dcebc049357e6aa10da6a3cbccda29359e679f44300cfc661a9eed71516415649766cfc68b700b60c3cee1d41e82673f74192f939e87291886c42a2946ac339bde7235594af55ff9ecb2c698910940d873ad9dd82010a0781402c5af5aaaf439fb0b3ac5c681818cf662cc1103287f48cba151686cff5b48dd54735280106995684ead48341bad2353e2a16c2a0888466ce03849efac8bf559e96be8f63448824e1078e717a545c4ab2781b103f00c69ed2093e483c6e00ce07408c5322525812ac3a80fc2118f3d44f1825314217903e04e29d06922b91601d32e00338e6e94a86988425bb0ab143f1e4745d500892304fd2154ff308dac46b7a7f3a41ba0c984a360793c034ecf0f3375dc35ce6343034fb23bc9bbb88574c4bcc727e8217ed3e1c277975d470b3cc083d06735d1db30ef0f3bf5267fd20eef8af28057dc87684e960b91eed7eeff7fadb3f39e226cb838b6a817714dca503702fcaffe121644da39b19606aff7a731fcdfda45f4681ef9f3419e8225b691339cd96c32f9ffc886b1635e442590b5794a0a6c73b220f58df2b8999c2de90ed5fdabcd7e8622be417dde91fc7a6801290e0649d7ebbe8202e8bf297ebc28c562adfaf3cf7fa721d85df99fc7f5e4b4e68dc77bdb887d6cfd31a40d892c00b649e7a9af47b7dee8bfa4b90a662d4b92ceaff7eba203f471dbaccfa99481f45b08af973da30b985224e83c02cca7d44a7ef23eceb300c2a0159400641c014223d693d83b604be011f27bf6f409eb946040e1252c8b34a8fbea6b75817aeedb0c546eca273f2d62b87732ec5b8ceac8abe1bf22f72dd1bb96ee7d01fe6faee6679d0a1413912eef03c611617c104c150f91125ba172abccdb129f390608112ba60e4ec046e51d8652b29360e0457f949936afff61327ea0195275826736a478962fa4f358ac02a5382139ef1fa83e0a203f808ae97896d21ba882cd51b376cc387e18173dcba62f69c5daf65d1cdae43c465af0329d7f5d7a9743d33e080f4648bb4eda25634a1deeb95c19a886e358531b8521d51b452bc67aa98a0486a811eaf7f9d276df2c027e474b578bdbfc83e22831f5ce0cadc6d81b7703247792530d3316a9fe549f9cb34943921da62c0a03d138c6b200039dd11f46d9a809aa9ff8ee17aec285f1fbd06f382e52a43755ac884504e18985e956a33b47eaec0f67be244335960fb8c6668b38ab43fc84ea6c32eee8441f8ecd86f1328d1cf0669ad558f1b184d4605d42b7a794802f553020296bfb84d17f8e4732114743a0011f8717ad6cf032d466f550b43dfc497ac2ed650a9f63b833fafc493b21e4dc59ea37dd304e7aa17b24793c29defa444bce010cd138cf14610739cd755838d02f44f988845a8eea543771a343da615687bc7ad712a6c0a17c4b8eda22ea515f521c40722e8634a43df60722877fbc17f120aa0366470e4a0df259bbd8aea832bbe3e379b4d2f1f2203c0cb005bdeee0ac1253f2438363b9dcf0b60f621e7bfc24b7d8d58f5eb7658bb4f3625da16cd3991e5632ee7862b3b0d60dca2a83eaca3ea00f25e197837d8c33765a8767e6ac479c11dd81589736bbc22fa5977a7b3f76a37eede131fe3cab8657e9e49be6e7bbc628a66179f2ae0c0d202d1681f883c238e8e96f7ba063fe0e08a4cc15d28663c42233b1781e5ea623d99e570c4ea79a63f30ca14a22703508c3c1b735cf7240fb9884defbaddfc79234096e4e58b628630e06c9be6d04e9ac188603ea9d823603ef999289bc559c01587d714be47074f601b2a2a91b4755584099540460a7f4768e620d7f1545f8f3011cd50ca891f46c30b1d783b1ee8a864bcac2318bd1c61d9868ce670f8550ec798bc7586ac7248905d86aaa5b5d5e277eb60b5231ab04cd02609aa998ac4209d0283ca497fc562f6cb98371e97b8169567c51e287b3420a4d0bce5e08a277102f574821271958bd325caa4f3e3da46c543d3c5ab5a75700c073562137123b8ed43f8bc86a277598fb502e887c9bbc6c3fcc06847f44384e20b7a18c26241a00ce61bea8d522c43b5e9037b37e6bc860e54bf7a8d09ea0be6ce3669b41103f0154004817841cc67a1ba5e04620d5025e270b0ba4072310b7f1ea5a2aa5ae4944bbd3878403672b83decdea01438613d85f7db94cb058dbe80f4b60f63d11ecee9566f370abb8e80c3a007be6a7d5773175261656c84ce68b168496e01d024ae5526cdbefc1d36e1178afefe5020d072692298823ae1515a9a38b7b8d55866503c94022d44eae55e79db1cbc63563a2d977c2f890453715e9bf30eff15fccb523804a12a1828015119cd0aa34dd3569822b2894174e2ea1f7f2ac6b6daad2b6c80577530a3940f6c609b7809aaaca96c5c528308eed64e3f5cc06103f6c3ef361de98878ded3272b6f14ce139d1b242cdc901bd594cb9f5cf0778a038132523aa0c58768d058e48535586ded305d477dc955fd16d7590d2b71fc3dd48dcec2596fc354af3d71adb083f3d45ec7ae9e2b2e119c07e7da9fde64c1f6bdf0f6a54f6c54e52d5c6ebf95342e2e6157477cfb5ada8f6439460d3db635b5de2f40e3920686c76f2432995bca83349acb28cc9706f3656e5c59e3933fe58295fff47d018b9f071781c19f9a0759a1daf947867d77eeba1b7d24e3f585da335f086b8ad2d792f17259403340307a0ca080148db2cd2e7133ba47c901edca60a0d012ba41085a269337805f9a9a889dc3a0a9390392b552e2e29fc5f10540fb89415977a9c84f7212675ff929de9ce55582217e1dcfdadacda9bac82a62c1d30136fa2c5008343db87c14e57e3aa1f826d3720460f89742a7b9137f95f434a3accbcef96d25e63f75535558ccaae0c13275e5a59b9b2f71e71be41de0ca767c975a0f8409937d316b9ab1abc0a8cb40f658a5178d9f6897c0ba1cc6dcdbb1482a505b21e9d30f8fa4644cb651a79efd861d187b2ae0d61b7530b38cd6949347804b887367453dd26a79e65ed2501618948aa8c83f043887e8d03a02cd0451bd1ff97125ae91e458379085edab6b556673d1067005e7192cf7e19815a9f7a6366c466939422666917590e661672e2541f047fd878dfe4707a0dd358408664140735a607c0b4142df34f240d37fb0f49781f4319573743e8c827495aea2f206d203b4545560e283e344fc447d27080f7e06d283a8f85806573919fc5a11f1c97dd2afeba1a2a42c249600eee73df9cd14dfc4db26270fb98e4f727dd89327d4eb02f5a0fd3551e7c5468e9e57bae6a68646378ed7d4b08509c4c1c1313de2a49e48388cdb7ca46475bc932d1fa9c1c5b54fcbe1f403b21ec1af53ed3d0e567c71bc0f35425875a215d92d507d1275a335ac7c92048ccbcb1539007445e60ae13d001c03416d299e7ed6a870bf6b53a2adbd2a7f9ecd4eb5f6c28220ab1c3ad181d870b7d31cc7247ad2b6ae8e5020c5e18646da4b7c7683b46ac0e8e03c081bbdd7d8e644438f20d01ba83b611136d8cb46d64c8a40a1d854bbe245892a8800aab5b696ccb3de6313500b345c14cc61515b379f28daa91663d86c65d17c586345e559ec18dc162f19aa526dffd11a67617b154d9b38b0c9ed3668a63dbcc02a545536ea2e4ec821ed9452b89a1d6f5e6a96d5182e9370aa6de8b9591bd78b841b3d8561c1f61ab32388251b3d6233d868d01132a7817807cb1c49b6b5bc6255b0f5e5625b32ca6cae791048fb977999655e66999789cc65265399c854e63295894c652ed332cbbc4c3229934cca2cf33237f126a689a39b3b3a0213a099d0dc58af79a88d14e9e714eda21c7ad68a8abdc0a16be9b059e3ccc5c82169c53cfda864c50d3b97a8154dd6fe173b432db05f5df04dd62d1300b1ea08d3472e91c81c19f4fc74c00a7903505cac07cdc2df92fa770d570ac51e1fd2db69b426cda08a94a2f2183e4993138115df634a835f07a4ee41a8f66ec827fc7d62fe97aa901ab3bc97f5bdd706a409438f95ea76068beb336f1477da46ba874bfcf4def80c7d542238bed64813a9ddcb2370c71325190443114a6197a4d8a54e9b2015bad6bddf2dd55b46139f30d8a9fd85602e769bbdb89d5b1ac9f097f1fcd5bfc5e20271cbbcbc856e3aa1904330d451974d9132011975ab15f2a6aa00add6eb4fba4858f841d3ed56b52e484eae9fb4a07fea0ee61b1d92546bee00d20a2ec56c5f17754b0947ade32900d8026efd7803cc4f635e3d208c783563369caf09209d9a3f64ca9d4d050b600437d3e6373b668cc9c03666c5a3f3753f41e2775d9a9584a8bdb2acdd03f194353a924221ca2c5bc214b7ecbc05b69a7fb976d9840a280fc7d19990c1aec74349a3df2d6ca29a2402b9e53f02e6f489fb7ec95b7efd36691cd87b11ee0aeabc8d2bdecc28408aa61f757b32119ad840a9a85413e69f23273e40113fc165ac364a8433361a33b1acf6f993167f2c863d107c282b6445b21947b20f24315c93f74f69c1ce235d84897ef18ad2f160a426224557011b861fbfded7289a188a87187c4c2f6ec4261a231c78d9272dd1c5e2426dc5f8aaa89433e1dbeae1e7547644372c629744180aba02d3d6c60c463114be5ac1e34a20fb30ac3d829d0eef49f5ad4bd663d8bbef27ae0ceb471e36196a8b8e1f6cdc7f5126ec1ac6a39a7ed7a29b82340417b673250b36f3cf998612a2cbe58673eafbe767ef244f6192fcbfd630ab94c0e61022ecd1604ec2e61c6c4c9c1a17f3d64a754ac78e50c6995dba2f99394a85700613c3fb04a263d075cc35856a235fe9d6bbc6a954b48daf5e1d42cfb71e66b42b7aa1d1dad78d8809ff6d339793a0ffdd26e2e279d5bd0e94933863fe9f287ad97fe1e0b78ad3ebf68019f0aa81dab6cca155026ed7ce7a7afe2614f9c9e583e597c7eb2d5ee58c231d5c2fcadb6b3a991047bc5fbe8d54b1bc1ffbd5510237ab0f8af097ae3aae1170ce444d4f63a944a18f0d5ff378cbbac8c669e5fe1fa875d51217c2b86cefefc898d08a815381063244c79de4c2962408cb7f9648361cbdaafecf2ab3d7946aa87ed0c026a16b863702daf0ce615782fe3e66f1667e2c3ed06f24cb04ee39ae9a0d67db874ee59eb44a34ba383161a2058ca0f21262c7ad27954ad550d07f61432b00d00ab2c66574068c66316cf07c897bc5395236541c5c95885d6f01d377ba0f1dec6912a27046e2ebab1fad484f914548dc4d72ad90421575fe98257fdc5d4028d61a9dcb0b706729972082e05a8d59d972f71fb800c758ed609b3b247a5cda7255910fa8addc593056d2782698d7cebabe5b58105bf82891e296ef7433b207e7a2c9db0c62538f47679e7089b326579b64435af474c2186adc749a04313fe913b3e91cff30a5a7a2e934e24d93a84d4879a8ad8b8f14e5edcd5677c2aa5fb401a22ff5851eff4566f77273bf2d521c99340ac0debf38c2a3592a9bd58ee11692a4d7fdcd5475c8f6194d36856f3c4e1f3a0647b8f17baa9ed2246b28d1b9337998f468283e50b0894fdb8b9ed554f9881be96da7760d00299e9a9cd2e7ac994e78e69a68e161053a63721c764c3fbbbc72bf06527064b147697bd45ca4c181fd2a1757057fd3db0e034d739449ecdc78f41920ea3a96d810a5a849b0be36fc62d7f503ba4a5b53cbad486843e7e8252e617f3640ba39c98155e011945faf7cf661311bb00b6ac4434ed080a0f0c19988698c49bf6ec1546c4c69a996bae0442a343a94f55296d0d1b85ef2563788717115c20a35d20aa24e6d110a65b76b9682a6198b1196314337b2c7687d8ec0b0d9f26a22062c7c601f532a9417a10bfe87255af2ea23e26172f2af508f9f573dc43c0e5bd4f5e36c78fe0d5a5deac36a828ed20718f17409db85c21ff59d72e7035ab5297836e57ad0338ab8ef146d307245974a9ca4f503bd7ec2e64b20a139c569d7bd805955bd58317efc89e48ead2da8d53789aa6aef339683f2be9d5663a783bea6f87352a7efdbbd8720c003f632f1d4d58763e4dd9f34bf7f1ccaf540ba61638281eddc25e44e25377a152d7053ce8ff1aa7c83f860ea3f61dc48e4b41f89858d9f01b8fed4ebca0ef91882b3c8870503cad96738cd8e72b7062c0fe0be0199163dc64543dfc913a4a009824ac2deef7cc610533809803b00b323d5ce9c36075ff0deb6c09f561a5982b3cd82e98c396d5c829fa0d9d9bfde4f0079763a977cea1fba0d1085cb52046669a96c772f3fe7205942a1511120eafd63afe89366060ce8046e46c43b0d52205c59493ac968932f8c34e3c9134733a418d91cf0a40cbdf0776ca481054e52842309dc6c7624144a8681892fab973d9f657e2f0d1a6d7bc4864c6c0dfdf77be9000f36c37534b18d1042c82664ef2de50e760dd10dea0c2c9bc64d76f364a1ae187a4c26f3349b0d87cb31dd1ff01a51b93fe005e27e3d33c6a08b2a438874aac876ecf20a803d607c6cc70ef484eb01a0a08b5dde01b00777b9d443453a71a58437d62feea795e00a0324888b591820b18b2e6e3f88dbdcb3fa65dfb84b15fb257155be558cb91f87424c1653a945b26bcf2217849f9dabd87b6296c409e6b23eaed3c3bb1d4a29e595574a9d5aa4dfb76e7141aed36bda861d76ea8341c7173b66697b9106a1dab3d30a13849e3b777a8dab1fd0fdb06ff701e18d8a4afdb063379d391fd8b9f7440c26c8f6ebd7372bdbc36c765dab1ff69d2ec46c12a7cb5a50729bf8508acb164d6e30651a4d261dcfc79a04ea6633566dcd69655626a5847047f702c680b9668281128aa12f5c60620c9d244f2bd3b08d6b61b92e23232321e699540c45d56928462829c90d31ecd07db1333bd60dbda08bd75e5016bd328961d59a997538b9989c9c725df35a98c5d6161616dabc4210a137378dc2ab4dda7b5ac6cd7e24b8b89fcb07abf152acb69ce738e52625e6068c9351a24ccba275c69819c7fd6459e58b55be33e38058566a917112ca3565cc3865d980a9667066c2772f4ad668468946513593e24c9fed36856ef11cf71359a69db1525151892a5d4b3c0bf793040bf7c356099d73d2f9a2b44d19b2a6355966ac5a4e2b2face636e5456995344494b4daa6acb8b05ab9acbcf0a2b32d2d2d2edba9be5c25f9443e69f14166e1032797e4920c19325e702c5ccbafc316164e8613199c4c4a7ab19daacb0c2a66701209e93f6a9352ae4ef7c702b59d6acba575498c4f23a33ba9601e1b4918c7366546b14194848aae8b42749dae710cc39b98c3e07e641c06729b7cb88c393fc6c2963060704ae4100cd4fb369230cfa74872fb31381ff3c2d8192fea0c26edc1b01f9d82b2df0c27302cdc6dcc0b0b6783c806d1ed575939595404639b550ab1584e06c918db56b167d5ba76aa2bd6723f18cb959dcf5219de5c17cb75652edcdd702e4671e164b690e1a214295cc87071ca94182dba1fb0a8b1d1e02c4d6ea7aab23dc3300ebbd430148661365a119f5cd68b6559afc101b16cbca2061795a2521635b8b8b4f4c30f3f98aecb8b559ce9cf24fac2fe60c309179392666ca7ca7954701109e94cb6192eaeb088ab59e3a96a345c3c3ab2dba96635318a1a2e1a45a353c5e6924d92588445910df7c3721beeda0fdb8bd3d05cea3a4ae9a5350eb9fc1483b81616196d381ff3ba9c6650b16d536e22921b2e12ddb8c1fd64bf71aa979428516e707183eb295370e0c061633b556b494909871638b88602050707c7db4e7526212159d14ffa498e1c39a4eca3eb328a335f30ca640e2639b85ead4e355e1504b48582821a8aa1212444581025e1bae8547b89a5c41996b77014c949aea5b2d41d5cece0780a163c2587fbc99ec3fde81bafd96c279f96aa849e652e2ddd66912c1e366395cd50ca99391c43f141c69af49226956e25696828699bd2751f32551e0aa2c1cdcb0cb1bca4bd2c7c813285ccea874d869bff8195e893274f7e58c9c8703ff23217d2ca6ab59ab162426728a9cc7872fb329c8f792fcb86dbaf51839bb741b9680a1b2b1b9bc7fdcc7b4ae82f7a1a629e19e53a0d75202231a330cf8c22401c4e664c016ffad78c32537fa861a9a6d164c9b802cc45000a5ba6bf2845d5890e45d53625ce74771a9a53306200983ea1307970fb9c09f80ab73f8343c19d7180334f66525499de879fcafd66944fe57e33a6156edf34a3d81956543963d5294b8b57dacf87758c04d78aa72d36e088a58656dc6f0615724962d72c39315bc39a33f4b2e68cb24d9951a8857126caed6b5795779b12552f4a9ff26d536ec73a63c56486d28bd2f51263b533986c53a8b062c849d00adef46792be5655423f2b471b5bd071e59719ab17ce877639bac08647297fa1e3b7072dc83573e17e2c8b9b1962263b0df733b12bafcfcb223393d65f5813c8b440441a4e4787d6703f969d28e898eb65c3fdcc9881d4a90c29d298d51948edadb27f33564c32becef4c60dee27ca9893b6557bedc626245ed77563738345f6833159cd40d250b25342df510cb3c142d23a8349cff46f381f7d2d3b63356375bbce182c37626e702809d382e38423de496bc399799cbeb45ee76b3e703f96e592830312ed96030bbe3aac3b45d0d09bd7c10191f7bab6a3e76d703f175f9625e784049a4e3090354180070d6abd4108a30b3af811a804a53e20a6e24abadcf64a4ad241951b6870887cd71b105dbedce40641d79ab72c6dcf4e2bdb9316d55edb40ca6dd831b46339687c28f3e17016b7719879e849165448d414a63085b8021515f9b642077de2bfa8a4c50be6baac47a57885bc0c6259c12635d8e2ca47375cf9b814a55c29050a9929d9e006325e16aa53f292b96f526a925b0da826348082b770e1610e37e12655104183329f8ab6829214e5c98d4a37528ef1a4b7d069aba88a48ef3cd4a585d890ceb7c74d3aab9921eab2e2a5d45d56c4b41729878ab3655f71e32fa5f6a2fcfc2ea54b5b7dd79328da0a29e9f69585ee43c5b44ac6ae6736a86afb7572fedbe60c6f50cb5434366850e69b1fe4a209b87484558b1812a3120174ad9ebf90b4d793911c519b68afff015d8e532ed7be5cc482ee834b474415a51d5c42c1a5c3250f2ee150223ad529cb6ea03f84d92a9187922b0c10fb51cfc6db43b7848470b280d2ae43a17ecfc3693a892e1b10753462128b72c6181fa3c5fdc4cb5b3546ee27d64861d99a23ecaa96bcd5c358d5e17e661eba6f2b924af257d227f4095c9252e9082c749f8e4e54a1e8a6876e2b8a2aedfdcd68eb1978597574e46395b2ce18655266bfb81f79c80999f299c4ae8a5dc3b04aa38c9875ec02c13eb5cb2d0aa3f65afb06e5725bd1943e5cea5f57e8f8c92dea549c454f368ddacf88ccea0754816662c47e2c3ed238af086fa431feb29bd17b7a2b8a754bd2cdc556749b1261b1b3810665b429ba798b4e3d74f3d63f140af6d88137f1f130a0aa07d4020eacc20c84828e359b481d9d9ed849208453b8e12d2861e5c71c74c386b0a7e1ad9e5643684114940373cdaa66085ca194524a29656c664b4e4b4e59dd78ada398fd7ac3be554d5bad98203d391dc5c4c498fe9d8e626262564c90386e2bd48a09d2131616161616146ac5040969c5e4490eb6ee64412b9abe231bb7183a7eefa1fbba219a9928668c2c1a1a1a1a201f1a9a6b4c5353438352d2a25b9d3a261d153088564d896868deb751f31a35f633226964cd8c510d8d1194546e30b0634471e4c6c45ca7230a2945428b641c729ad663e8b47717ddd70dd154eb344c4363cd5b3556d7bca72dc809a935d1e634b5468a9e48f338f3103b17977fdded5cfea16ed7f53724ed795b124b93c05c464f1375dd2ac67545d7bcdf0d7550746a9ee6f11a8d655936346f9bf7344d4dcdad6aa3c99ad5ad8152536ba4b0993635b6231a82c2a81b8a2a8d0edd1c74f35a7427fae2327c50b90f474846704f47d84694c1ec24d4de69a8bd780a82371d930e0946b7aa81716b3c74d963e2163534df2c1a5bb3b2a4c09bd349e55fccd13daa594d9a3e4d6d9a9a231a1a1afb287ed4de5143e83e4d0a2a068542d50ca1660843e862626234294be868fe75ab1a296ed89a21c0f6b4ae7bcd696efda744dd5054a1688dfd684763bf0e75638e502b1aff288d7f1d0d1aff7e616e51abf8d351fc51a81ae32f946c1173b4c16d43d25e2ceaba11b5176d6cded3b3868dd738111baf51e3363c1bf7ac1ab7819a5a74245842c4c6719c0435ee9d0436583b31894173cb8a7c69eac65b92f622cc5f6cf3360ee4d3d3c210a0c66d9c488ddbb04796cc1ff15ec3da9842a4c66ddc863d82e3350ee433adf58ea3e5a73efd43ad4e48a7a3d3aa3d26edc56e55536b3e533fa03b73e67e664e052e6ebdb00a2a84810b4727294e2f50abd391cc62c608e8decc1c11c19b486316f7e5dfe908a5c5044515ce6dd80f68e62836cd7b7ade46ada9b194666b3351d0f4ecb628285044341535f4f2c3e988a7e8561d930ea95330f3f07e40ddaa5375e67deb3553741f253a3a49d1a99ac79f8868682c23753493a67efd9adfb8cd67a2b8b302d9d4d4c010a0c6bd23a0c63d4b7304d8380e0be30ccd6b6a3eeb575319a99bdda7a95f77696eddb0b955816edfb0398dcd7be24cbdb13631be1175aa633ee336ea8c29313550aba8fae891504cdc88fadaa69c8eae0acd67ed5bb5e6da4a5b343556b7ca5653ad378ded90da8b9049f7a45333f12adc4fbf5b45d5166174bd114da3ae3fdf63e8b2b71824a5db869dabe8301fd82f5964e3f035ee55da337c1bb5eb1ab563991695d916dbc4906533cdcb5c16c9dc88c9ff50bfb8244363b3f593b57edd67d44f46fda80f75097963ea47636c44371e46fd28aa5bddf817d4eaa32ef58b56dc0fb5baf1a753cbe9e88b56745fcce9e83b713147377eb3a215e9ea421a4e340df9a3c472fde59aa717c7cfeb46fa9ad775454dfbc7516b84750d66af91822f29d775d9a9ed1707c9ee65af713f4c2c579dbacef4baa4d0c73a354dc65fd6f5eb3d5d3304e6918fff8c34e48474f6ebcb5fb15f6b51d3acb4ce30f2f3f43adb0fc8753e9f29657a8dfbc1a23de3846cf73a0b9da758b41f534ae964995ca76559d6afd4ace55bb5460ac6c1bdabdb55aa7cdce2759d5ee7536abf24e22f13db9aa3f6a28a1294dbfd719c42e9a9d5625c5714a1bf3efe848953926e67a7dc8feb45a4fdf8e2846c52ee47b72a93b8eca765af39aa1982c5fd64b3f2b5eebcaeeb7c5d66eb86fb49a1dbc7025d774469d7a150bfe769a85a7345cd527b9ad652617c62f8c0f041f968726ba92f3edadc5aea0b1fcdda5aaa8b8f766d2df5e4a3d1ada5b6f868d8d652597c567c6caa929603514fd0626b96e20cbff3d1b6ada5aaf868dcd6524d3e9a696ba99c8fa6b2b5d4cd475bd95aaae6b36328aa524f524f86524f86524f86524f86524f86524f8692a24a1514941494149414941494149474f93ba644950a4985b4638a0a69c71415d28e292aa41d5354483ba6a890764cb9fc9c5554a9545272562a29392b95949c954a4ace4a252567a59292b3bafc9c2851a573c4c328aa74a01ce54439ca89729413e52827ca514e94a39c283a507818e940e161a4038587910e141e463a507818e940e16174f93c524438389ef7a3505dc76389d2ae43a17ecfa321254574f931079d0d9b4a6fbba003c0bfd493cbbf6ebba0e3f9a70aba7cebb60bba1eff5448976f53e76d17743bff54522edfa6cadb2ee86afee91c5dfedc6c6abced828ee636b56fbba09bf9d52ee8bc1a9b0a6fe6a3b16c2d15f3d15ab6964a7db4d3d6522f1fcd656ba9968ff6626ba9d3477bd95aaaf4d1501b8cada5b68f16636ba9eca3c9880103f52223c654037d80a8d0a7c69d707f388d17adb7163ef4b179a92fab17262f482f54bc24bd387979d21e1fa7be58d11e1f88ca3e36b56f4b8d3e1ac71cb5c72dff768aa0dc8f8614bed65275a0c419be0ece7798e8e82039ea907692a20f5f07a746a953df8bd2520d944e7d3a506aaee81477f93559746abbfc1a2d3aa55d9650a2aac592607b1138afa721e565a97df8282214924edd9c0f5594e00d7faed81ca6bb4ed71e4c677df4ed6cbe93145542910836512274595e18483b2a21d903235c558d14d8e407595cfe4ea7631373d4a998231897778adae3975554d1901267f894ae5e5697af44b783836ec7c8e63676c7a8085ef68131aea2047bd89c7df887e343bb3676a7c88aeef36cee75ea03ba0de10dcd514485418016afbd9bfcc08a1facee0f90dc3ebc36c8d17f7d9cf36d3a456d91b6a938d6b3a1d5e62bdc8f8dd5d1ad704440206d25b53616fb6892a1a4efe9b64af85ea772dce690fbd94992a3c2f4edfb5c85694b438a0f8d2d9ad0ed18d9d89d98a4bb85f0a635ba6d15fa408ec22000fec83cb23d88e524d80e87b05cabf09023007c85bfa9372c3502b3d951588c1cba9da2a8a2fd2237b7f947efe916c16ef32f89d32d7273ec376eded3d86d8ea3ded48fef8dfd6e6851c3b9a6c90d72416c4eeb77ba94f6e99bfbe989f4c371ec37def5e6a6c28ba3c28b53bfeedeb0b11db780791804c07828a49fbda71b47dd2af4c92abc353e1c4697efd599fad9145d3e4dfd6c942ebfa67e3743df4dd27733e5bbb1ba7c00d4ef4694afa351bf9d1c5cbe4cfd3a19f54331940f2bfa30a52f1bbafc9cfa65495f36e5f275d44f5b7d5a94cbb73ed42538465d822b8d6f070a97cf528fb0cfe9552acd6ef39b0adbb3b19f91be2acf2cca087aec913342e5d869edc0757a9ea2befda21e4b2b5940d18247944e7d273774ea4b49e9d4a7daa2539f9dd2a9cf858b4e7d393c419dfa76f00875ead3c133d4a9ef85078a4e7dbfcef93c44ddf93c48628078a95dd08b2ae3524ffc954a932a6c4f46f75f47878eefd8f19c9cdb97ab520180798e8ad3a388c6f93d92e09cdfc328c7f93da238ead427d3438a4e7da81eab4e7d337a30e9d4577b2075eafba107159dfa54499dfa524e3af5f178d2a9cfc66b58d1a9cf87bf50ead4a7f3952bac8d8daa22a54695f9a10e897952e9aabdf674be527da82f5e9c078fa75257a986f88f8f9f6a0e001c2788ef2ced64e14199d182264aa7be1e6ee8d497434aa73e9c2d3af5d54ce9d4c7c345a7beda23a8531f8d1e429dfa7ee831d4a9ef5e88f37b40d1a9afc66d9cdfe3747e0f249dfa3e1ab7aa4011a2ca04f5205119999f4eaf51e3367ea0515f53617b3f707208f1997b6fa7a8539f77fe4e924e7d33e7ef1875eaa3397f278a4e7d35e7ef1c75eadbd991a2535f8f9d55a73e9e1d269dfa88d841ead407e436e7ef50d1a9cf88df9cbf93d4a96fc86f9cbfe3a4531f018ee3fc9d279dfa94702772fe8e159dfa04f0039cbfa3d4a94fc9f623cedfb9a2539f4a16edf16970d15e5559aa2a57b4c73f40a5b1457b7c225545a93d3e012a10edf187549df6f846d49c8a43448de1a9313d6acc4e8d39a249dae3d3545ad41e7fa65224ed11b5c7e771d2410c3da983d0ec11c9f324aae2390be38cc986fd4e41fcc27e32441d0417c4d07db8bbd82f47c6a883e06e619c39d90fb542434a47430a0f153c483c4c78563c5234cf51e589a2f21829a95cd1a9ee7c95a54e09e07c952c3ac573be0a944ebd385f454aa75ccea713e035ec771a7219fba17a7c86fd628cb80ff69301721dfb79d67e36b75fcefd5494885c868a92ce63543a1523e37c9d4edda67c90f13ee3d57ea77a1af643d1f80ff68bf9e12afbc9a4ece7d9380ffbd9cc3cc77e393beca7736baec37e40dc98a34ea9a4e8546ad5291e4c3a9583d4a91de7c73ce9148ef363963a955dc773d8ef94e338f643fdb05f8c0ffbc9dcfcc77e9ecd87b09f4d00ec97d3633f1d20f894a8533ecea7483af5e37c5ad42922cea7493af5733e35ead410e7d355a77acea7499d7a39fbd8ef74ed8712c27e31423c08fbc9047100d8cf43d9cf0686fd7262d84fe730f603e27e9488e749e5498a3330f603ba3007a22e11c079007155029ea3eea8bfa938ea69cd2a029ea2a9f3ece0e103881f38523c2c102b3970dc00f19c04a462ba04c81040026288b01f8fa712f093809c9804e048c00d0ffbc55c322c1374c532413b1931e701040ffba99e03048f9c0b2db9fdfe0e086b3f7b1940f00071a12531f623e23c54f6fb79ce537607c54173dc645709a14f59263621aa54cc730891f11bcb44b722b424b39f8faba8fd7e3c751d03e831001d7f31801d430c200003b8d931001df6a331801e4304e03703b811729c5a840e1c02bcf890df0892cdf84e901d415c72e07816240b7283d6b84b101bcf11644700175a82c37e3dbf11044711b7a9376c8c0072ac62d4e53a05a8b19f0e2dc08e0b2d792900ca7e18cd4f05d0b1df8cef28804581d0129d970b2dc92c135701ec979d1ae05d99b8ae120460a81fc07e2e27f25885961c2012f1e831cbc4d65e77bad0126a3f18970168ece73d8665825e255a8ceb681ab55f8eb746fb424b3cfbd17c8616c37e35d7d174b40b2d81613f18a7580172a0a80b7d39ed788e98d92fc7b19861175a82b29ff797e862bf999fa24581d092d353709f78a1253becf7f2cc7e28a1250468b14b86ccf0b15f8eebb838332c13dd0b2e87fd665c42a8500e2e87fd761c87cb8173a125d57e95a3613f1aefc1f5b8d09219f6f3798e1df6bbc7b98e010cc1bdb0df0c4e8817175a1200fbb97c0777731ddc0e1d175ae283fd7cb810dc0cfbcdf80bcea24068c98ba7e03edc8596b8d86f88efb05f00aec308cb0465b14b800871f31b36425c68c98dfd82b88aa0d432b1dd5826b61b9b0b2da961bf1a9d0dfbd9f88e65a2db39cb85960461bf207e0300fb01e036bf6199b8ae92204208c03241291017212c13db55b2e1b04c6c386e5c68898cfd640e64fbc17e3fdcc532d15d2543f7d92c0a8496b83c05f7d92eb4a4c77e3dc7f114dc678910f613e237de1389f8e1e3678800f8dc1e2182000010553b4fd5e95175ce52b5ef541dab84e7499ce1ab6af654c5cea3d2e7d4fe8e9a5d47c59ea3d2e3d43e8e9a599e1b15b33c51b4c7bfa9d4f21cb5c7b7a96d796aaa3d4dfd67aa8c7b35e636aa7d8dfaff50655ca6c69c46b596878a5b9e195586e561d21edf871a6379606a766354eb0b25a8c2161746bdac300406235c548d3528c11338dc976ab1a0891434dc1755897697aaa4e5a7aa84e55c1dba8f668fb08ff6ad1e691fedb10edd87c51e893e9a155ab2627992da63cbe30426fd3a76a69f91f681161736f1c115f75351d27a7ba7e0f5f6f806dd7518d3a9b620e87b8cfba1d7fa715de729ea148f515471e7797299e7e8f23f9ed5651e2493fd78922e77d085f7db29daa90164285da7be1aa5bb45a76a94a26aa7067086bf030a84ae08974fbb1aa59d221a52768a768a68b6530467f88cd190c2948694a621e5f2ce6aa768c7080eddb753b4a3a3a7db51ba8f4227469e130d249d8840d38908d42b4b1c418b36e8f8f0d226ccd5558a5961884ca8adc020804930ff79209f9ee8d315e8ca0a23df8f15465a1ffdb86ae20326f50382f1019bf880c98d4d7cb0baccfdf4bb890fa4b83132179aa602bb55208410427e32838824caa0db1067d06d883288487ab014b50e7430404ce7ce596eb36abc5bfde1b843ce47bc9a94e7eac7978fb5083fb28509f28effc1eac2b8b0091a8cae163793a9c200e16ebac97ea67307ba9aa97e3fe0ed403f7e03fd7853fd7cf03541d3d9c4cd69aaf072d6da4cdc2dce24bfd51f695d0de32ccbb439e7d42a3de47e98afcb3a6621e3a097ed38b6ac302282067df055be032657e5d7351579afede836eedb35de7e3fa8c47dfbe52c11edc99ef6e4691d8248def4ed9f25b9207c95470ec87615fb5ddfb0cb634c862ebefb843c2aff30ed9fdab16b2f8269d8618c7707423b88e29a4eaf41211d6cb203274748a84cc9d83c2a9a86d943d883fec3be59d801154b35edd4742dc2a08301d29dcf07baf4d7ba0a57ded35d8d77a5fef07b5aa5c66bd5258cc8cbf553f976ac16513976a32a941099542c0c90bed8fb62dccf0603840f831dde4f09bed841c04057e38eb93b77dcd52ff3c197d9763f1a72db7b7afb4afdd9547e5858e1cd6a5feb7ae47ee8b90aaf4a6dee9accb88b0bebe74409807410ccacda99127c336ed3e7c455b94ae56baa5855c289cb5de5b07685f1412d0c9020eef6206017f78349da5599fbc16c91be5655ead7cf2a5f8c62db123fe08501111aa1e34f4c16a1e318658c525e569431ca2bca18258d114608238411c2a841083b3a85a6694d185d50707041a15f7737bcb19288d24b0ec519d81dbb235bdd94dd73ab12c618638cb13bc618636cd9b13b764308bbc67e17bb63c36ea8f5a07ecc1fbd12c259af130c149ba1d074ebbaafeeeeeeeebeba1bbbdea7575f66585df9e804f88408da3509a8c59532daa1fbbc2be5635c5c8067a34ec1cb28b81fc837d601ca7b51b5f5cc8773654c128d5b741f7c4244119da2f4e242c7705ee7421c6a2f218fd9840e7e25a5a0c526dd87338f132f69b43eab94524a1cb824a5d4b9534a29a594d775d54cd3b4ab66d72a12d7b52b715d596695c87e556a2fecd77be2755dd82567928c1b78c1759f41773e5ea1c48fbef4f45f39ad1db9d019b91ff724b64ba7f529bfd385d46e3128aaa0bc9cc57d1b11663a5d39d69675c8717db35b15cb3aca759466b72c35a27ba6355cb1be42a9b42ce536ee87caad430a2f7748e937283ac59d5e723f94b332ab18cbb59b4eeb272fe53ace7e1b91b53dc13ca65bfd4248df6e83e25a262efb8bf77466992e5b75bac9c4996e3ae45ed820d6e927af65614cc7bec2c2c29dda0f08777a7ae68470a7d6b721e6a12bef89df06c55dd9b81f2f4e6d11faecda8bfaf1e5585830ce3aea25e37e702f62bd38c6a13016cb7ae15e60161557a375769dbca60cb39485e55ddd861847b6fdb472958cae9cd22cd2eedb3f9595ab1c729c15b2add4af99a396a5ced89a357271b758b4f7b445a7dceed63bbbdd22dc4ddc59de1d729a0d62a267b11f771586e5d95764d09df3badd3f23d735fd5a4962dbaee92affe45d39c6fde85ec4a49d7242b6db05ddcfc875e95090ec199349e5db13ccd3d9cf0340975e5b5959f9c5fdacb0585c374f3b78e97628ee0754c4f4cc5a39573f2397bba97e4041d7f4aed2fa6d1c11f0b27c65a5fe5801b272eb906359b975eb2bef54ec279bb85c4d62bb9bdd9e601c707b628322b3945e7506359029be508116576831832b6ce0860bb9b8b08a1a48d1607b32aa8e588793c7b45da760175547d827a2ae9c67ee470699775a087421276d5cea3e98142bdf1e8237fc38050d8466b0c58555c8200b15c94ee83e9cd8049c9c4e5da74760ac439f25f33a57ca23d8a56cefed490bdb8336380875874e0e77c235dc0967e623007b409c254fe94f70923a1d1c1c4ae7e3bda8c289323bba79e7b58fad2ad3dec4b22c3b12f2da9590ff7c58259a10324109822e8bd5fa399124845e5ea7169c32ed4d1558450f902ee480a844ca97130dca442abaafbbf19c000dcac4f37ba2eac579e66d74813f80bbcb19d8326ab1742618182f2ea75167f85063e3871d3970dcf0ec08e02a22cec387017e85388c2a2107c0615431e0400ea34a01fff17300097cc8615441e003286201875165811f5181238002271281771bbaeb1fce7de93c4e2b7278ad48fdaecd7a5953c69ec901675ae705bb94c89addaf2ac1c01f55f27d2faa30f03e4e5421f1be4e54a190c040a571862d6074f915a0c004aa042c041cd080a2cb67800212c03f80012a8c3305b004a830ce0cb1428c08c27d74999919ca6566665e5de6a0cbcccca71616fecad23d1c9d59a18fac30ceb01211b8456092a5919b01dc1c2006436338138fd115181c6134c9c06e1950da75bd0367fa4d28153ab63af0a68f7399fe3b1553d61956b0053adc58050dca7c57938e462574508541ecc295fb510a23227543b4c75f8261fbc46b7d8edd72d056e02d633d9088eb7c22d7ed9125d11261a63fc2bf2c0c76e8731dc8a7275669cbd803e7bbaf135520634fe8c54f39022f4ef9389b9ff06596cd150174a30f3346efbedbe542eec2f91b2f39ae342919d5314639e79c12ca1809218410c2180d055936c739e39c72ce182306e195419841d49c1342786a0f5e461bd9ea29e3942919fb7241346bce393fe7b4b42d49ad29aff9c538639c94ffc5286394b2081b8411c248e7b44e5d776a9157a43d29cbf6a09c4c2984d2728cd16b4fa6bd96a9489b274699c5186334d2575ac91b8c10469a2305745e9363e4cb98cb3011624b8b135a34c0c2d204960dacac50b1c281ae6342d701159525a828613229c1b404c721711ed8b6246c46340d09da07b2ec081908308c09c604a553d026aecb0857082cab089608ae357904d792443822e31048107b49e4b314d6a4bfae292d8b9338295eab933ac98a493149caa4c95d06e2ae6bca2ab3a4ab887569498dfb9913886519894c5281d925ad6985a5a5631666c91c934e2e7d0397172edb0a67699aa4f430b81f4ab51c1c1c8deff5f24251d79412156f5f178c1019434eb949696d2ccfb3ce164ac6b3c189cc719e599e8b9f8cc12df1a31db3802e976195f96a2fa29dbf5d8bd99813a29daf450d86fbd9ac8e4edb34209a3d5999c432c2294dd77b3aab50d278c1881163d22933598fd68c32946e2ff1237f5d6ea898cbf4e0c5454e96131321f2111f9d92b06ccb4b4b8b1334c0c2c2d2840dacacac50c181aeeb98d001151595252861329994b004c771481ed8b62d0946344d43c207b22c3b0208300c63c204a5748a26aeeb3242082ccb2a8208e6e4d5082411a43c1287102309eebcc9ce4bba9db0b4b959dc123f4a4ce7b2f67e70fb5fdc4e3110477fab2c14040516463a20e508167d378985e49080511ac040f26a719b9193705191a9ce17998f739ae6dc382220906919c985059df1c254f182d69cf32232042a65568f4ecf8d72d9590ad8c38ad98cdfb89fb9d578fb6a0de52d4eaa707c39296d4ec4c1b11ea7a571db8e4e9ee396f889e76eda24dd4cff50a6fa388382973b175564656ef33c8eaf85713fd6123fd9e961c6347878071047ffab1c4dff607014fc839ee9c73ef7f907b0070f01def4fb1c05f3b0148ca3df2f2eec6e3e82f3b1ce1edca5753ef7c5780be86e4730d28d662f925d9eb3cf8c45ebb2470e48664f516a1d6f14cb4cf33d3256dada072e604c58596b100212ae68e1982cddaf4be55c2b2d22528e1459584d8ea46c403e5f77653c9c0b7f7a10034384819ec007da822ebc8f363922fc8f87ae94b363fcb430f002c9297d6877cc82b684bc117aaf43992fae6a5f8d2b43e125ce82cfbf2c67c1503ac5f61f5b866279a9bdb8c4503a056fe4c8b26fdd5eccf1880873fcd74655e8b4b62ece1130448e68969fc49978cec210c132cb988d44403e08807166cbded3da31209ff79b23a21d8371869f7cac74e3bfe8c599eb902300fb64161567ae258671e6822102394a04f279823dc2f4a10f1101d8678befb6ca4b95a12c75123a5e82b0af18ab70eb1a43c8d1a40477212528e85a150688f57ec3c0bbdd1d749f321245152f5937124515f4a144371ec5d585349cb080acdeb0a0840a25494a9c2871a2244909152d3f2d19e7a99deff6669c714ec9344e1aa794534e19ab9079d741ef383636364d9690d0503a4649447bbd15d15ed72f5eb636d829aa2aa267fa94eb07823ba4bde6c9b24be6313dbb057b70cf7ec11eda330c044388c07e1441218e2cbbd9fba66a411c22b8d6615f86dca6096fb2fb20c1bdb26bd7a6d58f6a472eff997d13d7dac046c4906e56721d72d7dcc0762d2b235b4628335a3ee039741d45f775b7e9ad9289a3d3deb451d5c56e14ad5d3ce49fda6bdb5fa4ed9ddafbe0e9fbbffe11513bd0c1d322f44ae67b1ad5d0a2baf6bae9103d333d43743de8e0f518141474e3a965f1a08bef6895cc5bd7becd07b4a66aa62bbcb627f66f5f498012d2386fa14e45f8d4da8a6a4f9ef8f01c19429eeb1fadb076907f315f087b9c509de2c949ba431919e19074fb5a1725075d0b5af2515cb7eeb0dfdd822b42d9605ca28df1529c695517675ae6a1fbba2bb9e83e79e195c4f1eae25abaf034c6d81abd1aa3d908a2c8222718f703ad183a885261024e7b310695922b0ebfff75777fbebd78a8eae04cfc65bffe35ad0bc23eb43a5e7b51698813252744402743e4207e48a73e9c239e10e9d4076116375eeaa093f7c35943d772a11337c400ca04428c3136bfcf320c1a7462d4c4075b5cec2a4217fbb6554d8bdb3faabdf3a59c0f6abf55ed5d711c3eab380eb99f21db215700a845ee0746a38eefcd21f7c33a6c8fdaefc68fc46f67ce088ca783176e71fb18ce635c57745f13d748bc36b7b1b43d9b33f78363bfeedad8efc6fbefdab597e390fb51c275ff266eb4f28d3af86fee754af3da639b1974a8771b3a996bdc1fb8b40886c8f696b7d823b428cef0b70311c5991e42f7ed144dd863073b3ce09d1ff04e107867089c3a9dbf6304de4102ef2c81533ae7ef388153386718a72105555f907420e940d281a4034907920e241d305276ecd8b163c78e1d87393939393939393c827804f108e211c42388078f542a954aa50e53872a954aa552a94e89a20a88a2a86a89aa208f8989898989912143860c19320e630e655ce3db52855a1ea40a2db13910df2952428aaa1d43434843484348434843484348977724c1488191022305460a8c141829979f7a12553ba6c4193ea55d8742fd9ea70a8aaa1c4abb0e85fa3d4f85145539515452a28a87519ce153da7528d4ef7994761d0af57b9ece5154f158d281125529a238c3c7c1f1bc1f850a6de8fa534e960b023eb8021573ce395b5edc7cb5ecd9cd3de79c73ce39af44675973ce3967cf39e79c167dcfcf39e79c935ab3add9b7bde66e29691bc49014a583967682df26ed1b25d39acded07866118760ee320cb08e5656d96f2affad51fd900e0d5ce5448f67879e19985ed713eb0d39e88f5440d7664284dd7e1ed8917944019cf2b34ab3f9d746dd39e65d39e0521e4e25ae7e6e79c734e9edc8fbe6c91884294c93ca1d0f1238ef568bdf62c8d2d9c4e5db7be0ba77a4017decff36c70e80744ceedeede6c12ed590c93ee5693b09234fbe9e864f6c3c1f17efb751e122d45f7a150319099991946b91612169452638550288193bb750ad2f6e2ea6a6c0a0dca70d40eb3ac7d70d7a555218de9ec48697b1d21cdb2ac7d6cef5bdccf766bd3ea635c5c8891f949a0b872b449a4b8b08915d9b6e3077bc6fd64bfb8d0ddf2fd93e5e800c1f9e08b83868ecf4dd8d348dc2f3e09d4ed1aa3b6713ff8d79903c2cdbf9e6d19ec6a3a57cfa63dd9319ebe6b3ced3377eceec8f988694f76f4c00f78bb539031992b6db6e6386e83e2038a7d23cd7d1acf1ce3390e261e32f743fec7f6d81ef801ef669568ff016fb4db694c03c4d9a84543772d3b2d548a2b90ef2997df7d79b6b43d68618f78e7bc13766a8996f232cf127c6b5f097b44f8c864b0886edcd15956ab26c58a2611df22acf29d9d4f77aba04114f77a76d100c986a95c8e11b9d439e79c73ce2fbb24c23e89dabbecb445b0cf5f56160199bfec2c6a2f62ffba893a5544d41309bdb8ebb2df7c91ecd83124181603c3ac9448e019ba8ca8533fb263d7b0ae3b965518203228685e792107848382fa420e084cba1790eb9dcd2e8637d8a340852491a8534a5c1e1f91c430245dd8240cabfb4922aebb66da5caa44d233dff5f94c12cd2a8bda8b45e6b398bd48124924ed4523e21217768638b0671c90783b10f4bdae6d9b867de380c8db7de382c47b5de3961c4dd9652511d09544511589e68c44b64fdbd5246697f8c1d7325d568d37c0a609b3ac39a79559b2f2d55ceab565979dda347a51252ea7bf6294b85c63cc05cbe4af2c9bd7625cb020d6e535acce5fd79c32060744defa9435fbacd62feb6a739392fbb14ead1a6d2f21e59360b75c8e2581bad6b4fa93e89c49e6b05b750979914822cb4e243e9c0fbe93684aa24e614a60bfb2cb2ce360bc0530b3053b63dca93c768e5aed5a693bed9c939bd3ceaf7cd6afba9c8758e6a41963b085e10be6733ff2a22fbaca31c7b884011303e65a59b1bcc21d6366ee1f63dc0f180ac3c1b0b0d82f89edb2265be6ac3cad3c14a3b2c0a8d84f2cef582eff6d57da4b080b4b3aaf15faeed8b983c152617b2b2b160cfbf1e415a6c1fd60944a9677b5fb4afd80eecab651cab17467e9de13b5961787ddf989ee05f7d3b558d95ecb276f0bca6ec7b81f29ebd2dd3669adb8db2fcc883ccb0a37fbae1c63b956b02a594a89596904fd8ad6dbe175ec922d2e3248764fbfb6a1213a25bf1d6e4f6c50a0b81f790dd1de26572a4b7759bfb911a17ebd58a12b3084a060d8af57ae6e8583f19e5ee92e5bf5f2ae9b54c2b041a695f4b230dd598ecd4bfb01999797d7b721e691bf2c7678cff213e57ec0b8b445e4578ec160993033c63ff963bec805e3da8461b9ae18f6939765c26089c1fd60b24ebe94d2532a6fb7c2622511d13684aa2d7fa92e7f51b19f56e48a94f67acbbfd3c4ac90965fefe9795a3172cdcb26baf1709efe3ae4586c106ab70c26fbca31f995eb9f91ebe3d339ca7293fc0bfb4d22d933f42da74b9e05c3b0c3703f9875e7bd2e65cbcaf595b3d40fa808fd4a877dce53fa03c332ecf63ddd72c84d78653d595a9bb8b326b1dd969ed8d32978b70fd1a9956f2c155eada7bdcd6e1df739b726749b76794db3f86e9208a83b74f293449208ce44292792d22791cec4219a524aab5e5a966559d6653ff9399124845a96754d69c9292d2266993d4eae0045d4e28a78459cf10bd695b26b4f5a704e9e1c9760179f68da8e2e3612a824505046be80065d343abbbbbb021dac220a2baef55fe61ea2bd69f5b4f5be16b99fee1ea2bd392df9887304112eee7c03fa3d19aabaa4ee8350eefc87138109853f9f33dfc5b96999f58e7654b6eafaa4dcb3ee6e96fd384b27ddec473b0dcbec87ba589c993f5854c537745f772791d3ecdafb4277841dd286ae2d2e605e980217f3d307df38864ede3a335bf0083db4d8628bb2c5cdd7c5d7b5d43d8ac1ba6c820665be36ba12de81efb431c6ed4d2fae2231af5d893929a59fd59a3d715eb53fdb7e6c7d1c2f0345b2fd6866836410be0eba8ca7d3a9ebf23957be83a20a769f862d614b77d28a798171cccf5f958b92b8a16b239e52e4b4385e6ccd88e23074f1104a68bf28cb70e3d770a91c6e3cdfe14696118037f188999999990f27f7b51817173a6618b9ad947736e9e25bbe83c21d92ae3c2a86e713baef575e7a3852d0e0d554e261fdb6f9f83300c83ffa97bdbcd0c100e95fef5f166e4f308e7858a38c4016b3143468d335b1c20d1736b102e7c22660d88316d1622b352d849446fba1268daa1928b519b894e3db814d607b7d1ddaae539046d5901869a4f7e2b42151e5c519794aa1125f2faa86c019794abb0e7adb173aba759d82967765733f5d7bf39447db8fc2f6a4d5565cb24cb1a09442d80d6dbab95996b549ad1bebcc9e7bc530ac257cb7265bd2f658c200910c442f8ba5e44bb6130c3425d78526b45de8ba7628a3b1cf05aff968b5837c340821338410e2c0b841ee07b792eb6cd491b6179f7146c85c24da4b02e74a08658865d92470ae9c5f6c42471f331c49e9dba3bf46b91f0ce3d3d8a4fbd8e86667a327f49cd4eca453ccdc717340f8b03d69e1519c89b798b4172b47d15e3cb15114ba0f2e19ddf806b40a1567e2e5a31223814fa068140be97081b345c778a845035a0a5d918e0e0e8ee7fda8a55945072361a495977fea148c150ce7420ec2951fd1f3032ee26594d224842450409b1a40b9b08a1a28a13aa504fb7cccbc0117dc37b07cc87fa76fbbf093fbb12c6beb4e5d30413225d8b367cf9460d7380954733f289f25d69bf361fd0a62bd4f69db691d041800baf0520e08df82d62f1fb3ad4535b6d8b298df6ccd9ed6a44f50a1d9a994cf2e336ba429b546fa66d76c91ecf3d4527a2a29a5d9d454f86a7dedcd1637bdde67c84f30149da24d6795d9253d0f314f6699a8f909e6d9de594ffbf5a50cc5eda8327dda2d484f0b43e959083d1ff290d53e86e26adc0f95b32dc29fcfa8a47d15f983be48534ae5a422cbb22ccbb6292d3fab3cc438a67553e58e554d8b1b3fc13c34c3b25ff6cb38b330dbe735feccaedd9ab1f858f622979565f6f380a669b7b81f6ddbb22c3b67ef69be3e5538edb47e462e7d5679bb56f9870644dbb4f7fb9aa5d72147314b2fcb4f308e39271440ac0203292714db13d6c5abf62c2fc4fc07bc2ff0c6c2300c6b197202f669b1b10b1d844209962ef60f2611e99405658822509dfa7815d3a90f4eb9873501a53062a90d68cf5279871db38ed5be910b9d91fb5d6fa253d9ad1fe1a04e71b7f8aa44da331dab47b4675ac16c11ed99b85f37726991e30e579d82d7f24297fd82ed65f6da8e65cf7ed50d8af62e7a11dd0fa3db138ce3babe61bc61b2bdec9ba5edc10c7144a7b47a447b0de8d4c7525cebf08a6b7a4f54a1b4d3ed710ba6b3149dfad8a8ab746b4267ba51bc7593ea5a17ea0e1a4a0e99bd5070c6ba7096aceb425d9dcebdacebba2eeb5e54f5c840ebd775d10bab1bc77187dbb98a04766dab4a60d85695c0b06db34a6476ab943e3be4308c1e7b462feca21747e63a9e6bd3145938b92a1736c9e20851a98396a6c10d36ab687d492963b466fdf8303ee0e385b8f1b21681f1415cf868e118e2e5993f39c2a05342e5d288850e1e26dd39ed67dd085f79ccc23929c72bed145234b122095cd1a0ccc79c61da76d97efc6d9dba54def27610994fc56ed6a37c93a92a11bbe80207082288442089268488921c3149b2a253ad45a7fac67b9de2644e1ed75dd9f5eccc0171e266f73a75fdb219170ca4bb42a23637c96156898b6e5ea7fa924299f662acd7de08baef1c04047cbbcbb7ac127c2f88c18e3caf392dcbb2e675cdc2ae8e5ce43ab5ae8b5af75ad74529bdf84e1f9692356166662b24616666666666666666666666666666ae42eb38384983d14d5de8040d6ab81ab49074ed240d2b15fb7ca8982110c810f58996b494c48f5e6ee24a087b6096d2222dd7aa45a40541bcf3f4422e888d3bad9210c8948c1dbbe862ceb9045fd845173ef1734e56120f390408016fb1a1680651aef533bc812c31ebbab4e63805abfb50334a896aefbaaeeb8a334aa1eba3e8755dd7d56f1974fdcbb2b18aae2dfb77d7ba249b7adab27c689d6020abb32ea4c610460803ac91a814acf7a451cc3254230000000000e314000028140e09c562b1583c5064611f14800f94a6566c501b48619252c820630c01232000000002000009120022d5ac151ece860725cb82b0530ded4a88a8c2a3e987870e7aa3479e882797b8aedb64af8d76b30c7adf8c3ddd8f232a6ac3d11cf44341591a8e8012a4802f237952c5cdd5ce49a6b8f0bbc6055b1a9697231f29d3adbfe24baad4ad69ae3d19b280facb6d62b0aeed42d4ef4b9594073b645e7460e59cdb5706b6191c7f4ba304a8dfc2b251d72fe50ccbd8476869cda875f8ebbc60b804364facff0d74307f7f6a7482b4bd8c5155e1b923b715b8583520ad461611642b7caeff94a4856e0484c23bf95de137b8b9cfe1fcb7af4b6488647f88718a25c41f91aef69d59fa7f2bb5c13312e2e266f338cd7476a1b8ea026478a346fb23c28930cf892bb0dd8738fb555910bc3b63be929e365288a7d726a802b95f21530899afe444f070668ab83a75ca80283fcb20e13eaa85b4c8ede5152c54bda46850056991714f59067fb4c44e5007b3a3c4d572dea40c1962a7585da28285bf68ee48eb4f2070b146695e3a119f81f15534467dc71348cad5b3e657fbb8164e983f075e78d65df11cb838b867864265277021b91b183a0ac8bc20a5e9b5c08b334710842d86b057970899085139d6f40b74a5193a729beb9e5050b6dec67ad04065af6044c30928c75dd4650b394067f23e0618284bee5c307c924639f54a78c77bfffd8ec3d0780ef49d92ae5bde7abf44a0ba31b0b3a93f32bc6bacb7554ab4c6333a62fb1130e333683c7ca8edf7594c15303bf691971533001ec9cb539577bd5b3ff6ba4656a23a79e7d42da6d5959c0e09959f6131d3a0eaee80aa7472b256ea148851af104f0c4d1a9309666c115f9e9d1e5fef9bacbc291b431c5ce6a326c8ca2ee1fc4bd121791a283313e508c5797433dba0c7ca0f28f0f4b6d0226f18ff83e6af44838553007c2de276ea87026142a93362ceea3b88b4478590fb106b7ebef1cd4003a92089a84e35279b06db30844c65663872fee76de7d97ddc9a8427185019f7a680e5ee637cedbfb1e7e41b4d24f4d3313254285d98c816bf7481784639a54f08b17ae633eb96802a66742b6e6a8652664ed10452d5b0ba55b6bef22a25b6b32769afdde8f9383942359220482677e5e8811f16ad0af3af7f0444d4309157e438ae83b7016d2c84c603c8206033c52601f61b49d73fd390d4345673ad924d7b0742d49c92017b4767433deac82bc51562575e02675054537e2f426bf84713a13afb54c04b97b32886ed2885de3d170252d81182d9e0f7b7a4a093983718694631ca34f9a8daf35c755833001c411ebeb67868a3278661cbff1528756b2d942ede4869e514f930965647c5494e8026240ccadc2306fcaaed11ecb5acf955a88a22a7af6850e0d62b3d4ae940acb3f0ae2800b11ab7df89c5c4bf2d7989d70adc5beebbc63d6c6bba39d1877be15899a1bad20e575ee6d74d41553b2c21836a2cf681ef335e84122ccdab7b81097fb103fa7552119875bf64d73cff70a4beda6566ba764af475281f45f5fffc8f02f7d74357fb554732c5e1e4062f008f122db3565b4eee297b1aad5ef8cfc1ddb42b7a269d65a1093bda99bcada700f2292d85744ef7c31473182c6d8d7c958937b21b01ac42b3653a11621fbd8ead437a948a9aeb66015dffbaf413fd9a298f2ff60170544a6492984221a1fc34191c0a18792b0637cb735d9ca0260ba5fdc849e5ad2202c9529b6302103787971eacbeb1d9585786cdb01bd7d0abb103f43733006d5124e34f04e7a089cbdfd08ac375a9f9c5c8f540c70299983f9971f54d0d160ea3dc2daa2f49dfb0f39c84922c3a240b27ef678f10026cded7c03f1de9091d64e9f93f0a54f4cfe9b7a885703f057bda528f715dfed8e792db8e019e802dde53be3b74f3e655aab9c62e69c085d3c70eb470802dfbc613a0c42e491fc1d49898344e90002be002c8c69f0c03d1f55895f97e7d683f051982c53f900786b51155e9789e3720682c33380dd198c34c32c53d54d73b2428d8f693ad9d616c22db7b8b0a94ff5640bd66a163d6353327d1bf282b727a63c5fa9a1393d5ed73fdf51f9e330b9e393f1dd50b97ab7638c4af98d031c0f7502aa594ef4325c9f5e06bb5b4056f46321e129d6932e4fec72304472879874aadd3d40ba858c66157ddb0efff15d8720486aa4671acf3a26c13c0dc8412669991c0920c47a817e740620273d0d1d4b601d937318e5f5ccc6dc33e59361c41eac4679da6df2180a29091caee4568cda48c2c152a1450d9a67c335341375a198ace0a9ab76eb9656e9848b033192df2965c7e9546a1c2eac4a6e5e8ff007a214e7fd77bae32d3cf15a4493f5771b6e11c1ad5b5d8c7cc5b65f27f0a89c7578d3e8e8d87c61ed9d2370552f0422fef003246544d8b3df7ed598185619dd943ca1c8c19347b1d50c7a2771cf1c49d4e92600fc6cc86164c383bfe7e49ea4589ec743840aeecd9aaedf809732ee565fccd93fe295e879c7d9dab47ad570d57a520fdf67a8600f7c032e2fac33c7cf4306b0bcebdc56e35b41719357a7b35b1ff9f2d24a92ed2d9baf9a8a5cb6a1b568b7bfb70eb6bfd4f71a847a0e613aeaf016ccd6c29d280522bc84d8bd14f3443fdef14e969f94efb09547e8d3af6b70a7d965264fb7e1c542b39635b36897d1a427d51389cbe52efd309b014b93ec7552800bd351daec16b686da1af7a2dc8c66fadee5886b0809fe45fbd6a288e9780ffceb72a7373f47742aae8f277b9c0c09ff57a98c24abdacdb7d2eb433c803d5c90765190f40983eabfc2c5ba9d702ad236b0deeb5ba44a9376a0a4a82b1db0884e7dc67a6921dc4892bc86e0e07d523dd9f3ab6fe56c6ca686bdb151dc9c451db1f668850f58fd3027ddaefb9453fca2d28b446bf1826d7c6ecb1e2996378ebc38d1bcbb7c025dc008ec3017f66d973e87420b420ba619e7a1f2a81acf8d515846e835d4deaabf13e767c6584ed3c100f9690b302cf2b798268e76d70ae5ed2cc2c746190259dd6d111b29ee5249d8f96a8598096ff7654ef495e668f687e671e3e8c00eaa69dfb4e4442d5b14298042a46cd1d8360d2a67f5ac9065e81299f6c52573a0bd75f61b79c6a617d37f8d2458e6c63f63769ad770720c934d8f12058dd33614cddd31f0581f8a245a026782d288d3f005b8fbf80b30649fa5da91700cd92f501900fe8c6eee68cb5d9cfc5ef7528fe05431191de7c0f4efb920c1f2e27bedd7eec7fd0e5cd6545a6c6e5db1f304e12849646308205b5db1c9099362b2b703d64586eff87796f2c59111c9195716683038280c94b64751e4121a2cd932645ec7cbf9f234f8c8e370de6b83fc4b5dbe4b05fe54ca706c074176734bbf8a5e16b36447ff926d1f7b56d7e8f28930174a4fd505ec819b1ecdd7f60c2f93f5c0c6c071d1f6bdb03522fd4d7f58c279e7fe3e3570d3055779e1dc34295e8e439a00a74e4205f843c7801801f46c34ed1c1686b6516664418ed261a32fa72f0ea66a63e48588685b6badd53e2157b900e3509228bf203f90ec185da361fede8a292a510e433878f837348a7836b78e0fc34046b1106232fa0f84b1b01caebf28df24e0a4fc6ae20de4546314ab94368a42d878974707031cb5fa82d0698bcd9fe284c26918da4b5c55e0f6f32006fed7edb2e61b64f44356094736a4fd548e283923cae6423c65c057bf3ac295bade0bfbfa365b491e386b5062fe7ca553bd09582bb05b0f7d1da9f260608adeccd321b49ee16cad1e4cc36fcccf21cb0541f57b40aa9352084490c137442809344810ac94bb67da97643335942d83eb4a87f85a9b629eb23ba754f0c17102ebe871e65210264fd53458f029787dedcf9944b96c2046d6969d6d75ec1bf8420959373c9335d17f3d18f39b899b83eb9a2613469b2d32bfab6aaa6d0757523233afa0843c46fffc3206c34a1088781d9d4b50c75cc234c77588249ba02e641b74e9565d3e235ceb3688c4b84e86789656bea55b15cca5316164a9bea8e598b140146db8e217de89bcfc8d4ecc978a14c9793338f21b452469e2eaa7f5e0f5dc999e97f1f65967e55b96c8435a232fbcac7d54ccad91bdd5212ba0b90979cb0ad14da9d5ddfe6b5d09b70245e3c08c4d5af52e201a7dcab743b2867116841fc0057480f310bbbf6c000c461bdc5ea5fcad865f80b7dba94b194b46c2012af708345c7a4857706e052db9d9e7390a1b15a398b6ab46b188e51418dee621e82b5000fe0f1cbde95107e0d53a81bc5ca24d1247c264904961f2c1dbe20f78854e20d53f0312e63582e847936bb7e985f0e3643c32fbf4cba20402bb9004b80288853e1d7afe9b29b6ff07739ce8a8ade03f1de9c72cff12ad357c39505ad318ef705e6e7b778cabc816225def07aa3892125f403502a4dc7070d3e8654a39ff702201f12a17dc72241d07c5ef8c9a43457aba98a6fa6d4d02b2be6e78a81b7449a5cc425d4459f91df22ae4c05cdd9c1aea4fc0459ce9ea81ab8586178b5c3fcd6300b0591e086abbe987a95a06be16d81886d7f77daad19cb627034e93ab4b6ac4ce2eaba58266a763ab6f9caae3ea18b7f4a9836530dd875165eb38766c24acdb71b3e391fe824e615e2c89bcde96ccfae2ade669bcdbfd4e4c176682332b8f409178a64193a6437793a7237bcdc729d024ae53df13cffe824409d9256c3ab62551d781ab93275fde78844cde619e4fcda5ede4cc20d6c7fd4468568f6ebf315f7053e690b12b4b51339a545944c3d25a7d8f10438d96bb999a62e4873525b444d2224aba0ed16c56cb96000f4759a2db8ee49a09e3ddc2f606b4ce3853606efc2968514823dd5f853908814302a2a8fb0f5a31a914e4e372371e752ddc62215dc98734dff09e5172f786516f7c47d2809926308a6633889262a7660efce8c010903448ff158fcc578f815d4635ba81797463e73f2e18dadc4ea5b1dea731f14b7272a4598f5713479a431a9be262b14939135865b31cebd6cc1822e0d6370b10612962ca854dbd50464746ec58aba179c5836b312163f74d1ac0b9c5ee7d6d685395d9b031db4bed08c09dca387255b0fa4e52864685a0fb67792d5a8368a3fddeec29b224aeaee913b33deaa46701ea4ebe0673633ce695f7d992b9fe7bca2ebdef31f5a9836e7ebfdfd8372d9d4c482b038d172e6a815a410f3dbbba76b06c91a17491d3f3aaea78f3980a9cb6e5c4bfd6b43bd2f29d335d2403638036c969079ec061f6564503f83573a4ac4d19dfb8b1c8f1125e1502dd1c6ac8a66f770813e95123fd3e5d45395e1d6c7311752ebc6fd8d0bcc69ac914e50afbcdae5e705466818ca8d00031c6bc21b1d4998bfe8a5063ce7b8bc60293b1c7753d23a626422a3cdfaa37b04d34183a0f4b1a33c09e8913d72093a208498be7738289ff6ec4df209175a9f1e45979157378c4fd2e46f2affb51a2b2198bf1f4ff99c9e2591ad13a1b3cb120c9128f2f2946384bd0f74e8f4f9c62a8469b8b47b7c2d58ced6ab5141d51c93080cb0c67ba8b673e6f25e4a69755889d1a674db2ef94e7101204c5016a53f046cc89c1bf6e503f937a817f8c1064f1c92839ed9d5bb2e5fce82d940afb1cb2a606ee71ccbc6d740d1bd8f302bc89e30b61596ba40ca96dc1d9c2184a3a9e429a10df4265b67af7da6111eab5a3e7356e27d106c585303019f47618a8a8f6f1938c81a605262adf057d27bb7880cb26f1e7299e75f93d16c1bfba710b1c02da6fe7ca3cdd040b349c2b260854b3c8e035f1568662a3eb1e5cea4b586f99a6c9ba96dc62eca2caa183117f548ceee60983f846ba7129264de54cadc23240c7685087ba5ef6a30079d3914fd9a291fa35cd4539db9f4bac5756e7ea97747d3a903ffa81ccf6bbb022cb0d156d2f0268b87435cffdb048c5a853b32c20a7d8bb16ee6ae59320dab2c9a17934366696f3085fa85c4668798db4c5eaf5ce2eac08205972d37621456280f470603fce5c68e9f13803c96830bb2e6f51fb2e2ef8577c27c58e0c3f57ea8cfbca152237a8f00c4345da3ff7e3ddf945423ceab2991ef03bbbce0b4e73ab6c79f1197e7b224c609e20554518f345425fbd72be3692e49012d3514cb17a1fb4caddc7dbbfe7816d1fcb791764a2d1d776ffa641bcc35665a69f6694145ae7636782081dad9ce53170d25be6d3f255fd27b07bdda7947e5c0b58afd01da8151ed8a7fd8655e69cc2a96e91ad83f93ae5e69c229bf95a969b91754c583cbf02bbc705dceba4fb8b07a4e137fc282e8917082a39f1f2daecb7695f8bbaebcbd74d34bc8808fca38376ca5dc3386f2427b23ffda37d4d2ded80e25e408f82c329bbc7989b74aecb86c5cbcd9a8873570058b279edfca0c35d714cd0c9cccc0747ee7a1125d66a8d947f785d79f40064b16e70911b08f0c6b3a932c0f32e34c2992eec1f2a80ef3ad938ba232882442c26f3421a42637a06941bbf3a17cfe261e6e159b62ca87734cd450ec5037e36a98cec4ae195bf1f6e6093a806833b3da99200708179c5d2a016fb207867d4185a3c003359902cdb112e5f6633f7f0a034e2c25b25f3c7197d341df77f62b84dbd60fe133797398562e1ff5d24268625155bc54aaaa719292a68514f28e6bd6d024344b7a7a7ab75ccbdb5d02e6f86a29e79a670b56618c9be66079e6673b5b0ff78b0b59300fe5d08e5f5941a9b94223ad2e963e1f4df0cddc3af6b90a7af336f6273b7581fd06c5454e4b773cedba6cbe0783b27bfc3c65a2ac11e6a6b681eb3bc713c560654d3fce49367b549490db5756a649dc5b44bf5a9a2abebad85b8741f7b8fc990e4357e2053831bf65b38e6a44df2cb55c3b55d0083933101c25be3b0ac929faa0547a7e524f7d0eb5fe0ac18f01e1a7e9175383e7a12c9bc26c078d101bc6602ef59faf06ee2217374c9649f1b3ca6abb48b3581a83c0e9a1aa7f87a92dc47ff255b7640b4ba7c1ff8091ad42755e556cbde278c60a2b85276eec4e6a6a962ede2ebf7af1d29fef09e7747c9ec91b3201a6a1991be1bc7606236d65829f2349e0e1ac9310e89f0600340ebd5838312929065949efdc62218c0b1e1d2e8db654f6b1e29e4e1ec5773e154cca4612b7cbfc27ff599f2719e1606a016d815486716c29f8a60ef700b326c18fb183cb5a00fab851df428fe084121209e64036bed514a8798e446186529866682ebdb27f7a4085a4ad2526aa44513f29cd1e2f7f9560deea4dc4da86ee4e2cbd4b02c8e45a4cf34341efc2c3830430f39f4124581e02739efa9e5fac81e528f831892d92a78a734ad814ce55258520abde3c039923a7570aa44bd08c28a15732c8b4b5984f903651f23efc0c10ea0912c9a8fb2e4b8f4f537929cf71a4361fc86ccd0ec29025fccaed2534170a78d282d00dec328d4f309f7c5ea1d1d243d484f2b7bd85e1c353ef6c434f3d46c6464839b63c2d7601086a6320d0f58090b7a485e305071950e88efe104b583ab1f60afca8c7511a51c2596fc91f1da0c32e53e654a0c84193b2ce6c2256966dcfbcfb2f3ab4c68ee84b8e08ca86db5ab4125c0d512a254d150528ab3d31ee031a098a377d505d0833560d7d124211c549b195c2d867197ce2a87279f7a6d8e237b25e14d0b282578925a325f2d0e73fc814a16eda032bf8d4ec63f73fee3a34da8b5ba1ece3161c433ffdb4da9100cee33f99c1e815b070ea6507f34eb80ab2396dd34ace021c256d5ac88436525d99708f1d7a3312df122df65981d5340824dec1dcac4400b1b94a502ff35b757e22a839e5f581ef6de366c5e4fa051b21fd76c06ba0d9cef2d979b046180db702fb041311ab3061a60f3c77db04a71da6615977da1f0d1fe83dfb5d02c606756071f0347f3fb3f7dca008fa0f4153d6ef8b8ee3564b821f1ee24b291632ad8c3cf9d91dcbfa2347bea53006eabcf360500d1e8adce49fa3c5216da689cd9c0b5fc1681655fe8d8247872b4e9e2bc4ff4b1ea5b107ec89b00a64b69edd2258c6288df643136dcd93ef87b17c6fc2cd5b122e29abb772565532b72ca58e28fc4dad794cfc014f95857eb7f1cef77af16e03c5f81145ca52166a50ed8b54fc1b2350e4b45163898ebc030bd127cdbba5860fa198fb92c00bf4e8c12a2efe94ee44e05e7b885bc9f5f804376972ae7a8eb4b82269620aa6e14f648ff1aec27909b086ebec149a68af968fa7290a239189c2b0670b758d090875e5663828d740c5a8208f3955c02ad63a7ef25bddc6f57e6636056c4dbaa3e05b15ca5ee37ff8db31441aadc5aeaa8c3c9724e26488e375b8a9969db89536e94dc779cac9a5a3edfc6c620340ce8b3fd90127d8d8541e9cd0674657568acbb1a30998f5cc8783c9981977f0128cc29f21d0f2da4abd5ee42a230b85b216375f888680f9972f9bded69da4d8aa1f092d00ec0abb494c71000c669b4e3751519e61f8b3a5e779d9712e24866e8310f643c824f277ad0b1b90d9f3a3007c878a01470de4ad4745bfc72762afda3a5e622381ee1eba3019bafe9171f38310e63d7a3712e1cf89f0276134329fd305fab8f884df406e2e45ab8ae2d779afcd0be46fb69a1170d01d5ab3d10536cf9d5ef13516f6014c1de07c381ba06d8d1d0ae765604d802768ac455075701722a1da83777fb984986fa209e5e8cd3d1e526a605e7d5692d58745ca957b7f871a6cdf996a39741d7be36b39e7427b0013eab05b92d6dbfe599c256d6b22dd74a714bb9c6c6b7f0e6a8304e863f8ac5b33602e3481d7fc87013a2e2c1092e4a133829ed27efbbb287851166c361dfda7e72672da62ebef8b37b96466975f028a234bb7a16cf454a589ab67e34f282d92de1ff240ff3a85119a94afe877fb46d58c6f1ebcfbe5529b8605054a71f16c06690366d8359c21543b96d3518050cfa6a5cc2eb889bb1f17f759fb87d5dd7ca20fa9cf7b401b6a37cfc70a2922520d2d1c32bcd6e60f5fed8b15eeedd7a6b50c8e24f4547a4d2041a70bb0dcb9741e3335e0cb21b0ce737d97ad572228517351ea8d052c2df43f7754c0cda72c20daf2bed144d0e46e1ef96d7f3578d244273f1088396b09bcb7fe390a7f5ef6c614260807d4761aa76ad2f282ec0bce32d6a6dda335c12fc9462ef0262c003378a31dc9244b75a86e475b18ece3aebe29735abdaa48811c5abd86b83a25cd5291855c227a7249f87fe53ad8385eed8188ae4bb40087f2655f98b47ec5fabd8c25f1aba73d08a4754bd43429bd1f80fa05d9262227bffde1f3c40aabb8ad370116b5e71315d9be730bbb0cb6ed27a0cd7e19d809d6703dfa01e6554eb5034c27f4dcda950003dcbe8520dbd7f7cbe633d761c43410e486555ae44e2dbc5290adb6c820b7597ecb004372531c15f1629586c1361c5a183568d94f44bb24994787435e7cc17cd032253cea2d8ba9ab5f336b5e29f2848e81592765d2180b0c4818adb7770497fd52ee828731307cc7bc90e336cd24e72196605bf86bbb00ba814d9f622483cf4ea7ce1cb506ce9cf495a5c4855afdecf6e1c95a722d758002c695c5ea170d3cb31314d1be47caf6fe694e95424bf334994f5946923ee3f33e4d6d558647b407f4abe4ba491eac90ba32a7528b5b3113275430f6457bd29ae72ede0751fd1533f4089f2c376b44674c313841ace15c87da8d81a4b23eb7b242f5f37cf058875eff94be4a0e9981c758bccca58ec776af7fca2affeb55ba2649fc2e0a81666708b47433c0c9df8dfa8b41ce784700666cdf26cb4e7fe7026cdb4fff8b4953645152e8ddf00516c5c652a7331005b35db91686ca6837ea7975cdcbce1397d2f04cf1b92289935c39d7e99a0384781002af279f1303e03cc7b0f3c842811ddc0da0fd35265b1f938e8328a4cda8599df4a151df82ebba3c3df81c725d2af051cd0802f2548666928561f66f699276ecb50eedfa27d7f5db08d734dacc22c0f540879400e322698f52567a3f5c032514b3494705299751bb1ce933176aae90f5497ee87395dc5c289e80dae612309c6b6b64baf570ad4d824dc07ce2761c2b1acac7a1d6696b226c9170cd40d72bfd757d68fda55a9bfe590985ef837537d100cc44fa90243960312db9c0de047b5a3bb24ca10374ac1224f7b58c9620334c972d13cf67e5cb61ce6f5f96ee8d8d8544fea884b37cac9540a327ad26657459757d683e15f3ece49d4a62f1b01317d47d536d92129c7a64efda49d51dd4708ab3c8d68633ababc4d59ce48715ab85d9d89fef421cf8af09b4448ddd7248a6a4c176223fbc9785b7b20bfc8534f06951d0f2ca5ff44f255bd7c08b0a969d7248c42917fe85fdca2647e14f7cb74563c64f0e1f705849345ab71e9f68e7fc275518b19c2f46ab6b869cdd03e0a4a2964962115eba91e7705b2f242013eb9517cbcdf0518497236c5d70ccb699d3acf477ea831a676bdcc9f0fb9840cd6405a9848ef94241896d33b0229ebad82ec306e487e92a77893c9d7bce0121623741b236e3ebe2955c2bb39a49afd58a277acc67470427df9c50eecb55ba5a1460446c9a5f96ae0b6192fa5c0c5c50991d82022bd3430819e603c432fca637d560c1079c6a41e2038e305ac2212c856963b60d7aa2ca5c4548a9465abcba2bd3a85013b8589452ebc34885fe720da1811907927b0f43c1fcdcf54aaa98dafd8bcde9a5afbf0a5de5b6dd3b745cf03234b43a5dbf7f067c582f66d5aa2c488a14160bd16bf4b08d918667bc3c2ce3fea42b24876caa3063349d4d955cddd756cc417f1405638385280cbb767a04a137615b0a309fbc3804ce90bc69ce56cced9e204b1984e09e4dfc75e86ec59c31d491fc7fd7b8e36d79d8e7e6f74bf5c174f2d2aa1ad321b0652f04a757bc0e0e91c4d120e9dfbd2f1bd211340be96637618866e15dd9200e41434877b609e36884ee950de9009a42fab34d300e8d14fb57eb5569a4f0a77e3173928e27feb57206c70424591c59729a3a236d24f0816bb35c198536127a09a8ec6724756d15a7f22170098bd4390f3e96f5096fb98f56747199c2974ffc84b300a60d2e0d2bdb83560cb3e9f9a81dbfb0d157c52cbf6647086da3a3dae326ee483df257f22d54239b6580115e9fe1579fe392ae24671c45aaee6115a9a3f2466efd2f437315be5dad978851802dd381d7530371c3686e128a6ca8cbc99353f9090caa77481529ed64c388cb8db1ac92604229dda95303f7e1cf23369c993f5ddce81a5117c8140e775cd9cbec3f1c76bcbd80a198a5b64934be7919b88fb108814976cdfe085f9c552ae583f91f0f5af561b6931296be8de31abb40f5a0ea3838baa76785c383b50dad7ad72326a458b104abf3b1c3e039eb574cc63d307490d42242538cb998da72f0ce112a23aae3e24b839ed70b1dece2f3e5c8094d864c3993294e3ec3785c4e34c8d020bc4230bf4a99ca8e6fbc4df3830a99b006adf0845672cd6346dbb40100e9917f34bc98093afe0198419d93b026303987f7179aceb107979a26b45266df2e3dc1107281564ef13fee188075cf021745a8101767aba5625737dbe81f7865797ba261c60a58f48a7f8d0ecee10beaa83fd967b123c13152469946a10e80cbd3906d30086f60ff311bf0e4bc487ef6e9075051b6775f6642a1a1f8562e0c55fd8f0330878e3980cafc0e09b18df3cca9d63bf21380da66431fbe9e1337932da4f30d8329e5327ac98d3a8285152fec07a54d0e5a75662c4389457f5b2f0e289209492c9fcbdb27208062e6f7786b1020d0850120624d8cc79f08b412b539f689e08a15f61e4b7f0ab63a952f2d9e5e80b95e7a146541d3dd57d4deac76ecf57dbff815ffbcd7b834c2ca933ab5a66a06ab08754d0072b9ad69872a169f051029d22bf06b2cbc23b4845e83c6f100bdd7a05b2142d40bc4926356e7ce4aca18cf8397c1047e32526a7e74290e16f2dd75d81d1410e7074151b197c2595826147b42952ef4bebd379f7755497b1419e2e1065feb914541d9a6a3852ced3ee8e11119a69c7fedab3a523e1b59c001df8d9793442e32418c8a84c963a2357f195859fe839af3170bcf4fb71fa3ed215eb376325323d8aad9f30e70696459fede453c505ac6d6d7a8d80a444cbcd918c015939c4c67c1ccec44df4c67a92049d805cd3715cef5f33673771406465552015e861b56fd933bc5abb074e109dde07d12b59bacbd70b8190a8aed9874580ce2abfb34b9b39f4c80890218e44281aa090839c4ad1058f70305537eebd38f955576998ff7ecd180e741063f027236b404a181959143e190e318c989a988c2c8a06f082d5e2ed94713782428ff3fd693c449811bb8040e1ebb2aea91136b1a04253077b4a7afeb4330b91a26b04c7a95abd80cf5da8531a0711a4390947372971162614bb822f4e24980d6573fa88c56967722c12c1901316723780acf6fa67b2a4de0c85236e3486717ee4107f88d6f62c564ad4b4c07126c05ffbe783bce2f663851588ff6ac3485e2bc9e8abc8450c4ae2896458dae71fc9580e3c933bf9490ff8b78566d9ef36281bc09a778fb5117349fba4f3f792cc15c42e8df1f04a672a01792c6c50cc982c861e99e4165f55dee0d37033bb6893e87e2020effce1fb606cf90b551214f040c201aa2e4811b325ba7af22d11e83b019a6fcc8efc5d06061b15012a619a8192e7889389a3e4ea119e8e3cc0377d9676c14e21f34833b9a4a903d84c1ffe98fd2aa4a6e2da30c51d41e9a204205551ccd54b7f77402271d8502bd01dcc0118cbbf6d0be5c5be2e144333b82760f112683813195055d80525736e5a2a67569f094e21dd2ff9d9aa0f8cc4939c63445356b02182ee8242f126d97e7a52a68702dcee626d06a711b489593cfa77045e9c8efe5fbc5904e54013a4944f1efd0d08258949574d2dc8a370f97594f3ac9fc415e465949a8755e4f0add4803f02d7b0b13a7deeaafd3c5b3705a88b95ec24918f8f374916c4c106044d34d5dd4d51775e4ee0d05f656f64204f9649f7370023387234172cc6540310211bba5a434044d6fb2d3b5cf14ad65f9c935252df51daa0d6d22073c536e003a5dd16cecdc1b774ded9b93c033524c9aaa2da207d849a3d232ce9110e9d3146b7bb01a9c2bd04af3f28608207c20c332b8e89e31aee5140c2c6751fb7b2d6e75995ae4caaec728cdb4940e3da7e0ec68130f5342027860cade0b11ca7049e07cf26747b0d0935334d5ec2ac5fcd44024794fabd7bd2c270117f9b315f872fdea63ed4bd54b7b9571b11008f8bc35eeb0a6d20131f7db968a06940d4cebd2c3919bef165a609f6a7d7eb2f5fe18e547931e769610203f846faf67033b76c3ce9ba70a9e52e9f0d588f1113b2e76a4e6267d6553b134e96bf0b2a40ad812aa8367a5894c768d0c7241dc617aca62b6f11036a05e51265ec967518e2d62cc36947aed16bf82864d33db7815e6947c9d2730cd8631671976c2939e50a57d75a0959f85ee25fa06bbe5415796112ede653ecfc156741e023b7f572c5db03b80a4480cd5b7c515e7e215491a5caf6225075cac098ff41212b1ce7fb0fadd7f19c34905bf571a620f9f91d9a8bff6277f936c0f7b4f2f8a02b2a9af1fbea5878820ef081e4fa38aa16f7be3676f62d81623802269a6b44aa1b54cda1bcd20cb0a939ba102e3baadebd0789d0e2b935eca66f3abf5a4578ec38a61094797f8d835f7bd8ce830882dd7ae6fb75b899b0bf525674b5f1bffe8f8c0a545010bde9fb1602936b76575231d1f0374fabfe70849cc1dbf7f0c751749f3f107922dcd78dd9d9a8f02443e7f94e59a389e5e4a7d4e5735d963a10727615e45ff492b522e3bb11823399affd8ed87bc682413b13d45ac6a0af2838792da1b9d875e972bd4c2cba61602b8eb7264ad28b694ddce602c2e20046c01092300a2406afe9e1be20083f89c57474d657c39adb65e81313a8953dc1484f19e2a9f268ab0ebdc444d4b7ca1bc1c43269c8429c2ea709eb8093c2ab8b98e9d18f922d59b6b72731492ff8d5bc4bc4f044b56f67dbdcb78aa3f4710e905a9f05835ae19ef34592dcd6f2e673e34ee7602090d3025561ba863511890c0a45c70b0792009b44ac8563e25835c21a6131daa0e6d826a8f28411f691058a6490f3ad1897b7e50fd2ce5829910202b9ec8d6504ee0e5ff0e5505b979c73d371a9a9f16ae81a957b5aa7280578c44c6413698c0c439a7ba4a5c2844c0d421b77a084da763a384e8c17e7336bc53d4222951135f6308e55e34d4b81c1e8e86b8a5fcaa4b8b62b4d81c7a8d69fa351f1b40b7c355c2fa6db67b7b8fbbe5723f6342775e904aebadbb17863e528ab2097a8bfabed1d95b75d2e35e922b3cfb1cbd353b6c5c196d2f5167b6bbb174135c095d57ebab78e62eec9cb61f9631d5c65381efae4b0fb0829bc0689a2b38c2a3e472ad72066393c47be60a775a1d6294b471d08c8211ddec7af0ac6f698c3b039ef313fc290c1c131f38462a76cc5b92d5837dafbcf10a3ec010a6b574251f36a5e350b0c0b401a1b07c1050f4334d5f773c4a0a2ad77394d7de93e749930bfeca6bb4cab3d594cb00e635dbe5996ccbe5c8f2fa55f41dbad8cc6ecf098e120b791d17f2b0ec29412c13c0bd39b6d2041118952532136c766aa2f611db284473a02084a80ee63013b46caf396d8e1418e53043938d8819ece30542cb1a2f09ced678597275e39a1ebcd2b26b1d138705ace214e0559cb55ad24d49c22f8b17cea35cce0bacdb96a52d258d80426d651127638ba54f8320674851b1c6586827220de439733fdecc35fe0801eb0aa070145966c77fdc10fab8603c1df521966d0d1c74975d36bc8f2fd32fdbfd545d90ba0ca7fc8e0b13718301ee71d44866f6c4e3c61a66f57cc795f3c324302c67c759c5e6b8201a607ffddd057d860876ef8ec10e7fd257909d3d1bc79b4548769dde8af075951ce7ab0209050da15d27f2c47c76cab5f3ba3d9fc6356ffe6ce3b225bedd51c36f9f7bb7dc813d6bdcaf48739f57a042099358a07018113a739d6fde3d5f96ed6153466a2ee3c7746e7ace89a14e0eb8f7632287d5f03d8e4354559dcbeb4cc66bdd1a52dc1eafeeb45223ac97fe9ddef8aa6efc3b33bb584f520e25cd74232cf07960b2b28e40e8ec609ca670b33ddb2290e90b00219a6718564d341a12a14466652d0e28409ab855a7ba7de8fcc85cec2aa15702effbf6eeeebd52ab73db7d8e5aa0c988f9982010a5a1089efef44d9c41d6f3551dc36a5d929f00e88ea91b18eac74749a69a5d3d1eb85d7a8eafa269bad3dcd36ed0a2d0d52a42af300aa223d1d491570191df0116578348055a2f354ff86ef51c7a49ff6ef6af6f7be5d0a1b489c81245a703eb01eed0cac021910b3ee6cfd5021929f561588d0db10c6611d186c0ee08ab7efd53cf4e353233f4f7e0a1a81d566326aced3478bd3c0d70c0395fa341ae32bd5a1aa6652253c4663e0cf810fffe471eae4819252173e2975a848c373faafa8c5e3e8260f098e6430c8dcbb3722d83a5d5097fd7b27e72fb0524c6d4daa47bf53fe275b20379c45cb796713ac9375416cb68614c42a5bbb8de564ef1427b339cbc8265e83cf239be606ee5b4f8c9981b6f396d359ff894c1576189138a4c574c626d1c9b809c036cd3eb7a0728aeee28b2a23d2355808395b45184e5dfd606d416e2682408a8927daba36ee9ae01694bb21edd32213fab99205ba8064427a13ef9e73864bd76f8fa191174dd830a9590852314c6fdbdd1d659a006f1bac45f4ce71cd2d910a19d778e2421da3fb7f81731fae28d6068ffc3bd1fcee28ab4e66712020abc9517ff6ad8ed93c3bc09b8d760ab78d614c27449443db2b1f5ffe9d585ffe7752400a5830a852f9c4d1807bd1c65bc4bbeca9b8416115bb3471fdd67e9e50027b8f3141a8682e7300a34aa667abb40f9f0f592e207e26bde2b8e5e42fc50f15ff8dfdb9466d0074cf46bbbcecbb5806494c6f8859965970c20953cb86a870ca5bfd8b7959c7a96da4a254c1664af560e3d94d6f42cd8951e753a9517ac955b511fcf6a583a3e37f246fb02f9d9ebacd189fcd59ccb70aded7fd29453a1c42d742ab113e9c12c75fefe0805272b0fa21332da7472024b0b57fb7deaeab13dacbb803f6eee27e2c829b893c2f62b1f337d32c5472f278eb8601981a67d9082c3a326b90514d5e11e18a423dd594c7fedb3ccb963ab2cacacd42996ca1bd279ce00b15870d5a70fd63bf9e0e71316f64e8639f9f6799064aa702c5d30f9227e5d20e631cb1867738f0f00c1b0144dd040e4e543dbce8789bdf23706f1cdf32972c9880fde9a0759d4ba36d49102e8da790a58e21e2c3b68527f6a718e5b51961dffdfb81319134a96e74bc84cf521b84c01f0d09936c08e87554e0d5165f827823841e7c242a86959effd761ff574fef02ad3d391e1f93441f3a0a424ea9cf0df6c528a8d52f781d70b33cd0ff0be2e0d4be2eda3d2d3575b15c9ab911804f5f2867a7e5e936e5f15215a3d207a6dc84cb085054d81f85030d93cdeffcb44a282eac326f4e2bdbac70650b53febfa13496490857e7756d064134ae2eb1d9cda8847961a9d86fdec4b7242bd448a806f416d0b283f04989e786aa349e4241f6f7321dd33e022ce493a566c984168d124023a157d29d03a4192d8e12433377576b79d2c43fef677c398d0238b87c049ea15aa753e0035d366e8e07af580e7c08d54770061fb786bc26e4e67c069be91a9c81873b517516148d4980d0569db04485031af290d217649b728c7580801ca7354d4b629d1ac04cc36730aaa1e6012f03ebdee34d9beb6099ca899d054a6d1b451fa4fc1a1bebeb8cd9e82fca947ec62edf8d6d53e847019ae504bcc06adf9c19f64b9f44104fd55c0f0b73388e47b5996dbdce532c11c1eb4848ce556d106cdeb4f505718bdb7914b3e680032b84af2c1bd38bbc307723f3b3bee32be1c72c3e254ef3bccae0ae8251098d047e1f7d2d90cc2b0fbbd829b37fde62086cdff25d87cef6706b0d9fe1e41cd7b7f3300cbf6ff0868dff59b83586cbfb7071423d39ca301e61b9518034a9f46f933658f478cbf685c4408af6ade7c27899ac1a8e32bf0caf8eaa7a53da0f7255e182c137a7295eb7be3067b1e46981af57bddbaf7e232f2818db64b2b85ee0ae1300128862b3b7672c23b154ee0f4ecce5b343d7db28f9da406c555eccb0c4c5fc55b4a00cd8e90844b64606d0dc5cee5fe7ece94b9e88b5d45570b130ba034ef2909256cea4ed520f8c133b5ae8e62b1bd9351955e1c88436886932dea7f48738d44ac5335b9b2f83fe91472fb87eb10f2fd9eeb90bc9eb64dccf33ac8ddf7385e09e766b568048ac77c61eb4f6fbe081a0705996c77a828a487e7771891c018048f5bd4952e7f9f9eaa5de7a2241da6d35a17df407255ef856f66597716715e3130d2c36473681b9a468a518b7df9647a99974b8d444bd8f0e14eb38753e3383c7ca4030d85c73c5d0a4f2355740bc82ed148cddf4e4f95043c349709ad5895eea6bcbb5ba254f08b8c80b0018bde55f2ef97607243712e3a77c2d74e47684666ed16502bae4ca157bed7ff768396428289d8d964c9b0438130543e35afc7d6e5b2ac22582637c79dc021b787228ee7044c92e2cb9e87f78e4c7e4abc02d5a04bfc3119e484151a7f99b53af0651c250d4067a92658e743f04da4de4206c9808777671d22baadd37590c188677f12fb4991c37f8376700a534fbc1fd15a2ef83d7893bf582c2090b358fc71372d6a7a3293f14e434b4a27ccb315f3ed53a7f0badded64a70278bdb14d49533689a8792ab654d8f055c97daf3085875d129ed0ad172d02e44616c609bb8dbbbdd98b13a181a028cbcc6601cc95808679b423087a6e7fa33e832040695fe8a06c08e877f3ed4407df9d1ae330bc1d8036f10c027c3f29876778d8029d0837b93bf3a6d50516f2f8d358b7a2a57f2ea063dd103aba3296c4449cb9627d0483dfb1b0a7378b33dde07b0daeda48e6dce009f95180400f5f026172fc4bf7630e63140ad4d91a8c6d646d370426a111ebf75dc7c04a5082bde09802db769782e22a3835be115c7d00a70e79f370df6f5c79ab1212ecd5f190387dc189302ba8f8f86ba5d3e8d352ea03b2c2eee90923a697dad899e99b4071cb842c3fffe699db0fdf226e42b514616c706be77afce25b289a482cf31657ce16090c785740cf5ebec425c7baf9c2809e2124d06230efce0046348a0e074d6a971c71677092b05563d35a2433aeb784e396a4efa5a7d3d68ae02deecc302aad7671b80cc0dfc1f9fbef75c9046af9c1fe2259cca0d1d7a0c2f7c17079d9d1878478e288b36967894bde2509ee0699aa85087be868349b4f1265df66f693b81830813031a90f5bc830cdb910eaeece3733c3982669a01550673bfdf441b7752769c0cda26b902d44bfc4349f5f53678203b16a6b0915811ae106086c53e91d3f12a7d8520b5f20fede96aa885084948063127162125408b40557fabeb1b0a95a2898526935143c5e423fff817c3ccef857d35815241f175a6079d4b1c1edd088dde4a271eb6f3f7601bb6628a4690ec7c32523b349d58723eb791faf552dc659cedbede825d67c4a43dba76f973ebee3af4f2407490f7fc97be0d79b2a1463f40955d3ed2486e00c4595e5f1d2a34e4c1a451d8a675b4d860f5b35c621af1c1f309a8abc4a5f844e5ba209da4312187d3b088c5b5ba68eafed9e5f331a856e492fabbded635b0add2555925afa4da87b063d1ca717ad059e6076f8da0d0276c8e19c2ead6076662ba0d6d4993b8ce6c8b738acd0ece27480d0db415d15e4388dbfac303b0db084da51e289b5d01997c44780cf47078757aefb52861a48c6e9d4f91391f57dcc1dec96129d6ee13695981bbb300fbe4ff6ff1b32340d6139c52af84eb83d6fb96b3c8d88a28961d9019704451ab1aece331ee87d75388b4760b79210fe86faa9a42e29a5688721174cb75aa44c30881642a38d4e7d5bf1279dbbc02e26d7a00cdf4de6c6590b69d0002eb1eeb132630030df06261b86a13fb2ab0940d50c460a9f9c0aa1b9e4770c68bdbac9310b530912554960b8cec901461918c55976a79ff3e77d3a2e54c3d340d504c68c67c13349aed262cba9de516a464323d24a084195e957a6770e5c4f22d20479ebd182c4586d9358240c43ca562d3c1a551b31eb32985289414c526f0d9bbdc02723a42b3668b3762ea6702ffdc083aebca7e3aaa66824ff1921592d0eeb1abe41e280f213ea8754abc07f77f565a671a05b305f02703f4c5d1d61cdff79ffb14ffa2edee75ddd514837eb493a749a1f08be1bd1a2f4a67e41bce8163d267d704a97154d04f8de058a5f2f6c6ee0aa640edae4885789fc2ac86cd7407f79b6e4735916ae83e13c3c7c869b3c22638d7035fa2f9e0a58b8a238af580fceb9c0ef8e08a38f29fe255f2116af5c8f53eb933d2f0c4280a0859717b3d9fef01d6b9a7cacd3f0a6f25fc6cbf4cedcc3824ef7ad12b1599a4adb6612c03b69b388e9be198c10ef121e50d02bf4715357af866cfbb3d7ad454df1ce74840a6cd7ef5d7c1f4e8d5b494c4afff1973a39164c142432a24529ccd4702734438b1c9f6b7636a383d0b1729913a1d91c8d68fb585ac263f47ed71e9ba477de8b781c8c7897060396021cdad131168a17d6c9ce245f2ebed2224157bf79c36f550268961922c3a3c8a2497b44f6706174f4555f0147a9d926f967a51249cd6d50fab4e6be425a4cd4ae7c566dbc1fc6bc6c0861072ffc14f3bb01f9ed6274b7174057021e9ad60b8e1f805c87f333d3c83e9bb16b5cb60b00cb09f9d74be725927e5a74f63f778fb0f83eec38f99444823dc27f75ce592019588213037bce147cafac57699b9c701f4f1173f9730e99e7859e262c1de38822b3c1bcd94e5cd053b8962ee279040773dbc0e90a02aa9fab27355f3efedb96f0b634aa00bd8968f7402c39b5ac0001f2995fcda293e2bd9b8486338095b29e7a6228ff54ca323b6f11cf16fbd9bfd5a8c8fdb5054d8b2e5103ce48436affdb34328680cb63439afa914fd0b98647753638dc1642c2726f2daaddefe04ef2a6a132223f26afe164edc87a8d51e1a49ac06f628cbbd639341c569891b7f21b6f45cc5a52458e0f8ec6faf19c9767135b5d4ac984f59cd9333e629867c20576f06411532ddae75b2895251878d49145dbeba13aee926d5eaa25d335b504c1b852e132b58ec40559345dd902cba22f6bfaf5cef29ded0f61713ea6848eab1abc177c01b11f794b2e60de88e93fd180b153211d3d5abb1809f863113f369c9603ba86e42b844806c8f4d4ac84375aad38a0185e452eaadece16725bcd3082a9a1deae1c7c20e70690a989a4ead9567a4d01772be12000c78bd656c46616c9b5eaccbba2f4a2686a7397837dc837e89c441dbef5dc0104f67216df9d1293967fdd37a3531ca7b3f89da5f46b21eeb1411a10b33e6f99ac06122f23e679cb70898fd883cfd8e2cd4e01aea47af238d1e2aa7cda15be4833d45784cb0c0e72be9eb808a972dec011bb1b7c5c80c65a722e9d86257369d1e5cb44d4e62a952ddf3b26ea86ea73ce9cd12178c26f2121de5aeac2fe7ce6c5a0ac8475ce391e865ab59c7019add86e6fa259e33dc74e44491f958c004a3d1d8ae0aa1419e3416d80b7658bb96d60521ba27fae8f2f90a0f01c844bc82ce7ba73ac933053430f81ba9f68b392326f345a935de4accf1beedb58873547327392d31a4c66b7aff34fd37f8c630b2b4db08fc1b4fc8bbc9503d33abdcd35f01c58df1d18f5707fd9d4fde68423ab850d3c28b8f96a0a79cabf85525820bf792f837e598af646a5fbe24a13effd5b20545c01470a6592799be48e5d0641a183e752fa7a992fba7fa794c9054203310f5c0821d30969b7655c888f225534ddced5233e136b68cf42d9599764b5bc6794181d32a45ccfe155f4dd5618d7826f89fe90ab48b1a3250bf0eaf0d8ee9327d3e68abae71b39c620ba2a9d7c98c28310160ae9527db9836fa0a518d1233f5373c91ab7d351068a0c8b084347a1c5cb2f99de4451787ec6cbc0ee0ec2f8e636b8eb000694ddd66ba8ad28d703336b272be12ed4f1388b28cd8ae6fd117b6c002b82ca933aea2f616363250a7ea33b57e2e6723a8bfcdacd2a7d77bd680c206cf5ee3ddb2526c186b85308571effe476fcf2e4b56014da71a571511fd271dce563d2201c34994ef3fcf677b0cbde43dc525117b10280efb7b6a2ac6f465751779b2e3a868b6d8bc88c2fc365cb8edcc2401d2233c74fb4b5b704a79772e64cf9dad4721f0dc20be9a2f10bc784ab4ad8f4109df0324de9a8dbbbd28aae44f9052eba18f6428ee58503d5cb5499029f0188338e41838f7d598aeb3d196bbc10879f70859be7e630948e1bdcdf403755fcbf51a0425d92d3161cbd622402d0832a7787616d7b319587ed06feaeaaea23feca7a40871c81153e0d214e5f99d2d72b3f75cf9ac109ef2f08d25467ffd6f453cdab4eac3e8f901b92ecdddf37d167882aa0f3580ae7ef9c303be7a65aaf90df717338fe9bb2fdeb363bc31aacd7010ebce5df9b13a86a60defe1d3762ce7eef1b71ed5f38b08f91ae2eced9a662bb72959beb8d49418b332a69e14bf72241df9a6da854658399d79239322eebf3ff7e2608a7d6d4189699d3ee506e67203fae32fe9f672d9b77306e0aa8a91a26e0d543c52caf5421ec1e3b43fcb82eaa68306435d4214aac40b749f6f0aad57030496cf8cab92fcab53b5ab0a292d8ef19b8e577b7a25634f30b7cd8cbfa81687a0770556a18851baad0abfd25d63247cca3a9e1418d69834c91e26cab0b20b280670f6505dbb8cc45ab30d0883807b335e8f36bab0b43d58df36eb1e748462efcc50257552aa815884fb9cc52d60c71a136ff17572aa828d2b558ba41d4a9bbb08a21b654dac370c9f30d9f4b48ebc04acde0d4466bf2fc81e3633b0e56beb014de2b2a8ee32494b3799f59f389a41dd7acdcf8fb9bf74b327a4cbda03b40c1a11aa7c1b2cbb2fa69379815718a464631f3aee02c181583e8bc4b5c38efffb2fff46f974c228b7a66ce29599c55aa1d234914de67ff661ed2004f9395e7fe950173c16452c12eb4b062691c4b8df195a35e9310992012b262e31c4d621443a470fe40837a3ecd863fe37d4a8d4f09353854f836ac893750770f38ad4fb6d654ba58c276e16eefd68a1b08bc408825489e22991981d99d99defad6d3a43fdc48ed84b313bb81d97cfe396a57671df4d4e51d78e83b0f7fe8b8076ff4ee234e860f523fc1ca4081a1ec6038fd281519e2b114f006eafd945dc3594fa5c210ed0fe9b69b52c7f714d89bb09d8789eda761f57e9e902dd3481fa31472d20167a6012e4669a2a48362640af97059cd8a99438e310d92494a5a660e34631a76cfa4efc3d4d0f7345427740f3810ce36b64c55aa1670d027db20a3aaa481c08176b6c1355569c180835a650b9ba82b9c001a62bd3e889a458266e7446d7801cbe6a3127f2c81069f3b6f4d8a00c3dadfd2a629b3e4d36a3d146ab451544409f8c795c3f9247c888490b14dc0f185c1d6822c38f8ae7d99b03039993186c20a21c39d5378a3400616b469bf26589866e6184389428829ed04838bce9262810d366a41ed3dc69cb7a108282d10d8b1a3d34f1e6d33930fc6e44d21bac483f181742ad9112058bb5b6a3f6399caab1d0d3d9faa2c1fcfdd36f658cb98ab26443c88c41e6ae7144411ca2962334b794c3afac1464f3d573a5aa9452a419f99dd45adc607b7e47c9e6abfe5561b9b8a46161ba4b59f05fd48fb4cca2d0815d9e70fe9d8b727c8953bc21c8f7193db559b4321d80663002fa75db3a28ff7ba25fc824edc226b5a5aff946327ad785a607a2091fa60f5f238146309c74e6e4c0614f034c11d24e1a96d67a5cfa3102b5c526eb621312f16fa0c2aba6cccc376a1668f5db80d74e7a69b8c71b9af0f32e61a171d9411ba4ea19a4b959d1c182cee9cf1971a928b009fd80c65ef3937908d3ae4bf0cffce0e90a14c90c8d4c28fb106a5da4f6358c8de808d1d81a9c6a5fac83c1af47fa61b5c1a749fa6998cbbd480eda5007513f2c20c2f86531e2415fa593799686dc5b6809f3596ec3fd729d5d34c8744b75ca6d4ca8b0090f8db9fd721db83dc59e6d6e9532897f4754125a525ad32b12772bf9df6846a6c6f70f0e6a0ad5e9de9b9bdda080702e00d2fc02268283a61045c075addc347a70b05df9d7a274c0870ac7b45fe06da5064960d1577cf498c1632f78a75c5b81535848959165aa539f03bc197ad09fd56a41c34b450777ccf92a88662935b98138ed6a568f098f1b1fe9ee86b0121f631560670c4b659a5a9f8b37d49a722b76c970cc0528e464df435f46ba5ae2a648991890c248f159074e301cd6410317e8ede5d48de05552dbce39f6ffb8a494b24c4f67797534e94de9261c21784ce72255ae03265cd6edc25d33df94a38517aeae06f8d05904dde762f95a532f3f289aade41f518b9a3b9fa784edef2334641fd817c2b7b07b1f2cd61b0033c85312e4693f42ca45cb78f235012d1659c395a0fd3b7c16b991647f58b6282c2241f8b44cc46cf3a4b1bc4b5397ea7cf9157229e7394066bdad09c0f0df1853a9d761124cb82a7129401e68ba67a0f33313c47ac78023b5efde170d1ba89247b657686cc7bafde5e865f9ea0b21afe74c3246b0f6da082aba97d9da2fd33b7a1c1c0a47d092dab748e58d54e0dee8eae536f77848b5836905a1b9582c31f75e3deacb17a22c8d18e4091b58b26ce7f5f6dacf2666e029d2bea2431b95c21a08b5a20eb1ceed43db449e454b296a18e53e2a25b616f38fe54be539d56f7e3a6e92256a22d270e1e4df8ff4d088d953317156c777c1ab09bce25ded3b7e2019080f1804d2b2766894218c51dcb6e0f515eec490dd169c70f84f30a8897a1024518e1e6301e35e7a92a2aecd268a3a8d5507e9d970aa24316f492f3e655a2e4f2ca1def252bc427aff3eda89cc4f98ebcd2a6e425d73479d55e535e492f2f46f806b3053ea31d715f3b0552530e023c7da47152f3f55c2d045b1dcfd9399208dfc8cfdf3d1766055e04595479c165894ff6e076a052e8a0876dcdd0497f66aea50afeee953add8b8e641a9c8494c74717f0b54ca397794be915495cc0373aea7cf2b22b5eea15183396075f98bdfb30c60a0078146737b4ea348ab2d4c881e5c7c1f1dc4bd0f28ecb65ed584133872840fb7a72b5afbfa5e425d573a2141e8a18da77065960eba8414f75fc742bdc638cff96a550d484e984c417e98c5961495f1d5ae81d03a0f6fdd19bc8af57cae63d508a8337f148531e1da0393b5d3183179e1d3c6f2344ac130bf4c04c5becae98e70a300a5e7df7b1b08cee5d76a6771913da2e83a32ccd2d51535e28dc6241752f85b71b5d84fb2cb305a1761184ad4c1f5ea0dd52d672a107813cb6a0bfd8b26396bcbe09731989d0f2cff55cf6a0fdd8a2b242de26b3049419875523ecaae138baf5308883dd23213e3532bb260d1815223bf047dbf668a2576ccb7f2aec7f24fd37f73c3649e74cf159659dea29b35de2e05c39ff902c8cee72d4861c50b137fe75ae67e99d537f4d571c45d33b03c4032c5115344d0d42db896ad1d7fc8ec8a85d06c7514a8287b0fd9a04e7aede1b619752a0ea7befbb2536534e54a7372bd4b37ff33b2bf3719716f7da2e899a57dfe3f278c9213576a53e53d71dd8cb4fe2368b3285059c005cb1ee446c651e9470593c97949dd5c65ae5ab9aa47532e1515ee6207be7443cdc2391398d68a947aff161df0d6ed39db4464968288fd7762c1d92dd0c6faeedeb5e4d3d821f46d323b028a944b972033ab7fe886418c158ce79b09b651281544c003cb05b755f6b2591a5965001327bfcc433f86a324e0dc35296a38b273e7ad055d393508dbb327ed2e2fe5c9e1d3cb9867db8c56f474f4936c7d1f05abf9f4dd936ab4145e644683699dd42c878ad2dce3c7f4b479c501f520dc7520b71bbd4613f9cf335e57749c58394f99fa2ea7be0b941d4fd6204925a4e032bae3e052c5a16977663c7eaf1702354d77e43fb0b2a1bd3510d5742fb0eaa4700ec1bd57dc4b1fce8d6cba557058ef38eee78a1d46340f70bb4449370c3ab700afe6ce3989d4a0ef4c71063f5141cb9669937cd960d07451e0f024ca50b3a1c94ac1dc9a7e3c5aca74550c3f68ab48535d4f5d001e7ec3e1cd2e1b8c11a57a5a410e8eb77445ad6c22b0b700507fb39dfa4f71275df537df98efcf410c0ce196d9e4daa00d9da7d05b309fc7e5e40f4ea5f880c642b6244dc02a866361836234fa233b71a6d09a00e2a809ead19bac41dbc67390176114c851b75cb4313a5308194943fa25c80ecf8d0973903a41e536f54721300327cfba4681cc09201e6239625fdd68f87f3210074ceb643e57e863328a8c8a9e2adfa437cc2d2a8da1e8d971737f7870f74516548f93dbb4ee2a68b82f4753ba6a590e7180141ee5e2e58b1496e244a068a467fc49471f2a7e7f4c69031dab1e1413ae417cae6a98041d86776827e203166cf2934a633a5461ed256107d3dff9b12fa7122dafb1e69345480856ed0f20922ff60eb21df1bb9f10acf9725b6a4d7d91268f3588ce525b8ad0f00db26a5fa7fa1055ce7689c0544990bae03cfc07e1a971ec9230259e11198988a276e1c8353609a5b72604309a13535ebc8b577634d9f22a2ead406be786266136d7bc99a1ffa01e763c108fc0615ba2db4c5b059d6840f7c8d394617c8a889fb3a80f73f5b9ab04e521e2225bec14aff8a6986471683c31b926462220ca8d9e7fa13d72deeb6d282cc21722ad2da00b4f1801d26d9f17938bb6f8fb3751b4e61207ae3a66632a623dc42039ab13a294eaf64b03955ead407d14931322ad7f7da4305e66ea90ad494a8e8ec0e311c4e12386f2b6290f9afc9343bebbb035a575cc851457607cb362920c68cac42cb5bdef6d9b7baab408cc0ae3719a4c58e833b2eb37f020e04d69a7474291f835caddd243c86fc05364359a18d203f5ab289b9ae2cb2fc7c6be673e3d38b300c1234c27406b7283a9c52a3d131a8dbf8363e7d4b5b3a32ae114839485df4a8c51ab6b0746d52f366640da6938a31bb8b8644074cb21e7a5da8bbf1a789235aedb53df88ed2c16f3ebe4c07ceef1ea6d0c57f0247d041e74bae810249f7333f860e5ee3a317c5b12a6007eb388b4eee9fdc4f4047e66103bed135c341735a4d2d462507ca603fca08b4d7e6f9d3578e59e3157253bc2240e30dc02dc4f44fda40e7553c11b50d0ce719045bcc05e99cbbf493927bbc856e21107a5c9da3018e71853c4e39a144bb6fd35f52b663553b464e808e41155e5bd629849e2e9a9ea4738614462746dbe1e5d80d591cd400cd8e1b929abab68569cb04310bcdd6928bf818b032dfc23be4d3b3c50831a5c2c1e574452a669905c5bffd61514117ada2f71d6db32f51ca9891c1a8d75dca52778547eb0873ccc6dde2877d3ead3e41dd1369f8a198cb7331e0ec15be6d79d0f7a2e386d890b7c9f1e419fe2c055c340665445e9703a3e083c770929c97e74c1d6971683b2a8f9a4d09d522d774f092da0cda7770cb4ed57bbf255620824b9a60e204661c1b7a04be85b00152d610ade7b375e5172aa852c56bb861ea6b200f1779c1c8f4e0f65e1fa27eed03c91b3fecdb91aeac20632bbeecccadb7b5a4a249b0ca85fd1cfb4bd246ca9d3daa69ba755987d83a961485ca1a838ed18bf9e120ec6259222284a21963f48d91fd094e24839abb136dddcc0b6ac6ec8b0dcc0d8fc5cd7c8ce93c7d4834caf091ca9f4b75d00ba06fd1a4903eeb1df894e686bac59aa224a133d2eb6cb6e0ffd43380ebc51c433bc7982ea69832def4161c3cfd7bcbd39531974f2c2481dfb99579d8ea68b319ccb9e229dc2391fd1503eab0c168bb5bc453bc0a655e17283e88b8d3144121447752ed6a020d0a9ed5cf9c8f96ddc02f1ec33faa0cb9f1aeabc2ac8b9f9498e3291d45c650c0918f3d2588d6f8829bc633af2ca1008e7841d4ff7569ef89fc3aaf9b78b54646f725f36670b07dd3b51efc564999a2f0e888b9aee1febb42f0d25b75a8e69d782d1b84fd1a42d82f1e89d478c6935893010416eaea26a137e2239d21cebdcf75c2fa2666bd2b5e85f6a975507f1daebb3e1e62c76b927bc1c10168a0b857d03852129466d223f8b5b91825ba843c59b26b6c05f2266488a0a993eda6754d9662fd363ed51918b4dfe100fa7a09f91580e81b757e4d1e51bcbb1689552ba3b497a1fbd9ac5f2e4eabe1fca0df1f60e1aff86cf6ac008878bf299376f1f30c4ed592d5fd7c54ba9cf6a4c8a72f5fd4951f263dac02eaee29b059d8e57f18ee1db5027abca2ebd108470edc42170e30966bdfb7b84913ab48edaae3ba9eff5d59f5b578cbfe618d475394ca246bb253fedf598da2ce729c36878035c4712e3127a829c7910b30d1043395174535b4b145e2df72da433caa71f738a2377c752bd4ddc4680c2dd5c6591dba419759c9fdbd8f82a84180ce2cbb6285dd52a5dd2ac7eada7070c6df6af0da29d4bca05cf0b441e79f4f2fb04f6385e2b988a6c0f618fa62ebc0135cc0a4b7a16e0dc271d160c18280ccbcf24f2fa3e3f45faa861277a5639012baf04af35a3b9a7a43dbae302e79b80d7b9e642fde882a9ac1b3d9bc88bb4998a885619ab5cb7c7960ea526978e4dc6a2b7b95527785c9a05e97cab5cdb179d604f6c7a7d20f80fe6e2d58a77a909d61fbeecc4ce1f44cbf926e5e5dc0a5e6e6e35fcfce693dcf721c029b64ff961fa2617078d9abbd3ccc37c76be33ed24295209ebe7dec39723e78497b4a2ad4934aff3ba214328073a38e318e4a46d0246d9297c8bfa95d3d8b125248209ee0d457ea0f47438f08fdf9cccc1883fd86b540e95fb775b0b834197437aa05f7af97620fa5b054609a72c3718a0bdbe63285db354e02b28f16fd9e47b46ff6d781f349f5a3f7f51be0a243aa8f26eab4fd6949a46741d37a2ba378213f75e23afab4bd8d5d32c91da32291468545a01f9a16ba48d3ecef063b2b884785cbcf8996f32e6f3995877b73cf93b895e43b1fae0f9c725ebdee39c0c8b0ee8e415f2091bdb18039958fbc3a08884cac7182639b43767a543eb08cb9ce384e597eeaf3bf0739f348467c38788f2664448723e63859e3d00d2a24b97964439ded3c0967f80fbcfbff38ed1deae501a417b820472a4a8ae1328100cf18a9284e8c3bc8ec2a2926d3e400c329b44eccf0fe47922c65e23fcf8b5d742481b64676661a6e2b1720048e0b898bbff6ebed7904a0cf8cee06c0a2f9c84c4d3394281042a8bde47ce9133df4075f72ea828a7d481545b5ea5722905acd95e58a313dc84ea94af6a5c96904feeedd2aa7d7fc0ec93b4404bf3b4893d3144752d2e404aa382507bd13eab01515013cd541753d87333d49c39affef264535c1e74090f3cb3d677de31dea1b93e2d77bb97b63d38ae7a1371f00055054bd2c19377a4404bbd14465aa0e3720e572705b4d8d7c7aeee5d78f03c0e75bcc79f9904821229a13719ab624ac466b67e5d8f0d8fbae7974ac13a26a40c1e3092e9536c5065352e9aaa7a33a2e8bc6bc826536825013eb3559e171334585132a67e9ee01ccf5c3ec92639b4d6e6b49c9c43646cf440f63be2db17526401b61b667cae963e56a1e0c4f60553c049513549ec3aad747eafcaa7d9042b48796527d0c0154ce548852955039f154f8819c32e5b4daa4b76991668660a9d8692bc129ccd995538854852dbc8e26d9a881923021c8e7023ea02d1e5fe06fec0302d50c10efb854524fb19c775606e6edfeef694517b553d3091975fe8d297ee38f941dd6a41f085864960f062345f048ea6b6e33a76ac8b83e7c9aed91b56237670242027e907ec071dbd5d327204576dd915e032248c2ccf6fa7ce9635d40a73c28d88601fe5eaa81aeeeaa04fc79d1655b08ef989a56f3c8a733a31163a707243df76903fb81d4e6bb1210ad71dd7a1cc8230e5f6e208b93503d2f5e0050de1a0ca98bfbf96b9d84d46e90a3b9578097ac53e01055c8b3b6cf5938d696381da9601084a32acc4b0057ede58752ebc4c0c46678ab4d065cbe226a93bd66952f118b59703e5d0da6229f411d605e99e190c780308aad24dfc02785cf853a71e4b0ad3628f053fd5b15843ac6f5b677650c5112e5bab50fc1bd19ba434894e72b0762cc0871dcfa3730107b89d960fc2d77e61424bb5e7d9c5adee0c9951964a603b0d9132ea34d734ba6e7a1118a2732b69e86fed8068c8197fbb0764db826e2973b8406f938173736655be7e19d28ce7d93c4f3b4ad62ed716d9d915fd086947940f74138a992e5a13901478a8e3beb6e7b766a058ec5b9e486696b657c53f4748b0327b652cc988c1369382e9b8d79de15740a594bb5635739348a75027109e1659b81f7dc62009ca68fcd25de8b4b0a5233db6b27186c5044f052c7489f790d9c05ae97f6a3bf08235d2fb2f30e3e2b985e164c73a2c3b45ce4e71f68168d7aaab1e0c53e265850405a7dd730e0893310c78918b52fc3c96946ab644e630cbb6e6d3bd88f24af07aa8260e11ffc7b4d0b9471075ceabed0fa719817787716db11aa14aafedfc11702304ece9578e033819c56e19ae9aad79cb7ce226acb71b8174cd6ea1e67ef2079d565ca92108e1c2727b9da701e053fb727e6a0fad0e9a2463648f6e4929a847769014752b2d9e302a988d07df3721e46c5fd47b3189f5ff47d9c774de0a7b30a24a0d7d5bf11b15c6e19295861bf97d933e5eec80d011a7dbe366aef094697ab3e397e59aa21dc44aa9e11ee8417730bd797ac43960c259e6d3ef922982e4c064f83504e672b5b3f10365f41e81526d18d0b907dfa89683e764bf581b4c5935ac47acac9a107cfe54c0cc961b99e7212fff5c433ab71066c082093a40ed1bc3ee5543825e318e905fa0fd3ac4ab407a3fa747ce80154e32332cebfa27f9ab77665a4ca79997491bcaaf075838339539057d1020ca7ab6ecaa9725e96724eb64d89b29004d8b4c0c98e8d0c9f70a03c304d9723cc0c1c2bc64d3692842a670b694e04865dc5bcc12223920f8132ffe0fc97ca000f9eeb9525b84ffabff8c701789d50d547cf3f5983ed55aa9c14b9619d6f4cea303f360075461c6eaa969c03d5a5f9e28354e64ee30c2c605f010a282918f3f18752e5646fbaad3d586198726a0b1335a5f290aaeace04b6e37dd65e3d08b46e69add9bc6bb0f8a420c782f5810c71062a09d723b207b8c778b7f80a79fd3ae4631a181f6e142fc05ae436d4030cb89e6877c2b28095cf1e0c2043c83a21775b4fa7b8170d5e949e7c04f04bdade499f24fc4281b768a2c722dfb2cfdd1036c5a48e32396b1f8e062ec8fd0549edf37d522769047712120692206032383779796832588c5a2364ea2d4fd083d4adef55c82c534b89f69de5f009b4c9368355b810cb209d3bdf8a009a46b865e244ba01424dcb1b7d4bb9304c82e52cc80f0e99a86e381844146ec6411eeee9db475e7dbb7063ec46bc0cbfa72447553def67ab9a9748351559384491f9c270a196d64cef42429536c7eb4c363693723ea393a49dbc2ba2d485a294229ac425e15c60826b001906eba297edd311e6b811378b4bcda14463a9638461e8fcf36124d984be3e47a47259722cd061f80bd9952f6a4febdeb14e7777624f611883a4f1cfc28874b5e42b38e01055406550728292f8dcf88c6450222b4e2705fbe25e2e421ca49a597eaebcec877b9d7fae5a3a9aad9d47192801ce5a68ab280ddcb1818826554339d451a5feb0dbd737b0bd052ae8c44b635e347c57cd164eed9133f37f6e66d5dd32e157b3216f05f22b8c00d4868085c5788c75b7e6143dadb8e687f3ec701948cafe641864cdd537147feacaefa41e745107be62278394a210f19b15269362e552016ad84de97051c2be50371d81207382dd2047200a15ab1e14bec50b0f6ad90685f8d338a5c43cae3198c6523ad0b5424e1397895f416fa02d0c63d035d907d0adb158382ae1f6078a8c5da3d816d05bb911b3eec059453ab46231485b40b718c3a750649abc2fc116d01bca7872966762604039e5e7778472142d9fc72dd71bab79388acd9c8922ebbf06e7e8927a2a73a095b531c061e16f2460c3326af60634b06c90cf1a02bd1c812a5c18c29cb488668cff04aad6eda9cab69e4aa09a68624a111328f1f14f55b93324285125b01a991e881459304ca62f451078a99190f392e945ced47a6996aa41f29eed68845f3ef16085f8db1b5df85f543d8fb7b9e0e58e5afeec059c2f98ddda4b300e4dc7dc2e18f5560aacc4f05e29fe97c181de209fa259264abc77a0468d9d7083fc8f283781008222ea35fd2b0ee60b8bfbf30db0d813e494c7f24208a66d040a021ad65c65093af478fa6a22983e7e3ef3489b15d039b79bd0b1aa548942f47ce02a340760050fe3b11b25e03a66833f3b6cba9509f0c94da9f4d582154a6e69b3035a9cc6481b63777a4c9a4de9d274170c642af788e0de31d70be4dd6ca9de7a1dbdca8a74797c36acb9f55af9a31255a4a52002c380448cb70011f215a686d873ae4d3f11f221a7c23502d995c95970c286260383c4d7fd68d3cd2bcea28aa866c76bf7f9d87e9c9e2b09ebb0895c85dd0c4eb074678c4a293adbe1184d46722974386513f4a7946f6ba5be1b5a484d7810bf54c5fbe1c3ab77e1ef7c40faa1eb3debbdb0422f743e3e9aa4883f70e5e71fde35ff37e862cbfb8c5ea17865c03986f526cd4afe4cccda8fd3fa02afd2fe4925c8a49ae26c757d3bd934ff085345d3ee69417a43f78bccf7ef0d16af2c8a5930e7e5bc4fbf1eb60aa9c308a973bf06ff45de931019e0cfc853dcae8e655b18d35a08acb3e667efefb57fc641358635aa5ab720dedebc0f2ebcfc35d06893f810bd10fe9749afa3ffcd3118011c2f13e8cdbbde79eed00f0a25bcf36d5551b90e39a56929dd99c08f41a85f232755f3ebacde3826350ad9df9e380a3c8cf7f86bebc69acfa84db7295e551d7112a0281756c6acafb36a0a4d3fbbaa2742b63b65a7eb2523a4294be0edcaa9eb37e5aace8dc2de960804f18c8f5e14194533aaf07b4e8c10545488073c6979c8de0738cd20a520fde68e969449337167f6fdf67f4d5f8dcbca46d06c2165110c5761fb4e38a4bd3866f9e8a0e2ac9879108d0a50a79d08bfc0af7367d25fb39d8b9434a042900a9af58fb5c63704a5352a21278d5e3f257e194f1cf9493386f61ac3e3b9e0686b6f9aea6f4d0294615fb3dea4f946b2c62ec590737409e9471b3e6be9c9599d429c43754f016dd0eb54fbee6eea7deac09351b549588d312b6eb51427733b7b8a714f4f082dc2cecb038f515929cb0e81272d00aeaceee7fc0b0479cd825cc140f4bbb70a77b91af2943539a5f79c610ab3a875e63606f7e8d919b3e8a83fa573211502da1d9037c49d60978b5489784cc40d2c5a04fafeac123ffc3c5f41dd1d6344f6e2214caf664f03464fa68b917bccd0c4be959c474173b6c1fd9107edb0faf36e4ca5c002207abb3d80dc5c2422cc50ce2897b76908a2dec171ec9606a74c8ba9cb2027990fe1ce8c146e67af4ee3e677961d9c70063203bbb85900b67a5043008077912c1bd6e711529a29d009db1ad4fe35af1d7a673e89d5e9732e07549db3e53a2bf1195eae6c17778d33fde3cebe70068e0007e986cee8da891965300e484f6b81c6b2c6b80d861c1ba49e0af68ece92259c651e54bf320346930bda632de151de7b7e8c56ecf7ef6e2fb6891a39e6f54ef96acf5988ee38f2857d844f5b5ff80a2648e3dbd358857587070beb23397bec5d4957570f289faa0d085683bb35b35c60dadf791be723b7cb3133658af8229b7cfc61aeef01cfef6314b55d67db45761fe8df3a484bababdf8f708e50c1de2c92a081aa9183ede86779aaaff950d596310a4704eaf735befca2f9bd7c6128351b4263218ae4dcb96b39535d80b1e609a8238869413192aaaf6dda587d9246c7cd3ca50b1d97a534373e610783471ab50e753de49d558fc15f3a89b451e80ff68041498f2c6a79ac69ed891a00b4fd3c411aa802eb79a50618174bd8778ae4bfe36b651bda3b3174079b9bd5a3fcd59f51b11f806e73adcd127687ef606a294a691bed68fe386bb08a7ea9bddabd50762e4bf0d38010685207954b721d1e15911393e6739d76dcdd8042112c80f16d3600507b4c503b55851e22f2806426a5b917a50345c4e985a4303723c63314c690ee12937c3e40702369bd49bf381ec043e08db7a75d2334dc72e107b145a7b911a10ecd91aa22bc8ffd95d12cdf212771ebfc581003d3ffaa03ff9e6b232909a8908e7c20b3f97eb71eb6ed7056024b692c9d1096f5fec40cee0f7222feb836245ee8a4720cdae0b185c1830a62733302939a490c609c9ac13f0d834fcbebee92b54dbdab71ddf5dfb5718967fe4f6ec14720bb048f25ff147b07aa772ada5b6390c3b39307038168b39a69d5dfc4ad9a905a9c77740bdb0650042ba4b16f9ce225e798b74c4fd91d015ec3b5d047a894c44e65b34b8e23e092475e3a8e2a4fd670571fee0811e40c821a1d0e97ed610e8ba97972faa7fdcf145746a151812c1c81e2950cddc7394d399a60cb0fd2a5ba7ee643e6a4505a938b6a422f35720449e7e99484928a6fb05515aac436a463fa77e09a7f4ccd89e6df712709426dee25f6d0dc9f3aa6b90fb0b969c3e6ea996df862732cfdd766dbc1ec6373a6cb71c65c82e820798909e7483258b28dd944b332aa9c350f3a1d2b881e7bb7fda7a81f7a03427978e65858d52f1cfe7ba18fa1bc2b21cff253ca80814895f163f972764cf7e0d9c2e2006882b1345d5dd3887bf5102d2b32d0171421bbd294665c3b7d9e2b136df25c230416a0c72bb21fc8e53839c9ff6e03ff36b4dd9f113f96c860161e50e7c6f90d005be56191d36c120c088b955d28486d161c4787c9f57a75ed62670caac7e9a69999e729e6fc0616f2a1c6e13fd2bb58427265fbd7b81b01e11eec0e2092821792cafc07b8d96ff5b12c4a5fb9ed12a97783c87d87a310caa70fd6b4bd015a9687ef78f4e8a3e6fe28288e43db7be232b64a4f169296ceea9b6e49c10031023dd6eac2273dd624f5980146243fd9f9e264d46e0f40a1e49004db6bbffeedc8001edd7c62a4d4e794547c6eafcfd42236ef21221003f598e1593e991a4194eb2ac3205936524b5399504733c5cc79b0d4721c563a19daa12a8c07fd4b45a6253d3e3c270dd412ff7b91be66397b8a92b851beb3acc8649390da9c38110da3a6f2bd428ce55015c4b621be3ed52c09507c1542cc61827e89824146a9c4a12a18798c0f788f0710abbd45f73d0ab3b1d1595c9a07baaf7f06ff5353d0c7e61f1dd0e32561e1a816a681270be7d08e5a3e47d238780fcb307e53ec81a393ab8e9f3827ee59084b96f29ce4c81ee29c563994d36adfa136812596232401c8659bbcd4c1d2620b62442fedf5605926e8c5309c66aa4df3b9e0f34c5649b2c0c97cb0338ef50b1797574a240d091ffc812222e481914202533ae379845389dd225d9751e6132c5e39e1528ab462b90822d1569d11f94a4d50cecc39e2c34c4f8b1887c834b67aa1624e7494b299c04f51cce66bfbe742452e81773d1391eb656eda3286e4cb32e9ed38d0271bf6b803ca0a949f934940ef3a1244379aef3595f82593205338c54377a8963f4627f27371b44c9bf4880bd5568143f6c08783d5c45e9ca6bfc3340e700d23a54710536b742e893ab7895f655c4cd09110af16c82e69d6f2497c09ac5e07c9830f9921df3e500fc835d0c7602931a5da3db05743c2caa90ba28a25466f12fa35bb07e28de949925f284aa94f2586d0410d1e94b7b4db852f7c16ba2b77e013855f0a663e08921c7e32b9137f102c71b70f3d2518e7a593bb6ed1ef85ebe6ba08df28777536f4dac0b5063dcf56b936e6385087cfa7a786ba0d98b82fd2046405a55e732d3e6482546c1b9bfa99f333b5322a11341354acdea819cabd03ab898dc082423db0d761babcb68ae808a44d026344a15e4e543dcc6e00ecb9c857d0ad09267492213d4b3f10114c003f2f571e8227f750ea807ccafb00b4b18fec285ad024e808e032be5170ed0430002c74a4ffc4e26049f3797d018b98f4ab32cd4f5f3c4404e6a0382e4a9324ba6b760a7f9b8db5e29a312c3d7b7867732ab0a4c2dd8557f452519e96e631d51ad3cebe847a1fb27fb2eae2231b20356c82e0d02e5b6fddf96e976a35bc2519d3339ae301f3c7b08e6aa83611a4a1c0f226c0141a1e306598c6e6f9cd075b6762d9a0cc551bc72a4270ede9416ee17acf993b3ba7da90bbef254cf89109870d6855265b01d46584a2352a5b500328dc9afda41fcc5226087f542972a61d7ebb96fd381dc8d3af4589f06beebf74076c5f9fa9a67806d5d77a83fa744f75a0af80f93ec6f5d7aafbddd8940c65c7920db80b481af391c6e59ccff8420017c15ca9925218a9341f4c915fd8be27177d5d6e91ae5e294e3c587bfd2220cc55cd6b724a3d43aef5807a153e4cd18855a70186fd7afd5f0ced4f70dc232f01f8d84796c20f7eba46c7e265dbdb7f954570b79b6ebeabbd591a0f9c4b9559bfdaa2bfc93bc5f5993a1d6dcd45c90df49442d370be5fd1df85afb25966b1a14ee22674d57674cc68069351cf61a9e9e359225b9f6ecbd8483bec256c5bd94396d3e2c228abf97b1e6e6b7d1400d573c63fdb343d6ac482efa889157230c2ca1c936e4b29cc41e733a5b93835e4af991059c67ca11b70699d0bbe6705ae5599d38db0eeea2983200f96780daa88b39607f9ce649db5c130e627a61c42d47691ac2daa8822ec3c7bc6329d124cf74ad1834e8b6b992c5897437c36d3d34dd6ab338df851a263bb9e7b84cbdf730c8892616fccd60c330fc38f518edb7b25d14b04889e16ebb14c2cef2b940968a2421e9042e923864b68eab623f5e271bb4c45634d210357070db72065ea3530d1c31913ab232be78e6e54777f07fab536be7c02a7ae3a6f7b2416d0b0cca22ac663c6eaddd69314a971f109a0f9951c1f2abba6feb33dd5f47272fd3e457bf5c7d208520ef3d78b81629a3cdd6ced25a15c03bd8297b876384cbd7c9546265c18928706962fb1e8538cdaa7e3eec1fda14b57bcaf214100eba13b3395341c4c658f85697f159c5763345348c86acaa8573151ce20b5d8f0d7ed742f1756e3574c60a17594f136a010d4b5e7d1a516338d22c35065551717b1b2027e419060cd69a3bde886dfd2d478d738cdd3685210e431bb67919af3fbe7a6651d426282ff7be73f8201a4e6b9107306ae1f56072ef2d6945fcd8bf9be6f511d022a02bcf527fc240a9583b1ba5504bf995ce471486746d4d5f7dbd5ccd15b2c8c4089cf3cc7afd3a2dd86ca53833002dd3c45c356976f7b7fce9b81940edb78a95d91b993a09c29688c75c47e63dd1813ece96de243b70bd10dc1c226b2f1d78cb9a2b4fd8d0d643c3b83f1ab4911f7127f00fbbf13233261bf7a5f748351d3524ca75407bcbfa1dbbe14c9b792930245b47b68b9989c8188b7655fd17088cadbecf3457e14944bbb834bbfccc1ee3ca1bba57d3e58780722eb23eb2fa64d81c8bd80d03ee0f23e932c2049981b80f58f83e4d2626dce1f613595c191cf41c5b4e3492999d27adc6b0104348363144347022cf699c9c3cf010f3d126281abf4359034546a7c33d90ef788ed2d5bbe9a8521ca90ce6d66b87f9d7a381747c8d407f62b6d42853fd6205e03865bfc01f9e581ca2954206c8fee99cbb150e06666e2212fc81010ec2bd2a59d9d0eb598a8a7b27ce21f4ef9b3f576e3b893e8866cdf26876f763c450d32d95cac66b64b6580deb6c46863509191ea7a4f85799248b0fb1f3d322fae79a7c339a04ae0d9fd6d8251cda691c0ae088d226e9310a24b17c7057039b570cf0e4f9138adc9da1598f231e4b00ae2bf9e12f0aca0218e8c11aa442a77a8b4d86c02032923de7d0735c661e7599ee5a5c88e6bf3efe8097e92658bf2e0461d5f024d67ac6999b6e3d9ae8eb50d21094975ec60e1ab6f0b563af2aa3562bf04aa0ef8337897741990f179a7e38f0ccdcd3042411ab3a1f6a691c1c8d0809df0820c19d148f4ae0cadce500c4bec55f1f528b87a83796e8a512722b1da292c9a50b7e3b11ed7aeb3b95beb324d28b799d6d0f68e9cf5bcfce40070ec277ab0f058768a72ebdd653fc6d947aaa58b0ef508253b51561e1bde68c8f80b0a239c642503e3e5e6a9f379c69dac304597e86ad0299bbac46225f029b7d25d1576506d959147ffa97010595b4e91de666edd64ed909b6d86367bc8b5f794b3ede47c78f7be15bf641a00473d8d07aece161daf4257d0334a7ad56838f3fa065931c5b4fe561214ec046e0ec4660c55205c59493ac978b291061672c38e54c8e2bcfc3b3c3c037424d38e5862c38e38526261838c2335e92c0f4a8002024050035d5fd44a0def8eded1e8e2bcecf7202321b189537ab88e6d6d496c84904636d97b4b2977360cf70b830ccc3111fc7739205e41eb9e03724cda6dfc7653ce179618910d628e47a0f58b7000a7ba7b93c82958487f5c6d1d10a6b58b2aad678d7d2789ff03ab925a566c4e3fcb0a8bcab57d834a06737d6506cd579178a8eadd06ad7b57be04a73a191ca8760811d286c4e3d9faad328ce8c1a97d82b98a745275eb2a9d449251ab79199cba5edd871d4e955e65bfe6f6c29ce9a4edc49ca9854431e64c55155ae9f3567575c92a6541bc5a7a8fea3a7795e824fdbaac392dd281b866b7b69759d949db7c46ba6591268994d1c9dc45c301e6aa3f8c62f769232edb3e8145cbd6bd54d397a83ea7564d413321c1a9ea97a97ab341abaab790d2ed1452f71a3419d5abaaaaaaf92538407a756babaad048cf482c1b64ae7ab6bdea46388053f0d5e76ed0c90dd5ace65f357fc4e37932e6934839d1e90d69f34a9d553565cc73adb3844ddf549f7392b6db3037495b562a95485bf6d2d683f42ba316c868908b76d0c24ebafe321209b34efa659db9798bda3037e9b3a9b22d095dd7c386728045cd61bda3d47e9422ca93fa6a596febed6309134f0a8e28da9a73be47ff0ad26d599875617f59f7457a1f7baf331e7dd2877230a5ea50df147018aa9b0d619da8fe7859d46e1fae21f58a20d03a9bda20d03a581f8ab4fd7859c860ee32c2019c922fd0ba257a5fa2c7138553a4aff68e871421ea768ac684d783c43ae15979551e164aea7e89ba25da2afbdd5f914507a3f6659e8e4fdfbc14e9fdea5d8fe5e9b0f4986edadecb8136758f30f7a3c3f2de8d7856a8efa78d031c9873898a98a617e638aedfed927a4a94965f3334530fd0aca477916e121e1dd89837ed6c929840db61a56c88ad5ab49f1cf596b2bff772a913b284a58fb40e0be539358dfb085108b41726b25cdec1a8a493f674f8a86ff6a4bf5cdf972562ee65db294b05866e94974d86e8f1f0d19632489acfdab6ce9697b6a30e4695d93aab764b94c4d698965fbb85ece76a4e75c748370973a65fd75b5ef6406996680fda5c8cf4cefa1e01d2ed116c936441d090b894a60bed412bd1aeab125bad25dae6e33ad092b6796bced74ed0aed751340e81d62ed0ba67f4ae8f70aae57b8ec23ada97337abb3c451ed1f6afca166c0f3594ee9e52f71d85b95da2dd87fb095acbbb3ed22ec04e7a1f793c5bf71612d2f658bf755dbfac6da9b0bc5b29d4fda3ece9a8ae51dd219f3e522f17ac25fbb9a42c11732e982bbde3a3237cc456f8caf6ac95cdd9af949d6253dab2ed00ccbd03a0f663de9d5a660f9a44acd8e3c95a8789661f291da9fb1eadb3c3bbe96f5f867600a0e2367ea8fd16da69fd98764284886289f41e3f1ecfabaf3a806b9d20de4d9f762718da692fd4854aa7bd9d57e3f93caeaf6d35de4d3fdb80785c9f65d3decd9b8feb77d32fa72fe3b47fdd97519f107dd2c32e9275cd1af55924a29eef1ca72e63c8bf2e56f99d438d4654ac23a262d85f256141987bb3b06e0b5eef8aa84dbb1f4f4af5a144d71ed7f56baf98a64130da7560688879ebfdeba2b1a2f1d9d417c3664b30005790dea4f714701062912b5fa0618c86d7f378fa521ef551cfd91a1fc1c0ec40e334f0e5f9687bb89f746d842a2f75d0b591c983f4aece6a90d7180e271054f9a28954b87ca46a1d5b171af5518446568e98939739d0e2fb48caa32aa9c823d575d2648b6e7cd2b62f875f6ddd8f9745e5cba85bd1edb6eec538d0b057a3ee2b4aaae823aaced5b93a3f6ec944ebfaa8ca777c54e595c7c3af8e3855d1232b7de5f1f0a828ac94d85ad179d4966449a40ae2beacd061f0ef9711b00673f00c77039a4b8b608e44837816a5463c9e0de2dd58a16937772910e6e07ba0753b4407e061b3e3f5d83c88c7136fa49db4077738784d789bee59a1eeaffc083ea38785baef78780fb56ba4394e0142f886babb77c873c383ef71c17a139775cd4bbbac77a711606f828459275d16e99745b266518c6ea7467d93b39fea3d78f8a1c8950aae67539d5cc4606ea5fc51e7cbdc7ebc5452106d893017f46adb2146b41ab443cca0992eb78a19f22ec1a93b61274c027206adf452df741ffd49d201b44ece53385545ade8fa7e8db6ca22c1e82231c5ed62e6f96b5b553bc97c8735a9cbf3d5b93170b41d5785c90dda21cc1d11f2b3411508c897802f3b80902cdbc1dfebd799d2ece08afd5521f5aa30336870bb36db2e81d6ad94ba44ac6fed16495d68841009a3644ecd94e49da14d365279a8cec7c9d5f6aa248253d70f4e75a7baa414ffe188df178144b538ba7745dd5b6ca49bcb4e6cce8cd8ee1e614e0673403238b8fc794ec5d3999580f372e7b9188f6175c1299ebc3ce79c2ce57c8c6c843996bcf113d5d66abe3a6ff3d5c6453687e7642736876945697608737b8453705fdda0d6d9e99bfd9cda4ee482d6cd23ac6b8cc4d0defbf22c65aa3c47615af16e5eed587e6cb08477230f51a0c9d457255077b793a94d9959703d9b2e4ad14ac778839665fdd55b5b0ffe15841942da412686aa73fccbb073b575258a61a62456acc0f7a494b28fa0c965a38e62bf535b4ade6030935796772cb1d085d16d92d20f370993cf18c25cef14e64cdb46610eca0e19452374bbb8058f45868d5476c2e32a8ec2bba92813754cc45297526e42fc40ed5f8ca5417bd94c87e9bc64422b7c7334f4781ea76668101e4525491a0d5a078f6a7731498d31c6199d704aa8094be91d74e21884a42722d99c3e7696ada194b6ad31c845d3da0549a9871eaa8f38f5ba4a1ff55195fdc496bb6c5d4b4194c46ea66db31f1797f3d60159ba47d4aee52e304460e71e8ddf020a0f229c622015a8ab0fd3f9b47b21448b333c7471483b1a214c671a0448f5b1df11af9d298dd669d52d68519a8ae610522bf8abc2687454b730eb56756debacb7dc00301050d1aa8a1897472a9ad4f89a162c6739531aec1c371aecd5a34669309a4348c58e95687660d7ae03bb56c2aefd0f488dd665b6c2380be5c71c6643c078457dc038467dd43cdeda8060a5402def8c87cb8e1afa5e50a0ae2d3a1714d250a0ae26214c42b4a0dd56d3f9d7663be28e8648544b88ae7aec80ba9a68d78198ede8caa7405db99b89cc0075dc3168fc2e060dd92211e6fa33540ca9b21d4c3197634350ac54ec333b4840ea1e720eb46c07cb9ce106331ed6cf8c5149db9b12eda646bbd9c97cb7b7fc653fd4c7ccb173c6c365c7ccb1ea3bb37542eacc2f8ef1d49ab9b60171c5ee031eb3aa0e488dbfac2132abfa7e5f51ec3a603cfd6d34413c21f03af630c219da3151b1b700411f9ec1e8cccce672da3a226acb65b60e486d790cd2793862680f1accafec00422a0c05823af8419e125b5d1eb31d30d52542890c21843042b8744218c41c11a75c68b7d5e5cdecf2965f2d5b1c3a8346b3c3e52ef761dedddd8dd065db0abb8a65d43a71ced30b5502d66d793f12716ab7b6b4bce518a7aa9f16080475ec2d21f5aae2778d10a991f22ec37d8cbb4b219d91260e894784d4a0d639220669afc80cda146e9842d43a3ca7a6313be154c742b5df3f82396627463411e294f62edde0f544211abc142683ed89432fd894d582d7138354f0d808a7e0f170131eaa2fb4c405d0875f485cadb5d8462d4ea34eab466dd42cd90fcf3268d85b8bc3eb61236e78298b0ddbc34469d854f59e4d4286d746dbc3463d86c7c363782853a3214a7d5244c162ca140d635913af89d7c46be235f19a784dbc265e13af89d7c46be235f19a784dbc265e13af89d7c46be235f19a784dbc265e13af89d7c46b6236f15e280ad57e55b2302d0e3581288ba1180463228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c2980863228c893026c29818632296c5b311e8810a4150fb26237d86f78a6d436adfea38d47ed56ca87d26da9eb7395dbf6193b41aea181e4f9be1a18cb6a7ab6c4e3f8bda6761a2dabd86da2fd124304a0003460d096a6a5e8ce0850b1734500434342d60085ab498814dcccc9ce090d3490682404626067e202606067a00a6324ced877a797199838b4b8b1c5a5a4c713099b42c348d050e2c2ca537944a991bb20cbb8261571bae8bc40612c95a83654d2b73566aa82a9906d968a8b1f2db08c2333c9eee36c3e361e6323c9ecd5162c1a20e352d5926256392b39fbdc5ccccccd105c646ba3fa7a6c1304c0c5b5d1d5e3b703cd5345266311bede495153d518d39fa5a609de930e2d4c2b78bec0752aec2464c2488b97ebfc9a06d92d619c17c13a4496242122239699d11646fe2cae62fd224cd6b62efef90144e5dc13a6db4506af74e592caa34a643ed32f48f2015155db49b524d3bd5ae8daa741634f878c4430536d0b4241a36146518a04cc1681748e48ab270f72ee56668fd205e7bce7e2b06adaa0f0a19da005df012eb8322e509154369b820929502c600c6002271f2a44993274e9c3c79e2a449932aaaa8a28a2aaaa8a28a2aaaa8a20ae6bf99999bb9610a36d79ec31c989999999b955c2f86b63cdff70b1abf83754218e72c3222023e42788653067481c6afe0acb4b7386095ebb10cd5095445d5c7ab89430e4c98b3aaa219058dad7755d11527a4946568dd70ad149e59f9d791be319a475a5fa9f04fe0e1bb3dbd83337f9b6af10eab35a917b4c5867d66cb7eda4abfe0f72cafd9aebfd84877b1c19c668bb9cc56d5161b0b1173d667361628cc593f6d2c43cc5987475a67128147200b3496a16afda88a2af6d211880426e154e9329b841265362823535de64935bd834f6649fbbbcb4ab51eb3c1c36caf6f261178eb8a1644a45a26dab9a8d0ba862a6d6fb96cbedd66adaad0e0910e1ea99076d3a72f2b952fe1131f7d4831864cb0108b89156259950b20841042d956d026cf18cf6f4f2b25c325472ad0a030914213269bd9a0402b22b438b8de02b437051c92d49efaa6780316f55d1e0e9945b427aa4d95a3eac127e5443f9d346d83ea3bf760432983d6b5141311d35bca142a54a44c6923e6aaeea3aa872014d5bb1e82c21c6cb15cbe4c4887dc4d12e9887673b553bf658342b04994f28453712957af1d27e930131c2a499942455291d253daa8a5c48632c4a949279cbb2c3b2a21f592b10cdaac5a0a73308a40830c05df406ed20c85e5f02da575582824622d2422d4a4424a040790082fe527dd0da75438933053612e32eff266fd826c4db198df5b8c5fda4c3a492b610e3ae154d5495a67671211701256c24c5ae7e180a4432b64d04a1d1b52610ea3dd76f70f9b8a3dfb956d7d74d46fec56f69048eb74128b46dad2f267c5bbdcb21e5fb6be6c2e5b87d596ad7b8956b4ac4e62a29da4935408855344d74aa1852098ed5822e6e01073100a735438a5d196d25286acf46176f8bec2a96debc9459611e91bf82cbbcc7eb28a2e61799551266c704441b3830aa9910c5ad7522011a811a9f091888603092ba9f01c9930141532e1249c52f2fe448d5ca4461eaadbc62d33b23efc322b73e2a2d967466a36547df8eaacc8c67ee6c4e67467f051e986115ad755fab55b028a58d0f607966594a1c88cc42ff65889955e26bd42cb49fa067e4e8d9358565f71fb8175b7d5a4421e48886a8cfaa840c218575b12e6e0491b33610efeb192cbb22843c11c34b251eaf6689d2dea1bf8a1d92d13a36562a4f326fca18c65c27d9950612a9da4dd20050d494e3f1769c745cbb2e2ad1863e438c45e1e3e2abbea231ecf76c443711269531b165d9d2a010d8838c8ca0ad52b5790d447050d9c3c29eaa3820654acd4270514b0a8dd52519f145040d2efbdd72d2d0f9b3f31d7142be2f16c11afa5a5a5c587bbe51d7b6fef584bcb7b0f6bc198db498576f60acdc7b3dd3e51f91b85babb42ef66174e381742b870a940d86f36b46189978292faa490c213ec447d5244614885429196965b2d2dd76b6979333134c48cefce7e4cb3aa1ec55c9cbaf7f9c3a6ca8b74fd389d308a61d7adedcab03feed19d9a667f1b57dad6e8557956b6da86d4bd5c1468900a814e687c9fe6281ce412041742087f90c4081cdaf958542d2c485644522d0bce9d2452c9b2acea92524af94b5ad8abcf8028bb484f9600823f3809732425cc91ae6b8b982301d518afa0593b255a41a3c21c84b49530477a2759a24afad5588b6683d64e4c9f533339a9a41f618ef4a652496721bda9702a3be97dc57512895409694b7acb8170ca3ae947b40e117f4da22c047dba65eb5ef6a63ed2bdd46e89a4c05bf02cb46be46151a2425bb4a40f4b6959565816954a2252ad292448faeca3a6527403ad1fdf17497defb7706835295cf0d009ae2e335b75f96f9965d4e5e5e5e5e5e5e5e565de33737335e7843de0af201056150d12e9d010f2b00f1f9b2137ef078e50a9170b9f07daabdd2aa93460521f1533705277eaa36206415d5555d5b1ab6ee9d3af62c7eed81b6375f9deaacb7e8c55d52d630c1fae7526c70969af766f28eee08245349245c5b262f76a386b4f4e2de90a9b95747d8656fd7a4c8ad9563b645d8edf4c8858f933b37e6d4be6491b10d71f8b5eccaf6405594a49df6eec7882ebc5d0beb7d96b9dac10cb582d9172c98419fc0a35a9bdd9cf7c87ef9d7fc16d9dc4c8efc16c07ff6ddd3ed9e279a32bc45c5fd27d52fb3133bf03b17cfce80e73703bc5cca73a7ddb4b77aa2fd6287dfa6d12becda2c2dc7bd61591233ffe5953e47b566ccea3704ab8fbfe39b53d2481d6ed91077f6057dc1ee3062f3bc627e53a9d4e90769b05738f878840e3779b457d1cc44362b7118a9ad09ecc82140882174c07bae0d4ceeb6ad4657edb7f2e0e9999f9ccf0ccbb1b39f2be6143aa635fe5d0926ab325d5fb0b1afc8c4d3305c0a02ac618b9c76526c4bf87a3cd2c873c10cc5599cf8c2ce58352a3caaac72827ac166326655956c1aa9ab06a123cb250d4f89d744969916490b124251ae35fdc1edcad4fda3022707bf71c73cca50dbe0549c20b368cbda4f9ba13b224d27bdb9320dced539a3dacd84994663fab45f7af32edee03b73a5e5d6ae3a2542a5db407adaf6eba044208e11222c751a257d458258b7552e3755d0be1eeee2e122547988b9fd7b3dedddeacd4cfaaca0a6d9ef41f40988b3dae1e45c4256133f380168fd1228ef41e990d8625050db9a0c1f52c2662224e2dc9dee7283d232f780cc6add82776c5f8489764bf64f663bd2cc95ab288490cb37ebd609bfd9c704401cf590ef8c8035e7eca6e5a12c2966c873c9410c3b05b1bcc11ab4531e6b0a22e92f0076287d88b1adbac8a42bbfe03ab5624bd671537bb48d7655d58a76117a9cb9e2041926659d222454d93168c1042a81d0a31af7551a45656045ef054c43757e6040f127c96e96079fccb9cc88c442cfb912c971ba9ca8ac8ec89cc89eda91e994d252d3352a38c2f984e17f5cdf5aaa2278df2809733b2509b645e3adc32273627529aea24296556246646accc08e95d66a45a99766cc67a8157fae6fa65a2173c499e66e61dd421ef239224e97acbf6aeb40ee49bf8eb2d68a745f89912bc522f29b3a1aaaa349a3991e9886781b9ce42d7afebba8c50566473e4493116ccd6bdd4eb2f5bf772fd6accb22e1639e79c935a8f9fd767fc4521cbf6c41eb9203cbcaac714e9f11aeb648ff4c7693e961e7998ae97e245694a974fd4ae8b88baa8bbe87279c7457e9caae9da3ba8e3ba0f13c5ae58a44a9389763f4eb0ca674e6ccf158fddaa58368e52b2ac1833273647522e62fd22c926aa72a0755d547f654e5c9991ab6b2bf396655973c356c612132b84d47fc3651399df6ef65355efbd0b621d07edf3282828480438fa2e96178af75eeaa7063d78153e56f565ada4f6f60bae801042a8d5954f0b5a7fe5c67defd7dbb7f259d066845a88d387b92883e48c5f820331ca9c7c38d5435653ce893d7b1019a54c5d9ff3dbcb8939524992aa5f3db74a695d9f55c58a7427445eb3dae62ff9aa92525e7456568cf189257a0a1ae9dd890d5a9c2b65c65f2d67357de26d6a8c1163f52538705dce0ddbb0594529a53cbd9b2865945146196594dd524629a59cdb8561b4fb21e39abfae2dc80c32e7755d9f9b45af49fabc4fcf3949d5e7ad4a4e59c922962b2e2b86ac2842e2081f200e30a4f9a0699ae6830c2476643017650c0d0df9c8d819420208229f1e470c15c5283d1054e3eeee6ef54e050d88530f4837213f4220de73c213103edd2b92333439310b2361170d02529ff7a6943e5522fa265efa04c1190462ae08e62295f82580bc7b52f6f3334a19b0745ffbb3e9201669675d810db187581563c46455c5976df032558fb1ab8ef31142685901e1ab15f6b30e376cad296d5d516fc5f6ec25ac288b45a5ca852c5898be0b9fb1501e50be37f694ed8197345a543a8b4a8d2c87d447373ce6d242ca74f47d48965b2e58d682b160914464972bec33d3216fbd236bcae6c063db96ddb4954edae2653c6c38a5a452f25898f5f2506bf46131bfa4eff6624c3089fd6517e5214fea98b4cee38a32a134d5e1a33cc4ce72ac833a9ad45848224c20df60cf36d824cb8aed79d5dab0eeee082934c2c40ac1a24b0c8828e2f1f41f945ac443ede34604737bc52b683f7e60db0b7332db4a37eb72d398e3b87533d649a791d6b980b4ce45a42b1d68f14720c15c8f1fd19a3f023f6d2cb3ed139a3c7c4b76a1879214c65451e830d4be4b251434ab76d495501210ab84ba53ed2aa1daa7da274e0181b1ceb38cb410da3b37d8f7661be69324cbbbf389116ee62741b30dd0058b86dd538a0085ba503b028c10ce22308932c6221c99450081aca48cf551410439c4d44705118ce6ee56151544a0c2f55141042b889084527d5410010854104107f544c288b0a49e4a4f5cb0897cef743a8c98da397be1be9b59f5e3edaeaa13c8302a6281767241c410ad7522b4ac6d475fd26e233271c4c36d48087670c413993860f5aab9a49b157c77dd3be959ef59537e46ad361f922ad1f55dab2fe3f1c2501f5d4223cf8137842303f0198830059bbf809ec31ce4bbf7fa25b1f5f2707b97c0bf8ce65122e22555c0c311e9eb9b05100007a4af6f9e0c16c21d9fc0f29ad3c7217dbf5e0c6dc2d83242d93d953bcad580b0d0600952da292591e96416c05218d0f5c37501920f2425ac1916066677777777ec612e510da0ca809451a506628c71365c0e44b91d88321b6257eeeeca1e923de5ec1adc0fdc85912eeccaaaaa921bab695953be9222db34848b2bf86e10398eeafd0749d785c10d27c6e6f0ad1eebeff1f068405868b00429ed9492c874320b60290ce8fae1ba00c9079212d60c0b03b3bbbbdfe3e9187046e51ee612d500aa0c48195203f1a1ac18235794cb891b80380d1f0abeca7eaca3b8f9a160d556c72afbb9aeb72352175520bd94b533363ce43c8e6fa28d54e5f3f078706cb627464c7da71adc0fdcf5b85d1ca7aef83dbc68c5448d49c07a59d675653f31b31ee3f1c4f3399855fc34acaa629b601063843731f617d27d3fc408a19431ca3f1c114a1963843142d9bc52c0d78ff0dbb10f447b7fefbdf7de7bdc51f2be28df7befbdd3e9c47b056ed96077b7f468f9d5d2d2ddd7fe652d91065af78e8000b10eccf91ce0d4cbf9bd389f88c7d367d158fe9e8ecc59de1b100f2543bb2953b52fed646af7199acb37fb5902f396bfae805e85940315b5def595e8daa3faabf32eb620555555b780905a510bd0589f4180eee2c5b664e62e6868104897c4d011c4bc091999777a13326f22e62ddec489cebc8916f4748b9efab4cecc4fef66a7c5ccd0d39c32f4bd184a3b229602a9db63ff3a2135fbc56fd982ecee4ada6dcbf6be99b625112bcbb65be93e963021034714f03186ac2b85b8f44584ebd974520a12ccc118a5c4792919a999aafe7e7a2998bfbb78a901fcfd6d4f9feb7bf57a70704aaf47cac3bc9e185b18b906b03516ccc1c36c5dd456783d85e5e0656c3852a839f072d36267a151ef2d899deb1c674b02e72d975b12f23d3c6e49f467a0502814ea3b1b90564dc7d980b4eac3e506a4d51fde1b905653efd1efc1a978448fad8d04ed9105ea7027e2bc9b280ab3b0c21c94411d877613a777f848df402b300b4ebdba462cb803eddd4223d47168a75579240be6201f8146b73e4fd67b2fed84d724783c1d1b3e1e6d4fa44d54bdf92cda4d7828f8d3bbbbbb7d74dc8717eb48433e218d48254f3007a511a944269146e490148297447228cae8845352082767e7dd69c63bcd3259a6e7ecb4b8f4f0d733feda07971d6904e71285e3731a5bfda9b512208868e5e746bcf263235ef12140b5f113e30e2a46d4ce0e2aca20800d9f6ae3e7275eb9118fa29578e5467dceab1bf5c625e3c68d7a2342a3be81c7a1b143031ab525e3c67d6ed41b376edcb8b1e3c68d1d377c7ceec3376edcd8ea8ead23a2fa5cc6d601a93e2c878f564ad90f01680f5a10af82a8ea63b603a6d64d42610e061171aa56144ebdcf2f9f4d0ef5bbc2dadd3875db1a6195204eed40a3d689473ed0d903ad7450257c0e2f89eab6d5e7905338f7b9cf314ea1eef32cfbf1e90308a99102653ae2cee3772ea45e2819a59451ca3f4984533b87b78e3815adc42b32480ee114cedb095113a14dd44e38d5b551451d0ee02241cff6f41cbe4bf0523f87ef146ccac6e1db052f95e3f5f0ad84533578de5927783d3c2cd81e1a877f3b31783d3b87edc3357e367886c7c1dbd8201b9683cfb1c1383c0e9ec60fdfb039f03c2d0ed5f072e07ba0191e0a1e56d91cf8ba25a1c4a9eed0e881c7c19bc7265e0e841103468d006a5e04e0858bbba0b9a169c1b59801c0cc898793cc0e32313631303ac0bc542f2ed4a5656b31c198ea4eff3b7d187f590e96bad3afd9e9bfd8d9e9bbd879a83ecdce4e5f66e7a1fa339524c9baf3f778a25577fad6ce61dd39ec9dc3323c9e26d23a7ba56fe0e7d4b4bd7258658744ab30073be80a73900cda0050eff8080b7de74f869a89a240a377030f030303b373a5f6735037c2291bb4db6ae3b00f81e095b33591336836ae4e487d71087339bd93b3452236eec39786cdd06e5ccb7e7e7e6958a741ebdae8e73e7ca136588539b8998e1a6fba8444da80f8063e6e40861ecf0cad0f816c16ccc1bdc21c7c477c84c8959de39c8f30124eb9643f38384638f52acee1bb08acc2a99ec343a3c7c373288ff8a89be4c8269b039ff39e0d42e1d9b6c6231a87ef26397e3a695ae778c790070e3d140402abc0a3be81e7230d759c776d74e33968c0e740a31a366cdc877fb6204ffb75d9786f1d9048bbbe61c386f51273deef57283f3e7d4e026b1c88c7c34c88fafeb9ec72bc0097b4c3c1341ee7f11267081a6f4a837abfd33a8d06f51d1a14cd21a4a21e8fcaa1d981face75a0be93b3f31d0a297cccc50d751a5bb7f31b37408ee7dc8751281bc7c1f94fbf46bffe8a584f4f07a4ee7cb3219ad2e4bc8fba3cce4693f3781c1aef66a5c9a13984d49cc7a3bef32b872767a3d991731ad791731a3c39a7711a398f39d4ced6ed9c00a81cf7619cad8befa155151aeafd1c47511f399e437dfc1ce73b1b10ac38efadcb41e1cf6fbc331e368e73ce76fcd0070405ea5abb0234ed70d478acf1ae35de351a0747b6dc69d4712e6bd0ae03b51f85c041d11ddac503756da06ee8731c1cda01351f610e7ec7a0f591f8e0d8780ecdb1f19c9cfb00e9e3700e3469653bfa39f76902bce5260fb31f1f14ed845454c4f9639deb3b7fac433a8d1b1ab49b388f37f1668776b3e2dca771689c008f3ebf8192d487cf736c3cc7e7393b1bea71c3b994f7f1d9c1c1c1a128bae3e3731fa6b10171cdd97cc8e7ec6c341e37140ece0e6a0785c2390d9cefc82de73edbab395c7172be52e27cab904ab3235e5e477c8603777ce88ddfb80ff5f1d96cbc3b22ea8d1360eb80d41b8ca4e5e5d7cba5c4561bef6c074cb5f11b5b13d9ba4885e16c8f3979d4168b3047843968b4b3e1546fe7a73bc6d81125513b343a76d3e0d9e9690a8f6a3c0ea171087390dad8b6d6d892803d90877653d34e464538a50424c2a99cc3b7119ee71c728ac6733e314ee13ce7a4ec27a7bb9b6e6f1438551ffd9df39cc6369943e16c289a1d7d79493b0a9caa0fd477de9467a3b13de6727ee1488a31873a3b3955d4e15bb21f793e127370de324a29a3c479d3e0f9cbc18ae0e06c1811d91d234d1fd69ce3d0c71c0fa5e9cf1a69509a1c7aa4c91909f30eed50ef6c5087efb8092bc139c9c80cda146e38523b39e48497923185b5c24b5587308703d81e9dc377131e8fe9f01d85d7d372f8b6627b7a387c67e1f5ccb80fef5a0a15bed352ef7a0b15c2cb219ded88cdd9a7b6fd0f47efa166aca1ee7bd8dee674cf0c75dff2c2d085ba1f00cce3e61b8317ea7e8d1c49c284749184a238a9100ace4ed92b168b28b71edb11cc41297170b67edc50bf1acb69140e0a858a31e21c070747ca883a0e9dcca1509406a8768f08a7e0636c5d2c418517c0d6451254f8006c5d1c4185bfd93a18dcd6d50060eb5ef0b0752e686cb6ae850e5b3743b74e66dbba986fdd0b8cad73a9d9ba96175b6772b1752c345b576ab17559eda0d175da8eb098adab6ab71d4fa9f02f44a01415bea56ba32456db92a8e081f4119c62a14782f426321289442a91325246ba483242236a04c5881a41236854e165953d4c4421b27f9ce0e28de2a138e6204c45d890b99571a1782829e3494abad5c667c9718bc057a5bec7f868275f94fa2e19c618f59d0916127936296aa844bb11adb338a0a8fcddb4a26d2bf34083c07b6f6e1bcd8ef7927844b57b1a142d2a2a688fa83e23fa866da041da49b4ab88a54841058a14464eb220aa9d1623beea2610ed3ee239e698e1e794105ec2096184904f441152ae98b5dba9bc6728713052bb536526d46eb6d1f56c22b38c9d73523b599f4fa7ba453b29e55b3eca08633c80843106c11c77ec862de9ec2883ebd9ecbb8bc5d1444451a6bc9b95f16e76497f5f36953a222ab4b6ddc76915d22040b0f8f849812bb89e4d8729d15e0216c7a96f5a7bcc036da5e83799a049a1b615eac527247a70aa13f2835332a83ece7e92a82ead6859b3044555b862cd58ad937da2a45a619d3d41d09362ca13b57bc80efda0765b54fb9a8284da6d95ed73ac5ef6c3a5586d48fc68781f3ef5760abf668c3c01e79c11162141c24336248515a66891440a2b1499116e74a2f52b224e99be2d7f2fdf16df99efe9abb1fcb50ecc4bf44a845a67080f195232a4eed675a98be309eb0cb98494b4402bb24116d68c1b9c471c91de6273f16ee267b618ef26feb4d57837f126c687f8970d7b3791b7f9b8c7c59bb6f7b808441148d4d901d5795d73522662ce8a1d0f654b30c861748bf0cd1ebe6a5bb74986488f8850fc7c0c04eb24c1b14d8f78bcf5418f67eb5a34fe40eb1e3dd537348721b57b47f04989f03491e6e01aab4e3d28585ca90b85755c8cec139c7a435194c4ec32a9cb43518c9ed4c5112bc8459cea7868687b806c0f7c95bab5632b757f411e5b5fd1114794a130f70522a190a10b4d84535bf78f42ebb868a776907251b311a7de7b104aa152d2a96028ea9b0bdb1e8e5b60eb4f658556aaf34f8a301ca92fd351aa76946a5bf59aa16151068d8d98e3f62d7ed0a0c82189078c745cd4bd222e622c58e7e100c21c8440df77040468f7084ea55e8148d852df901c9ea8dd3b3aa25a1c8f8a036a1f6ed74ef517ae6a55bd3a9cd7763619ccad0c1f9648eb7011df2c17d59d9594155608b5851bfc615331193ef4bca20476f08ca2b0b09435628e7777777777176eb74573b19858edb668f6d8a3a02d5aa3adb25830c77f463d96e0c00fae4430a4baa86f8a1d80a15e4f8640ebaca2faa4eead2a6b5de9ac2cea92825e4e2f2eb608ffad11666666666686e727988ba249e5ea9b228a22350aa36a53df145140a9abc921da2bbc1ca295412bd547c51343f5653f907632aac68323b5a6be29a2b852a1b08aa055d43a5336a12501a4558b0c0fb5b7c4f072b6b3a9118a2c2a00ea9b028a29bbcd0cbb3b663f95155ac396598ed88f1df771c3284bfdcd74307c6719b51ca2594796111834fe96417ba96f480755eab5d9cf7bbbacbdc7755659a159d761e9c074e8b0685cde86f1c9d27b28f8a6f1658bf0e5ad224e310f01041a94a2555f3568fbadaf96d1abfd68195996d1368df4653a200db6e5d903cc4ce183d0327aa83d8ca2bda33d6a9df9e52c018d63d2d78f5bf78eb41f93ca517de76d09b9bd0f68186032a94c0105929ae2ba6f0a289ed0591c1b2db041e4214d2207ebd820f239b642caaf6fba0354ee164905f26352e12acc6debec08decd1e052717d45d1a68cb11b18ea865c41ccf40eb8454de2568efa4a0aa6194b04dd8274028a6a1ca72174208219c54ba533ca4dd8f49a50a5a6554ab7727a3da4da3a004348e48ad69348d269549655279a6a16e48743d9bee92524a29a594524e2388e8bda2f25ec132692e938a89c0ebf1190a437d87c04b9dfefe80d70344035e6ae6ef0c783d416c0eff5571802705016f0a264dc612eafbcfeb9171e3f5f8709dd7b3b339fc9d7aa3871a32522d7fe7792997bfbc9bc1c500407d36ef664aef5cea0eafe75bcdebb169f1645e0f47b315c1373c616edd084ef1d055fee5e91cd1377c7a79f85200b8fc7cd8d3a1b9fcbe9e4989d88c88998e228ca0d96c0e802d89203b87aac38f681d207dc33c50ba64871d5ed15c1e48eb2c93bec0d3d928360adf4411770b6fc3f06e7468ceef712fcedf2b6a5ef362a3c0b88bae30de7575f1a6d99648dfd08d2dba35892ea1b9dc16040fc5b7d9f603419bc3bfb29f8aee9033683a6cafd21d8249ba41f3301b0246955f236ce7af939fcfb076f25836c4aba433ced225dd62d561536256fa074fb728abaa2261a58c851b46966579b3340f27dcb62ed6d36e6350f9358c846ea75099c77c11f2b39252d225347f343c60286053217d618e7d6030739289012208041ce009288fc8b21a86e563656d422a8c0c971693e6c3ce8d1a3eec4c21334aeb960be678e82ea830b8081ec7cf9ca87c6c05957f6d0ab82d41e57308626ccf0ed91cfe133695d7045c9dd63bf95bdb7ba84921a7e41e594cac9099782a72fd3051c23f34155ac7dca4b2131ee214144e351147292afa11a7f849c18526958b160b2b5ba49a54aa750c30d1ba3d32a9d4dd97258071d01f934a9dd7c33e8318ca24aa6f77777777776f5363457928092da4f0101371148602a7d0ba395de83c68df7b6271ed5f150193faa810c191ea437d5484008b1a21b6b204351fde57816b48088e235e3e08fe817fe03315dad44ee764ecd8d09e145c08aa445039110561546195a2e8a8f231d6611cf5870a4feab5dc7048f3611fbe784a08eaab3f555021f24385214ed1c06f85f47107e15a1e40e07cbf091927ad680744be77f396d05ae7f04d348551eb9b7d137df926e05fbf1fde0fe7f766bcc3ad6348df1bc0fb4a1cb3370ec0f7e3421ac57bef3dfaa09085110c34a4d28bd23b8b4b2fe8085ebc899abfd86a6a6a620d7ddf34ed38506347448d35352f2f288c4f8dcf68eef22668629ebd5fde3a30ef5f3232bf2a8ca5241313539a9999892d64de0911aadd8f278534d3a24443f34873eb35dbe31b8b02a9f98bcbfcb1cebf9db6c078a9bae25f26a59db66932d7fead3bc93cfe8505e3c4a2d16ed66c44548b54325125664aa6cfdc87a95432bd64b236130d52d1252378f1265ee4af17db8b5f8bbdd8de005cfcc58bbf707dd38be3c5512eb61f417b9f6b9d172f2f7ff1e205e62f4e35877913d7b337f1e22e6fe2e5d9fb3bad93bd6f64b48ecbfb26e63eedc32fddac32373244d478171b4dccd6f9d438f357492d683743e3fbb964a5924ccca6bdb42db90e9361a512b5e29382c5371485c016d23383a1418c8c0c1d81cc9b389d644e2f2e322c2e30c77ec5c4fcaa30ed15eb0c89c207fc7ce9fb67daacc7b469b3680761604c9ac914636ad162621eff1273eb2c269617179717eb2ca6161818ba64042e2e2e2e2e2e2e2e32259993cb4f2e26d3634ca616ad7492698981d9b4179796ad8355a390b90a2570ed9e12726c0f1432c8e1fdee3efa71e9f5f63d4ec1dafc628c8f63673fdb3d658d967b8db2f066159968dd1bda071153fd9f18e17c9d56e3ddc8967199a3bf35629b5d4aefe0628e124a2865156972c4f385d4cea7ee43318db11322df0fe4ad71eba60ffe7b6f343998d2ecb851df6fd43954cafcf83d7ecbaf1fb1b08cbcddb5f9663f3f968923151a5529b7a8da1c6e3fd6a84a1b2120dd2e7f6973a9c3258c4b7af94ae8a7991634977fe1948bcb9f38f5e25073a2c1634000c1f89a9a6863a5d2db1c59e9eefdc15528043cbd0fb7cd3beed1c6c539a58328155e3ea935973597f23635101e8b6a539f145a1812ba5eea897c924affaa168c54fa9a5f280c85ca7e601cf20d22c7c1033c4ef6e3047be95ce854427da303c621d06a7c80f1c3bfbda881719aeb80cdd06e02f0005cfe6083d53c95fdd4fc65dc7db866076c8676f313a7e2cd0e35bf7808808b8c4700b69adfc49b9a07808b31c6a8434dcd23576393e9a83917634d90adf240704ad2becd16ff6cde22fb998fdb6d6c24dd21fba9a14030474313636646003b3168a050382d0410a3123a9d0680bdc79384cd25853426fb9197f09281cdd038f99bdf5cd2180006cf93fdc0ad074dfeea019ba1713f71aae65d73ee550fd98e1db0cd74c81d3b542993f1b8d9e0b9eddc56bd6683bfd95173595353f364643ae46b247ccd663380d76c36f5653c8078a8dec73c23966400c0db0d805892f926ff6da76c3a6c7b853c95a79916342eb617e6e45f6ca72c47ac32f4c71a71926a42d0fa0aa47d74bd6442c8fbb0cbaf9acd86f2b0a9500750d4861008e674f8cb7e7e60bc9e2482ecac70c7151e1da836d5e617cc38da1951b9c72d8908b4351b7cad81c986d86a0d7dcc5542d245f6ab3e2d371d1e75e8f01f6e1d771d6ab63e8297afa1dcf683abf49784b4adfcb2d9fa4a2f7b80c6c598cdd6edda6c35db7b289bcb2d4208e16da08dcdbbe69dcdfb88b9b6b1b90fd7f415e6faa73eaa84b6676dde97e178b21f19da83c6d9d8d8fc65db7db438d0d699cbcd07fccc0661395dcb84803052c892e5e0fa1e4a8797b21ffaab940d31f39e19a2fb099a8bd3bcab843af9d3ccfb95d0e3f1c1e3a9d96ae44fa54c08f9995f8bd56caf94ed909f798bad2d7e41acaff4643ff27a324378d8e14b8600e03c6c0fc765d3d9e8f0c73ae8a0439377f643df47a5d26b68f75a3aeca3d2252dddf48b5f9d916595100705f110265243bbad35b7d9b40ab70ebb6caa3cf7ce45951dc6417dd36d85b916a2e6d4f48ba3ddc98672100f1fb23878a021388e285ede7155ea74d1bb69986261e9231f685d171d75cd6d0e6dde55423fb86a731dbe190f966af3ab0989c6c58b33a95d94729ae1548bf7ab279ca279bf1ae2948bf72b289c7ab1c3f670d86caff2b03d1c9dbd78c3cce697ec98a83207c0f670f0b03d1c3b6c1c84c3a76db65775d83a866edd560a3353a5cb3b53955625f46efa17e5aa94f769181206fdc155187f594dddb69eb235951a189bf62a8c19539556954fe7e19070ab7cf050fdab99b73b96646ab649bddebd28ec62e323ccf569367e6263235c84b90eacfca814cc576a9b9832452302000040008314002030140c078462b16034a80ca3fc14000f99ac5c6c461967418ca41442c610424400040000000002684200043d40e1d458a1ca4d32122f284aeb711328b28a92046de899928359226350875ce557ecc2a46c352554273717a423142685999edb89f5cb11d814616f61a22c4fc1af56d47d3b8e22d85229f2bdedcc9a4047349434848e6345209cfeac17d402f3beb29059d7f92e367198f4cca125c28ca6d1e843096662bfc4fb8c6d14bfd0a92b9aaad3daf2e1c59483e4c462244813dbbe47b7dab2c48e89d9d29522fc89103da823884a2794d611a278942c42dca8611b51738e0c6c9ea1728a89b7d66c150ef7ebc0d2d59766209179a59d5ac7cc1280766c339967ad9c5d2c77a0070927250f62c876f97f3016754b3f0bd2367661d1cc10bf2f20a8b286c03d65bb5556511ec773f05ab6a7b9044089a3d24ecddd1248461110fce5cdf25c5e4c0944b6cf07db10212b5b24c4dc51211283524201c09845b4949f6d9942c616f8d5c2836fb9ad62064e3bad5cc6fea7fdb70d8b5aceb68f2b0162d87ed19af1819babd9a536984a2189e0712ab81c58bc0e84b0eb429c544b0c5c5792465264c76de54f41e6f95072c7b33827e19653aa5eb0c864c49c888997245cc5bf2c2c16508dec07254dcee478a5ea7045893453f8d8cb2a6be319f705da22e6a387be35112f64da85b2c8ff5945b1b1cb9d30ce6117941812c639c86b20edddadf0f035394bed4805e4c1ff49b1c6722c968118a51ed35a249db55db25c46c858107142c9754e7bf2f686be07e30338c6655881d007795837331ab118041d7f43d0b2944812fa3938089ba9cc94cca7b86e866a0357ef012e0419cf8ce98ba16882193df3729890529e8a954fb9263b91693ae0c7ca74bb3a0c2208f440ee382f9167dddd2c94248c3b248de0e9ea0f47d209bdaa15e8bb0e31e8ead48993d51f16201cc685705923260dfe3d778b5e17c43016146577783e662a6bba85af2eb8f375931d8b95144498912d979ba87ca808ed8b8bb44426c398d5a1d6a087efb824f5c970cbd2d10958bea9ffcdfaaf9ab285fa789c0dc1e9e2dfbbf798b7203288563db475bee52f29a599a167072e1ec9de2378e91e89070943cf528940e35113cc80a3042939479bf5f59b18be2247ee804744058181a9b6b412e06230dcb37b6c57691849b312ce896072000afcdc71c06e6d8c52ef56a53601ebee7477ec63a46661ba9008ec0b430bc727c31827ec3ce5406a3fe7682496ad5c31024339cde344527ff3dcac5838ed31a6fd48c319cabc3858f035a7adc98c1e7e31662a01b162d4ce45aca6f59baf377f0d4389f5acf5918ac3b8df9dbd000d1ecd209359c9588954746c1c2044be88d4bcc4c8bb34eaf266631ed479e02caef059e6f8eb3d05e96545028de39eea93c04f24d55b4b9c63efc8edbc46827b948b557ce92fd3e93a51939cfce6ea3c31144b56a727c219e56ac668cc25f840249f14f251f39cd87fa26f54ba9e6173774801a12c6ec73fe01554c60446eed963351f337447e6c27df09b5b1acb3062e745179e8ea38071efb3a16bbd1ad9c919e2a64a1b7b94347bbed03b6c9715053e6df08d3dadb7be4eaa6d484cab024cf8615a0cf326ecb4a8c8588633cb36589af55979159bf74767650529b449c38fb0b660fe3d939882bf70682b5ce4e0431063efbfd634a6603589e10a8a8d9ec2118213bcc60581f46a5e8d4b1eaa29073ff8a25488223380995ffccb0da7ebe83ae8e7f340e0259a392ec17dba58bb67a578a3c278728e1e72507a9ad07bb2fe656383bab6a139398117e621db7a33b1f0f0950366f5c980a44ef4e03f470a6bdcbb313f19e32df08bb7bae288a5b218d8149f1861746223b43e7970d51b82d618851d3c9edb5f53872912564c16b80303939855d3006d75b439ee4fee1b95ed225b070e821b3d2b05c367419c512f3731d62d7983019d61671c5e81259fdd6c37a2743a59b4fc0d09d869892224b50b29e11a35186a4f3fcf53c883c72765e6d9f4aabc538a7e5d10bfe7be0b717db372ad939948253343817f808a5fc286a2f0879a1169b72b34ff27c0ada6d3de61bed4e75518dab5c7b621b11fad9dae2c52d7de0e31934ea6529cb52f4f843544eb84efc67d64f8146e17ea6d55c4e816138c516203e62f0de38c1bae314aa17471e37cea61869b4787a7479180a121e727b1647466143054912c5e77ab5ba33ffb0b1b94df343b007301ebf049cd677cbe5742fc6486e317af29888759aa460eed24defd7b3e389bad6d98efe568c8a6c5fdde4a643438973b7ad8c25765cf8715b09425bcebb8ea237b7de1d7661a036e2baeaf69ee7f171a5a68f4328b8a199ac5929dc6597184c84bab85c8ef05993bf9e317e6efeff72a84b5c1f184d32424b9b4ab71e1690ac3768e3cb006d32bfd00824be16d9c4dca51cc1a69462aac23f6d711b600b91a2851ed250779413bcad8a8d07225373edc4c6fcd7b250b920b2578131c235c24d4c706e013562dfcb799f29ef6f3d465ef05cf0d4775443a96befeed1433cee9b90158122d8dd6f690a06fdc2038b0f64a625f74be3fb997829e8c69ce800b38690dc0e35e63c12b058a7878f6a4f1979758dbae1cb683721741da84bd89be8b8f85587a3a6cc0fadd3b199dc4829199b2e6dfc982190af095b1785236edf2262e54b062f3269ee23a84c76ce908ba6dbc32ed352ed6dda384e464063dae9579de74ec50bbdf560ac53d77138984be16951e840646f74546674ad0ef736ba21884512a44481a081ef1ae6dae58338a8a72c57aeb496df2d3322b2fb0975c6494b34ed1da7846ab6556ded1e646a41b5a6fee2ea8796984fd39038ec041b7d4aa70b9ef6dbc45f47874db9dd8a57f656c87e04d8336c087e8963462bda6c7929c4b55fb8bf5ea1b54d4142a4a460a2fce367b9047b0e647d976dffe2f685c37744fbbe9c241897e151a9372795df872cc58ac81b5ba9cb1c1de141d5b9f0e4afa0e15e6a12a4e9ad41889f03aaccc0b7272032b6d83d3d3f02df3434aebb67d5329ae9e3efdabe26156631d524ac9945536a593bd0896facf53bd2b8f4e6474fb01bb65987bf17ece49fc80475b121bac98bd88eadc042eda70680b40c9487194a580aa1509af07d2bc3ea9e18e76a3427cd7ea0de240ba764e07513813be67015f02a5019869481cba965b1cb6e9178406951dc3bc333e0d5ec20089bbf8ca9dcbd2fcb56453eade9d2563230ad6dd9a07870318a407656c2a9941db6c6e3c0a268579d22e6219fe819d0a45d4293e366d11dc71ea3ce367b95a714231888fd8139d90b6274b6c9d50732b2aca1d26df210550cc12250ae3de3fea8f6154f3f33d2a3942b94246522a0f04cb452befb91e41bd083b86011cb2f6a797656007b7d1db91df287fab7a978f9c5fd1f0e649aaf6f9954d892a4f4339ee51b1a074446e154a37dee550700172266d3363df22ba83ed08e280ce4be947469d816b88dc974698c505e29f1d7c3d07c35bad68f8f0e383a54fbc5759ff7d404f04a87a54b32fb7254e4ddd06fdc9759ab1d859d7b0a2314778be7d33b573a42c905bc8c683cc9a67ea45eb6c968024d4e970e4087bcdc09c83da7f2d3f0e8922e5cd62a0a42881114b1aa0980aedf9d750b39d6f5650550e902981fe1d9046fc704f93ec6c190c83c146296893e54b06a46a9ea9c94aaf95c963b18b8c7891436358c40a5217070b28409264f94e98cfb05dba0b5ca973d14c20cb8381867f4a3191584cd442c1f94a18bc881306c8d98dcec0aece346249897b58c2d0744cd5aef9a11a20f20e8aea69f028027c38c534319e4f6d79828d6812281b54a6b98aa31e0345d69a4e4161d86891089244451e5975e21b19c0c94eaa4b26163039c0f021602e3331b7fc396c8c9094fd2a610d9a0f11c8c8f350e1ed75424d3d3f5a097c7c67f80e9d42cf799ee09c8f1696e7243973f71f4d2b181dd53b8358a63ae0769d214ecf99df5cfcc7da6684c7b33bb58039fb6ad0ccd98212f79c417481bc7918f970e8deea9b5448de5af3cab8f357fac61585d23036e76bcc6370d9d2f07a2f26c76f5aa76eb2b7a914548cb6f7918d5d1c3c28db7ee43475f26fa2eeabccfe3fad5d038510b6dd8a4ac4f9f4c7f07150d974961d10a5b97e429a6094ae23e87b1801f61fab479cc4d371168c4119bb7d426035a2064ed003b787d376cfd09698a2ca1677e88b20ba596eb9397807624918e1ff44324151dedb4aa7d559f997f61a1860d0ef9de398f076f4b1e290fa07e359356ab8ba7185b953f8778179f39fbc98e890a076a0155e5686c4ec186b7b7531b2e931e1f3059d50ede6c1896a0b05fa8db88836dc18cd2f9f99feb8253a733c3286c44caa57258f85f599a98e1c51c28203a59cbcf9c4a584b77e4d51bce8285f72c0798965c91f4be8dd9d5bada09ba4c3afb82ccd5342a90538e864f3a7938c3c3bbcd0df590b49bf47616c2fc726d8698f88eb1b1fd0050f71c597edd0880241150581a64d1b165113b0d483e69fb558970f240b3bf5fe65628965f9e86f2b27f4cffb53b9dda6b9a291428661a4b7db1b047e2166a7c44514f0b1ab7026469fc11bae074e8368f352d70c7d135f6b21bb24a1924215a3880a4ab755dc9a017eada90b894dd10c27de547ab52046173f9e03d153bab1d232da64bfcdd49274fbe9f8d37fcee192a896eb51f4e6224b6b0d875638e1abb885f62a10ac5395cb113a653a53ea54204989d67fe0916274c185e09405641ae71b9906561f998425b99ef688350333c0faf069bcfc46bb1ece0a69b05d295d472967ab099b6f1245c296b878f12dc8a194154294665bebf8643a51d32764bb0769afdd7c7a905486dd1fb2513a98b2152b9e2970070e5edd8eac22a9bf5c0bf59af22a7e295456852925a1422ead599f0aa2130369adc0651a7801d029f1c230b02eb5f2d63f2a8cab486b86437a76a7b75e41b4f9790041bc6675629aed92b5583cf83cbebf0a395f33edeadfa3363a18c19c3b98ef949ac003743f135f4a762b46a53149f3a0cd62db0a977f6794265cf3ce3c4a3c252b92e75eb23ba3646227d94422546bfaa77a7d68fb99f0e8f11440d7fa95eae1ec550015953560c7f2d384d1e3ab4f21a5066452f071c3c998f0281975c1d147e1fb938b07eee3d21c4cee3a69a9cd7c5b29ffbba6db21d449969a95295620f58a424ebe4c1bdc34cd03d63614377c149d49849edcdffe6e5b06d32e7b910d0d5da70fb7541c045d9001d0c536e814c76a5666f4992c4a9b99d49428281f200ea20748164513622c73392e68f7542b855adc4026f3f0960a37571c2d29ce32a33c63f743f99306e689f29a1691a91f59c537c0a72c64bc1293f311847912947f01f3a42006e6a8bcd074182a1f513d215aa7f1e42b4f4207f4932ebccdc4d775b7363b5f8c66cc7154db2113b5c8600de677c36bad914ba68925285cd46fb3edc7ea6d6d61b51175f5362af783e69e799097501740a580f281e037259fe98a399a44d3d3dcb8be12e0fe103bd6469456cecb9303d4bbbe5ba5c731c2960285ee324e1043326979a25c13b79532beefc4e734b971ca4f73f46d99a63ee5f2aa6c0106147af4d191731d2838eee2945a42a2a278c5731f360729dacc181f8bf16ccd024d52118592e96f7301819d08060658f7a5c80c78e03ec1106ac0ee3c50af16a5d73dd2d1cfc6850bf0691bcf6a503770b396466e12dabe4be1a409cca4300107c224bac1380ebf6951ba620d0105c3e5781d148129cfb7dd65245cf6fe88606b0153945c1304d43333ae81ba3606997fe0aaf57013116bd215a0a230a1018c542f1b50619745451c9642c8475965c12eef12d1a1036d282233f5d95d32a8212d7743e724c7effc8d6119840be788e21618a208546a5679ad88d35a0c224b6002b62453239d7f7fa465f858a5dce19e89b9aeddcbe0f82dea207eb06c34e7c873ab38d1f8e79fb845c168f7c491a2fe54bf588495339230c73a28d79d8a47a2fdac432f588bf20ed922d93e549190f9aa69318a74c9dee0717d58499128f8342b3e557e12833144bc05dc28d6d441fb655b53c9740d5572bfde1d298ed48f9326a3fb8d370571a0728a20e1b10d3467608a07e9dbf5a3ad6a24283972f19c1035806ff253944a4fb79368ea4fabc7144c594f057134074116877f181156028cfdac83b08afcffd7132ab5bc833063836dd791a45f7a11931a053ddeddc7f248633e771f86388a178ab9a82249fd12678647f048a37958f7ccce122eeda6de2e7627ce80e1d29c7976d0f7a0fbfe5e4a3a66ac409f682f0274c39c799bdcdeb414d2472c0456a7ebdbdd0fdda345720c66c4b0f4840760846a7a4e1dae4bc9ff0727c3418db070820d5e35a3f477842dfa2670f8e98457d9bd2411c3695d7cd52944b159e50c9f08303a12107353aa16ac550cfac8c8d14919b799aafa248db7d4bea58d5105bc19ce2e08fe251317576ee24db55fd3502362098aea4887330de644720a2ba876e8f8772ab15cf179dcf92986dc5e2e0279a499c9c47aa2262c16a520ac6de56ed754e4f72940242ec02c4eec65a3a163bbd44ad2fb9e845598bebb9a64844e9762617c9f38beabf07db9b4a1b7d885f2893d3c6828187f5288a51aa01c7c99047a0e9888e4c74960ef114a180e07aa2c97f49e7ba4c4339d03565c2f073b3a0128533a29491cd9d01dc9c245b79bbc7b390ca82d20195a9f3c4f16aec83353fe885e7265955eaa22b9aa467e47685de73dcf1b41f546f499f9529f80a90ba9081c49695334f571642d849dfd49e9a06c4e9ba0148c23a5b5fc5cdb49e97c487d807a88888c0a3a996b62fcb897f9a1b349998d861471dff13f0b08fe6188a64c693a2c9ef1831a04282aa78cf9f2e4f7d6a35ff64abf619d951206d322b6e370da757acdd34630bd61fa6084303dd1c39cdf61fb3107f7fb0ab463677b5310b75bfbdd1169f9d30ae47f834afdc34072b778ec4606b78ffe6ebc8a0ed4f4b5b1b3524cb6769b4818336f3646a0de5da98a0fe16a17d0d994636c6acac3a3bc7c840f41deee6d13200739b5184f8c316e9fc347e8d7cbcdc2fd99e8fe263205c194177dd681d7700889892d827e18b3640ce3f3830560743f34239f658fceb3a0f13f2ddca29c7c94ef3919820c2274d403edecbd31efb572c3c2ed7a3388afbb82832b5f0bec7fd67f4c070f096b6fc54597d9a1486e45a49e9bb3126635a4ae577013024abda9a21fcf9fb9801a41dae50b859a4c95fc43379c1682c4386a5c1a014f5ccb45f194eea56f9a30361b2489baba73553b2d6c04dcffd3302069d4fe3eaf3ee21eb12af0c7ea0997c8435f19bf75d2f1403ab0409ed19869e3915fc9a43ffb6301c8fd103d49dca9230c92be15ae1c9a4481db7b84478ffa72a4a3f803d7f1f0c83435991403295d6226bf46881df2e0d86643c5cac03b6e6f3770fbfb45ca1891ef02bdd761e504fe4c0ed1d5ac13cff7d46b8e491ed7c05ed9a83b188a35d0248dd8b2ea675c8902658c232a0e91d6a6f247bbe41ef07a37fb72d474b1267aca71ff8d90f259ab4daa213249e2cb2c5610bc768cb5b12d549b1ffa4074993446d1b172fe872b7756409641b78526680dfb68e5f78ba81b9c46e1559b100c4b6de0c112363f526f3018df33a42d31828c18000e70f29e005205bf866f1eacfafc27992fa75b0ece0893b422a8db96e3a984f4b9a37c20c73344d10634ce3ebafa2382039d3a390013a6b7cc250e735d65202e0b765320f27325f391d4caabd5de4f987257b63746d8ad81d3da38542ff5fffa712df2439884ca97f9bd8faa43f73e7b723f44102a37cc94478a8ec900458d8d67c8f783896b3626542a59f89427b483b75600a14542a0d20d2f2d5ac93f7fd566fe23dc67c7aac2cb9bc8318c5c1fdfa8a8a3d80c463f3b1bab0ddb86f58a713d6fdeec0f6b3de10b3dc6a9302ecbbf6c97f64132c292069fa7fb38df5041de36a80e05a38122ffae9aa2a307d0a50db4949d57a33e2fff66fd1c6f13415187f6737c6a8ab87a65d7a195940b3cf2e0d0367ef0038bfffe57858fdbe32a3b86cde950a2553251bf48f840db97676c03b881a909b3b78b9d57b1081e08fcb656990015fd5653fbec7c6ad8c52fc9e9491acc564e13c79090e4fc27989f5f4d738270b98210269cc14fc7cd84bc3cb89d07ab218d011e7efd194ef34cb537c33723ea456ad3f6725eafad4a05a5283bd02813b9a6ad51257706df10fe17768c93a0f7903e61c8f1bb8efaaabb76363d589d64d21261df2ddc56eac43a5c26ada07ae90344a4bdd0a1069ba765145f3de6d29dc79d11367067572ae3fb462fdafb7d4513ae5423351985acd2b02f07393b256be83849b054633b125a212bd70c3ca4d3f3dd56d8765e39601c15cd7439ac1c822e879ed8e05bffe8dfaab60af4f5116075952d203c6086d06fe85ed37b055bfae95e533e2a35886b1764383d4b5ab163c67ae5734f5de532236048af5c29057ce0fefec76576816b8a59bd0f4a38cd0b8d7a3b1fb8d1ff71dd9d980120ed664d23fc60a0cefb772ede6d79cd7153d3d24ffd0e8d897611e246deff60bacefdbfebd88567c20e043ee356ffc7a53b00b10e129d91610ddf70a77fef2e5d794d27cacef8c1f8e1c07df556ebf21483e898bcd596c0baa16d0725aedd846c8b57ac7569a56836df486948cf0238e92398a37894a3983ea57d3e903b9088223ded8dbea2f431b45fa45e80cfd80a34ec452887d7b1d1ef9200d9f3a17c0bbeab8b93bf52d15f510990a81ccfa3ba2b17e94982cc89d9cbb4d1eb051437b22719cf96e9612c6e1a99faf4d08196579c81ecf0794880be897058446eaf649db88d70b9a8cd0ce238d136e487d9d9e3405a22ec0ef8fd9847fc470378af8a8c94008b38020871ff5992bdf971088078a78efa258015a51e9017941bc9dea3f7c4cc128eda5eefa30fd39f0abac4aae8afbbfa0ac1ef4f39982bbd9f4f0b4e7ab16693e0e6adbe5eae9fc2b4e54b88572336bf0f8b13629ee654d290ea9039894c5867d78ed0f308cdfcdc7a984a142fd146877308925f2e10d7f8a64180dcc3fb4241353c4337fd573eb61903246366ee98783ff555e8fe02530a4048ce040c98e2bfed9efd9522807136881dc6b7cd30cfbcd7bf0c23504b7a7d0a5960ee8596813d3dd6179e5b8492c1b4f019030de10e12cccad9bf16858e41f2ace9cc6e438ef26c6e68c99573216f09247d90c19099779180131316ed4e2486926426b1cf436fa678c7e6a24b4f013125ff6c7e07355622eac25eb8efaf23e6e61a4c2d400f6ac04de806b871fb6fffc9bec0b01750852d997012391350786fc659f402c0813dfcd4ac57a4e30b04ec4fd56815962ea123623da57cb992468a67a8ce4dbd6a01c4eeafbf4f50fc3c92e6697ad2fd4e80ebfcf322001b5987c5839c832708ac776641b726694764bd3e0985985082ff8fd5bfa5f912be00dd650383beaf21e1c295bff0c830b7f9fc4ab21d109a45e914569575e5a9ed942242edd6f393f8684d1236f08cf29e91d2541e496aef4a518cb605cac70679663ea64a592e37d847b92e83e2b042be1f65ac116d269985450b35243b6f00eecdb08822b3925ff259121a6ab06e654ccbbe502d3b12aa5e64ed0aa58320cc0e08cba56f4643c9d72fe572dc92b34518d3c21ce9015d0250e8c8faeae27b101e067fc3f2b5771b2995c7326107215e0cee6c5d3bb9be1b821bc00d76e3eccfcd9b4b5ab7fde4f34336313a2ccd6a0ae4da23b42f95bbf2d7de1a2404c407e932c6cc0fe092d078bfa1ce86ad6535bcb8816cc5458e3429fb9e1d055999978fa68e613df3c2420e0572678ce9a2e751c6dee85e400ce1addb38a16b3421ae1fa6c2ad45a1fd10656308295eb9a95cea3c928183c82464395ddb98134b5ae1d3992727625bc9ad937bbd6e59b3491fd72a39f9332218fef5c08e300be75ef3277497a5c4cd63ebe3845e850eb78324073c4041032c7f042f9774fd508da492439454148a2595b5782f9174c2d83e0310635239cba42282bf596e4d2ae717744504ad584dcaef23538e0042afc53b7a3aac2022b08066e5fd3eec155854d41984f3ff43352d4a30619e6d2ad266aa3b442b589f259415e991e01046587c1c29cf9a0f6138f5778e9a8abd2d032fd6f71693bb4887ce582419f407c6f13048e6a195a895ebf284936797d05c2a1312c7c8b3374424a87e8c187bf6c225963665cead264411dbb06b1a5e9b32a66fb329455bc0cd82eab9c26bdb9426c2297bac1ef38351b1573f8e8123ff1de472df3d374b1f3ce08f9b9268cb468f9ec3d29d4918922c70dd94918479b831b4976ce5941eb13bc331c96bfc88352e1c825bcaf14dd9294a31a5b1232a03e12863f83327c22ad2322465043ec2e17aa8a3f09042efb0879f4f58b0f55ec89c096241352e00e36104969f78286ece62098af07fe8a0564077e6c301eef6dee06e18c51e5082ae4fdfec1ebd65a4110e40771607baac2445bb6281b601d49b043364f177ba3f0aa958029ef07b9dbf4acff09a848e8a7dea75ea97b296a2abc99476cd1e8e5153810e83021bda51d84c94cd6ba6f6bd70073d0f4d510a236e45d20ae44ec0d4067de328e88c9302e5a604924245e84858458ed3a53ac6c4ccdba348f862beb47d1265990326d2983f923105a5948a0b584a000b5ac317a8c6132538860d4a60086a1d1adc4adb286998d010b4b2f0ba8f9a3b8953a5b833a1e97119ab1c156136f66e3f470e409135c01c01ed8f402223c49922050cd3ec7808893cae0703c247af1fa7191c2042228f4e1b7fc7e9f024470449ef19003d414d84627c9738d0de8d43744d80502b7aec18848febc1f0d143ba1b78b528dfb5e20f632fb048ec21c7a577461e0d5d17f7284423c7c17a36aa10989daf7f54ae0c2aa6add860d80c665d4b67e2f49886413f8110831ee2d3bc869154c411272c1165e0916623a2bf406aa2f3035894bf5c82d79c5a0d85063082eb771369f9c851ce322403f8091b2bcded7a05cc6cbfe7f0c6c5051432b8bdb23468c60c9d5b1465982c229979a934371c38114979c1bd5478ec5992cbaaabd70135e46d67f7d6ae31de629c70304e69b00b1f11cac339698ca465a1ad11e22f3c127e1590cd404dc5b8a82948017235040d84a06951828de81a0cc1d901d93d02f0930319204917a82644ead02610acc8bb3873564c207d14f857b2ec56e6c29018037c786db42071e42817c09087a7b099391001a9cfdcb6e2613261b0cce2a749a3d7125c8265fb4f61dfe10b4897b940037203875f509591e1174d1256b8057f391c0c08dc857c24c319532e2d0bd90f26f0c5fb2e2b81503a145333a1d5c578ab70d274e2fa3828b1ad1068ec1fff6f229003605404c906d5cd2abde2d58ca4744574bb7c0f354c8451c0e853ea1e1bef50f68d79e6e481b040580ed5af8e4f5b20c11dcbdc258a5121b78d47e55af7fb7b704d294b4ca15365efa96039d81bb33a9205235b7c4810a3c61a4e044f6d90bea37f4921fa36c32bb1b10dcf4d9f8e9df70b02922a6e60deb14856ec1ee7bc62e38e49c7e2c3eedefe658fb6a8440e44eb82e4094fed0a1b7cc164772501e89b1acd1b86c0af67f15a2c5e1b8b060d6e37d9b84a22069ea89735f041e2b1b7ceb9571ad8e420ac1fcbac2d64212b4696a4c7ae1efe988c8d87ad490b921168b01dc9824e8587a3f1ce290dc7a1c466e7a9f02e4d77c7e2b63b00d9addff3b8f21a5cb40b9871347383e8c24df8b6513bb1a01bddf18aba805b3d13439516823371740f20beba77416651caf1c09bf407864a77c962f920e910880ae466b54c9e4e3212cda6d88bd514124fb61fcb310a63e91411cb2dc6805c9e87d8392dd77b761ec9bd1605c3ecfae83fbd5bc12c162d12f03c354efa20a423c3bc84cc89f9b3dca78239cda3b083872da3babedd2ba9535c84a566314294c7098a7bb6fd843dcb05efcfe05b208004057131deb8ddef20bd8a03798a1808eda4d7005fdfca0de687e413d3f13e6a13f894a7d99e90813ed4a722f67af8eede3e3ce1037c2b174ebfe580d85bb9a1a1ed2142c0c2502e56eb5de3eb357a4dcdaca39eef4cc429b65a8c03ea015d3f56ff533a251a15a868adc798e87a5eaeaa58d8cd0c379bfc0c1b7c0376ead27d417e6e26bfb9817631a93a13b141a0a0f7b6d40b028c5eb330a8d3845e9592c47fb5005ce6814c748289cecb2e5ce5d3499d075beb86b7b1641fa25fed315cf7ae05abd1f7eeb3897b68e1af0cb3e8650fb1dc9ebef119a7c947b58fc3617844afa9acb376eb248b5666f758bdba118fb7ad68ae0cfa9efba7f174130352659a559a11f2093fed1690371ebb5d0df8868fc23c6eed7785b87fffd69cd1b866e8233f4a1824ee856840399206a1e7743d4d64d79a811c9184aeaefd0b17b1644dfe600710459d2114d55d3e13bb8aa0e887318d73c94e1f60c70fc9a305e5d8832e10ad394b798ddcacd87803648032c896e26ce8383f6dbcdf1b5f0ebb2d6b8a414b3fbff76dddfef9b463df38f89613ed52682d6cef1432dfb3dd677acbb5ed079b0931236342db3f359252083c362676d35a73e84d48f86475c35d352be3c3030a5e0c17d21dcebe1e7dda0340c26f84dbf4ded24b00167a086d2fcbaa3546f39107d0f9ae9a020da603da45e3157f69c968ec6b2f1ce3e9bf84245ed72d031806caebe090d16f6c5cb270162a1e30bb89366fc56cf5564da798e29cbf40d08c26ab038eaf53be3bec6ba5df23791e79b182b4c08399392a0a2435cec8592c0c0e66a0375d0c0f4616e5c887290987c73fe9e74e5b9bb52811ce957c32b7418956d8cbb55964f82978ceecc937a61246480d64e0a908bf1b46f84c3b30dc07e0d216e663f0ecda591a46362260e51ed31c6fdd2a6c20434ff79522df88a04ac421e538c1eb77065f0f6eb11c22b884c4983c4ec91a9a12a10d5c8d2a2787acfae310379a546ffef09c2eceb47e77aed489a2a8c6d970f5de47e6b705afc0d9c86c055f74af82159f9f68156a42392b6687c9b772b67056406503ffbe844efdf2925677c28aa2609eff1ccbebb10c7709ab9469cba45b8728e2329429ece58e67703bb2002bca2d83d85d117473a63067bc06024dc2ec945a445796d781a92b81c197afa46a1351194ee443aada1b7a5c6fb0dcaf1bee188cf9d9f52a746a35e84a014ff081e426b372a0f2ea4a60fb008ba3fbade8fe5767c94b877fde928651413d59f36b30d0fb8210ac74a4ae041f440139e8ceb79bd233276f7525b80e1380e60c5d09e5b8397100fad2a84e516a1635544c3e73ade8c955422bdfaa9ec41d15e8b72023636fd0f2baa2ccfce878cc3b7c997c7189cbc065b61ecb0b2b11246ef10d8cc0b6c6ca6ca52fcfdfc364310f02f2c2554258a92c4126c137584431e0a02c812c17eb99ca12ee0d531f8c4e27d79288b05ed2e0752df08ab204aee490d0dc8062c886f5c8168f020d88cac37101040a8ad47aa47b1a3c147a8199af56181098e628a170cab67e3c6572415461fd2b3744edb12d21ea942584505d4f284208315618fc4ec8e330e6d29d1e8b3c874376370688893befab1f6cd7628055131ab1ccba1a01c312359f14b8684c0f1c4da1f3128ee6e8953c93fc8455e3e6c07ac8b5ff02b391b284be6ac015170e988d94d27976124859024b4dbe467568f2de91744d9d910005af1f2e2b7e650734e48a7860cfe78c1b65b17fc12578aa1045fb4776834508f57ccd2e12fa9425300c8949e739235da02c51a1070a468fb0ad8661a6376a1ca166f88d94763026255656966815119097092bb6eece8e00c6f4dbb4c5d475fc87030764cfc5a543370612608e5f9ae3ef67385c42bfaa01c7b70b56e00b6fe112187169756163b13b039db41a5e0332711acdf30311844b6c941dc700077a67be7bbd9b9c7089faf79ea8b663fa6b9f2f4eb84450a93ae67744be3c62402c114ff355d68095880dbf0372d22e72142058ada61ff3a9b48ba5eaf253bd5d24c84ae401fd7c21faf4d1241433c2c6a62c4fd35dc58ce3383c915c2d1e443d14259815cb141d625d79177cb18566ed72061dedd73bc49973bf938f299aa21ace8c2a5dd3a22a4c5aa0932af2ffb1a062b04783188ddba25d9ddb6efdb662025ec8feb6aa410ef40b4242b52e18e52ce49d3bd9f0acf00bca120be242fea09966314766a05564d44fed404f5d5f5148c99c0bcdde663f81a1dbb2f792643b2900e1525538aec97b185d25e46f659bcdbdaac05e7f22d4f54440190220a6ff0f01fe92a2a3df59325e9df1df48037058ff45d5e37e32979c37af26ad31a836d24a8e00f98a5970e078a1d76393514a73d8e3d8b6c844b40cc54d0ef261e073a590f5b26ac3bf7e429409ccfb34306bff63a7585c0fef16b2ca82d29b38e89959ea562ec463f70e9b779721f5155518ab16a426d1a3e917dc34875d2faf9c8061523521c2f5e1a357a83ed8f2852898424b8b882641ec4ee78907f5c079de0445b383d184d65aa139ad106674b21c10575c20ceae848dc7ef83c79ea36eb4459a6b3476fa53905fd62577354f8abb9dd7d13c89266ae93f5eb5643897366e10457dc6b9ac855b4bdf977a41d35346b020110376e24ba37dcf996bf408e92184453dc2b383b2b97cf91acb92f9b858304f58111f712674556628e74856bd5bb56ebdab92ce7d9e54233ca06ff7feae1e0542c8df93e7bf76aaded561733e11825282e2cd291b9731827e4ec47859e8972a91fae6254815562a34e53b02eef865297e867df233671c646df48722713c7499b55f734e71ef80e9d70d48e9ae5774692ee3672f7bcfa84069709a5d2d686d3ab483d2de60043a8a3840ea41c5a90a4dd51e289ad5ac6c64a5b3573a7527d8c146670af6bada842cebdc8586f84e1e8f3eca5dffceebd23c6dfc69c6eb51f9aecf0b6ad7e4387f19632d4347002b4342b3dfd456acb330c22a31abf7fd974570568226536f33257dad92501791beaefbeffc38ae32857c4bd24e8c6d84a28e8ea3b9f7c91cbf04f44ae4cc4b9e56b654bd7cf12a5eb90340488bccc657afac8b8a768dd11cc2ec13972fba03c77ca1d75a240e79bc6456f53ff1216be8841d3198e58b435b91233e5877f7209950f9e29b45799f45e46e393aec5a17eb07303ca094dabee86464b2c1dfcbb5a380a30b6d1c221c843e3390da31b7ad09caf99278d376140aeb42aa19832b9662af6282fc42948e8943920a89b1533d301d958a457796f553f3739a64a011634e2550a5fda3dc4363700fa15182362cef3269b7cf58991af9ed4b588e55ffae0b9b3a1a123d6965d7f3225b10111e4d1477c1991c415b562a51f8b6c63b7673284b221e83c6a1e4579e9a0594e952a90f31e44f39583d747d796564f5d37b2c6baf9c435a099689cd3bb98fb0c82075026ca046cff7c0e0a71e44ad876a2473f2f960d393c0f84d6906638c8d21123b11956246e8ba23d8cd9f5f940d2a3e672f6918098ee6cdae79e456aed38dbcbdf9912197ab5bc9454516725a5d94c1c265e0991be396f13ea5b1bd9b20b72d5959db1723da4106aabf4e162a1f581d624b9a2d6d963f9980bdcc7d5337e334315bdfe47450b95b4ab6eeafdcf22306f1ae8011538710ded7be87654c9d77c15415f1740539636a74d9d269349b1237aaabe714cbb9a176c939863406b838844d6320c5d8fdadc2dfab06012848bc71629a1b54851186af30fcdf716e2aec75980f2c9cefc8907e7aafa04e05d7023e4722ca2641f315c1756a703229098ee1c9944af887b2cdfaf8337dc55c17c24a9cc9160c642dd9cc8f48306c5533719c3c140aec14801244db2f77fb74c64564e8a7da67c27707bfd04c5816bfab1b402013f9d05e70fce91b21b3709fb7da24cf2adcdfd3dd1f4495bf2ab01bafcef9a1b4743eb6fbd3037808533a1bb60e9e170f76decbc560a1ca62a290d8f661badfc8588f943560e3ef8ef7c76a215d3996ee20d0a9653dadf440a8a36c05b5829dad377e6c78cc3d804edcad4334f2bc48016946e0d2be4f70a4314f4b5657f3b4d4d5b790a2ae2320e57168a50a5a11a1e226a74fc1df9c1e72825f72ae20a4367ab6e576e31170ce4c0e177093fbe5b4e8a33d60f7b2b28dd46e5c2681949ced15d773b66e457550a0ab9daf4c6e0c35be08bf05609429d4c12086a560d0e7b54ab0693513867179fcfeaa4b44768134ed6c5f0f63d5154aa2696e457eaad134e9b9d21fb43c084e3f922282b68113603a654cd109eb9986aed801e6d66560cbd6960abfbec62bd13dff9fa09414f79b96089165b616ad3e653dc2543258a60dc39cc5591dbf5a633867c2cc681248c6566a4c45b28ed5848292f7d1942f818e9039d4593170e74d84125b9f2deef5c7bea7831d0e7e8f97e5f20537486b61f305cbcda3ec50f0b48e3a72fc692d676d3dc74d7780037ce5a80af750c4f83735191fd132e771a5f40d6295903de4ab990fb107ebd3bb38c9a33db7f118a7ef519831a3daeff61d9bf99b2473eb205570e624fc6276fee1551ed2388ff73bcdf1facb9c5c48660cca24854780dce2e276d220459bb871e13acd0fa797d3b41144fe6a17fdf0e83e1fa407f61b9320d0d9dc95d3cdf74e45cd7c51d4ed1c6c13be22eff85f0ef3b147dc7a1183c746ea3f38c54ab85b6dc00f21c610eaf42527401284853c57b1f5caf6b0d6433aca773f4d9318714bda92b53e11e1ac51b4f49a7cfe4130756a5a8534f33c3cb83008e80feaa08710281e338946e203f07ac29588b105b96e5786c6b911c02c2531ad167d2aadb558708f0d9b6a1d3ad4798195b8a81731052b20bfd001543302bfa59f1605cfda32770bbd77b1a87cffe4fe0a7a321c5d820f34301c823b86fbc526fc3d28a5a90cc8d28774e482739cbbcb4dfe7d28a5b25c9064f1c7a8dbfc69ac88e714e80414cb0e51aec3698be644a1ee8ed1b1adc436609787aaa784ae6f7a9da1bb1ba3f467e7217bf24c6bf74e39a5f595fa7d95045d7fd88fd68720991193aaf7ae41890717fdde17993efad3ae0d741c6f06e339c5c8bb70ac6cd6e97ada9401227da5dcc499cf513c027107f89139128f7849d374745ec160acc0799f60999d0081ae47f1c3c273d52d5748adf6b3776ea60c9ee76e300022cb810e063041ecdcb16c4686a602a8997cce1845e3ef14f78197f88eaf7c729024feb4f9d8199ba1481289574ae0190adaa5f012171592d1aff3e5b0d5cb9ef086168e7c3927fdab2d20171c86c0b8823d59f0e5dcd3d2b0d3fb057ddb52f5f4c95c12ff156638fa7e75aa5b467f8914b7e72f824e4aa228e5c722cee754d1769a909ecbb6ec2f0c77f120293583753fef6bd9fad1effb24876e82eae7f791e63f2c81d0cee16d64044bdceea51c66aa79f14b5bb18d54b8385a9e1289386e8971f32e42e5816de91477d178911a85892bb1cac7c0e835b5e0867909a3e046ac85f33ab3a434415598a13d7a222c0778207a08d5402ad39a1dd9ad8e3b3221e3925fee029f0823d40845aa17a2d61a7a874d0ac93cab3df9f70a2206d5ba39a9ad9d9c6855838a87c7f4e3203bc6567225fcd82dc60257ad8d71a516c7a8c38096370632a6cef3e65edbf8f051886e23ad8d1cc7fd9e566562519d7d0a28fafe35590a3d97675d29b41c644c2ccb08cbb15efe841d5b407357fa370a89771fd7ba597c060a7dbf372b833aefafe3c518a7848f63f6072d9e81fb904c56db3cc543daba861ca06f7602c1ddb940f9b1d38097bb72f41b1abab42416c6e8b35a5c0beceb54bb10f365e5c79dcc350721b1212813722584b28f734d32e6ca2ea552b0df82ed522bbb237f172843d15d6897d638fb8aa9706b882f609c1775f6ecc1bd84c262afad397f200cfb1939a147459563703a60bdc7ba05a9b568fb87338c4da7d826e2ee82c4628f3d646ae07420fc0a8a2623166f246af00c49207524095d3ca0e4878891b2336d45a8041cff2d11ddd073e1fc744162746d7d903876b3ef4cd2c603a5aeb97bb14659a09b1e11013df0dc5afb94e1e91c39f1ade829a80a0a1c94faed29d849b80c82254fdfe1a5edaeed23b9b68d7184c6d17bb82d1f8d3fe6e06a6fcea4d382ef38f992131893c1b314fe67c07c9c1da1bf8111ed02763b4914a0fbe78409021d76b800e966b8b5b0350eebf36063774d805b6839668e4caffe1e0997eead4b9e562afda005f71caf0ec229015d32b3d016226179d85769d6a03e6835b6edf76cdc2da1f4cb5c20c239f3d7297e04ba294484b508daa422e6a5cf5ab3c0ae44309044d295ec8fbc4142fcddcfd1b10bf4a78ea79384e4f9e6328e1a7b3262ad208956b720615862c69328ffc51bd32f0f0809469cc032f600b0ed06e44df83e65bd46c4cd9662ebdf207c87d16b74a03b6b39800ff0b3e42c0a0bbe4e414e079383363758b55f0575e1e8836a39316c21c169e4ea6946b038cc9e08aa447bd2ca163e6c6f0c7516758a5572476005bc0532343f223acc46093275a42cd801f0c6185b55325e30bb5fc74f702db6756f22f430cb433007a5e0535d3d34dbdacdc24f5c64c54391eecbc2c92b8c85f261ff7d2765845d4997ba03bb3712cee552729f7d908fd7cb4273ae13d11c16908bde9477db32b1a8c54a0aee0392a27739294470e0e5068f953d51145aad3c6746508eff4c13a72a36d8c425ae9a2642d8af5721be70b9a1f098686c2243f4f87382d95a3475ce4a1feb8bc90d36f7e0b11c8a2484b1792c88284f8d87e16a92f0a67a7ec499b790f1e29357226a9af4d176e8afac9d6cb5e8e184df8583196b4fdb129fde4d251ea1eda3531f0dcf12ecd0e55325f325d6b30a2482abc158aa5098fdebcc44ac2dc727b12955c4a879dc5cfe69cbb713ac9ef4635ce6cddbe2f0012f254b099b79433a0528304df658c29e71e2d5ef7c7c2a45febaef01c2374cab14b1e1d6ab77f42bcf8e77f967493db0edc853e5c1631215b775af6a1667eeec4a328867f2d4166cb6ada3e4c94d65a84ebab8217efd9e8bfe95f3bb1e1904f03a3dbd8048ef5939f0fd65388574627e0f40a34b4185c602ff9b97fff1f71da2afe2c3dd6e56051fc75090e9347355bf381c27609cc17b09e46f5408854968a943292214d50d019825a433cc2da931e4f311b78fa248e5cb9349a748131528c87f6a32d6e26622137185667cf136d149cf220407901110b25c297fcdf217265e134e3ff74b18b2d77b01b1257787f7e53fc68c21e5a2191648894bddc9c180b681e4b6ab1ea4e45550b37ea4b6a94de111bf2b0ba6e0c88a7af9b310764c218215d320819a9a0d9338a3763237da100442a7a024ea3f4f1b36a61b4e02b361e4d4980e257594b8da5e30fc2eb1f4d86e18762468f2bea0862fc7c9a07b8790ee497b5a8326ee4b5d7faf8e05a1263543aa1cafaf30821d429b4d3437c456f56c88711cae3c673ad82282ced1f79a2dc85160e7c3978a9b828c478c854703f630e9a329351910f0c9adfddf7b40444aea869cdf4e9166014d04bc19f881664e3903e53b890867458c3be637e2e2c368f970d67ab7e0fdcd075897a8a22735944a228cf23cd59eda02c054463e75b7c544d97208c134f92b807c2d1fa13a64c2988bca5578f59e12715975140d180851c789c55fb6eb77b7c5eeaf0d1434c898540fd5fadc2377604e5a53953ae570a87f0a190b2c694f10c9da99edae4a775ad60453d23bc3507206e3db10a4d338e9ae218b433d344217461c397140611cbc5a5441e12131ba9fedf335cd6f2712528608a1faf4ab387f0a82ab9cc7f7924dc39ec9d632767bfec834acebec645c4eaa1a0782bf93800da7fe6b1c701a7329d232ebbd8574f0b9466c8d660fea56c99956e0230b762c5dd1143da30e6aa4f4711b4c57c24cc3a49ca6f7169cdec92604d8db1938e94dd64b17a71fc70c397f903023a9a8bd1dbecdd798b301acdaa94612d8af252791c116976a86f9edf50bf2d3cd5c8fdce520d29fade910549edeb87340b5814b908167a83372b502046885eb5b0338ae206b7b0fa0f00a98b48236203630403d46f6080c318a4e0f1eba70f1dafde16de097d7b7ced8a0251f675a16a691d86d19cc224a0d3f7375584b960e15c7e6021f688b0cc7075ad615a83dae1a404905368f3944d32d5e9727c68c861497b17aa8ecc8bba707794e1e0a85ddaf0c743274c6a79aeb966a06ca21ae08063a464c27081fefb03d1f692a0ffb78abadf33bde044b448a0a7fb82a91dccc747365238ba5560457d12459f8f3fd7e731dbc31a18f514144e11419b6479875047c12fc9f559b94047cf3b132331658603016418ef53fee96d4cc8459b5d81c55524ffd65c64a0c40c2453e93a09e2de4badc7fb35613eaa986e96fd3a888328699e199b56c77d0ec5f1e608d24990269160b5913732f473452ad4c9dd6dce02fd5756412c500ec0739b06c5728827c849d00408c89214ae3e6141a60c9330d4dbed87371dd9fc5eba8af95790fb3fd6d3f0ad3da15a1d44a258f81be34f77f160b3b7f508319f7107f358590a06c27bd13747222bdb554da4bc0553bd9a9faad33ee7ad01372bbf0908063b83411dbdeddac90dcb343ba946c6ce9e9315a503b319984f255daac3ba649a2e4f393b5dbdaca2438b686a5e6fa38ad44902a12e2174b041f4edd4cb75a6c0fed3a86fa5d9aa19e08403fa1d1ce270806f0a5c6f83f89bfbe54ec8486d69c37f40097ec1345c0d2a2183974afed4810a48d13458086f0354b8f81194bad37fdc3a2e86856d239e7b9dc58993103633afd6bd119ca5f70457aad5046c9cc336caf597b0adcae234fcd40ac3ccd3d863c0c47b33a040bfe8100fa06995d54c13a0b0cda9f346b64b07a1224d3a66bb1ef7084b7c3ac6e9a741f7867c2f35e015f23f4f69f0ae919f51d1bb2a665ae3f5777f9316f6c818b57b1e2d1a2074850c4cab20a77580ce5c825f1ce8cee27886bdf2e1f939a3255ca2479541a953546b580c0526b66afab3a2cd317db31e1e85c691383ce6eeb85df29c67007c4aec7a71495b95624111a9a6f2932c58687be8a9b8f661a556ebdcc19d5e19cd461abb5c77182fe8af6abdc0cab49b7561600ae3602c3c4748f10e39b67c5892b1e4c0e31dbbe292da38f9a53baa0e4e86756ccc2ac9278c8f78544028e7dc89859dd083d2e7ce8692b163758ac87313a08aaed3f871abba05d3bf9c144bc6616e21c49fe22a3a58d18ecc7a4645c8976efb7b4dd694bc71527f5c697ede2f6f85e9cf427a6f6795fd02e6a7a7a861006f925ea9451a1cd6306feb15d34bfd7ccdb8a2b13e15fe46041fbb2f159fe670cbccb0c820c74c21b4d98b91e74b43470cea3b824a7e246fb61688966f349846b4417bcfb56ec68d37bc051b204cec2b41b5d2f571daec412d057ae9c628f54c0c5363436d281a50a8d5c147dad19d676ad92566258e63012d2d8e7227503d374b8441880827985a302464a591f84e737c6df9b40c6ab37c2a484d82ee7ae1a5b8a672c70da89f0080bd82df75967902b2b7d430e22121e12a6df43518fd8e05997878bb602fe14018e1eb0d4156745b9d04c7c4719d695626a71ebe8cec11bcaf3f606fa451a09ae3e5ac32d830bec6920ffc40ed79708c97da9cc7af58ca1c2db70e2cd200f9cb4da1b53c246e39f51e7316b4340e030553aaa9a7e7621b1bd93270533dc57ec0554871568edaed2c6add27c9a7fd636315b80eafd7e0f01d69c6d445db99bb3e4479cfe4c352e04af77ae63a0023420a1815355ca6695f0acb86279ad7ab658fec21b0268683702d44aed7990f44e3df7ba0bba4226389c8e391665bccb93db08bd7b238c1faafc53fd83c47ce8c61d6b6e061559bbe9e826930f23489e718bdf498ae245c5e67f0e8612c309d24344634dae13240d55850b784ef18320e69ed0dbf54edf6a3d4641ca98d05a97b60f0a60b4034ee55c617b36a59bc2b44e3019a99d22cddb741906d446bb6c06def5264de6500926a865a72998d428f1f4c81f5800af2f0650aacd9132e7c29446b57d8f4c4dcb7173d7464eb4fef17fde7d6ad246e1ef0fa0f1a4a56f073987f03f8c4d391af92a7734e3bc32acdab602a5cd4e9d208dc09db7b283e9deaa0d38eccf088daf17136e57ed18d49a1377c107d6316002121d1f48b0f13c0dc200c33a104898f7607644ac3ad16beb495ee2f7c7254ab2d9dd21d4c9105f03bb0ad73ed79bf4ab60812906bedc41ebbebfbc9078b18fb7c3827d6d973e34fa4ab0f1e115eac259441a021edc67b83864cb21c040603a1574c33fe939b3d31178054efb0744cb8bc522a2b9ee4685c794a8dc84720728a27deef22722fea7e5ae04568e582c1b153de3eb14e5602153d127a358e3ca2439006a1e8516e3a8c48b0ea28464b79e7ed86beebe5d142724d062ed5622566872cd7b11af2608dfe5ae6f5a86d6e22a180c026600edaaaa1144b25c8e0ca8b163f9608dac194f0714924469f441d3291ce556f27692c3c2896cee6a1077a87ba15400aa8f25641716bb5a7b7f3cdd1821be4b29a45a607b955e5d6bb4708f1aab09553982ef77dbcac4255dd312cf04088f4936bc7c5983b286ec8209edd1f5360296c16c5e7dd5d58d13d3081932d22e4846d66e284defad4b38254710a2fd75dfd7c14b790d3e6702ee464909d5ef968f0a95541e73b754398cc8e9ffc413378759e40e66d9162b3c036ebb6225fb682e7ffd59ec1847b8f66b692a91e305a2b475d7a2ab2ed11b20974a223bfa8430d0e1d039870244c854ff9e02739a0f593d0399bbf6a2faa4c70ccad5a6c6253e0fcbb50a0e957b802a21256082f941c663262cf9d2720c07117aacc6c24b1bf1934a00894a018cd3ea9793ed79a90162b0f6e70349f324d1541010186a52b50e954b38adc456e14ccf61587532938816bc21a047d4a57fe2c1b4fc578ea244c48eac44d8c0b265f29116d7d174f27a0c66541ed7d9696ac4e484e65d65e35337ca750e98738169b3202a8b4ae084a0a64478ed3ed9ff4cc2bdf2fe40f98c962d1e7cb19cc7fac10796d54c32501368960e79e198fb149274d7b090a32168eb4402bdeff918a4650e719140e71d579a8d79340a650ee85ef488140e29ed0926cbfba3af1b04af9c28fd87358e8762adbc619197042f11433c38e66fb750084f10f21b36846e30c577aec1144ebb3882902a7bcd9111fd12013bfc086550e860e14074609255f0986bbccd22634f19dc5f5872a16586bb635589d9edbb93a9adfe44d51689e4cd27889632ea7deb219afa929efaec92da7baf8108cfe641dfe793ec929852ba40cf93b7319fcd56c00902e1b886c84201bb58c4beee3c65e1da3ac4c6895df8159d455182a4dd2118196f5b3e33c87b6221fbb847d23800f48eb16160d75ef6e3073119c901be8f767d70116c67ad351d259d0858e229d08bfddf99605a9dc194277982c816ff8775b7bc20f816f7444fe7374c79b47684420467051a69fa1806b7b6e630b2b6538fb2253455b7cc688630c0c36f18c43cd9c4dddf87f61b056ccee6975aef9c255f1513e28b3c08c12c57eaa01d6c59925e12c70a6e73e5904a0e3b9155e0570f2115a0fc6f2854f9b6960d832568ff14c77d6c747f90cc65cc788afbb693f23c729f979ade141e1ec788bc2f85f1cc07662989e719188b7a4c96c0c716a122fee67a5f064bf084600d2030c5544870883c07d7ec4b261e58495d99791957c387d17c5876133b833e2f34e49e84ffab4c98c0d024eb92eb3fc2fb6acc75d260a65c89614bd1749013b92f757ffc4d1df7cd8b384cbf9acdb3dab67b18ac0f92a931c4126e14bad47f609daae1a92a10ce98734d9dbd942a27681641a0657c60b5b311ba9ed14c82007a9d1e170dba49ba0c99f71b588346a25bf0dc54649ff7622586191b17ba03d114ecbee511dcb43e3618045a6f4a93eb21026dc67c886cc0adf36b37091e2908c5a2b202a50d710513efe3f1024d2bf483cb5ded2fbd23aac851655dcf97005d7ae5155a30f1e763b8e0728d997ed615098c39f2b9500f7ab2277b29ae20eb8abcc1b583121e7f3e71e91e923c567c65120b1fe7c0a3e77369df84f56801aa53fa4a2ff987d550e6278b2571d993b7152e56fb8d52f2dcf935f4a73d58575f3ce302d4af85a4fd48edbf55ba6833d06a5758b3a7329f2fdee7087ee23c7df51d620177b289e5bf90492bfa884d8c91dfc3f7e689062efde0d1a90e973138b04bd11924d7b4cd275e87ea54b02c65704bb341a4f0c0013e0c6164b59b866b43c33e0205f83fb5459400c28307d5fb874bb31d72d8924a935cf976b2f70a8adc158946a730cdba05ca4262d0222bfc93e64e4d48108700afc797b622c006942dcd2ca3ac11a5eedc9ad025ab87fd7d5c888782d8c6248bce12ce66891054752a82a722798025035079f900ba6947c5a6533de0b129e328dea7ad4005fc514111104b9ed2a585e0816b896cae6f4c408cd1051b13183944b14fdca366548d2ede3ac6f27a417f588735e88c485f3dcd6045728bb219bd3d7af1870161b39814796bbea40bb7cf546cc8b0451c04a42a7c5b262068169308cf7827d7df8466e2ff6120597eb96aa250845f164866b51233afe6b7385d006518ec30611f23d3cfd1a2bac14d21940b07563fbc6b4e0674151363c6157cf32aa1e833407cbd3912d415fe085ec24ec9550bb6055c718fdd610e361f7663d691ddf32f92351bc5ee175e56ae8437884c7ffb5d66fea127bae193516b0ca3bcf2b6bf58ba5e5bcb5efd311a1308b11a59c2ace58be03535837ba31cb1dbeb9d31707f216d9f17bbd1f90b2371bfdf751a9c6e5c1adc64fd23ca7a16d698d9f41929e3bd07f1617b58d3e480809daa1ba089afbb81f4ebf99e54beb44a59ef6738058082bc53b9e8dc1abc940cd28ae37ef206a250f6abe4e6d992910ac3464867322a554a2b1db7f9f239cd71ff41ff0d3a2a7aef5e455009b4c63ca7431a19ef63d189e208c5c04d530180c0adc0aa7382a830169e9058f9892ab5f617291d3b07fe4636bc7d8009087c50bbe24b57adaf7bda319668f54731f86e6617047291ef273e7487295e2106a4d821f0d0459fd4a62844e37cda6432e143802c5558aaab7f70ade9712424c9b9bf932e26dc48b2298f33a9c0ce3fb8e6d78191ac6f14424217076f5bb5b42af582398a1ba0052786897e8ab610183c4c1d47380d2882578fd13d079c007f3a0c107cd7a88d52625087d53c0cc0c0739e0abab60569e53ece5e2df459ac6150900a600fdbe4175965cf021ae0e19a844fa5021ba2dc758686bf4f31fb17303c560b4f0381ca12148e027e2b3864aec39fb42ce8216167070831d16cc9632a44e3f062ab3de380428b48c142f18e28f7c0697b8621595da3fcfceb08e1bd1c11751b008785fce3972ab240795ea2a77028bf7c18a5a6164e539987d57920fdd40903781cb243e0872aafacc2a8a48493550f80012f8d5677e09f1a1f141b2fe016e6cc6d79cb092801c0de37f5986b49d33d032151fe80c8002ce4fea478e0d3527061dc2bf1fa7fc388e83ed81f5082cf24948a4cf8f4190640b86a1d90ca9031e93a341aee6d58061aa5abe20929505d1318444e96c78064e0e7f54abfa2425268b19fdf683289f2b4c59af79243ec2246356ac82ced0bd4f238c10bd96eab54dc62aa71f5042e1458cdb9f300a0b6c1b4433331a94a22a4cb811360c885ebee0db4e3d46767e0066c36caddc6e87d480ee89d4bda35ebbf04edcc755641f83048a44aae72b62317c13e98a7cd7e117a4d2492f944a22d348d9eb69624f6c69d27c7ceb10276c5700de772e217c1fefbad6e1cbc2d541df046b552f75f8594e3247dd079fa590969f6ff688c4a653dd3ad5f65752f36a3fa2f2ff3f4805bf478b3eb7cad35900d07d9a5462f93dd26d1127db2a781d9a3b830eff313718ff511377b1eb612ca6ab47a6ad8680e1f7cb6ee7103d9b9ebebf7bf0504273262ea4e00656232dcfa852fd84f1d95fb437d6486382c08ec944bab0d6ce537fdbca7e6aed7aca73b61f0fb175d85d98845ee4a48c484a6ccc8cd80bb6edff2deaa3b6b75c23f92dc17f90c49d6c5b4c8873133a0675c54f8be28dd5d6c04c32a7318d069c1bcdd8a175154f5060dca35b992c4d2dd1bedd7e2e0d23317b647c0c0f7dbc715867306d5e16c0620d19260f5ded25d010b7a5ce3d9fd8237b20afa2156ce5200e6e431188fde6ac1f8bf67afdf4903f417de42d21a902f13cb124d3cbca10f9ae4817efe714646edacf3b116c087919f719225db0db06825b3552f1789bf43a293cd8bc440142b6ff9baa00fde56013b42583b0c8201c2c1cc42ab3986fddb0534a30e286fcf96e5f0812f833c0e58867fbbadb695e36c6b41b1f36fd51ce2699f4c92c7dcca10b658f52b200d855527ea57c4ac0f777b2f4c57d07c9a987fea85f1a2f5d7e31baa188124231c0cfec5c7086530791b124fd3a43b67b8480bc28dfe28a148814764374010c9948fdf00f0da31bca19f7c99c4de82dda9854a8fb9c8b1ce52cc2c91b248bb583577300af03db7723b37861b01e163471c3df444dff8f9cecee70a0e411d5e05dd600510721c193d6ecc9b1a6ca5060208c701ea9e3ae99869a68d628e24b0a6b69414e8d21f93030895d3bcd0786caaf294a9e630cda9f24701c5ecc196e6d78b47f06715c775e41998944cb3cf42b0bfbad5f65f47365821508310107f3383dea2f5c60da445b437e190236392728804f36518fe931ae5e252c604cfd986c477cbbb510accfdddd68c83bcbd06bd25265d5daadddf701deb234694c969a2e38d0e721ce96319ccb2d9ded65cd8ed759ba88e34009d4844ba93dabbf728b3c8056a9768120645614ef7ad618e41b48be53513340da1793189dcd55d7a4cea643ac3fbd3b5f6c7249ad5491508e33175d9fd5346112213ca29f81e6def16cfa7321056ab6fde256ec437471eb75689b14ddb8df42e544a4485abc7556ac37a2309e8d3532fc2097ea5442b00d26af67c259a04e8ca7c847657df8595900b8380d6c2a998d8f9f63769300ca3f90e4aa434252c0f7a5f19d1c1023aa892270ad51fd9dcfce46cd73230412f3e3c802b8834ae95e22e4a401f0aecb5d7903ead4428afa8bd2bf1a6c865ba6e36aa40a1f757a687ec00b5f963cb0bec83cbe428b74a66f60233e0e91d3c48cf297b0da884fd9b82fb11a8118f69e4e4d7ca9c6c6992bb413a7b5145c3aa57da3686ad046f14c03893804e7dde28e7671abcbf3d83f38d2212189aafc6b1db9d67e1d19a59a5f416e1c79785eef8629574b322c53725753168fda96006c029be0887a1a2635ed3155456ea22fe42c263257b80af1993942626342cd4bba04e4cea3f90af704e7ed60efcc0c0d05144ec5a199017713996e2bb28e2303183b6de3f0a22cd7984413f7338b11736e86be769e9e5b4cf622c2ba0399b592c3e262edfe17f6369136204444c55342bb0380754b1be60fd87f76349857859183c848013bd29b64c6b46913640bf0d4305997ce7e826aeb531110625aa507040d23c115a198bce5991a28c29b96abbe30108f370f8434a6c13a642536c56a8321ec2cb738aee296231f6d66655d001a986be54e3457cfd228c45a2494b0bc3710690a2705f912befd9c442e9f8e7868b1039757ec78c638c2bfaac21cae1b57cc6999dcc9c3506f86ad7068435d6d84a87d5882b4fbb8c24d020ffe1505efb9c412b8f29b50ab679944883a55ee98480e7c39ab7ed70f62d165612cc3a48a2fbd67bd7a820bc1328265f619a7ffc487664e2aeb117721757f5dafd6d7acff45a4ba29bd5e96b6c277e392149b2c053c288760f3bb83a3f6e55dcb4eb55e5b4ddca1c2f0f2004fdc57f4a213e74067ac3fc24e931dc25d0806f4fdcd4f312ca6fc61ff0699629f9270769d08be8ee917a06fb22422da702170cbb8032315f80299917d1853acc3c140a37fa3e071b0ebb05578fac94ad38d65b64959d47a6eb82bbc11d28ef0cc64e118be834809327b1c2ea4228c5158a543fdfa306150c17d87f0b0d0444326cdf47b9316bbcf5bb9b4c92d8f4247aa3569880aa4f48eb1190404ea1fb62d766681c743c1ff9ae5c373d6080c4a13ad30bb9b013a8e25888347be6af216499be6472dbbd552822da878769fcfb948c71d03a02b45dfb43be387f35e72a3278ea6862cc71b53d77de9008910748a2151d57fb8dbd76a673a0db905a227ffdb4ef6d95a6af118966beb1311c636f45a17eff173d86626b89b4ba662622e31e82b3d0add64844cfa79ce4dfdf56b5209cfd0cb75143a61d0f89e89bc26b1323f5d3a39daad458acfa9961a1a56870f0d48a1c7bba83626650d8267d8387c883a66122cc670af8b4406911ae8d7926823a85a510aa738184885085bc3eee88fa36b2ab114d828a8c52533dae53089c7792926ed840e1b3e9ac406022dd27b512aa38c926160d8010531a50dee0964d00990659c5bcdcaaa008a820060de6634e7488a9c5d68edf81718885cbca42825ab5a693a541b3debda6dbc88d912e7d3f54e29bb45965a49b0911ea52e8dee270a087b241fb1e1f85fff9e6b37080b64e7eda97ec1ef17956a8a2089cb36657744755e604efa39e3857f18130ef3193cc965d3b880741bfc707ef86ba60e3aacaf8d1b15a23c13c7a22ee892b21103d33bf537a204db482c779445252b828a004b7e37f66da60a56364a05b424f35fee063d285a8df9c51af4864753cb235851ebd0b4c88e3188a3e4668f669ca56f12008696a23270c759cabd8f00797bc3cb2c29956377f19d80921a8f1ef88c4d668a91a0907a7ead205c071e9f67b2d4cbd434a3077d16448fad8db0021c72370a553e3c804ee00834e0a99c0f46ff45b71c45a97cd5d4227d6aca084350f5cbca37b8c844fb4ed0edfabff98215330456c028254c8db8c070e554b5ccf74d5e62f9368d8eb79ac4a2b71c7779f0cd04999b86193d04840f912005326bf97706318f63a41e39f574b91f8e3209560cf5f5c0a588732da43b5f4fe6b776f6e0cfee88710657250ccfe36ed588d206f87cef9fb356f51973296fe389b42bb585d50f90a62e10e7107893c7a21f9726cf4620d5550b88b1bcd307d7a281611af2c38358b8ae462ff947ac1670526c8c40ebeacd3dde8a334dbfb55da21074f525ab33368252983da340a2f731cb23c3c300b4c3fe6c0a3e3030b5ae0abdea6e6cefdf0dcd1b6fd4cd975e7a2b7b7eaaa89d5520e88947b6d7279df1264c19c1475f633e9130c7e8529a01050e932506b76c3319fa1694721a9c79117f0a4f37406c95b4f769c839516b53d7eaa35197f8144f52c34fc49244d3bb51b3cc0987624079a2dcfecf6cfb4b359f3bd642d4f7330a3438c01152d55a917b59c25551ab7030f92e517d83003939fd2435a7af7d434f7d2b0201f15a465ed9fbb6afdbb0805394d761e273ea595dfcb29a8737af32d15a9039f5190fdda28143dff194d0d34ea7f14cdb24a1527dc3e2a6ff7b8270ad1fab12efef26d9c19ab146615a7531be96890f80cc104851ad58e78db1e946df6bb0aff9a9d39c3a1a64b1464204f15765538da2922390f9083c82041766af9c14849fa682f5da2054cb146b3c0f2ab913bc8871aa5672c66e22621f02abc54be4f4570161f9a0ebe9c02efe3864830cef836cc297796be10dcd3eb80c1e36ae006022fc94508c05e8c46fc824b2335a6757e9e05412b00042503c88220801e49862b082a88c5735c744eccf1fc6f8ee18bccbf8b71ebd320c93d7ddd112bbfdce1fca31d2d3f9c872dd8cd489db551387fd52e0671d15bd1d713ab58fda2e8ec9ec34019a3dedbfa7c56eaa0e415d5ef122b86b1e4fab27847874184c198fe79d323f87b462fb537e38637a423923f2bbff4d95c3eae3ccfb4ffc7f5869a65121e1700663b02973c52fbca53291a10c80ed6809653820dccca72246779d8be329cd80a74796166221bb7f243da1d188a31ca9309876a33234b98df97fb9b0e4ed4054a53e5d13bea99c1692d2069b0ff8a22d165e339e62786cdab63d1a560c601e20d696a2e63f4938aa3712797c7735f19fa66c6b00319e4b4204a5fb01fcca1c777a72c023a8b4902a8069bbd05c6974b25a3e8f7a64ac7670c2a400cf32cd14c866143199993703ecf340289576c978d74ac5a8b0aff25d841742998152f962758c19721825d328d79c0b3269152553ca99e950d6f04b74ea666c877406d298487fbcca9d56103ac8ebfb82040f7113b8608e9fe23093e649808dd7b20f885e710ff45cf4e2c8bc4e6d424f2fb37935636310261dbcbe4a702bed060fdf8606cafdf696d2d8c3d2d5a39209a14ea79f9a973f5a2fba1b2f9c67ff37293c5232c30baa11a9b5d218a36788f02f5f4de64f84c6e309c8afed74bd913256f14ce2d62efe5b77d3264ea4f19d5724d340bb0525e74d4c3ba24ac37fd8682e558d22132e404e139784c005d7f7b9c6c89cda3aa8b47f979355274893495d107d9d4c394102498e08076c6a50d72c773f7c30afa3e5156f6898a2a27a4cad4642f6b50212bd356174d9d95676b766c3b192dffe1b31c922517268e7d8c255ed101599294bd89cb785c5a4bf11be54b7504b24bd887baff42f896fcaca1fc2d647faf453a950f6b76f907c706e9fefabca7eb9a4b17bd9264e479e4d1ce7f0f3b908044203d494d5070ee9cf5a78769134145ef94bfd7d70b6f21aa46409a3fb59fcb803634c3ef19b445102b2d7d154282f86b4f9e1333aa5eed3d031649002f1abcd436917a4c86ec05515734e037558c64a90688e952d00c1474c3ccffb7974422266213dcf969e62e4a8989e4a5501b88c3b0b4614d627cc01145288778a95b764f1f3c81d4bb8763483a1b6450f89f21e04af28c0200a7fa9fb0129042fbba0eb5de26ce5f32994979e8251446dd4081047fe882254917b279bac01af7b79067b04b7a47e99b490b13a0674b32ef190a5b1c351b6fadc5d95a822ab984e72e8b1d816061e8d72458d43772c5752d7a7f120549e528017146815d730514e471734f4cd8db370b1f713ea0e987cfc969c2ba7c45dce3142a150774acbd0084e432c4c7464d3f19a6a804cb0d6012d8a7eb27088ac69a60ddbbe056aba045a0477c8bb596b2f869f7705d1108bc678fae37a2323e4f406ff53e585462ace5985c354db55636fb554d375b417146409080e8d534f4916e639bd311593f5d650fbd2fbf3e66a2fe26b7baf90cb0c03043d4de2c3f236a0959e8838815d18e32afd035c554a4e8622c6e395590a695c2a592bc640a9c0095d61fe0f03598981035076e2d85723265cb6dc46dd0b9d617503d3f940f3ab58ac433170e1307d9576ffc44fd09774bd02cfc0a16192bc0c59f0a1a3da89bb2e83913ec938597edc7b03f044728aebd8b7cca0cbec9cc26771d5f51d66121c4bfd13514b524c7138dabc57302fd1f8600aecddfa60b921ed2b83d8a77d1afa895c777736eff875bbc80c71fb4e730289adf2c332253851ddd24532833030477336b50eef0aca2da8fd4210e4eb3530e866835e91dd3c05472da6da2bb43aa0930266b324f5cb274eb2a0b1ddd96acbe70e2093dab2e53d3b01d248ee10010b65797e4d6f28b605d00d136178871efb09f2cdf401455057734c0e91804fd93d92f47ce12808432e5bf0e2b6067a3be9852010edeb26d70068e451af329a76e50eb089e03993e18fb4a50f7661042d3c304fe859202686c631184d44da914ef8b57a1aea6267ce25efb4981932888cb240c771a67226e6ecf89b6cd120365ccc0f1c6995ed9ce890b7c916649e61d82cfacc821412b14a14e5a5328c1bcd2161cf8f2a9972d675077bf5739c295eeea11ed73e81ad1dd59eae38038d3289d267bd91b8957de65e88c043a80a6b4c13a83b47611f117853d3bce73a542d7be10b4b9201419a842ba6a9d5bf4989b96d8c9e27ea22890cc89a91357d67c308bb0ed5acacb854fb0a14718c5e47265d30ca874b17dc5471c7bcf5673b0d5bec5cc02df33dde3d621caeefd0ee885c905398c840a23c8d347689c30b96fe034787d2456e955bc73a1382e6cd610e2a20e7c1fb6b592100c6d008f381fd5b6b28fc1a7a072c3526cf00ab486c4652cede28545473d4cca0c5fefa70271b330959d9745ef093ceb29db11897f12952f8853bbf985ef99e95dcad85fcf05cd7e15742d2daa7cd5aa115c6b80494f1b017d01d935926ad6e2c6b62aca348e21f59dc7a3edd2e3b69b34b169889cb10cf8109a406c29040fe5ffc2a8926452c83f9109251eb5842231247633ffac6f407f2dded0f43ef12699f4847017fb92f2c72953c6ccad2b3c0a8d60e09eb8d9a273f0e563151480c0b1267831b58f1101f1fc1f0b0b9a70945b4bc24d481d88c1003323bcb1f933ac9e484de64c14c78bcb0d682c7aa1f58561c9a4b185938d28ce4b1cf7f7b09e78d950b629999f1f4cc9c4c6dcd406b60d956fe5e16267a8cb712486277b232a5510ade75e6905a8de018b3b4d854eeccc8f60f105fa8e6ee31341948f1d4f535fb8c74f226ce9914dff9b3cdc3668008dd3954a6f826770202b61726081238e3cc88c29ac9359b3add885af127d1651864866fda947478a24d8d367e8207ceb778e0605927c75934a523c49f53b5409739913ec2c4e0b482c276e318d59e88549251ccc881edfd885d7b202c5256666f95560a06d0a10a114d9f8c5fd598f5036a5951bc11644189be3c81cfb33f71976cf80cabbe495fee2e368bc6ebdc61f961e7b90ce25531440af6c3e6a72ca2790dd342dd8aa311cbc3f76e44ffbe47947c50dcb25f6f42940d53c92e70b90bc1cb92772b5ec9a61c46737c19e16f1eb348b8863b883c1f760fe54e5af702fa2439520bbe32a032205f5447eb153a670582ee0f34c6714d4d2a6fa0b068bfcd3e5fd683dedeadae008ecfbe57d8fc1635ad1ebe5b32579987fe92c5b68fd30b51d9060525990a1f219f8c4722f86e2ce023a50f16d398aebb3dedf85b6fa9aa84e954ac8600269c0535025fd00292b533515e6a6692afacba7ee7d98fdb3ab61115af68b3e8aca7ef1c16d342ca58dd6536b5680ff8579f11a7e7c2504e137b1fdd986abee550db8c41638e4b52ab0912416381a42ffe84f1e8a4f75f1d5bc6157b885bad16c09b5b53d42e1b3238a885d915457d4b15e4cb3230a0937138873e962729d660183cc22431d5a56ac416fff1242406335f5a69bc3430cec4810e2b878d998994fff0992d1e2c5b73fb25256fac7462f4069df4ff51d88f74da0d0584ac512598f0f1e0091aa7e427f71c70194a96a24f417b7d0009e78ca081ce251e756d4d96f0a34020630fb60435e9a1e7841e4d06d6b88d2b5196e48def0b4a6dad2b893d061615ec1cd567d5a89c81c4dda1ffe3da4c8187574da1d0cb10ee6f1026066098a0603400d5babac30dd282095efb8df097682ef1d7842310ec43cd34af0b00aa75cbbc3be6788deaf08ad56101e833be28502c0aba9342afb4ffde16ee60b17cbc8a1cb6e5cdd70cde3173e4333bc3b712c6f1b69a8923a7f378ef551dacec124ce64314c7e7de4807eb26f07f4e8ea302df27e726db7e1b0cd9cc4f9699ef22ab6206786ff42c2f2a661e5093a07cbbd816d68ac3ab76bcfe6b23afd3a98948fdb71b2b75e052bfaf0f6d5acd34bc9fdfc71e5306eca8ae34e65b9d0d88cb4f8f2b0354ed78e065eb8294176b1646ea97e768358ded5bd9617df66d28b97ab5c8320a1bbd93f60f7b2b8037b22c081619d197f74399d5fa768fda576b739db6b258c7f40e7bdc008af6a54b0fd173ab4ec1f1a6605594f03d07be7a65b2d9be49968d5f3dacfe0502ae061ea43358f58161e1545f2ace7309ad378210c7466fddff466d719fccb9c307303c5bf96b3b74c5ab1e7e27cd64a1f4b411b93c1aced27bf857e38f51ba6fd966b07c5117faf8fb30f9d4c3ba68ab1c0fcd524c0ab59603187a70506807ffa0557a0e14939bb7592a238deb600cad173260a16fb01b61d02c344fe8b0b03ccec6e80a65ceb1c8b37a5f3564b67fe3e9751707bb91887416faa0e54c4d70a2fd0d8c45a444cf81b64fa76b1186681e5e68eb2c53ecfbc4313e85a478768cb7f3f904ed9ffd53c9383329a537bfda74a065912dc2a32d01f7173160044739377aceee5f3cdeebb9478f13e13788cb8304033fba5e1f32770f4333c8521e2555a89cf3b64b4b2c61816213f393631d34c0e927415ca3996dc04e8724f4bbd59e05e3293d6a8a548bab3a0bfe8f396d0fae7f70b619da6cd9108615fe0022dcaf8a5b8946c6b8287c9e1a8b1dfa9ef6928628efd079eb86cfd5de67dd7b88fc1dac0541a3863386b0ee20881a83c88b666c5b37c4c8d749af35e14e676aed83249b420a8e439fe0abaaa7f2387f6829b42339870ac0471e9ad505dfd5e09926ed6bb5f0bfc1f8ffd2102c9fd0bfc65685c9c09b90ea51dadc940e5924935f3c7f86be0b525fb315ca98ff40196a1811f042978f052030b0fe1b404fa864d93d9faddd68e1984c152dcf7f00a13693c06f31116d5ada019d5e2ea21d57f2ef208b48aab5ca137b099982fa17ab1806b0abb458f4b15db4ef42a9a35bf0f1690ac532b6aeac3eebb1be78cfe947efe38e93d22f6cc82c72eaa9943362ab8294f14ffd52d901f72dcecfd505da9bb84c107f50974b8fcd5c77e742504475c81b4fce73835c2d03bdf793e52b4217bf43dd2613725d411bc173a81688fff9c0a48fd6b1ee3cc9b8c4d1a8c6f436ebc6cc84ce220eac4e339637b66f43a3c5e2bd7a0472a0c5949f8b6ac2f147d3e68075c1938038d1450ef390202cc1c9eeadcb47863b1b74e0be15d529cac5f1601eeef30a7583aa0c0271f46ee160cbd96c483a7ee83c92c1658218c90e234ef20c46cda94cd80461ec824c0737de05ea444b9ff20f5a410cb1591c1238c4f756295e884c59d8b2de024bd3760c856370ee457f83e3665ea51f3476152f8e0052a77d4de41ba124a1e373a8a7cc603c88a2c78971ac06026ed8dccde94e0c1f375fe1aa5330b031ba36136366edae11007c3b04c31bde3821f4f359dcdd53851413bb3dc5d52a96ca51939302b7bd0ebff02cafb77cabfb463fe14433d67697182f7128b4b493aa22f39131635de3991a0550734db43d61bc12c307b337f3b82ed0b0cb2e0e12dbfefe4db7ae830ee50206bb1e75c43a368e7ad12ab626b871cb73659add3e6c164539701dd469d743e06b10982618de9051260ee0e4e4d406b75cb0a4c7a095c8c9e37ff60621a02c3240183b69f1586dee2252b22d8f6f62a09b6c01fd36953d09682c92d2e9864bc0ed2e462773ced6658901eeac7d5451916abed4c32f273fd1006d9691170c6fbcaffedb96cd7bb040bedee4990d4af7af9b90705e7c6abd2890c385bdc6e01e3467cc2fe92f8923c54a5c4f438cb475bdf8f762f58b89cec2a4f6cf2ad8c0859cf6e96473ded91303b8868c39963d658f96b9466a0fc3810fc47935b0e921519d55d235eec2829aeaf6310410240cb8c6c19a8558174d226a3cf6eb111c119b637806c037dee4203b3e53f848ad2d9dc8923bcd053eff28171f713478820b8577e2e070beaf6054226ff441b53b57ee8f9b2b9bf3c898c2a5f87a0eaa24c4195c6eb2947799e72a2e13cfd09ca6cdec1c93640bf0d4d24cbc2a46d73c647b8128c7bc0f9a629a52151fd139281eeba51ce3a8024d699f6cabd11e78d405ebf279a319093c9f31a1b84a8ffbf6974d4ac3d3396e8f832a2603e75f6250363f6aae625d8bd7bf475d66e29e70efe6ff3e9a403b7fd4927f89f1b6260682f9636fbf12b03e34adbc08cbf676c1dd8c9706a1bd3e04de7ddb957b52dc42ce32a7f89943d448f3cee1be52c7915b5f35811ee0f8ecbcd5796cdf5ba5a22f6623540bff1b30a9381d97e575659383232abfbc0c38cbec509990e91cc1b977f039f1663c6b6c7f8251041bb7d97e3f84e4cc549de06f15fe2d35bdebc6c950dcb7a109e64d7cc4355ad70939528259a8528b22188683e6899f8e6d0a59300278a51c0eaa7751f14adf66579b8eca82800691cce8810fa1bf3817584533d868fd9cb26cff4288f5b417739b5cb0884c36c15b10cb2e96892dac7201a70ce35434429512cabad6aa44bc25c2d58074ca2f81982de8dcf85135fdf406fd858129ec67142d198a9bad54ded6d276d81bc016f359bb2b45bd6b188adab90459e354742bc351fad80d2f12f96425ab8e31f5eddac95bd7edcba4386bb318ead3a3df382d09db69d487082dfc18a72ff4db527fce9eaf7b0ab18baa7cfbd7ac5bb39e13516122bc3f6d260fd3a62aad98f3fa9ac5033dff7e2fca2c7ca1135221ff0d023d7c396990fd2d227466436d54e789d84e4a636d5887fb14994abc9c9dd1942b0469bfcc072c75ee77268002fbe98c32d3535a2e8bbded18f077abb1627fc57a48e572a195029a00403eb169d92cc57f41e3fad48522354860c11c9bea9ac1d91bec0d6bb8c269e9b3f58a1672b623b346a1c05f2241814f5e2c3c9890f35f9ba192ca711efca119daf0decd11a719c86542208194e3d005033c7479e2780ac21ceb317fdaf6c53e14409ab0f407ec8e62f23b6f2db2eecb47c28000978b701d666b07de146bb96868ecf18d2ea219aee455b48987225bb99f2cb8874221feda1c4b019f116b31c3e21401dd0c6f3b8e229ba4da271bd3cb86684829313b95a972950b6607ccbe5ca5d8a80570e4a9deb017888eea6c8e8562c9b9229528cf48d80886da0bf14463f9df0314ec7e3a544630f804ad06740a3b966a72a81a72a8ca4a651c7fec702f8e3ecab4a35ff3e3633844cd2cf4b01b47de02eb57e198e07b5a99772727e8f01775d4c6bf353206758688a1ceece333d35ade98fa28c40d4281a3fbf87688d682412692593a8567b6b735dff557fecfae469f99c2dcd690235d700dd365b64c144a72b9c82da2f04875ccd68477635372a75d588dabf40f83eb5ebfd6952ea5deba441d61d8c663c9b3270d39dcdb059b0828537d479cd109c5083c482b50c9a36b436576311c3b75e13e7d124f1faa715fe6501204bbbc228526f5254838cd9c4360a580da39b245d73c36788b0727568f908a7aa0063d315ce44e9662a5d3770ab2f620fddca19277c80f29715a61fe1effea3241f867918008b71a07487d58975069aaff3124d131aaf335a2d15201e42ac4e4730bd0777b3debc487cd75125ab57db174841db6b8cd0cebb9864e17e3471ab7b8734ca65123122092308324d5c24ce76cbb601c895c8cc9b5811b240b0842db90c715bc7eb4adbd07246b00f735ebf68d957ee52141321eb12846e8da96db28739288e9091250cb5382e390078288c295e9ee7911012bf8cecacd3cd87d8b1828851e59a9349ac047b8f122d4318244514f8cbfeb3ebaade0562c6a02d0f659c52d2803cac97c0b66ee322fbe87d2b4479d4b6f4819026e125801b5904efc923d94f87bfb23d39212792ff503f34a96726b457de7fa0fb13a54396b67beb29510196fdc10594142ecebd7f72a494c6b5ed04947ce27e7b22ae181e5e192b7ee284f394cd3dac5f4c532b538156029166b4acf7e645062c31570909c075724686db01f2f3bd599bf612e85a441cc038073bf05dd0c5befd6c8ea5b540a6513ea3479786333a1b98309817a4ebe5e75bb425108ed38331767f9da45ee1a4825f02cc76bc9bc4665848d157ceeec88b41794e16138c8d75727df5d912621184efc46e8899909e6acbd9880854190e68e3207dd2b1c7c0811aaf54a00ecd4271ee3a248984230eeb2b33e172ea800812248c3cb4570a9bc360efc96b174f6b9065c03cce5773ecd615194ac9e9067b1998ede86682c55926a15e9f6f631702b09cec26b09b6bd2b5b5331ac26210bef3da1c436b854c537da68c2e0ee73ab51860b06fc86beb27e36b06aa2d0890cc2a3e6408e119ea159913df0ec6e8a3d81e7311a52d72f3a6a561fba445eae626e12eb66bba6f4c8fa64abef93691d056a3530672fb563944d5abbbfefb8f80ebe1159ddc846b97b27c52c35da6ebce5d0f7a8dd3c0ee5128fca28de1fed614501638b1e73e6d30d4a5a9ed99481d73fffb07ca9dbf99d8023471d3abbfae820c8394c91a8be3b4531e4506e89e57d3112025bda19fb20e750e02016ef18a4fac923b5a8a4fb67d1cef0a19800b163ce143606ca1e48384f1d3c2dcffbd3db9590e6d6c49a0101e9b5254b0f5c13bb8c947a55d4e845460eeb1ce25df9ff6704ab99b5daf4effbd620a8f747f3ef78d857f03dceefd5bb0e12da3793a86128f680a8308ded2238c4ed82d8304603aa021c99c3977a2df719f3716ed393816a8d851c0a85b31eafe783dcb35c94328b4041f69e112ebfaa5a1c1c553440d15d7dffa013068cc93e2f8cd834ba85e0b8edbd9b4ddc95da7e0ab476e67bd6be77f9aa9b7141e8522c1ff3fe16179660b8287b97e9707151d9da5356fe1e0f15099651a1f3506b1f817ca0b36b5270102241a2b96d9513fd26d501bc62e95de143aabf1517273b58d68f40ac83c7273da220a62756582dcbcf4415f296a9281fb3e6e4e22d7e6b0578729d038e37173cfb95bf920b5fa87f3718971f3ccf0b9c5ea1364ab24a900e4d847658afae1180581da8325f4e3aa7f628314cecd0d883570612c8d39b5b5b6744895c0f30dbfbb6c12d8bd697f5e14014c2d5aeb9e31b759660d7da4af5f681f3c1c942574f2d346bdf181b5825b8875e19ea05d1e1af5760116dafe3ca385e991a10d657f7fc22495e5ab643805ce79841b0e56205c156d3a59dbc1916e7164551e513777cbaa58466556e511b55dfd295556e5916eb89a0fbd2358e30084ef830a3048298191bed069fac15a5dc17c07a11dc4836f853466d4fe114654fbff7eeb26424b8dec2df70e1b0efd0d180ef628f622a528e7c108f1f65aca59ae9165e84c6ae7ef88d22d89026fcf0c922890aca13dd4524e628046f2ff8f826c32fd2351a5db83a8d249ff3e1955226b4c5e914e22cb26fa3b487ea49d527e37915c12f12375fc333c22e51a8923e5241287e8da75d8f2232dafc2dbb00895889c3c903a6a8b67d286481db5518c40b94896b4518e62bfd1d6a8ad91ee59f0df3514b28ca2edf9232dd924b2e4eba85dceec30ebdbe1d54d95c74f87a641b4df0e115f105ed1d1e71c5d537df423bca38c65138da2892fc126c9be8bb42f44a65c1bc1efa41aa58bada1fc9ba95147da24596d6da26fa36517d127b3443f42f4f02612c7fca8c624cb9919358432924636a26bd30c35b13feeb6b6a3fc7effbe1239a38eff46120ada261287f6d1695884eaa3d1bf1a33a37760a6a4a57f23097c693c82447e17348da39b524ede349652d4f896e8327c0a6967b069a43d47a3eae458dae8f0e35836d1e13f9d2f08dbf0751208b1c5b5700133ddc25a120adaaacfb0064aabc2910a9b203d613da9404193233d92215a94ab665b3b83492393c904aa2c891541420f1308be509d7ea332b34ba55b2a635ffaa532df4b20e92059eab0adfa4a35be50a90e02d9fe8da8eff3b3ed88fa4822c2233e4db3df376770e581c8353ed2890a926420f8bd5453ba69126bd1f4259b124ec9077de907b7661539930a16f4343d69f65d908621eddfc11187367e20e88540b6736111dabf93469476966b246e82480a2249325ed925882499114e5427ea93274ed0272dfe1b7168ffc283a3491b4daf61119657a697b44d27fd1bc19bc832478c06c9523b14b4c16f0443da477e4346e347843f189d037313a6743b5aeaa2f4395eeaa2b44d98d26730ca58825dfaa781aa31e5aacfe0d288f21915654c5d35ce6611a13e1a67ab509fc12fcc82c2ae509ac6cda59c0b69a4a490a81aa8dba34894c6fcaa832e085f8a57a7d9a751a7a469a3d188e34620b859d096e0a71d1c4d278d1c006b34ed5e212312c7f791100e80403610ecba500ad0358568f4cf9aae8da5e9d3ecb7852f4ddb3ed2ac44131631124b1d0d5e23fde3b104b597481c93575c843d4904c71c608fcea31d514580a5839f5d8446baf6d1d6a6d1369929282227285f6924c94823a9c9ca4852213969fad3f862419282e62096249915956a9a926457882f91938fc1af4443dab483df12fddd6a0c92dfcea7f38f746dfc76be1d70fc743e9d20ccd23e517caa911bb88d5f90d1a681a491664d4b34e17cf2e4c91317c7b7a3f66fcea81c7a78d13fb2f6103f2b0a412c493266754d4f0a2259419a919c30ebfb764a6ac201d97340cc9a24d348b240443e8d54afc6c0015199ade94b34f4a4d98c99cc3b10cbd5ead3a92d15b8e8bf9d211f8f45597d37994820446b02e2643326e7fef87498c5240ae5b43b229c32b67c9a8c4084399e12e9db18be3ead2cd1882499165e3496218efc82f0a71303b124c9becf0835d4722822c0834725b1713f37bfd1e4d5f7812338842c6d7f33a4f18d282266112044fa9b4580f034483a418b0019d2db884ac2dbee29d17d23513736d4b791a88f6c00756d9faeeb91a420a642f7e97c3ba34e75a12459d3cf7afe74ae25c92c49564932928c45450a6d46ab4aac80e230abc81878349ff238a55e7a08d1b8596bb5b9e121f8b60a56826863e289298583684f8fda3eaba536f4744f1b299ac49c9e3c48416736e648f0b1a6699aa6699aa6514dd3344dd3344da37592dca6d9cab47ada67985e357c1fb769b63215f1c6ac59fea4b55aad6a1ad3496b9d9fd409fac443b262a9da3057b3a592693de9d806159de6abe860baf0556caa0b1c44ed5385b253e6c2a60bfe774e3aa2113834833fd5a5b553ab30e155d56ab51a7d02ec0a35e28f6835f18759a58aa8b94b9149f3efb6d56a351526cc624e85a6baf069565d1a405df3a824b8499e82686a4b6508abd0549155684c2a34cd5719c22d1519bbf04153aaa54b951d1359be74a9b2d37c1519b7567e562f6f39a54c5daa305161d2fc85c0944ecdad89a20bdde07e6f743789eede3deef3c628c087e7c6288444217ae85fad4610a310a23d8ad0458f223c789a44e8a227111e3c374e9787a264034217fd46e8a26be48d387c4fe9a8789885c474d570f764b5e59daf0afa515d615952b071a9958ba71eb24cc552a81f956ac91f517652c9eae511296963f419fcb11044beca0db3859aaa2b7a48d08c8aa5a064c9694ec1c431a5034365f461ba760aaa789a4b969dfeb657cb82c3a2d32b647531913ca2b891e5e924e2b1a46a74954ce6b98254339a23315d2b4fa22e51430c9eb8389d9d66d58e46aa7254382a9ce6a76aad29594dc9645f8c299aaf72c28cd99adf82235daa60cd2f55479a3fada674522b63ca1b533d634a85a753150d13863f7780e2e1e1f085b24fc1523bb535fa11b995944e0aa8f974baa2ab6495fe63310a4162ba58bc8e3658903535a27baf013f72a12c69638544d9af7cc635fb465da2861e342e8e445912d500ef2bbfe17d85bc313a778edc017ef419d70c16553c44a80ca3c07e8748a234ee96bc217e44ee5021519af72442f7c82884dc183d7c14de434f22bcca55c828460f3f5de267708a266593c2a92d16e73275d3a91c1b35a7b378899a754d4d8de82be75e53035ee5a22a6814c7e912ad8cd3a5324ed7699c2e16e37451148f684435c07be84a7833aed0951851f28678ef1eb943fc8c2b7481dce8793828eafd06e77917913b3cee0922683b4104453580bab87b4725e15d74d1bd579edaba977f6177d6f188fcf157ba4aa60aaa2d94cf9424bafb8e9c2ed23fd21807b154c9361be0e928d2f4078ed7a2ac55c9544df82c382c3fb8d582afb28259fc59d3ac0a62b141d26fe892c547b3d5a88a2708b352ade2615689b241cd52c8f29492d5168af4e9429148972a28a533abe925d3f76d25129584f7fb4b4621baf7e9b2a112a27bb762295e94cd84b1289b1519b3ba94281ad40dca66c65c24d8c58941f5c66a6b85a7de9edaba55565778807ad6dcd1acfcac005517feb930f066db344d3b83377c6133a6c835425ba94b05310bcd9fb40b299dda5ac1b95a4ae7e5486785a7b650b3eac2bf5714799abf82535ba9159c94ac5cc1d1709affa166b535b7d9b6dd71ba2a687d88e548a7f9f4d30b136614b9305df05145d0f446f304bd8edbd70875c19fae798b4c180647966e54c98272beaf84f2325114a0fbb3e432b9b226173661c42096a320cd1fe9f06aba6c6e58709a2bd3f477c194acb644e7a366b52522553c2731251bdd2b8a22396b7685a32a4825031267a36cd4dc771f356d14f81ba183e243a7a4e8e1675c2f1b3535225923225972aa0b3f0cc7d078d37cd1675c38a150781149a3da61d3fc906ad63c43245ce174d93088a72b260cff56b2fac0234f41d5854f33124d7f418854e3114bd54e4a87572c41b8b5f2535db86419d27c161d66a9642a994a766132950ca692a96430958c06bdf64a05d969665105b110693e8b0e0c182f5eac56ffe924fe5c58b9f2d31cfb01920535cfa84b254beda47454b252c5a3133660ba3cd68178fb3ac4503fa89fe6a77498ef8d239ad1cd08a7f9771ce5345fc5535b2faa0bff5e5154f134478ab3951767104b4a13d4ac6ac22b2688aa2052252322a2b64ff187594b98a59d2f026de369e5a64b11a8f9e50bf167c2700e4a95ac850b62a992355f2563165d05f5e461d3b603b4e19b2fa278af15cd07574a371e8f07e321f89fbd4207260cff8909c37762c2f0ad20423161f81e98307cdaad63c2f067b00763166d8fc723c22c58255196248276134ddb2211b92f87935d17df8825cf28d084618f8702714f6d69e7d39102793cf3cbe11a881e4ff37ffa8759162cdd6c3d203373a5f4f60ab5565a23c496f52ffeb11d2fb3b52365ede5b59ab59452ed7aa3e59f594cace97e5ce5382e07d894cec0e2601641834fd319887cb1afb5bf2ba8820a6be8d292b7f9d251f35eef356f2c75d4b6bf54102d07c0e6ced47667816cb79b254bdada93379c8af420075f2d325be23921448322804188d6bed451a7c0975746e8e0d362dfb6b68a9a7cf307f1a6a910bca2305ec0419c3d9b9120a26e843b421275037cf890dcc140aa3073819f71cdb8a6dd487a3bcf7e6fee86def0f0c8f2b6edb819951bf975d4a1b5bdf98268bf71fc846d1d5a5b8efbc190b6e0290b9cc63dccb296137bc66747eee1230c63d8bd401c1007c40171dcf9353482239b9855f4aca22d09243c1fe156585b7cefec603db0a026609506c647427e38ea60170a027aaf08ab2e54ebf911044d241169cf9fda0a4fcf554ca60265a94ecf544c1675c15cd119501ccc157d38d21fec42cf46aa3842bde40ea55e728bc48f3e510fa52ee2b8fa0521f2a78eca83c6f3c6991a4b1a83a6478d25b541d3ebe009ae4b86f1154a56f284ed2698a583ad2575686d4954111f145a6b64e541829757b4daf0e03070c9252a0db35e84064dc8531618e8c440404040369a562bf3b7d9b1271547d0e1be71f28a5e210e81853da930828e4a4f2a8ab02372e2755408b1e256eee563e3515104269dc8c9ad9f478510867422273306d404e859240b419d24d6a47e995035da92295ed1d3367af9f0685d3250c9409a8fca308d29ff40c0f4909b2e1c02428e9cc140accd61e673dcadb5d65a6badb535474bf7f2bc9108bbad600a691043d3b012688e2cedeb2551f613654f529b25cca9591be39fa6d6004f9e3c71d9348825c36cb41ff858a29c30fe3182485733a7d280e183c5204806852e84511a39a480d2c8aee0016937440863b02a74210b27961c1f10a8c81ce49006d2971394a3ed187922059913110701edc0095ccc6705218b9d20233d9aec1891c11438d704140b7243c5148a4001f6868ddbd9a9420c5e50912aacc8b15a10ac0615c94215768cd0e4c0808e00fd686e8bddbc2008dd0ea5f972604180c190cfd2d41ca00a64640674788277a9a56981851d298310d03085dbf415288816d1c11cb69d1dac80328c724d6fa8206a6158af2520dc09ff46ad0786623291d6c9922a88da8f4facc4bc535b5aacbcdcbfdfaa5c53b9f61c948fe51ffba8fdc47e9fd84f8b50689255e5377c99442f759cc32354ae91650766be003c3cc2a328d7c8d2233b30d3bf573acd69947bff36702600b740e11125234a7a94a3bc86f79325f55c5621bd69a4fd09a1f7c60b40068a924f24113a3f09320aee1e458814527a14fc8e1442ffdd86467847f95732bd879b3ec322fe974a47b4bc54c4ca4b240eed2ba7a7cf60fa326a39e374693bbaf4e101f8692ca2e52b6439d32d4f198be8e127cb99ee01e502f0e1b30370327c05800442f421003eb8ac46ad870f281f853450500070da00205145f4f096f7406a3a5a0cd69c0fb74e43435302970aee125dfb785bebf1601f19bebc71a48d5acefd6bf9649676af84f29a1e3da15053d3a5166beea79e5098a2c9144b5aa52714a68035d832962d3779a5536a81b6f00814d2ca78c5752034a274ef742c7570b79cdeb48c1acef7c9fdebc0161a1d0bb6d4f8ae996a94ee5debc12c8dc4f97ed054210dad86a986e91e599648eb84b44b78251ab5efa36112a2273c256dbab3a2951a4d734141562c9901b1136695d6497394a7b64ac0efce5db3a9add0b96b3421edddc862c44163360fe7e11c3660ba989c3c44698342233c1287f719afb44f7143c992877ba45d6265d609b3782059683ddcc9110a6ed5c7110a06aa2d965920cb444339bd77edde71682f01f18a3be541193f4d07b70e9ed24887ec948630ab4442c15dfa48a5af54227178f7482b2b4f9fc1413c1e1db2c32c1abea8d65307b7e73d08513bcbe80e1037e1c4f0a5d11d66a19c3be54e79bef0a72314b4b56bff5844cd513aca89d668d3b1c5b591bb05a98119dca591f6c7f251f862218110552a552a95d24e7b09afb895cf467d14be502410e20a6a65aea87c863454544ea77d2297844223bca31c0c5fdf4316c62beea1f0e581dd5802fe8c7753f82a6764d0f03bb266f210dee945618d1259a27442504574e9742c71782f85afef9a4f4cfbf948e1cbb3b41641fb3bedcff6f08a3bca6863bce26e1aad8ffde11577ad87dbe1154787f06a0a6249d9c66c0edda9dc3918ec088955228190aeedec0c61eeba6bd7b41eee36c7fee03e59860c51c6419671af5dbb11ba88dcb123443e81c474bdba70770289e9e223315de24b18f7d3c5759c38f6fc721f29515db89346ea62eedc1646e3745126aa0bd7bd9c321b3528eddd43e75174ce0be2748924ca75499446a26c883efb46d79d348e6c7424ea06bf13c7e972894894f6e90a91288da4384142b4b00426dcd0d0b8684e75e1b8832395833829dd992edc398f3bcbaed8dcbb9183aa0bc7b2e65c42285761682b5270332c05cf506d006ff8be7326cd854a227ce8a187ef99e2f9d58cb99f17471ab35713663561e805dff2a5403e8e8e9ea6524deba9fbe52ef26a3241f4de7dfb0c8ff038a6b626d1e0f0852f7ca17eb694ad1d09d8e095b5e0ebceae20cac410a0a399f5ce2c9d32beb38ec6c9aca3e115df923d4c2849c3205aca1dcdac8be09c743414c69d5117bfc0509f95c5533e21649c565bdb2bb57f81ad90e54ae5841292b355a9c62bf1003950e6b36210cb1e6aba74d37cc594611234f7407379347fda345f2b9166cd1742461242e360c080c148c2500fb3ca1758c37e9a65af938ec70b128e2486e9824f2283cd99734eb075034412c394b9574c121966ccad43258510e2a7ba80e0a74d2e08fcb4c9c15e60f77e2f30ed05366177f6d2f3127b59f2220bc9d2d4e50b6c9277dbb8833163e645a16ca0e83d24665cdb675c1b89a2e41337b67be48ed0b723315dde67421e8b1b193a7585bedd23857000154443d3d3358b8358de59cba675d3a2a92df16cd37c9aead2c2b9b3d249a28b1f7d7b8de9dec5cfb84422d1ed4522b9c34476df312279665c9f37a2ec36a2acb5f392a84ba21ab06df77eaf477634dcbf3b9b2eef9ec66c21c43061f825b225f4faf2ce5831568c1563c5583156ac45136b3ee9e508b7b697ab8b809088e4c987c972f5c2843b9d261dc7bd00bd307959f2e2f3f2d3fc18af369a9ef60b62f7f075739affa3d907afb8b67a80ad9b19038548802963cf873163e8adc315b309c3af40c4fafb1029c44f75b9a41040138644d32d9ada62dd2bb27258392d1a564ef34940252b87bb242b9aed67c14f6bede438ee1f392d18be38ab71e7b85fee1cd7b24396e1bdf75fcbba40927b715ff8ba936c91dd59c39a6f7920b6ecbcc06a6b887b45f174fa5f60418d4a628be2dbc6284ab03df41d21129584174568c7f6500b50f337b2e5c71b85a056bcba337a61778a210cd6fc0f36c4cd103775881b12d0eb10372b0b0671889be6df5947d3d9743dba9c19434defda9aae19177f1b675ca4206639e1920d504bacba9c41ecc8b207217e2659de9723a499938e86044402328238cb19b3e828c48b3bbbb30a0346cb4d6ddd3b5b6e9abf92caa9adeda89fdae2e107cd4468e641093f8d1a7ddecd75d2d1dcd99682a633566ce486c91a22688eaa98add6283663b49743c0c10a1b2edc8cc4d0c24143cb4ef3687667db5b34b505e3ced60bac65673443a2bab6cf6099e9a23526cbb6bc73e90556eaa92e242029782f4b9a6f5f94bc5ca1f946708188f2250b06982f558899312f5198302f47a80bbe17b0e0d3fc4996a2159a3f5f60cc9a74de494efb05b12c9148a452cf9d69ca8abdc0484029ae8158b2625fa5936b684e986dac2e560ead2e568c59252b8795c362f968636b470a6ea64a412de7d2c2375bbef08997258277747b9fedd5d6a965c608bd5ec381488508c3bbc34e4f234f6ec89e46eeb0865ec2024bf0aa5e1b83389500fff1ab87fa17b5151e02e1bf872e990448eea069d87181ffa82b1c51975755d48258eb350dc6bc30ba7e090df4620014039d252c503d8f364d40f39c3d61b5d18ee507743a0737c12bcb2d54a6a5da99cb5b1018a7eeb0ce18608cc3413ceb230ec1f7469187602679270c222d455247ed595a26bcb2f4f4b57e8eb4566ae9ac9f3b13877de4d4d674b10e0769a64cec4b05d485a5e1d524a96841ca8209c32493e26d1e138679dcd27ad3d58657cc39bc62eb05b1649c9dba537930b5a24b4a736918c7fa8874ab3d9a69689886717a70abe66cd547c725e3f068e61d9de6d7dc6f1ca725a9a1d13492d250414379d4300ddf34f760568dbd6c3a4311263de8375f6adf36f2e24caddde788e39d66ebbb97962ce7d78466c9b292e717429c40bc73721b575bb68d149955b797dcda9b1071682d2710efd66237b2948223c5d3b7cc736bcdd5f69cac2778ca586e6bc9528aaeb3ee409cff9807e2fcf6af08b5459a4e58e3a01cb5ac516a2777af289e4eff6af5621aa0eca1ebb9595b264c7d90385f5fd3a526a3644f8a04bb98a82e959c536676edc2ed42cfe0193c4366f866cb66ad1d7380fd7d2313fc751ecda92dbac35c0291891cbc62b003b9de7964f65c513cad28c98757fc30d4617f42248d593a88a59714d6cc6fe530fd338d4cf02af42698158a588437fd0b4d6198724ae2b047393d8b142d7c812069493b57a0c99e43abc3866c83648804c37b2d78bab2352c699c0dd223a3d1148a22131fbf89918920d13b8d1cbc12c71af127b84b248558d169e854444e1004c914694fe08eb62bd00b5f1db3baf373340182a48e22bc7fff48286c932d7f0e9e241339ec84d113868c612c118142554486fb534fb5cf4b6bf0cd16d54ffb76fb6b73521bf09d4c36999d765381dd9834f7a0362a9893c91cacfd6c2b14224fd5a5b33dbae7911f0e56a2f311c0add1f9e505b3bc87ceff4a1d2c8ee5cc4b54c0cc57c31748725a106f87a4d24c69d451bb66f413dc35228578e1f954051c65d21f05c5d4aab642de431c9ec8fa882bcf7a9d078ed4bb47de17762941d0dee542b089606a2370b1e3872860a4789931e03924cb99f66e613eb20c02880134a7ac89575d13be998438a948018f9e51e84985cd91ae11e2b574a65ae77cf7cdf0fb3a26bcd229e93d92e67438e8e90f2ee4509dfb9caebc4bdafa88e5845d4e27e84606148b55173e0d0dcd142e4be6b83fcd7de46a84d0d79ce0aeed2778e1d266ece630a141988106c11dd0cfcda1c28608d701e97438cd9ff59d5517a61b89b2ff21c8b5e38720d776ca2e4a732679aaa438db6a412c3ba0b6b4f634f2861c9a5369ce3db9f458d2ab9e4662c063a407929e46628003d3d3080cd2d01dd08ca1cdefc4305b2f78708420851b1c210b56b8b856224e23301843971366d2489a433ba0f2cebaa09c9c1fcda73f3aa08e496745101f91862fcbab3bcba9ad8e49d7a4f934a7034a22967736b37163a485a0500671beb42d8aa7d3bc77569efcc95323e7e9ef9d738a5c85913a30a9c14e0ba0a7911ad4f4377f1059689a9eed2da9194134f286231d144417290da493464c40434a83cae9337c9d58ac9066a9096dd4613b0714b6510ab0ff6e491c1f2a016d49940266fafb4c83e28e768be30b028e240fd8fef809db1f888374e68f0435f23be9332ae97624bd58f2c51b526f79a728df67356b5378743b42790a8903e529ffc672f4ef337d33aa568a8ef28902b2f6ef162457b824a2b5e794a368d634a26a986e6fba1d9125ed9168743bfaa7c3621159e60067d452c9a6dcead41649c65356ef9772d398f24f877e9670a0300a8923e528ff4cd7481cfcd17723f82323464c96e712f8395bdd4996144f6d3a28dee9625d6cd54ad14da231878e4e790d6bbc47640eb053ce618d94a39c8635be4615917294d738759972947f284f91383cdbdd863550481ca3ab6e491ca3a3f8a8a75ee60053a3d1573fbb63468a46419dc90f04c9b274edb34fb8b6b7bf6dc992742df5d29803ecd2743e69cc018e66a38ce5edd43f0a8e4a63d944970e8aacc91e61d2aa7f769cd48e6c89d03eaa417a693496b441946b2693e99359a2f01cd6e04621717c4f19bf499633ad7af894b108da2ad57f1abe5afc0b427c12ce8fc6797bd11e45250a231511158c59e50acef84aa23a426588306b36c2a9393b23588907b358244ee986a78e7a38088cc4d35c8e6e48394dfa51aad97098450026dcba3c3c4d9abffd6c4882f8c8d97e300bc6f99b0eb35af7391d0122d2bc0d69d6cb79a4cb0d67036a4ec19286e969240541fafe7c3524c02f4f6d6d41a39bedf2b4f8f28e629b15acf988f7b409afb416e1eb92dae74c2936287a692f78d345556cef9f0bd11d2dc82bf025160985ed124ce91e6b9c6db296067727e69327dab512883bda4737435a3b2369eda423ad7d44a4b58b27c00813be3c8fe6b4467db44671c432c7fdb134a4b57929d161d6103d5b657c29d109720ab2c32c217a76caf852b23384c5101a6605d1b3598c2f25343529354a6e980544cf3e8d2f25374a7aa028e92163d6007af6caf8f291353135f10962d68b9e8d1a5f3e413e56947cac5092c32c173d3b35be94e428f94152f2c30788593ff46cd5f8f201f26132f26182c32c989ecd32be94e0f8107d28b161d64bcf6e31be94d828e12152c263c62c01f4ec8f2f9f999390131c6605a0678fe3cb07c747e803c62c979e4d8e2f1fd811f0c80fb3563d9b87f1e5f3b3e45be2b3c32c1f7a76cbf8f2d9f119e2f90c49326316007a760fe32bc92c89932e89131a66f5d0b30130be7c686a6ecd0db35a7ab60fe3cbe7a607d7a387593cf4ecd5f8f2e941b221b16116d9b35dc6978f0d0f8d470eb3c69e1d80f1e593f3c3fed061d67bb600c6978f4e901a24c6ac163dfb657cf9c47cd867c2cc7ef9f0308ba567c38c2f1f224d432768bf7c884c98d9daacfed000d9b46cbbd17ea88cb582bae00781c106694bbad05e68d6c2d0ac91a1595343731b9ae1d0accda1f9f6c6f37e2f776fcc01da202a33ba09d268a0c560ae34174c6d05539b62b44fe68a0f8e76746385473e61bbb433b65634ff25a4a1d2e306a6ab6276499c300069897edf7fe08842798bbe01804188df0740fa6cb16c5e57c5648105b88c9762973ea78c182f4f5d3a388e7a04d55601c8c92e26d316c45b90e96a2cb1cf343e414b5dec094a1a577ccc183001b45fc2d725351f88e5e8667453ef154f16c9ccf33ccff360b423e2fdacd4d3880d93b6f1e969840443ba44e5343fd5d3880d12fa1b0038baa13276462d1d46303092021f5dea692405362008826007d4f9fc804188a6951c2e5551d5bc712567058757ecbd5cc159f13167698a40b203e2d569ec7e3a26218d7727e355102228f23c6fd5de27b746de83085fdee8a68ac8f282e02d09ae1a7c25cb15087eb6d610f88f59b489ec66588345774b40caa172a641b28bf18aa910efcb2ea6851ea9191159f484020fa4d0f731fa0ad1f7a56f4b052db7bad8847509068c172f56a32e36ba19dd00c141c4720bda826e66cc2aed6cb38259d3481d9c306b82372a367d359abea7b365672fc2d7cd82588e6e667674c3231c667de48a0f6a67316e15e07c3b63d6bd8c182fb51e325e6a3c9a673d62b555801be3271927b1bb418444d01edd1c412c556e6e547a304be5c6dec8e864e0c8c829400c197c5b809b204601bac790d1c5b88c2e46e79d6f779835612cb1e9c2d37c7be4f2926626cda37b173dc31ccb6c73d37cb3693e463daa10cb2ed6c57c9875d39ef77befbdf7de7bef1deb3dcf03efbdf79220386ef7c609b35bd0a807af4638f5dbe65de4799ee79122d178bf799a092e115e317979be5fd89db3bef7a64c7dfb16e02d3326e6f73dcc9894df0360c6b0f8bd0f33e6f4fbd564a9fcfe65c6acfc1e66c6a07effc38c49fddec564a97e1fc48c61f9bd1033a6c5ef879831ff3d6bb2c6dfc7cc18f2f732338687dfc798312dbf2fc064f5f0fb9e3100f8bd6bc6f8f0fb03cc98d5ef1130592ebf4fc08c09c0ef6bcc1801fc5e0133e6e5f7454c16ccef8f98313ffcdec68c71f1fb06cc9817bf4762b206f0fb24660c10bf77c08c09e2f74acc18217eff80c91ae2f7139831acdf5360c6b47e5f811903e3f74b4c16017e8f811983f2fb0ccc1899df33515bddef9ba82d192d951bd2e8f7e692e5e5e115c3eecbcb73895c98ca4d6dade054971b2aa3e2a12ef826959b12a97223224b6ef065176bb6367c8d6ec5dbb001fcb5478e6e5a8013865e72c7180b30ceeaa269a49108440862c9129b31beac64dc00314e5d3164c4f809aeab00ef6e58970cf20453885c31ceae2b457b9f0310c5f81591e54c8c71ce01dc98915b661cf94c187e118e1969570663464926cc080b7374850933b2c28419219930a39e911426cc280a1366048509332a3247b009337ac284193961c28c9640474a9830239e09334ac2841919618e8a306146449830a39d09330a320ac284e1f3308e803061f8e438fac184e18fe3a80773c5ff38fa318e783061f82ce368071386af1a4739a02b7e6a1ce160c2f051e3c8c78419dd604483d10c260c9fc53892c1a807ca45f7c612e528bf23cae88672a378bfe8e525e29a46297a74635f22a775a2d1f08a45d2ce7c88254b8c5df59e25269a30229225c62b26597cbaef8e4042083411d298e9168257fc042db59a276cf822c22c90e4c0fdb93cccba2fd7ab1e09a47bedb8df5f169f18304a9658b9058d6e463876e463548558b2c49acf12631678169f163120e8101e1810594f18909f2e674f189023cdb57473ce39a9067e39c0950d5e7ddff7cd0428f19dbfeffb94a03778c54a70a9c32ac1ab18bcba4a7cdff77d37c73c7d5182ce5189d3165edde015a5b7a1042595b841fe545bd4c506b19c315a434910bea453d8a1793a01e9d03c6544ea82f939a88c89baa07268fe9c126096d67993cad01bea82f6a02ea80cc5a12ea88f941943733061f8e105c19e21107bfaa59835e7584f6fd0d06ab871c05c31189acbd0fc8ff6a03263681c2ae385663ecdc18c4962c2f8a03237a80b3e93f98592e250ad3f3acffdc4ab1d3d2799bac12e37d88575c4f2c4399a08069a092a9db004bc986145f311f01621261221a0e833b85671db6aad9429795e71ff2bb962160d9965c9afea4a1357ccaa3fafb8ae78c56f09890f89627df345ddbf78f0837e411c75178da6516404f08c2688ef1193af1b11c0339ac0b80d62293668350a83d3402236c68c21c472fe30a1840476e8bcb00b7f92def79dfaab3ab4a62b228875bba40d5f4e18e075f5f282524e87d61b0985d6f5b2de0c830bd47cf0947a31556edbfe597fc9d3ebef29d5f4b56a248a92d705a6e174866938f8e68b48861e510da5b1e72f00b9ece98b23305bee8a551c47223d6db7a4584fbcaa2579aa54e45557fa84ad546bf0851d82f6d9b28d3f2941640de4dfd3a9bacc338820d7aafdb3160619749a0f9a6c686b3452083d0deb6f25717c85bcbcaa414f3d4b6b50d282b33c3553b6640af6e3736e40a43a6cbf74d8ae2782294562bf6ba7e882a149c5eeaccc6431cb172c350c5f1d617c166c42fc260903463339230c250783c26056657d4f68adc3f6e562f0aa82ccaa1a3983845106b184d16c456b614c17014eddcc442c5fc0e817a248061ecd37c1883191a49ac397bda8591207bd468ab532682a6194628ceb6304083feddd7ba529a78c092b9a9fa307c99269c50d9218122602631e5e31fdbd27cadc84575cbf7fe4dad353ebe92bc93fd3a58ed5a6d2d41a5e710db3e86da594921cc42b3ecd01cb663d2b2b0fb6c20a66f14ff39990c970c492f6304ff3ca8e654b4f738f09148564be7f2f6bd353b2148da18ba3d65c1231747a100443648b40b1dead8a23b72812897574d1bf90888293e92f288eb341286e83e49c56e8a93caf77dbd2f733988930cb2339d0d2f7dcddeed24b5b5c4236dac3aca95d1b678b0654697e643dbc8af95024b5a7f9f5877f7849ada9377446aba638cc534bcf55ea051397d88245d34fd16ccd5a67cc8c9931dbe9b719c39d9e9baccbea6ea22ef814ec6ebcc05cf1ef5881498171021346021198301a98262aa3441b9a2190d2fc130d75e2a4325b30c6f2d4fc001a7c0850173e97130b69687e4796e2189a7f49ce118f84234da7eb647932531b2aa568ead1cdc9375b4a30a8e78dc3e809e8113d74d1b7b310eaa557682fbaa4f3333801366aeb7e9bb219f4e2d6d625a9ecbb1e4937f2ca68ada7d006bba15e7a854882de52d0dbc739295fa2ba6c4f1913505db6874626aacbf66fb4317b7ab84dbcecfb5c51d9e8966d6a0b24a94c24cb4b5a52d63382b7b1b1098366cd3433d8f5519edadabe9d67a33c7487ead8d8d8d8cc13a909afb6872a53344c988dca26cc467b7a74c4927e034175d95e9fd02e9e864ea0ec9dd04851e8a304d456cab72f515bfced20d841535bf5db6d9cc872ca7adba84c26ab2d21a4d106933535e1479bc7e9a2b2daa23dd565fbbd32d10ddddff07e4f7a97320a19bd34026116f034c72c91293a89efa211653f869ef2244467f1d0539e72d1c802658f6a11ca43a6b34809f140318942380db03c10e90d496dde829ba6372291297a86da0e2137c0871e2277840e7e86281bf7484cd7257708219137be77df11deebc81de0bfcfe01a21d3080b7e9a77c64b648a1689f8a147512f7a12a17f6414fc9038d2a63ddbd6d3db5fd4d6f7edabdaf2be7dd4b4a7b6a62bf6d37dc585ff2ef21e5ac017da7eb7773abdddbbe9eddf7630b4e9eda28dcaaacb365dd3e5dd71ba2c0f441b5b3d1f0ceac98395e2ceb09602e49b2da506d4dcbf39cb53cfaf7abe688d77e8ac356e134794ebceb8604778c55dc65aecc8139d9e479ee0b48b9e47ee20e326acc5b84915341a96b544ed94ee54eea80674e72bd19136d4353a93b3ba2851730203b846b7a12ed29150f25c6a3ca772ee1f453d08913e0872a4ad32d21e47fa0521a2844ed4d93b3dfb8eb7ba7017c7d149171d4675e1be2f45ef79d768caf7d27f10814456f08a63f964161493572cbfa1111a898343a15098aee3ffc830f5d4c1d0881259ce7478c4c7f28f4eb4681c2d3edb343ad1a25b1c659c2ca7e14b756f24c7d468652d3e837978ce0f5e71f7e133786708af3818af8ef04a030a8ff0ce85477ca764596a640766da74cdf4d29f4296da0d8d2895fefd3305dd4baea7eb27ebba525f7e4cbada8aa46b67c95207e8a2c32beba2b3b9f8c08ed556eba2d32e3f2e3fa80beb92c32b6b5d7c604970c743f25d13b748d1c42bee975df8dc85b8305aac31dec232baebb0fd8259f49d10add1d8c818af4b0ac12bee521e5e699bc6cdf052245017dcef3656cad354d633f8bb75e338ad5e12b42932c52bd694d181af2d1cb785772592e4eae54bff05a784effb66a8d98813e401f2005500da34f94890a77d9db7a71d9de3d4945272c652a6f9664bc92b2d0555ab364a931276154444d5f86cf8d23625729ceac16fbc01854020c75de360c498918398c6693360c4b0c1acf0450fa35691f542bdf35f7807b90563bbf73e6730edec4ca760d270ab309852a6236d326517889e673ceeb86da7a008f2f80c370af2689048cfe06fe3344a2b376a9757e02f036d5524858fb27dc561e9b691383492c4518bd0596baded4ec529725d4bbbddacedbcaeebbaaa5d6d46e54ed6521a6e412341adb35a6badb5d6ca1aaa08cb24571605218a5a1a067d0d5f357c5121e6b5d60a76dc7af328a5166cbb69b59252802e214cdeca3cba773346df01945eba985e8e282f554221259d236f7ae9f6317afb471a699f4f2451140ac1d1c4abcd86af4feb62b4d6911c88d1dad5b8d1f616c325a486a4a0336c2dce65167f3671cf6d9ddd383bedb53d2f6512d4edb2c13eb14fec13ee5c0da26359653b705afb5673f0ba9755d9b66d5456832a5503087ed6ea12bb3f2b18b017b0558d896209d22f347e5d1a4d99d077aacb8c4929fd74fec974120bd3c8e229e3d62716a72ffd635162412d8b94513b957cb89dcaeda48cb659d8538964aab54d27ee522865a4cda20299482028648da5ccf65a3c55147acb5dd79f949b46e7571f16279d5f93cc1828c40e9d5fab9832a1575975e119534a19472f8d5b9346a76771d3e8df1db118d16da4f177dba3d19a524eb576ca38270c8905397965e266511a9546da2327a4a0e91412080a39ab699c3d435c48abb76bec2774439b08e464a171ebeee5aaca6a931afbc43b88e56dedeb3870348a56b824e23f307c892410a24814dd1381a10e0c7960e8fbc010f8eda150bb0765efb2ca647556679c68fae1c5a6892c953e6b8bc6daf04083523f3d6ae5a558c27831a98bb803ea4251cefd3b8daaa38c5cb38c3466a37c9bd556dde14d260b6d3f769035b7d8343d0f236afc9a4c8d9ef799ee77b7daa4a907ab344daba8afe8aba038635062a60c8a8585898b1532343dca28eb260b85c520d61677bd77f4667519c759d7aa5b611f57c32cd45b9c85e57c8e8659a8f33f0fc5826ad182a2b30aaba47f6c7b4469664c1d660ccbf9db1553a6c55fa78b726c7a161e9a1eb5ba62b2503c7234626fb319333b134a0a35de6631a68cb37a5703512337438d5b57980a356ae187aab1a41014d457fe85c2d70a098488b28272141235d6fe3c1035727f1f881a697fa0d75d100c4d5ea1b6468d4054b65975b9e168c4303c698d8232d66dc6d188282337cae3a92e4c56584dede121f853589cb6d966dfb7fd6c3fff411969a346202a5f51a937dd5d65dc661c4ee568389beac2df3d586db1e7c1bac2429f14163ab3609b71a56f379d864494ae5dd2588a7ab4cdb62eeb0e9ea0bd83d96c369b35e3b4c6813bef4681d8cfd0562f2605cfb014766624059de19bca82077e9ff730044b4ac4eb2812c2ebe070f3c230d4b4307cd19bd7690fc9b233a20bbd873a284ff743969d47bb538a04f09d37cef0058a1da98ddbc5dafa0e8225ca3d8a042a73ef8137912537f3b467e39a5e9c2b51483ed899c8223cd4fdf6f02f46ffbe8e2c6b80efde9d864780efbcd32154a6bb47865d579a1e7aef481cdd11e167c0b632c544a278210df0383cd33bd0f352480e852c6d6fa069a3b2feba51bb236d66feddc8eeaf2d51a42eb4f0a4b15e8484ae2b73809d169247705714fac8f2f66b2b44be1891ef6c54170b827fd1dd6dd4d60c8e41f0f7a5f7d2bbdd378f447d2f6acb0647ce176dbb6b61f82ea4e11dc725c1f66ee3de5eb21491e58bd6fe7914095cf80ab7916e9ed6debbee78c2d03b76e9c897eec892b4515b21920cc3f034181cbb2ee40e8e1f39ce344991405d68942281ca509eb65e455983c614d4c297d7da7ee2151344da9de933f8dede1b49efdba869bf1a5b8e76637d0d8bb8266671006ceddc41b067785b2d179668fa8ae43ab4ae8fdd29d08841ceeddbbfed2d38bee7c2d5f7464e36891f782d6b2327973962f43c7774d3b1a1c2acce40905385201c100744051f2390f1b0383bc625c459a40a4baa2c47957515b5f07d265134956cb5d5da4aedb4735afa6aabb575a652ed0bdf6c29452036775dcd7e9ebe6e9a66ab66edbcd54514aa5184578a3963b6f3e5d57489950c2bd8e9163d8dace06685a779e859e4498f274d7aec59e4498fce4f9132dcf47b166112d4412f90f57b1a7941cf1d7ad0dcf4a86791274efa9bda10c43295d3fc16b1d6b9f7de7befbdf75e9a437ff08a7578a505d17048cd87f6a3351c2541543e1b15be54fe523224e5b357c257ca5f4a587cb64af862f19792d3679fc2d7e92f9f263366f6ca67b3085f2b7ff958316366a38efa4bc98fd467a384afd45f3e4c549f6d0a5faabf94f860f9ec52f862f94b098f169f4d0a5f2dfef2f9678fc2d7fff2f13163668f9f2d86aff12f9f23336636f9d9a2f045fee5b364c6cce6e1b343e18b87bf7c86cc98d92d9f1d86af96bf92389931b37bf86c307cf5f0974fcd8c990d80cffec21700fef2e9316366fbf0d95ef8f2e12f1f243366f6eaabbf7c78cc98d92e9f7dc397cb5f3e3f66ccec003c007ff9049931b3057001fce5e3336366bf7cb616be5efef22132637c66dbf005732e8118036e4b78e579bff7965787dd8078f5c3ab5833786fdc7c9a3724bc621c5ef1e643d6e4fedc2597c9fdb94bea69c909e874f22142e4c8919e184f1155fa6cd1e78560160a9c281fcda81ea89c9e6fe1162aa79e5e3cf86dc93848db208e17d4c19531aa888c2a9e5bbb514584553c3ce46591a572523fa020962c319658eaa644e5fc88a50eadef53ef528513eb7b548eaa07b32e09a43b5f192588f1ee33b41183b4b94b06a9f2c12e7c15ce44f1aecdb92cb2fe42908634ee4b09b4b4e7852859d6110758de83e1eb5e55c32c20ce57d9d4968cf355249832a91d3a5099d410384c99140f75c14da84c8a881d262b88f35372a02c21ce4fb561b286383fb5a39a6288139e38341136343f9585324c99144c0c93c5020395491de90265b5b63065523d49260bc6655248a80b3eec0c292ed018c051419875491ca697ce2d8da3b65c12f5e32b7d0023ed7befbdf75ed11d533b5486856708956121c2436558603c3b4486c0789a9f224265588ec0a80c4bcf112ac382a487caa87a501748a88c0a87bae01f21d2033bd2aa544fdb0089e946942e0ed3eb45ff1804a23b0b0f9549c53e19a3ea09d3859f8ad10274e7254c9854ac6babbb8bbf70f1b2f68b77630b134c97cd7e46bd1604c1cf822565e1f9e1fcf9c34b6e16221f8c3b22f68cce674142fa4784838947463d4d6241d27c1823cb16e68adf1a59c040577cd6c85286c9d284050e93850e74c50f626c4182b9e20331b6b069c1835df82a1bf0553d0870be0a472380aa47b3f77a2f9dab5be66831dd84fac12bbe8bb16cc102028c258b174a9631b0a0a199650e25cb1dca162668bec612430561d69c031867974a544a45845df8a91c66a57e5c52c5930615caaf8a67ba30487a2a1e66016a66b9a92d169d7bd3a89cda6a01ab2e7c96d89c75a9e279c962d3af24478ec4623db12d20899d629dd8af24478e10218284e508b75860447a90f4c4604488b0b0f0c088f0e0d667535dbe9b951e1a597a3c4eb17b45f174fa4fa7589f8e74b90575308dd2ae2b697bbc82d3ade074b0ee48d7c3acf2f27448ee920ee727122f19f95c9ddaaa34d585779c74596f82347f6366de82780b2ab7a0deb420aef4f40a92e63b7ae3d5bcdfd7232b3c2baf2440f7de7b67df3189ec7239bc62ee478bbefd0e35add2b3881d64fdddd1bbdeddd8f33c902f587f47be37821ee8691e6f34dc70aee2431b794d9855b278ef66b555c305d901c700cdef823c9a1a6ed5dc3bfc68bec7835ba458b7e4a7b5f1a50436be92f8fc308bd50c44c667d8ddca1879b4e77de038c10bcaaa571f6af5d7bba06703d6a0b3efa90aa80befdebd83e3e54181f7debb18b3ec80d3dc65e75dd05acf8e4cdc7befad6469a7772d3c42fbfd0ceff63b8ac84a6e630fcaf96826b91b5e1de962f586b7eec77a76b0e959c4c9ac7b52a18223bd05d556e7c37cef4e643f45aee0297205ce8ca787e8696436457ff307d10c3d3d8b9881e7a5671133f098a177ef76bdf1730167480304455f811779e5ad9ec8f3bcea893c90c4a19dbb478645687701b7f182b55edbde4bb02b59aec222bcf67c08c56fa7db651280f0752fe98d226a436534d2ab5507973a7886477064c9ed694cba964abfcc22c04b24a7598ec4a195b6ab6684ad24aa74d141cff368a54cc07a1178715c8534ec2fe9437804e8895ab6a43c5a64ad6d890e80da8315710f4dd334ad2422afb81dc6085ec6d89d00281f8ddf3faafd963cd1bdeb95488ff4fe05400554666bd9b83c522b41127c6d8dc4e1fd5672d3ee95d623a988f42e89e2be1dbcdf6c83b53dd135f09d8eda28a369bcbc2ab58434bce31091a5f3500241f02fe10bfc666fcd8db4ade779bf9c56ef12beeae5fbed1e0fca43dbf143904b8a1f825cdd63ca0de7b575b15a06273d8b94a149cf2265504277b12a66cc3ddf3b10199fc15f773defdedbc57088ef09d3014d17630989a0ad432c556e362437bd056117fe1022256743e920be92c826cb8acf1b5f49ac5042e39524e895c48a5235fb1a494193be5f99fa9544a60a5f4964bc52cd164bec958409b368dfb1b47d6bf5c0f17aa99025565b5d6c255cc0ec1babf3a804ad73d6a19e748a664680008006e313002028140e884463d1683824cbd2f40114800c9aac527c4e9c87414c21638c21060801000000000000009a3000b07cc01ab8063c49a0d3c1aba45d3c4fd399e60e477aeef24381f003044b5de34a59b9e678b674986c8818c76436785f713921b20381b7b1ba8eb3e8ee5823f986c163df1451db4e0a94acbbb3c453a1ffb91bce8920931c755c077856d312732061148aea3268a93b26303b493a1d839a044f533da4f434d13b588623612bede6a0191b4126ea64b3e5de7809b9ef035499171a5342dea46644f5a53887f62dcdb46b91a1040356b7a61dd897aaca6507036c212d4de3a24a8258b2740cd70127c88dbdad5cd41c951210851cb6e63f2f25ad082d555574409187430777f0991a7a4680bbd465c02aec55be0884c63cbcab11198e604f3f746fb7df14f0c2e1447a5293c9d35119fa752480cf953002089fe93542afa537d491c9e8f412e42e798c5eae1cc3df1a4c4b208e08467aef9894cdfd4d7b83e1437b3896b8f76b9469391bad6fcb482ba4a4625243763e29da6e61904e30bf1dd1884d048a4e081eeca5ce0160d86c88d6b40c230500eba2619d45732b787417ffd7d42975a9e7a155b09972c4b59d37729cbc35004d08e4f44c115665b96840fde3522bf6f0cdc378da8a236bc857aac4482b686bab906a0b3bdac05efacaa47753ae7ee3980bb74ffb5cc6f6b3fc920bb5d669520cbf460fcb67e30e5b9dd131b78a05e23f4e62246c1eb2e9741d73a5df58ae1e655efb2d051d3cb6e09679ac7dd942f65e080d2e18fa6b98422d2dc75500d193b65941429449fecf06a90a96c475c91ac30dc89581d2dbbfc1f3543a933e1d94a378fa43f780fcf0001d679f2cb9c0ae9b5b17ba25338e1aa3c46646f59a573f561f960d4b88167ebcd253a64c2014bb89d9912c07c0f0693da9be53e017c2308977e57f92e819dec698254eee7bb2209cd65a5d7b96548bb2f688a90daf795f277eb41979cdb89d3fba6a2a9f4ba591511dddda2fd234b1762b4e3963c3b6f4328db8ec9c1bf1047e673b98920a6566765c1e199e3498318002599bf0b49ec9f93865359d4d6d91f00b955b08ec48ad44eeb622d33b1fbe9f159e1815574ef2b225ab713720c345bf285ee232efd2a46fe8c57543510258917798c4b27891671d8d8b646f53c605a233dd6eb51a6b7fbb50c0757abb186e0a43f4996601c3ec5e11036144669363c3720e9d0a23cd7af010788fb0921e2c8a012d3b2c1a36211e5ce80fefd1b6429198ea86b756154cbb1d8399477392e827e1122311e7c94cfdcb0526141735b1c17c94e391a6275ce391982b014cbdaee60aecb89e9d040e47caa72029e0da15e74d655ae74a877ca630c273ba2b545d03201046ef63108577d2f8242c50bd61771ea7f8630cb4f53c43a26ae842c2df2716da3651c7d14b7a24600341a692c6e6197a9a990ef832456c1d23212263c8485b2929192d56435ac3dee1df6f177941a5ffa8d07fe490d7b00bcb7179daa0ec65c444d5adc568941fc4f04ba13fe58832ddf0b972fbb3ab38bfb1d245ba11a0e5323515298d3a5612b026cbf60930d146d03343dd2f6f64fbc2bc544630392dd3fbedb7ce8d2ad12a14c0d400941d96fecb9c19e6d83da22349a63e9d425fce1e9a3315319e2dbe3eced12f213d32b6c1876cd82094e58bf8070807651e36aadb61165b8892fe0bde9c38b937fd5122cd021185d42efa802825ba1e8f007143b6a78bb411022652a27d5a85b203395fcab878d5eef1be2a8de1d693c2636fd8b4547f435b2de3022147be5f0c3c770e898fb4b3b321a46568274790a6e486ca549d3426b4c3ff2b4b7db6ebc211a233dda263e1e0dfffda6b6b6c2496f632b58fbe754d3e8012ca69a753442d1fa7cd16c3469f3ca1705f2bd658b518f4f98c1cc913163014e70b55201cd55b99426d50245164a9381d687a4c56917a0ab621655d849771b81805eb8e6ea6b62caad1d9c8a6f0a75f21a217f741333e17d6eea57a8d070017d5bcee9a8b5811c1c3929cab1116cc42126d3326a7f47aafd2046efbe9dab8e659b5dd5c73cf21bcecc4329aab7f805cf772907cbd2b9f11d90ef1225e84f778af492d69cc2cd82798199cce6602388f762dcf6041b213c03633c5ce87ea17001767ae058a8260c7721c73e7b62af4b1d37234a8dbed38b9854677d13e3002e1ec46111f026a0d8eabe4599791586869b53dd40cb497cbc316598e29816894aae30c5d437bc2eb5131668b81050dc8cdbc2030723289ba539ec32f58bc3501e1ead28428f2a4a9d4a6a9c836a4fb2ad29f912b1b91fc4b29b113365a7b710b3e528b72f519183a15e5abcae4dcc4857b2781ecc11ac99e313ca95222100e2e33e4bb3d200fc16f711244ce31560ce1b14c8a3ebaac602d821efd50971244f479701b4b74093908233e93d77ac33f8a4af6866079981d1ff278d8f8bf5e723d16126502efb910faac63f6f8d0f3c3e69ff5486f53b8b3a5c1a633ce33e3439e8f1bf3ef88e60b47a885cd38678c0f3f661c08934705d3d79871ce189f70f983f33178a2d6301326095c42879a1ba90d1cda427a211344a43d8704801ffd7a36d8941299cd3b58a6e12659ed57890c44674acc83d0b32e577a026ef444a531ff1f649c12a1bc0f4d54738abf40046334214d91ecb009c7499c2d6c9522b82e42971ee575b730e45a91b22793b9f1144c12c45fae159917128e498066434184c489484ea6e8b0dd08e298213ae6b71bcb3d0b69e84150dfaaf42cb203d54e779a8ddff73b4ed4117376166c61dbae956bea6142a5aa3268e6c72fcc4126ca28aa33357c90898af731922bec0534dbf3a4847a96524228f3525d2240fef656a311ccc8c8e63bb04b5bba1e00bf87bf1bbcc28a7ddd29a20d494d752131b541e0f1cd46546077923ca407422f266a7af79e80dd016a46194dc3dd19f5a6b140fc5d70a52e273bd6349b0b045429d130bb119875d5df965e16ca0f19ed0c1fc35eda02b0ffae2b973585684e6461ea1da176139752df154b30ed0a01c2b58743a72ab108b363878bb5d14c9fb8fbab985738e00ad6ede939ab2eb72f57b0759c51539cdac41106cfbc31805db7120a2e619305bd89d1d70a3e819684b967bcdcb70398b61b52b23cbe68370c269525c223a275f28c747d9e4ee10d4e24e6d17348ba45e3024f90edd61ee2d4a15dab56fd9bf6a6a4dc954f762216ad5217a150c559f870bd0ca018869f02fbd653add11e1b2b6ee45296b1caedf671571446bbb3601042b28bec51cd9ab923c5091040dbda6a71e5e4f5bf6e9b49e9b122bcb183595b613767e474d0e3a02c253b598905232b8b34027c28d841283feb659757538b10831a9f28975b0988416d9b907d288fa85fd66616a6f34a60a9b957f0701ef30841dff8a488e63240c7f98c98463d6a8d9acc06bb5d8613c348e3273a15d5d51dfd36cfc582a549fa8afdc7e25a1027fc140bea509b18f829bc92325fb86768cf43fb1d924f8213fed232db180cb3e338f04bc7d5a14006ef728af02dc3a76a3ed80b8385f9168886040aaeba14fa9baf5532e4cc548da452d38af7ffecc13ff5197be3d3e95b172ee4ea5779a558958d9fcd362cf7e5096247fe3e6e6bb26ec5fef9bf534037af8b96fb56988f826038ce5af4201084559229ffcb3b3f483542276a7c65f1b57e09c541739ffc173129565184528fdbd0d93d24f551eb7cd49af010fd18cd278dae268ac777fc4d8aa3560de8251768e16c84150412eb80d3a37a9fbd5384f0994faa2b40e332cf1177ead815a611852ee58c8e426587781639ae1d51b88f1241f7a87f86be6fb1e6b72d40e2aff2dd77f48dcee12f3aef2885e31248a7439ef3c8be9030ce7ef5a4099e957b18d8a49f3cd285510b06853a307d15665179d78ddc61aa81dd36bf8fc20465666dd1e44c87fa9724d5f6358499bc63a0634d0f591430caa16a0780c8e4b3ed5cefb6b5adc06235ae7dee8bada2053194670c6dbaaa1e8f993a0da928c58d610394d0a21fa8c5dc0149e52031c7d33feb1a7f9d8b961af4442095e01ef78f92bf3568b6db5b3b8b85c8a74a39efb0ce634ac4b18ede78a7251c976771e6db7322cc591b2c2864a9026c25112c0987e002f9db6d3c1e5aa9749beae139d230b7add81601a983333ed64bca64343a27eb7e21a0b891e6182c1a3cc4dc87806e9281fd693b381f486fefdcc8ef954fa7863a4dba0592cbe6b3f053522f62a83925582fe54be2eea9f06d039cbb7ed3ddf17aca82cc7d3659a88887a8b80d056a79e7ccad94af185d4e7aa9f1e85d3562161e6878246c8ddaebd2ae3a3e2cff4c991ddc3c43a3af076a63699b836562a4e92cf64584100b653280f285088690c7f706ebd4ae34b61e693d53f45fa148708102877348c760b83cfd465ac2c4f40e76a97a26a6db79449727ab297cb196e1a776d5403a79feb3c7cb8b865c6bc0edcdfabb276e6820b0e851671336794d876023439a0774484f98f68f2f9091b69b44936dc895b9baf79fcde7c2eb736df5a2479f03e6c454f1ec4f91f56295d037e7435ccece72b247a5c3da0bf68521456006f54fefd8c42fbb45b0e6a92da7cda048e22ff2ef228c863a00f1175b6f5745ba03eb225e0d0d8109fa7aa008ef267cf31b01cf0b6644950eddbeb9360903c203cb5301057f67f51aace40861e05fb6265e9317d9fe799c9e8d76e45202439a9d733e48dd282bd5c9439950749dca4ea04680bc8b04a8ac142c12ed14251b26621224ed881551bea97a5e4a8eecacfc1b145d8e2fa56c074fcab0cfc6c0662268005099c5516c41a6935ae823b81d260e89b385eac984ef599452d07cab09e8b411cd609447ab57609d49e4b791074c310c860f0da85d1bcda4c5214b487964dec5c21aa679407cd4bc1f799be35f0afaaf2c595ae01adcd4f76afab67ade9d452d00e3fad843b9aca7d2d39b691a40313805471d22c6a24b39a47c58ae9605fcd7c15154184b8aca719b5fb7f947d73bea1113365c393f919dcc80fa45450dec35a75a0a0fa8b6768481feced5ad5201a6ec022e8c9779ab69c144ca734a96cdf5523234bfe72cbb442d21a852de3fef316f6f98b0c7f9405e954db2790df94a4c6bd3b89a2ff5093cf2144a31b594d4183e74278589bf58277e361f0d548e914b2ac0ab29950d1052e1de1e9a4c64823bcd23b0e20903977e38edee0904113f064916103486fbef401527ce015c5c837159184020f65ce40753be130104adf1fe8013b96b79ee82d5a7fcab5c7f2b05117bc9c0bd873b70749e5e3f8d1ca3feb0a3796f4e793fe77d886dc9854be287c7fb203c2f14368c901609f886ee6b39cc79c84b5ca490a5e0c17e2055d8a0dd8012908a46f417a55e1710e314056c9f70afe1386732ffc7a0e1dd4472d9263619008e1a293db7511b1b631d5290f83561bd1bc4821169f4d0dfe485ccb90a95aaaecd625b18651b74b9fb83071ebccfdc22a24f43c6781d26d90fe15a764b92c95d77834a776ce9273d01ed02a30d413b46cb521744a15583f0f32d8890b8f57e373364919a7991a4dfe90bccd2e8c0866cf6c1813305d19c03304b280afba03189c480f5c0bb2a15550e588226009d05c7d36bcafc0f370b225ff76fe357e2c4dca28245c05f160861cb81e4b261137679ad6135c383722a299fb2da97f070dda030abdac4b1b63934be10c761507606e9a094fd23a208b8a96edf78e000088b6bd24c7de2252d00e5589f80822d5a1fb8eadffc25889e36d9ce3fd8d4241a7bf23815e6ff222aa9b925a45ad751282c2d9e7bf6713514b804c7338eb0c5f9d81df2801cd04a263454d6a4778df299a31f80468539740008cb1a0d96584a2bdf1a2211afcac1485a1a0d23ad6baea00d6bd744472e588e3a52a5e6856e21e024323ca445e3227e89310bf91715a0da5db2ce1f089a02ef81e4052b8a0379d4c77d1d376186a872d2fa9d2bda80bc3c8ba90facbcbb111fa6b58d1047b8b7c056115040bc84b552abb447e2c571a34d87112aab6e346e9f07192711172a27ca4c1d705c0f80a01330e67e57e80471d67ce8154b4ffc09658e7e795662caa1135577e177da9b2dbca544cd01860c951d56b5e48e39456f5b257019280cc45bc0ac78a2c2bb8948e5fe0d1870349cb961fb580816cb7da3c395bb0d53d441d75284c15988299154285a235356f43df61ced1eeb065756043a323b37b618de2b35f0403ce55b3c54e02d6b7b759b4cac8e8f7346fa593d92633546813295e05f5fd0d812eb50ff883d83878774751ea797277b4fb6fc9d9f0e7c7fd06c825efeb60299cb6dd023a0c7870b939b44ac20bbfeb9542be4e92b45351a7bd4ce2f9d28003650cd1fd47a865c9bd864ccda46b09dc8adbdc12344895b76e195fe1d8e00a8d6495963a54d260a210afd515ed6ffa486dd0da27c2ffd343789053d49ed2872376e1005426bab791faad2806766f860719fc1e36f0cbdbd5a21033dd1ed305f6ae5cbdb9ac0a4b2f860b9132722988956d04015c31ed5862898f01668b4bd4a28b2960f7de170459837751f552f0686087c8ef53a911d99f174aa9a52b197623c72d6d195d429c8664e4b10b1316888c8f75a29d665f6d341c61e3847760bd7a95b0d1914472e9f58e2b2974c1c749c65df754f3466cedcdb2c029898d71debdf314ec859ba64ef533b506fe461dd8452d4c6f4da13eecce1e83de317c5b0d533704aa21ba2bb4049f010c106e9955d59d9b5764cf17e071f4244f12f1037be4e7010ef1e766db4defe097d85296697abb719b1df05d0e70dd88474ae39a31dca58c9d1f0ee5eecaf789f72ecf69a3d533d7b8cf12cb066b3db689182d443d7e99fa2a3104ec6c14532ae51f012dd39b232e3010d459d991ebeba209270ec25fb6376dcedcacf69eed92ec807460781e652a340aeab6547528fabea5bccf1765c7acbc6719e1ef2a2a1a0028514efde7820be05c74dcba572d96960faf3d3b922973f0c35bd178e6ab32c75e827efe7e65f3c35132d97a95edd73b92ab65b2e5b6dd85bfef055afbd3056622f9c55a117d67ab417de4aec85b92af4c25d8ff6c25e89e5af0a5d5c6c031f3058cf72589ace7036c7b3580543cef92696c752eba382fac8cc651d2293190283db4b2637009999c5c29f9535b12816567eea4dd89dc3ebecea76a22699bc26e0649fa8213310fbb989a209cc53941357309c57f8ae3a05d7d9ab611ac13cbaa2a1b2b3dd529a8707d3c6f3f6567adc81ec5cb24dafbe0de17faba61b7d8ff752c24e612c10c19f64af831e466a88ee814eb2d08cf50a1879ee998f9bba0934f5aa2f61a08f1216dd2d44dd1ee0c37d54bd7205a54ed2217f9bb250336e948006fd5f6c6c6a9e62688a50486263df310603b1892993249fc6d4b5ce9091df651150dc8b69bd98116e7f6f4964b5e0aa8d307366d905ed3efbd4602d86ec60a39a6b77cb8c550d6f525fe99454460bb4f989686167461158c222df2d9e6fe5f2dc90846c458e88096bc9f69f71fa5679689a95deab0a4883f4bf187d8371b23240e3c799295fd279112cafea79ba81b060b6cf9940553dcd58a057bedd0b1d0c901a4917d36e8137b1e54c32ee3ab26291b450cd806fc9781794a0b97295199fb3d37fd111e8f32d8d9ae73af12bc55f61de35f9eee2ee9b6915cb821229cde67f0657a9788fa00cf5639465ff785b203da9e9dd86eaab6c4e2618e932bb590f47032f9e5ede0794d68bbf1ab005e4d6cd110ef0fbc4894779690d739f66916ae4d8a6ec0e3ea835d856b8a57d6589a399328485dd27069910f2ae52450e92ccd456bac872bdba2cc581730e7e01208d3a3fc40dc794794149e4b963cd61c750b20e17acfbe65ca99b47f4bc740f31ca0117ba2e2d3d09081ca0db924f02f919afdd833a72c376e9dcf8d601014245368d95cb8636b6959d0049f9d9c27ced458688c867e790176ea6f82b66d0f9d80a1120e6af3c07206266df1f64b3fc4ad506e225c24ba9bc6609cb5db27757ddde746fd1f53dd7d69cda72bfe4de2d5a0d3bb4493721392522881189c354b26cdb06886e4fa0e4aba1b6ef2b62df0ccde6c9bf1810f3c5238f2030118c40e4c4754579761c581a9576c0f13cef49f6d1f62c468535c774a31685e3135eb645e73c8da8c9808f602878003df179637441292ad62e0b9c9e25730bb8b48965adeee77b1dfa30e4c606153710c77e4badcbc58b1c3f40776c4a681a550d5c6d14ef038440a57dd730714372bc68984b27f6b718cff1d246fa51020db63e367abbd6d62bfd9d30c6d032bbcad7c2c237af1302e9a802ee5c1c2d1bdddb73923ded9568f84efe541598877cf1f76838d98814a35c583d03f69b90cacd299ff8dc89585369cae2423aee2ff52ba39b81596f21c137e98614516fb87eb52a1a3a18054d8a4b84b075a9f7d2e0bffc705ebf8f13ec2fed5cabc364dd790af4cff7168a8f92db8cec4c2148d16d2456a6c3b3f5955f346576c3743e94a2f9b865465415a0faef1fa31037097dc6f67b9c98b90f5783be8cf58fdd5759ad8ee725f2fc623f6afc01ff37bc2476d56637a60378e9813ef1ffeefeaf1362020f4f44fd0e57ccd4012f4d2c8053ef3c544cc96a1be8592a3824e377232fcf9dded121542732128a521985f40b78d7dfff9d79838f5150e898f3e480964fde21376c4f9b6e3cc208bc0b7a1fb7af04c60463aa15195466683068a7b26a0548c022890c4baafe59589593ac2624cc4a27ca79147a624060b4853a46b275079354e54c1a9eb658179cf7f954bc01e6355eb5633c72a7d9e52e81605359a404979d56864583dd1ea655c9be1c40431ed96e20c53837e0379847ad1573354ade09310276738992ce3738c1bb165f5625aac808765a55567d96d43c30248abe2b76e079eb96aba4ee02131128de339c6723c2b4ee84a88626152f6470b215d9cfe885bfce71b5f0dcb37b71d1ee656d0de21adacd0b27fbeba0cb2f2f319c7a0ac973595810092f1869f1667121b91a9c51381d5da64fd135ab4477f365f32de9e9980570556b6d99fb5cbe93b48fe40b1b72443a1aa79cfcb3b0c62ed846b85a8d6f3e28f666a8d9df4267efe65ba59cf68b18f55ecec443d20540d1a987d5618ebf17901daf119ac08d6f064898cda592e367deef2ebf58a2392b528947cc55dc79dfbeced2ab0fee267c6a2d308ac91aab4bb7165c567e579dda5cb6bfae49640213051ed293e38063348042c035ec05cff8c5ce37ad2b47df611b34a3dac474a09dfbdd35341302acab377dd8abf3be36e1e82362842014f30b17d6c40f02a8a0494936e81ee747a0cfbb31e16331f833c4b462fa7bc4dc8972645b385f69dd68c216edffc328468728bccbbb808738c11cf84255acc80e2dd1d36d1a1d559bf2dd11859c416f52a7e34cebdff7fe9ce67fd545a4b04eb7c1e2e1c3924cb24cf431f8d73b2aa0d40b2b6823760612c7acf608870e345e0da39aa908f80b5e68dd8b8982353edfce210322aeaf6f0dc4b4c130cb95a2d99e8c320027e3e3f92bfcfd3c679a4cd2b87101d379c1d722927d4283fae594899bc55542626616d7c1578523cf596f14f0d9b7db8042684af1574da38286b26a0d52a1d88634e8c2daa1cdefd5ae607e6a67e353a9e9f7c4d7cd3e914b8382577f29ff33a2b54cc44c7bfa0deccf138119034f007e804186f9fe15c2a397660f4f9a04020f0da272b10588aec4cac736de37cc2c9c25672d12a205cc768c3d536005056424c7f8ec262df912331498397e4630a7950af885e16ba3b647f633260380bd237c0940f218dce24011cc42abd81225a0183a55e8d98a122f9f274a9a9a3a0616f3e97b12388a06dc5baefc8a50a8008ba0a63e14be11ffc8567f1066d6eae47693fe0072b25393a04de01fffe54a4a92a12e7e508de5e598b31a602ba9165e44603e24042bff93a1aa74d0f101aaa1461ed7e5058ca66f3bc9bc997180b0d14782f32f95ec2ade704326387c4b041ab71aa92ba3afc281cef5824eb2f0123ef188fa9d3d4e498dd9c6c3530201815665fe8006f9ec0f8a467399b787978625301cf5b8dd610072a150eef6443d1f49231308c3622aeae967ee2618094cbe0e9989f4e498f74a53920902fbf9f6ca26316790eb045f600229671db7875ea3a1e2a41390771aeaa722b3eac4dfb4e16d6d5294e5fb44ec046d2a7ce348c54f2c44a73238a959c3fa260ba8d8bfa7ff8032f8f47b6c40155c0902cfd68540dd0f5f0860263faf62d670868c34b0a466e05e71447252864341e9ce335f1760fbe4ca7985f102d8c692233aecc07dbe5ade9e410c79976c364e40298bf360ffbb86fd190dc12f324102238f14f3505374d84a6ed9eb64b9997e08a0e98ea9c7df36ee2492e1e355d2d9d072759757328f09867cb25c4087ba531928171baf96144a947d628c561f093025742f53a127819923e0ce7d895ddb34ff16f4f584c0f4832323376077669850f19c68b1d388c292787860c2c4c485ca092dea0c1bdd04caed4f216e699dfe53837fe20612673b4ea2ce96fe2aec33aa0bbb70055ad67b5bd35221fc0f745db87936eece731e22eef4aec050331f8fb70913e717668c6e3064178e76e6035c0b3c5e9da6c2ecde19b7269d4cc48027f5ca61d35d03d3162158039d2ea43102488bce22aec7cf19dc6c57df2b2abbaef913615be044966253ac3362c1980c3b98d98a1e2698a25f53a9f02ed1931544c78ac4d088cb5311b815e7c2cb526e352d498aad5e93d860a49dd7ed401bd56a4ff69e1b575c2ca7fdcd79f42075245c9898f0ef2829d8d155145b9d49e4c32df64d3e9ef95a00c485568f7a5563631862773953149b2c3eabb8f042aa0f0e5d5a8e4edb6676234f54cf836841baecfd1f4a46ddf5391bfaf1a1d43a918be151a3ef091d7eeb0f08bedf062379c02d0270285ab15a24abe42ccdee5ed1e74f511681824a9cba12f8717adfa2a68db072c06a5e5e1b05b6c783b0fbddc7cb4ec0ec9c7c353b7f560963cdec7804f5d8d374377f74372b76e95ca4b82c7570a760abd7880b4aa219dbc120811dee0d8a65f5fd04fb86c010ae9682906a0a8970d949ea6c0c35abc7f58a13a7c11ababcc4420b1f8066edd032799dc37b8d164c41f13d37a3f6c5bdb45b64a3d50850d1ad252ddfb61ca06e98ff4250561fb0c095f1567dd32ea62fea820bb77de8a453340a320c6298f75f98a91df9d8a946d90a1716b8a6abde65fa13e237ddf6fae2fec7f2166721ae732c5355a3d27f8c3bdef752ff771184fc2f212e3d500b13032a0f92dc1bed7ce9baa9a0e569301195bf621c907d65003f139b6a7f7b3b96e39beeae691140ee321f7957f67b7e5ee73f3f2fd379e192eefbfd5ea6f3c0939cbe874fb2fa0f4ed2dfefe7e5740f8ca43d9fafd7fedfcfebfde7c76bffe7f3f2fa0736c9f53ff8a4777e1faf3fbfafd75f8fd76b9fdfdb6bdfe7edb5efe7f3faffc1eb28ab1f8b5a8856d6a3027a9f83036a950a4694e6e7c2722af497c7a26ec0a00507072a8caad0c6e7e356873c55a568c1093a94930ed2606429264d1d5291c3634712c7830fd792db38f138a393220b98ee85732b4fb5c51be1272e21e313a251f2a3f0e834a0cd4a910605c9d7b868d544def685bb790117089effe834b51cd40c663664fe3df97eb09b3888fc12b38fe0fd1ef65886449eb5157a832f884663044f8fae85ead46622eb3e7265e45c589f7973f498049e69101ab55bc1906960c78f2ea03e4d129f24c96d9e42f424dedb5a00de2ede74e1c77d5bfb5e620c2bcf3de05dba5240efbb14b87e65e8793ab1c900a3fefd5c9346fde2c61d80c96276a40195aace604aa061bdae2ade015152cc4874244fc93d9b2f223059d60e78230cf01f661fb28986ffeab501a7a6991e2d2bd9cc2494cc5a6e1cdcc5a95827ef94d81acf4267707b4c74e99858dc917770fab6da6ce7cbcf13c637d86d2f18e65efbe088e81fce26b31090851bfbf2b9d22933d11978212d638570aa80cc983195e047fc17c0755ab8552bda897490e1f3197e754d501ede630b176bf1177eec40176b31c8b2bbb1f6c3c643482eb9c3dd17c68ec0b273a39e40c79a80b358ca211333bdd162119a231bf6b2ade3cd4906927e9d0ecdd80409fcdcb552c211c35ae882d550ea96f7d3a5289573d0806ee565f378d7affc2aad968f1743ac590cbc7d24c78abc7b3a3f511a9d51669e000d5689a5c4aef62a67c885be3f840d5fda85fc4a82118099e269c44440eb3f237ec5251889a4f0739f422d61c15871f1c5746b8c13d169c98a931057131dd3213c049630f109e800fe050410776bae6fec554a4e4ad9262099594cec5b50e48b4cbf09f92fedba93d390c2fa3021e872e54eab018da9bc2cb730733ff0691a5f726567635d85df7bf30a58fae597bf60e81b9ffa83e6d978d74b62403a79982d325fdc6db12d67a026988f1bdc2dcfcaf013b8fd384391877133d513e83132cde27ee3e1fb08b0e5239733d25c88e003b7d6236d744536db24ba87b3de94894b70199cef8e20bea01982cd21852aa89746be5a13118313c37bea0832f46309dda87da83412890084211ba0b0c0034a8a619e30e448ea0f300d8eab1489441984fb071d083db1bbd3f7a319c911d61308cc29859e4059b0571ce2fbde8c85ad371aa30b86203491d80c35ad72a69809dbfd74fed897a02a6922b1d2b368fc84188c4b30ae4d673d5cab3653fd2326a61630b836433bd83269127aa534ccc61e3c4db036c0c65731bc8e2ec230ce54753d2c23d0b1962229fdcc88909298dd1bd1eab894abc93234dd0336f3d292284dc9599ca1ae0cca7cfed3995aeb0b30ffe08e2f8c498bfa73caf9353be14a575707299f7ca3965d3180345d10608340285e88ce8152ca8dc1f627331f4f2d3decac6d338810191a2f91aabcca63a2eb457a8c4e34d12b267b853a4e146c5c651c9d8cc6f2f3b93e09dfefc06133e7dc5ceba10080682b3c08945f3eff49b7143c5c587b6219d0f2a8e09246ec01ceac147a5ee8417e24d2f350d85037be05f635c8caf476696282b1dbb3f718660999470e6486fbedd78a276890939f6c75bc679d64c815b3a4f8ce6c95ae1a94d741877b6cb6c33ee49d6a37b05a7b24f51ef86f6e285925fe6e64aecc2a5d04f06c0e49f16e94d62181a80edc72401901e144161b437c163c36d65699b1844db641d5f716d7356d9f02c90ac2b186adc8ddaf4d8544f2484c8af2254d3ee242db0deec9a6889ab6c9421c9c0e40d0a710da1d7d28083c82643b0facd4356e2322e71c1d5485d07263d31c33705a1453f54717a4154a39fe826cdfb96e124efecc678655d623b23eb53f2af6d41759efead8295cf9e5d5f666dee8ab320702edf7d44195f2288b3b652c7825d95859310ea5adb5f29845cf4ff2095525c2e38cbfdbd668082da620e872ea8fc61df2ee435769eb8a0646f069b975829d4d29b7e25bfe531ad43153c50e6bc18e0f28cdcec26c2deee247044cdaa1bbe23442ba7c3e41cbfb21409d95fda8bebf61cfdbfdfb36d7da9c3c90acfa49f70190c55727ed90f30ea127022290c6638dfb19d127ddec3b1541c228a48cd2463a3cd4fba8ea2c4279555f27f5506f0b62ba057acdf8adfa0a76d84e656d84a7a7be969fc0918816a09b087dd73747b673cc249e436d5db6b0664b66017a3b6f630dcdc5643b08c9a644d008fc4641348e769f01604781094637c64d064aa9ab0bedafd05a5d5b332588fe1c49a50bfc77753fe6fa4e039f3a891a92b5e75bf55098dfe6d707623c1984e291fb08631d3042aeb0a51f234ca62b3a405408df32ba118e0d36db6fac6c99e2684c51d553cf0a1ea71b50b3450b7d91f8da1ffcc15b74873cbeb9813942fb73c5cce62c7ce33771b3b2dd3378191c3100af1a1428a4064f20085137fc461351a6d3c96e3667a7b907f5300b7e9d876842a599f054ec3391983913f84b7a6d9b62724e1753dc036ca60700b93f7fc634c53d00dab13f550b99ed8208fdf71296844ba5059f40a58e6e0c9cf1b121a5c5238de481a4f9bbf1bb3095d343c77593797da55819be53dbcac020c433b6229a0175e171b2af3ca565c0fe364f4a9d277650045bc2997288b548ca8c763fe6c2fb49976b47cda7e558c0c622c6e9cb3708bff6bec6a143d9f3a97c6a3d6063212306415659e7716f3bc1caf40e4199430f7b0be452de4776ce94919197ae09ed069ae15f968e8fc4c1c28e1eda618cd355b2ee49d098986d4d2ff61cf077c52705c6353686a53330540608456b49dc2388abee37c138c2156a245de50bf419f41871e981118532947c06aa320fc2d569442bd48ba21f2014016105c587621a9cc5c3b9674b60d42115bc24eb79acef266b2cbc1a2ad701105b81f05e10e2af5059fea91d2e09cb6e9f95243310df2c8388536e727b0e651c663128b7f3fc0f03710acef226855ab23dd00b04e9796d6515e3f4bb149b0d34bc6375c12c0148ada451040378b3993bb23613f05e29c80c37e0b9e8127b96b0111a1dbc98abf5ecc3b0eb4e6c0b350b3900e44e910bba0df4274befffb0652ad15113a9da3b2d19f14bcb413d5d55364fcf84ded8049b1f24fc505e1a5d8da9f80d0fadd9dc1d83f0636006142308826e567cf54002ac3c2dbf7246e4ca4a49e79ccb1941a06e35b9b1367a56c419771f01c601e4cff2d7223dd8710467ee157ef534fc37ff5d3a80c97307e78fbb28d1b50a7628151a3a1cccd88bd1eb6f6eef90102e56a73fb52d022f7ce3a9b52179e4f5095e32775a5853e3b279c3af61f08fef5591b9bcef09cd39827a77053f2e7378912510e71eae81133bd94e3b51f0cfe1e08ef280afc1822269cac77dec64fd8ccf20f72bf5fe27d2a33b92debfcba032a159cc3a8f5a5da267848410173cfa0e302a07c93454987ac03f0e2a83652ddf1ae0eada09b581e482ba697f17acb5f4401cdd66348766f7ef3d220f60042d08060a98a82d98a07251ea94fe7c640c28e7c1543e7f3ed96cf4fc62c7ae81722bb3872ebb6c1503048521c14eb147d4ef2b26734f541a9da12e2a807149a0be02ea240e95e7038a9348d205d9e0d38926b469d95079fab8ceed8c2512d8740887744a878ccc739330b290bda3062db05b2121401ef98f6fc5a1086094abe818d14fe5b032243a465c6d92a3585a4a66daac1c3d3ee818d76a53febffdc771eb34730ebd8502fc998fd83ba5c59b97d30301d6edb9b62d0cea6d22dad94ca74ec66693b9fe03c9053c9cde179e62cf948aeb47bd195314f68e205ae2368ad3cf69256ea265794dd58d70e82cf8b50379199f9ab95d9b9218c303a3f698af690586db74638723a45623709746ea9da34359f0c60b5a0459703b210b8e1843164c6a85e0c8161784224d9dbaeb19e7e61a6d90a23e172069b0658e596392afa08df7b6f402238e187be92824aaf0c42603ca5919acb1a033bb01c1dbaf01ae5007eb567591cf1a7f753858ad58d734c73055956269d060944f93f95f4e64f248447909e3374664f8e55786f9219476109d2ab2b6ecb0d20684a6fe9c1d9f46c6962ef6b5ae6a3d781708aac1eab5060fe2d693ed60ca4a129660f0a0633f0a733c979c09c33ef17327b8239aee61c5aee56b3502718837e251b37c5441da82cdb3ea6b33fec111d0eab4a428a3f4ab4022e0fa3f91aeaadeaf7d84469f697faa2dd462f6c439cdf7d8abe1ad84f721128aeed8e31f2f639414ac0957a226580827e6c694161966da7945a0754df24b6682865b8ceade89a1c97465f6a2ec646b999c3edc583778c7dabd570466836d66a08e11d745b7ec55b4cd81927235fab546d1a9a2768b9aef23ab265841d9ee445b75e5f488a14c29f7beb7e096ad4e9407160cc6abcf648df5bbe984fddf40a7184da9adc8c49a5deafde159eaf364dde5440f6861c3c10b74370aa3d5dd1df4ca434aa441f9df954ce38a4b6f4c45f41b9aa68542d3ecd52ba5a19a235a69ac57cf97c31ddd8e0623f4aeaf983ab4d22a63c2194685ba2d304c19437face011880225f056f73d4df53761b61a251968ad745db3e5063ff9fd5ec11b76102ea897eb2d2578d9b3c36697d9fa3e7effc803a7eb6113cbb32a852eaf86b98d8b7b88ae2e796eafb89c6b040bd191a9291e82456e1b3e60624016fba01780f00306e05ebb9aece6012320bc0c431a7de63046fed16cf5ab7cf1d2cafef9c66a2de59e2ada32b62e60e4230e4efc496764a25f2cb1a20f58cfcbbce388c6c585583aff8a06a22354b0f4dc048577870c81e34f57778a2c8a98f6fb21dda5ac9c8f90eedcfa2711c42b6b465a207abc6a9b61755b58f2c58d8ac3944ee1110de3e6f057659bad03b6e40c2f107d6487dad3827eb2a0d25b735055bd0a2d96a204d5b5e8814a87e309aa0ed0265fa222b7682973f55f1654779a02581c7c2d67b950e144a3392cea3a7cfe15131925de6f22c1010af7d0e9f0ab0595d617d7eb53dd686dc240bf2d88dd0f71c0bef39879b70205a78867fb85a6c8e1b0af4299ae7e55af39f76427d88c7c8502186a25025e4a0a7ecd21b83a719263895686e91dc0f780f6e89943351a03ac836d284d8e3af218ce271c460911c3d9db529e5349f4cff6c8da84d249e749e4b314d5898a62c14a5445965eba4b4140f686aa8d76d25f2e0f75c08ba8f152b7c1395f5e142ac83de5804e5d9855abb8d36825b62af28bca1ac6783cda538056d08c8f9693d2a193432418e426c55c27422920073a72b7ad0234d02f88e3f413bba4b162a9f07427756144690c1a701cd8fd053aa807d666b920817b5d3b08f297d31fce7e0c0f75424916d1ad1f335398528897a911bf27337de92139db5710e7597e75515974948d0d37250394f6fb590379030fd6ebc412358e40588aa7909baf5c6280833313930068bd1875230ef970df0c812d54626b1f058bc5a2fb98fd9efc368c6107c2b7b2b198b797ceb28cdf3bea32d201cd256e25554a7814d8b7dfa43ee2c705625580ba37d79cfc82c8702b6da938f785fb88fcc3347fd7bd9a1919a8813b40fc1bde12c1c0bd215fee42be42010359682054f620de6a8b3b58876d626f4f1b64778f308cedd15b2b16db4aeb4b256820f94bf7442c6a65fca22e18d431d2b949d829260709a133ee19eaf9dd152a465335622e66881b437de5c86e24a3b037c0d938b8de9e2860554bf2e298b64048e838ed56346dd956993f303c16eaa07cae9aa6fb52742ddbff8b0aa7b8324d5db982d24785c7691119d95b179476b64995bae3a762087483c282a5eb2e42ec847a102622aaa1619b8ec898309b73f23ef031e56c7b26560962311432cd0f8a9f4d14ba91b2ea7ebef037270d7de03fc3733c77fb7f392eb4a58c48c0c08cb6e78bcaac8cb9ca1aa381fbf6bced928fba75a73ec8a1ea2bb6be302595637a4b4ddd54588ea68adbff9b3a1ded82937f52757dd5feb169259f3b083c9ad5a9de7873d9926a4d6633b7c6bfa1240418f791a0ec3b3ef7a5cc325c2e4b76f707ad30c8071f31d63f8115c3560d32ef00d13bcae9d1009f9f74293dafa6f8947cff672aac3fefcbe798f4c77da2eaec746095e8a8bffeab07da38a3bc85428cc16c1af02778d7d6570b289b6146f6862c11e92296a2ac15ed710194fed28404d6f258d8db63700b69756677980e9d01a537855af3192ce50e7f06e1ff5fabdcecf241bbdf3d40959262412a7a32523c10e21fca4e690c5c45db523c36148da3c68ba2944fd6903da706baa9758ab2770fbf6c4ed6ae3075a60140f4c2da6295517204c041e1a0c7abab4e53b78278489946ee4153e7e822b3acc76f74fcb05320d28b82b690e36c523df2c5386cca2e00ad0401b0614218dd1e097e234a6e2d04463036322096ccd83c4708372639fbaeb1519a031e0173dc649aaac36794d94ddaa3a1ebf781c605734240293e4339e92362b69c4f0b0ebecc74275f9b328943a51f514bfc46a0a3b9f69347c02724ae3b95ddb2d8e5c9e8f00985248b9744356e7da97a8c6a6654f5d1c7a39a29f461ffa9732c8d008dd3615d0db952a08e739b374a296d5d3f3e7be7b014761f4d4d7f7d831fd8a8f8a6d24a5c727997ea68dd4decf866ba17a7b7caa3669c82e25de044c1d51de1d9b039e5edaf51a9e8bb2af60049c84ae5246772f78f909f3d4a72cee3c0b504d1af4129b0ede86211179d781a022d0be6cece1514c7711671e6de70199fd909f915a7152657aa240007539a24ec62d67dee5986492203999a4393224301378f380b1de0b96cd7997bd9bc4679620c346384d425a57989639c1390428fa5a93e1e4b3218b2a5aac484089bfc666105a7869a1ffd5bb93b66371a77664c616c60e3315cec26456a0618f5e0a82527e271b0beb17f4c39b020ccd3f5763514e624059cf028d8b7f8d6a9af6761c6256d5be2badb5a3f5940db2ee9301749eb6b6e07f9add25bbef94a3d6a225eaabbd0b055ac257627187a804a15baecbd80b81c2a83478aad42133915a8be223944bab7cb4a0dc11fa084d82258b9aea1cb0684d1b2dfa01857a86762d769ae3ff067e8bc13dc3d1df1d602d1d945c08ec88a68a8a9f7bc1d9d664584e3372365066ca0f4fd9584a9479f0b9e4e92ac91d0a97a616656f270016a8d38574945fc5bbadf29d935b35bc7af77380b72eb93383db4f4896b92dced270f03c3b6a1af892ddedf937371a599a08cba8720971292c15186195d526917d0926b56e6afca0314517f868f007f2c9ad91dd4584585e25e7fcd38221b63822e3f8e372a277f6569ff671a20dd937b7f0729d6f04c8dbdb7d5b2049cc3a632c20faac81a7c0a25525de5086afce4adf39f37307312fffb6c1e1a356dc4b814e3ea20a63865fe18d0e9b980f4b1f4986551a456ef07d281c416a18299695bb6a41b949272c5a3125b2cebc3700d0fac5d0d0471dba76207e9e3e1429e70e249b09c2815a458300267d7c75d938847d9bf7953d6b63e1e11781a130b0e469f374ea97225452496ee8f54ad08083484ad8053408a061cc54ca67c63055bb339c28097d1c635ad35c327cf2c4ab1e00fca1fe2ad9f996ba3c864c13c08026701a4fe42a9357e3bce48d7a61cfdcad90f3742c84db18d12427482542548b11f7620c0f5f18445d0a3592a7b2fda13f3ccd1ac23e2f623661b17a25adfd32263ec5beb9b6e793b210b00ea468f9db1a7317ce48c9455f09bd954552f78cc4dba4b0278139b8e067f1f9cbdb773fbc80a064b15cb00d139ec28dd753e8003c04bab90acbe10588fced5d83d5b1b6a5718d34af3b4c76d94a6bbca78dd354cb88632f6765cd0096f104bd7ca1b31ca7227daf6da356284bbe8f2c37bca902d2e98e68b9980800a63fbac06dc1f3f289dd9fff513f4132af68bc47ca6eced0b544f768868947fa91b2ff46e0ae1f834fc1a0325ae88f2275dac06488e4406f31943c7f24b313d746ead6ccfcf701c0769a329251a99c849188b35384b7f7c97fe9ad99182bbbf8627e718ccf6fca2370868ecb04465d34367518f6c4a490321da677ef7d7587189fdc6260bb06439a4c534504c4ac61af4719d10f241da9665a7a9d09cafef4cd39c92ca0f8c966a396b6c4448d9a9967acb61d17054e78963b0d4adc95adca2e04de3b6db2e51b383455449d6796135f9da3daedacb0f0812a749c97f7e7c7eeb2e14d860950d84bec462f7dca469bd36fcc5eb2febe294311852bd57a55d1a6f6967439c00b35a629eb86cb4f09aa826d8e9531107f6bf1da58fa8c49eaafb548214d672c544775ece8bbad5c4a59e8ad3f2de39019f181dfccfb5502fbc8f5b9d92f68b855da598dc61346456a897e7856156995a559431fce1c10a0a106f4b84b8d636f181c6e4f6e87973892f7a49a855bf2c96bb92bac831d86655329b86dc1db2595da981e64e59ecadb8e73a0da066453800ed1a1f28b6682f670e7efe1d90cbaebf13b3f758695f940fb95743bb2a9d8645c9531cbb7840f0a3842bbd7ebecf474c902e803b989ec9fedee8711624477d502c9de4c2e651485cfdd01f75df7f8d302cdde937eeea3d6afe1b263a57399320f45bd837498c25c8e277072be4ee23986604c28720afff0e1861d16854a7158038cbc4a5906b79ec308acb950e2201ea9263c833076dc33a8350318dec5d4196c2ac1ad40ea01417e39b509ca04829615d97154b24e43b4721952d7846221205601f3127e44bec1e89c292f4062bb36f02aa2fde0b173270799968c99dc3d991b73a23627782a9716f5d4d59177e23387f85f2a5634d180f8c2d0a968b711df2fd7bd4f96669f9ea13c385ad7c985758a5e5abc8a2ea355fde436da083a190ce95ac1c56c6102617aa339e1058d3fef4a3e29af662556b564af0a8b4ed855cd1e2d7bbf2f7531fefb2c46f42a5309cddeeee10ded1aab3820b276406007e48b4bb13217aa484c12ffc123ad6abc090866998ff760868f8db0229904aa5616ab22c8491787b41a6022d7446169e7d0bd97bff3ee4bc9c83a5e59da6fd2451382564d1ebcd501e1ce2737ea34572be3f30fcaa8fc1574725e5d1ba561c0abd82be21d38744c89f36cfa8a7c033f23fc15300f717074f7da5ad09f5e0023ddddea25bac25af0716db5d6c97bc3b0b16ccb3c841a9f8190c1c9dc36bb45e1f2e22f8e09779bd9570f37d4e1336287f9de2f6cf64994bfdf605d3026e450db153f45d583e17eb93d3d6ecb546494bf04a48513f1d1c5715d7fcfdda6e5ce8b652603c1ff1d6928f8ca69fcedc2dbca1e2c524a90cd33866805fa6499b70930e81d004c33d599fa7c6553ff135b73bfbfc20c84c5e9e527f1f18bfc9565efb6ff34e86ad96decafdea0f86c830c0ea663a5e51f671a27c2aa1082531f8c9501a4f2d769f480f9d5b4df667f54026fef7fa4c3c0784c031d15aaa63eb9d4cd3c212c6a12e1ebadceef8dd92a4d856c34ee30fce68ba7ef0f2a15e94873635c3604d5b085b3f98c86bab8890f4f365f326e066008127c7d04f4ff3201541dbf08be5fa2b2b67af4297eec8e72814470568021152253f7504d3d6ca639b6db18430801238e5bf160200a9e655b16a7de71dfb20ce8f13b9bcaad183ed3c59029992750527e78cc71e5e50d437240a75e1b2b973997a65766dcd29301a7723a1ee55dd119d723470c551f9e064dc7413fde0ee40bcdfdcf433dceabe7b7051fe7bbc669ca0e24e03c02b51742ca3ef484625a72ffcb34b94e15e233eb0fd95c9210350d2a3565a7ab461b9e702c7264167a57c38f03213d1f76a9d1af118367be86c85ba50bd2815fc2421c26cb41f2b8c2ef5ea3075c9a0b147c492d2e150139f460d7e3bb43aebf08341c8ecacfbbafed16c5e6fa561a8ef732f0cd3ea01da0f537a1e8dca5d82abe376d64d831f01108fe9324636cf0d2412b1007d2210098da7520a47e8115b5adeb671f945e69ec2b879e87e662d8ad1826cd0142dafa56b86cbb6f2f5506050b26007ba6e130703c7e6e0f49139ab91f3fad2439ffc43337975c5f9da1d4832a1543dceedbd81cc08d2a2138ef940e25bc7449214cbb1bdcc6b3a5d47471f2030943c4566ae8346f6126f01a8ba76514d13c34431d0967cd04be447be1e6873f39aaae751a084e8614b002593bc0dc85926e4c1b4fbe33b5c97ff37aabd3b2a0a5eb5858d142f7fc669059b0199fea1ffffceb8d2a220642d343c3437ee31eb8a1a7248fda7bb384dcb20292b993ddec96fc505677d431bac95b5324337222d5f6d50ce1e028de69831b28a6a883fe471a66b993db1f84f1a71c9b9bf09f519c40564047dfc62f611b606fff97cc06616d3cd31de9f87ba012d5282ed3589e724fd0edae098ce466d02f99483a91c8bd03783f7dcedda6d7bff82a42577efda5b84d48345e1f31c1b8e83798551a8d2c1a6e838be13578f64aae9ebfbc37de04c7bc1e09003f7ba612e76eab59975c42fd4aec4f5d02df2f627261e1fe9a655bc34f8e9652c3fe30c755138ff948fd1df01bf42b841272e2f8bf278ab2c603bb20cb2728af4861d703c84ad7e4413417cad212b72eb7602982edf2a64c7148326699e680c08a3ce35beb0ea0773ff301ed65a4cf519bd63798e7704c5d7c5bdffd09149cecf8dc9b6b4aa33a71d52452de42ab50e7e2c35d9a887328a685b702b19794f4810654fa2a58c712979da7aeddb4b64cf3865c1f18a19274dc058ce1a44e7c2687b96a2fc7a7625a7f326f990126aea1015e2241537e12094de971255e23a82c7d45c337e44985a58888e33b9697b16ed48032b73a54c504919cc99083f7ba8dd93e8390d4f46910b746c78b258c3e8a2dad175a2b48185e00e072527e251f4cf4493b7430147a2226cbfc81f4f58b5da84513ebc5433e72752361ca752af19356d19ea4877240854866683862795b0d207a66e341e148ba1fb46040e5029a89dd3278d5af3154308036ce73dcce2875467e189c7aef210ccd383c5f1fa7bcb00c530ab8f9f415147c386c392c6f932a09508077549835b275b9b67a1ce178ed04f52332730e206a202b22b912088985b67c5c37b81c778beed8fe709cf3d3c2131add6c7b65758a63f6e1fff88345bb5f9cff43086d82e78e683e08aaee8935f24f212f9cef2991e2ae88142263d2a84144a1916729c061918324cfe1af791a2be8f214bfba433a46dbc00f29e2b1248e4f4985209092a526194379a00f27d564ae4b48ca212be286d02f14e9a9215e71c9fd168ca25b9323e7e3d2cc8634601ba30e8654d497013904b02b424722afdc8296a448646a3f4ba2f51669a45542cbf5791c92f92ce272685c8276d20a65c7e4356dd398e7e59ce2e0be4265ff8d70af984680c24da7d2e8d3835a05db34eb462523457286e9a00d07aec91124a6663ac43442842eb9dc0deec67b6848b9f8a142093241a591e8745bd2bedffce16507839da2466b049fe249db96ea71a6f295a9d2b8f18648a4f0c83049ee97a752f440f9e70b423341864a5bf685b4db8a8146467dc2e8c14b5af5d31b943e11829929676dd63de79f6e65296c0273df73d1bee11807f6e24cc1469a863b9d6cccc3a7b379b28ae00d810abbef7ce3963be5fb73ad983d074fb6671cd5eae2ba150ae4cf9f4f07867a942ca720e8ed38e7aecaca8012c307b4354f589091605f6410951581d6191f8c10831f22cc879b7045a32070404398b05aceaed504bd04185ce140a2cc4b6d817eb118cf68c6832c35c3d9a2d13e75dd5c38ee1c8e087e849b98d0b70d90443ccf7229798ebbead0011dbdc22645e074be5f10a909d1336a20ed998ce7c311d7ae3b6cd1039f5623b6eeb3199b086e2c2f988e136291c1a1cb2e8b2c4c6e9dbe1ddb04b5e52b12840eadeba5b5415612538a01415d562f51b83c193cc09422d363702dd9732b3538a1438c39d85c4b558eeb44bcd06535962870976ed7ecd0155cae4af777fa2e8eac3289a388dc14ea6d901211aa37b01187f6cae4195aa39020109c83d8fdfd76529774688746b4d0789b16d2ffa6e3f372c397113ee471e758734577985f99966da0946f007d2b9aa93f88ae6be158459cf2fcde0133cf17313935b532eeee3d79a711398b40b616c3a9a40f741e1107716a032243bcdcfeedd49f6b277ee715f739c218d7127e1dfe88940a113395804b3f5c7ebc66bce9b949adb391c644d00e0de3edff29b81fdd044a6ec12771f2bd9f18612c0f1f7448ebf58319abb42b5849114d0764eae4edd6206bb3fbe96c790258e4c290eb4b21a6c104d25716fc2c92a8f50e06e07254aed18654b05f6f7a9e40cae9e8b2f087f2c3e646e2335559fc304b776997357034c57d3fd47f4516e063ad7c391b0bdb22326644cadefe2d32bfd20e4ac6e082743a73ab3475715e3316de1e8f40800e8f4c37d114eabf7d7e42c78ab5c3996817024100a624a0bd8417dd046a9ecf89b0ae45e236582b96fb81981a3eeabf40c947e6beb333ac86e40a65edb4f827f5153174035f2a0393af611cce9bf62d1353e1e6f5b00352fd1401c781b9ae2696888c55fd95d29717c5058484e9943889f019f8cb77e89d182d8bc227837113930870817035f69e995e56a32918287b85a1387292fa7ee451e4bf82647d4cd631bc50e17d6763f8d6339f0434228dae19c8f01445c7487a4ae9c3c64b861997f3cf8a274c43d780b1ca832be48d545a6e7c0ccec9ebd77319d3a8f202fa33e2cb74dc4ae1df8070f24f326881a13457dea5946068496e9139418affb1153dade7706c207051a92a18eab8554ad6cbcc6412711f700859ad56b332773f08a36d54b0046a22fcfa79c0d683288018a2e6dc6988b577568e2f3504e41eaef795bd6a61b2ad0b68d08572d9d8abdf2cb7abef58f4d4cd5439905a8696a44019a8fc1a704b6bca0256f4f14d0c6bf74c2cd521c867702aa5a453dd0b7a50a7ce3fad59ab34fe65c86f8e8d1da909e4a0f47ee534857e447e3316ad78a510781f4ef86c7901df9341dbcb2a83e8264e456dbd4b8d5e1bfce31122a1499e813df9e50980b9596b99215dcc5dadac39c50679f98b4fde048161d1fe4b720ce9cdd03f13c710af19a5a9e0404f3e8186389487fd57f6b941981a37907917f89e6aae6955e439b810d17f11edecfa49d2e30ad23bf071b3b05b2b8519fb20dca4e7ad1a0fb3114a14e9b19bda31584f563f2cd4be9c5dfca6943a040908fddcba8320f174b0db4794306b8d9960225c85b7bb0373cafcb01af62b5fe83737e242726ac7dfdc1cec67fa410607a92ab29438823852eb339760b14e9e041ced71d2c668c90d080271a0ae544033f6baa20ce0df3e4feb3b9a4346589f098cc095c229d381d4e7e3497753f75d201d8c92877eaaf5815629d8640139b427b9932acd8b7ece7711a91f113992f314c65c0c59976abd5eb61b318e44063290728d6859aa0cd59b4a50e9d072dd47c9cb1e9a3b4f320b4d4f0f542933304578540468450851a84e81d59a77270fdae1cf268d1419c1f33001db2805e3bd20b68e0223488e17e77c2bd06d91f69edba284704040fefbe617c81624d10d5587e392dd03ae993a8052cdae67a65ce72e681b48d34f90ab039e24a95fe1676e89c2fe4aee9af0700ceca4425ed6784f69dccf914b5f70ba4221103f7e85ec9ed986c5874403939e61bce1a28bbfb9ae532283e9d9273722e645dcc951aaf69ce288dbcd4dde856459e0349188a50a088cf81babbc23e2b5019cbe5d4dc9579e37edece88532ee007a8a049b4a2b448d3001821ec3b21f840ab8f5cf07acdec02c18b6288deb65e0d2ea90a3a876430249e089075ad6c38b1a749a2acca92a5fb51e74c83e3dadd3ec0af27a977e8ee0eea13accf4ac43161dfc8dd6c40c40045b280029da4a1617ef213411a85d8352b2ec6363f3ad62c2347c50ebe1ca2b28f38a1a33e668886586d4117ebd9854b3c2d359a37162602cc8482a55582b63d7f3192051cc5a7055f407e14c021b2d904882e4650927be8f5fa75bcbcbdffd51695ea2529ad7984bf13c83b0a2cb5e48bb73fd7f216a6448cf93ee617148a83eb0329fc93ecddc68f116dbc155fab2e6dadd60891882d9ed5b2bbfb08b8d1adb7892f15f5df96d530d7302709707601153c7290091585efb88daac46c1c197accc3052d0d4302f80a21fb9df41549ed4167969976118abb5cdcf92c31f98bf1e861e450cd95ed6a474950eb36703184e0d11708d674a1639f01abdc47ed0c18c8c1ee6cf560b4d3f7881711faa4c738e52f84a88e0ca75be27a472c05a9528991520b2be8acc20ea11d059439094aa8429812279ac85184206201f1e6cc8c13988ae32eb5fb00dc18b2474be4c400dc9ac08fd825f360972048f20d1005c5b271bfbb41f1a831935c2b8824e3afbd30307c41717d7cbdf152f55cff91de4a2c0ecc384acef319d233251b1d05062cbee5669162dff6029da5a5bfa4825d09014660d76f5cbd93ae4dc434b4b510d1cd3f5eea10afd44e7e6d6b755c2adbae5fd4f0746e01663cac4a5bec1aabda425c92b44342d2f7760e70b29ae89d907a08e56cc3f1a67c2a74d997aed49ea1655cb51cd419bf179a051a36cddcd93b2f4f9f9cc930a21ade77e5c60c87595ab0c2a0414ea51b54e2d7db355aa96dfdcf40d7b5ea51f84f3c2fd49845e43b5e3652620441c51551f41c4b398a6bebe1a60e0f15d960e82c57a8737c23e888dd9bfc6e3df4d2bec9d1d7c63f63b184a75c74090a8a96170f858072e83fababb76a6761f0a7ac074e00ed229cd502ae6284651056031b25516da322d1ecd10ebaa91dc32509f2e5a51b1a9af31d95aec468f5565df2fbf2b1aeff73fec0551031df9f7d0c960000ac2ff8be1a98b0744fc6a1d7003291503e4bb7c5b779d1178cfc6c626f68c05418aabb5ec0594a11aa2702af25708c480709c86d7cd49d936166c13f44daf4ed9649340fea408ef67360b0f5aa0dc47252cbaf7580f14a2e200870590c199a1dbf4853adaab2baf6fe868f509908b1e1762a51d0baf2d557b7c9bceb2208dd38bbb79e7f37d79fb80fd31bc28acc41747643eb1019b6a86db711d68d3c8910c88d61a5795589ffb5ede210796a91c7e0f80809e2de2918a2edeeb92676c97eeca00c8b92745b05505cb6ed00a48ca3b8e956759820a0652f995763f711d645e1e1bd2bf1a0cb9b74c7d7dadcc1b52dccfe5f4f9827f8a6fd6f20d560c5315bfefe9b8e85a4e55607bf1a3a1a2e030d64a0676200e83167469aa41cc4fb9761d5d193d917d42a1d8b887d70ec223797ab5ebf075b41b7f2e064d60537aa912ca9ea08f7155f0215a39a1f5c42abc98e1a9307ca0267cfb3e7121885ad3a116bae41f265ce56114ad48c37c50c5c3db9cfe16168badafb5066353a7de3139ca71e29a853a52e844c9adb101cf5ebf3b3bdaff228bc295b7c3e3c53331177ee05e9a227841c53c3c0c8dcbcded8ee4e49a49f57ba06c5a40ee8db07b02914b2326833344fcf788afed50cbc1a067f1e01c1828f7e84dce2c9391dcd21d40e1d217d4c2f63bb22bb3a84127ed111a0a0ba69de3aa7e1d991229fbe54a563e7c11ca6409d1b66a28ccb1c2df9aa442cb7b0586eee4f988022d1c707899c803708d2e887091994783c3a83c44f1c753e2c572ed5c67634ee0fba08a89e2dd04bb9a90e1b91320d629db74deaae8606748c972e0801913dd48e07f0f1b394f28f85761a4e5b019405b60658d311eced2c3e88134d05149c080210b60b57b072d171a4504231845d5c0e1b8285082c380f3fad55d90a356c05fa810f32704483aa2d243534cd60db96d874f285f2e22c3bb97519a351e4554dafa4794bb10ecf26416a136b56d5708de555b8a986077d2cb5bbbbbcdc1b8c5722480dac25942f1176469992f5fde41b9b1044e956912c750a94c7c38121c56e0be7ac2862834ea0228166f740cc475f6feb829aabe2c5d60c0d1c25f44ceb062d66198696976419d6ef25d87e57e779b0c1e4aa502a80ce08d8e7674e24133dfc0e32ecc3f366c138ac248b0d1d5776be9dc79df14b4bb83bd05630bfb628466e083aa07277f414a0388ef69950b65f805815ce870bfc8de5a06463957aff703f0c6e2c5615072832c8d4a5b609bfdfc852fe814b1af370377220092063501507e892d9a7dd6fcbb03a7e23b662fdc4408b5c2659a43bea1d033612a8d6a141cf812d5a80118a253c1da6b72c0408c68f160213bc350aa8c523f810249760790a2e9de878101826ae7e5595ebd60a7442b2387fc9a3fafd4b177f6c8e471c5be61d666c37038255297890dd60786bd24f2f3e786ba6390a677ca547d041252c6aa11df9e75f375af9167da046afe10b44982b4fb642e6a5ccd99a25c1541677800458901c9c2d621d4ffd1fd6bc8bf6044840f302c7ced927f21756eb350a34b90a00d2cbd1138df9a0adac2e8ccbca801df91b6685ccf731fc3320ef7b77aa092655adf3bdebca4a83f610cd78c6079aacfbc47879b206e9bbd1a76078c8e38d24386dcf77143f321d807e537a712438f852976669294d694349b4a81d83b110d6e476b73eab42bfccea124e8332da642abc5acce856cceeb70265a657e81091efa1a82e87f3edba8155c769e9f58f370f07c32bd1d0642ce5c04c3175ec168a5a078a733ad383d648e498d1e537a3446307571b0e823ba6685f5cfe6403bd7eb72a8f552a1c1954e7e3b539d48dc70a7634a2c7f6d6a9dde4786e954b667cb4b3b1b54e612c9f814ec8f92f22003f04578e4cf1eed76b95f7963359209665714275307fbdd8ea9facec4879c94409d6c3fc43eccadaa64ed709c1e97c86eb4881ab50ea1d407ceede52b100391634e8b470e79af22aa373f934fe8ada880cf262599619cb42ca9ffefe2c4ed0c5a253acead6ff67bbee144a2e73bac948dc44dcc717db43a59c8c0e353a8fe030fd95d8f4a8168743ac1c5fef00173956b0d740245e8fffd3bf54e441bf077ace12e58015d0215f65bdf8a7ad52789bf7340e8d4afb9a77967a98879f5eaba5c7341e5efa16d398402d793d6eac10c7ba23d753dde9205c50ea5d4054c8de15d0cfa6116c62472b2f7043fd25bf4156e57b9ec83461d9ec626dc3932743164ee5555a036e611a2b299ed3748c664e468ed79389a90547902e3fa74c122b6594494c8afbd33df14833e5de8d6583590a59c1dbf1c3de4b94e527a3a51ca3d09e36a245f381b267445700470db34daeff6731380d40febacb127197ef24003207002363fa5f2f01d2f3b1eb486bc457845cba9158bcd6458f2957392e13f026b9856746f6de79838281c5a517eb0dea0d1a3d5a403e244b2ae1379c3b105be69d266302557c8253c2974bbfe5460d41ca339a9d3f18f6cbf191ffd22f7b1c75559d5fee7f270a7cc5b9c4f6a2f5f9083924bf7ad168b6bd32bd4c14aaea1e1ee7547d957728890ca3797f8a5f7e5a2ef0cbdc551f6645cb464fd1937b79c3d9fa643df8e5f03f600cf4a144a4c5fe1f4ed7524916f1fa8244b7bf4ad677d4839ce000d77188c2fbf414d055e725b431560d911daa2f4c074e433bc2acc4a9c7ae7517944e0e7bc6842fcabe7ac08549d0517ab4c4a1063010dba5cb2724636808c629eaccd1d1f5a5b0840254e426709d3e028d44b9091c8c638e55e9d818f0f81bacd76baf6e0abd6cb07db6ee048d3c692b5e73a89a770d850cbf344228fafbdb98f8b04cece277db206b29e99782c34a8acc99a1e20c8e7f266f6be81866796885762e77c5b1f6b95338ed095b82073c76e40b197e7ac02f954d370cebff4143083424d4caecb6ad40887986b133f3cfb2cc0a313532c44f05948f37665388f08f4beea5ec0b8434a2bec553b5fe3fa4050d07770b5af2383afd97d0f9a32d1935f19f5cf46e2acbaa896ede21a4b71b4b08f2c5c7a321790e43fa9f682beea0fb6342c0e8eda9754fc65124fbda8c9a8456396e941993cd4f839434a12086dad93c5235889d0d1234ba6d05017cb3307163a12b185a2859abfce18779a8bb940834e7adc4f56aa4cc0d514b4c31aed5c272bd68789bf62ea315640c578b7db6dc795e986ccad672cb26df4ca7200634fe6b6a29fdfb87ed512e2e24ed41b60de416c0e22325a6e554cc2fc8919bac0b04c008557212b082ca4e14fb4d5a4d7a8f6a8074d6b1f1071d553872ae6b459edb30e41109be186f9b26fed144bdb3b949f51599e1c76aa706a273bd5424316b41c777da768a40ab924692431dc398aa16317110cd332bf1b7a7b0160062b9bf390d0a83cda5e081547c3687ea90fcb1122f1ec5cd40682ce8a0b9a67bcfe41299d66cf0298928be2e09fe6becd4c28ef688326dd982264a75cc08cfb1e5ffd7a51ddc47b6390e6827c003b5ed12e43e683580b1f28ae86b55641c706aa77bf11a59865d6edb87d33fe226e03230cfc78188294203783ddbeb9db165e82042f4790b56844e674b046d557331514030175799c9b3412075052bb3123c964c2dfcd884f7bf0b83512f0a65ed7eadab8dda951475bc4ec9f754534dfe1cf7591563daa6bb11cde86d13a8e39c4407cce5bf6ca75eccc814cd6476a619b29d5c838cab2bd2ebdce53ae912e9582f029899be4ca855f486f9fcf52521b13072adc2a38a39aee14162c9830189197027b8c0ab49baff2ae0513e81deeb1859c89cd7b545f7a234e6168f467d8f748bcc40ec465a15773dcc3502540d225a2e11afa3c8bf3e11748e910c7451acaa1df33270cf0557cb67241099b210bd8e929c2fb98f58949409bd8e6a4e5b70de5f59751c72c0930dd808d9a4e141d12dfe4c153d063d9add62a69c0542d70cf856ac2804a66abf69ad0546a047d9f5d119876e0b56f6e781e64b523da7eb54d2f64c03edb82982b3edd4119bab2ec6612e8046b66d6d0890a096589a5c3ac7cc74eaa2d6fa45d08db5ed63bf1f5e1e71209d9194a1596ca688db67253bc6d1d8a1d100e1d35d0ea402734c554a8e0932fc8829b79689b51897a46924e66f0281951fc959a0bbde0a18910a2c11b220d57233bc2b9e2c88abe724d7a4003848103ff96f32900e72962f88d67b88730fcc8b891d354b136bb1383030b84a81603b5dd08253e5a0ca3f4cef30f94ff3ba185b6a87a4b6c7eb716dc74b4053d1f0d76624aee714b3ed7f62b6367970f91313751ba2dc4de281f867e0694b23da1b0dfda8758f94b9932765e6914c15048ac1c6a1c348d79cb567b3696138bfb52c482ca27aa80b984cc134e48cd8755e117cccf7636637c7b703a9e4a3d1fddffa296697abd8f3a64ade1aabef501d50dde7b85471aca728ca91fcb8ac47c42fb0975d82792adfabb49e2c7adf4b5209dc15d64ea3d7f89ec3b188803ef6b3bfa1aeae97f3e52b440bb4d7f4225384b32becc05b3959cec208b820568cf3e0432387ccf6ca7bba93e0aad2abf10e827a9742d67cb5a200a564d03f7f08519761a28315705a37bb908e02466daa58e07501928d1b6d17b3a088394044746f888a6211957f5d24ff17c6cf28c33657cb57ee2cfa482389854e02bbc5600f9c08cee70497873f7b230fef1297544edac2baf5136bb6c6b14f9739098b4b6e9c5d1987006e254b7d8b438cc47d8c2381f6172503e77620f6c9d3ccc0318c20232d37702f796b1c186bae211932e48f363af9a418d9bd784c359f406cbf224ff78d2eab206171c222c0fe8293b805c0741024369bb2309b9abfbd02524f90bab884fbdcb4fad06cc01e82d0587a4bd8d71fc43851057094c68fa0ec101e1c384fe10346e0247e1d3c5f23d5bd7a1d281bc3fc21af819f2a8d9fbf1d01e77c83154ccdcd46eafb2762396c632dad173a3c5b1ccbe7fbf824f8c67e879acbe2a73fa40b74c061a03b3eb8958195aa6c4907baa96ddd50954079aad2b6302c0c4a49572403cf6974b6da63973ae4a0de3ef138e15cd7acee0a2eb5a764defeb47c9c2f518c6a5aca754c9c61119caf9897a84474d0f20f7e0f447ed22f0a102b8f54bbb97489a6ffe6d5f937b1a0290def42359337cb12c5437f6a9d62a7493cb6c86dc6a56b6bfd88fcb92af3df8a68acf8b39a156275065a6d41941e45f0b95c4c31d2317b84a4818ba007b72e72885d4344caafdb376042e902f075cc0a831c3df9696120c41322113e2d41f2c7869b082295585910ecd8e22647dac386d6dfb9a2086c06c838fefeff1650df395c9898a257bf293e57fd464c696aa36c91fe3cf94f74c24eae1741f2795540ff8951af22c540491284ad9962df2af344c31c1900bd76bf54c5c344772238f18f5f950bb46169803c668e578b2f3ec9a8126b1d0e6fd89ad5393f9ce026d44a169362b1a4c6e3976cd0c29308cb7ed26166c0263dbf0a3b66aade3c0a9d05e27be6ab5e7ba3fd7d145e1575e5b4cafefd123ef8e4df8a84d1ee8e82cb26d2ce7d4b245fd9969e2ee4d017f90bd48433ebf536914403ee313b4723692a06165ea4c6756d059d7607a168585526a91620c8619c91883a793819eb89089f5b3163345a44c5a6111b57f7249f449bcc355f843e42c25d49677e14112c3300e994fa672ece66c7b8b5ba776bd27b2e887c6abcb98b167b9d1bb57d21109e613848e2997cdef6c8b426bf1a469ab51fa124c1b3b444aee2977401aaa3831a92943a4371e1af63574a47089ae3f051059fa4149d82ec01af1c6eb0420af2de9b287e714a7d2c6dab73a260c8b338c4ea57778ccbde8ff63d3304628aba80c7049f6c22abbd903945731526892299ec983c5bf9d05e1aa3e29ab452270c26d8796fc2a1eee39c435534d48cc12606154c5d3faf6c1245fb1f44ce8f82ebc77eca75fdcb45d3f8c628d27ef34aa01bbea9e6bd92606e6526d2a5bc0f998bd7e41485364b7ebd0ccc21b94875346eb08cf0612710210778031054ac43419d358bb3f6a219630e48c34c39fe61b3f338d80cd6e71e0a68ecb9699780105696863d2f7f9757e859bab2419817113aa5a7b6eb358be99be5b7ef1d9e02742f00888e9a278abdc89a8cc9a01a0821892c20566f7389781ba77b405c0b5ad8c13c0a1bbb100db9828a1f71bee0cf91094cdbbc06b305467772d4e867e3400f47682600344d80fda4689cf1918c6d3928b40e6be249d06319954830d0b18c28bbbe4322d18805572bb7ba3b8288ec13b89dfc635638d2acf6f09e824d11541c69a2077bb75951aa18ca7b9f7afa5c06a15141d136ec121f0e897c36ff015a1a9986c15b4d5d4d877adf7c56edc5cee0687f4d794b788ec98a1ee88df9b91a642a58a16284bc0d1db2c820aae5e553905870da05f01259177ca4456bf10a687beb77fc907bbfcf02b26f36f5806f97652018f30b6d8faf273ce1ebf3e8bb28ac7002acba6780ad9c4eac13f4126bd31895e57dba5e195e75659607006cae202993b72f8a0de753ee9ded022c2ceb9eec8c684e655186bc2160464d45a9b28bc6000d92549ee3043e4e74d80e627e114fdaf402de97e8256f05c90f7683ec6b542c519e9e50728aa39fe83593e8eb0dd782a0c0c0f0c0e7c8e9ad02d3b20c1b0976d656cd52d25d297060946ff3d8a9ea52c2e455067c62329ea8b83b7390c00900d4c6a1e1978b112cee65b49595ed4448771c40b80add4ccd05a55a578b64eea3d5d01188ed080b1c0f456ac6d0362e6ec2d20d58fa596883e9f7cb922a25f76a8b0fc63220895c2f11a06072441b1f0b2e700cfb6262f8c4c8b5822fff50db10586e1c5c12c2bfcfe4529658b0841f7121d4e48230fbcd08965777c00851085493daa01260dd3cbdfb4e37feb3ae047c3e7d7f611f876c08fd04fd84603cee07b90d55ec5acbd3d2bd7107e36a528e477713b45bb02eacc2b2adf0a3cffb760989d166c6c5dc96c338a15e8974a376a37643bb59d38d810c2d61e181d3c2513c958c58261a783e7ce67b7b74a1ff4ab2513f921860879eda01e785ca08841a1048248a4913de9e41f798ae97c3543a71c29229c87e9cdbd6d9f47ac30716a2b65be8f727dd28dd906e926e9072b320a2499aef0d46730b26a0379c976066f3c88e3bf3b0467dae8ee8bce4710fcd87db95cab8b1891b20541b16c4a6a82c6855b7771f4f3676ff21c060c61b67abfac975e7250aa4ccf965291e6e2846301a0eef7b1a477f599f0eea79d422cb57b20ebddae6085ccb07ca06c7100f5efe77f6ffb22091efc726e6a91bff5b8d3f1d2437aaffce6ab625d6985dcf6a8997a58d694cd5e9feefcb9f746aca8929598055453f2fe52d22adb8d396dc6cf6c23385b9064c12d98d4d436002e16dcc4ed37d3af9c4643422b15b7943352042fceb75a324e13429264b26be76c43a38257efbde2e9fee310d07bf58ffe94f1ff165415917004bcb19bb15aeaabc81ce749512c224bd112188337187fc4b0f02ed90ee3543f946d1d752024129de6dcf6ce770503148a137a2d8a2f285a1be88b1e95cc765d0384e61685e3e6f72dbbfd9b53ae29945e5ceaa6dd7d63f8e4131118b02f486394073ac188b0203d401bf6b2e71852b3b84b76575f8e9fb3870aae6a5005f704cf425bc3546deeabd639332b283f5b2eefaaf5e3bf31cd92b28d03de087d4390626a6ba36bd23b122e0bfab6dd616ffece53a0b42a498a06bb38cb418aa96cfa0310d019a989606c313f5fae043f2b84959ed7733b18b1fadebc406b011b48f68aa91e261ea6b4a8b6f05aa6e426d1c930da632ebd7ba9917e0ca419100529fdacbf62790b87fd3484c2959fd2fe73eff66a52f7536bbccffbd8c4ff7856d2ee3335b09633f53103b1d85f572f14183a2b74d15d23c283876cd8699dbc3898e23f2ef097405aeb1ab76d408a5967be25fe824b4da3ca87762f76fce93f40f3211d08fc5df84f76f7b29ee759851e7771706bb3b69749682c3120a1bf5fd07f10532ee1066196202772cd91424df135d2b11d4aaa76994da272632a63dc7c36395f70498aa5e026c6e1046924a1f713d4953473754bce023183e1457b02cfc4836dba2a1cdd3106645fe5d137be86ee6c487702e5842e020854a42ec8e933cb1e5216f37ced81d4c8364b6609a75137dcc7f488dddd3a5924a65588aa2305becd201bd4997d6d6beb6566997878701fbda4d3ae7dd4cbacd3540170ba1a8f830e6a0d21884b04afeccb0eebddda385083e7dfdced2a27099e41c6e629880fd4855c147b96ce7b284e2fd061bb38f446bb100052f4c0fed281e67bd93d891880fbf3311d2c00ee122b25858a8f2cbb0a00e547b0a66e203ca911c63151493a7b72977a487bcfc7ae920fdc7f307be5ed0bc95bae14f37b659f6241ab2f537f1055e91a7bbe196cd5b9bcc80c1e90bff303038bf64b0905484d30291b61050b79d94046f8e3e9557d2d108d94427e89db76a5c81ce88230eac972e58637db70a7a60c296a2e4df988c718b11bbf0127cd59b5d6b1023c8059d45e70956422ecf2925362cde2348445c843e7789dd54d4e2fe8b3843d505939184e9b4f3e8de392714ddb66de038dae367a8d088c4ebffab394bf822a9a6f674a897a7e96e0105353f3e11473e19cd733b19c99c38e208d8c9ce50bf224851e65a89719bc7d6bd163971a1184290534743f645c9ca1826559c042a98020affdb2cc90c937aa77bce68431f43979bb49ce35bbf12e5af099087b5a4f3695c833b40684bb36dfca3e0fe709b59ee17ee87e146b5f913417ccf20d71ddf70e3a4d94d7edb1c49e6c989eee7551b652eb7c0c6f3b23f45db576f2cd39f23eddb775d9bc3a33dadb54e30c4411bffab5a674ff09abb3eadc2d9da3b4d2ec3bac5b46f72cbc25976ed6a24e86d9624837b5c612a56a15c0aecf105c08da3d8b4cba303c7ad8b86952c2004621d80550d09d3c32fe0a4b5944eaa53d8223a3b4c70db911a9be5f62ac5c2d4fe382845255731c002a369d5c7260b8ccce314c04c48a803e5fc06ba5d0620ebf38009249cbcc9269812ed81f18406f58156dbb246ba6af1276f15b5df3691869c03806c41edef31c10e8c88d8d15057d01ca2b0c2c080779ba3650958dc230d3d06c2639278f73517f2fd80eea15bfbbf278ecc9aeb856bd733486f48592df8171a4ecc2def15e2750b4f67a06c23741a8f0e837f1d3ace59f981e76e380989dca8bc00ec8b25c566b14902e8ff6c491646ba9b39ddb73da544f51f656d51f82553c0439e161db030f5463369512e10c96f8d9aa79addedaa3f00cc0e09b88120f7eedb7479254d1ca03145552c2561050dbf9b2e9feca3169aaaa05ce3b12c6e7a897cc35b0ae958163daef964806239fe843418208e45acc35671073df9e3f47184db56d415f062bb29e358222ad6151037900f361dc86144b6eb6394cbfed3497a82f7b553f416d4966b252f449ae5ac4890282d88d97f3875db8146ca95e865cacaca4deff4aa26af1df2d9dba4c77a932be465edc20d64f383f96f2457f2c55bc67c77b5b972c336cba6299e8408fb511e34e68121327fae24882d754a9cba2c31d58022e7aa23bf408ede34b763bd2e306158925091cc04004793eaa8c6c9057b8e38a79e344d604ce62b48f657947a5fc5e0878136564ca4264a6fde54d3d01be8fb1ad67401a717b52d9ea112d84772b6914d8a2269216de2d38acfa933986c618794610d8c1202a0af1545ce6a026a8fa00bc4bd0bd82f7ee8e16a024cb305cbfd7a10ed1073e5730dcebfb51a295b10314b9d687544ee78c25501eb00f802226d61548afa4ff56c235a2ac3c924b5a0ba707caf07575fb1a8f32695f50e829314c37c3bd8fecf3b4be539de7b1ebafef2f25cc25e73336b75965fbd019cb66de693a330935724384500e5b18477d468ab9afe41f1218c3b623a1b4256385050471067a0a26480f7563920bd7c41a75fcb723f182fbcd21f7d502aeb54d31a1cabc2c30dcbcec7ea58409f5176dca29a540b6b430e8fa28a8f24f03f352dc0c221fea681165da6dd61302463824c711e79b46134c71630954412900b2a92934a0e013ce0e1848f07e717dffe390db9bdae60154401c5ba8e0370b68b1782567aef157090daad1b671215ff3eddd8f44d68a979bc0ed66f51975bc39a7efd1615f77dd230b7a861cbadb58a489900b08f292a921e9b7aec49a4270f5cf2641ba4d0b09389bb1cb29a63a66331cd54ee49a097dec7c22e0b9f8097da269603d8ab2f32f7543d88534b3a534e1c1dc791a9c78017959413fba37c8761998763ec3fb2f5beef60dbe184599436cf74aaf1a4f88b142cd35ce667ef2688f07aa6d6d6c45b03ca738f9646dc8d4433c2bdac1bf3e3e3f70235ade11ead2de0789cd3631b913c85b8303a3a6aeb79644552041a4a713b79ffafdc710c95a3faa90495a3cf08b35a0d4047b5ab0f2476209b65ffb39219b1d95e1f9a39b54d8fc88138bf169fe3c5315135e48d4f242d45ab4f8e7119030f3f163dc3192fc4def918101a689e4e16438c1f8d770eaf6aa2f2fc4da2359030a6c2ebabc3478b3cf12acdaa7dea79b663015931204062882e913e7da22875448c78961afa0f2245cc05898e5550e4b8b5acf739cf65c66c931dbe0fee6293659642e29983008de02937e25d505eb55459ebc01bd3fda8ae42b9442fbff27480af3c57d3f46f275144b55bdf59321cc1c71f6175004c5e010636158670dfd13fddd89ed48954a62f44b1252b9f11fdbc2568b682d1759c08feadca0a674f579b3030c004014ac58c9388609a14975d41f7ae59e1204972335ef49355314b244e6c235fed551556cc9c9b177803742a8dad980a965746e5509b1c140ff23182ccafdf1a202d26f65d06a943cc057213e067cf242096e52cd0620e773e2276ba1d010c24ca5090a84a4894cf829c7f8018e6d2b9bd1eeaff66f44fd3cc5a45c5591135e5b49881a428fe556122643b0140df689554ca31c978533a41013dcb37c8eaa22809249a797b22455173620f713ee851ffea8de767b42b99b1a20afbcbdf64a0f51bf9b0ceb7137ff0e8f2e814750f216acc9a69bc691f59787610da92ab5563683bf91ee33565940aba8bd7c82b793c41ede6fb3ed0b20f31942e68cd4c2b70cb2b10ebfdf6f6faf212857534f134db40f4c61731c720f99acec19b4b5a0b9d78aabd38821ff4c7deaae3f8c8eebee7d127ffe6d13c8085a62d8cd88ce06fb4d080fc45d6faa892f243c17f61d537b85210678d0215fe6fb5cf3c5be6fbc3642d7877d1e6f4f77389bf2b3db38051e29ceed220ce761a0f7026e954c076a469d2cad9b079fbd014e7825c0bd9844d32a6240052a21c3dfa5c8a2c07f2fe961f5f648beadf6fbab58d145fd1fc7fc49e0f56009e4466011bd31aace5e71722e2f1c95baaf4abe39c4aa19b5e8627556e23c703a6c7bc3f538e1aea52c8e602fcca8f8051c239fdc6a5c2bee0c501ee60cd53c8441b251c1fbbbaf3a8b849e9ad7f0410dfa5dbf3320143c8f817a2fde587be39801150d54d1cb3abcf15e90fa6d9736be228dc8b2b31833d7d37fea27da7e9521d8ebbde7162d3c08c4a62134ef33531b04f9c0b0afbff0c187422d04f224e37b467f123e3c47d964ee173915622d9c2ac3f19f9e88c3854a0a2f6ed8d41d312d43716092bc0fea2cefd8534992a09ac03615589a8aa333d53a66032c4b24b503f4202bec3896e3ba0b257b4213704ed41c7464e1a12e61efdf6ddd10f6428787097f8610f4e93745ddf7047306042666a6bdc787ea2f3cab6f7d170a37477cc465e8f4696a72b3834eb0f240e450e64c9a56b2dca52ae332b1d2a33b4ec03e69647b68d7ff361a643411f811d936d95302aa99da71a193a0dc4bc9150413a89a995c4cee4fed9b3059a5b94460a6d1715bdb442e1bc66923c7be53d22d732f44fd7a5e0aa2e43dd8616ea0036070c99fe9447713c5dbf55134214593b9f038ae39b41fa390da49eeb1e5f5aed74f0de35a83af1ff8bdb7cc2d29214084ea0026348839480bd3098610437461880fa5ba643185c8ae7158b7345600572f4ffa86f543bc4900b8dd7151fea4090cb717629c5428c4395cb461b924521027de88c1ca727fafe47ce394b904acbf6363d453dc62681bf08bf02f15a3fe127ffdc97944b2852631a63d751429b6c9d94026d84e4d61c4e7feb87b6184f3102623026f71b905ecc831b0fa041780fb318388d2cb4cdc11f39f6299254fef5bb2987567c2515e20612b9865f5ad466258b712e76578347b2589d51d9a730c460e6d827ff65ccf891ed15fe9fb94125b7d4d30f4a77ae1f28450681f591b76d277ba6f863d1d3bd3b453a3e7723c8daee8e721f03026e34ffa123a7f7fce470dca35af4f75c8624d8165d4fcc05fed75fb6aaa008819c714732ce751b843565fb2b8a371fbecde1dd6caf437f7e3fb8e5c39f7173c67563df00b2c33dc2099a95d8cca0957e6c00ed47d37f7b4af93529d167a0831097930bfc16121670edf3eb3c89a2368e875655c3c603d8a160fcfa4f7da3f11ee50eb2d119fffc2163ab5cd016b955309aa1b6e3b6f341745fb82d6da014a0380ceef6e238e6f51aae04e4b683abf5ed74176edbaab4d5f62f9d6da55cac105e472126b5514f9cb7ad985b9a84705525dff7673ecba7d56555f3c70f3710c9c539f8cb736ba268dbcffbf0fd5c7a56f30036973163d2b9dad050ef22eb6cfb47e92917160f59dddad11e95d8a3658374136f8612cf14e54afe6f0697a35e9dfc9d7232b5c24a2ed03e5a0c0e125e4746399a014327ae6481a91b7331669cf9b7ed89be7a539038331873583f896ffba7a31e2072189ebfe4a2dd99c58f4ec14e95b179c641fe07bec49499ceb03bda9927ec071f22092adae04fc5190e9ef39513d88828d1a019812b91978d7684a0d880c8caa6acdebd2350aac56a8b52727faaaf96f4a2c6e79bb3d438855367afda7449cabc1bfc89640ed1d5cc1772eed88b1ff029a684913622631b3b2f4f8c3e07019f02c2d3ac485f5c51d4b69a5e9672aa403d5d24cf52118d8755679fca9c9b7d40357a07c6c4d116e1e2b8e1f147f1d8a48078da1214fcf851c02b427f2a12fbc008b9faaa2c8fbbf8fe41197bb479222252a6c5e9feab3af68ef7e9c12a80ada69d9bbbfc59c4bed15f61ad54f77e50f5cb1b7261fc2fb5d8007d315aef754c8e3bfd7f50c786fe55588903ae6025979b785f775322d48a109929a3970843dec64faf310b688d19f37da7f3dfb66315c05de16087eaba89ee2a64bcfead448c42e13e55d37f0d19a0f88e9f510cf73f35626d401f4483ef94928bcccfb8933ac050054ac681c27f95c3773c28a8f1c74cb73fa3889870bc1af9b8b04d6aa47dcd3b4df02cd43edaba2f10cd45ab5c152e3ee999754df1bbbac0547470692ef475d7323ec5356690be88f5642da4f6c6d90454019c0605de74c4720e56209adda8030122ded051eb61ca47c9c7dd8fb72f557bd6d8adb3d36033e6b9468d48742b6dee94a6ad1a19544551aaad4460e25f7917974a4e4aae5d8a287e93bb896bab51bcfd097490c5b67b6fd964efbda54c3205020f040e330e7f03c86f90fe26266c0da015306d2e30fd7cf3f8368abe0d202de228fafd23e89496225ea6668da24f647bb733cb98478fcc378230cd37c2e400d7cfaa1d343132e1e9a85caa243a87becad53a6dadb5ef39cabe2a89f694189b60ca04a63fc5f6e90627868ccf4870d39f4bbfdcf7ae948ee448dba1381a4dd38a38f4e08e81041f928e04b372be841444192ef2fdb6c89dac491be54f69ad43809fdf95ce5a47c7cfef8dfab44e0e3fbf392a6b9d1d3fbf3b1a6b1dfcf3dba3b0d661fdfc16615101707c39684febe8b0c31680ba5a67c707f883b65a870790300143add30308d101a28f9fdfa35aebecf0f37b0c6a1d03fcfc96016a9d1f3fbf493fadc3c32c4d5aebf43067e6ac750e305f4c9fd641c0a499b2d6013261cc58eb04f9f96d82b58e0f3fbf6b5ead93809fdf363dad23e4e7f7c9d53a0af8f97dd36a9d1f7e7ee3cca1d659c08c31a750eb003165cc596b1d06fcfcfe19d43a0df8f97d2750eb38609273feb4ce033c068f01023fbf67cc59eb44e0a70c3e7d6698b2d609e2e7370d33d63a13f8f98d9ab0d6a1c04f4ff97cb54e057e7ed7307b5ac7023fbf6d98aed6b9c0cf1bfc060cfcfcce29d200f040eb0cf9f94d6348eb68e0e7778d205a27ff543910ad23c4cfef0000699d217edaf0d13a1bf87983ee681d0efc6422801e0138295f65afa8e0c0f1385aa7033fbf46eb78e0e7a35a87889fffad43e427971ec09b5aa7889fdf3a3fb68e113f67efb5ce077e7ee3f0f3ed1177e2a604f074dc0f2887fbfdecb81f0ddf6fc6ba9f4f01ee27d3e17eb19dfbc178dcefd5e37e3d3eeee7dae17e2d035cd1d08f2b12fac1c315d57ab8a2a0035c111002aee807c815d1825cd1cc872bf249c015c9845c514c015704fbe18a5e0bb8a21e20aec8c5802b6a35e07a430eb89ed003ae5783c0f58222703d20095cef2788ebd12670bd1905aee75381ebc92c70bdd805ae07c3c0f55e19b85ecf90ebb93470bd96987cbba1cec9590821c4104324d900076e07d481dbfd78e07634226e3753e262d2e3e4050546e4763e45dc4e66c4ed621fb81d8c8a13506889c97c66734e8fd55e5292fe386a3e8da24bcf76c9f199d2b2743996b6e87ca6b327ba349db00ce033f569a2cb8fe10a954de912654395d5671a63a2cb1a36a2e08635e912478e4679d397125dee28005d02f78d7e9a44973e7e34aa6df45324ba049200ca1380cfb4b545974038a00bd5671fc2a2cb202aa0458dcf2e74459743841843e3b3d7ace8d203458401c0679fa2cb22236894e7f46c25f972c367ff89a2cbe952d2c586cf4ecbd2e5ec61b2a586cf3e7ba2cbf9728225f5d97d9ae872c2a05c417d76d9942e678c4a151a3e7bac9c32271ae53d43bf37e972fa4c28fc890cae44977336b5f812b867f47b125d4e1a974679c7d0ef4874397fbc380ff9d95b5b743981a8e8e27e9e4358743983c068f19fa7d0155dce9a9831b86b56743985b2689477d0145dcea1c94515389f2790145d7a2bc9979bcff3278a2edda5a4cba465e9d27b986cb1f93c674f74e92f27586a3e4f9f26ba74189446794fd9942e3d46a50aee3c634c74e93227a2d07c9e4dba741f9f4a74e9b3762d7309dc33fd33892eddfbf344a24bfff1d228ef1074e9405434ca89e8d283b206baf49a984679cd853c8b3096015dfa9073d12807fb8374495b49be843b74495d4a1af5b969b48749a3bc1b4097f4e50407dc3828941ba24f754963541a456f9754d65034ca6bbaa43e8e7a2d33259d552e6049698e6a9dedfbbd23dedf1ef1fe39ee173482e0fd4b20787f9dfb019974bcff49c7fb0fe07e3f9fc3fbc790c3fbe3b81f0db5e3fd6dd8f1feabfbcd6ae0f7b781dfbfbc9f0f0ed6fbe760bdbf00ee27db5180f72f4001deffc6fd623e7478ff1f3abcbf8dfbc180ecbc7f0276de3f00f77b01c1e3fd1dc0e3fd55f7eb09a2c7fb57a0c7fbd7b89f6b888ff717c2c7b73cb0c3fb17b1c3fb03e08a863ac7bf8801de7f040678ff9c2b126afd48f2e3fd6fb8a29a8b07253cbcbf0d5714d4d303931edebf862b027a1dc0c901de3f75453f30044041c0fba3ae88160342058868260be24410918f8f0f50f8f0fe325c916c968004886234215c84bc7f0c5704fb51801705bc3f79452fa01fa8f8e1fdef15f5042d00cc02deffafc85503420c10ef2fe38a5a420c60c0fbc7b8ded01c6a4003de1fe77a422d072471c0fbdf5cafe67a809207bcffe97a413d10600281f7b7b91ed02b024e22f0fe35d7fb8149008a04dedf743d5a2c082a41bc3f8cebcd6413706202ef4f733d1f1f0a404181f77f713dd9ac025a2af0fe33d78bd12cc0c5020ffbb980970b782f200c508181f797b95e4f5006c064e0fdc7ebb96a4386bcffe87aaddb85fee0ed843ac7dfde6e280b0d6820e72442b4845032846b886e26ba1dadfbe96e07c464033d1b70c2811707a07400d6012a1e8879e0fdb9dbc16e17eb1cd9ed7c9c20020a225a8ae062848c081f22b322de9f1af13dfcd881006fc4c4264711e06d6d9f042000eece21c077b84300232e9159c4cd222237cb1071738d076ebe1db839c5819b551bb8790043dcdc5984b8b9a3c837b7141ab8b9a71872735b91819bfb0a0cdcdc585ce0e6de224f242a70f34c8202374f252670f36c12c4cd930909dc3ca744e0e6d904046e9e4f3ce0e69925cf281a70f394820137cf2980b8795ab1809be7153fdc3cb150c0cd730b21373b1209b8d993f0e1665722c8cdde04c8cdce04026ef62907b8d99be8e1667f82879b3d4bf6280c70b34bb1c3cd3e45762b7adcec57f0b8d9b1d8b9d9b7c8148902dc4c9360dd4c95c8b4c98e9b291339dc4ca764da04086ea64f1c7133cd4280eb578c937649bd34ca6de914830d367214e047026acc015d562a41780584286204f5274997d58bcbcb0aa4a4cb4a450d62d2650553735285a07459b3a84354baac5cc8bcdc5a4e74b925d95c5074b929d97ab474b931d95e5c7ebcdc60ee658b51d1e546659381d97c5ccc36cba2cb4dcb1cf272a34d2ebadcb86c3f49badcbcb8bcdc80946c41ce64ab39e9721303f3721382b20d51e15aee04e782a24b4e490fc7847b71f9f19283b9172e4645971c95202f3919982e3927381f315d7250b89097dcccb3e892d3e2435e7234e782fb49c201715470414cbae4c0bcbce46a4ebae4c4704250bae4b2e086a874c971d172c2c7cbcee55074d929e999975d8f6be9b26342694eb978a975db38aeeb3c4f24fa3e6b41300c4571341a47191912a9549a9979f1828606060c93a9a6c6c6e674bab9c1c1891143868cff7b4932861866cc9041861966a08106142a95aaa1061b6cb8e1869c1c000080068d1a35542a2e01f8f16203888a1b41606a62562b1c03d0c981038e01e8e4c0e167c8637e45392a8747d5a84177bcad200d8398682a8737d1948eb7db5637b0cee03c710e9f27d6f1960bb9193a7a984c8ed2f135ec51f18eb71cb8853c66e7e4f0b37374fc16f6d8f08eb71dc88540784c90c3eb7813783495c37b34a5e3b9b0078777bcf5c02edc01757c17f6e8404f240a79e067fd17f6f8401bf6c0cf7a1bf6c8e175f0c8e175bc05a7d3ae3a743cebe6f0f8e6f0333358c7db2fec9a30eef82fec313a2a87df418e169c210fcf5139bce7281d6fbda7e7f03b481def853d4478c75b518b4462774e0ebf83ecced1f133dcc9e167b8a3e33d871e8d75907ec5d8387f3d1c77b09a50eb34c69f155d52202ac210e0339d4dd1250d0253858ecfd4478a2e694dcc971c3e5359145d52a12cbaecf84c6359baa443948b2df833853dd1656d25c1c2fa4c5f4d74595d4aae14e033ed99d265ed615285892eebcb49949dcfb4d5a4cb0a83f284c7671f52a2cb1aa3b2448fcf2e94449755e6c4121f9fbdf621d165f581e2e3d9e1b3076dd1659d69e9c2009f1d088b2e2b8d8b163f3efbcf155dd61f2f6378f8ecb4b2025111a687cf3e9ba2cb1a04a68a037c769f5a13f305019f5d16459755288b2e403e7b2c4b9775a872b125c867873dd1e5d64a82c587cffe6aa2cbcda5e44a023e7bcf942eb71e2655847c7617135d6e2f275114f0d95b4dbadc60509efcf0790e29d1e516a3b2c4023e4fa124badc644e2c01e2f3ac8990e872f38142c4c380cf33688b2eb799962e1af0790261d1e546e3a285033ecf9f2bbadc7ebc8c79c0e749b3a2cb0d888a3010f83c675374b90581a922029fa78f145d6e35315f24f079caa2e87213caa24b109f67acdc86362eb64ce0f3843dd125d74a8285029fe7ab892e3997922b15f83c7ba674c9f530a96281cfd3c54497dccb49940b7c9ead265d7230284f30f0b98794e8928b515922039f5b28892e3999134b867cee9a8744979c0f141e8f063e77d0165d72332d5de4cf0d8445971c8d8b16427cee9f2bbae47ebc8c19e273d3ace89203a222cc063ef76c8a2eb920305570e0330e29bae46a62be74e0738d28bae484b2e8e281cfa82c5d72431c175b30111dec892ebb56122cd8bf6ba2cb2e7757b07f37a5cbaec7514ee4b38949a3ba285d764e9a892ebb97a362ad63c4fb77b0d6f9c017f140940a1a54c1d4da266613e2b2a043ddfb532eba9697c4738994887a3e26dfcb3ab130100a180ba98432d109d16704c568366a1969325c647e485e4840252a4a413360666a2fc4bca079ff9a050d8cf7af5cc0689992985c354a6a7a6c98d8bc4e4e4eb01b2837311c2a38b2184ec4f09101858cd96b79dae5727f482f24500c54c4103403cc8c9a0c626478ff4d288b19de7f1ba2e1fd372e6868a192a05c2925a99e1a98d4f0b2c1890db01ba0dc10cba1922303801300f0a101058d590d2d35682a2eaa9f007809001536806c80b91174434c4d00efcf0995efcf6551ae92e0503200264e72ac5a385c03e8d179ffeee565372ac71f417ee076e718718b207289b8dd39b703b73b87037703b73b6788db9d23c4bddd391a1892010c5cc00215a0c0048290400420f0801f3cdf0140787e0380109aff830284f4e0f90978e1f93e040182001f3cff003df0f0c3003bf810c2432d57e7c062329fce21c0a5e1f938dc3c4503b8b906cfc771f34da906d0593a8a9602cf57dddc53e4b60200373716787ececdbd059e7fc3cd13093c93c05389d9643231a7e0f933dc3c9b984fcc2c338a3ca5c8730a3cff6f9e56e079059e58e0b9059e7f73b323e1496457c29b646702cf8771b34fc9de44f627b267f1285c8a29dc0abf020bdf024f24304d025325f06c4299c8740a9e4dd02730cd826714a2ec089f26a84ddcd5f68c3c920961f416e11aa8ef863a218bdb57dd164ffd7401fa125405eec260b7616c5c880ecd40dd6083cc061907da745ec6feed7676b341866d08b2a18a0d318a83f57ad2da85d3ea7293691c85b0af3a214ff904b17fb8e92a8deb8f7ee86ab2fa8444af449daa5f93c0d566c84baf46095cebe753937617f307b04d0a579ba1cea93fbb8cb9f4c2f5b3cd50e7f8975e5ee6597ae26516a57e3c28d89e61295096d1dbe1ed14a87b51e7989d2df63a7af4cbf56ddbb6edbdc9fd501d8cbd8d4efda911d54bd04238ecc001f405fb0f1162e2e1018e72cff380d81eb0051144f62699b7b7de0dc251fe42a3f73d1ee0280f2f4ff8277856485a995fc3cb1bf3bff7f996ace1a88ed68fbc117a35e6d798648d1bdd0e1577bf837a403c208836a2e2499e7e701577e48d6dac710335e3e7636f21eb5c1276f6906f5d1b427bc8fbedebda90d69976e6ca86a235701147b987ad8d7e481611bdb77d49ef6c197194536aef90cea1435a87623cc31f94deec39c0cff6c3b7f6ce5611477983db16d20fc048bd087d3a3d0ae73508a7d21260b16924c694402d2570e1199c3d5492f0c7f7a71f9e10d803492d3908f231bcc1ada54a2d3499c01a4f7e187194ff2c32b7a0438618e2280f0354c4882fc1fe16a83d60880f61c48b54d143f4eae028dfc81da6e7dcb74abbbe952b4536d366025bb86340024ed213db9560bc1979acccc7a1dacdebc5d941bd61b6706708f0ed375198f3ac73dee6dbb66d5bca08a959a7e88336506c606d03c553e2b91a5565fc77bc0c5561cc2ad7c609c15e21af9ca84bd1e779553d2ad746aa7abc9cee6587b86748c00206c369324d932914a7bbfb4f92dbe11d9244b67771d49eccce971e4761d157b76ddb366badb576dbb66d1b71dea86aa2554a74149da59f982158438e1dd93445c4287a8e2449d594901cb5c09d04dc437845c1af25700ddc438041186c4b13671b988d688b7d8ec23c93873f746f040042acd177086444a268ea6b137e0b301ae2d43a45ad88084233749f93cc37826e84e1c8ec7967ad4cc953b2b5cf173454d840a101f2d206d628d7e15ad03a9e8e7d558feae561130d153440dbe6b55a4b65a0e18e7b0bd3bf5398de15e6dd42be5f50b9668e23bc2bb4ce11261c318da385c6c9a2579e8b0b17987085c2387fba668f7b4dcf0f71eea1129e6f731ce1e18d766d2ae54aad25c11be75ce1d4dc0b7156b94619606ab201a63fb918ab9d3d2915b91881dc6dbcaeaba7c73d8426339c67a02a14aee39415a91498ce0953c3341514c459a92ff461b252b39e31df20950c32badda0b93dc5938bf15a71afc002d3bf5b60fad30a5d396f73d255e05cf1b4b901b3b043744aa79afd70c1f6e96dfef4f43dcfaa29d646e582f13bfcca888143b63c32933788ae64c4b01be99124d93435c96c52b9e8ca06660383c15029d12b1b184dc19ac898b0f1c11427c6dfdcd1e3dcee0ed114fd9b6bba24ec9224cebd359aa2f99e62ccd11647d157b954aa524fd36e542e958fcaa5a275ec8654b94e6453cfc6445a18d754a453f5bc60306eb36ca987ae7e30fd520f1dd146b32273cab0c9a25117f7b7cd820b2ce4a51d6a14fd232617c67a4195ab73542e22dedb9f2111f63b24c2234f7eb209a2ab9b21ba8241f6d055f795cc640bd3cf24f92261640c4faee647cf63faae592a17f53c2027f2e47f224f4e9e828cfef442467f228d58f13752f3a3775248f7366f431a317df74858d7caf6476cbee68fc078138c3f52f336a68761f3352f04c69b6cbee67f80f12627c6235684dc7cf7474e3ffa2337df7141e5eaa1ab235684747ff347467fa2ab23dddf3cfd29e4f4a31772f34e0639fde87fb8f9cedfe4bf4d4a63d015ced3c719a22b194f63f0b82226763b036a9231b48efdfe1918656b98736ed6e3766ade4441baf536a958eda8e6bbffc1f4a6efc82356848cc8d334fd91d3244f40baf7a159dd8ffe88112b3f8cc823a6effe881521a62335dffde88574a3d1db904660fce88ddc3cab5935df2c3b43223f26f627e2c364d9fccef6e2ef69fee99b55734ff34dd6e6aa5c34a5faa2023a05e9def43f746f228f581162f3a33f729a5ff3a6effe87d19fc82336356ffa1f4e6f337a6b633ad5dc344d75304eb759a629a2bdb8a2ce996f53ee5ebb56aeb91afc8640042330e2a8d92ad23931186756b98ef0b0fd234cd8d2bc289fbe4a4ae300e3e9ab60d02bd353150d307d9ae7c29d176fbdf62615ef146c6a70c15c2b5c31bd9a396c6048c0f46f1698de896d77a0bf37e79c736ede26faa6532ad6f7c2ed6f8fc61b49449544e7749f9aa566342fae94d1c338010579e14ef85ed803dbdbcda2fda48030fdef5fc65f9b8ff1a7e7e181f1387f73628deec97ff4db69fe8d8c19a6ffb4a6a9183e983e8cdb34c5bab9cdb289719b85739bf5b759326c7e5e2046ac0831bd0d69a47bd31b197dcd5728e3add9c06c6a505a810d141b2936547a4503545a4243051b184d908d13df27b638a9c889be6ddbb68de3388ee3b66ddb361aa0d2121a201aa0d2124cdfde606564c29df065de9640bfd78a29800953c3f4670cc689479f8214a8947409be8a49af8ad0147d6f9a005395134cdf964ae14ef8f645bf9854ac9f9ad1d5b5a253f445a99f1bc489beac72c9e022f6e97b2eefe9a4d3eb8c0473739a6a4213096e4d4618beb1e27d9e812b9785d200cd5a6f88ede84d9ecbc6b849e97e5eee47075eb09541d5939a3997d1f4a67705d100cd6b6960c1b8fdd6d170be41f40463f759e5ea82f086531b6d59468ae7756cbab335ba567a263301b636463a74e38bfb14c238041dbaf1e3287ae3e7c697d48cae46238ab95bb380edddf0cc3266194130460bd307713a0cb38ca311ce1819d0c678b160fa327786e9cb843b70d707d32781dca559607b49d85910860d18bd89348283a6a8941a3445dfa51847d7c78e9f7176c378b9fdadd9ab05a6af72d9b75fbbf4debed7abd1d296606a7fa6f6d0d5a8759e74c90d8d5db96a96d718768ef364d87b9b216c535fd896c09965cc38425ec76d5de9cccccc8c15716a8eea990e82b0bd22ee3023fe5ee47dbeb30b7483ee4ff8f962b9344cef13985e283e0e87349c17fa688c3d1ad437c82bf66e153448f401518abfeb4e7e71ccb917ec4fa5f0e8474aa921c3dbf8a33f38b59aeba2174fbf451f729f63b468c6e902ab728c1e1cc385e9679c2d30c5e10273ff5d0e835cc8bd3555ce6eed6f0a45264ab1c80456b21b9567427fcf5fa6697c7762ce749ba6421129a586f40f1b83b7f10b18e10ec7799f8753c319c2d4e338ceb3b553b93c6e3b895dc5fe4219470befed4df5401c2b02716a5e7e204e5bd19fe76bb1be16cb4921568cd90e392ef5d095c94db9874633efb31d721bf3bbfbd1e7199e64cc9ecbf10d360b6c851a53550f8e98bd11347b8deeb4e2a31956016eecb767b217f62463be01846fd00d2af54c61cc2a57cdb59db6cd371f2fb7f86ac64cb584973dd3810cd3ef2838ab7a54324c555830f5595ae2654ecd605ee692cb26e6652e2d717939b3c2d9a60ade525bbc9cadf3615aeaa1bda0356c278853ebc8520f9dc1983d174ecd0e01613a2af5d055f7d9f33af206d11485c108e453c3b49301e19fdc439e6b863d6b87e8f4c8de3a2bc3eb0800f793ade3283c438949a9672c31a1a1a2d4e3250d50a3e87b0ec69390ee473ff2b08769d743537702617b45b8431f264be5a2a9178c1f839ba06fb1020ddbdbe17929b636c669c4b77bc3380a0be3ad05a95ca319a6af7a793959aa2798fe68e625cd36309c315e7e782776c358fbdc73a4e77a4b0a773c6f13e22854aede122fb3116c2d99da929ac16ca278e9b4da601c7deea1e9f7065096d17f8a9ede20150e542b48c1d4d1d9fce9e9ab92681dfbd4c9aceac1945335197d56c560d57d56d54087e97b12c0f52c93e96b3eab5e80e9dbd1e599210f8ab78da7fb9b1f5d1e183f72f76dcef9dd4d921906961529ae1aacee4f808365458a0b07ab7b1837490e6108038c1f5d9e13d460e1fc0970b06e5e26dc99eefe32e18e7bb843c40c03b6ef9df343bf7c55e4c96057ddd49cb82980fc4d1b59c4fe307ada9802c8a42234a0c09b30e5d66e9bdb10032ed2346ec0a9355d62cc774bcd6298be0580cf1b9c9a4d614ccd660ece7a6a969a7510fd7c8366b66d2b4257cea23f5b5830fda97239e99f672c9955b01bffdedf9ac21ddf1e401f28076cba522951b9da7238ab7a542f156cb2be5084e98f2984f7933cf9f763d51298aa9ea8a20461018eb39c10ac6a89a39a1ce228cac46849550fa972b59451f4db3522f480a3e86f2e18bdcad95a8530a2625bb7bab94f5208eeadf7747bfb150bc1fdf61e476623ec6f9e873cbe2cfacd7b6a77b8bd5eadf49d86e79a399c2c52c3dae9b9e72ada5d9e6efe36723223a9a2b715670f60236a475a6fdbdcbdca596badf53ccff33c6badb5d603aba7ea7114b5b343efe7e6791ee7819f533330fcf1adcd366ee095d23d773d99d42cb585aa2c8ddb1db4dea1ef3deb799ce5aca744136bad2a861cfe36b099c349cfd534e853d20686a9552d7137923d232a9e4b8c9e77832c08dea0dee61492d2fd0e57b9e8aa2353334a4eaf7fa6683735131aad25a574bf91a92da95977554b52332f77a0d8db38b545e572d4c6646c9f4ef0e06c38354cff065d214cef10b695b3d65aeb799ee779d65a6beb467db657bf1b8e3393f494782e2538625c5ee2d41a958331ab5c8d2d0d60bdd78acea16fef9d42e7d0f7ee05d339f4b77bc3dc496e2d50d1572df155f7f46d7fa2b731407ba712b05f1bdc210246580465843bf5ad0cd0de9912aec07e47567861d1cf7bc1bfe10e6804bc526e184fd1ff70677c3bde7b6bb766dff392e62d99c7b72feead8df706bde871c3fc0edf66a3ec8fae6a89a7bc99aec4913699ca02ba0257018f89554b5a87e6274d919ded6d60add32f544c542dc82a256e18fbf46fd0ad8d76b4d49252464f47200740bc914640b27ed820b62fdeda284be6ef418f47c54418c1db7fb843c55bf83df8fdbda157841619c31d6bc970874ace1809c72246bca4dd540ce1ce2453332546d1739f53338073a75654cac638e77fb867480083bb57ddcf97f1700ab435a466de0dea1c2b8cf906611a6e2f0d7b78316cd362c48801ab69d034dac6ee03028405bc3c3d7d0fb44ecdd327a275444d9b81278abe057a0b36dd466a724931e81c274f1c85bdfe91d2877f04fc8ac478c4cafc23e197fe487d30fcd20b09272964cca34f9fa5126924246580e980d66235cbca4dcfa6e20d1114df9044740ee5b61d8c314c9fbbd7e9a7783b6c27285e105bb7e2d3b7d6bb892163869b9b8f11e365c4b8f138d15adafc7e8e7f7a18e1cee94463afcf17c9e826386313b3d5ec8665bc8254039c49308ef4f22ce9758526fe885578696a9dd16f5f73c573a2fce78c499ccdc0599c55215ed139d4a746fc11bfd45cb10a47cd684a0c12b378054c5fbc42f4c1c4c87d6e1a9de18e6872733ac7d9c0e2cfee4d7f13ee984c3656061a3acfc0a8ee116c998878454c1c43468c3c038bb606a9b6718db78001f0b85108260cba3159d3bf273921bd44764a104ee11ec2942bd8565074edd71b3eb53c1e16c34bfafdee11266c49718ba3421e17d8ba7179d9375f22c2e947e3e9a79a278da3aeb4a5742273c908987e0de96324c98d24c9fc64d36e48fb63699636abb67ef8332f7a71b2667e876719fbf35613bbde1f4a3f431e01bf4476309a9a2cd8fdf0bc32ea0c6f3d18452f92b6d5f970944bf4df2340f4ddebfb6c5bf87b97971fd996d6a9efadcbb62c8fa3288f97d6f5d10877dc6988dec638ab94d273a40f47d12d9ee771a2782392a6ae133d0f5ee77dd7759eb5a3a7e6db071d3581f88bec67d1bd3e5ca411ee582bce6888b4198c1c99c19eefbfcfa4284ebaec4a144751528cf47294f83d31bd9d410328bad437b086a427a69b97f980e38ce8bfef2345a9e228ea3f03e001087d347692a49a81493052142f9df4e42949e6e538fa994957307d55d7994af4aa8a7d7829923cf8aa59748b1463f07605315d6aa1b3e81538b4d5668e30c804a58e8a62d5d2a5112a97d938eac0aeeb4091e80b45efa5a8befa078fe2748abbd1a5d882e2ac7b897037d8c547abb55670286c390a1cc25bedf4a33beed20a565aaddd4b9c897e662d2d9c595a67c30e2715bd8b41e7a4cbb183d22bdba2a957ab7b81781b89c64ac590fb32a3b8ce2aadfed4698591c8c44ec099c404a6b0ce99057941b744ebb8a075366e09aec74befb3a9c6869bc164fa9a9ab7015b35268e13a36c3111663b9fd1186dabd56a9a8e241c0df08e30b4614c53d0a488c29bd2ea5e8e82a1260d3abf27cd4420e9f59a6190c9aad6c5a7ee96f33a6b3dcefaf4f9895cb49f3b6dfa59911886e18ef761d8c3f10f4e424a3ff333a491faa547c20aaf7764e69b7524fc6c5b46acfcb458e1836f67780202be0fcd02c91f5c0b2d5428210cac902c85de3d914870f76074b20303cccb6c6958c66f8745d49240bf1c16dd26c21231c056c60c775033c77cda24f367531e37da7cd1f7bd15c599fd4473866138df68612d0cb247e0d2a512ac975e8936668566a9902135695291b32d6badd771222c26c244580cd3df6868c21d1e80f810356db2c016e8721478737afaa522cc1c384f4946207119712514b4142a3af00116db2ab10006a527220c1cea21928f38a329faa04ffb3801f4a1410b01cb602733294a47835e21a053f4bbb07b3b038e6f5f806e9a26b731608036c6d1c3b0719b29f2c6356f23be4dd858c69df806acf99b70677b1c8ae3df0b99e11030b531668ca622111d16278e7127761f74d5bd68d0242160fa94e4e38d36304c2653671ad202cfdfe67479a3881b7de0103834b4d588a00fe803fadcd89c4ee0b4ac9b39adfd3bdd3f918dc8799d6d895e8c41e371a24804bab5adafe6606bda38793a9d6280f35aec1c8ef7e3af461c32fedfb3dd278eb85b0051ddb1496c4b747bf8f7851ee69018c531a203412de03ee6fcd6b944ec60b46407eb5e8e127dee44f352d1280b3387d8e356ec99392a6cd2a09cd76d224c7c8e7bcfa3e93c6e069cc121efe256847d3f96e6281940f15a6c6f6be972043caf6846b8830d2c12fde86d5e27dcb19101b4c911fa682c7ab035da44e3cccdceac22cbc372b134d16d96750f9ca1f8f4dbac8df1e3118158c019e8f3813e189c79d95f0b74d52899f41a65522d9778c69c28690b4c9f640525810983e867d214355b8d7465f6990405537246f1260df09c30c0935c41e71061ed851a72923c4c5810e22905279380e7389a3327e039c5f943748e3088879e37e0393bdc9914747d24d8327d065b228c821b3744c320ef7124eac4f9e50726c5182f220cd31f8d9ed8d55938abb33a0b67261aa0b5318ab759a2cf117d3937843b4078482ff339a0bd19f479f1a587f13c3c331f3e8da5b924d80fa64f02c2f443528934437a4122c5686eb35edc66cddc669548b759323e44fddfeff09c10080f481ab122247c23f543d2a3a9c939c98774c55155483147d1072d47eec4589e65072310d20713e3b6c551001091d9ba66bd206bce4d057e5746bd1d8b87e3f9b6e565de683c5ee66d0ba6d6655bd609465926985a2598b2e0b34d01a6ff0d097d9f3f21144de91062d2c56969db46dbb62d3e458bd201f5f5d881046b1ff5934ca197310d007ab87a07eb5eb67b75b0eeb5d536a169a5752616c12a8a4dc360fde8261bade8c528804406e844ed2e2a57554ad0fe10a188306e4bf7c4514f8c99f49a5bad8af256136db56d0ca622126ce3c1e864d7bdbad700407b2d125c582472d2cb51996480700a9c686961d0b44cb03f5607b417c42e02459ce84e6c6953a7e2f7a32e98fe684cebcca73fc242eb782f8e01833053dde71f896010e60a04c384cd1ce16cd2a03f438ced4764a619fd4866b1692018a6278e34a61838834373abcd30b23ca52d2522cc4a45c0f42969e628d2cb1b4d6f5db6653fdb16d8025b604be42c2d0cb2344b0b83ec0f6b699607900b70a8eb964ac395084d837e35823d42cd753671135e250aa64f7ae24d9cf8749c8f389b1d67809667b71ad8ea12f6696d8c9ee544cf7ecfdd106fc0e19383e7d36634f07cebb55adb0f0f0898b587075ba0cff4b1403cece1612bbadb98ced984307dd067e6d8b0d034e86f5a007db69a87b92c636371085a5a34428b5cc4993813bd603ae7b41f160ff07986c780459f43c8c33bc2c3a4278e22c178c00f7f5e22dcfbe3f0bbcdf230f87da2b756246a12ac75ec83dc2c411f47d1eb989b8d3d1ad3401ff7116222bf59d77beefbc016a62458e7604e0cc923f545dfacf0ce591763b0c8f382d0c22297351530082d1cde1602af95de62059a476b9d61faf57242183f37b63bc00afe0e37c011ecd74122b7a1b757d8674522024028409f4c7a627aa0dd01ee087b38b66f5960bd3c5638f1ad873cea166b63146d425bedfdeb9471abd1d5646d323b5f5c3347d1645d1be3e1ed89b106b3045b8ea22458eb74afb3813c98be7dd239f4c3db2cd125c98034031a748e1885d484f4ea9c208cdf73b8c3069868eafb90b4db2531d139f4c116a90638936ec0d3b87624de78306e42b50a7e2591b0bed7d2a50b2c5e107717fc89cfe3b558628b95492f520ca0b49326d1a0cb4f56635430a59813459287e3d11819b24aabb37344efd73b47f4dfa59d2312bd78bd4689de7a27a827e81c0598be0d7b20c1a2b71be935737027c09354c3f42b94f903f8e16fa10fcdaadfa190130f27bd581b0f38208c99f4c2f58d80efa41725c9688abee892b094b6c8469126ce1ce57d1643202038645b2d03fc404027a07dcc1c96466b2ac42de2ccda18391d5a8749450bb6660e314b7b5a3a87b644ce5a9aa561fa1ea803a8830ea1f82f8430294682750ed5614707177f98ac4a925e3445ffbb3b340dfad4ca8fcea16f0b00ce2ce3fc0284417c740ea903e841ece5bc310813164721c5c42748af2a1667d28b071f405a872342ebd8cf7b8fdc6a24a90a25147c622c694bb8718174022ec2565302c908df671217520cd39f419d14100082b77fe6dd70bd563adcf1e9e256db6ab503803646fb0700d240261545ef3e7808838858b55e12ac07b0871e422789b41ed9c3a4174dade0b3a2adb6d5c02fcc3008e897d4841483cea12f5e9293cea1ff5deb0338af070977bc0ff25648d55267a417e9e55b483452982c9da36261a2573eaa9529308555184d05414b4f69a026daf404a6bf8d11b7388a8a22529c4d19b3389bd1bcecadb6096db528a52d252c251f94747083929412154cbfc4f3b9f4e47309069896588069e90498929d0dba00495ec094ec5e242d9494945080a91530490ca64f0a43dae22b1f34455f32baaa4f9fe4439a916074057e815485a02ac62f9876c17492a45718c666e1a8c0064bc05a2cd24b744529ec00a9bfc3ad10d0de0d7fb7b574f10216ed8864e07929e989a32e09467acd60dc3e935e74d5bd2a9699031c9a34e8871546df0a01ad8db153402b60529113b388339a28853805a6e2ac7328e925ce48afae7bcde0213a5fd4e2f94398fe8603f37c7ade852c962631ce073f21ec6f45f10bea80b077dd8baee87ba705fb77eeb2749f3b21e02e0854e63ff0ba5717eb64dee7ae3422653e9ba8161468d2a0291a4dcd684a0a4dc35c4a61e388138d5e24b34f2a2b639d0db8679837ccd2717faa73743d34740ed1f793d3be288a9d8bb42376dd57cbd293088f7654ee7a4cdc3d71d4cbb1309276883811c799facc893decd135e91cff8ea44f748e4fb2a33e9dd3b47b752e2fc5f7ef967819d215fd1378acfa9e691470d793e913b0532984a15a6c5f224964f6fc47f499025130b44665d40aeac2b96733a7f024f144651c36ec00cf1065b2a8cc339549f9445114c5f71c25fe775d1eeb9b6faf89a6288aa60230514d00d7b3e8fbd7b40efafea6d671ec2fa369e8957d2fb1e3dcf5607f1abdf25aff041eebba469614fa62381fb4938647c3e470c093e6f2589f100928924a028a646ea32bfce0fa768228d368aacd7d7b3ec5703dc9703df9d89edd5494327f877b3d34555f58067b3d8eaa93f45c3455b98ccd9a9f6d865ccdfac1f5f30c2e3c436b1bda369b2e4eb1d395138fe73a2d716a9dea773e55c175a4a39f1e2f73e9f5f232cfd0c2f56b8871f696c0d57b826b9da145579d143091894bafd6a15f7f04d43a01b8b774f1e2bcfba82aebc8ec61db83d7741755e2c7bcf4aa78b9d9a073d42026baec66307370af18cc928341e7a83f4cbaac3347ad4d1a2d689d7a85cea11f2405ff34c14eaab53155a8d6b8d84fad0685f1f2f3b28ef155b352a085bb7a26ae4159b0161d348afef698723d00c2164c9f7b713fc074e6e8a6913927f0155a87cb41e7d4660eaecaa4419fe301a65f7fb8c838428c28706837463815c18608355b4c5a600c8126cb8bd98c104a4120014106cb08c5e807e213a10fe803db838f07a22b9e13dd0eb8ad561db40ea55c0e2617e3ac4c525da286d426faedb0b531e240b231d21072de81349c64ed712df1f2abac8b3aa7105d75775321cc5589e1c4a85c8cd69bcf55b81859ebe9737dafb5569b1a375518314ef6d9c9b656d6e38e8593e1c05de9a95d1865b88aa3a83b17cb8fab9b48a51547a3295a5f750947d15aaba8d64a2432d7c0d17dae5d60fa1b12a3ccab358eacd570703147b97f7733dd529d72b2aea67bb9d8e3397ff33a329b3099e717ec71322fa93f47ca484e56657691c2c8c9203f532930a55e30a55b329df15486a7cfc5e8aaf6acb8259ea2140563462a50283815a24cc0b486547dd517a9be6a4f5d62dbeab691c8ae0185fa1d5e9798f535a718a2deda186998c108f6b81e1c37a0b003a0ccf90ce2adc6fb6fad43e3fdb999a3be9379081cb0bf0dcf5d1bee90915bc2c54af305994d7f0399ff865a8346bd5c0e260dfa00b89ccc51f4732e7745760399512fc8fc335456224954068231d7efbe8bd671d9ad3e53c6187ea3e1e735c2b9255e7200075c6d78fa5c8f28dcb1c1865bb12845f45646c6ad5774ce0c7744d36b48a1fc88d1bfba162d964cd105313f4ec0e28394ac60491715a48007f40a0db7ce70db5133d75aad1df1d95d1cb903258aa37a5eea23731495712e2e567b62c0924415ae30810aad185c018b1754e9010b6261b22083a65591a2d5051525b44cc0a2750ce897722228638793e1ceb8b5519308f73b54cc915264b88d67dcc67604ca1062ac42b5566b5c0c27d882179a0839e9220b17903069011724acd0fa81c984b0800b636650032940f9820e1638218b58132ab2c8c2a21fc3a5dc122a4457b5d6be71c5b94a81bd30eda1ab2aebe13171a5deb4322e79391c4c1af4efe5aa5cce4ae7502e071c118c108419d7031f2d4ab0e0d69282305800b8b528e1c15c8c9b2245d463e24acab813171973fdd1519f7255780831723ddca432662ee6c274620e8b97fd83b3cc1f494f16589083295b9cc8021816fdea43572016a0f082169a6c11250b1612194ce10a59964801021890c0bac00ca030c1083d54a410028bbe5f1a73548c7bd3287f9cfb6d6ad44c8fa0d7287f18b736ca9fe676a3bce726660be0699ac1737ee349126104cf4972557ac0827076d7248d18731dfae229fa79cebc31aef985d1d62aa6d62c07b2481dcaf33cdb9c0bc6cef28519ce9c4fe6624cbac0b8168c9de50b5528e783b718aa35a0d8e84af0f65e7d4eb722d0c6d8bdfd40d29dc1b65e19bc5dee09b620d85dba1277b92b7102d3a754d628faeeeeeea2a1f64a235d0de4ee0a31c41077f912eff192d461eeb696243eeea2ab4ac448faee87b4ce8ba7af815ed51a165bccbc27d139eeaad195a7c099c0f467c85cc310835af31660fa1b6cf48de37c924010733152add59a183ca49b68ef318b5f19b93a399f3ae758e38970e662938b4d2ee62eba9a9d9a2ff2dce52a511995350dfa5e27865d7d62fcf15aeb6c880fe1811138f68005d3dfb898a328172b914a24af03c731dc9122e2625d1c45a5b87ec3ad4505335cdf725ec553948b01818b51ea917556699835863b54f246971e13d7e8e99e91f49c61d7847106e739bbc1b30b6a7efd3973148d041d85c47354e30e7b98d8c96c84833b5e76bcfcec78d9d279e7ee9c0c532e4653d46b7df7e9d36f974876bc6089d195bbdc2573676c5e09412787e86a3ef121ba1ad23d673d673d673d673d672f5639748a7e46f9f01c7a0a1f3ad54d7f02f30a9e55307577f72a8b39aa4e98bbbbdf3aa3e03b9f386ac89c75ce39a796145cc136706b490112d8c39db72e736e4ae7d45a6bad73ce397ffc85f3ccf896c0fd56e4565a4b1217defcb9fa5365b4ca884cafb547ef77f874327fad8f875b821463168f8b61ca4d894da9ef358129f704a65970e6a2c09b8c0c770c484c24d890cc400247c26d1e65eccf95c88b2722c3431f8b9e262e090e892d9c7b618e83e171c767ed7f5fd775ddfc32d71a4253dc8eefeef0ecf7bdb5dbb6bdf87a877bf7bb3bc8dc28d38fdc0ff7dd34ec79d4e659eeee56f43bdce67a6bd6dc7567786b28d4bfc9348e1dc5b2fd8befb66d7b41d219f5a13e5dd7755dd7753340fc95379af7e26f3f3232323253f446effef219173877f72fe279e36832fdcb7448e4b485e08f3f43225e3c91f15f90a7edbd4557363ffad05d3ec31cf732a4171b65dc3f5d792853d7d9ef7ea42b93cdd35c2036dff3986c6eb3361a5dd197071b63980b43300c6b4c32a410fbdf7fa41113495b34c5bd255d88a6b847c2b222f3fe4357d5f3ee64d521dab3674f20a22f62e6400aea4db159d1db1598c3db10d7f2e8101d92a9635efcf632bfd15ebcd8689e378e26d33f0a55a3c646a3abea79e36832fda3501b6da3fd0005e11a161ae25a343e55a8c6386f343daa06e9330e9c6b0c4f2e8c2f9e7b1a6e3fefd6c551dcd31fcc5d3a4453dc8f6e6dd5174d71ff71ef5deee716c5461bda681b053d2422f3a59f21113444c890454c4cf3337448f4dcd7165d8d5e7c618e33e1186b60d2774661d23f894422fdf85624faed02118d58323232df3394794fc6f34823566464c417272873f346cb75c8caccec194f403c2b7edfb69142466fdf8e2ccddbed724b388a7b9afbfaa93e9ffd1f462fc2a8551cc59d68be5942271a3248b32a94b1ca609035c63d0cd402c889e6c5130d790a625f7c21f6459ab70f8314e2bdf8226964a4299af71e09cb3e0d0dedb0ccf5169eb7c5b72f447c4b1ab102e38dd417c9a6304821f63dd208a521e91547712ef35a2d4caf951e820a80aca5fffd91faf67ff87e441ea1ff3dc532178716fe66eeac2dbcb9b61ecc4d5c87e88cfa501a05a2b5201ae466ea8339a0d15bf13f99dac5278eecd69221eb50bde2657621eb429e378e26d33f0ae5429863f950cbd5f382611a1b6533e64357e07fcffd04a22befb9399b7425e2708f3b407844effd8ccd31db0fd7e25cdbd016b4d536a08d36856a1bcd3f774da84f478ac4238187c4ab0092d89e9171f20cec567cdf6664140ec1348a7ebe715408c64b11462776f1eb14d28baee664d9d9786ae132027e1db7f0eb35521ffc4eacb900e883d7bf5e127c4a9c30c4b272fa319d14c38841f8c3a18bca127c710f0107356c6d05ebcc73d30c078e1a35de348ea49aa9bb17c7c3f56c633621cec5bdb8275c944d8b6d28ec097948612b5c122e0979c225b6319bd056db6aa12be4095ddb060e85992414f2ecccd0059dc3d2c21e2f7360fae112218fafead78587300897b4a6f7b9fbb4f6f1fc1c04febeffc7a497a957ddebfb481ba38b2f8aad39fdbff7cf5a9204233df9c1f4ab888495c5313eeac06dec463ce63b090e39aa5567610b1c0a5b610b1c02bb0087c02ebc9c61abd2ea0c1cfac194f46ac212fcfd6c2462e2cd7e6296cee95e1e356d32f3f3f97d735ee1a7ca375d3c59d2152f33e8e396e4e1d8fa936674c5e34157ae601aecb42ebee201614d3802a64ffae2ab1e232335e109a64f8a59a0d2412c5eea60fae0162f0730679e4c05faf942f8d72e3b38f9a556d139b47be2df973f5d7e1c456775d2134fd1cfb50ba62fa542a17380ada641bdc481e9d72a5a67d62a85faa592a45747cecffe27be10df4f18e94582892209467a919e905ea4275ecef7392db909d5994766b02793a2d499f7628d7b314cf8c3be18f475c1029e97c320f626c5a01b61a1734c2ef4688c0ea60e70166755706e5a877d6a31b5e89c4e148d938a9534e3221922cd0763c6157214d58213bd287e42df509db2f98d8fcc38e0790317ba571793752f1fe0560345f213917ebc2cbe2a3d25498129290a914866d2144bd6ffc84c12c2b4148235f626af3bd27aa6477dae41a32bd2ab86a551140a674ba34fa32d327ba48d5591084849241291683f41d4eb630607d86a9af8dc5bf1925dd7755dd7915e9e378e26d33f0e1c181693f9cc68f8472c853f1d105d35ab0be2c83a43e51a3878cc2b05fc4f247a7b8f3061d1d7eb7a16387fbaba4c7a855feb874fe96b3609564959ad77ba4cff3b5c04f31104902145c0167d1f990c53b01583c15e987e4ff7f252b443c449fce7de471040e80a7c13596a1aad6935b07deb91235dcdbc7d8faeea5b3b5e2030eaf3cc3cd83d71d49d30582c16ca4e2209a4449ec4903c89e42948fdd20ba95f228d5811dfc80bf24572860c5d344569ae15ef6db61a384453b603ea82bcd948fbc12f9f3b3f8aff499f49536432e98912e9e7c9eed4477677ea83d198e656a1d2adb41775268a3ce3772f3ea9d4836b620f0dc2241a101e6d241fba8241925e3430b2da994bfa3088558291641b5867445210a9268a22e9d591a24b6c892d4c3f0c0a83c2a0a057f7a483612ade1ed62b010a308cdb2c9b9adf60306e9dd114fd995b812a8da6c29f5ac335e431710dc60f161b3f1a1a12e9deb4993af2b481f54733ba820144573363f75486ae4a1f06b5f87666e66b2e90199287e7c587cf43fad2c433b759220c06a3b0d3460201c9d3f6e0236155f2b491a72061f8823c624508cdbff823323ff3e16fa490d2d7afa411127984e65f7c69bc52681ec6b532fa8ee643175d917eac0fbe90fa2069c4caf64664c85357c31e21309e441aa1214f1d790a02feccff50ffc5bff8fa30c8d035b108139f8aa2f8d914d2e80a46f8d33da1dfcd807651307d70c8d5f382c570289bd8741b8b30ba6a564c26faf8d02cf1e67036f3303e7c1e9e174ff3a55226bd6850306e26bd662aadce421f2f3d6f1c4da67f14aa460dfb19072e6262ee699e3e48a3ab99a70f028135ba92f9179fc19fcf6010a619c4b1dcf4bedfca08ad04a8246cd5565555324623220000005315003028100c8783c22179a4c879b10f1480117eae4c7854a4a7590c830621638821030020000020c0401000e02b2b8769b5b15a2457b8ac84e501a720aa00c6199e1330905696a302e0856fe3d55d758f45be186b70b9d18b1bb717c4828a4ac091629d8047bd610557a150cebf384391060f3c0c370f6e5395088ca86f81f3e65215f1caf1e1b587019d56b31687c06b92d79bc6d7c89b977806187072f3ddb655e4a64ed2bdc2d3fa3b945a7ab1ae8a5da0590fb4ff1dba33332ac590ba9453a616d40997be2c6ca14ebe2e99322f70d90c7fe62abf7a1855482f71967eb53d765d1e66a07a73f59d1b8527f36d6242277784d7cc420d7ed420a58721af585c71bb9951aad197e8641214109739ce3d033d2d6a9bc783fc92017766d11a5d2fad7b623ff569fff30641f1c2ae3ed25cfc4152fd302bafb4164f90142f8cea23ecd51f34c50babfa0bbbf223a574f1563fc12efc4ca87db4554f300b3f106a1f6ff593cdd24f94c2c75b7d453b20d629d22bcab59a5ded5d8af472495930068edf3af08c3a359e03e6b020617c3b7b9a79e0a7d0b8c4a23d07d54439570c1f946594aa59351da4c19fdaa9b8456d093be4270652470ff632b5a386be51cc36dda4e1f442d00589ddd825cde043ed440d6250b4f74c1832ed57f0b2198703991495f8b401b7b951a36e5f81f427f40e5ab7019855bb71381b08522351cc0484e669058f6b6a2d50d2a734527fd038f5b6dc9db43ad4f14501014c5c3f8c08f0d313fdb517c0e18f47d4363e71afb972f36eb666a583e98344056f2b293aa24cee0042edd2fd4b9d9e68f6b9d0ce28da91a074b3317e2626219e512c53ccbd62a947148cfc417f3feaeea24e7c2196e8cc890594ffee8e30b2a535d36a904d6fa855b0524a7c5a969e1dc435cba1caa5452c39cd17e2622ed10872e9691e81571a24181e5f74388239a401c0528a29d051b6a0209deb8202cee9e257f30ade48b3383613424715d1438e30b3a28156308373aa00505b99fae818da4adc1bc33a49d60710f2868b6eec0a37a890d8c62625a041256cc8aa598324380636e2f093e8dd27f20d8d07fa732cc886df8ce01bcb49d25943328923e94182cecb4f6fe1279a7d9b0bb890027d151e171573464c735b297e1681656168d257d2ae03e78d898be5276e6e968096671ca37bcc4925535b9f80d8f73c2c212357fe81857d9c07ce55d872ce3b0b2c19fead11e8b6144bb8d9692a3aacab3b087050721f773579d8dfbdb705a68b685ea8a4ab999a9ff60c01c9364dfa539b835aaa553c2d09faf3b79cb6c4a72999ff53523cfeac6c589f540d6368023d611a66fc7b33cfdb00ca2348a420ab76c55119cc4d2a734794a46e14a32d6315a2d066bb87f0b684da2444ca3f84ac7fc78770c62250d01d4095f9306c3ba2428401526dcb35bf58880889c88409d3e558bdeacf0d62e85af33fed2de0455f2343d4140db667399811f582836d38b2e19af1f47863e2617beae4313e6d14c4bd44f5ef06e41e06588c4842e7f2b6bfacf81d50a08679497cacbc823f94d4d9f97fe4813be783b5b34bf2d58a65de052c6d8d5a81d9acc692d0409dfcd72c492eeef3796bc2b6199f043e538338a528c2712a55449e394cb6c53e38ccb3dfc486b5790f64ac9f38f088cf94e243b81062812d04896ab25727a7974b4513409fe233e488976e5ae372c0f29c099c391afe2225e60e9ee6e03286a170cdaf04374c242667f2b5fcc428fa527628454ae6f8b0eadc7a48610ebe4e524861f2ba0b1e25e96e82cf03c865292459af8c4c6736ef8b4baf2212a631c2927eac962d6e738e5b48f513a4134526ccd5291176112be7ca77fb12630e334f467017d42dabe5ae27e3a0c9d503ea0e3bfeccd1b98a7d01502c712eba77951e019a7fef96e3a3f35c493a5e2109b20a4a9b84e466019d6b3beec23de7feb81ef58f57c1282db5875dbc43d7581a8f74fbf16e2efd9e2a1495dde41755073e515171ec84afc61b338f36bb70ae182e155477ba1d95bc1fa77f8d71c054446a4b8cb3f084c479431bfe67ca8de26f24ffd52e923c358c25d25baaeb9e20900f0f052c2ba0f98e3dd4dd9c0495747f2c2c49fb9aaec820e4a3def2ff6005626887ce5e2148252afab86b59c1bb6d55a36be5807eab4d32c0ec4d77afbf44994c246e4d625658dc29629d1795c60a183efd572798c596e21d302b1116564fd4a922279888648b7eb2aef6b400d654748c9bdfc53e967fb0ab1b6d038a867f0367640b4c8452040025e1ed2804709d403031c79c84c0140d58b0c1eb207c5c84560771011f183dfa1b01b5d5e80da0d8aa0ac1ee9366a4ebcdfb54558a2257e100c476a191954a69d09737d4e1ffd8a6eb06dc64264af1e55db8197a4b2174ec5208fa79ddbc4a7d08579433d277c92512eadb8a3d92b1ceea5d85516304713084dbafd35e3279843454cee8653dbf36c3c5727cf3a3c7a1851a7d4bb8c31c349461c32bf3960c7e074dfe0f9df7ab51e5ff05d337cc942949a5150a9565ed7976f21d3be7db2e1d23986121da49cb5fe59328b1e39ff8afdd09caf9e855de2b4688c35d256cf88966c4299ef53fd7b8139fd1fa9489b704671765d8ee35b68dc75f1414cc369eb92d477be84333c10936be7836cd632c4eddef8988bf67d7228e0ce19981b7844784780519c3f28d9c1cb0a57259880502e35cf42ca7dcdcd82462d044126ac774c2b7705f2abd16d1c6c2de21cd50b65cf358c63b6e73f9ae93b046b6d61524bce4535f64fde8ce1cf5a925d7fb44da435254c9a15a5ec5855d2e8ca9281cb6ee7f330efc9365b68821dafd0e01373a91748c5a192944c4b5d18cdaa63426a23b3d9f85ebdc38a46ecabba06eb95266e8260bce9c40d8c2db284f2c06c1e43d8246c698a104a489408f86cca99e325660dc30175012242967c0922c4aa6471e95e2a2e276781de009a7d8d8591323752fa83f3a070802a90600356f2c0ef2f0c337d90b68b52b855439672afa7c0a0c3eb5618da09345b0775f044dc8130a26f5a2564fde7069b8fffd1d75d4fd2c965fd83bb2371ec113cc65a930d3f0dd4ed95115088b1680e5e28328aa7397b2a6fa4eb178a120d85da2c6b951c82af271d7f784ad726170db3a2edc4497890bcb05541027cd439af6bc8d23be714565329fd275378e1b963b7072e18ad490306b104983f99ae85e35929b401b1a14c9b91ad8c56716d6d01ad740e280c6532832bb1b6078eb7c3b99101cc8b0ddb270ef9daf934ae39625a9e380b0b190f4b91d534056aed758944016e240173bdb6b19a184742811a6928fbff53ab927c837fc41df19286e381d6e4dfe3a08c148397d376137be8b2b27d9744171a948066e2345416a89873f7a62073f345f71c1f99879742c5490dc76f2bce5dd5819069dd4ceafe77a9169faf447ccd40dc4ef94dc58d57a2a756581bf90b8c10c18dc02ec16460df1220d8c002caf658165f75347abb16289f964da37adfe6c1cfdccae158c6da14545535b45988d0c763b9cea8a8999f87cbf76b4cea581adb041209a5a63385a5b89b993dbb6c6c580ede41ba59175460a01584260791b91c0a3d1efe87fac12371f048df6b7a2b2da84e3a4a8d8f44109ebcbcb5716113cea5f2ff12a032a09efafa2adb58d0982e5ee94dc232d96f397c30d2144df574eefc6c91cace51488c499d1b650b0c5a515a439ff51a26844c893b9c30f3330ddcb6c29b574be949221f4daa6101add7611978dc1ff9c621a193db391aed293cf2ea8980bb8db27dab96857eb7be6345a7c00f64a023403b3bc377f079c16816ec2dafe2d736eccb0a4c42e188a64fb928a2c2d17aaae1f8eb055f5a4537fffd570a708083e3a8d31799ea162ea2c9bb476500dbfb90beb713c2a016111f1fb8cedbcad45a1786f6524ff6a076dc8d94323b44318eb2265f9df08990c0405b18a25cc9090a9e9fda98c99eea8a4142fbdab42632464f2aa64797498405324dbe03aff3176b3cd3e35f0c52689507022639b3a000099884a8e6b888509f4fb6d7bc011ac8c3914c013bd11b173a29055aa9d9a96349b36094aa54adec7c1d02fcd8ee612554524654742a9bb99a61d8a95c17f593b06b1324c67eacc2c07c1f9ea11a1ec5d157006080f1f43fac1b2ec52957128a18222980bb9aac3e6932b7669d0b8b526e2ffbd1cb252c03454011d0c7edf297a52c9d8b2f98a4e1299a70a7620c77306748652851fb8b7dbda8780da10ad1b6c747dde2e522e01575b840d11c819adaf4943a66b4e1d166ab13697b0b2c2e843b157afaf6a5e878ba5c33cf17a77f80cd37d5d314a8d6d7e1313088429f8dfd1bad15d82868d948734432b6066f73bf0de34255e219f5ea96a26b644c020698c7bfdde0b0643b55091ee90fc9064d04fa7b1d30aad39f120f0fd8e38457cbf0ebcc858653028ca4e6cc1f6137ea5e511994b4a7cf17726e0ed60213e2c301e58ad34491e89528ee9a20163b57c3e0400ac06844b9de4501374032b048eb86dbe7ab58070f6ade2072eab02923fc375bd029557ecc239374cb097dc8d0626e2311d920131441a0d01095a6431336cffec551e0b743b04f07122a57e9d659aa52c6dedec2ce164106e04603012fedac1c3c083f42b282131a8306ab5faee0a3091550c2e5595f8e88f8340354d5510558456c5bb0353f25ae38ceb95fc01e8bc3fb85ae66739c3c2bc37a287bc1dc1811ec15ed01d7a58091cb2d6840fa5184a94e36240264126b02f78909527530038f3782c865a96e7902057b7fb1358eaac769d92c566836ebc2560b1844e5a89ee9a593c62115b0aa3e3682b81fb049ad5a9204d1c012f3531b95c121a174e25a703c2aa1055e750303ac013d12a8b0d28d8c2b8071a89aa2ffa06b15259d4d2a3cf958f851d7ce601df37219528c00fa462fd2bb136d047135e0240ff2993180cd13b07cb410a995c46634a71508df6af1dee1e5711d93062c2f59515a0bfcaded1687b35e34230373490f2aa10f184ecec3b69baa067694b0c7fcc12ed375998c3923702c1e160733ccb873568e4d55ba420ce6387a8c0123acbf42f1f8d47352dcb50dd94f63a11fcce174c8c288812278113a53ba92af5e1c62879b846f7ab2075bd5e0a17caded7aaf60f697088c61ebc56d5ebc0f24f9fef55690f55f3c22d40ef9b91e7f885339a7c1f3fafc299a7934ae32ab10500a80ec24c352c1facbfc6f3fb57e669373ebf79daed29ec4d6718a212cc00c20a55f5267767734806d255c64edba09fdb134f45f142fb8d29b9fa7d95bd898a1e703eb15e55702e61b4bf4ff72e552238b00aeb1e9fe2318ce9e22a25290640f1aabd888cab52d03d5b234a586341b76616389a1cc2ecfcadbd92c9788a309a2a7fb04ed2249212e556a225632ef8785442e483927537fb0df89bd5d028f058bc3aee3773339e7a6ec8a0e20e06d7de7bac78bb61d74a155a7d7c1f96aaa4aa3899dd11162cf6c4452be406b0ce1a66c5a8357f5bf7e1fb22ac5455e31921e796e35b7be032b665b4f13dbba998b2819ad5eea45206290f8e29c429ca4308220e716664f4e1503bc5d6e44054e6d37e77d6b01058e5f6f6dc3b358bebf280ee0813f38e2e954b26176c200d0b08c8896f6fcd165b9abaa891c3203b089f964aa54890beabdc0b02c88e6fafa6bafa2b309a669946c0c84e67eb1476883fab545687f2cf68abdc01e0d308001c117a0d734c5e4f8276ec265ba4015597859419e185f22e6c2439875b846b4e09914316ca11283d6d5ffc7928272b728d60b9d42c35272959a867dd958c60093a4659d8790041c21e785b0c8ca52a81d45e3dbf23b3ed68c2f065ccde147e7e05ffa06b9fa9eabaf4dbc077f703dcd4d81b1db2157d08e548468852de6420844900d712563e42208a53267b68af97a19b6666bd6cefb85bff4e13061838350e562e20710a59b245e2d4366e072963216d70c760cbf47b24ed4b29f881f6854df3f4cc901e976b034ecb34a4e0f93edf96e677ecf74aa2ab8e44c835f0fd9fba414665a7633a38ba96de1a195fa0ead544baa2c6b55cc11115961d7c3639cc14e72e90ca323984b9e4e49ac1be9abab4c674a8974d77112b01e56f05c2d7f8fbcdf2cbc33936602f05ba8957a13f4b581ef1f32274bb617e4fd39a130a9caf0a4820001ed573626b3545dbe799bfbb5fa002c391c9632d10b71f5cebb9654ac5c7b7bf3ce05f83e85303f7050fe3251099efeac80d0dfe499465be1f8a6ad9fe7a0f2ac983a9de6e89768ecc3d0a3ef442d0ce5962a710d23e8d7c46dcaea83ac275c59c5345e077aa201327958ca63e099a6b1b539a034b1a9e9aefd873684c4960a13215571ef37656f56da21f115af6ba75ae3aa5568f194b4d005f312517cda70691dbf4bac523123cad6396a8ea4bbebbe7843ceb4d95c0f7eadb94f642894e99abbe715337b42e281d2cf7ef769e584479c135dc364ade3e4d7a7f5413d485ae13f2259368549c9eb193bfcb605d160be8a1730863f757e91fcb473163f25183922040a2840e1858f570ed2c81c189c8c5f8a8aaca9d2c40c50b65e2ff0514a7f0de22cdea51e55ed2ac66e713cb9ad338d9d7a5a8b480c0dab1587ac5e561b37c1c2701a34e60266f261f6c314fc6fbada68b0891d51e45180ea2b3b70789fc5cee2a88811c1aa84da142c038afd74477a8171485112606c01e3b9c52e3739b0d6f52731014cb8d4d440d266a0b0d0c6c586b573bf6997441720877e3d46b20ff35e18202d11a327439457ab6ff084212981d4222039bf125a13a423ca1881b2e4ee417327fa2e4a6e2868b0f74d1733e01ec73920baca44f30c85dc3b7a410acbd9996bf4070ec7319609f92db3e02f76e79bccf24afd5daae13c21ef8a8b7043b49ddd194780ac90a9f2648c7a8167357a67e979623ec3851789b1e00732c8141f94ea5231c22d87ae77450a33f3bff474499392bbaa3c598a0f31d358c26ee1855634ccef9ee421f71849edbf0bf7722ecb8eba9fcf5e3b958f4ec52d034b73d195b49abcf2418521b18eb4a4899541f3ad587d428fb67a95880bfcaf3e20df626e1f39e95ca5be9cdc5cc4e2ca7794fa0ee73ea6a061741f8ee3dad02cfd4ece939008966e2cbc9d7c6f734de4cc46ff614918aab418cf0180c67f7400c92719fc48015cde48e9abec4e296bc95605b97115f3d98e8146d4eae7ea7dadfecc58ee1349530339dd3d6091e7c246169ae10c7fe5e02e0559d6e6fb49ec042c6eea3d7c514cbd85bffbbbf4c5840376b5ec3307111213036b36b498c88db0181e78b5c8b43047bb3d543f9bc8f96f4d3ebe5ae792038d7b82c8d31e218f66a5624ca68a454fbe2d4963b0afac5e968ac633ba48e60dbffd71d3c5e598a0420b22076eea641c7205fdaf0453d3b8a4bf256bc8b50c244aafcbdcd9da7782415dabd4ba2c4f2cfe8368c07f63ec9c91b93b70647d288962f4598ebeabe329de91f4581efe10cc58c75452dde64f6f2a2c2887463ccf45876b33f36ca4b848f325f0fdf888928149025d0452455fdb719092cbca63701a2d15cfdeca45e965cfcbbc52bc5d66dcfbdc5039c1f3f131a3f034dec6a6171b38113c8b85d228b88c80d7bc907c8d11b1ea99f69483d6c122216de56b3f944d7fbceae2df9cbb0d99fd6617b62476500c32d78001b65d32a5296407ce622af80d1e07e6bd523ea9ddee5751b1737d1d8f7d856cfeb5316b88778f5bdff376c66b45d3b2511be2c876e44947ca7b5770b80792805a48f611cc9d0b141a73c0e3d7cacd7984ac831652e851d524e317d0c8917d11c131da648d3a76b4a5417b96e644a9ce0af31babf68852a87012edc7439ba4c550127f24812043ab6732491a5af813a83c3701a4f5794b857d928153235267136b190e115797274aa12a8f7d49ac683ef5579f63acb9ad9aa71ca156fae383576f1c34e101a7d807305afa9c8c2912b07ef672891a3002cb3c45262c202aec0d312aa8f330b3e851d4e1a5e9b06d0e57deff5c52d493d7fe7e6ee1a03f3033d64b0c2601d5483ce79633960e8378371ed0dd3a4cb9a465bda14b234f628b07f789a22dce6c3c679cc51eccb1135872e891f5b9f10452a0592bcbe9e5aaa33da4415b3993fb6cfbe5c6fb288a03eae50ae4bd09bfd8b90b1ffc282193e8300162ca0e5e0ada4cac44d0d23f5851751552168296496cfc131dac3941f2c70f62b9ee14ab37e013e0bc0840827ef0255fe2aebdeb9dbefa63762638e0b008e42723347bca2a2820c0b20861e4acb250028dce3450179ca92add7c59a005f6a0f7faabd2c977fca17041f6a51971ce41fbe3fda02178f396c5912240841185dc7243695492ca311360f4a2133bd09787be8e1326c3feb3b66fc909a976cf9c66303818333349d28651ccd12036708005625f4fce8dd82b9c2a8dc6fc252f9bd9aae4889813420c323ab5c4b552a48a39e7f6608f4d3e1d1f610338d67211e692ad53ab33d15f299ba8c9052f0a1cb9ad61b89f7c58ad728c4aef4d0a3fcceb63f0c054708af415ac6bb4d3d4ae4600edae468ad5a03a60889b86e726209023c4ae695d456eac403af8a6acb476cf50c3c21c8daff66a8a3dd6ff98bb4c6dfca58317e892e8729571c2b7d51a09e591c4cd5d058f1c5cd813496802cb70ead8aaee76222f80bd7046315a4beececf8abe062812c23b79bd9fd97df4c7fdb8a747881167b73e173d734b07bfc767c28a292b29f947e74cbb17b3e2c6413ca0cc6ef5d44d76fb7b02100e237fe0c6cd8a91d3f46e6bdb535b72172dc269c80dcaa4e83ae4dbb7acdb730a40e9ed13a917a0659c882b11ff77b843d170432bd5f7d583b540725fb648b28b1b79187720b45771c16fdde3b370a849c89408ebb4fee96c83220e62f91e7d2607e2e022ab531456e47cab177ec0a2dcfb643b4667f2085315d53c62cefd9c40b8e49e71cc0f44c4e5830b79fb10fd0c3d58147965657e1c1af943e16904b1e9174eb1e997c100d10bb7afada81e662af6946631a18bddcd6e6a6d56448879993f7e4ead57991523615728dbc4aeefe630d15d6bbc6aab6c03dcec72612f6c16c0bc57797e39793fdefcc433d25a1cb70002da6fdd2154fc11bd1f65430eabd57158c50588ca6820a8fa63c36b7a9f31849cfae94a6037c0d8e4a2ab8564c110b340ea8c9f25de040031e7d022ab5dbf1ed8a7f0ab91de9fa47533192217bfbf955db6ea040f0721c62ff385edbfa4f407036ae3a6d2ab84ac7964dc8801665dc653f905007e657d11192418faaa487f85543f14402b2cbf6cbc8376b34467e90c11b2f58109cd120b9a3c548b16e229bfc8fb03603348af69bca4c05b4be9baee5d9648545fd1aca39585590b640ea4be7fc24d95b98ebeedfaa4ccbddac4910a5c7d93d4d5720f06e2e728048d89e13d7178dbc0176d9db51ec91dc0715405a80d54e813978010092aae6cf106290bb074d0a1c65934dbb8aa0ceee8c2a36674781f5c548d6106de93a17797d650ae090625e4bb65786645d24007a13270a8dd3a7bc5c4ee8200c15e589407def7e93111f35060b8ea1b89307d0190e5b8207d72c13d97e1b2eee06959211d5aaa08a6a425a8d477405fb78ae2346dca09667563e65cc997d3f315ece3f692bcce302463a608eb983330b79bb02c342d2dbd44226af1590e6b5b880ace51cb9f00b1bfe24032e964cbe283169679c2ff728957ab9018a148e4ddf93a056c88cc6ddffa0ce0db8da2589db6a79f4b252beb69cb05a9bd1395eb13478af92c4b2a469369359268439de951bf31eb064f69bfbb276c4f1d6526118752b8ca82553c238a06ff7dbc185e0590a41a51955854e4f994549e42926504d3558a58ab284130397a8f5371ad7bad9d3fc8ba66c1fefe6a2bb5b55bb4c10bcca7c49c88984501867787a16566a1d8006fe5aa8071c57f270754352718fa8c66779f10bc28b46ee201c7f23f76f52096ca61945ea5e6ef24e662113fd3167152e507e21710401471b094de5edfd48e6592a8efc8b13f3461f75d05ad357a66aa16cf5e320958e70d2673cb89255e042af0382a9c285594a31f76ef90901fca6e4a0f7876598ca3a04c1c016dbf6d002a89107f36c9570ec2a5f89dd550806ef3a33beba9629b0e316701c38212eef0c1e0681a87e4ca0d246007315f707b8c00a22e45fcc8010d4eed6019b5956e10378bf6665f099da34113585294885ab068fcb7769aeaca3a57101c64818d9dc99757f68ab6af6b9ee4c324d58b10c0de66ca8a9c9a0ad19914e6b16ad784438fe5691ce47e8dc675e6b577bd92bb276740f6e3ee8fccfedcf724027a7efbebb7882214f6da0d24e358ceb1d7c037acbcf611b0c569e4d8f99951a88862944b63cdd208045d920a1b0dab2005c8f3e4076fa406c0d5c1eb23570d83a67be317ba0b3a888f72432c93f4e6a1941e594b43eb48daffcc00099fb902b4f96c35c27e8ce7de861f46eb3c51a39a29e2a2b048b646f75c4f2dc9c7ba89d4ed20df72ae0c642abcff766ab4c4c96fa46de07b86ab72319520bbc4484dc96567ac7bc6ed3e91c63a57bc5b7a3ff5b7fd7d5ce3558d41e341cbfaaa15531a0b5c3570970cd79c2ef74628d6448d77f65f9c60b04288de2671ffdb2a7892b3b2717e881fc3499ee4c8caa9499fd153285e12d063f7cd98c7e492a92d9b17e7d98e0557b6a4f88d671db5de21ed85312a2cbd6b119124d0f84881e0745cc82a8fb7bac4e83388528bfb901150fe1d1d46d86a291357fb7415001719a7e49ca436a734865b68754d28e943001d218ef2d401435127bfe989f03b8c8618bd845aa3192dbdf1d12d5f859c9042fa9f361f5fe1b0c8e292c07e1b8d436402186bf00289cc5239d93817d97d097df9637d579e1d12160c2f235d482fe5dd1c8e060be773e5fa4c95b425680e0a614c93559e0e98d0b44ce21923030326987a88d063eae7d803ebb43a13273f460cf81d79c22cb2e1a8d10a28076d3a8c8ab03bacf95aff32e4028f5766551fd448f6de0e6816e697e7beda40a7e987b285ce84357500f7de6d78a8fe41103ad07cb9525fc8c842b248bf4eb80951e85b708b0f4d564db3b2a1e0b66709dc84f66d85cb606a0348099b65349e0c23be258232fed91cf3b71e62b647f3063eca3c27738d6bdcc4814515725fb7416d8231ac73808f73346d78a79f95b1e5d829d56de2f4cec4d044ffc1ef29f87888459a63a0638d22bdd04176f6272a59e65bc0bf65d1f6b5d6c4710713fd7cdb4b4ced4cdb185bb945f7e014d0fb987b581334c0e72704210ebc1736b961a6413813ecc122b769a3d8f537a8d6e7484ee864facfaf3f51332bcc2ec88b34dd4db3c1ddc0671dce1ea75c7007a6776d0547760555a2ef36fa081bc43202c1582084207fc9c93d6f160b258bbb016e92d71625f9a760812893cef89e6fd729c151062a0f356d592d1059bdcdfa932a1069c2929e08847ed7ce29fe3207f422c14888c5bfe20695931ed003f0ab5aa59ae1e2891067a36cc5ece7237115a7c65566766496e87e09ba0ad1f7ac189f0c0885be873a20f40e12a60e27fd59a92fd59d41e1ffe683745602d342704f623208a38cfc5f946d074a74bfe9fc15c3bfebf58990588d6d48ab3e04b8064cc2836966d0c0f063688adc6e4fb3fc82d659bf5374de23cf65f1e39dac29b4d5a6df768f26ed7887f33f17ab7f6833cde94be15609dd83e4847ba71ff3f17d5c5c7db5d38b6dd34e967639be6b450fc0304dc588b6b3c6c8ff52260189ea392e098b73fd887ebed8e23ba8773e00b88578def729ef633a63c036e7471cc91ea1d1b045021555c8b0cb8e9c5086cb232a11dfe316d5c421dd80196c9abff98bc9eaa14fa6fbd2585f68da0b97af81266582aa636860745b99173a802ea48f1ba5ca78c88909db0355f80b1831fe3e6709f80570994ce42a01d4f303f46ebf7cf6a88a74b0bd0ce61338c4be800b9bbef3356baa24419cd9883428ef8c2734a187ab01e70357119d9ccc26f6394b5b17231409ec17251efc2c8c9d6cd82a6762e91288bb49c93bc530b23bdf31f472bf89876bce98a813245d8b9df8115cf859964e65d44e2b05b29ffc440d77d4426ff89a48969336760c46e1a3215a3aa072979275a2f5c2798275a89cc966f91bbd6da98f606efd472a18d04354ce9f20038cd108968a9f33e233f3e45b36b5b7287231f3f397714066b10e54f168042c181860520fbce231b8f64cf57f24db74795e4a588ace03ea499430cf44606fa530d1145235e1347146bb7e1f2eef3a3932ca598a92a752324013b5d85538af4e794b3cda0cb9ca75ea0abd034e6f8eb08e2606f9cb1e0b0bd5ee46a8d74028effdba71385cf2b3dcf82614a6ced59f146e8e41be05cf7a3e9d14d6ac810bf26be90c2490c3b337151fcc267e7aefe9c55cf35bcafcdc14499b3ac552cb8885a588fe035ff3e71f42a49338daf6c30a67cba04ab7512cb4ebc4302505b4179b71c474c0a9633f623f64868ee0c8ec4a2cd8fded05faf1c51313fe6a339ae0b27fb5eeaf0bd51687e4718c87498ba24793676572166de9ad9a10d23e7d843a4af419c20dffe6192fdf13821d83aecfaced024d5bbe0a00970976ae998aaa46c0638fccf5ead94f1380edbe152aef069fdbcc99491ab864d089f794933aded2acf49f96aa2febfa9c276e6e58f050da633dd47dec3c9e3f1cc5fac19f5818581775e6c2824f11f705194108ab2e9226829aced50a677e22f2420ac828174e3dd36b0dfe05122ce1a4e7454a9749656e6d829ce77f88782c09ad18a8ede23aeee8edbdb1035f53fa0bcdaf8bb97a496c62a88778a4898f5a354137e786af04b195535928c22410d57a19b08cc0b00ac48d656463bbe0cf5b25f577219f44dcefd05b9cd523519d84004852a346a5894c191923917c42498c3fa36d260a386d836623ae491b9e34ffcd4713927ee3dddc2887f400bc663702613bafb54909cf2581ea60d69ee54638cf8e130c82777287986a7585b493837711cb11ce9af05317689ed589c37b78b804c936491ddce8c8154827c079754aa8100a5746393ba1ec0aaff178d0e5b09a57798dd3c14c3eba104fcc98a677cc59060152a0b003df559ea9aab05b738d9c6e24238c592f2a607a49deaab21691957c36a7824067eb274c4d89291f290d5cc4450a966400815c3d52a97eab5c9d7a53a34a66b688368de325404bf775210c04bacfc54f5de60ed6ef84c26c425c9819796bc1835ffa9bbc7342229fb4b43905e3ec7b2d141177cbb2aed84ae6ee339bf8c3669d9dcc5397aff1bf536ad2985a344ea28501463c31e5b5c3e5767474cc21732d9bf016b3d56e1a244127fa72dcc9ef32da8daa164284fff3423d2b8036c01774cf3651736a60602466e62327b978c4a4cf341713c4d8289038c933ea8bbdf4175e2e59177ad06d1be87ab8794fe65cf22afcb37e5b77a7c18ce5a54b49188e6d897cc991158c2599cafe87d40e6f8b7a4a92f46808c07213626bcb70a6c04540425f43374b96d8e95d95b6b0a11665dc1762114b214b0aa3a9bae7263d94458712592aa2c5d1dd5e8a86d89c099ab293ed39a767500bb5e76a6d44c0966443358e8bb1714655a0335b1518f0c7ccd1db52556b2598f7e68e433f25988ad6b4fc27b3242ec1f2f70adc159d607e9f9d428f53dfa04e91544eb6b728cba8cf924fea4da031b39b083b41479de5eb2ab00abe1e2730fe6da8f2690da044f73d62318808af58c6a84a739a29501fa74b7489f1dc6f053beee097b1690b9298e72873b6aecc1334e7c1232f8305209005e75880559d5f24f51c20630137f5fbc685d4ebfb70a0792fc7edeefd0c7ef1dc940c47601c88988a77e823d0f3ee3d38cebbb2bc728dafd0322fda83a1d212e2142afffa4c30b6d0df2af124ada78373c57104094d724351ce714714bfcc2b1442b37d2aef90381f9d759611cdd0671f3be59736b3f4b2b914f0c97d5ab6e4ebb8262bef559182aac1774e77927cc2434e80fd8ce72e6da6d937c971076f1bcf00e66728cc305d550f262d74a76b189a88d6e5a6a1e7bd166fcc9b376c6099cfaf743749b288da5419591b228ec004f3bdf4bf8f71a2c1106dc34bebd4047719b92995b0da88a7c2f66aa949f93072e43f53c3f565ad383181393d4e8d86d0b29d3fbc83ead17f444277a5f078939a94f2e6e1363f7ec27f5d882fe7e489dba1029e5eba4b530ce28ebf1e4b3e3bfea8b40e3ba255ce0fdd33b96e84685713c854d852095860be39affb67502f80bca183f4ef343521f89d1836900b2abcb692c1378f0a74512b2d29c0e0771af079e3f4ff86c08a90b99dd50db8322219e14966b87da4ce6a4a6fb0947312b4dc98b73b1714d47d9be90702edb583eafb34600784e6f2c255e5e081f75783d359184d0fbd1ecea6c881e77dba427cd19d60f1b8c0c08ccf7433fba403f96afc5b25d1cbef36cf1fbf88ef52badfd0a15f7844a2b6e202724ad22d719ef39b5d72ca02324b12cd95112a23160d29869fa0804a10acc2c279ba89cb0d0cb2a1e38216ac82a99e69af8a0d6078dffea4acba5eefdefbe4a8a4ce33458bda0e40cac2333725f3e917b942e296a11046c4c468b34e31fa0938a7bf59885c6f7418b348b6afa624c901a80b7bf484792e978d2bb12716b57883867123269ea2eca9307d08452d96949833ec6502c005aaf188c3f21027f32c280d1bf51b9220362bbc9b317f2125a115c7152444486d03ed2a30949779411455825df1d994ea2dbc81499464def0c14a0564811bd12585da0ba5203e963fa7090051a43b6d350aa00f09850936e4f1dea7797cb3a94d5921500e7fee87103711848c0a23328dc61647d73dcdcea8352c559d2168f797013c2008a2687ebf236a12f6a2308998707d2abcfa44e519a952ec4113b0220b189f0ed39c2276b713632dcd3a1dd0b82664a4009e85c26426d574dc1969f2eafb2922905750f3f36681432f8a289a8d809875cb281f9edec05133e19acb1562c46f6c2ea0903797edcf4442bb96e939ebf614063aa082a7fde4c6364b7e0d233b0c09b4b7b08dad5bce83185a51a552d2d893b2180afdf70fd805ca13209097e6a4b8c4fe92ed53acb374bfdcd5c663d7d60f111eaff44eec7912691805a4d2f4541ffbd9837005f62e2e8f5b83c3e49b880c82a15f3516af27dda129364745cffc5cacfe003e29cc8e5bb76b94b905c75b63825bbdacdfd703752f354419b84de2819c08f88db26b3d23bfad03f8c4fb6e2372569a9433944e5399bbe3d7984b5a007d7441d8b667bfb49932756b1fad63280d3be7afd20e53925033ad11181f9aba9f98d0c5f65e2d0399021754c9a01e734ade9664045ced519654fae5a2206c6d4b9b1880ee2db016f88f1f6f9f98b3ac85e44e58c1b78fad18c7bf1f5bd61f415ab0693c7336b85a64c8a04108df12cdae8b180c044127098aa48afb12f7dd384e6e44cda86ad6efde7d3c85a3b6f63406194c925bf6650ad2a2d3a93f8864480e6e45d4e2b423974466461a07e4519199bd64624cde34f9a163ec25b16e70d733b9a1b9ed7e0fcacc9d9c4a503f0c087bd4dafdc9d79b88d91759b35dc0c9370c491e1a27104804fcce6b80c29c5de86d1d9fd386f58d97a46c7d06ff0c86df24dc7078306c2d9dc78ea2883056ad4d52f2d70891b55549d06eff22ee81295a3cf0d20b8e865b9200274ef7f37648c55b2fd32ffe176d7666cc4c56d1d6540240eb04edf7c18a9b263eab538bf74333d97f164c81867857a6f814c527ffd240d3d67c0c6534799ee78bd5146ad41763332e41370d58a29cd34477522ba9638942fa14524db60e279608824e7a8f943bb8a448ee95e744bab7fc05f508acebd614995b363f83d620309cff69ef7aca5b3ac728693d4f2172b1cb68dd3affef9ca485bed03b3b45ebfc897059521b482b2f6e1977bf669fe89b9ee619cf764ffb819d5897ba0a971518de3f765f2398c06a4fac5be19555b6240beb0fc7d547d429d48b7960911a9e65ac88038f0a6c9ef03e8cccf1ba246767ba3d7ece89f20d31f51968a0682178a05d045048635944ca0ce456cf4d712aba4714e9b576f4129f59ebf80f44250b96c363c09644eff070b2b71e5ebd49ef495f475f9d780e26a81419589546094a56d05f5e29d40ab9525f129abb412a4835a6b2dde5833e9d3bcabcab3df2fb4ceff8649b87731b890f53f36df91c8caf79e6e59cc5145368528c1f84aee92f4f4feb671004eaa13031b526b91daf6c24b9529e1b067c7a3b84f31ba0eee74213a92ce646aad6b9c2ef4aa30806f5b4b27084b425c214a5055e63b017cee785123d488d2929fa45de901d74bd6fa7f4b6d6a353033a5bd6378213eef822ee4d25e20b21a42e6bdaabc3dc5f710643aa9e5a30679b56506340c175ae33cfb463e605428a52493af6c5f024af9f92da9bb40e0eb220b1c4b97de1fd589cf414013bb5bedcbcf00cf83d153a3d0f4c09d0ba5db483bb0862cc95a9bbdd6956e49aef35ee114f1a2451c3cb9577145fbfd374c022c9ac747a594eb070290f5a00d7cca430ca2c1aad2e8d5470c766e2765fe473d479f670c01d792c3cc9834e4a45df4c330e0990c2c34f12febd9117a56b82387810d77993605bfa9802fc4ff1195a07902fcbc7bfe1c805f1cbd2836ec781f60e388f0d5645fd61cf5941fcc2dd4f89175dc53f7dac0608ade04aa6f78a57a525257c0acd349845fb119e20a387f4a716c78a0407dd838a0930da3fef5fa3ff3b3a7a113467f4d01d305af8c99de15494bdb8c2793a9efc095cb4231646afebc85d64cfc19a888b30e319aaa4a90d9d9ab67c9839cff743a149bf84286848868bd0577ca0305a59b86a7e48ba74dff65e4f148d15492df8b252032f9e4891adc71180dfbb4fae62dc48e335298960439a05d824655423ec8c1e0cb004aa24919349015b9dec28fc8b0723b5411b2d984764af500155158b87ffffb3309109b6c626a85768137d4bb4dd8ff404db3f1addc800ced27c2f4c7aa4c826b0260a9f4b37a643105528b2885d5c2c3aa6f4d40bc7eb9810279682199f048ba4d19a24890317d77e4b95edd68dc89597c04c362aff04454d2b2575e9d860ddd2ea6bdfc86ddf389608df00f3dbdcedafc70eeca64ff7279c7028b7463f90b81fd48c11fd44bafd38583be5f383a78b76405f40d5571da405e971d401eaf9231f5f3a5673f999f0babe149037aab2046321938f50144ea56be6a52dc178fe7742ede0c65ce1481dc46abb0efd7caba5e2fe84e206db34362fa12215de627f529cdf351e6149d700de4c49e940a72fb1602d3e77d97158d2ee0ee12f5fdd0b0f41bd111ff5d41c3fd5009ee082cf39cd110226e589ea8cacbbb1cf5c1f197b3c5fd18e5e9ab44265a0575fd8c8d78a03e7dc20c5da9bb24f4c2816b60968cd4da12033cd221a80e0026e4e6949ab03f78a417bfacf8eb1b39f3daa58910fae19c5a96944fbdd9654518218d92812c9d44b1187e83093fc9edfa10f940438772ca01dd85b8d18a2c80ae4989332d3c01526ab557a5be8276aa9c90cf6e6c193870c5cfb66d0a5482fc790037388e0e506dc8e37451ffe88b647e39dc489a8d343e9ef9b12883520ee31a64988e19340cc0f6653f1a67b8514fc99119d47210b4a15420cfe14c476e9d94558e6a1d7035664fdcee9d4c2b3e2e83d315bb31e574ae2cb64c79d98186c636c846b49780ff234aee255fb1d8da095210322ca1dd943dbc3551ec2192a1ce6c318d2c351ce023b43d29262516cd5c42ef214165f0fb2686ea311a78d20b17ca75148263dff2b76ad03b615dfcb77c9bab86b2958147450c19c8c55a2acb1e03704eef46aa60a5f24aa1ffa7af8b8f5829320c56fc060d7ece5c3c287ba8b66f8d4007b678edb790f0de0c083379bed848ea827b85ce2d7e297303502eaec5ed0a4484dc852e27bbd1da8a6e8db30e6c56e2b8c7202df8efd7d123553754639da6124294219c933b02a440eb307fc14f4c62183824be6cdb62ac531c1958fcc930b759ceb9255c8b2326cbb66b500bba8a1da8dd7e15e82c2ca3fcf5d30dc06150daa3bacb80da321146627a8bdd1d025f1856e19d5c851daa2878e20e517dfddb92e2876ea261d7c35c217b7c235dd0a4d440339112a8b39a3746d2362f310f4c0173d3e2f742ab81396613a30f92858717af7b2a74db57c4c078e93a5011a0e305ae1cad181673719bdac2134f0588d3014ae9b954b964d2a2531c87060003865e01333019f6dc904cb1b9e54cb1038cd220a6d183a97243582cee161b84e8d804840c6993c9779013e4cd755f55243a26b7310f87face5f0a6ae4852873398c8e0758aa4b4b49227f4796855efd980ece42e47d9e090cfeda1b1d08db68c4ffc886f149511ed9c4f639dcd0acc0e09b0ec8bfc15ecca6c0ac752e66d2fbbcc413f6da20cc2010e5009bf25a8bb36f1c2f42af893d36d3ca97fc31c4a659ebd227ff3d0a6846464c4ea6911dd5f63b22e3a67a96bfbe13edd9243605522a0abb543195d0539efd8192bedf25dc35b67ae1e0fc39ee72438813c7b9a0fac1dc20b6d7b0f837e0ca3dc5bf381ee265d2e4956094bed670ba876ff9efacc84c56077d9887962842c91de3401300c636560cf92e10547be6727e5b8781037eb99156b80ae8970d128f0bedb61a5546fafba0c425b05fa6d56f26e4f582799b7270eb76ca49f60d71895c57fc8877d355a82d39147ad21d503940945f659c0a39da825ac90ec05f77fba18f0e65fe58effb7c1b09636773e7c2cd8386857bb633f0a15640284869332e8a2bc76714b206d5b9c02d5e44dd5f22bb1107807000dbd25b42eeed82fa6e0ae3bf5ed201d26871b5ded2de9332f98d212774c91f26ece2921d5a1c8b3fd8461dd57abeced68856b8f73c05a33af8e54dcdf5d9cdae16fe9bf427192b682196a9e58e053500348b6f226fc45c58fce74d63e04c4dea2ac65e56a29636991fa7d33a79aa18029a660968843356cc4013f0845e0f6d9ad143e0642991229cdb83cf587088a51f5d76c1ee215d2a502d729fa4d397dc909185a3a4abe28b6a279374362fe6107731171e5855bca6d1020e88053a402277758b09ff80e5e3485fdd9c5a9144f5c11e2c400681350c0e049f3571f6719aea9b9a92005fff629defcccf19c358bf4191f01080a1c4802810e058b16ca730e1847d43256a4db9f18c219101c25dc453acf9c3edb5b52525ce2a340c054b89e5870f84a94718663a2ec6dcc14dda733a9c005e20fc6cacea15910864a9ce808a78217d83e814ee31e87518b6ccc45fb2543b629e980af36db8e5bcafd8002a15246ccbf986182f809d546f1cfb079894104b10f548b2a38b896ca5bacdefa4fb921a9edf572c015a529c443e984077f522060bd6d851ad932a698b1290df2fde8d4868023df310122d2014a6bc617b9810c1874582b8ee5135ca2484c81ece382cd41374ad7386c071ed1cfbe0183ec14848d31802796788231ca64374ae1301bc5b3cc6830c344fadbf7f217187c0e802a0f64aef588a74c64978823c0dfe71eea99fb796c6bd5b8a8ac09618d89b5cea81f72899474c8a1a43663871b3ab353f6ce70aba7067a22d5410b5cfd7b7dc3d46d8899ac543ee52f3b0acde6d30b0077a209a207a02ca4d1ec934974e2a1b3474a77cafd42475ceac20fc3ffde2cc27eb7951420e5c4f629b8d0010abd436be784b72684b751107bc8a11c978df32ebe854d4e913669641e05d65a52ffecf95b9fb5415dd948387fc8019be23432df1de0bb419f1e14ac9e911b774644df2ec9fc450944fa1a95fe42ed971aff3be074007ad5996791551684501c75f244ee781ac4ceecf4906c93e4e6b2e74984a04f0b1909da6a1a78bd0eb2da32cedc20522e992eaff767826fd014d5d71fd1151ad44fcbbc33c35984f06034ca5bf6f8ce9f050116ba2c6770d0c2af9453a54f538a75b4003e6c14fd38c1ff1e5b2b98c88b46d2677062f59ca150ce3465001a1a09b671acd76835091ab619455619985ed1b38ccf1d8f88e9acb59a2ceaac1ce16e5f1d40c05d5d938615a1a3aea0e31dfd07ab5497b0245b72a0a429a3eeb9294a370672b0f7f3c5358eea67f82c9c349134d032839b9aff9d932a36bc51e2c80d05b411673c911b963a0b0081891718e3f61abbbf9ad57344dbd91e5433f18fe72214a7d2418101f142fdfa22785f2e024ed091e0091b4f675c94da961007b0cb016f8a594a46e2c3dba35530ee853a6ac6177fd7db8b22d3506c83503f32b85db439b30c41a31d76728deb4dd4efb3305a32fff365b0a8922d26e1700cdab25d17df9eb69c6f9d8f182d1f0d17eac033b1b4d2745626dd30584fd28b8f3d032d8feb0013713f3157ec173cf85f3b99b6341698d123c33fd247145487425f984f4744f726fbb2cf9b3c86ca9662e700c105bc179cb44072fc6debccdbfdd7cd95a5e8a7b53b9644cd56fd5dd92a9a731937f2306f88c94d9894ebd705c6ae6123920b9669f710dc150480c3281290223eeef0cd0e817e76ba601c8a56f9d1ec3f0b258ac7730eba2176608da1b58f6aba9c4c2b86141925f53f6b24d5c92a684f18953597b000bc49f1a81878675bfe7054ce40ee7f97a731431a9e6e49599edabc2a131a9ec5d800104659a9f97ff5ef5b83e61e0e388c1799e912b78ee1db9baa5fbde93eb8c23248ac64fb3443f2188ae60b9d8fb38228ef6169beedb5a1f07a94ed89ba585617a86e983370d6c0e63ae270a0c21bd39e5fe97b076377f65f5ba26b7a9395a014f36847782d720d818bed2554fae10340bf87975b231db5c0e4ac9b186af96738f5171d01117b5b5f0337134fc57ea8bbf9efc4a6b0b146b063e930154d863152abbd44b742f2fcbd39a2f48bc3ee4e9e1a9c1f5201f7f60a8bd0984901d27ef3b2cb6768e38239a113a477ad1309cf9dd790159f2afda3d8735aaacc2282a3875120173d935bf9aad78f4b0c721d7c9d297f5718bc44102def9c8b08e1813ad423863ce46cdbc120e00163add7a03ba9e730ccf9e3ffd5e3870f40e96ea6e4dbaebf99d91499650b48bf6ada82be1cb3950c8a53ead3019aae2d580301670e3907da2a496e6c83281314a926aae06e7c74ab2315dd834c77fea2a8fdf670d0ad00d5173e3e925319651ad278da5016d21bb15759f53cb9e21fb0ef269c3eb7bf10b2548ce37b123e8787c59ab9fef99a8f83852bc242088655c185a79ee6f1e7035bd232cf533d4398957808991a952b0ebba3cd488bb7a8d037ca3444958c4fedc2899d3a7c9756ba86d1b8187ca2572ec71049292afb242e356fe063362bd866058fbafd1cb4156a44145e62f04b5344b11ed693b00f3b19f2d104a93005535f54d70c67872aaa6ede134332501d92a836d432fe5d8601984741fdd99edb2a0034efd7dab63f204fe8fe7152f1cdd243c7566c75481335c2c359867575d1464eafbccfc86b19c70e946837e9bff206728e70ab1ff5c34a194ead781e4bf3ad23a6cdd36adc765d93715d0d3351e90cfe2df56b58f4441ed837219c0f720a6d319e6907a3ac909ac4b65ceb888d09aa298348f3fe1fdcdf3cf4647774dcef871e5c31e4f0a60c8201bf8360ee3c45a03e05b4b8b3eff1a0b51dae12dd4080b25814886547b060629e11c5dcadfc608711eae75325fb93323533cc1d5e2a291c5482e5f61b1f5c2a708b4dd9c91c2030be3e158c12d33a852c1235623f03aab587180794126d4f2b783045ce6619cc549d51d1133e65c68821caacd985c4ea1592e531c29d32c001a16dc81bdb6f2117b466f686d0945a5612c87215573f83e151eca21d885a54d16aa861b42da0900f7481ebc6d55f7cf7d58d5cb95e285d3560a098fd8cbf2a468ebb520188d6f7886fd1765a76c3a896f276c435bff3c6f9c0b93c08674a82681a7a3f09680250a17c4f603f2197ce84c47a92b381232189b3dbbb907bb0a9f969d263c38f062428e680764b740a911f6705e040568c533609d9e018f1413d71de4e8811f47becacb8de32d29a3b9de210c8627f69a4f4a29bae42815524bcc73035b5aa2014732449d331b41646d96b766ed86931a8f16e74a7959ea9d59a695d5f82b244df53d72f0cc498a45d5abf1bc2dad49fc016c50100fd5935a432305519eef195affc53c0f419b7eac9b70a8feb891f8bce98a778086974d71769cc9e643dbed2e7527e7f059eacdf25238f744f0a605d4885349aa38d6415b8e7f20f80bf5759aab715c42f46a0cfcc31b841e317e383d154406eb346bf5413cada481f5a1b7c027b6ec957066dfbfd42ef056bb7d6b54b836336d4c89bed350233577ed25db424dfe8e6d8600b33e7f29bd109d596113e56b5cd6147edce973ef9c3a334005e2b1bd8e5c00f55da192b44011c091d4f54315ee6f4b6cc479a39387617df85f40f5674e85b92d6e90f275b2772d2639a8773722e5ffb35dd9897e5cb2378d8326a0f471d686d9e53047ed15ed324078a430964577608360b677b78b423f7a87e735c19e5bc95930aa8893c159bc91af99b520cda343f4874dc41711c20ba274fcbadcb05944aaa6fc2341d6a96189e00477600bf27058212426ee737c0c1386abc3058120afe5c93aa5c8b2c6b583c8f20a5a010eb2f010c09899a9e545e7d02cdc7b5e0d762988ba777b1a214d3f1672b477e697f3f466e69e0a4270f8d450050dc162c178522683e613825c41fcbb9dca28f94070a4c04d0f740eeed2291730433caa13191842f81697e8b6e55b0ec711121e1591643a771f85e7dc206bf0687c59ae8a69f5d23bcac7f96267df38f80754165c1d1d71bae411e604083dc0cd4f248cd83021129d498794de8b92a6b3dc14e6818206b76b9ed2c031a9f620337e700cc2e52fb257b3f5d06805f03918441141ffeea801247c5ca64966bb618cd12095b6261a17ca2c451bdb2dcc7b0d15833e41fb9772805e50e21f642ae21e2e90b4f63d546466c10de86493f56ffbacc7928ade04b878d3149f7eee03ee55e96659fac882eb1e2c3310e1e5248a21470771bce9a72b208cef3daf7a8455cff95e579c864379ee2a26f7462c409b5441dcdfbf3b333058f6c2a8a399006299b634171d1ea9b065adb7399b7dfdf17d8aeff523534fa7d8ba52f49ec94d2d59a63b701f0029f2d20014436b262a075e4395b06181ba353a37d92855e4c795b18acc6293a39ce6dbe04303dd78460d457535e8c4bf951a6a471bcb5a00e233e3b7a35485b8d3054ea305088ead83549abd33e470aaafb8b668b61d64bde7086a20a378d656a7f30fe71f95f282e116835432eff272126bdc312c74b3538019d3a9d2c94994e3590d273adc295fd12bf823c69b8ce02c14a8fe3352999a0c98ed8163279ad24fadccce9d88ffd197447f1f91fc33f5b20dbafc86ae8e89dc3efd53a2466d4c859c0290fde3bca14dbf3bef1f99535dd9293104782773206c7ee09ed6fb10e4936c9d8b86fec820af511ae151769a1913643966d73092b801eeeb1a0531ba8c202ce0873260a813c0c0b9b76d9a90b3ac46bc1523e6956cd1e85bf01ecdddb70b933ccfd8c92dec9cef35951a31b462770e417446372985fe4ad025ffa3bba47734118458e00e8bc9a706aa21dc4affd73d8407e350559ba6c4e941c9841e4d2eca936033744db3ce653372ec4c3c9bbf4137bf951f4dffb5cba17aa6d9035f6458e321980ef8a661e3b7cbc64d30da4522a8d9798084df1b60bc29f672643ff86fc6e0e364698a588ebb7d9bf34d3b9a7ebb78de93712e81705fa0eb69e4911278131f6fd63622fe56bc47b6d3a4d56950ce962fe5eaade0f57730655ea8abf8ade76b65d2f931d066df7a5a755b32c0d4503df6cfc8bbef51fba7f345920db39f9886f56bbb90a09170b65f196dc47ad219634265f4a2efd51c5d40ae5918208f11ea4ffcc2afc46099f984410587075ff49089408b41778c83871050ef6de2b54299864a5f44946f8802e5b359b0723a4d278cef6526c6e6d3550c3801220322c47af03d60e4d111c32277700f199fc87f0ba46bc4b229c24ac4b5aaf8b087da59c1850870422316002e9126f0027ec370928a253c02dd1eae2a0dc01421f0e18051ce8ac8dbf7864fe5d8e609a48f404292011b3c73d44fb270bd81175b6489aa24f1c2fe549b686a31fcd661ff3d8a15eba18463bc08bf51ac256e58d9ae965432f4ca6cade812747158790b5dfb6234249512b252352250c46dbf2384cd9482772b24f5230270083eca9a57c703995c11f95d204710a103f4f7c4a7a94d98ec8f18f10ccba5c6c5cfba113fec12c19f435d87b837d9b87bfe6a1b3305d603827b57ea142be25e3d85c34d79cc0faf6b0caeabf1ee3dd0679bc69fd003f1adf9d2866249167d353d73262786e0383a9cf2ac9e45e97ed20f54fa30e0f4b76446fa9e89dc8979ad53b8c1339448498e0a4e0ddc3fee6a19d133ee2db25c794cbd7339245df20c98e846cb1f41a824b457eb799f665b653f6dca648cf2d2eb5b3a347e10ece05064aaaed90150333c9a025d11fbb7ba82db94440de0f55c69f2965b4a143f81f71cfd3eacf76fb6b2052e8e7ab538c922c122eb3db094e8831b3c41c6afa6c1ca8b37ff8e38c83dcfbd7a6e3e2b52f7932e1ba4c4ba88d450532e975beaf7cead8439d43dd6184765221b9b5116c27b5228c91374697ded7c0df73ad182f44d113068691a1e38e6dda12ea99045217b373764d84c54347a148084a0117c20b6234d2f54fb1298bd763586af6e24a65edefc04f3aa177ddf0c66851f1f2cc5c2c7bcdec514cd2e7394907161977cc027b71ec7807fa0d90df52a9247822ec9906dda0d7e10815feede988ec7317f4b9dcc17e1e95c64f14593f889813e7044e870ddc5a556057676d8ec890e9dfad1605eb14ea1e91293857204810959dfeabcf38f61a488621b0bfdd060fb091fbec1786a0d286570971d5f8903d73733463c01a99990b2440d05b5510459aa4ce116b0e1baa5cac18d46fe0e63dd16662c045233952ad02f73c5adb3df28ec418193a1d0febaeccd90c878a7382b86d85570dce00fb5022b8b18dc3190cd2e4979241d4ee0e0968d05bcb93f26cfed4d69dee28e88904fcdb0266b34a66858c2525cdee9f7fc2058d20cf299297f99dfdc7638265f8cf960d1a8b2449b6ef808c7010a509a54676106b66eae4bbc50d35436f8463b8a16427a6b7d3d199c950d7cc337dd24d49ffd810b892262272f507e6019ccca5fdca7b79592c2c5057e1c8b02d1e6e8652dfa097cf63859831dc30bec6f53217125c8ac2803853ef6cc3ccff71911cd793f3bf529a865183a1fa00c2a791a2c6068d34ec22461ba52eed33fb4b33f718e414051efbf8c91fd9bb7024795d7e7370eea72eb9337ae22a12ab504bf4af70855af027f183430ca53ae16a6c869784fdfe805330dd8f0b8bcd7018d24f39f13480c6a822ad88d1dae36133084dcc97015dfe6bc41c2b224b1be8640815442aae50baefa98dd6d25d2bd8b0ed2ba20e6bce714907f5e6ef7b1b205911b9044e26c54f1a1ae09a8d395f68c82da3d08b2eaff2eb2cfb5cc0ca6b431090e4b3c8bdc685de5fff6cc885638a28f5bb79633ced9baff8c9dd991006ab1e10e3e339b01f322960565e5b7da5baa282cc5b23d5218c7e0cbb46fbfee2e09189496a5e327c58ccd2573f2ca0cd11fec43515574a64f741ab4be0ea88f40e98f4cd16e5cae382f98b6c3a2a584a18818c2257ae8e0dca30d655c7b0307b6b0e7de360e10e8003a9115b8a0b9b8cc463f2dc2e8b1851eb1c823111dab5e38d45128c8b4f63c984aa990b5708669e2a19caf405998f820fef5638821a088bc0494d28ea7203f93908d68ff19bdad02fa461f44256bcc18b748518ec247c709ee95098204ad625cc6576a10c6461a8392ddf7ee84684c76422626de09168a995eacb346e4522bd016ff9a82911da422f45de69d309fb8dcd7e38aaa5e0477f08eca5ca7557132e9a7df87c15a4b67704bbe9012d0c7d2033a05f7d1da59f1f715181ef4334aafb2cd04feeeacc2de62bfc7a13b3505a1a5eb8d4f5dd0347c3672d40df958675d250879c564dc56f7f52c2633bbd233cd5e55fb41d7f02caa5eae4c67b60b0e1a87bcdf9709003f99fcaa87c4b4606da0a99cc8ede07d62f77eea0a4ded2912df9c83f47b0102af465abfb380087f8f926af6a2db9041de04d898895768e75d998a88254561e3a2b139c3169e1bdc26e180cc232e6d62f3ebbbced4043efe7a1ea930ff3ae72f05a20cb5efe1edf003a3baf381197be0bfc8775bc67ff714ec1e4af6b3ea91f246073e8e1163c125c480053c8d1b0de876201bfe3c2b67aeb149e85ea348038374d3d76709f1b9e43d91182cd96921826d209f79b9ec403ab38a0750269de10335cc3218752dcfcbe6305f8d3f479796e5e796840d86c2721028371fd64f67bf13b58cd5dcbc73732c0e057695df2d7b51a22bb11e9af6d100bd5077be3e7200ff34b0eddf20c82b28e96974b24dab505c6a4c58652b1be320089b8cd6ef715b175008f2cd32a83285f64284ccb502a767e018fde8846e61e57fc0b431950a6f985c4774e04810a8f8b2e696bce7922219a271e44d92851fc7e6b7f66c465c15c50a8b8387b24bcf6771f72d3a91435b18f39c8adc9a066dab57b949f284e5f5ecc86702ca64f2e061a3a46c3ae65a07488e34795fc0063e20c16fd2c15a364765e02b373bb907f1181f81525ab6124e0b42a639c44ad3e7526ca091d403b1371fcc17812afa986f6de0706a79b3daceeec75e682b58a2c977e7e2e60ee37c8ad2ee03240cf92059f3cddead4fa012c00be93a3d7a865aa4f985b4315b55d903acca1da5ce39c37f7b4ce6b735716aa940fd8429189220775070dd4947b4c00a23219f86ed49af4824bde54cb3ce520ca32da125669a8519212523425682a7a6395a008fd21e22666b5a2a83430b4af8262fcfd13cb88ec1b3cfdec1344cd36bde20853e1e23a491fc07595eef506abb93ed1d9fbdcd7e4c97f8b1774a510acbf3351164885d8419dfa3cad3594301f1fb8b493331f224eaf95313ade4ff3ac3b245207c65b1c3a5218e11a8d046966ff79e543d9342dce26cc0f847b3337b813484e97653c878e3f0ab050369648abc35d9366d1f58debfcb7666826f9bb7db52ffaf72d7bfb5cce5ac08b02e12a084469718d0597c4a052bcd98914a6986826fc33c682abc59a54003ead8123f29fb73dfc59a16be104225b0506b1f9f2e92d7353523cc4a8ae1795058a8e19dda6a5ba856f3e51faa77f913fc4255f2a071e8dba4f7ad0410651cf1c2e13b949a18122475407133842490be82adeb0a5da1ed6b814bfa471d2e9d12ac24afdc61153deded135afe4094159fe09cb505f0f6cc90b862340349fc8ea32108aba9ff6a618786c12910bff32e39953e165ec287e19cccf804b01efbdeb73d081e16e967583693842fd9395abfecb9d513bef39802e3c5c0847772b61c3f4d17835ce814fa6b077d6a3eba09c852b41c152e36d9314a12f83e751ea08f2fd2bec1bcb43ff3fa45f4804c6a80b44a31fbc06cd9652b6e76778307a75e13c0a5863ddf30b5c80e8b194763204209e2759404ba37b3881da740c3aff88f26753b8ae2526fb609a0689e5aa20f94657a56e79427c016be5bc9a91f438d4106782f531d0fda2efab10f016551806fcbd3869f2f8db5ddd819e81bd6d027747aaeecf89914eb3d544c29010b7dd91238100f1d354e87519fdf4c15bc8d0d15d53130a37e077151f1dd748842cb8baccdccf6819c678eb6ce6b2b03786db49c314b0bad4ddc555a9fd6a91fe54beb0804a8e886156c8dce1c6e37b64419b5b25b1428d540abc565e2167274ba6dac76934b6c34c73093295d0c84c9daef805ce05de0133182ac89d970f09d3b60e32131647c716748afad50e2deb592fd48ffeff216f5b6041547eddfd941797387e47c3813256af5b6b11eb51031081afc2de3f86c88249771e7ed5b446e9975d60c4b8dda956147ab398d9dc93ab7cb26ba06900295d9b57bf8f7718ed0adddb10cace913dec60941351a0b4970200863d35157141f88135b90bb3c66e2bcae3fa042ca1ee53acc23d9ff9a1e7aa75bac15c55b8744c10be54609f1fa906f69ed26239d500f2f44671ff6b111733d33dc1928c3e67f9b4451bf022f9d12b1a746fb1956e41528864a6dcf78b25f9e97ada66b947429eee50c042e7cc7c8548f437b227a773f1405a7d31d7e079c3d8e2d1016050fdca084a4ad4ec42d1a5a244d884596738198802c5e579638991921fc23aa302010040e78297186a44200df162460ec2474fc477a982c7094bd4e2c63352515dc6067fd1d9b8714d5dbe6146750601bcd034f6ffcdca6f6c45d2d610afce88af5db1316fdd83fbbf0c0ee6737942df0255ff62c3bd346f218bcb2a3700a5bdc5e890a694f6c12651ff647c43f830b06ecd553527de8b2acf78b5e2986fc89d5de2183fbea7367054feed41a13130ba7ec287c5bee7f11f0c9c3c840ddd063d752db25b1fa47185136324d63cd827654e813b491a1ec18f65f33921842771563f47044c494ceb3e07a429c405ab4aac3dceeafd2c17f9010b5a21d84329a5e99f053767eb62dcf5aec10e9f3ec96f0542c61e1768be520e3fedd67aa160f4d44f996e5fa9f9c142a6ebc94c4fb462400318b17f543abb6a816b1f0ec1c4808a1036d3651d216695eb9371f586f3e7b0c9d874ba55c85281169bc4a0b9297ed9b312ee1bc70b2e4a57f563a8676780d2846dddcc592d3af8209adffbea9a9d2d422956c4791aa88ec5ea0b3fc00f0880fcb86ddaca78b4745c8bd18ea602ad033796657d6ef6edda0aea8bac5518bac94284d437a3701035fd7ede4a6b6b84c90a02d236c724ee96e2f6adda5459540442dcdaa52a51452cba8d17723d121716b70ada2c21e2115029c16dadf416a698400b6dcba2c130db5277b9049b81c352835bccd7af89a35ecc03e5f3b6a36dc944f9060fc26c9ba4d2e4261f104d23714e92ca4ee889ad366501e1826ab5cbd4a0fdbbf5e79210565a75017e6d049118e6058c87eaee25928d74a8de1360c25f9ed31fdd438f8c370a8b7eb292b563a428aaa9821d7d08d7ff7b9d8bdc4085276c69af24d4188d0d770a2a93f2823fae28b4de99848bd34b2874d802daea78a51d3a9f717c787b12ca78474f6284248078d7e00c6641c3995003fae6f60231c86df1353ec907c1a937b0b4ecf0b5d1ec5030b5de9f042dfd5ed68f0edd0352b28a1301a2534c6c1a9e6abb8eb31a8aca7488fc555ccd4a519049cd781c0bd5950fbce528c4e1d785e0f426b4409ab1463172d9e83a98a123e295b9cc096c62bea0362c55a246b94ed3293bfcd85460b42cd5ee7c3fb5c847afa4771550d4399b50701dd5fae88adc05e7b60c44f9678957a9d89d0cdfba1d68c3089bf1d4f7c4a93fe56fd5e59613e61835149b9e555d8a75706e18f5eaf8988d7c5958634768a05e3118deebb4f6b81d728843149402c4209c3f98c564ca329289b090daf207f3f29c4a0f9efa7660e4df368fcf7f0251b4394e4e9e04b138982e871880e21690f007bfd712c34d619294359375e82c9d7da3fabf1299c763afc9fcc7a44b084eed363715cf206676f0058f650167dc70391cd1eca32d7ad6e464e2c1562c17daa9bf310b606c16ff125115ca126cfc0bc42dcd9ca9bcb3c242dae7d71b5131404a7743c8c0b338e412bf91f2b1a6f3132f7bb41bd203db12c290834f44c46c1b859baf275248b9aa96de535278556500ce46babd638eaeb8415624c948d569145051ed5cf99d9e98d13ab93e3980355ad1bed8c682d1de8fa05c0af78e5d85ac55b10a15b71511e89a25958139a5d1efb8b871c905ba615297e0ed22f07589f9d7c41bdcc44cb8171416da19e3f6bc5be2280b3fc636abd6d1514ab86a670b9c38425fb64cbf64219a55524ae666cdb7ca8528567b210a27cc30efc19790ecc446132a8ca804b5ff4d80801622d04f4312467c8ff01a37b6fd6972dd0551ae41c56340677d7ea78be07c019770b338168f84fd0219b3656ffa19a202b41ff65a0c9e475b39ab4d6c175086341df6d4d1091d46d530ae70019bb9a68e8e1656b80adb5e9b042f525e5ef52fa9180139c7860899cce33da37470015ad204391b702caf62b0a77beaebe20cc203b5d9725a0d9709b683180907b105a21f935dac0088512570f2c4caa2ce3de3a52cb86940c680adba699bb75790e1d5b67211f17a26889e09003613293ca4c6a604cdbf8c8e16214ebe3d93ad3992f137eb00198a2619bb377ec81ad87c33924c9f7ceb39b72f5f82127d23ed95558eabf2a6913db744b143737dcca563e9575c3d1023d3be03fc9305a0241382c848c48fabf86e49a3091a1286c616a1a2f582d245a8a26453df3a089913cf39fafca9e338c575f289fdb2988dea2753f98b9f2ff5bcf0dabc1f921e3378620e7a0c9d331ddc2367bfe95ba99608d05d5f8e735eb11f27ed2e2338d6620007d117ae47c76a6df13431dd05b9d8449f3e1b032e37956864a53310a72aa76c4ad7038bab64f942b75cd3298d37ce93b934cdc8fadf91edad8dc235100c00b5c57d35a6189e48af17c9aae53b591d02c82a8c8ec0f872ce6f11e26237542f053888d6817c8c0634a7ee46b128b6305bac737c04e56933449472b899ec0e9721a42eb598699ddcdaf3fe9366182513859d2b08e97949f1254033884be9ff310137773e84683a4294199890c081807374a8ea10ac5a8459d5d86c8490b49f302c8388969938dfe0325f7fd958dbc267535cd289336666cdbcf8b1b986961a8e316f3ab9097ca66961de015976a168e98b3b939027c76af578146d0bac1d70805b907cfe1c6ab0952b5475b9c5b01c7900afd99a843cdb3227d46bff4b875256bcfbaad91faafe40d7b291f5ee5c9fd028b223c64f78feb683bd6327e54b1338b4e44baf52a7f82469b89745fa09956352b62271df87fa11f14fcd85304892c894c05e4c279d125e88a8bafa902a8da904a61f599ae8eb809035e7a86f2ae27df46f5713fc6616ee3e914123857ed78f2836008936d3965a35c4ecaa31c7d04c490368c8f4577751750516d3b4fbfe149bdde0f5afb0254badee7fe029d2fb35beec61b771070e4d5e979e7df7123927939b6410e77f5a68cb801a1ee2d4e1d4859d08185939932d1746a527ba401293581e274e60b06d019a7267a45fbe7d85386412758fb140672dd41e0f6a96a7521948922dc437a390bad2f31555e22766153d003645cf32a6ae0c216f32aafd991ff017a17d711ede11e6936bbdc842fc4f8295cb9d78191937aac8cc9c6976ff47b8f65b1664a78ad1b89a4034a93f6beb5954ca63f8824d16a16366deea55b5c2bb71f933187e2f686481b62d5dd87afd08e686f7d0edcf35ed281739a1c5ae2677204595aa7de719be88180b8331e5e0952ba00d89f300fc5073671ac9de29c990d82aee39e64fee2b4af0e6705cbc920b646f4d8df0b47564d41adfc524013d86c1b38bc5e3e12fd305b95381a5e2ce8fc53157056ac67adf8950148a28ad2edf53a6c843398c790dfd24a975da6cc3119dbe3513c15cc806a8087a6e0a9163e33577558b2df85b92efc736450ed024745563d5de4207b66544096e6bd9bbca76eb2d0f1d8c5b28673e9fe943bbf80ce326088c98c5e6fbcb251d02b5ba952016a49e08fe0e0ec9951371a1c8a1b204128370ce9be78f28d190dcaec750c28b76d0a408b47ff4356bcab8265eae3ae570ece685fa9ee6e1564212c95b6a8ada71bb24a3ddba5a101f49ddd7c4f6968d579854e0b1db1461c526918f99b93657e689738fa263a51a581ae48d7c9287c30486b9836548b110939a5504d28a48e785e697c07c487a19f51acdfc7958feef92bb5e61bbf429e27ff5aaf29c76f543a544644017764f9d304c32e8047e2df19b0a387246db529e3d766f693765649090c00a7e0db46693629266b9121b9c227d6fbbc68d1cdee561f215e35d8cdaf40697f5b939af55b43cdd25cf1eb17b1a113344ab08bb10af5f1e4cb516651e6176b5b54d1d7b00d22eff98394dcf2fcef0853913825e24e0a34ff47e48fea5c96960675095c1ae67e8aa940e1bb25feb9a83ff45f16148f3ad0670289333fffe354bbe8d10f3d113a83754941cb68b845b0368f6f74d6e6e2926131ccc8b9e586166141adad375cebd78554f5eca88b846e13da460805b1acd61cc58eadeaa82960d26aa1b76a199f90a536562261adf7e15b49cc6966cc760aa5de7936fbe02f82846a720aea1e80c5619e6e3a2963bb814004e734f7de09c63dd162e02164154f5cef99ec76dfc34c20f98ec2948af005246bc565836afca237154088681561c096c96de2bb9cbd82589ba7a56967666843ef826d06a26c7229757b32139b7a4cdc3520c3fb28699cfb7c95de631e5a1f9735fe0168be9cd504cf3de718a6e65aa6f7f3831ab4873919c219e3fb6fb98297c194a6315de16235c618eec9c30986682233143f4047d0e01570eb48cfbce0b5f62d6760f698b8513327c1a4b41133a9331226981d2d43ea2a73aa9032998c371f57954c1886e7252664b213822ea6ea98308cd14b8d8cc92758ba882aa6f78b4a09d31031f1f73646006b344c154debb559c2d4477c5d040aa62b774a07d31630fdd01b6f005dc9f0263e6ea7807cc98ff1e2b81ce0a91795275f5df7ab9878d9c6bcb78588974aeabecfdadaa58a24f8d2942e3da37efc56f3e31ee532f7627c02225ca09e22cf4cdd9217335901cff1c307001c09b9da3c5bb56499f3f5d80ffae3365a26f74bbf54394bee47f509565908349a1da78ad51d0ba32ded797558f2337bd4bf010a3560c30196bc0cd78765c5e0bcc2b7c0ac5c045570d0e427f41520cbb76816af0ce5e00c6a4b44df2027f7d5c0f84732f161a9aca54f1f8bb95ea5d9f2897a0e3df4152ff1c970c3ed0ff1f7eacb52e85f577f248e605f7d7402a6cdea7f3053c957df025a66547db878467af54ffa5563d5e791433c541f18387bbefa87fc289ed5e70610cd579f05b849a8fa1fd774f6ea631b48d8f51d4b1ec1f537ffd8e5d75fd555445c5f32280e5d9f4cc82ebffea8562d767d3819f9e0facc4296fdf53ff9f499d7f70649f4d7c71e6a175d7fd54b11bfbecca038bb3e3900bbe0fa835a5afcf5416af2cdebf30559f6d7ffc4d7075ddf5b26d1af8f7da45dbbfe5a0e45e0fa220371fefa440476cdeb4f6569f1d70789cb87aecf3766d9afff95571fbbbe6f8844b83ee611bbfefa23b6e758005b7bec77103b4efe79ebb12072f882719f91f032b782d45f185ba71a6f0745ab978e03393f93c60716fab463e89ccd7066b2b5f9fa6a4be02755c934077a08541cb65d7a4503860bca6bf786ebcd6a11e3518c9f8b0ea2d6daa56bf58526c73254e99f25da183178cbbdfe3924680af344631cb2bba0df6c142a9c3c4fc93dabd082f776339bdbf13e3cba602db3135b9c2bdf0c050c66f5ae4f5d6dc3c95cdbc2da2d52cf0e91836266b5edbc01261d0b228ffc632700a3139531ca2b0b63d8cf0d0203e8fe13b49fdec864adee448a0b521752617d0066e4303e9c94d65b237e1d008e0b041b25c8fee6cc96c30641d6898e68658878dfda8ef769439526e76d9fcb166625827b717380ac5af57a615c404457e8a100759bfb90066850e8f805006549eb0da8b53e18e49e5e893752a6766b9d22edf911df35ec93a3cc4a433d9383110af72e191eafde6e036ac8c7c558281ccf4451dd00a6be64ddcfef1e2d121a74bc90e7e8ee5d72303011d11027e4108036fad0eb089fac89c2462e46ae4631a13867441a8589a228f257ddb201c53368be5b2660cb9ae9f3bbc52c137904de7fa9702cf0169a9bb94fb8d13c86dce313a36ae0609d099767d3ed1875364a7d3f7a96002c31a408d90a07311c329f52eea16f5c2fbcc386947a6188bcb7ee02d7d4a8e380fdfceed8bff2cc7ba085282cabcd55010d9d7243b3ba212231ba098bad35094d1adb69c597a8becef7285d07763fed0ff21a5eb0d7fc825fe31bfc1a7f90d7f082bde617fc1adfe0d7f883bc8617ec35bfe0f2127152ee3ad6b5701715cdd257d274ad165c39c9c2a468e94fadc5e4072d6e398f4231f384921506211f5055f494599649272d4d0a92efd9ec4443114006797907e554046e12a4b74b93f4b203045d97870b486c5ff42f2459f4255d442997765d1f60d0a4c9e64a3de954870798286fa3b1ae5e38d4e440664abbd4ac83174e2685f87474e4df7cba8077761a3b46657a70d89a9078889e12bc3d1af332a558e586b44165c1d8996a7b561c265cf485c40ef41a0de5acbdb0ac0df68f791a72774280a14ed2287386d7839f89e10c4c08da7cc2150b2c8e61547dfcf191e7337bd9408f2fa84b6f5454590ffa773154d467fb97123f1529af499873490bd7ca946bd8c3aaa1dcc78cf38b1ef31339285cf2ba8f39095bb9065280421c6b3978b7c9cb3c62976ee72c07947492235ddeb708d6acd9afac9996c234ad24382984955458714354172b0c805176f971acf6bf3a4edbdf0718ec251e07bbdc8c55453c6698737ca8e01dbbac1225c5bc5bda654d0ee24127962055e67fac460c0ca406b0fe2ea76a3232cd824407fde5e2cb4d9708a7255a7aa712f3bbf1d0ba1c5761de3f194dbefe0fdff3c3bcb2ae5354d4b91cf632e6122ddf58c0f5a0d30cd4b1eb5bac33ff25d882be5278926d251f35dbc37633b1ff1cea809700d4b0a8557c58b25974ba27eaa27ad53fb3912e009f541386ae63c813692d79920c912d5fa0c31bd58c73be5842e363b2d0768603452c987cb1e17382b6efb1ef82531f34c9c0b32fe2ff72f4904ed8f03846807c74ef6b12b30f6fd64d7164755aa32dc9021d4d8973c2f9ad41ac80080c1b4d9860373e0210ddce2877b1a180bb930981167c3ab3f0677e0ccbf6444e5c9185350474d473f6b7d7eed3016ee35ec0fb40787203338c68ccebcebc72fef3f6d101e2334655946ded208713d6598099d6032088b90c49404d6ef9dafccf385bb9298994ded99901b4906415c2cfc8cf110efb78b8b993bca0f968de8e35104cf1b440f01931eec25fb2f740deb0f6c1de1977e12fd97b206f58fb60ef8cbbf097ec3d9037ac7db077c65df84bf61ec81bd63ed83be32efc257b0fe40d6b1fec9d7117fe92bd07f286b50ff6ceb80b7fc9de0379c3da077b67dc85bf64ef29d94304d7fcf0189260da9909a950ee298354200b3c5513fa5593f46bbca254cf1e2ede4d6378deebc9ec17e4626478ea1fed2567c828646056519d0244648374ecc9568168b26b6a3ac1f80894cc4e648fc1bb42d937b1dd6fae03914d6c7a09c4bfc984b27dd1d8e79e194d0c6c6b81ea6000ea350d1f0f17d03a3d5ff07f30434b42f5bc44dc61c4a120a972fc7f3afa8072cab3a8360cbdc2e18629f98d7da53a69fbc2abeb4d8bfacce8228738d0d1fec47d4f97ea08da8723e879b047af7af4db17af01679061c0d06b1e3e19b53f74c4da1a65baa4e3081aab2555433b45312dd7399796eb48b3ebbf53c46617ef7a5b357a0c1ab0b8ca7184c4bce21507372fe74290e15bddf3767182f1209ac63570c1aa149d56b221087f3b2a7f80f13c5b5448dce2271d8db36f6bce7c29176be27701295ad563d9bdbac4c5ae721cc4be2c8d7402e352e3fc2f2621abfbad9cf7cb39c87a47e3e0eb3a3b5fcecd9afb92529d4b57167a90e1508e236ad716551de719658cc9a13abfc81631a37a1086960d1fd274f8d3741034f847f7ed8f961af7d1e883ef198fb234a82cea89ebeeeb10161ae8f01a25e68e613533130fc0c2a1637b2eb066f16143b4fa74216dc88e83729ca004d7f86bc5b3dea92aab5e8743a6847a861ae0424df9a9bd8120d8138ac636381780acdf15939bb2a4703e57c48dfc13709a3e09f6823dd07e12801337c5dfd007c24c2139f5d30c1d6362fe24207119a88da874b0114f749d8651a844b3d923c3c5b095a7957097ef601cd60ffb8d370fba990e62fa69d891f6c377e34440bc961feb7f043f11b6da748c574406c68377a88a4b1337871341b68976012da32358b8293ef56f2274e4860a2b0b0f6006ecb34d1d8a67fa9c9d0978086a303ff1999d1d3e30d70ed530ea8ab71bf1418c527b94084230c4024929e08ed4a59ab3631e11642cf38a61b2418c7e843c4a83245761121b5098ec470024ba0220eb0a10e70b205529acba3d2b8fa2e6e3a42ed0403a8ab968dbaa43708ec35b6c4eaaea17e7a612994b51423be870f5cd9154021d04ea8b1728f86224a7c16e17d853770f4dc2ac195166912586914d7c3f3f6619e65f33c56ef34b43809a2ef5dfb6736d33cb6511e0d2df329d59fa7e65c6c855949ba9ff629ff1f9efa279b44e16b90dbb9e2c3961cce666e07b28be534c3c8c6b31fe02eacd532accd9349734e47a072c6d0be5f5b46c6f87ae37897cded4506df9e0e99b6653df84547d53ce57756b7d1346efb2754efa547a38c9f7aee7cf83b25f9f837e9b96ae6e93c1a56dd32c2a6e4215c84de5216eca77b39b7a45f046bbb07a345b63e33973f45c17a621dd643ffbd3ff6d24a1d72db040de813b4acde2e833292373c447cc8f7323788d89f9a406a4e60b7d41500f2610b342086e7e088c13751cda16872d38cdda3763686f2ea1cfa6b24b6a5e24b3063831689fcabb93a8362a6f09d2aede2ef4d8564daadf032baa7dfb6fe8e66e86a0e18514f965586ada36a28cb88ec411c17d81ab36a794565e540ec0803730dd413b0ba77ca7f61aa19a72a2add13f76eaa15b810248fc0d246f7b6907f8468bbb37737056a0277ce1ce5595b85b59aa6aa98c946515af2f060e22bcb56f5169473f93e98936441302f2a201e6d235f851342362a65f202a9ce8f3f360473b748531ae5213cb0e71099a303de141d9ba6c5f29e5f884d62593e47b8a71ef63e914d082a2367b75a75eb1c62aec433388060e9a34683b18a45527d0401774026c252acb1ff9f7c41cc9dc6d551be4bc87d3531e7e6e291c04acdd040e01c4470c53205a594d3ac9eb04ae8793c0e83f9590f89734ba4c97cbb740ee04119d5bba50f8ac2deadaffdd1db2d699d02d1a27b05bfd73e71bc6099937b3535ee6a5d8d16f061b7452c59bad926d8448239becbdb7943b140c240c420cff826cd7f452bcd2f4edd564b5633aa6f7a1c97e250efb66790594e4c10ccbe4318951cb2be09ad9b50cac3c5135e019ab07f392ba9f6ae5ca9d1bcf293823ffd5dc0e82e2c0a9032a1ee89630092931c135b10dd13e40229281a03a8185804e11cc3947206591f8a2d6ab5e20ce7c8d73d238b19bf9afc2f99d59b339eb9c335ad985bac1c8334e6ea964a848585649197d0253c9393f6f70e455e3c227b0e0c9a540ed62a2cfc4900af321dd958fa7550a392902c46f7493aee2046bad9502c130ef3bd98fbd296efce96b26b6a393a11b9b4419f690db61eb26e37222a1fbe1ccf2ecc9d6b03387bd8f713b62921b9d5c9dd66cb8868fc9caf2c41393b43ca253081da1fb24353a3292b5cad724cd9232fad01a5c6343a9acc135dd1f8f4e84b7e30dd4419bb420e8ca5cf8841618b93109763ae4680dae913f3d5d366cd91d734f52c6291d8fa2163d66be62bf1c77e56de4026556568e3a8c2b5ff9a7da54706605354f27d46cb56c0dae99672f9ebc9a4f8f668526954add0cdd0a8d57e3d19e19ef0b92e3ca7ce586176fd0dd38c3a18391a28381f1c1f3bc6b36ba93f4e13a150a046be219dee63c6643c77dca63de8e0ebad353efce678853bac4780d70e6ab4058973f1dbc7ce1cccc21e72366a607ea7cf96306c3de3a73c73c4efab43c89a4e4f18e13b7e3741b5def3841aeadadf4b614d95c42e61559e21b7277fa41b68b825cc3359fbca8160f94fd66b2a376c9d7eb76eba86b2d4f1e35cb28f2c04a91bdd5dee478f0516f65d1371945d9d45873ad32ec525fa7219c495d2736b7e3742da6bcea7d3c57769eecbc2f754f5e0c4743c33a7d73467031ce355739dbaf746a8da0b13bfdd4697b333f662e539e9cd769140a65bf2017754d63ecedb52e5b1ae61dab18fbb0398dd4db5bfdb0398dd348ddc6b247e9b1256eaa65bf2037758e089ee168fa3160ae31e723c5c7bc3ea7b04f0c3bf3c4d3e9d47c3a3503915ea540d84a3883bdad8433547e7245d41061efc3cc275700be354f795fb70d92f2e19003527369776ade762706aadf9d7a5f8d9d31debd1fc3421677fa5629d921f1d29cd2bc69dea791974c99ca338d64ca32e67d693f6a145327e783ed09e6a7d363b0b35781f0ab149d0ffe2906f3b0985a83784abed56a3d080fb64c0bb64cca7e5527cad3679c3d227c31dbdc0f989fce9c8f180fdee680cccbb9458e472a954aa5a69c16f5eed2f216e3c19d989fae693e529f3da6979a73ce09a4f5994f2f15a7978a7997e2b931efea8679a7c7c45814f6551ebc870babf77a9ecb1c8f945df948a5d847eb33871cc65e5dfd687de633b66581d46316b312cec84f46d9ef897b7a778a39793033bc2fc8ed2e8dda075ba3f3be791bcc25e763e5c258e923dbd2b84eeb441a9e8c188fb23cea06a3daacd85517173ec10852668d3596c67e7228c65b9f5ecb032726baafceffe0ad6a4e73d4b56fc8bc729ea1a335f519efe3b933676e07058a37590ce25f175b7dd2cbed7fa97eaa0776799ecbde277f9bc6796e0f999786adc135a9d475e28ca7f294573a166463739bb7bc1a4f08df3e8db7faf1c351ffe1a84f337452868a476dbc9818db653c6a81f24a2d7a243513c4a44950d00e2026da4442d7a2415ad4a299af691be47aa8bce65ac963a69739fa1f84427da400a980f30f5e013f6885ebe6df101700b70fbf9cdb37b729105cdf8ddb56de8cfb41ba5db91edd5ba5dbc01a9c93a45da51dcc30bcce87e7e204f06efec3c379115e8e1be1e5e478463c8757c471bc1fbff10870179e8f4bcff4ce83711c1ea6413ed5191fcbbe33ce2766663a6346774c149a9e71b66d04f619d7e9f6349e5066944934a50041d5024fafdee9480b222962f02106866fc33998fd6cf4b91f8fd31a9c530740e3019961bfbe7ccf7e7db198e4d25abb2e8886c6d649d3a739e466c8a176b9aee3f1d209d0c5f278a90476fdf1b208d0e54922ec78f461056505e14bdf17445c13ffe2b05d02f8c7c362e77f437a86fd41df18b52b9a9f6451008600800f3e0784dff4369cd3a7d605a6858e889fa4c6f5e853bb433fe3240ec856836b2414194481e2d51182fed483083ba46f3d8f9855fb4adfc37e37eee92e3cec27ef89dec509e5e46ad49bf05e1a8f2f46e7c56866d81a5c73b21d856ba4b0c40067e277646133004f5e001e8eebf072eef2729cc5c3f9bd9b7b9e8b779bcd2b263bcaccaaa76352be9341946ff3af6359203667fa3a6112b6ed098573a60ff6eb19857326165c131fe5c669044324068833dd0067a470cecca28873e651d19d53b8060bce995a704d3c6b1ab901e24c3dc0992c38676ec135f18dc58dafa182aebfff025d2cefafc01cead32ad0e5bd4f82ae19ef47e8f2e1fd12cc9150608e0cfab2a6405c3364ce396fd017d750237409d7c4cba27b95ce5b84b84d194ec79aebec0fccd6e01afec9f5d7354297c832e85023422cb9f1f3686ac1730ae7c8203dc4cf2d38870205c07e7d87d0e2da1c00536e7c0dcec15ebf21f3d25c887f37aeec9ec353c117a80259b0077f87c6de1ce380f870ce4a4b09d6740ce21c0cd6b48dfdbadf42d8efc6ad77b15fe3f060b36a700edbaf099e8bfd465ecaa7b81d5283975e97c7f7c4fc79316f5ebe7c9d7679d0e65e92fbd5d3781fcf0e9aebb4ebff5ab73f1a4232de3f1933fec170f9f0afc5e55f8c133bb452fd7b91339f704dfc976ab19f7cc530ec3de8319edbdfafec579bc3e6b972485f1b5b836b6aa5f15aaf5ee95ae9353807ded25b1ebc266e47c9d6e862920b3921ce994130429c3399704dfc6cc2354f3867ba38b9acab869a0067e25b9ed0a07198203ad42c271e650264c5cff0e8119815ef431398c478fc6cc23d7e56b1c3c71ee3314c6ee4ceb24d6e3c7ff3727f9ec4f1e863b0da6863cd49510bf869f7a34034bcc904763f19f4c9267cf28a1b4b2af645d5ac781453339e4c92b2128991d11386f0c4c8c8c8680b021424d577eb5867ce47eab2dede12a9db7af76bfaaded949ea6dfead7546e07278f5a31ceaf9c11356f9a6fe6342eed67c319d17a5b79b4b344eaf6dbeef0293da5525ced0ab33ee6eb7b4c0b7dd463ef512d9fbcaf5ec6cc67778d6990f93eb69aafa727ee2e4fcb83e7aee6573e503fbd07ca9e2ccf9d76e5e3f4f91ea7cf20b134733ee480cc1cb33b339f7687e6946d90d49db1349771cafdd84e3f391f345d731a56dad821f1b68c68d5d88f6feb7dad455bb4d216b558cb6e1ba5349247d2486651391f6d5badd6b92fc8e54b0e485f365047edc71be72396ded2fb825c290f9b2635258d9db1140865532f9d3d8c7bebcdfdd8de3a733eb8b7ae69d857f5f33c17b3abd35118ead4033bc671293ba46f90795b5769bd099e8b9df2dc55fd6afe749e5bed0af5d479aef4ead993417ac8f3519e0f79f27a541f75a35eeb33d837aff219ef7be2b6e8573ee4eb7b480b2dcfa576e5834fdf83ed97c4fd647cda20a9db7aea7297719edbb2dc757abb8af70de0ca78c9fb825c193d68d62b5704cf655929b2d78c888f95bb5da72d2da25850232a853ea151e810cf15741f0592dbf932aec9f0249237743ee457540a16462b3a44a1446956a7eee6759366ad20c8d532a20c1932cedc0e1958762c6bbbf2d1aba964357b3e20ef0ecff6b30448890cefc88d6fb63b7cf915117cb1f3c5ec8a003bd2c266f14c32b3e88c68d05c41f74923a3d9a3a45d501e6921b798af3b8ddcad49776f8f8fc0351cc74f3882e41e1dd1e2c228173ee1c8cfd534ede34f32337773d3d31ed8e9d9937d227ce557642e3d994fde8f2b76799a2fa9c74ca4646eba6a57b59102c973109602d5ccd25e42c7bd3b3f894d36fa437fbe2ae5e9f2dac9a33fcdf239fda33e4a2c434ecbbc22ac23cb2eef8af7f15d9182c444b63ec328d453d7505ecafb11af4ca15257ce78b2e549e983a01b0471e28d371e4f8be24d108f14a8a2523fad9395524ad9fa49ca1691caed40d91a9d949793f21cd743d258398dc3ab001b0fc24e244580b8d18974fe8d7fd2487a0009ac9589cee635d7e67629d18d34097d682592b648e48f645b2bc614680acb720b1f892449bb30dbdddd3545df3488cf6c653d9df31f057a1fe376f0c99346cd3a6242de215118d11f8f2a6956f469565431b5c736c6b12cdac51d9986def0560aa801c46b1cead0892b2ab7f1989035de479f501aef1b226d782bbe8c1f210c29e9cbffdc286d8daea5276f6d1aaf5c0f1a347c902401c2a346e86a9c86f7017977541e83d2253ecc308a84d2ac487d5cbfcd5de8040f461dc3fbfa2aafe1adeab36bb427ded01eda438198749f0c2a61592f754679032ba0a8a24f569c40a88dd670e1e10d0dc6cc7f5d9122542031a72d320fbfd009813a6007f1f1e9e4175c823b5cc81c1f723ff87587cccb5d7714f49a8952cc93823b76c9f1e89eebe00e8b0cc15141cf5ddb4c37d91d92c954bac9eef44ba7f125ca795047c3fa213fe4330be12ba4431aa3e74bedc7f2f1d2461bbf80451427d9219325175e61c488091ec6d4785384f478c84123a6dd81cd2ac2a3a3c26635b44c28c008ec203e145c478d32f1235d01a4f865b6dbf9b0c366a56e95b6722c02de2e4241d3e827c9fb8af090d7ec473fbf78cd93a2a387dc4b2af6e3b92aefbc9eebe80ebd8fe72b52e476b608ec20e68b747f027610a6c30ea261e95cfd54f1e2bb0d4e53e94694ecd704cfd5ce5d9ef3e437ef92b067b0599188bc93526ab9287b4ce0735993159e48cbeee67acc0bb13bf1fc5844c221cd7ad0e21b32340871e1aa4c570841b9aa66318433103214524a0921c7085b4a29a59452ca2953b5769d4a256d587da4e3f76024b553a528fd8eb8416c6e4c31927803bbcc7e2ad6fd18090f7965b398be6daa5d94d2ed04fdd2316d03a18befcb4b29a594524a29a594241cc02134138ca1aa66695cbb4d95fa0b2bc6a685030add547b2d16d12ccaede0ad5da453fa54b32829c61853cda21db0c176e2831c71e5bc94b5eef0bb5d1db0b9ec8a246ff3ba14b723da1a1dc7f51967391f3637ca9d217c7754cd9a7f91339ef4376ff49914d53610ba790ee3828ff822bed11e2739a6dc6851a21411cdea29626847121834cd46d705b1b97c84cd656696416c9ac548d0604c5f382f4997a453d2e9e7e5ac524a09db05b72e553f27698b4b508843fabc64d7c62ef979920d7f5ed3a69025ee492771469048f7214fd2e2f3520b26e6d5e9693909bdb6434f3a1c20cef6de341267043d899e9469a436a2594be9a2661d19c101e208315d0867b4a0dfe92388c346c8cf7635899534ff4c41842f5b5ea242696ccaec93a4eb9a15298bf5ab544a54a3682b141dffabf175610c1e8d49679097b681d0f513ccc3cdd260cc578fae74b9e682c386e10dcb8338f3ccc100cec878be820a97d3802ed5259428230fe310768f50e2cd0c8a32f2308761bffab7d8af63fba9b0cbcf80387c7916e7c0b87c0cfba96ebfee9aeecb61ec572f0c0ff33028f372951721ebe5d47b798b775fcede4bf31127e9567f7181691a90cbcf953e57c640d73c9f055bd0b59a1ea6856ef597f335d28a57abaf0eb917319f5ff1be159818308ff196c35c436db0bdbfbcfcc5bd6b286e87676b749ec717722fe788805c8fd5f9dab6b117738ddbd8e31be3f15d49150c0cccaf82815181b90bcf4d05460ba6e4678956da5e3cd9ac96738cf7f15db962be8d632ee37ccd8563620eb91d325cbcb0b0592d2d5de280c416fbad78aceef558bdbc6cda8b5dfd58ddbbb7aa4edaf5cbd7a176c15cbe3e6917fff4172fed5a5d9e6578315e1c6a966c1e31de35ef0ca3af71405a481c90383d98c3c4589d66baad3eb91e2b217ced89c818ef9f88bc42f8e8c25c88e9c2c01cc6330e487c0c4b84afb51f07a4e5309608dfdb8fafba4ee4d599ce6fdf51b5dcdb60c328f95e6cd22c79182f56d12c89921e4f69967c8bc75ba8bc7ef58bd72baf8f344b26e9f82ca5bb70614dff66d0954f5d229942c772172f46c93638552edfd41949a41812f9aab25f6db14826868425aa7c2c0db301c411c247f70c0449bb92603e93fb11cf5f21c27745a77b657e3f21f9541debeb121f312165c5b4ccce5a8f2e8cc1f3f284e4e9c8d283a73a25f273c617c00ec226e44429a59452ce28ba787e1483369bd0f5352c7b7b3215cb6c952c38d37f61450cb3dde4d85468b025258ba1eb87a18b7246eec1a4f530ca67f6c33cd95dec137bb5b2d6fe47e77c8531930a0a5bd299cd6a658533f5a6b21ca0c79b9c92460a27ecb622c618638cf137e2638cb1ab4e5c299500a5468833b3acce59b75aa10443853270081a845e5f6666661cfc1cfc1bfc96ea057af03284e75f3e8ce1233210a7fbc618638c31c62270e4c034b9759dc20effd2ef9b4ceb8ce10cc986f4c4edecda61db9deca44f0e888d9b7df3b4ce9e659c8fcc6ea48cab240e888d8bdd26dbc19e599b1db5623675a36b568c361c6364204edfab5e2614229387cc2b79c8e4c1171200196d7721fe3c05c48171780d86d7f7014a342b3e096668c45c8324f18025d0c572780682ae96c37ece4beb1ff72007d0b5720398731aff58c985671a40574a06302766c63f9ec185e717f011ce61c1b311e852393cf740d7e939ad8f4f70e149005ddde14500736c884097e9f04dc09c1b3ffc8373b8f01e08c23938e02da001e8e20e3f019893039ae1c24300bab4c33700e6e8c850004400cc19c007b770e1814057e9f045700e11d8e18980ae7af80b738ae09a180300d0452d4ebcf72f880b6f03e620e182ae79c8341702714dcc0ee155f1e6c55d0e1fd32e98ffe5f02f9cc3ad97cb4f623847035c13939801711a90c4867398c667c4c8d8ef060ec4611ec0191c9cc33f3938878de8700ef7704de4235c13ff83fd7cc871634fc758223887911000e2700ce04c119c33e408ce710209ce29c2359173f8c5354080386c0238131fe389b55f6b4d05ff00b2f8301efb00b2760059ecd20530dcfe9e1883c7977fe00cff85c73e5086ffe2710f94e1af1809bfa00cbb5c8813d7e57b628a8f7a5decc7f352b5b0aca49e68a001493c81463c7b78420f24c843912d46800711dc21047670620a08ea40840e1f98c3102d9a90031371100287258e3cf0860eb881036d0892c50e1bbe356c400d1a30ca401a3080860b9cc1025854c00c1428c304c8a044519278d449a533f928e1c18f0f2b91001c4304a0182000c3f00028c501100c0d805f6000f44212906801b00b0a805c4800dc0212300a02a0160e00b36000888523201420f00a058056300256a108f8e407a40201e0147c40291001877ac028f08050d801af1800742200f9041dd18a0b9da023c446d8c88d2f719b46e21e3e120324dcc347021080218600000072e4c8c9c1c11142081c386e6e5cae2082b871c3868d1a358000c2c6a6a686866666a6d5a24163c60c191916eb871f7cf041868c981821409c18324610208e8d960a88e3b577fb3c059f3fe4095a70056202b39c882fc26c0288c3fce21c66388519324366c80c9921336486cc9019324366c80c9921336486cc9019324366c80c9921336486cc9019324366c80c99213364860cc4534c0171bab68bc7f484e4698935457845b9fdfe63dad5f756bc9ce4b830a623e08429282d5e8b1e8f378b65636380586bd731f7d27dc983e10c9fe1cc3cc2480705a5db46b91e98101e9a8907734728bde9c9971e297899e3019b87bcb0666d7924d331683de0ed4b1f74ef6207010dc64ca04e1efe514a4fc648e6276ea00e9e2961a5b442d2bf2d236587105608e16685402bc5b42a988782d2394f2576282614f3daa1c0e4eba1d0e4b1933259313af9b3270dd276f08076f18d67b50b3ebed52e1374c21502de0867a20c28139fcdc41cdc8e6f5e935e1749f6abdd9b2b0077efb47fb33bbca47f17d2755df726786e679be0341297a2c993227b899bd4aa801e0a0ca3f4583d14143b14f4dba1a8d9a1d8ea355266ab3d8cd6a65950da38b1346812099d7cbc3cece23fac49b6891adfd0fbe8317898516a9ba8f4d042c8fa302b845a2954200fc5bc84f35074161e8a69bb28030f856c2b4ba0611846aba4d8e9c5e899520b2bd478835cb14bb166cdc94d3ba3e8e4e7698e3bad945568daec013b41359774b292d83097cc1ea4a2d056f0a69fcbd77e79f6a08350bb1a6f58116b7d17f1117b9192eeabb56ff8f5e86142d0f493030dc6d4da752a150bdaef880b0f6febcab358f3423058ff412fa39fa75996791f84f5987db364159d0deb4a2b842f5b22f16a802d84ad0f5a21d83f3e917835907deec0ce9f87de2721ccd80aa9568a78ccdac3373c039f7b9e4787d61e0f0f6a2a10fa747c789bc5942329a71c4dc9e272b442f8c2f6a013a618dd279a27364bd164f394a92b9b46d047cfdc0eee530f05d741c59dfdf31d5093ce693a364ddacc306ac228a59ae9d3d3c1a676fa995de39e894178e4ce891d661826b14fcc6ef512f348dd37fe9c3dd2c28f8db26327ec348fc274e6b6a1be9baef2641433666d3ac898a5130bd3c6f5407d5a0d559a37ada44898fd38c3b0f9153b9f32cda34c93db41b32ccbd8f4caf5c04e7a176fe0a9e31eae993a11f3e055f1e8a3c7ad8073a6945266a669e587d1677292666fd6269ab0525788653a43e24e765376ac6ef687c9b2fd189376759b78a3136bc53e654428718413f1a63e9eec078d6e8c31ca28a39cf32ade11d31a31429fdd88768cef8ca6688aa6c876d59dcfa383995a12508144fd3c09b6d36776d5bdcfa343b324b0abce2291bd37bbea4e552c1258edd32b803f312a4ad7388fabb4213daa6e36742307257e2cfaedd98d1899afc724468aaf9dc5598d18a19f37825d475604578f8fa24c7c1d4144b3a091ed2835032d0200e640aef90270211c40bb4c47a52051c9057324d7cc57202e7c0dcca95c335f9a71e17c01733aae99f035d8550f63daa5a5bc0a4f53a55d78e8c20273522736c11c55e59c17ae99ef38e74f714e4c8c8a73582f9cd38201716820e738312f296fa5c628ab74a652ed23aecd6d214bdc3ee738c1353386738a5416e7f0ab9da0c29df345a693797ee5dcf90f007772379035af91aeb8f3d910779e5100715c70c608e7dce09af939a570e7e761b4000303230b3060bcc0c28b172f505e5e565758ad5c58c1850b972ab8b8a89ea8542d5468696199020bcb8a1456565243a9142a0a28d4090a77f66d26bc4245e5ce390f6de63cb499f3d06642a16dd302a069a42148a40c00595673d48ae56018c5a1740a31e79d52def91b881363bcf32e88d33641dc8038d0a65d139b572248df7439a691f91bed82424b8cdc89e38358c02b6a10e542aebf253eed0e23e17a55020dc67c5b1184f3f634122654ce44f7f96d0ea523de443b29b21a3ab6838988fe50a8647fab8afd6ac744910c4cc46a6038b01d7a90e0b80ee952e5f34cc445f1a6020101fd1021317512b34c149b1035c99c98a2da38a3db91340af403040404c4442a967f7c9c9872ca2951a74f8fa548f602133561a226cc444c54eab49754ecaa2369371da3f51dca7e5088888888d2ed500713c9d7da75449d3d826457dd49e7d1a1d955675706d84e3a12db49b60815dd8b70dfde5924eab56bb648f63ab7edda15504f42ad4e873a5e5087ec41c72f947562c36e3735eda4fd64912091b8b91171df2c09a840a2bf9d04f1dc15b0bd5a12f437152fdecec4979b3469d2e426a18178432fb9c9078962b80889cfab878f780a1b3111ab594cf4ada8f2745c61810669bada9affe2ce8c59163963ce3893363ac6a4e0e46bd534adc6685fb6ed63c9b7b44dfbb66d5a964d52f6ad596c335dfc835996653874e050c3a34a4f3f31fa0f1e296101249250bd5c090d6c5d0a8907344b4e229ad5974710510412ede2b712ed9a6ff83b99595e9df6a46d759d942b8306633eeee7cad73974d78cb86f97ef20c47a6a285087f6a93afbf14b96ecd7b5855186abcfb447d0ef00b68fec1f5c39842b93d043d8125e1251469ef39cf094209afca459d2f4f9f689fd136f48445146a2ba5349b64f66bb46abdaec591ac9cb5e6bd7a954bf8e1fa0a0264224a278232f8dae3c919426cb5078489e7d62ad5dc73eec23a18e5a842ebef6cca14b5db60de08c6c1f3823d9c8c8e724e4643753cf124928f1afe39eb2df2fc79bd94d123dca3b825a2346b4f78d70fbc41b368a32f2d2c8a7b7adfbf422dadbae4a5739f7934522fbf6cd16213db3abd2b36fe7d14185e9d55b95de873aa2c75de548705789e75eb2486ccf6c91fef678a8837a50876975447ccb7e411d1a9b3c78d948ca92d195f2ac8823ded4d34b788411ecf425efc371a5f68cf4fa4dca5328571e93af42573e1b92d79a5c794eb64f853aa812cd9252723f17c6a83c3d533a38c5581f3d1a403498f076aec786346d1a41178b53a4ad9a76c93480e849fca31a2f2d8d207071e37a64a734c618b522ec083b7df5b61ab7d728a3ac9bf7f195b54659ed6a3b761a237db59446d04723e8d29376a21104aea114eb114fcf28c63f61b3484a29a5a41104d6892a5ee9ddf6b865116b16394e1969a4c7680481bfc5ed1ce31629671eca49b31a25b479710a334a087bd27d71ca8d348222734f304f8c2a79905144612b2879491b3c89edd365455848918245511116581449914224254a1429444452a410458962450d9e40b1a20651aca841142b6a00c58a1a3c916190030b842e6cb8457777845bc4c4c4a452a91e0891f49139314dc3de10ce21f30b1d0c32299dd36e19514694115d524f1645fa4c0821840da1cd9ddc8499f01182d04726878443c2b9803b62e49feff76ca693594a29e511f84e08a34ffc89403128c22853548dba3e52f59443a01ad435b9f048081e0dc12328f08808e808680a50bf80ba07a89100b50f50ff7051132e12e2a2212e82c245444545463e51e6557b3a242a9fffb08038c8660aebe84617b270dc46d50365a827cab40e9fcbef633ada051dd50174249b447eb58e216c8b1eeb6817745fa72376090b4e5495c9ed6f57d4a00a796d9ee8c1e2c22b7aa25c9a0bafe8f1c1b5d1a1feb5acddbfec42cdc4fdeb4e2ca47f2d2e1746cea4d80667e2511e074d35f32a28ae31b1dcf8928b1bcfad6efc5edc78cdbbf1245bbfeab56e3c5748e33030336060c09081f1e205ebc5cbcb0f2fab950f2b172e64b87071897151a962a85a5a6c0b0b8bc7b2b2f295540a268542c1409d4e2f4e2a2a2f2a5db7ea4c2617a652c9a5c4712a6edb5a364d63d148a41552c6f574e3a52a379e3b932c31d70d67189b0c652cf1dc20ce7cd524c32e4921cfd3999e50a2ac5dc5264efbf15c68ba9c0da1c66ce2e2f45e99465da611f59bac537bd4664ffd6e743d7472aba5d4a606add4762f1266ba06bd782aa1ea2d9af639ab7d71f9d44eb7d53797d57608b76ddb7823612eff5e2ccf95fdc153bb7c7cf9e9c5512bcc3636ae2ee3a62901c37eaa17f6eb5eec57e7e58b957d21713d3ecef885cdbfb0a697959c4e6aadb5566db335b846d2677fa97bead5b3e11a9de8c28b2e1e772d6e356a8ca751cba6acb12bbdf6c98cdfa5ce62552adbd993fd6a8dedb44268eaabd88a75d454aadf365b43c33e6ff8659a9ae9a5a899b4f3cbf45a4d6d2a596eb3353847b35f133c35324fc6531fda0b6e51030b89f4158d3ecbe8e7b443fa9248f69301bab73bf3dc49d748f49cf70db194993be564966018ff70a4f2ef872997a576c9198964af713dba671c850c50bb48e78ca469f45995f9915942929902484a260acea9d79ae398d338ce568e5b79ad56db9967ed071bb196319ff9323f9759c2397c96019201ba190b77128bf7f125659425d34eb38c853ed3585eb32ca32c94bd796be5e6a8e5cf799db8e299501e7da7f2f64e323fcdfa484657aa9482ae3c774398d4d99decf524ee4c22d921f21b62f9d9abcd669665f3fbe1e8b2934d3b8974e68ca8e7ec39429189826bd8aeb8cf53c99f1d8d50b09f543afbfd7074e7b16a6255fb05b94c1418b703e3e8e5482412899389826b3e4ff3a48c44118a66b949a7bde34ffea1e8b2958942e647268a0905ca8a509d2c278031d5198964573e489fef41b23cb77a9fe45b9f651ecf1dd297da1a5c136b0c69b0355358ac3c3bcbb0c721f1cec82b68298da491b40b5e3a862c74850c9870cb60890c94b40683a872e11532783133b38433d01e092541c6c0e8c68e5e0c90f085dbdf6200e50938888193abc2b68a6157c480899c175e1103215c55a502c3c85ae8a6a46f3230a7d2e0a27d71a113b7bee5429654ca55cad960ac604ec735456eb53bf4f5150895ce8381acbea9c4ddd866dc18b7bf5d195445a9fde2af8de0460f5e0eca6a8444aad76979ba2331d95de3ecd8dd49da057da45dd0485e7004c991cb5540c847eac0917b28dd360851a0f1e07beae2579e0c0d3dd16c74bc85aa5f1ab851052118aa00030cba70f6745f1f69d5e4924cee08876449b3e0812ee4478f39caf3dca969cddd92b925864929dfd76c74949923e5cea2301679b24f8cace4424d36fc42b7c128170a5d4d053bb470747768218b76c9bb430b59f48ddcf0f2c2cb0be1fbd00ee11bed0e2d1c350b7a219a481e771c03d12ecf5747fa779d98c9cf86043112a9b6ab599199704ef70a5bc56a9d9526f9c8f5309dfe5693771bd32c5694eeaf2e3bf7c4d025799fcd955574932bcf848fc04d201f6146e9b809e46c4c4c6910638c2d99bba03101e08d1146eed1608cc61de5dc9825055130b6ac407aba43c09c1b5cd3bfe12add06fc6a6cd9eb5b600e8b6bfa1aece28d124c069d3b00225aecd7b7080a8b585652a8088ba46c82e74e1ed386738e88bf8123470e2cca934a672a61d3c3e8dd9ad55da8471c09aee99efffab638e701113882e2e1f645220e18b30066007e0ed70db79f04644304200e06e04cbfff00ceb100d7f4a9ed364022253029672c6261130b34d937fd7abd5e48741811d2d1af10726d6b74ddd5691ee62034d8eafa363afaf828bd954c3e5ecec81a0f21cc3a082bbc899fd283f1305a18868e5f744cfb49f872351b5d10d59537a6209c91a72b10e7053d545dc853da2f43e4f821860c1619d70c1affaa4cdf21009023c7fee0e1c415cf833786500c214f4808e64278291942787d71bcbe598ccccb7e5ec4e388a8171ebc301e8479b9b8fcc6e574e3f5c5e1f585899a4ba50a09090905b1eababa54adc69fbe61aaaf978d9652df1b45454535b816558b0d2121212120505b5f0cc37e54341578b1d78b33915acb84848484686c6a6b34d2fe69510c5e1a9672e76910dd79cd876dc69b711a99d3f0e2953f7dd315a8c584eb375bf44d0bc923496e8b09ef31de7a24ea9b2e9a454647b7f518a55d4cdc78106f3d32e99bf88a32f3b58a16132f0ef3d62392be89d5a76b3d1e6917132e5fbdf5cea26f62d5a26bbd8d6abef2d67ba86f62ed5a6f2736de7a2fe91bf97af514af66f2ea2a6eebfdd37abffa46d69edb485ae72ddac5448db7ce52fa460a619185901644ad7393be91ad7392be995549b7e4bea6b8ad3393d6190977d30ff7fcf0abf525fa66fe4499791516ad17d137532848eb4464ffa050876316d9a85eba56ebacbe99453133b779ebb26fe82bca4c9ad378eb2c6e47ab85e24dc5691c3d3321a12e12ea22a12e7ac59bece7e7f5f3fa89af3b1f7fe24df68a3ff167d61a6bac3116c59b5a638d3516dd597f7e5e3faf1ff9136feaab76af9f3bb1a222a122a1a2a278830909c922215924248b5ef106fbf979fdbc7e5e3ff1067bfdfcbc7e84e20d2d2a122a122a9a9f45f1860a4599f95abb4e689ebee20dfd6995aaebe8cf7f7e7e6ef82ea63fb07eb84ed71c1c2b040e2ba36563783e14c9f87c8645dff820e33a1da3ef8d07afcbeb9b090909090511e33762c8881113e33a9dfdb8b21f2ffb69fdc0b4fea215e3590fde175edf203c786f787db357f6ca5ed96bb5bacb2a06cc618a6e14bd286a15add4d817305edc1aafefaa6f155aa942ad2a5453856cb478ab97d575bafeacd49f56fda9a93fb1efe2c2c546dffaaaaffaaaaf1a40c0b4a85a8a8a8a8a502a305658507d6b78f0022124242444eb0b54eaa8eb34568345ac7f4cdc8bcac9d497f6c55ed80b7b612f6c5b99ba9b8a6a8a625117659a0bae74ceeb4d4848c866c6657eabb5eb542a4ea7e94fbcc98ea2cc7ced3a3bafd1a0b1d95176941d7519c7832f1714844efe064aacb5eb327869bcbe361ebc335e5fed87adc6ebd3781c9366cdcff0665e1dd19d134a07231714dff2b419dc8ec837724400a193827499cd833831c6ce586696b666cdd380cd928172e7594377fe87791faab8f332e663e6634c71e7ed923bef799f87f160f0913bffe265e5428b3befa2f2e65bb08092aa329d679ae77e5b95e2245d7cd73b3f2ee8ce43b9f35f7674e7a9d7576b6dcc750671a2e586100467e6a7c00599260cbb40082b2c1f4fd0edc3cb711752ff15b99bfd5a179ec5fad71e77154dd33495ecd55e32a183c70eb76d6b6eb310b6be266de736921552bf9d7b7b9fd489bdd9d2e3e91c0f97ab1eb91d2aa72f90ebf1e22fd75c247155fee20157c5fbe675e1c24b7de5ad5ca75f3c96af3cd45d78df1157e541574548bdcae1e51e5555f8117359ec3f199fa6f293274445e56dad907aeeda9b2b5df348df5454de04cf55b14d743648356282125c9325e2e2952c84ac8f74ce235921d9ebef04e28355b8f149487b44946942f741287342d1a9a09887024619db45f9a92ca6854ea531e9a1492e464ceb7a497a46dff4db2e9ca78249d74b0c3bf5d1878f110b1a8cf9e6ebd24e0a8b4535172bcad04ea9304f5e0d321d12e39ca4ec1a740599e66b768c94d5475335bd4dc752af5308b9789175091e922daf97f048be727429d5b272a3d55068e730a53616eb168afd5458adddddddddddddddbda35d565dbc4922680865a51d9a43a521964d750e7592f7c917077df2b5127403cafcf9f9b9b41573b3442afb7703c7fd22508b94af258cb40c3d6639dbf41896bd36fbc92a58ec27855aec6bc59a6caa493eaae92a0e88e9242ccbb22ccbb22ccbb22ccbb21d19e4806c7ceb37cce39bb1a0fbb843cc7a9cd7d3c51b0e62c51b97531e72b10d25caacfed5d40ac55386b62a925cfa8c879e341425979e4ae9a230b9544e01215112d1d5b62d106e7ded9b1310d75022b2af9da411d9a40a49142514392497f0c9247cb5769d4af5b3fa85652ffd8b5364f67b0171578158babbbbbbbbbbbbdb850362bae6d94db6ab3b66db5a08efe136c1b7525547e920e857f004b204a777973fb1ab35264e014445c708f4138158be382828e8d22d68cce2d288450c03cc81b0863b7d9ca26f78a865e8297da4c7bcbe10e274ffa21456943f5139a9e2d2c8e4d2f350adf5bae07c987cd86c746d2a996af5618b9ee924aff42cde8c92a60bd68679f1c276a14c250c831eea1575d8ac1ed98e3a63bb6d4ac13747ca4831cbb22ce32cc3ea89c89b5d88e96616c299150724e351331b1dfd0f2a1de587cde49d34cf08151d4ac52415e7a3dacdc35e3d3851358ba4934ca40b315dd231be524802b54cad5da75265f6fbeb278350d98c4010ceb8703e32abe280d49becd7cf3cf96a167d694614155d7f27ab297b4c5e78a96c72e927abb8540a4927b5eb50f62f964d0c1141903021e22d7e9cb4d191a028718a540271fa6267914277a5660da55db4de7426648af3419ab1b1e24d04fa3aecd449a97926af362b02019522104aaba7ee54e5ab65e80b750a74e3a7e51343ffbddc40a11cb733fdeb97e85fa06e7ae4ea614769d63709050eddfc2b0245792a4b0071eae95d5ce4ebcb6e0d127333db0d5fdb85d915e67cb0bcb9b31c723d58de3795b873fc640865794ab769bc99a0508e1ba42db0b8332eb4628b2637723d5057b916395389e52b67b13ba8ab585eb2e2a53cd92ca076a1ec1227cefb82c8711b1e7dd00e263ba459740978c4af9ecf3cf9c2b83ea9bcced9bd07cbb757ae477b2d6f39934e4496b27a21a6fbd5abce71404cc72c11be24fbf551df3820a9d7afbf729dd862573fb6b39cc5eeacd89ab2d2eea02c4f6916fd10bea6eb74775ec99bc2bde47196b768d677e3c3c153e28d6c993eed9e6edda6d764b62a8d404fb68c3c49be8eb03a20d54f474f81d0edf4eb3f2a5f975a227c335bade44b679c120125d08c541d1a6ce960e8b11663f5a00ee89d4bc02f5ed22eec51050c831bd90651eecbc8ab595374d04ad1731df4fd0f162951bbae686b9978ad999959f22b16d1af0b634419f5a069f0cd8293527a789b7a1a6066e6bee480c8739f5b6f16e586725b8bc7dc2c5ed3a8adf30b5dc7b8716f2be09a5924752194a18c28e30292293b60851da2c47ceff983b62a18a78c319040dd67638375b783130ab117341863a3933d313a9b80a9ee373ea65d7283f03f2f41833c3a78450f8a36cea95c13fbd4625ae84f6a59061a8c917d8eb6aae4a992eeebae94313289065d1db4620ba06b92af70e8e4a18cd762a2bc11f2510af9782ebf949ca0d38e34ab48916671bfa78b2f82b1773f8575d3377dd32dfbaa0bbc610cba5cc8e21f9624ee07cced2536bacd54320da9e71ece471fb319f78304377553d7b8ed17c34476ac625ee52320dec56c5771244f2aef7ea96679686868688847bc3c0467e41b055d0b7649bb131fb5cc738bcf9266c9ab2c2b69f158581e3bcaa28acb4561d769886d3f7947479fea7e7c0473e797ad789f141a43f60e49bbba53a9eb747b29db717397e0d4ed38d91a5dc71b2391ffb073cf121ddf23d7e96624cd922a9cc357be95a04e976724f384619814da0ef6213cbbcaf968153bbb6edaa08bff78489e9ff48d76098b8c2217f9742d5483ee6ba1a3768241d89bf6cd06afcf94d43eedd363d463a066c95729a5e0aea46f380b9b7dda857d6b9f9e76f11108555c6e18ca5cb879dfd6de2653ed079db43c56e18c94b4f6cc7240213a5b7b8279d84515b0536e457a8d62f0947ef38dc94e4137e7bb27b683bd57d0498823c424d91a418fb5ebca432c723e28cb1dc8c79dc85d48dfd68878d99c8f78498479263312d4f0ba5fb5438fd1d11439e54a29a5c480133408ddaf4e3182d0091a9a0401222272c21d90dcaf4e19a24311cd918e3a2307ce8e8aae588311dfd4b8b28586a36a451880a6cf0d252c99429862800e5a318593fb552118b9f1b5d6dec0196ef4605c60e4bae08a1b3de8841514e1460f66e16acd02286ef472ae165920245930861bbd19579b2ab8d1f3e16a5408377a3057c3ac70a3d772b57ae40c377a3f5c2ddb8edce809713552bda20557dce8fd12a95708b6073dbc2e9fa7b95ba0b9e0c1d7d4414c437550c6ab447ef7233fc6588a5d94d1d4fd338fc0228d59ecc8248b9522ed626614639c70381bc108238c118b1969926a631b6751aab0111fc51becb14993261d147d4c1d8d95bbd61863ecb8677c9358b21cc4403d3d3d3d371ab5eba412e3d0c7438fa673e74cdc2f3daceaa834ec57b5452c992219000000000315002030140c86c4629160388e1451f80114000e8cb64e6c541b67511a63c8186388310680000000000000c226006fb83bde808c07412f98bbced5fdfb90f86611404b0c497dd4d162ed5f1bc6dce36fe8554544dce529c36cde9ec87bc9ca0de92fba3689a4e54c36a46c65d9f7044ea17dd7db7b42d2cd4b7b73f3df3697e563d258b86577f41a3647d72b0e5ef3f3932ef42b53e692decf7ee97bdf07a47bcc499f1ceda89bf5c624dd42e732b199f535cfcb302e0ec76ed016a06ab27303bee9683c7aac4148f57bdf9bf698745e4b9cd9a65e33497bea51a02a2f55d3fd6b3e3f3b3addfadea1577cd3dbf7ad57db511fe840b3f676038fb1dc685fa26937573776e8facacc06bdf84d77bed315ba7e852e9da5a82d03eb65933425f097428e6bcdab68c7f5daf56dded86fdaf74f5fa87c88318f5e13bd6c92be06a87a64bcb89dc2a90c1df4b4dc9176f4c6371df11390f9d319be26c18ea73ff469af41bb41ef02490f354a143321a539bf25a4cf67d033bff84798addcfab01e225c60ea5e6298fb5073896b34d34638a2f289ebaf8159a1e32a6d3acfe4feda459cd2999cc0b03cd442f2a08f946dc2d7f6816e6e5cba7cc832d7b4f4fb24a2df6912f2424978d90bed155b4924d40b4d14f6fbcffaded2c8c8cb22b6e43d4ec9e9044a77c80047311a1f13d1b1919bc59fa41d666cb628722daa9b77c9a10144f15c43bb90f076d9f13a00fe0049b7cc6bf49f2c5f6ec6a30a67937a277dece39588f0e4a2be2b1253e425e786ee851fd1e32297ca603fc30f7a60c3ab6fa1709f430f70d6990a912d250cf90d1a7483ad45b94ae865bb119b5af5a12c334408b09545431b45d61c4450894604a30601b1a19d9012c0352d2fd5c71910293e4ae67fa971c4824731e28fb47d809e28b3bd4f1470d2ac243922e565cd844b1ce3e3284234e4472c37e90fb80c1b419c73d6af2cd149cae9e376aa9383265bb26ced137146c13da656af736023914b6c1b8ab942c9b5565db61808f358313f2294bed6637a8fbfb2a54a6e834882628e248b352a68b9ecc7fdd028f0466540707bf106f8c599195d7ae8dc5f6cc8668ebd3cc152ad62af3df9f6037cb3fac35c77bc127484cbec0ed1246313ed43f06cd29a7a2ad06fe069480e03c8908753b4fe2586626157a9b0d7656bef9bfd945a6cede3ba89a5b67125c85ba345a22f5531d5851e342af79db7036384e27d0bde5910672858c4be9c09522ccc5a37c26c488e9f8a69c3adf039256501b5022f49f4056585ea1fe59bdd44d7acd4818a79863e280cc04a15b00f22383674818626795abf58e8c6317705e942512625cdac37e230fe39ba4cd952b53161fb0aeb31ffc9e97a237e18673fc06bf3f2b8f6cb280970264307b1d3c96b590640d57deb858f3146321f6bcd441a14f7c8a0e5463d19c37686b35134dcfb1f0f364a32421704a46cdd8897f1c7e831d4a6989d5a0beadeba21be19c75c2be5b4ecec9ada757a8b16b7e255a9d84f8bde7ac630b4b9d0c7d0db91e5f006b71bf9c3f8de30c52dd5a1f47278abcbbd199141b3e85d7bec34ee56ba70541021b4f640d71435db0d38667c6f04e6ace2b64e14f3e8933b9fb49904b34248ce40c724bceb5dba85366611e6caba3d918efe1534b8df20bd072963962814039cd6f9e7b4065964a711c1d4e33b68241d201e6dbbf1a97662494a8ea30d046b312f44200499b7aaa51b3c0b69b93caeff34e8cc614878913f113dfc3e9a2709fa205092cbd69cfcfb2be9dae3b5022ab27bd6cceed98d492aab0a393c833df228c9b32a59519c6b956d667993ddb070417ede32350d69ecdef032f9ad435bf22b42e803f2add1e9a80fd89388d9405117fffd631e220d08f74f8230910b0f66d6ffd71bfa5183b145b3e95c65f0525bcb39afd7af1b66917f15880ee78aad12ac04dc960e561dd7f654ef2e0136770b7fffd43a1d1cd0b3b49e46124c54c3eabbfd7d27799d70d9a5facccb961af6ee5ec9e7c708f83a525bfd59e1deac64bd529d6722eb944cbef57f3f7e4928d26ddfcd7a72694e9f09659b69a7c908c6d890c2d6d3d07125d17724b739d4e88041faa04071811343c34cb54428e283404522818c41ab6982f5ee630981940fb5d85b6e00ac7b462bd82456afca1bbf3979735200123c40df2061eea2b4d287484254be9e2029d6e37c51d8b77ed5d313addad1bb1f747fc1a9c59edd62eb2c15e1ebc413066c21ec169d81243e5f8f1c1b8c2eaa63b596380c2f18dac25c37f0f4134d688913f0eb981de17480bbcc0703814c43595e9455444a14321a8043c2e798bb72669ee70694f2505ab1c9c0c7755363390cbd85793e46998f4ba228a85c99f9d1dcbd681c1cf14fca978d4f6eb8e3df90f57ad55a79d77993a9e88182ca4ceb2aef87d0bcf18e784239b16b0b9443627939924cf2d527a887acdf937d9d98758a7f3f2594192027063776fe399f3f58e8abe2265c236ef71d041b1aca069cc8c79325a05a96fb871b221c07309228ea6db10612e44d81dc14c1ca52b3ef201805a2e14f5c8fe6052253f9c863c829ef866e4ddff58974b469924136faa22e44af1f9e8b2543873e5a95ae85aab975c8a280d5a2e1de1000b6b93519f765a6042b9ab882f21dcf110329341021dc30db399043150cd1512ffafa73467c22d00b9542b74993602e29c4d660860dde570d6891c04f5a17ccc13127b4687024fb5c97752eba5f4f454d6f9bfb18e0feec7055a5db617f2e35e6eb4bbc16422f4ee6fe880feb47282ae1e0c737be94412c7519471e5fdcda9250a0fa921d2f280539b0094850f0b5b6ca8636145966539622bc1311023f28def684795b3d34639d58084b886915ffdd7ba26df47a2303ce460b2db78fb5a01bcb5f7a16e8ab970d7ddbbb8383bf2572a228f45d9430cbacdadf2cc52c29b802fde09036e2c080bbba8cf82d38243170e8b0305e82300846147a6cda012e0e385896615b952de430e5a762f53a54c6e0f9f71b290ce41d7c126307388b41697d7a17031e161f2778a14c0a98a978767048bc37fe65b1238630d02f9f41acb5c087c45bdac8371a9a13dd9d70ca876df9a017739bdeb5d0670444f3f9eb0058a0b102ad6a6cf558762902fd83441c5b291b46330924d92bf2a871aac1921d77c645bc4a037f745fe57a0457fd101c894098bf20cf13f8a4246a11e9af9c187f9c52165c863a7718589d23cfc31950eddbc6de0959fc8363120c3f329a032c84893bd45d48758b93adf8f8cfbdc9c6c7e274b48ce0111e93e3b512510bf474d391bc73a179a7782e94810e4423996c4e9c6e08bed802a67f131508ef926941afae3a58f26847a9eebfc279ef0d9ed5ef48af82935e236789e900ef27410aa8f4129239b13b56eb7151a14abe6ef524402a523f0031e2a8ec35ddd409767aebc0dd6abc5817aa48110aedf521dad9cd50bc8184d45b66ab96f8ff4c4366cdeaa806fa5aa5dbe60311a62c9b57c75f33446fb25572249b125b1310336d5033d2c08f81d181978dc8ecd4aa755c189f9a749a13f8e862f2d8209f381cbf49d3061a09b74d3c3985ace007b564137e18a94c3ade3201a5440d8917957f7a49db5f53d4823c1522a0fbc329d143169a6f10a4752f952390508ed407300ef2f6f1c6ab672e8a4e5e4ef9e59f2a270da0ddc1bcc69a04bd8000aa573eff2396284d0609229ff10746f592421f8556c2e3882f8333621c4fdc291133f57122d9976a537ffd1e07d08b040a73b466411b46f42c971718de3d06011849c8bb904227211bea6716b06e4a118f9f07c4ee630cf7507036c59772833c1b2a149fa7e8bf81dfdbc21ef8c7e3e22d4fc7fb1b395090d306546e2355e99ffd0ff0010b8ec272d796fc46d986eeb15f01091e7b93a0d3191d43c92ea5c25c2da0d89fa3580e088001c8f8ebc83b5a75dd5c9a228ad718e9ae3831b7ace35b6e526f9920c647b807c9f56bb69ce7cf50d5f39ebd890089b480bb2d465be135d0c1c2c394fa0d542b57c7684cfd4a43d92d159853a7a90ec4e2ef59f248a645d88afa0d17a3a0a338bdb018c443a5689cfc86c7b1113e5fa9a75e1cc85dbc87fd0b8004c01db0c2b509175b66aa50462a0fffecf047c9900624342674925a53f28bf4a318d78977460bf7261dc779826bb26206fd3186521d3a642702e14ee9d6da8712a7dfe644f7f9c2a5f4b2c47ee076567fa59bcf6b5b90e5389be56d85dfded829fcc8c07b63610f505286414ab48aa732622785d092421b308e86db22886092c4af29fea30b0f2dc1762552666ee0b5ef3abaf2119a355fd1a4f4053ce2cbf72a99129a0f8633302c43ba668d672256882823b121d8ce8ce9d14e23eeb0d73e9aaa287b66c2261c5bdc4935ddb7ee1583c216a90c92aa6a7e0567929a8a4e2a5fe963c778aa9d24b092d1884ac75892fe96a47831c70e8d13b8d5908f66f6f24815c947ceb0cb04e134fab0e5f16d3388374c8074bf67b852e9fa33e8080f868094a0d988f53895df50e087def56c3a782999fc0c9f01461cc5f4ae0d2188c1db38bb958166f63e4e4c92a836e57c1f2d2f4eeabd8e2ac6d077ab2cdb4ffa145a69841360f6ab63c11003d87d2c8721c3dec8e68e2ce056f855a1c8c1a79e209f179956a86886658ece22b0977406b487f5482d62f9478f05455c998569944e1a808ab30329a68e50960c5c84d44e72d5485910f05ca83f1833fd48b46132d53db692beacb827c44cf06081632d572ca25c7b266c08e91e2254f45a4df0a30dc89b19264fd8f130b7e30493949a3bbde64bcc0cac0007bccdb9248937854827cd87da01e123d7d171c7cb4f34606ecf2922056041407477385f05cd7122663a0761caaa2f578d75ec1ecf72518fd3af71073ce8511e9effc14ede4848cb3196bd25496080abc1fff5d7b5b6e04f0cd80f0a6583a4cd5faf06d16dd8cf08a7afb85145552265dc1b107059970a11ce0c3dd1161d4c939965158aef72e02bfed9144cdb40fb7618cc56bcb3f18e8530a0979ed6dcd23b1f56c71d62ee28f4385d5b126387e1ed33417eaa11cd835d6b4036d2103a8e1d09761021e3b8ce824d0871e31bb4ad0a25beb402b774b4eb889bf9f0fb95fc9d9cd32fd6d9d3e44ecbe2bbbc940eed6591015ae0ad45744125cad70ce123777ae26c5bf158be9fc0c155299b307ba5033a43f67e53f9c3f8201ba9267b223c455f787301b48f2cbbbda11014c3e57a19cf9ab1e54beb702996a8af2b59bfacbb621fc566b1164a7c635b9bd426cb9a6608d4b5bb26fc89cca093416575a8676f4cd11c8ed815324e4a6e5861685b059b3173adc3495c97fbd64dbf13f304cc88f1353d2bbaf130fa9bc0123bab895c452bdf9b45cb82154bb65ab16ee6ec611a9b5a06517f1ee81407add1e82fd6bb1ec9f522451922abd6845ffb6c9f1340ea0ab16917c5d16f2c5aeb9f20ad86c762381019c74c812311781a8cdd81511e5e3960a4d1490399a87f63a281148ae07333181f770b3c60204fb190795bf09cf8aaabc876f206ad262edb1de2e7bbaa5e4590ee6508aa9d95f6dc76f18e25d1df6e17b20274890ec15dd2bb85ebf65475af2eb187cbf31fbe899aa92c13d9905984b9e5c6ced753cf558666bfad3bc30cd1598c9b269391c4d527d68e3c03457ffa02fbc57a5c2dc87f49ae4a023398dfe77ec174862079c2c629fa46bdae5e96fbf34cae61f83eeeb24a6eb3908e1178ab581eb67ab2fc0e264e9a05f1ddb96218e5a0bd42f5c216bf571491905bf43a1e706c158e8f554dc5992c471b4bc6314e619175f344ebc56783fbd5f0bcf4b7b954b7db065948a39503d310da644e23bc6ac0d10af5f9fc3399c5ddb7c942b16b5c051b37a29fc045ed9afa0346881f49a3606f3b64045613a4182b570be02cb2e333161bae7efe3e4c1771ab74a8dd7dcf778a5fea369f17eb86fd9af6365d31a90d54c7afc9dcf1c7e2cf93c76d04e3f28061e67d85021b8a048c2cab1c1122ba0447b8aa61bcc6a285201090c4fff545174bff3461dd41f3753b573f7fd946c072637f6b65a5927230a79e23a3faa8d32d074313588673b3efeed29d11f3ed1f8a1dcd35d05e4f52dda532b5a0d861ec69fb547c3b8035c45ded75b86771d9fc4f9151075a27b2b788d6e201698aea35db22a650154faee0dc8dae5d9693b7a5145944b111f3241b4dbbe0481731ea64c0586477c6be64ece73abe1292061bfa8a158a30c763dc7bfdb0d55c556e6891bf74304acd8ad3ac054c8904560cd3e675f6a3632ba6c2c5d0e90b2674e1f9b7ea7baae50e2efbf1823558b54a0785d0c201898e04cec77e8b3dacacbcef49a907f4ab2334d0b23e1c6afcd5d32e601b6bae529d06558884738ba13dc857b546d2d09aaa2f3d31bfecbd7e3255aaf21ea51b91ef8843c4428051da7a29b07f66964abac038762fb20d2c890119c96226c389841b0e693b2578b6d6157d01d7d5be19b2b7dff2b4eea5bddab6f5ce12585c5e34c7818c40f38fcc32c421519290061af6241537836d1220c30559145b0d5d90aebaa90285c7a2349492ada3a4709a0515a030f7df31c51900bc5ff78188503cb9a7ca2971d250cd82685db0d85fb5a0ad073e102d284ecf5dd18049bc5185405550962459574c13d763dc2d71e607ef61c816a7b4cd66e643aada9a7aa1dd8937ad00d6fad829da078c7301c63ce67a5128f55faef46198e80b8f5856dedb88e045289c468321f5047128e5a0707c1c981c719aca2021ab0f64a33897d73d2ba4ba16c45749bae40012337554a637ad45080cf56889c05dba38cbb4c94cbc88d9bc45f74494b0cf81de6530888e63b0e6b18d6e21ab69d592f9986408c44e65c47ccebd5870730396d0bb44542d46e8b966e1b203bec23be79bb47f5694b2ecb4c6e294476a3a78f105cc6316ded80101cf72d725d9057305fbc7018771d3dde002bf2514911ababedfdcd2b24ef0eeef43e7ccce725d80e9e0c30ff8529eca144dc590b66b94ce380d990ca36393c841e5b46f569a5992daf4a4782b5ed374252a614afa0019a7e74e35dcfcdcd110a30c47c18652e90e4cf67c39226c50230680d73fc1957a61629359679e5d54c907b6486a8cfaebdfbc0a02e042d7833b128908e24f3df9732051a28cdc2c66550264c01ccc1df834220d0e70f799a27b2e6930ae1c3da947c3205e9fe607ae2cd8651519a9f25233794e38ac23b6567e62bb8e74da7e028582debac606c0f420d84f2608933b266016dcc85530b362d8b0ae887ca7ecb1221f6cc05f908231c6a0737ef45b677ff4d90ad019e2b4e62ddb6482ce67440229fe5f52bce29ae9cb59b5f20f0229b2b69407be8d4606cb05efe966595e518951d395c4d367d20a6a06fdb0aa37c988eec77e6801185f56795516d5701c5789ee3b25f78f97b9417e0ce586838370fca0335cae73e8ceaf0dc131647c45b253d16bb0c95174c04625b671b74dc5efa312716fc4933315936d0f75dc40bf34343058d9184c02bd238b8c956b1f734d1d31653907c8f638fc2ea66a1348b8d7a197f1f3395740a1ad05254f96d10fb8a258bbd92079f20fd4fa406ffa8a1b8bac39e4d6ac3ab23792846e8b0e17d254b395eb59987927208f4ee221c038f521d0a6899dcc9271b07449b9901ca7037d07410a4273c9feae0490d8f110cc51640cc6371081fc14e925551e11b0a163328cbdb6f2b1bb7c65b7fa16728b36f32d424f730b2759aae3ac8fb5dda88ca5c817cf43dee550a18a54a557dcb3bb5fb071e0baf7d17d7cfb21f48d36aeaddcee5d5646d8acac029a7027939932f5fa130cad32be8cecfd22006d2e19e820ba656ee5f4670b9162126854954b246d5a63c810e00310ab703398aa1a6a8b69cb57a0ae6aafb6de363df4aed06acb5a1f3525b95bb9282e04f1ae6165585db44d4dac8221f8867dba27ef5aa87b28de17624acef620a8030d41157eed4269db21f4adca9e52f6546add6159ed1e1af2ace3e4073da3044f57668416b45d281487850f35c247f3eaaa3322b8cd81a32f049841eca016d1b2ba6feeca63868f2492d76a60eda3697269b90cf60966b0d5c523a13df10b287102aa2a89003b206d3551a43a65f62fd709da02a895dc82f67a59d7ba20c147f27340a557eec5a4a1df77ad0ee4bf6be3dec1467a772952576263080e461e219fcdf4c95e17a9b95bf193c37502c0a7cdd366f74890796325d377dd27e14913877f40b8e2cb5f66e744a0d35c1da1f20eb41cb27320a880bede3b009fa8518cb54045972426c82fd9e0ff0ee783d9f9b2076c652719f8b747db263d54bb8cb05390abc2063048b6f387912cb8e60831480643264fe7e541a78e40706f21b9b86c151ed238d6fe63c80082657de4bcd94f30e3d02ce314a1aa293067ff77b6f290e8c3e8c79abea22bd82b5458e217490f2dbfa2d15b4aa499175b734fb45820e77682e0df7e11e86ab556b2f862bd3cd187267f3de2cc80225a996525aa5d3dc3ac3b753d2f709fcf6b250d473f8d435f6a37d6bde3a2876c291225e61162c1e4abc482d2dac8285cfc4d9229df879f45b8b093bc752a7749ca63704537622b93c8af7eadd847da215ed037e26653bc084c3d54c32444cb33a332cd45da8c3411eb0e68258c83655c5ca35676ee5505705713fd7ec5b93fc401d5d1f9842458f950f41ecec640535e0e45a659e9dd36d5f9088024017fd9b738506024ccc3009765cb901ad91f3df4bb25420c2eccdfbc22d39c61fdd73cd4489fdf0b53ccf8fc909b51f026bb855edc8118083bbd14634c82135f30f44215f3d2bb618a13203e6febdabf11b809ceaeb3f152f5ab7d03e58600c415ba98b3e1d3c1b3784e9625ad348588880a504b11bc962ea54664d9f0bddb3f6a1a4ca138b37ce030ab31cf1e1768e898c87f76ef2293402e89dae7e1a26f739f0d714f701f2fdc14c18c3430bd224c7ef55c59d8994d5d0bd7754004aa6f2e1a05a64432846d81709d9879eb4107c005d74e613e9a4c09f59f7b665e8e4989d466dabcfc8eb64fa6a737d1e75747e8e9d7b5a01e516512da26776482ca3c6336508738576e5b4a711b3a19177975fdfe7c0b84956607056e1f132f3459c9aeda7ed3184b92f15e8dd2acd89e2afd597d26dffb79de5363add9b6876289b5c5b18a2f7b0f1acf42167c6c80db5240f1cad20a84f68ae79a495cf8f1f781f9ac802efac211635e0ef1630db9cf1c454ff49b771c8739a89119a38239d1df1d3abb9594523328391a74f60e804c54139dbf6580407036eeb420a9213238ed890983dd99709a7d95fdaa97d248c9ec8cf2e043a165593ff126467934089470a64061853eba2ebb48a00d5801c2bf8d48b6c0b07b95c256618aedbea31b1544ef18a25e1b40bcbed88c47acd8b4bb0e1ccd48e9d7dce8fd1367a4b3754bc6e15e663f92a037f5e17ae85712611803fd9d7506955a08d579a84e96264ee396a2b67af82fd3e3d9a16dfdb2e9ad31bb6628ddcced14885541c7f56cb8538edfb9778d9ded9a215d52d2500c1bf9659c781cfb02f4712d039b4df51f46d1c770cebc5d1d382ed8b840182904a9f9161bdf5d6dec730a3f65b80c40b8d1511c44b0bc24996ebc2d12bb2624b5541bbb4b3d05e7b06b86fc1d7ad3f44d79450e0e9ddd5c1b4375521f866f168ea79ead5cba32e3148e16dade05baf6947887ea74b1c9984c63d70ca55017f5da0c59478553503962b71a6c6a9a8160f5e30bb07496802df0a081ea32ca14dd8edc8dae3d1be8c15ad6bea3170fc5507c06425a2e66e6db37fc969247ef9aa1986648e86a7c3231e99921b2937f34cb221265ecb25a5d0ea40aa3103a8bb840d907173203e3e0361ae6224bfdb4e28c2dbf52cccfdaa36834b9c3be6eec307d2d2fa379af561f910c4d62df514251f08067832d33f6659c0ca58ccdf90b3317e4b0a58402041986d8c661b2c1d37f2bb39d9c714cb56aeb6d4bdc4d0b1ca2919167b520c2d3772f7f566934903e5213ca2a52ed16a00ca675d1ae59eece06c5abe41efe7d85728c0168edbc67a28120d9ab2cc4b00a6313d2a0a129cb80df91f3de7d4269c3cd1594f2f6a0e98f0be07a28bcbc2a4a4ac05746edf376012c882ae3c685ed6b135848b0251a26e430936fc97179807ac8cabced429784dbee5a0f53e4071cd41638d7b400f415c7016fd2f88664e2d24100ebd777272b88241ac5a6d764a6ac001a515d1220f3bd25b18551a7f8dd9e871a314db842463ae62e01058c9470344e11724e30cc7eebdb19bc1975edab24b2e2f920d503804918d98db25f10ff6302cfc0aa928851947676c8761a8c521beb9ffee9d25268a7145b19e0a4b0899fdc49efb277ae535949a28cc9ce60b588f6073b41b94016ab61b9aa2425526228e28a657f062bf0624001da2e53d7f3229016058898a82b45b373acd536b6fa0b2fd496858969a5ff36d5f96d28e3cc893573d022dc8fbdd393ff2178442a97d56a6feb7fd84405a043c8d056284b714844a76694c97b0767b43f166679897a91df4f54281c525eb52fbba4ac8aecf229d4989d7517bf8fae6a0b2f39582537b39d6dfdb6fb755dbcbcf9a9b77ca62065f84c7359b9f729a7907974c99383ce2c1c9019268a6729e43c5c022dfed81efd30e3fa43a3610662caca6cb0fa44d75e9ef2b8a697d9408f099853c30507197edfa4326ac1c557fdf144d863ceb5f7c92fdc71510dd8ea9c30d540990c1e6f6f251202da70576f6b80d39beba8a2d486c8cc5191a731a6754f57840f1ac82b3f2baaaba82268a3f05a680da739a71bd0b3d9f5c3896de0cc38f560f2173e80e532dd7b284943990924deef473af8748987f5fbfd88099fbef21183f33a854fb31a4c9d99212f809106c11cb3569000230d4239e0bda41166b53e93e6437e31c05acc1443264c14f2bedce49c3f1f1fe67d9bc0ada80e26073262f454ab7dcc0173498065743c56f4a8ef360116a1cad7927f63a955dfc3eab761198842b541f9c7bc26e4fa89d436c535d2cbed1ab20acbd261978e9e0d17dbedd38b6c1d947db0e51e76699c82714159bdb63eeaa7a73966db5b6852b7acd7a86c5bbf8b5dbce3a4172c75561b5304e0e359561cccd50e8aa08d9181098a76203978463c13008f475a152d0d3f0a3317407556ba26fa3bf8ef1a1c74d258356065b1e385496b729a4a23cde43ab7de1b810478018a7344c8f5c0054453098355865dd530215ebac40bf0e7b09167328422642b426346c2b8d12916a3548fc9d310fa4f6e8e445976f4d42bf7e3ea107b003c7283fb0f089b1acd1d43dd4871b5d7e7d3856622158096aef8a318ea3c5201b168012e43ca7423e7cb85394d90c87dd519504d0d3e864d1e10cb9206cfe9a6548f217e5c160a0c6a951b3bfe4e1434545a876be3370ca0ef8b919f4ce3a9152d91bea19377a7e58acc58408d149f589c28fd45f20e6d53294d01d1de07ceb05fac3bfb12f36e1a46428582a6c8be34d687e989365ceb1a901a8807953b1b27b180b814c9fe28837de00795110d7c1a2365c6161d37e3c034500855b8676b48d6884597270890a74eb8bfd1cfdf65da3e499dc34e11fe8d254ec0d94ff139e0a4ede0c159202e50cd2bd6326c6a8b9326dbe49ddbef22ab23d4dd9ce5c68556902216d226d4663f37fc989762681ff4d617f9a8c57ada303ec22b9ab31bee9e7e767dc4b43eaf6e2687091109677120945e2d050c75389bbe1a09baa2ec895771ac938441f961e0121e99bb48b5d3380a3edeead9daa7d106f86f2221bada805d38d16f5f529901a0550e02e9e7a7ff69ee11c462e29315592c1f1920f9d646fe80f8338514c50880b61d18c9fba0a9567264d0a60801893cd1cca64ab8a8a1fa96a51cc46028d733afa934800b110fa5d503d0779c790fc3d71e92d257873524eb58d70993ba8b41290a086683003f45654f84972f53e3c404abf866d2d5208363aa8b77982291b78ffa81cc35a2bce8973ccfacfbc1c2188832f383d16e9fc8874f10f13f2998db1ba6fb427bbb566c6d643d918b8c00649559239502ab2013fb74c28a8f84176784b8322ad7b75eebf5b1727d54387040d1ad1c0dc2b75a9c6b881c6fc8853406bf20dab5ddfcb35b6c03bb9ba199cd3b3e831c23a33b62a152eb306dd7ac6457ae600f664bab929c0bab826f857d96174ed7dc9add3a286bc5f91e44026b45922a9bf4ff730fd9e85298f2ac60d510165a7eb30744a8179a2cf08f97487c7c6e3ecd370429e756e1ee55b43918cc3318ee83cfafbe9531cdac1a16181e9f972ad472cfc2e4c4506077a13c84874371c1ebe2b3691b8a0cdfaa65921d76390ae6b9105c89ce0e20b8f7bdede4b9e5c7c339d06f0f8744c0ed67956cac29304cd82f8677e681cc188bccdb74e1af85f33f77a95a8d6f105d9ea0b140944b6ff078345f209eb55f5228efa2b9bd274314b3dfe4791ac0de4f81ff97fd32fed4c95bb96c4360d870ce49355a293429561e0d9ae3bad72d05732d535eb4594142180ac99784a2040c85f09886d81e2c1e430d35958782b8f35a2e4bbfed4d9a25c9e828ba8722a232cc43af1eca4b3f3a7a6d655dbffe010bfffd13fd78f561e04b0466157c2e3c4a98b162e554637d9319213429eb6dfe6308363df70b764553a7710c2ca55afe2cb96b3c562e430e79d71a6e1d73c118dae0a1f5d88f55d1318b535331fe0d120bb35fa01a22a3232ceebdc3f4b5be56d2870ccc7270702301a02ee4e89530184a919e74f980017f59e85df9855370a183009589102e579018d9f6466cbb695c4f97a6ac1060b55c07e68101471c8189a7b69ce183481fa3280de921f819c019f4fe08255a83071c6c74a303471aaaca991d97b65d377893743fa7e7a3f6918a30f8b2e0e34173fe48dccab80509af0182c9236a00a5c6cc5d0bdb52a70649b9e3ccbd5324607198aab81c1e5b0d8a472bfac026486fd13ac2351ba0bd75fffdf572ed036ee73a48a40b6aec3c3a3e2f5c5793c971f15951f1dffc464de561ff22f494f3e4c56a6999713c658a0be3190e73a8d9ca9e2354dbf951b2a3c818dd1270bd6ccdcf94694724a756c734b9ba22e7137226ab02f60d350255a2c1dd89ebbd798d66e2a2f42db454cd6d835fd8a7904c780722e8a6275d5956b74f929f869c62bf5793da10329e152227a751c8c8f44949be6114671dcea092cd52f2f09f819d60de3f459cd284b3e26c133c5194c51b9271f42b39a2e13b5254fbe3e3c8698835194278a19b027b57451ef7cc44f7b01288ccdd3f7112b01175981f39169f33a5332c929003e838a4d17fda84c86c5858f4e8268532448112ca64e4340f8f2c9ca71b62a7da7457d5f45f6de7afa848ef8f0c903cfe183abccce5de9e5403a84439c62f6a4b21e2e8f3ab45a8f8fa4b22b89f3f8c414f672be0dd980cd576fa3ce924fbf2e7f91992f91c4e8f49438e8e9c235d56609083e13f1cb03723bb651faf1c1054f0f8ec43a9aa1f246cb1753e641f6294d5517a6db8e26d7b21266f2a2b8b08322a85be2aa92ecc95a1fc5259014e24d4af49629db60fb42cc1aea7438271bb61df6d5e3e0ecc1166fb503204e1575f6aa8d225653a1c76ccfae14caaca116693a5032eea80a0cf62eedd103f70d89a39d4cc2a64f0f62a86e30e8dcdad4841d721fbee6e423c01fd70cf8b0b8836694b2dcd5340fe1d36a319fb17f2b877d8fc918d45048129ec494c44af12e23658b5233cc4b7bfb988c832878f5338b4bcd1b5e78c09ce6395dd91425049ea40041656638e7a7e987ad5e0a7c48e2c48b937222189d1a5088bd2f6c3c86bb79455a385633921729d38bd0bddd53c9e65523c57bf1e3b6e4af1c92a75e0edee267aa35197a7a6a35fdffcfe0e33b2887d5fb5b3149d665ecdc08cefa50898dd873dc1f8283415a65fd2ebc0c5850189bdb4e1b99bb839056cce68d74aad952467ab683636827bee267445d49c0014f095d6440041ad5768a239a4c26078a59a6fa10eb38a4faba04bee570a6b9db6b13ab4557f859a845ca0cdcc6e63ca81cd844832e1b5739638f4a7bbd53e3f25e62701f07a964623df0bcea72d388b03c0466714c9e589417969c49cd237aa71c727dc01aec6bdf0bb93532d2b816528e35138f71f70728550ebdd20811103ef37a1c505a354123d95bca0df5959b41cc1cdf14aa3dd654f510a913e761e15a90f2d7b35b29b00740cc7d42108c55be5bd2086ac389a346437d1fd010373ba1e9303334fe0a82d5813836cc26e8a3a7e5c13fab925b3cee043c0b92004ab85b79f6c952d5f37412519475def8f4d43a7561afba226e349322826fef46c1c96200ec35ecda2536f820c3299987b99ae967ee638654d26c26e51eb8b6b18893326eb9c7a8d50de16698cfef9d7ae8fa9baa7df2394b3651a062aa06ee638fd5adcb2854803ff52c6b304808dca4e3146e3212cf7d150b9950d042650a77b62c2a928e8cac4dc1a0025e1ab19c586c91127371122ac2be8a92c3e05c3d01e3c069cdcb17df51cc92d1fe61b4de8f7573c8a19f56afad89839e3cf005d3d2edff68ec0cae36ca03e96f68a1d389c1e8363417b9e6e2c968786805d6730a4df38639e7de7b4ff6f95c73a641840fab5cb661f1b7d593fcb435cb573cd35728e5eb321e9e702831fdb195ddb7e68d7eb6bcfd06cdd2410d2af07874e1651eaf07bb1a47f287263afa46453c9f9ba3239d3ae04858d205d9a9c0cae2650763f05cb30e412945a5958bc4deb76aaecc1354749d00220edd2c5e7252f26c7b78adfb267e50ebcb10e76e49f2b313627ae5e12af3783b9c9c4e23702d5c681fc4996e8c5434e6b8ea11ec03d3f90f418ea552600ca7b2ce7f6859d631cdbf1a1eda94e47b5350c295c2bd4f29b3c9f02cb2971c73a2a95315f5859e2631abec67a7f957e709948b28eacec039091aaa450c2089b3a96834921a502fe5951d00642cd11acca430133b4e6335136cdc0ef3f103583da1ca7b80de3547ec7fe38aef2ff6e5c82bfd10e98d09d155b48fb86f36b7f4c27ce4ebe1579be50adf90fa1097aa88119c38cda6463ccfbabb73be2d2b758227d7d6b4910faa52dc0a9e1a83542bd1a248ebd0f767952f741dceb95bc0b6f09f55bd505ed16537d6e9059db62be41dabc929d3107aac9573460817192ea588efdfa6b433b3ba03cebf7f312c8b91acaf8a3c87abfbbc37cc5e71fa5e30a6456096464c5d2969aca64557b0e2f6949e7dad97d3aa3114386c844f56e68549313e8a886e18f9a4eaea5d217faf4f8963abc1972535ccdb5ad02cf75faa4e870e5fdaf089b616f89b5e58dafe0a30150cfc59d868a31c9b601f26201e501d60fb64af8a5f740d43602e441fe85e487960186d84d92cfbeccec87f6a0b4cde880a0014dbba684944d8d305074fb2bc6ffffa4cacda82524272af6eaa1faf257077ec58bf894a3f6249bc67a2bd871616d4f3e296cd3f3418f39c5905fdc87709ad9bcd028c9d349192dc22938b06f7c4bffbc46935e8f1127d15463a68cfc02436578de57660ef82b7278427c75d9027f47db244482205f0ad7215885b84e78c16427038761a958810ab9fe69c8e28cec60714a128f60d45f7484c3bad8417889a41defbcae5706513475fd10487c790922a7c0c084f1720cc6a9340e479b385d5f47ca0d53d55a5f9ae31b5292c47011955dff57aae9dabd809e31faaacfaf1f9a8310044128f7c8fd42f7ce71945c581420cc752d5ff7ae793be85bd8b2175f778b039ba45df140fc3e1d59d872f772b145f7ae7cdc38e56acbee38f938714ad5d2fd73f3718390ab2dfaefe6e78621295b74df4dcf895356b7e88f939f1ba43c2c751dd823eaf3b5446350b583886df0270279975aaa28b545893d7297146ad8fc521b7bc8dd1898dc8d2e42f61896eca11cedb16fa171670fc3c1ee440606f32f34b3476c6128eaf50211543b8387cd16e4aabe3b08418f66fac3373a3607ee3ea2b8828c96338985e00ec714865388f18aec5c7d80f4acfcdc26df85e7b38480422f06d0ce85c015c5562bf178daeac47be30d9e949e161b9b87c17c4444b5f19e6b0c8cc01729897932d8bb72e8350881323027d86a3dc66ac95425e018ca956147ce0199cd084309b000466ddff7cd8f3856bfaf7c62d3007993147cf53740d896fd8a2132ed173833d894cfb36916b7f17ecc61229f92ab9a3dd54286dab24ddf2e1a5c4ec2f167da172b0d4089f9188429d59c78d462b3de1587585694fca9906421863ad606b6a1928ba1579465297564f831a9480ad28f031286a7168e001cc7083b09c242ca9d82d7b5b5003380ce7e8259eddac18a793fc20884ceffb5d859b951e3fadd11a155f024a4a9260a51a079fbddfbb097a40aed54c653d3971afcf88ad453418ce7dc534686d79367b0c370a93d6540838fbe712279cdcdac53734ed8a5eb84ea29a32a24125b2d4cea476cc57b792aedf63acc3a3a5f03c7d94821993b8ea0d63aee9f83193ac492bafaec2d1d5b4944f1b0c774dbf27c8836aa717a5d8ca5ad9f1e2567ee27301ed882472681dc4017216f0f9c458189c66a6864bec630a4a63decc9c726efb6dd15940e8a343e7103f81835967919366f0c932e00cb8a8c80bf2f8bdfe62319c2c0a9016f4a420c24ded12f7816c474542e7487e273fa51bcc64bf19df4cd644b2037eeb2728b8f768db2746d5e2d9e1c83f63b20efbaf522bb6f0c28597cf9cb3d949abfece20ad11569b087b06ad8a141c277ec68763cf70b56736ad51c9159e4772e59c8ec63944725de677a6759b6adfa52cb2503330bdda17c513a408814892d33a7204aba120b499370e54bac16733738ea81756b278cdc06297c2c14df50ebb5445b8d2c8df11bced6546200dfea2318841753c7adb064351c919930038303ae527809d3507e2a9ae2a77ca7a2c8f50a06907cc113dfe9bc211c928da5e2c9b5ab9c640d0e12c5d2f4cd2a8ae21ad32648debac21ba10d697f040f2b18f521b2021d2a269ad64672fa0583ffcaf79d9756a12c1626e86a9d8bada86ed574450434c30e1c2c7391d1fe514ca19a96619b38a452291adfd188066b87552e9f5e0d4ed3aad8e5c6b53023735c1b025bcdb475c00bb8d9edf020d8c3e08efe624e1d4646c75adadc3d777bfd4727d9ed331d9b497fe3267ce2ee9bda14a03929848ef4b61c544de208c7154e78badc3c32bbd65e30c375fc6739bcae265f2bd5ca33c07ea1f4c025ee6a571983503dc822fd0722e88cd6efd68033ccf7b9414ca6b4ce630832e59e2399b8d9bc574ec344e012821077c360e2e00f291d9280450c51894461361a85f5873e6d5d46bde82e194e21dc1f580a8a63bb3cf3d873d64af7219e24da42e6b673f830b58983fcb8db6856daac2bf9e1097f9c052d2c431c20556c2a4ac27bd9fa37e97ff4a2d01e2a87c5a7e10c7a6f4cf28da8256fca30fee442e7842506a2a706176d4bdd953870264e4661d5cfea3b8f5586b8704d506ea814f8c519adb9aaea19cd8fc561e5516e5b5c147e745569518e03d7fb5126e79dc0604bb8952a45d90ee3baa82f8651f7a85e887697d162142fd85d1e6bbe46b259a3ad0ce9588a36d087a56ee5c605c0a23117e181a8ea7a27793e8dad80ce64ff5052cf4b1319b4da0aa6130b41c604fc6fac2e1572ad578a561612050944e83ee8642d574f9704b97347436dceb3e2acf2b4a1be03e1046722c4f273af6dde9c6f2d1035ef546bdf34fa2f129f3c9120fe69053ad54d00748baef7dc74b61c9437e1c3f3268b44a292043be04c901495cda8c0692bb931d0151deb098346f6fe6498f15efd6b2e4f7efa0288e7622a849e658b45663224c2eee37c7c14a8d5c41d807849027fab4ab64310007161a9b2adabc990a5746118570a565a51121591748eba4abea5c712b4592de578e31e5942aca2823fec123706367d22a2a355d4bac15a9c677787dcd60c5f3369bc2ea384742bb7d1fc1831fb2ba60b046cf54007effde30bdd1c1fc279a806fa5f821d0697461382436530658300b8853fe084f4410d439a65bfac36dd448987894ec7b49a4c9f889a0fcbd50941bfa6068631a1dd6e4352c0204943f56ad9d3d70d32f0587e9b0417da073660f9e420d544df06d0dea451c35d8c0cc8f127aa542b3d6426d8305c8c194ea202b88836ad4620b55faeba423e0b457364475a13ded8532776b50fedc9202135327074e9aad3b024dbad106f226b4fc021d6be9d15f9f2fd24a4b1529688c44eee0354655d2dbe705d8a43ecea377549328acb5815d7d534a183505d6eeb2abaa842d69c1ae90b420e15c6d35f5fe4fd4cb734042d730130e069ba51345fc54603cba2c8c38985eac5ef94e21de046b706940dce4d861133d70b8353f7a47884344ff66f918716718c12c6431846922d3bacb290c07561adfdf50bda3ec28dcfcf850c5dc068d36dea21ef63bd8f30b9080cd39eee93dfbb0d679267d5b928cf0c82e82ef6719362a9b03b7d6e586e0e846c4668a143695c1438f7214d634f5d65057a0941a337daf747a7114de3942572b955204777828544e0e82d9431a60d5add47e09b99a23f11f218bbd9f8cbf945cd2b5a6c391aa3031b4d9ae3d030d167ca5abc64bb8653056258005d2d29c863fe12a1b175f84bfb846ab4edd36a231014cbddcc68a7f575093cfc509871f4de7f8b7adc2af953eefdc6b933350e6978421e29477ab1dbda1f6ef45866b559082e798048a6e540abdcc05a810d362bcacd5fb4bca297b0a4533a82c0e8c54dd625121418a16843b8365f9b7895667b777e2fb640dbfbb30f3f3196c7022577f129f2ef91769a290ac70762a38129515dc4f6c86f18e7b277abde0bffb9837b0be0bdaf0eb417f79cd482f9cbb075127425a011ef884ff3f779676355f4fb8d957ba5af20af36d618bb3cc004160a5b9f498458a95ccf6c2207a71a365a501d171e95222cca9c8018d16a652c47df1acdf26c119ea159f1168fc114454d6bcd49efeebb9d56d2c6685719e050297fcd8141aca640c77648292c39b1cd9659039c9ad3f63e6760e661ba633d400e2a5874a65f7d7db47a3f6d6eff912e8f5333f9f152d04e193d31b199d2c6e4fc2daaed7d4cde5d40ddd4a9bf3970e7c1ec0c63069b5d5e6aa2988365d0df70bd0b430c985c977d7f04bd61bcfe3c65ef92aada611f5d6d5c03e569c88f5465a2cb9e7e85a158552631fc38c40e70b4ed29bc48d2ac4883696f7a84ee6fb2bde1149f1d1d40a2a8b026d986a73c7b3edff846e36cbddb01bc80122bd77de0db9f8599ebe9cdaee5bf697e083a1f63808088375b5accf430810aa3d1b339afc457d1a49e457bbdb838a0097da3b3a698d9f730a66387d6e6b70f5448bd93cc7aa014b2eef5b0b994cb18a3defeeb81d9636d318ad2c07849bd83a45d53a78b7f84de9ca624f947f080d9c3f00f9173f515d0157b807bb443e09f0e309b68ff636c0c03ae45c9237708b6a8b7953489577c07378ff51f032d77c12b022454a31d86cf4b4e239b249fde040ab420a1e263e90ea0eb99a0a8bc7db5518fd0623182baaa3edc0db9bd1a1cc249118c5cf401216cdd8f72ce9c4f32d01a0f6399954bff77cb304e22463b9ec1e1b1b05b5a73bba47e1ae1c70ea17221e2f6e0260afedbc85d55cb68110f484a258c184957e61efbe6a2e8bc2e44f409dcc0493fab77f2e4d2f058e832ce8588771f6170bbb397ae912095e68730092cbfb7b9e2f36b371bb1f286729b1424bcb75f7033467e32e94d246826787b117dff0a6cca95b6703d90c106f7cf8ce688314845d0e044444cf3c80c035f10b9b86b582c318057f4df6f99e4141a66f97e4b9009d058a79520f1f22b18dae269600173181a254d705beeedf7ec24a1257d948cbc1dcd086a062f4729188baa03a2d18bae85ef9f12ff281ea4398014556155e2192701d20e0d6c56910554df7b56e21390fc48f00e9f100afcd642c2c9eafa819beb24ec0406892a71fdfe961a6d3f91814f62e60bbc6607bb906276be69afabda61f3717279b22dda766df903b97651801b9fd7c9a9015d3152691443504437a9b6d73ef0289d9a2af904b763077ec581b6d871aeb42ca0e8203efa77615486791331e0817f414a28ec48ee6552b0ef75c5138f02485d4579c2ec3175d9362fc88f5cd1427c99f4a09cc31af6bd87000bcd5b7294b3d1d2b688de7affc3cf603467861bd0ea1c8c26bea6f13629e86f8df64c6244cb0ab7770dc6d536e8fd2348c33ad25b465632cf97b775dc92b94314d9b7f86d9b8c56b5eb3a399419e7433d0e06b3df0864ed8ce9fb307290eb028ba5e5962ed10b305b5c9b621aece939031ebb94dc84d03bdb29c07c6a1640aee82d7a263320f81f47a41a7b18a108ee9604ffd145da6eafec24f2c4d99bec777209f89180e8b10909582984754949ca05c02e3a5556c507da10c67a2fb4f634656caf21771ba93a4848c1aa3dc369e815c1c953236ec074bedf912c73635a0d8d4e77c8650e6b68b69a5f98e9a03554ac5a673db994cefaf7d6d0f5830d2ddb650d1957f5402f4aa1f6f7db5f0e6a575843b8c833744a4dd6901cce11f3bd2e635a43d6c36c43c9d85c908495968ecf09da104161470dc599c59e86246bfd4f1fc0a82ac1ee127b19a939c79c43fa533303e8df0f67b654296f5385f24f91d47b206d061b2429d276ea330b35e3a51b63a1060ab283c08239bcb786bd37baa2a01eba269d8b406bab0bc940eb08e9c42d5ecb131f017d3ab67f924202f3b23fda4ab852c8d5ceb1b9b83c40f7ba2f45164f12be9ee3e3cd2ace2fb3e10dfb2fe3af83f7e17c56388d0130a33edea4e8df88efd09ddb87113de1771d3eadc8c238a20ae433987c4499f3763bf615a7ead885e230d3e3602b53d207b9f18f23b4cc76de220576de48c7dd0398f0845c497cb1ec9fcc52bcdd83190a3d216be940513fba99df8c592a1759a777141e1a50e333cb7157dd32bdf1bfd0628a972d070bb6ca65cbdf8d9d5a6ab8e5b6e7ba7108cce2d064e0e178728323f7966422627a15575d225eb7733278f141206b071d0b08c11ca95e2d172754be435de4f08dc8c0938e0a90d6e3e501192252b15a076fe938f4e2bbf08c2857445389a5e0bc56b49271f8ba764e303a4004ddbaf993a537739434add717c27f95d8ceb9bea96c0d7fc6345b6cc141c6519f48cbbe541ed898d613521571d2793d8867129d96d2dd9018d07baf6392692e2fa8bddcca1b2c49185633dde6ae54a17a82ee09f5cdc58c6e641e39885c9670ad73f138c1dd93abdada0d8df3117d09c7eb9beaf5f10f46e93e2a5f9cd14045dc3abe1e37228e40fbca0aadf7a59e38ff72841238c3479e3830f7413bfe8133911e371e2f1c669ff871105a6ffda2802c49b72fbc80ef84aaa2fa1231a489ebf6341d71edbe7f0a9fa27aaf99cd9d9d78a2c6efb4e1e2541dd210a7d68924cfa8ab741a465722493735f3f801f16ca40e11a72face6b6551a44a1ed4b0a4496ea3e2ef8b74499b886a206727878a2df620cbfac2eec0bea0b9bd6c9c5b56802d51ea06f505221361c78dd0f8792fba0a95420749de18abcab4ad3a687d5866402c0cd71ccf3bc9a45a26d7b78ed543671268ee5345af1e3e34a88407872c161f92400b4f2f441b1ebdb431ff5c9bb2cbdcdf7556f6a9c478fe195fab867c98e7651b986787077fcce85ec9d3a9d1482a88fa6899e2bd283ca79d29dd57b4caf406bf795d7d2eb660ebe7d87e92ea00e9dc683d8ad6a1a7d3ae0ec8903243128dff1583a04113662ae8283e08089e9bfb24776e454d1d13d47f0b747e53a577fba98d75db70d87a992d72321033b436e74d5b9de9d90e6b27a5871de242ba38b5f34331872da6759b4bd8500ee443a06f088beb97012f3e56bcaa7cf2da7899ea8072d203f488b58febc2fd6d9b578070034ccae164935c82764b19082c4beeb48c89200843924a606672f50a3294c59c152b9d909f70e810027d13a1f43518527dfa32fc71db3108fb23995113cb01f5d8ed36e7267d080e5351efae9e602814d798f6592c6681c8d829f096a63fd5b59a6f15ceaee6bd2c663eb51a6604671104e1abe86bcfce2336e4a4aaa3be7d555a23ff5432f34e1ffb78e5bc194aff27202ae63e3b3a0cc5aeec3946a0b4ca42882cfe0c836da59b6f3b6b74d570a310750c4f4f453ced577474dc1e2d4a77ca9558e87c1b6bd6aa29c13a620be0b99b3c79476efc396912292c1680205ba3efb4e09112c8033d97fce3070a6aa0be563d0344d8eae3f1268f22bf0b67ea7f61d53b5540bf92e15cf9d74fcfb6b2141c776d87ff23b2d3c9268ccfe1aa6acfbf59ab1f61c40c614e1b942879052cbc135b86aff93e7ac8fc5998793c8cc8270928a9c0d51e4de2d67d87449d8d4320a8dbcc2138d56e604797f700885aebc148e21b20becde7925fc7966990605f6e06d6225bf268b18e2cb5e1f8338a51d15ebd754b24305dd0f5670952ae77e5f3a35d2c050417a6adbc0b3d955ac9c5b37f036407994ba22730e3399983cd75d5a2534ef08059b50a671888d5df00ba3e1fe04959836d7e2b763e8a6281ad0281a1db8fd64060eaf33c0832f05732a98e547c0de0ec43817b8ec8ff3175131a7cb7d039b6d8b9d9c26380153038414a3c520acbe82e346532bc180187806584500da76ff1a6256132d58f28f29266399768519285069ab8e5ae5cc27fca09dcd38ba269472a189114a3f720147b897f6c5b2319168c8c6d8e8f9acdb0367e6f33b21e88069134de406c291a2994a089e8927e03c85681d3a851520ddb3d770204890005d447a62cbd338df8cae5983ccc2308f3c078f3b2d1779826818ce23d44613a594b65c1f0dd3da63924b57b8a8cfbecc37c39ded6a27fcbcdb7599080954d460637c916c0519ca79d5f04628e1459f1cf87e834945c2af289764c8dc801aa4767ab0bbdf562d6776a17c7712d8a2e43ec9a89245913d833081760fa54439a5186d17904fd5930b525ac8507a5bc2fa3915deed87139bdcb66138eb2c9865833064f14cf566a53ef72f6e1d22954906e1cbb005fe6c962fa5ef4b1c818a756d28ca17b3e2debe3767ad82f24c6f1b12e7225963f96f8b086d0474c8f910368fd2163320676bfb941a335f61a798f8d6f5361aa2e8dc9a596235b1a67a0ebbd95b2579ba0b133e711ed0cc7a73c1664e1f562cc9c78b4c8e1002e4bc318ae7718ab33df7e257ec674e64b4d502151bf54de024f5a253b97fe00c07469cfdde7c8010de18e1a0da8b613f3328fdb153dff49b2a3e698fb8f5018c7e573d0ffaecbcd525616a10b6de40ea2adf796f8e8e4c9f02db1b0322391c5f7dfc2f92a9d8b4c37c051a281a72d43a1e1914c94640dced09aab81703c4e7323c0d12e55ac64f783ab8f72e58011c1e687ff1eaf8b4396480c280b8b5c79b8c2c5c4b8a344478035c5bfd077013e24b78a645349628a8b3bea564d08bc1a3f7836d6bacfc2ff07515dc308721fcc4080d024b80dc79f925111de14d30484878c0c84d13bd8a3ecc1ba8f1e5d86e7e08a6103178b557f94eecd2175b4b6009b8821b30943dfb219300524003914a0ae248d353d4b44efe5373879825ec5017462a4118a8ddd3eddaa1b03b365cf567c48fffaffd11c623cb11497b550f1e81e4116180bbfc91d4acfd780e75ea2b39878d420d75e6ddb4c92771ec94a8e3b40ad5aa37168cb489fd9d75078a4ff75c19d01dbf4be98e54b5912a236b6b848a6938d65234070e376ab4efc1031eb9263a5d7331b6349e640cfa06ca3762e5df640ca76bef05a40b360400ea254a57d73f90c96c2f5ed6df777deda223c0da3d082f34d46f64450c70130bacf1d3eadba79122649d9ca67618de8fcff42ef741c30738cd442f25c6c91cc181e6fe3d413847c6b0cb0564e36ae8c814b448c0ce19a74b0d8ac0b70808467fd0edfee25a0e16a629f4d300038f43b3ee1cc73b7616454402b55620f11f5c105290d28c29a11fb289f52284f0731f18ba396691697efab35b31e75edaf7e6783ff96dea49c9975a5bd20f233ddda7d7edd72d005b76c8b5289064595d76f5f24955ad569a865e96c3356cf83713a39cbbe2f1eccb3b7bab381ae9c4df592dba14450f2345281525a4b8c94c2e6d841c7a6e693e2ff77e2a03943a2c50e3361115b02b837d7dd06c436441df5aa81d50020dccbb47d3bc8834f2d72a7df55d4b1cd9ead8636da9fae20d7dc81c0c742699d7a49743e0d0a34cb774fc0ca7d3b0b34e427b52b9fe56386e7148a610de726225dfa6054b165e2ea2f6fe54e6af7d900d3ca00a4a35f7f35defedadb147484e196186f0e45430f64ab06394aaca5d429e8c285b19218196e5f29e32f9d5f1875469b1fcba8d02aa6d4e3db1dae3aa7bda6f94b8f4d083f28ba7c182adadf99a708473e89dc5b9e17f82e9d1dc2b6634bb50f44bacae0f1142200ed11156d331382c0233bdcf0528df216453d3e2c4f7cfaed18b2df21f7b6ff79fa6c5a607f02604acbe2e576ab7d2bcd29e49a37023becb3d37435596db32f69352b3d24a9c2a831c4cc7ac79e6f8fe1bd6f4175df989c1e0e1da6dc8f5bb2b989ec5459ba855e2507c55df2d0729dd9aa19c80992615048c8de158ab12368ce1b58efe64eb28b7841d3803a1229a4b7c679dde60393d4898dca0a91b86f526918897a5fdb838097a1be442b030fcce7e963ef73cd718fd1e6b869bc01b884d36e763a8f044384c94971df1ce7828e2d8b1ed652d95e17179ea3df5b66a482c725cea567a6a95ef40533f0a05acc92fdc4b4a473b665d871e59b2c0500c12c4e7b62ab75d86fb3141cfaa5fb9912e3c375fef5510801797dca3846e10aff94a20283ec396ec3c134ffe687062e08b84ecdce4de8dfa8c2fb754d4e6de4d2c3d6d3cedb5481cbd97219a5a0931146099b6c81ce3df12a80542a68c99f6f01099d9c8112eb8732dd7718231aad8d97c5c29cd19c3f8c4a11d551303ceeb561cc95a996c7b5386ad5ad691181fff37cd58e24306a4df9d0b3c78c0fad00e2df332d38f3a0f9de86baf9ca2c3d815c53938fc9286605b21a1046d26e8791fb39b6f2fe2a6f02c4d5cb20641b147cc31fe89a4ac16a3a88580b8dfe165400a936541f3276704bfceacfc62f7e271bdd922953356401376c9336bb34be859a11b1c6618c4c43cbf0766f126f50f8ee972e2e61c9e397d97eef802214e0d619da2f8a0a0bd69fc610061d8911ac977d378709d46b29669c4d2d141583bd1c8acd04b351b1ca6b06dd7e7dff8d15346329558427ccb88491f4a3b29b67b591e97083c6b5048b72ef4c8b73f654d1e0cb80a6dacbb8395b96b85a6eb4b8a5c2b4571bdd2b274e351a634c2af7578810551e46253516d6226f8f367a0eac741c8c28a5f3613341284cc8a11880a5cef1dbfd82850ffd7d13591100b0a3aa1595657752ca765979b7d3080c153321fd2464659b804c09ae4164da5037bbc53ea539ee674e099c8ea3c1dd02ad743c924b7dd216a0edea22bb9b835b9fe54f63f96d093546614613f426490f5100cf774a88397c4e853e279cd762752c269e85671f5e47d1a58326a2d6e3d98053b14fdafec9125ef0916dd1b9a598814388a6075452b7c32ec8aca86710bd15e611e0b51a9aff2cbeb37c41bdde0935cc449ed67294bb204b5e07db59f0930e8d35014ad366f9394ac1755a8ba7ec6c7ac4073a6dc1715b687a4c7b7c90624ee15d2a42f2afe1bbde22e46e49269259d8c25f4331afc10a5248c33a95177c20ce348c424764471f0b8db106419cab2452f49f6d270c0c8d8288dc7003b69ab7e70f3afc06e17a165b2637033bd845f9729c13791c67ba4e32c60453259dfb5659a6df4acb499c764d0c0c7b8f37e7144f2c34f1b6110eb371ce237ce011405cd2f2037a8683ad53e504833fb5953d91d7d98b61704401c62c5dfb8970aece41ac74686209787c6a04f6f4c18b0be001669277fae213898fdf6bcd388ca7da17c6db1ed28d48ddb938a897db6446566cd2684e9182a5cee459064be7411425363657b7c97a3b522faeff555a6fb56304ed32335ca69288835b2bebd53d3e507335ede6e555b9593146d238dc94d12d35e9176c27af56e733bb335010aa47ca0fc463e9639fedb418546287e66069fa3011d0e64c4984ae273549c37a10b97c47b8cdc2b539969ee5ac950edcef19f8ef0d4c0a73bc69a8e8bd80da90abab6087a492c6f860b6f24be89e24e36e6e9982fe34b310e6bab1c299ff7579b1d2790d913524ff68d48388175fc789a045e27d79bcdf561a67189c71434c090d6bdebfba6bf129cf4aaf8e06a309f41337e93ed7ae771bacc8848058572529475a7e849333e5e32dd194f17c2bb7e732e4aa1ad080c593563df559c9db5b1aa2300819f3934e29cb3cad5252bb3fc1b211c49d86fbe5664e9a3535b0d6e455b802725733e16c41e59879fcc313e39832bccbeaae9d3f4469434532ca9114aa37b5533a353683bd7a98b84161345036a8aa307daced2d80e448309ffc0b8b1017ca511926b37cff9cbab2cb81b2f7a7c589654b2693b3b6977c514be8b654be2e426d5a365ec862ac671e6d42671b25470f4b0fd3853174431f1fdbf872513c9a62246d1468663796080e744657e8c6e6b7edaeb3d797c66dd89b3cd2ebf66799102953bb3d145dc8dae2b7f9d5b772b6262d0b9e5031f7ad136e0a2b1855afb0e2dc46cd8295e5008a2fd6a52157bdee9fd0466d22a26bd02683da7910a6b6b881822acdc91427888cc23bfef9f2127eebceee6305b2d912d13ea3a07b3751162a950ee89f0da5791950a753685b1698d609170d729b88deb904b0a734f84d7b888ac54a8a339bc6d3b557aaf0eca937d6d40f152d7f235faabb02428b2ea41b9583396e34b8b8c8b33c2ca8dcdc86bf363863a9a6719932c5f6528174493218c5c22e3332bf018d665666320504ec55862c810c370713c0c6754ac30aed85cc1905c7201831421f9c5e1ccc9179e95a2bd504333793189e5db85f2828c2e8491db5c7c6685e2c2bacc790b24cad116cb0ce15a182a8e68e1848a99c56b2fc294f17c7581dede8bf1fc5c5826610b644827d96a81a86e3792a08547c8229ac3a2f2bf53fe7f86b8316ff2c8bb6e26717e72c46139cf2f563b9f2ca73c42a1ee6715579e479e5f0e697867a70557cd13ce258f3c94ebe9e2ea7393e54b4616d2f99cda156d53166bab957ba3496deb953a0ce3e2cacb27372178108a60bc689884a9b1e8610c1a5a1257f561e0852f83094730092c191486a7127a12eb88424b89774715caeaac5736f4752ecb9261e20ce5183659b64a91e619037f0c03954c019d75f8c551500904d00c837f1c8196a001cd72f8633028090aa8ac813f1e834ea280cc18f8e208a8640a4896c13f8e814e12806618fc711894240d68d6c10b15474d214ad4e3921c71bd99e2cd45469a831d9846d53fd1bb82bef52cb9b3d789466bb8ca72908b928b292323a9915c0d83d34472ce4e1a719149d98b91ec9b02561affc1b977e42d837a47b000c55925837db8a93a338e4a3bb6e9661b0a566d8e0fcb63e4777d945649f3fb138230a636149a04579db4c7b78163ed22e9d03e7b5106fc26d87dc77ed8b94737cd7b0b58f4d6f352f992e0e9bbf0c6af5ffc7b6d8d01cbb5a8369f78313c2e449bb734a1b3acbae8a35a8e8faa4e1b6b5f7286b6652000a388c281790f4518c25db40479531de491e9dbbe1b4a80d66cfde49c16c4c2bbaaac7bb8ce4577748f28ec96f6670ac6e98b5a8ec6cddbb0e1e4fd060c15d118cb57fb8bc1a7f96f0e1797801f4a38c1dda2525b7df018d504bc102480452e3f6ef47e85662a50f3419dac4be472ee679cbc6cf4b7c16d83573ee14d2b03247d91ec091b2f134dcfd6ff104f2adf426b69c10927555d04b8c739709f0add03a035247ebd6624dfcfec8d94af3aaca984541b22cd966cdbdef152fedb58fed2a428af49a57d153b18d4fc4d3839e0d3f0fe0c57c4490a5fb33d034e3f6e76649e52af68afacfade91a5b7eabc79376b54b1b0d5e7b784ef547af4bcd28ce24a92527465a07cff29a9a1f10df6e78dcff64a8fe0a889c8eedd1bee5ea1ea5df9daa4a297ed0a4c700c59c7433b84f4345efe53d9e65fe53998c83d0ecfeeb5461a27ee7abbf054e28f33329098bd05457bd1aa54e9771fd070d98761efbbc378bf7f6dd9c595b421ec7546f4a16e21c4d63bc16d968b138f6dd0d8a1cb0f1ca7ff71f786de075825e2613ef6487357b3f648c5a16b48a9db207595431559cd1692d91e49f80553e92511c9dcec32231beff22d268e01c3dcecb97b24a9f97464f45a1b9d798fda54c640076a4adad8a97546c1114a1d8385cca0ae6dc74478d71261c178306021e6ec6fbdfebe228b38253a769817ed32e2d42290fa012bc024ba9964a7932a797f821bc31214cb600f3229a365adb631c3d89c7a6fac104f5a76949b27ddecd75b1ead442a7f16f685a7930f4c21591a8a327e7e9c7aba3815db567fbab82df314d29c187fc97521eb0d7aba9ccf8797e58527c18b58509e4b798c39c08e2526746e3f5c0635729d5ab26852604f48f517206745c7a64c43404b26a8f0e8fc7aaded0dd77595cbe58ca13f9cd1bfaeebd8b39ed112e2bfd6e535476093b480f28169d4d558c26383e50ad4a8eedcf0f64bcda1b412e331ac8ad254c2e5b9ed88dd7038211db97a8bbe9570eb7237943850988562d21eb059dba290d816ddb51e729afe3cecba13c39ffdd3608f8fdac0cd490bd92bc6cd8ec86e34b62aab67117748dae72f049e4301369a8f137b7534211bbb020baed733c7bb5c1eb622cd79a5a2792c421b5308266f79c61b4ffa2f6db983d03ad1d601b71c7d8806294539f816f5db3fb13f54ea933df4d9bd435f10d2cd318da0525415e90061f2d78c561eb6727df94a41cc8501e45303b6bdd9d228ed54d0a0597d8c4a81ae0ced2036ad16403c7edba9108fd7517b2d1838445502125709b03be681a76383c3bb910b93cb186efc817f3c24b13b957df4f78e02cf95de12303e58427ff4e5578309b69cbd02ba8a0f722282c0ee05afcf7417f0562b49ff68f02dcc87f614190cc48868ac04cbf542b262a41e5f14de53e72db05e12383c86461a3de4d9e408d815fb265641b0d7f76a7937c8965981c0d172b792f4c00a30b46ca3595f043d1e4e1abd58968659d5a7de5725daddf99c626484ef8a14b6fa03c86ef02b14c49e16827b1a06cc6f4570f27dd11f0b2cbf1c0ac79384a318f53262b978fc11d96962da9a8d8b80668651804cc583eef81a7fd783a0044e6fb07dc03808c8921e8eccd2d7f8a58148187e45c54c461883fde37d9ead33a89fad3efbcfb2e1df3e8b34ecf4170f2a6554a1f1941b30713edcb533b9403cdb41524361a4e038ab035076c6918cd700ff4fb66f810882736605f6673328772709480ceb7cea76f6d23d23fe45bd1411d34d3971d373c833100d82291035dbf415ecfddb73c7627155ce2b34bf3d57d80dc966ace9faad38be713604002157ce399914c5a5bf05d8ce348ee56e7c81168233b30ac9c2423d3b9f33d273725f82fd6d7e0e3517376805a082019400e5eab4b99ad8e6a2dee32596f7a794e0eeeb8560e25c6da756e7f6ca2f838469ae50bfb5f776253ebe74a9a0697e911df1b5985d43f10e8c5e92a5e46cf928691dd054f6cf7b6002db03fd08425621346ef26c8778ef4949f70e23f7e9cebfcbad4e341b9c97ac3edac3343467fa274d4578bcca9e30adc81c57ccfffdca3ad69cd35a5526ce3a46432cfe985e4cd1dadbcc73244bb3f412e9d8f41f94bc1abf3c684fe36a56f20117889f4950eb2ca11b28288c86ae7ead021ba273f94e11d214f9391c6b82f7db1c3ef61f6c2e25ddfe911041f6e829d8164b950c1c8e835da15d94000456c4ef9ea170f4864df90c6d71636abcde5bcb3b3d005127fbd07061168b6fb587e4ef5db67d0af218088ef33e249643ca0db27a673bfd57319e958a807a051a72e64a92ccbc4fc8ee091d0699d3c5f3cc4704ecaadd08e25a48cbe533ec6d66ed7b8e990254d251fa0ddd2c1f65e33ed20ebbc8cfbdf8490ff5a755abc8ad7305aaa0ccca5e0d92d51458c80e639de01db374a7af9267139e666d6f50d8a038bbb9127f07cc24b05e609cba3383a7daa8aeac9ebbe0fd3092d575b538caee4347850b962ea2640912dd707d5975e9476b42dfd1a25faa426776297e1710a4cd5db69288159ecabd26fa2188d815ccc9a450d38120c36b2c50f3f851b4d34c5218c12022543c8562ebf09c581eaf0e4c72f270ce41e182171adf9e50eaced051cca5a390a1cd600a899af62ee4781d74bfd9092dff13b09e0a15d728839dc1478908b606d60b1ced39a6a9bd4db93852bcca906267e8e0ddd33aaf601a5459a1d4f697ac1ec06fdb8ff61c7b51c666bda5844fbc126c632461fb05d34003fc90da312aa1b740cb4d5762511fce60d0a5864997d3b683a52d8167bc370bc9b2d85081e7c84e8495655b6a7a9145063ba6095f13d6719fb8ea8fc7cc354eb2a4cb698cea09f2ce645d97aec9e2e354b294356b0d3be92b1b643783586dd6a3d71271f155294f9a5b858ef4c908de9931a696c5d1f759fcf85a9a73cd2d2137fd6482ecc618abcf72e95a263e7ee5b3cd0dbdbcbdac8219310d052f938d5a33c57eada5744aa27dadab0824edc83fbb1e2c55f1ccc4c9ed6b0f8a360bc2881d4fc0d012de8be0b824018a340180cc32b382cee035f61a02335360996ddef007327e80b4c05322a177d3f5b47b577c6f13456d387814f1278b86d420d78270249deb9b4692e5605a57d71758630feeb0337a23de36f9c50c90acbea2f6e73e8dd90e3bdfc4bca1b030bb072080ab2a244b1ac43ded48af2d4c63703b5565b9d82f29d579aa5ba3e0bce225ae9009622aff10bb4bd8b6df7a808d1009990a3f29f260dd5e85409f989971e1a24bc15d32ed567608be93f00f3f64a7995a70f3a1ad193b0392f0affef699f84747ec345a0a25d3853cf9d5f496329b8bd3b446c9aba67a76ad1912b55bfcc372987cb014e397a041115cab9709101e42c95c3667096900eb8bc24b72a20cec992601f2a908e145860bdf80c8bba3eabdf07473563aa20f059c615fb70f0b37bec18518fdc07416c413ba499f0ba637c6a12aa099b502970e4dc0546f99459f9a6c7a39cd0dd6cfcf9a4716c0676b04e791c221ec9b57e03359c1829e308e782130734797c7073f6c3b1be051fbe7f2091f51234980711c7a5260a522972ba9b0bd5d80605179bb1807767b95cc75a3ba956378362bb3aa53e74c2613a29514d8fbac4135f3c9ade2547018686ffa697c53035bd66dee02da284eb3fc313091f5c923ec65fd1a0afb4425905ae7e5583f07a1061daea02767b6147a8b6fa88530849a4d046b468ea267d3e664e099b962c70d4c6b6b34dac59dc2e026a8ee789176e6a80b9ec860eed2827cacc907281cd7cc163d19af4c31cf2ad850d84180cbcd5d986da59dab96640039b40ea06cb74af14b042be3ebc0f34bee352885c43a9152e957f03d478551a03ec1b117cda45cc228e5175e342323fca1eb090490527dacf89851caf439203b2ef37b056b3fc1d36f67c7529dedb081b5aa6461eb2bb1e32554f4b789471891c68cc96643161aab76e33ce9f24f796129cc575127a627845ecdacc27432ba9a21fa73c6dfacfc34cd403252fa2ec50e012b4cc22f707c47bda54f8d9d37b0656abe8dc80667337cc86632a5cc99558290311e69b5a3dfdeacba7c513aa34cd7ad7c25417cd3c14e46f0c6b9729bb1197e1ac2fc1af27d7d150c0fa9423d955acb52922cbd049f2c236a38b58e353884179afd6d7572735044b50779246b2c883ef50ed34cf0dcee9954eae3443a283391a20386556b64388477b2ae71643e83cff7a803c20d20248eb245f02ac3d76ff14256b122c54cb6455862ece5c0c6f02cbae2c4db3067a745a3f44169179fc4d3ec57385aa9ee0495c2258ba9bc2ce30c101609d0435bafc3644a4498cef3587c654f460fb50fd452a5ddc91db6507d25a633b925ea42924e8e8cb51f1d1615e0a7d34273570cdb6e124d35f6b2827d9370b5e4e99e8539acc9d7e530f3ce9aa1249eef1c5ea78275963d572425adbdd10b504d8d483544cc5d1763c87e1cea9883ae0caab0edf70a17343365e7e2f5a411269b38df95eb2a582851177da95974aa11ba83f0469776e5575e709d2fb625358c966f902ceb519a62efb4e0fbe634881c75132fefa7656535c6430d37ba0cb0a2642ec59c33fae1336651a197513edd5247892b6b7d4e4a854c116f1f86ebe5a1944c2c207735d382f3033347fc812b0638ecf86c78c7e7333cfe0aee95304fcac92cb69fa80321b4f27da20bc59762d0832790c3e10551d68c4aa9e329372a8516438ea8584fbdc2d8539c23da8b379a251e28089bde8e62308a91415cb9bf2bcb8b897faf16af28c8fe92f5d7284f7dfc4a6406afc40d27902b2f56a47ca399359289673296bbd913bce11c2b881c097e8ad38657a34b7a83cbbf7404e29f6c55409a8b4443c5ed6802d230b5558d2f1f00232fd11129b12035363693e5a44b5c0360206073517acc429cc80aeb18cb610f48debe0bfd8810b74d60334b1e84ac84058d2f692b0bcba28e023f906c3bb2ffb810ba7f8ef02286669a67ec6c2cabec7c806aa5fa64d2a21c142f20a7c15704ecbbfca9915c048cd157d8159556cfa5844734c09ba2aa28d4cda17ca9611d0114e079e7c7f3d92b41385450a0dff50fe49327c8d4ef4f0de2ebd042098edad7e913f89b1137c32cbf0885cdc4e089a0f61c925e12807bbf4649964dabb8d253c3e7f60c904a626a54686d0090621aca9bc811f8302a58dffa498d199a1ab47af4282481f944122e69d8696930684beb6d9fe7ef4a637fb1db34d0135accf6a26127a069643bcceb6c5eb93dbc69d85c1d44852b81748291e8b51cefdd3d4ec496a1ec050467e7c614f39b86758f6db0ac5e0a16678efd09f1930e39b534ecf306ff9f911049ec9c1267c8dfb7b2441baba50c62bccb9371bfce9b37ab19df2d71b702c15d71825bd233bb7e1f1912c32929c56b49ffa8c76c9fc7fc4cc13e68fa9df7ce5c1eca4788f6ab945f0cc45b1d5b5b624eae898196b1d8e7800974cd0af67404cb3a006bc38417ab3009f54a8a1d62d9aef08c0a2262db12d47554b341403375ded676df2bc78d1fb1a46147239d80ad96bc9d5e78a743261e960ada94cbeb04f5aa5366ab8ce76851c0971c14d68f091a2779758fb2f9e2f20daa5093908be3bec29dc840e681fab0f78d3d0cecc5bccf79f43984e5b18ebdc9b2f7927509d578d32fbe864db83651962c980970e552179833ce6f92d141a1f75fb9a1e08e6779845f8ee8da184de2b65bcfc99e822f42f6e2bf2d2346ab4be8c16bd4ea463e9c388483a3062864cc22b26a0973a716f72333721611f994af38396295272e18737eec21b510050f2d3c32bd2229269c88df1470a38d0897e14b7254fc8bd7da55d15f2e2ce6f56d8a0384e973eddf35950eb1fdc188fefc0c4d7b22d2aab92952437b88af011c7d54015139e032da9300f5e8e6def141b3281d0d85865ac2af7113474e4cbb757a93d320ab9ecc1a6984d4015f576b0d889d9e48514b5421418b6de2c1fabac60f5794c55e6d6053017b053c8d0a8df425471c183074d467efb0600028f51278636fd5d98217b7a038368f5ea0a33c1fb505041ea12eebf36ccb8b14064f444c96c8007772f63bf439670db4b8e42337ca635cf69e3d51797adcab734a59b7a3a7f673fcb5e031265cd2aa560ddb7590190c83a5ff95d6cab4f5070681279b212f3fa7962b1454a208a74655552170106d1f8040daec618bb338b204d3cefa611360b98fd042f6498b6a59b3df70ecbdf9fc73c1658e27e4faac7b32b87d5a5a314ad80ffff5f3765d7afc8639c8083b1760fd03ba4c63635435869d17835a9e73bc487f15d5db0597f44fdc81db1ac6fa7112dede6b0b76cd7fa0aef57a4bb376c166f079c85353e73a0f587ed73f177c4d742b3c92a39d5c2ab560169b833fd85d8efc669d22cdaf26b7a0b52022f26f38a3bf85cecbe9035c105d6a82b95af482e1b78e787756b01474297523c8c1d2472a31e4f689e0f204595e5b2afedf1f61697b4153fbeb2e895d7034a17561920a5d7b44d5022d8cbe0f9cf4a9f7fe8b5e260e2f6a7a943d579b091b0003e33378f09289090cbf0eab97bc1a155b096902e74b54edac8aa44ae011d39d807b926aa01b05cbaf53ba5d1ba2de9cb9eaf3b9015a450ec731648eb2388b4af90bad418133b614be5be93ea4a3a277ca3e29664617e8c401b87343bddee4a461b556a0943e3f3b8cbc8163a588eb1127a8cc6f0f7258e62350bea60eb47a633e0ab1eee4fa4b80577616c680ae541a857c6cf7bf3d3a8da0dded720cc9caa0f012083326d9ddc3f3440e558f4d661598ead78dbafdb11154044d9dafe5acd4adad48b8993e5341f151da6dd30eddc4265017ca95389a00e225a8c51450c2f7ed4982354958c13fa691e7df482df9d02d3ebfc8f362c14a59b9906654d33b27f1af7aca78f9ea0a7f62a42138ed5be680d4474c691f3abbce65f9220881972abc06cb9d070f9e765ae6d88934be410b7422d856892c6dd4bfe69f319e66a6ed3253f9ac890709f2b7c3f8704fa06d34c907cbe3bd167ea380e47438c5e22c57805667b6889d704c673c169b71ce2ceac98bfc6d11fec6e9db053eb874eb48dad5cd3d42a96adf78dc37a8690ec2b036290796874434d917d8c5ca0f318b37a3866e3732ab9b147d80711063f73b914cc82867760cffe1cd89ac08c068d9835df5c183fb2f096a5aacf7da9553f8857d5b0a32f5ec406568ed43e2033b35b781b1af32293b0123d291f71bae1d95f48680420f3dda93e4d1b06d1311dff6f2258f1c6a3b1c6204ab9839f6514682660f077f1e0a8ee54fc0b3e02da5cbe38a502afc538d9b05f57af5827f2e04f998a34085a293b70cfba68ebaa00ddca5a8602e642c07d746f41a4e670db2e658bd310a8832393f477399f5b4d7bc3c18b75d9f394db9ef3074243a0d1d09c1d4130281f71081039331830969eb7cb9597d7c4a2c931b633b123bd5919eca146bf2c7f5e74d663b12d810c6e2289271a905d5a102ed0b01e6f4ebe17bde25815fcb334dc7efcb0f4fac9184b8aed72e1dbc7da4255d7ecbc1604f485773486680873a92045561298bf3a09057be03d2439bff4cc7152e8211fb08eaab42e71d3476da700ec39a4db392fe759cd3face76a336022e8b68ad84fe8ea8f48d6ef491eb417d7c671e5cd56f3ba80b2c1012ad83149b10f211bc2ff52d083aaf5d7cc87dfb6e2a10e20e3e44a4468fbab24ee5cc0f5a575028cb1ae14a8ba6d244d22c06fbfa3d3f83f81e398d409ed0fc35e61b67bfc053ea4cef253a05aa7d6b8dc3024e36bf44eefd8aa1fd7d93266ac89ef4e6f4d88e203dce84f718049e5a378e507c3da98e7e9fc2c26f3f8c76babf492dd894b267ace8d691f260a196f29d1735703559a793de220ed3e76871384d77e4d0c35387c7a370422228407165ef2daea61f6fe196e0a0cc7b9435dba66702b4012b2619006c1c365a9191088fe058579a97e643ad9af2f7c590373a3c09d48ec1815d03e5fc9f5e5c6fde005e61218fda54f0fee7e1b74fe0a0d6dcbe02b7bc5495353dc47bd60c73eada99b366da1b08cc40a7ec0bb27d0f7a7a65ce4d3ae9bc6ca572fbceaffe8692b5ef0064a5d238b083295302b7ef58b785d1a70f52534cee5b6384b6cfacc6128f5d72438475cc0edab398c17f0d644a4f6a0e198664c4bd8a0ac3edc332f471e673a28afbc66047991ad3dae0dc94640eb63795de5cd666cdefe2aca4ef83725d7b1695fcae9d594e578d74ee38e9b158dc477eaec4c3b95113175f67c3f86f34206b47a06ba86e193cf8871d6c8e958733bc527dddb046e04c84d6bf3480620d6718a764dce4c7f2e7719f026e8f72ec31c0f5851341b038f63f24f28a1ccbfac8b7c3648806b81b99894710e97c7ede7bdc373daf7cca32528df36166fecea9dbca7dc7fa7a458e20e92302ea95d531a84dd2054452da3e197ef416eb8a1ca8bf5f41459db26199b0e9daba5637873f3159997946aaa29601936eb5bc21c529c5ac4f8fadcc2287508ce620572848327245daf0051db602d38264de81509c080c72d4732027237f0440a027cf8b1d81b2a4978d5acb3ea5969241fb955d612c5c62b3a18c1ae9cd600dbb6a1dc8349bfd32d1751984a5235de5c8ce480029bf246b5f99c4b7a94fa99969eee4dcc1c18ff8bdfce7145d911151054ea0fff47f9a1a34783ba65d0feffe1d90c37ddde2d029699bfb865b27fb008b9e8d1e97c638e058512ebc48434a141a65d982c488b49f499114e527c6d0ce3f4899adb0961a47e07245b109288ec87ffd041668c522db2dbac9b7a7c1e8fb9cfdb1e10acbeea316ebb81eb7c01a8ac3849bb804b8b7882d6e25294be57c92fecd973e26db98bef1342ef9c4502105de2e0a7973e7687fd6756e568929476c6ba894959728508e01af81da4aa715804dfadec98abd7a2b617eda2c1c023a3190a3af53ecc60311136537cc28111406070d7b7d317f9be49a04093b2584ee36080f2186a79592ad134b56ed64d9ff3f67d09075de978e0d4b2e07196e914e8918184e36346d555d1c1493e45e1e675421c9b3580a967e633c661c5fcd51ce442e11016544ea5b08d66ac7a87a7716442c3a12a57be75096ad13dc0240c3ae77b8ee83cd2e116ed544b5bbc980c151fff155feb69e915b2d97547e912a67c36f32b425a829e346fa5d10308de2da1a5d4782fd798b14a4d50e6f9945bd4f318c338237215ad6d59a34de8ed2816722e1181ea651025512d997933965065d8eb531bc3ac32827f8a7d08b76f123ab992dd9297a8ada8731cde51e05638b112c52cac74ae875461fb7f558fdd4679152fdf3b8ea97b1c2cb108637e28ebaf2297197e01c5893960c24074a8bca2c634a4c7381c29d63ab2ee06bf00f47866939adbb71b73c7e80cd1c44f3b609ebc0fb08de74d3c44bc5255c453723de5f50df2622dec586a017c87b29c84b74234121fc1c9568fc69d8e72ae25cede93bf6bcc37614d700e1196f89ccfd29e59a80768431566e77e3edb9ce658078486e4d7c2226f9f67659ded6be395160e6bbc50bfc80272dbc61922d3f5b0abbc27a1a1a99e42a88eeab486498d4a14ad1d2f290f3a02708bd9a7bb1cd7351e7f3ffe7f5b1cae73919cc95519f048855ae6475ae86775b4e9fff8d0acc16c6c883dfc3288720d571da9e1ff7bada554a4abb9425a85a7cadbe1fb88d2121112f5ddf2508986763ec159cce9292a45ddad8d66489420b5bf812452c42578d39073965f8427bef8dbcdb63f0b765023c8a226d0a39f75097dd0cd81853bd68fca745b07096c8a48e387f7cab17bde7e501f3ff74e0f28a2010ed8cea136764414b47edeb2d45c96fe48c2c16d31bc6833015255de8ce8c4b837df99ff71b9bb1140aa282c485e6a8a149d9231b3bde36a25ed7c71b645790c75c666c48ed5a060f785b22c857c896e87acddfd4044c83a2070bc51139ff1567375b75fdeb7e612ca9f0ae547ed3cd392295bf5f7067f84e2d2185c23e477db2c9887b81eec06bb0e21c7ddb13de283901dab942283d376ede0a40128c2488688a2e8fa7770db707322dcf93c9bf12ab7ec400c91559d671fab184c9c1cd375603ac5391978fb3c1385371feb3ba20113ed67f67a46d45b34257d9c4b6bd089c75d38c76eb58934c8097f770205cb5ce440cc70a5c3f29718cb93cc727c49753c9376a7de53ea00205d8427c76fb6538d6ae0d56415330682035d0a4b05f4d64b6a21f04603bcc0f7ea021b5173997f36c51c04de0961d0f3f3960011eb3a08720e08de135293dd50b2373aabe21a667b1ebc695638689e0c8580458d03af1f94dd1851d8fe551981545e4d6af12bac172602fd228eb4c5129a619ce49dca6edd33e1b168185d8ebd72574fcb6cdd883e983cde24628777f00bd3d2227722a2ec922321eb6515dc721173e94aa8674a3058cb223ab0cca4e09c04101edf051617ad7636d7042b9ed660cc9e5620e2ac06422f4172aaa2780cd1a22e95cae0b2287acf014b26257773610d5cd6ee88c03c36cdcb216e2495d4431b87e746835c0c3a51bd9992e60df75dc2409aefb1627838c1dae14d7b9cc69bc250356c7dfc8a7481514f44fd70420c93c16ff1bdbc633e93059fe5960dc9501dd8085a10d62f5c7ad916970c85c114e8483b2f5deae94569434055eedc4ac1056105885b63966c6a5b390fda0ec12de1fcaa678ea42da1fb46bf1f86f076d872403cddf05b3acc5cf4f2369eaf6945fd786cd344b39b85a0fd3cffcd432ed0842871c0818864eda2090cb51224a1b2d592f6d22a5942902101a1014115dbecf23f8f94156494611cb6f559252eecebd45e0d814159ec240fa3d2a0c145e9677a9400ab03c52cadd61951f38811dbe4f8151fb9ab6979957e06bfd311e520a88c50555f2bff2abc821a5dc9d4fbf701628dbcd72c12cd703cdfbb61634c7522c6d2d68865158277fa7b236ef2adfb00c1f24a5dc1dafd45ec6045c20a630104378298428467d0f9002840ea3137e4002388420883fe0000b0a72f8610b8e79eadaf7cec420c052d8fb53c4d8581220f58aba3718c8f62a30900b4910afe9fa25e26cd7626cbf30be18972ef60d7c03df1059d8aebfef6bb1bd1d3700c871cd3246846dd7bf02a8c366b16756ec2744388e817b441d1b9b8e050444789ee779a4f73111de208efb0911dafb52d42195fce2c6e1de1dfa7accfbeb6400628863e1fb833b6cd606ff0911de4d3864e539db7b724b22be4f7f1f0f5b139b47801f79fdb0ef789f95603384d9be01fcc0ce4363efba8e878399bd92cafd1b1883384f11411d76b842cc714dd006c3ae5fb24736758bcabd0f45f49ced9921067220fcd72b6d7499c3bc81292082e0bb6e627fdb338e4d8e0b3ef81f13fb7b1e442fef2744e4f7c46c73627a4644bcf3bfc4fb61884b7f65153815fdfdc6e63024f210fef031906d9b34265983092864a00248108210505062c847a218db1633b1905705c1050fd13037067221246f5915c40aae89002c4f94c028c8822fde81aadc410a679c7780dae1898e00065a41a4edfbfb4e5131afbe555151aaa228501515c475bfc244972b4c6c31c32c435798a0d2570afefab36718421ead5d5c09f345b3e08a1251579290fa760baf8da30220de1d6c771462f821206a2804b169fb3eec9936effbbed7d8b47d9a8b16c1c6afb14cfbe77df6b0f6a890d009dd31d69f7e776dbc01d1ddfdf39799f31dba53fc4774e18560e3cf59631ca26ee1b1e73d2e5df7c073e8b9dcfa5e1f88f788cb83edefe60eb60fb9366757263a06720f1de3d071cee50dec6998e7d765feacb3d6da8ae8f7de19fe7ddf3b1e0aad88b80c0243f0a502c7f0ab8757aa780ca4cb7f8561e6f14c83631fd818639ed7ebe5f1783c3ca667f19b7511fc0a11a64c91ba42842a578850e50a11a4ae1061ca95213ced0088b145d406b260258cd0c116a12b3680faaebcc08aae5a820fbaa0987941940cc618638c31c618637c31c6f8c310c38210f31936639f83c8f78fe1f8ec8e220ad359abf0c7bb73f3d539fb9d71048991379ade1ff190dc195f69c3a691cd0ad3fbeb5e961cc56ec1c2f41ec96735b53b832647090703bde9fdacb082e9f9b060617a3d2b56981e8f0a15a6b76363637ab214294c4f67e7ec16f68b8d73c2f468b68bcdc26eb16fb60780ed951bb67fafb059ec155bc5b6d929b60afbb551ec9a7d62d3ecbd6ff8504173e5cd9c10931c70a00c843d9f8defff8138638c73ce19f4a231b0ef1010aeb3df0431f8383ff9218e5d6f7c164e027ba00dff070676bf5cb2bc49e01818109717ccfd8263e01d02ff76093d937c5dda18d11f7e5836095f9736f8352ef7bb79bf7b048e81df122ed0dd8263e0830ffe05e3b398994c687ee54dc28746d83d02ec22c175c067c16e1260570919d82582eb7c26d8e45f1f3cc8fd82fa85813d010798200631884110061f5abd4c0b66536425feaa743274b7dc255c27982028be4c4c79bd74b936465a2bf27d883c12fe4a6333c346f22f08822319ee8656303d583633868139b079b5b80ef82f1c037f8f30771d6fc3ae125c077c17ec3362db421304c724c27cff7bc7c1ff5d117cf16a1eccfb057c91d4e17de6fd72677c3c90df07035f57206ae74ffcd67f605c077c1ff23ef09560e7bfe2df80df82611208d701df9bda311c037f2c1fc740508479c6b151b2cdcfc648f8abb289fe70e720fd60093ef89d60bb99e47108fe08069c7912fdc636ba978f63ed94fd3dd5abcad4e10780e9a205bb3f2689c6291bbff7f29dddddc515b85a853fec825885a08f9f7fdf029e3ecf33f6bee0974d0ffcde7be58d77ab9ee0d7c525132f75546495b7ab32576f0bc7f1593c985f0eb229227efe5c3a19f25ef083bfa8310f4418c88b7cb96c223e6be806ce7795ef8a044dd637114b1b23f9c517bf67b5461af28ba58d111bfdadb731d26a953639f0900f25b95330430f3f407e25d8f8c911b64d5000131c4d5000138481b7087f55719def43d825c275bef7a6f6a59ac2b1efbfd7426cad3f2144bf33b0014c9b367da6e3b178738363f85779a541d80661363c4e27824361097c3735a8b3cee1aa46014cdba7a506a6691bafd65336ebc8ca8969bb535830d6bd62b2ca55151ccb5266aec1f62ba69bb67de4de2aae835ff4e21971f1dbeebd17e37bef0d4dcfe07dcfcb6008de5b0ac5786c2f81fde6bd42f014c1403c7e04cfceeff1c08dd042a5854a8b152d555aaab458d14275bd04559660be70ec3e0e237a2b7019214496992f4b18b10020668c9052e567bb97ee5e7a2edd5720821fbe78850855ccd5b7bc95537977e4bbcadb83fdd7693fde7f771bb677f9c4d5fafc37f0ddc15e6a7d0cd0768ab9301d139b369762bed566eeb1fad625757818c694db6c3d08bb01fc1709c31dda1907bfc7806d8bf9b00968db2d989b31fbc377926855c26cf67bbf5f84d9ecf721142f8eb06beebb7b729d763b09f7127487ae510d03b1ee93d6deef72b9de5d305b68b67ec35a6dc66c1cc3341807ff7dd5b85caf31d08977c5fc7e3106f6c23b26e649cdf3f043352511aea769954bae9f79fc2760200db6eb69ca232fa6006bb05def66eb4397eb31c9c355ea12890cec88ab3c8263d87683d97adcfa1b3906e61b03edc74ff3dafa2377b8b9cb569baed2a607f9ae77954ab4d92a49efc27afc4830109311d65e9155ea700c3b98f057e50e1cc37f81ed05d1183b617d630e6e84019040e28b110648c2080324618401be186100248cd845a132dd74b30352667eef41f1c398f5e5f73c567ebd027db62671b94efee165dbcaf49dbf34356973d6cd2af0aabc77bf42430b992b168bc55a85c94ab0eec551ae939397155e61a7956d65dab0138e829db212a6c65e301218a808f692739d9c6c341df8c1d4fa6d2bec9483f2158ca37fb4e52aa75ca5a740e5c404c237c4b6652f1b4cd65a6b9afffefbeb74a3e82a23561f8e1fc9239b3fdbcbbbfcc475741866f247f82b56b85ab13e8b5eb512a9907f0387d7e97e343e1b5febcf295841d59d21f4f9063b6b2d8aac5f89ac7ce2c48a956d569f7ff5e3f834309bd587abecb4cabb557ee2b31d3ceff22e47202f2023c0d42fae409ad58b2b145308b36a310165ee989e82296431458ca3ab78f0632cf46560bba9af989a09270c24be2d1c378f2886bf12af531340700753836fd3534802892e5b422df9cb555f06f6cddf6bd2b3dd2c7ddf0796b61b13fcef592412532c358e89a22864d288f1fc2b0cff837d0fd83757699fe9cf3987fffdec2b382614eefd7afde75d7ea2a58a0557aab4d65aebdd6eb7dbed76bb27552b2fac1af3d494c6f8d35e14ec3dc15a2bb1b9e0d7115537380953ffd781adf5dbf201c0323fc1b1bcabca61b8f7ebf56f6588adab3618538731f5ced4d9733275145323c0d42d5bce197bd19177390847c138fa810883d85a6327ec948d30f56b272676f292c3bd4b2f36ec54e55ee5438c3ffbc78d39e298762f485c477f3d88e1f77df885a28c4ce8ad42910af91f5965eaaa7c85f53ab3c0d4af53b0020f12d246b8aeba338a6ce941961be81884e14bc1b45d33d4a1e779a28ccc2a14c35f7df82c187b4dd6b76036e187b04f875d2e129f85afdf060fca55f90806fa720f6cdea54b13b61cc1e641806173d455fa8aeb688dc57134123dd841971ae817985aff3a7e129d29f3b696d6d7d4ae999ff9ef5d2fea713f2689f676b9bcf0c56f06bbc277853379e6c519582882e10c388661b892c9b19b829479637a0aa6f0c454c20c47519ca9a22124be4d05cdf8211ef7cdccf8b36b3e164984e2459a11c58b24110a9ffd7dcdeb2a0cd47addfa9a3ff162cd78bf1edfb76a5a5a4cbdfa9a56ab3543eaf8fec48b2760abff562fa2183f984d57ad5eebc61451b4cab185b9ea617f9fdf67eeaef395b69ab1d526c8e3923fbe11b634f3edcd2e1919c7426169ab995f69b3c1fc8ccc8f85c4fc4adbaa655b2d816fc3639be06f53fc60abd27663fbde7391396e641c1b5ba489ffc8d49d41fa0e7efdfa2e2ecda347f82049fe085965926bb3b14ecc76f444f1fbc1f27e785ac79822d8e3c6fc8ac430f16b2e2f2dfb8a89836c60ea0fb516557471bc6f6ed970303d160ed7c92af34042f41bcf23815e19a7e66de1e86a893532bac6a9883579f4bc9f4dd67cdf8e8111adc0d72b83248a135f433303ced08ce28913e48f1bd3f5312e8ca390f87a6ee1c7a347bef73760a031f4c4b7852afca6d23a22e6068ca74edc273974b55cd98cb9a40e5836f7c7d48829c61b9828651c8f8669bb5d74e09af276d9c06df2a0eb4c7c06bea75453e3024116f935306db6f04a4c2114e6d6c06ec05378cac353414219c7fb7027f1f25a24d1f8228a712c42686cc1aa5ede969d850907b64da80b3e0203ed4f2254022f819f04b5de367aae71a9a2e68a2ab41944e6710a99c7332f5e1a1461cc6f14342e32c889af094b1b9e296d7aa478999739f129700c4c853f7102e6fa181542156a60d8f4fcca41b6d7ebf5caa1c2d73c868935b01435359fe204cdb350c8bc4806019fa65472cd13a5ade657cf2283ccd4fc4e51daf4085f8557a19cf9d04d5106f6fa19d80e1cf35c2f03b3390a5e3484bc8b9090508af1c4bf481daccf359fc465d6d4fcccaf70109aaf296f641424d10952c789a5fded35659ec673e5607a32adbf810906daef618cc3e07cdd069b7b146938586a18ae321d004ec6cfd3a922fa8ded7b32bd9cc3c7e1e3f0314e22c45fc2e46f4313679cbf5c31666fb28792fb057fc9597f39f10db171117ca664e32f77067e2f17617a1f30bdff32b0b353129db9fafd3d4223844c303d2c053f617a3aeb279d6f6e81200c2781bf4c6dfdf97a6ff3a8c8678d23c9f2584fb2c656cbab9c8c2515f131ec93dab6fce54b06e3335b568219247cfc0503ad4aff9c040602e333b24758ea32fc923d0feb706db7193e18c2aeefe0c7e00a04c38fc52a6d34cc5b057edfd3975b532f406cbb0967c4ee8efb0cc3b2c7c0d80a8fe2fbde86cdef015be7989a8bd49d128563fabf2a3bdf9dd6de68de78cc731c08f3981ffeffbc284f01ba8a971c2e648b19fe078e3cce13c4e3f198f99630400fec24d7c49fe4c2c83019ec9cf34a8699796c2b338fbe1de86aa2cf73300838c317486792072e350669b03f24893448fa70c2a3857931ccf6bdf7d01fbe47f2f83efc4c26b9ded23575f9e9e07ada791b0dbc25fc1d93d9b6a9f3369accf336bfe2792de0acbd0f0c572c71245bae1d23334373a206c54b8514362a56b058e167ffb8315b806113c3a8b05e966122171cf39e07e638e61947dc72bf20a184e97962129eb845dc12fe0a0c8c2c028f3ab0172f1ee7652fde9044b2d267bf90bd78f1628b9107b6a3434eedbccee317717676f00dac73ce1900dfe273ce39cf3ee79cf30a2fe373ce390b7dce39e7a0cf397fc140ab08f439e79c1f5fc1406b8cff9c737e1c8581560ce373ce39ff7cce39e7f584cfe79c73ce39df2230d0da33f3798df99c73ce39e74cba56f073ce39e7bcca783ee79c4f729b704112651766640f43ac150cfc3bd48409964b549af05369d2af3f5208fe8fb481413ffe22f9ef7fa410fd4e0ac99efe38f0da97071e9e38dde721cc41371051047cd6dff0c4e987bc2237e0803f3f0ef7f5e350dec0c30f79e50d38ac4aa71fba387c1f966089c377df2b0be06aa2097f1cbe9b13c31c84df872ecc093be9274eba2422890d33ff7d1e884862c35cca5e656619c023b6fea7211279a52e3ddfc04ef20d80e818fb2c4715fdf103d1ec4ceca193cba90b9497a82fa60b8c89b7d306026fa72fc2c4554c3cc5c44198a2193a85e1deafd776d25a5c5c4cecea627ea66b8bebe0f1098e8d4e261ebf05a9b1852903b80ebeab36c75d0b533987a16d3be507c30f43d7123b13bbc65d946ca3f5ebfc1a74c1b685067032f16fa71d05033d19c0670e2a116609108c965d8e2098bc25875db697d7978c4b4cb3631141f41b1b38657a385399dedb34e8647a4f53de7defb39596e7c1f4b760224cb3cc29d3f61b871f3e266d60703df9465c4f92df44bfabf46c84fc56d9243f398e5b2ed5bd1faebe67c19c9817e6c28bf9dd0f9c0ab1f661cacc7fdf61b705a9fdfade6b73626e14dc32c5df6771bf8529ad82c5dffb4eaa609122c5bb0ad72c3e850a16650b5238e6fe29602cfc59b080ede081217e4f1927b350914287555270aad757481da3161ccb596bcff3beeffb40100441700cc3300cc3301c572fc3fa19f169c63f417e4deb51841ff32b92c85b62bbc2ffb00cb3ec0fab702c3f952cca52c5f85496e3d3961bf9ea2cb68d0266bbbb1a98ed5281a181d9b014f622630bab3c8be9b691aa0523311829133f0b96a1fc0ac131186c1b0f4f0eda19277f18525d9c6b0ba76c481fbcd73851acf712478ac8e5059cca41fbf358b2603852ac27c777b908638ede58b2c6b164fd0863bd383e091331abc489c2b1711caf64b00a064e81545eb8b0c6d27659ac678136f13d0f6c9bcb96b7805cc02e2e9fb999c9f2526df2f31693658a36d68fb0f05738534cd62d6f3143117f2010fdc6a64713678d3fbb0eb73861ad7798892d26f6226c1be864be18e62756144b8a35455595858a8a8a8a8a8a2a67d9ed76bbdd6e97b3e42c394bce92b3e42cf9896a97b35cb0cb173061583b9613eb494a4a4a4a4a4a6a47454545454545b5dbed76bb5d17aa1dfe5653545559b67491929292929292a2d260a8a8a8a8a8a870941455f66ca0531886d9bb97d33fc5a078565126141414141414940623252525252525a5c168301a8c06a3c168305fa43418adabb26ce9e2050a0a0a0a0a0a4acaf322252525252505e57991f2f210183aeda717d447c5a43c2f505050505050509e17cf8be7c5f3e2790903053ae5203c849f274c0ccc7f7979d95d422828282828a82a28137cca41df1630dcfbf5fa8fc59c4cfc6da9dab66f0be804b3853b0b607a99ed2bc7fd60e00a6653647cf187f8d0931d5adfef3096b94bee626252c7bd59631deac8d9db7a9565607eaf6daee944c7eac17762e623becf5c702cebf8ccd58ba1b76c4ecc950d0ff057e0f7ab326f719dbc2a2fd5febcb004f17b38682720d65d6cdaa9050de430a68db5dd5b8653525660b142854d0a155e286a4ed0ccc8c46c578b1c45d60ae4800f38b83897495ce6e3bf91fd460f4ec18c4ccc76b5c85164ad42f0f374c66395104ac01c0a455c810197bb82295856f0f40563514196acbd20be23eebdf76299c28225082c4f422ce3751f8186baf8e2123895608733ce60c02f5967dd658b952a2b549fe791804b5815c675583ac0b20224b054559d200b96134095c004491481c50440602981159004fbba461081058c4001780450aed8047682088ee0696dc503dee7795f3e8dc4e78146b8ee3233b8f8de1814e08cb167251481084cfc5a041c701241152d020b88200a8cbaee2278124114f3d2502da104aa2fe60bc732c6545d585ab2ce99ca4a4835e5698f2a8aeac9fbbc0f0bd52e044bbc4200e686c0cb7d5dddd202866018022b370455425001138f18c8766386004a0c57611802a7151317068230e6abf49608441b6c5ed3b389cd7bb38931ce39e7cff44cadb5d6a0f9999ee7799e67139a60970f47795fcc8ffc48f2235d44a1ebf88be1c5597b1fe861cbe6c4bc0b10fd2603297921a6df695f87fd16d6c749f23dbab785e68ffab6d09ce5deb6cdd97b0eb2f135caf71cd4e26fde73908b6721767b1fb80fc07b0edaf10ec3d21379bccb41b0bf2bacb0b931f4e67b0e7ae171bce7a01c4f94e2efab8646c75f5b6802790792be6d9b4a6f0bcd18de6348fa1ad2877786f71ce4fd9d91f918177959efdfdfc84135fcb5e19114bd00ce1de1de2fbffe1e2a296de1662a6dfbd596b6d7b3a5ed636b92d2c6b34527e425e3e05773a56d87b8d216de4adbc6f869a9b485f8a36ce54e4bdb562abd98782795b68d848364f8f0bcec6d3be70556022b61cb6703e3201ce0b1988b168f5f4f5e9cae17ef469ee2b109e42c1907ff53cce9a9f6541814468547de925990b5c01e77c938f8ff290765301927cc93998750189521bf43978374a4f8132a6014590959098fe1fc250a8551a1e1957250f6b25f2608ed80996f3ded291446a58637ca417ab7c3634eaf9f622138a2302a474f07700238d08d9283c6c78fb148453f0a6399d84b0e82f138c6e3a097f178c6e3cf4e3988c6e3cf4f39c885c79fa172908dc7371e7f96ca41438f5fc89183743c8fc73d1eff781ce4f1e72f3948c8e3218f3f87c941451e1b79fcda2907c990838ed0f0d886a23f1feb1c74f4f8ef530ea23dae954f83ed8c73ff0816661cefe25b90d44003cc33ce0ce51198671c19ee1d02f38c03432904f63f609e717c9401286d178c799f07cc33ce8e52c7d40d1b301768cc8079c699953232547e32efc78039e55daeca51592a4f652af3ba8079c661a16c510200e619a72c6d388c7977e6c54e36a50d43bd4adbcd62de4701bb5bcc7bbb98572666bb5aa48e324b078093999cf1c530944ead266d2b93246a6166282728d337e064ae5e0361ccd58731ef17333fd8c5cc9f050b07a8c8d17da68424f217af13fd97bdc7356f2bbe1325e0ff58f9f72bf2c70d43d8f7abdde3c6f47fd6852501cd3009688e3886b37be98de06bebfcf7bdff6036d80ff066f20798bffc2156a2c26c5fa6ed3eeb5b6dfeb8ee3f583a3f6be5ad7030ef93241158da9c5cd7ff5d7d63ea910c723fe7cfcf9a2256a00a1621bc7c5e3c987b200d4c9cf1de9b01c130cc0fc266667e86a67ce118c63a4b95bddf2393e870139c3941e3fa191a1ad789db8b283fced973d1783a8ba73ded7961963ce29838e3cdc06cbb078f991998e7b453e82c37a07762ca3713ce9463942b01d7c151533096ca782a6a8c02829e97ebe47931f189cf5499ea4416101ca1785dbc233c9d255bc954319fa1dc9d4c3365dbb00474962c32618c04686666646a5e06ac997997cb498d8cccd3c06ca39329a3f58b7a063c11862746100884d1e4998fcc34d8369d257c9d0503adf4961006c25e2c70e65daf61b6d6d43b73c625f3ae8f898979510616d23c08c2748034e07be1cc98613772cc86692d7a8b6ec1a8b2d098361c95a5cac6f85d87af1be542f9bccce49a1fc420ba085165de1a988e25082298a2cb7bbf71587e6fdb9c98ae9c1d869f70cc1d6758a8f5bb6bf7ebaf61a17ff8216cbbca1f71cc078e09c131fc414401c78f3cf1da05810d7e7e8f099b61d96293ca522e6f305bf3f622f2def3b29741a950873a0c5f87a114fe1ce6d0953f04491ed80c5f0c75f82149248a5e8e610dc7309873f61b580fc26cb7d7ca9342a2a9ecdb85cc81cdec264d493ee198f7fe1e49e495437082dfa54418bc04c679423e11b9c8f7bc728b89f7e398a7bc3548e3792e57f672f95df9b2e018feaa700cbf27050414264591949241096c1b1e42150ca487e033c75c70171c3b22c45bf08e71d73bc11a86a14cef5d1e0912b16d5e6bda68fe36e6a01818fe254f942b11cd13e9176956f7615e11535218d836f7a4f4ccef99d29392293de3809ed476954f2fd3c936aea4c021b6276562f0c3c74f839f74ce218e8137b0077b7defe40f2138e6af619e09cbe558c4751cdc828393968762886b83b9448c49222af92fb9dffb9817c7713f09b369931c3110e3ef7bc11ff575793072f4c84d9225a8f5db6e2ff287eb5dcf247cb5c6fdfb5de46bafb4dd5ce4af481de27b6e92ef580a7eda2411e9c19c24f21036fe2b07eda8a1717dcc5f984d93ae12036186ef61f2c1b785a50ddbf093e9d198ac91c52a632e8bc564e6c3bf306cc3faf1f7ef40a14b9224ffbe63afdce35e913abcbfe5d20d329a24f94231a258c1c098d2763f8f7c92445182a5b71a6570150b764d97cbe572b1f458de7ca29cc151ee4ed882ed1761a1ebc5bfa54b7ce52099c73b72904c699425e65d5f50fe7b4bf263feefc7b87eb48d1ffe7ea31cc424e3e0c7f7c398ffd67fa48e985f728d66cc3371bdcb55da6e2f2ce5ce88616d2c658624da24e97279aebf2ecff40f63de871333e6593d58bf79b07e3feb77692375ec7feff7fe12fc1b58fcf1c25a25797b996289a5dc9d104bc14fa678c795df706ce1709d5cefc40844c7403997fa5eeca4e76958ceda49639c71900b45671c039a4bea0f712e6db797eb103fe1271cc571f97a7940b63594311c2f943024c3301cdf1bdddc501ccaddc1e18718c8f5f9afd39db17f1cc10f9fbc5048b2bc50c8ff5e24612309db258d0bf6cac0f6beb5ba9f86dd28509c3e2b50c0286006f68d0246319dbcffdf943024efea45976d245999dc7149160ba683f55affd5af9fc5c4ccac5207ebbfd7240f96588236f81cc76e667ef065faf8e4fa5c3f3ab9c627d71865bbf6785b64ebba5a2d3c8e504628239411ca53eb6a21448d4e6394a8f157361c8535e844463d3d85aed045926469bb4e63293e789dc671bf5cd83bc1938ccce8343ec994b63b4619a18c50647e7492199f64c628d769cb5ca73dea8f89296d32ef317a1ca18c50462823942709448d4e6394d1697c1aa38c51c631ea3a8de4d38fb611c46fc3514f64690bc96f91332339e211ca086584324289ca9f0f55519eca70a43255049595aa2b595c4b4deda93db52d3035550495150cf45d199d462853a2a4a2a6485d9677a5402a342f15371f1ba15c60d3bc54dc7ccc02fbd2bc54dc7c6c84323e4d4d15b1696e4628a3d39e8a62daf0d41e6fd408452c6d2c96d3d4b86fd43842a91283b0f2bcfd6494cd125f1cf7167f356ef2572b5204494c8220f9ad56498a187cdbede53828bcaebc47970bb730f9f947b1f4152c2c6da6d7839622cc1fd3b168d9e9908cf285e1dbc82731cc61d87a96fe90fcd5ae1c4bac35763dd631afc152e6c19f8139c60975f834a309fefe1958387e0ccc31ce769561092b5bd024cbdbcbd4e28fba5c124bd65fdb6abfb41317fea2886494f05933a5ed924f97947267d89c98a494bbd3fa966be6c92877c6fd99966be67f2c5b6c8ea58d7c325babdf213853ee8f8929c7dfadb7bda95fa6b77a991b73f70dc119990f65744ceb7769db26298594424a21a5dca87dbd2b53261945eb27a3681288d5aaf4d246924f2b9206c7fc57b6d5af6cb7dfe2aff08f9f62bfedf6d2a48ea54f915b41b62db3cb41172ae3802f43962ff0c7d1d68226f9e35f1097b63df31897369a1334efa3ccb770698b296f2f93f5bbb4699c16598e250813cb16345961b994c15234bd324f91faf322facd85ba51e62df1fd8149a24db329c01a596005b6ed65e6fc60d45e5abd67da6e96f1b3e0ab85c5252f509ccabe98915353b5fda61b7b2e697ad1aab9176afb3726249645693426f6cd9f11150902e46568edc4a9b9cfa14aede7a8eda34b679b635271e7e39870299313f7a852cbb2e8edd9f4d954a97d241e2fcba969fa2cd3a3477fbba54bdea82d6272e28c3e772ab58fae2aee55202f6bbaddceb45dcf55fda61bdaa2371d4ea57dedd123a3241667f42baad4a24a4b4e5a5acba5acaa436b395409fa39f365b934295dd5cfa9a1b9a494fd9c3f1fa7ae488ffb1f388e7cee7ca2df2b6c5871b70a23a8004285900a9d6d838318be6da6ec1514f0bdc2879689863241f7a760b39059516545918a50252bcaa2eb8621d93f805f72f723dfbfda2b24c1dd69be5788b25788e1ee35df2c64c0820723df2c5880a110d200ec03b00bc41c0111f346fc2c6a575587ded036c64886bb7bcc511577f75a0e656d7cd8a8b0a1493125451477f71437eeee57dc5dbe5528c2dd5d85272aec702aad650a329bf128a98113a381a31da1a93ed2f6c6f4c3dd41df2f11bcaab43994c8abaad5e1d0b6355f40bc9e5e4efb7503ed44d75c0ce8ca744bcf1cb51c4aa486ae687b4b73a04927cba23fd0dbd1998ba1a9d5e188565589963bd121ad9acb9d38d8166559b32977fe50d5223f6b59b486a33129aae55036264611285ec0aeb21448e6e323e3d139aae9a0e9daeefcf808d15019473519327c806834b44707a7d264474c4a6d9ad4b4b66c9a84ae0970400e6c0d4d32a3861e7dd3ede86c9970b8f4d973c9b7e9a3b45ccae6d21429ada9b8cfa1e851abe668339a5a1d0e7d744597fced4cd7f691d25fa2a9b7a36799d45409baea1e497d9ddab62913f45125a7d292afa94a2d8a73f71df75bc34dddfd886f14479c45dbb3651fbd1da52cabeabee996531f556a71ebf9a812f5e87c54a955d9afa1abda9e2bdaf2406b2a90a117d0742df2b5dcf92b2d97ce664738a61507bbca8e684c7476703426b3198ec6a4a8456fb753773b9992a038b4e5d1b26852fa82bbc770d955c61625e5d27507654a82d68a68a8921d36a7a634776f21f9a651c2dd57ee1f76f71f1e3304897bd50956e0ee27dc71be5be4c0bd556f44da1cbaae4c385655a965323d74d7ee4e3384090fbbca52dd598463cf25b9f454a29deba9db01020a3a6120f1ec08a13e270a038d510bf24112fae181a1d3aab573e9a6ea60b8bbcd9e09e3ee32cef6ac7dcba4cba534b4a6e228e2ee44dc7d48134d34d184bbfbc580bb23f12d23d5d2d0755569e87a3edb2a25a5e8924771699b635a1f29fd1adad2501d13f4d9f41f552af2338c8a56b5c8e895da74c9d7d01f625719dba6b8f486435bb6c9dd61b8abaac4beaab64aeca9f433945d5125e8fab5f4762ac9f1605799127b2aedec049d3d403c3d32767a7c4e9ea01f1a8cdacf0f0c211e3448076dcfb5658f98d81db665529768a8126da74d9376d4a4f5a4eddc4e9a7adb5959a61d25f6549acdda55d5e998d8221477ae485b66c5f75e590d6ddb148753694bc89668e7d1d7d0db4d5d1f3dfadc49fbf6546a69279b3bd7f673a84e7d1588bbebb83b0bdbc98dbbcb5a944ddbf476e656b46582fe2da7aea9921c519b43d92313ada934f40524555d85b83b0a221d6eddc104ade578dcd05cee54c2c1b2e89a94e3a1c3ad3bd001a4445026940906255a7bead8f485a6f3860ea99de80e5a921f49702f24a548391587bb0b69d51b1136fdd1aaea90235860e6881ad8a0001182c002291cd0a8e1c4e724fc002be60331f0e14930009c63020854ec0004aa16ae1d7c3800f644fa2c20024514a1b38417035e30a801065ec0610645a0b8c083cfdd8300f151944b4a6f67113a80946d99d4a6d387bbf7c8a52d8bd65e89d69e3854ad3d4e0c45692b93cab6e0dbe503971667e11eba08652e2877afe10a4146cfd7f87565a2bdb0818593c38ac59a7c13770f80bbf370f71dac1c77d7e1ee39dc9dc8ddb5bb0d1601fe739e00cfaeb255898643713b4e83177695b12b5abba54c473b2d0ec9fdc761eeeed39a72ffff4799d616656f27d2e7b87031bb21a607171c5a4dfcdbf36be8122dcd9dba96e9c7aaae2bd112755dd5a19f1919fd8c956364f4b31609bdfdb38c705aa5a474fd6f91d05bcce86735f4969e482bcab2a7bb67dfad1646dfad155aa4bbabe09b54c2dd0517d8f48d3e2997e650a5258ff32ed0f8980b343e9726a147ec2a3bdbb356e42e8383d9193988035d3be85ecc05dd75bd9adbbaa18f0ef20c846601e230f474bed7b15f18b48debe00ccfb1df7b33de712f78f1bdf91b00bef882b866c8bddf051d5f5296f1f7c5587f35c6fae9ea7b31eb3601df957b57e38cde6bc3f7e230066c832ffe34be46c0f77ef8c27051dc9b71688497c1d6adb9f744986fd4fdf0bd38175dac592b1878bc35c2ebdd64228c754f167201dd29d101d8b5630b5c9d63dac337bbb780fb83ebd8f7de7efdea8b2f126e885fdc8b3d8cf3bd3f77e78677c418e30fc77581b1c69727cb441542162e29930237e07a5885ab6fbe8e85e0675ded38fdfc8d2e02b2c38cb8eedd990a70bedfd5e0256f86c2389ce52b942fc6faf1b88a5def5e9047db88e1b998f585f8de7bc17b6717631de4efaeb0ce4a6e8997649dbb12f10dc18b6f601678455e913dfb75dd0fe34bea9d355601637cbfab91eeeae68a1ebede6d05dd7befb5c101f8c415be47e108e20bc30defcdf8eabbe3aec032b00a2c62107b375f7cb188417db39765dc7c637775c77bef8ccb02b33278437df1bdb37bbf1a4c7335be9e7833667173c658637d65607c5360d65ddd50e37befecaec02c305f1dea7b6fd05fd792dc8277f35d5dfdbaabd54cacc186c50580be187f1844ef3ec123eeb8175f7cefd571d075eeee35dc7d88bbc7dc63be4921319ce0828941e65fc4075fb61499c00f922072fa8007061f787121b01c78101fc8000d02b312012013508300396d60023001164cc871aae091017bed08f9a03544d049de004d807581ce3b85185e9a1022461413aee3450a2c72bc48e11ca30ba82d44f1bc68e17392c0c2cb8f2ca250c878d48c0d6ee4f9e0af0be09edd6b39b43d9fddab95166757197a3b3adb5cbaea76d09a4a4b734cdf13560b17ec704032af40508515e8e57c622c920390328c7dac50488f342338c3d86632936197023c60f7b530b8d239e40a210dec5846c69ace69e58061d87831e8fbd148c1ce051f2fc414006b96f68173839def70bd992e07ac53649d1aec5a10b2c309d7d00e59470e06d8a9b09261a479c02e078a5cc8b29cb033fa6183ab4c7a4bfa00517208754cee592187275060f5c2064fc2300d6861d1bb1103cad03dd01aa67498f162ac1c2c168cb07e01cad0410413d0a1830c12b0f3c40a942b3b9109090205207d5c37043b1580726081323e56d8ca413c74e415ac1c600e3256100977d810e560ad768c446a34aa765be700b1401933e4c712894a015c60c70a77b038ea61e7e5eddd0f868fe5cdf85e983644a6958b70c7c7025568e170b1d04056286854187911c6800c6121075628037fc89f201e42c0518329bc59065a8ddac5df0057204bef783db4d08debd9649857c3b30a695906d42e64d5ac827278da5d114618d337fae6cbc0ee454bbfe0b5e0b158dd6815ae9ebc42879d6ce766a4aca3b3478052003fa8392d4d1bd0c096aaa90d64600a14274d98b04b4828cd480048683862240622427c0460c74ce827c6420b00bc5601161b355a94295400a35ea085ca056020b2315b716214bf2b5646408414952915984054046288b980c0038e684802128a5405242045aa3183054af9f014b4c241170c48cd6400a1a0115921a8c22604204082d6820009008f1c44424839800164bcc428c10634900127321809027ad168196c6182911a2e00adc04f024208918020406acc70315e29e0286028e0301acc23017fc13ef0bcdc1ce01b601bac6a3072c132c056f052b6dd9b7085a7825401a3c0272e4dcc8c278363eed62d2c7a2cbc0a43ac6fbef773770772f714a42bdb6413ec340276dac7f722c664e37288b1c0cef34690851ce4a027d0a3518c5386f8a0ecb48f550d4bc5ab00bbd50c9a86cc426cbf31cc110a7dac2cf4c205bb906a47832487555046c0934c2261ecc1ce6b62e78d296cb01b5b1d0fec56af160667783b1e104e2744151aa0838eb273c1f6679d989df015d3840e5e0ba1104823bb328db0cd3ada870dd8c7faaaecb2f8a5d039624fbe7ad439ac1c5e0be00c5f8a8ff5d9469a916685423c01ce90a7a0c397224fe9e065d9b5b069dc17b558a167a3eb8bd137eb641c5a087902c4a00ce0f63e3026cfbc13adfb89d9d363ce1967308779c552a133180328e312c28a013ff06650c3d03bfa862a642f3b311663885dab4a0e319fb6095fd041f74087b2e8bd09268680832e32d8c2822c4c49449a60c28727a2211b2e04a9b9242061c7c57685600d340401d2040c5050b5420278a01a70e3013db8410c567082106c80ca8e8c85a21d0630b50960d7262801cc1135e082e5034e701000121a8e0401a223c70a2c50d444c10a0936a0011c9a14ad50a1e65670b57ac083243872d704134f7002921a50d4c4dc60052a40c1094200020e2440ca018a0430830c4180f088010c54f0821240edd0410e62008315603981092e30a5871d0aa0043037a8c1094c60a5034f76688d07510c09260848f48005584830822230e00302d09a0c3c887062c818c080051180800f4fd09a0002c02307d18c598bd41e042462008316a88004232882031850809427360480870b336641307a706462b43711042478d00216a8000b0946c0010c28c007290878f2830f14d980c4c68e6c0929f8e8e16aed60858aa7283d1c9181870208e8a1890911ce72f716be570cf0551399093d054f0a380ae1103a03180398caf5c13d99e7ca441d9c935bc85fb3c25d81558029b20af8e5a1b835ab191999bcb58b6c6d9266544154c18a5985e107e6eff3bc7c9d5d6538a6dc7ab6ac7677a77177d4dd6d7c6b197799ccddb1ef7c841b3d92fa38cfa26dd351ec1fada56c2e7d36fd36fd194debb99e4ab43fbf5573cfa6df361d7dbef30bdc3df49db1b83b0bbeb30448289be4c1dd5bbe49262cfc807c80bb8bbe33106e834c26abe195daa41c7a7b24f5515a7a637f55916a39f4d1a4dcb9ba7be93b8feebe7de325dc65c8109211240348460c193064fcc8f091d1238347860c2121a1202120a1184230847e847c847a8478846404090505050105c5088211f413e413d413c41324034808280808082806100ca01f201fa01e201e201931846204c5008a1123068c183f317c62f4c4e089210386108c2018403062c08001e307860f8c1e183c3064fc08fd04fd00fdc4f881f1f3f3e3f3d3f3c3f323c347c827c807c827860f0c9f1f1f1f9f1e1f1e1f193d423d413d403d317a60f4fcf4f8f4f4f4f0f4c8e011e209e201e289c10383e787c787a7878787e7d9b4653afa675354a9fd195bcb31a9478fa47ecba4bafb0b78bbfbfbbe60bc4d6f3af68ddad3082482c2f775c1dd4ff8be54ee4cd05a2efddba944c5a1abbb93ee5e7ac5edc2e1ee35beaf0b7797f17d6f70e1d934f639f4f6341e3dfada8d4955621f87862a6157594dc5edb438247455693be7d90303e9c747088d2103a9270846ad1643460c201aad26240305eaa90109a132601cc5f88171eed05a9669dd6157598b4372acc3dd5fbe5dcadd71b8fbaaae2bfab9f36b686e656ad1f5736ada9e6d0ec5a1371d2efd363dd7f6937269db9eb85545fad3dd87dcdd74f71bdadd6db8fb8cfb5dddbd876faf6257190d5552b4e45c77682bbbb3d3b49eeb517a7377cf1df3b8bb0adfbe3d1a50895eb5db999ebd1a7811592f73e7a03bc2b098571a8ff789288ae287f83d1206d813fde25f5893f02f0e47ed6407e3c1c613a73b949f071b433a3f0b7687c62638e0ffca1d0b368ebf62bd47c2e043e18f7f614d567fc3b2091145567fbf096bc3461bf06d984bf9a934e1f72a538fdff884f54e3fb4fa0ff664fc3b96bbfca4090ef957e52effea57e513a71fba99a421ff086b82437e56b9cb8f61c845f2af604e7768f521cce90e85cf823de1c1c6d0ea9dee10eb4598f89924b28141fff834e417ff833d0989f810ebef37593dac09eb032b9afe40d11c2d1314880e559c032ae000950e41e8e0830ebb5a2e5dfa59cbaeb21ddacae6d4942d6a73a0ca210227707713b87b580277b7e2ee2490d19ead8e695d551c3f1b1264c81022a89ffd037638ec6ade324175ce95e914e20777181487e55224237695ede8f8127700eb248a93d4673397e27e63575913ba54743b69ea8fac47d6a3733b5de45a555d4fdd97c085ef264244d06409fe40132877290768c2018f390082c07058b93b9011b8bb08dc9dcadd43e0ee2070f70fb87b11a107683915884e91bbd3a474800353ad508c0d6880882a2c8021650829ed097e3280017777296f8bf0a122458a058680616fa7bc141cb5c214af80536002ee51462b0b09b80be11e01f7201c022d94fb0997e252b0e307b43d38c0dd1daa010c686fd00bc040b4b62c05ffd00e71c7ae00293e3c25a005220501517a68891c8a1fc0c9003cb436dc5fc0d18ee0c0d18e08d1e168475a2644e7ca649e2b93c9a2b4dc793b8754a41c0f21baf49603c710b5c644a448ab1ee14e1d9102ec50807b94baa02a01083f14c1dd2f97231f2c4810906407ee7e7b30c20a38ab47630877c73e886c04a107173d3cc1ddf389046c414203a0acccc0ddbd072c20cce53263e286bb5f249ae0c30d4b34000841ee9e2160043a40c905b61eb8b368ebee9795f2cb42b9bb27e9e0eed7c6eb7067cba2b8b42dcac1915475d5b5ea8dfd5a0ebb676b7f3b51f6cf214ce6a3375ddade9870393e25ac37ee4996f033c9177767aa15b56a922dee49a66a402021a937b46712236793ecf0a23687aea8522e4d92e39e4b9192d0e89638dbb376b6284e97848e8bbbebac2839871c9fe086bb63dd936e08f791f5f4c87874724bd4f548893d95685b37ba2ba1d54880aeba35654a82ae4a367e5f6cf5897b0f313f6ef0245c110aae84e7d025da7974bf9d2b5243d51cbbca5a26682e55a29d389d1d165592b6292e5d758ec11b6ee98944d4842ed56eea0c6dcf9beec4ede84edc6cb6aaed6cb67132dc0cee2bad88bbb349b954087b3b734929919bbbd7549c9c267429f6edf96aae095d2a6a99a0391cdf4b55627a7059aa412e5a0a80bbaf275afba6da89aeb7f36929121213cb5443d7cfa5bf44bd21e562f8599aa4fa6057d9517a9bcd6c50ee2ee4db26039696ead422ee40b0c1675052c21d65cf56bd1171f79d137737c2a64ad2da9fe98943d796095a74ae4ce7b9329de7ca74169dedf9023e020f0167c14186b2ea8df64c5a94a9cd9deb9994d6722aed75aa7a9361c59225e5d25545428f9eada1ebb7678e15eb5c4f9c122d871efdaa2221fdedbc411335b7a4e9bcada81295455719f00c0c70d51be4ee82db12008ffbd571612eb87b98206cdc1677bfe106be4503fe015f3a821233c48abb07a120c0cc009a982c51c244d3b2ebba12b97bcc521076cda9b4a21575afda3527470790b233dc3d4696eed478aca80e3de2f132b63d93d03529e9fc16556ad3554d579d8e5252aaf4e7cf4073eab7276e5573bfaa482f8bf1132306d09af46aee97a86bd2b3288e89654f23a3375a0a6274e21e5ddb9396b2a8baa47db496cb49caa53895861e3d928aa239213f701c393f97a6e792676fdf9433559696e2ce5c534d5ddb9c4a4bf2c2e98013050ed4c344eb61d37428611f41e048c709c6dd7538403d4c9f7353d5a39629c8a6bdc0dd6da8cdb8bb5a8385935303e773624cedd912d1e16847723c7c9c34ce16ce3f5f37a073c7c460c2e808232ddb4808a3284f5aa31ac631403246464645607c4995a1389508d351cafef96afbe712213f86ecf89cf91b49123a1cedc8b66185bbb73994486d3d97e862b0c187bbd7ce211b4ef7da3964c3925b7ae6b001081b9c1c09245cb420a19a42322508244f4e489820696f486a4890b84e5d6bdf746b73e82d655ff6b9f407a0fe4c07101e40869832d4a0c22f794fdcedb91a0f77bf345cf1981e5c68a0f2a45caafb3687b23484ee4e030d2f7717000d42ee6e54438889060d35f239351e68d27a167177a7c1c1dc5e98a1cb0c5966b072672862862933ccf0c4cff5d4d538d753573bd55bd3a94b82b247681c117224470c922a476c1c11009723631725841c21c3114290900108215f64a8095982bb7b8dc7b99e4270b423493955486e899a5bcac59094538de048caa5429272692d871281a18626e55421aa901a9a944b8518e9d1e6502249b954881121233123610c6162e8328316c410439518a678d3aab6672d77e2be760eb1ab6c673663736acae6d096095aa4c8dd717efbd90f1c47748408c1db71cd2612812b85a6a3940977c7d531044307dc5d068baa2b3a805aedd431e996dcdde6eea8120e59ed1cfa2135f7216b2e4d4ad72038da91da393444875a0e25826448111f3786080dc9d1d1e1684c76589409654a52a4539172a98e8a944b8b9272a96e87659372a9ae8865ba31e198684db91357a4535bf6763b8b746a9b9453752e853bc36f4e0b3dee77c49db947958ad472275a5ba2de6e3454c71a19a934a3dbeda4a5442f6b69a7dafecb4ea51a8ad6525aca94b432ad3a9496435714095d5f5dd101e8e4d8b4c803d11224c50ec280203404c1819017426c5c790262c58504804c71d101206200e4890b22f0c8807a643c3aadaaae392c9efc886257d90e8f921ddacab234d48891518fd0b7285aa2a9b7154542625abfb69ecfa6b8afa128fbcf9ecfb6b4f3db1e21365d5122efc38b930f1e7737a241438ddcce7445dbf3c71077bf3e5e3e428fe9c1a54714dcdd7b24f1b3a29c36ada12bad28971629b145e851d389fb9c22b5f633261aba7ececf7e96944b6b3755e9737ed663851e343d707af0888941e567ed8d8945571d1c8dc9aa16e1684c703426b3198ec6240051313164d083003d467719fb3396857fd95943734cabee5b16adddd4d8eb507409f73f5e862ea94a72e9e74e1aaa3b3adbb3e642c7cb72698a94b639b4967eae5d3a71afaeeae7d296493d3a7f899a5b624f74c8cb68a88e6d6a5754a7aeba2fdb13b7aa398462b06c493b6f3a7465d3184244887c0d6dcf5c52caa2b51d5adcdd87ef1dbbbdc36747e8eea910a1184488ecf8e2ee4a3c56ee9e74f4028f1eee8ea4c49e3b7844b93bea83470bdcbdc6b23abc6cf1981e5cce51c7152b553ca6071708e80022ca0d1ed3838b8e9b8e1a121f1ed3838b0e1a3a60e8b8f1981e5c74b874e81c4be448c2637a70c9d12587167777d90b3cd6f3c6443b73694e92da7ecba47bf6763b713e971679198b2ab1a7d2f9e36538677bd6d49675c1ea4e5cec6546a8d1371dd550964569eaaafba45c8a1eb1e78e97ad68ed44959ebd9d9fa3de1e3dfa479392d2b55573df3241736c9b4b8d8c58261bcb74d2d0a337323a95be655124b56553255a8b22d13e97e2d834772ad150dc27e5d225dab9b649e78a2a416fafb6e98da6d32a25a5b76797a8b7db99944b6969cba62c2dd5992f6bd9f4f646356a14a1c11a31416bb913a7e9e86b689b435974d5a16bec69a94e6dfffc1c8a2e69d1a34fcaa53addf9a3654f24f58d50dc99a3a13ad6085dd59688cf0f93d1b3e93faa6b6a8d5a35f748e9e3d4628fb2b733c7cb8c8c505d53fb28ba2ab5cfe6d293095df248e9a34c6b9197a1eca9a47b1b5ddcfd08654f25213760b01105f4a64bd7223768ee4ef3f989412d52bb0102773f5291723cd0dab926e962604f1f7b680a19d84332c8f03dc4629b2f309bcc22db14ddfdc4f99cd9ac488c060d3582c3051c4bee6e5443893d77cc664568d45695860e6973a8121abe71fce0ee4545682005c111037725f6dc81c308ee2e801774dcdd86176e7077242f502087fa606f37f38525b87b0d3514c7c4e6541c4b34f5364444e3ee34cc7c130db9fb0c35cef67c61362bf239b359111a2a52cedd7d4b958d11d8a86223081b4f6cdc60e38684251b45dc860f1b34b60d166cd05ca951448d279bd770ea82438df6860400be6b00f1d488d578d560d5d04bb800e64b1717b6dc2c544a5ca6a23ca607172db819bc5c9b08e582d3dde93ca6079722178af8a0e1313db8b890e3c28dbb0b341ed3830b8d246262536e8c27b8bbdf6ee9d18a0a2992e998906a6f7e910c06101311221da690222126d18e57db9e183c30643d32dd892a3deb02fda6db110e6559f30895a1694595e4a04a5236f74645b3198d4d71b3999a16e958a3676fb793167b231c22b120463f2bca9db4a636656244c4e86bb993c8b7f0b2db8d09e9cf67cff644d71695e165b51c5a04070e1c46df943b3f2997aab56f9954b4a6d270a0e95a84464e4d5b5d9027f23938fe7fe805a11e1f59104e4f2cc8abece7f01062be51cde859948de1674649eaadc8e876d2be87167b7455df08a7e751a51665ba9d468062e018e1f4c48218c57e090f94c8d768427bd0a0a146d8267429fd172f14f423d341736a0f2323b6095d327a24d58887510f1e453ddf02909fb1689bae32bcceb31f48c10bf9170fe34748c6f333191e65cfa1d779197a436b3a6f646424c448487bde9868b79376ae4c34daf92abae4d15a8ee9d92674e988897d24f557f408c7947bb4962a5157ddabedb7aa3a647d54867ff1e2c58b977d0e5592263daad4a24b7f3e8b43dbf4763bff764b7bf4bccecb94da2436fda347575469c91be11cc582b4290e5d3a7ffc4e0676763d307a50f030e1ee41be7956b079966c9ed80e106274720f0d3f14d153a4a74bcf097a763d473e323e2d77f71e25dc7d856f9f261f1a7c62f8a4f081800f035ef8fe397f8afcccd83f9ebbe7f8f6c1818fd48f103f36f886d10386a7c3f78f096e7cc7d0e2ee45be63e076bac470c1c081910218521ba806a0a10db4b36380016202c4fa40029f2d3e100111000947400c701ff20d1401a02000f56047c88e508b17ee2ef3229b9aa1931d699143f692798b21533a5036e81c69d1ea845a76b4e8c1dd3d274bce548b1fdcdd739c74bbc504727284b4a0e2ee5e039297a948391e3620519172e9e7d480e4654c46684da5cd8c5e5643db135d694bd0dc9b2faba1ba135d6d40520392cf996f031225f6542acaa90109aad39d4aaf7e2ec8e348b14005492c514387e0ecc06be8ed96f670f7157ce384715f82027981c26b687bd67431a03515c78b9c1730f80bdb0b0110897ac271dae1e89410d0e2202982b3e3060e0fcebf70368e9f4068a88e08ca9ee84acbf1508bb0351405424375448c0c6969e7da3221528be440712a8ef6c67422a12fe454206d8e49c581840e515794869c0ac4dbc16be2ee33f8b6d9407127cb32bdda7e0d5d9954203fc38911b9906d1734ee46dc67ba13559a19197d4e4dd91555f24f7b56c91b19bd4e2ec8cb705eb44a4929eec52bd152a525b167d7a414f7b9f4d94f005512a21ef083a2cdc295cd4201360b37b88e8e2ebd2115a14a8a5816cde1d45aee5c8b8a6eb7148945934e5d91ee44958a5a94658b5a2615ada9b4a21665694568bab6452c9a943b95682dcaa249e7aab62c9314095d7545b75bba54a4d4a64b8a96d61387ae32a41a9a4b712bdaa2b5478f58172c8ba248371a5a7bb55d71bcac2977e25e558bfcbe81b16f90f68d07dc5de6fb864b0b9c8382063728bca8f07ca34002cd46c1849bf1e591af97bbbb92d7c9ddd2736d5926a5f667dcce74cda97f84635a697f3e8b2ab14cba476b6aae486d7369512d87d258b496a1e855df5ca72f77ada48b340cae632c20080f75dc5d00be4bed3effe27527ada87653df05171e27a63b6932a41bcaba1ba94183861a31fa7f5991971935791bbe894c4680cf6922931180a88969e86bf819dbd2502424f47308f02f0c31fa4752736aabb6b7932909d1cf1e45919ad01ad38d964bd954a9c8cb72332394e9762a79239f9f1a0fd3e873e7ff8ae6d02424f5cd9f1935ad674a4b91d01c7ad474ded035d673c4e857f573d4f6ff6b39947db57d231c1c992c26e473da1cba9e42623e478c1e3dfaa6dbeda4a5baa6f66fb7548697b54cd036a7d25ef89951cba235a3d749cad572e79273ad29b5e992dbd1a93b698f1e7dcb32fdf89991d1ebbc6c555b1aaae48d8cd8f4f62dbba6486c8a7e9b43714da7ee5134c7cb54a4b455737f7e6d3d97ac2ad2d772e749a39d9f4b4ad11555a2b28ffeeda4a98fe254f68b7c8d1ab7db8963362b4203473b4283893a2443523fa94aa8f42cf3e6891a650ad1c000040000800083140020381c108945a3e1781c07a29c7314800a82aa5070481b09a32c8c4114050d424801101801000180c16840002d0914b03846483b7912c43f49f5fbbb568d35d8f65fc5533b31d4d304094a55cd854e2d01bdc0b6dc0f55f72da1bb862ece4057ae1b5000c5b65474863d509cf5b62e2b1d85082313dbd6d220904878b13d04fd893e1e0ce7ffd23285a82aba075d4fcb92634662e8be6e7368163ff1709b2d6c0f028a1e8afce1c178a33e60de51130a692a6eced8d76b14db9bf785412debaa799e502bd51295c2ebe4877a91137f9fac67edd73bf8e8205c4e72cb26871e2cc2f3240482f3c7e1c8bb0a54bcf43ff6f333ff990b63e1377982d796ff48e3bec1bdc48766766912b8010ec6559f8cb0e30d535ea8b2cdacb22af471a41a44e369e6f021b0b92a82cd9ef4f1368171b8e78b795d453bffadfe7a2159271b8655ca9cd80274a2f1878f96d2772663398ef162f4401c7fd25e9fd0f2f61c115c4769b367365bc734347da4356542f3977c69a89b98e3dfc68ff69e8a3eda83c77ed0e329c8c45b35179c9e4931fc9aaec1160a4137febd361acaed537e14257ebbbcd5694de6e4b75a1679b856476d303a6b7fb787ccc4104ef4aa458845c120672e6e7b2242ff26b679274572e4d16c981db0c8d58db11fffde125288c6e8327accf23fd2c3b6590cdfa67177006c8d91313c59ca08d313453457c3133196fe2b3818c4bcc7bcfcce09162d9390bc38b0f4f24f604cc6d8eadc5947062113007b09993b0ce6d9c9381efd6ab3e147e6e522da44899f9db2ff6741663ea0cad012b2e162ec4ef06deec2ceb46b7b22ff00328038ed6723ec4b12cdcf75db451c04499a1426ee463f383707b75503ca1aea2bdfb36c656ff1b0dfda4b7e4b8c5ff5ad6073915106098da8e5efb2b4a2701f5017cbe35dd2511dda35b2254792c7c7d9d364150a1c4a1ede9571b04ea7d3dc49a4480c94a7c78678d458f4f29d29793aa190c2533eeae7965567df76431334f90fef21e801b71783cb80212824bf59de2d090bff6874cec7aff5d250e263a1739573c7b927ed4c5e3a8aae6670bd034837fdc90d33c54ffa47a0a24fe0711fca900c86827e3011838587e976ab74f8d4658027a9395734a007a8980e4d95b87d9fec1b71e1e15f0c446b756278e1e15d1e2af1aa62ffe0896dd921608acfcb6c51d8679bf720de75b0fa5f0ba92a10e57638e0bc8687af692aaa3e23aa5b6f78f8f79f52d3a56a5649d271b1b341f4a4207f14009b2e73b6b295aefff1cd6f09176c0431036716241e18aafd02e2c9b2612bf643d4e0bd9e46454233266a049bd7be82ac29f87bc15af7e721ad30e36c8ee23e670fd9dfabd2009d836fd46b6ca26fb86f7e984cf17abbccfedbc01a36cafb77e5b7cb4f89f07d9961a6f177042f86abc7076a3650ddde8ca76e755bb0c21801fd7c5d831eb1c1b5695a601f051b2ee684adb3984dd456869bf9ecec636605e4c3014c2a88d5bbb336fd6a1fb5ce4e25f7b249cdbc8590e2a686efabafbf18114cde13a0d4f576cf3e1b4c36b1c67664fefe1c044a4c674705c78418427c321eb834f80fb4d18cd0da6e4a14e6a169937d677390ba51f2e49bc9ca1d68f48c0d6306018e5148fcb3dab357e9c7bc162e567ece15883cfaf7c174cf419a72e32e91fc730b0106ca2876ba19919ab9b62f4e0a584a330bdf2a2d9c97864cb3bc39f6a38265c83d1bce708fb6f5f48c303e99f6ebbf3173135ba8ce8ae5df23ffa21b577cc8323e5428e7cf28573f72776b03815b4a45d13997ca714825947d49c2d47222e1081a9991dfc14f35e6f6fbbc050704b90ec3834d21e16c89ac424867b4661dccc6a63216c02a462de1aac7244968658bbf9e1a86bcef1ec9b9c288f48899b829c806d77b85bfa653fb5f19cfd0f2fb4d5f169dde81fd9c152d37b03c00ba434e4bbbffb59379032767a0122c21028140de89e310c8b0ddc9d1cbdf278fff60e815cd26f0d47ba6a47a79f35c7576fe62380386e44f113ef4849ccc6033dcdfb264b41d5f8a9073af15bb4c87da81a4b0ed190542b2c774900149351267c09c83d9460796d673a59629b3bcbeb931647b98ffdce8f44849f12434e3726eb19950eec61efc7320b16978720c35ebb9739870d346b636480596da985072f1bd064ae395395880db2b789d982d493eb0426d9349f399971799193abcb47f90cdaeb135d90d3afcdc934c6c9af59c816b17a89975a43450b326cd1462d894e098456a0e1651ca9f22b66a1c772faccf15b79cc90dfdd28c8ad21b87c602de412b41c350e4a2ff73108771078624cbbd68a3989a0ce6502dd0024ddbf33135051ae7d58bd62f1d15baeaaf88e903ac77f07530b24090d8073b6129190b42c0fb39dab3842bed06ffd76c58e623ae20d9303ec10cda63af6803647192c9a3cb3b0230f8555c9db4789a11cc4a9a6ee8e9e565e15ffe349d35f9b90bf11ab91124c0abf0a647dcddcb0f5c7c27cc0abbcff42c88303d147ce1e0c616ea0ddd11eab28146d9b9e88e8782d4e2242cf6c5286c8698b1659c1d9aaaa78d6877ed354c7b37cfed50d2371bad854928cebd9e774a1405be9917378fc43d0880f91aa94052f984b277d50a016508c89ffd869bb217cd913c18a360eb5861f54673cecafe1e22eaee72f73eda4b1cf8146e9bbe7ef608ddefa9edb8e98ab357645a6dd305e427d0fe795176da337cdee1ae00796360a5c7b061f51740cebb15c52204e56e295d55d5c2c022e96569ec3d3ee1da3fda91bc72605b54886afc66866474986807578117185dc7094a2b50eb0c3ad993fe3da7cf8d298b82c46a1e364af0775c3d34a18dbf6e69f535fcc5d4396463caeed9e575ed1d0ecc7b21cf263d0a959c079b89dfec75812c96fd757a26f04f93ec1eee19a7dc4d96c17b1ac3063a3d908ebd513686e77e6d925f57846e5849ebf3df07aae318843779a18119fd9a8847d5b04eaaf935d2c03ecc4484e4d13da1324765bfe9bcf592bed312eaac92a92fbddb0d40ff966864e6f5de8d7620b1f6acc05a8fb83485383a6eb84897e99412567fcb5fec258f022cfd1ae1b0dee7feb722c923ba2fa2f040fbd49262e6cfd79551702d4af41d83f70d33b645ab6901c6b89fc992d9699a26a0464248e9ac62719b07576e16f31b8af49be27394daf6708649aac52aaf82c8fdc97d6db79d81ee347a5529ef69cb1cac3955cbb74d71292fbabc763bb1f232fa52cb344b5d33e2e24dcbf0d5d9c7274615f779c3b9e8e98dc4315af6ced804f45f731f35aeed63cae769c59077f9c955969963ffb54eba6536050a59369cdda72d084b7887febfe79fb5e25ece785ef5d96514bd69c0955f2c7be9060dee1d8460a4f1bd55c8ea0d871f995d54709646ee4c5afd680cf460e4af731e845b997b07c1bfdda0f59fed167acbb865ff206d1b6c1f435833785a79c7f45fd3ccca47560beee1fa27ac501be5f359a64780ba54c7df11b93e3500db8a9fe0b1097d00f338b77ebc7eac84e4e32a13890d8d42cf1c7cf70e3d99b53446bedd24f3f732edc754c3d4ae551d653e2b9b92f0062ca908f95b77810322fd7aa731978232e0506e6d32390fdb2f1ade9d1d2c5c3bb45897420f98cf5824417c58d6f914f67e773baf4a369ea1fbdb6b28c81a84d1c41523b28d1b9a63f1698dbf45465281be044361e6fb7717387c1342c0bfe71c37b722bb337b141109795c5c6551d618691c9969b3624bb3e65d8d0de69155b924f7a184728eb0a00bf31096ef36214d3050d5ad3a859cb8c6306c8eaff0b56066efc513e7f25830fc01c2e3f0ec67ff4a8a4ffff3df47e6d7bb3e5d3f82acb2670ebcbdf8bb7f4dc02f4e03043ec66296ef767ed68e3dfed24b96d05673e6333c371e78d9bfd08053e185a2ed7ecba8f1895ade7b3f32b70f50845a92ae521bc34635a7d0cd2a48b917fa2b2c1748998d3a4ecf3997f725377da5c85eb41b4f0600f6f39750415b5bf9ad403ebc56e6ea760054a595f96c25d63b2cdbc456fa6f8ce4eec48efc17355c9f27232aeab22b47b08664582afa462b1bd75e34ad7388a9d9296a0a169e1792092035f228842351fe37bd7828780a6e568a383332202e6d5adecac4aca1efc042c24a372e6250500ec55aba793018a3e45d7a3eb27a24a4e5e8ecdd6d3f203f4c49dbdffe5c377d7bf5e43761a427ce3a4f145e52a14a34d473bb008a4eb44036541d1a688d9967753888c48db9ed66448560b2ba2ccc58b441d63fc92216dc3da2b33fc729ed30372348278867887e9577be7887843594c3e72ad0581d0d6112d30b7e6b759cc21e1a5d526acfa03bbf5e053f4df5d50e4177c3d5dabc30dbe04aa13919737b3380bc1fa8dfd55bfa22ab64f7ab6d8b02509be4e24308afee4788f8dde63492f9dd78e2cff5fb4b38dc0984824dc8eb6e41e727d71cbc6e9ea547efeaf3e9abb1b5e767df0c8ce41be6804ff3f7a20223821fdc163b7254b63eb7a63cb78d7e571a1ae751cd86b40f5e91afc30dd6d88ae2af1d188b2d9e5e5beb56d04aed6e2c48f933be1e8fabb19e9943fb198f8d9d34e85a423650609e9dc156405699b00bc5c35654f3754423c63a20579742d5192254db083792a20400010f749ea6e94b03b1836ea623a64bdb8b7a06f6665d024da3a983c36811790f4d9b3146fde86af0354c8deef32c2762f11beec210fcc09180988e123573270e441f677874c81bd922c034b6d5c61672bef2cbfacb0313218f176d5d1fde7ee7ef7d954bec981e9dc86e6ad61dc08f7c2f2b5f4385df49e83c08245a496c0c0c925be4ed1a9161db324a06e525a91d182a13e887b134226396caf40ffa3e7b5e3f57715c82f476fa89781db337c097da40374f8fd62ce161949c8c4157108e42e7c681ba66c07e8ac425a9adfea1300ffaaf4eb69f580b89e51a3436c63c366bb012be601bc5e781cbb1f0f5ba0df9b936279d5d79f4806dde2db1496ccd44e648dfc4b2b77f11083bc4d842ce357f320bfbe5a6c52e60679f2746818150cf84319fe4be873612afff33b2eeff457a1b0190dba1532ce05a65456dafaf72437f8f108365d5655a3b83c36e258ce62b0fab2743e4b13c63cda13a6cad6363d913a695fbb6c884fbfbc111b371700cfeddafc38ff6e51beeb655a92c41cfca91e47eaa1631fa0801ec5ff89af8818d626bca41b4549ecbf96c580e129822828a42ceeed1ed4e7130383694a3645b6d5b6a36c0b95de638ddc6a8f1b3b8c75b60773e743228530f21dd791bf15d3ccfda12fb402ac5bd84bf616f69c018279fb53ce4232ca7e4d3f56c9940cb3b771063cc28bf66e75aa4e8d566e961e981ff44f2c1ff6d3beb87d04dcad35710ed87dc06817ce21c1f64dc08dc27a8279436739e2112465adb8377f0d0c7a544ecea98cf14846a9888453192d0f65f7a513caf1caa1663a0d6c66121dc07fdf33db2339d86748617470f8745a741d3308d1d6c10b3cc60a25378abf2a4a124c3e97fbf005e9cb0f7c8c75b7fd68c1b36275d23ba8e1f237aee9316d1bb2f4afd959085c59235f736ac63e337647766afc3abb79d6a1e548509ae7bd3b3c758af6363fa3fb9487be94e2795a273c143b29a5afcbd33cdebf61578157e26f3996b2600c4ed4d2491ecd6e3cbf7727f64095b363ae6a48ce5429839adac78c90e2cc2705dabd433344e5a0600f7d4003ddd44fd7e3a6573273f054342a404a4926d2a1fa040f655faef2ea597f7294d232a320711915724ed8b2329d04c6d42a9da9a2601c7053dc7c067a970e288e6aa8f073011c876c6a3306efe8aa168f1ce4019c8e1e88f04967a4d95f0eb9f863c7d7ccb63416a3cf1f4b7e58430e72240e1f9c7f58d7e41e501806336644310ee546e8642316e2e8ff28e990bb219b99f71bf7045c944316591358b8bbe5e665670d3049c9eb13fc7c41010ae3e40781f5ee88857a9827bdf230e7938c83cc4afa47630bcbb6caf8088dac398c05ac110f49b06ba288dc576fe0f0187bd376eb4fba6da57c576ba35dfd94d1065e90e12b2e39fe1e71e2a9e0062389687eb4716e45113f1c6af53a43d84370114e92feae3c7232bb3bf8d18b44296d17fc95501d0a56ccca8a51644b93ee1f8236a9c43f3a1123a1e18a4b705cf7cbfcab3fb0d5a59bc8d135996a59cf9485332cdb8b124cbaebf237c0307df3356032ab7387cc817d874e5ff4bdf3c52e73c7b8131d3f731aa6afbefa53163d6ff70145bdb6c0344fcf97a4f2af6d443ea50d6d3849ec73075d2270b324cd574d705dc8591399cb76ec659c1ced5054e1366e3c923bd51ff51281efe2e3398ac7323f8f2c4f951033f3b7c2699fb1f0a3ef073207d1b36bf24e1c72779cbf0aa01d1b782769bb94d7bc4b6eb89f31ec4be93b50bad79d8b78f596301ce1beac7fc29d8bf04ec0004fe81dedc95e53a576ca8e3bd3d62f64d7610f41bdf9a3aab9bb012486fd0c2d10f1e8c48b9901a116372c75171f0c78ecaa0e41f677be54efc5d641a3a4eeb22fc00e7952ad3140e98dbc482bf80d6697afc5ffe6d7132d0c7a7954fdf6a1d64dba437e4ce4a524cff29e9f80f1aa18c01ff8275ab77d595211a836bb516e53000df4f44ca53a766cb886f34733e4cf05a4d7630d00bc950f341ec9f96a5000378e780f533c0ba0a394b7c99bccbaea1fe00a04b55d207137a21fdff94a469f7ee89a56b42d52106c3dc5de4adfc7f1f0ad9afbb56f959e78fd6be74d66095861f546616e647092a8b736b055d53d3aaf6c583b35375c7c19fe712e2201091bfcbf0b0576f22ec145a0e2961e3a95a7ef866892c965abd3eac85e8eec25050a1c0ff7d979a074e4482aebf161e2cdbb20b26b15649911720232da1fd5b184fdfff5982c54690a0dcfdfa1df6be46dd590d4bae71e79e6f622cf5f967e0e64acf957048bd4790dee3769eec46b9d8638af171c4e612c82419659818daaa1e4a9fd19ab4583b08a85ce91b9477640098d6f759674e017dfdbd7a9592196af8cdf278eac2e061e53899dfe73db9a069b8337f523c69922cde01ec7de2955f0b65bb0036e2fd81ef93f795de4fa2de2f143742c276d4d987af73a8d1ad1c9ee3bdaf32f23470dbdba8f3ee937accc6ffcb659fe1623c57ec3d07c6bf2c2bbffd9a28751217c1d82f1464bc3d579d0d958606848422c9257b71616d7d2b6c4a86d1b82df9e7ecf15ebd5b9a7c9ce04e8b74dfd9da43d07a34388506c89cc567efcfe43da1465f4a3b448d352de3c89bded698af5eb4f0fc7fc2abc247c45397304beb71c0a79d2418fb2080263d423f3884415bb0995933965f21fb587cc63e7354663f21f86d2bed1684a7c09d40000f463e027ded157485f762b90c3990bd793496a8e9a226724c3a38552a97560a2e72efaefcbfebc6cf03b31aa28a8e12fdaa52a27eb0087aa595a275ca52abc83015bb81fb0f9ed8f30dee6548c54b3841310b60cc1cbf7ce215256fc79dd179fa94ff2818266d8f829939ec7d5ea4b0a7c67d884a82d1ed20447961a45e883e053417bf6047ffa818d4aee8f2ef65be553bbd386e174bb8e774519c8cf3ab972c72f8d3ebd6033c6890a2dfcead5eb1c02ead203aaf1a2233f7df296dbe4ea3d1926d00df57104d20ac1d8d57382fbf68c47f25c8c7e85030ee1d742c27f3584d53a816571edb56c3f5fe5807bc088df05393b29c4bb79b1cfa8912dc506af4b2c67efd1fc4619fa6f431a883caf0ee8cff37e7f5168a071eb7799c85cdfe05e53df0df6fd29405eb5f875dd3dfc801ff8bab3fd5b8b9bc2adacea0836f98752b0cfa47229b814908ebac06a2467ea1d62bb66907f55208de9c573c187777dade6ea0e069338d8ef6f5e1fce2f69418781265efc32a533cfe38a4b07ea17b3aabea495a769996b06498a29b309e3504d8cdeef77823ac6541d628f8f36c621c20e5bb44387b22901f6015cd09d8babb13eed3bdba2794d05679aab057ff6345747762d4715876a67eedcec4f4eb5e212c05f230cac92a407c4a18dee7a07a6ebd21ea0adf6a4fd44d171af1bd7fbb534e0f9e466c077c0317868feb878684c7babe0e82d37f4fac813df5761739127ab340d5066083766728be816d3e4d497c1acb13758b3f71eab5ffedee2f08385769160b158431bc5321b4e8e49a76a3dc28ff04eb155690a5d31600d90715f6a32740bd77f90ab4edaaf0ec4abd13e2f7f9476ee86f9175c3dbdde01b1ce39f9d64db0b1ab95f7aea795f7c3d33d87bcc24fd7a7f555f779c83175cfcee4762a05afade226586c0134fadfad1e4f5f0e3ee0e6cde1c345e46c60e478095aab6a0dfba49fe8ff6a3342c5afa3b6d788c0d2279ccdbab1e6a8d2fad614ed5d564b747e48167c4f6bce43d8245a3abbd88cbfd620f42471f1a1272d9732a82677f752104a57c1376226213941a5df5dee615943abc6f51b66336ff51b1a05fe80b3fa0e27f01573f2cca3f9fa1e83cdfc9efe58b6d3f5da013f24e381261c246aba7ac4e29b95b62dd7a01319a839a33fd220e1b96bf4f7aa44f60cd5cbe137af4c7f5eda5a4a8c2576032550755b37f835e9f96cd0fbe40e3cafc6e6e6475c6192faea063705ce6ebae4126a019ae356bc313800ea88dbf08b9c5183b0c075d10ac5e507eb37faab86f412db737d0ed4b95d8f4fbce0f62f31d12777ab78547da74e21c759d7a7e68f20fc2d5e7ffdd7fdf5d78bc329b52cbb0ebcc08039b18175092afe2080c942c288679aed4b71039e81112c7712dfde71bb16f6a5285808a37e8a0830ca12037aecc9eb8d644d989d958be07840bf94475cd80e60c3a54d70094da19602a16d745c133251d598ab97586b097d74b7063d3426159230a27e6e2c6a1811ea3dba1e6458556a10e4aa38ce087f87ee3629d3464cc61b899da234db890a904879e3d018e39e17c23cfb7dc710a6251687c068b2f51878af49441b92a074ec2639d86da108fd116944c145ad1ba8c2f256e8433265d44e3da7e82eabef9080fdbeaaa4b11f5f80747c6fba05eddc9482caa0a459d9bbb65f8f60729805f8cab72c4cea89a62b8be50f0fc4fa8a2dab5af77005336fd580d4d4cefb17ec591dc099e71eb8be53b0149826457ad02f0e37c73b3051bf30d37531aa6fa893564a8e5179a1610ef558db052fc127f26ff165eac462b0d0d64cf8dd45efd5cce8c1a72934e5ca3b98f92a13e943cf7cf0cf46c8dafca7b81ac058308111925b7eb68f2a351557241b259d4761cdb016de05d680323cd82405e18a721df50b2c4e2268adc6ae837660c081cf9c8ed00907b1797883fa715fb86b964e69032f574546064d6a0ec52e864b2218f8dc70b59755b561ae40961dbbc8bcc5e6454ecab52e8cf51db309bcb45b195fb3b10d7a73bf644ed0b7391870e71ed1c561c332d65a98b1458f8de49654aebe0d52a10ebe27208beb18b697be1dfb24f3da33ee18209dd6751f25c3a982bc7b27ae23a6c35d4d30c715601fa361b3eb09c6d563c790aa28fc113657ed4b2e54a225012a3c891e6fba2a2d919f34b0f776b43c98d3cfa4bd7c95e34adc3ca1bbc18a47188b747acd7b950be7fce2bde210ced4300d4b55fd1141972a5699502c1a22c1a1b5ad0fb2a956057973e10a7f8e58c726d61f9d8d5067278e0c613bb937e0acbab03bc6d2318cb20dd761b6a8d04485ac58cd5c0c2c6019f41676807ef52ea398968f666bd72bc56a6502f0e84ef9bdc5ee2153b00faca38872b6cf80f265591f09091cd1e600acab5e44fbf0d3fbd13c67b0fd120146ed7319122c5a37ef755ba5746de531b981ff3c799c0bfcb961921970724d1d52cb5efb0f27c2c301613400970691dc63385913b34f57fcb4ac374550ce1022264f285d4e2df8742d2277dc13b8d9ee4638492b9420f5d30129243ad9cf8469cb728245e0b550d364eb2c9d2a4936290226f2bfe23effdb408e4a0c435dae64158f4442a005001400950e4cb609b1e5e72e153d68fc5cbbf7bf3950963ca2786508b6f4d39fb3214aadf002aac6d61135f921abcd78695a849900abd2e0f0a7a86ce9f99f8ec5389438e3d6cbf93e5e02ed93a79767646f24c09706c840a81998187a651a288dd06d3184c3ba495360f0f6aaab5efcce22aa292776b5d8f8a734648ac346067a23917dd13427313d072022e9541c7b9196daf19b6013d08c8b1f30e00804121e1ace519d93224a86a39fa3860057f81fb388636fb10bb480a45658d0908e2b7716b022ca905df3469e9daaa9a82c0c97c1a9c41bc0f96fc183b4e5f69d86dae9f2b92e0929936c2f2b74c8571573b6d137cef1fa08b163781755fde574d00362581c5f1f6f3fd34209894e20728f1db885b3e606fe9ef1d0d2258e9c062d227fa56b822a9f20527a659bb09c56d102fb057895981006a0dfb568f3fa73fb81eb77d7d4ac30a12100dc930bc54c3c009ce92a186898c45e109720e368a4903b880b96ab285c6b808f43304471492620bdc2c1e2b3110cfec2a604fd31aa96684274381a776af70dc47c138e6c98ec1fc1e03ebc30f6227a892d2a40c5786b99d1c5467566ca46d91029853b442a4c312e4b847e9aed24533d84c7eea782f0f2c40d7ee7db1e05e176dd98153bc386df7d19b339b7aa4ce52f8da1b74dd06d343ef81bbc3f0979665061125f9a12d3c3904223efd6bb4d505f353f661f5fe182e47650243da35d835568a3f6039a91e95d7b0ee9a9061961ca002271ad8c1dd3ba31e4dd74924e9470b6a3448ed36b172e167d69f487102fd1230d93c792ef08fc0b8ddc60a10e7a890f5664a1f545c00e7da3a1aae5dc4834a82c1c44665ef01f21ee8b756ff633aa3c4675815ce802c6bb4410640874eac35194e88f5c436d49a3d17a258a375643ccfe4830f93b1cf50b67b6a5f3fa60f9ed5252fb09570f438f7e2e8ea3b3060c43eb82d5e123296661bfeae4e0ffa0e22d5cabe58d75e7d5b885093f6039d4f2cc5658c5e12c328769e7a3ce97748cc4b19f4753eb7dd3634b1c318ecd020ec55cb74457aa6d34f9256a8ba6cca7b020f3f631d1409a0e992436c2f81195ddfbbee34e987e1d58062e1c0001a303b56ded4eb4cd1e5691593c9bd2248d004cf2009595bb0e8101b808a101dfc1227a4c90135ce8b47e1923af891333f6eb0ba5224c60ad3890ecdc83c28b01b7a39b385a089dd6e24602e7d5afe138d15d46e90c6416fd099ba6ccd137df9cc9061e71780f31dcc9d1dd7b0288c860068252903b73c4861b7f5b137563a478ad9ebb1e0063a5673893890c89bb557320d271e6b31808a2fee191d44ba49488fd540212f810abbfd7c52208b3ce0945adcdb7f2a3641bcbbbb152643ccffaecdfaafefa5943720787f4aed052553d618642789015101d7b90375c4e1170208c476aa63fd3ba80821fdc011b9d8ba3a5b6f04109093ff101616535540357620323aceafa2b1423039084cef1c3bdd10c8d728295730b9034e2726eeafdb32b38e64933cf1c71677608c1003c759b89fb386268453b9f2685f6e7a3a275185d43fc14be4fc278408c4d055e0da1dbc8a94f9ab236c214e0f72933a8c9e65fe69c045f8b3d35806a1a25982e90bb1b11720f6b5ccae0904263a18af90c607daf7bd07a6afa701dc4cbcdbe9e443b8157e82604aa9621420933bc74fff68952004b829e451befe0c4e400b0c9beab8fe0f5442c9f0571f13081380c4f44e23a4d000dec4206e10fa77cedfb76cbcce51e6c1eb6c1db916e8f7c5de03f5f9cecdddf2c089de8db60f5d9423d359cd9443bd971c33cb79f370801738d10f2ccc461e6a400b90cdea64417e5f115c1b197484a14b23534078876cc662ba7e043c8f93fa7af33b7340a2c205759359ea59065d8af1182945c6841e71f3981915f3b19dc7a78e6b2591552866923d39c8cd7635423a0d600d03bc81e3cc9d95cdb2a1cbc7b388a8b1788cdaa0c5277b07920f06dc252b1e10c0a9682733fbd77fe44fe3587470c5435dbcfdc5edc6ae88174f73545c374a45f88d91fa15a677e40ebcb8a68a9241f52373f542fe14198a5512700084e4cdbc95e6d5c464d2b16a11d166643000421fdc793cd999221ec7e040347b34df78f27b04bedf23d07d964d0417862135ec236bfda4d241e36550c0a6808b73ce57caaa825501b4ee9c00576b9f2aeeb0211014d6a66d4adc1da0d82f76717f26f171b473659e9c1c37991dcf82ca5665678ec100d0efd8bb7c55b74154fc8e2e2a283dbc135a31a09ace2073d24163e29f78abe90a60ed79e1dcb4c776b9efa0be2651f9586dfa64b7ec04f6d7863173096033da2f9116d5b5dd82d17e05d29244c30c56004f684eb02ed7fdee1c1d2b127c32833c7e89889cac97e3a1bc3886df087203c48e61a1ad5a9e39f97757accc8ad237c286780d25e01fe56afef321132cb0ed40d5ab803aaa4112426d6628db1edc427494667dba6a49d79f4a1ef0f18233f1a50729f292eb42c31acced992b0cf4620198fefc62cbca40754ee3fc9b4c28c10c1e86f0a4084aa26d4bfd04ebad627dabadb7ba35ad658d3556b0da0a56b6de7a6b5bd15ad65803d64dee37d6002274a58fbd7256a4d719bce6a769df4605cb87a06451309d83e543a8334331084f119823a9bf4520bd02e1dc8bc4d5b5e1b35fe7bc9106933888fd1e196f3ff6b14ca996b2f285f0ee5d2ecac9c517c2d7e09d0a2130f2373ca21b70d4ba055c6f65657d1dddded10614763665bff0f2ea37aa91061ad2f8461adc68c31b6f60831ad3a8218d9f86bea0ec483ec2725df92f0ac84587b9a50e1e5fb701707852dbce1fc411fa2da820f93256fa48bb2aab929719417fae66bdb6bae87d10774c2fef0e64a121285231b39565f465d7f5dbfd3fffb1c76834ed0b3a690e070992f0c0f0c38eea01b7cf07d0f430d93d87f591b8c187c97fd0cb4f8cc6cd50bd73f37916bab08b6da439ad17dc3cbf40e91279c1575a4fb87d7e81e627aa8ede4b7781c858bff37ff77a6b6c1d1618c85da45b5b8e9a6b0b3b891c8ccb0af25f4e93b5c0004aac3b3cd3fb12f819e50422b67eb0dec126cb30a2f4f248accdd2815749c89c4e61aa4b83e74adf5fa4f78300a500e74a83feededec1f103aee35af968583ae5b31fdf157337fb1e1207d7b473740d3f01c1d5697fd6432f61ca22699a9a977af61217deed12b73919a83dd5da62e8903997e45a0cf53a3b0fa6bea24714aef3547f86c3fa0939069c687294f53f69b9146fade69432c6abdbbd0a2f66defc76c0fcd3b8ce84dbb292abdd5c5cdcdf60afacc1b874b97ae1602a2f60ac004090e7f00e560920bbb4594eff7a59f9c69751df4f76c4b0601bc04c4a936d2aa4e38c04a350acc371f9633c42cf3aacd478315ee46b8bbb561a0b6e3db1268595c6504ca8f7cb034783f646f7acc85b20e68668daf260c4fdd33ab4b050cabd204b69f4159da211a92f0c147bf8649617a12e6f307bb9a185d07b24993784f5e7747134203876cad2bf278fe3a199b952a8b421eda7244cfe9dbdd1ec67152be39fb2ce68f749a9586790331dff7455cfd1e7a641137e4ac2a83556957aa5c1488efe10f58f9d2161bd651ae7dfe1eb2db7b47696d7d215d06a5fc4d65523cdf02cd3bea126b7ddc95cdd4d1c136e51b3a5e14778b7cc4a374e05472906943bf4e883ccb245c7dff61b239b4994a2b387309ee8e8be4b2cada28d03b89dc7809835d793d3f6218cca3ec26c5107d80c4707cff6116a09ebbf013258938fe0e4fca0b6924538cf34e34243a7277496a72a16ebcd3b134782104f3227d21515e2bcd3aba4b6090f191ca08b864709bebb84ce13ba89908fffc7534b2a2c58b5e4d449db61f7e1e2c632adcc48b6e211cf895e19354a458da742c742b627529742e961f9001b82ef4ef8bd23f855df25d71a8025870b547eed5b6f29b26c180549ae3e3c53797922c680b38278b5456981797307d18d0eb02527b571da9780048b6f26efd9174d14947a2568b8410a685c33e7472a3bdad93a7c5d2cb32a0941a02452cb82eb2e29880ee4f0c16fc8dab84045da0e8dfa014d398a58d875bb40f757568983a2388be071ed7a5eb16b09dd6bd43ca97f51c8a9096e8f656a2e791ef9133713f05824c6435a353cd40c255173231ecaa43654ea6cd9df10afcd9579d73de290a4018ef75673d4ba9bedc7787acad6466339d1a832d1ccacee8135b4b7f951890a4b12d807d8d9649d26dc98635a0cc57182c87a7871fd250f3dd933fc6e885ac9cb9b19bbaa8b39095dc52def8314fce07a3c5a49d3fba3ca2c54d48820a2bc2136e3ed694042c657f31933d068f0390ce9f204ba56a068fcd1ed08132fd8e420efaa83439fa2e673bfe76044b15d98a7c5f328ffd2a678a920a3e53362cbb38d1946ee190218f9377579af11c449aff0b85ac9cd012736d2a14a940785118084484ddab957a8f2234d57d636032d90c2d87958a5f0b82a33a55380457d7f6d7515449546cf6d2c2b08d71f1932c0db6c0adce6621eccfd9e4c4197f093699bb3df99d13c9ffcde5524e36fae50353a82df7e795d47c5226658374de57a4504c9379485deb5db32eff502d7155f533175535f4dab12e5e7d6040c0f1166c4aed12be3492de054371b7e27050f65c2b107e30ca662e4f93c24d7d4542efc2015049b1c6464c0abb14ac189e34185bc5abc560ad71910be6c1ea04a3d09b70a1e2e378fa323a57034470925047470d51dc3d62fbd56d40cafffa6720885ed72d58326b5c571da87d575d77138665f4a243b13a093749019401789945d4f3fa181ff00299bbe4ffa01faa901d7a0b551c69bdba89beb9a3651cde62ccf6da83b98915308d1c28f2213db9219c9107867c9ca9a082b1902b31fe64bfb5d462c139c67d515c017ade26ea498e957fccc14fce233b7718b075f0afdd0fa13ee981d001ac04ffeba58318ab8b90c58e7570de74cbd9fe355e8cd4346c97aca4fe35fcfbba72cfbedba0ce816f01986076feeb1170d96a48238a995c815ab3555eef81cbbca74d560df6d287617656bd78e4f53d4dfedec314da729e6b35e43ebd59e8bfa74d5c3a1e1d35dfc3a1ae1bfb9313d76a7ce6efe1d410ab6922075c7fe99a50c7c5f1e76d23e690de5d0f461eb53177ae43a437f201f4b98bcd81945613c39a713feebcc10aefc90949b82ee44551e87f183d6ae150f5b49e16b1c3480836db43a9c2199d0e18f9c15ad3ac840c57ab504408e1c3f791d7d64bd0a350bce732d0aaf9f11f09ab039cd52069b0461bdfd39e9e3e4aa436f61a0ff0c3a532528043f0cddf719b59a1c6d267b67959d66bf9f289745e22e483c20f3663fafa4c54c302d11b71931dd12b09814241275c2c58e4d9197c08261a0c4202db4ee3218c4cf31f24387db3c0b3431a447db8fb5a117a46aeeff39bf89d0a627ab9cb9793d9d1b6502703fa755c7dccce0b58da3e3a2b0baed0462b30d550afbcc1f388998702044aa100e77bef37c5747adbb251f38cb9121923194d6ccd0a9a7e7399186fe5ddf16fca944d60d3000a980503ffe1c8431f641f6ae14a0e51021cdef0d9ae056cc6ee8b46284b50b2001d37cce59667f6e07b4ba1e0387cdc8aa02bee431500849c1524541ecc7d8376b410c7f9d5772cfa3a393fa21dafc4db532b3304869853a87b0511c1d7e30d2240dbc29ddf0c83bdd5eaf4312a54b4f7f1273afa5fa3dc4d1eb371f8a2f7d041024be718499c2d6240af54809ea5563b302cd03ac0decd783387fa6a25a05c6d0700b5297f3a4e3c7f60fc09468ce423fe4087faf63d83077fbea3afc66e7f92801c6b7c8058d1e91fccb68ceac91bc9dcdba6bdc7e1d5d4bdffa5581816ad775f878435ff005742b3173e8d2281f67d09c8b966351f6da36f737fb5e0ee6fc4ac3761a8439509094d3c6ae2460d33db077473fde23f532b5fd3a77321df0f7038beece57f32bb7880efb214b3856f56aa1c43b306ac0883882edee9dc8aa18d6df719e38540825a575db5d7b953c0204b15da2eb909a409a1d39cb04f8b0d744dd917c71b25b4e573907637ec11570f0b20e2aaa1d00c98bbd397085ade3821e8cce36e8ab4394a47cce761b2f4b84bd55e48680007f9201f0800f0c4731e863254506384733b644dc63b34639e6e775a13f332679bdcf313ccf06086ea8594cc4a2a97839581b9305eb69537950d59cb4a52eeb3284c0e768909ee4967b15a2ccd7b5039218fd113247d27607813a9d7a77aa4c3533e2d9e16bd910d8f0873360ee995286a7c62e841cabf3d88aa5fd76de16dc24c108c1483d873fb9af41014c2703effc2784d5cbd3c42fe10ba44a3a100fab81350104b80ce04be6a22d19685b2ca14bb58c3d08b33ef4d90c8a108067804a87842605adc8606a052070b30d039f93f3565460f0a5195843aeebc9435391dc08b33efe774fea70f170635e3ab9a59b27739e8612e48b530b00102a260c1687bdb1066fc4e37eabab31ceeb587d58ed36b4f368ef97fce05b83020a81daa4b828137202947ccfe4b4297d6c047590671bcddec9fbda7eeb932b54d21c9d2bec04a92baffe96db27768b81335a36d29158252394b98d5325ef0d501987e3628b36d4f596994c5c59971238b711ae05640c58890ef6d3df11e0db802ff99158e8f680c94e37623a0d49815076b3d5ca01a2f7fe6bdb70377c9bf77e1fd29a3fb86e6d3af24452a132b699210153edb3b931390fa9e144a01ee6fa77711117a8ca11215435fb4d830cb0fa578ffade4829bb18a8ccc34e288180ff8d7806ab24cc7335448d9a1f5c8605448edd335326e9adca59dffb46852c12527667ac13fbe53c7a327878f7d0d5e6bc4d3714150ffa82003631eeff2e2fbca1655363ef0b7c41d1a1b977f765ed1a94688c22bc240ceb0f1942aaa28ed1356c813c5928b768351497a743a4fa442a6087b5c08807c89b94241c2618f32e2e36dffa11e9fc252f646e6c16070dd7c5c5565dfbc44d2a9485b2016c9c3b6a662e99321e743832d723246083c3ee215b3013d5b6d49305e308cdebbc237f6e206cb30feb1104d44473230e15af123d089c8135a7b1bdee95df4e309c518f2094350adbeb19b1350f76cdd033a97c3954cef032c5fa25a2587142a1cabb283aaa118123bd4c3d0e3c2317bf82bb19a8fb6ceb69cda1f2e3e4416ec1146c0833b486c1bceaf647245842f1e5ebdac0c9832e0e040c8a26175df718a5a594e8ff67dee2c3087f77fd136b11200350afa8a1a9bf119cfecd045ddd98840c7d9373aefb79634fb97a947eca8a55245ea45cf2eab4c62f742afc200d14d118aa87993568c3bd9d77740fccba0dd3a393e77f23d99acd1b8c52f68bcaeb455d0fd3e172bd813e56f4f97341795676057edefb994e24b82e2ec2a81869ecb9c7112e831db7193a699b527e437d40f33fe81623d633c1a16fcb17f8653fd8df9d0e9b0a0ab4cec886242472830a3aeab89518dfd8c9206b88a7987d70813a0641e076e483ee3324e6d6dbd01cde1efe0ac769da745cdf179337c8f786962ada594da4de5db41f8e487652aa9c8b198a65f844494f791695e359640a6bc03cd69a41685ce05c82d86f857b1fa894ef1c772f49f05fa955ee9d0ec9719e5f268cfb0070f568e3cc025c6135d4ed1f31e6ac19fcfe7fdfeaad507e4820faca2808df6ef678dc1ca58ddabc66016335d3510299448ef340fa984f9b084b74b288bd8284bc54e284a6c1aeb11607df59d8260c7c1e56125ddd00534105073fdb1df8c65f247d4d161fca9c5a023ce19922fe0cf9b4622032ce1b67b4e52fe061d79b18a9762bb6f67655f5ee0e66791f294d5f404b3fb6ed5a406fb2b91d7549c9b7be827c0e83342a330898139d8e11ecf1b0318a7e02dc623a7fad06836d6ae64abb01634cf14dd49361042d0374f9dcf338eb3bf00bbfe94987186111b535ededaa2d7c55d4c6a21841052fa233f20c411bad1dc971ad32735fc076c042508669d53568eb0879a86688c51caef2ae4cc056017627276c0cada8c15214b4441f14837a29a62518dc5114d71d4a0018cf3f79aa4fc4f996c84a27e5b2583affb171b1f4fa4cd0e67ef5361627ebc46873f8befea76d936aa07715e6273b276f28ac6ee05372f48c49f2bd5c2e6525da1d1d55eed612d639289a50807dbe74416b262c2c15d3d252f2c24bfa7d4fd39310006288243aab357a68aedbd01681ce60c985f9f21d8d2df23a92d28214f2991ebabbc5cd2efc595fef59f4db9805ef5cc9d9262b1ff021a357f33db54069c2bb7fbf23fc99b82fe005e90d50f6d27bb783222405ffce1ab0ece9bcdda230ac27769302540171d37d6060ced682e6ed53c436807752b158f95c5a2222a13a8668e334c946259a5199e4cf1249114ca973c19980301544fcd4dd5e379723c49508279f43c518e7d0276c34ad7811f88815e69cb25584f79afec750ffb561a2f99cffde7ff0643ad7319b1072837f2bcbc1c03e1846b7e74de74e1f400415333010867271083946d07a218991ef1e06d4c5656c5d1bb2c7069d8150ac596b0660357700c5589d1782b90d1785f781c18eb9a17906f32e4306f934d21140a7a4431f5f3676c93f711225ee37799279e5c888f24fda3b6b8c07843189f81ba6cb8727846ff85f4a08910cbb479035d310f756462ac2f5116acd77a3147e613717ec6efac390d704af8e0e15a14a14eafa2bbd4225e06a7f218a10d7c2e9eeed3f0801eeec85b18031725f6dbd24314f18c16d5280cee338619cc56bba32e6316fd719fcd7fc12ab7a6ba7373ba7897e0bf576af332acc07cc6ab0f31b06518d85841bc0265135d497bc4242bfb39f2997121240e3d7352ed3018a8957b57576e60e5d2ea09cbe60f1dfe412cb3b380769d2463186e20178462b3c81341693e5b8f27cca8a224974b9630c08fdad04dc290596e4b5a753b9a15dd452f96b5c1470b8a73e9ef270ba2331637efd4657006206f2dac6c2e92d1884f4083c946c9c85e20429951516b66343302e08ca228d891fb6dacb3db0882f724c2c198a8222b899ccefca28f7b23b61068893260f6c293ac57b26dae9bbefcbb90a3f9ea1c71cd6e001ca8317ec2c43e5085856f2ec60890d79dc336e9f962808437a3a2a2bf2303d2b34f20f5674fbbf7bfcb28301f9a6ecefa812a0115b0a1dee3844e5b40002a01c83d447878130601e41cf24a4da647954d2bcf2f9b5a784f8c9de790be3aa785ca279baf77568a111e06c29774227adff10fd49ba76273f37714424e16b47081bce53affa032b0f6236ddad2dde8d0105ca98f785f22b8fe523766b91fa367ca67db6f3f7d0586021ee89724d03b20ce2bff4549ec3046d1ba072e3770d3e4a6df249050fe2093110c09c639b7e5ed08af8a1439a280ca5defd8e452a5c72f3a2d41195fb20ba3de3799600ddddb92b76a4965a0819cde2628a69910b16f0ce8d2a0643beb4ac71a06c8529824e8e89f2698c6daad18086edc8ad4a5ae6779455eeb80934cc3bd1df1c637568c2ff4aaea6976ecd667af9f75d4ffc9deb04053a978ad4ce9cb098de5f43b380123d4b71659df7b8d9a57e03f7bc23bc61879828c4a37df2033f5593ad74025afb41b55a081b3fda5837c358c3a8273120603a205de290554a5240eec7dc069f6880c315dad635dd3205f188766f5df7433d294a0f8621559865e0939b14d8e6c1ab2d65f91de29f1ec45060b4490dbef191ff55c83d1c5cf134590e999c0cb363e6784404b3df676399b736d0edbe303e883498cd5751bb5dd1ff5af8e386b7b970b1c0d103ef9521d67e9d98cf977161315903decba4266b8b96cfe989ef38f29f3b84a4e698526acac20e712551ea3529fdc62686df8f714a26ff9d0c93c5e6943f1fc415cb11af9f9503768fe84b4ee2fbfcb7fd1b8728eee29922654ce3e9b88322637c0b5788cf9175b06e85624051bee6c00082332ea2594987f2f412e893c10ddf990d8cfcaaf49c50e9f6dd49bcffef78ea25dfb593bd72b7c67c9e59f616cc9f00a1eb86ce20231446274931fc7a28304908a0167408858db61746dc80c2b18cda65d47c1671492750e955d61a83f2d7091382558149f834914529728394a9073d71f2d462840f3f361de1a594117b87633c784a44397a98ae1df859c641e8e31fee61daa9e14a7cd8372ce7928f9cf55a097c9f3223f93ce69a8de0172201a1cb8d9b75a4811708396000c7644cee7a6770ca6ada376a182d133ef1878b810aa89d4c0b2d61c50edf1d3017f64cabc6f5153ee7037f617ebc5327e352265bbb1c3559409cbc8865bf7f9e50363bffd2157d1d898c31c4e873c25bd04364ade9ec4101efa8bde7c03d1bebc18a440a8e6976896f1c2a15a66129d13d721f969ee8fd839c18dd467eaa63625dbe4d3e8738252ada90081424c6d1d5b7da44cb12d7e12583fc7252744e8e6480c207fb8c581105870b52fcd8f82e4458cb32ecf9813fe2a6426cc77af30e185b4102e0930518d7f6e1402efa26b9c8b494ac0b3154a663a99398072bdc2afe244ba633bb1db3f7eb7ea452e244b02da2fb14684901badf28af04fc6af6781e4c0d96f2a3ee6762d0471d590e45b3f9eec281ae959b60b52e4cb2bdc86541faed1f68bfb4aebea23670618d8905d58309d6768f0e8218467ad466a53268313b9b6ab381b96a7b09f57e3625dc83d493f68d41a083fcd36f40c2c7357e99ed610fb3dcf5a70a33d7fbf3025e34fa035c8be348cfe148b5f0be8d6d08b8795254c87b64b67cc361a26660d1b3de623698c952ad8e034ec0bfb940a175595331f7042ae9c574ca25e1504f71ff1ad9f2761c35b396b81d1b1394f10ef6f5a81d7cb790d19a7fb58543f820d769f5fbdd9a365902b7c7ccc61c392c36598324ecaf16e3db117e36560ea582a0c7717e89980995649c8d27f183690ef1fd506e3f82dd4ee6dbd184cb88a6222a9101c75c7061e7850affed1940b0ee1edf1079c596448be62b9e85151e02bf00f2ea5eb90e624af697342d3bb2f7a6d2dadb4687dfbde0976160e099ddb453b149afe1377e291acc2b13e829b8085448d8801e162182c14aca3232236f6a34c14b07b82d30a97b514147c6ad836a87c4cdf858b42feba7b602fdc1ec2edc6f256e1944a71fcc9159a063a8bc949b8bdd987fafdfb43133cc2f5bfc05270c797db375141f0d0108954295481c81345a3404ea5d282909848ca39e186002768cbac3e24bcf4e37d9fbbce1c7ae704f11af7a7386c1182813ef1d2c7a00e4f06ac78e9432d52d4e922b8851c96ef0e44db43b529ec321433b372473efc8602f99502aed86b55d9f34b806b3c5544843e2cc8cfd0831994a9af598f6e2934b9e0b0e1a79f0ef27ba513dbc90c9bd334e5380bc99b4a3c7e4bb9dbbb142c71ce81227e9f0c9d62d07c0560194441b1c27c05e1d29aa67d079800259efad056d29d70b1d0a1a05a2ee5fb670325bee8bc1b38f34a6ee8f5afb089180a1be65962bed8dc494f63877cf8918803a238f1eb140ce5112e6592f4a7557a1dccc8444b7d7dfd8c688ccd05b402015392beb760ff8fef67e4ea919b4a5e20940f42497a7f5304897375b90cbd1203035737ad8cc3101d954972818e97ace12dba89449292f4eeadda4339cd6a23260544e0ee4601a8cb5c6d2942a9284504716648fab4fd3e178db9ac03b5aea0e12d4ea58d829c76ae601ad30063e231416e19a477b91d59a67ec4111e97b68dc55180a7f41d64628371575e787c73073ffab57d1fd3f21218f03c7f05e0426f962f6c04c58ffe8c349962aef17faefdba97cd9805cf3b2b971f3d055452a5d951783f88f2a3bfb5dc9b774dd46c2d50eee3550e12f175c636708d99556e36e4e3c20cec3af49a5fd15cecd988de7344621c310ee7641e2509568293b0eb20d98be3dda5deefd6a8122636271bb938c3b04178619723f609b87d92a07ebc8d07365d6a838c4470704d917781adcbb85dabcfd9079e44a338d6c064deb35b2d74a3f4f0562c68ef04bd49fa1ab819fcb1a03684e429b4b8be4e55848b83492fe3e5545f56322bdf4ce7c62cd4e53098c740e17a5d001b9e5d81af1840586beb973dcb422866a6215781f855a1155f272e85c1f3415da4b193fb5b580b53204d9575cd2bc171de3a2081e18b893cba1650ac28fc0888c61d9b85e5db68de85d494fe77a64f3895986739b58dd52b15fd364128072b06f42d56ff2a0ae3b8f6e83b548c763dde757d4ebfc1edf5ec60a2a94914f6007b5ec2fcfcc4dab06a068ce433a192268c80aa0a6e4c484a58306aae642fc024c11d9011b115a2a371baffd624bc1fa42250f9b3f83099dc4b50a568943944425c57912555c554ac3e5a196218f22976095606cf0f438fffd69e1f07a94ba8ee6c9dd69fee6ce5aedc50620fa75b1ed54929b3f8e27ce3c56325110e68a943bc18806f390027221502a438085b9ba80319860316ac05d1a2a7b6e823b418a191e2d92c52c00742c32b3286041b3421b787881916b1267aa573f4b4341bdd195c8b7e8dbc88baac436ed16cc4e398c848c3ae239a24741d2d332df263116e5d399d48f673025daebc2ad3c09ee0495a4314baa828132bdc82f40a486226b44dd9d591b86b08265c7e442c202cc17e72e4ef9e61f02b372c90674986ec3d1be166352c26bf1cc681ea25a60b38de4274b1a1691d739a0978f422fa8d9c4ba0cb9e7862a2e77556fb57799b6c1af50a56ebc12fc351a29cebcaf092fffff02cd2736e07fda702d53f533859b7da9f3fd01967b04732955f3fba09a1c07a3da0fb5ff99bbf6d3f3f4299e3c6a103845b8b0869044d80a6033b67931cc1ff5d7921dca62871fb78a1313c99859089b26de04feff31cc107362f911f730e7b5a998eeeded339a35ac0faf0994bb0595d19d87feb5c2ffd683304cbef400a42aed6ecc30d1a312a68080d39896e1a5cfa9adfc50a281e8ae400712baaa12310b0bdd0c71e9f0d93df8f2bfb69e497cab2c3dfe4753d9a5c2ea1525822e3bc3d3406553df2847eef4e8b92275bbbb0e84a716f8c6b7fb608d998c384d9d81bfbf23dc6d7513253f0db04bd1c37ed32b9c80a43038377ececbded71e91caf3c3bd035a6e751d414fe61cdbdbc4527f194f00d610add3e399fefb178f374ad2e967f95d9bfc7784654fd3d19b57979d4dea42d9aeb1cc2a50e5c52c486729a326f265f5552ebf06b4724003a70c90bab151a5c61f6026823e5174cee83bd86ad9e38dfd40f1060f7eb3c724e38afbd2e200c3dc6ff7ecbaf02296abca6e14c9d1c20263fc353b8295a340e4b6b59c30f352e499ef67acedd236a3cf17db59fef3117cc7992e6ee7e44c8795d446cdafd6f719821ef84809ebd7e527845f905c6217843affb24128ccdf00c310285373fc4f468706835421252eafcf15382c8c2fab1cb0dce480437c1d1537ff11ce21efe6aed8ef615938e0a90d4a050f06d0617122366cd2ef8843f12852bd4ebd7a20e7a09f886d5d7a6543b0557c3929670b98fc0f797e5ef844f2489c37a2e95261464d3aca3fd39fde3a63c0b5afb06ef61efd3a2773edea207ac061786933442c3db4e0d9d21362564aa9240141ff67573216db883426fc8809950fe8d650743a1499d0fb5fb085ce3e5b6cf2de4c0bba490bb702a16f5c9eadd6e01160274c31bc7ec739283e5cbb3b25e3cec98940fcfa7ec7e2b1737bb80edee986f4679d3b0fcabe600bd6c9a96b53b4d62b5aeaa46992f0534b5b53806a2f9f01336d21d3d8c76f2f1fc492d3f1b1002963775113dd06506ae8540d05bfa438f7cd6bd214c88b59d86b291bc2f5ceddd5dabbad9e86eae6504ccf9f72b145912e8899dfe1249146ec16c4e62000781cdd267a15f5e1ea47edff28d53ff3c5872b189b8bcba9a63015c07ddf7fff9ef28b4f4c4492cdf92b011a3343a14e09b0c127f2e5b107e6aa79074c85d47f97c1e4cd6903c15373da296513114043e65eb5fbb0a8b0f40ce567e32a745070e69b24c03cfdb0d4b4954c47eba0e2d535bb07329e0cf4a77ed871a014ee041f5623818ee25a7d42d8dc9f9d2a5a047a54d26d59eeb17f1793a4412dff56908b8f61feff89ed1fc64dea9fd9ec059019cb6516cb0e0622d5d9c7d81e118984a1f2d3900e97d494fd5c4635ea14f58c366d6b3772986ab319ced3625b1200028a02a15c4ec6fd190c66428a1789a50850bdef9ba25252c43e8324a3503a1b8d028f79ad22a6cc6a990e786cfab04e5297ce00f57854d1086eb80fb7c8274d53a836b1267316f1dad8e418ee0029ab994b0d9da000fd24034212409423050c8d2bd399108b74b7e30427b9678f88d230229b76eb0231c1d368ac845bf03a840ac0dfeeb2632eda9697d0bbce5d8cc1ce3b79ab5b022f47b696960ad7b9cac16d1653c3a37d5290dc945a7bf901ec80f4964d561814979644f69cc0e00e4201c71f0b02262183cc27d51f960f096849419510d3cdac35548b99a2545d7a476aab3a90ebb7d00a0f39c234c892970ff8d607692e19154f47e14a2e57dc8ea087c5c417493b41b3c5c3810087c82bf2c4f6eb8ec4035deb94906ff18d9f8c71c126d2dce1c62866141fd17c81fbaf94280602490311585b940ae2515a2f98b7e01bc4ceb01a62b70610f7e43025791e03a917a4fcc17b65e24214deaded3e84b4f39be16b39214c38ec409f74bede8b44311d897083e8e7c36a6fc94268c7f53bbffb32370cc21f3bb0063a7048a5c8372bb7502f9130cefff31e4a1e506193be415f13e7a31e47fc69dbc4b5122e3707cdf212b0a0e103fb4facb85e58c1fe164a06fedf54a3a7aec4dd932eda67650dc632127d5a63e54617f377869ababd980b757928647b9ac0b9cdd7b3cf257ccaab1e3b407d6e0cfd2bdb6b5027ceb051ca86a54654e619924b7b6f148366baaa6b3af78bf4c14789148c2b671784f65e1cd7faa7a4177cc44506e14ebfd415a4ea0cea2fb9801df7d3f265117cf1c6784ed5c34df19b28f5bb1ecf7c53ba667b050ceec4851a172ab5c4c4c98bcdbe24f52cc69f222f62b880073e2f5c57330b2b41f5086deb51424c3d7426232040397e0558204c8a6e4242aef5521951c9d8246f6addf2ca4b25f63bbc595889c3f1f707ef806748e0cabcf3cab21cc17f06d4afa1ba8b42b25d252435bb9e008a9791c5e047559041905d91a2cd18b9d1c9ccd8296123b032f55fca7ee389e40fc1286836ff54fd22a0affa3b42b06ff2d2c2f713c304d26c15472d6743dbd8e24f29cc432130a9c8c623e66a62a6de96ee998c6b8d55097c63f246e74f75df9b97bd3bc9007b1bbf6abcc212f27c78f2fdcecc6bf402405e671c2e21733c02a2be1f5d961aeb9c2e8efc506c0e424831fb04c7c4e8607caad5a691f712e837a7447b68ea10f1a18e37542251da007bb8630da60a2cf50d7e25a2fa74277f6d89d4470c07086a231dfae19bacbc27e7124beea8bca8f1c6d76c0aa52d9144e2bce40710dac7f629d08be218ca833e57dd64a052298e73e632280376dff7b1fd918b2dfd130cc07330c54ff406e4c420805eae57a55b352c6bc59e0a4ac872a0669f0c64c99fb7b32fcf4497606b38c120ec8fb01bcb171ff75dd9a170b17ca39b33dec8000da454032cc559008bc85f752b2857362fece307870dd76672e56cd5db0631e01f866691618b67b723d3254c8d05481ecc384165e0271d5938a15f0e7562e45c13a685191f55f8a547c7398c0ab64b0e2d1184015e3dfba3d9888b2593676c356f0e2d791589c95128b5cd1e812296b89198d29cf842dc402b4aecc2f9bf3b04f813ce7c7e0c240d8922d30712d3747b9d51b2eb2b85c5a6799dcad3772b0d71bdb2c670369ab503888824b8b1bc6627112b656783da92c1c019222baa0a047f7c6c05777524c52e575e44da8e2ceea586c4bc837e6ea59be6125bcf946060cce37e241df10091b0be31f5cb1ef19d33762e5597d831af1f50d8d0bb36ff4b37d83f8532e41a7b96ffc73e82568883dde3762f100bfb1189f49c8073191ad65681e3d667fb484c120885c923fdc795e4cc43aa40cacd712bf91827acd407ee3168e88f27d8a575798df2820a9a0eddf4ccdeb37b27e0ed0872d82f3c4b5037997b35c9af80679edda372c6f49914e074ee788ddcd89d56f0d7732ac7f1bf6703e0f3ae1c2dbfa850eee63031a3c581b5610adb299612cfaec9b160d2bea284adc52d5be476875f8a1da439171afe3c41bc14d20ed4298af57dff880d39d8c199995f4d241e980f66650a8827d6800026247251c94dbb33f1233559ce8c5e3fe8cbb8f788604191597c4504bd649c6b2de5d38c8994124df6a88f8410558d7032c2742852d74e4847aa95507fe0b81c91640e6a5e378d65d9b780aca69187630988bc803104672c87829fdc7b8ef054b32af4c06102a34ffb7a381aa3a6cb49bb8456d37a2762d471f438bfc96a97ad1801be83c4da92b7c69d2c07b571d2d61b95d125d904afc23707949694e7a56250aee9139cd29c9c47c6b740eadbb3d96cb40a0c475175ab79905a36df99d76722b335086f13bb010ee7f010c6355241ee631c96173bdee3f28b913050e5bd97d4391bd7eabe7cceb3e9260accb88ed38f3f050b09bf27dece3ff5466bfd0fb5e0524efca1abe7fdcefd5df1bb01a414226cf38f785868c8c8c7cd494d916ad7ace657525081d3b1107e216b86fe9b7c390c56c8a3f743667a98c67abb99d643963056402f6a3126433b3b1d51d7ecc54c8e02870dd08a9dd0e0bf5e7b7d7cb3cd25ea08c608089d28c5344699ebfb41011f1aca4096919f219e396b8eb9ac12343c9a6d20c1c5e0fc84b6d7a32229c180e66dea49b5eeab1100266b5139e6687905dde328e18f02666b20ae0211a6ddb2e2eb951e2c53052ed277dc2d1e42aac5b3c708995c03f687e3e19c7bcf2652422aa2e4def23e37f68efb8fed829fae40fa1e714f41c5161bac8446f56dd01a986ef6589e73b005b398caead0ab6dcdf6287e8ee6587d5c1a0f5f65ccf89815ee7c1eabcda690629a4d5c26f5280831332d977e690d40650e96a622496465b4b201a46180b7ee7ae8d6099618c58447d46bfb0fbb1f1ff2165382caab9bb4090bf23a98719aa7e412d08d160a23abbea1b0adcd056927f12c2f45bcd4cd845f7ba5d48b6dea48162f6db3295faddf36b7ea98a39da1f72128a4e2a902f0ef685cd73b7b7307e10a6fc2e50f921d396018bf96a038e6877e05ad1b8e22857a1c0c0e228d7911746ab4872ec2d1b76b5b509013f2a06833758fce79df89d516eeb28040861c083ba61681efc19f0d65330a6abd454ec52bb26bcb5c5462505dd6014200bfaf784e6db8e0e7bde7a2b8fab6b5001fcf8846b25d3433da05dd9db63ca4867a64a83f9baf5a5ac8dd09a351aaaed2e30f3ff71051bda8ee5c66e5746e218d9e9dcd603fec71ec577dfcd747bff4fcec8a88295600d89807a1216d9859a3cf61d344b74bf62a535fe1bc4a20bc3989c8163213d8466aad8660bead3f288030b8d7251985ca3ee8c6140089feadee5b312758cbcba7e5d836b369de1c4a460a06c8c5e6011a7bc39e53230ec04302431477fb0f42697a56cec473be8cfa96439dd081b9cdfd440b6da43a4da0371d7a0085bb001c7018080504b5a942c44b44dcd17a47530fc5bab6f02c52299e6bf14082f2cbdb58466a7f318a6a1718b32d329458aa3b70769ad69025e45eb282412413f63d7f0272e90f4485791f3b3035381626fb847c10bc94a779c1e372c019c78ebd674f4fd95404342dcba8cc0578731ec1f6b05805d87335ba4eff02125b01f91c2dc24ebd54608f3a6e8010717a5398b227d2ae5422b1985a7b4a48cce274d3d035d558e3cd1298ff87c2a2948416be065b2660ba6400c0d3a9d720b8ce78394edc9b98bb4074790be20d6e5080f31d970c0b786bf0d6308dce7f05c6c6b4837ba7dd46c58c7d61beacd407397dabb791bdaa316ad21104395e36ccfc4c09eb98e1fed343107f766c622a6088746d0ec3943a9da3de224ce65e8e920527a78dced5711b1bf0eaade5a549da20d04d0abcdb322959eaa1b5abc028107dea63f52c29508450ad4946989f7e5f89e2fcadc4f1185443d0a87eac7010caffbcdb54b8bbbd531e9eb4ac00ad5d66af17e6b63fd2ad061b373440093d93c2e07a0e9292f5667c9bf62b74c5684de263a2222c040b3bbcd3e6413797dfd771bc584312929bcec0db720a75cd01527daa05bb5f9c60503bc23b2c0a490e01cfb0e015263e25071e306d98d8fada630ae6eb57b87745a4db8433383098277c40f3b536f38a5cf40c6c19dbe1e20c9d3677c4bbf984059a0ce8eeaab8cccf95a8211268005f0cfc03b4a371b432790f06edcc28b13b2a63f88be35cd15820e7e81a636f6b69a960b764d5b862b84e4a12434c9c0b6bab6730737c5e9baa6038e65a0f8d44967ac48a5491a09608fdfa0e884c7cfebda84919587a532a6fb5a730a8e5362583cabd75a466e180d86a3d7db20c531b06cddda08af13098606077c5e934104e03eb28a00c2657c1d018f2dc4004eab0c3447a082676476bccecc976095d5d566d078be1429b65124d074ea250094688e12f6b29487efbbe44c9f9cd699e5379c55db09aa2292a28619e48c038c7100f1481fbf6ac54594766d0c796611ea1b7d0d6ae33b465391a71c09dcb7e5fa3494c0ca459eee1881e357bbd9e78f23770631a6258bb26e90749c859d0cc1365dd0d9ea1d9c1347d641a5b857dd377d56df917aaa4cd16f43e9827786aa0208fee4c736c53cc48e283d57a99a6b684377c4a2c9254a73f598036bc54483ede292ea72726b81112a6e570c6736acf96059606eedd753c14cc647f66535878ecb21e5ab71ad094f7c0be56300601014004c5a318c5b044276a2533e2d0aa4f7ed00c538d3b03db61c87e22dbecd84b17e512096999563ff190299d1ad2d7b5142c132d953894702d6a54f62a3668457d4a4577648dbe0411701799dc168e08f64a403e0b1b10230559a64352aebb8d46ab38f930ac01c2b3d0b4341dbe5df0b3229d0f257742f74d2a1d307f2f2cda34d6cd2e5750bda0cbb68b9ad1b2d4b59c179081989580c6ee9d2b965722ac0d5236eeaef7eabb2c557b94ae1e8ef92a123bf0f397c96dec2ee90281ec0fdf9308b6524c88c474c8c14e9cee016eafd6749e5b8850c0cd256fd61d873a3c46cd0e8ad331da71401b919fa33fa536b1176e97d9fb54ea0e0943aad6be9de143d92a454f8d085645e60313722d515bcc2e90a194c5c04ef97482732cf1bbc3af0f362d86bad2e6f0e60f92cc2f63c6b27381234a88d0e3be489b75d0bf725356b4f91e8f25a024c008b35975b16c3331c41c4be0a1fc24f5d45a1f8961af668987140ecfa1eef0b23dc66609217d9a7dafe5ab75061350049666f2c132cd193e0cb7f965bfcb83b8a84a3349d8b0b8e34d6e5794c075dcb70d81e51a88c66f14f973d9bb592980d0f3afb8bfc55c9dbd58b8c26c82267c83156d3e7439fa1af0b86dbdf76fedcc22e32dc1d9841ff282f83952be1cddd2987c971616d9c3b7185d550dddf9ead0cf59b2f853419582947a8b9fa62572593973b578cc25e7cc64bf727d7a3ecdaa49e0fe03fef9662f231996ff80028d6ec3915e27512578d083516c53be09c295516ca12c07a8e63cbec023d102d9afe978c23e4b9e0de5bc440a9aeff141c24315f94945e425d50b50cc54d73330fd9b3a414234199689a6c4598e49a354c4af4038eb644a766e023e20b9643afdcef44be0d648ad36b3229967525a2dfa1a08f02be16c3906f69cac2232061127ba6dc33b3f4bb94d23913ef9c13f87e79eda3d2c5042dc5dd2980e69559f8d1978acef56d75ab2b9beed636ee9a94e1c847c6691d6744fb3609729a514c245d992302ca6d86151d860d9ebb87249040102491b68a54500c6d4be4f1091f008e463bbc3071d111edf93e89832ae82b9f22a576a0f0d45b0ce982ad388290210aa37f10909c9203c2da8000f95c59d3eb3698bb51ff663d831924714121dec2cdbcd38b10f2520477f9149cafee5009867605890331615a9cba3bf17264a9cce80ae469a09882a3a13a724bdcf4d84dd1b8eff5f41433f86829a045f102d75479164d0d048e25416e9108de2386cbd9ff700d6881057091632283abadaaf526720073e9c973cbe47b472e71023a4c0cc5445854b3f35916e933970e3e98a01aae40e8005216465fe94ba65e4f01356c0eb6174d5393bea1cc0a3d08760f39ae66ba385280a497ba9d7590cbc6ea30fd0531121f94ba60585a94e2f3112557c8b8d9d2471ecd4a20af102db1e216e21e56006c28a34e450b678260d92680dd8b6a3ff8ed505c35ec37ccf92c20438692ef7fda78fbd0a591281c519a140734ab8f5a1c4a058c7f1903101efa9ca1818b247652f2661b17494c24b1a1908aba95329d8603bd4503c83f8a6c64b010a4aa8163809e052b7796a98cb3bb8ca7e177180a4eba545e9679702c4c63702635e35eb0c960209c7e40dd4db93b0b598b5203c737a14ea4a961e4763b1b9bd3d0b3c817f496131c51ddb29fa4ca92ce64f580f350d9d9a57df55df7779668021c16f3494dc0f81fa0d62c29a275f6aed18100ea66c57508aef6774a04bccd8af90dd50443b05267a71196d1e206015ff69c7b60860d6330604eb3238ef319383452cefb870021399478a2f131f579ad5c23e6bb140af01d8731aea67d1a8070091d61d94996680cfec887ede44e89ad09daf7a8613833eb26337564467ff36377fa2b9bcc8b660c2c4c9f64ac65e63cd05982efd31830e0051432e1596cacb131abc40860f2887201e4b10429ad30b92942017906f958a9912fa512f3e8131b51e6c008fb72d1b0d4493204311d4063ddffc4051081ce11345e772c7857b9be687a48a134571eed2367efc8fc8d370e6e99a863436263f376a7c44e696dbb98497263ee1fa7df381a63b8c2ca25fd8ad811ace83c6f99c3a9211b0d27abc7186fbac1700972c5578f4621cfd3fa1fc8a176e5c784fd9285ca8dce3f3e5b365c96ce61c4a14ba337dbd6debcabd91d0cba399d840e1804a2cbfc2ad4cb9d2237a9571837b5a9307442632352a3b032d9b99fe554bf6a262b0577101d81e05c9f4ea081dcefd6894b844288f19e37e9da7a3d6ba17d4674e2c6606f6257791859319314140aec0034a2d2a2f98d67b6481148d283788df47dbd8dac0d661754efd8cafd31477c95a639c5a46d0aae6190af13a13fc13cadc4d14e8f3000fdf136f82d711d8eb8d6026b53ab44453cceb6a2f8f7e9cd0385a596faf8d74d85b0a024ae7b42e921987e2114776a7d442632453f94d5da4c75bf5336f2bb65fbd0196e3325ea0b8a2ecd0522b338d607e4d711db3bca424d9d23849daebe5fbb6b56bb29dd70a416167471b58b52bed2b6288af12bd21e476f147630a8c2556ed693f5c838fb040a87304160fab67dc3ebe073867f10f1dbaad2a40ac0f48c3102f4b962f615c11935cf076bd2abae1dcc9cc4f73eef2a1eaf2ff947a532de78ea55707ee2d6808190a3d90b4a617a13964ba96fdaf17ea8c568a0cac69f7dca46de090e22b3e9df64ef30ede27aa7c9b48b15c8450663bb56f37c013d7a02db1f9dea9b96faf9499623e52a23ece90abcc0c483bff1970c0e1a911584eb4bc2fa102b34122aaa3e385705a3b012e1165b14e9d0ecb5782cc18fc6b1ad1f836f5b99416dc57601b15c7d8ade24a64554ba60da9b5648841d880295f07bfc2ef0b28356ee0e1e5c7d4d38ec98c4bb3d2176d00b4f110d7e776fbc14a766c9bd73fd1ef428fd1171485b7a1971a5e757eebc939f4078adc75509587508e3eea64d1c3df209a06ee884fd431a61ab812ac8ca268bf95f544854bfeaf322b6205471e353a6b260a47fa989acb46c2e5049e17aa0c1ede97b2cf73619ff5206bb0103f0923a18d395aa8b2f888baf1532a8db807051ad1382ac2ac7d718880558a852dd895738e7bccfa97a564def026a3270ddf42b4e2875ca939d284273ad0b5dc68d8267d2512daa697a976b5e1d66f81f36edb7fda77899ec0a65385d2a28eaa68f7a456946b1f7574fc8704383be32cefbbf2bb4bb70587743fff0fc9705c0ee8ccac1329efac8d2fdc447507cb1cd3ebc4bb74304859cdaf3107a28cb959e3234fc1c62064577c78687f118005a083c43a87bf9d3ab6e26e1bae52185802f6e80301f878eafca83fd596ddf81d9ea00eeaaa642d75c665cd40f6e15883e00845da9c5f6ad3e571608889e5cab24caaf7f265a815ccd3905872c6977ad5186da050fb9a1657c34a6294f93b0b59d6f77c236314948ca59e0a6f988a2b82069a5f85e86321cc03ec30244577c16292bebdbf6ea25f0fde3c215664e952074b8577839106f55a30dfb1722a1104bb5bc17602233ae7361f9467ca1fe9969bfc1dab9fbfbc3432b5bc74d1e79fcf832ceddb2c29e6b20e30af4f700d0843de9f7e7618025b5ada09c8dff7cb81e7a196d6b8ce299812e92da8de4b4704c7cbf8fff46376ee0077ce018146c23c7e1e45d3ae87dab3e63b451168bd6472c73b470a5d53a0f49a136b2281feae11a39a30a38e19195b4e83a0bb238daf1d3dd7834cfffc8af65d51334f254781d6f946675c2f192dcc8218fa85e49a20e24dfd9784ccc7b840b1b38c360a9c10b44bdaa9a7824473205f1601be6c5a02b75166d6b4498c5e52c0390bad06e7f1bc49c40e489437db05690e28dc843dfcfaf6a06aaa6e64ca4b1e02c9ba5dd0913acca1709593e66d3165309d1032c088e4871ed769ab6d80455c6284f6351fd031bb32e04b3caf5ea2f16bace3853b26301f25a7d28d1a1a0fee9b4b3b3cf91c64bd5b0af3c78cdc4f0a3938e5673ee680abfd1d29c891a003c3111a6b17d98468ae3597a1fc743173b9d8981288c196a58ba13e89d3e61e000613dce6097f224a53504b8c5b361166e047d36d32c2658d7b1967725870d76c17a2173fb0549bd9c58ec5fdd21a5bc6736502c2381e94cdb005f249d79521a627f1c807cce930cf351cb4d18c2269ac0874ea6174ed17a0ac4b4db8c06dcc738680f1048d82fa49f82288dd25205b20b9c1f826903f37a10a2d159df7bb32ca678b6f42e551f019ade5e7d0227464ce37e849bb1673c02e0789464044013efdf303c4cfa60f92b2b16a98b1e14fa014c2b244cc605f4cdcdfa5981e85725fdee41ee352fb1129439b227a35006f3a5695e08bd19f7df9ed9b63b4896fd09e6a4093ee9a191b9d662365c81e9fefdfb22a04b643507056e1bfb9f9f71aacd4aff8ec46bf214105e7d870b788cd065efe2d895410533cc46f92ebc3b4837c6a9c32166f476ad28dbc53145fe7b0140fae918f1c86c0d20fff2b4d1b514da8a584d0b590a38e553bc1f769d9c5b9367a62617d30c6abcdb85929083997ecbb35a7604a70ca2fe0f2c32d973708724ef5857001ee3bed4aaa69828e4d84569563b55efac6604b12e1349aeb50c5f103bedd3b6856b3b5517b792ab87dc6ad8abdbcc0b9359f80dbcdf906bebd5e3acfa946097617ec7d3004dc574dc53d484a8b6ead0ea55dbf2ebc569276811fe7fb6328f96118bfc471438b6b3a8437b922365f67b8b7ce17538ed7c3ef018f8429a54c6ddc596a904f4129ff0c427863c8f17fee24621012ffdd6590c9f16241d5cf56608077b65a64f96b5bf1f3564d135c4c01cdb80d65f83799797e1077d0ec7d962b9205a570bbe2d2cae596d3e2050621b084f1ff76ec279f5042cc88963eeef3d7e1c4af7a0bfa7287a8a4b1a0caca643a680bd665f9b849b78a13c434a7c5ec39d0fd873ccbd4ea1b26ef869192fba25d99fcef0969c8c68b9b7b0658667b24056e474646b18c4abc28832f64ec36b9801e37c10924fc6c87e1ff97831d0ae24afd97f2624b68f681163ff320c108b11725d1bfa4c97b1fabfe2608c9f0923f4636192acbbb61ac85d3e7401715e31c1b22b1a729651ee50c45bf22441c062cd9586daffc4ea63e6d4085691280f1dda53143ab498a06aa630ce637dbb0f8d11ec5a6b7043c8769f8e9bac7ca3de667ae7692e976950e497188e31e724078e27e7ae03cb4e9dc154f80501893c73d451b8a92738462fe021064f0d114baa9a2f7367137bd521d5b5475afd3aead6da3646a89518d19fd1b0a1c0a38fe68cfec33a92a4ae6beac0e9b8c833d6844d0881298c1081b70427b5f0bd2f219a3e8273fcd92a8967497b15edec4f59e377c5f932bba22ee43dd4761f69b34476730f4df0de16b717f3fc650b9471034dd2b2b586541815cbaaf1b617f297a1054ca6ad840b4096531fc5cf7ba00cd16372843dc7cba8ee904fd7bca743abe7fad530413429166ce95e8db6639eab91c07a7c8a43c3ca8fcb7748331182c9067db57160766629b706e6ec7179c0ada1f8b1d841db5a0a792bf2f29e35fa410206d606e58282eeec8809976c7769a100d37df64b4409248922623f017fdeaa140015192bb7af6a048195056664c264ca05ecc62485b6f797da742a2036c2d2464464025f4ba0b7c40d4247e5f202e68045f3b15b3dc63a37284d3f585b5ccdd301208cac6221fed03c9b10470a999549fd701fd47726d88ee8fae4398c840801e5268685b2f37df56893da90fa660ca130f2bc691d1fea9444cbef1af0d97594fd7575fc534f6a16b41cf971c04337adf2a125a9e0987f5c2939b46402b63cf74f1e05cbbef3331f5adcfa7ff960171bcbd08d0e2325120e06526e3df11dc835193212c7f14c900c09a4d53064f6e2009747e62aa3837d74c25c594c1764b198da279571c1ebd8024137849441ea52160d3660f434450c1fd23e521930559842a4cede53e63a3b432ebc6ed7b1dad2eb9a6f635feeb1b3f0ae3af5ca6a0eafa3f28800ea48701683c64e03fa4ef5ec4403eddc362d94d13c1943835cf41a5468545d5e147e0a5aad1710a5de60ed004ec4cc7989f0ec6cf4b02942a83e0d50a064669750d95e550ac9e34ae4d0a09b7e620b49cbbb5c1ffb93739306dc8e176b3503b12fe79c6c5f5c1dfa8334384149550c2f8a994c283a59f4dd07595f06d3e882ad6d6b8890474474e96ad0d28381f0861ac4873637ddb38b375957e0e2f9993bba72f55493049e585f48c9193e2c5df0c0f3bd65a48120caf81b96d0ce6efc7b68f90730d1105c259c37ba2ba9cd4f33d0be2cdf6171040004bdd9457909ea8f3a64caba4763e3f9063301452bf56a035da44e3cfe663af801b470a56a1be6223af8224afdc1a9f10d902fa15f4a50503a24df89a5905870338b89f8748c95d7d6c107df213406fcc003fe105def0358a79480c4c7685ce0cf90f629594bed2ed364170d51ce047288625af755486e0ea0524ca2a8ae8d3e312e53cc55bb4a0c9a6d75b804a5ead4998f0cf326b7e8994f3e501a43aa807614d21cb5538613b9dee6412904f62cd6875764ab9242a5c5d08dcfca6071a0c23d796e6fdf5c41c5aa75600423a925ae921f9638253884284a3f0091957e38d195f660c428e910c456caa18954f28189a8748710034a3039040e8e54fff0bf704f2b4e33430ce41c37fbfd1c6e5f8a8e7ed5cc64f39d7d1db87a75203ac0745427921c7c6351f764fe522b8491a2651884a947b302d0ffa6222439664b9a7e5a2dc1fe0206eb38327eb3f5fcd481ba63f738898ffa68a0f7ee6d7ef6a6bf14fc0e994d64b5f8bfbff2d7c961e4615264d039c3d7a71af68004def4233066d8ba75cd4b43a2b10d6a55e3447bb6fe62f98bb6bcfea53b8e9eb65d8d46a4bbc1f028dd4706d85ad3b1d2b862327a0763c7c3f7b92033c11980df708392f2d74c9d23457aa9acd7d7cc74d579cc3ab38fe87aacd23a67ffedc176347fdd755e5bea0440942ea2690085e9a53a3cbece3bf49b23e9c945c1e0e793b95fc64a7111f208e9df5575ce21768dd33c52659eab9a2e8302ca503c5de70894d387e499aaaa7369cc918a7cffade0ea433e87b6b4bf04ceb3c5ae114b1080489336fc7f4f5afff5d5d6dfee2a0911e5f0f25fe5d572f44dcf2c3e6a04298d90d68eda4aaedc74a80303411b5005204c0328c7f63f12d9ddddddee3fd0f4adfeeb62e63eecffb71d061568110a101008ad710cd01aa7733d15cbf399a2723d86022b6e2829dad15abb9e0a13791b1a221cb10dccba5e0a9063198537f5c13a109b3cd14962b9d80118babc8955492608c30c5a03815c680de6b2604630438e485809900d7acc92606e3cc3a8fd54282ad708b3e9b821ae05adb505b48e8b829be3cdb781d1ebe29df1b60085803e628edc2195702f4c50a00922d2e07143848448838d6be1435c830e54d891862c3a46a0210d2e68562669cf14565152e6fa72db3a40a4d6da1c601c758044698dd303481d80d8a0354e0180fca1350e01609eb4c621009005748000d13a48dc78c1031cc8f0d2c68b13ccf0628b2a5e402ffa054aeb2071e325e6c5dd540efacf45bd0c397259d30485465756fe27120c554482c17eb4d11a670041c8d891f41283012a1d0cc4fc585959c130b0466b1c2132c069ad71e088f4a28f6020cab31ff2638d1f69747e883a3f3e4d7e28d13a48dcf871801f3d7ce0c1871d1c34b8d13a48dce8f830636565a5e3238cd67ca8a07590b8d1f181c4c74cc7474c0bf967d8053ef497d62e39767df621181a1ae906ff63199529101ed1d060af2b0749371ea26249d8f5a211268140a32d61fec1286c04b22ae985e669aa2624981bd0078a4b34180d12124683c10081f1212121651a098834b9940149246540ca0e1a89a8ca43d848576e238dac9b8c7a2932eca240a32d02fde7c8cdc6560661aaa61a6d695b924b120c8daea81094aca29448301890a770c8e28094619648b280f45713e9081aeb6383b5bfa6a101511e44c9b63e7914c24e24182ad40bcc1134196635918e68224dd86b4b4946493fc5a778f618657303f251966ff0ebd053b194542320d7684b18354482a1a971e9fa5df3208a0a7589aa916463d1d0542f05d695bfc06412cd8fea41301990aa07c17cc82b1f1206a4cf6e825cdf2403938346a1cbdafaba8afcb5ff937dc8abfc22ecaf4c7ab264890f26344f32aa1a8da42a5f535157f68446bac115057303d2d553d70e79f595057229db0fb2324982a1c12e23f45fd6a67e7c321bebaa01f218e8a5eba97ce61f1be9b28610912af7414323b9948daccbb2b27d24a3b285612e656e81f0e70969a2f1609475bd1498c841202b63d4278f347601504d4561365f5554a88864f39564f3150dcd8c74037a2a5446697d84b24436d6654922919549180d06722a9825ba46a25cd55018cd4da6c9886891a4310986465334213d7359efd20dd6d2936992c954e6d913097349349a625949a6094a8c0ccc8806cba8101109e6da169090e59abac1379553550d05935d2e02a2af90750302400700e0dee041068f252e7b7011c3250c97232e4ab4d801803680e8622600433a015801220801784200ae0e00ee10a28a104908c00e0194d111000c043044003041c8118409827801c842003c50803414008e026451001114200304f002014640801721a220c40cb83000d6e9483d469d1e71e8f440d2038e1e3c3880053a3da018a003066042c7039dce110738c01807b03a076862002e18c0006b7486b06200520620071044047abcf4e80c510421ccc0e38701e2e80ce105029818828d0e025480002a3a0980a293800b7412a080041c61080d20a00a9d0454c180333060059d05d060014ccc41016128808a02987486f04302e660401c1cb007078cd1618009180064016e38804ac701106880141a206a80918e0282e804d1800e112e444c1d085852e7015740d23a0fa8e2014f3c40011d22c8d021a2051d2294e844208e4e04cae84440b7d694689d0850a003012f742070461459e81441844e115f748af8748a60a253c4033a12b0424702553a1260220123121d3a921c1dc9041dc93b457ca1082d7428d0050a40a143014d81017426304567021ae84c60029d22d0d043060065740070c5055ac70227e80c608ed61a94d61940161d0bb8058298801e5a6b4fb4ce047250013f742a908512742a307528f0871eb1c7055e1085132d5258f840470358ba60494247065a6b6d050d2b68d0a1446765080e1b7430e97088e834299e4e6ba1e3037fe8e20f4498c00f5188811f86a041077d28411f28408710f8e0061fc4a0e30852e8b8426badf1610f7ca0c30b3ea0a30c7b90b287173ae8d043177a9062e4610836f000050f420cd15a6b77f0c11d741a16600737ec20461a88b0831075f0411a26508721e8c0461a8c68adb5cbba01bd6052bc545448bbf472fd08c3a8907f56e395ff078af5b1915eac8f4d4603a335100c735096409685ed280a29db8351d20b06f210955f4b2f200b876e30e9e5250a295214525e34e58142cafe31e3438a424abe66f491235148915ea4174df399d73ce8358d44437393611945a32928a4d0d4549f8d307569ff48987fb21d146876b4618711ecf0c0025a0f371c718310202120770310dce0fa67dce08526e48e20eea0b27f728775071943a470071daa97c2ba8a4ca035fd36fe81f206286f30c1f5950d9337f420e40fe50d76b416040e15c0ed081c6660471d9a7e3b86b0a3d5b10627d4e18330eac8a28e2a3deaf8d4415347933a8cd421d531441d42d4d1f0d0063bd000471b6b28010d1f88d161a20161b441056da8a24a942443da1023db30441b8068435b031bc8c00638d8e00436a4616325a142d737b1963cd6447504c3becaa827b407b1aee7404529b99a584b94680f5235d11a470037d69561afb38a0a55d708dbf8277b29feaf6de39f4c447db0eb2b1b2be49f79b2c7b2c73c20077dae3c7bf453f17082008213000e101c007078dcc171e1b470585a3aa30c66e451d054142589b0cca59aca0249984b20ff4b9a9160a2a0c15eb2329b286868a048e2e69f90601ef4368ef96565210b936a5cb230904b1805f2ece5e5f2d7a0a73cc316755d9e3fdb2ee9a7e298a42bd7afdd028da88a92ae17613092cd2fb1f9647f695b973f284b8f3dfb1b290381a80c93fe6a428271e9b2b6a7b268b025bd8d8465d95b4344bbaaa89ab791b4480e1ab4213de4a0c31c45b4d638f09abaaea7c2e409512847e9310717e6b8714de9ca855cdf04fb5c8dacaa9a0903015a6b581838100627b4d66862f23b210a5d46c2c086d61e95299787aecffc0951e8322286188841460c1d9b5f120613880107ad3531b8d11a672546e44afe2f28413051e83292619e640c22188305c61083d6389ccf304f3206375a6b587f8da62e3c430636c870d3830c1028431332dce18389bc7a5206dc5aeb4086799232fca0b5965f5b42b27fa2a92165a0a3b5c601fd194661d737f1cc8798810c3344610606b4d6a2107286169ca1c9197c98210dad350e24d1448e8f1c51e41822e558801c40c4818738e688838d38ca88c3067164218a83268e25712811878f3816104703831d6e8081086028a36501862a60d06048020607861e606870ccd15a6b70b001870fe0080305705001071c7048008e1e6fc0b146eb2071e38c37c278e38d296fd0bc11e50d236fc8d65a7be3e50d22de58f9021dbe30071bad83c48d2fa0f1852ebe5082d641e2c6173e5f595ada9454517e234dc9d48531774282c14056b632eb12e9cab1c73017dd6009a3304a0aaab2ae4fae6e9e483094be2c2b4b305676594524cf7c8867ae613e6465917589442efdcb6b6c46caac0aca6b8b0d1a36341b1916bac002122c24808d39b08103364680052460a1085ab80017b24045162e80052d68811a09830d87061b0b8882145a6bed0a6d5c218d2884e10a595c210a70a828ff0879ccdde683b91128a4483097963c514891f207429e0c34c2461e28a4487fbd8d54850aac6147158c34a9021855d88076825536d6902a8c51052bb4d666ac20b202115608812e32071b66d8c08b2aaaac215a430a9435ec1a3ed690d6002289cf3c7ba224ab9cca83de094df6355378436b8d09249090b4ffc7738d324bcb0f1f532c0f46c1fcc0242a7e78a417cc8705a8905e6e7e8ae7067b3ef9f2c73c3797571486c1405f512b6c88a2a6a238c0718243a7e4ec318fc7d223cce3c9b257bf32e3996b2bab3c50517eb9a8c6f828ec066b5848e0e6a2b0feaf5ae334514d4581a88f0d9661a29154733948c2987f3c733dba30eb7303a27aa8c186574da8c10729ac254f9080ceac254f88d232cc32f2041c8028a73293594b3cf3214e40e18827b0a1b51a2a8865418102133741f46714a63ed6d5040a3368584d4589444ca29086196a84d1851a5954a1064d143562d47851830244a801841a4eb0e36b2eff080179e65bfacaca56b62ece193f18821c30359575d94859f53630181e619f5cf915c4050163d04f8946395bd2a6a4ec318f7e6ce4f283a58a1f3e3c1855535112a80102460f5ed8b10474023102608bf85183d7c6011880021816113684024978200b13e400882eb4d6fed05af3034d6b6d090200e2878fea4148c4489a0a65adb50db4ce068c28d16922351a1ae9b184b9cd13690972092f2a70426badf5610fad353db4d6f2700720ecc080ce1d1f9080b66e2e285158e9083b82a2739790043e8491043b3a950a50a746e95423adb596043474aac3a4ca02e191a5a5c77e8d66a4cb2a523d26f994cbb2b1c14658f5d563d6274bd7c8da8004835d2e12b934d2d625923080814d6909a3dce6834830982809334858c30a90205b6b7540c2103d90d0d23a48dc38021d9a9404957d8da6864847f8b4d6f2115ed05aa3431236d6129a26ad83c48d219c23c41ce1a57590b87184091c416a2dab3e6429992628313656050343933de6b91ea42bff489ecaa2912a4aa2f9299e4d93a686d048dbf2117a4c93fd938a098d5b4b7cd01ca1f9cac2fea1a497eb452fe90f51591a0730420f8cd00123f83082028a3085226c5184a908144823491a475a6b8d083e20421729f02214a232ec2f6bebcf97b5a5cc5a02a5b2d0a0a2b5360734f8d05a43a2f540a309adb5391021b6d6e4906934a2a061c4b60e1237d07068f8e881c6025a07891b584655a3cbca304ac2b6f5f2983fa9ac25124cf69564f395837130908a6449672840087868ada9813de60f7a2767242113c491336070c6a7b516872aae644ab692e47722c814ff27b029d94a72c6196368adc1619aa0c40c8189d6da1b84400621b42104336c200428428811c28b197530030e66c061c61a66986146196678d13a48dce858c00c33b2087d90219255dd5c56e8434c24203ff4bff8902ceaf2ea339661976523bd5098582549aadce62fcb46a2f1d0e86a04f20c1b0db9bea686f24fcdc8aade09f6d87ce5a9ac69aa984c13141a4d69989b8caae2238cddb80dc83d95670fcde444821955a940402418fdd93f916024e97a914565d495a5ccaab06ac8cb0568fe8bd0e0eba9509fadca63f3d5ffb53d365fd1581f1b9a97f7606694260a099d30154ad35f4224204024180cdb967e1722019160b05d1dc92ceba291308ac6478551d26549365ffda03902f2cc8242e3431a6118454930157515a191aecf40be2d094692300ae4da290fbdd0602edd80b2ec5588483f7c4819f6245d39919e8479338bfc3f42242030130085b20f4c13982c8fae0c932698ac729b0f515905ee95603c0a1a28fc89946117855de07a6ca4fdaf291448cab011139204f3e34757e6439246352f99a8a6a23ed9cdf5545e927ef8780c1b79965eb6248140eea191fc4196b5291195ff8281c9d94b2fd80b76fd4de53758f4976864dd482fefd908ab5eb2a04830d7cb0f9a1f5dd953a140ee11fd4fa191aabf2ce945ff94aaf20f4918e5791076e94120cf20ec7f5159f5d27fb23e880104316e20c68d1845e4200b39b0c9c1921c3c200742e0000938c03808c00dceb8814807418cf18131303086017ae8000e1d90a1832a3af8e86008323230861c63b43106150cd88167074576f0b28307ec0000657ca18c22947182328e94c142861a64900165075aecc00440c84078f9811c3f38426b4da6f5f8c1143d7ef0c3075bf041183ed0400ffad08336f4608b1e44d1830e0faec0031af060033ce8ec400b3bf802007290c1c40664b081192990810da2d091071bf820031d75b4d65a0d9ab4d65a0d80480119347034686910a2b5f67f6d180cb3405236b2a4caa58a028d241b0bf458ca4618b366f4ebff9c47514879f9bff60d96b2c766a428a4c0d4c0bc0fb7d1d68e428af5b181428a04f3e3ffda9295493ea451145230cfcb8b95492f21ebdaa29b6c5473b904f28a2a22c160faa9582109731b30ded0038c34c0d032600075652e7a273288406b5513949681109a0cf290fd93305ec210230c28196625c9b0d19030e070838b7e1b4b5744c04802c60b180b00a307182d7ca0831d6898230a5fa461c6175e6c51c51755be107d41f3451497246c5bd21d4f8582e21a657280e149176074e833ea0a31e8620a87480ca680440c7cb406233dfe608e5d306d89045efacad28211eda647177068addd3c92afb966907074c03903bb60387400c003566217b2b506e382365a6b6eb8e1b8600d17a4d13a48dc80b9bea2f66b09a3804830377af444fb6758456596e5c4e62b18977ed0d87c45e343d23212e6129498982a5610239c732fee4919a001813cd3484f85cafc89ac7a2aef23c810e92b26daff0a51492420120c104926469a8004e3f16014cd131a49576ee95156fd271bcd485cb42d7cd0a1a1987b2c3d6a410c1763e800e0072d50f22e50400bdad0021ab80089fe6ae4b1f408e3e2041fe0220a174db8e8b4a0091754f0b400db02ca1614d882056eb040092c4083059a05920544ac808d15a0b102339c4021458291a658566669981126619406593799fe4fce281b2c0a29d75b7a844121e52b6b083663e9d1132d56d09abe79245a64418b38b4d634a5474f68a294400b2ab4f8684113458b26961e3d6962a8818d3ef0988cb6a8eb9b844621aaa294c44819e60f9232976e70132c3bea68436bcd899b8c027976594a28ecab5f020381b2c72c3dc2f408f3601e38de30e20edddc700238b4d6481080d7567622cfb010956117cc67df406c6b8d053db2c0436549d54ff10ca33e35d4074b12c82f09543d26fd48db58206a8a1118854954a41929c3a82a0fe42f5110a98a2b91f47faef212a63fe41516a286611186ff901e5834a13d68a4ff939fd45414167268ad3d150a3423fa47d2238b04b406722aab3ec3a82a44b2d04075240babb586515786bd939b8cd2d4e80354922c6ed05a8d131f2ca234c162081631585080082c7a6001c41574b8c28e2be068e38a34ae30e30a1bb4d6046667d945214b486b8d0dadb535b4d6d4d05a4b031a5a6b6768ad99a1b55686d61a195a6b6368ad89a1b51686d6da1cad35395a6b71b4d6c0d05a83a3b5f6466bed0bad352fb4d6dc68ad75a1b5c685d6da16b4d05acb426b0d0bad35365a6b5768ad59a1b55685d6da1aad352ab4d6a6d05a93426b2d0aadb59696c415349eec311a211fcc8f68adc55c184b04e47ad111ee218972d16f2ad4f59a0289442e6114c8a99055dd802c9119ad3528c8c8c4bc252426bf13ff452c2856cca1b5f684ff229fdd04b1a20c2bbcb0c2b242b7d69a15527a5891a47590b861858c152f6a382113daf819ff7c5ba78ef00ab55ebbe9fc2addebfaef334d3241385678f8accd7b47171f8651566157fcae96b2e60bab7e1f13ca5136678df7fbe5dbfea8bb72bffec888ac6bc83489ac4bcfbc18e150417f76fd8ff3d5d725ac53a0d766bbe5f39d77ad937e9470a4f0353b07fdbea3f3d11885f90f6bea24b5feeecb79041c2860fbe4ab55bffa923e21467c5ff56a27b5f3b5fc3ce1a8a17dee08addc144e095f739c60eb83301642eae06fa8dd7e0fdacf34c938e134c1d6192d9c12da98afde9783020e13aed3db663cb174477fbe25fca67bcaa8ab75f92974f9a978942069ad5beb08a1a499bafcf18040a33d4d3232472e26a1d011ce183849c016ef49dfadd8beadef8f202f333eb2211c244ca72e6bfe9d9f5b682f13d314b304e7083ef39e8e61b6193fb7fd23a32f26d3240a657d24e608270d579dbef731be716287d00858cab7784ff99fb17dae0832c3997dde273385fb422238f6e7e67c594b8cdf9e68388badf5fcbed64d9df321e08a1dba3cb3931f5dac9f69a2e19ca1f37b3fb585efb584957e260e7084f0fcef746af19c58473a3fd3a441d4277b6aae0f698e19eee4d30fda9c25c693c6cf3481fc33cc330534c2d324e3c40b921821351505052708d561bc15d617ebccd7d6cf345199e2d9fe208f8c8c134864b67f12275e90bc642325d374fd94cb43fb9dbcb6961899a6d756354d2b3ce000a1eaac69760e42acebcd3f88336fb8e78dd2ede7a8abbc91eb6dac2491e3837d5d5aab6d9dd2466d610fa8cd594a3ae1c6596e083fd35484c303fd55eed7f94a8b75b6a2d0f59926ece6a7783c20d0db4cd3a3324d988709ce0ea4d7ecdeefd65bbbf30b855386d4946a67df750fbf5c9770c890ef625ae5857e73859736e18c61bfd2fdcf6f9523d0a61c1d38ebde5b8c65dd73faa41fc911c3e17d71f47cff39a5fe20ec35569269aab19288ac25d3546381622c2707f8e27d6b75f15e2af3d597755d44a07070e020adcf6d776f42e72e3a111305e706d7bd73fe62add77dbc8e6383eaf046bf97ce2a9d46c9a981a631bb19e3f4ecbe1e798112b2ae22f9454fa629267368f0ae73ac35cdb74e79f70ceace4fe79d6f69bc72ee3030b4efc5f7689d6fe3fc3288f4ed3de77caebee84e8341e5bef7427f3a533c35fe02efb9a185186abddd7e78fd0773239e699a82e345b5114eb7a7cd583e7c3506357f7449e1dc59d28fb2220205c481c1cb182d741babcdd4560ff258956786f3824bafd3795ea82b7d95839a3c4e17174eb70e462ae17e4e5317dce9f66269a39bb46adf53382df059e3ad5247a7f4626cc3e102e677e7bd37de7ff97fb7f84775a5dbbe9bf8ee9f2cb8cfbd3bed84334b2dadafc0d149ddabef659433be7fa60904a2a64cc1d142627ff8c96da7c67bee99715430e7fe6a1dc4cf615ba3c452b0df43bc23843bdafa78a3406b2aa9c3fafcb9a4f84f80bd7a8c3b62f9a2eb383fd38471b2d87bc27ba573b7d4e1593fd334e260f15ea5cfb92c2dce3867ff4cd3c5b9824e59a1c3d277cd2f73fe4c13c53101adfb5fd29dad7bf8a87fa68953023977d65b436bb77e10e7cf345991ad74477dd7081dd4ef85382490f9be68dd7697e6f93b7ea629b32cce08369e1066f7fc9dbcaee1679a36a70ae8348d7a43f97b6bf8fb334d3522a011ff3bbd6e697ed9c29a10e897163e385dff94363aa64180e7e7ea9ec74ab374ba7ea649fb5fd3f45450b733d2f96a9d55c78f43601c4d53cc9429ae74f94f4bfcec9d10ba14985aeca473f55f42575f8c076ef09e1b5fb8b37c187bad327442231e4f9eb051150df1abfacebbdf6774d2c651fa9eef8532df1adf8342c5c9bc67ce77bbfbf9cbf320ec506cdcc934d9f8a5c488be979d73fa3d8dd3edf799269bafa6699a72b6f3bd0fc627dfa79b7a3f7971e205498cc895883c344d16d397bed3d4ad4b4731fe6b3e6b7174982d7df34af999a6231fc873dbfba2a53abac3998a26b57a626be57bf53e879f69da96e783b9118f089356764eefc3d83e3735cdf0334dd3945f5b425e5b4ba6699ab0be9584b362ba2ddd535bd7ff99a6ec6bae08395d35c64ea9cb7750e2cf34bd1889d9ef24c810ac3d1fcc3f441ec3dec34901a8e2d78f62f7f8783b3a3fd3242363c4c8cb9398204f5d50a6699a3c1e1116633325525b31b677baabf1beed01397fdebc73b68edab81de5ae9eceda5c63cdce39fee8a82bf42c9ffd9af1753535eaf7396787f63afaa0ccc6d06d97565efc336ebcdfdd7af5c6f03af9defe1cf2540fba9189020a144b74add5fdddab956658cccbf5e6f75927861a57e9f5334d5656511e49479ec72e173dfc186737adbdf73da7ef5bf89870972fc6b8a5c3b83efce4679aa629fb2795c652f9d71d7d7367a8ed7b906804e57ae0ce52c6fb6884f4edc71dd89852f9563e1d9fded7a3b80e6b8ab5ddf952f97e3f52b6d65ee5c7e7315feadc07060a79a7b471dafa7b627d2307acd696deedd6fe7ed6e1cf344d53964757f664da808eb54ecfb73e1ae57d79467b93697a12653a69b39d316fbaa7abf8892a1dbfdb379f529c9dc238f1a094375f3c31c6f66969a4097bb5dd79bb6c5ddb88f33481409f8940b957c6fa2e3ffce0d533cfc40c7932fddee9ec8e4fd2ba61764e5cd56f4208e3a5faf9839f69f2540d54a7dd4987e5ded13da74834f12a1dee689fce8ed6a967984808f3525edff19d7bde1bd69782c26a46f8932c716c218ed023ac7ad3f91f0f464dd35522a78cf76bfc9ca9a5d27da6699a3ef41f915f35d3b44492793174d2e91ded73db750c44626dacce29ad72caba27ac19e197a9a28fc47c4de54ea6e96b2abf9860024249ef85afe763edeeb4400c3c32efd6f6befd38df87d5c84b171d966eebc4afbaf999a69725f285563b775962f7f2decf34550ff25479eda9f2ba4aa2c88ed6baf78edfdf37edfc4c931022d63a7ba9bdf7c569ddbdcf3481fcaa7917cd2130ef6c2f74776e8ce5d49f69d294e74537d934c9dc5433d37453f91302eb8b30ba4d7dcb7a2dfc4c938c8c8c1dc55c9f1d8911324dfa29919527916b9fa6eb33ca02319e8af288ac4b4fd39589ac20baa26caa91a73393a16bbd3396116238abfb4c93a4234f16da462871f1ab6f7f7f769642971fcb0302799ea6cf1593aac8344d1326b26e126e4eea3294f4e9b97584144884cdc8389d72bfc31fe7fbad1d1024acd4ef7cea0c2d7c7fe54706c6d18d8344183504240a5131d3240a51d3141a554b62f0dd7bef49edbf59739dd3f454acd034e5a7227344b659ca5b1d7e2ebeaffe99f6960f576c2dd6f9fee59f7cc4950ec25c5dbd56d28bb3fb4cd395611e9927a427a46c14b240cc64f1dc59571a1f844fe1f5cf34792e988ae9c332fa9317dae93b7ea609f350faa67b995e8731e6df747fa66902d3e7b634564b21bdd2a1fc4cd33465a13d4d159092eadff4655b2375d1dacf34fd5f9b48ac4e57f7d3d28ff2efc4a169c23c19667d3cd5b5047c76fa73e999feae79ebcf34d958570dccb3f47e7cef20a5344e2b3fd3a42bf7587a9aa64966e6c5c69d2c71373bfbbcd6aa2f841bfa679a32554dc9547559f9871170fe4f7f4add3a87f5fd4c93679a244cc8b28000f2d1ea2dadbcae5efb20fe4cd334c5979065796a2e8f07880c5c1e6c74793c0dc0c0057e30c0c705306081065400021460c0048828c287048a901c1081222040c4038a206267a30738a0ca7f3c9e8c5121221a108200032e2b73221620e9031450c5b2c92090003aa184000b5f4d457d30ff48435ce000d00015e8d41e379e4fce1c7b0a3001024437800b08915996007c04f112809a0b00f1300c00003a1e3f5caa7828022d3516c853535135351688012cd2caf314c1c9aa3c061a00c2e0428609381ff2aac5858c15d80224d1304ae4428404d0a4e08534669a8cf039236080bc6400033e2e60810a5060024548408a00041e40c4014aa064a50a01342974218d99d6387bb8b2ea8de010a18cb4f695b58446c23e99e8b5346117cc675e435171227ca0d0f9b8a15d17111aa9f21f3e447ed954a369a2c11fdd9acc95615308739b98d75625c5c1831db8c480a092f2f2228384f4a38aa67c64fb934c4e2e26d9fe24922449959429a42a9af27c8d7e8f0b18faa72021e3e2810c7834c86ab103123152f5204fb61fe4b1f9aae5093568b882a5063ca690615a420209295fade5481127c958b101284784cc34991122c54855342582f6242048481f98afd12f441f9922c9122a4a6c3c95e5c940fec9f0ebd61a15ec7f6bca7373fde8039f1d792a540d91d6384686c05eb7c65902345ae224b39610b12c281a64197910f6cc5a1264642dc1fe8b18c9ac25dac9278f945816147d79d620ea89d65a470aaa8a2bc188680ff216141068548493e493fd9d7c902bab9a68b299803c6344b2fc7b1309e528faab26f4574d544d60a11ce5c99325ad7190581f9b907515d17f59594d4561164888fe4cf439cf78aa78e8a5a0304f150fb5d6eec8b01f7de09d542f6222c4e697709800813c679815f264ee6911dd649e2138473a586589b0777273fd48031c234b3c812d5090d638323016a18f88bdf16b4893377e5d3342283bb4213efb2b5796101068a6358e129acaf24c652d0181668a80403320d0cc57d6120f39364252cd809cca941e3101c2a89a4f02f24c559ffc50886454d544e51f287f594aacab4986f927c9664256f53a645557114cc967ca72a2354e906be61a819a6810f5117203aa98b4c651e2e691d86189d6da149e61d591d638494c71f0e6917424adf2bae2c82001a3be438c2a1ea2a66018801236aaa890f4c30776c178569670a08dd6383f282928ec435486592129739baf2a3fe2ff080f484b807c08f436926fd06334364a8d42a3cc28324a8c02a3b4c6897951b00b261b85b07eeaca7804093280150ca06161812baec0010fc098825d30af2d244c3cb1466bed69a0352d5c3c50c6e6ab0743611e90fc5440200f617b68ad21318630b4d60413259a9228525a8341f3a2d3041badb5255db8a0c385cc94d6a801b446d39a9107614c554874a05469cd2b4a3a024a1590aa073909090948d5835a11ec8209f95f19a66489ce1333aecf2897dc79a2c411cf6bab52420073a0ae4c77340087d626cf041285284f857140f253b9f1ebf20bb4d6a2681d0d0c6950f8acfa3540208422884183d64220faaca2a4ea2f0da23e596441998eccd080a304e6e6a74897b55f021080000420882037d945697d59f92fb791665ec4c45ab207180cbb86e4e08bf69811d8d7e8bf820a401095656137523523841351688d13c405933d5350d284e40b48ea68ad4d2e9200510515ad4dc1841d9e614cfeaf0c1b8155161d1d2644574757d15a6b1cfb21eb898d05fa204f0dd1a091f584b5c4ba9e033741f41133ad71a6eaa7585030279cdb5a9b4249665595bdfe933111e2412eec41236d85a46ae61ae55ccd5416855154a8215e8d8a3ca5b153197679f618c6a4354e85c29919a8b2a8cbaa4652e52090e71f372eca281085bd3af2d7281b6ded58fa641785a5caa52a6465d8285fd6758146983f76d00c0cf6d811d805e3d71b91a9ebabafa9699d216cd45454765978468279e90fedde80b00be6067b30cc45640849a335ce8facf28a0a5157c6282d8546d54b2e6121cc6d30cbc80a1682c441b384e69f80301008900779c680dc64d4e522fd4e2eebba88803cf322ad711c505351ad711a804d815d4c3cc0a1a65882e40b2c1a958a1ad550988cce8c8f66e11bb994511bbb60b4fe0cfbca737d467942d6b53df9459811f9a918a0b50eb48e1246aa1263b48cc2163e0f76bd08f49f4c651ffa64d4e5562789345ae3302067e9064b54380b005d17916c8140334c84b4c651406b1c18982a5f23d3860c1b5a6b34d77f8d37c1bec69bc8e8a135ce105fe34d9208a235ce0164643a3260c86c914595d641e24647268a8c1219234ab8d641e2868c04641620d343a6215187d65a43620d304ca48966c246138d04e3211a29a6c618d139820d472ce108221c113a021ec199e68881028a898a2989dc42899028948451db8a428a645594873ed96b2a4a1f8942ca8bae24cc6da828a4bc6861a1e827760f1d8b86ad81ae8830b9505c0834fd1936f24f1522b707f7e646e1ab26e870fb701130445ac9f6c0031aaa12aa0a3a5509cce359c2e4c81327449cf0105962c60913284f3c9e499aa417697a9126d0537990476465179630cc45d80563c46cc23c416b5c0874c73bed959fc7e28657ef9d72cb6b31856fd74f8e82c50e38afddd45ed776c2685dff91699261a9c3ddf543ebb9bacd32e23658b7f3d30f75ac357bfc100b1b209d6e6d8e7a4659a3cc6bd810dffba49558caebb81a596a802ebe5d9d8bf5d649ed7fa6c9f3c299014b1aeedf39e9942f67cf72c28a858eec4e27743b5a7ffbec9ec28206e736ac386389efa3f6ea4f4d45612311cb199ceb9be5ddb23e96576b33d8eaf495f5457fda6577144b19ee9356e7f7bfd067ac1923c3be2f1fee09f1844fbffd99a60ca3409f511f1b4ff6356390f06247affd5ca58ed19d450c10febc745f19dd42e91e11963038bde7a6d46976fe50ff1c7767ea6aa56faf8edb9d6091e3e3cd0fb3a637ba7cb5fbc4915ddafb6cd6b83ab7d2c180dd3ded34bfbfadbf6d0d1c7562e8f43a3cafb32fe737268cb8caf874746c5dae5fc87a5bb8edbe2f3a6be17fa6090420f86b8459a03cc514d32462f142cd3a3ef5e9eeed97a174c3e6f7a4d4d1de4c7374cfd28597a5fd9f56ee2ae5e71df230c1c2850875bef535cdd437fdaf61d982dcf4baedd0a3eb6d9f6b23bf0b73a63a4e577774f7334ddbb22e2d44e726fe492995baca027ed05fe32a697d4f56bbfd4199050b1a5ff77a6bdecfc6fb8bd6a5bd36473773fc4c13be02c53afebe1a4fbbe3ddff1179624458ccb358214feccfc158af862f3b590548238dd0e38c3ad66ce91ad9453d7574afe77e271f60a1c2fce772ccb46a4b31b59b650af3c538e573aff57eb9650958a4e053e25c9ddfbf7acef851b0daeef7d1dd76b7bac42c5078126718e774677f5e4b3fd3122c4fa8786b77f7df576d7e6fa16051e3f5f36ced7671de8833fd10617182fbbbb3be53ef67eb743ec3d204ad9fe3ebfcf583145b2648d719d24bdfda2835d59f699aa60db02ce1bdce12fb677b278e8e3fd324f361510274d26d0973a498e2ece8679aa62909962464e9144f49e37df49d87080b12bed64adfa32fafa515d7cf342d89c11e730a34036314588e9021cdd6df9355bf19e37fa6c9084b1a5f617ce89e9dd84517ed679af65f415e6662a008588c609dd33bbebeff165e9a8b20f5855acbbcb3d5eec1f89a83050b112c8d774678a9dbd1524a3d37f82f2b7b42e483bc2c79311293552142050b1a10d3f92076d1b7fb7cff88d524444d530dcb1068c4b7be0ae3a45262bd59ceb01fe7a5fe4fedcdee5da689182bab8edc5c5062906011828df5e9eb24a4f9d2ea2c152c66e8391f3edff8c9bcb79d4178f4baa6ae4eec6fe79d6f5880605ffc77dbddaed03a941a60f981db6e5b8ca57578e9aed2088b0f6894cedec7f1e1ba35cd45587a609f8e2f63ad79469bad1ec2c203b7adfc68a97e3a08cb0e68d43466572dbdee9cad47b094011f5759e9ce4eb090416595aea9857a6318a1fe4cd35f2228311c6019c371bc305e7969c50f63aa83a95fee57e774a8a99c94450cfce0e3adb7c6975ee9560a4b0e5ede99e347292b95353a0e6cbdf7ea6775861a421b596ea05d4a28f7959e21dc30eaaa62b1c17d8ff63ecf95dac7d661555cc90b84efe691bc3c0e182c3570eaee62963afaa636eacf10161acc7b71a6cfe168af84fe2c33c8f745bc7ffe7d5be915b18481e7b476cead1f9481e78ced8b0ee69d6ba6f7c302867c3bc79730524be9ac8f2306cb175fa573927eccf06574c8e2c5b51a6328e76b9af1cb186189819df2056181019d92e505734a962e6a9cb2c69c6fb60ef77d178b0bb46f8db1aebb4e3a37bd9ffca22798a5050fbeb723a43ea796ef260b17785e08bf460d6774f8f5679a7cb06c81df75fdbca76fe8faba6761c13feafe6ed4d0be2a1d6559c15f0c5d7c96c2e76a84550b49a37348b79cfb52ec52088b0aaa96ce592cef962c2978326bfdaedeba33a652a3206a6bad843e7dfe671d594e50779e9fb55f08b34b99057c6f5a39fda9a3d741162ce8c3d78e7ea610c247efe708962b72c6b04a7fefe2b43bcb0db09880a50458cbfc5bbb85b63eec7f736597c50aff2ca995f1c107f1b39885045a6b5bb5acf3df0ccb08f0a58eca2df3f4f9e4869f69a2024b15573a4de7d5194f8965c57fc839425cf186f86bd6f0fd70f79b32d687a1dbfb27aeb2d2070ddd9dbff9a4d31947f899262bab282bab8e48b1c2070abfbe5beafe317e788a674aacec61634bef7dd7f9a51a43f999263dc0fc1abba5115bd7f2d6cf34dd5c594524ab3cbb134e56f250719d77d25daf9b36bf5e62050ff2d5082365e50ef1baf9b4de58c2eb78be2233311e58b1c33bce1eaf936fe7fc6a7c3264a50ebe2fb6fab3bb57422864850e92be7da7d3bf33bef0d24f9195393c9d19ba2befce2e4667e5e057bba35b3fcd0e6b5a3f23cc53adc401cfff77d967bc5b5638c45d9db4d577de763f7f4756def0aede4e359df84d993f7f26222b77e8b9a3bb9b42ab7185fa7ea6e9033f4d321f20f2c48a1beaf5eb7e6f7dee3c95e729acd851a77c305156ea98f83afdfee6ebf2a597a80d4fb7ad17bfb3114e9c7d9ad8701da4eef3a4504fb72bfe4c1308fb132b6b98fe627e763abab7fe193fd3e4b1767524fb252610c885d4aca8c1ddabe72b5fc29bb5bc9f696212f363ca083966aca4c1de8f3b6ff812ba67e7f9299ee921d3a48bacd0f168b5febae289e5bbdfcf344d13122b68782e73c5d5ebce4e3a7d9f699a262756ce00ed8def528b9d8b2ff1fd4c934c2847d1d53f89b2628618a9cdf9e1dbfa3d77ff50d324334d3757867dae6662ae3f324d30582943cc3e278655d7d7fafd7e64a6a9062b6480d7b94b2fa6577fbed085acabc834829531d0089f4e7927ceeed7b91874d573fe83d071cdbe6b18ec751ea75b39f7e709f3679a42230c8f304f4d9539364dd8122b73cc7cadbe0ee737277c357ea649e625bb94bcc4786e32678d1539a49df7e3737bd68c298c71d8fc1c5b0b1f7574cf8ac1206f7c304efd5ea76f5a57a78331a6aec0a121f63be1d5984aeadabe21f7fcd7b4e67b6fa67aae7c815e2fc4eb0686cfe1b696be95d0b9d7051aa7c37b3b3864850b755f8ba7763c3376f8cacf3489feb5cdca167c46fa3b53afdadf7efa334d426484bc4089c1aa5045a6699aa4586963befaf0dae950c76c33b0a285bf13bef7efcdeae6eb0965250b75babbf3d333ea8ddd692556b04037b5d63775cfd1877e251d2db1c24674bea7cc31eb2d259cf0334dd31413ca515ec25c8ab9ac508ec20963e50a105ffadeebdbf94f5f8dc97e09bd6285e7ae1fc539bfbbf1dd19a3c14a1560be6fad73dbc229f3db19acac111f8cbb5ab71553875b57234b880d56a830ddcd5e779d6fe2fb8e82b132857cb1d5757ff6f79b57a490a976d95db47053a7a9fe62250a0fca4ded7415ffd3fcdc0df65c9f65bfc46737413861ac4081422debab734f2cf57bc5322b7b94ac3c81c6bf3f37dceec2afef7d86aca841a9dd5b67b7efce38db1964c509fae7db181de25dafc4ef88952668e8f4ac74eb28df9d187fa6e9a92b7bb2c2843add762dadcd7a4aea6e09f0d11deb8cff6f3baab512e0bc927eac35c3c77ad624bc634aadb4f2298ed01d09d9cdfdf7b974f91f5bfa99260dac1c2146fd647dd06a9d35a6360d99affc9c63acd91dccdb086e5b77f7cd34babbf2becf34f9f59f9522541a1f4cbc32e68a73c4da513d5788b07d6ea71dcb67299594a2f1b29bf0cd572dfd9badfd4cd3939521389c69bcd6a7d7f83adb33eab3f92fad936a69e3bc51628aac08e1bde8efb59418badfaab11533a2f5acb3ebaa69dc74d7cf34c9ac04e1efa355fb8dd7c6286ff4746005084fee791d426d7d4e5d3daffce0dd52b8b5d31931aecef900575877be14ea77cfdb7e3cd324f399023d5972316932c54a0f2096be9fbe77c2fdeec653feb16932b2c20307e967872eed7bf749b983f7de9b7b46e92c95bad23270acd6cdd7f5ceea6e7f2a6a9a56c8f0196785cfcd2ae77bbe3ffac00f11b23286c33b570ce17ef79e3a5cd181c410634ce9cef221d6fe99a66992b9d9d4f54e34b12286add669f8e8ef08b1d3f4c53579714c5edc9217a7c40727052b39f85cefc30effc5b75ff7b582831ddfc7fa515b8ab5e37783bc9d53bbad630ab37e76c5062fd39bed7d9946e7dce7679a6e7e8a47e4218fc8954859a981fdecf2e69a9fc478cbc8c43c087b0d5668a0abcc136ea8a3c52ff59c417d9d2bdd5a4afb62966fad84615da5ff28a6554badadafc8605757dfbc97e2382bae5ba6caebea45c7780e56c0a8506aa739e62db39339bebc80402ee46526864813d3c40963e50bed764af72fe78e4eb59da618ce0b56bc783d31b4184b0c5f6f993fd3f4204dc9c8c43c481fa9984c1336c5b23eefc511f111235a89817eede4b6f7e9e92e524aadc0006f2bb79befd61ba37b5b8b951748baf59d366607f39b3a8f56bab03be37f3ae3fce28e9889cd8a0b32756eafb630bbd7d7ef334d98122b2db01346b8e37d9b1ddbff8f0c9498bbc2c59bf1c11459d9e2caf8565820afc590e20ba78bf9b353b2b202fb66fe1d6bb6f723f3950512324d5f59a01c65450bfa974e5da7741b5ffb5e5181c6efe6970fe2e726ae6464429f1d99269999981822d31463b392827fb1c22caf3f18a1d7e9a159418186eeeea731cc90ceabb7e7b23c367e7992c428b17282ebb3da4937feeabbc2c7bc8262250bfcd7a3d71ca3db5ab1fc4cd3cd954d93cc0cc8434fa669ae6041a9cb6badb5ee6d7ab7fd4c1396610ef2e477628994952bb2c5d7abd63ad6b8eb739f6a9a6492c4c484564c30b347b7563ff4877fa38082032b254062c58aaca99450e6fdb0d4b83a5f21418df97dde70c6f7eacffc99a69995113059a962dfe77ead96575e9ff271fe8065b49ea1c4f8490aadf583fb7b1752b73b4af83efb20e3cd367af52a67def6f181ea7f89e77d36df0c61de83436b9ffb9c9b5a5cafd5837c9badbbd76187a1f69a87acadbbd445df8f07682b761e1f7db06e99dd123250a870eef07646591d5e7aa1844fea6a643976902e57683594ae5e373fc4a903bd5acbbffba1abd1a9140e1ddc62dfd34d981fd64af31c6676d8ed0be7631c71a57288d0494d657d4fc6aaab1b89e260718cd6d9975d7cf7550787bdbfbea8abbf8c70bfbf21bf78a994d342fcfb3ebdc3c1e7a87d30c3fc4e29fc4c931bdcdbbb62e934ddda59e81c3b6c8e534e4a9fb351ce7beb70bf69cceeebc315ebf7da60ef475cadccef5f760e1bac75774b2d29f6e72ec38ac98bae28242f2f4d627e04720f70d66063d48ff5bdd46d2c9f7fa60986a386fcaabdf473cdf2fe85f7334da1cf8ec4589c344c091d3febf14d2ba9cf2e3874e4fd72c532e229f79410a321bed3eae696d8bd3c27fee19cbc380df8f050c139437cf16f8572db17238e6e031c33cced383ea7535a772f96d3c4e182538608dfed792dcd33eb1d7f89740419e8ad6e575b5dfc5ca7d728a0401163843386275d8d783f77317c743a67ebb6da2baffeea411e219c3050bf535ebf38bf87f7df1c75ca7cf57e3b6d96ff7268aff8a9f5e92e7e74db389ebf4d65c51bca5ca5a4608078be175d8e15672ba98643ea87fb52475d75f2baf7c6acd1a5df482bd6efe517acf498e7b31b66275d5e2f582dedbcd6d6b7a9ddee46ac703f3befdbb2eafb601720dcb7eeedfeded72a2917a07d1046d37967a54ec7ab7f7bbd3e0ace16b0e3aaf1746aa7fb5a731b7bc71bb3751a5a1c2d955ad8394a68a5c5f662a7fb6661d60761b2c6133fa969aeb4dee71f281c2c40079f950eafe767a58d6c049ea7ae8c080f33ee849fe55be8ee438a7110aeb49766f7248c18677d599eaf285045f10082bdd2423cadae2fce1ba37e2b7b1e3f80d2ca19e39555ebb8dd6512e3837c2b96f7e1abe9b5d95d1e3db814c3a8e1c5af5e47dde34176d5ebd3f5420d1f5e56457988f0d8019dd255adfd778ef2ce4ff6894719d95fcf08b79bdb4277fb73f3483e981b79e1ec80071958c65b9de76aa7bc133e1e6358a76faed9513a79e8003a8e39c2baa5d63cc478704b39f3ce55be3de5cd41ce786bed0fc3ed4e7e96c20307383f38a3d4db5fc70b77141e37c8b73afd31de683d637f36905ae2ac1fee99ed8bd23ee15183bda79c514f3a27a4d04d273c68309d93f4d9979f8bcf1d42e13103fa74adb73a5b9ff58ba5c7f3d945d8cd4f913cc2c874eb2d67a5d5eb8dd66623254c78c8e0baf7f0a5553f963112c3030cfd113aced4ed79f7c67886c71759bf4add61fa327caff3e3d19583dca3ab1789aa8b8717f7dd1b1f62e851d7eaf5334d324f96f08801761fad9452ee882db61a0670c24cb1c3d5461af30be095915677e9bb525edc85954e5e273794dbd65add059b5e5ca947286b9dee640b667638c39a21adf6de9a677870a1ad833e259ef1ca18dde680c716ef1eeefbe87c3c71cd4f033c586025a570cfdfeea2a3d819e1b1029b2fb6f6baab91d6578487162f6edf583a84596fec94870aea947b5ffcde5dc5f3e30d78a420ee7b658c70ef5a7d3efdf04041bceffad3fbd69c337e7984c709b4bd59be8d4fc648ed8c4bf0c8e23ec791ce6a9de3f7741f79e181854bace93ffb3747aa297c3caec86e66372bddb0cae79b521e2670bae6692fbd447894a03a1dff7dbf7bb0e2173fd3a4011e56bcdffbd29833d5ae21ac9f696ac28304d11f42fca88613cf8aef679abec06304f22bbd34db0d795441359477cb58e5b4383efd3c08fb83b0bbe1f207192ff58967d63146dfb25a52d1b8f821cf18b3e33ba5d63b53c1a50ff3d508a301173e38fc153b1d75760d9fc47ba82fdfe766843f85b8e8415a4c6fad1fad74335f3ae39207692bbcf8c967b38df6eac9050ff4b98b903e75b7d166cf2e77d8724a38b7ab0e5a8f78dbe13d496bce113a8edbdfadc39b5fe93b0aa7f45921a5c3ab34ce81cafc5ef5bc1fc4f0d5e801173944f73d1d7d2fdd53183f0ed051dff7238cfa217d0b07a778bbfb9c6fea09eb7b83c3d3553da39b176677ed1dda2d74391f94d4de5cdd00b18df2ce87fa5aaf31da91a7d459bbb332c7fb32acc3ee97dfe1ebf6967b43e7d2869d9f3ea7b93e77bc35fd307161c3b30efafbabd7659c114e1316d3c4650d70ce5ce3cc73fffcc7ee334d2e6ab8eee7d6b76e7ffad3a0adc4daef84f46599331d52dfec165f2c75d5756a232e68b8eeddbf5aa8e7b3bafa19ecbcd9d129e18df0550b5dcc80adfb7af584fa62fd544e934b1932d44f5f2b5d5b3765a664d8b53a489d8516d6b7378e21de8d3d667cddbdab2914837bb1be7d4831d42e561706f73457b99da57457ebe6921723319c2f5ce6d0f65d1d5f84543a0c3395e3ebfcb72d7cd0c69127cd96ba7d4c21a57082816a3721fe7aa57baeab4ee20287c4d5df7eadeeee9df3bf216b8cfef327a654528d5dbe805d6b386dbc187a61d2ebb0638f7a52af36bbb8016dcdeef694bfe73fe85d70335b9a1d4a87a3ad313ee1c20518f5b5704afb51c3979dcb16327412678f14ebe7b4db335cdad87266a8f1a6cee92c63ec818b163085d93d0a2fb413eeeb3e50b86481de077f423cddfe4c9313172c48bd3d6b9f2e66f7ee661736b6d72ba7b4f4e77ba7f7679ab4f62b38aa25f56cdf6fd6ff26154a0f71b10296db499ded9670e2cff4334da051a8ba5441e3aff3563737dcda25756518a8891a2ac8344d9347844d2e6b6427dfcd10d6edb3deaa91ccb850616637b775f8cdaa3d46f79926212e53a0fb7def8f5a6eb91f4f4ff59fcc639344898b14f2ac933ef8667e53564c43e01205e7a07c97ba8bb7f4195d8d0b14b0a5d61f94ce3a7d3ce537e0f20437f7c56fce075fdeb56e28157051a34ea85fd7ea11ce5ca30d322426c810fdd9454f6e1e091417274cea90fecb6ef5d5d9ca14b83441cb7c77f5b7a1a36f1d3341da7cedc5d445f92eb5db6509ceea5ae557ea2feb495d09d4a975ff5e3395966e9b845bef968e6298ab83d82b12deda2b6bcef542fbf2c223d408ddc73bf1e75d9d7569b8bfd54e8ae5c5d155a98d50a1dd7b6b2b65f678a52e02a4efb573ebb24ff7282682d7fa36e647ffa3537bd1706dad7697f10f416339ad76bf0e42ed7e86bb6ee25b679e7f2114c2cb6b77c46ee5cfa82934c3e98d33ad2fc70c33742833255ba0205bb804c1a3ce6fba3bb3d61fab0b101e8435420add8bd9cd4b3f1ecc675c7e50abbf18ffd2c7f7bd9b93b8f820bf88dda6146fb827cc4e042e3dd8ff76fabe7ea7d67f43e0c20348a35b9ae986743b78e367075b62cff5de48b5bb50d3cf3485fe894b195446c7b95aacdf77ac15042e64687ba19e133eed3c5bbfd6658c6c219c7b4e0937f6ec13e41711171dd447a18b18f251e89203e95cbe594398a3fbeaa411171cb87b523eecd49d7634da245c6e001fcd586a97a39cd9ceeb6283ed6e863846e933e788dfa50631da58a5bfa7adbe76bf0b0d1c74784f7df58c7f25de2e3398f7dfdafc51be3bbbab4b18db9d8c12e6f7f6ff7cd20b171940dfdbb9bf1b3b1ab50b1852622bdf733cb57e1a5e10c88570b270f9c2ee0d65953566f76f3febe285ab0e636bb594ee334d4c5c62406186fadd577774be272e30f85ca37c98ca3dad7bcfe4f2829a6dcd7447fcced999a54b17f85257afdb72becfef621717c0f9727c4a854b0bacf34b23cd194efd2412172edebee7249ed1fda5f9067bf4574d50e1b2458e2ee77ccf5919a23e180c9529a630e2c20287f55d755a4fc7d9cd9b8cf20b0ac865057fdd7d7baf7fbe1be7988d9454172d5cb5d95d38a1dc90fe7b9f69aa8a38171548e7649d70c6fc36ac764f934b0ae43f0baba6d0bfc63d6513970b0ab47df8d53cb3d4d5e53a5d4ef0fa45f8f07c072db42f1e71c9e246796f96f2d9e8aa3f75c1c2d98ce7db7ae3be11fa74b9a2ee28adbfc416ee7f54ba98c0ceec3ff19cd35a8d2f752981bbf1ebb4d8e3e3ab5d7fa64926261b85b096e262459e0fba87f7c1b71a4e4c02f7d3eba5515badef743a0279a9cf77925afd79ebe8528575d2f2876a1f8489a2c50ffef07d9c33acd442ec741fe0b4375e59b38eef520af9402f7511bbc56ed6a7ff1569d983dc715ee9dcd3bf9dc6d7488b1ee28df861945a47775f8c799038df9a6d767252afeef100b76fea70c36783b4dc01d74bf7ac7b5a774f62db628747dfa97650c75c079bb5833e5ffd2b718c960ed33e3c1fc6faa8a398ce3950683d56afcfde491f4239380db3db79ffac56d6ede200bfeaeb5fe9adf4da083963b4c0013a5ce973b7b3a5f3566f7903d5f0699aa3b67a472cf507b7dc41801637e02cb77b31c3edffeaa57658bb3a02b28464a0a50e7767cc3efd5559edbeb00d07686103025ad64061851abe0d35d6bfaffb4cd392163548a0250dffa276f6edaaa1bd6f573a7294136ebfaeafc7f95ea64078d4c42312f9344d530b1ace60438966ae9f72594f3091408b19648e16fa85f6d51d23d4d548e649d05206eb2aa4d9d53bb57612ab7e8a9535a1850c3062bde57d37ddab98e68fe77f7b3e1b894259cb18aa3fb75dfcb91f8deffd57140e59799a9eb488c1551ac33047bef7dd4ab7a5d139ceaa10913097a64984c5e81639b03872d49a4e27379675d7bbf353916901038e0fb3dbd41fc259dff67080d002c7fde79e1f3bc670ffd337e67527b36be928ae51ba2f54ecf28631cb7ab7fdbc5bbc10b786b8de2c1ddd71cb1637de7eb8659c59ee19b374564b17b800339dcf3aed6285efb56c6147aced7badf8379cd3b23e208d8296361cd0a2052de37ced22ccf7c90de54d4655167593513c68c9c2a497ce5d25d433de77186bc142dd71d6eb2cdd5b57f7f7334d56b4b07105ba65acf9fd3aaeaf9fb402de913a9c0f7fae42a7650d6d7fef3be38b9bee9df5679a4ad0420504b44c41ef6b7f4ee7d22b86324c84bc6020d0cccb6535f1f2f212f354a811b44841d607a340dda5737452f876ffc5505aa0209d52fb523ef63babcd2f315eb43c614ab640d8002d6af8add4e1f8e2fde9d7eacf344d934539a1a5095a42ec36eb4be794dad9cf901626c4fa78d7fdd2c9591de325cc0c5f53abed7e89a9a42d4ad078422ce3951fa9d43909bafebf93d7e9e89ef46f4182850ebb74ae429b1d4afd99a69623e8addfe17bebb454d2e96964a7d16df8b4d3f955285f8cc4287981e2a4c508b1c24c9dcd58c32dab5b7f23afad252d45f8499dd36f420d5da67b7b9468214274b7ea1b7f53baa4050d59e79d3a477b9fa658be96214848efcb57468b25854e63d17206ce2ebe7ddf4fdde2f8ae162154ec649e70feddaefa8c66380aa3c61f7dfe76f5fd679a5a82b0f19417df4cdfd59ea56e0182a5737adef152a82b8e2f89961f646cb38bd3e5d64fce5c7d00639d77d76addaeb35a586509792982e4c5484c90214a626e5a7a80a7c7d79fb395bfb1bf91161edc67638d8ee29a75ceb8cabc3ca78c961d50baafddf7f34f28dd9d2168296347ea5caeb4c6379dfc4b46fe98f5bdf4de2bb33b37c643c7505ee9dab7bebe75e078ba095dc613ca7f7fc5d09e5d7e387ea536d7785b72e053eb8925b50ecef9317a6eaeece691bc9ca00507ffe27bf9ed96155a0ae70dead4175a17f1add669ed36900fabbd5abf96f641f99f69b2f0b5d4e065cd12ee5aa5e7f9b26ba141a5b5650694d69630fcd617b3bbbf39bec55606345f7b9d7690de0927f61630a276d6da97b1a4544bf72d5fe018f7cedb23f547337e2d5e54f8fea0a3d739fa30a5a29618c4bf9eeb9cf0dd77f2de13b4c0003a3c2bdef3e98c936a90b53d375756e4e5488cc895805a5e40299d9962eb24953f9fc42d5d5cfc0feb1d2dd6b86a88448b0baab315ce99e9cb0ab7b7b4803a5de3c7ac637cd85dfc4cd3a53d2d5ce44b7fbba5785becf789281b4fcb1654e318ffe17bb6d8459baffe92a28505b3ca7f0fe62a21c63877a06505fe5e47fd56521bdfbe2d5abcbbee3143a7ef2abc574a8b0ae05bf8ee13e3fa2f4e376a4981d3d8f1d319bb4cf5d5b50505b4beb91fdc51bec30fe69613bc7efb6fee8df7f63c7316b5e68fd09f46e7cfe5d782c5c61b42baedbc507b7d167585bdfeaadb1e23f677756cd2628209ef8518eb79a17657bbcf2aafc95a4ae01ec67ded76fb94b458f1a2dcd24e9b67bdd4c978b590405ad7f9fa75edf1ebd39822d3547d963968c7542d23888e757552c34877d6ceb654b11dcbf8a2d3f81eddb47e80e50f3446e7e6c393c689a37c7ea0364b1c31a5526248a5637da834cf97b1ee296daef93dc6870cfde9a6f4f57ef24dc72c963dec3ba97498bebfff5bb1e8e1e19ddd3d966fd61d750581a82979f08bb1fb8735deb5e2bf789077c239eb7d3a4b083d56e6b182e50e8e9f8b153a3ce78b5f59ec8027b533ba2de3de595efb99a6cac645581ddee56b9ce76fecded5cb428707ddbe55e2a831bd9ada396007addc917e761f3aa16503e5a7382848122a58e410e7a5b9da5a5d57af367b6458e220efa5b5e2fcd405050a0b1c3c3be95b3aeb32bd6fe91bb6d3b5e6fb767c8cb1769f6ca42408cb1d9edf740c3f9eb0a8e430c7978112c5280862082184538f060023110020302c2291070432d174cead2914800359885482464a168823d228c66114034114638c31841864903108215658015271d852fd8f5cdb18825a249c7da9c2d644c4a0a28955bf33b758e07eb5216765afd03258bb968ab37d6062bd11e28472a706902ca47ab247c5fb4e322e12038e11e2763743a4176026b24a7e01b87a3d5df618e07461e946487363bec3c0b3a32f91319e712edb88c5414a70bc9e2220c8e6f9ce4fc1f9c31fa940365cc77a199c5f4e1cb9ab907a87a6df849d6cc2d0b2f7224464a6aa11ad6f04600c048200b4f32f2820f170d1d624b24663d2cff411de63346f70516ea118f6a81041ee9ef2e17a544b54c102df55a09955812bddc7498e34a1de8f903ab689543acf4b4325151cedb354b00f8e5f92b05dd35e6665644df3bf0de1471164e472e185254af5e76941191f4267f7921d3d78f7b594985c6752e37a537a17ae578c385541a10bc6486c5f5e8a8ca4bda4ed533a07e98b37cef8708ffb9139d7e25cfed5e62d078444590c4ac76264fa3091931df9fbf1b1b7fdb9e56c64214f93fd888be8d25e88a3d42bdddee868e2a3911d732e41b058338403f45add53593d465e70faf330a2667de34b476a66842a480b02de7a90450a71a12e2a76082bef787c0c030ec26d58c4fdf735d7fc37a1bbb3749fc819d49d0e9f9b817031640974f6465565f37d817e01c23af57a023ad2a066b0f0a0391567b80b1e4c7d669342fe7fe3bf5fa730787d711bf081e9bf9dd8319bd89be53dabfe6e708a2a6d96fe4c379027b07088669088c3a2e8c7e63fa84b0dcf8cc0e6493782543ecd7c1c355eec13fc82e188c7789720f6cd9e8e36209a203c12d9801cc500e66a6e4e8afda447df66baf3073e9a7ff5c50af0258b58f3a002bead528225e99e14c46a6f5bc1a5de5a367eb62ec03764f8ad8453b7ad8dd99ff2e107321adebbd8cfca0757b47a0fb6e40676224cabfc1fdecc7d0bcc0d920ea5ccd2aa69b60b8cbdd41791e6652580d70c7f986f4dd0ff23c9c09b96c7c4532bb6c3a86fbba1722938e55ab209be4494625a0ab325080e253aacb61d90603a570a47f1467bb08c2fc1e5dbecff0c465911390d6b3809245c2bc6132d9c4da781854d6c3b14c2e8387eb09a9bf1332b0bcc006adac572ec56a00972899f2dd29208e0e8e61be0b320deb2ed01a8b8609771662de9009deedc3ecce12beabfe4c051768f293a69a7298392d8338cf7e446902313344dfd07a3c300e666b03cf193a0f60f3c1d60e788fdaca5680dc79f61a851c9fb3b3f9850d72364e43f802fb0752d7600651a5788e09ce5328ee5d1b03beafe65737556207847aa48f18b4cd44237cd5a3ee29a1bea34a3e611d77fa5b38c0278546c951922ad4005f6e0b4c98650a943d66b6a9cdfd74ddb03b0c37eff570c8bd33a2c3c17a65461818d48d0caeeffc2b5d8b2a0c859b3d3335a0ecbebfaa7d8a7a9b339a6a349a1d4f0aa908d30718b6b1432486418bb8c4a183b276fc72494c07e4de0cd2afbb4b5972d4c6a68632c2abb8ffbc80883a2fa31ad130bb17736d7857f0f7f325179a49e7f39de8f91def8f61c0b3faf6298c4ce565a87825d519912f0f97fb2629c22850f8cd9543d8f521c205601a4987a6776ffab694858f2759a6ddeb2b13ecabb26b2d5487dc1a572de07c918854b2502044caf1810b62378048c30b81ed5312ec1c8362977f2596716222668e4bb70676ea99c51a7d5bcb50dac3a72d03726cf293da2a622de702356086691c3e18d4b1228ada8bb8ce0c38959cc59296ac24631c748b3763f3308d70af0d2e87a1540d1a00ab5bdc4111be81146156defa07003b740d2bee87f8bb18f804cfffa55321ec608c9fb783f851829e5622424f9bfbaf575418a99740987be4b3214f22486ba519a018add4761d38a31f7b31d1474a51f069dd1ed47b7c3af0e406ab59f289901ebb861c4b6810286292b083fb78716dbf02e82611fbf17ce4dc151ccca3292534dd53f8e28ddaecfe5475af829d95b4bd395a7a8370b39678dac7161969b6b5edd0ba8a0762b75ba5c65dc6c9f76bbc53beea9ea0fd8f586516a4463c20a65cdeea2a5bb00584b83bd337ebffb029496085a9c433b7dfe100be23c2e5b7326bf3035050bcf93973eccda6cc98fb12103364f3b6de3236e033dbdbce1ddad14418d0cf4e9f37834a2b28330761cd17845835b8709fbffeea3c4000e8a996cfa2d673e17769d6f0e9e30dd81e452dc5c0c54e0d05fabfc271a5e2b71e4dfe41f04f1bd6c81e50b0d6419398a01a36cb0cea0b5b1f7ecf259bfe4bfe34238039b816fb4dbcde4f16f6b1c88cf0dc16debd0cb40a90414e30bf5fa92c62e9d666ae3ac3e871fb8c427c8c3330b9e9ac6417472f78034fdd8459f7a76c2e19807b286039f0ee276f85b3894cb73ee72cb8c247a19193e775b1b8b5254326fb841197f2ad537847aa35b6bbfd4acd1c63a761529945f5d0a66a55974f92034975143cc6d3d5b926fcaed0c166bf92ed6eee9cb3afd270091759d933627958c751cd63988c92ad883e55ba03f44d48e0ba47b1458470442d98495281e7c40089d26ebb159ba03d6f6ce556cbc5b9d1eb7df7d66d1ddc4277795bd10c0e634ba031a9c8fe95ad3df042aa7bf5b2a604294420b92d7a8f10a6d57f37639d5dac07e86349dc8876739052d3084a9276d94a559b34bfcc80584c1b8842b31b63bb618f549cc72bfb79f60889edd4b3c82bdf967d781b8a01d62a8839f723e68f4cc20070a2814bb45aa913aade9ae21168f9511d2dc1f9e4cd873863b4b8b10a34e8fc0e27b39d0e235033bd499cf1b1f72d00436bd15126cd773b53ae38cbbed640a0a578a75fb0ea88fe02200c02bd9daed02bcb3b690f85bebdef821162d47d3da58c0b2175a5cd15c4f944b849d2a9364c9aa90b43c18a6d3f6f28d9f15856352ca008578e7efa626a601035229d3f3e767bd397a160378a098c6f64a14009920494faf6f7892d336a0b79a16cfa96e862802da77cd18b37a877b9f103c18beed8317d1f8333acd5ba51ae0d25a279bcf47b648f6bcd245e19df2075d72a78c26b4cda656fd40ac03c8c3420a2b56c887336313b61138014ad4b92275495e76822b9457cf7414179ad960aa317d63a8f8724db19626ee1f151aa048cf40f0ab98d490070fcc441dd289cdc02d39bf2d881739170970cfb5a1ce8af261336da875e0acfa86039ddee1ff6bb477fbd8c09f9b937f6e6ccf3bac625c9177a4feebce9c2f56447e584238b2cdc456f06cd8cbf3fd5737c0a2f73c300a79a6f8e5b90ad669910a41a5e071c2946e0d50bf1de0dc4966b65d2df28ddf0c53491263802d220577eb39a5002722b22aa635fbaa521103c0561b531a50a8e32ca19a0ce2a94b8d2eda450f97c019c023ada1c5c95883a824ac8f3a9b7dc6fe5e274cbe46e54de7a369d66a6252c271cd54e0616283daa7e564e39a097a6b01f15dee18f43dd6c3462844a8a3dc1fa19e41a5b34f4bfb70ec2abfba3164d55f0191f703e7a4f3de15a2262b82b09af28d4604992155209d2abbec962b7eb96e99a8265e9eb6f7b5531ed33a2d02fdc102fb2c49685ad2de64c885f74c065faf78a5c07521f7441dc423d0b1e7aef528adc0a4c4e5df161d714139f44ca3039763c2fb23733c785e431775d11f86083b932f30dd3ebdf0d02aa8896bc5a19cc97274bb627a188a13069c0014b381069b29570c2ae1b2d07b0290e2cbf20333ef49988e242d7c0fc78061d569cb905e5c760c27759fc2d9a38c49ea68c2bb10f7c11d0e8770c38a0f7b05e84e7cc9caa315c3d1b5f84156455ceb2ebe8e3e23ac9e0e5a687b40171c582b1a4d9d0b611916654961190a3277ed3fd118384cd04358501a411045f35f4a4c53af2deadf985cdd80020af61520e335979b952d2541dc5c5314c1b46c03bf388de2e99507835138bc9f360d3b8764f26d3de69250b95337154cae27e485e991b6e1474e71b44a39c78485530a110b31d0466387413225f64a34f3a528b1541212d8aaf3a11ad76ceba18c51bb64d5826914561851e9455ffda5372b672a582c1ae390e0c265ade75ea435d72a3956eddd23746e8a4cc57a1c9af4f8538dbdf881180c3ef45b52df251197d4aa27f4c8781c31ae8762eb85fa73df961b5a4b9b5b450d073113b479b0de26426e35b080b80d85cc962c3a52f99c496867fb7a4c042c1f917c1b2e29dce654b0c5466cadbb556331d5f97a6a342fc63563e936c7a55a5ba3b0c1af7ba4ba55224a489b8e9a6e43a206b5115435a0469405caad0d2c772d9fe1e375fdc7dd9d6071df53480b2d9ecbc2d1047f8b5d1eff42d74c071ba463d0856b37ab8d885866c826cdebfd72618c885e13b2b1dc20d6472e3b234fd802c431949f8beeac3a5d2d00f75df632e980b22c5403c08d231e2a764299f2f16eb0fdb039cb28f9105325a6a3af6e6f9554f0d393c34a4bd38a0353c65cfeef4dc746b596af435dfbddd19c9cfb9cff3474fd423034efb5ce515a209c63cc044e6f875c08a0a867abd354969ae93d3dfd4fecd309afdfb7aaa870d4268875f12a8836b08a8605fa2bd262d0793be20ba0d84575fd427a47158a2c1776e27eaaef24c1583614afa197d7c07dcdcaaea8402865d34db8826e01244f6cb9f87a91e890703f985145b0a8573a1bee4a1d02b2e49e78607ef1fb5294229f3881edf906860b9a00d730a5cf527f28cd462537e751fb71f7b12a1186e9ee46323304e0e59b1079cdd9babe190fd256a34220147a1de9c01948014a7a8615e46e8b659ab9db5600ddbfde0d4d435e882677a81a2539688c51ed5974460835849219cf756916c0f07c21c931a7b9717bbee31f03576fd0d54ef8af63c71b99bd55de66093cc54521ad236730777059b39b6af10a28fb153cb6fe510097400cb4e3d2cbda1bc9b30ba3f2b75dd4b1e6cbb8d3b1c5b94d21948069a7d07a991281ad3f2f74c703ebfcaa43a12b89db7af3491ab01120fda86efb69f6a182c7e3565ea4a8ac5109407038a4fa2da2ffb8c419af5203fa74810384550309e24569b3f7500672eb87c4ad6b4292d53e5d18fb00267f9a258719436f69c9c6a1b7ec7a659b014f787f66903a58573f83447e219d8311bb8eea143218bdd10062e220490fef93473f4a6466df3136295ff9ecfeddd6f4b81c9f81de51480badedb2be55410ffd932946c3ec0cf36e97bd7c79ea7a0ecd572678ef0d15a401ebc097599432f936e5008bfeea9fea5695316e612e579365d966e4096a4d09264164f69c72972e8de09d48be479cf64fa08df13cf2d79452aaea2e43362a45a4228391efd06568858180e89c354d492b360c73772e6fb743d3c79bcb378083b8687adcbcf1e52bda617ddc08358b4ec392d917aa1f7ec683349af8f2b90575bd1048a9a85d62c85cf0952af592d21d1e49481d1cf194dd44d492ae2075615e7e164ea2970bc82360b556806492916f9702ecac82290c55fe51fd5b2f0f05929b74bdbf2bef396ae4664e52b56a16323e7b3e3306f83487673a069f3eb3f0687c80328d2d5a178082f20f104172e1957009eb31f0cac96de3d97a7c9421326ddd4da4851ca61439c3930c523d7123d1d246ba97ae1364b46883f698f833b168254cad7fca32d5046007e0fc98e342c52bac4cd94b2a8cb45484a3b2b3bbe188256755d2c17194629dbbd06912483dce73d4d1b2170194da0174e494fed534ab96e00fad8ee0b695b0b26ec2f43413ac2395088c419ee366cee7f87b596a5fb0b95efdc61a14b289856d8dfc333dc5c2f22b751c7fc25baa1d66fa8680c5a7cc359f59ba03e09016bdd3fdea7f0bbb9568a4487291430e96619cc9a8686be9d0493b5d534b5de3df8453624568b2b45645a2dc6ff8014a1bfc650c40d1b212172330b16850601035283bdcb8f03f4420659c7fb5533e458498dedf8114f6ea2b3e36be28d07b3f948a8f49b7c9120b56ece853a9f9f6f2ed82b29bcd9d3a94bced4581b3e8c257e159c22d95d7df7b48dcb932d9f9878898db8dcf88d9c087d1780e7b46f5fe9b43f48ca236125bc6e08f9ba64b69344190612b53a84b2a11ba15736f1f25480916e5641f632ad002d5124b4bd780dddb291f96e22b2b33a4f547de4b2eeee6eee573646f6bb8a567fe0b37509e82f735e666d94e942e62b3fd2a6944ec89e171224482b915a91f3b54054a2adcd408c00d66b41778aa297a6615d7a3f661265b035f19417116e2d0842a1b4ae99b5796ca23d9e2814bd7e6feb4d72f1a47f471cd57804675f0eb0b20e12eb1bdfe1c647c70175fa448a0560b4a17932342588e3253440816037696712b66865bab0afd171abe368c0d02a9171e5ad3bd895d78451f3aedc9811c6f6014cc6832f12e45a945d885d9e67509b4f3a7bf1dc1b18f892207b752b9b7b6e170c1fc75d06589245df45f8f190148255815b6d56d331e92f9807bf6a917cc75d903a3f6cbaaccb95292b53a318e2eb0e5bfca2b0d67eb1d30145009fd6c792f176b8bee444904610e6b42a5103a6ff4818d179f67222e8f3cc4ce81dab8c6a7a81bc7b5b20c4c8339c684aea0d2d5132c51da79efdd36eb9e5dbb0e0260e64c8a87e60b80371d4ba5073ae4263f15f669ae659cbae7019f7ed3b58222787eb73c4d24798bcaa62af38fa1f89f7a1a509caa18eaa7429145b735862ba697b312d675ef84c91c4646955f139fb68fecc5aea00b0758096678b4c10d2d816b68a38e8370c2386faa8a07c8c0259995e6e101b5322a783944ef113b848e395fce916960601c41ad7f62b94a3d5c9d086c8c4e29ba4782c11314568ed1af56c64297f5333245f058ff960677fd4ad672193b2f1e6aee3116c44be95abaab085916d2a5b2c5e56570aece69ade63397cb857a2260d6e344245ff7bd804145ba08a13e4226da89dcd4c0417bf1d0b83d66bc91cc76fb753c9dedf50a53f97d77c8351c7ef9fa876ab13a0aa37ee0dcd2a55f7b9a138bcbc70c1573a2b00af4a34269414626f80a222c6bc21ba05f2bfcf97a35dc74da9aa2c36b11f8e036e1392ad2dd74b724e9e68b9cb566f5362515c31461a547b63d6374beafb4bb5621892fad55373bd6a8a7a209d27a5879e31a208b1fc707a9af0cd957144850317734e2b633707e8e100bc5fa2e976e99bf4776a7887d4026fbc871773809666482240ed4598cc7f4a122f09c59958f598e212755b41dffa4f613b8c9605a1e4e927272797f727369195a7f764cd430f35051d5eb3c2a729552259166e1885a877d9c8b25875d0072ad3c25c14d08eb9ae3045f666e0ff0249eedd9d8ff4959f9345ba99918bafa8666a35f5062e60c993d2a5131568415f8649cf86f039dfafaf4c189101ed3525f0003c064eff94e42422882124f7481057e7cfe8744447ebfae088cc45db8eae322f87fbc9c7d4c7c4900c1bec8d02790e6e9a4c273f7ed00c0d4a5ac1c3dea663b0577e5725d4cb481eef014c3cabccd27deea069d865c3d6a090b2a8703ed712c4f352308493c57811263707734d274669f89a6a994ad58069a75b690ae8eb780c26e3c03cafd9bc59e0820d6c912c298989c51a5a9928d1a34effa694846841ef3e522a34608920c104e23655e303a5e156366a1887e37bb89411faa108f361192a1d5cca1e12a20da62c425aa8fefecbc98830afbef044fd6c58f0ee232431c28907710664bf0e3eb413c34a369878c9136b7f799d7117861cbad136e3230bd7e5388194d73801435072b83880da40df8fdc3b2c7f8580e90c625fef538c307d5150509c75d387c1bdceb9e3b59ff496f28bdedebdb9cd824ccdfc700eb00290c89385e2e1cc18fdd87d5568e32e3db0931a2dceaa2980bbbd74473dfe33d3b09010d6cc4f8638e22350a613b1fa94164a1081e6637a64cb30b8d78784dfc0aaf353712860d376efcc30108742b50e2364e5fca5230824539c6ed5344c48651250a427eaf4aa85edda3ce35a940d94806ce402f72c18e3e65b23701d18bfe45de13cc4294dc86f0d1196e930c953a9979f4956d62a7ee5e45bbbd837ede7d15e2d07e87c667a7459246ab6c6824ff4e5a44d7eccf2c172ee669647188ae788c4918d23d24b4db41b7e0f0b7d11d94e57aad85cf5ea84c59b8082c1f3b20d51bac9799f6b85d6475de715d81d580e2472bdf7b707d710816b8bed267c95d6931e6bf82091ed30b3fe866c68a0736f1164d98b7d3704ef0d2e9aada444f78f43f89ad5006d4108c5671ce0b7def1aafcd8c1a650c04bed4418bd488e079d720024ea6aab98047efca642cb1feb244293333307b359077ad1bef288fae70d79da99eb4e291d0bce2061c98a26f70c97334690a2d31f28466e3ff880f185b3e3df14db2a51f72e1ed24556aca3a1f3b32d5648b3c0a9b34ca52a0137a284e5edc42f02147dfeea68dcf62a7ef2942acc5aa7c1eae9c88368a8e3578f2d4cc2973e9154cdde8919d735254bbcbc53dceec3c97092145fb59ccb384f646ff7d7e32890a5006e0bde96cbd6bfc9ea88f07addab05c68ee90abb14a1c9cc7c4baa7474c14905b062687b580f08d08a7543a4f1a40106b3b22eecc3b4a1c4ce902eb1afcedf4012d221ea34633aea2ebdf3dcbe8dd840cd49ffeafc38874f3d45bee45f009b5ed1394b879554bd94c36f90061e47a246e9520662f45d09cebc46750ac900332839344b6ffc8adc5afc20fb9323586ee22aaeff8ec931c954d1223359e326f14e8e0f4dacb8460bd8682780eb7a0f7d4f74dc53ff3b1c7e258e58edd4db6df29361f1280140f4bdc9f4648e5398256877412a5668f730acf79791d11d11b07623de8b0c7cc8c9db5f33ea94f0994f1a8d0d2a52c0608e0bff66baa91111e754c1d0083cf44b99cdbd3e0c853b1959c72fa137e5418ffefc767bbc5f1fbafe0a6a061ab8e9c83e711736c4113aa8c049099265415bc9373a74058f84f9b8d5dc3e85e92633443af6912abd890078c3f4e8d44b98c7a48f73c3f406b92636e16ae52992634c663b6088634a9fdecd8186fe24b4ffdadc9186ce7ab26443d9401a59a3ef1fed885561612a6fe8215d957d05c9d4c83804562b386c33839ac62ea4d1ee27922451e522bfee81e5236d0686501a7a5e978a49365939e9c25a2d1b6f4edf272131e7d3a13dc96094b2c44cb1c627527a73ac68e053c71225d0daf3f5672e5eab4354a41ea4890035109f0c382d28b0b78d05c43f360b485617262423b5eb43640377161e6cf71db5f454639aebc021a3d0e3956248c12096b45918e143c8f803a1b5198b4d45142969e8c9f3ab2b095c346870fae99dd70c237479c12b482674f526942e32f8bf9c11eb983a6cbdda7737a5f15653fc6255c559733dd8ab2440de0929af942a38c01c261e8967d39679370df163853d79bafab2b74061a28a48c1adefdeacb48c763bc955df734ee45c875f71b0c39f8eaf072332f131e35877ea3ccf40bb20d09ec3ef1041514d0e2128fc9df35f63523cb4e9db6db064f6100d94339a93cf0f5d9fd67cce934a0f6ddef0456fbc9e2c6e6e8635c0db5aa7601e4f46e4864d1b6aa6b438d211c80a77a50a8f75aa41a42e9603639041987850717110cdf7ef0c56ede93ee444447c692f3840f77e814475e707ab25133d11820a71c783cc679217cde58f11bab413459325a41d147038b9c2a8d1e6bb07c63cb710b8a5945ad8372e8445e05352da5a7289bbf749e10db6a821f1ed17ef50da9fc110469786f1ec42aed12ab7d4055ffb9b740f96786874506cfe6cca4127d67e0745f04303db87dd05eaf3579a2bb846000cd53df45aa46820237ea10c372a71497769ef1439770815efb22c98abe53fc7790ae0309b437da44b0074f47446a1c31e4c6b2b0b53865cce31c5ce692722b578a99c83aca663c19bae3354dc3e0e646488dd9d79cb8ed49c31cc51f30133886a23de1b36db6ed903cb672637b8ff7ac44c1316e0f2533acb7c78da1713df1411550e154194ff5b9a1f9dd02192d4c54e359c9e20327d6185234179cf7be2945de302244917535c231847ce6ce3534bfc3b2f5c3b1c25eb49d7735753855eb6ba4cf77279d8349b58411359a597bb688154a711c1427afcba6584d43448b810d033e69fe9fca0b0f4a25c2e259998a0f5ddf971aa1340161760949af3161da3bffa9e2f2074baa88e2c31994240d4fb1c16a073f3333852072fdbd6174cef0df7e00dc02368bd0132167cdad2d970a355cd00ba2509fae6a3e895162094a6c87d1e0263b27e11d742aec51ca3d24b412008b5db5c305bf337d1384d2a996d55239b5bc1398cca4e030dd4721b45e510d95fa72defea9857eed6c9bc94f28437ebf20902d04b6c7460822849c1d01a2d2f1668794a901aaa60a92f503183079f8af0b5b9251b4ed74ce2b104691d891b064e943ece418b513225866ede2f84ee57949ba0e74ce7638f1938f78522657d0acbf4223b48ec74649d1a1c9f5035d178f6fbaba9de4e5d411b96b785d310c543c52595c865bb5b047374669773353b364da05da834048433e3a642ee09b6b4f993196354fd17fad8e80e4e5bef63f0b9a948b0c99a02b85b883c104397b966cb10836ed71ddb2ad417274df520246a2214092e81682d7c41be829ff276b76c812351e131d3d30bb5fbebfc2944b521b5273e9c17f5000246f3a740218ae7fbb51ec5e7967410f0370fe77eb59fa5145c2d29dc37aad3dd8fe3faedf0856fd9a6ea815f50481bf8452f2ecbc8f20d81c843eca53fb463e935840ecd83ebe2400d5862ee85e46881c188ab2f66a38a0bb5d84f195e20d8f341820d7822852f62302502a07f34f956da013ab86c6b28aff31543256d82ba351de702eed61b67727712efd3727c0c1eb608bb802d7d7a28d2269cd7cc3712e9d5341af0a10691d03837797f5430f271a849c33353524755c5cfa9c12b43a67010b55d3beef214e508bd157dd2129422582a55d51d475d47c259d4b77929c9c926845bf7903cf46c0a5fce344f33ffd2d56d8f03d503c9a73e92f2f762ebd9ec648a9f7eeffbde984f384ef155287b8bc5ee89f3b8f266b5c867ffb05cd2ce67c77d72ec7c31a5de4b2b580cebb1330d4c192b75db6cf3158a10f20bde986570976cffc3d9bb805e4ea3cdb2f3b1cce59f3680d0b9bd56d07e91f3420b1a46f5cd03df57791aec25758a080243dbf12027d7ec1f3f48cf5fb383c85074eb05ef250d83e486bc2e876a9a20db890a53fc92edf12225b2f435278118c295accd40df7db502392b9627a27b4ad9f075bd43a4a1d8ea9e085c8252ec7bd1e847d2361f33c8a4e793bd959eca8e86312c4ec09246c16cfd24061de3fa71abb6d725941f53d9e95ae50bbd1074f3eb60df802cfffbbfaf0895ce2904304700ad7acbfd927bf578e409dcfe6fe09a061657e9e8b4efa362e89c8d33155bc4a8e0afb7855ac7da70aeaae4ed420f25acc434ee220f8a8aab0828e42619639a1bcdda3eb1d0ab81bcd4ffc30727271f31968898d65e2e0513a9a4fa83e7da0f13fc801beb2194b1861a370be0f0a9fb4c7974ea65a1cb330764290e3a53fe76713ba5836406c7ddda7624b028cc555d84e5ae1bc8c205466e4745298d1a3770324fa7504f880959ffc42ad579bbf6df472c412fd626823754315336ef99d56fbe8c2e6feb798937bd564e93561eaf904f633fc9bcc42923c827e3ac5c34bc67e8b1019c571ead34b2149edb7c148c2d03a65f31c051d74974da04487b60677c615de5103b833c069a468867a1cc7aa56607b007bedf71f481232e9720029168823d481254bfcb0b684904a41c91a939657c06489568b74c6e8494cfb6f739762cf4e7c375215a2e06b48cd2093b0d6e07f2c01f73da1bb786a74346ee3599494fb9b40dadb3967ffbdb4f24444ee447f3d05c1266c4234e14b66606aa5006dbf8524573e0f76986507e6b80081d2dbe791cdfa01a541509b338e2f86df9b717a74776b26bb6afe59766710a05ca2600f5ea612f6dbc1aa0e6c61a14e92441804cfe7dc4067ad0d1b6937f227e9e14dc6b8199e7c83ff2409fde1414e328f1c1a0210fc8d26916dbb5a2f3c2185070a3f3c9303bd70ef7a6a2bbacc652e98f63615678963dde51a0102ce854cdbb20b6051be55557eecca3ca0589e366590874830235b15c797ecc66f8e1ca7c742e105fb2ac7f852424b1186d7c3dbbdd2dd2f3fad6c8afbdbdf979078b5ddc3874198d44582997bda7b2406977afbaf1e6b9c2b3d6e302b8b037d5be456c838c967c6b9b9ec93f9a681d091a77443d5a17b11958a0605b781cd97ec3954375dc731181cabc7fc6384f1340f559605e0c60a55d8bb8430659c1cd68df11d1036915cab1a9e6d7453c4755ca2b44479a75493ac35c09890ce69bc3065b567ce157586956cd6973e3b8bf8fe3839dd1b3ebdbb7f49df296d1ba8de5744f58e6834b37a862b8cfc1bd94e4b955927b913e5283f256286194273f07cdc633372f3d227ace7e36385ad83127b66cf5477fd8010de5d1537b2bc34c5fac12b81411833af3cd812cbddbab0284b34acba2c342a1c430c1d385aaf4203a21abdd28774512e9b0230fa7e569e9f8eae33b6a96b9eec9e433a72e6718ed5377d9da89391ceb6d781e8ef85a54c2f5b02e6d9ae94fbbbd0c758cbe36b4bace85acf6921ff3980155cc36c21a4d5c1c1519dfc2666cf26caed26ff69c34c86bc4b670dd31c8617e72b157a3dcd81919ecd769352ffce37436cb55eb07ef972fbc86238e30cb032655203a39ea8f56e3eb78e256f0c87ecfa0e17f631ac7f325b33ed27039ed1d73b9ba0d378f64c31c149ec78e8e9f2a6bdd7d29ff439305f86eaf6c6fd3dc6f61e89f7e675c88dbc2d98db1a65b19675029569b4bcaceb4f6865ee5054365ac45ae2bd287392bb0c677e834a6f74dae4bf48d9348e632e457edae613438c2b9e009b80f9fbfdeb013265713465278d636f0d196deaee4019dfbd6f4cb89979316b3a70278f449f1afda47ef854dc2e6728e1cc0bb555ed4141e71589a8da0881b03551aa67b2d926904e0ff8caa31e4202e44db0d107ccb6b65453e03a6367cb98b2ff9676274c4b49266413c857f0ff748f11198dc5311f96958651a613020285dbb476df844868297326b3bc21607b7bcd2b809f09c4d4cc6c92572f12ef9eeb6199525093c3ba0bbbb5b60f8cbe3c65e5195fbf7caedf07f4d091ee4e4ef42686bbf13a6c491fbbc1f1d2b484936a3ab3500b62db2de7c59bb77164daff612380f66c3b3220bb1ed3a1eef1fc8becdd5e2cd39b8a1298e851048b35c465151832fbc3e7f50d91df698f4d0c2b39c7151b5599796a2fbfba04ad9f986085b786af2f19ae7d1e63b694f46fd546405178150cc84423b6b7dd6a93c2812838cdf758383cee0f9f622a37dd1bd420378dd2b04d201f5d99d0f7412aaf5a609e79846342fdd91d204fe2d55fd3645e91a3b81112354418d5983c259a0695fa004de5e6b8960588eb4bba32eb8df1f13b38328e665a2c35ccc5b3af9323bcbed8954d21caa12c7f46fc7821a00bbc611c3a5d914f478ad7aca9f20ec6a094073d4e1f33ba518cad1a30e7bd9eeba92ecc01414bea1101814facaf25f146c0607a96b18329ae2e32d501e81694a39d4ded120fab44473715c62d078c0e9250fbfae9c38b251d7b445cb5764514da2f4f3cfc9df36fc366b7385aa2948805a9f1fb2d1a1b2290b281cb2f66f63dfc7220911631e33cc1df112b7f09ec3d2a8dba8a803837652a30b9afeab85238f4739b08de706eeeb96762829b3cf8c7baa52d61fc28f853e74e868b31c2d69c211a1c81663ed74362210ae5ad7a1921b2a8b417c214de270c19adcb13ebbb5c7d1413b0308e7f8206ea45b31c054e784cb1d927426ab5d5368b806569dcfc811217aa99864a9256c5b00c945e58d5189c395a5112055adfa0e551a20940229288efeb9d2184405d3ca91b011705f5eb70910027fcb49cac063e858afbc2c0c556bedcef85c71d54eb68dc84dbbc1bb09cf1d22bcbecdedb09f7a33db2b1fe12701de60c56373305e2c6041e423cc0611df727a0186389eb0348383a866ff607aebe5aba9e7952f56abc32cff428ff94e4d6e153d7a2d774088bea021fb1ed93588a68a2f6e1d66e884e07e460e0f7651743d14e5cc0b4404ce3fdf7d4fb48d52611fb298192be1cd60a70bcaf4893965b07deb47cb7f3387ff62a93f396b0b726ffea1e79d23e92d39c8b83bbcebec2d86accdc42ecb08e1208fea49b96ea3ace8b1a2d23973b43c3af11af6ca9a1d1c940b4e216d27fca24b95a51f79583c8ff4ec19b3320c45965ed073691866de57712255c5e9ff9fe7dddfd6b22b400e806a4fe449b88b34fa2e155aaef3d20ff356f899b976a514f91bcd49336431efdae40a2ceedd2eedfce523e15f40817fea2ce1cbc89a9a8ee3cfe47fa624c81b47cdef97367d16b4ed853dae413a28fb7ce509207ec3610e99e2b6738c07609c05fe130123832f71438f09057745849b97cad917b9fe00c34d4509f672718ea17f1b881d82fff208e1b8abc7f33ceaf791919c4b6cca73cfb050023132059ffff5351f868c81c3054387c48c2d8db03119adb11eb31bec559e5ab4391d870f4c040c49110789c9e2f7a31eddc15162ea6f00fb12de473e53b4bd40e79cf43f56e56ddc3a3afea069edebfe3ed33b2a240fb74a6d4aac8a810d9ff43c54185be4b454dc74f68b5a06585ed793f8eddcb72432114d27c66cb075bd05c31e751a3ae38ec1c4c26e3928c58c65eabc2a8de87869d1fbf8e6f3ebdbad1b482be75abfcdb169e9c93ff7cee5981f290cbe7a32727edc0c79064b211dbc3c472428cef544bc7cfef416839e2a6517783c4a892cdbbdc0c386e8564f8e4d9d5c086ba284a5492e77804e1ef2b23f005e536b54dd13fc7fbfbf08d07dad72a710a811812cb6f742cbd3ca4c572fd9e9d91e8c6ef02bd143d050438dd1b8113b1bdbb6ab9d65fc644d44e0e5e13597b6f73a4f3d8913637c6ceadbeef2f3060bb0afa3e5c53d2ba4b96c870f3b4c2913c9f5299db2d88e8938927ab57a7c9b4f67674677d209d3cf4f45df881b42b674f6b0fc49ac43afe0fb1f093f327b56cb2c324c35f7efed09a209f0b9ef66b7cd5c4097c2b6f79177aa5a3fc27d9d5194136efd8839b97f50f85eb9e12ab6d7575d9bf69c1a6aa52f2852c75806a4ecd834d67d2203f8b6688455c809984dccb291a1d54072df02e48b34336ce67546d5af0da829732fa50779c93fe5ea8c3df85c08fdfa8bec69074251e424669b3b7916ec4f0d1538301d7fed12a4ced68606159db729e06242e9ec32020b06cf4c85fde7275f11a7cd3e3898f36e1434b6f134c761de33fb22a15abb6ab54f319fe5787b5ed9d7ac7b85ccc20b9a3bd4956e6bef1030c7aece39a58e0247346cf97df655d430b24be324aaa27aa33470e69fd9d9f188960c410f0f207339bff60f1c12b2e521d094301ed0ac9f1afa3100cb84d7957ec802998355bccaf20df1f78a541bf8865df94389443facc6b1cd3f0b26bb06668ec7c8bfa28b7a40dd2dc05d35feafa0164aace098e7751125f6bf42b66e889b3577889981a380d5fb111cc90584d3f0fd8f4051940be82748fe295451d36b5c4bfc60b3eab5162855fc512d293ec875e9ab6c4d66f2ea91bce7483bdbfd0188f85dcae69196b05cc46bfc0e14a47cb15dc5e38c44c4af57b0babd568e9a22e7372db49df8d300f39b0dbcfc9f51f792bf3c4485290ef155cf6f11bb5928d987bd54ff78987fdaabcbd6f7f5b58e73f5f876bf9e2fcc523e953bedc73817fddca565b3dbebda565dffdf035d02506c76fb494243daa7e7c1826292a1fd9d94115fbb5a73af281b0bf258d5ec8e5196943329a45406c610b25f7d411588cce814696e50f199232f449268eead939535576dcd76729ba426aceb55b38a944c97051a6f0704a5321e85ea2a1a9bb977002af7c33977c5ad37c97ddd8ba570d3728886176ff26d1174f2c56ff152d6630d81f32b3558112e0e1f2fef9c0f6d56d884ac0464aeea6873016f76b36e7f33a2574f6a6f72c7880b5fdc9dfebdac6dd7f3cc375c267106b45408b83f52a7b860e608537131ccf1e7e4fc35dd6544ecec4cb3386fd51bc41823027fcc65bfb23a9db783260d4ff528e72ee08f5448280cfe87113c349046066e4b0b3145421eaf244e9ed66b8b98485a1feef80f7f9a2fe554c44bc221c41906d00eb61305caf39381797111a2e8ef2578a34042974ae2b91eeaa3436f3d8a2160caf2eea2d93f3cd0d531150d5b79f8c1669a8d07cbab5cca815c8930480ee8065d93ae92fdd85a459a7e0ffe43d704bceeef08f2a9cbd23b72ab8c06ba83d3cfc69482d2cf789021ed926b0c48003d3c4c760acb93c5ee3127876b6066337d423562f5ce0c3cf84b7952ec9f6de24cd0708f453b3a866b3d90a1357993ac968498f7bd6e62a8430474658659019bb3f0c51b29eb5418ed04c261480b63aadae1a9fcec69e28fdcc1fe42d3229b0728a49021c97135d12a16fd870dccec6a8a9c37daef55b95838732a5a195e8c1eb2af6ee9de7cf0f67e39fd88f57f47deb5193c77393cbdb80f740b8878ed7d84af8540601656f7d6aa63a35cba4780bd6d94d724b47382489e217ee411eac49adeeadd51ee3e9453e3ccb14a107e38eb2ce658096d7bbb25f4944b1ff35f8ac166ae02e02c3c612295865578a614bfac76102072c4479ea547daf3570bcb3e074c2c0731efb2f339b0971f064f89d12170d708aafc1a63352ae21956d4eb5af8b5257ccf2e17d8b974521b6954dd3e21e6e63dc531f80ab46c59659e092ab746e8713c52b81713119fcf05c28cdb36d34cf04f9c24efb9c39490d19928dfea17363a6f39e979bbd99935e7c7155abcfc512096274084614493434a6773cba0048cf0dd4f57527b6c17ea873104852c1d168eb4e673de7e43da5a06cf2ea360869aef6fd84b63c83e5fcb5f3bfba18d75d6003a8615a7d22751727a1541ec82bc93737fc74cf1500d96e003bc9f70392685afe1b36fe60b603aa2afd0d38f571390e80ded1fb64a24d97677e48cc5848d6c46165767d45eafa6819544cce4796c249c76a5890f08c9580723d0b9af3a33e90f70ec9b86629d57bd6419826d2783ecf6b987308aec5bfc280a53fec1052a974cd5ba207a0acd06c35bfb3b1e9cd8dfdd46546f3305c0e8af9c075eb3a42d7b5acdfc4c0ff90ed42420aa434f3b19b5f5c23ef0d8c8a0b0fc7520860816eb05ecc65875e3e05dbd018a9e6c8a00f0ee0826bfdfdac58cdcb7cce1bb890e01ad63a6d1d0ef7af97e95ea354bde69a94ffd1b48a757060b48c6d0af0019174eb159135e5f4691dea3cc3ab14f0e311d053b6432660f0e65bcc744ac6942eef590217bb2b262ebb488e080144c08f0ab353f2e7df61680289dc541b561d3776a25bd95785d43c6c0e829b39cceb828fbae08564d37a4c80ea480be6dad9cde8c30e9fd1ca207b8e98074ea94f566d696695ed137030345eb29e4926813e1851c86593b63adde3162c6b4fb770486ad106eedccb8908c3697e035e0833e645b9a2a0d8cc12d093e3e48f07de459cb6ecf91f61444680137be2c564d486fa7327147bcf5e35bae13e4d13e67426ac3ba500ea65120a57b50a679702f3e24aed82d777d802f2f01acacf70bd842c1d82c4b9bef68ad50328f9d4c8b4314d96ca076374fbb4e404e8b8778811aad7de0c0a969c4c636171569bd5747e90d2cca245b3c56ec47c5c21b5ef28b6b23b5a504d2862460b6795e2aefc87132016ce82d944b0ca85a5f3d766f3dbb2917ef8d4495ce8a83a103e9f5a2f3a50f1e15a3a25cb44d2a4ebfc03ae593eed5b0e7c256c2e4021fd9056bdcad2a5b24522fcec3ec1f17a5a121ba25cb8e63fda5dafe5fc27f2ad203e25d0b70a3729a80983e791e4c7aff4d3681475bb64acf0da1e4d053191ec960052a2223fa1be3ab3cb875fe16cd7e5cb3c66c8f53042ca0bb06839d03c16d7343c8063f00d9ffb0b4093ffb8c01040963c5acd2808187dcef78e3e2cb4c4b375509a9570fd2e0cfa7414a8129ecb639de5d23032d59dd82e5012a166bb40289b0a33b65c162fc5d965d3e6b527e65302a76e9000a57f1f588bc0abaa29cf7697991665d17b454cc013c811173f781e97ef4f15ec51e7efc9e6f4975552c096807f3fa092d7b98563021ede2f3731e7a5bd4a35b9df9a425a382d3034916ac2fe6406254e02a2c2b66d8f22110b59508ec318c50e9afc71203f7a917d8f05289cba6659b200996215e9dac8060bffee1fa2f0515b87689f27897260315cc06cd4fd38e8557994eb10ab87947f373457860cf582399b1d4c66c3e67c1a89a16e9ec8d492e3db3e7d57e9cef1a35a176b39dad4601e7d0f86e9951c2551ab03ec0e5a25bc10c29e5fed73ed51858608586d2757ff152c899b459ec8a92fdd708048a02ae2e01754493e0e40e9abec284b6a137d233411ba592e00822111632164b6b2b7cd81355111a259e6a6c8fe7d566bdf3ae8f865735e15b1743a431e24d55a1efe7a3c20efb45d55fd1ce7664a78712042abc54fe28aadd4b891bb5aca8c415727d69b148ac530c863996fcc16516505a52c17a2fb371a3cf9e29e8f7a266e531eb757d8441b5ac3d0cf0c7f4a608075d755d445ea05b0a9be7c3941840cf52e34de10dd25d3e0eb1dc2a3f9c49e2473f3ac825bb5824f1a71c365ce6948c0af0dde04f4ce638b077ead7e4fc8020e24f8f9c48efbc4745ba709d869185681937ebaa29e2e502d7178032f770866238c5777a104d3661a4619794ade199073b3a04505771c314c3ffb1a30855e9c2237fb4ac52954a59c44f9d751f10d4191e98b71b7ccfa3b0198a35c93d0e9a3119be5edaab24ccf13ea910b863ac89ab20454dbf42e8bd3d149d3d634e7fa34ebd6a57878608123a103ad2e7bd138d5b2e40d490f6c5447aa399f2f02fcbec199e9abc4b727308c66ab44c174ba39faf51908c1f78293c407473f32671a35a010d4e4d37a17b84560ad0803af4e03ad99bdc0b05caae9c6e941ce53b4275a1408be9501f4c136ae0ac790dae2c9df7253187a54ea71a527b1a4b740ff8037ff52172c3a56881f1120ebb9b5f39b7d85fde4a8e385ecc46981307a13c441d0c5504c04a24cacb6cc1da5b1bd0f9e311ed6b6f6e96e0016d7718c6a87733228cd3fd05d84adebcc15acd759425a71b6bdfb1d6243e86cd89be3328f1fad58a75ada473e12b757edb3dafa586dc85b9bfeae66b8eb275f561f67966be86d55bd3b28cfa17ab320ce184aec8db9bac37185bc39a0fc500e1bbc7a8fd97743d467816a948c0322da96f71bc4fa21b6a3725445b71ff7f6342fe81c5d8f25dc748b6a5bdcb52d0aca899dfab8941953bb6456c288212e1fa1c21c26bb2769a1436af53235bd7d7f0acde4e433194d069e26bdf8136567bb3600d06334ec2e003658f9595727a2ed38fbd94dcd37e1ecc08f0e5b8ffe806d0c319fdf616a76c6040f26130fd76313dd72fb2fddb7ec792a5b795837e5fe7c819d67ee7797dbe035db219d019915bb59e85989690ec66e31e061e0d365882bac7b8463ecd8a5619119998c15b57fe634b17d733b098d6fb5bb24f4a2481a0460664d93a5b45bddb5b137cbc2f404802ef42c13933666d9346bb821216f36eedebeee68915b089ecdf1467ca4bb2ef7efc9a65bc08b04f3965b7cfc4db7a9ac58b4ed212b8506b95ef32a93953d2a79c8d67ad37eff9ab4d82751056d9d7e92e927efe967dba596c49007c46e60b39b964b47da9b511503df3f9fd96603bbe683bbdc7d77c35fa14b9627f4f970dbcf39fc67eb8623bebde977d2c646bcbddd4c7b90a32780557103286132146bc4d71683b9ef3b55254c7a4cba6d7998f6afbbf2e3153afa9bf777c269b40b2776fd3e210edcc635df649a3798c90d9faf4e58761fd6d9fdce98251c682f725f99cff7adb300b35cf821c0f16b8c23dd81dfa3f72891dce799d5133bc2150ca379877944d2e9934b772bc2ad3ee04749f6d762f6deed554d7e420590ee189cf7e9a67fbe643f1a556fe26e3f228345e35e6154c0e04ca2e7116db3f5a992f362c663b0d61f5a0795853b9d405f2b69ec5cdd7c26e75ac9ff09936f8b434fbd6c74f4fe621f64f678c518390527319b759161e6233cd4a96b31eea67fddee07dc606f23e8ff850383d5595b971ec01f2cdb2ae30cccc6bc9ce0951ae407ca9968d87f44af0b238e0952911d92f24e3dcff2b4c26fa92bfdc083c0beb1e18fe6e90cacbc1e237f5e08ea9851f2bbf073cdbf1b9354c1f8df33dda1c6ff7021df8b490a26ffb70c3d2a599ef3ef9f7a9f7f8ff5993f3cd37972396f2685b85e60fdff31839046f02e078ac0759b528431403376f0a9d1d318f042f372f4165d6711dbf57c84848005481a6195f13de6df4e801b424d634d336a741e4564a82c4989a1bc1b63aaedd924c1d95a1bd20e84cda23b5d5a5b5293070d84c27663749a17fd80271ce3c893abcbee385d7ca97e83f1555e24b134f3507a16f2359039cc619201735406dc412518084a46d15233c55a0c67dbd7bc7e708007b7f1da4a20c87f8d2549e961ad0e0b4eb60e3f24fa08ab06bd88812318c65ef1211cea73c2a8e6e7466b8cfe0f087a46a07daaff4ecd4fdc018bbde1946a01538def08d2045f60ae09d5a41b5b52eeb66c060fcf3c32ba4dafdee511098bfbcc7383825b1e7998b9a5de36493bc84d2cf9ef569413a325ccff067e7d2c7ec819d3b0bc43b3107190fcbbf57397dc549f1eaf7f39afd4215ff71d32aebcbda4b01d598673c8ad647233b6ec8e8aa409c7a9236b154f2320e6bbe13a4dce7e57615f2b3fe32d6bff61e4a2fdb1865f71acf57e3c900d1eb0de6ebbca04b81d6850da99ee7e20999692a76980f338a5e05fdb8183f2b9312092b302e3fc30a9729f71ec3a3030ceed3034d2d54d0ad0b93cd642bde334628b317c09f755b4b63fb13a2790336c2543b4bbeeafe35b5f3e58e6230d1140c461bd33ae5725b03f6e9d3131eac2e543e425a75ee63de630392146a69a958774687da64512aa014e95011cfb5cb2e1c23dc97c577f3d5822afaf249cbc72d362c129c49a15b32b24bc07e606f7c0f59721e5dc208ad1e34fff00646c12c6dbe51ae668861983772fff14da2735ae412788bf29252ec274ff30479e593a594da7211d4e9b7eba0243f0298bfc7d699ecf5006fe89efb22d5433a6a24dd8f729ae3d02933fa4e116cf4416d3ff1c1aa7ec39494aba7ebec675a9e6b6cff3c5c51b163dea5d3e8f510311784af1e0771a516673c80e46bbd9df4fd82c903c43da60a04d8dc56f7cc70637aca532eed72f9356f833f3e6f6eeeea4d8155d262dbcba8fe08f9066411be0962bc21868107b82fd251bf29d0ebacc754201ad5b5f5ec56714f05b5c9a3b0ef1fd051e61eb347f611fc3ae44ec312a16e1a1d630000d51751f8b02b43303e075507ad06fe13eb683fb57adfc854722f880fa03d4f41f7aa4a47b90ed4426e7f7d994b6954d4a0edd9efc83e51296967b51680bb6ab178a1a0bf1da407b5e362159d9a52bffed461f183724aaf7b74dbeef5b14a167322fface4a04129ed15595c969b59df05cb487ec4239dbb4b09e15e85f65d5db25e89f0019ab772ac8a76f5ca7cf903657958a8f9f89dd03c4ad99427084a51dd7e978bf31c11e6430c7b7435f704565b772ca7d58a93eaa9d4420d9bfb3f0bbc583cac1c681581ce7c1597566804ee7ab9636bdf114a0bb29f95367f34b4d9302a18433b62684191f452f046ffeb323b5f3ef61d3caed9e492bdd839c9e19ff7c28059a83969132a79df7b0a8505c6b27483c35d5b9ca8dbc32a56554d5a6e662153ff59696df09deb1371c4c2f201e05356f35821a09abb047ede0e1e80f106ff81b61c0a2d5299a4dce33864fd5c3b5ba9a4031d4cb07eb5be394c012898e38ea9949ed6a6ae1b3e4b2b3c89bac2a671d9bfee37fe9fd4903288995a8ebe6996f2e8e1be18d98534f9033d307a94e87bdca35b0bcede67f5839b13d0c53f59727e2ff430e99809c0dadce7945148112dae8b71542f9f93f7affbb1ec421a4cdafc5db230e1af549c8732538234ad536713c61d87c8235ed11271b5e88f94c0d326c7b1cafd2be945c1e3fc85f5e35fbe5dfd4670ab01ace5fcabfce231c2aa1199e2d0ba09bc42bf6475a0bc5ea08270ba078dde3dfadb9b745eec51eddfe5cbc7d25610f8d1fb4e21d61e4c7209ea92e4a3377e8823a9db0462ecac81f4df6bb06ca7b4a07f4627c59ce30e45e49c61f6226061ca1dd7e02f63940dc09dfb2bfe0cb0e7a4ff381b1fe4ac80159d33aa19e3b469e3d0f9136562d8c0279cc6eebb7f7c8715fbd2b6bae51342731309ce0ac09b98cae7be6b719724f63dbdf0c4f43bdeda9d7063f6de3283013dce62254ec1b57bfaa3ba8808603e4b970c13f6a85a09fc094153d3d51dfe89d95298f1cc719eafa597d6bbcae6b61e500f6197ae733eb54c53eb75f895cdf56d837d8cc1400fa817d14f0b66150adfcd0a3ef24f7c0aef24532eeec4033fc8c64669f9b01a3d04eaf93e534d68a0319c2cce18cf3740721914cfe38c4e0e889aee8eb3250a521dbde68136cc9034962ecdacea2f9cb0c3d7fefa3ed30aa217df0a4b1b63d38e70672633ced5e9a034f54da27ccc671b3b4f4ff5f927cd09cd60ff91e70d324396776337e8f047672e4957f342d4b3de36fdc65cb7bd9c82f1e7c2c1b0d06ff847c8bcff3c8bce5c1f7257dc67b71a96577d6802c702753566fc78600210f1ac68809eef7202dc69ff618225fde24605493ff67af8ae75f30bf5c23992d7b1dfbf43b3e3a8ed4c2ccc624898d0fb3250468f518f161be345350190596af86fb92da70a442c7f253599d5c90ac720ce62e785488e39d7f5026cc3edd7963e8e3d145b668d280fb0b7b8b852a8d70095d5270ccfc971336740583ce225c6399d1c87cc5e2eb6d62d39e3de2f84f1b96974cf6dcdbab94bb0d9c5780e3d0a825f2eed3c90f2c67f1de47ab5dea585727c1ef5f7c55e76b348906cec53243ed9919d1742c7546573b0aea02b391df37df1e6f558ad68e645c68f933493112b1cb9ad764ef3f2cf54c93fb58a7fb0a8b3af3a0d507fb0522b7e0a18b70d771e551ff928cd0f3d2b8d7b3b7318b8a706c6d2ceb3f6fdbf7ebb1561e74fe27996f55ecf0995c04291576ab2e31e74d4109d0131b337d0b32952b346bf4b295ca2c11037e277432c4bc82473e58480b687e5d50cc1c2dab472e62706b7ddf12e7b33b985bd413e84645b32eb2d5f33dda972ceaa0d0b43bffa564c66bf63d35affa07a6faefda369975e40c32bdab297094260152ee3f7ec294bb1c0d40f7701f0c7b5a7ffabad8228c4b50ecc4fe01faa7449157c9ab452f8ee655dfa7796f7b281e362cdaf87ae527bc32ec19e000b5ad1b6498cfb6d94137e5355138514d228d3882d4337b6f0fffdde417dca605ce9f3aef5e8f2e4f5bedeb5bf7fdd28785e864c766c375e9372014db2f4f142354b7d936b3461e94a62a27863fea7b6c96a82e686cf5f584678313bae900cc72839a2cd596b97e9d9537e3a41bec98d3c8f4138d7c68d2d2b8776f51e32c88ae21c8e2cb47829801fa7b92adc2abfe808a043698e05e709f60a8246f734efdf59f23f7f51838cdf443379e1c7b7a06420b47caaa8c38c89169c934a32d975f3ae04f77ec28a789f95e42763e71c54b6bc9f5cdc1b13023938d50738d730ca5e3607a148f9a069cf9a9058c42bca5721c1633f7f07bc0cdd9ca38a49295eecca2c72442475947bb92197a7870378b601366d9ed7aae0c78793fdcee52cbd3f2d35f7322e12e688e290c56eb4a582a2d0b459510fd3422169135099b8a8582dbb8cc5617a9520f442342522908ca301c6a719c7228107dd6fea3f5d7450595e1e3d27d1a7868820159bc1c0064afe0976685a84523dbfb4565aec28657014ba195eeaedc8e7ad32dad8dcd205311f96f1b847781cbd82695c61f8fdaeb2ae24b5cb32118888e311b9c0cbece2e109ba3da5c52eefbeef5bbf7a7f559180bb998fff549d6109bba27196d1fa1fe2a6ed47fd5a8aed6b0febbe14c908ca72317b4e5d2b3abca33055a736eff60b8d459088eb85f31e6acf38a4c8d1f85691010141f1cb769e4bb93cd3ade7b3bad1125a3a4e1ea15a71a75a0d8aaf0dea0c8f11a9bc374fdbecd66243be190bc8a6a86f2c42dcea6e9f8ee253d112bd8206f9735b3616affcd374b5e607d3dd4c4d895fd479fd7d72752e24680c3dbfdcd94f42d8a3b55b679d15be8d2aa4397919e365744e7a377f84f2a2f3a464dfdc60a581af3e4cb084c5d651ab59d41e3b1d93f345c33a119ee708fb0b44af89885facbb7b1be83620500a5bb5f69f4f2f573993f78d7a31fd563e26cf1913035e3bb383ceb7391d1b68025813ddb4d9bab82f436ed09f106db14decfff9b59c3bbf06076fe725078f2518fb984089cd6efc40f067601812802beac1ee432967a10160cbb7d1126f19076811936476e55e35f9322ec621f557228de102258fe707f4fde92d654372846e49ca2ebefc6e3faedf7fa18c452f9767cbed51154c18b1cfd2533cf1b4b875bc4ad0bde0c7131c7b7728b221753700c931e1d67ebb93c695e775128d8b22d3b335a53863eb693c1bbd8646502f7a8ddc334405292413a8da47b96f2f8bfb49880588d6bee14332f7dc37fb22adb0acdb05b7fe457fa900a62493523450c872177a611593fdff8869d5b75a0a40deb0a27c4d43e0c7442485ea8fc17d0a44a10ea3ef0e9a109d0d6090223f4bdf624c0181b741149c833de721082d195b47afbcb8f7b800cb55b1e1e3416e86ac9fd853f4999706e1dc23e082966784a9dfb83ae27c7617683b7daad61aeb9c24c4eec95467160c44a7220ee2f16e8becea115410c7eadad6b13803ea4d6b4d323c39205e7254c8c47beef8ab816ed3f53f77703fce5959fa69ebda239ed0c14f27535f002eff721ef81ec73d747104eb0e8f55bc178a111a2e251fa15e854db6082203af4957d6240dfa2439043cd8013df2ff9a1e50cb6c9605a2832630a543246a9379a709a86fa56a1ea1976ee12e364a3a763c5c7a899288cd68ad0a9b7398b234668fa199901f28307b3ad31a88d6b91b684ecc346202ec7e4fb6af5659a05075fd2fd8453aec9ca26c8ba72493707772ee13ffbdbb6160d2a025cd0e79a0d30ae0a802c054c25fe18492ee93e3a40a04226fb388e2d69947caca3a2706be730c746b1c1b0e3278e34245a3001fff7cb62a290557f8ecf9390ec3704c7655965c5da8d7bd5a42ec22dda51a00fc3eabf60696893f452c1bdacc183c06cde822450eb411a59740e891f0f0b8bec2f969e47eca6a7af0f855b59a73d79da6d032dd754ae67fb5afaf7657dab90974a21bd06d0ff7f20a923d85ce718da8630ef0d1d98b0889110f7dd0517b0a57d1be53832d42792db46e42604dd6cca83c680b2ae63c95816c580e9be60641c59a01ff623b1a573f9366ae50ffc5b6806bcaf569a8277b7843dbd6a6a3f2426dc80702b23147534784802c85915bb00f24f21c33c1eab000eb7ada30d2d25af18bac4985e632277d6d068deb660fcdefda52c81381081b30095b3e6c0ac96191d692b3bd89418dc0ccbf286b35fc6145ff8b056557778fc0d4b20a4421991e4ebb33768acda99331b85f387bb3d0d8896af8a65b2352041bd83e656c16a805c112c3485678473fc8534707c57c605023da70723402711a51981ce099d2fd11bdb0be6b64e7cd1b657a0002c391ae2395a9b65b24ee123060ce5e9f152ec363004e33bce6112034128b95c5ee47b231069a093a25b4b76d963f7d871eab0970182b9ac3a3218cbce9f6fa74185c84e1f30ee6eec096b803cf654db6a714178ea26eadf30c08b174dcc101463e75f6721e3173828dddc6aa5bc859c4d8cc0b698b357988593c2343c52444a55614c167016ed9ccb24c2657c26b0c65291058baddf40b8e605289ccdb21982e6f43ee60951831f02caebdadae03bf64fd07768439ac27be7a34535109eab765334ccd0d297bc77b0201a34c2f4f156a8f27851ca78d8c91d13604cbad17ac332bab51941007f1aff452769c1313de03c695440b54df394b0289a469ff8aa1464c3322b0ef34aba69ca5adcfa3a10a522068dc5c43952aee49105aa922dafb25d050be000f2f5df9e7d8930423cd5c422ee62b207d995d02b6ad719862bfdf2af34e390cce6307bdca343f810cf4491b710898430f73beaaae11c07bc5862ca356e1d3bd38fd97c6754a44da4d70879f2e0321ab1b1ea64cb54987e93fd8791389ce91b66a39db665e88581158e1aa07d22ccd28d4b8eb28ca4e92d89661f5f472225efd0963d2aab810da40c89edb540466996c0c6d6ec38cafeae9f428b1d4824894673573ff7601327a0ed8e8d272f32db4a2dd2b0e94f79b2414a1e9dfada6f39b60c78ad2b54f4173abe059434740770629465488dca3420789a95093426022cb08427a745ea4f51ca526f3be1d71a8b256909b215876efaa3261c42d2c1a305407a2056e168beb70f9ef8b164e50e1850a5def5351a20ba16b41b24be833423366e273e082bc8a09c16b6d004d542979c42681d91fc38ddaf7593df9b0ab047aa334e2087c93b593b8e604d06717949d51cd0b183b17706d3270eca0d87e6de2e013d09e93e0c658224725a7de447f6ba0fa7a84314c87c89c7f3e5c15277e41d9fa4254c491e6e28e440b104075be9051e15b4c3dbe658623c213ffaf6e7fbf5e24bfe17ff637724e15bf896c41d32ff43a713b76596646fbb49eee909eabdab62dce0d24cd8014cf437734c816e853d8dfde6b5a6cbb7f989fb8119fdb0e8a3913763ec4da4f6a51e8fdbe3719f79c61f114b3efed7bfff7c262bffb65a2f9371b9d0be42eacf486e43fa0ff616dc5c29cbc64c0fc115cbc51f1ac60572fb17da735fbd5bb7d5bc4f5eb8824066e2db8797c5a2db0f335287b823087f06c1f3f37dd1d2f0f168bcd2f5c50189e2bcefebb9553e3dca5f0cfad31dd7e5e73cae5e003c7b0aea858f5cee1fc1da0fecfbdaf9b0c388f43dd943ffb32713648ed1caf822ceefc9ef21387001e9666d54f88a5d897e9a82c5287b072e4a3c5a99fe3669b67ae79dc00ed3801f5a5b973f6439d35a1d23d0c960802b156831521b5dbf001535fbeef5f0fd496a11ee6d362ada0efafb71a3598f133d8525ab3e50197724d4a8db08a76096ef2e9cef3fd1f12b47974d1aa43e6cfbb188b2eb1f840fa6f84e8bb84049659819f18942b8e3012e829df9864e95b06528fbdeee278f2f84337698fc119987b558d963deb1905598e720630557ace849190eda3467b2325d618e32b21ff9b7c29d39da53d0b5e18543a1bb08da6ccdc8708dc9d7737fa10418a332eb69ab4f4f5a4cdcc41583126de88447a041fa3cc46d7da3feaae5f4b6a97f1f6cde5b7ae6ce44dd9829dc34f4a519b11d380f419a179cdd29a2f3e07d236db249e1428ffda9d9efc507db7d9de26cccef2ee77d857210d7d1272059131f947acf063e38ee830670e1f4da74d718e5d371a6f49e34e0544aee6b6ea729c419cfb7d3d3e56244785f26874916585aacfa6ff0ea4c3313a00569d0e64c316e9e95bc209335e029ae8c8edfdff82cdfa014f90c87eaa568585adce0f7263a7334764d85d168e324ae9633f9ccc9a9b1f389e62700ef5b471b85264880edbf379c2e337e7fc9da46e5e84d8e293765f58e831a0ee51af436c3a884959a3ccec036ed5f832377be97466783e520fa8d7012595fc85d0b7b87a34264a62112cc1e78a4459a7dd79a9c681399e36fcd1c444a83031a9ff775feb26ae3f510489ef264b6f617321ffe6d99350e5929ee6e92692f09b8b998bd1f0b0128ca0925163892af02d998ec655df9920a639d2a1655d8e5559ca41005960dac0414ce1c0f032195f2c453d233b64fab3fa0b89c5cbc17f85517e0e98f2cf8e1d23da6d9e7cb8f38b14d9241b4317f85c8e83e48fe7fccc97af456397050b669fbf3d86ad4058acc9edfd9d5ad7e780712ace14f6a499984e247697b43ced370432aee0643cafb60943f649ad4fe29e88e02d703acbbdb577cd12492d0994b71a4156777935bd922b709cbdc1b9e858f6df23a88cfaacf920516d8f331d89388c0c0243b0dd1b35905926ae3e8e12556ca9b88f7fedb56976fd20d9a54cb7b90c1003b06a3d0be1bde4dfafce4ff60f4433ff7b1dc30a72b71d9f93e7e289fd17501d8f78954676a9d63bfe10eaa67f3810737d211647edbff5e54f74be80690e014e624ed273624f779d427acdcb0e41a48a3e3da5c2631530bed6f4fcaf0ed0b506c01821dcce8dc5e3c98fbca12121e93c35e82f3f1adc9994c135a9297bbca0178f44780a4327f651181f653644473d6e735990df62473cfbdb00b0f45a3e9c128ba0d5d27109bb760663771d690fdc04182036eecca9bd46c27ea06cc95eaf03b04e3be9894dc508111f1db586436f328ed64542136fd5a0b9445cbf5ba26f7bc0843e4256e36810cdae5a3566eb87a95f26da01ad2858dd970a462c69d7481bf3b195480c6d1331b8eedf57a604002ccbddada8b93c3dc51ee67b1f8176ee26071edb6bbe9368b2d23536453c05828056e1775dab0281bbab12b5bb214d429e40913bd23c343b63a4c9494d930dc0946b41e476465e5f4b6c5e575cca189d0ec0dc4f30e4bae6cb265ec0c40a7e358dac4669ab80961949057d4efcaaa1f598bf1aac38d8502313e4e9d6a92d4477d429f693c44f0e0f9790da658092242f9e5e17e00a00247b8849148788d45f2cd0c93d30422be13ff1b707557983fcc3e7c20994889d76cb3179d9b03cca83fac15f0ec055fe354ecf188ea76decba541723c3e03da5771f045f7ffed6eb1fab9adcdaef7fd3b38cb558fadd12ff1d7fbcedfa809053ad77978b4af7c60585d7b335bc2e915bbac9548ec66e1dbfbe3dc2b1e8c1599a79bed0a9c1aa4eb66b46fddbaea9ea3edb97ea29aaf4e78628eba36d448dc73283415dc11406300926639571fedd8148a09a87f10c167c1b527a9c37fb9b1e6bcf826b4086d6df0c0178e2124db423b028ed9bdf5e16075a7252d1f36e0c50d8542208659bb4aedbce98153844fa91e5b6c17b1c0334cf4dd3e8a7936ca5b24dc0773f3b0d12bd4da67970bb578201af9b301156200eabfb41f3580b46438f030c30c33cc30c30c33cc1a667c0edd482335899629a5a4ec08cf3244f53822654a52ca54195a45aafe9350aa8d8991fddf01e601df010cfd9f3d2415aa1e66cf8cb8720d39ecaccc94cd9742cab410ccb3d6b1b4cdbd2927420e6b45a92eb3dd6e9f41ae752d950e22f3c53d829cd7749a9a3a90cdf6aac8ea777c0c08cbfcc4d4871121a6fe40895b62d34d8cd2fdf86ced0a4f91a9aecc3ece3ba14ca7b921bce6831f3d2d3de9b4c478e10a9a3d9aeae377f4ecd71afa131a3d503195bad7fd16e2e47924dbc5be86709d1f6212347830c59fca71b1f4a2b92315afed1f74549fd36c475a44ca8a719dcfef9385a68e4dcafd8ea2b33057b6141a3a8e6a8909736522bd7538d0cc919748f962e8adb9a8c9b112dbe1eda57b146aa64013073a889de3865261faee073470a8457ffca03b9d7f5ebdb1a71b1fd6727db3ddc0d5562e3c96584345eda5a545c6dbe83bed285e2a1d313b7b770d1bed93b6b574175b2d5db07c095858b34663ac516a2dad337f6bd4583c994ef39634e532d6a4a198fab50aa93fbda3098d5ec4d851ae0979fb4567b0e56b0f1b37ad6eb83466ecb14f6d4815f78e4f089a32969527956de969a918040d194d3d1bd23d4df5e793069a3118b1e5749a17595eb3468ce4e830a5abd5aa964c5f38d08491a8196f5beeef623e1a302e13d939a99fef64eb14345fa0ebecdbc49bce556abcf05fbccaafa75e5a5a5280694ad305aea3def36871b1e62d978a63609f4c6d6b08351f4d1b18ced99e275767ed59e941d8bc7098cbdba95a4d1d5c6ae30236b7a6c3582b63abba6981597e1ff6295163db1b16bedd7ae63c4db55e3d46a6840a5661cccc3459e1a7a2942f2e30adb9c864b972410515a8c02d2d2e2868546955497dfb4c89d16a124193ca6ae5891da2db55abbe030d2aabd1f276ad2c797dd129787a8998ead5c7d6f545630af2f1d6989be12533d49472de1e5df26b46943c495998d6dd59a677987d9a51ae2567aab54399d23a1205312d5adf9aaf5f9f21d08492df8d3ffdabf6a93d4159b4eb7c3a99102296ce4b4b8b4b4b4b061044b0410616b4b4f83f16999e8940f3492ba3af4bcc583be49eb0f6e7b3c9acdcd0b34e18bd5a485317d7dbab2b3218683859aa50a2c6e82045a7cecb26aa7573133a4739353e8d269e8eba57d569ad626d65b2ddeeead049cc08df3159cad6d95cf598df092fd963bf676cfb513674961cd59d1c5b62f447672bd96eb470ade3b6f0a8a584a55a568b2957edb2210b349324a71e457fb621bbd424e1c5143696d822f1c4f2913d3bd7145e83a4577b23e3da5d6ff68fb46f9a88c89a3b82d023725c4d858d296e249952c7ae6bff2c2b33a2ca161d577abdcef15aa4fd33528d1bbf525ca548765e5adc8feaf68e4a049fd5be26c2c60e528b8836d7c68719039b2e543553a85335a79e2e17ce0dd1ba93b8e19efa660be54799caa53a8ff58c8c9511365a2463c26d44d46c8cd3268bf364a4b22d7acfd6160b6cb60a9b3a4cb1f332cbe60ac5583b9b96f73a996d63456ac28596a9d55e5c1e8b0a1f98b1a9a2b1e5d68ede72a966baa1222da43a936bbb83d05a9b2914a6bb6d8fc714433d1b29d6b95f7d75b62efd7e130527c58e7551594abede40d190d5e6326ee6ec7df3c4a63f3ff4a7bd72f9c689768554b1446795336f9ad085db1a4bde52e2451b2694263bdc566e266be89b25501f5ddda39a991f574aa4fb54e9385ea6733a49705e7a65acf55ac6bc90f0444f9fdaeed9de532f9b23fe8e7653d576d67bdfc60864a98fb7b3fa20755a37d814c11e5542ade526475ec78a071b223665bbb77e859707e566086fda9211eeb3f48d2a44d3de84f8ac782688d4b44f224a0dfbf310887638571de5a7fd90cbba1129cb9760e3c3fda91feef2950d7dd343fb62cbe87c53ba54f308363cb07c474f9872b5d4df1dd025e3b95fd81e3d221dbcefdad1a57d07dd620ea71b53af3d96ceecd8041b1c0eda76f29337f7a3363728627d56fa57c416e3b6b141157b647f84eb9ba3b380020edca68673b48b4fb9d2c7bcdbd080cbd9a67307a1cf4b3333206aed4c6b7553b9be645849191d26a57b020ba864408f01cc4b0414b8c2c03590520398000101a8c00c1c00409619133a1820801f819930c21566a50001664a7803400060ed5284e82f13b1e4ed45259ad0d212f325b89c00e32e0e337305264b096f05064b8c4c67b041e4c064719998430e4c162b2f33ccc5c5808d21c7c5a5804d2107264b092f33565c5c0cd8107260b29c00e326b8b818b019044b4c0b92e56702f9136462623e66b30144052c1df3319acd1f2ab145dd65a9157d9f0a367e30c6d297b6ce3ec56afbf05ddc29b50f5aba8f5e5a5a5caec85c99e1e3da2bc46fcebe738c9b3d945aa9d1ca3baf47b3e4473725de3f8cee1744b0c9433565eca87795f050d7b688f9ef20c4877774bac4d0592b1552bd961dedcc577f6eef775aade3a4d3ec34d653ed6d3a0e2da6ce9d6f4f4ace39d4f3f9b58bd27222928359d7aab373082d3c1707a3a3f4970ffb9dbf862335fa522c6553cef8f30d669cd6f6b394e8187283ff2ca62b5b2b62c46ba3135385e787f3d039d938aede1457eb6ec858d760bcb83cbd293d9fd2a9812c11f34a3fcfd6224e83f1939d9470a5d65dbd4163f9e2c62ad9a74789e9e60ce565bdb6c832198f9ab1be255dbf9dcd48112a43b1e24a4ca1cbc4ce44c629c4d25daf5b9bda313e4f6d4346dcd5a75d8c5fa7f969467489cfbec1268c5c97fdbff8b793a3635626d880f19cb6dd13e61ff667b9accd177ded972fcaf7e6ed36838d17ceabd152aa3fd737bb12817ba8810d21841042888010428863ad01a18484108690518a29087d12c871240b3210c42010c22010842084080831861081914811620c2355ed95beeac8c66904865b3dd3f3c027fcfb2350297fb8bfd44deae945af017c26ba93363fca94c1dc5f4ac50109cd1523a25e67cf29aab71190cedfd449948c77910c429763c3066bed805666de555694445e8d03e15750d99d386a18b3f1f4b6543d53ab5255dad47061fb30f8167db7942fed7f8416fd37f64bfc85b441460338d0d4b332d7a4d56b22c2b037a1f8976c8c090b265f2b9df373257c1b77517839655e3062014ab15f820eb2f47a91f96cd93cd9920444d5b119419306ef9446cbe4a0f76fdf18935868cb9ef05c46b42e6157e8409c3d1eaf22de3fd884f43d203d05d0c4e50d41061d1cb0561e43916f37e97ef586b60409ab21a447e6ff8a923ede7e0fcd9e3012e7bc332e4274f1484cb8dec288e4b4f9db87318d9098a02f0ab0be1bb0432b4a84937c10f097a414c96b33defac14ddecf1369ae93f133c16e60b5f99325009f65a6ae7546b92d93a4f3f79d71819582bda6f5239d149eee40d7d73cf52bfea3c3618799211b10624404f91ac63e4e277907f40ef8182918e063b503bf49b5e661f003ae18fec4081add49da4546105050e04329c71d1bf99f67e25ef02ce10d9a354720994a1dc15042c198a834621b416a48531c6693a9a5009c8cc1d458694613e22e3ed2e3e892e287dcbd98dca537104398b080354a40bdf300bba291322947512f68068a4c722066082806fe289ab0fe0e2a04eb201c998e674f99b37d2631f5b83eaada38fcfa24011ae8df7d3bbb39335f203170d5428645ad56c8ce418b513e4ca7e34c854133a930d4dfa241849f3489c51414c4f41acd8965e2a1c14598e02bd04a4d4c0cf69797de30450af8f23d750f3e2b343a9c09ec9e28d8d16839e7e3843140a28e7aad9f087c2d8f10f657532bb56bffa3b610368d398c463ed17136637370d17dda00ada9441c7ba13c3545c1c2ee4578978e77a0a7110cc23ceb650c970d4ccee298f2136b4dbcdd6713d1264ff04960a43b5bc7456545ca06efd10892cef8642c0f1b74081e0a90d924d9e9ac22e3971dcf1232d2b2d75927232ebb9c0522d940ec0c49391a258d7fdaf15d22c6886de0ca6a688fa61a0a9514dd9bb8c0391c7b94a8bdce5a676694d7921605ae93e8862cf250b502d776d60477e0bf39a36e5848464509db946bc443e4b5938f8900d248b52b588b52cfcbd959886853d4bd949ead3262b565af4fd927ea135896b005c10b51b15a8b4629692c31df1b0da5e1c08597e2649e3c28f09aae2a4593aca8a28da2f2af04c9cd2f3bf64f0a8e9fa946b426c4c620dc4e56410b37cb4770a6869f25addcb63481ab1d90cae82dd7cbb3ef50fd9a7c715f6a526d44e7d6981bff3dc8d4a63547bf03f3952e1b9489404c656789283512e0336494183f46cc02e28b6dc37651de95fe3a39a38c4ab356889cb5622078664596d1455fd10ef30c464d4850f3393a7dd69fb1f5741984d626bf7b71", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0x9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x0874fd88a7f24b55490cddcda8ed2a01d82f30d7ef71239cc3bcac517f82eff27a460818fed125abecc27af0ee8d3604267c19a3d425f0afac7f4b37ca9ebdff26", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x88e6ce2679720956901983b443d43d714e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0x6e000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3838746573742d70617261636861696e", - "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a63": "0x", - "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000100000000000000000", - "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} diff --git a/cumulus/parachains/common/Cargo.toml b/cumulus/parachains/common/Cargo.toml deleted file mode 100644 index 3fb3a2c86222..000000000000 --- a/cumulus/parachains/common/Cargo.toml +++ /dev/null @@ -1,64 +0,0 @@ -[package] -name = "parachains-common" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Logic which is common to all parachain runtimes" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -num-traits = { version = "0.2", default-features = false} - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -pallet-asset-tx-payment = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../primitives/utility", default-features = false } - -[dev-dependencies] -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = ["std"] -std = [ - "frame-support/std", - "frame-system/std", - "pallet-assets/std", - "pallet-authorship/std", - "pallet-balances/std", - "polkadot-primitives/std", - "sp-consensus-aura/std", - "sp-io/std", - "sp-std/std", - "pallet-collator-selection/std", - "cumulus-primitives-core/std", - "cumulus-primitives-utility/std", - "xcm/std", - "xcm-executor/std", -] diff --git a/cumulus/parachains/common/src/impls.rs b/cumulus/parachains/common/src/impls.rs deleted file mode 100644 index 4a1f4f90d055..000000000000 --- a/cumulus/parachains/common/src/impls.rs +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Auxiliary struct/enums for parachain runtimes. -//! Taken from polkadot/runtime/common (at a21cd64) and adapted for parachains. - -use frame_support::traits::{ - fungibles::{self, Balanced, Credit}, - Contains, ContainsPair, Currency, Get, Imbalance, OnUnbalanced, -}; -use pallet_asset_tx_payment::HandleCredit; -use sp_runtime::traits::Zero; -use sp_std::marker::PhantomData; -use xcm::latest::{AssetId, Fungibility::Fungible, MultiAsset, MultiLocation}; - -/// Type alias to conveniently refer to the `Currency::NegativeImbalance` associated type. -pub type NegativeImbalance = as Currency< - ::AccountId, ->>::NegativeImbalance; - -/// Type alias to conveniently refer to `frame_system`'s `Config::AccountId`. -pub type AccountIdOf = ::AccountId; - -/// Implementation of `OnUnbalanced` that deposits the fees into a staking pot for later payout. -pub struct ToStakingPot(PhantomData); -impl OnUnbalanced> for ToStakingPot -where - R: pallet_balances::Config + pallet_collator_selection::Config, - AccountIdOf: From + Into, - ::RuntimeEvent: From>, -{ - fn on_nonzero_unbalanced(amount: NegativeImbalance) { - let staking_pot = >::account_id(); - >::resolve_creating(&staking_pot, amount); - } -} - -/// Implementation of `OnUnbalanced` that deals with the fees by combining tip and fee and passing -/// the result on to `ToStakingPot`. -pub struct DealWithFees(PhantomData); -impl OnUnbalanced> for DealWithFees -where - R: pallet_balances::Config + pallet_collator_selection::Config, - AccountIdOf: From + Into, - ::RuntimeEvent: From>, -{ - fn on_unbalanceds(mut fees_then_tips: impl Iterator>) { - if let Some(mut fees) = fees_then_tips.next() { - if let Some(tips) = fees_then_tips.next() { - tips.merge_into(&mut fees); - } - as OnUnbalanced<_>>::on_unbalanced(fees); - } - } -} - -/// A `HandleCredit` implementation that naively transfers the fees to the block author. -/// Will drop and burn the assets in case the transfer fails. -pub struct AssetsToBlockAuthor(PhantomData<(R, I)>); -impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor -where - I: 'static, - R: pallet_authorship::Config + pallet_assets::Config, - AccountIdOf: From + Into, -{ - fn handle_credit(credit: Credit, pallet_assets::Pallet>) { - if let Some(author) = pallet_authorship::Pallet::::author() { - // In case of error: Will drop the result triggering the `OnDrop` of the imbalance. - let _ = pallet_assets::Pallet::::resolve(&author, credit); - } - } -} - -/// Allow checking in assets that have issuance > 0. -pub struct NonZeroIssuance(PhantomData<(AccountId, Assets)>); -impl Contains<>::AssetId> - for NonZeroIssuance -where - Assets: fungibles::Inspect, -{ - fn contains(id: &>::AssetId) -> bool { - !Assets::total_issuance(id.clone()).is_zero() - } -} - -/// Allow checking in assets that exists. -pub struct AssetExists(PhantomData<(AccountId, Assets)>); -impl Contains<>::AssetId> - for AssetExists -where - Assets: fungibles::Inspect, -{ - fn contains(id: &>::AssetId) -> bool { - Assets::asset_exists(id.clone()) - } -} - -/// Asset filter that allows all assets from a certain location. -pub struct AssetsFrom(PhantomData); -impl> ContainsPair for AssetsFrom { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - let loc = T::get(); - &loc == origin && - matches!(asset, MultiAsset { id: AssetId::Concrete(asset_loc), fun: Fungible(_a) } - if asset_loc.match_and_split(&loc).is_some()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use frame_support::{ - parameter_types, - traits::{ConstU32, FindAuthor, ValidatorRegistration}, - PalletId, - }; - use frame_system::{limits, EnsureRoot}; - use pallet_collator_selection::IdentityCollator; - use polkadot_primitives::AccountId; - use sp_core::{ConstU64, H256}; - use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, Perbill, - }; - use xcm::prelude::*; - - type Block = frame_system::mocking::MockBlock; - const TEST_ACCOUNT: AccountId = AccountId::new([1; 32]); - - frame_support::construct_runtime!( - pub enum Test - { - System: frame_system::{Pallet, Call, Config, Storage, Event}, - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event}, - } - ); - - parameter_types! { - pub const BlockHashCount: u64 = 250; - pub BlockLength: limits::BlockLength = limits::BlockLength::max(2 * 1024); - pub const AvailableBlockRatio: Perbill = Perbill::one(); - pub const MaxReserves: u32 = 50; - } - - impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockLength = BlockLength; - type BlockWeights = (); - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; - } - - impl pallet_balances::Config for Test { - type Balance = u64; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; - type AccountStore = System; - type MaxLocks = (); - type WeightInfo = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<1>; - type MaxFreezes = ConstU32<1>; - } - - pub struct OneAuthor; - impl FindAuthor for OneAuthor { - fn find_author<'a, I>(_: I) -> Option - where - I: 'a, - { - Some(TEST_ACCOUNT) - } - } - - pub struct IsRegistered; - impl ValidatorRegistration for IsRegistered { - fn is_registered(_id: &AccountId) -> bool { - true - } - } - - parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - } - - impl pallet_collator_selection::Config for Test { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = EnsureRoot; - type PotId = PotId; - type MaxCandidates = ConstU32<20>; - type MinEligibleCollators = ConstU32<1>; - type MaxInvulnerables = ConstU32<20>; - type ValidatorId = ::AccountId; - type ValidatorIdOf = IdentityCollator; - type ValidatorRegistration = IsRegistered; - type KickThreshold = (); - type WeightInfo = (); - } - - impl pallet_authorship::Config for Test { - type FindAuthor = OneAuthor; - type EventHandler = (); - } - - pub fn new_test_ext() -> sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - // We use default for brevity, but you can configure as desired if needed. - pallet_balances::GenesisConfig::::default() - .assimilate_storage(&mut t) - .unwrap(); - t.into() - } - - #[test] - fn test_fees_and_tip_split() { - new_test_ext().execute_with(|| { - let fee = Balances::issue(10); - let tip = Balances::issue(20); - - assert_eq!(Balances::free_balance(TEST_ACCOUNT), 0); - - DealWithFees::on_unbalanceds(vec![fee, tip].into_iter()); - - // Author gets 100% of tip and 100% of fee = 30 - assert_eq!(Balances::free_balance(CollatorSelection::account_id()), 30); - }); - } - - #[test] - fn assets_from_filters_correctly() { - parameter_types! { - pub SomeSiblingParachain: MultiLocation = MultiLocation::new(1, X1(Parachain(1234))); - } - - let asset_location = SomeSiblingParachain::get() - .pushed_with_interior(GeneralIndex(42)) - .expect("multilocation will only have 2 junctions; qed"); - let asset = MultiAsset { id: Concrete(asset_location), fun: 1_000_000u128.into() }; - assert!( - AssetsFrom::::contains(&asset, &SomeSiblingParachain::get()), - "AssetsFrom should allow assets from any of its interior locations" - ); - } -} diff --git a/cumulus/parachains/common/src/lib.rs b/cumulus/parachains/common/src/lib.rs deleted file mode 100644 index 0a9686bf8a37..000000000000 --- a/cumulus/parachains/common/src/lib.rs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#![cfg_attr(not(feature = "std"), no_std)] - -pub mod impls; -pub mod xcm_config; -pub use constants::*; -pub use opaque::*; -pub use types::*; - -/// Common types of parachains. -mod types { - use sp_runtime::traits::{IdentifyAccount, Verify}; - - /// An index to a block. - pub type BlockNumber = u32; - - /// Alias to 512-bit hash when used in the context of a transaction signature on the chain. - pub type Signature = sp_runtime::MultiSignature; - - /// Some way of identifying an account on the chain. We intentionally make it equivalent - /// to the public key of our transaction signing scheme. - pub type AccountId = <::Signer as IdentifyAccount>::AccountId; - - /// The type for looking up accounts. We don't expect more than 4 billion of them, but you - /// never know... - pub type AccountIndex = u32; - - /// Balance of an account. - pub type Balance = u128; - - /// Index of a transaction in the chain. - pub type Nonce = u32; - - /// A hash of some data used by the chain. - pub type Hash = sp_core::H256; - - /// Digest item type. - pub type DigestItem = sp_runtime::generic::DigestItem; - - // Aura consensus authority. - pub type AuraId = sp_consensus_aura::sr25519::AuthorityId; - - // Aura consensus authority used by Asset Hub Polkadot. - // - // Because of registering the authorities with an ed25519 key before switching from Shell - // to Asset Hub Polkadot, we were required to deploy a hotfix that changed Asset Hub Polkadot's - // Aura keys to ed22519. In the future that may change again. - pub type AssetHubPolkadotAuraId = sp_consensus_aura::ed25519::AuthorityId; - - // Id used for identifying assets. - pub type AssetIdForTrustBackedAssets = u32; -} - -/// Common constants of parachains. -mod constants { - use super::types::BlockNumber; - use frame_support::weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}; - use sp_runtime::Perbill; - /// This determines the average expected block time that we are targeting. Blocks will be - /// produced at a minimum duration defined by `SLOT_DURATION`. `SLOT_DURATION` is picked up by - /// `pallet_timestamp` which is in turn picked up by `pallet_aura` to implement `fn - /// slot_duration()`. - /// - /// Change this to adjust the block time. - pub const MILLISECS_PER_BLOCK: u64 = 12000; - pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - - // Time is measured by number of blocks. - pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); - pub const HOURS: BlockNumber = MINUTES * 60; - pub const DAYS: BlockNumber = HOURS * 24; - - /// We assume that ~5% of the block weight is consumed by `on_initialize` handlers. This is - /// used to limit the maximal weight of a single extrinsic. - pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); - /// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used by - /// Operational extrinsics. - pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); - - /// We allow for 0.5 seconds of compute with a 6 second average block time. - pub const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - polkadot_primitives::MAX_POV_SIZE as u64, - ); -} - -/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know -/// the specifics of the runtime. They can then be made to be agnostic over specific formats -/// of data like extrinsics, allowing for them to continue syncing the network through upgrades -/// to even the core data structures. -pub mod opaque { - use super::*; - use sp_runtime::{generic, traits::BlakeTwo256}; - - pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; - /// Opaque block header type. - pub type Header = generic::Header; - /// Opaque block type. - pub type Block = generic::Block; - /// Opaque block identifier type. - pub type BlockId = generic::BlockId; -} diff --git a/cumulus/parachains/common/src/xcm_config.rs b/cumulus/parachains/common/src/xcm_config.rs deleted file mode 100644 index 529822cff16f..000000000000 --- a/cumulus/parachains/common/src/xcm_config.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::impls::AccountIdOf; -use core::marker::PhantomData; -use frame_support::{ - log, - traits::{fungibles::Inspect, tokens::ConversionToAssetBalance, ContainsPair}, - weights::Weight, -}; -use sp_runtime::traits::Get; -use xcm::latest::prelude::*; - -/// A `ChargeFeeInFungibles` implementation that converts the output of -/// a given WeightToFee implementation an amount charged in -/// a particular assetId from pallet-assets -pub struct AssetFeeAsExistentialDepositMultiplier< - Runtime, - WeightToFee, - BalanceConverter, - AssetInstance: 'static, ->(PhantomData<(Runtime, WeightToFee, BalanceConverter, AssetInstance)>); -impl - cumulus_primitives_utility::ChargeWeightInFungibles< - AccountIdOf, - pallet_assets::Pallet, - > for AssetFeeAsExistentialDepositMultiplier -where - Runtime: pallet_assets::Config, - WeightToFee: frame_support::weights::WeightToFee, - BalanceConverter: ConversionToAssetBalance< - CurrencyBalance, - >::AssetId, - >::Balance, - >, - AccountIdOf: - From + Into, -{ - fn charge_weight_in_fungibles( - asset_id: as Inspect< - AccountIdOf, - >>::AssetId, - weight: Weight, - ) -> Result< - as Inspect>>::Balance, - XcmError, - > { - let amount = WeightToFee::weight_to_fee(&weight); - // If the amount gotten is not at least the ED, then make it be the ED of the asset - // This is to avoid burning assets and decreasing the supply - let asset_amount = BalanceConverter::to_asset_balance(amount, asset_id) - .map_err(|_| XcmError::TooExpensive)?; - Ok(asset_amount) - } -} - -/// Accepts an asset if it is a native asset from a particular `MultiLocation`. -pub struct ConcreteNativeAssetFrom(PhantomData); -impl> ContainsPair - for ConcreteNativeAssetFrom -{ - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - log::trace!(target: "xcm::filter_asset_location", - "ConcreteNativeAsset asset: {:?}, origin: {:?}, location: {:?}", - asset, origin, Location::get()); - matches!(asset.id, Concrete(ref id) if id == origin && origin == &Location::get()) - } -} diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/0_init.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/0_init.yml deleted file mode 100644 index fdc1aa258d42..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/0_init.yml +++ /dev/null @@ -1,145 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - xcm_version: &xcm_version 3 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - penpal_parachain: - signer: &pp_signer //Alice - decodedCalls: - ap_force_xcm_version: - chain: *assets_parachain - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - -tests: - - name: Initialize Chains - its: - - name: XCM supported versions between chains - actions: - - extrinsics: # Relay Chain sets supported version for Asset Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *ap_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: { location: { parents: 0, interior: { X1: { Parachain: *ap_id }}}, version: *xcm_version } - - extrinsics: # Relay Chain sets supported version for Penpal Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *pp_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: { location: { parents: 0, interior: { X1: { Parachain: *pp_id }}}, version: *xcm_version } - - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 2200000000, - proofSize: 200000 - } - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $ap_force_xcm_version - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,019,210,000', proofSize: '200,000' }} - } - - name: polkadotXcm.SupportedVersionChanged - chain: *assets_parachain - result: { location: { parents: 1, interior: Here }, version: *xcm_version } - - extrinsics: # Penpal Parachain sets supported version for Relay Chain - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.SupportedVersionChanged - result: { location: { parents: 1, interior: Here }, version: *xcm_version } diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/1_dmp.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/1_dmp.yml deleted file mode 100644 index 0e207e632a02..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/1_dmp.yml +++ /dev/null @@ -1,263 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - variables: - common: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf { v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} - amount: &amount 1000000000000 - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most { refTime: 1000000000, proofSize: 200000 } - assets_parachain_account: - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 1 - asset_min_balance: &asset_ed 1000 - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: DMP - its: [] - describes: - - name: xcmPallet.limitedTeleportAssets - before: &before_get_balances - - name: Get the balances of the Relay Chain's sender & Assets Parachain's receiver - actions: - - queries: - balance_rc_sender_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - its: - - name: Should teleport native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '764,772,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }}} - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_ap_receiver_before, - after: $balance_ap_receiver_after, - } - } - ] - - - name: xcmPallet.send | Superuser - Transact(assets.forceCreate) - its: - - name: Relay Chain Superuser account SHOULD be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '1,014,103,000', proofSize: '200,000' }}} - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: xcmPallet.send | Native - Transact(assets.forceCreate) - its: - - name: Relay Chain Native account SHOULD NOT be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Native, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - result: { dispatchError: BadOrigin } - - - name: xcmPallet.limitedReserveTransferAssets - before: *before_get_balances - its: - - name: SHOULD NOT reserved transfer native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedReserveTransferAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '750,645,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { - Incomplete: [ - { refTime: '1,000,000,000', proofSize: 0 }, - UntrustedReserveLocation - ] - } - } - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should keep the balance of the receiver - actions: - - asserts: - equal: - args: - [ - $balance_ap_receiver_before, - $balance_ap_receiver_after - ] diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml deleted file mode 100644 index 2a0bb88090e9..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/2_ump.yml +++ /dev/null @@ -1,191 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - variables: - common: - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F #Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} - assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' #Alice - relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - decodedCalls: - system_remark: - chain: *relay_chain - pallet: system - call: remark - args: [ 0x0011 ] - -tests: - - name: UMP - describes: - - name: polkadotXcm.limitedTeleportAssets - before: - - name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '761,173,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }}} - - - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver - actions: - - queries: - balance_ap_sender_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - its: - - name: Should teleport native assets back from Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedTeleportAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '539,494,000', proofSize: '7,133' }}} - - name: messageQueue.Processed - chain: *relay_chain - threshold: *weight_threshold - result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '298,716,000', proofSize: '0' }, success: true } - - queries: - balance_ap_sender_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_ap_sender_before, - after: $balance_ap_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_rc_receiver_before, - after: $balance_rc_receiver_after, - } - } - ] - - - name: polkadotXcm.send | Native - Transact(system.remark) - its: - - name: Assets Parachain SHOULD NOT be able to dispatch 'send' call - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Native, - requireWeightAtMost: *weight_at_most, - call: $system_remark - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - result: { dispatchError: BadOrigin } - - - name: polkadotXcm.limitedReserveTransferAssets - its: - - name: Should NOT be able to reserve transfer native assets from the Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - result: { outcome: { Error: Barrier }} diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/3_force_hrmp-open-channels.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/3_force_hrmp-open-channels.yml deleted file mode 100644 index dfdae028f00d..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/3_force_hrmp-open-channels.yml +++ /dev/null @@ -1,122 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 2000000000000 - hrmp_channels: - proposed_max_capacity: &max_capacity 8 - proposed_max_message_size: &max_message_size 8192 - channel: &channel { - maxCapacity: *max_capacity, - maxTotalSize: *max_message_size, - maxMessageSize: *max_message_size, - msgCount: 0, - totalSize: 0, - mqcHead: null, - senderDeposit: 0, - recipientDeposit: 0 - } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_account: - sovereign_account: &ap_sovereign F7fq1jSNVTPfJmaHaXCMtatT1EZefCUsa7rRiQVNR5efcah - penpal_parachain: - sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - -tests: - - name: HRMP - beforeEach: - - name: DEPENDENCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *pp_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - - - name: DEPENDENCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *ap_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - describes: - - name: hrmp.forceOpenHrmpChannel (Penpal Parachain → Assets Parachain) - its: - - name: Open Penpal Parachain to Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *pp_id, - *ap_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - - name: hrmp.forceOpenHrmpChannel (Assets Parachain → PenPal Parachain) - its: - - name: Open Assets Parachain to PenPal Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *ap_id, - *pp_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) - its: - - name: Make sure all the pending channels are open - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceProcessHrmpOpen - args: [ 2 ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/4_hrmp.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/4_hrmp.yml deleted file mode 100644 index 02e53da75580..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/0_xcm/4_hrmp.yml +++ /dev/null @@ -1,388 +0,0 @@ ---- -# Note: This tests depends on the 3_hrmp-open-channels.yml for opening channels, otherwise teleports aren't going to -# work. -settings: - chains: - relay_chain: &relay_chain - wsPort: 9900 - assets_parachain: &assets_parachain - wsPort: 9910 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9920 - paraId: &pp_id 2000 - variables: - common: - mint_amount: &mint_amount 1000000000000 - amount: &amount 100000000000 - require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} - amount_to_send: &amount_to_send 500000000000 - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_dest_routed: &ap_dest_routed { v3: { parents: 1, interior: { x1: { parachain: *ap_id } }}} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 2 - assets_pallet_id: &assets_pallet_id 50 - asset_min_balance: &asset_ed 1000 - penpal_parachain_destination: &pp_dest { v3: { parents: 1, interior: { x1: { parachain: *pp_id } }}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} - suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} - suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }} - penpal_parachain: - sovereign_account: &pp_sovereign_sibl FBeL7EAeUroLWXW1yfKboiqTqVfbRBcsUKd6QqVf4kGBySS - signer: &pp_signer //Alice - penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - force_create_asset2: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: HRMP - describes: - - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain - before: - - name: DEPENDENCY | A sufficient Asset should exist in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - SetTopic: '0x0123456789012345678901234567891201234567890123456789012345678912' - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '1,216,703,000', proofSize: '20,000' }}} - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: DEPENDENCY | Some Assets should be minted for the sender - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: assets - call: mint - args: [ - *asset_id, - *ap_wallet, - *mint_amount - ] - events: - - name: assets.Issued - result: { assetId: *asset_id, owner: *ap_wallet, amount: *mint_amount } - - its: - - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - { - id: { - Concrete: { - parents: 0, - interior: { - X2: [ - { - PalletInstance: *assets_pallet_id - }, - { - GeneralIndex: *asset_id - } - ] - } - } - }, - fun: { - Fungible: *amount_to_send - } - } - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '679,150,000', proofSize: '6,196' }}} - - name: assets.Transferred - result: { - assetId: *asset_id, - from: *ap_wallet, - to: *pp_sovereign_sibl, - amount: *amount_to_send - } - - - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain - its: - - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - *ap_ksm_fungible - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '679,150,000', proofSize: '6,196' }}} - - name: balances.Endowed - result: { - account: *pp_sovereign_sibl, - freeBalance: *amount - } - - - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain - before: - - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain - actions: - - queries: - assets_balance_pp_sovereign_before: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - its: - - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [ - { - id: { - concrete: { - parents: 0, - interior: { - X2: [ - { PalletInstance: *assets_pallet_id }, - { GeneralIndex: *asset_id } - ] - } - } - }, - fun: { fungible: *amount }} - ] - }, - { - BuyExecution: { - fees: { id: *suff_asset, fun: { fungible: *amount }}, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - }, - { - RefundSurplus - }, - { - DepositAsset: { - assets: { Wild: All }, - beneficiary: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: , # None - id: *pp_acc - } - } - }} - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.Sent - - name: assets.Burned - chain: *assets_parachain - result: { assetId: *asset_id, owner: *pp_sovereign_sibl } - - name: assets.Issued - chain: *assets_parachain - result: { assetId: *asset_id } - - queries: - assets_balance_pp_sovereign_after: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - forced_created_asset2: - chain: *assets_parachain - pallet: assets - call: asset - args: [ 3 ] - - asserts: - isSome: - args: [ $forced_created_asset2 ] - - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain - actions: - - asserts: - assetsDecreased: - args: [ - { - balances: { - before: $assets_balance_pp_sovereign_before, - after: $assets_balance_pp_sovereign_after, - }, - } - ] - - - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible_fail] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible_fail, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - } - ] - } - ] - events: - - name: xcmpQueue.Fail - chain: *assets_parachain - threshold: *weight_threshold - result: { - error: FailedToTransactAsset, - weight: { refTime: '152,426,000', proofSize: '3,593' } - } diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/config.toml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/config.toml deleted file mode 100644 index 1ec06b3fa104..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-kusama/config.toml +++ /dev/null @@ -1,71 +0,0 @@ -[relaychain] -default_command = "./bin/polkadot" -default_args = [ "-lparachain=debug", "-lxcm=trace" ] -chain = "kusama-local" - - [[relaychain.nodes]] - name = "alice" - ws_port = 9900 - validator = true - args = ["--state-cache-size=0"] - - [[relaychain.nodes]] - name = "bob" - ws_port = 9901 - validator = true - - [[relaychain.nodes]] - name = "charlie" - ws_port = 9902 - validator = true - - [[relaychain.nodes]] - name = "dave" - ws_port = 9903 - validator = true - -[[parachains]] -id = 1000 -chain = "asset-hub-kusama-local" -cumulus_based = true - - [[parachains.collators]] - name = "collator1" - ws_port = 9910 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator2" - ws_port = 9911 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - -[[parachains]] -id = 2000 -chain = "penpal-kusama-2000" -cumulus_based = true - - [[parachains.collators]] - name = "collator3" - ws_port = 9920 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator4" - ws_port = 9921 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - -# [[hrmpChannels]] -# sender = 1000 -# recipient = 2000 -# maxCapacity = 8 -# maxMessageSize = 8192 - -# [[hrmpChannels]] -# sender = 2000 -# recipient = 1000 -# maxCapacity = 8 -# maxMessageSize = 8192 diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/0_init.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/0_init.yml deleted file mode 100644 index a6d3fb3ec834..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/0_init.yml +++ /dev/null @@ -1,145 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9820 - paraId: &pp_id 2000 - variables: - common: - xcm_version: &xcm_version '3' - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 200000} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - penpal_parachain: - signer: &pp_signer //Alice - decodedCalls: - ap_force_xcm_version: - chain: *assets_parachain - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - -tests: - - name: Initialize Chains - its: - - name: XCM supported versions between chains - actions: - - extrinsics: # Relay Chain sets supported version for Asset Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *ap_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: { location: { parents: 0, interior: { X1: { Parachain: *ap_id }}}, version: *xcm_version } - - extrinsics: # Relay Chain sets supported version for Penpal Parachain - - chain: *relay_chain - sudo: true - signer: *rc_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *pp_id - } - } - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: { location: { parents: 0, interior: { X1: { Parachain: *pp_id }}}, version: *xcm_version } - - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 3200000000, - proofSize: 200000 - } - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $ap_force_xcm_version - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '1,019,210,000', proofSize: '200,000' }} - } - - name: polkadotXcm.SupportedVersionChanged - chain: *assets_parachain - result: { location: { parents: 1, interior: Here }, version: *xcm_version } - - extrinsics: # Penpal Parachain sets supported version for Relay Chain - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version # xcmVersion - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.SupportedVersionChanged - result: { location: { parents: 1, interior: Here}, version: *xcm_version } diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/1_dmp.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/1_dmp.yml deleted file mode 100644 index 36b296f3eb1f..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/1_dmp.yml +++ /dev/null @@ -1,263 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - variables: - common: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { parents: 0, interior: { here: true }}} - amount: &amount 1000000000000 - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - require_weight_at_most: &rc_weight_at_most {refTime: 1000000000, proofSize: 200000} - assets_parachain_account: - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - asset_id: &asset_id 1 - asset_min_balance: &asset_ed 1000 - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: DMP - its: [] - describes: - - name: xcmPallet.limitedTeleportAssets - before: &before_get_balances - - name: Get the balances of the Relay Chain's sender & Assets Parachain's receiver - actions: - - queries: - balance_rc_sender_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - its: - - name: Should teleport native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,000,000,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }}} - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_ap_receiver_before, - after: $balance_ap_receiver_after, - } - } - ] - - - name: xcmPallet.send | Superuser - Transact(assets.forceCreate) - its: - - name: Relay Chain Superuser account SHOULD be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Superuser, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '1,014,103,000', proofSize: '200,000' }}} - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: xcmPallet.send | Native - Transact(assets.forceCreate) - its: - - name: Relay Chain Native account SHOULD NOT be able to execute a XCM Transact instruction in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *rc_weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - result: { dispatchError: BadOrigin } - - - name: xcmPallet.limitedReserveTransferAssets - before: *before_get_balances - its: - - name: SHOULD NOT reserved transfer native assets from the Relay Chain to the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedReserveTransferAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '2,000,000,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { - outcome: { - Incomplete: [ - { refTime: '1,000,000,000', proofSize: 0 }, - UntrustedReserveLocation - ] - } - } - - queries: - balance_rc_sender_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - balance_ap_receiver_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_sender_before, - after: $balance_rc_sender_after, - }, - amount: *amount - } - ] - - - name: Should keep the balance of the receiver - actions: - - asserts: - equal: - args: - [ - $balance_ap_receiver_before, - $balance_ap_receiver_after - ] diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml deleted file mode 100644 index fa84d4b006a7..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/2_ump.yml +++ /dev/null @@ -1,194 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - variables: - common: - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most {refTime: 1000000000, proofSize: 0} - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - wallet: &rc_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_account: &ap_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - assets_parachain_beneficiary: &ap_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *ap_acc }}}}} - ksm: &rc_ksm { concrete: { 0, interior: { here: true }}} - ksm_fungible: &rc_ksm_fungible { id: *rc_ksm, fun: { fungible: *amount }} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F - relay_chain_destination: &rc_dest { v3: { parents: 1, interior: { here: true }}} - assets_parachain_account: &rc_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - relay_chain_beneficiary: &rc_benf {v3: { parents: 0, interior: { x1: { accountId32: { id: *rc_acc }}}}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - decodedCalls: - system_remark: - chain: *relay_chain - pallet: system - call: remark - args: [ 0x0011 ] - -tests: - - name: UMP - describes: - - name: polkadotXcm.limitedTeleportAssets - before: - - name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Assets Parachain to have funds to send them back - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - *ap_dest, # destination - *ap_benf, # beneficiary - { v3: [ *rc_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,000,000,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '166,944,000', proofSize: 0 }}} - - - name: Get the balances of the Assets Parachain's sender & Relay Chain's receiver - actions: - - queries: - balance_ap_sender_before: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_before: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - - its: - - name: Should be able to teleport native assets back from Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedTeleportAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '533,283,000', proofSize: '7,096' }}} - - name: messageQueue.Processed - chain: *relay_chain - threshold: *weight_threshold - result: { origin: { Ump: { Para: '1,000' } }, weightUsed: { refTime: '4,000,000,000', proofSize: '0' }, success: true } - - queries: - balance_ap_sender_after: - chain: *assets_parachain - pallet: system - call: account - args: [ *ap_wallet ] - balance_rc_receiver_after: - chain: *relay_chain - pallet: system - call: account - args: [ *rc_wallet ] - - - name: Should reduce the balance of the sender - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_ap_sender_before, - after: $balance_ap_sender_after, - }, - amount: *amount - } - ] - - - name: Should increase the balance of the receiver - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_rc_receiver_before, - after: $balance_rc_receiver_after, - } - } - ] - - - name: polkadotXcm.send | Native - Transact(system.remark) - its: - - name: Assets Parachain SHOULD NOT be able to dispatch 'send' call - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: send - args: [ - *rc_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originType: Native, - requireWeightAtMost: *weight_at_most, - call: $system_remark - } - } - ] - } - ] - events: - - name: system.ExtrinsicFailed - attributes: - - type: SpRuntimeDispatchError - value: BadOrigin - - - name: polkadotXcm.limitedReserveTransferAssets - its: - - name: Should NOT be able to reserve transfer native assets from the Assets Parachain to the Relay Chain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *rc_dest, # destination - *rc_benf, # beneficiary - { v3: [ *ap_ksm_fungible ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: polkadotXcm.Attempted - result: { outcome: { Error: Barrier }} diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/3_force_hrmp-open-channels.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/3_force_hrmp-open-channels.yml deleted file mode 100644 index ecf344a073b4..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/3_force_hrmp-open-channels.yml +++ /dev/null @@ -1,120 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: - wsPort: 9810 - paraId: &ap_id 1000 - penpal_parachain: - wsPort: 9820 - paraId: &pp_id 2000 - variables: - common: - amount: &amount 2000000000000 - hrmp_channels: - proposed_max_capacity: &max_capacity 8 - proposed_max_message_size: &max_message_size 8192 - channel: &channel { - maxCapacity: *max_capacity, - maxTotalSize: *max_message_size, - maxMessageSize: *max_message_size, - msgCount: 0, - totalSize: 0, - mqcHead: null, - senderDeposit: 0, - recipientDeposit: 0 - } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_account: - sovereign_account: &ap_sovereign 5Ec4AhPZk8STuex8Wsi9TwDtJQxKqzPJRCH7348Xtcs9vZLJ - penpal_parachain: - sovereign_account: &pp_sovereign F7fq1jMZkfuCuoMTyiEVAP2DMpMt18WopgBqTJznLihLNbZ - -tests: - - name: HRMP - beforeEach: - - name: DEPENDENCY | Penpal Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *pp_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - - - name: DEPENDENCY | Assets Parachain Sovereign account in the Relay Chain needs to be funded - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - pallet: balances - call: transfer - args: [ - *ap_sovereign, # destination - *amount, # value - ] - events: - - name: balances.Transfer - describes: - - name: hrmp.hrmpInitOpenChannel (Penpal Parachain → Assets Parachain) - its: - - name: Open Penpal Parachain to Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *pp_id, - *ap_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - name: hrmp.hrmpInitOpenChannel (Assets Parachain → PenPal Parachain) - its: - - name: Open Assets Parachain to PenPal Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *ap_id, - *pp_id, - *max_capacity, - *max_message_size - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: hrmp.HrmpChannelForceOpened - - name: hrmp.forceProcessHrmpOpen (make sure all the channels are open) - its: - - name: Make sure all the pending channels are open - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: hrmp - call: forceProcessHrmpOpen - args: [ 2 ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/4_hrmp.yml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/4_hrmp.yml deleted file mode 100644 index 681af698c16d..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/0_xcm/4_hrmp.yml +++ /dev/null @@ -1,388 +0,0 @@ ---- -# Note: This tests depends on the 3_hrmp-open-channels.yml for opening channels, otherwise teleports aren't going to -# work. -settings: - chains: - relay_chain: &relay_chain - wsPort: 9800 - assets_parachain: &assets_parachain - wsPort: 9810 - paraId: &ap_id 1000 - penpal_parachain: &penpal_parachain - wsPort: 9820 - paraId: &pp_id 2000 - variables: - common: - mint_amount: &mint_amount 1000000000000 - amount: &amount 1000000000000 - require_weight_at_most: &weight_at_most {refTime: 1200000000, proofSize: 20000} - amount_to_send: &amount_to_send 500000000000 - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - relay_chain: - signer: &rc_signer //Alice - assets_parachain_destination: &ap_dest { v3: { 0, interior: { x1: { parachain: *ap_id }}}} - assets_parachain_dest_routed: &ap_dest_routed { v3: { parents: 1, interior: { x1: { parachain: *ap_id } }}} - assets_parachain_account: - signer: &ap_signer //Alice - wallet: &ap_wallet 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5 - asset_id: &asset_id 2 - assets_pallet_id: &assets_pallet_id 50 - asset_min_balance: &asset_ed 1000 - penpal_parachain_destination: &pp_dest { v3: { parents: 1, interior: { x1: { parachain: *pp_id } }}} - ksm: &ap_ksm { concrete: { parents: 1, interior: { here: true }}} - ksm_fungible: &ap_ksm_fungible { id: *ap_ksm, fun: { fungible: *amount }} - suff_asset: &suff_asset { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: *asset_id } ] }}} - suff_asset_fail: &suff_asset_fail { concrete: { parents: 0, interior: { x2: [ { PalletInstance: *assets_pallet_id }, { GeneralIndex: 3 } ] }}} - suff_asset_fungible_fail: &ap_suff_asset_fungible_fail { id: *suff_asset_fail, fun: { fungible: 200000000000 }} - penpal_parachain: - sovereign_account: &pp_sovereign_sibl 13cKp89Msu7M2PiaCuuGr1BzAsD5V3vaVbDMs3YtjMZHdGwR - signer: &pp_signer //Alice - penpal_parachain_account: &pp_acc '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - decodedCalls: - force_create_asset: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - force_create_asset2: - chain: *assets_parachain - pallet: assets - call: forceCreate - args: [ - *asset_id, - { Id: *ap_wallet }, # owner - true, # isSufficient - *asset_ed # minBalance - ] - -tests: - - name: HRMP - describes: - - name: polkadotXcm.limitedReserveTransferAssets (Asset) | Assets Parachain -> Penpal Parachain - before: - - name: DEPENDENCY | A sufficient Asset should exist in the Assets Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *rc_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - *ap_dest, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - SetTopic: '0x0123456789012345678901234567891201234567890123456789012345678912' - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset - } - } - ] - } - ] - events: - - name: xcmPallet.Sent - - name: dmpQueue.ExecutedDownward - chain: *assets_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '1,216,703,000', proofSize: '20,000' }}} - - queries: - forced_created_asset: - chain: *assets_parachain - pallet: assets - call: asset - args: [ *asset_id ] - - asserts: - isSome: - args: [ $forced_created_asset ] - - - name: DEPENDENCY | Some Assets should be minted for the sender - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: assets - call: mint - args: [ - *asset_id, - *ap_wallet, - *mint_amount - ] - events: - - name: assets.Issued - result: { assetId: *asset_id, owner: *ap_wallet, amount: *mint_amount } - - its: - - name: Assets Parachain should be able to reserve transfer an Asset to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - { - id: { - Concrete: { - parents: 0, - interior: { - X2: [ - { - PalletInstance: *assets_pallet_id - }, - { - GeneralIndex: *asset_id - } - ] - } - } - }, - fun: { - Fungible: *amount_to_send - } - } - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '673,627,000', proofSize: '6,196' }}} - - name: assets.Transferred - result: { - assetId: *asset_id, - from: *ap_wallet, - to: *pp_sovereign_sibl, - amount: *amount_to_send - } - - - name: polkadotXcm.limitedReserveTransferAssets (KSM) | Assets Parachain -> Penpal Parachain - its: - - name: Assets Parachain should be able to reserve transfer KSM to Penpal Parachain - actions: - - extrinsics: - - chain: *assets_parachain - signer: *ap_signer - pallet: polkadotXcm - call: limitedReserveTransferAssets - args: [ - *pp_dest, # destination - { # beneficiary - V3: { - parents: 0, - interior: { - X1: { - AccountId32: { - id: *pp_acc - } - } - } - } - }, - { # assets - V3: [ - *ap_ksm_fungible - ] - }, - 0, # feeAssetItem - Unlimited # weightLimit - ] - events: - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '679,150,000', proofSize: '6,196' }}} - - name: balances.Endowed - result: { - account: *pp_sovereign_sibl, - freeBalance: *amount - } - - - name: polkadotXcm.send( assets.forceCreateAsset ) | Penpal Parachain -> Assets Parachain - before: - - name: Get the asset balance of the Penpal Parachain Sovereign account in Assets Parachain - actions: - - queries: - assets_balance_pp_sovereign_before: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - its: - - name: Penpal Parachain should be able to send XCM message paying its fee with sufficient asset in Assets Parachain - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [ - { - id: { - concrete: { - parents: 0, - interior: { - X2: [ - { PalletInstance: *assets_pallet_id }, - { GeneralIndex: *asset_id } - ] - } - } - }, - fun: { fungible: *amount_to_send }} - ] - }, - { - BuyExecution: { - fees: { id: *suff_asset, fun: { fungible: *amount_to_send }}, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - }, - { - RefundSurplus - }, - { - DepositAsset: { - assets: { Wild: All }, - beneficiary: { - parents: 0, - interior: { - X1: { - AccountId32: { - network: , # None - id: *pp_acc - } - } - }} - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: polkadotXcm.Sent - - name: assets.Burned - chain: *assets_parachain - result: { assetId: *asset_id, owner: *pp_sovereign_sibl } - - name: assets.Issued - chain: *assets_parachain - result: { assetId: *asset_id } - - queries: - assets_balance_pp_sovereign_after: - chain: *assets_parachain - pallet: assets - call: account - args: [ - *asset_id, - *pp_sovereign_sibl - ] - forced_created_asset2: - chain: *assets_parachain - pallet: assets - call: asset - args: [ 3 ] - - asserts: - isSome: - args: [ $forced_created_asset2 ] - - name: Should reduce the assets balance of the Penpal Parachain's SovereignAccount in the Assets Parachain - actions: - - asserts: - assetsDecreased: - args: [ - { - balances: { - before: $assets_balance_pp_sovereign_before, - after: $assets_balance_pp_sovereign_after, - }, - } - ] - - - name: Penpal Parachain SHOULD NOT be able to send XCM message paying its fee with sufficient assets if not enough balance - actions: - - extrinsics: - - chain: *penpal_parachain - signer: *pp_signer - sudo: true - pallet: polkadotXcm - call: send - args: [ - *ap_dest_routed, # destination - { - v3: [ #message - { - WithdrawAsset: [*ap_suff_asset_fungible_fail] - }, - { - BuyExecution: { - fees: *ap_suff_asset_fungible_fail, - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: SovereignAccount, - requireWeightAtMost: *weight_at_most, - call: $force_create_asset2 - } - } - ] - } - ] - events: - - name: xcmpQueue.Fail - chain: *assets_parachain - threshold: *weight_threshold - result: { - error: FailedToTransactAsset, - weight: { refTime: '152,426,000', proofSize: '3,593' } - } diff --git a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/config.toml b/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/config.toml deleted file mode 100644 index da53cd0ad4f2..000000000000 --- a/cumulus/parachains/integration-tests/e2e/assets/asset-hub-polkadot/config.toml +++ /dev/null @@ -1,72 +0,0 @@ -[relaychain] -default_command = "./bin/polkadot" -default_args = [ "-lparachain=debug", "-lxcm=trace" ] -chain = "polkadot-local" - - [[relaychain.nodes]] - name = "alice" - ws_port = 9800 - validator = true - args = ["--state-cache-size=0"] - - [[relaychain.nodes]] - name = "bob" - ws_port = 9801 - validator = true - - [[relaychain.nodes]] - name = "charlie" - ws_port = 9802 - validator = true - - [[relaychain.nodes]] - name = "dave" - ws_port = 9803 - validator = true - -[[parachains]] -id = 1000 -chain = "asset-hub-polkadot-local" -cumulus_based = true - - [[parachains.collators]] - name = "collator1" - ws_port = 9810 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator2" - ws_port = 9811 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - - -[[parachains]] -id = 2000 -chain = "penpal-polkadot-2000" -cumulus_based = true - - [[parachains.collators]] - name = "collator3" - ws_port = 9820 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator4" - ws_port = 9821 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace" ] - -# [[hrmpChannels]] -# sender = 1000 -# recipient = 2000 -# maxCapacity = 8 -# maxMessageSize = 8192 - -# [[hrmpChannels]] -# sender = 2000 -# recipient = 1000 -# maxCapacity = 8 -# maxMessageSize = 8192 diff --git a/cumulus/parachains/integration-tests/e2e/collectives/README.md b/cumulus/parachains/integration-tests/e2e/collectives/README.md deleted file mode 100644 index 98ea77aac606..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/README.md +++ /dev/null @@ -1,22 +0,0 @@ -E2E tests concerning Polkadot Governance and the Collectives Parachain. The tests run by the Parachain Integration Tests [tool](https://github.com/paritytech/parachains-integration-tests/). - -## Requirements -The tests require some changes to the regular production runtime builds: - -RelayChain runtime: -1. Alice has SUDO -2. Public Referenda `StakingAdmin`, `FellowshipAdmin` tracks settings (see the corresponding keys of the `TRACKS_DATA` constant in the `governance::tracks` module of the Relay Chain runtime crate): -``` yaml -prepare_period: 5 Block, -decision_period: 1 Block, -confirm_period: 1 Block, -min_enactment_period: 1 Block, -``` -Collectives runtime: -1. Fellowship Referenda `Fellows` track settings (see the corresponding key of the `TRACKS_DATA` constant in the `fellowship::tracks` module of the Collectives runtime crate): -``` yaml -prepare_period: 5 Block, -decision_period: 1 Block, -confirm_period: 1 Block, -min_enactment_period: 1 Block, -``` diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/0_init.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/0_init.yml deleted file mode 100644 index 33f4d603e2a7..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/0_init.yml +++ /dev/null @@ -1,166 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - assethub_parachain: &assethub_parachain - wsPort: 9810 - paraId: &sp_id 1000 - variables: - xcm_version: &xcm_version 3 - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - accounts: - alice_signer: &alice_signer //Alice - decodedCalls: - ap_force_xcm_version: - chain: *collectives_parachain - pallet: polkadotXcm - call: forceXcmVersion - args: [ - { # location - parents: 1, - interior: Here - }, - *xcm_version - ] - -tests: - - name: Initialize Chains - its: - - name: XCM supported versions between chains - actions: - - extrinsics: # Relay Chain sets supported version for Collectives Parachain - - chain: *relay_chain - sudo: true - signer: *alice_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *cp_id - } - } - }, - *xcm_version - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: { location: { parents: 0, interior: { X1: { Parachain: *cp_id }}}, version: *xcm_version } - - extrinsics: # Collectives Parachain sets supported version for Relay Chain through it - - chain: *relay_chain - signer: *alice_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { - v3: [ # message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 2200000000, # 2_200_000_000 - proofSize: 200000, # 200_000 - }, - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: { - refTime: 200000000, # 200_000_000 - proofSize: 0, - }, - call: $ap_force_xcm_version - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - - name: polkadotXcm.SupportedVersionChanged - chain: *collectives_parachain - result: { location: { parents: 1, interior: Here }, version: *xcm_version } - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '2,200,000,000', proofSize: 0 }}} - - extrinsics: # Relay Chain sets supported version for AssetHub Parachain - - chain: *relay_chain - sudo: true - signer: *alice_signer - pallet: xcmPallet - call: forceXcmVersion - args: [ - { # location - parents: 0, - interior: { - X1: { - Parachain: *sp_id - } - } - }, - *xcm_version - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.SupportedVersionChanged - result: { location: { parents: 0, interior: { X1: { Parachain: *sp_id } } }, version: *xcm_version } - - extrinsics: # AssetHub Parachain sets supported version for Relay Chain through it - - chain: *relay_chain - signer: *alice_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - { v3: { 0, interior: { x1: { parachain: *sp_id }}}}, # destination - { - v3: [ # message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 2200000000, # 2_200_000_000 - proofSize: 200000, # 200_000 - }, - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: { - refTime: 200000000, # 200_000_000 - proofSize: 0, - }, - call: $ap_force_xcm_version - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - - name: polkadotXcm.SupportedVersionChanged - chain: *assethub_parachain - result: { location: { parents: 1, interior: Here }, version: *xcm_version } - - name: dmpQueue.ExecutedDownward - chain: *assethub_parachain - result: { outcome: { Complete: {} } } diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml deleted file mode 100644 index cda04859b195..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/1_teleport.yml +++ /dev/null @@ -1,168 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - variables: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - accounts: - alice_signer: &acc_alice_signer //Alice - alice_account32: &acc_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5' - checking_account: &checking_account '13UVJyLnbVp9x5XDyJv8g8r3UddNwBrdaH7AADCmw9XQWvYW' - -tests: - - name: Teleport assets from Relay Chain to Collectives Parachain successful. - before: - - name: Get the Alice balances on Relay & Collectives Chains. - actions: - - queries: - balance_rc_alice_1: - chain: *relay_chain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - balance_cp_alice_1: - chain: *collectives_parachain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - its: - - name: Teleport assets from Relay Chain to Collectives Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *acc_alice_signer - pallet: xcmPallet - call: teleportAssets - args: [ - { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary - { - v3: [ - # { - # # TODO use a separate Assets to pay a fee, to receive an exact amount of assets on beneficiary account. - # # a call with two assets fails with an error right now. - # id: { concrete: { 0, interior: { here: true }}}, - # fun: { fungible: 1000000000000 } # 1_000_000_000_000 - # }, - { - id: { concrete: { 0, interior: { here: true }}}, - fun: { fungible: 20000000000000 } # 20_000_000_000_000 - } - ] - }, # assets - 0, # feeAssetItem - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,000,000,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '4,000,000,000', proofSize: 0 }}} - - queries: - balance_rc_alice_2: - chain: *relay_chain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - balance_cp_alice_2: - chain: *collectives_parachain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - - name: Alice deposit check, balance decreased on Relay Chain, increased on Collectives. - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_rc_alice_1, - after: $balance_rc_alice_2, - } - } - ] - balanceIncreased: - args: [ - { - balances: { - before: $balance_cp_alice_1, - after: $balance_cp_alice_2, - } - } - ] - - - name: Teleport assets from Collectives Parachain to Relay Chain successful - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *acc_alice_signer - pallet: polkadotXcm - call: teleportAssets - args: [ - { v3: { parents: 1, interior: { here: true }}}, # destination - { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary - { - v3: [ - { - id: { concrete: { parents: 1, interior: { here: true }}}, - fun: { fungible: 10000000000000 } # 10_000_000_000_000 - } - ] - }, # assets - 0, # feeAssetItem - ] - events: - - name: balances.Withdraw - result: { who: *acc_alice_ss58, amount: 10000000000000 } - - name: polkadotXcm.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,000,000,000', proofSize: 0 }}} - - name: balances.Withdraw - chain: *relay_chain - result: { who: *checking_account, amount: 10000000000000 } # amount received and withdrawn from registry account - - name: messageQueue.Processed - chain: *relay_chain - threshold: *weight_threshold - result: { origin: { Ump: { Para: *cp_id } }, weightUsed: { refTime: '4,000,000,000', proofSize: '0' }, success: true } - - queries: - balance_rc_alice_3: - chain: *relay_chain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - balance_cp_alice_3: - chain: *collectives_parachain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - - - name: Alice deposit check, balance decreased on Collectives, increased on Relay Chain. - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_cp_alice_2, - after: $balance_cp_alice_3, - } - } - ] - balanceIncreased: - args: [ - { - balances: { - before: $balance_rc_alice_2, - after: $balance_rc_alice_3, - } - } - ] -# TODO (P2) assert Alice balance before and after teleport (see example in kick_member test) -# TODO (P1) test: teleport of non relay chain assets fails diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/2_reserve.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/2_reserve.yml deleted file mode 100644 index bd17f07524a2..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/2_reserve.yml +++ /dev/null @@ -1,53 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - variables: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - chains: - accounts: - alice_signer: &alice_signer //Alice - alice_account32: &alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - -tests: - - name: Reserve assets from Relay Chain to Collectives Parachain fails - its: - - name: Reserve assets from Relay Chain to Collectives Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: xcmPallet - call: reserveTransferAssets - args: [ - { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { v3: { parents: 0, interior: { x1: { accountId32: { id: *alice_acc32 }}}}}, # beneficiary - { - v3: [ - { - id: { concrete: { 0, interior: { here: true }}}, - fun: { fungible: 20000000000000 } # 20_000_000_000_000 - } - ] - }, # assets - 0, # feeAssetItem - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '2,000,000,000', proofSize: 0 }}} - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { - outcome: { - Incomplete: [ - { refTime: '1,000,000,000', proofSize: 0 }, - UntrustedReserveLocation - ] - } - } diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/3_hrmp-open-channels.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/3_hrmp-open-channels.yml deleted file mode 100644 index 1038ec8dc42b..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/0_xcm/3_hrmp-open-channels.yml +++ /dev/null @@ -1,59 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - assethub_parachain: &assethub_parachain - wsPort: 9810 - paraId: &sp_id 1000 - variables: - chains: - accounts: - alice_signer: &alice_signer //Alice - hrmp: - proposed_max_capacity: &hrmp_proposed_max_capacity 8 - proposed_max_message_size: &hrmp_proposed_max_message_size 8192 -tests: - - name: HRMP - describes: - - name: Force Open HRMP Channel From Collectives Parachain → AssetHub Parachain - its: - - name: Alice calls hrmp.forceOpenHrmpChannel - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *cp_id, # sender - *sp_id, # recipient - *hrmp_proposed_max_capacity, # proposedMaxCapacity - *hrmp_proposed_max_message_size # proposedMaxMessageSize - ] - events: - - name: hrmp.HrmpChannelForceOpened - result: [*cp_id, *sp_id, *hrmp_proposed_max_capacity, *hrmp_proposed_max_message_size] - - name: Force Open HRMP Channel From AssetHub Parachain → Collectives Parachain - its: - - name: Alice calls hrmp.forceOpenHrmpChannel - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - sudo: true - pallet: hrmp - call: forceOpenHrmpChannel - args: [ - *sp_id, # sender - *cp_id, # recipient - *hrmp_proposed_max_capacity, # proposedMaxCapacity - *hrmp_proposed_max_message_size # proposedMaxMessageSize - ] - events: - - name: hrmp.HrmpChannelForceOpened - result: [*sp_id, *cp_id, *hrmp_proposed_max_capacity, *hrmp_proposed_max_message_size] diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/0_join_alliance_fails.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/0_join_alliance_fails.yml deleted file mode 100644 index 9aff8b1db102..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/0_join_alliance_fails.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -settings: - chains: - relay_chain: - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - variables: - accounts: - alice_signer: &alice_signer //Alice - -tests: - - name: Alice fails to join an the Alliance, since it is not initialized yet. - its: - - name: Alice joins alliance - actions: - - extrinsics: # Relay Chain sets supported version for Asset Parachain - - chain: *collectives_parachain - signer: *alice_signer - pallet: alliance - call: joinAlliance - args: [] - events: - - name: system.ExtrinsicFailed - result: { - dispatchError: { Module: { index: 50, error: '0x00000000' }} - } - # TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized - # issue - https://github.com/paritytech/parachains-integration-tests/issues/59 diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/1_init_alliance.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/1_init_alliance.yml deleted file mode 100644 index 1e01c701744a..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/1_init_alliance.yml +++ /dev/null @@ -1,256 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &coll_para_id 1001 - variables: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - accounts: - alice_signer: &acc_alice_signer //Alice - liam_account32: &acc_liam_acc32 "0x3614671a5de540d891eb8c4939c8153a4aa790602b347c18177b86d0fc546221" # //Liam - olivia_account32: &acc_olivia_acc32 "0x24ee8a659c6716fe9f7cb4e9e028602aa12867654ca02737da9171b7ff697d5c" # //Olivia - noah_account32: &acc_noah_acc32 "0x9c6ad3bc3aa2f1b2e837898e6da9980445f7ef8b3eee0b8c8e305f8cfae68517" # //Noah - emma_account32: &acc_emma_acc32 "0x8ac272b333ba1127c8db57fa777ec820b24598a236efa648caf0d26d86f64572" # //Emma - james_account32: &acc_james_acc32 "0x9a52805151a0b5effc084af9264011139872a21a3950cb9ae0b2955c4bf92c18" # //James - ava_account32: &acc_ava_acc32 "0x348ef0b8776adbc09c862ddc29b1d193b9e24738e54eea3b0609c83856dc101c" # //Ava - mia_account32: &acc_mia_acc32 "0xaebf15374cf7e758d10232514c569a7abf81cc1b8f1e81a73dbc608a0e335264" # //Mia - decodedCalls: - init_alliance_members: - chain: *collectives_parachain - pallet: alliance - call: initMembers - args: [ - [ - *acc_liam_acc32, - *acc_olivia_acc32, - *acc_noah_acc32, - *acc_emma_acc32, - *acc_james_acc32, - *acc_ava_acc32 - ], - [ - *acc_mia_acc32 - ] - ] - init_alliance_voting_members: - chain: *collectives_parachain - pallet: alliance - call: initMembers - args: [ - [ - *acc_liam_acc32, - *acc_olivia_acc32, - *acc_noah_acc32, - *acc_emma_acc32, - *acc_james_acc32, - *acc_ava_acc32, - *acc_mia_acc32 - ], - [] - ] - disband: - chain: *collectives_parachain - pallet: alliance - call: disband - args: [ - { - fellowMembers: 6, - allyMembers: 1 - } - ] - -tests: - - name: Alliance initiated with the root call, second init call fails. Alliance disband and set again. - its: - - name: Alliance initiated, founders and fellows are set. - actions: - - extrinsics: - - chain: *relay_chain - signer: *acc_alice_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination - { - v3: [ # message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 3000000000, # 3_000_000_000 - proofSize: 2000000, # 2_000_000 - }, - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: { - refTime: 1000000000, # 1_000_000_000 - proofSize: 1000000, # 1_000_000 - }, - call: $init_alliance_members - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - result: { origin: { parents: 0, interior: Here }, destination: { parents: 0, interior: { X1: { Parachain: *coll_para_id }}}} - - name: alliance.MembersInitialized - chain: *collectives_parachain - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,000,000,000', proofSize: '1,000,000' }}} - - - name: Alliance init call fails. - actions: - - extrinsics: - - chain: *relay_chain - signer: *acc_alice_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination - { - v3: [ # message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 3000000000, # 3_000_000_000 - proofSize: 2000000, # 2_000_000 - }, - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: { - refTime: 1000000000, # 1_000_000_000 - proofSize: 1000000, # 1_000_000 - }, - call: $init_alliance_voting_members - } - } - ] - } - ] - events: - # TODO can not currently assert variant AllianceAlreadyInitialized, XCM Transact fails silently - # issue - https://github.com/paritytech/polkadot/issues/4623 - # Next test with a disband call will fail, if this call does not fail, - # since a witness data from a disband call will be invalid. - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - result: { origin: { parents: 0, interior: Here }, destination: { parents: 0, interior: { X1: { Parachain: *coll_para_id }}}} - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,000,000,000', proofSize: '1,000,000' }}} - - - name: Alliance disbanded and initialized again. - actions: - - extrinsics: - - chain: *relay_chain - signer: *acc_alice_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination - { - v3: [ # message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 5000000000, # 3_000_000_000 - proofSize: 1000000, # 1_000_000 - }, - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: { - refTime: 3000000000, # 3_000_000_000 - proofSize: 200000, # 200_000 - }, - call: $disband - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - result: { origin: { parents: 0, interior: Here }, destination: { parents: 0, interior: { X1: { Parachain: *coll_para_id }}}} - - name: alliance.AllianceDisbanded - chain: *collectives_parachain - result: { fellowMembers: 6, allyMembers: 1, unreserved: 0 } - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,321,495,872', proofSize: '181,779' }}} - - name: Alliance initiated, founders and fellows are set. - actions: - - extrinsics: - - chain: *relay_chain - signer: *acc_alice_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - { v3: { parents: 0, interior: { x1: { parachain: *coll_para_id }}}}, # destination - { - v3: [ # message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 3000000000, # 3_000_000_000 - proofSize: 2000000, # 2_000_000 - }, - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: { - refTime: 1000000000, # 1_000_000_000 - proofSize: 1000000, # 1_000_000 - }, - call: $init_alliance_members - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - result: { origin: { parents: 0, interior: Here }, destination: { parents: 0, interior: { X1: { Parachain: *coll_para_id }}}} - - name: alliance.MembersInitialized - chain: *collectives_parachain - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { outcome: { Complete: { refTime: '3,000,000,000', proofSize: '1,000,000' }}} diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/2_join_alliance_fails.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/2_join_alliance_fails.yml deleted file mode 100644 index 2afdadae6022..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/2_join_alliance_fails.yml +++ /dev/null @@ -1,30 +0,0 @@ ---- -settings: - chains: - relay_chain: - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: 1001 - variables: - accounts: - liam_signer: &acc_liam_signer //Liam - -tests: - - name: Liam fails to join an the Alliance, Liam is already a member. - its: - - name: Alice joins alliance - actions: - - extrinsics: # Relay Chain sets supported version for Asset Parachain - - chain: *collectives_parachain - signer: *acc_liam_signer - pallet: alliance - call: joinAlliance - args: [] - events: - - name: system.ExtrinsicFailed - result: { - dispatchError: { Module: { index: 50, error: '0x02000000' }} - } - # TODO assert with Alliance Error variant - alliance.AllianceNotYetInitialized - # issue - https://github.com/paritytech/parachains-integration-tests/issues/59 diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/3_kick_member.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/3_kick_member.yml deleted file mode 100644 index a5941cb47234..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/1_alliance/3_kick_member.yml +++ /dev/null @@ -1,175 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - variables: - weight_threshold: &weight_threshold { refTime: [10, 10], proofSize: [10, 10] } - init_teleport_amount: &init_teleport_amount 20000000000000 # 20_000_000_000_000 - accounts: - alice_signer: &acc_alice_signer //Alice - treasury_account32: &acc_treasury_acc32 '0x6d6f646c70792f74727372790000000000000000000000000000000000000000' - alice_account32: &acc_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5' - decodedCalls: - alliance_kick_member: - chain: *collectives_parachain - pallet: alliance - call: kickMember - args: [ - {Id: *acc_alice_acc32} - ] - -tests: - - name: Member kicked out, deposited assets slashed and teleported to Relay Chain treasury. - before: - - name: DEPENDENCY | Do a 'limitedTeleportAssets' from the Relay Chain to the Collectives Parachain - actions: - - extrinsics: - - chain: *relay_chain - signer: *acc_alice_signer - pallet: xcmPallet - call: limitedTeleportAssets - args: [ - { v3: { 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { v3: { parents: 0, interior: { x1: { accountId32: { id: *acc_alice_acc32 }}}}}, # beneficiary - { v3: [ { id: { concrete: { 0, interior: { here: true }}}, fun: { fungible: *init_teleport_amount }} ] }, # assets - 0, # feeAssetItem - { unlimited: true } # weightLimit - ] - events: - - name: xcmPallet.Attempted - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '3,000,000,000', proofSize: 0 }} - } - - name: balances.Deposit - chain: *collectives_parachain - result: { who: *acc_alice_ss58 } - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '4,000,000,000', proofSize: 0 }} - } - - name: Get the balances of the Relay Chain's treasury & Collectives parachain's future alliance member - actions: - - queries: - balance_rc_treasury_before: - chain: *relay_chain - pallet: system - call: account - args: [ *acc_treasury_acc32 ] - balance_cp_alice_before: - chain: *collectives_parachain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - its: - - name: Alice joins alliance - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *acc_alice_signer - pallet: alliance - call: joinAlliance - args: [] - events: - - name: balances.Reserved - chain: *collectives_parachain - result: { who: *acc_alice_ss58, amount: 10000000000000 } - - name: alliance.NewAllyJoined - result: {ally: *acc_alice_ss58, reserved: 10000000000000 } - - queries: - balance_cp_alice_after: - chain: *collectives_parachain - pallet: system - call: account - args: [ *acc_alice_acc32 ] - - name: Alice deposit check, balance decreased - actions: - - asserts: - balanceDecreased: - args: [ - { - balances: { - before: $balance_cp_alice_before, - after: $balance_cp_alice_after, - } - # TODO (P3) set `amount` and `fee` for more strict assert - } - ] - - name: Kick Alice from alliance - actions: - - extrinsics: # Asset Parachain sets supported version for Relay Chain through it - - chain: *relay_chain - signer: *acc_alice_signer - sudo: true - pallet: xcmPallet - call: send - args: [ - { v3: { parents: 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: { - limited: { - refTime: 4000000000, # 4_000_000_000 - proofSize: 2000000, # 2_000_000 - }, - } - } - }, - { - Transact: { - originKind: Superuser, - requireWeightAtMost: { - refTime: 2000000000, # 2_000_000_000 - proofSize: 1000000, # 1_000_000 - }, - call: $alliance_kick_member - } - } - ] - } - ] - events: - - name: sudo.Sudid - result: { sudoResult: Ok } - - name: xcmPallet.Sent - result: { origin: { parents: 0, interior: Here }, destination: { parents: 0, interior: { X1: { Parachain: *cp_id }}}} - - name: alliance.MemberKicked - chain: *collectives_parachain - result: { member: *acc_alice_ss58, slashed: 10000000000000 } - - name: dmpQueue.ExecutedDownward - chain: *collectives_parachain - threshold: *weight_threshold - result: { - outcome: { Complete: { refTime: '4,000,000,000', proofSize: '1,000,000' }} - } - - name: messageQueue.Processed - result: { origin: { Ump: { Para: *cp_id }}, success: true } - - - queries: - balance_rc_treasury_after: - chain: *relay_chain - pallet: system - call: account - args: [ *acc_treasury_acc32 ] - - name: Slashed balance appears on the relay chain treasury account - actions: - - asserts: - balanceIncreased: - args: [ - { - balances: { - before: $balance_rc_treasury_before, - after: $balance_rc_treasury_after, - } - # TODO (P3) set `amount` and `fee` for more strict assert - } - ] diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/2_opengov/0_assethub.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/2_opengov/0_assethub.yml deleted file mode 100644 index c53efff51fbf..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/2_opengov/0_assethub.yml +++ /dev/null @@ -1,149 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - assethub_parachain: &assethub_parachain - wsPort: 9810 - paraId: &ap_id 1000 - variables: - proposal_index: &proposal_index 0 - chains: - accounts: - alice_signer: &alice_signer //Alice - bob_signer: &bob_signer //Bob - decodedCalls: - set_candidates_ap: - chain: *assethub_parachain - encode: true - pallet: collatorSelection - call: setDesiredCandidates - args: [ - 3 - ] - send_set_candidates_rc: - chain: *relay_chain - encode: false - pallet: xcmPallet - call: send - args: [ - { v3: { parents: 0, interior: { x1: { parachain: *ap_id }}}}, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Xcm, - requireWeightAtMost: { - refTime: 200000000, # 200_000_000 - proofSize: 100000, # 100_000 - }, - call: $set_candidates_ap - } - } - ] - } - ] -tests: - - name: OpenGov - describes: - - name: Set desired candidates on AssetHub from Relay Chain OpenGov Staking track - its: - - name: Note preimage from xcm send set_desired_candidates call - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: preimage - call: notePreimage - args: [ - $send_set_candidates_rc - ] - events: - - name: preimage.Noted - result: {hash_: $send_set_candidates_rc.hash } - - name: Submit a proposal to set desired candidates - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: referenda - call: submit - args: [ - { - "Origins": "StakingAdmin", - }, - { - "Lookup": { - "hash_": $send_set_candidates_rc.hash, - "len": $send_set_candidates_rc.len, - }, - }, - { - "After": 1, - }, - ] - events: - - name: referenda.Submitted - result: { - index: *proposal_index, - proposal: { Lookup: { hash_: $send_set_candidates_rc.hash, len: $send_set_candidates_rc.len }} - } - - name: Alice Vote Aye - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: convictionVoting - call: vote - args: [ - *proposal_index, - { - "Standard": { - "vote": { - "aye": true, - "conviction": "Locked1x", - }, - "balance": 200000000000000, - } - }, - ] # TODO no event to catch https://github.com/paritytech/substrate/issues/14687 - - name: Bob Vote Aye - actions: - - extrinsics: - - chain: *relay_chain - signer: *bob_signer - pallet: convictionVoting - call: vote - args: [ - *proposal_index, - { - "Standard": { - "vote": { - "aye": true, - "conviction": "Locked1x", - }, - "balance": 200000000000000, - } - }, - ] # TODO no event to catch https://github.com/paritytech/substrate/issues/14687 - - name: Submit the decision deposit - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: referenda - call: placeDecisionDeposit - args: [ - *proposal_index, - ] - events: - - name: referenda.DecisionDepositPlaced - result: { index: *proposal_index } - - name: collatorSelection.NewDesiredCandidates - chain: *assethub_parachain - result: { desiredCandidates: 3 } diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/0_init.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/0_init.yml deleted file mode 100644 index 1e4b2dabe211..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/0_init.yml +++ /dev/null @@ -1,209 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - variables: - proposal_index: &proposal_index 1 - chains: - accounts: - alice_signer: &alice_signer //Alice - bob_signer: &bob_signer //Bob - alice_account32: &acc_alice_acc32 '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' - alice_ss58: &acc_alice_ss58 '15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5' - decodedCalls: - fellowship_induct_alice_cp: - chain: *collectives_parachain - encode: true - pallet: fellowshipCore - call: induct - args: [ - *acc_alice_acc32 - ] - fellowship_promote_1_alice_cp: - chain: *collectives_parachain - encode: true - pallet: fellowshipCore - call: promote - args: [ - *acc_alice_acc32, - 1 - ] - fellowship_promote_2_alice_cp: - chain: *collectives_parachain - encode: true - pallet: fellowshipCore - call: promote - args: [ - *acc_alice_acc32, - 2 - ] - fellowship_promote_3_alice_cp: - chain: *collectives_parachain - encode: true - pallet: fellowshipCore - call: promote - args: [ - *acc_alice_acc32, - 3 - ] - send_init_fellowship_rc: - chain: *relay_chain - encode: false - pallet: xcmPallet - call: send - args: [ - { v3: { parents: 0, interior: { x1: { parachain: *cp_id }}}}, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { # since batch_all not yet allowed over xcm, we have to send multiple `Transact`. - Transact: { - originKind: Xcm, - requireWeightAtMost: { - refTime: 1500000000, # 1_500_000_000 - proofSize: 10000, # 10_000 - }, - call: $fellowship_induct_alice_cp - } - }, - { - Transact: { - originKind: Xcm, - requireWeightAtMost: { - refTime: 1500000000, # 1_500_000_000 - proofSize: 10000, # 10_000 - }, - call: $fellowship_promote_1_alice_cp - } - }, - { - Transact: { - originKind: Xcm, - requireWeightAtMost: { - refTime: 1500000000, # 1_500_000_000 - proofSize: 10000, # 10_000 - }, - call: $fellowship_promote_2_alice_cp - } - }, - { - Transact: { - originKind: Xcm, - requireWeightAtMost: { - refTime: 1500000000, # 1_500_000_000 - proofSize: 10000, # 10_000 - }, - call: $fellowship_promote_3_alice_cp - } - } - ] - } - ] - -tests: - - name: Fellowship - describes: - - name: Init the Fellowship - its: - - name: Note preimage from init fellowship call - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: preimage - call: notePreimage - args: [ - $send_init_fellowship_rc - ] - events: - - name: preimage.Noted - result: { hash_: $send_init_fellowship_rc.hash } - - name: Submit a proposal to init the Fellowship - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: referenda - call: submit - args: [ - { - "Origins": "FellowshipAdmin", - }, - { - "Lookup": { - "hash_": $send_init_fellowship_rc.hash, - "len": $send_init_fellowship_rc.len, - }, - }, - { - "After": 1, - }, - ] - events: - - name: referenda.Submitted - result: { - index: *proposal_index, - proposal: { Lookup: { hash_: $send_init_fellowship_rc.hash, len: $send_init_fellowship_rc.len }} - } - - name: Alice Vote Aye - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: convictionVoting - call: vote - args: [ - *proposal_index, - { - "Standard": { - "vote": { - "aye": true, - "conviction": "Locked1x", - }, - "balance": 200000000000000, - } - }, - ] # TODO no Aye event to catch https://github.com/paritytech/substrate/issues/14687 - - name: Bob Vote Aye - actions: - - extrinsics: - - chain: *relay_chain - signer: *bob_signer - pallet: convictionVoting - call: vote - args: [ - *proposal_index, - { - "Standard": { - "vote": { - "aye": true, - "conviction": "Locked1x", - }, - "balance": 200000000000000, - } - }, - ] # TODO no Aye event to catch https://github.com/paritytech/substrate/issues/14687 - - name: Submit the decision deposit - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: referenda - call: placeDecisionDeposit - args: [ - *proposal_index, - ] - events: - - name: referenda.DecisionDepositPlaced - result: { index: *proposal_index } - - name: fellowshipCollective.MemberAdded - chain: *collectives_parachain - result: { who: *acc_alice_ss58 } diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/1_whitelist_call.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/1_whitelist_call.yml deleted file mode 100644 index 5991c7ae2f8a..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/1_whitelist_call.yml +++ /dev/null @@ -1,146 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - variables: - fellows_proposal_index: &fellows_proposal_index 0 - chains: - accounts: - alice_signer: &alice_signer //Alice - decodedCalls: - remark_rc: - chain: *relay_chain - encode: false - pallet: system - call: remark - args: [ - "0x10" - ] - whitelist_remark_rc: - chain: *relay_chain - encode: true - pallet: whitelist - call: whitelistCall - args: [ - $remark_rc.hash - ] - send_whitelist_remark_cp: - chain: *collectives_parachain - encode: false - pallet: polkadotXcm - call: send - args: [ - { v3: { parents: 1, interior: { here: true }}}, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Xcm, - requireWeightAtMost: { - refTime: 500000000, # 500_000_000 - proofSize: 20000, # 20_000 - }, - call: $whitelist_remark_rc - } - } - ] - } - ] - -tests: - - name: Fellowship - describes: - - name: The Fellowship white list the call - its: - - name: Note preimage from the whitelist call on the Relay Chain - actions: - - extrinsics: - - chain: *relay_chain - signer: *alice_signer - pallet: preimage - call: notePreimage - args: [ - $remark_rc - ] - events: - - name: preimage.Noted - result: { hash_: $remark_rc.hash } - - name: Note preimage from the xcm send call to white list the call above - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: preimage - call: notePreimage - args: [ - $send_whitelist_remark_cp, - ] - events: - - name: preimage.Noted - result: { hash_: $send_whitelist_remark_cp.hash } - - name: Submit a proposal to while list the call - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: fellowshipReferenda - call: submit - args: [ - { - "FellowshipOrigins": "Fellows", - }, - { - "Lookup": { - "hash_": $send_whitelist_remark_cp.hash, - "len": $send_whitelist_remark_cp.len, - }, - }, - { - "After": 1, - }, - ] - events: - - name: fellowshipReferenda.Submitted - result: { - index: *fellows_proposal_index, - proposal: { Lookup: { hash_: $send_whitelist_remark_cp.hash, len: $send_whitelist_remark_cp.len}} - } - - name: Vote Aye - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: fellowshipCollective - call: vote - args: [ - *fellows_proposal_index, - true, - ] - events: - - name: fellowshipCollective.Voted - result: { poll: *fellows_proposal_index, vote: { Aye: 1 } } - - name: Submit the decision deposit - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: fellowshipReferenda - call: placeDecisionDeposit - args: [ - *fellows_proposal_index, - ] - events: - - name: fellowshipReferenda.DecisionDepositPlaced - result: {index: *fellows_proposal_index} - - name: whitelist.CallWhitelisted - chain: *relay_chain - result: { callHash: $remark_rc.hash } diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/2_assethub.yml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/2_assethub.yml deleted file mode 100644 index c0805594808c..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/3_fellowship/2_assethub.yml +++ /dev/null @@ -1,126 +0,0 @@ ---- -settings: - chains: - relay_chain: &relay_chain - wsPort: 9700 - collectives_parachain: &collectives_parachain - wsPort: 9710 - paraId: &cp_id 1001 - assethub_parachain: &assethub_parachain - wsPort: 9810 - paraId: &ap_id 1000 - variables: - fellows_proposal_index: &fellows_proposal_index 1 - chains: - accounts: - alice_signer: &alice_signer //Alice - - decodedCalls: - xcmp_resume_execution_ap: - chain: *assethub_parachain - encode: true - pallet: xcmpQueue - call: resumeXcmExecution - args: [] - send_xcmp_resume_execution_cp: - chain: *collectives_parachain - encode: false - pallet: polkadotXcm - call: send - args: [ - { v3: { parents: 1, interior: { x1: { parachain: *ap_id }}}}, # destination - { - v3: [ #message - { - UnpaidExecution: { - weightLimit: Unlimited - } - }, - { - Transact: { - originKind: Xcm, - requireWeightAtMost: { - refTime: 300000000, # 300_000_000 - proofSize: 10000, # 10_000 - }, - call: $xcmp_resume_execution_ap - } - } - ] - } - ] - -tests: - - name: Fellowship - describes: - - name: The Fellowship resume xcm execution for the xcmp queue on AssetHub - its: - - name: Note preimage from the xcm send call to suspend_xcm_execution - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: preimage - call: notePreimage - args: [ - $send_xcmp_resume_execution_cp - ] - events: - - name: preimage.Noted - result: {hash_: $send_xcmp_resume_execution_cp.hash } - - name: Submit a proposal to resume xcm execution on AssetHub - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: fellowshipReferenda - call: submit - args: [ - { - "FellowshipOrigins": "Fellows", - }, - { - "Lookup": { - "hash_": $send_xcmp_resume_execution_cp.hash, - "len": $send_xcmp_resume_execution_cp.len, - }, - }, - { - "After": 1, - }, - ] - events: - - name: fellowshipReferenda.Submitted - result: { - index: 1, - proposal: {Lookup: {hash_: $send_xcmp_resume_execution_cp.hash, len: $send_xcmp_resume_execution_cp.len}} - } - - name: Vote Aye - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: fellowshipCollective - call: vote - args: [ - *fellows_proposal_index, - true, - ] - events: - - name: fellowshipCollective.Voted - result: { poll: *fellows_proposal_index, vote: { Aye: 1 } } - - name: Submit the decision deposit - actions: - - extrinsics: - - chain: *collectives_parachain - signer: *alice_signer - pallet: fellowshipReferenda - call: placeDecisionDeposit - args: [ - *fellows_proposal_index, - ] - events: - - name: fellowshipReferenda.DecisionDepositPlaced - result: {index: *fellows_proposal_index} - - name: xcmpQueue.Success - chain: *assethub_parachain diff --git a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/config.toml b/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/config.toml deleted file mode 100644 index 20fda92bd08f..000000000000 --- a/cumulus/parachains/integration-tests/e2e/collectives/collectives-polkadot/config.toml +++ /dev/null @@ -1,42 +0,0 @@ -[relaychain] -default_command = "./bin/polkadot" -default_args = [ "-lparachain=trace", "-lxcm=trace" ] -chain = "polkadot-local" - - [[relaychain.nodes]] - name = "alice" - ws_port = 9700 - validator = true - args = ["--state-cache-size=0"] - - [[relaychain.nodes]] - name = "bob" - ws_port = 9701 - validator = true - - [[relaychain.nodes]] - name = "charlie" - ws_port = 9702 - validator = true - - [[relaychain.nodes]] - name = "dave" - ws_port = 9703 - validator = true - -[[parachains]] -id = 1001 -chain = "collectives-polkadot-local" -cumulus_based = true - - [[parachains.collators]] - name = "collator1" - ws_port = 9710 - command = "./bin/polkadot-parachain" - args = [ "-lxcm=trace", "--state-cache-size=0" ] - - [[parachains.collators]] - name = "collator2" - ws_port = 9711 - command = "./bin/polkadot-parachain" - args = ["-lxcm=trace"] diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/Cargo.toml b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/Cargo.toml deleted file mode 100644 index d3ecbde42912..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/Cargo.toml +++ /dev/null @@ -1,37 +0,0 @@ -[package] -name = "asset-hub-kusama-integration-tests" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Asset Hub Kusama runtime integration tests with xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } - -# Substrate -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../../common" } -cumulus-pallet-dmp-queue = { path = "../../../../../pallets/dmp-queue" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../../../../pallets/parachain-system" } - -# Local -xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } -integration-tests-common = { default-features = false, path = "../../common" } diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs deleted file mode 100644 index 4282e91c4996..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/lib.rs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -pub use codec::Encode; -pub use frame_support::{ - assert_err, assert_ok, - instances::Instance1, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult, MultiAddress}, - traits::{fungibles::Inspect, OriginTrait}, -}; -pub use integration_tests_common::{ - constants::{ - accounts::{ALICE, BOB}, - asset_hub_kusama::ED as ASSET_HUB_KUSAMA_ED, - kusama::ED as KUSAMA_ED, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, - }, - lazy_static::lazy_static, - xcm_transact_paid_execution, xcm_transact_unpaid_execution, AssetHubKusama, - AssetHubKusamaPallet, AssetHubKusamaReceiver, AssetHubKusamaSender, BridgeHubKusama, - BridgeHubKusamaPallet, BridgeHubKusamaReceiver, BridgeHubKusamaSender, BridgeHubPolkadot, - BridgeHubPolkadotPallet, BridgeHubPolkadotReceiver, BridgeHubPolkadotSender, Collectives, - CollectivesPallet, CollectivesReceiver, CollectivesSender, Kusama, KusamaMockNet, KusamaPallet, - KusamaReceiver, KusamaSender, PenpalKusamaA, PenpalKusamaAPallet, PenpalKusamaAReceiver, - PenpalKusamaASender, PenpalKusamaB, PenpalKusamaBPallet, PenpalKusamaBReceiver, - PenpalKusamaBSender, PenpalPolkadotA, PenpalPolkadotAReceiver, PenpalPolkadotASender, Polkadot, - PolkadotMockNet, PolkadotPallet, PolkadotReceiver, PolkadotSender, -}; -pub use parachains_common::{AccountId, Balance}; -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use polkadot_parachain::primitives::{HrmpChannelId, Id}; -pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueueId}; -pub use xcm::{ - prelude::*, - v3::{Error, NetworkId::Kusama as KusamaId}, - DoubleEncoded, -}; -pub use xcm_emulator::{ - assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, - AccountId32Junction, Chain, ParaId, Parachain as Para, RelayChain as Relay, Test, TestArgs, - TestContext, TestExt, TestExternalities, -}; - -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -// `Assets` pallet index -pub const ASSETS_PALLET_ID: u8 = 50; - -pub type RelayToSystemParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; - -/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests -pub fn relay_test_args(amount: Balance) -> TestArgs { - TestArgs { - dest: Kusama::child_location_of(AssetHubKusama::para_id()), - beneficiary: AccountId32Junction { - network: None, - id: AssetHubKusamaReceiver::get().into(), - } - .into(), - amount, - assets: (Here, amount).into(), - asset_id: None, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -/// Returns a `TestArgs` instance to de used for the System Parachain accross integraton tests -pub fn system_para_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, - assets: MultiAssets, - asset_id: Option, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets, - asset_id, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -#[cfg(test)] -mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/hrmp_channels.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/hrmp_channels.rs deleted file mode 100644 index 9d0bd50502e9..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/hrmp_channels.rs +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -const MAX_CAPACITY: u32 = 8; -const MAX_MESSAGE_SIZE: u32 = 8192; - -/// Opening HRMP channels between Parachains should work -#[test] -fn open_hrmp_channel_between_paras_works() { - // Parchain A init values - let para_a_id = PenpalKusamaA::para_id(); - let para_a_root_origin = ::RuntimeOrigin::root(); - - // Parachain B init values - let para_b_id = PenpalKusamaB::para_id(); - let para_b_root_origin = ::RuntimeOrigin::root(); - - let fee_amount = KUSAMA_ED * 1000; - let fund_amount = KUSAMA_ED * 1000_000_000; - - // Fund Parachain's Sovereign accounts to be able to reserve the deposit - let para_a_sovereign_account = Kusama::fund_para_sovereign(fund_amount, para_a_id); - let para_b_sovereign_account = Kusama::fund_para_sovereign(fund_amount, para_b_id); - - let relay_destination: VersionedMultiLocation = PenpalKusamaA::parent_location().into(); - - // ---- Init Open channel from Parachain to System Parachain - let mut call = Kusama::init_open_channel_call(para_b_id, MAX_CAPACITY, MAX_MESSAGE_SIZE); - let origin_kind = OriginKind::Native; - let native_asset: MultiAsset = (Here, fee_amount).into(); - let beneficiary = Kusama::sovereign_account_id_of_child_para(para_a_id); - - let mut xcm = xcm_transact_paid_execution(call, origin_kind, native_asset.clone(), beneficiary); - - PenpalKusamaA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - para_a_root_origin, - bx!(relay_destination.clone()), - bx!(xcm), - )); - }); - - Kusama::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - Kusama::assert_ump_queue_processed( - true, - Some(para_a_id), - Some(Weight::from_parts(1_312_558_000, 200000)), - ); - - assert_expected_events!( - Kusama, - vec![ - // Parachain's Sovereign account balance is withdrawn to pay XCM fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == para_a_sovereign_account.clone(), - amount: *amount == fee_amount, - }, - // Sender deposit is reserved for Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == para_a_sovereign_account, - }, - // Open channel requested from Para A to Para B - RuntimeEvent::Hrmp( - polkadot_runtime_parachains::hrmp::Event::OpenChannelRequested( - sender, recipient, max_capacity, max_message_size - ) - ) => { - sender: *sender == para_a_id.into(), - recipient: *recipient == para_b_id.into(), - max_capacity: *max_capacity == MAX_CAPACITY, - max_message_size: *max_message_size == MAX_MESSAGE_SIZE, - }, - ] - ); - }); - - // ---- Accept Open channel from Parachain to System Parachain - call = Kusama::accept_open_channel_call(para_a_id); - let beneficiary = Kusama::sovereign_account_id_of_child_para(para_b_id); - - xcm = xcm_transact_paid_execution(call, origin_kind, native_asset, beneficiary); - - PenpalKusamaB::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - para_b_root_origin, - bx!(relay_destination), - bx!(xcm), - )); - }); - - Kusama::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - Kusama::assert_ump_queue_processed( - true, - Some(para_b_id), - Some(Weight::from_parts(1_312_558_000, 200_000)), - ); - - assert_expected_events!( - Kusama, - vec![ - // Parachain's Sovereign account balance is withdrawn to pay XCM fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == para_b_sovereign_account.clone(), - amount: *amount == fee_amount, - }, - // Sender deposit is reserved for Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == para_b_sovereign_account, - }, - // Open channel accepted for Para A to Para B - RuntimeEvent::Hrmp( - polkadot_runtime_parachains::hrmp::Event::OpenChannelAccepted( - sender, recipient - ) - ) => { - sender: *sender == para_a_id.into(), - recipient: *recipient == para_b_id.into(), - }, - ] - ); - }); - - Kusama::force_process_hrmp_open(para_a_id, para_b_id); -} - -/// Opening HRMP channels between System Parachains and Parachains should work -#[test] -fn force_open_hrmp_channel_for_system_para_works() { - // Relay Chain init values - let relay_root_origin = ::RuntimeOrigin::root(); - - // System Para init values - let system_para_id = AssetHubKusama::para_id(); - - // Parachain A init values - let para_a_id = PenpalKusamaA::para_id(); - - let fund_amount = KUSAMA_ED * 1000_000_000; - - // Fund Parachain's Sovereign accounts to be able to reserve the deposit - let para_a_sovereign_account = Kusama::fund_para_sovereign(fund_amount, para_a_id); - let system_para_sovereign_account = Kusama::fund_para_sovereign(fund_amount, system_para_id); - - Kusama::execute_with(|| { - assert_ok!(::Hrmp::force_open_hrmp_channel( - relay_root_origin, - system_para_id, - para_a_id, - MAX_CAPACITY, - MAX_MESSAGE_SIZE - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Kusama, - vec![ - // Sender deposit is reserved for System Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == system_para_sovereign_account, - }, - // Recipient deposit is reserved for Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == para_a_sovereign_account, - }, - // HRMP channel forced opened - RuntimeEvent::Hrmp( - polkadot_runtime_parachains::hrmp::Event::HrmpChannelForceOpened( - sender, recipient, max_capacity, max_message_size - ) - ) => { - sender: *sender == system_para_id.into(), - recipient: *recipient == para_a_id.into(), - max_capacity: *max_capacity == MAX_CAPACITY, - max_message_size: *max_message_size == MAX_MESSAGE_SIZE, - }, - ] - ); - }); - - Kusama::force_process_hrmp_open(system_para_id, para_a_id); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs deleted file mode 100644 index 00e0a663e479..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod hrmp_channels; -mod reserve_transfer; -mod send; -mod set_xcm_versions; -mod teleport; diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs deleted file mode 100644 index 9e11830acce2..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/reserve_transfer.rs +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -fn relay_origin_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - Kusama::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(630_092_000, 6_196))); - - assert_expected_events!( - Kusama, - vec![ - // Amount to reserve transfer is transferred to System Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Transfer { from, to, amount }) => { - from: *from == t.sender.account_id, - to: *to == Kusama::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn system_para_dest_assertions_incomplete(_t: RelayToSystemParaTest) { - AssetHubKusama::assert_dmp_queue_incomplete( - Some(Weight::from_parts(1_000_000_000, 0)), - Some(Error::UntrustedReserveLocation), - ); -} - -fn system_para_to_relay_assertions(_t: SystemParaToRelayTest) { - AssetHubKusama::assert_xcm_pallet_attempted_error(Some(XcmError::Barrier)) -} - -fn system_para_to_para_assertions(t: SystemParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubKusama::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 630_092_000, - 6_196, - ))); - - assert_expected_events!( - AssetHubKusama, - vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereing account - RuntimeEvent::Balances( - pallet_balances::Event::Transfer { from, to, amount } - ) => { - from: *from == t.sender.account_id, - to: *to == AssetHubKusama::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn system_para_to_para_assets_assertions(t: SystemParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubKusama::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 676_119_000, - 6196, - ))); - - assert_expected_events!( - AssetHubKusama, - vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereing account - RuntimeEvent::Assets( - pallet_assets::Event::Transferred { asset_id, from, to, amount } - ) => { - asset_id: *asset_id == ASSET_ID, - from: *from == t.sender.account_id, - to: *to == AssetHubKusama::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn relay_limited_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn relay_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_limited_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn system_para_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_to_para_limited_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn system_para_to_para_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { - ::PolkadotXcm::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -/// Limited Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't -/// work -#[test] -fn limited_reserve_transfer_native_asset_from_relay_to_system_para_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = KUSAMA_ED * 1000; - let test_args = TestContext { - sender: KusamaSender::get(), - receiver: AssetHubKusamaReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(system_para_dest_assertions_incomplete); - test.set_dispatchable::(relay_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Limited Reserve Transfers of native asset from System Parachain to Relay Chain shoudln't work -#[test] -fn limited_reserve_transfer_native_asset_from_system_para_to_relay_fails() { - // Init values for System Parachain - let destination = AssetHubKusama::parent_location(); - let beneficiary_id = KusamaReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: KusamaReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(system_para_to_relay_assertions); - test.set_dispatchable::(system_para_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't work -#[test] -fn reserve_transfer_native_asset_from_relay_to_system_para_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = KUSAMA_ED * 1000; - let test_args = TestContext { - sender: KusamaSender::get(), - receiver: AssetHubKusamaReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(system_para_dest_assertions_incomplete); - test.set_dispatchable::(relay_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Reserve Transfers of native asset from System Parachain to Relay Chain shouldn't work -#[test] -fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { - // Init values for System Parachain - let destination = AssetHubKusama::parent_location(); - let beneficiary_id = KusamaReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: KusamaReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(system_para_to_relay_assertions); - test.set_dispatchable::(system_para_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Limited Reserve Transfers of native asset from System Parachain to Parachain should work -#[test] -fn limited_reserve_transfer_native_asset_from_system_para_to_para() { - // Init values for System Parachain - let destination = AssetHubKusama::sibling_location_of(PenpalKusamaA::para_id()); - let beneficiary_id = PenpalKusamaAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: PenpalKusamaAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - - test.set_assertion::(system_para_to_para_assertions); - // TODO: Add assertion for Penpal runtime. Right now message is failing with - // `UntrustedReserveLocation` - test.set_dispatchable::(system_para_to_para_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve - // transfers -} - -/// Reserve Transfers of native asset from System Parachain to Parachain should work -#[test] -fn reserve_transfer_native_asset_from_system_para_to_para() { - // Init values for System Parachain - let destination = AssetHubKusama::sibling_location_of(PenpalKusamaA::para_id()); - let beneficiary_id = PenpalKusamaAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: PenpalKusamaAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - - test.set_assertion::(system_para_to_para_assertions); - // TODO: Add assertion for Penpal runtime. Right now message is failing with - // `UntrustedReserveLocation` - test.set_dispatchable::(system_para_to_para_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve - // transfers -} - -/// Limited Reserve Transfers of a local asset from System Parachain to Parachain should work -#[test] -fn limited_reserve_transfer_asset_from_system_para_to_para() { - // Force create asset from Relay Chain and mint assets for System Parachain's sender account - AssetHubKusama::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - AssetHubKusamaSender::get(), - ASSET_MIN_BALANCE * 1000000, - ); - - // Init values for System Parachain - let destination = AssetHubKusama::sibling_location_of(PenpalKusamaA::para_id()); - let beneficiary_id = PenpalKusamaAReceiver::get(); - let amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send) - .into(); - - let system_para_test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: PenpalKusamaAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut system_para_test = SystemParaToParaTest::new(system_para_test_args); - - system_para_test.set_assertion::(system_para_to_para_assets_assertions); - // TODO: Add assertions when Penpal is able to manage assets - system_para_test - .set_dispatchable::(system_para_to_para_limited_reserve_transfer_assets); - system_para_test.assert(); -} - -/// Reserve Transfers of a local asset from System Parachain to Parachain should work -#[test] -fn reserve_transfer_asset_from_system_para_to_para() { - // Force create asset from Relay Chain and mint assets for System Parachain's sender account - AssetHubKusama::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - AssetHubKusamaSender::get(), - ASSET_MIN_BALANCE * 1000000, - ); - - // Init values for System Parachain - let destination = AssetHubKusama::sibling_location_of(PenpalKusamaA::para_id()); - let beneficiary_id = PenpalKusamaAReceiver::get(); - let amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send) - .into(); - - let system_para_test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: PenpalKusamaAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut system_para_test = SystemParaToParaTest::new(system_para_test_args); - - system_para_test.set_assertion::(system_para_to_para_assets_assertions); - // TODO: Add assertions when Penpal is able to manage assets - system_para_test - .set_dispatchable::(system_para_to_para_reserve_transfer_assets); - system_para_test.assert(); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/send.rs deleted file mode 100644 index 8b92447f11ff..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/send.rs +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -/// Relay Chain should be able to execute `Transact` instructions in System Parachain -/// when `OriginKind::Superuser` and signer is `sudo` -#[test] -fn send_transact_sudo_from_relay_to_system_para_works() { - // Init tests variables - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = Kusama::child_location_of(AssetHubKusama::para_id()).into(); - let asset_owner: AccountId = AssetHubKusamaSender::get().into(); - let xcm = AssetHubKusama::force_create_asset_xcm( - OriginKind::Superuser, - ASSET_ID, - asset_owner.clone(), - true, - 1000, - ); - // Send XCM message from Relay Chain - Kusama::execute_with(|| { - assert_ok!(::XcmPallet::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - Kusama::assert_xcm_pallet_sent(); - }); - - // Receive XCM message in Assets Parachain - AssetHubKusama::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubKusama::assert_dmp_queue_complete(Some(Weight::from_parts(1_019_445_000, 200_000))); - - assert_expected_events!( - AssetHubKusama, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::ForceCreated { asset_id, owner }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == asset_owner, - }, - ] - ); - - assert!(::Assets::asset_exists(ASSET_ID)); - }); -} - -/// Relay Chain shouldn't be able to execute `Transact` instructions in System Parachain -/// when `OriginKind::Native` -#[test] -fn send_transact_native_from_relay_to_system_para_fails() { - // Init tests variables - let signed_origin = ::RuntimeOrigin::signed(KusamaSender::get().into()); - let system_para_destination = Kusama::child_location_of(AssetHubKusama::para_id()).into(); - let asset_owner = AssetHubKusamaSender::get().into(); - let xcm = AssetHubKusama::force_create_asset_xcm( - OriginKind::Native, - ASSET_ID, - asset_owner, - true, - 1000, - ); - - // Send XCM message from Relay Chain - Kusama::execute_with(|| { - assert_err!( - ::XcmPallet::send( - signed_origin, - bx!(system_para_destination), - bx!(xcm) - ), - DispatchError::BadOrigin - ); - }); -} - -/// System Parachain shouldn't be able to execute `Transact` instructions in Relay Chain -/// when `OriginKind::Native` -#[test] -fn send_transact_native_from_system_para_to_relay_fails() { - // Init tests variables - let signed_origin = - ::RuntimeOrigin::signed(AssetHubKusamaSender::get().into()); - let relay_destination = AssetHubKusama::parent_location().into(); - let call = ::RuntimeCall::System(frame_system::Call::< - ::Runtime, - >::remark_with_event { - remark: vec![0, 1, 2, 3], - }) - .encode() - .into(); - let origin_kind = OriginKind::Native; - - let xcm = xcm_transact_unpaid_execution(call, origin_kind); - - // Send XCM message from Relay Chain - AssetHubKusama::execute_with(|| { - assert_err!( - ::PolkadotXcm::send( - signed_origin, - bx!(relay_destination), - bx!(xcm) - ), - DispatchError::BadOrigin - ); - }); -} - -/// Parachain should be able to send XCM paying its fee with sufficient asset -/// in the System Parachain -#[test] -fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { - let para_sovereign_account = AssetHubKusama::sovereign_account_id_of( - AssetHubKusama::sibling_location_of(PenpalKusamaA::para_id()), - ); - - // Force create and mint assets for Parachain's sovereign account - AssetHubKusama::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - para_sovereign_account.clone(), - ASSET_MIN_BALANCE * 1000000000, - ); - - // We just need a call that can pass the `SafeCallFilter` - // Call values are not relevant - let call = AssetHubKusama::force_create_asset_call( - ASSET_ID, - para_sovereign_account.clone(), - true, - ASSET_MIN_BALANCE, - ); - - let origin_kind = OriginKind::SovereignAccount; - let fee_amount = ASSET_MIN_BALANCE * 1000000; - let native_asset = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into(); - - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = - PenpalKusamaA::sibling_location_of(AssetHubKusama::para_id()).into(); - let xcm = xcm_transact_paid_execution( - call, - origin_kind, - native_asset, - para_sovereign_account.clone(), - ); - - PenpalKusamaA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - AssetHubKusama::assert_xcm_pallet_sent(); - }); - - AssetHubKusama::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubKusama::assert_xcmp_queue_success(Some(Weight::from_parts(2_176_414_000, 203_593))); - - assert_expected_events!( - AssetHubKusama, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == para_sovereign_account, - balance: *balance == fee_amount, - }, - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { - asset_id: *asset_id == ASSET_ID, - }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/set_xcm_versions.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/set_xcm_versions.rs deleted file mode 100644 index 0ab53b451224..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/set_xcm_versions.rs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -#[test] -fn relay_sets_system_para_xcm_supported_version() { - // Init tests variables - let sudo_origin = ::RuntimeOrigin::root(); - let system_para_destination: MultiLocation = - Kusama::child_location_of(AssetHubKusama::para_id()); - - // Relay Chain sets supported version for Asset Parachain - Kusama::execute_with(|| { - assert_ok!(::XcmPallet::force_xcm_version( - sudo_origin, - bx!(system_para_destination), - XCM_V3 - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Kusama, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::SupportedVersionChanged { - location, - version: XCM_V3 - }) => { location: *location == system_para_destination, }, - ] - ); - }); -} - -#[test] -fn system_para_sets_relay_xcm_supported_version() { - // Init test variables - let sudo_origin = ::RuntimeOrigin::root(); - let parent_location = AssetHubKusama::parent_location(); - let system_para_destination: VersionedMultiLocation = - Kusama::child_location_of(AssetHubKusama::para_id()).into(); - let call = ::RuntimeCall::PolkadotXcm(pallet_xcm::Call::< - ::Runtime, - >::force_xcm_version { - location: bx!(parent_location), - version: XCM_V3, - }) - .encode() - .into(); - let origin_kind = OriginKind::Superuser; - - let xcm = xcm_transact_unpaid_execution(call, origin_kind); - - // System Parachain sets supported version for Relay Chain throught it - Kusama::execute_with(|| { - assert_ok!(::XcmPallet::send( - sudo_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - Kusama::assert_xcm_pallet_sent(); - }); - - // System Parachain receive the XCM message - AssetHubKusama::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubKusama::assert_dmp_queue_complete(Some(Weight::from_parts(1_019_210_000, 200_000))); - - assert_expected_events!( - AssetHubKusama, - vec![ - RuntimeEvent::PolkadotXcm(pallet_xcm::Event::SupportedVersionChanged { - location, - version: XCM_V3 - }) => { location: *location == parent_location, }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs deleted file mode 100644 index baaca92e051a..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-kusama/src/tests/teleport.rs +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -fn relay_origin_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - Kusama::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(631_531_000, 7_186))); - - assert_expected_events!( - Kusama, - vec![ - // Amount to teleport is withdrawn from Sender - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, - }, - // Amount to teleport is deposited in Relay's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { - who: *who == ::XcmPallet::check_account(), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn relay_dest_assertions(t: SystemParaToRelayTest) { - type RuntimeEvent = ::RuntimeEvent; - - Kusama::assert_ump_queue_processed( - true, - Some(AssetHubKusama::para_id()), - Some(Weight::from_parts(307_225_000, 7_186)), - ); - - assert_expected_events!( - Kusama, - vec![ - // Amount is witdrawn from Relay Chain's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == ::XcmPallet::check_account(), - amount: *amount == t.args.amount, - }, - // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, - }, - ] - ); -} - -fn relay_dest_assertions_fail(_t: SystemParaToRelayTest) { - Kusama::assert_ump_queue_processed( - false, - Some(AssetHubKusama::para_id()), - Some(Weight::from_parts(148_433_000, 3_593)), - ); -} - -fn para_origin_assertions(t: SystemParaToRelayTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubKusama::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 534_872_000, - 7_133, - ))); - - AssetHubKusama::assert_parachain_system_ump_sent(); - - assert_expected_events!( - AssetHubKusama, - vec![ - // Amount is withdrawn from Sender's account - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn para_dest_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubKusama::assert_dmp_queue_complete(Some(Weight::from_parts(165_592_000, 0))); - - assert_expected_events!( - AssetHubKusama, - vec![ - // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, - }, - ] - ); -} - -fn relay_limited_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::limited_teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn relay_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::limited_teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -// TODO: Uncomment when https://github.com/paritytech/polkadot/pull/7424 is merged -// fn system_para_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { -// ::PolkadotXcm::teleport_assets( -// t.signed_origin, -// bx!(t.args.dest), -// bx!(t.args.beneficiary), -// bx!(t.args.assets), -// t.args.fee_asset_item, -// ) -// } - -/// Limited Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn limited_teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = KUSAMA_ED * 1000; - let test_args = TestContext { - sender: KusamaSender::get(), - receiver: AssetHubKusamaReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Limited Teleport of native asset from System Parachain to Relay Chain -/// should work when there is enough balance in Relay Chain's `CheckAccount` -#[test] -fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { - // Dependency - Relay Chain's `CheckAccount` should have enough balance - limited_teleport_native_assets_from_relay_to_system_para_works(); - - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; - let destination = AssetHubKusama::parent_location(); - let beneficiary_id = KusamaReceiver::get(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: KusamaReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions); - test.set_dispatchable::(system_para_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Limited Teleport of native asset from System Parachain to Relay Chain -/// should't work when there is not enough balance in Relay Chain's `CheckAccount` -#[test] -fn limited_teleport_native_assets_from_system_para_to_relay_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; - let destination = AssetHubKusama::parent_location().into(); - let beneficiary_id = KusamaReceiver::get().into(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubKusamaSender::get(), - receiver: KusamaReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions_fail); - test.set_dispatchable::(system_para_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance does not change - assert_eq!(receiver_balance_after, receiver_balance_before); -} - -/// Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = KUSAMA_ED * 1000; - let test_args = TestContext { - sender: KusamaSender::get(), - receiver: AssetHubKusamaReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -// TODO: Uncomment when https://github.com/paritytech/polkadot/pull/7424 is merged - -// Right now it is failing in the Relay Chain with a -// `messageQueue.ProcessingFailed` event `error: Unsupported`. -// The reason is the `Weigher` in `pallet_xcm` is not properly calculating the `remote_weight` -// and it cause an `Overweight` error in `AllowTopLevelPaidExecutionFrom` barrier - -// /// Teleport of native asset from System Parachains to the Relay Chain -// /// should work when there is enough balance in Relay Chain's `CheckAccount` -// #[test] -// fn teleport_native_assets_back_from_system_para_to_relay_works() { -// // Dependency - Relay Chain's `CheckAccount` should have enough balance -// teleport_native_assets_from_relay_to_system_para_works(); - -// // Init values for Relay Chain -// let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; -// let test_args = TestContext { -// sender: AssetHubKusamaSender::get(), -// receiver: KusamaReceiver::get(), -// args: get_para_dispatch_args(amount_to_send), -// }; - -// let mut test = SystemParaToRelayTest::new(test_args); - -// let sender_balance_before = test.sender.balance; -// let receiver_balance_before = test.receiver.balance; - -// test.set_assertion::(para_origin_assertions); -// test.set_assertion::(relay_dest_assertions); -// test.set_dispatchable::(system_para_teleport_assets); -// test.assert(); - -// let sender_balance_after = test.sender.balance; -// let receiver_balance_after = test.receiver.balance; - -// // Sender's balance is reduced -// assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); -// // Receiver's balance is increased -// assert!(receiver_balance_after > receiver_balance_before); -// } - -// /// Teleport of native asset from System Parachain to Relay Chain -// /// shouldn't work when there is not enough balance in Relay Chain's `CheckAccount` -// #[test] -// fn teleport_native_assets_from_system_para_to_relay_fails() { -// // Init values for Relay Chain -// let amount_to_send: Balance = ASSET_HUB_KUSAMA_ED * 1000; -// let assets = (Parent, amount_to_send).into(); -// -// let test_args = TestContext { -// sender: AssetHubKusamaSender::get(), -// receiver: KusamaReceiver::get(), -// args: system_para_test_args(amount_to_send), -// assets, -// None -// }; - -// let mut test = SystemParaToRelayTest::new(test_args); - -// let sender_balance_before = test.sender.balance; -// let receiver_balance_before = test.receiver.balance; - -// test.set_assertion::(para_origin_assertions); -// test.set_assertion::(relay_dest_assertions); -// test.set_dispatchable::(system_para_teleport_assets); -// test.assert(); - -// let sender_balance_after = test.sender.balance; -// let receiver_balance_after = test.receiver.balance; - -// // Sender's balance is reduced -// assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); -// // Receiver's balance does not change -// assert_eq!(receiver_balance_after, receiver_balance_before); -// } diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/Cargo.toml b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/Cargo.toml deleted file mode 100644 index ceba1820d350..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/Cargo.toml +++ /dev/null @@ -1,37 +0,0 @@ -[package] -name = "asset-hub-polkadot-integration-tests" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Asset Hub Polkadot runtime integration tests with xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } - -# Substrate -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../../common" } -cumulus-pallet-dmp-queue = { path = "../../../../../pallets/dmp-queue" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../../../../pallets/parachain-system" } - -# Local -xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } -integration-tests-common = { default-features = false, path = "../../common" } diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs deleted file mode 100644 index 9d87458f876c..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/lib.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -pub use codec::Encode; -pub use frame_support::{ - assert_err, assert_ok, - instances::Instance1, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult, MultiAddress}, - traits::{fungibles::Inspect, OriginTrait}, -}; -pub use integration_tests_common::{ - constants::{ - accounts::{ALICE, BOB}, - asset_hub_polkadot::ED as ASSET_HUB_POLKADOT_ED, - polkadot::ED as POLKADOT_ED, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, - }, - lazy_static::lazy_static, - xcm_transact_paid_execution, xcm_transact_unpaid_execution, AssetHubPolkadot, - AssetHubPolkadotPallet, AssetHubPolkadotReceiver, AssetHubPolkadotSender, BridgeHubPolkadot, - BridgeHubPolkadotPallet, BridgeHubPolkadotReceiver, BridgeHubPolkadotSender, Collectives, - CollectivesPallet, CollectivesReceiver, CollectivesSender, PenpalPolkadotA, - PenpalPolkadotAPallet, PenpalPolkadotAReceiver, PenpalPolkadotASender, PenpalPolkadotB, - PenpalPolkadotBPallet, PenpalPolkadotBReceiver, PenpalPolkadotBSender, Polkadot, - PolkadotMockNet, PolkadotPallet, PolkadotReceiver, PolkadotSender, -}; -pub use parachains_common::{AccountId, Balance}; -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use polkadot_parachain::primitives::{HrmpChannelId, Id}; -pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueueId}; -pub use xcm::{ - prelude::*, - v3::{Error, NetworkId::Polkadot as PolkadotId}, - DoubleEncoded, -}; -pub use xcm_emulator::{ - assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, - AccountId32Junction, Chain, ParaId, Parachain as Para, RelayChain as Relay, Test, TestArgs, - TestContext, TestExt, TestExternalities, -}; - -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -// `Assets` pallet index -pub const ASSETS_PALLET_ID: u8 = 50; - -pub type RelayToSystemParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; - -/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests -pub fn relay_test_args(amount: Balance) -> TestArgs { - TestArgs { - dest: Polkadot::child_location_of(AssetHubPolkadot::para_id()), - beneficiary: AccountId32Junction { - network: None, - id: AssetHubPolkadotReceiver::get().into(), - } - .into(), - amount, - assets: (Here, amount).into(), - asset_id: None, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -/// Returns a `TestArgs` instance to de used for the System Parachain accross integraton tests -pub fn system_para_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, - assets: MultiAssets, - asset_id: Option, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets, - asset_id, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -#[cfg(test)] -mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/hrmp_channels.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/hrmp_channels.rs deleted file mode 100644 index e0cb340ddaa6..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/hrmp_channels.rs +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -const MAX_CAPACITY: u32 = 8; -const MAX_MESSAGE_SIZE: u32 = 8192; - -/// Opening HRMP channels between Parachains should work -#[test] -fn open_hrmp_channel_between_paras_works() { - // Parchain A init values - let para_a_id = PenpalPolkadotA::para_id(); - let para_a_root_origin = ::RuntimeOrigin::root(); - - // Parachain B init values - let para_b_id = PenpalPolkadotB::para_id(); - let para_b_root_origin = ::RuntimeOrigin::root(); - - let fee_amount = POLKADOT_ED * 1000; - let fund_amount = POLKADOT_ED * 1000_000_000; - - // Fund Parachain's Sovereign accounts to be able to reserve the deposit - let para_a_sovereign_account = Polkadot::fund_para_sovereign(fund_amount, para_a_id); - let para_b_sovereign_account = Polkadot::fund_para_sovereign(fund_amount, para_b_id); - - let relay_destination: VersionedMultiLocation = PenpalPolkadotA::parent_location().into(); - - // ---- Init Open channel from Parachain to System Parachain - let mut call = Polkadot::init_open_channel_call(para_b_id, MAX_CAPACITY, MAX_MESSAGE_SIZE); - let origin_kind = OriginKind::Native; - let native_asset: MultiAsset = (Here, fee_amount).into(); - let beneficiary = Polkadot::sovereign_account_id_of_child_para(para_a_id); - - let mut xcm = xcm_transact_paid_execution(call, origin_kind, native_asset.clone(), beneficiary); - - PenpalPolkadotA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - para_a_root_origin, - bx!(relay_destination.clone()), - bx!(xcm), - )); - }); - - Polkadot::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - Polkadot::assert_ump_queue_processed( - true, - Some(para_a_id), - Some(Weight::from_parts(1_282_426_000, 207_186)), - ); - - assert_expected_events!( - Polkadot, - vec![ - // Parachain's Sovereign account balance is withdrawn to pay XCM fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == para_a_sovereign_account.clone(), - amount: *amount == fee_amount, - }, - // Sender deposit is reserved for Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == para_a_sovereign_account, - }, - // Open channel requested from Para A to Para B - RuntimeEvent::Hrmp( - polkadot_runtime_parachains::hrmp::Event::OpenChannelRequested( - sender, recipient, max_capacity, max_message_size - ) - ) => { - sender: *sender == para_a_id.into(), - recipient: *recipient == para_b_id.into(), - max_capacity: *max_capacity == MAX_CAPACITY, - max_message_size: *max_message_size == MAX_MESSAGE_SIZE, - }, - ] - ); - }); - - // ---- Accept Open channel from Parachain to System Parachain - call = Polkadot::accept_open_channel_call(para_a_id); - let beneficiary = Polkadot::sovereign_account_id_of_child_para(para_b_id); - - xcm = xcm_transact_paid_execution(call, origin_kind, native_asset, beneficiary); - - PenpalPolkadotB::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - para_b_root_origin, - bx!(relay_destination), - bx!(xcm), - )); - }); - - Polkadot::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - Polkadot::assert_ump_queue_processed( - true, - Some(para_b_id), - Some(Weight::from_parts(1_282_426_000, 207_186)), - ); - - assert_expected_events!( - Polkadot, - vec![ - // Parachain's Sovereign account balance is withdrawn to pay XCM fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == para_b_sovereign_account.clone(), - amount: *amount == fee_amount, - }, - // Sender deposit is reserved for Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == para_b_sovereign_account, - }, - // Open channel accepted for Para A to Para B - RuntimeEvent::Hrmp( - polkadot_runtime_parachains::hrmp::Event::OpenChannelAccepted( - sender, recipient - ) - ) => { - sender: *sender == para_a_id.into(), - recipient: *recipient == para_b_id.into(), - }, - ] - ); - }); - - Polkadot::force_process_hrmp_open(para_a_id, para_b_id); -} - -/// Opening HRMP channels between System Parachains and Parachains should work -#[test] -fn force_open_hrmp_channel_for_system_para_works() { - // Relay Chain init values - let relay_root_origin = ::RuntimeOrigin::root(); - - // System Para init values - let system_para_id = AssetHubPolkadot::para_id(); - - // Parachain A init values - let para_a_id = PenpalPolkadotA::para_id(); - - let fund_amount = POLKADOT_ED * 1000_000_000; - - // Fund Parachain's Sovereign accounts to be able to reserve the deposit - let system_para_sovereign_account = Polkadot::fund_para_sovereign(fund_amount, system_para_id); - let para_a_sovereign_account = Polkadot::fund_para_sovereign(fund_amount, para_a_id); - - Polkadot::execute_with(|| { - assert_ok!(::Hrmp::force_open_hrmp_channel( - relay_root_origin, - system_para_id, - para_a_id, - MAX_CAPACITY, - MAX_MESSAGE_SIZE - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Polkadot, - vec![ - // Sender deposit is reserved for System Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == system_para_sovereign_account, - }, - // Recipient deposit is reserved for Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Reserved { who, .. }) =>{ - who: *who == para_a_sovereign_account, - }, - // HRMP channel forced opened - RuntimeEvent::Hrmp( - polkadot_runtime_parachains::hrmp::Event::HrmpChannelForceOpened( - sender, recipient, max_capacity, max_message_size - ) - ) => { - sender: *sender == system_para_id.into(), - recipient: *recipient == para_a_id.into(), - max_capacity: *max_capacity == MAX_CAPACITY, - max_message_size: *max_message_size == MAX_MESSAGE_SIZE, - }, - ] - ); - }); - - Polkadot::force_process_hrmp_open(system_para_id, para_a_id); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs deleted file mode 100644 index 00e0a663e479..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod hrmp_channels; -mod reserve_transfer; -mod send; -mod set_xcm_versions; -mod teleport; diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs deleted file mode 100644 index 7d773a5865ea..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/reserve_transfer.rs +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -fn relay_origin_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - Polkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(629_384_000, 6_196))); - - assert_expected_events!( - Polkadot, - vec![ - // Amount to reserve transfer is transferred to System Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Transfer { from, to, amount }) => { - from: *from == t.sender.account_id, - to: *to == Polkadot::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn system_para_dest_assertions_incomplete(_t: RelayToSystemParaTest) { - AssetHubPolkadot::assert_dmp_queue_incomplete( - Some(Weight::from_parts(1_000_000_000, 0)), - Some(Error::UntrustedReserveLocation), - ); -} - -fn system_para_to_relay_assertions(_t: SystemParaToRelayTest) { - AssetHubPolkadot::assert_xcm_pallet_attempted_error(Some(XcmError::Barrier)) -} - -fn system_para_to_para_assertions(t: SystemParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubPolkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 676_119_000, - 6196, - ))); - - assert_expected_events!( - AssetHubPolkadot, - vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereing account - RuntimeEvent::Balances( - pallet_balances::Event::Transfer { from, to, amount } - ) => { - from: *from == t.sender.account_id, - to: *to == AssetHubPolkadot::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn system_para_to_para_assets_assertions(t: SystemParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubPolkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 676_119_000, - 6196, - ))); - - assert_expected_events!( - AssetHubPolkadot, - vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereing account - RuntimeEvent::Assets( - pallet_assets::Event::Transferred { asset_id, from, to, amount } - ) => { - asset_id: *asset_id == ASSET_ID, - from: *from == t.sender.account_id, - to: *to == AssetHubPolkadot::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn relay_limited_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn relay_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_limited_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn system_para_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_to_para_limited_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn system_para_to_para_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { - ::PolkadotXcm::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -/// Limited Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't -/// work -#[test] -fn limited_reserve_transfer_native_asset_from_relay_to_system_para_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = POLKADOT_ED * 1000; - let test_args = TestContext { - sender: PolkadotSender::get(), - receiver: AssetHubPolkadotReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(system_para_dest_assertions_incomplete); - test.set_dispatchable::(relay_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Limited Reserve Transfers of native asset from System Parachain to Relay Chain shoudln't work -#[test] -fn limited_reserve_transfer_native_asset_from_system_para_to_relay_fails() { - // Init values for System Parachain - let destination = AssetHubPolkadot::parent_location(); - let beneficiary_id = PolkadotReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PolkadotReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(system_para_to_relay_assertions); - test.set_dispatchable::(system_para_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't work -#[test] -fn reserve_transfer_native_asset_from_relay_to_system_para_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = POLKADOT_ED * 1000; - let test_args = TestContext { - sender: PolkadotSender::get(), - receiver: AssetHubPolkadotReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(system_para_dest_assertions_incomplete); - test.set_dispatchable::(relay_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Reserve Transfers of native asset from System Parachain to Relay Chain shouldn't work -#[test] -fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { - // Init values for System Parachain - let destination = AssetHubPolkadot::parent_location(); - let beneficiary_id = PolkadotReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PolkadotReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(system_para_to_relay_assertions); - test.set_dispatchable::(system_para_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Limited Reserve Transfers of native asset from System Parachain to Parachain should work -#[test] -fn limited_reserve_transfer_native_asset_from_system_para_to_para() { - // Init values for System Parachain - let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id()); - let beneficiary_id = PenpalPolkadotAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PenpalPolkadotAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - - test.set_assertion::(system_para_to_para_assertions); - // TODO: Add assertion for Penpal runtime. Right now message is failing with - // `UntrustedReserveLocation` - test.set_dispatchable::(system_para_to_para_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve - // transfers -} - -/// Reserve Transfers of native asset from System Parachain to Parachain should work -#[test] -fn reserve_transfer_native_asset_from_system_para_to_para() { - // Init values for System Parachain - let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id()); - let beneficiary_id = PenpalPolkadotAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PenpalPolkadotAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - - test.set_assertion::(system_para_to_para_assertions); - // TODO: Add assertion for Penpal runtime. Right now message is failing with - // `UntrustedReserveLocation` - test.set_dispatchable::(system_para_to_para_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve - // transfers -} - -/// Limited Reserve Transfers of a local asset from System Parachain to Parachain should work -#[test] -fn limited_reserve_transfer_asset_from_system_para_to_para() { - // Force create asset from Relay Chain and mint assets for System Parachain's sender account - AssetHubPolkadot::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - AssetHubPolkadotSender::get(), - ASSET_MIN_BALANCE * 1000000, - ); - - // Init values for System Parachain - let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id()); - let beneficiary_id = PenpalPolkadotAReceiver::get(); - let amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send) - .into(); - - let system_para_test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PenpalPolkadotAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut system_para_test = SystemParaToParaTest::new(system_para_test_args); - - system_para_test.set_assertion::(system_para_to_para_assets_assertions); - // TODO: Add assertions when Penpal is able to manage assets - system_para_test - .set_dispatchable::(system_para_to_para_limited_reserve_transfer_assets); - system_para_test.assert(); -} - -/// Reserve Transfers of a local asset from System Parachain to Parachain should work -#[test] -fn reserve_transfer_asset_from_system_para_to_para() { - // Force create asset from Relay Chain and mint assets for System Parachain's sender account - AssetHubPolkadot::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - AssetHubPolkadotSender::get(), - ASSET_MIN_BALANCE * 1000000, - ); - - // Init values for System Parachain - let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id()); - let beneficiary_id = PenpalPolkadotAReceiver::get(); - let amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send) - .into(); - - let system_para_test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PenpalPolkadotAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut system_para_test = SystemParaToParaTest::new(system_para_test_args); - - system_para_test.set_assertion::(system_para_to_para_assets_assertions); - // TODO: Add assertions when Penpal is able to manage assets - system_para_test - .set_dispatchable::(system_para_to_para_reserve_transfer_assets); - system_para_test.assert(); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/send.rs deleted file mode 100644 index ef34d1b4337d..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/send.rs +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -/// Relay Chain should be able to execute `Transact` instructions in System Parachain -/// when `OriginKind::Superuser` and signer is `sudo` -#[test] -fn send_transact_sudo_from_relay_to_system_para_works() { - // Init tests variables - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = Polkadot::child_location_of(AssetHubPolkadot::para_id()).into(); - let asset_owner: AccountId = AssetHubPolkadotSender::get().into(); - let xcm = AssetHubPolkadot::force_create_asset_xcm( - OriginKind::Superuser, - ASSET_ID, - asset_owner.clone(), - true, - 1000, - ); - // Send XCM message from Relay Chain - Polkadot::execute_with(|| { - assert_ok!(::XcmPallet::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - Polkadot::assert_xcm_pallet_sent(); - }); - - // Receive XCM message in Assets Parachain - AssetHubPolkadot::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubPolkadot::assert_dmp_queue_complete(Some(Weight::from_parts( - 1_019_445_000, - 200_000, - ))); - - assert_expected_events!( - AssetHubPolkadot, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::ForceCreated { asset_id, owner }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == asset_owner, - }, - ] - ); - - assert!(::Assets::asset_exists(ASSET_ID)); - }); -} - -/// Relay Chain shouldn't be able to execute `Transact` instructions in System Parachain -/// when `OriginKind::Native` -#[test] -fn send_transact_native_from_relay_to_system_para_fails() { - // Init tests variables - let signed_origin = ::RuntimeOrigin::signed(PolkadotSender::get().into()); - let system_para_destination = Polkadot::child_location_of(AssetHubPolkadot::para_id()).into(); - let asset_owner = AssetHubPolkadotSender::get().into(); - let xcm = AssetHubPolkadot::force_create_asset_xcm( - OriginKind::Native, - ASSET_ID, - asset_owner, - true, - 1000, - ); - - // Send XCM message from Relay Chain - Polkadot::execute_with(|| { - assert_err!( - ::XcmPallet::send( - signed_origin, - bx!(system_para_destination), - bx!(xcm) - ), - DispatchError::BadOrigin - ); - }); -} - -/// System Parachain shouldn't be able to execute `Transact` instructions in Relay Chain -/// when `OriginKind::Native` -#[test] -fn send_transact_native_from_system_para_to_relay_fails() { - // Init tests variables - let signed_origin = - ::RuntimeOrigin::signed(AssetHubPolkadotSender::get().into()); - let relay_destination = AssetHubPolkadot::parent_location().into(); - let call = ::RuntimeCall::System(frame_system::Call::< - ::Runtime, - >::remark_with_event { - remark: vec![0, 1, 2, 3], - }) - .encode() - .into(); - let origin_kind = OriginKind::Native; - - let xcm = xcm_transact_unpaid_execution(call, origin_kind); - - // Send XCM message from Relay Chain - AssetHubPolkadot::execute_with(|| { - assert_err!( - ::PolkadotXcm::send( - signed_origin, - bx!(relay_destination), - bx!(xcm) - ), - DispatchError::BadOrigin - ); - }); -} - -/// Parachain should be able to send XCM paying its fee with sufficient asset -/// in the System Parachain -#[test] -fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { - let para_sovereign_account = AssetHubPolkadot::sovereign_account_id_of( - AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id()), - ); - - // Force create and mint assets for Parachain's sovereign account - AssetHubPolkadot::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - para_sovereign_account.clone(), - ASSET_MIN_BALANCE * 1000000000, - ); - - // We just need a call that can pass the `SafeCallFilter` - // Call values are not relevant - let call = AssetHubPolkadot::force_create_asset_call( - ASSET_ID, - para_sovereign_account.clone(), - true, - ASSET_MIN_BALANCE, - ); - - let origin_kind = OriginKind::SovereignAccount; - let fee_amount = ASSET_MIN_BALANCE * 1000000; - let native_asset = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into(); - - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = - PenpalPolkadotA::sibling_location_of(AssetHubPolkadot::para_id()).into(); - let xcm = xcm_transact_paid_execution( - call, - origin_kind, - native_asset, - para_sovereign_account.clone(), - ); - - PenpalPolkadotA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - AssetHubPolkadot::assert_xcm_pallet_sent(); - }); - - AssetHubPolkadot::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubPolkadot::assert_xcmp_queue_success(Some(Weight::from_parts( - 2_176_414_000, - 203_593, - ))); - - assert_expected_events!( - AssetHubPolkadot, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == para_sovereign_account, - balance: *balance == fee_amount, - }, - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { - asset_id: *asset_id == ASSET_ID, - }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/set_xcm_versions.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/set_xcm_versions.rs deleted file mode 100644 index 84abf630e507..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/set_xcm_versions.rs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -#[test] -fn relay_sets_system_para_xcm_supported_version() { - // Init tests variables - let sudo_origin = ::RuntimeOrigin::root(); - let system_para_destination: MultiLocation = - Polkadot::child_location_of(AssetHubPolkadot::para_id()); - - // Relay Chain sets supported version for Asset Parachain - Polkadot::execute_with(|| { - assert_ok!(::XcmPallet::force_xcm_version( - sudo_origin, - bx!(system_para_destination), - XCM_V3 - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Polkadot, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::SupportedVersionChanged { - location, - version: XCM_V3 - }) => { location: *location == system_para_destination, }, - ] - ); - }); -} - -#[test] -fn system_para_sets_relay_xcm_supported_version() { - // Init test variables - let sudo_origin = ::RuntimeOrigin::root(); - let parent_location = AssetHubPolkadot::parent_location(); - let system_para_destination: VersionedMultiLocation = - Polkadot::child_location_of(AssetHubPolkadot::para_id()).into(); - let call = ::RuntimeCall::PolkadotXcm(pallet_xcm::Call::< - ::Runtime, - >::force_xcm_version { - location: bx!(parent_location), - version: XCM_V3, - }) - .encode() - .into(); - let origin_kind = OriginKind::Superuser; - - let xcm = xcm_transact_unpaid_execution(call, origin_kind); - - // System Parachain sets supported version for Relay Chain throught it - Polkadot::execute_with(|| { - assert_ok!(::XcmPallet::send( - sudo_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - Polkadot::assert_xcm_pallet_sent(); - }); - - // System Parachain receive the XCM message - AssetHubPolkadot::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubPolkadot::assert_dmp_queue_complete(Some(Weight::from_parts( - 1_019_210_000, - 200_000, - ))); - - assert_expected_events!( - AssetHubPolkadot, - vec![ - RuntimeEvent::PolkadotXcm(pallet_xcm::Event::SupportedVersionChanged { - location, - version: XCM_V3 - }) => { location: *location == parent_location, }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs deleted file mode 100644 index 5d40e5d3538f..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-polkadot/src/tests/teleport.rs +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -fn relay_origin_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - Polkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(632_207_000, 7_186))); - - assert_expected_events!( - Polkadot, - vec![ - // Amount to teleport is withdrawn from Sender - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, - }, - // Amount to teleport is deposited in Relay's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { - who: *who == ::XcmPallet::check_account(), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn relay_dest_assertions(t: SystemParaToRelayTest) { - type RuntimeEvent = ::RuntimeEvent; - - Polkadot::assert_ump_queue_processed( - true, - Some(AssetHubPolkadot::para_id()), - Some(Weight::from_parts(368_931_000, 7_186)), - ); - - assert_expected_events!( - Polkadot, - vec![ - // Amount is witdrawn from Relay Chain's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == ::XcmPallet::check_account(), - amount: *amount == t.args.amount, - }, - // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, - }, - ] - ); -} - -fn relay_dest_assertions_fail(_t: SystemParaToRelayTest) { - Polkadot::assert_ump_queue_processed( - false, - Some(AssetHubPolkadot::para_id()), - Some(Weight::from_parts(232_982_000, 3_593)), - ); -} - -fn para_origin_assertions(t: SystemParaToRelayTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubPolkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 632_207_000, - 7_186, - ))); - - AssetHubPolkadot::assert_parachain_system_ump_sent(); - - assert_expected_events!( - AssetHubPolkadot, - vec![ - // Amount is withdrawn from Sender's account - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn para_dest_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubPolkadot::assert_dmp_queue_complete(Some(Weight::from_parts(161_196_000, 0))); - - assert_expected_events!( - AssetHubPolkadot, - vec![ - // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, - }, - ] - ); -} - -fn relay_limited_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::limited_teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn relay_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::limited_teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -// TODO: Uncomment when https://github.com/paritytech/polkadot/pull/7424 is merged -// fn system_para_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { -// ::PolkadotXcm::teleport_assets( -// t.signed_origin, -// bx!(t.args.dest), -// bx!(t.args.beneficiary), -// bx!(t.args.assets), -// t.args.fee_asset_item, -// ) -// } - -/// Limited Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn limited_teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = POLKADOT_ED * 1000; - let test_args = TestContext { - sender: PolkadotSender::get(), - receiver: AssetHubPolkadotReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Limited Teleport of native asset from System Parachain to Relay Chain -/// should work when there is enough balance in Relay Chain's `CheckAccount` -#[test] -fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { - // Dependency - Relay Chain's `CheckAccount` should have enough balance - limited_teleport_native_assets_from_relay_to_system_para_works(); - - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; - let destination = AssetHubPolkadot::parent_location(); - let beneficiary_id = PolkadotReceiver::get(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PolkadotReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions); - test.set_dispatchable::(system_para_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Limited Teleport of native asset from System Parachain to Relay Chain -/// should't work when there is not enough balance in Relay Chain's `CheckAccount` -#[test] -fn limited_teleport_native_assets_from_system_para_to_relay_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; - let destination = AssetHubPolkadot::parent_location().into(); - let beneficiary_id = PolkadotReceiver::get().into(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubPolkadotSender::get(), - receiver: PolkadotReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions_fail); - test.set_dispatchable::(system_para_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance does not change - assert_eq!(receiver_balance_after, receiver_balance_before); -} - -/// Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = POLKADOT_ED * 1000; - let test_args = TestContext { - sender: PolkadotSender::get(), - receiver: AssetHubPolkadotReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -// TODO: Uncomment when https://github.com/paritytech/polkadot/pull/7424 is merged - -// Right now it is failing in the Relay Chain with a -// `messageQueue.ProcessingFailed` event `error: Unsupported`. -// The reason is the `Weigher` in `pallet_xcm` is not properly calculating the `remote_weight` -// and it cause an `Overweight` error in `AllowTopLevelPaidExecutionFrom` barrier - -// /// Teleport of native asset from System Parachains to the Relay Chain -// /// should work when there is enough balance in Relay Chain's `CheckAccount` -// #[test] -// fn teleport_native_assets_back_from_system_para_to_relay_works() { -// // Dependency - Relay Chain's `CheckAccount` should have enough balance -// teleport_native_assets_from_relay_to_system_para_works(); - -// // Init values for Relay Chain -// let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; -// let test_args = TestContext { -// sender: AssetHubPolkadotSender::get(), -// receiver: PolkadotReceiver::get(), -// args: get_para_dispatch_args(amount_to_send), -// }; - -// let mut test = SystemParaToRelayTest::new(test_args); - -// let sender_balance_before = test.sender.balance; -// let receiver_balance_before = test.receiver.balance; - -// test.set_assertion::(para_origin_assertions); -// test.set_assertion::(relay_dest_assertions); -// test.set_dispatchable::(system_para_teleport_assets); -// test.assert(); - -// let sender_balance_after = test.sender.balance; -// let receiver_balance_after = test.receiver.balance; - -// // Sender's balance is reduced -// assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); -// // Receiver's balance is increased -// assert!(receiver_balance_after > receiver_balance_before); -// } - -// /// Teleport of native asset from System Parachain to Relay Chain -// /// shouldn't work when there is not enough balance in Relay Chain's `CheckAccount` -// #[test] -// fn teleport_native_assets_from_system_para_to_relay_fails() { -// // Init values for Relay Chain -// let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000; -// let assets = (Parent, amount_to_send).into(); -// -// let test_args = TestContext { -// sender: AssetHubPolkadotSender::get(), -// receiver: PolkadotReceiver::get(), -// args: system_para_test_args(amount_to_send), -// assets, -// None -// }; - -// let mut test = SystemParaToRelayTest::new(test_args); - -// let sender_balance_before = test.sender.balance; -// let receiver_balance_before = test.receiver.balance; - -// test.set_assertion::(para_origin_assertions); -// test.set_assertion::(relay_dest_assertions); -// test.set_dispatchable::(system_para_teleport_assets); -// test.assert(); - -// let sender_balance_after = test.sender.balance; -// let receiver_balance_after = test.receiver.balance; - -// // Sender's balance is reduced -// assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); -// // Receiver's balance does not change -// assert_eq!(receiver_balance_after, receiver_balance_before); -// } diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/Cargo.toml deleted file mode 100644 index 6b2bb18ae8b7..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "asset-hub-westend-integration-tests" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Asset Hub Westend runtime integration tests with xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } -assert_matches = "1.5.0" - -# Substrate -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-asset-conversion = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../../common" } -asset-hub-westend-runtime = { path = "../../../../runtimes/assets/asset-hub-westend" } -cumulus-pallet-dmp-queue = { path = "../../../../../pallets/dmp-queue" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../../../../pallets/parachain-system" } - -# Local -xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } -integration-tests-common = { default-features = false, path = "../../common" } diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs deleted file mode 100644 index b7f064e7d6ea..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/lib.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -pub use codec::Encode; -pub use frame_support::{ - assert_err, assert_ok, - instances::{Instance1, Instance2}, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult, ModuleError, MultiAddress}, - traits::{fungibles::Inspect, OriginTrait}, - BoundedVec, -}; -pub use integration_tests_common::{ - constants::{ - accounts::{ALICE, BOB}, - asset_hub_westend::ED as ASSET_HUB_WESTEND_ED, - westend::ED as WESTEND_ED, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, - }, - lazy_static::lazy_static, - xcm_transact_paid_execution, xcm_transact_unpaid_execution, AssetHubWestend, - AssetHubWestendPallet, AssetHubWestendReceiver, AssetHubWestendSender, Collectives, - CollectivesPallet, CollectivesReceiver, CollectivesSender, PenpalWestendA, - PenpalWestendAPallet, PenpalWestendAReceiver, PenpalWestendASender, Westend, WestendMockNet, - WestendPallet, WestendReceiver, WestendSender, -}; -pub use parachains_common::{AccountId, Balance}; -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use polkadot_parachain::primitives::{HrmpChannelId, Id}; -pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueueId}; -pub use xcm::{ - prelude::*, - v3::{Error, NetworkId::Westend as WestendId}, - DoubleEncoded, -}; -pub use xcm_emulator::{ - assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, - AccountId32Junction, Chain, ParaId, Parachain as Para, RelayChain as Relay, Test, TestArgs, - TestContext, TestExt, TestExternalities, -}; - -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -// `Assets` pallet index -pub const ASSETS_PALLET_ID: u8 = 50; - -pub type RelayToSystemParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; - -/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests -pub fn relay_test_args(amount: Balance) -> TestArgs { - TestArgs { - dest: Westend::child_location_of(AssetHubWestend::para_id()), - beneficiary: AccountId32Junction { - network: None, - id: AssetHubWestendReceiver::get().into(), - } - .into(), - amount, - assets: (Here, amount).into(), - asset_id: None, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -/// Returns a `TestArgs` instance to de used for the System Parachain accross integraton tests -pub fn system_para_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, - assets: MultiAssets, - asset_id: Option, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets, - asset_id, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -#[cfg(test)] -mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs deleted file mode 100644 index e45b78da1c25..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod reserve_transfer; -mod send; -mod set_xcm_versions; -mod swap; -mod teleport; diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs deleted file mode 100644 index 8d3c5358a37f..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/reserve_transfer.rs +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -fn relay_origin_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - Westend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(629_384_000, 6_196))); - - assert_expected_events!( - Westend, - vec![ - // Amount to reserve transfer is transferred to System Parachain's Sovereign account - RuntimeEvent::Balances(pallet_balances::Event::Transfer { from, to, amount }) => { - from: *from == t.sender.account_id, - to: *to == Westend::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn system_para_dest_assertions_incomplete(_t: RelayToSystemParaTest) { - AssetHubWestend::assert_dmp_queue_incomplete( - Some(Weight::from_parts(1_000_000_000, 0)), - Some(Error::UntrustedReserveLocation), - ); -} - -fn system_para_to_relay_assertions(_t: SystemParaToRelayTest) { - AssetHubWestend::assert_xcm_pallet_attempted_error(Some(XcmError::Barrier)) -} - -fn system_para_to_para_assertions(t: SystemParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 676_119_000, - 6196, - ))); - - assert_expected_events!( - AssetHubWestend, - vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereing account - RuntimeEvent::Balances( - pallet_balances::Event::Transfer { from, to, amount } - ) => { - from: *from == t.sender.account_id, - to: *to == AssetHubWestend::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn system_para_to_para_assets_assertions(t: SystemParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 676_119_000, - 6196, - ))); - - assert_expected_events!( - AssetHubWestend, - vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereing account - RuntimeEvent::Assets( - pallet_assets::Event::Transferred { asset_id, from, to, amount } - ) => { - asset_id: *asset_id == ASSET_ID, - from: *from == t.sender.account_id, - to: *to == AssetHubWestend::sovereign_account_id_of( - t.args.dest - ), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn relay_limited_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn relay_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_limited_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn system_para_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_to_para_limited_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn system_para_to_para_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { - ::PolkadotXcm::reserve_transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -/// Limited Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't -/// work -#[test] -fn limited_reserve_transfer_native_asset_from_relay_to_system_para_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = WESTEND_ED * 1000; - let test_args = TestContext { - sender: WestendSender::get(), - receiver: AssetHubWestendReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(system_para_dest_assertions_incomplete); - test.set_dispatchable::(relay_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Limited Reserve Transfers of native asset from System Parachain to Relay Chain shoudln't work -#[test] -fn limited_reserve_transfer_native_asset_from_system_para_to_relay_fails() { - // Init values for System Parachain - let destination = AssetHubWestend::parent_location(); - let beneficiary_id = WestendReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: WestendReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(system_para_to_relay_assertions); - test.set_dispatchable::(system_para_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't work -#[test] -fn reserve_transfer_native_asset_from_relay_to_system_para_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = WESTEND_ED * 1000; - let test_args = TestContext { - sender: WestendSender::get(), - receiver: AssetHubWestendReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(system_para_dest_assertions_incomplete); - test.set_dispatchable::(relay_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Reserve Transfers of native asset from System Parachain to Relay Chain shouldn't work -#[test] -fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { - // Init values for System Parachain - let destination = AssetHubWestend::parent_location(); - let beneficiary_id = WestendReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: WestendReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(system_para_to_relay_assertions); - test.set_dispatchable::(system_para_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - assert_eq!(sender_balance_before, sender_balance_after); - assert_eq!(receiver_balance_before, receiver_balance_after); -} - -/// Limited Reserve Transfers of native asset from System Parachain to Parachain should work -#[test] -fn limited_reserve_transfer_native_asset_from_system_para_to_para() { - // Init values for System Parachain - let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id()); - let beneficiary_id = PenpalWestendAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: PenpalWestendAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - - test.set_assertion::(system_para_to_para_assertions); - // TODO: Add assertion for Penpal runtime. Right now message is failing with - // `UntrustedReserveLocation` - test.set_dispatchable::(system_para_to_para_limited_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve - // transfers -} - -/// Reserve Transfers of native asset from System Parachain to Parachain should work -#[test] -fn reserve_transfer_native_asset_from_system_para_to_para() { - // Init values for System Parachain - let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id()); - let beneficiary_id = PenpalWestendAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: PenpalWestendAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - - test.set_assertion::(system_para_to_para_assertions); - // TODO: Add assertion for Penpal runtime. Right now message is failing with - // `UntrustedReserveLocation` - test.set_dispatchable::(system_para_to_para_reserve_transfer_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve - // transfers -} - -/// Limited Reserve Transfers of a local asset from System Parachain to Parachain should work -#[test] -fn limited_reserve_transfer_asset_from_system_para_to_para() { - // Force create asset from Relay Chain and mint assets for System Parachain's sender account - AssetHubWestend::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - AssetHubWestendSender::get(), - ASSET_MIN_BALANCE * 1000000, - ); - - // Init values for System Parachain - let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id()); - let beneficiary_id = PenpalWestendAReceiver::get(); - let amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send) - .into(); - - let system_para_test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: PenpalWestendAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut system_para_test = SystemParaToParaTest::new(system_para_test_args); - - system_para_test.set_assertion::(system_para_to_para_assets_assertions); - // TODO: Add assertions when Penpal is able to manage assets - system_para_test - .set_dispatchable::(system_para_to_para_limited_reserve_transfer_assets); - system_para_test.assert(); -} - -/// Reserve Transfers of a local asset from System Parachain to Parachain should work -#[test] -fn reserve_transfer_asset_from_system_para_to_para() { - // Force create asset from Relay Chain and mint assets for System Parachain's sender account - AssetHubWestend::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - AssetHubWestendSender::get(), - ASSET_MIN_BALANCE * 1000000, - ); - - // Init values for System Parachain - let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id()); - let beneficiary_id = PenpalWestendAReceiver::get(); - let amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send) - .into(); - - let system_para_test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: PenpalWestendAReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut system_para_test = SystemParaToParaTest::new(system_para_test_args); - - system_para_test.set_assertion::(system_para_to_para_assets_assertions); - // TODO: Add assertions when Penpal is able to manage assets - system_para_test - .set_dispatchable::(system_para_to_para_reserve_transfer_assets); - system_para_test.assert(); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/send.rs deleted file mode 100644 index 24301fe1c7d2..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/send.rs +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -/// Relay Chain should be able to execute `Transact` instructions in System Parachain -/// when `OriginKind::Superuser` and signer is `sudo` -#[test] -fn send_transact_sudo_from_relay_to_system_para_works() { - // Init tests variables - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = Westend::child_location_of(AssetHubWestend::para_id()).into(); - let asset_owner: AccountId = AssetHubWestendSender::get().into(); - let xcm = AssetHubWestend::force_create_asset_xcm( - OriginKind::Superuser, - ASSET_ID, - asset_owner.clone(), - true, - 1000, - ); - // Send XCM message from Relay Chain - Westend::execute_with(|| { - assert_ok!(::XcmPallet::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - Westend::assert_xcm_pallet_sent(); - }); - - // Receive XCM message in Assets Parachain - AssetHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_dmp_queue_complete(Some(Weight::from_parts( - 1_019_445_000, - 200_000, - ))); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::ForceCreated { asset_id, owner }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == asset_owner, - }, - ] - ); - - assert!(::Assets::asset_exists(ASSET_ID)); - }); -} - -/// Parachain should be able to send XCM paying its fee with sufficient asset -/// in the System Parachain -#[test] -fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { - let para_sovereign_account = AssetHubWestend::sovereign_account_id_of( - AssetHubWestend::sibling_location_of(PenpalWestendA::para_id()), - ); - - // Force create and mint assets for Parachain's sovereign account - AssetHubWestend::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - para_sovereign_account.clone(), - ASSET_MIN_BALANCE * 1000000000, - ); - - // We just need a call that can pass the `SafeCallFilter` - // Call values are not relevant - let call = AssetHubWestend::force_create_asset_call( - ASSET_ID, - para_sovereign_account.clone(), - true, - ASSET_MIN_BALANCE, - ); - - let origin_kind = OriginKind::SovereignAccount; - let fee_amount = ASSET_MIN_BALANCE * 1000000; - let native_asset = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into(); - - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = - PenpalWestendA::sibling_location_of(AssetHubWestend::para_id()).into(); - let xcm = xcm_transact_paid_execution( - call, - origin_kind, - native_asset, - para_sovereign_account.clone(), - ); - - PenpalWestendA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - AssetHubWestend::assert_xcm_pallet_sent(); - }); - - AssetHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_xcmp_queue_success(Some(Weight::from_parts( - 2_176_414_000, - 203_593, - ))); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == para_sovereign_account, - balance: *balance == fee_amount, - }, - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { - asset_id: *asset_id == ASSET_ID, - }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/set_xcm_versions.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/set_xcm_versions.rs deleted file mode 100644 index 76e38083659e..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/set_xcm_versions.rs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -#[test] -fn relay_sets_system_para_xcm_supported_version() { - // Init tests variables - let sudo_origin = ::RuntimeOrigin::root(); - let system_para_destination: MultiLocation = - Westend::child_location_of(AssetHubWestend::para_id()); - - // Relay Chain sets supported version for Asset Parachain - Westend::execute_with(|| { - assert_ok!(::XcmPallet::force_xcm_version( - sudo_origin, - bx!(system_para_destination), - XCM_V3 - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Westend, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::SupportedVersionChanged { - location, - version: XCM_V3 - }) => { location: *location == system_para_destination, }, - ] - ); - }); -} - -#[test] -fn system_para_sets_relay_xcm_supported_version() { - // Init test variables - let sudo_origin = ::RuntimeOrigin::root(); - let parent_location = AssetHubWestend::parent_location(); - let system_para_destination: VersionedMultiLocation = - Westend::child_location_of(AssetHubWestend::para_id()).into(); - let call = ::RuntimeCall::PolkadotXcm(pallet_xcm::Call::< - ::Runtime, - >::force_xcm_version { - location: bx!(parent_location), - version: XCM_V3, - }) - .encode() - .into(); - let origin_kind = OriginKind::Superuser; - - let xcm = xcm_transact_unpaid_execution(call, origin_kind); - - // System Parachain sets supported version for Relay Chain throught it - Westend::execute_with(|| { - assert_ok!(::XcmPallet::send( - sudo_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - Westend::assert_xcm_pallet_sent(); - }); - - // System Parachain receive the XCM message - AssetHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_dmp_queue_complete(Some(Weight::from_parts( - 1_019_210_000, - 200_000, - ))); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::PolkadotXcm(pallet_xcm::Event::SupportedVersionChanged { - location, - version: XCM_V3 - }) => { location: *location == parent_location, }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/swap.rs deleted file mode 100644 index 03ac75146089..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/swap.rs +++ /dev/null @@ -1,337 +0,0 @@ -use crate::*; - -#[test] -fn swap_locally_on_chain_using_local_assets() { - let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocation::get()); - let asset_one = Box::new(MultiLocation { - parents: 0, - interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), - }); - - AssetHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_ok!(::Assets::create( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - ASSET_ID.into(), - AssetHubWestendSender::get().into(), - 1000, - )); - assert!(::Assets::asset_exists(ASSET_ID)); - - assert_ok!(::Assets::mint( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - ASSET_ID.into(), - AssetHubWestendSender::get().into(), - 3_000_000_000_000, - )); - - assert_ok!(::AssetConversion::create_pool( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), - asset_one.clone(), - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, - ] - ); - - assert_ok!(::AssetConversion::add_liquidity( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), - asset_one.clone(), - 1_000_000_000_000, - 2_000_000_000_000, - 0, - 0, - AssetHubWestendSender::get().into() - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {lp_token_minted, .. }) => { lp_token_minted: *lp_token_minted == 1414213562273, }, - ] - ); - - let path = BoundedVec::<_, _>::truncate_from(vec![asset_native.clone(), asset_one.clone()]); - - assert_ok!(::AssetConversion::swap_exact_tokens_for_tokens( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - path, - 100, - 1, - AssetHubWestendSender::get().into(), - true - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::SwapExecuted { amount_in, amount_out, .. }) => { - amount_in: *amount_in == 100, - amount_out: *amount_out == 199, - }, - ] - ); - - assert_ok!(::AssetConversion::remove_liquidity( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native, - asset_one, - 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. - 0, - 0, - AssetHubWestendSender::get().into(), - )); - }); -} - -#[test] -fn swap_locally_on_chain_using_foreign_assets() { - use frame_support::weights::WeightToFee; - - let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocation::get()); - - let foreign_asset1_at_asset_hub_westend = Box::new(MultiLocation { - parents: 1, - interior: X3( - Parachain(PenpalWestendA::para_id().into()), - PalletInstance(ASSETS_PALLET_ID), - GeneralIndex(ASSET_ID.into()), - ), - }); - - let assets_para_destination: VersionedMultiLocation = - MultiLocation { parents: 1, interior: X1(Parachain(AssetHubWestend::para_id().into())) } - .into(); - - let penpal_location = - MultiLocation { parents: 1, interior: X1(Parachain(PenpalWestendA::para_id().into())) }; - - // 1. Create asset on penpal: - PenpalWestendA::execute_with(|| { - assert_ok!(::Assets::create( - ::RuntimeOrigin::signed(PenpalWestendASender::get()), - ASSET_ID.into(), - PenpalWestendASender::get().into(), - 1000, - )); - - assert!(::Assets::asset_exists(ASSET_ID)); - }); - - // 2. Create foreign asset on asset_hub_westend: - - let require_weight_at_most = Weight::from_parts(1_100_000_000_000, 30_000); - let origin_kind = OriginKind::Xcm; - let sov_penpal_on_asset_hub_westend = AssetHubWestend::sovereign_account_id_of(penpal_location); - - AssetHubWestend::fund_accounts(vec![ - (AssetHubWestendSender::get().into(), 5_000_000 * WESTEND_ED), - (sov_penpal_on_asset_hub_westend.clone().into(), 1000_000_000_000_000_000 * WESTEND_ED), - ]); - - let sov_penpal_on_asset_hub_westend_as_location: MultiLocation = MultiLocation { - parents: 0, - interior: X1(AccountId32Junction { - network: None, - id: sov_penpal_on_asset_hub_westend.clone().into(), - }), - }; - - let call_foreign_assets_create = - ::RuntimeCall::ForeignAssets(pallet_assets::Call::< - ::Runtime, - Instance2, - >::create { - id: *foreign_asset1_at_asset_hub_westend, - min_balance: 1000, - admin: sov_penpal_on_asset_hub_westend.clone().into(), - }) - .encode() - .into(); - - let buy_execution_fee_amount = - asset_hub_westend_runtime::constants::fee::WeightToFee::weight_to_fee(&Weight::from_parts( - 10_100_000_000_000, - 300_000, - )); - let buy_execution_fee = MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }; - - let xcm = VersionedXcm::from(Xcm(vec![ - WithdrawAsset { 0: vec![buy_execution_fee.clone()].into() }, - BuyExecution { fees: buy_execution_fee.clone(), weight_limit: Unlimited }, - Transact { require_weight_at_most, origin_kind, call: call_foreign_assets_create }, - RefundSurplus, - DepositAsset { - assets: All.into(), - beneficiary: sov_penpal_on_asset_hub_westend_as_location, - }, - ])); - - // Send XCM message from penpal => asset_hub_westend - let sudo_penpal_origin = ::RuntimeOrigin::root(); - PenpalWestendA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - sudo_penpal_origin.clone(), - bx!(assets_para_destination.clone()), - bx!(xcm), - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - PenpalWestendA, - vec![ - RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent { .. }) => {}, - ] - ); - }); - - // Receive XCM message in Assets Parachain - AssetHubWestend::execute_with(|| { - assert!(::ForeignAssets::asset_exists( - *foreign_asset1_at_asset_hub_westend - )); - - // 3: Mint foreign asset on asset_hub_westend: - // - // (While it might be nice to use batch, - // currently that's disabled due to safe call filters.) - - type RuntimeEvent = ::RuntimeEvent; - // 3. Mint foreign asset (in reality this should be a teleport or some such) - assert_ok!(::ForeignAssets::mint( - ::RuntimeOrigin::signed( - sov_penpal_on_asset_hub_westend.clone().into() - ), - *foreign_asset1_at_asset_hub_westend, - sov_penpal_on_asset_hub_westend.clone().into(), - 3_000_000_000_000, - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, - ] - ); - - // 4. Create pool: - assert_ok!(::AssetConversion::create_pool( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), - foreign_asset1_at_asset_hub_westend.clone(), - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, - ] - ); - - // 5. Add liquidity: - assert_ok!(::AssetConversion::add_liquidity( - ::RuntimeOrigin::signed( - sov_penpal_on_asset_hub_westend.clone() - ), - asset_native.clone(), - foreign_asset1_at_asset_hub_westend.clone(), - 1_000_000_000_000, - 2_000_000_000_000, - 0, - 0, - sov_penpal_on_asset_hub_westend.clone().into() - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {lp_token_minted, .. }) => { - lp_token_minted: *lp_token_minted == 1414213562273, - }, - ] - ); - - // 6. Swap! - let path = BoundedVec::<_, _>::truncate_from(vec![ - asset_native.clone(), - foreign_asset1_at_asset_hub_westend.clone(), - ]); - - assert_ok!(::AssetConversion::swap_exact_tokens_for_tokens( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - path, - 100000, - 1000, - AssetHubWestendSender::get().into(), - true - )); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::SwapExecuted { amount_in, amount_out, .. },) => { - amount_in: *amount_in == 100000, - amount_out: *amount_out == 199399, - }, - ] - ); - - // 7. Remove liquidity - assert_ok!(::AssetConversion::remove_liquidity( - ::RuntimeOrigin::signed( - sov_penpal_on_asset_hub_westend.clone() - ), - asset_native, - foreign_asset1_at_asset_hub_westend, - 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. - 0, - 0, - sov_penpal_on_asset_hub_westend.clone().into(), - )); - }); -} - -#[test] -fn cannot_create_pool_from_pool_assets() { - let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocation::get()); - let mut asset_one = asset_hub_westend_runtime::xcm_config::PoolAssetsPalletLocation::get(); - asset_one.append_with(GeneralIndex(ASSET_ID.into())).expect("pool assets"); - - AssetHubWestend::execute_with(|| { - let pool_owner_account_id = asset_hub_westend_runtime::AssetConversionOrigin::get(); - - assert_ok!(::PoolAssets::create( - ::RuntimeOrigin::signed(pool_owner_account_id.clone()), - ASSET_ID.into(), - pool_owner_account_id.clone().into(), - 1000, - )); - assert!(::PoolAssets::asset_exists(ASSET_ID)); - - assert_ok!(::PoolAssets::mint( - ::RuntimeOrigin::signed(pool_owner_account_id), - ASSET_ID.into(), - AssetHubWestendSender::get().into(), - 3_000_000_000_000, - )); - - assert_matches::assert_matches!( - ::AssetConversion::create_pool( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), - Box::new(asset_one), - ), - Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("UnsupportedAsset")) - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs deleted file mode 100644 index 577f9ee85bd9..000000000000 --- a/cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend/src/tests/teleport.rs +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -fn relay_origin_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - Westend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(632_207_000, 7_186))); - - assert_expected_events!( - Westend, - vec![ - // Amount to teleport is withdrawn from Sender - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, - }, - // Amount to teleport is deposited in Relay's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { - who: *who == ::XcmPallet::check_account(), - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn relay_dest_assertions(t: SystemParaToRelayTest) { - type RuntimeEvent = ::RuntimeEvent; - - Westend::assert_ump_queue_processed( - true, - Some(AssetHubWestend::para_id()), - Some(Weight::from_parts(308_222_000, 7_186)), - ); - - assert_expected_events!( - Westend, - vec![ - // Amount is witdrawn from Relay Chain's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == ::XcmPallet::check_account(), - amount: *amount == t.args.amount, - }, - // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, - }, - ] - ); -} - -fn relay_dest_assertions_fail(_t: SystemParaToRelayTest) { - Westend::assert_ump_queue_processed( - false, - Some(AssetHubWestend::para_id()), - Some(Weight::from_parts(148_705_000, 3_593)), - ); -} - -fn para_origin_assertions(t: SystemParaToRelayTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 533_910_000, - 7167, - ))); - - AssetHubWestend::assert_parachain_system_ump_sent(); - - assert_expected_events!( - AssetHubWestend, - vec![ - // Amount is withdrawn from Sender's account - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, - }, - ] - ); -} - -fn para_dest_assertions(t: RelayToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_dmp_queue_complete(Some(Weight::from_parts(164_733_000, 0))); - - assert_expected_events!( - AssetHubWestend, - vec![ - // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, - }, - ] - ); -} - -fn relay_limited_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::limited_teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -fn relay_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - -fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::limited_teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - -// TODO: Uncomment when https://github.com/paritytech/polkadot/pull/7424 is merged -// fn system_para_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { -// ::PolkadotXcm::teleport_assets( -// t.signed_origin, -// bx!(t.args.dest), -// bx!(t.args.beneficiary), -// bx!(t.args.assets), -// t.args.fee_asset_item, -// ) -// } - -/// Limited Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn limited_teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = WESTEND_ED * 1000; - let test_args = TestContext { - sender: WestendSender::get(), - receiver: AssetHubWestendReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Limited Teleport of native asset from System Parachain to Relay Chain -/// should work when there is enough balance in Relay Chain's `CheckAccount` -#[test] -fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { - // Dependency - Relay Chain's `CheckAccount` should have enough balance - limited_teleport_native_assets_from_relay_to_system_para_works(); - - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let destination = AssetHubWestend::parent_location(); - let beneficiary_id = WestendReceiver::get(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: WestendReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions); - test.set_dispatchable::(system_para_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Limited Teleport of native asset from System Parachain to Relay Chain -/// should't work when there is not enough balance in Relay Chain's `CheckAccount` -#[test] -fn limited_teleport_native_assets_from_system_para_to_relay_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let destination = AssetHubWestend::parent_location().into(); - let beneficiary_id = WestendReceiver::get().into(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: WestendReceiver::get(), - args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions_fail); - test.set_dispatchable::(system_para_limited_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance does not change - assert_eq!(receiver_balance_after, receiver_balance_before); -} - -/// Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = WESTEND_ED * 1000; - let test_args = TestContext { - sender: WestendSender::get(), - receiver: AssetHubWestendReceiver::get(), - args: relay_test_args(amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -// TODO: Uncomment when https://github.com/paritytech/polkadot/pull/7424 is merged - -// Right now it is failing in the Relay Chain with a -// `messageQueue.ProcessingFailed` event `error: Unsupported`. -// The reason is the `Weigher` in `pallet_xcm` is not properly calculating the `remote_weight` -// and it cause an `Overweight` error in `AllowTopLevelPaidExecutionFrom` barrier - -// /// Teleport of native asset from System Parachains to the Relay Chain -// /// should work when there is enough balance in Relay Chain's `CheckAccount` -// #[test] -// fn teleport_native_assets_back_from_system_para_to_relay_works() { -// // Dependency - Relay Chain's `CheckAccount` should have enough balance -// teleport_native_assets_from_relay_to_system_para_works(); - -// // Init values for Relay Chain -// let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; -// let test_args = TestContext { -// sender: AssetHubWestendSender::get(), -// receiver: WestendReceiver::get(), -// args: get_para_dispatch_args(amount_to_send), -// }; - -// let mut test = SystemParaToRelayTest::new(test_args); - -// let sender_balance_before = test.sender.balance; -// let receiver_balance_before = test.receiver.balance; - -// test.set_assertion::(para_origin_assertions); -// test.set_assertion::(relay_dest_assertions); -// test.set_dispatchable::(system_para_teleport_assets); -// test.assert(); - -// let sender_balance_after = test.sender.balance; -// let receiver_balance_after = test.receiver.balance; - -// // Sender's balance is reduced -// assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); -// // Receiver's balance is increased -// assert!(receiver_balance_after > receiver_balance_before); -// } - -// /// Teleport of native asset from System Parachain to Relay Chain -// /// shouldn't work when there is not enough balance in Relay Chain's `CheckAccount` -// #[test] -// fn teleport_native_assets_from_system_para_to_relay_fails() { -// // Init values for Relay Chain -// let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; -// let assets = (Parent, amount_to_send).into(); -// -// let test_args = TestContext { -// sender: AssetHubWestendSender::get(), -// receiver: WestendReceiver::get(), -// args: system_para_test_args(amount_to_send), -// assets, -// None -// }; - -// let mut test = SystemParaToRelayTest::new(test_args); - -// let sender_balance_before = test.sender.balance; -// let receiver_balance_before = test.receiver.balance; - -// test.set_assertion::(para_origin_assertions); -// test.set_assertion::(relay_dest_assertions); -// test.set_dispatchable::(system_para_teleport_assets); -// test.assert(); - -// let sender_balance_after = test.sender.balance; -// let receiver_balance_after = test.receiver.balance; - -// // Sender's balance is reduced -// assert_eq!(sender_balance_before - amount_to_send, sender_balance_after); -// // Receiver's balance does not change -// assert_eq!(receiver_balance_after, receiver_balance_before); -// } diff --git a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/Cargo.toml deleted file mode 100644 index 901b3a99512b..000000000000 --- a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "bridge-hub-rococo-integration-tests" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Bridge Hub Rococo runtime integration tests with xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } - -# Substrate -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../../common" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../../../../pallets/parachain-system" } -pallet-bridge-messages = { default-features = false, path = "../../../../../bridges/modules/messages" } -bp-messages = { default-features = false, path = "../../../../../bridges/primitives/messages" } - -# Local -xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } -integration-tests-common = { default-features = false, path = "../../common" } diff --git a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/lib.rs deleted file mode 100644 index 2a4927d857c3..000000000000 --- a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/lib.rs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -pub use bp_messages::LaneId; -pub use codec::Encode; -pub use frame_support::{ - assert_err, assert_ok, - instances::Instance1, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult, MultiAddress}, - traits::{fungibles::Inspect, OriginTrait}, -}; -pub use integration_tests_common::{ - constants::{ - accounts::{ALICE, BOB}, - asset_hub_kusama::ED as ASSET_HUB_ROCOCO_ED, - kusama::ED as ROCOCO_ED, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, - }, - lazy_static::lazy_static, - xcm_transact_paid_execution, xcm_transact_unpaid_execution, AssetHubRococo, - AssetHubRococoPallet, AssetHubRococoReceiver, AssetHubRococoSender, AssetHubWococo, - AssetHubWococoPallet, AssetHubWococoReceiver, AssetHubWococoSender, BridgeHubRococo, - BridgeHubRococoPallet, BridgeHubRococoReceiver, BridgeHubRococoSender, BridgeHubWococo, - BridgeHubWococoPallet, BridgeHubWococoReceiver, BridgeHubWococoSender, Collectives, - CollectivesPallet, CollectivesReceiver, CollectivesSender, PenpalRococoA, PenpalRococoAPallet, - PenpalRococoAReceiver, PenpalRococoASender, Rococo, RococoMockNet, RococoPallet, - RococoReceiver, RococoSender, Wococo, WococoMockNet, WococoPallet, WococoReceiver, - WococoSender, -}; -pub use parachains_common::{AccountId, Balance}; -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use polkadot_parachain::primitives::{HrmpChannelId, Id}; -pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueueId}; -pub use xcm::{ - prelude::*, - v3::{ - Error, - NetworkId::{Rococo as RococoId, Wococo as WococoId}, - }, - DoubleEncoded, -}; -pub use xcm_emulator::{ - assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, - AccountId32Junction, Chain, ParaId, Parachain as Para, RelayChain as Relay, Test, TestArgs, - TestContext, TestExt, TestExternalities, -}; - -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -pub const ASSETS_PALLET_ID: u8 = 50; - -pub type RelayToSystemParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; - -/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests -pub fn relay_test_args(amount: Balance) -> TestArgs { - TestArgs { - dest: Rococo::child_location_of(AssetHubRococo::para_id()), - beneficiary: AccountId32Junction { - network: None, - id: AssetHubRococoReceiver::get().into(), - } - .into(), - amount, - assets: (Here, amount).into(), - asset_id: None, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -#[cfg(test)] -mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/tests/example.rs b/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/tests/example.rs deleted file mode 100644 index 5b11337a7e6c..000000000000 --- a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/tests/example.rs +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::*; - -#[test] -fn example() { - // Init tests variables - // XcmPallet send arguments - let sudo_origin = ::RuntimeOrigin::root(); - let destination = Rococo::child_location_of(BridgeHubRococo::para_id()).into(); - let weight_limit = WeightLimit::Unlimited; - let check_origin = None; - - let remote_xcm = Xcm(vec![ClearOrigin]); - - let xcm = VersionedXcm::from(Xcm(vec![ - UnpaidExecution { weight_limit, check_origin }, - ExportMessage { - network: WococoId, - destination: X1(Parachain(AssetHubWococo::para_id().into())), - xcm: remote_xcm, - }, - ])); - - //Rococo Global Consensus - // Send XCM message from Relay Chain to Bridge Hub source Parachain - Rococo::execute_with(|| { - assert_ok!(::XcmPallet::send( - sudo_origin, - bx!(destination), - bx!(xcm), - )); - - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - Rococo, - vec![ - RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, - ] - ); - }); - // Receive XCM message in Bridge Hub source Parachain - BridgeHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - BridgeHubRococo, - vec![ - RuntimeEvent::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { - outcome: Outcome::Complete(_), - .. - }) => {}, - RuntimeEvent::BridgeWococoMessages(pallet_bridge_messages::Event::MessageAccepted { - lane_id: LaneId([0, 0, 0, 1]), - nonce: 1, - }) => {}, - ] - ); - }); - - // Wococo GLobal Consensus - // Receive XCM message in Bridge Hub target Parachain - BridgeHubWococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - BridgeHubWococo, - vec![ - RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, - ] - ); - }); - // Receive embeded XCM message within `ExportMessage` in Parachain destination - AssetHubWococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - AssetHubWococo, - vec![ - RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::Fail { .. }) => {}, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/tests/mod.rs deleted file mode 100644 index 532e31aa1a67..000000000000 --- a/cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo/src/tests/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod example; diff --git a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/Cargo.toml b/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/Cargo.toml deleted file mode 100644 index 8663f4b0b4a3..000000000000 --- a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "collectives-polkadot-integration-tests" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Polkadot Collectives parachain runtime integration tests based on xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } - -# Substrate -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-core-fellowship = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-salary = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../../common" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../../../../pallets/parachain-system" } -collectives-polkadot-runtime = { path = "../../../../runtimes/collectives/collectives-polkadot" } -asset-hub-polkadot-runtime = { path = "../../../../runtimes/assets/asset-hub-polkadot" } - -# Local -xcm-emulator = { default-features = false, path = "../../../../../xcm/xcm-emulator" } -integration-tests-common = { default-features = false, path = "../../common" } diff --git a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/lib.rs b/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/lib.rs deleted file mode 100644 index b71ee65a2221..000000000000 --- a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/lib.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -pub use codec::Encode; -pub use frame_support::{ - assert_err, assert_ok, - instances::Instance1, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult, MultiAddress}, - traits::{fungibles::Inspect, OriginTrait}, -}; -pub use integration_tests_common::{ - constants::{ - accounts::{ALICE, BOB}, - asset_hub_polkadot::ED as ASSET_HUB_POLKADOT_ED, - polkadot::ED as POLKADOT_ED, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, - }, - lazy_static::lazy_static, - xcm_transact_paid_execution, xcm_transact_unpaid_execution, AssetHubPolkadot, - AssetHubPolkadotPallet, AssetHubPolkadotReceiver, AssetHubPolkadotSender, BridgeHubPolkadot, - BridgeHubPolkadotPallet, BridgeHubPolkadotReceiver, BridgeHubPolkadotSender, Collectives, - CollectivesPallet, CollectivesReceiver, CollectivesSender, PenpalPolkadotA, - PenpalPolkadotAPallet, PenpalPolkadotAReceiver, PenpalPolkadotASender, PenpalPolkadotB, - PenpalPolkadotBPallet, PenpalPolkadotBReceiver, PenpalPolkadotBSender, Polkadot, - PolkadotMockNet, PolkadotPallet, PolkadotReceiver, PolkadotSender, -}; -pub use parachains_common::{AccountId, Balance}; -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use polkadot_parachain::primitives::{HrmpChannelId, Id}; -pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueueId}; -pub use xcm::{ - prelude::*, - v3::{Error, NetworkId::Polkadot as PolkadotId}, - DoubleEncoded, -}; -pub use xcm_emulator::{ - assert_expected_events, bx, cumulus_pallet_dmp_queue, helpers::weight_within_threshold, - AccountId32Junction, Chain, ParaId, Parachain as Para, RelayChain as Relay, Test, TestArgs, - TestContext, TestExt, TestExternalities, -}; - -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -pub const ASSETS_PALLET_ID: u8 = 50; - -pub type RelayToSystemParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; - -/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests -pub fn relay_test_args(amount: Balance) -> TestArgs { - TestArgs { - dest: Polkadot::child_location_of(AssetHubPolkadot::para_id()), - beneficiary: AccountId32Junction { - network: None, - id: AssetHubPolkadotReceiver::get().into(), - } - .into(), - amount, - assets: (Here, amount).into(), - asset_id: None, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -/// Returns a `TestArgs` instance to de used for the System Parachain accross integraton tests -pub fn system_para_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, - assets: MultiAssets, - asset_id: Option, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets, - asset_id, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -#[cfg(test)] -mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs b/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs deleted file mode 100644 index e13090c1a51c..000000000000 --- a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/fellowship.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Integration tests concerning the Fellowship. - -use crate::*; -use collectives_polkadot_runtime::fellowship::FellowshipSalaryPaymaster; -use frame_support::traits::{ - fungibles::{Create, Mutate}, - tokens::Pay, -}; -use sp_core::crypto::Ss58Codec; -use xcm_emulator::TestExt; - -#[test] -fn pay_salary() { - let asset_id: u32 = 1984; - let pay_from: AccountId = - ::from_string("13w7NdvSR1Af8xsQTArDtZmVvjE8XhWNdL4yed3iFHrUNCnS") - .unwrap(); - let pay_to = Polkadot::account_id_of(ALICE); - let pay_amount = 9000; - - AssetHubPolkadot::execute_with(|| { - type AssetHubAssets = ::Assets; - - assert_ok!(>::create( - asset_id, - pay_to.clone(), - true, - pay_amount / 2 - )); - assert_ok!(>::mint_into(asset_id, &pay_from, pay_amount * 2)); - }); - - Collectives::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_ok!(FellowshipSalaryPaymaster::pay(&pay_to, (), pay_amount)); - assert_expected_events!( - Collectives, - vec![ - RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, - ] - ); - }); - - AssetHubPolkadot::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - AssetHubPolkadot, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::Transferred { asset_id: id, from, to, amount }) => { - asset_id: id == &asset_id, - from: from == &pay_from, - to: to == &pay_to, - amount: amount == &pay_amount, - }, - RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::Success { .. }) => {}, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/mod.rs deleted file mode 100644 index 1ede78b59799..000000000000 --- a/cumulus/parachains/integration-tests/emulated/collectives/collectives-polkadot/src/tests/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod fellowship; diff --git a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml deleted file mode 100644 index 6a0fa51e6b28..000000000000 --- a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml +++ /dev/null @@ -1,73 +0,0 @@ -[package] -name = "integration-tests-common" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Common resources for integration testing with xcm-emulator" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } -lazy_static = "1.4.0" -paste = "1.0.14" - -# Substrate -grandpa = { package = "sc-consensus-grandpa", git = "https://github.com/paritytech/substrate", branch = "master" } -sp-authority-discovery = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-support = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-weights = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-babe = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-assets = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-staking = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-message-queue = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-im-online = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -beefy-primitives = { package = "sp-consensus-beefy", git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-core-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-service = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master", features = ["full-node"] } -polkadot-primitives = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } -kusama-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -kusama-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } -rococo-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -rococo-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } -westend-runtime = { git = "https://github.com/paritytech/polkadot", branch = "master" } -westend-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } -pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -parachains-common = { path = "../../../common" } -parachain-info = { path = "../../../pallets/parachain-info" } -cumulus-primitives-core = { path = "../../../../primitives/core" } -penpal-runtime = { path = "../../../runtimes/testing/penpal" } -asset-hub-polkadot-runtime = { path = "../../../runtimes/assets/asset-hub-polkadot" } -asset-hub-kusama-runtime = { path = "../../../runtimes/assets/asset-hub-kusama" } -asset-hub-westend-runtime = { path = "../../../runtimes/assets/asset-hub-westend" } -collectives-polkadot-runtime = { path = "../../../runtimes/collectives/collectives-polkadot" } -bridge-hub-kusama-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-kusama" } -bridge-hub-polkadot-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-polkadot" } -bridge-hub-rococo-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-rococo" } -xcm-emulator = { default-features = false, path = "../../../../xcm/xcm-emulator" } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system" } -bp-messages = { path = "../../../../bridges/primitives/messages"} -bp-runtime = { path = "../../../../bridges/primitives/runtime"} -pallet-bridge-messages = { path = "../../../../bridges/modules/messages" } -bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common"} - -[features] -runtime-benchmarks = [ - "kusama-runtime/runtime-benchmarks", - "polkadot-runtime/runtime-benchmarks", - "westend-runtime/runtime-benchmarks", -] diff --git a/cumulus/parachains/integration-tests/emulated/common/src/constants.rs b/cumulus/parachains/integration-tests/emulated/common/src/constants.rs deleted file mode 100644 index ed529b867bcd..000000000000 --- a/cumulus/parachains/integration-tests/emulated/common/src/constants.rs +++ /dev/null @@ -1,1080 +0,0 @@ -use beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId; -use grandpa::AuthorityId as GrandpaId; -use pallet_im_online::sr25519::AuthorityId as ImOnlineId; -use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId, Balance, BlockNumber}; -use polkadot_parachain::primitives::{HeadData, ValidationCode}; -use polkadot_primitives::{AssignmentId, ValidatorId}; -use polkadot_runtime_parachains::{ - configuration::HostConfiguration, - paras::{ParaGenesisArgs, ParaKind}, -}; -use polkadot_service::chain_spec::get_authority_keys_from_seed_no_beefy; -use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; -use sp_consensus_babe::AuthorityId as BabeId; -use sp_core::{sr25519, storage::Storage, Pair, Public}; -use sp_runtime::{ - traits::{IdentifyAccount, Verify}, - BuildStorage, MultiSignature, Perbill, -}; -use xcm; - -pub const XCM_V2: u32 = 3; -pub const XCM_V3: u32 = 2; -pub const REF_TIME_THRESHOLD: u64 = 33; -pub const PROOF_SIZE_THRESHOLD: u64 = 33; - -type AccountPublic = ::Signer; - -/// Helper function to generate a crypto pair from seed -fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -/// Helper function to generate an account ID from seed. -fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} - -pub mod accounts { - use super::*; - pub const ALICE: &str = "Alice"; - pub const BOB: &str = "Bob"; - pub const CHARLIE: &str = "Charlie"; - pub const DAVE: &str = "Dave"; - pub const EVE: &str = "Eve"; - pub const FERDIE: &str = "Ferdei"; - pub const ALICE_STASH: &str = "Alice//stash"; - pub const BOB_STASH: &str = "Bob//stash"; - pub const CHARLIE_STASH: &str = "Charlie//stash"; - pub const DAVE_STASH: &str = "Dave//stash"; - pub const EVE_STASH: &str = "Eve//stash"; - pub const FERDIE_STASH: &str = "Ferdie//stash"; - pub const FERDIE_BEEFY: &str = "Ferdie//stash"; - - pub fn init_balances() -> Vec { - vec![ - get_account_id_from_seed::(ALICE), - get_account_id_from_seed::(BOB), - get_account_id_from_seed::(CHARLIE), - get_account_id_from_seed::(DAVE), - get_account_id_from_seed::(EVE), - get_account_id_from_seed::(FERDIE), - get_account_id_from_seed::(ALICE_STASH), - get_account_id_from_seed::(BOB_STASH), - get_account_id_from_seed::(CHARLIE_STASH), - get_account_id_from_seed::(DAVE_STASH), - get_account_id_from_seed::(EVE_STASH), - get_account_id_from_seed::(FERDIE_STASH), - ] - } -} - -pub mod collators { - use super::*; - - pub fn invulnerables_asset_hub_polkadot() -> Vec<(AccountId, AssetHubPolkadotAuraId)> { - vec![ - ( - get_account_id_from_seed::("Alice"), - get_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_from_seed::("Bob"), - ), - ] - } - - pub fn invulnerables() -> Vec<(AccountId, AuraId)> { - vec![ - ( - get_account_id_from_seed::("Alice"), - get_from_seed::("Alice"), - ), - (get_account_id_from_seed::("Bob"), get_from_seed::("Bob")), - ] - } -} - -pub mod validators { - use super::*; - - pub fn initial_authorities() -> Vec<( - AccountId, - AccountId, - BabeId, - GrandpaId, - ImOnlineId, - ValidatorId, - AssignmentId, - AuthorityDiscoveryId, - )> { - vec![get_authority_keys_from_seed_no_beefy("Alice")] - } -} - -/// The default XCM version to set in genesis config. -const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; -// Polkadot -pub mod polkadot { - use super::*; - pub const ED: Balance = polkadot_runtime_constants::currency::EXISTENTIAL_DEPOSIT; - const STASH: u128 = 100 * polkadot_runtime_constants::currency::UNITS; - - pub fn get_host_config() -> HostConfiguration { - HostConfiguration { - max_upward_queue_count: 10, - max_upward_queue_size: 51200, - max_upward_message_size: 51200, - max_upward_message_num_per_candidate: 10, - max_downward_message_size: 51200, - hrmp_sender_deposit: 100_000_000_000, - hrmp_recipient_deposit: 100_000_000_000, - hrmp_channel_max_capacity: 1000, - hrmp_channel_max_message_size: 102400, - hrmp_channel_max_total_size: 102400, - hrmp_max_parachain_outbound_channels: 30, - hrmp_max_parachain_inbound_channels: 30, - ..Default::default() - } - } - - fn session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - para_validator: ValidatorId, - para_assignment: AssignmentId, - authority_discovery: AuthorityDiscoveryId, - ) -> polkadot_runtime::SessionKeys { - polkadot_runtime::SessionKeys { - babe, - grandpa, - im_online, - para_validator, - para_assignment, - authority_discovery, - } - } - - pub fn genesis() -> Storage { - let genesis_config = polkadot_runtime::RuntimeGenesisConfig { - system: polkadot_runtime::SystemConfig { - code: polkadot_runtime::WASM_BINARY.unwrap().to_vec(), - ..Default::default() - }, - balances: polkadot_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - session: polkadot_runtime::SessionConfig { - keys: validators::initial_authorities() - .iter() - .map(|x| { - ( - x.0.clone(), - x.0.clone(), - polkadot::session_keys( - x.2.clone(), - x.3.clone(), - x.4.clone(), - x.5.clone(), - x.6.clone(), - x.7.clone(), - ), - ) - }) - .collect::>(), - }, - staking: polkadot_runtime::StakingConfig { - validator_count: validators::initial_authorities().len() as u32, - minimum_validator_count: 1, - stakers: validators::initial_authorities() - .iter() - .map(|x| { - (x.0.clone(), x.1.clone(), STASH, polkadot_runtime::StakerStatus::Validator) - }) - .collect(), - invulnerables: validators::initial_authorities() - .iter() - .map(|x| x.0.clone()) - .collect(), - force_era: pallet_staking::Forcing::ForceNone, - slash_reward_fraction: Perbill::from_percent(10), - ..Default::default() - }, - babe: polkadot_runtime::BabeConfig { - authorities: Default::default(), - epoch_config: Some(polkadot_runtime::BABE_GENESIS_EPOCH_CONFIG), - ..Default::default() - }, - configuration: polkadot_runtime::ConfigurationConfig { config: get_host_config() }, - paras: polkadot_runtime::ParasConfig { - paras: vec![ - ( - asset_hub_polkadot::PARA_ID.into(), - ParaGenesisArgs { - genesis_head: HeadData::default(), - validation_code: ValidationCode( - asset_hub_polkadot_runtime::WASM_BINARY.unwrap().to_vec(), - ), - para_kind: ParaKind::Parachain, - }, - ), - ( - penpal::PARA_ID_A.into(), - ParaGenesisArgs { - genesis_head: HeadData::default(), - validation_code: ValidationCode( - penpal_runtime::WASM_BINARY.unwrap().to_vec(), - ), - para_kind: ParaKind::Parachain, - }, - ), - ( - penpal::PARA_ID_B.into(), - ParaGenesisArgs { - genesis_head: HeadData::default(), - validation_code: ValidationCode( - penpal_runtime::WASM_BINARY.unwrap().to_vec(), - ), - para_kind: ParaKind::Parachain, - }, - ), - ], - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Westend -pub mod westend { - use super::*; - use westend_runtime_constants::currency::UNITS as WND; - pub const ED: Balance = westend_runtime_constants::currency::EXISTENTIAL_DEPOSIT; - const ENDOWMENT: u128 = 1_000_000 * WND; - const STASH: u128 = 100 * WND; - - pub fn get_host_config() -> HostConfiguration { - HostConfiguration { - max_upward_queue_count: 10, - max_upward_queue_size: 51200, - max_upward_message_size: 51200, - max_upward_message_num_per_candidate: 10, - max_downward_message_size: 51200, - hrmp_sender_deposit: 100_000_000_000, - hrmp_recipient_deposit: 100_000_000_000, - hrmp_channel_max_capacity: 1000, - hrmp_channel_max_message_size: 102400, - hrmp_channel_max_total_size: 102400, - hrmp_max_parachain_outbound_channels: 30, - hrmp_max_parachain_inbound_channels: 30, - ..Default::default() - } - } - - fn session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - para_validator: ValidatorId, - para_assignment: AssignmentId, - authority_discovery: AuthorityDiscoveryId, - ) -> westend_runtime::SessionKeys { - westend_runtime::SessionKeys { - babe, - grandpa, - im_online, - para_validator, - para_assignment, - authority_discovery, - } - } - - pub fn genesis() -> Storage { - let genesis_config = westend_runtime::RuntimeGenesisConfig { - system: westend_runtime::SystemConfig { - code: westend_runtime::WASM_BINARY.unwrap().to_vec(), - ..Default::default() - }, - balances: westend_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ENDOWMENT)) - .collect(), - }, - session: westend_runtime::SessionConfig { - keys: validators::initial_authorities() - .iter() - .map(|x| { - ( - x.0.clone(), - x.0.clone(), - westend::session_keys( - x.2.clone(), - x.3.clone(), - x.4.clone(), - x.5.clone(), - x.6.clone(), - x.7.clone(), - ), - ) - }) - .collect::>(), - }, - staking: westend_runtime::StakingConfig { - validator_count: validators::initial_authorities().len() as u32, - minimum_validator_count: 1, - stakers: validators::initial_authorities() - .iter() - .map(|x| { - (x.0.clone(), x.1.clone(), STASH, westend_runtime::StakerStatus::Validator) - }) - .collect(), - invulnerables: validators::initial_authorities() - .iter() - .map(|x| x.0.clone()) - .collect(), - force_era: pallet_staking::Forcing::ForceNone, - slash_reward_fraction: Perbill::from_percent(10), - ..Default::default() - }, - babe: westend_runtime::BabeConfig { - authorities: Default::default(), - epoch_config: Some(westend_runtime::BABE_GENESIS_EPOCH_CONFIG), - ..Default::default() - }, - configuration: westend_runtime::ConfigurationConfig { config: get_host_config() }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Kusama -pub mod kusama { - use super::*; - pub const ED: Balance = kusama_runtime_constants::currency::EXISTENTIAL_DEPOSIT; - use kusama_runtime_constants::currency::UNITS as KSM; - const ENDOWMENT: u128 = 1_000_000 * KSM; - const STASH: u128 = 100 * KSM; - - pub fn get_host_config() -> HostConfiguration { - HostConfiguration { - max_upward_queue_count: 10, - max_upward_queue_size: 51200, - max_upward_message_size: 51200, - max_upward_message_num_per_candidate: 10, - max_downward_message_size: 51200, - hrmp_sender_deposit: 5_000_000_000_000, - hrmp_recipient_deposit: 5_000_000_000_000, - hrmp_channel_max_capacity: 1000, - hrmp_channel_max_message_size: 102400, - hrmp_channel_max_total_size: 102400, - hrmp_max_parachain_outbound_channels: 30, - hrmp_max_parachain_inbound_channels: 30, - ..Default::default() - } - } - - fn session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - para_validator: ValidatorId, - para_assignment: AssignmentId, - authority_discovery: AuthorityDiscoveryId, - ) -> kusama_runtime::SessionKeys { - kusama_runtime::SessionKeys { - babe, - grandpa, - im_online, - para_validator, - para_assignment, - authority_discovery, - } - } - - pub fn genesis() -> Storage { - let genesis_config = kusama_runtime::RuntimeGenesisConfig { - system: kusama_runtime::SystemConfig { - code: kusama_runtime::WASM_BINARY.unwrap().to_vec(), - ..Default::default() - }, - balances: kusama_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .map(|k: &AccountId| (k.clone(), ENDOWMENT)) - .collect(), - }, - session: kusama_runtime::SessionConfig { - keys: validators::initial_authorities() - .iter() - .map(|x| { - ( - x.0.clone(), - x.0.clone(), - kusama::session_keys( - x.2.clone(), - x.3.clone(), - x.4.clone(), - x.5.clone(), - x.6.clone(), - x.7.clone(), - ), - ) - }) - .collect::>(), - }, - staking: kusama_runtime::StakingConfig { - validator_count: validators::initial_authorities().len() as u32, - minimum_validator_count: 1, - stakers: validators::initial_authorities() - .iter() - .map(|x| { - (x.0.clone(), x.1.clone(), STASH, kusama_runtime::StakerStatus::Validator) - }) - .collect(), - invulnerables: validators::initial_authorities() - .iter() - .map(|x| x.0.clone()) - .collect(), - force_era: pallet_staking::Forcing::NotForcing, - slash_reward_fraction: Perbill::from_percent(10), - ..Default::default() - }, - babe: kusama_runtime::BabeConfig { - authorities: Default::default(), - epoch_config: Some(kusama_runtime::BABE_GENESIS_EPOCH_CONFIG), - ..Default::default() - }, - configuration: kusama_runtime::ConfigurationConfig { config: get_host_config() }, - paras: kusama_runtime::ParasConfig { - paras: vec![ - ( - asset_hub_kusama::PARA_ID.into(), - ParaGenesisArgs { - genesis_head: HeadData::default(), - validation_code: ValidationCode( - asset_hub_kusama_runtime::WASM_BINARY.unwrap().to_vec(), - ), - para_kind: ParaKind::Parachain, - }, - ), - ( - penpal::PARA_ID_A.into(), - ParaGenesisArgs { - genesis_head: HeadData::default(), - validation_code: ValidationCode( - penpal_runtime::WASM_BINARY.unwrap().to_vec(), - ), - para_kind: ParaKind::Parachain, - }, - ), - ( - penpal::PARA_ID_B.into(), - ParaGenesisArgs { - genesis_head: HeadData::default(), - validation_code: ValidationCode( - penpal_runtime::WASM_BINARY.unwrap().to_vec(), - ), - para_kind: ParaKind::Parachain, - }, - ), - ], - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Rococo -pub mod rococo { - use super::*; - pub const ED: Balance = rococo_runtime_constants::currency::EXISTENTIAL_DEPOSIT; - use rococo_runtime_constants::currency::UNITS as ROC; - const ENDOWMENT: u128 = 1_000_000 * ROC; - - pub fn get_host_config() -> HostConfiguration { - HostConfiguration { - max_upward_queue_count: 10, - max_upward_queue_size: 51200, - max_upward_message_size: 51200, - max_upward_message_num_per_candidate: 10, - max_downward_message_size: 51200, - hrmp_sender_deposit: 0, - hrmp_recipient_deposit: 0, - hrmp_channel_max_capacity: 1000, - hrmp_channel_max_message_size: 102400, - hrmp_channel_max_total_size: 102400, - hrmp_max_parachain_outbound_channels: 30, - hrmp_max_parachain_inbound_channels: 30, - ..Default::default() - } - } - - fn session_keys( - babe: BabeId, - grandpa: GrandpaId, - im_online: ImOnlineId, - para_validator: ValidatorId, - para_assignment: AssignmentId, - authority_discovery: AuthorityDiscoveryId, - beefy: BeefyId, - ) -> rococo_runtime::SessionKeys { - rococo_runtime::SessionKeys { - babe, - grandpa, - im_online, - para_validator, - para_assignment, - authority_discovery, - beefy, - } - } - - pub fn genesis() -> Storage { - let genesis_config = rococo_runtime::RuntimeGenesisConfig { - system: rococo_runtime::SystemConfig { - code: rococo_runtime::WASM_BINARY.unwrap().to_vec(), - ..Default::default() - }, - balances: rococo_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .map(|k| (k.clone(), ENDOWMENT)) - .collect(), - }, - // indices: rococo_runtime::IndicesConfig { indices: vec![] }, - session: rococo_runtime::SessionConfig { - keys: validators::initial_authorities() - .iter() - .map(|x| { - ( - x.0.clone(), - x.0.clone(), - session_keys( - x.2.clone(), - x.3.clone(), - x.4.clone(), - x.5.clone(), - x.6.clone(), - x.7.clone(), - get_from_seed::("Alice"), - ), - ) - }) - .collect::>(), - }, - babe: rococo_runtime::BabeConfig { - authorities: Default::default(), - epoch_config: Some(rococo_runtime::BABE_GENESIS_EPOCH_CONFIG), - ..Default::default() - }, - sudo: rococo_runtime::SudoConfig { - key: Some(get_account_id_from_seed::("Alice")), - }, - configuration: rococo_runtime::ConfigurationConfig { config: get_host_config() }, - registrar: rococo_runtime::RegistrarConfig { - next_free_para_id: polkadot_primitives::LOWEST_PUBLIC_ID, - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Asset Hub Polkadot -pub mod asset_hub_polkadot { - use super::*; - pub const PARA_ID: u32 = 1000; - pub const ED: Balance = asset_hub_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - pub fn genesis() -> Storage { - let genesis_config = asset_hub_polkadot_runtime::RuntimeGenesisConfig { - system: asset_hub_polkadot_runtime::SystemConfig { - code: asset_hub_polkadot_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: asset_hub_polkadot_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: asset_hub_polkadot_runtime::ParachainInfoConfig { - parachain_id: PARA_ID.into(), - ..Default::default() - }, - collator_selection: asset_hub_polkadot_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables_asset_hub_polkadot() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: asset_hub_polkadot_runtime::SessionConfig { - keys: collators::invulnerables_asset_hub_polkadot() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - asset_hub_polkadot_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: asset_hub_polkadot_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Asset Hub Westend -pub mod asset_hub_westend { - use super::*; - pub const PARA_ID: u32 = 1000; - pub const ED: Balance = asset_hub_westend_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - pub fn genesis() -> Storage { - let genesis_config = asset_hub_westend_runtime::RuntimeGenesisConfig { - system: asset_hub_westend_runtime::SystemConfig { - code: asset_hub_westend_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: asset_hub_westend_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: asset_hub_westend_runtime::ParachainInfoConfig { - parachain_id: PARA_ID.into(), - ..Default::default() - }, - collator_selection: asset_hub_westend_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: asset_hub_westend_runtime::SessionConfig { - keys: collators::invulnerables() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - asset_hub_westend_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: asset_hub_westend_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Asset Hub Kusama -pub mod asset_hub_kusama { - use super::*; - pub const PARA_ID: u32 = 1000; - pub const ED: Balance = asset_hub_kusama_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - pub fn genesis() -> Storage { - let genesis_config = asset_hub_kusama_runtime::RuntimeGenesisConfig { - system: asset_hub_kusama_runtime::SystemConfig { - code: asset_hub_kusama_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: asset_hub_kusama_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: asset_hub_kusama_runtime::ParachainInfoConfig { - parachain_id: PARA_ID.into(), - ..Default::default() - }, - collator_selection: asset_hub_kusama_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: asset_hub_kusama_runtime::SessionConfig { - keys: collators::invulnerables() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - asset_hub_kusama_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: asset_hub_kusama_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Penpal -pub mod penpal { - use super::*; - pub const PARA_ID_A: u32 = 2000; - pub const PARA_ID_B: u32 = 2001; - pub const ED: Balance = penpal_runtime::EXISTENTIAL_DEPOSIT; - - pub fn genesis(para_id: u32) -> Storage { - let genesis_config = penpal_runtime::RuntimeGenesisConfig { - system: penpal_runtime::SystemConfig { - code: penpal_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: penpal_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: penpal_runtime::ParachainInfoConfig { - parachain_id: para_id.into(), - ..Default::default() - }, - collator_selection: penpal_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: penpal_runtime::SessionConfig { - keys: collators::invulnerables() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - penpal_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: penpal_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - sudo: penpal_runtime::SudoConfig { - key: Some(get_account_id_from_seed::("Alice")), - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Collectives -pub mod collectives { - use super::*; - pub const PARA_ID: u32 = 1001; - pub const ED: Balance = collectives_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - pub fn genesis() -> Storage { - let genesis_config = collectives_polkadot_runtime::RuntimeGenesisConfig { - system: collectives_polkadot_runtime::SystemConfig { - code: collectives_polkadot_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: collectives_polkadot_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: collectives_polkadot_runtime::ParachainInfoConfig { - parachain_id: PARA_ID.into(), - ..Default::default() - }, - collator_selection: collectives_polkadot_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: collectives_polkadot_runtime::SessionConfig { - keys: collators::invulnerables() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - collectives_polkadot_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: collectives_polkadot_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Bridge Hub Kusama -pub mod bridge_hub_kusama { - use super::*; - pub const PARA_ID: u32 = 1002; - pub const ED: Balance = bridge_hub_kusama_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - pub fn genesis() -> Storage { - let genesis_config = bridge_hub_kusama_runtime::RuntimeGenesisConfig { - system: bridge_hub_kusama_runtime::SystemConfig { - code: bridge_hub_kusama_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: bridge_hub_kusama_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: bridge_hub_kusama_runtime::ParachainInfoConfig { - parachain_id: PARA_ID.into(), - ..Default::default() - }, - collator_selection: bridge_hub_kusama_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: bridge_hub_kusama_runtime::SessionConfig { - keys: collators::invulnerables() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - bridge_hub_kusama_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: bridge_hub_kusama_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Bridge Hub Polkadot -pub mod bridge_hub_polkadot { - use super::*; - pub const PARA_ID: u32 = 1002; - pub const ED: Balance = bridge_hub_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - pub fn genesis() -> Storage { - let genesis_config = bridge_hub_polkadot_runtime::RuntimeGenesisConfig { - system: bridge_hub_polkadot_runtime::SystemConfig { - code: bridge_hub_polkadot_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: bridge_hub_polkadot_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: bridge_hub_polkadot_runtime::ParachainInfoConfig { - parachain_id: PARA_ID.into(), - ..Default::default() - }, - collator_selection: bridge_hub_polkadot_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: bridge_hub_polkadot_runtime::SessionConfig { - keys: collators::invulnerables() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - bridge_hub_polkadot_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: bridge_hub_polkadot_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} - -// Bridge Hub Rococo & Bridge Hub Wococo -pub mod bridge_hub_rococo { - use super::*; - pub const PARA_ID: u32 = 1013; - pub const ED: Balance = bridge_hub_rococo_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - pub fn genesis() -> Storage { - let genesis_config = bridge_hub_rococo_runtime::RuntimeGenesisConfig { - system: bridge_hub_rococo_runtime::SystemConfig { - code: bridge_hub_rococo_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: bridge_hub_rococo_runtime::BalancesConfig { - balances: accounts::init_balances() - .iter() - .cloned() - .map(|k| (k, ED * 4096)) - .collect(), - }, - parachain_info: bridge_hub_rococo_runtime::ParachainInfoConfig { - parachain_id: PARA_ID.into(), - ..Default::default() - }, - collator_selection: bridge_hub_rococo_runtime::CollatorSelectionConfig { - invulnerables: collators::invulnerables() - .iter() - .cloned() - .map(|(acc, _)| acc) - .collect(), - candidacy_bond: ED * 16, - ..Default::default() - }, - session: bridge_hub_rococo_runtime::SessionConfig { - keys: collators::invulnerables() - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - bridge_hub_rococo_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - polkadot_xcm: bridge_hub_rococo_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - bridge_wococo_grandpa: bridge_hub_rococo_runtime::BridgeWococoGrandpaConfig { - owner: Some(get_account_id_from_seed::(accounts::BOB)), - ..Default::default() - }, - bridge_rococo_grandpa: bridge_hub_rococo_runtime::BridgeRococoGrandpaConfig { - owner: Some(get_account_id_from_seed::(accounts::BOB)), - ..Default::default() - }, - bridge_rococo_messages: bridge_hub_rococo_runtime::BridgeRococoMessagesConfig { - owner: Some(get_account_id_from_seed::(accounts::BOB)), - ..Default::default() - }, - bridge_wococo_messages: bridge_hub_rococo_runtime::BridgeWococoMessagesConfig { - owner: Some(get_account_id_from_seed::(accounts::BOB)), - ..Default::default() - }, - ..Default::default() - }; - - genesis_config.build_storage().unwrap() - } -} diff --git a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs deleted file mode 100644 index 92c68f4dd613..000000000000 --- a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs +++ /dev/null @@ -1,597 +0,0 @@ -use super::{BridgeHubRococo, BridgeHubWococo}; -// pub use paste; -use bp_messages::{ - target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, - LaneId, MessageKey, OutboundLaneData, -}; -use bridge_runtime_common::messages_xcm_extension::XcmBlobMessageDispatchResult; -use codec::Decode; -pub use cumulus_primitives_core::{DmpMessageHandler, XcmpMessageHandler}; -use pallet_bridge_messages::{Config, Instance1, Instance2, OutboundLanes, Pallet}; -use sp_core::Get; -use xcm_emulator::{BridgeMessage, BridgeMessageDispatchError, BridgeMessageHandler, Chain}; - -pub struct BridgeHubMessageHandler { - _marker: std::marker::PhantomData<(S, T, I)>, -} - -struct LaneIdWrapper(LaneId); - -impl From for u32 { - fn from(lane_id: LaneIdWrapper) -> u32 { - u32::from_be_bytes(lane_id.0 .0) - } -} - -impl From for LaneIdWrapper { - fn from(id: u32) -> LaneIdWrapper { - LaneIdWrapper(LaneId(id.to_be_bytes())) - } -} - -type BridgeHubRococoRuntime = ::Runtime; -type BridgeHubWococoRuntime = ::Runtime; - -// TODO: uncomment when https://github.com/paritytech/cumulus/pull/2528 is merged -// type BridgeHubPolkadotRuntime = ::Runtime; -// type BridgeHubKusamaRuntime = ::Runtime; - -pub type RococoWococoMessageHandler = - BridgeHubMessageHandler; -pub type WococoRococoMessageHandler = - BridgeHubMessageHandler; - -// TODO: uncomment when https://github.com/paritytech/cumulus/pull/2528 is merged -// pub type PolkadotKusamaMessageHandler -// = BridgeHubMessageHandler; -// pub type KusamaPolkadotMessageHandler -// = BridgeHubMessageHandler; - -impl BridgeMessageHandler for BridgeHubMessageHandler -where - S: Config, - T: Config, - I: 'static, - >::InboundPayload: From>, - >::MessageDispatch: - MessageDispatch, -{ - fn get_source_outbound_messages() -> Vec { - // get the source active outbound lanes - let active_lanes = S::ActiveOutboundLanes::get(); - - let mut messages: Vec = Default::default(); - - // collect messages from `OutboundMessages` for each active outbound lane in the source - for lane in active_lanes { - let latest_generated_nonce = - OutboundLanes::::get(lane).latest_generated_nonce; - let latest_received_nonce = - OutboundLanes::::get(lane).latest_received_nonce; - - (latest_received_nonce + 1..=latest_generated_nonce).for_each(|nonce| { - let encoded_payload: Vec = - Pallet::::outbound_message_data(*lane, nonce) - .expect("Bridge message does not exist") - .into(); - let payload = Vec::::decode(&mut &encoded_payload[..]) - .expect("Decodign XCM message failed"); - let id: u32 = LaneIdWrapper(*lane).into(); - let message = BridgeMessage { id, nonce, payload }; - - messages.push(message); - }); - } - messages - } - - fn dispatch_target_inbound_message( - message: BridgeMessage, - ) -> Result<(), BridgeMessageDispatchError> { - type TargetMessageDispatch = >::MessageDispatch; - type InboundPayload = >::InboundPayload; - - let lane_id = LaneIdWrapper::from(message.id).0; - let nonce = message.nonce; - let payload = Ok(From::from(message.payload)); - - // Directly dispatch outbound messages assuming everything is correct - // and bypassing the `Relayers` and `InboundLane` logic - let dispatch_result = TargetMessageDispatch::::dispatch(DispatchMessage { - key: MessageKey { lane_id, nonce }, - data: DispatchMessageData::> { payload }, - }); - - let result = match dispatch_result.dispatch_level_result { - XcmBlobMessageDispatchResult::Dispatched => Ok(()), - XcmBlobMessageDispatchResult::InvalidPayload => Err(BridgeMessageDispatchError( - Box::new(XcmBlobMessageDispatchResult::InvalidPayload), - )), - XcmBlobMessageDispatchResult::NotDispatched(e) => Err(BridgeMessageDispatchError( - Box::new(XcmBlobMessageDispatchResult::NotDispatched(e)), - )), - }; - result - } - - fn notify_source_message_delivery(lane_id: u32) { - let data = OutboundLanes::::get(LaneIdWrapper::from(lane_id).0); - let new_data = OutboundLaneData { - oldest_unpruned_nonce: data.oldest_unpruned_nonce + 1, - latest_received_nonce: data.latest_received_nonce + 1, - ..data - }; - - OutboundLanes::::insert(LaneIdWrapper::from(lane_id).0, new_data); - } -} - -#[macro_export] -macro_rules! impl_accounts_helpers_for_relay_chain { - ( $chain:ident ) => { - $crate::paste::paste! { - impl $chain { - /// Fund a set of accounts with a balance - pub fn fund_accounts(accounts: Vec<(AccountId, Balance)>) { - Self::execute_with(|| { - for account in accounts { - assert_ok!(]>::Balances::force_set_balance( - ::RuntimeOrigin::root(), - account.0.into(), - account.1, - )); - } - }); - } - /// Fund a sovereign account based on its Parachain Id - pub fn fund_para_sovereign(amount: Balance, para_id: ParaId) -> sp_runtime::AccountId32 { - let sovereign_account = Self::sovereign_account_id_of_child_para(para_id); - Self::fund_accounts(vec![(sovereign_account.clone(), amount)]); - sovereign_account - } - } - } - }; -} - -#[macro_export] -macro_rules! impl_assert_events_helpers_for_relay_chain { - ( $chain:ident ) => { - $crate::paste::paste! { - type [<$chain RuntimeEvent>] = <$chain as Chain>::RuntimeEvent; - - impl $chain { - /// Asserts a dispatchable is completely executed and XCM sent - pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option) { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::XcmPallet( - pallet_xcm::Event::Attempted { outcome: Outcome::Complete(weight) } - ) => { - weight: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight), - *weight - ), - }, - ] - ); - } - - /// Asserts a dispatchable is incompletely executed and XCM sent - pub fn assert_xcm_pallet_attempted_incomplete( - expected_weight: Option, - expected_error: Option, - ) { - assert_expected_events!( - Self, - vec![ - // Dispatchable is properly executed and XCM message sent - [<$chain RuntimeEvent>]::XcmPallet( - pallet_xcm::Event::Attempted { outcome: Outcome::Incomplete(weight, error) } - ) => { - weight: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight), - *weight - ), - error: *error == expected_error.unwrap_or(*error), - }, - ] - ); - } - - /// Asserts a XCM message is sent - pub fn assert_xcm_pallet_sent() { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, - ] - ); - } - - /// Asserts a XCM from System Parachain is succesfully received and proccessed - pub fn assert_ump_queue_processed( - expected_success: bool, - expected_id: Option, - expected_weight: Option, - ) { - assert_expected_events!( - Self, - vec![ - // XCM is succesfully received and proccessed - [<$chain RuntimeEvent>]::MessageQueue(pallet_message_queue::Event::Processed { - origin: AggregateMessageOrigin::Ump(UmpQueueId::Para(id)), - weight_used, - success, - .. - }) => { - id: *id == expected_id.unwrap_or(*id), - weight_used: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight_used), - *weight_used - ), - success: *success == expected_success, - }, - ] - ); - } - } - } - }; -} - -#[macro_export] -macro_rules! impl_hrmp_channels_helpers_for_relay_chain { - ( $chain:ident ) => { - $crate::paste::paste! { - impl $chain { - /// Init open channel request with another Parachain - pub fn init_open_channel_call( - recipient_para_id: ParaId, - max_capacity: u32, - max_message_size: u32, - ) -> DoubleEncoded<()> { - ::RuntimeCall::Hrmp(polkadot_runtime_parachains::hrmp::Call::< - ::Runtime, - >::hrmp_init_open_channel { - recipient: recipient_para_id, - proposed_max_capacity: max_capacity, - proposed_max_message_size: max_message_size, - }) - .encode() - .into() - } - /// Recipient Parachain accept the open request from another Parachain - pub fn accept_open_channel_call(sender_para_id: ParaId) -> DoubleEncoded<()> { - ::RuntimeCall::Hrmp(polkadot_runtime_parachains::hrmp::Call::< - ::Runtime, - >::hrmp_accept_open_channel { - sender: sender_para_id, - }) - .encode() - .into() - } - - /// A root origin force to open a channel between two Parachains - pub fn force_process_hrmp_open(sender: ParaId, recipient: ParaId) { - Self::execute_with(|| { - let relay_root_origin = ::RuntimeOrigin::root(); - - // Force process HRMP open channel requests without waiting for the next session - assert_ok!(]>::Hrmp::force_process_hrmp_open( - relay_root_origin, - 0 - )); - - let channel_id = HrmpChannelId { sender, recipient }; - - let hrmp_channel_exist = polkadot_runtime_parachains::hrmp::HrmpChannels::< - ::Runtime, - >::contains_key(&channel_id); - - // Check the HRMP channel has been successfully registrered - assert!(hrmp_channel_exist) - }); - } - } - } - }; -} - -#[macro_export] -macro_rules! impl_accounts_helpers_for_parachain { - ( $chain:ident ) => { - $crate::paste::paste! { - impl $chain { - /// Fund a set of accounts with a balance - pub fn fund_accounts(accounts: Vec<(AccountId, Balance)>) { - Self::execute_with(|| { - for account in accounts { - assert_ok!(]>::Balances::force_set_balance( - ::RuntimeOrigin::root(), - account.0.into(), - account.1, - )); - } - }); - } - } - } - }; -} - -#[macro_export] -macro_rules! impl_assert_events_helpers_for_parachain { - ( $chain:ident ) => { - $crate::paste::paste! { - type [<$chain RuntimeEvent>] = <$chain as Chain>::RuntimeEvent; - - impl $chain { - /// Asserts a dispatchable is completely executed and XCM sent - pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option) { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::PolkadotXcm( - pallet_xcm::Event::Attempted { outcome: Outcome::Complete(weight) } - ) => { - weight: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight), - *weight - ), - }, - ] - ); - } - - /// Asserts a dispatchable is incompletely executed and XCM sent - pub fn assert_xcm_pallet_attempted_incomplete( - expected_weight: Option, - expected_error: Option, - ) { - assert_expected_events!( - Self, - vec![ - // Dispatchable is properly executed and XCM message sent - [<$chain RuntimeEvent>]::PolkadotXcm( - pallet_xcm::Event::Attempted { outcome: Outcome::Incomplete(weight, error) } - ) => { - weight: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight), - *weight - ), - error: *error == expected_error.unwrap_or(*error), - }, - ] - ); - } - - /// Asserts a dispatchable throws and error when trying to be sent - pub fn assert_xcm_pallet_attempted_error(expected_error: Option) { - assert_expected_events!( - Self, - vec![ - // Execution fails in the origin with `Barrier` - [<$chain RuntimeEvent>]::PolkadotXcm( - pallet_xcm::Event::Attempted { outcome: Outcome::Error(error) } - ) => { - error: *error == expected_error.unwrap_or(*error), - }, - ] - ); - } - - /// Asserts a XCM message is sent - pub fn assert_xcm_pallet_sent() { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::PolkadotXcm(pallet_xcm::Event::Sent { .. }) => {}, - ] - ); - } - - /// Asserts a XCM message is sent to Relay Chain - pub fn assert_parachain_system_ump_sent() { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::ParachainSystem( - cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. } - ) => {}, - ] - ); - } - - /// Asserts a XCM from Relay Chain is completely executed - pub fn assert_dmp_queue_complete(expected_weight: Option) { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { - outcome: Outcome::Complete(weight), .. - }) => { - weight: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight), - *weight - ), - }, - ] - ); - } - - /// Asserts a XCM from Relay Chain is incompletely executed - pub fn assert_dmp_queue_incomplete( - expected_weight: Option, - expected_error: Option, - ) { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::DmpQueue(cumulus_pallet_dmp_queue::Event::ExecutedDownward { - outcome: Outcome::Incomplete(weight, error), .. - }) => { - weight: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight), - *weight - ), - error: *error == expected_error.unwrap_or(*error), - }, - ] - ); - } - - /// Asserts a XCM from another Parachain is completely executed - pub fn assert_xcmp_queue_success(expected_weight: Option) { - assert_expected_events!( - Self, - vec![ - [<$chain RuntimeEvent>]::XcmpQueue( - cumulus_pallet_xcmp_queue::Event::Success { weight, .. } - ) => { - weight: weight_within_threshold( - (REF_TIME_THRESHOLD, PROOF_SIZE_THRESHOLD), - expected_weight.unwrap_or(*weight), - *weight - ), - }, - ] - ); - } - } - } - }; -} - -#[macro_export] -macro_rules! impl_assets_helpers_for_parachain { - ( $chain:ident, $relay_chain:ident ) => { - $crate::paste::paste! { - impl $chain { - /// Returns the encoded call for `force_create` from the assets pallet - pub fn force_create_asset_call( - asset_id: u32, - owner: AccountId, - is_sufficient: bool, - min_balance: Balance, - ) -> DoubleEncoded<()> { - ::RuntimeCall::Assets(pallet_assets::Call::< - ::Runtime, - Instance1, - >::force_create { - id: asset_id.into(), - owner: owner.into(), - is_sufficient, - min_balance, - }) - .encode() - .into() - } - - /// Returns a `VersionedXcm` for `force_create` from the assets pallet - pub fn force_create_asset_xcm( - origin_kind: OriginKind, - asset_id: u32, - owner: AccountId, - is_sufficient: bool, - min_balance: Balance, - ) -> VersionedXcm<()> { - let call = Self::force_create_asset_call(asset_id, owner, is_sufficient, min_balance); - xcm_transact_unpaid_execution(call, origin_kind) - } - - /// Mint assets making use of the assets pallet - pub fn mint_asset( - signed_origin: ::RuntimeOrigin, - id: u32, - beneficiary: AccountId, - amount_to_mint: u128, - ) { - Self::execute_with(|| { - assert_ok!(]>::Assets::mint( - signed_origin, - id.into(), - beneficiary.clone().into(), - amount_to_mint - )); - - type RuntimeEvent = <$chain as Chain>::RuntimeEvent; - - assert_expected_events!( - Self, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { - asset_id: *asset_id == id, - owner: *owner == beneficiary.clone().into(), - amount: *amount == amount_to_mint, - }, - ] - ); - }); - } - - /// Force create and mint assets making use of the assets pallet - pub fn force_create_and_mint_asset( - id: u32, - min_balance: u128, - is_sufficient: bool, - asset_owner: AccountId, - amount_to_mint: u128, - ) { - // Init values for Relay Chain - let root_origin = <$relay_chain as Chain>::RuntimeOrigin::root(); - let destination = <$relay_chain>::child_location_of(<$chain>::para_id()); - let xcm = Self::force_create_asset_xcm( - OriginKind::Superuser, - id, - asset_owner.clone(), - is_sufficient, - min_balance, - ); - - <$relay_chain>::execute_with(|| { - assert_ok!(<$relay_chain as [<$relay_chain Pallet>]>::XcmPallet::send( - root_origin, - bx!(destination.into()), - bx!(xcm), - )); - - <$relay_chain>::assert_xcm_pallet_sent(); - }); - - Self::execute_with(|| { - Self::assert_dmp_queue_complete(Some(Weight::from_parts(1_019_445_000, 200_000))); - - type RuntimeEvent = <$chain as Chain>::RuntimeEvent; - - assert_expected_events!( - Self, - vec![ - // Asset has been created - RuntimeEvent::Assets(pallet_assets::Event::ForceCreated { asset_id, owner }) => { - asset_id: *asset_id == id, - owner: *owner == asset_owner.clone(), - }, - ] - ); - - assert!(]>::Assets::asset_exists(id.into())); - }); - - let signed_origin = ::RuntimeOrigin::signed(asset_owner.clone()); - - // Mint asset for System Parachain's sender - Self::mint_asset(signed_origin, id, asset_owner, amount_to_mint); - } - } - } - }; -} diff --git a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs deleted file mode 100644 index 7ef57027c459..000000000000 --- a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs +++ /dev/null @@ -1,559 +0,0 @@ -pub use lazy_static; -pub mod constants; -pub mod impls; - -pub use codec::Encode; -pub use constants::{ - accounts::{ALICE, BOB}, - asset_hub_kusama, asset_hub_polkadot, asset_hub_westend, bridge_hub_kusama, - bridge_hub_polkadot, bridge_hub_rococo, collectives, kusama, penpal, polkadot, rococo, westend, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, -}; -use frame_support::{ - assert_ok, instances::Instance1, parameter_types, sp_tracing, traits::fungibles::Inspect, -}; -pub use impls::{RococoWococoMessageHandler, WococoRococoMessageHandler}; -pub use parachains_common::{AccountId, Balance}; -pub use paste; -use polkadot_parachain::primitives::HrmpChannelId; -pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueueId}; -pub use sp_core::{sr25519, storage::Storage, Get}; -use xcm_emulator::{ - assert_expected_events, bx, decl_test_bridges, decl_test_networks, decl_test_parachains, - decl_test_relay_chains, decl_test_sender_receiver_accounts_parameter_types, - helpers::weight_within_threshold, BridgeMessageHandler, Chain, DefaultMessageProcessor, ParaId, - Parachain, RelayChain, TestExt, -}; - -pub use xcm::{ - prelude::{ - AccountId32, All, BuyExecution, DepositAsset, MultiAsset, MultiAssets, MultiLocation, - OriginKind, Outcome, RefundSurplus, Transact, UnpaidExecution, VersionedXcm, Weight, - WeightLimit, WithdrawAsset, Xcm, X1, - }, - v3::Error, - DoubleEncoded, -}; - -decl_test_relay_chains! { - #[api_version(5)] - pub struct Polkadot { - genesis = polkadot::genesis(), - on_init = (), - runtime = polkadot_runtime, - core = { - MessageProcessor: DefaultMessageProcessor, - SovereignAccountOf: polkadot_runtime::xcm_config::SovereignAccountOf, - }, - pallets = { - XcmPallet: polkadot_runtime::XcmPallet, - Balances: polkadot_runtime::Balances, - Hrmp: polkadot_runtime::Hrmp, - } - }, - #[api_version(5)] - pub struct Kusama { - genesis = kusama::genesis(), - on_init = (), - runtime = kusama_runtime, - core = { - MessageProcessor: DefaultMessageProcessor, - SovereignAccountOf: kusama_runtime::xcm_config::SovereignAccountOf, - }, - pallets = { - XcmPallet: kusama_runtime::XcmPallet, - Balances: kusama_runtime::Balances, - Hrmp: kusama_runtime::Hrmp, - } - }, - #[api_version(5)] - pub struct Westend { - genesis = westend::genesis(), - on_init = (), - runtime = westend_runtime, - core = { - MessageProcessor: DefaultMessageProcessor, - SovereignAccountOf: westend_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf, - }, - pallets = { - XcmPallet: westend_runtime::XcmPallet, - Sudo: westend_runtime::Sudo, - Balances: westend_runtime::Balances, - } - }, - #[api_version(5)] - pub struct Rococo { - genesis = rococo::genesis(), - on_init = (), - runtime = rococo_runtime, - core = { - MessageProcessor: DefaultMessageProcessor, - SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf, - }, - pallets = { - XcmPallet: rococo_runtime::XcmPallet, - Sudo: rococo_runtime::Sudo, - Balances: rococo_runtime::Balances, - } - }, - #[api_version(5)] - pub struct Wococo { - genesis = rococo::genesis(), - on_init = (), - runtime = rococo_runtime, - core = { - MessageProcessor: DefaultMessageProcessor, - SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf, - }, - pallets = { - XcmPallet: rococo_runtime::XcmPallet, - Sudo: rococo_runtime::Sudo, - Balances: rococo_runtime::Balances, - } - } -} - -decl_test_parachains! { - // Polkadot Parachains - pub struct AssetHubPolkadot { - genesis = asset_hub_polkadot::genesis(), - on_init = (), - runtime = asset_hub_polkadot_runtime, - core = { - XcmpMessageHandler: asset_hub_polkadot_runtime::XcmpQueue, - DmpMessageHandler: asset_hub_polkadot_runtime::DmpQueue, - LocationToAccountId: asset_hub_polkadot_runtime::xcm_config::LocationToAccountId, - ParachainInfo: asset_hub_polkadot_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: asset_hub_polkadot_runtime::PolkadotXcm, - Assets: asset_hub_polkadot_runtime::Assets, - Balances: asset_hub_polkadot_runtime::Balances, - } - }, - pub struct Collectives { - genesis = collectives::genesis(), - on_init = (), - runtime = collectives_polkadot_runtime, - core = { - XcmpMessageHandler: collectives_polkadot_runtime::XcmpQueue, - DmpMessageHandler: collectives_polkadot_runtime::DmpQueue, - LocationToAccountId: collectives_polkadot_runtime::xcm_config::LocationToAccountId, - ParachainInfo: collectives_polkadot_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: collectives_polkadot_runtime::PolkadotXcm, - Balances: collectives_polkadot_runtime::Balances, - } - }, - pub struct BridgeHubPolkadot { - genesis = bridge_hub_polkadot::genesis(), - on_init = (), - runtime = bridge_hub_polkadot_runtime, - core = { - XcmpMessageHandler: bridge_hub_polkadot_runtime::XcmpQueue, - DmpMessageHandler: bridge_hub_polkadot_runtime::DmpQueue, - LocationToAccountId: bridge_hub_polkadot_runtime::xcm_config::LocationToAccountId, - ParachainInfo: bridge_hub_polkadot_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: bridge_hub_polkadot_runtime::PolkadotXcm, - } - }, - pub struct PenpalPolkadotA { - genesis = penpal::genesis(penpal::PARA_ID_A), - on_init = (), - runtime = penpal_runtime, - core = { - XcmpMessageHandler: penpal_runtime::XcmpQueue, - DmpMessageHandler: penpal_runtime::DmpQueue, - LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, - ParachainInfo: penpal_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: penpal_runtime::PolkadotXcm, - Assets: penpal_runtime::Assets, - } - }, - pub struct PenpalPolkadotB { - genesis = penpal::genesis(penpal::PARA_ID_B), - on_init = (), - runtime = penpal_runtime, - core = { - XcmpMessageHandler: penpal_runtime::XcmpQueue, - DmpMessageHandler: penpal_runtime::DmpQueue, - LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, - ParachainInfo: penpal_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: penpal_runtime::PolkadotXcm, - Assets: penpal_runtime::Assets, - } - }, - // Kusama Parachains - pub struct AssetHubKusama { - genesis = asset_hub_kusama::genesis(), - on_init = (), - runtime = asset_hub_kusama_runtime, - core = { - XcmpMessageHandler: asset_hub_kusama_runtime::XcmpQueue, - DmpMessageHandler: asset_hub_kusama_runtime::DmpQueue, - LocationToAccountId: asset_hub_kusama_runtime::xcm_config::LocationToAccountId, - ParachainInfo: asset_hub_kusama_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: asset_hub_kusama_runtime::PolkadotXcm, - Assets: asset_hub_kusama_runtime::Assets, - ForeignAssets: asset_hub_kusama_runtime::Assets, - Balances: asset_hub_kusama_runtime::Balances, - } - }, - pub struct BridgeHubKusama { - genesis = bridge_hub_kusama::genesis(), - on_init = (), - runtime = bridge_hub_kusama_runtime, - core = { - XcmpMessageHandler: bridge_hub_kusama_runtime::XcmpQueue, - DmpMessageHandler: bridge_hub_kusama_runtime::DmpQueue, - LocationToAccountId: bridge_hub_kusama_runtime::xcm_config::LocationToAccountId, - ParachainInfo: bridge_hub_kusama_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: bridge_hub_kusama_runtime::PolkadotXcm, - } - }, - pub struct PenpalKusamaA { - genesis = penpal::genesis(penpal::PARA_ID_A), - on_init = (), - runtime = penpal_runtime, - core = { - XcmpMessageHandler: penpal_runtime::XcmpQueue, - DmpMessageHandler: penpal_runtime::DmpQueue, - LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, - ParachainInfo: penpal_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: penpal_runtime::PolkadotXcm, - Assets: penpal_runtime::Assets, - } - }, - pub struct PenpalKusamaB { - genesis = penpal::genesis(penpal::PARA_ID_B), - on_init = (), - runtime = penpal_runtime, - core = { - XcmpMessageHandler: penpal_runtime::XcmpQueue, - DmpMessageHandler: penpal_runtime::DmpQueue, - LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, - ParachainInfo: penpal_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: penpal_runtime::PolkadotXcm, - Assets: penpal_runtime::Assets, - } - }, - // Westend Parachains - pub struct AssetHubWestend { - genesis = asset_hub_westend::genesis(), - on_init = (), - runtime = asset_hub_westend_runtime, - core = { - XcmpMessageHandler: asset_hub_westend_runtime::XcmpQueue, - DmpMessageHandler: asset_hub_westend_runtime::DmpQueue, - LocationToAccountId: asset_hub_westend_runtime::xcm_config::LocationToAccountId, - ParachainInfo: asset_hub_westend_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: asset_hub_westend_runtime::PolkadotXcm, - Balances: asset_hub_westend_runtime::Balances, - Assets: asset_hub_westend_runtime::Assets, - ForeignAssets: asset_hub_westend_runtime::ForeignAssets, - PoolAssets: asset_hub_westend_runtime::PoolAssets, - AssetConversion: asset_hub_westend_runtime::AssetConversion, - } - }, - pub struct PenpalWestendA { - genesis = penpal::genesis(penpal::PARA_ID_A), - on_init = (), - runtime = penpal_runtime, - core = { - XcmpMessageHandler: penpal_runtime::XcmpQueue, - DmpMessageHandler: penpal_runtime::DmpQueue, - LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, - ParachainInfo: penpal_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: penpal_runtime::PolkadotXcm, - Assets: penpal_runtime::Assets, - } - }, - // Rococo Parachains - pub struct BridgeHubRococo { - genesis = bridge_hub_rococo::genesis(), - on_init = (), - runtime = bridge_hub_rococo_runtime, - core = { - XcmpMessageHandler: bridge_hub_rococo_runtime::XcmpQueue, - DmpMessageHandler: bridge_hub_rococo_runtime::DmpQueue, - LocationToAccountId: bridge_hub_rococo_runtime::xcm_config::LocationToAccountId, - ParachainInfo: bridge_hub_rococo_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: bridge_hub_rococo_runtime::PolkadotXcm, - Balances: bridge_hub_rococo_runtime::Balances, - } - }, - // AssetHubRococo (aka Rockmine/Rockmine2) mirrors AssetHubKusama - pub struct AssetHubRococo { - genesis = asset_hub_kusama::genesis(), - on_init = (), - runtime = asset_hub_kusama_runtime, - core = { - XcmpMessageHandler: asset_hub_kusama_runtime::XcmpQueue, - DmpMessageHandler: asset_hub_kusama_runtime::DmpQueue, - LocationToAccountId: asset_hub_kusama_runtime::xcm_config::LocationToAccountId, - ParachainInfo: asset_hub_kusama_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: asset_hub_kusama_runtime::PolkadotXcm, - Assets: asset_hub_kusama_runtime::Assets, - } - }, - // Wococo Parachains - pub struct BridgeHubWococo { - genesis = bridge_hub_rococo::genesis(), - on_init = (), - runtime = bridge_hub_rococo_runtime, - core = { - XcmpMessageHandler: bridge_hub_rococo_runtime::XcmpQueue, - DmpMessageHandler: bridge_hub_rococo_runtime::DmpQueue, - LocationToAccountId: bridge_hub_rococo_runtime::xcm_config::LocationToAccountId, - ParachainInfo: bridge_hub_rococo_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: bridge_hub_rococo_runtime::PolkadotXcm, - } - }, - pub struct AssetHubWococo { - genesis = asset_hub_polkadot::genesis(), - on_init = (), - runtime = asset_hub_polkadot_runtime, - core = { - XcmpMessageHandler: asset_hub_polkadot_runtime::XcmpQueue, - DmpMessageHandler: asset_hub_polkadot_runtime::DmpQueue, - LocationToAccountId: asset_hub_polkadot_runtime::xcm_config::LocationToAccountId, - ParachainInfo: asset_hub_polkadot_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: asset_hub_polkadot_runtime::PolkadotXcm, - Assets: asset_hub_polkadot_runtime::Assets, - } - }, - pub struct PenpalRococoA { - genesis = penpal::genesis(penpal::PARA_ID_A), - on_init = (), - runtime = penpal_runtime, - core = { - XcmpMessageHandler: penpal_runtime::XcmpQueue, - DmpMessageHandler: penpal_runtime::DmpQueue, - LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, - ParachainInfo: penpal_runtime::ParachainInfo, - }, - pallets = { - PolkadotXcm: penpal_runtime::PolkadotXcm, - Assets: penpal_runtime::Assets, - } - } -} - -decl_test_networks! { - pub struct PolkadotMockNet { - relay_chain = Polkadot, - parachains = vec![ - AssetHubPolkadot, - Collectives, - BridgeHubPolkadot, - PenpalPolkadotA, - PenpalPolkadotB, - ], - // TODO: uncomment when https://github.com/paritytech/cumulus/pull/2528 is merged - // bridge = PolkadotKusamaMockBridge - bridge = () - }, - pub struct KusamaMockNet { - relay_chain = Kusama, - parachains = vec![ - AssetHubKusama, - PenpalKusamaA, - BridgeHubKusama, - PenpalKusamaB, - ], - // TODO: uncomment when https://github.com/paritytech/cumulus/pull/2528 is merged - // bridge = KusamaPolkadotMockBridge - bridge = () - }, - pub struct WestendMockNet { - relay_chain = Westend, - parachains = vec![ - AssetHubWestend, - PenpalWestendA, - ], - bridge = () - }, - pub struct RococoMockNet { - relay_chain = Rococo, - parachains = vec![ - AssetHubRococo, - BridgeHubRococo, - PenpalRococoA, - ], - bridge = RococoWococoMockBridge - }, - pub struct WococoMockNet { - relay_chain = Wococo, - parachains = vec![ - AssetHubWococo, - BridgeHubWococo, - ], - bridge = WococoRococoMockBridge - } -} - -decl_test_bridges! { - pub struct RococoWococoMockBridge { - source = BridgeHubRococo, - target = BridgeHubWococo, - handler = RococoWococoMessageHandler - }, - pub struct WococoRococoMockBridge { - source = BridgeHubWococo, - target = BridgeHubRococo, - handler = WococoRococoMessageHandler - } - // TODO: uncomment when https://github.com/paritytech/cumulus/pull/2528 is merged - // pub struct PolkadotKusamaMockBridge { - // source = BridgeHubPolkadot, - // target = BridgeHubKusama, - // handler = PolkadotKusamaMessageHandler - // }, - // pub struct KusamaPolkadotMockBridge { - // source = BridgeHubKusama, - // target = BridgeHubPolkadot, - // handler = KusamaPolkadotMessageHandler - // } -} - -// Polkadot implementation -impl_accounts_helpers_for_relay_chain!(Polkadot); -impl_assert_events_helpers_for_relay_chain!(Polkadot); -impl_hrmp_channels_helpers_for_relay_chain!(Polkadot); - -// Kusama implementation -impl_accounts_helpers_for_relay_chain!(Kusama); -impl_assert_events_helpers_for_relay_chain!(Kusama); -impl_hrmp_channels_helpers_for_relay_chain!(Kusama); - -// Westend implementation -impl_accounts_helpers_for_relay_chain!(Westend); -impl_assert_events_helpers_for_relay_chain!(Westend); - -// Rococo implementation -impl_accounts_helpers_for_relay_chain!(Rococo); -impl_assert_events_helpers_for_relay_chain!(Rococo); - -// Wococo implementation -impl_accounts_helpers_for_relay_chain!(Wococo); -impl_assert_events_helpers_for_relay_chain!(Wococo); - -// AssetHubPolkadot implementation -impl_accounts_helpers_for_parachain!(AssetHubPolkadot); -impl_assets_helpers_for_parachain!(AssetHubPolkadot, Polkadot); -impl_assert_events_helpers_for_parachain!(AssetHubPolkadot); - -// AssetHubKusama implementation -impl_accounts_helpers_for_parachain!(AssetHubKusama); -impl_assets_helpers_for_parachain!(AssetHubKusama, Kusama); -impl_assert_events_helpers_for_parachain!(AssetHubKusama); - -// AssetHubWestend implementation -impl_accounts_helpers_for_parachain!(AssetHubWestend); -impl_assets_helpers_for_parachain!(AssetHubWestend, Westend); -impl_assert_events_helpers_for_parachain!(AssetHubWestend); - -// Collectives implementation -impl_accounts_helpers_for_parachain!(Collectives); -impl_assert_events_helpers_for_parachain!(Collectives); - -// BridgeHubRococo implementation -impl_accounts_helpers_for_parachain!(BridgeHubRococo); -impl_assert_events_helpers_for_parachain!(BridgeHubRococo); - -decl_test_sender_receiver_accounts_parameter_types! { - // Relays - Polkadot { sender: ALICE, receiver: BOB }, - Kusama { sender: ALICE, receiver: BOB }, - Westend { sender: ALICE, receiver: BOB }, - Rococo { sender: ALICE, receiver: BOB }, - Wococo { sender: ALICE, receiver: BOB }, - // Asset Hubs - AssetHubPolkadot { sender: ALICE, receiver: BOB }, - AssetHubKusama { sender: ALICE, receiver: BOB }, - AssetHubWestend { sender: ALICE, receiver: BOB }, - AssetHubRococo { sender: ALICE, receiver: BOB }, - AssetHubWococo { sender: ALICE, receiver: BOB }, - // Collectives - Collectives { sender: ALICE, receiver: BOB }, - // Bridged Hubs - BridgeHubPolkadot { sender: ALICE, receiver: BOB }, - BridgeHubKusama { sender: ALICE, receiver: BOB }, - BridgeHubRococo { sender: ALICE, receiver: BOB }, - BridgeHubWococo { sender: ALICE, receiver: BOB }, - // Penpals - PenpalPolkadotA { sender: ALICE, receiver: BOB }, - PenpalPolkadotB { sender: ALICE, receiver: BOB }, - PenpalKusamaA { sender: ALICE, receiver: BOB }, - PenpalKusamaB { sender: ALICE, receiver: BOB }, - PenpalWestendA { sender: ALICE, receiver: BOB }, - PenpalRococoA { sender: ALICE, receiver: BOB } -} - -/// Helper method to build a XCM with a `Transact` instruction and paying for its execution -pub fn xcm_transact_paid_execution( - call: DoubleEncoded<()>, - origin_kind: OriginKind, - native_asset: MultiAsset, - beneficiary: AccountId, -) -> VersionedXcm<()> { - let weight_limit = WeightLimit::Unlimited; - let require_weight_at_most = Weight::from_parts(1000000000, 200000); - let native_assets: MultiAssets = native_asset.clone().into(); - - VersionedXcm::from(Xcm(vec![ - WithdrawAsset(native_assets), - BuyExecution { fees: native_asset, weight_limit }, - Transact { require_weight_at_most, origin_kind, call }, - RefundSurplus, - DepositAsset { - assets: All.into(), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { network: None, id: beneficiary.into() }), - }, - }, - ])) -} - -/// Helper method to build a XCM with a `Transact` instruction without paying for its execution -pub fn xcm_transact_unpaid_execution( - call: DoubleEncoded<()>, - origin_kind: OriginKind, -) -> VersionedXcm<()> { - let weight_limit = WeightLimit::Unlimited; - let require_weight_at_most = Weight::from_parts(1000000000, 200000); - let check_origin = None; - - VersionedXcm::from(Xcm(vec![ - UnpaidExecution { weight_limit, check_origin }, - Transact { require_weight_at_most, origin_kind, call }, - ])) -} diff --git a/cumulus/parachains/pallets/parachain-info/Cargo.toml b/cumulus/parachains/pallets/parachain-info/Cargo.toml deleted file mode 100644 index 3a26ffa0bcf4..000000000000 --- a/cumulus/parachains/pallets/parachain-info/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -authors = ["Parity Technologies "] -edition = "2021" -name = "parachain-info" -version = "0.1.0" -publish = false - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -sp-runtime = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } -sp-std = { default-features = false, git = "https://github.com/paritytech/substrate", branch = "master" } - -cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } - -[features] -default = ["std"] -std = [ - "codec/std", - "scale-info/std", - "cumulus-primitives-core/std", - "frame-support/std", - "frame-system/std", -] -try-runtime = ["frame-support/try-runtime"] diff --git a/cumulus/parachains/pallets/parachain-info/src/lib.rs b/cumulus/parachains/pallets/parachain-info/src/lib.rs deleted file mode 100644 index 6a9707365c37..000000000000 --- a/cumulus/parachains/pallets/parachain-info/src/lib.rs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Minimal Pallet that injects a ParachainId into Runtime storage from - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use pallet::*; - -#[frame_support::pallet] -pub mod pallet { - use cumulus_primitives_core::ParaId; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config {} - - #[pallet::hooks] - impl Hooks> for Pallet {} - - #[pallet::call] - impl Pallet {} - - #[pallet::genesis_config] - pub struct GenesisConfig { - #[serde(skip)] - pub _config: sp_std::marker::PhantomData, - pub parachain_id: ParaId, - } - - impl Default for GenesisConfig { - fn default() -> Self { - Self { parachain_id: 100.into(), _config: Default::default() } - } - } - - #[pallet::genesis_build] - impl BuildGenesisConfig for GenesisConfig { - fn build(&self) { - >::put(self.parachain_id); - } - } - - #[pallet::type_value] - pub(super) fn DefaultForParachainId() -> ParaId { - 100.into() - } - - #[pallet::storage] - #[pallet::getter(fn parachain_id)] - pub(super) type ParachainId = - StorageValue<_, ParaId, ValueQuery, DefaultForParachainId>; - - impl Get for Pallet { - fn get() -> ParaId { - Self::parachain_id() - } - } -} diff --git a/cumulus/parachains/pallets/ping/Cargo.toml b/cumulus/parachains/pallets/ping/Cargo.toml deleted file mode 100644 index d897ecb7a0a3..000000000000 --- a/cumulus/parachains/pallets/ping/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -authors = ["Parity Technologies "] -edition = "2021" -name = "cumulus-ping" -version = "0.1.0" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } -cumulus-pallet-xcm = { path = "../../../pallets/xcm", default-features = false } - -[features] -default = ["std"] -std = [ - "codec/std", - "scale-info/std", - "cumulus-primitives-core/std", - "sp-std/std", - "sp-runtime/std", - "frame-support/std", - "frame-system/std", - "xcm/std", -] - -try-runtime = [ - "frame-system/try-runtime", - "frame-support/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "sp-runtime/try-runtime" -] \ No newline at end of file diff --git a/cumulus/parachains/pallets/ping/src/lib.rs b/cumulus/parachains/pallets/ping/src/lib.rs deleted file mode 100644 index 7425b5bd52f4..000000000000 --- a/cumulus/parachains/pallets/ping/src/lib.rs +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Pallet to spam the XCM/UMP. - -#![cfg_attr(not(feature = "std"), no_std)] - -use cumulus_pallet_xcm::{ensure_sibling_para, Origin as CumulusOrigin}; -use cumulus_primitives_core::ParaId; -use frame_support::{parameter_types, BoundedVec}; -use frame_system::Config as SystemConfig; -use sp_runtime::traits::Saturating; -use sp_std::prelude::*; -use xcm::latest::prelude::*; - -pub use pallet::*; - -parameter_types! { - const MaxParachains: u32 = 100; - const MaxPayloadSize: u32 = 1024; -} - -#[frame_support::pallet] -pub mod pallet { - use super::*; - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - pub struct Pallet(_); - - /// The module configuration trait. - #[pallet::config] - pub trait Config: frame_system::Config { - /// The overarching event type. - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - - type RuntimeOrigin: From<::RuntimeOrigin> - + Into::RuntimeOrigin>>; - - /// The overarching call type; we assume sibling chains use the same type. - type RuntimeCall: From> + Encode; - - type XcmSender: SendXcm; - } - - /// The target parachains to ping. - #[pallet::storage] - pub(super) type Targets = StorageValue< - _, - BoundedVec<(ParaId, BoundedVec), MaxParachains>, - ValueQuery, - >; - - /// The total number of pings sent. - #[pallet::storage] - pub(super) type PingCount = StorageValue<_, u32, ValueQuery>; - - /// The sent pings. - #[pallet::storage] - pub(super) type Pings = - StorageMap<_, Blake2_128Concat, u32, BlockNumberFor, OptionQuery>; - - #[pallet::event] - #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { - PingSent(ParaId, u32, Vec, XcmHash, MultiAssets), - Pinged(ParaId, u32, Vec), - PongSent(ParaId, u32, Vec, XcmHash, MultiAssets), - Ponged(ParaId, u32, Vec, BlockNumberFor), - ErrorSendingPing(SendError, ParaId, u32, Vec), - ErrorSendingPong(SendError, ParaId, u32, Vec), - UnknownPong(ParaId, u32, Vec), - } - - #[pallet::error] - pub enum Error { - /// Too many parachains have been added as a target. - TooManyTargets, - /// The payload provided is too large, limit is 1024 bytes. - PayloadTooLarge, - } - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_finalize(n: BlockNumberFor) { - for (para, payload) in Targets::::get().into_iter() { - let seq = PingCount::::mutate(|seq| { - *seq += 1; - *seq - }); - match send_xcm::( - (Parent, Junction::Parachain(para.into())).into(), - Xcm(vec![Transact { - origin_kind: OriginKind::Native, - require_weight_at_most: Weight::from_parts(1_000, 1_000), - call: ::RuntimeCall::from(Call::::ping { - seq, - payload: payload.clone().to_vec(), - }) - .encode() - .into(), - }]), - ) { - Ok((hash, cost)) => { - Pings::::insert(seq, n); - Self::deposit_event(Event::PingSent( - para, - seq, - payload.to_vec(), - hash, - cost, - )); - }, - Err(e) => { - Self::deposit_event(Event::ErrorSendingPing( - e, - para, - seq, - payload.to_vec(), - )); - }, - } - } - } - } - - #[pallet::call] - impl Pallet { - #[pallet::call_index(0)] - #[pallet::weight({0})] - pub fn start(origin: OriginFor, para: ParaId, payload: Vec) -> DispatchResult { - ensure_root(origin)?; - let payload = BoundedVec::::try_from(payload) - .map_err(|_| Error::::PayloadTooLarge)?; - Targets::::try_mutate(|t| { - t.try_push((para, payload)).map_err(|_| Error::::TooManyTargets) - })?; - Ok(()) - } - - #[pallet::call_index(1)] - #[pallet::weight({0})] - pub fn start_many( - origin: OriginFor, - para: ParaId, - count: u32, - payload: Vec, - ) -> DispatchResult { - ensure_root(origin)?; - let bounded_payload = BoundedVec::::try_from(payload) - .map_err(|_| Error::::PayloadTooLarge)?; - for _ in 0..count { - Targets::::try_mutate(|t| { - t.try_push((para, bounded_payload.clone())) - .map_err(|_| Error::::TooManyTargets) - })?; - } - Ok(()) - } - - #[pallet::call_index(2)] - #[pallet::weight({0})] - pub fn stop(origin: OriginFor, para: ParaId) -> DispatchResult { - ensure_root(origin)?; - Targets::::mutate(|t| { - if let Some(p) = t.iter().position(|(p, _)| p == ¶) { - t.swap_remove(p); - } - }); - Ok(()) - } - - #[pallet::call_index(3)] - #[pallet::weight({0})] - pub fn stop_all(origin: OriginFor, maybe_para: Option) -> DispatchResult { - ensure_root(origin)?; - if let Some(para) = maybe_para { - Targets::::mutate(|t| t.retain(|&(x, _)| x != para)); - } else { - Targets::::kill(); - } - Ok(()) - } - - #[pallet::call_index(4)] - #[pallet::weight({0})] - pub fn ping(origin: OriginFor, seq: u32, payload: Vec) -> DispatchResult { - // Only accept pings from other chains. - let para = ensure_sibling_para(::RuntimeOrigin::from(origin))?; - - Self::deposit_event(Event::Pinged(para, seq, payload.clone())); - match send_xcm::( - (Parent, Junction::Parachain(para.into())).into(), - Xcm(vec![Transact { - origin_kind: OriginKind::Native, - require_weight_at_most: Weight::from_parts(1_000, 1_000), - call: ::RuntimeCall::from(Call::::pong { - seq, - payload: payload.clone(), - }) - .encode() - .into(), - }]), - ) { - Ok((hash, cost)) => - Self::deposit_event(Event::PongSent(para, seq, payload, hash, cost)), - Err(e) => Self::deposit_event(Event::ErrorSendingPong(e, para, seq, payload)), - } - Ok(()) - } - - #[pallet::call_index(5)] - #[pallet::weight({0})] - pub fn pong(origin: OriginFor, seq: u32, payload: Vec) -> DispatchResult { - // Only accept pings from other chains. - let para = ensure_sibling_para(::RuntimeOrigin::from(origin))?; - - if let Some(sent_at) = Pings::::take(seq) { - Self::deposit_event(Event::Ponged( - para, - seq, - payload, - frame_system::Pallet::::block_number().saturating_sub(sent_at), - )); - } else { - // Pong received for a ping we apparently didn't send?! - Self::deposit_event(Event::UnknownPong(para, seq, payload)); - } - Ok(()) - } - } -} diff --git a/cumulus/parachains/runtimes/assets/README.md b/cumulus/parachains/runtimes/assets/README.md deleted file mode 100644 index 78145395cbf9..000000000000 --- a/cumulus/parachains/runtimes/assets/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Assets Parachain - -Implementation of Asset Hub, a blockchain to support generic assets in the Polkadot and Kusama -networks. Asset Hub was formerly known as "Statemint". - -Asset Hub allows users to: - -- Deploy promise-backed assets, both fungible and non-fungible, with a DOT/KSM deposit. -- Set admin roles to manage assets and asset classes. -- Register assets as "self-sufficient" if the Relay Chain agrees, i.e. gain the ability for an - asset to justify the existance of accounts sans DOT/KSM. -- Pay transaction fees using sufficient assets. -- Transfer (and approve transfer) assets. -- Interact with the chain via its transactional API or XCM. - -Asset Hub must stay fully aligned with the Relay Chain it is connected to. As such, it will accept -the Relay Chain's governance origins as its own. - -See -[the article on Asset Hub as common good parachain](https://www.parity.io/blog/statemint-generic-assets-chain-proposing-a-common-good-parachain-to-polkadot-governance/) -for a higher level description. - -Wallets, custodians, etc. should see -[the Polkadot Wiki's Integration Guide](https://wiki.polkadot.network/docs/build-integrate-assets) -for details about support. diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml deleted file mode 100644 index 21887da09b93..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/Cargo.toml +++ /dev/null @@ -1,205 +0,0 @@ -[package] -name = "asset-hub-kusama-runtime" -version = "0.9.420" -authors = ["Parity Technologies "] -edition = "2021" -description = "Kusama variant of Asset Hub parachain runtime" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-asset-tx-payment = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nft-fractionalization = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nfts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nfts-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-state-trie-migration = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master", optional = true } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-uniques = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-weights = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -kusama-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = {path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0"} -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -assets-common = { path = "../common", default-features = false } - -[dev-dependencies] -asset-test-utils = { path = "../test-utils"} - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[features] -default = [ "std" ] -# When enabled the `state_version` is set to `1`. -# This means that the chain will start using the new state format. The migration is lazy, so -# it requires to write a storage value to use the new state format. To migrate all the other -# storage values that aren't touched the state migration pallet is added as well. -# This pallet will migrate the entire state, controlled through some account. -# -# This feature should be removed when the main-net will be migrated. -state-trie-version-1 = ["pallet-state-trie-migration"] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-assets/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-nft-fractionalization/runtime-benchmarks", - "pallet-nfts/runtime-benchmarks", - "pallet-proxy/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-uniques/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", - "pallet-state-trie-migration/runtime-benchmarks", - "assets-common/runtime-benchmarks", -] -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-asset-tx-payment/try-runtime", - "pallet-assets/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-multisig/try-runtime", - "pallet-nft-fractionalization/try-runtime", - "pallet-nfts/try-runtime", - "pallet-proxy/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-uniques/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", - "pallet-state-trie-migration/try-runtime", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "kusama-runtime-constants/std", - "pallet-asset-tx-payment/std", - "pallet-assets/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-multisig/std", - "pallet-nft-fractionalization/std", - "pallet-nfts/std", - "pallet-nfts-runtime-api/std", - "pallet-proxy/std", - "pallet-session/std", - "pallet-state-trie-migration/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-uniques/std", - "pallet-utility/std", - "pallet-xcm/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "pallet-collator-selection/std", - "parachain-info/std", - "parachains-common/std", - "assets-common/std", - "substrate-wasm-builder", -] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/build.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/constants.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/constants.rs deleted file mode 100644 index 7822698be6c0..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/constants.rs +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod currency { - use kusama_runtime_constants as constants; - use polkadot_core_primitives::Balance; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const GRAND: Balance = constants::currency::GRAND; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // map to 1/100 of what the kusama relay chain charges (v9020) - constants::currency::deposit(items, bytes) / 100 - } -} - -/// Fee-related. -pub mod fee { - use frame_support::weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, Weight, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Asset Hub, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs deleted file mode 100644 index d6ac8deb9e2d..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ /dev/null @@ -1,1365 +0,0 @@ -// Copyright (C) 2021-2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Asset Hub Kusama Runtime -//! -//! Asset Hub Kusama, formerly known as "Statemine", is the canary network for its Polkadot cousin. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod constants; -mod weights; -pub mod xcm_config; - -use assets_common::{ - foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, -}; -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, ConvertInto, Verify}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use codec::{Decode, Encode, MaxEncodedLen}; -use constants::{currency::*, fee::WeightToFee}; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ - AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, - InstanceFilter, - }, - weights::{ConstantMultiplier, Weight}, - BoundedVec, PalletId, RuntimeDebug, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, EnsureSigned, -}; -use pallet_nfts::PalletFeatures; -pub use parachains_common as common; -use parachains_common::{ - impls::{AssetsToBlockAuthor, DealWithFees}, - AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, BlockNumber, Hash, Header, Nonce, - Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, - NORMAL_DISPATCH_RATIO, SLOT_DURATION, -}; -use xcm_config::{ - FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation, KsmLocation, - TrustBackedAssetsConvertedConcreteId, XcmConfig, -}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::BodyId; -use xcm_executor::XcmExecutor; - -use crate::xcm_config::ForeignCreatorsSovereignAccountOf; -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[cfg(feature = "state-trie-version-1")] -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - // Note: "statemine" is the legacy name for this chain. It has been renamed to - // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" - // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. - spec_name: create_runtime_str!("statemine"), - impl_name: create_runtime_str!("statemine"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 13, - state_version: 1, -}; - -#[cfg(not(feature = "state-trie-version-1"))] -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - // Note: "statemine" is the legacy name for this change. It has been renamed to - // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" - // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. - spec_name: create_runtime_str!("statemine"), - impl_name: create_runtime_str!("statemine"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 13, - state_version: 0, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 2; -} - -// Configure FRAME pallets to include in runtime. -impl frame_system::Config for Runtime { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type AccountId = AccountId; - type RuntimeCall = RuntimeCall; - type Lookup = AccountIdLookup; - type Nonce = Nonce; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type BlockHashCount = BlockHashCount; - type DbWeight = RocksDbWeight; - type Version = Version; - type PalletInfo = PalletInfo; - type OnNewAccount = (); - type OnKilledAccount = (); - type AccountData = pallet_balances::AccountData; - type SystemWeightInfo = weights::frame_system::WeightInfo; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - // We allow each account to have holds on it from: - // - `NftFractionalization`: 1 - type MaxHolds = ConstU32<1>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -parameter_types! { - pub const AssetDeposit: Balance = UNITS / 10; // 1 / 10 UNITS deposit to create asset - pub const AssetAccountDeposit: Balance = deposit(1, 16); - pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; - pub const AssetsStringLimit: u32 = 50; - /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) - // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 - pub const MetadataDepositBase: Balance = deposit(1, 68); - pub const MetadataDepositPerByte: Balance = deposit(0, 1); -} - -/// We allow root to execute privileged asset operations. -pub type AssetsForceOrigin = EnsureRoot; - -// Called "Trust Backed" assets because these are generally registered by some account, and users of -// the asset assume it has some claimed backing. The pallet is called `Assets` in -// `construct_runtime` to avoid breaking changes on storage reads. -pub type TrustBackedAssetsInstance = pallet_assets::Instance1; -type TrustBackedAssetsCall = pallet_assets::Call; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = AssetIdForTrustBackedAssets; - type AssetIdParameter = codec::Compact; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_local::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - // we just reuse the same deposits - pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); - pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); - pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); - pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); - pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); - pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); -} - -/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as -/// this type is used in proxy definitions. We assume that a foreign location would not want to set -/// an individual, local account as a proxy for the issuance of their assets. This issuance should -/// be managed by the foreign location's governance. -pub type ForeignAssetsInstance = pallet_assets::Instance2; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = MultiLocationForAssetId; - type AssetIdParameter = MultiLocationForAssetId; - type Currency = Balances; - type CreateOrigin = ForeignCreators< - (FromSiblingParachain>,), - ForeignCreatorsSovereignAccountOf, - AccountId, - >; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = ForeignAssetsAssetDeposit; - type MetadataDepositBase = ForeignAssetsMetadataDepositBase; - type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; - type ApprovalDeposit = ForeignAssetsApprovalDeposit; - type StringLimit = ForeignAssetsAssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_foreign::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); - pub const MaxSignatories: u32 = 100; -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = MaxSignatories; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -parameter_types! { - // One storage item; key size 32, value size 8; . - pub const ProxyDepositBase: Balance = deposit(1, 40); - // Additional storage item size of 33 bytes. - pub const ProxyDepositFactor: Balance = deposit(0, 33); - pub const MaxProxies: u16 = 32; - // One storage item; key size 32, value size 16 - pub const AnnouncementDepositBase: Balance = deposit(1, 48); - pub const AnnouncementDepositFactor: Balance = deposit(0, 66); - pub const MaxPending: u16 = 32; -} - -/// The type used to represent the kinds of proxying allowed. -#[derive( - Copy, - Clone, - Eq, - PartialEq, - Ord, - PartialOrd, - Encode, - Decode, - RuntimeDebug, - MaxEncodedLen, - scale_info::TypeInfo, -)] -pub enum ProxyType { - /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. - Any, - /// Can execute any call that does not transfer funds or assets. - NonTransfer, - /// Proxy with the ability to reject time-delay proxy announcements. - CancelProxy, - /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. - Assets, - /// Owner proxy. Can execute calls related to asset ownership. - AssetOwner, - /// Asset manager. Can execute calls related to asset management. - AssetManager, - /// Collator selection proxy. Can execute calls related to collator selection mechanism. - Collator, -} -impl Default for ProxyType { - fn default() -> Self { - Self::Any - } -} - -impl InstanceFilter for ProxyType { - fn filter(&self, c: &RuntimeCall) -> bool { - match self { - ProxyType::Any => true, - ProxyType::NonTransfer => !matches!( - c, - RuntimeCall::Balances { .. } | - RuntimeCall::Assets { .. } | - RuntimeCall::NftFractionalization { .. } | - RuntimeCall::Nfts { .. } | - RuntimeCall::Uniques { .. } - ), - ProxyType::CancelProxy => matches!( - c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Assets => { - matches!( - c, - RuntimeCall::Assets { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } | - RuntimeCall::NftFractionalization { .. } | - RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } - ) - }, - ProxyType::AssetOwner => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::start_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_accounts { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_approvals { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::finish_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_min_balance { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::create { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::destroy { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::redeposit { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::transfer_ownership { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_team { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_max_supply { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_team { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_max_supply { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::AssetManager => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::block { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::touch_other { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::refund_other { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::force_mint { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::update_mint_settings { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::mint_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_attributes_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::unlock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_properties { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw_collection { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Collator => matches!( - c, - RuntimeCall::CollatorSelection { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - } - } - - fn is_superset(&self, o: &Self) -> bool { - match (self, o) { - (x, y) if x == y => true, - (ProxyType::Any, _) => true, - (_, ProxyType::Any) => false, - (ProxyType::Assets, ProxyType::AssetOwner) => true, - (ProxyType::Assets, ProxyType::AssetManager) => true, - (ProxyType::NonTransfer, ProxyType::Collator) => true, - _ => false, - } - } -} - -impl pallet_proxy::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type ProxyType = ProxyType; - type ProxyDepositBase = ProxyDepositBase; - type ProxyDepositFactor = ProxyDepositFactor; - type MaxProxies = MaxProxies; - type WeightInfo = weights::pallet_proxy::WeightInfo; - type MaxPending = MaxPending; - type CallHasher = BlakeTwo256; - type AnnouncementDepositBase = AnnouncementDepositBase; - type AnnouncementDepositFactor = AnnouncementDepositFactor; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type OutboundXcmpMessageSource = XcmpQueue; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -parameter_types! { - // Fellows pluralistic body. - pub const FellowsBodyId: BodyId = BodyId::Technical; -} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, - >; - type ControllerOriginConverter = xcm_config::XcmOriginToTransactDispatchOrigin; - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // StakingAdmin pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow root and the `StakingAdmin` to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -impl pallet_asset_tx_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Fungibles = Assets; - type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< - pallet_assets::BalanceToAssetBalance< - Balances, - Runtime, - ConvertInto, - TrustBackedAssetsInstance, - >, - AssetsToBlockAuthor, - >; -} - -parameter_types! { - pub const UniquesCollectionDeposit: Balance = UNITS / 10; // 1 / 10 UNIT deposit to create a collection - pub const UniquesItemDeposit: Balance = UNITS / 1_000; // 1 / 1000 UNIT deposit to mint an item - pub const UniquesMetadataDepositBase: Balance = deposit(1, 129); - pub const UniquesAttributeDepositBase: Balance = deposit(1, 0); - pub const UniquesDepositPerByte: Balance = deposit(0, 1); -} - -impl pallet_uniques::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type ForceOrigin = AssetsForceOrigin; - type CollectionDeposit = UniquesCollectionDeposit; - type ItemDeposit = UniquesItemDeposit; - type MetadataDepositBase = UniquesMetadataDepositBase; - type AttributeDepositBase = UniquesAttributeDepositBase; - type DepositPerByte = UniquesDepositPerByte; - type StringLimit = ConstU32<128>; - type KeyLimit = ConstU32<32>; - type ValueLimit = ConstU32<64>; - type WeightInfo = weights::pallet_uniques::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); - type CreateOrigin = AsEnsureOriginWithArg>; - type Locker = (); -} - -parameter_types! { - pub const NftFractionalizationPalletId: PalletId = PalletId(*b"fraction"); - pub NewAssetSymbol: BoundedVec = (*b"FRAC").to_vec().try_into().unwrap(); - pub NewAssetName: BoundedVec = (*b"Frac").to_vec().try_into().unwrap(); -} - -impl pallet_nft_fractionalization::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Deposit = AssetDeposit; - type Currency = Balances; - type NewAssetSymbol = NewAssetSymbol; - type NewAssetName = NewAssetName; - type StringLimit = AssetsStringLimit; - type NftCollectionId = ::CollectionId; - type NftId = ::ItemId; - type AssetBalance = ::Balance; - type AssetId = >::AssetId; - type Assets = Assets; - type Nfts = Nfts; - type PalletId = NftFractionalizationPalletId; - type WeightInfo = pallet_nft_fractionalization::weights::SubstrateWeight; - type RuntimeHoldReason = RuntimeHoldReason; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - pub NftsPalletFeatures: PalletFeatures = PalletFeatures::all_enabled(); - pub const NftsMaxDeadlineDuration: BlockNumber = 12 * 30 * DAYS; - // re-use the Uniques deposits - pub const NftsCollectionDeposit: Balance = UniquesCollectionDeposit::get(); - pub const NftsItemDeposit: Balance = UniquesItemDeposit::get(); - pub const NftsMetadataDepositBase: Balance = UniquesMetadataDepositBase::get(); - pub const NftsAttributeDepositBase: Balance = UniquesAttributeDepositBase::get(); - pub const NftsDepositPerByte: Balance = UniquesDepositPerByte::get(); -} - -impl pallet_nfts::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type Locker = (); - type CollectionDeposit = NftsCollectionDeposit; - type ItemDeposit = NftsItemDeposit; - type MetadataDepositBase = NftsMetadataDepositBase; - type AttributeDepositBase = NftsAttributeDepositBase; - type DepositPerByte = NftsDepositPerByte; - type StringLimit = ConstU32<256>; - type KeyLimit = ConstU32<64>; - type ValueLimit = ConstU32<256>; - type ApprovalsLimit = ConstU32<20>; - type ItemAttributesApprovalsLimit = ConstU32<30>; - type MaxTips = ConstU32<10>; - type MaxDeadlineDuration = NftsMaxDeadlineDuration; - type MaxAttributesPerCall = ConstU32<10>; - type Features = NftsPalletFeatures; - type OffchainSignature = Signature; - type OffchainPublic = ::Signer; - type WeightInfo = weights::pallet_nfts::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - // RandomnessCollectiveFlip = 2 removed - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - AssetTxPayment: pallet_asset_tx_payment::{Pallet, Event} = 12, - - // Collator support. the order of these 5 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, - Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, - - // The main stage. - Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, - Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, - Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, - ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, - NftFractionalization: pallet_nft_fractionalization::{Pallet, Call, Storage, Event, HoldReason} = 54, - - #[cfg(feature = "state-trie-version-1")] - StateTrieMigration: pallet_state_trie_migration = 70, - } -); - -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_asset_tx_payment::ChargeAssetTxPayment, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// Migrations to apply on runtime upgrade. -pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_assets, Local] - [pallet_assets, Foreign] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_nft_fractionalization, NftFractionalization] - [pallet_nfts, Nfts] - [pallet_proxy, Proxy] - [pallet_session, SessionBench::] - [pallet_uniques, Uniques] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - // XCM - [pallet_xcm, PolkadotXcm] - // NOTE: Make sure you point to the individual modules below. - [pallet_xcm_benchmarks::fungible, XcmBalances] - [pallet_xcm_benchmarks::generic, XcmGeneric] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl assets_common::runtime_api::FungiblesApi< - Block, - AccountId, - > for Runtime - { - fn query_account_balances(account: AccountId) -> Result { - use assets_common::fungible_conversion::{convert, convert_balance}; - Ok([ - // collect pallet_balance - { - let balance = Balances::free_balance(account.clone()); - if balance > 0 { - vec![convert_balance::(balance)?] - } else { - vec![] - } - }, - // collect pallet_assets (TrustBackedAssets) - convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( - Assets::account_balances(account.clone()) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect pallet_assets (ForeignAssets) - convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( - ForeignAssets::account_balances(account) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect ... e.g. other tokens - ].concat().into()) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - // This is defined once again in dispatch_benchmark, because list_benchmarks! - // and add_benchmarks! are macros exported by define_benchmarks! macros and those types - // are referenced in that call. - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - // Benchmark files generated for `Assets/ForeignAssets` instances are by default - // `pallet_assets_assets.rs / pallet_assets_foreign_assets`, which is not really nice, - // so with this redefinition we can change names to nicer: - // `pallet_assets_local.rs / pallet_assets_foreign.rs`. - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError, - TrackedStorageKey}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use xcm::latest::prelude::*; - use xcm_config::{KsmLocation, MaxAssetsIntoHolding}; - use pallet_xcm_benchmarks::asset_instance_from; - - impl pallet_xcm_benchmarks::Config for Runtime { - type XcmConfig = xcm_config::XcmConfig; - type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { - Ok(KsmLocation::get()) - } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { - // A mix of fungible, non-fungible, and concrete assets. - let holding_non_fungibles = MaxAssetsIntoHolding::get() / 2 - depositable_count; - let holding_fungibles = holding_non_fungibles.saturating_sub(1); - let fungibles_amount: u128 = 100; - let mut assets = (0..holding_fungibles) - .map(|i| { - MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: Fungible(fungibles_amount * i as u128), - } - }) - .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) - .chain((0..holding_non_fungibles).map(|i| MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: NonFungible(asset_instance_from(i)), - })) - .collect::>(); - - assets.push(MultiAsset { - id: Concrete(KsmLocation::get()), - fun: Fungible(1_000_000 * UNITS), - }); - assets.into() - } - } - - parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - KsmLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(KsmLocation::get()) }, - )); - pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; - } - - impl pallet_xcm_benchmarks::fungible::Config for Runtime { - type TransactAsset = Balances; - - type CheckedAccount = CheckedAccount; - type TrustedTeleporter = TrustedTeleporter; - type TrustedReserve = TrustedReserve; - - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(KsmLocation::get()), - fun: Fungible(UNITS), - } - } - } - - impl pallet_xcm_benchmarks::generic::Config for Runtime { - type RuntimeCall = RuntimeCall; - - fn worst_case_response() -> (u64, Response) { - (0u64, Response::Version(Default::default())) - } - - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((KsmLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) - } - - fn subscribe_origin() -> Result { - Ok(KsmLocation::get()) - } - - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = KsmLocation::get(); - let assets: MultiAssets = (Concrete(KsmLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; - Ok((origin, ticket, assets)) - } - - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - } - - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - //TODO: use from relay_well_known_keys::ACTIVE_CONFIG - hex_literal::hex!("06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} - -#[cfg(feature = "state-trie-version-1")] -parameter_types! { - // The deposit configuration for the singed migration. Specially if you want to allow any signed account to do the migration (see `SignedFilter`, these deposits should be high) - pub const MigrationSignedDepositPerItem: Balance = CENTS; - pub const MigrationSignedDepositBase: Balance = 2_000 * CENTS; - pub const MigrationMaxKeyLen: u32 = 512; -} - -#[cfg(feature = "state-trie-version-1")] -impl pallet_state_trie_migration::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type SignedDepositPerItem = MigrationSignedDepositPerItem; - type SignedDepositBase = MigrationSignedDepositBase; - // An origin that can control the whole pallet: should be Root, or a part of your council. - type ControlOrigin = frame_system::EnsureSignedBy; - // specific account for the migration, can trigger the signed migrations. - type SignedFilter = frame_system::EnsureSignedBy; - - // Replace this with weight based on your runtime. - type WeightInfo = pallet_state_trie_migration::weights::SubstrateWeight; - - type MaxKeyLen = MigrationMaxKeyLen; -} - -#[cfg(feature = "state-trie-version-1")] -frame_support::ord_parameter_types! { - pub const MigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); - pub const RootMigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); -} - -#[cfg(feature = "state-trie-version-1")] -#[test] -fn ensure_key_ss58() { - use frame_support::traits::SortedMembers; - use sp_core::crypto::Ss58Codec; - let acc = - AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); - //panic!("{:x?}", acc); - assert_eq!(acc, MigController::sorted_members()[0]); - let acc = - AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); - assert_eq!(acc, RootMigController::sorted_members()[0]); - //panic!("{:x?}", acc); -} - -#[cfg(test)] -mod tests { - use super::{constants::fee, *}; - use crate::{CENTS, MILLICENTS}; - use sp_runtime::traits::Zero; - use sp_weights::WeightToFee; - - /// We can fit at least 1000 transfers in a block. - #[test] - fn sane_block_weight() { - use pallet_balances::WeightInfo; - let block = RuntimeBlockWeights::get().max_block; - let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; - let transfer = - base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); - - let fit = block.checked_div_per_component(&transfer).unwrap_or_default(); - assert!(fit >= 1000, "{} should be at least 1000", fit); - } - - /// The fee for one transfer is at most 1 CENT. - #[test] - fn sane_transfer_fee() { - use pallet_balances::WeightInfo; - let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; - let transfer = - base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); - - let fee: Balance = fee::WeightToFee::weight_to_fee(&transfer); - assert!(fee <= CENTS, "{} MILLICENTS should be at most 1000", fee / MILLICENTS); - } - - /// Weight is being charged for both dimensions. - #[test] - fn weight_charged_for_both_components() { - let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(10_000, 0)); - assert!(!fee.is_zero(), "Charges for ref time"); - - let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, 10_000)); - assert_eq!(fee, CENTS, "10kb maps to CENT"); - } - - /// Filling up a block by proof size is at most 30 times more expensive than ref time. - /// - /// This is just a sanity check. - #[test] - fn full_block_fee_ratio() { - let block = RuntimeBlockWeights::get().max_block; - let time_fee: Balance = - fee::WeightToFee::weight_to_fee(&Weight::from_parts(block.ref_time(), 0)); - let proof_fee: Balance = - fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, block.proof_size())); - - let proof_o_time = proof_fee.checked_div(time_fee).unwrap_or_default(); - assert!(proof_o_time <= 30, "{} should be at most 30", proof_o_time); - let time_o_proof = time_fee.checked_div(proof_fee).unwrap_or_default(); - assert!(time_o_proof <= 30, "{} should be at most 30", time_o_proof); - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/block_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs deleted file mode 100644 index df8188debddf..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `cumulus_pallet_xcmp_queue` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=cumulus_pallet_xcmp_queue -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `cumulus_pallet_xcmp_queue`. -pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_467_000 picoseconds. - Weight::from_parts(5_634_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_409_000 picoseconds. - Weight::from_parts(5_570_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs deleted file mode 100644 index 20e421541b0d..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_106_000 picoseconds. - Weight::from_parts(1_884_213, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(388, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_528_000 picoseconds. - Weight::from_parts(27_081_927, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_730, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_882_000 picoseconds. - Weight::from_parts(4_149_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `119` - // Estimated: `1604` - // Minimum execution time: 103_389_161_000 picoseconds. - Weight::from_parts(106_870_091_000, 0) - .saturating_add(Weight::from_parts(0, 1604)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_236_000 picoseconds. - Weight::from_parts(2_302_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_045 - .saturating_add(Weight::from_parts(763_456, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_175_000 picoseconds. - Weight::from_parts(2_238_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_040 - .saturating_add(Weight::from_parts(571_397, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `84 + p * (69 ±0)` - // Estimated: `80 + p * (70 ±0)` - // Minimum execution time: 3_843_000 picoseconds. - Weight::from_parts(3_947_000, 0) - .saturating_add(Weight::from_parts(0, 80)) - // Standard Error: 2_188 - .saturating_add(Weight::from_parts(1_212_360, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/mod.rs deleted file mode 100644 index 6948d2b6d53d..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/mod.rs +++ /dev/null @@ -1,25 +0,0 @@ -pub mod block_weights; -pub mod cumulus_pallet_xcmp_queue; -pub mod extrinsic_weights; -pub mod frame_system; -pub mod pallet_assets_foreign; -pub mod pallet_assets_local; -pub mod pallet_balances; -pub mod pallet_collator_selection; -pub mod pallet_multisig; -pub mod pallet_nft_fractionalization; -pub mod pallet_nfts; -pub mod pallet_proxy; -pub mod pallet_session; -pub mod pallet_timestamp; -pub mod pallet_uniques; -pub mod pallet_utility; -pub mod pallet_xcm; -pub mod paritydb_weights; -pub mod rocksdb_weights; -pub mod xcm; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets_foreign.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets_foreign.rs deleted file mode 100644 index e13b7c66af30..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets_foreign.rs +++ /dev/null @@ -1,535 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_assets` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_assets -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_assets`. -pub struct WeightInfo(PhantomData); -impl pallet_assets::WeightInfo for WeightInfo { - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `4273` - // Minimum execution time: 30_100_000 picoseconds. - Weight::from_parts(30_644_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `4` - // Estimated: `4273` - // Minimum execution time: 12_815_000 picoseconds. - Weight::from_parts(13_088_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn start_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 15_186_000 picoseconds. - Weight::from_parts(15_663_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1001 w:1000) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1000 w:1000) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - fn destroy_accounts(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + c * (208 ±0)` - // Estimated: `4273 + c * (3207 ±0)` - // Minimum execution time: 17_916_000 picoseconds. - Weight::from_parts(18_252_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 8_609 - .saturating_add(Weight::from_parts(15_462_880, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 3207).saturating_mul(c.into())) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1001 w:1000) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy_approvals(a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `413 + a * (86 ±0)` - // Estimated: `4273 + a * (3221 ±0)` - // Minimum execution time: 18_610_000 picoseconds. - Weight::from_parts(19_231_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 4_798 - .saturating_add(Weight::from_parts(15_618_410, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 3221).saturating_mul(a.into())) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:0) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn finish_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 15_414_000 picoseconds. - Weight::from_parts(16_091_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 26_573_000 picoseconds. - Weight::from_parts(27_130_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 33_847_000 picoseconds. - Weight::from_parts(34_528_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 46_003_000 picoseconds. - Weight::from_parts(47_122_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 40_731_000 picoseconds. - Weight::from_parts(41_847_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 45_662_000 picoseconds. - Weight::from_parts(47_432_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 18_673_000 picoseconds. - Weight::from_parts(19_209_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 18_636_000 picoseconds. - Weight::from_parts(19_556_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn freeze_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 14_685_000 picoseconds. - Weight::from_parts(15_276_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn thaw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 14_399_000 picoseconds. - Weight::from_parts(14_880_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:0) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 15_787_000 picoseconds. - Weight::from_parts(16_265_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 14_148_000 picoseconds. - Weight::from_parts(14_631_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 29_277_000 picoseconds. - Weight::from_parts(30_395_865, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 790 - .saturating_add(Weight::from_parts(4_644, 0).saturating_mul(n.into())) - // Standard Error: 790 - .saturating_add(Weight::from_parts(2_225, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `406` - // Estimated: `4273` - // Minimum execution time: 30_520_000 picoseconds. - Weight::from_parts(31_061_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `81` - // Estimated: `4273` - // Minimum execution time: 13_342_000 picoseconds. - Weight::from_parts(14_077_576, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 277 - .saturating_add(Weight::from_parts(1_864, 0).saturating_mul(n.into())) - // Standard Error: 277 - .saturating_add(Weight::from_parts(772, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn force_clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `406` - // Estimated: `4273` - // Minimum execution time: 29_820_000 picoseconds. - Weight::from_parts(30_466_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn force_asset_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 13_342_000 picoseconds. - Weight::from_parts(13_735_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 32_714_000 picoseconds. - Weight::from_parts(33_526_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `520` - // Estimated: `7404` - // Minimum execution time: 65_470_000 picoseconds. - Weight::from_parts(66_948_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `446` - // Estimated: `4273` - // Minimum execution time: 35_313_000 picoseconds. - Weight::from_parts(36_080_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn force_cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `446` - // Estimated: `4273` - // Minimum execution time: 36_033_000 picoseconds. - Weight::from_parts(36_906_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn set_min_balance() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 15_172_000 picoseconds. - Weight::from_parts(15_806_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn touch() -> Weight { - // Proof Size summary in bytes: - // Measured: `345` - // Estimated: `4273` - // Minimum execution time: 34_557_000 picoseconds. - Weight::from_parts(35_554_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn touch_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 32_672_000 picoseconds. - Weight::from_parts(33_691_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn refund() -> Weight { - // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `4273` - // Minimum execution time: 31_168_000 picoseconds. - Weight::from_parts(32_109_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn refund_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `401` - // Estimated: `4273` - // Minimum execution time: 29_325_000 picoseconds. - Weight::from_parts(30_219_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn block() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 18_484_000 picoseconds. - Weight::from_parts(18_958_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets_local.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets_local.rs deleted file mode 100644 index b664ca8d096c..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_assets_local.rs +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_assets` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_assets -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_assets`. -pub struct WeightInfo(PhantomData); -impl pallet_assets::WeightInfo for WeightInfo { - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3675` - // Minimum execution time: 26_510_000 picoseconds. - Weight::from_parts(27_332_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3675` - // Minimum execution time: 10_899_000 picoseconds. - Weight::from_parts(11_395_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn start_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 13_593_000 picoseconds. - Weight::from_parts(14_108_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1001 w:1000) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1000 w:1000) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - fn destroy_accounts(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + c * (208 ±0)` - // Estimated: `3675 + c * (2609 ±0)` - // Minimum execution time: 16_216_000 picoseconds. - Weight::from_parts(16_636_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 9_346 - .saturating_add(Weight::from_parts(15_306_152, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2609).saturating_mul(c.into())) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1001 w:1000) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy_approvals(a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `414 + a * (86 ±0)` - // Estimated: `3675 + a * (2623 ±0)` - // Minimum execution time: 17_105_000 picoseconds. - Weight::from_parts(17_370_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 5_012 - .saturating_add(Weight::from_parts(15_634_963, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2623).saturating_mul(a.into())) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:0) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn finish_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 13_650_000 picoseconds. - Weight::from_parts(14_721_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 24_121_000 picoseconds. - Weight::from_parts(25_023_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 31_414_000 picoseconds. - Weight::from_parts(32_235_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 43_114_000 picoseconds. - Weight::from_parts(44_106_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 37_954_000 picoseconds. - Weight::from_parts(38_772_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 43_051_000 picoseconds. - Weight::from_parts(44_003_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 17_048_000 picoseconds. - Weight::from_parts(17_614_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_705_000 picoseconds. - Weight::from_parts(17_581_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn freeze_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 13_284_000 picoseconds. - Weight::from_parts(13_735_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn thaw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 13_030_000 picoseconds. - Weight::from_parts(13_417_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:0) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 14_174_000 picoseconds. - Weight::from_parts(14_660_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 12_737_000 picoseconds. - Weight::from_parts(13_172_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 27_707_000 picoseconds. - Weight::from_parts(29_036_880, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 688 - .saturating_add(Weight::from_parts(2_426, 0).saturating_mul(n.into())) - // Standard Error: 688 - .saturating_add(Weight::from_parts(776, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `407` - // Estimated: `3675` - // Minimum execution time: 28_514_000 picoseconds. - Weight::from_parts(29_216_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `82` - // Estimated: `3675` - // Minimum execution time: 12_452_000 picoseconds. - Weight::from_parts(13_095_356, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 275 - .saturating_add(Weight::from_parts(826, 0).saturating_mul(n.into())) - // Standard Error: 275 - .saturating_add(Weight::from_parts(808, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn force_clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `407` - // Estimated: `3675` - // Minimum execution time: 28_181_000 picoseconds. - Weight::from_parts(29_050_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_asset_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 12_253_000 picoseconds. - Weight::from_parts(12_545_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 31_084_000 picoseconds. - Weight::from_parts(32_052_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `521` - // Estimated: `6208` - // Minimum execution time: 61_756_000 picoseconds. - Weight::from_parts(62_740_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3675` - // Minimum execution time: 33_370_000 picoseconds. - Weight::from_parts(34_127_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn force_cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3675` - // Minimum execution time: 33_753_000 picoseconds. - Weight::from_parts(34_613_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_min_balance() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 13_508_000 picoseconds. - Weight::from_parts(13_997_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn touch() -> Weight { - // Proof Size summary in bytes: - // Measured: `346` - // Estimated: `3675` - // Minimum execution time: 32_578_000 picoseconds. - Weight::from_parts(33_675_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn touch_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 30_768_000 picoseconds. - Weight::from_parts(31_710_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn refund() -> Weight { - // Proof Size summary in bytes: - // Measured: `472` - // Estimated: `3675` - // Minimum execution time: 30_028_000 picoseconds. - Weight::from_parts(30_793_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn refund_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `402` - // Estimated: `3675` - // Minimum execution time: 28_354_000 picoseconds. - Weight::from_parts(29_097_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn block() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_607_000 picoseconds. - Weight::from_parts(17_433_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs deleted file mode 100644 index b387e626209c..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_balances.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_balances` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_balances`. -pub struct WeightInfo(PhantomData); -impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_allow_death() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 55_040_000 picoseconds. - Weight::from_parts(56_106_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 41_342_000 picoseconds. - Weight::from_parts(41_890_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_creating() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 14_723_000 picoseconds. - Weight::from_parts(15_182_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_killing() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 22_073_000 picoseconds. - Weight::from_parts(22_638_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 57_265_000 picoseconds. - Weight::from_parts(58_222_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_all() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 51_485_000 picoseconds. - Weight::from_parts(52_003_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_unreserve() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 17_460_000 picoseconds. - Weight::from_parts(17_849_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:999 w:999) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(u: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 17_259_000 picoseconds. - Weight::from_parts(17_478_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 16_756 - .saturating_add(Weight::from_parts(15_291_954, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs deleted file mode 100644 index a528b0f66852..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_collator_selection.rs +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collator_selection` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_collator_selection -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collator_selection`. -pub struct WeightInfo(PhantomData); -impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:20 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `163 + b * (79 ±0)` - // Estimated: `1154 + b * (2555 ±0)` - // Minimum execution time: 15_408_000 picoseconds. - Weight::from_parts(13_068_592, 0) - .saturating_add(Weight::from_parts(0, 1154)) - // Standard Error: 7_395 - .saturating_add(Weight::from_parts(3_219_916, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) - } - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `756 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 49_692_000 picoseconds. - Weight::from_parts(51_768_986, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 18_404 - .saturating_add(Weight::from_parts(55_676, 0).saturating_mul(b.into())) - // Standard Error: 3_488 - .saturating_add(Weight::from_parts(184_343, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `119 + b * (32 ±0)` - // Estimated: `6287` - // Minimum execution time: 16_486_000 picoseconds. - Weight::from_parts(16_646_017, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 3_230 - .saturating_add(Weight::from_parts(148_941, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn set_desired_candidates() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_806_000 picoseconds. - Weight::from_parts(8_002_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_937_000 picoseconds. - Weight::from_parts(8_161_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `736 + c * (52 ±0)` - // Estimated: `6287 + c * (54 ±0)` - // Minimum execution time: 42_805_000 picoseconds. - Weight::from_parts(45_979_502, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_336 - .saturating_add(Weight::from_parts(221_049, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[4, 100]`. - fn leave_intent(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `306 + c * (50 ±0)` - // Estimated: `6287` - // Minimum execution time: 34_814_000 picoseconds. - Weight::from_parts(36_371_520, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_391 - .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - fn note_author() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 46_989_000 picoseconds. - Weight::from_parts(48_151_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:97 w:97) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `r` is `[1, 100]`. - /// The range of component `c` is `[1, 100]`. - fn new_session(r: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `2243 + c * (97 ±0) + r * (112 ±0)` - // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 17_547_000 picoseconds. - Weight::from_parts(17_854_000, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 370_637 - .saturating_add(Weight::from_parts(15_798_857, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs deleted file mode 100644 index f949a0786bfc..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_multisig.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_multisig` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_multisig -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_multisig`. -pub struct WeightInfo(PhantomData); -impl pallet_multisig::WeightInfo for WeightInfo { - /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_714_000 picoseconds. - Weight::from_parts(14_440_231, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 5 - .saturating_add(Weight::from_parts(598, 0).saturating_mul(z.into())) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `262 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 44_768_000 picoseconds. - Weight::from_parts(33_662_218, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_633 - .saturating_add(Weight::from_parts(128_927, 0).saturating_mul(s.into())) - // Standard Error: 16 - .saturating_add(Weight::from_parts(1_543, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[3, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_approve(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 29_745_000 picoseconds. - Weight::from_parts(20_559_891, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 914 - .saturating_add(Weight::from_parts(103_601, 0).saturating_mul(s.into())) - // Standard Error: 8 - .saturating_add(Weight::from_parts(1_504, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `385 + s * (33 ±0)` - // Estimated: `6811` - // Minimum execution time: 51_506_000 picoseconds. - Weight::from_parts(36_510_777, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 2_183 - .saturating_add(Weight::from_parts(183_764, 0).saturating_mul(s.into())) - // Standard Error: 21 - .saturating_add(Weight::from_parts(1_653, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 31_072_000 picoseconds. - Weight::from_parts(32_408_621, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 913 - .saturating_add(Weight::from_parts(121_410, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 18_301_000 picoseconds. - Weight::from_parts(18_223_547, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 747 - .saturating_add(Weight::from_parts(114_584, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + s * (1 ±0)` - // Estimated: `6811` - // Minimum execution time: 32_107_000 picoseconds. - Weight::from_parts(33_674_827, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_220 - .saturating_add(Weight::from_parts(122_011, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nft_fractionalization.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nft_fractionalization.rs deleted file mode 100644 index ab3bcbea8268..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nft_fractionalization.rs +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_nft_fractionalization` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_nft_fractionalization -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_nft_fractionalization`. -pub struct WeightInfo(PhantomData); -impl pallet_nft_fractionalization::WeightInfo for WeightInfo { - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// Storage: `NftFractionalization::NftToAsset` (r:0 w:1) - /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) - fn fractionalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `462` - // Estimated: `4326` - // Minimum execution time: 178_501_000 picoseconds. - Weight::from_parts(180_912_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) - } - /// Storage: `NftFractionalization::NftToAsset` (r:1 w:1) - /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn unify() -> Weight { - // Proof Size summary in bytes: - // Measured: `1275` - // Estimated: `4326` - // Minimum execution time: 125_253_000 picoseconds. - Weight::from_parts(128_238_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(10)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs deleted file mode 100644 index 453d2d477bf0..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_nfts.rs +++ /dev/null @@ -1,773 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_nfts` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_nfts -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_nfts`. -pub struct WeightInfo(PhantomData); -impl pallet_nfts::WeightInfo for WeightInfo { - /// Storage: `Nfts::NextCollectionId` (r:1 w:1) - /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `179` - // Estimated: `3549` - // Minimum execution time: 39_124_000 picoseconds. - Weight::from_parts(39_975_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::NextCollectionId` (r:1 w:1) - /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `3549` - // Minimum execution time: 23_444_000 picoseconds. - Weight::from_parts(23_857_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1001 w:1000) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1000 w:1000) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:0 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// The range of component `m` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `32204 + a * (366 ±0)` - // Estimated: `2523990 + a * (2954 ±0)` - // Minimum execution time: 1_224_365_000 picoseconds. - Weight::from_parts(1_281_136_346, 0) - .saturating_add(Weight::from_parts(0, 2523990)) - // Standard Error: 10_484 - .saturating_add(Weight::from_parts(6_910_740, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(1004)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1005)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) - } - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `455` - // Estimated: `4326` - // Minimum execution time: 50_489_000 picoseconds. - Weight::from_parts(51_045_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn force_mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `455` - // Estimated: `4326` - // Minimum execution time: 49_146_000 picoseconds. - Weight::from_parts(49_756_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:0 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `564` - // Estimated: `4326` - // Minimum execution time: 56_059_000 picoseconds. - Weight::from_parts(57_162_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(7)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:2) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `593` - // Estimated: `4326` - // Minimum execution time: 42_406_000 picoseconds. - Weight::from_parts(43_187_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:5000 w:5000) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// The range of component `i` is `[0, 5000]`. - fn redeposit(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `763 + i * (108 ±0)` - // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 16_960_000 picoseconds. - Weight::from_parts(17_167_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - // Standard Error: 24_110 - .saturating_add(Weight::from_parts(18_046_970, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 3336).saturating_mul(i.into())) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn lock_item_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `435` - // Estimated: `3534` - // Minimum execution time: 21_023_000 picoseconds. - Weight::from_parts(21_409_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn unlock_item_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `435` - // Estimated: `3534` - // Minimum execution time: 20_706_000 picoseconds. - Weight::from_parts(21_030_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn lock_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `340` - // Estimated: `3549` - // Minimum execution time: 17_449_000 picoseconds. - Weight::from_parts(17_804_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:2) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3549` - // Minimum execution time: 22_958_000 picoseconds. - Weight::from_parts(23_499_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:2 w:4) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `369` - // Estimated: `6078` - // Minimum execution time: 40_105_000 picoseconds. - Weight::from_parts(40_800_000, 0) - .saturating_add(Weight::from_parts(0, 6078)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:2) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_collection_owner() -> Weight { - // Proof Size summary in bytes: - // Measured: `311` - // Estimated: `3549` - // Minimum execution time: 17_832_000 picoseconds. - Weight::from_parts(18_297_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn force_collection_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `3549` - // Minimum execution time: 15_027_000 picoseconds. - Weight::from_parts(15_370_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn lock_item_properties() -> Weight { - // Proof Size summary in bytes: - // Measured: `435` - // Estimated: `3534` - // Minimum execution time: 19_912_000 picoseconds. - Weight::from_parts(20_258_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - fn set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `539` - // Estimated: `3944` - // Minimum execution time: 50_138_000 picoseconds. - Weight::from_parts(50_971_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - fn force_set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `344` - // Estimated: `3944` - // Minimum execution time: 26_385_000 picoseconds. - Weight::from_parts(27_086_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - fn clear_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `983` - // Estimated: `3944` - // Minimum execution time: 45_687_000 picoseconds. - Weight::from_parts(47_107_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - fn approve_item_attributes() -> Weight { - // Proof Size summary in bytes: - // Measured: `381` - // Estimated: `4466` - // Minimum execution time: 18_065_000 picoseconds. - Weight::from_parts(18_371_000, 0) - .saturating_add(Weight::from_parts(0, 4466)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1001 w:1000) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - fn cancel_item_attributes_approval(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `760 + n * (398 ±0)` - // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 26_680_000 picoseconds. - Weight::from_parts(27_010_000, 0) - .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 6_351 - .saturating_add(Weight::from_parts(6_584_290, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - fn set_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `539` - // Estimated: `3812` - // Minimum execution time: 42_038_000 picoseconds. - Weight::from_parts(42_758_000, 0) - .saturating_add(Weight::from_parts(0, 3812)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `849` - // Estimated: `3812` - // Minimum execution time: 40_220_000 picoseconds. - Weight::from_parts(41_026_000, 0) - .saturating_add(Weight::from_parts(0, 3812)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - fn set_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `398` - // Estimated: `3759` - // Minimum execution time: 38_135_000 picoseconds. - Weight::from_parts(38_561_000, 0) - .saturating_add(Weight::from_parts(0, 3759)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - fn clear_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `716` - // Estimated: `3759` - // Minimum execution time: 37_583_000 picoseconds. - Weight::from_parts(38_215_000, 0) - .saturating_add(Weight::from_parts(0, 3759)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `410` - // Estimated: `4326` - // Minimum execution time: 21_405_000 picoseconds. - Weight::from_parts(21_803_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `418` - // Estimated: `4326` - // Minimum execution time: 18_713_000 picoseconds. - Weight::from_parts(19_185_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn clear_all_transfer_approvals() -> Weight { - // Proof Size summary in bytes: - // Measured: `418` - // Estimated: `4326` - // Minimum execution time: 17_803_000 picoseconds. - Weight::from_parts(18_270_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn set_accept_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `3517` - // Minimum execution time: 15_982_000 picoseconds. - Weight::from_parts(16_700_000, 0) - .saturating_add(Weight::from_parts(0, 3517)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - fn set_collection_max_supply() -> Weight { - // Proof Size summary in bytes: - // Measured: `340` - // Estimated: `3549` - // Minimum execution time: 19_501_000 picoseconds. - Weight::from_parts(19_785_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn update_mint_settings() -> Weight { - // Proof Size summary in bytes: - // Measured: `323` - // Estimated: `3538` - // Minimum execution time: 18_914_000 picoseconds. - Weight::from_parts(19_292_000, 0) - .saturating_add(Weight::from_parts(0, 3538)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn set_price() -> Weight { - // Proof Size summary in bytes: - // Measured: `518` - // Estimated: `4326` - // Minimum execution time: 24_625_000 picoseconds. - Weight::from_parts(25_257_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:1 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:2) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn buy_item() -> Weight { - // Proof Size summary in bytes: - // Measured: `705` - // Estimated: `4326` - // Minimum execution time: 50_833_000 picoseconds. - Weight::from_parts(52_161_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// The range of component `n` is `[0, 10]`. - fn pay_tips(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_220_000 picoseconds. - Weight::from_parts(3_476_001, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 7_084 - .saturating_add(Weight::from_parts(3_844_820, 0).saturating_mul(n.into())) - } - /// Storage: `Nfts::Item` (r:2 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn create_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `494` - // Estimated: `7662` - // Minimum execution time: 21_983_000 picoseconds. - Weight::from_parts(22_746_000, 0) - .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::PendingSwapOf` (r:1 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn cancel_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `513` - // Estimated: `4326` - // Minimum execution time: 20_875_000 picoseconds. - Weight::from_parts(21_465_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:2 w:2) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:1 w:2) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:2 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:2 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:4) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:2) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn claim_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `834` - // Estimated: `7662` - // Minimum execution time: 84_771_000 picoseconds. - Weight::from_parts(86_078_000, 0) - .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(10)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:2 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:10 w:10) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 10]`. - fn mint_pre_signed(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `558` - // Estimated: `6078 + n * (2954 ±0)` - // Minimum execution time: 143_265_000 picoseconds. - Weight::from_parts(150_978_773, 0) - .saturating_add(Weight::from_parts(0, 6078)) - // Standard Error: 49_443 - .saturating_add(Weight::from_parts(31_888_255, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(6)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:10 w:10) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 10]`. - fn set_attributes_pre_signed(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `588` - // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 83_754_000 picoseconds. - Weight::from_parts(96_685_026, 0) - .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 72_592 - .saturating_add(Weight::from_parts(30_914_858, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs deleted file mode 100644 index 6c548ac1f27c..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_proxy.rs +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_proxy` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_proxy -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_proxy`. -pub struct WeightInfo(PhantomData); -impl pallet_proxy::WeightInfo for WeightInfo { - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 16_417_000 picoseconds. - Weight::from_parts(17_283_443, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_409 - .saturating_add(Weight::from_parts(32_123, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn proxy_announced(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 37_572_000 picoseconds. - Weight::from_parts(37_045_756, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 2_896 - .saturating_add(Weight::from_parts(139_561, 0).saturating_mul(a.into())) - // Standard Error: 2_993 - .saturating_add(Weight::from_parts(73_270, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn remove_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 24_066_000 picoseconds. - Weight::from_parts(24_711_403, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_626 - .saturating_add(Weight::from_parts(128_391, 0).saturating_mul(a.into())) - // Standard Error: 1_680 - .saturating_add(Weight::from_parts(23_124, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn reject_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 24_162_000 picoseconds. - Weight::from_parts(23_928_058, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 2_072 - .saturating_add(Weight::from_parts(152_299, 0).saturating_mul(a.into())) - // Standard Error: 2_141 - .saturating_add(Weight::from_parts(39_775, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn announce(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 33_858_000 picoseconds. - Weight::from_parts(33_568_059, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_816 - .saturating_add(Weight::from_parts(134_400, 0).saturating_mul(a.into())) - // Standard Error: 1_876 - .saturating_add(Weight::from_parts(57_028, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn add_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 24_947_000 picoseconds. - Weight::from_parts(26_235_199, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_363 - .saturating_add(Weight::from_parts(41_435, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 25_186_000 picoseconds. - Weight::from_parts(26_823_133, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_259 - .saturating_add(Weight::from_parts(34_224, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxies(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 22_156_000 picoseconds. - Weight::from_parts(23_304_060, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_738 - .saturating_add(Weight::from_parts(39_612, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn create_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `139` - // Estimated: `4706` - // Minimum execution time: 26_914_000 picoseconds. - Weight::from_parts(28_009_062, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_978 - .saturating_add(Weight::from_parts(12_255, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 30]`. - fn kill_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `164 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 23_281_000 picoseconds. - Weight::from_parts(24_392_989, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_943 - .saturating_add(Weight::from_parts(30_287, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs deleted file mode 100644 index c5064adf8b03..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_session.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_session` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_session -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_session`. -pub struct WeightInfo(PhantomData); -impl pallet_session::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:1 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn set_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `270` - // Estimated: `3735` - // Minimum execution time: 16_932_000 picoseconds. - Weight::from_parts(17_357_000, 0) - .saturating_add(Weight::from_parts(0, 3735)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:0 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn purge_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `3707` - // Minimum execution time: 12_157_000 picoseconds. - Weight::from_parts(12_770_000, 0) - .saturating_add(Weight::from_parts(0, 3707)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs deleted file mode 100644 index 8edae065f1b9..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_timestamp.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_timestamp` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_timestamp -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_timestamp`. -pub struct WeightInfo(PhantomData); -impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: `Timestamp::Now` (r:1 w:1) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Aura::CurrentSlot` (r:1 w:0) - /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set() -> Weight { - // Proof Size summary in bytes: - // Measured: `86` - // Estimated: `1493` - // Minimum execution time: 9_313_000 picoseconds. - Weight::from_parts(9_775_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn on_finalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `57` - // Estimated: `0` - // Minimum execution time: 3_322_000 picoseconds. - Weight::from_parts(3_577_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs deleted file mode 100644 index 4da387aa872e..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_uniques.rs +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_uniques` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_uniques -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_uniques`. -pub struct WeightInfo(PhantomData); -impl pallet_uniques::WeightInfo for WeightInfo { - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3643` - // Minimum execution time: 28_845_000 picoseconds. - Weight::from_parts(29_675_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3643` - // Minimum execution time: 13_492_000 picoseconds. - Weight::from_parts(14_049_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1001 w:1000) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1000 w:1000) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1000 w:1000) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:0 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1000) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::CollectionMaxSupply` (r:0 w:1) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - /// The range of component `m` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy(n: u32, m: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` - // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` - // Minimum execution time: 2_920_070_000 picoseconds. - Weight::from_parts(2_983_862_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 36_415 - .saturating_add(Weight::from_parts(7_589_778, 0).saturating_mul(n.into())) - // Standard Error: 36_415 - .saturating_add(Weight::from_parts(479_496, 0).saturating_mul(m.into())) - // Standard Error: 36_415 - .saturating_add(Weight::from_parts(562_056, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) - .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::CollectionMaxSupply` (r:1 w:0) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 35_329_000 picoseconds. - Weight::from_parts(36_019_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 36_474_000 picoseconds. - Weight::from_parts(37_190_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:2) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 26_786_000 picoseconds. - Weight::from_parts(27_400_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:5000 w:5000) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// The range of component `i` is `[0, 5000]`. - fn redeposit(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `738 + i * (76 ±0)` - // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 14_546_000 picoseconds. - Weight::from_parts(14_831_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 24_362 - .saturating_add(Weight::from_parts(17_972_938, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(i.into())) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 18_919_000 picoseconds. - Weight::from_parts(19_547_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 18_643_000 picoseconds. - Weight::from_parts(19_000_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn freeze_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_530_000 picoseconds. - Weight::from_parts(14_165_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn thaw_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_523_000 picoseconds. - Weight::from_parts(14_055_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:2) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `356` - // Estimated: `3643` - // Minimum execution time: 22_131_000 picoseconds. - Weight::from_parts(22_628_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_841_000 picoseconds. - Weight::from_parts(14_408_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_item_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 16_954_000 picoseconds. - Weight::from_parts(17_482_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - fn set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `559` - // Estimated: `3652` - // Minimum execution time: 38_493_000 picoseconds. - Weight::from_parts(39_513_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - fn clear_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `756` - // Estimated: `3652` - // Minimum execution time: 37_918_000 picoseconds. - Weight::from_parts(38_666_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - fn set_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `348` - // Estimated: `3652` - // Minimum execution time: 29_810_000 picoseconds. - Weight::from_parts(30_363_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `559` - // Estimated: `3652` - // Minimum execution time: 30_877_000 picoseconds. - Weight::from_parts(31_430_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - fn set_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 30_478_000 picoseconds. - Weight::from_parts(31_065_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - fn clear_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `473` - // Estimated: `3643` - // Minimum execution time: 29_582_000 picoseconds. - Weight::from_parts(30_160_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 19_328_000 picoseconds. - Weight::from_parts(19_866_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `461` - // Estimated: `3643` - // Minimum execution time: 19_131_000 picoseconds. - Weight::from_parts(19_569_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn set_accept_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3517` - // Minimum execution time: 15_212_000 picoseconds. - Weight::from_parts(15_691_000, 0) - .saturating_add(Weight::from_parts(0, 3517)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::CollectionMaxSupply` (r:1 w:1) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn set_collection_max_supply() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 16_290_000 picoseconds. - Weight::from_parts(16_654_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:0) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn set_price() -> Weight { - // Proof Size summary in bytes: - // Measured: `259` - // Estimated: `3587` - // Minimum execution time: 16_095_000 picoseconds. - Weight::from_parts(16_555_000, 0) - .saturating_add(Weight::from_parts(0, 3587)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:1 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:2) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn buy_item() -> Weight { - // Proof Size summary in bytes: - // Measured: `540` - // Estimated: `3643` - // Minimum execution time: 35_506_000 picoseconds. - Weight::from_parts(36_305_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs deleted file mode 100644 index 22d20c26e25e..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_utility.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_utility` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_utility -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_utility`. -pub struct WeightInfo(PhantomData); -impl pallet_utility::WeightInfo for WeightInfo { - /// The range of component `c` is `[0, 1000]`. - fn batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_103_000 picoseconds. - Weight::from_parts(7_226_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_732 - .saturating_add(Weight::from_parts(6_560_347, 0).saturating_mul(c.into())) - } - fn as_derivative() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_208_000 picoseconds. - Weight::from_parts(5_480_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn batch_all(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_070_000 picoseconds. - Weight::from_parts(1_321_270, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_454 - .saturating_add(Weight::from_parts(6_864_640, 0).saturating_mul(c.into())) - } - fn dispatch_as() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_255_000 picoseconds. - Weight::from_parts(9_683_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn force_batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_852_000 picoseconds. - Weight::from_parts(7_007_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_745 - .saturating_add(Weight::from_parts(6_562_902, 0).saturating_mul(c.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs deleted file mode 100644 index ee76b111e83c..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/pallet_xcm.rs +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_xcm`. -pub struct WeightInfo(PhantomData); -impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn send() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 30_015_000 picoseconds. - Weight::from_parts(30_576_000, 0) - .saturating_add(Weight::from_parts(0, 3574)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 24_785_000 picoseconds. - Weight::from_parts(25_097_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn reserve_transfer_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 18_561_000 picoseconds. - Weight::from_parts(19_121_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn execute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_298_000 picoseconds. - Weight::from_parts(9_721_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_default_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_912_000 picoseconds. - Weight::from_parts(3_262_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_subscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 35_127_000 picoseconds. - Weight::from_parts(36_317_000, 0) - .saturating_add(Weight::from_parts(0, 3574)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_unsubscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `326` - // Estimated: `3791` - // Minimum execution time: 36_634_000 picoseconds. - Weight::from_parts(37_983_000, 0) - .saturating_add(Weight::from_parts(0, 3791)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) - /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_suspension() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_940_000 picoseconds. - Weight::from_parts(3_085_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_supported_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `162` - // Estimated: `11052` - // Minimum execution time: 17_400_000 picoseconds. - Weight::from_parts(17_759_000, 0) - .saturating_add(Weight::from_parts(0, 11052)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notifiers() -> Weight { - // Proof Size summary in bytes: - // Measured: `166` - // Estimated: `11056` - // Minimum execution time: 17_287_000 picoseconds. - Weight::from_parts(17_678_000, 0) - .saturating_add(Weight::from_parts(0, 11056)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn already_notified_target() -> Weight { - // Proof Size summary in bytes: - // Measured: `173` - // Estimated: `13538` - // Minimum execution time: 18_941_000 picoseconds. - Weight::from_parts(19_285_000, 0) - .saturating_add(Weight::from_parts(0, 13538)) - .saturating_add(T::DbWeight::get().reads(5)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn notify_current_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `176` - // Estimated: `6116` - // Minimum execution time: 32_668_000 picoseconds. - Weight::from_parts(33_533_000, 0) - .saturating_add(Weight::from_parts(0, 6116)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn notify_target_migration_fail() -> Weight { - // Proof Size summary in bytes: - // Measured: `206` - // Estimated: `8621` - // Minimum execution time: 9_182_000 picoseconds. - Weight::from_parts(9_498_000, 0) - .saturating_add(Weight::from_parts(0, 8621)) - .saturating_add(T::DbWeight::get().reads(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notify_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `173` - // Estimated: `11063` - // Minimum execution time: 17_519_000 picoseconds. - Weight::from_parts(17_943_000, 0) - .saturating_add(Weight::from_parts(0, 11063)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn migrate_and_notify_old_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `179` - // Estimated: `11069` - // Minimum execution time: 38_680_000 picoseconds. - Weight::from_parts(39_984_000, 0) - .saturating_add(Weight::from_parts(0, 11069)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/mod.rs deleted file mode 100644 index 8608d04af069..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/mod.rs +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod pallet_xcm_benchmarks_fungible; -mod pallet_xcm_benchmarks_generic; - -use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; -use frame_support::weights::Weight; -use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; -use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; -use xcm::{latest::prelude::*, DoubleEncoded}; - -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; -} - -const MAX_ASSETS: u64 = 100; - -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - match self { - Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), - Self::Wild(asset) => match asset { - All => weight.saturating_mul(MAX_ASSETS), - AllOf { fun, .. } => match fun { - WildFungibility::Fungible => weight, - // Magic number 2 has to do with the fact that we could have up to 2 times - // MaxAssetsIntoHolding in the worst-case scenario. - WildFungibility::NonFungible => - weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), - }, - AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - }, - } - } -} - -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().iter().count() as u64) - } -} - -pub struct AssetHubKusamaXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for AssetHubKusamaXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) - } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) - } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) - } - fn query_response( - _query_id: &u64, - _response: &Response, - _max_weight: &Weight, - _querier: &Option, - ) -> Weight { - XcmGeneric::::query_response() - } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) - } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) - } - fn transact( - _origin_type: &OriginKind, - _require_weight_at_most: &Weight, - _call: &DoubleEncoded, - ) -> Weight { - XcmGeneric::::transact() - } - fn hrmp_new_channel_open_request( - _sender: &u32, - _max_message_size: &u32, - _max_capacity: &u32, - ) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_accepted(_recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn clear_origin() -> Weight { - XcmGeneric::::clear_origin() - } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { - XcmGeneric::::descend_origin() - } - fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_error() - } - - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) - } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) - } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { - Weight::MAX - } - fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) - } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) - } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { - XcmGeneric::::report_holding() - } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { - XcmGeneric::::buy_execution() - } - fn refund_surplus() -> Weight { - XcmGeneric::::refund_surplus() - } - fn set_error_handler(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_error_handler() - } - fn set_appendix(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_appendix() - } - fn clear_error() -> Weight { - XcmGeneric::::clear_error() - } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { - XcmGeneric::::claim_asset() - } - fn trap(_code: &u64) -> Weight { - XcmGeneric::::trap() - } - fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { - XcmGeneric::::subscribe_version() - } - fn unsubscribe_version() -> Weight { - XcmGeneric::::unsubscribe_version() - } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) - } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) - } - fn expect_origin(_origin: &Option) -> Weight { - XcmGeneric::::expect_origin() - } - fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { - XcmGeneric::::expect_error() - } - fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { - XcmGeneric::::expect_transact_status() - } - fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::query_pallet() - } - fn expect_pallet( - _index: &u32, - _name: &Vec, - _module_name: &Vec, - _crate_major: &u32, - _min_crate_minor: &u32, - ) -> Weight { - XcmGeneric::::expect_pallet() - } - fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_transact_status() - } - fn clear_transact_status() -> Weight { - XcmGeneric::::clear_transact_status() - } - fn universal_origin(_: &Junction) -> Weight { - Weight::MAX - } - fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - Weight::MAX - } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn set_fees_mode(_: &bool) -> Weight { - XcmGeneric::::set_fees_mode() - } - fn set_topic(_topic: &[u8; 32]) -> Weight { - XcmGeneric::::set_topic() - } - fn clear_topic() -> Weight { - XcmGeneric::::clear_topic() - } - fn alias_origin(_: &MultiLocation) -> Weight { - // XCM Executor does not currently support alias origin operations - Weight::MAX - } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { - XcmGeneric::::unpaid_execution() - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs deleted file mode 100644 index 17e4ea7c8b69..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::fungible`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn withdraw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `3593` - // Minimum execution time: 26_104_000 picoseconds. - Weight::from_parts(26_722_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn transfer_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `6196` - // Minimum execution time: 52_259_000 picoseconds. - Weight::from_parts(53_854_000, 6196) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn transfer_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `210` - // Estimated: `6196` - // Minimum execution time: 77_248_000 picoseconds. - Weight::from_parts(80_354_000, 6196) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - // Storage: `Benchmark::Override` (r:0 w:0) - // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn reserve_asset_deposited() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 500_000_000_000 picoseconds. - Weight::from_parts(500_000_000_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_reserve_withdraw() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 482_070_000 picoseconds. - Weight::from_parts(490_269_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn receive_teleported_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_970_000 picoseconds. - Weight::from_parts(4_056_000, 0) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn deposit_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 26_324_000 picoseconds. - Weight::from_parts(26_985_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn deposit_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3593` - // Minimum execution time: 52_814_000 picoseconds. - Weight::from_parts(54_666_000, 3593) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_teleport() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 33_044_000 picoseconds. - Weight::from_parts(33_849_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs deleted file mode 100644 index 4988047014be..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::generic` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-kusama-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::generic`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_holding() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 432_196_000 picoseconds. - Weight::from_parts(438_017_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn buy_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_223_000 picoseconds. - Weight::from_parts(4_412_000, 0) - } - // Storage: `PolkadotXcm::Queries` (r:1 w:0) - // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn query_response() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3568` - // Minimum execution time: 11_582_000 picoseconds. - Weight::from_parts(11_830_000, 3568) - .saturating_add(T::DbWeight::get().reads(1)) - } - pub fn transact() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_955_000 picoseconds. - Weight::from_parts(14_320_000, 0) - } - pub fn refund_surplus() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_423_000 picoseconds. - Weight::from_parts(4_709_000, 0) - } - pub fn set_error_handler() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_028_000 picoseconds. - Weight::from_parts(3_151_000, 0) - } - pub fn set_appendix() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_966_000 picoseconds. - Weight::from_parts(3_076_000, 0) - } - pub fn clear_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_971_000 picoseconds. - Weight::from_parts(3_119_000, 0) - } - pub fn descend_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_772_000 picoseconds. - Weight::from_parts(3_853_000, 0) - } - pub fn clear_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_940_000 picoseconds. - Weight::from_parts(3_050_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 27_734_000 picoseconds. - Weight::from_parts(28_351_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) - // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn claim_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `160` - // Estimated: `3625` - // Minimum execution time: 16_456_000 picoseconds. - Weight::from_parts(16_846_000, 3625) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn trap() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_974_000 picoseconds. - Weight::from_parts(3_108_000, 0) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn subscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 29_823_000 picoseconds. - Weight::from_parts(30_776_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn unsubscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_966_000 picoseconds. - Weight::from_parts(5_157_000, 0) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn burn_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 141_875_000 picoseconds. - Weight::from_parts(144_925_000, 0) - } - pub fn expect_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_147_000 picoseconds. - Weight::from_parts(13_420_000, 0) - } - pub fn expect_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_050_000 picoseconds. - Weight::from_parts(3_161_000, 0) - } - pub fn expect_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_930_000 picoseconds. - Weight::from_parts(3_077_000, 0) - } - pub fn expect_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_188_000 picoseconds. - Weight::from_parts(3_299_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn query_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 31_678_000 picoseconds. - Weight::from_parts(32_462_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn expect_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_638_000 picoseconds. - Weight::from_parts(5_756_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 27_556_000 picoseconds. - Weight::from_parts(28_240_000, 3574) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn clear_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_932_000 picoseconds. - Weight::from_parts(3_097_000, 0) - } - pub fn set_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_860_000 picoseconds. - Weight::from_parts(2_957_000, 0) - } - pub fn clear_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_886_000 picoseconds. - Weight::from_parts(3_015_000, 0) - } - pub fn set_fees_mode() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_874_000 picoseconds. - Weight::from_parts(3_060_000, 0) - } - pub fn unpaid_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_029_000 picoseconds. - Weight::from_parts(3_158_000, 0) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs deleted file mode 100644 index 275a9391b8e7..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ /dev/null @@ -1,508 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, - ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssetsInstance, WeightToFee, XcmpQueue, -}; -use assets_common::matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; -use polkadot_parachain::primitives::Sibling; -use sp_runtime::traits::ConvertInto; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily, - EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset, - NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; - -parameter_types! { - pub const KsmLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Kusama); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); - pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, - // Foreign locations alias into accounts according to a hash of their standard description. - HashedDescription>, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// `AssetId/Balance` converter for `TrustBackedAssets` -pub type TrustBackedAssetsConvertedConcreteId = - assets_common::TrustBackedAssetsConvertedConcreteId; - -/// Means for transacting assets besides the native currency on this chain. -pub type FungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - Assets, - // Use this currency when it is a fungible asset matching the given location or name: - TrustBackedAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// `AssetId/Balance` converter for `TrustBackedAssets` -pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< - ( - // Ignore `TrustBackedAssets` explicitly - StartsWith, - // Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parents: 1, - // X*(Parachain(xyz), ..)}` - // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't - // be accepted here - StartsWithExplicitGlobalConsensus, - ), - Balance, ->; - -/// Means for transacting foreign assets from different global consensus. -pub type ForeignFungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - ForeignAssets, - // Use this currency when it is a fungible asset matching the given location or name: - ForeignAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We dont need to check teleports here. - NoChecking, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor); - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognised. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognised. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - pub XcmAssetFeesReceiver: Option = Authorship::author(); -} - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; -} - -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - matches!( - call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Assets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | RuntimeCall::ForeignAssets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | RuntimeCall::NftFractionalization( - pallet_nft_fractionalization::Call::fractionalize { .. } | - pallet_nft_fractionalization::Call::unify { .. }, - ) | RuntimeCall::Nfts( - pallet_nfts::Call::create { .. } | - pallet_nfts::Call::force_create { .. } | - pallet_nfts::Call::destroy { .. } | - pallet_nfts::Call::mint { .. } | - pallet_nfts::Call::force_mint { .. } | - pallet_nfts::Call::burn { .. } | - pallet_nfts::Call::transfer { .. } | - pallet_nfts::Call::lock_item_transfer { .. } | - pallet_nfts::Call::unlock_item_transfer { .. } | - pallet_nfts::Call::lock_collection { .. } | - pallet_nfts::Call::transfer_ownership { .. } | - pallet_nfts::Call::set_team { .. } | - pallet_nfts::Call::force_collection_owner { .. } | - pallet_nfts::Call::force_collection_config { .. } | - pallet_nfts::Call::approve_transfer { .. } | - pallet_nfts::Call::cancel_approval { .. } | - pallet_nfts::Call::clear_all_transfer_approvals { .. } | - pallet_nfts::Call::lock_item_properties { .. } | - pallet_nfts::Call::set_attribute { .. } | - pallet_nfts::Call::force_set_attribute { .. } | - pallet_nfts::Call::clear_attribute { .. } | - pallet_nfts::Call::approve_item_attributes { .. } | - pallet_nfts::Call::cancel_item_attributes_approval { .. } | - pallet_nfts::Call::set_metadata { .. } | - pallet_nfts::Call::clear_metadata { .. } | - pallet_nfts::Call::set_collection_metadata { .. } | - pallet_nfts::Call::clear_collection_metadata { .. } | - pallet_nfts::Call::set_accept_ownership { .. } | - pallet_nfts::Call::set_collection_max_supply { .. } | - pallet_nfts::Call::update_mint_settings { .. } | - pallet_nfts::Call::set_price { .. } | - pallet_nfts::Call::buy_item { .. } | - pallet_nfts::Call::pay_tips { .. } | - pallet_nfts::Call::create_swap { .. } | - pallet_nfts::Call::cancel_swap { .. } | - pallet_nfts::Call::claim_swap { .. }, - ) | RuntimeCall::Uniques( - pallet_uniques::Call::create { .. } | - pallet_uniques::Call::force_create { .. } | - pallet_uniques::Call::destroy { .. } | - pallet_uniques::Call::mint { .. } | - pallet_uniques::Call::burn { .. } | - pallet_uniques::Call::transfer { .. } | - pallet_uniques::Call::freeze { .. } | - pallet_uniques::Call::thaw { .. } | - pallet_uniques::Call::freeze_collection { .. } | - pallet_uniques::Call::thaw_collection { .. } | - pallet_uniques::Call::transfer_ownership { .. } | - pallet_uniques::Call::set_team { .. } | - pallet_uniques::Call::approve_transfer { .. } | - pallet_uniques::Call::cancel_approval { .. } | - pallet_uniques::Call::force_item_status { .. } | - pallet_uniques::Call::set_attribute { .. } | - pallet_uniques::Call::clear_attribute { .. } | - pallet_uniques::Call::set_metadata { .. } | - pallet_uniques::Call::clear_metadata { .. } | - pallet_uniques::Call::set_collection_metadata { .. } | - pallet_uniques::Call::clear_collection_metadata { .. } | - pallet_uniques::Call::set_accept_ownership { .. } | - pallet_uniques::Call::set_collection_max_supply { .. } | - pallet_uniques::Call::set_price { .. } | - pallet_uniques::Call::buy_item { .. } - ) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< - Runtime, - WeightToFee, - pallet_assets::BalanceToAssetBalance, - TrustBackedAssetsInstance, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = AssetTransactors; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Asset Hub Kusama does not recognize a reserve location for any asset. This does not prevent - // Asset Hub acting _as_ a reserve location for KSM and assets created under `pallet-assets`. - // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = (); - // We allow: - // - teleportation of KSM - // - teleportation of sibling parachain's assets (as ForeignCreators) - type IsTeleporter = ( - NativeAsset, - IsForeignConcreteAsset>>, - ); - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubKusamaXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type Trader = ( - UsingComponents>, - cumulus_primitives_utility::TakeFirstAssetTrader< - AccountId, - AssetFeeAsExistentialDepositMultiplierFeeCharger, - TrustBackedAssetsConvertedConcreteId, - Assets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - FungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, - >, - ); - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports and reserve transfers are - // allowed. - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Everything; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubKusamaXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -pub type ForeignCreatorsSovereignAccountOf = ( - SiblingParachainConvertsVia, - AccountId32Aliases, - ParentIsPreset, -); - -/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. -pub struct XcmBenchmarkHelper; -#[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs deleted file mode 100644 index bcf20cb58102..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/tests/tests.rs +++ /dev/null @@ -1,629 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Tests for the Statemine (Kusama Assets Hub) chain. - -use asset_hub_kusama_runtime::xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, KsmLocation, TrustBackedAssetsPalletLocation, -}; -pub use asset_hub_kusama_runtime::{ - constants::fee::WeightToFee, - xcm_config::{CheckingAccount, ForeignCreatorsSovereignAccountOf, XcmConfig}, - AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, - MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, RuntimeCall, - RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, -}; -use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; -use codec::{Decode, Encode}; -use cumulus_primitives_utility::ChargeWeightInFungibles; -use frame_support::{ - assert_noop, assert_ok, - traits::fungibles::InspectEnumerable, - weights::{Weight, WeightToFee as WeightToFeeT}, -}; -use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; -use sp_runtime::traits::MaybeEquivalence; -use xcm::latest::prelude::*; -use xcm_executor::traits::{Identity, JustTry, WeightTrader}; - -const ALICE: [u8; 32] = [1u8; 32]; -const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; - -type AssetIdForTrustBackedAssetsConvert = - assets_common::AssetIdForTrustBackedAssetsConvert; - -fn collator_session_keys() -> CollatorSessionKeys { - CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - ) -} - -#[test] -fn test_asset_xcm_trader() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - let minimum_asset_balance = 3333333_u128; - let local_asset_id = 1; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // get asset id as multilocation - let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - // Lets calculate amount needed - let asset_amount_needed = - AssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( - local_asset_id, - bought, - ) - .expect("failed to compute"); - - // Lets pay with: asset_amount_needed + asset_amount_extra - let asset_amount_extra = 100_u128; - let asset: MultiAsset = - (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Lets buy_weight and make sure buy_weight does not return an error - let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); - // Check whether a correct amount of unused assets is returned - assert_ok!( - unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) - ); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance + asset_amount_needed - ); - - // We also need to ensure the total supply increased - assert_eq!( - Assets::total_supply(local_asset_id), - minimum_asset_balance + asset_amount_needed - ); - }); -} - -#[test] -fn test_asset_xcm_trader_with_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - // lets calculate amount needed - let amount_bought = WeightToFee::weight_to_fee(&bought); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Make sure buy_weight does not return an error - assert_ok!(trader.buy_weight(bought, asset.clone().into(), &ctx)); - - // Make sure again buy_weight does return an error - // This assert relies on the fact, that we use `TakeFirstAssetTrader` in `WeightTrader` - // tuple chain, which cannot be called twice - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // We actually use half of the weight - let weight_used = bought / 2; - - // Make sure refurnd works. - let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); - - assert_eq!( - trader.refund_weight(bought - weight_used, &ctx), - Some((asset_multilocation, amount_refunded).into()) - ); - - // Drop trader - drop(trader); - - // We only should have paid for half of the bought weight - let fees_paid = WeightToFee::weight_to_fee(&weight_used); - - assert_eq!( - Assets::balance(1, AccountId::from(ALICE)), - ExistentialDeposit::get() + fees_paid - ); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get() + fees_paid); - }); -} - -#[test] -fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy small amount - let bought = Weight::from_parts(500_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Buy weight should return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // not credited since the ED is higher than this value - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), 0); - - // We also need to ensure the total supply did not increase - assert_eq!(Assets::total_supply(1), 0); - }); -} - -#[test] -fn test_that_buying_ed_refund_does_not_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are gonna buy ED - let bought = Weight::from_parts(ExistentialDeposit::get().try_into().unwrap(), 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - // We know we will have to buy at least ED, so lets make sure first it will - // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); - - // Buy weight should work - assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); - - // Should return None. We have a specific check making sure we dont go below ED for - // drop payment - assert_eq!(trader.refund_weight(bought, &ctx), None); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), ExistentialDeposit::get()); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); - }); -} - -#[test] -fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // Create a non-sufficient asset with specific existential deposit - let minimum_asset_balance = 1_000_000_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - false, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - // lets calculate amount needed - let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); - - // Make sure again buy_weight does return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has NOT received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), minimum_asset_balance); - - // We also need to ensure the total supply NOT increased - assert_eq!(Assets::total_supply(1), minimum_asset_balance); - }); -} - -#[test] -fn test_assets_balances_api_works() { - use assets_common::runtime_api::runtime_decl_for_fungibles_api::FungiblesApi; - - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - let local_asset_id = 1; - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; - - // check before - assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); - assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), - 0 - ); - assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); - assert!(Runtime::query_account_balances(AccountId::from(ALICE)) - .unwrap() - .try_as::() - .unwrap() - .is_none()); - - // Drip some balance - use frame_support::traits::fungible::Mutate; - let some_currency = ExistentialDeposit::get(); - Balances::mint_into(&AccountId::from(ALICE), some_currency).unwrap(); - - // We need root origin to create a sufficient asset - let minimum_asset_balance = 3333333_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // create foreign asset - let foreign_asset_minimum_asset_balance = 3333333_u128; - assert_ok!(ForeignAssets::force_create( - RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation, - AccountId::from(SOME_ASSET_ADMIN).into(), - false, - foreign_asset_minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(ForeignAssets::mint( - RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), - foreign_asset_id_multilocation, - AccountId::from(ALICE).into(), - 6 * foreign_asset_minimum_asset_balance - )); - - // check after - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance - ); - assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), - 6 * minimum_asset_balance - ); - assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - - let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) - .unwrap() - .try_into() - .unwrap(); - assert_eq!(result.len(), 3); - - // check currency - assert!(result.inner().iter().any(|asset| asset.eq( - &assets_common::fungible_conversion::convert_balance::( - some_currency - ) - .unwrap() - ))); - // check trusted asset - assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), - minimum_asset_balance - ) - .into()))); - // check foreign asset - assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), - 6 * foreign_asset_minimum_asset_balance - ) - .into()))); - }); -} - -asset_test_utils::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - 1000 -); - -asset_test_utils::include_teleports_for_foreign_assets_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - ForeignCreatorsSovereignAccountOf, - ForeignAssetsInstance, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( - Runtime, - XcmConfig, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( - asset_transactor_transfer_with_trust_backed_assets_works, - Runtime, - XcmConfig, - TrustBackedAssetsInstance, - AssetIdForTrustBackedAssets, - AssetIdForTrustBackedAssetsConvert, - collator_session_keys(), - ExistentialDeposit::get(), - 12345, - Box::new(|| { - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( - asset_transactor_transfer_with_foreign_assets_works, - Runtime, - XcmConfig, - ForeignAssetsInstance, - MultiLocation, - JustTry, - collator_session_keys(), - ExistentialDeposit::get(), - MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works!( - Runtime, - XcmConfig, - WeightToFee, - ForeignCreatorsSovereignAccountOf, - ForeignAssetsInstance, - MultiLocation, - JustTry, - collator_session_keys(), - ExistentialDeposit::get(), - AssetDeposit::get(), - MetadataDepositBase::get(), - MetadataDepositPerByte::get(), - Box::new(|pallet_asset_call| RuntimeCall::ForeignAssets(pallet_asset_call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::ForeignAssets(pallet_asset_event)) => Some(pallet_asset_event), - _ => None, - } - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); - }) -); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml deleted file mode 100644 index d84d33f962b8..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/Cargo.toml +++ /dev/null @@ -1,191 +0,0 @@ -[package] -name = "asset-hub-polkadot-runtime" -version = "0.9.420" -authors = ["Parity Technologies "] -edition = "2021" -description = "Asset Hub Polkadot parachain runtime" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-asset-tx-payment = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nfts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nfts-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-uniques = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-weights = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0" } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -assets-common = { path = "../common", default-features = false } - -[dev-dependencies] -hex-literal = "0.4.1" -asset-test-utils = { path = "../test-utils"} - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[features] -default = [ "std" ] -runtime-benchmarks = [ - "hex-literal", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-assets/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-nfts/runtime-benchmarks", - "pallet-proxy/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-uniques/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", - "assets-common/runtime-benchmarks", -] -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-asset-tx-payment/try-runtime", - "pallet-assets/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-multisig/try-runtime", - "pallet-nfts/try-runtime", - "pallet-proxy/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-uniques/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-asset-tx-payment/std", - "pallet-assets/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-multisig/std", - "pallet-nfts/std", - "pallet-nfts-runtime-api/std", - "pallet-proxy/std", - "pallet-session/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-uniques/std", - "pallet-utility/std", - "pallet-xcm/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "polkadot-runtime-constants/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "pallet-collator-selection/std", - "parachain-info/std", - "parachains-common/std", - "assets-common/std", - "substrate-wasm-builder", -] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/build.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/constants.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/constants.rs deleted file mode 100644 index dea920979f6a..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/constants.rs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod currency { - use polkadot_core_primitives::Balance; - use polkadot_runtime_constants as constants; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const DOLLARS: Balance = constants::currency::DOLLARS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // 1/100 of Polkadot - constants::currency::deposit(items, bytes) / 100 - } -} - -/// Fee-related. -pub mod fee { - use frame_support::weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - use sp_weights::Weight; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Asset Hub, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs deleted file mode 100644 index b1277f03fde4..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs +++ /dev/null @@ -1,1301 +0,0 @@ -// Copyright (C) 2021-2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Asset Hub Polkadot Runtime -//! -//! Asset Hub Polkadot is a parachain that provides an interface to create, manage, and use assets. -//! Assets may be fungible or non-fungible. -//! -//! ## Renaming -//! -//! This chain was originally known as "Statemint". You may see references to Statemint, Statemine, -//! and Westmint throughout the codebase. These are synonymous with "Asset Hub Polkadot, Kusama, and -//! Westend", respectively. -//! -//! ## Assets -//! -//! - Fungibles: Configuration of `pallet-assets`. -//! - Non-Fungibles (NFTs): Configuration of `pallet-uniques`. -//! -//! ## Other Functionality -//! -//! ### Native Balances -//! -//! Asset Hub Polkadot uses its parent DOT token as its native asset. -//! -//! ### Governance -//! -//! As a system parachain, Asset Hub defers its governance (namely, its `Root` origin), to its -//! Relay Chain parent, Polkadot. -//! -//! ### Collator Selection -//! -//! Asset Hub uses `pallet-collator-selection`, a simple first-come-first-served registration -//! system where collators can reserve a small bond to join the block producer set. There is no -//! slashing. -//! -//! ### XCM -//! -//! Because Asset Hub is fully under the control of the Relay Chain, it is meant to be a -//! `TrustedTeleporter`. It can also serve as a reserve location to other parachains for DOT as well -//! as other local assets. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod constants; -mod weights; -pub mod xcm_config; - -use assets_common::{ - foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, -}; -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, ConvertInto, Verify}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use codec::{Decode, Encode, MaxEncodedLen}; -use constants::{currency::*, fee::WeightToFee}; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ - AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, - InstanceFilter, - }, - weights::{ConstantMultiplier, Weight}, - PalletId, RuntimeDebug, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, EnsureSigned, -}; -use pallet_nfts::PalletFeatures; -pub use parachains_common as common; -use parachains_common::{ - impls::{AssetsToBlockAuthor, DealWithFees}, - AccountId, AssetHubPolkadotAuraId as AuraId, AssetIdForTrustBackedAssets, Balance, BlockNumber, - Hash, Header, Nonce, Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, - NORMAL_DISPATCH_RATIO, SLOT_DURATION, -}; -use xcm_config::{ - DotLocation, FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation, - TrustBackedAssetsConvertedConcreteId, XcmConfig, XcmOriginToTransactDispatchOrigin, -}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::BodyId; -use xcm_executor::XcmExecutor; - -use crate::xcm_config::ForeignCreatorsSovereignAccountOf; -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - // Note: "statemint" is the legacy name for this chain. It has been renamed to - // "asset-hub-polkadot". Many wallets/tools depend on the `spec_name`, so it remains "statemint" - // for the time being. Wallets/tools should update to treat "asset-hub-polkadot" equally. - spec_name: create_runtime_str!("statemint"), - impl_name: create_runtime_str!("statemint"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 13, - state_version: 0, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 0; -} - -// Configure FRAME pallets to include in runtime. -impl frame_system::Config for Runtime { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type AccountId = AccountId; - type RuntimeCall = RuntimeCall; - type Lookup = AccountIdLookup; - type Nonce = Nonce; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type BlockHashCount = BlockHashCount; - type DbWeight = RocksDbWeight; - type Version = Version; - type PalletInfo = PalletInfo; - type OnNewAccount = (); - type OnKilledAccount = (); - type AccountData = pallet_balances::AccountData; - type SystemWeightInfo = weights::frame_system::WeightInfo; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -parameter_types! { - pub const AssetDeposit: Balance = 10 * UNITS; // 10 UNITS deposit to create fungible asset class - pub const AssetAccountDeposit: Balance = deposit(1, 16); - pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; - pub const AssetsStringLimit: u32 = 50; - /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) - // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 - pub const MetadataDepositBase: Balance = deposit(1, 68); - pub const MetadataDepositPerByte: Balance = deposit(0, 1); -} - -/// We allow root to execute privileged asset operations. -pub type AssetsForceOrigin = EnsureRoot; - -// Called "Trust Backed" assets because these are generally registered by some account, and users of -// the asset assume it has some claimed backing. The pallet is called `Assets` in -// `construct_runtime` to avoid breaking changes on storage reads. -pub type TrustBackedAssetsInstance = pallet_assets::Instance1; -type TrustBackedAssetsCall = pallet_assets::Call; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = AssetIdForTrustBackedAssets; - type AssetIdParameter = codec::Compact; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_local::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - // we just reuse the same deposits - pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); - pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); - pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); - pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); - pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); - pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); -} - -/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as -/// this type is used in proxy definitions. We assume that a foreign location would not want to set -/// an individual, local account as a proxy for the issuance of their assets. This issuance should -/// be managed by the foreign location's governance. -pub type ForeignAssetsInstance = pallet_assets::Instance2; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = MultiLocationForAssetId; - type AssetIdParameter = MultiLocationForAssetId; - type Currency = Balances; - type CreateOrigin = ForeignCreators< - (FromSiblingParachain>,), - ForeignCreatorsSovereignAccountOf, - AccountId, - >; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = ForeignAssetsAssetDeposit; - type MetadataDepositBase = ForeignAssetsMetadataDepositBase; - type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; - type ApprovalDeposit = ForeignAssetsApprovalDeposit; - type StringLimit = ForeignAssetsAssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_foreign::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); - pub const MaxSignatories: u32 = 100; -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = MaxSignatories; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -parameter_types! { - // One storage item; key size 32, value size 8; . - pub const ProxyDepositBase: Balance = deposit(1, 40); - // Additional storage item size of 33 bytes. - pub const ProxyDepositFactor: Balance = deposit(0, 33); - pub const MaxProxies: u16 = 32; - // One storage item; key size 32, value size 16 - pub const AnnouncementDepositBase: Balance = deposit(1, 48); - pub const AnnouncementDepositFactor: Balance = deposit(0, 66); - pub const MaxPending: u16 = 32; -} - -/// The type used to represent the kinds of proxying allowed. -#[derive( - Copy, - Clone, - Eq, - PartialEq, - Ord, - PartialOrd, - Encode, - Decode, - RuntimeDebug, - MaxEncodedLen, - scale_info::TypeInfo, -)] -pub enum ProxyType { - /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. - Any, - /// Can execute any call that does not transfer funds or assets. - NonTransfer, - /// Proxy with the ability to reject time-delay proxy announcements. - CancelProxy, - /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. - Assets, - /// Owner proxy. Can execute calls related to asset ownership. - AssetOwner, - /// Asset manager. Can execute calls related to asset management. - AssetManager, - /// Collator selection proxy. Can execute calls related to collator selection mechanism. - Collator, -} -impl Default for ProxyType { - fn default() -> Self { - Self::Any - } -} - -impl InstanceFilter for ProxyType { - fn filter(&self, c: &RuntimeCall) -> bool { - match self { - ProxyType::Any => true, - ProxyType::NonTransfer => !matches!( - c, - RuntimeCall::Balances { .. } | - RuntimeCall::Assets { .. } | - RuntimeCall::Nfts { .. } | - RuntimeCall::Uniques { .. } - ), - ProxyType::CancelProxy => matches!( - c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Assets => { - matches!( - c, - RuntimeCall::Assets { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } | - RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } - ) - }, - ProxyType::AssetOwner => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::start_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_accounts { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_approvals { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::finish_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_min_balance { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::create { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::destroy { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::redeposit { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::transfer_ownership { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_team { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_max_supply { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_team { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_max_supply { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::AssetManager => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::block { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::touch_other { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::refund_other { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::force_mint { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::update_mint_settings { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::mint_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_attributes_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::unlock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_properties { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw_collection { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Collator => matches!( - c, - RuntimeCall::CollatorSelection { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - } - } - - fn is_superset(&self, o: &Self) -> bool { - match (self, o) { - (x, y) if x == y => true, - (ProxyType::Any, _) => true, - (_, ProxyType::Any) => false, - (ProxyType::Assets, ProxyType::AssetOwner) => true, - (ProxyType::Assets, ProxyType::AssetManager) => true, - (ProxyType::NonTransfer, ProxyType::Collator) => true, - _ => false, - } - } -} - -impl pallet_proxy::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type ProxyType = ProxyType; - type ProxyDepositBase = ProxyDepositBase; - type ProxyDepositFactor = ProxyDepositFactor; - type MaxProxies = MaxProxies; - type WeightInfo = weights::pallet_proxy::WeightInfo; - type MaxPending = MaxPending; - type CallHasher = BlakeTwo256; - type AnnouncementDepositBase = AnnouncementDepositBase; - type AnnouncementDepositFactor = AnnouncementDepositFactor; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type OutboundXcmpMessageSource = XcmpQueue; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -parameter_types! { - // Fellows pluralistic body. - pub const FellowsBodyId: BodyId = BodyId::Technical; -} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, - >; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // `StakingAdmin` pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow root and the `StakingAdmin` to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -impl pallet_asset_tx_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Fungibles = Assets; - type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< - pallet_assets::BalanceToAssetBalance< - Balances, - Runtime, - ConvertInto, - TrustBackedAssetsInstance, - >, - AssetsToBlockAuthor, - >; -} - -parameter_types! { - pub const UniquesCollectionDeposit: Balance = 10 * UNITS; // 10 UNIT deposit to create uniques class - pub const UniquesItemDeposit: Balance = UNITS / 100; // 1 / 100 UNIT deposit to create uniques instance - pub const UniquesMetadataDepositBase: Balance = deposit(1, 129); - pub const UniquesAttributeDepositBase: Balance = deposit(1, 0); - pub const UniquesDepositPerByte: Balance = deposit(0, 1); -} - -impl pallet_uniques::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type ForceOrigin = AssetsForceOrigin; - type CollectionDeposit = UniquesCollectionDeposit; - type ItemDeposit = UniquesItemDeposit; - type MetadataDepositBase = UniquesMetadataDepositBase; - type AttributeDepositBase = UniquesAttributeDepositBase; - type DepositPerByte = UniquesDepositPerByte; - type StringLimit = ConstU32<128>; - type KeyLimit = ConstU32<32>; // Max 32 bytes per key - type ValueLimit = ConstU32<64>; // Max 64 bytes per value - type WeightInfo = weights::pallet_uniques::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); - type CreateOrigin = AsEnsureOriginWithArg>; - type Locker = (); -} - -parameter_types! { - pub NftsPalletFeatures: PalletFeatures = PalletFeatures::all_enabled(); - pub const NftsMaxDeadlineDuration: BlockNumber = 12 * 30 * DAYS; - // re-use the Uniques deposits - pub const NftsCollectionDeposit: Balance = UniquesCollectionDeposit::get(); - pub const NftsItemDeposit: Balance = UniquesItemDeposit::get(); - pub const NftsMetadataDepositBase: Balance = UniquesMetadataDepositBase::get(); - pub const NftsAttributeDepositBase: Balance = UniquesAttributeDepositBase::get(); - pub const NftsDepositPerByte: Balance = UniquesDepositPerByte::get(); -} - -impl pallet_nfts::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type Locker = (); - type CollectionDeposit = NftsCollectionDeposit; - type ItemDeposit = NftsItemDeposit; - type MetadataDepositBase = NftsMetadataDepositBase; - type AttributeDepositBase = NftsAttributeDepositBase; - type DepositPerByte = NftsDepositPerByte; - type StringLimit = ConstU32<256>; - type KeyLimit = ConstU32<64>; - type ValueLimit = ConstU32<256>; - type ApprovalsLimit = ConstU32<20>; - type ItemAttributesApprovalsLimit = ConstU32<30>; - type MaxTips = ConstU32<10>; - type MaxDeadlineDuration = NftsMaxDeadlineDuration; - type MaxAttributesPerCall = ConstU32<10>; - type Features = NftsPalletFeatures; - type OffchainSignature = Signature; - type OffchainPublic = ::Signer; - type WeightInfo = weights::pallet_nfts::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - // RandomnessCollectiveFlip = 2 removed - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - AssetTxPayment: pallet_asset_tx_payment::{Pallet, Event} = 12, - - // Collator support. the order of these 5 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, - Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, - - // The main stage. - Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, - Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, - Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, - ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, - } -); - -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_asset_tx_payment::ChargeAssetTxPayment, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// Migrations to apply on runtime upgrade. -pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_assets, Local] - [pallet_assets, Foreign] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_nfts, Nfts] - [pallet_proxy, Proxy] - [pallet_session, SessionBench::] - [pallet_uniques, Uniques] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - // XCM - [pallet_xcm, PolkadotXcm] - // NOTE: Make sure you point to the individual modules below. - [pallet_xcm_benchmarks::fungible, XcmBalances] - [pallet_xcm_benchmarks::generic, XcmGeneric] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl assets_common::runtime_api::FungiblesApi< - Block, - AccountId, - > for Runtime - { - fn query_account_balances(account: AccountId) -> Result { - use assets_common::fungible_conversion::{convert, convert_balance}; - Ok([ - // collect pallet_balance - { - let balance = Balances::free_balance(account.clone()); - if balance > 0 { - vec![convert_balance::(balance)?] - } else { - vec![] - } - }, - // collect pallet_assets (TrustBackedAssets) - convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( - Assets::account_balances(account.clone()) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect pallet_assets (ForeignAssets) - convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( - ForeignAssets::account_balances(account) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect ... e.g. other tokens - ].concat().into()) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - // This is defined once again in dispatch_benchmark, because list_benchmarks! - // and add_benchmarks! are macros exported by define_benchmarks! macros and those types - // are referenced in that call. - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - // Benchmark files generated for `Assets/ForeignAssets` instances are by default - // `pallet_assets_assets.rs / pallet_assets_foreign_assets`, which is not really nice, - // so with this redefinition we can change names to nicer: - // `pallet_assets_local.rs / pallet_assets_foreign.rs`. - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, TrackedStorageKey, BenchmarkError}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use xcm::latest::prelude::*; - use xcm_config::{DotLocation, MaxAssetsIntoHolding}; - use pallet_xcm_benchmarks::asset_instance_from; - - impl pallet_xcm_benchmarks::Config for Runtime { - type XcmConfig = xcm_config::XcmConfig; - type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { - Ok(DotLocation::get()) - } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { - // A mix of fungible, non-fungible, and concrete assets. - let holding_non_fungibles = MaxAssetsIntoHolding::get() / 2 - depositable_count; - let holding_fungibles = holding_non_fungibles - 1; - let fungibles_amount: u128 = 100; - let mut assets = (0..holding_fungibles) - .map(|i| { - MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: Fungible(fungibles_amount * i as u128), - } - }) - .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) - .chain((0..holding_non_fungibles).map(|i| MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: NonFungible(asset_instance_from(i)), - })) - .collect::>(); - - assets.push(MultiAsset { - id: Concrete(DotLocation::get()), - fun: Fungible(1_000_000 * UNITS), - }); - assets.into() - } - } - - parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - DotLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(DotLocation::get()) }, - )); - pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; - } - - impl pallet_xcm_benchmarks::fungible::Config for Runtime { - type TransactAsset = Balances; - - type CheckedAccount = CheckedAccount; - type TrustedTeleporter = TrustedTeleporter; - type TrustedReserve = TrustedReserve; - - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(DotLocation::get()), - fun: Fungible(UNITS), - } - } - } - - impl pallet_xcm_benchmarks::generic::Config for Runtime { - type RuntimeCall = RuntimeCall; - - fn worst_case_response() -> (u64, Response) { - (0u64, Response::Version(Default::default())) - } - - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((DotLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) - } - - fn subscribe_origin() -> Result { - Ok(DotLocation::get()) - } - - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = DotLocation::get(); - let assets: MultiAssets = (Concrete(DotLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; - Ok((origin, ticket, assets)) - } - - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - } - - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - //TODO: use from relay_well_known_keys::ACTIVE_CONFIG - hex_literal::hex!("06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} - -#[cfg(test)] -mod tests { - use super::{constants::fee, *}; - use crate::{CENTS, MILLICENTS}; - use sp_runtime::traits::Zero; - use sp_weights::WeightToFee; - - /// We can fit at least 1000 transfers in a block. - #[test] - fn sane_block_weight() { - use pallet_balances::WeightInfo; - let block = RuntimeBlockWeights::get().max_block; - let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; - let transfer = - base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); - - let fit = block.checked_div_per_component(&transfer).unwrap_or_default(); - assert!(fit >= 1000, "{} should be at least 1000", fit); - } - - /// The fee for one transfer is at most 1 CENT. - #[test] - fn sane_transfer_fee() { - use pallet_balances::WeightInfo; - let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; - let transfer = - base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); - - let fee: Balance = fee::WeightToFee::weight_to_fee(&transfer); - assert!(fee <= CENTS, "{} MILLICENTS should be at most 1000", fee / MILLICENTS); - } - - /// Weight is being charged for both dimensions. - #[test] - fn weight_charged_for_both_components() { - let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(10_000, 0)); - assert!(!fee.is_zero(), "Charges for ref time"); - - let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, 10_000)); - assert_eq!(fee, CENTS, "10kb maps to CENT"); - } - - /// Filling up a block by proof size is at most 30 times more expensive than ref time. - /// - /// This is just a sanity check. - #[test] - fn full_block_fee_ratio() { - let block = RuntimeBlockWeights::get().max_block; - let time_fee: Balance = - fee::WeightToFee::weight_to_fee(&Weight::from_parts(block.ref_time(), 0)); - let proof_fee: Balance = - fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, block.proof_size())); - - let proof_o_time = proof_fee.checked_div(time_fee).unwrap_or_default(); - assert!(proof_o_time <= 30, "{} should be at most 30", proof_o_time); - let time_o_proof = time_fee.checked_div(proof_fee).unwrap_or_default(); - assert!(time_o_proof <= 30, "{} should be at most 30", time_o_proof); - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/block_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs deleted file mode 100644 index e3c64776ae1c..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `cumulus_pallet_xcmp_queue` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=cumulus_pallet_xcmp_queue -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `cumulus_pallet_xcmp_queue`. -pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_240_000 picoseconds. - Weight::from_parts(5_487_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_243_000 picoseconds. - Weight::from_parts(5_549_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/frame_system.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/frame_system.rs deleted file mode 100644 index a2007347211d..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 1_956_000 picoseconds. - Weight::from_parts(3_441_280, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(388, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_267_000 picoseconds. - Weight::from_parts(7_462_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_816, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_757_000 picoseconds. - Weight::from_parts(4_021_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `119` - // Estimated: `1604` - // Minimum execution time: 97_958_650_000 picoseconds. - Weight::from_parts(102_129_539_000, 0) - .saturating_add(Weight::from_parts(0, 1604)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_327_000 picoseconds. - Weight::from_parts(2_511_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_186 - .saturating_add(Weight::from_parts(755_085, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_114_000 picoseconds. - Weight::from_parts(2_177_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_174 - .saturating_add(Weight::from_parts(584_644, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `84 + p * (69 ±0)` - // Estimated: `77 + p * (70 ±0)` - // Minimum execution time: 3_799_000 picoseconds. - Weight::from_parts(3_910_000, 0) - .saturating_add(Weight::from_parts(0, 77)) - // Standard Error: 1_968 - .saturating_add(Weight::from_parts(1_220_745, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs deleted file mode 100644 index 2cf514a55981..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -pub mod block_weights; -pub mod cumulus_pallet_xcmp_queue; -pub mod extrinsic_weights; -pub mod frame_system; -pub mod pallet_assets_foreign; -pub mod pallet_assets_local; -pub mod pallet_balances; -pub mod pallet_collator_selection; -pub mod pallet_multisig; -pub mod pallet_nfts; -pub mod pallet_proxy; -pub mod pallet_session; -pub mod pallet_timestamp; -pub mod pallet_uniques; -pub mod pallet_utility; -pub mod pallet_xcm; -pub mod paritydb_weights; -pub mod rocksdb_weights; -pub mod xcm; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets_foreign.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets_foreign.rs deleted file mode 100644 index 817d567c8637..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets_foreign.rs +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_assets` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_assets -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_assets`. -pub struct WeightInfo(PhantomData); -impl pallet_assets::WeightInfo for WeightInfo { - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `4273` - // Minimum execution time: 29_979_000 picoseconds. - Weight::from_parts(30_763_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `4` - // Estimated: `4273` - // Minimum execution time: 12_255_000 picoseconds. - Weight::from_parts(12_614_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn start_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 15_240_000 picoseconds. - Weight::from_parts(15_627_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1001 w:1000) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1000 w:1000) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - fn destroy_accounts(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + c * (208 ±0)` - // Estimated: `4273 + c * (3207 ±0)` - // Minimum execution time: 17_814_000 picoseconds. - Weight::from_parts(18_006_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 10_358 - .saturating_add(Weight::from_parts(15_409_972, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 3207).saturating_mul(c.into())) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1001 w:1000) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy_approvals(a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `413 + a * (86 ±0)` - // Estimated: `4273 + a * (3221 ±0)` - // Minimum execution time: 18_957_000 picoseconds. - Weight::from_parts(19_347_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 5_051 - .saturating_add(Weight::from_parts(15_416_931, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 3221).saturating_mul(a.into())) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:0) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn finish_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 15_409_000 picoseconds. - Weight::from_parts(15_835_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 26_753_000 picoseconds. - Weight::from_parts(27_349_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 33_918_000 picoseconds. - Weight::from_parts(34_624_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 45_863_000 picoseconds. - Weight::from_parts(46_674_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 40_592_000 picoseconds. - Weight::from_parts(41_582_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 46_170_000 picoseconds. - Weight::from_parts(46_880_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 18_421_000 picoseconds. - Weight::from_parts(19_003_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 18_009_000 picoseconds. - Weight::from_parts(18_683_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn freeze_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 14_702_000 picoseconds. - Weight::from_parts(15_118_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn thaw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 14_329_000 picoseconds. - Weight::from_parts(14_857_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:0) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 15_776_000 picoseconds. - Weight::from_parts(16_337_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 14_290_000 picoseconds. - Weight::from_parts(14_655_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn set_metadata(_n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 29_296_000 picoseconds. - Weight::from_parts(30_512_261, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 474 - .saturating_add(Weight::from_parts(530, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `406` - // Estimated: `4273` - // Minimum execution time: 30_342_000 picoseconds. - Weight::from_parts(31_030_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `81` - // Estimated: `4273` - // Minimum execution time: 13_574_000 picoseconds. - Weight::from_parts(14_181_016, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 262 - .saturating_add(Weight::from_parts(420, 0).saturating_mul(n.into())) - // Standard Error: 262 - .saturating_add(Weight::from_parts(1_118, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn force_clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `406` - // Estimated: `4273` - // Minimum execution time: 29_679_000 picoseconds. - Weight::from_parts(30_346_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn force_asset_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 13_334_000 picoseconds. - Weight::from_parts(13_827_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 32_648_000 picoseconds. - Weight::from_parts(33_555_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `520` - // Estimated: `7404` - // Minimum execution time: 65_431_000 picoseconds. - Weight::from_parts(66_502_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `446` - // Estimated: `4273` - // Minimum execution time: 35_207_000 picoseconds. - Weight::from_parts(35_915_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn force_cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `446` - // Estimated: `4273` - // Minimum execution time: 35_768_000 picoseconds. - Weight::from_parts(36_553_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn set_min_balance() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 15_108_000 picoseconds. - Weight::from_parts(15_556_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn touch() -> Weight { - // Proof Size summary in bytes: - // Measured: `345` - // Estimated: `4273` - // Minimum execution time: 34_373_000 picoseconds. - Weight::from_parts(35_200_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn touch_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 32_201_000 picoseconds. - Weight::from_parts(33_591_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn refund() -> Weight { - // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `4273` - // Minimum execution time: 31_148_000 picoseconds. - Weight::from_parts(31_751_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn refund_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `401` - // Estimated: `4273` - // Minimum execution time: 29_127_000 picoseconds. - Weight::from_parts(29_922_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn block() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 18_386_000 picoseconds. - Weight::from_parts(18_762_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets_local.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets_local.rs deleted file mode 100644 index 829b3543ee31..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_assets_local.rs +++ /dev/null @@ -1,529 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_assets` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_assets -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_assets`. -pub struct WeightInfo(PhantomData); -impl pallet_assets::WeightInfo for WeightInfo { - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3675` - // Minimum execution time: 26_698_000 picoseconds. - Weight::from_parts(27_507_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3675` - // Minimum execution time: 10_833_000 picoseconds. - Weight::from_parts(11_314_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn start_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 13_389_000 picoseconds. - Weight::from_parts(14_231_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1001 w:1000) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1000 w:1000) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - fn destroy_accounts(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + c * (208 ±0)` - // Estimated: `3675 + c * (2609 ±0)` - // Minimum execution time: 16_027_000 picoseconds. - Weight::from_parts(16_455_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 10_266 - .saturating_add(Weight::from_parts(15_263_742, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2609).saturating_mul(c.into())) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1001 w:1000) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy_approvals(a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `414 + a * (86 ±0)` - // Estimated: `3675 + a * (2623 ±0)` - // Minimum execution time: 17_167_000 picoseconds. - Weight::from_parts(17_397_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 5_072 - .saturating_add(Weight::from_parts(15_429_203, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2623).saturating_mul(a.into())) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:0) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn finish_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 13_694_000 picoseconds. - Weight::from_parts(14_239_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 24_406_000 picoseconds. - Weight::from_parts(24_981_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 31_372_000 picoseconds. - Weight::from_parts(32_021_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 42_982_000 picoseconds. - Weight::from_parts(43_918_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 37_161_000 picoseconds. - Weight::from_parts(38_756_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 43_141_000 picoseconds. - Weight::from_parts(44_187_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_721_000 picoseconds. - Weight::from_parts(17_433_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_623_000 picoseconds. - Weight::from_parts(17_110_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn freeze_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 13_079_000 picoseconds. - Weight::from_parts(13_700_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn thaw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 13_026_000 picoseconds. - Weight::from_parts(13_444_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:0) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 13_945_000 picoseconds. - Weight::from_parts(14_792_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 12_800_000 picoseconds. - Weight::from_parts(13_183_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn set_metadata(_n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 27_637_000 picoseconds. - Weight::from_parts(28_967_060, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 464 - .saturating_add(Weight::from_parts(572, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `407` - // Estimated: `3675` - // Minimum execution time: 28_427_000 picoseconds. - Weight::from_parts(28_961_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(_n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `82` - // Estimated: `3675` - // Minimum execution time: 12_251_000 picoseconds. - Weight::from_parts(12_928_907, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 244 - .saturating_add(Weight::from_parts(1_800, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn force_clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `407` - // Estimated: `3675` - // Minimum execution time: 28_263_000 picoseconds. - Weight::from_parts(29_165_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_asset_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 12_343_000 picoseconds. - Weight::from_parts(12_659_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 31_113_000 picoseconds. - Weight::from_parts(31_798_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `521` - // Estimated: `6208` - // Minimum execution time: 61_428_000 picoseconds. - Weight::from_parts(62_707_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3675` - // Minimum execution time: 33_538_000 picoseconds. - Weight::from_parts(34_216_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn force_cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3675` - // Minimum execution time: 33_870_000 picoseconds. - Weight::from_parts(34_709_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_min_balance() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 13_358_000 picoseconds. - Weight::from_parts(13_735_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn touch() -> Weight { - // Proof Size summary in bytes: - // Measured: `346` - // Estimated: `3675` - // Minimum execution time: 32_159_000 picoseconds. - Weight::from_parts(32_998_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn touch_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 30_709_000 picoseconds. - Weight::from_parts(31_486_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn refund() -> Weight { - // Proof Size summary in bytes: - // Measured: `472` - // Estimated: `3675` - // Minimum execution time: 29_557_000 picoseconds. - Weight::from_parts(30_510_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn refund_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `402` - // Estimated: `3675` - // Minimum execution time: 28_027_000 picoseconds. - Weight::from_parts(28_865_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn block() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_758_000 picoseconds. - Weight::from_parts(17_280_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs deleted file mode 100644 index 0da4d38eda24..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_balances.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_balances` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_balances`. -pub struct WeightInfo(PhantomData); -impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_allow_death() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 56_173_000 picoseconds. - Weight::from_parts(57_097_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 41_470_000 picoseconds. - Weight::from_parts(42_051_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_creating() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 14_771_000 picoseconds. - Weight::from_parts(15_125_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_killing() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 22_210_000 picoseconds. - Weight::from_parts(22_712_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 57_475_000 picoseconds. - Weight::from_parts(58_343_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_all() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 52_139_000 picoseconds. - Weight::from_parts(52_601_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_unreserve() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 17_372_000 picoseconds. - Weight::from_parts(17_978_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:999 w:999) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(u: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 17_143_000 picoseconds. - Weight::from_parts(17_475_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 16_909 - .saturating_add(Weight::from_parts(15_474_628, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs deleted file mode 100644 index 6d8828e836cc..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_collator_selection.rs +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collator_selection` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_collator_selection -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collator_selection`. -pub struct WeightInfo(PhantomData); -impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:20 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `163 + b * (79 ±0)` - // Estimated: `1154 + b * (2555 ±0)` - // Minimum execution time: 14_882_000 picoseconds. - Weight::from_parts(12_290_529, 0) - .saturating_add(Weight::from_parts(0, 1154)) - // Standard Error: 6_842 - .saturating_add(Weight::from_parts(3_189_571, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) - } - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `756 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 48_113_000 picoseconds. - Weight::from_parts(49_767_909, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_725 - .saturating_add(Weight::from_parts(232_655, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `119 + b * (32 ±0)` - // Estimated: `6287` - // Minimum execution time: 16_228_000 picoseconds. - Weight::from_parts(16_351_387, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_953 - .saturating_add(Weight::from_parts(140_754, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn set_desired_candidates() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_541_000 picoseconds. - Weight::from_parts(7_720_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_402_000 picoseconds. - Weight::from_parts(7_729_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `736 + c * (52 ±0)` - // Estimated: `6287 + c * (54 ±0)` - // Minimum execution time: 41_874_000 picoseconds. - Weight::from_parts(45_654_015, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_317 - .saturating_add(Weight::from_parts(221_237, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[4, 100]`. - fn leave_intent(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `306 + c * (50 ±0)` - // Estimated: `6287` - // Minimum execution time: 33_693_000 picoseconds. - Weight::from_parts(37_321_527, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 3_499 - .saturating_add(Weight::from_parts(182_068, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - fn note_author() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 44_412_000 picoseconds. - Weight::from_parts(45_196_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:97 w:97) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `r` is `[1, 100]`. - /// The range of component `c` is `[1, 100]`. - fn new_session(r: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `2243 + c * (97 ±0) + r * (112 ±0)` - // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 17_360_000 picoseconds. - Weight::from_parts(17_599_000, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 350_829 - .saturating_add(Weight::from_parts(15_375_949, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs deleted file mode 100644 index d51eb85f6dcf..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_multisig.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_multisig` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_multisig -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_multisig`. -pub struct WeightInfo(PhantomData); -impl pallet_multisig::WeightInfo for WeightInfo { - /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_710_000 picoseconds. - Weight::from_parts(14_702_959, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 7 - .saturating_add(Weight::from_parts(568, 0).saturating_mul(z.into())) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `262 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 45_518_000 picoseconds. - Weight::from_parts(35_243_068, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_634 - .saturating_add(Weight::from_parts(116_658, 0).saturating_mul(s.into())) - // Standard Error: 16 - .saturating_add(Weight::from_parts(1_444, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[3, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_approve(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 29_590_000 picoseconds. - Weight::from_parts(21_574_604, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_622 - .saturating_add(Weight::from_parts(95_669, 0).saturating_mul(s.into())) - // Standard Error: 15 - .saturating_add(Weight::from_parts(1_459, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `385 + s * (33 ±0)` - // Estimated: `6811` - // Minimum execution time: 51_056_000 picoseconds. - Weight::from_parts(35_799_301, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_629 - .saturating_add(Weight::from_parts(183_343, 0).saturating_mul(s.into())) - // Standard Error: 15 - .saturating_add(Weight::from_parts(1_686, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 30_910_000 picoseconds. - Weight::from_parts(32_413_023, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_346 - .saturating_add(Weight::from_parts(128_779, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 17_926_000 picoseconds. - Weight::from_parts(18_477_305, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_367 - .saturating_add(Weight::from_parts(113_018, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + s * (1 ±0)` - // Estimated: `6811` - // Minimum execution time: 32_232_000 picoseconds. - Weight::from_parts(33_724_753, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_192 - .saturating_add(Weight::from_parts(121_574, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs deleted file mode 100644 index 1a04d8b0991d..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_nfts.rs +++ /dev/null @@ -1,773 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_nfts` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_nfts -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_nfts`. -pub struct WeightInfo(PhantomData); -impl pallet_nfts::WeightInfo for WeightInfo { - /// Storage: `Nfts::NextCollectionId` (r:1 w:1) - /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3549` - // Minimum execution time: 37_915_000 picoseconds. - Weight::from_parts(39_275_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::NextCollectionId` (r:1 w:1) - /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3549` - // Minimum execution time: 22_722_000 picoseconds. - Weight::from_parts(23_500_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1001 w:1000) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1000 w:1000) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:0 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// The range of component `m` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `32170 + a * (366 ±0)` - // Estimated: `2523990 + a * (2954 ±0)` - // Minimum execution time: 1_231_520_000 picoseconds. - Weight::from_parts(1_228_960_098, 0) - .saturating_add(Weight::from_parts(0, 2523990)) - // Standard Error: 8_836 - .saturating_add(Weight::from_parts(6_818_975, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(1004)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1005)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) - } - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `421` - // Estimated: `4326` - // Minimum execution time: 48_581_000 picoseconds. - Weight::from_parts(50_020_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn force_mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `421` - // Estimated: `4326` - // Minimum execution time: 47_171_000 picoseconds. - Weight::from_parts(48_084_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:0 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `530` - // Estimated: `4326` - // Minimum execution time: 53_591_000 picoseconds. - Weight::from_parts(55_074_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(7)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:2) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `559` - // Estimated: `4326` - // Minimum execution time: 40_935_000 picoseconds. - Weight::from_parts(41_835_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:5000 w:5000) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// The range of component `i` is `[0, 5000]`. - fn redeposit(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `729 + i * (108 ±0)` - // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 16_543_000 picoseconds. - Weight::from_parts(16_769_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - // Standard Error: 23_638 - .saturating_add(Weight::from_parts(17_762_895, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 3336).saturating_mul(i.into())) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn lock_item_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `401` - // Estimated: `3534` - // Minimum execution time: 20_446_000 picoseconds. - Weight::from_parts(20_740_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn unlock_item_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `401` - // Estimated: `3534` - // Minimum execution time: 20_088_000 picoseconds. - Weight::from_parts(20_627_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn lock_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `306` - // Estimated: `3549` - // Minimum execution time: 17_036_000 picoseconds. - Weight::from_parts(17_435_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:2) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `354` - // Estimated: `3549` - // Minimum execution time: 22_528_000 picoseconds. - Weight::from_parts(23_047_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:2 w:4) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `335` - // Estimated: `6078` - // Minimum execution time: 38_473_000 picoseconds. - Weight::from_parts(39_353_000, 0) - .saturating_add(Weight::from_parts(0, 6078)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:2) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_collection_owner() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3549` - // Minimum execution time: 17_708_000 picoseconds. - Weight::from_parts(18_022_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn force_collection_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `3549` - // Minimum execution time: 14_606_000 picoseconds. - Weight::from_parts(14_891_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn lock_item_properties() -> Weight { - // Proof Size summary in bytes: - // Measured: `401` - // Estimated: `3534` - // Minimum execution time: 19_492_000 picoseconds. - Weight::from_parts(19_919_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - fn set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `3944` - // Minimum execution time: 50_583_000 picoseconds. - Weight::from_parts(53_846_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - fn force_set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `310` - // Estimated: `3944` - // Minimum execution time: 25_937_000 picoseconds. - Weight::from_parts(26_540_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - fn clear_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `949` - // Estimated: `3944` - // Minimum execution time: 45_738_000 picoseconds. - Weight::from_parts(46_468_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - fn approve_item_attributes() -> Weight { - // Proof Size summary in bytes: - // Measured: `347` - // Estimated: `4466` - // Minimum execution time: 17_361_000 picoseconds. - Weight::from_parts(18_191_000, 0) - .saturating_add(Weight::from_parts(0, 4466)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1001 w:1000) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - fn cancel_item_attributes_approval(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `726 + n * (398 ±0)` - // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 25_884_000 picoseconds. - Weight::from_parts(26_265_000, 0) - .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 6_423 - .saturating_add(Weight::from_parts(6_507_369, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - fn set_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `505` - // Estimated: `3812` - // Minimum execution time: 40_802_000 picoseconds. - Weight::from_parts(41_742_000, 0) - .saturating_add(Weight::from_parts(0, 3812)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `815` - // Estimated: `3812` - // Minimum execution time: 38_904_000 picoseconds. - Weight::from_parts(39_919_000, 0) - .saturating_add(Weight::from_parts(0, 3812)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - fn set_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `364` - // Estimated: `3759` - // Minimum execution time: 37_012_000 picoseconds. - Weight::from_parts(37_632_000, 0) - .saturating_add(Weight::from_parts(0, 3759)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - fn clear_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `682` - // Estimated: `3759` - // Minimum execution time: 36_243_000 picoseconds. - Weight::from_parts(37_313_000, 0) - .saturating_add(Weight::from_parts(0, 3759)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `376` - // Estimated: `4326` - // Minimum execution time: 20_919_000 picoseconds. - Weight::from_parts(21_505_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `384` - // Estimated: `4326` - // Minimum execution time: 18_943_000 picoseconds. - Weight::from_parts(19_969_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn clear_all_transfer_approvals() -> Weight { - // Proof Size summary in bytes: - // Measured: `384` - // Estimated: `4326` - // Minimum execution time: 17_320_000 picoseconds. - Weight::from_parts(18_071_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn set_accept_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3517` - // Minimum execution time: 14_934_000 picoseconds. - Weight::from_parts(15_422_000, 0) - .saturating_add(Weight::from_parts(0, 3517)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - fn set_collection_max_supply() -> Weight { - // Proof Size summary in bytes: - // Measured: `306` - // Estimated: `3549` - // Minimum execution time: 18_715_000 picoseconds. - Weight::from_parts(19_025_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn update_mint_settings() -> Weight { - // Proof Size summary in bytes: - // Measured: `289` - // Estimated: `3538` - // Minimum execution time: 18_249_000 picoseconds. - Weight::from_parts(18_826_000, 0) - .saturating_add(Weight::from_parts(0, 3538)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn set_price() -> Weight { - // Proof Size summary in bytes: - // Measured: `484` - // Estimated: `4326` - // Minimum execution time: 23_529_000 picoseconds. - Weight::from_parts(23_958_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:1 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:2) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn buy_item() -> Weight { - // Proof Size summary in bytes: - // Measured: `671` - // Estimated: `4326` - // Minimum execution time: 50_885_000 picoseconds. - Weight::from_parts(52_157_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// The range of component `n` is `[0, 10]`. - fn pay_tips(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_258_000 picoseconds. - Weight::from_parts(3_342_691, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 6_268 - .saturating_add(Weight::from_parts(3_761_373, 0).saturating_mul(n.into())) - } - /// Storage: `Nfts::Item` (r:2 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn create_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `460` - // Estimated: `7662` - // Minimum execution time: 21_220_000 picoseconds. - Weight::from_parts(21_654_000, 0) - .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::PendingSwapOf` (r:1 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn cancel_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `479` - // Estimated: `4326` - // Minimum execution time: 20_430_000 picoseconds. - Weight::from_parts(21_038_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:2 w:2) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:1 w:2) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:2 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:2 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:4) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:2) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn claim_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `800` - // Estimated: `7662` - // Minimum execution time: 83_344_000 picoseconds. - Weight::from_parts(84_898_000, 0) - .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(10)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:2 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:10 w:10) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 10]`. - fn mint_pre_signed(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `524` - // Estimated: `6078 + n * (2954 ±0)` - // Minimum execution time: 143_435_000 picoseconds. - Weight::from_parts(151_744_537, 0) - .saturating_add(Weight::from_parts(0, 6078)) - // Standard Error: 44_459 - .saturating_add(Weight::from_parts(31_293_503, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(6)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:10 w:10) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 10]`. - fn set_attributes_pre_signed(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `554` - // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 84_627_000 picoseconds. - Weight::from_parts(96_076_065, 0) - .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 62_058 - .saturating_add(Weight::from_parts(30_461_383, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs deleted file mode 100644 index df0124b471d5..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_proxy.rs +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_proxy` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_proxy -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_proxy`. -pub struct WeightInfo(PhantomData); -impl pallet_proxy::WeightInfo for WeightInfo { - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 16_130_000 picoseconds. - Weight::from_parts(16_649_312, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 761 - .saturating_add(Weight::from_parts(42_507, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn proxy_announced(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 37_732_000 picoseconds. - Weight::from_parts(36_993_926, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 3_278 - .saturating_add(Weight::from_parts(144_955, 0).saturating_mul(a.into())) - // Standard Error: 3_387 - .saturating_add(Weight::from_parts(64_624, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn remove_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 24_229_000 picoseconds. - Weight::from_parts(24_199_507, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_672 - .saturating_add(Weight::from_parts(124_324, 0).saturating_mul(a.into())) - // Standard Error: 1_727 - .saturating_add(Weight::from_parts(28_481, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn reject_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 23_868_000 picoseconds. - Weight::from_parts(25_293_069, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_728 - .saturating_add(Weight::from_parts(114_080, 0).saturating_mul(a.into())) - // Standard Error: 1_786 - .saturating_add(Weight::from_parts(3_690, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn announce(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 34_343_000 picoseconds. - Weight::from_parts(34_539_112, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_917 - .saturating_add(Weight::from_parts(117_360, 0).saturating_mul(a.into())) - // Standard Error: 1_981 - .saturating_add(Weight::from_parts(40_908, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn add_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 25_506_000 picoseconds. - Weight::from_parts(26_350_920, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_950 - .saturating_add(Weight::from_parts(48_972, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 25_234_000 picoseconds. - Weight::from_parts(26_232_489, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_468 - .saturating_add(Weight::from_parts(48_955, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxies(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 22_184_000 picoseconds. - Weight::from_parts(22_974_929, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_200 - .saturating_add(Weight::from_parts(45_741, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn create_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `139` - // Estimated: `4706` - // Minimum execution time: 27_044_000 picoseconds. - Weight::from_parts(27_978_605, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_206 - .saturating_add(Weight::from_parts(13_736, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 30]`. - fn kill_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `164 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 22_770_000 picoseconds. - Weight::from_parts(23_441_470, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_959 - .saturating_add(Weight::from_parts(47_317, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs deleted file mode 100644 index 50c77fd3bc89..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_session.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_session` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_session -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_session`. -pub struct WeightInfo(PhantomData); -impl pallet_session::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:1 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn set_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `270` - // Estimated: `3735` - // Minimum execution time: 16_684_000 picoseconds. - Weight::from_parts(17_167_000, 0) - .saturating_add(Weight::from_parts(0, 3735)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:0 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn purge_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `3707` - // Minimum execution time: 11_692_000 picoseconds. - Weight::from_parts(12_248_000, 0) - .saturating_add(Weight::from_parts(0, 3707)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs deleted file mode 100644 index 93f7e31120ca..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_timestamp.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_timestamp` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_timestamp -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_timestamp`. -pub struct WeightInfo(PhantomData); -impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: `Timestamp::Now` (r:1 w:1) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Aura::CurrentSlot` (r:1 w:0) - /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set() -> Weight { - // Proof Size summary in bytes: - // Measured: `86` - // Estimated: `1493` - // Minimum execution time: 9_214_000 picoseconds. - Weight::from_parts(9_535_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn on_finalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `57` - // Estimated: `0` - // Minimum execution time: 3_269_000 picoseconds. - Weight::from_parts(3_458_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs deleted file mode 100644 index 3917b594c3f1..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_uniques.rs +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_uniques` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_uniques -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_uniques`. -pub struct WeightInfo(PhantomData); -impl pallet_uniques::WeightInfo for WeightInfo { - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3643` - // Minimum execution time: 29_513_000 picoseconds. - Weight::from_parts(30_346_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3643` - // Minimum execution time: 13_600_000 picoseconds. - Weight::from_parts(14_110_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1001 w:1000) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1000 w:1000) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1000 w:1000) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:0 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1000) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::CollectionMaxSupply` (r:0 w:1) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - /// The range of component `m` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy(n: u32, m: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` - // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` - // Minimum execution time: 2_945_869_000 picoseconds. - Weight::from_parts(3_037_917_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 35_850 - .saturating_add(Weight::from_parts(7_558_563, 0).saturating_mul(n.into())) - // Standard Error: 35_850 - .saturating_add(Weight::from_parts(501_089, 0).saturating_mul(m.into())) - // Standard Error: 35_850 - .saturating_add(Weight::from_parts(538_921, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) - .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::CollectionMaxSupply` (r:1 w:0) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 36_225_000 picoseconds. - Weight::from_parts(36_858_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 37_021_000 picoseconds. - Weight::from_parts(37_749_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:2) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 26_884_000 picoseconds. - Weight::from_parts(27_414_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:5000 w:5000) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// The range of component `i` is `[0, 5000]`. - fn redeposit(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `738 + i * (76 ±0)` - // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 14_797_000 picoseconds. - Weight::from_parts(14_943_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 25_250 - .saturating_add(Weight::from_parts(18_014_600, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(i.into())) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 18_864_000 picoseconds. - Weight::from_parts(19_299_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 18_530_000 picoseconds. - Weight::from_parts(19_230_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn freeze_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_807_000 picoseconds. - Weight::from_parts(14_270_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn thaw_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_657_000 picoseconds. - Weight::from_parts(14_059_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:2) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `356` - // Estimated: `3643` - // Minimum execution time: 22_108_000 picoseconds. - Weight::from_parts(22_520_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 14_128_000 picoseconds. - Weight::from_parts(14_481_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_item_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 17_114_000 picoseconds. - Weight::from_parts(17_570_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - fn set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `559` - // Estimated: `3652` - // Minimum execution time: 40_412_000 picoseconds. - Weight::from_parts(43_009_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - fn clear_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `756` - // Estimated: `3652` - // Minimum execution time: 38_044_000 picoseconds. - Weight::from_parts(38_871_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - fn set_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `348` - // Estimated: `3652` - // Minimum execution time: 30_016_000 picoseconds. - Weight::from_parts(30_723_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `559` - // Estimated: `3652` - // Minimum execution time: 30_942_000 picoseconds. - Weight::from_parts(31_527_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - fn set_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 30_727_000 picoseconds. - Weight::from_parts(31_688_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - fn clear_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `473` - // Estimated: `3643` - // Minimum execution time: 29_844_000 picoseconds. - Weight::from_parts(30_403_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 19_155_000 picoseconds. - Weight::from_parts(19_909_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `461` - // Estimated: `3643` - // Minimum execution time: 19_163_000 picoseconds. - Weight::from_parts(19_804_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn set_accept_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3517` - // Minimum execution time: 15_413_000 picoseconds. - Weight::from_parts(15_762_000, 0) - .saturating_add(Weight::from_parts(0, 3517)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::CollectionMaxSupply` (r:1 w:1) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn set_collection_max_supply() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 16_477_000 picoseconds. - Weight::from_parts(16_811_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:0) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn set_price() -> Weight { - // Proof Size summary in bytes: - // Measured: `259` - // Estimated: `3587` - // Minimum execution time: 16_415_000 picoseconds. - Weight::from_parts(16_906_000, 0) - .saturating_add(Weight::from_parts(0, 3587)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:1 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:2) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn buy_item() -> Weight { - // Proof Size summary in bytes: - // Measured: `540` - // Estimated: `3643` - // Minimum execution time: 35_814_000 picoseconds. - Weight::from_parts(36_569_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs deleted file mode 100644 index bda0c6e1aa94..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_utility.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_utility` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_utility -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_utility`. -pub struct WeightInfo(PhantomData); -impl pallet_utility::WeightInfo for WeightInfo { - /// The range of component `c` is `[0, 1000]`. - fn batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_918_000 picoseconds. - Weight::from_parts(2_421_521, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_252 - .saturating_add(Weight::from_parts(6_625_635, 0).saturating_mul(c.into())) - } - fn as_derivative() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_304_000 picoseconds. - Weight::from_parts(5_546_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn batch_all(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_847_000 picoseconds. - Weight::from_parts(1_224_975, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_818 - .saturating_add(Weight::from_parts(6_891_149, 0).saturating_mul(c.into())) - } - fn dispatch_as() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_269_000 picoseconds. - Weight::from_parts(9_604_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn force_batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_855_000 picoseconds. - Weight::from_parts(6_965_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_631 - .saturating_add(Weight::from_parts(6_545_496, 0).saturating_mul(c.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs deleted file mode 100644 index 8d14734888b6..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/pallet_xcm.rs +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_xcm`. -pub struct WeightInfo(PhantomData); -impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn send() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 28_284_000 picoseconds. - Weight::from_parts(29_186_000, 0) - .saturating_add(Weight::from_parts(0, 3540)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 24_830_000 picoseconds. - Weight::from_parts(26_312_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn reserve_transfer_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 18_584_000 picoseconds. - Weight::from_parts(19_083_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn execute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_415_000 picoseconds. - Weight::from_parts(9_821_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_default_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_902_000 picoseconds. - Weight::from_parts(3_377_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_subscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 32_730_000 picoseconds. - Weight::from_parts(33_879_000, 0) - .saturating_add(Weight::from_parts(0, 3540)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_unsubscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `257` - // Estimated: `3722` - // Minimum execution time: 34_053_000 picoseconds. - Weight::from_parts(34_506_000, 0) - .saturating_add(Weight::from_parts(0, 3722)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) - /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_suspension() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_824_000 picoseconds. - Weight::from_parts(2_986_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_supported_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `129` - // Estimated: `11019` - // Minimum execution time: 17_011_000 picoseconds. - Weight::from_parts(17_488_000, 0) - .saturating_add(Weight::from_parts(0, 11019)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notifiers() -> Weight { - // Proof Size summary in bytes: - // Measured: `133` - // Estimated: `11023` - // Minimum execution time: 17_191_000 picoseconds. - Weight::from_parts(17_784_000, 0) - .saturating_add(Weight::from_parts(0, 11023)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn already_notified_target() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `13505` - // Minimum execution time: 18_625_000 picoseconds. - Weight::from_parts(19_177_000, 0) - .saturating_add(Weight::from_parts(0, 13505)) - .saturating_add(T::DbWeight::get().reads(5)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn notify_current_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `6082` - // Minimum execution time: 30_762_000 picoseconds. - Weight::from_parts(31_481_000, 0) - .saturating_add(Weight::from_parts(0, 6082)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn notify_target_migration_fail() -> Weight { - // Proof Size summary in bytes: - // Measured: `172` - // Estimated: `8587` - // Minimum execution time: 9_025_000 picoseconds. - Weight::from_parts(9_423_000, 0) - .saturating_add(Weight::from_parts(0, 8587)) - .saturating_add(T::DbWeight::get().reads(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notify_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `11030` - // Minimum execution time: 17_550_000 picoseconds. - Weight::from_parts(17_939_000, 0) - .saturating_add(Weight::from_parts(0, 11030)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn migrate_and_notify_old_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `146` - // Estimated: `11036` - // Minimum execution time: 36_922_000 picoseconds. - Weight::from_parts(37_709_000, 0) - .saturating_add(Weight::from_parts(0, 11036)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs deleted file mode 100644 index 79f8e83a4f20..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/mod.rs +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod pallet_xcm_benchmarks_fungible; -mod pallet_xcm_benchmarks_generic; - -use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; -use frame_support::weights::Weight; -use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; -use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; -use xcm::{latest::prelude::*, DoubleEncoded}; - -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; -} - -const MAX_ASSETS: u64 = 100; - -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - match self { - Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), - Self::Wild(asset) => match asset { - All => weight.saturating_mul(MAX_ASSETS), - AllOf { fun, .. } => match fun { - WildFungibility::Fungible => weight, - // Magic number 2 has to do with the fact that we could have up to 2 times - // MaxAssetsIntoHolding in the worst-case scenario. - WildFungibility::NonFungible => - weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), - }, - AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - }, - } - } -} - -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().iter().count() as u64) - } -} - -pub struct AssetHubPolkadotXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for AssetHubPolkadotXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) - } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) - } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) - } - fn query_response( - _query_id: &u64, - _response: &Response, - _max_weight: &Weight, - _querier: &Option, - ) -> Weight { - XcmGeneric::::query_response() - } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) - } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) - } - fn transact( - _origin_type: &OriginKind, - _require_weight_at_most: &Weight, - _call: &DoubleEncoded, - ) -> Weight { - XcmGeneric::::transact() - } - fn hrmp_new_channel_open_request( - _sender: &u32, - _max_message_size: &u32, - _max_capacity: &u32, - ) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_accepted(_recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn clear_origin() -> Weight { - XcmGeneric::::clear_origin() - } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { - XcmGeneric::::descend_origin() - } - fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_error() - } - - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) - } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) - } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { - Weight::MAX - } - fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) - } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) - } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { - XcmGeneric::::report_holding() - } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { - XcmGeneric::::buy_execution() - } - fn refund_surplus() -> Weight { - XcmGeneric::::refund_surplus() - } - fn set_error_handler(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_error_handler() - } - fn set_appendix(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_appendix() - } - fn clear_error() -> Weight { - XcmGeneric::::clear_error() - } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { - XcmGeneric::::claim_asset() - } - fn trap(_code: &u64) -> Weight { - XcmGeneric::::trap() - } - fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { - XcmGeneric::::subscribe_version() - } - fn unsubscribe_version() -> Weight { - XcmGeneric::::unsubscribe_version() - } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) - } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) - } - fn expect_origin(_origin: &Option) -> Weight { - XcmGeneric::::expect_origin() - } - fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { - XcmGeneric::::expect_error() - } - fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { - XcmGeneric::::expect_transact_status() - } - fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::query_pallet() - } - fn expect_pallet( - _index: &u32, - _name: &Vec, - _module_name: &Vec, - _crate_major: &u32, - _min_crate_minor: &u32, - ) -> Weight { - XcmGeneric::::expect_pallet() - } - fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_transact_status() - } - fn clear_transact_status() -> Weight { - XcmGeneric::::clear_transact_status() - } - fn universal_origin(_: &Junction) -> Weight { - Weight::MAX - } - fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - Weight::MAX - } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn set_fees_mode(_: &bool) -> Weight { - XcmGeneric::::set_fees_mode() - } - fn set_topic(_topic: &[u8; 32]) -> Weight { - XcmGeneric::::set_topic() - } - fn clear_topic() -> Weight { - XcmGeneric::::clear_topic() - } - fn alias_origin(_: &MultiLocation) -> Weight { - // XCM Executor does not currently support alias origin operations - Weight::MAX - } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { - XcmGeneric::::unpaid_execution() - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs deleted file mode 100644 index 7fea608319f0..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::fungible`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn withdraw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `3593` - // Minimum execution time: 26_090_000 picoseconds. - Weight::from_parts(27_006_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn transfer_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `6196` - // Minimum execution time: 50_699_000 picoseconds. - Weight::from_parts(51_888_000, 6196) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn transfer_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `176` - // Estimated: `6196` - // Minimum execution time: 72_130_000 picoseconds. - Weight::from_parts(73_994_000, 6196) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - // Storage: `Benchmark::Override` (r:0 w:0) - // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn reserve_asset_deposited() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 500_000_000_000 picoseconds. - Weight::from_parts(500_000_000_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_reserve_withdraw() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 477_183_000 picoseconds. - Weight::from_parts(488_156_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn receive_teleported_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_966_000 picoseconds. - Weight::from_parts(4_129_000, 0) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn deposit_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 26_047_000 picoseconds. - Weight::from_parts(26_982_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn deposit_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3593` - // Minimum execution time: 51_076_000 picoseconds. - Weight::from_parts(51_826_000, 3593) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_teleport() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 30_606_000 picoseconds. - Weight::from_parts(31_168_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs deleted file mode 100644 index aa7451594f5b..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::generic` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-polkadot-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::generic`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_holding() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 425_235_000 picoseconds. - Weight::from_parts(432_935_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn buy_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_070_000 picoseconds. - Weight::from_parts(4_329_000, 0) - } - // Storage: `PolkadotXcm::Queries` (r:1 w:0) - // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn query_response() -> Weight { - // Proof Size summary in bytes: - // Measured: `69` - // Estimated: `3534` - // Minimum execution time: 11_464_000 picoseconds. - Weight::from_parts(11_829_000, 3534) - .saturating_add(T::DbWeight::get().reads(1)) - } - pub fn transact() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_574_000 picoseconds. - Weight::from_parts(14_021_000, 0) - } - pub fn refund_surplus() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_276_000 picoseconds. - Weight::from_parts(4_479_000, 0) - } - pub fn set_error_handler() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_833_000 picoseconds. - Weight::from_parts(2_939_000, 0) - } - pub fn set_appendix() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_797_000 picoseconds. - Weight::from_parts(2_901_000, 0) - } - pub fn clear_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_855_000 picoseconds. - Weight::from_parts(2_961_000, 0) - } - pub fn descend_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_589_000 picoseconds. - Weight::from_parts(3_720_000, 0) - } - pub fn clear_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_786_000 picoseconds. - Weight::from_parts(2_889_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 25_740_000 picoseconds. - Weight::from_parts(26_355_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) - // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn claim_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `126` - // Estimated: `3591` - // Minimum execution time: 16_206_000 picoseconds. - Weight::from_parts(16_651_000, 3591) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn trap() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_819_000 picoseconds. - Weight::from_parts(2_944_000, 0) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn subscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 28_216_000 picoseconds. - Weight::from_parts(28_878_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn unsubscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_795_000 picoseconds. - Weight::from_parts(5_008_000, 0) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn burn_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 135_205_000 picoseconds. - Weight::from_parts(140_623_000, 0) - } - pub fn expect_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 12_791_000 picoseconds. - Weight::from_parts(13_114_000, 0) - } - pub fn expect_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_000_000 picoseconds. - Weight::from_parts(3_091_000, 0) - } - pub fn expect_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_828_000 picoseconds. - Weight::from_parts(2_947_000, 0) - } - pub fn expect_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_980_000 picoseconds. - Weight::from_parts(3_123_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn query_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 29_672_000 picoseconds. - Weight::from_parts(30_318_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn expect_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_421_000 picoseconds. - Weight::from_parts(5_614_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 25_621_000 picoseconds. - Weight::from_parts(26_486_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn clear_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_873_000 picoseconds. - Weight::from_parts(2_973_000, 0) - } - pub fn set_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_861_000 picoseconds. - Weight::from_parts(2_923_000, 0) - } - pub fn clear_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_845_000 picoseconds. - Weight::from_parts(2_970_000, 0) - } - pub fn set_fees_mode() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_773_000 picoseconds. - Weight::from_parts(2_922_000, 0) - } - pub fn unpaid_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_980_000 picoseconds. - Weight::from_parts(3_095_000, 0) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs deleted file mode 100644 index e897fcc6ad4a..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/src/xcm_config.rs +++ /dev/null @@ -1,532 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets, - ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssetsInstance, WeightToFee, XcmpQueue, -}; -use assets_common::matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; -use polkadot_parachain::primitives::Sibling; -use sp_runtime::traits::ConvertInto; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, DescribeFamily, DescribePalletTerminal, - EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NativeAsset, - NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; - -parameter_types! { - pub const DotLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Polkadot); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); - pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, - // Foreign chain account alias into local accounts according to a hash of their standard - // description. - HashedDescription>, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// `AssetId`/`Balance` converter for `TrustBackedAssets`. -pub type TrustBackedAssetsConvertedConcreteId = - assets_common::TrustBackedAssetsConvertedConcreteId; - -/// Means for transacting assets besides the native currency on this chain. -pub type FungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - Assets, - // Use this currency when it is a fungible asset matching the given location or name: - TrustBackedAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// `AssetId/Balance` converter for `TrustBackedAssets` -pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< - ( - // Ignore `TrustBackedAssets` explicitly - StartsWith, - // Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parents: 1, - // X*(Parachain(xyz), ..)}` - // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't - // be accepted here - StartsWithExplicitGlobalConsensus, - ), - Balance, ->; - -/// Means for transacting foreign assets from different global consensus. -pub type ForeignFungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - ForeignAssets, - // Use this currency when it is a fungible asset matching the given location or name: - ForeignAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We dont need to check teleports here. - NoChecking, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor); - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognised. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognised. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - pub XcmAssetFeesReceiver: Option = Authorship::author(); -} - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; - pub type FellowsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } - }; - pub type FellowshipSalaryPallet: impl Contains = { - MultiLocation { parents: 1, interior: X2(Parachain(1001), PalletInstance(64)) } - }; -} - -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - matches!( - call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Assets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | RuntimeCall::ForeignAssets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | RuntimeCall::Nfts( - pallet_nfts::Call::create { .. } | - pallet_nfts::Call::force_create { .. } | - pallet_nfts::Call::destroy { .. } | - pallet_nfts::Call::mint { .. } | - pallet_nfts::Call::force_mint { .. } | - pallet_nfts::Call::burn { .. } | - pallet_nfts::Call::transfer { .. } | - pallet_nfts::Call::lock_item_transfer { .. } | - pallet_nfts::Call::unlock_item_transfer { .. } | - pallet_nfts::Call::lock_collection { .. } | - pallet_nfts::Call::transfer_ownership { .. } | - pallet_nfts::Call::set_team { .. } | - pallet_nfts::Call::force_collection_owner { .. } | - pallet_nfts::Call::force_collection_config { .. } | - pallet_nfts::Call::approve_transfer { .. } | - pallet_nfts::Call::cancel_approval { .. } | - pallet_nfts::Call::clear_all_transfer_approvals { .. } | - pallet_nfts::Call::lock_item_properties { .. } | - pallet_nfts::Call::set_attribute { .. } | - pallet_nfts::Call::force_set_attribute { .. } | - pallet_nfts::Call::clear_attribute { .. } | - pallet_nfts::Call::approve_item_attributes { .. } | - pallet_nfts::Call::cancel_item_attributes_approval { .. } | - pallet_nfts::Call::set_metadata { .. } | - pallet_nfts::Call::clear_metadata { .. } | - pallet_nfts::Call::set_collection_metadata { .. } | - pallet_nfts::Call::clear_collection_metadata { .. } | - pallet_nfts::Call::set_accept_ownership { .. } | - pallet_nfts::Call::set_collection_max_supply { .. } | - pallet_nfts::Call::update_mint_settings { .. } | - pallet_nfts::Call::set_price { .. } | - pallet_nfts::Call::buy_item { .. } | - pallet_nfts::Call::pay_tips { .. } | - pallet_nfts::Call::create_swap { .. } | - pallet_nfts::Call::cancel_swap { .. } | - pallet_nfts::Call::claim_swap { .. }, - ) | RuntimeCall::Uniques( - pallet_uniques::Call::create { .. } | - pallet_uniques::Call::force_create { .. } | - pallet_uniques::Call::destroy { .. } | - pallet_uniques::Call::mint { .. } | - pallet_uniques::Call::burn { .. } | - pallet_uniques::Call::transfer { .. } | - pallet_uniques::Call::freeze { .. } | - pallet_uniques::Call::thaw { .. } | - pallet_uniques::Call::freeze_collection { .. } | - pallet_uniques::Call::thaw_collection { .. } | - pallet_uniques::Call::transfer_ownership { .. } | - pallet_uniques::Call::set_team { .. } | - pallet_uniques::Call::approve_transfer { .. } | - pallet_uniques::Call::cancel_approval { .. } | - pallet_uniques::Call::force_item_status { .. } | - pallet_uniques::Call::set_attribute { .. } | - pallet_uniques::Call::clear_attribute { .. } | - pallet_uniques::Call::set_metadata { .. } | - pallet_uniques::Call::clear_metadata { .. } | - pallet_uniques::Call::set_collection_metadata { .. } | - pallet_uniques::Call::clear_collection_metadata { .. } | - pallet_uniques::Call::set_accept_ownership { .. } | - pallet_uniques::Call::set_collection_max_supply { .. } | - pallet_uniques::Call::set_price { .. } | - pallet_uniques::Call::buy_item { .. } - ) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality - // get free execution. - AllowExplicitUnpaidExecutionFrom<( - ParentOrParentsPlurality, - FellowsPlurality, - FellowshipSalaryPallet, - )>, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< - Runtime, - WeightToFee, - pallet_assets::BalanceToAssetBalance, - TrustBackedAssetsInstance, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = AssetTransactors; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Asset Hub Polkadot does not recognize a reserve location for any asset. This does not prevent - // Asset Hub acting _as_ a reserve location for DOT and assets created under `pallet-assets`. - // For DOT, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = (); - // We allow: - // - teleportation of DOT - // - teleportation of sibling parachain's assets (as ForeignCreators) - type IsTeleporter = ( - NativeAsset, - IsForeignConcreteAsset>>, - ); - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubPolkadotXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type Trader = ( - UsingComponents>, - cumulus_primitives_utility::TakeFirstAssetTrader< - AccountId, - AssetFeeAsExistentialDepositMultiplierFeeCharger, - TrustBackedAssetsConvertedConcreteId, - Assets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - FungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, - >, - ); - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports and reserve transfers are - // allowed. - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Everything; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubPolkadotXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -pub type ForeignCreatorsSovereignAccountOf = ( - SiblingParachainConvertsVia, - AccountId32Aliases, - ParentIsPreset, -); - -/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. -pub struct XcmBenchmarkHelper; -#[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } - } -} - -#[test] -fn foreign_pallet_has_correct_local_account() { - use sp_core::crypto::{Ss58AddressFormat, Ss58Codec}; - use xcm_executor::traits::ConvertLocation; - - const COLLECTIVES_PARAID: u32 = 1001; - const FELLOWSHIP_SALARY_PALLET_ID: u8 = 64; - let fellowship_salary = - (Parent, Parachain(COLLECTIVES_PARAID), PalletInstance(FELLOWSHIP_SALARY_PALLET_ID)); - let account = LocationToAccountId::convert_location(&fellowship_salary.into()).unwrap(); - let polkadot = Ss58AddressFormat::try_from("polkadot").unwrap(); - let address = Ss58Codec::to_ss58check_with_version(&account, polkadot); - assert_eq!(address, "13w7NdvSR1Af8xsQTArDtZmVvjE8XhWNdL4yed3iFHrUNCnS"); -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs deleted file mode 100644 index 0d4f9ed8295a..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-polkadot/tests/tests.rs +++ /dev/null @@ -1,654 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Tests for the Statemint (Polkadot Assets Hub) chain. - -use asset_hub_polkadot_runtime::xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation, - ForeignCreatorsSovereignAccountOf, TrustBackedAssetsPalletLocation, XcmConfig, -}; -pub use asset_hub_polkadot_runtime::{ - constants::fee::WeightToFee, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, - ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, - RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance, -}; -use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper}; -use codec::{Decode, Encode}; -use cumulus_primitives_utility::ChargeWeightInFungibles; -use frame_support::{ - assert_noop, assert_ok, - traits::fungibles::InspectEnumerable, - weights::{Weight, WeightToFee as WeightToFeeT}, -}; -use parachains_common::{ - AccountId, AssetHubPolkadotAuraId as AuraId, AssetIdForTrustBackedAssets, Balance, -}; -use sp_runtime::traits::MaybeEquivalence; -use xcm::latest::prelude::*; -use xcm_executor::traits::{Identity, JustTry, WeightTrader}; - -const ALICE: [u8; 32] = [1u8; 32]; -const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; - -type AssetIdForTrustBackedAssetsConvert = - assets_common::AssetIdForTrustBackedAssetsConvert; - -fn collator_session_keys() -> CollatorSessionKeys { - CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - ) -} - -#[test] -fn test_asset_xcm_trader() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - let minimum_asset_balance = 333333333_u128; - let local_asset_id = 1; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // get asset id as multilocation - let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 400e9 weight - // Because of the ED being higher in kusama's asset hub - // and not to complicate things, we use a little - // bit more of weight - let bought = Weight::from_parts(400_000_000_000u64, 0); - - // Lets calculate amount needed - let asset_amount_needed = - AssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( - local_asset_id, - bought, - ) - .expect("failed to compute"); - - // Lets pay with: asset_amount_needed + asset_amount_extra - let asset_amount_extra = 100_u128; - let asset: MultiAsset = - (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Lets buy_weight and make sure buy_weight does not return an error - let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); - // Check whether a correct amount of unused assets is returned - assert_ok!( - unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) - ); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance + asset_amount_needed - ); - - // We also need to ensure the total supply increased - assert_eq!( - Assets::total_supply(local_asset_id), - minimum_asset_balance + asset_amount_needed - ); - }); -} - -#[test] -fn test_asset_xcm_trader_with_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 400e9 weight - // Because of the ED being higher in kusama's asset hub - // and not to complicate things, we use a little - // bit more of weight - let bought = Weight::from_parts(400_000_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - // lets calculate amount needed - let amount_bought = WeightToFee::weight_to_fee(&bought); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Make sure buy_weight does not return an error - assert_ok!(trader.buy_weight(bought, asset.clone().into(), &ctx)); - - // Make sure again buy_weight does return an error - // This assert relies on the fact, that we use `TakeFirstAssetTrader` in `WeightTrader` - // tuple chain, which cannot be called twice - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // We actually use half of the weight - let weight_used = bought / 2; - - // Make sure refurnd works. - let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); - - assert_eq!( - trader.refund_weight(bought - weight_used, &ctx), - Some((asset_multilocation, amount_refunded).into()) - ); - - // Drop trader - drop(trader); - - // We only should have paid for half of the bought weight - let fees_paid = WeightToFee::weight_to_fee(&weight_used); - - assert_eq!( - Assets::balance(1, AccountId::from(ALICE)), - ExistentialDeposit::get() + fees_paid - ); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get() + fees_paid); - }); -} - -#[test] -fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 50e9 weight - // Because of the ED being higher in kusama's asset hub - // and not to complicate things, we use a little - // bit more of weight - let bought = Weight::from_parts(50_000_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Buy weight should return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // not credited since the ED is higher than this value - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), 0); - - // We also need to ensure the total supply did not increase - assert_eq!(Assets::total_supply(1), 0); - }); -} - -#[test] -fn test_that_buying_ed_refund_does_not_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are gonna buy ED - let bought = Weight::from_parts(ExistentialDeposit::get().try_into().unwrap(), 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - // We know we will have to buy at least ED, so lets make sure first it will - // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); - - // Buy weight should work - assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); - - // Should return None. We have a specific check making sure we dont go below ED for - // drop payment - assert_eq!(trader.refund_weight(bought, &ctx), None); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), ExistentialDeposit::get()); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); - }); -} - -#[test] -fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // Create a non-sufficient asset - let minimum_asset_balance = 1_000_000_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - false, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 400e9 weight - // Because of the ED being higher in kusama's asset hub - // and not to complicate things, we use a little - // bit more of weight - let bought = Weight::from_parts(400_000_000_000u64, 0); - - // lets calculate amount needed - let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); - - // Make sure again buy_weight does return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has NOT received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), minimum_asset_balance); - - // We also need to ensure the total supply NOT increased - assert_eq!(Assets::total_supply(1), minimum_asset_balance); - }); -} - -#[test] -fn test_assets_balances_api_works() { - use assets_common::runtime_api::runtime_decl_for_fungibles_api::FungiblesApi; - - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - let local_asset_id = 1; - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; - - // check before - assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); - assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), - 0 - ); - assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); - assert!(Runtime::query_account_balances(AccountId::from(ALICE)) - .unwrap() - .try_as::() - .unwrap() - .is_none()); - - // Drip some balance - use frame_support::traits::fungible::Mutate; - let some_currency = ExistentialDeposit::get(); - Balances::mint_into(&AccountId::from(ALICE), some_currency).unwrap(); - - // We need root origin to create a sufficient asset - let minimum_asset_balance = 3333333_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // create foreign asset - let foreign_asset_minimum_asset_balance = 3333333_u128; - assert_ok!(ForeignAssets::force_create( - RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation, - AccountId::from(SOME_ASSET_ADMIN).into(), - false, - foreign_asset_minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(ForeignAssets::mint( - RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), - foreign_asset_id_multilocation, - AccountId::from(ALICE).into(), - 6 * foreign_asset_minimum_asset_balance - )); - - // check after - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance - ); - assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), - 6 * minimum_asset_balance - ); - assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - - let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) - .unwrap() - .try_into() - .unwrap(); - assert_eq!(result.len(), 3); - - // check currency - assert!(result.inner().iter().any(|asset| asset.eq( - &assets_common::fungible_conversion::convert_balance::( - some_currency - ) - .unwrap() - ))); - // check trusted asset - assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), - minimum_asset_balance - ) - .into()))); - // check foreign asset - assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), - 6 * foreign_asset_minimum_asset_balance - ) - .into()))); - }); -} - -asset_test_utils::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - 1000 -); - -asset_test_utils::include_teleports_for_foreign_assets_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - ForeignCreatorsSovereignAccountOf, - ForeignAssetsInstance, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( - Runtime, - XcmConfig, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( - asset_transactor_transfer_with_trust_backed_assets_works, - Runtime, - XcmConfig, - TrustBackedAssetsInstance, - AssetIdForTrustBackedAssets, - AssetIdForTrustBackedAssetsConvert, - collator_session_keys(), - ExistentialDeposit::get(), - 12345, - Box::new(|| { - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( - asset_transactor_transfer_with_foreign_assets_works, - Runtime, - XcmConfig, - ForeignAssetsInstance, - MultiLocation, - JustTry, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works!( - Runtime, - XcmConfig, - WeightToFee, - ForeignCreatorsSovereignAccountOf, - ForeignAssetsInstance, - MultiLocation, - JustTry, - asset_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - AssetDeposit::get(), - MetadataDepositBase::get(), - MetadataDepositPerByte::get(), - Box::new(|pallet_asset_call| RuntimeCall::ForeignAssets(pallet_asset_call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::ForeignAssets(pallet_asset_event)) => Some(pallet_asset_event), - _ => None, - } - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); - }) -); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml deleted file mode 100644 index ce8b1d80f028..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ /dev/null @@ -1,200 +0,0 @@ -[package] -name = "asset-hub-westend-runtime" -version = "0.9.420" -authors = ["Parity Technologies "] -edition = "2021" -description = "Westend variant of Asset Hub parachain runtime" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-asset-conversion-tx-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-asset-conversion = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nft-fractionalization = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nfts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-nfts-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-uniques = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -# num-traits feature needed for dex integer sq root: -primitive-types = { version = "0.12.1", default-features = false, features = ["codec", "scale-info", "num-traits"] } - -# Polkadot -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -westend-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = {path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0"} -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -assets-common = { path = "../common", default-features = false } - -[dev-dependencies] -hex-literal = "0.4.1" -asset-test-utils = { path = "../test-utils"} - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[features] -default = [ "std" ] -runtime-benchmarks = [ - "hex-literal", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-assets/runtime-benchmarks", - "pallet-asset-conversion/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-nft-fractionalization/runtime-benchmarks", - "pallet-nfts/runtime-benchmarks", - "pallet-proxy/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-uniques/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", - "assets-common/runtime-benchmarks", -] -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-asset-conversion-tx-payment/try-runtime", - "pallet-assets/try-runtime", - "pallet-asset-conversion/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-multisig/try-runtime", - "pallet-nft-fractionalization/try-runtime", - "pallet-nfts/try-runtime", - "pallet-proxy/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-uniques/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-asset-conversion-tx-payment/std", - "pallet-assets/std", - "pallet-asset-conversion/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-multisig/std", - "pallet-nft-fractionalization/std", - "pallet-nfts/std", - "pallet-nfts-runtime-api/std", - "pallet-proxy/std", - "pallet-session/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-uniques/std", - "pallet-utility/std", - "pallet-xcm/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "westend-runtime-constants/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "pallet-collator-selection/std", - "parachain-info/std", - "parachains-common/std", - "assets-common/std", - "substrate-wasm-builder", -] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/build.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/constants.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/constants.rs deleted file mode 100644 index e3e2dff1db9b..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/constants.rs +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod currency { - use polkadot_core_primitives::Balance; - use westend_runtime_constants as constants; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - pub const GRAND: Balance = constants::currency::GRAND; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // 1/100 of Westend testnet - constants::currency::deposit(items, bytes) / 100 - } -} - -/// Fee-related. -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Westend, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Asset Hub, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs deleted file mode 100644 index e8b471434e6b..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ /dev/null @@ -1,1493 +0,0 @@ -// Copyright (C) 2021-2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Asset Hub Westend Runtime -//! -//! Testnet for Asset Hub Polkadot. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod constants; -mod weights; -pub mod xcm_config; - -use crate::xcm_config::{ - LocalAndForeignAssetsMultiLocationMatcher, TrustBackedAssetsPalletLocation, -}; -use assets_common::{ - local_and_foreign_assets::{LocalAndForeignAssets, MultiLocationConverter}, - AssetIdForTrustBackedAssetsConvert, -}; -use codec::{Decode, Encode, MaxEncodedLen}; -use constants::{currency::*, fee::WeightToFee}; -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - ord_parameter_types, parameter_types, - traits::{ - tokens::nonfungibles_v2::Inspect, AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, - ConstU64, ConstU8, InstanceFilter, - }, - weights::{ConstantMultiplier, Weight}, - BoundedVec, PalletId, RuntimeDebug, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, EnsureSigned, EnsureSignedBy, -}; -use pallet_asset_conversion_tx_payment::AssetConversionAdapter; -use pallet_nfts::PalletFeatures; -pub use parachains_common as common; -use parachains_common::{ - impls::DealWithFees, AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, BlockNumber, - Hash, Header, Nonce, Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, - NORMAL_DISPATCH_RATIO, SLOT_DURATION, -}; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdConversion, AccountIdLookup, BlakeTwo256, Block as BlockT, Verify}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, Permill, -}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; -use xcm::opaque::v3::MultiLocation; -use xcm_config::{ - ForeignAssetsConvertedConcreteId, PoolAssetsConvertedConcreteId, - TrustBackedAssetsConvertedConcreteId, WestendLocation, XcmConfig, - XcmOriginToTransactDispatchOrigin, -}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -use assets_common::{ - foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, -}; -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm_executor::XcmExecutor; - -use crate::xcm_config::ForeignCreatorsSovereignAccountOf; -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - // Note: "westmint" is the legacy name for this chain. It has been renamed to - // "asset-hub-westend". Many wallets/tools depend on the `spec_name`, so it remains "westmint" - // for the time being. Wallets/tools should update to treat "asset-hub-westend" equally. - spec_name: create_runtime_str!("westmint"), - impl_name: create_runtime_str!("westmint"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 13, - state_version: 0, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 42; -} - -// Configure FRAME pallets to include in runtime. -impl frame_system::Config for Runtime { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type AccountId = AccountId; - type RuntimeCall = RuntimeCall; - type Lookup = AccountIdLookup; - type Nonce = Nonce; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type BlockHashCount = BlockHashCount; - type DbWeight = RocksDbWeight; - type Version = Version; - type PalletInfo = PalletInfo; - type OnNewAccount = (); - type OnKilledAccount = (); - type AccountData = pallet_balances::AccountData; - type SystemWeightInfo = weights::frame_system::WeightInfo; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - // We allow each account to have holds on it from: - // - `NftFractionalization`: 1 - type MaxHolds = ConstU32<1>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -parameter_types! { - pub const AssetDeposit: Balance = UNITS / 10; // 1 / 10 WND deposit to create asset - pub const AssetAccountDeposit: Balance = deposit(1, 16); - pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; - pub const AssetsStringLimit: u32 = 50; - /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) - // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 - pub const MetadataDepositBase: Balance = deposit(1, 68); - pub const MetadataDepositPerByte: Balance = deposit(0, 1); -} - -pub type AssetsForceOrigin = EnsureRoot; - -// Called "Trust Backed" assets because these are generally registered by some account, and users of -// the asset assume it has some claimed backing. The pallet is called `Assets` in -// `construct_runtime` to avoid breaking changes on storage reads. -pub type TrustBackedAssetsInstance = pallet_assets::Instance1; -type TrustBackedAssetsCall = pallet_assets::Call; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = AssetIdForTrustBackedAssets; - type AssetIdParameter = codec::Compact; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_local::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; - type RemoveItemsLimit = ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); - pub storage AllowMultiAssetPools: bool = false; - // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero - pub storage LiquidityWithdrawalFee: Permill = Permill::from_percent(0); -} - -ord_parameter_types! { - pub const AssetConversionOrigin: sp_runtime::AccountId32 = AccountIdConversion::::into_account_truncating(&AssetConversionPalletId::get()); -} - -pub type PoolAssetsInstance = pallet_assets::Instance3; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type RemoveItemsLimit = ConstU32<1000>; - type AssetId = u32; - type AssetIdParameter = u32; - type Currency = Balances; - type CreateOrigin = - AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = ConstU128<0>; - type AssetAccountDeposit = ConstU128<0>; - type MetadataDepositBase = ConstU128<0>; - type MetadataDepositPerByte = ConstU128<0>; - type ApprovalDeposit = ConstU128<0>; - type StringLimit = ConstU32<50>; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_pool::WeightInfo; - type CallbackHandle = (); - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -impl pallet_asset_conversion::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type HigherPrecisionBalance = sp_core::U256; - type Currency = Balances; - type AssetBalance = Balance; - type AssetId = MultiLocation; - type Assets = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, - >; - type PoolAssets = PoolAssets; - type PoolAssetId = u32; - type PoolSetupFee = ConstU128<0>; // Asset class deposit fees are sufficient to prevent spam - type PoolSetupFeeReceiver = AssetConversionOrigin; - type LiquidityWithdrawalFee = LiquidityWithdrawalFee; // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero. - type LPFee = ConstU32<3>; - type PalletId = AssetConversionPalletId; - type AllowMultiAssetPools = AllowMultiAssetPools; - type MaxSwapPathLength = ConstU32<4>; - type MultiAssetId = Box; - type MultiAssetIdConverter = - MultiLocationConverter; - type MintMinLiquidity = ConstU128<100>; - type WeightInfo = weights::pallet_asset_conversion::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = - crate::xcm_config::BenchmarkMultiLocationConverter>; -} - -parameter_types! { - // we just reuse the same deposits - pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); - pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); - pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); - pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); - pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); - pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); -} - -/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as -/// this type is used in proxy definitions. We assume that a foreign location would not want to set -/// an individual, local account as a proxy for the issuance of their assets. This issuance should -/// be managed by the foreign location's governance. -pub type ForeignAssetsInstance = pallet_assets::Instance2; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = MultiLocationForAssetId; - type AssetIdParameter = MultiLocationForAssetId; - type Currency = Balances; - type CreateOrigin = ForeignCreators< - (FromSiblingParachain>,), - ForeignCreatorsSovereignAccountOf, - AccountId, - >; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = ForeignAssetsAssetDeposit; - type MetadataDepositBase = ForeignAssetsMetadataDepositBase; - type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; - type ApprovalDeposit = ForeignAssetsApprovalDeposit; - type StringLimit = ForeignAssetsAssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_foreign::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); - pub const MaxSignatories: u32 = 100; -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = MaxSignatories; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -parameter_types! { - // One storage item; key size 32, value size 8; . - pub const ProxyDepositBase: Balance = deposit(1, 40); - // Additional storage item size of 33 bytes. - pub const ProxyDepositFactor: Balance = deposit(0, 33); - pub const MaxProxies: u16 = 32; - // One storage item; key size 32, value size 16 - pub const AnnouncementDepositBase: Balance = deposit(1, 48); - pub const AnnouncementDepositFactor: Balance = deposit(0, 66); - pub const MaxPending: u16 = 32; -} - -/// The type used to represent the kinds of proxying allowed. -#[derive( - Copy, - Clone, - Eq, - PartialEq, - Ord, - PartialOrd, - Encode, - Decode, - RuntimeDebug, - MaxEncodedLen, - scale_info::TypeInfo, -)] -pub enum ProxyType { - /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. - Any, - /// Can execute any call that does not transfer funds or assets. - NonTransfer, - /// Proxy with the ability to reject time-delay proxy announcements. - CancelProxy, - /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. - Assets, - /// Owner proxy. Can execute calls related to asset ownership. - AssetOwner, - /// Asset manager. Can execute calls related to asset management. - AssetManager, - /// Collator selection proxy. Can execute calls related to collator selection mechanism. - Collator, -} -impl Default for ProxyType { - fn default() -> Self { - Self::Any - } -} - -impl InstanceFilter for ProxyType { - fn filter(&self, c: &RuntimeCall) -> bool { - match self { - ProxyType::Any => true, - ProxyType::NonTransfer => !matches!( - c, - RuntimeCall::Balances { .. } | - RuntimeCall::Assets { .. } | - RuntimeCall::NftFractionalization { .. } | - RuntimeCall::Nfts { .. } | - RuntimeCall::Uniques { .. } - ), - ProxyType::CancelProxy => matches!( - c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Assets => { - matches!( - c, - RuntimeCall::Assets { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } | - RuntimeCall::NftFractionalization { .. } | - RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } - ) - }, - ProxyType::AssetOwner => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::start_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_accounts { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_approvals { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::finish_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_min_balance { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::create { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::destroy { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::redeposit { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::transfer_ownership { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_team { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_max_supply { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_team { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_max_supply { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::AssetManager => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::block { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::touch_other { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::refund_other { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::force_mint { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::update_mint_settings { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::mint_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_attributes_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::unlock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_properties { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw_collection { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Collator => matches!( - c, - RuntimeCall::CollatorSelection { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - } - } - - fn is_superset(&self, o: &Self) -> bool { - match (self, o) { - (x, y) if x == y => true, - (ProxyType::Any, _) => true, - (_, ProxyType::Any) => false, - (ProxyType::Assets, ProxyType::AssetOwner) => true, - (ProxyType::Assets, ProxyType::AssetManager) => true, - (ProxyType::NonTransfer, ProxyType::Collator) => true, - _ => false, - } - } -} - -impl pallet_proxy::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type ProxyType = ProxyType; - type ProxyDepositBase = ProxyDepositBase; - type ProxyDepositFactor = ProxyDepositFactor; - type MaxProxies = MaxProxies; - type WeightInfo = weights::pallet_proxy::WeightInfo; - type MaxPending = MaxPending; - type CallHasher = BlakeTwo256; - type AnnouncementDepositBase = AnnouncementDepositBase; - type AnnouncementDepositFactor = AnnouncementDepositFactor; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type OutboundXcmpMessageSource = XcmpQueue; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EnsureRoot; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; -} - -pub type CollatorSelectionUpdateOrigin = EnsureRoot; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -impl pallet_asset_conversion_tx_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Fungibles = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, - >; - type OnChargeAssetTransaction = AssetConversionAdapter; -} - -parameter_types! { - pub const UniquesCollectionDeposit: Balance = UNITS / 10; // 1 / 10 UNIT deposit to create a collection - pub const UniquesItemDeposit: Balance = UNITS / 1_000; // 1 / 1000 UNIT deposit to mint an item - pub const UniquesMetadataDepositBase: Balance = deposit(1, 129); - pub const UniquesAttributeDepositBase: Balance = deposit(1, 0); - pub const UniquesDepositPerByte: Balance = deposit(0, 1); -} - -impl pallet_uniques::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type ForceOrigin = AssetsForceOrigin; - type CollectionDeposit = UniquesCollectionDeposit; - type ItemDeposit = UniquesItemDeposit; - type MetadataDepositBase = UniquesMetadataDepositBase; - type AttributeDepositBase = UniquesAttributeDepositBase; - type DepositPerByte = UniquesDepositPerByte; - type StringLimit = ConstU32<128>; - type KeyLimit = ConstU32<32>; - type ValueLimit = ConstU32<64>; - type WeightInfo = weights::pallet_uniques::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); - type CreateOrigin = AsEnsureOriginWithArg>; - type Locker = (); -} - -parameter_types! { - pub const NftFractionalizationPalletId: PalletId = PalletId(*b"fraction"); - pub NewAssetSymbol: BoundedVec = (*b"FRAC").to_vec().try_into().unwrap(); - pub NewAssetName: BoundedVec = (*b"Frac").to_vec().try_into().unwrap(); -} - -impl pallet_nft_fractionalization::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Deposit = AssetDeposit; - type Currency = Balances; - type NewAssetSymbol = NewAssetSymbol; - type NewAssetName = NewAssetName; - type StringLimit = AssetsStringLimit; - type NftCollectionId = ::CollectionId; - type NftId = ::ItemId; - type AssetBalance = ::Balance; - type AssetId = >::AssetId; - type Assets = Assets; - type Nfts = Nfts; - type PalletId = NftFractionalizationPalletId; - type WeightInfo = pallet_nft_fractionalization::weights::SubstrateWeight; - type RuntimeHoldReason = RuntimeHoldReason; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - pub NftsPalletFeatures: PalletFeatures = PalletFeatures::all_enabled(); - pub const NftsMaxDeadlineDuration: BlockNumber = 12 * 30 * DAYS; - // re-use the Uniques deposits - pub const NftsCollectionDeposit: Balance = UniquesCollectionDeposit::get(); - pub const NftsItemDeposit: Balance = UniquesItemDeposit::get(); - pub const NftsMetadataDepositBase: Balance = UniquesMetadataDepositBase::get(); - pub const NftsAttributeDepositBase: Balance = UniquesAttributeDepositBase::get(); - pub const NftsDepositPerByte: Balance = UniquesDepositPerByte::get(); -} - -impl pallet_nfts::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type Locker = (); - type CollectionDeposit = NftsCollectionDeposit; - type ItemDeposit = NftsItemDeposit; - type MetadataDepositBase = NftsMetadataDepositBase; - type AttributeDepositBase = NftsAttributeDepositBase; - type DepositPerByte = NftsDepositPerByte; - type StringLimit = ConstU32<256>; - type KeyLimit = ConstU32<64>; - type ValueLimit = ConstU32<256>; - type ApprovalsLimit = ConstU32<20>; - type ItemAttributesApprovalsLimit = ConstU32<30>; - type MaxTips = ConstU32<10>; - type MaxDeadlineDuration = NftsMaxDeadlineDuration; - type MaxAttributesPerCall = ConstU32<10>; - type Features = NftsPalletFeatures; - type OffchainSignature = Signature; - type OffchainPublic = ::Signer; - type WeightInfo = weights::pallet_nfts::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - // RandomnessCollectiveFlip = 2 removed - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - // AssetTxPayment: pallet_asset_tx_payment::{Pallet, Event} = 12, - AssetTxPayment: pallet_asset_conversion_tx_payment::{Pallet, Event} = 13, - - // Collator support. the order of these 5 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, - Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, - - // The main stage. - Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, - Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, - Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, - ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, - NftFractionalization: pallet_nft_fractionalization::{Pallet, Call, Storage, Event, HoldReason} = 54, - PoolAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 55, - AssetConversion: pallet_asset_conversion::{Pallet, Call, Storage, Event} = 56, - } -); - -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_asset_conversion_tx_payment::ChargeAssetTxPayment, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Migrations to apply on runtime upgrade. -pub type Migrations = ( - // v9420 - pallet_nfts::migration::v1::MigrateToV1, - // unreleased - pallet_collator_selection::migration::v1::MigrateToV1, - // unreleased - migrations::NativeAssetParents0ToParents1Migration, -); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_assets, Local] - [pallet_assets, Foreign] - [pallet_assets, Pool] - [pallet_asset_conversion, AssetConversion] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_nft_fractionalization, NftFractionalization] - [pallet_nfts, Nfts] - [pallet_proxy, Proxy] - [pallet_session, SessionBench::] - [pallet_uniques, Uniques] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - // XCM - [pallet_xcm, PolkadotXcm] - // NOTE: Make sure you point to the individual modules below. - [pallet_xcm_benchmarks::fungible, XcmBalances] - [pallet_xcm_benchmarks::generic, XcmGeneric] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_nfts_runtime_api::NftsApi for Runtime { - fn owner(collection: u32, item: u32) -> Option { - >::owner(&collection, &item) - } - - fn collection_owner(collection: u32) -> Option { - >::collection_owner(&collection) - } - - fn attribute( - collection: u32, - item: u32, - key: Vec, - ) -> Option> { - >::attribute(&collection, &item, &key) - } - - fn custom_attribute( - account: AccountId, - collection: u32, - item: u32, - key: Vec, - ) -> Option> { - >::custom_attribute( - &account, - &collection, - &item, - &key, - ) - } - - fn system_attribute( - collection: u32, - item: u32, - key: Vec, - ) -> Option> { - >::system_attribute(&collection, &item, &key) - } - - fn collection_attribute(collection: u32, key: Vec) -> Option> { - >::collection_attribute(&collection, &key) - } - } - - impl pallet_asset_conversion::AssetConversionApi< - Block, - Balance, - u128, - Box, - > for Runtime - { - fn quote_price_exact_tokens_for_tokens(asset1: Box, asset2: Box, amount: u128, include_fee: bool) -> Option { - AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) - } - - fn quote_price_tokens_for_exact_tokens(asset1: Box, asset2: Box, amount: u128, include_fee: bool) -> Option { - AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) - } - - fn get_reserves(asset1: Box, asset2: Box) -> Option<(Balance, Balance)> { - AssetConversion::get_reserves(&asset1, &asset2).ok() - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl assets_common::runtime_api::FungiblesApi< - Block, - AccountId, - > for Runtime - { - fn query_account_balances(account: AccountId) -> Result { - use assets_common::fungible_conversion::{convert, convert_balance}; - Ok([ - // collect pallet_balance - { - let balance = Balances::free_balance(account.clone()); - if balance > 0 { - vec![convert_balance::(balance)?] - } else { - vec![] - } - }, - // collect pallet_assets (TrustBackedAssets) - convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( - Assets::account_balances(account.clone()) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect pallet_assets (ForeignAssets) - convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( - ForeignAssets::account_balances(account.clone()) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect pallet_assets (PoolAssets) - convert::<_, _, _, _, PoolAssetsConvertedConcreteId>( - PoolAssets::account_balances(account) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect ... e.g. other tokens - ].concat().into()) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - // This is defined once again in dispatch_benchmark, because list_benchmarks! - // and add_benchmarks! are macros exported by define_benchmarks! macros and those types - // are referenced in that call. - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - // Benchmark files generated for `Assets/ForeignAssets` instances are by default - // `pallet_assets_assets.rs / pallet_assets_foreign_assets`, which is not really nice, - // so with this redefinition we can change names to nicer: - // `pallet_assets_local.rs / pallet_assets_foreign.rs`. - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - type Pool = pallet_assets::Pallet::; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, TrackedStorageKey, BenchmarkError}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use xcm::latest::prelude::*; - use xcm_config::{MaxAssetsIntoHolding, WestendLocation}; - use pallet_xcm_benchmarks::asset_instance_from; - - impl pallet_xcm_benchmarks::Config for Runtime { - type XcmConfig = xcm_config::XcmConfig; - type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { - Ok(WestendLocation::get()) - } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { - // A mix of fungible, non-fungible, and concrete assets. - let holding_non_fungibles = MaxAssetsIntoHolding::get() / 2 - depositable_count; - let holding_fungibles = holding_non_fungibles - 1; - let fungibles_amount: u128 = 100; - let mut assets = (0..holding_fungibles) - .map(|i| { - MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: Fungible(fungibles_amount * i as u128), - } - }) - .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) - .chain((0..holding_non_fungibles).map(|i| MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: NonFungible(asset_instance_from(i)), - })) - .collect::>(); - - assets.push(MultiAsset { - id: Concrete(WestendLocation::get()), - fun: Fungible(1_000_000 * UNITS), - }); - assets.into() - } - } - - parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - WestendLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(WestendLocation::get()) }, - )); - pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; - } - - impl pallet_xcm_benchmarks::fungible::Config for Runtime { - type TransactAsset = Balances; - - type CheckedAccount = CheckedAccount; - type TrustedTeleporter = TrustedTeleporter; - type TrustedReserve = TrustedReserve; - - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(WestendLocation::get()), - fun: Fungible(UNITS), - } - } - } - - impl pallet_xcm_benchmarks::generic::Config for Runtime { - type RuntimeCall = RuntimeCall; - - fn worst_case_response() -> (u64, Response) { - (0u64, Response::Version(Default::default())) - } - - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((WestendLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) - } - - fn subscribe_origin() -> Result { - Ok(WestendLocation::get()) - } - - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = WestendLocation::get(); - let assets: MultiAssets = (Concrete(WestendLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; - Ok((origin, ticket, assets)) - } - - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - } - - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - type Pool = pallet_assets::Pallet::; - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - //TODO: use from relay_well_known_keys::ACTIVE_CONFIG - hex_literal::hex!("06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} - -pub mod migrations { - use super::*; - use frame_support::{ - pallet_prelude::Get, - traits::{ - fungibles::{Inspect, Mutate}, - tokens::Preservation, - OnRuntimeUpgrade, OriginTrait, - }, - }; - use parachains_common::impls::AccountIdOf; - use sp_runtime::{traits::StaticLookup, Saturating}; - use xcm::latest::prelude::*; - - /// Temporary migration because of bug with native asset, it can be removed once applied on - /// `AssetHubWestend`. Migrates pools with `MultiLocation { parents: 0, interior: Here }` to - /// `MultiLocation { parents: 1, interior: Here }` - pub struct NativeAssetParents0ToParents1Migration(sp_std::marker::PhantomData); - impl< - T: pallet_asset_conversion::Config< - MultiAssetId = Box, - AssetId = MultiLocation, - >, - > OnRuntimeUpgrade for NativeAssetParents0ToParents1Migration - where - ::PoolAssetId: Into, - AccountIdOf: Into<[u8; 32]>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - sp_runtime::AccountId32: From<::AccountId>, - { - fn on_runtime_upgrade() -> Weight { - let invalid_native_asset = MultiLocation { parents: 0, interior: Here }; - let valid_native_asset = WestendLocation::get(); - - let mut reads: u64 = 1; - let mut writes: u64 = 0; - - // migrate pools with invalid native asset - let pools = pallet_asset_conversion::Pools::::iter().collect::>(); - reads.saturating_accrue(1); - for (old_pool_id, pool_info) in pools { - let old_pool_account = - pallet_asset_conversion::Pallet::::get_pool_account(&old_pool_id); - reads.saturating_accrue(1); - let pool_asset_id = pool_info.lp_token.clone(); - if old_pool_id.0.as_ref() != &invalid_native_asset { - // skip, if ok - continue - } - - // fix new account - let new_pool_id = pallet_asset_conversion::Pallet::::get_pool_id( - Box::new(valid_native_asset), - old_pool_id.1.clone(), - ); - let new_pool_account = - pallet_asset_conversion::Pallet::::get_pool_account(&new_pool_id); - frame_system::Pallet::::inc_providers(&new_pool_account); - reads.saturating_accrue(2); - writes.saturating_accrue(1); - - // move currency - let _ = Balances::transfer_all( - RuntimeOrigin::signed(sp_runtime::AccountId32::from(old_pool_account.clone())), - sp_runtime::AccountId32::from(new_pool_account.clone()).into(), - false, - ); - reads.saturating_accrue(2); - writes.saturating_accrue(2); - - // move LP token - let _ = T::PoolAssets::transfer( - pool_asset_id.clone(), - &old_pool_account, - &new_pool_account, - T::PoolAssets::balance(pool_asset_id.clone(), &old_pool_account), - Preservation::Expendable, - ); - reads.saturating_accrue(1); - writes.saturating_accrue(2); - - // change the ownership of LP token - let _ = pallet_assets::Pallet::::transfer_ownership( - RuntimeOrigin::signed(sp_runtime::AccountId32::from(old_pool_account.clone())), - pool_asset_id.into(), - sp_runtime::AccountId32::from(new_pool_account.clone()).into(), - ); - reads.saturating_accrue(1); - writes.saturating_accrue(2); - - // move LocalOrForeignAssets - let _ = T::Assets::transfer( - *old_pool_id.1.as_ref(), - &old_pool_account, - &new_pool_account, - T::Assets::balance(*old_pool_id.1.as_ref(), &old_pool_account), - Preservation::Expendable, - ); - reads.saturating_accrue(1); - writes.saturating_accrue(2); - - // dec providers for old account - let _ = frame_system::Pallet::::dec_providers(&old_pool_account); - writes.saturating_accrue(1); - - // change pool key - pallet_asset_conversion::Pools::::insert(new_pool_id, pool_info); - pallet_asset_conversion::Pools::::remove(old_pool_id); - } - - T::DbWeight::get().reads_writes(reads, writes) - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/block_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs deleted file mode 100644 index 55ddfea38d15..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/cumulus_pallet_xcmp_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `cumulus_pallet_xcmp_queue` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=cumulus_pallet_xcmp_queue -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `cumulus_pallet_xcmp_queue`. -pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_109_000 picoseconds. - Weight::from_parts(5_324_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_183_000 picoseconds. - Weight::from_parts(5_408_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs deleted file mode 100644 index 9ec9befa97c9..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_105_000 picoseconds. - Weight::from_parts(2_139_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(388, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_540_000 picoseconds. - Weight::from_parts(7_767_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2 - .saturating_add(Weight::from_parts(1_730, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_980_000 picoseconds. - Weight::from_parts(4_120_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `156` - // Estimated: `1641` - // Minimum execution time: 102_511_794_000 picoseconds. - Weight::from_parts(105_688_965_000, 0) - .saturating_add(Weight::from_parts(0, 1641)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_241_000 picoseconds. - Weight::from_parts(2_329_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_336 - .saturating_add(Weight::from_parts(756_084, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_233_000 picoseconds. - Weight::from_parts(2_295_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 990 - .saturating_add(Weight::from_parts(573_213, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `83 + p * (69 ±0)` - // Estimated: `86 + p * (70 ±0)` - // Minimum execution time: 3_990_000 picoseconds. - Weight::from_parts(4_110_000, 0) - .saturating_add(Weight::from_parts(0, 86)) - // Standard Error: 1_782 - .saturating_add(Weight::from_parts(1_220_573, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs deleted file mode 100644 index 955d4690634e..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub mod block_weights; -pub mod cumulus_pallet_xcmp_queue; -pub mod extrinsic_weights; -pub mod frame_system; -pub mod pallet_asset_conversion; -pub mod pallet_assets_foreign; -pub mod pallet_assets_local; -pub mod pallet_assets_pool; -pub mod pallet_balances; -pub mod pallet_collator_selection; -pub mod pallet_multisig; -pub mod pallet_nft_fractionalization; -pub mod pallet_nfts; -pub mod pallet_proxy; -pub mod pallet_session; -pub mod pallet_timestamp; -pub mod pallet_uniques; -pub mod pallet_utility; -pub mod pallet_xcm; -pub mod paritydb_weights; -pub mod rocksdb_weights; -pub mod xcm; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs deleted file mode 100644 index 1744fcbe3977..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_asset_conversion` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_asset_conversion -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_asset_conversion`. -pub struct WeightInfo(PhantomData); -impl pallet_asset_conversion::WeightInfo for WeightInfo { - /// Storage: `AssetConversion::Pools` (r:1 w:1) - /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x76a2c49709deec21d9c05f96c1f47351` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x76a2c49709deec21d9c05f96c1f47351` (r:1 w:0) - /// Storage: `System::Account` (r:2 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `AssetConversion::NextPoolAssetId` (r:1 w:1) - /// Proof: `AssetConversion::NextPoolAssetId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn create_pool() -> Weight { - // Proof Size summary in bytes: - // Measured: `480` - // Estimated: `6196` - // Minimum execution time: 90_011_000 picoseconds. - Weight::from_parts(92_372_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(7)) - } - /// Storage: `AssetConversion::Pools` (r:1 w:0) - /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:2 w:2) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn add_liquidity() -> Weight { - // Proof Size summary in bytes: - // Measured: `1117` - // Estimated: `7404` - // Minimum execution time: 153_484_000 picoseconds. - Weight::from_parts(155_465_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(7)) - } - /// Storage: `AssetConversion::Pools` (r:1 w:0) - /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x2433d831722b1f4aeb1666953f1c0e77` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x2433d831722b1f4aeb1666953f1c0e77` (r:1 w:0) - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn remove_liquidity() -> Weight { - // Proof Size summary in bytes: - // Measured: `1106` - // Estimated: `7404` - // Minimum execution time: 141_326_000 picoseconds. - Weight::from_parts(143_882_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(6)) - } - /// Storage: `ForeignAssets::Asset` (r:2 w:2) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:4 w:4) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn swap_exact_tokens_for_tokens() -> Weight { - // Proof Size summary in bytes: - // Measured: `1148` - // Estimated: `13818` - // Minimum execution time: 168_556_000 picoseconds. - Weight::from_parts(170_313_000, 0) - .saturating_add(Weight::from_parts(0, 13818)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:2 w:2) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:4 w:4) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn swap_tokens_for_exact_tokens() -> Weight { - // Proof Size summary in bytes: - // Measured: `1148` - // Estimated: `13818` - // Minimum execution time: 167_704_000 picoseconds. - Weight::from_parts(170_034_000, 0) - .saturating_add(Weight::from_parts(0, 13818)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_foreign.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_foreign.rs deleted file mode 100644 index 5deffe235cc2..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_foreign.rs +++ /dev/null @@ -1,541 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_assets` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_assets -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_assets`. -pub struct WeightInfo(PhantomData); -impl pallet_assets::WeightInfo for WeightInfo { - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `4273` - // Minimum execution time: 29_123_000 picoseconds. - Weight::from_parts(30_025_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `4` - // Estimated: `4273` - // Minimum execution time: 11_857_000 picoseconds. - Weight::from_parts(12_256_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn start_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 14_513_000 picoseconds. - Weight::from_parts(15_110_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1001 w:1000) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1000 w:1000) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - fn destroy_accounts(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + c * (208 ±0)` - // Estimated: `4273 + c * (3207 ±0)` - // Minimum execution time: 17_168_000 picoseconds. - Weight::from_parts(17_732_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 8_406 - .saturating_add(Weight::from_parts(15_274_700, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 3207).saturating_mul(c.into())) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1001 w:1000) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy_approvals(a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `413 + a * (86 ±0)` - // Estimated: `4273 + a * (3221 ±0)` - // Minimum execution time: 18_111_000 picoseconds. - Weight::from_parts(18_573_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 3_988 - .saturating_add(Weight::from_parts(15_270_030, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 3221).saturating_mul(a.into())) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:0) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn finish_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 14_768_000 picoseconds. - Weight::from_parts(15_323_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 25_855_000 picoseconds. - Weight::from_parts(26_592_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 33_065_000 picoseconds. - Weight::from_parts(34_113_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 45_409_000 picoseconds. - Weight::from_parts(46_176_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 40_017_000 picoseconds. - Weight::from_parts(41_081_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `7404` - // Minimum execution time: 45_189_000 picoseconds. - Weight::from_parts(46_133_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 18_147_000 picoseconds. - Weight::from_parts(18_923_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 17_801_000 picoseconds. - Weight::from_parts(18_472_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn freeze_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 14_204_000 picoseconds. - Weight::from_parts(14_671_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn thaw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 13_752_000 picoseconds. - Weight::from_parts(14_380_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:0) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 15_310_000 picoseconds. - Weight::from_parts(15_761_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 13_656_000 picoseconds. - Weight::from_parts(14_121_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 28_413_000 picoseconds. - Weight::from_parts(29_399_881, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 369 - .saturating_add(Weight::from_parts(5_400, 0).saturating_mul(n.into())) - // Standard Error: 369 - .saturating_add(Weight::from_parts(3_525, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `406` - // Estimated: `4273` - // Minimum execution time: 29_660_000 picoseconds. - Weight::from_parts(30_281_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `81` - // Estimated: `4273` - // Minimum execution time: 12_949_000 picoseconds. - Weight::from_parts(13_813_061, 0) - .saturating_add(Weight::from_parts(0, 4273)) - // Standard Error: 229 - .saturating_add(Weight::from_parts(480, 0).saturating_mul(n.into())) - // Standard Error: 229 - .saturating_add(Weight::from_parts(94, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Metadata` (r:1 w:1) - /// Proof: `ForeignAssets::Metadata` (`max_values`: None, `max_size`: Some(738), added: 3213, mode: `MaxEncodedLen`) - fn force_clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `406` - // Estimated: `4273` - // Minimum execution time: 29_002_000 picoseconds. - Weight::from_parts(29_772_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn force_asset_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 13_023_000 picoseconds. - Weight::from_parts(13_528_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `4273` - // Minimum execution time: 32_393_000 picoseconds. - Weight::from_parts(33_164_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:2 w:2) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `520` - // Estimated: `7404` - // Minimum execution time: 64_647_000 picoseconds. - Weight::from_parts(65_669_000, 0) - .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `446` - // Estimated: `4273` - // Minimum execution time: 34_292_000 picoseconds. - Weight::from_parts(35_505_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Approvals` (r:1 w:1) - /// Proof: `ForeignAssets::Approvals` (`max_values`: None, `max_size`: Some(746), added: 3221, mode: `MaxEncodedLen`) - fn force_cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `446` - // Estimated: `4273` - // Minimum execution time: 35_358_000 picoseconds. - Weight::from_parts(36_553_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn set_min_balance() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 14_656_000 picoseconds. - Weight::from_parts(15_097_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn touch() -> Weight { - // Proof Size summary in bytes: - // Measured: `345` - // Estimated: `4273` - // Minimum execution time: 33_758_000 picoseconds. - Weight::from_parts(34_618_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn touch_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `4273` - // Minimum execution time: 32_205_000 picoseconds. - Weight::from_parts(33_208_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn refund() -> Weight { - // Proof Size summary in bytes: - // Measured: `471` - // Estimated: `4273` - // Minimum execution time: 30_848_000 picoseconds. - Weight::from_parts(31_592_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Asset` (r:1 w:1) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - fn refund_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `401` - // Estimated: `4273` - // Minimum execution time: 28_920_000 picoseconds. - Weight::from_parts(29_519_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ForeignAssets::Asset` (r:1 w:0) - /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) - /// Storage: `ForeignAssets::Account` (r:1 w:1) - /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn block() -> Weight { - // Proof Size summary in bytes: - // Measured: `350` - // Estimated: `4273` - // Minimum execution time: 17_938_000 picoseconds. - Weight::from_parts(18_525_000, 0) - .saturating_add(Weight::from_parts(0, 4273)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_local.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_local.rs deleted file mode 100644 index 15f4fdecbd2f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_local.rs +++ /dev/null @@ -1,539 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_assets` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_assets -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_assets`. -pub struct WeightInfo(PhantomData); -impl pallet_assets::WeightInfo for WeightInfo { - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3675` - // Minimum execution time: 25_894_000 picoseconds. - Weight::from_parts(26_675_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3675` - // Minimum execution time: 10_155_000 picoseconds. - Weight::from_parts(10_864_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn start_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 12_904_000 picoseconds. - Weight::from_parts(13_723_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1001 w:1000) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1000 w:1000) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - fn destroy_accounts(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + c * (208 ±0)` - // Estimated: `3675 + c * (2609 ±0)` - // Minimum execution time: 15_522_000 picoseconds. - Weight::from_parts(16_015_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 7_984 - .saturating_add(Weight::from_parts(15_024_602, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2609).saturating_mul(c.into())) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1001 w:1000) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy_approvals(a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `414 + a * (86 ±0)` - // Estimated: `3675 + a * (2623 ±0)` - // Minimum execution time: 16_570_000 picoseconds. - Weight::from_parts(16_940_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 4_030 - .saturating_add(Weight::from_parts(15_317_878, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2623).saturating_mul(a.into())) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:0) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn finish_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 13_327_000 picoseconds. - Weight::from_parts(13_909_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 23_662_000 picoseconds. - Weight::from_parts(24_510_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 30_903_000 picoseconds. - Weight::from_parts(31_725_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 42_163_000 picoseconds. - Weight::from_parts(43_176_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 36_812_000 picoseconds. - Weight::from_parts(37_836_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `6208` - // Minimum execution time: 41_923_000 picoseconds. - Weight::from_parts(43_200_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_567_000 picoseconds. - Weight::from_parts(17_125_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_271_000 picoseconds. - Weight::from_parts(17_116_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn freeze_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 12_772_000 picoseconds. - Weight::from_parts(13_267_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn thaw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 12_477_000 picoseconds. - Weight::from_parts(13_110_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:0) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 13_857_000 picoseconds. - Weight::from_parts(14_270_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 12_844_000 picoseconds. - Weight::from_parts(13_215_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 27_149_000 picoseconds. - Weight::from_parts(28_147_817, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 410 - .saturating_add(Weight::from_parts(3_935, 0).saturating_mul(n.into())) - // Standard Error: 410 - .saturating_add(Weight::from_parts(2_686, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `407` - // Estimated: `3675` - // Minimum execution time: 27_866_000 picoseconds. - Weight::from_parts(28_735_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `82` - // Estimated: `3675` - // Minimum execution time: 11_877_000 picoseconds. - Weight::from_parts(12_700_940, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 219 - .saturating_add(Weight::from_parts(253, 0).saturating_mul(n.into())) - // Standard Error: 219 - .saturating_add(Weight::from_parts(1_004, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn force_clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `407` - // Estimated: `3675` - // Minimum execution time: 27_536_000 picoseconds. - Weight::from_parts(28_635_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_asset_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 12_010_000 picoseconds. - Weight::from_parts(12_526_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `277` - // Estimated: `3675` - // Minimum execution time: 30_436_000 picoseconds. - Weight::from_parts(31_420_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `521` - // Estimated: `6208` - // Minimum execution time: 60_189_000 picoseconds. - Weight::from_parts(61_948_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3675` - // Minimum execution time: 33_033_000 picoseconds. - Weight::from_parts(33_710_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Approvals` (r:1 w:1) - /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn force_cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `447` - // Estimated: `3675` - // Minimum execution time: 33_121_000 picoseconds. - Weight::from_parts(34_112_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_min_balance() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 12_994_000 picoseconds. - Weight::from_parts(13_442_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn touch() -> Weight { - // Proof Size summary in bytes: - // Measured: `346` - // Estimated: `3675` - // Minimum execution time: 31_950_000 picoseconds. - Weight::from_parts(32_750_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn touch_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `243` - // Estimated: `3675` - // Minimum execution time: 29_976_000 picoseconds. - Weight::from_parts(31_186_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn refund() -> Weight { - // Proof Size summary in bytes: - // Measured: `472` - // Estimated: `3675` - // Minimum execution time: 29_549_000 picoseconds. - Weight::from_parts(30_533_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn refund_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `402` - // Estimated: `3675` - // Minimum execution time: 27_746_000 picoseconds. - Weight::from_parts(28_561_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Assets::Asset` (r:1 w:0) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn block() -> Weight { - // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3675` - // Minimum execution time: 16_408_000 picoseconds. - Weight::from_parts(17_038_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_pool.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_pool.rs deleted file mode 100644 index 6101141e3ae1..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_assets_pool.rs +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_assets` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_assets -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_assets`. -pub struct WeightInfo(PhantomData); -impl pallet_assets::WeightInfo for WeightInfo { - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3675` - // Minimum execution time: 11_148_000 picoseconds. - Weight::from_parts(11_683_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3675` - // Minimum execution time: 10_811_000 picoseconds. - Weight::from_parts(11_324_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn start_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `3675` - // Minimum execution time: 13_360_000 picoseconds. - Weight::from_parts(13_961_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:1001 w:1000) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1000 w:1000) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - fn destroy_accounts(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + c * (208 ±0)` - // Estimated: `3675 + c * (2609 ±0)` - // Minimum execution time: 16_162_000 picoseconds. - Weight::from_parts(16_588_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 8_120 - .saturating_add(Weight::from_parts(14_997_923, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2609).saturating_mul(c.into())) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Approvals` (r:1001 w:1000) - /// Proof: `PoolAssets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy_approvals(a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `451 + a * (86 ±0)` - // Estimated: `3675 + a * (2623 ±0)` - // Minimum execution time: 17_013_000 picoseconds. - Weight::from_parts(17_433_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 3_595 - .saturating_add(Weight::from_parts(5_514_723, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2623).saturating_mul(a.into())) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Metadata` (r:1 w:0) - /// Proof: `PoolAssets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn finish_destroy() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 13_565_000 picoseconds. - Weight::from_parts(14_080_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 24_156_000 picoseconds. - Weight::from_parts(24_879_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3675` - // Minimum execution time: 31_099_000 picoseconds. - Weight::from_parts(31_804_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:2 w:2) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `6208` - // Minimum execution time: 42_337_000 picoseconds. - Weight::from_parts(43_359_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:2 w:2) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `6208` - // Minimum execution time: 37_216_000 picoseconds. - Weight::from_parts(37_927_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:2 w:2) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `6208` - // Minimum execution time: 42_250_000 picoseconds. - Weight::from_parts(43_145_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:0) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3675` - // Minimum execution time: 16_897_000 picoseconds. - Weight::from_parts(17_424_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:0) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3675` - // Minimum execution time: 16_804_000 picoseconds. - Weight::from_parts(17_335_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn freeze_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `3675` - // Minimum execution time: 13_195_000 picoseconds. - Weight::from_parts(13_531_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn thaw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `3675` - // Minimum execution time: 12_982_000 picoseconds. - Weight::from_parts(13_469_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Metadata` (r:1 w:0) - /// Proof: `PoolAssets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 14_275_000 picoseconds. - Weight::from_parts(14_696_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 12_972_000 picoseconds. - Weight::from_parts(13_459_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:0) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Metadata` (r:1 w:1) - /// Proof: `PoolAssets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 15_092_000 picoseconds. - Weight::from_parts(15_929_556, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 289 - .saturating_add(Weight::from_parts(3_185, 0).saturating_mul(n.into())) - // Standard Error: 289 - .saturating_add(Weight::from_parts(1_709, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:0) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Metadata` (r:1 w:1) - /// Proof: `PoolAssets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `444` - // Estimated: `3675` - // Minimum execution time: 15_711_000 picoseconds. - Weight::from_parts(16_183_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:0) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Metadata` (r:1 w:1) - /// Proof: `PoolAssets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - /// The range of component `n` is `[0, 50]`. - /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(n: u32, s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `119` - // Estimated: `3675` - // Minimum execution time: 13_288_000 picoseconds. - Weight::from_parts(14_061_633, 0) - .saturating_add(Weight::from_parts(0, 3675)) - // Standard Error: 215 - .saturating_add(Weight::from_parts(1_169, 0).saturating_mul(n.into())) - // Standard Error: 215 - .saturating_add(Weight::from_parts(900, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:0) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Metadata` (r:1 w:1) - /// Proof: `PoolAssets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - fn force_clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `444` - // Estimated: `3675` - // Minimum execution time: 15_235_000 picoseconds. - Weight::from_parts(15_998_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn force_asset_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 12_556_000 picoseconds. - Weight::from_parts(13_054_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Approvals` (r:1 w:1) - /// Proof: `PoolAssets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `314` - // Estimated: `3675` - // Minimum execution time: 18_635_000 picoseconds. - Weight::from_parts(19_431_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Approvals` (r:1 w:1) - /// Proof: `PoolAssets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:2 w:2) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `558` - // Estimated: `6208` - // Minimum execution time: 49_082_000 picoseconds. - Weight::from_parts(50_414_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Approvals` (r:1 w:1) - /// Proof: `PoolAssets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `484` - // Estimated: `3675` - // Minimum execution time: 20_978_000 picoseconds. - Weight::from_parts(21_628_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Approvals` (r:1 w:1) - /// Proof: `PoolAssets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) - fn force_cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `484` - // Estimated: `3675` - // Minimum execution time: 21_453_000 picoseconds. - Weight::from_parts(22_134_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn set_min_balance() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 13_390_000 picoseconds. - Weight::from_parts(13_920_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn touch() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 18_063_000 picoseconds. - Weight::from_parts(18_669_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn touch_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `280` - // Estimated: `3675` - // Minimum execution time: 17_949_000 picoseconds. - Weight::from_parts(18_891_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn refund() -> Weight { - // Proof Size summary in bytes: - // Measured: `406` - // Estimated: `3675` - // Minimum execution time: 14_696_000 picoseconds. - Weight::from_parts(15_295_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Asset` (r:1 w:1) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - fn refund_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `439` - // Estimated: `3675` - // Minimum execution time: 14_643_000 picoseconds. - Weight::from_parts(15_289_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PoolAssets::Asset` (r:1 w:0) - /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `PoolAssets::Account` (r:1 w:1) - /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn block() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3675` - // Minimum execution time: 16_619_000 picoseconds. - Weight::from_parts(17_279_000, 0) - .saturating_add(Weight::from_parts(0, 3675)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs deleted file mode 100644 index db6dd8fef51f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_balances.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_balances` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_balances`. -pub struct WeightInfo(PhantomData); -impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_allow_death() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 54_422_000 picoseconds. - Weight::from_parts(55_477_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 39_850_000 picoseconds. - Weight::from_parts(41_026_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_creating() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 14_554_000 picoseconds. - Weight::from_parts(14_800_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_killing() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 21_586_000 picoseconds. - Weight::from_parts(22_297_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 57_042_000 picoseconds. - Weight::from_parts(58_251_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_all() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 51_587_000 picoseconds. - Weight::from_parts(52_275_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_unreserve() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 17_201_000 picoseconds. - Weight::from_parts(17_613_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:999 w:999) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(u: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 16_608_000 picoseconds. - Weight::from_parts(16_808_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 15_291 - .saturating_add(Weight::from_parts(15_154_407, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs deleted file mode 100644 index 80da7446bcd6..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_collator_selection.rs +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collator_selection` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_collator_selection -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collator_selection`. -pub struct WeightInfo(PhantomData); -impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:20 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `163 + b * (79 ±0)` - // Estimated: `1154 + b * (2555 ±0)` - // Minimum execution time: 14_105_000 picoseconds. - Weight::from_parts(12_034_824, 0) - .saturating_add(Weight::from_parts(0, 1154)) - // Standard Error: 7_023 - .saturating_add(Weight::from_parts(3_121_830, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) - } - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `756 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 47_466_000 picoseconds. - Weight::from_parts(42_189_027, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 14_224 - .saturating_add(Weight::from_parts(291_155, 0).saturating_mul(b.into())) - // Standard Error: 2_696 - .saturating_add(Weight::from_parts(233_090, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `119 + b * (32 ±0)` - // Estimated: `6287` - // Minimum execution time: 15_278_000 picoseconds. - Weight::from_parts(15_424_907, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 4_281 - .saturating_add(Weight::from_parts(197_354, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn set_desired_candidates() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_170_000 picoseconds. - Weight::from_parts(7_455_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_969_000 picoseconds. - Weight::from_parts(7_350_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `736 + c * (52 ±0)` - // Estimated: `6287 + c * (54 ±0)` - // Minimum execution time: 40_783_000 picoseconds. - Weight::from_parts(43_731_825, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_328 - .saturating_add(Weight::from_parts(232_983, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[4, 100]`. - fn leave_intent(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `306 + c * (50 ±0)` - // Estimated: `6287` - // Minimum execution time: 32_537_000 picoseconds. - Weight::from_parts(34_922_361, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_494 - .saturating_add(Weight::from_parts(199_859, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - fn note_author() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 43_240_000 picoseconds. - Weight::from_parts(44_434_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:97 w:97) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `r` is `[1, 100]`. - /// The range of component `c` is `[1, 100]`. - fn new_session(r: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `2243 + c * (97 ±0) + r * (112 ±0)` - // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 16_841_000 picoseconds. - Weight::from_parts(17_460_000, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 347_803 - .saturating_add(Weight::from_parts(15_008_101, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs deleted file mode 100644 index 230539e94df7..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_multisig.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_multisig` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_multisig -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_multisig`. -pub struct WeightInfo(PhantomData); -impl pallet_multisig::WeightInfo for WeightInfo { - /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 14_098_000 picoseconds. - Weight::from_parts(14_915_657, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 6 - .saturating_add(Weight::from_parts(454, 0).saturating_mul(z.into())) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `262 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 44_573_000 picoseconds. - Weight::from_parts(32_633_219, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_256 - .saturating_add(Weight::from_parts(131_767, 0).saturating_mul(s.into())) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_512, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[3, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_approve(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 30_035_000 picoseconds. - Weight::from_parts(20_179_371, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 827 - .saturating_add(Weight::from_parts(110_520, 0).saturating_mul(s.into())) - // Standard Error: 8 - .saturating_add(Weight::from_parts(1_419, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `385 + s * (33 ±0)` - // Estimated: `6811` - // Minimum execution time: 50_444_000 picoseconds. - Weight::from_parts(36_060_265, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_604 - .saturating_add(Weight::from_parts(187_796, 0).saturating_mul(s.into())) - // Standard Error: 15 - .saturating_add(Weight::from_parts(1_506, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 30_298_000 picoseconds. - Weight::from_parts(31_284_628, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 924 - .saturating_add(Weight::from_parts(132_724, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 17_486_000 picoseconds. - Weight::from_parts(18_518_530, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_274 - .saturating_add(Weight::from_parts(103_767, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + s * (1 ±0)` - // Estimated: `6811` - // Minimum execution time: 31_236_000 picoseconds. - Weight::from_parts(32_663_816, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_445 - .saturating_add(Weight::from_parts(131_060, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs deleted file mode 100644 index 38387a1df063..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nft_fractionalization.rs +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_nft_fractionalization` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_nft_fractionalization -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_nft_fractionalization`. -pub struct WeightInfo(PhantomData); -impl pallet_nft_fractionalization::WeightInfo for WeightInfo { - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Metadata` (r:1 w:1) - /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) - /// Storage: `NftFractionalization::NftToAsset` (r:0 w:1) - /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) - fn fractionalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `462` - // Estimated: `4326` - // Minimum execution time: 174_312_000 picoseconds. - Weight::from_parts(177_275_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) - } - /// Storage: `NftFractionalization::NftToAsset` (r:1 w:1) - /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn unify() -> Weight { - // Proof Size summary in bytes: - // Measured: `1275` - // Estimated: `4326` - // Minimum execution time: 123_635_000 picoseconds. - Weight::from_parts(126_975_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(10)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs deleted file mode 100644 index 5c0a53e9333a..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_nfts.rs +++ /dev/null @@ -1,775 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_nfts` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_nfts -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_nfts`. -pub struct WeightInfo(PhantomData); -impl pallet_nfts::WeightInfo for WeightInfo { - /// Storage: `Nfts::NextCollectionId` (r:1 w:1) - /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `179` - // Estimated: `3549` - // Minimum execution time: 37_322_000 picoseconds. - Weight::from_parts(38_364_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::NextCollectionId` (r:1 w:1) - /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `3549` - // Minimum execution time: 22_254_000 picoseconds. - Weight::from_parts(22_613_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:1) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1001 w:1000) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1000 w:1000) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:0 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:1) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// The range of component `m` is `[0, 1000]`. - /// The range of component `c` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy(_m: u32, c: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `32204 + a * (366 ±0)` - // Estimated: `2523990 + a * (2954 ±0)` - // Minimum execution time: 1_204_644_000 picoseconds. - Weight::from_parts(1_122_618_254, 0) - .saturating_add(Weight::from_parts(0, 2523990)) - // Standard Error: 9_641 - .saturating_add(Weight::from_parts(39_956, 0).saturating_mul(c.into())) - // Standard Error: 9_641 - .saturating_add(Weight::from_parts(6_866_428, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(1004)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(1005)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) - } - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `455` - // Estimated: `4326` - // Minimum execution time: 47_903_000 picoseconds. - Weight::from_parts(48_938_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn force_mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `455` - // Estimated: `4326` - // Minimum execution time: 46_662_000 picoseconds. - Weight::from_parts(47_673_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:0 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `564` - // Estimated: `4326` - // Minimum execution time: 53_042_000 picoseconds. - Weight::from_parts(54_352_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(7)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:2) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `593` - // Estimated: `4326` - // Minimum execution time: 40_570_000 picoseconds. - Weight::from_parts(43_020_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:5000 w:5000) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// The range of component `i` is `[0, 5000]`. - fn redeposit(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `763 + i * (108 ±0)` - // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 15_982_000 picoseconds. - Weight::from_parts(16_291_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - // Standard Error: 23_954 - .saturating_add(Weight::from_parts(17_559_013, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 3336).saturating_mul(i.into())) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn lock_item_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `435` - // Estimated: `3534` - // Minimum execution time: 20_084_000 picoseconds. - Weight::from_parts(20_572_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn unlock_item_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `435` - // Estimated: `3534` - // Minimum execution time: 20_007_000 picoseconds. - Weight::from_parts(20_221_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn lock_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `340` - // Estimated: `3549` - // Minimum execution time: 16_815_000 picoseconds. - Weight::from_parts(17_191_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:2) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3549` - // Minimum execution time: 22_234_000 picoseconds. - Weight::from_parts(22_888_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:2 w:4) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `369` - // Estimated: `6078` - // Minimum execution time: 38_473_000 picoseconds. - Weight::from_parts(39_578_000, 0) - .saturating_add(Weight::from_parts(0, 6078)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionAccount` (r:0 w:2) - /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_collection_owner() -> Weight { - // Proof Size summary in bytes: - // Measured: `311` - // Estimated: `3549` - // Minimum execution time: 17_377_000 picoseconds. - Weight::from_parts(17_887_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn force_collection_config() -> Weight { - // Proof Size summary in bytes: - // Measured: `276` - // Estimated: `3549` - // Minimum execution time: 14_575_000 picoseconds. - Weight::from_parts(14_890_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn lock_item_properties() -> Weight { - // Proof Size summary in bytes: - // Measured: `435` - // Estimated: `3534` - // Minimum execution time: 18_864_000 picoseconds. - Weight::from_parts(19_401_000, 0) - .saturating_add(Weight::from_parts(0, 3534)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - fn set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `539` - // Estimated: `3944` - // Minimum execution time: 48_949_000 picoseconds. - Weight::from_parts(50_054_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - fn force_set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `344` - // Estimated: `3944` - // Minimum execution time: 25_545_000 picoseconds. - Weight::from_parts(26_189_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Attribute` (r:1 w:1) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - fn clear_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `983` - // Estimated: `3944` - // Minimum execution time: 45_215_000 picoseconds. - Weight::from_parts(46_030_000, 0) - .saturating_add(Weight::from_parts(0, 3944)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - fn approve_item_attributes() -> Weight { - // Proof Size summary in bytes: - // Measured: `381` - // Estimated: `4466` - // Minimum execution time: 17_084_000 picoseconds. - Weight::from_parts(17_758_000, 0) - .saturating_add(Weight::from_parts(0, 4466)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1001 w:1000) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - fn cancel_item_attributes_approval(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `760 + n * (398 ±0)` - // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 25_696_000 picoseconds. - Weight::from_parts(26_074_000, 0) - .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 7_263 - .saturating_add(Weight::from_parts(6_492_893, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - fn set_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `539` - // Estimated: `3812` - // Minimum execution time: 40_890_000 picoseconds. - Weight::from_parts(41_530_000, 0) - .saturating_add(Weight::from_parts(0, 3812)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `849` - // Estimated: `3812` - // Minimum execution time: 38_847_000 picoseconds. - Weight::from_parts(39_924_000, 0) - .saturating_add(Weight::from_parts(0, 3812)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - fn set_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `398` - // Estimated: `3759` - // Minimum execution time: 36_693_000 picoseconds. - Weight::from_parts(37_689_000, 0) - .saturating_add(Weight::from_parts(0, 3759)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) - /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) - fn clear_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `716` - // Estimated: `3759` - // Minimum execution time: 36_168_000 picoseconds. - Weight::from_parts(36_757_000, 0) - .saturating_add(Weight::from_parts(0, 3759)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `410` - // Estimated: `4326` - // Minimum execution time: 20_589_000 picoseconds. - Weight::from_parts(21_153_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `418` - // Estimated: `4326` - // Minimum execution time: 18_133_000 picoseconds. - Weight::from_parts(18_701_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn clear_all_transfer_approvals() -> Weight { - // Proof Size summary in bytes: - // Measured: `418` - // Estimated: `4326` - // Minimum execution time: 16_809_000 picoseconds. - Weight::from_parts(17_391_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn set_accept_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `3517` - // Minimum execution time: 14_878_000 picoseconds. - Weight::from_parts(15_275_000, 0) - .saturating_add(Weight::from_parts(0, 3517)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - fn set_collection_max_supply() -> Weight { - // Proof Size summary in bytes: - // Measured: `340` - // Estimated: `3549` - // Minimum execution time: 18_388_000 picoseconds. - Weight::from_parts(18_950_000, 0) - .saturating_add(Weight::from_parts(0, 3549)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn update_mint_settings() -> Weight { - // Proof Size summary in bytes: - // Measured: `323` - // Estimated: `3538` - // Minimum execution time: 18_190_000 picoseconds. - Weight::from_parts(18_552_000, 0) - .saturating_add(Weight::from_parts(0, 3538)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn set_price() -> Weight { - // Proof Size summary in bytes: - // Measured: `518` - // Estimated: `4326` - // Minimum execution time: 22_986_000 picoseconds. - Weight::from_parts(23_601_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:1 w:1) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:1 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:2) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn buy_item() -> Weight { - // Proof Size summary in bytes: - // Measured: `705` - // Estimated: `4326` - // Minimum execution time: 49_098_000 picoseconds. - Weight::from_parts(50_262_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// The range of component `n` is `[0, 10]`. - fn pay_tips(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_208_000 picoseconds. - Weight::from_parts(3_312_261, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 6_242 - .saturating_add(Weight::from_parts(3_672_096, 0).saturating_mul(n.into())) - } - /// Storage: `Nfts::Item` (r:2 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - fn create_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `494` - // Estimated: `7662` - // Minimum execution time: 20_906_000 picoseconds. - Weight::from_parts(21_412_000, 0) - .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::PendingSwapOf` (r:1 w:1) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - fn cancel_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `513` - // Estimated: `4326` - // Minimum execution time: 20_250_000 picoseconds. - Weight::from_parts(20_703_000, 0) - .saturating_add(Weight::from_parts(0, 4326)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Nfts::Item` (r:2 w:2) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::PendingSwapOf` (r:1 w:2) - /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:0) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:2 w:0) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:2 w:0) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:4) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemPriceOf` (r:0 w:2) - /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn claim_swap() -> Weight { - // Proof Size summary in bytes: - // Measured: `834` - // Estimated: `7662` - // Minimum execution time: 83_471_000 picoseconds. - Weight::from_parts(85_349_000, 0) - .saturating_add(Weight::from_parts(0, 7662)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(10)) - } - /// Storage: `Nfts::CollectionRoleOf` (r:2 w:0) - /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Item` (r:1 w:1) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) - /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:10 w:10) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) - /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Account` (r:0 w:1) - /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 10]`. - fn mint_pre_signed(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `558` - // Estimated: `6078 + n * (2954 ±0)` - // Minimum execution time: 140_728_000 picoseconds. - Weight::from_parts(148_945_062, 0) - .saturating_add(Weight::from_parts(0, 6078)) - // Standard Error: 49_446 - .saturating_add(Weight::from_parts(30_948_884, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(6)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } - /// Storage: `Nfts::Item` (r:1 w:0) - /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) - /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) - /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(1001), added: 3476, mode: `MaxEncodedLen`) - /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) - /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Collection` (r:1 w:1) - /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) - /// Storage: `Nfts::Attribute` (r:10 w:10) - /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 10]`. - fn set_attributes_pre_signed(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `588` - // Estimated: `4466 + n * (2954 ±0)` - // Minimum execution time: 82_713_000 picoseconds. - Weight::from_parts(95_912_559, 0) - .saturating_add(Weight::from_parts(0, 4466)) - // Standard Error: 73_934 - .saturating_add(Weight::from_parts(30_039_875, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs deleted file mode 100644 index 076d79ff6275..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_proxy.rs +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_proxy` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_proxy -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_proxy`. -pub struct WeightInfo(PhantomData); -impl pallet_proxy::WeightInfo for WeightInfo { - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 15_673_000 picoseconds. - Weight::from_parts(16_387_670, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_721 - .saturating_add(Weight::from_parts(43_526, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn proxy_announced(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 36_942_000 picoseconds. - Weight::from_parts(36_433_953, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 2_462 - .saturating_add(Weight::from_parts(143_560, 0).saturating_mul(a.into())) - // Standard Error: 2_544 - .saturating_add(Weight::from_parts(60_294, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn remove_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 23_781_000 picoseconds. - Weight::from_parts(24_589_553, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_805 - .saturating_add(Weight::from_parts(121_040, 0).saturating_mul(a.into())) - // Standard Error: 1_865 - .saturating_add(Weight::from_parts(8_151, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn reject_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 23_868_000 picoseconds. - Weight::from_parts(24_246_179, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_752 - .saturating_add(Weight::from_parts(124_703, 0).saturating_mul(a.into())) - // Standard Error: 1_810 - .saturating_add(Weight::from_parts(21_348, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn announce(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 33_352_000 picoseconds. - Weight::from_parts(33_156_164, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_284 - .saturating_add(Weight::from_parts(127_696, 0).saturating_mul(a.into())) - // Standard Error: 1_327 - .saturating_add(Weight::from_parts(44_544, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn add_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 24_620_000 picoseconds. - Weight::from_parts(25_499_887, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_155 - .saturating_add(Weight::from_parts(43_095, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 24_614_000 picoseconds. - Weight::from_parts(25_685_644, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_932 - .saturating_add(Weight::from_parts(39_563, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxies(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 22_287_000 picoseconds. - Weight::from_parts(22_951_970, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_008 - .saturating_add(Weight::from_parts(30_530, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn create_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `139` - // Estimated: `4706` - // Minimum execution time: 26_685_000 picoseconds. - Weight::from_parts(27_473_088, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_684 - .saturating_add(Weight::from_parts(18_278, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 30]`. - fn kill_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `164 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 22_799_000 picoseconds. - Weight::from_parts(23_794_924, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_174 - .saturating_add(Weight::from_parts(29_777, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs deleted file mode 100644 index 8b8e5500d10f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_session.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_session` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_session -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_session`. -pub struct WeightInfo(PhantomData); -impl pallet_session::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:1 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn set_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `270` - // Estimated: `3735` - // Minimum execution time: 16_380_000 picoseconds. - Weight::from_parts(16_767_000, 0) - .saturating_add(Weight::from_parts(0, 3735)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:0 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn purge_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `3707` - // Minimum execution time: 12_158_000 picoseconds. - Weight::from_parts(12_835_000, 0) - .saturating_add(Weight::from_parts(0, 3707)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs deleted file mode 100644 index 40c5f3536097..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_timestamp.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_timestamp` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_timestamp -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_timestamp`. -pub struct WeightInfo(PhantomData); -impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: `Timestamp::Now` (r:1 w:1) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Aura::CurrentSlot` (r:1 w:0) - /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set() -> Weight { - // Proof Size summary in bytes: - // Measured: `86` - // Estimated: `1493` - // Minimum execution time: 9_347_000 picoseconds. - Weight::from_parts(9_686_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn on_finalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `57` - // Estimated: `0` - // Minimum execution time: 3_375_000 picoseconds. - Weight::from_parts(3_422_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs deleted file mode 100644 index 813d472709d2..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_uniques.rs +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_uniques` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_uniques -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_uniques`. -pub struct WeightInfo(PhantomData); -impl pallet_uniques::WeightInfo for WeightInfo { - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn create() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3643` - // Minimum execution time: 30_321_000 picoseconds. - Weight::from_parts(31_831_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_create() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3643` - // Minimum execution time: 13_556_000 picoseconds. - Weight::from_parts(13_887_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1001 w:1000) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1000 w:1000) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1000 w:1000) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:0 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1000) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::CollectionMaxSupply` (r:0 w:1) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - /// The range of component `m` is `[0, 1000]`. - /// The range of component `a` is `[0, 1000]`. - fn destroy(n: u32, m: u32, a: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `257 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` - // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` - // Minimum execution time: 3_038_253_000 picoseconds. - Weight::from_parts(3_097_477_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 36_951 - .saturating_add(Weight::from_parts(7_368_466, 0).saturating_mul(n.into())) - // Standard Error: 36_951 - .saturating_add(Weight::from_parts(481_367, 0).saturating_mul(m.into())) - // Standard Error: 36_951 - .saturating_add(Weight::from_parts(563_245, 0).saturating_mul(a.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) - .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::CollectionMaxSupply` (r:1 w:0) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn mint() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 35_343_000 picoseconds. - Weight::from_parts(35_755_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:1) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn burn() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 36_465_000 picoseconds. - Weight::from_parts(37_139_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:2) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 26_394_000 picoseconds. - Weight::from_parts(26_920_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:5000 w:5000) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// The range of component `i` is `[0, 5000]`. - fn redeposit(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `738 + i * (76 ±0)` - // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 14_445_000 picoseconds. - Weight::from_parts(14_661_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - // Standard Error: 23_835 - .saturating_add(Weight::from_parts(17_951_538, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 2597).saturating_mul(i.into())) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn freeze() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 18_602_000 picoseconds. - Weight::from_parts(18_954_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn thaw() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 18_328_000 picoseconds. - Weight::from_parts(18_919_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn freeze_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_574_000 picoseconds. - Weight::from_parts(13_921_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn thaw_collection() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_469_000 picoseconds. - Weight::from_parts(13_999_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:2) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn transfer_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `356` - // Estimated: `3643` - // Minimum execution time: 21_962_000 picoseconds. - Weight::from_parts(22_330_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn set_team() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 13_869_000 picoseconds. - Weight::from_parts(14_486_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassAccount` (r:0 w:1) - /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - fn force_item_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 16_965_000 picoseconds. - Weight::from_parts(17_320_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - fn set_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `559` - // Estimated: `3652` - // Minimum execution time: 38_300_000 picoseconds. - Weight::from_parts(39_057_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) - fn clear_attribute() -> Weight { - // Proof Size summary in bytes: - // Measured: `756` - // Estimated: `3652` - // Minimum execution time: 37_420_000 picoseconds. - Weight::from_parts(38_087_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - fn set_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `348` - // Estimated: `3652` - // Minimum execution time: 29_457_000 picoseconds. - Weight::from_parts(30_163_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `559` - // Estimated: `3652` - // Minimum execution time: 30_471_000 picoseconds. - Weight::from_parts(30_893_000, 0) - .saturating_add(Weight::from_parts(0, 3652)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:1) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - fn set_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 30_465_000 picoseconds. - Weight::from_parts(31_298_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) - fn clear_collection_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `473` - // Estimated: `3643` - // Minimum execution time: 29_491_000 picoseconds. - Weight::from_parts(30_096_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - fn approve_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `428` - // Estimated: `3643` - // Minimum execution time: 19_122_000 picoseconds. - Weight::from_parts(19_697_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - fn cancel_approval() -> Weight { - // Proof Size summary in bytes: - // Measured: `461` - // Estimated: `3643` - // Minimum execution time: 19_016_000 picoseconds. - Weight::from_parts(19_352_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::OwnershipAcceptance` (r:1 w:1) - /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn set_accept_ownership() -> Weight { - // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3517` - // Minimum execution time: 14_955_000 picoseconds. - Weight::from_parts(15_463_000, 0) - .saturating_add(Weight::from_parts(0, 3517)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::CollectionMaxSupply` (r:1 w:1) - /// Proof: `Uniques::CollectionMaxSupply` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - fn set_collection_max_supply() -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `3643` - // Minimum execution time: 16_155_000 picoseconds. - Weight::from_parts(16_535_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:0) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:0 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - fn set_price() -> Weight { - // Proof Size summary in bytes: - // Measured: `259` - // Estimated: `3587` - // Minimum execution time: 16_135_000 picoseconds. - Weight::from_parts(16_686_000, 0) - .saturating_add(Weight::from_parts(0, 3587)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Uniques::Asset` (r:1 w:1) - /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) - /// Storage: `Uniques::ItemPriceOf` (r:1 w:1) - /// Proof: `Uniques::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Class` (r:1 w:0) - /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) - /// Storage: `Uniques::Account` (r:0 w:2) - /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) - fn buy_item() -> Weight { - // Proof Size summary in bytes: - // Measured: `540` - // Estimated: `3643` - // Minimum execution time: 35_899_000 picoseconds. - Weight::from_parts(37_432_000, 0) - .saturating_add(Weight::from_parts(0, 3643)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs deleted file mode 100644 index ca0ead95b15b..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_utility.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_utility` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_utility -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_utility`. -pub struct WeightInfo(PhantomData); -impl pallet_utility::WeightInfo for WeightInfo { - /// The range of component `c` is `[0, 1000]`. - fn batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_596_000 picoseconds. - Weight::from_parts(6_795_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_304 - .saturating_add(Weight::from_parts(6_036_412, 0).saturating_mul(c.into())) - } - fn as_derivative() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_877_000 picoseconds. - Weight::from_parts(5_175_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn batch_all(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_533_000 picoseconds. - Weight::from_parts(6_652_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_270 - .saturating_add(Weight::from_parts(6_403_555, 0).saturating_mul(c.into())) - } - fn dispatch_as() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_628_000 picoseconds. - Weight::from_parts(9_057_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn force_batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_619_000 picoseconds. - Weight::from_parts(380_833, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_765 - .saturating_add(Weight::from_parts(6_028_416, 0).saturating_mul(c.into())) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs deleted file mode 100644 index 0256b49be3fe..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_xcm`. -pub struct WeightInfo(PhantomData); -impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn send() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 29_833_000 picoseconds. - Weight::from_parts(30_472_000, 0) - .saturating_add(Weight::from_parts(0, 3610)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 22_922_000 picoseconds. - Weight::from_parts(23_650_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn reserve_transfer_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 17_468_000 picoseconds. - Weight::from_parts(18_068_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - fn execute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_780_000 picoseconds. - Weight::from_parts(9_201_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_886_000 picoseconds. - Weight::from_parts(9_102_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_default_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_665_000 picoseconds. - Weight::from_parts(2_884_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_subscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 34_513_000 picoseconds. - Weight::from_parts(36_207_000, 0) - .saturating_add(Weight::from_parts(0, 3610)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_unsubscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `363` - // Estimated: `3828` - // Minimum execution time: 35_770_000 picoseconds. - Weight::from_parts(36_462_000, 0) - .saturating_add(Weight::from_parts(0, 3828)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) - /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_suspension() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_763_000 picoseconds. - Weight::from_parts(3_079_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_supported_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `162` - // Estimated: `11052` - // Minimum execution time: 17_170_000 picoseconds. - Weight::from_parts(17_674_000, 0) - .saturating_add(Weight::from_parts(0, 11052)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notifiers() -> Weight { - // Proof Size summary in bytes: - // Measured: `166` - // Estimated: `11056` - // Minimum execution time: 16_857_000 picoseconds. - Weight::from_parts(17_407_000, 0) - .saturating_add(Weight::from_parts(0, 11056)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn already_notified_target() -> Weight { - // Proof Size summary in bytes: - // Measured: `173` - // Estimated: `13538` - // Minimum execution time: 19_040_000 picoseconds. - Weight::from_parts(19_550_000, 0) - .saturating_add(Weight::from_parts(0, 13538)) - .saturating_add(T::DbWeight::get().reads(5)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn notify_current_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `212` - // Estimated: `6152` - // Minimum execution time: 31_623_000 picoseconds. - Weight::from_parts(32_646_000, 0) - .saturating_add(Weight::from_parts(0, 6152)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn notify_target_migration_fail() -> Weight { - // Proof Size summary in bytes: - // Measured: `206` - // Estimated: `8621` - // Minimum execution time: 9_148_000 picoseconds. - Weight::from_parts(9_402_000, 0) - .saturating_add(Weight::from_parts(0, 8621)) - .saturating_add(T::DbWeight::get().reads(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notify_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `173` - // Estimated: `11063` - // Minimum execution time: 17_630_000 picoseconds. - Weight::from_parts(17_941_000, 0) - .saturating_add(Weight::from_parts(0, 11063)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn migrate_and_notify_old_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `215` - // Estimated: `11105` - // Minimum execution time: 38_425_000 picoseconds. - Weight::from_parts(39_219_000, 0) - .saturating_add(Weight::from_parts(0, 11105)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs deleted file mode 100644 index 763cb6c10f13..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod pallet_xcm_benchmarks_fungible; -mod pallet_xcm_benchmarks_generic; - -use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; -use frame_support::weights::Weight; -use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; -use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; -use xcm::{latest::prelude::*, DoubleEncoded}; - -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; -} - -const MAX_ASSETS: u64 = 100; - -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - match self { - Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), - Self::Wild(asset) => match asset { - All => weight.saturating_mul(MAX_ASSETS), - AllOf { fun, .. } => match fun { - WildFungibility::Fungible => weight, - // Magic number 2 has to do with the fact that we could have up to 2 times - // MaxAssetsIntoHolding in the worst-case scenario. - WildFungibility::NonFungible => - weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), - }, - AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - }, - } - } -} - -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().iter().count() as u64) - } -} - -pub struct AssetHubWestendXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for AssetHubWestendXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) - } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) - } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) - } - fn query_response( - _query_id: &u64, - _response: &Response, - _max_weight: &Weight, - _querier: &Option, - ) -> Weight { - XcmGeneric::::query_response() - } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) - } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) - } - fn transact( - _origin_type: &OriginKind, - _require_weight_at_most: &Weight, - _call: &DoubleEncoded, - ) -> Weight { - XcmGeneric::::transact() - } - fn hrmp_new_channel_open_request( - _sender: &u32, - _max_message_size: &u32, - _max_capacity: &u32, - ) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_accepted(_recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn clear_origin() -> Weight { - XcmGeneric::::clear_origin() - } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { - XcmGeneric::::descend_origin() - } - fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_error() - } - - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) - } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) - } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { - Weight::MAX - } - fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) - } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) - } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { - XcmGeneric::::report_holding() - } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { - XcmGeneric::::buy_execution() - } - fn refund_surplus() -> Weight { - XcmGeneric::::refund_surplus() - } - fn set_error_handler(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_error_handler() - } - fn set_appendix(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_appendix() - } - fn clear_error() -> Weight { - XcmGeneric::::clear_error() - } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { - XcmGeneric::::claim_asset() - } - fn trap(_code: &u64) -> Weight { - XcmGeneric::::trap() - } - fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { - XcmGeneric::::subscribe_version() - } - fn unsubscribe_version() -> Weight { - XcmGeneric::::unsubscribe_version() - } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) - } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) - } - fn expect_origin(_origin: &Option) -> Weight { - XcmGeneric::::expect_origin() - } - fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { - XcmGeneric::::expect_error() - } - fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { - XcmGeneric::::expect_transact_status() - } - fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::query_pallet() - } - fn expect_pallet( - _index: &u32, - _name: &Vec, - _module_name: &Vec, - _crate_major: &u32, - _min_crate_minor: &u32, - ) -> Weight { - XcmGeneric::::expect_pallet() - } - fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_transact_status() - } - fn clear_transact_status() -> Weight { - XcmGeneric::::clear_transact_status() - } - fn universal_origin(_: &Junction) -> Weight { - Weight::MAX - } - fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - Weight::MAX - } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn set_fees_mode(_: &bool) -> Weight { - XcmGeneric::::set_fees_mode() - } - fn set_topic(_topic: &[u8; 32]) -> Weight { - XcmGeneric::::set_topic() - } - fn clear_topic() -> Weight { - XcmGeneric::::clear_topic() - } - fn alias_origin(_: &MultiLocation) -> Weight { - // XCM Executor does not currently support alias origin operations - Weight::MAX - } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { - XcmGeneric::::unpaid_execution() - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs deleted file mode 100644 index ee435559f46f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::fungible`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn withdraw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `3593` - // Minimum execution time: 25_411_000 picoseconds. - Weight::from_parts(25_663_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn transfer_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `6196` - // Minimum execution time: 49_478_000 picoseconds. - Weight::from_parts(50_417_000, 6196) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn transfer_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 72_958_000 picoseconds. - Weight::from_parts(74_503_000, 6196) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - // Storage: `Benchmark::Override` (r:0 w:0) - // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn reserve_asset_deposited() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 500_000_000_000 picoseconds. - Weight::from_parts(500_000_000_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_reserve_withdraw() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 456_993_000 picoseconds. - Weight::from_parts(469_393_000, 3610) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn receive_teleported_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_580_000 picoseconds. - Weight::from_parts(3_717_000, 0) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn deposit_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 25_087_000 picoseconds. - Weight::from_parts(25_788_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn deposit_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 50_824_000 picoseconds. - Weight::from_parts(52_309_000, 3610) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_teleport() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 31_854_000 picoseconds. - Weight::from_parts(32_553_000, 3610) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs deleted file mode 100644 index a1d06914aa64..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::generic` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::generic`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_holding() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 405_795_000 picoseconds. - Weight::from_parts(421_225_000, 3610) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn buy_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_021_000 picoseconds. - Weight::from_parts(4_234_000, 0) - } - // Storage: `PolkadotXcm::Queries` (r:1 w:0) - // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn query_response() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3568` - // Minimum execution time: 11_004_000 picoseconds. - Weight::from_parts(11_217_000, 3568) - .saturating_add(T::DbWeight::get().reads(1)) - } - pub fn transact() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 12_888_000 picoseconds. - Weight::from_parts(13_249_000, 0) - } - pub fn refund_surplus() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_504_000 picoseconds. - Weight::from_parts(4_984_000, 0) - } - pub fn set_error_handler() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_733_000 picoseconds. - Weight::from_parts(2_887_000, 0) - } - pub fn set_appendix() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_753_000 picoseconds. - Weight::from_parts(2_844_000, 0) - } - pub fn clear_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_741_000 picoseconds. - Weight::from_parts(2_826_000, 0) - } - pub fn descend_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_417_000 picoseconds. - Weight::from_parts(3_525_000, 0) - } - pub fn clear_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_775_000 picoseconds. - Weight::from_parts(2_853_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 27_035_000 picoseconds. - Weight::from_parts(27_734_000, 3610) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) - // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn claim_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `160` - // Estimated: `3625` - // Minimum execution time: 15_728_000 picoseconds. - Weight::from_parts(16_145_000, 3625) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn trap() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_630_000 picoseconds. - Weight::from_parts(2_700_000, 0) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn subscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 29_996_000 picoseconds. - Weight::from_parts(30_620_000, 3610) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn unsubscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_629_000 picoseconds. - Weight::from_parts(4_861_000, 0) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn burn_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 135_145_000 picoseconds. - Weight::from_parts(142_115_000, 0) - } - pub fn expect_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 11_948_000 picoseconds. - Weight::from_parts(12_160_000, 0) - } - pub fn expect_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_718_000 picoseconds. - Weight::from_parts(2_794_000, 0) - } - pub fn expect_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_590_000 picoseconds. - Weight::from_parts(2_674_000, 0) - } - pub fn expect_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_858_000 picoseconds. - Weight::from_parts(2_939_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn query_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 30_652_000 picoseconds. - Weight::from_parts(31_552_000, 3610) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn expect_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_408_000 picoseconds. - Weight::from_parts(5_597_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 27_144_000 picoseconds. - Weight::from_parts(27_736_000, 3610) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn clear_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_696_000 picoseconds. - Weight::from_parts(2_802_000, 0) - } - pub fn set_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_655_000 picoseconds. - Weight::from_parts(2_720_000, 0) - } - pub fn clear_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_599_000 picoseconds. - Weight::from_parts(2_723_000, 0) - } - pub fn set_fees_mode() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_630_000 picoseconds. - Weight::from_parts(2_728_000, 0) - } - pub fn unpaid_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_797_000 picoseconds. - Weight::from_parts(2_928_000, 0) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs deleted file mode 100644 index a5cb0425a22f..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ /dev/null @@ -1,595 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TrustBackedAssetsInstance, WeightToFee, XcmpQueue, -}; -use crate::{AllowMultiAssetPools, ForeignAssets, LiquidityWithdrawalFee}; -use assets_common::{ - local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, - matching::{ - FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus, - }, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::AssetFeeAsExistentialDepositMultiplier}; -use polkadot_parachain::primitives::Sibling; -use sp_runtime::traits::ConvertInto; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FungiblesAdapter, IsConcrete, - LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; - -#[cfg(feature = "runtime-benchmarks")] -use {cumulus_primitives_core::ParaId, sp_core::Get}; - -parameter_types! { - pub const WestendLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Westend); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub ForeignAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub PoolAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// `AssetId/Balance` converter for `TrustBackedAssets` -pub type TrustBackedAssetsConvertedConcreteId = - assets_common::TrustBackedAssetsConvertedConcreteId; - -/// Means for transacting assets besides the native currency on this chain. -pub type FungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - Assets, - // Use this currency when it is a fungible asset matching the given location or name: - TrustBackedAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// `AssetId/Balance` converter for `TrustBackedAssets` -pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< - ( - // Ignore `TrustBackedAssets` explicitly - StartsWith, - // Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parents: 1, - // X*(Parachain(xyz), ..)} - // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont - // be accepted here - StartsWithExplicitGlobalConsensus, - ), - Balance, ->; - -/// Means for transacting foreign assets from different global consensus. -pub type ForeignFungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - ForeignAssets, - // Use this currency when it is a fungible asset matching the given location or name: - ForeignAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We dont need to check teleports here. - NoChecking, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// `AssetId/Balance` converter for `PoolAssets` -pub type PoolAssetsConvertedConcreteId = - assets_common::PoolAssetsConvertedConcreteId; - -/// Means for transacting asset conversion pool assets on this chain. -pub type PoolFungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - PoolAssets, - // Use this currency when it is a fungible asset matching the given location or name: - PoolAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// Means for transacting assets on this chain. -pub type AssetTransactors = - (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor, PoolFungiblesTransactor); - -/// Simple `MultiLocation` matcher for Local and Foreign asset `MultiLocation`. -pub struct LocalAndForeignAssetsMultiLocationMatcher; -impl MatchesLocalAndForeignAssetsMultiLocation for LocalAndForeignAssetsMultiLocationMatcher { - fn is_local(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - TrustBackedAssetsConvertedConcreteId::contains(location) - } - - fn is_foreign(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - ForeignAssetsConvertedConcreteId::contains(location) - } -} -impl Contains for LocalAndForeignAssetsMultiLocationMatcher { - fn contains(location: &MultiLocation) -> bool { - Self::is_local(location) || Self::is_foreign(location) - } -} - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognised. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognised. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - pub XcmAssetFeesReceiver: Option = Authorship::author(); -} - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; -} - -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - // Allow to change dedicated storage items (called by governance-like) - match call { - RuntimeCall::System(frame_system::Call::set_storage { items }) - if items.iter().any(|(k, _)| { - k.eq(&AllowMultiAssetPools::key()) | k.eq(&LiquidityWithdrawalFee::key()) - }) => - return true, - _ => (), - }; - - matches!( - call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Assets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | RuntimeCall::ForeignAssets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::refund { .. }, - ) | RuntimeCall::AssetConversion( - pallet_asset_conversion::Call::create_pool { .. } | - pallet_asset_conversion::Call::add_liquidity { .. } | - pallet_asset_conversion::Call::remove_liquidity { .. } | - pallet_asset_conversion::Call::swap_tokens_for_exact_tokens { .. } | - pallet_asset_conversion::Call::swap_exact_tokens_for_tokens { .. }, - ) | RuntimeCall::NftFractionalization( - pallet_nft_fractionalization::Call::fractionalize { .. } | - pallet_nft_fractionalization::Call::unify { .. }, - ) | RuntimeCall::Nfts( - pallet_nfts::Call::create { .. } | - pallet_nfts::Call::force_create { .. } | - pallet_nfts::Call::destroy { .. } | - pallet_nfts::Call::mint { .. } | - pallet_nfts::Call::force_mint { .. } | - pallet_nfts::Call::burn { .. } | - pallet_nfts::Call::transfer { .. } | - pallet_nfts::Call::lock_item_transfer { .. } | - pallet_nfts::Call::unlock_item_transfer { .. } | - pallet_nfts::Call::lock_collection { .. } | - pallet_nfts::Call::transfer_ownership { .. } | - pallet_nfts::Call::set_team { .. } | - pallet_nfts::Call::force_collection_owner { .. } | - pallet_nfts::Call::force_collection_config { .. } | - pallet_nfts::Call::approve_transfer { .. } | - pallet_nfts::Call::cancel_approval { .. } | - pallet_nfts::Call::clear_all_transfer_approvals { .. } | - pallet_nfts::Call::lock_item_properties { .. } | - pallet_nfts::Call::set_attribute { .. } | - pallet_nfts::Call::force_set_attribute { .. } | - pallet_nfts::Call::clear_attribute { .. } | - pallet_nfts::Call::approve_item_attributes { .. } | - pallet_nfts::Call::cancel_item_attributes_approval { .. } | - pallet_nfts::Call::set_metadata { .. } | - pallet_nfts::Call::clear_metadata { .. } | - pallet_nfts::Call::set_collection_metadata { .. } | - pallet_nfts::Call::clear_collection_metadata { .. } | - pallet_nfts::Call::set_accept_ownership { .. } | - pallet_nfts::Call::set_collection_max_supply { .. } | - pallet_nfts::Call::update_mint_settings { .. } | - pallet_nfts::Call::set_price { .. } | - pallet_nfts::Call::buy_item { .. } | - pallet_nfts::Call::pay_tips { .. } | - pallet_nfts::Call::create_swap { .. } | - pallet_nfts::Call::cancel_swap { .. } | - pallet_nfts::Call::claim_swap { .. }, - ) | RuntimeCall::Uniques( - pallet_uniques::Call::create { .. } | - pallet_uniques::Call::force_create { .. } | - pallet_uniques::Call::destroy { .. } | - pallet_uniques::Call::mint { .. } | - pallet_uniques::Call::burn { .. } | - pallet_uniques::Call::transfer { .. } | - pallet_uniques::Call::freeze { .. } | - pallet_uniques::Call::thaw { .. } | - pallet_uniques::Call::freeze_collection { .. } | - pallet_uniques::Call::thaw_collection { .. } | - pallet_uniques::Call::transfer_ownership { .. } | - pallet_uniques::Call::set_team { .. } | - pallet_uniques::Call::approve_transfer { .. } | - pallet_uniques::Call::cancel_approval { .. } | - pallet_uniques::Call::force_item_status { .. } | - pallet_uniques::Call::set_attribute { .. } | - pallet_uniques::Call::clear_attribute { .. } | - pallet_uniques::Call::set_metadata { .. } | - pallet_uniques::Call::clear_metadata { .. } | - pallet_uniques::Call::set_collection_metadata { .. } | - pallet_uniques::Call::clear_collection_metadata { .. } | - pallet_uniques::Call::set_accept_ownership { .. } | - pallet_uniques::Call::set_collection_max_supply { .. } | - pallet_uniques::Call::set_price { .. } | - pallet_uniques::Call::buy_item { .. }, - ) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -// TODO: This calls into the Assets pallet's default `BalanceToAssetBalance` implementation, which -// uses the ratio of minimum balances and requires asset sufficiency. This means that purchasing -// weight within XCM programs will still use the old way, and paying fees via asset conversion will -// only be possible when transacting locally. We should add an impl of this trait that does asset -// conversion. -pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< - Runtime, - WeightToFee, - pallet_assets::BalanceToAssetBalance, - TrustBackedAssetsInstance, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = AssetTransactors; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Asset Hub Westend does not recognize a reserve location for any asset. This does not prevent - // Asset Hub acting _as_ a reserve location for WND and assets created under `pallet-assets`. - // For WND, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = (); - // We allow: - // - teleportation of WND - // - teleportation of sibling parachain's assets (as ForeignCreators) - type IsTeleporter = ( - NativeAsset, - IsForeignConcreteAsset>>, - ); - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubWestendXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type Trader = ( - UsingComponents>, - cumulus_primitives_utility::TakeFirstAssetTrader< - AccountId, - AssetFeeAsExistentialDepositMultiplierFeeCharger, - TrustBackedAssetsConvertedConcreteId, - Assets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - FungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, - >, - ); - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Local origins on this chain are allowed to dispatch XCM sends/executions. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Everything; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Everything; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubWestendXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -pub type ForeignCreatorsSovereignAccountOf = ( - SiblingParachainConvertsVia, - AccountId32Aliases, - ParentIsPreset, -); - -/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. -pub struct XcmBenchmarkHelper; -#[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } - } -} - -#[cfg(feature = "runtime-benchmarks")] -pub struct BenchmarkMultiLocationConverter { - _phantom: sp_std::marker::PhantomData, -} - -#[cfg(feature = "runtime-benchmarks")] -impl - pallet_asset_conversion::BenchmarkHelper> - for BenchmarkMultiLocationConverter -where - SelfParaId: Get, -{ - fn asset_id(asset_id: u32) -> MultiLocation { - MultiLocation { - parents: 1, - interior: X3( - Parachain(SelfParaId::get().into()), - PalletInstance(::index() as u8), - GeneralIndex(asset_id.into()), - ), - } - } - - fn multiasset_id(asset_id: u32) -> sp_std::boxed::Box { - sp_std::boxed::Box::new(Self::asset_id(asset_id)) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs deleted file mode 100644 index e3bd45c57113..000000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ /dev/null @@ -1,700 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Tests for the Westmint (Westend Assets Hub) chain. - -pub use asset_hub_westend_runtime::{ - constants::fee::WeightToFee, - xcm_config::{CheckingAccount, TrustBackedAssetsPalletLocation, XcmConfig}, - AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, - ParachainSystem, Runtime, SessionKeys, System, TrustBackedAssetsInstance, -}; -use asset_hub_westend_runtime::{ - xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, - WestendLocation, - }, - AllowMultiAssetPools, LiquidityWithdrawalFee, MetadataDepositBase, MetadataDepositPerByte, - RuntimeCall, RuntimeEvent, -}; -use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper, XcmReceivedFrom}; -use codec::{Decode, DecodeLimit, Encode}; -use cumulus_primitives_utility::ChargeWeightInFungibles; -use frame_support::{ - assert_noop, assert_ok, sp_io, - traits::fungibles::InspectEnumerable, - weights::{Weight, WeightToFee as WeightToFeeT}, -}; -use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; -use sp_runtime::{ - traits::{CheckedAdd, CheckedSub, MaybeEquivalence}, - Permill, -}; -use std::convert::Into; -use xcm::{latest::prelude::*, VersionedXcm, MAX_XCM_DECODE_DEPTH}; -use xcm_executor::{ - traits::{Identity, JustTry, WeightTrader}, - XcmExecutor, -}; - -const ALICE: [u8; 32] = [1u8; 32]; -const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; - -type AssetIdForTrustBackedAssetsConvert = - assets_common::AssetIdForTrustBackedAssetsConvert; - -fn collator_session_keys() -> CollatorSessionKeys { - CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - ) -} - -#[test] -fn test_asset_xcm_trader() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - let minimum_asset_balance = 3333333_u128; - let local_asset_id = 1; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // get asset id as multilocation - let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - // Lets calculate amount needed - let asset_amount_needed = - AssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( - local_asset_id, - bought, - ) - .expect("failed to compute"); - - // Lets pay with: asset_amount_needed + asset_amount_extra - let asset_amount_extra = 100_u128; - let asset: MultiAsset = - (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Lets buy_weight and make sure buy_weight does not return an error - let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); - // Check whether a correct amount of unused assets is returned - assert_ok!( - unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) - ); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance + asset_amount_needed - ); - - // We also need to ensure the total supply increased - assert_eq!( - Assets::total_supply(local_asset_id), - minimum_asset_balance + asset_amount_needed - ); - }); -} - -#[test] -fn test_asset_xcm_trader_with_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - // lets calculate amount needed - let amount_bought = WeightToFee::weight_to_fee(&bought); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Make sure buy_weight does not return an error - assert_ok!(trader.buy_weight(bought, asset.clone().into(), &ctx)); - - // Make sure again buy_weight does return an error - // This assert relies on the fact, that we use `TakeFirstAssetTrader` in `WeightTrader` - // tuple chain, which cannot be called twice - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // We actually use half of the weight - let weight_used = bought / 2; - - // Make sure refurnd works. - let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); - - assert_eq!( - trader.refund_weight(bought - weight_used, &ctx), - Some((asset_multilocation, amount_refunded).into()) - ); - - // Drop trader - drop(trader); - - // We only should have paid for half of the bought weight - let fees_paid = WeightToFee::weight_to_fee(&weight_used); - - assert_eq!( - Assets::balance(1, AccountId::from(ALICE)), - ExistentialDeposit::get() + fees_paid - ); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get() + fees_paid); - }); -} - -#[test] -fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 5e9 weight - let bought = Weight::from_parts(500_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Buy weight should return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // not credited since the ED is higher than this value - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), 0); - - // We also need to ensure the total supply did not increase - assert_eq!(Assets::total_supply(1), 0); - }); -} - -#[test] -fn test_that_buying_ed_refund_does_not_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - let bought = Weight::from_parts(500_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - // We know we will have to buy at least ED, so lets make sure first it will - // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); - - // Buy weight should work - assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); - - // Should return None. We have a specific check making sure we dont go below ED for - // drop payment - assert_eq!(trader.refund_weight(bought, &ctx), None); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), ExistentialDeposit::get()); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); - }); -} - -#[test] -fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // Create a non-sufficient asset with specific existential deposit - let minimum_asset_balance = 1_000_000_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - false, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::::run_to_block(2, Some(AccountId::from(ALICE))); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - // lets calculate amount needed - let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); - - // Make sure again buy_weight does return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has NOT received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), minimum_asset_balance); - - // We also need to ensure the total supply NOT increased - assert_eq!(Assets::total_supply(1), minimum_asset_balance); - }); -} - -#[test] -fn test_assets_balances_api_works() { - use assets_common::runtime_api::runtime_decl_for_fungibles_api::FungiblesApi; - - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - let local_asset_id = 1; - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; - - // check before - assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); - assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), - 0 - ); - assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); - assert!(Runtime::query_account_balances(AccountId::from(ALICE)) - .unwrap() - .try_as::() - .unwrap() - .is_none()); - - // Drip some balance - use frame_support::traits::fungible::Mutate; - let some_currency = ExistentialDeposit::get(); - Balances::mint_into(&AccountId::from(ALICE), some_currency).unwrap(); - - // We need root origin to create a sufficient asset - let minimum_asset_balance = 3333333_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // create foreign asset - let foreign_asset_minimum_asset_balance = 3333333_u128; - assert_ok!(ForeignAssets::force_create( - RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation, - AccountId::from(SOME_ASSET_ADMIN).into(), - false, - foreign_asset_minimum_asset_balance - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(ForeignAssets::mint( - RuntimeHelper::::origin_of(AccountId::from(SOME_ASSET_ADMIN)), - foreign_asset_id_multilocation, - AccountId::from(ALICE).into(), - 6 * foreign_asset_minimum_asset_balance - )); - - // check after - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance - ); - assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), - 6 * minimum_asset_balance - ); - assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - - let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) - .unwrap() - .try_into() - .unwrap(); - assert_eq!(result.len(), 3); - - // check currency - assert!(result.inner().iter().any(|asset| asset.eq( - &assets_common::fungible_conversion::convert_balance::( - some_currency - ) - .unwrap() - ))); - // check trusted asset - assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), - minimum_asset_balance - ) - .into()))); - // check foreign asset - assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), - 6 * foreign_asset_minimum_asset_balance - ) - .into()))); - }); -} - -asset_test_utils::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - 1000 -); - -asset_test_utils::include_teleports_for_foreign_assets_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - ForeignCreatorsSovereignAccountOf, - ForeignAssetsInstance, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!( - Runtime, - XcmConfig, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( - asset_transactor_transfer_with_trust_backed_assets_works, - Runtime, - XcmConfig, - TrustBackedAssetsInstance, - AssetIdForTrustBackedAssets, - AssetIdForTrustBackedAssetsConvert, - collator_session_keys(), - ExistentialDeposit::get(), - 12345, - Box::new(|| { - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!( - asset_transactor_transfer_with_foreign_assets_works, - Runtime, - XcmConfig, - ForeignAssetsInstance, - MultiLocation, - JustTry, - collator_session_keys(), - ExistentialDeposit::get(), - MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - }) -); - -asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works!( - Runtime, - XcmConfig, - WeightToFee, - ForeignCreatorsSovereignAccountOf, - ForeignAssetsInstance, - MultiLocation, - JustTry, - collator_session_keys(), - ExistentialDeposit::get(), - AssetDeposit::get(), - MetadataDepositBase::get(), - MetadataDepositPerByte::get(), - Box::new(|pallet_asset_call| RuntimeCall::ForeignAssets(pallet_asset_call).encode()), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::ForeignAssets(pallet_asset_event)) => Some(pallet_asset_event), - _ => None, - } - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert!(ForeignAssets::asset_ids().collect::>().is_empty()); - }), - Box::new(|| { - assert!(Assets::asset_ids().collect::>().is_empty()); - assert_eq!(ForeignAssets::asset_ids().collect::>().len(), 1); - }) -); - -#[test] -fn plain_receive_teleported_asset_works() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - let data = hex_literal::hex!("02100204000100000b00a0724e18090a13000100000b00a0724e180901e20f5e480d010004000101001299557001f55815d3fcb53c74463acb0cf6d14d4639b340982c60877f384609").to_vec(); - let message_id = sp_io::hashing::blake2_256(&data); - - let maybe_msg = VersionedXcm::::decode_all_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut data.as_ref(), - ) - .map(xcm::v3::Xcm::::try_from).expect("failed").expect("failed"); - - let outcome = - XcmExecutor::::execute_xcm(Parent, maybe_msg, message_id, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent)); - assert_eq!(outcome.ensure_complete(), Ok(())); - }) -} - -#[test] -fn change_allow_multi_asset_pools_by_governance_works() { - asset_test_utils::test_cases::change_storage_constant_by_governance_works::< - Runtime, - AllowMultiAssetPools, - bool, - >( - collator_session_keys(), - 1000, - Box::new(|call| RuntimeCall::System(call).encode()), - || (AllowMultiAssetPools::key().to_vec(), AllowMultiAssetPools::get()), - |old_value| !old_value, - ) -} - -#[test] -fn change_liquidity_withdrawal_fee_by_governance_works() { - asset_test_utils::test_cases::change_storage_constant_by_governance_works::< - Runtime, - LiquidityWithdrawalFee, - Permill, - >( - collator_session_keys(), - 1000, - Box::new(|call| RuntimeCall::System(call).encode()), - || (LiquidityWithdrawalFee::key().to_vec(), LiquidityWithdrawalFee::get()), - |old_value| { - if let Some(new_value) = old_value.checked_add(&Permill::from_percent(2)) { - new_value - } else { - old_value.checked_sub(&Permill::from_percent(2)).unwrap() - } - }, - ) -} diff --git a/cumulus/parachains/runtimes/assets/common/Cargo.toml b/cumulus/parachains/runtimes/assets/common/Cargo.toml deleted file mode 100644 index 646762c6ea25..000000000000 --- a/cumulus/parachains/runtimes/assets/common/Cargo.toml +++ /dev/null @@ -1,58 +0,0 @@ -[package] -name = "assets-common" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Assets common utilities" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -log = { version = "0.4.20", default-features = false } -impl-trait-for-tuples = "0.2.2" - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-asset-conversion = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -pallet-asset-tx-payment = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } - -# Polkadot -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -parachains-common = { path = "../../../common", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "log/std", - "frame-support/std", - "pallet-asset-conversion/std", - "pallet-asset-tx-payment/std", - "parachains-common/std", - "cumulus-primitives-core/std", - "sp-api/std", - "sp-std/std", - "sp-runtime/std", - "pallet-xcm/std", - "xcm/std", - "xcm-builder/std", - "xcm-executor/std", -] - -runtime-benchmarks = [ - "frame-support/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", -] diff --git a/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs b/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs deleted file mode 100644 index 00f336f9c682..000000000000 --- a/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use frame_support::traits::{ - ContainsPair, EnsureOrigin, EnsureOriginWithArg, Everything, OriginTrait, -}; -use pallet_xcm::{EnsureXcm, Origin as XcmOrigin}; -use xcm::latest::MultiLocation; -use xcm_executor::traits::ConvertLocation; - -/// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations -/// containing the class location. -pub struct ForeignCreators( - sp_std::marker::PhantomData<(IsForeign, AccountOf, AccountId)>, -); -impl< - IsForeign: ContainsPair, - AccountOf: ConvertLocation, - AccountId: Clone, - RuntimeOrigin: From + OriginTrait + Clone, - > EnsureOriginWithArg - for ForeignCreators -where - RuntimeOrigin::PalletsOrigin: - From + TryInto, -{ - type Success = AccountId; - - fn try_origin( - origin: RuntimeOrigin, - asset_location: &MultiLocation, - ) -> sp_std::result::Result { - let origin_location = EnsureXcm::::try_origin(origin.clone())?; - if !IsForeign::contains(asset_location, &origin_location) { - return Err(origin) - } - AccountOf::convert_location(&origin_location).ok_or(origin) - } - - #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin(a: &MultiLocation) -> Result { - Ok(pallet_xcm::Origin::Xcm(*a).into()) - } -} diff --git a/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs b/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs deleted file mode 100644 index 5aa5a69caa94..000000000000 --- a/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Runtime API definition for assets. - -use crate::runtime_api::FungiblesAccessError; -use frame_support::traits::Contains; -use sp_runtime::traits::MaybeEquivalence; -use sp_std::{borrow::Borrow, vec::Vec}; -use xcm::latest::{MultiAsset, MultiLocation}; -use xcm_builder::{ConvertedConcreteId, MatchedConvertedConcreteId}; -use xcm_executor::traits::MatchesFungibles; - -/// Converting any [`(AssetId, Balance)`] to [`MultiAsset`] -pub trait MultiAssetConverter: - MatchesFungibles -where - AssetId: Clone, - Balance: Clone, - ConvertAssetId: MaybeEquivalence, - ConvertBalance: MaybeEquivalence, -{ - fn convert_ref( - value: impl Borrow<(AssetId, Balance)>, - ) -> Result; -} - -/// Checks for `MultiLocation`. -pub trait MatchesMultiLocation: - MatchesFungibles -where - AssetId: Clone, - Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, - ConvertBalance: MaybeEquivalence, -{ - fn contains(location: &MultiLocation) -> bool; -} - -impl< - AssetId: Clone, - Balance: Clone, - ConvertAssetId: MaybeEquivalence, - ConvertBalance: MaybeEquivalence, - > MultiAssetConverter - for ConvertedConcreteId -{ - fn convert_ref( - value: impl Borrow<(AssetId, Balance)>, - ) -> Result { - let (asset_id, balance) = value.borrow(); - match ConvertAssetId::convert_back(asset_id) { - Some(asset_id_as_multilocation) => match ConvertBalance::convert_back(balance) { - Some(amount) => Ok((asset_id_as_multilocation, amount).into()), - None => Err(FungiblesAccessError::AmountToBalanceConversionFailed), - }, - None => Err(FungiblesAccessError::AssetIdConversionFailed), - } - } -} - -impl< - AssetId: Clone, - Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, - ConvertBalance: MaybeEquivalence, - > MultiAssetConverter - for MatchedConvertedConcreteId -{ - fn convert_ref( - value: impl Borrow<(AssetId, Balance)>, - ) -> Result { - let (asset_id, balance) = value.borrow(); - match ConvertAssetId::convert_back(asset_id) { - Some(asset_id_as_multilocation) => match ConvertBalance::convert_back(balance) { - Some(amount) => Ok((asset_id_as_multilocation, amount).into()), - None => Err(FungiblesAccessError::AmountToBalanceConversionFailed), - }, - None => Err(FungiblesAccessError::AssetIdConversionFailed), - } - } -} - -impl< - AssetId: Clone, - Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, - ConvertBalance: MaybeEquivalence, - > MatchesMultiLocation - for MatchedConvertedConcreteId -{ - fn contains(location: &MultiLocation) -> bool { - MatchAssetId::contains(location) - } -} - -#[impl_trait_for_tuples::impl_for_tuples(30)] -impl< - AssetId: Clone, - Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, - ConvertBalance: MaybeEquivalence, - > MatchesMultiLocation for Tuple -{ - fn contains(location: &MultiLocation) -> bool { - for_tuples!( #( - match Tuple::contains(location) { o @ true => return o, _ => () } - )* ); - log::trace!(target: "xcm::contains", "did not match location: {:?}", &location); - false - } -} - -/// Helper function to convert collections with [`(AssetId, Balance)`] to [`MultiAsset`] -pub fn convert<'a, AssetId, Balance, ConvertAssetId, ConvertBalance, Converter>( - items: impl Iterator, -) -> Result, FungiblesAccessError> -where - AssetId: Clone + 'a, - Balance: Clone + 'a, - ConvertAssetId: MaybeEquivalence, - ConvertBalance: MaybeEquivalence, - Converter: MultiAssetConverter, -{ - items.map(Converter::convert_ref).collect() -} - -/// Helper function to convert `Balance` with MultiLocation` to `MultiAsset` -pub fn convert_balance< - T: frame_support::pallet_prelude::Get, - Balance: TryInto, ->( - balance: Balance, -) -> Result { - match balance.try_into() { - Ok(balance) => Ok((T::get(), balance).into()), - Err(_) => Err(FungiblesAccessError::AmountToBalanceConversionFailed), - } -} - -#[cfg(test)] -mod tests { - use super::*; - use frame_support::traits::Everything; - - use xcm::latest::prelude::*; - use xcm_executor::traits::{Identity, JustTry}; - - type Converter = MatchedConvertedConcreteId; - - #[test] - fn converted_concrete_id_fungible_multi_asset_conversion_roundtrip_works() { - let location = MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32])))); - let amount = 123456_u64; - let expected_multi_asset = MultiAsset { - id: Concrete(MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32]))))), - fun: Fungible(123456_u128), - }; - - assert_eq!( - Converter::matches_fungibles(&expected_multi_asset).map_err(|_| ()), - Ok((location, amount)) - ); - - assert_eq!(Converter::convert_ref((location, amount)), Ok(expected_multi_asset)); - } - - #[test] - fn converted_concrete_id_fungible_multi_asset_conversion_collection_works() { - let data = vec![ - (MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32])))), 123456_u64), - (MultiLocation::new(1, X1(GlobalConsensus(ByGenesis([1; 32])))), 654321_u64), - ]; - - let expected_data = vec![ - MultiAsset { - id: Concrete(MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32]))))), - fun: Fungible(123456_u128), - }, - MultiAsset { - id: Concrete(MultiLocation::new(1, X1(GlobalConsensus(ByGenesis([1; 32]))))), - fun: Fungible(654321_u128), - }, - ]; - - assert_eq!(convert::<_, _, _, _, Converter>(data.iter()), Ok(expected_data)); - } -} diff --git a/cumulus/parachains/runtimes/assets/common/src/lib.rs b/cumulus/parachains/runtimes/assets/common/src/lib.rs deleted file mode 100644 index 25ab296ff1c6..000000000000 --- a/cumulus/parachains/runtimes/assets/common/src/lib.rs +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#![cfg_attr(not(feature = "std"), no_std)] - -pub mod foreign_creators; -pub mod fungible_conversion; -pub mod local_and_foreign_assets; -pub mod matching; -pub mod runtime_api; - -use crate::matching::{Equals, LocalMultiLocationPattern, ParentLocation, StartsWith}; -use frame_support::traits::EverythingBut; -use parachains_common::AssetIdForTrustBackedAssets; -use xcm::prelude::MultiLocation; -use xcm_builder::{AsPrefixedGeneralIndex, MatchedConvertedConcreteId}; -use xcm_executor::traits::{Identity, JustTry}; - -/// `MultiLocation` vs `AssetIdForTrustBackedAssets` converter for `TrustBackedAssets` -pub type AssetIdForTrustBackedAssetsConvert = - AsPrefixedGeneralIndex; - -/// [`MatchedConvertedConcreteId`] converter dedicated for `TrustBackedAssets` -pub type TrustBackedAssetsConvertedConcreteId = - MatchedConvertedConcreteId< - AssetIdForTrustBackedAssets, - Balance, - StartsWith, - AssetIdForTrustBackedAssetsConvert, - JustTry, - >; - -/// AssetId used for identifying assets by MultiLocation. -pub type MultiLocationForAssetId = MultiLocation; - -/// [`MatchedConvertedConcreteId`] converter dedicated for storing `AssetId` as `MultiLocation`. -pub type MultiLocationConvertedConcreteId = - MatchedConvertedConcreteId< - MultiLocationForAssetId, - Balance, - MultiLocationFilter, - Identity, - JustTry, - >; - -/// [`MatchedConvertedConcreteId`] converter dedicated for storing `ForeignAssets` with `AssetId` as -/// `MultiLocation`. -/// -/// Excludes by default: -/// - parent as relay chain -/// - all local MultiLocations -/// -/// `AdditionalMultiLocationExclusionFilter` can customize additional excluded MultiLocations -pub type ForeignAssetsConvertedConcreteId = - MultiLocationConvertedConcreteId< - EverythingBut<( - // Excludes relay/parent chain currency - Equals, - // Here we rely on fact that something like this works: - // assert!(MultiLocation::new(1, - // X1(Parachain(100))).starts_with(&MultiLocation::parent())); - // assert!(X1(Parachain(100)).starts_with(&Here)); - StartsWith, - // Here we can exclude more stuff or leave it as `()` - AdditionalMultiLocationExclusionFilter, - )>, - Balance, - >; - -type AssetIdForPoolAssets = u32; -/// `MultiLocation` vs `AssetIdForPoolAssets` converter for `PoolAssets`. -pub type AssetIdForPoolAssetsConvert = - AsPrefixedGeneralIndex; -/// [`MatchedConvertedConcreteId`] converter dedicated for `PoolAssets` -pub type PoolAssetsConvertedConcreteId = - MatchedConvertedConcreteId< - AssetIdForPoolAssets, - Balance, - StartsWith, - AssetIdForPoolAssetsConvert, - JustTry, - >; - -#[cfg(test)] -mod tests { - use super::*; - use crate::matching::StartsWithExplicitGlobalConsensus; - use sp_runtime::traits::MaybeEquivalence; - use xcm::latest::prelude::*; - use xcm_executor::traits::{Error as MatchError, MatchesFungibles}; - - #[test] - fn asset_id_for_trust_backed_assets_convert_works() { - frame_support::parameter_types! { - pub TrustBackedAssetsPalletLocation: MultiLocation = MultiLocation::new(5, X1(PalletInstance(13))); - } - let local_asset_id = 123456789 as AssetIdForTrustBackedAssets; - let expected_reverse_ref = - MultiLocation::new(5, X2(PalletInstance(13), GeneralIndex(local_asset_id.into()))); - - assert_eq!( - AssetIdForTrustBackedAssetsConvert::::convert_back( - &local_asset_id - ) - .unwrap(), - expected_reverse_ref - ); - assert_eq!( - AssetIdForTrustBackedAssetsConvert::::convert( - &expected_reverse_ref - ) - .unwrap(), - local_asset_id - ); - } - - #[test] - fn trust_backed_assets_match_fungibles_works() { - frame_support::parameter_types! { - pub TrustBackedAssetsPalletLocation: MultiLocation = MultiLocation::new(0, X1(PalletInstance(13))); - } - // setup convert - type TrustBackedAssetsConvert = - TrustBackedAssetsConvertedConcreteId; - - let test_data = vec![ - // missing GeneralIndex - (ma_1000(0, X1(PalletInstance(13))), Err(MatchError::AssetIdConversionFailed)), - ( - ma_1000(0, X2(PalletInstance(13), GeneralKey { data: [0; 32], length: 32 })), - Err(MatchError::AssetIdConversionFailed), - ), - ( - ma_1000(0, X2(PalletInstance(13), Parachain(1000))), - Err(MatchError::AssetIdConversionFailed), - ), - // OK - (ma_1000(0, X2(PalletInstance(13), GeneralIndex(1234))), Ok((1234, 1000))), - ( - ma_1000(0, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), - Ok((1234, 1000)), - ), - ( - ma_1000( - 0, - X4( - PalletInstance(13), - GeneralIndex(1234), - GeneralIndex(2222), - GeneralKey { data: [0; 32], length: 32 }, - ), - ), - Ok((1234, 1000)), - ), - // wrong pallet instance - ( - ma_1000(0, X2(PalletInstance(77), GeneralIndex(1234))), - Err(MatchError::AssetNotHandled), - ), - ( - ma_1000(0, X3(PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222))), - Err(MatchError::AssetNotHandled), - ), - // wrong parent - ( - ma_1000(1, X2(PalletInstance(13), GeneralIndex(1234))), - Err(MatchError::AssetNotHandled), - ), - ( - ma_1000(1, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), - Err(MatchError::AssetNotHandled), - ), - ( - ma_1000(1, X2(PalletInstance(77), GeneralIndex(1234))), - Err(MatchError::AssetNotHandled), - ), - ( - ma_1000(1, X3(PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222))), - Err(MatchError::AssetNotHandled), - ), - // wrong parent - ( - ma_1000(2, X2(PalletInstance(13), GeneralIndex(1234))), - Err(MatchError::AssetNotHandled), - ), - ( - ma_1000(2, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), - Err(MatchError::AssetNotHandled), - ), - // missing GeneralIndex - (ma_1000(0, X1(PalletInstance(77))), Err(MatchError::AssetNotHandled)), - (ma_1000(1, X1(PalletInstance(13))), Err(MatchError::AssetNotHandled)), - (ma_1000(2, X1(PalletInstance(13))), Err(MatchError::AssetNotHandled)), - ]; - - for (multi_asset, expected_result) in test_data { - assert_eq!( - >::matches_fungibles(&multi_asset), - expected_result, "multi_asset: {:?}", multi_asset); - } - } - - #[test] - fn multi_location_converted_concrete_id_converter_works() { - frame_support::parameter_types! { - pub Parachain100Pattern: MultiLocation = MultiLocation::new(1, X1(Parachain(100))); - pub UniversalLocationNetworkId: NetworkId = NetworkId::ByGenesis([9; 32]); - } - - // setup convert - type Convert = ForeignAssetsConvertedConcreteId< - ( - StartsWith, - StartsWithExplicitGlobalConsensus, - ), - u128, - >; - - let test_data = vec![ - // excluded as local - (ma_1000(0, Here), Err(MatchError::AssetNotHandled)), - (ma_1000(0, X1(Parachain(100))), Err(MatchError::AssetNotHandled)), - ( - ma_1000(0, X2(PalletInstance(13), GeneralIndex(1234))), - Err(MatchError::AssetNotHandled), - ), - // excluded as parent - (ma_1000(1, Here), Err(MatchError::AssetNotHandled)), - // excluded as additional filter - Parachain100Pattern - (ma_1000(1, X1(Parachain(100))), Err(MatchError::AssetNotHandled)), - (ma_1000(1, X2(Parachain(100), GeneralIndex(1234))), Err(MatchError::AssetNotHandled)), - ( - ma_1000(1, X3(Parachain(100), PalletInstance(13), GeneralIndex(1234))), - Err(MatchError::AssetNotHandled), - ), - // excluded as additional filter - StartsWithExplicitGlobalConsensus - ( - ma_1000(1, X1(GlobalConsensus(NetworkId::ByGenesis([9; 32])))), - Err(MatchError::AssetNotHandled), - ), - ( - ma_1000(2, X1(GlobalConsensus(NetworkId::ByGenesis([9; 32])))), - Err(MatchError::AssetNotHandled), - ), - ( - ma_1000( - 2, - X3( - GlobalConsensus(NetworkId::ByGenesis([9; 32])), - Parachain(200), - GeneralIndex(1234), - ), - ), - Err(MatchError::AssetNotHandled), - ), - // ok - (ma_1000(1, X1(Parachain(200))), Ok((MultiLocation::new(1, X1(Parachain(200))), 1000))), - (ma_1000(2, X1(Parachain(200))), Ok((MultiLocation::new(2, X1(Parachain(200))), 1000))), - ( - ma_1000(1, X2(Parachain(200), GeneralIndex(1234))), - Ok((MultiLocation::new(1, X2(Parachain(200), GeneralIndex(1234))), 1000)), - ), - ( - ma_1000(2, X2(Parachain(200), GeneralIndex(1234))), - Ok((MultiLocation::new(2, X2(Parachain(200), GeneralIndex(1234))), 1000)), - ), - ( - ma_1000(2, X1(GlobalConsensus(NetworkId::ByGenesis([7; 32])))), - Ok(( - MultiLocation::new(2, X1(GlobalConsensus(NetworkId::ByGenesis([7; 32])))), - 1000, - )), - ), - ( - ma_1000( - 2, - X3( - GlobalConsensus(NetworkId::ByGenesis([7; 32])), - Parachain(200), - GeneralIndex(1234), - ), - ), - Ok(( - MultiLocation::new( - 2, - X3( - GlobalConsensus(NetworkId::ByGenesis([7; 32])), - Parachain(200), - GeneralIndex(1234), - ), - ), - 1000, - )), - ), - ]; - - for (multi_asset, expected_result) in test_data { - assert_eq!( - >::matches_fungibles( - &multi_asset - ), - expected_result, - "multi_asset: {:?}", - multi_asset - ); - } - } - - // Create MultiAsset - fn ma_1000(parents: u8, interior: Junctions) -> MultiAsset { - (MultiLocation::new(parents, interior), 1000).into() - } -} diff --git a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs deleted file mode 100644 index 72fd9e7a9165..000000000000 --- a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use frame_support::{ - pallet_prelude::DispatchError, - traits::{ - fungibles::{Balanced, Create, HandleImbalanceDrop, Inspect, Mutate, Unbalanced}, - tokens::{ - DepositConsequence, Fortitude, Precision, Preservation, Provenance, WithdrawConsequence, - }, - AccountTouch, Contains, ContainsPair, Get, PalletInfoAccess, - }, -}; -use pallet_asset_conversion::{MultiAssetIdConversionResult, MultiAssetIdConverter}; -use parachains_common::AccountId; -use sp_runtime::{traits::MaybeEquivalence, DispatchResult}; -use sp_std::{boxed::Box, marker::PhantomData}; -use xcm::latest::MultiLocation; - -pub struct MultiLocationConverter, MultiLocationMatcher> { - _phantom: PhantomData<(NativeAssetLocation, MultiLocationMatcher)>, -} - -impl - MultiAssetIdConverter, MultiLocation> - for MultiLocationConverter -where - NativeAssetLocation: Get, - MultiLocationMatcher: Contains, -{ - fn get_native() -> Box { - Box::new(NativeAssetLocation::get()) - } - - fn is_native(asset_id: &Box) -> bool { - *asset_id == Self::get_native() - } - - fn try_convert( - asset_id: &Box, - ) -> MultiAssetIdConversionResult, MultiLocation> { - if Self::is_native(&asset_id) { - return MultiAssetIdConversionResult::Native - } - - if MultiLocationMatcher::contains(&asset_id) { - MultiAssetIdConversionResult::Converted(*asset_id.clone()) - } else { - MultiAssetIdConversionResult::Unsupported(asset_id.clone()) - } - } -} - -pub trait MatchesLocalAndForeignAssetsMultiLocation { - fn is_local(location: &MultiLocation) -> bool; - fn is_foreign(location: &MultiLocation) -> bool; -} - -pub struct LocalAndForeignAssets { - _phantom: PhantomData<(Assets, LocalAssetIdConverter, ForeignAssets)>, -} - -impl Unbalanced - for LocalAndForeignAssets -where - Assets: Inspect - + Unbalanced - + Balanced - + PalletInfoAccess, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Inspect - + Unbalanced - + Balanced, -{ - fn handle_dust(dust: frame_support::traits::fungibles::Dust) { - let credit = dust.into_credit(); - - if let Some(asset) = LocalAssetIdConverter::convert(&credit.asset()) { - Assets::handle_raw_dust(asset, credit.peek()); - } else { - ForeignAssets::handle_raw_dust(credit.asset(), credit.peek()); - } - - // As we have already handled the dust, we must stop credit's drop from happening: - sp_std::mem::forget(credit); - } - - fn write_balance( - asset: >::AssetId, - who: &AccountId, - amount: >::Balance, - ) -> Result>::Balance>, DispatchError> { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::write_balance(asset, who, amount) - } else { - ForeignAssets::write_balance(asset, who, amount) - } - } - - /// Set the total issuance of `asset` to `amount`. - fn set_total_issuance(asset: Self::AssetId, amount: Self::Balance) { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::set_total_issuance(asset, amount) - } else { - ForeignAssets::set_total_issuance(asset, amount) - } - } - - fn decrease_balance( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - precision: Precision, - preservation: Preservation, - force: Fortitude, - ) -> Result { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::decrease_balance(asset, who, amount, precision, preservation, force) - } else { - ForeignAssets::decrease_balance(asset, who, amount, precision, preservation, force) - } - } - - fn increase_balance( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - precision: Precision, - ) -> Result { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::increase_balance(asset, who, amount, precision) - } else { - ForeignAssets::increase_balance(asset, who, amount, precision) - } - } -} - -impl Inspect - for LocalAndForeignAssets -where - Assets: Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Inspect, -{ - type AssetId = MultiLocation; - type Balance = u128; - - /// The total amount of issuance in the system. - fn total_issuance(asset: Self::AssetId) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::total_issuance(asset) - } else { - ForeignAssets::total_issuance(asset) - } - } - - /// The minimum balance any single account may have. - fn minimum_balance(asset: Self::AssetId) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::minimum_balance(asset) - } else { - ForeignAssets::minimum_balance(asset) - } - } - - fn total_balance( - asset: >::AssetId, - account: &AccountId, - ) -> >::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::total_balance(asset, account) - } else { - ForeignAssets::total_balance(asset, account) - } - } - - /// Get the `asset` balance of `who`. - fn balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::balance(asset, who) - } else { - ForeignAssets::balance(asset, who) - } - } - - /// Get the maximum amount of `asset` that `who` can withdraw/transfer successfully. - fn reducible_balance( - asset: Self::AssetId, - who: &AccountId, - presevation: Preservation, - fortitude: Fortitude, - ) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::reducible_balance(asset, who, presevation, fortitude) - } else { - ForeignAssets::reducible_balance(asset, who, presevation, fortitude) - } - } - - /// Returns `true` if the `asset` balance of `who` may be increased by `amount`. - /// - /// - `asset`: The asset that should be deposited. - /// - `who`: The account of which the balance should be increased by `amount`. - /// - `amount`: How much should the balance be increased? - /// - `mint`: Will `amount` be minted to deposit it into `account`? - fn can_deposit( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - mint: Provenance, - ) -> DepositConsequence { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::can_deposit(asset, who, amount, mint) - } else { - ForeignAssets::can_deposit(asset, who, amount, mint) - } - } - - /// Returns `Failed` if the `asset` balance of `who` may not be decreased by `amount`, otherwise - /// the consequence. - fn can_withdraw( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - ) -> WithdrawConsequence { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::can_withdraw(asset, who, amount) - } else { - ForeignAssets::can_withdraw(asset, who, amount) - } - } - - /// Returns `true` if an `asset` exists. - fn asset_exists(asset: Self::AssetId) -> bool { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::asset_exists(asset) - } else { - ForeignAssets::asset_exists(asset) - } - } -} - -impl Mutate - for LocalAndForeignAssets -where - Assets: Mutate - + Inspect - + Balanced - + PalletInfoAccess, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Mutate - + Inspect - + Balanced, -{ - /// Transfer funds from one account into another. - fn transfer( - asset: MultiLocation, - source: &AccountId, - dest: &AccountId, - amount: Self::Balance, - keep_alive: Preservation, - ) -> Result { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset) { - Assets::transfer(asset_id, source, dest, amount, keep_alive) - } else { - ForeignAssets::transfer(asset, source, dest, amount, keep_alive) - } - } -} - -impl Create - for LocalAndForeignAssets -where - Assets: Create + Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Create + Inspect, -{ - /// Create a new fungible asset. - fn create( - asset_id: Self::AssetId, - admin: AccountId, - is_sufficient: bool, - min_balance: Self::Balance, - ) -> DispatchResult { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { - Assets::create(asset_id, admin, is_sufficient, min_balance) - } else { - ForeignAssets::create(asset_id, admin, is_sufficient, min_balance) - } - } -} - -impl AccountTouch - for LocalAndForeignAssets -where - Assets: AccountTouch, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: AccountTouch, -{ - type Balance = u128; - - fn deposit_required( - asset_id: MultiLocation, - ) -> >::Balance { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { - Assets::deposit_required(asset_id) - } else { - ForeignAssets::deposit_required(asset_id) - } - } - - fn touch( - asset_id: MultiLocation, - who: AccountId, - depositor: AccountId, - ) -> Result<(), DispatchError> { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { - Assets::touch(asset_id, who, depositor) - } else { - ForeignAssets::touch(asset_id, who, depositor) - } - } -} - -/// Implements [`ContainsPair`] trait for a pair of asset and account IDs. -impl ContainsPair - for LocalAndForeignAssets -where - Assets: PalletInfoAccess + ContainsPair, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: ContainsPair, -{ - /// Check if an account with the given asset ID and account address exists. - fn contains(asset_id: &MultiLocation, who: &AccountId) -> bool { - if let Some(asset_id) = LocalAssetIdConverter::convert(asset_id) { - Assets::contains(&asset_id, &who) - } else { - ForeignAssets::contains(&asset_id, &who) - } - } -} - -impl Balanced - for LocalAndForeignAssets -where - Assets: - Balanced + Inspect + PalletInfoAccess, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: - Balanced + Inspect, -{ - type OnDropDebt = DebtDropIndirection; - type OnDropCredit = CreditDropIndirection; -} - -pub struct DebtDropIndirection { - _phantom: PhantomData>, -} - -impl HandleImbalanceDrop - for DebtDropIndirection -where - Assets: Balanced + Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: - Balanced + Inspect, -{ - fn handle(asset: MultiLocation, amount: u128) { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset) { - Assets::OnDropDebt::handle(asset_id, amount); - } else { - ForeignAssets::OnDropDebt::handle(asset, amount); - } - } -} - -pub struct CreditDropIndirection { - _phantom: PhantomData>, -} - -impl HandleImbalanceDrop - for CreditDropIndirection -where - Assets: Balanced + Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: - Balanced + Inspect, -{ - fn handle(asset: MultiLocation, amount: u128) { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset) { - Assets::OnDropCredit::handle(asset_id, amount); - } else { - ForeignAssets::OnDropCredit::handle(asset, amount); - } - } -} - -#[cfg(test)] -mod tests { - use crate::{ - local_and_foreign_assets::MultiLocationConverter, matching::StartsWith, - AssetIdForPoolAssetsConvert, AssetIdForTrustBackedAssetsConvert, - }; - use frame_support::traits::EverythingBut; - use pallet_asset_conversion::{MultiAssetIdConversionResult, MultiAssetIdConverter}; - use sp_runtime::traits::MaybeEquivalence; - use xcm::latest::prelude::*; - - #[test] - fn test_multi_location_converter_works() { - frame_support::parameter_types! { - pub const WestendLocation: MultiLocation = MultiLocation::parent(); - pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(50_u8).into(); - pub PoolAssetsPalletLocation: MultiLocation = PalletInstance(55_u8).into(); - } - - type C = MultiLocationConverter< - WestendLocation, - EverythingBut>, - >; - - let native_asset = WestendLocation::get(); - let local_asset = - AssetIdForTrustBackedAssetsConvert::::convert_back( - &123, - ) - .unwrap(); - let pool_asset = - AssetIdForPoolAssetsConvert::::convert_back(&456).unwrap(); - let foreign_asset1 = MultiLocation { parents: 1, interior: X1(Parachain(2222)) }; - let foreign_asset2 = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(2222)), - }; - - assert!(C::is_native(&Box::new(native_asset))); - assert!(!C::is_native(&Box::new(local_asset))); - assert!(!C::is_native(&Box::new(pool_asset))); - assert!(!C::is_native(&Box::new(foreign_asset1))); - assert!(!C::is_native(&Box::new(foreign_asset2))); - - assert_eq!(C::try_convert(&Box::new(native_asset)), MultiAssetIdConversionResult::Native); - assert_eq!( - C::try_convert(&Box::new(local_asset)), - MultiAssetIdConversionResult::Converted(local_asset) - ); - assert_eq!( - C::try_convert(&Box::new(pool_asset)), - MultiAssetIdConversionResult::Unsupported(Box::new(pool_asset)) - ); - assert_eq!( - C::try_convert(&Box::new(foreign_asset1)), - MultiAssetIdConversionResult::Converted(foreign_asset1) - ); - assert_eq!( - C::try_convert(&Box::new(foreign_asset2)), - MultiAssetIdConversionResult::Converted(foreign_asset2) - ); - } -} diff --git a/cumulus/parachains/runtimes/assets/common/src/matching.rs b/cumulus/parachains/runtimes/assets/common/src/matching.rs deleted file mode 100644 index 964f25cda351..000000000000 --- a/cumulus/parachains/runtimes/assets/common/src/matching.rs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use cumulus_primitives_core::ParaId; -use frame_support::{ - pallet_prelude::Get, - traits::{Contains, ContainsPair}, -}; -use xcm::{ - latest::prelude::{MultiAsset, MultiLocation}, - prelude::*, -}; - -pub struct StartsWith(sp_std::marker::PhantomData); -impl> Contains for StartsWith { - fn contains(t: &MultiLocation) -> bool { - t.starts_with(&Location::get()) - } -} - -pub struct Equals(sp_std::marker::PhantomData); -impl> Contains for Equals { - fn contains(t: &MultiLocation) -> bool { - t == &Location::get() - } -} - -pub struct StartsWithExplicitGlobalConsensus(sp_std::marker::PhantomData); -impl> Contains - for StartsWithExplicitGlobalConsensus -{ - fn contains(t: &MultiLocation) -> bool { - matches!(t.interior.global_consensus(), Ok(requested_network) if requested_network.eq(&Network::get())) - } -} - -frame_support::parameter_types! { - pub LocalMultiLocationPattern: MultiLocation = MultiLocation::new(0, Here); - pub ParentLocation: MultiLocation = MultiLocation::parent(); -} - -/// Accepts an asset if it is from the origin. -pub struct IsForeignConcreteAsset(sp_std::marker::PhantomData); -impl> ContainsPair - for IsForeignConcreteAsset -{ - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - log::trace!(target: "xcm::contains", "IsForeignConcreteAsset asset: {:?}, origin: {:?}", asset, origin); - matches!(asset.id, Concrete(ref id) if IsForeign::contains(id, origin)) - } -} - -/// Checks if `a` is from sibling location `b`. Checks that `MultiLocation-a` starts with -/// `MultiLocation-b`, and that the `ParaId` of `b` is not equal to `a`. -pub struct FromSiblingParachain(sp_std::marker::PhantomData); -impl> ContainsPair - for FromSiblingParachain -{ - fn contains(&a: &MultiLocation, b: &MultiLocation) -> bool { - // `a` needs to be from `b` at least - if !a.starts_with(b) { - return false - } - - // here we check if sibling - match a { - MultiLocation { parents: 1, interior } => - matches!(interior.first(), Some(Parachain(sibling_para_id)) if sibling_para_id.ne(&u32::from(SelfParaId::get()))), - _ => false, - } - } -} diff --git a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs b/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs deleted file mode 100644 index 96e3605fb894..000000000000 --- a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Runtime API definition for fungibles. - -use codec::{Codec, Decode, Encode}; -use frame_support::RuntimeDebug; -#[cfg(feature = "std")] -use {sp_std::vec::Vec, xcm::latest::MultiAsset}; - -/// The possible errors that can happen querying the storage of assets. -#[derive(Eq, PartialEq, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] -pub enum FungiblesAccessError { - /// `MultiLocation` to `AssetId`/`ClassId` conversion failed. - AssetIdConversionFailed, - /// `u128` amount to currency `Balance` conversion failed. - AmountToBalanceConversionFailed, -} - -sp_api::decl_runtime_apis! { - /// The API for querying account's balances from runtime. - #[api_version(2)] - pub trait FungiblesApi - where - AccountId: Codec, - { - /// Returns the list of all [`MultiAsset`] that an `AccountId` has. - #[changed_in(2)] - fn query_account_balances(account: AccountId) -> Result, FungiblesAccessError>; - - /// Returns the list of all [`MultiAsset`] that an `AccountId` has. - fn query_account_balances(account: AccountId) -> Result; - } -} diff --git a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml deleted file mode 100644 index 1aaf608d4d8a..000000000000 --- a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml +++ /dev/null @@ -1,76 +0,0 @@ -[package] -name = "asset-test-utils" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Test utils for Asset Hub runtimes." - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -assets-common = { path = "../common", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-parachain-inherent = { path = "../../../../primitives/parachain-inherent", default-features = false } -cumulus-test-relay-sproof-builder = { path = "../../../../test/relay-sproof-builder", default-features = false } -parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } -parachains-runtimes-test-utils = { path = "../../test-utils", default-features = false } - -# Polkadot -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -[dev-dependencies] -hex-literal = "0.4.1" - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = [ "std" ] -std = [ - "cumulus-pallet-parachain-system/std", - "cumulus-primitives-core/std", - "cumulus-test-relay-sproof-builder/std", - "cumulus-primitives-parachain-inherent/std", - "frame-support/std", - "frame-system/std", - "pallet-assets/std", - "pallet-balances/std", - "cumulus-pallet-parachain-system/std", - "pallet-collator-selection/std", - "pallet-session/std", - "assets-common/std", - "parachains-common/std", - "parachain-info/std", - "parachains-runtimes-test-utils/std", - "polkadot-parachain/std", - "sp-consensus-aura/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "xcm/std", - "xcm-executor/std", - "pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-pallet-dmp-queue/std", -] diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/lib.rs b/cumulus/parachains/runtimes/assets/test-utils/src/lib.rs deleted file mode 100644 index 9a24867592e2..000000000000 --- a/cumulus/parachains/runtimes/assets/test-utils/src/lib.rs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Module contains predefined test-case scenarios for `Runtime` with various assets. - -pub mod test_cases; -pub use parachains_runtimes_test_utils::*; diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs deleted file mode 100644 index d48b02cb49bd..000000000000 --- a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ /dev/null @@ -1,1307 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Module contains predefined test-case scenarios for `Runtime` with various assets. - -use codec::Encode; -use frame_support::{ - assert_noop, assert_ok, - traits::{fungibles::InspectEnumerable, Get, OriginTrait}, - weights::Weight, -}; -use parachains_common::Balance; -use parachains_runtimes_test_utils::{ - assert_metadata, assert_total, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, - RuntimeHelper, ValidatorIdOf, XcmReceivedFrom, -}; -use sp_runtime::{ - traits::{MaybeEquivalence, StaticLookup, Zero}, - DispatchError, Saturating, -}; -use xcm::latest::prelude::*; -use xcm_executor::{traits::ConvertLocation, XcmExecutor}; - -// Re-export test_case from `parachains-runtimes-test-utils` -pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; - -/// Test-case makes sure that `Runtime` can receive native asset from relay chain -/// and can teleport it back and to the other parachains -pub fn teleports_for_native_asset_works< - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - HrmpChannelOpener, ->( - collator_session_keys: CollatorSessionKeys, - existential_deposit: BalanceOf, - target_account: AccountIdOf, - unwrap_pallet_xcm_event: Box) -> Option>>, - unwrap_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, - runtime_para_id: u32, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From + Into, - WeightToFee: frame_support::weights::WeightToFee, - ::Balance: From + Into, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - XcmConfig: xcm_executor::Config, - CheckingAccount: Get>, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .build() - .execute_with(|| { - // check Balances before - assert_eq!(>::free_balance(&target_account), 0.into()); - assert_eq!( - >::free_balance(&CheckingAccount::get()), - 0.into() - ); - - let native_asset_id = MultiLocation::parent(); - let buy_execution_fee_amount_eta = - WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); - let native_asset_amount_unit = existential_deposit; - let native_asset_amount_received = - native_asset_amount_unit * 10.into() + buy_execution_fee_amount_eta.into(); - - // 1. process received teleported assets from relaychain - let xcm = Xcm(vec![ - ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(native_asset_id), - fun: Fungible(native_asset_amount_received.into()), - }])), - ClearOrigin, - BuyExecution { - fees: MultiAsset { - id: Concrete(native_asset_id), - fun: Fungible(buy_execution_fee_amount_eta), - }, - weight_limit: Limited(Weight::from_parts(303531000, 65536)), - }, - DepositAsset { - assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: target_account.clone().into(), - }), - }, - }, - ExpectTransactStatus(MaybeErrorCode::Success), - ]); - - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - let outcome = XcmExecutor::::execute_xcm( - Parent, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent), - ); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // check Balances after - assert_ne!(>::free_balance(&target_account), 0.into()); - assert_eq!( - >::free_balance(&CheckingAccount::get()), - 0.into() - ); - - // 2. try to teleport asset back to the relaychain - { - let dest = MultiLocation::parent(); - let dest_beneficiary = MultiLocation::parent() - .appended_with(AccountId32 { - network: None, - id: sp_runtime::AccountId32::new([3; 32]).into(), - }) - .unwrap(); - - let target_account_balance_before_teleport = - >::free_balance(&target_account); - let native_asset_to_teleport_away = native_asset_amount_unit * 3.into(); - assert!( - native_asset_to_teleport_away < - target_account_balance_before_teleport - existential_deposit - ); - - assert_ok!(RuntimeHelper::::do_teleport_assets::( - RuntimeHelper::::origin_of(target_account.clone()), - dest, - dest_beneficiary, - (native_asset_id, native_asset_to_teleport_away.into()), - None, - )); - // check balances - assert_eq!( - >::free_balance(&target_account), - target_account_balance_before_teleport - native_asset_to_teleport_away - ); - assert_eq!( - >::free_balance(&CheckingAccount::get()), - 0.into() - ); - - // check events - RuntimeHelper::::assert_pallet_xcm_event_outcome( - &unwrap_pallet_xcm_event, - |outcome| { - assert_ok!(outcome.ensure_complete()); - }, - ); - } - - // 3. try to teleport asset away to other parachain (1234) - { - let other_para_id = 1234; - let dest = MultiLocation::new(1, X1(Parachain(other_para_id))); - let dest_beneficiary = MultiLocation::new(1, X1(Parachain(other_para_id))) - .appended_with(AccountId32 { - network: None, - id: sp_runtime::AccountId32::new([3; 32]).into(), - }) - .unwrap(); - - let target_account_balance_before_teleport = - >::free_balance(&target_account); - let native_asset_to_teleport_away = native_asset_amount_unit * 3.into(); - assert!( - native_asset_to_teleport_away < - target_account_balance_before_teleport - existential_deposit - ); - - assert_ok!(RuntimeHelper::::do_teleport_assets::( - RuntimeHelper::::origin_of(target_account.clone()), - dest, - dest_beneficiary, - (native_asset_id, native_asset_to_teleport_away.into()), - Some((runtime_para_id, other_para_id)), - )); - - // check balances - assert_eq!( - >::free_balance(&target_account), - target_account_balance_before_teleport - native_asset_to_teleport_away - ); - assert_eq!( - >::free_balance(&CheckingAccount::get()), - 0.into() - ); - - // check events - RuntimeHelper::::assert_pallet_xcm_event_outcome( - &unwrap_pallet_xcm_event, - |outcome| { - assert_ok!(outcome.ensure_complete()); - }, - ); - assert!(RuntimeHelper::::xcmp_queue_message_sent(unwrap_xcmp_queue_event) - .is_some()); - } - }) -} - -#[macro_export] -macro_rules! include_teleports_for_native_asset_works( - ( - $runtime:path, - $xcm_config:path, - $checking_account:path, - $weight_to_fee:path, - $hrmp_channel_opener:path, - $collator_session_key:expr, - $existential_deposit:expr, - $unwrap_pallet_xcm_event:expr, - $unwrap_xcmp_queue_event:expr, - $runtime_para_id:expr - ) => { - #[test] - fn teleports_for_native_asset_works() { - const BOB: [u8; 32] = [2u8; 32]; - let target_account = parachains_common::AccountId::from(BOB); - - $crate::test_cases::teleports_for_native_asset_works::< - $runtime, - $xcm_config, - $checking_account, - $weight_to_fee, - $hrmp_channel_opener - >( - $collator_session_key, - $existential_deposit, - target_account, - $unwrap_pallet_xcm_event, - $unwrap_xcmp_queue_event, - $runtime_para_id - ) - } - } -); - -/// Test-case makes sure that `Runtime` can receive teleported assets from sibling parachain relay -/// chain -pub fn teleports_for_foreign_assets_works< - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - HrmpChannelOpener, - SovereignAccountOf, - ForeignAssetsPalletInstance, ->( - collator_session_keys: CollatorSessionKeys, - target_account: AccountIdOf, - existential_deposit: BalanceOf, - asset_owner: AccountIdOf, - unwrap_pallet_xcm_event: Box) -> Option>>, - unwrap_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_assets::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, - CheckingAccount: Get>, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - WeightToFee: frame_support::weights::WeightToFee, - ::Balance: From + Into, - SovereignAccountOf: ConvertLocation>, - >::AssetId: - From + Into, - >::AssetIdParameter: - From + Into, - >::Balance: - From + Into, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - ForeignAssetsPalletInstance: 'static, -{ - // foreign parachain with the same consenus currency as asset - let foreign_para_id = 2222; - let foreign_asset_id_multilocation = MultiLocation { - parents: 1, - interior: X2(Parachain(foreign_para_id), GeneralIndex(1234567)), - }; - - // foreign creator, which can be sibling parachain to match ForeignCreators - let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(foreign_para_id)) }; - let foreign_creator_as_account_id = - SovereignAccountOf::convert_location(&foreign_creator).expect(""); - - // we want to buy execution with local relay chain currency - let buy_execution_fee_amount = - WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); - let buy_execution_fee = MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(buy_execution_fee_amount), - }; - - let teleported_foreign_asset_amount = 10000000000000; - let runtime_para_id = 1000; - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_balances(vec![ - ( - foreign_creator_as_account_id, - existential_deposit + (buy_execution_fee_amount * 2).into(), - ), - (target_account.clone(), existential_deposit), - (CheckingAccount::get(), existential_deposit), - ]) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - // checks target_account before - assert_eq!( - >::free_balance(&target_account), - existential_deposit - ); - assert_eq!( - >::free_balance(&CheckingAccount::get()), - existential_deposit - ); - // check `CheckingAccount` before - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &target_account - ), - 0.into() - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &CheckingAccount::get() - ), - 0.into() - ); - // check totals before - assert_total::< - pallet_assets::Pallet, - AccountIdOf, - >(foreign_asset_id_multilocation, 0, 0); - - // create foreign asset (0 total issuance) - let asset_minimum_asset_balance = 3333333_u128; - assert_ok!( - >::force_create( - RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.into(), - asset_owner.into(), - false, - asset_minimum_asset_balance.into() - ) - ); - assert_total::< - pallet_assets::Pallet, - AccountIdOf, - >(foreign_asset_id_multilocation, 0, 0); - assert!(teleported_foreign_asset_amount > asset_minimum_asset_balance); - - // 1. process received teleported assets from relaychain - let xcm = Xcm(vec![ - // BuyExecution with relaychain native token - WithdrawAsset(buy_execution_fee.clone().into()), - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(buy_execution_fee_amount), - }, - weight_limit: Limited(Weight::from_parts(403531000, 65536)), - }, - // Process teleported asset - ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(foreign_asset_id_multilocation), - fun: Fungible(teleported_foreign_asset_amount), - }])), - DepositAsset { - assets: Wild(AllOf { - id: Concrete(foreign_asset_id_multilocation), - fun: WildFungibility::Fungible, - }), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: target_account.clone().into(), - }), - }, - }, - ExpectTransactStatus(MaybeErrorCode::Success), - ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - let outcome = XcmExecutor::::execute_xcm( - foreign_creator, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), - ); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // checks target_account after - assert_eq!( - >::free_balance(&target_account), - existential_deposit - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &target_account - ), - teleported_foreign_asset_amount.into() - ); - // checks `CheckingAccount` after - assert_eq!( - >::free_balance(&CheckingAccount::get()), - existential_deposit - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &CheckingAccount::get() - ), - 0.into() - ); - // check total after (twice: target_account + CheckingAccount) - assert_total::< - pallet_assets::Pallet, - AccountIdOf, - >( - foreign_asset_id_multilocation, - teleported_foreign_asset_amount, - teleported_foreign_asset_amount, - ); - - // 2. try to teleport asset back to source parachain (foreign_para_id) - { - let dest = MultiLocation::new(1, X1(Parachain(foreign_para_id))); - let dest_beneficiary = MultiLocation::new(1, X1(Parachain(foreign_para_id))) - .appended_with(AccountId32 { - network: None, - id: sp_runtime::AccountId32::new([3; 32]).into(), - }) - .unwrap(); - - let target_account_balance_before_teleport = - >::balance( - foreign_asset_id_multilocation.into(), - &target_account, - ); - let asset_to_teleport_away = asset_minimum_asset_balance * 3; - assert!( - asset_to_teleport_away < - (target_account_balance_before_teleport - - asset_minimum_asset_balance.into()) - .into() - ); - - assert_ok!(RuntimeHelper::::do_teleport_assets::( - RuntimeHelper::::origin_of(target_account.clone()), - dest, - dest_beneficiary, - (foreign_asset_id_multilocation, asset_to_teleport_away), - Some((runtime_para_id, foreign_para_id)), - )); - - // check balances - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &target_account - ), - (target_account_balance_before_teleport - asset_to_teleport_away.into()) - ); - assert_eq!( - >::balance( - foreign_asset_id_multilocation.into(), - &CheckingAccount::get() - ), - 0.into() - ); - // check total after (twice: target_account + CheckingAccount) - assert_total::< - pallet_assets::Pallet, - AccountIdOf, - >( - foreign_asset_id_multilocation, - teleported_foreign_asset_amount - asset_to_teleport_away, - teleported_foreign_asset_amount - asset_to_teleport_away, - ); - - // check events - RuntimeHelper::::assert_pallet_xcm_event_outcome( - &unwrap_pallet_xcm_event, - |outcome| { - assert_ok!(outcome.ensure_complete()); - }, - ); - assert!(RuntimeHelper::::xcmp_queue_message_sent(unwrap_xcmp_queue_event) - .is_some()); - } - }) -} - -#[macro_export] -macro_rules! include_teleports_for_foreign_assets_works( - ( - $runtime:path, - $xcm_config:path, - $checking_account:path, - $weight_to_fee:path, - $hrmp_channel_opener:path, - $sovereign_account_of:path, - $assets_pallet_instance:path, - $collator_session_key:expr, - $existential_deposit:expr, - $unwrap_pallet_xcm_event:expr, - $unwrap_xcmp_queue_event:expr - ) => { - #[test] - fn teleports_for_foreign_assets_works() { - const BOB: [u8; 32] = [2u8; 32]; - let target_account = parachains_common::AccountId::from(BOB); - const SOME_ASSET_OWNER: [u8; 32] = [5u8; 32]; - let asset_owner = parachains_common::AccountId::from(SOME_ASSET_OWNER); - - $crate::test_cases::teleports_for_foreign_assets_works::< - $runtime, - $xcm_config, - $checking_account, - $weight_to_fee, - $hrmp_channel_opener, - $sovereign_account_of, - $assets_pallet_instance - >( - $collator_session_key, - target_account, - $existential_deposit, - asset_owner, - $unwrap_pallet_xcm_event, - $unwrap_xcmp_queue_event - ) - } - } -); - -/// Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain -/// currency -pub fn asset_transactor_transfer_with_local_consensus_currency_works( - collator_session_keys: CollatorSessionKeys, - source_account: AccountIdOf, - target_account: AccountIdOf, - existential_deposit: BalanceOf, - additional_checks_before: Box, - additional_checks_after: Box, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, - ::Balance: From + Into, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, -{ - let unit = existential_deposit; - - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_balances(vec![(source_account.clone(), (BalanceOf::::from(10_u128) * unit))]) - .with_tracing() - .build() - .execute_with(|| { - // check Balances before - assert_eq!( - >::free_balance(&source_account), - (BalanceOf::::from(10_u128) * unit) - ); - assert_eq!( - >::free_balance(&target_account), - (BalanceOf::::zero() * unit) - ); - - // additional check before - additional_checks_before(); - - // transfer_asset (deposit/withdraw) ALICE -> BOB - let _ = RuntimeHelper::::do_transfer( - MultiLocation { - parents: 0, - interior: X1(AccountId32 { network: None, id: source_account.clone().into() }), - }, - MultiLocation { - parents: 0, - interior: X1(AccountId32 { network: None, id: target_account.clone().into() }), - }, - // local_consensus_currency_asset, e.g.: relaychain token (KSM, DOT, ...) - ( - MultiLocation { parents: 1, interior: Here }, - (BalanceOf::::from(1_u128) * unit).into(), - ), - ) - .expect("no error"); - - // check Balances after - assert_eq!( - >::free_balance(source_account), - (BalanceOf::::from(9_u128) * unit) - ); - assert_eq!( - >::free_balance(target_account), - (BalanceOf::::from(1_u128) * unit) - ); - - additional_checks_after(); - }) -} - -#[macro_export] -macro_rules! include_asset_transactor_transfer_with_local_consensus_currency_works( - ( - $runtime:path, - $xcm_config:path, - $collator_session_key:expr, - $existential_deposit:expr, - $additional_checks_before:expr, - $additional_checks_after:expr - ) => { - #[test] - fn asset_transactor_transfer_with_local_consensus_currency_works() { - const ALICE: [u8; 32] = [1u8; 32]; - let source_account = parachains_common::AccountId::from(ALICE); - const BOB: [u8; 32] = [2u8; 32]; - let target_account = parachains_common::AccountId::from(BOB); - - $crate::test_cases::asset_transactor_transfer_with_local_consensus_currency_works::< - $runtime, - $xcm_config - >( - $collator_session_key, - source_account, - target_account, - $existential_deposit, - $additional_checks_before, - $additional_checks_after - ) - } - } -); - -///Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain -/// currency -pub fn asset_transactor_transfer_with_pallet_assets_instance_works< - Runtime, - XcmConfig, - AssetsPalletInstance, - AssetId, - AssetIdConverter, ->( - collator_session_keys: CollatorSessionKeys, - existential_deposit: BalanceOf, - asset_id: AssetId, - asset_owner: AccountIdOf, - alice_account: AccountIdOf, - bob_account: AccountIdOf, - charlie_account: AccountIdOf, - additional_checks_before: Box, - additional_checks_after: Box, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_assets::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, - >::AssetId: - From + Into, - >::AssetIdParameter: - From + Into, - >::Balance: From + Into, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - AssetsPalletInstance: 'static, - AssetId: Clone + Copy, - AssetIdConverter: MaybeEquivalence, -{ - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_balances(vec![ - (asset_owner.clone(), existential_deposit), - (alice_account.clone(), existential_deposit), - (bob_account.clone(), existential_deposit), - ]) - .with_tracing() - .build() - .execute_with(|| { - // create some asset class - let asset_minimum_asset_balance = 3333333_u128; - let asset_id_as_multilocation = AssetIdConverter::convert_back(&asset_id).unwrap(); - assert_ok!(>::force_create( - RuntimeHelper::::root_origin(), - asset_id.into(), - asset_owner.clone().into(), - false, - asset_minimum_asset_balance.into() - )); - - // We first mint enough asset for the account to exist for assets - assert_ok!(>::mint( - RuntimeHelper::::origin_of(asset_owner.clone()), - asset_id.into(), - alice_account.clone().into(), - (6 * asset_minimum_asset_balance).into() - )); - - // check Assets before - assert_eq!( - >::balance( - asset_id.into(), - &alice_account - ), - (6 * asset_minimum_asset_balance).into() - ); - assert_eq!( - >::balance( - asset_id.into(), - &bob_account - ), - 0.into() - ); - assert_eq!( - >::balance( - asset_id.into(), - &charlie_account - ), - 0.into() - ); - assert_eq!( - >::balance( - asset_id.into(), - &asset_owner - ), - 0.into() - ); - assert_eq!( - >::free_balance(&alice_account), - existential_deposit - ); - assert_eq!( - >::free_balance(&bob_account), - existential_deposit - ); - assert_eq!( - >::free_balance(&charlie_account), - 0.into() - ); - assert_eq!( - >::free_balance(&asset_owner), - existential_deposit - ); - additional_checks_before(); - - // transfer_asset (deposit/withdraw) ALICE -> CHARLIE (not ok - Charlie does not have - // ExistentialDeposit) - assert_noop!( - RuntimeHelper::::do_transfer( - MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: alice_account.clone().into() - }), - }, - MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: charlie_account.clone().into() - }), - }, - (asset_id_as_multilocation, asset_minimum_asset_balance), - ), - XcmError::FailedToTransactAsset(Into::<&str>::into( - sp_runtime::TokenError::CannotCreate - )) - ); - - // transfer_asset (deposit/withdraw) ALICE -> BOB (ok - has ExistentialDeposit) - assert!(matches!( - RuntimeHelper::::do_transfer( - MultiLocation { - parents: 0, - interior: X1(AccountId32 { - network: None, - id: alice_account.clone().into() - }), - }, - MultiLocation { - parents: 0, - interior: X1(AccountId32 { network: None, id: bob_account.clone().into() }), - }, - (asset_id_as_multilocation, asset_minimum_asset_balance), - ), - Ok(_) - )); - - // check Assets after - assert_eq!( - >::balance( - asset_id.into(), - &alice_account - ), - (5 * asset_minimum_asset_balance).into() - ); - assert_eq!( - >::balance( - asset_id.into(), - &bob_account - ), - asset_minimum_asset_balance.into() - ); - assert_eq!( - >::balance( - asset_id.into(), - &charlie_account - ), - 0.into() - ); - assert_eq!( - >::balance( - asset_id.into(), - &asset_owner - ), - 0.into() - ); - assert_eq!( - >::free_balance(&alice_account), - existential_deposit - ); - assert_eq!( - >::free_balance(&bob_account), - existential_deposit - ); - assert_eq!( - >::free_balance(&charlie_account), - 0.into() - ); - assert_eq!( - >::free_balance(&asset_owner), - existential_deposit - ); - - additional_checks_after(); - }) -} - -#[macro_export] -macro_rules! include_asset_transactor_transfer_with_pallet_assets_instance_works( - ( - $test_name:tt, - $runtime:path, - $xcm_config:path, - $assets_pallet_instance:path, - $asset_id:path, - $asset_id_converter:path, - $collator_session_key:expr, - $existential_deposit:expr, - $tested_asset_id:expr, - $additional_checks_before:expr, - $additional_checks_after:expr - ) => { - #[test] - fn $test_name() { - const SOME_ASSET_OWNER: [u8; 32] = [5u8; 32]; - let asset_owner = parachains_common::AccountId::from(SOME_ASSET_OWNER); - const ALICE: [u8; 32] = [1u8; 32]; - let alice_account = parachains_common::AccountId::from(ALICE); - const BOB: [u8; 32] = [2u8; 32]; - let bob_account = parachains_common::AccountId::from(BOB); - const CHARLIE: [u8; 32] = [3u8; 32]; - let charlie_account = parachains_common::AccountId::from(CHARLIE); - - $crate::test_cases::asset_transactor_transfer_with_pallet_assets_instance_works::< - $runtime, - $xcm_config, - $assets_pallet_instance, - $asset_id, - $asset_id_converter - >( - $collator_session_key, - $existential_deposit, - $tested_asset_id, - asset_owner, - alice_account, - bob_account, - charlie_account, - $additional_checks_before, - $additional_checks_after - ) - } - } -); - -pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works< - Runtime, - XcmConfig, - WeightToFee, - SovereignAccountOf, - ForeignAssetsPalletInstance, - AssetId, - AssetIdConverter, ->( - collator_session_keys: CollatorSessionKeys, - existential_deposit: BalanceOf, - asset_deposit: BalanceOf, - metadata_deposit_base: BalanceOf, - metadata_deposit_per_byte: BalanceOf, - alice_account: AccountIdOf, - bob_account: AccountIdOf, - runtime_call_encode: Box< - dyn Fn(pallet_assets::Call) -> Vec, - >, - unwrap_pallet_assets_event: Box< - dyn Fn(Vec) -> Option>, - >, - additional_checks_before: Box, - additional_checks_after: Box, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_assets::Config, - AccountIdOf: Into<[u8; 32]>, - ValidatorIdOf: From>, - BalanceOf: From, - XcmConfig: xcm_executor::Config, - WeightToFee: frame_support::weights::WeightToFee, - ::Balance: From + Into, - SovereignAccountOf: ConvertLocation>, - >::AssetId: - From + Into, - >::AssetIdParameter: - From + Into, - >::Balance: - From + Into, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - ForeignAssetsPalletInstance: 'static, - AssetId: Clone + Copy, - AssetIdConverter: MaybeEquivalence, -{ - // foreign parachain with the same consenus currency as asset - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(2222), GeneralIndex(1234567)) }; - let asset_id = AssetIdConverter::convert(&foreign_asset_id_multilocation).unwrap(); - - // foreign creator, which can be sibling parachain to match ForeignCreators - let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(2222)) }; - let foreign_creator_as_account_id = - SovereignAccountOf::convert_location(&foreign_creator).expect(""); - - // we want to buy execution with local relay chain currency - let buy_execution_fee_amount = - WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); - let buy_execution_fee = MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(buy_execution_fee_amount), - }; - - const ASSET_NAME: &str = "My super coin"; - const ASSET_SYMBOL: &str = "MY_S_COIN"; - let metadata_deposit_per_byte_eta = metadata_deposit_per_byte - .saturating_mul(((ASSET_NAME.len() + ASSET_SYMBOL.len()) as u128).into()); - - ExtBuilder::::default() - .with_collators(collator_session_keys.collators()) - .with_session_keys(collator_session_keys.session_keys()) - .with_balances(vec![( - foreign_creator_as_account_id.clone(), - existential_deposit + - asset_deposit + metadata_deposit_base + - metadata_deposit_per_byte_eta + - buy_execution_fee_amount.into() + - buy_execution_fee_amount.into(), - )]) - .with_tracing() - .build() - .execute_with(|| { - assert!(>::asset_ids() - .collect::>() - .is_empty()); - assert_eq!( - >::free_balance(&foreign_creator_as_account_id), - existential_deposit + - asset_deposit + metadata_deposit_base + - metadata_deposit_per_byte_eta + - buy_execution_fee_amount.into() + - buy_execution_fee_amount.into() - ); - additional_checks_before(); - - // execute XCM with Transacts to create/manage foreign assets by foreign governance - // prepare data for xcm::Transact(create) - let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< - Runtime, - ForeignAssetsPalletInstance, - >::create { - id: asset_id.into(), - // admin as sovereign_account - admin: foreign_creator_as_account_id.clone().into(), - min_balance: 1.into(), - }); - // prepare data for xcm::Transact(set_metadata) - let foreign_asset_set_metadata = runtime_call_encode(pallet_assets::Call::< - Runtime, - ForeignAssetsPalletInstance, - >::set_metadata { - id: asset_id.into(), - name: Vec::from(ASSET_NAME), - symbol: Vec::from(ASSET_SYMBOL), - decimals: 12, - }); - // prepare data for xcm::Transact(set_team - change just freezer to Bob) - let foreign_asset_set_team = runtime_call_encode(pallet_assets::Call::< - Runtime, - ForeignAssetsPalletInstance, - >::set_team { - id: asset_id.into(), - issuer: foreign_creator_as_account_id.clone().into(), - admin: foreign_creator_as_account_id.clone().into(), - freezer: bob_account.clone().into(), - }); - - // lets simulate this was triggered by relay chain from local consensus sibling - // parachain - let xcm = Xcm(vec![ - WithdrawAsset(buy_execution_fee.clone().into()), - BuyExecution { fees: buy_execution_fee.clone(), weight_limit: Unlimited }, - Transact { - origin_kind: OriginKind::Xcm, - require_weight_at_most: Weight::from_parts(40_000_000_000, 8000), - call: foreign_asset_create.into(), - }, - Transact { - origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(20_000_000_000, 8000), - call: foreign_asset_set_metadata.into(), - }, - Transact { - origin_kind: OriginKind::SovereignAccount, - require_weight_at_most: Weight::from_parts(20_000_000_000, 8000), - call: foreign_asset_set_team.into(), - }, - ExpectTransactStatus(MaybeErrorCode::Success), - ]); - - // messages with different consensus should go through the local bridge-hub - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( - foreign_creator, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), - ); - assert_eq!(outcome.ensure_complete(), Ok(())); - - // check events - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_assets_event(e.event.encode())); - assert!(events.any(|e| matches!(e, pallet_assets::Event::Created { .. }))); - assert!(events.any(|e| matches!(e, pallet_assets::Event::MetadataSet { .. }))); - assert!(events.any(|e| matches!(e, pallet_assets::Event::TeamChanged { .. }))); - - // check assets after - assert!(!>::asset_ids() - .collect::>() - .is_empty()); - - // check update metadata - use frame_support::traits::tokens::fungibles::roles::Inspect as InspectRoles; - assert_eq!( - >::owner( - asset_id.into() - ), - Some(foreign_creator_as_account_id.clone()) - ); - assert_eq!( - >::admin( - asset_id.into() - ), - Some(foreign_creator_as_account_id.clone()) - ); - assert_eq!( - >::issuer( - asset_id.into() - ), - Some(foreign_creator_as_account_id.clone()) - ); - assert_eq!( - >::freezer( - asset_id.into() - ), - Some(bob_account.clone()) - ); - assert!( - >::free_balance(&foreign_creator_as_account_id) >= - existential_deposit + buy_execution_fee_amount.into(), - "Free balance: {:?} should be ge {:?}", - >::free_balance(&foreign_creator_as_account_id), - existential_deposit + buy_execution_fee_amount.into() - ); - assert_metadata::< - pallet_assets::Pallet, - AccountIdOf, - >(asset_id, ASSET_NAME, ASSET_SYMBOL, 12); - - // check if changed freezer, can freeze - assert_noop!( - >::freeze( - RuntimeHelper::::origin_of(bob_account), - asset_id.into(), - alice_account.clone().into() - ), - pallet_assets::Error::::NoAccount - ); - assert_noop!( - >::freeze( - RuntimeHelper::::origin_of(foreign_creator_as_account_id.clone()), - asset_id.into(), - alice_account.into() - ), - pallet_assets::Error::::NoPermission - ); - - // lets try create asset for different parachain(3333) (foreign_creator(2222) can create - // just his assets) - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(3333), GeneralIndex(1234567)) }; - let asset_id = AssetIdConverter::convert(&foreign_asset_id_multilocation).unwrap(); - - // prepare data for xcm::Transact(create) - let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< - Runtime, - ForeignAssetsPalletInstance, - >::create { - id: asset_id.into(), - // admin as sovereign_account - admin: foreign_creator_as_account_id.clone().into(), - min_balance: 1.into(), - }); - let xcm = Xcm(vec![ - WithdrawAsset(buy_execution_fee.clone().into()), - BuyExecution { fees: buy_execution_fee.clone(), weight_limit: Unlimited }, - Transact { - origin_kind: OriginKind::Xcm, - require_weight_at_most: Weight::from_parts(20_000_000_000, 8000), - call: foreign_asset_create.into(), - }, - ExpectTransactStatus(MaybeErrorCode::from(DispatchError::BadOrigin.encode())), - ]); - - // messages with different consensus should go through the local bridge-hub - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - - // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( - foreign_creator, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), - ); - assert_eq!(outcome.ensure_complete(), Ok(())); - - additional_checks_after(); - }) -} - -#[macro_export] -macro_rules! include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works( - ( - $runtime:path, - $xcm_config:path, - $weight_to_fee:path, - $sovereign_account_of:path, - $assets_pallet_instance:path, - $asset_id:path, - $asset_id_converter:path, - $collator_session_key:expr, - $existential_deposit:expr, - $asset_deposit:expr, - $metadata_deposit_base:expr, - $metadata_deposit_per_byte:expr, - $runtime_call_encode:expr, - $unwrap_pallet_assets_event:expr, - $additional_checks_before:expr, - $additional_checks_after:expr - ) => { - #[test] - fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works() { - const ALICE: [u8; 32] = [1u8; 32]; - let alice_account = parachains_common::AccountId::from(ALICE); - const BOB: [u8; 32] = [2u8; 32]; - let bob_account = parachains_common::AccountId::from(BOB); - - $crate::test_cases::create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works::< - $runtime, - $xcm_config, - $weight_to_fee, - $sovereign_account_of, - $assets_pallet_instance, - $asset_id, - $asset_id_converter - >( - $collator_session_key, - $existential_deposit, - $asset_deposit, - $metadata_deposit_base, - $metadata_deposit_per_byte, - alice_account, - bob_account, - $runtime_call_encode, - $unwrap_pallet_assets_event, - $additional_checks_before, - $additional_checks_after - ) - } - } -); diff --git a/cumulus/parachains/runtimes/bridge-hubs/README.md b/cumulus/parachains/runtimes/bridge-hubs/README.md deleted file mode 100644 index 1520065b7e3a..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/README.md +++ /dev/null @@ -1,236 +0,0 @@ -- [Bridge-hub Parachains](#bridge-hub-parachains) - * [Requirements for local run/testing](#requirements-for-local-runtesting) - * [How to test local Rococo <-> Wococo bridge](#how-to-test-local-rococo---wococo-bridge) - + [Run chains (Rococo + BridgeHub, Wococo + BridgeHub) with zombienet](#run-chains-rococo--bridgehub-wococo--bridgehub-with-zombienet) - + [Run relayer (BridgeHubRococo, BridgeHubWococo)](#run-relayer-bridgehubrococo-bridgehubwococo) - - [Run with script (alternative 1)](#run-with-script-alternative-1) - - [Run with binary (alternative 2)](#run-with-binary-alternative-2) - + [Send messages - transfer asset over bridge](#send-messages---transfer-asset-over-bridge) - * [How to test live BridgeHubRococo/BridgeHubWococo](#how-to-test-live-bridgehubrococobridgehubwococo) - * [How to test local BridgeHubKusama/BridgeHubPolkadot](#how-to-test-local-bridgehubkusamabridgehubpolkadot) - -# Bridge-hub Parachains - -_BridgeHub(s)_ are **_system parachains_** that will house trustless bridges from the local -ecosystem to others. -The current trustless bridges planned for the BridgeHub(s) are: -- `BridgeHubPolkadot` system parachain: - 1. Polkadot <-> Kusama bridge - 2. Polkadot <-> Ethereum bridge (Snowbridge) -- `BridgeHubKusama` system parachain: - 1. Kusama <-> Polkadot bridge - 2. Kusama <-> Ethereum bridge - The high-level responsibilities of each bridge living on BridgeHub: -- sync finality proofs between relay chains (or equivalent) -- sync finality proofs between BridgeHub parachains -- pass (XCM) messages between different BridgeHub parachains - -![](./docs/bridge-hub-parachain-design.jpg "Basic deployment setup") - -## Requirements for local run/testing - -``` -# Prepare empty directory for testing -mkdir -p ~/local_bridge_testing/bin -mkdir -p ~/local_bridge_testing/logs - ---- -# 1. Install zombienet -Go to: https://github.com/paritytech/zombienet/releases -Copy the apropriate binary (zombienet-linux) from the latest release to ~/local_bridge_testing/bin - - ---- -# 2. Build polkadot binary -git clone https://github.com/paritytech/polkadot.git -cd polkadot - -# if you want to test Kusama/Polkadot bridge, we need "sudo pallet + fast-runtime", -# so please, find the latest polkadot's repository branch `it/release-vX.Y.Z-fast-sudo` -# e.g: -# git checkout -b it/release-v0.9.43-fast-sudo --track origin/it/release-v0.9.43-fast-sudo - -cargo build --release --features fast-runtime -cp target/release/polkadot ~/local_bridge_testing/bin/polkadot - - ---- -# 3. Build substrate-relay binary -git clone https://github.com/paritytech/parity-bridges-common.git -cd parity-bridges-common - -# checkout desired branch or use master: -# git checkout -b master --track origin/master -# `polkadot-staging` (recommended) is stabilized and compatible for Cumulus releases -# `master` is latest development -git checkout -b polkadot-staging --track origin/polkadot-staging - -cargo build --release -p substrate-relay -cp target/release/substrate-relay ~/local_bridge_testing/bin/substrate-relay - - ---- -# 4. Build cumulus polkadot-parachain binary -cd - -# checkout desired branch or use master: -# git checkout -b master --track origin/master - -cargo build --release --locked --bin polkadot-parachain -cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain -cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-asset-hub - - - -# !!! READ HERE (TODO remove once all mentioned branches bellow are merged) -# The use case "moving assets over bridge" is not merged yet and is implemented in separate branches. -# So, if you want to try it, you need to checkout different branch and continue with these instructions there. - -# For Kusama/Polkadot local bridge testing: -# -# build BridgeHubs (polkadot-parachain) from branch: -# git checkout -b bridge-hub-kusama-polkadot --track origin/bridge-hub-kusama-polkadot -# cargo build --release --locked --bin polkadot-parachain -# cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain -# -# build AssetHubs (polkadot-parachain-asset-hub) from branch: -# git checkout -b bko-transfer-asset-via-bridge-pallet-xcm --track origin/bko-transfer-asset-via-bridge-pallet-xcm -# cargo build --release --locked --bin polkadot-parachain -# cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-asset-hub - -# For Rococo/Wococo local bridge testing: -# -# build AssetHubs (polkadot-parachain-asset-hub) from branch: -# git checkout -b bko-transfer-asset-via-bridge-pallet-xcm-ro-wo --track origin/bko-transfer-asset-via-bridge-pallet-xcm-ro-wo -# cargo build --release --locked --bin polkadot-parachain -# cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-parachain-asset-hub -``` - -## How to test local Rococo <-> Wococo bridge - -### Run chains (Rococo + BridgeHub + AssetHub, Wococo + BridgeHub + AssetHub) with zombienet - -``` -# Rococo + BridgeHubRococo + AssetHub for Rococo (mirroring Kusama) -POLKADOT_BINARY_PATH=~/local_bridge_testing/bin/polkadot \ -POLKADOT_PARACHAIN_BINARY_PATH=~/local_bridge_testing/bin/polkadot-parachain \ -POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=~/local_bridge_testing/bin/polkadot-parachain-asset-hub \ - ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml -``` - -``` -# Wococo + BridgeHubWococo + AssetHub for Wococo (mirroring Polkadot) -POLKADOT_BINARY_PATH=~/local_bridge_testing/bin/polkadot \ -POLKADOT_PARACHAIN_BINARY_PATH=~/local_bridge_testing/bin/polkadot-parachain \ -POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WOCOCO=~/local_bridge_testing/bin/polkadot-parachain-asset-hub \ - ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml -``` - -### Run relayer (BridgeHubRococo, BridgeHubWococo) - -**Accounts of BridgeHub parachains:** -- `Bob` is pallet owner of all bridge pallets - -#### Run with script (alternative 1) -``` -cd -./scripts/bridges_rococo_wococo.sh run-relay -``` - -#### Run with binary (alternative 2) -Need to wait for parachain activation (start producing blocks), then run: - -``` -# 1. Init bridges: - -# Rococo -> Wococo -RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay init-bridge rococo-to-bridge-hub-wococo \ - --source-host localhost \ - --source-port 9942 \ - --source-version-mode Auto \ - --target-host localhost \ - --target-port 8945 \ - --target-version-mode Auto \ - --target-signer //Bob - -# Wococo -> Rococo -RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay init-bridge wococo-to-bridge-hub-rococo \ - --source-host localhost \ - --source-port 9945 \ - --source-version-mode Auto \ - --target-host localhost \ - --target-port 8943 \ - --target-version-mode Auto \ - --target-signer //Bob - -# 2. Relay relay-chain headers, parachain headers and messages** -RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay relay-headers-and-messages bridge-hub-rococo-bridge-hub-wococo \ - --rococo-host localhost \ - --rococo-port 9942 \ - --rococo-version-mode Auto \ - --bridge-hub-rococo-host localhost \ - --bridge-hub-rococo-port 8943 \ - --bridge-hub-rococo-version-mode Auto \ - --bridge-hub-rococo-signer //Charlie \ - --wococo-headers-to-bridge-hub-rococo-signer //Bob \ - --wococo-parachains-to-bridge-hub-rococo-signer //Bob \ - --bridge-hub-rococo-transactions-mortality 4 \ - --wococo-host localhost \ - --wococo-port 9945 \ - --wococo-version-mode Auto \ - --bridge-hub-wococo-host localhost \ - --bridge-hub-wococo-port 8945 \ - --bridge-hub-wococo-version-mode Auto \ - --bridge-hub-wococo-signer //Charlie \ - --rococo-headers-to-bridge-hub-wococo-signer //Bob \ - --rococo-parachains-to-bridge-hub-wococo-signer //Bob \ - --bridge-hub-wococo-transactions-mortality 4 \ - --lane 00000001 -``` - -**Check relay-chain headers relaying:** -- Rococo parachain: - - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8943#/chainstate - - Pallet: **bridgeWococoGrandpa** - - Keys: **bestFinalized()** -- Wococo parachain: - - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8945#/chainstate - - Pallet: **bridgeRococoGrandpa** - - Keys: **bestFinalized()** - -**Check parachain headers relaying:** -- Rococo parachain: - - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8943#/chainstate - - Pallet: **bridgeWococoParachain** - - Keys: **bestParaHeads()** -- Wococo parachain: - - https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A8945#/chainstate - - Pallet: **bridgeRococoParachain** - - Keys: **bestParaHeads()** - -### Send messages - transfer asset over bridge - -TODO: see `# !!! READ HERE` above - -## How to test live BridgeHubRococo/BridgeHubWococo -(here is still deployed older PoC from branch `origin/bko-transfer-asset-via-bridge`, which uses custom extrinsic, which is going to be replaced by `pallet_xcm` usage) -- uses account seed on Live Rococo:Rockmine2 - ``` - cd - ./scripts/bridges_rococo_wococo.sh transfer-asset-from-asset-hub-rococo - ``` - -- open explorers: - - Rockmine2 (see events `xcmpQueue.XcmpMessageSent`, `bridgeTransfer.ReserveAssetsDeposited`, `bridgeTransfer.TransferInitiated`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io#/explorer - - BridgeHubRococo (see `bridgeWococoMessages.MessageAccepted`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-bridge-hub-rpc.polkadot.io#/explorer - - BridgeHubWococo (see `bridgeRococoMessages.MessagesReceived`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fwococo-bridge-hub-rpc.polkadot.io#/explorer - - Wockmint (see `xcmpQueue.Success` for `transfer-asset` and `xcmpQueue.Fail` for `ping-via-bridge`) https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fwococo-wockmint-rpc.polkadot.io#/explorer - - BridgeHubRococo (see `bridgeWococoMessages.MessagesDelivered`) - - -## How to test local BridgeHubKusama/BridgeHubPolkadot - -TODO: see `# !!! READ HERE` above diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml deleted file mode 100644 index 68862ebb9008..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/Cargo.toml +++ /dev/null @@ -1,172 +0,0 @@ -[package] -name = "bridge-hub-kusama-runtime" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Kusama's BridgeHub parachain runtime" - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.183", optional = true, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -kusama-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = {path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0"} -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../../parachains/common", default-features = false } - -[dev-dependencies] -bridge-hub-test-utils = { path = "../test-utils"} - -[features] -default = [ - "std", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "serde", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "kusama-runtime-constants/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-collator-selection/std", - "pallet-multisig/std", - "pallet-session/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-utility/std", - "pallet-xcm/std", - "parachain-info/std", - "parachains-common/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-io/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "substrate-wasm-builder", -] - -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", -] - -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-multisig/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/build.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/constants.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/constants.rs deleted file mode 100644 index 257d0da755b1..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/constants.rs +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod currency { - use kusama_runtime_constants as constants; - use polkadot_core_primitives::Balance; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // map to 1/100 of what the kusama relay chain charges (v9020) - constants::currency::deposit(items, bytes) / 100 - } -} - -/// Fee-related. -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Bridge Hub, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs deleted file mode 100644 index 6bcc3e32ba18..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/lib.rs +++ /dev/null @@ -1,802 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod constants; -mod weights; -pub mod xcm_config; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use constants::{currency::*, fee::WeightToFee}; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, - weights::{ConstantMultiplier, Weight}, - PalletId, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use xcm_config::{ - FellowshipLocation, GovernanceLocation, XcmConfig, XcmOriginToTransactDispatchOrigin, -}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -use parachains_common::{ - impls::DealWithFees, AccountId, Balance, BlockNumber, Hash, Header, Nonce, Signature, - AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, -}; - -// XCM Imports -use xcm::latest::prelude::BodyId; -use xcm_executor::XcmExecutor; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Block type as expected by this runtime. -pub type Block = generic::Block; - -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; - -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; - -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, -); - -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Migrations to apply on runtime upgrade. -pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("bridge-hub-kusama"), - impl_name: create_runtime_str!("bridge-hub-kusama"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 3, - state_version: 1, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 2; -} - -// Configure FRAME pallets to include in runtime. - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; - /// What to do if a new account is created. - type OnNewAccount = (); - /// What to do if an account is fully reaped from the system. - type OnKilledAccount = (); - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// The basic call filter to use in dispatchable. - type BaseCallFilter = Everything; - /// Weight information for the extrinsics of this pallet. - type SystemWeightInfo = weights::frame_system::WeightInfo; - /// Block & extrinsics weights: base values and limits. - type BlockWeights = RuntimeBlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = RuntimeBlockLength; - type SS58Prefix = SS58Prefix; - /// The action to take on a Runtime Upgrade - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - /// The type for recording an account's balance. - type Balance = Balance; - type DustRemoval = (); - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxLocks = ConstU32<50>; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type OperationalFeeMultiplier = ConstU8<5>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = XcmpQueue; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -parameter_types! { - // Fellows pluralistic body. - pub const FellowsBodyId: BodyId = BodyId::Technical; -} - -/// Privileged origin that represents Root or Fellows pluralistic body. -pub type RootOrFellows = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = RootOrFellows; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -pub const PERIOD: u32 = 6 * HOURS; -pub const OFFSET: u32 = 0; - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; - type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // StakingAdmin pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow Root and the `StakingAdmin` to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = ConstU32; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = ConstU32<100>; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - - // Collator support. The order of these 4 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, - } -); - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_session, SessionBench::] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - // XCM - [pallet_xcm, PolkadotXcm] - // NOTE: Make sure you point to the individual modules below. - [pallet_xcm_benchmarks::fungible, XcmBalances] - [pallet_xcm_benchmarks::generic, XcmGeneric] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - // This is defined once again in dispatch_benchmark, because list_benchmarks! - // and add_benchmarks! are macros exported by define_benchmarks! macros and those types - // are referenced in that call. - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError, TrackedStorageKey}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use xcm::latest::prelude::*; - use xcm_config::KsmRelayLocation; - - impl pallet_xcm_benchmarks::Config for Runtime { - type XcmConfig = xcm_config::XcmConfig; - type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { - Ok(KsmRelayLocation::get()) - } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { - // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(KsmRelayLocation::get()), - fun: Fungible(1_000_000 * UNITS), - } - ]; - assets.into() - } - } - - parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - KsmRelayLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(KsmRelayLocation::get()) }, - )); - pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; - } - - impl pallet_xcm_benchmarks::fungible::Config for Runtime { - type TransactAsset = Balances; - - type CheckedAccount = CheckedAccount; - type TrustedTeleporter = TrustedTeleporter; - type TrustedReserve = TrustedReserve; - - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(KsmRelayLocation::get()), - fun: Fungible(UNITS), - } - } - } - - impl pallet_xcm_benchmarks::generic::Config for Runtime { - type RuntimeCall = RuntimeCall; - - fn worst_case_response() -> (u64, Response) { - (0u64, Response::Version(Default::default())) - } - - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((KsmRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) - } - - fn subscribe_origin() -> Result { - Ok(KsmRelayLocation::get()) - } - - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = KsmRelayLocation::get(); - let assets: MultiAssets = (Concrete(KsmRelayLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; - Ok((origin, ticket, assets)) - } - - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - } - - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/block_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs deleted file mode 100644 index 83b242f04599..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/cumulus_pallet_xcmp_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `cumulus_pallet_xcmp_queue` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=cumulus_pallet_xcmp_queue -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `cumulus_pallet_xcmp_queue`. -pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_129_000 picoseconds. - Weight::from_parts(5_367_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_050_000 picoseconds. - Weight::from_parts(5_565_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs deleted file mode 100644 index 83b8ec960fb1..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 1_985_000 picoseconds. - Weight::from_parts(2_177_341, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(386, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_288_000 picoseconds. - Weight::from_parts(23_888_468, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 8 - .saturating_add(Weight::from_parts(1_718, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_700_000 picoseconds. - Weight::from_parts(3_867_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `119` - // Estimated: `1604` - // Minimum execution time: 100_298_586_000 picoseconds. - Weight::from_parts(101_869_369_000, 0) - .saturating_add(Weight::from_parts(0, 1604)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_052_000 picoseconds. - Weight::from_parts(2_115_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_048 - .saturating_add(Weight::from_parts(755_436, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_044_000 picoseconds. - Weight::from_parts(2_110_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_011 - .saturating_add(Weight::from_parts(569_993, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `68 + p * (69 ±0)` - // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 3_741_000 picoseconds. - Weight::from_parts(3_838_000, 0) - .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 2_455 - .saturating_add(Weight::from_parts(1_216_154, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/mod.rs deleted file mode 100644 index d5722374defc..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/mod.rs +++ /dev/null @@ -1,38 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Expose the auto generated weight files. - -pub mod block_weights; -pub mod cumulus_pallet_xcmp_queue; -pub mod extrinsic_weights; -pub mod frame_system; -pub mod pallet_balances; -pub mod pallet_collator_selection; -pub mod pallet_multisig; -pub mod pallet_session; -pub mod pallet_timestamp; -pub mod pallet_utility; -pub mod pallet_xcm; -pub mod paritydb_weights; -pub mod rocksdb_weights; -pub mod xcm; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs deleted file mode 100644 index 1387ee30c7d3..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_balances.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_balances` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_balances`. -pub struct WeightInfo(PhantomData); -impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_allow_death() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 55_163_000 picoseconds. - Weight::from_parts(56_056_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 40_829_000 picoseconds. - Weight::from_parts(42_182_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_creating() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 15_212_000 picoseconds. - Weight::from_parts(15_782_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_killing() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 22_866_000 picoseconds. - Weight::from_parts(23_452_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 57_047_000 picoseconds. - Weight::from_parts(58_536_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_all() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 51_622_000 picoseconds. - Weight::from_parts(52_912_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_unreserve() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 17_723_000 picoseconds. - Weight::from_parts(18_383_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:999 w:999) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(u: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 17_089_000 picoseconds. - Weight::from_parts(17_379_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 17_071 - .saturating_add(Weight::from_parts(15_647_341, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs deleted file mode 100644 index 7854bf88e404..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_collator_selection.rs +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collator_selection` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_collator_selection -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collator_selection`. -pub struct WeightInfo(PhantomData); -impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:20 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `196 + b * (79 ±0)` - // Estimated: `1187 + b * (2555 ±0)` - // Minimum execution time: 14_329_000 picoseconds. - Weight::from_parts(11_605_842, 0) - .saturating_add(Weight::from_parts(0, 1187)) - // Standard Error: 4_784 - .saturating_add(Weight::from_parts(3_297_183, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) - } - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `757 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 47_110_000 picoseconds. - Weight::from_parts(45_234_418, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 14_452 - .saturating_add(Weight::from_parts(156_031, 0).saturating_mul(b.into())) - // Standard Error: 2_739 - .saturating_add(Weight::from_parts(216_162, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `82 + b * (32 ±0)` - // Estimated: `6287` - // Minimum execution time: 15_326_000 picoseconds. - Weight::from_parts(14_914_611, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_274 - .saturating_add(Weight::from_parts(201_234, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn set_desired_candidates() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_288_000 picoseconds. - Weight::from_parts(7_472_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_137_000 picoseconds. - Weight::from_parts(7_374_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `740 + c * (52 ±0)` - // Estimated: `6287 + c * (54 ±0)` - // Minimum execution time: 40_718_000 picoseconds. - Weight::from_parts(43_911_837, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 3_053 - .saturating_add(Weight::from_parts(229_337, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[3, 100]`. - fn leave_intent(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `334 + c * (49 ±0)` - // Estimated: `6287` - // Minimum execution time: 32_953_000 picoseconds. - Weight::from_parts(34_817_275, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_476 - .saturating_add(Weight::from_parts(198_023, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - fn note_author() -> Weight { - // Proof Size summary in bytes: - // Measured: `155` - // Estimated: `6196` - // Minimum execution time: 45_130_000 picoseconds. - Weight::from_parts(46_733_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:97 w:97) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `r` is `[1, 100]`. - /// The range of component `c` is `[1, 100]`. - fn new_session(r: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `2263 + c * (97 ±0) + r * (115 ±0)` - // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 16_690_000 picoseconds. - Weight::from_parts(17_188_000, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 345_320 - .saturating_add(Weight::from_parts(15_166_422, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs deleted file mode 100644 index 14b11f9380a6..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_multisig.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_multisig` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_multisig -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_multisig`. -pub struct WeightInfo(PhantomData); -impl pallet_multisig::WeightInfo for WeightInfo { - /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_602_000 picoseconds. - Weight::from_parts(14_565_036, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 8 - .saturating_add(Weight::from_parts(518, 0).saturating_mul(z.into())) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 46_075_000 picoseconds. - Weight::from_parts(33_730_493, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_049 - .saturating_add(Weight::from_parts(134_211, 0).saturating_mul(s.into())) - // Standard Error: 10 - .saturating_add(Weight::from_parts(1_448, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[3, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_approve(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 29_389_000 picoseconds. - Weight::from_parts(19_639_583, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 976 - .saturating_add(Weight::from_parts(106_598, 0).saturating_mul(s.into())) - // Standard Error: 9 - .saturating_add(Weight::from_parts(1_457, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `388 + s * (33 ±0)` - // Estimated: `6811` - // Minimum execution time: 50_438_000 picoseconds. - Weight::from_parts(36_195_308, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_689 - .saturating_add(Weight::from_parts(176_067, 0).saturating_mul(s.into())) - // Standard Error: 16 - .saturating_add(Weight::from_parts(1_545, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 32_134_000 picoseconds. - Weight::from_parts(32_149_785, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_082 - .saturating_add(Weight::from_parts(145_390, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 17_560_000 picoseconds. - Weight::from_parts(18_144_079, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 763 - .saturating_add(Weight::from_parts(114_298, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + s * (1 ±0)` - // Estimated: `6811` - // Minimum execution time: 32_360_000 picoseconds. - Weight::from_parts(33_566_579, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_314 - .saturating_add(Weight::from_parts(126_583, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs deleted file mode 100644 index 69371604e796..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_session.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_session` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_session -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_session`. -pub struct WeightInfo(PhantomData); -impl pallet_session::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:1 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn set_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `297` - // Estimated: `3762` - // Minimum execution time: 17_170_000 picoseconds. - Weight::from_parts(17_523_000, 0) - .saturating_add(Weight::from_parts(0, 3762)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:0 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn purge_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `279` - // Estimated: `3744` - // Minimum execution time: 13_273_000 picoseconds. - Weight::from_parts(14_200_000, 0) - .saturating_add(Weight::from_parts(0, 3744)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs deleted file mode 100644 index 31830fbc722e..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_timestamp.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_timestamp` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_timestamp -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_timestamp`. -pub struct WeightInfo(PhantomData); -impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: `Timestamp::Now` (r:1 w:1) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Aura::CurrentSlot` (r:1 w:0) - /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set() -> Weight { - // Proof Size summary in bytes: - // Measured: `49` - // Estimated: `1493` - // Minimum execution time: 7_794_000 picoseconds. - Weight::from_parts(8_075_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn on_finalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `57` - // Estimated: `0` - // Minimum execution time: 3_338_000 picoseconds. - Weight::from_parts(3_471_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs deleted file mode 100644 index f871f81b756f..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_utility.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_utility` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_utility -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_utility`. -pub struct WeightInfo(PhantomData); -impl pallet_utility::WeightInfo for WeightInfo { - /// The range of component `c` is `[0, 1000]`. - fn batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_641_000 picoseconds. - Weight::from_parts(7_103_558, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_172 - .saturating_add(Weight::from_parts(4_907_384, 0).saturating_mul(c.into())) - } - fn as_derivative() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_741_000 picoseconds. - Weight::from_parts(4_870_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn batch_all(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_561_000 picoseconds. - Weight::from_parts(12_252_064, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_750 - .saturating_add(Weight::from_parts(5_193_404, 0).saturating_mul(c.into())) - } - fn dispatch_as() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_646_000 picoseconds. - Weight::from_parts(8_927_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn force_batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_726_000 picoseconds. - Weight::from_parts(8_025_954, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_746 - .saturating_add(Weight::from_parts(4_936_537, 0).saturating_mul(c.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs deleted file mode 100644 index e2effcd36df6..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/pallet_xcm.rs +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-kusama-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_xcm`. -pub struct WeightInfo(PhantomData); -impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn send() -> Weight { - // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 27_523_000 picoseconds. - Weight::from_parts(28_238_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `1489` - // Minimum execution time: 24_139_000 picoseconds. - Weight::from_parts(24_806_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn reserve_transfer_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn execute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_988_000 picoseconds. - Weight::from_parts(9_227_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_default_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_571_000 picoseconds. - Weight::from_parts(2_667_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_subscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 33_194_000 picoseconds. - Weight::from_parts(34_089_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_unsubscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `255` - // Estimated: `3720` - // Minimum execution time: 35_413_000 picoseconds. - Weight::from_parts(36_359_000, 0) - .saturating_add(Weight::from_parts(0, 3720)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) - /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_suspension() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_679_000 picoseconds. - Weight::from_parts(2_823_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_supported_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 15_117_000 picoseconds. - Weight::from_parts(15_603_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notifiers() -> Weight { - // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_978_000 picoseconds. - Weight::from_parts(15_370_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn already_notified_target() -> Weight { - // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 16_549_000 picoseconds. - Weight::from_parts(16_944_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn notify_current_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `6046` - // Minimum execution time: 30_111_000 picoseconds. - Weight::from_parts(30_795_000, 0) - .saturating_add(Weight::from_parts(0, 6046)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn notify_target_migration_fail() -> Weight { - // Proof Size summary in bytes: - // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_622_000 picoseconds. - Weight::from_parts(8_865_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notify_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 15_194_000 picoseconds. - Weight::from_parts(15_646_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn migrate_and_notify_old_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 36_625_000 picoseconds. - Weight::from_parts(37_571_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs deleted file mode 100644 index 295e222f27ac..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/mod.rs +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod pallet_xcm_benchmarks_fungible; -mod pallet_xcm_benchmarks_generic; - -use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; -use frame_support::weights::Weight; -use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; -use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; -use xcm::{latest::prelude::*, DoubleEncoded}; - -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; -} - -const MAX_ASSETS: u64 = 100; - -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - match self { - Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), - Self::Wild(asset) => match asset { - All => weight.saturating_mul(MAX_ASSETS), - AllOf { fun, .. } => match fun { - WildFungibility::Fungible => weight, - // Magic number 2 has to do with the fact that we could have up to 2 times - // MaxAssetsIntoHolding in the worst-case scenario. - WildFungibility::NonFungible => - weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), - }, - AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - }, - } - } -} - -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().iter().count() as u64) - } -} - -pub struct BridgeHubKusamaXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for BridgeHubKusamaXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) - } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) - } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) - } - fn query_response( - _query_id: &u64, - _response: &Response, - _max_weight: &Weight, - _querier: &Option, - ) -> Weight { - XcmGeneric::::query_response() - } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) - } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) - } - fn transact( - _origin_type: &OriginKind, - _require_weight_at_most: &Weight, - _call: &DoubleEncoded, - ) -> Weight { - XcmGeneric::::transact() - } - fn hrmp_new_channel_open_request( - _sender: &u32, - _max_message_size: &u32, - _max_capacity: &u32, - ) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_accepted(_recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn clear_origin() -> Weight { - XcmGeneric::::clear_origin() - } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { - XcmGeneric::::descend_origin() - } - fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_error() - } - - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) - } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) - } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { - Weight::MAX - } - fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) - } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) - } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { - XcmGeneric::::report_holding() - } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { - XcmGeneric::::buy_execution() - } - fn refund_surplus() -> Weight { - XcmGeneric::::refund_surplus() - } - fn set_error_handler(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_error_handler() - } - fn set_appendix(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_appendix() - } - fn clear_error() -> Weight { - XcmGeneric::::clear_error() - } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { - XcmGeneric::::claim_asset() - } - fn trap(_code: &u64) -> Weight { - XcmGeneric::::trap() - } - fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { - XcmGeneric::::subscribe_version() - } - fn unsubscribe_version() -> Weight { - XcmGeneric::::unsubscribe_version() - } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) - } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) - } - fn expect_origin(_origin: &Option) -> Weight { - XcmGeneric::::expect_origin() - } - fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { - XcmGeneric::::expect_error() - } - fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { - XcmGeneric::::expect_transact_status() - } - fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::query_pallet() - } - fn expect_pallet( - _index: &u32, - _name: &Vec, - _module_name: &Vec, - _crate_major: &u32, - _min_crate_minor: &u32, - ) -> Weight { - XcmGeneric::::expect_pallet() - } - fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_transact_status() - } - fn clear_transact_status() -> Weight { - XcmGeneric::::clear_transact_status() - } - fn universal_origin(_: &Junction) -> Weight { - Weight::MAX - } - fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - Weight::MAX - } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn set_fees_mode(_: &bool) -> Weight { - XcmGeneric::::set_fees_mode() - } - fn set_topic(_topic: &[u8; 32]) -> Weight { - XcmGeneric::::set_topic() - } - fn clear_topic() -> Weight { - XcmGeneric::::clear_topic() - } - fn alias_origin(_: &MultiLocation) -> Weight { - // XCM Executor does not currently support alias origin operations - Weight::MAX - } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { - XcmGeneric::::unpaid_execution() - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs deleted file mode 100644 index 4ebc6eacb9fb..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::fungible`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn withdraw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `3593` - // Minimum execution time: 24_064_000 picoseconds. - Weight::from_parts(24_751_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn transfer_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `153` - // Estimated: `6196` - // Minimum execution time: 51_097_000 picoseconds. - Weight::from_parts(51_960_000, 6196) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn transfer_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `223` - // Estimated: `6196` - // Minimum execution time: 75_319_000 picoseconds. - Weight::from_parts(77_356_000, 6196) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - // Storage: `Benchmark::Override` (r:0 w:0) - // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn reserve_asset_deposited() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 500_000_000_000 picoseconds. - Weight::from_parts(500_000_000_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_reserve_withdraw() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 29_392_000 picoseconds. - Weight::from_parts(29_943_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn receive_teleported_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_637_000 picoseconds. - Weight::from_parts(3_720_000, 0) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn deposit_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `52` - // Estimated: `3593` - // Minimum execution time: 25_045_000 picoseconds. - Weight::from_parts(25_546_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn deposit_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `122` - // Estimated: `3593` - // Minimum execution time: 51_450_000 picoseconds. - Weight::from_parts(52_354_000, 3593) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_teleport() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 29_711_000 picoseconds. - Weight::from_parts(30_759_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs deleted file mode 100644 index d38d177a605c..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::generic` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-kusama-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=bridge-hub-kusama-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::generic`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_holding() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 33_141_000 picoseconds. - Weight::from_parts(34_380_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn buy_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_803_000 picoseconds. - Weight::from_parts(2_904_000, 0) - } - // Storage: `PolkadotXcm::Queries` (r:1 w:0) - // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn query_response() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `3497` - // Minimum execution time: 10_308_000 picoseconds. - Weight::from_parts(10_753_000, 3497) - .saturating_add(T::DbWeight::get().reads(1)) - } - pub fn transact() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 11_499_000 picoseconds. - Weight::from_parts(11_786_000, 0) - } - pub fn refund_surplus() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_102_000 picoseconds. - Weight::from_parts(3_161_000, 0) - } - pub fn set_error_handler() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_678_000 picoseconds. - Weight::from_parts(2_795_000, 0) - } - pub fn set_appendix() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_685_000 picoseconds. - Weight::from_parts(2_758_000, 0) - } - pub fn clear_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_590_000 picoseconds. - Weight::from_parts(2_754_000, 0) - } - pub fn descend_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_297_000 picoseconds. - Weight::from_parts(3_419_000, 0) - } - pub fn clear_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_606_000 picoseconds. - Weight::from_parts(2_717_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 26_242_000 picoseconds. - Weight::from_parts(29_220_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) - // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn claim_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `90` - // Estimated: `3555` - // Minimum execution time: 14_106_000 picoseconds. - Weight::from_parts(14_535_000, 3555) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn trap() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_634_000 picoseconds. - Weight::from_parts(2_763_000, 0) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn subscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 27_802_000 picoseconds. - Weight::from_parts(28_495_000, 3503) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn unsubscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_683_000 picoseconds. - Weight::from_parts(4_907_000, 0) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn burn_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_941_000 picoseconds. - Weight::from_parts(4_080_000, 0) - } - pub fn expect_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_775_000 picoseconds. - Weight::from_parts(2_908_000, 0) - } - pub fn expect_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_743_000 picoseconds. - Weight::from_parts(2_863_000, 0) - } - pub fn expect_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_641_000 picoseconds. - Weight::from_parts(2_771_000, 0) - } - pub fn expect_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_838_000 picoseconds. - Weight::from_parts(2_950_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn query_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 29_284_000 picoseconds. - Weight::from_parts(29_867_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn expect_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_734_000 picoseconds. - Weight::from_parts(4_876_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 26_154_000 picoseconds. - Weight::from_parts(26_851_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn clear_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_678_000 picoseconds. - Weight::from_parts(2_748_000, 0) - } - pub fn set_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_585_000 picoseconds. - Weight::from_parts(2_697_000, 0) - } - pub fn clear_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_576_000 picoseconds. - Weight::from_parts(2_701_000, 0) - } - pub fn set_fees_mode() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_597_000 picoseconds. - Weight::from_parts(2_735_000, 0) - } - pub fn unpaid_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_744_000 picoseconds. - Weight::from_parts(2_809_000, 0) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs deleted file mode 100644 index 1fcec7b6b9c5..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/src/xcm_config.rs +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use super::{ - AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing}, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; -use polkadot_parachain::primitives::Sibling; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; - -parameter_types! { - pub const KsmRelayLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Kusama); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); - pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when - // recognized. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognized. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; -} -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - matches!( - call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - // Allow local users to buy weight credit. - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // BridgeHub does not recognize a reserve location for any asset. Users must teleport KSM - // where allowed (e.g. with the Relay Chain). - type IsReserve = (); - /// Only allow teleportation of KSM. - type IsTeleporter = ConcreteNativeAssetFrom; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = WeightInfoBounds< - crate::weights::xcm::BridgeHubKusamaXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type Trader = - UsingComponents>; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. - type Weigher = WeightInfoBounds< - crate::weights::xcm::BridgeHubKusamaXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/tests/tests.rs deleted file mode 100644 index 9998e3d804d8..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-kusama/tests/tests.rs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -pub use bridge_hub_kusama_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, - ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, SessionKeys, -}; -use codec::Decode; -use frame_support::parameter_types; -use parachains_common::{AccountId, AuraId}; - -const ALICE: [u8; 32] = [1u8; 32]; - -parameter_types! { - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); -} - -bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - 1002 -); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml deleted file mode 100644 index 4caa1d1a3306..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/Cargo.toml +++ /dev/null @@ -1,172 +0,0 @@ -[package] -name = "bridge-hub-polkadot-runtime" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Polkadot's BridgeHub parachain runtime" - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.183", optional = true, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = {path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0"} -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../../parachains/common", default-features = false } - -[dev-dependencies] -bridge-hub-test-utils = { path = "../test-utils"} - -[features] -default = [ - "std", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "serde", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "polkadot-runtime-constants/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-collator-selection/std", - "pallet-multisig/std", - "pallet-session/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-utility/std", - "pallet-xcm/std", - "parachain-info/std", - "parachains-common/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-io/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "substrate-wasm-builder", -] - -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", -] - -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-multisig/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/build.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/constants.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/constants.rs deleted file mode 100644 index 388d23e6441a..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/constants.rs +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod currency { - use polkadot_core_primitives::Balance; - use polkadot_runtime_constants as constants; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // 1/100 of Polkadot - constants::currency::deposit(items, bytes) / 100 - } -} - -/// Fee-related. -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Bridge Hub, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs deleted file mode 100644 index bc0a11f69cb1..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ /dev/null @@ -1,802 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod constants; -mod weights; -pub mod xcm_config; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use constants::{currency::*, fee::WeightToFee}; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything}, - weights::{ConstantMultiplier, Weight}, - PalletId, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use xcm_config::{ - FellowshipLocation, GovernanceLocation, XcmConfig, XcmOriginToTransactDispatchOrigin, -}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -use parachains_common::{ - impls::DealWithFees, AccountId, Balance, BlockNumber, Hash, Header, Nonce, Signature, - AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, -}; -// XCM Imports -use xcm::latest::prelude::BodyId; -use xcm_executor::XcmExecutor; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Block type as expected by this runtime. -pub type Block = generic::Block; - -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; - -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; - -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, -); - -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Migrations to apply on runtime upgrade. -pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("bridge-hub-polkadot"), - impl_name: create_runtime_str!("bridge-hub-polkadot"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 2, - state_version: 1, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 0; -} - -// Configure FRAME pallets to include in runtime. - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; - /// What to do if a new account is created. - type OnNewAccount = (); - /// What to do if an account is fully reaped from the system. - type OnKilledAccount = (); - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// The basic call filter to use in dispatchable. - type BaseCallFilter = Everything; - /// Weight information for the extrinsics of this pallet. - type SystemWeightInfo = weights::frame_system::WeightInfo; - /// Block & extrinsics weights: base values and limits. - type BlockWeights = RuntimeBlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = RuntimeBlockLength; - type SS58Prefix = SS58Prefix; - /// The action to take on a Runtime Upgrade - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - /// The type for recording an account's balance. - type Balance = Balance; - type DustRemoval = (); - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxLocks = ConstU32<50>; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type OperationalFeeMultiplier = ConstU8<5>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = XcmpQueue; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -parameter_types! { - // Fellows pluralistic body. - pub const FellowsBodyId: BodyId = BodyId::Technical; -} - -/// Privileged origin that represents Root or Fellows. -pub type RootOrFellows = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = RootOrFellows; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -pub const PERIOD: u32 = 6 * HOURS; -pub const OFFSET: u32 = 0; - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; - type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // StakingAdmin pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow root, the StakingAdmin to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = ConstU32; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = ConstU32<100>; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - - // Collator support. The order of these 4 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, - } -); - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_session, SessionBench::] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - // XCM - [pallet_xcm, PolkadotXcm] - // NOTE: Make sure you point to the individual modules below. - [pallet_xcm_benchmarks::fungible, XcmBalances] - [pallet_xcm_benchmarks::generic, XcmGeneric] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - // This is defined once again in dispatch_benchmark, because list_benchmarks! - // and add_benchmarks! are macros exported by define_benchmarks! macros and those types - // are referenced in that call. - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError, TrackedStorageKey}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use xcm::latest::prelude::*; - use xcm_config::DotRelayLocation; - - impl pallet_xcm_benchmarks::Config for Runtime { - type XcmConfig = xcm_config::XcmConfig; - type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { - Ok(DotRelayLocation::get()) - } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { - // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(DotRelayLocation::get()), - fun: Fungible(1_000_000 * UNITS), - } - ]; - assets.into() - } - } - - parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - DotRelayLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(DotRelayLocation::get()) }, - )); - pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; - } - - impl pallet_xcm_benchmarks::fungible::Config for Runtime { - type TransactAsset = Balances; - - type CheckedAccount = CheckedAccount; - type TrustedTeleporter = TrustedTeleporter; - type TrustedReserve = TrustedReserve; - - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(DotRelayLocation::get()), - fun: Fungible(UNITS), - } - } - } - - impl pallet_xcm_benchmarks::generic::Config for Runtime { - type RuntimeCall = RuntimeCall; - - fn worst_case_response() -> (u64, Response) { - (0u64, Response::Version(Default::default())) - } - - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((DotRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) - } - - fn subscribe_origin() -> Result { - Ok(DotRelayLocation::get()) - } - - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = DotRelayLocation::get(); - let assets: MultiAssets = (Concrete(DotRelayLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; - Ok((origin, ticket, assets)) - } - - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - } - - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/block_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/block_weights.rs deleted file mode 100644 index 2bd7975bf98c..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs deleted file mode 100644 index 740c3e9dd0a1..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `cumulus_pallet_xcmp_queue` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=cumulus_pallet_xcmp_queue -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `cumulus_pallet_xcmp_queue`. -pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_043_000 picoseconds. - Weight::from_parts(5_211_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_011_000 picoseconds. - Weight::from_parts(5_171_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/extrinsic_weights.rs deleted file mode 100644 index 898d72ec5b19..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs deleted file mode 100644 index 62883b2d9073..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_047_000 picoseconds. - Weight::from_parts(2_087_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(390, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_335_000 picoseconds. - Weight::from_parts(7_507_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2 - .saturating_add(Weight::from_parts(1_751, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_673_000 picoseconds. - Weight::from_parts(3_953_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `119` - // Estimated: `1604` - // Minimum execution time: 98_791_992_000 picoseconds. - Weight::from_parts(101_799_041_000, 0) - .saturating_add(Weight::from_parts(0, 1604)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_144_000 picoseconds. - Weight::from_parts(2_206_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_254 - .saturating_add(Weight::from_parts(740_881, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_117_000 picoseconds. - Weight::from_parts(2_192_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_024 - .saturating_add(Weight::from_parts(558_397, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `68 + p * (69 ±0)` - // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 3_907_000 picoseconds. - Weight::from_parts(4_050_000, 0) - .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 2_228 - .saturating_add(Weight::from_parts(1_212_760, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/mod.rs deleted file mode 100644 index 457d00f36bd9..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/mod.rs +++ /dev/null @@ -1,38 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Expose the auto generated weight files. - -pub mod block_weights; -pub mod cumulus_pallet_xcmp_queue; -pub mod extrinsic_weights; -pub mod frame_system; -pub mod pallet_balances; -pub mod pallet_collator_selection; -pub mod pallet_multisig; -pub mod pallet_session; -pub mod pallet_timestamp; -pub mod pallet_utility; -pub mod pallet_xcm; -pub mod paritydb_weights; -pub mod rocksdb_weights; -pub mod xcm; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs deleted file mode 100644 index d58126b3fd61..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_balances.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_balances` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_balances`. -pub struct WeightInfo(PhantomData); -impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_allow_death() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 54_518_000 picoseconds. - Weight::from_parts(55_244_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 40_152_000 picoseconds. - Weight::from_parts(41_084_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_creating() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 15_234_000 picoseconds. - Weight::from_parts(15_576_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_killing() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 22_173_000 picoseconds. - Weight::from_parts(22_964_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 56_636_000 picoseconds. - Weight::from_parts(57_316_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_all() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 50_829_000 picoseconds. - Weight::from_parts(51_264_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_unreserve() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 17_887_000 picoseconds. - Weight::from_parts(18_365_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:999 w:999) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(u: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 16_754_000 picoseconds. - Weight::from_parts(17_237_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 15_088 - .saturating_add(Weight::from_parts(15_392_959, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs deleted file mode 100644 index 0b153be27193..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_collator_selection.rs +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collator_selection` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_collator_selection -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collator_selection`. -pub struct WeightInfo(PhantomData); -impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:20 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `196 + b * (79 ±0)` - // Estimated: `1187 + b * (2555 ±0)` - // Minimum execution time: 14_735_000 picoseconds. - Weight::from_parts(11_846_916, 0) - .saturating_add(Weight::from_parts(0, 1187)) - // Standard Error: 8_592 - .saturating_add(Weight::from_parts(3_270_517, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) - } - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `757 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 48_332_000 picoseconds. - Weight::from_parts(46_158_586, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 13_938 - .saturating_add(Weight::from_parts(174_493, 0).saturating_mul(b.into())) - // Standard Error: 2_642 - .saturating_add(Weight::from_parts(196_691, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `82 + b * (32 ±0)` - // Estimated: `6287` - // Minimum execution time: 15_323_000 picoseconds. - Weight::from_parts(15_016_873, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_970 - .saturating_add(Weight::from_parts(199_160, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn set_desired_candidates() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_393_000 picoseconds. - Weight::from_parts(7_723_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_426_000 picoseconds. - Weight::from_parts(7_783_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `740 + c * (52 ±0)` - // Estimated: `6287 + c * (54 ±0)` - // Minimum execution time: 41_040_000 picoseconds. - Weight::from_parts(43_902_200, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_360 - .saturating_add(Weight::from_parts(211_897, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[3, 100]`. - fn leave_intent(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `334 + c * (49 ±0)` - // Estimated: `6287` - // Minimum execution time: 33_429_000 picoseconds. - Weight::from_parts(36_413_045, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_947 - .saturating_add(Weight::from_parts(177_461, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - fn note_author() -> Weight { - // Proof Size summary in bytes: - // Measured: `155` - // Estimated: `6196` - // Minimum execution time: 45_300_000 picoseconds. - Weight::from_parts(46_280_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:97 w:97) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `r` is `[1, 100]`. - /// The range of component `c` is `[1, 100]`. - fn new_session(r: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `2263 + c * (97 ±0) + r * (115 ±0)` - // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 17_524_000 picoseconds. - Weight::from_parts(17_590_000, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 354_091 - .saturating_add(Weight::from_parts(15_829_767, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs deleted file mode 100644 index 9984823b1c16..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_multisig.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_multisig` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_multisig -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_multisig`. -pub struct WeightInfo(PhantomData); -impl pallet_multisig::WeightInfo for WeightInfo { - /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_284_000 picoseconds. - Weight::from_parts(14_761_699, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 7 - .saturating_add(Weight::from_parts(491, 0).saturating_mul(z.into())) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 44_043_000 picoseconds. - Weight::from_parts(32_303_705, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_280 - .saturating_add(Weight::from_parts(133_233, 0).saturating_mul(s.into())) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_467, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[3, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_approve(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 28_494_000 picoseconds. - Weight::from_parts(19_053_318, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 791 - .saturating_add(Weight::from_parts(112_935, 0).saturating_mul(s.into())) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_427, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `388 + s * (33 ±0)` - // Estimated: `6811` - // Minimum execution time: 49_505_000 picoseconds. - Weight::from_parts(36_407_515, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_595 - .saturating_add(Weight::from_parts(166_201, 0).saturating_mul(s.into())) - // Standard Error: 15 - .saturating_add(Weight::from_parts(1_481, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 30_977_000 picoseconds. - Weight::from_parts(32_222_158, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_872 - .saturating_add(Weight::from_parts(125_197, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 17_351_000 picoseconds. - Weight::from_parts(18_130_793, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 902 - .saturating_add(Weight::from_parts(109_485, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + s * (1 ±0)` - // Estimated: `6811` - // Minimum execution time: 31_554_000 picoseconds. - Weight::from_parts(33_116_785, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 882 - .saturating_add(Weight::from_parts(119_357, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs deleted file mode 100644 index 3b74d0afd189..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_session.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_session` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_session -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_session`. -pub struct WeightInfo(PhantomData); -impl pallet_session::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:1 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn set_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `297` - // Estimated: `3762` - // Minimum execution time: 16_905_000 picoseconds. - Weight::from_parts(17_310_000, 0) - .saturating_add(Weight::from_parts(0, 3762)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:0 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn purge_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `279` - // Estimated: `3744` - // Minimum execution time: 12_511_000 picoseconds. - Weight::from_parts(13_055_000, 0) - .saturating_add(Weight::from_parts(0, 3744)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs deleted file mode 100644 index fdb3c2ac9596..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_timestamp.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_timestamp` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_timestamp -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_timestamp`. -pub struct WeightInfo(PhantomData); -impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: `Timestamp::Now` (r:1 w:1) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Aura::CurrentSlot` (r:1 w:0) - /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set() -> Weight { - // Proof Size summary in bytes: - // Measured: `49` - // Estimated: `1493` - // Minimum execution time: 7_675_000 picoseconds. - Weight::from_parts(7_947_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn on_finalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `57` - // Estimated: `0` - // Minimum execution time: 3_342_000 picoseconds. - Weight::from_parts(3_443_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs deleted file mode 100644 index a7b31d3d3853..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_utility.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_utility` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_utility -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_utility`. -pub struct WeightInfo(PhantomData); -impl pallet_utility::WeightInfo for WeightInfo { - /// The range of component `c` is `[0, 1000]`. - fn batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_810_000 picoseconds. - Weight::from_parts(6_290_871, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_678 - .saturating_add(Weight::from_parts(5_193_419, 0).saturating_mul(c.into())) - } - fn as_derivative() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_753_000 picoseconds. - Weight::from_parts(4_890_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn batch_all(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_873_000 picoseconds. - Weight::from_parts(9_780_422, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_035 - .saturating_add(Weight::from_parts(5_473_943, 0).saturating_mul(c.into())) - } - fn dispatch_as() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_443_000 picoseconds. - Weight::from_parts(8_904_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn force_batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_820_000 picoseconds. - Weight::from_parts(8_206_355, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_327 - .saturating_add(Weight::from_parts(5_187_839, 0).saturating_mul(c.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs deleted file mode 100644 index c9e13f2bdb2f..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/pallet_xcm.rs +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_xcm`. -pub struct WeightInfo(PhantomData); -impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn send() -> Weight { - // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 25_510_000 picoseconds. - Weight::from_parts(25_755_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `1489` - // Minimum execution time: 24_125_000 picoseconds. - Weight::from_parts(25_559_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn reserve_transfer_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn execute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_625_000 picoseconds. - Weight::from_parts(9_232_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_default_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_690_000 picoseconds. - Weight::from_parts(2_906_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_subscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 30_131_000 picoseconds. - Weight::from_parts(31_138_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_unsubscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `3685` - // Minimum execution time: 32_411_000 picoseconds. - Weight::from_parts(33_009_000, 0) - .saturating_add(Weight::from_parts(0, 3685)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) - /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_suspension() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_548_000 picoseconds. - Weight::from_parts(2_727_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_supported_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 15_298_000 picoseconds. - Weight::from_parts(15_964_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notifiers() -> Weight { - // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_927_000 picoseconds. - Weight::from_parts(15_528_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn already_notified_target() -> Weight { - // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 16_409_000 picoseconds. - Weight::from_parts(16_960_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn notify_current_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `6046` - // Minimum execution time: 28_204_000 picoseconds. - Weight::from_parts(28_641_000, 0) - .saturating_add(Weight::from_parts(0, 6046)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn notify_target_migration_fail() -> Weight { - // Proof Size summary in bytes: - // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_576_000 picoseconds. - Weight::from_parts(8_895_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notify_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 15_263_000 picoseconds. - Weight::from_parts(15_726_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn migrate_and_notify_old_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 34_186_000 picoseconds. - Weight::from_parts(35_204_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/paritydb_weights.rs deleted file mode 100644 index 1c6d2ebe568c..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/rocksdb_weights.rs deleted file mode 100644 index aa0cb2b4bc37..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs deleted file mode 100644 index 4d7b626cb725..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/mod.rs +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod pallet_xcm_benchmarks_fungible; -mod pallet_xcm_benchmarks_generic; - -use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; -use frame_support::weights::Weight; -use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; -use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; -use xcm::{latest::prelude::*, DoubleEncoded}; - -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; -} - -const MAX_ASSETS: u64 = 100; - -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - match self { - Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), - Self::Wild(asset) => match asset { - All => weight.saturating_mul(MAX_ASSETS), - AllOf { fun, .. } => match fun { - WildFungibility::Fungible => weight, - // Magic number 2 has to do with the fact that we could have up to 2 times - // MaxAssetsIntoHolding in the worst-case scenario. - WildFungibility::NonFungible => - weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), - }, - AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - }, - } - } -} - -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().iter().count() as u64) - } -} - -pub struct BridgeHubPolkadotXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for BridgeHubPolkadotXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) - } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) - } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) - } - fn query_response( - _query_id: &u64, - _response: &Response, - _max_weight: &Weight, - _querier: &Option, - ) -> Weight { - XcmGeneric::::query_response() - } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) - } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) - } - fn transact( - _origin_type: &OriginKind, - _require_weight_at_most: &Weight, - _call: &DoubleEncoded, - ) -> Weight { - XcmGeneric::::transact() - } - fn hrmp_new_channel_open_request( - _sender: &u32, - _max_message_size: &u32, - _max_capacity: &u32, - ) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_accepted(_recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn clear_origin() -> Weight { - XcmGeneric::::clear_origin() - } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { - XcmGeneric::::descend_origin() - } - fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_error() - } - - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) - } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) - } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { - Weight::MAX - } - fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) - } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(200_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()); - hardcoded_weight.min(weight) - } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { - XcmGeneric::::report_holding() - } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { - XcmGeneric::::buy_execution() - } - fn refund_surplus() -> Weight { - XcmGeneric::::refund_surplus() - } - fn set_error_handler(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_error_handler() - } - fn set_appendix(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_appendix() - } - fn clear_error() -> Weight { - XcmGeneric::::clear_error() - } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { - XcmGeneric::::claim_asset() - } - fn trap(_code: &u64) -> Weight { - XcmGeneric::::trap() - } - fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { - XcmGeneric::::subscribe_version() - } - fn unsubscribe_version() -> Weight { - XcmGeneric::::unsubscribe_version() - } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) - } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) - } - fn expect_origin(_origin: &Option) -> Weight { - XcmGeneric::::expect_origin() - } - fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { - XcmGeneric::::expect_error() - } - fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { - XcmGeneric::::expect_transact_status() - } - fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::query_pallet() - } - fn expect_pallet( - _index: &u32, - _name: &Vec, - _module_name: &Vec, - _crate_major: &u32, - _min_crate_minor: &u32, - ) -> Weight { - XcmGeneric::::expect_pallet() - } - fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_transact_status() - } - fn clear_transact_status() -> Weight { - XcmGeneric::::clear_transact_status() - } - fn universal_origin(_: &Junction) -> Weight { - Weight::MAX - } - fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { - Weight::MAX - } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn set_fees_mode(_: &bool) -> Weight { - XcmGeneric::::set_fees_mode() - } - fn set_topic(_topic: &[u8; 32]) -> Weight { - XcmGeneric::::set_topic() - } - fn clear_topic() -> Weight { - XcmGeneric::::clear_topic() - } - fn alias_origin(_: &MultiLocation) -> Weight { - // XCM Executor does not currently support alias origin operations - Weight::MAX - } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { - XcmGeneric::::unpaid_execution() - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs deleted file mode 100644 index b02cfcbf75f3..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::fungible`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn withdraw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `3593` - // Minimum execution time: 23_862_000 picoseconds. - Weight::from_parts(24_603_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn transfer_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `153` - // Estimated: `6196` - // Minimum execution time: 51_101_000 picoseconds. - Weight::from_parts(51_976_000, 6196) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn transfer_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `223` - // Estimated: `6196` - // Minimum execution time: 72_983_000 picoseconds. - Weight::from_parts(74_099_000, 6196) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - // Storage: `Benchmark::Override` (r:0 w:0) - // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn reserve_asset_deposited() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 500_000_000_000 picoseconds. - Weight::from_parts(500_000_000_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_reserve_withdraw() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 27_131_000 picoseconds. - Weight::from_parts(28_062_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn receive_teleported_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_564_000 picoseconds. - Weight::from_parts(3_738_000, 0) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn deposit_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `52` - // Estimated: `3593` - // Minimum execution time: 24_453_000 picoseconds. - Weight::from_parts(25_216_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn deposit_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `122` - // Estimated: `3593` - // Minimum execution time: 48_913_000 picoseconds. - Weight::from_parts(50_202_000, 3593) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_teleport() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 27_592_000 picoseconds. - Weight::from_parts(28_099_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs deleted file mode 100644 index 87bd0a6173bc..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::generic` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-polkadot-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=bridge-hub-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::generic`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_holding() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 30_923_000 picoseconds. - Weight::from_parts(31_653_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn buy_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_837_000 picoseconds. - Weight::from_parts(2_932_000, 0) - } - // Storage: `PolkadotXcm::Queries` (r:1 w:0) - // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn query_response() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `3497` - // Minimum execution time: 10_319_000 picoseconds. - Weight::from_parts(10_614_000, 3497) - .saturating_add(T::DbWeight::get().reads(1)) - } - pub fn transact() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 11_466_000 picoseconds. - Weight::from_parts(12_005_000, 0) - } - pub fn refund_surplus() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_039_000 picoseconds. - Weight::from_parts(3_125_000, 0) - } - pub fn set_error_handler() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_655_000 picoseconds. - Weight::from_parts(2_717_000, 0) - } - pub fn set_appendix() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_655_000 picoseconds. - Weight::from_parts(2_695_000, 0) - } - pub fn clear_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_612_000 picoseconds. - Weight::from_parts(2_685_000, 0) - } - pub fn descend_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_286_000 picoseconds. - Weight::from_parts(3_425_000, 0) - } - pub fn clear_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_613_000 picoseconds. - Weight::from_parts(2_699_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 24_616_000 picoseconds. - Weight::from_parts(25_147_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) - // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn claim_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `90` - // Estimated: `3555` - // Minimum execution time: 14_511_000 picoseconds. - Weight::from_parts(14_831_000, 3555) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn trap() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_640_000 picoseconds. - Weight::from_parts(2_702_000, 0) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn subscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 26_044_000 picoseconds. - Weight::from_parts(26_561_000, 3503) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn unsubscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_568_000 picoseconds. - Weight::from_parts(4_764_000, 0) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn burn_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_953_000 picoseconds. - Weight::from_parts(4_079_000, 0) - } - pub fn expect_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_793_000 picoseconds. - Weight::from_parts(2_914_000, 0) - } - pub fn expect_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_719_000 picoseconds. - Weight::from_parts(2_829_000, 0) - } - pub fn expect_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_710_000 picoseconds. - Weight::from_parts(2_824_000, 0) - } - pub fn expect_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_941_000 picoseconds. - Weight::from_parts(3_201_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn query_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 28_080_000 picoseconds. - Weight::from_parts(28_920_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn expect_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_752_000 picoseconds. - Weight::from_parts(4_982_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `70` - // Estimated: `3535` - // Minimum execution time: 24_810_000 picoseconds. - Weight::from_parts(25_270_000, 3535) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn clear_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_676_000 picoseconds. - Weight::from_parts(2_780_000, 0) - } - pub fn set_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_624_000 picoseconds. - Weight::from_parts(2_710_000, 0) - } - pub fn clear_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_611_000 picoseconds. - Weight::from_parts(2_707_000, 0) - } - pub fn set_fees_mode() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_653_000 picoseconds. - Weight::from_parts(2_740_000, 0) - } - pub fn unpaid_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_821_000 picoseconds. - Weight::from_parts(2_874_000, 0) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs deleted file mode 100644 index 0b5831f028b0..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/xcm_config.rs +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use super::{ - AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing}, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; -use polkadot_parachain::primitives::Sibling; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; - -parameter_types! { - pub const DotRelayLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Polkadot); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when - // recognized. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognized. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; - pub type FellowsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } - }; -} -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - matches!( - call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - // Allow local users to buy weight credit. - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality - // get free execution. - AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // BridgeHub does not recognize a reserve location for any asset. Users must teleport DOT - // where allowed (e.g. with the Relay Chain). - type IsReserve = (); - /// Only allow teleportation of DOT. - type IsTeleporter = ConcreteNativeAssetFrom; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = WeightInfoBounds< - crate::weights::xcm::BridgeHubPolkadotXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type Trader = - UsingComponents>; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. - type Weigher = WeightInfoBounds< - crate::weights::xcm::BridgeHubPolkadotXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/tests/tests.rs deleted file mode 100644 index 9a3ccd59cd6d..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-polkadot/tests/tests.rs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -pub use bridge_hub_polkadot_runtime::{ - constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, - ParachainSystem, PolkadotXcm, Runtime, RuntimeEvent, SessionKeys, -}; -use codec::Decode; -use frame_support::parameter_types; -use parachains_common::{AccountId, AuraId}; - -const ALICE: [u8; 32] = [1u8; 32]; - -parameter_types! { - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); -} - -bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) } - ), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - 1002 -); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml deleted file mode 100644 index 2ff12e3ca936..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ /dev/null @@ -1,217 +0,0 @@ -[package] -name = "bridge-hub-rococo-runtime" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Rococo's BridgeHub parachain runtime" - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.183", optional = true, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -rococo-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = {path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0"} -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../../parachains/common", default-features = false } - -# Bridges -bp-bridge-hub-rococo = { path = "../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-wococo = { path = "../../../../bridges/primitives/chain-bridge-hub-wococo", default-features = false } -bp-header-chain = { path = "../../../../bridges/primitives/header-chain", default-features = false } -bp-messages = { path = "../../../../bridges/primitives/messages", default-features = false } -bp-parachains = { path = "../../../../bridges/primitives/parachains", default-features = false } -bp-polkadot-core = { path = "../../../../bridges/primitives/polkadot-core", default-features = false } -bp-relayers = { path = "../../../../bridges/primitives/relayers", default-features = false } -bp-runtime = { path = "../../../../bridges/primitives/runtime", default-features = false } -bp-rococo = { path = "../../../../bridges/primitives/chain-rococo", default-features = false } -bp-wococo = { path = "../../../../bridges/primitives/chain-wococo", default-features = false } -pallet-bridge-grandpa = { path = "../../../../bridges/modules/grandpa", default-features = false } -pallet-bridge-messages = { path = "../../../../bridges/modules/messages", default-features = false } -pallet-bridge-parachains = { path = "../../../../bridges/modules/parachains", default-features = false } -pallet-bridge-relayers = { path = "../../../../bridges/modules/relayers", default-features = false } -bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", default-features = false } - -[dev-dependencies] -static_assertions = "1.1" -bridge-hub-test-utils = { path = "../test-utils"} -bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", features = ["integrity-test"] } -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = [ - "std", -] -std = [ - "bp-bridge-hub-rococo/std", - "bp-bridge-hub-wococo/std", - "bp-header-chain/std", - "bp-messages/std", - "bp-parachains/std", - "bp-polkadot-core/std", - "bp-relayers/std", - "bp-runtime/std", - "bp-rococo/std", - "bp-wococo/std", - "bridge-runtime-common/std", - "codec/std", - "log/std", - "scale-info/std", - "serde", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "frame-benchmarking/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-bridge-grandpa/std", - "pallet-bridge-messages/std", - "pallet-bridge-parachains/std", - "pallet-bridge-relayers/std", - "pallet-collator-selection/std", - "pallet-multisig/std", - "pallet-session/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-utility/std", - "pallet-xcm/std", - "parachain-info/std", - "parachains-common/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "rococo-runtime-constants/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-io/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "substrate-wasm-builder", -] - -runtime-benchmarks = [ - "bridge-runtime-common/runtime-benchmarks", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-bridge-grandpa/runtime-benchmarks", - "pallet-bridge-messages/runtime-benchmarks", - "pallet-bridge-parachains/runtime-benchmarks", - "pallet-bridge-relayers/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", -] - -try-runtime = [ - "pallet-bridge-grandpa/try-runtime", - "pallet-bridge-messages/try-runtime", - "pallet-bridge-parachains/try-runtime", - "pallet-bridge-relayers/try-runtime", - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-multisig/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/build.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs deleted file mode 100644 index 274951b3bd29..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_rococo_config.rs +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Bridge definitions that are used on Rococo to bridge with Wococo. - -use crate::{ - BridgeParachainWococoInstance, BridgeWococoMessages, ParachainInfo, Runtime, - WithBridgeHubWococoMessagesInstance, XcmRouter, -}; -use bp_messages::LaneId; -use bridge_runtime_common::{ - messages, - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - MessageBridge, ThisChainWithMessages, UnderlyingChainProvider, - }, - messages_xcm_extension::{SenderAndLane, XcmBlobHauler, XcmBlobHaulerAdapter}, - refund_relayer_extension::{ - ActualFeeRefund, RefundBridgedParachainMessages, RefundableMessagesLane, - RefundableParachain, - }, -}; -use frame_support::{parameter_types, traits::PalletInfoAccess, RuntimeDebug}; -use xcm::{ - latest::prelude::*, - prelude::{InteriorMultiLocation, NetworkId}, -}; -use xcm_builder::{BridgeBlobDispatcher, HaulBlobExporter}; - -parameter_types! { - pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; - pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; - pub const BridgeHubWococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID; - pub BridgeWococoMessagesPalletInstance: InteriorMultiLocation = X1(PalletInstance(::index() as u8)); - pub BridgeHubRococoUniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Rococo), Parachain(ParachainInfo::parachain_id().into())); - pub WococoGlobalConsensusNetwork: NetworkId = NetworkId::Wococo; - pub ActiveOutboundLanesToBridgeHubWococo: &'static [bp_messages::LaneId] = &[DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO]; - pub PriorityBoostPerMessage: u64 = 921_900_294; - - pub FromAssetHubRococoToAssetHubWococoRoute: SenderAndLane = SenderAndLane::new( - ParentThen(X1(Parachain(1000))).into(), - DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, - ); -} - -/// Proof of messages, coming from Wococo. -pub type FromWococoBridgeHubMessagesProof = - FromBridgedChainMessagesProof; -/// Messages delivery proof for Rococo Bridge Hub -> Wococo Bridge Hub messages. -pub type ToWococoBridgeHubMessagesDeliveryProof = - FromBridgedChainMessagesDeliveryProof; - -/// Dispatches received XCM messages from other bridge -pub type OnBridgeHubRococoBlobDispatcher = BridgeBlobDispatcher< - XcmRouter, - BridgeHubRococoUniversalLocation, - BridgeWococoMessagesPalletInstance, ->; - -/// Export XCM messages to be relayed to the otherside -pub type ToBridgeHubWococoHaulBlobExporter = HaulBlobExporter< - XcmBlobHaulerAdapter, - WococoGlobalConsensusNetwork, - (), ->; -pub struct ToBridgeHubWococoXcmBlobHauler; -impl XcmBlobHauler for ToBridgeHubWococoXcmBlobHauler { - type Runtime = Runtime; - type MessagesInstance = WithBridgeHubWococoMessagesInstance; - type SenderAndLane = FromAssetHubRococoToAssetHubWococoRoute; - - type ToSourceChainSender = crate::XcmRouter; - type CongestedMessage = (); - type UncongestedMessage = (); -} -pub const DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO: LaneId = LaneId([0, 0, 0, 1]); - -/// Messaging Bridge configuration for BridgeHubRococo -> BridgeHubWococo -pub struct WithBridgeHubWococoMessageBridge; -impl MessageBridge for WithBridgeHubWococoMessageBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = - bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME; - type ThisChain = BridgeHubRococo; - type BridgedChain = BridgeHubWococo; - type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< - Runtime, - BridgeParachainWococoInstance, - bp_bridge_hub_wococo::BridgeHubWococo, - >; -} - -/// Message verifier for BridgeHubWococo messages sent from BridgeHubRococo -pub type ToBridgeHubWococoMessageVerifier = - messages::source::FromThisChainMessageVerifier; - -/// Maximal outbound payload size of BridgeHubRococo -> BridgeHubWococo messages. -pub type ToBridgeHubWococoMaximalOutboundPayloadSize = - messages::source::FromThisChainMaximalOutboundPayloadSize; - -/// BridgeHubWococo chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubWococo; - -impl UnderlyingChainProvider for BridgeHubWococo { - type Chain = bp_bridge_hub_wococo::BridgeHubWococo; -} - -impl messages::BridgedChainWithMessages for BridgeHubWococo {} - -/// BridgeHubRococo chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubRococo; - -impl UnderlyingChainProvider for BridgeHubRococo { - type Chain = bp_bridge_hub_rococo::BridgeHubRococo; -} - -impl ThisChainWithMessages for BridgeHubRococo { - type RuntimeOrigin = crate::RuntimeOrigin; -} - -/// Signed extension that refunds relayers that are delivering messages from the Wococo parachain. -pub type BridgeRefundBridgeHubWococoMessages = RefundBridgedParachainMessages< - Runtime, - RefundableParachain, - RefundableMessagesLane, - ActualFeeRefund, - PriorityBoostPerMessage, - StrBridgeRefundBridgeHubWococoMessages, ->; -bp_runtime::generate_static_str_provider!(BridgeRefundBridgeHubWococoMessages); - -parameter_types! { - pub const BridgeHubWococoMessagesLane: bp_messages::LaneId = DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO; -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::BridgeGrandpaWococoInstance; - use bridge_runtime_common::{ - assert_complete_bridge_types, - integrity::{ - assert_complete_bridge_constants, check_message_lane_weights, - AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, - AssertCompleteBridgeConstants, - }, - }; - - #[test] - fn ensure_bridge_hub_rococo_message_lane_weights_are_correct() { - check_message_lane_weights::< - bp_bridge_hub_rococo::BridgeHubRococo, - Runtime, - WithBridgeHubWococoMessagesInstance, - >( - bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE, - bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, - bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, - true, - ); - } - - #[test] - fn ensure_bridge_integrity() { - assert_complete_bridge_types!( - runtime: Runtime, - with_bridged_chain_grandpa_instance: BridgeGrandpaWococoInstance, - with_bridged_chain_messages_instance: WithBridgeHubWococoMessagesInstance, - bridge: WithBridgeHubWococoMessageBridge, - this_chain: bp_rococo::Rococo, - bridged_chain: bp_wococo::Wococo, - ); - - assert_complete_bridge_constants::< - Runtime, - BridgeGrandpaWococoInstance, - WithBridgeHubWococoMessagesInstance, - WithBridgeHubWococoMessageBridge, - >(AssertCompleteBridgeConstants { - this_chain_constants: AssertChainConstants { - block_length: bp_bridge_hub_rococo::BlockLength::get(), - block_weights: bp_bridge_hub_rococo::BlockWeights::get(), - }, - messages_pallet_constants: AssertBridgeMessagesPalletConstants { - max_unrewarded_relayers_in_bridged_confirmation_tx: - bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, - max_unconfirmed_messages_in_bridged_confirmation_tx: - bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, - bridged_chain_id: bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID, - }, - pallet_names: AssertBridgePalletNames { - with_this_chain_messages_pallet_name: - bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME, - with_bridged_chain_grandpa_pallet_name: bp_wococo::WITH_WOCOCO_GRANDPA_PALLET_NAME, - with_bridged_chain_messages_pallet_name: - bp_bridge_hub_wococo::WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME, - }, - }); - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs deleted file mode 100644 index e6342af128ed..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_hub_wococo_config.rs +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Bridge definitions that are used on Wococo to bridge with Rococo. - -use crate::{ - BridgeParachainRococoInstance, BridgeRococoMessages, ParachainInfo, Runtime, - WithBridgeHubRococoMessagesInstance, XcmRouter, -}; -use bp_messages::LaneId; -use bridge_runtime_common::{ - messages, - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - MessageBridge, ThisChainWithMessages, UnderlyingChainProvider, - }, - messages_xcm_extension::{SenderAndLane, XcmBlobHauler, XcmBlobHaulerAdapter}, - refund_relayer_extension::{ - ActualFeeRefund, RefundBridgedParachainMessages, RefundableMessagesLane, - RefundableParachain, - }, -}; -use frame_support::{parameter_types, traits::PalletInfoAccess, RuntimeDebug}; -use xcm::{ - latest::prelude::*, - prelude::{InteriorMultiLocation, NetworkId}, -}; -use xcm_builder::{BridgeBlobDispatcher, HaulBlobExporter}; - -parameter_types! { - pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; - pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = - bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; - pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID; - pub BridgeHubWococoUniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Wococo), Parachain(ParachainInfo::parachain_id().into())); - pub BridgeRococoMessagesPalletInstance: InteriorMultiLocation = X1(PalletInstance(::index() as u8)); - pub RococoGlobalConsensusNetwork: NetworkId = NetworkId::Rococo; - pub ActiveOutboundLanesToBridgeHubRococo: &'static [bp_messages::LaneId] = &[DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO]; - pub PriorityBoostPerMessage: u64 = 921_900_294; - - pub FromAssetHubWococoToAssetHubRococoRoute: SenderAndLane = SenderAndLane::new( - ParentThen(X1(Parachain(1000))).into(), - DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, - ); -} - -/// Proof of messages, coming from Rococo. -pub type FromRococoBridgeHubMessagesProof = - FromBridgedChainMessagesProof; -/// Messages delivery proof for Rococo Bridge Hub -> Wococo Bridge Hub messages. -pub type ToRococoBridgeHubMessagesDeliveryProof = - FromBridgedChainMessagesDeliveryProof; - -/// Dispatches received XCM messages from other bridge -pub type OnBridgeHubWococoBlobDispatcher = BridgeBlobDispatcher< - XcmRouter, - BridgeHubWococoUniversalLocation, - BridgeRococoMessagesPalletInstance, ->; - -/// Export XCM messages to be relayed to the otherside -pub type ToBridgeHubRococoHaulBlobExporter = HaulBlobExporter< - XcmBlobHaulerAdapter, - RococoGlobalConsensusNetwork, - (), ->; -pub struct ToBridgeHubRococoXcmBlobHauler; -impl XcmBlobHauler for ToBridgeHubRococoXcmBlobHauler { - type Runtime = Runtime; - type MessagesInstance = WithBridgeHubRococoMessagesInstance; - type SenderAndLane = FromAssetHubWococoToAssetHubRococoRoute; - - type ToSourceChainSender = crate::XcmRouter; - type CongestedMessage = (); - type UncongestedMessage = (); -} -pub const DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO: LaneId = LaneId([0, 0, 0, 1]); - -/// Messaging Bridge configuration for BridgeHubWococo -> BridgeHubRococo -pub struct WithBridgeHubRococoMessageBridge; -impl MessageBridge for WithBridgeHubRococoMessageBridge { - const BRIDGED_MESSAGES_PALLET_NAME: &'static str = - bp_bridge_hub_wococo::WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME; - type ThisChain = BridgeHubWococo; - type BridgedChain = BridgeHubRococo; - type BridgedHeaderChain = pallet_bridge_parachains::ParachainHeaders< - Runtime, - BridgeParachainRococoInstance, - bp_bridge_hub_rococo::BridgeHubRococo, - >; -} - -/// Message verifier for BridgeHubRococo messages sent from BridgeHubWococo -pub type ToBridgeHubRococoMessageVerifier = - messages::source::FromThisChainMessageVerifier; - -/// Maximal outbound payload size of BridgeHubWococo -> BridgeHubRococo messages. -pub type ToBridgeHubRococoMaximalOutboundPayloadSize = - messages::source::FromThisChainMaximalOutboundPayloadSize; - -/// BridgeHubRococo chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubRococo; - -impl UnderlyingChainProvider for BridgeHubRococo { - type Chain = bp_bridge_hub_rococo::BridgeHubRococo; -} - -impl messages::BridgedChainWithMessages for BridgeHubRococo {} - -/// BridgeHubWococo chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubWococo; - -impl UnderlyingChainProvider for BridgeHubWococo { - type Chain = bp_bridge_hub_wococo::BridgeHubWococo; -} - -impl ThisChainWithMessages for BridgeHubWococo { - type RuntimeOrigin = crate::RuntimeOrigin; -} - -/// Signed extension that refunds relayers that are delivering messages from the Rococo parachain. -pub type BridgeRefundBridgeHubRococoMessages = RefundBridgedParachainMessages< - Runtime, - RefundableParachain, - RefundableMessagesLane, - ActualFeeRefund, - PriorityBoostPerMessage, - StrBridgeRefundBridgeHubRococoMessages, ->; -bp_runtime::generate_static_str_provider!(BridgeRefundBridgeHubRococoMessages); - -parameter_types! { - pub const BridgeHubRococoMessagesLane: bp_messages::LaneId = DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO; -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::BridgeGrandpaRococoInstance; - use bridge_runtime_common::{ - assert_complete_bridge_types, - integrity::{ - assert_complete_bridge_constants, check_message_lane_weights, - AssertBridgeMessagesPalletConstants, AssertBridgePalletNames, AssertChainConstants, - AssertCompleteBridgeConstants, - }, - }; - - #[test] - fn ensure_bridge_hub_wococo_message_lane_weights_are_correct() { - check_message_lane_weights::< - bp_bridge_hub_wococo::BridgeHubWococo, - Runtime, - WithBridgeHubRococoMessagesInstance, - >( - bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE, - bp_bridge_hub_wococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, - bp_bridge_hub_wococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, - true, - ); - } - - #[test] - fn ensure_bridge_integrity() { - assert_complete_bridge_types!( - runtime: Runtime, - with_bridged_chain_grandpa_instance: BridgeGrandpaRococoInstance, - with_bridged_chain_messages_instance: WithBridgeHubRococoMessagesInstance, - bridge: WithBridgeHubRococoMessageBridge, - this_chain: bp_wococo::Wococo, - bridged_chain: bp_rococo::Rococo, - ); - - assert_complete_bridge_constants::< - Runtime, - BridgeGrandpaRococoInstance, - WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, - >(AssertCompleteBridgeConstants { - this_chain_constants: AssertChainConstants { - block_length: bp_bridge_hub_wococo::BlockLength::get(), - block_weights: bp_bridge_hub_wococo::BlockWeights::get(), - }, - messages_pallet_constants: AssertBridgeMessagesPalletConstants { - max_unrewarded_relayers_in_bridged_confirmation_tx: - bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, - max_unconfirmed_messages_in_bridged_confirmation_tx: - bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, - bridged_chain_id: bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID, - }, - pallet_names: AssertBridgePalletNames { - with_this_chain_messages_pallet_name: - bp_bridge_hub_wococo::WITH_BRIDGE_HUB_WOCOCO_MESSAGES_PALLET_NAME, - with_bridged_chain_grandpa_pallet_name: bp_rococo::WITH_ROCOCO_GRANDPA_PALLET_NAME, - with_bridged_chain_messages_pallet_name: - bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME, - }, - }); - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/constants.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/constants.rs deleted file mode 100644 index ba80cd2b6da7..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/constants.rs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod currency { - use polkadot_core_primitives::Balance; - use rococo_runtime_constants as constants; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain (v9010). - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // map to 1/100 of what the rococo relay chain charges - constants::currency::deposit(items, bytes) / 100 - } -} - -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - `[0, MAXIMUM_BLOCK_WEIGHT]` - /// - `[Balance::min, Balance::max]` - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Bridge Hub, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs deleted file mode 100644 index 8c95072bdc26..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ /dev/null @@ -1,1309 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod bridge_hub_rococo_config; -pub mod bridge_hub_wococo_config; -pub mod constants; -mod weights; -pub mod xcm_config; - -use constants::currency::*; -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, Everything}, - weights::{ConstantMultiplier, Weight}, - PalletId, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use xcm_config::{XcmConfig, XcmOriginToTransactDispatchOrigin}; - -use bp_parachains::SingleParaStoredHeaderDataBuilder; -use bp_runtime::HeaderId; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -use crate::{ - bridge_hub_rococo_config::{ - BridgeRefundBridgeHubWococoMessages, OnBridgeHubRococoBlobDispatcher, - WithBridgeHubWococoMessageBridge, - }, - bridge_hub_wococo_config::{ - BridgeRefundBridgeHubRococoMessages, OnBridgeHubWococoBlobDispatcher, - WithBridgeHubRococoMessageBridge, - }, - constants::fee::WeightToFee, - xcm_config::XcmRouter, -}; -use bridge_runtime_common::{ - messages::{source::TargetHeaderChainAdapter, target::SourceHeaderChainAdapter}, - messages_xcm_extension::{XcmAsPlainPayload, XcmBlobMessageDispatch}, -}; -use parachains_common::{ - impls::DealWithFees, AccountId, Balance, BlockNumber, Hash, Header, Nonce, Signature, - AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, -}; -use xcm_executor::XcmExecutor; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Block type as expected by this runtime. -pub type Block = generic::Block; - -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; - -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; - -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, - BridgeRejectObsoleteHeadersAndMessages, - (BridgeRefundBridgeHubRococoMessages, BridgeRefundBridgeHubWococoMessages), -); - -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Migrations to apply on runtime upgrade. -pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("bridge-hub-rococo"), - impl_name: create_runtime_str!("bridge-hub-rococo"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 3, - state_version: 1, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u16 = 42; -} - -// Configure FRAME pallets to include in runtime. - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; - /// What to do if a new account is created. - type OnNewAccount = (); - /// What to do if an account is fully reaped from the system. - type OnKilledAccount = (); - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// The basic call filter to use in dispatchable. - type BaseCallFilter = Everything; - /// Weight information for the extrinsics of this pallet. - type SystemWeightInfo = weights::frame_system::WeightInfo; - /// Block & extrinsics weights: base values and limits. - type BlockWeights = RuntimeBlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = RuntimeBlockLength; - /// This is used as an identifier of the chain. 42 is the generic substrate prefix. - type SS58Prefix = SS58Prefix; - /// The action to take on a Runtime Upgrade - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - /// The type for recording an account's balance. - type Balance = Balance; - type DustRemoval = (); - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxLocks = ConstU32<50>; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type OperationalFeeMultiplier = ConstU8<5>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = XcmpQueue; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EnsureRoot; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -pub const PERIOD: u32 = 6 * HOURS; -pub const OFFSET: u32 = 0; - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; - type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; -} - -pub type CollatorSelectionUpdateOrigin = EnsureRoot; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = ConstU32; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = ConstU32<100>; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -// Add bridge pallets (GPA) - -/// Add GRANDPA bridge pallet to track Wococo relay chain on Rococo BridgeHub -pub type BridgeGrandpaWococoInstance = pallet_bridge_grandpa::Instance1; -impl pallet_bridge_grandpa::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type BridgedChain = bp_wococo::Wococo; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; - type HeadersToKeep = RelayChainHeadersToKeep; - type WeightInfo = weights::pallet_bridge_grandpa_bridge_wococo_grandpa::WeightInfo; -} - -/// Add GRANDPA bridge pallet to track Rococo relay chain on Wococo BridgeHub -pub type BridgeGrandpaRococoInstance = pallet_bridge_grandpa::Instance2; -impl pallet_bridge_grandpa::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type BridgedChain = bp_rococo::Rococo; - type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; - type HeadersToKeep = RelayChainHeadersToKeep; - type WeightInfo = weights::pallet_bridge_grandpa_bridge_rococo_grandpa::WeightInfo; -} - -parameter_types! { - pub const RelayChainHeadersToKeep: u32 = 1024; - pub const ParachainHeadsToKeep: u32 = 64; - pub const RelayerStakeLease: u32 = 8; - - pub const RococoBridgeParachainPalletName: &'static str = "Paras"; - pub const WococoBridgeParachainPalletName: &'static str = "Paras"; - pub const MaxRococoParaHeadDataSize: u32 = bp_rococo::MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE; - pub const MaxWococoParaHeadDataSize: u32 = bp_wococo::MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE; - - pub storage DeliveryRewardInBalance: u64 = 1_000_000; - pub storage RequiredStakeForStakeAndSlash: Balance = 1_000_000; - - pub const RelayerStakeReserveId: [u8; 8] = *b"brdgrlrs"; -} - -/// Add parachain bridge pallet to track Wococo bridge hub parachain -pub type BridgeParachainWococoInstance = pallet_bridge_parachains::Instance1; -impl pallet_bridge_parachains::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = weights::pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance::WeightInfo; - type BridgesGrandpaPalletInstance = BridgeGrandpaWococoInstance; - type ParasPalletName = WococoBridgeParachainPalletName; - type ParaStoredHeaderDataBuilder = - SingleParaStoredHeaderDataBuilder; - type HeadsToKeep = ParachainHeadsToKeep; - type MaxParaHeadDataSize = MaxWococoParaHeadDataSize; -} - -/// Add parachain bridge pallet to track Rococo bridge hub parachain -pub type BridgeParachainRococoInstance = pallet_bridge_parachains::Instance2; -impl pallet_bridge_parachains::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = weights::pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance::WeightInfo; - type BridgesGrandpaPalletInstance = BridgeGrandpaRococoInstance; - type ParasPalletName = RococoBridgeParachainPalletName; - type ParaStoredHeaderDataBuilder = - SingleParaStoredHeaderDataBuilder; - type HeadsToKeep = ParachainHeadsToKeep; - type MaxParaHeadDataSize = MaxRococoParaHeadDataSize; -} - -/// Add XCM messages support for BridgeHubRococo to support Rococo->Wococo XCM messages -pub type WithBridgeHubWococoMessagesInstance = pallet_bridge_messages::Instance1; -impl pallet_bridge_messages::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = weights::pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance::WeightInfo; - type BridgedChainId = bridge_hub_rococo_config::BridgeHubWococoChainId; - type ActiveOutboundLanes = bridge_hub_rococo_config::ActiveOutboundLanesToBridgeHubWococo; - type MaxUnrewardedRelayerEntriesAtInboundLane = - bridge_hub_rococo_config::MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = - bridge_hub_rococo_config::MaxUnconfirmedMessagesAtInboundLane; - - type MaximalOutboundPayloadSize = - bridge_hub_rococo_config::ToBridgeHubWococoMaximalOutboundPayloadSize; - type OutboundPayload = XcmAsPlainPayload; - - type InboundPayload = XcmAsPlainPayload; - type InboundRelayer = AccountId; - type DeliveryPayments = (); - - type TargetHeaderChain = TargetHeaderChainAdapter; - type LaneMessageVerifier = bridge_hub_rococo_config::ToBridgeHubWococoMessageVerifier; - type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< - Runtime, - WithBridgeHubWococoMessagesInstance, - DeliveryRewardInBalance, - >; - - type SourceHeaderChain = SourceHeaderChainAdapter; - type MessageDispatch = - XcmBlobMessageDispatch; - type OnMessagesDelivered = (); -} - -/// Add XCM messages support for BridgeHubWococo to support Wococo->Rococo XCM messages -pub type WithBridgeHubRococoMessagesInstance = pallet_bridge_messages::Instance2; -impl pallet_bridge_messages::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = weights::pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance::WeightInfo; - type BridgedChainId = bridge_hub_wococo_config::BridgeHubRococoChainId; - type ActiveOutboundLanes = bridge_hub_wococo_config::ActiveOutboundLanesToBridgeHubRococo; - type MaxUnrewardedRelayerEntriesAtInboundLane = - bridge_hub_wococo_config::MaxUnrewardedRelayerEntriesAtInboundLane; - type MaxUnconfirmedMessagesAtInboundLane = - bridge_hub_wococo_config::MaxUnconfirmedMessagesAtInboundLane; - - type MaximalOutboundPayloadSize = - bridge_hub_wococo_config::ToBridgeHubRococoMaximalOutboundPayloadSize; - type OutboundPayload = XcmAsPlainPayload; - - type InboundPayload = XcmAsPlainPayload; - type InboundRelayer = AccountId; - type DeliveryPayments = (); - - type TargetHeaderChain = TargetHeaderChainAdapter; - type LaneMessageVerifier = bridge_hub_wococo_config::ToBridgeHubRococoMessageVerifier; - type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter< - Runtime, - WithBridgeHubRococoMessagesInstance, - DeliveryRewardInBalance, - >; - - type SourceHeaderChain = SourceHeaderChainAdapter; - type MessageDispatch = - XcmBlobMessageDispatch; - type OnMessagesDelivered = (); -} - -/// Allows collect and claim rewards for relayers -impl pallet_bridge_relayers::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Reward = Balance; - type PaymentProcedure = - bp_relayers::PayRewardFromAccount, AccountId>; - type StakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< - AccountId, - BlockNumber, - Balances, - RelayerStakeReserveId, - RequiredStakeForStakeAndSlash, - RelayerStakeLease, - >; - type WeightInfo = weights::pallet_bridge_relayers::WeightInfo; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - - // Collator support. The order of these 4 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 36, - - // Rococo and Wococo Bridge Hubs are sharing the runtime, so this runtime has two sets of - // bridge pallets. Both are deployed at both runtimes, but only one set is actually used - // at particular runtime. - - // With-Wococo bridge modules that are active (used) at Rococo Bridge Hub runtime. - BridgeWococoGrandpa: pallet_bridge_grandpa::::{Pallet, Call, Storage, Event, Config} = 41, - BridgeWococoParachain: pallet_bridge_parachains::::{Pallet, Call, Storage, Event} = 42, - BridgeWococoMessages: pallet_bridge_messages::::{Pallet, Call, Storage, Event, Config} = 46, - - // With-Rococo bridge modules that are active (used) at Wococo Bridge Hub runtime. - BridgeRococoGrandpa: pallet_bridge_grandpa::::{Pallet, Call, Storage, Event, Config} = 43, - BridgeRococoParachain: pallet_bridge_parachains::::{Pallet, Call, Storage, Event} = 44, - BridgeRococoMessages: pallet_bridge_messages::::{Pallet, Call, Storage, Event, Config} = 45, - - BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event} = 47, - } -); - -bridge_runtime_common::generate_bridge_reject_obsolete_headers_and_messages! { - RuntimeCall, AccountId, - // Grandpa - BridgeRococoGrandpa, BridgeWococoGrandpa, - // Parachains - BridgeRococoParachain, BridgeWococoParachain, - // Messages - BridgeRococoMessages, BridgeWococoMessages -} - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_session, SessionBench::] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - // XCM - [pallet_xcm, PolkadotXcm] - // NOTE: Make sure you point to the individual modules below. - [pallet_xcm_benchmarks::fungible, XcmBalances] - [pallet_xcm_benchmarks::generic, XcmGeneric] - // Bridge pallets at Rococo - [pallet_bridge_grandpa, BridgeWococoGrandpa] - [pallet_bridge_parachains, BridgeParachainsBench::] - [pallet_bridge_messages, BridgeMessagesBench::] - // Bridge pallets at Wococo - [pallet_bridge_grandpa, BridgeRococoGrandpa] - [pallet_bridge_parachains, BridgeParachainsBench::] - [pallet_bridge_messages, BridgeMessagesBench::] - // Bridge relayer pallets - [pallet_bridge_relayers, BridgeRelayersBench::] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - impl bp_rococo::RococoFinalityApi for Runtime { - fn best_finalized() -> Option> { - BridgeRococoGrandpa::best_finalized() - } - fn synced_headers_grandpa_info( - ) -> Vec> { - BridgeRococoGrandpa::synced_headers_grandpa_info() - } - } - - impl bp_wococo::WococoFinalityApi for Runtime { - fn best_finalized() -> Option> { - BridgeWococoGrandpa::best_finalized() - } - fn synced_headers_grandpa_info( - ) -> Vec> { - BridgeWococoGrandpa::synced_headers_grandpa_info() - } - } - - - impl bp_bridge_hub_rococo::BridgeHubRococoFinalityApi for Runtime { - fn best_finalized() -> Option> { - BridgeRococoParachain::best_parachain_head_id::< - bp_bridge_hub_rococo::BridgeHubRococo - >().unwrap_or(None) - } - } - - impl bp_bridge_hub_wococo::BridgeHubWococoFinalityApi for Runtime { - fn best_finalized() -> Option> { - BridgeWococoParachain::best_parachain_head_id::< - bp_bridge_hub_wococo::BridgeHubWococo - >().unwrap_or(None) - } - } - - // This exposed by BridgeHubRococo - impl bp_bridge_hub_wococo::FromBridgeHubWococoInboundLaneApi for Runtime { - fn message_details( - lane: bp_messages::LaneId, - messages: Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails)>, - ) -> Vec { - bridge_runtime_common::messages_api::inbound_message_details::< - Runtime, - WithBridgeHubWococoMessagesInstance, - >(lane, messages) - } - } - - // This exposed by BridgeHubRococo - impl bp_bridge_hub_wococo::ToBridgeHubWococoOutboundLaneApi for Runtime { - fn message_details( - lane: bp_messages::LaneId, - begin: bp_messages::MessageNonce, - end: bp_messages::MessageNonce, - ) -> Vec { - bridge_runtime_common::messages_api::outbound_message_details::< - Runtime, - WithBridgeHubWococoMessagesInstance, - >(lane, begin, end) - } - } - - // This is exposed by BridgeHubWococo - impl bp_bridge_hub_rococo::FromBridgeHubRococoInboundLaneApi for Runtime { - fn message_details( - lane: bp_messages::LaneId, - messages: Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails)>, - ) -> Vec { - bridge_runtime_common::messages_api::inbound_message_details::< - Runtime, - WithBridgeHubRococoMessagesInstance, - >(lane, messages) - } - } - - // This is exposed by BridgeHubWococo - impl bp_bridge_hub_rococo::ToBridgeHubRococoOutboundLaneApi for Runtime { - fn message_details( - lane: bp_messages::LaneId, - begin: bp_messages::MessageNonce, - end: bp_messages::MessageNonce, - ) -> Vec { - bridge_runtime_common::messages_api::outbound_message_details::< - Runtime, - WithBridgeHubRococoMessagesInstance, - >(lane, begin, end) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - // This is defined once again in dispatch_benchmark, because list_benchmarks! - // and add_benchmarks! are macros exported by define_benchmarks! macros and those types - // are referenced in that call. - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - use pallet_bridge_parachains::benchmarking::Pallet as BridgeParachainsBench; - use pallet_bridge_messages::benchmarking::Pallet as BridgeMessagesBench; - use pallet_bridge_relayers::benchmarking::Pallet as BridgeRelayersBench; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError, TrackedStorageKey}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use xcm::latest::prelude::*; - use xcm_config::RelayLocation; - - impl pallet_xcm_benchmarks::Config for Runtime { - type XcmConfig = xcm_config::XcmConfig; - type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { - Ok(RelayLocation::get()) - } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { - // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(RelayLocation::get()), - fun: Fungible(1_000_000 * UNITS), - } - ]; - assets.into() - } - } - - parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - RelayLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(RelayLocation::get()) }, - )); - pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; - } - - impl pallet_xcm_benchmarks::fungible::Config for Runtime { - type TransactAsset = Balances; - - type CheckedAccount = CheckedAccount; - type TrustedTeleporter = TrustedTeleporter; - type TrustedReserve = TrustedReserve; - - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(RelayLocation::get()), - fun: Fungible(UNITS), - } - } - } - - impl pallet_xcm_benchmarks::generic::Config for Runtime { - type RuntimeCall = RuntimeCall; - - fn worst_case_response() -> (u64, Response) { - (0u64, Response::Version(Default::default())) - } - - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((RelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) - } - - fn subscribe_origin() -> Result { - Ok(RelayLocation::get()) - } - - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = RelayLocation::get(); - let assets: MultiAssets = (Concrete(RelayLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; - Ok((origin, ticket, assets)) - } - - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Ok((RelayLocation::get(), NetworkId::Wococo, X1(Parachain(100)))) - } - - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - } - - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - use bridge_runtime_common::messages_benchmarking::{prepare_message_delivery_proof_from_parachain, prepare_message_proof_from_parachain}; - use pallet_bridge_messages::benchmarking::{ - Config as BridgeMessagesConfig, - Pallet as BridgeMessagesBench, - MessageDeliveryProofParams, - MessageProofParams, - }; - - impl BridgeMessagesConfig for Runtime { - fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool { - let bench_lane_id = >::bench_lane_id(); - let bridged_chain_id = bp_runtime::BRIDGE_HUB_WOCOCO_CHAIN_ID; - pallet_bridge_relayers::Pallet::::relayer_reward( - relayer, - bp_relayers::RewardsAccountParams::new( - bench_lane_id, - bridged_chain_id, - bp_relayers::RewardsAccountOwner::BridgedChain - ) - ).is_some() - } - - fn prepare_message_proof( - params: MessageProofParams, - ) -> (bridge_hub_rococo_config::FromWococoBridgeHubMessagesProof, Weight) { - use cumulus_primitives_core::XcmpMessageSource; - assert!(XcmpQueue::take_outbound_messages(usize::MAX).is_empty()); - ParachainSystem::open_outbound_hrmp_channel_for_benchmarks(42.into()); - prepare_message_proof_from_parachain::< - Runtime, - BridgeGrandpaWococoInstance, - bridge_hub_rococo_config::WithBridgeHubWococoMessageBridge, - >(params, X2(GlobalConsensus(Rococo), Parachain(42))) - } - - fn prepare_message_delivery_proof( - params: MessageDeliveryProofParams, - ) -> bridge_hub_rococo_config::ToWococoBridgeHubMessagesDeliveryProof { - prepare_message_delivery_proof_from_parachain::< - Runtime, - BridgeGrandpaWococoInstance, - bridge_hub_rococo_config::WithBridgeHubWococoMessageBridge, - >(params) - } - - fn is_message_successfully_dispatched(_nonce: bp_messages::MessageNonce) -> bool { - use cumulus_primitives_core::XcmpMessageSource; - !XcmpQueue::take_outbound_messages(usize::MAX).is_empty() - } - } - - impl BridgeMessagesConfig for Runtime { - fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool { - let bench_lane_id = >::bench_lane_id(); - let bridged_chain_id = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID; - pallet_bridge_relayers::Pallet::::relayer_reward( - relayer, - bp_relayers::RewardsAccountParams::new( - bench_lane_id, - bridged_chain_id, - bp_relayers::RewardsAccountOwner::BridgedChain - ) - ).is_some() - } - - fn prepare_message_proof( - params: MessageProofParams, - ) -> (bridge_hub_wococo_config::FromRococoBridgeHubMessagesProof, Weight) { - use cumulus_primitives_core::XcmpMessageSource; - assert!(XcmpQueue::take_outbound_messages(usize::MAX).is_empty()); - ParachainSystem::open_outbound_hrmp_channel_for_benchmarks(42.into()); - prepare_message_proof_from_parachain::< - Runtime, - BridgeGrandpaRococoInstance, - bridge_hub_wococo_config::WithBridgeHubRococoMessageBridge, - >(params, X2(GlobalConsensus(Wococo), Parachain(42))) - } - - fn prepare_message_delivery_proof( - params: MessageDeliveryProofParams, - ) -> bridge_hub_wococo_config::ToRococoBridgeHubMessagesDeliveryProof { - prepare_message_delivery_proof_from_parachain::< - Runtime, - BridgeGrandpaRococoInstance, - bridge_hub_wococo_config::WithBridgeHubRococoMessageBridge, - >(params) - } - - fn is_message_successfully_dispatched(_nonce: bp_messages::MessageNonce) -> bool { - use cumulus_primitives_core::XcmpMessageSource; - !XcmpQueue::take_outbound_messages(usize::MAX).is_empty() - } - } - - use bridge_runtime_common::parachains_benchmarking::prepare_parachain_heads_proof; - use pallet_bridge_parachains::benchmarking::{ - Config as BridgeParachainsConfig, - Pallet as BridgeParachainsBench, - }; - use pallet_bridge_relayers::benchmarking::{ - Pallet as BridgeRelayersBench, - Config as BridgeRelayersConfig, - }; - - impl BridgeParachainsConfig for Runtime { - fn parachains() -> Vec { - use bp_runtime::Parachain; - vec![bp_polkadot_core::parachains::ParaId(bp_bridge_hub_wococo::BridgeHubWococo::PARACHAIN_ID)] - } - - fn prepare_parachain_heads_proof( - parachains: &[bp_polkadot_core::parachains::ParaId], - parachain_head_size: u32, - proof_size: bp_runtime::StorageProofSize, - ) -> ( - pallet_bridge_parachains::RelayBlockNumber, - pallet_bridge_parachains::RelayBlockHash, - bp_polkadot_core::parachains::ParaHeadsProof, - Vec<(bp_polkadot_core::parachains::ParaId, bp_polkadot_core::parachains::ParaHash)>, - ) { - prepare_parachain_heads_proof::( - parachains, - parachain_head_size, - proof_size, - ) - } - } - - impl BridgeParachainsConfig for Runtime { - fn parachains() -> Vec { - use bp_runtime::Parachain; - vec![bp_polkadot_core::parachains::ParaId(bp_bridge_hub_rococo::BridgeHubRococo::PARACHAIN_ID)] - } - - fn prepare_parachain_heads_proof( - parachains: &[bp_polkadot_core::parachains::ParaId], - parachain_head_size: u32, - proof_size: bp_runtime::StorageProofSize, - ) -> ( - pallet_bridge_parachains::RelayBlockNumber, - pallet_bridge_parachains::RelayBlockHash, - bp_polkadot_core::parachains::ParaHeadsProof, - Vec<(bp_polkadot_core::parachains::ParaId, bp_polkadot_core::parachains::ParaHash)>, - ) { - prepare_parachain_heads_proof::( - parachains, - parachain_head_size, - proof_size, - ) - } - } - - impl BridgeRelayersConfig for Runtime { - fn prepare_rewards_account( - account_params: bp_relayers::RewardsAccountParams, - reward: Balance, - ) { - let rewards_account = bp_relayers::PayRewardFromAccount::< - Balances, - AccountId - >::rewards_account(account_params); - Self::deposit_account(rewards_account, reward); - } - - fn deposit_account(account: AccountId, balance: Balance) { - use frame_support::traits::fungible::Mutate; - Balances::mint_into(&account, balance.saturating_add(ExistentialDeposit::get())).unwrap(); - } - } - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} - -#[cfg(test)] -mod tests { - use super::*; - use bp_runtime::TransactionEra; - use bridge_hub_test_utils::test_header; - use codec::Encode; - - pub type TestBlockHeader = - sp_runtime::generic::Header; - - #[test] - fn ensure_signed_extension_definition_is_compatible_with_relay() { - let payload: SignedExtra = ( - frame_system::CheckNonZeroSender::new(), - frame_system::CheckSpecVersion::new(), - frame_system::CheckTxVersion::new(), - frame_system::CheckGenesis::new(), - frame_system::CheckEra::from(sp_runtime::generic::Era::Immortal), - frame_system::CheckNonce::from(10), - frame_system::CheckWeight::new(), - pallet_transaction_payment::ChargeTransactionPayment::from(10), - BridgeRejectObsoleteHeadersAndMessages {}, - ( - BridgeRefundBridgeHubRococoMessages::default(), - BridgeRefundBridgeHubWococoMessages::default(), - ), - ); - - { - use bp_bridge_hub_rococo::BridgeHubSignedExtension; - let bhr_indirect_payload = bp_bridge_hub_rococo::SignedExtension::from_params( - 10, - 10, - TransactionEra::Immortal, - test_header::(1).hash(), - 10, - 10, - ); - assert_eq!(payload.encode(), bhr_indirect_payload.encode()); - } - - { - use bp_bridge_hub_wococo::BridgeHubSignedExtension; - let bhw_indirect_payload = bp_bridge_hub_wococo::SignedExtension::from_params( - 10, - 10, - TransactionEra::Immortal, - test_header::(1).hash(), - 10, - 10, - ); - assert_eq!(payload.encode(), bhw_indirect_payload.encode()); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/block_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs deleted file mode 100644 index 23bdc6fa4d72..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/cumulus_pallet_xcmp_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `cumulus_pallet_xcmp_queue` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=cumulus_pallet_xcmp_queue -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `cumulus_pallet_xcmp_queue`. -pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 4_930_000 picoseconds. - Weight::from_parts(5_292_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `1561` - // Minimum execution time: 5_012_000 picoseconds. - Weight::from_parts(5_282_000, 0) - .saturating_add(Weight::from_parts(0, 1561)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs deleted file mode 100644 index 7146e59f1d04..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 1_956_000 picoseconds. - Weight::from_parts(2_974_450, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(388, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_432_000 picoseconds. - Weight::from_parts(7_686_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_767, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_715_000 picoseconds. - Weight::from_parts(3_983_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `119` - // Estimated: `1604` - // Minimum execution time: 99_688_458_000 picoseconds. - Weight::from_parts(103_623_061_000, 0) - .saturating_add(Weight::from_parts(0, 1604)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_318_000 picoseconds. - Weight::from_parts(2_421_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_168 - .saturating_add(Weight::from_parts(765_555, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_162_000 picoseconds. - Weight::from_parts(2_228_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 951 - .saturating_add(Weight::from_parts(569_773, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `68 + p * (69 ±0)` - // Estimated: `71 + p * (70 ±0)` - // Minimum execution time: 3_795_000 picoseconds. - Weight::from_parts(3_895_000, 0) - .saturating_add(Weight::from_parts(0, 71)) - // Standard Error: 1_869 - .saturating_add(Weight::from_parts(1_209_251, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs deleted file mode 100644 index 81ecd10512f9..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ /dev/null @@ -1,91 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Expose the auto generated weight files. - -pub mod block_weights; -pub mod cumulus_pallet_xcmp_queue; -pub mod extrinsic_weights; -pub mod frame_system; -pub mod pallet_balances; -pub mod pallet_bridge_grandpa_bridge_rococo_grandpa; -pub mod pallet_bridge_grandpa_bridge_wococo_grandpa; -pub mod pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance; -pub mod pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance; -pub mod pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance; -pub mod pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance; -pub mod pallet_bridge_relayers; -pub mod pallet_collator_selection; -pub mod pallet_multisig; -pub mod pallet_session; -pub mod pallet_timestamp; -pub mod pallet_utility; -pub mod pallet_xcm; -pub mod paritydb_weights; -pub mod rocksdb_weights; -pub mod xcm; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; - -use crate::Runtime; -use frame_support::weights::Weight; - -// import trait from dependency module -use ::pallet_bridge_relayers::WeightInfoExt as _; - -impl pallet_bridge_messages::WeightInfoExt for pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance::WeightInfo { - fn expected_extra_storage_proof_size() -> u32 { - bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE - } - - fn receive_messages_proof_overhead_from_runtime() -> Weight { - pallet_bridge_relayers::WeightInfo::::receive_messages_proof_overhead_from_runtime() - } - - fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { - pallet_bridge_relayers::WeightInfo::::receive_messages_delivery_proof_overhead_from_runtime() - } -} - -impl pallet_bridge_messages::WeightInfoExt for pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance::WeightInfo { - fn expected_extra_storage_proof_size() -> u32 { - bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE - } - - fn receive_messages_proof_overhead_from_runtime() -> Weight { - pallet_bridge_relayers::WeightInfo::::receive_messages_proof_overhead_from_runtime() - } - - fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { - pallet_bridge_relayers::WeightInfo::::receive_messages_delivery_proof_overhead_from_runtime() - } -} - -impl pallet_bridge_parachains::WeightInfoExt for pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance::WeightInfo { - fn expected_extra_storage_proof_size() -> u32 { - bp_bridge_hub_rococo::EXTRA_STORAGE_PROOF_SIZE - } -} - -impl pallet_bridge_parachains::WeightInfoExt for pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance::WeightInfo { - fn expected_extra_storage_proof_size() -> u32 { - bp_bridge_hub_wococo::EXTRA_STORAGE_PROOF_SIZE - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs deleted file mode 100644 index 9f16d8b8141b..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_balances.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_balances` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_balances`. -pub struct WeightInfo(PhantomData); -impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_allow_death() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 56_219_000 picoseconds. - Weight::from_parts(56_763_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 41_515_000 picoseconds. - Weight::from_parts(42_186_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_creating() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 16_274_000 picoseconds. - Weight::from_parts(16_898_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_killing() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 23_847_000 picoseconds. - Weight::from_parts(24_343_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 57_564_000 picoseconds. - Weight::from_parts(58_172_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_all() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 52_131_000 picoseconds. - Weight::from_parts(52_662_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_unreserve() -> Weight { - // Proof Size summary in bytes: - // Measured: `174` - // Estimated: `3593` - // Minimum execution time: 19_005_000 picoseconds. - Weight::from_parts(19_594_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:999 w:999) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(u: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 17_275_000 picoseconds. - Weight::from_parts(17_901_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 15_775 - .saturating_add(Weight::from_parts(15_448_147, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs deleted file mode 100644 index 2465d52cbe64..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_grandpa` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 - -// Executed Command: -// ./artifacts/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_bridge_grandpa -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_grandpa`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_grandpa::WeightInfo for WeightInfo { - /// Storage: BridgeRococoGrandpa PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: BridgeRococoGrandpa BestFinalized (r:1 w:1) - /// Proof: BridgeRococoGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: 531, mode: MaxEncodedLen) - /// Storage: BridgeRococoGrandpa CurrentAuthoritySet (r:1 w:0) - /// Proof: BridgeRococoGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(50250), added: 50745, mode: MaxEncodedLen) - /// Storage: BridgeRococoGrandpa ImportedHashesPointer (r:1 w:1) - /// Proof: BridgeRococoGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: BridgeRococoGrandpa ImportedHashes (r:1 w:1) - /// Proof: BridgeRococoGrandpa ImportedHashes (max_values: Some(1024), max_size: Some(36), added: 1521, mode: MaxEncodedLen) - /// Storage: BridgeRococoGrandpa ImportedHeaders (r:0 w:2) - /// Proof: BridgeRococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) - /// The range of component `p` is `[1, 838]`. - /// The range of component `v` is `[50, 100]`. - /// The range of component `p` is `[1, 838]`. - /// The range of component `v` is `[50, 100]`. - fn submit_finality_proof(p: u32, v: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `231 + p * (60 ±0)` - // Estimated: `51735` - // Minimum execution time: 241_332_000 picoseconds. - Weight::from_parts(69_790_821, 0) - .saturating_add(Weight::from_parts(0, 51735)) - // Standard Error: 6_013 - .saturating_add(Weight::from_parts(47_580_554, 0).saturating_mul(p.into())) - // Standard Error: 100_298 - .saturating_add(Weight::from_parts(1_213_475, 0).saturating_mul(v.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_rococo_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_rococo_grandpa.rs deleted file mode 100644 index 746db2a421cf..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_rococo_grandpa.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_grandpa` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_bridge_grandpa -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_grandpa`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_grandpa::WeightInfo for WeightInfo { - /// Storage: `BridgeRococoGrandpa::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoGrandpa::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::BestFinalized` (r:1 w:1) - /// Proof: `BridgeRococoGrandpa::BestFinalized` (`max_values`: Some(1), `max_size`: Some(36), added: 531, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::CurrentAuthoritySet` (r:1 w:0) - /// Proof: `BridgeRococoGrandpa::CurrentAuthoritySet` (`max_values`: Some(1), `max_size`: Some(50250), added: 50745, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::ImportedHashesPointer` (r:1 w:1) - /// Proof: `BridgeRococoGrandpa::ImportedHashesPointer` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::ImportedHashes` (r:1 w:1) - /// Proof: `BridgeRococoGrandpa::ImportedHashes` (`max_values`: Some(1024), `max_size`: Some(36), added: 1521, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::ImportedHeaders` (r:0 w:2) - /// Proof: `BridgeRococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 838]`. - /// The range of component `v` is `[50, 100]`. - /// The range of component `p` is `[1, 838]`. - /// The range of component `v` is `[50, 100]`. - fn submit_finality_proof(p: u32, v: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `231 + p * (60 ±0)` - // Estimated: `51735` - // Minimum execution time: 258_708_000 picoseconds. - Weight::from_parts(36_816_946, 0) - .saturating_add(Weight::from_parts(0, 51735)) - // Standard Error: 3_891 - .saturating_add(Weight::from_parts(55_186_206, 0).saturating_mul(p.into())) - // Standard Error: 64_911 - .saturating_add(Weight::from_parts(1_803_772, 0).saturating_mul(v.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_wococo_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_wococo_grandpa.rs deleted file mode 100644 index 377569f1aebd..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa_bridge_wococo_grandpa.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_grandpa` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_bridge_grandpa -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_grandpa`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_grandpa::WeightInfo for WeightInfo { - /// Storage: `BridgeWococoGrandpa::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoGrandpa::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::BestFinalized` (r:1 w:1) - /// Proof: `BridgeWococoGrandpa::BestFinalized` (`max_values`: Some(1), `max_size`: Some(36), added: 531, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::CurrentAuthoritySet` (r:1 w:0) - /// Proof: `BridgeWococoGrandpa::CurrentAuthoritySet` (`max_values`: Some(1), `max_size`: Some(50250), added: 50745, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::ImportedHashesPointer` (r:1 w:1) - /// Proof: `BridgeWococoGrandpa::ImportedHashesPointer` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::ImportedHashes` (r:1 w:1) - /// Proof: `BridgeWococoGrandpa::ImportedHashes` (`max_values`: Some(1024), `max_size`: Some(36), added: 1521, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::ImportedHeaders` (r:0 w:2) - /// Proof: `BridgeWococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 838]`. - /// The range of component `v` is `[50, 100]`. - /// The range of component `p` is `[1, 838]`. - /// The range of component `v` is `[50, 100]`. - fn submit_finality_proof(p: u32, v: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `268 + p * (60 ±0)` - // Estimated: `51735` - // Minimum execution time: 260_423_000 picoseconds. - Weight::from_parts(46_213_879, 0) - .saturating_add(Weight::from_parts(0, 51735)) - // Standard Error: 4_794 - .saturating_add(Weight::from_parts(55_195_440, 0).saturating_mul(p.into())) - // Standard Error: 79_973 - .saturating_add(Weight::from_parts(1_710_302, 0).saturating_mul(v.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs deleted file mode 100644 index f5ab0edddde3..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_messages` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 - -// Executed Command: -// ./artifacts/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_bridge_messages -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_messages`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_messages::WeightInfo for WeightInfo { - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn receive_single_message_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `52645` - // Minimum execution time: 43_187_000 picoseconds. - Weight::from_parts(43_681_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn receive_two_messages_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `52645` - // Minimum execution time: 54_131_000 picoseconds. - Weight::from_parts(54_813_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn receive_single_message_proof_with_outbound_lane_state() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `52645` - // Minimum execution time: 48_120_000 picoseconds. - Weight::from_parts(48_733_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `335` - // Estimated: `52645` - // Minimum execution time: 41_028_000 picoseconds. - Weight::from_parts(41_635_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) - fn receive_single_message_proof_16_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `335` - // Estimated: `52645` - // Minimum execution time: 68_499_000 picoseconds. - Weight::from_parts(69_263_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) - /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - fn receive_delivery_proof_for_single_message() -> Weight { - // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `3804` - // Minimum execution time: 32_277_000 picoseconds. - Weight::from_parts(32_880_000, 0) - .saturating_add(Weight::from_parts(0, 3804)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) - /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { - // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `3804` - // Minimum execution time: 32_504_000 picoseconds. - Weight::from_parts(33_085_000, 0) - .saturating_add(Weight::from_parts(0, 3804)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages OutboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: 539, mode: MaxEncodedLen) - /// Storage: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof Skipped: unknown `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) - /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { - // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `6086` - // Minimum execution time: 34_963_000 picoseconds. - Weight::from_parts(35_473_000, 0) - .saturating_add(Weight::from_parts(0, 6086)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: BridgeRococoMessages PalletOperatingMode (r:1 w:0) - /// Proof: BridgeRococoMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), added: 497, mode: MaxEncodedLen) - /// Storage: BridgeRococoParachain ImportedParaHeads (r:1 w:0) - /// Proof: BridgeRococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// Storage: BridgeRococoMessages InboundLanes (r:1 w:1) - /// Proof: BridgeRococoMessages InboundLanes (max_values: None, max_size: Some(49180), added: 51655, mode: MaxEncodedLen) - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem RelevantMessagingState (r:1 w:0) - /// Proof Skipped: ParachainSystem RelevantMessagingState (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpStatus (r:1 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpStatus (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: XcmpQueue OutboundXcmpMessages (r:0 w:1) - /// Proof Skipped: XcmpQueue OutboundXcmpMessages (max_values: None, max_size: None, mode: Measured) - /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `635` - // Estimated: `52645` - // Minimum execution time: 129_978_000 picoseconds. - Weight::from_parts(98_246_356, 0) - .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 2_554 - .saturating_add(Weight::from_parts(544_728, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance.rs deleted file mode 100644 index 3fe496036f16..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_rococo_messages_instance.rs +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_messages` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_bridge_messages -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_messages`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_messages::WeightInfo for WeightInfo { - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_single_message_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `52645` - // Minimum execution time: 43_473_000 picoseconds. - Weight::from_parts(44_789_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_two_messages_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `52645` - // Minimum execution time: 53_826_000 picoseconds. - Weight::from_parts(61_945_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_single_message_proof_with_outbound_lane_state() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `52645` - // Minimum execution time: 48_194_000 picoseconds. - Weight::from_parts(50_311_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `335` - // Estimated: `52645` - // Minimum execution time: 40_783_000 picoseconds. - Weight::from_parts(43_019_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_16_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `335` - // Estimated: `52645` - // Minimum execution time: 74_259_000 picoseconds. - Weight::from_parts(76_009_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn receive_delivery_proof_for_single_message() -> Weight { - // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `3804` - // Minimum execution time: 31_323_000 picoseconds. - Weight::from_parts(32_282_000, 0) - .saturating_add(Weight::from_parts(0, 3804)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { - // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `3804` - // Minimum execution time: 31_725_000 picoseconds. - Weight::from_parts(32_250_000, 0) - .saturating_add(Weight::from_parts(0, 3804)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: `BridgeRelayers::RelayerRewards` (r:2 w:2) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { - // Proof Size summary in bytes: - // Measured: `339` - // Estimated: `6086` - // Minimum execution time: 34_244_000 picoseconds. - Weight::from_parts(35_033_000, 0) - .saturating_add(Weight::from_parts(0, 6086)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) - /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `635` - // Estimated: `52645` - // Minimum execution time: 172_521_000 picoseconds. - Weight::from_parts(173_742_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 3_678 - .saturating_add(Weight::from_parts(1_012_559, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance.rs deleted file mode 100644 index 112eb2271486..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_bridge_messages_bench_runtime_with_bridge_hub_wococo_messages_instance.rs +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_messages` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_bridge_messages -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_messages`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_messages::WeightInfo for WeightInfo { - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_single_message_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `404` - // Estimated: `52645` - // Minimum execution time: 43_991_000 picoseconds. - Weight::from_parts(45_465_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_two_messages_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `404` - // Estimated: `52645` - // Minimum execution time: 54_906_000 picoseconds. - Weight::from_parts(56_412_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn receive_single_message_proof_with_outbound_lane_state() -> Weight { - // Proof Size summary in bytes: - // Measured: `404` - // Estimated: `52645` - // Minimum execution time: 48_906_000 picoseconds. - Weight::from_parts(51_665_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_1_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `372` - // Estimated: `52645` - // Minimum execution time: 42_784_000 picoseconds. - Weight::from_parts(44_788_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - fn receive_single_message_proof_16_kb() -> Weight { - // Proof Size summary in bytes: - // Measured: `372` - // Estimated: `52645` - // Minimum execution time: 75_805_000 picoseconds. - Weight::from_parts(77_731_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn receive_delivery_proof_for_single_message() -> Weight { - // Proof Size summary in bytes: - // Measured: `376` - // Estimated: `3841` - // Minimum execution time: 32_012_000 picoseconds. - Weight::from_parts(32_653_000, 0) - .saturating_add(Weight::from_parts(0, 3841)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { - // Proof Size summary in bytes: - // Measured: `376` - // Estimated: `3841` - // Minimum execution time: 31_851_000 picoseconds. - Weight::from_parts(33_017_000, 0) - .saturating_add(Weight::from_parts(0, 3841)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) - /// Storage: `BridgeRelayers::RelayerRewards` (r:2 w:2) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { - // Proof Size summary in bytes: - // Measured: `376` - // Estimated: `6086` - // Minimum execution time: 34_818_000 picoseconds. - Weight::from_parts(35_728_000, 0) - .saturating_add(Weight::from_parts(0, 6086)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) - /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. - fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `672` - // Estimated: `52645` - // Minimum execution time: 172_737_000 picoseconds. - Weight::from_parts(175_172_000, 0) - .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 3_669 - .saturating_add(Weight::from_parts(1_013_545, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs deleted file mode 100644 index d77c43e729f5..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_parachains` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 - -// Executed Command: -// ./artifacts/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_bridge_parachains -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_parachains`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_parachains::WeightInfo for WeightInfo { - /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) - /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) - /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) - /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) - /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) - /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - /// The range of component `p` is `[1, 2]`. - /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `2543` - // Minimum execution time: 34_759_000 picoseconds. - Weight::from_parts(35_709_034, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) - /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) - /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) - /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) - /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) - /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - fn submit_parachain_heads_with_1kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `2543` - // Minimum execution time: 36_005_000 picoseconds. - Weight::from_parts(36_492_000, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: BridgeWococoParachain PalletOperatingMode (r:1 w:0) - /// Proof: BridgeWococoParachain PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: BridgeWococoGrandpa ImportedHeaders (r:1 w:0) - /// Proof: BridgeWococoGrandpa ImportedHeaders (max_values: Some(1024), max_size: Some(68), added: 1553, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ParasInfo (r:1 w:1) - /// Proof: BridgeWococoParachain ParasInfo (max_values: Some(1), max_size: Some(60), added: 555, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ImportedParaHashes (r:1 w:1) - /// Proof: BridgeWococoParachain ImportedParaHashes (max_values: Some(64), max_size: Some(64), added: 1054, mode: MaxEncodedLen) - /// Storage: BridgeWococoParachain ImportedParaHeads (r:0 w:1) - /// Proof: BridgeWococoParachain ImportedParaHeads (max_values: Some(64), max_size: Some(196), added: 1186, mode: MaxEncodedLen) - fn submit_parachain_heads_with_16kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `2543` - // Minimum execution time: 62_374_000 picoseconds. - Weight::from_parts(62_977_000, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance.rs deleted file mode 100644 index 3ba8fabf7797..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_rococo_instance.rs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_parachains` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_bridge_parachains -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_parachains`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_parachains::WeightInfo for WeightInfo { - /// Storage: `BridgeRococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::ImportedHeaders` (r:1 w:0) - /// Proof: `BridgeRococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 2]`. - /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `294` - // Estimated: `2543` - // Minimum execution time: 33_519_000 picoseconds. - Weight::from_parts(34_527_779, 0) - .saturating_add(Weight::from_parts(0, 2543)) - // Standard Error: 45_887 - .saturating_add(Weight::from_parts(120_010, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `BridgeRococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::ImportedHeaders` (r:1 w:0) - /// Proof: `BridgeRococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - fn submit_parachain_heads_with_1kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `294` - // Estimated: `2543` - // Minimum execution time: 35_140_000 picoseconds. - Weight::from_parts(35_801_000, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `BridgeRococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoGrandpa::ImportedHeaders` (r:1 w:0) - /// Proof: `BridgeRococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - fn submit_parachain_heads_with_16kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `294` - // Estimated: `2543` - // Minimum execution time: 67_110_000 picoseconds. - Weight::from_parts(67_951_000, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance.rs deleted file mode 100644 index da5ec6c14187..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains_bridge_parachains_bench_runtime_bridge_parachain_wococo_instance.rs +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_parachains` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_bridge_parachains -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_parachains`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_parachains::WeightInfo for WeightInfo { - /// Storage: `BridgeWococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::ImportedHeaders` (r:1 w:0) - /// Proof: `BridgeWococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeWococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeWococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 2]`. - /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `2543` - // Minimum execution time: 34_968_000 picoseconds. - Weight::from_parts(36_202_569, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `BridgeWococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::ImportedHeaders` (r:1 w:0) - /// Proof: `BridgeWococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeWococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeWococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - fn submit_parachain_heads_with_1kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `2543` - // Minimum execution time: 36_607_000 picoseconds. - Weight::from_parts(37_304_000, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `BridgeWococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoGrandpa::ImportedHeaders` (r:1 w:0) - /// Proof: `BridgeWococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeWococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeWococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeWococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeWococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - fn submit_parachain_heads_with_16kb_proof() -> Weight { - // Proof Size summary in bytes: - // Measured: `367` - // Estimated: `2543` - // Minimum execution time: 68_548_000 picoseconds. - Weight::from_parts(69_402_000, 0) - .saturating_add(Weight::from_parts(0, 2543)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs deleted file mode 100644 index 426b098d54e3..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_bridge_relayers` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_bridge_relayers -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_bridge_relayers`. -pub struct WeightInfo(PhantomData); -impl pallet_bridge_relayers::WeightInfo for WeightInfo { - /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn claim_rewards() -> Weight { - // Proof Size summary in bytes: - // Measured: `207` - // Estimated: `3593` - // Minimum execution time: 54_291_000 picoseconds. - Weight::from_parts(55_145_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `BridgeRelayers::RegisteredRelayers` (r:1 w:1) - /// Proof: `BridgeRelayers::RegisteredRelayers` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x1e8445dc201eeb8560e5579a5dd54655` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x1e8445dc201eeb8560e5579a5dd54655` (r:1 w:0) - /// Storage: `Balances::Reserves` (r:1 w:1) - /// Proof: `Balances::Reserves` (`max_values`: None, `max_size`: Some(1249), added: 3724, mode: `MaxEncodedLen`) - fn register() -> Weight { - // Proof Size summary in bytes: - // Measured: `61` - // Estimated: `4714` - // Minimum execution time: 28_143_000 picoseconds. - Weight::from_parts(28_920_000, 0) - .saturating_add(Weight::from_parts(0, 4714)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `BridgeRelayers::RegisteredRelayers` (r:1 w:1) - /// Proof: `BridgeRelayers::RegisteredRelayers` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// Storage: `Balances::Reserves` (r:1 w:1) - /// Proof: `Balances::Reserves` (`max_values`: None, `max_size`: Some(1249), added: 3724, mode: `MaxEncodedLen`) - fn deregister() -> Weight { - // Proof Size summary in bytes: - // Measured: `160` - // Estimated: `4714` - // Minimum execution time: 30_329_000 picoseconds. - Weight::from_parts(30_646_000, 0) - .saturating_add(Weight::from_parts(0, 4714)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `BridgeRelayers::RegisteredRelayers` (r:1 w:1) - /// Proof: `BridgeRelayers::RegisteredRelayers` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) - /// Storage: `Balances::Reserves` (r:1 w:1) - /// Proof: `Balances::Reserves` (`max_values`: None, `max_size`: Some(1249), added: 3724, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn slash_and_deregister() -> Weight { - // Proof Size summary in bytes: - // Measured: `263` - // Estimated: `4714` - // Minimum execution time: 29_704_000 picoseconds. - Weight::from_parts(30_269_000, 0) - .saturating_add(Weight::from_parts(0, 4714)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) - /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - fn register_relayer_reward() -> Weight { - // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3538` - // Minimum execution time: 2_793_000 picoseconds. - Weight::from_parts(2_999_000, 0) - .saturating_add(Weight::from_parts(0, 3538)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs deleted file mode 100644 index 956b7b7b43cd..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_collator_selection.rs +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collator_selection` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_collator_selection -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collator_selection`. -pub struct WeightInfo(PhantomData); -impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:20 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `196 + b * (79 ±0)` - // Estimated: `1187 + b * (2555 ±0)` - // Minimum execution time: 14_728_000 picoseconds. - Weight::from_parts(11_562_750, 0) - .saturating_add(Weight::from_parts(0, 1187)) - // Standard Error: 7_121 - .saturating_add(Weight::from_parts(3_300_884, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) - } - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `757 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 47_549_000 picoseconds. - Weight::from_parts(45_432_273, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 11_457 - .saturating_add(Weight::from_parts(216_469, 0).saturating_mul(b.into())) - // Standard Error: 2_171 - .saturating_add(Weight::from_parts(197_614, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `82 + b * (32 ±0)` - // Estimated: `6287` - // Minimum execution time: 15_417_000 picoseconds. - Weight::from_parts(15_357_487, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 4_074 - .saturating_add(Weight::from_parts(187_410, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn set_desired_candidates() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_407_000 picoseconds. - Weight::from_parts(7_657_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_514_000 picoseconds. - Weight::from_parts(7_695_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `740 + c * (52 ±0)` - // Estimated: `6287 + c * (54 ±0)` - // Minimum execution time: 41_711_000 picoseconds. - Weight::from_parts(45_690_780, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_800 - .saturating_add(Weight::from_parts(194_907, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[3, 100]`. - fn leave_intent(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `334 + c * (49 ±0)` - // Estimated: `6287` - // Minimum execution time: 33_901_000 picoseconds. - Weight::from_parts(35_875_905, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 1_968 - .saturating_add(Weight::from_parts(200_283, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - fn note_author() -> Weight { - // Proof Size summary in bytes: - // Measured: `155` - // Estimated: `6196` - // Minimum execution time: 47_475_000 picoseconds. - Weight::from_parts(48_265_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:97 w:97) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `r` is `[1, 100]`. - /// The range of component `c` is `[1, 100]`. - fn new_session(r: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `2263 + c * (97 ±0) + r * (115 ±0)` - // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 16_907_000 picoseconds. - Weight::from_parts(17_203_000, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 354_098 - .saturating_add(Weight::from_parts(15_341_462, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs deleted file mode 100644 index f3a2e7f0268b..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_multisig.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_multisig` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_multisig -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_multisig`. -pub struct WeightInfo(PhantomData); -impl pallet_multisig::WeightInfo for WeightInfo { - /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_958_000 picoseconds. - Weight::from_parts(14_501_711, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 4 - .saturating_add(Weight::from_parts(626, 0).saturating_mul(z.into())) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 44_067_000 picoseconds. - Weight::from_parts(33_432_998, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_250 - .saturating_add(Weight::from_parts(131_851, 0).saturating_mul(s.into())) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_459, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[3, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_approve(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 29_373_000 picoseconds. - Weight::from_parts(19_409_201, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 725 - .saturating_add(Weight::from_parts(110_824, 0).saturating_mul(s.into())) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_502, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `388 + s * (33 ±0)` - // Estimated: `6811` - // Minimum execution time: 49_724_000 picoseconds. - Weight::from_parts(34_153_321, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_376 - .saturating_add(Weight::from_parts(174_634, 0).saturating_mul(s.into())) - // Standard Error: 13 - .saturating_add(Weight::from_parts(1_753, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 31_081_000 picoseconds. - Weight::from_parts(31_552_702, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_066 - .saturating_add(Weight::from_parts(135_081, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `282` - // Estimated: `6811` - // Minimum execution time: 17_807_000 picoseconds. - Weight::from_parts(18_241_044, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 768 - .saturating_add(Weight::from_parts(112_957, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + s * (1 ±0)` - // Estimated: `6811` - // Minimum execution time: 32_421_000 picoseconds. - Weight::from_parts(32_554_061, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_157 - .saturating_add(Weight::from_parts(141_221, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs deleted file mode 100644 index afa64ae7537c..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_session.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_session` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_session -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_session`. -pub struct WeightInfo(PhantomData); -impl pallet_session::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:1 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn set_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `297` - // Estimated: `3762` - // Minimum execution time: 16_965_000 picoseconds. - Weight::from_parts(17_384_000, 0) - .saturating_add(Weight::from_parts(0, 3762)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:0 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn purge_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `279` - // Estimated: `3744` - // Minimum execution time: 12_444_000 picoseconds. - Weight::from_parts(12_832_000, 0) - .saturating_add(Weight::from_parts(0, 3744)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs deleted file mode 100644 index 61742f369950..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_timestamp.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_timestamp` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_timestamp -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_timestamp`. -pub struct WeightInfo(PhantomData); -impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: `Timestamp::Now` (r:1 w:1) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Aura::CurrentSlot` (r:1 w:0) - /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set() -> Weight { - // Proof Size summary in bytes: - // Measured: `85` - // Estimated: `1493` - // Minimum execution time: 9_231_000 picoseconds. - Weight::from_parts(9_595_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn on_finalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `94` - // Estimated: `0` - // Minimum execution time: 3_869_000 picoseconds. - Weight::from_parts(4_041_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs deleted file mode 100644 index 4941bd661544..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_utility.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_utility` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_utility -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_utility`. -pub struct WeightInfo(PhantomData); -impl pallet_utility::WeightInfo for WeightInfo { - /// The range of component `c` is `[0, 1000]`. - fn batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_831_000 picoseconds. - Weight::from_parts(12_945_569, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_949 - .saturating_add(Weight::from_parts(5_125_189, 0).saturating_mul(c.into())) - } - fn as_derivative() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_790_000 picoseconds. - Weight::from_parts(5_063_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn batch_all(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_894_000 picoseconds. - Weight::from_parts(14_201_341, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_501 - .saturating_add(Weight::from_parts(5_466_047, 0).saturating_mul(c.into())) - } - fn dispatch_as() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_624_000 picoseconds. - Weight::from_parts(9_064_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn force_batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_912_000 picoseconds. - Weight::from_parts(9_228_121, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_601 - .saturating_add(Weight::from_parts(5_138_293, 0).saturating_mul(c.into())) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs deleted file mode 100644 index f6d61f9e6c29..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_xcm`. -pub struct WeightInfo(PhantomData); -impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn send() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 29_724_000 picoseconds. - Weight::from_parts(30_440_000, 0) - .saturating_add(Weight::from_parts(0, 3540)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `1489` - // Minimum execution time: 26_779_000 picoseconds. - Weight::from_parts(27_249_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn reserve_transfer_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn execute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_170_000 picoseconds. - Weight::from_parts(9_629_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_default_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_769_000 picoseconds. - Weight::from_parts(2_933_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_subscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 34_547_000 picoseconds. - Weight::from_parts(35_653_000, 0) - .saturating_add(Weight::from_parts(0, 3540)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_unsubscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `292` - // Estimated: `3757` - // Minimum execution time: 36_274_000 picoseconds. - Weight::from_parts(37_281_000, 0) - .saturating_add(Weight::from_parts(0, 3757)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) - /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_suspension() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_749_000 picoseconds. - Weight::from_parts(2_917_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_supported_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `187` - // Estimated: `11077` - // Minimum execution time: 17_649_000 picoseconds. - Weight::from_parts(17_964_000, 0) - .saturating_add(Weight::from_parts(0, 11077)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notifiers() -> Weight { - // Proof Size summary in bytes: - // Measured: `191` - // Estimated: `11081` - // Minimum execution time: 17_551_000 picoseconds. - Weight::from_parts(18_176_000, 0) - .saturating_add(Weight::from_parts(0, 11081)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn already_notified_target() -> Weight { - // Proof Size summary in bytes: - // Measured: `198` - // Estimated: `13563` - // Minimum execution time: 19_261_000 picoseconds. - Weight::from_parts(19_714_000, 0) - .saturating_add(Weight::from_parts(0, 13563)) - .saturating_add(T::DbWeight::get().reads(5)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn notify_current_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `6082` - // Minimum execution time: 31_630_000 picoseconds. - Weight::from_parts(32_340_000, 0) - .saturating_add(Weight::from_parts(0, 6082)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn notify_target_migration_fail() -> Weight { - // Proof Size summary in bytes: - // Measured: `172` - // Estimated: `8587` - // Minimum execution time: 9_218_000 picoseconds. - Weight::from_parts(9_558_000, 0) - .saturating_add(Weight::from_parts(0, 8587)) - .saturating_add(T::DbWeight::get().reads(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notify_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `198` - // Estimated: `11088` - // Minimum execution time: 18_133_000 picoseconds. - Weight::from_parts(18_663_000, 0) - .saturating_add(Weight::from_parts(0, 11088)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn migrate_and_notify_old_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `204` - // Estimated: `11094` - // Minimum execution time: 38_878_000 picoseconds. - Weight::from_parts(39_779_000, 0) - .saturating_add(Weight::from_parts(0, 11094)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs deleted file mode 100644 index a5c6bf858f64..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod pallet_xcm_benchmarks_fungible; -mod pallet_xcm_benchmarks_generic; - -use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; -use codec::Encode; -use frame_support::weights::Weight; -use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; -use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; -use sp_std::prelude::*; -use xcm::{latest::prelude::*, DoubleEncoded}; - -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; -} - -const MAX_ASSETS: u64 = 100; - -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - match self { - Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), - Self::Wild(asset) => match asset { - All => weight.saturating_mul(MAX_ASSETS), - AllOf { fun, .. } => match fun { - WildFungibility::Fungible => weight, - // Magic number 2 has to do with the fact that we could have up to 2 times - // MaxAssetsIntoHolding in the worst-case scenario. - WildFungibility::NonFungible => - weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), - }, - AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), - }, - } - } -} - -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { - weight.saturating_mul(self.inner().iter().count() as u64) - } -} - -pub struct BridgeHubRococoXcmWeight(core::marker::PhantomData); -impl XcmWeightInfo for BridgeHubRococoXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) - } - // Currently there is no trusted reserve (`IsReserve = ()`), - // but we need this hack for `pallet_xcm::reserve_transfer_assets` - // (TODO) fix https://github.com/paritytech/polkadot/pull/7424 - // (TODO) fix https://github.com/paritytech/polkadot/pull/7546 - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { - // TODO: if we change `IsReserve = ...` then use this line... - // TODO: or if remote weight estimation is fixed, then remove - // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - hardcoded_weight.min(XcmFungibleWeight::::reserve_asset_deposited()) - } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) - } - fn query_response( - _query_id: &u64, - _response: &Response, - _max_weight: &Weight, - _querier: &Option, - ) -> Weight { - XcmGeneric::::query_response() - } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) - } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) - } - fn transact( - _origin_type: &OriginKind, - _require_weight_at_most: &Weight, - _call: &DoubleEncoded, - ) -> Weight { - XcmGeneric::::transact() - } - fn hrmp_new_channel_open_request( - _sender: &u32, - _max_message_size: &u32, - _max_capacity: &u32, - ) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_accepted(_recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { - // XCM Executor does not currently support HRMP channel operations - Weight::MAX - } - fn clear_origin() -> Weight { - XcmGeneric::::clear_origin() - } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { - XcmGeneric::::descend_origin() - } - fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_error() - } - - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - // Hardcoded till the XCM pallet is fixed - let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); - hardcoded_weight.min(weight) - } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) - } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { - Weight::MAX - } - fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) - } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) - } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { - XcmGeneric::::report_holding() - } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { - XcmGeneric::::buy_execution() - } - fn refund_surplus() -> Weight { - XcmGeneric::::refund_surplus() - } - fn set_error_handler(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_error_handler() - } - fn set_appendix(_xcm: &Xcm) -> Weight { - XcmGeneric::::set_appendix() - } - fn clear_error() -> Weight { - XcmGeneric::::clear_error() - } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { - XcmGeneric::::claim_asset() - } - fn trap(_code: &u64) -> Weight { - XcmGeneric::::trap() - } - fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { - XcmGeneric::::subscribe_version() - } - fn unsubscribe_version() -> Weight { - XcmGeneric::::unsubscribe_version() - } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) - } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) - } - fn expect_origin(_origin: &Option) -> Weight { - XcmGeneric::::expect_origin() - } - fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { - XcmGeneric::::expect_error() - } - fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { - XcmGeneric::::expect_transact_status() - } - fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::query_pallet() - } - fn expect_pallet( - _index: &u32, - _name: &Vec, - _module_name: &Vec, - _crate_major: &u32, - _min_crate_minor: &u32, - ) -> Weight { - XcmGeneric::::expect_pallet() - } - fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { - XcmGeneric::::report_transact_status() - } - fn clear_transact_status() -> Weight { - XcmGeneric::::clear_transact_status() - } - fn universal_origin(_: &Junction) -> Weight { - Weight::MAX - } - fn export_message(_: &NetworkId, _: &Junctions, inner: &Xcm<()>) -> Weight { - let inner_encoded_len = inner.encode().len() as u32; - XcmGeneric::::export_message(inner_encoded_len) - } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { - Weight::MAX - } - fn set_fees_mode(_: &bool) -> Weight { - XcmGeneric::::set_fees_mode() - } - fn set_topic(_topic: &[u8; 32]) -> Weight { - XcmGeneric::::set_topic() - } - fn clear_topic() -> Weight { - XcmGeneric::::clear_topic() - } - fn alias_origin(_: &MultiLocation) -> Weight { - // XCM Executor does not currently support alias origin operations - Weight::MAX - } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { - XcmGeneric::::unpaid_execution() - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs deleted file mode 100644 index 25ec8777cd3c..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::fungible -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::fungible`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn withdraw_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `3593` - // Minimum execution time: 24_521_000 picoseconds. - Weight::from_parts(25_005_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn transfer_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `153` - // Estimated: `6196` - // Minimum execution time: 52_274_000 picoseconds. - Weight::from_parts(53_374_000, 6196) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn transfer_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `260` - // Estimated: `6196` - // Minimum execution time: 77_625_000 picoseconds. - Weight::from_parts(78_530_000, 6196) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(4)) - } - // Storage: `Benchmark::Override` (r:0 w:0) - // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn reserve_asset_deposited() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 500_000_000_000 picoseconds. - Weight::from_parts(500_000_000_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_reserve_withdraw() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `3572` - // Minimum execution time: 32_804_000 picoseconds. - Weight::from_parts(33_462_000, 3572) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn receive_teleported_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_921_000 picoseconds. - Weight::from_parts(4_050_000, 0) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - pub fn deposit_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `52` - // Estimated: `3593` - // Minimum execution time: 25_436_000 picoseconds. - Weight::from_parts(25_789_000, 3593) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn deposit_reserve_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `159` - // Estimated: `3624` - // Minimum execution time: 53_846_000 picoseconds. - Weight::from_parts(54_684_000, 3624) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn initiate_teleport() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `3572` - // Minimum execution time: 33_052_000 picoseconds. - Weight::from_parts(33_897_000, 3572) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs deleted file mode 100644 index 3cb066bc53df..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm_benchmarks::generic` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --template=./templates/xcm-bench-template.hbs -// --chain=bridge-hub-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm_benchmarks::generic -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `pallet_xcm_benchmarks::generic`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_holding() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `3572` - // Minimum execution time: 37_350_000 picoseconds. - Weight::from_parts(38_105_000, 3572) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn buy_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_042_000 picoseconds. - Weight::from_parts(3_117_000, 0) - } - // Storage: `PolkadotXcm::Queries` (r:1 w:0) - // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn query_response() -> Weight { - // Proof Size summary in bytes: - // Measured: `69` - // Estimated: `3534` - // Minimum execution time: 11_037_000 picoseconds. - Weight::from_parts(11_465_000, 3534) - .saturating_add(T::DbWeight::get().reads(1)) - } - pub fn transact() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 12_359_000 picoseconds. - Weight::from_parts(12_741_000, 0) - } - pub fn refund_surplus() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_165_000 picoseconds. - Weight::from_parts(3_295_000, 0) - } - pub fn set_error_handler() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_847_000 picoseconds. - Weight::from_parts(2_893_000, 0) - } - pub fn set_appendix() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_847_000 picoseconds. - Weight::from_parts(2_936_000, 0) - } - pub fn clear_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_856_000 picoseconds. - Weight::from_parts(2_933_000, 0) - } - pub fn descend_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_635_000 picoseconds. - Weight::from_parts(3_710_000, 0) - } - pub fn clear_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_822_000 picoseconds. - Weight::from_parts(2_899_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `3572` - // Minimum execution time: 29_399_000 picoseconds. - Weight::from_parts(30_284_000, 3572) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) - // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn claim_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `126` - // Estimated: `3591` - // Minimum execution time: 16_173_000 picoseconds. - Weight::from_parts(16_576_000, 3591) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn trap() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_882_000 picoseconds. - Weight::from_parts(3_017_000, 0) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn subscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `75` - // Estimated: `3540` - // Minimum execution time: 29_839_000 picoseconds. - Weight::from_parts(30_519_000, 3540) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(3)) - } - // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) - // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - pub fn unsubscribe_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_806_000 picoseconds. - Weight::from_parts(5_042_000, 0) - .saturating_add(T::DbWeight::get().writes(1)) - } - pub fn burn_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_407_000 picoseconds. - Weight::from_parts(4_548_000, 0) - } - pub fn expect_asset() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_930_000 picoseconds. - Weight::from_parts(3_042_000, 0) - } - pub fn expect_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_915_000 picoseconds. - Weight::from_parts(3_052_000, 0) - } - pub fn expect_error() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_823_000 picoseconds. - Weight::from_parts(2_912_000, 0) - } - pub fn expect_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_119_000 picoseconds. - Weight::from_parts(3_205_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn query_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `3572` - // Minimum execution time: 33_394_000 picoseconds. - Weight::from_parts(34_497_000, 3572) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn expect_pallet() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_471_000 picoseconds. - Weight::from_parts(5_640_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - pub fn report_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `107` - // Estimated: `3572` - // Minimum execution time: 29_932_000 picoseconds. - Weight::from_parts(30_478_000, 3572) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn clear_transact_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_807_000 picoseconds. - Weight::from_parts(2_941_000, 0) - } - pub fn set_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_785_000 picoseconds. - Weight::from_parts(2_894_000, 0) - } - pub fn clear_topic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_844_000 picoseconds. - Weight::from_parts(2_943_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `BridgeWococoMessages::PalletOperatingMode` (r:1 w:0) - // Proof: `BridgeWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - // Storage: `BridgeWococoMessages::OutboundLanes` (r:1 w:1) - // Proof: `BridgeWococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - // Storage: `BridgeWococoMessages::OutboundMessages` (r:0 w:1) - // Proof: `BridgeWococoMessages::OutboundMessages` (`max_values`: None, `max_size`: Some(2621472), added: 2623947, mode: `MaxEncodedLen`) - /// The range of component `x` is `[1, 1000]`. - pub fn export_message(x: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `1529` - // Minimum execution time: 28_427_000 picoseconds. - Weight::from_parts(28_755_860, 1529) - // Standard Error: 383 - .saturating_add(Weight::from_parts(393_744, 0).saturating_mul(x.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - pub fn set_fees_mode() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_781_000 picoseconds. - Weight::from_parts(2_907_000, 0) - } - pub fn unpaid_execution() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 3_001_000 picoseconds. - Weight::from_parts(3_117_000, 0) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs deleted file mode 100644 index 170382fe5834..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use super::{ - AccountId, AllPalletsWithSystem, Balances, BridgeGrandpaRococoInstance, - BridgeGrandpaWococoInstance, DeliveryRewardInBalance, ParachainInfo, ParachainSystem, - PolkadotXcm, RequiredStakeForStakeAndSlash, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - WeightToFee, XcmpQueue, -}; -use crate::{ - bridge_hub_rococo_config::ToBridgeHubWococoHaulBlobExporter, - bridge_hub_wococo_config::ToBridgeHubRococoHaulBlobExporter, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing}, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; -use polkadot_parachain::primitives::Sibling; -use sp_core::Get; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, - CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, IsConcrete, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{ - traits::{ExportXcm, WithOriginFilter}, - XcmExecutor, -}; - -parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; -} - -pub struct RelayNetwork; -impl Get> for RelayNetwork { - fn get() -> Option { - Some(Self::get()) - } -} -impl Get for RelayNetwork { - fn get() -> NetworkId { - match u32::from(ParachainInfo::parachain_id()) { - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID => NetworkId::Rococo, - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID => NetworkId::Wococo, - para_id => unreachable!("Not supported for para_id: {}", para_id), - } - } -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognized. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognized. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; -} - -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - // Allow to change dedicated storage items (called by governance-like) - match call { - RuntimeCall::System(frame_system::Call::set_storage { items }) - if items.iter().any(|(k, _)| { - k.eq(&DeliveryRewardInBalance::key()) | - k.eq(&RequiredStakeForStakeAndSlash::key()) - }) => - return true, - _ => (), - }; - - matches!( - call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::BridgeRococoGrandpa(pallet_bridge_grandpa::Call::< - Runtime, - BridgeGrandpaRococoInstance, - >::initialize { .. }) | - RuntimeCall::BridgeWococoGrandpa(pallet_bridge_grandpa::Call::< - Runtime, - BridgeGrandpaWococoInstance, - >::initialize { .. }) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - // Allow local users to buy weight credit. - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - // TODO:check-parameter - (https://github.com/paritytech/parity-bridges-common/issues/2084) - // remove this and extend `AllowExplicitUnpaidExecutionFrom` with "or SystemParachains" once merged https://github.com/paritytech/polkadot/pull/7005 - AllowUnpaidExecutionFrom, - ), - >, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // BridgeHub does not recognize a reserve location for any asset. Users must teleport Native - // token where allowed (e.g. with the Relay Chain). - type IsReserve = (); - /// Only allow teleportation of NativeToken of relay chain. - type IsTeleporter = ConcreteNativeAssetFrom; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = WeightInfoBounds< - crate::weights::xcm::BridgeHubRococoXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type Trader = - UsingComponents>; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetLocker = (); - type AssetExchanger = (); - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type FeeManager = (); - type MessageExporter = BridgeHubRococoOrBridgeHubWococoSwitchExporter; - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmRouter = XcmRouter; - // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. - type Weigher = WeightInfoBounds< - crate::weights::xcm::BridgeHubRococoXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -/// Hacky switch implementation, because we have just one runtime for Rococo and Wococo BridgeHub, -/// so it means we have just one XcmConfig -pub struct BridgeHubRococoOrBridgeHubWococoSwitchExporter; -impl ExportXcm for BridgeHubRococoOrBridgeHubWococoSwitchExporter { - type Ticket = (NetworkId, (sp_std::prelude::Vec, XcmHash)); - - fn validate( - network: NetworkId, - channel: u32, - universal_source: &mut Option, - destination: &mut Option, - message: &mut Option>, - ) -> SendResult { - match network { - Rococo => ToBridgeHubRococoHaulBlobExporter::validate( - network, - channel, - universal_source, - destination, - message, - ) - .map(|result| ((Rococo, result.0), result.1)), - Wococo => ToBridgeHubWococoHaulBlobExporter::validate( - network, - channel, - universal_source, - destination, - message, - ) - .map(|result| ((Wococo, result.0), result.1)), - _ => unimplemented!("Unsupported network: {:?}", network), - } - } - - fn deliver(ticket: Self::Ticket) -> Result { - let (network, ticket) = ticket; - match network { - Rococo => ToBridgeHubRococoHaulBlobExporter::deliver(ticket), - Wococo => ToBridgeHubWococoHaulBlobExporter::deliver(ticket), - _ => unimplemented!("Unsupported network: {:?}", network), - } - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs deleted file mode 100644 index eb12e7742dc0..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ /dev/null @@ -1,445 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg(test)] - -use bp_polkadot_core::Signature; -use bridge_hub_rococo_runtime::{ - bridge_hub_rococo_config, bridge_hub_wococo_config, - constants::fee::WeightToFee, - xcm_config::{RelayNetwork, XcmConfig}, - BridgeRejectObsoleteHeadersAndMessages, DeliveryRewardInBalance, Executive, ExistentialDeposit, - ParachainSystem, PolkadotXcm, RequiredStakeForStakeAndSlash, Runtime, RuntimeCall, - RuntimeEvent, SessionKeys, SignedExtra, UncheckedExtrinsic, -}; -use codec::{Decode, Encode}; -use frame_support::parameter_types; -use frame_system::pallet_prelude::HeaderFor; -use parachains_common::{AccountId, AuraId, Balance}; -use sp_keyring::AccountKeyring::Alice; -use sp_runtime::{ - generic::{Era, SignedPayload}, - AccountId32, -}; -use xcm::latest::prelude::*; - -// Para id of sibling chain (Rockmine/Wockmint) used in tests. -pub const SIBLING_PARACHAIN_ID: u32 = 1000; - -parameter_types! { - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); -} - -fn construct_extrinsic( - sender: sp_keyring::AccountKeyring, - call: RuntimeCall, -) -> UncheckedExtrinsic { - let extra: SignedExtra = ( - frame_system::CheckNonZeroSender::::new(), - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(Era::immortal()), - frame_system::CheckNonce::::from(0), - frame_system::CheckWeight::::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from(0), - BridgeRejectObsoleteHeadersAndMessages {}, - ( - bridge_hub_wococo_config::BridgeRefundBridgeHubRococoMessages::default(), - bridge_hub_rococo_config::BridgeRefundBridgeHubWococoMessages::default(), - ), - ); - let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); - let signature = payload.using_encoded(|e| sender.sign(e)); - UncheckedExtrinsic::new_signed( - call, - AccountId32::from(sender.public()).into(), - Signature::Sr25519(signature.clone()), - extra, - ) -} - -fn construct_and_apply_extrinsic( - relayer_at_target: sp_keyring::AccountKeyring, - batch: pallet_utility::Call, -) -> sp_runtime::DispatchOutcome { - let batch_call = RuntimeCall::Utility(batch); - let xt = construct_extrinsic(relayer_at_target, batch_call); - let r = Executive::apply_extrinsic(xt); - r.unwrap() -} - -fn executive_init_block(header: &HeaderFor) { - Executive::initialize_block(header) -} - -fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { - bridge_hub_test_utils::CollatorSessionKeys::new( - AccountId::from(Alice), - AccountId::from(Alice), - SessionKeys { aura: AuraId::from(Alice.public()) }, - ) -} - -mod bridge_hub_rococo_tests { - use super::*; - use bridge_hub_rococo_config::{ - WithBridgeHubWococoMessageBridge, DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, - }; - use bridge_hub_rococo_runtime::{ - BridgeGrandpaWococoInstance, BridgeParachainWococoInstance, - WithBridgeHubWococoMessagesInstance, - }; - - bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID - ); - - #[test] - fn initialize_bridge_by_governance_works() { - bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< - Runtime, - BridgeGrandpaWococoInstance, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::BridgeWococoGrandpa(call).encode()), - ) - } - - #[test] - fn change_delivery_reward_by_governance_works() { - bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< - Runtime, - DeliveryRewardInBalance, - u64, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), - |old_value| old_value.checked_mul(2).unwrap(), - ) - } - - #[test] - fn change_required_stake_by_governance_works() { - bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< - Runtime, - RequiredStakeForStakeAndSlash, - Balance, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - || { - ( - RequiredStakeForStakeAndSlash::key().to_vec(), - RequiredStakeForStakeAndSlash::get(), - ) - }, - |old_value| old_value.checked_mul(2).unwrap(), - ) - } - - #[test] - fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { - bridge_hub_test_utils::test_cases::handle_export_message_from_system_parachain_to_outbound_queue_works::< - Runtime, - XcmConfig, - WithBridgeHubWococoMessagesInstance, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeWococoMessages(event)) => Some(event), - _ => None, - } - }), - || ExportMessage { network: Wococo, destination: X1(Parachain(1234)), xcm: Xcm(vec![]) }, - bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO - ) - } - - #[test] - fn message_dispatch_routing_works() { - bridge_hub_test_utils::test_cases::message_dispatch_routing_works::< - Runtime, - XcmConfig, - ParachainSystem, - WithBridgeHubWococoMessagesInstance, - RelayNetwork, - bridge_hub_rococo_config::WococoGlobalConsensusNetwork, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - bridge_hub_rococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, - ) - } - - #[test] - fn relayed_incoming_message_works() { - bridge_hub_test_utils::test_cases::relayed_incoming_message_works::< - Runtime, - XcmConfig, - ParachainSystem, - BridgeGrandpaWococoInstance, - BridgeParachainWococoInstance, - WithBridgeHubWococoMessagesInstance, - WithBridgeHubWococoMessageBridge, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - Rococo, - DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, - ) - } - - #[test] - pub fn complex_relay_extrinsic_works() { - bridge_hub_test_utils::test_cases::complex_relay_extrinsic_works::< - Runtime, - XcmConfig, - ParachainSystem, - BridgeGrandpaWococoInstance, - BridgeParachainWococoInstance, - WithBridgeHubWococoMessagesInstance, - WithBridgeHubWococoMessageBridge, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - bridge_hub_rococo_config::BridgeHubWococoChainId::get(), - Rococo, - DEFAULT_XCM_LANE_TO_BRIDGE_HUB_WOCOCO, - ExistentialDeposit::get(), - executive_init_block, - construct_and_apply_extrinsic, - ); - } -} - -mod bridge_hub_wococo_tests { - use super::*; - use bridge_hub_rococo_runtime::{ - BridgeGrandpaRococoInstance, BridgeParachainRococoInstance, - WithBridgeHubRococoMessagesInstance, - }; - use bridge_hub_wococo_config::{ - WithBridgeHubRococoMessageBridge, DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, - }; - - bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( - Runtime, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID - ); - - #[test] - fn initialize_bridge_by_governance_works() { - bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< - Runtime, - BridgeGrandpaRococoInstance, - >( - collator_session_keys(), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::BridgeRococoGrandpa(call).encode()), - ) - } - - #[test] - fn change_delivery_reward_by_governance_works() { - bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< - Runtime, - DeliveryRewardInBalance, - u64, - >( - collator_session_keys(), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - || (DeliveryRewardInBalance::key().to_vec(), DeliveryRewardInBalance::get()), - |old_value| old_value.checked_mul(2).unwrap(), - ) - } - - #[test] - fn change_required_stake_by_governance_works() { - bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< - Runtime, - RequiredStakeForStakeAndSlash, - Balance, - >( - collator_session_keys(), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - || { - ( - RequiredStakeForStakeAndSlash::key().to_vec(), - RequiredStakeForStakeAndSlash::get(), - ) - }, - |old_value| old_value.checked_mul(2).unwrap(), - ) - } - - #[test] - fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { - bridge_hub_test_utils::test_cases::handle_export_message_from_system_parachain_to_outbound_queue_works::< - Runtime, - XcmConfig, - WithBridgeHubRococoMessagesInstance, - >( - collator_session_keys(), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::BridgeRococoMessages(event)) => Some(event), - _ => None, - } - }), - || ExportMessage { network: Rococo, destination: X1(Parachain(4321)), xcm: Xcm(vec![]) }, - bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO - ) - } - - #[test] - fn message_dispatch_routing_works() { - bridge_hub_test_utils::test_cases::message_dispatch_routing_works::< - Runtime, - XcmConfig, - ParachainSystem, - WithBridgeHubRococoMessagesInstance, - RelayNetwork, - bridge_hub_wococo_config::RococoGlobalConsensusNetwork, - >( - collator_session_keys(), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), - _ => None, - } - }), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), - _ => None, - } - }), - bridge_hub_wococo_config::DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, - ) - } - - #[test] - fn relayed_incoming_message_works() { - bridge_hub_test_utils::test_cases::relayed_incoming_message_works::< - Runtime, - XcmConfig, - ParachainSystem, - BridgeGrandpaRococoInstance, - BridgeParachainRococoInstance, - WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, - >( - collator_session_keys(), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - Wococo, - DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, - ) - } - - #[test] - pub fn complex_relay_extrinsic_works() { - bridge_hub_test_utils::test_cases::complex_relay_extrinsic_works::< - Runtime, - XcmConfig, - ParachainSystem, - BridgeGrandpaRococoInstance, - BridgeParachainRococoInstance, - WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, - >( - collator_session_keys(), - bp_bridge_hub_wococo::BRIDGE_HUB_WOCOCO_PARACHAIN_ID, - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - SIBLING_PARACHAIN_ID, - bridge_hub_wococo_config::BridgeHubRococoChainId::get(), - Wococo, - DEFAULT_XCM_LANE_TO_BRIDGE_HUB_ROCOCO, - ExistentialDeposit::get(), - executive_init_block, - construct_and_apply_extrinsic, - ); - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/docs/bridge-hub-parachain-design.jpg b/cumulus/parachains/runtimes/bridge-hubs/docs/bridge-hub-parachain-design.jpg deleted file mode 100644 index 02feb11e1017..000000000000 Binary files a/cumulus/parachains/runtimes/bridge-hubs/docs/bridge-hub-parachain-design.jpg and /dev/null differ diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml deleted file mode 100644 index 1d20e510b3d8..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ /dev/null @@ -1,97 +0,0 @@ -[package] -name = "bridge-hub-test-utils" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Utils for BridgeHub testing" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -log = { version = "0.4.20", default-features = false } -assert_matches = "1.4.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false, optional = true } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Cumulus -asset-test-utils = { path = "../../assets/test-utils"} -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } -parachains-runtimes-test-utils = { path = "../../test-utils", default-features = false } - -# Polkadot -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm-benchmarks = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false, optional = true } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Bridges -bp-bridge-hub-rococo = { path = "../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-wococo = { path = "../../../../bridges/primitives/chain-bridge-hub-wococo", default-features = false } -bp-header-chain = { path = "../../../../bridges/primitives/header-chain", default-features = false } -bp-messages = { path = "../../../../bridges/primitives/messages", default-features = false } -bp-parachains = { path = "../../../../bridges/primitives/parachains", default-features = false } -bp-polkadot-core = { path = "../../../../bridges/primitives/polkadot-core", default-features = false } -bp-relayers = { path = "../../../../bridges/primitives/relayers", default-features = false } -bp-runtime = { path = "../../../../bridges/primitives/runtime", default-features = false } -bp-test-utils = { path = "../../../../bridges/primitives/test-utils", default-features = false } -pallet-bridge-grandpa = { path = "../../../../bridges/modules/grandpa", default-features = false } -pallet-bridge-parachains = { path = "../../../../bridges/modules/parachains", default-features = false } -pallet-bridge-messages = { path = "../../../../bridges/modules/messages", default-features = false } -pallet-bridge-relayers = { path = "../../../../bridges/modules/relayers", default-features = false } -bridge-runtime-common = { path = "../../../../bridges/bin/runtime-common", default-features = false } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "log/std", - "frame-benchmarking/std", - "frame-executive/std", - "frame-support/std", - "frame-system/std", - "bp-bridge-hub-rococo/std", - "bp-bridge-hub-wococo/std", - "bp-messages/std", - "bp-parachains/std", - "bp-polkadot-core/std", - "bp-header-chain/std", - "bp-relayers/std", - "bp-runtime/std", - "bp-test-utils/std", - "bridge-runtime-common/std", - "pallet-bridge-grandpa/std", - "pallet-bridge-parachains/std", - "pallet-bridge-messages/std", - "pallet-bridge-relayers/std", - "parachain-info/std", - "parachains-runtimes-test-utils/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcmp-queue/std", - "pallet-xcm/std", - "sp-core/std", - "sp-io/std", - "sp-runtime/std", - "xcm/std", - "xcm-builder/std", - "xcm-executor/std", - "asset-test-utils/std", - "cumulus-pallet-dmp-queue/std", - "pallet-session/std", - "pallet-balances/std", - "pallet-utility/std", -] diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs deleted file mode 100644 index 289d3f5b4d31..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Module contains predefined test-case scenarios for "BridgeHub" `Runtime`s. - -pub mod test_cases; -pub use bp_test_utils::test_header; -pub use parachains_runtimes_test_utils::*; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs deleted file mode 100644 index e928ea5c6b64..000000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ /dev/null @@ -1,933 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. - -use assert_matches::assert_matches; -use bp_messages::{ - target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch, SourceHeaderChain}, - LaneId, MessageKey, OutboundLaneData, Weight, -}; -use bp_parachains::{BestParaHeadHash, ParaInfo}; -use bp_polkadot_core::parachains::{ParaHash, ParaId}; -use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{HeaderOf, Parachain, StorageProofSize, UnderlyingChainOf}; -use bp_test_utils::{make_default_justification, prepare_parachain_heads_proof}; -use bridge_runtime_common::{ - messages::{ - target::FromBridgedChainMessagesProof, BridgedChain as MessageBridgedChain, MessageBridge, - }, - messages_generation::{encode_all_messages, encode_lane_data, prepare_messages_storage_proof}, - messages_xcm_extension::{XcmAsPlainPayload, XcmBlobMessageDispatchResult}, -}; -use codec::Encode; -use frame_support::{ - assert_ok, - traits::{Get, OriginTrait, PalletInfoAccess}, -}; -use frame_system::pallet_prelude::{BlockNumberFor, HeaderFor}; -use pallet_bridge_grandpa::BridgedHeader; -use parachains_runtimes_test_utils::{ - mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, RuntimeHelper, - ValidatorIdOf, XcmReceivedFrom, -}; -use sp_core::H256; -use sp_keyring::AccountKeyring::*; -use sp_runtime::{traits::Header as HeaderT, AccountId32}; -use xcm::latest::prelude::*; -use xcm_builder::DispatchBlobError; -use xcm_executor::XcmExecutor; - -// Re-export test_case from assets -pub use asset_test_utils::include_teleports_for_native_asset_works; - -// Re-export test_case from `parachains-runtimes-test-utils` -pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; - -/// Test-case makes sure that `Runtime` can process bridging initialize via governance-like call -pub fn initialize_bridge_by_governance_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - runtime_call_encode: Box< - dyn Fn(pallet_bridge_grandpa::Call) -> Vec, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_dmp_queue::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config, - GrandpaPalletInstance: 'static, - ValidatorIdOf: From>, -{ - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - // check mode before - assert_eq!( - pallet_bridge_grandpa::PalletOperatingMode::::try_get(), - Err(()) - ); - - // encode `initialize` call - let initialize_call = runtime_call_encode(pallet_bridge_grandpa::Call::< - Runtime, - GrandpaPalletInstance, - >::initialize { - init_data: test_data::initialization_data::(12345), - }); - - // overestimate - check weight for `pallet_bridge_grandpa::Pallet::initialize()` call - let require_weight_at_most = - ::DbWeight::get().reads_writes(7, 7); - - // execute XCM with Transacts to `initialize bridge` as governance does - assert_ok!(RuntimeHelper::::execute_as_governance( - initialize_call, - require_weight_at_most - ) - .ensure_complete()); - - // check mode after - assert_eq!( - pallet_bridge_grandpa::PalletOperatingMode::::try_get(), - Ok(bp_runtime::BasicOperatingMode::Normal) - ); - }) -} - -/// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: -/// Checks if received XCM messages is correctly added to the message outbound queue for delivery. -/// For SystemParachains we expect unpaid execution. -pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< - Runtime, - XcmConfig, - MessagesPalletInstance, ->( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - sibling_parachain_id: u32, - unwrap_pallet_bridge_messages_event: Box< - dyn Fn(Vec) -> Option>, - >, - export_message_instruction: fn() -> Instruction, - expected_lane_id: LaneId, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_dmp_queue::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_messages::Config, - XcmConfig: xcm_executor::Config, - MessagesPalletInstance: 'static, - ValidatorIdOf: From>, -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - let sibling_parachain_location = MultiLocation::new(1, Parachain(sibling_parachain_id)); - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - // check queue before - assert_eq!( - pallet_bridge_messages::OutboundLanes::::try_get( - expected_lane_id - ), - Err(()) - ); - - // prepare `ExportMessage` - let xcm = Xcm(vec![ - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - export_message_instruction(), - ]); - - // execute XCM - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - assert_ok!(XcmExecutor::::execute_xcm( - sibling_parachain_location, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), - ) - .ensure_complete()); - - // check queue after - assert_eq!( - pallet_bridge_messages::OutboundLanes::::try_get( - expected_lane_id - ), - Ok(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 0, - latest_generated_nonce: 1, - }) - ); - - // check events - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_messages_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, pallet_bridge_messages::Event::MessageAccepted { .. })) - ); - }) -} - -/// Test-case makes sure that Runtime can route XCM messages received in inbound queue, -/// We just test here `MessageDispatch` configuration. -/// We expect that runtime can route messages: -/// 1. to Parent (relay chain) -/// 2. to Sibling parachain -pub fn message_dispatch_routing_works< - Runtime, - XcmConfig, - HrmpChannelOpener, - MessagesPalletInstance, - RuntimeNetwork, - BridgedNetwork, ->( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - sibling_parachain_id: u32, - unwrap_cumulus_pallet_parachain_system_event: Box< - dyn Fn(Vec) -> Option>, - >, - unwrap_cumulus_pallet_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, - expected_lane_id: LaneId, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_dmp_queue::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_messages::Config, - XcmConfig: xcm_executor::Config, - MessagesPalletInstance: 'static, - ValidatorIdOf: From>, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - // MessageDispatcher: MessageDispatch, DispatchLevelResult = - // XcmBlobMessageDispatchResult, DispatchPayload = XcmAsPlainPayload>, - RuntimeNetwork: Get, - BridgedNetwork: Get, -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - // 1. this message is sent from other global consensus with destination of this Runtime relay chain (UMP) - let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::( - (RuntimeNetwork::get(), Here) - ); - let result = <>::MessageDispatch>::dispatch( - test_data::dispatch_message(expected_lane_id, 1, bridging_message) - ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); - - // check events - UpwardMessageSent - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_parachain_system_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. })) - ); - - // 2. this message is sent from other global consensus with destination of this Runtime sibling parachain (HRMP) - let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::( - (RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id))), - ); - - // 2.1. WITHOUT opened hrmp channel -> RoutingError - let result = - <>::MessageDispatch>::dispatch( - DispatchMessage { - key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, - data: DispatchMessageData { payload: Ok(bridging_message.clone()) }, - } - ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::NotDispatched(Some(DispatchBlobError::RoutingError)))); - - // check events - no XcmpMessageSent - assert_eq!(>::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())) - .count(), 0); - - // 2.1. WITH hrmp channel -> Ok - mock_open_hrmp_channel::(runtime_para_id.into(), sibling_parachain_id.into()); - let result = <>::MessageDispatch>::dispatch( - DispatchMessage { - key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, - data: DispatchMessageData { payload: Ok(bridging_message) }, - } - ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); - - // check events - XcmpMessageSent - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. })) - ); - }) -} - -/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, -/// with proofs (finality, para heads, message) independently submitted. -pub fn relayed_incoming_message_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - bridged_para_id: u32, - sibling_parachain_id: u32, - local_relay_chain_id: NetworkId, - lane_id: LaneId, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_dmp_queue::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - XcmConfig: xcm_executor::Config, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: From>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - AccountIdOf: From, - >::InboundRelayer: From, -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - assert_ne!(runtime_para_id, bridged_para_id); - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - mock_open_hrmp_channel::( - runtime_para_id.into(), - sibling_parachain_id.into(), - ); - - // start with bridged chain block#0 - let init_data = test_data::initialization_data::(0); - pallet_bridge_grandpa::Pallet::::initialize( - RuntimeHelper::::root_origin(), - init_data, - ) - .unwrap(); - - // set up relayer details and proofs - - let message_destination = - X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); - // some random numbers (checked by test) - let message_nonce = 1; - let para_header_number = 5; - let relay_header_number = 1; - - let relayer_at_target = Bob; - let relayer_id_on_target: AccountIdOf = relayer_at_target.public().into(); - let relayer_at_source = Dave; - let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); - - let xcm = vec![xcm::v3::Instruction::<()>::ClearOrigin; 42]; - let expected_dispatch = xcm::latest::Xcm::<()>({ - let mut expected_instructions = xcm.clone(); - // dispatch prepends bridge pallet instance - expected_instructions.insert( - 0, - DescendOrigin(X1(PalletInstance( - as PalletInfoAccess>::index() - as u8, - ))), - ); - expected_instructions - }); - // generate bridged relay chain finality, parachain heads and message proofs, - // to be submitted by relayer to this chain. - let ( - relay_chain_header, - grandpa_justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - message_proof, - ) = test_data::make_complex_relayer_proofs::, MB, ()>( - lane_id, - xcm.into(), - message_nonce, - message_destination, - para_header_number, - relay_header_number, - bridged_para_id, - ); - - // submit bridged relay chain finality proof - { - let result = pallet_bridge_grandpa::Pallet::::submit_finality_proof( - RuntimeHelper::::origin_of(relayer_id_on_target.clone()), - Box::new(relay_chain_header.clone()), - grandpa_justification, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - } - - // verify finality proof correctly imported - assert_eq!( - pallet_bridge_grandpa::BestFinalized::::get().unwrap().1, - relay_chain_header.hash() - ); - assert!(pallet_bridge_grandpa::ImportedHeaders::::contains_key( - relay_chain_header.hash() - )); - - // submit parachain heads proof - { - let result = - pallet_bridge_parachains::Pallet::::submit_parachain_heads( - RuntimeHelper::::origin_of(relayer_id_on_target.clone()), - (relay_header_number, relay_chain_header.hash().into()), - parachain_heads, - para_heads_proof, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - } - // verify parachain head proof correctly imported - assert_eq!( - pallet_bridge_parachains::ParasInfo::::get(ParaId(bridged_para_id)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: relay_header_number, - head_hash: bridged_para_head.hash() - }, - next_imported_hash_position: 1, - }) - ); - - // import message - assert!(RuntimeHelper::>::take_xcm( - sibling_parachain_id.into() - ) - .is_none()); - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 0, - ); - // submit message proof - { - let result = pallet_bridge_messages::Pallet::::receive_messages_proof( - RuntimeHelper::::origin_of(relayer_id_on_target), - relayer_id_on_source.into(), - message_proof.into(), - 1, - Weight::MAX / 1000, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - } - // verify message correctly imported and dispatched - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 1, - ); - // verify relayed bridged XCM message is dispatched to destination sibling para - let dispatched = RuntimeHelper::>::take_xcm( - sibling_parachain_id.into(), - ) - .unwrap(); - let mut dispatched = xcm::latest::Xcm::<()>::try_from(dispatched).unwrap(); - // We use `WithUniqueTopic`, so expect a trailing `SetTopic`. - assert_matches!(dispatched.0.pop(), Some(SetTopic(..))); - assert_eq!(dispatched, expected_dispatch); - }) -} - -/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, -/// with proofs (finality, para heads, message) batched together in signed extrinsic. -/// Also verifies relayer transaction signed extensions work as intended. -pub fn complex_relay_extrinsic_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - bridged_para_id: u32, - sibling_parachain_id: u32, - bridged_chain_id: bp_runtime::ChainId, - local_relay_chain_id: NetworkId, - lane_id: LaneId, - existential_deposit: BalanceOf, - executive_init_block: fn(&HeaderFor), - construct_and_apply_extrinsic: fn( - sp_keyring::AccountKeyring, - pallet_utility::Call:: - ) -> sp_runtime::DispatchOutcome, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_utility::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_dmp_queue::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_bridge_relayers::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - XcmConfig: xcm_executor::Config, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: From>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - AccountIdOf: From, - >::InboundRelayer: From, - ::RuntimeCall: - From> - + From> - + From> -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - assert_ne!(runtime_para_id, bridged_para_id); - - // Relayer account at local/this BH. - let relayer_at_target = Bob; - let relayer_id_on_target: AccountIdOf = relayer_at_target.public().into(); - let relayer_initial_balance = existential_deposit * 100000u32.into(); - // Relayer account at remote/bridged BH. - let relayer_at_source = Dave; - let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .with_balances(vec![(relayer_id_on_target.clone(), relayer_initial_balance)]) - .with_tracing() - .build() - .execute_with(|| { - let zero: BlockNumberFor = 0u32.into(); - let genesis_hash = frame_system::Pallet::::block_hash(zero); - let mut header: HeaderFor = bp_test_utils::test_header(1u32.into()); - header.set_parent_hash(genesis_hash); - executive_init_block(&header); - - mock_open_hrmp_channel::( - runtime_para_id.into(), - sibling_parachain_id.into(), - ); - - // start with bridged chain block#0 - let init_data = test_data::initialization_data::(0); - pallet_bridge_grandpa::Pallet::::initialize( - RuntimeHelper::::root_origin(), - init_data, - ) - .unwrap(); - - // set up relayer details and proofs - - let message_destination = - X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); - // some random numbers (checked by test) - let message_nonce = 1; - let para_header_number = 5; - let relay_header_number = 1; - - let xcm = vec![xcm::latest::Instruction::<()>::ClearOrigin; 42]; - let expected_dispatch = xcm::latest::Xcm::<()>({ - let mut expected_instructions = xcm.clone(); - // dispatch prepends bridge pallet instance - expected_instructions.insert( - 0, - DescendOrigin(X1(PalletInstance( - as PalletInfoAccess>::index() - as u8, - ))), - ); - expected_instructions - }); - // generate bridged relay chain finality, parachain heads and message proofs, - // to be submitted by relayer to this chain. - let ( - relay_chain_header, - grandpa_justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - message_proof, - ) = test_data::make_complex_relayer_proofs::, MB, ()>( - lane_id, - xcm.into(), - message_nonce, - message_destination, - para_header_number, - relay_header_number, - bridged_para_id, - ); - - let submit_grandpa = - pallet_bridge_grandpa::Call::::submit_finality_proof { - finality_target: Box::new(relay_chain_header.clone()), - justification: grandpa_justification, - }; - let submit_para_head = - pallet_bridge_parachains::Call::::submit_parachain_heads { - at_relay_block: (relay_header_number, relay_chain_header.hash().into()), - parachains: parachain_heads, - parachain_heads_proof: para_heads_proof, - }; - let submit_message = - pallet_bridge_messages::Call::::receive_messages_proof { - relayer_id_at_bridged_chain: relayer_id_on_source.into(), - proof: message_proof.into(), - messages_count: 1, - dispatch_weight: Weight::from_parts(1000000000, 0), - }; - let batch = pallet_utility::Call::::batch_all { - calls: vec![submit_grandpa.into(), submit_para_head.into(), submit_message.into()], - }; - - // sanity checks - before relayer extrinsic - assert!(RuntimeHelper::>::take_xcm( - sibling_parachain_id.into() - ) - .is_none()); - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 0, - ); - let msg_proofs_rewards_account = RewardsAccountParams::new( - lane_id, - bridged_chain_id, - RewardsAccountOwner::ThisChain, - ); - assert_eq!( - pallet_bridge_relayers::RelayerRewards::::get( - relayer_id_on_target.clone(), - msg_proofs_rewards_account - ), - None, - ); - - // construct and apply extrinsic containing batch calls: - // bridged relay chain finality proof - // + parachain heads proof - // + submit message proof - let dispatch_outcome = construct_and_apply_extrinsic(relayer_at_target, batch); - - // verify finality proof correctly imported - assert_ok!(dispatch_outcome); - assert_eq!( - >::get().unwrap().1, - relay_chain_header.hash() - ); - assert!(>::contains_key( - relay_chain_header.hash() - )); - // verify parachain head proof correctly imported - assert_eq!( - pallet_bridge_parachains::ParasInfo::::get(ParaId(bridged_para_id)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: relay_header_number, - head_hash: bridged_para_head.hash() - }, - next_imported_hash_position: 1, - }) - ); - // verify message correctly imported and dispatched - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 1, - ); - // verify relayer is refunded - assert!(pallet_bridge_relayers::RelayerRewards::::get( - relayer_id_on_target, - msg_proofs_rewards_account - ) - .is_some()); - // verify relayed bridged XCM message is dispatched to destination sibling para - let dispatched = RuntimeHelper::>::take_xcm( - sibling_parachain_id.into(), - ) - .unwrap(); - let mut dispatched = xcm::latest::Xcm::<()>::try_from(dispatched).unwrap(); - // We use `WithUniqueTopic`, so expect a trailing `SetTopic`. - assert_matches!(dispatched.0.pop(), Some(SetTopic(..))); - assert_eq!(dispatched, expected_dispatch); - }) -} - -pub mod test_data { - use super::*; - use bp_header_chain::justification::GrandpaJustification; - use bp_messages::MessageNonce; - use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; - use bp_runtime::BasicOperatingMode; - use bp_test_utils::authority_list; - use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter}; - use xcm_executor::traits::{validate_export, ExportXcm}; - - pub fn prepare_inbound_xcm( - xcm_message: Xcm, - destination: InteriorMultiLocation, - ) -> Vec { - let location = xcm::VersionedInteriorMultiLocation::V3(destination); - let xcm = xcm::VersionedXcm::::V3(xcm_message); - // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor - // or public fields, so just tuple - // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed - // to the storage) - (location, xcm).encode().encode() - } - - pub fn make_complex_relayer_proofs( - lane_id: LaneId, - xcm_message: Xcm, - message_nonce: MessageNonce, - message_destination: Junctions, - para_header_number: u32, - relay_header_number: u32, - bridged_para_id: u32, - ) -> ( - BridgedRelayHeader, - GrandpaJustification, - ParaHead, - Vec<(ParaId, ParaHash)>, - ParaHeadsProof, - FromBridgedChainMessagesProof, - ) - where - BridgedRelayHeader: HeaderT, - ::Hash: From, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - { - let message_payload = prepare_inbound_xcm(xcm_message, message_destination); - let message_size = StorageProofSize::Minimal(message_payload.len() as u32); - // prepare para storage proof containing message - let (para_state_root, para_storage_proof) = prepare_messages_storage_proof::( - lane_id, - message_nonce..=message_nonce, - None, - message_size, - message_payload, - encode_all_messages, - encode_lane_data, - ); - - let bridged_para_head = ParaHead( - bp_test_utils::test_header_with_root::>( - para_header_number.into(), - para_state_root.into(), - ) - .encode(), - ); - let (relay_state_root, para_heads_proof, parachain_heads) = - prepare_parachain_heads_proof::>(vec![( - bridged_para_id, - bridged_para_head.clone(), - )]); - assert_eq!(bridged_para_head.hash(), parachain_heads[0].1); - - let message_proof = FromBridgedChainMessagesProof { - bridged_header_hash: bridged_para_head.hash(), - storage_proof: para_storage_proof, - lane: lane_id, - nonces_start: message_nonce, - nonces_end: message_nonce, - }; - - // import bridged relay chain block#1 with state root containing head#5 of bridged parachain - let relay_chain_header: BridgedRelayHeader = bp_test_utils::test_header_with_root( - relay_header_number.into(), - relay_state_root.into(), - ); - let justification = make_default_justification(&relay_chain_header); - ( - relay_chain_header, - justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - message_proof, - ) - } - - /// Helper that creates InitializationData mock data, that can be used to initialize bridge - /// GRANDPA pallet - pub fn initialization_data< - Runtime: pallet_bridge_grandpa::Config, - GrandpaPalletInstance: 'static, - >( - block_number: u32, - ) -> bp_header_chain::InitializationData> { - bp_header_chain::InitializationData { - header: Box::new(bp_test_utils::test_header(block_number.into())), - authority_list: authority_list(), - set_id: 1, - operating_mode: BasicOperatingMode::Normal, - } - } - - /// Dummy xcm - pub(crate) fn dummy_xcm() -> Xcm<()> { - vec![Trap(42)].into() - } - - pub(crate) fn dispatch_message( - lane_id: LaneId, - nonce: MessageNonce, - payload: Vec, - ) -> DispatchMessage> { - DispatchMessage { - key: MessageKey { lane_id, nonce }, - data: DispatchMessageData { payload: Ok(payload) }, - } - } - - /// Macro used for simulate_export_message and capturing bytes - macro_rules! grab_haul_blob ( - ($name:ident, $grabbed_payload:ident) => { - std::thread_local! { - static $grabbed_payload: std::cell::RefCell>> = std::cell::RefCell::new(None); - } - - struct $name; - impl HaulBlob for $name { - fn haul_blob(blob: Vec) -> Result<(), HaulBlobError>{ - $grabbed_payload.with(|rm| *rm.borrow_mut() = Some(blob)); - Ok(()) - } - } - } - ); - - /// Simulates `HaulBlobExporter` and all its wrapping and captures generated plain bytes, - /// which are transfered over bridge. - pub(crate) fn simulate_message_exporter_on_bridged_chain< - SourceNetwork: Get, - DestinationNetwork: Get, - >( - (destination_network, destination_junctions): (NetworkId, Junctions), - ) -> Vec { - grab_haul_blob!(GrabbingHaulBlob, GRABBED_HAUL_BLOB_PAYLOAD); - - // lets pretend that some parachain on bridged chain exported the message - let universal_source_on_bridged_chain = - X2(GlobalConsensus(SourceNetwork::get()), Parachain(5678)); - let channel = 1_u32; - - // simulate XCM message export - let (ticket, fee) = - validate_export::>( - destination_network, - channel, - universal_source_on_bridged_chain, - destination_junctions, - dummy_xcm(), - ) - .expect("validate_export to pass"); - log::info!( - target: "simulate_message_exporter_on_bridged_chain", - "HaulBlobExporter::validate fee: {:?}", - fee - ); - let xcm_hash = - HaulBlobExporter::::deliver(ticket) - .expect("deliver to pass"); - log::info!( - target: "simulate_message_exporter_on_bridged_chain", - "HaulBlobExporter::deliver xcm_hash: {:?}", - xcm_hash - ); - - GRABBED_HAUL_BLOB_PAYLOAD.with(|r| r.take().expect("Encoded message should be here")) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml deleted file mode 100644 index c74c2e890feb..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/Cargo.toml +++ /dev/null @@ -1,199 +0,0 @@ -[package] -name = "collectives-polkadot-runtime" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Polkadot Collectives Parachain Runtime" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-alliance = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-collective = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-preimage = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-proxy = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-scheduler = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-referenda = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-ranked-collective = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-core-fellowship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-salary = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-arithmetic = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0" } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[dev-dependencies] -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -[features] -default = [ "std" ] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-alliance/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-collective/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-proxy/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "pallet-scheduler/runtime-benchmarks", - "pallet-preimage/runtime-benchmarks", - "pallet-referenda/runtime-benchmarks", - "pallet-ranked-collective/runtime-benchmarks", - "pallet-core-fellowship/runtime-benchmarks", - "pallet-salary/runtime-benchmarks", -] -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-alliance/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collective/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-multisig/try-runtime", - "pallet-proxy/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", - "pallet-scheduler/try-runtime", - "pallet-preimage/try-runtime", - "pallet-referenda/try-runtime", - "pallet-ranked-collective/try-runtime", - "pallet-core-fellowship/try-runtime", - "pallet-salary/try-runtime", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-alliance/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-collective/std", - "pallet-multisig/std", - "pallet-proxy/std", - "pallet-session/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-utility/std", - "pallet-xcm/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "polkadot-runtime-constants/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "pallet-collator-selection/std", - "parachain-info/std", - "parachains-common/std", - "pallet-scheduler/std", - "pallet-preimage/std", - "pallet-referenda/std", - "pallet-ranked-collective/std", - "substrate-wasm-builder", - "pallet-core-fellowship/std", - "pallet-salary/std", -] diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/build.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/constants.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/constants.rs deleted file mode 100644 index 8d0325844cc6..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/constants.rs +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod account { - use frame_support::PalletId; - - /// Polkadot treasury pallet id, used to convert into AccountId - pub const POLKADOT_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/trsry"); - /// Alliance pallet ID. - /// It is used as a temporarily place to deposit a slashed imbalance - /// before the teleport to the Treasury. - pub const ALLIANCE_PALLET_ID: PalletId = PalletId(*b"py/allia"); - /// Referenda pallet ID. - /// It is used as a temporarily place to deposit a slashed imbalance - /// before the teleport to the Treasury. - pub const REFERENDA_PALLET_ID: PalletId = PalletId(*b"py/refer"); -} - -pub mod currency { - use polkadot_core_primitives::Balance; - use polkadot_runtime_constants as constants; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const DOLLARS: Balance = constants::currency::DOLLARS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // 1/100 of Polkadot. - constants::currency::deposit(items, bytes) / 100 - } -} - -/// Fee-related. -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in a parachain, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs deleted file mode 100644 index 6f5b8aff8d4a..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/migration.rs +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Migrations. - -use frame_support::{pallet_prelude::*, traits::OnRuntimeUpgrade, weights::Weight}; -use log; - -/// Initial import of the Kusama Technical Fellowship. -pub(crate) mod import_kusama_fellowship { - use super::*; - use frame_support::{parameter_types, traits::RankedMembers}; - use pallet_ranked_collective::{Config, MemberCount, Pallet as RankedCollective, Rank}; - #[cfg(feature = "try-runtime")] - use sp_std::vec::Vec; - - const TARGET: &str = "runtime::migration::import_fellowship"; - - parameter_types! { - // The Fellowship addresses from Kusama state. - pub const FellowshipAddresses: [(Rank, [u8; 32]); 47] = [ - (6, hex_literal::hex!("f0673d30606ee26672707e4fd2bc8b58d3becb7aba2d5f60add64abb5fea4710"),), - (6, hex_literal::hex!("3c235e80e35082b668682531b9b062fda39a46edb94f884d9122d86885fd5f1b"),), - (6, hex_literal::hex!("7628a5be63c4d3c8dbb96c2904b1a9682e02831a1af836c7efc808020b92fa63"),), - (5, hex_literal::hex!("9c84f75e0b1b92f6b003bde6212a8b2c9b776f3720f942b33fed8709f103a268"),), - (5, hex_literal::hex!("bc64065524532ed9e805fb0d39a5c0199216b52871168e5e4d0ab612f8797d61"),), - (5, hex_literal::hex!("2e1884c53071526483b14004e894415f02b55fc2e2aef8e1df8ccf7ce5bd5570"),), - (5, hex_literal::hex!("5c5062779d44ea2ab0469e155b8cf3e004fce71b3b3d38263cd9fa9478f12f28"),), - (4, hex_literal::hex!("4adf51a47b72795366d52285e329229c836ea7bbfe139dbe8fa0700c4f86fc56"),), - (4, hex_literal::hex!("1c90e3dabd3fd0f6bc648045018f78fcee8fe24122c22d8d2a14e9905073d10f"),), - (4, hex_literal::hex!("8e851ed992228f2268ee8c614fe6075d3800060ae14098e0309413a0a81c4470"),), - (3, hex_literal::hex!("720d807d46b941703ffe0278e8b173dc6738c5af8af812ceffc90c69390bbf1f"),), - (3, hex_literal::hex!("c4965f7fe7be8174717a24ffddf684986d122c7e293ddf875cdf9700a07b6812"),), - (3, hex_literal::hex!("beae5bcad1a8c156291b7ddf46b38b0c61a6aaacebd57b21c75627bfe7f9ab71"),), - (3, hex_literal::hex!("ccd87fa65729f7bdaa8305581a7a499aa24c118e83f5714152c0e22617c6fc63"),), - (3, hex_literal::hex!("e0f0f94962fc0a8c1a0f0527dc8e592c67939c46c903b6016cc0a8515da0044d"),), - (3, hex_literal::hex!("984e16482c99cfad1436111e321a86d87d0fac203bf64538f888e45d793b5413"),), - (3, hex_literal::hex!("44a3efb5bfa9023d4ef27b7d31d76f531b4d7772b1679b7fb32b6263ac39100e"),), - (2, hex_literal::hex!("2eba9a39dbfdd5f3cba964355d45e27319f0271023c0353d97dc6df2401b0e3d"),), - (2, hex_literal::hex!("ba3e9b87792bcfcc237fa8181185b8883c77f3e24f45e4a92ab31d07a4703520"),), - (2, hex_literal::hex!("9e6eb74b0a6b39de36fb58d1fab20bc2b3fea96023ce5a47941c20480d99f92e"),), - (2, hex_literal::hex!("ee3d9d8c48ee88dce78fd7bafe3ce2052900eb465085b9324d4f5da26b145f2b"),), - (2, hex_literal::hex!("d8290537d6e31fe1ff165eaa62b63f6f3556dcc720b0d3a6d7eab96275617304"),), - (2, hex_literal::hex!("5a090c88f0438b46b451026597cee760a7bac9d396c9c7b529b68fb78aec5f43"),), - (2, hex_literal::hex!("18d30040a8245c5ff17afc9a8169d7d0771fe7ab4135a64a022c254117340720"),), - (1, hex_literal::hex!("b4f7f03bebc56ebe96bc52ea5ed3159d45a0ce3a8d7f082983c33ef133274747"),), - (1, hex_literal::hex!("caafae0aaa6333fcf4dc193146945fe8e4da74aa6c16d481eef0ca35b8279d73"),), - (1, hex_literal::hex!("a66e0f4e1a121cc83fddf3096e8ec8c9e9c85989f276e39e951fb0e4a5398763"),), - (1, hex_literal::hex!("f65f3cade8f68e8f34c6266b0d37e58a754059ca96816e964f98e17c79505073"),), - (1, hex_literal::hex!("8c232c91ef2a9983ba65c4b75bb86fcbae4d909900ea8aa06c3644ca1161db48"),), - (1, hex_literal::hex!("78e4813814891bd48bc745b79254a978833d41fbe0f387df93cd87eae2468926"),), - (1, hex_literal::hex!("d44824ac8d1edecca67639ca74d208bd2044a10e67c9677e288080191e3fec13"),), - (1, hex_literal::hex!("585e982d74da4f4290d20a73800cfd705cf59e1f5880aaee5506b5eaaf544f49"),), - (1, hex_literal::hex!("d851f44a6f0d0d2f3439a51f2f75f66f4ea1a8e6c33c32f9af75fc188afb7546"),), - (1, hex_literal::hex!("dca89b135d1a6aee0a498610a70eeaed056727c8a4d220da245842e540a54a74"),), - (1, hex_literal::hex!("aa91fc0201f26b713a018669bcd269babf25368eee2493323b1ce0190a178a27"),), - (1, hex_literal::hex!("dc20836f2e4b88c1858d1e3f918e7358043b4a8abcd2874e74d91d26c52eca2a"),), - (1, hex_literal::hex!("145d6c503d0cf97f4c7725ca773741bd02e1760bfb52e021af5a9f2de283012c"),), - (1, hex_literal::hex!("307183930b2264c5165f4a210a99520c5f1672b0413d57769fabc19e6866fb25"),), - (1, hex_literal::hex!("6201961514cf5ad87f1c4dd0c392ee28231f805f77975147bf2c33bd671b9822"),), - (1, hex_literal::hex!("c6f57237cd4abfbeed99171495fc784e45a9d5d2814d435de40de00991a73c06"),), - (1, hex_literal::hex!("c1df5c7e8ca56037450c58734326ebe34aec8f7d1928322a12164856365fea73"),), - (1, hex_literal::hex!("12c039004da5e1e846aae808277098c719cef1f4985aed00161a42ac4f0e002f"),), - (1, hex_literal::hex!("7460ac178015d2a7c289bb68ef9fdaac071596ab4425c276a0040aaac7055566"),), - (1, hex_literal::hex!("eec4bd650a277342ebba0954ac786df2623bd6a9d6d3e69b484482336c549f79"),), - (1, hex_literal::hex!("e287c7494655d636a846f5c3347ad2cb3c462a8d46e0832be70fcc0ab54ee62d"),), - (1, hex_literal::hex!("82bf733f44a840f0a5c1935a002d4e541d81298fad6d1da8124073485983860e"),), - (1, hex_literal::hex!("d5b89078eed9b9dfec5c7d8413bac0b720bad3bd4078c4d8c894325713192502"),), - ]; - } - - /// Implements `OnRuntimeUpgrade` trait. - pub struct Migration(PhantomData<(T, I)>); - - impl, I: 'static> OnRuntimeUpgrade for Migration - where - ::AccountId: From<[u8; 32]>, - { - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { - let onchain_version = RankedCollective::::on_chain_storage_version(); - ensure!(onchain_version == 0, "the storage version must be 0."); - let member_count = MemberCount::::get(0); - ensure!(member_count == 0, "the collective must be uninitialized."); - - Ok(Vec::new()) - } - - fn on_runtime_upgrade() -> Weight { - let current_version = RankedCollective::::current_storage_version(); - let onchain_version = RankedCollective::::on_chain_storage_version(); - let mut weight = T::DbWeight::get().reads(1); - log::info!( - target: TARGET, - "running migration with current storage version {:?} / onchain {:?}.", - current_version, - onchain_version - ); - if onchain_version != 0 { - log::warn!( - target: TARGET, - "unsupported storage version, skipping import_fellowship migration." - ); - return weight - } - let member_count = MemberCount::::get(0); - weight.saturating_accrue(T::DbWeight::get().reads(1)); - if member_count != 0 { - log::warn!( - target: TARGET, - "the collective already initialized, skipping import_fellowship migration." - ); - return weight - } - - for (rank, account_id32) in FellowshipAddresses::get() { - let who: T::AccountId = account_id32.into(); - let _ = as RankedMembers>::induct(&who); - for _ in 0..rank { - let _ = as RankedMembers>::promote(&who); - // 1 write to `IdToIndex` and `IndexToId` per member on each rank. - weight.saturating_accrue(T::DbWeight::get().writes(2)); - } - // 1 write to `IdToIndex` and `IndexToId` per member on each rank. - weight.saturating_accrue(T::DbWeight::get().writes(2)); - // 1 read and 1 write to `Members` and `MemberCount` per member. - weight.saturating_accrue(T::DbWeight::get().reads_writes(2, 2)); - } - weight - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { - ensure!(MemberCount::::get(0) == 47, "invalid members count at rank 0."); - ensure!(MemberCount::::get(1) == 47, "invalid members count at rank 1."); - ensure!(MemberCount::::get(2) == 24, "invalid members count at rank 2."); - ensure!(MemberCount::::get(3) == 17, "invalid members count at rank 3."); - ensure!(MemberCount::::get(4) == 10, "invalid members count at rank 4."); - ensure!(MemberCount::::get(5) == 7, "invalid members count at rank 5."); - ensure!(MemberCount::::get(6) == 3, "invalid members count at rank 6."); - ensure!(MemberCount::::get(7) == 0, "invalid members count at rank 7."); - Ok(()) - } - } -} - -#[cfg(test)] -pub mod tests { - use super::import_kusama_fellowship::FellowshipAddresses; - use crate::{FellowshipCollectiveInstance as Fellowship, Runtime, System}; - use frame_support::traits::OnRuntimeUpgrade; - use pallet_ranked_collective::Rank; - use parachains_common::AccountId; - use sp_core::crypto::Ss58Codec; - use sp_runtime::{AccountId32, BuildStorage}; - - #[test] - fn check_fellowship_addresses() { - let fellowship_addresses = FellowshipAddresses::get(); - let kusama_fellowship_ss58: [(Rank, _); 47] = [ - (6, "16SDAKg9N6kKAbhgDyxBXdHEwpwHUHs2CNEiLNGeZV55qHna"), /* proof https://kusama.subscan.io/extrinsic/16832707-4 */ - (6, "12MrP337azmkTdfCUKe5XLnSQrbgEKqqfZ4PQC7CZTJKAWR3"), /* proof https://kusama.subscan.io/extrinsic/16967809-2 */ - (6, "FFFF3gBSSDFSvK2HBq4qgLH75DHqXWPHeCnR1BSksAMacBs"), - (5, "G7YVCdxZb8JLpAm9WMnJdNuojNT84AzU62zmvx5P1FMNtg2"), - (5, "15G1iXDLgFyfnJ51FKq1ts44TduMyUtekvzQi9my4hgYt2hs"), /* proof https://kusama.subscan.io/extrinsic/16917610-2 */ - (5, "Dcm1BqR4N7nHuV43TXdET7pNibt1Nzm42FggPHpxKRven53"), - (5, "1363HWTPzDrzAQ6ChFiMU6mP4b6jmQid2ae55JQcKtZnpLGv"), /* proof https://kusama.subscan.io/extrinsic/16961180-2 */ - (4, "EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo"), - (4, "1eTPAR2TuqLyidmPT9rMmuycHVm9s9czu78sePqg2KHMDrE"), /* proof https://kusama.subscan.io/extrinsic/16921712-3 */ - (4, "14DsLzVyTUTDMm2eP3czwPbH53KgqnQRp3CJJZS9GR7yxGDP"), /* proof https://kusama.subscan.io/extrinsic/16917519-2 */ - (3, "13aYUFHB3umoPoxBEAHSv451iR3RpsNi3t5yBZjX2trCtTp6"), /* proof https://kusama.subscan.io/extrinsic/16917832-3 */ - (3, "H25aCspunTUqAt4D1gC776vKZ8FX3MvQJ3Jde6qDXPQaFxk"), - (3, "GtLQoW4ZqcjExMPq6qB22bYc6NaX1yMzRuGWpSRiHqnzRb9"), - (3, "15db5ksZgmhWE9U8MDq4wLKUdFivLVBybztWV8nmaJvv3NU1"), /* proof https://kusama.subscan.io/extrinsic/16876631-2 */ - (3, "HfFpz4QUxfbocHudf8UU7cMgHqkHpf855Me5X846PZAsAYE"), - (3, "14ShUZUYUR35RBZW6uVVt1zXDxmSQddkeDdXf1JkMA6P721N"), /* proof https://kusama.subscan.io/extrinsic/16918890-8 */ - (3, "12YzxR5TvGzfMVZNnhAJ5Hwi5zExpRWMKv2MuMwZTrddvgoi"), /* proof https://kusama.subscan.io/extrinsic/16924324-3 */ - (2, "Ddb9puChKMHq4gM6o47E551wAmaNeu6kHngX1jzNNqAw782"), - (2, "15DCWHQknBjc5YPFoVj8Pn2KoqrqYywJJ95BYNYJ4Fj3NLqz"), /* proof https://kusama.subscan.io/extrinsic/16834952-2 */ - (2, "14ajTQdrtCA8wZmC4PgD8Y1B2Gy8L4Z3oi2fodxq9FehcFrM"), /* proof https://kusama.subscan.io/extrinsic/16944257-2 */ - (2, "HxhDbS3grLurk1dhDgPiuDaRowHY1xHCU8Vu8on3fdg85tx"), - (2, "HTk3eccL7WBkiyxz1gBcqQRghsJigoDMD7mnQaz1UAbMpQV"), - (2, "EcNWrSPSDcVBRymwr26kk4JVFg92PdoU5Xwp87W2FgFSt9c"), - (2, "D8sM6vKjWaeKy2zCPYWGkLLbWdUtWQrXBTQqr4dSYnVQo21"), - (1, "GfbnnEgRU94n9ed4RFZ6Z9dBAWs5obykigJSwXKU9hsT2uU"), - (1, "HA5NtttvyZsxo4wGxGoJJSMaWtdEFZAuGUMFHVWD7fgenPv"), - (1, "14mDeKZ7qp9hqBjjDg51c8BFrf9o69om8piSSRwj2fT5Yb1i"), /* proof https://kusama.subscan.io/extrinsic/16919020-4 */ - (1, "16a357f5Sxab3V2ne4emGQvqJaCLeYpTMx3TCjnQhmJQ71DX"), /* proof https://kusama.subscan.io/extrinsic/16836396-5 */ - (1, "14Ak9rrF6RKHHoLLRUYMnzcvvi1t8E1yAMa7tcmiwUfaqzYK"), /* proof https://kusama.subscan.io/extrinsic/16921990-3 */ - (1, "FJq9JpA9P7EXbmfsN9YiewJaDbQyL6vQyksGtJvzfbn6zf8"), - (1, "15oLanodWWweiZJSoDTEBtrX7oGfq6e8ct5y5E6fVRDPhUgj"), /* proof https://kusama.subscan.io/extrinsic/16876423-7 */ - (1, "EaBqDJJNsZmYdQ4xn1vomPJVNh7fjA6UztZeEjn7ZzdeT7V"), - (1, "HTxCvXKVvUZ7PQq175kCRRLu7XkGfTfErrdNXr1ZuuwVZWv"), - (1, "HZe91A6a1xqbKaw6ofx3GFepJjhVXHrwHEwn6YUDDFphpX9"), - (1, "GRy2P3kBEzSHCbmDJfquku1cyUyhZaAqojRcNE4A4U3MnLd"), - (1, "HYwiBo7Mcv7uUDg4MUoKm2fxzv4dMLAtmmNfzHV8qcQJpAE"), - (1, "1ThiBx5DDxFhoD9GY6tz5Fp4Y7Xn1xfLmDddcoFQghDvvjg"), /* proof https://kusama.subscan.io/extrinsic/16918130-2 */ - (1, "DfqY6XQUSETTszBQ1juocTcG9iiDoXhvq1CoVadBSUqTGJS"), - (1, "EnpgVWGGQVrFdSB2qeXRVdtccV6U5ZscNELBoERbkFD8Wi6"), - (1, "H5BuqCmucJhUUuvjAzPazeVwVCtUSXVQdc5Dnx2q5zD7rVn"), - (1, "GxX7S1pTDdeaGUjpEPPF2we6tgHDhbatFG25pVmVFtGHLH6"), - (1, "CzuUtvKhZNZBjyAXeYviaRXwrLhVrsupJ9PrWmdq7BJTjGR"), - (1, "FCunn2Rx8JqfT5g6noUKKazph4jLDba5rUee7o3ZmJ362Ju"), - (1, "HyPMjWRHCpJS7x2SZ2R6M2XG5ZiCiZag4U4r7gBHRsE5mTc"), - (1, "1682A5hxfiS1Kn1jrUnMYv14T9EuEnsgnBbujGfYbeEbSK3w"), /* proof https://kusama.subscan.io/extrinsic/16919077-2 */ - (1, "13xS6fK6MHjApLnjdX7TJYw1niZmiXasSN91bNtiXQjgEtNx"), /* proof https://kusama.subscan.io/extrinsic/16918212-7 */ - (1, "15qE2YAQCs5Y962RHE7RzNjQxU6Pei21nhkkSM9Sojq1hHps"), /* https://kusama.subscan.io/extrinsic/17352973-2 */ - ]; - - for (index, val) in kusama_fellowship_ss58.iter().enumerate() { - let account: AccountId32 = ::from_string(val.1).unwrap(); - let account32: [u8; 32] = account.clone().into(); - assert_eq!( - fellowship_addresses[index].0, kusama_fellowship_ss58[index].0, - "ranks must be equal." - ); - assert_eq!(fellowship_addresses[index].1, account32, "accounts must be equal."); - } - } - - #[test] - fn test_fellowship_import() { - use super::import_kusama_fellowship::Migration; - use pallet_ranked_collective::{IdToIndex, IndexToId, MemberCount, MemberRecord, Members}; - - let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| System::set_block_number(1)); - ext.execute_with(|| { - assert_eq!(MemberCount::::get(0), 0); - Migration::::on_runtime_upgrade(); - assert_eq!(MemberCount::::get(0), 47); - assert_eq!(MemberCount::::get(6), 3); - assert_eq!(MemberCount::::get(7), 0); - for (rank, account_id32) in FellowshipAddresses::get() { - let who = ::AccountId::from(account_id32); - assert!(IdToIndex::::get(0, &who).is_some()); - assert!(IdToIndex::::get(rank + 1, &who).is_none()); - let index = IdToIndex::::get(rank, &who).unwrap(); - assert_eq!(IndexToId::::get(rank, index).unwrap(), who); - assert_eq!( - Members::::get(&who).unwrap(), - MemberRecord::new(rank) - ); - } - }); - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs deleted file mode 100644 index 489b868eff34..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/mod.rs +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The Polkadot Technical Fellowship. - -pub(crate) mod migration; -mod origins; -mod tracks; -use crate::{ - constants, impls::ToParentTreasury, weights, AccountId, Balance, Balances, FellowshipReferenda, - GovernanceLocation, PolkadotTreasuryAccount, Preimage, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, Scheduler, DAYS, -}; -use cumulus_primitives_core::Junction::GeneralIndex; -use frame_support::{ - parameter_types, - traits::{EitherOf, EitherOfDiverse, MapSuccess, OriginTrait, TryWithMorphedArg}, -}; -use frame_system::EnsureRootWithSuccess; -pub use origins::{ - pallet_origins as pallet_fellowship_origins, Architects, EnsureCanPromoteTo, EnsureCanRetainAt, - EnsureFellowship, Fellows, Masters, Members, ToVoice, -}; -use pallet_ranked_collective::EnsureOfRank; -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use polkadot_runtime_constants::{time::HOURS, xcm::body::FELLOWSHIP_ADMIN_INDEX}; -use sp_core::{ConstU128, ConstU32}; -use sp_runtime::traits::{AccountIdConversion, ConstU16, ConvertToValue, Replace, TakeFirst}; -use xcm::latest::BodyId; -use xcm_builder::{AliasesIntoAccountId32, LocatableAssetId, PayOverXcm}; - -#[cfg(feature = "runtime-benchmarks")] -use crate::impls::benchmarks::{OpenHrmpChannel, PayWithEnsure}; - -/// The Fellowship members' ranks. -pub mod ranks { - use pallet_ranked_collective::Rank; - - pub const DAN_1: Rank = 1; // aka Members. - pub const DAN_2: Rank = 2; - pub const DAN_3: Rank = 3; // aka Fellows. - pub const DAN_4: Rank = 4; // aka Architects. - pub const DAN_5: Rank = 5; - pub const DAN_6: Rank = 6; - pub const DAN_7: Rank = 7; // aka Masters. - pub const DAN_8: Rank = 8; - pub const DAN_9: Rank = 9; -} - -parameter_types! { - // Referenda pallet account, used to temporarily deposit slashed imbalance before teleporting. - pub ReferendaPalletAccount: AccountId = constants::account::REFERENDA_PALLET_ID.into_account_truncating(); - pub const FellowshipAdminBodyId: BodyId = BodyId::Index(FELLOWSHIP_ADMIN_INDEX); -} - -impl pallet_fellowship_origins::Config for Runtime {} - -pub type FellowshipReferendaInstance = pallet_referenda::Instance1; - -impl pallet_referenda::Config for Runtime { - type WeightInfo = weights::pallet_referenda::WeightInfo; - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type Scheduler = Scheduler; - type Currency = Balances; - // Fellows can submit proposals. - type SubmitOrigin = EitherOf< - pallet_ranked_collective::EnsureMember, - MapSuccess< - TryWithMorphedArg< - RuntimeOrigin, - ::PalletsOrigin, - ToVoice, - EnsureOfRank, - (AccountId, u16), - >, - TakeFirst, - >, - >; - type CancelOrigin = Architects; - type KillOrigin = Masters; - type Slash = ToParentTreasury; - type Votes = pallet_ranked_collective::Votes; - type Tally = pallet_ranked_collective::TallyOf; - type SubmissionDeposit = ConstU128<0>; - type MaxQueued = ConstU32<100>; - type UndecidingTimeout = ConstU32<{ 7 * DAYS }>; - type AlarmInterval = ConstU32<1>; - type Tracks = tracks::TracksInfo; - type Preimages = Preimage; -} - -pub type FellowshipCollectiveInstance = pallet_ranked_collective::Instance1; - -impl pallet_ranked_collective::Config for Runtime { - type WeightInfo = weights::pallet_ranked_collective::WeightInfo; - type RuntimeEvent = RuntimeEvent; - - #[cfg(not(feature = "runtime-benchmarks"))] - // Promotions and the induction of new members are serviced by `FellowshipCore` pallet instance. - type PromoteOrigin = frame_system::EnsureNever; - #[cfg(feature = "runtime-benchmarks")] - // The maximum value of `u16` set as a success value for the root to ensure the benchmarks will - // pass. - type PromoteOrigin = EnsureRootWithSuccess>; - - // Demotion is by any of: - // - Root can demote arbitrarily. - // - the FellowshipAdmin origin (i.e. token holder referendum); - // - // The maximum value of `u16` set as a success value for the root to ensure the benchmarks will - // pass. - type DemoteOrigin = EitherOf< - EnsureRootWithSuccess>, - MapSuccess< - EnsureXcm>, - Replace>, - >, - >; - type Polls = FellowshipReferenda; - type MinRankOfClass = tracks::MinRankOfClass; - type VoteWeight = pallet_ranked_collective::Geometric; -} - -pub type FellowshipCoreInstance = pallet_core_fellowship::Instance1; - -impl pallet_core_fellowship::Config for Runtime { - type WeightInfo = weights::pallet_core_fellowship::WeightInfo; - type RuntimeEvent = RuntimeEvent; - type Members = pallet_ranked_collective::Pallet; - type Balance = Balance; - // Parameters are set by any of: - // - Root; - // - the FellowshipAdmin origin (i.e. token holder referendum); - // - a vote among all Fellows. - type ParamsOrigin = EitherOfDiverse< - EnsureXcm>, - Fellows, - >; - // Induction (creating a candidate) is by any of: - // - Root; - // - the FellowshipAdmin origin (i.e. token holder referendum); - // - a single Fellow; - // - a vote among all Members. - type InductOrigin = EitherOfDiverse< - EnsureXcm>, - EitherOfDiverse< - pallet_ranked_collective::EnsureMember< - Runtime, - FellowshipCollectiveInstance, - { ranks::DAN_3 }, - >, - Members, - >, - >; - // Approval (rank-retention) of a Member's current rank is by any of: - // - Root; - // - the FellowshipAdmin origin (i.e. token holder referendum); - // - a vote by the rank two above the current rank for all retention up to the Master rank. - type ApproveOrigin = EitherOf< - MapSuccess< - EnsureXcm>, - Replace>, - >, - EnsureCanRetainAt, - >; - // Promotion is by any of: - // - Root can promote arbitrarily. - // - the FellowshipAdmin origin (i.e. token holder referendum); - // - a vote by the rank two above the new rank for all promotions up to the Master rank. - type PromoteOrigin = EitherOf< - MapSuccess< - EnsureXcm>, - Replace>, - >, - EnsureCanPromoteTo, - >; - type EvidenceSize = ConstU32<65536>; -} - -pub type FellowshipSalaryInstance = pallet_salary::Instance1; - -use xcm::prelude::*; - -parameter_types! { - pub AssetHub: MultiLocation = (Parent, Parachain(1000)).into(); - pub AssetHubUsdtId: AssetId = (PalletInstance(50), GeneralIndex(1984)).into(); - pub UsdtAsset: LocatableAssetId = LocatableAssetId { - location: AssetHub::get(), - asset_id: AssetHubUsdtId::get(), - }; - // The interior location on AssetHub for the paying account. This is the Fellowship Salary - // pallet instance (which sits at index 64). This sovereign account will need funding. - pub Interior: InteriorMultiLocation = PalletInstance(64).into(); -} - -const USDT_UNITS: u128 = 1_000_000; - -/// [`PayOverXcm`] setup to pay the Fellowship salary on the AssetHub in USDT. -pub type FellowshipSalaryPaymaster = PayOverXcm< - Interior, - crate::xcm_config::XcmRouter, - crate::PolkadotXcm, - ConstU32<{ 6 * HOURS }>, - AccountId, - (), - ConvertToValue, - AliasesIntoAccountId32<(), AccountId>, ->; - -impl pallet_salary::Config for Runtime { - type WeightInfo = weights::pallet_salary::WeightInfo; - type RuntimeEvent = RuntimeEvent; - - #[cfg(not(feature = "runtime-benchmarks"))] - type Paymaster = FellowshipSalaryPaymaster; - #[cfg(feature = "runtime-benchmarks")] - type Paymaster = PayWithEnsure>>; - type Members = pallet_ranked_collective::Pallet; - - #[cfg(not(feature = "runtime-benchmarks"))] - type Salary = pallet_core_fellowship::Pallet; - #[cfg(feature = "runtime-benchmarks")] - type Salary = frame_support::traits::tokens::ConvertRank< - crate::impls::benchmarks::RankToSalary, - >; - // 15 days to register for a salary payment. - type RegistrationPeriod = ConstU32<{ 15 * DAYS }>; - // 15 days to claim the salary payment. - type PayoutPeriod = ConstU32<{ 15 * DAYS }>; - // Total monthly salary budget. - type Budget = ConstU128<{ 100_000 * USDT_UNITS }>; -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/origins.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/origins.rs deleted file mode 100644 index 04663aeecf3b..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/origins.rs +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Fellowship custom origins. - -use super::ranks; -pub use pallet_origins::*; - -#[frame_support::pallet] -pub mod pallet_origins { - use super::ranks; - use frame_support::pallet_prelude::*; - use pallet_ranked_collective::Rank; - - #[pallet::config] - pub trait Config: frame_system::Config {} - - #[pallet::pallet] - pub struct Pallet(_); - - #[derive(PartialEq, Eq, Clone, MaxEncodedLen, Encode, Decode, TypeInfo, RuntimeDebug)] - #[pallet::origin] - pub enum Origin { - /// Origin aggregated through weighted votes of those with rank 1 or above; `Success` is 1. - /// Aka the "voice" of all Members. - Members, - /// Origin aggregated through weighted votes of those with rank 2 or above; `Success` is 2. - /// Aka the "voice" of members at least II Dan. - Fellowship2Dan, - /// Origin aggregated through weighted votes of those with rank 3 or above; `Success` is 3. - /// Aka the "voice" of all Fellows. - Fellows, - /// Origin aggregated through weighted votes of those with rank 4 or above; `Success` is 4. - /// Aka the "voice" of members at least IV Dan. - Architects, - /// Origin aggregated through weighted votes of those with rank 5 or above; `Success` is 5. - /// Aka the "voice" of members at least V Dan. - Fellowship5Dan, - /// Origin aggregated through weighted votes of those with rank 6 or above; `Success` is 6. - /// Aka the "voice" of members at least VI Dan. - Fellowship6Dan, - /// Origin aggregated through weighted votes of those with rank 7 or above; `Success` is 7. - /// Aka the "voice" of all Masters. - Masters, - /// Origin aggregated through weighted votes of those with rank 8 or above; `Success` is 8. - /// Aka the "voice" of members at least VIII Dan. - Fellowship8Dan, - /// Origin aggregated through weighted votes of those with rank 9 or above; `Success` is 9. - /// Aka the "voice" of members at least IX Dan. - Fellowship9Dan, - - /// Origin aggregated through weighted votes of those with rank 3 or above when voting on - /// a fortnight-long track; `Success` is 1. - RetainAt1Dan, - /// Origin aggregated through weighted votes of those with rank 4 or above when voting on - /// a fortnight-long track; `Success` is 2. - RetainAt2Dan, - /// Origin aggregated through weighted votes of those with rank 5 or above when voting on - /// a fortnight-long track; `Success` is 3. - RetainAt3Dan, - /// Origin aggregated through weighted votes of those with rank 6 or above when voting on - /// a fortnight-long track; `Success` is 4. - RetainAt4Dan, - /// Origin aggregated through weighted votes of those with rank 7 or above when voting on - /// a fortnight-long track; `Success` is 5. - RetainAt5Dan, - /// Origin aggregated through weighted votes of those with rank 8 or above when voting on - /// a fortnight-long track; `Success` is 6. - RetainAt6Dan, - - /// Origin aggregated through weighted votes of those with rank 3 or above when voting on - /// a month-long track; `Success` is 1. - PromoteTo1Dan, - /// Origin aggregated through weighted votes of those with rank 4 or above when voting on - /// a month-long track; `Success` is 2. - PromoteTo2Dan, - /// Origin aggregated through weighted votes of those with rank 5 or above when voting on - /// a month-long track; `Success` is 3. - PromoteTo3Dan, - /// Origin aggregated through weighted votes of those with rank 6 or above when voting on - /// a month-long track; `Success` is 4. - PromoteTo4Dan, - /// Origin aggregated through weighted votes of those with rank 7 or above when voting on - /// a month-long track; `Success` is 5. - PromoteTo5Dan, - /// Origin aggregated through weighted votes of those with rank 8 or above when voting on - /// a month-long track; `Success` is 6. - PromoteTo6Dan, - } - - impl Origin { - /// Returns the rank that the origin `self` speaks for, or `None` if it doesn't speak for - /// any. - /// - /// `Some` will be returned only for the first 9 elements of [Origin]. - pub fn as_voice(&self) -> Option { - Some(match &self { - Origin::Members => ranks::DAN_1, - Origin::Fellowship2Dan => ranks::DAN_2, - Origin::Fellows => ranks::DAN_3, - Origin::Architects => ranks::DAN_4, - Origin::Fellowship5Dan => ranks::DAN_5, - Origin::Fellowship6Dan => ranks::DAN_6, - Origin::Masters => ranks::DAN_7, - Origin::Fellowship8Dan => ranks::DAN_8, - Origin::Fellowship9Dan => ranks::DAN_9, - _ => return None, - }) - } - } - - /// A `TryMorph` implementation which is designed to convert an aggregate `RuntimeOrigin` - /// value into the Fellowship voice it represents if it is a Fellowship pallet origin an - /// appropriate variant. See also [Origin::as_voice]. - pub struct ToVoice; - impl<'a, O: 'a + TryInto<&'a Origin>> sp_runtime::traits::TryMorph for ToVoice { - type Outcome = pallet_ranked_collective::Rank; - fn try_morph(o: O) -> Result { - o.try_into().ok().and_then(Origin::as_voice).ok_or(()) - } - } - - macro_rules! decl_unit_ensures { - ( $name:ident: $success_type:ty = $success:expr ) => { - pub struct $name; - impl> + From> - EnsureOrigin for $name - { - type Success = $success_type; - fn try_origin(o: O) -> Result { - o.into().and_then(|o| match o { - Origin::$name => Ok($success), - r => Err(O::from(r)), - }) - } - #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin() -> Result { - Ok(O::from(Origin::$name)) - } - } - }; - ( $name:ident ) => { decl_unit_ensures! { $name : () = () } }; - ( $name:ident: $success_type:ty = $success:expr, $( $rest:tt )* ) => { - decl_unit_ensures! { $name: $success_type = $success } - decl_unit_ensures! { $( $rest )* } - }; - ( $name:ident, $( $rest:tt )* ) => { - decl_unit_ensures! { $name } - decl_unit_ensures! { $( $rest )* } - }; - () => {} - } - decl_unit_ensures!( - Members: Rank = ranks::DAN_1, - Fellows: Rank = ranks::DAN_3, - Architects: Rank = ranks::DAN_4, - Masters: Rank = ranks::DAN_7, - ); - - macro_rules! decl_ensure { - ( - $vis:vis type $name:ident: EnsureOrigin { - $( $item:ident = $success:expr, )* - } - ) => { - $vis struct $name; - impl> + From> - EnsureOrigin for $name - { - type Success = $success_type; - fn try_origin(o: O) -> Result { - o.into().and_then(|o| match o { - $( - Origin::$item => Ok($success), - )* - r => Err(O::from(r)), - }) - } - #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin() -> Result { - // By convention the more privileged origins go later, so for greatest chance - // of success, we want the last one. - let _result: Result = Err(()); - $( - let _result: Result = Ok(O::from(Origin::$item)); - )* - _result - } - } - } - } - - // Fellowship origin indicating weighted voting from at least the rank of `Success` on a - // week-long track. - decl_ensure! { - pub type EnsureFellowship: EnsureOrigin { - Members = ranks::DAN_1, - Fellowship2Dan = ranks::DAN_2, - Fellows = ranks::DAN_3, - Architects = ranks::DAN_4, - Fellowship5Dan = ranks::DAN_5, - Fellowship6Dan = ranks::DAN_6, - Masters = ranks::DAN_7, - Fellowship8Dan = ranks::DAN_8, - Fellowship9Dan = ranks::DAN_9, - } - } - - // Fellowship origin indicating weighted voting from at least the rank of `Success + 2` on - // a fortnight-long track; needed for Fellowship retention voting. - decl_ensure! { - pub type EnsureCanRetainAt: EnsureOrigin { - RetainAt1Dan = ranks::DAN_1, - RetainAt2Dan = ranks::DAN_2, - RetainAt3Dan = ranks::DAN_3, - RetainAt4Dan = ranks::DAN_4, - RetainAt5Dan = ranks::DAN_5, - RetainAt6Dan = ranks::DAN_6, - } - } - - // Fellowship origin indicating weighted voting from at least the rank of `Success + 2` on - // a month-long track; needed for Fellowship promotion voting. - decl_ensure! { - pub type EnsureCanPromoteTo: EnsureOrigin { - PromoteTo1Dan = ranks::DAN_1, - PromoteTo2Dan = ranks::DAN_2, - PromoteTo3Dan = ranks::DAN_3, - PromoteTo4Dan = ranks::DAN_4, - PromoteTo5Dan = ranks::DAN_5, - PromoteTo6Dan = ranks::DAN_6, - } - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs deleted file mode 100644 index fc53efdd7e8c..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/fellowship/tracks.rs +++ /dev/null @@ -1,532 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Track configurations for Fellowship. - -use crate::{Balance, BlockNumber, RuntimeOrigin, DAYS, DOLLARS, HOURS, MINUTES}; -use pallet_ranked_collective::Rank; -use sp_runtime::{traits::Convert, Perbill}; - -/// Referendum `TrackId` type. -pub type TrackId = u16; - -/// Referendum track IDs. -pub mod constants { - use super::TrackId; - - // Regular tracks (7 days) used for general operations. The required rank for voting is the - // same as that which is named (and also the track ID). - pub const MEMBERS: TrackId = 1; - pub const PROFICIENTS: TrackId = 2; - pub const FELLOWS: TrackId = 3; - pub const ARCHITECTS: TrackId = 4; - pub const ARCHITECTS_ADEPT: TrackId = 5; - pub const GRAND_ARCHITECTS: TrackId = 6; - pub const MASTERS: TrackId = 7; - pub const MASTERS_CONSTANT: TrackId = 8; - pub const GRAND_MASTERS: TrackId = 9; - - // Longer tracks (14 days) used for rank retention. These require a rank of two more than the - // grade at which they retain (as per the whitepaper). This works out as the track ID minus 8. - pub const RETAIN_AT_1DAN: TrackId = 11; - pub const RETAIN_AT_2DAN: TrackId = 12; - pub const RETAIN_AT_3DAN: TrackId = 13; - pub const RETAIN_AT_4DAN: TrackId = 14; - pub const RETAIN_AT_5DAN: TrackId = 15; - pub const RETAIN_AT_6DAN: TrackId = 16; - - // Longest tracks (30 days) used for promotions. These require a rank of two more than the - // grade to which they promote (as per the whitepaper). This works out as the track ID minus 18. - pub const PROMOTE_TO_1DAN: TrackId = 21; - pub const PROMOTE_TO_2DAN: TrackId = 22; - pub const PROMOTE_TO_3DAN: TrackId = 23; - pub const PROMOTE_TO_4DAN: TrackId = 24; - pub const PROMOTE_TO_5DAN: TrackId = 25; - pub const PROMOTE_TO_6DAN: TrackId = 26; -} - -/// Convert the track ID (defined above) into the minimum rank (i.e. fellowship Dan grade) required -/// to vote on the track. -pub struct MinRankOfClass; -impl Convert for MinRankOfClass { - fn convert(a: TrackId) -> Rank { - match a { - // Just a regular vote: the track ID is conveniently the same as the minimum rank. - regular @ 1..=9 => regular, - // A retention vote; the track ID turns out to be 8 more than the minimum required rank. - retention @ 11..=16 => retention - 8, - // A promotion vote; the track ID turns out to be 18 more than the minimum required - // rank. - promotion @ 21..=26 => promotion - 18, - _ => Rank::max_value(), - } - } -} - -const RETAIN_MAX_DECIDING: u32 = 25; -const RETAIN_DECISION_DEPOSIT: Balance = 5 * DOLLARS; -const RETAIN_PREPARE_PERIOD: BlockNumber = 0; -const RETAIN_DECISION_PERIOD: BlockNumber = 14 * DAYS; -const RETAIN_CONFIRM_PERIOD: BlockNumber = 1 * HOURS; -const RETAIN_MIN_ENACTMENT_PERIOD: BlockNumber = 0; -const RETAIN_MIN_APPROVAL: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(60), - ceil: Perbill::from_percent(100), -}; -const RETAIN_MIN_SUPPORT: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(10), - ceil: Perbill::from_percent(100), -}; - -const PROMOTE_MAX_DECIDING: u32 = 10; -const PROMOTE_DECISION_DEPOSIT: Balance = 5 * DOLLARS; -const PROMOTE_PREPARE_PERIOD: BlockNumber = 0; -const PROMOTE_DECISION_PERIOD: BlockNumber = 30 * DAYS; -const PROMOTE_CONFIRM_PERIOD: BlockNumber = 1 * HOURS; -const PROMOTE_MIN_ENACTMENT_PERIOD: BlockNumber = 0; -const PROMOTE_MIN_APPROVAL: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(60), - ceil: Perbill::from_percent(100), -}; -const PROMOTE_MIN_SUPPORT: pallet_referenda::Curve = pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(10), - ceil: Perbill::from_percent(100), -}; - -pub struct TracksInfo; -impl pallet_referenda::TracksInfo for TracksInfo { - type Id = TrackId; - type RuntimeOrigin = ::PalletsOrigin; - fn tracks() -> &'static [(Self::Id, pallet_referenda::TrackInfo)] { - use constants as tracks; - static DATA: [(TrackId, pallet_referenda::TrackInfo); 21] = [ - ( - tracks::MEMBERS, - pallet_referenda::TrackInfo { - name: "members", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::PROFICIENTS, - pallet_referenda::TrackInfo { - name: "proficient members", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::FELLOWS, - pallet_referenda::TrackInfo { - name: "fellows", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::ARCHITECTS, - pallet_referenda::TrackInfo { - name: "architects", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::ARCHITECTS_ADEPT, - pallet_referenda::TrackInfo { - name: "architects adept", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::GRAND_ARCHITECTS, - pallet_referenda::TrackInfo { - name: "grand architects", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::MASTERS, - pallet_referenda::TrackInfo { - name: "masters", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::MASTERS_CONSTANT, - pallet_referenda::TrackInfo { - name: "masters constant", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::GRAND_MASTERS, - pallet_referenda::TrackInfo { - name: "grand masters", - max_deciding: 10, - decision_deposit: 5 * DOLLARS, - prepare_period: 30 * MINUTES, - decision_period: 7 * DAYS, - confirm_period: 30 * MINUTES, - min_enactment_period: 5 * MINUTES, - min_approval: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(50), - ceil: Perbill::from_percent(100), - }, - min_support: pallet_referenda::Curve::LinearDecreasing { - length: Perbill::from_percent(100), - floor: Perbill::from_percent(0), - ceil: Perbill::from_percent(100), - }, - }, - ), - ( - tracks::RETAIN_AT_1DAN, - pallet_referenda::TrackInfo { - name: "retain at I Dan", - max_deciding: RETAIN_MAX_DECIDING, - decision_deposit: RETAIN_DECISION_DEPOSIT, - prepare_period: RETAIN_PREPARE_PERIOD, - decision_period: RETAIN_DECISION_PERIOD, - confirm_period: RETAIN_CONFIRM_PERIOD, - min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, - min_approval: RETAIN_MIN_APPROVAL, - min_support: RETAIN_MIN_SUPPORT, - }, - ), - ( - tracks::RETAIN_AT_2DAN, - pallet_referenda::TrackInfo { - name: "retain at II Dan", - max_deciding: RETAIN_MAX_DECIDING, - decision_deposit: RETAIN_DECISION_DEPOSIT, - prepare_period: RETAIN_PREPARE_PERIOD, - decision_period: RETAIN_DECISION_PERIOD, - confirm_period: RETAIN_CONFIRM_PERIOD, - min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, - min_approval: RETAIN_MIN_APPROVAL, - min_support: RETAIN_MIN_SUPPORT, - }, - ), - ( - tracks::RETAIN_AT_3DAN, - pallet_referenda::TrackInfo { - name: "retain at III Dan", - max_deciding: RETAIN_MAX_DECIDING, - decision_deposit: RETAIN_DECISION_DEPOSIT, - prepare_period: RETAIN_PREPARE_PERIOD, - decision_period: RETAIN_DECISION_PERIOD, - confirm_period: RETAIN_CONFIRM_PERIOD, - min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, - min_approval: RETAIN_MIN_APPROVAL, - min_support: RETAIN_MIN_SUPPORT, - }, - ), - ( - tracks::RETAIN_AT_4DAN, - pallet_referenda::TrackInfo { - name: "retain at IV Dan", - max_deciding: RETAIN_MAX_DECIDING, - decision_deposit: RETAIN_DECISION_DEPOSIT, - prepare_period: RETAIN_PREPARE_PERIOD, - decision_period: RETAIN_DECISION_PERIOD, - confirm_period: RETAIN_CONFIRM_PERIOD, - min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, - min_approval: RETAIN_MIN_APPROVAL, - min_support: RETAIN_MIN_SUPPORT, - }, - ), - ( - tracks::RETAIN_AT_5DAN, - pallet_referenda::TrackInfo { - name: "retain at V Dan", - max_deciding: RETAIN_MAX_DECIDING, - decision_deposit: RETAIN_DECISION_DEPOSIT, - prepare_period: RETAIN_PREPARE_PERIOD, - decision_period: RETAIN_DECISION_PERIOD, - confirm_period: RETAIN_CONFIRM_PERIOD, - min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, - min_approval: RETAIN_MIN_APPROVAL, - min_support: RETAIN_MIN_SUPPORT, - }, - ), - ( - tracks::RETAIN_AT_6DAN, - pallet_referenda::TrackInfo { - name: "retain at VI Dan", - max_deciding: RETAIN_MAX_DECIDING, - decision_deposit: RETAIN_DECISION_DEPOSIT, - prepare_period: RETAIN_PREPARE_PERIOD, - decision_period: RETAIN_DECISION_PERIOD, - confirm_period: RETAIN_CONFIRM_PERIOD, - min_enactment_period: RETAIN_MIN_ENACTMENT_PERIOD, - min_approval: RETAIN_MIN_APPROVAL, - min_support: RETAIN_MIN_SUPPORT, - }, - ), - ( - tracks::PROMOTE_TO_1DAN, - pallet_referenda::TrackInfo { - name: "promote to I Dan", - max_deciding: PROMOTE_MAX_DECIDING, - decision_deposit: PROMOTE_DECISION_DEPOSIT, - prepare_period: PROMOTE_PREPARE_PERIOD, - decision_period: PROMOTE_DECISION_PERIOD, - confirm_period: PROMOTE_CONFIRM_PERIOD, - min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, - min_approval: PROMOTE_MIN_APPROVAL, - min_support: PROMOTE_MIN_SUPPORT, - }, - ), - ( - tracks::PROMOTE_TO_2DAN, - pallet_referenda::TrackInfo { - name: "promote to II Dan", - max_deciding: PROMOTE_MAX_DECIDING, - decision_deposit: PROMOTE_DECISION_DEPOSIT, - prepare_period: PROMOTE_PREPARE_PERIOD, - decision_period: PROMOTE_DECISION_PERIOD, - confirm_period: PROMOTE_CONFIRM_PERIOD, - min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, - min_approval: PROMOTE_MIN_APPROVAL, - min_support: PROMOTE_MIN_SUPPORT, - }, - ), - ( - tracks::PROMOTE_TO_3DAN, - pallet_referenda::TrackInfo { - name: "promote to III Dan", - max_deciding: PROMOTE_MAX_DECIDING, - decision_deposit: PROMOTE_DECISION_DEPOSIT, - prepare_period: PROMOTE_PREPARE_PERIOD, - decision_period: PROMOTE_DECISION_PERIOD, - confirm_period: PROMOTE_CONFIRM_PERIOD, - min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, - min_approval: PROMOTE_MIN_APPROVAL, - min_support: PROMOTE_MIN_SUPPORT, - }, - ), - ( - tracks::PROMOTE_TO_4DAN, - pallet_referenda::TrackInfo { - name: "promote to IV Dan", - max_deciding: PROMOTE_MAX_DECIDING, - decision_deposit: PROMOTE_DECISION_DEPOSIT, - prepare_period: PROMOTE_PREPARE_PERIOD, - decision_period: PROMOTE_DECISION_PERIOD, - confirm_period: PROMOTE_CONFIRM_PERIOD, - min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, - min_approval: PROMOTE_MIN_APPROVAL, - min_support: PROMOTE_MIN_SUPPORT, - }, - ), - ( - tracks::PROMOTE_TO_5DAN, - pallet_referenda::TrackInfo { - name: "promote to V Dan", - max_deciding: PROMOTE_MAX_DECIDING, - decision_deposit: PROMOTE_DECISION_DEPOSIT, - prepare_period: PROMOTE_PREPARE_PERIOD, - decision_period: PROMOTE_DECISION_PERIOD, - confirm_period: PROMOTE_CONFIRM_PERIOD, - min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, - min_approval: PROMOTE_MIN_APPROVAL, - min_support: PROMOTE_MIN_SUPPORT, - }, - ), - ( - tracks::PROMOTE_TO_6DAN, - pallet_referenda::TrackInfo { - name: "promote to VI Dan", - max_deciding: PROMOTE_MAX_DECIDING, - decision_deposit: PROMOTE_DECISION_DEPOSIT, - prepare_period: PROMOTE_PREPARE_PERIOD, - decision_period: PROMOTE_DECISION_PERIOD, - confirm_period: PROMOTE_CONFIRM_PERIOD, - min_enactment_period: PROMOTE_MIN_ENACTMENT_PERIOD, - min_approval: PROMOTE_MIN_APPROVAL, - min_support: PROMOTE_MIN_SUPPORT, - }, - ), - ]; - &DATA[..] - } - fn track_for(id: &Self::RuntimeOrigin) -> Result { - use super::origins::Origin; - use constants as tracks; - - #[cfg(feature = "runtime-benchmarks")] - { - // For benchmarks, we enable a root origin. - // It is important that this is not available in production! - let root: Self::RuntimeOrigin = frame_system::RawOrigin::Root.into(); - if &root == id { - return Ok(tracks::GRAND_MASTERS) - } - } - - match Origin::try_from(id.clone()) { - Ok(Origin::Members) => Ok(tracks::MEMBERS), - Ok(Origin::Fellowship2Dan) => Ok(tracks::PROFICIENTS), - Ok(Origin::Fellows) => Ok(tracks::FELLOWS), - Ok(Origin::Architects) => Ok(tracks::ARCHITECTS), - Ok(Origin::Fellowship5Dan) => Ok(tracks::ARCHITECTS_ADEPT), - Ok(Origin::Fellowship6Dan) => Ok(tracks::GRAND_ARCHITECTS), - Ok(Origin::Masters) => Ok(tracks::MASTERS), - Ok(Origin::Fellowship8Dan) => Ok(tracks::MASTERS_CONSTANT), - Ok(Origin::Fellowship9Dan) => Ok(tracks::GRAND_MASTERS), - - Ok(Origin::RetainAt1Dan) => Ok(tracks::RETAIN_AT_1DAN), - Ok(Origin::RetainAt2Dan) => Ok(tracks::RETAIN_AT_2DAN), - Ok(Origin::RetainAt3Dan) => Ok(tracks::RETAIN_AT_3DAN), - Ok(Origin::RetainAt4Dan) => Ok(tracks::RETAIN_AT_4DAN), - Ok(Origin::RetainAt5Dan) => Ok(tracks::RETAIN_AT_5DAN), - Ok(Origin::RetainAt6Dan) => Ok(tracks::RETAIN_AT_6DAN), - - Ok(Origin::PromoteTo1Dan) => Ok(tracks::PROMOTE_TO_1DAN), - Ok(Origin::PromoteTo2Dan) => Ok(tracks::PROMOTE_TO_2DAN), - Ok(Origin::PromoteTo3Dan) => Ok(tracks::PROMOTE_TO_3DAN), - Ok(Origin::PromoteTo4Dan) => Ok(tracks::PROMOTE_TO_4DAN), - Ok(Origin::PromoteTo5Dan) => Ok(tracks::PROMOTE_TO_5DAN), - Ok(Origin::PromoteTo6Dan) => Ok(tracks::PROMOTE_TO_6DAN), - - _ => Err(()), - } - } -} -pallet_referenda::impl_tracksinfo_get!(TracksInfo, Balance, BlockNumber); diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs deleted file mode 100644 index df2bf8c168ba..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/impls.rs +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::OriginCaller; -use frame_support::{ - dispatch::{DispatchError, DispatchResultWithPostInfo}, - log, - traits::{Currency, Get, Imbalance, OnUnbalanced, OriginTrait, PrivilegeCmp}, - weights::Weight, -}; -use pallet_alliance::{ProposalIndex, ProposalProvider}; -use parachains_common::impls::NegativeImbalance; -use sp_std::{cmp::Ordering, marker::PhantomData, prelude::*}; -use xcm::latest::{Fungibility, Junction, Parent}; - -type AccountIdOf = ::AccountId; - -type ProposalOf = >::Proposal; - -type HashOf = ::Hash; - -/// Type alias to conveniently refer to the `Currency::Balance` associated type. -pub type BalanceOf = - as Currency<::AccountId>>::Balance; - -/// Implements `OnUnbalanced::on_unbalanced` to teleport slashed assets to relay chain treasury -/// account. -pub struct ToParentTreasury( - PhantomData<(TreasuryAccount, PalletAccount, T)>, -); - -impl OnUnbalanced> - for ToParentTreasury -where - T: pallet_balances::Config + pallet_xcm::Config + frame_system::Config, - <::RuntimeOrigin as OriginTrait>::AccountId: From>, - [u8; 32]: From<::AccountId>, - TreasuryAccount: Get>, - PalletAccount: Get>, - BalanceOf: Into, -{ - fn on_unbalanced(amount: NegativeImbalance) { - let amount = match amount.drop_zero() { - Ok(..) => return, - Err(amount) => amount, - }; - let imbalance = amount.peek(); - let pallet_acc: AccountIdOf = PalletAccount::get(); - let treasury_acc: AccountIdOf = TreasuryAccount::get(); - - >::resolve_creating(&pallet_acc, amount); - - let result = >::teleport_assets( - <::RuntimeOrigin>::signed(pallet_acc.into()), - Box::new(Parent.into()), - Box::new( - Junction::AccountId32 { network: None, id: treasury_acc.into() } - .into_location() - .into(), - ), - Box::new((Parent, imbalance).into()), - 0, - ); - - if let Err(err) = result { - log::warn!("Failed to teleport slashed assets: {:?}", err); - } - } -} - -/// Proposal provider for alliance pallet. -/// Adapter from collective pallet to alliance proposal provider trait. -pub struct AllianceProposalProvider(PhantomData<(T, I)>); - -impl ProposalProvider, HashOf, ProposalOf> - for AllianceProposalProvider -where - T: pallet_collective::Config + frame_system::Config, - I: 'static, -{ - fn propose_proposal( - who: AccountIdOf, - threshold: u32, - proposal: Box>, - length_bound: u32, - ) -> Result<(u32, u32), DispatchError> { - pallet_collective::Pallet::::do_propose_proposed( - who, - threshold, - proposal, - length_bound, - ) - } - - fn vote_proposal( - who: AccountIdOf, - proposal: HashOf, - index: ProposalIndex, - approve: bool, - ) -> Result { - pallet_collective::Pallet::::do_vote(who, proposal, index, approve) - } - - fn close_proposal( - proposal_hash: HashOf, - proposal_index: ProposalIndex, - proposal_weight_bound: Weight, - length_bound: u32, - ) -> DispatchResultWithPostInfo { - pallet_collective::Pallet::::do_close( - proposal_hash, - proposal_index, - proposal_weight_bound, - length_bound, - ) - } - - fn proposal_of(proposal_hash: HashOf) -> Option> { - pallet_collective::Pallet::::proposal_of(proposal_hash) - } -} - -/// Used to compare the privilege of an origin inside the scheduler. -pub struct EqualOrGreatestRootCmp; - -impl PrivilegeCmp for EqualOrGreatestRootCmp { - fn cmp_privilege(left: &OriginCaller, right: &OriginCaller) -> Option { - if left == right { - return Some(Ordering::Equal) - } - match (left, right) { - // Root is greater than anything. - (OriginCaller::system(frame_system::RawOrigin::Root), _) => Some(Ordering::Greater), - _ => None, - } - } -} - -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmarks { - use super::*; - use crate::ParachainSystem; - use cumulus_primitives_core::{ChannelStatus, GetChannelInfo}; - use frame_support::traits::{ - fungible, - tokens::{Pay, PaymentStatus}, - }; - use pallet_ranked_collective::Rank; - use parachains_common::{AccountId, Balance}; - use sp_runtime::traits::Convert; - - /// Rank to salary conversion helper type. - pub struct RankToSalary(PhantomData); - impl Convert for RankToSalary - where - Fungible: fungible::Inspect, - { - fn convert(r: Rank) -> Balance { - Balance::from(r).saturating_mul(Fungible::minimum_balance()) - } - } - - /// Trait for setting up any prerequisites for successful execution of benchmarks. - pub trait EnsureSuccessful { - fn ensure_successful(); - } - - /// Implementation of the [`EnsureSuccessful`] trait which opens an HRMP channel between - /// the Collectives and a parachain with a given ID. - pub struct OpenHrmpChannel(PhantomData); - impl> EnsureSuccessful for OpenHrmpChannel { - fn ensure_successful() { - if let ChannelStatus::Closed = ParachainSystem::get_channel_status(I::get().into()) { - ParachainSystem::open_outbound_hrmp_channel_for_benchmarks(I::get().into()) - } - } - } - - /// Type that wraps a type implementing the [`Pay`] trait to decorate its - /// [`Pay::ensure_successful`] function with a provided implementation of the - /// [`EnsureSuccessful`] trait. - pub struct PayWithEnsure(PhantomData<(O, E)>); - impl Pay for PayWithEnsure - where - O: Pay, - E: EnsureSuccessful, - { - type AssetKind = O::AssetKind; - type Balance = O::Balance; - type Beneficiary = O::Beneficiary; - type Error = O::Error; - type Id = O::Id; - - fn pay( - who: &Self::Beneficiary, - asset_kind: Self::AssetKind, - amount: Self::Balance, - ) -> Result { - O::pay(who, asset_kind, amount) - } - fn check_payment(id: Self::Id) -> PaymentStatus { - O::check_payment(id) - } - fn ensure_successful( - who: &Self::Beneficiary, - asset_kind: Self::AssetKind, - amount: Self::Balance, - ) { - E::ensure_successful(); - O::ensure_successful(who, asset_kind, amount) - } - fn ensure_concluded(id: Self::Id) { - O::ensure_concluded(id) - } - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs deleted file mode 100644 index 4ab8fe858452..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/lib.rs +++ /dev/null @@ -1,924 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Collectives Parachain -//! -//! This parachain is for collectives that serve the Polkadot network. -//! Each collective is defined by a specialized (possibly instanced) pallet. -//! -//! ### Governance -//! -//! As a common good parachain, Collectives defers its governance (namely, its `Root` origin), to -//! its Relay Chain parent, Polkadot. -//! -//! ### Collator Selection -//! -//! Collectives uses `pallet-collator-selection`, a simple first-come-first-served registration -//! system where collators can reserve a small bond to join the block producer set. There is no -//! slashing. Collective members are generally expected to run collators. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod constants; -pub mod impls; -mod weights; -pub mod xcm_config; -// Fellowship configurations. -pub mod fellowship; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use fellowship::{ - migration::import_kusama_fellowship, pallet_fellowship_origins, Fellows, - FellowshipCollectiveInstance, -}; -use impls::{AllianceProposalProvider, EqualOrGreatestRootCmp, ToParentTreasury}; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdConversion, AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, Perbill, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use codec::{Decode, Encode, MaxEncodedLen}; -use constants::{currency::*, fee::WeightToFee}; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ConstBool, ConstU16, ConstU32, ConstU64, ConstU8, EitherOfDiverse, InstanceFilter}, - weights::{ConstantMultiplier, Weight}, - PalletId, RuntimeDebug, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -pub use parachains_common as common; -use parachains_common::{ - impls::DealWithFees, AccountId, AuraId, Balance, BlockNumber, Hash, Header, Nonce, Signature, - AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, MINUTES, NORMAL_DISPATCH_RATIO, - SLOT_DURATION, -}; -use xcm_config::{GovernanceLocation, XcmConfig, XcmOriginToTransactDispatchOrigin}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::BodyId; -use xcm_executor::XcmExecutor; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("collectives"), - impl_name: create_runtime_str!("collectives"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 5, - state_version: 0, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -/// Privileged origin that represents Root or more than two thirds of the Alliance. -pub type RootOrAllianceTwoThirdsMajority = EitherOfDiverse< - EnsureRoot, - pallet_collective::EnsureProportionMoreThan, ->; - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); -} - -// Configure FRAME pallets to include in runtime. -impl frame_system::Config for Runtime { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type AccountId = AccountId; - type RuntimeCall = RuntimeCall; - type Lookup = AccountIdLookup; - type Nonce = Nonce; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type BlockHashCount = BlockHashCount; - type DbWeight = RocksDbWeight; - type Version = Version; - type PalletInfo = PalletInfo; - type OnNewAccount = (); - type OnKilledAccount = (); - type AccountData = pallet_balances::AccountData; - type SystemWeightInfo = weights::frame_system::WeightInfo; - type SS58Prefix = ConstU16<0>; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = ConstU32<100>; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -parameter_types! { - // One storage item; key size 32, value size 8; . - pub const ProxyDepositBase: Balance = deposit(1, 40); - // Additional storage item size of 33 bytes. - pub const ProxyDepositFactor: Balance = deposit(0, 33); - // One storage item; key size 32, value size 16 - pub const AnnouncementDepositBase: Balance = deposit(1, 48); - pub const AnnouncementDepositFactor: Balance = deposit(0, 66); -} - -/// The type used to represent the kinds of proxying allowed. -#[derive( - Copy, - Clone, - Eq, - PartialEq, - Ord, - PartialOrd, - Encode, - Decode, - RuntimeDebug, - MaxEncodedLen, - scale_info::TypeInfo, -)] -pub enum ProxyType { - /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. - Any, - /// Can execute any call that does not transfer funds. - NonTransfer, - /// Proxy with the ability to reject time-delay proxy announcements. - CancelProxy, - /// Collator selection proxy. Can execute calls related to collator selection mechanism. - Collator, - /// Alliance proxy. Allows calls related to the Alliance. - Alliance, - /// Fellowship proxy. Allows calls related to the Fellowship. - Fellowship, -} -impl Default for ProxyType { - fn default() -> Self { - Self::Any - } -} -impl InstanceFilter for ProxyType { - fn filter(&self, c: &RuntimeCall) -> bool { - match self { - ProxyType::Any => true, - ProxyType::NonTransfer => !matches!(c, RuntimeCall::Balances { .. }), - ProxyType::CancelProxy => matches!( - c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Collator => matches!( - c, - RuntimeCall::CollatorSelection { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Alliance => matches!( - c, - RuntimeCall::AllianceMotion { .. } | - RuntimeCall::Alliance { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Fellowship => matches!( - c, - RuntimeCall::FellowshipCollective { .. } | - RuntimeCall::FellowshipReferenda { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - } - } - fn is_superset(&self, o: &Self) -> bool { - match (self, o) { - (x, y) if x == y => true, - (ProxyType::Any, _) => true, - (_, ProxyType::Any) => false, - (ProxyType::NonTransfer, _) => true, - _ => false, - } - } -} - -impl pallet_proxy::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type ProxyType = ProxyType; - type ProxyDepositBase = ProxyDepositBase; - type ProxyDepositFactor = ProxyDepositFactor; - type MaxProxies = ConstU32<32>; - type WeightInfo = weights::pallet_proxy::WeightInfo; - type MaxPending = ConstU32<32>; - type CallHasher = BlakeTwo256; - type AnnouncementDepositBase = AnnouncementDepositBase; - type AnnouncementDepositFactor = AnnouncementDepositFactor; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type OutboundXcmpMessageSource = XcmpQueue; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EitherOfDiverse, Fellows>; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -pub const PERIOD: u32 = 6 * HOURS; -pub const OFFSET: u32 = 0; - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; - type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // `StakingAdmin` pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow root and the `StakingAdmin` to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = ConstU32; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -pub const ALLIANCE_MOTION_DURATION: BlockNumber = 5 * DAYS; - -parameter_types! { - pub const AllianceMotionDuration: BlockNumber = ALLIANCE_MOTION_DURATION; - pub MaxProposalWeight: Weight = Perbill::from_percent(50) * RuntimeBlockWeights::get().max_block; -} -pub const ALLIANCE_MAX_PROPOSALS: u32 = 100; -pub const ALLIANCE_MAX_MEMBERS: u32 = 100; - -type AllianceCollective = pallet_collective::Instance1; -impl pallet_collective::Config for Runtime { - type RuntimeOrigin = RuntimeOrigin; - type Proposal = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type MotionDuration = AllianceMotionDuration; - type MaxProposals = ConstU32; - type MaxMembers = ConstU32; - type DefaultVote = pallet_collective::MoreThanMajorityThenPrimeDefaultVote; - type SetMembersOrigin = EnsureRoot; - type WeightInfo = weights::pallet_collective::WeightInfo; - type MaxProposalWeight = MaxProposalWeight; -} - -pub const MAX_FELLOWS: u32 = ALLIANCE_MAX_MEMBERS; -pub const MAX_ALLIES: u32 = 100; - -parameter_types! { - pub const AllyDeposit: Balance = 1_000 * UNITS; // 1,000 DOT bond to join as an Ally - // The Alliance pallet account, used as a temporary place to deposit a slashed imbalance - // before the teleport to the Treasury. - pub AlliancePalletAccount: AccountId = constants::account::ALLIANCE_PALLET_ID.into_account_truncating(); - pub PolkadotTreasuryAccount: AccountId = constants::account::POLKADOT_TREASURY_PALLET_ID.into_account_truncating(); - // The number of blocks a member must wait between giving a retirement notice and retiring. - // Supposed to be greater than time required to `kick_member` with alliance motion. - pub const AllianceRetirementPeriod: BlockNumber = (90 * DAYS) + ALLIANCE_MOTION_DURATION; -} - -impl pallet_alliance::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Proposal = RuntimeCall; - type AdminOrigin = RootOrAllianceTwoThirdsMajority; - type MembershipManager = RootOrAllianceTwoThirdsMajority; - type AnnouncementOrigin = RootOrAllianceTwoThirdsMajority; - type Currency = Balances; - type Slashed = ToParentTreasury; - type InitializeMembers = AllianceMotion; - type MembershipChanged = AllianceMotion; - type RetirementPeriod = AllianceRetirementPeriod; - type IdentityVerifier = (); // Don't block accounts on identity criteria - type ProposalProvider = AllianceProposalProvider; - type MaxProposals = ConstU32; - type MaxFellows = ConstU32; - type MaxAllies = ConstU32; - type MaxUnscrupulousItems = ConstU32<100>; - type MaxWebsiteUrlLength = ConstU32<255>; - type MaxAnnouncementsCount = ConstU32<100>; - type MaxMembersCount = ConstU32; - type AllyDeposit = AllyDeposit; - type WeightInfo = weights::pallet_alliance::WeightInfo; -} - -parameter_types! { - pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * RuntimeBlockWeights::get().max_block; -} - -#[cfg(not(feature = "runtime-benchmarks"))] -parameter_types! { - pub const MaxScheduledPerBlock: u32 = 50; -} - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub const MaxScheduledPerBlock: u32 = 200; -} - -impl pallet_scheduler::Config for Runtime { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeEvent = RuntimeEvent; - type PalletsOrigin = OriginCaller; - type RuntimeCall = RuntimeCall; - type MaximumWeight = MaximumSchedulerWeight; - type ScheduleOrigin = EnsureRoot; - type MaxScheduledPerBlock = MaxScheduledPerBlock; - type WeightInfo = weights::pallet_scheduler::WeightInfo; - type OriginPrivilegeCmp = EqualOrGreatestRootCmp; - type Preimages = Preimage; -} - -parameter_types! { - pub const PreimageBaseDeposit: Balance = deposit(2, 64); - pub const PreimageByteDeposit: Balance = deposit(0, 1); -} - -impl pallet_preimage::Config for Runtime { - type WeightInfo = weights::pallet_preimage::WeightInfo; - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type ManagerOrigin = EnsureRoot; - type BaseDeposit = PreimageBaseDeposit; - type ByteDeposit = PreimageByteDeposit; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - - // Collator support. the order of these 5 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, - Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, - Preimage: pallet_preimage::{Pallet, Call, Storage, Event} = 43, - Scheduler: pallet_scheduler::{Pallet, Call, Storage, Event} = 44, - - // The main stage. - - // The Alliance. - Alliance: pallet_alliance::{Pallet, Call, Storage, Event, Config} = 50, - AllianceMotion: pallet_collective::::{Pallet, Call, Storage, Origin, Event, Config} = 51, - - // The Fellowship. - // pub type FellowshipCollectiveInstance = pallet_ranked_collective::Instance1; - FellowshipCollective: pallet_ranked_collective::::{Pallet, Call, Storage, Event} = 60, - // pub type FellowshipReferendaInstance = pallet_referenda::Instance1; - FellowshipReferenda: pallet_referenda::::{Pallet, Call, Storage, Event} = 61, - FellowshipOrigins: pallet_fellowship_origins::{Origin} = 62, - // pub type FellowshipCoreInstance = pallet_core_fellowship::Instance1; - FellowshipCore: pallet_core_fellowship::::{Pallet, Call, Storage, Event} = 63, - // pub type FellowshipSalaryInstance = pallet_salary::Instance1; - FellowshipSalary: pallet_salary::::{Pallet, Call, Storage, Event} = 64, - } -); - -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// All migrations executed on runtime upgrade as a nested tuple of types implementing -/// `OnRuntimeUpgrade`. Included migrations must be idempotent. -type Migrations = ( - // v9420 - import_kusama_fellowship::Migration, - // unreleased - pallet_collator_selection::migration::v1::MigrateToV1, -); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_proxy, Proxy] - [pallet_session, SessionBench::] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - [pallet_alliance, Alliance] - [pallet_collective, AllianceMotion] - [pallet_xcm, PolkadotXcm] - [pallet_preimage, Preimage] - [pallet_scheduler, Scheduler] - [pallet_referenda, FellowshipReferenda] - [pallet_ranked_collective, FellowshipCollective] - [pallet_core_fellowship, FellowshipCore] - [pallet_salary, FellowshipSalary] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError, TrackedStorageKey}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/block_weights.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs deleted file mode 100644 index 28e1cd902b50..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/cumulus_pallet_xcmp_queue.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `cumulus_pallet_xcmp_queue` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=cumulus_pallet_xcmp_queue -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `cumulus_pallet_xcmp_queue`. -pub struct WeightInfo(PhantomData); -impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_u32() -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `1627` - // Minimum execution time: 5_136_000 picoseconds. - Weight::from_parts(5_399_000, 0) - .saturating_add(Weight::from_parts(0, 1627)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) - /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_config_with_weight() -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `1627` - // Minimum execution time: 5_056_000 picoseconds. - Weight::from_parts(5_301_000, 0) - .saturating_add(Weight::from_parts(0, 1627)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs deleted file mode 100644 index 75cc6580a39d..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 1_926_000 picoseconds. - Weight::from_parts(1_929_666, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(387, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_221_000 picoseconds. - Weight::from_parts(34_449_539, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_706, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_681_000 picoseconds. - Weight::from_parts(3_857_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `156` - // Estimated: `1641` - // Minimum execution time: 101_899_621_000 picoseconds. - Weight::from_parts(106_377_672_000, 0) - .saturating_add(Weight::from_parts(0, 1641)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_039_000 picoseconds. - Weight::from_parts(2_094_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2_124 - .saturating_add(Weight::from_parts(754_465, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_103_000 picoseconds. - Weight::from_parts(2_182_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_031 - .saturating_add(Weight::from_parts(570_563, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `82 + p * (69 ±0)` - // Estimated: `78 + p * (70 ±0)` - // Minimum execution time: 3_728_000 picoseconds. - Weight::from_parts(3_836_000, 0) - .saturating_add(Weight::from_parts(0, 78)) - // Standard Error: 1_802 - .saturating_add(Weight::from_parts(1_199_345, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/mod.rs deleted file mode 100644 index b0e495499142..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub mod block_weights; -pub mod cumulus_pallet_xcmp_queue; -pub mod extrinsic_weights; -pub mod frame_system; -pub mod pallet_alliance; -pub mod pallet_balances; -pub mod pallet_collator_selection; -pub mod pallet_collective; -pub mod pallet_core_fellowship; -pub mod pallet_multisig; -pub mod pallet_preimage; -pub mod pallet_proxy; -pub mod pallet_ranked_collective; -pub mod pallet_referenda; -pub mod pallet_salary; -pub mod pallet_scheduler; -pub mod pallet_session; -pub mod pallet_timestamp; -pub mod pallet_utility; -pub mod pallet_xcm; -pub mod paritydb_weights; -pub mod rocksdb_weights; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs deleted file mode 100644 index c822a0c85cd8..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_alliance.rs +++ /dev/null @@ -1,495 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_alliance` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_alliance -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_alliance`. -pub struct WeightInfo(PhantomData); -impl pallet_alliance::WeightInfo for WeightInfo { - /// Storage: `Alliance::Members` (r:1 w:0) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalCount` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Voting` (r:0 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[1, 1024]`. - /// The range of component `m` is `[2, 100]`. - /// The range of component `p` is `[1, 100]`. - fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `439 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `6676 + m * (32 ±0) + p * (36 ±0)` - // Minimum execution time: 32_783_000 picoseconds. - Weight::from_parts(32_174_037, 0) - .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 198 - .saturating_add(Weight::from_parts(1_220, 0).saturating_mul(b.into())) - // Standard Error: 2_074 - .saturating_add(Weight::from_parts(40_945, 0).saturating_mul(m.into())) - // Standard Error: 2_048 - .saturating_add(Weight::from_parts(181_087, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) - } - /// Storage: `Alliance::Members` (r:1 w:0) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `m` is `[5, 100]`. - fn vote(m: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `868 + m * (64 ±0)` - // Estimated: `6676 + m * (64 ±0)` - // Minimum execution time: 28_520_000 picoseconds. - Weight::from_parts(29_661_024, 0) - .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 2_336 - .saturating_add(Weight::from_parts(89_873, 0).saturating_mul(m.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) - } - /// Storage: `Alliance::Members` (r:1 w:0) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `m` is `[4, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_early_disapproved(m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `312 + m * (96 ±0) + p * (36 ±0)` - // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 39_353_000 picoseconds. - Weight::from_parts(33_028_008, 0) - .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 2_137 - .saturating_add(Weight::from_parts(90_946, 0).saturating_mul(m.into())) - // Standard Error: 2_084 - .saturating_add(Weight::from_parts(175_827, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) - } - /// Storage: `Alliance::Members` (r:1 w:0) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[1, 1024]`. - /// The range of component `m` is `[4, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_early_approved(_b: u32, m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `762 + m * (96 ±0) + p * (41 ±0)` - // Estimated: `6676 + m * (97 ±0) + p * (40 ±0)` - // Minimum execution time: 52_835_000 picoseconds. - Weight::from_parts(45_963_292, 0) - .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 3_189 - .saturating_add(Weight::from_parts(111_627, 0).saturating_mul(m.into())) - // Standard Error: 3_109 - .saturating_add(Weight::from_parts(207_923, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) - } - /// Storage: `Alliance::Members` (r:1 w:0) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:1 w:0) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Alliance::Rule` (r:0 w:1) - /// Proof: `Alliance::Rule` (`max_values`: Some(1), `max_size`: Some(87), added: 582, mode: `MaxEncodedLen`) - /// The range of component `m` is `[2, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_disapproved(m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `518 + m * (96 ±0) + p * (41 ±0)` - // Estimated: `6676 + m * (109 ±0) + p * (43 ±0)` - // Minimum execution time: 49_980_000 picoseconds. - Weight::from_parts(48_110_301, 0) - .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 5_057 - .saturating_add(Weight::from_parts(169_065, 0).saturating_mul(m.into())) - // Standard Error: 4_995 - .saturating_add(Weight::from_parts(201_349, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(Weight::from_parts(0, 109).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 43).saturating_mul(p.into())) - } - /// Storage: `Alliance::Members` (r:1 w:0) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:1 w:0) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[1, 1024]`. - /// The range of component `m` is `[5, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_approved(_b: u32, m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `417 + m * (96 ±0) + p * (36 ±0)` - // Estimated: `6676 + m * (96 ±0) + p * (36 ±0)` - // Minimum execution time: 40_646_000 picoseconds. - Weight::from_parts(36_865_909, 0) - .saturating_add(Weight::from_parts(0, 6676)) - // Standard Error: 2_136 - .saturating_add(Weight::from_parts(74_341, 0).saturating_mul(m.into())) - // Standard Error: 2_059 - .saturating_add(Weight::from_parts(170_035, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 96).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) - } - /// Storage: `Alliance::Members` (r:2 w:2) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Members` (r:1 w:1) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// The range of component `m` is `[1, 100]`. - /// The range of component `z` is `[0, 100]`. - fn init_members(m: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `12` - // Estimated: `12362` - // Minimum execution time: 29_710_000 picoseconds. - Weight::from_parts(17_762_170, 0) - .saturating_add(Weight::from_parts(0, 12362)) - // Standard Error: 1_652 - .saturating_add(Weight::from_parts(156_967, 0).saturating_mul(m.into())) - // Standard Error: 1_632 - .saturating_add(Weight::from_parts(130_352, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Alliance::Members` (r:2 w:2) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:0) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Alliance::DepositOf` (r:200 w:50) - /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:50 w:50) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Members` (r:0 w:1) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:0 w:1) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// The range of component `x` is `[1, 100]`. - /// The range of component `y` is `[0, 100]`. - /// The range of component `z` is `[0, 50]`. - fn disband(x: u32, y: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + x * (52 ±0) + y * (53 ±0) + z * (250 ±0)` - // Estimated: `12362 + x * (2539 ±0) + y * (2539 ±0) + z * (2603 ±1)` - // Minimum execution time: 294_258_000 picoseconds. - Weight::from_parts(295_116_000, 0) - .saturating_add(Weight::from_parts(0, 12362)) - // Standard Error: 23_663 - .saturating_add(Weight::from_parts(553_978, 0).saturating_mul(x.into())) - // Standard Error: 23_549 - .saturating_add(Weight::from_parts(567_024, 0).saturating_mul(y.into())) - // Standard Error: 47_055 - .saturating_add(Weight::from_parts(15_439_056, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(x.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(y.into()))) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(z.into()))) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(z.into()))) - .saturating_add(Weight::from_parts(0, 2539).saturating_mul(x.into())) - .saturating_add(Weight::from_parts(0, 2539).saturating_mul(y.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(z.into())) - } - /// Storage: `Alliance::Rule` (r:0 w:1) - /// Proof: `Alliance::Rule` (`max_values`: Some(1), `max_size`: Some(87), added: 582, mode: `MaxEncodedLen`) - fn set_rule() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_538_000 picoseconds. - Weight::from_parts(8_752_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Alliance::Announcements` (r:1 w:1) - /// Proof: `Alliance::Announcements` (`max_values`: Some(1), `max_size`: Some(8702), added: 9197, mode: `MaxEncodedLen`) - fn announce() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `10187` - // Minimum execution time: 11_213_000 picoseconds. - Weight::from_parts(11_792_000, 0) - .saturating_add(Weight::from_parts(0, 10187)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Alliance::Announcements` (r:1 w:1) - /// Proof: `Alliance::Announcements` (`max_values`: Some(1), `max_size`: Some(8702), added: 9197, mode: `MaxEncodedLen`) - fn remove_announcement() -> Weight { - // Proof Size summary in bytes: - // Measured: `149` - // Estimated: `10187` - // Minimum execution time: 12_477_000 picoseconds. - Weight::from_parts(12_942_000, 0) - .saturating_add(Weight::from_parts(0, 10187)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Alliance::Members` (r:3 w:1) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:0) - /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Alliance::DepositOf` (r:0 w:1) - /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) - fn join_alliance() -> Weight { - // Proof Size summary in bytes: - // Measured: `294` - // Estimated: `18048` - // Minimum execution time: 41_517_000 picoseconds. - Weight::from_parts(42_433_000, 0) - .saturating_add(Weight::from_parts(0, 18048)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Alliance::Members` (r:3 w:1) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:0) - /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) - fn nominate_ally() -> Weight { - // Proof Size summary in bytes: - // Measured: `193` - // Estimated: `18048` - // Minimum execution time: 25_950_000 picoseconds. - Weight::from_parts(26_631_000, 0) - .saturating_add(Weight::from_parts(0, 18048)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Alliance::Members` (r:2 w:2) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:0) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:0 w:1) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:0 w:1) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn elevate_ally() -> Weight { - // Proof Size summary in bytes: - // Measured: `236` - // Estimated: `12362` - // Minimum execution time: 24_470_000 picoseconds. - Weight::from_parts(25_222_000, 0) - .saturating_add(Weight::from_parts(0, 12362)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Alliance::Members` (r:4 w:2) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:0) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:0 w:1) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:0 w:1) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Alliance::RetiringMembers` (r:0 w:1) - /// Proof: `Alliance::RetiringMembers` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn give_retirement_notice() -> Weight { - // Proof Size summary in bytes: - // Measured: `236` - // Estimated: `23734` - // Minimum execution time: 31_519_000 picoseconds. - Weight::from_parts(32_827_000, 0) - .saturating_add(Weight::from_parts(0, 23734)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `Alliance::RetiringMembers` (r:1 w:1) - /// Proof: `Alliance::RetiringMembers` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - /// Storage: `Alliance::Members` (r:1 w:1) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `Alliance::DepositOf` (r:1 w:1) - /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn retire() -> Weight { - // Proof Size summary in bytes: - // Measured: `517` - // Estimated: `6676` - // Minimum execution time: 38_799_000 picoseconds. - Weight::from_parts(39_634_000, 0) - .saturating_add(Weight::from_parts(0, 6676)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `Alliance::Members` (r:3 w:1) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:0) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Alliance::DepositOf` (r:1 w:1) - /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:0 w:1) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:0 w:1) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn kick_member() -> Weight { - // Proof Size summary in bytes: - // Measured: `643` - // Estimated: `18048` - // Minimum execution time: 137_442_000 picoseconds. - Weight::from_parts(142_142_000, 0) - .saturating_add(Weight::from_parts(0, 18048)) - .saturating_add(T::DbWeight::get().reads(13)) - .saturating_add(T::DbWeight::get().writes(8)) - } - /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:1) - /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) - /// Storage: `Alliance::UnscrupulousWebsites` (r:1 w:1) - /// Proof: `Alliance::UnscrupulousWebsites` (`max_values`: Some(1), `max_size`: Some(25702), added: 26197, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 100]`. - /// The range of component `l` is `[0, 255]`. - fn add_unscrupulous_items(n: u32, l: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `27187` - // Minimum execution time: 7_189_000 picoseconds. - Weight::from_parts(7_387_000, 0) - .saturating_add(Weight::from_parts(0, 27187)) - // Standard Error: 3_417 - .saturating_add(Weight::from_parts(1_581_413, 0).saturating_mul(n.into())) - // Standard Error: 1_338 - .saturating_add(Weight::from_parts(67_739, 0).saturating_mul(l.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:1) - /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) - /// Storage: `Alliance::UnscrupulousWebsites` (r:1 w:1) - /// Proof: `Alliance::UnscrupulousWebsites` (`max_values`: Some(1), `max_size`: Some(25702), added: 26197, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 100]`. - /// The range of component `l` is `[0, 255]`. - fn remove_unscrupulous_items(n: u32, l: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + l * (100 ±0) + n * (289 ±0)` - // Estimated: `27187` - // Minimum execution time: 7_201_000 picoseconds. - Weight::from_parts(7_325_000, 0) - .saturating_add(Weight::from_parts(0, 27187)) - // Standard Error: 183_302 - .saturating_add(Weight::from_parts(16_886_382, 0).saturating_mul(n.into())) - // Standard Error: 71_789 - .saturating_add(Weight::from_parts(352_937, 0).saturating_mul(l.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Alliance::Members` (r:3 w:2) - /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:0) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:0 w:1) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:0 w:1) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn abdicate_fellow_status() -> Weight { - // Proof Size summary in bytes: - // Measured: `236` - // Estimated: `18048` - // Minimum execution time: 29_653_000 picoseconds. - Weight::from_parts(30_365_000, 0) - .saturating_add(Weight::from_parts(0, 18048)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs deleted file mode 100644 index 80b90aadc0db..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_balances.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_balances` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_balances -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_balances`. -pub struct WeightInfo(PhantomData); -impl pallet_balances::WeightInfo for WeightInfo { - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_allow_death() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 55_696_000 picoseconds. - Weight::from_parts(56_582_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_keep_alive() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 40_885_000 picoseconds. - Weight::from_parts(41_993_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_creating() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 14_565_000 picoseconds. - Weight::from_parts(15_080_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_set_balance_killing() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 22_158_000 picoseconds. - Weight::from_parts(22_715_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_transfer() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 57_957_000 picoseconds. - Weight::from_parts(58_618_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn transfer_all() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `3593` - // Minimum execution time: 52_018_000 picoseconds. - Weight::from_parts(52_795_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn force_unreserve() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3593` - // Minimum execution time: 17_469_000 picoseconds. - Weight::from_parts(18_030_000, 0) - .saturating_add(Weight::from_parts(0, 3593)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `System::Account` (r:999 w:999) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(u: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + u * (136 ±0)` - // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 17_223_000 picoseconds. - Weight::from_parts(17_587_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 16_201 - .saturating_add(Weight::from_parts(15_360_967, 0).saturating_mul(u.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs deleted file mode 100644 index 8376006e30c9..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collator_selection.rs +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collator_selection` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_collator_selection -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collator_selection`. -pub struct WeightInfo(PhantomData); -impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:20 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `163 + b * (79 ±0)` - // Estimated: `1154 + b * (2555 ±0)` - // Minimum execution time: 14_616_000 picoseconds. - Weight::from_parts(12_150_410, 0) - .saturating_add(Weight::from_parts(0, 1154)) - // Standard Error: 6_270 - .saturating_add(Weight::from_parts(3_256_932, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) - } - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `756 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 48_450_000 picoseconds. - Weight::from_parts(51_166_679, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_588 - .saturating_add(Weight::from_parts(167_219, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `119 + b * (32 ±0)` - // Estimated: `6287` - // Minimum execution time: 15_830_000 picoseconds. - Weight::from_parts(15_792_847, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 5_343 - .saturating_add(Weight::from_parts(167_955, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn set_desired_candidates() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_424_000 picoseconds. - Weight::from_parts(7_767_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 7_388_000 picoseconds. - Weight::from_parts(7_677_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) - /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `Session::NextKeys` (r:1 w:0) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `736 + c * (52 ±0)` - // Estimated: `6287 + c * (54 ±0)` - // Minimum execution time: 41_241_000 picoseconds. - Weight::from_parts(46_090_319, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_918 - .saturating_add(Weight::from_parts(161_140, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:1) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// The range of component `c` is `[4, 100]`. - fn leave_intent(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `306 + c * (50 ±0)` - // Estimated: `6287` - // Minimum execution time: 34_221_000 picoseconds. - Weight::from_parts(36_183_872, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_766 - .saturating_add(Weight::from_parts(168_742, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - fn note_author() -> Weight { - // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `6196` - // Minimum execution time: 43_910_000 picoseconds. - Weight::from_parts(44_796_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `CollatorSelection::Candidates` (r:1 w:0) - /// Proof: `CollatorSelection::Candidates` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) - /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) - /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) - /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) - /// Storage: `System::BlockWeight` (r:1 w:1) - /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:97 w:97) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `r` is `[1, 100]`. - /// The range of component `c` is `[1, 100]`. - fn new_session(r: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `2243 + c * (97 ±0) + r * (112 ±0)` - // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` - // Minimum execution time: 17_092_000 picoseconds. - Weight::from_parts(17_635_000, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 351_635 - .saturating_add(Weight::from_parts(15_162_192, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) - .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs deleted file mode 100644 index 013cfee7ba9d..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_collective.rs +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_collective` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_collective -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_collective`. -pub struct WeightInfo(PhantomData); -impl pallet_collective::WeightInfo for WeightInfo { - /// Storage: `AllianceMotion::Members` (r:1 w:1) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:0) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Voting` (r:100 w:100) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:0 w:1) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// The range of component `m` is `[0, 100]`. - /// The range of component `n` is `[0, 100]`. - /// The range of component `p` is `[0, 100]`. - fn set_members(m: u32, _n: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + m * (3232 ±0) + p * (3190 ±0)` - // Estimated: `15691 + m * (1967 ±23) + p * (4332 ±23)` - // Minimum execution time: 16_410_000 picoseconds. - Weight::from_parts(16_816_000, 0) - .saturating_add(Weight::from_parts(0, 15691)) - // Standard Error: 59_812 - .saturating_add(Weight::from_parts(4_516_537, 0).saturating_mul(m.into())) - // Standard Error: 59_812 - .saturating_add(Weight::from_parts(7_992_168, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 1967).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 4332).saturating_mul(p.into())) - } - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[2, 1024]`. - /// The range of component `m` is `[1, 100]`. - fn execute(b: u32, m: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `32 + m * (32 ±0)` - // Estimated: `1518 + m * (32 ±0)` - // Minimum execution time: 14_418_000 picoseconds. - Weight::from_parts(13_588_617, 0) - .saturating_add(Weight::from_parts(0, 1518)) - // Standard Error: 21 - .saturating_add(Weight::from_parts(1_711, 0).saturating_mul(b.into())) - // Standard Error: 223 - .saturating_add(Weight::from_parts(13_836, 0).saturating_mul(m.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) - } - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:1 w:0) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[2, 1024]`. - /// The range of component `m` is `[1, 100]`. - fn propose_execute(b: u32, m: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `32 + m * (32 ±0)` - // Estimated: `3498 + m * (32 ±0)` - // Minimum execution time: 17_174_000 picoseconds. - Weight::from_parts(16_192_764, 0) - .saturating_add(Weight::from_parts(0, 3498)) - // Standard Error: 27 - .saturating_add(Weight::from_parts(1_672, 0).saturating_mul(b.into())) - // Standard Error: 280 - .saturating_add(Weight::from_parts(24_343, 0).saturating_mul(m.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) - } - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalCount` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Voting` (r:0 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[2, 1024]`. - /// The range of component `m` is `[2, 100]`. - /// The range of component `p` is `[1, 100]`. - fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `322 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `3714 + m * (33 ±0) + p * (36 ±0)` - // Minimum execution time: 23_970_000 picoseconds. - Weight::from_parts(23_004_052, 0) - .saturating_add(Weight::from_parts(0, 3714)) - // Standard Error: 123 - .saturating_add(Weight::from_parts(2_728, 0).saturating_mul(b.into())) - // Standard Error: 1_291 - .saturating_add(Weight::from_parts(32_731, 0).saturating_mul(m.into())) - // Standard Error: 1_275 - .saturating_add(Weight::from_parts(199_537, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(Weight::from_parts(0, 33).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) - } - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `m` is `[5, 100]`. - fn vote(m: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `771 + m * (64 ±0)` - // Estimated: `4235 + m * (64 ±0)` - // Minimum execution time: 25_843_000 picoseconds. - Weight::from_parts(26_092_578, 0) - .saturating_add(Weight::from_parts(0, 4235)) - // Standard Error: 1_785 - .saturating_add(Weight::from_parts(67_298, 0).saturating_mul(m.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) - } - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `m` is `[4, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_early_disapproved(m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `360 + m * (64 ±0) + p * (36 ±0)` - // Estimated: `3805 + m * (65 ±0) + p * (36 ±0)` - // Minimum execution time: 27_543_000 picoseconds. - Weight::from_parts(26_505_473, 0) - .saturating_add(Weight::from_parts(0, 3805)) - // Standard Error: 1_054 - .saturating_add(Weight::from_parts(35_295, 0).saturating_mul(m.into())) - // Standard Error: 1_028 - .saturating_add(Weight::from_parts(190_508, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 65).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) - } - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[2, 1024]`. - /// The range of component `m` is `[4, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `662 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `3979 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 40_375_000 picoseconds. - Weight::from_parts(34_081_294, 0) - .saturating_add(Weight::from_parts(0, 3979)) - // Standard Error: 196 - .saturating_add(Weight::from_parts(3_796, 0).saturating_mul(b.into())) - // Standard Error: 2_072 - .saturating_add(Weight::from_parts(50_954, 0).saturating_mul(m.into())) - // Standard Error: 2_020 - .saturating_add(Weight::from_parts(246_000, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) - } - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:1 w:0) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `m` is `[4, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_disapproved(m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `458 + m * (48 ±0) + p * (36 ±0)` - // Estimated: `3898 + m * (49 ±0) + p * (36 ±0)` - // Minimum execution time: 28_793_000 picoseconds. - Weight::from_parts(29_656_832, 0) - .saturating_add(Weight::from_parts(0, 3898)) - // Standard Error: 1_214 - .saturating_add(Weight::from_parts(22_148, 0).saturating_mul(m.into())) - // Standard Error: 1_184 - .saturating_add(Weight::from_parts(189_860, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 49).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) - } - /// Storage: `AllianceMotion::Voting` (r:1 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Members` (r:1 w:0) - /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Prime` (r:1 w:0) - /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// The range of component `b` is `[2, 1024]`. - /// The range of component `m` is `[4, 100]`. - /// The range of component `p` is `[1, 100]`. - fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `682 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `3999 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 40_887_000 picoseconds. - Weight::from_parts(39_529_567, 0) - .saturating_add(Weight::from_parts(0, 3999)) - // Standard Error: 191 - .saturating_add(Weight::from_parts(2_802, 0).saturating_mul(b.into())) - // Standard Error: 2_021 - .saturating_add(Weight::from_parts(35_956, 0).saturating_mul(m.into())) - // Standard Error: 1_970 - .saturating_add(Weight::from_parts(235_154, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) - .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) - } - /// Storage: `AllianceMotion::Proposals` (r:1 w:1) - /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::Voting` (r:0 w:1) - /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) - /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[1, 100]`. - fn disapprove_proposal(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `189 + p * (32 ±0)` - // Estimated: `1674 + p * (32 ±0)` - // Minimum execution time: 14_040_000 picoseconds. - Weight::from_parts(15_075_964, 0) - .saturating_add(Weight::from_parts(0, 1674)) - // Standard Error: 854 - .saturating_add(Weight::from_parts(159_597, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_core_fellowship.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_core_fellowship.rs deleted file mode 100644 index 50a8bcea5000..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_core_fellowship.rs +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_core_fellowship` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_core_fellowship -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_core_fellowship`. -pub struct WeightInfo(PhantomData); -impl pallet_core_fellowship::WeightInfo for WeightInfo { - /// Storage: `FellowshipCore::Params` (r:0 w:1) - /// Proof: `FellowshipCore::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) - fn set_params() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 9_077_000 picoseconds. - Weight::from_parts(9_356_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::Params` (r:1 w:0) - /// Proof: `FellowshipCore::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:1) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:1 w:0) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::MemberEvidence` (r:1 w:1) - /// Proof: `FellowshipCore::MemberEvidence` (`max_values`: None, `max_size`: Some(65581), added: 68056, mode: `MaxEncodedLen`) - fn bump_offboard() -> Weight { - // Proof Size summary in bytes: - // Measured: `66111` - // Estimated: `69046` - // Minimum execution time: 128_419_000 picoseconds. - Weight::from_parts(149_318_000, 0) - .saturating_add(Weight::from_parts(0, 69046)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::Params` (r:1 w:0) - /// Proof: `FellowshipCore::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:1) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:1 w:0) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::MemberEvidence` (r:1 w:1) - /// Proof: `FellowshipCore::MemberEvidence` (`max_values`: None, `max_size`: Some(65581), added: 68056, mode: `MaxEncodedLen`) - fn bump_demote() -> Weight { - // Proof Size summary in bytes: - // Measured: `66221` - // Estimated: `69046` - // Minimum execution time: 127_629_000 picoseconds. - Weight::from_parts(130_928_000, 0) - .saturating_add(Weight::from_parts(0, 69046)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - fn set_active() -> Weight { - // Proof Size summary in bytes: - // Measured: `460` - // Estimated: `3514` - // Minimum execution time: 18_655_000 picoseconds. - Weight::from_parts(19_331_000, 0) - .saturating_add(Weight::from_parts(0, 3514)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:1) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IndexToId` (r:0 w:1) - /// Proof: `FellowshipCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:0 w:1) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - fn induct() -> Weight { - // Proof Size summary in bytes: - // Measured: `218` - // Estimated: `3514` - // Minimum execution time: 28_764_000 picoseconds. - Weight::from_parts(29_385_000, 0) - .saturating_add(Weight::from_parts(0, 3514)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::Params` (r:1 w:0) - /// Proof: `FellowshipCore::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:1) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::MemberEvidence` (r:1 w:1) - /// Proof: `FellowshipCore::MemberEvidence` (`max_values`: None, `max_size`: Some(65581), added: 68056, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IndexToId` (r:0 w:1) - /// Proof: `FellowshipCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:0 w:1) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - fn promote() -> Weight { - // Proof Size summary in bytes: - // Measured: `66089` - // Estimated: `69046` - // Minimum execution time: 123_179_000 picoseconds. - Weight::from_parts(125_302_000, 0) - .saturating_add(Weight::from_parts(0, 69046)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(6)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::MemberEvidence` (r:0 w:1) - /// Proof: `FellowshipCore::MemberEvidence` (`max_values`: None, `max_size`: Some(65581), added: 68056, mode: `MaxEncodedLen`) - fn offboard() -> Weight { - // Proof Size summary in bytes: - // Measured: `431` - // Estimated: `3514` - // Minimum execution time: 19_700_000 picoseconds. - Weight::from_parts(20_319_000, 0) - .saturating_add(Weight::from_parts(0, 3514)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - fn import() -> Weight { - // Proof Size summary in bytes: - // Measured: `385` - // Estimated: `3514` - // Minimum execution time: 18_048_000 picoseconds. - Weight::from_parts(18_345_000, 0) - .saturating_add(Weight::from_parts(0, 3514)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::Member` (r:1 w:1) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::MemberEvidence` (r:1 w:1) - /// Proof: `FellowshipCore::MemberEvidence` (`max_values`: None, `max_size`: Some(65581), added: 68056, mode: `MaxEncodedLen`) - fn approve() -> Weight { - // Proof Size summary in bytes: - // Measured: `66067` - // Estimated: `69046` - // Minimum execution time: 108_578_000 picoseconds. - Weight::from_parts(111_311_000, 0) - .saturating_add(Weight::from_parts(0, 69046)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipCore::Member` (r:1 w:0) - /// Proof: `FellowshipCore::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCore::MemberEvidence` (r:1 w:1) - /// Proof: `FellowshipCore::MemberEvidence` (`max_values`: None, `max_size`: Some(65581), added: 68056, mode: `MaxEncodedLen`) - fn submit_evidence() -> Weight { - // Proof Size summary in bytes: - // Measured: `151` - // Estimated: `69046` - // Minimum execution time: 94_484_000 picoseconds. - Weight::from_parts(97_930_000, 0) - .saturating_add(Weight::from_parts(0, 69046)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs deleted file mode 100644 index b2e36af383b8..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_multisig.rs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_multisig` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_multisig -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_multisig`. -pub struct WeightInfo(PhantomData); -impl pallet_multisig::WeightInfo for WeightInfo { - /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_288_000 picoseconds. - Weight::from_parts(14_235_741, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 5 - .saturating_add(Weight::from_parts(500, 0).saturating_mul(z.into())) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `328 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 44_865_000 picoseconds. - Weight::from_parts(33_468_056, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_513 - .saturating_add(Weight::from_parts(130_544, 0).saturating_mul(s.into())) - // Standard Error: 14 - .saturating_add(Weight::from_parts(1_422, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[3, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_approve(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `348` - // Estimated: `6811` - // Minimum execution time: 29_284_000 picoseconds. - Weight::from_parts(18_708_967, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 916 - .saturating_add(Weight::from_parts(119_202, 0).saturating_mul(s.into())) - // Standard Error: 8 - .saturating_add(Weight::from_parts(1_447, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(s: u32, z: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `451 + s * (33 ±0)` - // Estimated: `6811` - // Minimum execution time: 49_462_000 picoseconds. - Weight::from_parts(34_470_286, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_738 - .saturating_add(Weight::from_parts(178_227, 0).saturating_mul(s.into())) - // Standard Error: 17 - .saturating_add(Weight::from_parts(1_644, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `329 + s * (2 ±0)` - // Estimated: `6811` - // Minimum execution time: 30_749_000 picoseconds. - Weight::from_parts(31_841_438, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 1_033 - .saturating_add(Weight::from_parts(123_126, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `348` - // Estimated: `6811` - // Minimum execution time: 17_436_000 picoseconds. - Weight::from_parts(18_036_002, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 829 - .saturating_add(Weight::from_parts(109_450, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Multisig::Multisigs` (r:1 w:1) - /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) - /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `520 + s * (1 ±0)` - // Estimated: `6811` - // Minimum execution time: 31_532_000 picoseconds. - Weight::from_parts(32_818_015, 0) - .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 977 - .saturating_add(Weight::from_parts(123_121, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs deleted file mode 100644 index ef2406230b20..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_preimage.rs +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_preimage` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_preimage -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_preimage`. -pub struct WeightInfo(PhantomData); -impl pallet_preimage::WeightInfo for WeightInfo { - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `Preimage::PreimageFor` (r:0 w:1) - /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) - /// The range of component `s` is `[0, 4194304]`. - fn note_preimage(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `177` - // Estimated: `3556` - // Minimum execution time: 29_323_000 picoseconds. - Weight::from_parts(29_793_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - // Standard Error: 5 - .saturating_add(Weight::from_parts(2_504, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `Preimage::PreimageFor` (r:0 w:1) - /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) - /// The range of component `s` is `[0, 4194304]`. - fn note_requested_preimage(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `3556` - // Minimum execution time: 15_581_000 picoseconds. - Weight::from_parts(15_659_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - // Standard Error: 4 - .saturating_add(Weight::from_parts(2_500, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `Preimage::PreimageFor` (r:0 w:1) - /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) - /// The range of component `s` is `[0, 4194304]`. - fn note_no_deposit_preimage(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `3556` - // Minimum execution time: 15_028_000 picoseconds. - Weight::from_parts(15_150_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - // Standard Error: 6 - .saturating_add(Weight::from_parts(2_560, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `Preimage::PreimageFor` (r:0 w:1) - /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) - fn unnote_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `323` - // Estimated: `3556` - // Minimum execution time: 55_113_000 picoseconds. - Weight::from_parts(59_127_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `Preimage::PreimageFor` (r:0 w:1) - /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) - fn unnote_no_deposit_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `178` - // Estimated: `3556` - // Minimum execution time: 38_033_000 picoseconds. - Weight::from_parts(41_203_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - fn request_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `222` - // Estimated: `3556` - // Minimum execution time: 31_482_000 picoseconds. - Weight::from_parts(34_726_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - fn request_no_deposit_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `178` - // Estimated: `3556` - // Minimum execution time: 20_724_000 picoseconds. - Weight::from_parts(22_928_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - fn request_unnoted_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `3556` - // Minimum execution time: 27_015_000 picoseconds. - Weight::from_parts(29_240_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - fn request_requested_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `3556` - // Minimum execution time: 10_712_000 picoseconds. - Weight::from_parts(11_317_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `Preimage::PreimageFor` (r:0 w:1) - /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) - fn unrequest_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `178` - // Estimated: `3556` - // Minimum execution time: 34_528_000 picoseconds. - Weight::from_parts(35_982_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - fn unrequest_unnoted_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `3556` - // Minimum execution time: 11_059_000 picoseconds. - Weight::from_parts(12_458_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - fn unrequest_multi_referenced_preimage() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `3556` - // Minimum execution time: 11_502_000 picoseconds. - Weight::from_parts(12_180_000, 0) - .saturating_add(Weight::from_parts(0, 3556)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs deleted file mode 100644 index 9732251e5aae..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_proxy.rs +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_proxy` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_proxy -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_proxy`. -pub struct WeightInfo(PhantomData); -impl pallet_proxy::WeightInfo for WeightInfo { - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 15_597_000 picoseconds. - Weight::from_parts(16_231_993, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_665 - .saturating_add(Weight::from_parts(29_818, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn proxy_announced(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `454 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 36_685_000 picoseconds. - Weight::from_parts(36_376_358, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 3_003 - .saturating_add(Weight::from_parts(133_776, 0).saturating_mul(a.into())) - // Standard Error: 3_103 - .saturating_add(Weight::from_parts(60_315, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn remove_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 23_835_000 picoseconds. - Weight::from_parts(24_154_219, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_580 - .saturating_add(Weight::from_parts(125_884, 0).saturating_mul(a.into())) - // Standard Error: 1_632 - .saturating_add(Weight::from_parts(21_563, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn reject_announcement(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `369 + a * (68 ±0)` - // Estimated: `5698` - // Minimum execution time: 23_997_000 picoseconds. - Weight::from_parts(24_301_638, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_658 - .saturating_add(Weight::from_parts(133_005, 0).saturating_mul(a.into())) - // Standard Error: 1_713 - .saturating_add(Weight::from_parts(20_237, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:0) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// Storage: `Proxy::Announcements` (r:1 w:1) - /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// The range of component `a` is `[0, 31]`. - /// The range of component `p` is `[1, 31]`. - fn announce(a: u32, p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `386 + a * (68 ±0) + p * (37 ±0)` - // Estimated: `5698` - // Minimum execution time: 33_604_000 picoseconds. - Weight::from_parts(33_322_880, 0) - .saturating_add(Weight::from_parts(0, 5698)) - // Standard Error: 1_840 - .saturating_add(Weight::from_parts(114_037, 0).saturating_mul(a.into())) - // Standard Error: 1_901 - .saturating_add(Weight::from_parts(45_629, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn add_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 24_634_000 picoseconds. - Weight::from_parts(25_509_118, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_278 - .saturating_add(Weight::from_parts(38_401, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxy(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 24_855_000 picoseconds. - Weight::from_parts(25_753_505, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_819 - .saturating_add(Weight::from_parts(44_357, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn remove_proxies(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `127 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 22_211_000 picoseconds. - Weight::from_parts(23_094_124, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_597 - .saturating_add(Weight::from_parts(36_725, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 31]`. - fn create_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `139` - // Estimated: `4706` - // Minimum execution time: 26_764_000 picoseconds. - Weight::from_parts(27_667_535, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 1_111 - .saturating_add(Weight::from_parts(3_422, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Proxy::Proxies` (r:1 w:1) - /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) - /// The range of component `p` is `[0, 30]`. - fn kill_pure(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `164 + p * (37 ±0)` - // Estimated: `4706` - // Minimum execution time: 22_632_000 picoseconds. - Weight::from_parts(23_678_772, 0) - .saturating_add(Weight::from_parts(0, 4706)) - // Standard Error: 2_136 - .saturating_add(Weight::from_parts(26_492, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs deleted file mode 100644 index 0ce5de87c8f2..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_ranked_collective.rs +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_ranked_collective` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_ranked_collective -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_ranked_collective`. -pub struct WeightInfo(PhantomData); -impl pallet_ranked_collective::WeightInfo for WeightInfo { - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:1) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IndexToId` (r:0 w:1) - /// Proof: `FellowshipCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:0 w:1) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - fn add_member() -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `3507` - // Minimum execution time: 16_027_000 picoseconds. - Weight::from_parts(16_501_000, 0) - .saturating_add(Weight::from_parts(0, 3507)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:11 w:11) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:11 w:11) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IndexToId` (r:11 w:11) - /// Proof: `FellowshipCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// The range of component `r` is `[0, 10]`. - fn remove_member(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `617 + r * (281 ±0)` - // Estimated: `3519 + r * (2529 ±0)` - // Minimum execution time: 27_829_000 picoseconds. - Weight::from_parts(30_053_705, 0) - .saturating_add(Weight::from_parts(0, 3519)) - // Standard Error: 26_813 - .saturating_add(Weight::from_parts(13_088_861, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(4)) - .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2529).saturating_mul(r.into())) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:1) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IndexToId` (r:0 w:1) - /// Proof: `FellowshipCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:0 w:1) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// The range of component `r` is `[0, 10]`. - fn promote_member(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `314 + r * (17 ±0)` - // Estimated: `3507` - // Minimum execution time: 19_762_000 picoseconds. - Weight::from_parts(20_493_905, 0) - .saturating_add(Weight::from_parts(0, 3507)) - // Standard Error: 5_519 - .saturating_add(Weight::from_parts(349_033, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:1) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:1) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IdToIndex` (r:1 w:1) - /// Proof: `FellowshipCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::IndexToId` (r:1 w:1) - /// Proof: `FellowshipCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) - /// The range of component `r` is `[0, 10]`. - fn demote_member(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `632 + r * (72 ±0)` - // Estimated: `3519` - // Minimum execution time: 28_092_000 picoseconds. - Weight::from_parts(30_800_398, 0) - .saturating_add(Weight::from_parts(0, 3519)) - // Standard Error: 17_223 - .saturating_add(Weight::from_parts(615_330, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Voting` (r:1 w:1) - /// Proof: `FellowshipCollective::Voting` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:2 w:2) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn vote() -> Weight { - // Proof Size summary in bytes: - // Measured: `666` - // Estimated: `317568` - // Minimum execution time: 46_255_000 picoseconds. - Weight::from_parts(47_590_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:0) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::VotingCleanup` (r:1 w:0) - /// Proof: `FellowshipCollective::VotingCleanup` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Voting` (r:100 w:100) - /// Proof: `FellowshipCollective::Voting` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 100]`. - fn cleanup_poll(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `500 + n * (50 ±0)` - // Estimated: `4365 + n * (2540 ±0)` - // Minimum execution time: 14_975_000 picoseconds. - Weight::from_parts(17_408_362, 0) - .saturating_add(Weight::from_parts(0, 4365)) - // Standard Error: 3_134 - .saturating_add(Weight::from_parts(1_222_024, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2540).saturating_mul(n.into())) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs deleted file mode 100644 index 1e8b3ecae2e2..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_referenda.rs +++ /dev/null @@ -1,539 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_referenda` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_referenda -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_referenda`. -pub struct WeightInfo(PhantomData); -impl pallet_referenda::WeightInfo for WeightInfo { - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::ReferendumCount` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:0 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - fn submit() -> Weight { - // Proof Size summary in bytes: - // Measured: `355` - // Estimated: `159279` - // Minimum execution time: 29_271_000 picoseconds. - Weight::from_parts(30_285_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:2 w:2) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn place_decision_deposit_preparing() -> Weight { - // Proof Size summary in bytes: - // Measured: `366` - // Estimated: `317568` - // Minimum execution time: 52_128_000 picoseconds. - Weight::from_parts(53_504_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:0) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn place_decision_deposit_queued() -> Weight { - // Proof Size summary in bytes: - // Measured: `2004` - // Estimated: `159279` - // Minimum execution time: 110_018_000 picoseconds. - Weight::from_parts(114_369_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:0) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn place_decision_deposit_not_queued() -> Weight { - // Proof Size summary in bytes: - // Measured: `2045` - // Estimated: `159279` - // Minimum execution time: 110_231_000 picoseconds. - Weight::from_parts(114_517_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:1) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:2 w:2) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn place_decision_deposit_passing() -> Weight { - // Proof Size summary in bytes: - // Measured: `802` - // Estimated: `317568` - // Minimum execution time: 195_619_000 picoseconds. - Weight::from_parts(207_157_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:1) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:2 w:2) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn place_decision_deposit_failing() -> Weight { - // Proof Size summary in bytes: - // Measured: `701` - // Estimated: `317568` - // Minimum execution time: 64_020_000 picoseconds. - Weight::from_parts(65_463_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - fn refund_decision_deposit() -> Weight { - // Proof Size summary in bytes: - // Measured: `317` - // Estimated: `4365` - // Minimum execution time: 30_701_000 picoseconds. - Weight::from_parts(31_528_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - fn refund_submission_deposit() -> Weight { - // Proof Size summary in bytes: - // Measured: `167` - // Estimated: `4365` - // Minimum execution time: 15_173_000 picoseconds. - Weight::from_parts(15_787_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:2 w:2) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn cancel() -> Weight { - // Proof Size summary in bytes: - // Measured: `311` - // Estimated: `317568` - // Minimum execution time: 37_886_000 picoseconds. - Weight::from_parts(38_679_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:2 w:2) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `FellowshipReferenda::MetadataOf` (r:1 w:0) - /// Proof: `FellowshipReferenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn kill() -> Weight { - // Proof Size summary in bytes: - // Measured: `517` - // Estimated: `317568` - // Minimum execution time: 152_111_000 picoseconds. - Weight::from_parts(155_738_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(11)) - .saturating_add(T::DbWeight::get().writes(6)) - } - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:0) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:1) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - fn one_fewer_deciding_queue_empty() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `4277` - // Minimum execution time: 10_712_000 picoseconds. - Weight::from_parts(10_976_000, 0) - .saturating_add(Weight::from_parts(0, 4277)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn one_fewer_deciding_failing() -> Weight { - // Proof Size summary in bytes: - // Measured: `2418` - // Estimated: `159279` - // Minimum execution time: 97_671_000 picoseconds. - Weight::from_parts(104_911_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn one_fewer_deciding_passing() -> Weight { - // Proof Size summary in bytes: - // Measured: `2418` - // Estimated: `159279` - // Minimum execution time: 104_019_000 picoseconds. - Weight::from_parts(108_208_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:0) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - fn nudge_referendum_requeued_insertion() -> Weight { - // Proof Size summary in bytes: - // Measured: `1807` - // Estimated: `4365` - // Minimum execution time: 50_199_000 picoseconds. - Weight::from_parts(54_350_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:0) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - fn nudge_referendum_requeued_slide() -> Weight { - // Proof Size summary in bytes: - // Measured: `1774` - // Estimated: `4365` - // Minimum execution time: 52_459_000 picoseconds. - Weight::from_parts(54_382_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:0) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - fn nudge_referendum_queued() -> Weight { - // Proof Size summary in bytes: - // Measured: `1790` - // Estimated: `4365` - // Minimum execution time: 57_810_000 picoseconds. - Weight::from_parts(63_690_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:0) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::TrackQueue` (r:1 w:1) - /// Proof: `FellowshipReferenda::TrackQueue` (`max_values`: None, `max_size`: Some(812), added: 3287, mode: `MaxEncodedLen`) - fn nudge_referendum_not_queued() -> Weight { - // Proof Size summary in bytes: - // Measured: `1831` - // Estimated: `4365` - // Minimum execution time: 56_778_000 picoseconds. - Weight::from_parts(59_556_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_no_deposit() -> Weight { - // Proof Size summary in bytes: - // Measured: `263` - // Estimated: `159279` - // Minimum execution time: 24_377_000 picoseconds. - Weight::from_parts(27_031_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_preparing() -> Weight { - // Proof Size summary in bytes: - // Measured: `311` - // Estimated: `159279` - // Minimum execution time: 24_717_000 picoseconds. - Weight::from_parts(25_578_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - fn nudge_referendum_timed_out() -> Weight { - // Proof Size summary in bytes: - // Measured: `208` - // Estimated: `4365` - // Minimum execution time: 17_280_000 picoseconds. - Weight::from_parts(17_845_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:1) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_begin_deciding_failing() -> Weight { - // Proof Size summary in bytes: - // Measured: `646` - // Estimated: `159279` - // Minimum execution time: 36_996_000 picoseconds. - Weight::from_parts(37_970_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::DecidingCount` (r:1 w:1) - /// Proof: `FellowshipReferenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_begin_deciding_passing() -> Weight { - // Proof Size summary in bytes: - // Measured: `747` - // Estimated: `159279` - // Minimum execution time: 91_681_000 picoseconds. - Weight::from_parts(98_640_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_begin_confirming() -> Weight { - // Proof Size summary in bytes: - // Measured: `800` - // Estimated: `159279` - // Minimum execution time: 149_940_000 picoseconds. - Weight::from_parts(167_561_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_end_confirming() -> Weight { - // Proof Size summary in bytes: - // Measured: `783` - // Estimated: `159279` - // Minimum execution time: 157_443_000 picoseconds. - Weight::from_parts(168_023_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_continue_not_confirming() -> Weight { - // Proof Size summary in bytes: - // Measured: `800` - // Estimated: `159279` - // Minimum execution time: 155_539_000 picoseconds. - Weight::from_parts(161_877_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_continue_confirming() -> Weight { - // Proof Size summary in bytes: - // Measured: `804` - // Estimated: `159279` - // Minimum execution time: 82_000_000 picoseconds. - Weight::from_parts(87_101_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:2 w:2) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Lookup` (r:1 w:1) - /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn nudge_referendum_approved() -> Weight { - // Proof Size summary in bytes: - // Measured: `804` - // Estimated: `317568` - // Minimum execution time: 154_590_000 picoseconds. - Weight::from_parts(186_418_000, 0) - .saturating_add(Weight::from_parts(0, 317568)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:1) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::MemberCount` (r:1 w:0) - /// Proof: `FellowshipCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - fn nudge_referendum_rejected() -> Weight { - // Proof Size summary in bytes: - // Measured: `800` - // Estimated: `159279` - // Minimum execution time: 149_822_000 picoseconds. - Weight::from_parts(164_866_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:0) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `Preimage::StatusFor` (r:1 w:0) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::MetadataOf` (r:0 w:1) - /// Proof: `FellowshipReferenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn set_some_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `386` - // Estimated: `4365` - // Minimum execution time: 21_413_000 picoseconds. - Weight::from_parts(21_938_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipReferenda::ReferendumInfoFor` (r:1 w:0) - /// Proof: `FellowshipReferenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(900), added: 3375, mode: `MaxEncodedLen`) - /// Storage: `FellowshipReferenda::MetadataOf` (r:1 w:1) - /// Proof: `FellowshipReferenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) - fn clear_metadata() -> Weight { - // Proof Size summary in bytes: - // Measured: `285` - // Estimated: `4365` - // Minimum execution time: 18_927_000 picoseconds. - Weight::from_parts(19_423_000, 0) - .saturating_add(Weight::from_parts(0, 4365)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_salary.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_salary.rs deleted file mode 100644 index 351834c5e3ad..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_salary.rs +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_salary` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_salary -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_salary`. -pub struct WeightInfo(PhantomData); -impl pallet_salary::WeightInfo for WeightInfo { - /// Storage: `FellowshipSalary::Status` (r:1 w:1) - /// Proof: `FellowshipSalary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) - fn init() -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `1541` - // Minimum execution time: 10_579_000 picoseconds. - Weight::from_parts(10_898_000, 0) - .saturating_add(Weight::from_parts(0, 1541)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipSalary::Status` (r:1 w:1) - /// Proof: `FellowshipSalary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) - fn bump() -> Weight { - // Proof Size summary in bytes: - // Measured: `224` - // Estimated: `1541` - // Minimum execution time: 12_723_000 picoseconds. - Weight::from_parts(13_221_000, 0) - .saturating_add(Weight::from_parts(0, 1541)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipSalary::Status` (r:1 w:0) - /// Proof: `FellowshipSalary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipSalary::Claimant` (r:1 w:1) - /// Proof: `FellowshipSalary::Claimant` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) - fn induct() -> Weight { - // Proof Size summary in bytes: - // Measured: `395` - // Estimated: `3551` - // Minimum execution time: 18_522_000 picoseconds. - Weight::from_parts(19_120_000, 0) - .saturating_add(Weight::from_parts(0, 3551)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `FellowshipSalary::Status` (r:1 w:1) - /// Proof: `FellowshipSalary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) - /// Storage: `FellowshipSalary::Claimant` (r:1 w:1) - /// Proof: `FellowshipSalary::Claimant` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) - fn register() -> Weight { - // Proof Size summary in bytes: - // Measured: `462` - // Estimated: `3551` - // Minimum execution time: 22_270_000 picoseconds. - Weight::from_parts(23_325_000, 0) - .saturating_add(Weight::from_parts(0, 3551)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `FellowshipSalary::Status` (r:1 w:1) - /// Proof: `FellowshipSalary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) - /// Storage: `FellowshipSalary::Claimant` (r:1 w:1) - /// Proof: `FellowshipSalary::Claimant` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) - /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn payout() -> Weight { - // Proof Size summary in bytes: - // Measured: `703` - // Estimated: `4168` - // Minimum execution time: 54_436_000 picoseconds. - Weight::from_parts(56_347_000, 0) - .saturating_add(Weight::from_parts(0, 4168)) - .saturating_add(T::DbWeight::get().reads(10)) - .saturating_add(T::DbWeight::get().writes(7)) - } - /// Storage: `FellowshipSalary::Status` (r:1 w:1) - /// Proof: `FellowshipSalary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) - /// Storage: `FellowshipSalary::Claimant` (r:1 w:1) - /// Proof: `FellowshipSalary::Claimant` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) - /// Storage: `FellowshipCollective::Members` (r:1 w:0) - /// Proof: `FellowshipCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) - /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) - /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) - /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn payout_other() -> Weight { - // Proof Size summary in bytes: - // Measured: `703` - // Estimated: `4168` - // Minimum execution time: 54_140_000 picoseconds. - Weight::from_parts(56_312_000, 0) - .saturating_add(Weight::from_parts(0, 4168)) - .saturating_add(T::DbWeight::get().reads(10)) - .saturating_add(T::DbWeight::get().writes(7)) - } - /// Storage: `FellowshipSalary::Status` (r:1 w:1) - /// Proof: `FellowshipSalary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) - /// Storage: `FellowshipSalary::Claimant` (r:1 w:1) - /// Proof: `FellowshipSalary::Claimant` (`max_values`: None, `max_size`: Some(86), added: 2561, mode: `MaxEncodedLen`) - /// Storage: `PolkadotXcm::Queries` (r:1 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn check_payment() -> Weight { - // Proof Size summary in bytes: - // Measured: `478` - // Estimated: `3943` - // Minimum execution time: 24_650_000 picoseconds. - Weight::from_parts(25_242_000, 0) - .saturating_add(Weight::from_parts(0, 3943)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs deleted file mode 100644 index b647f7eba873..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_scheduler.rs +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_scheduler` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_scheduler -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_scheduler`. -pub struct WeightInfo(PhantomData); -impl pallet_scheduler::WeightInfo for WeightInfo { - /// Storage: `Scheduler::IncompleteSince` (r:1 w:1) - /// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn service_agendas_base() -> Weight { - // Proof Size summary in bytes: - // Measured: `31` - // Estimated: `1489` - // Minimum execution time: 3_441_000 picoseconds. - Weight::from_parts(3_604_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// The range of component `s` is `[0, 200]`. - fn service_agenda_base(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `77 + s * (177 ±0)` - // Estimated: `159279` - // Minimum execution time: 2_879_000 picoseconds. - Weight::from_parts(2_963_000, 0) - .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 3_764 - .saturating_add(Weight::from_parts(909_557, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn service_task_base() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_172_000 picoseconds. - Weight::from_parts(5_294_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `Preimage::PreimageFor` (r:1 w:1) - /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) - /// Storage: `Preimage::StatusFor` (r:1 w:1) - /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// The range of component `s` is `[128, 4194304]`. - fn service_task_fetched(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `213 + s * (1 ±0)` - // Estimated: `3678 + s * (1 ±0)` - // Minimum execution time: 19_704_000 picoseconds. - Weight::from_parts(19_903_000, 0) - .saturating_add(Weight::from_parts(0, 3678)) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_394, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) - } - /// Storage: `Scheduler::Lookup` (r:0 w:1) - /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - fn service_task_named() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_359_000 picoseconds. - Weight::from_parts(6_599_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn service_task_periodic() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_217_000 picoseconds. - Weight::from_parts(5_333_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - fn execute_dispatch_signed() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_406_000 picoseconds. - Weight::from_parts(2_541_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - fn execute_dispatch_unsigned() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_370_000 picoseconds. - Weight::from_parts(2_561_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// The range of component `s` is `[0, 199]`. - fn schedule(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `77 + s * (177 ±0)` - // Estimated: `159279` - // Minimum execution time: 11_784_000 picoseconds. - Weight::from_parts(5_574_404, 0) - .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 7_217 - .saturating_add(Weight::from_parts(1_035_248, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Lookup` (r:0 w:1) - /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// The range of component `s` is `[1, 200]`. - fn cancel(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `77 + s * (177 ±0)` - // Estimated: `159279` - // Minimum execution time: 16_373_000 picoseconds. - Weight::from_parts(3_088_135, 0) - .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 7_095 - .saturating_add(Weight::from_parts(1_745_270, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Scheduler::Lookup` (r:1 w:1) - /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// The range of component `s` is `[0, 199]`. - fn schedule_named(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `468 + s * (179 ±0)` - // Estimated: `159279` - // Minimum execution time: 14_822_000 picoseconds. - Weight::from_parts(9_591_402, 0) - .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 7_151 - .saturating_add(Weight::from_parts(1_058_408, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Scheduler::Lookup` (r:1 w:1) - /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) - /// Storage: `Scheduler::Agenda` (r:1 w:1) - /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) - /// The range of component `s` is `[1, 200]`. - fn cancel_named(s: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `509 + s * (179 ±0)` - // Estimated: `159279` - // Minimum execution time: 18_541_000 picoseconds. - Weight::from_parts(6_522_239, 0) - .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 8_349 - .saturating_add(Weight::from_parts(1_760_431, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs deleted file mode 100644 index 909f9a64f5aa..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_session.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_session` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_session -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_session`. -pub struct WeightInfo(PhantomData); -impl pallet_session::WeightInfo for WeightInfo { - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:1 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn set_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `270` - // Estimated: `3735` - // Minimum execution time: 16_663_000 picoseconds. - Weight::from_parts(17_246_000, 0) - .saturating_add(Weight::from_parts(0, 3735)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `Session::NextKeys` (r:1 w:1) - /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Session::KeyOwner` (r:0 w:1) - /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn purge_keys() -> Weight { - // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `3707` - // Minimum execution time: 11_850_000 picoseconds. - Weight::from_parts(12_204_000, 0) - .saturating_add(Weight::from_parts(0, 3707)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs deleted file mode 100644 index bb8f0e0b3769..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_timestamp.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_timestamp` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_timestamp -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_timestamp`. -pub struct WeightInfo(PhantomData); -impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: `Timestamp::Now` (r:1 w:1) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Aura::CurrentSlot` (r:1 w:0) - /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set() -> Weight { - // Proof Size summary in bytes: - // Measured: `49` - // Estimated: `1493` - // Minimum execution time: 7_863_000 picoseconds. - Weight::from_parts(8_183_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) - } - fn on_finalize() -> Weight { - // Proof Size summary in bytes: - // Measured: `57` - // Estimated: `0` - // Minimum execution time: 3_460_000 picoseconds. - Weight::from_parts(3_577_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs deleted file mode 100644 index f16ffc4c0c3b..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_utility.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_utility` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_utility -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_utility`. -pub struct WeightInfo(PhantomData); -impl pallet_utility::WeightInfo for WeightInfo { - /// The range of component `c` is `[0, 1000]`. - fn batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_650_000 picoseconds. - Weight::from_parts(7_474_437, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_625 - .saturating_add(Weight::from_parts(4_996_146, 0).saturating_mul(c.into())) - } - fn as_derivative() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 4_612_000 picoseconds. - Weight::from_parts(4_774_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn batch_all(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_744_000 picoseconds. - Weight::from_parts(10_889_913, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_281 - .saturating_add(Weight::from_parts(5_218_293, 0).saturating_mul(c.into())) - } - fn dispatch_as() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_673_000 picoseconds. - Weight::from_parts(8_980_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// The range of component `c` is `[0, 1000]`. - fn force_batch(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_744_000 picoseconds. - Weight::from_parts(7_801_721, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_395 - .saturating_add(Weight::from_parts(5_000_971, 0).saturating_mul(c.into())) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs deleted file mode 100644 index 030d754ec4ce..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/pallet_xcm.rs +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_xcm` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_xcm`. -pub struct WeightInfo(PhantomData); -impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn send() -> Weight { - // Proof Size summary in bytes: - // Measured: `111` - // Estimated: `3576` - // Minimum execution time: 27_795_000 picoseconds. - Weight::from_parts(28_215_000, 0) - .saturating_add(Weight::from_parts(0, 3576)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) - /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `1489` - // Minimum execution time: 23_847_000 picoseconds. - Weight::from_parts(24_332_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn reserve_transfer_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `Benchmark::Override` (r:0 w:0) - /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn execute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 8_885_000 picoseconds. - Weight::from_parts(9_128_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_default_xcm_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_670_000 picoseconds. - Weight::from_parts(2_815_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) - /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_subscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `111` - // Estimated: `3576` - // Minimum execution time: 32_214_000 picoseconds. - Weight::from_parts(32_989_000, 0) - .saturating_add(Weight::from_parts(0, 3576)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(5)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::Queries` (r:0 w:1) - /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn force_unsubscribe_version_notify() -> Weight { - // Proof Size summary in bytes: - // Measured: `294` - // Estimated: `3759` - // Minimum execution time: 33_638_000 picoseconds. - Weight::from_parts(34_206_000, 0) - .saturating_add(Weight::from_parts(0, 3759)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(4)) - } - /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) - /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn force_suspension() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_602_000 picoseconds. - Weight::from_parts(2_730_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_supported_version() -> Weight { - // Proof Size summary in bytes: - // Measured: `129` - // Estimated: `11019` - // Minimum execution time: 16_199_000 picoseconds. - Weight::from_parts(16_833_000, 0) - .saturating_add(Weight::from_parts(0, 11019)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notifiers() -> Weight { - // Proof Size summary in bytes: - // Measured: `133` - // Estimated: `11023` - // Minimum execution time: 16_561_000 picoseconds. - Weight::from_parts(16_872_000, 0) - .saturating_add(Weight::from_parts(0, 11023)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn already_notified_target() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `13505` - // Minimum execution time: 17_812_000 picoseconds. - Weight::from_parts(20_036_000, 0) - .saturating_add(Weight::from_parts(0, 13505)) - .saturating_add(T::DbWeight::get().reads(5)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn notify_current_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `178` - // Estimated: `6118` - // Minimum execution time: 30_153_000 picoseconds. - Weight::from_parts(31_366_000, 0) - .saturating_add(Weight::from_parts(0, 6118)) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn notify_target_migration_fail() -> Weight { - // Proof Size summary in bytes: - // Measured: `172` - // Estimated: `8587` - // Minimum execution time: 9_465_000 picoseconds. - Weight::from_parts(9_743_000, 0) - .saturating_add(Weight::from_parts(0, 8587)) - .saturating_add(T::DbWeight::get().reads(3)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn migrate_version_notify_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `140` - // Estimated: `11030` - // Minimum execution time: 16_954_000 picoseconds. - Weight::from_parts(19_772_000, 0) - .saturating_add(Weight::from_parts(0, 11030)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) - /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) - /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn migrate_and_notify_old_targets() -> Weight { - // Proof Size summary in bytes: - // Measured: `182` - // Estimated: `11072` - // Minimum execution time: 37_302_000 picoseconds. - Weight::from_parts(38_124_000, 0) - .saturating_add(Weight::from_parts(0, 11072)) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs b/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs deleted file mode 100644 index e9b5c1b165a8..000000000000 --- a/cumulus/parachains/runtimes/collectives/collectives-polkadot/src/xcm_config.rs +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, Balances, Fellows, ParachainInfo, ParachainSystem, - PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing}, - weights::Weight, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{impls::ToStakingPot, xcm_config::ConcreteNativeAssetFrom}; -use polkadot_parachain::primitives::Sibling; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, - OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; - -parameter_types! { - pub const DotLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Polkadot); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognised. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognised. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - /// The amount of weight an XCM operation takes. This is a safe overestimate. - pub const BaseXcmWeight: Weight = Weight::from_parts(1_000_000_000, 1024); - /// A temporary weight value for each XCM instruction. - /// NOTE: This should be removed after we account for PoV weights. - pub const TempFixedXcmWeight: Weight = Weight::from_parts(1_000_000_000, 0); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - // Fellows pluralistic body. - pub const FellowsBodyId: BodyId = BodyId::Technical; -} - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; -} - -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - matches!( - call, - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Alliance( - // `init_members` accepts unbounded vecs as arguments, - // but the call can be initiated only by root origin. - pallet_alliance::Call::init_members { .. } | - pallet_alliance::Call::vote { .. } | - pallet_alliance::Call::disband { .. } | - pallet_alliance::Call::set_rule { .. } | - pallet_alliance::Call::announce { .. } | - pallet_alliance::Call::remove_announcement { .. } | - pallet_alliance::Call::join_alliance { .. } | - pallet_alliance::Call::nominate_ally { .. } | - pallet_alliance::Call::elevate_ally { .. } | - pallet_alliance::Call::give_retirement_notice { .. } | - pallet_alliance::Call::retire { .. } | - pallet_alliance::Call::kick_member { .. } | - pallet_alliance::Call::close { .. } | - pallet_alliance::Call::abdicate_fellow_status { .. }, - ) | RuntimeCall::AllianceMotion( - pallet_collective::Call::vote { .. } | - pallet_collective::Call::disapprove_proposal { .. } | - pallet_collective::Call::close { .. }, - ) | RuntimeCall::FellowshipCollective( - pallet_ranked_collective::Call::add_member { .. } | - pallet_ranked_collective::Call::promote_member { .. } | - pallet_ranked_collective::Call::demote_member { .. } | - pallet_ranked_collective::Call::remove_member { .. }, - ) | RuntimeCall::FellowshipCore( - pallet_core_fellowship::Call::bump { .. } | - pallet_core_fellowship::Call::set_params { .. } | - pallet_core_fellowship::Call::set_active { .. } | - pallet_core_fellowship::Call::approve { .. } | - pallet_core_fellowship::Call::induct { .. } | - pallet_core_fellowship::Call::promote { .. } | - pallet_core_fellowship::Call::offboard { .. } | - pallet_core_fellowship::Call::submit_evidence { .. } | - pallet_core_fellowship::Call::import { .. }, - ) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - // Allow local users to buy weight credit. - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Collectives does not recognize a reserve location for any asset. Users must teleport DOT - // where allowed (e.g. with the Relay Chain). - type IsReserve = (); - /// Only allow teleportation of DOT. - type IsTeleporter = ConcreteNativeAssetFrom; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = FixedWeightBounds; - type Trader = - UsingComponents>; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -/// Type to convert the Fellows origin to a Plurality `MultiLocation` value. -pub type FellowsToPlurality = OriginToPluralityVoice; - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // We only allow the Fellows to send messages. - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. - type Weigher = FixedWeightBounds; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml deleted file mode 100644 index 15cf56e4a276..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ /dev/null @@ -1,179 +0,0 @@ -[package] -name = "contracts-rococo-runtime" -version = "0.2.0" -authors = ["Parity Technologies "] -edition = "2021" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-insecure-randomness-collective-flip = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-multisig = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-utility = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-contracts = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-contracts-primitives = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -kusama-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } - -[features] -default = [ - "std", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "frame-try-runtime/std", - "kusama-runtime-constants/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-collator-selection/std", - "pallet-contracts-primitives/std", - "pallet-contracts/std", - "pallet-multisig/std", - "pallet-insecure-randomness-collective-flip/std", - "pallet-session/std", - "pallet-sudo/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-utility/std", - "pallet-xcm/std", - "parachain-info/std", - "parachains-common/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "substrate-wasm-builder", -] - -runtime-benchmarks = [ - "hex-literal", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "pallet-contracts/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", - "pallet-sudo/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-utility/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", -] - -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-contracts/try-runtime", - "pallet-multisig/try-runtime", - "pallet-insecure-randomness-collective-flip/try-runtime", - "pallet-session/try-runtime", - "pallet-sudo/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/README.md b/cumulus/parachains/runtimes/contracts/contracts-rococo/README.md deleted file mode 100644 index e4f15ccf92d6..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# Contracts 📝 - -This is a parachain node for smart contracts; it contains a default configuration of -Substrate's module for smart contracts ‒ the [`pallet-contracts`](https://github.com/paritytech/substrate/tree/master/frame/contracts). - -The node is only available on Rococo, a testnet for Polkadot and Kusama parachains. -It has been configured as a common good parachain, as such it uses the Rococo relay -chain's native token `ROC` instead of defining a token of its own. -See the section [Rococo Deployment](#rococo-deployment) below for more details. - -If you have any questions, it's best to ask in the -[Substrate StackExchange](https://substrate.stackexchange.com/). - -## Smart Contracts Development - -![Contracts Overview](./contracts-overview.svg) - -This node contains Substrate's smart contracts module ‒ the -[`pallet-contracts`](https://github.com/paritytech/substrate/tree/master/frame/contracts). -This pallet takes smart contracts as WebAssembly blobs and defines an API -for everything a smart contract needs (storage access, …). -As long as a programming language compiles to WebAssembly and there exists an implementation -of this API in it, you can write a smart contract for this pallet (and thus for this parachain) -in that language. - -This is a list of languages you can currently choose from: - -* [Parity's ink!](https://github.com/paritytech/ink) for Rust. -* [ask!](https://github.com/patractlabs/ask) for Assembly Script. -* The [Solang](https://github.com/hyperledger-labs/solang) compiler for Solidity. - -There are also different user interfaces and command-line tools you can use to deploy -or interact with contracts: - -* [Contracts UI](https://paritytech.github.io/contracts-ui/) ‒ a beginner-friendly UI for smart contract developers. -* [polkadot-js](https://polkadot.js.org/apps/) ‒ the go-to expert UI for smart contract developers. -* [cargo-contract](https://github.com/paritytech/cargo-contract) ‒ a CLI tool, ideal for scripting or your terminal workflow. - -If you are looking for a quickstart, we can recommend -[ink!'s Guided Tutorial for Beginners](https://docs.substrate.io/tutorials/v3/ink-workshop/pt1/). - -### Build & Launch a Node - -To run a Contracts node that connects to Rococo -you will need to compile the `polkadot-parachain` binary: - -```bash -cargo build --release --locked --bin polkadot-parachain -``` - -Once the executable is built, launch the parachain node via: - -```bash -./target/release/polkadot-parachain --chain contracts-rococo -``` - -Refer to the [setup instructions](https://github.com/paritytech/cumulus#manual-setup) to run a local network for development. - -### Rococo Deployment - -We have a live deployment on [Rococo](https://wiki.polkadot.network/docs/build-pdk#rococo-testnet) ‒ -a testnet for Polkadot and Kusama parachains. - -You can interact with the network through Polkadot JS Apps, -[click here for a direct link to the parachain](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-contracts-rpc.polkadot.io#/explorer). - -This parachain uses the Rococo relay chain's native token `ROC` instead of defining a token of its own. -Due to this you'll need `ROC` in order to deploy contracts on this parachain. - -As a first step, you should create an account. See [here](https://wiki.polkadot.network/docs/learn-account-generation) -for a detailed guide. - -As a second step, you have to get `ROC` testnet tokens through the [Rococo Faucet](https://wiki.polkadot.network/docs/learn-DOT#obtaining-testnet-tokens). -This is a chat room in which you'd need to post the following message: - -```bash -!drip YOUR_SS_58_ADDRESS:1002 -``` - -The number `1002` is the id of this parachain on Rococo, by supplying it the faucet will teleport `ROC` -tokens directly to your account on the parachain. - -If everything worked out, the teleported `ROC` tokens will show up under -[the "Accounts" tab](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-contracts-rpc.polkadot.io#/accounts). - -Once you have `ROC` you can deploy a contract as you would normally. -If you're unsure about this, our [guided tutorial](https://use.ink/getting-started/deploy-your-contract) -will clarify that for you in no time. diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/build.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/contracts-overview.svg b/cumulus/parachains/runtimes/contracts/contracts-rococo/contracts-overview.svg deleted file mode 100644 index ad48df6510f0..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/contracts-overview.svg +++ /dev/null @@ -1,725 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - The .contract file contains the WebAssemblyblob and metadata for the contract. - .contract File - - - - - - - - - - - Substrate's module for smart contracts - - pallet-contracts - - - - - - - - The WebAssembly blob targetsan API exposed by Substrate'scontracts module. - - - Blockchain-Framework - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Solidity - ask! Assembly Script eDSL - Parity's Rust eDSL - - - - - - - - - - diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/constants.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/constants.rs deleted file mode 100644 index 1147b935aa3c..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/constants.rs +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod currency { - use kusama_runtime_constants as constants; - use polkadot_core_primitives::Balance; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = constants::currency::EXISTENTIAL_DEPOSIT / 10; - - pub const UNITS: Balance = constants::currency::UNITS; - pub const CENTS: Balance = constants::currency::CENTS; - pub const GRAND: Balance = constants::currency::GRAND; - pub const MILLICENTS: Balance = constants::currency::MILLICENTS; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // map to 1/100 of what the kusama relay chain charges (v9020) - constants::currency::deposit(items, bytes) / 100 - } -} - -/// Fee-related. -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in Rococo Contracts, we map to 1/10 of that, or 1/100 CENT - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs deleted file mode 100644 index a1d691560ffa..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ /dev/null @@ -1,64 +0,0 @@ -use crate::{ - constants::currency::deposit, Balance, Balances, RandomnessCollectiveFlip, Runtime, - RuntimeCall, RuntimeEvent, RuntimeHoldReason, Timestamp, -}; -use frame_support::{ - parameter_types, - traits::{ConstBool, ConstU32, Nothing}, -}; -use pallet_contracts::{ - migration::{v12, v13, v14}, - weights::SubstrateWeight, - Config, DebugInfo, DefaultAddressGenerator, Frame, Schedule, -}; -use sp_runtime::Perbill; - -pub use parachains_common::AVERAGE_ON_INITIALIZE_RATIO; - -// Prints debug output of the `contracts` pallet to stdout if the node is -// started with `-lruntime::contracts=debug`. -pub const CONTRACTS_DEBUG_OUTPUT: DebugInfo = DebugInfo::UnsafeDebug; - -parameter_types! { - pub const DepositPerItem: Balance = deposit(1, 0); - pub const DepositPerByte: Balance = deposit(0, 1); - pub const DefaultDepositLimit: Balance = deposit(1024, 1024 * 1024); - pub MySchedule: Schedule = Default::default(); - pub CodeHashLockupDepositPercent: Perbill = Perbill::from_percent(30); -} - -impl Config for Runtime { - type Time = Timestamp; - type Randomness = RandomnessCollectiveFlip; - type Currency = Balances; - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - /// The safest default is to allow no calls at all. - /// - /// Runtimes should whitelist dispatchables that are allowed to be called from contracts - /// and make sure they are stable. Dispatchables exposed to contracts are not allowed to - /// change because that would break already deployed contracts. The `Call` structure itself - /// is not allowed to change the indices of existing pallets, too. - type CallFilter = Nothing; - type DepositPerItem = DepositPerItem; - type DepositPerByte = DepositPerByte; - type DefaultDepositLimit = DefaultDepositLimit; - type WeightPrice = pallet_transaction_payment::Pallet; - type WeightInfo = SubstrateWeight; - type ChainExtension = (); - type Schedule = MySchedule; - type CallStack = [Frame; 5]; - type AddressGenerator = DefaultAddressGenerator; - type MaxCodeLen = ConstU32<{ 123 * 1024 }>; - type MaxStorageKeyLen = ConstU32<128>; - type UnsafeUnstableInterface = ConstBool; - type MaxDebugBufferLen = ConstU32<{ 2 * 1024 * 1024 }>; - type MaxDelegateDependencies = ConstU32<32>; - type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent; - type Migrations = ( - v12::Migration, - v13::Migration, - v14::Migration, - ); - type RuntimeHoldReason = RuntimeHoldReason; -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs deleted file mode 100644 index 3491ec196712..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ /dev/null @@ -1,718 +0,0 @@ -// Copyright (C) 2018-2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -//! # Contracts Parachain -//! -//! A parachain for using FRAME's `pallet-contracts` and ink! contracts. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod constants; -mod contracts; -mod weights; -mod xcm_config; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use constants::{currency::*, fee::WeightToFee}; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ConstBool, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, Everything}, - weights::{ConstantMultiplier, Weight}, - PalletId, -}; -use frame_system::limits::{BlockLength, BlockWeights}; -pub use parachains_common as common; -use parachains_common::{ - impls::DealWithFees, AccountId, BlockNumber, Hash, Header, Nonce, Signature, - AVERAGE_ON_INITIALIZE_RATIO, MAXIMUM_BLOCK_WEIGHT, MINUTES, NORMAL_DISPATCH_RATIO, - SLOT_DURATION, -}; -pub use parachains_common::{AuraId, Balance}; -use xcm_config::CollatorSelectionUpdateOrigin; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Migrations to apply on runtime upgrade. -pub type Migrations = ( - cumulus_pallet_dmp_queue::migration::Migration, - cumulus_pallet_parachain_system::migration::Migration, - cumulus_pallet_xcmp_queue::migration::Migration, - pallet_contracts::Migration, -); - -type EventRecord = frame_system::EventRecord< - ::RuntimeEvent, - ::Hash, ->; - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("contracts-rococo"), - impl_name: create_runtime_str!("contracts-rococo"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 6, - state_version: 1, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); -} - -// Configure FRAME pallets to include in runtime. -impl frame_system::Config for Runtime { - type BaseCallFilter = Everything; - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type AccountId = AccountId; - type RuntimeCall = RuntimeCall; - type Lookup = AccountIdLookup; - type Nonce = Nonce; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type BlockHashCount = BlockHashCount; - type DbWeight = RocksDbWeight; - type Version = Version; - type PalletInfo = PalletInfo; - type OnNewAccount = (); - type OnKilledAccount = (); - type AccountData = pallet_balances::AccountData; - type SystemWeightInfo = frame_system::weights::SubstrateWeight; - type SS58Prefix = ConstU16<42>; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = pallet_timestamp::weights::SubstrateWeight; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU128; - type AccountStore = System; - type WeightInfo = pallet_balances::weights::SubstrateWeight; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<1>; - type MaxFreezes = ConstU32<0>; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type WeightToFee = WeightToFee; - /// Relay Chain `TransactionByteFee` / 10 - type LengthToFee = ConstantMultiplier>; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = ConstU32<100>; - type WeightInfo = pallet_multisig::weights::SubstrateWeight; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = pallet_utility::weights::SubstrateWeight; -} - -parameter_types! { - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type OutboundXcmpMessageSource = XcmpQueue; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl pallet_insecure_randomness_collective_flip::Config for Runtime {} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -parameter_types! { - pub const Period: u32 = 10 * MINUTES; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = pallet_session::weights::SubstrateWeight; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); -} - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<1>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = pallet_collator_selection::weights::SubstrateWeight; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type WeightInfo = pallet_sudo::weights::SubstrateWeight; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - RandomnessCollectiveFlip: pallet_insecure_randomness_collective_flip::{Pallet, Storage} = 2, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - - // Collator support. The order of these 5 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Smart Contracts. - Contracts: pallet_contracts::{Pallet, Call, Storage, Event, HoldReason} = 40, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 50, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 51, - - // Sudo - Sudo: pallet_sudo::{Pallet, Call, Config, Event, Storage} = 100, - } -); - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_session, SessionBench::] - [pallet_utility, Utility] - [pallet_sudo, Sudo] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [pallet_contracts, Contracts] - [pallet_xcm, PolkadotXcm] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - impl pallet_contracts::ContractsApi for Runtime { - fn call( - origin: AccountId, - dest: AccountId, - value: Balance, - gas_limit: Option, - storage_deposit_limit: Option, - input_data: Vec, - ) -> pallet_contracts_primitives::ContractExecResult { - let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); - Contracts::bare_call( - origin, - dest, - value, - gas_limit, - storage_deposit_limit, - input_data, - contracts::CONTRACTS_DEBUG_OUTPUT, - pallet_contracts::CollectEvents::UnsafeCollect, - pallet_contracts::Determinism::Enforced, - ) - } - - fn instantiate( - origin: AccountId, - value: Balance, - gas_limit: Option, - storage_deposit_limit: Option, - code: pallet_contracts_primitives::Code, - data: Vec, - salt: Vec, - ) -> pallet_contracts_primitives::ContractInstantiateResult { - let gas_limit = gas_limit.unwrap_or(RuntimeBlockWeights::get().max_block); - Contracts::bare_instantiate( - origin, - value, - gas_limit, - storage_deposit_limit, - code, - data, - salt, - contracts::CONTRACTS_DEBUG_OUTPUT, - pallet_contracts::CollectEvents::UnsafeCollect, - ) - } - - fn upload_code( - origin: AccountId, - code: Vec, - storage_deposit_limit: Option, - determinism: pallet_contracts::Determinism, - ) -> pallet_contracts_primitives::CodeUploadResult { - Contracts::bare_upload_code( - origin, - code, - storage_deposit_limit, - determinism, - ) - } - - fn get_storage( - address: AccountId, - key: Vec, - ) -> pallet_contracts_primitives::GetStorageResult { - Contracts::get_storage(address, key) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError, TrackedStorageKey}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/block_weights.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/mod.rs deleted file mode 100644 index ed0b4dbcd47f..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/mod.rs +++ /dev/null @@ -1,28 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Expose the auto generated weight files. - -pub mod block_weights; -pub mod extrinsic_weights; -pub mod paritydb_weights; -pub mod rocksdb_weights; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs deleted file mode 100644 index 3857c07fd03f..000000000000 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, - Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, EitherOfDiverse, Everything, Nothing}, - weights::Weight, -}; -use frame_system::EnsureRoot; -use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough}; -use polkadot_parachain::primitives::Sibling; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, - NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::XcmExecutor; - -parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = None; - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); - pub const ExecutiveBody: BodyId = BodyId::Executive; - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); -} - -/// We allow root and the Relay Chain council to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognised. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognised. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); - pub const MaxInstructions: u32 = 100; -} - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - type IsReserve = NativeAsset; - type IsTeleporter = NativeAsset; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = FixedWeightBounds; - type Trader = UsingComponents; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = ConstU32<8>; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports and reserve transfers are - // allowed. - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Everything; - type Weigher = FixedWeightBounds; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - // FIXME: Replace with benchmarked weight info - type WeightInfo = pallet_xcm::TestWeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, - >; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} diff --git a/cumulus/parachains/runtimes/glutton/glutton-kusama/Cargo.toml b/cumulus/parachains/runtimes/glutton/glutton-kusama/Cargo.toml deleted file mode 100644 index da90f290ccaf..000000000000 --- a/cumulus/parachains/runtimes/glutton/glutton-kusama/Cargo.toml +++ /dev/null @@ -1,91 +0,0 @@ -[package] -name = "glutton-runtime" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-glutton = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = [ "std" ] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-glutton/runtime-benchmarks", - "cumulus-pallet-parachain-system/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", -] -std = [ - "codec/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system/std", - "frame-system-rpc-runtime-api/std", - "pallet-glutton/std", - "pallet-sudo/std", - "sp-api/std", - "sp-block-builder/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-primitives-core/std", - "parachain-info/std", - "parachains-common/std", -] -try-runtime = [ - "frame-executive/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-glutton/try-runtime", - "pallet-sudo/try-runtime", -] diff --git a/cumulus/parachains/runtimes/glutton/glutton-kusama/build.rs b/cumulus/parachains/runtimes/glutton/glutton-kusama/build.rs deleted file mode 100644 index 9b53d2457dff..000000000000 --- a/cumulus/parachains/runtimes/glutton/glutton-kusama/build.rs +++ /dev/null @@ -1,9 +0,0 @@ -use substrate_wasm_builder::WasmBuilder; - -fn main() { - WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} diff --git a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-kusama/src/lib.rs deleted file mode 100644 index 10c46b194f98..000000000000 --- a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/lib.rs +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Glutton Runtime -//! -//! The purpose of the Glutton parachain is to do stress testing on the Kusama -//! network. -//! -//! There may be multiple instances of the Glutton parachain deployed and -//! connected to Kusama. -//! -//! These parachains are not holding any real value. Their purpose is to stress -//! test the network. -//! -//! ### Governance -//! -//! Glutton defers its governance (namely, its `Root` origin), to its Relay -//! Chain parent, Kusama. -//! -//! ### XCM -//! -//! Since the main goal of Glutton is solely stress testing, the parachain will -//! only be able receive XCM messages from Kusama via DMP. This way the Glutton -//! parachains will be able to listen for upgrades that are coming from the -//! Relay chain. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod weights; -pub mod xcm_config; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::OpaqueMetadata; -use sp_runtime::{ - create_runtime_str, generic, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -pub use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{Everything, IsInVec, Randomness}, - weights::{ - constants::{ - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND, - }, - IdentityFee, Weight, - }, - StorageValue, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -use parachains_common::{AccountId, Signature}; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; -pub use sp_runtime::{Perbill, Permill}; - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("glutton"), - impl_name: create_runtime_str!("glutton"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 1, - state_version: 1, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers. -/// This is used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used -/// by Operational extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for .5 seconds of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -parameter_types! { - pub const BlockHashCount: BlockNumber = 4096; - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 2; -} - -impl frame_system::Config for Runtime { - type AccountId = AccountId; - type RuntimeCall = RuntimeCall; - type Lookup = AccountIdLookup; - type Nonce = Nonce; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type BlockHashCount = BlockHashCount; - type Version = Version; - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - // We do anything the parent chain tells us in this runtime. - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(2); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = (); - type DmpMessageHandler = cumulus_pallet_xcm::UnlimitedDmpExecution; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = (); - type ReservedXcmpWeight = (); - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl pallet_glutton::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = weights::pallet_glutton::WeightInfo; - type AdminOrigin = EnsureRoot; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type WeightInfo = (); -} - -construct_runtime! { - pub enum Runtime - { - System: frame_system::{Pallet, Call, Storage, Config, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 2, - - // DMP handler. - CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Storage, Event, Origin} = 10, - - // The main stage. - Glutton: pallet_glutton::{Pallet, Call, Storage, Event, Config} = 20, - - // Sudo. - Sudo: pallet_sudo::{Pallet, Call, Storage, Event, Config} = 255, - } -} - -/// Index of a transaction in the chain. -pub type Nonce = u32; -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; -/// An index to a block. -pub type BlockNumber = u32; -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - pallet_sudo::CheckOnlySudoAccount, - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, ->; - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_glutton, Glutton] - ); -} - -impl_runtime_apis! { - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic( - extrinsic: ::Extrinsic, - ) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn decode_session_keys(_: Vec) -> Option, sp_core::crypto::KeyTypeId)>> { - Some(Vec::new()) - } - - fn generate_session_keys(_: Option>) -> Vec { - Vec::new() - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError, TrackedStorageKey}; - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use frame_support::traits::WhitelistedStorageKeys; - let whitelist: Vec = AllPalletsWithSystem::whitelisted_storage_keys(); - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - _: &Block, - _: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - sp_inherents::CheckInherentsResult::new() - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = Executive, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/frame_system.rs b/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/frame_system.rs deleted file mode 100644 index 1aff76714bb3..000000000000 --- a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/frame_system.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `frame_system` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("glutton-kusama-dev-1300")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=glutton-kusama-dev-1300 -// --wasm-execution=compiled -// --pallet=frame_system -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/glutton/glutton-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `frame_system`. -pub struct WeightInfo(PhantomData); -impl frame_system::WeightInfo for WeightInfo { - /// The range of component `b` is `[0, 3932160]`. - fn remark(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 1_717_000 picoseconds. - Weight::from_parts(1_782_325, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(387, 0).saturating_mul(b.into())) - } - /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_089_000 picoseconds. - Weight::from_parts(6_353_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 2 - .saturating_add(Weight::from_parts(1_788, 0).saturating_mul(b.into())) - } - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) - fn set_heap_pages() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 3_389_000 picoseconds. - Weight::from_parts(3_605_000, 0) - .saturating_add(Weight::from_parts(0, 1485)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) - } - /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) - /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) - /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) - /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) - /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) - /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - fn set_code() -> Weight { - // Proof Size summary in bytes: - // Measured: `119` - // Estimated: `1604` - // Minimum execution time: 97_701_839_000 picoseconds. - Weight::from_parts(100_104_315_000, 0) - .saturating_add(Weight::from_parts(0, 1604)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn set_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 1_638_000 picoseconds. - Weight::from_parts(1_726_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_886 - .saturating_add(Weight::from_parts(809_561, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `i` is `[0, 1000]`. - fn kill_storage(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 1_569_000 picoseconds. - Weight::from_parts(1_690_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 963 - .saturating_add(Weight::from_parts(580_145, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) - } - /// Storage: `Skipped::Metadata` (r:0 w:0) - /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(p: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `52 + p * (69 ±0)` - // Estimated: `46 + p * (70 ±0)` - // Minimum execution time: 3_039_000 picoseconds. - Weight::from_parts(3_090_000, 0) - .saturating_add(Weight::from_parts(0, 46)) - // Standard Error: 2_007 - .saturating_add(Weight::from_parts(1_269_045, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) - .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) - } -} diff --git a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/mod.rs b/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/mod.rs deleted file mode 100644 index 234ce34bf420..000000000000 --- a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod pallet_glutton; diff --git a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/pallet_glutton.rs b/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/pallet_glutton.rs deleted file mode 100644 index f43a48782656..000000000000 --- a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/weights/pallet_glutton.rs +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Autogenerated weights for `pallet_glutton` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("glutton-kusama-dev-1300")`, DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot-parachain -// benchmark -// pallet -// --chain=glutton-kusama-dev-1300 -// --wasm-execution=compiled -// --pallet=pallet_glutton -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/glutton/glutton-kusama/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_glutton`. -pub struct WeightInfo(PhantomData); -impl pallet_glutton::WeightInfo for WeightInfo { - /// Storage: `Glutton::TrashDataCount` (r:1 w:1) - /// Proof: `Glutton::TrashDataCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Glutton::TrashData` (r:0 w:1000) - /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - fn initialize_pallet_grow(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `87` - // Estimated: `1489` - // Minimum execution time: 8_925_000 picoseconds. - Weight::from_parts(9_186_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - // Standard Error: 3_091 - .saturating_add(Weight::from_parts(9_666_196, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - } - /// Storage: `Glutton::TrashDataCount` (r:1 w:1) - /// Proof: `Glutton::TrashDataCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Glutton::TrashData` (r:0 w:1000) - /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. - fn initialize_pallet_shrink(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `120` - // Estimated: `1489` - // Minimum execution time: 8_924_000 picoseconds. - Weight::from_parts(8_963_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - // Standard Error: 1_202 - .saturating_add(Weight::from_parts(1_139_080, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - } - /// The range of component `i` is `[0, 100000]`. - fn waste_ref_time_iter(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 708_000 picoseconds. - Weight::from_parts(1_698_031, 0) - .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 12 - .saturating_add(Weight::from_parts(106_500, 0).saturating_mul(i.into())) - } - /// Storage: `Glutton::TrashData` (r:5000 w:0) - /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) - /// The range of component `i` is `[0, 5000]`. - fn waste_proof_size_some(i: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `119115 + i * (1022 ±0)` - // Estimated: `990 + i * (3016 ±0)` - // Minimum execution time: 698_000 picoseconds. - Weight::from_parts(970_000, 0) - .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 4_022 - .saturating_add(Weight::from_parts(6_320_519, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 3016).saturating_mul(i.into())) - } - /// Storage: `Glutton::Storage` (r:1 w:0) - /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Glutton::Compute` (r:1 w:0) - /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Glutton::TrashData` (r:1737 w:0) - /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) - fn on_idle_high_proof_waste() -> Weight { - // Proof Size summary in bytes: - // Measured: `1900498` - // Estimated: `5239782` - // Minimum execution time: 100_079_897_000 picoseconds. - Weight::from_parts(100_515_306_000, 0) - .saturating_add(Weight::from_parts(0, 5239782)) - .saturating_add(T::DbWeight::get().reads(1739)) - } - /// Storage: `Glutton::Storage` (r:1 w:0) - /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Glutton::Compute` (r:1 w:0) - /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Glutton::TrashData` (r:5 w:0) - /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) - fn on_idle_low_proof_waste() -> Weight { - // Proof Size summary in bytes: - // Measured: `9548` - // Estimated: `16070` - // Minimum execution time: 100_237_009_000 picoseconds. - Weight::from_parts(100_472_213_000, 0) - .saturating_add(Weight::from_parts(0, 16070)) - .saturating_add(T::DbWeight::get().reads(7)) - } - /// Storage: `Glutton::Storage` (r:1 w:0) - /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `Glutton::Compute` (r:1 w:0) - /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn empty_on_idle() -> Weight { - // Proof Size summary in bytes: - // Measured: `87` - // Estimated: `1493` - // Minimum execution time: 5_120_000 picoseconds. - Weight::from_parts(5_262_000, 0) - .saturating_add(Weight::from_parts(0, 1493)) - .saturating_add(T::DbWeight::get().reads(2)) - } - /// Storage: `Glutton::Compute` (r:0 w:1) - /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set_compute() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_947_000 picoseconds. - Weight::from_parts(6_171_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: `Glutton::Storage` (r:0 w:1) - /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - fn set_storage() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_964_000 picoseconds. - Weight::from_parts(6_166_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) - } -} diff --git a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs b/cumulus/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs deleted file mode 100644 index a09880f8cdc9..000000000000 --- a/cumulus/parachains/runtimes/glutton/glutton-kusama/src/xcm_config.rs +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (C) 2023 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, ParachainInfo, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, -}; -use frame_support::{ - match_types, parameter_types, - traits::{Everything, Nothing}, - weights::Weight, -}; -use xcm::latest::prelude::*; -use xcm_builder::{ - AllowExplicitUnpaidExecutionFrom, FixedWeightBounds, ParentAsSuperuser, ParentIsPreset, - SovereignSignedViaLocation, -}; - -parameter_types! { - pub const KusamaLocation: MultiLocation = MultiLocation::parent(); - pub const KusamaNetwork: Option = Some(NetworkId::Kusama); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); -} - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// bias the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, RuntimeOrigin>, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, -); - -match_types! { - pub type JustTheParent: impl Contains = { MultiLocation { parents:1, interior: Here } }; -} - -parameter_types! { - // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; -} - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = (); // sending XCM not supported - type AssetTransactor = (); // balances not supported - type OriginConverter = XcmOriginToTransactDispatchOrigin; - type IsReserve = (); // balances not supported - type IsTeleporter = (); // balances not supported - type UniversalLocation = UniversalLocation; - type Barrier = AllowExplicitUnpaidExecutionFrom; - type Weigher = FixedWeightBounds; // balances not supported - type Trader = (); // balances not supported - type ResponseHandler = (); // Don't handle responses for now. - type AssetTrap = (); // don't trap for now - type AssetClaims = (); // don't claim for now - type SubscriptionService = (); // don't handle subscriptions for now - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = xcm_executor::XcmExecutor; -} diff --git a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml deleted file mode 100644 index 49a72c7ea35e..000000000000 --- a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml +++ /dev/null @@ -1,64 +0,0 @@ -[package] -name = "seedling-runtime" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-solo-to-para = { path = "../../../../pallets/solo-to-para", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system/std", - "pallet-balances/std", - "pallet-sudo/std", - "sp-api/std", - "sp-block-builder/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-solo-to-para/std", - "cumulus-primitives-core/std", - "parachain-info/std", - "parachains-common/std", - "substrate-wasm-builder", -] diff --git a/cumulus/parachains/runtimes/starters/seedling/build.rs b/cumulus/parachains/runtimes/starters/seedling/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/starters/seedling/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs deleted file mode 100644 index 87575e5389dd..000000000000 --- a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright 2019-2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! # Seedling Runtime -//! -//! Seedling is a parachain meant to help parachain auction winners migrate a blockchain from -//! another consensus system into the consensus system of a given Relay Chain. - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::OpaqueMetadata; -use sp_runtime::{ - create_runtime_str, generic, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -// A few exports that help ease life for downstream crates. -pub use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{IsInVec, Randomness}, - weights::{ - constants::{ - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND, - }, - IdentityFee, Weight, - }, - StorageValue, -}; -use frame_system::limits::{BlockLength, BlockWeights}; -use parachains_common::{AccountId, Signature}; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; -pub use sp_runtime::{Perbill, Permill}; - -/// This runtime version. -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("seedling"), - impl_name: create_runtime_str!("seedling"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 2, - state_version: 0, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers. -/// This is used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used -/// by Operational extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for .5 seconds of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 42; -} -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type WeightInfo = pallet_sudo::weights::SubstrateWeight; -} - -impl cumulus_pallet_solo_to_para::Config for Runtime { - type RuntimeEvent = RuntimeEvent; -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = cumulus_pallet_solo_to_para::Pallet; - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = (); - type DmpMessageHandler = (); - type ReservedDmpWeight = (); - type XcmpMessageHandler = (); - type ReservedXcmpWeight = (); - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -construct_runtime! { - pub enum Runtime - { - System: frame_system::{Pallet, Call, Storage, Config, Event}, - Sudo: pallet_sudo::{Pallet, Call, Storage, Config, Event}, - - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - }, - ParachainInfo: parachain_info::{Pallet, Storage, Config}, - SoloToPara: cumulus_pallet_solo_to_para::{Pallet, Call, Storage, Event}, - } -} - -/// Index of a transaction in the chain. -pub type Nonce = u32; -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; -/// An index to a block. -pub type BlockNumber = u32; -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - pallet_sudo::CheckOnlySudoAccount, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, ->; - -impl_runtime_apis! { - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic( - extrinsic: ::Extrinsic, - ) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn decode_session_keys(_: Vec) -> Option, sp_core::crypto::KeyTypeId)>> { - Some(Vec::new()) - } - - fn generate_session_keys(_: Option>) -> Vec { - Vec::new() - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - _: &Block, - _: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - sp_inherents::CheckInherentsResult::new() - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = Executive, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/starters/shell/Cargo.toml b/cumulus/parachains/runtimes/starters/shell/Cargo.toml deleted file mode 100644 index 50e05f7b17cc..000000000000 --- a/cumulus/parachains/runtimes/starters/shell/Cargo.toml +++ /dev/null @@ -1,73 +0,0 @@ -[package] -name = "shell-runtime" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true , branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system/std", - "sp-api/std", - "sp-block-builder/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-primitives-core/std", - "parachain-info/std", - "parachains-common/std", - "substrate-wasm-builder", -] -try-runtime = [ - "frame-executive/try-runtime", - "frame-try-runtime/try-runtime", -] diff --git a/cumulus/parachains/runtimes/starters/shell/build.rs b/cumulus/parachains/runtimes/starters/shell/build.rs deleted file mode 100644 index 256e9fb765b7..000000000000 --- a/cumulus/parachains/runtimes/starters/shell/build.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/starters/shell/src/lib.rs b/cumulus/parachains/runtimes/starters/shell/src/lib.rs deleted file mode 100644 index aa14c83fef0b..000000000000 --- a/cumulus/parachains/runtimes/starters/shell/src/lib.rs +++ /dev/null @@ -1,361 +0,0 @@ -// Copyright 2019-2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! # Shell Runtime -//! -//! The Shell runtime defines a minimal parachain. It can listen for a downward message authorizing -//! an upgrade into another parachain. -//! -//! Generally (so far) only used as the first parachain on a Relay. - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod xcm_config; - -use codec::{Decode, Encode}; -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use frame_support::unsigned::TransactionValidityError; -use scale_info::TypeInfo; -use sp_api::impl_runtime_apis; -use sp_core::OpaqueMetadata; -use sp_runtime::{ - create_runtime_str, generic, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -// A few exports that help ease life for downstream crates. -pub use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{Everything, IsInVec, Randomness}, - weights::{ - constants::{ - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND, - }, - IdentityFee, Weight, - }, - StorageValue, -}; -use frame_system::limits::{BlockLength, BlockWeights}; -use parachains_common::{AccountId, Signature}; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; -pub use sp_runtime::{Perbill, Permill}; - -/// This runtime version. -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("shell"), - impl_name: create_runtime_str!("shell"), - authoring_version: 1, - spec_version: 2, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 1, - state_version: 0, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers. -/// This is used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used -/// by Operational extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for .5 seconds of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 42; -} - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - // We do anything the parent chain tells us in this runtime. - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(2); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = (); - type DmpMessageHandler = cumulus_pallet_xcm::UnlimitedDmpExecution; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = (); - type ReservedXcmpWeight = (); - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -construct_runtime! { - pub enum Runtime - { - System: frame_system::{Pallet, Call, Storage, Config, Event}, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - }, - ParachainInfo: parachain_info::{Pallet, Storage, Config}, - - // DMP handler. - CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Storage, Event, Origin}, - } -} - -/// Simple implementation which fails any transaction which is signed. -#[derive(Eq, PartialEq, Clone, Default, sp_core::RuntimeDebug, Encode, Decode, TypeInfo)] -pub struct DisallowSigned; -impl sp_runtime::traits::SignedExtension for DisallowSigned { - const IDENTIFIER: &'static str = "DisallowSigned"; - type AccountId = AccountId; - type Call = RuntimeCall; - type AdditionalSigned = (); - type Pre = (); - fn additional_signed( - &self, - ) -> sp_std::result::Result<(), sp_runtime::transaction_validity::TransactionValidityError> { - Ok(()) - } - fn pre_dispatch( - self, - who: &Self::AccountId, - call: &Self::Call, - info: &DispatchInfoOf, - len: usize, - ) -> Result { - self.validate(who, call, info, len).map(|_| ()) - } - fn validate( - &self, - _who: &Self::AccountId, - _call: &Self::Call, - _info: &sp_runtime::traits::DispatchInfoOf, - _len: usize, - ) -> TransactionValidity { - let i = sp_runtime::transaction_validity::InvalidTransaction::BadProof; - Err(sp_runtime::transaction_validity::TransactionValidityError::Invalid(i)) - } -} - -/// Index of a transaction in the chain. -pub type Nonce = u32; -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; -/// An index to a block. -pub type BlockNumber = u32; -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = DisallowSigned; -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, ->; - -impl_runtime_apis! { - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic( - extrinsic: ::Extrinsic, - ) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn decode_session_keys(_: Vec) -> Option, sp_core::crypto::KeyTypeId)>> { - Some(Vec::new()) - } - - fn generate_session_keys(_: Option>) -> Vec { - Vec::new() - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - _: &Block, - _: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - sp_inherents::CheckInherentsResult::new() - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = Executive, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs b/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs deleted file mode 100644 index b1fcfc5c8f66..000000000000 --- a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, ParachainInfo, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, -}; -use frame_support::{ - match_types, parameter_types, - traits::{Everything, Nothing}, - weights::Weight, -}; -use xcm::latest::prelude::*; -use xcm_builder::{ - AllowExplicitUnpaidExecutionFrom, FixedWeightBounds, ParentAsSuperuser, ParentIsPreset, - SovereignSignedViaLocation, -}; - -parameter_types! { - pub const RococoLocation: MultiLocation = MultiLocation::parent(); - pub const RococoNetwork: Option = Some(NetworkId::Rococo); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); -} - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// bias the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, RuntimeOrigin>, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, -); - -match_types! { - pub type JustTheParent: impl Contains = { MultiLocation { parents:1, interior: Here } }; -} - -parameter_types! { - // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; -} - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = (); // sending XCM not supported - type AssetTransactor = (); // balances not supported - type OriginConverter = XcmOriginToTransactDispatchOrigin; - type IsReserve = (); // balances not supported - type IsTeleporter = (); // balances not supported - type UniversalLocation = UniversalLocation; - type Barrier = AllowExplicitUnpaidExecutionFrom; - type Weigher = FixedWeightBounds; // balances not supported - type Trader = (); // balances not supported - type ResponseHandler = (); // Don't handle responses for now. - type AssetTrap = (); // don't trap for now - type AssetClaims = (); // don't claim for now - type SubscriptionService = (); // don't handle subscriptions for now - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = xcm_executor::XcmExecutor; -} diff --git a/cumulus/parachains/runtimes/test-utils/Cargo.toml b/cumulus/parachains/runtimes/test-utils/Cargo.toml deleted file mode 100644 index a2b5031ba25f..000000000000 --- a/cumulus/parachains/runtimes/test-utils/Cargo.toml +++ /dev/null @@ -1,74 +0,0 @@ -[package] -name = "parachains-runtimes-test-utils" -version = "1.0.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Utils for Runtimes testing" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { path = "../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../pallets/xcmp-queue", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../pallets/dmp-queue", default-features = false } -pallet-collator-selection = { path = "../../../pallets/collator-selection", default-features = false } -parachains-common = { path = "../../common", default-features = false } -assets-common = { path = "../assets/common", default-features = false } -cumulus-primitives-core = { path = "../../../primitives/core", default-features = false } -cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent", default-features = false } -cumulus-test-relay-sproof-builder = { path = "../../../test/relay-sproof-builder", default-features = false } -parachain-info = { path = "../../../parachains/pallets/parachain-info", default-features = false } - -# Polkadot -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -[dev-dependencies] -hex-literal = "0.4.1" - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -default = [ "std" ] -std = [ - "cumulus-pallet-parachain-system/std", - "cumulus-primitives-core/std", - "cumulus-test-relay-sproof-builder/std", - "cumulus-primitives-parachain-inherent/std", - "frame-support/std", - "frame-system/std", - "pallet-assets/std", - "pallet-balances/std", - "cumulus-pallet-parachain-system/std", - "pallet-collator-selection/std", - "pallet-session/std", - "assets-common/std", - "parachains-common/std", - "parachain-info/std", - "polkadot-parachain/std", - "sp-consensus-aura/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", - "xcm/std", - "xcm-executor/std", - "pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-pallet-dmp-queue/std", -] diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs deleted file mode 100644 index 5623ce460697..000000000000 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ /dev/null @@ -1,484 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use sp_std::marker::PhantomData; - -use codec::DecodeLimit; -use cumulus_primitives_core::{AbridgedHrmpChannel, ParaId, PersistedValidationData}; -use cumulus_primitives_parachain_inherent::ParachainInherentData; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use frame_support::{ - dispatch::{DispatchResult, RawOrigin, UnfilteredDispatchable}, - inherent::{InherentData, ProvideInherent}, - traits::OriginTrait, - weights::Weight, -}; -use parachains_common::AccountId; -use polkadot_parachain::primitives::{HrmpChannelId, RelayChainBlockNumber, XcmpMessageFormat}; -use sp_consensus_aura::AURA_ENGINE_ID; -use sp_core::Encode; -use sp_runtime::{BuildStorage, Digest, DigestItem}; -use xcm::{ - latest::{MultiAsset, MultiLocation, XcmContext, XcmHash}, - prelude::*, - VersionedXcm, MAX_XCM_DECODE_DEPTH, -}; -use xcm_executor::{traits::TransactAsset, Assets}; - -pub mod test_cases; - -pub type BalanceOf = ::Balance; -pub type AccountIdOf = ::AccountId; -pub type ValidatorIdOf = ::ValidatorId; -pub type SessionKeysOf = ::Keys; - -pub struct CollatorSessionKeys< - Runtime: frame_system::Config + pallet_balances::Config + pallet_session::Config, -> { - collator: AccountIdOf, - validator: ValidatorIdOf, - key: SessionKeysOf, -} - -impl - CollatorSessionKeys -{ - pub fn new( - collator: AccountIdOf, - validator: ValidatorIdOf, - key: SessionKeysOf, - ) -> Self { - Self { collator, validator, key } - } - pub fn collators(&self) -> Vec> { - vec![self.collator.clone()] - } - - pub fn session_keys( - &self, - ) -> Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)> { - vec![(self.collator.clone(), self.validator.clone(), self.key.clone())] - } -} - -// Basic builder based on balances, collators and pallet_sessopm -pub struct ExtBuilder< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, -> { - // endowed accounts with balances - balances: Vec<(AccountIdOf, BalanceOf)>, - // collators to test block prod - collators: Vec>, - // keys added to pallet session - keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, - // safe xcm version for pallet_xcm - safe_xcm_version: Option, - // para id - para_id: Option, - _runtime: PhantomData, -} - -impl< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, - > Default for ExtBuilder -{ - fn default() -> ExtBuilder { - ExtBuilder { - balances: vec![], - collators: vec![], - keys: vec![], - safe_xcm_version: None, - para_id: None, - _runtime: PhantomData, - } - } -} - -impl< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, - > ExtBuilder -{ - pub fn with_balances( - mut self, - balances: Vec<(AccountIdOf, BalanceOf)>, - ) -> Self { - self.balances = balances; - self - } - pub fn with_collators(mut self, collators: Vec>) -> Self { - self.collators = collators; - self - } - - pub fn with_session_keys( - mut self, - keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, - ) -> Self { - self.keys = keys; - self - } - - pub fn with_tracing(self) -> Self { - frame_support::sp_tracing::try_init_simple(); - self - } - - pub fn with_safe_xcm_version(mut self, safe_xcm_version: XcmVersion) -> Self { - self.safe_xcm_version = Some(safe_xcm_version); - self - } - - pub fn with_para_id(mut self, para_id: ParaId) -> Self { - self.para_id = Some(para_id); - self - } - - pub fn build(self) -> sp_io::TestExternalities - where - Runtime: - pallet_collator_selection::Config + pallet_balances::Config + pallet_session::Config, - ValidatorIdOf: From>, - { - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - - pallet_xcm::GenesisConfig:: { - safe_xcm_version: self.safe_xcm_version, - ..Default::default() - } - .assimilate_storage(&mut t) - .unwrap(); - - if let Some(para_id) = self.para_id { - parachain_info::GenesisConfig:: { - parachain_id: para_id, - ..Default::default() - } - .assimilate_storage(&mut t) - .unwrap(); - } - - pallet_balances::GenesisConfig:: { balances: self.balances } - .assimilate_storage(&mut t) - .unwrap(); - - pallet_collator_selection::GenesisConfig:: { - invulnerables: self.collators.clone(), - candidacy_bond: Default::default(), - desired_candidates: Default::default(), - } - .assimilate_storage(&mut t) - .unwrap(); - - pallet_session::GenesisConfig:: { keys: self.keys } - .assimilate_storage(&mut t) - .unwrap(); - - let mut ext = sp_io::TestExternalities::new(t); - - ext.execute_with(|| { - frame_system::Pallet::::set_block_number(1u32.into()); - }); - - ext - } -} - -pub struct RuntimeHelper(PhantomData); -/// Utility function that advances the chain to the desired block number. -/// If an author is provided, that author information is injected to all the blocks in the meantime. -impl RuntimeHelper -where - AccountIdOf: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, -{ - pub fn run_to_block(n: u32, author: Option) { - while frame_system::Pallet::::block_number() < n.into() { - // Set the new block number and author - match author { - Some(ref author) => { - let pre_digest = Digest { - logs: vec![DigestItem::PreRuntime(AURA_ENGINE_ID, author.encode())], - }; - frame_system::Pallet::::reset_events(); - frame_system::Pallet::::initialize( - &(frame_system::Pallet::::block_number() + 1u32.into()), - &frame_system::Pallet::::parent_hash(), - &pre_digest, - ); - }, - None => { - frame_system::Pallet::::set_block_number( - frame_system::Pallet::::block_number() + 1u32.into(), - ); - }, - } - } - } - - pub fn root_origin() -> ::RuntimeOrigin { - ::RuntimeOrigin::root() - } - - pub fn origin_of( - account_id: AccountIdOf, - ) -> ::RuntimeOrigin { - ::RuntimeOrigin::signed(account_id.into()) - } -} - -impl RuntimeHelper { - pub fn do_transfer( - from: MultiLocation, - to: MultiLocation, - (asset, amount): (MultiLocation, u128), - ) -> Result { - ::transfer_asset( - &MultiAsset { id: Concrete(asset), fun: Fungible(amount) }, - &from, - &to, - // We aren't able to track the XCM that initiated the fee deposit, so we create a - // fake message hash here - &XcmContext::with_message_id([0; 32]), - ) - } -} - -impl RuntimeHelper { - pub fn do_teleport_assets( - origin: ::RuntimeOrigin, - dest: MultiLocation, - beneficiary: MultiLocation, - (asset, amount): (MultiLocation, u128), - open_hrmp_channel: Option<(u32, u32)>, - ) -> DispatchResult - where - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - { - // open hrmp (if needed) - if let Some((source_para_id, target_para_id)) = open_hrmp_channel { - mock_open_hrmp_channel::( - source_para_id.into(), - target_para_id.into(), - ); - } - - // do teleport - >::teleport_assets( - origin, - Box::new(dest.into()), - Box::new(beneficiary.into()), - Box::new((Concrete(asset), amount).into()), - 0, - ) - } -} - -impl - RuntimeHelper -{ - pub fn execute_as_governance(call: Vec, require_weight_at_most: Weight) -> Outcome { - // prepare xcm as governance will do - let xcm = Xcm(vec![ - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - Transact { - origin_kind: OriginKind::Superuser, - require_weight_at_most, - call: call.into(), - }, - ]); - - // execute xcm as parent origin - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - <::XcmExecutor>::execute_xcm( - MultiLocation::parent(), - xcm, - hash, - Self::xcm_max_weight(XcmReceivedFrom::Parent), - ) - } -} - -pub enum XcmReceivedFrom { - Parent, - Sibling, -} - -impl RuntimeHelper { - pub fn xcm_max_weight(from: XcmReceivedFrom) -> Weight { - use frame_support::traits::Get; - match from { - XcmReceivedFrom::Parent => ParachainSystem::ReservedDmpWeight::get(), - XcmReceivedFrom::Sibling => ParachainSystem::ReservedXcmpWeight::get(), - } - } -} - -impl RuntimeHelper { - pub fn assert_pallet_xcm_event_outcome( - unwrap_pallet_xcm_event: &Box) -> Option>>, - assert_outcome: fn(Outcome), - ) { - let outcome = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_xcm_event(e.event.encode())) - .find_map(|e| match e { - pallet_xcm::Event::Attempted { outcome } => Some(outcome), - _ => None, - }) - .expect("No `pallet_xcm::Event::Attempted(outcome)` event found!"); - - assert_outcome(outcome); - } -} - -impl RuntimeHelper { - pub fn xcmp_queue_message_sent( - unwrap_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, - ) -> Option { - >::events() - .into_iter() - .filter_map(|e| unwrap_xcmp_queue_event(e.event.encode())) - .find_map(|e| match e { - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { message_hash } => - Some(message_hash), - _ => None, - }) - } -} - -pub fn assert_metadata( - asset_id: impl Into + Copy, - expected_name: &str, - expected_symbol: &str, - expected_decimals: u8, -) where - Fungibles: frame_support::traits::tokens::fungibles::metadata::Inspect - + frame_support::traits::tokens::fungibles::Inspect, -{ - assert_eq!(Fungibles::name(asset_id.into()), Vec::from(expected_name),); - assert_eq!(Fungibles::symbol(asset_id.into()), Vec::from(expected_symbol),); - assert_eq!(Fungibles::decimals(asset_id.into()), expected_decimals); -} - -pub fn assert_total( - asset_id: impl Into + Copy, - expected_total_issuance: impl Into, - expected_active_issuance: impl Into, -) where - Fungibles: frame_support::traits::tokens::fungibles::metadata::Inspect - + frame_support::traits::tokens::fungibles::Inspect, -{ - assert_eq!(Fungibles::total_issuance(asset_id.into()), expected_total_issuance.into()); - assert_eq!(Fungibles::active_issuance(asset_id.into()), expected_active_issuance.into()); -} - -/// Helper function which emulates opening HRMP channel which is needed for `XcmpQueue` to pass -pub fn mock_open_hrmp_channel< - C: cumulus_pallet_parachain_system::Config, - T: ProvideInherent>, ->( - sender: ParaId, - recipient: ParaId, -) { - let n = 1_u32; - let mut sproof_builder = RelayStateSproofBuilder { - para_id: sender, - hrmp_egress_channel_index: Some(vec![recipient]), - ..Default::default() - }; - sproof_builder.hrmp_channels.insert( - HrmpChannelId { sender, recipient }, - AbridgedHrmpChannel { - max_capacity: 10, - max_total_size: 10_000_000_u32, - max_message_size: 10_000_000_u32, - msg_count: 0, - total_size: 0_u32, - mqc_head: None, - }, - ); - - let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof(); - let vfp = PersistedValidationData { - relay_parent_number: n as RelayChainBlockNumber, - relay_parent_storage_root, - ..Default::default() - }; - // It is insufficient to push the validation function params - // to storage; they must also be included in the inherent data. - let inherent_data = { - let mut inherent_data = InherentData::default(); - let system_inherent_data = ParachainInherentData { - validation_data: vfp, - relay_chain_state, - downward_messages: Default::default(), - horizontal_messages: Default::default(), - }; - inherent_data - .put_data( - cumulus_primitives_parachain_inherent::INHERENT_IDENTIFIER, - &system_inherent_data, - ) - .expect("failed to put VFP inherent"); - inherent_data - }; - - // execute the block - T::create_inherent(&inherent_data) - .expect("got an inherent") - .dispatch_bypass_filter(RawOrigin::None.into()) - .expect("dispatch succeeded"); -} - -impl - RuntimeHelper -{ - pub fn take_xcm(sent_to_para_id: ParaId) -> Option> { - match HrmpChannelSource::take_outbound_messages(10)[..] { - [(para_id, ref mut xcm_message_data)] if para_id.eq(&sent_to_para_id.into()) => { - let mut xcm_message_data = &xcm_message_data[..]; - // decode - let _ = XcmpMessageFormat::decode_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut xcm_message_data, - ) - .expect("valid format"); - VersionedXcm::<()>::decode_with_depth_limit( - MAX_XCM_DECODE_DEPTH, - &mut xcm_message_data, - ) - .map(|x| Some(x)) - .expect("result with xcm") - }, - _ => return None, - } - } -} diff --git a/cumulus/parachains/runtimes/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/test-utils/src/test_cases.rs deleted file mode 100644 index 7d5d9327c002..000000000000 --- a/cumulus/parachains/runtimes/test-utils/src/test_cases.rs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Module contains predefined test-case scenarios for `Runtime` with common functionality. - -use crate::{AccountIdOf, CollatorSessionKeys, ExtBuilder, RuntimeHelper, ValidatorIdOf}; -use codec::Encode; -use frame_support::{assert_ok, traits::Get}; - -/// Test-case makes sure that `Runtime` can change storage constant via governance-like call -pub fn change_storage_constant_by_governance_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - runtime_call_encode: Box) -> Vec>, - storage_constant_key_value: fn() -> (Vec, StorageConstantType), - new_storage_constant_value: fn(&StorageConstantType) -> StorageConstantType, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_dmp_queue::Config - + cumulus_pallet_parachain_system::Config, - ValidatorIdOf: From>, - StorageConstant: Get, - StorageConstantType: Encode + PartialEq + std::fmt::Debug, -{ - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - let (storage_constant_key, storage_constant_init_value): ( - Vec, - StorageConstantType, - ) = storage_constant_key_value(); - - // check delivery reward constant before (not stored yet, just as default value is used) - assert_eq!(StorageConstant::get(), storage_constant_init_value); - assert_eq!(sp_io::storage::get(&storage_constant_key), None); - - let new_storage_constant_value = - new_storage_constant_value(&storage_constant_init_value); - assert_ne!(new_storage_constant_value, storage_constant_init_value); - - // encode `set_storage` call - let set_storage_call = - runtime_call_encode(frame_system::Call::::set_storage { - items: vec![( - storage_constant_key.clone(), - new_storage_constant_value.encode(), - )], - }); - - // estimate - storing just 1 value - use frame_system::WeightInfo; - let require_weight_at_most = - ::SystemWeightInfo::set_storage(1); - - // execute XCM with Transact to `set_storage` as governance does - assert_ok!(RuntimeHelper::::execute_as_governance( - set_storage_call, - require_weight_at_most - ) - .ensure_complete()); - - // check delivery reward constant after (stored) - assert_eq!(StorageConstant::get(), new_storage_constant_value); - assert_eq!( - sp_io::storage::get(&storage_constant_key), - Some(new_storage_constant_value.encode().into()) - ); - }) -} diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml deleted file mode 100644 index abe7392b6e65..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ /dev/null @@ -1,170 +0,0 @@ -[package] -name = "penpal-runtime" -version = "0.9.27" -authors = ["Anonymous"] -description = "A parachain for communication back and forth with XCM of assets and uniques." -license = "Unlicense" -homepage = "https://substrate.io" -repository = "https://github.com/paritytech/cumulus/" -edition = "2021" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -smallvec = "1.11.0" - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-benchmarking = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-try-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, optional = true, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-authorship = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-asset-tx-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-session-benchmarking = {path = "../../../../pallets/session-benchmarking", default-features = false, version = "3.0.0"} -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } -parachain-info = { path = "../../../../parachains/pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../common", default-features = false } - -[features] -default = [ - "std", -] -std = [ - "codec/std", - "log/std", - "scale-info/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-aura/std", - "pallet-authorship/std", - "pallet-balances/std", - "pallet-collator-selection/std", - "pallet-session/std", - "pallet-sudo/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-assets/std", - "pallet-asset-tx-payment/std", - "pallet-xcm/std", - "polkadot-primitives/std", - "parachain-info/std", - "parachains-common/std", - "polkadot-parachain/std", - "polkadot-runtime-common/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "substrate-wasm-builder", -] - -runtime-benchmarks = [ - "hex-literal", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-assets/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-collator-selection/runtime-benchmarks", - "pallet-sudo/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", -] - -try-runtime = [ - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-session/try-runtime", - "pallet-sudo/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-assets/try-runtime", - "pallet-asset-tx-payment/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", -] diff --git a/cumulus/parachains/runtimes/testing/penpal/build.rs b/cumulus/parachains/runtimes/testing/penpal/build.rs deleted file mode 100644 index 256e9fb765b7..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/build.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs deleted file mode 100644 index 3c2c53a98783..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs +++ /dev/null @@ -1,846 +0,0 @@ -// Copyright 2019-2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! The PenPal runtime is designed as a test runtime that can be created with an arbitrary `ParaId`, -//! such that multiple instances of the parachain can be on the same parent relay. Ensure that you -//! have enough nodes running to support this or you will get scheduling errors. -//! -//! The PenPal runtime's primary use is for testing interactions between System parachains and -//! other chains that are not trusted teleporters. - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -mod weights; -pub mod xcm_config; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - pallet_prelude::Weight, - parameter_types, - traits::{AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, Everything}, - weights::{ - constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, FeePolynomial, - WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial, - }, - PalletId, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, EnsureSigned, -}; -use smallvec::smallvec; -use sp_api::impl_runtime_apis; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; -pub use sp_runtime::{traits::ConvertInto, MultiAddress, Perbill, Permill}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; -use xcm_config::{AssetsToBlockAuthor, XcmConfig, XcmOriginToTransactDispatchOrigin}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -// XCM Imports -use parachains_common::{AccountId, Signature}; -use xcm::latest::prelude::BodyId; -use xcm_executor::XcmExecutor; - -/// Balance of an account. -pub type Balance = u128; - -/// Index of a transaction in the chain. -pub type Nonce = u32; - -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; - -/// An index to a block. -pub type BlockNumber = u32; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Block header type as expected by this runtime. -pub type Header = generic::Header; - -/// Block type as expected by this runtime. -pub type Block = generic::Block; - -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; - -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; - -// Id used for identifying assets. -pub type AssetId = u32; - -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_asset_tx_payment::ChargeAssetTxPayment, -); - -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -pub type Migrations = ( - pallet_balances::migration::MigrateToTrackInactive, - pallet_collator_selection::migration::v1::MigrateToV1, -); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the -/// node's balance type. -/// -/// This should typically create a mapping between the following ranges: -/// - `[0, MAXIMUM_BLOCK_WEIGHT]` -/// - `[Balance::min, Balance::max]` -/// -/// Yet, it can be used for any other sort of change to weight-fee. Some examples being: -/// - Setting it to `0` will essentially disable the weight fee. -/// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. -pub struct WeightToFee; -impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } -} - -/// Maps the reference time component of `Weight` to a fee. -pub struct RefTimeToFee; -impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - let p = MILLIUNIT / 10; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} - -/// Maps the proof size component of `Weight` to a fee. -pub struct ProofSizeToFee; -impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = MILLIUNIT / 10; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} -/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know -/// the specifics of the runtime. They can then be made to be agnostic over specific formats -/// of data like extrinsics, allowing for them to continue syncing the network through upgrades -/// to even the core data structures. -pub mod opaque { - use super::*; - use sp_runtime::{generic, traits::BlakeTwo256}; - - pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; - /// Opaque block header type. - pub type Header = generic::Header; - /// Opaque block type. - pub type Block = generic::Block; - /// Opaque block identifier type. - pub type BlockId = generic::BlockId; -} - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("penpal-parachain"), - impl_name: create_runtime_str!("penpal-parachain"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 1, - state_version: 1, -}; - -/// This determines the average expected block time that we are targeting. -/// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`. -/// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked -/// up by `pallet_aura` to implement `fn slot_duration()`. -/// -/// Change this to adjust the block time. -pub const MILLISECS_PER_BLOCK: u64 = 12000; - -// NOTE: Currently it is not possible to change the slot duration after the chain has started. -// Attempting to do so will brick block production. -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - -// Time is measured by number of blocks. -pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); -pub const HOURS: BlockNumber = MINUTES * 60; -pub const DAYS: BlockNumber = HOURS * 24; - -// Unit = the base number of indivisible units for balances -pub const UNIT: Balance = 1_000_000_000_000; -pub const MILLIUNIT: Balance = 1_000_000_000; -pub const MICROUNIT: Balance = 1_000_000; - -/// The existential deposit. Set to 1/10 of the Connected Relay Chain. -pub const EXISTENTIAL_DEPOSIT: Balance = MILLIUNIT; - -/// We assume that ~5% of the block weight is consumed by `on_initialize` handlers. This is -/// used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); - -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used by -/// `Operational` extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); - -/// We allow for 0.5 of a second of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - - // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. - // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the - // `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize - // the lazy contract deletion. - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u16 = 42; -} - -// Configure FRAME pallets to include in runtime. - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; - /// What to do if a new account is created. - type OnNewAccount = (); - /// What to do if an account is fully reaped from the system. - type OnKilledAccount = (); - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// The basic call filter to use in dispatchable. - type BaseCallFilter = Everything; - /// Weight information for the extrinsics of this pallet. - type SystemWeightInfo = (); - /// Block & extrinsics weights: base values and limits. - type BlockWeights = RuntimeBlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = RuntimeBlockLength; - /// This is used as an identifier of the chain. 42 is the generic substrate prefix. - type SS58Prefix = SS58Prefix; - /// The action to take on a Runtime Upgrade - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = (); -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = pallet_balances::weights::SubstrateWeight; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 10 * MICROUNIT; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -parameter_types! { - pub const AssetDeposit: Balance = 0; - pub const AssetAccountDeposit: Balance = 0; - pub const ApprovalDeposit: Balance = 0; - pub const AssetsStringLimit: u32 = 50; - pub const MetadataDepositBase: Balance = 0; - pub const MetadataDepositPerByte: Balance = 0; -} - -// /// We allow root and the Relay Chain council to execute privileged asset operations. -// pub type AssetsForceOrigin = -// EnsureOneOf, EnsureXcm>>; - -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = AssetId; - type AssetIdParameter = codec::Compact; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = EnsureRoot; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = pallet_assets::weights::SubstrateWeight; - type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type OutboundXcmpMessageSource = XcmpQueue; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EnsureRoot; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = (); - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = (); -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - pub const ExecutiveBody: BodyId = BodyId::Executive; -} - -// We allow root only to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EnsureRoot; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = (); -} - -impl pallet_asset_tx_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Fungibles = Assets; - type OnChargeAssetTransaction = pallet_asset_tx_payment::FungiblesAdapter< - pallet_assets::BalanceToAssetBalance, - AssetsToBlockAuthor, - >; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type WeightInfo = pallet_sudo::weights::SubstrateWeight; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - AssetTxPayment: pallet_asset_tx_payment::{Pallet, Event} = 12, - - // Collator support. The order of these 4 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // The main stage. - Assets: pallet_assets::{Pallet, Call, Storage, Event} = 50, - - Sudo: pallet_sudo::{Pallet, Call, Storage, Event, Config} = 255, - } -); - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_session, SessionBench::] - [pallet_sudo, Sudo] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, TrackedStorageKey}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime {} - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } - Ok(batches) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/cumulus/parachains/runtimes/testing/penpal/src/weights/block_weights.rs b/cumulus/parachains/runtimes/testing/penpal/src/weights/block_weights.rs deleted file mode 100644 index b2092d875c83..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/src/weights/block_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Importing a block with 0 Extrinsics. - pub const BlockExecutionWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::BlockExecutionWeight::get(); - - // At least 100 µs. - assert!( - w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 100 µs." - ); - // At most 50 ms. - assert!( - w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 50 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/testing/penpal/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/testing/penpal/src/weights/extrinsic_weights.rs deleted file mode 100644 index 332c3b324bb9..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/src/weights/extrinsic_weights.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, Weight}, - }; - - parameter_types! { - /// Executing a NO-OP `System::remarks` Extrinsic. - pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); - } - - #[cfg(test)] - mod test_weights { - use frame_support::weights::constants; - - /// Checks that the weight exists and is sane. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - let w = super::constants::ExtrinsicBaseWeight::get(); - - // At least 10 µs. - assert!( - w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, - "Weight should be at least 10 µs." - ); - // At most 1 ms. - assert!( - w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/testing/penpal/src/weights/mod.rs b/cumulus/parachains/runtimes/testing/penpal/src/weights/mod.rs deleted file mode 100644 index ed0b4dbcd47f..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/src/weights/mod.rs +++ /dev/null @@ -1,28 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Expose the auto generated weight files. - -pub mod block_weights; -pub mod extrinsic_weights; -pub mod paritydb_weights; -pub mod rocksdb_weights; - -pub use block_weights::constants::BlockExecutionWeight; -pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; -pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/testing/penpal/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/testing/penpal/src/weights/paritydb_weights.rs deleted file mode 100644 index 4338d928d807..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/src/weights/paritydb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights - /// are available for brave runtime engineers who may want to try this out as default. - pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::ParityDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/testing/penpal/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/testing/penpal/src/weights/rocksdb_weights.rs deleted file mode 100644 index 1d115d963fac..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/src/weights/rocksdb_weights.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2022 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -pub mod constants { - use frame_support::{ - parameter_types, - weights::{constants, RuntimeDbWeight}, - }; - - parameter_types! { - /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout - /// the runtime. - pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, - }; - } - - #[cfg(test)] - mod test_db_weights { - use super::constants::RocksDbWeight as W; - use frame_support::weights::constants; - - /// Checks that all weights exist and have sane values. - // NOTE: If this test fails but you are sure that the generated values are fine, - // you can delete it. - #[test] - fn sane() { - // At least 1 µs. - assert!( - W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Read weight should be at least 1 µs." - ); - assert!( - W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, - "Write weight should be at least 1 µs." - ); - // At most 1 ms. - assert!( - W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Read weight should be at most 1 ms." - ); - assert!( - W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, - "Write weight should be at most 1 ms." - ); - } - } -} diff --git a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs deleted file mode 100644 index 1825bea425d2..000000000000 --- a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ /dev/null @@ -1,355 +0,0 @@ -// Copyright 2019-2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Holds the XCM specific configuration that would otherwise be in lib.rs -//! -//! This configuration dictates how the Penpal chain will communicate with other chains. -//! -//! One of the main uses of the penpal chain will be to be a benefactor of reserve asset transfers -//! with Asset Hub as the reserve. At present no derivative tokens are minted on receipt of a -//! `ReserveAssetTransferDeposited` message but that will but the intension will be to support this -//! soon. -use super::{ - AccountId, AllPalletsWithSystem, AssetId as AssetIdPalletAssets, Assets, Balance, Balances, - ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - WeightToFee, XcmpQueue, -}; -use core::marker::PhantomData; -use frame_support::{ - match_types, parameter_types, - traits::{ - fungibles::{self, Balanced, Credit}, - ConstU32, Contains, ContainsPair, Everything, Get, Nothing, - }, - weights::Weight, -}; -use frame_system::EnsureRoot; -use pallet_asset_tx_payment::HandleCredit; -use pallet_xcm::XcmPassthrough; -use polkadot_parachain::primitives::Sibling; -use polkadot_runtime_common::impls::ToAuthor; -use sp_runtime::traits::Zero; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, - ConvertedConcreteId, CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, - EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::JustTry, XcmExecutor}; - -parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = None; - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting assets on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports. - (), ->; - -/// Means for transacting assets besides the native currency on this chain. -pub type FungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - Assets, - // Use this currency when it is a fungible asset matching the given location or name: - ConvertedConcreteId< - AssetIdPalletAssets, - Balance, - AsPrefixedGeneralIndex, - JustTry, - >, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognized. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognized. - SiblingParachainAsNative, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; -} - -match_types! { - pub type ParentOrParentsExecutivePlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } - }; - pub type CommonGoodAssetsParachain: impl Contains = { - MultiLocation { parents: 1, interior: X1(Parachain(1000)) } - }; -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attemps to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Common Good Assets parachain, parent and its exec plurality get free - // execution - AllowExplicitUnpaidExecutionFrom<( - CommonGoodAssetsParachain, - ParentOrParentsExecutivePlurality, - )>, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -/// Type alias to conveniently refer to `frame_system`'s `Config::AccountId`. -pub type AccountIdOf = ::AccountId; - -/// Asset filter that allows all assets from a certain location. -pub struct AssetsFrom(PhantomData); -impl> ContainsPair for AssetsFrom { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - let loc = T::get(); - &loc == origin && - matches!(asset, MultiAsset { id: AssetId::Concrete(asset_loc), fun: Fungible(_a) } - if asset_loc.match_and_split(&loc).is_some()) - } -} - -/// Allow checking in assets that have issuance > 0. -pub struct NonZeroIssuance(PhantomData<(AccountId, Assets)>); -impl Contains<>::AssetId> - for NonZeroIssuance -where - Assets: fungibles::Inspect, -{ - fn contains(id: &>::AssetId) -> bool { - !Assets::total_issuance(id.clone()).is_zero() - } -} - -/// A `HandleCredit` implementation that naively transfers the fees to the block author. -/// Will drop and burn the assets in case the transfer fails. -pub struct AssetsToBlockAuthor(PhantomData); -impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor -where - R: pallet_authorship::Config + pallet_assets::Config, - AccountIdOf: From + Into, -{ - fn handle_credit(credit: Credit, pallet_assets::Pallet>) { - if let Some(author) = pallet_authorship::Pallet::::author() { - // In case of error: Will drop the result triggering the `OnDrop` of the imbalance. - let _ = pallet_assets::Pallet::::resolve(&author, credit); - } - } -} - -pub trait Reserve { - /// Returns assets reserve location. - fn reserve(&self) -> Option; -} - -// Takes the chain part of a MultiAsset -impl Reserve for MultiAsset { - fn reserve(&self) -> Option { - if let AssetId::Concrete(location) = self.id { - let first_interior = location.first_interior(); - let parents = location.parent_count(); - match (parents, first_interior) { - (0, Some(Parachain(id))) => Some(MultiLocation::new(0, X1(Parachain(*id)))), - (1, Some(Parachain(id))) => Some(MultiLocation::new(1, X1(Parachain(*id)))), - (1, _) => Some(MultiLocation::parent()), - _ => None, - } - } else { - None - } - } -} - -/// A `FilterAssetLocation` implementation. Filters multi native assets whose -/// reserve is same with `origin`. -pub struct MultiNativeAsset; -impl ContainsPair for MultiNativeAsset { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - if let Some(ref reserve) = asset.reserve() { - if reserve == origin { - return true - } - } - false - } -} - -parameter_types! { - /// The location that this chain recognizes as the Relay network's Asset Hub. - pub SystemAssetHubLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); - // ALWAYS ensure that the index in PalletInstance stays up-to-date with - // the Relay Chain's Asset Hub's Assets pallet index - pub SystemAssetHubAssetsPalletLocation: MultiLocation = - MultiLocation::new(1, X2(Parachain(1000), PalletInstance(50))); - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); -} - -pub type Reserves = (NativeAsset, AssetsFrom); - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - // How to withdraw and deposit an asset. - type AssetTransactor = AssetTransactors; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - type IsReserve = MultiNativeAsset; // TODO: maybe needed to be replaced by Reserves - type IsTeleporter = NativeAsset; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = FixedWeightBounds; - type Trader = - UsingComponents>; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; -} - -/// No local origins on this chain are allowed to dispatch XCM sends/executions. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Nothing; - // ^ Disable dispatchable execute on the XCM pallet. - // Needs to be `Everything` for local testing. - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Everything; - type Weigher = FixedWeightBounds; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - // ^ Override for AdvertisedXcmVersion default - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = pallet_xcm::TestWeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml deleted file mode 100644 index c295995cce8a..000000000000 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ /dev/null @@ -1,109 +0,0 @@ -[package] -name = "rococo-parachain-runtime" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Simple runtime used by the rococo parachain(s)" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", optional = true, default-features = false, branch = "master" } -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-assets = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -pallet-xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } -cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } -cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false } -cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } -cumulus-ping = { path = "../../../pallets/ping", default-features = false } -cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../../../primitives/timestamp", default-features = false } -cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } -parachains-common = { path = "../../../common", default-features = false } -parachain-info = { path = "../../../pallets/parachain-info", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-assets/std", - "pallet-aura/std", - "pallet-balances/std", - "pallet-sudo/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "pallet-xcm/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-core/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", - "xcm-executor/std", - "xcm/std", - "cumulus-pallet-aura-ext/std", - "cumulus-pallet-dmp-queue/std", - "cumulus-pallet-parachain-system/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-ping/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "cumulus-primitives-utility/std", - "parachain-info/std", - "parachains-common/std", - "substrate-wasm-builder", -] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "pallet-assets/runtime-benchmarks", - "pallet-xcm/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", -] diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/build.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/build.rs deleted file mode 100644 index 60f8a125129f..000000000000 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(feature = "std")] -fn main() { - substrate_wasm_builder::WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build() -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs deleted file mode 100644 index a6223d9a2030..000000000000 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ /dev/null @@ -1,811 +0,0 @@ -// Copyright 2019-2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use sp_api::impl_runtime_apis; -use sp_core::OpaqueMetadata; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdLookup, BlakeTwo256, Block as BlockT}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, -}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -// A few exports that help ease life for downstream crates. -pub use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - match_types, parameter_types, - traits::{ - AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, - IsInVec, Nothing, Randomness, - }, - weights::{ - constants::{ - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND, - }, - ConstantMultiplier, IdentityFee, Weight, - }, - StorageValue, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, EnsureSigned, -}; -pub use pallet_balances::Call as BalancesCall; -pub use pallet_timestamp::Call as TimestampCall; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; -pub use sp_runtime::{Perbill, Permill}; - -use parachains_common::{ - impls::{AssetsFrom, NonZeroIssuance}, - AccountId, AssetIdForTrustBackedAssets, Signature, -}; -use xcm_builder::{ - AllowKnownQueryResponses, AllowSubscriptionsFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, - FungiblesAdapter, LocalMint, TrailingSetTopicAsId, WithUniqueTopic, -}; -use xcm_executor::traits::JustTry; - -// XCM imports -use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough}; -use polkadot_parachain::primitives::Sibling; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, NativeAsset, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, -}; -use xcm_executor::XcmExecutor; - -pub type SessionHandlers = (); - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -/// This runtime version. -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("test-parachain"), - impl_name: create_runtime_str!("test-parachain"), - authoring_version: 1, - spec_version: 9430, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 6, - state_version: 0, -}; - -pub const MILLISECS_PER_BLOCK: u64 = 12000; - -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - -pub const EPOCH_DURATION_IN_BLOCKS: u32 = 10 * MINUTES; - -// These time units are defined in number of blocks. -pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); -pub const HOURS: BlockNumber = MINUTES * 60; -pub const DAYS: BlockNumber = HOURS * 24; - -pub const ROC: Balance = 1_000_000_000_000; -pub const MILLIROC: Balance = 1_000_000_000; -pub const MICROROC: Balance = 1_000_000; - -// 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. -pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -/// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. -/// This is used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used -/// by Operational extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for .5 seconds of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 42; -} - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = AccountIdLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// Converts a module to an index of this module in the runtime. - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = RocksDbWeight; - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = (); -} - -parameter_types! { - pub const ExistentialDeposit: u128 = MILLIROC; - pub const TransferFee: u128 = MILLIROC; - pub const CreationFee: u128 = MILLIROC; - pub const TransactionByteFee: u128 = MICROROC; -} - -impl pallet_balances::Config for Runtime { - /// The type for recording an account's balance. - type Balance = Balance; - type DustRemoval = (); - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = ConstU32<50>; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type WeightToFee = IdentityFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = (); - type OperationalFeeMultiplier = ConstU8<5>; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type WeightInfo = pallet_sudo::weights::SubstrateWeight; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = XcmpQueue; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -parameter_types! { - pub const RocLocation: MultiLocation = MultiLocation::parent(); - pub const RococoNetwork: Option = Some(NetworkId::Rococo); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, -); - -/// Means for transacting assets on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports. - (), ->; - -/// Means for transacting assets besides the native currency on this chain. -pub type FungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - Assets, - // Use this currency when it is a fungible asset matching the given location or name: - ConvertedConcreteId< - AssetIdForTrustBackedAssets, - u64, - AsPrefixedGeneralIndex< - SystemAssetHubAssetsPalletLocation, - AssetIdForTrustBackedAssets, - JustTry, - >, - JustTry, - >, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; -/// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognised. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognised. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. - pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); - // One ROC buys 1 second of weight. - pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), ROC); - pub const MaxInstructions: u32 = 100; -} - -match_types! { - // The parent or the parent's unit plurality. - pub type ParentOrParentsUnitPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) } - }; - // The location recognized as the Relay network's Asset Hub. - pub type AssetHub: impl Contains = { - MultiLocation { parents: 1, interior: X1(Parachain(1000)) } - }; -} - -pub type Barrier = TrailingSetTopicAsId<( - TakeWeightCredit, - AllowTopLevelPaidExecutionFrom, - // Parent & its unit plurality gets free execution. - AllowExplicitUnpaidExecutionFrom, - // The network's Asset Hub gets free execution. - AllowExplicitUnpaidExecutionFrom, - // Expected responses are OK. - AllowKnownQueryResponses, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, -)>; - -parameter_types! { - pub MaxAssetsIntoHolding: u32 = 64; - pub SystemAssetHubLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); - // ALWAYS ensure that the index in PalletInstance stays up-to-date with - // the Relay Chain's Asset Hub's Assets pallet index - pub SystemAssetHubAssetsPalletLocation: MultiLocation = - MultiLocation::new(1, X2(Parachain(1000), PalletInstance(50))); -} - -pub type Reserves = (NativeAsset, AssetsFrom); - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - // How to withdraw and deposit an asset. - type AssetTransactor = AssetTransactors; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - type IsReserve = Reserves; - type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of ROC - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = FixedWeightBounds; - type Trader = UsingComponents, RocLocation, AccountId, Balances, ()>; - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = RuntimeCall; - type SafeCallFilter = Everything; - type Aliasers = Nothing; -} - -/// Local origins on this chain are allowed to dispatch XCM sends/executions. -pub type LocalOriginToLocation = SignedToAccountId32; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Everything; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Nothing; - type Weigher = FixedWeightBounds; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = pallet_xcm::TestWeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = (); - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EnsureRoot; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight; - type PriceForSiblingDelivery = (); -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = frame_system::EnsureRoot; -} - -impl cumulus_ping::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; -} - -parameter_types! { - pub const AssetDeposit: Balance = ROC; - pub const AssetAccountDeposit: Balance = ROC; - pub const ApprovalDeposit: Balance = 100 * MILLIROC; - pub const AssetsStringLimit: u32 = 50; - pub const MetadataDepositBase: Balance = ROC; - pub const MetadataDepositPerByte: Balance = 10 * MILLIROC; - pub const UnitBody: BodyId = BodyId::Unit; -} - -/// A majority of the Unit body from Rococo over XCM is our required administration origin. -pub type AdminOrigin = - EitherOfDiverse, EnsureXcm>>; - -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = u64; - type AssetId = AssetIdForTrustBackedAssets; - type AssetIdParameter = codec::Compact; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AdminOrigin; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = pallet_assets::weights::SubstrateWeight; - type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; -} - -construct_runtime! { - pub enum Runtime - { - System: frame_system::{Pallet, Call, Storage, Config, Event}, - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, - Sudo: pallet_sudo::{Pallet, Call, Storage, Config, Event}, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event}, - - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 20, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21, - - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 30, - Assets: pallet_assets::{Pallet, Call, Storage, Event} = 31, - - Aura: pallet_aura::{Pallet, Config}, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Config}, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 50, - PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 51, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event, Origin} = 52, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 53, - - Spambot: cumulus_ping::{Pallet, Call, Storage, Event} = 99, - } -} - -/// Balance of an account. -pub type Balance = u128; -/// Index of a transaction in the chain. -pub type Nonce = u32; -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; -/// An index to a block. -pub type BlockNumber = u32; -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - RemoveCollectiveFlip, ->; - -pub struct RemoveCollectiveFlip; -impl frame_support::traits::OnRuntimeUpgrade for RemoveCollectiveFlip { - fn on_runtime_upgrade() -> Weight { - use frame_support::storage::migration; - // Remove the storage value `RandomMaterial` from removed pallet `RandomnessCollectiveFlip` - #[allow(deprecated)] - migration::remove_storage_prefix(b"RandomnessCollectiveFlip", b"RandomMaterial", b""); - ::DbWeight::get().writes(1) - } -} - -impl_runtime_apis! { - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block); - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic( - extrinsic: ::Extrinsic, - ) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn decode_session_keys( - encoded: Vec, - ) -> Option, sp_core::crypto::KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - } - - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ) - .create_inherent_data() - .expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, - CheckInherents = CheckInherents, -} diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml deleted file mode 100644 index 9837ebaa3998..000000000000 --- a/cumulus/polkadot-parachain/Cargo.toml +++ /dev/null @@ -1,126 +0,0 @@ -[package] -name = "polkadot-parachain-bin" -version = "0.9.430" -authors = ["Parity Technologies "] -build = "build.rs" -edition = "2021" -description = "Runs a polkadot parachain node which could be a collator." - -[[bin]] -name = "polkadot-parachain" -path = "src/main.rs" - -[dependencies] -async-trait = "0.1.73" -clap = { version = "4.3.21", features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.0.0" } -futures = "0.3.28" -hex-literal = "0.4.1" -log = "0.4.20" -serde = { version = "1.0.183", features = ["derive"] } -serde_json = "1.0.104" - -# Local -rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } -shell-runtime = { path = "../parachains/runtimes/starters/shell" } -glutton-runtime = { path = "../parachains/runtimes/glutton/glutton-kusama" } -seedling-runtime = { path = "../parachains/runtimes/starters/seedling" } -asset-hub-polkadot-runtime = { path = "../parachains/runtimes/assets/asset-hub-polkadot" } -asset-hub-kusama-runtime = { path = "../parachains/runtimes/assets/asset-hub-kusama" } -asset-hub-westend-runtime = { path = "../parachains/runtimes/assets/asset-hub-westend" } -collectives-polkadot-runtime = { path = "../parachains/runtimes/collectives/collectives-polkadot" } -contracts-rococo-runtime = { path = "../parachains/runtimes/contracts/contracts-rococo" } -bridge-hub-rococo-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-rococo" } -bridge-hub-kusama-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-kusama" } -bridge-hub-polkadot-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-polkadot" } -penpal-runtime = { path = "../parachains/runtimes/testing/penpal" } -jsonrpsee = { version = "0.16.2", features = ["server"] } -parachains-common = { path = "../parachains/common" } - -# Substrate -frame-benchmarking = { git = "https://github.com/paritytech/substrate", branch = "master" } -frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network-sync = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keystore = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-sysinfo = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", branch = "master" } -try-runtime-cli = { git = "https://github.com/paritytech/substrate", branch = "master", optional = true } -sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -frame-rpc-system = { package = "substrate-frame-rpc-system", git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-state-trie-migration-rpc = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -# Use rococo-native as this is currently the default "local" relay chain -polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["rococo-native"] } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-client-cli = { path = "../client/cli" } -cumulus-client-consensus-aura = { path = "../client/consensus/aura" } -cumulus-client-consensus-relay-chain = { path = "../client/consensus/relay-chain" } -cumulus-client-consensus-common = { path = "../client/consensus/common" } -cumulus-client-service = { path = "../client/service" } -cumulus-primitives-core = { path = "../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../primitives/parachain-inherent" } -cumulus-relay-chain-interface = { path = "../client/relay-chain-interface" } -color-print = "0.3.4" - -[build-dependencies] -substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[dev-dependencies] -assert_cmd = "2.0" -nix = { version = "0.26.1", features = ["signal"] } -tempfile = "3.7.1" -tokio = { version = "1.31.0", features = ["macros", "time", "parking_lot"] } -wait-timeout = "0.2" - -[features] -default = [] -runtime-benchmarks = [ - "polkadot-service/runtime-benchmarks", - "asset-hub-polkadot-runtime/runtime-benchmarks", - "asset-hub-kusama-runtime/runtime-benchmarks", - "asset-hub-westend-runtime/runtime-benchmarks", - "bridge-hub-rococo-runtime/runtime-benchmarks", - "bridge-hub-kusama-runtime/runtime-benchmarks", - "bridge-hub-polkadot-runtime/runtime-benchmarks", - "collectives-polkadot-runtime/runtime-benchmarks", - "rococo-parachain-runtime/runtime-benchmarks", - "contracts-rococo-runtime/runtime-benchmarks", - "contracts-rococo-runtime/runtime-benchmarks", - "penpal-runtime/runtime-benchmarks", -] -try-runtime = [ - "asset-hub-polkadot-runtime/try-runtime", - "asset-hub-kusama-runtime/try-runtime", - "asset-hub-westend-runtime/try-runtime", - "shell-runtime/try-runtime", - "try-runtime-cli/try-runtime", -] diff --git a/cumulus/polkadot-parachain/build.rs b/cumulus/polkadot-parachain/build.rs deleted file mode 100644 index ae164d6cb0f4..000000000000 --- a/cumulus/polkadot-parachain/build.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use substrate_build_script_utils::{generate_cargo_keys, rerun_if_git_head_changed}; - -fn main() { - generate_cargo_keys(); - rerun_if_git_head_changed(); -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/asset_hubs.rs b/cumulus/polkadot-parachain/src/chain_spec/asset_hubs.rs deleted file mode 100644 index 0523c3b7e65f..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/asset_hubs.rs +++ /dev/null @@ -1,645 +0,0 @@ -// Copyright 2019-2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::{ - get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, -}; -use cumulus_primitives_core::ParaId; -use hex_literal::hex; -use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId, Balance as AssetHubBalance}; -use sc_service::ChainType; -use sp_core::{crypto::UncheckedInto, sr25519}; - -/// Specialized `ChainSpec` for the normal parachain runtime. -pub type AssetHubPolkadotChainSpec = - sc_service::GenericChainSpec; -pub type AssetHubKusamaChainSpec = - sc_service::GenericChainSpec; -pub type AssetHubWestendChainSpec = - sc_service::GenericChainSpec; - -const ASSET_HUB_POLKADOT_ED: AssetHubBalance = - asset_hub_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; -const ASSET_HUB_KUSAMA_ED: AssetHubBalance = - asset_hub_kusama_runtime::constants::currency::EXISTENTIAL_DEPOSIT; -const ASSET_HUB_WESTEND_ED: AssetHubBalance = - asset_hub_westend_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - -/// Generate the session keys from individual elements. -/// -/// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn asset_hub_polkadot_session_keys( - keys: AssetHubPolkadotAuraId, -) -> asset_hub_polkadot_runtime::SessionKeys { - asset_hub_polkadot_runtime::SessionKeys { aura: keys } -} - -/// Generate the session keys from individual elements. -/// -/// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn asset_hub_kusama_session_keys(keys: AuraId) -> asset_hub_kusama_runtime::SessionKeys { - asset_hub_kusama_runtime::SessionKeys { aura: keys } -} - -/// Generate the session keys from individual elements. -/// -/// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn asset_hub_westend_session_keys(keys: AuraId) -> asset_hub_westend_runtime::SessionKeys { - asset_hub_westend_runtime::SessionKeys { aura: keys } -} - -pub fn asset_hub_polkadot_development_config() -> AssetHubPolkadotChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 0.into()); - properties.insert("tokenSymbol".into(), "DOT".into()); - properties.insert("tokenDecimals".into(), 10.into()); - - AssetHubPolkadotChainSpec::from_genesis( - // Name - "Polkadot Asset Hub Development", - // ID - "asset-hub-polkadot-dev", - ChainType::Local, - move || { - asset_hub_polkadot_genesis( - // initial collators. - vec![( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - )], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "polkadot-dev".into(), para_id: 1000 }, - ) -} - -pub fn asset_hub_polkadot_local_config() -> AssetHubPolkadotChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 0.into()); - properties.insert("tokenSymbol".into(), "DOT".into()); - properties.insert("tokenDecimals".into(), 10.into()); - - AssetHubPolkadotChainSpec::from_genesis( - // Name - "Polkadot Asset Hub Local", - // ID - "asset-hub-polkadot-local", - ChainType::Local, - move || { - asset_hub_polkadot_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "polkadot-local".into(), para_id: 1000 }, - ) -} - -// Not used for syncing, but just to determine the genesis values set for the upgrade from shell. -pub fn asset_hub_polkadot_config() -> AssetHubPolkadotChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 0.into()); - properties.insert("tokenSymbol".into(), "DOT".into()); - properties.insert("tokenDecimals".into(), 10.into()); - - AssetHubPolkadotChainSpec::from_genesis( - // Name - "Polkadot Asset Hub", - // ID - "asset-hub-polkadot", - ChainType::Live, - move || { - asset_hub_polkadot_genesis( - // initial collators. - vec![ - ( - hex!("4c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421") - .into(), - hex!("4c3d674d2a01060f0ded218e5dcc6f90c1726f43df79885eb3e22d97a20d5421") - .unchecked_into(), - ), - ( - hex!("c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811") - .into(), - hex!("c7d7d38d16bc23c6321152c50306212dc22c0efc04a2e52b5cccfc31ab3d7811") - .unchecked_into(), - ), - ( - hex!("c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762") - .into(), - hex!("c5c07ba203d7375675f5c1ebe70f0a5bb729ae57b48bcc877fcc2ab21309b762") - .unchecked_into(), - ), - ( - hex!("0b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3") - .into(), - hex!("0b2d0013fb974794bd7aa452465b567d48ef70373fe231a637c1fb7c547e85b3") - .unchecked_into(), - ), - ], - vec![], - 1000u32.into(), - ) - }, - vec![ - "/ip4/34.65.251.121/tcp/30334/p2p/12D3KooWG3GrM6XKMM4gp3cvemdwUvu96ziYoJmqmetLZBXE8bSa".parse().unwrap(), - "/ip4/34.65.35.228/tcp/30334/p2p/12D3KooWMRyTLrCEPcAQD6c4EnudL3vVzg9zji3whvsMYPUYevpq".parse().unwrap(), - "/ip4/34.83.247.146/tcp/30334/p2p/12D3KooWE4jFh5FpJDkWVZhnWtFnbSqRhdjvC7Dp9b8b3FTuubQC".parse().unwrap(), - "/ip4/104.199.117.230/tcp/30334/p2p/12D3KooWG9R8pVXKumVo2rdkeVD4j5PVhRTqmYgLHY3a4yPYgLqM".parse().unwrap(), - ], - None, - None, - None, - Some(properties), - Extensions { relay_chain: "polkadot".into(), para_id: 1000 }, - ) -} - -fn asset_hub_polkadot_genesis( - invulnerables: Vec<(AccountId, AssetHubPolkadotAuraId)>, - endowed_accounts: Vec, - id: ParaId, -) -> asset_hub_polkadot_runtime::RuntimeGenesisConfig { - asset_hub_polkadot_runtime::RuntimeGenesisConfig { - system: asset_hub_polkadot_runtime::SystemConfig { - code: asset_hub_polkadot_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: asset_hub_polkadot_runtime::BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, ASSET_HUB_POLKADOT_ED * 4096)) - .collect(), - }, - parachain_info: asset_hub_polkadot_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: asset_hub_polkadot_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: ASSET_HUB_POLKADOT_ED * 16, - ..Default::default() - }, - session: asset_hub_polkadot_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - asset_hub_polkadot_session_keys(aura), // session keys - ) - }) - .collect(), - }, - // no need to pass anything to aura, in fact it will panic if we do. Session will take care - // of this. - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: asset_hub_polkadot_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - } -} - -pub fn asset_hub_kusama_development_config() -> AssetHubKusamaChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 2.into()); - properties.insert("tokenSymbol".into(), "KSM".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - AssetHubKusamaChainSpec::from_genesis( - // Name - "Kusama Asset Hub Development", - // ID - "asset-hub-kusama-dev", - ChainType::Local, - move || { - asset_hub_kusama_genesis( - // initial collators. - vec![( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - )], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "kusama-dev".into(), para_id: 1000 }, - ) -} - -pub fn asset_hub_kusama_local_config() -> AssetHubKusamaChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 2.into()); - properties.insert("tokenSymbol".into(), "KSM".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - AssetHubKusamaChainSpec::from_genesis( - // Name - "Kusama Asset Hub Local", - // ID - "asset-hub-kusama-local", - ChainType::Local, - move || { - asset_hub_kusama_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "kusama-local".into(), para_id: 1000 }, - ) -} - -pub fn asset_hub_kusama_config() -> AssetHubKusamaChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 2.into()); - properties.insert("tokenSymbol".into(), "KSM".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - AssetHubKusamaChainSpec::from_genesis( - // Name - "Kusama Asset Hub", - // ID - "asset-hub-kusama", - ChainType::Live, - move || { - asset_hub_kusama_genesis( - // initial collators. - vec![ - ( - hex!("50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730") - .into(), - hex!("50673d59020488a4ffc9d8c6de3062a65977046e6990915617f85fef6d349730") - .unchecked_into(), - ), - ( - hex!("fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a") - .into(), - hex!("fe8102dbc244e7ea2babd9f53236d67403b046154370da5c3ea99def0bd0747a") - .unchecked_into(), - ), - ( - hex!("38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a") - .into(), - hex!("38144b5398e5d0da5ec936a3af23f5a96e782f676ab19d45f29075ee92eca76a") - .unchecked_into(), - ), - ( - hex!("3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415") - .into(), - hex!("3253947640e309120ae70fa458dcacb915e2ddd78f930f52bd3679ec63fc4415") - .unchecked_into(), - ), - ], - Vec::new(), - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "kusama".into(), para_id: 1000 }, - ) -} - -fn asset_hub_kusama_genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, -) -> asset_hub_kusama_runtime::RuntimeGenesisConfig { - asset_hub_kusama_runtime::RuntimeGenesisConfig { - system: asset_hub_kusama_runtime::SystemConfig { - code: asset_hub_kusama_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: asset_hub_kusama_runtime::BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, ASSET_HUB_KUSAMA_ED * 524_288)) - .collect(), - }, - parachain_info: asset_hub_kusama_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: asset_hub_kusama_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: ASSET_HUB_KUSAMA_ED * 16, - ..Default::default() - }, - session: asset_hub_kusama_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - asset_hub_kusama_session_keys(aura), // session keys - ) - }) - .collect(), - }, - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: asset_hub_kusama_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - } -} - -pub fn asset_hub_westend_development_config() -> AssetHubWestendChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "WND".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - AssetHubWestendChainSpec::from_genesis( - // Name - "Westend Asset Hub Development", - // ID - "asset-hub-westend-dev", - ChainType::Local, - move || { - asset_hub_westend_genesis( - // initial collators. - vec![( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - )], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "westend".into(), para_id: 1000 }, - ) -} - -pub fn asset_hub_westend_local_config() -> AssetHubWestendChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "WND".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - AssetHubWestendChainSpec::from_genesis( - // Name - "Westend Asset Hub Local", - // ID - "asset-hub-westend-local", - ChainType::Local, - move || { - asset_hub_westend_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "westend-local".into(), para_id: 1000 }, - ) -} - -pub fn asset_hub_westend_config() -> AssetHubWestendChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "WND".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - AssetHubWestendChainSpec::from_genesis( - // Name - "Westend Asset Hub", - // ID - "asset-hub-westend", - ChainType::Live, - move || { - asset_hub_westend_genesis( - // initial collators. - vec![ - ( - hex!("9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325") - .into(), - hex!("9cfd429fa002114f33c1d3e211501d62830c9868228eb3b4b8ae15a83de04325") - .unchecked_into(), - ), - ( - hex!("12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876") - .into(), - hex!("12a03fb4e7bda6c9a07ec0a11d03c24746943e054ff0bb04938970104c783876") - .unchecked_into(), - ), - ( - hex!("1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f") - .into(), - hex!("1256436307dfde969324e95b8c62cb9101f520a39435e6af0f7ac07b34e1931f") - .unchecked_into(), - ), - ( - hex!("98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322") - .into(), - hex!("98102b7bca3f070f9aa19f58feed2c0a4e107d203396028ec17a47e1ed80e322") - .unchecked_into(), - ), - ], - Vec::new(), - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "westend".into(), para_id: 1000 }, - ) -} - -fn asset_hub_westend_genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, -) -> asset_hub_westend_runtime::RuntimeGenesisConfig { - asset_hub_westend_runtime::RuntimeGenesisConfig { - system: asset_hub_westend_runtime::SystemConfig { - code: asset_hub_westend_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: asset_hub_westend_runtime::BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, ASSET_HUB_WESTEND_ED * 4096)) - .collect(), - }, - parachain_info: asset_hub_westend_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: asset_hub_westend_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: ASSET_HUB_WESTEND_ED * 16, - ..Default::default() - }, - session: asset_hub_westend_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - asset_hub_westend_session_keys(aura), // session keys - ) - }) - .collect(), - }, - // no need to pass anything to aura, in fact it will panic if we do. Session will take care - // of this. - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: asset_hub_westend_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs b/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs deleted file mode 100644 index 911368073d59..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs +++ /dev/null @@ -1,624 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::{get_account_id_from_seed, get_collator_keys_from_seed}; -use cumulus_primitives_core::ParaId; -use parachains_common::Balance as BridgeHubBalance; -use sc_chain_spec::ChainSpec; -use sp_core::sr25519; -use std::{path::PathBuf, str::FromStr}; - -/// Collects all supported BridgeHub configurations -#[derive(Debug, PartialEq)] -pub enum BridgeHubRuntimeType { - Rococo, - RococoLocal, - // used by benchmarks - RococoDevelopment, - - Wococo, - WococoLocal, - - Kusama, - KusamaLocal, - // used by benchmarks - KusamaDevelopment, - - Polkadot, - PolkadotLocal, - // used by benchmarks - PolkadotDevelopment, - - // used with kusama runtime - Westend, -} - -impl FromStr for BridgeHubRuntimeType { - type Err = String; - - fn from_str(value: &str) -> Result { - match value { - polkadot::BRIDGE_HUB_POLKADOT => Ok(BridgeHubRuntimeType::Polkadot), - polkadot::BRIDGE_HUB_POLKADOT_LOCAL => Ok(BridgeHubRuntimeType::PolkadotLocal), - polkadot::BRIDGE_HUB_POLKADOT_DEVELOPMENT => - Ok(BridgeHubRuntimeType::PolkadotDevelopment), - kusama::BRIDGE_HUB_KUSAMA => Ok(BridgeHubRuntimeType::Kusama), - kusama::BRIDGE_HUB_KUSAMA_LOCAL => Ok(BridgeHubRuntimeType::KusamaLocal), - kusama::BRIDGE_HUB_KUSAMA_DEVELOPMENT => Ok(BridgeHubRuntimeType::KusamaDevelopment), - westend::BRIDGE_HUB_WESTEND => Ok(BridgeHubRuntimeType::Westend), - rococo::BRIDGE_HUB_ROCOCO => Ok(BridgeHubRuntimeType::Rococo), - rococo::BRIDGE_HUB_ROCOCO_LOCAL => Ok(BridgeHubRuntimeType::RococoLocal), - rococo::BRIDGE_HUB_ROCOCO_DEVELOPMENT => Ok(BridgeHubRuntimeType::RococoDevelopment), - wococo::BRIDGE_HUB_WOCOCO => Ok(BridgeHubRuntimeType::Wococo), - wococo::BRIDGE_HUB_WOCOCO_LOCAL => Ok(BridgeHubRuntimeType::WococoLocal), - _ => Err(format!("Value '{}' is not configured yet", value)), - } - } -} - -impl BridgeHubRuntimeType { - pub const ID_PREFIX: &'static str = "bridge-hub"; - - pub fn chain_spec_from_json_file(&self, path: PathBuf) -> Result, String> { - match self { - BridgeHubRuntimeType::Polkadot | - BridgeHubRuntimeType::PolkadotLocal | - BridgeHubRuntimeType::PolkadotDevelopment => - Ok(Box::new(polkadot::BridgeHubChainSpec::from_json_file(path)?)), - BridgeHubRuntimeType::Kusama | - BridgeHubRuntimeType::KusamaLocal | - BridgeHubRuntimeType::KusamaDevelopment => - Ok(Box::new(kusama::BridgeHubChainSpec::from_json_file(path)?)), - BridgeHubRuntimeType::Westend => - Ok(Box::new(westend::BridgeHubChainSpec::from_json_file(path)?)), - BridgeHubRuntimeType::Rococo | - BridgeHubRuntimeType::RococoLocal | - BridgeHubRuntimeType::RococoDevelopment => - Ok(Box::new(rococo::BridgeHubChainSpec::from_json_file(path)?)), - BridgeHubRuntimeType::Wococo | BridgeHubRuntimeType::WococoLocal => - Ok(Box::new(wococo::BridgeHubChainSpec::from_json_file(path)?)), - } - } - - pub fn load_config(&self) -> Result, String> { - match self { - BridgeHubRuntimeType::Polkadot => - Ok(Box::new(polkadot::BridgeHubChainSpec::from_json_bytes( - &include_bytes!("../../../parachains/chain-specs/bridge-hub-polkadot.json")[..], - )?)), - BridgeHubRuntimeType::PolkadotLocal => Ok(Box::new(polkadot::local_config( - polkadot::BRIDGE_HUB_POLKADOT_LOCAL, - "Polkadot BridgeHub Local", - "polkadot-local", - ParaId::new(1002), - ))), - BridgeHubRuntimeType::PolkadotDevelopment => Ok(Box::new(polkadot::local_config( - polkadot::BRIDGE_HUB_POLKADOT_DEVELOPMENT, - "Polkadot BridgeHub Development", - "polkadot-dev", - ParaId::new(1002), - ))), - BridgeHubRuntimeType::Kusama => - Ok(Box::new(kusama::BridgeHubChainSpec::from_json_bytes( - &include_bytes!("../../../parachains/chain-specs/bridge-hub-kusama.json")[..], - )?)), - BridgeHubRuntimeType::KusamaLocal => Ok(Box::new(kusama::local_config( - kusama::BRIDGE_HUB_KUSAMA_LOCAL, - "Kusama BridgeHub Local", - "kusama-local", - ParaId::new(1003), - ))), - BridgeHubRuntimeType::KusamaDevelopment => Ok(Box::new(kusama::local_config( - kusama::BRIDGE_HUB_KUSAMA_DEVELOPMENT, - "Kusama BridgeHub Development", - "kusama-dev", - ParaId::new(1003), - ))), - BridgeHubRuntimeType::Westend => - Ok(Box::new(westend::BridgeHubChainSpec::from_json_bytes( - &include_bytes!("../../../parachains/chain-specs/bridge-hub-westend.json")[..], - )?)), - BridgeHubRuntimeType::Rococo => - Ok(Box::new(rococo::BridgeHubChainSpec::from_json_bytes( - &include_bytes!("../../../parachains/chain-specs/bridge-hub-rococo.json")[..], - )?)), - BridgeHubRuntimeType::RococoLocal => Ok(Box::new(rococo::local_config( - rococo::BRIDGE_HUB_ROCOCO_LOCAL, - "Rococo BridgeHub Local", - "rococo-local", - ParaId::new(1013), - Some("Bob".to_string()), - |_| (), - ))), - BridgeHubRuntimeType::RococoDevelopment => Ok(Box::new(rococo::local_config( - rococo::BRIDGE_HUB_ROCOCO_DEVELOPMENT, - "Rococo BridgeHub Development", - "rococo-dev", - ParaId::new(1013), - Some("Bob".to_string()), - |_| (), - ))), - BridgeHubRuntimeType::Wococo => - Ok(Box::new(wococo::BridgeHubChainSpec::from_json_bytes( - &include_bytes!("../../../parachains/chain-specs/bridge-hub-wococo.json")[..], - )?)), - BridgeHubRuntimeType::WococoLocal => Ok(Box::new(wococo::local_config( - wococo::BRIDGE_HUB_WOCOCO_LOCAL, - "Wococo BridgeHub Local", - "wococo-local", - ParaId::new(1014), - Some("Bob".to_string()), - ))), - } - } -} - -/// Check if 'id' satisfy BridgeHub-like format -fn ensure_id(id: &str) -> Result<&str, String> { - if id.starts_with(BridgeHubRuntimeType::ID_PREFIX) { - Ok(id) - } else { - Err(format!( - "Invalid 'id' attribute ({}), should start with prefix: {}", - id, - BridgeHubRuntimeType::ID_PREFIX - )) - } -} - -/// Sub-module for Rococo setup -pub mod rococo { - use super::{get_account_id_from_seed, get_collator_keys_from_seed, sr25519, ParaId}; - use crate::chain_spec::{Extensions, SAFE_XCM_VERSION}; - use parachains_common::{AccountId, AuraId}; - use sc_chain_spec::ChainType; - - use super::BridgeHubBalance; - - pub(crate) const BRIDGE_HUB_ROCOCO: &str = "bridge-hub-rococo"; - pub(crate) const BRIDGE_HUB_ROCOCO_LOCAL: &str = "bridge-hub-rococo-local"; - pub(crate) const BRIDGE_HUB_ROCOCO_DEVELOPMENT: &str = "bridge-hub-rococo-dev"; - const BRIDGE_HUB_ROCOCO_ED: BridgeHubBalance = - bridge_hub_rococo_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - /// Specialized `ChainSpec` for the normal parachain runtime. - pub type BridgeHubChainSpec = - sc_service::GenericChainSpec; - - pub type RuntimeApi = bridge_hub_rococo_runtime::RuntimeApi; - - pub fn local_config( - id: &str, - chain_name: &str, - relay_chain: &str, - para_id: ParaId, - bridges_pallet_owner_seed: Option, - modify_props: ModifyProperties, - ) -> BridgeHubChainSpec { - // Rococo defaults - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 42.into()); - properties.insert("tokenSymbol".into(), "ROC".into()); - properties.insert("tokenDecimals".into(), 12.into()); - modify_props(&mut properties); - - BridgeHubChainSpec::from_genesis( - // Name - chain_name, - // ID - super::ensure_id(id).expect("invalid id"), - ChainType::Local, - move || { - genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - para_id, - bridges_pallet_owner_seed - .as_ref() - .map(|seed| get_account_id_from_seed::(seed)), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, - ) - } - - fn genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, - bridges_pallet_owner: Option, - ) -> bridge_hub_rococo_runtime::RuntimeGenesisConfig { - bridge_hub_rococo_runtime::RuntimeGenesisConfig { - system: bridge_hub_rococo_runtime::SystemConfig { - code: bridge_hub_rococo_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: bridge_hub_rococo_runtime::BalancesConfig { - balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), - }, - parachain_info: bridge_hub_rococo_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: bridge_hub_rococo_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: BRIDGE_HUB_ROCOCO_ED * 16, - ..Default::default() - }, - session: bridge_hub_rococo_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - bridge_hub_rococo_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: bridge_hub_rococo_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - bridge_wococo_grandpa: bridge_hub_rococo_runtime::BridgeWococoGrandpaConfig { - owner: bridges_pallet_owner.clone(), - ..Default::default() - }, - bridge_rococo_grandpa: bridge_hub_rococo_runtime::BridgeRococoGrandpaConfig { - owner: bridges_pallet_owner.clone(), - ..Default::default() - }, - bridge_rococo_messages: bridge_hub_rococo_runtime::BridgeRococoMessagesConfig { - owner: bridges_pallet_owner.clone(), - ..Default::default() - }, - bridge_wococo_messages: bridge_hub_rococo_runtime::BridgeWococoMessagesConfig { - owner: bridges_pallet_owner, - ..Default::default() - }, - } - } -} - -/// Sub-module for Wococo setup (reuses stuff from Rococo) -pub mod wococo { - use super::ParaId; - use crate::chain_spec::bridge_hubs::rococo; - - pub(crate) const BRIDGE_HUB_WOCOCO: &str = "bridge-hub-wococo"; - pub(crate) const BRIDGE_HUB_WOCOCO_LOCAL: &str = "bridge-hub-wococo-local"; - - pub type BridgeHubChainSpec = rococo::BridgeHubChainSpec; - pub type RuntimeApi = rococo::RuntimeApi; - - pub fn local_config( - id: &str, - chain_name: &str, - relay_chain: &str, - para_id: ParaId, - bridges_pallet_owner_seed: Option, - ) -> BridgeHubChainSpec { - rococo::local_config( - id, - chain_name, - relay_chain, - para_id, - bridges_pallet_owner_seed, - |properties| { - properties.insert("tokenSymbol".into(), "WOOK".into()); - }, - ) - } -} - -/// Sub-module for Kusama setup -pub mod kusama { - use super::{BridgeHubBalance, ParaId}; - use crate::chain_spec::{ - get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, - }; - use parachains_common::{AccountId, AuraId}; - use sc_chain_spec::ChainType; - use sp_core::sr25519; - - pub(crate) const BRIDGE_HUB_KUSAMA: &str = "bridge-hub-kusama"; - pub(crate) const BRIDGE_HUB_KUSAMA_LOCAL: &str = "bridge-hub-kusama-local"; - pub(crate) const BRIDGE_HUB_KUSAMA_DEVELOPMENT: &str = "bridge-hub-kusama-dev"; - const BRIDGE_HUB_KUSAMA_ED: BridgeHubBalance = - bridge_hub_kusama_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - /// Specialized `ChainSpec` for the normal parachain runtime. - pub type BridgeHubChainSpec = - sc_service::GenericChainSpec; - pub type RuntimeApi = bridge_hub_kusama_runtime::RuntimeApi; - - pub fn local_config( - id: &str, - chain_name: &str, - relay_chain: &str, - para_id: ParaId, - ) -> BridgeHubChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 2.into()); - properties.insert("tokenSymbol".into(), "KSM".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - BridgeHubChainSpec::from_genesis( - // Name - chain_name, - // ID - super::ensure_id(id).expect("invalid id"), - ChainType::Local, - move || { - genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - para_id, - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, - ) - } - - fn genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, - ) -> bridge_hub_kusama_runtime::RuntimeGenesisConfig { - bridge_hub_kusama_runtime::RuntimeGenesisConfig { - system: bridge_hub_kusama_runtime::SystemConfig { - code: bridge_hub_kusama_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: bridge_hub_kusama_runtime::BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, BRIDGE_HUB_KUSAMA_ED * 524_288)) - .collect(), - }, - parachain_info: bridge_hub_kusama_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: bridge_hub_kusama_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: BRIDGE_HUB_KUSAMA_ED * 16, - ..Default::default() - }, - session: bridge_hub_kusama_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - bridge_hub_kusama_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: bridge_hub_kusama_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - } - } -} - -/// Sub-module for Westend setup (uses Kusama runtime) -pub mod westend { - use crate::chain_spec::bridge_hubs::kusama; - - pub(crate) const BRIDGE_HUB_WESTEND: &str = "bridge-hub-westend"; - pub type BridgeHubChainSpec = kusama::BridgeHubChainSpec; - pub type RuntimeApi = bridge_hub_kusama_runtime::RuntimeApi; -} - -/// Sub-module for Polkadot setup -pub mod polkadot { - use super::{BridgeHubBalance, ParaId}; - use crate::chain_spec::{ - get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, - }; - use parachains_common::{AccountId, AuraId}; - use sc_chain_spec::ChainType; - use sp_core::sr25519; - - pub(crate) const BRIDGE_HUB_POLKADOT: &str = "bridge-hub-polkadot"; - pub(crate) const BRIDGE_HUB_POLKADOT_LOCAL: &str = "bridge-hub-polkadot-local"; - pub(crate) const BRIDGE_HUB_POLKADOT_DEVELOPMENT: &str = "bridge-hub-polkadot-dev"; - const BRIDGE_HUB_POLKADOT_ED: BridgeHubBalance = - bridge_hub_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - - /// Specialized `ChainSpec` for the normal parachain runtime. - pub type BridgeHubChainSpec = - sc_service::GenericChainSpec; - pub type RuntimeApi = bridge_hub_polkadot_runtime::RuntimeApi; - - pub fn local_config( - id: &str, - chain_name: &str, - relay_chain: &str, - para_id: ParaId, - ) -> BridgeHubChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 0.into()); - properties.insert("tokenSymbol".into(), "DOT".into()); - properties.insert("tokenDecimals".into(), 10.into()); - - BridgeHubChainSpec::from_genesis( - // Name - chain_name, - // ID - super::ensure_id(id).expect("invalid id"), - ChainType::Local, - move || { - genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - para_id, - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, - ) - } - - fn genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, - ) -> bridge_hub_polkadot_runtime::RuntimeGenesisConfig { - bridge_hub_polkadot_runtime::RuntimeGenesisConfig { - system: bridge_hub_polkadot_runtime::SystemConfig { - code: bridge_hub_polkadot_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: bridge_hub_polkadot_runtime::BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, BRIDGE_HUB_POLKADOT_ED * 4096)) - .collect(), - }, - parachain_info: bridge_hub_polkadot_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: bridge_hub_polkadot_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: BRIDGE_HUB_POLKADOT_ED * 16, - ..Default::default() - }, - session: bridge_hub_polkadot_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - bridge_hub_polkadot_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: bridge_hub_polkadot_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - } - } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/collectives.rs b/cumulus/polkadot-parachain/src/chain_spec/collectives.rs deleted file mode 100644 index 82c925c5d493..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/collectives.rs +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::{ - get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, -}; -use cumulus_primitives_core::ParaId; -use parachains_common::{AccountId, AuraId, Balance as CollectivesBalance}; -use sc_service::ChainType; -use sp_core::sr25519; - -pub type CollectivesPolkadotChainSpec = - sc_service::GenericChainSpec; - -const COLLECTIVES_POLKADOT_ED: CollectivesBalance = - collectives_polkadot_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - -/// Generate the session keys from individual elements. -/// -/// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn collectives_polkadot_session_keys( - keys: AuraId, -) -> collectives_polkadot_runtime::SessionKeys { - collectives_polkadot_runtime::SessionKeys { aura: keys } -} - -pub fn collectives_polkadot_development_config() -> CollectivesPolkadotChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 0.into()); - properties.insert("tokenSymbol".into(), "DOT".into()); - properties.insert("tokenDecimals".into(), 10.into()); - - CollectivesPolkadotChainSpec::from_genesis( - // Name - "Polkadot Collectives Development", - // ID - "collectives_polkadot_dev", - ChainType::Local, - move || { - collectives_polkadot_genesis( - // initial collators. - vec![( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - )], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - ], - // 1002 avoids a potential collision with Kusama-1001 (Encointer) should there ever - // be a collective para on Kusama. - 1002.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "polkadot-dev".into(), para_id: 1002 }, - ) -} - -/// Collectives Polkadot Local Config. -pub fn collectives_polkadot_local_config() -> CollectivesPolkadotChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 0.into()); - properties.insert("tokenSymbol".into(), "DOT".into()); - properties.insert("tokenDecimals".into(), 10.into()); - - CollectivesPolkadotChainSpec::from_genesis( - // Name - "Polkadot Collectives Local", - // ID - "collectives_polkadot_local", - ChainType::Local, - move || { - collectives_polkadot_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - 1002.into(), - ) - }, - Vec::new(), - None, - None, - None, - Some(properties), - Extensions { relay_chain: "polkadot-local".into(), para_id: 1002 }, - ) -} - -fn collectives_polkadot_genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, -) -> collectives_polkadot_runtime::RuntimeGenesisConfig { - collectives_polkadot_runtime::RuntimeGenesisConfig { - system: collectives_polkadot_runtime::SystemConfig { - code: collectives_polkadot_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: collectives_polkadot_runtime::BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, COLLECTIVES_POLKADOT_ED * 4096)) - .collect(), - }, - parachain_info: collectives_polkadot_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: collectives_polkadot_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: COLLECTIVES_POLKADOT_ED * 16, - ..Default::default() - }, - session: collectives_polkadot_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - collectives_polkadot_session_keys(aura), // session keys - ) - }) - .collect(), - }, - // no need to pass anything to aura, in fact it will panic if we do. Session will take care - // of this. - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: collectives_polkadot_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - alliance: Default::default(), - alliance_motion: Default::default(), - } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/contracts.rs b/cumulus/polkadot-parachain/src/chain_spec/contracts.rs deleted file mode 100644 index b8af83a0d70e..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/contracts.rs +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::{ - get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, -}; -use cumulus_primitives_core::ParaId; -use hex_literal::hex; -use parachains_common::{AccountId, AuraId}; -use sc_service::ChainType; -use sp_core::{crypto::UncheckedInto, sr25519}; - -pub type ContractsRococoChainSpec = - sc_service::GenericChainSpec; - -/// No relay chain suffix because the id is the same over all relay chains. -const CONTRACTS_PARACHAIN_ID: u32 = 1002; - -/// The existential deposit is determined by the runtime "contracts-rococo". -const CONTRACTS_ROCOCO_ED: contracts_rococo_runtime::Balance = - contracts_rococo_runtime::constants::currency::EXISTENTIAL_DEPOSIT; - -pub fn contracts_rococo_development_config() -> ContractsRococoChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "ROC".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - ContractsRococoChainSpec::from_genesis( - // Name - "Contracts on Rococo Development", - // ID - "contracts-rococo-dev", - ChainType::Development, - move || { - contracts_rococo_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - CONTRACTS_PARACHAIN_ID.into(), - ) - }, - Vec::new(), - None, - None, - None, - None, - Extensions { - relay_chain: "rococo-local".into(), // You MUST set this to the correct network! - para_id: CONTRACTS_PARACHAIN_ID, - }, - ) -} - -pub fn contracts_rococo_local_config() -> ContractsRococoChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "ROC".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - ContractsRococoChainSpec::from_genesis( - // Name - "Contracts on Rococo", - // ID - "contracts-rococo-local", - ChainType::Local, - move || { - contracts_rococo_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - CONTRACTS_PARACHAIN_ID.into(), - ) - }, - // Bootnodes - Vec::new(), - // Telemetry - None, - // Protocol ID - None, - // Fork ID - None, - // Properties - Some(properties), - // Extensions - Extensions { - relay_chain: "rococo-local".into(), // You MUST set this to the correct network! - para_id: CONTRACTS_PARACHAIN_ID, - }, - ) -} - -pub fn contracts_rococo_config() -> ContractsRococoChainSpec { - // Give your base currency a unit name and decimal places - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "ROC".into()); - properties.insert("tokenDecimals".into(), 12.into()); - - ContractsRococoChainSpec::from_genesis( - // Name - "Contracts on Rococo", - // ID - "contracts-rococo", - ChainType::Live, - move || { - contracts_rococo_genesis( - vec![ - // 5GKFbTTgrVS4Vz1UWWHPqMZQNFWZtqo7H2KpCDyYhEL3aS26 - ( - hex!["bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c"] - .into(), - hex!["bc09354c12c054c8f6b3da208485eacec4ac648bad348895273b37bab5a0937c"] - .unchecked_into(), - ), - // 5EPRJHm2GpABVWcwnAujcrhnrjFZyDGd5TwKFzkBoGgdRyv2 - ( - hex!["66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72"] - .into(), - hex!["66be63b7bcbfb91040e5248e2d1ceb822cf219c57848c5924ffa3a1f8e67ba72"] - .unchecked_into(), - ), - // 5GH62vrJrVZxLREcHzm2PR5uTLAT5RQMJitoztCGyaP4o3uM - ( - hex!["ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44"] - .into(), - hex!["ba62886472a0a9f66b5e39f1469ce1c5b3d8cad6be39078daf16f111e89d1e44"] - .unchecked_into(), - ), - // 5FHfoJDLdjRYX5KXLRqMDYBbWrwHLMtti21uK4QByUoUAbJF - ( - hex!["8e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b"] - .into(), - hex!["8e97f65cda001976311df9bed39e8d0c956089093e94a75ef76fe9347a0eda7b"] - .unchecked_into(), - ), - ], - // Warning: The configuration for a production chain should not contain - // any endowed accounts here, otherwise it'll be minting extra native tokens - // from the relay chain on the parachain. - vec![ - // NOTE: Remove endowed accounts if deployed on other relay chains. - // Endowed accounts - hex!["baa78c7154c7f82d6d377177e20bcab65d327eca0086513f9964f5a0f6bdad56"].into(), - // AccountId of an account which `ink-waterfall` uses for automated testing - hex!["0e47e2344d523c3cc5c34394b0d58b9a4200e813a038e6c5a6163cc07d70b069"].into(), - ], - CONTRACTS_PARACHAIN_ID.into(), - ) - }, - // Bootnodes - vec![ - "/dns/contracts-collator-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKg3Rpxcr9oJ8n6khoxpGKWztCZydtUZk2cojHqnfLrpj" - .parse() - .expect("MultiaddrWithPeerId"), - "/dns/contracts-collator-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPEXYrz8tHU3nDtPoPw4V7ou5dzMEWSTuUj7vaWiYVAVh" - .parse() - .expect("MultiaddrWithPeerId"), - "/dns/contracts-collator-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWEVU8AFNary4nP4qEnEcwJaRuy59Wefekzdu9pKbnVEhk" - .parse() - .expect("MultiaddrWithPeerId"), - "/dns/contracts-collator-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWP6pV3ZmcXzGDjv8ZMgA6nZxfAKDxSz4VNiLx6vVCQgJX" - .parse() - .expect("MultiaddrWithPeerId"), - ], - // Telemetry - None, - // Protocol ID - None, - // Fork ID - None, - // Properties - Some(properties), - // Extensions - Extensions { relay_chain: "rococo".into(), para_id: CONTRACTS_PARACHAIN_ID }, - ) -} - -fn contracts_rococo_genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, -) -> contracts_rococo_runtime::RuntimeGenesisConfig { - contracts_rococo_runtime::RuntimeGenesisConfig { - system: contracts_rococo_runtime::SystemConfig { - code: contracts_rococo_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: contracts_rococo_runtime::BalancesConfig { - balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), - }, - parachain_info: contracts_rococo_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: contracts_rococo_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: CONTRACTS_ROCOCO_ED * 16, - ..Default::default() - }, - session: contracts_rococo_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - contracts_rococo_runtime::SessionKeys { aura }, // session keys - ) - }) - .collect(), - }, - // no need to pass anything to aura, in fact it will panic if we do. Session will take care - // of this. - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: contracts_rococo_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - sudo: contracts_rococo_runtime::SudoConfig { - key: Some( - hex!["2681a28014e7d3a5bfb32a003b3571f53c408acbc28d351d6bf58f5028c4ef14"].into(), - ), - }, - } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/glutton.rs b/cumulus/polkadot-parachain/src/chain_spec/glutton.rs deleted file mode 100644 index 5ea51c3a9181..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/glutton.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::{get_account_id_from_seed, Extensions}; -use cumulus_primitives_core::ParaId; -use sc_service::ChainType; -use sp_core::sr25519; - -/// Specialized `ChainSpec` for the Glutton parachain runtime. -pub type GluttonChainSpec = - sc_service::GenericChainSpec; - -pub fn glutton_development_config(para_id: ParaId) -> GluttonChainSpec { - GluttonChainSpec::from_genesis( - // Name - "Glutton Development", - // ID - "glutton_dev", - ChainType::Local, - move || glutton_genesis(para_id), - Vec::new(), - None, - None, - None, - None, - Extensions { relay_chain: "kusama-dev".into(), para_id: para_id.into() }, - ) -} - -pub fn glutton_local_config(para_id: ParaId) -> GluttonChainSpec { - GluttonChainSpec::from_genesis( - // Name - "Glutton Local", - // ID - "glutton_local", - ChainType::Local, - move || glutton_genesis(para_id), - Vec::new(), - None, - None, - None, - None, - Extensions { relay_chain: "kusama-local".into(), para_id: para_id.into() }, - ) -} - -pub fn glutton_config(para_id: ParaId) -> GluttonChainSpec { - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("ss58Format".into(), 2.into()); - - GluttonChainSpec::from_genesis( - // Name - format!("Glutton {}", para_id).as_str(), - // ID - format!("glutton-kusama-{}", para_id).as_str(), - ChainType::Live, - move || glutton_genesis(para_id), - Vec::new(), - None, - // Protocol ID - Some(format!("glutton-kusama-{}", para_id).as_str()), - None, - Some(properties), - Extensions { relay_chain: "kusama".into(), para_id: para_id.into() }, - ) -} - -fn glutton_genesis(parachain_id: ParaId) -> glutton_runtime::RuntimeGenesisConfig { - glutton_runtime::RuntimeGenesisConfig { - system: glutton_runtime::SystemConfig { - code: glutton_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - parachain_info: glutton_runtime::ParachainInfoConfig { parachain_id, ..Default::default() }, - parachain_system: Default::default(), - glutton: glutton_runtime::GluttonConfig { - compute: Default::default(), - storage: Default::default(), - trash_data_count: Default::default(), - ..Default::default() - }, - sudo: glutton_runtime::SudoConfig { - key: Some(get_account_id_from_seed::("Alice")), - }, - } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/mod.rs b/cumulus/polkadot-parachain/src/chain_spec/mod.rs deleted file mode 100644 index d7014a9f43cd..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/mod.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use parachains_common::{AccountId, Signature}; -use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; -use serde::{Deserialize, Serialize}; -use sp_core::{Pair, Public}; -use sp_runtime::traits::{IdentifyAccount, Verify}; - -pub mod asset_hubs; -pub mod bridge_hubs; -pub mod collectives; -pub mod contracts; -pub mod glutton; -pub mod penpal; -pub mod rococo_parachain; -pub mod seedling; -pub mod shell; - -/// The default XCM version to set in genesis config. -const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; - -/// Generic extensions for Parachain ChainSpecs. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)] -#[serde(deny_unknown_fields)] -pub struct Extensions { - /// The relay chain of the Parachain. - pub relay_chain: String, - /// The id of the Parachain. - pub para_id: u32, -} - -impl Extensions { - /// Try to get the extension from the given `ChainSpec`. - pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> { - sc_chain_spec::get_extension(chain_spec.extensions()) - } -} - -/// Helper function to generate a crypto pair from seed -pub fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -type AccountPublic = ::Signer; - -/// Helper function to generate an account ID from seed -pub fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} - -/// Generate collator keys from seed. -/// -/// This function's return type must always match the session keys of the chain in tuple format. -pub fn get_collator_keys_from_seed(seed: &str) -> ::Public { - get_from_seed::(seed) -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/penpal.rs b/cumulus/polkadot-parachain/src/chain_spec/penpal.rs deleted file mode 100644 index 264898991eb8..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/penpal.rs +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::{ - get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, -}; -use cumulus_primitives_core::ParaId; -use parachains_common::{AccountId, AuraId}; -use sc_service::ChainType; -use sp_core::sr25519; -/// Specialized `ChainSpec` for the normal parachain runtime. -pub type PenpalChainSpec = - sc_service::GenericChainSpec; - -pub fn get_penpal_chain_spec(id: ParaId, relay_chain: &str) -> PenpalChainSpec { - // Give your base currency a unit name and decimal places - let mut properties = sc_chain_spec::Properties::new(); - properties.insert("tokenSymbol".into(), "UNIT".into()); - properties.insert("tokenDecimals".into(), 12u32.into()); - properties.insert("ss58Format".into(), 42u32.into()); - - PenpalChainSpec::from_genesis( - // Name - "Penpal Parachain", - // ID - &format!("penpal-{}", relay_chain.replace("-local", "")), - ChainType::Development, - move || { - penpal_testnet_genesis( - // initial collators. - vec![ - ( - get_account_id_from_seed::("Alice"), - get_collator_keys_from_seed::("Alice"), - ), - ( - get_account_id_from_seed::("Bob"), - get_collator_keys_from_seed::("Bob"), - ), - ], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - id, - ) - }, - Vec::new(), - None, - None, - None, - None, - Extensions { - relay_chain: relay_chain.into(), // You MUST set this to the correct network! - para_id: id.into(), - }, - ) -} - -fn penpal_testnet_genesis( - invulnerables: Vec<(AccountId, AuraId)>, - endowed_accounts: Vec, - id: ParaId, -) -> penpal_runtime::RuntimeGenesisConfig { - penpal_runtime::RuntimeGenesisConfig { - system: penpal_runtime::SystemConfig { - code: penpal_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: penpal_runtime::BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, penpal_runtime::EXISTENTIAL_DEPOSIT * 4096)) - .collect(), - }, - parachain_info: penpal_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - collator_selection: penpal_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: penpal_runtime::EXISTENTIAL_DEPOSIT * 16, - ..Default::default() - }, - session: penpal_runtime::SessionConfig { - keys: invulnerables - .into_iter() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc, // validator id - penpal_session_keys(aura), // session keys - ) - }) - .collect(), - }, - // no need to pass anything to aura, in fact it will panic if we do. Session will take care - // of this. - aura: Default::default(), - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: penpal_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - sudo: penpal_runtime::SudoConfig { - key: Some(get_account_id_from_seed::("Alice")), - }, - } -} - -/// Generate the session keys from individual elements. -/// -/// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn penpal_session_keys(keys: AuraId) -> penpal_runtime::SessionKeys { - penpal_runtime::SessionKeys { aura: keys } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/rococo_parachain.rs b/cumulus/polkadot-parachain/src/chain_spec/rococo_parachain.rs deleted file mode 100644 index 1ed1a3e35fba..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/rococo_parachain.rs +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! ChainSpecs dedicated to Rococo parachain setups (for testing and example purposes) - -use crate::chain_spec::{get_from_seed, Extensions, SAFE_XCM_VERSION}; -use cumulus_primitives_core::ParaId; -use hex_literal::hex; -use parachains_common::AccountId; -use polkadot_service::chain_spec::get_account_id_from_seed; -use rococo_parachain_runtime::AuraId; -use sc_chain_spec::ChainType; -use sp_core::{crypto::UncheckedInto, sr25519}; - -pub type RococoParachainChainSpec = - sc_service::GenericChainSpec; - -pub fn rococo_parachain_local_config() -> RococoParachainChainSpec { - RococoParachainChainSpec::from_genesis( - "Rococo Parachain Local", - "local_testnet", - ChainType::Local, - move || { - testnet_genesis( - get_account_id_from_seed::("Alice"), - vec![get_from_seed::("Alice"), get_from_seed::("Bob")], - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - None, - Extensions { relay_chain: "rococo-local".into(), para_id: 1000 }, - ) -} - -pub fn staging_rococo_parachain_local_config() -> RococoParachainChainSpec { - RococoParachainChainSpec::from_genesis( - "Staging Rococo Parachain Local", - "staging_testnet", - ChainType::Live, - move || { - testnet_genesis( - hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into(), - vec![ - // $secret//one - hex!["aad9fa2249f87a210a0f93400b7f90e47b810c6d65caa0ca3f5af982904c2a33"] - .unchecked_into(), - // $secret//two - hex!["d47753f0cca9dd8da00c70e82ec4fc5501a69c49a5952a643d18802837c88212"] - .unchecked_into(), - ], - vec![ - hex!["9ed7705e3c7da027ba0583a22a3212042f7e715d3c168ba14f1424e2bc111d00"].into() - ], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - None, - Extensions { relay_chain: "rococo-local".into(), para_id: 1000 }, - ) -} - -pub(crate) fn testnet_genesis( - root_key: AccountId, - initial_authorities: Vec, - endowed_accounts: Vec, - id: ParaId, -) -> rococo_parachain_runtime::RuntimeGenesisConfig { - rococo_parachain_runtime::RuntimeGenesisConfig { - system: rococo_parachain_runtime::SystemConfig { - code: rococo_parachain_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - balances: rococo_parachain_runtime::BalancesConfig { - balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), - }, - sudo: rococo_parachain_runtime::SudoConfig { key: Some(root_key) }, - parachain_info: rococo_parachain_runtime::ParachainInfoConfig { - parachain_id: id, - ..Default::default() - }, - aura: rococo_parachain_runtime::AuraConfig { authorities: initial_authorities }, - aura_ext: Default::default(), - parachain_system: Default::default(), - polkadot_xcm: rococo_parachain_runtime::PolkadotXcmConfig { - safe_xcm_version: Some(SAFE_XCM_VERSION), - ..Default::default() - }, - } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/seedling.rs b/cumulus/polkadot-parachain/src/chain_spec/seedling.rs deleted file mode 100644 index 4a43b4cf4764..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/seedling.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::{get_account_id_from_seed, Extensions}; -use cumulus_primitives_core::ParaId; -use parachains_common::AccountId; -use sc_service::ChainType; -use sp_core::sr25519; - -/// Specialized `ChainSpec` for the seedling parachain runtime. -pub type SeedlingChainSpec = - sc_service::GenericChainSpec; - -pub fn get_seedling_chain_spec() -> SeedlingChainSpec { - SeedlingChainSpec::from_genesis( - "Seedling Local Testnet", - "seedling_local_testnet", - ChainType::Local, - move || { - seedling_testnet_genesis( - get_account_id_from_seed::("Alice"), - 2000.into(), - ) - }, - Vec::new(), - None, - None, - None, - None, - Extensions { relay_chain: "westend".into(), para_id: 2000 }, - ) -} - -fn seedling_testnet_genesis( - root_key: AccountId, - parachain_id: ParaId, -) -> seedling_runtime::RuntimeGenesisConfig { - seedling_runtime::RuntimeGenesisConfig { - system: seedling_runtime::SystemConfig { - code: seedling_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - sudo: seedling_runtime::SudoConfig { key: Some(root_key) }, - parachain_info: seedling_runtime::ParachainInfoConfig { - parachain_id, - ..Default::default() - }, - parachain_system: Default::default(), - } -} diff --git a/cumulus/polkadot-parachain/src/chain_spec/shell.rs b/cumulus/polkadot-parachain/src/chain_spec/shell.rs deleted file mode 100644 index eca605b10df0..000000000000 --- a/cumulus/polkadot-parachain/src/chain_spec/shell.rs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::chain_spec::Extensions; -use cumulus_primitives_core::ParaId; -use sc_service::ChainType; - -/// Specialized `ChainSpec` for the shell parachain runtime. -pub type ShellChainSpec = - sc_service::GenericChainSpec; - -pub fn get_shell_chain_spec() -> ShellChainSpec { - ShellChainSpec::from_genesis( - "Shell Local Testnet", - "shell_local_testnet", - ChainType::Local, - move || shell_testnet_genesis(1000.into()), - Vec::new(), - None, - None, - None, - None, - Extensions { relay_chain: "westend".into(), para_id: 1000 }, - ) -} - -fn shell_testnet_genesis(parachain_id: ParaId) -> shell_runtime::RuntimeGenesisConfig { - shell_runtime::RuntimeGenesisConfig { - system: shell_runtime::SystemConfig { - code: shell_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - parachain_info: shell_runtime::ParachainInfoConfig { parachain_id, ..Default::default() }, - parachain_system: Default::default(), - } -} diff --git a/cumulus/polkadot-parachain/src/cli.rs b/cumulus/polkadot-parachain/src/cli.rs deleted file mode 100644 index 7be61810a7d4..000000000000 --- a/cumulus/polkadot-parachain/src/cli.rs +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use std::path::PathBuf; - -/// Sub-commands supported by the collator. -#[derive(Debug, clap::Subcommand)] -pub enum Subcommand { - /// Key management CLI utilities - #[command(subcommand)] - Key(sc_cli::KeySubcommand), - - /// Build a chain specification. - BuildSpec(sc_cli::BuildSpecCmd), - - /// Validate blocks. - CheckBlock(sc_cli::CheckBlockCmd), - - /// Export blocks. - ExportBlocks(sc_cli::ExportBlocksCmd), - - /// Export the state of a given block into a chain spec. - ExportState(sc_cli::ExportStateCmd), - - /// Import blocks. - ImportBlocks(sc_cli::ImportBlocksCmd), - - /// Revert the chain to a previous state. - Revert(sc_cli::RevertCmd), - - /// Remove the whole chain. - PurgeChain(cumulus_client_cli::PurgeChainCmd), - - /// Export the genesis state of the parachain. - ExportGenesisState(cumulus_client_cli::ExportGenesisStateCommand), - - /// Export the genesis wasm of the parachain. - ExportGenesisWasm(cumulus_client_cli::ExportGenesisWasmCommand), - - /// Sub-commands concerned with benchmarking. - /// The pallet benchmarking moved to the `pallet` sub-command. - #[command(subcommand)] - Benchmark(frame_benchmarking_cli::BenchmarkCmd), - - /// Try some testing command against a specified runtime state. - #[cfg(feature = "try-runtime")] - TryRuntime(try_runtime_cli::TryRuntimeCmd), - - /// Errors since the binary was not build with `--features try-runtime`. - #[cfg(not(feature = "try-runtime"))] - TryRuntime, -} - -const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( - r#"Examples: - polkadot-parachain --chain asset-hub-polkadot --sync warp -- --chain polkadot --sync warp - Launch a warp-syncing full node of the Asset Hub parachain on the Polkadot Relay Chain. - polkadot-parachain --chain asset-hub-polkadot --sync warp --relay-chain-rpc-url ws://rpc.example.com -- --chain polkadot - Launch a warp-syncing full node of the Asset Hub parachain on the Polkadot Relay Chain. - Uses ws://rpc.example.com as remote relay chain node. - "# -); -#[derive(Debug, clap::Parser)] -#[command( - propagate_version = true, - args_conflicts_with_subcommands = true, - subcommand_negates_reqs = true -)] -#[clap(after_help = AFTER_HELP_EXAMPLE)] -pub struct Cli { - #[command(subcommand)] - pub subcommand: Option, - - #[command(flatten)] - pub run: cumulus_client_cli::RunCmd, - - /// Disable automatic hardware benchmarks. - /// - /// By default these benchmarks are automatically ran at startup and measure - /// the CPU speed, the memory bandwidth and the disk speed. - /// - /// The results are then printed out in the logs, and also sent as part of - /// telemetry, if telemetry is enabled. - #[arg(long)] - pub no_hardware_benchmarks: bool, - - /// Relay chain arguments - #[arg(raw = true)] - pub relaychain_args: Vec, -} - -#[derive(Debug)] -pub struct RelayChainCli { - /// The actual relay chain cli object. - pub base: polkadot_cli::RunCmd, - - /// Optional chain id that should be passed to the relay chain. - pub chain_id: Option, - - /// The base path that should be used by the relay chain. - pub base_path: Option, -} - -impl RelayChainCli { - /// Parse the relay chain CLI parameters using the para chain `Configuration`. - pub fn new<'a>( - para_config: &sc_service::Configuration, - relay_chain_args: impl Iterator, - ) -> Self { - let extension = crate::chain_spec::Extensions::try_get(&*para_config.chain_spec); - let chain_id = extension.map(|e| e.relay_chain.clone()); - let base_path = para_config.base_path.path().join("polkadot"); - Self { - base_path: Some(base_path), - chain_id, - base: clap::Parser::parse_from(relay_chain_args), - } - } -} diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs deleted file mode 100644 index 42ae887db6ef..000000000000 --- a/cumulus/polkadot-parachain/src/command.rs +++ /dev/null @@ -1,1200 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::{ - chain_spec, - cli::{Cli, RelayChainCli, Subcommand}, - service::{new_partial, Block}, -}; -use cumulus_primitives_core::ParaId; -use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; -use log::{info, warn}; -use parachains_common::{AssetHubPolkadotAuraId, AuraId}; -use sc_cli::{ - ChainSpec, CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams, - NetworkParams, Result, SharedParams, SubstrateCli, -}; -use sc_service::config::{BasePath, PrometheusConfig}; -use sp_runtime::traits::AccountIdConversion; -use std::{net::SocketAddr, path::PathBuf}; - -/// Helper enum that is used for better distinction of different parachain/runtime configuration -/// (it is based/calculated on ChainSpec's ID attribute) -#[derive(Debug, PartialEq, Default)] -enum Runtime { - /// This is the default runtime (actually based on rococo) - #[default] - Default, - Shell, - Seedling, - AssetHubPolkadot, - AssetHubKusama, - AssetHubWestend, - Penpal(ParaId), - ContractsRococo, - CollectivesPolkadot, - CollectivesWestend, - Glutton, - BridgeHub(chain_spec::bridge_hubs::BridgeHubRuntimeType), -} - -trait RuntimeResolver { - fn runtime(&self) -> Runtime; -} - -impl RuntimeResolver for dyn ChainSpec { - fn runtime(&self) -> Runtime { - runtime(self.id()) - } -} - -/// Implementation, that can resolve [`Runtime`] from any json configuration file -impl RuntimeResolver for PathBuf { - fn runtime(&self) -> Runtime { - #[derive(Debug, serde::Deserialize)] - struct EmptyChainSpecWithId { - id: String, - } - - let file = std::fs::File::open(self).expect("Failed to open file"); - let reader = std::io::BufReader::new(file); - let chain_spec: EmptyChainSpecWithId = serde_json::from_reader(reader) - .expect("Failed to read 'json' file with ChainSpec configuration"); - - runtime(&chain_spec.id) - } -} - -fn runtime(id: &str) -> Runtime { - let id = id.replace('_', "-"); - let (_, id, para_id) = extract_parachain_id(&id); - - if id.starts_with("shell") { - Runtime::Shell - } else if id.starts_with("seedling") { - Runtime::Seedling - } else if id.starts_with("asset-hub-polkadot") | id.starts_with("statemint") { - Runtime::AssetHubPolkadot - } else if id.starts_with("asset-hub-kusama") | id.starts_with("statemine") { - Runtime::AssetHubKusama - } else if id.starts_with("asset-hub-westend") | id.starts_with("westmint") { - Runtime::AssetHubWestend - } else if id.starts_with("penpal") { - Runtime::Penpal(para_id.unwrap_or(ParaId::new(0))) - } else if id.starts_with("contracts-rococo") { - Runtime::ContractsRococo - } else if id.starts_with("collectives-polkadot") { - Runtime::CollectivesPolkadot - } else if id.starts_with("collectives-westend") { - Runtime::CollectivesWestend - } else if id.starts_with(chain_spec::bridge_hubs::BridgeHubRuntimeType::ID_PREFIX) { - Runtime::BridgeHub( - id.parse::() - .expect("Invalid value"), - ) - } else if id.starts_with("glutton") { - Runtime::Glutton - } else { - log::warn!("No specific runtime was recognized for ChainSpec's id: '{}', so Runtime::default() will be used", id); - Runtime::default() - } -} - -fn load_spec(id: &str) -> std::result::Result, String> { - let (id, _, para_id) = extract_parachain_id(id); - Ok(match id { - // - Defaul-like - "staging" => - Box::new(chain_spec::rococo_parachain::staging_rococo_parachain_local_config()), - "tick" => - Box::new(chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/tick.json")[..], - )?), - "trick" => - Box::new(chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/trick.json")[..], - )?), - "track" => - Box::new(chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/track.json")[..], - )?), - - // -- Starters - "shell" => Box::new(chain_spec::shell::get_shell_chain_spec()), - "seedling" => Box::new(chain_spec::seedling::get_seedling_chain_spec()), - - // -- Asset Hub Polkadot - "asset-hub-polkadot-dev" | "statemint-dev" => - Box::new(chain_spec::asset_hubs::asset_hub_polkadot_development_config()), - "asset-hub-polkadot-local" | "statemint-local" => - Box::new(chain_spec::asset_hubs::asset_hub_polkadot_local_config()), - // the chain spec as used for generating the upgrade genesis values - "asset-hub-polkadot-genesis" | "statemint-genesis" => - Box::new(chain_spec::asset_hubs::asset_hub_polkadot_config()), - // the shell-based chain spec as used for syncing - "asset-hub-polkadot" | "statemint" => - Box::new(chain_spec::asset_hubs::AssetHubPolkadotChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/asset-hub-polkadot.json")[..], - )?), - - // -- Asset Hub Kusama - "asset-hub-kusama-dev" | "statemine-dev" => - Box::new(chain_spec::asset_hubs::asset_hub_kusama_development_config()), - "asset-hub-kusama-local" | "statemine-local" => - Box::new(chain_spec::asset_hubs::asset_hub_kusama_local_config()), - // the chain spec as used for generating the upgrade genesis values - "asset-hub-kusama-genesis" | "statemine-genesis" => - Box::new(chain_spec::asset_hubs::asset_hub_kusama_config()), - // the shell-based chain spec as used for syncing - "asset-hub-kusama" | "statemine" => - Box::new(chain_spec::asset_hubs::AssetHubKusamaChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/asset-hub-kusama.json")[..], - )?), - - // -- Asset Hub Westend - "asset-hub-westend-dev" | "westmint-dev" => - Box::new(chain_spec::asset_hubs::asset_hub_westend_development_config()), - "asset-hub-westend-local" | "westmint-local" => - Box::new(chain_spec::asset_hubs::asset_hub_westend_local_config()), - // the chain spec as used for generating the upgrade genesis values - "asset-hub-westend-genesis" | "westmint-genesis" => - Box::new(chain_spec::asset_hubs::asset_hub_westend_config()), - // the shell-based chain spec as used for syncing - "asset-hub-westend" | "westmint" => - Box::new(chain_spec::asset_hubs::AssetHubWestendChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/asset-hub-westend.json")[..], - )?), - - // -- Polkadot Collectives - "collectives-polkadot-dev" => - Box::new(chain_spec::collectives::collectives_polkadot_development_config()), - "collectives-polkadot-local" => - Box::new(chain_spec::collectives::collectives_polkadot_local_config()), - "collectives-polkadot" => - Box::new(chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/collectives-polkadot.json")[..], - )?), - "collectives-westend" => - Box::new(chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/collectives-westend.json")[..], - )?), - - // -- Contracts on Rococo - "contracts-rococo-dev" => - Box::new(chain_spec::contracts::contracts_rococo_development_config()), - "contracts-rococo-local" => - Box::new(chain_spec::contracts::contracts_rococo_local_config()), - "contracts-rococo-genesis" => Box::new(chain_spec::contracts::contracts_rococo_config()), - "contracts-rococo" => - Box::new(chain_spec::contracts::ContractsRococoChainSpec::from_json_bytes( - &include_bytes!("../../parachains/chain-specs/contracts-rococo.json")[..], - )?), - - // -- BridgeHub - bridge_like_id - if bridge_like_id - .starts_with(chain_spec::bridge_hubs::BridgeHubRuntimeType::ID_PREFIX) => - bridge_like_id - .parse::() - .expect("invalid value") - .load_config()?, - - // -- Penpall - "penpal-kusama" => Box::new(chain_spec::penpal::get_penpal_chain_spec( - para_id.expect("Must specify parachain id"), - "kusama-local", - )), - "penpal-polkadot" => Box::new(chain_spec::penpal::get_penpal_chain_spec( - para_id.expect("Must specify parachain id"), - "polkadot-local", - )), - - // -- Glutton - "glutton-kusama-dev" => Box::new(chain_spec::glutton::glutton_development_config( - para_id.expect("Must specify parachain id"), - )), - "glutton-kusama-local" => Box::new(chain_spec::glutton::glutton_local_config( - para_id.expect("Must specify parachain id"), - )), - // the chain spec as used for generating the upgrade genesis values - "glutton-kusama-genesis" => Box::new(chain_spec::glutton::glutton_config( - para_id.expect("Must specify parachain id"), - )), - - // -- Fallback (generic chainspec) - "" => { - log::warn!("No ChainSpec.id specified, so using default one, based on rococo-parachain runtime"); - Box::new(chain_spec::rococo_parachain::rococo_parachain_local_config()) - }, - - // -- Loading a specific spec from disk - path => { - let path: PathBuf = path.into(); - match path.runtime() { - Runtime::AssetHubPolkadot => Box::new( - chain_spec::asset_hubs::AssetHubPolkadotChainSpec::from_json_file(path)?, - ), - Runtime::AssetHubKusama => - Box::new(chain_spec::asset_hubs::AssetHubKusamaChainSpec::from_json_file(path)?), - Runtime::AssetHubWestend => Box::new( - chain_spec::asset_hubs::AssetHubWestendChainSpec::from_json_file(path)?, - ), - Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => Box::new( - chain_spec::collectives::CollectivesPolkadotChainSpec::from_json_file(path)?, - ), - Runtime::Shell => - Box::new(chain_spec::shell::ShellChainSpec::from_json_file(path)?), - Runtime::Seedling => - Box::new(chain_spec::seedling::SeedlingChainSpec::from_json_file(path)?), - Runtime::ContractsRococo => - Box::new(chain_spec::contracts::ContractsRococoChainSpec::from_json_file(path)?), - Runtime::BridgeHub(bridge_hub_runtime_type) => - bridge_hub_runtime_type.chain_spec_from_json_file(path)?, - Runtime::Penpal(_para_id) => - Box::new(chain_spec::penpal::PenpalChainSpec::from_json_file(path)?), - Runtime::Glutton => - Box::new(chain_spec::glutton::GluttonChainSpec::from_json_file(path)?), - Runtime::Default => Box::new( - chain_spec::rococo_parachain::RococoParachainChainSpec::from_json_file(path)?, - ), - } - }, - }) -} - -/// Extracts the normalized chain id and parachain id from the input chain id. -/// (H/T to Phala for the idea) -/// E.g. "penpal-kusama-2004" yields ("penpal-kusama", Some(2004)) -fn extract_parachain_id(id: &str) -> (&str, &str, Option) { - const KUSAMA_TEST_PARA_PREFIX: &str = "penpal-kusama-"; - const POLKADOT_TEST_PARA_PREFIX: &str = "penpal-polkadot-"; - - const GLUTTON_PARA_DEV_PREFIX: &str = "glutton-kusama-dev-"; - const GLUTTON_PARA_LOCAL_PREFIX: &str = "glutton-kusama-local-"; - const GLUTTON_PARA_GENESIS_PREFIX: &str = "glutton-kusama-genesis-"; - - let (norm_id, orig_id, para) = if let Some(suffix) = id.strip_prefix(KUSAMA_TEST_PARA_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..KUSAMA_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(POLKADOT_TEST_PARA_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..POLKADOT_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_DEV_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_PARA_DEV_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_LOCAL_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_PARA_LOCAL_PREFIX.len() - 1], id, Some(para_id)) - } else if let Some(suffix) = id.strip_prefix(GLUTTON_PARA_GENESIS_PREFIX) { - let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); - (&id[..GLUTTON_PARA_GENESIS_PREFIX.len() - 1], id, Some(para_id)) - } else { - (id, id, None) - }; - - (norm_id, orig_id, para.map(Into::into)) -} - -impl SubstrateCli for Cli { - fn impl_name() -> String { - "Polkadot parachain".into() - } - - fn impl_version() -> String { - env!("SUBSTRATE_CLI_IMPL_VERSION").into() - } - - fn description() -> String { - format!( - "Polkadot parachain\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relaychain node.\n\n\ - {} [parachain-args] -- [relaychain-args]", - Self::executable_name() - ) - } - - fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() - } - - fn support_url() -> String { - "https://github.com/paritytech/cumulus/issues/new".into() - } - - fn copyright_start_year() -> i32 { - 2017 - } - - fn load_spec(&self, id: &str) -> std::result::Result, String> { - load_spec(id) - } -} - -impl SubstrateCli for RelayChainCli { - fn impl_name() -> String { - "Polkadot parachain".into() - } - - fn impl_version() -> String { - env!("SUBSTRATE_CLI_IMPL_VERSION").into() - } - - fn description() -> String { - format!( - "Polkadot parachain\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relay chain node.\n\n\ - {} [parachain-args] -- [relay_chain-args]", - Self::executable_name() - ) - } - - fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() - } - - fn support_url() -> String { - "https://github.com/paritytech/cumulus/issues/new".into() - } - - fn copyright_start_year() -> i32 { - 2017 - } - - fn load_spec(&self, id: &str) -> std::result::Result, String> { - polkadot_cli::Cli::from_iter([RelayChainCli::executable_name()].iter()).load_spec(id) - } -} - -/// Creates partial components for the runtimes that are supported by the benchmarks. -macro_rules! construct_benchmark_partials { - ($config:expr, |$partials:ident| $code:expr) => { - match $config.chain_spec.runtime() { - Runtime::AssetHubKusama => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - Runtime::AssetHubWestend => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - Runtime::AssetHubPolkadot => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AssetHubPolkadotAuraId>, - )?; - $code - }, - Runtime::BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { - chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot | - chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotDevelopment => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Kusama | - chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaDevelopment => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Westend => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Rococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoDevelopment => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Wococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::WococoLocal => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - }, - Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => { - let $partials = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - $code - }, - _ => Err("The chain is not supported".into()), - } - }; -} - -macro_rules! construct_async_run { - (|$components:ident, $cli:ident, $cmd:ident, $config:ident| $( $code:tt )* ) => {{ - let runner = $cli.create_runner($cmd)?; - match runner.config().chain_spec.runtime() { - Runtime::AssetHubWestend => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::AssetHubKusama => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::AssetHubPolkadot => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AssetHubPolkadotAuraId>, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::Shell => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::shell_build_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::Seedling => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::shell_build_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::ContractsRococo => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::contracts_rococo_build_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::BridgeHub(bridge_hub_runtime_type) => { - match bridge_hub_runtime_type { - chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot | - chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotDevelopment => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Kusama | - chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaDevelopment => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Westend => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Rococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoDevelopment => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - chain_spec::bridge_hubs::BridgeHubRuntimeType::Wococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::WococoLocal => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::aura_build_import_queue::<_, AuraId>, - )?; - - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - } - } - }, - Runtime::Penpal(_) | Runtime::Default => { - runner.async_run(|$config| { - let $components = new_partial::< - rococo_parachain_runtime::RuntimeApi, - _, - >( - &$config, - crate::service::rococo_parachain_build_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::Glutton => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::shell_build_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - } - } - }} -} - -/// Parse command line arguments into service configuration. -pub fn run() -> Result<()> { - let cli = Cli::from_args(); - - match &cli.subcommand { - Some(Subcommand::BuildSpec(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) - }, - Some(Subcommand::CheckBlock(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.import_queue)) - }) - }, - Some(Subcommand::ExportBlocks(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, config.database)) - }) - }, - Some(Subcommand::ExportState(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, config.chain_spec)) - }) - }, - Some(Subcommand::ImportBlocks(cmd)) => { - construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.import_queue)) - }) - }, - Some(Subcommand::Revert(cmd)) => construct_async_run!(|components, cli, cmd, config| { - Ok(cmd.run(components.client, components.backend, None)) - }), - Some(Subcommand::PurgeChain(cmd)) => { - let runner = cli.create_runner(cmd)?; - - runner.sync_run(|config| { - let polkadot_cli = RelayChainCli::new( - &config, - [RelayChainCli::executable_name()].iter().chain(cli.relaychain_args.iter()), - ); - - let polkadot_config = SubstrateCli::create_configuration( - &polkadot_cli, - &polkadot_cli, - config.tokio_handle.clone(), - ) - .map_err(|err| format!("Relay chain argument error: {}", err))?; - - cmd.run(config, polkadot_config) - }) - }, - Some(Subcommand::ExportGenesisState(cmd)) => - construct_async_run!(|components, cli, cmd, config| { - Ok(async move { cmd.run(&*config.chain_spec, &*components.client) }) - }), - Some(Subcommand::ExportGenesisWasm(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|_config| { - let spec = cli.load_spec(&cmd.shared_params.chain.clone().unwrap_or_default())?; - cmd.run(&*spec) - }) - }, - Some(Subcommand::Benchmark(cmd)) => { - let runner = cli.create_runner(cmd)?; - - // Switch on the concrete benchmark sub-command- - match cmd { - BenchmarkCmd::Pallet(cmd) => - if cfg!(feature = "runtime-benchmarks") { - runner.sync_run(|config| cmd.run::(config)) - } else { - Err("Benchmarking wasn't enabled when building the node. \ - You can enable it with `--features runtime-benchmarks`." - .into()) - }, - BenchmarkCmd::Block(cmd) => runner.sync_run(|config| { - construct_benchmark_partials!(config, |partials| cmd.run(partials.client)) - }), - #[cfg(not(feature = "runtime-benchmarks"))] - BenchmarkCmd::Storage(_) => - return Err(sc_cli::Error::Input( - "Compile with --features=runtime-benchmarks \ - to enable storage benchmarks." - .into(), - ) - .into()), - #[cfg(feature = "runtime-benchmarks")] - BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| { - construct_benchmark_partials!(config, |partials| { - let db = partials.backend.expose_db(); - let storage = partials.backend.expose_storage(); - - cmd.run(config, partials.client.clone(), db, storage) - }) - }), - BenchmarkCmd::Machine(cmd) => - runner.sync_run(|config| cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone())), - // NOTE: this allows the Client to leniently implement - // new benchmark commands without requiring a companion MR. - #[allow(unreachable_patterns)] - _ => Err("Benchmarking sub-command unsupported".into()), - } - }, - #[cfg(feature = "try-runtime")] - Some(Subcommand::TryRuntime(cmd)) => { - use try_runtime_cli::block_building_info::timestamp_with_aura_info; - - // grab the task manager. - let runner = cli.create_runner(cmd)?; - let registry = &runner.config().prometheus_config.as_ref().map(|cfg| &cfg.registry); - let task_manager = - sc_service::TaskManager::new(runner.config().tokio_handle.clone(), *registry) - .map_err(|e| format!("Error: {:?}", e))?; - type HostFunctions = - (sp_io::SubstrateHostFunctions, frame_benchmarking::benchmarking::HostFunctions); - - let info_provider = timestamp_with_aura_info(6000); - - runner.async_run(|_| { - Ok((cmd.run::(Some(info_provider)), task_manager)) - }) - }, - #[cfg(not(feature = "try-runtime"))] - Some(Subcommand::TryRuntime) => Err("Try-runtime was not enabled when building the node. \ - You can enable it with `--features try-runtime`." - .into()), - Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), - None => { - let runner = cli.create_runner(&cli.run.normalize())?; - let collator_options = cli.run.collator_options(); - - runner.run_node_until_exit(|config| async move { - // If Statemint (Statemine, Westmint, Rockmine) DB exists and we're using the - // asset-hub chain spec, then rename the base path to the new chain ID. In the case - // that both file paths exist, the node will exit, as the user must decide (by - // deleting one path) the information that they want to use as their DB. - let old_name = match config.chain_spec.id() { - "asset-hub-polkadot" => Some("statemint"), - "asset-hub-kusama" => Some("statemine"), - "asset-hub-westend" => Some("westmint"), - "asset-hub-rococo" => Some("rockmine"), - _ => None, - }; - - if let Some(old_name) = old_name { - let new_path = config.base_path.config_dir(config.chain_spec.id()); - let old_path = config.base_path.config_dir(old_name); - - if old_path.exists() && new_path.exists() { - return Err(format!( - "Found legacy {} path {} and new asset-hub path {}. Delete one path such that only one exists.", - old_name, old_path.display(), new_path.display() - ).into()) - } - - if old_path.exists() { - std::fs::rename(old_path.clone(), new_path.clone())?; - info!( - "Statemint renamed to Asset Hub. The filepath with associated data on disk has been renamed from {} to {}.", - old_path.display(), new_path.display() - ); - } - } - - let hwbench = (!cli.no_hardware_benchmarks).then_some( - config.database.path().map(|database_path| { - let _ = std::fs::create_dir_all(database_path); - sc_sysinfo::gather_hwbench(Some(database_path)) - })).flatten(); - - let para_id = chain_spec::Extensions::try_get(&*config.chain_spec) - .map(|e| e.para_id) - .ok_or("Could not find parachain extension in chain-spec.")?; - - let polkadot_cli = RelayChainCli::new( - &config, - [RelayChainCli::executable_name()].iter().chain(cli.relaychain_args.iter()), - ); - - let id = ParaId::from(para_id); - - let parachain_account = - AccountIdConversion::::into_account_truncating(&id); - - let tokio_handle = config.tokio_handle.clone(); - let polkadot_config = - SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, tokio_handle) - .map_err(|err| format!("Relay chain argument error: {}", err))?; - - info!("Parachain id: {:?}", id); - info!("Parachain Account: {}", parachain_account); - info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - - if !collator_options.relay_chain_rpc_urls.is_empty() && !cli.relaychain_args.is_empty() { - warn!( - "Detected relay chain node arguments together with --relay-chain-rpc-url. \ - This command starts a minimal Polkadot node that only uses a \ - network-related subset of all relay chain CLI options." - ); - } - - match config.chain_spec.runtime() { - Runtime::AssetHubPolkadot => crate::service::start_generic_aura_node::< - asset_hub_polkadot_runtime::RuntimeApi, - AssetHubPolkadotAuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::AssetHubKusama => crate::service::start_generic_aura_node::< - asset_hub_kusama_runtime::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::AssetHubWestend => crate::service::start_generic_aura_node::< - asset_hub_westend_runtime::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::CollectivesPolkadot | Runtime::CollectivesWestend => - crate::service::start_generic_aura_node::< - collectives_polkadot_runtime::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::Shell => - crate::service::start_shell_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::Seedling => crate::service::start_shell_node::< - seedling_runtime::RuntimeApi, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::ContractsRococo => crate::service::start_contracts_rococo_node( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { - chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot | - chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotDevelopment => - crate::service::start_generic_aura_node::< - chain_spec::bridge_hubs::polkadot::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - chain_spec::bridge_hubs::BridgeHubRuntimeType::Kusama | - chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaDevelopment => - crate::service::start_generic_aura_node::< - chain_spec::bridge_hubs::kusama::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - chain_spec::bridge_hubs::BridgeHubRuntimeType::Westend => - crate::service::start_generic_aura_node::< - chain_spec::bridge_hubs::westend::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - chain_spec::bridge_hubs::BridgeHubRuntimeType::Rococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoDevelopment => - crate::service::start_generic_aura_node::< - chain_spec::bridge_hubs::rococo::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - chain_spec::bridge_hubs::BridgeHubRuntimeType::Wococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::WococoLocal => - crate::service::start_generic_aura_node::< - chain_spec::bridge_hubs::wococo::RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - } - .map_err(Into::into), - Runtime::Penpal(_) | Runtime::Default => - crate::service::start_rococo_parachain_node( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::Glutton => - crate::service::start_shell_node::( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - } - }) - }, - } -} - -impl DefaultConfigurationValues for RelayChainCli { - fn p2p_listen_port() -> u16 { - 30334 - } - - fn rpc_listen_port() -> u16 { - 9945 - } - - fn prometheus_listen_port() -> u16 { - 9616 - } -} - -impl CliConfiguration for RelayChainCli { - fn shared_params(&self) -> &SharedParams { - self.base.base.shared_params() - } - - fn import_params(&self) -> Option<&ImportParams> { - self.base.base.import_params() - } - - fn network_params(&self) -> Option<&NetworkParams> { - self.base.base.network_params() - } - - fn keystore_params(&self) -> Option<&KeystoreParams> { - self.base.base.keystore_params() - } - - fn base_path(&self) -> Result> { - Ok(self - .shared_params() - .base_path()? - .or_else(|| self.base_path.clone().map(Into::into))) - } - - fn rpc_addr(&self, default_listen_port: u16) -> Result> { - self.base.base.rpc_addr(default_listen_port) - } - - fn prometheus_config( - &self, - default_listen_port: u16, - chain_spec: &Box, - ) -> Result> { - self.base.base.prometheus_config(default_listen_port, chain_spec) - } - - fn init( - &self, - _support_url: &String, - _impl_version: &String, - _logger_hook: F, - _config: &sc_service::Configuration, - ) -> Result<()> - where - F: FnOnce(&mut sc_cli::LoggerBuilder, &sc_service::Configuration), - { - unreachable!("PolkadotCli is never initialized; qed"); - } - - fn chain_id(&self, is_dev: bool) -> Result { - let chain_id = self.base.base.chain_id(is_dev)?; - - Ok(if chain_id.is_empty() { self.chain_id.clone().unwrap_or_default() } else { chain_id }) - } - - fn role(&self, is_dev: bool) -> Result { - self.base.base.role(is_dev) - } - - fn transaction_pool(&self, is_dev: bool) -> Result { - self.base.base.transaction_pool(is_dev) - } - - fn trie_cache_maximum_size(&self) -> Result> { - self.base.base.trie_cache_maximum_size() - } - - fn rpc_methods(&self) -> Result { - self.base.base.rpc_methods() - } - - fn rpc_max_connections(&self) -> Result { - self.base.base.rpc_max_connections() - } - - fn rpc_cors(&self, is_dev: bool) -> Result>> { - self.base.base.rpc_cors(is_dev) - } - - fn default_heap_pages(&self) -> Result> { - self.base.base.default_heap_pages() - } - - fn force_authoring(&self) -> Result { - self.base.base.force_authoring() - } - - fn disable_grandpa(&self) -> Result { - self.base.base.disable_grandpa() - } - - fn max_runtime_instances(&self) -> Result> { - self.base.base.max_runtime_instances() - } - - fn announce_block(&self) -> Result { - self.base.base.announce_block() - } - - fn telemetry_endpoints( - &self, - chain_spec: &Box, - ) -> Result> { - self.base.base.telemetry_endpoints(chain_spec) - } - - fn node_name(&self) -> Result { - self.base.base.node_name() - } -} - -#[cfg(test)] -mod tests { - use crate::{ - chain_spec::{get_account_id_from_seed, get_from_seed}, - command::{Runtime, RuntimeResolver}, - }; - use sc_chain_spec::{ChainSpec, ChainSpecExtension, ChainSpecGroup, ChainType, Extension}; - use serde::{Deserialize, Serialize}; - use sp_core::sr25519; - use std::path::PathBuf; - use tempfile::TempDir; - - #[derive( - Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension, Default, - )] - #[serde(deny_unknown_fields)] - pub struct Extensions1 { - pub attribute1: String, - pub attribute2: u32, - } - - #[derive( - Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension, Default, - )] - #[serde(deny_unknown_fields)] - pub struct Extensions2 { - pub attribute_x: String, - pub attribute_y: String, - pub attribute_z: u32, - } - - fn store_configuration(dir: &TempDir, spec: Box) -> PathBuf { - let raw_output = true; - let json = sc_service::chain_ops::build_spec(&*spec, raw_output) - .expect("Failed to build json string"); - let mut cfg_file_path = dir.path().to_path_buf(); - cfg_file_path.push(spec.id()); - cfg_file_path.set_extension("json"); - std::fs::write(&cfg_file_path, json).expect("Failed to write to json file"); - cfg_file_path - } - - pub type DummyChainSpec = - sc_service::GenericChainSpec; - - pub fn create_default_with_extensions( - id: &str, - extension: E, - ) -> DummyChainSpec { - DummyChainSpec::from_genesis( - "Dummy local testnet", - id, - ChainType::Local, - move || { - crate::chain_spec::rococo_parachain::testnet_genesis( - get_account_id_from_seed::("Alice"), - vec![ - get_from_seed::("Alice"), - get_from_seed::("Bob"), - ], - vec![get_account_id_from_seed::("Alice")], - 1000.into(), - ) - }, - Vec::new(), - None, - None, - None, - None, - extension, - ) - } - - #[test] - fn test_resolve_runtime_for_different_configuration_files() { - let temp_dir = tempfile::tempdir().expect("Failed to access tempdir"); - - let path = store_configuration( - &temp_dir, - Box::new(create_default_with_extensions("shell-1", Extensions1::default())), - ); - assert_eq!(Runtime::Shell, path.runtime()); - - let path = store_configuration( - &temp_dir, - Box::new(create_default_with_extensions("shell-2", Extensions2::default())), - ); - assert_eq!(Runtime::Shell, path.runtime()); - - let path = store_configuration( - &temp_dir, - Box::new(create_default_with_extensions("seedling", Extensions2::default())), - ); - assert_eq!(Runtime::Seedling, path.runtime()); - - let path = store_configuration( - &temp_dir, - Box::new(crate::chain_spec::rococo_parachain::rococo_parachain_local_config()), - ); - assert_eq!(Runtime::Default, path.runtime()); - - let path = store_configuration( - &temp_dir, - Box::new(crate::chain_spec::asset_hubs::asset_hub_kusama_local_config()), - ); - assert_eq!(Runtime::AssetHubKusama, path.runtime()); - - let path = store_configuration( - &temp_dir, - Box::new(crate::chain_spec::contracts::contracts_rococo_local_config()), - ); - assert_eq!(Runtime::ContractsRococo, path.runtime()); - } -} diff --git a/cumulus/polkadot-parachain/src/main.rs b/cumulus/polkadot-parachain/src/main.rs deleted file mode 100644 index d114d2f5f2c8..000000000000 --- a/cumulus/polkadot-parachain/src/main.rs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus test parachain collator - -#![warn(missing_docs)] -#![warn(unused_extern_crates)] - -mod chain_spec; -#[macro_use] -mod service; -mod cli; -mod command; -mod rpc; - -fn main() -> sc_cli::Result<()> { - command::run() -} diff --git a/cumulus/polkadot-parachain/src/rpc.rs b/cumulus/polkadot-parachain/src/rpc.rs deleted file mode 100644 index df6283388f9d..000000000000 --- a/cumulus/polkadot-parachain/src/rpc.rs +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Parachain-specific RPCs implementation. - -#![warn(missing_docs)] - -use std::sync::Arc; - -use parachains_common::{AccountId, Balance, Block, Nonce}; -use sc_client_api::AuxStore; -pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; -use sc_transaction_pool_api::TransactionPool; -use sp_api::ProvideRuntimeApi; -use sp_block_builder::BlockBuilder; -use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; - -/// A type representing all RPC extensions. -pub type RpcExtension = jsonrpsee::RpcModule<()>; - -/// Full client dependencies -pub struct FullDeps { - /// The client instance to use. - pub client: Arc, - /// Transaction pool instance. - pub pool: Arc

, - /// Whether to deny unsafe calls - pub deny_unsafe: DenyUnsafe, -} - -/// Instantiate all RPC extensions. -pub fn create_full( - deps: FullDeps, - backend: Arc, -) -> Result> -where - C: ProvideRuntimeApi - + HeaderBackend - + AuxStore - + HeaderMetadata - + Send - + Sync - + 'static, - C::Api: frame_rpc_system::AccountNonceApi, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, - C::Api: BlockBuilder, - P: TransactionPool + Sync + Send + 'static, - B: sc_client_api::Backend + Send + Sync + 'static, - B::State: sc_client_api::backend::StateBackend>, -{ - use frame_rpc_system::{System, SystemApiServer}; - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; - use substrate_state_trie_migration_rpc::{StateMigration, StateMigrationApiServer}; - - let mut module = RpcExtension::new(()); - let FullDeps { client, pool, deny_unsafe } = deps; - - module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; - module.merge(TransactionPayment::new(client.clone()).into_rpc())?; - module.merge(StateMigration::new(client, backend, deny_unsafe).into_rpc())?; - - Ok(module) -} - -/// Instantiate all RPCs we want at the contracts-rococo chain. -pub fn create_contracts_rococo( - deps: FullDeps, -) -> Result> -where - C: ProvideRuntimeApi - + sc_client_api::BlockBackend - + HeaderBackend - + AuxStore - + HeaderMetadata - + Send - + Sync - + 'static, - C::Api: frame_rpc_system::AccountNonceApi, - C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, - C::Api: BlockBuilder, - P: TransactionPool + Sync + Send + 'static, -{ - use frame_rpc_system::{System, SystemApiServer}; - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; - use sc_rpc::dev::{Dev, DevApiServer}; - - let mut module = RpcExtension::new(()); - let FullDeps { client, pool, deny_unsafe } = deps; - - module.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; - module.merge(TransactionPayment::new(client.clone()).into_rpc())?; - module.merge(Dev::new(client, deny_unsafe).into_rpc())?; - - Ok(module) -} diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs deleted file mode 100644 index 4377872bcf69..000000000000 --- a/cumulus/polkadot-parachain/src/service.rs +++ /dev/null @@ -1,1640 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use codec::Codec; -use cumulus_client_cli::CollatorOptions; -use cumulus_client_consensus_aura::{AuraConsensus, BuildAuraConsensusParams, SlotProportion}; -use cumulus_client_consensus_common::{ - ParachainBlockImport as TParachainBlockImport, ParachainCandidate, ParachainConsensus, -}; -use cumulus_client_service::{ - build_network, build_relay_chain_interface, prepare_node_config, start_collator, - start_full_node, BuildNetworkParams, StartCollatorParams, StartFullNodeParams, -}; -use cumulus_primitives_core::{ - relay_chain::{Hash as PHash, PersistedValidationData}, - ParaId, -}; -use cumulus_relay_chain_interface::RelayChainInterface; -use sp_core::Pair; - -use jsonrpsee::RpcModule; - -use crate::rpc; -pub use parachains_common::{AccountId, Balance, Block, BlockNumber, Hash, Header, Nonce}; - -use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; -use futures::lock::Mutex; -use sc_consensus::{ - import_queue::{BasicQueue, Verifier as VerifierT}, - BlockImportParams, ImportQueue, -}; -use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; -use sc_network::{config::FullNetworkConfiguration, NetworkBlock}; -use sc_network_sync::SyncingService; -use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; -use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; -use sp_api::{ApiExt, ConstructRuntimeApi}; -use sp_consensus_aura::AuraApi; -use sp_keystore::KeystorePtr; -use sp_runtime::{ - app_crypto::AppCrypto, - traits::{BlakeTwo256, Header as HeaderT}, -}; -use std::{marker::PhantomData, sync::Arc, time::Duration}; -use substrate_prometheus_endpoint::Registry; - -#[cfg(not(feature = "runtime-benchmarks"))] -type HostFunctions = sp_io::SubstrateHostFunctions; - -#[cfg(feature = "runtime-benchmarks")] -type HostFunctions = - (sp_io::SubstrateHostFunctions, frame_benchmarking::benchmarking::HostFunctions); - -type ParachainClient = TFullClient>; - -type ParachainBackend = TFullBackend; - -type ParachainBlockImport = - TParachainBlockImport>, ParachainBackend>; - -/// Native executor instance. -pub struct ShellRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for ShellRuntimeExecutor { - type ExtendHostFunctions = (); - - fn dispatch(method: &str, data: &[u8]) -> Option> { - shell_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - shell_runtime::native_version() - } -} - -/// Native Asset Hub Polkadot (Statemint) executor instance. -pub struct AssetHubPolkadotRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for AssetHubPolkadotRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - asset_hub_polkadot_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - asset_hub_polkadot_runtime::native_version() - } -} - -/// Native Asset Hub Kusama (Statemine) executor instance. -pub struct AssetHubKusamaExecutor; - -impl sc_executor::NativeExecutionDispatch for AssetHubKusamaExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - asset_hub_kusama_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - asset_hub_kusama_runtime::native_version() - } -} - -/// Native Asset Hub Westend (Westmint) executor instance. -pub struct AssetHubWestendExecutor; - -impl sc_executor::NativeExecutionDispatch for AssetHubWestendExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - asset_hub_westend_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - asset_hub_westend_runtime::native_version() - } -} - -/// Native Polkadot Collectives executor instance. -pub struct CollectivesPolkadotRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for CollectivesPolkadotRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - collectives_polkadot_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - collectives_polkadot_runtime::native_version() - } -} - -/// Native BridgeHubPolkadot executor instance. -pub struct BridgeHubPolkadotRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for BridgeHubPolkadotRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - bridge_hub_polkadot_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - bridge_hub_polkadot_runtime::native_version() - } -} - -/// Native BridgeHubKusama executor instance. -pub struct BridgeHubKusamaRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for BridgeHubKusamaRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - bridge_hub_kusama_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - bridge_hub_kusama_runtime::native_version() - } -} - -/// Native BridgeHubRococo executor instance. -pub struct BridgeHubRococoRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for BridgeHubRococoRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - bridge_hub_rococo_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - bridge_hub_rococo_runtime::native_version() - } -} - -/// Native contracts executor instance. -pub struct ContractsRococoRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for ContractsRococoRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - contracts_rococo_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - contracts_rococo_runtime::native_version() - } -} - -/// Native Glutton executor instance. -pub struct GluttonRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for GluttonRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - shell_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - shell_runtime::native_version() - } -} - -/// Starts a `ServiceBuilder` for a full service. -/// -/// Use this macro if you don't actually need the full service, but just the builder in order to -/// be able to perform chain operations. -pub fn new_partial( - config: &Configuration, - build_import_queue: BIQ, -) -> Result< - PartialComponents< - ParachainClient, - ParachainBackend, - (), - sc_consensus::DefaultImportQueue>, - sc_transaction_pool::FullPool>, - (ParachainBlockImport, Option, Option), - >, - sc_service::Error, -> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder, - sc_client_api::StateBackendFor: sp_api::StateBackend, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result< - sc_consensus::DefaultImportQueue>, - sc_service::Error, - >, -{ - let telemetry = config - .telemetry_endpoints - .clone() - .filter(|x| !x.is_empty()) - .map(|endpoints| -> Result<_, sc_telemetry::Error> { - let worker = TelemetryWorker::new(16)?; - let telemetry = worker.handle().new_telemetry(endpoints); - Ok((worker, telemetry)) - }) - .transpose()?; - - let heap_pages = config - .default_heap_pages - .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); - - let executor = sc_executor::WasmExecutor::::builder() - .with_execution_method(config.wasm_method) - .with_max_runtime_instances(config.max_runtime_instances) - .with_runtime_cache_size(config.runtime_cache_size) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) - .build(); - - let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts::( - config, - telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), - executor, - )?; - let client = Arc::new(client); - - let telemetry_worker_handle = telemetry.as_ref().map(|(worker, _)| worker.handle()); - - let telemetry = telemetry.map(|(worker, telemetry)| { - task_manager.spawn_handle().spawn("telemetry", None, worker.run()); - telemetry - }); - - let transaction_pool = sc_transaction_pool::BasicPool::new_full( - config.transaction_pool.clone(), - config.role.is_authority().into(), - config.prometheus_registry(), - task_manager.spawn_essential_handle(), - client.clone(), - ); - - let block_import = ParachainBlockImport::new(client.clone(), backend.clone()); - - let import_queue = build_import_queue( - client.clone(), - block_import.clone(), - config, - telemetry.as_ref().map(|telemetry| telemetry.handle()), - &task_manager, - )?; - - Ok(PartialComponents { - backend, - client, - import_queue, - keystore_container, - task_manager, - transaction_pool, - select_chain: (), - other: (block_import, telemetry, telemetry_worker_handle), - }) -} - -/// Start a shell node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api for -/// shell nodes. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_shell_node_impl( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - rpc_ext_builder: RB, - build_import_queue: BIQ, - build_consensus: BIC, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo, - sc_client_api::StateBackendFor: sp_api::StateBackend, - RB: Fn(Arc>) -> Result, sc_service::Error> - + 'static, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result< - sc_consensus::DefaultImportQueue>, - sc_service::Error, - >, - BIC: FnOnce( - Arc>, - ParachainBlockImport, - Option<&Registry>, - Option, - &TaskManager, - Arc, - Arc>>, - Arc>, - KeystorePtr, - bool, - ) -> Result>, sc_service::Error>, -{ - let parachain_config = prepare_node_config(parachain_config); - - let params = new_partial::(¶chain_config, build_import_queue)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; - - let client = params.client.clone(); - let backend = params.backend.clone(); - - let mut task_manager = params.task_manager; - - let (relay_chain_interface, collator_key) = build_relay_chain_interface( - polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let force_authoring = parachain_config.force_authoring; - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - }) - .await?; - - let rpc_client = client.clone(); - let rpc_builder = Box::new(move |_, _| rpc_ext_builder(rpc_client.clone())); - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - if validator { - warn_if_slow_hardware(&hwbench); - } - - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); - } - } - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let relay_chain_slot_duration = Duration::from_secs(6); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - - if validator { - let parachain_consensus = build_consensus( - client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), - &task_manager, - relay_chain_interface.clone(), - transaction_pool, - sync_service.clone(), - params.keystore_container.keystore(), - force_authoring, - )?; - - let spawner = task_manager.spawn_handle(); - - let params = StartCollatorParams { - para_id, - block_status: client.clone(), - announce_block, - client: client.clone(), - task_manager: &mut task_manager, - relay_chain_interface, - spawner, - parachain_consensus, - import_queue: import_queue_service, - collator_key: collator_key.expect("Command line arguments do not allow this. qed"), - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_collator(params).await?; - } else { - let params = StartFullNodeParams { - client: client.clone(), - announce_block, - task_manager: &mut task_manager, - para_id, - relay_chain_interface, - relay_chain_slot_duration, - import_queue: import_queue_service, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_full_node(params)?; - } - - start_network.start_network(); - - Ok((task_manager, client)) -} - -/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_node_impl( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - _rpc_ext_builder: RB, - build_import_queue: BIQ, - build_consensus: BIC, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi, - sc_client_api::StateBackendFor: sp_api::StateBackend, - RB: Fn(Arc>) -> Result, sc_service::Error>, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result< - sc_consensus::DefaultImportQueue>, - sc_service::Error, - >, - BIC: FnOnce( - Arc>, - ParachainBlockImport, - Option<&Registry>, - Option, - &TaskManager, - Arc, - Arc>>, - Arc>, - KeystorePtr, - bool, - ) -> Result>, sc_service::Error>, -{ - let parachain_config = prepare_node_config(parachain_config); - - let params = new_partial::(¶chain_config, build_import_queue)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; - - let client = params.client.clone(); - let backend = params.backend.clone(); - - let mut task_manager = params.task_manager; - let (relay_chain_interface, collator_key) = build_relay_chain_interface( - polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let force_authoring = parachain_config.force_authoring; - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - }) - .await?; - - let rpc_builder = { - let client = client.clone(); - let transaction_pool = transaction_pool.clone(); - - let backend_for_rpc = backend.clone(); - Box::new(move |deny_unsafe, _| { - let deps = rpc::FullDeps { - client: client.clone(), - pool: transaction_pool.clone(), - deny_unsafe, - }; - - rpc::create_full(deps, backend_for_rpc.clone()).map_err(Into::into) - }) - }; - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - if validator { - warn_if_slow_hardware(&hwbench); - } - - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); - } - } - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let relay_chain_slot_duration = Duration::from_secs(6); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - if validator { - let parachain_consensus = build_consensus( - client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), - &task_manager, - relay_chain_interface.clone(), - transaction_pool, - sync_service.clone(), - params.keystore_container.keystore(), - force_authoring, - )?; - - let spawner = task_manager.spawn_handle(); - - let params = StartCollatorParams { - para_id, - block_status: client.clone(), - announce_block, - client: client.clone(), - task_manager: &mut task_manager, - relay_chain_interface: relay_chain_interface.clone(), - spawner, - parachain_consensus, - import_queue: import_queue_service, - collator_key: collator_key.expect("Command line arguments do not allow this. qed"), - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_collator(params).await?; - } else { - let params = StartFullNodeParams { - client: client.clone(), - announce_block, - task_manager: &mut task_manager, - para_id, - relay_chain_interface, - relay_chain_slot_duration, - import_queue: import_queue_service, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_full_node(params)?; - } - - start_network.start_network(); - - Ok((task_manager, client)) -} - -/// Build the import queue for the rococo parachain runtime. -pub fn rococo_parachain_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result< - sc_consensus::DefaultImportQueue>, - sc_service::Error, -> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - cumulus_client_consensus_aura::import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - >(cumulus_client_consensus_aura::ImportQueueParams { - block_import, - client, - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - }, - registry: config.prometheus_registry(), - spawner: &task_manager.spawn_essential_handle(), - telemetry, - }) - .map_err(Into::into) -} - -/// Start a rococo parachain node. -pub async fn start_rococo_parachain_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<( - TaskManager, - Arc>, -)> { - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - para_id, - |_| Ok(RpcModule::new(())), - rococo_parachain_build_import_queue, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - force_authoring| { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - Ok(AuraConsensus::build::( - BuildAuraConsensusParams { - proposer_factory, - create_inherent_data_providers: move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface.clone(); - - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ).await; - - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - - Ok((slot, timestamp, parachain_inherent)) - } - }, - block_import, - para_client: client, - backoff_authoring_blocks: Option::<()>::None, - sync_oracle, - keystore, - force_authoring, - slot_duration, - // We got around 500ms for proposing - block_proposal_slot_portion: SlotProportion::new(1f32 / 24f32), - // And a maximum of 750ms if slots are skipped - max_block_proposal_slot_portion: Some(SlotProportion::new(1f32 / 16f32)), - telemetry, - }, - )) - }, - hwbench, - ) - .await -} - -/// Build the import queue for the shell runtime. -pub fn shell_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - _: Option, - task_manager: &TaskManager, -) -> Result>, sc_service::Error> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder, - sc_client_api::StateBackendFor: sp_api::StateBackend, -{ - cumulus_client_consensus_relay_chain::import_queue( - client, - block_import, - |_, _| async { Ok(()) }, - &task_manager.spawn_essential_handle(), - config.prometheus_registry(), - ) - .map_err(Into::into) -} - -/// Start a polkadot-shell parachain node. -pub async fn start_shell_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo, - sc_client_api::StateBackendFor: sp_api::StateBackend, -{ - start_shell_node_impl::( - parachain_config, - polkadot_config, - collator_options, - para_id, - |_| Ok(RpcModule::new(())), - shell_build_import_queue, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - _, - _, - _| { - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client, - transaction_pool, - prometheus_registry, - telemetry, - ); - - Ok(cumulus_client_consensus_relay_chain::build_relay_chain_consensus( - cumulus_client_consensus_relay_chain::BuildRelayChainConsensusParams { - para_id, - proposer_factory, - block_import, - relay_chain_interface: relay_chain_interface.clone(), - create_inherent_data_providers: move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface.clone(); - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ).await; - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - Ok(parachain_inherent) - } - }, - }, - )) - }, - hwbench, - ) - .await -} - -enum BuildOnAccess { - Uninitialized(Option R + Send + Sync>>), - Initialized(R), -} - -impl BuildOnAccess { - fn get_mut(&mut self) -> &mut R { - loop { - match self { - Self::Uninitialized(f) => { - *self = Self::Initialized((f.take().unwrap())()); - }, - Self::Initialized(ref mut r) => return r, - } - } - } -} - -/// Special [`ParachainConsensus`] implementation that waits for the upgrade from -/// shell to a parachain runtime that implements Aura. -struct WaitForAuraConsensus { - client: Arc, - aura_consensus: Arc>>>>, - relay_chain_consensus: Arc>>>, - _phantom: PhantomData, -} - -impl Clone for WaitForAuraConsensus { - fn clone(&self) -> Self { - Self { - client: self.client.clone(), - aura_consensus: self.aura_consensus.clone(), - relay_chain_consensus: self.relay_chain_consensus.clone(), - _phantom: PhantomData, - } - } -} - -#[async_trait::async_trait] -impl ParachainConsensus for WaitForAuraConsensus -where - Client: sp_api::ProvideRuntimeApi + Send + Sync, - Client::Api: AuraApi, - AuraId: Send + Codec + Sync, -{ - async fn produce_candidate( - &mut self, - parent: &Header, - relay_parent: PHash, - validation_data: &PersistedValidationData, - ) -> Option> { - if self - .client - .runtime_api() - .has_api::>(parent.hash()) - .unwrap_or(false) - { - self.aura_consensus - .lock() - .await - .get_mut() - .produce_candidate(parent, relay_parent, validation_data) - .await - } else { - self.relay_chain_consensus - .lock() - .await - .produce_candidate(parent, relay_parent, validation_data) - .await - } - } -} - -struct Verifier { - client: Arc, - aura_verifier: BuildOnAccess>>, - relay_chain_verifier: Box>, - _phantom: PhantomData, -} - -#[async_trait::async_trait] -impl VerifierT for Verifier -where - Client: sp_api::ProvideRuntimeApi + Send + Sync, - Client::Api: AuraApi, - AuraId: Send + Sync + Codec, -{ - async fn verify( - &mut self, - block_import: BlockImportParams, - ) -> Result, String> { - if self - .client - .runtime_api() - .has_api::>(*block_import.header.parent_hash()) - .unwrap_or(false) - { - self.aura_verifier.get_mut().verify(block_import).await - } else { - self.relay_chain_verifier.verify(block_import).await - } - } -} - -/// Build the import queue for Aura-based runtimes. -pub fn aura_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry_handle: Option, - task_manager: &TaskManager, -) -> Result>, sc_service::Error> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + sp_consensus_aura::AuraApi::Pair as Pair>::Public>, - sc_client_api::StateBackendFor: sp_api::StateBackend, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - let client2 = client.clone(); - - let aura_verifier = move || { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client2).unwrap(); - - Box::new(cumulus_client_consensus_aura::build_verifier::< - ::Pair, - _, - _, - _, - >(cumulus_client_consensus_aura::BuildVerifierParams { - client: client2.clone(), - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - }, - telemetry: telemetry_handle, - })) as Box<_> - }; - - let relay_chain_verifier = - Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { Ok(()) })) as Box<_>; - - let verifier = Verifier { - client, - relay_chain_verifier, - aura_verifier: BuildOnAccess::Uninitialized(Some(Box::new(aura_verifier))), - _phantom: PhantomData, - }; - - let registry = config.prometheus_registry(); - let spawner = task_manager.spawn_essential_handle(); - - Ok(BasicQueue::new(verifier, Box::new(block_import), None, &spawner, registry)) -} - -/// Start an aura powered parachain node. Asset Hub and Collectives use this. -pub async fn start_generic_aura_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + sp_consensus_aura::AuraApi::Pair as Pair>::Public> - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi, - sc_client_api::StateBackendFor: sp_api::StateBackend, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - para_id, - |_| Ok(RpcModule::new(())), - aura_build_import_queue::<_, AuraId>, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - force_authoring| { - let spawn_handle = task_manager.spawn_handle(); - let client2 = client.clone(); - let block_import2 = block_import.clone(); - let transaction_pool2 = transaction_pool.clone(); - let telemetry2 = telemetry.clone(); - let prometheus_registry2 = prometheus_registry.map(|r| (*r).clone()); - let relay_chain_for_aura = relay_chain_interface.clone(); - - let aura_consensus = BuildOnAccess::Uninitialized(Some(Box::new(move || { - let slot_duration = - cumulus_client_consensus_aura::slot_duration(&*client2).unwrap(); - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - spawn_handle, - client2.clone(), - transaction_pool2, - prometheus_registry2.as_ref(), - telemetry2.clone(), - ); - - AuraConsensus::build::<::Pair, _, _, _, _, _, _>( - BuildAuraConsensusParams { - proposer_factory, - create_inherent_data_providers: - move |_, (relay_parent, validation_data)| { - let relay_chain_for_aura = relay_chain_for_aura.clone(); - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_for_aura, - &validation_data, - para_id, - ).await; - - let timestamp = - sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - let parachain_inherent = - parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - - Ok((slot, timestamp, parachain_inherent)) - } - }, - block_import: block_import2, - para_client: client2, - backoff_authoring_blocks: Option::<()>::None, - sync_oracle, - keystore, - force_authoring, - slot_duration, - // We got around 500ms for proposing - block_proposal_slot_portion: SlotProportion::new(1f32 / 24f32), - // And a maximum of 750ms if slots are skipped - max_block_proposal_slot_portion: Some(SlotProportion::new(1f32 / 16f32)), - telemetry: telemetry2, - }, - ) - }))); - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry, - ); - - let relay_chain_consensus = - cumulus_client_consensus_relay_chain::build_relay_chain_consensus( - cumulus_client_consensus_relay_chain::BuildRelayChainConsensusParams { - para_id, - proposer_factory, - block_import, - relay_chain_interface: relay_chain_interface.clone(), - create_inherent_data_providers: - move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface.clone(); - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ).await; - let parachain_inherent = - parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - Ok(parachain_inherent) - } - }, - }, - ); - - let parachain_consensus = Box::new(WaitForAuraConsensus { - client, - aura_consensus: Arc::new(Mutex::new(aura_consensus)), - relay_chain_consensus: Arc::new(Mutex::new(relay_chain_consensus)), - _phantom: PhantomData, - }); - - Ok(parachain_consensus) - }, - hwbench, - ) - .await -} - -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_contracts_rococo_node_impl( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - _rpc_ext_builder: RB, - build_import_queue: BIQ, - build_consensus: BIC, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt< - Block, - StateBackend = sc_client_api::StateBackendFor, - > + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi, - sc_client_api::StateBackendFor: sp_api::StateBackend, - RB: Fn(Arc>) -> Result, sc_service::Error>, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result< - sc_consensus::DefaultImportQueue>, - sc_service::Error, - >, - BIC: FnOnce( - Arc>, - ParachainBlockImport, - Option<&Registry>, - Option, - &TaskManager, - Arc, - Arc>>, - Arc>, - KeystorePtr, - bool, - ) -> Result>, sc_service::Error>, -{ - let parachain_config = prepare_node_config(parachain_config); - - let params = new_partial::(¶chain_config, build_import_queue)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; - - let client = params.client.clone(); - let backend = params.backend.clone(); - let mut task_manager = params.task_manager; - - let (relay_chain_interface, collator_key) = build_relay_chain_interface( - polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let force_authoring = parachain_config.force_authoring; - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - }) - .await?; - - let rpc_builder = { - let client = client.clone(); - let transaction_pool = transaction_pool.clone(); - - Box::new(move |deny_unsafe, _| { - let deps = crate::rpc::FullDeps { - client: client.clone(), - pool: transaction_pool.clone(), - deny_unsafe, - }; - - crate::rpc::create_contracts_rococo(deps).map_err(Into::into) - }) - }; - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - if validator { - warn_if_slow_hardware(&hwbench); - } - - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); - } - } - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let relay_chain_slot_duration = Duration::from_secs(6); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - if validator { - let parachain_consensus = build_consensus( - client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), - &task_manager, - relay_chain_interface.clone(), - transaction_pool, - sync_service.clone(), - params.keystore_container.keystore(), - force_authoring, - )?; - - let spawner = task_manager.spawn_handle(); - - let params = StartCollatorParams { - para_id, - block_status: client.clone(), - announce_block, - client: client.clone(), - task_manager: &mut task_manager, - relay_chain_interface, - spawner, - parachain_consensus, - import_queue: import_queue_service, - collator_key: collator_key.expect("Command line arguments do not allow this. qed"), - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_collator(params).await?; - } else { - let params = StartFullNodeParams { - client: client.clone(), - announce_block, - task_manager: &mut task_manager, - para_id, - relay_chain_interface, - relay_chain_slot_duration, - import_queue: import_queue_service, - recovery_handle: Box::new(overseer_handle), - sync_service, - }; - - start_full_node(params)?; - } - - start_network.start_network(); - - Ok((task_manager, client)) -} - -#[allow(clippy::type_complexity)] -pub fn contracts_rococo_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result< - sc_consensus::DefaultImportQueue>, - sc_service::Error, -> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - cumulus_client_consensus_aura::import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - >(cumulus_client_consensus_aura::ImportQueueParams { - block_import, - client, - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - }, - registry: config.prometheus_registry(), - spawner: &task_manager.spawn_essential_handle(), - telemetry, - }) - .map_err(Into::into) -} - -/// Start a parachain node. -pub async fn start_contracts_rococo_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<( - TaskManager, - Arc>, -)> { - start_contracts_rococo_node_impl::( - parachain_config, - polkadot_config, - collator_options, - para_id, - |_| Ok(RpcModule::new(())), - contracts_rococo_build_import_queue, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - force_authoring| { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - Ok(AuraConsensus::build::( - BuildAuraConsensusParams { - proposer_factory, - create_inherent_data_providers: move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface.clone(); - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ).await; - - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - - Ok((slot, timestamp, parachain_inherent)) - } - }, - block_import, - para_client: client, - backoff_authoring_blocks: Option::<()>::None, - sync_oracle, - keystore, - force_authoring, - slot_duration, - // We got around 500ms for proposing - block_proposal_slot_portion: SlotProportion::new(1f32 / 24f32), - // And a maximum of 750ms if slots are skipped - max_block_proposal_slot_portion: Some(SlotProportion::new(1f32 / 16f32)), - telemetry, - }, - )) - }, - hwbench, - ) - .await -} - -/// Checks that the hardware meets the requirements and print a warning otherwise. -fn warn_if_slow_hardware(hwbench: &sc_sysinfo::HwBench) { - // Polkadot para-chains should generally use these requirements to ensure that the relay-chain - // will not take longer than expected to import its blocks. - if !frame_benchmarking_cli::SUBSTRATE_REFERENCE_HARDWARE.check_hardware(hwbench) { - log::warn!( - "⚠️ The hardware does not meet the minimal requirements for role 'Authority' find out more at:\n\ - https://wiki.polkadot.network/docs/maintain-guides-how-to-validate-polkadot#reference-hardware" - ); - } -} diff --git a/cumulus/polkadot-parachain/tests/benchmark_storage_works.rs b/cumulus/polkadot-parachain/tests/benchmark_storage_works.rs deleted file mode 100644 index df3078b4dab8..000000000000 --- a/cumulus/polkadot-parachain/tests/benchmark_storage_works.rs +++ /dev/null @@ -1,44 +0,0 @@ -#![cfg(feature = "runtime-benchmarks")] - -use assert_cmd::cargo::cargo_bin; -use std::{ - path::Path, - process::{Command, ExitStatus}, -}; -use tempfile::tempdir; - -/// The runtimes that this command supports. -static RUNTIMES: [&str; 3] = ["asset-hub-westend", "asset-hub-kusama", "asset-hub-polkadot"]; - -/// The `benchmark storage` command works for the dev runtimes. -#[test] -#[ignore] -fn benchmark_storage_works() { - for runtime in RUNTIMES { - let tmp_dir = tempdir().expect("could not create a temp dir"); - let base_path = tmp_dir.path(); - let runtime = format!("{}-dev", runtime); - - // Benchmarking the storage works and creates the weight file. - assert!(benchmark_storage("rocksdb", &runtime, base_path).success()); - assert!(base_path.join("rocksdb_weights.rs").exists()); - - assert!(benchmark_storage("paritydb", &runtime, base_path).success()); - assert!(base_path.join("paritydb_weights.rs").exists()); - } -} - -/// Invoke the `benchmark storage` sub-command for the given database and runtime. -fn benchmark_storage(db: &str, runtime: &str, base_path: &Path) -> ExitStatus { - Command::new(cargo_bin("polkadot-parachain")) - .args(["benchmark", "storage", "--chain", runtime]) - .arg("--db") - .arg(db) - .arg("--weight-path") - .arg(base_path) - .args(["--state-version", "0"]) - .args(["--warmups", "0"]) - .args(["--add", "100", "--mul", "1.2", "--metric", "p75"]) - .status() - .unwrap() -} diff --git a/cumulus/polkadot-parachain/tests/common.rs b/cumulus/polkadot-parachain/tests/common.rs deleted file mode 100644 index d8ecfe9bcbe5..000000000000 --- a/cumulus/polkadot-parachain/tests/common.rs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -#![cfg(unix)] - -use assert_cmd::cargo::cargo_bin; -use nix::{ - sys::signal::{kill, Signal}, - unistd::Pid, -}; -use std::{ - io::{BufRead, BufReader, Read}, - ops::{Deref, DerefMut}, - path::Path, - process::{self, Child, Command, ExitStatus}, -}; -use tokio::time::{sleep, Duration}; - -/// Wait for the given `child` the given number of `secs`. -/// -/// Returns the `Some(exit status)` or `None` if the process did not finish in the given time. -pub fn wait_for(child: &mut Child, secs: u64) -> Result { - let result = wait_timeout::ChildExt::wait_timeout(child, Duration::from_secs(5.min(secs))) - .map_err(|_| ())?; - if let Some(exit_status) = result { - Ok(exit_status) - } else { - if secs > 5 { - eprintln!("Child process taking over 5 seconds to exit gracefully"); - let result = wait_timeout::ChildExt::wait_timeout(child, Duration::from_secs(secs - 5)) - .map_err(|_| ())?; - if let Some(exit_status) = result { - return Ok(exit_status) - } - } - eprintln!("Took too long to exit (> {} seconds). Killing...", secs); - let _ = child.kill(); - child.wait().unwrap(); - Err(()) - } -} - -/// Run the node for a while (till the RPC is up + 30 secs) -/// TODO: needs to be revisited to hit the RPC -pub async fn run_node_for_a_while(base_path: &Path, args: &[&str], signal: Signal) { - let mut cmd = Command::new(cargo_bin("polkadot-parachain")) - .stdout(process::Stdio::piped()) - .stderr(process::Stdio::piped()) - .arg("-d") - .arg(base_path) - .args(args) - .spawn() - .unwrap(); - - let stderr = cmd.stderr.take().unwrap(); - - let mut child = KillChildOnDrop(cmd); - // TODO: use this instead of the timeout going forward? - let (_, _) = find_ws_url_from_output(stderr); - - // TODO: Revisit this to find a better approach for collators - sleep(Duration::from_secs(120)).await; - - assert!(child.try_wait().unwrap().is_none(), "the process should still be running"); - - // Stop the process - kill(Pid::from_raw(child.id().try_into().unwrap()), signal).unwrap(); - assert!(wait_for(&mut child, 40).map(|x| x.success()).unwrap()); -} - -pub struct KillChildOnDrop(pub Child); - -impl Drop for KillChildOnDrop { - fn drop(&mut self) { - let _ = self.0.kill(); - } -} - -impl Deref for KillChildOnDrop { - type Target = Child; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl DerefMut for KillChildOnDrop { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - -/// Read the RPC server address from the output. -/// -/// This is hack to get the actual bound sockaddr because -/// substrate assigns a random port if the specified port was already bound. -pub fn find_ws_url_from_output(read: impl Read + Send) -> (String, String) { - let mut data = String::new(); - - let ws_url = BufReader::new(read) - .lines() - .find_map(|line| { - let line = - line.expect("failed to obtain next line from stdout for WS address discovery"); - - data.push_str(&line); - data.push('\n'); - - // does the line contain our port (we expect this specific output from substrate). - let sock_addr = match line.split_once("Running JSON-RPC server: addr=") { - None => return None, - Some((_, after)) => after.split_once(',').unwrap().0, - }; - - Some(format!("ws://{}", sock_addr)) - }) - .unwrap_or_else(|| { - eprintln!("Output:\n{}", data); - panic!("We should get an address") - }); - - (ws_url, data) -} diff --git a/cumulus/polkadot-parachain/tests/polkadot_argument_parsing.rs b/cumulus/polkadot-parachain/tests/polkadot_argument_parsing.rs deleted file mode 100644 index 0538a47aa93a..000000000000 --- a/cumulus/polkadot-parachain/tests/polkadot_argument_parsing.rs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use tempfile::tempdir; - -mod common; - -#[tokio::test] -#[cfg(unix)] -#[ignore] -async fn polkadot_argument_parsing() { - use nix::sys::signal::Signal::{SIGINT, SIGTERM}; - let base_dir = tempdir().expect("could not create a temp dir"); - - let args = &[ - "--", - "--chain=rococo-local", - "--bootnodes", - "/ip4/127.0.0.1/tcp/30333/p2p/Qmbx43psh7LVkrYTRXisUpzCubbgYojkejzAgj5mteDnxy", - "--bootnodes", - "/ip4/127.0.0.1/tcp/50500/p2p/Qma6SpS7tzfCrhtgEVKR9Uhjmuv55ovC3kY6y6rPBxpWde", - ]; - - common::run_node_for_a_while(base_dir.path(), args, SIGINT).await; - common::run_node_for_a_while(base_dir.path(), args, SIGTERM).await; -} diff --git a/cumulus/polkadot-parachain/tests/polkadot_mdns_issue.rs b/cumulus/polkadot-parachain/tests/polkadot_mdns_issue.rs deleted file mode 100644 index c88c81230b04..000000000000 --- a/cumulus/polkadot-parachain/tests/polkadot_mdns_issue.rs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use tempfile::tempdir; - -mod common; - -#[tokio::test] -#[cfg(unix)] -#[ignore] -async fn interrupt_polkadot_mdns_issue_test() { - use nix::sys::signal::Signal::{SIGINT, SIGTERM}; - - let base_dir = tempdir().expect("could not create a temp dir"); - - let args = &["--", "--chain=rococo-local"]; - - common::run_node_for_a_while(base_dir.path(), args, SIGINT).await; - common::run_node_for_a_while(base_dir.path(), args, SIGTERM).await; -} diff --git a/cumulus/polkadot-parachain/tests/purge_chain_works.rs b/cumulus/polkadot-parachain/tests/purge_chain_works.rs deleted file mode 100644 index 8a41ee780c56..000000000000 --- a/cumulus/polkadot-parachain/tests/purge_chain_works.rs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use assert_cmd::cargo::cargo_bin; -use nix::sys::signal::SIGINT; -use std::process::Command; -use tempfile::tempdir; - -mod common; - -#[tokio::test] -#[cfg(unix)] -#[ignore] -async fn purge_chain_works() { - // Check that both databases are deleted - - let base_dir = tempdir().expect("could not create a temp dir"); - let base_dir_path = format!("{}/polkadot", base_dir.path().display()); - - let args = &["--", "-d", &base_dir_path, "--chain=rococo-local"]; - - common::run_node_for_a_while(base_dir.path(), args, SIGINT).await; - - assert!(base_dir.path().join("chains/local_testnet/db/full").exists()); - assert!(base_dir.path().join("polkadot/chains/rococo_local_testnet/db/full").exists()); - - let status = Command::new(cargo_bin("polkadot-parachain")) - .args(["purge-chain", "-d"]) - .arg(base_dir.path()) - .arg("-y") - .status() - .unwrap(); - assert!(status.success()); - - // Make sure that the `parachain_local_testnet` chain folder exists, but the `db` is deleted. - assert!(base_dir.path().join("chains/local_testnet").exists()); - assert!(!base_dir.path().join("chains/local_testnet/db/full").exists()); - assert!(base_dir.path().join("polkadot/chains/rococo_local_testnet").exists()); - assert!(!base_dir.path().join("polkadot/chains/rococo_local_testnet/db/full").exists()); -} diff --git a/cumulus/polkadot-parachain/tests/running_the_node_and_interrupt.rs b/cumulus/polkadot-parachain/tests/running_the_node_and_interrupt.rs deleted file mode 100644 index 254602a21844..000000000000 --- a/cumulus/polkadot-parachain/tests/running_the_node_and_interrupt.rs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use tempfile::tempdir; - -mod common; - -#[tokio::test] -#[cfg(unix)] -#[ignore] -async fn running_the_node_works_and_can_be_interrupted() { - use nix::sys::signal::Signal::{SIGINT, SIGTERM}; - - let base_dir = tempdir().expect("could not create a temp dir"); - - let args = &["--", "--chain=rococo-local"]; - - common::run_node_for_a_while(base_dir.path(), args, SIGINT).await; - common::run_node_for_a_while(base_dir.path(), args, SIGTERM).await; -} diff --git a/cumulus/primitives/aura/Cargo.toml b/cumulus/primitives/aura/Cargo.toml deleted file mode 100644 index ca6eadf25f13..000000000000 --- a/cumulus/primitives/aura/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "cumulus-primitives-aura" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } - -# Substrate -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-consensus-aura = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "sp-api/std", - "sp-consensus-aura/std", - "sp-runtime/std", - "sp-std/std", - "polkadot-core-primitives/std", - "polkadot-primitives/std", -] diff --git a/cumulus/primitives/aura/src/lib.rs b/cumulus/primitives/aura/src/lib.rs deleted file mode 100644 index a0d7a0206a63..000000000000 --- a/cumulus/primitives/aura/src/lib.rs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Core primitives for Aura in Cumulus. -//! -//! In particular, this exposes the [`AuraUnincludedSegmentApi`] which is used to regulate -//! the behavior of Aura within a parachain context. - -#![cfg_attr(not(feature = "std"), no_std)] - -pub use sp_consensus_aura::Slot; - -sp_api::decl_runtime_apis! { - /// This runtime API is used to inform potential block authors whether they will - /// have the right to author at a slot, assuming they have claimed the slot. - /// - /// In particular, this API allows Aura-based parachains to regulate their "unincluded segment", - /// which is the section of the head of the chain which has not yet been made available in the - /// relay chain. - /// - /// When the unincluded segment is short, Aura chains will allow authors to create multiple - /// blocks per slot in order to build a backlog. When it is saturated, this API will limit - /// the amount of blocks that can be created. - pub trait AuraUnincludedSegmentApi { - /// Whether it is legal to extend the chain, assuming the given block is the most - /// recently included one as-of the relay parent that will be built against, and - /// the given slot. - /// - /// This should be consistent with the logic the runtime uses when validating blocks to - /// avoid issues. - /// - /// When the unincluded segment is empty, i.e. `included_hash == at`, where at is the block - /// whose state we are querying against, this must always return `true` as long as the slot - /// is more recent than the included block itself. - fn can_build_upon(included_hash: Block::Hash, slot: Slot) -> bool; - } -} diff --git a/cumulus/primitives/core/Cargo.toml b/cumulus/primitives/core/Cargo.toml deleted file mode 100644 index 7d7ef168bff7..000000000000 --- a/cumulus/primitives/core/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -[package] -name = "cumulus-primitives-core" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-core-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "sp-api/std", - "sp-runtime/std", - "sp-std/std", - "sp-trie/std", - "polkadot-core-primitives/std", - "polkadot-parachain/std", - "polkadot-primitives/std", -] diff --git a/cumulus/primitives/core/src/lib.rs b/cumulus/primitives/core/src/lib.rs deleted file mode 100644 index 19cc69ea3013..000000000000 --- a/cumulus/primitives/core/src/lib.rs +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus related core primitive types and traits. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, Encode}; -use polkadot_parachain::primitives::HeadData; -use scale_info::TypeInfo; -use sp_runtime::RuntimeDebug; -use sp_std::prelude::*; - -pub use polkadot_core_primitives::InboundDownwardMessage; -pub use polkadot_parachain::primitives::{ - DmpMessageHandler, Id as ParaId, IsSystem, UpwardMessage, ValidationParams, XcmpMessageFormat, - XcmpMessageHandler, -}; -pub use polkadot_primitives::{ - AbridgedHostConfiguration, AbridgedHrmpChannel, PersistedValidationData, -}; - -pub use sp_runtime::{ - generic::{Digest, DigestItem}, - traits::Block as BlockT, - ConsensusEngineId, -}; - -pub use xcm::latest::prelude::*; - -/// A module that re-exports relevant relay chain definitions. -pub mod relay_chain { - pub use polkadot_core_primitives::*; - pub use polkadot_primitives::*; -} - -/// An inbound HRMP message. -pub type InboundHrmpMessage = polkadot_primitives::InboundHrmpMessage; - -/// And outbound HRMP message -pub type OutboundHrmpMessage = polkadot_primitives::OutboundHrmpMessage; - -/// Error description of a message send failure. -#[derive(Eq, PartialEq, Copy, Clone, RuntimeDebug, Encode, Decode)] -pub enum MessageSendError { - /// The dispatch queue is full. - QueueFull, - /// There does not exist a channel for sending the message. - NoChannel, - /// The message is too big to ever fit in a channel. - TooBig, - /// Some other error. - Other, -} - -impl From for &'static str { - fn from(e: MessageSendError) -> Self { - use MessageSendError::*; - match e { - QueueFull => "QueueFull", - NoChannel => "NoChannel", - TooBig => "TooBig", - Other => "Other", - } - } -} - -/// Information about an XCMP channel. -pub struct ChannelInfo { - /// The maximum number of messages that can be pending in the channel at once. - pub max_capacity: u32, - /// The maximum total size of the messages that can be pending in the channel at once. - pub max_total_size: u32, - /// The maximum message size that could be put into the channel. - pub max_message_size: u32, - /// The current number of messages pending in the channel. - /// Invariant: should be less or equal to `max_capacity`.s`. - pub msg_count: u32, - /// The total size in bytes of all message payloads in the channel. - /// Invariant: should be less or equal to `max_total_size`. - pub total_size: u32, -} - -pub trait GetChannelInfo { - fn get_channel_status(id: ParaId) -> ChannelStatus; - fn get_channel_max(id: ParaId) -> Option; -} - -/// Something that should be called when sending an upward message. -pub trait UpwardMessageSender { - /// Send the given UMP message; return the expected number of blocks before the message will - /// be dispatched or an error if the message cannot be sent. - /// return the hash of the message sent - fn send_upward_message(msg: UpwardMessage) -> Result<(u32, XcmHash), MessageSendError>; -} -impl UpwardMessageSender for () { - fn send_upward_message(_msg: UpwardMessage) -> Result<(u32, XcmHash), MessageSendError> { - Err(MessageSendError::NoChannel) - } -} - -/// The status of a channel. -pub enum ChannelStatus { - /// Channel doesn't exist/has been closed. - Closed, - /// Channel is completely full right now. - Full, - /// Channel is ready for sending; the two parameters are the maximum size a valid message may - /// have right now, and the maximum size a message may ever have (this will generally have been - /// available during message construction, but it's possible the channel parameters changed in - /// the meantime). - Ready(usize, usize), -} - -/// A means of figuring out what outbound XCMP messages should be being sent. -pub trait XcmpMessageSource { - /// Take a single XCMP message from the queue for the given `dest`, if one exists. - fn take_outbound_messages(maximum_channels: usize) -> Vec<(ParaId, Vec)>; -} - -impl XcmpMessageSource for () { - fn take_outbound_messages(_maximum_channels: usize) -> Vec<(ParaId, Vec)> { - Vec::new() - } -} - -/// The "quality of service" considerations for message sending. -#[derive(Eq, PartialEq, Clone, Copy, Encode, Decode, RuntimeDebug)] -pub enum ServiceQuality { - /// Ensure that this message is dispatched in the same relative order as any other messages - /// that were also sent with `Ordered`. This only guarantees message ordering on the dispatch - /// side, and not necessarily on the execution side. - Ordered, - /// Ensure that the message is dispatched as soon as possible, which could result in it being - /// dispatched before other messages which are larger and/or rely on relative ordering. - Fast, -} - -/// The parachain block that is created by a collator. -/// -/// This is send as PoV (proof of validity block) to the relay-chain validators. There it will be -/// passed to the parachain validation Wasm blob to be validated. -#[derive(codec::Encode, codec::Decode, Clone)] -pub struct ParachainBlockData { - /// The header of the parachain block. - header: B::Header, - /// The extrinsics of the parachain block. - extrinsics: sp_std::vec::Vec, - /// The data that is required to emulate the storage accesses executed by all extrinsics. - storage_proof: sp_trie::CompactProof, -} - -impl ParachainBlockData { - /// Creates a new instance of `Self`. - pub fn new( - header: ::Header, - extrinsics: sp_std::vec::Vec<::Extrinsic>, - storage_proof: sp_trie::CompactProof, - ) -> Self { - Self { header, extrinsics, storage_proof } - } - - /// Convert `self` into the stored block. - pub fn into_block(self) -> B { - B::new(self.header, self.extrinsics) - } - - /// Convert `self` into the stored header. - pub fn into_header(self) -> B::Header { - self.header - } - - /// Returns the header. - pub fn header(&self) -> &B::Header { - &self.header - } - - /// Returns the extrinsics. - pub fn extrinsics(&self) -> &[B::Extrinsic] { - &self.extrinsics - } - - /// Returns the [`CompactProof`](sp_trie::CompactProof). - pub fn storage_proof(&self) -> &sp_trie::CompactProof { - &self.storage_proof - } - - /// Deconstruct into the inner parts. - pub fn deconstruct(self) -> (B::Header, sp_std::vec::Vec, sp_trie::CompactProof) { - (self.header, self.extrinsics, self.storage_proof) - } -} - -/// A consensus engine ID indicating that this is a Cumulus Parachain. -pub const CUMULUS_CONSENSUS_ID: ConsensusEngineId = *b"CMLS"; - -/// Consensus header digests for Cumulus parachains. -#[derive(Clone, RuntimeDebug, Decode, Encode, PartialEq)] -pub enum CumulusDigestItem { - /// A digest item indicating the relay-parent a parachain block was built against. - #[codec(index = 0)] - RelayParent(relay_chain::Hash), -} - -impl CumulusDigestItem { - /// Encode this as a Substrate [`DigestItem`]. - pub fn to_digest_item(&self) -> DigestItem { - DigestItem::Consensus(CUMULUS_CONSENSUS_ID, self.encode()) - } -} - -/// Extract the relay-parent from the provided header digest. Returns `None` if none were found. -/// -/// If there are multiple valid digests, this returns the value of the first one, although -/// well-behaving runtimes should not produce headers with more than one. -pub fn extract_relay_parent(digest: &Digest) -> Option { - digest.convert_first(|d| match d { - DigestItem::Consensus(id, val) if id == &CUMULUS_CONSENSUS_ID => - match CumulusDigestItem::decode(&mut &val[..]) { - Ok(CumulusDigestItem::RelayParent(hash)) => Some(hash), - _ => None, - }, - _ => None, - }) -} - -/// Utilities for handling the relay-parent storage root as a digest item. -/// -/// This is not intended to be part of the public API, as it is a workaround for -/// via -/// . -/// -/// Runtimes using the parachain-system pallet are expected to produce this digest item, -/// but will stop as soon as they are able to provide the relay-parent hash directly. -/// -/// The relay-chain storage root is, in practice, a unique identifier of a block -/// in the absence of equivocations (which are slashable). This assumes that the relay chain -/// uses BABE or SASSAFRAS, because the slot and the author's VRF randomness are both included -/// in the relay-chain storage root in both cases. -/// -/// Therefore, the relay-parent storage root is a suitable identifier of unique relay chain -/// blocks in low-value scenarios such as performance optimizations. -#[doc(hidden)] -pub mod rpsr_digest { - use super::{relay_chain, ConsensusEngineId, Decode, Digest, DigestItem, Encode}; - use codec::Compact; - - /// A consensus engine ID for relay-parent storage root digests. - pub const RPSR_CONSENSUS_ID: ConsensusEngineId = *b"RPSR"; - - /// Construct a digest item for relay-parent storage roots. - pub fn relay_parent_storage_root_item( - storage_root: relay_chain::Hash, - number: impl Into>, - ) -> DigestItem { - DigestItem::Consensus(RPSR_CONSENSUS_ID, (storage_root, number.into()).encode()) - } - - /// Extract the relay-parent storage root and number from the provided header digest. Returns - /// `None` if none were found. - pub fn extract_relay_parent_storage_root( - digest: &Digest, - ) -> Option<(relay_chain::Hash, relay_chain::BlockNumber)> { - digest.convert_first(|d| match d { - DigestItem::Consensus(id, val) if id == &RPSR_CONSENSUS_ID => { - let (h, n): (relay_chain::Hash, Compact) = - Decode::decode(&mut &val[..]).ok()?; - - Some((h, n.0)) - }, - _ => None, - }) - } -} - -/// Information about a collation. -/// -/// This was used in version 1 of the [`CollectCollationInfo`] runtime api. -#[derive(Clone, Debug, codec::Decode, codec::Encode, PartialEq)] -pub struct CollationInfoV1 { - /// Messages destined to be interpreted by the Relay chain itself. - pub upward_messages: Vec, - /// The horizontal messages sent by the parachain. - pub horizontal_messages: Vec, - /// New validation code. - pub new_validation_code: Option, - /// The number of messages processed from the DMQ. - pub processed_downward_messages: u32, - /// The mark which specifies the block number up to which all inbound HRMP messages are - /// processed. - pub hrmp_watermark: relay_chain::BlockNumber, -} - -impl CollationInfoV1 { - /// Convert into the latest version of the [`CollationInfo`] struct. - pub fn into_latest(self, head_data: HeadData) -> CollationInfo { - CollationInfo { - upward_messages: self.upward_messages, - horizontal_messages: self.horizontal_messages, - new_validation_code: self.new_validation_code, - processed_downward_messages: self.processed_downward_messages, - hrmp_watermark: self.hrmp_watermark, - head_data, - } - } -} - -/// Information about a collation. -#[derive(Clone, Debug, codec::Decode, codec::Encode, PartialEq, TypeInfo)] -pub struct CollationInfo { - /// Messages destined to be interpreted by the Relay chain itself. - pub upward_messages: Vec, - /// The horizontal messages sent by the parachain. - pub horizontal_messages: Vec, - /// New validation code. - pub new_validation_code: Option, - /// The number of messages processed from the DMQ. - pub processed_downward_messages: u32, - /// The mark which specifies the block number up to which all inbound HRMP messages are - /// processed. - pub hrmp_watermark: relay_chain::BlockNumber, - /// The head data, aka encoded header, of the block that corresponds to the collation. - pub head_data: HeadData, -} - -sp_api::decl_runtime_apis! { - /// Runtime api to collect information about a collation. - #[api_version(2)] - pub trait CollectCollationInfo { - /// Collect information about a collation. - #[changed_in(2)] - fn collect_collation_info() -> CollationInfoV1; - /// Collect information about a collation. - /// - /// The given `header` is the header of the built block for that - /// we are collecting the collation info for. - fn collect_collation_info(header: &Block::Header) -> CollationInfo; - } -} diff --git a/cumulus/primitives/parachain-inherent/Cargo.toml b/cumulus/primitives/parachain-inherent/Cargo.toml deleted file mode 100644 index c3d7a72f99a8..000000000000 --- a/cumulus/primitives/parachain-inherent/Cargo.toml +++ /dev/null @@ -1,48 +0,0 @@ -[package] -name = "cumulus-primitives-parachain-inherent" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -async-trait = { version = "0.1.73", optional = true } -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -tracing = { version = "0.1.37", optional = true } - -# Substrate -sc-client-api = { git = "https://github.com/paritytech/substrate", optional = true, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", optional = true, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", optional = true, branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", optional = true, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-storage = { git = "https://github.com/paritytech/substrate", optional = true, branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../core", default-features = false } -cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface", optional = true } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder", optional = true } - -[features] -default = [ "std" ] -std = [ - "async-trait", - "codec/std", - "scale-info/std", - "tracing", - "sc-client-api", - "sp-api", - "sp-core/std", - "sp-inherents/std", - "sp-runtime", - "sp-state-machine", - "sp-std/std", - "sp-storage", - "sp-trie/std", - "cumulus-primitives-core/std", - "cumulus-relay-chain-interface", - "cumulus-test-relay-sproof-builder", -] diff --git a/cumulus/primitives/parachain-inherent/src/client_side.rs b/cumulus/primitives/parachain-inherent/src/client_side.rs deleted file mode 100644 index f93340e3718f..000000000000 --- a/cumulus/primitives/parachain-inherent/src/client_side.rs +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Client side code for generating the parachain inherent. - -use crate::ParachainInherentData; -use codec::Decode; -use cumulus_primitives_core::{ - relay_chain::{self, Hash as PHash, HrmpChannelId}, - ParaId, PersistedValidationData, -}; -use cumulus_relay_chain_interface::RelayChainInterface; - -const LOG_TARGET: &str = "parachain-inherent"; - -/// Collect the relevant relay chain state in form of a proof for putting it into the validation -/// data inherent. -async fn collect_relay_storage_proof( - relay_chain_interface: &impl RelayChainInterface, - para_id: ParaId, - relay_parent: PHash, -) -> Option { - use relay_chain::well_known_keys as relay_well_known_keys; - - let ingress_channels = relay_chain_interface - .get_storage_by_key( - relay_parent, - &relay_well_known_keys::hrmp_ingress_channel_index(para_id), - ) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - relay_parent = ?relay_parent, - error = ?e, - "Cannot obtain the hrmp ingress channel." - ) - }) - .ok()?; - - let ingress_channels = ingress_channels - .map(|raw| >::decode(&mut &raw[..])) - .transpose() - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Cannot decode the hrmp ingress channel index.", - ) - }) - .ok()? - .unwrap_or_default(); - - let egress_channels = relay_chain_interface - .get_storage_by_key( - relay_parent, - &relay_well_known_keys::hrmp_egress_channel_index(para_id), - ) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Cannot obtain the hrmp egress channel.", - ) - }) - .ok()?; - - let egress_channels = egress_channels - .map(|raw| >::decode(&mut &raw[..])) - .transpose() - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - error = ?e, - "Cannot decode the hrmp egress channel index.", - ) - }) - .ok()? - .unwrap_or_default(); - - let mut relevant_keys = vec![ - relay_well_known_keys::CURRENT_BLOCK_RANDOMNESS.to_vec(), - relay_well_known_keys::ONE_EPOCH_AGO_RANDOMNESS.to_vec(), - relay_well_known_keys::TWO_EPOCHS_AGO_RANDOMNESS.to_vec(), - relay_well_known_keys::CURRENT_SLOT.to_vec(), - relay_well_known_keys::ACTIVE_CONFIG.to_vec(), - relay_well_known_keys::dmq_mqc_head(para_id), - // TODO paritytech/polkadot#6283: Remove all usages of `relay_dispatch_queue_size` - // We need to keep this here until all parachains have migrated to - // `relay_dispatch_queue_remaining_capacity`. - #[allow(deprecated)] - relay_well_known_keys::relay_dispatch_queue_size(para_id), - relay_well_known_keys::relay_dispatch_queue_remaining_capacity(para_id).key, - relay_well_known_keys::hrmp_ingress_channel_index(para_id), - relay_well_known_keys::hrmp_egress_channel_index(para_id), - relay_well_known_keys::upgrade_go_ahead_signal(para_id), - relay_well_known_keys::upgrade_restriction_signal(para_id), - ]; - relevant_keys.extend(ingress_channels.into_iter().map(|sender| { - relay_well_known_keys::hrmp_channels(HrmpChannelId { sender, recipient: para_id }) - })); - relevant_keys.extend(egress_channels.into_iter().map(|recipient| { - relay_well_known_keys::hrmp_channels(HrmpChannelId { sender: para_id, recipient }) - })); - - relay_chain_interface - .prove_read(relay_parent, &relevant_keys) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - relay_parent = ?relay_parent, - error = ?e, - "Cannot obtain read proof from relay chain.", - ); - }) - .ok() -} - -impl ParachainInherentData { - /// Create the [`ParachainInherentData`] at the given `relay_parent`. - /// - /// Returns `None` if the creation failed. - pub async fn create_at( - relay_parent: PHash, - relay_chain_interface: &impl RelayChainInterface, - validation_data: &PersistedValidationData, - para_id: ParaId, - ) -> Option { - let relay_chain_state = - collect_relay_storage_proof(relay_chain_interface, para_id, relay_parent).await?; - - let downward_messages = relay_chain_interface - .retrieve_dmq_contents(para_id, relay_parent) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - relay_parent = ?relay_parent, - error = ?e, - "An error occured during requesting the downward messages.", - ); - }) - .ok()?; - let horizontal_messages = relay_chain_interface - .retrieve_all_inbound_hrmp_channel_contents(para_id, relay_parent) - .await - .map_err(|e| { - tracing::error!( - target: LOG_TARGET, - relay_parent = ?relay_parent, - error = ?e, - "An error occured during requesting the inbound HRMP messages.", - ); - }) - .ok()?; - - Some(ParachainInherentData { - downward_messages, - horizontal_messages, - validation_data: validation_data.clone(), - relay_chain_state, - }) - } -} - -#[async_trait::async_trait] -impl sp_inherents::InherentDataProvider for ParachainInherentData { - async fn provide_inherent_data( - &self, - inherent_data: &mut sp_inherents::InherentData, - ) -> Result<(), sp_inherents::Error> { - inherent_data.put_data(crate::INHERENT_IDENTIFIER, &self) - } - - async fn try_handle_error( - &self, - _: &sp_inherents::InherentIdentifier, - _: &[u8], - ) -> Option> { - None - } -} diff --git a/cumulus/primitives/parachain-inherent/src/lib.rs b/cumulus/primitives/parachain-inherent/src/lib.rs deleted file mode 100644 index 34b9064090c2..000000000000 --- a/cumulus/primitives/parachain-inherent/src/lib.rs +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus parachain inherent -//! -//! The [`ParachainInherentData`] is the data that is passed by the collator to the parachain -//! runtime. The runtime will use this data to execute messages from other parachains/the relay -//! chain or to read data from the relay chain state. When the parachain is validated by a parachain -//! validator on the relay chain, this data is checked for correctnes. If the data passed by the -//! collator to the runtime isn't correct, the parachain candidate is considered invalid. -//! -//! Use [`ParachainInherentData::create_at`] to create the [`ParachainInherentData`] at a given -//! relay chain block to include it in a parachain block. - -#![cfg_attr(not(feature = "std"), no_std)] - -use cumulus_primitives_core::{ - relay_chain::{BlakeTwo256, Hash as RelayHash, HashT as _}, - InboundDownwardMessage, InboundHrmpMessage, ParaId, PersistedValidationData, -}; - -use scale_info::TypeInfo; -use sp_inherents::InherentIdentifier; -use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; - -#[cfg(feature = "std")] -mod client_side; -#[cfg(feature = "std")] -pub use client_side::*; -#[cfg(feature = "std")] -mod mock; -#[cfg(feature = "std")] -pub use mock::{MockValidationDataInherentDataProvider, MockXcmConfig}; - -/// The identifier for the parachain inherent. -pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"sysi1337"; - -/// The inherent data that is passed by the collator to the parachain runtime. -#[derive(codec::Encode, codec::Decode, sp_core::RuntimeDebug, Clone, PartialEq, TypeInfo)] -pub struct ParachainInherentData { - pub validation_data: PersistedValidationData, - /// A storage proof of a predefined set of keys from the relay-chain. - /// - /// Specifically this witness contains the data for: - /// - /// - the current slot number at the given relay parent - /// - active host configuration as per the relay parent, - /// - the relay dispatch queue sizes - /// - the list of egress HRMP channels (in the list of recipients form) - /// - the metadata for the egress HRMP channels - pub relay_chain_state: sp_trie::StorageProof, - /// Downward messages in the order they were sent. - pub downward_messages: Vec, - /// HRMP messages grouped by channels. The messages in the inner vec must be in order they - /// were sent. In combination with the rule of no more than one message in a channel per block, - /// this means `sent_at` is **strictly** greater than the previous one (if any). - pub horizontal_messages: BTreeMap>, -} - -/// This struct provides ability to extend a message queue chain (MQC) and compute a new head. -/// -/// MQC is an instance of a [hash chain] applied to a message queue. Using a hash chain it's -/// possible to represent a sequence of messages using only a single hash. -/// -/// A head for an empty chain is agreed to be a zero hash. -/// -/// An instance is used to track either DMP from the relay chain or HRMP across a channel. -/// But a given instance is never used to track both. Therefore, you should call either -/// `extend_downward` or `extend_hrmp`, but not both methods on a single instance. -/// -/// [hash chain]: https://en.wikipedia.org/wiki/Hash_chain -#[derive(Default, Clone, codec::Encode, codec::Decode, scale_info::TypeInfo)] -pub struct MessageQueueChain(RelayHash); - -impl MessageQueueChain { - /// Extend the hash chain with an HRMP message. This method should be used only when - /// this chain is tracking HRMP. - pub fn extend_hrmp(&mut self, horizontal_message: &InboundHrmpMessage) -> &mut Self { - let prev_head = self.0; - self.0 = BlakeTwo256::hash_of(&( - prev_head, - horizontal_message.sent_at, - BlakeTwo256::hash_of(&horizontal_message.data), - )); - self - } - - /// Extend the hash chain with a downward message. This method should be used only when - /// this chain is tracking DMP. - pub fn extend_downward(&mut self, downward_message: &InboundDownwardMessage) -> &mut Self { - let prev_head = self.0; - self.0 = BlakeTwo256::hash_of(&( - prev_head, - downward_message.sent_at, - BlakeTwo256::hash_of(&downward_message.msg), - )); - self - } - - /// Return the current mead of the message queue hash chain. - /// This is agreed to be the zero hash for an empty chain. - pub fn head(&self) -> RelayHash { - self.0 - } -} diff --git a/cumulus/primitives/parachain-inherent/src/mock.rs b/cumulus/primitives/parachain-inherent/src/mock.rs deleted file mode 100644 index 18e23ba23af0..000000000000 --- a/cumulus/primitives/parachain-inherent/src/mock.rs +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::{ParachainInherentData, INHERENT_IDENTIFIER}; -use codec::Decode; -use cumulus_primitives_core::{ - relay_chain, InboundDownwardMessage, InboundHrmpMessage, ParaId, PersistedValidationData, -}; -use sc_client_api::{Backend, StorageProvider}; -use sp_core::twox_128; -use sp_inherents::{InherentData, InherentDataProvider}; -use sp_runtime::traits::Block; -use std::collections::BTreeMap; - -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; - -/// Inherent data provider that supplies mocked validation data. -/// -/// This is useful when running a node that is not actually backed by any relay chain. -/// For example when running a local node, or running integration tests. -/// -/// We mock a relay chain block number as follows: -/// relay_block_number = offset + relay_blocks_per_para_block * current_para_block -/// To simulate a parachain that starts in relay block 1000 and gets a block in every other relay -/// block, use 1000 and 2 -/// -/// Optionally, mock XCM messages can be injected into the runtime. When mocking XCM, -/// in addition to the messages themselves, you must provide some information about -/// your parachain's configuration in order to mock the MQC heads properly. -/// See [`MockXcmConfig`] for more information -pub struct MockValidationDataInherentDataProvider { - /// The current block number of the local block chain (the parachain) - pub current_para_block: u32, - /// The relay block in which this parachain appeared to start. This will be the relay block - /// number in para block #P1 - pub relay_offset: u32, - /// The number of relay blocks that elapses between each parablock. Probably set this to 1 or 2 - /// to simulate optimistic or realistic relay chain behavior. - pub relay_blocks_per_para_block: u32, - /// Number of parachain blocks per relay chain epoch - /// Mock epoch is computed by dividing `current_para_block` by this value. - pub para_blocks_per_relay_epoch: u32, - /// Function to mock BABE one epoch ago randomness - pub relay_randomness_config: R, - /// XCM messages and associated configuration information. - pub xcm_config: MockXcmConfig, - /// Inbound downward XCM messages to be injected into the block. - pub raw_downward_messages: Vec>, - // Inbound Horizontal messages sorted by channel - pub raw_horizontal_messages: Vec<(ParaId, Vec)>, -} - -pub trait GenerateRandomness { - fn generate_randomness(&self, input: I) -> relay_chain::Hash; -} - -impl GenerateRandomness for () { - /// Default implementation uses relay epoch as randomness value - /// A more seemingly random implementation may hash the relay epoch instead - fn generate_randomness(&self, input: u64) -> relay_chain::Hash { - let mut mock_randomness: [u8; 32] = [0u8; 32]; - mock_randomness[..8].copy_from_slice(&input.to_be_bytes()); - mock_randomness.into() - } -} - -/// Parameters for how the Mock inherent data provider should inject XCM messages. -/// In addition to the messages themselves, some information about the parachain's -/// configuration is also required so that the MQC heads can be read out of the -/// parachain's storage, and the corresponding relay data mocked. -#[derive(Default)] -pub struct MockXcmConfig { - /// The parachain id of the parachain being mocked. - pub para_id: ParaId, - /// The starting state of the dmq_mqc_head. - pub starting_dmq_mqc_head: relay_chain::Hash, - /// The starting state of each parachain's mqc head - pub starting_hrmp_mqc_heads: BTreeMap, -} - -/// The name of the parachain system in the runtime. -/// -/// This name is used by frame to prefix storage items and will be required to read data from the -/// storage. -/// -/// The `Default` implementation sets the name to `ParachainSystem`. -pub struct ParachainSystemName(pub Vec); - -impl Default for ParachainSystemName { - fn default() -> Self { - Self(b"ParachainSystem".to_vec()) - } -} - -impl MockXcmConfig { - /// Create a MockXcmConfig by reading the mqc_heads directly - /// from the storage of a previous block. - pub fn new, C: StorageProvider>( - client: &C, - parent_block: B::Hash, - para_id: ParaId, - parachain_system_name: ParachainSystemName, - ) -> Self { - let starting_dmq_mqc_head = client - .storage( - parent_block, - &sp_storage::StorageKey( - [twox_128(¶chain_system_name.0), twox_128(b"LastDmqMqcHead")] - .concat() - .to_vec(), - ), - ) - .expect("We should be able to read storage from the parent block.") - .map(|ref mut raw_data| { - Decode::decode(&mut &raw_data.0[..]).expect("Stored data should decode correctly") - }) - .unwrap_or_default(); - - let starting_hrmp_mqc_heads = client - .storage( - parent_block, - &sp_storage::StorageKey( - [twox_128(¶chain_system_name.0), twox_128(b"LastHrmpMqcHeads")] - .concat() - .to_vec(), - ), - ) - .expect("We should be able to read storage from the parent block.") - .map(|ref mut raw_data| { - Decode::decode(&mut &raw_data.0[..]).expect("Stored data should decode correctly") - }) - .unwrap_or_default(); - - Self { para_id, starting_dmq_mqc_head, starting_hrmp_mqc_heads } - } -} - -#[async_trait::async_trait] -impl> InherentDataProvider - for MockValidationDataInherentDataProvider -{ - async fn provide_inherent_data( - &self, - inherent_data: &mut InherentData, - ) -> Result<(), sp_inherents::Error> { - // Calculate the mocked relay block based on the current para block - let relay_parent_number = - self.relay_offset + self.relay_blocks_per_para_block * self.current_para_block; - - // Use the "sproof" (spoof proof) builder to build valid mock state root and proof. - let mut sproof_builder = - RelayStateSproofBuilder { para_id: self.xcm_config.para_id, ..Default::default() }; - - // Process the downward messages and set up the correct head - let mut downward_messages = Vec::new(); - let mut dmq_mqc = crate::MessageQueueChain(self.xcm_config.starting_dmq_mqc_head); - for msg in &self.raw_downward_messages { - let wrapped = InboundDownwardMessage { sent_at: relay_parent_number, msg: msg.clone() }; - - dmq_mqc.extend_downward(&wrapped); - downward_messages.push(wrapped); - } - sproof_builder.dmq_mqc_head = Some(dmq_mqc.head()); - - // Process the hrmp messages and set up the correct heads - // Begin by collecting them into a Map - let mut horizontal_messages = BTreeMap::>::new(); - for (para_id, msg) in &self.raw_horizontal_messages { - let wrapped = InboundHrmpMessage { sent_at: relay_parent_number, data: msg.clone() }; - - horizontal_messages.entry(*para_id).or_default().push(wrapped); - } - - // Now iterate again, updating the heads as we go - for (para_id, messages) in &horizontal_messages { - let mut channel_mqc = crate::MessageQueueChain( - *self - .xcm_config - .starting_hrmp_mqc_heads - .get(para_id) - .unwrap_or(&relay_chain::Hash::default()), - ); - for message in messages { - channel_mqc.extend_hrmp(message); - } - sproof_builder.upsert_inbound_channel(*para_id).mqc_head = Some(channel_mqc.head()); - } - - // Epoch is set equal to current para block / blocks per epoch - sproof_builder.current_epoch = if self.para_blocks_per_relay_epoch == 0 { - // do not divide by 0 => set epoch to para block number - self.current_para_block.into() - } else { - (self.current_para_block / self.para_blocks_per_relay_epoch).into() - }; - // Randomness is set by randomness generator - sproof_builder.randomness = - self.relay_randomness_config.generate_randomness(self.current_para_block.into()); - - let (relay_parent_storage_root, proof) = sproof_builder.into_state_root_and_proof(); - - inherent_data.put_data( - INHERENT_IDENTIFIER, - &ParachainInherentData { - validation_data: PersistedValidationData { - parent_head: Default::default(), - relay_parent_storage_root, - relay_parent_number, - max_pov_size: Default::default(), - }, - downward_messages, - horizontal_messages, - relay_chain_state: proof, - }, - ) - } - - // Copied from the real implementation - async fn try_handle_error( - &self, - _: &sp_inherents::InherentIdentifier, - _: &[u8], - ) -> Option> { - None - } -} diff --git a/cumulus/primitives/timestamp/Cargo.toml b/cumulus/primitives/timestamp/Cargo.toml deleted file mode 100644 index 254ab578b954..000000000000 --- a/cumulus/primitives/timestamp/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "cumulus-primitives-timestamp" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -description = "Provides timestamp related functionality for parachains." - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -futures = "0.3.28" - -# Substrate -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../core", default-features = false } - -[dev-dependencies] - -# Substrate -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Cumulus -cumulus-test-client = { path = "../../test/client" } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } - - -[features] -default = [ "std" ] -std = [ - "sp-inherents/std", - "sp-std/std", - "sp-timestamp/std", - "cumulus-primitives-core/std", -] diff --git a/cumulus/primitives/timestamp/src/lib.rs b/cumulus/primitives/timestamp/src/lib.rs deleted file mode 100644 index 4c28a169a27b..000000000000 --- a/cumulus/primitives/timestamp/src/lib.rs +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Cumulus timestamp related primitives. -//! -//! Provides a [`InherentDataProvider`] that should be used in the validation phase of the -//! parachain. It will be used to create the inherent data and that will be used to check the -//! inherents inside the parachain block (in this case the timestamp inherent). As we don't have -//! access to any clock from the runtime the timestamp is always passed as an inherent into the -//! runtime. To check this inherent when validating the block, we will use the relay chain slot. As -//! the relay chain slot is derived from a timestamp, we can easily convert it back to a timestamp -//! by muliplying it with the slot duration. By comparing the relay chain slot derived timestamp -//! with the timestamp we can ensure that the parachain timestamp is reasonable. - -#![cfg_attr(not(feature = "std"), no_std)] - -use cumulus_primitives_core::relay_chain::Slot; -use sp_inherents::{Error, InherentData}; -use sp_std::time::Duration; - -pub use sp_timestamp::{InherentType, INHERENT_IDENTIFIER}; - -/// The inherent data provider for the timestamp. -/// -/// This should be used in the runtime when checking the inherents in the validation phase of the -/// parachain. -pub struct InherentDataProvider { - relay_chain_slot: Slot, - relay_chain_slot_duration: Duration, -} - -impl InherentDataProvider { - /// Create `Self` from the given relay chain slot and slot duration. - pub fn from_relay_chain_slot_and_duration( - relay_chain_slot: Slot, - relay_chain_slot_duration: Duration, - ) -> Self { - Self { relay_chain_slot, relay_chain_slot_duration } - } - - /// Create the inherent data. - pub fn create_inherent_data(&self) -> Result { - let mut inherent_data = InherentData::new(); - self.provide_inherent_data(&mut inherent_data).map(|_| inherent_data) - } - - /// Provide the inherent data into the given `inherent_data`. - pub fn provide_inherent_data(&self, inherent_data: &mut InherentData) -> Result<(), Error> { - // As the parachain starts building at around `relay_chain_slot + 1` we use that slot to - // calculate the timestamp. - let data: InherentType = ((*self.relay_chain_slot + 1) * - self.relay_chain_slot_duration.as_millis() as u64) - .into(); - - inherent_data.put_data(INHERENT_IDENTIFIER, &data) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - use codec::{Decode, Encode}; - use cumulus_primitives_core::{relay_chain::Hash as PHash, PersistedValidationData}; - use cumulus_test_client::{ - runtime::{Block, Header, WASM_BINARY}, - BlockData, BuildParachainBlockData, Client, ClientBlockImportExt, ExecutorResult, HeadData, - InitBlockBuilder, ParachainBlockData, TestClientBuilder, TestClientBuilderExt, - ValidationParams, - }; - use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; - use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - use std::{env, process::Command, str::FromStr}; - - const SLOT_DURATION: u64 = 6000; - - fn call_validate_block( - parent_head: Header, - block_data: ParachainBlockData, - relay_parent_storage_root: PHash, - ) -> ExecutorResult

{ - cumulus_test_client::validate_block( - ValidationParams { - block_data: BlockData(block_data.encode()), - parent_head: HeadData(parent_head.encode()), - relay_parent_number: 1, - relay_parent_storage_root, - }, - WASM_BINARY.expect("You need to build the WASM binaries to run the tests!"), - ) - .map(|v| Header::decode(&mut &v.head_data.0[..]).expect("Decodes `Header`.")) - } - - fn build_block( - client: &Client, - hash: ::Hash, - timestamp: u64, - relay_chain_slot: Slot, - ) -> (ParachainBlockData, PHash) { - let sproof_builder = - RelayStateSproofBuilder { current_slot: relay_chain_slot, ..Default::default() }; - - let parent_header = client.header(hash).ok().flatten().expect("Genesis header exists"); - - let relay_parent_storage_root = sproof_builder.clone().into_state_root_and_proof().0; - - let validation_data = PersistedValidationData { - relay_parent_number: 1, - parent_head: parent_header.encode().into(), - ..Default::default() - }; - - let block = client - .init_block_builder_with_timestamp( - hash, - Some(validation_data), - sproof_builder, - timestamp, - ) - .build_parachain_block(*parent_header.state_root()); - - (block, relay_parent_storage_root) - } - - #[test] - fn check_timestamp_inherent_works() { - sp_tracing::try_init_simple(); - let relay_chain_slot = 2; - - if env::var("RUN_TEST").is_ok() { - let mut client = TestClientBuilder::default().build(); - let timestamp = u64::from_str(&env::var("TIMESTAMP").expect("TIMESTAMP is set")) - .expect("TIMESTAMP is a valid `u64`"); - - let block = - build_block(&client, client.chain_info().genesis_hash, SLOT_DURATION, 1.into()) - .0 - .into_block(); - futures::executor::block_on( - client.import(sp_consensus::BlockOrigin::Own, block.clone()), - ) - .unwrap(); - - let hashof1 = block.hash(); - let (block, relay_chain_root) = - build_block(&client, hashof1, timestamp, relay_chain_slot.into()); - - let header = call_validate_block( - client.header(hashof1).ok().flatten().expect("Genesis header exists"), - block.clone(), - relay_chain_root, - ) - .expect("Calls validate block"); - assert_eq!(block.header(), &header); - } else { - let slot_timestamp = relay_chain_slot * SLOT_DURATION; - - for (timestamp, res) in &[ - (slot_timestamp, true), - (slot_timestamp - 500, true), - (slot_timestamp + 500, true), - (slot_timestamp * 10, false), - ] { - let output = Command::new(env::current_exe().unwrap()) - .args(["check_timestamp_inherent_works", "--", "--nocapture"]) - .env("RUN_TEST", "1") - .env("TIMESTAMP", timestamp.to_string()) - .output() - .expect("Runs the test"); - - if !res { - assert!(String::from_utf8(output.stderr) - .unwrap() - .contains("Checking inherents failed")); - } - - assert!(dbg!(output.status.success()) == *res); - } - } - } -} diff --git a/cumulus/primitives/utility/Cargo.toml b/cumulus/primitives/utility/Cargo.toml deleted file mode 100644 index dea89cb97845..000000000000 --- a/cumulus/primitives/utility/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "cumulus-primitives-utility" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } -log = { version = "0.4.20", default-features = false } - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-runtime-common = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } -xcm-builder = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - - -# Cumulus -cumulus-primitives-core = { path = "../core", default-features = false } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "frame-support/std", - "sp-runtime/std", - "sp-std/std", - "sp-io/std", - "polkadot-runtime-common/std", - "cumulus-primitives-core/std", - "xcm/std", - "xcm-builder/std", - "xcm-executor/std", -] diff --git a/cumulus/primitives/utility/src/lib.rs b/cumulus/primitives/utility/src/lib.rs deleted file mode 100644 index 87be029163d6..000000000000 --- a/cumulus/primitives/utility/src/lib.rs +++ /dev/null @@ -1,544 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Helper datatypes for cumulus. This includes the [`ParentAsUmp`] routing type which will route -//! messages into an [`UpwardMessageSender`] if the destination is `Parent`. - -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::Encode; -use cumulus_primitives_core::{MessageSendError, UpwardMessageSender}; -use frame_support::{ - traits::{ - tokens::{fungibles, fungibles::Inspect}, - Get, - }, - weights::Weight, -}; -use polkadot_runtime_common::xcm_sender::ConstantPrice; -use sp_runtime::{traits::Saturating, SaturatedConversion}; -use sp_std::{marker::PhantomData, prelude::*}; -use xcm::{latest::prelude::*, WrapVersion}; -use xcm_builder::TakeRevenue; -use xcm_executor::traits::{MatchesFungibles, TransactAsset, WeightTrader}; - -pub trait PriceForParentDelivery { - fn price_for_parent_delivery(message: &Xcm<()>) -> MultiAssets; -} - -impl PriceForParentDelivery for () { - fn price_for_parent_delivery(_: &Xcm<()>) -> MultiAssets { - MultiAssets::new() - } -} - -impl> PriceForParentDelivery for ConstantPrice { - fn price_for_parent_delivery(_: &Xcm<()>) -> MultiAssets { - T::get() - } -} - -/// Xcm router which recognises the `Parent` destination and handles it by sending the message into -/// the given UMP `UpwardMessageSender` implementation. Thus this essentially adapts an -/// `UpwardMessageSender` trait impl into a `SendXcm` trait impl. -/// -/// NOTE: This is a pretty dumb "just send it" router; we will probably want to introduce queuing -/// to UMP eventually and when we do, the pallet which implements the queuing will be responsible -/// for the `SendXcm` implementation. -pub struct ParentAsUmp(PhantomData<(T, W, P)>); -impl SendXcm for ParentAsUmp -where - T: UpwardMessageSender, - W: WrapVersion, - P: PriceForParentDelivery, -{ - type Ticket = Vec; - - fn validate( - dest: &mut Option, - msg: &mut Option>, - ) -> SendResult> { - let d = dest.take().ok_or(SendError::MissingArgument)?; - - if d.contains_parents_only(1) { - // An upward message for the relay chain. - let xcm = msg.take().ok_or(SendError::MissingArgument)?; - let price = P::price_for_parent_delivery(&xcm); - let versioned_xcm = - W::wrap_version(&d, xcm).map_err(|()| SendError::DestinationUnsupported)?; - let data = versioned_xcm.encode(); - - Ok((data, price)) - } else { - // Anything else is unhandled. This includes a message that is not meant for us. - // We need to make sure that dest/msg is not consumed here. - *dest = Some(d); - Err(SendError::NotApplicable) - } - } - - fn deliver(data: Vec) -> Result { - let (_, hash) = T::send_upward_message(data).map_err(|e| match e { - MessageSendError::TooBig => SendError::ExceedsMaxMessageSize, - e => SendError::Transport(e.into()), - })?; - - Ok(hash) - } -} - -/// Contains information to handle refund/payment for xcm-execution -#[derive(Clone, Eq, PartialEq, Debug)] -struct AssetTraderRefunder { - // The amount of weight bought minus the weigh already refunded - weight_outstanding: Weight, - // The concrete asset containing the asset location and outstanding balance - outstanding_concrete_asset: MultiAsset, -} - -/// Charges for execution in the first multiasset of those selected for fee payment -/// Only succeeds for Concrete Fungible Assets -/// First tries to convert the this MultiAsset into a local assetId -/// Then charges for this assetId as described by FeeCharger -/// Weight, paid balance, local asset Id and the multilocation is stored for -/// later refund purposes -/// Important: Errors if the Trader is being called twice by 2 BuyExecution instructions -/// Alternatively we could just return payment in the aforementioned case -pub struct TakeFirstAssetTrader< - AccountId, - FeeCharger: ChargeWeightInFungibles, - Matcher: MatchesFungibles, - ConcreteAssets: fungibles::Mutate + fungibles::Balanced, - HandleRefund: TakeRevenue, ->( - Option, - PhantomData<(AccountId, FeeCharger, Matcher, ConcreteAssets, HandleRefund)>, -); -impl< - AccountId, - FeeCharger: ChargeWeightInFungibles, - Matcher: MatchesFungibles, - ConcreteAssets: fungibles::Mutate + fungibles::Balanced, - HandleRefund: TakeRevenue, - > WeightTrader - for TakeFirstAssetTrader -{ - fn new() -> Self { - Self(None, PhantomData) - } - // We take first multiasset - // Check whether we can convert fee to asset_fee (is_sufficient, min_deposit) - // If everything goes well, we charge. - fn buy_weight( - &mut self, - weight: Weight, - payment: xcm_executor::Assets, - context: &XcmContext, - ) -> Result { - log::trace!(target: "xcm::weight", "TakeFirstAssetTrader::buy_weight weight: {:?}, payment: {:?}, context: {:?}", weight, payment, context); - - // Make sure we dont enter twice - if self.0.is_some() { - return Err(XcmError::NotWithdrawable) - } - - // We take the very first multiasset from payment - // (assets are sorted by fungibility/amount after this conversion) - let multiassets: MultiAssets = payment.clone().into(); - - // Take the first multiasset from the selected MultiAssets - let first = multiassets.get(0).ok_or(XcmError::AssetNotFound)?; - - // Get the local asset id in which we can pay for fees - let (local_asset_id, _) = - Matcher::matches_fungibles(first).map_err(|_| XcmError::AssetNotFound)?; - - // Calculate how much we should charge in the asset_id for such amount of weight - // Require at least a payment of minimum_balance - // Necessary for fully collateral-backed assets - let asset_balance: u128 = - FeeCharger::charge_weight_in_fungibles(local_asset_id.clone(), weight) - .map(|amount| { - let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id); - if amount < minimum_balance { - minimum_balance - } else { - amount - } - })? - .try_into() - .map_err(|_| XcmError::Overflow)?; - - // Convert to the same kind of multiasset, with the required fungible balance - let required = first.id.into_multiasset(asset_balance.into()); - - // Substract payment - let unused = payment.checked_sub(required.clone()).map_err(|_| XcmError::TooExpensive)?; - - // record weight and multiasset - self.0 = Some(AssetTraderRefunder { - weight_outstanding: weight, - outstanding_concrete_asset: required, - }); - - Ok(unused) - } - - fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { - log::trace!(target: "xcm::weight", "TakeFirstAssetTrader::refund_weight weight: {:?}, context: {:?}", weight, context); - if let Some(AssetTraderRefunder { - mut weight_outstanding, - outstanding_concrete_asset: MultiAsset { id, fun }, - }) = self.0.clone() - { - // Get the local asset id in which we can refund fees - let (local_asset_id, outstanding_balance) = - Matcher::matches_fungibles(&(id, fun).into()).ok()?; - - let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id.clone()); - - // Calculate asset_balance - // This read should have already be cached in buy_weight - let (asset_balance, outstanding_minus_substracted) = - FeeCharger::charge_weight_in_fungibles(local_asset_id, weight).ok().map( - |asset_balance| { - // Require at least a drop of minimum_balance - // Necessary for fully collateral-backed assets - if outstanding_balance.saturating_sub(asset_balance) > minimum_balance { - (asset_balance, outstanding_balance.saturating_sub(asset_balance)) - } - // If the amount to be refunded leaves the remaining balance below ED, - // we just refund the exact amount that guarantees at least ED will be - // dropped - else { - (outstanding_balance.saturating_sub(minimum_balance), minimum_balance) - } - }, - )?; - - // Convert balances into u128 - let outstanding_minus_substracted: u128 = - outstanding_minus_substracted.saturated_into(); - let asset_balance: u128 = asset_balance.saturated_into(); - - // Construct outstanding_concrete_asset with the same location id and substracted - // balance - let outstanding_concrete_asset: MultiAsset = (id, outstanding_minus_substracted).into(); - - // Substract from existing weight and balance - weight_outstanding = weight_outstanding.saturating_sub(weight); - - // Override AssetTraderRefunder - self.0 = Some(AssetTraderRefunder { weight_outstanding, outstanding_concrete_asset }); - - // Only refund if positive - if asset_balance > 0 { - Some((id, asset_balance).into()) - } else { - None - } - } else { - None - } - } -} - -impl< - AccountId, - FeeCharger: ChargeWeightInFungibles, - Matcher: MatchesFungibles, - ConcreteAssets: fungibles::Mutate + fungibles::Balanced, - HandleRefund: TakeRevenue, - > Drop for TakeFirstAssetTrader -{ - fn drop(&mut self) { - if let Some(asset_trader) = self.0.clone() { - HandleRefund::take_revenue(asset_trader.outstanding_concrete_asset); - } - } -} - -/// XCM fee depositor to which we implement the TakeRevenue trait -/// It receives a Transact implemented argument, a 32 byte convertible acocuntId, and the fee -/// receiver account FungiblesMutateAdapter should be identical to that implemented by WithdrawAsset -pub struct XcmFeesTo32ByteAccount( - PhantomData<(FungiblesMutateAdapter, AccountId, ReceiverAccount)>, -); -impl< - FungiblesMutateAdapter: TransactAsset, - AccountId: Clone + Into<[u8; 32]>, - ReceiverAccount: frame_support::traits::Get>, - > TakeRevenue for XcmFeesTo32ByteAccount -{ - fn take_revenue(revenue: MultiAsset) { - if let Some(receiver) = ReceiverAccount::get() { - let ok = FungiblesMutateAdapter::deposit_asset( - &revenue, - &(X1(AccountId32 { network: None, id: receiver.into() }).into()), - // We aren't able to track the XCM that initiated the fee deposit, so we create a - // fake message hash here - &XcmContext::with_message_id([0; 32]), - ) - .is_ok(); - - debug_assert!(ok, "`deposit_asset` cannot generally fail; qed"); - } - } -} - -/// ChargeWeightInFungibles trait, which converts a given amount of weight -/// and an assetId, and it returns the balance amount that should be charged -/// in such assetId for that amount of weight -pub trait ChargeWeightInFungibles> { - fn charge_weight_in_fungibles( - asset_id: >::AssetId, - weight: Weight, - ) -> Result<>::Balance, XcmError>; -} - -#[cfg(test)] -mod tests { - use super::*; - use cumulus_primitives_core::UpwardMessage; - use frame_support::{ - assert_ok, - dispatch::DispatchError, - traits::tokens::{ - DepositConsequence, Fortitude, Preservation, Provenance, WithdrawConsequence, - }, - }; - use xcm_executor::{traits::Error, Assets}; - - /// Validates [`validate`] for required Some(destination) and Some(message) - struct OkFixedXcmHashWithAssertingRequiredInputsSender; - impl OkFixedXcmHashWithAssertingRequiredInputsSender { - const FIXED_XCM_HASH: [u8; 32] = [9; 32]; - - fn fixed_delivery_asset() -> MultiAssets { - MultiAssets::new() - } - - fn expected_delivery_result() -> Result<(XcmHash, MultiAssets), SendError> { - Ok((Self::FIXED_XCM_HASH, Self::fixed_delivery_asset())) - } - } - impl SendXcm for OkFixedXcmHashWithAssertingRequiredInputsSender { - type Ticket = (); - - fn validate( - destination: &mut Option, - message: &mut Option>, - ) -> SendResult { - assert!(destination.is_some()); - assert!(message.is_some()); - Ok(((), OkFixedXcmHashWithAssertingRequiredInputsSender::fixed_delivery_asset())) - } - - fn deliver(_: Self::Ticket) -> Result { - Ok(Self::FIXED_XCM_HASH) - } - } - - /// Impl [`UpwardMessageSender`] that return `Other` error - struct OtherErrorUpwardMessageSender; - impl UpwardMessageSender for OtherErrorUpwardMessageSender { - fn send_upward_message(_: UpwardMessage) -> Result<(u32, XcmHash), MessageSendError> { - Err(MessageSendError::Other) - } - } - - #[test] - fn parent_as_ump_does_not_consume_dest_or_msg_on_not_applicable() { - // dummy message - let message = Xcm(vec![Trap(5)]); - - // ParentAsUmp - check dest is really not applicable - let dest = (Parent, Parent, Parent); - let mut dest_wrapper = Some(dest.into()); - let mut msg_wrapper = Some(message.clone()); - assert_eq!( - Err(SendError::NotApplicable), - as SendXcm>::validate(&mut dest_wrapper, &mut msg_wrapper) - ); - - // check wrapper were not consumed - assert_eq!(Some(dest.into()), dest_wrapper.take()); - assert_eq!(Some(message.clone()), msg_wrapper.take()); - - // another try with router chain with asserting sender - assert_eq!( - OkFixedXcmHashWithAssertingRequiredInputsSender::expected_delivery_result(), - send_xcm::<(ParentAsUmp<(), (), ()>, OkFixedXcmHashWithAssertingRequiredInputsSender)>( - dest.into(), - message - ) - ); - } - - #[test] - fn parent_as_ump_consumes_dest_and_msg_on_ok_validate() { - // dummy message - let message = Xcm(vec![Trap(5)]); - - // ParentAsUmp - check dest/msg is valid - let dest = (Parent, Here); - let mut dest_wrapper = Some(dest.into()); - let mut msg_wrapper = Some(message.clone()); - assert!( as SendXcm>::validate( - &mut dest_wrapper, - &mut msg_wrapper - ) - .is_ok()); - - // check wrapper were consumed - assert_eq!(None, dest_wrapper.take()); - assert_eq!(None, msg_wrapper.take()); - - // another try with router chain with asserting sender - assert_eq!( - Err(SendError::Transport("Other")), - send_xcm::<( - ParentAsUmp, - OkFixedXcmHashWithAssertingRequiredInputsSender - )>(dest.into(), message) - ); - } - - #[test] - fn take_first_asset_trader_buy_weight_called_twice_throws_error() { - const AMOUNT: u128 = 100; - - // prepare prerequisites to instantiate `TakeFirstAssetTrader` - type TestAccountId = u32; - type TestAssetId = u32; - type TestBalance = u128; - struct TestAssets; - impl MatchesFungibles for TestAssets { - fn matches_fungibles(a: &MultiAsset) -> Result<(TestAssetId, TestBalance), Error> { - match a { - MultiAsset { fun: Fungible(amount), id: Concrete(_id) } => Ok((1, *amount)), - _ => Err(Error::AssetNotHandled), - } - } - } - impl fungibles::Inspect for TestAssets { - type AssetId = TestAssetId; - type Balance = TestBalance; - - fn total_issuance(_: Self::AssetId) -> Self::Balance { - todo!() - } - - fn minimum_balance(_: Self::AssetId) -> Self::Balance { - 0 - } - - fn balance(_: Self::AssetId, _: &TestAccountId) -> Self::Balance { - todo!() - } - - fn total_balance(_: Self::AssetId, _: &TestAccountId) -> Self::Balance { - todo!() - } - - fn reducible_balance( - _: Self::AssetId, - _: &TestAccountId, - _: Preservation, - _: Fortitude, - ) -> Self::Balance { - todo!() - } - - fn can_deposit( - _: Self::AssetId, - _: &TestAccountId, - _: Self::Balance, - _: Provenance, - ) -> DepositConsequence { - todo!() - } - - fn can_withdraw( - _: Self::AssetId, - _: &TestAccountId, - _: Self::Balance, - ) -> WithdrawConsequence { - todo!() - } - - fn asset_exists(_: Self::AssetId) -> bool { - todo!() - } - } - impl fungibles::Mutate for TestAssets {} - impl fungibles::Balanced for TestAssets { - type OnDropCredit = fungibles::DecreaseIssuance; - type OnDropDebt = fungibles::IncreaseIssuance; - } - impl fungibles::Unbalanced for TestAssets { - fn handle_dust(_: fungibles::Dust) { - todo!() - } - fn write_balance( - _: Self::AssetId, - _: &TestAccountId, - _: Self::Balance, - ) -> Result, DispatchError> { - todo!() - } - - fn set_total_issuance(_: Self::AssetId, _: Self::Balance) { - todo!() - } - } - - struct FeeChargerAssetsHandleRefund; - impl ChargeWeightInFungibles for FeeChargerAssetsHandleRefund { - fn charge_weight_in_fungibles( - _: >::AssetId, - _: Weight, - ) -> Result<>::Balance, XcmError> { - Ok(AMOUNT) - } - } - impl TakeRevenue for FeeChargerAssetsHandleRefund { - fn take_revenue(_: MultiAsset) {} - } - - // create new instance - type Trader = TakeFirstAssetTrader< - TestAccountId, - FeeChargerAssetsHandleRefund, - TestAssets, - TestAssets, - FeeChargerAssetsHandleRefund, - >; - let mut trader = ::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // prepare test data - let asset: MultiAsset = (Here, AMOUNT).into(); - let payment = Assets::from(asset); - let weight_to_buy = Weight::from_parts(1_000, 1_000); - - // lets do first call (success) - assert_ok!(trader.buy_weight(weight_to_buy, payment.clone(), &ctx)); - - // lets do second call (error) - assert_eq!(trader.buy_weight(weight_to_buy, payment, &ctx), Err(XcmError::NotWithdrawable)); - } -} diff --git a/cumulus/scripts/benchmarks-ci.sh b/cumulus/scripts/benchmarks-ci.sh deleted file mode 100755 index 0456ad4c4255..000000000000 --- a/cumulus/scripts/benchmarks-ci.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash - -category=$1 -runtimeName=$2 -artifactsDir=$3 -steps=${4:-50} -repeat=${5:-20} - -benchmarkOutput=./parachains/runtimes/$category/$runtimeName/src/weights -benchmarkRuntimeName="$runtimeName-dev" - -if [ $category = "glutton" ]; then - benchmarkRuntimeName="$runtimeName-dev-1300" -fi - -# Load all pallet names in an array. -pallets=($( - ${artifactsDir}/polkadot-parachain benchmark pallet --list --chain="${benchmarkRuntimeName}" |\ - tail -n+2 |\ - cut -d',' -f1 |\ - sort |\ - uniq -)) - -if [ ${#pallets[@]} -ne 0 ]; then - echo "[+] Benchmarking ${#pallets[@]} pallets for runtime $runtime" -else - echo "$runtimeName pallet list not found in benchmarks-ci.sh" - exit 1 -fi - -for pallet in ${pallets[@]} -do - output_file="${pallet//::/_}" - extra_args="" - # a little hack for pallet_xcm_benchmarks - we want to force custom implementation for XcmWeightInfo - if [[ "$pallet" == "pallet_xcm_benchmarks::generic" ]] || [[ "$pallet" == "pallet_xcm_benchmarks::fungible" ]]; then - output_file="xcm/$output_file" - extra_args="--template=./templates/xcm-bench-template.hbs" - fi - $artifactsDir/polkadot-parachain benchmark pallet \ - $extra_args \ - --chain=$benchmarkRuntimeName \ - --wasm-execution=compiled \ - --pallet=$pallet \ - --extrinsic='*' \ - --steps=$steps \ - --repeat=$repeat \ - --json \ - --header=./file_header.txt \ - --output="${benchmarkOutput}/${output_file}.rs" >> $artifactsDir/${pallet}_benchmark.json -done diff --git a/cumulus/scripts/benchmarks.sh b/cumulus/scripts/benchmarks.sh deleted file mode 100755 index 29d069059258..000000000000 --- a/cumulus/scripts/benchmarks.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -target=${1:-production} -steps=${2:-50} -repeat=${3:-20} - -__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -${__dir}/benchmarks-ci.sh collectives collectives-polkadot target/$target $steps $repeat - -${__dir}/benchmarks-ci.sh assets asset-hub-kusama target/$target $steps $repeat -${__dir}/benchmarks-ci.sh assets asset-hub-polkadot target/$target $steps $repeat -${__dir}/benchmarks-ci.sh assets asset-hub-westend target/$target $steps $repeat - -${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-polkadot target/$target $steps $repeat -${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-kusama target/$target $steps $repeat -${__dir}/benchmarks-ci.sh bridge-hubs bridge-hub-rococo target/$target $steps $repeat - -${__dir}/benchmarks-ci.sh glutton glutton-kusama target/$target $steps $repeat diff --git a/cumulus/scripts/bridges_rococo_wococo.sh b/cumulus/scripts/bridges_rococo_wococo.sh deleted file mode 100755 index 1117ed681092..000000000000 --- a/cumulus/scripts/bridges_rococo_wococo.sh +++ /dev/null @@ -1,695 +0,0 @@ -#!/bin/bash - -# Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY -# AccountId: [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] -ASSET_HUB_KUSAMA_ACCOUNT_SEED_FOR_LOCAL="//Alice" -# Address: 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY -# AccountId: [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] -ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL="5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" - -# SovereignAccount for `MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }` => 5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ -# -# use sp_core::crypto::Ss58Codec; -# println!("{}", -# frame_support::sp_runtime::AccountId32::new( -# GlobalConsensusParachainConvertsFor::::convert_ref( -# MultiLocation { parents: 2, interior: X2(GlobalConsensus(Kusama), Parachain(1000)) }).unwrap() -# ).to_ss58check_with_version(42_u16.into()) -# ); -ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT="5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" - -# Address: GegTpZJMyzkntLN7NJhRfHDk4GWukLbGSsag6PHrLSrCK4h -ASSET_HUB2_ROCOCO_1000_SOVEREIGN_ACCOUNT="scatter feed race company oxygen trip extra elbow slot bundle auto canoe" - -# Adress: 5Ge7YcbctWCP1CccugzxWDn9hFnTxvTh3bL6PNy4ubNJmp7Y / H9jCvwVWsDJkrS4gPp1QB99qr4hmbGsVyAqn3F2PPaoWyU3 -# AccountId: [202, 107, 198, 135, 15, 25, 193, 165, 172, 73, 137, 218, 115, 177, 204, 0, 5, 155, 215, 86, 208, 51, 50, 130, 190, 110, 184, 143, 124, 50, 160, 20] -ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO="5Ge7YcbctWCP1CccugzxWDn9hFnTxvTh3bL6PNy4ubNJmp7Y" -ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_WOCOCO="tone spirit magnet sunset cannon poverty forget lock river east blouse random" - -function address_to_account_id_bytes() { - local address=$1 - local output=$2 - echo "address_to_account_id_bytes - address: $address, output: $output" - if [ $address == "$ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL" ]; then - jq --null-input '[212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125]' > $output - elif [ $address == "$ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO" ]; then - jq --null-input '[202, 107, 198, 135, 15, 25, 193, 165, 172, 73, 137, 218, 115, 177, 204, 0, 5, 155, 215, 86, 208, 51, 50, 130, 190, 110, 184, 143, 124, 50, 160, 20]' > $output - else - echo -n "Sorry, unknown address: $address - please, add bytes here or function for that!" - exit 1 - fi -} - -function ensure_binaries() { - if [[ ! -f ~/local_bridge_testing/bin/polkadot ]]; then - echo " Required polkadot binary '~/local_bridge_testing/bin/polkadot' does not exist!" - echo " You need to build it and copy to this location!" - echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" - exit 1 - fi - if [[ ! -f ~/local_bridge_testing/bin/polkadot-parachain ]]; then - echo " Required polkadot-parachain binary '~/local_bridge_testing/bin/polkadot-parachain' does not exist!" - echo " You need to build it and copy to this location!" - echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" - exit 1 - fi -} - -function ensure_relayer() { - if [[ ! -f ~/local_bridge_testing/bin/substrate-relay ]]; then - echo " Required substrate-relay binary '~/local_bridge_testing/bin/substrate-relay' does not exist!" - echo " You need to build it and copy to this location!" - echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" - exit 1 - fi -} - -function ensure_polkadot_js_api() { - if ! which polkadot-js-api &> /dev/null; then - echo '' - echo 'Required command `polkadot-js-api` not in PATH, please, install, e.g.:' - echo "npm install -g @polkadot/api-cli@beta" - echo " or" - echo "yarn global add @polkadot/api-cli" - echo '' - exit 1 - fi - if ! which jq &> /dev/null; then - echo '' - echo 'Required command `jq` not in PATH, please, install, e.g.:' - echo "apt install -y jq" - echo '' - exit 1 - fi - generate_hex_encoded_call_data "check" "--" - local retVal=$? - if [ $retVal -ne 0 ]; then - echo "" - echo "" - echo "-------------------" - echo "Installing (nodejs) sub module: ./scripts/generate_hex_encoded_call" - pushd ./scripts/generate_hex_encoded_call - npm install - popd - fi -} - -function generate_hex_encoded_call_data() { - local type=$1 - local endpoint=$2 - local output=$3 - shift - shift - shift - echo "Input params: $@" - - node ./scripts/generate_hex_encoded_call "$type" "$endpoint" "$output" "$@" - local retVal=$? - - if [ $type != "check" ]; then - local hex_encoded_data=$(cat $output) - echo "Generated hex-encoded bytes to file '$output': $hex_encoded_data" - fi - - return $retVal -} - -function transfer_balance() { - local runtime_para_endpoint=$1 - local seed=$2 - local target_account=$3 - local amount=$4 - echo " calling transfer_balance:" - echo " runtime_para_endpoint: ${runtime_para_endpoint}" - echo " seed: ${seed}" - echo " target_account: ${target_account}" - echo " amount: ${amount}" - echo "--------------------------------------------------" - - polkadot-js-api \ - --ws "${runtime_para_endpoint}" \ - --seed "${seed?}" \ - tx.balances.transfer \ - "${target_account}" \ - "${amount}" -} - -function send_governance_transact() { - local relay_url=$1 - local relay_chain_seed=$2 - local para_id=$3 - local hex_encoded_data=$4 - local require_weight_at_most_ref_time=$5 - local require_weight_at_most_proof_size=$6 - echo " calling send_governance_transact:" - echo " relay_url: ${relay_url}" - echo " relay_chain_seed: ${relay_chain_seed}" - echo " para_id: ${para_id}" - echo " hex_encoded_data: ${hex_encoded_data}" - echo " require_weight_at_most_ref_time: ${require_weight_at_most_ref_time}" - echo " require_weight_at_most_proof_size: ${require_weight_at_most_proof_size}" - echo " params:" - - local dest=$(jq --null-input \ - --arg para_id "$para_id" \ - '{ "V3": { "parents": 0, "interior": { "X1": { "Parachain": $para_id } } } }') - - local message=$(jq --null-input \ - --argjson hex_encoded_data $hex_encoded_data \ - --arg require_weight_at_most_ref_time "$require_weight_at_most_ref_time" \ - --arg require_weight_at_most_proof_size "$require_weight_at_most_proof_size" \ - ' - { - "V3": [ - { - "UnpaidExecution": { - "weight_limit": "Unlimited" - } - }, - { - "Transact": { - "origin_kind": "Superuser", - "require_weight_at_most": { - "ref_time": $require_weight_at_most_ref_time, - "proof_size": $require_weight_at_most_proof_size, - }, - "call": { - "encoded": $hex_encoded_data - } - } - } - ] - } - ') - - echo "" - echo " dest:" - echo "${dest}" - echo "" - echo " message:" - echo "${message}" - echo "" - echo "--------------------------------------------------" - - polkadot-js-api \ - --ws "${relay_url?}" \ - --seed "${relay_chain_seed?}" \ - --sudo \ - tx.xcmPallet.send \ - "${dest}" \ - "${message}" -} - -function allow_assets_transfer_send() { - local relay_url=$1 - local relay_chain_seed=$2 - local runtime_para_id=$3 - local runtime_para_endpoint=$4 - local bridge_hub_para_id=$5 - local bridged_para_network=$6 - local bridged_para_para_id=$7 - echo " calling allow_assets_transfer_send:" - echo " relay_url: ${relay_url}" - echo " relay_chain_seed: ${relay_chain_seed}" - echo " runtime_para_id: ${runtime_para_id}" - echo " runtime_para_endpoint: ${runtime_para_endpoint}" - echo " bridge_hub_para_id: ${bridge_hub_para_id}" - echo " bridged_para_network: ${bridged_para_network}" - echo " bridged_para_para_id: ${bridged_para_para_id}" - echo " params:" - - # 1. generate data for Transact (add_exporter_config) - local bridge_config=$(jq --null-input \ - --arg bridge_hub_para_id "$bridge_hub_para_id" \ - --arg bridged_para_network "$bridged_para_network" \ - --arg bridged_para_para_id "$bridged_para_para_id" \ - ' - { - "bridgeLocation": { - "parents": 1, - "interior": { - "X1": { "Parachain": $bridge_hub_para_id } - } - }, - "allowedTargetLocation": { - "parents": 2, - "interior": { - "X2": [ - { - "GlobalConsensus": $bridged_para_network, - }, - { - "Parachain": $bridged_para_para_id - } - ] - } - }, - "maxTargetLocationFee": { - "id": { - "Concrete": { - "parents": 1, - "interior": "Here" - } - }, - "fun": { - "Fungible": 50000000000 - } - } - } - ' - ) - local tmp_output_file=$(mktemp) - generate_hex_encoded_call_data "add-exporter-config" "${runtime_para_endpoint}" "${tmp_output_file}" $bridged_para_network "$bridge_config" - local hex_encoded_data=$(cat $tmp_output_file) - - send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 -} - -function force_create_foreign_asset() { - local relay_url=$1 - local relay_chain_seed=$2 - local runtime_para_id=$3 - local runtime_para_endpoint=$4 - local global_consensus=$5 - local asset_owner_account_id=$6 - echo " calling force_create_foreign_asset:" - echo " relay_url: ${relay_url}" - echo " relay_chain_seed: ${relay_chain_seed}" - echo " runtime_para_id: ${runtime_para_id}" - echo " runtime_para_endpoint: ${runtime_para_endpoint}" - echo " global_consensus: ${global_consensus}" - echo " asset_owner_account_id: ${asset_owner_account_id}" - echo " params:" - - # 1. generate data for Transact (ForeignAssets::force_create) - local asset_id=$(jq --null-input \ - --arg global_consensus "$global_consensus" \ - ' - { - "parents": 2, - "interior": { - "X1": { - "GlobalConsensus": $global_consensus, - } - } - } - ' - ) - local tmp_output_file=$(mktemp) - generate_hex_encoded_call_data "force-create-asset" "${runtime_para_endpoint}" "${tmp_output_file}" "$asset_id" "$asset_owner_account_id" false "1000" - local hex_encoded_data=$(cat $tmp_output_file) - - send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 -} - -function allow_assets_transfer_receive() { - local relay_url=$1 - local relay_chain_seed=$2 - local runtime_para_id=$3 - local runtime_para_endpoint=$4 - local bridge_hub_para_id=$5 - local bridged_network=$6 - local bridged_para_id=$7 - echo " calling allow_assets_transfer_receive:" - echo " relay_url: ${relay_url}" - echo " relay_chain_seed: ${relay_chain_seed}" - echo " runtime_para_id: ${runtime_para_id}" - echo " runtime_para_endpoint: ${runtime_para_endpoint}" - echo " bridge_hub_para_id: ${bridge_hub_para_id}" - echo " bridged_network: ${bridged_network}" - echo " bridged_para_id: ${bridged_para_id}" - echo " params:" - - # 1. generate data for Transact (add_universal_alias) - local location=$(jq --null-input \ - --arg bridge_hub_para_id "$bridge_hub_para_id" \ - '{ "V3": { "parents": 1, "interior": { "X1": { "Parachain": $bridge_hub_para_id } } } }') - - local junction=$(jq --null-input \ - --arg bridged_network "$bridged_network" \ - '{ "GlobalConsensus": $bridged_network } ') - - local tmp_output_file=$(mktemp) - generate_hex_encoded_call_data "add-universal-alias" "${runtime_para_endpoint}" "${tmp_output_file}" "$location" "$junction" - local hex_encoded_data=$(cat $tmp_output_file) - - send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 - - # 2. generate data for Transact (add_reserve_location) - local reserve_location=$(jq --null-input \ - --arg bridged_network "$bridged_network" \ - --arg bridged_para_id "$bridged_para_id" \ - '{ "V3": { - "parents": 2, - "interior": { - "X2": [ - { - "GlobalConsensus": $bridged_network, - }, - { - "Parachain": $bridged_para_id - } - ] - } - } }') - - local tmp_output_file=$(mktemp) - generate_hex_encoded_call_data "add-reserve-location" "${runtime_para_endpoint}" "${tmp_output_file}" "$reserve_location" - local hex_encoded_data=$(cat $tmp_output_file) - - send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 -} - -function remove_assets_transfer_send() { - local relay_url=$1 - local relay_chain_seed=$2 - local runtime_para_id=$3 - local runtime_para_endpoint=$4 - local bridged_network=$5 - echo " calling remove_assets_transfer_send:" - echo " relay_url: ${relay_url}" - echo " relay_chain_seed: ${relay_chain_seed}" - echo " runtime_para_id: ${runtime_para_id}" - echo " runtime_para_endpoint: ${runtime_para_endpoint}" - echo " bridged_network: ${bridged_network}" - echo " params:" - - local tmp_output_file=$(mktemp) - generate_hex_encoded_call_data "remove-exporter-config" "${runtime_para_endpoint}" "${tmp_output_file}" $bridged_network - local hex_encoded_data=$(cat $tmp_output_file) - - send_governance_transact "${relay_url}" "${relay_chain_seed}" "${runtime_para_id}" "${hex_encoded_data}" 200000000 12000 -} - -# TODO: we need to fill sovereign account for bridge-hub, because, small ammouts does not match ExistentialDeposit, so no reserve pass -# SA for BH: MultiLocation { parents: 1, interior: X1(Parachain(1013)) } - 5Eg2fntRRwLinojmk3sh5xscp7F3S6Zzm5oDVtoLTALKiypR on Kusama Asset Hub - -function transfer_asset_via_bridge() { - local url=$1 - local seed=$2 - local target_account=$3 - local target_global_consensus=$4 - echo " calling transfer_asset_via_bridge:" - echo " url: ${url}" - echo " seed: ${seed}" - echo " target_account: ${target_account}" - echo " target_global_consensus: ${target_global_consensus}" - echo " params:" - - local assets=$(jq --null-input \ - ' - { - "V3": [ - { - "id": { - "Concrete": { - "parents": 1, - "interior": "Here" - } - }, - "fun": { - "Fungible": 100000000 - } - } - ] - } - ' - ) - - local tmp_output_file=$(mktemp) - address_to_account_id_bytes "$target_account" "${tmp_output_file}" - local hex_encoded_data=$(cat $tmp_output_file) - - local destination=$(jq --null-input \ - --arg target_global_consensus "$target_global_consensus" \ - --argjson hex_encoded_data "$hex_encoded_data" \ - ' - { - "V3": { - "parents": 2, - "interior": { - "X3": [ - { - "GlobalConsensus": $target_global_consensus - }, - { - "Parachain": 1000 - }, - { - "AccountId32": { - "id": $hex_encoded_data - } - } - ] - } - } - } - ' - ) - - echo "" - echo " assets:" - echo "${assets}" - echo "" - echo " destination:" - echo "${destination}" - echo "" - echo "--------------------------------------------------" - - polkadot-js-api \ - --ws "${url?}" \ - --seed "${seed?}" \ - tx.bridgeTransfer.transferAssetViaBridge \ - "${assets}" \ - "${destination}" -} - -function ping_via_bridge() { - local url=$1 - local seed=$2 - local target_account=$3 - local target_global_consensus=$4 - echo " calling ping_via_bridge:" - echo " url: ${url}" - echo " seed: ${seed}" - echo " target_account: ${target_account}" - echo " target_global_consensus: ${target_global_consensus}" - echo " params:" - - local tmp_output_file=$(mktemp) - address_to_account_id_bytes "$target_account" "${tmp_output_file}" - local hex_encoded_data=$(cat $tmp_output_file) - - local destination=$(jq --null-input \ - --arg target_global_consensus "$target_global_consensus" \ - --argjson hex_encoded_data "$hex_encoded_data" \ - ' - { - "V3": { - "parents": 2, - "interior": { - "X3": [ - { - "GlobalConsensus": $target_global_consensus - }, - { - "Parachain": 1000 - }, - { - "AccountId32": { - "id": $hex_encoded_data - } - } - ] - } - } - } - ' - ) - - echo "" - echo " destination:" - echo "${destination}" - echo "" - echo "--------------------------------------------------" - - polkadot-js-api \ - --ws "${url?}" \ - --seed "${seed?}" \ - tx.bridgeTransfer.pingViaBridge \ - "${destination}" -} - -function init_ro_wo() { - ensure_relayer - - RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay init-bridge rococo-to-bridge-hub-wococo \ - --source-host localhost \ - --source-port 9942 \ - --source-version-mode Auto \ - --target-host localhost \ - --target-port 8945 \ - --target-version-mode Auto \ - --target-signer //Bob -} - -function init_wo_ro() { - ensure_relayer - - RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay init-bridge wococo-to-bridge-hub-rococo \ - --source-host localhost \ - --source-port 9945 \ - --source-version-mode Auto \ - --target-host localhost \ - --target-port 8943 \ - --target-version-mode Auto \ - --target-signer //Bob -} - -function run_relay() { - ensure_relayer - - RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay relay-headers-and-messages bridge-hub-rococo-bridge-hub-wococo \ - --rococo-host localhost \ - --rococo-port 9942 \ - --rococo-version-mode Auto \ - --bridge-hub-rococo-host localhost \ - --bridge-hub-rococo-port 8943 \ - --bridge-hub-rococo-version-mode Auto \ - --bridge-hub-rococo-signer //Charlie \ - --wococo-headers-to-bridge-hub-rococo-signer //Bob \ - --wococo-parachains-to-bridge-hub-rococo-signer //Bob \ - --bridge-hub-rococo-transactions-mortality 4 \ - --wococo-host localhost \ - --wococo-port 9945 \ - --wococo-version-mode Auto \ - --bridge-hub-wococo-host localhost \ - --bridge-hub-wococo-port 8945 \ - --bridge-hub-wococo-version-mode Auto \ - --bridge-hub-wococo-signer //Charlie \ - --rococo-headers-to-bridge-hub-wococo-signer //Bob \ - --rococo-parachains-to-bridge-hub-wococo-signer //Bob \ - --bridge-hub-wococo-transactions-mortality 4 \ - --lane 00000001 -} - -case "$1" in - run-relay) - init_ro_wo - init_wo_ro - run_relay - ;; - allow-transfers-local) - # this allows send transfers on asset hub kusama local (by governance-like) - ./$0 "allow-transfer-on-asset-hub-kusama-local" - # this allows receive transfers on asset hub westend local (by governance-like) - ./$0 "allow-transfer-on-asset-hub-westend-local" - ;; - allow-transfer-on-asset-hub-kusama-local) - ensure_polkadot_js_api - allow_assets_transfer_send \ - "ws://127.0.0.1:9942" \ - "//Alice" \ - 1000 \ - "ws://127.0.0.1:9910" \ - 1013 \ - "Wococo" 1000 - ;; - allow-transfer-on-asset-hub-westend-local) - ensure_polkadot_js_api - allow_assets_transfer_receive \ - "ws://127.0.0.1:9945" \ - "//Alice" \ - 1000 \ - "ws://127.0.0.1:9010" \ - 1014 \ - "Rococo" \ - 1000 - transfer_balance \ - "ws://127.0.0.1:9010" \ - "//Alice" \ - "$ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT" \ - $((1000000000 + 50000000000 * 20)) # ExistentialDeposit + maxTargetLocationFee * 20 - # create foreign assets for native Kusama token (yes, Kusama, because we are using Kusama Asset Hub runtime on rococo) - force_create_foreign_asset \ - "ws://127.0.0.1:9945" \ - "//Alice" \ - 1000 \ - "ws://127.0.0.1:9010" \ - "Kusama" \ - "$ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT" - ;; - remove-assets-transfer-from-asset-hub-kusama-local) - ensure_polkadot_js_api - remove_assets_transfer_send \ - "ws://127.0.0.1:9942" \ - "//Alice" \ - 1000 \ - "ws://127.0.0.1:9910" \ - "Wococo" - ;; - transfer-asset-from-asset-hub-kusama-local) - ensure_polkadot_js_api - transfer_asset_via_bridge \ - "ws://127.0.0.1:9910" \ - "$ASSET_HUB_KUSAMA_ACCOUNT_SEED_FOR_LOCAL" \ - "$ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL" \ - "Wococo" - ;; - ping-via-bridge-from-asset-hub-kusama-local) - ensure_polkadot_js_api - ping_via_bridge \ - "ws://127.0.0.1:9910" \ - "$ASSET_HUB_KUSAMA_ACCOUNT_SEED_FOR_LOCAL" \ - "$ASSET_HUB_WOCOCO_ACCOUNT_SEED_FOR_LOCAL" \ - "Wococo" - ;; - transfer-asset-from-asset-hub-rococo) - ensure_polkadot_js_api - transfer_asset_via_bridge \ - "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ - "$ASSET_HUB2_ROCOCO_1000_SOVEREIGN_ACCOUNT" \ - "$ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO" \ - "Wococo" - ;; - ping-via-bridge-from-asset-hub-rococo) - ensure_polkadot_js_api - ping_via_bridge \ - "wss://ws-rococo-rockmine2-collator-node-0.parity-testnet.parity.io" \ - "${ASSET_HUB2_ROCOCO_1000_SOVEREIGN_ACCOUNT}" \ - "$ASSET_HUB_WOCOCO_ACCOUNT_ADDRESS_FOR_ROCOCO" \ - "Wococo" - ;; - drip) - transfer_balance \ - "ws://127.0.0.1:9010" \ - "//Alice" \ - "$ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT" \ - $((1000000000 + 50000000000 * 20)) - ;; - stop) - pkill -f polkadot - pkill -f parachain - ;; - import) - # to avoid trigger anything here - ;; - *) - echo "A command is require. Supported commands for: - Local (zombienet) run: - - run-relay - - allow-transfers-local - - allow-transfer-on-asset-hub-kusama-local - - allow-transfer-on-asset-hub-westend-local - - remove-assets-transfer-from-asset-hub-kusama-local - - transfer-asset-from-asset-hub-kusama-local - - ping-via-bridge-from-asset-hub-kusama-local - Live Rococo/Wococo run: - - transfer-asset-from-asset-hub-rococo - - ping-via-bridge-from-asset-hub-rococo"; - exit 1 - ;; -esac diff --git a/cumulus/scripts/bridges_update_subtree.sh b/cumulus/scripts/bridges_update_subtree.sh deleted file mode 100755 index 5c5c7a322a16..000000000000 --- a/cumulus/scripts/bridges_update_subtree.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash - -# A script to udpate bridges repo as subtree to Cumulus -# Usage: -# ./scripts/bridges_update_subtree.sh fetch -# ./scripts/bridges_update_subtree.sh patch -# ./scripts/bridges_update_subtree.sh merge - -set -e - -BRIDGES_BRANCH="${BRANCH:-polkadot-staging}" -BRIDGES_TARGET_DIR="${TARGET_DIR:-bridges}" - -function fetch() { - # the script is able to work only on clean git copy - [[ -z "$(git status --porcelain)" ]] || { - echo >&2 "The git copy must be clean (stash all your changes):"; - git status --porcelain - exit 1; - } - - local bridges_remote=$(git remote -v | grep "parity-bridges-common.git (fetch)" | head -n1 | awk '{print $1;}') - if [ -z "$bridges_remote" ]; then - echo "" - echo "Adding new remote: 'bridges' repo..." - echo "" - echo "... check your YubiKey ..." - git remote add -f bridges git@github.com:paritytech/parity-bridges-common.git - bridges_remote="bridges" - else - echo "" - echo "Fetching remote: '${bridges_remote}' repo..." - echo "" - echo "... check your YubiKey ..." - git fetch ${bridges_remote} --prune - fi - - echo "" - echo "Syncing/updating subtree with remote branch '${bridges_remote}/$BRIDGES_BRANCH' to target directory: '$BRIDGES_TARGET_DIR'" - echo "" - echo "... check your YubiKey ..." - git subtree pull --prefix=$BRIDGES_TARGET_DIR ${bridges_remote} $BRIDGES_BRANCH --squash -} - -function patch() { - echo "" - echo "Patching/removing unneeded stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" - $BRIDGES_TARGET_DIR/scripts/verify-pallets-build.sh --ignore-git-state --no-revert -} - -function merge() { - echo "" - echo "Merging stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" - - # stage all removed by patch: DU, MD, D, AD - only from subtree directory - git status -s | awk '$1 == "DU" || $1 == "D" || $1 == "MD" || $1 == "AD" {print $2}' | grep "^$BRIDGES_TARGET_DIR/" | xargs git rm -q --ignore-unmatch - - echo "" - echo "When all conflicts are resolved, do 'git merge --continue'" -} - -function amend() { - echo "" - echo "Amend stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" - git commit --amend -S -m "updating bridges subtree + remove extra folders" -} - -case "$1" in - fetch) - fetch - ;; - patch) - patch - ;; - merge) - merge - ;; - amend) - amend - ;; - all) - fetch - patch - ;; -esac diff --git a/cumulus/scripts/ci/changelog/.gitignore b/cumulus/scripts/ci/changelog/.gitignore deleted file mode 100644 index 4fbcc523b04c..000000000000 --- a/cumulus/scripts/ci/changelog/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -changelog.md -*.json -release*.md -.env diff --git a/cumulus/scripts/ci/changelog/Gemfile b/cumulus/scripts/ci/changelog/Gemfile deleted file mode 100644 index 46b058e3c500..000000000000 --- a/cumulus/scripts/ci/changelog/Gemfile +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -source 'https://rubygems.org' - -git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } - -gem 'octokit', '~> 4' - -gem 'git_diff_parser', '~> 3' - -gem 'toml', '~> 0.3.0' - -gem 'rake', group: :dev - -gem 'optparse', '~> 0.1.1' - -gem 'logger', '~> 1.4' - -gem 'changelogerator', '0.10.1' - -gem 'test-unit', group: :dev - -gem 'rubocop', group: :dev, require: false diff --git a/cumulus/scripts/ci/changelog/Gemfile.lock b/cumulus/scripts/ci/changelog/Gemfile.lock deleted file mode 100644 index 893bec549195..000000000000 --- a/cumulus/scripts/ci/changelog/Gemfile.lock +++ /dev/null @@ -1,84 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - ast (2.4.2) - changelogerator (0.10.1) - git_diff_parser (~> 3) - octokit (~> 4) - faraday (1.8.0) - faraday-em_http (~> 1.0) - faraday-em_synchrony (~> 1.0) - faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0.1) - faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) - faraday-patron (~> 1.0) - faraday-rack (~> 1.0) - multipart-post (>= 1.2, < 3) - ruby2_keywords (>= 0.0.4) - faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) - faraday-excon (1.1.0) - faraday-httpclient (1.0.1) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.2.0) - faraday-patron (1.0.0) - faraday-rack (1.0.0) - git_diff_parser (3.2.0) - logger (1.4.4) - multipart-post (2.1.1) - octokit (4.21.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) - optparse (0.1.1) - parallel (1.21.0) - parser (3.0.2.0) - ast (~> 2.4.1) - parslet (2.0.0) - power_assert (2.0.1) - public_suffix (4.0.6) - rainbow (3.0.0) - rake (13.0.6) - regexp_parser (2.1.1) - rexml (3.2.5) - rubocop (1.23.0) - parallel (~> 1.10) - parser (>= 3.0.0.0) - rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml - rubocop-ast (>= 1.12.0, < 2.0) - ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.13.0) - parser (>= 3.0.1.1) - ruby-progressbar (1.11.0) - ruby2_keywords (0.0.5) - sawyer (0.8.2) - addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) - test-unit (3.5.1) - power_assert - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - unicode-display_width (2.1.0) - -PLATFORMS - x86_64-darwin-20 - x86_64-darwin-22 - -DEPENDENCIES - changelogerator (= 0.10.1) - git_diff_parser (~> 3) - logger (~> 1.4) - octokit (~> 4) - optparse (~> 0.1.1) - rake - rubocop - test-unit - toml (~> 0.3.0) - -BUNDLED WITH - 2.2.22 diff --git a/cumulus/scripts/ci/changelog/README.md b/cumulus/scripts/ci/changelog/README.md deleted file mode 100644 index 478e0b56d9ca..000000000000 --- a/cumulus/scripts/ci/changelog/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# Changelog - -Currently, the changelog is built locally. It will be moved to CI once labels stabilize. - -For now, a bit of preparation is required before you can run the script: -- fetch the srtool digests -- store them under the `digests` folder as `-srtool-digest.json` -- ensure the `.env` file is up to date with correct information - -The content of the release notes is generated from the template files under the `scripts/ci/changelog/templates` folder. For readability and maintenance, the template is split into several small snippets. - -Run: -``` -./bin/changelog [=HEAD] -``` - -For instance: -``` -./bin/changelog parachains-v7.0.0-rc8 -``` - -A file called `release-notes.md` will be generated and can be used for the release. - -## ENV - -You may use the following ENV for testing: - -``` -RUSTC_STABLE="rustc 1.56.1 (59eed8a2a 2021-11-01)" -RUSTC_NIGHTLY="rustc 1.57.0-nightly (51e514c0f 2021-09-12)" -PRE_RELEASE=true -HIDE_SRTOOL_ROCOCO=true -HIDE_SRTOOL_SHELL=true -REF1=statemine-v5.0.0 -REF2=HEAD -DEBUG=1 -NO_CACHE=1 -``` - -By default, the template will include all the information, including the runtime data. -For clients releases, we don't need those and they can be skipped by setting the following env: -``` -RELEASE_TYPE=client -``` - -## Considered labels - -The following list will likely evolve over time and it will be hard to keep it in sync. -In any case, if you want to find all the labels that are used, search for `meta` in the templates. -Currently, the considered labels are: - -- Priority: C labels -- Audit: D labels -- E4 => new host function -- B0 => silent, not showing up -- B1-releasenotes (misc unless other labels) -- B5-client (client changes) -- B7-runtimenoteworthy (runtime changes) -- T6-XCM - -Note that labels with the same letter are mutually exclusive. -A PR should not have both `B0` and `B5`, or both `C1` and `C9`. In case of conflicts, the template will -decide which label will be considered. - -## Dev and debuggin - -### Hot Reload - -The following command allows **Hot Reload**: -``` -fswatch templates -e ".*\.md$" | xargs -n1 -I{} ./bin/changelog statemine-v5.0.0 -``` -### Caching - -By default, if the changelog data from Github is already present, the calls to the Github API will be skipped -and the local version of the data will be used. This is much faster. -If you know that some labels have changed in Github, you probably want to refresh the data. -You can then either delete manually the `cumulus.json` file or `export NO_CACHE=1` to force refreshing the data. diff --git a/cumulus/scripts/ci/changelog/bin/changelog b/cumulus/scripts/ci/changelog/bin/changelog deleted file mode 100755 index 6cd012a29edb..000000000000 --- a/cumulus/scripts/ci/changelog/bin/changelog +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env ruby - -# frozen_string_literal: true - -# call for instance as: -# ./bin/changelog statemine-v5.0.0 -# -# You may set the ENV NO_CACHE to force fetching from Github -# You should also ensure you set the ENV: GITHUB_TOKEN - -require_relative '../lib/changelog' -require 'logger' - -logger = Logger.new($stdout) -logger.level = Logger::DEBUG -logger.debug('Starting') - -changelogerator_version = `changelogerator --version` -logger.debug(changelogerator_version) - -owner = 'paritytech' -repo = 'cumulus' -ref1 = ARGV[0] -ref2 = ARGV[1] || 'HEAD' -output = ARGV[2] || 'release-notes.md' - -ENV['REF1'] = ref1 -ENV['REF2'] = ref2 - -gh_cumulus = SubRef.new(format('%s/%s', { owner: owner, repo: repo })) - -polkadot_ref1 = gh_cumulus.get_dependency_reference(ref1, 'polkadot-primitives') -polkadot_ref2 = gh_cumulus.get_dependency_reference(ref2, 'polkadot-primitives') - -substrate_ref1 = gh_cumulus.get_dependency_reference(ref1, 'sp-io') -substrate_ref2 = gh_cumulus.get_dependency_reference(ref2, 'sp-io') - -logger.debug("Cumulus from: #{ref1}") -logger.debug("Cumulus to: #{ref2}") - -logger.debug("Polkadot from: #{polkadot_ref1}") -logger.debug("Polkadot to: #{polkadot_ref2}") - -logger.debug("Substrate from: #{substrate_ref1}") -logger.debug("Substrate to: #{substrate_ref2}") - -cumulus_data = 'cumulus.json' -substrate_data = 'substrate.json' -polkadot_data = 'polkadot.json' - -logger.debug("Using CUMULUS: #{cumulus_data}") -logger.debug("Using SUBSTRATE: #{substrate_data}") -logger.debug("Using POLKADOT: #{polkadot_data}") - -logger.warn('NO_CACHE set') if ENV['NO_CACHE'] - -# This is acting as cache so we don't spend time querying while testing -if ENV['NO_CACHE'] || !File.file?(cumulus_data) - logger.debug(format('Fetching data for Cumulus into %s', cumulus_data)) - cmd = format('changelogerator %s/%s -f %s -t %s > %s', - { owner: owner, repo: repo, from: ref1, to: ref2, output: cumulus_data }) - system(cmd) -else - logger.debug("Re-using:#{cumulus_data}") -end - -if ENV['NO_CACHE'] || !File.file?(polkadot_data) - logger.debug(format('Fetching data for Polkadot into %s', polkadot_data)) - cmd = format('changelogerator %s/%s -f %s -t %s > %s', - { owner: owner, repo: 'polkadot', from: polkadot_ref1, to: polkadot_ref2, output: polkadot_data }) - system(cmd) -else - logger.debug("Re-using:#{polkadot_data}") -end - -if ENV['NO_CACHE'] || !File.file?(substrate_data) - logger.debug(format('Fetching data for Substrate into %s', substrate_data)) - cmd = format('changelogerator %s/%s -f %s -t %s > %s', - { owner: owner, repo: 'substrate', from: substrate_ref1, to: substrate_ref2, output: substrate_data }) - system(cmd) -else - logger.debug("Re-using:#{substrate_data}") -end - -POLKADOT_COLLECTIVES_DIGEST = ENV['COLLECTIVES_POLKADOT_DIGEST'] || 'digests/collectives-polkadot-srtool-digest.json' -SHELL_DIGEST = ENV['SHELL_DIGEST'] || 'digests/shell-srtool-digest.json' -ASSET_HUB_WESTEND_DIGEST = ENV['ASSET_HUB_WESTEND_DIGEST'] || 'digests/asset-hub-westend-srtool-digest.json' -ASSET_HUB_KUSAMA_DIGEST = ENV['ASSET_HUB_KUSAMA_DIGEST'] || 'digests/asset-hub-kusama-srtool-digest.json' -ASSET_HUB_POLKADOT_DIGEST = ENV['ASSET_HUB_POLKADOT_DIGEST'] || 'digests/asset-hub-westend-srtool-digest.json' -BRIDGE_HUB_ROCOCO_DIGEST = ENV['BRIDGE_HUB_ROCOCO_DIGEST'] || 'digests/bridge-hub-rococo-srtool-digest.json' -BRIDGE_HUB_KUSAMA_DIGEST = ENV['BRIDGE_HUB_KUSAMA_DIGEST'] || 'digests/bridge-hub-kusama-srtool-digest.json' -BRIDGE_HUB_POLKADOT_DIGEST = ENV['BRIDGE_HUB_POLKADOT_DIGEST'] || 'digests/bridge-hub-polkadot-srtool-digest.json' -ROCOCO_PARA_DIGEST = ENV['ROCOCO_PARA_DIGEST'] || 'digests/rococo-parachain-srtool-digest.json' -CANVAS_KUSAMA_DIGEST = ENV['CANVAS_KUSAMA_DIGEST'] || 'digests/contracts-rococo-srtool-digest.json' - -logger.debug("Release type: #{ENV['RELEASE_TYPE']}") - -if ENV['RELEASE_TYPE'] && ENV['RELEASE_TYPE'] == 'client' - logger.debug('Building changelog without runtimes') - cmd = format('jq \ - --slurpfile cumulus %s \ - --slurpfile substrate %s \ - --slurpfile polkadot %s \ - -n \'{ - cumulus: $cumulus[0], - substrate: $substrate[0], - polkadot: $polkadot[0], - }\' > context.json', cumulus_data, substrate_data, polkadot_data, - ) -else - logger.debug('Building changelog with runtimes') - - # Here we compose all the pieces together into one - # single big json file. - cmd = format('jq \ - --slurpfile cumulus %s \ - --slurpfile substrate %s \ - --slurpfile polkadot %s \ - --slurpfile srtool_shell %s \ - --slurpfile srtool_westmint %s \ - --slurpfile srtool_statemine %s \ - --slurpfile srtool_statemint %s \ - --slurpfile srtool_rococo_parachain %s \ - --slurpfile srtool_contracts_rococo %s \ - --slurpfile srtool_polkadot_collectives %s \ - --slurpfile srtool_bridge_hub_rococo %s \ - --slurpfile srtool_bridge_hub_kusama %s \ - --slurpfile srtool_bridge_hub_polkadot %s \ - -n \'{ - cumulus: $cumulus[0], - substrate: $substrate[0], - polkadot: $polkadot[0], - srtool: [ - { order: 10, name: "asset-hub-polkadot", note: " (Former Statemint)", data: $srtool_statemint[0] }, - { order: 11, name: "bridge-hub-polkadot", data: $srtool_bridge_hub_polkadot[0] }, - { order: 20, name: "asset-hub-kusama", note: " (Former Statemine)", data: $srtool_statemine[0] }, - { order: 21, name: "bridge-hub-kusama", data: $srtool_bridge_hub_kusama[0] }, - { order: 30, name: "asset-hub-westend", note: " (Former Westmint)", data: $srtool_westmint[0] }, - { order: 40, name: "rococo", data: $srtool_rococo_parachain[0] }, - { order: 41, name: "bridge-hub-rococo", data: $srtool_bridge_hub_rococo[0] }, - { order: 50, name: "polkadot-collectives", data: $srtool_polkadot_collectives[0] }, - { order: 60, name: "contracts", data: $srtool_contracts_rococo[0] }, - { order: 90, name: "shell", data: $srtool_shell[0] } - ] }\' > context.json', - cumulus_data, - substrate_data, - polkadot_data, - SHELL_DIGEST, - ASSET_HUB_WESTEND_DIGEST, - ASSET_HUB_KUSAMA_DIGEST, - ASSET_HUB_POLKADOT_DIGEST, - ROCOCO_PARA_DIGEST, - CANVAS_KUSAMA_DIGEST, - POLKADOT_COLLECTIVES_DIGEST, - BRIDGE_HUB_ROCOCO_DIGEST, - BRIDGE_HUB_KUSAMA_DIGEST, - BRIDGE_HUB_POLKADOT_DIGEST - ) -end -system(cmd) - -cmd = format('tera --env --env-key env --include-path templates \ - --template templates/template.md.tera context.json > %s', output) -system(cmd) diff --git a/cumulus/scripts/ci/changelog/digests/.gitignore b/cumulus/scripts/ci/changelog/digests/.gitignore deleted file mode 100644 index a6c57f5fb2ff..000000000000 --- a/cumulus/scripts/ci/changelog/digests/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.json diff --git a/cumulus/scripts/ci/changelog/lib/changelog.rb b/cumulus/scripts/ci/changelog/lib/changelog.rb deleted file mode 100644 index 2d9ee29a8c89..000000000000 --- a/cumulus/scripts/ci/changelog/lib/changelog.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -# A Class to find Substrate references -class SubRef - require 'octokit' - require 'toml' - - attr_reader :client, :repository - - def initialize(github_repo) - @client = Octokit::Client.new( - access_token: ENV['GITHUB_TOKEN'] - ) - @repository = @client.repository(github_repo) - end - - # This function checks the Cargo.lock of a given - # Rust project, for a given package, and fetches - # the dependency git ref. - def get_dependency_reference(ref, package) - cargo = TOML::Parser.new( - Base64.decode64( - @client.contents( - @repository.full_name, - path: 'Cargo.lock', - query: { ref: ref.to_s } - ).content - ) - ).parsed - cargo['package'].find { |p| p['name'] == package }['source'].split('#').last - end -end diff --git a/cumulus/scripts/ci/changelog/templates/change.md.tera b/cumulus/scripts/ci/changelog/templates/change.md.tera deleted file mode 100644 index 609a038789ac..000000000000 --- a/cumulus/scripts/ci/changelog/templates/change.md.tera +++ /dev/null @@ -1,44 +0,0 @@ -{# This macro shows ONE change #} -{%- macro change(c, cml="[C]", dot="[P]", sub="[S]") -%} - -{%- if c.meta.C and c.meta.C.agg.max >= 5 -%} -{%- set prio = " ‼️ HIGH" -%} -{%- elif c.meta.C and c.meta.C.agg.max >= 3 -%} -{%- set prio = " ❗️ Medium" -%} -{%- elif c.meta.C and c.meta.C.agg.max < 3 -%} -{%- set prio = " Low" -%} -{%- else -%} -{%- set prio = "" -%} -{%- endif -%} - -{%- set audit = "" -%} -{# -{%- if c.meta.D and c.meta.D.D1 -%} -{%- set audit = "✅ audited " -%} -{%- elif c.meta.D and c.meta.D.D2 -%} -{%- set audit = "✅ trivial " -%} -{%- elif c.meta.D and c.meta.D.D3 -%} -{%- set audit = "✅ trivial " -%} -{%- elif c.meta.D and c.meta.D.D5 -%} -{%- set audit = "⏳ pending non-critical audit " -%} -{%- else -%} -{%- set audit = "" -%} -{%- endif -%} -#} -{%- if c.html_url is containing("polkadot") -%} -{%- set repo = dot -%} -{%- elif c.html_url is containing("cumulus") -%} -{%- set repo = cml -%} -{%- elif c.html_url is containing("substrate") -%} -{%- set repo = sub -%} -{%- else -%} -{%- set repo = " " -%} -{%- endif -%} -{# #} -{%- if c.meta.T and c.meta.T.T6 -%} -{%- set xcm = " [✉️ XCM]" -%} -{%- else -%} -{%- set xcm = "" -%} -{%- endif -%} -{{- repo }} {{ audit }}[`#{{c.number}}`]({{c.html_url}}) {{- prio }} - {{ c.title | capitalize | truncate(length=60, end="…") }}{{xcm }} -{%- endmacro change %} diff --git a/cumulus/scripts/ci/changelog/templates/changes.md.tera b/cumulus/scripts/ci/changelog/templates/changes.md.tera deleted file mode 100644 index f1704546b0a7..000000000000 --- a/cumulus/scripts/ci/changelog/templates/changes.md.tera +++ /dev/null @@ -1,21 +0,0 @@ -{# This include generates the section showing the changes #} -## Changes - -### Legend - -- {{ CML }} Cumulus -- {{ DOT }} Polkadot -- {{ SUB }} Substrate - -{% if env.RELEASE_TYPE and env.RELEASE_TYPE == "client" %} -{% include "changes_client.md.tera" %} -{% else %} -{% include "migrations-runtime.md.tera" -%} - -{% include "changes_runtime.md.tera" %} - -{% endif %} - -{% include "changes_api.md.tera" %} - -{% include "changes_misc.md.tera" %} diff --git a/cumulus/scripts/ci/changelog/templates/changes_api.md.tera b/cumulus/scripts/ci/changelog/templates/changes_api.md.tera deleted file mode 100644 index 2379c178c031..000000000000 --- a/cumulus/scripts/ci/changelog/templates/changes_api.md.tera +++ /dev/null @@ -1,19 +0,0 @@ -{%- import "change.md.tera" as m_c -%} - -### API - -{#- The changes are sorted by merge date -#} -{% for pr in changes | sort(attribute="merged_at") -%} - -{%- if pr.meta.B -%} -{%- if pr.meta.B.B0 -%} -{#- We skip silent ones -#} -{%- else -%} - -{%- if pr.meta.B.B1 and pr.meta.T.T2 and not pr.title is containing("ompanion") %} -- {{ m_c::change(c=pr) }} -{%- endif -%} -{%- endif -%} - -{%- endif -%} -{%- endfor %} diff --git a/cumulus/scripts/ci/changelog/templates/changes_client.md.tera b/cumulus/scripts/ci/changelog/templates/changes_client.md.tera deleted file mode 100644 index 05a521d6870b..000000000000 --- a/cumulus/scripts/ci/changelog/templates/changes_client.md.tera +++ /dev/null @@ -1,17 +0,0 @@ -{% import "change.md.tera" as m_c -%} -### Client - -{#- The changes are sorted by merge date #} -{%- for pr in changes | sort(attribute="merged_at") %} - -{%- if pr.meta.B %} - {%- if pr.meta.B.B0 %} - {#- We skip silent ones -#} - {%- else -%} - - {%- if pr.meta.B.B1 and pr.meta.T and pr.meta.T.T0 and not pr.title is containing("ompanion") %} -- {{ m_c::change(c=pr) }} - {%- endif -%} - {% endif -%} - {% endif -%} -{% endfor %} diff --git a/cumulus/scripts/ci/changelog/templates/changes_misc.md.tera b/cumulus/scripts/ci/changelog/templates/changes_misc.md.tera deleted file mode 100644 index b36595bc5d6a..000000000000 --- a/cumulus/scripts/ci/changelog/templates/changes_misc.md.tera +++ /dev/null @@ -1,39 +0,0 @@ -{%- import "change.md.tera" as m_c -%} - -{%- set_global misc_count = 0 -%} -{#- First pass to count #} -{%- for pr in changes -%} - {%- if pr.meta.B %} - {%- if pr.meta.B.B0 -%} - {#- We skip silent ones -#} - {%- else -%} - {%- if pr.meta.T and pr.meta.T.agg.max > 2 %} -{%- set_global misc_count = misc_count + 1 -%} - {%- endif -%} - {% endif -%} - {% endif -%} -{% endfor %} - -### Misc - -{% if misc_count > 10 %} -There are other misc. changes. You can expand the list below to view them all. -
Other misc. changes -{% endif -%} - -{#- The changes are sorted by merge date #} -{%- for pr in changes | sort(attribute="merged_at") %} - {%- if pr.meta.B and not pr.title is containing("ompanion") %} - {%- if pr.meta.B.B0 %} - {#- We skip silent ones -#} - {%- else -%} - {%- if pr.meta.T and pr.meta.T.agg.max > 2 %} -- {{ m_c::change(c=pr) }} - {%- endif -%} - {% endif -%} - {% endif -%} -{% endfor %} - -{% if misc_count > 10 %} -
-{% endif -%} diff --git a/cumulus/scripts/ci/changelog/templates/changes_runtime.md.tera b/cumulus/scripts/ci/changelog/templates/changes_runtime.md.tera deleted file mode 100644 index 39c272637655..000000000000 --- a/cumulus/scripts/ci/changelog/templates/changes_runtime.md.tera +++ /dev/null @@ -1,19 +0,0 @@ -{%- import "change.md.tera" as m_c -%} - -### Runtime - -{#- The changes are sorted by merge date -#} -{% for pr in changes | sort(attribute="merged_at") -%} - -{%- if pr.meta.B -%} -{%- if pr.meta.B.B0 -%} -{#- We skip silent ones -#} -{%- else -%} - -{%- if pr.meta.B.B1 and pr.meta.T.T1 and not pr.title is containing("ompanion") %} -- {{ m_c::change(c=pr) }} -{%- endif -%} -{%- endif -%} - -{%- endif -%} -{%- endfor %} diff --git a/cumulus/scripts/ci/changelog/templates/compiler.md.tera b/cumulus/scripts/ci/changelog/templates/compiler.md.tera deleted file mode 100644 index 0420a88c3965..000000000000 --- a/cumulus/scripts/ci/changelog/templates/compiler.md.tera +++ /dev/null @@ -1,6 +0,0 @@ -## Rust compiler versions - -This release was tested against the following versions of `rustc`. Other versions may work. - -- Rust Stable: `{{ env.RUSTC_STABLE }}` -- Rust Nightly: `{{ env.RUSTC_NIGHTLY }}` diff --git a/cumulus/scripts/ci/changelog/templates/debug.md.tera b/cumulus/scripts/ci/changelog/templates/debug.md.tera deleted file mode 100644 index 4f0b14c00f12..000000000000 --- a/cumulus/scripts/ci/changelog/templates/debug.md.tera +++ /dev/null @@ -1,9 +0,0 @@ -{%- set to_ignore = changes | filter(attribute="meta.B.B0") %} - diff --git a/cumulus/scripts/ci/changelog/templates/docker_image.md.tera b/cumulus/scripts/ci/changelog/templates/docker_image.md.tera deleted file mode 100644 index cb0c619f3a70..000000000000 --- a/cumulus/scripts/ci/changelog/templates/docker_image.md.tera +++ /dev/null @@ -1,11 +0,0 @@ - -## Docker images - -The docker image for this release can be found in [Docker hub](https://hub.docker.com/r/parity/polkadot-parachain/tags?page=1&ordering=last_updated). -(It will be available a few minutes after the release has been published). - -You may also pull it with: - -``` -docker pull parity/polkadot-parachain:latest -``` diff --git a/cumulus/scripts/ci/changelog/templates/global_priority.md.tera b/cumulus/scripts/ci/changelog/templates/global_priority.md.tera deleted file mode 100644 index 3d8a507ed1fe..000000000000 --- a/cumulus/scripts/ci/changelog/templates/global_priority.md.tera +++ /dev/null @@ -1,35 +0,0 @@ -{%- import "high_priority.md.tera" as m_p -%} -## Global Priority - -{%- set cumulus_prio = 0 -%} -{%- set polkadot_prio = 0 -%} -{%- set substrate_prio = 0 -%} - -{# We fetch the various priorities #} -{%- if cumulus.meta.C -%} - {%- set cumulus_prio = cumulus.meta.C.max -%} -{%- endif -%} -{%- if polkadot.meta.C -%} - {%- set polkadot_prio = polkadot.meta.C.max -%} -{%- endif -%} -{%- if substrate.meta.C -%} - {%- set substrate_prio = substrate.meta.C.max -%} -{%- endif -%} - -{# We compute the global priority #} -{%- set global_prio = cumulus_prio -%} -{%- if polkadot_prio > global_prio -%} - {% set global_prio = polkadot_prio -%} -{%- endif -%} -{%- if substrate_prio > global_prio -%} - {%- set global_prio = substrate_prio -%} -{%- endif %} - - - -{# We show the result #} -{{ m_p::high_priority(p=global_prio, changes=changes) }} diff --git a/cumulus/scripts/ci/changelog/templates/high_priority.md.tera b/cumulus/scripts/ci/changelog/templates/high_priority.md.tera deleted file mode 100644 index 21e331892b8f..000000000000 --- a/cumulus/scripts/ci/changelog/templates/high_priority.md.tera +++ /dev/null @@ -1,56 +0,0 @@ -{%- import "change.md.tera" as m_c -%} - -{# This macro convert a priority level into readable output #} -{%- macro high_priority(p, changes) -%} - -{# real globals don't work so we count the number of host functions here as well #} -{# unfortunately, the next snippet is duplicated in the host_functions.md.tera template #} -{# as well #} -{%- set_global host_fn_count = 0 -%} - -{# We loop first to count the number of host functions but we do not display anything yet #} -{%- for pr in changes -%} -{%- if pr.meta.B and pr.meta.B.B0 -%} -{#- We skip silent ones -#} -{%- else -%} - {%- if pr.meta.E and pr.meta.E.E4 -%} - {%- set_global host_fn_count = host_fn_count + 1 -%} - {%- endif -%} -{%- endif -%} -{%- endfor -%} - -{%- if p >= 5 or host_fn_count > 0 -%} - {%- set prio = "‼️ HIGH" -%} - {%- set text = "This is a **high priority** release and you must upgrade as as soon as possible." -%} -{%- elif p >= 3 -%} - {%- set prio = "❗️ Medium" -%} - {%- set text = "This is a medium priority release and you should upgrade in a timely manner." -%} -{%- else -%} - {%- set prio = "Low" -%} - {%- set text = "This is a low priority release and you may upgrade at your convenience." -%} -{%- endif -%} - - -{% if prio -%} -{{prio}}: {{text}} -{%- else -%} - -{%- endif %} - -{# We only show details if Medium or High #} -{%- if p >= 5 -%} -The changes motivating this priority level are: -{% for pr in changes | sort(attribute="merged_at") -%} - {%- if pr.meta.C -%} - {%- if pr.meta.C.agg.max >= p %} -- {{ m_c::change(c=pr) }} -{%- if pr.meta.B and pr.meta.B.B1 and pr.meta.T and pr.meta.T.T1 %} -(RUNTIME) -{% endif %} - - {%- endif -%} - {%- endif -%} -{%- endfor %} -{%- endif %} - -{%- endmacro priority -%} diff --git a/cumulus/scripts/ci/changelog/templates/host_functions.md.tera b/cumulus/scripts/ci/changelog/templates/host_functions.md.tera deleted file mode 100644 index 2a9b26e8090c..000000000000 --- a/cumulus/scripts/ci/changelog/templates/host_functions.md.tera +++ /dev/null @@ -1,38 +0,0 @@ -{%- import "change.md.tera" as m_c -%} - -{%- set_global host_fn_count = 0 -%} - -{# We loop first to count the number of host functions but we do not display anything yet #} -{%- for pr in changes -%} -{%- if pr.meta.B and pr.meta.B.B0 -%} -{#- We skip silent ones -#} -{%- else -%} - {%- if pr.meta.E and pr.meta.E.E4 -%} - {%- set_global host_fn_count = host_fn_count + 1 -%} - {% endif -%} -{%- endif -%} -{%- endfor -%} - - - -{% if host_fn_count == 0 -%} - -{%- else -%} -## Host functions - -⚠️ The runtimes in this release contain {{ host_fn_count }} new **host function{{ host_fn_count | pluralize }}**. - -⚠️ It is critical that you update your client before the chain switches to the new runtimes. - -{% for pr in changes | sort(attribute="merged_at") -%} - -{%- if pr.meta.B and pr.meta.B.B0 -%} -{#- We skip silent ones -#} -{%- else -%} - {%- if pr.meta.E and pr.meta.E.E4 -%} - - {{ m_c::change(c=pr) }} - {% endif -%} - {% endif -%} -{%- endfor -%} - -{%- endif %} diff --git a/cumulus/scripts/ci/changelog/templates/migrations-db.md.tera b/cumulus/scripts/ci/changelog/templates/migrations-db.md.tera deleted file mode 100644 index e840d991d9a8..000000000000 --- a/cumulus/scripts/ci/changelog/templates/migrations-db.md.tera +++ /dev/null @@ -1,26 +0,0 @@ -{%- import "change.md.tera" as m_c %} -{%- set_global db_migration_count = 0 -%} - -## Database Migrations - -{% for pr in changes | sort(attribute="merged_at") -%} - -{%- if pr.meta.B and pr.meta.B.B0 %} -{#- We skip silent ones -#} -{%- else -%} -{%- if pr.meta.E and pr.meta.E.E2 -%} -{%- set_global db_migration_count = db_migration_count + 1 -%} -- {{ m_c::change(c=pr) }} -{% endif -%} -{% endif -%} -{% endfor -%} - -{%- if db_migration_count == 0 -%} -No Database migration detected in this release. -{% else %} - -There is {{ db_migration_count }} database migration(s) in this release. - -Database migrations are operations bringing your database to the latest stand. -Some migrations may break compatibility and making a backup of your database is highly recommended. -{%- endif %} diff --git a/cumulus/scripts/ci/changelog/templates/migrations-runtime.md.tera b/cumulus/scripts/ci/changelog/templates/migrations-runtime.md.tera deleted file mode 100644 index f02499a84d74..000000000000 --- a/cumulus/scripts/ci/changelog/templates/migrations-runtime.md.tera +++ /dev/null @@ -1,14 +0,0 @@ -{%- import "change.md.tera" as m_c %} - -## Runtime Migrations - -{% for pr in changes | sort(attribute="merged_at") -%} - -{%- if pr.meta.B and pr.meta.B.B0 %} -{#- We skip silent ones -#} -{%- else -%} -{%- if pr.meta.E and pr.meta.E.E1 -%} -- {{ m_c::change(c=pr) }} -{% endif -%} -{% endif -%} -{% endfor -%} diff --git a/cumulus/scripts/ci/changelog/templates/pre_release.md.tera b/cumulus/scripts/ci/changelog/templates/pre_release.md.tera deleted file mode 100644 index 53a0e9065412..000000000000 --- a/cumulus/scripts/ci/changelog/templates/pre_release.md.tera +++ /dev/null @@ -1,11 +0,0 @@ -{%- if env.PRE_RELEASE == "true" -%} -
⚠️ This is a pre-release - -**Release candidates** are **pre-releases** may not be final. -Although they are reasonably tested, there may be additional changes or issues -before an official release is tagged. Use at your own discretion, and consider -only using published releases on critical production infrastructure. -
-{% else -%} - -{%- endif %} diff --git a/cumulus/scripts/ci/changelog/templates/runtime.md.tera b/cumulus/scripts/ci/changelog/templates/runtime.md.tera deleted file mode 100644 index d20702458385..000000000000 --- a/cumulus/scripts/ci/changelog/templates/runtime.md.tera +++ /dev/null @@ -1,28 +0,0 @@ -{# This macro shows one runtime #} -{%- macro runtime(runtime) -%} - -### {{ runtime.name | replace(from="-", to=" ") | title }} {%- if runtime.note -%} {{ runtime.note }} {%- endif -%} - -{%- if runtime.data.runtimes.compressed.subwasm.compression.compressed %} -{%- set compressed = "Yes" %} -{%- else %} -{%- set compressed = "No" %} -{%- endif %} - -{%- set comp_ratio = 100 - (runtime.data.runtimes.compressed.subwasm.compression.size_compressed / runtime.data.runtimes.compressed.subwasm.compression.size_decompressed *100) %} - - - - - - - -``` -🏋️ Runtime Size: {{ runtime.data.runtimes.compressed.subwasm.size | filesizeformat }} ({{ runtime.data.runtimes.compressed.subwasm.size }} bytes) -🔥 Core Version: {{ runtime.data.runtimes.compressed.subwasm.core_version.specName }}-{{ runtime.data.runtimes.compressed.subwasm.core_version.specVersion }} ({{ runtime.data.runtimes.compressed.subwasm.core_version.implName }}-{{ runtime.data.runtimes.compressed.subwasm.core_version.implVersion }}.tx{{ runtime.data.runtimes.compressed.subwasm.core_version.transactionVersion }}.au{{ runtime.data.runtimes.compressed.subwasm.core_version.authoringVersion }}) -🗜 Compressed: {{ compressed }}: {{ comp_ratio | round(method="ceil", precision=2) }}% -🎁 Metadata version: V{{ runtime.data.runtimes.compressed.subwasm.metadata_version }} -🗳️ Blake2-256 hash: {{ runtime.data.runtimes.compressed.subwasm.blake2_256 }} -📦 IPFS: {{ runtime.data.runtimes.compressed.subwasm.ipfs_hash }} -``` -{%- endmacro runtime %} diff --git a/cumulus/scripts/ci/changelog/templates/runtimes.md.tera b/cumulus/scripts/ci/changelog/templates/runtimes.md.tera deleted file mode 100644 index fe2e16aa9c28..000000000000 --- a/cumulus/scripts/ci/changelog/templates/runtimes.md.tera +++ /dev/null @@ -1,17 +0,0 @@ -{# This include shows the list and details of the runtimes #} -{%- import "runtime.md.tera" as m_r -%} - -## Runtimes - -{% set rtm = srtool[0] -%} - -The information about the runtimes included in this release can be found below. -The runtimes have been built using [{{ rtm.data.gen }}](https://github.com/paritytech/srtool) and `{{ rtm.data.rustc }}`. - -{%- for runtime in srtool | sort(attribute="order") %} -{%- set HIDE_VAR = "HIDE_SRTOOL_" ~ runtime.name | upper %} -{%- if not env is containing(HIDE_VAR) %} - -{{ m_r::runtime(runtime=runtime) }} -{%- endif %} -{%- endfor %} diff --git a/cumulus/scripts/ci/changelog/templates/template.md.tera b/cumulus/scripts/ci/changelog/templates/template.md.tera deleted file mode 100644 index 8b14db43fe28..000000000000 --- a/cumulus/scripts/ci/changelog/templates/template.md.tera +++ /dev/null @@ -1,38 +0,0 @@ -{# This is the entry point of the template for the parachains-* releases-#} - -{% include "pre_release.md.tera" -%} - -{% if env.PRE_RELEASE == "true" -%} -This pre-release contains the changes from `{{ env.REF1 }}` to `{{ env.REF2 }}`. -{% else -%} -This release contains the changes from `{{ env.REF1 }}` to `{{ env.REF2 }}`. -{% endif -%} - -{%- set changes = cumulus.changes | concat(with=substrate.changes) -%} -{%- set changes = changes | concat(with=polkadot.changes) -%} -{%- include "debug.md.tera" -%} - -{%- set CML = "[C]" -%} -{%- set DOT = "[P]" -%} -{%- set SUB = "[S]" -%} - -{# We check for host function first because no matter what the priority is, #} -{# we will force it to HIGH if at least one host function was detected. #} - -{% include "host_functions.md.tera" -%} - -{% if env.RELEASE_TYPE and env.RELEASE_TYPE == "client" -%} -{% include "global_priority.md.tera" -%} -{% include "compiler.md.tera" -%} -{% include "migrations-db.md.tera" %} - -{% else %} -{% include "migrations-runtime.md.tera" %} -{% include "runtimes.md.tera" -%} -{% endif %} - -{% include "changes.md.tera" -%} - -{% if env.RELEASE_TYPE and env.RELEASE_TYPE == "client" -%} -{% include "docker_image.md.tera" -%} -{% endif %} diff --git a/cumulus/scripts/ci/changelog/test/test_basic.rb b/cumulus/scripts/ci/changelog/test/test_basic.rb deleted file mode 100755 index d099fadca433..000000000000 --- a/cumulus/scripts/ci/changelog/test/test_basic.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -require_relative '../lib/changelog' -require 'test/unit' - -class TestChangelog < Test::Unit::TestCase - def test_get_dep_ref_polkadot - c = SubRef.new('paritytech/polkadot') - ref = '13c2695' - package = 'sc-cli' - result = c.get_dependency_reference(ref, package) - assert_equal('7db0768a85dc36a3f2a44d042b32f3715c00a90d', result) - end - - def test_get_dep_ref_invalid_ref - c = SubRef.new('paritytech/polkadot') - ref = '9999999' - package = 'sc-cli' - assert_raise do - c.get_dependency_reference(ref, package) - end - end -end diff --git a/cumulus/scripts/ci/common/lib.sh b/cumulus/scripts/ci/common/lib.sh deleted file mode 100644 index 93e0392b3e29..000000000000 --- a/cumulus/scripts/ci/common/lib.sh +++ /dev/null @@ -1,141 +0,0 @@ -#!/bin/sh - -api_base="https://api.github.com/repos" - -# Function to take 2 git tags/commits and get any lines from commit messages -# that contain something that looks like a PR reference: e.g., (#1234) -sanitised_git_logs(){ - git --no-pager log --pretty=format:"%s" "$1...$2" | - # Only find messages referencing a PR - grep -E '\(#[0-9]+\)' | - # Strip any asterisks - sed 's/^* //g' -} - -# Checks whether a tag on github has been verified -# repo: 'organization/repo' -# tagver: 'v1.2.3' -# Usage: check_tag $repo $tagver -check_tag () { - repo=$1 - tagver=$2 - if [ -n "$GITHUB_RELEASE_TOKEN" ]; then - echo '[+] Fetching tag using privileged token' - tag_out=$(curl -H "Authorization: token $GITHUB_RELEASE_TOKEN" -s "$api_base/$repo/git/refs/tags/$tagver") - else - echo '[+] Fetching tag using unprivileged token' - tag_out=$(curl -H "Authorization: token $GITHUB_PR_TOKEN" -s "$api_base/$repo/git/refs/tags/$tagver") - fi - tag_sha=$(echo "$tag_out" | jq -r .object.sha) - object_url=$(echo "$tag_out" | jq -r .object.url) - if [ "$tag_sha" = "null" ]; then - return 2 - fi - echo "[+] Tag object SHA: $tag_sha" - verified_str=$(curl -H "Authorization: token $GITHUB_RELEASE_TOKEN" -s "$object_url" | jq -r .verification.verified) - if [ "$verified_str" = "true" ]; then - # Verified, everything is good - return 0 - else - # Not verified. Bad juju. - return 1 - fi -} - -# Checks whether a given PR has a given label. -# repo: 'organization/repo' -# pr_id: 12345 -# label: B1-silent -# Usage: has_label $repo $pr_id $label -has_label(){ - repo="$1" - pr_id="$2" - label="$3" - - # These will exist if the function is called in Gitlab. - # If the function's called in Github, we should have GITHUB_ACCESS_TOKEN set - # already. - if [ -n "$GITHUB_RELEASE_TOKEN" ]; then - GITHUB_TOKEN="$GITHUB_RELEASE_TOKEN" - elif [ -n "$GITHUB_PR_TOKEN" ]; then - GITHUB_TOKEN="$GITHUB_PR_TOKEN" - fi - - out=$(curl -H "Authorization: token $GITHUB_TOKEN" -s "$api_base/$repo/pulls/$pr_id") - [ -n "$(echo "$out" | tr -d '\r\n' | jq ".labels | .[] | select(.name==\"$label\")")" ] -} - -github_label () { - echo - echo "# run github-api job for labeling it ${1}" - curl -sS -X POST \ - -F "token=${CI_JOB_TOKEN}" \ - -F "ref=master" \ - -F "variables[LABEL]=${1}" \ - -F "variables[PRNO]=${CI_COMMIT_REF_NAME}" \ - -F "variables[PROJECT]=paritytech/polkadot" \ - "${GITLAB_API}/projects/${GITHUB_API_PROJECT}/trigger/pipeline" -} - -# Formats a message into a JSON string for posting to Matrix -# message: 'any plaintext message' -# formatted_message: 'optional message formatted in html' -# Usage: structure_message $content $formatted_content (optional) -structure_message() { - if [ -z "$2" ]; then - body=$(jq -Rs --arg body "$1" '{"msgtype": "m.text", $body}' < /dev/null) - else - body=$(jq -Rs --arg body "$1" --arg formatted_body "$2" '{"msgtype": "m.text", $body, "format": "org.matrix.custom.html", $formatted_body}' < /dev/null) - fi - echo "$body" -} - -# Post a message to a matrix room -# body: '{body: "JSON string produced by structure_message"}' -# room_id: !fsfSRjgjBWEWffws:matrix.parity.io -# access_token: see https://matrix.org/docs/guides/client-server-api/ -# Usage: send_message $body (json formatted) $room_id $access_token -send_message() { -curl -XPOST -d "$1" "https://matrix.parity.io/_matrix/client/r0/rooms/$2/send/m.room.message?access_token=$3" -} - -# Pretty-printing functions -boldprint () { printf "|\n| \033[1m%s\033[0m\n|\n" "${@}"; } -boldcat () { printf "|\n"; while read -r l; do printf "| \033[1m%s\033[0m\n" "${l}"; done; printf "|\n" ; } - -skip_if_companion_pr() { - url="https://api.github.com/repos/paritytech/polkadot/pulls/${CI_COMMIT_REF_NAME}" - echo "[+] API URL: $url" - - pr_title=$(curl -sSL -H "Authorization: token ${GITHUB_PR_TOKEN}" "$url" | jq -r .title) - echo "[+] PR title: $pr_title" - - if echo "$pr_title" | grep -qi '^companion'; then - echo "[!] PR is a companion PR. Build is already done in substrate" - exit 0 - else - echo "[+] PR is not a companion PR. Proceeding test" - fi -} - -# Fetches the tag name of the latest release from a repository -# repo: 'organisation/repo' -# Usage: latest_release 'paritytech/polkadot' -latest_release() { - curl -s "$api_base/$1/releases/latest" | jq -r '.tag_name' -} - -# Check for runtime changes between two commits. This is defined as any changes -# to /primitives/src/* and any *production* chains under /runtime -has_runtime_changes() { - from=$1 - to=$2 - - if git diff --name-only "${from}...${to}" \ - | grep -q -e '^runtime/polkadot' -e '^runtime/kusama' -e '^primitives/src/' -e '^runtime/common' - then - return 0 - else - return 1 - fi -} diff --git a/cumulus/scripts/ci/create-benchmark-pr.sh b/cumulus/scripts/ci/create-benchmark-pr.sh deleted file mode 100755 index 46927f24b808..000000000000 --- a/cumulus/scripts/ci/create-benchmark-pr.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash - -set -Eeu -o pipefail -shopt -s inherit_errexit - -PR_TITLE="$1" -HEAD_REF="$2" - -ORG="paritytech" -REPO="$CI_PROJECT_NAME" -BASE_REF="$CI_COMMIT_BRANCH" -# Change threshold in %. Bigger values excludes the small changes. -THRESHOLD=${THRESHOLD:-30} - -WEIGHTS_COMPARISON_URL_PARTS=( - "https://weights.tasty.limo/compare?" - "repo=$REPO&" - "threshold=$THRESHOLD&" - "path_pattern=**%2Fweights%2F*.rs&" - "method=guess-worst&" - "ignore_errors=true&" - "unit=time&" - "old=$BASE_REF&" - "new=$HEAD_REF" -) -printf -v WEIGHTS_COMPARISON_URL %s "${WEIGHTS_COMPARISON_URL_PARTS[@]}" - -PAYLOAD="$(jq -n \ - --arg title "$PR_TITLE" \ - --arg body " -This PR is generated automatically by CI. - -Compare the weights with \`$BASE_REF\`: $WEIGHTS_COMPARISON_URL - -- [ ] Backport to master and node release branch once merged -" \ - --arg base "$BASE_REF" \ - --arg head "$HEAD_REF" \ - '{ - title: $title, - body: $body, - head: $head, - base: $base - }' -)" - -echo "PAYLOAD: $PAYLOAD" - -curl \ - -H "Authorization: token $GITHUB_TOKEN" \ - -X POST \ - -d "$PAYLOAD" \ - "https://api.github.com/repos/$ORG/$REPO/pulls" diff --git a/cumulus/scripts/ci/github/check-rel-br b/cumulus/scripts/ci/github/check-rel-br deleted file mode 100755 index 1b49ae621722..000000000000 --- a/cumulus/scripts/ci/github/check-rel-br +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env bash - -# This script helps running sanity checks on a release branch -# It is intended to be ran from the repo and from the release branch - -# NOTE: The diener runs do take time and are not really required because -# if we missed the diener runs, the Cargo.lock that we check won't pass -# the tests. See https://github.com/bkchr/diener/issues/17 - -grv=$(git remote --verbose | grep push) -export RUST_LOG=none -REPO=$(echo "$grv" | cut -d ' ' -f1 | cut -d$'\t' -f2 | sed 's/.*github.com\/\(.*\)/\1/g' | cut -d '/' -f2 | cut -d '.' -f1 | sort | uniq) -echo "[+] Detected repo: $REPO" - -BRANCH=$(git branch --show-current) -if ! [[ "$BRANCH" =~ ^release.*$ || "$BRANCH" =~ ^polkadot.*$ ]]; then - echo "This script is meant to run only on a RELEASE branch." - echo "Try one of the following branch:" - git branch -r --format "%(refname:short)" --sort=-committerdate | grep -Ei '/?release' | head - exit 1 -fi -echo "[+] Working on $BRANCH" - -# Tried to get the version of the release from the branch -# input: release-foo-v0.9.22 or release-bar-v9220 or release-foo-v0.9.220 -# output: 0.9.22 -get_version() { - branch=$1 - [[ $branch =~ -v(.*) ]] - version=${BASH_REMATCH[1]} - if [[ $version =~ \. ]]; then - MAJOR=$(($(echo $version | cut -d '.' -f1))) - MINOR=$(($(echo $version | cut -d '.' -f2))) - PATCH=$(($(echo $version | cut -d '.' -f3))) - echo $MAJOR.$MINOR.${PATCH:0:2} - else - MAJOR=$(echo $(($version / 100000))) - remainer=$(($version - $MAJOR * 100000)) - MINOR=$(echo $(($remainer / 1000))) - remainer=$(($remainer - $MINOR * 1000)) - PATCH=$(echo $(($remainer / 10))) - echo $MAJOR.$MINOR.$PATCH - fi -} - -# return the name of the release branch for a given repo and version -get_release_branch() { - repo=$1 - version=$2 - case $repo in - polkadot) - echo "release-v$version" - ;; - - substrate) - echo "polkadot-v$version" - ;; - - *) - echo "Repo $repo is not supported, exiting" - exit 1 - ;; - esac -} - -# repo = substrate / polkadot -check_release_branch_repo() { - repo=$1 - branch=$2 - - echo "[+] Checking deps for $repo=$branch" - - POSTIVE=$(cat Cargo.lock | grep "$repo?branch=$branch" | sort | uniq | wc -l) - NEGATIVE=$(cat Cargo.lock | grep "$repo?branch=" | grep -v $branch | sort | uniq | wc -l) - - if [[ $POSTIVE -eq 1 && $NEGATIVE -eq 0 ]]; then - echo -e "[+] ✅ Looking good" - cat Cargo.lock | grep "$repo?branch=" | sort | uniq | sed 's/^/\t - /' - return 0 - else - echo -e "[+] ❌ Something seems to be wrong, we want 1 unique match and 0 non match (1, 0) and we got ($(($POSTIVE)), $(($NEGATIVE)))" - cat Cargo.lock | grep "$repo?branch=" | sort | uniq | sed 's/^/\t - /' - return 1 - fi -} - -# Check a release branch -check_release_branches() { - SUBSTRATE_BRANCH=$1 - POLKADOT_BRANCH=$2 - - check_release_branch_repo substrate $SUBSTRATE_BRANCH - ret_a1=$? - - ret_b1=0 - if [ $POLKADOT_BRANCH ]; then - check_release_branch_repo polkadot $POLKADOT_BRANCH - ret_b1=$? - fi - - STATUS=$(($ret_a1 + $ret_b1)) - - return $STATUS -} - -VERSION=$(get_version $BRANCH) -echo "[+] Target version: v$VERSION" - -case $REPO in - polkadot) - substrate=$(get_release_branch substrate $VERSION) - - check_release_branches $substrate - ;; - - cumulus) - polkadot=$(get_release_branch polkadot $VERSION) - substrate=$(get_release_branch substrate $VERSION) - - check_release_branches $substrate $polkadot - ;; - - *) - echo "REPO $REPO is not supported, exiting" - exit 1 - ;; -esac diff --git a/cumulus/scripts/ci/github/check_labels.sh b/cumulus/scripts/ci/github/check_labels.sh deleted file mode 100755 index 102b1a4b0666..000000000000 --- a/cumulus/scripts/ci/github/check_labels.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env bash - -#shellcheck source=../common/lib.sh -source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )/../common/lib.sh" - -repo="$GITHUB_REPOSITORY" -pr="$GITHUB_PR" - -ensure_labels() { - for label in "$@"; do - if has_label "$repo" "$pr" "$label"; then - return 0 - fi - done - return 1 -} - -# Must have one of the following labels -releasenotes_labels=( - 'B0-silent' - 'B1-note_worthy' -) - -# Must be an ordered list of priorities, lowest first -priority_labels=( - 'C1-low' - 'C3-medium' - 'C5-high' - 'C7-critical' -) - -audit_labels=( - 'D1-audited 👍' - 'D2-notlive 💤' - 'D3-trivial 🧸' - 'D5-nicetohaveaudit ⚠️' - 'D9-needsaudit 👮' -) - -x_labels=( - 'X0-node' - 'X1-runtime' - 'X2-API' - 'X9-misc' -) - -echo "[+] Checking release notes (B) labels for $CI_COMMIT_BRANCH" -if ensure_labels "${releasenotes_labels[@]}"; then - echo "[+] Release notes label detected. All is well." -else - echo "[!] Release notes label not detected. Please add one of: ${releasenotes_labels[*]}" - exit 1 -fi - -if has_label "$repo" "$pr" 'B1-note_worthy'; then - echo "[+] B1-note_worthy is chosen. Checking that there X-labels for $CI_COMMIT_BRANCH" - if ensure_labels "${x_labels[@]}"; then - echo "[+] X-label detected. All is well." - else - echo "[!] X-label not detected. Please add one of: ${x_labels[*]}" - exit 1 - fi -fi - -echo "[+] Checking release priority (C) labels for $CI_COMMIT_BRANCH" -if ensure_labels "${priority_labels[@]}"; then - echo "[+] Release priority label detected. All is well." -else - echo "[!] Release priority label not detected. Please add one of: ${priority_labels[*]}" - exit 1 -fi - -if has_runtime_changes "${BASE_SHA}" "${HEAD_SHA}"; then - echo "[+] Runtime changes detected. Checking audit (D) labels" - if ensure_labels "${audit_labels[@]}"; then - echo "[+] Release audit label detected. All is well." - else - echo "[!] Release audit label not detected. Please add one of: ${audit_labels[*]}" - exit 1 - fi -fi - -# If the priority is anything other than the lowest, we *must not* have a B0-silent -# label -if has_label "$repo" "$GITHUB_PR" 'B0-silent' && - ! has_label "$repo" "$GITHUB_PR" "${priority_labels[0]}"; then - echo "[!] Changes with a priority higher than C1-low *MUST* have a B- label that is not B0-Silent" - exit 1 -fi - -exit 0 diff --git a/cumulus/scripts/ci/github/extrinsic-ordering-filter.sh b/cumulus/scripts/ci/github/extrinsic-ordering-filter.sh deleted file mode 100755 index 4fd3337f64a6..000000000000 --- a/cumulus/scripts/ci/github/extrinsic-ordering-filter.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -# This script is used in a Github Workflow. It helps filtering out what is interesting -# when comparing metadata and spot what would require a tx version bump. - -# shellcheck disable=SC2002,SC2086 - -FILE=$1 - -# Higlight indexes that were deleted -function find_deletions() { - echo "\n## Deletions\n" - RES=$(cat "$FILE" | grep -n '\[\-\]' | tr -s " ") - if [ "$RES" ]; then - echo "$RES" | awk '{ printf "%s\\n", $0 }' - else - echo "n/a" - fi -} - -# Highlight indexes that have been deleted -function find_index_changes() { - echo "\n## Index changes\n" - RES=$(cat "$FILE" | grep -E -n -i 'idx:\s*([0-9]+)\s*(->)\s*([0-9]+)' | tr -s " ") - if [ "$RES" ]; then - echo "$RES" | awk '{ printf "%s\\n", $0 }' - else - echo "n/a" - fi -} - -# Highlight values that decreased -function find_decreases() { - echo "\n## Decreases\n" - OUT=$(cat "$FILE" | grep -E -i -o '([0-9]+)\s*(->)\s*([0-9]+)' | awk '$1 > $3 { printf "%s;", $0 }') - IFS=$';' LIST=("$OUT") - unset RES - for line in "${LIST[@]}"; do - RES="$RES\n$(cat "$FILE" | grep -E -i -n \"$line\" | tr -s " ")" - done - - if [ "$RES" ]; then - echo "$RES" | awk '{ printf "%s\\n", $0 }' | sort -u -g | uniq - else - echo "n/a" - fi -} - -echo "\n------------------------------ SUMMARY -------------------------------" -echo "\n⚠️ This filter is here to help spotting changes that should be reviewed carefully." -echo "\n⚠️ It catches only index changes, deletions and value decreases". - -find_deletions "$FILE" -find_index_changes "$FILE" -find_decreases "$FILE" -echo "\n----------------------------------------------------------------------\n" diff --git a/cumulus/scripts/ci/github/runtime-version.rb b/cumulus/scripts/ci/github/runtime-version.rb deleted file mode 100644 index 14663acaf31a..000000000000 --- a/cumulus/scripts/ci/github/runtime-version.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -# Gets the runtime version for a given runtime from the filesystem. -# Optionally accepts a path that is the root of the project which defaults to -# the current working directory -def get_runtime(runtime: nil, path: '.', runtime_dir: 'runtime') - File.open(path + "/#{runtime_dir}/#{runtime}/src/lib.rs") do |f| - f.find { |l| l =~ /spec_version/ }.match(/[0-9]+/)[0] - end -end diff --git a/cumulus/scripts/ci/gitlab/pipeline/benchmarks.yml b/cumulus/scripts/ci/gitlab/pipeline/benchmarks.yml deleted file mode 100644 index 0cbc42aabae6..000000000000 --- a/cumulus/scripts/ci/gitlab/pipeline/benchmarks.yml +++ /dev/null @@ -1,84 +0,0 @@ -# This file is part of .gitlab-ci.yml -# Here are all jobs that are executed during "benchmarks" stage -# Work only on release-parachains-v* branches - -benchmarks-build: - stage: benchmarks-build - extends: - - .docker-env - - .collect-artifacts - - .benchmarks-manual-refs - script: - - time cargo build --profile production --locked --features runtime-benchmarks - - mkdir -p artifacts - - cp target/production/polkadot-parachain ./artifacts/ - -benchmarks-assets: - stage: benchmarks-run - timeout: 1d - extends: - - .docker-env - - .collect-artifacts - - .benchmarks-refs - before_script: - - !reference [.docker-env, before_script] - script: - - ./scripts/benchmarks-ci.sh assets asset-hub-kusama ./artifacts - - ./scripts/benchmarks-ci.sh assets asset-hub-polkadot ./artifacts - - ./scripts/benchmarks-ci.sh assets asset-hub-westend ./artifacts - - export CURRENT_TIME=$(date '+%s') - - export BRANCHNAME="weights-asset-hub-polkadot-${CI_COMMIT_BRANCH}-${CURRENT_TIME}" - - !reference [.git-commit-push, script] - - ./scripts/ci/create-benchmark-pr.sh "[benchmarks] Update weights for asset-hub-kusama/-polkadot" "$BRANCHNAME" - - rm -f ./artifacts/polkadot-parachain - - rm -f ./artifacts/test-parachain - after_script: - - rm -rf .git/config - tags: - - weights-vm - -benchmarks-collectives: - stage: benchmarks-run - timeout: 1d - extends: - - .docker-env - - .collect-artifacts - - .benchmarks-refs - before_script: - - !reference [.docker-env, before_script] - script: - - ./scripts/benchmarks-ci.sh collectives collectives-polkadot ./artifacts - - export CURRENT_TIME=$(date '+%s') - - export BRANCHNAME="weights-collectives-${CI_COMMIT_BRANCH}-${CURRENT_TIME}" - - !reference [.git-commit-push, script] - - ./scripts/ci/create-benchmark-pr.sh "[benchmarks] Update weights for collectives" "$BRANCHNAME" - - rm -f ./artifacts/polkadot-parachain - - rm -f ./artifacts/test-parachain - after_script: - - rm -rf .git/config - tags: - - weights-vm - -benchmarks-bridge-hubs: - stage: benchmarks-run - timeout: 1d - extends: - - .docker-env - - .collect-artifacts - - .benchmarks-refs - before_script: - - !reference [.docker-env, before_script] - script: - - ./scripts/benchmarks-ci.sh bridge-hubs bridge-hub-polkadot ./artifacts - - ./scripts/benchmarks-ci.sh bridge-hubs bridge-hub-kusama ./artifacts - - ./scripts/benchmarks-ci.sh bridge-hubs bridge-hub-rococo ./artifacts - - export CURRENT_TIME=$(date '+%s') - - export BRANCHNAME="weights-bridge-hubs-${CI_COMMIT_BRANCH}-${CURRENT_TIME}" - - !reference [.git-commit-push, script] - - ./scripts/ci/create-benchmark-pr.sh "[benchmarks] Update weights for bridge-hubs" "$BRANCHNAME" - - rm -f ./artifacts/polkadot-parachain - - rm -f ./artifacts/test-parachain - after_script: - - rm -rf .git/config - tags: - - weights-vm diff --git a/cumulus/scripts/ci/gitlab/pipeline/build.yml b/cumulus/scripts/ci/gitlab/pipeline/build.yml deleted file mode 100644 index b47dd9fe30df..000000000000 --- a/cumulus/scripts/ci/gitlab/pipeline/build.yml +++ /dev/null @@ -1,138 +0,0 @@ -# This file is part of .gitlab-ci.yml -# Here are all jobs that are executed during "build" stage - -build-linux-stable: - stage: build - extends: - - .docker-env - - .common-refs - - .collect-artifacts - variables: - # Enable debug assertions since we are running optimized builds for testing - # but still want to have debug assertions. - RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: check-rustdoc - artifacts: false - script: - - echo "___Building a binary, please refrain from using it in production since it goes with the debug assertions.___" - - time cargo build --release --locked --bin polkadot-parachain - - echo "___Packing the artifacts___" - - mkdir -p ./artifacts - - mv ./target/release/polkadot-parachain ./artifacts/. - - echo "___The VERSION is either a tag name or the curent branch if triggered not by a tag___" - - echo ${CI_COMMIT_REF_NAME} | tee ./artifacts/VERSION - -build-test-parachain: - stage: build - extends: - - .docker-env - - .common-refs - - .collect-artifacts - variables: - # Enable debug assertions since we are running optimized builds for testing - # but still want to have debug assertions. - RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: check-rustdoc - artifacts: false - script: - - echo "___Building a binary, please refrain from using it in production since it goes with the debug assertions.___" - - time cargo build --release --locked --bin test-parachain - - echo "___Packing the artifacts___" - - mkdir -p ./artifacts - - mv ./target/release/test-parachain ./artifacts/. - - mkdir -p ./artifacts/zombienet - - mv ./target/release/wbuild/cumulus-test-runtime/wasm_binary_spec_version_incremented.rs.compact.compressed.wasm ./artifacts/zombienet/. - -# build runtime only if files in $RUNTIME_PATH/$RUNTIME_NAME were changed -.build-runtime-template: &build-runtime-template - stage: build - extends: - - .docker-env - - .pr-refs - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: check-rustdoc - artifacts: false - variables: - RUNTIME_PATH: "parachains/runtimes/assets" - script: - - cd ${RUNTIME_PATH} - - for directory in $(echo */); do - echo "_____Running cargo check for ${directory} ______"; - cd ${directory}; - pwd; - SKIP_WASM_BUILD=1 cargo check --locked; - cd ..; - done - -# DAG: build-runtime-assets -> build-runtime-collectives -> build-runtime-bridge-hubs -# DAG: build-runtime-assets -> build-runtime-collectives -> build-runtime-contracts -# DAG: build-runtime-assets -> build-runtime-starters -> build-runtime-testing -build-runtime-assets: - <<: *build-runtime-template - variables: - RUNTIME_PATH: "parachains/runtimes/assets" - -build-runtime-collectives: - <<: *build-runtime-template - variables: - RUNTIME_PATH: "parachains/runtimes/collectives" - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: build-runtime-assets - artifacts: false - -build-runtime-bridge-hubs: - <<: *build-runtime-template - variables: - RUNTIME_PATH: "parachains/runtimes/bridge-hubs" - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: build-runtime-collectives - artifacts: false - -build-runtime-contracts: - <<: *build-runtime-template - variables: - RUNTIME_PATH: "parachains/runtimes/contracts" - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: build-runtime-collectives - artifacts: false - -build-runtime-starters: - <<: *build-runtime-template - variables: - RUNTIME_PATH: "parachains/runtimes/starters" - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: build-runtime-assets - artifacts: false - -build-runtime-testing: - <<: *build-runtime-template - variables: - RUNTIME_PATH: "parachains/runtimes/testing" - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: build-runtime-starters - artifacts: false - -build-short-benchmark: - stage: build - extends: - - .docker-env - - .common-refs - - .collect-artifacts - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: check-rustdoc - artifacts: false - script: - - cargo build --profile release --locked --features=runtime-benchmarks --bin polkadot-parachain - - mkdir -p ./artifacts - - cp ./target/release/polkadot-parachain ./artifacts/ diff --git a/cumulus/scripts/ci/gitlab/pipeline/integration_tests.yml b/cumulus/scripts/ci/gitlab/pipeline/integration_tests.yml deleted file mode 100644 index a884361aa7cd..000000000000 --- a/cumulus/scripts/ci/gitlab/pipeline/integration_tests.yml +++ /dev/null @@ -1,2 +0,0 @@ -# This file is part of .gitlab-ci.yml -# Here are all jobs that are executed during "integration_stage" stage diff --git a/cumulus/scripts/ci/gitlab/pipeline/publish.yml b/cumulus/scripts/ci/gitlab/pipeline/publish.yml deleted file mode 100644 index e59ff1676981..000000000000 --- a/cumulus/scripts/ci/gitlab/pipeline/publish.yml +++ /dev/null @@ -1,105 +0,0 @@ -# This file is part of .gitlab-ci.yml -# Here are all jobs that are executed during "publish" stage - -.build-push-image: - image: $BUILDAH_IMAGE - variables: - DOCKERFILE: "" # docker/path-to.Dockerfile - IMAGE_NAME: "" # docker.io/paritypr/image_name - VERSION: "${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" - script: - - test "$PARITYPR_USER" -a "$PARITYPR_PASS" || - ( echo "no docker credentials provided"; exit 1 ) - - $BUILDAH_COMMAND build - --format=docker - --build-arg VCS_REF="${CI_COMMIT_SHA}" - --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" - --build-arg IMAGE_NAME="${IMAGE_NAME}" - --tag "$IMAGE_NAME:$VERSION" - --file ${DOCKERFILE} . - - echo "$PARITYPR_PASS" | - buildah login --username "$PARITYPR_USER" --password-stdin docker.io - - $BUILDAH_COMMAND info - - $BUILDAH_COMMAND push --format=v2s2 "$IMAGE_NAME:$VERSION" - after_script: - - buildah logout --all - -build-push-image-polkadot-parachain-debug: - stage: publish - extends: - - .kubernetes-env - - .common-refs - - .build-push-image - needs: - - job: build-linux-stable - artifacts: true - variables: - DOCKERFILE: "docker/polkadot-parachain-debug_unsigned_injected.Dockerfile" - IMAGE_NAME: "docker.io/paritypr/polkadot-parachain-debug" - VERSION: "${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" - -build-push-image-test-parachain: - stage: publish - extends: - - .kubernetes-env - - .common-refs - - .build-push-image - needs: - - job: build-test-parachain - artifacts: true - variables: - DOCKERFILE: "docker/test-parachain_injected.Dockerfile" - IMAGE_NAME: "docker.io/paritypr/test-parachain" - VERSION: "${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" - -publish-s3: - stage: publish - extends: - - .kubernetes-env - - .publish-refs - image: paritytech/awscli:latest - needs: - - job: build-linux-stable - artifacts: true - variables: - GIT_STRATEGY: none - BUCKET: "releases.parity.io" - PREFIX: "cumulus/${ARCH}-${DOCKER_OS}" - script: - - echo "___Publishing a binary with debug assertions!___" - - echo "___VERSION = $(cat ./artifacts/VERSION) ___" - - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/ - - echo "___Updating objects in latest path___" - - aws s3 sync s3://${BUCKET}/${PREFIX}/$(cat ./artifacts/VERSION)/ s3://${BUCKET}/${PREFIX}/latest/ - after_script: - - aws s3 ls s3://${BUCKET}/${PREFIX}/latest/ - --recursive --human-readable --summarize - -publish-benchmarks-assets-s3: &publish-benchmarks - stage: publish - extends: - - .kubernetes-env - - .benchmarks-refs - image: paritytech/awscli:latest - needs: - - job: benchmarks-assets - artifacts: true - variables: - GIT_STRATEGY: none - BUCKET: "releases.parity.io" - PREFIX: "cumulus/$CI_COMMIT_REF_NAME/benchmarks-assets" - script: - - echo "___Publishing benchmark results___" - - aws s3 sync ./artifacts/ s3://${BUCKET}/${PREFIX}/ - after_script: - - aws s3 ls s3://${BUCKET}/${PREFIX}/ --recursive --human-readable --summarize - -publish-benchmarks-collectives-s3: - <<: *publish-benchmarks - variables: - GIT_STRATEGY: none - BUCKET: "releases.parity.io" - PREFIX: "cumulus/$CI_COMMIT_REF_NAME/benchmarks-collectives" - needs: - - job: benchmarks-collectives - artifacts: true diff --git a/cumulus/scripts/ci/gitlab/pipeline/short-benchmarks.yml b/cumulus/scripts/ci/gitlab/pipeline/short-benchmarks.yml deleted file mode 100644 index f63ad1e0d045..000000000000 --- a/cumulus/scripts/ci/gitlab/pipeline/short-benchmarks.yml +++ /dev/null @@ -1,56 +0,0 @@ -# This file is part of .gitlab-ci.yml -# Here are all jobs that are executed during "short-benchmarks" stage - -# Run all pallet benchmarks only once to check if there are any errors -.short-benchmark-template: &short-bench - stage: short-benchmarks - extends: - - .common-refs - - .docker-env - needs: - - job: build-short-benchmark - artifacts: true - variables: - RUNTIME_CHAIN: benchmarked-runtime-chain - script: - - ./artifacts/polkadot-parachain benchmark pallet --wasm-execution compiled --chain $RUNTIME_CHAIN --pallet "*" --extrinsic "*" --steps 2 --repeat 1 - -short-benchmark-asset-hub-polkadot: - <<: *short-bench - variables: - RUNTIME_CHAIN: asset-hub-polkadot-dev - -short-benchmark-asset-hub-kusama: - <<: *short-bench - variables: - RUNTIME_CHAIN: asset-hub-kusama-dev - -short-benchmark-asset-hub-westend: - <<: *short-bench - variables: - RUNTIME_CHAIN: asset-hub-westend-dev - -short-benchmark-bridge-hub-polkadot: - <<: *short-bench - variables: - RUNTIME_CHAIN: bridge-hub-polkadot-dev - -short-benchmark-bridge-hub-kusama: - <<: *short-bench - variables: - RUNTIME_CHAIN: bridge-hub-kusama-dev - -short-benchmark-bridge-hub-rococo: - <<: *short-bench - variables: - RUNTIME_CHAIN: bridge-hub-rococo-dev - -short-benchmark-collectives-polkadot : - <<: *short-bench - variables: - RUNTIME_CHAIN: collectives-polkadot-dev - -short-benchmark-glutton-kusama : - <<: *short-bench - variables: - RUNTIME_CHAIN: glutton-kusama-dev-1300 diff --git a/cumulus/scripts/ci/gitlab/pipeline/test.yml b/cumulus/scripts/ci/gitlab/pipeline/test.yml deleted file mode 100644 index 81d8fbf4d1dc..000000000000 --- a/cumulus/scripts/ci/gitlab/pipeline/test.yml +++ /dev/null @@ -1,109 +0,0 @@ -# This file is part of .gitlab-ci.yml -# Here are all jobs that are executed during "test" stage - -# It's more like a check, but we want to run this job with real tests in parallel -find-fail-ci-phrase: - stage: test - variables: - CI_IMAGE: "paritytech/tools:latest" - ASSERT_REGEX: "FAIL-CI" - GIT_DEPTH: 1 - extends: - - .kubernetes-env - script: - - set +e - - rg --line-number --hidden --type rust --glob '!{.git,target}' "$ASSERT_REGEX" .; exit_status=$? - - if [ $exit_status -eq 0 ]; then - echo "$ASSERT_REGEX was found, exiting with 1"; - exit 1; - else - echo "No $ASSERT_REGEX was found, exiting with 0"; - exit 0; - fi - -test-linux-stable: - stage: test - extends: - - .docker-env - - .common-refs - - .pipeline-stopper-artifacts - before_script: - - !reference [.docker-env, before_script] - - !reference [.pipeline-stopper-vars, before_script] - variables: - # Enable debug assertions since we are running optimized builds for testing - # but still want to have debug assertions. - RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" - script: - - time cargo nextest run --all --release --locked --run-ignored all - -test-doc: - stage: test - extends: - - .docker-env - - .common-refs - variables: - # Enable debug assertions since we are running optimized builds for testing - # but still want to have debug assertions. - RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" - script: - - time cargo test --doc - -check-runtime-benchmarks: - stage: test - extends: - - .docker-env - - .common-refs - script: - # Check that the node will compile with `runtime-benchmarks` feature flag. - - time cargo check --locked --all --features runtime-benchmarks - # Check that parachain-template will compile with `runtime-benchmarks` feature flag. - - time cargo check --locked -p parachain-template-node --features runtime-benchmarks - -cargo-check-try-runtime: - stage: test - extends: - - .docker-env - - .common-refs - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: check-runtime-benchmarks - artifacts: false - script: - # Check that the node will compile with `try-runtime` feature flag. - - time cargo check --locked --all --features try-runtime - # Check that parachain-template will compile with `try-runtime` feature flag. - - time cargo check --locked -p parachain-template-node --features try-runtime - -check-rustdoc: - stage: test - extends: - - .docker-env - - .common-refs - variables: - SKIP_WASM_BUILD: 1 - RUSTDOCFLAGS: "-Dwarnings" - script: - - time cargo doc --workspace --all-features --verbose --no-deps - -cargo-check-benches: - stage: test - extends: - - .docker-env - - .common-refs - # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs - needs: - - job: check-rustdoc - artifacts: false - script: - - time cargo check --all --benches - -cargo-clippy: - stage: test - extends: - - .docker-env - - .common-refs - script: - - echo $RUSTFLAGS - - cargo version && cargo clippy --version - - SKIP_WASM_BUILD=1 env -u RUSTFLAGS cargo clippy --locked --all-targets --workspace diff --git a/cumulus/scripts/ci/gitlab/pipeline/zombienet.yml b/cumulus/scripts/ci/gitlab/pipeline/zombienet.yml deleted file mode 100644 index d5ab3e13d42e..000000000000 --- a/cumulus/scripts/ci/gitlab/pipeline/zombienet.yml +++ /dev/null @@ -1,141 +0,0 @@ -# This file is part of .gitlab-ci.yml -# Here are all jobs that are executed during "zombienet" stage - -.zombienet-before-script: - before_script: - - echo "Zombie-net Tests Config" - - echo "${ZOMBIENET_IMAGE}" - - echo "${RELAY_IMAGE}" - - echo "${COL_IMAGE}" - - echo "${GH_DIR}" - - export DEBUG=zombie - - export RELAY_IMAGE=${POLKADOT_IMAGE} - - export COL_IMAGE=${COL_IMAGE} - -.zombienet-after-script: - after_script: - - mkdir -p ./zombienet-logs - - cp /tmp/zombie*/logs/* ./zombienet-logs/ - -# common settings for all zombienet jobs -.zombienet-common: - stage: zombienet - image: "${ZOMBIENET_IMAGE}" - needs: - - job: build-push-image-test-parachain - artifacts: true - variables: - POLKADOT_IMAGE: "docker.io/paritypr/polkadot-debug:master" - GH_DIR: "https://github.com/paritytech/cumulus/tree/${CI_COMMIT_SHORT_SHA}/zombienet/tests" - COL_IMAGE: "docker.io/paritypr/test-parachain:${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" - FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR: 1 - artifacts: - name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" - when: always - expire_in: 2 days - paths: - - ./zombienet-logs - allow_failure: false - retry: 2 - tags: - - zombienet-polkadot-integration-test - -zombienet-0001-sync_blocks_from_tip_without_connected_collator: - extends: - - .zombienet-common - - .zombienet-refs - - .zombienet-before-script - - .zombienet-after-script - script: - - /home/nonroot/zombie-net/scripts/ci/run-test-env-manager.sh - --github-remote-dir="${GH_DIR}" - --concurrency=1 - --test="0001-sync_blocks_from_tip_without_connected_collator.zndsl" - -zombienet-0002-pov_recovery: - extends: - - .zombienet-common - - .zombienet-refs - - .zombienet-before-script - - .zombienet-after-script - script: - - /home/nonroot/zombie-net/scripts/ci/run-test-env-manager.sh - --github-remote-dir="${GH_DIR}" - --concurrency=1 - --test="0002-pov_recovery.zndsl" - -zombienet-0003-full_node_catching_up: - extends: - - .zombienet-common - - .zombienet-refs - - .zombienet-before-script - - .zombienet-after-script - script: - - /home/nonroot/zombie-net/scripts/ci/run-test-env-manager.sh - --github-remote-dir="${GH_DIR}" - --concurrency=1 - --test="0003-full_node_catching_up.zndsl" - -zombienet-0004-runtime_upgrade: - extends: - - .zombienet-common - - .zombienet-refs - - .zombienet-before-script - - .zombienet-after-script - needs: - - !reference [.zombienet-common, needs] - - job: build-test-parachain - artifacts: true - before_script: - - ls -ltr * - - cp ./artifacts/zombienet/wasm_binary_spec_version_incremented.rs.compact.compressed.wasm /tmp/ - - ls /tmp - - !reference [.zombienet-before-script, before_script] - script: - - /home/nonroot/zombie-net/scripts/ci/run-test-env-manager.sh - --github-remote-dir="${GH_DIR}" - --concurrency=1 - --test="0004-runtime_upgrade.zndsl" - -zombienet-0005-migrate_solo_to_para: - extends: - - .zombienet-common - - .zombienet-refs - - .zombienet-before-script - - .zombienet-after-script - needs: - - !reference [.zombienet-common, needs] - - job: build-test-parachain - artifacts: true - before_script: - - ls -ltr * - - !reference [.zombienet-before-script, before_script] - script: - - /home/nonroot/zombie-net/scripts/ci/run-test-env-manager.sh - --github-remote-dir="${GH_DIR}" - --concurrency=1 - --test="0005-migrate_solo_to_para.zndsl" - -zombienet-0006-rpc_collator_builds_blocks: - extends: - - .zombienet-common - - .zombienet-refs - - .zombienet-before-script - - .zombienet-after-script - script: - - /home/nonroot/zombie-net/scripts/ci/run-test-env-manager.sh - --github-remote-dir="${GH_DIR}" - --concurrency=1 - --test="0006-rpc_collator_builds_blocks.zndsl" - -zombienet-0007-full_node_warp_sync: - extends: - - .zombienet-common - - .zombienet-refs - - .zombienet-before-script - - .zombienet-after-script - script: - - /home/nonroot/zombie-net/scripts/ci/run-test-env-manager.sh - --github-remote-dir="${GH_DIR}" - --concurrency=1 - --test="0007-full_node_warp_sync.zndsl" diff --git a/cumulus/scripts/ci/gitlab/prettier.sh b/cumulus/scripts/ci/gitlab/prettier.sh deleted file mode 100755 index 299bbee179dc..000000000000 --- a/cumulus/scripts/ci/gitlab/prettier.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -# meant to be installed via -# git config filter.ci-prettier.clean "scripts/ci/gitlab/prettier.sh" - -prettier --parser yaml diff --git a/cumulus/scripts/create_bridge_hub_kusama_spec.sh b/cumulus/scripts/create_bridge_hub_kusama_spec.sh deleted file mode 100755 index 813921b079a8..000000000000 --- a/cumulus/scripts/create_bridge_hub_kusama_spec.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo Usage: - echo "$1 " - echo "$2 " - echo "e.g.: ./scripts/create_bridge_hub_kusama_spec.sh ./target/release/wbuild/bridge-hub-kusama-runtime/bridge_hub_kusama_runtime.compact.compressed.wasm 1002" - exit 1 -} - -if [ -z "$1" ]; then - usage -fi - -if [ -z "$2" ]; then - usage -fi - -set -e - -rt_path=$1 -para_id=$2 - -echo "Generating chain spec for runtime: $rt_path and para_id: $para_id" - -binary="./target/release/polkadot-parachain" - -# build the chain spec we'll manipulate -$binary build-spec --chain bridge-hub-kusama-dev > chain-spec-plain.json - -# convert runtime to hex -cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > rt-hex.txt - -# replace the runtime in the spec with the given runtime and set some values to production -cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtime.system.code = ("0x" + $code)' \ - | jq '.name = "Kusama BridgeHub"' \ - | jq '.id = "bridge-hub-kusama"' \ - | jq '.chainType = "Live"' \ - | jq '.bootNodes = [ - "/dns/kusama-bridge-hub-collator-ew1-0.polkadot.io/tcp/30334/p2p/12D3KooWP2Gngt4tt2sz5BgDaAbMTxasPWk3V2Z99bQTmFcAorqa", - "/dns/kusama-bridge-hub-collator-ew1-1.polkadot.io/tcp/30334/p2p/12D3KooWMmL3FQuYmruBui1sbY4MwNmvicinrePi1Yq4QMRSYHoR", - "/dns/kusama-bridge-hub-collator-ue4-0.polkadot.io/tcp/30334/p2p/12D3KooWQpTocTck1tNBzMNTHJ3kSv4vzv8Yf9FpVkfGnungbez4", - "/dns/kusama-bridge-hub-collator-ue4-1.polkadot.io/tcp/30334/p2p/12D3KooWRgtJqKEaMi7hkU4VMiGhpHTJeL8N7JgL7d9gwooPv4eW", - - "/dns/kusama-bridge-hub-connect-ew1-0.polkadot.io/tcp/30334/p2p/12D3KooWPQQPivrqQ51kRTDc2R1mtqwKT4GGtk2rapkY4FrwHrEp", - "/dns/kusama-bridge-hub-connect-ew1-1.polkadot.io/tcp/30334/p2p/12D3KooWPcF9Yk4gYrMju9CyWCV69hAFXbYsnxCLogwLGu9QFTRn", - "/dns/kusama-bridge-hub-connect-ue4-0.polkadot.io/tcp/30334/p2p/12D3KooWMf1sVnJDTkKWtaThqvrgcSPLbfGXttSqbwhM2DJp9BUG", - "/dns/kusama-bridge-hub-connect-ue4-1.polkadot.io/tcp/30334/p2p/12D3KooWQaV7wMfNVKy2aMz4Lds3TTxgSDyZAUEnbAZMfD8rW3ow", - - "/dns/kusama-bridge-hub-connect-ew1-0.polkadot.io/tcp/443/wss/p2p/12D3KooWPQQPivrqQ51kRTDc2R1mtqwKT4GGtk2rapkY4FrwHrEp", - "/dns/kusama-bridge-hub-connect-ew1-1.polkadot.io/tcp/443/wss/p2p/12D3KooWPcF9Yk4gYrMju9CyWCV69hAFXbYsnxCLogwLGu9QFTRn", - "/dns/kusama-bridge-hub-connect-ue4-0.polkadot.io/tcp/443/wss/p2p/12D3KooWMf1sVnJDTkKWtaThqvrgcSPLbfGXttSqbwhM2DJp9BUG", - "/dns/kusama-bridge-hub-connect-ue4-1.polkadot.io/tcp/443/wss/p2p/12D3KooWQaV7wMfNVKy2aMz4Lds3TTxgSDyZAUEnbAZMfD8rW3ow" - - ]' \ - | jq '.relay_chain = "kusama"' \ - | jq --argjson para_id $para_id '.para_id = $para_id' \ - | jq --argjson para_id $para_id '.genesis.runtime.parachainInfo.parachainId = $para_id' \ - | jq '.genesis.runtime.balances.balances = []' \ - | jq '.genesis.runtime.collatorSelection.invulnerables = [ - "DQkekNBt8g6D7bPUEqhgfujADxzzfivr1qQZJkeGzAqnEzF", - "HbUc5qrLtKAZvasioiTSf1CunaN2SyEwvfsgMuYQjXA5sfk", - "JEe4NcVyuWFEwZe4WLfRtynDswyKgvLS8H8r4Wo9d3t61g1", - "FAe4DGhQHKTm35n5MgBFNBZvyEJcm7QAwgnVNQU8KXP2ixn" - ]' \ - | jq '.genesis.runtime.session.keys = [ - [ - "DQkekNBt8g6D7bPUEqhgfujADxzzfivr1qQZJkeGzAqnEzF", - "DQkekNBt8g6D7bPUEqhgfujADxzzfivr1qQZJkeGzAqnEzF", - { - "aura": "5E7AiV9ygGUcfdK3XVoJsew7fsu18uvKQHYhksE5PXDNfRL9" - } - ], - [ - "HbUc5qrLtKAZvasioiTSf1CunaN2SyEwvfsgMuYQjXA5sfk", - "HbUc5qrLtKAZvasioiTSf1CunaN2SyEwvfsgMuYQjXA5sfk", - { - "aura": "5CyXoMh8cA2MSk55JASpCfhCg44iSG5fBwmhvSfXUUS3uhPR" - } - ], - [ - "JEe4NcVyuWFEwZe4WLfRtynDswyKgvLS8H8r4Wo9d3t61g1", - "JEe4NcVyuWFEwZe4WLfRtynDswyKgvLS8H8r4Wo9d3t61g1", - { - "aura": "5Grj5pN52kKU61qK9qP5cf9ADuyowe2WVvYWxMNK1QqAM8qf" - } - ], - [ - "FAe4DGhQHKTm35n5MgBFNBZvyEJcm7QAwgnVNQU8KXP2ixn", - "FAe4DGhQHKTm35n5MgBFNBZvyEJcm7QAwgnVNQU8KXP2ixn", - { - "aura": "5EHTyftGjcHfe71VVuZqCeLbHNf4ptYzgdAMMyqpTNbs5Rrp" - } - ] - ]' \ - > edited-chain-spec-plain.json - -# build a raw spec -$binary build-spec --chain edited-chain-spec-plain.json --raw > chain-spec-raw.json -cp edited-chain-spec-plain.json bridge-hub-kusama-spec.json -cp chain-spec-raw.json ./parachains/chain-specs/bridge-hub-kusama.json -cp chain-spec-raw.json bridge-hub-kusama-spec-raw.json - -# build genesis data -$binary export-genesis-state --chain chain-spec-raw.json > bridge-hub-kusama-genesis-head-data - -# build genesis wasm -$binary export-genesis-wasm --chain chain-spec-raw.json > bridge-hub-kusama-wasm diff --git a/cumulus/scripts/create_bridge_hub_polkadot_spec.sh b/cumulus/scripts/create_bridge_hub_polkadot_spec.sh deleted file mode 100755 index 49bc9cee692b..000000000000 --- a/cumulus/scripts/create_bridge_hub_polkadot_spec.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo Usage: - echo "$1 " - echo "$2 " - echo "e.g.: ./scripts/create_bridge_hub_polkadot_spec.sh ./target/release/wbuild/bridge-hub-polkadot-runtime/bridge_hub_polkadot_runtime.compact.compressed.wasm 1002" - exit 1 -} - -if [ -z "$1" ]; then - usage -fi - -if [ -z "$2" ]; then - usage -fi - -set -e - -rt_path=$1 -para_id=$2 - -echo "Generating chain spec for runtime: $rt_path and para_id: $para_id" - -binary="./target/release/polkadot-parachain" - -# build the chain spec we'll manipulate -$binary build-spec --chain bridge-hub-polkadot-dev > chain-spec-plain.json - -# convert runtime to hex -cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > rt-hex.txt - -# replace the runtime in the spec with the given runtime and set some values to production -cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtime.system.code = ("0x" + $code)' \ - | jq '.name = "Polkadot BridgeHub"' \ - | jq '.id = "bridge-hub-polkadot"' \ - | jq '.chainType = "Live"' \ - | jq '.bootNodes = [ - "/dns/polkadot-bridge-hub-connect-a-0.polkadot.io/tcp/30334/p2p/12D3KooWAVQMhkXmc5ueSYasdsRWQbKus2YGZ6HDZUB4ViJMCxXy", - "/dns/polkadot-bridge-hub-connect-a-1.polkadot.io/tcp/30334/p2p/12D3KooWG4ypDHLKGCv4BZ6PuaGUwQHKAH6p2D6arR2uQ1eiR1T3", - "/dns/polkadot-bridge-hub-connect-b-0.polkadot.io/tcp/30334/p2p/12D3KooWCwGKxjpJXnx1mwXKvaxGQm769EM3b6Pg5vbU33wbhsNw", - "/dns/polkadot-bridge-hub-connect-b-1.polkadot.io/tcp/30334/p2p/12D3KooWLiSEdhriJUPdZKFtAjZrQncxN2ssEoDKVrt5mGM4Qu4J", - - "/dns/polkadot-bridge-hub-connect-a-0.polkadot.io/tcp/443/wss/p2p/12D3KooWAVQMhkXmc5ueSYasdsRWQbKus2YGZ6HDZUB4ViJMCxXy", - "/dns/polkadot-bridge-hub-connect-a-1.polkadot.io/tcp/443/wss/p2p/12D3KooWG4ypDHLKGCv4BZ6PuaGUwQHKAH6p2D6arR2uQ1eiR1T3", - "/dns/polkadot-bridge-hub-connect-b-0.polkadot.io/tcp/443/wss/p2p/12D3KooWCwGKxjpJXnx1mwXKvaxGQm769EM3b6Pg5vbU33wbhsNw", - "/dns/polkadot-bridge-hub-connect-b-1.polkadot.io/tcp/443/wss/p2p/12D3KooWLiSEdhriJUPdZKFtAjZrQncxN2ssEoDKVrt5mGM4Qu4J" - ]' \ - | jq '.relay_chain = "polkadot"' \ - | jq --argjson para_id $para_id '.para_id = $para_id' \ - | jq --argjson para_id $para_id '.genesis.runtime.parachainInfo.parachainId = $para_id' \ - | jq '.genesis.runtime.balances.balances = []' \ - | jq '.genesis.runtime.collatorSelection.invulnerables = [ - "134AK3RiMA97Fx9dLj1CvuLJUa8Yo93EeLA1TkP6CCGnWMSd", - "15dU8Tt7kde2diuHzijGbKGPU5K8BPzrFJfYFozvrS1DdE21", - "1vXMKM8SctM28AQw1wSpd7p9yCUWn1uhbbKSVTuznsw8Q2x", - "15mCQcaj3QP1UdxBF82JRd9v3riZJcVNVEmx8xkFp7DSYR4Y" - ]' \ - | jq '.genesis.runtime.session.keys = [ - [ - "134AK3RiMA97Fx9dLj1CvuLJUa8Yo93EeLA1TkP6CCGnWMSd", - "134AK3RiMA97Fx9dLj1CvuLJUa8Yo93EeLA1TkP6CCGnWMSd", - { - "aura": "5EX6AnyuSPEFQ7HAPjRgzqk1sxgh8cyacGimwJ16y1nJ2w7g" - } - ], - [ - "15dU8Tt7kde2diuHzijGbKGPU5K8BPzrFJfYFozvrS1DdE21", - "15dU8Tt7kde2diuHzijGbKGPU5K8BPzrFJfYFozvrS1DdE21", - { - "aura": "5DZN8UhaJftvKhMMARmJBwrwzuEDpoUzzBvvWMbFXYsJ4CmK" - } - ], - [ - "1vXMKM8SctM28AQw1wSpd7p9yCUWn1uhbbKSVTuznsw8Q2x", - "1vXMKM8SctM28AQw1wSpd7p9yCUWn1uhbbKSVTuznsw8Q2x", - { - "aura": "5FKsn83rXQQiw7HwoeYoLMoYS5GP9YVNHZiCHwA4DSwDcPVa" - } - ], - [ - "15mCQcaj3QP1UdxBF82JRd9v3riZJcVNVEmx8xkFp7DSYR4Y", - "15mCQcaj3QP1UdxBF82JRd9v3riZJcVNVEmx8xkFp7DSYR4Y", - { - "aura": "5DCg19ckcJz4m52Th4o1LcSRK3H7NsUcQsRbu7pTDM3mZ26v" - } - ] - ]' \ - > edited-chain-spec-plain.json - -# build a raw spec -$binary build-spec --chain edited-chain-spec-plain.json --raw > chain-spec-raw.json -cp edited-chain-spec-plain.json bridge-hub-polkadot-spec.json -cp chain-spec-raw.json ./parachains/chain-specs/bridge-hub-polkadot.json -cp chain-spec-raw.json bridge-hub-polkadot-spec-raw.json - -# build genesis data -$binary export-genesis-state --chain chain-spec-raw.json > bridge-hub-polkadot-genesis-head-data - -# build genesis wasm -$binary export-genesis-wasm --chain chain-spec-raw.json > bridge-hub-polkadot-wasm - -# cleanup -rm -f rt-hex.txt -rm -f chain-spec-plain.json -rm -f chain-spec-raw.json -rm -f edited-chain-spec-plain.json diff --git a/cumulus/scripts/create_bridge_hub_westend_spec.sh b/cumulus/scripts/create_bridge_hub_westend_spec.sh deleted file mode 100755 index 31dafda25e7a..000000000000 --- a/cumulus/scripts/create_bridge_hub_westend_spec.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo Usage: - echo "$1 " - echo "$2 " - echo "e.g.: ./scripts/create_bridge_hub_westend_spec.sh ./target/release/wbuild/bridge-hub-kusama-runtime/bridge_hub_kusama_runtime.compact.compressed.wasm 1002" - exit 1 -} - -if [ -z "$1" ]; then - usage -fi - -if [ -z "$2" ]; then - usage -fi - -set -e - -rt_path=$1 -para_id=$2 - -echo "Generating chain spec for runtime: $rt_path and para_id: $para_id" - -binary="./target/release/polkadot-parachain" - -# build the chain spec we'll manipulate -$binary build-spec --chain bridge-hub-kusama-dev > chain-spec-plain.json - -# convert runtime to hex -cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > rt-hex.txt - -# replace the runtime in the spec with the given runtime and set some values to production -cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtime.system.code = ("0x" + $code)' \ - | jq '.name = "Westend BridgeHub"' \ - | jq '.id = "bridge-hub-westend"' \ - | jq '.chainType = "Live"' \ - | jq '.bootNodes = [ - "/dns/westend-bridge-hub-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWKyEuqkkWvFSrwZWKWBAsHgLV3HGfHj7yH3LNJLAVhmxY", - "/dns/westend-bridge-hub-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWBpvudthz61XC4oP2YYFFJdhWohBeQ1ffn1BMSGWhapjd", - "/dns/westend-bridge-hub-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWPXqdRRthjKAMPFtaXUK7yBxsvh83QsmzXzALA3inoJfo", - "/dns/westend-bridge-hub-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWAp2YpVaiNBy7rozEHJGocDpaLFt3VFZsGMBEYh4BoEz7" - ]' \ - | jq '.relay_chain = "westend"' \ - | jq '.properties = { - "tokenDecimals": 12, - "tokenSymbol": "WND" - }' \ - | jq --argjson para_id $para_id '.para_id = $para_id' \ - | jq --argjson para_id $para_id '.genesis.runtime.parachainInfo.parachainId = $para_id' \ - | jq '.genesis.runtime.balances.balances = []' \ - | jq '.genesis.runtime.collatorSelection.invulnerables = [ - "5GN5qBbUkxigdLhTajWqAG66MRD2v5WjUFqkuGVSRCyhMCg6", - "5GRCPWstCyp3u9T2c3oGqj83rniQffJR5Q2LpGsL9m19oQ8T", - "5GR2p9FpJFPpDuZPk1Lt9VZJ76aLPfKVA6qBE4FRted2oT6D", - "5FH8VBgdXijT1vM6pj1aFGw49J2fQDZKM1BFQtVV1zjmA7mM" - ]' \ - | jq '.genesis.runtime.session.keys = [ - [ - "5GN5qBbUkxigdLhTajWqAG66MRD2v5WjUFqkuGVSRCyhMCg6", - "5GN5qBbUkxigdLhTajWqAG66MRD2v5WjUFqkuGVSRCyhMCg6", - { - "aura": "5GN5qBbUkxigdLhTajWqAG66MRD2v5WjUFqkuGVSRCyhMCg6" - } - ], - [ - "5GRCPWstCyp3u9T2c3oGqj83rniQffJR5Q2LpGsL9m19oQ8T", - "5GRCPWstCyp3u9T2c3oGqj83rniQffJR5Q2LpGsL9m19oQ8T", - { - "aura": "5GRCPWstCyp3u9T2c3oGqj83rniQffJR5Q2LpGsL9m19oQ8T" - } - ], - [ - "5GR2p9FpJFPpDuZPk1Lt9VZJ76aLPfKVA6qBE4FRted2oT6D", - "5GR2p9FpJFPpDuZPk1Lt9VZJ76aLPfKVA6qBE4FRted2oT6D", - { - "aura": "5GR2p9FpJFPpDuZPk1Lt9VZJ76aLPfKVA6qBE4FRted2oT6D" - } - ], - [ - "5FH8VBgdXijT1vM6pj1aFGw49J2fQDZKM1BFQtVV1zjmA7mM", - "5FH8VBgdXijT1vM6pj1aFGw49J2fQDZKM1BFQtVV1zjmA7mM", - { - "aura": "5FH8VBgdXijT1vM6pj1aFGw49J2fQDZKM1BFQtVV1zjmA7mM" - } - ] - ]' \ - > edited-chain-spec-plain.json - -# build a raw spec -$binary build-spec --chain edited-chain-spec-plain.json --raw > chain-spec-raw.json -cp edited-chain-spec-plain.json bridge-hub-westend-spec.json -cp chain-spec-raw.json ./parachains/chain-specs/bridge-hub-westend.json -cp chain-spec-raw.json bridge-hub-westend-spec-raw.json - -# build genesis data -$binary export-genesis-state --chain chain-spec-raw.json > bridge-hub-westend-genesis-head-data - -# build genesis wasm -$binary export-genesis-wasm --chain chain-spec-raw.json > bridge-hub-westend-wasm diff --git a/cumulus/scripts/create_glutton_spec.sh b/cumulus/scripts/create_glutton_spec.sh deleted file mode 100755 index c5158392f529..000000000000 --- a/cumulus/scripts/create_glutton_spec.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env bash - -# Example usage to: -# -# - Use the `polkadot-parachain` binary; -# - Use `rococo` as the parent Relay Chain; -# - Generate `ParaId`s from 1,300 to 1,370, inclusive; -# - Set the Sudo key to `GZ9YSgtib4kEMxWcpWfnXa1cnrumspTCTZSaNWWmMkJbWqW`; -# - Set `compute`, `storage`, and `trash_data_count` set to 50%, 131%, and 5,120, respectively; -# - And save the results in `output-dir`. -# -# ./scripts/create_glutton_spec.sh ./target/release/polkadot-parachain rococo 1300 1370 GZ9YSgtib4kEMxWcpWfnXa1cnrumspTCTZSaNWWmMkJbWqW 500000000 1310000000 5120 output-dir - -usage() { - echo Usage: - echo "$0 " - exit 1 -} - -set -e - -if ! command -v jq >/dev/null 2>&1; then - echo "'jq' is not installed, please install. Exiting..." - exit 1 -fi - -binary_path=$1 -relay_chain=$2 -from_para_id=$3 -to_para_id=$4 -sudo=$5 -compute=$6 -storage=$7 -trash_data_count=$8 -output_dir=$9 - -[ -z "$binary_path" ] && usage -[ -z "$relay_chain" ] && usage -[ -z "$from_para_id" ] && usage -[ -z "$to_para_id" ] && usage -[ -z "$sudo" ] && usage -[ -z "$compute" ] && usage -[ -z "$storage" ] && usage -[ -z "$trash_data_count" ] && usage -[ -z "$output_dir" ] && usage - - -for (( para_id=$from_para_id; para_id<=$to_para_id; para_id++ )); do - echo "Building chain specs for parachain $para_id" - - # create dir to store parachain generated files - output_para_dir="$output_dir/glutton-$relay_chain-$para_id" - if [ ! -d "$output_para_dir" ]; then - mkdir $output_para_dir - fi - - # build the chain spec we'll manipulate - $binary_path build-spec --disable-default-bootnode --chain "glutton-kusama-genesis-$para_id" > "$output_para_dir/plain-glutton-$relay_chain-$para_id-spec.json" - - id="glutton-$relay_chain-$para_id" - protocol_id="glutton-$relay_chain-$para_id" - - # replace the runtime in the spec with the given runtime and set some values to production - cat "$output_para_dir/plain-glutton-$relay_chain-$para_id-spec.json" \ - | jq --arg id $id '.id = $id' \ - | jq --arg protocol_id $protocol_id '.protocolId = $protocol_id' \ - | jq --arg relay_chain $relay_chain '.relay_chain = $relay_chain' \ - | jq --argjson para_id $para_id '.para_id = $para_id' \ - | jq --arg sudo $sudo '.genesis.runtime.sudo.key = $sudo' \ - | jq --argjson para_id $para_id '.genesis.runtime.parachainInfo.parachainId = $para_id' \ - | jq --arg compute $compute '.genesis.runtime.glutton.compute = $compute' \ - | jq --arg storage $storage '.genesis.runtime.glutton.storage = $storage' \ - | jq --argjson trash_data_count $trash_data_count '.genesis.runtime.glutton.trashDataCount = $trash_data_count' \ - > $output_para_dir/glutton-$relay_chain-$para_id-spec.json - - # build a raw spec - $binary_path build-spec --disable-default-bootnode --chain "$output_para_dir/glutton-$relay_chain-$para_id-spec.json" --raw > "$output_para_dir/glutton-$relay_chain-$para_id-raw-spec.json" - - # build genesis data - $binary_path export-genesis-state --chain "$output_para_dir/glutton-$relay_chain-$para_id-raw-spec.json" > "$output_para_dir/glutton-$relay_chain-$para_id-head-data" - - # build genesis wasm - $binary_path export-genesis-wasm --chain "$output_para_dir/glutton-$relay_chain-$para_id-raw-spec.json" > "$output_para_dir/glutton-$relay_chain-$para_id-validation-code" - - rm "$output_para_dir/plain-glutton-$relay_chain-$para_id-spec.json" -done diff --git a/cumulus/scripts/create_seedling_spec.sh b/cumulus/scripts/create_seedling_spec.sh deleted file mode 100755 index a4ac0b2ab528..000000000000 --- a/cumulus/scripts/create_seedling_spec.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo Usage: - echo "$0 " - exit 1 -} - -set -e - -runtime_path=$1 -name=$2 -id="seedling-$3" -chain_type=$4 -bootnodes=$5 -relay_chain=$6 -para_id=$7 -sudo=$8 - -[ -z "$runtime_path" ] && usage -[ -z "$name" ] && usage -[ -z "$id" ] && usage -[ -z "$chain_type" ] && usage -[ -z "$bootnodes" ] && usage -[ -z "$relay_chain" ] && usage -[ -z "$para_$id" ] && usage -[ -z "$sudo" ] && usage - -binary="./target/release/polkadot-parachain" - -# build the chain spec we'll manipulate -$binary build-spec --disable-default-bootnode --chain seedling > seedling-spec-plain.json - -# convert runtime to hex -cat $runtime_path | od -A n -v -t x1 | tr -d ' \n' > seedling-hex.txt - -# replace the runtime in the spec with the given runtime and set some values to production -cat seedling-spec-plain.json | jq --rawfile code seedling-hex.txt '.genesis.runtime.system.code = ("0x" + $code)' \ - | jq --arg name $name '.name = $name' \ - | jq --arg id $id '.id = $id' \ - | jq --arg chain_type $chain_type '.chainType = $chain_type' \ - | jq --argjson bootnodes $bootnodes '.bootNodes = $bootnodes' \ - | jq --arg relay_chain $relay_chain '.relay_chain = $relay_chain' \ - | jq --argjson para_id $para_id '.para_id = $para_id' \ - | jq --arg sudo $sudo '.genesis.runtime.sudo.key = $sudo' \ - | jq --argjson para_id $para_id '.genesis.runtime.parachainInfo.parachainId = $para_id' \ - > edited-seedling-plain.json - -# build a raw spec -$binary build-spec --disable-default-bootnode --chain edited-seedling-plain.json --raw > seedling-spec-raw.json - -# build genesis data -$binary export-genesis-state --parachain-id=$para_id --chain seedling-spec-raw.json > seedling-head-data - -# build genesis wasm -$binary export-genesis-wasm --chain seedling-spec-raw.json > seedling-wasm diff --git a/cumulus/scripts/create_shell_spec.sh b/cumulus/scripts/create_shell_spec.sh deleted file mode 100755 index 6d6675044dba..000000000000 --- a/cumulus/scripts/create_shell_spec.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo Usage: - echo "$0 " - exit 1 -} - -set -e - -rt_path=$1 - -binary="./target/release/polkadot-parachain" - -# build the chain spec we'll manipulate -$binary build-spec --chain shell > shell-spec-plain.json - -# convert runtime to hex -cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > shell-hex.txt - -# replace the runtime in the spec with the given runtime and set some values to production -cat shell-spec-plain.json | jq --rawfile code shell-hex.txt '.genesis.runtime.system.code = ("0x" + $code)' \ - | jq '.name = "Shell"' \ - | jq '.id = "shell"' \ - | jq '.chainType = "Live"' \ - | jq '.bootNodes = ["/ip4/34.65.116.156/tcp/30334/p2p/12D3KooWMdwvej593sntpXcxpUaFcsjc1EpCr5CL1JMoKmEhgj1N", "/ip4/34.65.105.127/tcp/30334/p2p/12D3KooWRywSWa2sQpcRuLhSeNSEs6bepLGgcdxFg8P7jtXRuiYf", "/ip4/34.65.142.204/tcp/30334/p2p/12D3KooWDGnPd5PzgvcbSwXsCBN3kb1dWbu58sy6R7h4fJGnZtq5", "/ip4/34.65.32.100/tcp/30334/p2p/12D3KooWSzHX7A3t6BwUQrq8R9ZVWLrfyYgkYLfpKMcRs14oFSgc"]' \ - | jq '.relay_chain = "polkadot"' \ - > edited-shell-plain.json - -# build a raw spec -$binary build-spec --chain edited-shell-plain.json --raw > shell-spec-raw.json - -# build genesis data -$binary export-genesis-state --parachain-id=1000 --chain shell-spec-raw.json > shell-head-data - -# build genesis wasm -$binary export-genesis-wasm --chain shell-spec-raw.json > shell-wasm diff --git a/cumulus/scripts/generate_genesis_value.sh b/cumulus/scripts/generate_genesis_value.sh deleted file mode 100755 index 178e15fb8a90..000000000000 --- a/cumulus/scripts/generate_genesis_value.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env bash - -# Call from the root of the repo as: -# ./scripts/generate_genesis_value.sh [rpc endpoint] -usage() { - echo Usage: - echo "$0 [rpc endpoint]" - exit 1 -} - -chain_spec_summary() { - if [ -f $chain_spec ]; then - echo -e "ℹ️ Using chain specs from" $chain_spec - echo -e " - name :" $(jq -r .name $chain_spec) - echo -e " - id :" $(jq -r .id $chain_spec) - echo -e " - type :" $(jq -r .chainType $chain_spec) - echo -e " - decimals :" $(jq -r .properties.tokenDecimals $chain_spec) - echo -e " - symbol :" $(jq -r .properties.tokenSymbol $chain_spec) - echo -e " - relay_chain :" $(jq -r .relay_chain $chain_spec) - echo -e " - para_id :" $(jq -r .para_id $chain_spec) - echo -e " - bootNodes :" $(jq '.bootNodes | length' $chain_spec) - echo - else - echo "❌ Chain specs not found from" $chain_spec - exit 1 - fi -} - -check_collator() { - BIN=target/release/polkadot-parachain - if [ -f $BIN ]; then - echo "✅ Collator binary found:" - $BIN --version - else - echo "❌ Collator binary not found, exiting" - exit 1 - fi -} - -set -e - -chain_id=$1 -rpc_endpoint=$2 -work_dir="parachains/chain-specs" -chain_spec=$work_dir/$chain_id.json -chain_values=$work_dir/${chain_id}_values.json -chain_values_scale=$work_dir/${chain_id}_values.scale - -[ -z "$chain_id" ] && usage -chain_spec_summary - -if [ "$rpc_endpoint" == "" ]; then - # default connecting to the official rpc - rpc_endpoint='wss://statemint-shell.polkadot.io' -fi - -if [[ "$rpc_endpoint" =~ "localhost" ]]; then - check_collator - echo -e "Make sure you have a collator running with the correct version at $rpc_endpoint." - echo -e "If you don't, NOW is the time to start it with:" - echo -e "target/release/polkadot-parachain --chain parachains/chain-specs/shell.json --tmp\n" - read -p "You can abort with CTRL+C if this is not correct, otherwise press ENTER " -fi - -echo "Generating genesis values..." -pushd scripts/generate_genesis_values -yarn -popd - -node scripts/generate_genesis_values $chain_spec $chain_values - -echo "Scale encoding..." -pushd scripts/scale_encode_genesis -yarn -popd - -node scripts/scale_encode_genesis $chain_values $chain_values_scale $rpc_endpoint - - -ls -al parachains/chain-specs/${chain_id}_value*.* diff --git a/cumulus/scripts/generate_genesis_values/index.js b/cumulus/scripts/generate_genesis_values/index.js deleted file mode 100644 index d71450fcf142..000000000000 --- a/cumulus/scripts/generate_genesis_values/index.js +++ /dev/null @@ -1,59 +0,0 @@ -const fs = require("fs"); -const { exit } = require("process"); -const { xxhashAsHex } = require("@polkadot/util-crypto"); - -// Utility script scraping a chain spec for the genesis keys and values and writing them out as a -// json array of pairs. Filters the keys for anything already present in a shell runtime and sorts -// the output for reproducibility. - -if (!process.argv[2] || !process.argv[3]) { - console.log("usage: node generate_keys "); - exit(); -} - -const input = process.argv[2]; -const output = process.argv[3]; -fs.readFile(input, "utf8", (err, data) => { - if (err) { - console.log(`Error reading file from disk: ${err}`); - exit(1); - } - - const toHex = (str) => "0x" + Buffer.from(str, "ascii").toString("hex"); - const startsWith = (str, arr) => arr.some((test) => str.startsWith(test)); - - const filter_prefixes = [ - // substrate well known keys - ":code", - ":heappages", - ":extrinsic_index", - ":changes_trie", - ":child_storage", - ] - .map(toHex) - .concat( - // shell pallets - ["System", "ParachainSystem", "ParachainInfo", "CumulusXcm"].map((str) => - xxhashAsHex(str) - ) - ) - .concat([ - // polkadot well known keys; don't seem necessary, but just to make sure - "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385", - "0xf5207f03cfdce586301014700e2c2593fad157e461d71fd4c1f936839a5f1f3e", - "0x6a0da05ca59913bc38a8630590f2627cb6604cff828a6e3f579ca6c59ace013d", - "0x6a0da05ca59913bc38a8630590f2627c1d3719f5b0b12c7105c073c507445948", - "0x6a0da05ca59913bc38a8630590f2627cf12b746dcf32e843354583c9702cc020", - "0x63f78c98723ddc9073523ef3beefda0c4d7fefc408aac59dbfe80a72ac8e3ce5", - ]); - - const spec = JSON.parse(data); - - const genesis = - Object.entries(spec.genesis.raw.top).filter( - ([key, value]) => !startsWith(key, filter_prefixes) - ); - genesis.sort(); - - fs.writeFileSync(output, JSON.stringify(genesis)); -}); diff --git a/cumulus/scripts/generate_genesis_values/package.json b/cumulus/scripts/generate_genesis_values/package.json deleted file mode 100644 index c635440fbd97..000000000000 --- a/cumulus/scripts/generate_genesis_values/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "generate_genesis_values", - "version": "1.0.0", - "description": "filter genesis key-value pairs from a chain spec and store them", - "main": "index.js", - "scripts": { - "generate": "node index.js" - }, - "author": "Parity Technologies ", - "license": "ISC", - "dependencies": { - "@polkadot/util-crypto": "^6.5.1" - } -} diff --git a/cumulus/scripts/generate_genesis_values/yarn.lock b/cumulus/scripts/generate_genesis_values/yarn.lock deleted file mode 100644 index fa5c6adac876..000000000000 --- a/cumulus/scripts/generate_genesis_values/yarn.lock +++ /dev/null @@ -1,384 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.13.9", "@babel/runtime@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" - integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== - dependencies: - regenerator-runtime "^0.13.4" - -"@polkadot/networks@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-6.6.1.tgz#ceeb9c720218414b09cea7949e321c38f76c37ff" - integrity sha512-tvQdtH2m9ZBWCLBRLP+dvfyJ/CBqCU7TkJSNQCg9RaKkwLRQ+Vl4HKNbXai9jAGXDQmxLYIkxu89VRNksQrBRw== - dependencies: - "@babel/runtime" "^7.14.0" - -"@polkadot/util-crypto@^6.5.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-6.6.1.tgz#5065e3cd18b06b804b0ac151d6b00fe853c96c85" - integrity sha512-aD2Nr2Hb92Ev9w9yY5IRdVBlISRMAI3dokXXTpYIC+GVVH0i5bKA1KtO8eOhzh44/eujc7DUNB5wAXdl8rCCOQ== - dependencies: - "@babel/runtime" "^7.14.0" - "@polkadot/networks" "6.6.1" - "@polkadot/util" "6.6.1" - "@polkadot/wasm-crypto" "^4.0.2" - "@polkadot/x-randomvalues" "6.6.1" - base-x "^3.0.8" - base64-js "^1.5.1" - blakejs "^1.1.0" - bn.js "^4.11.9" - create-hash "^1.2.0" - elliptic "^6.5.4" - hash.js "^1.1.7" - js-sha3 "^0.8.0" - scryptsy "^2.1.0" - tweetnacl "^1.0.3" - xxhashjs "^0.2.2" - -"@polkadot/util@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-6.6.1.tgz#baa29a958dbf5843dbb0fb02d8e80c23cb803f58" - integrity sha512-KTHO3tTcmeByEwJoTjV8JFSTe3cFl6/2NUg9q3D4PkyrOEhzXJSNJ1exyXDWSDVS/udcq0TOGuR+NgYWoVuZvQ== - dependencies: - "@babel/runtime" "^7.14.0" - "@polkadot/x-textdecoder" "6.6.1" - "@polkadot/x-textencoder" "6.6.1" - "@types/bn.js" "^4.11.6" - bn.js "^4.11.9" - camelcase "^5.3.1" - ip-regex "^4.3.0" - -"@polkadot/wasm-crypto-asmjs@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-4.0.2.tgz#f42c353a64e1243841daf90e4bd54eff01a4e3cf" - integrity sha512-hlebqtGvfjg2ZNm4scwBGVHwOwfUhy2yw5RBHmPwkccUif3sIy4SAzstpcVBIVMdAEvo746bPWEInA8zJRcgJA== - dependencies: - "@babel/runtime" "^7.13.9" - -"@polkadot/wasm-crypto-wasm@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-4.0.2.tgz#89f9e0a1e4d076784d4a42bea37fc8b06bdd8bb6" - integrity sha512-de/AfNPZ0uDKFWzOZ1rJCtaUbakGN29ks6IRYu6HZTRg7+RtqvE1rIkxabBvYgQVHIesmNwvEA9DlIkS6hYRFQ== - dependencies: - "@babel/runtime" "^7.13.9" - -"@polkadot/wasm-crypto@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-4.0.2.tgz#9649057adee8383cc86433d107ba526b718c5a3b" - integrity sha512-2h9FuQFkBc+B3TwSapt6LtyPvgtd0Hq9QsHW8g8FrmKBFRiiFKYRpfJKHCk0aCZzuRf9h95bQl/X6IXAIWF2ng== - dependencies: - "@babel/runtime" "^7.13.9" - "@polkadot/wasm-crypto-asmjs" "^4.0.2" - "@polkadot/wasm-crypto-wasm" "^4.0.2" - -"@polkadot/x-global@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-6.6.1.tgz#25539a429f16ad786948f5160f3d3cbe05ec00f3" - integrity sha512-3vM+48JMhzIAKr+AM7AU8Jq1Ok3cKHt8BoLZthrJuWJuzpwS6zWVMj0dpOH7bnk3JxM6D5Nwpwci1yxgyz2teA== - dependencies: - "@babel/runtime" "^7.14.0" - "@types/node-fetch" "^2.5.10" - node-fetch "^2.6.1" - -"@polkadot/x-randomvalues@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-6.6.1.tgz#7fd56f664a4f5a37feab27f9d4570814038778ce" - integrity sha512-CT6fhPVqwxTjhv9cohexIMFgSWdBEIXG8QwY1jMgj0YRKj+4UwnEGRwJksPfOPsV4VU0+tknDeMbhu+eqjid3w== - dependencies: - "@babel/runtime" "^7.14.0" - "@polkadot/x-global" "6.6.1" - -"@polkadot/x-textdecoder@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-6.6.1.tgz#2f005df0e21d3d423395659008a95638e445ea27" - integrity sha512-f6ZjD76RmUqi87ioXE8b1kwy3I7L9pDE/9xAeGyucnYQELUtCvz/4Z8NjYJn05aeq1kHg11Fr0p1dHSArTZHUw== - dependencies: - "@babel/runtime" "^7.14.0" - "@polkadot/x-global" "6.6.1" - -"@polkadot/x-textencoder@6.6.1": - version "6.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-6.6.1.tgz#d0678aa001af66561fc1913e76c9704567e3df3d" - integrity sha512-HJt5YpvlHpVHP/8a4+FI2oRRQLK7x/j8RNK/e5vfHE1a3jHcrNm7FbS95KwRlaObPgtFIwR7EIkxXq8PHUl8yA== - dependencies: - "@babel/runtime" "^7.14.0" - "@polkadot/x-global" "6.6.1" - -"@types/bn.js@^4.11.6": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/node-fetch@^2.5.10": - version "2.5.10" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" - integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*": - version "15.6.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.2.tgz#c61d49f38af70da32424b5322eee21f97e627175" - integrity sha512-dxcOx8801kMo3KlU+C+/ctWrzREAH7YvoF3aoVpRdqgs+Kf7flp+PJDN/EX5bME3suDUZHsxes9hpvBmzYlWbA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -base-x@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -blakejs@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" - integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -cipher-base@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ip-regex@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== - -mime-types@^2.1.12: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== - dependencies: - mime-db "1.48.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -node-fetch@^2.6.1: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - -ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - -sha.js@^2.4.0: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -xxhashjs@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" - integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== - dependencies: - cuint "^0.2.2" diff --git a/cumulus/scripts/generate_hex_encoded_call/index.js b/cumulus/scripts/generate_hex_encoded_call/index.js deleted file mode 100644 index 25e094df9053..000000000000 --- a/cumulus/scripts/generate_hex_encoded_call/index.js +++ /dev/null @@ -1,148 +0,0 @@ -const fs = require("fs"); -const { exit } = require("process"); -const { WsProvider, ApiPromise } = require("@polkadot/api"); -const util = require("@polkadot/util"); - -// connect to a substrate chain and return the api object -async function connect(endpoint, types = {}) { - const provider = new WsProvider(endpoint); - const api = await ApiPromise.create({ - provider, - types, - throwOnConnect: false, - }); - return api; -} - -function writeHexEncodedBytesToOutput(method, outputFile) { - console.log("Payload (hex): ", method.toHex()); - console.log("Payload (bytes): ", Array.from(method.toU8a())); - console.log("Payload (plain): ", JSON.stringify(method)); - fs.writeFileSync(outputFile, JSON.stringify(Array.from(method.toU8a()))); -} - -function remarkWithEvent(endpoint, outputFile) { - console.log(`Generating remarkWithEvent from RPC endpoint: ${endpoint} to outputFile: ${outputFile}`); - connect(endpoint) - .then((api) => { - const call = api.tx.system.remarkWithEvent("Hello"); - writeHexEncodedBytesToOutput(call.method, outputFile); - exit(0); - }) - .catch((e) => { - console.error(e); - exit(1); - }); -} - -function addExporterConfig(endpoint, outputFile, bridgedNetwork, bridgeConfig) { - console.log(`Generating addExporterConfig from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on bridgedNetwork: ${bridgedNetwork}, bridgeConfig: ${bridgeConfig}`); - connect(endpoint) - .then((api) => { - const call = api.tx.bridgeTransfer.addExporterConfig(bridgedNetwork, JSON.parse(bridgeConfig)); - writeHexEncodedBytesToOutput(call.method, outputFile); - exit(0); - }) - .catch((e) => { - console.error(e); - exit(1); - }); -} - -function addUniversalAlias(endpoint, outputFile, location, junction) { - console.log(`Generating addUniversalAlias from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on location: ${location}, junction: ${junction}`); - connect(endpoint) - .then((api) => { - const call = api.tx.bridgeTransfer.addUniversalAlias(JSON.parse(location), JSON.parse(junction)); - writeHexEncodedBytesToOutput(call.method, outputFile); - exit(0); - }) - .catch((e) => { - console.error(e); - exit(1); - }); -} - -function addReserveLocation(endpoint, outputFile, reserve_location) { - console.log(`Generating addReserveLocation from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on reserve_location: ${reserve_location}`); - connect(endpoint) - .then((api) => { - const call = api.tx.bridgeTransfer.addReserveLocation(JSON.parse(reserve_location)); - writeHexEncodedBytesToOutput(call.method, outputFile); - exit(0); - }) - .catch((e) => { - console.error(e); - exit(1); - }); -} - -function removeExporterConfig(endpoint, outputFile, bridgedNetwork) { - console.log(`Generating removeExporterConfig from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on bridgedNetwork: ${bridgedNetwork}`); - connect(endpoint) - .then((api) => { - const call = api.tx.bridgeTransfer.removeExporterConfig(bridgedNetwork); - writeHexEncodedBytesToOutput(call.method, outputFile); - exit(0); - }) - .catch((e) => { - console.error(e); - exit(1); - }); -} - -function forceCreateAsset(endpoint, outputFile, assetId, assetOwnerAccountId, isSufficient, minBalance) { - var isSufficient = isSufficient == "true" ? true : false; - console.log(`Generating forceCreateAsset from RPC endpoint: ${endpoint} to outputFile: ${outputFile} based on assetId: ${assetId}, assetOwnerAccountId: ${assetOwnerAccountId}, isSufficient: ${isSufficient}, minBalance: ${minBalance}`); - connect(endpoint) - .then((api) => { - const call = api.tx.foreignAssets.forceCreate(JSON.parse(assetId), assetOwnerAccountId, isSufficient, minBalance); - writeHexEncodedBytesToOutput(call.method, outputFile); - exit(0); - }) - .catch((e) => { - console.error(e); - exit(1); - }); -} - -if (!process.argv[2] || !process.argv[3]) { - console.log("usage: node ./script/generate_hex_encoded_call "); - exit(1); -} - -const type = process.argv[2]; -const rpcEnpoint = process.argv[3]; -const output = process.argv[4]; -const inputArgs = process.argv.slice(5, process.argv.length); -console.log(`Generating hex-encoded call data for:`); -console.log(` type: ${type}`); -console.log(` rpcEnpoint: ${rpcEnpoint}`); -console.log(` output: ${output}`); -console.log(` inputArgs: ${inputArgs}`); - -switch (type) { - case 'remark-with-event': - remarkWithEvent(rpcEnpoint, output); - break; - case 'add-exporter-config': - addExporterConfig(rpcEnpoint, output, inputArgs[0], inputArgs[1]); - break; - case 'remove-exporter-config': - removeExporterConfig(rpcEnpoint, output, inputArgs[0], inputArgs[1]); - break; - case 'add-universal-alias': - addUniversalAlias(rpcEnpoint, output, inputArgs[0], inputArgs[1]); - break; - case 'add-reserve-location': - addReserveLocation(rpcEnpoint, output, inputArgs[0]); - break; - case 'force-create-asset': - forceCreateAsset(rpcEnpoint, output, inputArgs[0], inputArgs[1], inputArgs[2], inputArgs[3]); - break; - case 'check': - console.log(`Checking nodejs installation, if you see this everything is ready!`); - break; - default: - console.log(`Sorry, we are out of ${type} - not yet supported!`); -} diff --git a/cumulus/scripts/generate_hex_encoded_call/package-lock.json b/cumulus/scripts/generate_hex_encoded_call/package-lock.json deleted file mode 100644 index 3383265e7796..000000000000 --- a/cumulus/scripts/generate_hex_encoded_call/package-lock.json +++ /dev/null @@ -1,1213 +0,0 @@ -{ - "name": "y", - "version": "y", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "y", - "version": "y", - "license": "MIT", - "dependencies": { - "@polkadot/api": "^6.5.2", - "@polkadot/util": "^7.6.1" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz", - "integrity": "sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==" - }, - "node_modules/@noble/secp256k1": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.5.5.tgz", - "integrity": "sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@polkadot/api": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-6.12.1.tgz", - "integrity": "sha512-RVdTiA2WaEvproM3i6E9TKS1bfXpPd9Ly9lUG/kVLaspjKoIot9DJUDTl97TJ+7xr8LXGbXqm448Ud0hsEBV8Q==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/api-derive": "6.12.1", - "@polkadot/keyring": "^8.1.2", - "@polkadot/rpc-core": "6.12.1", - "@polkadot/rpc-provider": "6.12.1", - "@polkadot/types": "6.12.1", - "@polkadot/types-known": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "eventemitter3": "^4.0.7", - "rxjs": "^7.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api-derive": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-6.12.1.tgz", - "integrity": "sha512-5LOVlG5EBCT+ytY6aHmQ4RdEWZovZQqRoc6DLd5BLhkR7BFTHKSkLQW+89so8jd0zEtmSXBVPPnsrXS8joM35Q==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/api": "6.12.1", - "@polkadot/rpc-core": "6.12.1", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "rxjs": "^7.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api-derive/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api-derive/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api-derive/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api-derive/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/api-derive/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/api/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/api/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/keyring": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-8.7.1.tgz", - "integrity": "sha512-t6ZgQVC+nQT7XwbWtEhkDpiAzxKVJw8Xd/gWdww6xIrawHu7jo3SGB4QNdPgkf8TvDHYAAJiupzVQYAlOIq3GA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/util": "8.7.1", - "@polkadot/util-crypto": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@polkadot/util": "8.7.1", - "@polkadot/util-crypto": "8.7.1" - } - }, - "node_modules/@polkadot/keyring/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/keyring/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/keyring/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/keyring/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/keyring/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/networks": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-8.7.1.tgz", - "integrity": "sha512-8xAmhDW0ry5EKcEjp6VTuwoTm0DdDo/zHsmx88P6sVL87gupuFsL+B6TrsYLl8GcaqxujwrOlKB+CKTUg7qFKg==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/util": "8.7.1", - "@substrate/ss58-registry": "^1.17.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/networks/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/networks/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/networks/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/networks/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/networks/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/rpc-core": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-6.12.1.tgz", - "integrity": "sha512-Hb08D9zho3SB1UNlUCmG5q0gdgbOx25JKGLDfSYpD/wtD0Y1Sf2X5cfgtMoSYE3USWiRdCu4BxQkXTiRjPjzJg==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/rpc-provider": "6.12.1", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2", - "rxjs": "^7.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/rpc-provider": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-6.12.1.tgz", - "integrity": "sha512-uUHD3fLTOeZYWJoc6DQlhz+MJR33rVelasV+OxFY2nSD9MSNXRwQh+9UKDQBnyxw5B4BZ2QaEGfucDeavXmVDw==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "@polkadot/x-fetch": "^8.1.2", - "@polkadot/x-global": "^8.1.2", - "@polkadot/x-ws": "^8.1.2", - "eventemitter3": "^4.0.7" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/types": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-6.12.1.tgz", - "integrity": "sha512-O37cAGUL0xiXTuO3ySweVh0OuFUD6asrd0TfuzGsEp3jAISWdElEHV5QDiftWq8J9Vf8BMgTcP2QLFbmSusxqA==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/types-known": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "rxjs": "^7.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types-known": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-6.12.1.tgz", - "integrity": "sha512-Z8bHpPQy+mqUm0uR1tai6ra0bQIoPmgRcGFYUM+rJtW1kx/6kZLh10HAICjLpPeA1cwLRzaxHRDqH5MCU6OgXw==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/networks": "^8.1.2", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types-known/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types-known/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types-known/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types-known/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/types-known/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/types/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/types/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/util": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-7.9.2.tgz", - "integrity": "sha512-6ABY6ErgkCsM4C6+X+AJSY4pBGwbKlHZmUtHftaiTvbaj4XuA4nTo3GU28jw8wY0Jh2cJZJvt6/BJ5GVkm5tBA==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/x-textdecoder": "7.9.2", - "@polkadot/x-textencoder": "7.9.2", - "@types/bn.js": "^4.11.6", - "bn.js": "^4.12.0", - "camelcase": "^6.2.1", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/util-crypto": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-8.7.1.tgz", - "integrity": "sha512-TaSuJ2aNrB5sYK7YXszkEv24nYJKRFqjF2OrggoMg6uYxUAECvTkldFnhtgeizMweRMxJIBu6bMHlSIutbWgjw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@noble/hashes": "1.0.0", - "@noble/secp256k1": "1.5.5", - "@polkadot/networks": "8.7.1", - "@polkadot/util": "8.7.1", - "@polkadot/wasm-crypto": "^5.1.1", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-randomvalues": "8.7.1", - "@scure/base": "1.0.0", - "ed2curve": "^0.3.0", - "tweetnacl": "^1.0.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@polkadot/util": "8.7.1" - } - }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/util-crypto/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/util-crypto/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/wasm-crypto": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-5.1.1.tgz", - "integrity": "sha512-JCcAVfH8DhYuEyd4oX1ouByxhou0TvpErKn8kHjtzt7+tRoFi0nzWlmK4z49vszsV3JJgXxV81i10C0BYlwTcQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/wasm-crypto-asmjs": "^5.1.1", - "@polkadot/wasm-crypto-wasm": "^5.1.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@polkadot/util": "*", - "@polkadot/x-randomvalues": "*" - } - }, - "node_modules/@polkadot/wasm-crypto-asmjs": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-5.1.1.tgz", - "integrity": "sha512-1WBwc2G3pZMKW1T01uXzKE30Sg22MXmF3RbbZiWWk3H2d/Er4jZQRpjumxO5YGWan+xOb7HQQdwnrUnrPgbDhg==", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@polkadot/util": "*" - } - }, - "node_modules/@polkadot/wasm-crypto-wasm": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-5.1.1.tgz", - "integrity": "sha512-F9PZ30J2S8vUNl2oY7Myow5Xsx5z5uNVpnNlJwlmY8IXBvyucvyQ4HSdhJsrbs4W1BfFc0mHghxgp0FbBCnf/Q==", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@polkadot/util": "*" - } - }, - "node_modules/@polkadot/x-bigint": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-8.7.1.tgz", - "integrity": "sha512-ClkhgdB/KqcAKk3zA6Qw8wBL6Wz67pYTPkrAtImpvoPJmR+l4RARauv+MH34JXMUNlNb3aUwqN6lq2Z1zN+mJg==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-fetch": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-8.7.1.tgz", - "integrity": "sha512-ygNparcalYFGbspXtdtZOHvNXZBkNgmNO+um9C0JYq74K5OY9/be93uyfJKJ8JcRJtOqBfVDsJpbiRkuJ1PRfg==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1", - "@types/node-fetch": "^2.6.1", - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-global": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-8.7.1.tgz", - "integrity": "sha512-WOgUor16IihgNVdiTVGAWksYLUAlqjmODmIK1cuWrLOZtV1VBomWcb3obkO9sh5P6iWziAvCB/i+L0vnTN9ZCA==", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-randomvalues": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-8.7.1.tgz", - "integrity": "sha512-njt17MlfN6yNyNEti7fL12lr5qM6A1aSGkWKVuqzc7XwSBesifJuW4km5u6r2gwhXjH2eHDv9SoQ7WXu8vrrkg==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-textdecoder": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-7.9.2.tgz", - "integrity": "sha512-wfwbSHXPhrOAl12QvlIOGNkMH/N/h8PId2ytIjvM/8zPPFB5Il6DWSFLtVapOGEpIFjEWbd5t8Td4pHBVXIEbg==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/x-global": "7.9.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-textdecoder/node_modules/@polkadot/x-global": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-7.9.2.tgz", - "integrity": "sha512-JX5CrGWckHf1P9xKXq4vQCAuMUbL81l2hOWX7xeP8nv4caHEpmf5T1wD1iMdQBL5PFifo6Pg0V6/oZBB+bts7A==", - "dependencies": { - "@babel/runtime": "^7.16.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-textencoder": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-7.9.2.tgz", - "integrity": "sha512-A19wwYINuZwU2dUyQ/mMzB0ISjyfc4cISfL4zCMUAVgj7xVoXMYV2GfjNdMpA8Wsjch3su6pxLbtJ2wU03sRTQ==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/x-global": "7.9.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-textencoder/node_modules/@polkadot/x-global": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-7.9.2.tgz", - "integrity": "sha512-JX5CrGWckHf1P9xKXq4vQCAuMUbL81l2hOWX7xeP8nv4caHEpmf5T1wD1iMdQBL5PFifo6Pg0V6/oZBB+bts7A==", - "dependencies": { - "@babel/runtime": "^7.16.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/x-ws": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-8.7.1.tgz", - "integrity": "sha512-Mt0tcNzGXyKnN3DQ06alkv+JLtTfXWu6zSypFrrKHSQe3u79xMQ1nSicmpT3gWLhIa8YF+8CYJXMrqaXgCnDhw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1", - "@types/websocket": "^1.0.5", - "websocket": "^1.0.34" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@scure/base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.0.0.tgz", - "integrity": "sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@substrate/ss58-registry": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.38.0.tgz", - "integrity": "sha512-sHiVRWekGMRZAjPukN9/W166NM6D5wtHcK6RVyLy66kg3CHNZ1BXfpXcjOiXSwhbd7guQFDEwnOVaDrbk1XL1g==" - }, - "node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ed2curve": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", - "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", - "dependencies": { - "tweetnacl": "1.x.x" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "engines": { - "node": ">=0.10.32" - } - } - } -} diff --git a/cumulus/scripts/generate_hex_encoded_call/package.json b/cumulus/scripts/generate_hex_encoded_call/package.json deleted file mode 100644 index 1c68924db244..000000000000 --- a/cumulus/scripts/generate_hex_encoded_call/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "y", - "version": "y", - "description": "create a scale hex-encoded call values from given message", - "main": "index.js", - "license": "MIT", - "dependencies": { - "@polkadot/api": "^6.5.2", - "@polkadot/util": "^7.6.1" - } -} diff --git a/cumulus/scripts/parachains_integration_tests.sh b/cumulus/scripts/parachains_integration_tests.sh deleted file mode 100755 index 2a06b930e22f..000000000000 --- a/cumulus/scripts/parachains_integration_tests.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -tests=( - asset-hub-kusama - asset-hub-polkadot -) - -rm -R logs &> /dev/null - -for t in ${tests[@]} -do - printf "\n🔍 Running $t tests...\n\n" - - mkdir -p logs/$t - - parachains-integration-tests \ - -m zombienet \ - -c ./parachains/integration-tests/$t/config.toml \ - -cl ./logs/$t/chains.log 2> /dev/null & - - parachains-integration-tests \ - -m test \ - -t ./parachains/integration-tests/$t \ - -tl ./logs/$t/tests.log & tests=$! - - wait $tests - - pkill -f polkadot - pkill -f parachain - - printf "\n🎉 $t integration tests finished! \n\n" -done diff --git a/cumulus/scripts/register_parachain.sh b/cumulus/scripts/register_parachain.sh deleted file mode 100755 index 311efee98ff4..000000000000 --- a/cumulus/scripts/register_parachain.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -usage() { - echo Usage: - echo "$0 " - exit 1 -} - -url=$1 -seed=$2 -wasm=$3 -genesis=$4 -parachain_id=$5 -types=$6 # we can remove this once parachain types are included in polkadot-js-api - -[ -z "$url" ] && usage -[ -z "$seed" ] && usage -[ -z "$wasm" ] && usage -[ -z "$types" ] && usage -[ -z "$genesis" ] && usage -[ -z "$parachain_id" ] && usage -if ! [ -r "$wasm" ]; then - echo "Could not read: $wasm" - exit 1 -fi -if ! [ -r "$types" ]; then - echo "Could not read: $types" - exit 1 -fi - -if ! which polkadot-js-api &> /dev/null; then - echo 'command `polkadot-js-api` not in PATH' - echo "npm install -g @polkadot/api-cli@beta" - exit 1 -fi - -set -e -x - -test -f "$seed" && seed="$(cat "$seed")" - -wasm=$(cat $wasm) - -polkadot-js-api \ - --ws "${url?}" \ - --sudo \ - --seed "${seed?}" \ - --types "${types?}" \ - tx.parasSudoWrapper.sudoScheduleParaInitialize \ - "${parachain_id?}" \ - "{ \"genesisHead\":\"${genesis?}\", \"validationCode\":\"${wasm?}\", \"parachain\": true }" \ diff --git a/cumulus/scripts/scale_encode_genesis/index.js b/cumulus/scripts/scale_encode_genesis/index.js deleted file mode 100644 index f612e6da79dd..000000000000 --- a/cumulus/scripts/scale_encode_genesis/index.js +++ /dev/null @@ -1,55 +0,0 @@ -const fs = require("fs"); -const { exit } = require("process"); -const { WsProvider, ApiPromise } = require("@polkadot/api"); -const util = require("@polkadot/util"); - -// Utility script constructing a SCALE-encoded setStorage call from a key-value json array of -// genesis values by connecting to a running instance of the chain. (It is not required to be -// functional or synced.) - -// connect to a substrate chain and return the api object -async function connect(endpoint, types = {}) { - const provider = new WsProvider(endpoint); - const api = await ApiPromise.create({ - provider, - types, - throwOnConnect: false, - }); - return api; -} - -if (!process.argv[2] || !process.argv[3]) { - console.log("usage: node generate_keys [rpc enpoint]"); - exit(); -} - -const input = process.argv[2]; -const output = process.argv[3]; -// default to localhost and the default Substrate port -const rpcEnpoint = process.argv[4] || "ws://localhost:9944"; - -console.log("Processing", input, output); -fs.readFile(input, "utf8", (err, data) => { - if (err) { - console.log(`Error reading file from disk: ${err}`); - exit(1); - } - - const genesis = JSON.parse(data); - - console.log("loaded genesis, length = ", genesis.length); - console.log(`Connecting to RPC endpoint: ${rpcEnpoint}`); - connect(rpcEnpoint) - .then((api) => { - console.log('Connected'); - const setStorage = api.tx.system.setStorage(genesis); - const raw = setStorage.method.toU8a(); - const hex = util.u8aToHex(raw); - fs.writeFileSync(output, hex); - exit(0); - }) - .catch((e) => { - console.error(e); - exit(1); - }); -}); diff --git a/cumulus/scripts/scale_encode_genesis/package.json b/cumulus/scripts/scale_encode_genesis/package.json deleted file mode 100644 index b39c31e0ee9a..000000000000 --- a/cumulus/scripts/scale_encode_genesis/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "y", - "version": "y", - "description": "create a scale encoded tx for the genesis values", - "main": "index.js", - "license": "MIT", - "dependencies": { - "@polkadot/api": "^6.5.2", - "@polkadot/util": "^7.6.1" - } -} diff --git a/cumulus/scripts/scale_encode_genesis/yarn.lock b/cumulus/scripts/scale_encode_genesis/yarn.lock deleted file mode 100644 index 3259112036af..000000000000 --- a/cumulus/scripts/scale_encode_genesis/yarn.lock +++ /dev/null @@ -1,634 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.15.3", "@babel/runtime@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== - dependencies: - regenerator-runtime "^0.13.4" - -"@polkadot/api-derive@6.5.2": - version "6.5.2" - resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-6.5.2.tgz#1c14c4cda13bab958b55ce8973aed2a4388d400d" - integrity sha512-QD7xegHVLIrDxbuBiAF4wGzqXc/pXsfwTLpkVW1bT7Aa8pXWVTdahh4HCcgOq7c1i01QS2lQE21/4SSLG7KzUA== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/api" "6.5.2" - "@polkadot/rpc-core" "6.5.2" - "@polkadot/types" "6.5.2" - "@polkadot/util" "^7.6.1" - "@polkadot/util-crypto" "^7.6.1" - rxjs "^7.4.0" - -"@polkadot/api@6.5.2", "@polkadot/api@^6.5.2": - version "6.5.2" - resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-6.5.2.tgz#40a2a2545cc3be19ce35b4c4b688c0a2055576bd" - integrity sha512-UNR8pynzPzS1GxpCoLh2a/iPf9lPYY03q0ZLZG/qYYFR+njeD7/4B5e+yEMHIDKS/+XAvM5zXDEbEtxHMiCR9A== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/api-derive" "6.5.2" - "@polkadot/keyring" "^7.6.1" - "@polkadot/rpc-core" "6.5.2" - "@polkadot/rpc-provider" "6.5.2" - "@polkadot/types" "6.5.2" - "@polkadot/types-known" "6.5.2" - "@polkadot/util" "^7.6.1" - "@polkadot/util-crypto" "^7.6.1" - eventemitter3 "^4.0.7" - rxjs "^7.4.0" - -"@polkadot/keyring@^7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-7.6.1.tgz#a138e417cbbf85b3f0f66af66f5cd40735ba24a1" - integrity sha512-lpbTHAQqae++cvaNfuCjdz2xbNrk0ZSGCM8w08Br6NIz8NyrwR/qm1PfV75leoLq/Qx58+aj8v2qANEBOVz4vQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/util" "7.6.1" - "@polkadot/util-crypto" "7.6.1" - -"@polkadot/networks@7.6.1", "@polkadot/networks@^7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-7.6.1.tgz#d7ca346a3c15b29c9286ccbc67b1438bf9c8130e" - integrity sha512-76RdEVy+G14P13oxSe3+VDwFdVYRNVAy7xi9ESJBRZFnQC/TIL2rOeg7Gq5+HP/mkgzG4gL5X30VdE+aKzokpA== - dependencies: - "@babel/runtime" "^7.15.4" - -"@polkadot/rpc-core@6.5.2": - version "6.5.2" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-6.5.2.tgz#4dbdf39974284df9f0cc6897654c91b05db66482" - integrity sha512-ZZRUQqizqH2E4OZ61C1T78KnWm2OiewIZt0SomB5s7zc7ixwcvFltjlWdiuQspG2m4VMb46jFy3pVdkycgrMfg== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/rpc-provider" "6.5.2" - "@polkadot/types" "6.5.2" - "@polkadot/util" "^7.6.1" - rxjs "^7.4.0" - -"@polkadot/rpc-provider@6.5.2": - version "6.5.2" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-6.5.2.tgz#359ba68ef5c171191bdd10867e99d3c7b7d71cc5" - integrity sha512-MFphpbI9zsYKGFb2mXkeOhWRiyDZxKYTyViVB5kE0YeMMl1DHR3YVfjR6t+K5H1A++iwh3xilkyZ8imcfTK/BQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/types" "6.5.2" - "@polkadot/util" "^7.6.1" - "@polkadot/util-crypto" "^7.6.1" - "@polkadot/x-fetch" "^7.6.1" - "@polkadot/x-global" "^7.6.1" - "@polkadot/x-ws" "^7.6.1" - eventemitter3 "^4.0.7" - -"@polkadot/types-known@6.5.2": - version "6.5.2" - resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-6.5.2.tgz#a5b3afe7ddf9fc4a87f1b391d6d7058eb4e03ae0" - integrity sha512-5mFcsAJDL10pwTRI2ODNYvzeB1pQsSbYakI323BkA9iWxNSDYgHNU9prgEAnbO6VXP31HMX86ZDGhEm/XpGo4A== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/networks" "^7.6.1" - "@polkadot/types" "6.5.2" - "@polkadot/util" "^7.6.1" - -"@polkadot/types@6.5.2": - version "6.5.2" - resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-6.5.2.tgz#76f5fb1b35ae20530554869b9a859811b4048b28" - integrity sha512-QDE5SxyW/Veq0IB8zT0RaBJTedmVkxhR8EykwslJiRuHSBz/HZjtEhcnA44c8fdKWKkbURklbX2vlWd7d2w4jQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/util" "^7.6.1" - "@polkadot/util-crypto" "^7.6.1" - rxjs "^7.4.0" - -"@polkadot/util-crypto@7.6.1", "@polkadot/util-crypto@^7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-7.6.1.tgz#3e40270e9dce7885d92d0992aef9761feb57f2e2" - integrity sha512-5lLEfexkYOc73jitwC4K/Ll3JNA8Hdo2aU3GSOkDah8bBpm02djD7ypwfmuWRJw0UDyTgY67g0SXn4frPcQiag== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/networks" "7.6.1" - "@polkadot/util" "7.6.1" - "@polkadot/wasm-crypto" "^4.2.1" - "@polkadot/x-randomvalues" "7.6.1" - base-x "^3.0.9" - base64-js "^1.5.1" - blakejs "^1.1.1" - bn.js "^4.12.0" - create-hash "^1.2.0" - ed2curve "^0.3.0" - elliptic "^6.5.4" - hash.js "^1.1.7" - js-sha3 "^0.8.0" - scryptsy "^2.1.0" - tweetnacl "^1.0.3" - xxhashjs "^0.2.2" - -"@polkadot/util@7.6.1", "@polkadot/util@^7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-7.6.1.tgz#e6988124728fdf053929022827216241dd50a6fa" - integrity sha512-96UgzMOxwwsndGHN4aoyPYVRXpHcVpYb4zngFH2O9ma0YxrG2HhhqqoJ5pS0OUlhvcQkVz6T6t+heGFnTkvQxw== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/x-textdecoder" "7.6.1" - "@polkadot/x-textencoder" "7.6.1" - "@types/bn.js" "^4.11.6" - bn.js "^4.12.0" - camelcase "^6.2.0" - ip-regex "^4.3.0" - -"@polkadot/wasm-crypto-asmjs@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-4.2.1.tgz#6b7eae1c011709f8042dfd30872a5fc5e9e021c0" - integrity sha512-ON9EBpTNDCI3QRUmuQJIegYoAcwvxDaNNA7uwKTaEEStu8LjCIbQxbt4WbOBYWI0PoUpl4iIluXdT3XZ3V3jXA== - dependencies: - "@babel/runtime" "^7.15.3" - -"@polkadot/wasm-crypto-wasm@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-4.2.1.tgz#2a86f9b405e7195c3f523798c6ce4afffd19737e" - integrity sha512-Rs2CKiR4D+2hKzmKBfPNYxcd2E8NfLWia0av4fgicjT9YsWIWOGQUi9AtSOfazPOR9FrjxKJy+chQxAkcfKMnQ== - dependencies: - "@babel/runtime" "^7.15.3" - -"@polkadot/wasm-crypto@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-4.2.1.tgz#4d09402f5ac71a90962fb58cbe4b1707772a4fb6" - integrity sha512-C/A/QnemOilRTLnM0LfhPY2N/x3ZFd1ihm9sXYyuh98CxtekSVYI9h4IJ5Jrgz5imSUHgvt9oJLqJ5GbWQV/Zg== - dependencies: - "@babel/runtime" "^7.15.3" - "@polkadot/wasm-crypto-asmjs" "^4.2.1" - "@polkadot/wasm-crypto-wasm" "^4.2.1" - -"@polkadot/x-fetch@^7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-7.6.1.tgz#fda1a89bbb584217f96c2d3c3a3ce0f10a454436" - integrity sha512-CdjCg7BGhKfKNntUiK9vFOoum44o86TInPpqNumLGWAZmqI+kU0DCUDtqcw7uFOdZL1j/3GHdXigJ6LL1TnNcg== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/x-global" "7.6.1" - "@types/node-fetch" "^2.5.12" - node-fetch "^2.6.5" - -"@polkadot/x-global@7.6.1", "@polkadot/x-global@^7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-7.6.1.tgz#f43a61d40bfaf2f43f9a4ef39e01a24546768394" - integrity sha512-jKPNFHiC0yIc6TfqZtopaqsW3pDun1uh9lp0kcDkfOYozwwN1NVXWLClDBa2C5UiKU/jxA3biYiNZUyZpbV13g== - dependencies: - "@babel/runtime" "^7.15.4" - -"@polkadot/x-randomvalues@7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-7.6.1.tgz#0cd143cf976e36f5c9fcf53ba41fd5fffca95c44" - integrity sha512-hfSMBeMZTrnuejv/oXp3tMZARTOGyQZ3G0GW44dV2fR2L1+tlLj9VuXgVGgupNBq7AC6eSfE3XhJwCGyH5FhmQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/x-global" "7.6.1" - -"@polkadot/x-textdecoder@7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-7.6.1.tgz#7e80b512f1ddfd01f243dbbe8afc9dab7d0c6c85" - integrity sha512-sJtQMMw+jO3CwpOf0t1hrVl3xMw1BOLs/Xjd0v/yhiTAJ1rr6dqvhcnOHkU3a7udqo7G9dXDrnGi1q3efifXPw== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/x-global" "7.6.1" - -"@polkadot/x-textencoder@7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-7.6.1.tgz#2a2fb4baa13889fbc53b86ce9003de748f0df2aa" - integrity sha512-iqOGwXJIzc8rWYLPTYcO09LwA2q4fqwJhLsLCd+p13Z0yDSUvwgq785/2WEQfhSFbMd8HM6udedqrQTpnpIujg== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/x-global" "7.6.1" - -"@polkadot/x-ws@^7.6.1": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-7.6.1.tgz#60c86cfb43935b38a6512f3e7bab362ffe6bec1f" - integrity sha512-nP8vHlL17SIuVinphuVbj2o3mfRWUTJqlhAYlA5RjO/sZ9TwYMvGTvL/1bOAfWdp/l451WLEWJtzSipzrVGBsg== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/x-global" "7.6.1" - "@types/websocket" "^1.0.4" - websocket "^1.0.34" - -"@types/bn.js@^4.11.6": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/node-fetch@^2.5.12": - version "2.5.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" - integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node@*": - version "16.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" - integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== - -"@types/websocket@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8" - integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA== - dependencies: - "@types/node" "*" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -base-x@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -blakejs@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" - integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== - -bn.js@^4.11.9, bn.js@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -bufferutil@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" - integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== - dependencies: - node-gyp-build "^4.3.0" - -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -cipher-base@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -ed2curve@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ed2curve/-/ed2curve-0.3.0.tgz#322b575152a45305429d546b071823a93129a05d" - integrity sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ== - dependencies: - tweetnacl "1.x.x" - -elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ip-regex@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mime-db@1.50.0: - version "1.50.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" - integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== - -mime-types@^2.1.12: - version "2.1.33" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" - integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== - dependencies: - mime-db "1.50.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -node-fetch@^2.6.5: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" - integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rxjs@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" - integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== - dependencies: - tslib "~2.1.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - -sha.js@^2.4.0: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -tslib@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== - -tweetnacl@1.x.x, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -utf-8-validate@^5.0.2: - version "5.0.7" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" - integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== - dependencies: - node-gyp-build "^4.3.0" - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -websocket@^1.0.34: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -xxhashjs@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" - integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== - dependencies: - cuint "^0.2.2" - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= diff --git a/cumulus/scripts/temp_parachain_types.json b/cumulus/scripts/temp_parachain_types.json deleted file mode 100644 index f550a6774450..000000000000 --- a/cumulus/scripts/temp_parachain_types.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "HrmpChannelId": { - "sender": "u32", - "receiver": "u32" - }, - "SignedAvailabilityBitfield": { - "payload": "BitVec", - "validator_index": "u32", - "signature": "Signature" - }, - "SignedAvailabilityBitfields": "Vec", - "ValidatorSignature": "Signature", - "HeadData": "Vec", - "CandidateDescriptor": { - "para_id": "u32", - "relay_parent": "Hash", - "collator_id": "Hash", - "persisted_validation_data_hash": "Hash", - "pov_hash": "Hash", - "erasure_root": "Hash", - "signature": "Signature" - }, - "CandidateReceipt": { - "descriptor": "CandidateDescriptor", - "commitments_hash": "Hash" - }, - "UpwardMessage": "Vec", - "OutboundHrmpMessage": { - "recipient": "u32", - "data": "Vec" - }, - "ValidationCode": "Vec", - "CandidateCommitments": { - "upward_messages": "Vec", - "horizontal_messages": "Vec", - "new_validation_code": "Option", - "head_data": "HeadData", - "processed_downward_messages": "u32", - "hrmp_watermark": "BlockNumber" - }, - "CommittedCandidateReceipt": { - "descriptor": "CandidateDescriptor", - "commitments": "CandidateCommitments" - }, - "ValidityAttestation": { - "_enum": { - "DummyOffsetBy1": "Raw", - "Implicit": "ValidatorSignature", - "Explicit": "ValidatorSignature" - } - }, - "BackedCandidate": { - "candidate": "CommittedCandidateReceipt", - "validity_votes": "Vec", - "validator_indices": "BitVec" - }, - "CandidatePendingAvailablility": { - "core": "u32", - "descriptor": "CandidateDescriptor", - "availability_votes": "BitVec", - "relay_parent_number": "BlockNumber", - "backed_in_number": "BlockNumber" - } -} diff --git a/cumulus/templates/xcm-bench-template.hbs b/cumulus/templates/xcm-bench-template.hbs deleted file mode 100644 index 5d0ded403f63..000000000000 --- a/cumulus/templates/xcm-bench-template.hbs +++ /dev/null @@ -1,63 +0,0 @@ -{{header}} -//! Autogenerated weights for `{{pallet}}` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION {{version}} -//! DATE: {{date}}, STEPS: `{{cmd.steps}}`, REPEAT: `{{cmd.repeat}}`, LOW RANGE: `{{cmd.lowest_range_values}}`, HIGH RANGE: `{{cmd.highest_range_values}}` -//! WORST CASE MAP SIZE: `{{cmd.worst_case_map_values}}` -//! HOSTNAME: `{{hostname}}`, CPU: `{{cpuname}}` -//! WASM-EXECUTION: {{cmd.wasm_execution}}, CHAIN: {{cmd.chain}}, DB CACHE: {{cmd.db_cache}} - -// Executed Command: -{{#each args as |arg|}} -// {{arg}} -{{/each}} - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] - -use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; - -/// Weights for `{{pallet}}`. -pub struct WeightInfo(PhantomData); -impl WeightInfo { - {{#each benchmarks as |benchmark|}} - {{#each benchmark.comments as |comment|}} - // {{comment}} - {{/each}} - {{#each benchmark.component_ranges as |range|}} - /// The range of component `{{range.name}}` is `[{{range.min}}, {{range.max}}]`. - {{/each}} - pub fn {{benchmark.name~}} - ( - {{~#each benchmark.components as |c| ~}} - {{~#if (not c.is_used)}}_{{/if}}{{c.name}}: u32, {{/each~}} - ) -> Weight { - // Proof Size summary in bytes: - // Measured: `{{benchmark.base_recorded_proof_size}}{{#each benchmark.component_recorded_proof_size as |cp|}} + {{cp.name}} * ({{cp.slope}} ±{{underscore cp.error}}){{/each}}` - // Estimated: `{{benchmark.base_calculated_proof_size}}{{#each benchmark.component_calculated_proof_size as |cp|}} + {{cp.name}} * ({{cp.slope}} ±{{underscore cp.error}}){{/each}}` - // Minimum execution time: {{underscore benchmark.min_execution_time}}_000 picoseconds. - Weight::from_parts({{underscore benchmark.base_weight}}, {{benchmark.base_calculated_proof_size}}) - {{#each benchmark.component_weight as |cw|}} - // Standard Error: {{underscore cw.error}} - .saturating_add(Weight::from_parts({{underscore cw.slope}}, 0).saturating_mul({{cw.name}}.into())) - {{/each}} - {{#if (ne benchmark.base_reads "0")}} - .saturating_add(T::DbWeight::get().reads({{benchmark.base_reads}})) - {{/if}} - {{#each benchmark.component_reads as |cr|}} - .saturating_add(T::DbWeight::get().reads(({{cr.slope}}_u64).saturating_mul({{cr.name}}.into()))) - {{/each}} - {{#if (ne benchmark.base_writes "0")}} - .saturating_add(T::DbWeight::get().writes({{benchmark.base_writes}})) - {{/if}} - {{#each benchmark.component_writes as |cw|}} - .saturating_add(T::DbWeight::get().writes(({{cw.slope}}_u64).saturating_mul({{cw.name}}.into()))) - {{/each}} - {{#each benchmark.component_calculated_proof_size as |cp|}} - .saturating_add(Weight::from_parts(0, {{cp.slope}}).saturating_mul({{cp.name}}.into())) - {{/each}} - } - {{/each}} -} diff --git a/cumulus/test/client/Cargo.toml b/cumulus/test/client/Cargo.toml deleted file mode 100644 index 807d83d4894b..000000000000 --- a/cumulus/test/client/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "cumulus-test-client" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } - -# Substrate -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor-common = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-test-runtime = { path = "../runtime" } -cumulus-test-service = { path = "../service" } -cumulus-test-relay-sproof-builder = { path = "../relay-sproof-builder" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } diff --git a/cumulus/test/client/src/block_builder.rs b/cumulus/test/client/src/block_builder.rs deleted file mode 100644 index 06c7416be67f..000000000000 --- a/cumulus/test/client/src/block_builder.rs +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use crate::{Backend, Client}; -use cumulus_primitives_core::{ParachainBlockData, PersistedValidationData}; -use cumulus_primitives_parachain_inherent::{ParachainInherentData, INHERENT_IDENTIFIER}; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use cumulus_test_runtime::{Block, GetLastTimestamp, Hash, Header}; -use polkadot_primitives::{BlockNumber as PBlockNumber, Hash as PHash}; -use sc_block_builder::{BlockBuilder, BlockBuilderProvider}; -use sp_api::ProvideRuntimeApi; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; - -/// An extension for the Cumulus test client to init a block builder. -pub trait InitBlockBuilder { - /// Init a specific block builder that works for the test runtime. - /// - /// This will automatically create and push the inherents for you to make the block - /// valid for the test runtime. - /// - /// You can use the relay chain state sproof builder to arrange required relay chain state or - /// just use a default one. - fn init_block_builder( - &self, - validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, - ) -> sc_block_builder::BlockBuilder; - - /// Init a specific block builder at a specific block that works for the test runtime. - /// - /// Same as [`InitBlockBuilder::init_block_builder`] besides that it takes a - /// [`type@Hash`] to say which should be the parent block of the block that is being build. - fn init_block_builder_at( - &self, - at: Hash, - validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, - ) -> sc_block_builder::BlockBuilder; - - /// Init a specific block builder that works for the test runtime. - /// - /// Same as [`InitBlockBuilder::init_block_builder`] besides that it takes a - /// [`type@Hash`] to say which should be the parent block of the block that is being build and - /// it will use the given `timestamp` as input for the timestamp inherent. - fn init_block_builder_with_timestamp( - &self, - at: Hash, - validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, - timestamp: u64, - ) -> sc_block_builder::BlockBuilder; -} - -fn init_block_builder( - client: &Client, - at: Hash, - validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, - timestamp: u64, -) -> BlockBuilder<'_, Block, Client, Backend> { - let mut block_builder = client - .new_block_at(at, Default::default(), true) - .expect("Creates new block builder for test runtime"); - - let mut inherent_data = sp_inherents::InherentData::new(); - - inherent_data - .put_data(sp_timestamp::INHERENT_IDENTIFIER, ×tamp) - .expect("Put timestamp failed"); - - let (relay_parent_storage_root, relay_chain_state) = - relay_sproof_builder.into_state_root_and_proof(); - - let mut validation_data = validation_data.unwrap_or_default(); - assert_eq!( - validation_data.relay_parent_storage_root, - Default::default(), - "Overriding the relay storage root is not implemented", - ); - validation_data.relay_parent_storage_root = relay_parent_storage_root; - - inherent_data - .put_data( - INHERENT_IDENTIFIER, - &ParachainInherentData { - validation_data, - relay_chain_state, - downward_messages: Default::default(), - horizontal_messages: Default::default(), - }, - ) - .expect("Put validation function params failed"); - - let inherents = block_builder.create_inherents(inherent_data).expect("Creates inherents"); - - inherents - .into_iter() - .for_each(|ext| block_builder.push(ext).expect("Pushes inherent")); - - block_builder -} - -impl InitBlockBuilder for Client { - fn init_block_builder( - &self, - validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, - ) -> BlockBuilder { - let chain_info = self.chain_info(); - self.init_block_builder_at(chain_info.best_hash, validation_data, relay_sproof_builder) - } - - fn init_block_builder_at( - &self, - at: Hash, - validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, - ) -> BlockBuilder { - let last_timestamp = self.runtime_api().get_last_timestamp(at).expect("Get last timestamp"); - - let timestamp = last_timestamp + cumulus_test_runtime::MinimumPeriod::get(); - - init_block_builder(self, at, validation_data, relay_sproof_builder, timestamp) - } - - fn init_block_builder_with_timestamp( - &self, - at: Hash, - validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, - timestamp: u64, - ) -> sc_block_builder::BlockBuilder { - init_block_builder(self, at, validation_data, relay_sproof_builder, timestamp) - } -} - -/// Extension trait for the [`BlockBuilder`](sc_block_builder::BlockBuilder) to build directly a -/// [`ParachainBlockData`]. -pub trait BuildParachainBlockData { - /// Directly build the [`ParachainBlockData`] from the block that comes out of the block - /// builder. - fn build_parachain_block(self, parent_state_root: Hash) -> ParachainBlockData; -} - -impl<'a> BuildParachainBlockData for sc_block_builder::BlockBuilder<'a, Block, Client, Backend> { - fn build_parachain_block(self, parent_state_root: Hash) -> ParachainBlockData { - let built_block = self.build().expect("Builds the block"); - - let storage_proof = built_block - .proof - .expect("We enabled proof recording before.") - .into_compact_proof::<
::Hashing>(parent_state_root) - .expect("Creates the compact proof"); - - let (header, extrinsics) = built_block.block.deconstruct(); - ParachainBlockData::new(header, extrinsics, storage_proof) - } -} diff --git a/cumulus/test/client/src/lib.rs b/cumulus/test/client/src/lib.rs deleted file mode 100644 index 9660a99c3594..000000000000 --- a/cumulus/test/client/src/lib.rs +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! A Cumulus test client. - -mod block_builder; -use codec::{Decode, Encode}; -use runtime::{ - Balance, Block, BlockHashCount, Runtime, RuntimeCall, RuntimeGenesisConfig, Signature, - SignedExtra, SignedPayload, UncheckedExtrinsic, VERSION, -}; -use sc_executor::HeapAllocStrategy; -use sc_executor_common::runtime_blob::RuntimeBlob; -use sp_blockchain::HeaderBackend; -use sp_core::{sr25519, Pair}; -use sp_io::TestExternalities; -use sp_runtime::{generic::Era, BuildStorage, SaturatedConversion}; - -pub use block_builder::*; -pub use cumulus_test_runtime as runtime; -pub use polkadot_parachain::primitives::{BlockData, HeadData, ValidationParams, ValidationResult}; -pub use sc_executor::error::Result as ExecutorResult; -pub use substrate_test_client::*; - -pub type ParachainBlockData = cumulus_primitives_core::ParachainBlockData; - -mod local_executor { - /// Native executor instance. - pub struct LocalExecutor; - - impl sc_executor::NativeExecutionDispatch for LocalExecutor { - type ExtendHostFunctions = (); - - fn dispatch(method: &str, data: &[u8]) -> Option> { - cumulus_test_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - cumulus_test_runtime::native_version() - } - } -} - -/// Native executor used for tests. -pub use local_executor::LocalExecutor; - -/// Test client database backend. -pub type Backend = substrate_test_client::Backend; - -/// Test client executor. -pub type Executor = - client::LocalCallExecutor>; - -/// Test client builder for Cumulus -pub type TestClientBuilder = - substrate_test_client::TestClientBuilder; - -/// LongestChain type for the test runtime/client. -pub type LongestChain = sc_consensus::LongestChain; - -/// Test client type with `LocalExecutor` and generic Backend. -pub type Client = client::Client; - -/// Parameters of test-client builder with test-runtime. -#[derive(Default)] -pub struct GenesisParameters { - pub endowed_accounts: Vec, -} - -impl substrate_test_client::GenesisInit for GenesisParameters { - fn genesis_storage(&self) -> Storage { - if self.endowed_accounts.is_empty() { - genesis_config().build_storage().unwrap() - } else { - cumulus_test_service::testnet_genesis( - cumulus_test_service::get_account_id_from_seed::("Alice"), - self.endowed_accounts.clone(), - ) - .build_storage() - .unwrap() - } - } -} - -/// A `test-runtime` extensions to `TestClientBuilder`. -pub trait TestClientBuilderExt: Sized { - /// Build the test client. - fn build(self) -> Client { - self.build_with_longest_chain().0 - } - - /// Build the test client and longest chain selector. - fn build_with_longest_chain(self) -> (Client, LongestChain); -} - -impl TestClientBuilderExt for TestClientBuilder { - fn build_with_longest_chain(self) -> (Client, LongestChain) { - self.build_with_native_executor(None) - } -} - -/// A `TestClientBuilder` with default backend and executor. -pub trait DefaultTestClientBuilderExt: Sized { - /// Create new `TestClientBuilder` - fn new() -> Self; -} - -impl DefaultTestClientBuilderExt for TestClientBuilder { - fn new() -> Self { - Self::with_default_backend() - } -} - -fn genesis_config() -> RuntimeGenesisConfig { - cumulus_test_service::testnet_genesis_with_default_endowed(Default::default()) -} - -/// Create an unsigned extrinsic from a runtime call. -pub fn generate_unsigned(function: impl Into) -> UncheckedExtrinsic { - UncheckedExtrinsic::new_unsigned(function.into()) -} - -/// Create a signed extrinsic from a runtime call and sign -/// with the given key pair. -pub fn generate_extrinsic_with_pair( - client: &Client, - origin: sp_core::sr25519::Pair, - function: impl Into, - nonce: Option, -) -> UncheckedExtrinsic { - let current_block_hash = client.info().best_hash; - let current_block = client.info().best_number.saturated_into(); - let genesis_block = client.hash(0).unwrap().unwrap(); - let nonce = nonce.unwrap_or_default(); - let period = - BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64; - let tip = 0; - let extra: SignedExtra = ( - frame_system::CheckNonZeroSender::::new(), - frame_system::CheckSpecVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(Era::mortal(period, current_block)), - frame_system::CheckNonce::::from(nonce), - frame_system::CheckWeight::::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - ); - - let function = function.into(); - - let raw_payload = SignedPayload::from_raw( - function.clone(), - extra.clone(), - ((), VERSION.spec_version, genesis_block, current_block_hash, (), (), ()), - ); - let signature = raw_payload.using_encoded(|e| origin.sign(e)); - - UncheckedExtrinsic::new_signed( - function, - origin.public().into(), - Signature::Sr25519(signature), - extra, - ) -} - -/// Generate an extrinsic from the provided function call, origin and [`Client`]. -pub fn generate_extrinsic( - client: &Client, - origin: sp_keyring::AccountKeyring, - function: impl Into, -) -> UncheckedExtrinsic { - generate_extrinsic_with_pair(client, origin.into(), function, None) -} - -/// Transfer some token from one account to another using a provided test [`Client`]. -pub fn transfer( - client: &Client, - origin: sp_keyring::AccountKeyring, - dest: sp_keyring::AccountKeyring, - value: Balance, -) -> UncheckedExtrinsic { - let function = RuntimeCall::Balances(pallet_balances::Call::transfer_allow_death { - dest: dest.public().into(), - value, - }); - - generate_extrinsic(client, origin, function) -} - -/// Call `validate_block` in the given `wasm_blob`. -pub fn validate_block( - validation_params: ValidationParams, - wasm_blob: &[u8], -) -> ExecutorResult { - let mut ext = TestExternalities::default(); - let mut ext_ext = ext.ext(); - - let heap_pages = HeapAllocStrategy::Static { extra_pages: 1024 }; - let executor = WasmExecutor::::builder() - .with_execution_method(WasmExecutionMethod::default()) - .with_max_runtime_instances(1) - .with_runtime_cache_size(2) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) - .build(); - - executor - .uncached_call( - RuntimeBlob::uncompress_if_needed(wasm_blob).expect("RuntimeBlob uncompress & parse"), - &mut ext_ext, - false, - "validate_block", - &validation_params.encode(), - ) - .map(|v| ValidationResult::decode(&mut &v[..]).expect("Decode `ValidationResult`.")) -} diff --git a/cumulus/test/relay-sproof-builder/Cargo.toml b/cumulus/test/relay-sproof-builder/Cargo.toml deleted file mode 100644 index 32e12ee25ccd..000000000000 --- a/cumulus/test/relay-sproof-builder/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "cumulus-test-relay-sproof-builder" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ "derive" ] } - -# Substrate -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "sp-runtime/std", - "sp-state-machine/std", - "sp-std/std", - "cumulus-primitives-core/std", -] diff --git a/cumulus/test/relay-sproof-builder/src/lib.rs b/cumulus/test/relay-sproof-builder/src/lib.rs deleted file mode 100644 index bcd02f791f8e..000000000000 --- a/cumulus/test/relay-sproof-builder/src/lib.rs +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use cumulus_primitives_core::{ - relay_chain, AbridgedHostConfiguration, AbridgedHrmpChannel, ParaId, -}; -use polkadot_primitives::UpgradeGoAhead; -use sp_runtime::traits::HashingFor; -use sp_state_machine::MemoryDB; -use sp_std::collections::btree_map::BTreeMap; - -/// Builds a sproof (portmanteau of 'spoof' and 'proof') of the relay chain state. -#[derive(Clone)] -pub struct RelayStateSproofBuilder { - /// The para id of the current parachain. - /// - /// This doesn't get into the storage proof produced by the builder, however, it is used for - /// generation of the storage image and by auxiliary methods. - /// - /// It's recommended to change this value once in the very beginning of usage. - /// - /// The default value is 200. - pub para_id: ParaId, - - pub host_config: AbridgedHostConfiguration, - pub dmq_mqc_head: Option, - pub upgrade_go_ahead: Option, - pub relay_dispatch_queue_remaining_capacity: Option<(u32, u32)>, - pub hrmp_ingress_channel_index: Option>, - pub hrmp_egress_channel_index: Option>, - pub hrmp_channels: BTreeMap, - pub current_slot: relay_chain::Slot, - pub current_epoch: u64, - pub randomness: relay_chain::Hash, - pub additional_key_values: Vec<(Vec, Vec)>, -} - -impl Default for RelayStateSproofBuilder { - fn default() -> Self { - RelayStateSproofBuilder { - para_id: ParaId::from(200), - host_config: cumulus_primitives_core::AbridgedHostConfiguration { - max_code_size: 2 * 1024 * 1024, - max_head_data_size: 1024 * 1024, - max_upward_queue_count: 8, - max_upward_queue_size: 1024, - max_upward_message_size: 256, - max_upward_message_num_per_candidate: 5, - hrmp_max_message_num_per_candidate: 5, - validation_upgrade_cooldown: 6, - validation_upgrade_delay: 6, - }, - dmq_mqc_head: None, - upgrade_go_ahead: None, - relay_dispatch_queue_remaining_capacity: None, - hrmp_ingress_channel_index: None, - hrmp_egress_channel_index: None, - hrmp_channels: BTreeMap::new(), - current_slot: 0.into(), - current_epoch: 0u64, - randomness: relay_chain::Hash::default(), - additional_key_values: vec![], - } - } -} - -impl RelayStateSproofBuilder { - /// Returns a mutable reference to HRMP channel metadata for a channel (`sender`, - /// `self.para_id`). - /// - /// If there is no channel, a new default one is created. - /// - /// It also updates the `hrmp_ingress_channel_index`, creating it if needed. - pub fn upsert_inbound_channel(&mut self, sender: ParaId) -> &mut AbridgedHrmpChannel { - let in_index = self.hrmp_ingress_channel_index.get_or_insert_with(Vec::new); - if let Err(idx) = in_index.binary_search(&sender) { - in_index.insert(idx, sender); - } - - self.hrmp_channels - .entry(relay_chain::HrmpChannelId { sender, recipient: self.para_id }) - .or_insert_with(|| AbridgedHrmpChannel { - max_capacity: 0, - max_total_size: 0, - max_message_size: 0, - msg_count: 0, - total_size: 0, - mqc_head: None, - }) - } - - pub fn into_state_root_and_proof( - self, - ) -> (polkadot_primitives::Hash, sp_state_machine::StorageProof) { - let (db, root) = MemoryDB::>::default_with_root(); - let state_version = Default::default(); // for test using default. - let mut backend = sp_state_machine::TrieBackendBuilder::new(db, root).build(); - - let mut relevant_keys = Vec::new(); - { - use codec::Encode as _; - - let mut insert = |key: Vec, value: Vec| { - relevant_keys.push(key.clone()); - backend.insert(vec![(None, vec![(key, Some(value))])], state_version); - }; - - insert(relay_chain::well_known_keys::ACTIVE_CONFIG.to_vec(), self.host_config.encode()); - if let Some(dmq_mqc_head) = self.dmq_mqc_head { - insert( - relay_chain::well_known_keys::dmq_mqc_head(self.para_id), - dmq_mqc_head.encode(), - ); - } - if let Some(relay_dispatch_queue_remaining_capacity) = - self.relay_dispatch_queue_remaining_capacity - { - insert( - relay_chain::well_known_keys::relay_dispatch_queue_remaining_capacity( - self.para_id, - ) - .key, - relay_dispatch_queue_remaining_capacity.encode(), - ); - } - if let Some(upgrade_go_ahead) = self.upgrade_go_ahead { - insert( - relay_chain::well_known_keys::upgrade_go_ahead_signal(self.para_id), - upgrade_go_ahead.encode(), - ); - } - if let Some(hrmp_ingress_channel_index) = self.hrmp_ingress_channel_index { - let mut sorted = hrmp_ingress_channel_index.clone(); - sorted.sort(); - assert_eq!(sorted, hrmp_ingress_channel_index); - - insert( - relay_chain::well_known_keys::hrmp_ingress_channel_index(self.para_id), - hrmp_ingress_channel_index.encode(), - ); - } - if let Some(hrmp_egress_channel_index) = self.hrmp_egress_channel_index { - let mut sorted = hrmp_egress_channel_index.clone(); - sorted.sort(); - assert_eq!(sorted, hrmp_egress_channel_index); - - insert( - relay_chain::well_known_keys::hrmp_egress_channel_index(self.para_id), - hrmp_egress_channel_index.encode(), - ); - } - for (channel, metadata) in self.hrmp_channels { - insert(relay_chain::well_known_keys::hrmp_channels(channel), metadata.encode()); - } - insert(relay_chain::well_known_keys::EPOCH_INDEX.to_vec(), self.current_epoch.encode()); - insert( - relay_chain::well_known_keys::ONE_EPOCH_AGO_RANDOMNESS.to_vec(), - self.randomness.encode(), - ); - insert(relay_chain::well_known_keys::CURRENT_SLOT.to_vec(), self.current_slot.encode()); - - for (key, value) in self.additional_key_values { - insert(key, value); - } - } - - let root = *backend.root(); - let proof = sp_state_machine::prove_read(backend, relevant_keys).expect("prove read"); - (root, proof) - } -} diff --git a/cumulus/test/relay-validation-worker-provider/Cargo.toml b/cumulus/test/relay-validation-worker-provider/Cargo.toml deleted file mode 100644 index 63912580bc9d..000000000000 --- a/cumulus/test/relay-validation-worker-provider/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "cumulus-test-relay-validation-worker-provider" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" -build = "build.rs" - -[dependencies] - -# Polkadot -polkadot-node-core-pvf = { git = "https://github.com/paritytech/polkadot", branch = "master", features = ["test-utils"] } - -[build-dependencies] -toml = "0.7.6" diff --git a/cumulus/test/relay-validation-worker-provider/build.rs b/cumulus/test/relay-validation-worker-provider/build.rs deleted file mode 100644 index 599b1b73b48e..000000000000 --- a/cumulus/test/relay-validation-worker-provider/build.rs +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use std::{ - env, fs, - path::{Path, PathBuf}, - process::{self, Command}, -}; -use toml::value::Table; - -/// The name of the project we will building. -const PROJECT_NAME: &str = "validation-worker"; -/// The env variable that instructs us to skip the build. -const SKIP_ENV: &str = "SKIP_BUILD"; - -fn main() { - if env::var(SKIP_ENV).is_ok() { - return - } - - let out_dir = PathBuf::from(env::var("OUT_DIR").expect("`OUT_DIR` is set by cargo")); - - let project = create_project(&out_dir); - build_project(&project.join("Cargo.toml")); - - fs::copy(project.join("target/release").join(PROJECT_NAME), out_dir.join(PROJECT_NAME)) - .expect("Copies validation worker"); -} - -fn find_cargo_lock() -> PathBuf { - let mut path = PathBuf::from( - env::var("CARGO_MANIFEST_DIR").expect("`CARGO_MANIFEST_DIR` is set by cargo"), - ); - - loop { - if path.join("Cargo.lock").exists() { - return path.join("Cargo.lock") - } - - if !path.pop() { - panic!("Could not find `Cargo.lock`") - } - } -} - -fn create_project(out_dir: &Path) -> PathBuf { - let project_dir = out_dir.join(format!("{}-project", PROJECT_NAME)); - fs::create_dir_all(project_dir.join("src")).expect("Creates project dir and project src dir"); - - let mut project_toml = Table::new(); - - let mut package = Table::new(); - package.insert("name".into(), PROJECT_NAME.into()); - package.insert("version".into(), "1.0.0".into()); - package.insert("edition".into(), "2021".into()); - - project_toml.insert("package".into(), package.into()); - - project_toml.insert("workspace".into(), Table::new().into()); - - let mut dependencies = Table::new(); - - let mut dependency_project = Table::new(); - dependency_project.insert( - "path".into(), - env::var("CARGO_MANIFEST_DIR") - .expect("`CARGO_MANIFEST_DIR` is set by cargo") - .into(), - ); - - dependencies - .insert("cumulus-test-relay-validation-worker-provider".into(), dependency_project.into()); - - project_toml.insert("dependencies".into(), dependencies.into()); - - add_patches(&mut project_toml); - - fs::write( - project_dir.join("Cargo.toml"), - toml::to_string_pretty(&project_toml).expect("Wasm workspace toml is valid; qed"), - ) - .expect("Writes project `Cargo.toml`"); - - fs::write( - project_dir.join("src").join("main.rs"), - r#" - cumulus_test_relay_validation_worker_provider::polkadot_node_core_pvf::decl_puppet_worker_main!(); - "#, - ) - .expect("Writes `main.rs`"); - - let cargo_lock = find_cargo_lock(); - fs::copy(&cargo_lock, project_dir.join("Cargo.lock")).expect("Copies `Cargo.lock`"); - println!("cargo:rerun-if-changed={}", cargo_lock.display()); - - project_dir -} - -fn add_patches(project_toml: &mut Table) { - let workspace_toml_path = PathBuf::from( - env::var("CARGO_MANIFEST_DIR").expect("`CARGO_MANIFEST_DIR` is set by cargo"), - ) - .join("../../Cargo.toml"); - - let mut workspace_toml: Table = toml::from_str( - &fs::read_to_string(&workspace_toml_path).expect("Workspace root `Cargo.toml` exists; qed"), - ) - .expect("Workspace root `Cargo.toml` is a valid toml file; qed"); - - let mut workspace_path = workspace_toml_path; - workspace_path.pop(); - - while let Some(mut patch) = - workspace_toml.remove("patch").and_then(|p| p.try_into::().ok()) - { - // Iterate over all patches and make the patch path absolute from the workspace root path. - patch - .iter_mut() - .filter_map(|p| { - p.1.as_table_mut().map(|t| t.iter_mut().filter_map(|t| t.1.as_table_mut())) - }) - .flatten() - .for_each(|p| { - p.iter_mut().filter(|(k, _)| k == &"path").for_each(|(_, v)| { - if let Some(path) = v.as_str().map(PathBuf::from) { - if path.is_relative() { - *v = workspace_path.join(path).display().to_string().into(); - } - } - }) - }); - - project_toml.insert("patch".into(), patch.into()); - } -} - -fn build_project(cargo_toml: &Path) { - let cargo = env::var("CARGO").expect("`CARGO` env variable is always set by cargo"); - - let status = Command::new(cargo) - .arg("build") - .arg("--release") - .arg(format!("--manifest-path={}", cargo_toml.display())) - // Unset the `CARGO_TARGET_DIR` to prevent a cargo deadlock (cargo locks a target dir - // exclusive). - .env_remove("CARGO_TARGET_DIR") - // Do not call us recursively. - .env(SKIP_ENV, "1") - .status(); - - match status.map(|s| s.success()) { - Ok(true) => {}, - // Use `process.exit(1)` to have a clean error output. - _ => process::exit(1), - } -} diff --git a/cumulus/test/relay-validation-worker-provider/src/lib.rs b/cumulus/test/relay-validation-worker-provider/src/lib.rs deleted file mode 100644 index 840214eb3c05..000000000000 --- a/cumulus/test/relay-validation-worker-provider/src/lib.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Provides the [`VALIDATION_WORKER`] for integration tests in Cumulus. -//! -//! The validation worker is used by the relay chain to validate parachains. This worker is placed -//! in an extra process to provide better security and to ensure that a worker can be killed etc. -//! -//! !!This should only be used for tests!! - -pub use polkadot_node_core_pvf; - -/// The path to the validation worker. -pub const VALIDATION_WORKER: &str = concat!(env!("OUT_DIR"), "/validation-worker"); diff --git a/cumulus/test/runtime/Cargo.toml b/cumulus/test/runtime/Cargo.toml deleted file mode 100644 index 7c3a17d27c27..000000000000 --- a/cumulus/test/runtime/Cargo.toml +++ /dev/null @@ -1,72 +0,0 @@ -[package] -name = "cumulus-test-runtime" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } - -# Substrate -frame-executive = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-support = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-sudo = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-glutton = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-block-builder = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-inherents = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-offchain = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-session = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-transaction-pool = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-version = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } - -# Cumulus -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-timestamp = { path = "../../primitives/timestamp", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { git = "https://github.com/paritytech/substrate", branch = "master" , optional = true } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "scale-info/std", - "frame-executive/std", - "frame-support/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "pallet-balances/std", - "pallet-sudo/std", - "pallet-glutton/std", - "pallet-timestamp/std", - "pallet-transaction-payment/std", - "pallet-glutton/std", - "sp-api/std", - "sp-block-builder/std", - "sp-core/std", - "sp-inherents/std", - "sp-io/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-transaction-pool/std", - "sp-version/std", - "cumulus-pallet-parachain-system/std", - "cumulus-primitives-core/std", - "cumulus-primitives-timestamp/std", - "substrate-wasm-builder", -] -increment-spec-version = [] diff --git a/cumulus/test/runtime/build.rs b/cumulus/test/runtime/build.rs deleted file mode 100644 index 77631afefe61..000000000000 --- a/cumulus/test/runtime/build.rs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#[cfg(feature = "std")] -fn main() { - use substrate_wasm_builder::WasmBuilder; - - WasmBuilder::new() - .with_current_project() - .export_heap_base() - .import_memory() - .build(); - - WasmBuilder::new() - .with_current_project() - .enable_feature("increment-spec-version") - .import_memory() - .set_file_name("wasm_binary_spec_version_incremented.rs") - .build(); -} - -#[cfg(not(feature = "std"))] -fn main() {} diff --git a/cumulus/test/runtime/src/lib.rs b/cumulus/test/runtime/src/lib.rs deleted file mode 100644 index 62ef2b59f2b5..000000000000 --- a/cumulus/test/runtime/src/lib.rs +++ /dev/null @@ -1,503 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -pub mod wasm_spec_version_incremented { - #[cfg(feature = "std")] - include!(concat!(env!("OUT_DIR"), "/wasm_binary_spec_version_incremented.rs")); -} - -mod test_pallet; - -use frame_support::traits::OnRuntimeUpgrade; -use sp_api::{decl_runtime_apis, impl_runtime_apis}; -use sp_core::{ConstU32, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{BlakeTwo256, Block as BlockT, IdentifyAccount, IdentityLookup, Verify}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiSignature, -}; -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -// A few exports that help ease life for downstream crates. -pub use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - parameter_types, - traits::{ConstU8, Randomness}, - weights::{ - constants::{ - BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND, - }, - ConstantMultiplier, IdentityFee, Weight, - }, - StorageValue, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -pub use pallet_balances::Call as BalancesCall; -pub use pallet_glutton::Call as GluttonCall; -pub use pallet_sudo::Call as SudoCall; -pub use pallet_timestamp::Call as TimestampCall; -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; -pub use sp_runtime::{Perbill, Permill}; -pub use test_pallet::Call as TestPalletCall; - -pub type SessionHandlers = (); - -impl_opaque_keys! { - pub struct SessionKeys {} -} - -/// Some key that we set in genesis and only read in [`TestOnRuntimeUpgrade`] to ensure that -/// [`OnRuntimeUpgrade`] works as expected. -pub const TEST_RUNTIME_UPGRADE_KEY: &[u8] = b"+test_runtime_upgrade_key+"; - -// The only difference between the two declarations below is the `spec_version`. With the -// `increment-spec-version` feature enabled `spec_version` should be greater than the one of without -// the `increment-spec-version` feature. -// -// The duplication here is unfortunate necessity. -// -// runtime_version macro is dumb. It accepts a const item declaration, passes it through and -// also emits runtime version custom section. It parses the expressions to extract the version -// details. Since macro kicks in early, it operates on AST. Thus you cannot use constants. -// Macros are expanded top to bottom, meaning we also cannot use `cfg` here. - -#[cfg(not(feature = "increment-spec-version"))] -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("cumulus-test-parachain"), - impl_name: create_runtime_str!("cumulus-test-parachain"), - authoring_version: 1, - // Read the note above. - spec_version: 1, - impl_version: 1, - apis: RUNTIME_API_VERSIONS, - transaction_version: 1, - state_version: 1, -}; - -#[cfg(feature = "increment-spec-version")] -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("cumulus-test-parachain"), - impl_name: create_runtime_str!("cumulus-test-parachain"), - authoring_version: 1, - // Read the note above. - spec_version: 2, - impl_version: 1, - apis: RUNTIME_API_VERSIONS, - transaction_version: 1, - state_version: 1, -}; - -pub const MILLISECS_PER_BLOCK: u64 = 12000; - -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - -pub const EPOCH_DURATION_IN_BLOCKS: u32 = 10 * MINUTES; - -// These time units are defined in number of blocks. -pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); -pub const HOURS: BlockNumber = MINUTES * 60; -pub const DAYS: BlockNumber = HOURS * 24; - -// 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks. -pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4); - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -/// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. -/// This is used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used -/// by Operational extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for .5 seconds of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -parameter_types! { - pub const BlockHashCount: BlockNumber = 250; - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 42; -} - -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The aggregated dispatch type that is available for extrinsics. - type RuntimeCall = RuntimeCall; - /// The lookup mechanism to get account ID from whatever is passed in dispatchers. - type Lookup = IdentityLookup; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The hashing algorithm used. - type Hashing = BlakeTwo256; - /// The block type. - type Block = Block; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - /// The ubiquitous origin type. - type RuntimeOrigin = RuntimeOrigin; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = frame_support::traits::Everything; - type SystemWeightInfo = (); - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -parameter_types! { - pub const MinimumPeriod: u64 = SLOT_DURATION / 2; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; - type WeightInfo = (); -} - -parameter_types! { - pub const ExistentialDeposit: u128 = 500; - pub const TransferFee: u128 = 0; - pub const CreationFee: u128 = 0; - pub const TransactionByteFee: u128 = 1; - pub const MaxReserves: u32 = 50; -} - -impl pallet_balances::Config for Runtime { - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = (); - type MaxLocks = (); - type MaxReserves = MaxReserves; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type FreezeIdentifier = (); - type MaxHolds = ConstU32<0>; - type MaxFreezes = ConstU32<0>; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type WeightToFee = IdentityFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = (); - type OperationalFeeMultiplier = ConstU8<5>; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type WeightInfo = pallet_sudo::weights::SubstrateWeight; -} - -impl pallet_glutton::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type AdminOrigin = EnsureRoot; - type WeightInfo = pallet_glutton::weights::SubstrateWeight; -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type SelfParaId = ParachainId; - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type OutboundXcmpMessageSource = (); - type DmpMessageHandler = (); - type ReservedDmpWeight = (); - type XcmpMessageHandler = (); - type ReservedXcmpWeight = (); - type CheckAssociatedRelayNumber = cumulus_pallet_parachain_system::AnyRelayNumber; -} - -parameter_types! { - pub storage ParachainId: cumulus_primitives_core::ParaId = 100.into(); -} - -impl test_pallet::Config for Runtime {} - -construct_runtime! { - pub enum Runtime - { - System: frame_system, - ParachainSystem: cumulus_pallet_parachain_system, - Timestamp: pallet_timestamp, - Balances: pallet_balances, - Sudo: pallet_sudo, - TransactionPayment: pallet_transaction_payment, - TestPallet: test_pallet, - Glutton: pallet_glutton, - } -} - -/// Index of a transaction in the chain. -pub type Nonce = u32; -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; -/// Balance of an account. -pub type Balance = u128; -/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. -pub type Signature = MultiSignature; -/// An index to a block. -pub type BlockNumber = u32; -/// Some way of identifying an account on the chain. We intentionally make it equivalent -/// to the public key of our transaction signing scheme. -pub type AccountId = <::Signer as IdentifyAccount>::AccountId; -/// Opaque block type. -pub type NodeBlock = generic::Block; - -/// The address format for describing accounts. -pub type Address = AccountId; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - TestOnRuntimeUpgrade, ->; -/// The payload being signed in transactions. -pub type SignedPayload = generic::SignedPayload; - -pub struct TestOnRuntimeUpgrade; - -impl OnRuntimeUpgrade for TestOnRuntimeUpgrade { - fn on_runtime_upgrade() -> frame_support::weights::Weight { - assert_eq!(sp_io::storage::get(TEST_RUNTIME_UPGRADE_KEY), Some(vec![1, 2, 3, 4].into())); - Weight::from_parts(1, 0) - } -} - -decl_runtime_apis! { - pub trait GetLastTimestamp { - /// Returns the last timestamp of a runtime. - fn get_last_timestamp() -> u64; - } -} - -impl_runtime_apis! { - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic( - extrinsic: ::Extrinsic, - ) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn decode_session_keys( - encoded: Vec, - ) -> Option, sp_core::crypto::KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - } - - impl crate::GetLastTimestamp for Runtime { - fn get_last_timestamp() -> u64 { - Timestamp::now() - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } -} - -struct CheckInherents; - -impl cumulus_pallet_parachain_system::CheckInherents for CheckInherents { - fn check_inherents( - block: &Block, - relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, - ) -> sp_inherents::CheckInherentsResult { - if relay_state_proof.read_slot().expect("Reads slot") == 1337u64 { - let mut res = sp_inherents::CheckInherentsResult::new(); - res.put_error([1u8; 8], &sp_inherents::MakeFatalError::from("You are wrong")) - .expect("Puts error"); - res - } else { - let relay_chain_slot = relay_state_proof - .read_slot() - .expect("Could not read the relay chain slot from the proof"); - - let inherent_data = - cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( - relay_chain_slot, - sp_std::time::Duration::from_secs(6), - ).create_inherent_data().expect("Could not create the timestamp inherent data"); - - inherent_data.check_extrinsics(block) - } - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = Executive, - CheckInherents = CheckInherents, -} diff --git a/cumulus/test/runtime/src/test_pallet.rs b/cumulus/test/runtime/src/test_pallet.rs deleted file mode 100644 index bc72ef19505d..000000000000 --- a/cumulus/test/runtime/src/test_pallet.rs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -/// A special pallet that exposes dispatchables that are only useful for testing. -pub use pallet::*; - -#[frame_support::pallet(dev_mode)] -pub mod pallet { - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config + cumulus_pallet_parachain_system::Config {} - - #[pallet::hooks] - impl Hooks> for Pallet {} - - #[pallet::call] - impl Pallet { - /// A test dispatchable for setting a custom head data in `validate_block`. - #[pallet::weight(0)] - pub fn set_custom_validation_head_data( - _: OriginFor, - custom_header: sp_std::vec::Vec, - ) -> DispatchResult { - cumulus_pallet_parachain_system::Pallet::::set_custom_validation_head_data( - custom_header, - ); - Ok(()) - } - } -} diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml deleted file mode 100644 index 211996cb3a80..000000000000 --- a/cumulus/test/service/Cargo.toml +++ /dev/null @@ -1,128 +0,0 @@ -[package] -name = "cumulus-test-service" -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[[bin]] -name = "test-parachain" -path = "src/main.rs" - -[dependencies] -async-trait = "0.1.73" -clap = { version = "4.3.21", features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.0.0" } -criterion = { version = "0.5.1", features = [ "async_tokio" ] } -jsonrpsee = { version = "0.16.2", features = ["server"] } -rand = "0.8.5" -serde = { version = "1.0.183", features = ["derive"] } -tokio = { version = "1.31.0", features = ["macros"] } -tracing = "0.1.37" -url = "2.4.0" -tempfile = "3.7.1" - -# Substrate -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-transaction-payment = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-basic-authorship = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-chain-spec = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-client-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-network = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-service = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-telemetry = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-blockchain = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-api = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-keyring = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", default-features = false, branch = "master" } -sp-state-machine = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-tracing = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-test-client = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-block-builder = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor-wasmtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sc-executor-common = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Polkadot -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-test-service = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-node-subsystem = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-overseer = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Cumulus -cumulus-client-cli = { path = "../../client/cli" } -parachains-common = { path = "../../parachains/common" } -cumulus-client-consensus-common = { path = "../../client/consensus/common" } -cumulus-client-consensus-relay-chain = { path = "../../client/consensus/relay-chain" } -cumulus-client-service = { path = "../../client/service" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } -cumulus-relay-chain-inprocess-interface = { path = "../../client/relay-chain-inprocess-interface" } -cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface" } -cumulus-test-relay-validation-worker-provider = { path = "../relay-validation-worker-provider" } -cumulus-test-runtime = { path = "../runtime" } -cumulus-relay-chain-minimal-node = { path = "../../client/relay-chain-minimal-node" } -cumulus-client-pov-recovery = { path = "../../client/pov-recovery" } -cumulus-test-relay-sproof-builder = { path = "../relay-sproof-builder" } -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[dev-dependencies] -futures = "0.3.28" -portpicker = "0.1.1" -rococo-parachain-runtime = { path = "../../parachains/runtimes/testing/rococo-parachain" } -pallet-im-online = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-consensus-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-authority-discovery = { git = "https://github.com/paritytech/substrate", branch = "master" } -cumulus-test-client = { path = "../client" } - -# Polkadot dependencies -polkadot-test-service = { git = "https://github.com/paritytech/polkadot", branch = "master" } - -# Substrate dependencies -sc-cli = { git = "https://github.com/paritytech/substrate", branch = "master" } -substrate-test-utils = { git = "https://github.com/paritytech/substrate", branch = "master" } - -[features] -runtime-benchmarks = ["polkadot-test-service/runtime-benchmarks"] - -[[bench]] -name = "transaction_throughput" -harness = false - -[[bench]] -name = "block_import" -harness = false - -[[bench]] -name = "block_production" -harness = false - -[[bench]] -name = "block_production_glutton" -harness = false - -[[bench]] -name = "block_import_glutton" -harness = false - -[[bench]] -name = "validate_block" -harness = false - -[[bench]] -name = "validate_block_glutton" -harness = false diff --git a/cumulus/test/service/benches/block_import.rs b/cumulus/test/service/benches/block_import.rs deleted file mode 100644 index b79598b15302..000000000000 --- a/cumulus/test/service/benches/block_import.rs +++ /dev/null @@ -1,79 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; - -use sc_client_api::UsageProvider; - -use core::time::Duration; -use cumulus_primitives_core::ParaId; - -use sc_block_builder::{BlockBuilderProvider, RecordProof}; -use sp_api::{Core, ProvideRuntimeApi}; -use sp_keyring::Sr25519Keyring::Alice; - -use cumulus_test_service::bench_utils as utils; - -fn benchmark_block_import(c: &mut Criterion) { - sp_tracing::try_init_simple(); - - let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); - let para_id = ParaId::from(100); - let tokio_handle = runtime.handle(); - - // Create enough accounts to fill the block with transactions. - // Each account should only be included in one transfer. - let (src_accounts, dst_accounts, account_ids) = utils::create_benchmark_accounts(); - - let alice = runtime.block_on( - cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice) - // Preload all accounts with funds for the transfers - .endowed_accounts(account_ids) - .build(), - ); - - let client = alice.client; - - let (max_transfer_count, extrinsics) = - utils::create_benchmarking_transfer_extrinsics(&client, &src_accounts, &dst_accounts); - - let parent_hash = client.usage_info().chain.best_hash; - let mut block_builder = - client.new_block_at(parent_hash, Default::default(), RecordProof::No).unwrap(); - for extrinsic in extrinsics { - block_builder.push(extrinsic).unwrap(); - } - let benchmark_block = block_builder.build().unwrap(); - - let mut group = c.benchmark_group("Block import"); - group.sample_size(20); - group.measurement_time(Duration::from_secs(120)); - group.throughput(Throughput::Elements(max_transfer_count as u64)); - - group.bench_function(format!("(transfers = {}) block import", max_transfer_count), |b| { - b.iter_batched( - || benchmark_block.block.clone(), - |block| { - client.runtime_api().execute_block(parent_hash, block).unwrap(); - }, - BatchSize::SmallInput, - ) - }); -} - -criterion_group!(benches, benchmark_block_import); -criterion_main!(benches); diff --git a/cumulus/test/service/benches/block_import_glutton.rs b/cumulus/test/service/benches/block_import_glutton.rs deleted file mode 100644 index b49db9f449e9..000000000000 --- a/cumulus/test/service/benches/block_import_glutton.rs +++ /dev/null @@ -1,94 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; - -use sc_client_api::UsageProvider; -use sp_api::{Core, ProvideRuntimeApi}; -use sp_arithmetic::{ - traits::{One, Zero}, - FixedPointNumber, -}; - -use core::time::Duration; -use cumulus_primitives_core::ParaId; - -use sc_block_builder::{BlockBuilderProvider, RecordProof}; -use sp_keyring::Sr25519Keyring::Alice; - -use cumulus_test_service::bench_utils as utils; - -fn benchmark_block_import(c: &mut Criterion) { - sp_tracing::try_init_simple(); - - let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); - let para_id = ParaId::from(100); - let tokio_handle = runtime.handle(); - - let alice = runtime.block_on( - cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice).build(), - ); - let client = alice.client; - - let mut group = c.benchmark_group("Block import"); - group.sample_size(20); - group.measurement_time(Duration::from_secs(120)); - - let mut initialize_glutton_pallet = true; - for (compute_ratio, storage_ratio) in &[(One::one(), Zero::zero()), (One::one(), One::one())] { - let block = utils::set_glutton_parameters( - &client, - initialize_glutton_pallet, - compute_ratio, - storage_ratio, - ); - initialize_glutton_pallet = false; - - runtime.block_on(utils::import_block(&client, &block, false)); - - // Build the block we will use for benchmarking - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - let mut block_builder = - client.new_block_at(parent_hash, Default::default(), RecordProof::No).unwrap(); - block_builder - .push(utils::extrinsic_set_validation_data(parent_header.clone()).clone()) - .unwrap(); - block_builder.push(utils::extrinsic_set_time(&client)).unwrap(); - let benchmark_block = block_builder.build().unwrap(); - - group.bench_function( - format!( - "(compute = {:?} %, storage = {:?} %) block import", - compute_ratio.saturating_mul_int(100), - storage_ratio.saturating_mul_int(100) - ), - |b| { - b.iter_batched( - || benchmark_block.block.clone(), - |block| { - client.runtime_api().execute_block(parent_hash, block).unwrap(); - }, - BatchSize::SmallInput, - ) - }, - ); - } -} - -criterion_group!(benches, benchmark_block_import); -criterion_main!(benches); diff --git a/cumulus/test/service/benches/block_production.rs b/cumulus/test/service/benches/block_production.rs deleted file mode 100644 index 1b868d736302..000000000000 --- a/cumulus/test/service/benches/block_production.rs +++ /dev/null @@ -1,111 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; - -use sc_client_api::UsageProvider; - -use core::time::Duration; -use cumulus_primitives_core::ParaId; -use sc_block_builder::{BlockBuilderProvider, RecordProof}; - -use sp_keyring::Sr25519Keyring::Alice; - -use cumulus_test_service::bench_utils as utils; - -fn benchmark_block_production(c: &mut Criterion) { - sp_tracing::try_init_simple(); - - let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); - let tokio_handle = runtime.handle(); - - // Create enough accounts to fill the block with transactions. - // Each account should only be included in one transfer. - let (src_accounts, dst_accounts, account_ids) = utils::create_benchmark_accounts(); - - let para_id = ParaId::from(100); - let alice = runtime.block_on( - cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice) - // Preload all accounts with funds for the transfers - .endowed_accounts(account_ids) - .build(), - ); - let client = alice.client; - - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - let set_validation_data_extrinsic = utils::extrinsic_set_validation_data(parent_header); - - let mut block_builder = client.new_block(Default::default()).unwrap(); - block_builder.push(utils::extrinsic_set_time(&client)).unwrap(); - block_builder.push(set_validation_data_extrinsic).unwrap(); - let built_block = block_builder.build().unwrap(); - - runtime.block_on(utils::import_block(&client, &built_block.block, false)); - - let (max_transfer_count, extrinsics) = - utils::create_benchmarking_transfer_extrinsics(&client, &src_accounts, &dst_accounts); - - let mut group = c.benchmark_group("Block production"); - - group.sample_size(20); - group.measurement_time(Duration::from_secs(120)); - group.throughput(Throughput::Elements(max_transfer_count as u64)); - - let best_hash = client.chain_info().best_hash; - - group.bench_function( - format!("(proof = true, transfers = {}) block production", max_transfer_count), - |b| { - b.iter_batched( - || extrinsics.clone(), - |extrinsics| { - let mut block_builder = client - .new_block_at(best_hash, Default::default(), RecordProof::Yes) - .unwrap(); - for extrinsic in extrinsics { - block_builder.push(extrinsic).unwrap(); - } - block_builder.build().unwrap() - }, - BatchSize::SmallInput, - ) - }, - ); - - group.bench_function( - format!("(proof = false, transfers = {}) block production", max_transfer_count), - |b| { - b.iter_batched( - || extrinsics.clone(), - |extrinsics| { - let mut block_builder = client - .new_block_at(best_hash, Default::default(), RecordProof::No) - .unwrap(); - for extrinsic in extrinsics { - block_builder.push(extrinsic).unwrap(); - } - block_builder.build().unwrap() - }, - BatchSize::SmallInput, - ) - }, - ); -} - -criterion_group!(benches, benchmark_block_production); -criterion_main!(benches); diff --git a/cumulus/test/service/benches/block_production_glutton.rs b/cumulus/test/service/benches/block_production_glutton.rs deleted file mode 100644 index 92a368c88c8d..000000000000 --- a/cumulus/test/service/benches/block_production_glutton.rs +++ /dev/null @@ -1,116 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; - -use sc_client_api::UsageProvider; -use sp_arithmetic::{ - traits::{One, Zero}, - FixedPointNumber, -}; - -use core::time::Duration; -use cumulus_primitives_core::ParaId; - -use sc_block_builder::{BlockBuilderProvider, RecordProof}; - -use sp_keyring::Sr25519Keyring::Alice; - -use cumulus_test_service::bench_utils as utils; - -fn benchmark_block_production_compute(c: &mut Criterion) { - sp_tracing::try_init_simple(); - - let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); - let tokio_handle = runtime.handle(); - - let para_id = ParaId::from(100); - let alice = runtime.block_on( - cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Alice).build(), - ); - let client = alice.client; - - let mut group = c.benchmark_group("Block production"); - - group.sample_size(20); - group.measurement_time(Duration::from_secs(120)); - - let mut initialize_glutton_pallet = true; - for (compute_ratio, storage_ratio) in &[(One::one(), Zero::zero()), (One::one(), One::one())] { - let block = utils::set_glutton_parameters( - &client, - initialize_glutton_pallet, - compute_ratio, - storage_ratio, - ); - runtime.block_on(utils::import_block(&client, &block, false)); - initialize_glutton_pallet = false; - - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - let set_validation_data_extrinsic = utils::extrinsic_set_validation_data(parent_header); - let set_time_extrinsic = utils::extrinsic_set_time(&client); - let best_hash = client.chain_info().best_hash; - - group.bench_function( - format!( - "(compute = {:?} %, storage = {:?} %) block import", - compute_ratio.saturating_mul_int(100), - storage_ratio.saturating_mul_int(100) - ), - |b| { - b.iter_batched( - || (set_validation_data_extrinsic.clone(), set_time_extrinsic.clone()), - |(validation_data, time)| { - let mut block_builder = client - .new_block_at(best_hash, Default::default(), RecordProof::Yes) - .unwrap(); - block_builder.push(validation_data).unwrap(); - block_builder.push(time).unwrap(); - block_builder.build().unwrap() - }, - BatchSize::SmallInput, - ) - }, - ); - - group.bench_function( - format!( - "(compute = {:?} %, storage = {:?} %) block import", - compute_ratio.saturating_mul_int(100), - storage_ratio.saturating_mul_int(100) - ), - |b| { - b.iter_batched( - || (set_validation_data_extrinsic.clone(), set_time_extrinsic.clone()), - |(validation_data, time)| { - let mut block_builder = client - .new_block_at(best_hash, Default::default(), RecordProof::No) - .unwrap(); - block_builder.push(validation_data).unwrap(); - block_builder.push(time).unwrap(); - block_builder.build().unwrap() - }, - BatchSize::SmallInput, - ) - }, - ); - } -} - -criterion_group!(benches, benchmark_block_production_compute); -criterion_main!(benches); diff --git a/cumulus/test/service/benches/transaction_throughput.rs b/cumulus/test/service/benches/transaction_throughput.rs deleted file mode 100644 index 48bf49487e64..000000000000 --- a/cumulus/test/service/benches/transaction_throughput.rs +++ /dev/null @@ -1,244 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) 2021 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; -use cumulus_test_runtime::{AccountId, BalancesCall, ExistentialDeposit, SudoCall}; -use futures::{future, StreamExt}; -use sc_transaction_pool_api::{TransactionPool as _, TransactionSource, TransactionStatus}; -use sp_core::{crypto::Pair, sr25519}; -use sp_runtime::{generic::BlockId, OpaqueExtrinsic}; - -use cumulus_primitives_core::ParaId; -use cumulus_test_service::{ - construct_extrinsic, fetch_nonce, initial_head_data, Client, Keyring::*, TransactionPool, -}; - -fn create_accounts(num: usize) -> Vec { - (0..num) - .map(|i| { - Pair::from_string(&format!("{}/{}", Alice.to_seed(), i), None) - .expect("Creates account pair") - }) - .collect() -} - -/// Create the extrinsics that will initialize the accounts from the sudo account (Alice). -/// -/// `start_nonce` is the current nonce of Alice. -fn create_account_extrinsics(client: &Client, accounts: &[sr25519::Pair]) -> Vec { - let start_nonce = fetch_nonce(client, Alice.public()); - - accounts - .iter() - .enumerate() - .flat_map(|(i, a)| { - vec![ - // Reset the nonce by removing any funds - construct_extrinsic( - client, - SudoCall::sudo { - call: Box::new( - BalancesCall::force_set_balance { - who: AccountId::from(a.public()), - new_free: 0, - } - .into(), - ), - }, - Alice.pair(), - Some(start_nonce + (i as u32) * 2), - ), - // Give back funds - construct_extrinsic( - client, - SudoCall::sudo { - call: Box::new( - BalancesCall::force_set_balance { - who: AccountId::from(a.public()), - new_free: 1_000_000_000_000 * ExistentialDeposit::get(), - } - .into(), - ), - }, - Alice.pair(), - Some(start_nonce + (i as u32) * 2 + 1), - ), - ] - }) - .map(OpaqueExtrinsic::from) - .collect() -} - -fn create_benchmark_extrinsics( - client: &Client, - accounts: &[sr25519::Pair], - extrinsics_per_account: usize, -) -> Vec { - accounts - .iter() - .flat_map(|account| { - (0..extrinsics_per_account).map(move |nonce| { - construct_extrinsic( - client, - BalancesCall::transfer_allow_death { - dest: Bob.to_account_id(), - value: ExistentialDeposit::get(), - }, - account.clone(), - Some(nonce as u32), - ) - }) - }) - .map(OpaqueExtrinsic::from) - .collect() -} - -async fn submit_tx_and_wait_for_inclusion( - tx_pool: &TransactionPool, - tx: OpaqueExtrinsic, - client: &Client, - wait_for_finalized: bool, -) { - let best_hash = client.chain_info().best_hash; - - let mut watch = tx_pool - .submit_and_watch(&BlockId::Hash(best_hash), TransactionSource::External, tx.clone()) - .await - .expect("Submits tx to pool") - .fuse(); - - loop { - match watch.select_next_some().await { - TransactionStatus::Finalized(_) => break, - TransactionStatus::InBlock(_) if !wait_for_finalized => break, - _ => {}, - } - } -} - -fn transaction_throughput_benchmarks(c: &mut Criterion) { - sp_tracing::try_init_simple(); - let mut builder = sc_cli::LoggerBuilder::new(""); - builder.with_colors(false); - let _ = builder.init(); - - let para_id = ParaId::from(100); - let runtime = tokio::runtime::Runtime::new().expect("Creates tokio runtime"); - let tokio_handle = runtime.handle(); - - // Start alice - let alice = cumulus_test_service::run_relay_chain_validator_node( - tokio_handle.clone(), - Alice, - || {}, - vec![], - None, - ); - - // Start bob - let bob = cumulus_test_service::run_relay_chain_validator_node( - tokio_handle.clone(), - Bob, - || {}, - vec![alice.addr.clone()], - None, - ); - - // Register parachain - runtime - .block_on( - alice.register_parachain( - para_id, - cumulus_test_service::runtime::WASM_BINARY - .expect("You need to build the WASM binary to run this test!") - .to_vec(), - initial_head_data(para_id), - ), - ) - .unwrap(); - - // Run charlie as parachain collator - let charlie = runtime.block_on( - cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Charlie) - .enable_collator() - .connect_to_relay_chain_nodes(vec![&alice, &bob]) - .build(), - ); - - // Run dave as parachain collator - let dave = runtime.block_on( - cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Dave) - .enable_collator() - .connect_to_parachain_node(&charlie) - .connect_to_relay_chain_nodes(vec![&alice, &bob]) - .build(), - ); - - runtime.block_on(dave.wait_for_blocks(1)); - - let mut group = c.benchmark_group("Transaction pool"); - let account_num = 10; - let extrinsics_per_account = 20; - group.sample_size(10); - group.throughput(Throughput::Elements(account_num as u64 * extrinsics_per_account as u64)); - - let accounts = create_accounts(account_num); - let mut counter = 1; - - let benchmark_handle = tokio_handle.clone(); - group.bench_function( - format!("{} transfers from {} accounts", account_num * extrinsics_per_account, account_num), - |b| { - b.iter_batched( - || { - let prepare_extrinsics = create_account_extrinsics(&dave.client, &accounts); - - benchmark_handle.block_on(future::join_all( - prepare_extrinsics.into_iter().map(|tx| { - submit_tx_and_wait_for_inclusion( - &dave.transaction_pool, - tx, - &dave.client, - true, - ) - }), - )); - - create_benchmark_extrinsics(&dave.client, &accounts, extrinsics_per_account) - }, - |extrinsics| { - benchmark_handle.block_on(future::join_all(extrinsics.into_iter().map(|tx| { - submit_tx_and_wait_for_inclusion( - &dave.transaction_pool, - tx, - &dave.client, - false, - ) - }))); - - println!("Finished {}", counter); - counter += 1; - }, - BatchSize::SmallInput, - ) - }, - ); -} - -criterion_group!(benches, transaction_throughput_benchmarks); -criterion_main!(benches); diff --git a/cumulus/test/service/benches/validate_block.rs b/cumulus/test/service/benches/validate_block.rs deleted file mode 100644 index f3b4d0b12144..000000000000 --- a/cumulus/test/service/benches/validate_block.rs +++ /dev/null @@ -1,162 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use codec::{Decode, Encode}; -use core::time::Duration; -use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; -use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData, ValidationParams}; -use cumulus_test_client::{ - generate_extrinsic_with_pair, BuildParachainBlockData, InitBlockBuilder, TestClientBuilder, - ValidationResult, -}; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use cumulus_test_runtime::{BalancesCall, Block, Header, UncheckedExtrinsic}; -use cumulus_test_service::bench_utils as utils; -use polkadot_primitives::HeadData; -use sc_block_builder::BlockBuilderProvider; -use sc_client_api::UsageProvider; -use sc_executor_common::wasm_runtime::WasmModule; - -use sp_blockchain::{ApplyExtrinsicFailed::Validity, Error::ApplyExtrinsicFailed}; - -use sp_core::{sr25519, Pair}; - -use sp_runtime::{ - traits::Header as HeaderT, - transaction_validity::{InvalidTransaction, TransactionValidityError}, -}; - -fn create_extrinsics( - client: &cumulus_test_client::Client, - src_accounts: &[sr25519::Pair], - dst_accounts: &[sr25519::Pair], -) -> (usize, Vec) { - // Add as many tranfer extrinsics as possible into a single block. - let mut block_builder = client.new_block(Default::default()).unwrap(); - let mut max_transfer_count = 0; - let mut extrinsics = Vec::new(); - - for (src, dst) in src_accounts.iter().zip(dst_accounts.iter()) { - let extrinsic: UncheckedExtrinsic = generate_extrinsic_with_pair( - client, - src.clone(), - BalancesCall::transfer_keep_alive { dest: AccountId::from(dst.public()), value: 10000 }, - None, - ); - - match block_builder.push(extrinsic.clone()) { - Ok(_) => {}, - Err(ApplyExtrinsicFailed(Validity(TransactionValidityError::Invalid( - InvalidTransaction::ExhaustsResources, - )))) => break, - Err(error) => panic!("{}", error), - } - - extrinsics.push(extrinsic); - max_transfer_count += 1; - } - - (max_transfer_count, extrinsics) -} - -fn benchmark_block_validation(c: &mut Criterion) { - sp_tracing::try_init_simple(); - // Create enough accounts to fill the block with transactions. - // Each account should only be included in one transfer. - let (src_accounts, dst_accounts, account_ids) = utils::create_benchmark_accounts(); - - let mut test_client_builder = TestClientBuilder::with_default_backend(); - let genesis_init = test_client_builder.genesis_init_mut(); - *genesis_init = cumulus_test_client::GenesisParameters { endowed_accounts: account_ids }; - let client = test_client_builder.build_with_native_executor(None).0; - - let (max_transfer_count, extrinsics) = create_extrinsics(&client, &src_accounts, &dst_accounts); - - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - let validation_data = PersistedValidationData { - relay_parent_number: 1, - parent_head: parent_header.encode().into(), - ..Default::default() - }; - - let mut block_builder = client.init_block_builder(Some(validation_data), Default::default()); - for extrinsic in extrinsics { - block_builder.push(extrinsic).unwrap(); - } - - let parachain_block = block_builder.build_parachain_block(*parent_header.state_root()); - - let proof_size_in_kb = parachain_block.storage_proof().encode().len() as f64 / 1024f64; - let runtime = utils::get_wasm_module(); - - let sproof_builder: RelayStateSproofBuilder = Default::default(); - let (relay_parent_storage_root, _) = sproof_builder.into_state_root_and_proof(); - let encoded_params = ValidationParams { - block_data: cumulus_test_client::BlockData(parachain_block.encode()), - parent_head: HeadData(parent_header.encode()), - relay_parent_number: 1, - relay_parent_storage_root, - } - .encode(); - - // This is not strictly necessary for this benchmark, but - // let us make sure that the result of `validate_block` is what - // we expect. - verify_expected_result(&runtime, &encoded_params, parachain_block.into_block()); - - let mut group = c.benchmark_group("Block validation"); - group.sample_size(20); - group.measurement_time(Duration::from_secs(120)); - group.throughput(Throughput::Elements(max_transfer_count as u64)); - - group.bench_function( - format!( - "(transfers = {}, proof_size = {}kb) block validation", - max_transfer_count, proof_size_in_kb - ), - |b| { - b.iter_batched( - || runtime.new_instance().unwrap(), - |mut instance| { - instance.call_export("validate_block", &encoded_params).unwrap(); - }, - BatchSize::SmallInput, - ) - }, - ); -} - -fn verify_expected_result( - runtime: &Box, - encoded_params: &[u8], - parachain_block: Block, -) { - let res = runtime - .new_instance() - .unwrap() - .call_export("validate_block", encoded_params) - .expect("Call `validate_block`."); - let validation_result = - ValidationResult::decode(&mut &res[..]).expect("Decode `ValidationResult`."); - let header = - Header::decode(&mut &validation_result.head_data.0[..]).expect("Decodes `Header`."); - assert_eq!(parachain_block.header, header); -} - -criterion_group!(benches, benchmark_block_validation); -criterion_main!(benches); diff --git a/cumulus/test/service/benches/validate_block_glutton.rs b/cumulus/test/service/benches/validate_block_glutton.rs deleted file mode 100644 index 0e049d8665dc..000000000000 --- a/cumulus/test/service/benches/validate_block_glutton.rs +++ /dev/null @@ -1,210 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use codec::{Decode, Encode}; -use core::time::Duration; -use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; -use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData, ValidationParams}; -use cumulus_test_client::{ - generate_extrinsic_with_pair, BuildParachainBlockData, Client, InitBlockBuilder, - ParachainBlockData, TestClientBuilder, ValidationResult, -}; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use cumulus_test_runtime::{Block, GluttonCall, Header, SudoCall}; -use polkadot_primitives::HeadData; -use sc_client_api::UsageProvider; -use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy, ImportResult, StateAction}; -use sc_executor_common::wasm_runtime::WasmModule; -use sp_api::ProvideRuntimeApi; - -use frame_system_rpc_runtime_api::AccountNonceApi; -use sp_arithmetic::{ - traits::{One, Zero}, - FixedU64, -}; -use sp_consensus::BlockOrigin; -use sp_keyring::Sr25519Keyring::Alice; -use sp_runtime::traits::Header as HeaderT; - -use cumulus_test_service::bench_utils as utils; - -async fn import_block( - mut client: &cumulus_test_client::Client, - built: cumulus_test_runtime::Block, - import_existing: bool, -) { - let mut params = BlockImportParams::new(BlockOrigin::File, built.header.clone()); - params.body = Some(built.extrinsics.clone()); - params.state_action = StateAction::Execute; - params.fork_choice = Some(ForkChoiceStrategy::LongestChain); - params.import_existing = import_existing; - let import_result = client.import_block(params).await; - assert!(matches!(import_result, Ok(ImportResult::Imported(_)))); -} - -fn benchmark_block_validation(c: &mut Criterion) { - sp_tracing::try_init_simple(); - let runtime = tokio::runtime::Runtime::new().expect("creating tokio runtime doesn't fail; qed"); - - let endowed_accounts = vec![AccountId::from(Alice.public())]; - let mut test_client_builder = TestClientBuilder::with_default_backend(); - let genesis_init = test_client_builder.genesis_init_mut(); - *genesis_init = cumulus_test_client::GenesisParameters { endowed_accounts }; - - let client = test_client_builder.build_with_native_executor(None).0; - - let mut group = c.benchmark_group("Block validation"); - group.sample_size(20); - group.measurement_time(Duration::from_secs(120)); - - // In the first iteration we want to initialize the glutton pallet. - let mut is_first = true; - for (compute_ratio, storage_ratio) in &[(One::one(), Zero::zero()), (One::one(), One::one())] { - let parachain_block = - set_glutton_parameters(&client, is_first, compute_ratio, storage_ratio); - is_first = false; - - runtime.block_on(import_block(&client, parachain_block.clone().into_block(), false)); - - // Build benchmark block - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - let validation_data = PersistedValidationData { - relay_parent_number: 1, - parent_head: parent_header.encode().into(), - ..Default::default() - }; - let block_builder = client.init_block_builder(Some(validation_data), Default::default()); - let parachain_block = block_builder.build_parachain_block(*parent_header.state_root()); - - let proof_size_in_kb = parachain_block.storage_proof().encode().len() as f64 / 1024f64; - runtime.block_on(import_block(&client, parachain_block.clone().into_block(), false)); - let runtime = utils::get_wasm_module(); - - let sproof_builder: RelayStateSproofBuilder = Default::default(); - let (relay_parent_storage_root, _) = sproof_builder.clone().into_state_root_and_proof(); - let encoded_params = ValidationParams { - block_data: cumulus_test_client::BlockData(parachain_block.clone().encode()), - parent_head: HeadData(parent_header.encode()), - relay_parent_number: 1, - relay_parent_storage_root, - } - .encode(); - - // This is not strictly necessary for this benchmark, but - // let us make sure that the result of `validate_block` is what - // we expect. - verify_expected_result(&runtime, &encoded_params, parachain_block.into_block()); - - group.bench_function( - format!( - "(compute = {:?}, storage = {:?}, proof_size = {}kb) block validation", - compute_ratio, storage_ratio, proof_size_in_kb - ), - |b| { - b.iter_batched( - || runtime.new_instance().unwrap(), - |mut instance| { - instance.call_export("validate_block", &encoded_params).unwrap(); - }, - BatchSize::SmallInput, - ) - }, - ); - } -} - -fn verify_expected_result(runtime: &Box, encoded_params: &[u8], block: Block) { - let res = runtime - .new_instance() - .unwrap() - .call_export("validate_block", encoded_params) - .expect("Call `validate_block`."); - let validation_result = - ValidationResult::decode(&mut &res[..]).expect("Decode `ValidationResult`."); - let header = - Header::decode(&mut &validation_result.head_data.0[..]).expect("Decodes `Header`."); - assert_eq!(block.header, header); -} - -fn set_glutton_parameters( - client: &Client, - initialize: bool, - compute_ratio: &FixedU64, - storage_ratio: &FixedU64, -) -> ParachainBlockData { - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - - let mut last_nonce = client - .runtime_api() - .account_nonce(parent_hash, Alice.into()) - .expect("Fetching account nonce works; qed"); - - let validation_data = PersistedValidationData { - relay_parent_number: 1, - parent_head: parent_header.encode().into(), - ..Default::default() - }; - - let mut extrinsics = vec![]; - if initialize { - extrinsics.push(generate_extrinsic_with_pair( - client, - Alice.into(), - SudoCall::sudo { - call: Box::new( - GluttonCall::initialize_pallet { new_count: 5000, witness_count: None }.into(), - ), - }, - Some(last_nonce), - )); - last_nonce += 1; - } - - let set_compute = generate_extrinsic_with_pair( - client, - Alice.into(), - SudoCall::sudo { - call: Box::new(GluttonCall::set_compute { compute: *compute_ratio }.into()), - }, - Some(last_nonce), - ); - last_nonce += 1; - extrinsics.push(set_compute); - - let set_storage = generate_extrinsic_with_pair( - client, - Alice.into(), - SudoCall::sudo { - call: Box::new(GluttonCall::set_storage { storage: *storage_ratio }.into()), - }, - Some(last_nonce), - ); - extrinsics.push(set_storage); - - let mut block_builder = client.init_block_builder(Some(validation_data), Default::default()); - - for extrinsic in extrinsics { - block_builder.push(extrinsic).unwrap(); - } - - block_builder.build_parachain_block(*parent_header.state_root()) -} - -criterion_group!(benches, benchmark_block_validation); -criterion_main!(benches); diff --git a/cumulus/test/service/src/bench_utils.rs b/cumulus/test/service/src/bench_utils.rs deleted file mode 100644 index 172c9e504196..000000000000 --- a/cumulus/test/service/src/bench_utils.rs +++ /dev/null @@ -1,261 +0,0 @@ -// This file is part of Cumulus. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use codec::Encode; - -use crate::{construct_extrinsic, Client as TestClient}; -use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData}; -use cumulus_primitives_parachain_inherent::ParachainInherentData; -use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use cumulus_test_runtime::{ - BalancesCall, GluttonCall, NodeBlock, SudoCall, UncheckedExtrinsic, WASM_BINARY, -}; -use frame_system_rpc_runtime_api::AccountNonceApi; -use polkadot_primitives::HeadData; -use sc_block_builder::BlockBuilderProvider; -use sc_client_api::UsageProvider; -use sc_consensus::{ - block_import::{BlockImportParams, ForkChoiceStrategy}, - BlockImport, ImportResult, StateAction, -}; -use sc_executor::DEFAULT_HEAP_ALLOC_STRATEGY; -use sc_executor_common::runtime_blob::RuntimeBlob; -use sp_api::ProvideRuntimeApi; -use sp_blockchain::{ApplyExtrinsicFailed::Validity, Error::ApplyExtrinsicFailed}; -use sp_consensus::BlockOrigin; -use sp_core::{sr25519, Pair}; -use sp_keyring::Sr25519Keyring::Alice; -use sp_runtime::{ - transaction_validity::{InvalidTransaction, TransactionValidityError}, - AccountId32, FixedU64, OpaqueExtrinsic, -}; - -/// Accounts to use for transfer transactions. Enough for 5000 transactions. -const NUM_ACCOUNTS: usize = 10000; - -/// Create accounts by deriving from Alice -pub fn create_benchmark_accounts() -> (Vec, Vec, Vec) { - let accounts: Vec = (0..NUM_ACCOUNTS) - .map(|idx| { - Pair::from_string(&format!("{}/{}", Alice.to_seed(), idx), None) - .expect("Creates account pair") - }) - .collect(); - let account_ids = accounts - .iter() - .map(|account| AccountId::from(account.public())) - .collect::>(); - let (src_accounts, dst_accounts) = accounts.split_at(NUM_ACCOUNTS / 2); - (src_accounts.to_vec(), dst_accounts.to_vec(), account_ids) -} - -/// Create a timestamp extrinsic ahead by `MinimumPeriod` of the last known timestamp -pub fn extrinsic_set_time(client: &TestClient) -> OpaqueExtrinsic { - let best_number = client.usage_info().chain.best_number; - - let timestamp = best_number as u64 * cumulus_test_runtime::MinimumPeriod::get(); - cumulus_test_runtime::UncheckedExtrinsic { - signature: None, - function: cumulus_test_runtime::RuntimeCall::Timestamp(pallet_timestamp::Call::set { - now: timestamp, - }), - } - .into() -} - -/// Create a set validation data extrinsic -pub fn extrinsic_set_validation_data( - parent_header: cumulus_test_runtime::Header, -) -> OpaqueExtrinsic { - let sproof_builder = RelayStateSproofBuilder { para_id: 100.into(), ..Default::default() }; - let parent_head = HeadData(parent_header.encode()); - let (relay_parent_storage_root, relay_chain_state) = sproof_builder.into_state_root_and_proof(); - let data = ParachainInherentData { - validation_data: PersistedValidationData { - parent_head, - relay_parent_number: 10, - relay_parent_storage_root, - max_pov_size: 10000, - }, - relay_chain_state, - downward_messages: Default::default(), - horizontal_messages: Default::default(), - }; - - cumulus_test_runtime::UncheckedExtrinsic { - signature: None, - function: cumulus_test_runtime::RuntimeCall::ParachainSystem( - cumulus_pallet_parachain_system::Call::set_validation_data { data }, - ), - } - .into() -} - -/// Import block into the given client and make sure the import was successful -pub async fn import_block(mut client: &TestClient, block: &NodeBlock, import_existing: bool) { - let mut params = BlockImportParams::new(BlockOrigin::File, block.header.clone()); - params.body = Some(block.extrinsics.clone()); - params.state_action = StateAction::Execute; - params.fork_choice = Some(ForkChoiceStrategy::LongestChain); - params.import_existing = import_existing; - let import_result = client.import_block(params).await; - assert!( - matches!(import_result, Ok(ImportResult::Imported(_))), - "Unexpected block import result: {:?}!", - import_result - ); -} - -/// Creates transfer extrinsics pair-wise from elements of `src_accounts` to `dst_accounts`. -pub fn create_benchmarking_transfer_extrinsics( - client: &TestClient, - src_accounts: &[sr25519::Pair], - dst_accounts: &[sr25519::Pair], -) -> (usize, Vec) { - // Add as many transfer extrinsics as possible into a single block. - let mut block_builder = client.new_block(Default::default()).unwrap(); - let mut max_transfer_count = 0; - let mut extrinsics = Vec::new(); - // Every block needs one timestamp extrinsic. - let time_ext = extrinsic_set_time(client); - extrinsics.push(time_ext); - - // Every block needs tone set_validation_data extrinsic. - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - let set_validation_data_extrinsic = extrinsic_set_validation_data(parent_header); - extrinsics.push(set_validation_data_extrinsic); - - for (src, dst) in src_accounts.iter().zip(dst_accounts.iter()) { - let extrinsic: UncheckedExtrinsic = construct_extrinsic( - client, - BalancesCall::transfer_keep_alive { dest: AccountId::from(dst.public()), value: 10000 }, - src.clone(), - Some(0), - ); - - match block_builder.push(extrinsic.clone().into()) { - Ok(_) => {}, - Err(ApplyExtrinsicFailed(Validity(TransactionValidityError::Invalid( - InvalidTransaction::ExhaustsResources, - )))) => break, - Err(error) => panic!("{}", error), - } - - extrinsics.push(extrinsic.into()); - max_transfer_count += 1; - } - - if max_transfer_count >= src_accounts.len() { - panic!("Block could fit more transfers, increase NUM_ACCOUNTS to generate more accounts."); - } - - (max_transfer_count, extrinsics) -} - -/// Prepare cumulus test runtime for execution -pub fn get_wasm_module() -> Box { - let blob = RuntimeBlob::uncompress_if_needed( - WASM_BINARY.expect("You need to build the WASM binaries to run the benchmark!"), - ) - .unwrap(); - - let config = sc_executor_wasmtime::Config { - allow_missing_func_imports: true, - cache_path: None, - semantics: sc_executor_wasmtime::Semantics { - heap_alloc_strategy: DEFAULT_HEAP_ALLOC_STRATEGY, - instantiation_strategy: sc_executor::WasmtimeInstantiationStrategy::PoolingCopyOnWrite, - deterministic_stack_limit: None, - canonicalize_nans: false, - parallel_compilation: true, - wasm_multi_value: false, - wasm_bulk_memory: false, - wasm_reference_types: false, - wasm_simd: false, - }, - }; - Box::new( - sc_executor_wasmtime::create_runtime::(blob, config) - .expect("Unable to create wasm module."), - ) -} - -/// Create a block containing setup extrinsics for the glutton pallet. -pub fn set_glutton_parameters( - client: &TestClient, - initialize: bool, - compute_ratio: &FixedU64, - storage_ratio: &FixedU64, -) -> NodeBlock { - let parent_hash = client.usage_info().chain.best_hash; - let parent_header = client.header(parent_hash).expect("Just fetched this hash.").unwrap(); - - let mut last_nonce = client - .runtime_api() - .account_nonce(parent_hash, Alice.into()) - .expect("Fetching account nonce works; qed"); - - let mut extrinsics = vec![]; - if initialize { - // Initialize the pallet - extrinsics.push(construct_extrinsic( - client, - SudoCall::sudo { - call: Box::new( - GluttonCall::initialize_pallet { new_count: 5000, witness_count: None }.into(), - ), - }, - Alice.into(), - Some(last_nonce), - )); - last_nonce += 1; - } - - // Set compute weight that should be consumed per block - let set_compute = construct_extrinsic( - client, - SudoCall::sudo { - call: Box::new(GluttonCall::set_compute { compute: *compute_ratio }.into()), - }, - Alice.into(), - Some(last_nonce), - ); - last_nonce += 1; - extrinsics.push(set_compute); - - // Set storage weight that should be consumed per block - let set_storage = construct_extrinsic( - client, - SudoCall::sudo { - call: Box::new(GluttonCall::set_storage { storage: *storage_ratio }.into()), - }, - Alice.into(), - Some(last_nonce), - ); - extrinsics.push(set_storage); - - let mut block_builder = client.new_block(Default::default()).unwrap(); - block_builder.push(extrinsic_set_time(client)).unwrap(); - block_builder.push(extrinsic_set_validation_data(parent_header)).unwrap(); - for extrinsic in extrinsics { - block_builder.push(extrinsic.into()).unwrap(); - } - - let built_block = block_builder.build().unwrap(); - built_block.block -} diff --git a/cumulus/test/service/src/chain_spec.rs b/cumulus/test/service/src/chain_spec.rs deleted file mode 100644 index 3d72d0db3ab5..000000000000 --- a/cumulus/test/service/src/chain_spec.rs +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -#![allow(missing_docs)] - -use cumulus_primitives_core::ParaId; -use cumulus_test_runtime::{AccountId, Signature}; -use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; -use sc_service::ChainType; -use serde::{Deserialize, Serialize}; -use sp_core::{sr25519, Pair, Public}; -use sp_runtime::traits::{IdentifyAccount, Verify}; - -/// Specialized `ChainSpec` for the normal parachain runtime. -pub type ChainSpec = sc_service::GenericChainSpec; - -/// Extension for the genesis config to add custom keys easily. -#[derive(serde::Serialize, serde::Deserialize)] -pub struct GenesisExt { - /// The runtime genesis config. - runtime_genesis_config: cumulus_test_runtime::RuntimeGenesisConfig, - /// The parachain id. - para_id: ParaId, -} - -impl sp_runtime::BuildStorage for GenesisExt { - fn assimilate_storage(&self, storage: &mut sp_core::storage::Storage) -> Result<(), String> { - sp_state_machine::BasicExternalities::execute_with_storage(storage, || { - sp_io::storage::set(cumulus_test_runtime::TEST_RUNTIME_UPGRADE_KEY, &[1, 2, 3, 4]); - cumulus_test_runtime::ParachainId::set(&self.para_id); - }); - - self.runtime_genesis_config.assimilate_storage(storage) - } -} - -/// Helper function to generate a crypto pair from seed -pub fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -/// The extensions for the [`ChainSpec`](crate::ChainSpec). -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)] -#[serde(deny_unknown_fields)] -pub struct Extensions { - /// The id of the Parachain. - pub para_id: u32, -} - -impl Extensions { - /// Try to get the extension from the given `ChainSpec`. - pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> { - sc_chain_spec::get_extension(chain_spec.extensions()) - } -} - -type AccountPublic = ::Signer; - -/// Helper function to generate an account ID from seed. -pub fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} - -/// Get the chain spec for a specific parachain ID. -/// The given accounts are initialized with funds in addition -/// to the default known accounts. -pub fn get_chain_spec_with_extra_endowed( - id: ParaId, - extra_endowed_accounts: Vec, -) -> ChainSpec { - ChainSpec::from_genesis( - "Local Testnet", - "local_testnet", - ChainType::Local, - move || GenesisExt { - runtime_genesis_config: testnet_genesis_with_default_endowed( - extra_endowed_accounts.clone(), - ), - para_id: id, - }, - Vec::new(), - None, - None, - None, - None, - Extensions { para_id: id.into() }, - ) -} - -/// Get the chain spec for a specific parachain ID. -pub fn get_chain_spec(id: ParaId) -> ChainSpec { - get_chain_spec_with_extra_endowed(id, Default::default()) -} - -/// Local testnet genesis for testing. -pub fn testnet_genesis_with_default_endowed( - mut extra_endowed_accounts: Vec, -) -> cumulus_test_runtime::RuntimeGenesisConfig { - let mut endowed = vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ]; - endowed.append(&mut extra_endowed_accounts); - - testnet_genesis(get_account_id_from_seed::("Alice"), endowed) -} - -/// Creates a local testnet genesis with endowed accounts. -pub fn testnet_genesis( - root_key: AccountId, - endowed_accounts: Vec, -) -> cumulus_test_runtime::RuntimeGenesisConfig { - cumulus_test_runtime::RuntimeGenesisConfig { - system: cumulus_test_runtime::SystemConfig { - code: cumulus_test_runtime::WASM_BINARY - .expect("WASM binary was not build, please build it!") - .to_vec(), - ..Default::default() - }, - glutton: Default::default(), - parachain_system: Default::default(), - balances: cumulus_test_runtime::BalancesConfig { - balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), - }, - sudo: cumulus_test_runtime::SudoConfig { key: Some(root_key) }, - transaction_payment: Default::default(), - } -} diff --git a/cumulus/test/service/src/cli.rs b/cumulus/test/service/src/cli.rs deleted file mode 100644 index 4c86094f81dd..000000000000 --- a/cumulus/test/service/src/cli.rs +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use std::{net::SocketAddr, path::PathBuf}; - -use polkadot_service::{ChainSpec, ParaId, PrometheusConfig}; -use sc_cli::{ - CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams, NetworkParams, - Result as CliResult, SharedParams, SubstrateCli, -}; -use sc_service::BasePath; - -#[derive(Debug, clap::Parser)] -#[command( - version, - propagate_version = true, - args_conflicts_with_subcommands = true, - subcommand_negates_reqs = true -)] -pub struct TestCollatorCli { - #[command(subcommand)] - pub subcommand: Option, - - #[command(flatten)] - pub run: cumulus_client_cli::RunCmd, - - #[arg(default_value_t = 2000u32)] - pub parachain_id: u32, - - /// Relay chain arguments - #[arg(raw = true)] - pub relaychain_args: Vec, - - #[arg(long)] - pub use_null_consensus: bool, - - #[arg(long)] - pub disable_block_announcements: bool, - - #[arg(long)] - pub fail_pov_recovery: bool, -} - -#[derive(Debug, clap::Subcommand)] -pub enum Subcommand { - /// Build a chain specification. - BuildSpec(sc_cli::BuildSpecCmd), - - /// Export the genesis state of the parachain. - ExportGenesisState(ExportGenesisStateCommand), - - /// Export the genesis wasm of the parachain. - ExportGenesisWasm(ExportGenesisWasmCommand), -} - -#[derive(Debug, clap::Parser)] -#[group(skip)] -pub struct ExportGenesisStateCommand { - #[arg(default_value_t = 2000u32)] - pub parachain_id: u32, - - #[command(flatten)] - pub base: cumulus_client_cli::ExportGenesisStateCommand, -} - -impl CliConfiguration for ExportGenesisStateCommand { - fn shared_params(&self) -> &SharedParams { - &self.base.shared_params - } -} - -/// Command for exporting the genesis wasm file. -#[derive(Debug, clap::Parser)] -#[group(skip)] -pub struct ExportGenesisWasmCommand { - #[arg(default_value_t = 2000u32)] - pub parachain_id: u32, - - #[command(flatten)] - pub base: cumulus_client_cli::ExportGenesisWasmCommand, -} - -impl CliConfiguration for ExportGenesisWasmCommand { - fn shared_params(&self) -> &SharedParams { - &self.base.shared_params - } -} - -#[derive(Debug)] -pub struct RelayChainCli { - /// The actual relay chain cli object. - pub base: polkadot_cli::RunCmd, - - /// Optional chain id that should be passed to the relay chain. - pub chain_id: Option, - - /// The base path that should be used by the relay chain. - pub base_path: Option, -} - -impl RelayChainCli { - /// Parse the relay chain CLI parameters using the para chain `Configuration`. - pub fn new<'a>( - para_config: &sc_service::Configuration, - relay_chain_args: impl Iterator, - ) -> Self { - let base_path = para_config.base_path.path().join("polkadot"); - Self { - base_path: Some(base_path), - chain_id: None, - base: clap::Parser::parse_from(relay_chain_args), - } - } -} - -impl CliConfiguration for RelayChainCli { - fn shared_params(&self) -> &SharedParams { - self.base.base.shared_params() - } - - fn import_params(&self) -> Option<&ImportParams> { - self.base.base.import_params() - } - - fn network_params(&self) -> Option<&NetworkParams> { - self.base.base.network_params() - } - - fn keystore_params(&self) -> Option<&KeystoreParams> { - self.base.base.keystore_params() - } - - fn base_path(&self) -> CliResult> { - Ok(self - .shared_params() - .base_path()? - .or_else(|| self.base_path.clone().map(Into::into))) - } - - fn rpc_addr(&self, default_listen_port: u16) -> CliResult> { - self.base.base.rpc_addr(default_listen_port) - } - - fn prometheus_config( - &self, - default_listen_port: u16, - chain_spec: &Box, - ) -> CliResult> { - self.base.base.prometheus_config(default_listen_port, chain_spec) - } - - fn init( - &self, - _support_url: &String, - _impl_version: &String, - _logger_hook: F, - _config: &sc_service::Configuration, - ) -> CliResult<()> - where - F: FnOnce(&mut sc_cli::LoggerBuilder, &sc_service::Configuration), - { - unreachable!("PolkadotCli is never initialized; qed"); - } - - fn chain_id(&self, is_dev: bool) -> CliResult { - let chain_id = self.base.base.chain_id(is_dev)?; - - Ok(if chain_id.is_empty() { self.chain_id.clone().unwrap_or_default() } else { chain_id }) - } - - fn role(&self, is_dev: bool) -> CliResult { - self.base.base.role(is_dev) - } - - fn transaction_pool( - &self, - is_dev: bool, - ) -> CliResult { - self.base.base.transaction_pool(is_dev) - } - - fn trie_cache_maximum_size(&self) -> CliResult> { - self.base.base.trie_cache_maximum_size() - } - - fn rpc_methods(&self) -> CliResult { - self.base.base.rpc_methods() - } - - fn rpc_max_connections(&self) -> CliResult { - self.base.base.rpc_max_connections() - } - - fn rpc_cors(&self, is_dev: bool) -> CliResult>> { - self.base.base.rpc_cors(is_dev) - } - - fn default_heap_pages(&self) -> CliResult> { - self.base.base.default_heap_pages() - } - - fn force_authoring(&self) -> CliResult { - self.base.base.force_authoring() - } - - fn disable_grandpa(&self) -> CliResult { - self.base.base.disable_grandpa() - } - - fn max_runtime_instances(&self) -> CliResult> { - self.base.base.max_runtime_instances() - } - - fn announce_block(&self) -> CliResult { - self.base.base.announce_block() - } - - fn telemetry_endpoints( - &self, - chain_spec: &Box, - ) -> CliResult> { - self.base.base.telemetry_endpoints(chain_spec) - } - - fn node_name(&self) -> CliResult { - self.base.base.node_name() - } -} - -impl DefaultConfigurationValues for RelayChainCli { - fn p2p_listen_port() -> u16 { - 30334 - } - - fn rpc_listen_port() -> u16 { - 9945 - } - - fn prometheus_listen_port() -> u16 { - 9616 - } -} - -impl SubstrateCli for TestCollatorCli { - fn impl_name() -> String { - "Cumulus zombienet test parachain".into() - } - - fn impl_version() -> String { - String::new() - } - - fn description() -> String { - format!( - "Cumulus zombienet test parachain\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relaychain node.\n\n\ - {} [parachain-args] -- [relaychain-args]", - Self::executable_name() - ) - } - - fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() - } - - fn support_url() -> String { - "https://github.com/paritytech/cumulus/issues/new".into() - } - - fn copyright_start_year() -> i32 { - 2017 - } - - fn load_spec(&self, id: &str) -> std::result::Result, String> { - Ok(match id { - "" => Box::new(cumulus_test_service::get_chain_spec(ParaId::from(self.parachain_id))) - as Box<_>, - path => { - let chain_spec = - cumulus_test_service::chain_spec::ChainSpec::from_json_file(path.into())?; - Box::new(chain_spec) - }, - }) - } -} - -impl SubstrateCli for RelayChainCli { - fn impl_name() -> String { - "Polkadot collator".into() - } - - fn impl_version() -> String { - String::new() - } - - fn description() -> String { - format!( - "Polkadot collator\n\nThe command-line arguments provided first will be \ - passed to the parachain node, while the arguments provided after -- will be passed \ - to the relay chain node.\n\n\ - {} [parachain-args] -- [relay_chain-args]", - Self::executable_name() - ) - } - - fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() - } - - fn support_url() -> String { - "https://github.com/paritytech/cumulus/issues/new".into() - } - - fn copyright_start_year() -> i32 { - 2017 - } - - fn load_spec(&self, id: &str) -> std::result::Result, String> { - ::from_iter([RelayChainCli::executable_name()].iter()) - .load_spec(id) - } -} diff --git a/cumulus/test/service/src/genesis.rs b/cumulus/test/service/src/genesis.rs deleted file mode 100644 index fb1825cfbdd3..000000000000 --- a/cumulus/test/service/src/genesis.rs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use codec::Encode; -use cumulus_client_cli::generate_genesis_block; -use cumulus_primitives_core::ParaId; -use cumulus_test_runtime::Block; -use polkadot_primitives::HeadData; -use sp_runtime::traits::Block as BlockT; - -/// Returns the initial head data for a parachain ID. -pub fn initial_head_data(para_id: ParaId) -> HeadData { - let spec = crate::chain_spec::get_chain_spec(para_id); - let block: Block = generate_genesis_block(&spec, sp_runtime::StateVersion::V1).unwrap(); - let genesis_state = block.header().encode(); - genesis_state.into() -} diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs deleted file mode 100644 index fb5cc95dafd0..000000000000 --- a/cumulus/test/service/src/lib.rs +++ /dev/null @@ -1,903 +0,0 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Crate used for testing with Cumulus. - -#![warn(missing_docs)] - -/// Utilities used for benchmarking -pub mod bench_utils; - -pub mod chain_spec; -mod genesis; - -use runtime::AccountId; -use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; -use std::{ - future::Future, - net::{IpAddr, Ipv4Addr, SocketAddr}, - time::Duration, -}; -use url::Url; - -use crate::runtime::Weight; -use cumulus_client_cli::CollatorOptions; -use cumulus_client_consensus_common::{ - ParachainBlockImport as TParachainBlockImport, ParachainCandidate, ParachainConsensus, -}; -use cumulus_client_pov_recovery::RecoveryHandle; -use cumulus_client_service::{ - build_network, prepare_node_config, start_collator, start_full_node, BuildNetworkParams, - StartCollatorParams, StartFullNodeParams, -}; -use cumulus_primitives_core::ParaId; -use cumulus_relay_chain_inprocess_interface::RelayChainInProcessInterface; -use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult}; -use cumulus_relay_chain_minimal_node::build_minimal_relay_chain_node; - -use cumulus_test_runtime::{Hash, Header, NodeBlock as Block, RuntimeApi}; - -use frame_system_rpc_runtime_api::AccountNonceApi; -use polkadot_node_subsystem::{errors::RecoveryError, messages::AvailabilityRecoveryMessage}; -use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{CollatorPair, Hash as PHash, PersistedValidationData}; -use polkadot_service::ProvideRuntimeApi; -use sc_consensus::ImportQueue; -use sc_network::{ - config::{FullNetworkConfiguration, TransportConfig}, - multiaddr, NetworkBlock, NetworkService, NetworkStateInfo, -}; -use sc_service::{ - config::{ - BlocksPruning, DatabaseSource, KeystoreConfig, MultiaddrWithPeerId, NetworkConfiguration, - OffchainWorkerConfig, PruningMode, WasmExecutionMethod, - }, - BasePath, ChainSpec as ChainSpecService, Configuration, Error as ServiceError, - PartialComponents, Role, RpcHandlers, TFullBackend, TFullClient, TaskManager, -}; -use sp_arithmetic::traits::SaturatedConversion; -use sp_blockchain::HeaderBackend; -use sp_core::{Pair, H256}; -use sp_keyring::Sr25519Keyring; -use sp_runtime::{codec::Encode, generic, traits::BlakeTwo256}; -use sp_state_machine::BasicExternalities; -use sp_trie::PrefixedMemoryDB; -use std::sync::Arc; -use substrate_test_client::{ - BlockchainEventsExt, RpcHandlersExt, RpcTransactionError, RpcTransactionOutput, -}; - -pub use chain_spec::*; -pub use cumulus_test_runtime as runtime; -pub use genesis::*; -pub use sp_keyring::Sr25519Keyring as Keyring; - -const LOG_TARGET: &str = "cumulus-test-service"; - -/// A consensus that will never produce any block. -#[derive(Clone)] -struct NullConsensus; - -#[async_trait::async_trait] -impl ParachainConsensus for NullConsensus { - async fn produce_candidate( - &mut self, - _: &Header, - _: PHash, - _: &PersistedValidationData, - ) -> Option> { - None - } -} - -/// The signature of the announce block fn. -pub type AnnounceBlockFn = Arc>) + Send + Sync>; - -/// Native executor instance. -pub struct RuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for RuntimeExecutor { - type ExtendHostFunctions = (); - - fn dispatch(method: &str, data: &[u8]) -> Option> { - cumulus_test_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - cumulus_test_runtime::native_version() - } -} - -/// The client type being used by the test service. -pub type Client = TFullClient< - runtime::NodeBlock, - runtime::RuntimeApi, - sc_executor::NativeElseWasmExecutor, ->; - -/// The backend type being used by the test service. -pub type Backend = TFullBackend; - -/// The block-import type being used by the test service. -pub type ParachainBlockImport = TParachainBlockImport, Backend>; - -/// Transaction pool type used by the test service -pub type TransactionPool = Arc>; - -/// Recovery handle that fails regularly to simulate unavailable povs. -pub struct FailingRecoveryHandle { - overseer_handle: OverseerHandle, - counter: u32, -} - -impl FailingRecoveryHandle { - /// Create a new FailingRecoveryHandle - pub fn new(overseer_handle: OverseerHandle) -> Self { - Self { overseer_handle, counter: 0 } - } -} - -#[async_trait::async_trait] -impl RecoveryHandle for FailingRecoveryHandle { - async fn send_recovery_msg( - &mut self, - message: AvailabilityRecoveryMessage, - origin: &'static str, - ) { - // For every 5th block we immediately signal unavailability to trigger - // a retry. - if self.counter % 5 == 0 { - let AvailabilityRecoveryMessage::RecoverAvailableData(_, _, _, back_sender) = message; - tracing::info!(target: LOG_TARGET, "Failing pov recovery."); - back_sender - .send(Err(RecoveryError::Unavailable)) - .expect("Return channel should work here."); - } else { - self.overseer_handle.send_msg(message, origin).await; - } - self.counter += 1; - } -} - -/// Starts a `ServiceBuilder` for a full service. -/// -/// Use this macro if you don't actually need the full service, but just the builder in order to -/// be able to perform chain operations. -pub fn new_partial( - config: &mut Configuration, -) -> Result< - PartialComponents< - Client, - Backend, - (), - sc_consensus::import_queue::BasicQueue>, - sc_transaction_pool::FullPool, - ParachainBlockImport, - >, - sc_service::Error, -> { - let heap_pages = config - .default_heap_pages - .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); - - let wasm = WasmExecutor::builder() - .with_execution_method(config.wasm_method) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) - .with_max_runtime_instances(config.max_runtime_instances) - .with_runtime_cache_size(config.runtime_cache_size) - .build(); - - let executor = - sc_executor::NativeElseWasmExecutor::::new_with_wasm_executor(wasm); - - let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts::(config, None, executor)?; - let client = Arc::new(client); - - let block_import = ParachainBlockImport::new(client.clone(), backend.clone()); - - let registry = config.prometheus_registry(); - - let transaction_pool = sc_transaction_pool::BasicPool::new_full( - config.transaction_pool.clone(), - config.role.is_authority().into(), - config.prometheus_registry(), - task_manager.spawn_essential_handle(), - client.clone(), - ); - - let import_queue = cumulus_client_consensus_relay_chain::import_queue( - client.clone(), - block_import.clone(), - |_, _| async { Ok(sp_timestamp::InherentDataProvider::from_system_time()) }, - &task_manager.spawn_essential_handle(), - registry, - )?; - - let params = PartialComponents { - backend, - client, - import_queue, - keystore_container, - task_manager, - transaction_pool, - select_chain: (), - other: block_import, - }; - - Ok(params) -} - -async fn build_relay_chain_interface( - relay_chain_config: Configuration, - collator_key: Option, - collator_options: CollatorOptions, - task_manager: &mut TaskManager, -) -> RelayChainResult> { - if !collator_options.relay_chain_rpc_urls.is_empty() { - return build_minimal_relay_chain_node( - relay_chain_config, - task_manager, - collator_options.relay_chain_rpc_urls, - ) - .await - .map(|r| r.0) - } - - let relay_chain_full_node = polkadot_test_service::new_full( - relay_chain_config, - if let Some(ref key) = collator_key { - polkadot_service::IsParachainNode::Collator(key.clone()) - } else { - polkadot_service::IsParachainNode::Collator(CollatorPair::generate().0) - }, - None, - ) - .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; - - task_manager.add_child(relay_chain_full_node.task_manager); - tracing::info!("Using inprocess node."); - Ok(Arc::new(RelayChainInProcessInterface::new( - relay_chain_full_node.client.clone(), - relay_chain_full_node.backend.clone(), - relay_chain_full_node.sync_service.clone(), - relay_chain_full_node.overseer_handle.ok_or(RelayChainError::GenericError( - "Overseer should be running in full node.".to_string(), - ))?, - ))) -} - -/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api. -#[sc_tracing::logging::prefix_logs_with(parachain_config.network.node_name.as_str())] -pub async fn start_node_impl( - parachain_config: Configuration, - collator_key: Option, - relay_chain_config: Configuration, - para_id: ParaId, - wrap_announce_block: Option AnnounceBlockFn>>, - fail_pov_recovery: bool, - rpc_ext_builder: RB, - consensus: Consensus, - collator_options: CollatorOptions, -) -> sc_service::error::Result<( - TaskManager, - Arc, - Arc>, - RpcHandlers, - TransactionPool, -)> -where - RB: Fn(Arc) -> Result, sc_service::Error> + Send + 'static, -{ - let mut parachain_config = prepare_node_config(parachain_config); - - let params = new_partial(&mut parachain_config)?; - - let transaction_pool = params.transaction_pool.clone(); - let mut task_manager = params.task_manager; - - let client = params.client.clone(); - let backend = params.backend.clone(); - - let block_import = params.other; - - let relay_chain_interface = build_relay_chain_interface( - relay_chain_config, - collator_key.clone(), - collator_options.clone(), - &mut task_manager, - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - }) - .await?; - - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - - let rpc_builder = { - let client = client.clone(); - Box::new(move |_, _| rpc_ext_builder(client.clone())) - }; - - let rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: None, - })?; - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let announce_block = wrap_announce_block - .map(|w| (w)(announce_block.clone())) - .unwrap_or_else(|| announce_block); - - let relay_chain_interface_for_closure = relay_chain_interface.clone(); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - - let recovery_handle: Box = if fail_pov_recovery { - Box::new(FailingRecoveryHandle::new(overseer_handle)) - } else { - Box::new(overseer_handle) - }; - - if let Some(collator_key) = collator_key { - let parachain_consensus: Box> = match consensus { - Consensus::RelayChain => { - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool.clone(), - prometheus_registry.as_ref(), - None, - ); - let relay_chain_interface2 = relay_chain_interface_for_closure.clone(); - Box::new(cumulus_client_consensus_relay_chain::RelayChainConsensus::new( - para_id, - proposer_factory, - move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface_for_closure.clone(); - async move { - let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ).await; - - let time = sp_timestamp::InherentDataProvider::from_system_time(); - - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from(String::from( - "error", - )) - })?; - Ok((time, parachain_inherent)) - } - }, - block_import, - relay_chain_interface2, - )) - }, - Consensus::Null => Box::new(NullConsensus), - }; - - let params = StartCollatorParams { - block_status: client.clone(), - announce_block, - client: client.clone(), - spawner: task_manager.spawn_handle(), - task_manager: &mut task_manager, - para_id, - parachain_consensus, - relay_chain_interface, - collator_key, - import_queue: import_queue_service, - relay_chain_slot_duration: Duration::from_secs(6), - recovery_handle, - sync_service, - }; - - start_collator(params).await?; - } else { - let params = StartFullNodeParams { - client: client.clone(), - announce_block, - task_manager: &mut task_manager, - para_id, - relay_chain_interface, - import_queue: import_queue_service, - relay_chain_slot_duration: Duration::from_secs(6), - recovery_handle, - sync_service, - }; - - start_full_node(params)?; - } - - start_network.start_network(); - - Ok((task_manager, client, network, rpc_handlers, transaction_pool)) -} - -/// A Cumulus test node instance used for testing. -pub struct TestNode { - /// TaskManager's instance. - pub task_manager: TaskManager, - /// Client's instance. - pub client: Arc, - /// Node's network. - pub network: Arc>, - /// The `MultiaddrWithPeerId` to this node. This is useful if you want to pass it as "boot - /// node" to other nodes. - pub addr: MultiaddrWithPeerId, - /// RPCHandlers to make RPC queries. - pub rpc_handlers: RpcHandlers, - /// Node's transaction pool - pub transaction_pool: TransactionPool, -} - -#[allow(missing_docs)] -pub enum Consensus { - /// Use the relay-chain provided consensus. - RelayChain, - /// Use the null consensus that will never produce any block. - Null, -} - -/// A builder to create a [`TestNode`]. -pub struct TestNodeBuilder { - para_id: ParaId, - tokio_handle: tokio::runtime::Handle, - key: Sr25519Keyring, - collator_key: Option, - parachain_nodes: Vec, - parachain_nodes_exclusive: bool, - relay_chain_nodes: Vec, - wrap_announce_block: Option AnnounceBlockFn>>, - storage_update_func_parachain: Option>, - storage_update_func_relay_chain: Option>, - consensus: Consensus, - relay_chain_full_node_url: Vec, - endowed_accounts: Vec, -} - -impl TestNodeBuilder { - /// Create a new instance of `Self`. - /// - /// `para_id` - The parachain id this node is running for. - /// `tokio_handle` - The tokio handler to use. - /// `key` - The key that will be used to generate the name and that will be passed as - /// `dev_seed`. - pub fn new(para_id: ParaId, tokio_handle: tokio::runtime::Handle, key: Sr25519Keyring) -> Self { - TestNodeBuilder { - key, - para_id, - tokio_handle, - collator_key: None, - parachain_nodes: Vec::new(), - parachain_nodes_exclusive: false, - relay_chain_nodes: Vec::new(), - wrap_announce_block: None, - storage_update_func_parachain: None, - storage_update_func_relay_chain: None, - consensus: Consensus::RelayChain, - relay_chain_full_node_url: vec![], - endowed_accounts: Default::default(), - } - } - - /// Enable collator for this node. - pub fn enable_collator(mut self) -> Self { - let collator_key = CollatorPair::generate().0; - self.collator_key = Some(collator_key); - self - } - - /// Instruct the node to exclusively connect to registered parachain nodes. - /// - /// Parachain nodes can be registered using [`Self::connect_to_parachain_node`] and - /// [`Self::connect_to_parachain_nodes`]. - pub fn exclusively_connect_to_registered_parachain_nodes(mut self) -> Self { - self.parachain_nodes_exclusive = true; - self - } - - /// Make the node connect to the given parachain node. - /// - /// By default the node will not be connected to any node or will be able to discover any other - /// node. - pub fn connect_to_parachain_node(mut self, node: &TestNode) -> Self { - self.parachain_nodes.push(node.addr.clone()); - self - } - - /// Make the node connect to the given parachain nodes. - /// - /// By default the node will not be connected to any node or will be able to discover any other - /// node. - pub fn connect_to_parachain_nodes<'a>( - mut self, - nodes: impl IntoIterator, - ) -> Self { - self.parachain_nodes.extend(nodes.into_iter().map(|n| n.addr.clone())); - self - } - - /// Make the node connect to the given relay chain node. - /// - /// By default the node will not be connected to any node or will be able to discover any other - /// node. - pub fn connect_to_relay_chain_node( - mut self, - node: &polkadot_test_service::PolkadotTestNode, - ) -> Self { - self.relay_chain_nodes.push(node.addr.clone()); - self - } - - /// Make the node connect to the given relay chain nodes. - /// - /// By default the node will not be connected to any node or will be able to discover any other - /// node. - pub fn connect_to_relay_chain_nodes<'a>( - mut self, - nodes: impl IntoIterator, - ) -> Self { - self.relay_chain_nodes.extend(nodes.into_iter().map(|n| n.addr.clone())); - self - } - - /// Wrap the announce block function of this node. - pub fn wrap_announce_block( - mut self, - wrap: impl FnOnce(AnnounceBlockFn) -> AnnounceBlockFn + 'static, - ) -> Self { - self.wrap_announce_block = Some(Box::new(wrap)); - self - } - - /// Allows accessing the parachain storage before the test node is built. - pub fn update_storage_parachain(mut self, updater: impl Fn() + 'static) -> Self { - self.storage_update_func_parachain = Some(Box::new(updater)); - self - } - - /// Allows accessing the relay chain storage before the test node is built. - pub fn update_storage_relay_chain(mut self, updater: impl Fn() + 'static) -> Self { - self.storage_update_func_relay_chain = Some(Box::new(updater)); - self - } - - /// Use the null consensus that will never author any block. - pub fn use_null_consensus(mut self) -> Self { - self.consensus = Consensus::Null; - self - } - - /// Connect to full node via RPC. - pub fn use_external_relay_chain_node_at_url(mut self, network_address: Url) -> Self { - self.relay_chain_full_node_url = vec![network_address]; - self - } - - /// Connect to full node via RPC. - pub fn use_external_relay_chain_node_at_port(mut self, port: u16) -> Self { - let mut localhost_url = - Url::parse("ws://localhost").expect("Should be able to parse localhost Url"); - localhost_url.set_port(Some(port)).expect("Should be able to set port"); - self.relay_chain_full_node_url = vec![localhost_url]; - self - } - - /// Accounts which will have an initial balance. - pub fn endowed_accounts(mut self, accounts: Vec) -> TestNodeBuilder { - self.endowed_accounts = accounts; - self - } - - /// Build the [`TestNode`]. - pub async fn build(self) -> TestNode { - let parachain_config = node_config( - self.storage_update_func_parachain.unwrap_or_else(|| Box::new(|| ())), - self.tokio_handle.clone(), - self.key, - self.parachain_nodes, - self.parachain_nodes_exclusive, - self.para_id, - self.collator_key.is_some(), - self.endowed_accounts, - ) - .expect("could not generate Configuration"); - - let mut relay_chain_config = polkadot_test_service::node_config( - self.storage_update_func_relay_chain.unwrap_or_else(|| Box::new(|| ())), - self.tokio_handle, - self.key, - self.relay_chain_nodes, - false, - ); - - let collator_options = - CollatorOptions { relay_chain_rpc_urls: self.relay_chain_full_node_url }; - - relay_chain_config.network.node_name = - format!("{} (relay chain)", relay_chain_config.network.node_name); - - let multiaddr = parachain_config.network.listen_addresses[0].clone(); - let (task_manager, client, network, rpc_handlers, transaction_pool) = start_node_impl( - parachain_config, - self.collator_key, - relay_chain_config, - self.para_id, - self.wrap_announce_block, - false, - |_| Ok(jsonrpsee::RpcModule::new(())), - self.consensus, - collator_options, - ) - .await - .expect("could not create Cumulus test service"); - - let peer_id = network.local_peer_id(); - let addr = MultiaddrWithPeerId { multiaddr, peer_id }; - - TestNode { task_manager, client, network, addr, rpc_handlers, transaction_pool } - } -} - -/// Create a Cumulus `Configuration`. -/// -/// By default an in-memory socket will be used, therefore you need to provide nodes if you want the -/// node to be connected to other nodes. If `nodes_exclusive` is `true`, the node will only connect -/// to the given `nodes` and not to any other node. The `storage_update_func` can be used to make -/// adjustments to the runtime genesis. -pub fn node_config( - storage_update_func: impl Fn(), - tokio_handle: tokio::runtime::Handle, - key: Sr25519Keyring, - nodes: Vec, - nodes_exlusive: bool, - para_id: ParaId, - is_collator: bool, - endowed_accounts: Vec, -) -> Result { - let base_path = BasePath::new_temp_dir()?; - let root = base_path.path().join(format!("cumulus_test_service_{}", key)); - let role = if is_collator { Role::Authority } else { Role::Full }; - let key_seed = key.to_seed(); - let mut spec = - Box::new(chain_spec::get_chain_spec_with_extra_endowed(para_id, endowed_accounts)); - - let mut storage = spec.as_storage_builder().build_storage().expect("could not build storage"); - - BasicExternalities::execute_with_storage(&mut storage, storage_update_func); - spec.set_storage(storage); - - let mut network_config = NetworkConfiguration::new( - format!("{} (parachain)", key_seed), - "network/test/0.1", - Default::default(), - None, - ); - - if nodes_exlusive { - network_config.default_peers_set.reserved_nodes = nodes; - network_config.default_peers_set.non_reserved_mode = - sc_network::config::NonReservedPeerMode::Deny; - } else { - network_config.boot_nodes = nodes; - } - - network_config.allow_non_globals_in_dht = true; - - network_config - .listen_addresses - .push(multiaddr::Protocol::Memory(rand::random()).into()); - - network_config.transport = TransportConfig::MemoryOnly; - - Ok(Configuration { - impl_name: "cumulus-test-node".to_string(), - impl_version: "0.1".to_string(), - role, - tokio_handle, - transaction_pool: Default::default(), - network: network_config, - keystore: KeystoreConfig::InMemory, - database: DatabaseSource::RocksDb { path: root.join("db"), cache_size: 128 }, - trie_cache_maximum_size: Some(64 * 1024 * 1024), - state_pruning: Some(PruningMode::ArchiveAll), - blocks_pruning: BlocksPruning::KeepAll, - chain_spec: spec, - wasm_method: WasmExecutionMethod::Compiled { - instantiation_strategy: sc_executor_wasmtime::InstantiationStrategy::PoolingCopyOnWrite, - }, - rpc_addr: None, - rpc_max_connections: Default::default(), - rpc_cors: None, - rpc_methods: Default::default(), - rpc_max_request_size: Default::default(), - rpc_max_response_size: Default::default(), - rpc_id_provider: None, - rpc_max_subs_per_conn: Default::default(), - rpc_port: 9945, - prometheus_config: None, - telemetry_endpoints: None, - default_heap_pages: None, - offchain_worker: OffchainWorkerConfig { enabled: true, indexing_enabled: false }, - force_authoring: false, - disable_grandpa: false, - dev_key_seed: Some(key_seed), - tracing_targets: None, - tracing_receiver: Default::default(), - max_runtime_instances: 8, - announce_block: true, - data_path: root, - base_path, - informant_output_format: Default::default(), - wasm_runtime_overrides: None, - runtime_cache_size: 2, - }) -} - -impl TestNode { - /// Wait for `count` blocks to be imported in the node and then exit. This function will not - /// return if no blocks are ever created, thus you should restrict the maximum amount of time of - /// the test execution. - pub fn wait_for_blocks(&self, count: usize) -> impl Future { - self.client.wait_for_blocks(count) - } - - /// Send an extrinsic to this node. - pub async fn send_extrinsic( - &self, - function: impl Into, - caller: Sr25519Keyring, - ) -> Result { - let extrinsic = construct_extrinsic(&self.client, function, caller.pair(), Some(0)); - - self.rpc_handlers.send_transaction(extrinsic.into()).await - } - - /// Register a parachain at this relay chain. - pub async fn schedule_upgrade(&self, validation: Vec) -> Result<(), RpcTransactionError> { - let call = frame_system::Call::set_code { code: validation }; - - self.send_extrinsic( - runtime::SudoCall::sudo_unchecked_weight { - call: Box::new(call.into()), - weight: Weight::from_parts(1_000, 0), - }, - Sr25519Keyring::Alice, - ) - .await - .map(drop) - } -} - -/// Fetch account nonce for key pair -pub fn fetch_nonce(client: &Client, account: sp_core::sr25519::Public) -> u32 { - let best_hash = client.chain_info().best_hash; - client - .runtime_api() - .account_nonce(best_hash, account.into()) - .expect("Fetching account nonce works; qed") -} - -/// Construct an extrinsic that can be applied to the test runtime. -pub fn construct_extrinsic( - client: &Client, - function: impl Into, - caller: sp_core::sr25519::Pair, - nonce: Option, -) -> runtime::UncheckedExtrinsic { - let function = function.into(); - let current_block_hash = client.info().best_hash; - let current_block = client.info().best_number.saturated_into(); - let genesis_block = client.hash(0).unwrap().unwrap(); - let nonce = nonce.unwrap_or_else(|| fetch_nonce(client, caller.public())); - let period = runtime::BlockHashCount::get() - .checked_next_power_of_two() - .map(|c| c / 2) - .unwrap_or(2) as u64; - let tip = 0; - let extra: runtime::SignedExtra = ( - frame_system::CheckNonZeroSender::::new(), - frame_system::CheckSpecVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(generic::Era::mortal( - period, - current_block, - )), - frame_system::CheckNonce::::from(nonce), - frame_system::CheckWeight::::new(), - pallet_transaction_payment::ChargeTransactionPayment::::from(tip), - ); - let raw_payload = runtime::SignedPayload::from_raw( - function.clone(), - extra.clone(), - ((), runtime::VERSION.spec_version, genesis_block, current_block_hash, (), (), ()), - ); - let signature = raw_payload.using_encoded(|e| caller.sign(e)); - runtime::UncheckedExtrinsic::new_signed( - function, - caller.public().into(), - runtime::Signature::Sr25519(signature), - extra, - ) -} - -/// Run a relay-chain validator node. -/// -/// This is essentially a wrapper around -/// [`run_validator_node`](polkadot_test_service::run_validator_node). -pub fn run_relay_chain_validator_node( - tokio_handle: tokio::runtime::Handle, - key: Sr25519Keyring, - storage_update_func: impl Fn(), - boot_nodes: Vec, - port: Option, -) -> polkadot_test_service::PolkadotTestNode { - let mut config = polkadot_test_service::node_config( - storage_update_func, - tokio_handle, - key, - boot_nodes, - true, - ); - - if let Some(port) = port { - config.rpc_addr = Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), port)); - } - - polkadot_test_service::run_validator_node( - config, - Some(cumulus_test_relay_validation_worker_provider::VALIDATION_WORKER.into()), - ) -} diff --git a/cumulus/test/service/src/main.rs b/cumulus/test/service/src/main.rs deleted file mode 100644 index a2b177db251c..000000000000 --- a/cumulus/test/service/src/main.rs +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2022 Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -mod cli; - -use std::{io::Write, sync::Arc}; - -use cli::{RelayChainCli, Subcommand, TestCollatorCli}; -use cumulus_client_cli::generate_genesis_block; -use cumulus_primitives_core::{relay_chain::CollatorPair, ParaId}; -use cumulus_test_service::AnnounceBlockFn; -use polkadot_service::runtime_traits::AccountIdConversion; -use sc_cli::{CliConfiguration, SubstrateCli}; -use sp_core::{hexdisplay::HexDisplay, Encode, Pair}; -use sp_runtime::traits::Block; - -pub fn wrap_announce_block() -> Box AnnounceBlockFn> { - tracing::info!("Block announcements disabled."); - Box::new(|_| { - // Never announce any block - Arc::new(|_, _| {}) - }) -} - -fn main() -> Result<(), sc_cli::Error> { - let cli = TestCollatorCli::from_args(); - - match &cli.subcommand { - Some(Subcommand::BuildSpec(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) - }, - - Some(Subcommand::ExportGenesisState(params)) => { - let mut builder = sc_cli::LoggerBuilder::new(""); - builder.with_profiling(sc_tracing::TracingReceiver::Log, ""); - let _ = builder.init(); - - let spec = - cli.load_spec(¶ms.base.shared_params.chain.clone().unwrap_or_default())?; - let state_version = cumulus_test_service::runtime::VERSION.state_version(); - - let block: parachains_common::Block = generate_genesis_block(&*spec, state_version)?; - let raw_header = block.header().encode(); - let output_buf = if params.base.raw { - raw_header - } else { - format!("0x{:?}", HexDisplay::from(&block.header().encode())).into_bytes() - }; - - if let Some(output) = ¶ms.base.output { - std::fs::write(output, output_buf)?; - } else { - std::io::stdout().write_all(&output_buf)?; - } - - Ok(()) - }, - Some(Subcommand::ExportGenesisWasm(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|_config| { - let parachain_id = ParaId::from(cmd.parachain_id); - let spec = cumulus_test_service::get_chain_spec(parachain_id); - cmd.base.run(&spec) - }) - }, - None => { - let log_filters = cli.run.normalize().log_filters(); - let mut builder = sc_cli::LoggerBuilder::new(log_filters.unwrap_or_default()); - builder.with_colors(true); - let _ = builder.init(); - - let collator_options = cli.run.collator_options(); - let tokio_runtime = sc_cli::build_runtime()?; - let tokio_handle = tokio_runtime.handle(); - let config = cli - .run - .normalize() - .create_configuration(&cli, tokio_handle.clone()) - .expect("Should be able to generate config"); - - let parachain_id = ParaId::from(cli.parachain_id); - let polkadot_cli = RelayChainCli::new( - &config, - [RelayChainCli::executable_name()].iter().chain(cli.relaychain_args.iter()), - ); - - let parachain_account = - AccountIdConversion::::into_account_truncating( - ¶chain_id, - ); - - let tokio_handle = config.tokio_handle.clone(); - let polkadot_config = - SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, tokio_handle) - .map_err(|err| format!("Relay chain argument error: {}", err))?; - - tracing::info!("Parachain id: {:?}", parachain_id); - tracing::info!("Parachain Account: {}", parachain_account); - tracing::info!( - "Is collating: {}", - if config.role.is_authority() { "yes" } else { "no" } - ); - if cli.fail_pov_recovery { - tracing::info!("PoV recovery failure enabled"); - } - - let collator_key = config.role.is_authority().then(|| CollatorPair::generate().0); - - let consensus = cli - .use_null_consensus - .then(|| { - tracing::info!("Using null consensus."); - cumulus_test_service::Consensus::Null - }) - .unwrap_or(cumulus_test_service::Consensus::RelayChain); - - let (mut task_manager, _, _, _, _) = tokio_runtime - .block_on(cumulus_test_service::start_node_impl( - config, - collator_key, - polkadot_config, - parachain_id, - cli.disable_block_announcements.then(wrap_announce_block), - cli.fail_pov_recovery, - |_| Ok(jsonrpsee::RpcModule::new(())), - consensus, - collator_options, - )) - .expect("could not create Cumulus test service"); - - tokio_runtime - .block_on(task_manager.future()) - .expect("Could not run service to completion"); - Ok(()) - }, - } -} diff --git a/cumulus/xcm/xcm-emulator/Cargo.toml b/cumulus/xcm/xcm-emulator/Cargo.toml deleted file mode 100644 index 9a88eaf286ac..000000000000 --- a/cumulus/xcm/xcm-emulator/Cargo.toml +++ /dev/null @@ -1,41 +0,0 @@ -[package] -name = "xcm-emulator" -description = "Test kit to emulate XCM program execution." -version = "0.1.0" -authors = ["Parity Technologies "] -edition = "2021" - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0" } -paste = "1.0.14" -log = { version = "0.4.20", default-features = false } -lazy_static = "1.4.0" -impl-trait-for-tuples = "0.2.2" - -# Substrate -frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" } -frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-io = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-std = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-arithmetic = { git = "https://github.com/paritytech/substrate", branch = "master" } -sp-trie = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" } -pallet-message-queue = { git = "https://github.com/paritytech/substrate", branch = "master" } - -# Cumulus -cumulus-primitives-core = { path = "../../primitives/core"} -cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue" } -cumulus-pallet-dmp-queue = { path = "../../pallets/dmp-queue" } -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system" } -parachain-info = { path = "../../parachains/pallets/parachain-info" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } -parachains-common = { path = "../../parachains/common" } - -# Polkadot -xcm = { git = "https://github.com/paritytech/polkadot", branch = "master" } -xcm-executor = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master" } -polkadot-runtime-parachains = { git = "https://github.com/paritytech/polkadot", branch = "master" } diff --git a/cumulus/xcm/xcm-emulator/README.md b/cumulus/xcm/xcm-emulator/README.md deleted file mode 100644 index d188c99eecfc..000000000000 --- a/cumulus/xcm/xcm-emulator/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# xcm-emulator - -XCM-Emulator is a tool to emulate XCM program execution using -pre-configured runtimes, including those used to run on live -networks, such as Kusama, Polkadot, Asset Hubs, et cetera. -This allows for testing cross-chain message passing and verifying -outcomes, weights, and side-effects. It is faster than spinning up -a zombienet and as all the chains are in one process debugging using Clion is easy. - -## Limitations - -As the messages do not physically go through the same messaging infrastructure -there is some code that is not being tested compared to using slower E2E tests. -In future it may be possible to run these XCM emulated tests as E2E tests (without changes). - -As well as the XCM message transport being mocked out, so too are areas around consensus, -in particular things like disputes, staking and iamonline events can't be tested. - -## Alternatives - -If you just wish to test execution of various XCM instructions -against the XCM VM then the `xcm-simulator` (in the polkadot -repo) is the perfect tool for this. diff --git a/cumulus/xcm/xcm-emulator/src/lib.rs b/cumulus/xcm/xcm-emulator/src/lib.rs deleted file mode 100644 index a82b51948bc5..000000000000 --- a/cumulus/xcm/xcm-emulator/src/lib.rs +++ /dev/null @@ -1,1415 +0,0 @@ -// Copyright 2023 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -pub use codec::{Decode, Encode}; -pub use lazy_static::lazy_static; -pub use log; -pub use paste; -pub use std::{ - any::type_name, - collections::HashMap, - error::Error, - fmt, - marker::PhantomData, - ops::Deref, - sync::{Condvar, Mutex}, - thread::LocalKey, -}; - -// Substrate -pub use frame_support::{ - assert_ok, - dispatch::EncodeLike, - sp_runtime::{AccountId32, DispatchResult}, - traits::{ - tokens::currency::Currency, EnqueueMessage, Get, Hooks, OriginTrait, ProcessMessage, - ProcessMessageError, ServiceQueues, - }, - weights::{Weight, WeightMeter}, -}; -pub use frame_system::{AccountInfo, Config as SystemConfig, Pallet as SystemPallet}; -pub use pallet_balances::AccountData; -pub use sp_arithmetic::traits::Bounded; -pub use sp_core::{sr25519, storage::Storage, Pair, H256}; -pub use sp_io::TestExternalities; -pub use sp_std::{cell::RefCell, collections::vec_deque::VecDeque, fmt::Debug}; -pub use sp_trie::StorageProof; - -//Cumulus -pub use cumulus_pallet_dmp_queue; -pub use cumulus_pallet_parachain_system::{self, Pallet as ParachainSystemPallet}; -pub use cumulus_pallet_xcmp_queue::{Config as XcmpQueueConfig, Pallet as XcmpQueuePallet}; -pub use cumulus_primitives_core::{ - self, relay_chain::BlockNumber as RelayBlockNumber, DmpMessageHandler, ParaId, - PersistedValidationData, XcmpMessageHandler, -}; -pub use cumulus_primitives_parachain_inherent::ParachainInherentData; -pub use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -pub use pallet_message_queue::{ - Config as MessageQueueConfig, Event as MessageQueueEvent, Pallet as MessageQueuePallet, -}; -pub use parachain_info; -pub use parachains_common::{AccountId, Balance, BlockNumber}; -pub use polkadot_primitives; -pub use polkadot_runtime_parachains::{ - dmp, - inclusion::{AggregateMessageOrigin, UmpQueueId}, -}; - -// Polkadot -pub use xcm::{ - v3::prelude::{AccountId32 as AccountId32Junction, Parachain as ParachainJunction, *}, - VersionedMultiAssets, VersionedMultiLocation, -}; -pub use xcm_executor::traits::ConvertLocation; - -thread_local! { - /// Downward messages, each message is: `(to_para_id, [(relay_block_number, msg)])` - #[allow(clippy::type_complexity)] - pub static DOWNWARD_MESSAGES: RefCell)>)>>> - = RefCell::new(HashMap::new()); - /// Downward messages that already processed by parachains, each message is: `(to_para_id, relay_block_number, Vec)` - #[allow(clippy::type_complexity)] - pub static DMP_DONE: RefCell)>>> - = RefCell::new(HashMap::new()); - /// Horizontal messages, each message is: `(to_para_id, [(from_para_id, relay_block_number, msg)])` - #[allow(clippy::type_complexity)] - pub static HORIZONTAL_MESSAGES: RefCell)>)>>> - = RefCell::new(HashMap::new()); - /// Upward messages, each message is: `(from_para_id, msg)` - pub static UPWARD_MESSAGES: RefCell)>>> = RefCell::new(HashMap::new()); - /// Bridged messages, each message is: `BridgeMessage` - pub static BRIDGED_MESSAGES: RefCell>> = RefCell::new(HashMap::new()); - /// Parachains Ids a the Network - pub static PARA_IDS: RefCell>> = RefCell::new(HashMap::new()); - /// Flag indicating if global variables have been initialized for a certain Network - pub static INITIALIZED: RefCell> = RefCell::new(HashMap::new()); -} - -pub trait CheckAssertion -where - Origin: Chain + Clone, - Destination: Chain + Clone, - Origin::RuntimeOrigin: OriginTrait + Clone, - Destination::RuntimeOrigin: OriginTrait + Clone, - Hops: Clone, - Args: Clone, -{ - fn check_assertion(test: Test); -} - -#[impl_trait_for_tuples::impl_for_tuples(5)] -impl CheckAssertion for Tuple -where - Origin: Chain + Clone, - Destination: Chain + Clone, - Origin::RuntimeOrigin: OriginTrait + Clone, - Destination::RuntimeOrigin: OriginTrait + Clone, - Hops: Clone, - Args: Clone, -{ - fn check_assertion(test: Test) { - for_tuples!( #( - Tuple::check_assertion(test.clone()); - )* ); - } -} - -pub trait TestExt { - fn build_new_ext(storage: Storage) -> TestExternalities; - fn new_ext() -> TestExternalities; - fn move_ext_out(id: &'static str); - fn move_ext_in(id: &'static str); - fn reset_ext(); - fn execute_with(execute: impl FnOnce() -> R) -> R; - fn ext_wrapper(func: impl FnOnce() -> R) -> R; -} - -impl TestExt for () { - fn build_new_ext(_storage: Storage) -> TestExternalities { - TestExternalities::default() - } - fn new_ext() -> TestExternalities { - TestExternalities::default() - } - fn move_ext_out(_id: &'static str) {} - fn move_ext_in(_id: &'static str) {} - fn reset_ext() {} - fn execute_with(execute: impl FnOnce() -> R) -> R { - execute() - } - fn ext_wrapper(func: impl FnOnce() -> R) -> R { - func() - } -} - -pub trait Network { - type Relay: RelayChain; - type Bridge: Bridge; - - fn name() -> &'static str; - fn init(); - fn reset(); - fn para_ids() -> Vec; - fn relay_block_number() -> u32; - fn set_relay_block_number(number: u32); - fn process_messages(); - fn has_unprocessed_messages() -> bool; - fn process_downward_messages(); - fn process_horizontal_messages(); - fn process_upward_messages(); - fn process_bridged_messages(); - fn hrmp_channel_parachain_inherent_data( - para_id: u32, - relay_parent_number: u32, - ) -> ParachainInherentData; -} - -pub trait NetworkComponent { - type Network: Network; - - fn send_horizontal_messages)>>( - to_para_id: u32, - iter: I, - ) { - HORIZONTAL_MESSAGES.with(|b| { - b.borrow_mut() - .get_mut(Self::Network::name()) - .unwrap() - .push_back((to_para_id, iter.collect())) - }); - } - - fn send_upward_message(from_para_id: u32, msg: Vec) { - UPWARD_MESSAGES.with(|b| { - b.borrow_mut() - .get_mut(Self::Network::name()) - .unwrap() - .push_back((from_para_id, msg)) - }); - } - - fn send_downward_messages( - to_para_id: u32, - iter: impl Iterator)>, - ) { - DOWNWARD_MESSAGES.with(|b| { - b.borrow_mut() - .get_mut(Self::Network::name()) - .unwrap() - .push_back((to_para_id, iter.collect())) - }); - } - - fn send_bridged_messages(msg: BridgeMessage) { - BRIDGED_MESSAGES - .with(|b| b.borrow_mut().get_mut(Self::Network::name()).unwrap().push_back(msg)); - } -} - -pub trait Chain: TestExt + NetworkComponent { - type Runtime: SystemConfig; - type RuntimeCall; - type RuntimeOrigin; - type RuntimeEvent; - type System; - - fn account_id_of(seed: &str) -> AccountId { - helpers::get_account_id_from_seed::(seed) - } - - fn account_data_of(account: AccountId) -> AccountData; - - fn events() -> Vec<::RuntimeEvent>; -} - -pub trait RelayChain: Chain { - type MessageProcessor: ProcessMessage; - type SovereignAccountOf: ConvertLocation; - - fn child_location_of(id: ParaId) -> MultiLocation { - (Ancestor(0), ParachainJunction(id.into())).into() - } - - fn sovereign_account_id_of(location: MultiLocation) -> AccountId { - Self::SovereignAccountOf::convert_location(&location).unwrap() - } - - fn sovereign_account_id_of_child_para(id: ParaId) -> AccountId { - Self::sovereign_account_id_of(Self::child_location_of(id)) - } -} - -pub trait Parachain: Chain { - type XcmpMessageHandler: XcmpMessageHandler; - type DmpMessageHandler: DmpMessageHandler; - type LocationToAccountId: ConvertLocation; - type ParachainInfo: Get; - type ParachainSystem; - - fn para_id() -> ParaId { - Self::ext_wrapper(|| Self::ParachainInfo::get()) - } - - fn parent_location() -> MultiLocation { - (Parent).into() - } - - fn sibling_location_of(para_id: ParaId) -> MultiLocation { - (Parent, X1(ParachainJunction(para_id.into()))).into() - } - - fn sovereign_account_id_of(location: MultiLocation) -> AccountId { - Self::LocationToAccountId::convert_location(&location).unwrap() - } - - fn prepare_for_xcmp(); -} - -pub trait Bridge { - type Source: TestExt; - type Target: TestExt; - type Handler: BridgeMessageHandler; - - fn init(); -} - -impl Bridge for () { - type Source = (); - type Target = (); - type Handler = (); - - fn init() {} -} - -#[derive(Clone, Default, Debug)] -pub struct BridgeMessage { - pub id: u32, - pub nonce: u64, - pub payload: Vec, -} - -pub trait BridgeMessageHandler { - fn get_source_outbound_messages() -> Vec; - - fn dispatch_target_inbound_message( - message: BridgeMessage, - ) -> Result<(), BridgeMessageDispatchError>; - - fn notify_source_message_delivery(lane_id: u32); -} - -impl BridgeMessageHandler for () { - fn get_source_outbound_messages() -> Vec { - Default::default() - } - - fn dispatch_target_inbound_message( - _message: BridgeMessage, - ) -> Result<(), BridgeMessageDispatchError> { - Err(BridgeMessageDispatchError(Box::new("Not a bridge"))) - } - - fn notify_source_message_delivery(_lane_id: u32) {} -} - -#[derive(Debug)] -pub struct BridgeMessageDispatchError(pub Box); - -impl Error for BridgeMessageDispatchError {} - -impl fmt::Display for BridgeMessageDispatchError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self.0) - } -} - -// Relay Chain Implementation -#[macro_export] -macro_rules! decl_test_relay_chains { - ( - $( - #[api_version($api_version:tt)] - pub struct $name:ident { - genesis = $genesis:expr, - on_init = $on_init:expr, - runtime = $runtime:ident, - core = { - MessageProcessor: $mp:path, - SovereignAccountOf: $sovereign_acc_of:path, - - }, - pallets = { - $($pallet_name:ident: $pallet_path:path,)* - } - } - ), - + - ) => { - $( - #[derive(Clone)] - pub struct $name; - - impl Chain for $name { - type Runtime = $runtime::Runtime; - type RuntimeCall = $runtime::RuntimeCall; - type RuntimeOrigin = $runtime::RuntimeOrigin; - type RuntimeEvent = $runtime::RuntimeEvent; - type System = $crate::SystemPallet::; - - fn account_data_of(account: AccountId) -> $crate::AccountData { - Self::ext_wrapper(|| $crate::SystemPallet::::account(account).data.into()) - } - - fn events() -> Vec<::RuntimeEvent> { - Self::System::events() - .iter() - .map(|record| record.event.clone()) - .collect() - } - } - - impl RelayChain for $name { - type SovereignAccountOf = $sovereign_acc_of; - type MessageProcessor = $mp; - } - - $crate::paste::paste! { - pub trait [<$name Pallet>] { - $( - type $pallet_name; - )? - } - - impl [<$name Pallet>] for $name { - $( - type $pallet_name = $pallet_path; - )? - } - } - - $crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init, $api_version); - $crate::__impl_check_assertion!($name); - )+ - }; -} - -#[macro_export] -macro_rules! __impl_test_ext_for_relay_chain { - // entry point: generate ext name - ($name:ident, $genesis:expr, $on_init:expr, $api_version:tt) => { - $crate::paste::paste! { - $crate::__impl_test_ext_for_relay_chain!( - @impl $name, - $genesis, - $on_init, - [], - [], - [] - ); - } - }; - // impl - (@impl $name:ident, $genesis:expr, $on_init:expr, $api_version:ident, $local_ext:ident, $global_ext:ident) => { - thread_local! { - pub static $local_ext: $crate::RefCell<$crate::TestExternalities> - = $crate::RefCell::new(<$name>::build_new_ext($genesis)); - } - - $crate::lazy_static! { - pub static ref $global_ext: $crate::Mutex<$crate::RefCell<$crate::HashMap>> - = $crate::Mutex::new($crate::RefCell::new($crate::HashMap::new())); - } - - impl TestExt for $name { - fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities { - use $crate::{NetworkComponent, Network, Chain}; - - let mut ext = $crate::TestExternalities::new(storage); - - ext.execute_with(|| { - #[allow(clippy::no_effect)] - $on_init; - sp_tracing::try_init_simple(); - - let mut block_number = ::System::block_number(); - block_number = std::cmp::max(1, block_number); - ::System::set_block_number(block_number); - }); - ext - } - - fn new_ext() -> $crate::TestExternalities { - <$name>::build_new_ext($genesis) - } - - fn move_ext_out(id: &'static str) { - use $crate::Deref; - - // Take TestExternality from thread_local - let local_ext = $local_ext.with(|v| { - v.take() - }); - - // Get TestExternality from lazy_static - let global_ext_guard = $global_ext.lock().unwrap(); - - // Replace TestExternality in lazy_static by TestExternality from thread_local - global_ext_guard.deref().borrow_mut().insert(id.to_string(), local_ext); - } - - fn move_ext_in(id: &'static str) { - use $crate::Deref; - - let mut global_ext_unlocked = false; - - // Keep the mutex unlocked until TesExternality from lazy_static - // has been updated - while !global_ext_unlocked { - // Get TesExternality from lazy_static - let global_ext_result = $global_ext.try_lock(); - - if let Ok(global_ext_guard) = global_ext_result { - // Unlock the mutex as long as the condition is not met - if !global_ext_guard.deref().borrow().contains_key(id) { - drop(global_ext_guard); - } else { - global_ext_unlocked = true; - } - } - } - - // Now that we know that lazy_static TestExt has been updated, we lock its mutex - let mut global_ext_guard = $global_ext.lock().unwrap(); - - // and set TesExternality from lazy_static into TesExternality for local_thread - let global_ext = global_ext_guard.deref(); - - $local_ext.with(|v| { - v.replace(global_ext.take().remove(id).unwrap()); - }); - } - - fn reset_ext() { - $local_ext.with(|v| *v.borrow_mut() = <$name>::build_new_ext($genesis)); - } - - fn execute_with(execute: impl FnOnce() -> R) -> R { - use $crate::{NetworkComponent, Network}; - // Make sure the Network is initialized - <$name as NetworkComponent>::Network::init(); - - // Execute - let r = $local_ext.with(|v| v.borrow_mut().execute_with(execute)); - - // Send messages if needed - $local_ext.with(|v| { - v.borrow_mut().execute_with(|| { - use $crate::polkadot_primitives::runtime_api::runtime_decl_for_parachain_host::$api_version; - - //TODO: mark sent count & filter out sent msg - for para_id in<$name as NetworkComponent>::Network::para_ids() { - // downward messages - let downward_messages = ::Runtime::dmq_contents(para_id.into()) - .into_iter() - .map(|inbound| (inbound.sent_at, inbound.msg)); - if downward_messages.len() == 0 { - continue; - } - <$name>::send_downward_messages(para_id, downward_messages.into_iter()); - - // Note: no need to handle horizontal messages, as the - // simulator directly sends them to dest (not relayed). - } - - // log events - Self::events().iter().for_each(|event| { - $crate::log::debug!(target: concat!("events::", stringify!($name)), "{:?}", event); - }); - - // clean events - ::System::reset_events(); - }) - }); - - <$name as NetworkComponent>::Network::process_messages(); - - r - } - - fn ext_wrapper(func: impl FnOnce() -> R) -> R { - $local_ext.with(|v| { - v.borrow_mut().execute_with(|| { - func() - }) - }) - } - } - }; -} - -// Parachain Implementation -#[macro_export] -macro_rules! decl_test_parachains { - ( - $( - pub struct $name:ident { - genesis = $genesis:expr, - on_init = $on_init:expr, - runtime = $runtime:ident, - core = { - XcmpMessageHandler: $xcmp_message_handler:path, - DmpMessageHandler: $dmp_message_handler:path, - LocationToAccountId: $location_to_account:path, - ParachainInfo: $parachain_info:path, - }, - pallets = { - $($pallet_name:ident: $pallet_path:path,)* - } - } - ), - + - ) => { - $( - #[derive(Clone)] - pub struct $name; - - impl Chain for $name { - type Runtime = $runtime::Runtime; - type RuntimeCall = $runtime::RuntimeCall; - type RuntimeOrigin = $runtime::RuntimeOrigin; - type RuntimeEvent = $runtime::RuntimeEvent; - type System = $crate::SystemPallet::; - - fn account_data_of(account: AccountId) -> $crate::AccountData { - Self::ext_wrapper(|| $crate::SystemPallet::::account(account).data.into()) - } - - fn events() -> Vec<::RuntimeEvent> { - Self::System::events() - .iter() - .map(|record| record.event.clone()) - .collect() - } - } - - impl Parachain for $name { - type XcmpMessageHandler = $xcmp_message_handler; - type DmpMessageHandler = $dmp_message_handler; - type LocationToAccountId = $location_to_account; - type ParachainSystem = $crate::ParachainSystemPallet<::Runtime>; - type ParachainInfo = $parachain_info; - - fn prepare_for_xcmp() { - use $crate::{Network, NetworkComponent, Hooks}; - - let para_id = Self::para_id(); - - ::ext_wrapper(|| { - let block_number = ::System::block_number(); - let mut relay_block_number = ::Network::relay_block_number(); - - let _ = ::ParachainSystem::set_validation_data( - ::RuntimeOrigin::none(), - ::Network::hrmp_channel_parachain_inherent_data( - para_id.into(), - relay_block_number, - ), - ); - // set `AnnouncedHrmpMessagesPerCandidate` - ::ParachainSystem::on_initialize(block_number); - }); - } - } - - $crate::paste::paste! { - pub trait [<$name Pallet>] { - $( - type $pallet_name; - )* - } - - impl [<$name Pallet>] for $name { - $( - type $pallet_name = $pallet_path; - )* - } - } - - $crate::__impl_test_ext_for_parachain!($name, $genesis, $on_init); - $crate::__impl_check_assertion!($name); - )+ - }; -} - -#[macro_export] -macro_rules! __impl_test_ext_for_parachain { - // entry point: generate ext name - ($name:ident, $genesis:expr, $on_init:expr) => { - $crate::paste::paste! { - $crate::__impl_test_ext_for_parachain!(@impl $name, $genesis, $on_init, [], []); - } - }; - // impl - (@impl $name:ident, $genesis:expr, $on_init:expr, $local_ext:ident, $global_ext:ident) => { - thread_local! { - pub static $local_ext: $crate::RefCell<$crate::TestExternalities> - = $crate::RefCell::new(<$name>::build_new_ext($genesis)); - } - - $crate::lazy_static! { - pub static ref $global_ext: $crate::Mutex<$crate::RefCell<$crate::HashMap>> - = $crate::Mutex::new($crate::RefCell::new($crate::HashMap::new())); - } - - impl TestExt for $name { - fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities { - use $crate::{NetworkComponent, Network, Chain}; - - let mut ext = $crate::TestExternalities::new(storage); - - ext.execute_with(|| { - #[allow(clippy::no_effect)] - $on_init; - sp_tracing::try_init_simple(); - - let mut block_number = ::System::block_number(); - block_number = std::cmp::max(1, block_number); - ::System::set_block_number(block_number); - }); - ext - } - - fn new_ext() -> $crate::TestExternalities { - <$name>::build_new_ext($genesis) - } - - fn move_ext_out(id: &'static str) { - use $crate::Deref; - - // Take TestExternality from thread_local - let local_ext = $local_ext.with(|v| { - v.take() - }); - - // Get TestExternality from lazy_static - let global_ext_guard = $global_ext.lock().unwrap(); - - // Replace TestExternality in lazy_static by TestExternality from thread_local - global_ext_guard.deref().borrow_mut().insert(id.to_string(), local_ext); - } - - fn move_ext_in(id: &'static str) { - use $crate::Deref; - - let mut global_ext_unlocked = false; - - // Keep the mutex unlocked until TesExternality from lazy_static - // has been updated - while !global_ext_unlocked { - // Get TesExternality from lazy_static - let global_ext_result = $global_ext.try_lock(); - - if let Ok(global_ext_guard) = global_ext_result { - // Unlock the mutex as long as the condition is not met - if !global_ext_guard.deref().borrow().contains_key(id) { - drop(global_ext_guard); - } else { - global_ext_unlocked = true; - } - } - } - - // Now that we know that lazy_static TestExt has been updated, we lock its mutex - let mut global_ext_guard = $global_ext.lock().unwrap(); - - // and set TesExternality from lazy_static into TesExternality for local_thread - let global_ext = global_ext_guard.deref(); - - $local_ext.with(|v| { - v.replace(global_ext.take().remove(id).unwrap()); - }); - } - - fn reset_ext() { - $local_ext.with(|v| *v.borrow_mut() = <$name>::build_new_ext($genesis)); - } - - fn execute_with(execute: impl FnOnce() -> R) -> R { - use $crate::{Get, Hooks, NetworkComponent, Network, Bridge}; - - // Make sure the Network is initialized - <$name as NetworkComponent>::Network::init(); - - let para_id = <$name>::para_id().into(); - - // Initialize block - $local_ext.with(|v| { - v.borrow_mut().execute_with(|| { - // Increase block number - let mut relay_block_number = <$name as NetworkComponent>::Network::relay_block_number(); - relay_block_number += 1; - <$name as NetworkComponent>::Network::set_relay_block_number(relay_block_number); - - let _ = ::ParachainSystem::set_validation_data( - ::RuntimeOrigin::none(), - <$name as NetworkComponent>::Network::hrmp_channel_parachain_inherent_data(para_id, relay_block_number), - ); - }) - }); - - // Execute - let r = $local_ext.with(|v| v.borrow_mut().execute_with(execute)); - - // Finalize block and send messages if needed - $local_ext.with(|v| { - v.borrow_mut().execute_with(|| { - use sp_runtime::traits::Header as HeaderT; - - let block_number = ::System::block_number(); - let mock_header = HeaderT::new( - 0, - Default::default(), - Default::default(), - Default::default(), - Default::default(), - ); - - // get xcmp messages - ::ParachainSystem::on_finalize(block_number); - let collation_info = ::ParachainSystem::collect_collation_info(&mock_header); - - // send upward messages - let relay_block_number = <$name as NetworkComponent>::Network::relay_block_number(); - for msg in collation_info.upward_messages.clone() { - <$name>::send_upward_message(para_id, msg); - } - - // send horizontal messages - for msg in collation_info.horizontal_messages { - <$name>::send_horizontal_messages( - msg.recipient.into(), - vec![(para_id.into(), relay_block_number, msg.data)].into_iter(), - ); - } - - // get bridge messages - type NetworkBridge = <<$name as NetworkComponent>::Network as Network>::Bridge; - - let bridge_messages = ::Handler::get_source_outbound_messages(); - - // send bridged messages - for msg in bridge_messages { - <$name>::send_bridged_messages(msg); - } - - // clean messages - ::ParachainSystem::on_initialize(block_number); - - // log events - Self::events().iter().for_each(|event| { - $crate::log::debug!(target: concat!("events::", stringify!($name)), "{:?}", event); - }); - - // clean events - ::System::reset_events(); - }) - }); - - <$name as NetworkComponent>::Network::process_messages(); - - r - } - - fn ext_wrapper(func: impl FnOnce() -> R) -> R { - $local_ext.with(|v| { - v.borrow_mut().execute_with(|| { - func() - }) - }) - } - } - }; -} - -// Network Implementation -#[macro_export] -macro_rules! decl_test_networks { - ( - $( - pub struct $name:ident { - relay_chain = $relay_chain:ty, - parachains = vec![ $( $parachain:ty, )* ], - bridge = $bridge:ty - } - ), - + - ) => { - $( - pub struct $name; - - impl $crate::Network for $name { - type Relay = $relay_chain; - type Bridge = $bridge; - - fn name() -> &'static str { - $crate::type_name::() - } - - fn reset() { - use $crate::{TestExt, VecDeque}; - - $crate::INITIALIZED.with(|b| b.borrow_mut().remove(Self::name())); - $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().remove(Self::name())); - $crate::DMP_DONE.with(|b| b.borrow_mut().remove(Self::name())); - $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().remove(Self::name())); - $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().remove(Self::name())); - $crate::BRIDGED_MESSAGES.with(|b| b.borrow_mut().remove(Self::name())); - - <$relay_chain>::reset_ext(); - $( <$parachain>::reset_ext(); )* - } - - fn init() { - // If Network has not been itialized yet, it gets initialized - if $crate::INITIALIZED.with(|b| b.borrow_mut().get(Self::name()).is_none()) { - $crate::INITIALIZED.with(|b| b.borrow_mut().insert(Self::name().to_string(), true)); - $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().insert(Self::name().to_string(), $crate::VecDeque::new())); - $crate::DMP_DONE.with(|b| b.borrow_mut().insert(Self::name().to_string(), $crate::VecDeque::new())); - $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().insert(Self::name().to_string(), $crate::VecDeque::new())); - $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().insert(Self::name().to_string(), $crate::VecDeque::new())); - $crate::BRIDGED_MESSAGES.with(|b| b.borrow_mut().insert(Self::name().to_string(), $crate::VecDeque::new())); - $crate::PARA_IDS.with(|b| b.borrow_mut().insert(Self::name().to_string(), Self::para_ids())); - - $( <$parachain>::prepare_for_xcmp(); )* - } - } - - fn para_ids() -> Vec { - vec![$( - <$parachain>::para_id().into(), - )*] - } - - fn relay_block_number() -> u32 { - Self::Relay::ext_wrapper(|| { - ::System::block_number() - }) - } - - fn set_relay_block_number(number: u32) { - Self::Relay::ext_wrapper(|| { - ::System::set_block_number(number); - }) - } - - fn process_messages() { - while Self::has_unprocessed_messages() { - Self::process_upward_messages(); - Self::process_horizontal_messages(); - Self::process_downward_messages(); - Self::process_bridged_messages(); - } - } - - fn has_unprocessed_messages() -> bool { - $crate::DOWNWARD_MESSAGES.with(|b| !b.borrow_mut().get_mut(Self::name()).unwrap().is_empty()) - || $crate::HORIZONTAL_MESSAGES.with(|b| !b.borrow_mut().get_mut(Self::name()).unwrap().is_empty()) - || $crate::UPWARD_MESSAGES.with(|b| !b.borrow_mut().get_mut(Self::name()).unwrap().is_empty()) - || $crate::BRIDGED_MESSAGES.with(|b| !b.borrow_mut().get_mut(Self::name()).unwrap().is_empty()) - } - - fn process_downward_messages() { - use $crate::{DmpMessageHandler, Bounded}; - use polkadot_parachain::primitives::RelayChainBlockNumber; - - while let Some((to_para_id, messages)) - = $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) { - $( - let para_id: u32 = <$parachain>::para_id().into(); - - if $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().contains(&to_para_id)) && para_id == to_para_id { - let mut msg_dedup: Vec<(RelayChainBlockNumber, Vec)> = Vec::new(); - for m in &messages { - msg_dedup.push((m.0, m.1.clone())); - } - msg_dedup.dedup(); - - let msgs = msg_dedup.clone().into_iter().filter(|m| { - !$crate::DMP_DONE.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap_or(&mut $crate::VecDeque::new()).contains(&(to_para_id, m.0, m.1.clone()))) - }).collect::)>>(); - if msgs.len() != 0 { - <$parachain>::ext_wrapper(|| { - <$parachain as Parachain>::DmpMessageHandler::handle_dmp_messages(msgs.clone().into_iter(), $crate::Weight::max_value()); - }); - $crate::log::debug!(target: concat!("dmp::", stringify!($name)) , "DMP messages processed {:?} to para_id {:?}", msgs.clone(), &to_para_id); - for m in msgs { - $crate::DMP_DONE.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().push_back((to_para_id, m.0, m.1))); - } - } - } - )* - } - } - - fn process_horizontal_messages() { - use $crate::{XcmpMessageHandler, Bounded}; - - while let Some((to_para_id, messages)) - = $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) { - let iter = messages.iter().map(|(p, b, m)| (*p, *b, &m[..])).collect::>().into_iter(); - $( - let para_id: u32 = <$parachain>::para_id().into(); - - if $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().contains(&to_para_id)) && para_id == to_para_id { - <$parachain>::ext_wrapper(|| { - <$parachain as Parachain>::XcmpMessageHandler::handle_xcmp_messages(iter.clone(), $crate::Weight::max_value()); - }); - $crate::log::debug!(target: concat!("hrmp::", stringify!($name)) , "HRMP messages processed {:?} to para_id {:?}", &messages, &to_para_id); - } - )* - } - } - - fn process_upward_messages() { - use $crate::{Bounded, ProcessMessage, WeightMeter}; - use sp_core::Encode; - while let Some((from_para_id, msg)) = $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) { - let mut weight_meter = WeightMeter::max_limit(); - <$relay_chain>::ext_wrapper(|| { - let _ = <$relay_chain as RelayChain>::MessageProcessor::process_message( - &msg[..], - from_para_id.into(), - &mut weight_meter, - &mut msg.using_encoded(sp_core::blake2_256), - ); - }); - $crate::log::debug!(target: concat!("ump::", stringify!($name)) , "Upward message processed {:?} from para_id {:?}", &msg, &from_para_id); - } - } - - fn process_bridged_messages() { - use $crate::Bridge; - // Make sure both, including the target `Network` are initialized - ::init(); - - while let Some(msg) = $crate::BRIDGED_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) { - let dispatch_result = <::Target as TestExt>::ext_wrapper(|| { - <::Handler as BridgeMessageHandler>::dispatch_target_inbound_message(msg.clone()) - }); - - match dispatch_result { - Err(e) => panic!("Error {:?} processing bridged message: {:?}", e, msg.clone()), - Ok(()) => { - <::Source as TestExt>::ext_wrapper(|| { - <::Handler as BridgeMessageHandler>::notify_source_message_delivery(msg.id); - }); - $crate::log::debug!(target: concat!("bridge::", stringify!($name)) , "Bridged message processed {:?}", msg.clone()); - } - } - } - } - - fn hrmp_channel_parachain_inherent_data( - para_id: u32, - relay_parent_number: u32, - ) -> $crate::ParachainInherentData { - use $crate::cumulus_primitives_core::{relay_chain::HrmpChannelId, AbridgedHrmpChannel}; - - let mut sproof = $crate::RelayStateSproofBuilder::default(); - sproof.para_id = para_id.into(); - - // egress channel - let e_index = sproof.hrmp_egress_channel_index.get_or_insert_with(Vec::new); - for recipient_para_id in $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().clone()) { - let recipient_para_id = $crate::ParaId::from(recipient_para_id); - if let Err(idx) = e_index.binary_search(&recipient_para_id) { - e_index.insert(idx, recipient_para_id); - } - - sproof - .hrmp_channels - .entry(HrmpChannelId { - sender: sproof.para_id, - recipient: recipient_para_id, - }) - .or_insert_with(|| AbridgedHrmpChannel { - max_capacity: 1024, - max_total_size: 1024 * 1024, - max_message_size: 1024 * 1024, - msg_count: 0, - total_size: 0, - mqc_head: Option::None, - }); - } - - let (relay_storage_root, proof) = sproof.into_state_root_and_proof(); - - $crate::ParachainInherentData { - validation_data: $crate::PersistedValidationData { - parent_head: Default::default(), - relay_parent_number, - relay_parent_storage_root: relay_storage_root, - max_pov_size: Default::default(), - }, - relay_chain_state: proof, - downward_messages: Default::default(), - horizontal_messages: Default::default(), - } - } - } - - impl $crate::NetworkComponent for $relay_chain { - type Network = $name; - } - - $( - impl $crate::NetworkComponent for $parachain { - type Network = $name; - } - )* - )+ - }; -} - -#[macro_export] -macro_rules! decl_test_bridges { - ( - $( - pub struct $name:ident { - source = $source:ty, - target = $target:ty, - handler = $handler:ty - } - ), - + - ) => { - $( - #[derive(Debug)] - pub struct $name; - - impl $crate::Bridge for $name { - type Source = $source; - type Target = $target; - type Handler = $handler; - - fn init() { - use $crate::{NetworkComponent, Network}; - // Make sure source and target `Network` have been initialized - <$source as NetworkComponent>::Network::init(); - <$target as NetworkComponent>::Network::init(); - } - } - )+ - }; -} - -#[macro_export] -macro_rules! __impl_check_assertion { - ($chain:ident) => { - impl - $crate::CheckAssertion for $chain - where - Origin: Chain + Clone, - Destination: Chain + Clone, - Origin::RuntimeOrigin: $crate::OriginTrait + Clone, - Destination::RuntimeOrigin: - $crate::OriginTrait + Clone, - Hops: Clone, - Args: Clone, - { - fn check_assertion(test: $crate::Test) { - let chain_name = std::any::type_name::<$chain>(); - - <$chain>::execute_with(|| { - if let Some(dispatchable) = test.hops_dispatchable.get(chain_name) { - $crate::assert_ok!(dispatchable(test.clone())); - } - if let Some(assertion) = test.hops_assertion.get(chain_name) { - assertion(test); - } - }); - } - } - }; -} - -#[macro_export] -macro_rules! assert_expected_events { - ( $chain:ident, vec![$( $event_pat:pat => { $($attr:ident : $condition:expr, )* }, )*] ) => { - let mut message: Vec = Vec::new(); - let mut events = <$chain>::events(); - - $( - let mut event_received = false; - let mut meet_conditions = true; - let mut index_match = 0; - let mut event_message: Vec = Vec::new(); - - for (index, event) in events.iter().enumerate() { - // Have to reset the variable to override a previous partial match - meet_conditions = true; - match event { - $event_pat => { - event_received = true; - let mut conditions_message: Vec = Vec::new(); - - $( - // We only want to record condition error messages in case it did not happened before - // Only the first partial match is recorded - if !$condition && event_message.is_empty() { - conditions_message.push( - format!( - " - The attribute {:?} = {:?} did not met the condition {:?}\n", - stringify!($attr), - $attr, - stringify!($condition) - ) - ); - } - meet_conditions &= $condition; - )* - - // Set the index where we found a perfect match - if event_received && meet_conditions { - index_match = index; - break; - } else { - event_message.extend(conditions_message); - } - }, - _ => {} - } - } - - if event_received && !meet_conditions { - message.push( - format!( - "\n\n{}::\x1b[31m{}\x1b[0m was received but some of its attributes did not meet the conditions:\n{}", - stringify!($chain), - stringify!($event_pat), - event_message.concat() - ) - ); - } else if !event_received { - message.push(format!("\n\n{}::\x1b[31m{}\x1b[0m was never received", stringify!($chain), stringify!($event_pat))); - } else { - // If we find a perfect match we remove the event to avoid being potentially assessed multiple times - events.remove(index_match); - } - )* - - if !message.is_empty() { - // Log events as they will not be logged after the panic - <$chain>::events().iter().for_each(|event| { - $crate::log::debug!(target: concat!("events::", stringify!($chain)), "{:?}", event); - }); - panic!("{}", message.concat()) - } - } -} - -#[macro_export] -macro_rules! bx { - ($e:expr) => { - Box::new($e) - }; -} - -#[macro_export] -macro_rules! decl_test_sender_receiver_accounts_parameter_types { - ( $( $chain:ident { sender: $sender:expr, receiver: $receiver:expr }),+ ) => { - $crate::paste::paste! { - parameter_types! { - $( - pub [<$chain Sender>]: $crate::AccountId = <$chain>::account_id_of($sender); - pub [<$chain Receiver>]: $crate::AccountId = <$chain>::account_id_of($receiver); - )+ - } - } - }; -} - -pub struct DefaultMessageProcessor(PhantomData); -impl ProcessMessage for DefaultMessageProcessor -where - T: Chain + RelayChain, - T::Runtime: MessageQueueConfig, - <::MessageProcessor as ProcessMessage>::Origin: - PartialEq, - MessageQueuePallet: EnqueueMessage + ServiceQueues, -{ - type Origin = ParaId; - - fn process_message( - msg: &[u8], - para: Self::Origin, - _meter: &mut WeightMeter, - _id: &mut XcmHash, - ) -> Result { - MessageQueuePallet::::enqueue_message( - msg.try_into().expect("Message too long"), - AggregateMessageOrigin::Ump(UmpQueueId::Para(para)), - ); - MessageQueuePallet::::service_queues(Weight::MAX); - - Ok(true) - } -} - -/// Struct that keeps account's id and balance -#[derive(Clone)] -pub struct TestAccount { - pub account_id: AccountId, - pub balance: Balance, -} - -/// Default `Args` provided by xcm-emulator to be stored in a `Test` instance -#[derive(Clone)] -pub struct TestArgs { - pub dest: MultiLocation, - pub beneficiary: MultiLocation, - pub amount: Balance, - pub assets: MultiAssets, - pub asset_id: Option, - pub fee_asset_item: u32, - pub weight_limit: WeightLimit, -} - -/// Auxiliar struct to help creating a new `Test` instance -pub struct TestContext { - pub sender: AccountId, - pub receiver: AccountId, - pub args: T, -} - -/// Struct that help with tests where either dispatchables or assertions need -/// to be reused. The struct keeps the test's arguments of your choice in the generic `Args`. -/// These arguments can be easily reused and shared between the assertions functions -/// and dispatchables functions, which are also stored in `Test`. -/// `Origin` corresponds to the chain where the XCM interaction starts with an initial execution. -/// `Destination` corresponds to the last chain where an effect of the intial execution is expected -/// happen. `Hops` refer all the ordered intermediary chains an initial XCM execution can provoke -/// some effect. -#[derive(Clone)] -pub struct Test -where - Origin: Chain + Clone, - Destination: Chain + Clone, - Origin::RuntimeOrigin: OriginTrait + Clone, - Destination::RuntimeOrigin: OriginTrait + Clone, - Hops: Clone, -{ - pub sender: TestAccount, - pub receiver: TestAccount, - pub signed_origin: Origin::RuntimeOrigin, - pub root_origin: Origin::RuntimeOrigin, - pub hops_assertion: HashMap, - pub hops_dispatchable: HashMap DispatchResult>, - pub args: Args, - _marker: PhantomData<(Destination, Hops)>, -} - -/// `Test` implementation -impl Test -where - Args: Clone, - Origin: Chain + Clone + CheckAssertion, - Destination: Chain + Clone + CheckAssertion, - Origin::RuntimeOrigin: OriginTrait + Clone, - Destination::RuntimeOrigin: OriginTrait + Clone, - Hops: Clone + CheckAssertion, -{ - /// Creates a new `Test` instance - pub fn new(test_args: TestContext) -> Self { - Test { - sender: TestAccount { - account_id: test_args.sender.clone(), - balance: Origin::account_data_of(test_args.sender.clone()).free, - }, - receiver: TestAccount { - account_id: test_args.receiver.clone(), - balance: Destination::account_data_of(test_args.receiver.clone()).free, - }, - signed_origin: ::RuntimeOrigin::signed(test_args.sender), - root_origin: ::RuntimeOrigin::root(), - hops_assertion: Default::default(), - hops_dispatchable: Default::default(), - args: test_args.args, - _marker: Default::default(), - } - } - /// Stores an assertion in a particular Chain - pub fn set_assertion(&mut self, assertion: fn(Self)) { - let chain_name = std::any::type_name::(); - self.hops_assertion.insert(chain_name.to_string(), assertion); - } - /// Stores an assertion in a particular Chain - pub fn set_dispatchable(&mut self, dispatchable: fn(Self) -> DispatchResult) { - let chain_name = std::any::type_name::(); - self.hops_dispatchable.insert(chain_name.to_string(), dispatchable); - } - /// Executes all dispatchables and assertions in order from `Origin` to `Destination` - pub fn assert(&mut self) { - Origin::check_assertion(self.clone()); - Hops::check_assertion(self.clone()); - Destination::check_assertion(self.clone()); - Self::update_balances(self); - } - /// Updates sender and receiver balances - fn update_balances(&mut self) { - self.sender.balance = Origin::account_data_of(self.sender.account_id.clone()).free; - self.receiver.balance = Destination::account_data_of(self.receiver.account_id.clone()).free; - } -} - -pub mod helpers { - use super::*; - - pub fn within_threshold(threshold: u64, expected_value: u64, current_value: u64) -> bool { - let margin = (current_value * threshold) / 100; - let lower_limit = expected_value.checked_sub(margin).unwrap_or(u64::MIN); - let upper_limit = expected_value.checked_add(margin).unwrap_or(u64::MAX); - - current_value >= lower_limit && current_value <= upper_limit - } - - pub fn weight_within_threshold( - (threshold_time, threshold_size): (u64, u64), - expected_weight: Weight, - weight: Weight, - ) -> bool { - let ref_time_within = - within_threshold(threshold_time, expected_weight.ref_time(), weight.ref_time()); - let proof_size_within = - within_threshold(threshold_size, expected_weight.proof_size(), weight.proof_size()); - - ref_time_within && proof_size_within - } - - /// Helper function to generate an account ID from seed. - pub fn get_account_id_from_seed(seed: &str) -> AccountId - where - sp_runtime::MultiSigner: - From<<::Pair as sp_core::Pair>::Public>, - { - use sp_runtime::traits::IdentifyAccount; - let pubkey = TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public(); - sp_runtime::MultiSigner::from(pubkey).into_account() - } -} diff --git a/cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml b/cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml deleted file mode 100644 index 80b398ac7240..000000000000 --- a/cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +++ /dev/null @@ -1,104 +0,0 @@ -[settings] -node_spawn_timeout = 240 - -[relaychain] -default_command = "{{POLKADOT_BINARY_PATH}}" -default_args = [ "-lparachain=debug,xcm=trace" ] -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice-validator" - validator = true - rpc_port = 9932 - ws_port = 9942 - extra_args = ["--no-mdns --bootnodes {{'bob-validator'|zombie('multiAddress')}}"] - - [[relaychain.nodes]] - name = "bob-validator" - validator = true - rpc_port = 9933 - ws_port = 9943 - extra_args = ["--no-mdns --bootnodes {{'alice-validator'|zombie('multiAddress')}}"] - - [[relaychain.nodes]] - name = "charlie-validator" - validator = true - rpc_port = 9934 - ws_port = 9944 - extra_args = ["--no-mdns --bootnodes {{'alice-validator'|zombie('multiAddress')}}"] - -[[parachains]] -id = 1013 -chain = "bridge-hub-rococo-local" -cumulus_based = true - - # run alice as parachain collator - [[parachains.collators]] - name = "alice-collator" - validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" - rpc_port = 8933 - ws_port = 8943 - args = [ - "-lparachain=debug,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - ] - extra_args = [ - "--force-authoring", "--no-mdns", "--bootnodes {{'bob-collator'|zombie('multiAddress')}}", - "-- --port 41333 --rpc-port 48933 --ws-port 48943 --no-mdns", "--bootnodes {{'alice-validator'|zombie('multiAddress')}}" - ] - - # run bob as parachain collator - [[parachains.collators]] - name = "bob-collator" - validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" - rpc_port = 8934 - ws_port = 8944 - args = [ - "-lparachain=trace,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - ] - extra_args = [ - "--force-authoring", "--no-mdns", "--bootnodes {{'alice-collator'|zombie('multiAddress')}}", - "-- --port 41334 --rpc-port 48934 --ws-port 48944 --no-mdns", "--bootnodes {{'bob-validator'|zombie('multiAddress')}}" - ] - -[[parachains]] -id = 1000 -chain = "asset-hub-kusama-local" -cumulus_based = true - - [[parachains.collators]] - name = "rockmine-collator1" - rpc_port = 9911 - ws_port = 9910 - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO}}" - args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", - ] - extra_args = [ - "--no-mdns", "--bootnodes {{'rockmine-collator2'|zombie('multiAddress')}}", - "-- --port 51333 --rpc-port 58933 --ws-port 58943 --no-mdns", "--bootnodes {{'alice-validator'|zombie('multiAddress')}}" - ] - - [[parachains.collators]] - name = "rockmine-collator2" - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO}}" - args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", - ] - extra_args = [ - "--no-mdns", "--bootnodes {{'rockmine-collator1'|zombie('multiAddress')}}", - "-- --port 51433 --rpc-port 58833 --ws-port 58843 --no-mdns", "--bootnodes {{'alice-validator'|zombie('multiAddress')}}" - ] - -[[hrmp_channels]] -sender = 1000 -recipient = 1013 -max_capacity = 4 -max_message_size = 524288 - -[[hrmp_channels]] -sender = 1013 -recipient = 1000 -max_capacity = 4 -max_message_size = 524288 diff --git a/cumulus/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml b/cumulus/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml deleted file mode 100644 index 9727b4a087fd..000000000000 --- a/cumulus/zombienet/bridge-hubs/bridge_hub_wococo_local_network.toml +++ /dev/null @@ -1,104 +0,0 @@ -[settings] -node_spawn_timeout = 240 - -[relaychain] -default_command = "{{POLKADOT_BINARY_PATH}}" -default_args = [ "-lparachain=debug,xcm=trace" ] -chain = "wococo-local" - - [[relaychain.nodes]] - name = "alice-validator-wo" - validator = true - rpc_port = 9935 - ws_port = 9945 - extra_args = ["--no-mdns --bootnodes {{'bob-validator-wo'|zombie('multiAddress')}}"] - - [[relaychain.nodes]] - name = "bob-validator-wo" - validator = true - rpc_port = 9936 - ws_port = 9946 - extra_args = ["--no-mdns --bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}"] - - [[relaychain.nodes]] - name = "charlie-validator-wo" - validator = true - rpc_port = 9937 - ws_port = 9947 - extra_args = ["--no-mdns --bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}"] - -[[parachains]] -id = 1014 -chain = "bridge-hub-wococo-local" -cumulus_based = true - - # run alice as parachain collator - [[parachains.collators]] - name = "alice-collator-wo" - validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" - rpc_port = 8935 - ws_port = 8945 - args = [ - "-lparachain=debug,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - ] - extra_args = [ - "--force-authoring", "--no-mdns", "--bootnodes {{'bob-collator-wo'|zombie('multiAddress')}}", - "-- --port 41335 --rpc-port 48935 --ws-port 48945 --no-mdns", "--bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}" - ] - - # run bob as parachain collator - [[parachains.collators]] - name = "bob-collator-wo" - validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" - rpc_port = 8936 - ws_port = 8946 - args = [ - "-lparachain=trace,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - ] - extra_args = [ - "--force-authoring", "--no-mdns", "--bootnodes {{'alice-collator-wo'|zombie('multiAddress')}}", - "-- --port 41336 --rpc-port 48936 --ws-port 48946 --no-mdns", "--bootnodes {{'bob-validator-wo'|zombie('multiAddress')}}" - ] - -[[parachains]] -id = 1000 -chain = "asset-hub-westend-local" -cumulus_based = true - - [[parachains.collators]] - name = "wockmint-collator1" - rpc_port = 9011 - ws_port = 9010 - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WOCOCO}}" - args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", - ] - extra_args = [ - "--no-mdns", "--bootnodes {{'wockmint-collator2'|zombie('multiAddress')}}", - "-- --port 31333 --rpc-port 38933 --ws-port 38943 --no-mdns", "--bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}" - ] - - [[parachains.collators]] - name = "wockmint-collator2" - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WOCOCO}}" - args = [ - "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace", - ] - extra_args = [ - "--no-mdns", "--bootnodes {{'wockmint-collator1'|zombie('multiAddress')}}", - "-- --port 31433 --rpc-port 38833 --ws-port 38843 --no-mdns", "--bootnodes {{'alice-validator-wo'|zombie('multiAddress')}}" - ] - -[[hrmp_channels]] -sender = 1000 -recipient = 1014 -max_capacity = 4 -max_message_size = 524288 - -[[hrmp_channels]] -sender = 1014 -recipient = 1000 -max_capacity = 4 -max_message_size = 524288 diff --git a/cumulus/zombienet/examples/bridge_hub_kusama_local_network.toml b/cumulus/zombienet/examples/bridge_hub_kusama_local_network.toml deleted file mode 100644 index ae8ae07a75ce..000000000000 --- a/cumulus/zombienet/examples/bridge_hub_kusama_local_network.toml +++ /dev/null @@ -1,67 +0,0 @@ -[relaychain] -default_command = "../polkadot/target/release/polkadot" -default_args = [ "-lparachain=debug" ] -chain = "kusama-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - [[relaychain.nodes]] - name = "charlie" - validator = true - - [[relaychain.nodes]] - name = "dave" - validator = true - -[[parachains]] -id = 1003 -chain = "bridge-hub-kusama-local" -cumulus_based = true - - # run alice as parachain collator - [[parachains.collators]] - name = "alice" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run bob as parachain collator - [[parachains.collators]] - name = "bob" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run dave as parachain collator - [[parachains.collators]] - name = "dave" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run eve as parachain collator - [[parachains.collators]] - name = "eve" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run ferdie as parachain collator - [[parachains.collators]] - name = "ferdie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] diff --git a/cumulus/zombienet/examples/bridge_hub_polkadot_local_network.toml b/cumulus/zombienet/examples/bridge_hub_polkadot_local_network.toml deleted file mode 100644 index 564fece7cae7..000000000000 --- a/cumulus/zombienet/examples/bridge_hub_polkadot_local_network.toml +++ /dev/null @@ -1,67 +0,0 @@ -[relaychain] -default_command = "../polkadot/target/release/polkadot" -default_args = [ "-lparachain=debug" ] -chain = "polkadot-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - [[relaychain.nodes]] - name = "charlie" - validator = true - - [[relaychain.nodes]] - name = "dave" - validator = true - -[[parachains]] -id = 1003 -chain = "bridge-hub-polkadot-local" -cumulus_based = true - - # run alice as parachain collator - [[parachains.collators]] - name = "alice" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run bob as parachain collator - [[parachains.collators]] - name = "bob" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run dave as parachain collator - [[parachains.collators]] - name = "dave" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run eve as parachain collator - [[parachains.collators]] - name = "eve" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run ferdie as parachain collator - [[parachains.collators]] - name = "ferdie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] diff --git a/cumulus/zombienet/examples/bridge_hub_rococo_local_network.toml b/cumulus/zombienet/examples/bridge_hub_rococo_local_network.toml deleted file mode 100644 index 92a2397ab9d1..000000000000 --- a/cumulus/zombienet/examples/bridge_hub_rococo_local_network.toml +++ /dev/null @@ -1,67 +0,0 @@ -[relaychain] -default_command = "../polkadot/target/release/polkadot" -default_args = [ "-lparachain=debug" ] -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - [[relaychain.nodes]] - name = "charlie" - validator = true - - [[relaychain.nodes]] - name = "dave" - validator = true - -[[parachains]] -id = 1013 -chain = "bridge-hub-rococo-local" -cumulus_based = true - - # run alice as parachain collator - [[parachains.collators]] - name = "alice" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run bob as parachain collator - [[parachains.collators]] - name = "bob" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run dave as parachain collator - [[parachains.collators]] - name = "dave" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run eve as parachain collator - [[parachains.collators]] - name = "eve" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run ferdie as parachain collator - [[parachains.collators]] - name = "ferdie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] diff --git a/cumulus/zombienet/examples/small_network.toml b/cumulus/zombienet/examples/small_network.toml deleted file mode 100644 index 06ac0d0e5e78..000000000000 --- a/cumulus/zombienet/examples/small_network.toml +++ /dev/null @@ -1,25 +0,0 @@ -[relaychain] -default_image = "parity/polkadot:latest" -default_command = "polkadot" -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - -[[parachains]] -id = 2000 -cumulus_based = true -chain = "asset-hub-kusama-local" - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - image = "parity/polkadot-parachain:latest" - command = "polkadot-parachain" - args = ["--force-authoring"] diff --git a/cumulus/zombienet/examples/statemine_kusama_local_network.toml b/cumulus/zombienet/examples/statemine_kusama_local_network.toml deleted file mode 100644 index 1f3debfb9d29..000000000000 --- a/cumulus/zombienet/examples/statemine_kusama_local_network.toml +++ /dev/null @@ -1,67 +0,0 @@ -[relaychain] -default_command = "../polkadot/target/release/polkadot" -default_args = [ "-lparachain=debug" ] -chain = "kusama-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - [[relaychain.nodes]] - name = "charlie" - validator = true - - [[relaychain.nodes]] - name = "dave" - validator = true - -[[parachains]] -id = 1000 -chain = "asset-hub-kusama-local" -cumulus_based = true - - # run alice as parachain collator - [[parachains.collators]] - name = "alice" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run bob as parachain collator - [[parachains.collators]] - name = "bob" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run dave as parachain collator - [[parachains.collators]] - name = "dave" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run eve as parachain collator - [[parachains.collators]] - name = "eve" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] - - # run ferdie as parachain collator - [[parachains.collators]] - name = "ferdie" - validator = true - command = "./target/release/polkadot-parachain" - args = ["-lparachain=debug"] diff --git a/cumulus/zombienet/tests/0001-sync_blocks_from_tip_without_connected_collator.toml b/cumulus/zombienet/tests/0001-sync_blocks_from_tip_without_connected_collator.toml deleted file mode 100644 index c0d49b31293b..000000000000 --- a/cumulus/zombienet/tests/0001-sync_blocks_from_tip_without_connected_collator.toml +++ /dev/null @@ -1,50 +0,0 @@ -[relaychain] -default_image = "{{RELAY_IMAGE}}" -default_command = "polkadot" -default_args = [ "-lparachain=debug" ] - -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - -[[parachains]] -id = 2000 -cumulus_based = true - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - - # run dave as parachain full node - [[parachains.collators]] - name = "dave" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - - # run eve as parachain full node that is only connected to dave - [[parachains.collators]] - name = "eve" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["--reserved-only", "--reserved-nodes {{'dave'|zombie('multiAddress')}}"] - - # run ferdie as parachain full node that is only connected to dave - [[parachains.collators]] - name = "ferdie" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["--reserved-only", "--reserved-nodes {{'dave'|zombie('multiAddress')}}", "--relay-chain-rpc-url {{'alice'|zombie('wsUri')}}"] diff --git a/cumulus/zombienet/tests/0001-sync_blocks_from_tip_without_connected_collator.zndsl b/cumulus/zombienet/tests/0001-sync_blocks_from_tip_without_connected_collator.zndsl deleted file mode 100644 index bdb475ce9215..000000000000 --- a/cumulus/zombienet/tests/0001-sync_blocks_from_tip_without_connected_collator.zndsl +++ /dev/null @@ -1,9 +0,0 @@ -Description: Sync blocks from tip without connected collator test -Network: ./0001-sync_blocks_from_tip_without_connected_collator.toml -Creds: config - -alice: parachain 2000 is registered within 225 seconds -alice: parachain 2000 block height is at least 10 within 250 seconds - -ferdie: reports block height is at least 12 within 250 seconds -eve: reports block height is at least 12 within 250 seconds \ No newline at end of file diff --git a/cumulus/zombienet/tests/0002-pov_recovery.toml b/cumulus/zombienet/tests/0002-pov_recovery.toml deleted file mode 100644 index 0df0293e3484..000000000000 --- a/cumulus/zombienet/tests/0002-pov_recovery.toml +++ /dev/null @@ -1,75 +0,0 @@ -[relaychain] -default_image = "{{RELAY_IMAGE}}" -default_command = "polkadot" - -chain = "rococo-local" - -[relaychain.genesis.runtime.runtime_genesis_config.configuration.config] -# set parameters such that collators only connect to 1 validator as a backing group -max_validators_per_core = 1 -group_rotation_frequency = 100 # 10 mins - - [[relaychain.nodes]] - name = "ferdie" # bootnode fullnode - validator = false - - [[relaychain.node_groups]] - name = "validator" - count = 13 - args = ["-lparachain::availability=trace,sync=debug,parachain=debug", "--reserved-only", "--reserved-nodes {{'ferdie'|zombie('multiAddress')}}"] - -[[parachains]] -id = 2000 -cumulus_based = true -register_para = false -add_to_genesis = false - - # run bob as a parachain collator who is the only one producing blocks - # alice and charlie will need to recover the pov blocks through availability recovery - [[parachains.collators]] - name = "bob" - validator = true # collator - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["--disable-block-announcements"] - - # run alice as a parachain collator who does not produce blocks - # alice is a bootnode for bob and charlie - [[parachains.collators]] - name = "alice" - validator = true # collator - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain::availability=trace,sync=debug,parachain=debug,cumulus-pov-recovery=debug,cumulus-consensus=debug", "--use-null-consensus", "--disable-block-announcements", "--bootnodes {{'bob'|zombie('multiAddress')}}", "--", "--reserved-only", "--reserved-nodes {{'ferdie'|zombie('multiAddress')}}"] - - # run eve as a parachain full node - [[parachains.collators]] - name = "charlie" - validator = false # full node - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain::availability=trace,sync=debug,parachain=debug,cumulus-pov-recovery=debug,cumulus-consensus=debug", "--disable-block-announcements", "--bootnodes {{'bob'|zombie('multiAddress')}}","--", "--reserved-only", "--reserved-nodes {{'ferdie'|zombie('multiAddress')}}"] - - # we fail recovery for eve from time to time to test retries - [[parachains.collators]] - name = "eve" - validator = true # collator - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain::availability=trace,sync=debug,parachain=debug,cumulus-pov-recovery=debug,cumulus-consensus=debug", "--fail-pov-recovery", "--use-null-consensus", "--disable-block-announcements", "--bootnodes {{'bob'|zombie('multiAddress')}}", "--", "--reserved-only", "--reserved-nodes {{'ferdie'|zombie('multiAddress')}}"] - - # run one as a RPC collator who does not produce blocks - [[parachains.collators]] - name = "one" - validator = true # collator - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain::availability=trace,sync=debug,parachain=debug,cumulus-pov-recovery=debug,cumulus-consensus=debug", "--use-null-consensus", "--disable-block-announcements", "--bootnodes {{'bob'|zombie('multiAddress')}}", "--relay-chain-rpc-url {{'ferdie'|zombie('wsUri')}}", "--", "--reserved-only", "--reserved-nodes {{'ferdie'|zombie('multiAddress')}}"] - - # run two as a RPC parachain full node - [[parachains.collators]] - name = "two" - validator = false # full node - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain::availability=trace,sync=debug,parachain=debug,cumulus-pov-recovery=debug,cumulus-consensus=debug", "--disable-block-announcements", "--bootnodes {{'bob'|zombie('multiAddress')}}", "--relay-chain-rpc-url {{'ferdie'|zombie('wsUri')}}", "--", "--reserved-only", "--reserved-nodes {{'ferdie'|zombie('multiAddress')}}"] diff --git a/cumulus/zombienet/tests/0002-pov_recovery.zndsl b/cumulus/zombienet/tests/0002-pov_recovery.zndsl deleted file mode 100644 index 3eb28bb2aebc..000000000000 --- a/cumulus/zombienet/tests/0002-pov_recovery.zndsl +++ /dev/null @@ -1,16 +0,0 @@ -Description: PoV recovery test -Network: ./0002-pov_recovery.toml -Creds: config - -# wait 20 blocks and register parachain -validator-3: reports block height is at least 20 within 250 seconds -validator-0: js-script ./register-para.js with "2000" within 240 seconds -validator-0: parachain 2000 is registered within 300 seconds - -# check block production -bob: reports block height is at least 20 within 600 seconds -alice: reports block height is at least 20 within 600 seconds -charlie: reports block height is at least 20 within 600 seconds -one: reports block height is at least 20 within 800 seconds -two: reports block height is at least 20 within 800 seconds -eve: reports block height is at least 20 within 800 seconds diff --git a/cumulus/zombienet/tests/0003-full_node_catching_up.toml b/cumulus/zombienet/tests/0003-full_node_catching_up.toml deleted file mode 100644 index 48ce352975f3..000000000000 --- a/cumulus/zombienet/tests/0003-full_node_catching_up.toml +++ /dev/null @@ -1,42 +0,0 @@ -[relaychain] -default_image = "{{RELAY_IMAGE}}" -default_command = "polkadot" -default_args = [ "-lparachain=debug" ] - -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - -[[parachains]] -id = 2000 -cumulus_based = true - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - - # run cumulus dave (a parachain full node) and wait for it to sync some blocks - [[parachains.collators]] - name = "dave" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["--reserved-only", "--reserved-nodes {{'charlie'|zombie('multiAddress')}}"] - - # run cumulus eve (a parachain full node) and wait for it to sync some blocks - [[parachains.collators]] - name = "eve" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["--reserved-only", "--reserved-nodes {{'charlie'|zombie('multiAddress')}}", "--relay-chain-rpc-url {{'alice'|zombie('wsUri')}}"] diff --git a/cumulus/zombienet/tests/0003-full_node_catching_up.zndsl b/cumulus/zombienet/tests/0003-full_node_catching_up.zndsl deleted file mode 100644 index 9c6eb0fb8302..000000000000 --- a/cumulus/zombienet/tests/0003-full_node_catching_up.zndsl +++ /dev/null @@ -1,7 +0,0 @@ -Description: Full node catching up test -Network: ./0003-full_node_catching_up.toml -Creds: config - -alice: parachain 2000 is registered within 225 seconds -dave: reports block height is at least 7 within 250 seconds -eve: reports block height is at least 7 within 250 seconds diff --git a/cumulus/zombienet/tests/0004-runtime_upgrade.toml b/cumulus/zombienet/tests/0004-runtime_upgrade.toml deleted file mode 100644 index fbf0dfc69163..000000000000 --- a/cumulus/zombienet/tests/0004-runtime_upgrade.toml +++ /dev/null @@ -1,33 +0,0 @@ -[relaychain] -default_image = "{{RELAY_IMAGE}}" -default_command = "polkadot" -default_args = [ "-lparachain=debug" ] - -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - -[[parachains]] -id = 2000 -cumulus_based = true - - # run charlie as parachain collator - [[parachains.collators]] - name = "charlie" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - - # Run dave as parachain full node - [[parachains.collators]] - name = "dave" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" diff --git a/cumulus/zombienet/tests/0004-runtime_upgrade.zndsl b/cumulus/zombienet/tests/0004-runtime_upgrade.zndsl deleted file mode 100644 index cdafc48fce9e..000000000000 --- a/cumulus/zombienet/tests/0004-runtime_upgrade.zndsl +++ /dev/null @@ -1,9 +0,0 @@ -Description: Runtime Upgrade test -Network: ./0004-runtime_upgrade.toml -Creds: config - -alice: parachain 2000 is registered within 225 seconds -charlie: reports block height is at least 5 within 250 seconds -charlie: parachain 2000 perform upgrade with /tmp/wasm_binary_spec_version_incremented.rs.compact.compressed.wasm within 200 seconds -dave: reports block height is at least 20 within 250 seconds -dave: js-script ./runtime_upgrade.js within 200 seconds diff --git a/cumulus/zombienet/tests/0005-migrate_solo_to_para.toml b/cumulus/zombienet/tests/0005-migrate_solo_to_para.toml deleted file mode 100644 index f98c0e6f2592..000000000000 --- a/cumulus/zombienet/tests/0005-migrate_solo_to_para.toml +++ /dev/null @@ -1,45 +0,0 @@ -[relaychain] -default_image = "{{RELAY_IMAGE}}" -default_command = "polkadot" -default_args = [ "-lparachain=debug" ] - -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - -[[parachains]] -id = 2000 -cumulus_based = true - - # run the solo chain (in our case this is also already a parachain, but as it has a different genesis it will not produce any blocks.) - [[parachains.collators]] - name = "dave" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - -[[parachains]] -id = 2000 -cumulus_based = true -add_to_genesis = false -register_para = false -# Set some random value in the genesis state to create a different genesis hash. -[parachains.genesis.runtime.runtime_genesis_config.sudo] -key = "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty" - - # run the parachain that will be used to return the header of the solo chain. - [[parachains.collators]] - name = "eve" - validator = true - add_to_bootnodes = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] diff --git a/cumulus/zombienet/tests/0005-migrate_solo_to_para.zndsl b/cumulus/zombienet/tests/0005-migrate_solo_to_para.zndsl deleted file mode 100644 index 677eb87a2e65..000000000000 --- a/cumulus/zombienet/tests/0005-migrate_solo_to_para.zndsl +++ /dev/null @@ -1,9 +0,0 @@ -Description: Migrate solo to para -Network: ./0005-migrate_solo_to_para.toml -Creds: config - -alice: parachain 2000 is registered within 225 seconds -alice: reports block height is at least 10 within 250 seconds -alice: parachain 2000 block height is at least 10 within 250 seconds -eve: reports block height is 0 within 20 seconds -dave: js-script ./migrate_solo_to_para.js with "dave,2000-1,eve" within 200 seconds diff --git a/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.toml b/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.toml deleted file mode 100644 index 693ca578190d..000000000000 --- a/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.toml +++ /dev/null @@ -1,50 +0,0 @@ -[relaychain] -default_image = "{{RELAY_IMAGE}}" -default_command = "polkadot" -default_args = [ "-lparachain=debug" ] - -chain = "rococo-local" - - [[relaychain.nodes]] - name = "alice" - validator = true - - [[relaychain.nodes]] - name = "bob" - validator = true - - [[relaychain.nodes]] - name = "charlie" - validator = true - - [[relaychain.nodes]] - name = "one" - validator = false - - [[relaychain.nodes]] - name = "two" - validator = false - - [[relaychain.nodes]] - name = "three" - validator = false - -[[parachains]] -id = 2000 -cumulus_based = true - - # run dave as parachain full node - [[parachains.collators]] - name = "dave" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=trace,blockchain-rpc-client=debug", "--relay-chain-rpc-urls {{'one'|zombie('wsUri')}} {{'two'|zombie('wsUri')}} {{'three'|zombie('wsUri')}}", "--", "--bootnodes {{'one'|zombie('multiAddress')}} {{'two'|zombie('multiAddress')}} {{'three'|zombie('multiAddress')}}"] - - # run eve as parachain full node - [[parachains.collators]] - name = "eve" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=trace,blockchain-rpc-client=debug", "--relay-chain-rpc-urls {{'one'|zombie('wsUri')}} {{'two'|zombie('wsUri')}} {{'three'|zombie('wsUri')}}", "--", "--bootnodes {{'one'|zombie('multiAddress')}} {{'two'|zombie('multiAddress')}} {{'three'|zombie('multiAddress')}}"] diff --git a/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.zndsl b/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.zndsl deleted file mode 100644 index 7da8416d0161..000000000000 --- a/cumulus/zombienet/tests/0006-rpc_collator_builds_blocks.zndsl +++ /dev/null @@ -1,15 +0,0 @@ -Description: RPC collator should build blocks -Network: ./0006-rpc_collator_builds_blocks.toml -Creds: config - -alice: parachain 2000 is registered within 225 seconds -alice: parachain 2000 block height is at least 10 within 250 seconds - -eve: reports block height is at least 12 within 250 seconds -dave: reports block height is at least 12 within 250 seconds -one: restart after 1 seconds -dave: reports block height is at least 20 within 200 seconds -two: restart after 1 seconds -three: restart after 20 seconds -dave: is up -dave: reports block height is at least 30 within 200 seconds diff --git a/cumulus/zombienet/tests/0007-full_node_warp_sync.toml b/cumulus/zombienet/tests/0007-full_node_warp_sync.toml deleted file mode 100644 index 493363fd3cfb..000000000000 --- a/cumulus/zombienet/tests/0007-full_node_warp_sync.toml +++ /dev/null @@ -1,77 +0,0 @@ -[relaychain] -default_image = "{{RELAY_IMAGE}}" -default_command = "polkadot" -default_args = [ "-lparachain=debug" ] -chain = "rococo-local" -chain_spec_path = "zombienet/tests/0007-warp-sync-relaychain-spec.json" - - [[relaychain.nodes]] - name = "alice" - validator = true - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-1964f8b557f10085cdc18f4105ad0bbb3df4c4c6.tgz" - - [[relaychain.nodes]] - name = "bob" - validator = true - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-1964f8b557f10085cdc18f4105ad0bbb3df4c4c6.tgz" - - [[relaychain.nodes]] - name = "charlie" - validator = true - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-1964f8b557f10085cdc18f4105ad0bbb3df4c4c6.tgz" - - [[relaychain.nodes]] - name = "dave" - validator = true - args = ["--sync warp", "--reserved-only", "--reserved-nodes {{'alice'|zombie('multiAddress')}} {{'bob'|zombie('multiAddress')}} {{'charlie'|zombie('multiAddress')}}"] - -[[parachains]] -id = 2000 -cumulus_based = true -chain_spec_path = "zombienet/tests/0007-warp-sync-parachain-spec.json" -add_to_genesis = false - - [[parachains.collators]] - name = "dave" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-587c1ed24ddd7de05c237cf7c158fff53b8f5b26.tgz" - - [[parachains.collators]] - name = "eve" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-587c1ed24ddd7de05c237cf7c158fff53b8f5b26.tgz" - - [[parachains.collators]] - name = "ferdie" - validator = true - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lparachain=debug"] - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-587c1ed24ddd7de05c237cf7c158fff53b8f5b26.tgz" - - [[parachains.collators]] - name = "one" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lsync=debug","--sync warp","--","--sync warp"] - - [[parachains.collators]] - name = "two" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lsync=debug","--sync warp","--relay-chain-rpc-urls {{'alice'|zombie('wsUri')}}"] - - [[parachains.collators]] - name = "three" - validator = false - image = "{{COL_IMAGE}}" - command = "test-parachain" - args = ["-lsync=debug","--sync warp","--relay-chain-rpc-urls {{'dave'|zombie('wsUri')}}"] diff --git a/cumulus/zombienet/tests/0007-full_node_warp_sync.zndsl b/cumulus/zombienet/tests/0007-full_node_warp_sync.zndsl deleted file mode 100644 index 1bcc35e80c41..000000000000 --- a/cumulus/zombienet/tests/0007-full_node_warp_sync.zndsl +++ /dev/null @@ -1,8 +0,0 @@ -Description: Full node catching up using warp sync -Network: ./0007-full_node_warp_sync.toml -Creds: config - -alice: parachain 2000 is registered within 225 seconds -one: reports block height is at least 770 within 225 seconds -two: reports block height is at least 770 within 225 seconds -three: reports block height is at least 770 within 225 seconds \ No newline at end of file diff --git a/cumulus/zombienet/tests/0007-prepare-warp-sync-db-snapshot.md b/cumulus/zombienet/tests/0007-prepare-warp-sync-db-snapshot.md deleted file mode 100644 index 7885dd0c0269..000000000000 --- a/cumulus/zombienet/tests/0007-prepare-warp-sync-db-snapshot.md +++ /dev/null @@ -1,37 +0,0 @@ -# Database snapshot guide - -For this guide we will be taking a snapshot of a parachain and relay chain. Please note we are using a local chain here `rococo_local_testnet` and `local_testnet`. Live chains will have different values - -*Please ensure that the database is not in current use, i.e no nodes are writing to it* - -# How to prepare database for a relaychain -To prepare snapshot for a relay chain we need to copy the database. - -``` -mkdir -p relaychain-snapshot/alice/data/chains/rococo_local_testnet/db/ - -cp -r chain-data/alice/data/chains/rococo_local_testnet/db/. relaychain-snapshot/alice/data/chains/rococo_local_testnet/db/ - -tar -C relaychain-snapshot/alice/ -czf relaychain.tgz data -``` -# How to prepare database for a parachain - -To prepare snapshot for a parachain we need to copy the database for both the collator node (parachain data) and validator (relay data) - -``` -#Parachain data -mkdir -p parachain-snapshot/charlie/data/chains/local_testnet/db/ - -# Relay data -mkdir -p parachain-snapshot/charlie/relay-data/chains/rococo_local_testnet/db/ - -cp -r chain-data/charlie/data/chains/local_testnet/db/. parachain-snapshot/charlie/data/chains/local_testnet/db/ - -cp -r chain-data/charlie/relay-data/chains/rococo_local_testnet/db/. parachain-snapshot/charlie/relay-data/chains/rococo_local_testnet/db/ - -tar -C parachain-snapshot/charlie/ -czf parachain.tgz data relay-data -``` - -# Restoring a snapshot -Zombienet will automatically download the `*.tgz` file to the respective folder for a run. However you can also download it manually, just ensure you extract the tar file in the correct directory, i.e. the root directory -`chain-data/charlie/` \ No newline at end of file diff --git a/cumulus/zombienet/tests/0007-warp-sync-parachain-spec.json b/cumulus/zombienet/tests/0007-warp-sync-parachain-spec.json deleted file mode 100644 index 306e82e8d03d..000000000000 --- a/cumulus/zombienet/tests/0007-warp-sync-parachain-spec.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "Local Testnet", - "id": "local_testnet", - "chainType": "Local", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/63048/ws/p2p/12D3KooWKM1HeSv61ryZwAiBTZnqmass5pYM48k9Z7obzhTbnphm" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": null, - "para_id": 2000, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x2089cf3645f21ef4a51744f13e6e4e45": "0xd0070000", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x045863756d756c75732d746573742d70617261636861696e", - "0x2b746573745f72756e74696d655f757067726164655f6b65792b": "0x01020304", - "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058141105def98535124d107877930ef0565839f8f5c1e2f0077f0fad17c87323feddec14ff657b8b1316becd112e7e9b1869497315cfa9942f3bd3522e26b2907799a96820d709ac8778336b37217befbde59652a69452a31276112112514e4d04e913aaf0a8cf13fc73d5205479987a92e28907dacfe2848ae1a964908ae151e944fd89921adca00a50da080ae28932284a50108ffa74e22d271397c3e2a6eeb676ce2ec0031a6394e151d7ec02335bc8820ee2a082326578d46dbe1916e16ae7b6e7bb547ccfdbe3a6bd0719dbac8797d0d9f37d3d5139e3474c7aeeb6fdabb1750e9f73dbbe63c6827a5420bd1dbd2b6fe80dbdbd821e617b436fcabbfb829bfeebe128f80eb3435fe837cef7f96fdc14a03f0abe6ddf6d2eea0f65325cfadc2910e8ea4f81c0ed07263d57c2e730e9b9663d6312d15bc7f2e7a4d6b9fc390f2e3926457f0e840271fd11fdf9b5698c13ddda22e3c41cb175468c13bdf2e7aae5e70fff3c8702d97f0ea377971dd617bd9d8a95e7c1a4e8eceb9b45bfa1bc9fff86923f5be629d7139526bc9ea82ce1474c8a0e7fdc575299149ffe50d7cce90ff51d86dbfe13363dee1f5cca25aaddc9b9ef306adb7f9b73cd843c77ce6ffbd93241da9d4f31463308b43b8feee48cef28dfeca789284e4009fa9f598237c0a1cc4367627a28993c572651723ae7b72589519c80f23f5b6636c119912867139766429e3b775910e8aa3fe6a3b67db8fd6c995f7f3d4ede0c6977deeea40fbb933f4e7ef6f35b26e3a2fcdaace772cc9fc72d73552021877e85b620a69f985fae599018f289ae8e6d33fafab5af272aa77ffa03fa0e337bb645b7b6fdebd20c02ec55e5d956b9b5e9ba663d959c9563d5b67ff90e5fba617e6dfa97664254ce7d75cc2fc62e21d6abfe98ead7b5d885f90e2b766d71c398d47e44c3fc72eb671c121f933e95b36fb3f2f59dd68c087bb5d9cf9679cb777a87ad4dbfdaf4a33edcdee636c724c5b6af5cda01cdf91cfd8b4070e9e5fcf3e73f70e9e69f53b9f2cf79b00ef33c21feedf0cf352eb1bff79eab8f277df4f4e4525dd54de2d2378331c9d918c1a5e95f7afc5433def9732a3e7f0afa54304f39105c9aa31d2ecd380497a6a604972817824b374f7906d878ca3bc03a8ea7158c7679ca954b3c7edafc04e2a9e73bcce3e28d9ab2533ce51763bcf18f5cf0945fcaab1dfad932af94db70c9394539e5ea83923e3aa6b544910577405b1ff16041d0b3cdbb901e7d7bebea2c4fbbd6362fe452cb0c6d62639e5db31929907dedd2d0c544734c52e97a2322b9dad5c7d41397eebe7976c77e6acf3e3026ed9880b2814510c0acc10b18b8600c3c3a9a71bbee1c8828c2e8300fbb10bded633a9e1d5b89bd9ea2f8f24e8e98b47a72c3a51fd0d867c40270e90534f62bd485ebf50405981ff1b84c5966b0022a6499810bce1006cfb6af7fad63d23a2ec23189af4b3321504e7fe851df8c63929c40fd968fb874793b0f2e5117555572566e7945614cd2b84455de7e51dbfe553109f3cd848c1e931373cba94d1fdb80fa2bbf96753b446dfad7a66f55a35f8fad0385f328e3a8fe983c7ee584febcfdea5db8e933603d6e40ef17bb186be2a1eb366367fa66d6d5650a673026f960523be5ce24aa7573dbdc57871b50bffa6e1a93d837eb51f96464126befb1755c50505050104f3b4981f4b78fb7f6d1a0bd3723b4f5f83c42f1e5d9b1111441cfcee3b9cc086d5df79d894bf9ba1433f58e6b7d37324f4ed33fdf6d36b6dbfeb55376ca1a9df54ca9c2399eb5d115cfcec3b3f81d342ecdeb19c710d5c2ff6c999f463e0ba269bcfaf530e70562cf0c0a8353c25c0ddf320042ea970251a9fa637753263de998a412d0e6e8d9dbddfea88d67e74122f3ec3bb86dc4a4c9e3d7ed6bc2fa0ad4e0155879e627c6e82582ee9e5f3b42606837ced7db9f43efac07c27d4e0e59efb73bc6a51ed0f4f444987fafa727a2bccea8b1ce6940178fd62451ef0334cd1e607ae76494a65d077cd180226a80e95665674c9d33224cefa3f2e7c9ab4f766dc190a2c6eb498a979ff19d17e0f524e58a7717dcae7d1911a67742f6a14fd34319790b81f1fc7259cfeb8c08d3b766d06fa00cb20f1dcac8a475dd571f4efa68572e1ede2d24c6ae06b9f401eeb1bf44f0353bcb76f7a010f6f61d562edd04616f6f389ffbb43b87d02397f821f6a74b1fa05d22e5123b9742e6f557462639777e89767e9ebcfbd977120497728b2297dad99de3acc76d4684c96dfb9a75072ee51237a6dba53ea2b081e570690af1ed932404979cb7efc025eadb352ee9298a986fb7611de6f141fdfce1dbafc59475b4c651c7251ff6751b2eb1b72beb68e3b49b5126614c5a777e31b68ead2beb288f3a16e6d53763d72c08bbf321ec0ee312ebe90997f2a5ae3ee6063dab134d4f54d8f80dd2694c371fcda75d7f6e10bf9ea488f2fbeb9b15b1505ee5dc20e7ba3571afee3622a257ef4d15c8747e33c47a277f44afae687cce4f2df3b39df5755326e9b653b4f57d6504a86ff6e33fdab7dc205e820abefc8ccfeccccc5c9e9999d9d5072f7169073476e712894bd38db8d4ee430553be1d639de6e91df8278f6f6f775cf2d1d22727490e129a9e9cb8e2f504858d9fa4673fc0eb09cae935eb918036b51dd6348c4beafcfcd5afb7e9f7b67fa90fda3e6cec6dd037eb69e89a11617a786d36e43994f3f9f38bb321da3fd7cc31c9f9e5b0def6afc6e0f67c3365d2b4f9f5ebd20cca697ae8bdcdf8bc7b9beea1eff0d5db74c0b75f9a517236f194f736f5f4ed6f9bcaa4269850c24806be7d2a93a611df3edf10dfbed36fd3a7b69f2e53a60c997fdedb14e29d5f8bf5e6fc6dfa9a15413ddc7ea87f72eeb7fcd93265ca94f969fa76b72993563a26ade7bc02c004d741b9d43ac3ba94d4014d4f50b6fc8caf27285a5e1d639de5511f71494f41645e9dc7abab0f65c0a53f5c977249f7d7d52f9172491d97d8d5afbd1ca65cd29ff155671c50851626e9b7f376f6ce7a58eace38a08a2d4cd25fef4d9ddcac2732a95db32134eb61dfe16dc2a5cfeccb2c77d8b44bc4b5be9b04b45350989feed9e37a8cda3aca3853fbf5a9bddb45a2b779db7778bbbb7bbd7b993d3ecb1b22ecce799de5646fdefd72a98fe9cf7ee901b44b7dd0d4db35eb51df2c4813414141505ea53269c667bf18532ead734999c4bec3bd3926b1f7a0391f71495fe312bb0d97dad9475cda67d7aca7ddd6448767628abf1e7fe50d9175e7eb4e02edb7d4ac67e55c7f0580a9779f70e9ab8fa93dfb15b9347784c0d0d627f67cf566006dbd5d5db322d67d5a46264df7ea3b7cedd60fc37c132c742db69b7b4c812cd931ff437d139a26d8afb38714c8920dfa1f067c13f8ebec2205b26483fe8701bfceaed9101714f4eb3b7c31a60a647db62b93d42397e67ebbfad55b6492fa0fad5d5d33218e49ea2d2393d477f8626c377e4c812cd9d33781bfce9e2990251bf43f0cf875f6cd8ad0827e1de3923ebb664336e8d7777887777887755326a9ab0f963eda2b004cbccc854bf95a572e4df595ca247575d3ee8d4b4f41585ea94b11a0adab6b15c2e2002b30c10a7d110242e88a9095d095500c425484a4084d09419189216342e6253b4256459645f682cc0559956c8a2c0619958c05991459141610322cac1c6457322a322c5610321b585d584db098608db1b86075c1528295040b095617eb081619d618d6c912c3fa6241c17a82e504ab0ccb0c56192c32586b5863b0c46085c152c30283f505cb0b9618cb0a9616ac2c584bb0bc5855b0c058685854b0b060a5615dc11a82158645048b8b2504cb0bab07d6161617160d2c2b2c272c29aa32560b2a315463a8b05039a10a420584ea07d596ac0515964a07550eaa1b543ba86c50f1a0b2525151bda0aa52c1a092a26a017761304031b017380cf10a9512e00ee016d5140c835e4353a96440d1c04da1d8105510a34427a2940825ae203ed15f60151c0e1e1b54192832550cac18846410b241954595a5f2013503ea069916c8051cc3424165c179c15ae02c382add0316a3b9a0a2d02ca0aef416b18c2c0c991a5919b10ab00c1b0585a5ea810343d5c03d41d9c0ad20e2a0e202a4025a8941549987c6a30264c15bc263c253c22be321e13de1390152a990405dd1515461760ce481f301ec01f481bbc1c3f2821e0d1c1cde150fca93e2a4e0b8b82f9c10dc10f80b7b066a8b0bc302c381e1a8d04c8031e82a4022c02d108ca785078617c665f1e0f0cabc36a82d505fa0b8605909d1c0c520c34176036b061597d8047785b2c2ba6255615d414901d900e100dba0a85050282b140ca817502da0aa502ea0a68065281540375053e015a82720196a05140ba8200a0a180798059806c402b4027c03e5046c0315858a026a815ac02c1d6685b05fac17dbc5066181b03fd82deb83edc172b15b2c0f7607abc56ad92cab83cdc166b138582cf6069511ac2cdc15b21a505f2c1e341bad06aa8ae6018ba14a42ef80adb01a5c062603ab81cdc063780c1c0553612842537095ea0bb780a5e02916151c03a66289b061ac97adc182b1702000ceb6c192c1aab145d8306c12760d951728508105c396b14dd82fcb8475c21a61b9ac153b833d4225a6da4215859562a930b18492112449620211d8278c384111203882031ac8000450b02b183284909d0248901e0734e019b0000508918065010f3be4146003bdc5b5af0bbfa8b88f30390204459838e28812458a5cdb49283952a48845c9200475a04b844009922248145922044a8628590209d01149922cd10020248e2449b244030a0073a0404580981c918489111c01c4e4c80890540088c91144001d1102009805d0114b8e283922820de2409998e0884f1126458e24b10412479228c2c40447882859020913264728a003c4424b8084895f72c467c9121828628337d0234047248124c9114d8a1c21c1111248a002491c1181088ea84001201665e283c4112590b0813201527264c911259420715803254842700369a0482061a204c912a0268e14314112269838a2c8922349244142021e1f249648c2c3035ea1479050b2849222471441c2c41f4142c9121100524282259040e27b402b7404458e003a228923808e406006cee00448921c810408891224376015ea83c412494050e40810099038d2c4111a7845972cd1004cf74812101c01a4840421280284c4912548925082a448111d35ae0b6a4b172bb678355d7a0a0afa35b50ed85c3417cbc452eee6064208b71b08e1069f6355eeec712bbb6687ed3eb84bedae66cf35534edf83a2f7288ae26ec7ecdeebc7ce31e5a8d6eeeea7dcf03d65761c5d478bf945aa599f0eaf72f753d71d33aeb28a724d594ea3a80c73dcfa54b5f45eef788f9b52c7efbd4775333b8780a7af9595b9dd7b8f5d77436d6ed7caed28eda7aaaff5a973fa5455dbfda06a39cbb96676adad54f7019cba66ca418703070e1c9a166ad50e29a5aee3ebc8ccacec9859b51d845015f2636dbdac5675bb4ab55254e6b01bec1cd58e6137c54e536e657eafbbb97308cd74ab0f3b765cadd075373f4a5595626e0d398851146551cea90bf59013e281a17bdd0d9d638a72dbdc96a5da1445511453ce6198c330e7dab2ba9929ca3947313beab5aa62166635b363eea78e5b951bb6c8b5c5dcccdc90294a43aa8f5bb9bb356a37ecee7eccadddcddc1de26e6d758f2b664b64801f168b9455c7a39e0ed5d7cddabbdddadd4d59ed54d4d78e07e5b8bbdb717333f7beb7adfa9a454f7bd9396666c7ce3da7aadadcaacaedba55298ad276adcf2954854fbbdb51943e75eb1e3ff8203bb78f79f939ca6a8fdadd375e6bb376b3bed67694c332ca591a156364a6ba1f3bcbe95307ddd3c1dcddcceeedf09e0e14c5ef51bbb0003a40d17b0fbe97030170188a1ca4dec3b8b9df7bef31bf3782efe97b1dd9396739768ef53577776c071ff7d3dd0e610961d134ca2658b2c4088e8c00929238b2e448124b96285242800f47902c0122c000748c76f820710408922459820003d89123871c3a6822101247305172c412a0224048463082254835f246c91126983862b58711e4a0478e2c094191254b001d81c41249921c91437b38320224404a48b044da840088043d8e285104480992254c144182099211f0f8a1d4a389254a00944309013e388df600840f3d14f1e188cf1149405044044a9028c1e408253c022d390288c9007c58c2040097fa70840993234b9818c11248145972a4c912481c5952e40826492071a4480f3e2504f8c004124798e8544a20017404088a28c10489122421e81102244b8e342992801e1080001f923852640920264cb004090054dac3912647921469e28811e82000ed41044b2429220225484420822592e898719b268e24a104491125488e500289108460097980244990f8e40480c9007ca80f404b2c0180248e38b2846482233e45809a38a264871aa0232218000fed81091013244d1c2180541f9a401282234b98c869a2e448cf680f45942c8184c992234d8a2c39e24812248a1c11c1114b96006252248924489440a2085012121c1182234914016ae2084e1325471a278b01eb13131b51caf4c43241236a824f9e984c941135994cd1883e79f2e4491b3175371b79b2a6274f9eb8276d444d4f9e98dc65c4b4a6353d31b511933e79f2e4c9139333f2644d6be489c96419515365449fac9127fbe4091b31ed9335a24f9eb0291a31ad3e7962323923a63551469e4023a65523aaa667c4b42667444d2636a22693a98d98d6b446d4b44680682e565577044c8ed02f23e2bebb4021d39910d33b8f5ca2bce5e46f2a527e452a46f9d34f4987eb9a15f15c3308bc18c575ed4f9769630807adfee01de228b94a7a28786ec22b9740078abf0448eb7fbecac3734e9efbdb1fe69af043bf20d6d910d7bc1da29c923ffdf04975ce0497c5b8d4c77c55b60c2e511f1a822e717e5521ef1f58c7f2f62b6efb44fc2f8f9787b67d4b4e1e9d8d3623e2c0b47b6ccb22726bcb32c57944eeb69f27414f9d7e72d0b7f6d16d137bde5e84f85bee18ca69c91bcb9f849c593236f9117df4acbfa4a146b31144e54a165bc2f0624698351c9917854bbc45e10273de5e2e981181eee4947f859e3017641ef32a23d25de4b461523b26439b7e95694c6a5f32381bc2ffdc653d4b84e85b1edaf8abac2793aa3ccccbd73723c24452f097b7172e61de8ec9c944a0ec2e72c66db950e321b619044414ffacb575141ae3ac923fdb5e7475df0b39e7d4e61c6e6d06935210e4bd93fd457f3412b4d9a76f9ffde5dbfbd45db8e4854bfaaa601cb7b8e6f5acee54ba20a65f1944f47a841b6c51e5652888748a9882952368b1c51ae0d931272ee512558a3eb157eda7cde57384f9e4a14a7a3e7dbcba76c0f1c6c38d60db884712d7663352c2da349b24d586694cc42d62ff80be5d137053253dd7d7be2dddb5edc5a5acb333e71588d71f3f47bfafee743c2828c8091e75d20eeb389e0ed4e08c2c38a18630b0e004cf7ae4d20ebfaeb58e07c0dc600b54f882056c7802cffa6bb6fe57f80ccdc6df79e338df296853f4ce35d7dd22059243410a52942f1adaf4a7286d071f248d4bd029b719c10773da508526a8d36c98f4b220fc2cf50a9a663372ceb934d6b92d68537ba771c9b96b77eede7bce080b2393a06bd6833129eb5933b4397a38e212741e5c6287ee3eb8e41c3a894bcfa143c7342e6d2130286a975a0885e8d1594e41a71c3a257d288ab2a4f6a39cb461528c31468f31c618abaa8accec05f7d830ce738d49cf170bda74e7d2f3e73e486e0b81a141de1c2ea4f104783d6db1c50a5b60e1011bbfcadba120fdea05d36e908b0a5a0e97fa709a8605b4a0cdf8ad3eda036f734c7a0e8c36b57fcbed9c5cecea1a93b8a04dd1b348816c16e425447f85f0af0ca3ad6b8ecd37c638ed1a99d4623270a90fcdb60b9adb61e7ce45e0520b687ada4117efe3f5a44517cfb35043dc933ecfd9e79359a6380f2561eff07e41eb72a5cb43571f50fa68cbbb839938e396d1f4c4832c7ec6e9def1e08a8d83a6a71da8d13b0813a4e9890762fe7990c63ba74517ef9c07ab9c369990752c0b15417bae5299d45c5a672c97efc6abec5c1856be00af2730a6bcf3065db7f5eb867da9fc86f13b7cb94d9787b9535e2f8771d6ae9baa9c49b0770eb31e859059fe500fe793e75d2acf73df45b13ca8699b18423d54394d5454fe50bffeb3fbfc764084c6aeb7055cab34d0d82fe66e76ae5fe574221d93ba3ba4fa437f7039d77d1a68ebd72e636ebbddcd90f7bcffc9e9c431c9f93af706cd6998e7d2ba731e6cc3253df560ca3bcf691de5713cd3c73b20de87a3c2b77d5597f5a8c3b467d9a0add6cdbd7df2712910fd751d2d2828080a8f3a673d2bff62c738ced5f9b241d3da9d3bffc93edc0ee1f2c9f22487870be857e5d37dd6e3823c5fbf628c31c6aaf21f2bca263a3ee4d379555995e5d12b1772ce39b9ae8ff9c82daf86d07d6c9b46fca53e68f1a35f108b5cf269a7441edaa6111f72915faa409cc869341ea3a68d46fe343e494fe393f44ece24398f895c15c8e5be726beb8ffc91a19cbb9bea0f4b567eb9736b53fde1e4ac3ce43b7d6d338911d566c46b1664cba802b130e7aa402cd944c75b1ea39cce31df6c48fc9fe74c7c2a17b94fe530176b1cab89d13177ce63e5aea672ac923f96cc02c50edf51b3434231e29182c36b241491478a0e97a2e518fd8c8f66fc864b51c599f1677ce434db4c92f34c4c2f72cc673691eb6741affa439353249d636ed30f6d98ebd862e3ac8fb651e3ace7d8a4e0904e2c1bdcc08b2aa810a30958789e28182d709062869833e2c0058f36cefa0da935ce7ab64d231e83be232486061df3191f531d551ccca15f8ac56d5f5bc749142d238616ccc08637c0210e65786a5c05cb3385e29162e2a991da38d1a39cd131bfdc362be79cf554720874d75911d09d4739a977d1dda61f31c7a5cad5afcd31c9721b577f19749b2d0a173eed9673e74f380f17edd516328266f996f979c5e89d0da93cca6955324b8d7796658af3d4c827393c5cdcc4777f84199cc01ca18a309a88609a5e09f5a6d74c88f31ff74ede1089ee3c42a0c93e256f86c47f9e84fa26fdd03d89a619a689c1c51ea3a6cdd1477ff6e91f27e9a39c46fc4c92f33ed1f59d631893d487f2e833fe74fef37c36f1d1558140d944c7439fd19d5f71ebeeee963f70c756a1b5ab6b167ff629fd31a36c1ce78e92f2e7f9a4bc497f9613ac11cf29771eb7193fc62dbe6613509e952a30059db0549912c50928413caa3893923f5066597fd239f17a9e9cfbf36d1106da13f25449d0154ac7aeedf1653dd46643e83f0994115908e5cd10f6e7ec4f36e1e731babb7bbd7b99d95d6741082744929cd83fe4c60ecee041929c34b6ca7307c4ef1e07050505fdbadb80d8fdba5b2cb0cb5cbbf6b0f3cdda356320fe213353bae0a06512217e664a172cdc6bb65aae6c47c808daba7e7b27d1f39e77f746b16fb6ce59f3ee1ab450395179c243e1576a774fa63fd87778376c0b81a6a72c6d6459c38740d31316359eb3a0e155e1eb29cb1abf6c505f2771098a2e9a872397a68d6e4aa86fcffe3930b898f45e4f58c8348eba86b407e7361fcdc7f9007e3ed37bf2ce670501edc23f9925fa0ebb6ed1dfe6b6d73f18c31365903ea18af3597dfb4ebb6d007fad661b18c03f59d36396826a43f99673835e3322a277de5b13f7ae5db555557fa8af15971a8115e0fad9672aba78cc9ff3c6649f9db321f42be9b35ef192d51fcf81e2ff6899bf9cb320985bd62549307aa0d1af54fdf1b87ae21ca3228bc7bcf2eb7a185b5e7146c40da91cf31d1642f9e5bb5d5e6d98774624faee64b9fa63bdf26b9bfc5b3589ffd37108025a135c5e63d57901fe521368cea15b59e3a15346640006579ae7a6495cba81ee3e484694b0a2e5f1e890c31aff76e0d2844e52fea7d17b082c0346b8f4d40b115cda7f9e030333fef90fcfe5fc5333bcfc73e5d2cd4f15f32f32f194b33a10f4c1a5b784372352e4298f94b352527507955795116112035ad0d5e752ce5b94d406b7697ae803b32114e5949c2978767d28e73ef3d6cceced4c64a124b2cecf795c2f18f3707b0be567743d4111a45d365c82fedc6542a2cf1494f975ce86ac433919ca47bf94839e72b8456a9bd0d5771a42f9e51e13bf70398fac2372758d4b99abdb70c97255e7e13eb8145d9dc425e8a6b7b6cce366baaecb7718db6ea2579e5579e7995fba41d02f2c973ed1f4f4822deffc727e5da6c5bcaa2ebff6f29ffecb2f9f1b22943f478528225488ba3cfa5559ae5f593248f4caab30efdcf22fef7c9e5772ee538e79dcf6abce82589665499fe7d3391353114c4c8fb90f745784734a4ee898acf4ab783d4c334c4e278f39dca67be8a2adf909d51e96278ac89f50ed01faf2ec34b65d0f835bbb68539eb811a9a44fe6ce33d7ac2754042df38697433933bfe4cde5943f22ce3379734922d1a1c70b6e96533e31524422158738afe4847ef9756d13f39bcaf52f87db4d25833cbfa0ebbfe0f4ce2fbf18f3b1fc92737f42c7fc6accda309ffb186741ae219754fd312f6fafa4fe989517e1fc92d3726cbbf6e1fe3e9c3f08f1eada11db2018caab871488be7a0e104fd6643146054cbb60ca42c1cc3055e92205ebbbf98849cb44539fd8a5aa59c87d86859ad0bcaaaa6a4cdac824de72b1b3dfbcb7cf156e37cff7297f33ce07f0ed94f3f67c193264a8ce302aaf42df69b8bdbfdec67e6d131afbbec69ec3de2b81c67ebd2c88a601295288737e556a4c1ac0b789da86c2a51b458ac63e783d5d09c2b30d5e4f31b0f2a4d713155d8600a960cc4f5318f027095c90845717ad14adc9783d5d1187df2eaf272b88f03bbc9e66c085cd84584e08f33f467e4c0dfee749e8271017b230b2c14f202d36b8b8f01388055c783f9954c18b0210e1cb4f265cbebcc6a0a0572df3eaafce545c3ffbce2fb73d7f0f8d5f08b4b39c272ca2bc73e7eb7c43e4a1f1ce1f1a3f9998def973fd1f2d53a6cc343dfb8bf2eb9716d1f494258ddf7efb8b31de74f8b73d347e3321dee4c64a2026e2bd5dcc99902df33f5be6c99b21ebed42d65b025d7aba41d003f13f39d99becb79bbeb7ef6d7b06ba5eddf496db38fd8ae4feb5ecea2d86e36d2913687a9a62cb47a78440cbe3362df7a93cfa73cadb2fde30bf42db4dc8f5a7e9434e6d9359fe88be09107fc831d17613f27dcd2f87b15fbcdd5ceebeff72def839131272d1a639b5859cb7c6449bfbcb61d4a66a78d1d67f3d8cdaf40d2fdaf82fc7ab8f725073cca94de1f0227dcb2e94797f86791a8f6decda26f29d166d4f7d288fde4498c488ae316a90756ab32194c79b21fd98f763729ac2080a7ade2ebf366b42bb3cb45d0ee52fc642dbe55797e12f870665e3af87853626d437e117c192fdcb5dd65302edf2cb5d7ee9eb5dc7bb1100a1cbb54b90131fda72feb22ae72b73d51f56e698b5cdfecab10ab32abfb6255896b163d5c56e6d9a11a13b54eaba6fe6498d494eca6f39625268293155156355f96e22d0a2535e555555b9faa8d6b884e86f5000e1da6ccd6057d51ffa836276ddf679734ca2a2fea07c371168d09f8b807aca2b05d2c34e511e15c817aef6ab37d1104a48735641e7e85d7974d81d617551d17b6bb21fa353abdca16e6fe91fa54f74ca358340ace4347db5959387deb1bba3eff48f93e7f5c83ffd1cd977f84763df4ba4eadb4df376d3dedb103bafbac3a49cf2def429a7e212208c898faed910231f3d4ad51d8450db8ceed34ef91537b9e447c704053d10cd5bde0d84bde5d1352b8289af7c87e3b6e48701cffaa31d087ee46fafb625d181e05bae1991225fb90e5f79dc7e18f0ab3faaaa2ba9ba4367419ec7b8ad53735ffd6d937d5d3321fbdd9bc62475535caa0997c2997e7ebdf66b33769e8b62394dcfeb845255754a7fb71f274f2d6f3ffd9a8956ea365d8cab5bf70f55a64c99363ef2f6d31fe54f2b746a9b9437d13e890b82f293fd876a034a996f1267e5e33cbacaa9bd3a6f187b13ea674913ea99987e658ffa4eeb069d81f82d876ec99f6de35db501f13b973743f6f4ed9cf5b4c34de73af4de9a30e4095dce1f27ef7c9a9e5a2acae9e4a3f3b6ccccd19789e9d5d97f3a883a3bfce977efa44ffbba66441c91f5963eeaacd5c617300909385c49689cb5a00d37a225a140b2d6827e37e8750dd7fa25d2c75c5d73be52cb15c8629beb8f9c578743e2b6458fbdc3bbe96f665d56904ab47f69d6a36f466392e5955fbe59cfca69faad366b8b5b93fdb95ff96e4df6abcae3a6efaee6ed0eadfce9bf09d2bfbed2f587fa7edc2ae913fd7297fdc4877e497591c219cc9d57bed912ca2ba9be57dc66f4ca92d3f4d6f658979c4efef2ddaaad797587f5f9009318afbac37ae53bfde3e49bbd6a6bfbe96fd76afbd1b46fdf61def4a9edc7c32d6ed762719bcfd7a9ed66e5cf3e94da2528e80bf0d4421d5c5de59df7e6a3f93c1fc0cf27970a93f4f50445d0b554b8a4effc88025992f359d44dfa055f5795504679e2070ff429353c54b864f3ce77848ca0cd24bf5498e43cc70b464481bebec348b4b954def9542fbc7327ea5ae3a8e10a21d840085bc20405f140773cbb05391eb400074e6051049e284ffce0599f52c3a31ee509e6a17cca0278d6e13665013c4eb8a8c0ba13231ac7f97e79e7d09d705101caa174b2d338ce29e9848b0a405fe9c41bc73994397a3aad4ffda26b58c112b290c10a3bd88214fc9d874e9af298a828a30835a8c118608090061ee5519f39ef5cb30a785010cf52e1d200def956617635b85481cc1c93a864397fce3df97e5d7827df8494734a2a8172424fd23f18f34f429f2da793774d449f30c54399253e9f4f3e89e98a874a1410e5f4cfa793b3896f25fa842aff7c9ee01d944a54cc3ff9458b117840830cd782359ec7eba9054ff88bb1b76571a2fe4454a64c992b78aa2c4138b2f003158421c8f9fe7499329f25a8871439b082654900b0f8c04b1010132ae6b304f1800619414d1410da38359b739acd1b67673426415de9a463d273801558b874e3fcb9bee3929eb8a8f1cff5bd06bd7380155876b8b1bc02e00965d278460697f275c3ae3fdd88243fea93376e27a0e6936cc413cb63b9e53b4c6d2a70f2a40c0fe5524c3c949452b925557126cb1f75f6e9af4664a1bcda9ea840cbf04cd1c14349282897122345798c8da3eb52a848ad47a9358e5272d438ffc4991ebb165c117358f3db1d2130b46709c4ccf9cd582e198dcb5032c8783285328c218534c4a0418519806143958dff52c6165adc1417454c9853187d455f21c386195fb66cc154788a1a62ba9c16cb5ed10699573066fc0f39ebab3d2ad557dd617157b441068c195d6ce92a4d650d35bc74c982b170501b6980e1d2c55ad92a63926819436c1a34d2eaaa8f34684ea42a3bebc9d11fa2154373cc394cd218807fd88aa1a9bfcbb9761d5aef95509ba9b7ea336a5cd0d5c715f7d92f3634082184cefbafcbdd7639dca68fa7e6487b18f2191f663ef95583f0b13c98e0e10c8d6f1a3465128d9c4e9e086abcf6d12fe6e50ed1f86641fa7ffa69a4ea8f198fde3aa4c6696ff7b141386079684dce9126ea908c999c41fa9d631b114c6a2755deee800d429507cb7b346acb27f7b5ea38349ffc4fbf9343a840737e494bbdb4c38d49ea497cdc10d19e72ed29214f5b58e55a6707a38585b4dd0d0a20d860bb9140c3be20f3afa72fc6f0eb1abbdd5d6e1c579c73eec11c3d8818455154ac7020e1c22ccbb22eccba4208cbb22c0b89a01766304dd3b4191a9a31d8603535353536378400871c180e1c3870e4183916ecc074e8d0a163c7cdcc143d301e590f0fe7a12313b2f5c8ae1c4622d0f42484296fa343abb0b00ed86e98167a5955a4e073cdab58a866ccc41efadce1248476797527fdc03a91478bc0c6cfbc9e8a106595a0b90fd20ef3c9cd0793b820c2c2c92439ffde7bfb84c8011653c2304514ae58c016ed8485ea600a2eac205306383cb145016248a1430c1d44e1be917c3069bd75284a7ae3acef6aeb988410862b9000861b90a1020a1e21feb936e63123b4a1a7a0a02017f03cf7c1257de579cead68fad37f79d655ba0fc659b7823404bc9ebef8e271bc9ebec0f2d357fae4c0d38342f4e1dbd6a60040b822280b2fc8c00634a818c430060d7020832358b982e38e12e6d9299076ec9fdf40df7f5b10fe7efbdddbcdbafe4d90fde5dfd7ac021a257be3df4d486ffc9b3d19557300115cfa6167880cfcf0c3b34f207ed054a7cf68021a5308e2a20b4ee0611fa98ec9ca972c7879c1174120821478d85d754c56d4a00d7130e30927b4a8010f3b497528100514b6a092852b10c10d3c58344c9311f4bce3809036b33caec55c814457df3408cad501e043813c9f3c72b41f1301af0378b6619d9dc6e19c2b005ae3430c31c36367083d396088195e324ba60d2ef1a83cb4d3d5a68fd56c40fc22d7ac47e43a71082ebd40d317f98c573d99157297f5683d3f60bec36d13aaaeaf7959901939ddcf388d0301049374f80462e4b3871c3e71be71f8dc8cd0d1c3e7fb76dd2078f884dfa51d3eb1cfc1a776c329101b6f399308f1ed394c02820aad7de608f98149ec2d81e81e9b09f4073b8fed04cb03fb0dfb0ef61cb68dc238ececce75c8a9839ca31c726a38e40db954f407bbcdd684fe605f31d8ac190a849fdd66abd2608010b0f8e20337fc608c2f14109486296cc1c50cb8a0c1c3bee3801a9f716c66d3afd9a478769a1c2e75e533ae59e533ceb772beaf7aed427f7005620e97dcb3ff0004979cb689b6e512aaaa23b041a50a6b18c31734cee06158d0022a6548118517bd5d6ccb8549d818b47519308249395572c280e20b5d9ce185a0198841dbf841185208e2410bbe70d133c4608b2fa6d022a60c34502f5b4421a80d1e4021484a0598c4955f9baaabe49220ee7f9c7ce543dc5739486d9c96db85497b6252068cd893938dc2252a4d6cd04e613ded969d27d0c0862ac658d1c6186a30c1e0054d800286a02f58b654600a35ac51032cb48003372c600a34d2a0a58a2ba4618c4bd9678e3d55726a39bee5ccf153c9e89e5a477978e67e29e9cf45e3d9a9ed8249ec337b0542bd7e0e3d5972f0486dab3cb4c3ad7d4fadf378a071e3cb73f6ed73bd3ce7c0ccbe5c9cdc2dd5153466af0097e676804b534f497069e618c1a57dde304698abfccc79e61c2e9d54c754a50c53f4408b2e4128431778d8d78bea606400830d66a8a20d59a481877dbfa88e89065c10c31854b214210e4ee0615f30aa73a40638384309557810053178d87bc3c2413c98471a9c3b87be8fb9df533963f7aeebba75ee63b170691d5045d0eb498b0c7e1ad1a8c6b7ab36b70c81a1ed634cea25c3eed89fa6b11bb4a9618c04353b225c97d381ba52a344e71448bb7637c70dd31e9e53db139127ca13ce13e5098d47b58759738039f3cf3345c0f39581e646ca436dcad39bee18da02a6380f940f8bbecc6ab8d4c7d43140f887d18f19801e4db467bfa15aa24a5aaa5c5d531b05b2aebe1a043be7dc396fce577970be59107ee7da3a3714c7f90f3afc78e77314801eefae561b6d1dd21be93075f897256b121f3aa9758c689ce718e9227d21fdf3cb08e7da3b396f7c7f19e23f7ddef9c5ba1c5a69a33f3425757707b179f7d8f3b3fc7192c90a1871456498834bf9f2820b183f12711983498ae4521e8d4623f8ba30a697370d4dd3b4896951beb725fb1445e9494a95bf366e19110d4277da3a5ae338776e53e7da73940c60655d57b50ba18b9bba88b5d1a3f7c238e87ef03ede2fbc48c157c5667d4b6de9ee8642bc32e969f76be798b923f38c12cc1e9d730f6ab5458cda342daaa62d04d3fd1ac20c30c97544654440e71c84efb1fb766edabcea53ee82e45a0b10ba2efdcf3d312e4667c324e78a95f19447f71e840f468dca4e8bed8dc97ef3b2d1bd698c46eebd6ce695490f734e9d6ba7cd2e8eb4381aadb6f23b43fbe2229c413f8aa228bd61c62b93f45dec76fc988b58548883dded65a76b30fb63d7dccc6edabceeb29ccbd86b2c9df336ddf37bedda595b555537f24aa1bb9f9cee3dcacb53ceeede393bf75cdfc3d42993babbdde6b6e9de511445c9697240fbd66dfb0bf3dc09d1873e9d9be900932c6775ec6e0b81a1f945653dd81b455fd76c2ee876ffda9449d6d6eddd0bc40f2136b7da747311db3426e9b4d9e7ce01b1aa6a907ded6b292941181384305d90d1a2bd9ebcb8f25da8311d7433625e9924449ffd99308c498b71e9f9ea66d0c94f208c77dafc7a31e5f5e4c5977f3d79c1e5371b429529e362e3ecefb471f294bf6dba7f7eb918e5343d04e287fe4caf338e7ad2b9a7860bf3cf2fcd7a78f85541d7e3b4b40e6f715c5a2703d16921b90877f47898b26f4fdcaf1543f38d8b1eae2a7bf8fad559cff6e8e1bc854b95977a6ce5975ed5b50f53c7d169d9e86e735a766590f5e8d179e55555fa81ea683c84d81911b2f21e9bd63a6e8bf3f2cf293947cf69794e8bd332958c13263d6fc2a1825120aab38ad343ab307af8b4e11ebc05623a38ff20077f1c864bec7108da18ff72f0c94b78163319ccf7f0c969c0ac4707d2f7f06abb34ab7c37e7d52664ddf9ba7327a3c32a876deef788d207937ae8521d52fdd1c3613d980b6f61d2f36ae32ea2a0590e7d2a99299bf5900a219cd198f474701da650e1d295d6714d443264a69299a49f4a66e6585bc837e4eb704970f496af6bbcdfc3afbdf1cd7a7878063608e8cf37a0409c3fe780962cf719379fdad3a8ea508ab34ee3d6d64ae2613deaf0eb5b8e5f77d1f6d8426068d19f5b1be6024d3f7a05af886d2624fafaacb6b0b668d132790b7be12f0c86c3e032d80c3efdebf24618c1a4cb670ba8c569d112260b8974701d7829e7304e5d784b0e8e49965b0e371f1d7cc97e0f37824bcf89d8f2e543573049c31c967f571ae7b95e598286c347aec3b19f4e8b16a7854bd075367fee4e5eb8a4c39fbb2f5cbafcb9eb824b5997914f57c6877c3a2eff5c18ffa048735a9c16b785dbd2969c4930e73fa27732874fde12dd491f27a32482493a486592e53d24d0bea3224358682d864b3af8f356a375dc6bdc7129fa7337a575184b0fb7e4947fbe6d2ea8719e5f59080b6daa972b427c8c60d273a07d2298f41c4a1f77c595d6612c8df3dc957f7e85305df7cfb98bc95c7c30e971bbd517ba19e2de72f7969c2978a8c3d66398f4dcb76683719e96a7e2c65df8c46160691dded2382f0739e3f7602c3bb6b9bfc36116847a28bb8d93b67ee3371c87f31605620697f49f33182eddf8734e43a3e653f3397a1b57b571cd7a70f80ef3d89c6c1bc4a40733ded23a19689ce72ff216276f64134c7a3e721d3e95cc108a08f97a674442ce5bb894f973ee82b92810fde72f2312fa7172625ee9efd8f4756ca31c5b16771c9b32e9f21b9b32c9665bb235dbc4463f79cb3fa7d9965019a87c46cea849302205f3cf87681d97ca38ce43d98669af92d34951ce9cf57517e6860710c6a53e266f79e8178d8bdcb543bf2ee5e7285748089afa0eabd6adf96ecbe5a6659076cd35d994f7e6b870890a63b7a03a5ae3401f85c1cff010fadc363c7475fa14e5a219ad75721a076a399af6f0a2fea236c724265ae7468d63aead63e3978e6fb7fcc6b68ad36eb3a9e2cc996fafd93e0ca599a1f1c95a46ae8d68ae991fae00a1272cea458b7ed9f2d0ad992d8749945b5696add24a5cd7b555c67cbbe6174559cf89f1528633c3a5e1c488bc74398542ab69b2c9fe56d92a4c820e2939f7352084f9761abf62bc309a6dc36012f49cd6d953e340f7d128e73598f55072b94041c39c8a3e790a6fc1254d425f355a67aff094d6a971e86c85afe02cb844f98c4fcf5c64f986e192e6340e7d7295877c65329687d2b196875eb319d138d0a9bdd23a1be692572c99c92b2239b3571efaa5240de3da78caa3a84165cc3f2b4ff95c320f5d6bcd35a7d9c83ce59af5686c3c25e24c08bfea8f9633e767121f7ff3b33fe34ddcb7ff88be69dc886f56443b8d6cb23f23e7bae69a05d1e40e4ca2dc67a5124c829e0493b22ca4038df27d82768530f7d0570c97a2c355e361e8d2e5764fdbddf71826517e69cf40e7285ca23257cdbcb7961d1071466d183513723d6d19f373b93c74e7cb258d30c69cb834f54b972a5eb834d7ca86691d261a073a9cf1f2a98dac7049e4d0b36dc9fedc300f7dab70491f3a13ad33529c76e8daadad593ae6a11b09f3d03b506d713382b7bc02e0499b32ce018c6b316d8e62573e8402e1bf3c0997f42f6f824bed970f519d51e35c7eb9ea280aa42afc95f3974fddc25f6dfce51a7dea98bfd8d86dcbe9758dd7930fccf86bb3b8e963e3d73bebd9a6ebf2eec4a4dd66ceafbfac27ca1ce878a14218ba19023fbafb28e793a7a41b73614cba5ca9199b930f4e3f81f8cb2f21ae12fbe543b817f5e273f4a3d6718ab38ec989454a4e1b4d5b4e1e3ffa4b0c6daa97bf7e8760d2b5baba5175a2e2ac2b25a313c125289d0f41f9e5365cf271499f0d826000e1cb03c1cbeb015e7be0e55521e0637698e72262ccf8ca5d1728d8f84a75503e676edaddbff7b21eca679cbde5f91c4d9fa4ded238dc73dad23a0ba671d819ca199f9ca328a7937ef61698f550ce51b41018da82f9b960a8ef2c4e5a9c0bc66960ba927344c9a9b55b30eef95c30d0d9af0da34014c8cf8ea17cee16be88ca1d182e51cebe6970c939fb865120442a779593333289929149aec3402cae2d236763f7f48f6ecc0ec3b785b8682326d9308937d398c4d39fddb90e43ce5fba4e687af2c196b7dc2d1df3d575b905b31e8bf5cb573e75fcaa97af7ccefceae92b9fd5afafea00d13895afafc3ac27e781e8cc02e2e7e82fc6acf54b3b520e8402e1afbc034a70a9bdf204a84e6c9ccab531464bf8ca55fd2b9f1a85af748daf34cc572ae6ab1d9854f96e394cba248949959bc19804fdf9247de5407495c9197f02f195c7d651c5b9fc724cce78b925a7a67df9ca39fa19bff2ce84f85b965fbe96656d6e8b3eaab7cf099773a768bcd4b739fdc17e69d6ad84a6a730ba78a7401408157e7b8b9a127684c4e84d49cefbb4638d29e5d119baf39924e7a3577ec52d3289bdda34061ae5fa5c6df1b575220f7b8c4534d95f4a2ac979287d9c3fb9322eb320b6ce73d1043194d1810eb6f0f8f0465c37d01fc4548170c47483602816a61bc46219e6b8b4fdeabb61b18bb61e3dc32cd67410a2c347f9a3c387b4ffd931efffb3613e5e5973083e11a60ae4bdfa7559de9555c9b999f3b831e03523f23c664218f051fe30e0a35fdad5ebb85d88097f13d813a96a6115a0df1081fe5ca45c6a7d0701d853ab758ab322a0eff3b8891eca2844b46fa2768770e530e987766a5301e5d1a12bd043caf59f13130fe5bc519272b83939a3360e0cfae79c6aa73629261e6d9c76b7cdf82d7decf0ea4c5287cc555cd1b58b1353fe318c4c310f2ba7c3384a55d2740ebdb3229cb8e77cb3212908ed3bac8d4654a58dfa0917d0f973e8d4262f0a7b3b4246d09c7bbb6c88935233304497f5b03fcd66c4d83b26bd30de7b90ba288aa21e7cef3124b364f8f3286712cc6d2142c7b1899804d3337670c60e9460632e3d802684dd491e23dddd69f3f0ea55fdc1d07967fcb75d2fa4d3e619320637aa521b3028143d744a4ed14f2dc8fb27496d58b2d1b1cd3be78cc801aa28e30bcee6bd01baa0efee27539ed24273bed32e6e51d398d4539c2bd13a943b39932c99771eb535344c9bf24f8d6fe74c02cd43491ed338eded046d5bc7fce42911d3968cab42c694b8645c5012a012ffdc25193db579e746efc468ce5dd43a9272a0ad4fd2f7120765921111029cb18333def9cd1076a964f43e1adc2e03211c423fba10fd284345d0e2cfa5f2d1db4d4f6d333e453dd33bb95198de2e18deac3cfb6ebb3f97bc21e23cba10e7519abeb7e9e6be367dfbb03c98de6e15a0432e5f70f9e2cd787cae693372ee175c568d99992ebee032f305972ebee0b26a7c91f3f10bb8f0b9e5d5a6af515b15bde12bc379e92e7c8a617c17512e179e99531e27171adf79f98cba451369bc6308888feb3472e67c1479d42acda3ace44c82cd389304fb1927436e6d2130349d995c6bddfd8cf4b9e48c87e4ccc1a4db2f368899194a24a7e9923ebb72bf581e6015e3c3acb871638c6ffd51efbd27ddf6a3652cbf1aa3d96a1c6e21bf2e87dbe5345b8d535be5148d430881dc47a7284ab34c711e9ae821efaca79271d36b9bdac3ca2f87c1ad66732b44535dda5f97e5d7e59aba8879ebf0609cf5e8512ac5e50b11d36c5123a793aff1b7ad0eafa9893535339eb341dcf019572ecdf80d7feec30671431671434ed3dff0996d6626c6198fde594fd4e137361d729abe66c67dd820f4677cb39e999a999ce8435be1529c8935353e688c53888f51cef9dc880d8de63ec49ae8adb39343ce88434e6de46f824f8bcba2b1f015fbafaf3c74cd916d85493087af3f1cfe7c5afe5e1644757a380f9ff1c6a7f63be49cf11a572eddf0a9e9f490461aa79d878c377287d4918e5cb1ca48cb919c5ac61ca99c5ac929c43f19a3dfd89449f3068df698d3b88d9c23cca3d76c2130b41909f4be8646ce1fb22d0486a64920fe1a9f39a2cc6aa4cf8cacf1ca67bcc22181785a327b8f499f19af2152b337309fc19e0fcbc37b9488dad6d7b16d5f2b0b668e650e758cd4f44c9f3023dd7d4d1f8e71a063d1e661f3d0209943c75c14c24639a36fcb870dcac1352fb8f4d227468c18117c218f215944dc6084220f6da2d8132fe5d2be07e3f6de2b6533efbd674108c940c8068463205c03423520942b26e473c5c090d43cb39cc6e7e522d7a056e35926a7fb0cfb4cf30c27838c9345c571ae965589b61018da2581faadca1de5a2e85349cb35e4eaa2908be45c2a99f409b9e59445c9cc43d227c60c5210427f1be4f1b0b8cd24361f1d429b871146af3c6e4a6cde077a553945b9b74e8dd3c869f3d0b58dc6b38dca34df61974da0c667dc653dd06b369a0d631ce83b9d6d359b374e3bcda6354ec5381167dd726ada606ff966412ab72cefc12eabe2c124f7d6b1619cf596d4dbc4981e3a53c69a185c7e00afa732aa88791dafa732bcfcd5d8c3e2aee82b6c65dfc92a53e45261e86eba07e2c91248cea512647f3d4639a357216fcb439b328e25b14d1dc3de926068515e8e09f1a1dcc9e9955744a289a50fe5ef3b2be23d15dd48a3dc5da37fefb9eb6d137b9bf3dd2825d82b13c22cc1ca5f7a31e6e4ad69b77f97824e55a12da7711aca22725aa7922eeb81ef51e112f576bab39ee870a328dfac875aea51d9de0db9284c5927e42f24ddf5b82777d899e402adbd5bc28d627978efb98b4353082d95bf4417e5cace3977c5873187f157b1a173a8d055708ba377eddd28d7909393999d333be72b71f3c1fcc9bb8d1b1d46c7440b9dd35c24273fe69a9cbc543e249d931c1df3e98860379857fe3ca775dc72720e718ea950c932212177d2c7393b161239d1e5568b4255d65385f1577cf0b14d3f3ab7cfec287f9bbbb6ca77fa723ca02392cdf88cf4cc39e7e33c3ae5137b6ab3ac1d938df915310af3c6ae86549c73ceb9106b6b6c7797abadfc25621fbf71871c2e51ee5755551510fb8862555dd78daf775c1d7db9a8ad2872eb6a2b469e10968be65b973e978b7a9bda9b9c3cd19cc6f2133ab5f954dd391b443bd557b67550d1a7c877e56c2b0f9d57f68e2881f8aff52992edb6ddee0f70abc9f232d23a3ab25c3baeb79cfb97bf6ddec84a8a9c72e8219ff19aee9cadaa79e3d0675ba93cdbcd87e581b2a1d15efbec316f240f2c13d2eeb3377e654560df6ea47530b9b247943cfac6ca7aa8eef2d725ba2e51952304fa8e2d731d1be53bbddca31ac721e7a8ba6123e7a846ce118d9c919a0c55f1b2fcaaae28f2cb8a7e31e603f41f7e88dae59f6a196f2feab17b3844247d581eaa09c437d12987bed33a461ac7f968e4c30651397cef451ef2f9c353bee3125197fb88aacb8d885ce422919c40ef2b0fc9f9c3c36cab7cd820aeca2da75c5dd643b595dfaaaa2a1f9607b863736cc1e5b1a7712c8c32829ae0e59b708509639aa005a382a514f44d885c7dadec152e595ef1a8b6cca90db637d13a1c4433735d1533ebc55c55145f1846cde79a1581c990c4a83cf5de9333b24f200a887a8fa54fe5d19fcf24d8d5d883cf29cab1e71476e527746bf3617ff26f9bfd6b3936658358b72656e527a48a981815cb61e514252746e5a1c790534ec909444d8aa276ab3c45418a72b6a86ea2711a0291f2956faba86ee7a0d6e929364e2367fcf7fc3dca31668c0a46e52d2d134223a2b1badb6dfaddb0095192c633aa5ddb44f2465fa19c923635b29fd36061fc7bd5f3afb6f7f861539edae9d026726cd3fcda2c5fe8d956bd9dd244ebf494d15ec12f72de535aa7afac9cf2ced767b68d2cb32c663eb1bf18c31ea4be7a6ef94ade4afa3ca77c7729af2ec6b2e71925b1e7d936ddafbc896e399c5ce59df79576b3af500e29ea330f599647a794cccff899736d5326652eda1c93323981a8a73c2415c328bf2466590eb31e8bca570fbef7dc474a62512c0f50bae7b0bc02c044b338e090042fefaf2724b020095c3ee7f59484277e09519440e69dab8f483d9fee9be58c8f88f52d5f2604fa736d7d7d6da736e7c1a4e763c364a04d1210ada391a273545447631c75e7da1ba65f1c13b03cf633ce56d47804bc9e94b0e59510940430af842a7fad98bf44d71c65956b0a756ec02df3dd32d7d6d1447e758c3152568c0da3257dda294b9b4033ceae591194cff036574c0e534924730cf54f96d3ed36b5df6772f264e14cc1ce1df3f379b5f9447ff2bccdfe75dd6abd9aabc64f20fee99ffbbdaebd0a88bfd7219473c5fc73e8eb10b6f4e1091d841e7d37d839ada3160428e82be74ea0862e1ae20b7da76c10ec3386c0d080f87902f15c315f79b6cdfdcc4399901967e9c31e3d9ba9187a0d741a0cca19bfa03b5863491af6192beba9acfcc5edbd718499bf8d1d6ecfb5ad729bed86671bcc6cdcb9da48cf302992a1a57cba8f3252d2873df318c50631d707b37c49b08fec952f507f943eecd1afdd4ace9d40ad63e3d1371b92adb3c76d02f5f3ca1bca2bcf691c17fd254932dd5740fdeb13a83ff3cbe752f9ca612664dd27b3fc654560bf9e93b9cba26372babf01d41ffd921bc506b1d12d59b9baaca712f370d3079f9a2678e6d07bf7d490eba19436db49e39a2890a183d6620a1c6a187954081d131c780107438002860f82d068c3911164c56923cd46831a24830c2b141956b0e0ea2e62f8913692c2d39c9c4775cfb9cd8649ceb9768435de41c1e3dc07a9359b2e3e4002b3600043c8420b527061a30a1750e1085b6a8e70042dde7b8f7aef0c1888410a3f18830c7640e58c23443902155668186a904515a47041841f64c10c32b230438619a880a20530ccc00964a4a106169e370532b888c850820c02f07aea12c5df783d1d410d48f067668dbb72c6e83abc4f8cda68e5f4f11c5d29fa6c661999c4fc7c6a91925517cd5f9fb1df27a7f6cde35779f8355704e7eab6aa8be6d33c85d68e39e7f60b39230d3a08e5e683495b605c54f064929c8710c208237c100c1d66281967d4a80125baf8f4cb090a5c68000518dc20083c500a0fc708c3c3ebe1186c3c9cc203217427c938ed40889316548ed7d3e9059fe3f524c61b2831dab537f7976a897d7677f74f7555d752bb7e9f25fcad41b8f761b92dd907627ecd88689932cf0aa499b4c52e9a8c0c78966aeaed1540419360032bac180216c2c0814c14c6b8e2c4838f1e2957651668ebdafa88870d93f64121030d70d006315078c1f3befc736de4ade3789ed0f4b511145eddf093f42d461bbedd66d43aa61d8c210d4408030fc6b041059e4db381a2c5d7931867f8a979f3805730042060b1a50a64d290862d9e30e5095238431933647982194e3005bd8008713003175aacc08247cb780ab01496e263d25459cc9ddeb7bb2e0ca68c3066a8d1d51831dff2547d8951d346a31fd85dd3da5fcb20fccffd8d10e6dbbd4b0bb678372400efc230c98a42594130ebd9b168d066f5c5ad2031a7df100d4239087111f22214c6b387aec8da1082128222e482d09567cfc864676458c8bc90912163e3d93333b21f6443c8c6c896907d79f66c4b2645464546832c07d916cf9e51c1c2809d016b4306259bf2ec981a1812302760676058c0c43c3bd605bb01a605f6036c08d8e9d9312c171c302998141815d815cf7eb57155e1dac21586eb0c179967bfc05c5e5c45b8907039e132e3d9af2e2e175c555c37b8b4a86291c1528305874bca45658d255851b0aa606d410d2f39501d571c76e7c2bd28825b5d9eddcac28262052910c632aa4273c15b50600c459bfe7c551e8aae0d2d8afaabf2d597c661afbe844e1d63e824c6b5e1d860b7c6b3579910ff275d9830a3962c6f9e43d77f3208ffe9a7cf6a2b3314481b5cd296d5971dab06cd0ae2d20c9d7e8d597d792e4d4c4c19afc6172e69115427b446680d2484d67042688d33426ba41186ab427544534ce16e30851653fc608a677677450daa2302820808701001c1491101c149210282b3c246474175446788cee82a88cee82d88cee83088ce18f3ecfda5b9501d11191199f64244a68b2022d3481091e9329ebdb768285447b342b3a25da059d1556856f40d342b5acbb3f714f682ea6846d08c4006cd086ad08c0007cd081de5d9590c8fa13ada16b42df012b42d7014b42d7015b42d709867e713d3407566a244e11c44612ea2b017519ed9f98a36a8ce4c962c0c250b4391855d9085af903943756698c0042c30c10b4c200313d830e307aa33438619320c61860c63cc906109336478f6ddb252a84ee8143a2d15a1d3d22074da1c844e5b3cfb5241a23ad59733b461a1545f76cab32bd1a33a5690e2b0472768676081dd019beab830ea2ecc28015a0fcf38cf7e5558ce0f5c7aee354ce3b0c7a869a391158549ec5f54a03fd8e7015e1d08d6b1a6f4a04158509407766d6905e90f76568146b93062a858d887c0d0dc187f555ac75d98d6b1821a87ddb78cb46858e6bb12a3a68d461ec68579f6cb074f219e75fa0e42fc9b272936ce932d352ca48576d3c43de53fa2a724f469053d3b6cb27f43649ff4697f2ea315c4a528d6165c52cc8de112b7e314fc96c1a4759a2a900d90832bde65639ef7597954f845716dfcba6383759acb98e97eaff8e6d23a5917c661776d4439fb148592b3bd3cf38c5ffacbf3b3f2d6f825aec5ecc62fede297f8258689a38e5f9cb390f82db353fc12459b1be6cbb3efe035634fa425f9efe817d32e6e9fdeddb15b49adca43bb86c0d0fc5d96514bf940d9097642734c524a0b36c418d19ccf68c69fc2e812d5c753e252ce42a449b0752eba73d1514e5dcf5beaf200dd6d6fca3ad9329aa86521ac3184345e4f5cc0fc8c5c92f097487d50ae2b056deae95d74c0107e599bf9088899334936ef78bcf3cbda42dbf32ddb5cbc366c8bbec3d7ab944955e53ea6333d45dd40b95f7a8c7df771b13cfbda405b129376ec154d7dea182a64e5ca5ec1049734670752202277fe72e0f0e846b40e0e9943aae26412ca9703f34b0fa0699185962b7fbd97f5600eb1e70e73e7576f11d877db64e25b4ee819944972dee7c7f96c1c393615e47027269e1c8e633b410e9f91ed30eba1711acf9123874b31f1e490526a9c463a6fcf7ca767b42d4b0e17e5f0b74d233e93bd65b1f11a1b09050e974243838386c6a5e0701b975293c3a5d8d43813ad9343e6340e7b4d8c341a0e7985b67d98f55c1486857ce6643d99675ba8081ae6cf834089399314f376876192ca7adad02a67bf62eb2c8f93ddbd2d956da77fa89f126312894bd3c7046289fb1997bc9f3ac6d9310d4aa0fd9ef6e72ddddb148a1c2e05470e1c349ec3a1b07129353635355aeb4071c3a5d8dcb0b1f11cae3e6a1d28462ee5c62887dfc091838be7391c87e7f01baeee7a0223e8a78f57d5f9c32b11c8e4d8706cb1719cdf00e29ddb6c01a723a8242b34e6b920279d538866662408021273140030381c120bc6233299b2ab3e14800c9fb05058a289d328c96114c58831c620640000cc800c083098100484937ee9e8e8e9c503408dd52e8f6e846cf66189f7bdfd8a5befa000a137d6cb1686e1b08b5b9e3746194ef455bff91b43b7cd90820a46a5733795e4241e3dc60813226d31132d96a0f60e54914c0d84d10b1b1db337b7609a89562128edf8bc8e79edd41173f9719d2f71995e68e5a0e78888e3e8a02fe44056a49f2be8588eb1e6d821f743b8956ffd33b2aff2ade9c4664cc263c9d076c6ca812698c631e96ce3f3065c2eb19f2976735b510de9ed49e10ba0500347cfdfe0fbe5e0033c0f5154523f65e47fd2563a7235e110f59706ae8d89f6b96ab19806778645407f02df4f74cdfd991089278e4947cce41619366d355c4f2cc68029ce1922e842a85a520757f61a6cabda2f2039f9dffc36dcf7d5273dffe4c055dc14d10014884004c156edbd95a5832221f2b9afeea5c14a14474f2315abb068fd567afc92fcf08b0c0302d01ae863eb2b18d333ac0d460d607251e986c9b2ef5f140144e88bc1852b6dcda9bb76bdde729db826bc227f02a9cea7fee8273b0900deecb86c703eff38d78dcdcd97a1a2a4210bd94e61916c758e5324a712172ba58f038926b740dc3b2a17ebd60ef62d73f2fc1b651e363a973bad2692c814e9b21c31b6174f1a2a6735fdafb2fa3fa8ec51b6c7542c913046f4d2ceaf10fb4344c9d699189e1fc310878dd3996c5ff93744a2fceccb4e3bd8ba1952a6690c17e221cff32e0e05aaa1fe23f2adb0f55d1168ea02870e64cb0c20fd59f29b437f84401605012b2514b333ed4de1064126c11e145ab3ad50bab7e4c10869a4f9d9ca795b07228910ff89937c995f4b3dfe41ce9dbea957b0054581d169a178193793f90dcd2f51a4daba5280b83f8505dfc95ecf8360f502b24c47da91c8a293da49651428cdd589717b93df525b9ab4ca80391372a6c3f6d79d5b95daf14a94194d24b9d754362a866e1e55aff0925c5bfc5db0a592932b5634579eb86baad09b7f2fbab9771c3a22bf540f08db1d17d60983717135c4a05644ec7c8cbc483b15b5358b92b810d2ae0addaa6107e1f634fdfdda9e483cc25af90aa95eb048cc83b573290ff341e34858a00f2b6896caff98a423dbca5503ad9cfada4af4e1d9afdf8865195988003f182f96f96a2f03be0cb1cdfa3bf28133d3bca0a6bcaeccbf17dac8d1b641e50f589d5e9d58a50ff6082f2dd13796d4431366ab1d17fa41b0bf17496a8589ec4036bf9a5a70d53f4ea2da84467de4ecdf95d7d25dd6b258f19fc1e0d829c6898e707e1414a78c216bb4b1a06790a38b608302e0dcef96cda63668411ac54ff204385a94070b0f75c1d4254c308986f2ce2b6d24c35cc2ce2bc390e7517e1d9519df6a48b5f1bfa8b5249326be72ea35033a036a54657f09a0ca3b2bcae6399b21d56c691da7a8d18271fb4fad93d3860a85ec155b6bcaf4e32e08a3d3b037ab3bb1f83dffbd9115312a6ab56e272f4dbeeb8a6f527e85e97c2c1e3cc5cd802b0d372e5854335b17105c497eb343ff46915bc0835d4ad1ec72eee69fd476dba20f20ef84b15cb8893bb358ec4e93919c747490c07f75dff056e091c8f03dc4679c9c621855857d9f59e375aa22ca51b18410a39da0b35325848ca552fc119ddd22cef2876918a79b8d3578d25c552da135005a34e5ed25166b34197531636360464a7973f5b023986a609739154525ce650e3b5ebc80bfa014416b879bd40d5249574aa9bde9c3cb6945b5a321b1c3b72fca49fe4787f1b9c2dce2e9695e5ad0661a9692911803d37f0cf505782fdc4c96c1fbbe5efa32bcf01aa8204e0d8b6a9e00b95c583c949176e0e38d668b6a37702a5e3ae8d072413d8d4d89bc3eec6da8745153533356d4f54e2b7c4883b7f0c861bdaf295ce93e282e95a4e67e6e572cfa8819fc5e69a446852f48cfc157169e496a2c6061fc22b3b6fd9183c26dd9188a36c962f1c3dc121c969fd77b17b98c152b09d37d7a5393e5867b105eb018b939b5c8d44b0955a7774b4d69a6704c42566b526e6521eaefc0be43c7ca8607d522702ecaf235aebb1e82bf68d0d087d93ac72163addfeef7d4aa67c9e23c4780a315f71e25bc3baf846fdcd0f4b5e0b02155300aa03e1d1adde5f932ee4e9bb4019939855387311d7173cec1c4022c769aa80927eac98b644226bece51eeeccbbd508d083d36c4e8456820b0c03b2954c3e77c04d21c154542dcd894268a44b2a02ac82f3d61a14399ffaaaa5d55a0f660b2ece50453fb15a38daf9457a62444a1077909709d7b0ea036824418378ea580cf3bd8df491255b0869013a40a99900d0b118ed058bf17d0835e73ee519ede0aeff1654dc29c66ec70c949749c48af3ca8f9f5b0003a83dcc8bff5d63665ee97ca9041a5906be91663ba5bc36a6480614c0860242b060ec6c4abc20f210dea742323ab6db7e120ce8245d4d0c8a569a7dad696f0ca94d5b443590882784b856538e748f9db4cb31b4e825320252c55f7716f074b176be8abd328fa4c14e615a28354344d127a3bd4d820baa3e470118f7ae8bbae3b0af62c3c1c087648958338fb2e6b2e11cc7accd7e722546b072a9d0899d2111b82f8eea52db068062bead0d90b9338069d1917e111ea68eb97860b21dd1fb37ef104db5731b25b12bbbc92e976bec23e01839e74ade1b535060ed0121b9ddb6320b6aae54dbe516e9fb9d544c06f86572e13eb3fcac0c6733c84e5ce7063f5d52c3256bdd78781d3a03f523e064e0983155fa0017c9a8f1cf29eb30e1b71158d37fc2b954ea344ff27e271fafc1b03db63b7f0fdfa261bba5edfb63d29ec141993d0998e69cc24f637aae145c69e7583470a8346c0e258d84ef866c961726f97d0850561d8cb681a9f03e605a0c344b8a5cfba00a24cdb679690c49cafbd513afb7ac727de17eb7c9174c72e86be3ec40829fd79fa7f67cf595316faab15ef3f03262f5041bacc337013054312eff914e27187678196dc91e42ef418e37c1cc1698f2f24f96927d6c8f6ef1632153f13cf9b30665cbc105fee34acc4dd757b19c860bf4079e35fb51409573f31cf85348711d65936cac4ac028e5019de8e7b6aa1e2c3d46ced39d378f7549393bf60b11617a4a65157a8a024955fcbba91c4e40a2cfbfc06ef99da4820b1ea5465ff5c191596079af173a58fb3c73cb8773d271e9475327fd0657fb156f71c0689656df1c8dd135c74916fd18b89789b63f26dedb8d9e4aaaf869d01d57ef780200715b5760ea8daa898742c34a5dfd26fc7d5348eb22dd2f49ad4f9742dea876da9932b48bc54e91dea8f0a95b441148fbf081485ac3909ef9f72fc9800a9584764bc5323edd700046e87bba9cc995b0c5859a3f51294d34ceada42091f0fe9442d6a34e21da9623af54751d7b326af1c3fa6bd1c1928d85e9aef3d83ded0f5ac92b5c4d35c2917e0570c6e562bdc71a6faa2c6a8ae2975260c7b4f7e800252829a68c769870f2dc8df14083fe766fcb1fe2ef6d47524aa73c6ad5ed5b1170e6b9ce0e5416fbf434131bd7bb0172a523a3ce9e621b84d0dadac439a949650e1312ddee7853bb25125a961ba8fd6d2c36182746b25f6b6caff2bd7c523d1cd75a542282d3f50ec14f0f2a64cab9056289bca8957c106d2d2a2ec7e6d98f0661d3e7ac1d4027c11756e633c05ab04ae34fc88c183af237049bd45375be5ec13d4eafcfc7dc8603409856c6fec21c81f4a7c09c84c7ce7150097a51a5e5479cad275d096fa8a72393b98d283930be71c6f7d6869488c76397273f81f7eadd0ec46870002cd7b62f7e164f9fd220e8ca170ee5c3925bd3f22a48f62f977b5263581852c08fedeae4d26acf56c8c6ad45492c1f9d25ed1dc64aab486709e9017ba7b0a43718543a9702ed1aa686a031c6be2bd1d50570c979a52dc83a94033f82bd416869f998670316ae52d298a5af9aa68465c6b27f61422b4fa2434a0ebc5bf2e77c85ee6ecd9b012bf2db124d55f4bfe88f02fbde08b2c547872799c29adf7536998a9bae094c58d755b10494c5b0a7fafe5659d5bb92cbd8b7985bec57d5046913e84b77a8831aba8ba0f81d70999870c52f035594e9604c627fa8178d99036f30c4cf3a8b0828deb0331de1933d7b4b8626e1c607400a978242410f78232c1687d812470bd3f86f561206ce4cf67661e990dc4ddfe387f4211199fe8819a1b3e05dc65b82f5a032461eb32c3cb5e3dc1ac350387103f8df4b078597fc0573305ef954deec26345f8072d1f1dbd31a061bf020c2992b21e7be5b280ddd92da359fcf92819ec30e60f0a0b219afd5f1a77af5465baaaacbcb29d6c80fc7d3e10f020effca54e057dd8b22f42b3878759f0f8d247620bc9760242be2da3cc6a649d5c28a39c39bdfa4478255eaa08dc27c618313c414a4a65f892de275e243a5ce8950de20010b9d027a0bafdeb444e257158a027b4c33e509165142c206123570ad5c83f854c366111317459b22013e509e2715d0913fe298aada8571ae5a7b0a05484415d1914dacff9b2233648765c0eb545f843b422d9b0209263a5213b018c30a25b39976c104d4249a51dc6254c42b2105714f85cfd08ad150c27d49d465da0cf243b1f4e2296cd8e5e67e03fed9d3ef13cef4732aa2389a5adfe67d42f322c35d5735325e70c9aab7f4bc0619e7bd70cc63480fcf688e19ad22d0df0f3d470be1c5a27fe41d059ded841f055c42e8683cb8ed9280d3dc9e06bd1396c9a8e3e71952dc842e3a640edec1b12bb6c4d7ba0e184737445db6ec2f21a367268602d7a1c4d7862d81c9f214863ed8fdfc7a350dcfd1813d0c226994a12bf0f7d113f325be4dee87f2550431608526aa2d15746faaf84f42dcf34d189a9c192c6d13ad29566b4680d7c07c1ed95b2143168587b79fb57cd17067f06bf42b123d36170ab71923e96c9e872bc34af7121754146284138f2b8040ece9c70b34b0da2878e9ea5d89bb84fe0269a818d55d7538fc72eae3fd4f51a1b84afd9f88ff472c5b06718e11e85518325a1bb5743d7f590f82bb8dff57cd408c99e7e8632c728ca5b2236a91156f6086dda2212b90317a63adee9e27260b284a0ab4d12da485622100d26e90f8411577529836cc27aedc7b479dba12087f769bb4c9f874353b53c80dd229af0aab551a6c0519a272575f292bd3850e1416c08e05cd03de4714cb3cda3aa360ce9bd349fc4d217629a83d5f4a61016ebf286ef627cad972dc1059f71bff26831ba17480756c01b68e31fe9ab728a284b5fc6627a58ce45e5e71d67f0b2ebc49b47edba00707568f303a2b52bdd19e6465caf944a7e5631d9d3383db472f6bd9de0bc79120b14ccf0a8f77ff5eb79939b3d17cf0691a2784fa1e3ba3b604a3aef8984f0a5d849b37bd12d647e9d08f7cd6e49fe355e7d7a6195eaee193a330140dc40faf84e2dab9cfc6b55acf8d3f63495750680f5d5e269adb337750554b4ba77d233b3c00566625d388f8f966988ce5c8150cdbd6f60f067c6214addd6c54d2aae7b9c6b43898fef0c82d3331520c728ed1162bf422a3e46a56b6af7fab7beb2f5febd70d6b1bdb0646da84be40786ee803c1f9654a677fe1d4b736ee775bea828cdeb6571d0dc9745bd5712e278242c2ea654d3aab747133e6ccdb3667039d499fc940da6ddc8c6379ed01ffc14d35dc7a509135f28d9b73f7d026b059745560f14c70cb2ba73db37f574ee8428cdf262b679f0168af80a116d4b6530f6f75d72df633f0d0c08d1c082c7966ebfe81d18d3f82a6b765d18747183ebf6685a70499b92550e59bd83e4c7786ec3136c1d98e121ae90e6f17b225b91345da3804b85a7ef22341e3a5051b7482aa73d27d4998ec58274d3d0ebee053eae9b8ff089131dba75af0e1e69b947766bc930b8085357b10ab15c9d5c381aec2dc97a266bbbb2a978892a3ef0b4fd5f84ac6e4372d6d7bdf745924fd27ea875571942028cd8012b1aa3bf14c094866e3032b4d98fcd5dcdf89cebd52210055bb626a71ce455505d6a322aa2690ceecf274057d7769db8958fad7fe4de4d0cae2bcc447ab5301c127869cd382ca621977fa06328b04b6e8ff2991e2f04b00d055b3d8fb871ba69da61f84e76fafcbd66018e1735ab44b3cff54881d4eda13c41d185662cb2e5c6901b831e7ee18792d008585d55e3a4996fd53437e69e3defb46c95a97a6a8938f8736ad651d65d27423f15c2277c4c069abe972c57dd36f35c0ed30440ddc92f767d9df199899c929a0972ee62608c75c9f93bf075e712ac0e98fec3d601f6c39417601ae7a8dae449b37753c5596c9e9cef6999291c19329087051350f5a723ca342d5636acaaacd27b1c3ce0d770ae0cb3141b2b2db86b3d7938a302e7b2e1f4d2412d665f4bc72238a1652cfc207e928bd4b30174a9452dc2b4607ecdc148f7593e5d9c566d0dd3f24e1ff992abb8839267be1282a3a711d12ba567b5c7b0003e0af2c7a85b2ada5b41449d7d6013c4aa35822a404dea0211446b1544b866051242946c981a5900dcfdd36b7109c4c5813cbab5990c822e94131f5ee60765ee6d8643c504e2f4801c5240c7fac22be288afef12ff991852c583c504b41d8935140bf951817054c6f5284c07dcf2a941637bc66baf839eca33034e747f55f950db4525220a5d54d54049fcf207b183fdb217ddcdb58345636dc84207131e6e03fa3318916421f577f69254a5617e601811a586c43d915dda548c9cb3ba9968f40bb6db87a89cf9a573605f13af6d0ee9ee086c879b9e79be3f9bf0545a8abd12b80a2b2836208a90c7616b787a046045ff439e13dd9a01e968a44db5cd9fd930cdf2f674d737c79f55ac84c6bea1086d3778426f7d1545a012de95be5bb5da5ef3b6430edcb741774a631eb42a4f225ccd03d9cfb66eb70f7543d6d28989e46b9305c60da87b40112defd8aa6b09f4fad51a973bd5ac10c65bee22b7e8c431543d0b72ece5a6a919007c2c5d8bcb04199664ac5c2c40b85eea56c8a0cb67d4e70c25d2eb01b698759ef1145137089eda019fed02d1f74f9646358c63d5fbd6457f9049d836e44ca3e53f870dc89939a90e1d461864d1e0b7b79df6a5ee4db768900b2840b5a7a9885fa994bd31a4d03577a53f47b801f48c3e4beb894fed1f88c732151c61dc9435c1fa2a4376ab3a93bdc655c56c9aa5d0db7fc6c7a1b34c6f98d02915de0cc65103c1bd0a987c6709c8f6cd91000296a0e8ed6a8582321b30f6be4b09705dcc71074236048180a809bb1a988403e97db598d3d6e2139cdd863a980da96494f0dea4721a0513f7d1bca588b717bfc0fb00216968296189e47ee47c912b4628c918f68eb7236c2ef93e8ea147f4683e0f0a930c1f35c13d763b5c101a11ff571729abfb26f544702df0301e9451b497dd71acf49750aebfa3022d838e8b00bae55f197c5f98992d50c66f3bbd57df7aaf45cfd4cf93adf3d489f5b7b25973eb2125cd4630ca5faaf009ead85ba15a25b58f759e1d25f3324df8aecd845afdde7fb4bdc6712f0ed6f26e1fa6de398510ae400a5f2ff0ca4d4e46270afe5de2a7859d9d21d40b4120bf5b5c29d43c24e1923c856544b34bb0247d10cfab4e4f6e4f53442e1219346ed7d54d6b6b88a481711a1880bfd2e79f7355670fe995707fe8af9181ec9596be81c0683f757f29772c1631f8f587c81b0eb8e189e47590a89b2fb8e5f2b5fd99266ddb9ddaef746999be48ae775b7ad175ebb0a5d3fc3115e5a35c3ed96462d2771badd7ad6fe5731199eca8067006186eabe0cc6268da9a9c8979927a73df47a57e11a0a839cade66066ee3691fb3677c06e5c09a13cd53962ab4a3632c833409f376f4da7c20123b01be59164edb41bcd816bfe872266c9fbc4cf4185bb58e64514a8e4c57f03004c25cfac399d1a627980305fc2b897bfb016a4bdfae059b6a684889acca2bb50b91958cdf4ffc1fb2a2d0162d240fcdeedeac5bff94829d94f99304048bcda230554e49703e8278ba0fbe26015e844b23fd31545a70323f1d23a2168fa7cf8ec3bda2faec99b7b57c5b0bb1ad649542b6a200dc64dd6e0059e40085a0be15360825bef7722d5938115fe5fc82d2220d6cc67277dd2a4c86ac0f8ab1f53d0f4a0a64b19389be2019a3340dcaae1ffd6d1eb3f1a703301199fd87057fca2307fe4554fa04e522a829a119f97101eef438753d23064a4d61d7373c74cc1ed067dd14417c04ca607a05f08da605e35eb6a18b192a818907848e9d88e598685399cb0a0be27ad50d6231b886a608b9f955f3534cda3744c8334ae7f6787b97553acc251666789adfc0cbc5411a9fa153f65555f2affe0b2847fdec1680053078546d5d65dc70fc5273608db19329584e57786c2190d169dea76eaeb1257180ab2521ea43d0a7a578d93a637e2d28258d251afa4d43e92713cc29d3c687a02adf629e091b6136c019ba6606fecee34e174cd039fbc4ce7735c9759b40216d2f96d0973873aa2a190bd05b8170434022144302ecea2cdb8e6812f4752d77e0dd46139b1edbc3334b2e7a25ce004ee02e09cac30fafad64c80bd2980fbaa0e885eff30a84fce56f0e9fd3a04a30a65e21fb377f155061262087444dfc92cb464427bc5ed4197a621860a93b16450db54d21606a30448fcbd8acc021b03ca2a7c7d7ee61d684c130ea5dd8c0b45ee07a0a901a18f29ed2e835bcc6446b190a534d05d49098815ef89546d8d673d4ad859a885121b7257ed0e00935decbd9a77c06c9986ce83426aeed32608596df8de679cd27718e6e694a67508c5a6046ddb89cc23faea26563b1d233f5dd4b0f1438c35963e159c94b3a5b291c9c9e15854ccb90b1d3cef403f8b5622cd8870adfce02f888a53086a06543a1753150870e64f18d6e84ddf5787c8f7a16dae9d4e772843543bc443d6d22eda39080dd81c911ac910a2bf076ce4590131504dbddae2a0b84379e0d83f7c87b0564bdd9d738a5dd9c12b9c55d4ee32cc34614a6adfdf5a1a7255c6605f5a1b43f482e85e236fcd65b3712326f7ba6419fd17afa7a2517eec53d82b7ff6c44d009d3a574edf537cebfc3c956c79ad508ac855e8bdb087adbfc46894a89de6bee8314d77bbdf50247f59a6271c1b958d026ac154a4f82c7ff86b5114894ecb00689e1ef434fde2d14c142781545012d751ecf2a2b205bf2bdf578037b60e69230b4278b70cfbb390463fd3d4f5ea25aa080119ef67835190828ee6a5dd6b30990e6b9fa06093e894df64ca01c9f953a103bd8d977fb3018cf5530a2f39d353374118fa51a0f84164fa44a413ca8c305cae312d38c5a0e09e41a6e2262707850a439c289a7e380bc268a4bfc8f0d1434dd2ce27d6010a7c9c013bf8383b0a60981381f0eb435c934e272c820a7e11213a3c38062cd114c3c1f0f6434d15cc47feca0a4e960136f07827834c30365ad019b9b1d46c3ec6257e171dfcd8475487a60d04b337894f67cb0f9858bd4fa0211600eb147c813b97de289a1101e15fa30b89f38392d6881336e3ff3121bcdf4b7c2948bcad64fadbd470c6bd7bce7ebaf4a192f1d9c793b5a18d62228655637737440a21e7951e74880cdbc1900143d035861ff9ed072bc47c44943d71a3e645016cc6689204357c3abebe41807601576740c67bc48197a22d140bbd0b2c5bcb59ed5087696b53b733235aae26179fec184c59d65eceb918c109e9eb23c9976881ccf52861f6c8caea2f773856c84195a35de8196a1da7d9f9a2699eb80a0237f7ffe905b056e143f5ed08da7a000e7c18e8cc7328de6405da6ab73819d2c179a0daa531dd2b9d3384928ead5c6daf7091c5cf9387cb7bb545eacd26e697dddb9f6ea4d36821e5684d90717e2f55875e47e7e78bb7c361a5aec92ed670f2701d4e3e4fcdc29a90552e708bfdbcf44a59d05683422affee8e06545476f142a7a22e9d18e932be74c40a5495dad98c4012a853d767cf9fb24384b820250deb6e1c1c105e939955afcb68d3e0edbeffb3a9ac35ce958a0b0ee2c9c824db4c4ef5b2d92e7161321a0f4a5420dc645f532739f32635f24ed58a734c00bb2beca6a5b011e5f9cbbc78aca714616760aab84c18aea32bd435ef17f2f3b327daaf9f146b4f080bf13c119de3175599d653308fe2329c1d1611e37b7061a01042c0df1cb961dc06e9746a1e20743d88141061ec1729ea05b0b6160c7b737437f6674b022b8f8ee3422ef5c11c6dfc634e794281cbb0f8d09676387ac3d1a499a3bdd33705cf8828bf335ca79c392ec4f71890d684edab3c1ff7bce290dfcb2e10b759a64e0fe4da93ae1a82312a9f5a6111e9e6c80a3cac2935dd2309f19d2d31f7c8d0f7b351744bb8c837956d30fe86a9c30c454a6b66e341135d0f05ba4ca7d59a8ba9cdb4ef2250e3c0a3597661c31debf1c11ba9446ee04c94d4bbafaa1cf1783676692976ad67281f711670d1594df0d97766e8e1cdd82f108f2c5a656233f091d7abc404911bfae8f97722f9e37ddc88e8bdd1a2a1f1d64308c404131560ec6a0bd98c6ad13a75716092d6fefaae0f8e00646a63568aaad24ce5f4b361db5453d3720e0025dad10f76e93d61446d710496048946e252b91cd795edce3b83879d3bde42b27b6f06c8a3f42c04c989c9770c818fbfaf3968b69bde3de60c3f28bd4ea5d3b4cbc925d19fee0e4fd852b931e49e61be216fe86ddd2654eb632242aaaf9493af0c5ea3eb2dda33b1e1c8368c6ddc699617b71423fcb4c56276e4c48abe286a49632cd8d439fc50fcd87367606b40324145f14a187ce2f03e498213454658174bdf4e4559ee39e496918c0dc720825040eba7d560981195d3e5b7a6042179f2e5960d1d9a74a10d8e8e6c3520712baf870c9020be8047cece68f88b86c76c208804dda4326b2becf7c2cb7043a72747b0dddff0fee138dfe50a31f6edc471afda9463fdcb84f34fe438d7fbc71f9c9db381f1a9dac7b8dd677434ce57b1d6b1a03adeef1838dbae72b41a13cfa2dfc2c62b627e6b2cf29a04b49d7d227a04d099f2059d13a2a3e9fd973f2747a15f4bb6bd4ac3d2faae4fec40bce6eb0bac8ae03e02846989a227834eefea05ff68cda0de61253ab726428efa8b4214259e09c004f67c6df3c0ee954835dc7db2ac34865eb472e691a65881dc8979d86cdae7fef13d0b75860bc4af2ffee803729782cc15eadef8f2505baa169ed049a16c9c84f8b1ab12f00b352df18631ffacf6e4c2a678792ed83f07ce9293da8ac496b539806c30a1558d7383d1a56002be7012a053fffbf2f60ee94dc3e1be46a29214e07a3f5b003c851e9bc019821085162f9ccd3906e6b6954bca057e64093ed799f7948d2577e555f8dfe7b551bfe3f47e7f47fd0a22257618e42edea2ef3fb433670b7020489ef3daf228794aee276254833638226e9a5a2e1531f929cb3243485b21c33996445c6a4c30a128e5fecd0d41fd3af3d4d55e4a0c96100182e299fabd628a241c709dd1c8bc11766368f5c95e8e2463671df28b187433eaa07cd0f9d580b29d1a1cc79d1907902e4edd24306dd368754e637b5132c374d2ebe23b7ac297834932cc4659900999d5db2da505764ea4b6873176db12d79cc0846454fad1dc2e99a596999b3bc00d7595efed53d41d579b8db11d307e2be6e24638bd1b67d4c60684b7043568c9c2f01cd6823510765c3382ef5b250f71c85eaf99769d76b131b5bb0be8b7c0aedd78a02966f2ba9eaf388566007d238c6037f7cf25a9d8dbc4156d9989352c17561fed63753807c930a9a5bf9399b3534a3574591e61185211a6d4e242b373dc76a0abb57923dd304597ac85a35974117be68e686ad7cc0eb1ce995d50d266032979b95fea6eec109b39fd9fd17fe04a2388ae686f02505491769deac282be5126e7ca1b9e8105d352bd056c520052ad45807c8a5172310d64d62209a973d54c5ed7555f11f9127b6a752f3acc4cdee208703b5e4a3034a186b2464d6518c00daf56a4a7b46631f644a1d3c4f30431c1c3606ddb66a3c4c28b5b6fdf77c6a2f7c0871e3eefb0d9c5fb4356960995ed2487dba021bf1601b27e9e623e939b116ac9a63415cbd5c17b6e7834e1eadc01c67b583d29a4d6752af3d815692362dd6f3789d9e5b4b7c1ee88cd15da3657f5ad39d2b050ad74f4da8105395eada91238b56a2e405949a0da656ddf2204bcf824dd137c3748a2161dae26e6a5046d2640a3c3c37b058230b66b7f42996fd8ddf8200cb8351e2357b9aaa6db76edba1756d60ee778f03d03ee58660c211b5cdfe5419ae09648b8732519c50f638a38d045f204d489bd14ce230a2ea6fd2c9e11935009bdd8e92faa000997990e95468b292580964b1b340143073a985c52494c59a4f8bd90673e676ce8edfffc3cdfa77b8a51f4d89ff68d09c27f1eca5e196db28afafae2cab3feb0fc140bcbb06189981696c104341cb0e3691dc381132ff017d78c2dc347132e383fb78e2b96d22dc3cb132f7c13f6a62b83dd165fe01f363811319f253c8d5ad862731e5df1ee427b71e00e20a848a2a19510139ff107936f53156b89f32b1df326d7f199b1bb18afdcbb47dcafc3ef57eb8b98eed2fb3f72d65e48ddb62b2fafef8fd1d6e7ce68683dddda9bc0ef4367a0486d65ce18d565d2add31e1824645192c9c04d5d9df14e3fb538d087a953d6004d9a749c7319072ea75c771c20687610fd944db4d610370f223340cec7e0f5cb44785c84ebdb9113e7024d37fe5f09d1dbe9691541e1516b62a769bf599ceb8c1fd785ed0ef272ab582707d4900eaea5e66c0d11f8dbb68318be465fafb6b060273a8ed2eb801227c35566210b0789e0eee211b555eba1fe60e80a55ad636e9dcbcf425a76ef5e58e3c0fd6b8501d16c733676f7727a1949661bcc69f817fe41e83d31086e13574b855bec1aa403eb69c8ceefd95f63ceb56c83ca74ac2347b5a8e45443a68333f4064d58ad01bb4ed1b0f84c6c07574d568a01a439a9281fc132584dc8675f0af91c4545bce76c29fe873de5e017bfa7590931fcd53c2242354ddb47865adec2b6d6559e957b69586157752f471679e8070fe929c8571993bd6b8daeb1e5b5db5968c07da4c27f2bf6dd67da307247ea63f58ae8e60c19062d7ac2309dfc76e57ec564ce92c9a34e2f04d06c9348d8bc9eb2eededba99f1a71a68d293c2b7cca7d1305e476ebfb76375618d9576acb92309f7652a4b7f580d395f777d1d8898cb289dae810a72dabd5d56077b7ce97b4d3a82c3791079a9247048e48515416e10cd49e01c59cd0a5cfa1d5b2508e2b024ee154e2a9d0e81381b7a688ab8dd1cdc468145c55ff27c1fe9d46e1de61329224161d631c33e462235b98abd8f4d1db1005435bb09a6486e4be6a312de7b4801933e3904f1727abfa06dd6caf46a08efb44fce949ed4c0fb05b481ce16326fba9893de8e198903c257a1d2bb32722e449db80d760e1ec1f8d7d37c6a43d0dcc27ebff45261fa216a21c8fb14b635fe490c9205e82a94da1c60b691421140d65ff3d83cad17ac2821d6dd9e346317421147141984174e8a3be05b44e739ca313a24a497b606d7f171334e9718dc700f37fc07480692eec173a858ce119fd889072fec6a399552005be0ab87dcc7e9ee8165ef2f085c062c623104dcb98e6559c847c08ff5bf8f9a29565a9d82c00c30c36f39fd01194151b77929fea2c7c3c564e29698ada3b7043c102266e692f96c18d5731c320a8d0250addf05cfb76f1f1a1380271f40ddcbf1089d9911790e040de80d5fe2cb1acbb8297a117739cd48406e5281f5fa0cd78338ceb17eac9a675c9a0b49fe1a4dbff4eda68c3e843886a3fe9e21eaaa275f61628bba88a2c7e16e09171d76f5011d94d09e937f2266455b985af0fe6e481b4e847754992cc93bf10e58f5f931993bd913fbc29617027356de7da477c543598a721f75992c85676f67f4c0b873672a8401a8131a1121fd5eb7a8b7da79b0af6fa0553bdda5d69cc738747228428f2a0eca89c5b27bf78c86abf3201d66ca761c9d622348860061034e2238b302b06e53a61a3174fb33bf9c7bd708f68bd2ee75d3da7e207affe1590bc2c6392021108aaafeab55f0649aaf0e9079c4c069bd90ef80b653051d3210b601fb7aea62ce3edf36ef3b26b764e995c53c42233c2fec6b2e325c8c51f12753011a4cb9536e468aa7999cac3fcc98e63e55d4647b4ea848ce18ffa6ff33ceb15aa723e95728b126f595e92c947924657c22511fbf63db593912435b2f34de30a37687d0f5811c53cc96cca6788429cbbbfad740ad9326968b6818a80d347b0c2b824a0efabc76afb97dc8dc6214d5261f2057df445fcb742d43cda43345bb3629148530eecd2a2306e1f2223a231255af854db352f0c28af9c9e0e2f0547b8a8ccf6d9a6b2ceaf1c86031d5931542628e8f03dfe406a1e093da3b819109171c2522e12b4c3a98931c0f1c3d7c1601c3f28a6eb267620e654f1438fa5133b60ec01cd8511c1c9b960e6741bdc627d7d3cc603474a0ed3bff736a914e02b3659b76094df19d079b34a636999500aad822bb997ebb3131b18ab33c9f00ee668dfbe19cc812df5c7e760e35c9eb025059539482a6aecfa97d5c2e59aaf5f8cfdb4210fb4da604d30218eda431cd38e520bb4f4374beb24cebca58033ab9f283ca9520773a53d95b0b232fed012ae3ec107e55de8aa545898e603c6015d8f9a0118f292d63788f0d68d5e9402d4b389534ea99480b272e29e5906447ef1a6a1eb61533292e782d7bcd78441a44b65e57f2fd673665b71b0049adc0922ec7fcdf0873dcbf1ac95c719c25d3a457de4587666ec922fdd1a48f2d9fcefa644a406243b1b16198a75e93ce0948b88b42854200cb249b2e117ef225ff608cf38231a5c0bbd13e61ad109dbd0479e9215967f96a69f98aa931c5280ba58283b1c191fd76fb31226bf01d8ea967fae985e74713a252639964fc1dedecf594a814b7175b6b1eeb47e504a155aff362aad2dc1babbfe3ba7036f082276c7a5d6a3e489a419387cfe7e562c9e844ff01921eb926b91e34113a5800361415cef61cd53321bddd3d703ed603f4703cd055e49de815cc55692fba15be07356384066e1069063184b1793e2c98651a5122b668e7532a7101d28d2120078b84b93be220714ff6e3cec9db70311e4c9110696e40161d76365fe96729210a993f25ec2bc04383ebed5bb581029cbef9e6e5385c933e19f30523e7ac9fe7bba00a54c79b688cd21be21b95df7c8ac89f495159db44fca91f21a2f1d631805e30b4b98e13567acaf3721736df7009aadca76dbf85bb5f0b6d8b8082a47c28019955f0a0cc3d240f82fb567d1b9798f28a46a4304ad60347d67f14cddb2a68a05b042c1d9156d30013f0803c0d8191e51dd83bc0619eb65d3d57b99b09155ea966988d27447a8e53f684ee1c26aad415615594a1d9984cc59ef67dc292e4e3aec1569fae5b772269c6838606c59975b295c1a9a58e70389d716a083e26528105e3de26efaa3f87be88797dc67e138bba5a5064706abe6c02b737ce6af7826e227a9dd172d554d4e65f7300969c88781a3e214660c35fa6fd8fb34c92eeb7837ff04c71dff09200a7f9f70d0164e3241e68292bb05d6e9d848bd714a39e5a77693a64aa666e605b04780a3f804fb0508f92f001420659a2c02cd74a0f6539557ec9a87d667ad3eb377b32237c88e1ae469b7d10375ad5fddf1c66208e5fb396b6c89455af68488721f1c35d9bc8b0db15de07dfb67ad6b639e08ba2f5eb3b55c57941ccf48bb04c0f271def9d6cf4f8fe91f1a25b636d6e3a347c86dde2940266ae40ae3959786f833343a02f218f897f658cb90dd2558e6459c9153f6711d3643276dfae7ef0b4287a5bbae8cc216fe8cd7c08398ee65062fdd6068571647d278f999e57602b6536121e9340dd8d515356061338e8f545f297541e66646a88b5ee138d820268309a22c77bca85c4d9a41565e59e8aaff187df40c1ec0f92d2d1afcfdf7e4c72295dcc134e59bbbef2e98f464e025ff38d345b7c4b082c0b062aac4a9104bf09d74c789cfb63a7134570ac1c890a93e91ec3b45685b5312e1bb76fac9087f64bd13ba15ee12f700542b71ea3ca4218692da002514aa0317f6a95921b78ab3bec99819839a8e081908e33dfc3d57633f97cc25d0abb4aedf1f541ba90569be3b8b15b61ba03039223b998f0ed983f0de032ac4e867c3a28dfeadbcf649f216fdc84de633ad183eb128c910d1bc2c874299cca328c5122e05370d9a7025bbda7865429da08f025d0e78e713d77143c35378031cc93df567049575c02df80f0c6c35cf646186fed0c7c16bfe772506e0baaaa0db2857c306416c6ddab88690fdf0c171ffae7ce3cb26dbc4e4f8be6f7b45707c047b4e752a10b2cddfda3395a5af0f6944f4b55428c7814ea688fa27af91fd1ba0e48e43c9e6bbf96968af2747d0ff77fa0e27ce1681fba674c7c1425019d14d3bf51e85ab5d1f820940d93d2ea406cb52c61b5687647204d4cd06222b12d82d1c9a89e70f9e787069b551f8fb2ea1d4d0aceca5ab27e618b8c9f859cb756e84c67a20fbc57c3fd9b4110c1857da8f19156fed0b9daaace41f24fefebb73b53e7e9ea044e843543f39323aca015f93e6bdfd0c67f6f1eaadc281ae3938b5961247427b5dcbbd67c96efa5a4b749b717d0de3afe02bae31408b20a64f296014375c72889b3fb863ec2cfbdb77a34f23f2d530a81b5087fef0f28925b28eea42458a232e3927508f831f7f90949add82b1775fc51567f946253fdd8673c59d1b171f116227b8a3d56c2866b1b866247d53359dda67f4f2b63396e1a99a3a5fa0bb75cf7e6863d0637e0c6be0428be760d6ea99c696fad88a890546cf65b8bedadd50f121b62345e6971c1b6afdfdc3e466ffc5df8d750ab3d4f8788c6574885c044feab570f1f3313616b4a1c0aaec529dfa7443ba34a10c53590e0ea1d3a9cc5c1570105fda12d4ee30eb40806616c0c46d9be7db33163deeca79ad3878aca02c3c3d7082bd3f69b878bf5cfcefb67bb4d2e1a34b25b3c85a803488e0bb980448646e47afbfbe92f5571a48015ed6e8e91c7b9690f5a3964f9ae7e84f7d17dcf6750070d30f21642425c518a8c174dd0e503751f3edeffe333ad0c7d0c87df00e6bb93dcadf6b89b4e63abb6ee082e2a1b9b3a9c423a0e8bfafe3ba504a7a0bc50776303f488aee2be36b7ecd1d879ed0cdd4a7326f295d2caff1453a1b563f16024a54263bb29f1a39d88e2894a513aa885369935e1adc720164f8ce984f4e90ab1612c2fd16bac860dfa4bd998611e721284debe2ba7f9f901d3387a339dd915544994aacda5cb2f6f588cdacaeeb442856cff06a934ab66696bd0c50eb0e2acd60da3e4d47759c2bd4828b3e7aa6397f107a7d59ef7a5bdcc97188f6847309c465ec90e01ab30b99597a9653fbfd4ec8e250407b0c1a085f433bc5566826ee9ff3896f9401cd6b865fa244e5dca87628fdeb4c63e2a3ed414593f4ad7ca24b5898ad1a8ca78e3159d3dd03d2a7ba6f758ba899ed6c6794149c744a71f07a69b66155998711367e6e35b82268ac7283d9b4ae825581b5f182a6c6247fa269aae86c8f31fe724f684d9e3c004f6547d38567794b84405287cb3bbb0f9bd27842aa13f2d0529df53d9f0384a133cc60a2d8f8ef8cf06833bf5c57817a06b8bf9a6d73a40e1be016778049e99367b1d7655264ac0e76221a46d597bba9c1daaab208293181c6c2cf0bc0fd41c3e7b066062ac49f3062e92511491733ee4221b96963eed3934e079a10bd71cf2fa1b026a41403b3569bf56264655bda8eb588678e31db391e97c00a14778281462b5a8b33624270cb34ee890342e4d367f29eb38fe7d45ad3ba57225713c822543ba925beb3b8b55f683e0e61579e61c391cde9960a3f5bd26dcbdbd34c5e4e9024b800807e42524f0d924ca62b504e91dd555284180ee0e44283caa81fc1c3e4671fa1e041485b970d8773f7219267e97d4cb9f24e228cb0e227f27de1d015135d4dc82707c43a952a2f3e16fefcbf57ccde5b3f8093e2c372dba1d3825b512efcf50a2f607cf3201820c65040a6ea9d738e65198d9bc6bb488aced702765da52236e2a1a86e4175c6021b886da3b6d01c4188b4971a2c71a59889ba65d99e78effb0580c424d938388c2372af4d8e5b6ba63a187d96b828a66119e29d8c5c2d3221c2ad29e1f2250d388238be06ab65d120e6038558d1c0b2f138f251cec1dd28492ce874d22db4d0a9860e6c1d717c0594e095516213cbd459e14f901974e0f043b969c4a3236c30e2b2f802e580dc4457b55eb751db2ee4ddb64c768b94bedf2f926945e76713c89ac27cffa4ab5e012c2462b9fb30f6775fdd72358ce3eba819247c59331f29405b49cf81fd5a05a3f285e8f21303e5ae83feb882bbf15ecacb1604c15ef3831f05ce6319723e4a1a51e7e70457f01a418a134c6df18822a200ebb6717ae6491c8fb9e87463f91c8e4656bcdf6c255ce440af59cba84db2565762012f1e9703c683fbdbe92a7dd3aca7fca4cf812b5bb219f58c6484f7c45ae029c3fd1ec4b3f18211803b2d529f4d8e106fa4652fa5f241d42a36abd863ec1b479e44e82bdeed12069e0a518c9ae52925e904fd8405d5847c8ac03014a3a109215546f3e876b338f80449f0d03161278b37b2c95a0ed0fb10c801ba2c0b453de3c28354aa8d545dd3f410a5fea2d728d5330ebb72a7ddd510c530c794879ac88d8182b1e370175d334b69106061e5534c579d994a0f57e98fc8362e4fff05fd09ff0909de0dbff07c8ee4ef80f601fc76c6a5d7b99d278fbbf4368d48089aec82fdfb75fa4a0030a5e1e7230c29c920310c5f22df954d37cdefdd11053ba4209973054e310a647e3b87a4e2b4ed49a39f7f7bba6626d4048732a0418e6142b088266a51b5909d247a45a4f14a746b199f47450c81933028f64f46a7c0f60b9d69bc08319042047d4bf5bf98745656722031ce71991db8f800c37c762061ffb5159e9edc73813cbe40476b1c1e2b47f80cced81f8dd44007aa07e0dae027e109f6162605d283017fc3dfc841e3a9124a92886f8b9f834b5f2c39d6f79cc40cf352db7097021d0f8f55c537756d4398c9ea97cdc4e10097d1f0a2781408c7ea322903b8058f552c4c4324d9855d5322df3959a048a4bd3e9141dce84d02c7020a62e8b4213f4d8edd1694e8d821428b707cce1327623df1ae0b8700e70464c210791d4eefbcdf276bb83c8b9cfe3a1c36e413ba9c1339b6721f46d16479b6f75d8b36f18f791511e383a7e46b6944e8d431eb100e628eec69e62577bdbd388e26fdfe0746a87a894599282db20f2993eb17c961489b2ccb0a8007af86fe487352235eeb6fe2d6abd95c87275eee50d03fdf4ab73073432f4cb8779a014df0a6ba9c457a3163a282336afae5b5f4e33d5b4a6d51d688246c785368204fbf42c8a5ff86443ddafacb9a70a86eccf44f35e4fa3bffafdb364027ca3aef083bb9a2d51f37cd1e01c803b382207d2eeb087529b18a225040a9e5bc599cafc5be2cd9896767c9780f6f841090b5c7ac419774a643b0d265ee1450868c1f94354df381ce221d51ab3e6b8561ba07125543a7793debb1b71564b96727e1b834a78ab1db042262d3ddb68047d294b7648bfe34d8cecee70b279b8b08bd3a24600ee04d02e635f7f6b8ae9090baf421c6d4658ed541607915f1d4387a8d29c5887154f8db8974211f074226b9b5261c5a03b432f3c9084415fc591916e0f476971b9ec3dce63aa7527de9c9669d9aac7eb7290d24772bf1b21a14095dd3e241a7161f4f9487eef8d66b5453794bd521b4dbb70baeda2ffa1fd63d5cf726752ab0ab0e8d7d67e8ffc359cbbf16d8d347c8df514fb6a9cb082b35dc2caea4d69d6d77215ccb445581091eb7398e0ff4d2bdecdd81e472ab02724d34a46a1f4d99f17c93635ae0514100c43ead92572e98ee4d2559ff988fdf7c08ab327f0ac40f0b0949ae32ad7a367207f055cc4619aabe67e402ddf2fb66fe9c72ca2d7f18e6e01fd14aa309d7badc4807698ba9cf70a21eacb2fb1b23c0429ce66b78afba839eccfb5b14f6109bbaf660c4ff86bff2d6fc9c1ff4a13645fbcad7be12c5a7260308ccf8352d5f1d8c9505605dcaf38e6f0f84d47bbac9c171b79666d8f893b0d2bd553b5fb47c3dc071e80e53b4812cfdcd7f4732e89be3850285f6677ef1cd3c8601a02f34f0a58c486a08248ed19383b5e464f68684b931146e919d9adef114276a17135c28a10e09bc3b658390e273e402e63f1c4305446773e0125249a4935191c10fca67e3a1ecedcd19da2f0074e0b1cad125ee34bc69fb769af0b95a4d01014b1a5df54962a5e6978524d2321771922ed9f3932f8d49e794456dc722fe78bf1873db9f7a1737b45d9928095e503692a68fb485055f4642053747c46888e5311b194c7cdfaccc7e1fa995a9ec434b4d7aa0d0d6c1ea20497019dc7b8b6030eec231175740ba7d6d937927ea5c503b441c9a4eb5b86300da6baed568344987776f19aea8d693f861cdb8a8f4ad204e8876e1ca1992f8ebebf4512f1d8c303e1eac1b5b2bdd843cc021ae00f78292310af980544102f4cdb8409a2ad05633a84af54767b6aa917822cd774ac37432509383d42378b5a9db67853d76c62011ebb3fa506a4c3f5b5658302ed3e388226a012f60995a4772dbbe951e93cc6dac6243815d7a72445788446dd1ef1a56226393d4074b11bf44d5cd096e08d48cb25d55006e9f24f620604b051910a2396a8e5872c0475493659fd8f3cbd4114bb3d8be26b089e4dd0bf7b1d6892af2682c18cb7bb410d15ce745a366f4c75a4128a648830059fdf567af061dc1b4ebfde087f0161ed5f3b20ea040050a21ad10577eabdd3f2c81d124bd8cc2d6323dfa14f2464b2d9c6a095a46a926648990ce64d29725e246c3e60e45b0976d03153b6caa6e643339170179bcb48368ac6a96facc5a00d936bfd5f3fecaa9782cb99210b13f72509f0a1b37974d9e1bdc00fcbec064976498727cedc2b8f62e74a7716f19d72e8628974cabdd2dc6b96dc2b47be5e298db3309c4b06c29d525bc06b60a7cf6d7879a81eb6de9366a3d9d61b0be7603af58ba43f5ac96b3b25b998ec5de1040b2626ff80407af4808484009d1ca427d4e2bee2055e758aa1b2c5fcfe90d92621d8084b60f5cfc2f86b2ae2679b44be6e8c1d4632b5633a6dea2edfe6f8c1497ee9212e958e9c5a592663724523c12aa6f814d216a73392b9dea74f22440f416ee58bd6df935f972afb745cdc082bee89b2931f889c4b9c4bdacc67f99ca5ec3f7df66c7f1b5fce8a34e594b76e0f69c47442a18f5570aa7d1e0630cfc43b51fccb138ecd2c59e60a743bc7f02b34c1251028b8510fd36ce0cbc38a87dbf20e23bec0cfc50bd9a09cf227347b8e135d746832c1ea20d73e792a66506b23a2cf7f7369633f2cd934b3ae5924dd558253728fc77d79b8ae2a4e61b4c8d075d461b732ea4f18bf7d80c387e911ef9d0ff86bf08ec93c087bdaa48dd8ac917104087c50de5bfe86357db8c3ed6866ac28b24ffa093663e89611c119233baa2b06a3ebaf3f2aeba8889349be0b10d2dd61fa5da6d494c734d16646f1657213ef01b0761fcac5a43395a37935bec97d275e8777cbe1ce82750c1f91e084040105f40381065b395929f9f9e6d2d7ada56282b581b1b8a626568d658a885110bf5d0c7567e1ab5341872512e0bb39e885a2ac287c695a1b8834d6f5959a05ecc327f85d6eab5ffc56ad38586a7a1ecb0dac9c36abb5b310ed3525f4b7c5c4405cc273e0053078a1068acb1894e10909cfd4d755421717a8a0f5375106959ff12f8db920a51c73fa6c7c5dd209d8056b9b68598aa4258a95f78d455ae74b5438d80b69a7af93bfde3a3e0459bbbb7434f860b7fe2134145509462e0c7207c7f01511e3688a9ddd0ff05b7e3617cd58388708afed95575b26e68acbb7f0c2fc53b3880f44c186ad8216f55704cc580ec22c6f1b4907e60c788b0302575703024bc5af615bb2c4f36708bd60d435e16e17702392281377b93ff2f2c866fb82b5a3f24c87388b762bf98e1dcf5ab5db836369233e157ae070b582c7958fe51735dc0355acf795ea5274c684ef94613b31268c1f7b6fa4b523f15328fc6365a7cfc77aee42341858e06b0cff9fd30b182d0b133a551ffeadfd44957f997941039bbb299783254872201cb973ff72aa5ac7484bcdde5988ba97394d3aaa71f21e73d585bba37d84fc5118f97d89f7a5a2fbf5f7ff808d2277ddaa04cbe6add8dde5261fb366766e22240a4b4dfb2b2944ec5509fdae15ce107c1fc6ffe90f76a33aa992274f3930fe4dab0a24ff9fa0c40f92e2fd54d658289031f9d80ecba4c87422899cd262cec06b83c4068d9b3343f847dc5f30e3875cdcd24ed052e55f68c187129369dd64f2cceebb405e007342b189a07710ded2158d5168287d66bde122bfc1582304c072f3651e3729f6cb306f95d73a31da73e5e3aa84da2886fbfa839a859fb3f10acb060593eaf0f85edc89aa477eeafbc22c43d5e2c92a29d0845b43e4b56ea8fe84260d3d62b2cb3d794a7b5714ef3ca5d05cb4d8d36437f338a674a46e944e5e0e682657af4dd92c904da8d589a68d8eca0af01facf7f6f33f7cf22567d9550ad6710924c60c24fb2618e28666036ffe7ab2917f1e86646391c1222ab279c244e5152d29859d3840de34ea3c556e7f14fb45109b44ed540d3e49311a5127985460859689e463564e8d3b52bb5dfb06e680da0f5d8585422fef4c684b9ba206f6a5b49825c1d709d31885a16b251a282e66ff522405a6247b884399c49c620f7128939853c99ec7d240af2b024d8e9fd6242c1c06100034c12bf8639058befd4bb57cc4e69ea641529517f705a4dba963658bdb89bc1a93ec54573f36cea4bfee32bc05982ff44def7e66605ff87d0cc8701fa28d374131b92b2904ab8e899376bc258db5ded2c0ae7786831a8d3288a65a3bd1819823f85500a0a619b8ec075ac7ed48e8c65c690fdc3ab8d552d0f59047eb725dec07a473a4fa071a11d78ae8b8e6a9e1b36055e4a6213814ec4b6d5d7418f3f0d1a581aa9bc742a9d099a788a9d663b77bc42d6d1316e84d6ec9deb37bb6b1635096310b06470f3f8364d9efbdcee1a72241ca9f3c303d7dc6794c812ad484bdd2e499a1be64c1410df92eab10cf40729f8ad57c0a1b0c124c4358d2518bd9decd13231e5ca4d241f948a4d478241b16d51ebb8f91879e6d65d3d8558bccf399079b1ee9c822fbb09eb65bed5a809d559bce3d53782b7eececf94e24001477db02bc288ac2dd7b92cd13228dba40a34910510230cc896108e453083de3b819f603307591bdf44aa1dbb373fe0a4fbd94c2b4c281e3cab81f9b1505e57cc10792765b3a12ced34213b81f88b5f3ff8bdd0ac2ac6a285547da66c90e13baede3374b7d851d7f74d44e04c0f8190488335c0c87f3800e236f02db9bb873074ecdc315b71ad3481b689a8ff8e6e9560dce1e4f257006a605ed1834de6d7ba88e804e740cf86eaeca9ba12ed3954c60f86eec85a9bd2be8a460c507a163cb250afc08933188d00adff2d70f9c747e2c7ff57ce54b5917f9ace1ee15f3838f872874c9aef9e6742b6ec8942f72b16b316fbb1b01f47e6709e22635f978a30c9e9012d1cb108e1cd98f5f507992c104ac15a7991f0f1fb46289519a4cde8ebed8101d98d894d237e68e9af543f7ea0ec536e6b74c147f97075eb710ef7d78aad5704de1950a0262f762bfcb8655e28d5394de16944daff839ba61f79d3cebbad9ae5fc3634373a97bdc193bb383c9c0854b025d39467554439ae9fdc33f1c7964f2c8722e16c4737477ae23233b905d1080dc23451c568dcf80c27bbe40c0bcb7fccfc3edf6361102c7e5f36c00d0a7aab8e4eb17f1d67c75aac6cfe774071b333cd986ea31668ef082ff79b71cd886e3374ffc45680371a7c61fa5f3c7c478331243b8b56d0fd18e833c979d4c2c0b3b4d86fd1a32bf55aa9d9e58209834a5dd93de811d09a2511a7d8a1c0fc8a84ccfd486622ceff0dc9aa5ca34dd0427e591d35de8d2d8831ad4c1a2c81dbe0abe13dea8df33011b43a23f43d89ec9f1c393dd7847e6d110cc94fd1d55ffaa8ffe394dbed99ba310a2d32808efbe14492f174977ac28c7d054fb531406108a9f832a28a2a3b05a8c42265094682f09555e1cec92339f4cb2fa916ca53214dc0f564bbdb0b686cdec824adffa49d0f5aad4da984e2a2710dd18332fe41659b765f2a8f6319fc2323e549cc4965f3f5def0f6eb314456119ec031c226f709291a7e9387d6a792d21f7b8bdc8c70fd83f408b4ae31f2d63c84c41cd7d1175e1f77d89a995555ade9572925cee1fa7df756cdf84c5b73ac5cda4fe4ec7e833a2f8b4626b06f2050a90fdc45f82f67fc2bc97e962f33301aebe9c7f33b43f257a8db2c5c875866533a626a86c89713234cd113bf6b57313e6ce6800f5f0d98a98e856bedaf671df79487b8228f19bc39bf5c8f449118a70e72e259f64a7d1fa92ca2658548a1040ba41305bb5d95c29542a16e9dfb670a9690274408bb375f2f5357a12c95af4d3510aaa45d870694e1f7607fab68c6dd914d97f85f2d177f36c0d30177928050bc510d96be9c37aa9cf29379b06a9fb2e021b6286ad62a295f92fb4dd551127c4074284d67d20d1221349eee9999250f2ff2749afb0ad9e5b762b0c56b364ecd096739a52cfd0f04d76eed678f976d80d6b900f93873f0471a82f10534affea3181cdc652ff01faee538678e61015f859eaa141c3d7e427fcd87f841c7642ef7babbdac3c035b9e90ff4e05f61a70e354fbbf8a49cb8e54153db66b2d848c38411e1af7a62f72578eccab80077cd15d9c06ef7eeae7ecfcd5d8a1c8a3a36f1a2e20852a1947883324a4fdd9c5dffac61b7b5c369310d2351d5e17b6cf1a73092ef10b0787ec9679b36ead2bfa277b8a249cec4caf9a19894e10259f0fd89a42943334c65a49db4a076a21ca818b931a6cba6ff704459417dd5a31ba62fe127c745bee43f43602d210ed7f228f9398dc69a35fcd220fc2c452216e89ebde70b1255fccde4d2e360c52cde067fe56f4c19d3c2b89d245530ce21d22f997bf7b54d9b726dd519c1f84e6591e8c35283c79a3acdcae8586906866b59004f566fb4c3311216c3689a638f76bc50b1aac78e2756c32bcc8a71fc6d9cbf8de253dc389b41cd6b2e64cd71dc2649885e7b8814bfa5f9c0536fc0684cfb0f29d3733743c6eac4185195fd00f5a60756366f9f98d7e050ca20099689b079ea950f785a0f9ec5df47000f82d3a8663508f324d73319b6edc2ac2a1d4440efa40cc76cdf05ec4faf1551be69cff3401c9e3691486c25f05c157d00093303a4451c99c4c3a6587920999dce929ff4097881726bc1ab658e4df1336d3b85bc86ca0f9380ccc8be1387402df81144fe5148712f80f976cc30f0c312c01bbcec8501d732ad18a2f56588727a27b033c0eaca7ce15c60decc50c5aeff6dcd810918cbe9f426013287ac67d4106c0f09f6cc258d3c4a85ca07416bdce127a300dac997599bd56a139a14a4d11d8e2a8ffb8fb40689eb52df449c3c89992166069cd580ea4166b1c6535795396185339c4965211485d12c2ab207e8594c3ca1cf66f08811e2ab77f7411d4a495cc33adb639c4543e48addaa5164a67e5b9908fc8ee7c22549ace7216cba1ea1435010d656dd14f9f388dd02a0816a88784d795b90ccb2c322f6bc48f0670f8695688376a4bac2f3b82b06c973a4a25cc0412ce9f4e62a6c356c920e3e444fe3b1083d0cee299efa3b0d0636fd183d9c81eac276d532bb10f9ea4a15a3fdee67ff52b0ba26688087ff19f00389aa5aadc2fb82bf8f876397cd2b2be2f24120c77f99a3939534c0897a708076acf29062271408b952bde78613e87d9ea0a20eaf8e8f04040226e13cabfcbe235f0c8f758ea53828628b2196730dc1e532cf12c875b6371558bb0490ad6a56d0d0137b34db6491ebf0c99a19515cb4f93f596636d0aaef0924f068f76162c5ebb1871dea9c50da1f276be011c32139edc5bc3ae3b56e9861f894274be3cc34392bd97a64f07efe2e3b25518c61c682ec40970a75d2027ea649a19c0f666a9d97cdd3bc44eec05f7cfc87fb16e9ab1f67f5c1ddab63978b769d405791645b565e350285c6a5541d747c5e469f7dd42b12d9e495889880d09e21740bc574d5267221bb2fbdef774c2a9d06e11074d221370da1c7561d7e3ee3c884be5620b99ce9c968f04ed726834108db649897b0968b02231c2ee138f0469b877f5e04e73ff415c84dc57578cc355367e0a07e4675865f6bb02fe14eca3c8fddad61b43abf114b12639bebaa770cbd53511f68f2e28c3b48f6d40f8a119691a6573c149a9fcf0a413b6a13b6b8b74a8e80b7af2033bf30822161fae4e250506b2a23f35b0a76586cfabf7bd94202f746bc90c5ba52571e9c5cd96d9a9cf411752d7da772b613042cbd5cdec1335d54a902c01d87fdb97632fa04a9b5d20ecd7ab81493a4fea5738a6a9f473fc8132741e60075e573621e892d9cb0a5d1888e45308a0a12b45655c3f7e335f412135ee622cd902e4ab752f6b584118a231ae7a7fc30c310c3f7df11f760feb076e229c3c94cbf8711507002bed6d35f606eae07674d5896f44766c9106d757f53854f1b8bf1e2510c10c239483ba6724b05142468696f234903d89dd72036969c5f389b067431abc0eb2aab92c2fbd33434e4931c4183abadd9aaee18542647905fefa1041b48fbb6a5e824359a8f1962396a426e968c0fccded0b9531c1e82c136d3589fe66f2f75d47d1860f973cf2532ed4cf6c282c081f7d1ef7c2023e22b822c85a5dad3f66603546ebb6168de2060991afa4023d7859035afb4d8b649cdc22167c677afaf8759c4b0beac747870009412314a966fc5146382dac6e93b4e70f8e2ce80f424c62051d0d71df33bd6967cfe134a33daf12f1586aec918582b41ab6a471db76b729cea861fdc09be29a1a658b4bfc03a2ba29138528e94c556787d67c9fd2937df0221ed6e234e36811d7691cfdb44c20db8fcaa5ce1a251662566ba5c4503522496e54592e8b00a71f39357bdbc25da3484e4aae72014cc20b262e4fa83795ece94f9930ed329ae5a0b202459c3f9fe559edac34255f8fbbf378e2f70edf103b8e9608d0f77aa71a86a0adab68589f00c2fda64c9dcd5a6e93a51cb357d9d892ff494daa8f5e7d667659da11c66d7cdb35e5205672b3ea9d1a85d0f9d73453f3ec648bbe739726859fe089052e04515ba3097f4a79b70ce08000a51e73dd751d3d54c85ae50b733c59d8cb3082eb84096da6211aa0ea5496c7144326343ab35208af7ac619bb52e724b4e57cbf089c82c64e84bdd4fbd6e981fcd13cd8a338390fa59230d734d6893ea42d8857eb446609ccdac1552de906da4e2d1c08e2086c9728d648ea899a52ed9b55ddbb63b92ebd66215a20e75afe03c96f5e635814834466378d5c955865bf5f42debbe9726766260ecd978c15ee8860b108d234d86e3f4b706d3630b875979074630e6a6d822e859009b8135cf15696807cbf279c7e92628eb61fdf7d8fe483a839bedaf85f67d6f2d377672a23c4323b00e09620f73503903d6e41945044f95803283c26a41bb67a25977d67cde86383446ccf1b777622d3961797016aa0a1f95371ef30d9353c06266008fe7e933b87a0cac92cf8024b4637419abe1f868d2856e5673db4f55f5aee6626781e45ed344b5254b42c464b838b921caae067ba2f27c64aa576c8b59b75eabc651b6020a831a68f84319fe14801fca106f48ae538a59f9daf6c8a959e1002657be47fccb022e5628dd2995925076b86ed1588232d729c72c94669153c5887c2f257f546ae1cee91f13caa894304d603b51e0c7561676a21ac95e0e93981704139b56bca0192e09847dd77290bc7d26ac345fd0c6fa31f85ad8140e39232d0858630c47a453bcea2f748c474c8f7986030be89503917871c8ac04b5aaa40fc28843d046d46f49f160f5f929c1735f76b185c3f1ef85b0c11535241cbb8a495f2227ffe2b0751a81664e38fca05c7c5ead503d420e6ad1c464e650d079dbba45bdb108ee5499b80574444d5e787e274dc434ed071946124f6508b624706784d3c2abbd0870492aeab23e90c07cb7190ad075d54abeee69b473685e8c2199c99277e48e550545b2748984ecb2be571ffbf3ff230941de53b21ba202c5abaefa0b27e8d576aec9082728cb4233b335419ef49dbe57f83886141cf25515c42b383417133502b2321b892b058a2b20d81fc5fa54df0bacd7442ee275a6336d0f2dab66b9c6f1028d3c60ff686d5e781ab598d20ce2f8bf214640fe76cf952500d8b380d6b6109e36b55594b77b4b035b5ca0387382bb46e608223d4ff8c0fbfb6e0b4c479c4b60500b8673db0dfb264996e82011705d18c9485276b3e06c5eb2b95594e9aa0c35f3ca63e6024f0a1df65f570cbeedfa856322f3099981b09ff72670f56dd95aeff5864d6b1d59e15167b81e25aee8e2060ecbc76f7e6e1163f7c062e9f7e4f2f4b7a3786104b605674c85100c078b876abbfd76a66e5692e5edc58b6d045976ef53e8293db0b3e829f6b30488317956b2152876856e528077211d9ebdd524fd0471382ace440278e0642fb62ab9cd81ca8e5b5bc861d554e9465abdb770b984aa20b7997c355babc8af0800ce153b243f8721c937c6e4b163c816435bb3ab66dd17856896e89f60c23ec69480da8925bd37bdfad5fbb655520c3fbb670946ee5cf0e218547d84ced70ee44a3007888492de88a03a6ad7420917fbee41ef6470edbb96128538391c6a1b7dd4042c9fb3249d2302a88e40bf4d0cd22e04d65944170304ac2a7e948adf6943d541de35fd1a2506ce3b9fdd0c668c64b5011335ba51c4662d945f1422e00099a09a7265b218722d83c3b39ba0869a29ea8cf2e5e9f036469263298fd1e1dee035ac41846006e2a40981cc0dd91ad785dce6088946ef1c6a1bc12ac04cc779e8c6efcc3c4cab7c3389265766fe74663ec2b371bfa585739db1f68ddb131de422974a5136148bd42c2223d69c8a61650d0d69e2b868c4d8bd37bf700730d7289e6630371f82c4aba7669c9d947210af7e86869eb65a927475e47239417f44dc73510a3f05815d6197f722ef086086bd1a77e458fdd8cbf5aeaa1a7ba54ce149e83968dbd6f935e09e6b528c010cf72ecd1dd4ea70f20ab969a207aacc95f3c25cba166d3442d44f219ad1c29e0f7295c053c203354b24787b51c97d5691e6c624d3dcd260a8ae075fff625f4f059c9d05d8001aaf490d674808d9c3e98a9d707ddd80f8bc619847092b9034b815a08ecb2f80b05ccade487ff00fda5d8b3255dc55e8536a5f56f22433aac68a970890046d8ad2444f9987103a2aa9bee1de9ab4d70b418b84d37c19c618d15d821229b334221791920fb539bf844a1ab87e179b6f1a4c2682e9d15a5060091f0fa10e3c5f9db353e350c67a703824e88ca4c8e616390f6cc5cda8dd425b47268ea34867f62cc3a621351f3732b26e04fbb5269b567f11c176c50a65d191fec1b445c789cbbed5d35d04c2d2eb214d13a72ab376d5dbc5bd23655f56946281429e624499bfe295d95e419259bada0325fa7982052d828ae3e6b830622821d6d3407fe1932a6b17d8fb11c32f368bdf1ed0bdfc0140716ee8bce441480dfb059cbbaae1d03245b4d11db75f401d65a4d95930c4c40797ca7620bad1a8639dc4c3fa880a62b4f467e3f77024d7b33dc99077c81094272a4a1f3c7f7ae7919da9c1b12270f017dc658dc305b21072741f0b831fac2fb15d27342dc27a93ee44d72594b9d5e26f87bedd62f4570098344740364944cab18555a33f18ba739c031bcdbc680ea17d9460e4982a5d6c098a7fd165dee77427a30c3c70ca97687048a483d0b9c56cbc1414203adc52fdc86baf260d4d4a3ff800baa0aa548f3e178616c04fbdd04269aee9a27c3a1e6ee78b998cf9c966ac60f209265319aae74a4276c0708ac3319501a1ae24a1c62341c707f147155f5e3d83d845266624c95e40ba4d5d3cb0d52cd00834a47cfd3dd0c56e7a6a9216402af4728bda76a14e96c6b59c10a8c45419ce8fdb9170ead6d91112a92819d258feefb083f3ef08d315c8447ff3f33c4ce6edc5ab84a5c074cf7210ea0bbe7076dd0180197f6cb15486baca3863951db8f45adc85d081a6fe86ff1c52cbea0576472dd8fe80ab50261861681fa25504691a148d7e87a8c6a96198e26d864137cc919d8a7d0cf3600f224bd5ec0e98ad21d3b110901ce1385b36e6ac842e128f3e5248dcff3834fe6d0013471afecd9bc342a42ae535104950fc2dcc000437fd4c74e2a87f88eb10899dac2121141ea5d695b53b07f21b1ebb2a9a08fa85452703fd77dce9744d8397b1112101b2e35d9e577209fbe390c47322646d331d167d3aabf750f9d80ea1f19d6f713c9eab356da0ec4544492f72830b44e75f4d67d873e0df8144e94071bb6889417a205398cb16f15b157924f8637813390f6b855434ed50e12d855d3383b529d0340c543c817ba638a43d23ee5d95b1acf4110be79169461ec8b1a06c38e3b02db5916f0cba888c1ad7965b3ddf0f6b71098f603c9213e110f5d2211fcfc322db32398ac4561d575c770b800570523df4311771107c9348a0bb28bdecc5d16abaafca7e9d03324df9f64e9fa3dbbb2b6d8106672e78b896ff0318295e682cffd87f8183ff48db05882c14ec4a11298a64568588cb2104a83e9d625ac727f6133725d6c892627aec543b3ebbfe55eb54f56904821fd410987304956191d852a7d0af2074d0a7b57c75b3e8c547acd69214a86a1ff36660e408758ad24105b7ffd62bed5cbe987a460317efd2034c80186e0f503adb8184e1642d33f1eedaa6a027d0a5e9a26756d271250c40ccbae2dc91452cdd9ab17b9ef899709dddc1586ee79b1f9e6acace0a312fb147bdb85a19ecac32775f5e8bc180f24194c956e43a03d9c946598dd16cd551e82717bc58bd337f61d9f96a90d1476bff8d693b630de1cdec14afb595e73e9619cf9ea0d54fa7517bd402c45d3226bbec4994049d9bbd3f38191745fefc00a012ff53c74158cc42dddb0168d044b6864c962fc7b720d75d254f097ac392a94b2be148cfeb9a9c799cb2fc5ea8cb0d1f0df14d698deff1cf086d51f6ff627a68fed779a5ba3d8e018f9c513fa06071e3fc26fa037bfc92d109d6b0046f77b690fd479eb78248f2703a8f0b9e44cb52095dc01cbc59df30152e8d8bd22f5c7c12027c8fea34ee877a85346c684c41320ccff1457a53eceed7bf7e64c7097547f85eaa522c8314e9c8b5f549142b81f56278680106fb4704acc02d59514403f9f069eb361e02af4de43a70fa36f7c78b8a446c82f7cf7300ea476fbc13ddcd790585d9c91af0e38d2f2f993ca17c9dfad480ca0c0715aad3a2f0160eaf42824a1928e9c19b33999b1437144bcd44c54ba5705928c5e7272afd7f636ec309681c2f697c1d939c933a7dfe0df33fac0c36c838c943f997ae402b309f06403cb4fcdd8cdeffdf3be74d78bbffc3529b1c1cca4ed8acf0646723de3b50e0132f8607075e4373cb4444647ffde7b24f51ff244027064ca07053f613c8efa10bf959d1b4de505b08b2c9970fa2df4cb2c6321fe69021414392c384f67469f932160b4e6487c317971fce42cd7ce2856187474a9198157f5222a8e3433a0a3a32063153f837eb9cb380edcd9254a3f5ff9f3b0662e95caf3076664043440ea7964dcad7c2a0db3f0d8b0b6a808f1b01f8c1994b0b5f2ef5d318ceab9f63693eef8b290ca7f7ef29d458549cca0241fc607b7524a9ecad51620d9d025bc85ace9ceac257056253bfd46626d4d07c38c8fda41a7a396e8e472a933c04d3f9bf10ef0536769c4cc8f16210ebf6ab573e589ded721a3792ed871f132950082464bf3018fb2e207a752fb7f270487508e4259cc5ca7f193c32a28d45fb69aab962fd4bec61ea3557eab3ebb47704efc3512b1d8cfb27793ec15bc5103eaca5e8957309e11a7035d0e7e686333db48c541f872f5cd42ce78a6657406a371d21bcdc698893d63e0b10fa21daeb5017a7dcfed9efb67e4deb51516a8cf9f74d6d9b3ba63c08a2c941bbe03de3dac1b2d697b77db724b29534a294e0899087e08eb3d6ba49f1215d205718912686a7351b72e03d1aa55ab70b700c53c3ec33df4bb533e0299a7671808de1efa4b90875bb5bb7e3de3fc84daee5cf3a2f8c6b9098b827dea6f29d48e14f6703752704e53ce5b65a1088a5bd4feeb9abdf00ef7e0811ad97f1de01be73acea23dff4bdb2c7abb713d7cbed9e11b6efe4635dea9db318831c6e745f54c8ced826da27a46996767f4703de3a8cd386e833e984fb78331e6e1a9fe578ef67278153e535e790679dd41df12b5438c25215b94efdaa853fd972852a48e442229648ed4d18764b2a8a30ffd1435756a33f668aaea3206ae16ea22926c3796ae0237da692fa7940327da8985e8178b6c0d08d1684444630ea8079c0b0fae8ea43d500f3817d1f3e01a7a51e73d8ea43d100fb8efab735d49a8e32a2a03276a2b70dfb7420f6b887e4ad408457ba159a4bd100d3dd79ed30f666e2c215acae1220f8dacf69c772e9ead2112755c2f2cfc8b108d4622d1c56a95d1fb834622d148b4001d2ef45f64556fd5ad21fa197338d28b3e226995d0fbc79ead31eab8c624a1e7debf0811d7c9cf58a335b65a857bff6dbb11fad1675ce7c918d16fcfe588d4c523edf9873a0e701dd105b427eab6d2b8dad06bb1335a3ba30adce7b135c58fba35f4d9a635d44abaaf2bf7f188fb96742fe2aa55a06815d2fbc71b47c178ff98d32a8b619f17ef7ffd80137d6c6d8dae7e72522a71fd632fd6b5d32aa2d167a26e6b49077178de4a70a039bc2afa4cd471351b69a1d80a95deaba1df46c5d067cedcee250f6b09fd94a8a417755c6174cee327cffc5f74fde385f642f4a14ee4456ac8756ae8575ad47dceaa213e5243216e55d18f8eb4c7ccaafca1eee396882937da8d459479edf9e720aaa1d487d5d08752a1bf3696de42b1e5a8fe21558eda94ff9823fa95987e2f8aad21ae4aa2bed39e3fc8089ce849efad5629f97c72eaf6da4eff70d4c5f293d7121a5b170b04fa116555ff9e0227a22ea1173d897ea11ffd175b37422ffa2cd42580ebee8c514824eae08fba5127ea42a1efef2d01906e7ba19f2bde6d0d752cb3db01b7ee2bd1baafa47edeed801f6f7db148f59ffda3fa5fb1b523d6f8285b63abff02fc4b57aba46120f162ab5cedb0087e493f5d7fec7823c2e4134ba5e636c245659861c1892c4a5851a0df94a931d5baf8fd89d4147f52eda3a5544f09c2460b12393ad063c6899a276e8aac405d8f2119f6e1cf37fd6895bf1581d25ec9d66de58de3e1bee7760cc11b8b26b3ef8d0825aafc7c46bfaef23f1445624106aed704d81917d5c15e7bdedece11045f763fa4ec0cd902ee513c6e6140b0821584ec0733d8699a8cfb12b5af2feb6236163f01f7e01fe336c410f0fd23dc7c03436c857488ad4ed708ccfc990cdc1b18216c085b6699d270d46c5a6a0fa509eea341c39bb2c625ebbe3a5538d1c2dcc75ed77f2bc517448df4fbc1872bc507f7313b1a57f78316042703ee5b1d1c3e2744c11f2a842bc50f0b7df08e6bf9200a3a51a0a93a505481486d56bc3eeec7472a3ffc6dd6a9fc9fb61052edd2606b9a4cabc0ab5b768269da6b7eef180813dcc73995ffe39acacf39ce36cc36959f6b5a4508136995928713c298466dca35dfcd4bed352b3211850e84ecaea8eee650f77951bbfcb051f3e1764d9685a4163838383838383838383838383838383838383838383838383838383838383838520ba9050e0e0e0e0e0e0e0e0e0e0e0e0e0e0e4e5cb8bd4bbfdddd081b854b0c9fe194a5a6eecdcc2bd9b7f0cf64ddf76a6b5eaa9bdaf7b606739e756f476cfc8f57d53f5655874522ec7677d8edce6822bd86aceba27c1c171cbf032e23b09f4a60ef28252eac33b54c8c5e9da9453ef6f231babe7e6aba7ea2d34fcc71330ab21d9aaac65f944fead4ae90074cc3345c33a7974affd0e916813d62fdf4b026883ef57f13fec7fd7e5e0da2519fbfe827237b493f94fad1f8483f93fad1a8dddf744d32ba7efa503e5446fd368bda9fe918c1291184bae8a28b2e86e0bae388483f8f7e25a83a02daf8a9ff87a9657bd083e80bdca8f7f8a91f2605933a628f581c9dd64d3fada34c2dda671a5d530be8359894a3b2873f1da5bd465fb407d1de5a409fd197ec4174fd04e18f98daffde538de0d4e7777300a736eaf96957fcb4af75a696391f269575a616ec3fffa12f9fc71e26957db21ea9aafd5fa48935b5618e9fdef3d3ee7b8fa33cc74ffd73725ca9f45f533fa6c97114e45ca794e339abda9f93e3a84de970ac1c58e3a72470df862a788ff7d47e5884e3cf78971de4a61bf2f9a9692b4c752570cfd5bde1228afa713175a3b80192fe880de1fa46a5aa6d85ce0f54524736080c4cd881144ca831022f1c708e62157b1584c000d4bda902096a56f7860a34defc06f8d07719bbe17677392774b233f661ead6dd00b0838949871c4a30707851421a89b81068d3b20f362f19a1f7c63b2388ff4a3bdd2518a6bb77dcdd5bfaedc77df85f8cfb71df25ba3b6c6f9144216410d3de56b8104208217c28639491210f94524a39a780f3e3f7bffc2f46fed8007e97e849b8667fb92af13fe6fed91e8f2e38bf3f8490e91e01f20c4f8edbfea35121012a3c55d8553873d81ad7af0461450915818d7e27f52b952a76d11c3bc31f0ee1f8bf5d41086119aa7f9430880a79069ac1a77429c824196f2cd90ec131468e4cb7e9742cf46751db8a80111ac13f4884bf8c31ba40c88cc306979cd6e1cc714ebe628c120b6845c78e31c2967072bdbc735e61a093eb929ffc4b9c0a8e17ce667e8394394a553edc28a50c026509062172259123f3c8b629a763638cf4e3016b8c61e0627cd82a33fe56086384d1b1e0384618210f48040260851506d92e71bd6c820d68aafcc8913fca182347c9cc45ae55e417ffe746c4f5f2afed46fcf8d9fc6b639972b64ba41cec31702525178e8910aaa3eb005202d7dfce3f32970f3bc91d476666cac5527b015c897bae0a59ae37759fe94f9ee93fabf2f05f335064710ff74416f744968e0e7cee813a702646057f88afec5004dce3285802a88235e81918838e812b68150c41cb99f8854541158c8958c099a805fc1193481f9f8ca95206fe0755a556f94ebed45ed4e80905dd80539d745c6746241d9d93139d93939393131daa7385134affa4eb48318b56ab4024279d43d15e7cdaf94d7b913ed33fe95cbaff52c9cd1654a492af0bc07f39c410c07f58e5ff62dd872a4709803aab540a00a78a415940f811ee21fed7d5d743796739eada130acac71e94ffbc15aa28287e6488af3c781bd68bdfc5fa1106827b62d0b382569780a74636ec8cf89f77a14620900804c1a2b8c74ff155268861418d3dc3447da2a2f0f01f14c2c3a3fcc73d25d90ba8822ad843bb2800fe8bacab54d2d17f3772f96895eee35f3f1c15e3617c64b5caf590c775fe29fd66fc189d43d1a7f8289de7b4179f87ce8b8c34ce59a512df7196a3982723c59dc85335fab052fa29514fbace6dda2bc9c4b417ffeaba477bb1e7e937e3635b02ae7a425d8af62254b5caf591e5a7f8a33ff96fd651c993de59f1847e339a3c00ba8b46d69bfc1759911559b2878c6915938f2f6572c8e17773803d600c2bfee4fc23cb8442557b11f41f54452c78302cb25ae5f3f1e34ee4c1e69b4c3bb8c43d353e8ceed370e8bed28b6ec755bfdf01bf92fa4556c908aa6afce717518e46e6405c09d6c10e5e37df433c71248b233b75572b1e0664dc5ac86876ee822bd5d92a5df9485dfed9947d55f76db4e7ee0e27079de0b25dd8eca00fa6c29db1ddee1ebba875d1a196c4e6284529af6b72185fa00fa66aeb1036471016846c1b5e4b136938128934912656011d0891d5138d8a33445a059b44be920824d2c41f0ea455aeda11489ffa85b0301a69dca6bda6f127224da4893491c689449acf89d4c41dd4fe0824d2449a0824d6c04b755191b519382c0b3a513461849750858c031c3fe45028f870df247f7bc4cc54cc4c5df3b18e0434525734498ae3faad2d5c6a4a497584765eddfaa9fb6243234c8142f1fe7e26bb9899921fbb9656a596a8cb0158e39b6e304d8db0854bc92f46aa2354210d2261585565b77e6230648b02e533e5655e5e66e9ebeeeeecdcf92fb6fbcc7fed80bb7ebb1cdc5327849a067874e0a555f8f759d5a8cf2fc7a34fcd030e2ed6f1981a00c269edb5e61838d6e163d58b06ba0eb4c7a3bdfe2170dccf8a42c8fce1e5ee94e17fee8bb205b7ef5370fbecf4c2a458972b07e4144e0e16077f73944008739454a6820b443c0341e2e7d89d1a64df0b33756fba30c3aa7be3051a964a54fbab70a20a2295b708b0045a955aaa827f0477918a5405a9e9084ec1e714a42f438cd894124bec4e0a3e3fe42318c74ee534648bf2b1f8af5397dd72c07d1ca795b84b1f7f26d09b3782ba9320a3ee0d153495e3a1a20602a87b83859eaad5bdc1c211362401814020100804e222c48946516b4ffb51c7b5a7c1f6b4adfb600d51d0a68d52703df37ffae3e789b894c8186587e4c1d533d8f967dd29fd2b3e272c9538aee3dc19f1611bb8ebb96a17d81a577f3c2995386eb14f69154e143fe33aadbded451dd7de06dbdb403f5bee0cf61d5c43f3c3ea46354d66177f5f2eadc3f51f733fc7bf3a18791d24bf99170cdc87bb4f73738380dba1af6c0daf7e61179cd8bcba739951c32636e763df0f27b6c240708d715e135e1f4c951b8bb8801042082184d07b4f060d94a9793945a8a802e503b17274562c9e558ea34aa59c524e29a7946352fa41064aa934a71199d50ae302ebd1e19242a984f5f0e41c59b172b01e276e3e3b31427432243fa0d0583d6a8ab4403eb6463b81fb4a2b1b1b1b1b1bac27a6e6e4ac725639ab9c55cecac65170b5b259d9ac6c5636475648b2d859ad38ae84f5e4e4144192a3c33505eec3726a633dadf2816cbe124fceea082ba71404123d6a8a70cb874d1f5101c9f12c66b6c6135ba357abd56ab5c2b8c0daa0c292603d46b09ed5ea488f558ca34a2b47613da59a124de9476906eb59613d2bac6785f5acb09e9549e987124ae917ebc17a5a05088885c310d82accd06f6ab3da6d5871b1e046e0d859bed32866b9b3b4fa392b67ea306bb29156b9a691234ea74e4f81634aa14e9411ce30645b002e7e314697f81046f992bac478c52bc6ef08b93bf237851fb963d9e908d56d67f0c7eeeb4c44f4c78fd445f2c5cc33bafba48bec973c5dc0eddc1a5da18cd2635f4296351e3da91b9148bfd223128934129148a2d188442291482412e947221824926844229148a4116934228d48224d6e43447f128944223dac24128944229144a4d1c8bf089168341a8948a39168441a9146a46efea8e447249188f42fdebf08d28b1722d10bd28b3e7b2112bd10959044a4118944fa4c23914824d2f3c642720d76a40f755fd7d0c7553cd22aa3ae149ffb95ce5c0b75301e76dcef46fa952e29897018bd8031eab6be80f1bcbd8031fa6c242291482212694422bd78585f94fca8e35ac281241a71c9e84b5e885ed0d86acf5f34a22ea41ba41f91442311fd340a5f348c28b2a5c013fb50ae5c29a174d010286b6c0d7781af2354e5c3ab0877d711413be078d5def276471b645b006e09d047286afcad487d568deb977e5bdc7efbec8a40c5bebb1dcd83ebf55176d767f2bf87533e6c807c173857e2d680ae4afa8ed5f8a14ffc39e7dcf75fe919a1ae737835d4a1ecb3d7fe03815a5cf6a0df770165204f0241f46208066edbb6997f6b788d32db87de20e0b86b2130454eb5a95bb76241480476358123ed8180705370f1bfaf2bad626a7f216cb4ca57ffa5c01358c69acc36cbb4ee6a60ff356c71bf33ae5ff1fe6c0900fd7cb8fd4a4b1770fb8f021bb42d00a67280ebe7b36b6783a6a675fd59f735f4791e0cfaeb65e702d211aad783ba8f8b883fe7c72efefc95c636aa83eb473352f9e3c74816cfed547f9446716a87eabfd22a7b6324a7fa0bd1284e456d65eb8f5d7c9456f9b09f2ed8c777195b03beff8cad71bd8ef9986f455c1f5f0a134851e35fd7ef76e3faf891035c25d566ab70e418ab93031f82a68d344ee36088540843448b2f1a7d5ed4b9681a0c91fe855c890ee94730fdd424bafe05aeffcbb13a0fe371f8fe92a35e7c7fa983d1e1d0715d0986c8c2c9414dc2885a63225b1f387fe9c292414ae0e67317f5bb1efbde583049bf79511d2efe37e47f9206f92c3104fe9018638c1f9d0619fc8ccb3e22c84151966dd9cb6cdbb29759c69ffe64d9e7977b17ecf3f97c324dd334ee3faf71bf35c451f89fcfe3d074b87cbe204b0c19a2fde7b74c4ab9659c652c7f2be84b9f6d12d45ba6759f4eeb4abaf89f0c7e3e9f4f0761a761b40408376b4a752e078e8398ea32ee3d73a99c0b9c94d84a9a8163a4d4643e6f901d6897d1a5e72855ffeb356f7f67f1470256f9beb2e14154bff921c5f3289f255649a5945f8ed2b5cd746735d886fbb2fb60490a285ba375002d815b9dfac110a95f8ed52989403ebf366117e937bdfb3ea0aaae510a9b7366c000e4a34148bf4faba0ff3c146d0dc8eab6b17c40bfd21fd08bba0faef40d8d7e5cb56f3ef7b0fb809e631808d183b0d06fbfd14c147f6e447ceab6fdf51908746d2c20102ded87b6078168fc70ddbacfaff8a77d3696c9cccf32e058867e30bc45186249452602f9d7aebca494bfbb527a53adbd8dcd5b64fc3ab414b87eed7b319620da73c710f6c6223f9fcf0fb1f5434dd9bb50501238d38dcfc7ffd0cdde1fa672f76995eb7e13a6ce2e87562fee5c83a7fe74533179ce79c19d9d13c49c6067e30ddc0a5c333333bba7f8c0d07d3033337312df0861844eab9889b33df8d2af60f2f1888e611f186cb7f5817b887fd1e51e30acfb52aa8c3146895d7c75f3bf59d23847a9907a6c4106179ba9ad75b74ccff44ced9b9e29833639194da66a50683262c85aa67e3cae122c719bcc36b3a9609bd966ea76b3cd6c335b6450ab3452e013363644b0b12143361b353f2efee9835968b6caf28ecc22dba9d14405db3123b55ff64308a574e952f63b738d73b74708fd61e7105bd54f4cdd58206cd861abf6a0435e07b9bc22c7ee602bcc084605b6c2562dc8e0166414dcfe5e2234d0e8d0b0610544b8020b76c10b2c19c86031515243136728430f5c108426582ce041cfb44caba0677a2687262373829813c8c87cb0f20521dbc0f6e7ae9f68feae8bbbecd0bb79b7ce44f9104e18618c127e77feb03f76bf7c9be59f5a6b321f0c73c32766fc636d23c4f7241c6f163932775f4af539b15d9b3977e7daec730ff3630717ee43b6d98d0b532faeeb4960186ea290df9d9451ca1d1965f34e6d1ff192dd52ee5c97bce4755d72e792573c4194513aefb4e7b25b76618706394a4eb063042378081c04d1db796369f7d6fc8a31f2d67defa2e97ab6a9cc53573a934f5cde1bbbbbfb252fe9d23bf9170da7fe59dc58fcbb9b6de215635f9208dc437675f00b35ac266ad6dac55573bf2264faedede409031d1a1e7099083649e0becd69820e77c17d5e85bfd56b95eeea55196dc21aaae4a7fe7e03f7791f0c4f460a8cadb113ba5fa113052aa88a2089eea3ba14b10335ca182384d007f711dd4784910cb9e86ad25e3f770db8cfe4f9bf1c28fd2926ad52e2c346d8452470dfae98f610b8efab1018e3c3d40cfb64da56ca3ebb71d864100cc218e0cbe7e646843ffc6b23e2033556e8120ac218384e32b6dd88917e710ba5e5d8e68a5d0fbeb8bbcd15d06152601559733bdc352995607309c7dd809a6bde9e5d1a5c943e350bd3df01077f2ef4de5dc640bb3360904b67070060add9aaf153ac297dcb145b262828b185d20d31892d13131313cca4634bfee8eeee1a21518b456920269120902630e95a038eea2eb57aba914015eca19adcd6581393ff221726b165f29f94e1e1a316ddc796345f4c02824f9a4002913f6a944ef0606262d299989898c49ed88a487a0ba85a9dd832e18107ca6a95c6315b263b00e07118f18055b9504a6294cc9292bfe48c8162f2c138aed4ea1a24ad72d5d67c93ee3379f959067b683006aaa04ac6c819f923722165a40fa9923d6cd8d84e2e095597cac64c88135114cacd171fb96895095b97e4e16d0891713d624c4e442d64d444baa66b3a0bcee4e473781d503168604dab649b13354220706645d9e8645e73ceffff626bce496d0821290f7127ee0d90abc651281fbf3591f4742f3f46e73d2193931b1b42b490ae7154fff8d1351c921e93f64e78785879a09f12f5a29df3b497459f60fcb72d286cda7ba27f38aa6bbafe715147d23532b2a28c3bfc772b26d3a4b1b5c39f7c6cf9f8d12a3b38512a957eb7f4b03369ef8496008043a7b5430eaf4392adc7c4a4db6aeab6ea9043a7d5b45a1729fee883434747077533e79c73ce4be7a44f2468245a6869a147165a528b9b1a3fcb46accb515ffac862287560edaa8cfe6bd37fb2eea72ea8eea82e0e3ad47d66aedbe32801c4f8d297f0935e001def49b43b833fa91a8261e2c6523232d1f8b147aa648f8c7bae8b7b988beb61c73d57c997947c2c3d736445d6d6e01a9394c4e87a0c89f159a91b7db6a693d569a711c4deac149bb345fc8794f6302c0884dee7c3c305997afde8334d8b3107ee5cb308d48146e00a1e81ac9923c5cdb6c1eb1a5d3f8297d49887c73bc2451dbde9e5e57263b946ddaee984762418a3db35c0177d54d80509c0c7e8623e1580cfa416dcb737cc2bcc1754197dfc68c5aa98fee4bf8805fd2f96a1fb2f6a41fa2faaa1c698a4a4a45252faf82393aaf29fd0188f14672a7f00ba8b724b4bbec474db63109f3c07601dbd8e501d99fedb8b3f7a13e500d713fac1bfa88cf6bc1145692f6a5a4403976d1a43b86d2c90e1c30af969f771a5f0daee773bae76bfdb3decb8f6e2d42e11007e6fb8e0c4c73dcefa98e79b25aed32a74a569b715005d497bff1df3704f89d6702a91d7bbded4c1f5f84fbab91e3fedb4f5f8bb8e5b8f9fd495acc71fa32b495ef93e6a0c1243d50d55500555188641132ac2933779de5876f867204e3e3edd1afcf1795815fa71d6175c7d51aa2f7ef7c5d3936eb707f85717802e46074f3a10124c1de402b7930b42304164a567caa78012ca20c0f777223e005d52580df137d2b79938d121dc485d9a0a1cbff7ee429a837bd4c06708d2bbddbbbb1d6c0f42da4050be097fbbee3b0f030169b4611fc3d6601a8fb033fcbd08e7a9a952e5dcd060c5c420e1ef282ca667b0ae91887114b79ce5ac5289e3660df771ab5b8ec21ee6744fa7b016ccf93cac933d7ef2bf5a8eba54df5fadeb6ae9f0459bea525c578d17e1a20d037169b13df8fbc7236c8d2b0d3bc3df5b3be30c9cec71947b89f9a3eca90ea93fb77c9950bfaf49c24fdca9c99a4f704ffc3ee6854c3d89b39b6ec0aaaacc5aabec8043034f850f51c0f57f5fdae8eeb03339a0fd254dc24fcc3da9e69e3a13e5bce4e7023dc698853967838260d85c438cf4ba8848c018a2112f82f2f94d128eba58fca3f26bc051dcf694549579a632dd229c8908ea02dbdb9b56f13f5277c0ba03caeab46bb43027c73f6affd5752a935a128ef214ffe8a7a1a9a92152bbdda67667b2658382ccd4a42f4ba42eea337eeaa951004c7529fd26de60593d76c650bf4f523f1958d48fc6156ea8f55b2978eab73a3c24a8dfaeaa17c006333c4d38210a417090f22bae40c3b55d5491831d2ce10636986295f24f71d40198800522ac1854710234a4fc6d380a035ac0420a6f48c285234a48f9b2bcba375744e10a9b19c44b07c9dd94827b17f89221847ec50e42b83b6085bde3402022447b372c242a30e3440e1d2e92701f11a8693972fdfcfd6e729e05676301add23488f63c8fc60f8f42840dcdc58f36703426b03fb6c6d69beeee1b1a2b6ea3bdb99a70065e819bb9bd3b8661b80e23f4aacd6cc1bbfb2bb73663c58523d2f5121a2364fcdd9f57bb467e538cb0bbbbbbbbbbfb23e4feeeefee8d8577066f3788e9a2b41744fe3b4a528e4d7e6aac0422a8960e7286b8f5ba2e79c98e736a4840798e2b95febddd1b1b2b7e7226384f46ab343569cf4be00c14c29cb01d093b9891e1a13893fef5187edc97cc5f0ed8cd3599fff0ae83a38555ad22338108788fea70e587105e04879ffc71f480d368e84cc782fb68300d723595d19ea32e5af28a5242c3868c48ddcfba8705b4b7fd485460773fc7ee27b1acaacb3eea368e56d99a96dd2375998820d7af38eaa2291d447bfb5346abbc1545a85fa96ea86e143760435deac244ae7632c8c80cb770a2eecd16327500756fd4e0853ab52d5a5be8d40c6ad716b518b3eb62c056783160ab8c733edc1a2ba194df3f3bfee49a3157d38daefd1cb0004cddbad20d907fdd8851635d148732d916375b0881f0e17ff167f4818b91b3abc37ea2d4ebf3b18b117f88f86909e0ffe05f0fb704347cf9572402a54a94ca907a113817fea6afb090e131c2d35a09a9020a4ea4cacf4c38b2354dfa6282ff9f7f99afbd119b2abd70fe30a94ff1d357f9da636fc4a630faa2a57c5ce8bf9498da94f6d2041f879fe40e233665437e466152ffd1a97252534bf6f333aaba3efb498764209a9a9a2430fff32dd86fdfbfd197214d5be67fe80ba7e6b737919a6ee0b8a809c7f5a696ec9f53beb1c0efcd019bca5e87671dc7f8493e2cc2394d95ff4ee32813fccc6b1cf579d01fb17d4695c89418d292fd067a25b6ff5053ffa63ebf2950974407b38eb70eb427b19fda87be7b64bf7d8fcf83de043ff43029add3b487af85e80b8832113fc9fffccb46d74f59d6d198e06b0f93aa31416a7240f69f6fc9fef33204d296cf6bf465a6caff5056f949fecbfa69539f0ef84932e576067cd1ce808fcdfd6f7b9c485d1e96c060b8b12e643b74701755d5cf57176f50d5ab0aeef3a69fb606a8c64f597114f632ce6f3a7538ed4d4e4d4e5f86b8a4dff2386dc990f0533f679d691fa463da076df62d9fcf7e3fcb1e445f52fc14ff65fdf4a131f3769476c67f3e5b3fb14633fae94c2dd97f3ea39f4eee97e6c7616b44a72e9ae2a79d30dd71c88c43f837fbac9f64cfd4f9d75758647ed699e4c3a4bac74d92e2e8d13c7e9a0f9352d5f91f1c709bfa7cc94ff387b4f4632dd87fe8cbf4d37cac69f3fca6e6836eb84d3535b560df8f7dffa64c927aedcddf5a43a83802126654aa548a9fe6e7b5410bf5e3eaa86e1438a041fd9aa77bfc349ba7ce38e367c8aecf3ab5af4dceb96d2cc551f3d371ead3615d3cc26d35e1e8d1cf2faa5c4df15fb4ff7ca42dd84be62c387af4f8bc466f6a0fec33bae2a7ebb1eed3a598e2670f937ab9fe434d919a1cf079ec5b3e8f7d7c8cbe0c89b405fb0ca39c9fae7fb9feda14c68263fae94ab910386e67c417ed8c38fd143fc270fb150c845499bc967d543effcdc7b2d969f3b5a9b1c6f49bda639af69af69fee83997163d11ac03f7fa5b1cfb40ed60cbbb0bfb05fe95ded319a5d0f7b63b976bb312bd09e34e1987e928fa33df95b9d08970445a23df9d10a5cffb7ac6d4517ec9752b7a555b4f5fab93df5afe7a8943df5afacdb58008e56991b3bb85edfd44f0395218454c74b6538866cc73e8f59f9a6c6e7ce44c4fef55dbdebca302c3bd1a8e9a7c8406a2cf929fe9c1c575a957655dad5ae56c6671a4731903ec54742c8e46689fb92f7295efd4a5f4afd4afca3c6ff68d4af5463c9bd141a3711f05374221cdb3091f6a215b8c837918acd22090b8ca40008415e502306213c21c60a16d44f136086b821890c7c9821045604b1220d3135caa4a21544b874a87bc363534b756fc2d0831e3b4c10c21590482c3026a0010d2128e121020f0d2aa9ee0d0f0a9ae005261c108434b05c5005153cc105613002c6bf25beffbed397214b5bfc217d81ffe20f2393390afbfd4c467bfe5eddd4dc54b62e2a69cf247f9b208323159a244d40139ad0a9f15784e0a2fa6be0a5517e7363c54ef594239efab84e7dcbaa3da04aa67ecbd36363a9542a556ac8de884148fd1689104d00e984f8014527c48f9bf6b6d268951f5a65c150fd0bf50ba27a132bcd29ac9b5d07b928e727f7d46e26ed39abbd9d81ed53641cffd7ef51a67df89be2b7e128d3529303e2cb3fc21f5225e0fb4baac49016f82e5f09ff484dfb9b8abfa919bb1aeeb7ba376f78426dfa7151e0a005157a77a7209b0f43249eeca8c48cd675492d19a211110000008315002028100a078422b1603c0f967e14800c8ba24e624c1688a3208751180431c618638c210001030c01326434330a002cdca3028ca454a5406ce9777760ab5ebedc30810a561a165ce384685c5fb13399262e87c91ca87e3c2c7df2f613344a82966d26bf6eebae4dfafbb736ad045abb960f1aa6197139419ab9999a0706bc0cdff94b70791574bbf614e759d1043f31885e58be9526becdcddce70d9aa767d1be9eb2fc3a1fb893db19b0cdcecc9ed6d38bfb1bf3eaa1f713d08693d69952dee28cd202efa4a9792c32b8e0b20bec960426c3d2a29fbfed7c59adb411e2a42e2c1ef3f1724b596d7fd3074623e739f4eff5da143e890c16d54f899b753c80036caa52e2a620dbc9349ea0223e7236ea603f5ff3185b737d5009410972a2bcd13b0215e4a4596c6acb628b23c3b10526c8644690190b2fe00b83f62d4a99d3d8c36e06b8bebfae572fae066eed786d3c27cd63ae68353bbc57e8aa8befb95d73d984aba37a6c31dc19ca94fb014704e6f774539cba653821427ea2d4ccc13ecafcc6f85e03c254c514612714499bf58b276e0d90a0e55c9db8329151af5b7c7b31959ed5f418c24daa8331ee2926abd20a43a424e87a65aeb1e13dd231d8d92489e1707723448007c2d2649d231f0cc16f84faa4bbf1a9c207b0ca50daf22a805527128685489e8709b9094f56e01b354514b6550f361c81d64b21fe2094bce6c83c7c4b21ee8726b909dc8d23c4281f191da64b04aeaee4b504ca5704b3fb5aeec214cae2d2e1bd1811942895ebcf9ec8a354fbf747efe81679abf85889c7200bb3505e636082aa8a6f773a1ff661c30c52b8db9dd9c9da991342db7a0eb2fb0ec9ae7ce96ef84cccf5ed65e51f15b2cccaa099ac801891e41520dc2dd65e7971aee3a40358607260dd8c0c8be7bf13e48743ead76c863d1d62cd3ce4c0064ddd31281874361ff48f880eda869fc439206ef314f578cd215620e9319ec85e84bd6c8e6d2437cc82f1702b16a1ae26a0dc4efcac66b66a475970412a7e144d5a7a632f7006bea8ee92611c19024634fc55214a1ebae2b21446fed34c9c908c2a23493150f675a73b31250af0a170e1225f4329a0f31bda78bf37fdd31bf5f475bfcae406970529f7c838c7692d9e16401f526627b5f6f84ab0c189aa3611d31fb0e61d4039171a0661cdd77489e31396f973b59f75f6e18699af11e573eb2d0d243d020d7c7b2256a3cbd94212429d96535018372bf65a1c423dde625de5e6f8d9ba483ef5f83b46a1ed9569e3f4112ccb3c56740e2cb388640027a44de504a34c8ca71786d47d6ab66450c669ba7952a2d503b18389704b90a51dee7b3cdea358f4d0597dc04f980be9389abaa4c5c7923c9e90770b918ace7df80020c5151caaa7d7add720a27f3647cb6ad9aa81bde715a49e2a85e80f146f364331f9818ea4e914fbc8d073d1bf2bbc11dcfb10f20f82438425cdfb07e4b7ea704967d1609ae7a63ae5df9ad1a0a6246f8c133b9d984016ef997d62b54841558889e9eacf87c1bc3bdc256045ca3288091363b3dd7b299ba3427bf1a21f3a7806724c2ebbd4206d40b7146d0463c11b481a1a629a8e968ca89a857ab055564c29160bd275623db0b72932c45c25c5eb0eb4b29800a97333d8b00061addd613a0a35b391973a3c2d27de2e72688cc260a4313e4c2f62293e5b6bdbf27dbffb960918c9d4248dbc234c108187c0c1c32e157ef6268ecf068f74493c0d7d30b1eec33b0a1448a75958b9765ed6ff156fdd8cd604ec06f2c00b6ec1f23cc7f2aef524c13ca3c9a69f9c0ed1a39137d91501163c703c99687dec070ae04fcc9f6df92a5f760a60a3754610afc559d094600b0b9027888e8067a98e8767a00d4a39726321d8f30482f7e5cf32a26cc3d0648e89a8ee7f30c4a5ef0355084ee724a1883611408d35daebd733a10b4a4ae21c47e5f8d1870e36968fa06cf128f674aaa3b3197991b38ffe840b5430e898d74170992b4bda4892288c4b2ccc10d10a411b56887e207d686902dfdfdcd0b84bf40fcf82df179d106cec0decb32f4816d2403b5848c6d99d1dca45ce35ecd505867e8ae9ac62d2ebfcdce70e9b4b9f3f8e631347759135a442eac3770056da4c2cb3a595a2ab81e8a44f6fbf5179c6fbe24d35dcb729c2714fd704caa8efab69c2a782d9a56287e7994b62fddf90b066ca4f81b722c493f9d2cf647ca0c9e364c601c7afe882bc3deb2b7841d51a62d12f8574a828038567fe2bd4e3c970d7804b270383960eed445a5191cce09c421612c685c3b2988803c368c795a2590d9c5541f4c3299ab5d5aa3123835c0117ee374121dca8cac9556eff0c77623abe68c9d5212e88eb252ba5f788568ca5f6658c53cf84820ea04ba88440ab841ca2d9e4a01ef1f8c4e305fd82ec6ad4c8dd4fe5ee938407eaf4943ec37a5d24eff552fdf65a1b7a072e3b8197e0935c8f14d8ba9d6ca077803e5d499ab0f39ff14174cd7a183d2da95092fc0cdd3e22b31870c3765340584dc5f0065a177cc75144b40591fc6fc0e0ea3de14b4c35e848df8d9cf9db41d7fbf3a4735117a554927f812a90ee6079cbdf49554825f9528160445dcd25e2abf5b1191bf0492785065ba2b6d25e8dd6dd060895f1ef536dbec55b7ab50585ea3f032ac4a0914608ba170a3d7715b33183a16c4f2985d40a7a911620fcad4a067d88b37a660d158f72aecf5d4f94619828af95b3ffde2d10ead3aa224ad5ee8f08613423e7fd6a7d7c0c3e232dffb7369f0ff24b7360b7279c8172c02a436e83c66443df3140e1095845f1e82740e388eaa851b7a8042fee8f46ce995119807b6adaa980b61753dc81f22b27f240153ed2b91a07bc14c32af15df46c034314b85685f3d18f86711a811074099f866a21ff40b496d36080a48cd38bf7146d9c2f1ab9381ca903e0c893052a13b21fd7e9adb2b09846472f992aba2ea28a017e060e64e4f9d4e006867ddd7303f1d93affddc03e441c77cc6165bb6ca0c1bf0f4e6730b96265178ae2a5c9a9921e8462fd6d54bf35108b8292b12a541216c4ac01aff24e6026fd8f8493be52acd4f46c81dfc0e914f1a76574b8180b41d667e6e68579859b9f23931b645430b1859fa10aa852e757729919132dd37ca9a108a8d5de92bda146e8d53c4f5d5e121b5e6a6a149b20c62027d8cd684ea0f185d4c6122bf9ecfc07df3d07c553997fe1485374f7e15e95a6f0f94f3307a287edc2365dd17ce187711f7894a41a1f2a9055e091a67231fd03c1861d8a8dee0507fd08c4dc6d9918572d7f251f9e4c44c173fbea547b96913c812b788a4d3d50048a5684ba7d0c50f423fa266a6de476a690665bc5fce28e3705d4ae35b387e6d18b614016188a355ba3d2f7fa3a42274810b6fc8938d0020b5b7e06435c4af2b65b63273f2692dc285f895d20c53e0ac1e568b07039a3ae5e1ef72079da3c9bc4b91ef7bb1c723736ae32e075fd7976282227b0e02e98c4363055e7a6c84db11af6ac7b741ba7387e0370ccf07bdadc347eb59d044e3d5d2215fd06969a29a4c39620270db8959f76e02f094fb7e0220d859b20aff12256fd549ead3288a68d5213470c1e9605f295d42b396a8eb6fecbebe16b6e79ed408d90530330fd526e422777196c4e4c739697a33bdd0afa088de108679ef90172baa65c7339d2bf6d7d9e4afdd14669942bb865018946b15c806f20f0028367a8662000e7dc22f1729167a68626a183027c939e7f355bb45a3435c11f8796aaabb59782c29c530b89a4037d2530b8416789fedec275612cd244b2a36c4b8f2efc02f61fab14c68123452c4fb5b208ad3875f34a2a7cc3ecc24987a8ecd30737a3af5fa387d1a91ef5198c68f7848736d30c2901fadd421ec7035ebe8866c8747a32ad2d696540d0926b7ad1bb7ee4580edc4c55d13e9bf9221a04192a8d6cada10db17d9eea029ca8d5ca57c058b926a9a5ff77f9778025785889ace213b75effcef162c0596f11db8f9e8bf71c2e1856c17d927f288ec8234767a937d66e0093e6f19028c21788396eb81d1889079b4ddcaca254614c85bc007ee888c47cbab5173ca3ea292716633c8ceb13832240c645cac81d341e177a538546c016d8ca1831d23fa78be6c251e78a2d68a96cf16c251e0a4fe7a26ec42e681c2f8b696b2b6fb7f4dae377bd6ce90c62e8d8a796357e9cb037dc0a87eb877be7399b034fac59ba9364ca2da065dc32dc4fea54e89642f3244366e89f1c1f4ba5b63472be3e710d1b6be3ab46cec50c0fe6621e5bbe705aa2c37e20cce8fdf2bc47c5a0d0728f21ee88cf34c9d80f86a18b83cdd4bf76416ba4c673bc0fdd5417add731d869ada93a5e4a527881b1f00473cbaf35867061bef61de38d762c028fc9ac5f3480be360000a36538dc9573c1f5a837501073b790c3b601e70e53ed661b2b44834daad3ff9d97c5a0fbad882ddb7ce44690e9edc2a510ff71700b59334cc816b4f7eb34c73eb26dd0258a0d4c4f0a341584e6eed8988d98b374b77b9f210e2a68b5454cb1b2073b36327059e6aa37a8eae1f29d1f857246e8ef862a12258b52c3e3790e504c324ee8465bd9928586f25a0f690b275b4ecf0fedf9139f4b507e3de3d71f4afb40f824a43aa6c779c08a0cf2eaf3078ce982c39477d29e86801603a4bd6b1c6d5db10edbf143acfe63267afa65829e4a4c0e71bbdd63276b41743efaa8ea3d92f1bfb42bf228f13209d334c848e08c26381c0442122f15272f3c6eaecc38205c0c5a3288ed98c15ba08c9dbb99a95df0953d574cb3ac183d96b0c8c34d5417214c1e512806f81a82f1970d6c761838a69c7a460e85609e3702e07c796e3a91eb40864c48f8b2cbb55a6542c05a697b9b6e42253c5d2d1f6264a89b84a60a02bb92cf7a17a0c661306015c373dd3be15bc3d031c4c53db153c4214269ca63d00810aa7f3f17fc063f00df07c9550b268925eb45722b7be3dcae5f051d34eac088c0f8c6e30c17c19ebc0b60f72e24625032e960e5c819482c3f969e07547bfb91df667eff84c5c4d71409f59f1a6cce3e6f3aec87c8f9eb313aa698858d0ea6049a1907ece15a6b272ebda91ff5da7f60e5faf91747d2aab3f933d449e40c07a0fe8a50d767103df46f16b964a93f5e6d84d540715c0b3a969c74ac4bbe31cd8b408914aa1a6a7eff44fd73b850de5aa1a75a7081294e9d9d0212a710c5b0c1896c717ad13f95989de893f682fdab997bbc1a79508239ee3fc022babdb6e7fc252930199e13fc5326ce73c4f554e0e82e1765c0a6880d275660162ae3df453617b28eb1ecaa059d825a0a7a769e785c043c8cb72083dbafdb8e4073093c528e5b24a0b93ec823ebf0abb4c25cebe910cc1c55b9a78c3ab5eb3b7593a077b436aee3e77de16361a4248a2e43128ae396659bef42127d2cd363dd18c33ad891a05e04b0656c9b97ec602cfcb861a5abb87c6cd765591399f9603bf88ab20438d610a0b3096cb82626c75dd6e35e96205d8d2ed16fb3b2321a367d2e84b045817b2c7f70d1b7caabd32661fed0e14cf307986838dfe6f8ed5ba6cbbf96ce0988870b7e2a8b806783a26bc955b11317c8e8e6930e13847e1a4e89ce5c34073c15ce3a57fdb04082cb30dafb177dc62c5390c9169f7735d731069030d587e28f0b97939935b93e7188775d9baebc21f5cc071345ba5aec80927e634d1588289fdd8503714bd3fd702e5ff2c7a7ab92b129f7168f8a289857dae9143e914e36173c730cb7bcbd20c826b1c88c9ce058a21247f75a3da7dc10b2176b673bddd0d2152b31b003b6e20f65d3ef2536cb54f33c79dc74d116374a0dfde884ccbbdbf6209e25c19dc5e9f1a210f2e1f49a99cbca4a3ab8ff9b960e89b3dc89c69c3977d921237caeb5c54b2e976199cb86c071d9d292e9f1971ee7d6f756e74cb2b5bc4d5fd0e89d22080b247a8cc74d68e71d9b06688a2fa5510377650143efe49ff7b7d6077eed54d10620d03f9582bc2db9d6c90b2a8591c05b1f7ef130ea0be13445c9c87c5f51066334ae281d99f13864d75b572f9744a61ba712087dca3764210d0ec7c7d4eb30d7f110a8e9b6d9afe12e0b5765dd8203dbda561d26c7d6509a304aa61a2ac8a1b4884849946336d1839dee4827cb9c90b7b1d7caf342bfe5576193484f47928e403398b3b31b07557b8c9a694647c740860a67f712d84bc451f8d562dce695ac17de699f2fbaf52d0e53bd9479b867b72411ec0a0d90fd1b92aefff39f181514e25770bc40707203e17a24d083a0cad0f6f8d5cf8d0bddca38fc1b7b547d43635e36f3280287c818bc984f0a9ad82cee04939fe973ac5bc62c6320ae4762c6d4bb067c15e97afc748d8e46ce889f662f1a1ccdcf5a4fc4955df8e92dbfc6f5b830820eaa0b24ad786770e88babee0ddaf0708d5020d488ea3e827f30518b1a6fc9356187eed9c107e2c2096ad7bf46f412f09c172f926480541bcd64458e9c00d21593b5ec624441cb7137f9a5e14a7e0e9b53efafbaddb65e7b47784170e3f20d9ad3702302b0af356b8790da6f21f1d8383aa7070675c342589671ac9cc631dbe859ca1167f90e7b82651cd703a0ea8b88fd7e62d3289b5b5780ed4651c4630a53dfb9559c011e852b25f98dd84250c8cda511922237868bf5baa4e4b9561f839ef34c9639289807749ff0e58c98d40f4a5a7c23a90a70dc6de53e56aac756834cf9578102017c035b64f23470be81a6829378c4de4d825cf3b07a1cdd0fc5243a22805e275c132296fd713dcdd8acaac205abb71eacc09ea70f26d4c9871e022a50f96964622209bc71a6bfb3c4a1cee6e509d24d881f37738080344aebfa71b68c01709d9200fd53070425afdadd2feba07661a923f49404e375f04e7c34c0829fde735864a47dbf2da18972ef250fabccad68f627bbc065422512d39af62e006edc34b53be112af6d75a7ac2f7a8dc712b7a0acdeee5d341730685515c8a9fc7099baecc8a7f25517a26f5f7d36492e860e7aeec8c72d2bd4a410c31cb0392ed1bcb6c528401bd402683b142c9c4a304503c6ab4fcd1a6f584c12c9ea28a360c968f817053406b4a27fbbb7584d0a04d0b49721c4fc2b60499e95634b65e11aaef0767aa33cd49db64ec3385e207e23b1fad0787cfa86e6f6f1655319de1874f8cb64a5c33ccecbf196f9c200fdf9e2f333bad10fa9c5033dd0a424c86703c5590fcc7c171316ef2bf37c427a341a3aa07b70864df8cbbb48355b5b122667f9bb40d2088d607b60a5c77908530bbf274d54815afad32beea24517319486abbfb1276a11f79c9d421b7b554ed2fd19e97cda213041a35ce22315284cb671d4b8df46844e59e532369b53d7bd1994a721d51850fa7899bbeffa186f2c03ce13096360bf6d09e5d12b96baca44e2726623cc5fbae355e310e8b6cca484e5dca84c454b81ac5a412fac7d0d1073ea6e88ab33c95365bf8240a10cd499bdd5024b7a9bd5b692692fd0a8ad448679feb66bcae0cbc2bed332b13a2600f183f7dde18882d46ec6329eee9494aed5e03c09ae99b03685fad1d3148344aef569cbcbb4986bb35871099d34949ff5252d6526a63d456ac32663585ffd68c4ed8878eacd7aea58d1452e6b836ab3ccaada419810c4e39a5dc67745c65172cbe1b43de449d7095bfb62a454a432e2804f2b41103698677b1203677d6abb1147ac6851d2df2867ca7aba65d5e4a1f93a0185984b35136b425106ce53a13e22954bd2632bd6a399940425e8191c4068be20682329f57329996d719c5ad4488dbdbc75c80d0b9028306ac624d3aade32e420e2e54efb8577b915806b407341eb53c53016310b7e3c415797d41302432b4bd41255a1ad901340c848dbe0fa22fb6bb871a15e052e87ced6c79443421cc836f690f634a20c0b7fd9eb779c5cba326efb597649eb8222e82e7b18a2dc28ede5afc36c9295540b2275a08d278572da90b059a0da7f6152a71226f92f4c01216b1cd3209d42cfe0c77b74c6209af79eb7b7a782e4cf1485277d18b1a09bd386799aa36a23ac3784cb1c25248a95a4d46650ad761d343402b6e0121768379390736f2992394ab3bc4e08fd258f27354749aac390ca23a37f1bd5618c498889b05a8b9862ba2949520ec3da248a93a04387e7f5781ea63bced47a34e3aaf73ae8d8299ca3f848293dccc358fa8f1f64c35a34bfbbfc0f26924b9544668e758feead2e28ba13c46432cb0e0bc37cf8a66efea3bfc91d87acf15884931926b4f7fc24c76470f10bd174cf44068f3475bb854caa92e05830a41fc3230750950031366a2fc5a21f557d2f35f9e95a16ff4433768cabcb649bf46cfa665e95338e08e5efd3294082f51f8bdc083938664ee328f326063234e9aac2a63e461aff39b6da5ee3908e56f234da357e9ae8d337aa98f742b9c8fcc6fe4044e37b66db95abb8f28a565570001b198c0b1fad40712c4a6a92dd3370da905bbb6be8e32f2d12ccde964543f4d3718fdfc09e68c35c2d02cd11ff581041f883de6bcfe795e226a6c3c4b91932955726514624e35ad4abb619fcf6dd66adee6ef09adfe2e53ac56d31481bf18b45506e894da283eb2d8ee8b0ff726c96aa183759a600cd245ec6d1de859cf4412cde9526f882e18771c70a1e62805bd198c4b90d7b02b893c94203a7e05fe1ac1486cc3e521ded8b84b7e5703818378ba9c36b14fb9ee848233eb862e69514e7398aec864ff49f0c446f1bf96cf138bbd64a515d1f568a9b94b21b24f9b963fd1c9234cf7ba7e23e745a11f5bc4012f989c6c963a7bd0f1beccc3369fdbd02c550e91b992c9a2515ff15a90b26ce83539a28ec272b8835311065a5be18b7e39db462725206716be9162b90caa31fec2261b24a6816d5d660579bdeb36be0fbbd22616831b482e920a900af11623f746dac6e4822ddd389704e4b7def0120d6f7721b2d675c5f2a003ca57839ee477e03ea96b25aa3909d3a35c24fe7c946bfdb5c36946572f4ca4b6a5e8d5bd0dfaef858c623782723299c01afb97ee7cf32d70b83ebb7b58a2b7b4b11545f14a5aa5d97d14012a3014c52f3f3ab2300d77e25f51cff578358df808d812c7316c280e8bd41b8cbf9878ec86f93ea81c588074544eb85d4014799593069272e99292a0b6223b80e8010acf9e14ef53f51f797cb672d83bc9fbecb34dd938d7d98efe0f1f52fae63f3af67970fa91fd0e5e2b20ea05ba40a9fd3f58563a02fe17ff7e5829fd242f838fe7a9fefcbb7266eb1da89261da5551fe67b787cfd89eb58ff35b98ccd8d5a264d698c968da2ee90a515199be8b2ba004a782bd0c38796d268a1fd0b08aa2adba3e1898008280b1efb356893185eb02c8b246c81315f27df0f66c63c02406ab07970e6e65d3fc6dbb510656ec41466892e4d2a74755280216ac9bbd6aa925161f04d0ce6ee0833c6646eddfb915eb62503894b1557ce59f0707cec48948b89665818c54606bca223564e828e0e1733e6c0dae8ce881cc4e2c05f3c61cf85381049d70ced12409e2ce96d99df9359000534ba43dcbcef3e36045072bddfd3e67d518ba83d969ba451fc1ce44df97e4f089617043115d571f95158beff378f211327631dbc342af31c6866d774e4d0d40a0cc011a94a00d2df605cf0d6b5fb0ccff2a90e229296043f977385a075422acca765b4a4b969d4158efec6b40fd8c46fc0635d1dfa091f6c1d4b839bdb83d4c135d5ed4bbc2c6a24938c42ffb7b643faf89eeedd62103a0b56087ed1c98856fa514b14963db925a524eb274dd6a353a91b3f31cbf8df278865943e3263bb5e9c982282078fdab58bd15cedc3baf681707219052b41ac81d6de1457d371bf8301b1cef537b0d8f9e29cffa325534a4b3d62d2a990da6c1e6bfa4b5107fd90d51fc1b03ccc83a4726ba40f6b29ebe5a22ff662d19a15e747f93dbe1a1802e458111e69aff42746839debcbc8b605132d39c1fd7fa069e3f53ede0b0be5ee3213a4f0c505b50016993923d5aa03c430d890ee62ce2bc67069ccecb31c2a9d767a52d589f04882032148b3fc603a520ec59cfc0f3114bf721798605d560ae56bd8b08fc140f56bc1824834fddbf799a3d7f51447b9bab0b530f90812127a09b7dfbf119032d3d125d237d54af119955e2fa04b393fb2ac4516a303cc2b75faaeb58b920c7e7e49eefb5123ab54c0c7c3316cc4b302678519683d237ebd1e1305690cbd8da9012533231d84a82c95c108f1686c3c045596882f780b2e048740ce0f508917c007e30f4865faeeb70661c87c2fafb396aeb6bccb76cd102e3e9ba5b2734977c188c25e87955edb7b4492e59d4702081809f5b508703a8225aa64919f479829521ba3b219bbb17ccbdb36830c0b632497a7b1f84c048487097c5e1d5009ae3c78269969249ce50a9af1e302def9c5236a9334e29cd3bf18b679e7f3e3b73bfe6d227ae74e458c28db991fe916a00bca721c449b7f7ffc85718d3ddda4a3370cdce28b2525aedc46057924cf8ba0d8311f9a75979050f0424c33f15c06c2e6b6643d196bda623fdac389540ef73e49b423eee3ab35b959c49f60fcf3fc5178167156d6adec47fb02296e5e90a37393a6ee7d70cfc94c2a8f2ad671b8c0c8879dac9b0c226e11c36b17851d12454b2c62a7ec9734413e645e51f14236ca1cfb8c9c41b579f8ffbcc9bc4d31817412db15cf5cf89eb8e6ea21053c1f01838849e6d0ea1afb82cfc65c93700ac5ccfc8de2d21de4e23260322fb74e7fd4e6545a9b22296125a35fdb1393d4dac7d3a4a7535d46435a9249ebbee02cfe9202cc1f9c75aeceda666b9047f69b6c97839054eff59dd43c216b9668157d48b77bb43a6b3758f3ebaf5441512dca3aeb7c819db526095154ac39f104223b751372bb92a308292bc560d28a4ec84f8578df0cbfc8e75884342f29045b70c6b7ce1b7306d4cb69cb5fac93c163b92d2727235d0a781b4ea155a7e38422a346e238b608b8b112fa50a54edd932951599ead7d365bc6a065e746ae39edd0f88290d701d296136b4f72ee6721eccef1b8122d5f0e50629b030bb8b5301d9c3e39978d0e0c85b49b21e35587c858e40883fc0cd96c72ef589c375383514962b7ec065a9b12010eddf332c07f238db246063fe87ea55e78dcac9f2b82d2bb52548ec4afcccd78bef8ab1590d095dbb9ac5d82204390c356017313e4aa8477806bbdcfe8ee83f6560b26031a624b4444071214e56d07b7eb8bdf49039e5ac112c27354b338d217885a4551b58935e1722e056588162fc7e45b80d2169b9328a3764336570db53677a9c2e9d013770590da6d0e92e984b51850f74917974352ae6a98455f3af2a4915da4822a6c512ca610eac28834fa9946c457a698a7a2ade6cfa764357189bfd6b13b67023e3ea124cadc17bba327eabd232e044c064802e7965062eeb05210f81864041b87b3b257e8dd30c12834874381c6daeb4f4f9dad96bdba04eb3849b62c4e090ada10b48cdf4ca2ec15ea4742fdf194c7463d6d5724164a255a437db65769947ec7438246596d8e0ccb242db5d5960c872f7b4535ae955258692497f01c5df0366e54cb5e098eaaf772d642a101113a237ecaf66b42895eafe8c29bb2cac7ad57282f4a8f46c82dce72f548614203d7eb15e13818c92c82573c67af572eaf16bb40f967754f0ded32ee74908471ba64747c011e588ae2e19052ba1ba0bd5418e5b87dfb7a8519fdff43e9450fafcc7824aa34c9ff8d38354cfaf07a854c752cae6c3541af576294afe9191666e7e9384d7deed1225e87a07cbdd2d42cc9852d108521a13734ae7bacd4a3993254d25c8d99547a41d9eb95712975cc4af25ecb959c6e28e12bbb91d91a72cdb402d1e30698d404069960e7613349409eec60a70a63214f0863f00232edd30a63f9b49bbb03fdd526ad4a780122587c36bcc978e6220ce066e0ae335e894958c0aa61519a2e0ae01ba7e604ef4e568a5373a6028958168578c62bd6f86603b12773d6a43a5cb48241f8267c3951e8f9acaff4f0e96abc77d616c42d0f5a745d679267f1ecd5abfc26be84358a9fcee018ad5fadae55b26bd20a7c0203283be7ea28e955a45f78e57678eb8eca936e3bac8e7d4028a2d62f129694598241e97d9ff893217bad91384519eb3a5704186d0f7f9829243843e9d7949047f33c35b56892ec75e303bb5078450c418b2fff07069c4aadde03530f2258cf17a29e32b900e6b9cc4696e831958e5744788ef6f731c72b14c47472dd1bda678b96288e57fc58f642d1d1d7088615a07e0805374d3b9b95545ca306d131c110bf2b2d67ce0d67b275568326586b088aff0de427034872f89bc33aa47e05718874c483a9c1bf5a22ad09d658cc4bbc98335ba107b8808dec46132c6db50db4d9b5136e97095903a322c9cd988439259b07accec0fd3c0f969fc55e4d8e6244d54b1a989949fd022725c44c9a779005ee134a11b987411d27ee0f04ea0eaeb44b1955235f185006b8e2a9ed887c41b912a0a1c169029367eec4782b85e002097edd0f70f1b01b2b553dc00122e019e6566a41ab4993c9ae059a8cfa4e23bfba855abf9ac26e5f5aea5a2bbd54ab34f7635265e63b68a9b617377c28cbaa7ac2cfcfaa1a8cfd3d2d12bd21ade97ae8564ad72a4a34d5081d114394e8f99d555101c5a8452f34a7062581ae549be4ef79a7b6bef7ecfd76b2c3ae977c91cd58601a2034905e1cee2b0daa7b23f395a4bcac1a7a1fdccdcc151704ea4e76ccaabad22a4ce3aa75afaac05da6f4d12ec11068954f45772afe2a61f08d9be0c27b7fc132e6e491d572be76198c87b4c8b07fb22b5859160474223415ce1293223f00efd9d0368c298e58fdb74362771f8dc040ebadf150003edc107176ea5644e36d7099195f33b0abbe8c6efc092c0b94550985ecc267f3ebbf89c1bd23b07f883581342ed6c2c9d416ddad039e6628485e8e4782e061424866e089802a42b37aeadd86936fec08acfe58ed871acc3c8d81967b35de87bcc1ca24bae4694e1211a404a0915b1e206b9b50c4662a1140da002327b5b24d6f275618ac177e10dbee1664903f6045baeb68604a0369505e368cce9519257346896078c58be75e1782b4d25351c8963cd140b80677976e25af872b085868e8a527ab330dcda8ff162fb749eac248b6ecdeaaa68da520dd138f2f055117f172e416f7ed2558c9df3177df737ccd5cf161561e31165de4dd8c05a64ca7114cb82046a23849a9cafa36aba7a70eba044a5dd38de351d84308dd279ab65e23dc60e305e5524803ac513a4e9ce783d93e4eb43d15524c8e7e76d1e1511a2433086931ed063812e9040a3024bcd5645e0aeb25a092418e98c22b471fa9a50c922bcc98dea458c1e38ca20cb2bf25cd99e9b1019d6a64e9ff622ec3842e47adca65d61d4019441ceb97ec1a0f0d636eb3cebec1319adb7560ea696590f3d067e7c6ed7b908715ecdc0f4c776e1443827bc89e66d087ec5ec7b6274819f593172c4e23387f4808e465b32fc93cbabb5e95e3adcf8fe72fbcacb6ff8cc25c9503d2a89aa393db0dec2b515a68fb7203f52244a96cc97b20962092355e76807c596102a3f57346cc510d23b1384c6f9530256842693882688fcbbdf74bfe442d01cd35d1635ae230a5f44d79e36f1b5663c0931c8387957118469e79242962b1764db22c6a9f814b90d8b15c53b9fc20c5d54442298df1324502ce73b446794a55447cbb2614b9ceff8e183438b9858959f213b92c1c127d7984b4aec2058a293c18b68f2446c1c425b191c42e193ca3096031ceacee1f386b78d70f5872b6d1ccb3940e676a900bb4c0dc68605cde966c391b2bb218b5d5310d3f0db359040588c1321f1098809a83756e110129a0fee2d5d23946b0203e35adccbfd4484736b85c8478edd053afc573cab7c84a12b32d42a6d2290b933ab22c0b0c05354159be845146550759f5550e55b1c182403176d240477e2994f41d6dde2e6db4c263187b8b2a5e4c26d599dec4559372d617a4e82c6980fc9084d21a519d3dcb2b77911c0ad3f82596ddb13fc37479e22f6c0c7e783a1bf3c6bcbfc6ce930ea656a8564a04187ef43d735e6d9c48d5fa08b1817e18c02524c4ae58f9b38a185d50f8da63309c3ebc3382d1166082d99348ff8de44e6d2d51727fd6b3504ffda229d3bc53bdc9a7a5e052592763fbdf841d44d2ea0f254cbf02502742b44a07da347e083ecc12344d156039a7be08aa18ac58501d91f372680e24c0c3c36d7e10bcd3ff672cd59cd5e8b20769c050e80abccbedd1a7a73ca54b50f2f562b862726cbf1777d86efb8f11b9a3fb3a60536af4ca510ca6ec26e05a44fecbd14b29d82681c521c02b03e120c7e002913250efbdb0a58a0d88b8ff32684df70aaad77e302594f18fb787029169812e0154a7c299e15ac84dcc250f7177f9072b9e80a7428e841b9c53208194a4d37465e7b182cfaefa11c00142a3ba94576b1a22443c4a2b910343699e371d32223880ae79acee51e9e0947318172cb0c6bae4e38963e2d87b8527efdbc1db5f18e9b207a649fbc0bd6946f42a8eaed612fc5dd016b8bc7a15268bda234d9cc4bc2c29071fc7ee3774bbb00f3e00d8f36ec726b10fe755e25acb8fd6206f57856449c532b4a0b40f26af5ba043d039c7951a24063ca0b2b077be36f7817596455cf43399bc57419c76fa436075f448a8929874c2e49ade302c9a41c7ff63d02942fe36d92776eacc168e91ddf61e903fbb725f775121ff38a3bc871634a01175bce9f0c5d154de4368d89b7e82f47542ad03fc068cb3b8780f05124da8a162285ec24f31f7a2ca1b7af0c29a58087ecef6d5c87de9f88479f7929d2a3a5c7775584a7940c82d3f5ee4f8b20721e93d9c837cd6910f8eb3b518042c97927a58af3d70a9fb732dc8b5d4c5ece84805e9753643ccd6206551a8d9359fbac02a05aec3013167126aa3baf0760460162d8275bb84b15ddfa9e7bc8da41af5e9c2bd247d18314d1fae9a32727fcacc081dc1b9c5d0ccc6cc1007422c408c5d5ba52ba189eb07178a4607e9424cfa499b4f418babfc1512547bdd4a41b8e36ab12f710618821f051757ed0934990ebbf492ab6412586dcbd0b6ca5b1b54ef5fababb4ac52b7de20d5f357a26b2901865d2704fa5d922718cd72042f1c5dad33c094a39b0348a3684b56bea06eb233ae8d4ed44ae0fb74dbe4591692661b2f945b50615420850555511e12ea36179a5f1cee00989eaeafd3d6d91b5266e5e2c22a8c7fea05d1db7ff573cd2787351c23f324292a6c48883c8ebcaea85f07fcb06c9470466e503d90f6257be8d836cc35a1163b03f2fe285ce1a4c2d1a8a9850d62e0bf913a9a251b1f1d54723c8a6e52ab34b21420997c685bb71be6506fb7751a00c23015815f5cfa3140626cd605c4c06abf5e647b8454c4967c4220ea9738d664839704e18dbb43d00853682335a67efba36ecac142078f7882bc3fcd528c9021d13d207186c164c516f7a1cf0753cf60919e1ee4891653022086296d605ca0cb9bc161587be9a67a2c8c7dd8aad36198130b9bd7d4bcb6e9998575a43756b0bd4c2baa0c0327cb4a8233f798eab063a87137652c880030c95890ca5a420a96a3083dc496c0589cfdf262914661ab624e588aae0fc568d99c6725b7a0bd633c1aa704fac46d6111ce230baea4252e4f643061973de37787ea51431a4d68a11cf2802617b85d338ecdb93a023a95d6027b9875c62bae838bebd904c3c2a5cc11ef818d8a3dc5f08151a5ae4e3ac62f334352587f51604a949a2c83f60ba9f0c26bed239abaab4a12cf06e9e37a331d7339d62b1e38dc4acd3626aef6c9e8f1c3fc04ac15f0ca3bdb37e246431d69df18c42171a6b29826d1e5427382aae5f95dc5b3867064ba4018b8b8c5b504413658788a9c5df942379319ef30a51729a3018dd9e6b1516b364c3ec175550e5a992f8501b51334933732fd66c1425c6aac812dfe14b9670e78f5a57cf0f9134ab8a6a4c3d0da53b68af5d9bb5d313d8f46b0476b3823a7a3f277660dae3a25b03e0cce34cfed15ee61a45dca0b29feb0733fa8871747f80b89734c9770b8dedcb0ace100d1fc807ebb213d5303e074385b28fa7c26d3f2a24db07244e173ceba69146df7620e8fcd3f0dd9638d4d6cceae47d8cdfbdf808059b0f17abefcb584bb573797eaa87ca630636b4e58430fc1518198feae902d218a3574f978951608e6432a220e06ae0dc31f8a85301b6ae4a722b5961d51e20debfc9025dd3636d123f99735a13b18dc5d558471c9c9ea1075a98c6b3a9ae783c2c715c6cc75e76e9685692f966413994613d4e90348095dfbb3e1442f33fdeba8a643de1945d1ade04b09d15de6d20282740e8b6a784eaae7abd9fdd2468e7ed1e9084cbf358ea92f4a8eacf970174d88d7ec0b1475ad924a8cf8dd467dcc214abe10a69ab0201d7dbf926d0194cbbfcb42149b3b0b8aca34a608a05d6ff40901732f3810bca47be61e4cf77d5af772ca958a7bd37e4d9441a4c1b87a8506316145891989ae21583f5f002e9d8c8f0d0abd736240a06008a0e20c9eb9f60613eee7dd88f2485ab3154ad0971d05a4236637ca85d80ddc2e30ee1aa5baa8d4aafe4d888ea529cb1e3ef6a97078a16d174c8aba24c67d834687b55cd6de80b3bce8ad4a702f6bd82741fb2d44f2e72e84acdf830e4e6fccbbfc5c8d447dea581259913e96b7218eb03b0d8122d820ab7f377ba55cc631be593408509bf400b5041edc1e431f8f5fbc0544b43b822edacef1219dfaeaff8c77f9c6b4e14a799178708a0ac2fc2f071dc573d4cb01c504896b78ccac6fc77d2356a923a98589e4b900fb049d4b9ad21bf3263dc4288592069f43cdf2752c6923863c9e9c6f2d483f26116a49fb6f427548155c3ac1748e0cb6e3f103e96bfe1a2868d15c5861a4fb9e0f273b98348019082ae0dc2ee66fff81db150820280e6cf0b58f1a25288e8ad22f3feef71c5e53f88cd4b3a804fad36cefb3e93d1816e6cfc9ea60b3241cf31d9c6c33e9feb72fc2f5702f8b5e1356b2f66a20f67f44da925f9ca40c82de0bbc3cd14abe5ef802f80726426a9fd91a85593ddc2c4ef38b4fc4d1adef5e2d88ddc21fb4405245fd009e26331245edde962546d167171778fa4ef4f81db3c80527830e904fe0d124e75f6975c57195a4a3b124518afa6c7cb532677c8e3818bde06d4abde9dcaa4e0d8961852f7633c6bebc39fe6f91e3d2277a634c37f46919e1a8be8077cc9ddd8a565635a92b2026ba15efd16b611fe2b860d3b3121edd8f6e664bb5315c70631b71a522c2478f790b7264310f6eccc287209a1b52dd71d1e1a30c723c7c78a7db7f5108910282ec77c2c71d57c158dcf80891ed650a23b0f497dd4ff151602cebaa3ec47e092beaa44aee96f8de11690900ded96ee66208886e8f9c46dc29fe13f52b660607d40d206528371361e30c349e7b843f626add1544d91c856d228125fc56286266ecfffdfd6bebf525addfd6b8fcd8f7ae455db24c2c70e0824ada68a24f2da5730a8663654451b25bd2955151760654d6de62b4989587b316195e9dc1ab4968ee82196767405df2889b87e87c5e327ab013f1422be4b33334df72d7b129b7287f46815eb42e394334cbd7d5174b1eed814e49eeea5c62666185b65f891ae37391d44311748b10c0b204bffae58f2b305b4261a9b5aef7786d793673438b49a1ea1fb8bcacf25c0269d5f025e0048cac4efe48187d80fd807309ce3809d3072a485714487c48074e87fee87d30b20204622d2c3fc6b8d15b37fbd03e856e2fc4e84ffbd81929d569741b62b10be43fbbfc6163f81333f98da6ece4e0d240b137bb52cba4752a468e67f051326d3164301c0301c5be26c7506d085c0be560427ec931f8fd4ea17908776c16501cf9189ae3fbf1fd5d4a965a41c355eb11c5081a0f05620f60a8d2ae1bba7002c3a8b59bd4a84c72ec0143cd3c830275c060810125c77051a60b7acf15c75025aef16a0eaeea720780080f49372d108e18cda3dee5a3a9a05c69984ca5751f1b622e847430661467eedd89668939abe93f6cef6907448e0bff4d3935186637c51e18bc9287fad1590663470cda26188cf5ed745789cdc8accd2ef1a9f6243eb561f5243c26f34d692296f00009ec324a1f2fee47cc88bd12025f3b1ed13d88e1e2f61fda2bd757281e3c9a840c32bda290e6df7f106fb1b1fc12144aadd7eae54c79c7f38a71cb5f62f18b869a8065dcba79191280ec2d3722a9973660b817df81294203988ef422425b52ed344c6c5cb5cdfbee7d2fdcced4d2fe7c41082292228f46cc4936d0af0275ad86f9086b7b4530b99249e555d14c77756b68a1189c6afe63f78b1b13343e34e97b5424ea69df48acc01039aa7e05f258ffd6bf4f0fdf2f9683a9b2f1e0ea3454aa14972fd691cacd11e9357b588039a73e287e8344c815f9dea9d857f107f19da1827a554f43f8d70ef65fc2887166782cd7ccb07e2bdb49c4e6980bce16f99b60ebf20d08fa6394783f6d9b6a59c8db0215276d97a7415fdf5c1e5b08ffe0c1018941fbe5ffc8f29671392ee49a14e5e2d4fbd826ffdfec15befe3264581dc89fbfb7d1ee637fa67762f21f5f2ceb6be508d02ad3b807f8d800e1d231a24d0e3a2896c3160ebd5c831ce41e8998c6256b2ccbaa6bfbd84cc027f0ddddab76bddcfb38d9ef9e421b4182b322f6ffb60919a3f16e2b0742683703d92b2d56b0c9762230bed2421cc96ead2658dae280a7b50ad6e6dadcd19ca999fe75f3b101a5f961956be019a386643cc8c6a48b03cb76629711c59590c61b7496c6fbd1a3bbc4738b421889b2063e9cb9d0c9db7b535d8c9bdb787785f5641d38d7e2ca4567943b0ac26df20ca10d3b8599b4035fb4a8b45015676c13fc472c66ebf0d3498d49f338ea90326f21e6f6a9c56ceecbb4fe67972096598e461bbd2972cd0662c56810e4418994aa63d17cb791e6178208677a6fcffaf8b0b6fb8afad80da2273078b5062c9d5a97b6f522d6e09cac5f5cc4f851817df0d91ae60574e2c1be2f68929c496975b61f57783fb3b1d4d255b8da0f0978e32cb0be04c3f3268f88f62cbe8235c1e98984c87781f03172cd5e7a2e273a243d5bf1c14701c1e7c148aa53b263ff7a43e7394ca8b2948bd5c436bbdc67e4c0246ec43366a5d7548ab7a9be568fba86ad04017177e00e1b27fd748c0ccfb6669646ef815ac447980c809daf8a88ff6cc88118734998a34af3f7af03e8358dd00e84fd0a6dc9057421b48a2ee093d389dbdf9afb058e831d6947f08ba32733341bbdde1e360d224433b82d005686e8a3fa36147d33f30cd68b4e689acde52eff501c03495a6d7963d93e185d5cb688f858934d8b213213c5a0177ae7f91642bf760c89265e9603e081db00f33fd2cfb17c2a6b9876c1dbac59d62cfed7c2c5868ec18d433711b9387c7f9439041a811faae4a61dd5b73c49accd1249dd972b31de6dbfb9de04447fd2dbbb511c87c1f46f86d2abdb5a14192b46f840835a542f356a87c8f42e22985c7a8aae904ccb45801f0c99780dd570beb6e10ec39ee5b8d28e62e48a0f8c61089806ca8cb3b94ff7900b0dbcf640edf627e5e8f2b8d43e138a2f85194f7ac0adeeab6b2b95a74b11670b9d62e33003d3d60664f9edffb2dfdade370a59c99497971b5a0373cc627366ddf78eef3678a3437ce3e18f29c0c5d42ea2a4747b68a242f1c60ff64e36911726646faccab078482e23caa6eec08a979d6684db3b971dfed64d75dc49e412896a54be7fe418bebdd257dd60a99be1d5efc36be1edcedbe5d0704ee1606db7b64d31c6519e2f6a879c809b308828a49b1a59c079c2c7fef98a99bb3189cc936dc76281152182cf7b53a8121ce9eb06271bcca734deb3747b5044f578927fe7bf1c70a6637369457231111bd7b408048c8663031422ef228d0c15656179ada4691e0c317d2cf995bc841e33c1745f83c1372d01cde630df690710d04c865a5071f92ae06086a0783460de518eb0b89601a27d67e2069fe11ea4dc24dddc7a4382589dfce905b60b9978c544529823a0f3d37b6a7afd0b12b072a84b1ec9d984b5afb707b15d60eb147f0563d63da7f84240dbab13af415bc08724c179726b462c2009f47f03fb7099de35ac9bb46f429343ab29ea0399cd1c159fb55103ef8ac1eb040462d114e75bcb1ca5a92c86527a649660802c8f8c0d8952dbba0d3dd66239caafbbf8d38700f3ae427a0c3e800abdb89b08850a8f4977e90f0c283b37c831d929c416cfe8e10f21c62150cc98f8255c82f307bceaf0627174e6160f8e6243b6700b4f9af9e16fb955116a24c2b6e26cd506cf9424586ac223007ac564911db5a07bba42458e2d5bd3e72e9aa92a95465a5ca6b13068465197ef83b3137aaa090f965a59ddedf8127b5e8d812294ac63d3d6ab04b5b578d11559a5f6eea9cf0c412d5e74c1823793510f0e853b46bd88ae0a98e611a0784c0e1bb09fdf0ffbb62dc0617985ef44c6f49563060e47451447b6a494c3f091ed8b9395773428eae1d970cdfc039a4df6fbc1c297a0ea461c71cf798ef916da4ca21daa26f6153baa2bdbabf4dadef5696a68a8408d7bd35d6775a6c407d4cff596fb4167c0fe32998240648726c2957ae8f9133933278e40a511e7be155355b2d31ee02aed1330b9186a66d1cb6c2a11de7ac42e77925d2dfa8032c309a825c4deb3f933730bc42806e4947853556cfb4890612d90fc0a5b62a226cd7f6a5b3d78594c87ca0f98edf8ffa4a9caa330112543cfffd70b120547fa2cb990b28b5a6cf1b34c3b44e68101be11567f293a9a4ef2acdfe87b4d71a512c665c8310c5bbfcd51667c731990a9d1f46f163cf956ba70b6ec015d3253dd1ce6243a2cf568a6cf3e946288458898026bc1dcce47b749633d1b6ec3fdc6d8e06e0ef115f7a070a20dd731bfbc8e22857d5e92986589c994ce24c46798a5d5c6613c9dfad6a2ae22c16a5c6bf7d7b4e53c44455b709e4f4e0ce2908610cc54446e23d0288a65b95a874a24e52a01258eb9b1802ceba81f98d91086c38831b0b4a8570aa2d53307782ce8ae6c37014081ec916429b257f464d8957d70a6511c8c2d9e8b141938d5426ed384d81ba15ff23c714a9eb12965e2cee987c04a2c82029d90f5a3ef42adaa64bd41aac94aa10f91797260a418ef1ceabd3216f3903e77ca96d63b6f4b296b6b357070673bf0ef4a31daf93448eeb60140e18a37b775eddf4c6a1fd9d4488eef2d8c8a622f4e64a8a0d49561fc77d9b42b0319032aab0cd158658b0cd6dfce2d4621b5a13cdf91e10be7ecfb9c40184d257fec25aed33e45adf64a80aa713720ba6124e56cbd7d7984f19796117a3d234bea3fc418535e2cbfde50ac13233ba61eee7629a4604289fc84c3ed02310cfe6dc3723152467c53190709e296eb7fac0a1e57a2346289a1c353d063a6ba4b0a10ceafc70255a85dd17ec6f6fbeef4d861368e255f573d191955d2ab8310ddf96e3d5eb3292eca59f439165fa020fb6a7c6135a67c7f01e2c9aad0b6599e6f6636a9f4fe0ac8a63ba3b8427f237ef06f7adf599561094caf790f534c051142b20e04bfa090ae40b9ebbaa93d0d8044cd39f34141ee5aabe4b035d681ddbbb4e2c9624b77d89a4e934e2c17017c48876bc73182acd2ada2af000b5d190da9a791402148810f71156c8932b045cd4bbc4ea6f21fd8c7048a0059a93ee44ef4bc9a3379b5f6167c8096e0202394af6f16a1b8fc0c0a4b681afccd43931a16398273046d417d6902658a08b8f3d9e3954da0d61bb6f902aec1d8f4afcde57dc497bfb61463b6436107e6cb62dde948c096869ec5ed10d8a6154b68ed6b63c26453f9fab545df74aa9e7c14d98a7e271a580698e8f838b05213e92e1ea9f47badf2c6db4acc3549e610da2bc7d7aaeafe46c15790d9c42f6400a2cf6918f042e153b382bc296e9264f2008ecf11d280fd1b3c412822f5b488a790d24d52c4ff1ad152c75aa22501dd93d560211623a9bd1c5bb03d68ca8b148f3e37b1ef1e0c88c3bb7db35c8ed235db191a58d696f7fb1a7581d53832b3557c8096b8ce89cf802c4575c4666cfea5caac81a02b60bafb151044f2bac7e4f158563a98a02428222d9fae56cce03a4dde61b2eb0b5e1717ac17aaa5bf72b4ebdef5320d59d12e712a3a2e116e7547cbe0ecf53f542f39320e83073172754cbd648c9211ea7e0df2cb04604878b86cad53c7a9b726f4f62957f403f08b6e09a8aaabec407459fb0ed8feaaf73e82ee8b67571327b18a393642060b1fcbddd2b6af132f843114a1c4c9607973c9cf5500e37bc1bde25cf747b1b5d51c80be0eda01b33e591726eb3d038ed2bb9cf34f8ecc7abefed449942644460ac4e6ba426d31533da20638a10fcd458d93bbee1746dac3d83111cd39c1b43409b71a6de205ba1899ef26ebb8226453218b90958b90a8494f31199638fd3802cc3ef072355fbf3042aba2c9a3bfe3f11ebaf9e3fa0e7ade88fecff4221589fa2f7b1175608989f22059400233c8fadf49ebb86ae3414085cb87d11fd57b7fabe4a335c8f03ac79b6b16e19663610d051af4b00d8c3f0c54897d34486633d4be33a80e9e7eb0138b4f83d043f863523c7d428f2f9e8970270a1581ba51b141b5c1b74f617a5384272966ce82ce2e49981829a8e525ea36a26a6ed3ce30edd78640ac96e1e2950dea91389651a97c792c30f0683c04a5cf5bf9b09c4ea5cf4626e797a723e49db8e2a4f37d8d30da413005ddf6c9787f3be196d59b5cf19d1c107a0b77a45f3d4f82edacdd2a4ad805f3048cf75a32cab6f32b4848f50891020b054937f1491a772601a3908207a945ebb2597542ef30051ecd8f0702d799882137172a756511d678ff53a5e628383c0d7c3fbd990c6e61ae8962ea206822f9a39878993282796e73bf11814fa1906895d9cb09eb1dc6b17bc9106b457404a6a3bf087f1f6260c7ce7d582232d54fc54d32e9cfc2ad32559fca4d67928f925b33d7ba05ca0f39fc1df07d40ec1a5fcb43fd93d7e0590fda9fbcc6cff2a0fea46f64960aed5fe3c455b1d6183f791bbff542fd89dbe0ad17ea4fde066fb9507cd236ecadf4b135ff0009a8dc5f594f3aa6731a046cb80eec0d14f4d14c182e23847ebaca0b1ad2120900c493dc1271d3a23a514ca20829f0b2ce6e91a00cd3665854ac7f24fbb714416ee078ce0f5a447398eeacece3dac90a86675048fa9d2d31e89ba37992bd5845281880a181360b33958cd581f681cc110c6611cd949488da1ad29a232227dcc15d11b665cef406c1cb8ccd4a874ff89736c1b10a03cc11c04b07b86c80a15aa34a35825969aa4e489d2d7003e816f0b5b950a130ba04312bb70a595646fd39e4396a0340a19ceba0fd9bad7fff9301259b5f3f627726b21f319dcec111d52eba4efe9d225e118b54b0d855d1e1065c50583b9ab48fa4b35fbfa8d2f003521a150f8418ba08ff5e54c4b441961749b1bd2ea4cee8c7912402fdad826328f89f2f3bcd6887f5a81d449152226e01760d60ea54275cc4cfc3330c007ad73671d1335f2cb358208ea126b3505753ce4de81fc3b046559cb30bbcbd535db8d459d15aae813bcc601b5ed13827b099ad70d9f9230317e96e7a60f3da1c21cd417c7bf026fea325090c8489e2041df0f56acbf508351115e0199b4a55318a4aadbea9f2c24c5caa17a8c09d6d2096c2e00ce255c2e1185b5ce10d182cbd9a066c214a9ae215eb6f24f3ec0fa0ebe7b6020897427a0e40e8b603c4c6376a385b617c3bff7e210e82f7b4f4e9f543d3f2cdca0e3f323ba5cc1d85465babd2f0269c9990f77443ad68947b486676d73a685975e1de16f7a0053b89efb98576ac375cf1f98130c359a9194cd046b8d2a5214e3117b4c910bbe2ce16edf6035aa045e35501a306da018b14f8d53686172537259e3486e1e52ed50c79e9eafa88b47cc46fa108a07e43d741c9f21e557a9fb3da93f5316748144ea732a50c565ee3f752fc993deb74c16bc456bcef9a79f070b8b5d4078102fd183f6a8607ebe20bc05ba2216f787da84cc02f3fdc52cab98e118d1b7cc5de555ca4dce9baa5bd63a4112bbe41071af2d1dc352ab72e78f4c69c24f92c89f965e052a9aca7a44e4f25e26a06d4b643326b9d477b7b1d50f0a8bb6bc4492e1b4475587f70f29d612389cdfcf2b79174fe0531baba2d938eb92b976823cc7d6fdadd25acebf3b60ce37317bb30ebf37f2c3c83f65f52f6586ae298379636761b4baba37a8aaf074bb4bb3ee551effed67fbdfb5b7ff0aa3bd61b1029cf98734b87f7914b56a01ee02b6070df33cecbc6f025e5577ef65a1de78dc2442fcb58e453f3bb2901b087de8f9948d69ae5b9335cf2e8ff1d1c8163f95750179c55030a7d3d6ee1760a6b006d2bae6c227b8ce70446bb4d44a721e36ec0c97e08ca00f71eadaedf42eadc807adf4316162b58d8094f3b3c8f5f250d2636dbe03acd031d3af68b9d89f6466eb998e571af3ef3f6329acd2096a29ad2b1a37cfb7a8d8921b7eb2ea44429b84611692e99f770d456eb55f6e77fdb5d8968e018e2df077cec1748b14a21174e14dd015917d47cebc000aa996f781b1d8233087e046c2407cd45578a1ab5eb91719176be1e4a578644a903a8e62ad50d7b867ff1ec1c120b0f1c89c642d56f28cb1697c4d4829a66dc1ab396b1d493006a718c38c436bd01f510d64a255a31c1d50123bbe9c71791f86ac25307299ad4c83ec275cbf64469da817f0442a5419b828e776a94d95195e87801787512ada2a7a5f0e0c374320e48074c44150f0a685feb8c3586ee8f603bbdc04ce114db9314ea6688f1bc2199ba51c0812307baeff38a42bf0546db4fcc24838f74f697db0b914c47850c8a018a86d8954a915a7a989a1b8ad482182a89626cdc6871e466f5dfabe3a623d2cbb57acdfaba66eccc93eca4614ec36b2d97220f04402d04ab8cc2676b5385033e4d14e9ec8d8223cdc921a1075c66d3f4a97d03497dec34635c9a3d82cfa46f533775fadae01f99b860d1ab196e3bf0815c559841f69c72fb0c29c5773359fed1b3a2269b686eaece59f6b455fccbe80130ecb1790763ee8b8b3623fc8ca6d08a5a92b7a7d7507c5ab04512e4ec44534b0be073974d61c4f740370d689d9dabe97ce0ab95293af8c55eb6babe32c8fa54f46fd27ba9f46cdf86e863e05748e583f0e769f1e2ee8c887794287338d191018aca48f74f356e8b06d51bd2e84301bef48b8a3a1c5bd8afaa8110115fb369bcce253704261d71d8eb4532b8d3d4c30d7747ce8a8c87d3c4d5ec683e139fb00c93ed0ed73b7cc5f89555455d2c3bbebc66d073fd5e7e0876034dc384f91ee1d8fbaf57231dd76117fc8738d96c2ab806f6330fc73ad383781b919a645b5be5dfde0841967a698e8ea880a4c88ea27d42e9aa9cd296ace77f4899532008eed69643c8a2f0fccc5daa2098230595bfa652331ecce24de2155a98ac51fbbcdfdb428632702983acb849cc2a4196192952d64d5b54c19dfd2865e1f16abbccfa5d1ca3bf6bac385e3b2fcab934380104472b45d304431bf153747bc4a30f35625e894f5019c9fe863ecfef2485704a06db6aaf782a88915e47cd787202bd24086783103d36d8057b890b564cbd148c29074c336d2f9210ea56969255498e572624c7258105254a48f183488df8da8cbb93cb1aed724a9f1a5e3483891c0588c19116d725d7caef25fe9a6d653778aee470e0a88003927e65215e2d43dcd09406ac9bdca6659346e3aa080176a9cfd9af4e3d41b442c087e64a8e6f1f0890fb1922af823af5975893f0bcb744e3f24358599037822b2c210b742210c74cf6780632863f06041a0425047a932bb5582018564d0789d1ec3da8683c75b36b974efbe766080a3a1d64b2fa8d8ae58fdc21ea1c80b6e0ee4452e86071aff5265f02ce03d60b8fcff91bffe5c9d9e9f5ba5f0c0ac18b98f7122f8a0d9d5693d69b96b4bda59432a5143f0b310b360be18ae4e143cd0b2b8bfcc2d2f36cd568b7c112b6400593efde300669b72a5971eb31b84d35461490d04114374447c020085c94936abe6d51fbc2ed4198988525d9e83fba0737e8b951c113c4c00213c6028d252b9d456ddf971fcda8bc051c2c90eb1d557ee0c0644c3bd81ed360bb7f2ca38631df0dc6441fad8a71c5929fe645fa31d1e44b4c4c8e5f9816b49802b72fce830f71b5ac057f58df751e5691b5bd7b9a93bfb06edc4222fa165349beb1d6eb49bebec56ddb3c7a45e26a2f084b5f838524715bf4c2d2e6d22379f446ce7935eb1c6d6f8b249fdf2435e91bb24ee23623fd41368c178461c54ba74b99709a15a65fd816825e73ee84907cb921d2b7763a2389e422641bb2df3ef55c82f4e722641be2719fcbe6cb929d6277d95c4658f52faac2f3561a550181112c0446b0fc024e7651fdc31d9242040626ae98b5d58a9247e611e9f3a3617965ef988ddd30db2e5932f106f9a541f667ef766f10f417107446e306535ebc9b3b06dcbeac051a64dfa02695a3a004085810ad0a97e8d9796744d8576815594c60feddb61ae537810699cc4f0719f3ca543f5ae5cff1175654828f2dc9f9d0b915b7604599c2083a526021258a2b1830a5064230620c27ccf082ada05ec0bc503ac01d41b20f5167f47cb8a174803b5c78a0bedf43b758236df36a94886151776dacd1e8db9cc62006f0db09d928fc7e4c5ca41f59180b04d441a049958ced1f0f9acbcf01cbd23ed9b30630337acce0d994501776c6cdc3cc909d6163464f0fdd6269be7145bd7dfda3ee2312f1724e6f88917ef90d117fddc66f276486df8f0908a44ac68e69a4d1bb9b461a2cea3e9a09f5ed209080b81209dcb64a3e738c31f6f62681915d4976a5e6197f91a1e4613144efb0a38b63547f91a19305e8bc65c953a9e475dfeec70195976eea82543e7541b66e875aa3243d970698bc731f4c5da97a359d6f4c712c535797550a514f525129952477b78d6048ad35e19b973cacdf252c568b25cedb4a9f0a07eae4e68c41b6520f92b70073f35c1ad079c97de8be92fb6072528b2cd1ce9e8645c36a39bf90b5925753f28d299229568b2cd12f8b4e5688e228bd500a19c06bda9c33bac72f7d8b34c618a3ec4ca36f88f6d174ca18473d615848e77a90051001f7eda63ef073f472c8f49ffb34bf6d1ca9c47125ee84c434d2909a8f38927f216fce79359ce6bb36d04e48f4ed0b99e6a773a5526469a11462e3352c86e8113393a669f46d9b4671e851cf2728e036aeb0d07c7b900590b2630fdc6ab55aa38f3725472f9d3ff0eddbc8c3424ac9524acdf3c1854591981f6224fee6e0d3b046ce15e1345e8ebc9a912b8145919837126de872a0f966c9b088ef84d8e08e01f1a36bb18bae8d3c2c86885a8c719ba6ed1ba2e96733e3943b25b74ac8f4e8f20bdba377fcead7f5ca78327227e128a5dd0e9cc6f357eae218b5798696386d961a1ca3ca0f4bfc3d5766f3495da33eb5ad3437e746259e5172344d9f9f16847af470cac087db7c5fc2fdc9115d50d74d5ad4f61a4e9d0b492bbed2606f1ebf8a1fa161a938d71d0e9bc9b7cbe1c90296079bbc7ac9b7cbe1e426e7ea69abdbe9f30637f7c01d0d72d77d1ebd88e621e72adbf1a0f2a9a87c49d8f015ee2ba2f9b63fa8e19a67a3c6c7848acab731c5f3f293e1d92313ea86a83fb5d4e136ae58c7cb8eba72f252369442148ee778f8d217923cdc7c88f84ca4ef8f90887e8486155d7a218821c7f9e651732dc6e849d0b0e2970475edf3119fe431994ee7c74474195d2611a527113d89f8d1cc22664f29688f361fd1582a69538bdd1442376d87d6c2e63b9a5d10fad3b9ad04c4a9c784f415816261d14e3b1cdab79e3e92db6cefa6f3ab0c3af9f6386d5c31213d8929a7c7d40656e9946e4cb54b22d7b20aab941a8c9fe4ee6e666fe72f8c00faf6652e42d2c49649e0b88dab1fb8f7b76bc36e2a246200368434bb0518b976e4c3916f42ea6f5f18c46f3ef2c2fa231f7512d1a52741fac220bebdbb202abf39fd766d187977392c8b7acbe24e08fff6db11eaf4c3620486326c9f4f297d72f42450497c49d0c422686f5470db51f0cca93eb76dd338ecf1ecda1eed218f2119421796e5997d4b5f4824e6b5312a9b6e50d9b5d2d76357831dfa10573131d5be6d354a8f52aa7942cc986ddb8df1e60c631ea6c159f4739f481f098bbcb32735b967baa24e2f72e38dec2787de4773a62a2a13d7c61a390f24f7d10468d58e06d90710044201451bd450fafaba0f13589965c239b772e5b72e678d9ce421c169b046df6a4d2a810f0d6e1425a8955283546c0d2eb715450d6eb77e7b5bce6e4f7e5cd435bf2e8513ee91827b78a6b862875f3a7cc349ef96ded751496d22a570a1fc0a991fbf8d54748ca5ad7d34b8ccce140b4f5c3edf2e91c81ba9e4db7d74fcc2c8c0c19731fb859101f4e108e8db6dfcc2ca80f2b12c00c5b2f013a342947d40ddd81492bcffc6a4b44641dfce4a74e29c715229a58c1f2bf18a44dee969d089f494f75d41bf262f5f0db6121d3a70765c5c8472e4988203c713142a074a4b4b1435376ef8b0b014adac48b16123274a8d1a505454708a6acd49723a4931999c741dce935229a786e37c48a428a3118ed0b6e520d17cff07ce94ff8133f4bb4fd470035a2fda8060301fd913cff1e2314a9d35d89a946f077d064f7948a49c06e6942f0dde111a568a4ba59cbdf8a538a666f0d40c1ebd70fb19424de8c14f9be1d3a23498a4861b6c83fdf8bc64dfbefdb42adc80a044f9f60da855e17c456955285d41ad0ab59e17e299fd762dcacdca2c4f0f4cf6131479566601f0859a1219be50d3f9f6172fa44fbe5d73d2ab65b56b3bbd92ac18be50f3f9be50bbc2fb42eae35f38a77cc3f08553ca0b5f487bbe5df842eae4db7fe0dcb48a91f87d1dde0f9c1b254a70745ac547fcbe8bf703470767076727a8556cc4efe7f07ee40409090db58a5bbf8fc3fb913334658aac559bc6efa3bc1f39b2274f727e5ab55bf8fd16ef47ce4f0e941c2851b45ab55af8fd1bde8f285a51d44451036bd516fd3e8bf72307e6e343d4aa45e3f757bc1f39444545b356ed19bf6fc3fb913393222507a8556bc6efd7f07ee400e544c989f2d3aa25fa7d15ef07ce0f14283844adda2cfc7ef57ee010e114e114e5d8b46ab1f0fb27ef478e4d4e929c24b356ed157edfe4fdc0994991d2d3aa9df2fb9df703a7c789131c59abd60abf5ff27ee0c8709ee03cc969b56acbf87dcefb91d3caa9c9a981b56ac9f87d92f70307e6e303d4aa1dfafd91f70307284a149ca0566d157e7ff37ee004e108e108e5b85ab554f87dcdfb91e3ca419283e407ce50ab760a8f33d4e0fe0f9c292bc33f70a62c8f7d1f1dbb01ecc33993be0d7d137db73ebeb618e7d4b4d734a7add34afaa6c1a0f802329f38a1ca2f64d90deb386fdcb6f9425921c9cf57ab16660524df3eaf983dd3c9f715ae781ebfb029453f893a1cf8c8b3039ab53115eaf07c4384895e9ebb870635e49b76c5d4d7af7eddc4150deded8aab54d7f48a868fee748a28ae521f8d5cc335f3154a5775d5215a03ad67865acff7bc422641e26aa11a4a972bae6aa76ea68f8266681b54c0314b593f962eebe9874cd7366edcc8f10ba737a777189dbae749feb66e2ac0a062d687abd476e6f645adf10b23e3c5ec20193a31b52fe5f70b133ae2e72f6ce88a16e3f5db32109ebd2679d4affaa7d56aa180c58ed251faa8e30fb060fc9c6a0c1f2e94282c1fae90cf872bc5860f77ca16714dc8488af0212701fa90957c347dc83b6228f9e832fa2646191fbda25c0a607c74700c9b8f0e3386133e7a8c0f1a7c741da478f1d17918c247f7e1072957f8e84090e0a30701848f4ec414d28049a1f5d1d94505243ec2a850848fce37ad5a581560f0d159a7550b1b52e2e3eb7765261079468d2d99a2868a3d26ae46498a30e5889b2629c881142d50e14d1c63c81f77abd56ad9b0c21b3e3ee9801274b0c41215fc60c808d6181f9b8795e105fa4d8cbadf2c56097247f2c826cf4e7f9e3d6ea1aeacfa87520786460e8f7e634b989857a8aba3b3324c844655f11acece442bd375b342758180ca086ab88a2fcb05022d23b0e12dbefd0daff1b9f450c3599ce53bb2e23554beb6e97cb0c1e22a9f4b0f2a2a2d5fbb5e3a329f30d9fc99b3163b494eda3ca8fa85738868b6628afd5451cedcc79387757a5e3a3c30595cedcdf3d4d179c9590b36816e78643cad1924933f724867cee6cfcbc6c5a978b2862779648f84c5143b8b2765f227a6a4ce0d6f592cdeb256bc65d9f09655c35b968ab72c266222fa436a82db9770fe7c3bc7d18b95894378dee274c9b8070956863feec1f268afad189768a2f95a1eb38a4db5f7ec59e25b06dfced3d5bd96841a7613c5951c92434dd45a1e4ddd356d78267afbf46242b12b0663278c67e2c73fdca3bd4924189800042086185c5c6cd8604d0a357a2887783e44bd9ca2ced6a2c6563b1875bd7062ba620afc9041de2abb1a1059f40b420da74cd61ec36dfe6c27187da102245fa4208d973f2bd32f67e796bfd83176ec187b44e2482412295c7929bf98229136a1faa381e4c3daaf88460dfba5e22a2a2e3dd438d23da8428755c369582a4ec35a719afab9f450dd86dbf88ed860711a167bbf9cc5eb15af5f0d685603c5d4921aca1f4a1457f30c229dd6c9e7505cb1490743e8814d2bae1ad66a45214019824f8bc54e6fe26a7f5a2d9d9862274dd142169eb458cc43ad166b932352470e923f401ff6ebf485548775e26af2c414f3ab96be10c57da1ff7e5f38839e5d9bb36720190f49221d76faea7153060f8bf4855336fac2f9f3ecf227aef80567c08858ec1228aef686670eb9a82c884806f1501ba2d6d4f9b9a1ade709d45f3861cfb3e719e843f963c3ab58a847a861ccb3e7d2830aca6958d573e9a17a0daff11df19862af4ec3d2c8a8d583892976150fa4a286e0330f0ba04cd021f2d02af61e5a75e39955e528877dd316f5c6bb441f79f48dadc0f5dbe570e3bba741be82bda8ceb033cef8fe4219f4fcf3ec5a94ca1179e9d1f3d1aa90dfc7ce4ceff6911359791f5d4d6d0f636ef87c3428c4e6458a683dc9a967d2a28e5c13c248fde9b447a3e5d183c8cab7c7181f5aebd455c9b236ae4214f8dbd60a7a0c0c8c0e514a8d4c7888a9765694f2c3cd4435c8194161c474d05fdc6be0e2a030629b354842a13082695aa0e38228435b08829425ac58831892245f7f63486aa6c0ad4a5d1eebb18ccd0917a3d4e894b163514091d206dcbeaccc3dea10755840abf64335e83aa40f2ad315fdc0988ae0cdf4762101c860fbee7a01303d3730d841143518c21456f41dbd5ad60acfe4e81ed4e6a286a81830dc74883ec455f47844d5c18756f54707a255bb319d9def567886b98fd430c42aa28621d66eaa6b186271b2bb01a42c58532709e937a6e37a1d56267ef4202bd31e9deb4e022eb7eb81590b68508706a3fb2fcc062dd910ed0247f61bbb8902c36fecc6c9f7f4fcc4b8bba506777d78f390d87c24e5e6fbdbb66d73dba67703cc1135e41e19f7b4aa670d3a69a19c9e0fb98767c5fde4bb87741a6cef711255a4bb4069954b8d36840394009eb54a4aaf6a389dd88d946fe729bdbad1629f566d2c67ca77b3a2ac5561f4f8a455dce4db23cf16238f8e09e250ab55f233c20fa4a734514d74d9b4ca457e2df43d6bb03ba8c1f6ca3dd149ab3686039480b85d4b591eed3e5aa2a06a51a4d4b0877c853e3699d2b214732a75023428fb864d49d7f1f272c74bdf4a5cd4fa21f770cfae8c98c0890c0c1b70f1840e6b73c0248a1d54810436316801abe3eeeec618639c5322c3be977b62aa57ca1865e49ef8538ba64879f623cc363076b5ca869110b5c7e836cf5c5a39d220b7be8eddb163b78c2ea99452ca70e54883ecc413277c4ce032418bf727dca2ca8f9bd9175e04fd7640e26702d8c74cd0f3ec47188994a21211574bab50853052bfd130637bec9684bab1269e7cd844539e3deca167df47121491cc6fc50924df44adda981335cfde45d1d5aa8db5a43c4724cfcef16e333790edeb2e870543ee8f9d698b4a3d87520ef129f51ce8d731a99b6b471ae456750fb56a7ee1a6058d547ee4e828a99b6b4ba81cd76444e96d80897e4873b154848b0807d337d1f260975154399a3520b2461f105152df82f08c6c2a3f727a1adc17627a07f8b54f08cd71d03cf91de90644a791dee7bd0d6e17c5150836c56e4465e2994ff0ec31a26247c4f260ffa2c6561335c83e8350431aa2679953d7a34d0d295ab8f98d15dd14b9569e04513ea629b54d83314983b1d4aad6d9e954f4b0baf4681dd52a97e9cb2af98b7cda79f3c495e98bbe0dbac82ff23458b49b278b84d0d12c1686c692adc445182f63934ef1c0a28c5a548f454a7809450d9b87ce6ac8366d53147942a1ce6fe5a7b79ea499b25d10ef1e1ea1df581453befec6a210fa1240f98d2951f221dbc494d4308ffcf61c38c2383238edc4ad698b3abdcb617afd64a74ab557bc22397b8c2826a3d1273b3571689fac03482d35c85e44d368dd2f26a4b486e4a5c776765e7e46fa3d80fa908856abe5ab45e74e3ac7254d6aaeb5fcc2f80d89debfaf695e289d7e520ed5e932fe10d97d834b89c842426361d181960b0956b8fd16b1f8c2074f1ec7ef173ee079ee34436afdab6c38bc6f1f6daa7dabccbeddc6f18b1a03d3604f951f38403308357e4c5c7a98de088e984efd88e6f4738100f5cdb76f041afdb0706171c7c3fce6c654e4a23aac488b0f51310c6e2b5037e6faf98d2d11f43ef88d2d8182afad8a5d52d1e80b46f9d423f5c2c845edefe8f3e321edf187c4ef6fdb261ada6f79979777698c31c6708506d1ab1a533d5badadd5a4969ca380845b0dbab8a6c1f626dc1a925bd8142dd9e28c2424f1e2084c031a040189d46fcc15f4a6dfd8124b44e91bfbd8c2a28c3132c33e72e4c89123f390ee6e9f37dd1ffbf097860b2f5ec658a30bdb95d965181bc094ca2fcb4e084d171bfb8535c7a7992ca770d1654acced3669578ee6b61e4a29378eda7753baabcd4deeaeaa5b70bbbb7b9747b76f37697db7d4994648c0a0e894534251e36f6c899a0d05b57f634b1cf13358c2082e3274464e4e129b2cb22083d8122d9b2aba40810b0b194c4182fec6943883044b299556d8803a911555576a8dc1926ec1092a5ba1c518b339e36374148c4d9015505dc4b2d0c20d747a96a0c33c3a2843d381194b4c07fdc5dd0a1b50274b4c2263dc600945693441050f38063a58d25ee840c809edad889da004a7df98cd18cffdc64e2085145a2b133f89222594242165e8b95169074cdbacff8660dba07810fb257d21e828fe6c4e9f0d7bf2e53f7d7b43831c24a5a396074f5cb50de88e42d9f09c9c3af5b669d59ebc93dce49c33c6cf45fa7e94a6ae76b576d544b952695d7affe685dc0931bdec829cda148ea03f1c41bf4b90f86111bff2fc5c8c4f04e665c943197e0bdb86f3ad576dd3a9f66dfb6483520a75f3eddb1aab15972e879e34228d46fe245f928f9440f22cc56face6c973b1cb41be6c507e9ce45e19823ff9e6b2472653f153e727d99fbc6e2eb7ceb7d76f7eda6248c0be7e75ce86ca0a8bcac9647ad9c1523a79db9baaa8fb9a739d497a91ce4f5ec82f4fdd0e529e3ce97b3a7dbe79dde6a52ec8698b6dc2a2866dd3495a1556afe1ed7dd3aa21d55556c686b7f70956e6e41539551b1e7fa7e227e7ba74f2f6ab77f2ed829c5cc57db40d6fbfd6af86175637b98a37a4fac9b94e48e727277541ea77fa3854c98ce7fce4b5924ed2a9f61a5edbcc2a4b9d6faf520cb903eae4e19041ad3a05f1503ab6ef869d56852737790f39499d51278453d0f3dd0e9d6f5b17e4e49bac3c9bb36c2e541ec9237978be4bcb63aba256d71cd5e1d08faad24fdef6b31372faea9c8a473f56e3e4778cdf18123fcfb9944c56d4905f47c9f482aa39e7c23668847f08a8bd304dda9bc211bcca47b5194d6111bff242f3be204db2c1cde99b3cf96d2c79a10ba4dd6074ea85f32302fef48f613e437cd3aa76de2176d9130411b2f0d30418536041095839f850ca80663cac504e9948927ccf1be68929ee86d5f804ca7704fa9e61a0e77584122b68d282265861f4714dd11fca2437b1e73bc25a7115811d247696fcc8a6b004d6171f46578d17495ee08492a124fc8015461b2fbe084bc801162478028c325861d4f9d887f1159b0421e5db87ba0554b9bd75e24a26f199421380308425a060c13eec970f36c0e9828b2c5c410612acb079bad8620848b280b2240b4d6c5861c39e8b0f5bf6c487fdf3fd61438940e3ac11947c23f96e9befbe71fdd02d9501166403bc1356122d58e2042a1c91451aac2d3e6419d06c68ca12269a8b3656c85734f96e988e8f98628fc0aa460bb2b77f387ae6246ce3e443763d210807453f50a28a2aa48015724b8b0f378ca2156c9104298a9c1063853b8483ff21ae7c708113a1a2a2239258c16a282b8f3eaccc7a4b5a60c511c480020523b0388b5f327ae0832eb65024042e9260710fcd0a9838d9c11831d002a70cd60dbe1d660afdf6085463112a75526713ea64420db9c537375b3dc2773ffd05ac614d47e998a515f0431d32f808c647df6a9220e1630c0533f8e8daaa8621d6ec804c180d8e0bced8420aa6d005175bd8008d9c910cf380a2e6a3475978c34fd99c3f3de607c8b2e93e2c93b2552f4f047d8c2c63d8dc42d5846a589f5d7342d5790eb2f1037bb6b159199e2d0f76ee9b9862b799f56c3c3d30d90fd00f4041331d9bd9c643b3206eb9746c5e37363a3c3d41339b9b9e562dcc356d6e5a1236c1382276c40e0a75722ec2c9b7e7d05c444f11ae27c2444724e1f11b33a2081f63801d797ba39173728993dfd81135fffdc6963cf99895698f6e80dd4aa8988a9d0c2bd339f8110686db7e77a5e2613bd8204c83b1db77c0f0c334d8394c831184f91173830f1d3893b71ff3edd26362cc0d3ebcf674b8c9eb80909c9bcccc614c9b382fd1943893fb88240fd5a0c9634c9e8ec951ee80c8b03ca26b9d0454ba0f0247580a3cacea2777a9618875a486219693ea9f86135e8be96e07edb74112c939ceb70e08d7b9d0101196bee4262ff44c5bd4981141f8ceb76b9347f3ed1989df7d2c495ef2386f739237fde48dda394af32cdd47f4d19bece6a052938cb0eccd2e1023035c7bef6a1a11185f29d476cd99e7e4e189c06c5c6ddab6d58a42357738c8e76f3a7f40bcd9d3923fbdaaeb75e58656edc66440f9cb77dc515f3a45f20e08d82b93771ec28431cfb5872b337d5cd4d57cbb2c3512eedb4e853ca4cd56f2d23a45afd33b9dead1d75734a8036b584b9e5635696d6bbddc7ae670ed73773776490075e4ec1e358faeda341fb91c79238e878fccdd2d69c8c3977e8e7cb4b9ec74d8e76f882402238465e30ed0bce6ed5a58e2469edc3a20be5d34d2134608cb0bc278c1b77bf2b71c683e7e1da0f976addb813a7b2197864cd3c73e228f8668df4b2ef5f2d041953e371b6e5f421af4d2b99eb35d9b4a8db9424f27673939cb0d675921ba516a29459fd167f439e70bdce22c2d2d8ee3c60d6f198d9ca970fd0ae137364592e766f00e07931b014b0bbedcf83ccf86e36061f1130c9d103e9d5ee882b0f8c9b77b6101a7df08408957865b1cd5e23772a0bc2587c70fc38d1bceb2ebb9bfe0820b39ea9c4e9a734e0f07aac3c1e4d5391a4aed8a2854ad4ba9a3a853faf3d4430a7bea2d1e4a1b23ac4c111e0242fdb40a4aab805a6cf810fc36be903fc4e1369cfa50d974ea14d6aa4e08ffcadc7c3a8bb7bfd20539dd6069f15627529db85ad656a9f3ab7438f4df0875a0fc06cac3e9397cc8f496957171eaf2042bc3e2d4391616cfe193c55d3c7e956e07166f697116e77a7a2cbe5d10166f711fede2edb37843f0e75284dfe443c8477991d3a39ec5519eb7733594b847894d55d4d393a48d69490d65eb599c8331b12036c5eca3a31cf50dc16f72ee70a8b365e6f8421c2ddf101cdee2d44f2d6eea82e068f958bcfd168fc5bb0bc2e2373c4711fe1667f186e06f317d210e37b1f8ec7218d2e246f86f380e2a5dad6af9505fd852d3aa1bdf9016bfe1d44d37bceb82b4dc104089570687212637c282518783e955432692372e6d38a72e93b48a7ad709d97ce4a52e087f1cd79197bbf1852b3f9de57399beff75bebbf27928830bbf2df5b03b7958fad969db4a874f1bdebec9dbafe1a97861c9089bf1d44753ef56ab885a55447566584314fdfa75f226914e5c4d333625fd04218a8997d4089d975c5fba0e4f26e994e43ea9c4a641299d4a6f575c290087a7530ac0919b3350aba494ec9c0efa55de7c7a21cccfd1684404a6f43408d55f12722efbb6c51433f38eef76662e383a7b9ba5941ff7cb19218c6cf233c242b0bbf0730eb3490d7dc7ca6c4e9d00ad2a52c4373fe7947a6a65484e9dc7ca8c9c7a4cab465e117e9a56172f0514ea4a829efa0b8c0b4f7d859ebaa4d4544ddf6ee26289f3866c3efa8420e0db85f0f1dbe7120401df8e80ef75fa04d2eeba8fb824ef8dbb59732959b26429a526bd352d88569134c93f0ca541a00689fc00840538e89fc0ed4bc81171a4d42ace973492434f6a2771de7e10a4204846886855c93bd2ee761e4f6930167d64d6aae0b98d98474c2291865a35dca0a1231d448331888578d66034d2606ca2fe600120ba358a82cba1f453cab8756ab790c8e7227d9631638c7524bf483dd2389adbd4e69c94c61829a51ee9fc9ef89191a6b4c555659fe717948edd180ba27c370cb893dc42e2a0863232cbc81188676f22a8676f9e7402815b18b86d6ee3d93d1b68ce9ff9a3c1954929657cc2ed6e1b99c0bf3246c54d3fd7b0de4682daa50f11f0ec8e009ee167da316a2a3f70640daed71756c61813889e7e617de1b976eca9302ca2f0690192165cc172ce10a57de1b6f10b51ab954dad4bc9cc5ce2b941d046bcd252487cfac91a495f885a3a3fff61e4ed8274a3a8067ba210634022b926a3e4483e7270c78b8e4a37b6a6f98834e28e0124a7c06b4ef2c217ff219a4f468d4a4568d3a97ceafdd54faed42a053985122fb8088293305e5a108109375ac46e7070b3247683845ea1d6d2169b3b883b965656a669a95475bc80ab6da356a80bae48199b61a292139d415dc9445d676796de7dcb2ececf257e3898be1b096e6b15334c8c839af6854bbfca73e9b6bfce34b288ee16e2628c1174540db75806f3808b31c65e8e4ebb904f88a5dd62a447b0d4c4a8ec3ff286bdbbf2cd762a3f72781a5c1ee28ff7e1121111570dd85474237cf4f578581e3167b963b7fe8bbaae9551a3aca2c61865d4c2e0765d076aa59636e9721b8c3b44a4577dc335bbf21153d3372435c987ace4d75f1c85aa15667d27a86d41ea26f5e806cb9a64a9c9d5b8a821f7704e60dc13fe61a0ed725039678f9d306c0a51a9f485bcf3ecec849b4e22797ba3cea786a50fb9c709c3b070b35f60c1a65fadda2facb0f37dc5cf293ff661f6965f2be9d5b24a3ea6c336d9b66db5a250eee0bcf96142df98418618db562b0a25fb2604e51782d35550f433bfb114c07ed6e094f2d3234e6de70eec89d22aea40403f3f32192c26060666db6afd7a7efa0fd2fb6179c49756ed4b0baaf4e83d2fadda97119b58c0ed4bd8363fc365c2af18cf4bc6f39af1ec3fac0c3f7f31927ca479c943a2e41d73c9b72bb9a6954ace1e2d711c2d71dec84bde68870319bdb88088a9e9dbacce3630aa742f55cea7ebe07c9f3493c2435aab5daddafcc66327693e58a3dc36bf31cc2a6e8e88f229e8f19798124d4041149e40e2244adcd84ed177607b2628229096a0567cb1c49c734e206c560449274b3c61c36dadda85897130766c975fd37011ddcd046e5f5aa554555ca2775f5f7e6f4ba81ba382e843105c706b507aab5ca20bc1ec2f0b4bc2e655f21d498d11df2d83625430f9705b988b0bab8682c9c5fe4009262d9e5159993d400d4c9b715d995ec99bab86db5253ebe7d999634aae7866214ffc7cab36f684ecd9034d34d144134e38e184134e38e184134e38e184134d34d144134dd830d1f9faed2554f43899a8dbe0d6200f30312e8c1472fa7699740edc6d3bbaa4e117e41e322e381d9c2ee79c207b30707d8cb3ca1e63dcf1f288ea82c3fc0d8970cd37770ce0af08cdef78c9ae065d35fa1c92527277ecda3369519dd33a201d71f08fdec5b68162e5693553bdfe6cb5a2500efe2a9ae2aba39c54db4624aed4994e5545c29eb3b1c272a3058523878b0e175e80c1bdcdfdb9184a31bc9464abf8a5145fdb566bef80e3e100509af11828a682d8c989613c3ba821e772b50a49af667cf6448e87e3a194520038a534d094534a29059dd218ea4e29a51406a774453fa79452ea39a52aaac329a594ba38a505a02f38a59452179c52025094534a296d714a07407338a594521c4ea900e88a534a29b5e194da406f38a5945216a71486d6704a29a524a7b407756e4229ad81524a29e541a974aae2b43aa594d21d94524a17d04e37a701a094d217fa423ba794fa4a0784c620c30c312b550108300001d800d3a3061e3b0200801700bcd0c0922a01380300647889c186c3c039070357e3eb3c124772120c244e4547c9854422e920b99048f505ce051289a483e442229d50a41612c94d3970cc50b39659b7b2d99009c964b2d20d8de5e5b3f2bdb81a94e4daa12e1297a0ce994692b09f3099902693c95446b55649b9adabd7cf6d9a696ab23bda6f32f998647125e3d369a724c9cd8c175d31357938973bbd8add4c3671f2dd8b772ea5d8195993f25052f19d4b252b037ae7b2d52be97249974bda14b56a06337646eea83c8c6810ad0c0c517a255f2fa19794d714a056bd10c6ce489f0278188b006565bc9e5e49990c2693751e9bb4cabdf328839d914204f030d2e03b8f3c2be3e29dc724bd92b35954328b3b577c97c33b8f4decccac198087d104df7944b2322e0cf56aba5c44aed87245979456e9106367e68e003cec31662bd3f2a457f3f582f28af21292b5ea460e7666fad8e061efc0676570bc7a3565321e594f87f2ce7b053b3385603cec25df79ebac8c0defbc6b7a35b76ed6493a4d0b3b436b7a78c86914ad0c4b50afa8cb35730d752b46d819ba5383878c84ef9c8156867ae7eca457f4f5629fd7931743f92e7ae75c839da13edc63f2f0906ff09d739395a9e19df34dafa84cc63ab257e7bcc34386e23be713ec0c1532d22b5a14000fb70adfb9067646ab619b9561efbc73222bb3cd6a90ab731e7aa5b9626ad2e0e1fae03b0fb233da0ef798be3eaf1b5e9defe895d6f9025a35f2ce755819e99d83ad3239003c9ce13bff6ebbfb3c8cdfb90c3ba3f9bcac4c7b278ba959bd73de194da8730074403ad84b570c2e195c3b3cc35da1daf9c9b9e4ebf5f2e119ee55009f9fa4d94c3693cda64b219ee16a0820f4932493c9994cce647256c33324a101d4fc24bd5eae97ebe5dae119928f00767e925cafd7cb8767483b36f8c8e26a349bc966b2998c6748353053e8a7cf595c8d64b23993cd996cce6a786624d4a3c61557a3d7cbf572bd5c3b3c33f2a961e715572397ebf57af9f0cc6887878f2caeb6d94c3693cd643f9d0af1cca8660715fae97416579b4c4667323a93d1590dcf6c4201a871c5d5f67ab95eae976b8767361f1a767e73b95eaed774cd8767b61d0680cf4fd76471a5c964b29ffee2714d847866abe11ef2fbc2fe50137a8f338fb3384b7db2e6a747f03403f75c01802fe4be9718be8fbbe2a7cb0083e905d78b7bfdf417aff3195703c30b33aee6a7c7e052ca21137291e590c9847efae702a783f4f271c9417af9fc74af857483e422edb4905c3748ae8ee422edfc74c73142cd48352d37ba19a9e6a7c36063d3644236649d4c9309fdf41758b495d1cbc7c617723fa8ee0b51f57bf9fc7417288da3d1cec835728d5c3b3f5d478da9b2cd4635dccf6cb6cd46353fdd85047593096932994ce8a7732497ad6bf2b3c9f6f2d1eaf7f2f9e9dc28878cb17b35e8f56fae9dcdb5b93697f6edfc73a6cad9e0e8f6f9859d92b8e25c5b0dcf90643cfa4214aad64f9bfd56f39d92ea714d7a48329ee164b03db81f14c74383e53149b29fa76f3251655c7536b3ef1f3950abc2cee68362945679d5a655235f19c0a7774a3a9d6ea7556029ba62c757c797cbd5dcc9e39a703daeb8e29c746afa939f9c8bf3e15c1ccff298de3f99a8a506a787a4198924a555edd34943adda7c7999e49d4d2320a64af16513575cad36db562b0ae52f2f2ed86ef2b405dbe9f6dda39de3892b6e53ed93dbc2c6d6e5e0bf79b2b3e9a99bb7cfcea6559d017cba89a7864c0ce0231f397f42c82e49abb6bbf9c905a0346967233b76360190b13900d354fa5c82c82fb9fcd2178ea0891a9c2ee37551a726e9e31e0378eca4533e0d4e6f8f654f1a9c9d4e5c6d671357dc837250fbf8c59a2c6a74ae49afe22ba6784a1ccf4f8fafce26f2fcac6995f65d924e4d9f9d929f4ebfcea6c1e99dcd9b08d0ec02836be74ecf409e3decdf9717904f404c5bd4d8e017b99b7908dc4ea0768c894b076e7b031c47c9a8dc5d0e2f0d5e80e34e5cda11b70691e14f31a64d04581e1b25a3e670c3ef46f96d137738c4e72f6679ac13a04a69da067710c65651bb5a737f91990999461af17b8f7841cdaf17bfb12a60cfc9346a18799e04fbf64d16c9a29a1a24483e9316550e6da1860cf43c9b4e11aa12924e5c512ffdc4574c3df99081beb8b322f16c3f25120f892736894ee41779368c3c24d8cd0aa658c114248f248f241654f6e85a8c1a893a6bde9aa6691ac7452e72f7e6e00e989521b9c67968c36bce452791485c9048e24824dfb180f8ad34c1e045fb86ec4f16dc5220ca73de9c37e71c0b2a0579472a38de64459d3ea9a821e89c837135fac26dabf4e348dee4cd575379697004ee80a1edd467b7c3ec82b4731fd82a0ed21c73df723e043ff791bc0578fd796b8241a5334a8c314a931652fa73e963dcd5aaa858886f2829b9630e4ab3b404982d82389e40a109f8b212638c31722f21b210641454548291c9417c1a6148b2e0044cf01013491b2f98208aa9b1c3032862644759204e0838b8592025708d165464c3354a581900ce9328ac24e1861b503484f10222a054468cc8201029cd521288bce8e82143e8251a89499051649432be2ae937b6844756654e0feaf6041575c404131cec1811058e274ae9ee0ee4400ec42d206e017101e4dc72206e013901a86e53a8cc342c62bab73cc6dd81dc81b8051405209e2f685e73edabab828ea598ef2a5f3eacafa3ae6c25144a46b788b2b472794c2139356f5b2ae040f3fd51a811542be958a99d6a9685a55558b76dfb640dce2a3bd5469a15eae42aa394dfa64575195417d46d05759b41f5e9bd94aef0a1c334185c3cc2a4b0cadebb0b85cadedd278a043fa1f21071c7b7b8edd59595df98ce94d77e634ba8f0616518b72f214b0f6d402d8fe840f00c7f38b6878b143e3ab8dab6eea53f4070db80bdc0b1ab6d4fbbd23c3accca4cf0371cc0afdbb03392faf488581ed1d98667e40782ed113d6a1f101f1a4ffcca2c10cb03668bfcc5d5f4d18650c36db601c1433201b745e596524a94b4a9f443ff0da3863b7320e26abb673d8bbcd2a00492032999a58cb15726326f5c313321b777b777e79cf29b506a589f06753dacda0c6a285f426d673afef04c7f71887b0c6165e217cb581ed2e516b56bb47ea5d4e8e1d4993c728ada5fd843f1a76171b5b90c51758b433f711587624afab655fa851525b74fdac49474ed66be8050771a9494d24935aa518d524abfa9335fda11aaf4a913579225875ae5222317d56595deadb8dd7aa9696270536473107257ae4f49279d74d23977bae46d8bd2bf6a0101172625ce491eb24e7f5b89ebba9b7af2a4ae4c3b7742b439638c518b9b6fc7ec1989bff98894398abc6996fce2b74929757febf28855deb69638f08da7ce073d43a10442e8c11458eb1b51e51dfc0e4b70c21018302dae90029603847acac8428a1c1c2188c53a78768eb232f23700fe90e8cdce3fad8abe429df301fca4d6a864cc9695494f324434330100001315002030100e8844229150345546790f14000e889e4e6c541b89a32888610831438c21c00011000000001099d10600c98d8bd01f88fe8cd27f7ce3ebd0fba7e772afffa6cbbd3f375ff4fedd78d1fb7bc3c5de72bd5a9c3ebce96f99be0f331f5604956441ea4f5320f62ad49951a361a0e0b1c459bd168162fcaceb06c89174c65447a199b4c390ea5de3fb0213fa1f1b01937ea64801ca0344d109f21999f05c24ae9ae09cbf5bcd07b081a865126c94082a3d48315839e68db57f0384c994192ebfbcc679bce696fc266668d96cba0cd923ac8ac402e55e5fa82895edd6d79e56a8a98a74726e63fb3856690a51b0054295690c05f9ef838d95b9bdfe2a0d91bff6e24efc6086c5a1abcfb1c1fa9f214cd7b1a499ef9881357006b27b01a61481289d351383d3725d76f333b9c1e57c15aeaedcbb6f338d979d22ca3db31b56fc0c392b58c4ce47a88dae8a3e3ad3d6716d0453dd056c379b9ebf9b47e7e4b690b8b5220767cdeb5dbb623cc8ec9687f5fd584fd768894de3c7f31f9ccd21d89672e9c6b62afdf21fa93257c4bd3159ab5db002660036319398683036bacd0d5c13c7291836173578890f5d580b03195feec10302e4139f9b042890102e2078bbb50dfa946f26eefa5460e7dd4d0fbacfa8d3b7ad230b7d42a49ba19859051eb0bdd63f3fc7cd2b2aaf9d57362f983022cdbe9b732506cb47ff24bd21217bfd761b114e5434529519a6888714fd0098910a76a16269d08e6a0daff333ce02ec0bd753564c7b6f47389b83d7c21d976f10fc3721015b44d937c7a51588919910a4ce11ca6f30733e626e84b4711ad398c63476a38dde88c635ae318d55a36ab2315ba6bdc11012da582337bab18d6f8cc61aafb1466cac37cabfb14c35ca7e4f72c69be3150c563a3130b9fa39c6668122cd5bf996e9a193cd0f57ce81db629af6dedfc9cea0e38cfefc389854803617fee9772e5e0e5fc5976d32dabeb7537b54d596c393862ce873eb61e229751575b68fae221dbfe2d9fea0eb9db4bc0a08eb62684801c1471ae68c8d81eb26140eb7c7459fd042a37fa59f7642366b8aab6bd16274198b75de1afb6bfa0c99f7c9804d2960716cf35951b7a8e558eba6e57f2f639c141119629ac372fdebf69e143621f7adb2d827cbdd01cb3c96eace6cb9e7f67919dec88a965268c2b8cdb2bccea39997f6cec97ebb4cd609b288a8ecb666c09a85c5d64365f9fe897abf3ed47c77e892bd932d97c8e193aef310acd57b084e54d2ef377d8bcade1751475ab5c6e95c7f7e0c69b84c5a5426dd29957c0cb093f2850e3e1f04f151f82cfaad37ac375837ec37da6fd837db6f5a6eb26eda6eb26e586fb8c6769751b9ac8eb0098c70bebf32e3d710a34528071360253068bb5181a454f894a787844ec65c71b4e529f3510f1dc2436eb349c928a0eb3af529aab248424aacadabb6b1834b9e6bc42c6fd076e3fa013b9de5950264760f6f1bac18891d3f94699664b18c6c14920783212a837221c17e04b36528e753bf2ce03de59b6a54c1b3f5da3cbb21703886e0538f5125a65b646465580ec665cc94a070cafae60f5ba0ea15884a40a419e13404a63a039f0a228eb972e0dd93d75bdefef0014b31422462c78e79868b5e9b5c3f2874d3207f1b4d9638dd6be664b207227c301a7f2ff84f26489e1c22b1be7aee7147273615e9f54a96f4114c3dc860d09ec4d3eac7879e86fa9d29677a094e3bf7cf158bdc978dc69df4a6743596e5d65b8dc74cdf3d06e2264b7a8036a877528f8a05622b39b93da5c91deb2023f420865a4413222653d9c934797d13f142983edc1fe827f4616ef5cc4607baaa08c62ded630bdd30d88a3e77895d272fbcf5730f5da2a46bc849bb78a11d13f35aaf33edc321901f60b9ba19977e73c135dd315082c38b852d79e0ce7ea719069512b1c142e10aa9d1fd86290ce85c8359d6d103300b0dfdea57b5fcf440225fb0221af805dd0a249e0747fcfbc11299f772d149663ead123b1717b1c698c0e717124bda6713db10f5a35612ed8f013ad98a4ac10af4f4b7dfae9da7020969c51a7ee014c47b610bcee2c69b9e254a6d33704685841fc8abc6e353f29f8bdf65af62dd850e25b80745f21b6872277cfcd7367c5f1c34320eb0c0378888e128eeecc37b32191268765999e60676eb3a7b744adfd5053b72faabb70e1f20786aefa69b1c34c09c0de720c7312126eae9d83d344d5c1704991a885fde74c8497193aae65643589c0eca931184e45cecfcbaedaacc1cf0129cd5565926895975e743c13334afa9cce718f7b942341504d483cac334d3e5271e25894f8d9b9f135cc98c584a4600d089c8ec5f9dfb88285f70d0a26c7e40f7db29bf6e25129eaeea3d1fb6e89c7b7c64249d74dafdce711f01975fe89ea641f748c60c198ae854d0533bf4f7b32fbe4554f3d966384682ab0b9d86553846fdeeac7f71128667df4ea1bdfe6623757c2c006e772e9ec88ca46178de22e00099527f006cc0c39e3ea0fbb37636bb624fb73e8aadc0703b01c2197d115ac28a8b5e002ef82b09b6aadec2df2e828fa00c8f420d847e985fb31fa390504660c6e4c720e33acf9739a83aa99acdaed8b741fa0f5362d05e380d46c48d2d0e0e7cb5095957abd8670fd147400647a13500eecf7b23b47b8e75fc2738ab63a2437f69a9c18332058e6a2805ae7a7c3aab1f5ebd2ef70126a3bf0414dd472fd1443580a1cecfd96afda9002ad40bb7cfadabf9182bc15136a7d30fe2e8f821b000bbb909f7d79bf70fafaa1035ad3d522f6697c03b7dafd01f11ef2b35d20745c7600b4e08b8fb4709680fbada6c79830cdd47950e8cae13c9d57fe316bc9ac39b14e0929837f9092c39d084d042add56437de8d1b1024480592100a52dd6fc1252548aaf1383e91cd271e637906523b9cd7af18d0fbca82652e5b96b2178fecff8e03bd2c05d7b8c6b02eaffd7724838838c690d023d5e9d1274cda674a8285a8e8f08418303e804e24a69a649401504973555165247b005c240a69ab579c92edbaa08781160a3042ef978ef42c06f975e499487b038880313aea7410fe1968ec56b0c44aa8301608b1e7e2f087aed1b2f02f944a024262bc68ee632430945235547864b26d7337ae0cf0ead79d093fcfb4673cd6ebb9aeb73f3f454ca1a7a2e436f7da27c8826177258f7286c294c7590ab9adc7be34cd3ef83f53dc563c3b43049ee7a8293c470e52f9ec3bb3fbca9d3cdbf8ac8e56923d8a754975d9d513cd2eea12238aebc76a4a40c60038488e06a6c97793a5c156247bfc366dde7b2e350aafc11940f265dd6e1fbf0fb7a5fc3a2782521eec78a5b0db3b339d5af0fed7b91d5af9c2855a9b6782a10435b0505677dc5ed2637517ad89e479b963698bed77553955ad85728c2603347af55c5549e33141c0898b5706be7fb44c9f060b4078af70f2290780c3db84e1ed395a855c9676287404458c5237b598aeffa21b85becddd0a82477e403a9196d725f812ee38c23a520b7ab0f53b4681f59c6c744151473fcc367f7f70bbe75daf0290439663870e972abff735b39efc58ca6ab7b5977c39fe5afd911db99abb6c4d5d88d66f540560d2918b44ba7bcfe4248b0c9451ec341ec2247ca0de7c941e17baca63e651efd2160d3ecb7b8a45dc638bf192da5270582573509fe5bc87a96ec68a99a54204a9fdc2ff0495b32b219319c1add1b5bf57b2d1e9b0c3296c3865b21c04d785dd643062b40f10435c7c612cc2532b1ef15cd53330391ee0463468b87af5ccf63275e932f124673319fdf21f93cc72c9e55685cfcceab375daa7a61de358b021137e01616c768ed962448b4c31c7e4b684a42352f72d632cd70fca1bbd13fc6407142756e6aeb2407ad97ba9ada09140af1fc0a61b733554c635e8bfd77c23aa9af3ae3c64f0fc1bd42c1fe726e650398025bc26c4f793a8766ccb67ace910e8d84e81c3b3ed4ee1be651f4c3ee182b022e1ff7bb6f0b258cff7b223963f015338e804a8c2770359d3867e64cf52bbab17f3a1a6514f3ba5f25da9fadc148abe966ada0fc208b41942d5c249d10be4096f390fafdd71334c45d8972cd78c519161e03303b97afd3674caf0e7107a268e48b7401782f84b9431b61090ad1a0dc61a6b2530b806a292f409dd585722a18d4ddaeeac083394d3197d23e02d88e8beda2c75499abc633245c697c9e3b82e1a965a46ab5539e18a1484345c780c8edf2e0a2d7b65f90e39e229df8aa48dee9be1ebf1d50d8409e86a0d0cdd23d1dee0c62389aa834bce8bc806cf7f39a98741e2c0df3f8009d11a6f8dcf8f5e5580eb46661e7a066d042b00099c1dd83fc47975da909b664c55716b71eb99c29577e0ae4707cf1017a8012c72fdd839362ba81ceba073af4d531a297840fc94c2d3cfa80547b8c9ad828db1fe0c2c05af5d0b0e3ea91466fae3cbed86c83ac3b56536e6c2313cb8de141c2349fdaefc8b9e724ae71b7a2baa6dfab82508843fc942f1c25965ada560c8912148599521fa33764404d9876bea6645ad4eeb1f69c0776d41ed320ce8415861c690efed8b49d57b03e6cba8dece39431f25e0fa7adfee48413e56d3b0879d24f624f63dd719065a4745ab2f9978bb6686b113e6b451317d4f002ae5e3312895c19103a95e4fe4a99f81105666315e16cc746b4ad119ca85a7408a86babe107d26b0608a1091c183b6d31ce2ce232b32391314b8181f9a2bec26a2fa820cebb4d5b7cf20ecee8e9edf1668ea97fb592fe520a280711ee9dedbdcb643ed03b857604f21d970923acec8831a9786e08fce52ffd9b64c1d5762638f842f80f89803eb73a415985e9c97331bebbd025c4d1451eec8bef82b91278ed790ac4202673d4806533b17a6ab141f42f772774c67aa2d0a58deef573e0ec98fcb6943a50c4d4287a4bdab130a524717772dc7f9af3456124a7a596ebe5678c2b3a5eb0530e50188472450a1583056db3f2347c51720a46df88d059f15fdce9f463b4c23cd1d13e873d04b5398c16dddb3ce66e0100ce077bdf5b8e3ca1ec34c940d2200fc1caedd9e96aa357558b4b0f36ff41a77e2e30eac5b5f51d94051be388b9b15abdba876acaa61abe85b1d300c3b21a45a048fe6444d21a56a8534c39cef2c2199db910cf414c48505071150bf4256ddec45c621ad5319aa71d8fae8976c840c5abb1ccc9814dae9ccf2762b18088dbd56e897147a8e81602da1a3a46f8f1c9ec22af127a835a490e62ef142e1a5ce3c71ff4bf6e9f4750f22ba5925bd1da4c0ab88b6915ae5594bad56227f161c8e1aa9e906df9409ccff2894da0b740443ab970560cfe57b96063dddf919f7a4928ef0e6e49df8ba9897f2380a25246a1060733ffdd51fde4b7b623124e8586407aecef9b1d21e8722163a069ae67ea9953e4280f4f469c315da2a2aee7d0b0f9ef0c5615ba2d45b939be6b17a275eb038abfeed37dc0b8fc541a45ab4a0ce4df8652503ad32c702a0fde9364d60d55cd21ad73134db76463809be2af2fb4d9652753c6e2028c489373a514f1f3e655747a3a75a1ae8f1772fa77eb76bf8c1383b7ad231a0c756fb38399e180ef450bfe87911c41327e852f4087de21e9ea05ebdcca715183d9d5e146619911f201b06a569a47cae0fe6c2fa29e5e8bf78acf8ed098dd07fffc6b99759dfa98973682fbb3a7a77aaba3a92536737744f4d2bd96853576635eef027cc03eba6b23ca67a36c138003b6368e9a7b861610eb102f45fdc4a1ebec7797ca19012f2cef0a5eeb99100face7a89ad797c437ddbbbee1d4de21edc603c6bf4c32aaf27e5ac4e404a12730a0213533d4ca85d48222c38ff1f5e03bb5f79ca9883f1a2c54bc48504d1e34f05e46fe4fd4f6ccf924157771abf97d0fca17088ffe82fd66043a7b737d2dbde08ff07a85c3eca0e9927ba2b05d9b4d26cf3927e9883dd8e99e95f444b9e48d0f7d8e4cffef7e7f2cf5bb3c72beb0cdb2092ed490d28cf3712a2786b38dc1b84aee8423b4c18a00c1796b38e7f4739f42f976eddbd1b97cfa4ada873a8559284082ba5a8accfb2852e3a34c5fcacff4c3d01427152de6721a821b79aedc93021c94e2de9fbd8409533025c012f6ffba531ae97216a273394fdd62e9af0858f19dc029a43adad5d67c69fcd946af25c86839ef2310381a78320affb632d7d793506c7a8eb97a8066f8489a3ff74564bdb6cc64a90ca67652f612651c1e1ff59de1c5f577bf1a8a7d480d09ac76519fb48af0e67337b9e60300ceeb3fe082c388558c7c65e191d6e10edfc808b88abc6cae77b5b6c90105a3b55abf9f51d698d7f0fef0aad91be9283281766d0e43793a83d212e7bf2ad8c87a9afed8094063fc82751fefd9478f86cb0b351dfac346fe81c8c48f9777e1f76844f41e59c1c1d453e2f70c9b937937366cffa06530b2782d9c4be10ed9e37e653a550bdd0c6d90a3da8702147a0b2f8358a4ef9e232fbae80472c99fa4a43ede289fd25b05bb2e052c0b413708c4eee42fdd22909977d7a68594fc800aea8f95764e30606dee6d10d5669f4721248f3cf7b171fa59d7f088df2d5bca8eda6fe26d9747720d9df704b60a54fa9f41305a1f994ea75b5e021b356b6c1142ac5565633fb2968a06434c848e37596ea03b08e202aee3703cfc5058e1c97d6a423c3181d2abf6d148822ba7fc3777817282e0808aa5c33c465816aeae9b725712212c5eddb6cc65568b87a467c8d06e0567d4ce2e1ce39ee2b30f2474bd9f052b86e18e24ceed6c4261a9a9579c47ca1859de51156d19988f1c634c0820fa3f130624c7a6737c8248ee7f1408c6a4b7f4366803b1de41b6ab8daf459649c68e0e348b2541bb6e2731886e686045f00645160ab27061a5de6a48df685faaab7b75d0da7f46ffe33077c4008339319b24db8a626558a14c7291b39a7ea4db52b314473bf3507e692941994c326a6b1b001bb26e728081dc8fc82e8eceb7be8c20f645ff3df247d9e49dabcb001255e779c6ece91558271a80c1e0cb60241ced4ad20e2bb5f2f541ff035e232897fb32807019fe0567b64576ed2f36fd3483f20cdf2f8d29ece30fd35f7c1a8c84a55645ece9ed60ec0e4d39ce91f3a0853f0608a156330af231a4061ec203cec532a8ae1ea3bbb5c5c6a3bd7ac109c60ce75d0100421c0969af8093ebc43538b13fe00696b5c471f8988c4e9ddcd54adcbc824f616e765e4ffd594ce32325f2905359d985cabd851416dc30aeb0658dc646f946e932476ae6f91136c5cd6370b0962908ca447d13656c8c3e2c101939e75e15929047df9e0e4e4c86a9abd2c44ca129f39ccfd90777d4eecee3edfd78d4c2912bd56ccdc643053d16ccb398cec9fc0ad26a3ecd556fba66f802b0685c93e28c6b2063f362934f9c64aa387391952f29ea8e8e9f7a1d14661a2720b3562eb4484f3f210a91cafca2edbbc0af6ba26645a229c4706855f5ff51588b29dec00879acf03755d10085ef3574a0192258a37b66c08aea7fd1be546bb5636103fb05cbad405a8d905466c6eb162752547c65aa162fbc506b6a31c955a695f9a3d9123af3a0f1ce92b068c7ac22ba9dc6832d8dcb38535e52f2a06c43d7e97288a417a70a921814bd0b148ef22ef5c51609b68e499cb2e6ea56e8912b39f79a35d7a2a8d9a5d8af35e63d15afa4a3bedb3cb97ce42656201512c194b4f81d6cf1c5cea26e16c3511e36d803a4dbf4f5a3d119afdb59721e9150b26ccce7e974b6c3ff6894c1743b9d1c6a61533532020febb3bde833ebed262ece110537a50d20c1c9da682719c6d5d7e862f465ba3d074ea28764390ff5277bf1b36c2b40a08e22292c80bf014d84126334048a4e9d294256e12f525da1dbb8b195f537f86bb2cc2b4a9dbc6b2e04f8de124868cb58dfcec6b78c4250a13695236e357499d9aeac34ab598c7fa2444bebe9e22602fc3905dc4a2d8102d50bb30c3106c92a15c427c622c7118f6c00f94ac2d43d2bdd6b2aeec5bfbd1dae73daf17bcc58e588376ac0ace3cb6e1d1f9b936b0230aeccbf979fed632210170c11feb4baa00196a7f1a7580faa7dbc8459a4c26164032f0fc5c7b2dc51157eaaefa0004cd6f841d0b6070ac4a6ae294a9ab38f959ac40aaa6d42392224f1fe099f8b048f9ebd020319ea33e229d47e1daa02b39eb6ddef0a00850b93fc0b1f8c26bc359f5e04568a76cb3e04f29a1d07cd28be53b395524201b4704931fcd52ac017366d4672097d20cc84d36ec8e1e6b21d87875b4813deda5700bfdfd6bb488c51fb088ba249137a59e33606a84a55233efc83c4be422c2bba2a03b424f6de40875a642b5e4466e2dfb8eabd24dc5e6a476a348f59865beb7addc32ce2152858713a325e57c8579fab8fe0a74d9b8c43a059bdd0e53f7adbe1b09182a85402c3f0deb5afe880a21572342b557f16b4ae24d34ed713fc331f1429dcfbd95b9831ad3aec3b14beeb6852e9073b0fcc8d4642e626f53340eac8507f802c10432c451ff7a2619a8204c76df00413b6f6ca17d7721275df76fbac12ea4efd31a116cab651839a99c7a7f6290f85c00cda5216ffa35de62076ee50047349c167fc6e469f3704de6c2b29e5ad2951e52cca27cf12ff73889083e1a5e2e7a8589a6c8d599396a318ebe68a8e39ce54486d1fd1bece27f413f666dd28b3ba00af059eec5f8726a4f9796326761db34b6b89e0d17cdd9c4f17f73ca1b0f04216a99ac7b7d0d0e09645108d63b23006cbb4098967cd439d9028014d655df082808fc0d3b1eb927a287dd2b4b4c7c99990d47de4ac142f3395b2fec14b4119efe0f281a00d0319ffc4da878b6e533fa7080e28461dab4a9c6192dbd1255dfd6142f00661ebb17cca0827c199cfea20fc85ea035ac1b443c4176f6d77b5967d8fb0b66c01a8e0ca5c40864ecd6780713089a568c0741d3bf296f431377442244763c0e7624e823ae4cd0df805e180cf01b722480c77d872a034dbeaad245e0cf2546ab366b78aecd27b76ced76031dcd9d81a7c04e20a40b8481b1ae407c81f50a8e8415363e5b057c2496c8746277d724b1dc74056a9410b5c2f562e6891a8170cf1488bb28430a09650afa98d303e5066a4fdf18963ceea5bbf5775022dbd88c68ae4c6de87f0955be3bfd41e4a04f55bba41d42351aea7da8e685a61d86e260f933d3438a6a4ccee04cfa0e27562a2dba8866eb1efa813701da51f5ef5432d447d5737c9590acb4c3e455a0d50a752b9ecbee0df44535e7dca026449f9329489cd6f3c1a21899856299a920b3d40f708d3ec70b27c91d3162487f892bb5a48a4e6809feb243a425b36d0acd149cb71cbe9051d02f40eea3038521991890f02d6b054bc8f5f544a64632ecb62c45422b454986b8512540c199f7e58203d7675fdfe4b3ac46719955f8b1b687b9c4a3fb03697b70059fea381da9674c7c34006f1de9b0f4356b2a7c51e23fab9741cc50c84c1340b6340bc859cfa2cd2d712a35c1092de28bed0beeaa65e2da3d1b805ddce327dd6abb8e71fcec3373e1da132969df1a8b39217d345881a42b89b8b55235f68ea68a9bb7349ed0e42019f6dd66cff4f9af69437af324563cc28438398edc289f243b3810711b81d1d8dc7700b1b533a6e6e7d6ed1802fd38236c5547df8ff5fc48ab0792601618d38bc6c1582936edeaec80450e90317ec1aa07e1deaba0e75bb6910248aa912804ef854f59399306f4da0ad3bd164a37f6477ad102f3ecd19bb8b530b4e12a522d5836533415abf01256f3647760cfafcbb83357ce8041bad8b803b6b0d938f3e9236893f39253922f07ad462b8754ee2148525e682ee2841450a40f04e0cbe47ce364c4de974127636e04557be49579963e92b69d7d4c93f19916ac7b3fe78b809436873fb54c0afe5523760ea1837ba97a9267651434d9fd59d5c46a09b0e26e520213457e67448828c7af74467c0d054fcd0d24d0c1bf964b485fa7930fad8e5058560606d8350b3684cc8568e7470a32239034e87637f6921951346ed539dd526cfbf009a055bc2011270f9d769af3138ec3e0371345e2c3d21b593912e69bf5013b86700235a352c383ee1289d32e3a935e99b6fbc0eec36b079ec3fa493712558f53b4b1a1adb2a620c6a83daa3e4614289e99032cb73dbe44cebe282f1de2305d699af65d2fe1c6294d48ade3363968c214bf626ef9a157240616dce4c9532587171082f5631e30ebe78c68c9c174a5f86356831415ef084bd0ec1519f14a9de70c048741c811f9fe485cfdcfef1a085b519e2b5ea0e7e567d030cb96cd89384b721f9d86d043cfebc29cc2e64f8927f2a075c6bb5f4b3dfb971ef296c7524eb51e6516ca8b2b2bd0485efe18225d35f5b19acbab73d1e88b8caf1ab91bbc2500cbeefdf7a16d54aa5899894c746ca2fe11c3624f064d161fecfac13b98e648c45a0cadd9959b07f9689e27b01f9fa0cb6f1c02b3f98a6c8091304801e1dce9ffe4b443f4eedcfa71c04e5db178cd8d82b3ecee8eb6b9847507fa71ee6a1a31e35e5c8e845b1f4722d05ee4c64a57eb8d93904aa1093cdc69dbda376c02ea13ba2f67072d179ea37210fc711a95e11bc0b4abfd083bc4ea585f2fefc19a9368f297c3a6ac1a18239328e8c7196dd4d86c80d0f327b5bc618e435542058ef342ea581b90798508eed255c93acfb643f6e2816bfc3ff9ded2f42ec9bd991a740952870b67b550dc18174a1d9f11ce3bd9c6e8ce0f698c5f0a26622b4e474843002c250dc6e1b2582936a538518a215434e728ebecdf51f39121952bc532de495cba1c87451fbc831536c4607d15c5edddaad63dd7d0fc0ceb6f946d6756a46b0fbd058de3557273db9ab1e00b56599905c9ce175f0d95f5aca56996d5002b92ea16e41a1652aa184ef49edc53754d71c0b0359bd5190fdc2927e84024d7e31461609e786a9839353c7220b3b2c76570bc6093c2e53363864a1f187f439a90701d670458e17dd9226207925b185544acc220e230e42e328cb60e9a8afd9176d596e5ad6d39d25f3c3618a7eaa1b55d82c967894254bc734795f86a32925577925bcb057c538d03603e53d8ebd6b5f4fe716dcce432a1aaadecb7f08b5af2855a6397bca59a00fcbfc03b1fcf531d8983124f6557c076281939f4cc639f77dc199a0b1e7f759f1c2212f21458592697c7b02299ffd7238d40e6cb57858727a18d06c896e8ffb034dfbfa689be0b73dc707a4e3bb839ec2f6b247bdff37a5bfb147a3f2f98bfecb9aafec0bfbaf1ba15b8e88de7e64d868a9ed4135e5acc39e08267287cbde5bc51a492d2c516439505d182ea37d2954f4505fd546804a56c3f33a6bab64b9e3ccad55beaea92bc73c27a518ef187ba41b1c005a3a9300551b87580bb7f793c3c56d601d46506007f329b22bbdd96ce44b67f31980f6c35b6c1986496d75d766cabd405ac9e6402a43c1151446d1312d14e93f55f8ebe9b44fa7e6472489f923efb7a21f0aed3d369a122968928922db3a6e3be18fea35e32fa2a23919a649ce145dba381c5b7c0993899388375de73f261a9cfc7ea32d198c53618cfe8ed3e4a166e3dedbee09aa39ef7292bdfb0059e0928ff88412d1dff323ffa6b3188440623e88667bd56f863d662a0772332cffc46648b707369a5246c3355aa1baac6c3af893f73125bc35077806fa4d70eddc02bc443b412058b4d07065acfff5822bb590210a776f44393edacde9df923dd70e92c303dac819d382a2d7cf43e242796a24e6eb892db01946f7d43946004f098a24721312baa1a9153b693125e8549630ef2ae316580793085d9ead09bfce017f77f48a45dfeb67609228d63e2de63450caf1f1321d67e3e0d1e39fd9038d10c44901e0d1b76bd91b22af860f908f9af42dd57851fbdd4094aa72d459e819a57dfc4a202f67331e82a4d02ab62b36a26533728672cb62ce94ffa58ec2652a06c66c74f2d4a77febeb1076a969d5ed5cf1e64c5292420ef0ecd5ef5a65a99fc248d617b23d303b68a03a854e937dc72d4a8117c4d25aa64737e613423ea5aa6228a20b6b22a02554126f5b068921b182d2974b520f8d2eba067ec160d40b1ae7212c427928aa5b0bee3fc2978bb3b5380417e14b63ea014731384640ad2dd774458afe0708c44443223e3432c0f8ba58ed593105d71db0ab7b830297ba571499c209ff3030f1165545cf1c46ecaf0e85442b160b0d82846dca8edadb54e8f939634b0b3a5b5b669ec20c95fa94600f6533966f3339e39e1d39b04a649f2e3abc483f0666f361e5ecaeda982ef6987aeb3ce6096ba127ddee6acdbab95ad043fdb38e5fc582999ae1416b12458fba602428f3601d407340e506cc867e7c08f7e2128e4b32ae560862d355d75a4979a380a3760824ef8a128238924742af8d4e6fba41989369a3ede5ce92ed2d15e4883eab88e6f99c7eda26a553bc2ecb4fb264ec3c2e58524f22b5e8caf50f990dfcc0e6135da4659ef55a3f63ea6297c848236ba174ea698d4b364f21bfd3e5d28b85745a43d756c9f842c8556e57cb48a5535508825a3f5ebc40cb4b2cf73878e5fe8eb47ab1f859a2c501ab897911bafe3b80d92f7cb57dd0b7f8f6b0ba445c7989f8346cb1ebd85dca5c8a79dc5b10284162953ec7113ae9c54ecb89006c00bfa70dee5f2c0cded1b2ea1a5fb1109a3f3b842043cf7c8b3b3233d761beb89cebeb150e0e28842ab488b24d245cfac00a458147cb43f9465a23c658f51bc18344faee41c02cc5784e52e00502c7d008b250ea11016acf16a08e7f1c2cf1d8f7c48ef2527005b890f04b28e0bb9224f8d294245809155364bda91a2839623bcb14dcd55d42cf028ce3ae741cbfad0e52d08015e3165d096f5db362ce1a647a341773884d0eea5001098f118a6c433111bc3b86c1e00390d613d2b37d93ff748000bd2f0ab609a298f5b70a3b464b7b32d7cfe7860abd809483ca54dee4e40a08f678d4110fd5aa627e447a49c62c60d3e7d5e5150d6a4993162a9d1b207876a9fbc651c6358651ebf9718cd63580069ddcb1591ea6dfd48e40fd0bdfddd18b8f41afad690e25cc9e14647b0445225f92222ec33ecd36032bc7ebbd9ad57a339afa79a36cf02fab0e898a1f22347300ba1f39f97eff45c6693a6978ba15db117af482e32758c26455a19e629865cc64c362b62499d53a3c8e1826c5806bedd6306171a489c8bfbe0315fd184f3db98fb98828d025ce93ab2f14004135c34322763dc8794cb226a4a1848095b625230177919ab68b71dfb215c99afe31ffe5cd10a1effc8e2e8382cfb1ff491ce1d4c8f01aff1f0f9b061a270a6ed45cf1e55aa8e47617d4a5c2e5cc1e1dd8869279bb2c7a72fab4942c666e818c0eb05584a52ecc18c19d0895e18bd216eb70663d8749d5cf9ee3a860f2720abcf2717af90802718af2f177eba4ea6a3a2c5d34bd6dbd10b2341e32ddda11420f8ba7903cb5eff8fba12ef356a072cecffb83316037e85232a31751a8ee09361a103b04f0443d50925ffdfb915d04274c33e20b0e598619b8606f6ea248e02c0606d58c8fea9a8fa0a01da650b66e7371e3352f18a02c42054259418e503634ac06956129b9d86ac0fed4eb1e1080fcf34593952d7062d624cc25db8f97881af5e95e8a54aed065689ff2c84d11d4bffe465459555a237f2b013e6c686c342ccbbb770a8f11a66fc37689c8bd789cb4210a7a9032044c507678a8b8e7ff1acc906b54dc0e8061ef0533d0d53c0e61349c9231d81a2df17f20084905c731d88212a23ef490441547045930e301fde1c2fdf1441027c6602fb8c95415dcf3bd4e4051629c752730b9ea83e079a20e7f62cea5a1959ed9b0860e956e1fccf9e57848326a3c3cf3e21ebc79480b61c045a9b89804a39f414efa77fdb1e2041a99a513afc2caa6dfb762ff64f68adcdc6a88036d57b2aa5cc90d563503b80066db05b8253faa81d54009fe0fb6993275ff04e23a3d6056a3a80ee904d93a501e95df23b287aae5d036bd1cdc6486b56808d784e147ec54898f2bf66ba90aa5b34d21f9b055629b1cf6a439746f7e308b20819798c9bb19ad3f005088865e20aba44ab31e30223d2416d63248fab9f62a8dcae08c5f8535b70a82e78d50ff6492c97e465ea51216f0a1339a5fd4070e1b0625ca5704cba308631165c04f00f09bf1e3706738c63c4ba47ba4832bbaea26f041e74d8d69c941d4b80f528a7340fe9801ff23eed80e556aa824f0f6af4b471c026418a6e88861be9c47da30646b9196d56d0a881c77546c4e28dbeec0216d203f28b684ebf6799a32d0bf52732f92c6551ab25cd080ba1cfa796a167cde24bc514a9a72519f5b68093ad074da546047893467c16c8b220d0fa3357388b75382fe96fb9d5fd6b12e6351f98107da9721e7cd7f30a2da737bb52e277afd3637b229aa34240f7324ba3488e64fbabc14665683a1b34762749db1473d8a519218c8ed82f095845c248229baebf0fa6858907342e36cf757601d48c91bc600768cb1328623b44c4841950598ecb85643a40c54173b0aca1332d36cca94dedfd6807e9345628a5e1102604d748c7241159ef0976086c1f71904c9db0300916659adc4286588b01d0e95958bf4185e14aa5cc03c2d0c6489a1ff2a3675f2280b8148dc4b27b653218cab0d093248e5868c2bc81edb583ea63ecd71cf78d9188fd6c42bfe5ac1c9911fba1bfc00c6a106c22b92d0755ab67a44c43c184c7975747dc77f7c20a14996cb7ce77b6e9d9fbe40a6bfa3e39c22d1f8a8b2082ec3e4a3c1fdc07ca8eece82092165e8384a8c72b151d5ff6d9c703bf40b887f74e8ae7ef54912f6ac7a7223fcecfcf5f2317ddeb31b77e09902a200e95f8b51e4121a61518b9456ac0e094f410cb82ac58bda31f6501a8562b70921db16ddaa5c3ac12fc1cc60d379ca5eba8307e2a7ab7d98118810aaf164b6a24ca72224843ac7d43622dc6569aa4a8b2519912eff31c55c6be7e7cd5372f60192c646cc856ec2f493858e9cbac73ee898c5d773bfc6679219edf20d1b1097076ad41cb3e5604e6e42e4c228f2563ac3589dd74b7ef94268ca969711c68a7a8a335164d5392fe24b1041883a92414c0138f31beb40f849ea575a15890285a40ae31f9b0b4a237e0588d93bbc13dfb3b811d3c021b37295c4a956c413c2966e73eeaed87b53150f920f050632f3c476853ec74c8ea03f63bd858abd034e711baeeafe7be43d778083cc6143b0abd4e5603c12f2aa78977a879bd0ed04e679807ba0d8ece02897534feb08816d34298049086b38f512d4aad5baccf7332b7eaa6df37ba9a9f9c0bbdff9dd55a6d0cf82bfe2c01b22bc37815a9ce65886e014a1e6f28b5d7b9cb6b695ad571beda7e6b00266f037dd687e0adfbbdd25174897e670692e61998ac3d1017c5709dfc4ee1f6c039d8ed8242148e3df4201ad11d4429407f334354068a2e934050d000640fedd00c23241b11460688fa53bceeba1fb66b2744d63314f2b0a5e5e63c17be190d1f8cf3776378ade468ad3047cce34d5ed7fa6e96a4cc7e2906fe9808ffe7ad1fdd43ffd03d740ffd5574c3d7fb20db809928ca5d4d048408614e25494576951a2682ea1049740e6838c3173b10dc5606be1390a008396c2f83eb6e25c230119c7c885a4937a298882cbb2ee8463792e953f89d080ccbb6f50843821c8d7e9098ad0ac33382597306003720a49816815c99d2ad19dd8b1e289b6490623fe1d970d4bcf9067c98616b3689fae8198baf84cd6cc1565f351888fbd548de390c2bc4c44ebbf403f71f7adbe44dcc1b8aff572fc5e4b15cf3a479cb564ffc4d6f407ebb7c94858b7257cfdcf9c5d9cead53cb9271796aa4c76601534750504fe6151148190585c48f0381c03d69649adee925ec0cb5698d473ed3b63030ee19252da07e096b831cd75affa8e6055782406be2bd45a655bdbeef4ee4cdfa305934ae7d4bf81c7a2c5a8072b62615d433a0b71ce471dbe6de0111c35a80d018128edcedac639fef87323d542df3f204cf4ef9c96d507203b3cd7256e0a8d07ae15e4b4b93e166df9dd1a98192c6b136ff910860586b61011fb3886076eeb185ef8aa9c56a930326fb7d3203cb562a57f515a5585c592f901f9e1dbbcacdf01f606705588acb789c279b85d686e957e0c269bdcd5af4a7e018255fdf14b15f0dad615ca603ac5172986a49e8ff799da028a06ce1b0dab81a51e8cd6e000a88cbf1cca76671f535a708126e98198980fc0519fa3d1eb9e0a073e381d06b9acd0eaded672218564615f2c1a3a780fd53410d85ef84f04c0ea7066d1cbdb39cd4b6a84db4b010810c70732f32d08c3943aadd3de0ac8c854217092b0341d7840e97ecd308632219b80ed633d09e247a931080697ab39f48a945610013fd6dd8934bb6de71245c3e8268571af640e1754241132b60892a88b1e5b26e32fa981b995e0b6ff2036e09aa8977be6423a26e34a95a8ec613777c82d728ccb422e07dbd6477a5a280f46ab3527052d9a282bd7957c17bf66977c9c3c60a5714a6f3f192c47eb84818f641ae77370da8de88059aeb1d4a2885246c00aa4ec1bc1a9724792bf9a358fa2e315ffd939250dac065ee3b9440f9eabebfb11847aa450d51e4803632ba199985d809a071fc4c3453058c53fd5966f1ffd3417f160b657756fbce5c4c9532f81e7dd70a2cf463880dea3a2a244e39fb23258ac4f6e48e2eefd174954ecbb85d195c5676376e90f47efb51f70fa082fab0af1fcf9dc5efa2ddae49e549305961353979fc0211ac244003c1d20a930dbb5d58f63557475358471d272de4dc86e4e69070db626fe924f01a999504a7dc86cb24b67357e9a72c9ed60377efd6014b88816cd640ccfb83e81dd803520dce0e2719c325d7f4e6e701444c042612b9f30aa744f17b6515ca5db78dc225fe97600ee32c8af199769908ccc0159aad6ebd3db3441d329cef3fce895d489deb2ca1294299746658ba35d9d6b9d3a404ff191e60640d5f10ebfe8591488a34ec009ab1b16c4307ca78e78bbb7f1fbbeb8b43a105db97a737137054a727ef46cee0a86288f6aa814482e9fdb093d7fc078a28b21c7a495cc27472dad0d9121c4a991cdea3d75504036d64faf7f0450b56850b82acda7fbbae32a7a2066535454663816c44aed10ef07a277866c90730f13bb03683c0783eba54cc263e8318100c467cba329f8a8060900f3be0e108a262413eddc6c42082ceadfa93bdcb129a4f536f5629850651fda1089c346c2be39f0fb04bec7e04081c1629fa00c514041e7d2157202a3ed8c0e5e9ae738c827bb05d6cabccafe3d23add0b2009054a48d69dc8ee3b81a5d88f511f8d2485503f196e7d0ca0f82613edc6b864d49ec140fa445b9574e53a8d17fe3ad3fa308e8098821e86ac0fab46a975f0bdad07847ff786dc58b297fb490f0ba02aa7e83afff44796a44c51285339c07d698b862b2912dfa603fda22e9039bc1a123030dd885625bb4d7371615b11d4ea9c91c20a01f200c9b8cbca09077d507d92687de6037ec990fd408ac87a1f9474d6082b68b07993acb585fcb3c7b80808fa21b6ff1dc1e28fef90ee5b1fd93d7a61f62df42f9e794997ad28ba7ee4861f8afdf444a97bc2a353294a064a0fab251741160754b38b6bd7afd5517509fa1c38c6eb89b6c6ecb85c14d1156d982710186ae370295d6f79ebe3743ed48b065b2c06978e0797311471cc891e87341de8c2aa7332739e4232743dda7dd85846867202601442824ea31b534b8b07dde6bb2feba838dabfd54539d4dd7e681f805831784b20bd9fa61500ffb2482cdf67a431cc3beb42a8cb6207aded5b8baf8ab9f3cdcd2934263fbc95fb0c3749854ee54fb70e47936d04fc8bac45bcb3f973fe99e22bccd41bf15f8d6fec89953a4c7e89d3d9d6cb27d4ad6c400ac8fcc0c3e11c9327cb99e5eb2a6a76a930ffc3b9bbb4f89f2e72b3c6a9eb31e197fc800ddde930799ea92eca5713a00b78de997c001e84ec5259e7700abab3fd45e81386728900c86a997f4bc3e95907e8a3b1bd9e8b1d88245bdc0fdce307729517f09a2a7481b719398d0d795caaa70be6fc59a93ee52aef05e8ed6681d8343284d1510eaa1c200bb4565b57981295029b8605b1f1730c78cafee0d128e7364d83253ad630c03849db23a1068f9a0a82dbcc8eee058e67fa39862bd651033f1745799bdfa88f058934ed0b123e8c71cd1931fd92850522021847776cba3832f15c426c1adb8cf5d71e34f334195e5bce4f5c15f2e70d07f7bbaf43680607c3f157a40f93dc4b1b5ac074260212a51f4593cb1d8013aeae1a22326bbae5e02037d8b9f2b23f5021fa0fed9741877f6478a690944eaf34d196a990c14cfb95829e091139cb362166a0a14e232b67e0eaedb4932df909111787ec54dd7dafb1f51aace7856595fee612a1260797b3c1432b29959cd6793aac3f0358b5c8fafed3d00c6be0d756863bdbdea72d6c9db81defe04801ed88094cca39be35ba59a1bfb31c493299e52ffc8d74b8944db2bfcce259dfb1c0bd08e4623ed827a3cbe676903a4dafeeb9e2c6747bec83b63f0f2fa5651ba2e393869bb40663f95670bd9c16d9873c4a2ed815bd928dda7638f65047322d06047cb55d01f1e5ed1160bb4d180dfc2ee76a369ae3453e649107438e25d14dff3ce95300b4af5ecac3cc2baf9fb34378bb6d4a7430c6939721ef50f135109e60adf1f21e69e52654516a53a3c970a65240a3a8b35bf28dc0f37680478c97df692ae4a4a42ba2dd36bdd24ffc2e2f5e74d9340ee1442a695f092f095a14efae1d26c3040685396bb84dd9dda191198c69b03521dbf734dd15530bc5b028b096e8b194908836666207afc5234dcf3412dc185ac4aac1863f116aa011cfc10f7c703cd614c4bdca0358821d318d40da730a7f8de058c34df8855328abfc5fe21db37bb992d8d26d1a208bb32cfc72243b9765983282df78089855031e529c2222d6de9e6d732fe6936a2621cc48bffa680a62977924c96ec3fbb2bf120007e154662afe8d32e56af9243cb62dabb0e5dad5b7318b3006ebd7b00988a9c0df02ef2a7e8b983c4897da931e0ac9455c3167277cb52cc53dcc6b964912043b6a42c552091229bca5b56b03618cb063eb98d1b30b735a349e4488c439051444c321e6f5820b76890a021fc0dec22fd123f9db80d8ac22fc68dfadae9dc19a0663454c7d626bcc9a646d0cefd1d292611d76e840ba4cb8189385200a1ccbe5ae09a7c782f9e7ed3fe83d548d78e1e3d02d55b144861389741f0b8d068b3798006bbb65c389327a9dd66eafe114c2e753fd7e1d7b5f969e9ea678d3e85cb079b41204281e2988a3cb4abf4b0a720113baefcda58e955ef70f63a680c55002f78e94d9c46c7db0b11861037190a017323640038efef97981855544236c43ca8cb4bb5e56e072827a31cf477c16ca2ada52db0e586eac0e20c8afbc4a7a54b82180e845b00192f50a49a0237ee2e0524348e4b94e083a48725a79e48da777f8a64e3d7c8684a77480beb2f3ec2e1604b2a92b6199ec9183b641e309f7814d2a47774abfe1e03ebb022b9d12eb71aacdd471ca78fb1f6d43ec1056281aa7ff7831f78f11fe13d847fc11392b28fe9a470359654acf1ebaacf0fed82a8e67931c198953313268dd676e15fc55122b1f63ba9662ee4d1ccfa48fd4b8bf815711d5cc526b4935e9beaf177b92f1226b1d442303ca938eb5d2d74344bfca156b35781f8ec898bc097b50bd56f6c44ca516ca31dda97268754dea5e25844ecaaf6bc1aea5889e96523735b1fb596492e06c1aef4e361bd6988948b622a28971b5e87b291e571c614d87b93441e0cdbed8dd30af49cf2cfa4825ac0e843fe3a04ae3e8cadfa2afc6d0728db3ca317cf68ca8955574a3cde7317ad269483d3ac32f7130c51f7e0e13516c0949c0ad9673df707e986f78f8bfbdbb0d3a6fd2cd62bc7084f813512d56e1ce82f525ad5c3a90dc265c8425405fc39b91369188e03b8cc948f55eb3e9818a13a004e0f600c421b3c4fd837a0c3c2a9f450b0e5951e84f054a854fc6466bacb1d161a47f279b01484c8b980f3b1ccd216dfe41369ffcc5ed314a004ca1052dfb3792a794b8ba4c612702923053302845ca7385e4574f978d1524295e6bdf8b77559a3b4ff8f2bbe9eae01e3a39042e0417846f37be98c2e40f48f8ad0b0f32ee1555e4b83b908e8397c847fd824879333459d328244a5a4f4b0c15d966cf0a3facc6626d58c78605f3089b1b83db5d9d06fb9c099c625b805cd1c0eaf14a5e7231b4f5c380430123ca5771f213ef750d55aa552c609ab0194db5632271e4311d97842025701acd1926811a68b9b66d86c9f7c36947b0b0d0eec7b9cc0632749860d5a2c3f8b4bcc1813bda70a0920356bebe1673d8239c40364e507b18fad7512f2156ae66b697996775a26efd07119ba6f44a535cac308394c8c96bd92b83bc36ce9dd2eabac31a9ffc3a523a5f42baa92110311b40c2020434261dbdf74f6cbe9a08ec0e7c437a372ff33630cba616ca5931c2ec321c5d2bb476c28cb97f419086bd0350d40c64052d6c107d64ed4890c3263d23398991ca3c1d09ec50209241d702dd6c506466e19df58205d1a7c9d9b27adf12596e050777d665b4fbb4bb9d7c9b7f0c58145675711a91fb822bd1e272288561a470deba3fa19f8c541fd482c7eab77d22f1d34b77b49bc84e5a2731914acbbb5c5c5e210bf0b84427e43fdb6587b0641fccb07331949a32a1b145132b90625489f9ce801586d0308889d742183e48f058afcfb2d1849a32310c0f6e39f63527056d82b2445d0983475d0597e2789be109a30eacf84299f8ff164490730c0481b1d1d077aa24ea6664ef273da61eb15ffeb1314602d1e1e4f12bd6435b4bb7149f9954b9cdba34f13bf6bb0ea80a9ca93004a2c137f43efe3f4df18a49320de1acc34f9d1fc8c22ced1bc8c5e52f7b495fb4617faadc187f186ab49beaf894c071c3a4e29a4c111087f95220e34839deb0463d6e2d35c6f39accc619727831e5d800cd52ee40fcc4288864067fd88462bf32b1590733399939b51496968d2a1326d857b9ca2d14a70bcf6958682bb473d325a3741c5c0529b8ab2de9a0c723c614f05058c777bd189bf1780c28e90e90c5d8012573fbc1ec041d1e33344469373c17491fb0bb631e38e34919e0ace929b539669f36a794b44e7da37ad0db0f0906387df34fe3810fe521441d37a51b813b911d09c2bf8ef1dab112e2646c361c030ab1a859bfd33dd69399602d51837616325bc2280e4c5ff102a73f1e0394244de73262b6fd334db66ad75b84b9141bae772f75051b7265b2f8e83f388b26b823cbe69fe472a7e89e2bedb30a492e292f519a824358e2c7b2b1496c5d8e3f85a067c276ebf2c6fa06ae3422092e45c7f89b6089ed297113ef0944b9d2d023c3e2dcb9299f3c69e76f5f8164302bd5bf3e10b2c96a29f52caf94b09c8f97d3fea43e3a38fbd332b0244eb4bfaaeb72b70287db83a4674d6a6f87e49597c208250e7164143f22214adb4f5b0d4a1e23a1e9f6354a37c94b6e070a4181cf921bc4eb104eabd6ef4905fda9be6d48c6744498850e577600251314b687ef2bd06adb0888745393f34d7e1e8512218cfd3884da035b85e7bd5b904a0be5a679d8af15f5abf051b68070fd42e7d2ba71daf4bec5ea4f5c09a64d6cca07740eddb61e261061837a9decf5a553f03b17b52f47c23713e9206517a63e5deb69e8833d4a1459b9e9ed00cc096fee57d1b09d6ec8803f93995efd68084353c1070998545dcf2dc1ed07d25cee4d94b47bf9eeb4a13bd3800acf5080842258e797aeda39a2dec918e92113a4c92785c94e5172f61553c03735bcdf5a885163e014361fc2a596e9822027550682e763cc5b4c586813fa9d2b86b680e422e533691686dd38c4bbe4f7dfca38ebc24222a14cb692a760b7c8ecd0cbf99c9363c097e5ef2b69eccd976b32bc84b7895a6c44e92c16e928b00c331bf56dea0ee98e4ea402ddd338beabbb6cfd19bb19575e282cefd63d399aa0029c97201e0e31b1afbb26e828fbea113d606f4c999db24d3b1eeb2285b903ec4473a5aa3b2866b827bcbdc3012f50beb9301d417940d8dc261ea71214f2e3a7e352ccb927663fe059a7cef89d17a1a2bd0346c991c7c2f0add082e39eb513fc21bdd6dbdbd9d062c1104582fae5c7623b03fa22821cb67996d86510aa2c9d51ffc128cdc1dff94648f03790db7e15e7c3733ae619e600862de22e34af569c36fce2c6c344be54c2dfa5c57c8a1bfa8e91fad9fcaf30e6bfb5c88155dce9103c0d6e525c1f6a59c1b61b4f6a83450034849608c0f0dc7a7e84e34e3f765da026d2ebf77d970fe9860589621cd2755e9b01c272d3b8663f8bfac51b1c3811da12c1eaed30beec59387ce64b0e0fea865f968b5da5a0374ee1ab97b63cc417f572d1a453a0b7589c01f1f488efd5399fad01f9aa8071a3ebe32ba3e3038ca7a5d67082a02200671b9d3442f84c586a0955c8f7f1f283542a95bd7f39ef5903ea42ba7da179e5d80021cebc2dba4bb355f848440d8d200a02507b9bd477bbfce5a443f238b5fb5fc8d89099f7a3bcdda5d5fa16c536b503a855e42105639dc10567796c9d20b9574d60501dd67298c2c294cab1bdc01e6158ce455625da88f9555fdb186c7a026af94ded48bfb04207a83f448cf0962024d2f543b14555135a240d8ed5e78f0415e3db74e3af9c96f7e5424699d79a390901cf095994f6f94a80b81956ca89e0a9533be8677fc53b579a005b5445131eddcc13cd85261fc50e59292a7eee096a631671e499bc6bade4107126a9bbe9bb31923fff6fd3cad39c6e4cb9962d7c671a5fb8d973f24bc602ceb14191f92f5123fdd56a6f621186ddd3fecdf95267c983d73b3774cdb3f4adc259847c932e900a2621ec546baf7d1128ec0965b24d29b66c576a3b2aae64f41daa7b8670fe53eae65e679e480b85f64efb32bfcee3fc66bef21064fd41e64b21b05a1eee43361f3d1c0aa4947f48928836a8c8527693199d1e2804a9edaf89ac75f7c7866f081d8444285ab4e8e4ea5ba960772ca17edab8a79e17dacb63f64b75fed35fc5c2314efbcd346f47626325a36c47e27d15805505c80ddf4f477b4de1edf70ff3244167d56c314d58044381c49a84c5cad16f3794686f14cdba541996f11730d84df003091018356af90212ee89501b3bed2f82502450cf1bc98a31cbefc57623fa6719e9975b5435106fab9ed45a24f4da39cce85972289bf75b26daa5fa54490cb551a22c10fcd3dbd3b652e828cbf541a1aa56d7fbfb54291cf3a06b2c03308bc79fb664b517a7308fd37ff5e55ad019abc74234833185592d566b66b040b4944d97e9798e42076d7a3068c7877a13df2993f47f31a779e5f112976e11af51d5bf73e74c139c1171d46b876bab2108972068182d9eef090efbc082ef886112bf6d202edbbed79c21b8f13cb1c84304b1483c541406a004624206e004fb6a99e5ed851317115040c9959e1d40ecfa02c0df04d32cc0692c34e461f2911f865b8d19934bd68418c1beba3d9fa4af77a777cb1e4ce6771542e57a874e996a1295ee05661f295b8f0e518262819d6d2e68b16ae527002dc0785b2ca2b49e3185a8373f78ed3548d818b68229f64cbda00b1b6440294aa9b628569fec066109049f58c1d35d0598a04c809d872cca9969b584e00d7ea88c84837963a206d6c6d6f186eb6eb9d6a77ef88927f646939e796ef8b844abfbfddbaf4711128f0ab135737636adea4de1e20b5b61625af9d2ef9fcd728386a312c29a6ccf3b28028e7be44170f6ff7c362050fd5ab1f9a486005564ba0800eab6feda8627b9aee8e3b676da9f332159701908930d998d1b002ad970880223084dc8691b2049f017afa6e2c3535cc166e9b17371810b0fa3aa41b80bccaf6cda4319ff8069df3da557aa989e3bd9abd867f1c76e962e5af6b18f0d0b68cdf0ea82c2fefd09467cdc6e49f601c19408ce380a03c89bb8eb70b5bac849e9124227705ff2e0258946ffa3c25d6d70b257e7e638027b522d34363f10a405129e5ff375929da856429bfd23ae25850e569ed5f939f23b0564d4f06ea9b85e1fe6688512bb144b4c24c9a5039df3fd070a270489d75e104fc71d9d74f637599b1af7cb2efa63ff9b2e1427bf16484e59e02d4001fb0faae074ffea8d301cc73c424373ef1e8f38243c43c1d31f0b09c757333f9e154079d57f52986639a5606fd79cb3332fd1eb57046b3bd441f28118ff8fc4bc7c000c8fccc19ab7d73ad924cafa94304ef920c56a4c5ab3fbdb8ef14ce0c1070057b4d11ef9ac8161f9c518aeae40d0e0c7a787e0aa0aad51e2aaad9f9a189964650d1f42e737c6aa1dd1d059ebf12c0e3ad08ae7add2009d0852e0cf4f77e1bfcff6833696570bc5df100bc3ea3d65e03c59caa75fa265a95e7f1f8b9f37708ef20e9a66dde79e53bec8e436599d65adee3b41edfbabcfe49ca0febf892152ba90bca8b4895d64b1fd7335e6557073ee64fc18a342fe484992ab265baa214811ed3f999cf19ffc393056e39997ea093c894ee4bd774b37ec85a1fe2979a76124cb374025809d54c53b967a5c55adb482e02881abe5df61015108852d3364b8515367936c85fcd109004d78096e0e5d4686b4a681e65771212560261115b0f4230eafe74e620ef8c19e3fe30dfc32d8ac12454aeaa13b6814a17cee156ca9999dfbc8426ae43c7e85ca63808bc667d5768761a0591dc6ff8491606768c1e93fa95bfbcf22de9f4f46b681c3265ede41b4f54eae8372852e3b16515283c83c676a81a8db3f47359de463e15979b87e10725ddb5a3065eb33b5751fcc2693e2b9aa1d075eab10fa8ddf8da5962266707bf70da59b07bcacc6d0b2017825bd5cc896b7625789271f1e8706fd860a0226f9f8c42185b732f05712719573111ada044cf947c94d3b297be0296824614be21d26a8a36e82781822da14cfa6cca0448b83e257ae5d27675c9f4a0389c77fdae21884857a01a352c5d05aa127b41917707dad1a32fd4b29b8d714798c4f692c3546a7637513a3002981d6d4a5ac8bfa3c51b5a228e0d1c1da913736c6b2005711580aaca14de6f9f7de856524a34b0ecc6c6fc9132279598c057a9b7b432d793509141be38e1371816504e8c5f1128705c67f17460237c948aa4382d45f3c5f03e9bddb174703c80ef302653828d9b0f9a308eabed6e184b8b8f442f0288100474aef6c5b364a3038e78a23ea0344bd2178910daddc3f8a6a3048378c57420b9a6ac548d739834662c0756d041a5f1094b9d9559cd8a033f76e5e768df4c8bf6352637a90ffa67aac1ef7a473a45f994eb695572d84e9a08892ad887e40dceb5ec809928043fa8bce220478338f8b80c07d358e0e2f3e65e365b30bf183458bda63e8402da9c59724bb0665f0d66667ebfaa0cd86c8b8585dc518332d7d8efe661edbe5a1832ef9592ea5cb51bab16e2951610fde931aade29b20831eae168a1624d7176d19cc3008f6c5001d49693e8f39f70078916116fb8bb4910c5f50c5adebd0e2d100b63a2de51514399cdbac56dc37f04126983c28f7521013bb4b847f853ec9e68082f39fe1fdff0cf38965f3043410155cafae4f162e2424a340ee2c86ce5682235a25269e50e7e8b74b9ccb1b430cd7fb328987811f89e5d05bb16323b6306a1a972ddba22cec6a084294a824fa3607ae48fd30e5c70bea508d0a7e489013035a7090ddd5eebd5cd603fa72f9008d18282d0042e93f43812dcd44b75998422642fe055f7abfdd6b04f5fb7953ff84e08f444b91cb5bf7aba7d51e13aee378d60e03cc59575c1ba0f67d40b04dab90a8176e5b260c3c0af7b55e246c001cb8aa0755204d6292e439f53eb3cb886420cf80a495d594475149cbdf26462ae45db60ed602c19ecc221aaf1c18a27148d40098811d9f5ec8ccd4824e311c6bca2f49dc90e5139c4c2e7f9432b91cdc0eec74abc879d78740cce92de9894f596a9b746776344e7eeff3495f386a21d260d901833fa5d4debd91512385ef1fe221754b2b13e71e0a2ad8635b3eb08d674aefa62eb0df1986415773d8419ac65b7929957cd3f06654a573e113677fac4e8a40a836c4f9f0f876f63eba339c14bbe54f4fed0f2655af47398de6118bc0b88eecab71514fd755efc140dc27df87ad707b191d57005cb476b2e7d8563420e1bf6c86722ac4acfaf0cbfb236a71652f432aa61fd493505bc8f0d3c303d03ad4535c3bcc4169d005d371dd182056a9108ad1f2a7ed94dabfc5ef140df441bef29a494ff3aa102ad6de36690e50bb24d3eaad79c2e389115bd98da93fde905f31138a4f12ea880f59b9cf6489c8fbaac4834b040c459f3fac43c6eb07933c3ede2f320e99f912715188342c3cf8db44e5be2c5a64cea9ce21136420bec10d9964272374fe8f0cef25b714624223bbc5c5e2401b03de1af270e49ab185c1da6e95041b666bd67031c69e47851587682ab091c85964d6f0180f957529de3c2f9b201215201ad64a2f0292562da7201c1753ebbb50ecf340efee467710bc1f990fcd4c4ba2a635d6ac436b34cc118340f8862f54762b3baa0228c15f857ee0c5a17974f09a420861d40ada1c90cdcb9001a37ad49abb59008afbd639d977027217e0e22c339748f4773528925c9f1c42e66851503f0932a31f4c8625705a8a8b8da670da789741cd929d03fef884e769880b3beb6a009bd0c674075ade4d6b4e29514e87718f8db8729189f98b9e237e19d58fc7120c3f19a241d2175e7b1e628f0b1ee8a6ab898cd1f1446c6b086adb874e5b1ae2d619f5160e15bead09f5e091f25060e3fce9c0aa154fb25a39c07a849fe0d4aa9779fe3ac7f3b1d1986368c8f92dbfa7a14e52baac4826a19b116e0e5e75a029632deef0a869ada7bd67a6a6b3e7a67f184f74a2e17f07cd790824b7f45344417f56eb697bd11a917a174aa2a317861b5e8b1378af40494784a4297540bb40308bd866090e113765fa00a88722ce0e7125447782a24a32c760afb5325e7314114ac7cc31dd9fb817eb2e53f87087087da3f5005a5d87ff61cfc882dc1590b242d61b190bab098b86f0fa075fac1cdf7d5336559183baed55327fc382080ec31bbdafa91384610869aa6e5b8eaf75a88405acf4c2f1a0e9f92c4def551ebfa2dfeb6c1656d615d9e273d790e9cf6310b50ab9fa01f904b72c249c3d552116eed8a2c40ba7bb0600c53a1206aba7e277858bd78602559568e1d6f60cd42493cd5d55f3f8eb34421d656912503cb4351968529efa526861d91f1a630ce0cae7e87c927637c1cfb27e0e46bc08556cd869bcd54b9cceb6ec012496d0e14ebbf305b2b3619a664f7b4fe80c769c0fafde5abec480c144e3220546dc06e454af0858a2829437470f870011782e62a38a5ba448eda2ad5afa3c5e2524594cb452d3997411e76f591915ff2a909ec48a13f3b69faf801cc76c95f306418aef5fcb08089477980a38f3dcec4e4d1fe0499668da648c9fa22c37b4f721594e2e277874810be500bab9aecca915f0dd72cb81b296b4b5383b829f239dfee168d22174f94e1d6df9f3b4c6e09c14c5a3f1da2de7367aa4f820d4395a35383a384b7070fe0ee8392658e9b7a3b59caf80111b4aead525f4ea4be5342cb0370b1f2e5b0b72c27c794ad3ec8cc14a04a10d5f16886192b36486f2091d2dfa7a5183c673bec0ddcfa0cf4f1c4883eb83c12fcf51a4bd078e977674cc686bac8ba86dd0b848cad149d3e9bb520be97d8e949f51c567e5b6b10340784ab4290feedb0f50b47fc22df6253c53b4c640dc49e3da457117a691042707e01cc9dd5ec369de91b92b2a43036ad8ef9ea22dd84307b09e4ddb8b2a5086eb34e31ff8a8af5f332c9b81e700bfa9a3f0980c259decb14ea3451f283ed13970a1c92dd005162a95a36980f4364e971edabf244ac243beef760a8b6fc2433b145fa0f2ef43dcdca80e046ad4fb72b7d793a2918a13ffed562b98a40dfbe5028501ef1b9f18946657991493f5a4dd806ce32e5e813933d53ba721133182284b9f580a0b92407b9d1ff00d4a0737813b9d17c13e720774891c20290078c435376a34238ca577dc86443af39c002c40cde37f9e12ad6f58d8f85f6726e34514333a806f08b544e47e887e309d7881dd5744fce52ab50f9678b3e27ab728b14ac6518ef66e92ccfb78156d2c409d3444ab87415133e0c1733551ba3e837c3330792b4f652bc602a7371a2b0c1c71c9254d603f2826119b9550f655ae3f09441646eeb1a641a2d99b976f9d7a4ad2ac871db94c2fabd8fde6c961e09098b5981df01363b6662a80c784d753baeb7fbb5a34f4a817b3b341f8a63694b18396defe1d804b74a0b819c1d5c145d4e98dfcccb4c7d8724dd201ce1d65cbdd0b2fe0183f97113be636a0ead56903177025415d9ecd691e74f112c21cfb4788e5b6960561aeeb8e8a44ee02614e946665aecc98422f6a1802c2dfb2615d807e2e52635d07cee01f179e8d105fbbb6fcc6c805ae6f537c638f987159b2baf5047e5fa5cec341cd8f8d251908135e602a38b0d16f190a6739a4236cd87e927f107728b7709ea83766fca9a7e7c53896cbc8bfa3ee3dc0ddf1c5b3a101a8828fa2b32e5f2b2865cab5bbf7d15b68d7808a0b4ec298982c9ba3e725f6dc02178b0ed7776e15d8c9742fdaa39cd8a931728b1439255a40bf7829a02f0f4448023d344880357a0f02932810c3c1f0e6500a61be2d4d707e8b12f39fa80f435617a0dec489d97bdee79b49dc443a9423904e5675849c89861079538b6ea7dbd8d2fc532793c836222238f8d59a4c6013df651b46fb830e6d09f2f1ee6bc096bdb049a7c5caf6d1d9ab3bd17a7cbde43cb87b5bea9aa0676ab8a8bf4f13c5faabdaf9576542dfc01a0e006ba04bf30195dd98c25940eaae111ba7a9fcd4f883efdbdcdf035f5f751199e3001a5501e69382f31a30e460e07306796391c9d39336dec55f23808b57d57fa1df220ab5e8b0236232139e47295afbb0bdf929f163e6c6ed9b0d93b19687ab369431e15dd06902b43e6cb7eaa4329960a4f5d46bed862aec5f2fdaa6d5781ca64a516b5f96f7f25e5453704230dc14576cba660fbac24fafd51019c26295772ed71cdf759e8aad5141dd8ee035e9f2f1bb5a98e8894775b34d4a47463dcac1e322926a46de5c36f91c9e371d0a7fdd7facbeaa5b8737601d660a350670bc18c64e6be4d21cfed52b6c6bc438c78071abecf5562f979d9aecb3f8df45877e7db516b44b4d2ff4a938260059b4a4ee9bfe2d4bb59df75724a75ebde4437596d9043f31a48ac220fd11c25ff47d1205150e14d868746700d034bdd053d04b000898fe9421925cef6c930f3862d0a44d21c39d9bd5f7ebc7673745e6dd1a184d3384fd0ba0b695709a5835ce7fc02a14bdd8f51ab4d6c12ce83f9ea03c98921872c64dfe57a6fee5f5a6f0320460b646ec8741db515a3cf34ea0ff1af3135e073b3488f307ff6a60d4d06b59e44ff82bad1e638aac6776aea5103f44b7bee03a651692ed0d115cde7f4245e879fc107bb729d7f2cb466917acfba7a2f04583105430e43596bde25091286bb3d5d1cd450862ba9870c3a6a1cc62e6c90f1df40d9e49f649df4013f2f31a213e9d230961b69edf145d2b59502c187fb8bbb32f0c9651028668b757ac13b14fdcbdf39078118d2e0bf84376725a4b45ec74a26a07eb7ddeabb9101af0abbbd8877b1d09ea789b506ce5d2b82896735f332e78f4dd3dd1aac7548a8e9de55a64dc5d7929faef9917918da72c62c19bdf52bab0d4571408dffe6b4ab8f831412734fd1eac291e7e9115b1f763ddc5f4df6a88052fc09a938cbf3c036c9de3d15a98386fc0cdd38be30a9e18a07a5a1086a8e4d283fb3d059749292139b2f5d6c9a42f05219986246b9f64085332c992d9975ccb64704d0e71f2ee9d5c3beb64ec476929ed0dcd26372fe135b54cebab0a4f56ea37db553e072e44fb8c74fe40ce64d873aca50762939b63931e080d6923ddd712d214ff638bad99b8a74c5302dfcac2a8fd6f594b13a6500395ae1a961d6c3ca232730bdb1103d6806e5cab638e77b8e51f4855d600c1ca6bc1df9e7db056fcc997ca5cede42860391aaef3056c2b81279a5705edd16968e0d521b773aadca604e8b65b271bd4d62d066be9b83181e0268a74b7ec75c720ae106eed70dca0b79a315857ca6d4a806ebb75b2416ddd62b0968e1b1308dda2f51c83ec7f1f064ab09239273a5b39e0acc657e6a1022e288159c84cf5d539052e470caf2adb45c4daf9c946e8258ce161366038fc1d6fbca1ea11f88fabf997b1415e1b7401259ce1f5ed51468ab8e903349a63d0e6cc3d075c8544689a0b9be9403eb01e283ff114929fb34e7d19bd0a7457f7e1e4785fb348dc69b108be7feaeb636d7a130fdb4de1228ce15e13d1b5b9d78c57d5f277e1a19ca848896e4ced12b65622ded7a697bc7acfe554786c672017330a6058da260ab0f8d934201596152a40341b5a057aa55153e98188fead6bf86194c48a7115d0a3b2e0972b0dcf4934aa366f87641fee9e95d6177d0854c1da5f9d8da7b7c77f9962617c311fb5072df16e4a9e2454a0599b90f16439fbbd585486bf012ae6c5158c7492daf4d327f4d7e8fb054cfa27ad97814678115aa4dc3c2d916eb88675bad1d08107e433ba306fcfee2b983fee6f6ad29d0de8f3ee46dfb4a00a1788d5c2b537314d539b6f28a032da18a82c044ad54598fab0a06d9b3651d38259fa4d9743a2d5d320dd5f229d1b06c608d4c33e18489062149a70767d63fd95bee21b6fb21f53762ce46a7aa8ab417f27b8969528d858d7d270d60ea83a141f48dc5cedb8690e4434ecb3336e2a7f6879862cc3de4a56ed87cf3cac7e85353766442f37673e58efc4ed1d3381f4234e77b5fa9533742b3c473441416a49da9199b88d0d153e6e7d0231316164039d7162c67e6be3b1d1dc08d19b0239b2c5d5c32c919e4d0b5287b913c72b4f34832c6c6fc26bb3ea7f46cecbd9eaeee5fa086bf1567b31b4b2c63c619b7253462c1365e4675822af0bac5d229473294e07a4712d4fd6d0df4d31f46e7345a4346f715db150235dd16571b66e1cd6b1c2e7bdc8545ee36f1a20a86a778e44faa587b702b5857f9ffd6c7cadf2be0a5286e49cced358da6fdc4a62dbb0895930190a9ec522243632229c99ca064739cef81ad5ee24de716443844b26704fadb92d86112560d0df215dad69c93f26f6a41f6a192583db7b97658c8912d737c7f568dea39f7a56201fe67764a35bfb99140fa95d2614c9248bb1f60e348a47d68177777a731ed5339de733ffb9659baa5e924fac1c7116e4241cf1adc8d80c61935d5672edf8602f28abc2bd2fb25773514e08ff6d158c1b5b609f23057cc002ea49f2705d5016196d3a8d46fc0fb25dd03a6037c7e73fe0b90dec29189732ee6d604f4401027cd45146b188fb80d484e059219cc815eb954f7b7f086ebe4b0365be56acba2f434b7c4bff4d84762f60db601adcae23f4bf9f9a88d052235bcabd032a07cc06ee062b1ec9927bb5527d977becea25efbd6a24ecd2a7d8d6a39fe827267c3778c5e13cc221ab2eabec9c33d1144b9cd32ef33a49e64c2db1f3de8fefb28a77544ce2234c8a2b8e1c39a79939e72d5da489b49016c2e10adb41389cfc4dce3be3dcc1e1ec557c994fc277a3ff83e49c9ef32d33cf3d4b98b4239ab0cff708a249fb766d03afb47cdee9663027e1709e795630e7777884b40fec64b0833412be2e5772255741fac85b442a27eec73cdf64d861308d44d939a724227b5449c361e7f4a983c49779d9d3a516c23ea48b4622b2e82337222af211b1b3c7ce1ec497f9cb31b0f39b77c4777b659974fbab688a4234f18ddea9393e57a7035f4aee06658f8bfbae7ab3b9491a9ef2089364e855f88b44df37e77b85249a22b3e4b979cc1ca5cca4b9c15200efb03cd281df39aec3b84ef06137725ce08d171cf227cdb7b089fed1127cd6ad8f5e144d6cafbfe8c1577390c1e16581312c194c8a2862acd125365663a704fb9c33ce307c73ce39af2136e8616f44d9ebbf2e8349d773a0f4fbae5853b0cfcbf964388c4f59605842124cbf6892ef83a229daf818639c39490099f165466969d71bd862df64d8f8c80c4e7064392b5f71c0d8ce000c78b573df647c1c9edce4f1d97988a6eb56e831ca83be8f175de4bb9f98b0e4e20bf7aeda431554bf7a45b6fba77ad5076903078a5470c0d8089e436b14f2c0e110be680a229a248d258358eb8e5a72ecbee2a78de0fd800d62c91d4c92008756f87f1f8d9733334c9271fb2dcbea9cc8c2fa7db1324a45b2fe0a2ab74020733814f2186fb5a45436a52daa0f56c8a135d325945b3cc333ec22afebbaaeebbaae4fae8bc17686a1ad9c2cafbe2eef7a4829871c3206cef8322fea9f0c31c2c6de30ec185531d6149632f663509125e69c734ecb9a36d3b22c6b5a73ce39e7ade9856fce39e79c96356d96e004b171080e1079f968673462c6c62146c858ee648ca5ab5919b232c5a85d64165dac5b35a2e28bf5d985cf7a6c01339280f5eb56bb2005353535353535353535353535353535353535353535353535353535353535353529a03da5e4d1c216a796b2fdcd22c1178714d163e3902278ecc69ce88891eb823bd951390d0dd1e48530c45004d1c542b16d022bbbcb41490f0f8745ecc90978278e9d3b6c4f2804de5e59541556aa9410fb7de06d1baba44b656167a5f23cf072cae2104127e704c4721c7879c6aab8c0b3b34262354dfab0d82a0c3d3c3b94e62c2185d2b9a2113bb2234da67f371bef824a16fd9b4923c4798418ca9984e8d273b585e9848cbbe69d282ba70e0c62092602bf730808fcce231ef03b91d88143e7f712b14423e67702e180df19840ebf13053998282196e40c0ebffd8406fcf61466fc361664f0a7835892a71b7edb07317e7b880dbf5d04061c747e9f2096a46a01bfad0205fc360cec6f0f01833d2bc412cb24e097b580805f5ea286df06e2057f928825c671f1cb4a987e590934fcf213607e19099168e2cee719c412a74abf6c04e9977530c32ffba0c5bb2fc412f71ce0974760805f3e41017e590523ed7cc98458ea9b76e9b3f8955120c0afb4c28b0cbc85bfd288cbaf544200bf328901fcca1f58be4422961ad52eddf22b4fd2082b6770650b2c5fa220969a879eb318e408ea6ffc42dc82e5632096a64dbbb4ca6fdc59894c60e1cf88a5a983239aaef3654413f694df48a40614bf33587eb127bfb78cf28bc232c87266f92b6269eeb44bcf52b6d3d9c0305da211002f8500cc036060329d18f0520780f7d32107f0b264363880973600bcdf0cf08a321bdb973173ea12e5b901bc3406783f1b4e3cb6cf00f0b2588a5a0078a902c0fb59b00f03bc2c4d6f12005e8a00f07e358057446f6cff850c4e97b01e17e0a526f07e34e0f4d83e0c7859fa9cea12962a819792c0fbcdc0a994edb7002f4b633807002f350078bf0270cf887b6c63322cc04b0900deefe50693b17d19505dba54edc2d3a5ebd42efd0180970a00bc9f0b78452adb0f513400e0a51f00c0fbad00af08bc2cf69ab1563180970504afa8daf46fc3025eaa02bcdfcad45101756c5b39edb2d3258ba65dfa29e06511a500afe84301de4f34e987025a34b67f025e962d14808bbee963fa30c974a0a04a65a89e1e93ca36f46536590fb2538693dd1831125f244f26443693c9f49c4ea0caf6435561a54a358fe6115fe84d10724e383b3bf1457a95edc6f55016501a3a4365980813e95259d859a9f8866fe28be42adb4dc321824ece69c992f82231194c06980d4683cda85495ada6e202cfce2a4890ec3a5d47b85097ce952369244d7c91b7d735731571dd5c36174d121cd82a0c3d3c3b32e28b647b55b6dbcc59420aa5735b6c4b7c91d94e7ce9cc0ada4c0e34207096b0ad05147c19db59d996b29d76e9df17944856b2f1dc49cbc845a62359748b68ba9399418aa43f79763113649a8fbf23b31d984ce716c0ca774a934175d4e1b17d002b7f33218cbc1d7c2daab4352411677891430b2befede093bfd3d25236c6008207c81e5627e021841042082184104208218410429c0015262aa354a6e1100b55f6f18371180887a7ca41388785b00e874c845fb948652392e78d4dcad51a1cf26aceec57ce1aa97663ea449475b6ced62f2d7cf33b31e2bbacda7815058b9d8f58ddc55867561d61125b67996e148c324f16fb262396be76c19eaad103974c1e532d5032606102ec8b68d21e0f23322092acb086e8821988c5ce3fe67505b1dbb9edddbdee3ef74f88af4dee1efd35cff33cbbb56f39d67a679dc3b1dafbdabb6bdb79e60700425ead2eaf64ba8b4c9cab6ea3687a468616959336d22107de100435b06505af32ed97af813c742d5b005cee37e6f844f7cc1bdea3fcda09908214058cecc2816064970ec43650467bc67167efdbb76d9bb7fdb379db26dab6c3f0b66ddb46b9b46ddbb6a28bd9ba6ddb3ef5a23eddaff78eabef4050b674311b9881577bdd42aea56d542a1489e4eb9453a638c43a96e119ab7631f32dc324eb33ef7098efbeb1fd0769b3534a29bd610f34daea1a75134dd9f62dab6cb77a9bc762ef22741226bdc8c075b589f01b27a761d03ffaa67dc417ecb4b60d873b32b058921e3c94acda9252d1d47645579436aa2d6d17ec94a2240bec3aa6f59ee363bd1a6d0672f7858d9706cb711fee21eef351c5147718ccfd0593b2732e2c771a22779868eace711cf7c8ad38ee1cc77d0e76311c1839fc701c17c23ebfa17f3e95a59bf181dcaa51f2a3fc0169303333333333735ce96c60afdea08715808d436cb063b717ae6398d2c03843c9d362ee623466f666f03192113799a48db26a436b52e7ce5b200f2cdd8c09d200bb88b6d32c8528649da800dc64241c62bcaa41a3e60e7a2cbbc8c7d7e34e1e167b7f613bf65e124ddd4b32c5b7c36031c67892889060210c3be5aefd7ad7b04b2321f0520eb1abe86678a00e693fe0e56be71ebb1837b47b07e07c98522ab1d8f9510987588ce001b21a652a95519a5da357b6d2cdb8a8ca6ae76f24ae6b5bfa7da8f02c2c18afb81b8c57d1c5cc73af7438cc5597644aa6642a45e9f7899a65644aa6e20b653b6138d5898a6cc17e656831a2a99e9429a551635087a45aaa4b943e1cd5d982c3dea29bb1c24a231c62d68e6f6bc17555ca70a0ceda43a5c1214681f8827d02910536bf2ed540a9e8f0ea46d58daa4f8272e64437a34149c332dda86ef0e218cd9dafdf3d7637b04ca3de034c345defd3108e1e7e225e757747d1c558ddcdabec6ee71d8bfdea4c7433365087b401ca96b8acafd5b61b86a25d67d94b83b42c8b0693a48d8ff700134dda65c9a4748262e204974497a721ba88d6859517d546b10bf61335b28b891a19a5463ea9915d4a9f85a28bb12ceb05cab3befd72df7e6717c1ded5185f4c7433385087b41e78bd6fb72eea62ac77973e38c4de5569c3abcb2becde0c3e0a5efe065ae0d4a48d0f4ac18ba3c5a6e898767b8e8fddde1d783ddbf96e40f22322235f911bed2fb8246fc2d143d165344da65db06b235080a67547e96234b0032387da0b26e5b820b0f78595524634d10451c92537447887c7c948f7b0ed873a1bba9e74311a2879803aa4e5686ee44d0eeff45ded7d1fa6bd2c8381ba191a783d182e6cece18fb286f82eafe419f4ef5bcd2171a2495aec571a61435dcc76f67ee0803a1cb6f3efaafbf37d22d1c350953c68bc1a2ba8b208e20bf6af32109105760bbb49e59b76c1de55c641a1360b94335e3783411d92ab92a64a1e56093e1ee20b162dcb54c6b1d81988688a3fb4cb33163bef60d23cf6824b3cb40b76223b45782c167b2c761918efe6bb7266c62e125fb0776dd48fef3aafa2b08a26edd88f020508d45d0cb6da6334f10b83db754ccbcff1b1da29e5109c3aa4ddba19da19bcc1819246f2603923793089378d358d79e8120cbbf07528ea4ba96e54b5e090b51bfcb0dc0cee0c761743bb77eef85af5ea0fd2725cb99baeb6882ffcac6ef5ce60f90577c3d52b8df8c1210673234f2a393268753ebb14eb225787c36f500eb1d3ee06066f64200d0eb1ff20ed06f600aa78e88149dab1d360924cd17a5b544d32c162d288bce9520b76e1bfa044be222223bf217699ead2c4380ade4f45d4f2d8298b7d2371b3366ade84657806ecb4fe202d0ed751c32e311276c18ef1b0d877586c89c57ea38e128bfdc2588c93588caffdca6ba00f939160bcb298d6cd90a00e69299632a3caa07a62f3c4310778607384052c5882052dd7e575c99797671bab715608be4d491697d8b9c3ce120e76998f5d8c8c3efee070c6f90cb35a20844bd2e688c84891ce61520fa229061689e8827d48169306e11eda810e60e74b906f3a279afaf3dd5956de6bdba7be2e50869a8304632cf529bacce7643a7636cadee0df467bf986c3c920e3443e0c66909bf0f5e4f40d937e70c963d29d3af67acb5c3ee930e9863ce7cc2d8968e2727c3af04a1da4bcd6cd90e74b1e4e32ef710fd6015b66c3bc20b07789b5de3213ec1b2e01c15a671e6b86589235c42442204cdaf41702afa841e0bd0d80bdd266eb38cb065fb4977998c752624613e8d6a50fcb5a49504cc1ba1258dab04523418fa01ae34b762aad256d346537b4fd707cc3377cc3375956bdac7659e5b2ba6555cb6a96559a552cab5756ad2cc39149bb85bcc71895606354e2aa8172df8948e533440675313613cec4648b2b19fec1e17574b8d43a2d4aa087b6d06523acc53f6e827cb72f67210bd1f4dd92d4faecc12511106eb1d6270f9a194474d142b2b0feb9d5dde24826b03c3c200fcf81ac6c68e3102039768b1ca39cde94293295983232375f4ac42a1d54e8f3334653ec92b4ac1ed6ba914574a40f76e90979be236da4cd0f0ae40b2212622d1e1326ce6383430b7450953e5ac7080fb596844a9e4484e4934774ac850ac35fc4635910286d6ef0813a065556c2a17523adf30dff609c68f26e9d8d88a610cc12c452df88209264a48b16d2393238b140081008bc38461cea701d7481b05f6941879199dc781139c4b22c05742c05f4f9d0b70d54adfb6085401888a500dcba0dc6114da0c79d157be30e8abd71a7b337ee481ff1c57aa84a1b19184417eb0040a1b9d2a6573cf04e1b6b3578a70c2ce8319a4c7e43f7beb514be931e7cd287ef26dfba9edcb30e02affc7162e383654f4069c3a1d5624d6a0e0dd8d09b071fe8d843757a555ad00fd37ec7013ae8f3598703e813a403e833f439ef8dcf7f9036058716dbbdbb465bc8bc25faac681262bfd3a37887b94ee905636f00ecf659410fd53b4f91581008a361f0b45ffd58397dc417fa8ffdaad7e3d9af76463afb55eec4d9af6ecd63b35fd57634fbd58c4866bf4af986daaf624b30fbd54b75d9af5a412cfbd52969beda38e20b3d0c96d1f6035be20bfd945f8d36822d60e20bbfdb68b07c518bcef22d51f8d18fe516d692734311af99aa00ce0c0d73f32dee18c93209b3125ec2bcc32ab901121b871051c41221c4d26b27ceb88168c671482f8388764e8a83c339999953f0ddd115449433d10444a2c04ed98219d87e473bd3a08d09529133d7bc9cb96a0e16182d9088c31d56ca644a2082081c914874855429d46894f5489354daed9af68ef3ba7fbeeeee5dccd9bb2cbb47df1ca594b668eb4cd2d168341a8d88c8b22ccbb28edb34da719b46374a411a9c36e7d699a4a3d168c48dba111126321a323941a126329493ce840b695bd7719aa6699aa6699aa6659a26d234ed309aa6699aa6699cc6699af6e1389086f6962e46036b74f436e8fc562d99c9ac51a3d168341a6597979acc64c669acd1f3dfe140cf574824ba3a9374a41a8d462322b22ccbb2ed59c63da359f7fbc2c64b83edba4ff7affb7c54311551dd5f30697be7c276a72176dcbbaeebbaaeebbaeeebbaaefb40dd47e3037599966599668386ac4c3b35ea6eab675b6dad664b1be6089552d15f790ad2c8a405daa831bb884cd3362ecb3222b22dcb328dd3beee947ee0a5342895b54759b63dd3b22d93b5ed68341a8d465aa665202d22cbb28cd22c033f8e66ab4ba669d4b061810ad091a84b385429d468b412ad44349a4d0f0e298c74112f4dbae8816a74d3ae12a75d0fd5a880ae6d616828c765302e3ab5c1c008b5499f344a9be813efee9f3081726212ea6cebacbb3fd9fbd77b730d52efc33dcb4629189a8f430ce4b237f70cbc385aba5fdcd65a77777777777737b7b5c675f7765dd7755dd7755dd7755dd775519a1e9d0d8dd56ab55a69f4a2b934186e341a8de40ddd388e528e7a34bad56ab5f2aaec61c3358a7e0f390e9434dde9b7ad4a1bd9634523be608fd1d258f1f4c8cc643445504a359a6d1bc851edfbb80d943614943d58d2d03089f6b0a194d258ad562bda7594d26aa3036b74dc56b38e661ddd328d01d05ddb39cbb22ccb6ad8608d72d17e1cdd401b35408f06d869d4b0916934d368a685ea11938e464a5029d5ed5f20ed8fabd2d28d7f48c1fca294dcc2a1dca14b18c8a26f31257d4817fdd9f55dda21ea8860bec961ef208168a2f4ab0c026b59a0bc51b2c596db3a16fba6f2c8724a59e835ca62834b92a75db0cb8e3c3d294f7114ff0913973f93502edfc2a4939b5c5e0626852ee57729bbcb338049dce5653069bb7c0e3b48800726cdd22f5f83494d1f29a5147cc1a1e4e9520c526aa04b31809206c42a8d8aa7a878ca113d5664e39023562caff5b316f1ac5edfde55ee5eedfea91ea87e0f55d04935394a3db9898af213d5c445f5c45154d1535414e79ae22995af52a38d5d8c4bd274499e567e45b656a9845db0cf2e0666592e4ffd63fd15f08a30152c05bc34a5b25cda144d852fd53f54fcf6102ac7b6952aad8a9a4303f62a9f5d8c8aa7bc553ce51b732b2a9e7218bc92527548bb723ec22599da51927218cc2295a4f830e76d603d2a55455da994c3956a59956a037d4a954a640f87d85354b98443ec282a8b2aefe010fb89ca3301a7138e8eb5bec524d68a53b217993b1bb818d24ee96346f6e2617004bfcd28d9bb1eb0df6789ac480a3dbe8758325982b57e5bbc8856c4bb12fb45174ba3cf415d951b73cdd12a2da87257dbce393dcf7b7f3eefcfa791f4116b882f65817e2512ece713c524d08ca688c3e7739b1b5781a7105d7cbd834b26399f6809cb500ea7d7c56ca19009a8279ae2e41a6d57d976d541adf71f44c9136424f1c5834234e9f86cdf7a3f21bae82f9abc7fa00df4b9b5e3f3564b68610320b09e0e5448b87cba7cba7c4269d4ead4aadeaad4810a094518e20323167b7f13d12a2d9fb81a2d9fdab6e77dba18ef8d83e7796db92a6d7c6a8d79b587dabaef2010c54357086b14aa511b08427de09555b0d6b91bbc62837ccaa10971b4c66d9bd604d71d1bd5a89e34393f8970b66ac3f6fe9446882f45882c90f87cbe4dcea4ca9d76e141c597adabd34a23c417ebb2089145114622521162adab7cb344f05d896aac67ebf9f47c7cf286f86ea35652a542a950a8f8623d05c7556943b5e7db07bb58ff012448b720b2b0eed5b6892fcd48765e60adb08420acd5402cc15e17c3b21dc8ab6849d444b56d1593a6b55473879584579677accf2f5bc17ec05017f379af90441c3ee0fc5095aadbe6946447b85569b91a1c4e10bd80a4914100216de28bd576c398b2773f60379091545e1dc1d69b091194d9dbaa68f20efabd45616fab2ef6c66474f93c047ede813d9f6f60cfe720f0320bbccfbdcfe7393ef6033ebeabd3ce2e0604ce3e9df179dfa01fb03fdd9f0f0741dd509cef24caf9e7146a07715d65fba97c0a125f2c14238142f111568212a224acf51fc4b8d1ab3e02b68a491b9f38b47c00bd3f1bfbc05a1c44a2244aa2248a4f9cfafa09d185bfd337058a856f0bd6ea2fcc1d4b50f591f8d2dda3c167ddd0819db47249e8d6076c1587b15db677f5e1d3751d05b08f7068c99c1f3efb399f7c582bc8e9d4e305d67ab720bea8ba5443896a896ac5c35a28dc32a2581e0d0eadb39544a249036364e00fd2b68ec73386d862cb64db6d446b20f5fac6e0c478d2584bc54aaba4a440213a6102e5c42404fa3e5ec76d5a46b17aa9a82ca795b35ac4af692a35e55d55be529b933374a65a6fa6e9d23b6ed2969662e7fa5bf7ec6e6ea5b2e058720bf3d825ca5aa9393460b72e66e5f3dacae7b5f2f9eb12080bcf1e4ca229562ef624b787fdb256aa04a252659014550a913a27aa345165110e531c5a3fa9d248952a0e8f70b892487692f028913d7209cbf00e76e1217170f0f529d3700f2ba1b1b4069f572133c714a314bb320ccb2876c9190e2d1e12e764e9c0e2300907883c8193328d452946297665189651ec6a19133e00820304c7921698637eb3e7e444764a69c416828fbfc949bd4728acce041112be22c00ca121966066b4ddf866725127321128f6f8ec081dcbc2c62140786ce81be528e5c1210cf768f278f298e231e5b1e551e591a4e29c17e4bb7c536710d206e49bbe30caa41ac34b2b6e5d980f2665dfad4e3b100e2d1b7cd25e91a808933e464c7ea5eae4571eb1964422776412fec140ac256d2a093c45514107eb652340d8452f914493895b97538826945b964c6156c8c683f00f1b9b2913026d44bfd2a68262b87506c2a51541729884dd3a0b21c2282ec224ed2d609814fa0d87737252c909812a9f53655e3455623d280610c5e755de127e9fdda7f639e761308049269f97c1a493cfe7c0a4149fdf41024c6af93c0f4c5af97c0f5c5af1f91a4cfae70c896e75313334e714d95ce52b2adfb44b55794a6d798a9af2939ae226f5e45c35f956b97fea76ad7ede55ed5fedeed5ef59f58ed50c45bd0e56148fa18207d51868ad2b446df946c5ad73112b8e62c56d34ddaeda3dd863a828eed5ec5ff5ded5ef5aedfea9dab7faa1357493caa5a827af953ea5a6784b4df98ada3ced62c15cd1c7527f5045711595e52b55c56b055da5aebca5aa3c8615a1db6097f918c04b791e04e72b7845f3a15a6b7038cf52697038afa2f6c0e1fc4ae581c379952a010ee753ea0e1ccea7a83970387f526570386f5219c0e13c5761bce070fe53615a8c64086bcb55401545e5389cdf0441971222a0199a3344af50e89a21fa63ca884e9830a1dcba748194c10b22c946f640e64016612dd0256886e60cd12b14ba668862a29a12faf5d04fd494d0435d24d43af44d249a42b7de49c412df74eb3089721090e43ce1d44a601c25ac75ef21efa1d02967a2de106df6cd66cacc1d7304f3c784c154c109284ae8f456a7830fd6cd8cd03df9c37be8b28ba1d403435e347da6d0466b8e8ff59ed5af4adb9d0ef4a1d029fd32e6a9979708e9983687e4b1994cb4d79c993192820ffd88d41127d02fd027901db6c5c621407ad88d72264242828044ce11d6fa10d4871c1f9b3d8706acf61bfaf7cd005fe8b4b3211402b91bbc876af78f76a75f07b6d8e6c117fa751355da1fa6cdde4442a15028145fb24fe6a10f99b8a8548c3795510e959a1108000010007315000030100a85c462c1782ccf73d90f1400117c925066501b4944519223290e11631020860000004000000060a46a0084f21e073d6ba8c765f94b0e9776fc489950b7730554d7f64e702b9e183a84b68321a56c48bf24685a3f25ce8db5bfbc16e342934c48d21741c0046659b953827c82ee9b0136a7931ff3b8102bafca6d992c24622171d800e916b09d1948bf106f3388320be8fd688d943cb9c34c701bb654b20ed2bcdccbe7405cf2c0a77470f22d30abeb616f9af3e41ae5aa797921c3c4d1ab9cee8e727a3ccb75ae7b697851e6d9846c9504f0d9c4c85cc556b59bee3af0e9fc65455cf7c897cd4e41e80e5d042c3e97ab071e0529315eb8fc3f7a39f4ea1ac702293097f2a02c4fd8a8bbb905b886c995cbe31c1ed71833620a60c1a796eae29eb9e9bc6230558c02bded869b438c4ce9d7d8f88b7b99650d6b144ed8762185e98b52c4ef0e7b62ad264ca180b463633e34314fded655dbbe715a4483f784a0fbabe803dd89e26fc2c90cfc2ce939aeb3a595b223619f0d780dc5637949e6b37d2297f099bc263d48879bb53262b9be967fda2fc1528ea5215c1aa70d27d5ae00e8fec907212939904df31de5d604daec0d07be1409b0dabe45d0842d5cfea2a6a0642782b46bba5049bf40610c997e2094db06813f3bad850efd8061e4438b099f75ee12b156675d6624fa40273403909ebf07457348767f48612f088d68ff7f0ffbf55625251120daa5e6f11dded7424c6c4533d58c2cc0ad3f212f0edd27112af89ff6cb9a148686f7c992eddbb544723f5d0ac90f5ba857dfce554830bba8b12d6edef0938ac2476bc44251cb9d5a1164eb3695d382ec0a15ab757222750279ef4a6c79051194d41a6b4cc9bbb8274761b79bf046a1be6a949a595cdbf548813453439f2a1316b67f4bedfdf228a94021f8b273c2a0c11022aa8642a7fa3a516d1447aa97798616197664f3778b7138f24ac8f27f6c9ba66a2b4fc45acebe70db60484dcb0ec9e49edcea7bce2e7555cae06212247716e6e42cba7d3fe7839a398b017b8e2bcb151fc5b8837ec31af9cbfab07e4600b7441b7d6b4df604353067ed06962591ad1c28f293c1ee3f7c72c50efc636ece424098eeebd9d191f0358b0ac4851e9264e6c026e0d22519e1a1006817481e712e82acb9990585442d69d14a5c004453bb53dec516d119de510ed498a06d5b3c01a021142b38de774857f71438edc1970b72d389e0f3b3877bbb7fd5dbb944391231e9896662779e5e440a50aa9a4e5818aa911a298af83d0f70638f2c8304c0adddd5a4991c9f1d5382a73319ba3856f35c06660bbd77f39cbc23cc4b205eae19600079fbca1420e4fc5467c2f8aba4b2a8cdd8528145662714c778f9eca71bb1764fff82a90a0dca8f885b103a7fb79ca92ec3159b28bcad76cb668088c9efe91283a447e009fd7d46fa4f6e5f050e24f9af8b44767d219eb0b800d145773a8018f727b043cb52acbbf08b809086e2f7b312c8ad5d380e823ebccaec190a43c9e699b2ee5df94f0f972dba9de4edb5beb7243161e98b9bf8341512a9cac8b3ac89c190eafa7e70520c505bb77c16a983925be78e7c6ab857964ef386d46d213e726762df4330cd44a91669dada0fcc2c28e635228ccd6fff57bd94be838068fa46c4502a2fc1aa94605aedd52e32222e6776f5ba4726996d651e16e3dc6e3fdea0336c1e2e60f94666d8ed1a89733bc51d76f96fdebf55b261782ee55d0312e5435d745e07182faba228a898002c965dc838307eb66bc6d31fc66c9c91a076b8dbda02b9527baeed65ffa0717b9abbc810709004236ec7f87df4203facc571e5a2ac45f941aadcd63fd6c03eb46a7916e4940ba5d8ba635047d2544e5df8b905607b2f84d6ad8cda4939003e0e546a4904f8689c5f4f5923681785afbc6b4639b1005321d89628bec9b31818a22139f855b1b7e3b1e05992b4fbca638bc630fcd336772352e3c6778ae63d21cfdf59aa65cef4eabcbe71975cca09d17285e275df9be2f507070aeb078c37600203f6317ac4ff7d04c8676163ca45df73f6ccc6ba3633a9d0edfe89f936b1f4f2d670742f21507b5c618fb9966ff6c00be107976289997f9031f2632622a902fbc2d1c0c66146a48ecb97d7d04d4541d5b04c8802d34bd94843b2301144897e64e62417884173620d03ebcc825d00fd60f480813e15555ec1a7b90c269191caa536868b3d8925adb9c0759c8ff76658c40ee5efce2167a8d5663a95cf26ee5ccb810b30cb997280c40b61418c61f6484444c7d14b16ef4ab269481e388a768209a254c2402196ca7195c74ab81a7f4705d0ebfab964505c2caf9215f0001f30c6b6a60d8d05d499a4bd57a777bdc2feb4e9a0bd611b2bcf0064ca096d95b9a32de9ad36d23c3c3bd3d3d5e7f30a51b838694e0a2a4accf069237d2f5a0fec9e393142878668009db353f625d956117e530a6d14a5c822ea5cbf7bcc81b7790e0ae0449cea9eff1847cc008b8b6d4d806f0a8336a3566671976525b4f93d5aba90a4bf614e718bc4947249b84804995405177788263b1e011f49d425341a901dd8437c8768d43fd4a24f79046a60b0718e8a636de5b9565cce708f3fca69e4cba288fabe798eb4936b794b8b39eb96033bfca3fd31f4a8774aeae8ccc843704538a0e33d86dd614ffb50ad2537b146f3c563eb20be85b98f9d9ea3fdac41930b5ddd7a120c3c209b03e37371f3c4f647d5b8c860cc56f9662416bee5a57c66f011f4d4e1998383259b03a9472798f11a0cba6def98ae7546dea7ed3dc71e8a400ffe8d820efd12f3c4cec1708d9555e463e9959d31a5c9576a23734c0ae1505de4638db3812919a01ba9d2b175347a4836e24ed4404125f61c7c139ea41954cd5c1b1fc2b5ce3507694c42161042ce1246e805fe8555ce8ce73aec3ad0fdf24f72a3d180c602b4e7e28cf1712361134434d4addf54f6fce756da3a564f4959a23b6791f16f211bcd93610d5d0f3589417bf06a25c6319481b273c131ab0c36309f1636acbb27452cc78bf59111c9b73eba6400a1e171fcfb43646eef6d9c6d82d99b67e36ef48ab4814d2792ec9e46f50e2e674f931a389247c830f04c251f0470c4d05aa5276b156b764b3c46f89b4bfc692a76025478a53e20a1cfb0b117f5dbee9fbaee798045ca6d844c33de31cd53bcbe5e1bfe77eeafc5c64b2ba32dca8ea0ced0a88b972decf5a3c02863ec3c55f5ec8a1906c88403ad2b1e996f014b13fe70944ff3a4052cfa0b10c83ac0af8596df715f5841575d05bb8bbd513e0165cfdc05fcc59fdc9fba63619d92cac49b6ab9e34ce57702946f777cef37f480c910b3caa007a422d4685ed208278aa2ea30e27f23f170b7e6285b34acd756a23570ac9de0fa752a829b407395d3fc792c205b2f6e3d8731ac9459ed7ff51a31ced4d63dc46d569de739afa7497d5b3404e465deb91c0a1988c87b56f9e0b56073dbbc34c6fd7d5df085fe4105604dbc257ccee6bdc2f43e0acbfb28c08af7439b6f99020a311aed1456db0065e8f76ceb4d4e861cf714b72a38be0348b7e480716b5b9e70c98e3e6e1e840676f58444f551f3d11f9f6caf10c9d039c788f378b3b7634421d21f83fac903a1f891cbfc6ab43b17e849d3700bf504778e27bc8c2a58027520d7f5d0517834a9588c922ef652b490d79cc05a518c79d82c1b05ea1d7698ab9150e7cd6399835324b1c1066503b45685dd8ebea8a66c3b09546af838f1d319ea8c2dcc0b673dcaa8d7f3f6acbb5289163beadcf496acfa55838d09b68c05651b8c7850bf669486d12aa9c051abdb138f524fda0a6ceb2c4057aa2b4ed0bc2a569be2d6c29354d7332837ef0b4420dc1922d00e8e72c7e044e18104cd8a6fffc8f613b9021dd720d690e7f39f4271adf2ef57eccf926a81ae5e863afc19a0a17efaa795d2fda2ebb6c761b3aa28afa623f00458e44ccbecdb136b6a9fd73863e4788d52ae25015d44e2408cebd94f10a521978912aebc137c4aee7cc252a4b67b4609ab996332cf904ba89a62b049f0ce49c9a674cf40d7a60ec16bce3ce1659423ad8991650c6e75b4a8c2c8228a064a02b9901ec14930293f45978a6ec964b79d20e6d0f09f6ab8d920ec73696989339c6dbb7a1f265d038b2597de4ea6fc96ba2741a5e2563740edf7c7ff9f7da64b825e456c8c8f3ac194c3d2a7b801753a008b33404c1c45ab5e3b2a3933351253ab188fdbba8c96060217eefb268b2b8e7cd557797ddbc3e3e79e7f53125400c09b80e9a5ac467535f1f398035c9c5fd034ca012e44bdc3d565d5d97b09ba2a857cce9085b2ec19bec5e7db8d2986833799895d11c6bae242e6474053b1c93f4950713c3bc54e8e1c2b6c9cfb0bd1dcdcabb7c64f5fd067eb9fb6a7c66c7d2e1d1f844a69d86d09f23c5bc5c0cdfa035e3b820b0e75d86b50f09674756bc2f3e07c35f9164f4da10a4e838052bff4acbc2b1801e3b94469f8f609df1cdf2e0c8c901429e979171223d20c3dcee7827fcf8339aee10fa39dff3a493e8118fffeee9daf68efa234e0c0a97a77149f03ba6ccc6ac6013c9a869b5b08cc2f4cf4f377ad013fb196866ad55f68e9ecacfb05f8d1240b10b09f4253c5d0f3b39379fb99ea9d2b5bc11bfc3bc0b82e020b74aba0dfc747931d5450581bf3686d0ec655d58ebbce511dfcbc0b337cfb9e0b72eeea9f45f56447379dc23c99e3ade11d564ef8a8f0c1e0f161f63d9d777dfbcfdce13e49c8c09ec8be1091c905ff90fc7979c9da048c4296ba47217995b25c0f42b3c424da13affd8a45ff6d08d5e56ff5bc8ad3069d3dc6591e24eb6f11c8507a3aa5530c4926eea2af26c60ee3889dc99766c676752e0e4823a4d5c5557b23653a09b77a1aaf6407565599caf46554ebdc195eb19488c211dc428e86cae3e1368e08933734ceb264423659d4b7a6d5d82a6b07e36459106de4e497c1f3ab3a478f7215e510503a407a853be693d9195def1e4c2d4c2e5fabbc2d6097b8ceef5103e97d4f67f3479d6668c66f22f2aa01d8a633bc77f29e1526024bee84436e672065827487e2f0b1da8fd0fd5b78548bad207adf5f50eb533317f7859c552019b46dcf084f71508088b82f52b768a212a886da2001f6ba84431f22114a33205af0c398067d7632ed6d1f224b3c0761e8c54163a2f7e341147fe2a7386b613930d1f15dbf41e57179b98a13aea419dbdd1223e8c66f99d3042a2c9ce6046969fc953bb33edf70cb65fdebfaa1954d6affa82f6a88da3f942821370ab827bec8226c185bcd8dd672d44b7a15c45d897ff612ae39986b1d3fd4d20dc5b8a1126acf8078acaa104ae53555d192735dad118e2644c21ab0aa54e70aa3350c2618337504c76e8e9bb41c02e5e1d00558b1cae2ebc30714c44e9d6fad0046841c2c185820a0d4de391a44060745d99d26145ca9569fd2e8e22d66ef17e28da95b8e75d625fd1d265c9017a1ce9d8759e8d88fcfc1b8605a5d0e2fa576995d73baa2c502407452acd121fac2065a619b5ac27b753910450222894568b2db53f8dd879a5f29c61b29b4eae163f698eae353a67d1812290147ce6c4c0fcfab52f06c50bec82f54734fc7cff6423b000ca550829aea281b9c63839b0b3980c7420b240be3b49c5bbe3a1273aa0d451fbc8af4a1314a349b7a0233bb133b2713d33b0ae8bc43d0a92f11b40e9169753d6b7f85f9a375411ed9284f52e8eab2ad73aff6e110cf77315a210e0f477796a3e5525c077d98c9164512c1f7ae2231395a113003f4c666eff268e56b49c1046e916b8ca97731e5cfa6842c586b4b98b125e1a815abeac48727135e46017c88275871b391f877277e7090ac3b60f012647423eef43ce468d4c63264292d65e8c0037b65c0db54113be52ba24b141e868bf09104488e9b5b8db45e817471075df1989ee4589bed6d23b7a97453977fad34fcefd75f6bc0546d8aca67b4b4e2dd0bdd0ea90aac06cd2c9d34af742407a44dbc57ee3d7a9de8aeee69083f498b3e5d32550cc2e0a6644f711c57c541726687d82998b583095be060c533eaa5734c52af9fb8d92924e8812a48159420e96a1f783bb24badfbbc61d619441e05812cfbb823882cc3af2b0c843acc1272703f06c42c37100e85a02084a6e7207e732421ce746521de947f432ca6ec21fee77e4418eaf244d834ff8a68dd53e65d8486c419514320a615c2a723603fc2e6b9b7eafac2847b984684f5945b51174973e262ca2099a4dd2685451884137959dadcb10f4a66fb0ace80f3dead530dac7b396cc003ebce6d1d9e6e84802bf9eff5eb64d5eb0fcc639edc03044158d69b5bcd0f9196fd9c059cae6663899edc8e006c624291d99a78bd359404841e5659a3dfb98944bae92597af0a466ea55ee00f7272da9802ce0c19d2dc444f5d8464b29f1b397b8c31829e8c395812e4b103a3c34a9f20dfc1f801c915c2b2332c086f2247745ecd56c4037a7b90c2a351d3ba8060a5dd5ef196c4edbe48e4c5ee21414d5000207c1e52785e481eb1394d7448aff0d1fb9a0d89fdf9bf84a1430fac4325753d74a348b75fdec898d791e609af0df8db51bbead44b2afeceb523387ba71b2e8d56524cb3f335e8c802cc215ad58a6053500a466682d7c7515eff1fb3282641a819dbf608f84c5c3cffbab5c98932b09422f8f5c8fe84f5aa26f6350c6b0a0b3d987822bbaf12b7ef2051e0ac354b9b5c82b0200066839598093f6994766df49901a4d54104027b545300a9450f21076fd8fe1383337ed912a35cda0e19124d8edccca4211afcd4ea0c8173ab871705598de88f5cb493d970ada862a0ba041e3d6c6e9bf41f0c457dfe0d90684b1b0c0054aa3521d04f50fa58561f0d65c1f9812cbf6154d0782e529a0aeaa34611b2de13bfba8c38906449fd5215a6b78bd91dc3e14ae5499e8e530b21bbadec718e163d5ce46bd81911b9801a82f6ffea2b1116647003f567c9526081dca3a2d0ea07c331d1c3121147f4e60a032a3b0c16e5b964bd444aebf813112706e36065acb34e5fc1e9bd72783c6add88c656bedb9627e816a3b5f841b602350834215cbd15c03f8158f13ba43a95bf94010673bea061d81e5be7946dbe2944ea510606c3ba5859d7a7583763ce33861a676e3865ef2120446c408c309a7ad171062d96737fa2524fc81c69faa14314bbdd368419d7d0299c2b4e253f669f14d6e836f2dbb30c0d74513907057b2c6475707790628993239a1f7911b39909eeafa41b78d610a04ded5b70e03cf5cae38e7b03ea3dd7407cd5d1a33a5413fb45cfdec3203b96d6160a106944a4e2e1e0c21a674ab57b27d89137a0f1b122f9dda0b4bd23126bcc4c5bc2712ac11ae75a4170ec9d4d77c9ce875b9781786d8ad696e95cb11e8d7120eaabf736835e9e58a061366bbd73fe6898e0886406ee268bab6f4026c98c46a827240558375b3686c1af0e4c3e7af68f93f96c62d40163e867dbfa7a7a826fbb46fac26f5e66ff1f79213193b5ba9ef7235ba5a11a8653cb00275fd4d8ef9d6ad9f4576adcc2cb28a1bd686ccf9953ea3d9320816c9ac606ae786911f0eec6ce832d45e8f2c02715d45fc644fbf683fa8ec270e59cb724b166701deea37f6d8730c284a1458d252c8fff40833ae613194dc8e81f3bb6be839a3641825dc689cc25e679a4051c4a219a5f8adb90539257cc9d2d63354835621a966601df84ef10201c20d4fa7f9a4355f0dd80d88102e62a917542b7909ed83d8be8ce548d00c2219f91addc2c0f45c7a75447622bc01dcd8c4a66a10e0f3ff60bf703b0f4ebd1c37a6169331d7d616591840236bfcd2a091a6f1b0f84cdd10733d88e0a44bc9e13ac08925da97c84c340a58fa7a9e86a64b0d758da4b7ee47532203973fe3a71d0567282dfb8b38a7541d232867c7dd6b74006854ae852203bda3527b18c089b97668f0b829fe80b1ff9526ebe085457876de0f6c5bf509bc2ed48ac93d28225b01be3655281035686be5fc0b0a63019266c43857ee3896cb58f8542644cb4e2ace04ad19d5d90950442a85b979c11b72c982e81c3a615440eb43a4bb6937fb87299d83bffe0f62074a8028ca69096ef0400f6a61c7353ffd0e3be66ab0e9310b89faf8e8a004650a70e89bbd021f791a0512d50d8a0255ed8219a4ee2a05c66e993cbf87e3e999a60adf1529069c426ba0a44cc3d12e08472d7b1d9ed66b833ccc1123e168d23540baaf01d50c3f0222e0487b5a97d75f147dc10b06b1cdd870c090ca6e0b76c006539923fd48255147f06247714f1691324c47d57126a50d2bcb5cdde14fc30f560abe7233d92ea01c0d14edb60e965b30ab44a074c646271286eeb8d1f34f411efd3a5f0d4407fecb487c3996688b11808613755346b5518d32672462d1f0e901f42bc4c0b3d7f58ffa9de11b0ef325a67ed5103a37bff6431d63af0e19071ea7941f6e1780c9351a631648430f1663019941e0e75b2314e681c7afbb3ad3019a4013066dc8194887bdce00237dcf4bf3b364edb3c954a4fd970f2a6e4df7ffeff3b5b39c8834a26ad317aad8257ffe1a8b0e3c4fa3f318159f6cb8c7e1ef59462c4b4f1935404ea599734ad421174ffe7af196cc9443fd7f870106e3b73a1cede053babfdecf9753bf1c7f1eb50809ea81ae4ec5779fda00cc79d1c783aa99e417ba70e689472c6a4b3069d346f3ba7dfac13a70fc82e2d921b6338c609e838a94b8d7a6b5ccec1331c78d9a2e1fe3d84f8184ad961386ccd98df105ce3fc6b13674076c492f4319f650702393ac000b8c8c0db0e0c277004114314bfe1f24b0ec34740b1931c56b1063662131e86c5d47ba58dd47150117d68dfa2bed028fc582517d8ea8c18a2ee68dceb34ea56a497931228e962386befdeaf200e4daed949577e2bbc2c09045470823395ac7b113ce95f532e5e01d9c37ec7255cd162d93b5dbe78a45c3b78d708ad06bf94268b98237c3ed6af4644179e92166f2f90028c7f2d35d068e5edf9bf197d8b61e9d4b206d3b9db50f5c11566b4e095ee1a74e7929cc1eb9ba23f2b88c8adc1f21504163ff1bdc1e4792fb9b8c5d53134c7b9980a128c031108d9b05ac2f3c327148a19616feb0fa8025494059179fe5541dc842b3450410edd68808f8f6bc7676ebe39b80446cb2948cabf890f1e3cf780f2eee727b7a2a59c4ca994af4ef80bc8c28fc4220eac14db072948939a0175eb8b7e39bac99ad7ae9e8114a4bf6ac24b28c526d8cc2cbc56294890db84cec3c8e31efa37029debd9a37ca1f33789cf0cd9fb8d77c0e7fec635ee70158724823ee4e83514fd4b12225653016a4f9616913079c1c52d38402e4c885e102a7e3c3e8a65cc177ed59166ad02062ba31dd0567e72757291168f6a2db4a5cc1d3c6a7d16c8d83669367c58bf46bb407cde18dcb404272ef23efb164dac8a0a5f3960bc717116e922c024a8465ca571245d1d14c54aaa157294748f8bab59477682e160915860bd61a9a6eb91326955471440c390f82703537ff6c7274242e6c18c3f54cc10643acf905410f24771f854755a3b1b6ae692b3bbd7c5bc9565312dce7c8adfdce7a086a89c86ac57371790b0c43831640330179048158be40b7bdb3a5e031ad3effa3de11f30349b3ac965c5a9b8be9539169b83e1f3472dd9c84818c87b48ea17fc9b4a700354aba533308fa70d7a6c93636f8782f01947635954e8b8b02556ba75c3e71556d6865a001d5ed7c6375cef10e0b00914ce4b368cb8a4a17d321246859da11fa6b39e36db89c95f70476bae4bc3dd7ae34cf203ac59ba5d524f683840fbfe2a2776b3c67246e2a354e45b356a8decd72b109bcd90a3fdf9dc47fe867d244502de2526c4cd49240f3029fa0377b804bf30b1c723b95752942961b8cf2b067ba60e4fbaa451114d950f7de2518bcec7c46df5df5694c781add91ecf89a4f789ed5807560abbb2c1e327ce464895b78930045ef0b7667c93ce2c391a3791f4bda6faaa6a6ff4eac96757892a89e157ed5b86acd2b7a270392a29fa8bff72d1d9e32ce7bf46e17a370069b38620f5448d77de9de773ce160fed4ce4769e02bf12a66291c67b10d5b1e8e1716377e8e4f3c48ba77e393138ca823cf1874ed7143304d4b7012193d32fe409bac66319c0ff2bab046675bb376002e799d0c8b529c088a01e7096ef85203620cd91e4e6a40ba0b0b45e1b8b628ac4ce25d4d2cafeb1aa804a679f2bd8b2a164e2d34cf39a5cc96fb288841028d2949b312c78b524690b2bd6e05c0b794443e98ce6db99457e40b975617393e4ba9d0110c8cad0496c4f72fbab93d49247ca751fe82a8e32e806384e50bc7753f910c9fd6bf79b15b534e39b42639bfee263f53fdf462406556a46079d082718df276477d5b17dc7a0174838b79ce273050a44561c212f511a8524de08517983c47a07561d0401154e8e911ec49d16fe82039d682c43fb11a5a85464c45935161394ba5f4978628d512feb58aeb41d78986c875763d11d5c243a38ed6ab2eb27b9d1eea0f5592252a4dc0b281b697159b7f44a1b9db1ccb866606175cebec72f9c458b2bb38c7bed9193e8d781c992ab1209ec4976147539759df238b40e6fde6a16c61f4c195698e67b04ee5590800bd92a5cc4be54de9b8c8476780976c69d523e58a57ab16d6e832b44f10ac9eefdf86e0059082f5cee23161d2160c3c1eb11f0d7dd2e5c7cb15514938eccbc8e2b253ca97cf9d4aab80287763686424426ab44291c110ac20f71c4cc374e9eed81612907ba02343c2f4acdf7667003b7e7d4893f6162d19fbecd026905448fe29fd75147c06f9720c3374259ece7f98028f2a4a19658090bcc3baacbcb5ffb84ef52a63a9b184ecffbd6cd0a0124e9ec0024b88ea03d3d857cb73c31a2b2ed0ff920e295f62b84c10d7dfb7979848f27b7139217036eb937fb040c066b4bb177995fd4881507f7992980ae4928ee5fa6546fcdb372188afc46a2708d808859f9d695867a4e6e8cdccaf4a5c4eef0528b288f6788441119e6187e861e1b25801fbbff0f5e00d2a2274055fd96bea35b2f34a88231a402bb498116fa82c3f761f66e4e2bbac72e0a8ae19315c5443a5e06141123b1b85d6c06a31d9048e884c1a0612d94d82d12d8c7b2f543af3164fe5e88fcc08d5baa6c2595a368b5ab99515aa4c6cca952cc1a6e992b035cd7696276c437ae4414c665fd68f389d1e906d176faa83615f55bb318a3ad000db641f1a92ecbe90d6e6e15913f207b62543047b94072fff21d4c946bcebfa3f55e98fe390f2c02d5dce6a034f7a320f3886c8725b4892e99e7230e520db7b8c6d56c2c4447a6255aeeccbb69acb5432def9854a56cf62865344e29f3a60544ea432d397f13931366589a1572d45a87ae33a6708002d7caf2563d409d6841e7044f0799042b63e1eb4953a4f09f0e50996c00bb93614dc7c303ebad0c345d8e71b262a4f0233b3c8c1f72e96f07dfd876fd9343dd05aca9e8eedddc772e246cdd70a37bfc95c73ede22714a3d742bd6ee5a67302ccd98da0e4f19ab36cb29a1a9387ae27a70aec382d32e08cba5786b213106c6821b502145cc3a15518f964b08d9239aa305f71e08f96950a87112ed71ddde913a91e67175c2767bc2cc27c067c34857dc88c2258694cdabb36bdb2f19b973bb3749c8b3575aba1954e112062992245aa37700a87cf1fa127b9b351a3fb6e546834700d2914018ca65de3d809fb6136ce100ff81f7e35e6f0dd53de0cc23f13698358172c581958a90e12bedf3e49b5c35e4707544f8125737ee054d32ffbaa5a9f07eaa2f31b9a0591756f4863293f66922f044e6ae52705f04d6f717868b3d419d88a5547e597912419bbc2416440045d25a9da626a4294435afc2662a60e1da57990933f311fdabecaf240a6c498ede89282ebd752f102a949f8a68d33038f4dd3298040105892e1325ee7101385da5a439739266ab2a560e0ffe44cd8fc63f233a8d23c44e94e4aa9a97122bcfc4aed4a6dcbaa0c44daadcd4e136ad0b4c045f0f4542e1296d93091a950b3c282ec5610f988791894b602a51e716c7164db8b810dc0a2174b68677ce272cae6c0955e0010c0f5506e3f16908e52bc822ca84241051cd6a1d637645a10d2456d7df651c4b7c72d6aa7d3115cb532b2a74ebe74846ea793861863ea177f49047683f6bbf9f0a526502f8de141d6c47dbcfe6e28f71a4788e70ae967e68576eac14278c858757a8617d5b1c4da3d246411440251ee8c13b9e313c7d9a255b578b6a7d0ee425c8ec1ec1e68dd006d85da362f354ec8654df11fb66357ca37ba3876add7ffff2c5de8caeca86cf85a44bae38c621812734d4a37138d4240c6a85768b1260866633be74ea7c6f25aa48b6ae1a40bc9784cb73a527c2e35c7af33dc951366597a3a8bd79d3fee728ece9519add3a4972f622786e1df2ee4885cc27bbe1b4bdfb6c066cb5bb78447763e8d911d0a85e006f2aa1e0ad2a179dcf1cd9c2f6b29d4468751542905e83d49000878cde34ba000d153785f40eae48e3d6f7771070c23890c5037259252a3907e8acd023a872db76c7860804f05354925dbd16c5805601e25163c034bebab8b6944ce6226fd7a4aba1db3509aa80c91ae31c447d13300708b3d840e83a1252ed20d76144c31cd03e67ba46b58fa716829112721fabe9feb68653b5b819573157b00693646167e56498e01e99db3dfaf3c46c0c524e5a097ca39f1f4b9e09286aa66824b8879b809d9d0ae4a1e3fa0c106e0f70392502de4086c3a59afd8d5588527eb46bdb3d936761420dc4004c173f599bd029a2eadae17376297f4112a1fb008f66ff0bec1273b2338b2b62d0452e8104eb76808427bf836a91bf0b786fe3428dbfef5e75455fe4a6815b2c4859386c749c3fbabda269770e5e07051dd41f4fc168fdb04ff167631d6743e28970aaee0ffa5ecc7ae232247d01aaadd4a7b68866bed582353e540dd4c38a4fd749b4f034692614131d7d063d012f20544a6fb98dea0f00596f0c068f4e6a3567a1164de66e8ea11f4501f8e59174d289793c25ff50f6d603a4323d686e590ed11a433524aab500a74165c5c2b90753508eaab2887bb7d83d8d29d7f3135539d22df750d864bd54a9068f6d352030467f0e557bafaa9d25f790c3d38671af860ad9fad0e666935bc2ea5de83b45429a90a274dc16447d49089456bec8eb2f5c6c7359f2c27a7436246d5310943f8530fde2d45ce543e4e970df9f4283c50a9b3c5357685a43f67e8a6ad185ac78d539a6ac6968a2c95aea20feacd0c3874c4953b3d306ff71199bb02d15f52705ce17e053f1134e6eb474692742cafe39b3a4f8b53d56b9323f770f2f1c670abb2dcc981a87cc7d24e08a0a6ee23e15dce2bb35c20ea779a57c618c641499503ea3e18ef3f6e492185ae8ab988ac4a5d28389a722ff0b63978f86c337117d4d293b74a2f623815c9713701c72befc10c7952f9a274990d6a69e2ac154b94693ed214328fa0c494edb8f56643945f9a657ba9c5913775042806d0f24453eb9e6d6e9f25c9da56326d4e4821573c18319bb99ea66bcde0f6450240d7566923dc6489b87f6c6bb4d8f3c4231e56911db3cca2f95fd2570cde5507da7581d487524635faedb50535f9c445b9713a57427e5da6a0bcd483f687bb16a2e6b73248bf64e4a9a98ad327518b293bcc7d4b262ff98603a914e496da23a2796f546343d09a4837f697d8b96c579884ba0de3d05bbcc1538a85e5b6c33215c7de0677bb6763016aab3be3c60b1a10f2d0029460294e55e8d72343f9ad4f7e10d41555ea5030bbef62435d1fa9dadd8272b4aa6312967d3a5950747bb86c9a941ab08379f75163e654b91f3a1f83c8ad0e3034c71f659f469b346ac1b7633e0e961154612b9af2278cce398cd522adcb63ee9072af468887efce70f8dedb416e1687c603c3d67291ff0c12b7cfd0f961f1b65f109484f0e42d9d35f9ba59ec9308b3d1a8390543f4ae43d66eac2f3db896d78550d39256f9900a6df49bdd38c167ec7466af6301ec0e42f741cffd71af51885ce653b078434ece9612168f5c15519c92ef6092d3e178b0a9da0286f93d733c5b024a3b2967fce038222c7f594ba5392d7d50143a9bb2ff86ffd80587d520c0f482e08dbea3ce9ca1f49f92615c2d20f0fd25a95b943facbbe8e8fced1b552c7c35fd7c0755b8e41f0bbfd0dbbdc81e44d3c509394f4eb5355f42af05d7b00e415b86ecd489b33bed24227f38d113b41316e4fec79804c21039357f1964028cf4185c0124563e3ca3d126b18f4366458a6797041135461613e9e820e50af6a3dbe942e94c2d6a782ece62d2e5b48f6c83622a8594bcd618176cb376d39da90f8955fd9182c31ab2657bc7f5538c0029d2922626267af44501dc71308a1b4c5f46f1053f24e6d8372e05c72ecd8aa8b8ec167abeb39b35b3c20bad5d3f3425c6cae3f1825b578ff45ea2b6771b3338be5e14e7a2cbd49dc6171f4f328eaf6eaf34a4320e204c80a029c63af345d4d9b1809223b1136c26882c45a9c4d8017f2026b0a0d32a842a4469a5927a4d08484631b20afa97976c06aa75ac093b4d7b4f5e869ed0bbbe9631bb8716d3985494ed298f785745bae2327a68d59fae2b9820b42c7706225b1938b2b42d4e286d06b1cb1fb000f486f00eba15d35a771184c87505b27c26b0139083c4ce0125f1f964716c9e4a90fc448d2bc7329f984084ca8d44ed5d7eca2e67d442c5e3e473a2b57e940d60682f572280bb1a828309f688f969bf35aa76b04e00233b4b3a59e2865a67cc41f8a2399b5f554657ed8f3cbc6de571be530f2cc74f79b5195db6b481b5fde40f4403cc83012f2b29b52639b1bffac61bc603e406406f667cb9842a06f660537007e726a3adab143c43442fbb881c7531971147e332912ba0b5e431fe58cafce49fc9b12d232b1a3d3506825d39a0151e907b51877c9a3ae73a54c4bd3a166ffb541328f1302ad9f96ceee8e956a1e41a0d561c2536da44a23a58350b6f8fe736b67b4620aac74ace525bfab17c1824a815142b14394d888dc1c8ce960bdd90f11de03f0a91b09e142887aeb757103d249bd3ecea880fabac23590292a98ae8ac3c9e77d4158c5e8d0c4f7e4784a9037f2117f4bf6965266e44e6d0eddf9a239b36a91a61c4f66cfe827a7bd0c4ff7599c9531157dba5759ef06541cf194dd51d241f778f2f01e377ae8b2d19dce12a7ba3c5c20277d736b22d4e327e517442db7d89c2728bff5b8d029a272fdaea0efb4ac13a30882f3f36ec00082b1a1b6dea372c7fcfb4944d73d82646ed79a714ad24109d97c4075564ff44b832a007ac94b6a0f884c0d180be596f2d16fd11fe3b0b35fb5391304425934747757f3d8cc4156af28ea4b53f455745a7b11c274767db9ee9e258d22892ed8ae1d6b86f7a008f87a8226ac664bb1be7629de4803e1820c2407c8f18063c0a34063ad545f4303f0e655f8c56b959c352403d6895ad0a53d07bc3e0088c61f05d6bae0e88f224357a53ddeec99a50546d1eb9d5990959d73885e0ba30fd431f8fdce98fdf4f0927282db48538385e6380923915c8890f224985e01bf20ff4c2997630931ce561a2a376806c848bf4cb320399cd370aa6b252ee3336eec39cba2ead0b9d85b1445bb6d2da0bb230168c289fdb311e28907e69ad814d94f0d28d26d697aef7f93ec47692594ce03fb02a802338e976ca021a2ca843d1d0f6d13e5688d2550d54c543094b603928ec5f241ad7a9e788a0810fafec986496472352f91efa21842af3290b3f5f73889013dee70e47b16430ac50f6d0a547ea6544af02038bceb25606eb279abaacd440cd0e6aa189424aed44c40829bcf04d722c7f992477d004724b435b760d5e2fc3e37fd407564926e19b231a4d929f71220be2da871eb5ef6140f22bd84ea17a6d71bc65f323d00f40e557d95f24f1cea5adf77fef82954d3a6c43a9b26b89655bbc4a4ef678985b02c8c19efcb045851159a291a24327abb31607a1352ca47f65f1db0adbb179842e81d18363a89b3f988435b0276360bc54928339a7bc01e1c3b05972efa733266712442f5056270411e2dd6daab02c6c4c29ce591029480081a13ad635c7b024ddb74b2d36110095248b2713f384572d5c2ca0ccec363af19c06c1a1711ce6dcb508541c641a3571a19fba868981a703a9126a8f1ebde3c2933d797530c10240938d89175914e374d08a2e630b53de47da48dc6a844198e16ffb7b06d323dd630918572a6b8de7c3832b1b01e960728e970c261cdc7fd76cf5b9035cd4888d637382fa5d0f3a88d3bc0bd80a8c7508ea28340d41b6e5a25e7beec4f3e146213bc8c1e60779a938defc32545d47eb3921d761a0e2769c76df5262b3419e3d10261dab11e94c22ff1024fff47278c8eb72a92562f2e620edca240d4ae8a995eb6698630f06654086a59673e55093adb2ac578a396e9e89b06fd815a975176a289537f39ee5efeb686d0589fe59de7be48895c42c39e5ab791a1cd4bf2469c812d2e62cbde8eda079b0f0d31c366927b30f3e15d26c88d8ef0a3eb64e175beac1c7f44476bb62ff410d14cc790bf05119a1bd1826954b7390954440ebf54270d62573b18292aadc1dd306553a46f771d0102483e94a6870f002734d287e2015af090dbeffb2e847441f3703c65ac14252362304f4f704190aad5631471ce46b5f4020376af84ad9694ee13aa7d5388f559ca85212bebd80d12647c831c8d407de52e70b71302019da0937a19888a934e943092a5b8210b49db2a1617d0d7c2f64f99169b8c72b2c4914d361e633471d0ad29bf9b12dc18fc089fa2c856b3184191a0557aa5664dc38c9304acd70d85e0222c0af7a6324fd0be7e9627b50e185116f50ebf15d9c980c326c08b389d95d02a2a1da4ef293caffb35dbf0410b7391b7ec9927e81eb4e52dd65598b6501ecb383d933731f43ae8d22bb33e34077b0a021c1dc9a1cd5a7585a1fb774de432abc6215f7f388b314204573805643b87082e6bdf1ed0956845c6a3e3b24d97db0db64dcf80d0d4684a94b563df9b1e8a4c7089c90945d01e1b8b581ba09aed0a66f5236bed0bd698f45d22a2ed0658ceddf042c7abb5522a39c7bc623aea0c86dd2f5b692404dae52963a9feba632362011f5d41a641adbac4ec7104e58d65c12219d7531183c38312977fb6219251ce614b1096d685297dc2d2d8d19d1374d5132fb98c5838709f80f406c61158a7ed0b76b4a3de57178dd3234598df7046b84048424438a1faa3ad350246b0506dc2bb13cabbb0ab936000762cd94ea5d6f8326e7558e1c1607cd2b2759f95928f26721679f98389225209a27bd404d085bbe76659d04d048b48e5646634be76388b6f8a7982bdfc2599e8c9b0c2ebde7dc1f435b34779032dfb23f0edae816aaf3b51949575a70afba2120e263ff1ee1a9a5aa147a398da7b01687d4abb5ee15f75c02f5e155e3fd84c85a1e6f5ac539d27a62eb3871eaf623e889039d50bf51036581320ff1822e23306970c50d06cdd6a606483b3900493a48ad3c7514631b2a8a1521692ba8dd322cf1430ae5a2044a04e6705f63783abb7ee7bebe1f37d3dd444ff0672443c493aad9a26a678ffd0af1ebd3e40819377b56861b7d0420881aa45f9e64450fe98d7e7aad23ed7e6b0b30feababd5d7930a164f644d1c42a177ecc9e8816edc61cd8219fca808091e5927879980dbc9daa9e79e831e7d8b8cfe4074a199e05083aa8308f24022d7958dc9914d1c3260e7641181a652dcd0e5f414978ddde10c194ade2413cdc818a8913573425cb5718e04e9d273d8ec37c0a70c609599d4c88e7a358bef8dd7096d9ec14d2b165b94d571ae9d5f39660f94fe6ed200be370c93383ca7677f1198fb83712f38a5f68393a71b85992e8c4210e748c495748a3d35370445f7a2b1dbe9717fe27c61fba77f42c0ed5a480ab78ac36413cd53cbeb02894170db6e47f21218cf61a0adfc90e1dc7dcd75e05c5de30b61e4a0515a5ab54e4f019f1bd16e0b9a22131421c79d3b343cf39238c5765602afdb8b47db75b69796ddddc1097836f1a7ba973bcb6263adbe897e91c593f854125d916f7bd571ec30893462b11336c218d504cd84efc3fcec6944a5fddc4a6ceb54315ba45b1a2da91af878cb946e8d9289076c9b78739d7d232bffc6761129bc0225a732f8d53c38a79a164044da136c05169c4d24042ce5c4518cf2570007760ee0a33a548a70fde98d436e9bc56b43a07863b435b5c4b639e704e4dcd71e12ab87b6d5bbbabdb46be1bd7af998c5310b918bd8304fd78ec71639f388b3b755f2793c4cb0450bae94b76c8df48c05d435978016e923a9ebf02f67305e386e745caac8aa6b28c0fb890bde448ce6f90f418205ce34163929e5177fd099501e5482fb485b83a59cba0a2014299352b175c8bc6f759532473efd95605078d91438c2d8626ac93da4d596599bb013dde6053963224336b06f5ab4c6a1bbc25905f1ce9dabf1c288fdfb84c27ba221f732a3f7f8d9606fc54598d5da4f6f6ea76b641a3f9b0e200fa8896c0fa4e3bae322d0221de2c019f175d3a1c7c6cf9baafbd319dd0f9d0104b9d875bd0f6440f6e2299e46d8409b04716cb500855cdf00e404451191b1c115626a3b0cea4fb850e3d2d7d1ec1dae3c6652814f9ab758971a435a1f2e1f0ce23664eb27facede6c8f38fb948f31baf3222d1f64a4112f16cd40647e63087112f4b15c7a72c933ee4109045195e673fe25901b618b31f0add332da0f9ac1948b615be78b6958e93f69d2db49d77254e23d5cd4770438bbd69dc00b637e555ee951dc576464555bf6e231219d0a04eeb98c4ef052b9df192ce0e27d3c62a00c23fa299e4eb9a696fcbac92fca25903ab4c5fc14de52834c009b94da775e44474682e250e95c8e3a0019cb590947cffb29ffe0c1701417b53b1a4a6833d6c730e4c0fe5d0bcb3c7511d5908eea19ffe8ef65640504331cb9cc38ebdcdb16d30a42eb4923fbfa643aa41de811a1d405ec54638640b913ab81d262a939ac79e7073b2709710219170614c9ae07efac8f243e0f1f3a7c1ee3aaafc8cc50010c7ff5613bbf6307f1f8eb80794c271a8e16380162f6f89b57d37def8778279cb8ff87a39d9fcf5cb59ad215e283b8bd5a9699a3113924760e837eb64a7bbfd500da7f37aafd8ada44b40bd70fd1d1e1d20168f062016871e20168f1630168716600c8e06201686063816863e6b7b73a1ffd1dfe83fb42bfa1fed82fe43bba3ffd06f683f743b9a8fbe86eeddeb8d88fd8c5244c30f289888f3fbe1ef01bd8ae5a2a6b132a21ba376666afde4a8a531103351ef446336a8e6f1e53668be5cbb661034250d385b6671054a2dec3546f9e3ed2797fe85ff908d79aff7d56d0bac558b85e27df870b78452394bef7292d7495577191a9d0ab8a5a6b6aeeecd97bfcd0bdc7d43653795e5d6d36a581f34558d6ae584b5d30c65cd39b9cb5b1502b44497bd4fcc3ad30c072827bd93535d817700325dcc3aa7720ccbd0232a448fc51dbb25d1c95d8ba75574029b74aaa5dd8a378f7817487ca9ecbdfd63a275a9dfe8c4400d8e964256fcd7d0274bcd04f6ba18887aa53a524f681e0f2bb23f4c6455ea391a1f9083474a392bfdc622eec7dbb55b41080742f2a4aa783ed2aa156bb11f26b226f51c4d0fc88192b246f040bbf6dfa2ff31d192d4d7e803b5cc5f46c318297865ffc989d060f0f2e93873182a340ebb1fe5a576e233f98ffabbe66ace304b3c9ccb51eae062a3ce65d481c597cd4c48d35563513381b39e3d8cd2ca2e3e84f5d1d832f449a37b344da9ae423c7bdbaab249c110ada07da898e5ba54d8077097bc9ca44440b5012eaf3b77ca02a95dd92538d51b97c6744c81d20b0dbd95977fc1b4c2150a46c78e9ae7bf3c91354672293e5704d0e7d27dbacce405d2104f0ea581ddafe06857560473ec0ac8593b83ab3d5aa4f5b1160ba51cf2bd5b17ff69ed58507e1606e5f48ded12c33fa0abd01809680be85a2ccbd53f5a6f8b80910b9eeabdc0d98bb679c75c14ea2eb6441b8bc992dfb48bd16f89def27d46fdeb630c0c9429cc62b314fdd3b2afa7e5d630f4f23ff7610f905d77d9c95d1e46ae1703ad72e8d77c0f27c75df1f297e6287e3df2f3215b79753b72165f02794b6d430cf1130d1418f0e48c0dbe135770a9884f5d7ee85674aa8701896e0d5612d1022038463819a6f743c1c48f33e163978eac7bd9a9405f0838fd6d7e67b1446d155625323f31372e01b91a0d017fb8580c3c16a606d7e24cfc67831705c087984c491985ed3dc5dcdfe8078b5e8bf4a7d7fd8881696fe3651507ee5e3756bdffcfbf1021aecd81fd531df008dec57c1d48590462f8c547c21e62a6ad8d8715002cfb9ae9e41b42133e54f230c848e50fca4d6fbbc17d0b55b646c9749cdaf56587164fb06d09106bed5c5903d350bd28b1a2bd9ca2115d26c891404b44c5ddfd0aa8ce219874663964a19cb6887ff2eb6f46bd981ab56023947eca66ddc2d18be14ff43934e6fd4aef9cac4bfd97dcbd434add8c2a1fe5e0296d62d03e9a6e983a510ba2abb6ec9bcee8e559611f225df3cf8a54bbdd75047427ae9e8b96fc5f817df16058bafb47b809d7f745358e3825688c8e922f42a4f4682d409195053bbd3883eb84f8ab0373170c25b11014599e0d2de51621fe8ab62e408f83dec8e76dbb3489c444a6330935522b68291a4112e2f965d5d2ed02d45cc74aac0f3bbbe6cdebedbd0fd65d43e3f907eddaa1ccfc1b67e51ce33f357bc95e4a0da0286a385020f84ae59efe1265164376abd2463b78b839c2f98bfd46ef9544183bd0aadd2e7cd690c38feda7d1eeff6a7aa93d4142cdf735dff1d6edeade2e0dc75d7f7b72248f6f69dd7b5ff5f1898c3490289fa898372e42c990320dc69cede9a01f68d7ae4ddffec3202bb9132fb6c5d1ac2f80b25519d3b148e6b7627fd5d39bc7ee2b6591bfa2c0c3edda650ab61d7412c808b90536f16d7ce27979470fdf6b95b7903ab9e16ba7514e41d160adab876f9c2ac1eedd283fb7105273e31d5f089b581423acbaabbf51ed764422367bd1d81b05360fbdc17d2af4d1b850c310fe9d353506a7b6edd8b964731f27a53d541047dcb9cb9a1cf37078adcd273851e668146da529d01fd5cb8e5e6007e0a21c8e45714d22632ace021a10cd7f4621447b09bf40d53ac8c19bc3a117643a5b1df7286e7244cb7753f126530cae50f179205b7754d2755b230a4768e1a1336f1c19a6c9aa70517cbc6b90fa2173bb4c6d8c47bfb29a0449187651126ccfaec693a17d28dfe99ebb3c108222122f0a777e38ad8badf5b4355b4d03293bd38775bb8b4c66357ffc8ce0288876032e642dd50f49d62760d7d29323181173c6c09bf0c0f82c0fa55d88536655aa764edfbccf667b2748fc520ff95909c46cc922d38f4b529916bc907ea37bdd3abe0096fbc558853111620a62458e29881929b62066e4d8c95807d2d3a0d7cb5a94fd03baed5e925720982a4a07522f6b71ff1780f1be6ba0888fb13a53638e2223dc335b72ea07d5ab2cfd6eea1979f1861ab46d7d82038f00440b80f83fcabe22f4e8e27f236b69995ee603796c4b41d84f082192ecbd37217b6f29534a29cc08ee085909b0fb526e9148249791ec4edcd4dca5c331a1966cce75276fe9a4fc52f322914cae9950be39cab5eee4b0e3dcd47d3b5f7254a7f9d6e170d354eabe1c4d924aa58dd433247975abfb76e0f2a00b1e78a13d097679d0050fbae0edc10cec03e530cbe0fc609ec33039c3c3f9716ef29a2602238c30c2882ac53895bd3837989616d529e53c5c5a3697be39f46ce3383fc592f42d069367be39ec3e98871ce4200739c8996636394775df96f2cc9b9b1c14523a744bc6f952f2e899cbee65db3ed5e7db7c29cd22339bdf0c1f9ddbfc2222bb4f3a6aa69c9b3829cf72609ef308f3a9133755c5f1706969912d92e332e95c8be4326e862ff9d066ba2c33fd08c2c2c32a62403911e9f124a1a76643efd1c12d06d484c981c9819133c0f873fed1c7471fcfa552f353a1be540bd7323f99ea24572a9d502dce75296fe98aa4befd66f8cd6367aa6953f79d660e4cdc6e4cce7533bc74535764e33c462fc51c9852b77d393040fc122a33d0c08106100c0d1c6858d1128354f7e97c2a85e93c9c5f6799cb29fde4ce9ef45297f229e149b2b76da96f076e0a3517971e1a0f93ab3097e825e7a1c12dceaf06f9247879112cf9cda33c9db6f992729c936f9e9a9b9f26945ed3b1db3cebbe93c953a6e85b74294fdda7f327df0d06e970bea4fc25e59b97529388669eca3ce559cab7eed381a7cd1437936f13c7e4a989c3c34b3bf04b7307be69421e3c7a68aa16176dbab86ca7cd653b913612c94ba793633c93827fd2e42714cae4a6c94921a77bc9b94ee33c85ee85731ce827e726f493c309a76eb224e526e5697e4be4ebfc8ba7c0f94ba7bc4a953c859a76f1d87d2d7e6d13474a1e9e8addc94d2e8e2a9d3cfac9a39336e7d1e19c26642fa52e27e7a50ee52ea8ee6b993b709327df4e2f29e73ce55b87f2d895fc24bb4fe7a5a7ba9247d4dc9ceb70a4c7939b4edf0e34bd941c27baf4d2e4a4902f45a24b8f72077a9aeb3e69928cbc22d1795883ceeff43a0f461191294c768226f8022c95e69753f2d865cef94614aae42753a9e4a52fa9bec6b5a4e27643922995632d0ea7dca4f370714ca6382f39e7a5926f2d9e691635d5622839470201649fd426e7d039871e3337759ff682749377a9fb38cf667401e570be78a97b31b9c671f3c5345df3cc39d732cdaf7de9358c823148cf268e74d3c4d9bce435ac75b0fbb899937a39e156649b73a74b3c5c522df3db4f798af39267a514572a6999735e4a69db0d899b502b615292cac89cd45b0ca58e94928fca502f48a014e3f44e5a0f6f94738e9a29f9499447efb14d600989e49993665672dd4a5ec359e62513d77d392989eae4739c2b47efd1a387f4cb4d1d094a9e659e3dca512557e7ba6fc997fe74539a9cc74ef35367327d72625df6652e82255f726da3803e17bdd4ed26811269e45af7a18008f67eb34dd28e8ed8c4b8f009cae65af7e5bce6242ed32dce2f678b81e3f9459ccd499c9693daba6fc9335c1e928f98bcce54f1d0534d3c74d4b5dd8c5cd8878ea5c051213f9ddfe9c741390f18527a721787f36b718d014e0cc7e42537b967b28b4536e73c765c6f3194dce4b2fb522fa5949ec194c9c44d93e9859373bed0a55beb3089280f9300e2a1a73c8b5af48c83dd97f3d264f24f9a1c7a66ea36e73653c7e92601cd4d5ec39a6996dce41791fd9397baafe4a4c941214b13e7e4dcc4c91cbaa9cb497d69e6a4fe34a10b5b249b3ce64e7fca5d266c993bfd288fa90f050f4b2e3d935da9dbad48bfa4e1b918e043183e93975c4ec8deb7d38f9a1f0e8f69dc763372d83174e9a6e7e6177da7771a2e84654888ed5684f49a9bba919fba2fe74f359ca11a4a40ce6fc94b3779eca02b735772ce6b98ebd89d5c7699cb9e51b994a80963d87c9b5b1cb9ba6e30ec6b1367e4a422a349f29a3e759f7a84616472dd4c389a93d6493f3e88e3496edae6b724f525e75ce5697ef2a58cd151a8f9612fe7c7b9fac9559df22aceafe4fae57ca9cb49bdc9b78e04fb9af756845f9b38262739c9752b62fa723e72ca5e2c790dd77411939f5cb72d76a8f9e5680b2597ce75bc15294de959d4b48ee4236d72a7cec41fbb2f2795297bd2752b224bdcfc5010e796b9bab6e4497334fa86bcfad57d39afae8db96e700d2684d002ce9cd49360750d2684284291965f6fe1140e908889daca70e7ea0afa111f2c44bc0df021841ea1d2a040209224a40ee9e4e004e003da001f9643286354483f748789ea0306e0617462bd200a8c0d50531be42ddf206c3964cfa58e216988f108f9c9f705c2721c1d43a7672ccff9803660864d804bcbf20ceb566886204b8c5fff14096fed3ab4a243972aa4dff28592c31332e800820e3aa03374f6e804c644754b23a481f58d3852d86c8b01aa42853af431ba49a0b0b78c85f34fe128410815baecb80ea81b085ba229c39ccc5306f6825868e70b7042d52e522062c868e990ae439f2a54881016835220947259b087bd29fe56cfa140966751739154b907a950893290545806a867b8d952762f0eec616fa1942e8252d68bb2ecd02f17454229700aec3982cb8267b8e9309dc6188b85bdcd82bdb5012e112d6c9102599c662a2c1305f461190b47e11b2a04f375a8041532f225f98834bfc53ef6a6d2be59d8dbf689c23fdac0ff75d11c2a848edda114c016fcbaee0f3c423d039fd0d5facfaf5f01897eb7c83648258b5c2a50683d326199afa9bc104c8388a126cb4e8565a260191f2c1dd45bb80093a5a8b360a0381c46e523c51a16be826d37307a0def07bb8d823d1e7c3c210f525df9f57586c23251340e759edf126e07124665f67d9e38d079f2dc21da3898882cc208152e84f0217456c8daded1ea89c31376471488fa5c2a2c03bffdb66753e0a69051b88173a5b0c7752598a35738d785b2e4e376c3dea4674a53059c2b5962c335bb116ec2ae4fc0f3cd79734e164a86997eb077157596209b8035c29e6a47df023cec754884edae77e7b1b7de404405e06c7e2ac676001fe78f1e42ae6f149e8142bc5adf1fcff9fa3ad92ffa4221aed3347886f375ede8ecf99c01e41dccebfce01b30bbf10f26b082a166341b0dc763ffc24886232a645f5f06534bd7c902c1c2abc7689f211592a06675cacafe8229494c9992c4942953928801d08f2051c2434ff2f304141efa0d4160c213450a9afce0e10f144f3cf47d02c5060f7da370c243df1e96d11f29b478f833c59387d0c78e1f646b15369e9d3196810a6582b0ccf6d069864008d990106b1bc8320478b6f22c2483e018a6a4cbc777cd1c98c77e6070a54134bae202cb8c214c8c2062d1058426b0003eb18050c70f8d46c45e1003962a1fa85064b0d7e59b0695d69e91d6a5fa8b8a137f39e4991e6c2e4fb90ad1bfa490d4ffa4cd1944bdd28f526545a6e2eb4f15a1ffa46f53b0152d2b16214baf3f3d3fa881d45e7f7a84f003897afde9d92209c9bdfef4a4d184cc5e7f7a9af0821e3baa04f5caabf0a03f555c50c34a04a1ca0afef3183732d57c7439c99774659c6f9adc54da54b2c4c6a1d72b08231624476658d292e516521cd833ef0e07246460cf260eedf121ccfc8ad685c5388a588c11ebbc57358c8de2c55977219930c1fc72264632f7c11e3c32ea747a0587ba7b649c2ab561eee638c5d2b20b1b599605dd1ab9655996052dcbd2dcb22c2bb3486e912ccb72ccbabc907b84652cb7506fb9757a249665598e3aa910e83d30884c61323903fb08ae6fa04096e596e69b6f4e23448c0f6f59fe6d8f95eb0b29039da9e915cffaa032d12de9966f0e3a03ddda224a96c5b9915ed5f48c8e0a935da9ab00db70737b16a85b2a96eb18b13222d2c81a527db6438d6143d734c22d1b2a44df829cc35bfca495b9234a5ec3b0bbd254b2c466797a653de995e5b153c29ee55bb7507a65b9d65d41f2dba1b79cad0f2362994f0071b0cca759764809cb406f973d03dd72cb05a042a2fb588c8191290c3f80fd4b654ef24fb3acc876cc41a033295dad7f4065a243cca1674067d8a11cafba524f6dae2f32c003212b73478c1c2eb151f52a2645d32b08fd0203fa91d40ca976e8cc2d476684e45521db4b052c6fbf40f417e7eea502ed597bf6720176cdd935cf9c3bed4502fb2f353cbffe8b4d776aa3752f36596397c7f4eaf2ed8c60d8751961d29e04966df3a502975fdb7c59df5c6d2ec7e165e78b11ce37ef386cb8898312242ed071d86c1387cb39e7e6cbfac897d8e02003e79bef4e19361f4d25996fae4473ce97d8a84d0d36dc586e645472b5c1ba179b6875321c61af7d2fbf00e7d7c40109192edf1c8797759263a589c385f9cbce0b901c7bb9c0c82f1fc5ceba5117d3d5f4aa9deb5a6db64e6db04e6dae4e82041b2d810c97902da47d5808351be0434e0ab94d32116c5b449286243db336cc1b85aabbb1fefa427e3a447a761d15d2bc39e8b2e0995fd697fc4e1bd4634605e8f563a79f84e31652dde70c22dd75f8027b96652561196b32e6593ae3e92a09928e061542c232eaac11090d49d80811242cf36950122c392cf3c93052c3f3545589b005c54c3eeb95d7d75e31e4abdb264d24d7af6b9bb0cc35d9af8ba73d468d499030731339b10184d9c559c6185bed85dbbb3d3df6d83da6fd49515f4bf84ffe2053986c7bf5eb0ba942482a047e7783f14412fa5251d1c0329737bf403b79396f373644bf3cb32c0bee40f483210b6ad4a0ab151a8c012147d1c477e9db77685be0a49d98f21dc4647dacfcb7421a8f1346f86fdff81628092cff2d966f879c352f7316363fbf3a1a92e4b0d72357f5a853f5483865dc423ab1be803f6a583175bd1c5345f2eb1cbbfffc77c6783c484f26c890178258a1c67faae78603084e5e5d5199faaf6bb73640d89eee90294c86c10b62ccda67b90e05f6d59a46d490f08296654d5622a14c612216f273a810c20ec2409e2c8536425e8ea4a6753e1d6ab76263bd6a25da6ac81a5d1f5d1f5d9f09bd0858059605161674b5ead189a450c33216b4d4bae1a490f072eb8525fbed23e1469b52330db3effa3601fd792dc9f53b158c5cc912138cb0f961adb9e6a3d1683475c85cdb9ac6f69a478c3c1b4d168c5c0712693472920e2392eb30721d48aa5eed8fb6d4235b54b2947c188720a107034b90298c4f4d504dbb6cdf1e2c24d013284b03288c6581f542d906f0ac8026a0e6086b448d17f2db9e9e9e9eede9d1427edbc351786679e027cc03cfecf0aabd8198a23e59befd6320b627480fd16ecff6c05feee16a30625e5e0cc360a0b3d716849e421b21d74deba3cd486fdf375866f3266973bedd3a6997a5eda637e8bcf9c8573ac9b351b7f324af619293e63a591e35e4b7fe2dcf23214dce078657eb5bf743052557b2c4a68484b3e6f919f992974abedd5562be4a0bc4b797f819e70814c4d820319dbd7518d867c89e181b2a238bc507fb16f0a9f0ea5ecd3680b189f56aab7cfb30064405152aa45320bb455bd1e96a7d1545855f06fc128141aa6479ba9fb45ee92633d8e5a38ea657de5e98b77a3d1323b159c336d615f20696695df500c2c4435b1d1b5edeedd715971dae3c63c1a02a9627fa0eec8a9dbd032aa49d97f0ec1ed01988c57fa611e88abdbb1d05b284d0eb105e7f9610e2b3dd76eac82181368bd63142eacf123e7cfb5e611c784326e4d51a0f0f0f141b98868dda40651bf61b6e3770b53ba8bf1e1a6442626f03fcf6cf2bb2d29909ac02a9c2f8bc5d7dcac57fde135120ed6d458914880e361ab6762fe4be25af0a849dcc71f96a0236c278c5183bfac5d6e5da5d9ea96297638aa952d1f391ea316e643f6e48f99d7e5520eb5209a0f359c9392ec6c84528a597a4eb1603a7a1a494aeb59c1cce8f8b21f3cdb968ca363f755f86929bd4d95c762f26cf5e4cb3c8dc32d4496e1307e5a689a3653bf05152933c5c522da91497e2322ec56526d3a9575d9a9fe44aee268f8e2ac91db803759e73e5623c39d77da454aa2b823ae99c487307eaec40243a2e2c8ba039aafb761ee559bf60d2be34bf9deff9717e22915cc55ec9b90ea56d25972592e3709ba9a469a7eecbd1b4f6ac47ddae1b0c99bb78f7fc52de029df32ebab46724eff9e5689c7fda974aa61794e3985c73d4d4dca475c984d266c963a9eb93efbcc97783a1e43d5f50de0e9deb5e50ae39e7d89be60b6a12d17fd950bea19c34a19b5cebbe9dfe4c6e69d04f9383426adac4918e9a382ecee568cf79771f9c39dacb597271e9cc61a7607bd6d2d2ad995a6b698723efd64cf3835d82ccdddd65c8f691738d72c8322d8e4279864299a6dc5cc51e3c759984ded29d1ca7dde4a7d96e72d3a6fd88a48d462492b6f3f00439efd1d5b4a923c17e8b07ae917eb0f78c3524371214536897cfaa9f90fe9f77cf2fc6611999c23021a1eb7b31bb58e428649c1f0d843f6e3cccc37af0fa47b67fcf8fc6e3892a6855b9057606d3950ac99eddc836807780f353b5d173358c67877db9d330cdd50d11820a12f2f39a1bc21cbe27c60ea4820281ac385455d78ad08ab0bb095f4c1322ec3eafbbbb1b4208bb1b3664558c65d4bfee8658b7aaeac5615f4008bb55a3ea052d18e172430817421de4f213b23135e43a5c024208ad27a525da804bb4110776318cc2424d77b74557ecaad2990502622a52598cff5a36e87a42d4606c5ec8a902810e61139885c1ebba9810eae98150103e9411051848d3125c96718421dc83f1ec209a42f678fd2923085e86114fdcefe88189b178c0a454a99c26666956f5de979899390b0e9e999999d51802127e200212c6f8765729331d6c98ac34968c34bedb058019d123005e90d1c3b703609db0038a1454888f45403b3686d0182cf8f6177947962e0516da31318af0ed1a461cdfde63bb69c95998d0128614d576d3980f6b1651ccd1841e70c10319729c71871033f314d8761c80c776d3aa8739ac33185898dd65bbe12c5b6c2d1e1853be3db5ddb4aa8b1e2b83820d50c077101c4154a8962881a5064210bd41451d465833eec081e42c3d031f3ca35f28810b1313f961aba57c7841c5333b26bdc8f2ecaa2fba7876e92e3918918411a8c8800c2a56888e205309b26352e55e17723c3bf742d11436e0c982c70e35ca90c345b753cac701c0e8028d67972af762b48b163cbb46a358ecc8525222a40df03fd5abb2ed06aa8e7080ff7e1c81478523288185072c653c3b69bbe198ee1e58f9c20a1334b8c062c5a691f0ddaaefeeee51d0cb1862a8fe0b42c69529b698c1164a70f182672e868c60060d13ad1285257a30335f6a851168f0edd60fee6022b57169b438e31b63e1d955315e329e999d66881166e629b1f84ffb4e7d102d5aa0451745f042c5a38322c1d4abb2d40800183058d8f145165934e1d9bd08583cfb7a2fa50a7d0a549346961e5a30a94955bbf6a5dcf8f9efc71529782ee3d9b12bccf81f226cf1ecce5844f1cc12032287b4420e1eeab80294830f735c01fa818739a000d5a0083aa4004141832227405dec9052d5e18457fab18e27bcd2ff3009240610597a80981083222156595125a1ea61092220a4e9f587892639604208284c289152fd3491450e641516d418f908aa353f19e70fd6211cc2330a5de59a461012fddced45a8b6b05d1005f223d53f98f756d5183feda5c698d545dd8a90eb1c84e495f107761582915c5de706dd5c9dfcb4b6b6b7694c680d643e9a2878b9c0da8c7c6d46b3896693791368c364e43b6036ab2ad8ec2603b4c9e60e2a28d98c9c6de268aaaa10975499e26311fdd9668d080d4d4c8ce7b92b10ebcf5f547c541f5e6d0e9baa402e87567b9eaa938baf353285f97893f48ce5b067305fefb90aaf4a25257b117661188cb7b145cd3cb949afdc90ebdba340d8610be4fab73d4e9c70337408258b518e81f393dc0f61376145cf5b21e5d77776af900f7f750aa93e7764f96e3b7658c606f85fcc0ddaf27c580c8649956a8962886e10827479f5a9438ec7d6970823c274d80b82f40ffa183b98f01d4c3cef5ea982ad018914c2e83146c89187bd1ba26accce5492599a6e595cf23cbfcd36254426c86f85469ac2e5ed8be562cea656c15eaf0f7bed6fc80cb3b2a91c1431c6b8b921bff5b9766e13ec75d7700dabba5147eac158203f255a1d7426a6392fb96a36dae11924bd62a242a2ebc4f4cceaa048ba34b9f9e917dbfc3607df57b2f96d11df402b836fc7e6bee0dbad985e260aa4db90ca9eb3c1ae3f496079e189bd0de629d8c1cdec50555555f52c3641cac0327a85652ebf9ce6f2cbbd1896817e5997757d3f82a85f7a69cf74baba7c85a97039bb02b93c0e49ffcbaf4623cb1dae426ed6b5d552ac2808ebb7665113257415fd099efdb962eda843c60de2220c93b237680acbc42656131b16aba14881443f32c6c73e437ede47cbba7490ddef7f184319c120fba102c68078c5c795aea2a740a24347922487069e3622c315af57d1a37a3dc301363c38a237910839815376d3b030e40e519fcf7aeb9820d1be83db28afc0a4bbbbbb2f8c0572b79ed81bb2bdc6f72daf2172866c61087b161196e9697147a4ab61cfd29a21d7767359db0b9fb6c22f90df01fc02e0b74508afeff4f99a9e5919e8ca7226bcb2dc62419b9f266185ff964785bee5d1a0b7bee5e1b916080562f9f200491f2c55969561f9ed2c87966ebd3e241e221bbbcc30ec45668b84812536a419ad0963640696a18a8fae13d3f858c3326bf97bf418d9f0b7a611051287244f1d428e61526e4f4f4fcf7c4057d021844049b26b0e3a24747dd823d403d749cf20d1d5fa10e604d2b01ebdcf90d05588f7b281f637d4d5c333643b4d0c0b3f43f079e8468254a84a6463083d0fdd9f0db9bbbb267565182c5e5ec390a663d8eb353e15fa9d519b2a47f47c3b122cdfd13d9e2cb021a6f8482c0a0ff22a6206f2f4fa230417f8400839f4cc51a50a265c91042baa28c30979bdfe541154c595182b42ff790c1419337333f362ccccccccaf402c182333337333b345e32399b9bbbbbb5b3e33331166666666c8707690bb1b5b9dd199e83bad289f999999392371aa26b2cbb5bbd5ad2e42e8dd9d025177014008216caf2354851d84104218d7a3692760ddfd75f7be7a9a0ed7755d17ea728b4a0fd32885da5c08810a0f714ea654cbbaec6973c1b44960c97c2850a0c8cb4b970b84a233c423c910e4c100155444570a30c4eed39f873c3c3ca5adc8e5eddca52a1e443cb6236888689a34e2b115f11e3005a2a8eab981ef1ea6607a225318c57a9846af52e7d7bb5d28fd252526a47df977d723ec084567c84a32a444540c80a2c28aa7e339d29791e5e1e1e18117d3f44ce6aa3e52463d59e791dcbde6081a1a7624d656c4316fc4ae3eea64af9809164b08057a8f2cce628e0e08d7c967a5181e1e1e15d8e89ebe63689478a02c7eb120d1a12cff9fc6a1597e7f9ef8cbcacd25a3008b6566fed3de011f1da3e3a3145106b2cc0a3e4dbae3904e1e8cf591f2070c7ed81b5131a020470eb020638c1e243186cfc3382f1fc8b5d1111565ac9e1d9310420821953b7ac841910e5b8cf1c4068a61c511e275c57fda14430878fea1620658f3f0f0f03cb1f9146888111aa949f8c11641684144c5951cc00843863d0833f7407ef2576db0dd5d2df510e6c7eef05f10161e56918510fe49ff691a0fdf78f8323f1e4611e3bf9d4284df281ebaf6e0a143c7a4cabd989e874e5343c40814527c1133297bb149474065b80ef5ba88bd3ec2715df4cb7564f9f64ec1ce31c44e66c02d6842c4a3423ace4181142990f6236a238bd0996da22b226646fe6dba5a2952a89cf86e6f28c86f9b24e9553b86a954b18647af2c133be611ea2215d2836cd2a4c993264d9ab4b050fb5d8d305ea34e6db61b7d663d212d2af2830f8120215c6666d883fc568a1415c25ad42a84b8f22bd433cb83b5b251bebd6fa05ed15259c2ef124fd8a67d9d48f9f62582e4dbf746e7a29e214d7ef2f193128f02e91cd8c9112c58a15e6d3fead80676213f2e8253482e5221fa4f382958881b603bf8f655e289d0ce4ffeb7425dc35ad6ae6539614f9f9fb0cc1d6fcd910f12f56ac549d1c38632e4085d5ab6462325da6818a26fe0db2706c362b018ec8ab9608c61d4dde7704ed846f310205bae1a9242ea467446a51ec33bbcd2e11cc824b04ac531313131b1d3a4940c218c551c6b6708590579d381ecd4efce20a121230cbb31669e180de613b30d876cffa427db9a236b61979997f4596b3cc23e8b1a5420ea57b43ebb342b7e86699786f567246dc412e04cd332d208cbb8874199c2b8a740208410eb95f684d9dd6eed15152c2af60310800007122d90f1f5070e29ff49a982038a4ac62ea58430887a88f0021267c8f1860b9cb841154555e480831a400172038c1d406122e1b92b3242cb9a40d0a2071e389ea0c50efb842666f031c6a8761861350b2000b520a8892eba1862e5500880d71f3b9678d2eb8f1d52e40e3116dc30b8805eb8a0091db219b3348931c6c8841b2326e2685285093322136be8a09fc341c68f2a70047d7fbbea82230b387e30278c08411049200219544011c4137108a10350bcb8c10e3e0421c5ca3a41c51e268584af3f4bf022aa96c0c5c714cb4098178272095bbc4aa6968005d791a9491dc85ece027becb1e7c3b717db8110939a922a9d1bd0909fb476909f12b911854873e2dd60b23c7d4474b5811e3b0c7692e6d9bbc2700c952e2464a65eccfa4228bdcf7ba8ecfd2892bc023b0741ce21531c5fb7fd1a8e71af0da067ff11e4f987f749f5e937b668630a91b601c4b3431a16b2b09cd9f311b97777555593ddaa2b1cc42bb067d612ab84fcf84a10cbec152c5724f7609f8444f00a06e3d97542339ebd996980144853b19a20bf9898204e78a0faa42c7a0eda284d006552a4f01496d1b950a260eee115a40421b76779ca22d1d323853d96324581b0b31423ac93ee612278c5ce519e7d274b9952457ed8b39467c7b41847c6040918bbbd182c7227d629d8eeeded6d1f5a481feebd4a25f4de0f166052b0ddebfd6019bd496d108f477e2ae943a69a63144537b051c5b32bc1341fcb047385d95debb22eebb2acb63a6b6af106f6aca14b487e987c51565d6548ddd69d442b19931ddc06e68b445dd4411e5e811d4e911ff3c021a4f47d92024f37f9988779a63c077516c8037bd65948c8d3456d032714c242ca9416a10f4547d800e2d967c0341f69a8cf6e7744b890412fcb3e60ce329ae5d9a14cc168ace215d8bb934ac83b6011e4279508d9da30f3eeeeeeae2ad4a851a3aace1d25ecb1cece0d4aa24acaa1379e3da5b3b34c7cc4ee55d58d6badb5d6eeae478e5389ce0d3becb17f2b24b469f08cb3631ac6836c6d600ce4930f7b7ea2fa19c2f2eccb03a6f958209608f6ac4876e6f96f9fbcacab7331d484027d343445cf4149107ab6e145e3b312f4cd96696a7805f648c303af14088c08194535c59be095be1151f06ac81052dc10fa1d7e11401d99860cf1241b324494ce561b32441496e1285846ad5879f2fa439ef8b08c5aa992e5b9214344d9ef39648828da6858d612ae0aa4e3d88b2dcbfa910278fd59830ad51a48b06020d7e3102473fb122a1a762fd16da8d1ed264e171e80d3de01f0003c7b002000550031c6c8cfdd6d149ebb0f05393cbbea6a73d095bb97767d1c7d69f5799d300a9f410d6319d588d1c0727273796f37268718cb44685da38d9332415e31d7cc6b18c360e8cf2666812543f4e4e084190c01892ecab0c93ad4cc1cebbe9dc7f66b5ac9bf48374d395339da972411e43aa65ee69af9ee6c1decec06ad53f532875b11f8a48c343f25a34eb515818f4dd8a5b61b6bca1d4836fcb4d60bd4b59b803ef40877bbcfb27c75670deaeb1d975b076cca5ea9eb7029d62c3064428c266bcb612f461f8d4ccd002d752f9b63b2e40c50199473aa0f90fea99ef385c22bd658632de4a743afb37303b7909384bdb8c35ee4385291301a1a1bb6db8931ec79497460203fec2316860c43c268ed171ff78aee11d43f15f65be49878c96b7aecc52c41fe8861ef4ae4b2ed91d2047bfe5764f66ef8ca156c5eb9a67b527a560a7b91c7b7eb5684c7ef14f6e246d9a07cb2a18c21a17f0b35ec8d35a43c74b8c243200f07f010000f5b7466a144573160a5bbc185d233ab86aea22f162b568857ae5c71d350205780648dcdcf1a407cf423f1a3f13a066ad8034efec198fc4b350a3bb9ca34e5642e64f4759271ca096b30f903bcfea8e105b4bc27ce84214ed8c2ce3e2f2b1c43b66fcf8f194ba68cf5a4410479e066f99db9a09c11c7af94bf4c220fcf0413422308ff05f985cdda5158ef343285899a77a7757fde37d624cd499a36729216a3bf700eddc5238f2cb265c083a667bc1efad5eb8f19517c0b3d7cb32371bdc5b579b8f6afaad2284d0b0f550b0f5589d79272f5077bd15b3a1faa2f878567dfc863622a1f752ae71fe4a74147a494ce3e4893bb742f3cdcc55b9ceb5e7838e7fb99d675c757c8234152281ad88b7e24853a720339f276950ff688d0b05033c42265ad695d8b7787d36eb9e518966df3a5c8e699b7b0f992d7ba0fbee6dd7d48be9fe45b0fd7ad859cffdaaf5ef2dde5fcd5edc4efe19af7e34bfdc8797436dc70ee828bb7cc9a4e751ff61da7593ebad4a09cd4b78fcc98f28ae5f54728e833d6b8f61f99aa675888ee83379a2148a7f9f8492ab2a79c1815f2d32025db2eb46b9e7538dd71e65b365f5cc89ce42d642cfc36bf7612ec674b9ebd77bbe915c84f8346a31990e4c4385fae09312b2e69595311636648fd1102faf67dd8eede31ced5927cec8ed15d9b1f866573c6d8913cbb2175f1ab41e735df4899ca6b904f9a9fcee3906247f24fe7b5b9031fb6409a96c6790df30ff2db62641fe4114ddc86bbb259d39146c7d8b142fa5f5fc89a21d9b7aa6718a0abee2bbe3d6e116954717e1e74f2c5073fe879980a598d74c6009e4a08a6801b4f81b47b57ac5c0eff7ab95c6d34d7a491a894adf694410a19cd00000010003314002028100c088482e1602ca228baf40314800b8b984a78589acaa324c7614a19430c21000404000000406064b40900da5d98fb1e517efa1e2bb16b999762b0de4170ad222e917f9e3fa811099ca1ff3776e036b9a26b1679ad329f138a99736019efdedb0e6db7cc4a01601eed510f2879103d2a9a1ced50a655b0b37dc985b6998060d4ec58927a6b30eb424a26a7177387a1e7707f923aa3f26c088a8a9e716d8ea23d0745cf121d1dc4b3cae6813f14c7e036a4c6f79355e1dfb4ed88c3cb019f5e49dc5bbe47565f3834300b0754a8bcd5089a382950ea046f327156026a4843f6b0491fe18a509c707c332cb45dba90f8a741e2a8094e0e65b3a4a3adff4ae26223e9ac913c197d6e6561888a0f51a72c949b97503180488c82d694f5e334a7dfbf8accc28b788378307c96ce39d2bf1ecc89dc002ed84c9f5d22f14e259d59463acc9513294a785026479420100c5143b45cae88f0616c27ccdc36011a37d81100a772008b26c85c295a2af6c3daa0ef4e5ad78ca25e55f04adbd1332abc7583f867190ce244274e7a4de1e03880c808246aab64d3d88bd1d3b9813033884a17298e5ca05c289d69398dd097a03ad775679134f720eb5678960cfd277b537a1591fc940e7d6a66163e2e97b40047850627ea1103ca785c165c5520d4fbd48e86314cce5b40910b8353c555dc91b9f7236fca116e9e18e62d50ecdb0b5154a04a08c4c11aa13f7eb00e94c69ecf3b7e4a2054fe2b0fdf66b4f04a42cc810f6c0b2dbc8dd784391e9e318d4c02be0698218d57af59904d9238dda956f4fc7e6dd00209c9ccd6242fd271665e2824daec7f436886043dd8fcc9d8ad241d94cbc82a8342f7b91454c166fa6c394281a6cc14cc3362af39a64c8f87a54c570abedb3ca5d89f4c8c3e63b32ea54d5767fadbb5c65085ce6dfb33501994869e375cf07ed4ae76ae1ec87edc810ce1534c6124ad6b3d5f69c17a8f50c168489b01c41ee7e547be4c80c308431fd232a83f05a58966c65ab403546e3a60accaf02756db442adb172fe9a3de05fd3b9893ffd18ad5964ffa2ac0f5415b0d2f3d053e1ecd6bbfdccbd4000b8fd0853893acaeb7f7e2bc92076ebbb3a4cd90685ca0a821a50b839bc0e8b0ea3a7f25a9c36296c89fd7b6c1e2b9fc9cf1d40d3e3760273021ff3339608e038179be86e656983a71c7b259159e7d8abd19eca19ff986e4fe2f44ae40ea1ef347a6dd35586f8759de845f67fe336ad5675f3b6642bc5da711fb05ff81732aa9b08cd3a21c80586fb124e60926d3a0646a5511f9ebd06cc1f6640448629ca5c3fae067d733aa85a30ed3b0c94fabbb950d6ae0c710e8eda7b947ffa14dfbc61922ab62a97460e33756da8fcbbcce6605e4bcf4296eb62991ef5fc427507e9ae60f8d2c585af523af88f46c049c9e723909e9d87a982c4ce7693c3c861b5132adaa9142a7084aacb1cde1a889d1e35dc319dd448a7d311a796a3d8b4dbab744e67e6d1e9935e769995c4d24e0da18e3adc1d8adbf6854e911352c6867235e6676727db86ed3aad3580f954e6b6bf91c3b36375c28c3350fcae1a8e556503a3b450d8f9e5f0bb82612c3373af07a3ccdda0ea990d01c3153a1b264f100b4702b3b40300953e9d7de507e31ce86a57ef5605d25e4a743e1754292fc552900eae33c36e776a41c278061052fbcec15e16cf0f54ec7abdbe25abd1138206b12405ce86400d4c387c1bc4c40bd7191ca047ad57b0bd86675176a8a28ed4b3b96536cdb04a2d8652bc978a5df322ff9d0bd8a1e1b921999a6f352aade9045870734ce1d9b4112c5cac75590899c73c777a8f5ceb1c576e1f8dc2d55c71ec4376ede16985728cc7a4f2b63bece51c1d7eb7d6ebb9e3f5eb7fae9622a27eac61a277596fb299ef368a944b2b721f0637e9dc7b7b2343b7a591ae4cc36423eb61dae1c8b52d6215d8e51af72bcb995de38ecb0bacab154f8ac70382fa43f6335dd1d2c68ce19d7d3ddcec196f148712ecdd9f3e77362397a31ea6e1b8b2054c415b2f1cfcc826b482c36cc3e33d0cd0eedbba78391cd4817dad788e46194eb551c60f4ff83262c78e2beb06cfa10e1e116a9836e3c91be4ade9cc966a0c45a24d0d1b72a478be2b76f351226a33506e197787ac86ea2e60084c0de9c0a5169e7c03a082e51a08a1c2fd6890c9495c9acc00dafed7695d2a459666755caf45f8e151b59c9137a0259462fd7a99d448adb4cdcab772eb52cf8831545773ca822c2205403c7023368fd6e25dc245eadaaacdd6c4540b51f5a9f1cd809791a38dd70f02457a4b49e547f12730d02a8ae48e201b218871aa7754fe8eacc6a3a1b9a018bdb31194191741cac8b7c0abb74f89a68c7dc216eadf7c16374c1049bbfbb17a9e37ed7ddaf4eb03de0874be8a390f071614f6f964a1b0bc8a10330991e0e47ddbccb8071456e45d718c8485c50bb4209b45b4a18a8d83230054f6aecaa024eebc79ae0ab6f15c33b0191f720f874a60139bba6532203603bec24a5d5b9edbc7c529de672f0084e5ebc07b4576b087583873c505997110fdc7c56c4f20f86943c804104180014e93352037a0485b2666e04ea468540fb5036bbca96dbb7d84b72437d97d5b31fc382a04ef7bde0a43fccd4fa59cbb050825bb73811f7f99f1df5844b11b48f3eea2687477b7a91483a105bbc424d73034b5364a24aa544a1eb46e2a7975e08afe48d2f966e253436703ea57a3630598235f075fc1a536212e140237843fafad10442a081955230fc078d24311d30fa081ad9fd9f985c8663b6c1b39dcaa0316cd2f31cfa73e1b2ff8300fd152d3379c1ad5d77e2d2a14122a6571ddc8a9212cacae2dc0e9a9de715bca5d61d7a7a5f42d3794a78a8a0265d108d4fbc3c646d89da1b936a28c2e949adf835dc4893938465e2d5f6067698a730a2336e5bbde0bb9ab8d63408ac48a71851fc26011151e90d4505265ecfb365cd56498050d916e085797816f9b9d42d997cdfb070cbcad13dbd4fede7a0b35083f1af09af805ec6053cce6517abe825486ece312e1843bc612784169737d14287c4806f7bc1ac3a8993447e55db22e863e0916dd8785805c2fa06af18371a127b2ab1d43d6c6cc860144de4d607e9d0e42f503d27d1d34e359f0e93e571fd3b2f613c61c912a4bfdf8e99a80e1cd4d4332cc9a0eb75f6373f60ed24d300652d21a6d85fe2b2062df4be1c0330eaea1ab946fed396b1756f4ba5700620a748fb24c38d00ca894fb32eeb9c5602dd49390e6fe4105533748824c219d5915c79c9892c2f758a4b00fe9aa9c64d71a35aa616b8c7bfd43d2a38109b7b5ca2667ac2a27c4a08830ce91c2845be9f63bc9fbe106855484b96e876ba6d2d8700d886934baa24ae08e0eb327bdfae73d9d466d52f6832b7dbd511ace9082ecf1d4b9e320c788643ecc1feb9e0b57fe495f7ebf93eed3dfb54f2f5327ed3204d25aa6176e86464202d83ab8263f1fd464d98d48e826cd343b343e90209a6e4da07b026e93732f7f79f18179de36c683e014fc714594329d298b3ac8817de150b17e449a0e93048fa55e4c58317c798495c88a9785bb82aa7feba9d043fbc5962ad805288bdeba21768eabf82d044aa6f52add490e584fe8598b30693dec9ae73774b3cdd211726ec59873d116318922a9e5ed90bc0eef1b18702af29602b80fc4f11fedbad51f09c1de767db71f7101bcb7e5c0c4d03df2cbe5702df1e2bde1dec02c0c6e440764d14ccab19b201e1ba3212038d42bbb2107c0c493634dfaf39362ad4aed4a31a65d5d435b8f9ba50c32e556866dd6ddc3b30f3099349f563fc0206c613325aafe925e9379d8d4be50623d97ed7f0a2d66d829efef8cfc6d1dfcf3f5318411cc3778865174092d6b4968dcbc307f69cdf48d4bf8f2e7345d090fadd7c6629add4ef96e0e79c8eef5443b491986039dd8380508a31ca7951577718a72efc5d112682fb2d2c5cc416efe23c24df5d6650f78522e9e394f6debadbe978dcad4d7c9a0858dd028cc0829279f601e3f6af99217d6fe4af0c468f72f2d9d83502ac04c3e59f91edb0ba48f6dc29bec8b6b270e792001163b968b6da17491a31cd5502ffbe32e42a6fd158c5231a595972d9834f90dbd7cd825b45e9721e27907b88ce2f6a19be9a1ee7b895cc3d0b1acfbe19e9676662317ad0f670bd204e31874506442f166f98f9ab24e82ae3011b9f4f06e1ac7f56c683ff796c216e2dfe648569de502ecddc29cc583648a0bb229304c9b0517a772366c59629da65fd9a03c68865668363dcea89001caf0b10d5037c299d97d4255c38ddc7a76075132558f752e7ccb6d9fa94a67af54b344abc0c17c9db68bff5b0a05562e981d30ca7396bfe8e7e0ab85d74b9acba8b09437d6673bba14db88ebc20560cb655b6c43143f261edd30ff5b3836ec5c0d932633cd17407bf5dd787f61a3bde3c5fa96116ab6a874063f09aa88d38b37f65549d8724b2435eae9791db34f1d548543cc7cdee3efbdbabc3bd63c43d375df7764ba2ed508e4c9cddc7533ee0929a3afd4e7bbb670720041fb58716c441047a9814ab72eff174711436c6db6ffec99bccc6135ff48d46040443b03ff40b0fab0507d0ca0d725bca5c42ada12ba0aaca5d077ab4a56d22c7cfd40238d92852880f9220ba65386e098d99d2e96b25728c7b831ea5c43ad3d86fed86a4ed2705261457d339e98e22124ed0909576230be3727f4a04f71a08c07cc4efc193e0f3dcd96d51546dadbd401e8f218328c29d18eb264322586f2868f9b911370a2b2e986dcd89500d396778d5837bb6a525fd7f3c75373ee8d3564c9cedb2bce81ef9a3af262cdd9915c5fe37d666cb403c2e0aad754a07a8d3bd5127e35c0662df536b9dbe85e54aa8f175522b121d699fc1895789dac2505cdf12c89ed75d90579c44e2676ba387649684c1a0b403df6bf4b1d1d35e53f45d194ebb1556ea75a3587f450b304f9f9ebc7157c885ba2be6142b99bd249a1473fc613edbc7dd0e61860b1cceab4a031aec3f5d130e662e3180bc9e3ec29eb327b344c755dc55d64c7b482490ac0c59fd766c09e9ded6405f1ef07c24023f22ba5f2c66adec6e7d84730c0131f760e45e0be7003084e9951e8abe192d713c6de82752533d6390531870cd53789333490fa8d2a933817493f4e0ac4416c6836ff5518152f15ee3aa96d724d5433164c476820f5984344f9f46ce640413478fff165b263eafbf93a0c2fa26bedcaf468f9a90ab89c1e0882b7a1672423ed10eb76956fc33c4813ca86b16d1d1ecbd24bd5baed825b76c49fb82198e380966d188ce2ce9a654c18139e0892f1bb63e125c6037b7a0de78360772a3be00e70fd7d8f1acb5007d15017b4d51cd299c43492569d53f5c9f30fb66223c9d5fadc6f50d4f8e5f6fae2116faf810ad6ca3ef1a531e1d4a3ee41a162f4b4634849210128f077e38c3d19ba7ed7e34448e4a6ad570a3a4b90f6767876a0868f4391458f8580f65beebb0a1251615caee21099413c1abfa680faaa560ca06a7ca7c893000f81cd8178fcb444c6d0dad96466e7b03832a38e17217307b1369f4dddc7923f0ff932f0e9dd1deb7a35a435be53460a90eb84e704ac53c28bc2376529dbca82c02bddb51b53c23be15c8ca0f9e2dbdf29c633fa7d8a70ce8e2a697c7ba55faf9d91242da72caeeef544dc734e1c0214f9a6304883e42a01875faa9eaf2c208a41a8e3eb9fe7688e0895320bdbba80ad07b2f21eb3fb22125274e41d9604dae03594dcb08ff2c26c4e2ef12ea0cd34a7ec56192968249460e7017f7ccb2437b6c6cfa4287dcef5ab6ce52b7e704fa2291ddd07303d6020cfb85a5b94bd832ab4671953b952065ba27cb6a54e74177b476b4ab815ee54069f03ef042fdb60e3486db6858be2aee5d5c6d1f205804abf020896d92fc6e2f239b505eb40bbf7a46333b79046bc1aa0479b89991a238f1968b2cfd44bb4ba7f415113940794967dc49733595c5e96560ca13d7ffb2397a2e77771687250424f81dc4814b4a63a3bcc8c1d5358b6660f027ca15654267a08361db038e0d80ae623d069703a73e790c6be0055ba4661c03834dc0cfadca40504cc773c82442646643dd0a32b951d23bf9185a2ccdd1df4358c51e8dd300143a947f91f3a02eb812ff18de11c90b527c8390ad1ce1c684ee139eb852d04debb6fce897e2f61c9fed1adee0549b888bc00581632837ddd9dbd2933727278f1b29cda149c94e8b599123f4c933e99a5788b2c3e4abe3404739df882c3121045b03cda11e804d804909551237a077d9461b16a22842074f6358cd588720a3c993bf580933b17af30a078ffbf9cb0262ae3c65696c600bc060e53877286185d464bc50d2aac3c70a686954914627d71048a318ee9b09c0f556f454dbc1baceb933b3ce156cf358483f2762291577efcfe92f044e7a8740a649e041cbf46cab0888f148e13f033071e0a682bbcb155c40629a4680dd51f6161c547ea124b9450f0c6f4a48b5191647442a089481fa9a0b315230878ba060460e28dcf4d3a39748f37ad01aae0438a0db54589bcb23e34a8e339ef349343a8163247af13d0b9d52a8c32ca6c5a9c616d746e0ce016f3a1a5a06db69c71afb2f23097ad187990830cd44515bd4951ef6fa4f5ae35f922869b0c373a67b6b9a8ccb496a44aacaf5a341fa68c55f80da3e072e4ac65b27c676fb01d64b8aaa0d840721d9346bd815a80e1622771c28be690d5466731b227aef6a6668a042aa172d063a4420fb1a8fc9b4a6a365ff42642be0586a938ac136bc3e52a9a5824a83aaed55b2e7aac2556aa7964115a6a0b454ea8e30ccd98faa4a8dc87e94cd898c640385423c8bde5a990b116f107d7ced666516e209a8d8ac105ff617c33b14869547c3e2015b46d5041703b87935a45a460895c301f541e0fb44f524c314f1fc3dff31e0d2bd7da2d9ae5909d0ba900939ef4f5681b088ccf2f4627452ae290edc4f2c2684c6bd9d83a59c5d251c2d0d47808cf9d15fa5ec965a2aebe058bf59737b374321c3f406c63d96c2d4d3aea44e58032c2b80f19d2f4d47b62dee57eb1c04fb4680adbc6074ae9a15ee29dda1407cc557014cec0ab4491a803191d74b8b45d5fb538e4edb5a0db4741bc3604eaccea0d8f26b19f6e1a7dff1d9222ab7e7488e36387e9c0114511e2f55e25f8b705518f40865024137d0719bc1785837036de967f222c524e3a7904646933caecba1439c0e199bb243b040e97830534dcef9cda3583861a0a75e7430c03c3fea8fec12ed91fb93b008a616e98cd64824d3bb0aad727825751f6c552be768d0f86844ce17f4b6c5457468f89d85040b012349119f1eb7b29cd7a01f59dbcb5ebc73319e17db9fcad5eef2fe5b835b1e0e1e4c54b7b838770904ad9e4c15a107c60f4b90f5e41f185c72cf34fec3402cf95b90f3902cec3bf81a842681774a6a0177d3c14065edf2b4cadda20b635208f91b050120eebe65046c60ee156456771f7ad52627737f1f24a0ac031305d1afd57532b868a9db88d86ddc48e6d7b618cb901ce4db2cf0d04750ea392a28877ee3b8d9bc8a0a9a51efeefc1697a12e19fd3afb342d71df33eea7578d222f6565caffa971c267bce264c90bd1cae2db3075d51e30b6175fb23deb7f55ae73c5fa5a71f943812c3a42ab22f5df5a824a32be7c1f1421e08b2bb7503e1d318e2ac2f0fe3d68071fbecff2213d1cc5dca587083425c7ef4384772cb54336b289ac838418a01abc008a7c6c3551df5fab551381f2e89a774c771d07610e00252f82ca18d3501a40e66516717c3bc68b524fba9e634022300cffdc291842c8d27939d8a8262d6fe13eafcb2203252fb82728c1a08a85c6a47ba680b07ad46b2e01eb45170d15d4cd6d96fd18cfa68d73dd7cd274e238081ec6ea653af45e94d34e4644c2f654225acfe879bc6c9273cfa395316790a76d1f0379a4e3beed58ce0ea93ab08bcfedc331832d158d5de18a7ce1be312b85274a7f7411086d65174c90113042169f233bf51915eb58c9f76425f2ab9509540d7e02e2d861b7eb16c7f3d59d43e3692adf614b0c8e3a84d8e9221e71cce246614cbed15b5aa3e44bedc488982af616563850c725d7abbda13fd1022bf32a14700979ffe382795c53362515fbe97d73fcfc1b8a0222e83185e42560f0b8d6772d4ef90e6ada91e8443bc6bc9b0349da6aa78283009a0ebd301b6c5a91e3521f854632061157ab3c7738349e65d4625c7522c2c7c12b778baa6a71d0c5ef77c0b455d54c240a7ff797f8d9a6f631297cf56b66b447de0ac9c3bbac3421ccea76e9d886f3ecbbfa021eab6e117145e7a52f381f8d00374bc9edec3c3b12a27767c86e4e12a451263485ff0a1118ca87dfaa352c8b8eece52d801c74043732e66934eaad204e40f8f7e39861721faebe0a7f3e8c192c05ee610a0681897911eed1a5babc6f3275fcd4606740851ccdbb2261ac3525fa5b6279d783f04139026537bb19caa9f3f8fd2153c4a68270229de89c6f357db22a72e45d4dc76e8ebb60a2aa38b496f142533eab0f8821042c0a313a5a640eae2cb82c7185d195895490837d10b5f8fc246a09ed33893092064224c827fc368319337363055928653cf8650e55a8d3805c28cb176134a40190f2d36c52a4decd79768c3dd29cf9619b190c6bf0313128f79a13d4e821150a43e4da4095e366abea567fdfe7cc8ddc320cfa2dd0f0a0838a49cafb83fbb0343f7782d15eab205ef0b3b0361cb2e4950bab69b72a425d6d53d60c0753f7bc90c9dc0977eeb2f285cc6f76a42fc7a165fa9116b5909e1aa9f117b7a514c578a3884036ac1d697b1d8798b0291bdd7abc0efdab03722adc38a17d2a0813b7be99cc4f18e89cc99c46342fdfec67de88055347ced5134e2a6883d07d64fdee1585270f952ebe18357660c3222ac4b6dbe193f87209c0dd9bf9c0675096b9f00e77a321230736068fcbda3ef0fc3420c89c98009d1ab2403897c1f371310520be0e99b18d28e1b714466f284530e0e70f04ca819d52b8c10ca8371c6deb847945ce7c577ee665504f161203fbb67c76eb94c9636f8050b7652485d98a0a39cb96ee3001e8905f4d8446d8fa9dd8f154fc0c01ea9a81ba87c30400788077caf399fe1fe66b061a264d5b7f5b030eca06de2abd1fa830fddde0e46ce9ea7a21131a000b69e7e463f4cfe91fa1d0cb4123e34fa4f8311f0b03a8c617458c406e9c72cabd0dce8667879b8f52104d06e3434e772d1ce58ae7e0dfd2ed47430c19dcf858c06d6693cad417a83862b6fd3ca47575349ec98c9cebff2321a6cc2edb00d3682bc8c2175471f5259fae8b43e0f87940059e40ad724caa4ac9d2885a43326efe2fc334735c8b7d64b07b1197f46d9497b61c3350de245a1264047ff8ebde6d0ea6878cdd67173ea05c1f280aa8bb1135ece590960ddda5ec0ab63fb8b864c680da29a622fb85f647d47b89d1c07a890d6bf31c2f8ce9b838a9a0c205d111abde73d20874414823a2e247d51a0d11bdf084f9f0bb1a3905ae85e4a1c01399a913d25e0b7cbd22f27c36b20d34c000e82e6f52d78c3e2f04b159bea1689cdbe831b84035f13da25ca86946f5ebe9b53c5ecbd469ae54235e070de7168d909552e6b0d8006b0cd63d7bcaae1484510661f54219d1d17409f638ea5e5a74f417636e899209d2f7b21d19767c1983336c8d4cc743fe3e1991e86b19d602815def0b0e245f561b0f0ae0244d2f2f95688fa413a03f5f85826863464dbd2f4cfc85e49eae2ef717019ee1056d8e439a388b1da3ad38e6a94112ed0641d472da108a01e5b90b67bbd193f5b44c02707214c334543de0c8a1756d086a1fe480ff2c6770279d94945650b0af43d6fa3efc63524c15f68002fe8e5d931cb21f686e26e89a8cbf908b833b1293b38873a1408ddc2c879b800ecb4d26ffb7dc9cd3634265c09d90be8ffc611421c699dea6cd7fe61306e08cd42d4e476d66c4b8bbba1c204232c9344aa248e17a8ceda3a76318e37c2ea54073647865684b7c7dcd47aa218a506fb4f02f19b234c53e62aa627051b21f0a777ce0f1abacd3da0e69783402d27138e8963a6107faa5ace5d9887e3887a99b0d31f2be08720524323c1b057939f9ecb2be6a8908604bdeaf5f4fb7b0402fcb16b2c34a1150b909cd7a1a5d8a1564a1ff0efd82630530cf5b0057d0f4ba29e00a4872083a0f26003ae043981616b815eeeada68d0a9f8b795f7fda257186820423daf67521a58fc99814878c17e881c01727957502602cc40b72ed62ff3024e1ce656a33197fbc067c3f707af22cddb334bd75765abcdc0624a26e3e234ff8553df4c8d6ec6471e844cc24b5f7921238c700b8dba9a04f7469fd8431e72d06296f2caec7b6429e610eec8f6ec99dab250446e55d13d42b12137aacf3e0b8f3a66704db774cb46f49fc2e5df50d240728c707a1693241e9b715fc1abc0f7bd6584f5cc0c07dac263e6155cc7b49f6a61c2902efd3dbd19019905dddda33f0d21f446945640bec5823c6450bc23e2d40633b9a15f65e12b2a7de876b7387b79947c04554e49b9cf89cff1c978c80f37a50eb0335ed0a4ae300cc6d85d9eba14dd12f0e284110cfc76b092378ab8e70155f492445ce91aaa7b359dbbec1a7de910881bbec48d7a50f8dfda9c0a88907fbc2c365acf06e3d7af678ad381fbedf212e0acbac38ae557c46814081f8f5ac26c9c03f40bea236282f50438303fd1631fc46d25bc7d035d2d692ad38499dd047df3d534fb105ee6d6cc243e56335f20e400cd0830130f9916fd4961a105734f5772a0ae2ab78b30ca4b22b7234fcaf150e8b2d9c8866e6e836f8ebabf05ac3ff4c5268583f64ed726df95c8c813449ca43edd87cbf9829f4436ad864f53e9de0984120d99190e5bb2ec0f5999a832ebac279acc85860989ea878a2c230eb19a321b8dd387e7a75915baa0400d7502a50e79d14aafb5b0e17fe3bc4ccb72025881f14e25ffb927f2d8eec89a573eee0be9f959fcebf2db4f5a7ac8d081a8c412434bc83541545348e045223da477b07b456a8a56441c4978fdae41d3cba0efcf2dbfabea45506f08c2d14c82eabbaa158313865d5b44d8bd050910c812de8a6022dead0506b33773ac9d565bcc0a354c64cd322dad300d4198ab2d7750e687e57d5fb8f5d1f22296bcce2dc4d83445c55d5db73a010f5c996c6bc03e69fb8fd1505fb1d186c6c41ad629f903e4459ac321dd144a4006a67de56fe265c5a823973525cb79854521c33c3de9c5a1a5f4e62f645e3ab8180085ee015001da9705b09480cb37e0495bcc22bd3ebb502212f7c085803fe539b552adea3fecd1c0e23ba06a508731dbd0e3d83aca89912f377e78e2591de12511dc82f5a1c771fa2d05428a9232ef72da9d0ac261fda1e4e71bb5a46a10989854df1aefcbff7ed27c3c9edecfd893d83a90ccb5bca1d632b22ea951d633d6cade24e81d879f2853bc4a5181d3a07b083b73ae421db9f82b57407b27cbe647437f337173aba85fedafd36bff038ea762a37c140eae0c9d9e0e66dd54d64b69e05233845e222f75aaa53676502b885ea133f52ca5b6aa5454e07be5e0ab05cef32ecee6b4addd47d10537e33e4a47402bddb67245846aa376fb5706fbb70f0ba63b1d69cf7ad5bddbadd5ca6406234649dd73b3ebe55131c1ecdab0edcda79de386d357ab6d892d5bf22173783ebb2733abb54d6363b4ad1eeaffa46dcf2b012ca483984537b1bb52719d94b3537ef998b491c0e9cc69b037b34b6f13e4b6901025627330070afd9c9848e6c4b6fda8a33bac86491ba2a4444e68df46f901decd8849cb43d066a560a182dcb73a5f190820a1ef0fc9dc3c7b190e5220f236bb0258ddb798f3a993e490b7a98d77b9ea875166a4fd9963eed580e6c4ad767a6830fb87a66f7133ff083a2d9f79f828b612e0e509960d0e1279f3167a9a7374b47e54f28ae20115a13f3e18f8ba7ad9ff858c5759906989bfefbad4c6416c1b5aac98318e402288f58dcdc6b80565218e3803fb3221d31bf04683fb747183ef0a3b1f162440d5f3649f0c14473aa6f7853d65b7c7764e277c6ad1f811b50706d82700ca28162e6e71927420f374f4a2a71595f4e950f7b0ab0a65d797d82cfbd05c4d133ce73ac02f37b5ae4feb5bd0e1a72cdf60c5d77d0c30890237110b0fb04e7c00e6af79757d155f2c52b5557ab3fcb913ef6520c80d8fe884270b421eb0500e837089e06c551fb01fb01fbff3e96a9e5cde0f5f88d8ca6499b8150daec749497f26d279d50a257b2e169c1123ce32bf8a50c354f5970ed8da68bae843ea3958cf92f3d7a792a28c86491c274b33c1fe40325b28b31eccf450cfc487dbd77c7176cc6a9a5792ab545d6a3c5f5afe0f871d193454e847e458affbb2253e61517558d411b15bcb5ef2ee4c57e42e103e4c8cdf3e033f9d8cbacf7f7cbf151ab18831b692233009a75ca902c965526d13a20a6a38c22164efd850714e958e43a34405f13fddd8b2058a044e8009f92798b689c7223c089dbea170c0f4d57764f5b79b6a7ce3b2f665f6c91af046eda723f088095daf00b36955cce904d0c28d9ba700c98848198d642c108330f7c4b7e835de4f5ca0aa1df7c4866b1c1c75693a4c2281bed883a4211e8281952ac2856a8e578d582124a8cec7d14a3bf3eb1e88767072908cc5433ebc86261b7120fcfb674f1438f565efc16abe09a8b2c471efc422186e2223ee759d9ea011d7177692d088de3aef4edabb22505608c56fbf3b991984fb30f768952fd1bb7835dec9602e1de46af3bf5c5347af6ec4cf9576e2c24544091e952c4d36b5a8489b829eb0020b0cf1351ab7419e8d37c5648ebe49612b1f455d9e3f42d11f533b28497f3bf405042efe9d4644ff039c84a5ad9e9ca5494783d91f66162bd56ff75172517b54b14d9e0cd00247a670e49282d4975f5c146e85547330b749764b3a3e5737ac7bc25017c3cfad3cf082a06cb4689ee22d8c10f4fe334dcc4f94c805e4c7864ad48251db2a9844e05a7878eaa2401cd8072b9785432529e1feff843f79555cd35fc2ab6fb2bb5641d4c086086817c6161549d9e801f98856fc0bd6b378a548552dbcafffe51907fb54a07094f8b2fc74445e3b9c2f2476d68eb8a98452587fa665bd19d83a28acfbe312c38ddc15b9bd56c38fbfbf193231f3672108ef5da813d7d95ec3b27a2213469487c8c2fc4a24bd87671464ea1fdd22cc84cb5f3a597d1631c3f5f41133ad213f1ff0e078dd9d76c4b4714e7fe3e44c35b29e62215947b566c9c3a4153981864fb3713b7498ede26743291b823d9c55516580fdf8316d8980440874acffdb1107e85c1791677452ceced01cc192aca00009e7474a6c44cc1e154a33a29e7b53a760295b351467513e581968df53465f13aac389ea318143edd24625a510df01b170cbb64020a879f347171647a3e2b2565d15351c06e4bcf743b800b753eafc0a0e506f09758d6d0155744f82fae93cb89e892c23973380a5b58ce8a4cfa66fb6c16235329317db68f14b0c941cf230f1ecaa6c03fa1d89bfbc7cbce9047f4a411e12322307071bfadd38b94ed97829ae8eb89b46d05ed35a7e7e60869eb43ae4c3cfaa94d7ccd007f2807056ebd95d11daba10b513316a0381c34d7e6795138e0f8ac658945b96b287991bd8e176523f1c05332110c8242aa2c170ed8c4262894e3b8d028f307a30d7156306823cb6362a160742ce051964247b4cf6d5c04548f855a5d5951aac2584602829bb2de908dbdd1dabbc029885ca4d9bd23f0a4ce577c78d114d95bf421e4849e22248dec6b4b4f727e954b1c208a2803291e1cf721d888c00adb3f4385d6fd3d70342874b7786f637658b34d7b582053783d01fe2055c225990c7697718cb947c7aa7e315843a12ca390594201de987813b5c96a247700cde002bab7331bd75be0d5a3d089b6b233d9164b314a2c08d240cf39b5ca26cf5ba3461d60681b8c993dc6901d917a24052dd8f0174ad2f511e2b0123d539f72df7f065b0babd00f3066e4a766fb278ba30bd1c563ff72503c6a56df325a8e5740f9b7fe0c59736a2aa0a29f98a6f491b9bf73111b9862b2a67ca8e11b649924373928d4aabc244fa0b4fe4cf434aa737842de1f74bfc5839f5cee71dd165c808e06d81ae977b31e5e24affd4e44c8ff31d4b24924a1cb5a6e236cef19eecaef9080bb51fe1c92988d25064776cd57c6f4176945f7b87410956c97580f2fd2e4e06ae781f5f41f5eef9ef1dd33595307cd4d0e7380707932265c0e76c5ead8499c2cd936984ec50bc8ee4595525795c3f6e84310f38c5b44cfe46a04bb085b08698bb5dc994d55dcab0b90060dd75486612546ed557b55487dda0f9f9bdd7ac984a4c750eeb5f21f2a51c603a1d0b724f1e8f35ef745bcd793ce0091e364deb3bc8c5183185881f7e009daf101bb5acb592e79b7f61ef9dff89abe579b62873376e75e5ae06fa5fb9cdb7124129ed47049469330ec870158cdc8a68b4a434bbbb1e792b1051e113d7fc4e0ddd0b85c3816db7fa27299e7aeeee96584aa7df0f67bf75fcdcf21493ae2ca1156b24fcb0efb6b123e5a92fcddece95faff0162332a2391716c79bdf855c2f91c9f1077ff691ff76b56e92fbd094185a2f9180e9247346d3ace6a341d6cd779cc56b01fc318ca9e7c45fa6f25aac78f65b50e272f413274096c4075533914f4ef609eff6b2760c2debf7bfea7add6cbed388531ca18bf28d2a7d323a9b104aa72fc688c6c542f80c2cdf323ccbda2a4d77dd1637fa3533b80065b0d42d3f51a36935bd98787a40f53b1f6c2f5cd4f6a84fe8f669c15da7c2e54991b31763ff079075ef2862736d31c23b6d26f983d45444e9eea07c6326462170a18e7104f5802994607c38680fad400966e61047279f1ff631974a087ed766135756da42107cee1511d4a199004ca0a0495d9d06cd195af3250f50bb8ad1abc03e510b339e7517041bd8b08791bf772d5b70e6a4e6ef88f3b09c4863310b101922cf4096ad25bad4941bcc4486f4aef02dda045cc1d0f633f1685ba8538fcc4e906b41e4b65b83096835975d9e96b8f9f20087a82a0bc62380e4d62bec97482f61f544cec8fab364a7bf46262edb4ef3dc30d733b4b418b9d426db004f17893184a4940c4081b3a2dbf0a9e8be4c241c5c28e69b8370e7092e0469cc42521c239772d1751833ae185a4f54e82671644d1e4f276ee27e0e4f7e3f1ff25023c215e0d58c1d995195c19913ab07762727df06d484f47c93583a2b7216694124f397b38d47b986f734e464b11129daf79bd4ad41c63001ae1929843328c4ebd0bfddb9e1455780d10a8b67ccf57781c9be332971ccf887281cf39a5ccac69cb77d84ab61de9224856c66c0e715c5a0052822739bae87c8ff5d57bbdde1ed87c41cbbb16953ee5698a457c71a5fde86063494c78a8626bfb020dd34358ae36ce77bc904bf110ec797c22c96fe186d699e8cae68366d9fe73c45262dafe9d08ab3f8dfcd58559b26a09cf41f7947c4c9d4aa85a32bb8b97c03d6730d40c89e606385360e53daf30b73f23953c3cd62091377ffd80515facef9c446bfad88107ab288d418c711730ab64edd044da4ade31e7e0efaa2dd607fe11173ebe1a7ce4a1e55e818f0a82bb7afb349795cb47432f41e5c08e34f3e835f1df8b7854ec3bcc3dae52e0d40298382ce3f03259027d0a83be7c24f824778789aafdfd453ae271d099d2edd112a30bbae6e64a0c0b5b6268b8e94abbcf5354c68eee9a4cc91ef1cda9213282b9d04538a481ebb34b7ab09a41bb6526a82f5da39da7792c7176863ce25ec254cd7ce7c149389b2a4c96897f7751db58156f21d5b4f85871bcb5a5a76201f2f207414b35c6e1486b22f9a70e036f4857fd4833663020a2eb843db905dbfa2c3e58467d44d2468a1fa3f13693baad39d64eed56760eda458887afe5c8f27345208b17d45f772be89786b203a020ce73f29aa54a3b840b90665d94a19bfb04f5af2c64499ce77477f3f41bc11f46dd3dbb9e93f8798488642945ccf9c9c8370766f871c4bcc07841f712b3048909fdfbc122961bad57b3d81bfa30f526bc0fff9fe885f72f4bfbcb9de1ff7558709bc3b5d1b2286fd05e25275ba429b4279fd989ee23efe580e28241252cc4a4600f3da16b5c09416cc8a5f91ba8dfe0889dc97c4dda09b4cc70ac9570d0f935034556c8114bfe8e8a4520c2e6c85e63ec5baf12f6d9c4eb4b813bde2076db3575a7fe460e515f9cef2709b208dfba2f7a5a786c310da6f2664b288e602175d78f64ea99d5929f6e255ffe91bcc5ed8374c16d84beef771213dc7203bcc3834a0f6270247b13706ad840405df8307381b812c1bbd167e1bd28d2c008cd1994f2a1bda890a9f3d8366c01e878fc3705dc37e44355e7f5d130725fa773b888ae80b956686ff977ec8dcad0a2600a4409e50e2431fa1a620abae0dba5d5a7d0ad969370a171c18dd0bc57cf32a72c130edf0ee528343b001664eacd8c0b087d766258d133144833fb3e4dba03d6cfda6be677650259c5e430a6ac206b77a309afc0340cb0f5b102a42953020b0af98bef8ef21fab1614ae2a00057685195c8eede4a6648f1818c2da270b9c7d9117fa94ff2f9259f9017347d166832560f30a0e646b28e0966ba4616a6600073f6824cdad44fd4573716cf1675ea525ad728b1ff026c3c5d56917a66f93c8bed4f4721de971bbd1f0e1430748e06ba9f76d73c99f84563b0d62d9a1830dc322278fcb09c6b3a563e5092050ee9adbf79a6aad65462e23b99da99f356462e0e1c0494756e3dea1194646fdb1df5424ace9ac4a5f6da3576b1df8d3604832721b9677a42215d1347f1a11f0282240ced4d94626c19db0ba08bc1af3509ab87a19c6e862fa40ba8e4c059e3043f0b9aaaaf1fc270ac370b05314df24d6e5a777a25723553637f854ad66ad838c627338aeb678078065986ad4a5bc469ae1327f081cdb93386fa933e74a47535735c005b2deeb6417a7fcd1824ef9bf9f1ff6f78785c42e23038742df132e143b014212d11f36a92195fd1a8240769106c615805be5e6424dbf9ecfd0c21d4ec9073b5f2172e7251062421ffc105e4aa19f8c40218a8fc09232cced6de0f9f46601b70427bd1c041cb603e73ca214506aff7dca78584bb4ae6b3e9661a49560e5c1e582adf440b9d0aa8c4474ebc9fdef00bff47388b842f8ef2989581eb2a6b72ab3a9980c25d6ef2856cba2cd67f64eef7e4852289d7a88b9d06c28339201190a0a0d8aa5404b7ff8c47179af166fd3d65d29b678a0d545c0c4fac17a2428e77348da0d01f759a69d32563591a93e03be8efa64f972a970ce27d6e7fe3d05ba43c1e9668ab881b3106bee662cb5adde3c18383434837bf8338765ecdaa18bf78490985d88ce4356e132d4702c37c421e220e560c57e5e310980d219a74956c3a0cef502647f4df36a04762ec397da62ec0bb80e5c1b12f09b6e7497303268dce99a1c8c4450c89ce0b6721b65905ccbfa4c348c54ccf4f2f3714730339d69c4fc993b73eb9a614e95c220871d20dc2048a1bde95bac6390b20e59943b7406d66133493c57ad01054be84daf89f9a8458fff858c36c34663ea246189e87c6bafa46ccd256c74e26ffb225f5506829c0bd0be43ac4be674f813b49d05f31f92ac3a1538d4a2371033d2805b17d75c9c3dbe640d00b24bffbf8f9ee31aad0ffa1e234805d18361cc368f0f82142c0d18f9e9ab3d5ddd58f748a69d4affd73a3dd1b0085cdf7f680caa09ca3e34765ed0c2fd860f131bb4b5d9611d6983c34765843a34c33a3e6821e3c32b5efa25fc302b566e8a31cd57e5f42eb69936d805ae508067f50d6d3558305b606962ca4142d2409c350b280efa862b822bc1ff8713f1775d24dfb2f4e5ea9b3790a784378dcb46a32891229cb4f5accbd5d435699f083f3c07c004c62a4a6aaff8d0112d6574c74d67ef12326005e17226819d7678542b163fed3ec9d3c13a4cbfab8f2d09af9a1cc3e5e849c4474bd4f2dc4609b12969bf9e3d35f19904b6bd7c38ca011df44e162caf7fc541b4643b5ecb0827a2ed59024243028ffa010a04f48d1a9cd6bb52e09b78f337871a683e823471a7b5710a04c2dc504cd7e955a743ab70702a64af17b09621706c12568ea52a1329b85424ed7ec12fa57a3e3f390318beb3e960ae5d8c46f86a41c21763e69001614fcc97acacefe6b9e9347972906d432f570de407579153b003ae2e3e51420e059c67d9a97aea5f55c29354d1eba4181c299e1cf16518a4f8cab6bc67af1ce0a7ab2f332b6e4a66dc3d430b2d60aa17e2851b5c7fbb62f02897dbbf8ed2a69c560d6d4ba75a7b90d54c1447f26c7b0cf4204af34590be4f73d900b726c84e9d71787d8617406e0d15f4b173269ad9bfbd178673dd9868add29d0d4f0e86750546eef24ccd8e2c91a3335954d47fc40f61502a847ff0796fb43e1e7c3ae8006b69a450b8180ff51fb41dd9b926cd8e3b65457f45fae5557447b82e1d7d8aa8225e2f6dbc8a51115f91d669fb97131b7ed7d2375fad6bc5991b959ff95a74635c4c817cebb896375d79ef29ff4dbecd1aaf4608410bbc3006b20d484dcfaa5baca0572c9bbbcf9361b103a57c2e9801bb77c517011043a9686f9a89d8d7749845cca8c322bf6ee1cdfa82747be339b5990efaa2e6e9ae48d6d5390f00c4ddd7accf3089f9ff1cbe1623b124f8a8b4614a138efe62750e9b69e88f76a5c30d952a10ed45f813db913bd1ef74e5e52edf1368f2fb8a7958f5deb10036249f02387aa66a0d70938f4aa2d46f03e162abd7f0b8046f18ea63e8558f57b8022204a54aec2f27636beda00f6444c77db1e95c0e818463e169c2cd3f4544c848891282b03d7736644ab7dc7ec1899dbf5ab75686624761101523cdc42ab005319aa8c18588a14d8a566fd5127558e3c517940d8f0136174732f8427a8a50a654f5f5b112096649220bbd8e6269692deae5d11089706a16fe884c3d0958e19b4dc7b73c9a3f9d12bf2f505d3e5fc249efe535da546f8d3bad7bace15382bd51d83832ab4b343b42ae35b0ac5f92f9eafd791ba340a83b44d581d00beb7c7e0d540f80bd3bf870faa13f15b052df4800d3ef81686f4adea6de9fb5cceada56114292e28f64e1c2e7b661209b8ea785275acd773243debdea06378c3a2a03fc28d3484f734c0454757d07ecd0e5145164640a14d03bacee2cd1afb9722dd3819752482f990882dcefacd0e906dd0227d8bb7065b4f71cbcdd452c35fba5a0be6105daf9a0341dd3472a43c3bd7013081ab0b1ccd0c7d2beb7800066f4d63f4bfa0277a39fdacd4a1f1f4fa37d163611680c1dde2195a7915a763042476b18096080d34233a00959e6cbfdc51ffd214410bc60da2fc9400868d08d40b1e54366f5ec4ed536f48a33216cdde5e09acb4f1d289916eeb7127ab20652026969abb7f30792c2dc238f71e22c034278d088515872e6ebafb3a48b03859b1f0f395e0081d7053c0df78aca27dcfc7506245ab91e7e3628cc7e722db844f9761537353f8755030beb73da5f024a76864c923e7abc9a209fdb1edc3b81caee4218022d49d18d397cea254814471f55b8e85363a050ed6da42a48a883eecf795c84387cebe59eb0ec2404225c0680aca01dddfe5a4fed97d57a3801b47d41ee858673d1a383f490400f39746bfe08685ec568c1d4fd3601451ff58a50d4ec735c2f3c5d65ef1f2bbae8dc355d136ccb06c4ddf82de0fa8e571138a79352796c3d0b50a1a63f596270f51d55f9c0034841ed1e2daf0abde10b956b47a806364ce66b08c749e98c6d39a39900d5e05f6bc591de848bd3c66234ec83e7c946ac7d8d6a68cd6b0eebf790309568fdb4e4db5f2a46a066fe219c389395d1cfcbb9855d55a446306e1148c77de52f0598b903bd56ab5c2cbc68e7c0da7102f70b313701e5ee907923dc9fdd24ac8d5ba6a7bfd068c91b0f7dcb88835c912fad01c94bc0070c1c0f2e8458092458efd5642a6a38524802157c25e47f8f7b6fe739327c9dfcd3548b22ce00af29bc0b18a6d01450308d10c33b0218e92b9e0ca9d5d5347cdb158e4d41030c22cece938a0a583d41cccc4569500e765aacda1a4c302a3108253217a13021002eaa291b2f46e733ba4b5fff203377bf534c85af6b4ee484f606a54bc39a7e57d9da917dcd0b4e02e31338b0b01f5720fabb3c258125bde3c37e7d6e63f347b3b2e02102fe86989ec7d828a0726fa9c6d2a5afe0910053faa3942e8e2471850d1e4dffc92319368aea07c5551e920e9712697d577523595007bc3e9036e0b231921a0c2ae7a77b8235353f3a6e92d942c6856c591866ca1e1201cf44430cb57b6ca86e7b40a8c0dba25ed61655d67ad4caaf368fd83d2caf536be8bcf5b93d5180b3dac48423720397318655d14e37da973dd2647a4cb8bea8d360a3523e83ce232474ef7b4b954b50a101728b09d49b7b6402486ec7a5f1c86e4a518456a87cfeb2f300baa1d8cb703fdfdf85d5041e6ffda4190a5f6ec9663ad1e8f9ddc53849445bc2ca5b02df7ae7d8e31c7c1f3eae67ad43287b393d86a7c9ca3ec2a03541c00440ea754336d0bf14e1cae47109fd71fc24a9859540a5844b6b55af368137a6829aa71b6f7fd95a8eb763ecefff0cdbbd2d1f352653af11795aa25137fc1148d6060ef85bdd6de1129603bc87c06bcd5f21f4706a1859bdfe1f2ee2e33359bf5249f25e1563e51441eaaad72d862c4e6451b04507c9ca23be8914f4ed01239086d01b1813efa545ab1ff1d185b753f86f5f9c79923b3ea1e242b431fe5b56ac6b442614f54ba55ff4e46bd60dfae7f36390534ef666a4977dd25cf20445e15e2086e979431b0208bfb919c7157b2e59e1920deee698ef11ffde7b78a0680a09a911c84b375a506c2506fc32ea2ea705a9e26485ab194ad09b42c18b013419b371b8887c1d8435b9f24ddfa0ec07b63408bb0d7fd909c3c0aadb1c43fd5537111bf126d912ec789cdc6c1668d4649ee99731b3bba02000be9b337960500b18ac1418b2248f55d1a7f8837f3cbac0b8be430263cb16fd0a2ab728f399087472571d8653806dfddb1323912486a38885fb6c4d23e874a17f6754f1bb765c339be812858004ff5110410c05295e232b50f33372bf4875faed8f8fc40685e48cd92b5cfcd6981a9b43c676500e7fc8b99531f98bce0eff43eea41ad1fa35da502e3714db95c994239b548c167c2498b6ad12a41bd258c465ed705467010bf3a6d8589437d430bbb06a828882ffdf0f3a1200e7a7d02085761f89df68891a390d1d42309efa6cf73c3345fa29cc68b4b35343f1045c98daf7d88a443e1002a78a5bf5ed39973ebd4be8d84f5408503b8eedd0c66210ad4ee34d6cf8698e159b1452e55ce67611dc853ce27fe91e59283092bb60e791e6f1de5ca0b0cc15728ca045262c9b5317ac4e0b191c75f6bc1eed5459bf77c98e51d1eddd1f36e6a8b8f679d2510aa9dd012079464ac082503304f735f039128122b3010d96311b6090863e4845cc55afb884917f313400c924b81332c6c1581d64cc316a4a7b8d3590ff9b62600d7d76a4dabd1a42910ddb32caf5d964bd382cfe497c9651850ea5af87404df1d0d9d0f02c3f0b5d10ac2258f932166a9b20aca0a2a9f7c2a6b41c74047c0f54bd1175de32d9fb8eac74863a7552102c7b6afbf9ae5088ae654d085eb7ffe9d329cb4f527b759a587dfb3ebfb5fb0491b4a04b57b2a5bc18fb1e62b65a899ea8219f50ed814eb106864f1016e9362d87b93164c70575eb6eefd63723ff4fe99ea82292f7b9594cad5883c682d7de66f8c6175330e65a509c10a9fb7c067d818c8fc0b1aba2c423ebea40501a35c8ab99cbc984952d73ebef8478913de75a94b7f1f256201f50fca57a0b01763c885ca3b948c62d06c2b9347706e10e6a1b5073885982234aa82a5bb535635a88508bf57939814bf3223fe38c1a9774094a911fb8975e848a231ce4d66fcecf31081e4606c128e439403eef6a70573f22125822c580b41ea1a2f005bbb05d329b472a6f8261cf43e1a22074931e72fc5919e53b12eb404162da45bd2f0d6c2c10d485754017080eadbd1032721e53ad4dae9852fe82ba1cb0421bd9e6bebc2eff489ac9a4cc1cd3479ddea2e0b6b778a5b0cc6ca24248e7561d0eba88f9c8047a5e0bbb943e120a07d308837b10cee30668064cac7fac9a96e68f2c550e5573dfd4c068cd1d41dfc986be343f75e22b2bdea9ccedf7c6a0dc9d056888519a2eb096ea28b82b89170b8c76f9cc51474c66130956e8e2e323f9000615a2d3fb9f8692cf620c58311a04f12043428db93d8306c1489c2a5280ffdd41f52dc01c2398e656a2491e181e98a48e38bdeaf1719b35a226ea05ee16271f541362e466d7bf0b301e9d55707c9e7432019ad3fe7047dcff797d3a4178d2a1ba1f3ebd14c150371d8b5ee4247e4571ced0ba4e7793e0aaddef9859c11f8ca7ad8963ef5f60b66a9e3d2a6e8cc5a2e1f4b821174defd0ee860d498fb854a99237e2c640301497218606d2f47aa3cd9e2a618ad4f7cc8253d7c5d10aca82e4a6cbdf33c4e9ab7c8e3bdc3364d743cc123104be2027344c8c4d66404499c1880dec9ac3011c24a6bb41aa7add009db8deece425e70d5d391d11867ab375c5cd1e10753baa8887a75ed46fb67126832159a1f3a7b332bcbf66232244bc1fafaf9944964bd7568b551066ba47d3ec3cb251d3a2b070dc79fc39491ec8c35866c5eb80be8aba78cbf57ec4c201bc883cc14abff693048a3f5b611647bdb959dd0892c12db09730da8dc0d266b3bbaf13ed9051ae0119428a7a1c20a0ebf0dc71f5d02a22e6a5b1fb1e4c6238d20b8840b04901fe6ffd15577f31b8bfd18024025611d92c3cc1e1b7fdc8480628ad877d45304761c70e6ae3e48bdc8bb3c823efe729312bca0b92c0ce8a528a74d5057da9f974c5f1ce99d3b1c2b1a7ab3e12da8c3e0deb445d36a4ad4deacb31d97aa9c0f777590d021b228102245426a9f0aa66d100abbd4b6c7948319006458ae9612726258959044b84f5b85ada554206c0d9c00c40b5bfe15cc4fdafdb1c46aa72f5c47be01ff93c80c29ebea970a6b4960c10896722e799016195e50e26997dca2ceee03db898edf8081545ffcbcc7f34e5958cf88f895f2288b3b237f32cc52da4b687a8d9321ef0043699aa067ac730500c4a77fd4deb18d763755c9ea68b3438d3681fd47e1eaa829bdbda8ba9ce4cea6c40cb4879ce638e6a1a032fe59250ad2315668520bc24d7a15a19f1672b9d7c65cf5ed76988b5a64856865e066d173d5328d8eedc775d71f14001645aed3c56a7dbe7403ecac52cfffe47ae227c27e0744574ad30445759899a52bc40babc9b77ce930f8b18bde4feeb5cc0929d2bed4d33e60c53e2769c6df93097359551c146e340cd99d548fd55b5298014ee42d85c6503d799ba06b0afe5a00e0959c99a237e6081464979aed549bb894e4fdcf08a2702f97db391bcb37787307e818c6c0204ed459a28b81544be175ac5dbc6fd6b0c0afaa7a5180f5d25a182d2e6697728b4977c33a0abd6c5bfb0aaca3ec875aaf7e415024e3f109f3a53bc7cba74e88eae2ac1cad7efbb560b66b2800c2258a476b11a70f5a3cce93e36eb77c5c75a09dfe97c633a5d9e1dd43f4687d3a3d6c60b7925d6e545a3ed43187579a345644074738ea8a15c815a5e80bda7f31284bfc7439c06f4bfe504e5118ca3bc362ecc063a45d1a15f7f1d090363e25ae9e3a27ac26f196413adbf731aad50d40960d69207ddbe62e59a1b97811b6ae5349ce9c41aad34e56298d8cdd712b00cb58ca0a3fd577da15af828d5d347a1ce13be25b8a97d0eca283d2b0e7ce63295b1883d5b017befa5b3a61c7cef2783def8c0f65d80bb02664629562c1742fcf61437ac406267a12b9be0b32ceea4f0bd9d0b71113a90be08c3696b66e0c21fdf180b5cc32f8326c4474d00ad708f8216b5735af3c86e328921bda3ef10dc39119d900d879268c4a5204c6e8c3af35e9a57cbdbec908b74c7315600323569f20c4f04d938e297eed83631b2e2332208d791bf4ff4bb6758259daec6edb46d1e13ea32de78adf5fd34778b229bdfae8c8904e708031fd5fc88a0ec15d0e0834fd20ed44b9b9db1859e6fcab29d9100e0709fd58ece43063c8a1890f233b4c7c4bc239df6ac2f23a0e2d230a33fd9eefe616ca5d2c928730b16001efa7ab0028db836b90b2a8d1ee607028dbf321f771532cf8263ff48f84e5c8ecd4eae90562ec6f23fcfd82b9063d379ab467b3f17929fabbc8a1553683d57a64a64faa2585ead53184bd5afa1767b3563a0e2bb7bc3917f50fc4a685a7db407558ca683c9c769027b83b59bd8b0fc7f36569ee2ddd9cddc638024fe57c59b2fc87eebab9860d8b49bb51b27a7722c42b4579f3e6433748ccc222e021b1531a82ffb7accff71860144e746476616ce53b36bf6c5d3fe44ca2d84b31f21cd01cb87af09ff5561c657ae1b6c8c9bdced7b54590dd2c802caf9b7a3b26a77550fc19339094475c2fc9bcc784b4ed497158ab9ff2b0c7fbe80fd098730779614c50796a00a03f7cec317a9e8bbb33881d686a9830c5f6dfba5bc7d419a6e66d9e6d9a059751818621b838be7b3cf247bb404fc99215e39776a909cdddaf3c91d4800273f8009d2259292db2f4ed2c9a6940a93812cbdb5e15c72865d088f990d51a364bbbe15b1a0d9d4ba416d810d29587ea1d4a3b1f0016ad6668509f93527aa8e2b5c1be97fe8550e05052f43b6901100ac4caf7692706e666027c971917d6cffce11d165ae1c1520cae64f62fd09c4141bb9d7e70db6bead9d6f73f6cc800653c5a18c0a4e930f8dca8bb7b9ca13482281884e7862a76560dbbf9ce4fce0cd1347ad9f460be300ce08470303b48484be751b9dc90408c224735cccaf0161dda2090e0ceb56383019a795ae0992e49864b18529289ae5dabd9415b13a17c0a8717fb84b83f9cc658c496ce633fddb9dded7d6f05f69d624089d9f86cc100b565991aeef9894b28addad7035fb948208354f57fc2cede383f0e9d30863c941e8f7696ad89839cb42abfdcb6164aa1311d5809f15e6f4217c7890a58e41d144dcfeef26c148067b79003870989cb1c75b65fda717244563285c1ba789b8074989cbd8dadbb01a56951b93e36d692f181c53c8282243e76d724939936889e978a7854aa433eafe49470d8649d563d8504318b4808d83805cbb5b08dda8c341e8adae03d1d18c6cb216cb8d517b4932545b4496f71f38f91710145ebbf57c8aa836408df887bd8b45e1198329b38e091a7fb6a92cc60e71a2ed9c6b4cf00cca65b0e815111512e8d27bc8e5b0401161624fe306b9fd15d2290e3c24a690d85b244502d807ad062bab51df6ec1c1f5da14d6aa9e37da4567832f718bbc88e6b5609d921ef48f73579f77cbbf1d3e2f0178def5129c8b0ec602d1e670ee1b57afd40d202466996c3e5ff460b72ea43d37d8bdf407dbcd08a714baad19a93057b60a24603c1091e6855a6411de40086ae1bfb066d0847257c5fc423b77ee3f07deb6b6283a76ae468a7cb68d5a21ffe958f7680160f6ce33ab5cb3b24efe7221c5e079934af8f4c999d3d6db4ea304d6d5cf1bb04e8fb7dd5580c3c073fbfceb73e12137933fbec510f24674e9ce6d134988e92dccce8d861fe87a373e2301b71a9ecdc2f7874021db83ed48256da7e0533deb1d6c5787f7e8eb0f799f04224219120fbe042429c3018bcb1e41ca371ab4d4029b7c451e544219ae7e0883df4f680c11222e7c1d2819b447f55bf4b9538bb70812aa17c69ca3501ddde7772379ee97bb3ec911bbaf21d7e2776c6d3b2d9745a6d064b65de93a9d6ed7527ffc695b0f1db675c24da2fe735b81e7a7037612894df36291fb3c7819b1ae2fcad6ddc10f19e6181e4f0792a0597162920020f3fc1f19baa304189351fc75c938d152528042d63b2bcd0aeb0aae0de3f870c67988493fed88db098360a23131a98fd379c58753c7f9835e9b1c38d37e261a4e680cb1f16b7e10b64946210e6035302c4390ef4bfcb728e8db9055e7083b85f470018f9de07337d043a9d910c7d17b5a2c579d5659e0188b1250c035980832056ef8630ac8a21d2f6421b42126aca6cce8eb2f9c359c823c57349e3b15aeea8a019f8ffea47628d565360051a55ec45448f5765565290edcaf5edce5542eb8875dee421cea423ed6b2db589f8e803970ed29f2dbb09ebfe2b3f561d0901de014ea3be093b161461651f3b28eb7875fa4e95de7c66a5e3c187898161356e2863a47bb9707c89b6ed9997a6f04e2fe6214fa1c8029d5c8e36c7fb3ae1533a2fb462b8652f19d6e7d1f40a0bd5cc0aa8b922e42422b6ea1dab0b7910ed684efb06bfe32724cda31327279ceacb7759994f10d8046e0a32355995a567b322d14866fca65c085af484eaddfb7078ca67df5299e5dcbf4d10120b3807d9bc8bb64fbeb8a06fe62118110d76c458c200496a19d0c62c3226e2c67f3eca15684ee3c87a70c304c46f21c7b6f6396a8448d7429ae74dc564f50880c7b63f0512881301459b0e975bb5859958ed6f23d177743205470095fde6680c5717d0cfde70d4f69da4ae063252f36e3e13f6616d02f1e6c7402b66d3b8cb257b4f21804507fe8887f4fda5e26c11476aac11a8aa1ef1e629d739a549dd2c3077e29276e6825fa33528487b9504eb560dc17a1464db76767b509ac99ebdc30ff2a97ef6b75998f072183df7f93ebe8c43e2696f597808a8cb18ec6ad164b3e38e39202757d170b524d8f53cc88e4992ac87a5c5d169b70ed852a4c957fd0955ad1857e82b5551211bd14d05864b2718034dd0cf3fccce12b34141d961c6386b8fae306e3f1032ace9475769c2999b167c302c4572c3fc39fd703c4d746d8888187d18774b20c12c0102fb6594abac35023cb482abe2d8cf6612cf0c07536a77c450acd32381a573145414f433c9160a4b78f6fc0cfee4392aad2c031fe4a101988d3307a3160551ab48ebf7a3c80d55ff6c9f784c6e3b71b03138392c2bed2f0334d05d02e5a1a2b3f2ed06549f995067a15efb7d87eabb5f9ed97a4a2119edec44d8cf31bd9e1fbc26a1cf941c9c92cfa4102b51f6b3564875d4352bc559d39c81978aa99b3b34f231eca6e819b76025f367e095c60ed90ee85d743a03ad9419502cd2b98318aa42615398d702f4bcc1f0e66e8e19e344cc9373bf80d30c594853c5b82616ad21867db695d46cc631767b2e2237e5631c4813b60d9e5c7fcdcd33511141501642f8c6492ab1927293a785600d7829ea78821f72abadefe229826de5e22efdcf523a71fa159f0c176ddb61359e113b8fa8a98e635158d5b2127e139b82fceb87b46f11c1646148c3b28993f30a9a3ea2115bddc1b0bb85e8c3456a6f827bca6275e64d4fbcff08769c13d99d307b02e188b1028d90aba53c4d6283872a4df1511499a896c853b79d9bd3c4da6a850f4f2ee927e3dcd3e3c3b954e2321c99a0ea02e2b7d8a44d3362fabd5f3c67a4a45037ab542038bfe8ec6b9a75cf157c0e5ef96af31cb92193ee6744699a7fb9964a0f01074405feb0c38d000672c4903ca088d7d4845ebf068cf8861f5c5311a930e552258a5297a465958cc257d5ca4c1740ed6c4551e15143837b8eaa538e91007072588d6a0db06b63bcfc8358a9cf4261ec0f9db96639349d6ad48d8c3454df4cfe814b6dadcfedaca7187a69c40b7ad145a636c867a39a2b50582cac3e44ceea852e67fb94e4a0f5cecb51528a96daff8fc82616e4b0e79565c10e670341f98e4ae4737ce83ae56ca78e77213050d66c64792de48529324ab9ca64f0473f3a6216f277c21f9711fdab2e814fb1aa39802d217055de4a1ed47ebbb4e04d20d4fd1b9256a726c1b45cc12fe377509143dd139a611bf871b470531b501e2ca4487e383d828290618b879e4363f03e7e908863527102d48bbcb7b9f502c282bcdfd043767d0e4d9be316c71106ed111913c6b1c8a318a898ef3de5867ae7166eb495061747ab0067739a732c66944a6f4d1b59cd56d4c209f356ba79b985be8be30c6b61cb91cf7fef1bd794844e744c0148e30a55ee91dc303076f4247be893f725ac75990715f1f1be263a5e65780e4902e4dd7d99c5532486615bf470963407a51897b5cc9c9a9b11dfc8ec398660d0678aaacc605144640de978344524c0e0ef2e5d075002f5948a4e25eed61f438c7fc3915bbf13f674a54ae932dc514500273dfe8466639a10bc6f9e2d1fbcca35a653a3e27c72ded823af65076a83495ca27723ce905f830d15c897ccb1429ebba36c08c4e40f5e94fb67663bce3e3cfe27bafd608497cffe2adbfcc9739fd034ffe8abcea66d9ae9812bdfdb42f1a42b08da30c06db85673b3ddb218494b421cc40eb27dab12687118322d3d4df4a0c8847e27d22374410a1f1925a58699ffaa9246225df4591c7b364caf17c6c49ff6887f31a162fec9b66417c23999e0bdbc707b574bf3b666e310112b480d64ccced5ca1aafd63288d3592bb8356be466ba72aa507b12af6b643a0a86fc480f79188e201a3d4bc646017546e6acc52cddb2f246a63e4a3e7084c8ad21f57c840cad1b0db09466d026edce01b270685f607459507a237e18f2484028275d3cdbe9b4735458b7d1b79388e3d47def524ca0ef8b8f5a4dcad6c00e897b46b1e1360802ac57a1df5960f6dd6df900fe3b4cb4a58913534a4cf02700adddfe8012afbd329d867c8c5afd3f7e961465ec86b2482c6b9c09eeeb442fff64fd98c56d980d5888bde8fae3cbed1aaecf017b5307b998aa44beeb0445a7e668b4c9ac03e0769d5425c18e3a0f4ac61fcbf2df2a34c24ca9438986617aa951806c91cfaa09e00ee19ca12426e127ec70b33e6032a63a32a6f39b9684626d7d33805040e3af1f5f22919b0e8ed1bd414b8577a7b318b084f18f7462277b1445c46d22a2ffe314a0731a098a97f0673c48429bd485fa6917c1db62202d0a503e5640f4c8071fe2037e73847df046e5a3bb97001c8319898c0435ed17d8d1a4cac21030abaea29ff12c13f15cb9968c0080e28b47c1b5a72be09efc83e011487fae524a6cc51c3fb66c678e30045d1591119d37f931415e7db8b6246d1129cbc45af4fb50740a3dc16a87f33b4d0aab2797a55b703d370c84e39ae2d2e10c098be5e6621572d8e0c409c3f28f364c382ee17fbe20d955cf261f8e49f6bd8fe6c17685936c8238c5f2a155f6438f90faa755be46a9a912687b5c01371ad0a33332b792df49ba9b3422ba5e2202573cb278aced7cd15ae9f35abffb3fbaa6f37b44cb5ce973f4f8d2fbde99c657123facbf7d9d0cd13a794fe066c55e7b47474f20a04a28e1bda4e54149e1d72701ae0efc686e26e4834e8f6fac0a26433be276b8e2afe0144ef63bbfd36e1b8295c0a74769526715b3fe8e7f9da0ccfdb7a73d504eef157d40c90c7931f74504d3d38b4ebc9fa17b46933ca5a7097cc6de1c17c63c8fda0a8f67938d9d7e2dc3e2491330caf3712a204a1017026bdf648b4eee39a74cae5351c846308234e89c125ea79e5c893d51e088e6fca5ae89cb190b90d5b17467ce87f0d0962afb62e3de4f6b59c17466b79f6c5d2e45f100fcdc2f79c3e9c3c03d6ed3eed96f2273a01aa90fb3c357d392842725789a56395dcb252ab8f3e98cc9a1009723f13e76b78357980237d015b5b06b657715c6088b72e42b7b7e5d3731d534b6ea916e597b7fe11122c2d4e4e45399bf4749569eeb7d2c4559a8e3e65d82e49ea4137e23be387e198145d3c7fa097c87d787f7ed6f4a8e80a34e200e0fba6132ee2b2aa975744ce518033873f789583a32f02db9cadab4d25768ea0ffc6148a4e7dffa28e28d3807b8d33f43c2c62ed0151d37e08489bd894797f4c0163b29873a36b17c3316dc87e96bf92f0961317b848a2a6828faffcb49faa67eebd76f27627efa2a3b0eda6fc25a504e14ad2cd5c1b00796b71a15d0d4d96ecbaaa914f337ef5e249fc1ac6ab41258b86069b0dde8ee70b335a2318533e0641363f3fbd0a4afcca664092052071253053be45fc99706434c52678398939cbae04bce39ebb8a8c13df39f18c11ade48b523535c6fafc26ee53eeaca426c8ddcc573faa5b5901ae002d6c04fefd06929c2bc227ef7a648c874ee4646a49904079bdaffe6ce13b30af674adcf38b703ef2f48abe976537f8adf37f099d4990809b8f525c03302c53bcd3a6a7bd641ca415260e4c06b5cfa6e918dd68b5898f840509bb566b4b46f9e28f55d1adc0ad5b59a2ae471f7b5693c12fb4315399c480626acd7c0c8aecbd94c1710ec3218e10f200e30d1c42bd4c780f1f44f61f70efa52b12603301d6cccc6cd615256ab9ad4a95873e390b61b7eca8fbd1f684d0af17962359a909cd248ac9a98efaf825d3c733f72665e1d6bd7691a178d1018416a0723f463e56378996194e90496c8090d6796e8957468e04e77eaa38c83f32810a08f249b8c4403f8a22d2107ce751a6885d52206650bf4662400b6188e2003665be9b4aec40e8264c9552f83f5e8f76c571206dff70c51e44d14bb9fd78e6cd488aac2704181421ed758828c84cd8163e8a3e276d2780a428e3f9a2b8016ac77e9945971069d5003422f3f7f24018e88f74ca9f73a8ac4030290084e87100e2a0796b7f084bc97292d82d52dd49b5abb3ee36b01f932ee1b710b59ae7d820d593015775e7843948170bbd29020ba16053818eb8ed96e0b9fbb97e13d601a2d7a96a241a1b6a479c227c6acab532c39f09b31418b9949ae660ea93243018ea75eb6374f0af7e43448d64e76d0214a62f7234e4608d015f47433ca5fe97029034b1098219a87d54a6ae4669f11d644ec82064eeaf0f79b0bdb0686888eeeb6c1c90447ff9c16b027019fc36147c6d12e9550c44380b18c3414c8694ed43521ecef510531f4e3247000630eb7f5bf1cb02250bd91b14c75a024934947db9b819076ae682b60367ba7d55a4f32e5472c3f7c9f79350cb0880583525e7a8c5067bf9128ae38ad8ec2947ae684000d88df60b28c9c6ecb5a5f9db56034c91c2e0ae4e4edb6d19e6ba31bc125589da11eb7ba671b5c5cba03ef8b86237a98037f11a4879ab7bb5ec534dbf5b2a717e7e9a95c9d61b0dad6cf2ec47c32f88b229ec23407872076dcbc53da95a30d5dc8bd53a8df394a5fb1d2286039723c0fbce26f0685974459ed516d324b47eb472001dc968c5e65e45ef8a3c27bcc9efdba700edd9b2398c07b791ba2940684dad9928e35f6a4147d73ff8fdf7a2e4ce2fe94cd8281f34fbcb19ec83d18d50667390fdd16223f24e8a5d8202291499c9c8bc17b743d06a3c4ed27a0093f2e6a4a8e46370d576f37c6a54153f8c8c35421a56a3cc4546745cf7b2c327a7385dafc2a2c92d85991ab8434c02de2b493a368b460f51c408d53406641d0a1555108055c716c55025504c286a92308766487c14781630d7855c3531f9c7cbe8afe95dad1ae59dfc07721db631e59818e51ff669babad6f9ca9dfcbd94e1fdd1b19470a5071bc0258a1e0b3e84a7ddd88cf8732ef70850aac4c3aafe09e6dc32c1df64737cfbff115539b3812c8312fcf5e93cdc1985791fbce0d8cf8474ce63a181a22eac7dabb0e6a7b0454f2f56d2db18471f6aa82e838814d86cd82c2ea928dc71d33592d0156da1d5a9b35cf4bbaa6e1d2382a9ba7b5c49f1a86abaebaea74001f84023c4d278f97cecc664822a304c6b350617b4afb08b4635394c0f3df9734b13d06519e1a3c54bc75fdbaa02b7d6ee664d22f2f9b970340cfec6ded1282f60f95f29436649db2d6d2b149618a081ce7d7d28304e97952986ee42c51862245aa20c11d751b5cd05c58c6043ffd1ccf3013ea8c9c9081a0980fb5713823883f67af280b6149b3f216e3be96bd5d5109d969d437fb5dbd8e91af1349a6319b76714d382d6a78c8c8415e1739b4e60d6158978170f9266dd0cd2bbf9d7e2226f318fe81472b66ad11ae0ab732a350b7f3770076c3c36432e46a4b1471b281c5c7eafc30e6a98bd8a4bcb0c3939998259a4f27049694cb614d364b6d5f581c68762243ec10f3909ac80124e6b5b920cb91b868958c56040a1e2b932e72d0fbb7be7ceadb1a2995c505a1f18662e57d176a6e69295363b1bdb7b75225b7c18cca49e5ba1cdf4ff60b203a7e541661f4149e70d4456bb1bbbac028f5f27a57a4bad364dda954c6eb7b8184a923a924c0c9d9d498e60d83fff7e00d36e31d42e52e8d8f46ffba8aef637ab4cfc5a2c9f4eeea05c6599c882a524ff7ef80eb7a5b84d6ddc4adf5571dfdadeece0db13c6e0462c2cfeac2fa10288300894ee4d40c246a87fb87856d99136a1e7adcc4a80b328efc96e268b259383936df0bfc1dbedae43ae9c14aea3641f9327af9cede1e77810a1c20c07c8079666ea233ec6dcf406a625a7edaf99ec41381f2394c8b1972a38614fbf013917facaf52c390492b9442a345362012e4fc0d718f11cded67c4f1714e79a494095c6d67f26031be781d16959220194255b1cd2d8f8602a5d112aacfab43f109e6fe6c912f84e768aca857ee7d3be99ffef08113a3763891b6a67b9a8061cc9258a948432b1783788af9c39ba04e8e0c16dadea58e72365b863835464df20bb2b82d91142a67f14241f8e2cb7cc91a7e457a27a5379279c9d12db0686fc7cf692d2f3a761bea5f65ad9f9beb5fcb0986fc3f33722bf5d765449049a02eb9558301a16a503ea8fd9524bb157ee2630ef64a645fbe13f26850b32271dadd90525566a696dbfb056378bb902c80867dc401060657f824c0d3a80e98253a376d8e2d9904cbddb2e8f3332892163b39290bdf7de524a29654a291d09f60842095877373ffc1829d468b8e922742290acbfb5d23c48ef6f5e3b11604f7d4f030d0cbe048c9987f3d61772576ea9005bd37b0f5ea6dafbfee208c97988e96da4293df4a486857ac4e48089b9edc2bc79d3e6ecb5dfbc8e519a4441ea84dcce922316d678a86f597c296b51a824193a4b7a19a77686f4914449b02fc68ea29f790aaaa8ed86986eadafcdd0676ae18b22bf8e522c4f2b7dd66628e987986e7dfa24329a5ca67299c99423b73552bc2b1b5637beaed18f5a05e4a58fb16c392c1fc4ab58ac12fa2fd41f3da66933a36c34aa56c8edea0f31ddd1cb78152d2e3349038a0b7399491a3817b3b2baf18d5ab5da0cf2d2778df4741b6d27fa7de9b36c276a339514a3661969eb5b4958dd469b45796a0fb71b3d954fd2462ddc72e3a536738e7d553b7ae563f2b37abd6b33f469e6a8eca56c31390a7bd2635867d8675bfd5a5f06bed5d6a7f5e957fa2bd6d66597b452b5676df4327e7347db90ec6ad85bec9cc9517c2576cdb7ac87d4a256669e09c183cc89b9470cf32db31d2d9259af651636af69d1e9de4a3076d1bea85f336dfb41fb51966923ad46b3da67db65b52cd334984382b0fd46f3020689715a105a16dc2e08aff9998cbf7371c6e5c62631155b60e2b23603c9f287058c5d6416b5abf76b6340d6388a00f7070d52a84091cd34cc170f110ce0f25308f426027aa5a5c139679e618797badefdb188795c117a613146ec2f8afdf5fe4eafc7bee95b7f03bde17accc63c1a14c1ded23e7b7fa276bc2aa2e447f6da17b1685eaa48f6daa9ff07f6d6ffd04e6d6bc0defa1b6ed06c8da58942ed629c551cccebecdae806f352d8fba9c646c90ffad7db602f6d3bfae34d515dd6c6b2d452981929a5942b9a3965cc211dfb829921430821cce1f2a425f26e7c2fc6156c08199a4c52ca9cdad1f872f3db26d3504c4388bb297dd97bfd7cc4d63aa2720f7d7df4edd3fb205aa5e4d919fc36a414c27e4b383237778c3142a19a4c26bfda8c8993447477ecc81cc74c1bc6995c7fc0f56713167c092fc618a3aae3e6b7350e672e61323dcd0f171c314eb81d26eda7e48841450336092052c9270613b7335d266140c131e6f4bd2ca9dfa6dbb6e3fc9a4c5428c6d8b18130b3a68490737c1bcec02a37c22060a4d46512308f388e3202b580459028e6c021d8c5f587afdbf41e3ea351844693ab451429f5b68ac9aaa5e096cda6c69bbeb4d9d8f81b42cef983f2b498a5ed87d2b7949e5b4a1f63a9f4bdc1d27bb034bfb4c10d8d281c7099c91954aebc7373f2a2903e328969a337b63a44752d9cebc7f370933e36b61a52a73e1da17ea24226742abe3f5c02f3b83e0c13174530163de1fa478150aca87fbbd9337b66cf4b95be9234abf45d4b277350573e2b6db2e7bdb41d82b68ba1514854641429c5514072c851b287c5aef4b8c9f44fb21d37b21d0785606e4ccced640f142f6a2c7a2959ad2fbafe183f611dfed7069d30f452d08aee20195ab87e855b6114ded642ce49513bd973fd658f44e211d07955c93a7ce29c4321e7783074cfa8720aace38c2eec652667ac62f802c9f3299a729fcf4b4121a1337ece80e289d26be1a8f74fe8bcaaf4fdf132932126172b6d328abf94dacaa1b65754e6815d1e7edd8c2797999871e47650c88c282e147a29390485a0bb9c02ebf02b8758876ba17650084e9143a7f91ce5f67750a828caeda010932226ae3f7ce270288a8c82c196ad55a58d5533f32a150a751224edd33d7d248873eef089a35e13e7a094ebdfbebabe04c208638cf18789da7992eb5fe46f093974fd9f0fa5e2c3412108c5ff7d1cf53e08de5af0bc94377127d7ffe9bc940325e95a48c885a84edd31f10809bdf758478c73ee50080abd8733810c4084261cc730f6cca2be8f7ea30cbdf71e377d6f5e515798ba6fd757dedae6d6ba0aa543b305dccdf5ed26f1db72b00e1dfce2dfc3012f0ba031a467b99642d4f71c47a50db0981819213dc00085bb583d898979598cb1371ee095f479aff4732f6552e2c789eadf99e465a0349edc8e57fe3fe5764c4c539c1863c78602e5ff91c0d885a5300bd98107490f435a8789226e2942bab5dbdddd0d01ab9a6ac0c22464809a19661d4f88fbcb411f94dac1c0c0c4db5284741918bbf4a99b00b78fe0c081a236c2523a3210e68e1c638cb16fbcd475daddb87ea395c9a2f6e507849d40b15d8edb30c6182310292311c7c100c161470ed622e63a37e1388e5b472f7feafae63029edfa4b206a8473cec97173c68ddb6088261218012e0c9ea2432d9e35e46ebfd0bb99f23704f8a5dcc46d3b98876fbad13922d132918e3146ea28d6c14d2880c89f7f437c688bc08f30be64954976b777c3f4037929485f7bf7fc93bffc1b15b427b635b4caf44e6e4f35c097ff03beb4364adedb4c7bf267d50ff8f2a5b589f6e4b6865631b4ff5ef86f54323e0459d5cfb6087ff3b73dc186a68fa69a3ec16715d3f7f25e7ceafbb35dcde9e77f40685e3133cbc4c070d8737d2f50e02cd420083bb0c1098a500534a2d809c28c289c8851d8c00408f8210b58f000882ca081c619513011a38801103d6e8af04111bc300285152019a3cd10a3a56801c39c99d92f534771b30e6e3844f33f19b4e7310a980b841042af0d6950fb990afe625cb05e688df95f2abe3ff30b7c18e57befc9f7e083efcd28a517d10b18df9b59f6de834fa8ed833e8a038c5de28565fd3fd30cff3fd3469795912ad5c2d442edefea0ca4a49a719399e6017a8f7358f4406f86de3814495da2f216548878ef6d715dc63d89a94eda444a29a5651de050221f28c4f3315529887076be308305b5c665265f44515287be80f2854e16edef41d8fe208c113affd4ce07354ae91d472ecef1bb40efe74770ef6e0861430bdd1fedeeee6608639432eb4969cfd1eba2e7bec7fa4199f69309088432ed279373efc4281fccbda7716e12279c534e0921843e68a0b7f48143d82f8e389a68500998ef3c4c06c7291dfae53db74e57a18784385705466d0088738f1b32f436c0a8a682b9d74045432ca5a8c88775bcb76e8cefc1ad69d0c33ade77741e87b25b423805ee21abeb21eeae87a4a81dbdf1a76652768c23762eeaf460fdb4191e9ea1211f1a72776738e79c306e2e0d016e05c4ef0a70f96da3a8733c20aac4dcfb0e07aa3af7509c97183501e6decb38f7feb23496a5395a01ef258d274ae7fb23c07def2b473df1141d722452843a077214537104d1f59f11145420a182dbb913f7e93c8afb9ece780374ce09e78c3f658c32c6e7839efddd866915e82dc68edd36a32ff4d600e31258d6cf7ff023c358dff3cf6e6a3ee45b4fb519a83643217d164e5b2d642ee44bcdc7fbf9d37631c619a2cd9e125c5cc480d00592413b457a9acaa9ee8049a9bfd067f911fbfe1dda68a45108238411ce8cb451a7f329fd69a973d43e3b63d9180d5ab853fb9d373ae79c1db5a865bb1dee6573a06f5918b410351fec726c2e1489105461280645ac808a0d7e70206c601bc6e8322cd0e23345951554910413aec8b1816d60a203269c10c20d8c18e3073f01e5af16885287c0b91ca4b3a4009783748edc2144eeb40708691dc253dafddfeb320ed2dd383aee807e4b09b5ebef268e7a59d4ae71baed15d5ff21dc78e82793c04ad0bff2424471577e345de361061b3dc3e781279705c9ed9f41421cb9994de520219adcd2fb6356c69a0c0c7449b68397f4d8685b793884fa5e463ecb5c418ddff759b2d84cf3d133947ec576a32f3d6b3325d24b127c6d834daafc97814176ece42fddfe96bea32ba4d1e8a93633a27565926c67ba5366fed466a65681f896965919b2d764a87744922bb61b72575a6420d2556ee9a7560116ed651e69f4fc2b5b0e235be743cd47fffcd2367a9957e9769a3686ecb5e77b4929e5d6f963dfb23dcd47f6da635a363252e5e7e05fface79f4f259beb4b2fda594447ae6a7cd9046dbdf95af40fc1175d46834caa9a3917f8b0f7fed4732d0d30cdaafbc561fd3664abfb275251b03b30ed233eb18fd0acb561feb6ce53403e9b31fb5dc919d4ce964a24c052ece357cefa5ded715937bbb23111486914bba1c44e4e487293f5484c1731170990a222a39393faeed98f6c91946ee19512e5351d4c5edfae7f6c75ca6a22807b7b5192d4ae50b6132e7a80654e5d7976a158e6b9b17b3d765612dceb58936bf5185a9fd7f7d5fd6659ba747b342e51be38604c88a1fa25c0efae1090fe172d00f46ee09a89ca08bcb4127d0a2df53703908c7c9c5589bd1c4a8fe18491ba33a851056cbb2ea97eab3544b73b930d6f7b8d6b7b1d88e324ba9446f5c7919b738f8a9cb95efaded599665591df6cc2cdaf336c4d4bfe580d9b105c1611bb2430f3ed8348e73ede244ed0bf9baf51b16bf84d0104208a7c03431bcbbe345a9f57cad8fd1b29e6ed25adb9cd29adb7bebc586fdbca93b149836450ba3f2e53939f735157e4d0a951d273675027d52a1735a76a40175c9ca6b9b2f71a0cd9b6cfee3cfe34b9c47b31dbd6c57472b735a3fa7c6f3bae6949a0c7ea9f51fd611ffb5873dfa34fa395cdff09b25d336f8d9b6f29260ecd86a5aea4eaad52be7b1ea77126a6b6df611c5e8d6b7a538d7c54c27712e4689da67353ae9cb595810181cc535e75cd4a6ed9d22d4ce7f60c0ae0cb2b03c3f337d94459bb1a87d42e755f46d1cd5b6eb9c1bdfc5b9f8496cb020260ceb6cda77521b064775ff38173b0efacfdb78802beef2cde1a9dec9eccfce92187ba777781c05513e6def38a72da93cdd47e885c51d2faaf49f1a8f702fd547b41237fed531b8f1ada601d73b7248f31628601a19153eb33001a116ea7b08df0b3149a3276555cb36977fa96a396dce49d26898a49f73e2d034a2ea4fb228a575fba1fe0a89549f6ffd2cabb63e69abdb68a4fd5f5fb52ba318bd2c3a9160ec92d595d133ff685bd9de39ebe94bb158eebd586fd90846ed62e6935cb8161aaca771d4ca5bcfb97c8ba3fc2deb71384a6a60acb06c3fb07c696585a5c4f2a3110bcbaf6c24cbb2b2c2c2e262d91c58c8477e7cf321776194507eb4ac8c730f861554ffbed3c6c0d0cc26b5e2206488f7f0deece057e78890ae7c93a9a342854f04f0ca3727f7b0a7ff9ec6a2d6654f16dd38ceb937af50f99f36f3cf5a943ea2c38f1afcf786a8a8391f0c8e8af383384abe23f56acb8aa09c231042284685efbde7f00c8c5d227c6cfb01fb8c197bceb08f11c39eb7b68cd9fe89b1a3e645e5cbc3c3c313797ac5c3c3d3ab15d0921f0cf67d5adb965bfff0b8261f08be182ddb403fcec1ae7fe6ab4f6a33dd403f2fd52af82d2d0c517dbf7222341f7e6be1a86841ea6c6a2a57beead5ebea3dcd847370e654fa7e2de81c43b9d1c217ead5921a5f720ead5b0ec23a46383512919c10846324c6071d4218fdc518638c11c6f831c618638c1fb550e14718391e7a9409d5c53166005fa032156320b94ce56233a33d3c957d10afca463fa8167c6c5a96659fc8a85cd85fda8c5bda8cd518d6dacc35733dbddef5b0b7361c840cd1827851fbe9f3957f6933d65bd6b3de48a3799f43fffcd7f329106be3803643bbc6d4388a6b9e25f362b02b8b8989994a1072bbf9434cd7b2e6b4ec133aafca2c5bcfe5a85d70d1859e39fdd6da522743180e8e6221d42ea6fb5ef8dd636ef0bda84330a671ae2a30ad8adad59b61520a153690a6857afdc36a8b37865d11424831eca214db2cdb6d96fccc9214baf0c31d3891c156d6f13e72b1c9c0173ad00f18f6bdc16e53c36e26d4251d63eca2c27f1036675d741ad01b3e08e10c20841062e14230cc08c23aa07d424948fd98395a88614d5fea0110c6e0f02317f53de7700e6a59a89c0e465bb06a51ce39fa75cbe11c85792ff4e9c52ccbb22cebdd6ad197711c7ca01fc451d6d317e2287ffa3b384a7e0e2a3038382efd36d2f1944be9cb584fadef28b5a8451f260787e35dac4dbb42cd9ca3ffbebea6855a2dc5aeebca56b61f569ec5b27260d96c6e542ba3c7b095b73692b5bed69779d6465aa95bf62b1b69ebe8cdae7fe72ecc762ef7f21110eaf3d73b930518d325d413333fe7bcbd7077f776772d307694dfee6efbde63776f6623524ade6ef400c7f77b13bb6b80b14b479bc739e83d50c84bc9876630857ec485d076b027eabc972779a214352e8940302eb9ef6104ba2ffe385781bf7047f240c679df49f71d471d711437dd814d628082412953763a0e1a62c975db833b0f18fb833ee5f6ed1ba49373a5b416060911e5b6b38f70d03e0309bb601c1f7ace7ddf5dd405515194a12750869cac9600adee8b028a18903414ce44f3f073e5cc396865dc78e283b677b23672fd85604cfd5c1320804c54a8dcaee5ba09b066e626d2551e132a3e563021732730d84383bb3b8dbbbbc3e0ceccdf7fe3ed464066a6ccccccccccccccccccec128899fbd99fdd2dbb07b9f1db7aaed0769665d196dc4364bfe23233101804f40f27b73f4aa7c8f2d89f7eb03cf62c961fb3a7686d60d58acdc9a9d747f83134a44d48067f042184356ea26b47e8892e6d04d55100fc7bab003c8eef586828c614808d3e0036eb716c36feb4d57817b6176e6c276822612fe301d8587563e7a57c782faf777860a4e5fe7b077b1efad7df603d668bd8224a7e606fd91317b99eda13ff561f7c37e402606018b0006961606ed0abf41dafaa857d4b8ae5c264bc617372e8dbf81ceb6b5c97c42cfdeb7fd0f93636ecac61e18d4a494dfd166a3dcbf52bd5e6e4606f7dcee873b2cfb9fec8fb6ba3016269ef491bbfa782792f8fa777606edc44c79c502271384754634783bc148e7f3e30dd0380efea0bdf31d1e9064371e101b0618f63d3feb4b5fc0b5b8dbf417a17ea9b56beb4b1fce8651c001bab706cac3a6dac7a6163950b1bab6e9836566130ef3dcc8bf6db9a6046cfaaf7312f75623b7aed335b44c98fd16b9a3d31ab36a69bed2a941ad36780753c96172e5fb7634969a05f5e0658c78b1608eb107a292536bc54a68d7838f90d4f0cd5e8e46f03ab4c3627a7e5b1cfa9f15a7442edef3fb9adc96cb43ff8dad894d4941eebac9a4c0d01d7b9cf643ad564f686270606b3c6b096c7b41aafc50b35223efaca87da8c3fd46ab2df01e4bd20d9dac7b917036369178675bc8fa71ab0cffe06ed6d3c6b35a37f406c643534574dce8b3cd59c7cf4d92bf1b7e1e7f6c78dcfe8dff81b55dce0a52f357a4a5fdb8ad878edb1ad8892f945b2c7fedae8969d6a30fde87f987e64b2f4a3fd31fa1bd6c6c68f2cbf971ab2c7fe4766b1eca7fd61c3f27b91962df66e8d4dfb96ed54b239392c9f533f67f4d9e7ac7c0ee973b4c79e55a3dfb105792fefb56d876d65ab3a2ad2c6aad1c62a20a51beaa420ac09ad0477f78e6e639c7bafaf783d86602111a28c504688041a5ead566c84989899ad7ce52ba771e668de7bbf62e98497a2b4d615643a6a1c001c11948227147039a888a2cb7239a8882ba441743152e6a87983bc977e2932ef8581b41a56824043078b9c25470ca18216e6bd340a2e8c91db9988b81d8782dbc50c713b5ee9dcce85b8411c816787094553e0c114aa204060850b564350b822491154fdff52374f8c3144182f587284243aaa0e306101175328e184890c544a48020b413899228612a6a866825a1046195e00410a3d50f50779a91b248400021333b230c51164a89ae8caf80b1c66525a25f167fa61313e77203cc5a3e10b7cd741d52c95cff3a4c993698459c5ac428221c19846985504f94461452a675a2552fed6f18798aefc28a3935aab44210abc49a1c21c253c74f4c91bb59dcb5fc689e1e4a3def75b57029cdb03bd2ef76d5d9077a4856862506b789a87260c7b9a21be8cb673ac0f3438e7cf031d155f7bff5ee2a899b5131bcbda7ce358efaf652e61b46ce3748e731dc5920672aee5625bd747ae7f331428cfc1d098cb2fffbeae3ecdf0beffd9d30c37076877c0b48d81f4a2760ca509100e0cd9a1871cafbbb1b620f259760ee0200448120ce59fe3626e47eff502ea3ba094d209e7a43bd862ca69b90acdacadc55f9eb4d856e7deb4b46b42ed7f1d85f0c2c7e08493d2f09df6c9f73ff9f01caecb732be84b09e79cb693605cd3a51286978febe13bbce49452091753f3217d90a08377422a58d5872b2f0c8c16ed82d2742dca90520a347d50b33706466a267a90f0e848d9466c4ec743405e18edc4b9166a2738ce9d3ac7c8a979bac739ee87b7743cf442cd0f20fd3ebe08a343e15cf79f5c4e315704f0e610639cebf8bec5e8eefc317a649b43f4ad4a6d28c4b99641158a9d65f1822447ecc474373cc1ec78f3b2a8cbbd360692b1d15a96f2425c70fc805105ee05b5a357c850ed1e90e9015ddfa13cb7eb1d9f2447ec40a0b98ae941e3a40c1d6652068eeb9038aea776312f0515263ef70510e7b81c32c8352df8e0f3014a2d9bd9c3aee94391e95a5bc75d7431f7b93ff7e74e51fdedaecdd027bfa7fac3e983dab54efcc844f7b48fa38afc7d3a8973d3768f7426ba8bd6419282eadfb5ef5c263099629cf36e9b2bdf54860987f770ae599bd941a909476acead47cc4c426de195d043823da5105a6d3be85af6ef5f66f9b19859efb2e616f4faf7d7cfcb32d6adcd58d2ca788b4804b6c968c90c484686adb76cc73b38677d0f9a0c303837690c3e38d78dd54cfa43209d91c66921431cf7da3a9e4269ad26d3734e06069a8c2173cc69867e1d4c3707f8da0cf4af3be69b1b0a62d551effa3f08b519f82cad98adf5ebd58410ad5d0f17da600fc3a89dbd734e54f99de92fa5594ae8629b8bbff85f9be9bdbc135552e115cd7ba1d90ba2a6f3e1f643c9a701a3fa408373fefa87986e7777cb0dc7edffff775466bdf56d41ea3d400954a95245466ab1e10f31cd3484b0ad2988faff3f8120a560601e0c6a4b11f2dec32fea09fecd0d22444adfb7992e03f9472b031d3e18542ad345ed7c87bee048d48ebafbeb89649060863ddc4ccfe6f6f5119651fbbe185a9cdbe84b3a217df562d7fbb74049e963b4e99496c22a60f6d6d6b95ceb3d9bfb6c673d7d8cbef7665f6f5e7dad8dbbd996c37bd8b553fab45aef268ba9fce6a80f01dc39bf1bebd804d64f544ff46f2eb55df31391e4ba70398808a07b9a81bef69abdb998b603fcf83ac08f74c3fa75377dedbdb669f63291ae22035feda1ed64e09bc310f8f4e353ab037cf9e8633293df03bccc3ae4c72d87fef853ae0ba25c6e2be3333173d4e33722d2552e9d8f5d18ccaeae72d9515d094ce038a77ebe1dcd88f4bd6cffb5947558ac439a9c6b9bf53c018675e6391e53d6d1ef4f93a1b518babbbbbb5ff77bdd70748a215eb60d84bf5f8b0196767d777df76eb7edb4775f18fda05a98a5cd8ca8656ded160fa4ec7aecea4bcab07b6dda531eb22752029c3bd22e4ca3e1e66acf3a5801567ff71e5eaacdcc97435aaec76f7fea37a39650a0c0c953b8753d2e5cc0ed97d277dbedd63a6baceb973a53ddfad65aabede0d38d6f0b7cf9adc5007fbe879d0b437adcf7bae1832aa095cc8bf105bd78a333d5d84c9b8d0debe0bb300afbabd45769ba609eb5b49d0f5702390fd1aa7b8a5888880f577e5782db44e695b6bbb9914a2a65dc78c54c1eb0801bbf7be14a4f7aedb1920b377eb772e3c79f5fb29d006ad0fb58ec8d37d96a3b4a6d58e69791666b5893e9da8894e0d226d297ce1c3d84bb70ca63f14b0821f54a8b3edb4efefcb77526ea9c942f21f3736fa189d0b2e33f96dd100ec1cc90991942c8ccec5586eccdf7de7bb393cfdf6570423b24f3234c1ac0c81fd909b403f0c117fd6df4f27bb3638c0f4be2c5d60117fd1e6794c6b9f9f32f08250c3b601e9435a839382e36515dfe210e1317a6d752b9a8f4bdcc341fcfc7082c4a2d1d706165182d82f97bc4c464afc247d3fe3b6060943e3507c745199354979713e2304dfa5ab6b032fab8fb5fcb3c19207a5953d27984893e21cc000b4a54ed72d00cb45852afcb413360c20c9a4111a49452724d78685049978366f09364063e979b418f4b511718f376d9dddddf7bf0ddddadbb3f771f82999905b5df5dce34a8f738d1504771212e8802c70a547882136589db7551135fdcce71ae5fee46ae1fb9ee3cd7a144f1739d1a815286185950b10523b812b7eb950c746ed742f376fd44a87ddcdd081fb9fb8d0eb018e308549a28a18327f0dcae79622085db754f23e9778328c0a00931c4206282ca5970bb981e1c5c8c3e274ed400ca921f18a1c51554be82eb5fcdb8ee9f0427386ee772a10c8cb8500652342144134d6086c001eef5539bb9aec9b4c5b566ac1ed005c26846ed4ca686fd522693500c5c70e9bfa3e09b9c7b1c7f3bd31477fe7cd8675ce9402fe5433d40dc03dc6825a99d0b0d713838382700c2c151f5c38d3e1f1ac27d0f1db5438a0c82e17cc885bc8768d4035a9bc640da4d248329129e01848691d11615064d5cf73fd12a4730f50b190c8e78c114d7df850aabb8a0469b9ab0c58c53282491c5cf124de0000b5770159c71068b0d27b80089eb5fa37b70707050f03d66b88115647c818225b650861f5961dea2cd78499b794d001c4bb89dcb036e9763478f26c0dbb1139ea12a6810a444126410b4841849825a50258809265cf82cda0c4c83886b25013c3ab8feb506e56c85a12ba0c08c1c40c104553c89349e209da4cdf8ed5a76dc0e87042e0371217c5a955cf8a6154cb9f03f053f173ee713c402312efc91360363380eda02074d68c11956109de1483c915a1295a10aaaa08a1ed73ffb41054a7040fa03d9a80b061dc9c2194798b85009174634c828c0853fa930a92d948413d73fc213249173ed854169a860f4acb8febe821542082144c2085a50e1a20823644851413fe2c20925162a133cae532602000d4cb59aa88f1126ab288ca002878a24a85859e1821613101526394c8c5453d011622c11d413e453839028c2082174218429fec2b79a88e2e5202442b7ab7f6d8189ba723988082c7e88e00249cd2e071131061115bb1c64c404b7fb26f5c6e52023468850e9e520234d2c514797838cd8a006555e0e3222850ac92ac84818414d9831c6113c97838ed0b9ddf573fb735c0edad1e282a7d951131743a10c75110ca720cf8696c6d638d72b302c8173a713e75ac8ce95735d0220ae7c2a57be3f5b447305430b7482aa3fc7e76869168428fe322404b7dd84729acf452f35abe097fe256071fbe71476bac8717a67ae58071570a845fe000a50c89394169135a549b7ffeab99278aa7d762c2a8ee22023a6dc7eee7064aaee2f9edb3b545dbd9d359d26490d1440fabba5b8fd3d45ffa0eb255d064472fb1b4ae1f63472bb9b459845a0a15b8b55173c65c7ed789563e4c8ce35e2768dc4b2e68a681a71d4dc993c7367eecc9dc93377a6cfdc993f52903852070e0d217114f48150f8401f1f282a900f142a8379f814eaa9ff46d57faaa1dd457473bb44e8bdf4f75c75cfd5cf220ea8bba5ccd57b6938f403e6e13ea73dc928576e26d314cc23be0e5c85abc35302096e4ff3f9ceed5d5e0ae621371dde5ce1dcfee9a429301de73eab83fc0bad0ed29efa4acb51aefcf9d2eac051eefcf9cf9e5e941b378e72e196c339ee04b3a3a930b97e8ae911734f3230381784d55c51e05d185a700101000718f37b155cd664e82c307eeed7b00acc5f52a1be894d8e6a7ba2b7eb7b45350139904379a90b2082c2c481de8bbf43e117c7bef02c38f5fcc25fe59671bd0ad761b2f0d884430aa99b08a500ca75dfd1a5a08c2282b8113e87e228ef9e91ebefa7da9282eb45dccea35c3651005e235260ea5bf817d7e5330ff82b2f355f4f7aa36a295def54d6d1d049a5f42d4be7d309bb1ede7d7f7a96df0bbf1d1a54ebcded5b845533c338c6bc53dfe5f7a88cc39dea9a8fbed2c63dbd759fe98897511e22ca83e75bdd4c4aa8ddcd650821846864c19f3c5825152a74984804d06c32b71ebecdcb03a47f23e5536b33b2a93fed896f689d94c65832f2e9df30dfb245587e3eb5b3c87c29b7e77868e5033cc44320782939eb0a8965f4e33d17de54e36d0cbdb0c97761233d7d1b1bf635b6eb5b36ed4b5bf6328ec5bc54fbc400050152f3010fc23adeaf6c3939d6cbcfa14f7a686be69c2cf6e43fe44febe5bbfd41faf9d3dad027cd2beacac6aa0fbc0fc23ce67d2330b0b0d3a321e03a3fe6cb1aed0ff9246ba3d5e4689f617f594fe74b28c487d6691e0bd382c8c40cc5003dd78a5842bbf39d95e3741127a5d85ebd602975a1c59a36eb6f6cd7dbd85a4c2bd32ac52aa1a113cd6ce8f014f54eaf1aa87f22606554d4d1931e0a0f0b46c5277de99f15ba88e5bb5ec27c8c267b56bdbfe1facc16c92e7be222acbaacee55af6c54d1ab5eb511ba8a5e8d2c8c9f064fc5bc548d95e7a771547cd2953dc31a9b121b5865c3e6e4582def1a0ff0e5d7d85815e344267ba2b606cbec09da530dd663ffc3826fa3d91f974d8b056269decbeb9f475571abccf99736e6167e71c771fdd5582fe35d05f3e09bfd9bc27daf772e9dee19cd263c9d6e72570effb98aa6e6a52eecdf0b79298df48f8764ab84a014797dd2b3365393337a2d7b8c86161a22729ceed7ab1a9a5eadbc477acb0f96e31c7fd740bdc3f20ab5fb27dcaefae0a8530cefde7e1b9cd78f8a7fa2ce05e1ba0c940611d7df6b52dfd430b7a10a4c9786761cfafd7d3b21dac107209a9f6a7a96efb85217733117b2bfb1d5f895cdc6b36c2758da4ef0da4e10db4e3062342fd53fef698476b042827494417d9787f744858fbd276ac7bd132122e2016e4458c77befc5408d875324e2cf833f7c2236b02a27a7c6b77c8e8dcfdeed29da9aebbd8b3db9929a95b7feb5b4fc8daa83b9afde97ca80e61595c8fb1d9807cf4b593d449be03efa68601efeef29c029221abf18b4eb76072c6acb67cfac63fef5a5a7369ee56dacafc1626d58de0686dd78e89cdb2891f647664f30b3454acff236355a6c1125f28b5c6f3ddd68769d6029b2d813b47cf0196d6f87eadceb984868e546fa480a9c10421c0f21840fb998ec4f9b8d7f616b79d3768a2e6ca7b8b29de28dadae4008219c10420861e95905b167f91bb22fd922d667cf628b28f9617191126f148310460857268410c209574a315766b194ac8fd1c6639fd3f2592c95a6654b251b994dcb67d7a6c41fcbb69394f6e58d4ac2ec4872e7851f6488a76c0071500e1227390f8a1dc01d251c0444122e94414020b9f0fb083cd5507aec7f941eb3364ae45fd6a6c697ec294afbc3faccdab0bc65d5acbc8dad88922235ecc9bff4d967dfb21561b1a71a4a9f7da7eca834eef564412a11cd080000005314002020100c078482b16838202aabec0314800b839a4476541b0ab42489611885943106192004000644446646830600c067bf96ca0d8fc028f62106b75abd41c8c2bb7e2135920f94444112d4e2a24732143dc68de862647a9a2679d64be33b9c010ba20180a31879de180212132f6c0a4484a43d5f14ad91590689fb9a84f64f5207698afadae0906b659c40154c6e7d827f605e3b95548af012ef981e6df2faf4da8a64fb27c73870cd56bf7d2230fd4f6644c4f52060310e910d951105268e55a5c1c3bd7306c94b0535343f2a5581038a1c4f07ba218cd387c1b47ed54e60b2d56c6da44a6a326cd1cdd2dbd8a0fec3632a6337d31acae91335d58e771aa47d6ca7ba8e7a199db1ac9d5b19477f90d80e53bf2c9a9cf78a9afdfd1f6376219a66725443aba75e76c72dd057a4c2aeef7a9aed43a56a3891f8ee1401e611c8b66d6376e124f198abf34fe9d1d9dfd43889aa8bb5913be145e918aacf1c6b41ad40d1975635d51da4cf033ad158b287d5f254521d864fab99b74c0cb4eab7245759e1047867b19ad82a19693abd08f0b4b7e169745e0ee2348dbbb8898dfe57df890be4165f2dbf44271e085bc44b446e2aa07ea45d349b9aa1ddba2342c45bac51ad8312e596fdffabf8c38596414570435dfb0975dba80f731eea6fd3e2372a4e5271aacc6a167081fec8bb5543fae01c947811c7c0ce818f5e8b8dc1ca1c13b201645d47f5b126da07ea7386150e061e7b557ed3ffdd21f8e02e9223b758bf3ed6006cbdf15ebe1a65aff21086161cdf432ccf162ab2f32065614a9cc865ecc8fa75e1e24cb5f97fd6a3540a23ff8f335950427af81a7e1725087b0e42c3b79f0ddd2b3916f29240c222f4a73fa4130098d31771ecc9f19474e2597b1d045237f5902f26ecd945c56b988521753359b8e926ae9fc16cbb46d277799a5b799b75830b9b399dd0cfcb1c6380728856a65470fccad2607bdbbd527a7addd65148751788cbc1e28e5f82480e611c880cd80a589a939562a8323861b31a49b2aa49b0192255ff352f262c932da7aeeda9c93aa79deb30804d486dfa4eeade47a79f72750327d265106eb2b33b2c8f7224f4801cf958f5cfc233ad6872ff70d3c80cdeb0d4d874b9ea5f5b02340b186f7bf2b2aa10052b4740eed2762c4513f668c191cb08848b58398878b591f2e86a566304ec0009b93b6d7acec721665bbb3696a8f8bd456b605bea5ea4922a6ce21ac01441fcb800fdc4c72b9251074234e21f097215cdf46ebb798a601ab34d03393da407134789c0b96a05dd449c20335aa95561f567832c3433264293ff7f7a06693d0c42a8b595d2eb91474b93fedcdcb60c8dcbc85994e4d1e1e6cc45f2e81c8e1d4b63944d619d940f8f73ac4d3a59a82727b2ff9c212859de58eb08cd22d18313d830d638b7a7b594dc98917a370ad4756c51a1b75bd28e8e571ad2739e01bf252f98bb44f37dbcd99e0b781455f2420d7e06adf08e54e51a1af6000e78bebe5a837f2dba99878c4e856eab6e13a84d2adfbc6a8932eefa9590dd429170b91047ec07e052e2a6fabd1fb8b225d35b94f6df6bb6299ab580a94c77fe2a6daf9abe41a89dcebd04c6e42b61e0b7c7499ae68ca444e0f6ef5651ff540bc040ce16142586a933c59469bf92bf87176bb7bdefadc39a4b7d7afc60277ffa5a26087f68e00b10947dfa3178a8b52a7507c8c8e4153e16a5c42d68236d71adaf3ee6244251ead1027a236d210dc576b0b42a271c22a7f25f45aa5f29022e5f7aad9741861c75bdb8102573a5f1d91c5feb625793c0963f8bd04ca2d0c1698a90d75b115aec9fef601e8768e5b33b5a13e6635e1db0e0da26d960330d91b930df6acd3d7569f4b2e105e9b7f7be2472f408ab35e9689b3e5f15305acff0da8cd8e7b4b313c7fc26968ddf66c42fa4c9bad99091654944fa15c1dd17973926287d8cf65cc9f13c77377a3ac06077e0288c57cfdc4eef433d21196b28ed8a1a6e671d7078e67c2fe58933eb691c04c2ed65e0446ffff614328797ba6daa31222dc7d29e33f6f4169a588a142b64d4d6b3db23c2eaf64f3c05502e7e70d8b14cf3059d1b49404fa3d5909f0f61cbdda69697c95b15b34430dea981e7b06c7442020bbcdbb17353d14a30a323855b33d24917702df534ac997446ed794b5ce62769fc70aaa82af6ff614695f317990a0aa282a019e3913f98cae74144c6b5beaeb556b3d810cf85efec1302252aa2506f7069016cfbf99c8168b7533536aaff04ea1ee58357f7a979ebdfc0d0faa8f0d1b7d39548ad8607293c56cef25d4a3732f408fc968cf49d387149eb364528f7b7a2b81b437b4eb73b5ec3a3660f9c3d363dbfe3140c5e0d534857044aa30e4ebd35aac61d621a26d981c26e0225f9531fda14970907d121e04be3f43e481b757d1f67206ff8c5b9152cbd2d508a95b09ee4e854e566ae152a952213d0671775f26624556e65bf1eab1a6f3bcb841cb43c7d227a409e678c50fc67dc8632bf1f3f58f70c62be74d71b0c3a8082cada92bb9cb5c081bd8c9cf1af81882855b2760e05552b0e3e70ae10908462c025e07227aaf07a8878d237903c968bc4cea3d2895233b9c7877806d0af5dcf1c771f7ae499933bb0f24597f867458c21734238fb73f0b7d5045162022feeb98682a9aeaabe7a2b93145bb235ddf037883d2acbd7975e29ab30e21d8fbacd79d417f0f9cc2b397ef98b6a838e69bb07f6853ec67150fa2f376963f74c6aa073f2957aa784f1f9e6d0986b5e18717f84e5ff0074d2967f8b44196e0587459fd0ce73d944feb30b540624762813337de8c1d34edbd9b875f01ea193b0c9f4a1586823f6b2cefb6d2e3e876f22576c110f7cd409940f0b8c61c0bd19161ec9002f97ee9a92721242a77a4327970e2bcbaf9e7465abb488fa7b9f95c7baff979fc9d0d8c31475454d14e4e417954897e45019be3f3baa3d0a4c72bb6f3b5251162f21fde19c1f2f03d066982798f65f575d61832e4eebde16a5d011019e17cdfd18f23d933ce57afcf0c9d83250e7a216791358a7ff12600ab307d0d1d1edc1232e66c4f9d28c443b065bded5792f4a7cc3e8d0c5a278733ccd9348273483d2077b89bbe8c6a364c643fbb32c5766a46b5e1679c1ec15d153d51d4f9d022c5eeea5a18d44b8bd912e46cb90e5676fc360585157972b6a249e88080cbeadcb8e3a5b44a3b32d468a81ed9c6bc72416878b767bcd7dbf9d83290de478d68b2864e160955a1d83cf6ad122aeb2fab7d25a172092b53632d5b73a92fa111e26d6bfb78ae2689fd8b37cd11f34aa8292adf6429832891bf4b66b2ea97839b16ebd3855c728dbfa3be58b03f94dc6f886919205d6d011a331e1cc9fc79a61176c04a6b65c8310e4027109357516e55ef9f40134a0c1f549df5ccc3b46fbf9610c433d394bbf3403fd40236bc4ed0b21011b39c539546a534b6dc1b3def9833b1e1ee4a296ba5e61bc19eda216be94564ee1288fafa8b68d065b5f12f1e16e13f79c629b9419cc94c0ae06421974957695e84d198449a7c53ee46b9f5ec1bc53f1983742937f5a42226962b7da3da743b97e67df001e63cc6f2dba4c07e1bc18b6ed58cee853bb842e5a62ede1810a66330fe21323c99c365ce737fee1b21cffb8e8e6ac8d7f94ea9d39e842c064fc03a35dcf447bad5c64bed4ae2fa08209461c7a1f6095fb5551f8d23acb9c02cec4ad567fb92fd6ad14d706dd338ec6852feb8d185866641eb0f4fc1147b454a8ecd437af221898d36ae146ef35e2bd708f5c4a1ca60e10d7ad56358d01cad9c891c191fbe7ba4eda2df0d4f4a0ed9e43332a4bfc2dc6e7792126b7a6075fe6261cfd328794a8c58f1303f596cf880854998e3a7e108192465d29ae69c7ef346b9b0515243c1b83e7eb1a675967d5b0320f08e9bf7f62e8c1df4121c7ea51d054e952807f482e828b4d66c46398c6c2df300e975926ffa88f4ef480e3a79cf584501d64fb256569cd86f278c51c8b3a74db140ebcc02c94943d2ea45d2dadfde01716a5cc506eef71fff0f79127a5ad46666ba188074d100335ff0d2a515a9295b2261af82ee06e82d0cd5900c1b114c708b8a5060bd74b2555a3fbbc7a72aec5f203011f540d3c108ca5d33da29f2f2da3595be87c671e8f841c8f2e33906d503e66cc7b0f1d3eab0157804adadce15703aa68b08161427b4ac3a7cc60dca6ae940c1b5686ce0e76435ec3f227379e846d2e2106421745d979f751804c301c67f64f90106942694c94f37498630cbc464045dbc0e282ab16fc0f99345ad043b668651008605f1c6afe399a1b8d5fd2ffb7d2823b7d6d2e787262fca0b4112645ad9c0eedeceb90ee20f20538d4611fe38b5fb7976724c4806470c7ca3afa7ca0a5456390ff3187770064e3122806759f4ff8a583e22cc40a116d7d6bf8758a6cd37400145526e569bc1139862c46eb73df4c5f8ed0fb02350dbf4013bf922fbea02b9ea8e2253486fef010dec958f74c654b7308371ec4a8f6968e268b9a0e61ee59350c28cc146a4783c85052e240fa4c4065efd24362da28c6e252aac4594294299f7baa64bbce899d34d35809bc5063b7587bf84d5287f4fbf14b37bd5f3a101844930c10890edbcd8137358d55ac8046b9f0e20b4aa50548d8350567c877fc2eeb2222da9a32f8eb695aa85b361a4b89d68aab764e8f8483104197214eb4dc1ca2238b1af7c58c688d2fba87ffd4ae23632061f93763b556206b229b32ddabbfa8ef863ce14690871d3d582b63ae29047d7bbe6eb7ef3d8eb18307919ff92b7003f26c4150fd21b5d6020fb062f7430f4a0f400b2077f9bfc49727ea8ce16a20f58261f9516e9dbb9cc8550975dff56663f8b373edd0bf64f24c8b46ca150f2691b322ab6df403f22690f4b9dab01ffb28a5d7e790e797ef2424c0edf17e14935476316e2482332e3308a193cdb752bf7b650ec640fcddd67cc6d127a78cd1cc40806dc51654d2a3fb9286fd22607987a9652662f3556cc8c8c6418da8ca46a1ba550708c056f3576839d4262a1b362d266161d7e8250a254491e40c32e0c53988aee903f67493d36a7682649dd3281a0b40666a38a91a28f53e2ec4b9c6e7e2fce0913768af4c2673b1042a69f402b26200c04e4769c7bc850a72d8e2c846be9c27bf4c8763f8a315bf6a7bfa50fa828aed59410c60e830e304f93139fad88500515fcfa350795a079d5137c980cecc8671d2a020185292a387a42e0cab016b6c90cc80c2e659435722154ee491225546984b52280e3da23ef945c90397b58761c52fb8005020f9001ae13af42310b8d72cb631c0508bc8b0f8e33859bd8014e8b5636f28faa12d44c4ca13e0ffa434b049d176c31abf06a677f0e13f89c754377c2c7fd2fb59eb8d291be9a2dde451883fd06c7b2730754164f2d387dae65dd26f2bc0db3eb978d88501409f1d8db104ce4039f343e0f681c460bbd57774b4a84782e0dc1545a543e1f1abbb7df4fa07ca215181c17fc73c28c1944e1f5a38c5072b7293f7ad1258163fa0f76284dfa9a4d725d94ff3d0ccdc1cef842d4b6abf929a0f5d9e4924b4f830bf7060c1e2b679d87ab1a7f03b5c9f5e03f28de95231cdda7725da220bc5ae8110a262481d80ec65402bd92839de81924dc57da8e28734875af126bb30e23d7c91017a41cf16ce40973734cba92f5d3b2bb6adbad7cd4bf0b8ee3a3076a6af58f4331bb6190926c1d6c35cae34f176c5e13944784889b3de0573056d0a07ce0384c349cddb13c4f1055bc71389f9bf73fc23c0c38264c36cef4cfd8d9ba8dd5bc2ff7ed08762e6bc3c07e2622a74bc46cf1326a813b8a340444dd7868a60d5ca0ce9461d2605941b3a0be6657e6341f422f2eed4759507ec183550db4128af60078db358b014f3eb82ca9719404d8d9ccab3a9e1b11e6ffee48dbbaf02ef0e37060f940a8603fe4c2d6410082bea88fce542ee48fd54f862e3037568c0988df853ba9070b39c5f8bca6f52fa52b584fbf329f6ed9da615ed98c3ddbe5e5fa4d6a7fe568616f296d1c6c50a8bd047e259889ffe1584f5738897606dc8c7b31b6b06d40e808374f007ff2c0052b85a9b077f3d8d322fd2e16e2ed88862fcff60fa4139fce26f920774d2346783e661e8f4296f929af379f829ec61f2f18b0d565f5bc3bdbabe816f14f25bd364bef471ee969f1e0b96948fba831abb7a7eba0d7c9d0e68430b1a2a4c69e59b45a9729e3afcd6e6e22db42a0cdba0b60837c09f98fdd12ca9bb3aaea0e860a0ea63d567cded198a4a13626ca213c2d24cd2c9c9bf8ca8a38940162db0776de0679fe3a7896d978e331b225a5af71d49bf0372364e94bcbc985fccdfd2d7a8f568e053338252ae0a334e058c51fa2ed9278492aba0c21dadfe327cb41079d6b84571980947858c611024f6550d8a683b25bc134b360a4458337e8f297221bfdabc6304e46aeaed0c824b2cb8481f666d4da99b9f6633722f1b94bf2816d96469a77a1c0b37d3a6a49674e9ff8999cf215d2f8287fac9b738f922671f1104fe4d72b1af831153d9fd40c7b7979acbb8422299df2d3d66ae37d6af0a455e477c50d694b910c25a42004b1750980820d2a1708b6942e4776792d4960ce286620e00dd071d7de9684119c1bc54e94c0c16387aee3e9d8b6fb7e0d43d59fd9ecd34c57fae76a6a81a8f6ef2114d451b336c5d95d61625828a8001c47a78852d755ce11fdce1f1e2576dbf178d191382aea153ac688866e4f352dc3cccda6dbcd529955117fb2418c6d98419cedec635415ce8cdc5a8d7590be4e64a10661b04e812021e40858dbdab0e75b5e5b660d1198ccdbc2c71313feb80e527a13f4df68f31a8642df00a9d8212b358683239b52106658a7d45111f84196ee6cff3986513f53480505d8fa6e825f06be3f6a04198e1996ef57ce44b09305b4555a23a72bc44934be9e6dd5472f7069a60e018a0cf328c2c795d70725af0ea66f88669941cfd3dcc32f870082dca05314a16e46815d67021a40051c993108efb61220ffc12679b81bc561c4dccde80f37576d664976f38533f85c478cabf1c78837c2db25656c9d70763896a8957245aa47ccdbbb699c940e4619d3270137eee9725383f8beeb9c4d66cfa43204c2416ec01ad0c872d7151011a3586d1a71823eb2d9a2be55fe0864a9a9968304b374b8f8b840e879d4fa8793611b676e571def642039145151d10da627f81aed3436cab31881f2df4b54ff6eb99078c919c86a884d16ec09351b4b9cf5fa655f9a719ceb2d7599ae86ec7d92dd4f9cc16dcb8f01828a6fa4554c4637e4282d1b907869a7ea217637ab6311517575efd29a3234784938858aeb485142641854fec5b6c4ff052c434eee1ef20d619ac84accb58fd3ad1ee7a6542dd72fda55078a42b85673575e9f729aca8965a0ea0c0d79680727140046071bc9d6e185db356e3f0bc138106126c2583072092c699d282e39293671bbedc6a23b0d14b5de1f77a8b2c37af268afaf49d8081b096c00a3c6902c68a1e88bf0714de76d95fd2132618873749fa4524661bab66fd0d3e8c5ec6bd9f3c02a5c145070ddedeaf19f352f004bb645e629c46f30964ad64ceeb3b91e9201a98c9a49c90c29ed3cf2770c3a21ff2b4b4103e9dc7fccbf633d7281265d5187666cf03d4f3d2c0d485a5f85517080cbab200f43ecffd05890aa84200752bc576e85651751ab9360cd5bf4c78b15f3b8833edd314006235d9ad9beacd17787ed722857d15ea8da1a68fd8043359ad8a59f349a11f3daf3ea6f0b10bef95604f2edc28b04573245aad4ecf8cd38985189970fa59997ef344266024c7b83778c130ae598a69121d3d3eb14f9b30d48b177c4c87445141c904077c7e1b569c6c3542fbc6c20b7b0cb9272b464dfb9a368f48d560fee52fa50ff3858c85ed9e9c6ce99c34b1fc0accfa30ea81e5948061d9bdaf8ac0ae398e7dd8d68701e691badc7a0286251eb81bc4987a1b84db1a7352b34887de7935466559eb08f93251cad09b87e42f76022685ceda715f2ad02f67a07fa93ecbd7235ca95c416500847685c7b1e5acdcf684ad2d52b59bdbef31ed923019d5d5a2b6762cbfd2a929768dcd77f5be95213198e778ac2b797b1c46f064f7d675d57bc4d4fdcb9f1de4dc5fcce321b5a7c220069dd4bd798f42278fbf2f653015263bb689e5b926e5621ac2c503483764be3d5b38a87b576b6bffcfe2cdc46ef16c1305a2ccc84013bb733c66c965e4434e3bee5473f1dfa339f44eb72146e1cb113858e971e2ead2fc603a8bceaf19d0fd044553134f88cd55f5d7d77797d233afee60896b6c52fa488ac5ca2c8643e757f5d893f88468c2d5d645b0dc5bd58191cdd80e4fdd433da3b83f32163d0727bd08323f18263482f01292ea0b4b5f7bc7752090a5c22f20a24daca5e416dd61c32e0009cf2d0c9e0c8238440f9dcfac23f6b405aa229d72bccb2d106f234d84e9a36bbd119b4bd0f9b11ee6217a22c9977d855e147c2f7d0d20857d6a3a599d26292c1a4814ace7befbe27871ee65597025e6af88c51d9f2bfef69c451b2f41bf976f5ced329ed20b40d649fab4cabed41d2db254b4a5b4ac1a6f562befd5b7387b4821daffa3b35c53c6ff6f39f87550774f051be557bec4393bbd0f73bba4ae43b702c422b2a62642b8432e4dc56c972e68eb6f2554cba5780239a0eec73df013b13657e6e5e7bf15b725f4599bf742a2a313a9ecbdb4e96920d973c9eb58a1c2317ef013607c01e1c6be94c631e0929955f266d3cdffd9628297c012344f040e9f02fed933603d1aea737914f119ae258dc272f6b33a271df64d574e6b57e23c18c848d357a57dc9f9a44d40021f584554b1577a4db038662304cba7f7e7743f0c171670927726ea413d0ddcec9ebdd7c4403d8064ae485e28db5df7f4b0f63bded1b842170bf5d14acdc6d52e8209a2bd76f9cd64a16e713a0b657149df2771fa0ef46ae7e0885d618be86322e86a28ef0057c46dd455d6d6dccec233177a691eebcfba63ffac9aec6386b7fe553dc2b4a355cfe5586b4cfe3fb9936a9511825caaf9adf08b5a357c2cff0c81c20180fb29276049396e1a94c34db3667cc12d4cc36043bb47d9af15534d35035e96487dbc6224b18199f3d7291e830199ea75672d92e50bcfeccf3507ea28b8c1c091786821607d88a4f0c8a25a04fe9a17fd38e493f669ffed899cde0bf4c2b9a62b87e657612f0641e7a4d3e64bb2d19605885d918d5b2123660af27b3f42bcf54648b3522365285d8496a74ed245317025f67ddc7025d922fe835896acc177013f4455d42393126a917b77f4ca14d7532d02e6ee6df91f47f2267659fcd39ef22b8d17ec423fa223cb0af74f90b477538c42d6546a16ec40e68eecc2cd5378a7f7eacacbf2b1bc8cb8d1ac3584d3f5ebfe9bddf697e6bcf2875dc26aed932d230141bd195b4c1ff7fd96173ec9d888deaf6d0d4aaa4e3d67f5895ddd286d0dc827d7bd8062e975547a491cb81480754463b556a4c822e17f89493e1b1b98f0b4bd697715073fa66ec761f87dcd917c8151daa1058d4636cbac004221232f38811a361d977109c23b83e8a093153f9aa57d45ac96f58ea1ecf1a8195c7a0ac041ce69f054cb94b9fd44613a5ad6ec8bbc03e5efc1db44bd919342ef2544f5057eeb4e12f49388d8122f3851da158248f9426a6096e75000ac821d093fca397abdd3fbdf94265504b0627cd2dc1b699889811b7610f1c6793c46ab7a0976a83df870de5c299d032b021e3ca574aa3de35c54fad70e21c8874afd941316b6dd640e2f6d2966abf3814c711b4f7fd06b443432089d4e7fe5e410fa86e7bc852540fdc03ec27e08a2beaabbdd4ba0c0afa8b85e51243fbac447f949c9d2fc59e46b2cbd872f599550f68a3b8b27502713ae832654a7265a27275c274c50a72754872656474eb00e4fa00e265c474da84e4db44ec644c13aa9df88bf512b1c10f417e36c1bed83467cde483e6a9c0f1be9f346f1a1d13e6a948f1ad5878df78935f6fb74237d7cf9f503b9a387813cd393a6019d45ac4fd20b0ce6d790b3bcfc0a7c139d8f0cd3a450903f348975b6a1eb50e78cc2e9a3788ee2e7b1af707d0ab10f038773ab6039c0a38e02c6546e4e29fb268bf0d5152e65aef90c62f7488d7293d4eb940d8ad04417f8c8c12773561eefb89f727b2cfcdb3d736bcc10d53849be115424a2d223b6522e077fa3bc08c9f2335490127a294b165d1b7070988ac8f235dd4af61c9b10ab9b2479e91387ed03d7b3980abb4bd1360402d0aef14dff7410ac694a64e00e081817ff27c4334a0f6b0c8b13af93d9ef8d581f85e5d06e7405eca5ecb58235bc0d464b3b367effb7c9712af45271e694d542b21361d7333ad4045e2a996a25c2e9525ff5eaefe57cc812a8b8b3d8a5f3c55b9ebaf85ef6d3339d9132f099bcb92fe6a6aa37b05f7d9124ec756e276dd4a40f8b0f91c77e67e750622b0d74f9eb2ba53c5b914ce02beb758eb7b007ce2465528bcb00124c81748a5049a1df1544fa346ef95e1dec14ea0a764c36225261a78c3ef12edd831905e4ed96a4289f50e92f325f05727a1320428014786154c2a11c68001a11d18a01a9a6a159f967707a9469df7c99d29b8135856b12661156206e892dbfa31b0a1acf3cf4a226581760d4dc6849c9b1f14d9c9f737cc691fbd70656bd2244d22c2941b904f346c249a62ef253aaae416dc95ee8389a02307ff122b417b9b6988bfd0739563a6a00b9470b52fa4662cb749c7c30b438844b444ead13785ceed678b861a5080ec0effab6fe638f7e441a8571ad0a379ea363f8471e0d381d5c4fc164ac38e2397c16b55730bd02d664546bb76a2e3ad34e02c2dbf4a91549a4e9df4de22ec794a9b96f207ae3be387a7098b72d50f09f980186f49a3d798152c4122d823ef2f57b504255bb24c73ae8ff408bbc38dac9f3e36280d0ad90edea8abbabd3baee0a76c106b4cd7e6581f627f530d39d56a688a8d4ca2dcca07161b4005330805b0fe2b917e14b0c390bff05585ee2b5c1cd381c8283d4a789d89b1aeb055c02f0946d8a42842a01ed2035440f1c7af52b2cfd2d9314f4e8645acc85547ac9ab09192660acaa88f55308a204372a36e3a1dcb9269a71f08ccf85c45a4d3cf1cc64aedf9a007d64d0e6b7740e3ce190789703f612d4b19252c7464b9869c725bd9da5ca04d94c739b3fd014e8cb5ce3858498046ba06f8b4e81765892098a70b2d8fb295c229bb2e94126824d38f9007ad6f3abdd87a9c82558460d64c97189ecae89bb92450d3145e650b9ec21233548a7b1ccd265ece006030eeb457067c830b4d66e9d7044540874e5a4ea556d614b981414e2eb9fe94503fc604e6288f803900c1aea62da5c99d7a21f1256e96d64d06162f46dd0f381b70efc016867db775504f5811c674f2e9ec3110f909f03ab77f2ff5f6cee8b4c972469b0540ba00cc73cd016f39de5099e6516e289838a74b9440447e66575010bc74bd49224ef56bc54d3d43aeb05e55a8407cc18d2b0e5a1e0be19b6360e0cabcf465b1b36b98ae91409526a8c9bdcf482d03fedc362761595cc3ede80493b1f04651f32d9bdf2e6da83e616e7750845c67e8d2a085f41e020d831fa550b57c144f986bda2347dd4b5045f4b95dd2b7047acb7306cdc15a4c4c85abe864aca2a916bcb314032c96394514330561394d8fab2348bf83e40cb474d6b27305c948514754feb746dfd80eb1bfe4cf1d3213b35a5dfd23f61c2c4e421a757c53695e745c489f1e2addfc1e85684c0924d6c1b61efa97b5f1157c22bbde0cc3d4ce722a2e71266f9de3f6d9ac28da934895be24393609aace5f0083d29f6ab4dc29e22a0e584b6d212c225748ab20b541e5fb1899249ec25ce6d5837668104c7214721258e60fdae901370b9c0cc2c93006bd6a9c80be1e66323805139d09f5c513a9e28007654be3f46bf5cfe8a0607b82b8c483901d966b840f72c80b50dd51b595aebc4ade45597109c7e3403ab262306d0799176629b89976e5a1b2f987c37dd2b55cddc0516ee84f8f540f429c42c59aa39e21b12ca597a5946c0f1c18a9e608a531a052b59750882dcbe67884ac09c08992d1b15835a1871929317d79d9e64ec4a0ab449901025bf73c527b0bb03d17557e64cfe8926fe297352407f117b61d6c1a7be0a9eea88991aee65185f00c8a8987f1c4186544f34a391149549ac5ab97fea2da08cf709f43c31da7624a0281eae284092fb333c06374e3f03c0e80a048e2425fac0f548d044999c6672b29772027c6963ee31b98e767c7d2defc3704aaefbf7ba5dd91501291a8902f843af97744232d732b4c2b2f8beb18773267bf0fd11788bc0e4948dea3a3084a071bc0084ca4f47f7f00bc3211208c2a4fe3808ec5b466dedc22fabb800203272da17528ae82eb5cc834f8c6119eb8f2b885e6763fe30a6794554beff31ffaab6896dcabde4fdde8a90d22a58e9e745f722626f1123a0de5cfea75bf8de66055541268f7134a711a6c15e3f7b364e4ed14c167847cbd19c48f6acdf62273630b0b004525d018a6a127bf5df9b42af8694a73131869ed43121c659acdc02caf2baec9c4e638264518eb039ea1050959773932f349b8211cb810ef0b8cbe53809dd1d688c68b4cc49dc149cbe39c2a8f5af4da8f8201892c543905ec3b5f86a76de3fac4dae9a7da073faa09317d6e56021cb939788e06fea5a2ec981ef2ee5ccbcbe1117379790d910d20959bc5115fa8d5b54529ac15037cdbc793f1b40358fe9e72bd9f71e92dbd0247df990dcf82592de2277822057dc727d048f61695118048132379342230413f1c65ecfd6608b58bbdaa83c382a0d02fd69d227f84de2c96c05cbdc4c20f9e4ea5d1537e299cf479136679aa7946050362a2073508206fba78470eec51e0ec825a61b56520716a01a2d9664e2be6beccef9703ff06c7727b107b24e45724db398ca5ac0071c2ea187fabf59656c8acda3a155488966e6cbc92d2542ab41164a63de3191c3d13924813036a8740f5f26cd435a011903f456c996dc2888906fd7ae85110a7102f9916d8e4e3db68dee6311b6c76da00c2a8b92785eeaad3f511cb16a7f515b03f977282f8add584bf15f50fef008ae9f662934c9cfd24cb280665f4b9ae92462fafacae10acbc46196e30a0927476b5f8b592499a895fef0418738df2739090ad78c00d5afe08b31c37ab56bf9e927cfd73add00a59a2abd9e6bfde24d47b8d469a2996cf3e5ae9f532166b3a28c090c07248cc32286a43aad6e17180765c8c013b50f0867d8f4b1694c61cc95de5895311c2c6635a0c8c0732f7318d374f8c0395e94d79345ec6f6353117427caed55d8066fa5137febc10b01ae6dc756b2c015f83dd0dd55870ff3940caa4e965a8865a975b024339fc3c4fe2a20ced138d359240d8a01aa32c417850ef5fc2e55080a85b4af6e86259597528479924c4ce93bb8240aa553858e9022d93b6ba014f35fd1832b82c4a53e9bec334c11098325f609f41b431b8f2fae664f49248b30124b76ff458c7ba9144f126c657f3741d61741a609c355de26df8b96bf78e11c1f55fbb5e826e12de104c8e1cb6797073f249c233df92115dd9e743024008057fabe90fd941f3463eac4de5f3c42c89ce1c4e3ca145edf322660bcaec2106bb8f1f2d99bd81c9d88f7f365d6479f6ca7f301ce5c81d83a64ee3f45b10bbc160e8683481cd04764e559dc58f2a51579482ffe85c90de5c3839a97e89a6e83b4f90d57419374138d5cafa0adb098891b00c723b2cda86e126254f7f5b5472d715444e6ef8e493783cf84d7abc31607c7c165f989b8ae719c17aac75b434e36a9e1d76e098c7c3e78990f626ecdd07f6de283dd23c34297b34e1613501345413775b5aae0608df3a9bfdb5c5f3afaa184ca3643f8fb863f43511add1bba34fcaaa7e8f68e1ae28e3a97f02e3ce24b0ba5c4b73a331b6a37897d2a5e1f55daa2d8ab5f682b06610ac143576331255b953ba4c038f545729c0d4299e680e5e91faf836ee7bad23847567458b4a1a30ae6089235691769f488131c1cc64bc9ae096cf927611bc37c4372f3685e65caa7030b1668544656b5f30aa7be997da135f43a004f75f0e8b4add92344d6b1e6001ad1c81c541549f9745c6402c1afb6fa94b54eee19383ffbb8d8402425071719437a421fa51e66b4a3b125b0e503268680958510e42392703fd4dc53f52365904e25f93407dc590e9a99bb9edee380d97448dc722af762fa84c8da91c624bd696c11f283b1f01c6b73381e7526bcf96510ce3bb8a2aa3c60891da14fa0d43585fa8c991289e03b3690f37e06d6575a239327c33943acf7ca98ef9d348a57bee2c003c18ef5ec4c92b7796858ccbb9cd001138ef82e896b1c6047150fcb0ec7667f45b1fe4fb518caa8d68e0fbe0c07050d79642507a7687a4b60ffbd782fb118fd651f732b33bd85ca90f227053f842aecb73eb02c2ce1c509a61a8a9d7f151176826c420195224908b41cc5f8096d8f8caa8d0db53e3e50d87379f2ee424ac4277b2c8dfc55b7e1ff4cc4596ab4da22baf6521159a04cd9bc15b2622096a578f828794fcb2815fdf679936d1951f44a734db5ded95f0a44ef9b9287adc1fbe707357e4999a3e05734f526f93f2eb42f6c93ed6f38aae4cd7a9e0016757e5dde38b6fc17f15b795b538c6095e48088f0486323028856b27549ef61635cb7f499bfa22601dba90834c14c17cc0310483d7353ac77a9e3d73d55ac49251e300dcd30ffe5a1a4294abe024903a4ed71c8179631356cfd646a8b208b07aa068bfc4174f6be6d197b3e0fb88e24d5a872f7d6beb3c563d2131dd863f56fe23a95d4a5d0834eb777615912f85569286568476fbda986a73704080e18d592b50616847a27eb6a3db0fba9fc95e367665ecb2f2a74ed3abbea644055f7a09c289b08605ff05f53193e5f7c761558dc559f8816d8fd4db87a9ad8c0641fe51ccbbd3a851922bbf7eaa4ed9060e0e3cb2326b7986fc669f75cb234e15f1c267fd88a80ebacb10958e85da8753fef58b88287244ed3b6a271f3d6aa01bea92a92be12209e59f712dbe425b3341b280085d8a0534552632c181d3eb52e13c1059690e715c50c16653040270e3e93ad24a181834916c3515613ed16950b52e8c153675d63c20b235bd1583fb81ba5e31a2a88e00b4930e12a2c4f445dff38b59048bd1698164f936df9a712406076dd9839770a58f213d5d630b56366830cf5c1620e4b099c33bd6b5cb3532c3e5b89cc869e38a975df3364b07c1bf1dc7246aa2f0cec72183dcd36ea672ba06416cd3cce43870405e869e696f793e29939afb7af92d5c525da184eb4357cbf0d10f88bff31878f98e2c77c0b1739c1c9e735412e47656f2ec66f8192ede166fa87ee718e5d268eea90752c2717ed368a1521de739ef25660cc8ed8c1bf30ec4f1e892a009a965a31c63491438bd8209a29214f3eba11d3ffc70126e75c151084457978877ab9000b172279789bd1a7b076801defb2ad8e225685571fcbcbfde93d5409cc3f5d9eef0ceaba054e6186c986474db8a5489c37b5a585543c30ec32abb4f68de9029facfc0d4c1ce8b6b80c262d7c9e9acebbe0957ced8ffe6a91b49bd37d36b0c0fee3165192468d89560250a5d784f3929cfd7cd271d6bc6c4e252f772066378e4b53f3e6483d57a6f69093283f433b4a559004945f980ec8bb0a43930abbb04d14343a5112ec4e756a4e2e749be20220a526d41a2716ac51e482d351334fa38d30cd8b8575890a3b171bfe8bcd73d6620e4d8c349600835c554ebf7a5d3a42b0f8b94cecf686d46e7d81523b1e2f5b383c26a172479388be23a65cff7edfebf76333738b9cb966d368b430fa73977f841856c1e46dda181652581caa2dbb53c2258d910e487b00851b5d3b41c3b12da081ac680880f513fa0554ae3bb9005aa05c460e935ec2c9fb45c78513e5c209597e92ed334d4f4a05d7494154e71ca68582a3739a7f3ab44dbdb8f7fb07fdfd550c150fe3cdd64a8269f272b4463b81e70ab21f660a0ad2f92a8714107784c7303428633cf61d0fa304678ac9833392d9bb3687f6f297778aa41d89dd3bbb68495871325b3de8c089438443a4a36a2da745ab4bcd06cbfa35bd99badcd5c105106eb8aabe26c3cf9c8684167634e0701b9e56aa16f0d0a4998771447a54c42710f2c31cd4bf507065a11e19c3fa22b7601a7b08c76ce1ee820961fa8ff53a1c09872ce16fec4c9fe61fb17d95d44dca498ae84315c732381374d68438fd9cbf34f4430f9e132604374916d72fd84d4ee1f45815211ca6f2f01f54c18022eccc431e33a5bc77dc032797884cc6eeb68de3948a169163c97834e3c5e96a7e2365d60c761c7a5646b2aec95d4abf4bb49a450dddb5f4d445a4f47e9a4a81a3dae6aee859ac12419a2bd2b20532d7379781160161481ba31eb89410ccefb35041cdb70b1dc83024393ac0a383fe3b3a61791c76071e2cb2acb90ef8f56fb3d4c310e6e6b713d020c28df6342e5871b24f70ec93151ba106c28166f0704ae2c110cdff20cdd159429aefd4e502f819bcd23c5254db82c474a1da4893eef0b8d4c1bd678e762e71bbc4261d06665bb234b4a5155d3c98dd19f8046566e0e0c20db8d0cbe4253bbf34e4ca22e693ff2ab53a2eeb072b50fa71a466149e38aa913d4fde7398e2af14b54b7e42c646cacd5dfd9d547e656f9ad2684f6bd992506180a02d1f1e21ffaccd506c6bc7ed93bfc30d5bda912aca9ac7538bacb7e4af07d572447aafc51702f9307b9ba408fda7300008d399aabb17ca570b72af2e3d93dd2351bdf647b14602e897d9fa98498671b84157b8572800919caf606784babd981572fa1264a3499893e7c02c746710f7c23a8ff03ca96e419b7b4349fa32d825e92faf6bab236f07b70e39aa64159a7580710289360168214acb5336f5065e2c77f3ba278fd020d82012a5bd0eeca4502a22f1ba597d3e9cf650c0c102a4b2b0a525decc55ec13238f9556deb677d040966637940fcfe01f03eb3006f9206099e1a878c66b2ad49b1428dd2532dfab357456ecc61c81dcb64c3dd0036f018cd2bf76df596040e5b33957bcd5b5864b978e657814e36cf38696cbcee8a8022482124a5c2f654f054d424f5babe0c7f519033f65f96f579af0ecad97c6ec8b1f0f227292e01a4f0722ee46290859a1e1e9fb7fcb788a6c066b89426b0d6687d67531520cdccb350272190ece7246728ff97adaecdf3accf90de88f37a698103f6623fbe38b10d2e364c01ae82b64a338752dab22921766c7279f0aad4afe90b251ba92765887485f3c8c298813d327cedd8034bc7414c4428943b367a35bca4ac54476b207d63dda87dad40f7315c27d54aa01fdeb9053c1ef956becafccfd04f6ff10a2e712f5fa840673bbef8c5e0c0a62af73f2c86d7d854572f2241f2020db7f907c6d247132076f1ec6b2e63f8b50fd1b604f78e3fc4a2e5096374f5d12b67131736e003aa858b9bb7771e9626d60cef3d86f1261b372dc0d6de7b757ebcd9cb9283d0a3c12d4f35074d831c445dce536c0ad4c41a3816574be9b6c1b7baab8e4ce81e15bf8f54b0559482f1230385b57bb4a93d11bcc3c3070eda6376e53ba9e97a7f421b6418f0b81fd7b0e145ae622df448758fcee11289980aa211d237d21933a164202abffa1e00c098105212eadbef3e7e10c993812c491d0fe8eb5dbc8d859a3eb364b3ae7116584741a4e97660e3dd87f232f9fdd14e8f0e4663f70d71ba802934f2575a9ecfa05955c0992d321f2f5ffbc482bb462af3a1721e7cd31bf71a496fa5cb3e3f7239ab81aac569f0393452f08fbdce1345187bc97735d31de4df1805134e7101abfc95261aef22b06e62243cc2cf2363f984635076975adea8bea7b11739c4389173dba34a1256049ba38730eb68891cf3229d95b3fe7c7eba44bd29be224d09f6b49e883e9d33a0685b31ec98c6ead3954cc24c49675c7e9b4e47542e99489a1d9f807fdbdf12b6a65ac25271d0d7bdbbcc9bf891135ad037dcb5638ef48a95b6a084d7180c4bedc35faea1b8b48b70ea71c416d0fec525543da0f3cba433a2abd61eefc6e71783c963403b9fd20fcf80512bbe2bce7f346cd5a78bd164aebd5f98f08af6dabb67a01749f08169257e92a8dc58ee8167d046bcea0a487b464871df07701c3f8101384cc5853c7d925900e1d8e42278149c9cb1ea7c909113dc0d00d8d94e0e48f36667f46ded9d0b5d67c3c690a412f3ed1ce0b16bdaa3e8f21080abd584d0ef69da3321d29e7102147db8b434492560291bbd2efed6123c23e2b86a76a0e39c03113a5e9e013a7330f9c1a071d492dd35334307357a413fdf478a2b86e69f81027536ae70aa9813030d805a17216f0f46a4f877bbf66f19d5f2771ecf16082e06670d9402986a0dc42ff5d395aa6d019ffa9a7a3ad669ac48615eae83ac6f2228e3b4e0a7707c57f10fba481e8d49cb4894d066da43f6c3c34689d4727edfdfb1c0aa118183092ec5950704f13173c1c0377ce209006d74edf09980654aec591b39538ba5244dd130ec491cbf791855b4a5546f8c0e917fe538460f8545cafcc9f9acb48f7caca4843391075a2d0b8ba3630cf232256af33229f839cd10d3bb1d167f04ad463d33fd88cecccf0d53d54b01da9c244c6a217013a005af5bf7c67fb0adfc193434fa2c598fcd4c709e5338cd6717ce249c332079d02f8318228f6a2d366801dccc1c33b50579bc616078b5688717a41f4e84439a99325f4f894b2557bef32c2c6d9cbe0ee9d7de50134a6efff54d8f79da847f32fe696bf1eaa57e562db87c5d09061e5562ff41c5d217609221022ed07a86c0fc6aa1003cc2f76cbd0ca69f18194eaaa0eac946402efd0859904a1b33cb4ebca437107746d9b975b5c591c7591bd85480b9702e82da18e301e3bccba5e62d61823582d2c442bf28e9b8d34c533192a548457a4ea3f7fdbcc363c37a31bcca673fee82621eb6542a82e25298376938ab35bf1dc1a6914a34c5609703d001fb1a54c01b8194217d40962934168ce333787a05b4ac962e31cbfc9506c13a50ab18c1d1a983ebad2e55203ceef66591383e90e429dc4778d5cfafae7c53aaffe1421ecbe69483f346ddfaec85e00b636537e7e3c47c2a9501147e67c201423d1d8d4cb793a2f3e9ddd367010d12178c0cd69cffd744f41f1ecc889df22323a59c3ca2f811977ddd01d5e1d2cc797685a497b66d2c40479d97f5dd8748e71ae908cf846c0004a57a523e0004798c0ede58cf931ec49a2855eaf6196903d4eb71008eafe353bc01a458c9eb59302891ef24246f88c87b110ed9c467815908b08f4c7d1e06100ad6b0688be11fe4679742992070284bc1eaf64d7739113194d3a94ea9d0434de9604f127ed4ff8263177554e8ba709053d58240063f129a2cc8847d23e27299c3977b30a1917639fe0ace6bddd55550ac3b46b86f8143c8e574f90a04bd5f4e1f4809476a8695d6728f8a2785a5ddf8434beee06292cc0d41376eb07bb7ce4b7fecb6d97cbdd037d987f2007404958b2e68335383002dab12ae66665f23bbec258f773a890ac024ebe7cce0378ff98fc65932fe920b048b64cde238e8cf2edc933ef83099b875dadf5dafb57662b34684e3ec24c00741402bb9800f96db88e3defa852dd4769b809c01933119f5850ce3bf2fd5392dfc3edc06e8418ed24975284f818bd370618d27eb25d2d5651ee14e4b641aadbea1466c7cc897cd8ab5b040921d47c81ddcdd40eab60b627d98fb901a4330f08f1ee48f4fd00dfed0ec6701a62630ba9f76e1fc70c819ef87f0d37e449d1ecafba0032e8edc3a7fd074819f1d2035eafcb04ff5fc1626370d304129ae43ad8c28e28f5290388eb202a99d4513019a8c0a5d98ec4722f16fa11597e8c92d42409c0e307307ed34c372092663226a7d713cc0769cdfe99c8d68fd04dd238537e552729f9eca6dbe51dc7cafd7991a32406a0ab83eb148c0f6af968e0ff5d0c309ee914b7209eb7cd097d6e58770c1090b36cea5aa82887b510382d4ef90dc07af43772bd554d6530581e5a61a39c373d23dfec09908586bb17d7a9bf927a881fb7683910025238a510bc1aadbe65a4c7d3d4e536e65fd4471807d92693f1d2ac4df5098a0a676c9122b693449c4b857f11a731ecc0955a3039c9c99adfcbeb5de80c1c32e1db47f3849abae95b0e9a0e828d22347313a5a05802b80c4aca044a23283783f474de30497df2aa6eb0a8b47583ea51503a7aa850b29ce480298574328faf61d9b73c8e941c83290b34119cd049945d20a894cede4f30847d0a7e398f4f5c2dfcc421b4f8703be05ee5d907cbc5b6bb643bbdf2df5211a237216daa53d5df69b9db0a66b44d52a2e9b77fb2da11f73895145b9882cc4d8e1ec296cc8c190064e5a845a7f04b124d5e239aea221a827e623a0647d684b63e4903d6a301124035c637ad667963b6970a34fdb9aa9171adf398f7bce92044388d9b4d45bf7a848f58f4a62be5a1d628f3f65db1bbc612ba109f116ab21d212ae76e34d8a939355d62fb512cca78e0e8896df1b912fa80f95681318baac1b83a29fc12b8e6a53abcbff92c52b86d06752aa16b925090744d649c007255af9de3757195f13cae08f40247f26bef558164a89b049d7362538c417e27521e51a8638d9e25a1d11e20efe33b82f0f41aefa25f8b4b1373589e578e2fc90eeda38e32ad918e09838fb683ca2dee0d46d91d66f5c4f1eb0e746b5ab2d85d4882871ff59ff8f2c48ad55a8262cae81305977b2a5b1dd92d4ce5d6e4d11ba94ab3940fe88768e6f0a7818e6abec6781033933daede204d1c0ce0967a2523093f7df8c90c620c82ef489f4d4c0c5c4f83454296b3b2ea0d63cf7c1760cdf898d690bd52c058d6d580e30ac32833bbe934e570d969af8a0adaa898f8a91d4f77d05dcdf8b4999e77b888ff51bace4da53d360d9e3724d48d9d4da29a52fcf15de7bc23083fe4d987d8ebda29ba744d44248c7bb27d66cf52247059bffd8ba5a1770a90ea3be94d3bfd94876be2145152d565d3c245aacbb7fd51a3216297b2ba65b67e58a3b8c247532ea5801108dffba0fc18983986ce024919394798af2ee7d9c4386d76d1fd6ecbe58db5914fc1ec484337f61ba8ca697151974627d5b9779052f47321b49b40f78dc73198cc8f520f8b2b98d3efd5d90fc2c4160048186668d8ff0f771815c15aa41c5864310b536e50713920f56d100fc5b01f38e2663388ac9c319f7849cd521c66ac75aa5e309e15fdd9660cf5c048a9987cc9900b8aa46c7638b3b477ea41c781ab40d1513abf77565426e5eb90c24b94a118843cc6ed46b77820f5f4c95895b8ee4ee78719dbac40df8ebaa95099ae218c95e8964aa4301e09c54498dfe550c3128cadb095abdcf755c51457087994e240f60e4d89e4c9b9fd0c831241269d44fa198e25f7ffbdae886694b98b4dbcdba1115ff53c898ac91eb82bfb7d8be8bf81aef762a00375c77e8f4a0d59314e2b9ca2d28220d782fb846545b65eeb866e5b381ce11041e8d33cb12e7d75a2a2e61903a73311d899a4245dbaacfcda5985bb081be3591445171d34d166a2334b6ce17046570d7bfd86bcbe5bae561cf5a16b1befa109456d6b58c015751eb93ed0fd3fca93df195bc9fb69a5489faa4d841a9d9fa9b47cfb8a83bfc279df90733377e5d8b71214b340ecf7e44ad8647eae1bb5ad3690dc14eaa4244c587f2e6872c19e98f35532a1ead034a9538558e98a267ed4e846fd143588287a0a6f09d6297d9c48a3ea19031c8e0afa41b3d503f00a4d8a14f756c85c8a342cf04f5945a42a8034927306e2f0bb2402afa17fdd9ff873021a532317c74a12742eeedcde98068c9dff1d74dc93c81efdc141794d1e2d2097bd3da9c07be8e5ed5667ba72fd318ecce7ce29f8acce02a28652ef113f4366ad3fe2e3f8a533feeb41c277b78a918b55ac9d10beced8aaef995a2007590b64e898e14a4b2e22e814499cc94ec64e2d60a3018959c743db0f480459776364431eeb29d33088437f4a58b03e0422965d09b6f3960cc1b0fc14049c5c6aa456dc735b81dde12f560dc6b10e7b101bd3d6c0709764db8641e8f231841a44955a3d9fe1d6ee769c2718ada22ac9e4dca6bf7cf5c372a899e6e94bd24e8d77b9bba6d919ad5c40773f9c29a8d5c06f13db96579cbcb875c1849b648e95afe70b10589284a18d7a45e1e0c831dcef96148e11014bcf9cf2eab58748f43322c34231e322da3fb779dcb985b1b5c037868b678b52ae14e97f55444f1153d5494c33f98373d28b0b76c5212bf08d86188b60b198b855f1c131f0afd29d4a56c070365d6615f247fb538e02c9501b6cae5d242726dd70a2ac0936ae2cfbe3a4e1d513cd9a3413d34fac8231e7008cd3906c5c005bcb8e302084325199a8160928e0fbbe707e50a816ae7870ad26349a7261a2b7c83b9b794676a414a791e83aa3bd11c50a55a2a922db0f7d1ced6a2dc73d03078c908dce150002fcb523c842eba931dfe81522660752ca9954ec869355e25899c29b88e8fe9af346b045ab4c8722af5d967c9deb274d303f0a58043ccbd01ef6df51780025138530989aa776da31e9e3656e0eaa509f758cb0b95405bb9f6bd38b8a6c204f77e85b6acb3d7dd7f3cbe657269f628159a87c040ab84d5f73bbaced9c6c760b25e1b4ac127fa45eff4398c0d3beb2a458602675a9f1e85ca2f80bc9717ff5b0e31a2a5d72bddba01cf76118bc201ab2399949684245a78bd5d034a2f32a8dffe15182ce14d5289605b78134c1e14318a3860a9b2925a2ae2182ef76d7f8edd52620238699e655362997ee3e0c25605a8c66e56d0063ec71b4c95c058f748fc067bbe2d51de738a9a44c3ae29636eaf6d544873ead3233fad47c56e003bcc5ac165c0a596c7c9cd5bfef070e380c83caa3c302396b6e492a56cf32d574bed681abd9541482529cba8d3b18c6728d70a7ce85d988b5237a58406ad11e59b3849a99bbaf2c8ca8e76a6d07ada48e10e28f54da62a494be2b0a735e46f0e746810c736758c29e7c541e5f6e25ad81942798bb4e86b4337eba807c2b350338074577540d00db51084eff2b2191594d5f07283d7ceb9d44f28c5dbdf9ad62fd8719209ee5f92d73edd626cbf41329c494b6cd9186b11821fd578a210ac73d1baeeff1385bc168654ddb44686a7e9269d79fe7e893576044228262874aeb2f41b3dda05969414afdff55124c8c928fc7ca8efd9df5d743c398a3fd809223637c32e44e64c6720a520f757045160000e1d2f7110953f046ce3d8b07951e1371a0201990ade73b127def5a3d28989ab6099f99f878e77a1270ab0e1eb4d31e3814d8cbbf27faee817c382d84ad9bd15a047ea007757dfa149e6a3bf3a0815610c6d1c6dbe55eaff878139fb61ee62669bc3b16499d0e03c81c9489534e8f1ec66ac4e87de06254806bcd8c4f3a9fad53431bacbf810f48307f3c03bb170f4401997bbc784454951d0791c1b031a84ccd02c402ec58a403f41f8081917dc7dcd2011f5c741781db8621f08a4e6938c54721e86cef219960610cd140a711c63889e27d11eac0096ff2856e4cc60e90d6abc7c7d8fb6f346919c00935a1c965708bb5a268853f2ae3d736ace597da1739ad7dcbecdc6cdaad84f7b21d38742092ee98c2b98e10a92f909ac3671a428b9a4ef035119414c6f33760e38b7f29bc40d89f0da6804de14c952c81e1854cb8236de76a358e00850ffa8007276f20c3e4a9ab9a3b52956a3046f6307733600807ad049b120561a27b1ad046158252b313a5e3e96415ca9f7b7074295bd9b5ecc6984ceedc2e33cedb721a3231e0fcd5cc2ce4c16601e4bab640f524db96ef7f59fd7422dcaa62a837a87ae55044309696f2104290389635914df028b162a54e011513a0c7699869bf8fba4bb8aa984afbf10e11d9771e0183a7113a68d5696b15c4a1daf776423cc81155ac726e7438cc09c76b4f4acab14cc4ead34b4e00f834a61c025b2a3491d4ada851e9eef188d6491b8510137fab8c0ae80af76c916a77d97751d153cc77f2dfb4350f005536b4cbf80e3cb957faf62c5347ca64dd56e550fa443f2eb09ad1b7509cf454e4775abd09b27729bfee68dfd22f747be4180204f7874bb86aa653956654025c42aa765d2630141f93bec5358e02ce36a392234f4ceacffb711fe643c8b102d9912d5363281fbd5b6d9f954b372e6b4b823abdff39c14cd3c548b2da5bfde879c5527df6965bde574a8433ab253c6b247ee26eb878f8ce7104b23d1cc4c3a9c048b78791f4cc1794f78017c7fb0ec6f32e7eb773297717637ddc5527bd890973326702b91db6d470f28d2f4c15a2e52738b8b8fd5d07bd7ad632b1d57495b53ea3a3e0987c0013a214edd1b6caf89340a24faaa77a0ae2e14fe26b87cb108c1fbc029e6ef05ba5f225d5a0e81cb2bd263ab413df501b545c752b2ac1277706566176d4e2da8464225c792fe5d0fd9bd7ca76e21541d904b6a6d68d1aefe6aecf30be9d4a1ac19a844e58a045d0b0d72f89e63f446a9e5285ccaba0369f21980224a388323a773e6f8e354559a310d018fb083e3344e688c669ca66d0a2f73773bd9851c31b89a9fdd6b58f26d3d4d69ec0c1b3eb85c3bf5072f4f43d4f24841538efa8495b074852f8d0d08d04ead506544c26ea8eb3f11b458764e94e4cd3413dd01fad15ef124d09ff2c05112c6d241b23dbade6ac78270297e4233da364ccdcd935bd741d5c0c4f33d353ecdf5f27fa139943b66cef983f3b0eb52524d48f36068598df849f621979e142ae6ce5db7bc625f8d50c76c5210bbc8c9a760be299d5bc415dbdaa18d8a999752abba3a7c03e2e9ae5c18a2c07b0ec6a87cc453528b0d3db43d284c1c34ac7ae09892f1eff0760bfa7a9aeeda646bd513200c3e838edb03d9d1f5ada3bef55445d08330a1328a74146c65c7aaef016a487de0b0411a6ab10fad11ee190924c377cf814bf7df15fdb28187b124e496551b0318c461d4c066b17caa4898057e4b101f6a2535c131e93f2656844af4f74b11d6194b81728b12cf7257e266ec0788eab326e423314336a8290c37eb2387243c74a2624b029dac32105e92df6933c20d49d223c48806d139f0bd4bf3ee32bdeb9b56194bbf56521c2b1f9f541f2a3184febd59b8df98b82f5d41fa5fc46638993c9a252581016133f44f012494825cf94b5c4a25b15bf93d241df0e15ce74b5b23832294991bd47d82dfb33fba89b1536899b1d548622575234d99d7e40bd4511a48d33ce605a0288f78aa24bfb8add76a6900feed2556bc1dd53fe809f4de69406dd6a53383cb30830e6c4364bb2b544e83d506b200c0f0e4e72bd8cacc455714f72a1b1780c742fc7208d1fc461679df74d4338f4a72e53c91ed2f39a6b99224dd80adf59b57cad47fe3b782757d81aa75eb2a259f7bc3409c97e88baadfb2c5516f2055a254b7458379ec1bf3d99cbe2487c1eabcb02591f221a117a21f27faf46c41f54a58fd2b75b6c8512492cad1407a28fbdbedad2dd1f272480fa1a8a137a609b17a9840a8ef7e0262109e738c3878d25ca3ae0f3bb12384f383ea126d1d38b0eeaa30549cb98ba4e934a38425d1494c0ee07a3c532935f6ca206d39e31e628bd85024312f41d3f2e43a54bebd7c12a79b4a25cbd3f1208f45ec814151a140452214157db8f2203281c667606c9bc04cd808536d0af631c6bba8dcc8fba90d03445351425399b782cf1bcc9a0d1a681cc7460f2e2ebed7ff427b53f50f0d7792ac81084c747eb09bb11418a0d7826d09820d92a88506162e8d3ca361ff2bb5e690f29e38b686a7cdcb8ca096e18d79433308005379affc42d2c0000c7f7a294479ec01bbd6504d9f1b138989bed35b7f2c5a0a9ea4a38ed6e6fff4330dbe0dabe0e9c54fd00f12f4972929aef3804af6f01ed9b2e23dd74d5848411a5e510f383f0c50cfd2f1f3f34ecc478c85ee7024405d5c3b2112382541a78e83c7d28d11ecf1f3041ee89474982ee353bd5e083bbd39a6b1dd2a49c3014ba8e13a1556f67af1d4ea80e93d79f45b2d56435af340d9891559cd9a1e004064e2819f422ad00f22286f731753bae2e2516bb95a3d3e4dbae7270d9ffb24038dadf655f359a504641706d6a4ce2911e3cf875601b10f4c9bd3c0afd63385e9b8ded67155a81dd4bc12915f8f1a89f5653d1ae5e582320d37d2d1152795225c002609e7f4ce3bdc1ae828a211348e2f2d31bf56d6a83dc575758a4691ce3b93a019c4fdf6482cec52997b840ffcc2ce9cb8f09ef390f414c31e8df0354e4835f7909c4ff0937e721ca3603655a0740da005fe50d0e3cf8ea19a6b908394f335bb32e4ce488b7cbf6bfed5b72b716d6142212d5b84335def5fc6c67441e019b66efc971012e759d63e191712b015f74b17fd74f73df20080f085114e40a299102f443c4a9f7b80b5b04bb6d10fdce8ae4f43d125e9068962bbfc7f9e86707a1435d708052d7d194481b16981a0b0e6e046ee5ef86df8da8377314e10c7a43fa89ba59ef28138d62198a456e6ad043fb1ed1a6948f5930f9e2d15f6117a8bd30797bc4625a32ebef4cf7ad0e6fb96cdd6a4a68e0705f9ae9425a78c34001d3606757387d198d5c9b9dd8a350ca6a13b79419a9206415cf193ed878f093bcbbce6a3cf4543c2bdc26d6671c0c8c561e24acca0d62a619ab8a3f6714cd5a5de3907631311795fae3a41bd1dd00e00b1a04cff09a0e1d52143a93c39750e3ee1b939115c7f2bad35e693b374d474311fb216f76e798574ddcecc44abf3636370d09aeb289745d09459acdf8e7e7e804ee2e0162edf50f54d9dcc06ca3788d108c742cfe24b15d84a054a26a0ed7c9f18150af2b19e456ec322b45ddf5d1680f1b26c83c43985626e87cf71a9ee4eb7854715b645806d2101481f7b802c0de1ff3c4eb23c6862635634928c2c88e79f8b8f702e9a0d75250db47e673d11bbe0f6f11d8f41c269f9d4a3e5e009237270c8110e193bf4598f80b3e903b2be9c7abfa1c23cb9283a65126bfd43871730542204b8de637757d1119e728961f8af36b766e497e69b0f400f49e58afc8a8ea82408cacd0ca7c20a64beb8fe5cfa5159c93408e5625d62a2a17c5314aad9046dc28109f8b3f6eccd0b4c4fd7387fae29d9504686ee0067ac89abacef16d135e42931503bc62121d3edd0ec70016708d3cd00171071f24fe757121abb1f3303d153283ff40400a727f6e513182b0a53f5ee6aa70b36c5409c15af572484aec88cba97a4ddcaf8ed73acc07250a6b32bebef0741ac4cc17c23fbdcddd600716e9ef4828fc5ffab48f99b86149d8d3ef20ef979a377ed5c4279f238583419e27e23b1d135efd5a6718a3cc80da0d72b799322bf08b2d6861a832c6c7a7e64057834b2864c47dac012c8377c9dd84575233a1199ae4d808e06d4deadc5c3b63af517fbbacb5027e3abec698f343586525a7b78f7d706fa97853a029e920f5d4b9a3982aa251e9f1ce85bc9a0f523790c954ccfdf6f6575b7ec3096b959b734423a18b50e5301b75d02d00581f07170be7accebb8011db0de7c150421cce33d321e19f8362b30b5caa0cd1e96eeaaa8b810ebce1eafce8a05d293f25ca819a7006e590a18f18be0240cd5a2e0864de2c240af1828c3cd4660734b6f77e948b49695b8210577175b00c795fea9035a881712dcf893a49a3327ff80907087cfe28ae52da1a32f74c27b76447cb8c252ddee30013dc51685462994d10df0a78d981604ea8931b3dbbfba5ac7bdccd11989966951b9851bc7f945295c3bffe895503a23c656ab7055772fee99520f289404e85fdf5d0fbc44b38ea564315aac69c29eef10b68643c9a898880a1e06b3de2084cf75ec608902f8e8e5f372ac5d70acdc3c080678ebe8f2bb57bb5a8c0dc89537f5c640f485c0481cbe7cd50eb70ee84b92debb850255b38a960a882a40dd705e2ed73c271bd3a9e6dad38f027103277370f26d1a830433a7ea18183181466ebb7c02559d6a9cd5795e9f8f3af29f6bafad11c00e96dd59bde573ef056fd9f2ec3e1fb1e55cc3bb09293641e8dda3faf28eda68178bf79bb7197c66933dd157da3e177c657650299111ebe3e1d589d581e9bdd958b6215aae608d7f4a5230930953d938a9e1390e4c36d25bafe553631cf6213e8372a7c9325ec1f625d5123734f24412cd8a3a81b08dd0e3e8c9918a788daa36567058f8633d2e036b5ada9f85462b82d72115f02989abfd778acd90269019650f5f43a9dcf68905635c0dc5406de1f412b2a7b68111f52d873fd690148b534e3ad91e7864c4254590572c566de132a633cfc3099b4253969564c34643931fbe946a528e33cb3558000119f8c9ff9466617e9b3478f7e1f180634de89f047f587cd480432505838cddc2381d43cad2cc1d794252aafe1ac1e45d0e87abb81989c3cd30308fd11ecab6b294218aa8ae32f23c22df43f1c107ec562057e6cc9cba9868887f126047613912adadea09b76d7142bb480e22162493a7e76bbcfdddc9649342613c559676e21b02ac1151017104864b6e63861f6e0138c22c2e529a678ff74b24784560b736b9f7e5491e60ed42f6984f825a9806ec7aa1088027ae55c54f27cec722fdec57f669673b09969f9776661373251a21b07a7420c331890f2b8cbf4b49eccef1afaf533fb014d5703cff7c3838b03df15d037f93d162027c9a7eb30681168fab5c98659f4e619bcaf50f1f3b342a2932d538eb54e4ff129f40164cf4e6cdab4c682e0f43a16db298ee74d1d6bb639ea366e55eb8ffc559968476279eb9bc974ca388320c31d88b3a3d9e0a6aa694c7e91d9b22c60ed2ee6b74f403ad73e27c0266b9d2686a4c02ea7de6a6b92585761cf071b9e8aaa77aa39563ca15ad24dbbeedb79668a6268f8517ac4d70b19f939d322cf6e662222817217b11bef96b96e0b500592b0456da18da282c9ade50aac134105fdf720c62afc10606c1720d4c5677e19324b079448da3a819dbaaf1ccd8914faa1aabc33dcb789f8add8ffca19cb985a62ab5fb26ca31e664f4065ca0e16188447321d0510416dabc777b75488f979f38d3e3a1bf1b94aff08fdf5ad2f8895e33829a02e0f1d3dc1f38c3d2c54f8936593289168888c62717da49eef0c0b2e316431fa5761b32602081e99c4ca92bd244ba404947d6b36eac49004b1e96f9aab64c2a18bb505462a04d56b356cf17aecec5e840185c9c265ba33244c27f107eb5b39d71deea98736cf8b8e862239ac07e9b0ad52fae1190af7621126b7153d7c7969aaf1ca8db0a08b58281af4fe2e5dda836e74d986cc040cd879fdf031a484aaa21b5a4426ccc1e2d5bb2869468f2cea1f6fae5c2de37955ba3b93a8401e3822c708f5f0f6092340fafdda6820ef8c8cbeba05d12bfde54868b6e97fd6bad73d0443957285bed36ce0949ed301c620cdcf2375010cb6543579c97cea73a8a62deff8dbe1c2fcb19fd67a1af8fe87ca6a89b5f26ee612925f66fac2fc2bc4ab6e767616f0eb40d639ad034940929ff0f0e12d47cb4f10169f9da92322ac7abf85f02ff41f49b9719377613ef4fee0faeca0ebdf8f3189cbf672b8eb56bac98a000bc8dac7f28951fb5cedfc13c85126d4bce49c40a2874f0ad203d53595a170c26e4b3a157c89afa896ea56bfdee8898c8dad7a4f507f4ecb17b5f3b6067cd93edc69a332eed3be83e8ae23947f34f7753550bf2233e9d5395f013da7d1eb8078288f86a717b095dee5cf4facf380c312ade650b6d33287cb7fda821bb592e335908d98cd7fe193824bd38df3456339adfb20fb0cf40a00a952bd4396769aa0816b2203b85a7d84e78d2f86a630653667a1ec0b6111714510e1aa035cfddf07270f650cdb7e0b2a88bf541d60c8f2bc5c949e6c306e8a658ed900f412e4893432945ac56a631c28517c5caf353c61e0e49477205407a5d6a24a9cffec4a2659dc2d08897bf17a2d2c07d716726a0703c1ca7ecef30e83dd8ee4f5638a6240c12778a0c79cd3fac560a098e2575f85acab17f4c22bea20605d29a75898108053102e99e20fb2269f07f03f50b9b437f40db465c2809bde731d08119f7eeae05405ee0b2c762d7c91968be118cbda1fd270a153a1dc43bce4b311f04afcf59450bba132ccb9624acac6ca532abc91ee152fae2f3bfdffe91dc3de8ecd21955632a92880a288a5e81f818e0194fc28b5230ec824483cbe87bb7a57322696e1363cfb726e4ac1c7ac2ae101865982bf3b12f2329d330fb759e229b6763586d6a914f5ac2c538d3f3f99f5610c85c6390b8eeccdebb1f40ca4bcdc7b1e70d234f1b1726a63a7a310e6d75ac3175926fb81188e36115929a60f7e11776487723312de6332c86843eb926bb4789a3e050841c469de0db67a5ef1d820fd1b53e4c4ced48592631a924a458bb8229e1652c29df9df4d4197a23c3b0956ff205c87a7989c96c08e1e82b487eff48cf1d19f1bc9bd731a30e91e35f7145a91b302dc6b277aff48a4c1bf49c9ae1d8a4b52be7a84a710034f53adc1bbd5e9fa1e9acc818bd90806fee41064e96acaf3dabfe6ed48c31f7afd42ffa1998db24214e5fce753ae6bfbcfcaeb8cf741d0c08639a9a1ddbd823804e307e686b441a258896696720e66e2b6e3adcc8037244ff79ddd8d66dc45ec72ec5250f4a46208a587ff81df4107a341eade2948efed592d635a6ab4086e52aa6b11e1507baa8e74395b4178a234a7787309ad386f064d36a5ac65b27dadc71e69ca7caf7e9bd4c65527853e9e9ce350aee291a4bed75a7c19b19d6e9b54dfbf3a118f76374dc4451f34976c3e41441c6c5fe83b3209aa79b510867878be1da9a11ba87047e95b682747a9a224ae0053f65d2bc447b7700dbfdd666d8f47408a733b0b0d429925e39d699d5d502c444aadecad08659039a04f267b6a32bddaa84975386056fea8e05941596f14126d4b070514f30f4c3856ad82b54305054c16da81ee67f380aff2e4b3a536bc93b7a7d6f7c3e041e591e3a3c38929c1e6d347c9146ac24049da7e8e14a4927698783745f00568f32f9f9e0d2b40e66ae426548e2edabf1ad1cec0443b042ab87a73dbf7109a35f928dbf6dc4896804e01487ce442dae88a8a5a82d74da49644ba822e5e5926e42e8d08ef491621d319d2aec5f3108af8e2845d7957627cd6814a6662a3f655238c6f84cf45c39f14e64dd7f2914ba6e7762bf27a37faea88e44cb91cf13568e5be88c812545ac2272dd9522c3bd1a88f2c7ba35422f63d0c8dfa5e1323d02407733c17a0d7d42ec4dfed80d4d614b94a4a0411a39c315c15db7bb401549071a1a292b5ee6857bf0e44adf548f02db2bda095bb216eebdccf6834a9c67d6b5f396d3050435801c56d15b10621b7cfbb0165a5576b5e127d9dfa98abb99d695da0aecceb30d18f1a2a7b96b393b1dda3b0ebe73c082ada712c92062c33e57beade98c76e342b1ee48d14f55bb96b01545dc5dd640193ed6491f511d94beac3adf39b2dc71a3f0367658e5ba51938ba6056cc327009211a7b237fcff4dcddd958b0488e43985d2152da5097251847c0d0c3ceb16f213555a4e9e52c5c2a5f8f7aab22f10bdd4498ecececfd475c889a151d3774c793af28d118d1df475d582b3f3c48c3bd9e2602d579f4189c4d9cfbde25a642331b6cccb0103bf7b1bc0cad432cfbde653eb8b12f30967434bf81783cb04d290852afa0ca9f4898346bc50e962e198d76f4b03bc7dea85551626a4783b40a6bf28b3ba6a300380de5ef351af3acf1b02001e337811c2b789a0aae6504e4f0eedcaeb313ab722360ba281a140b8ca35ffc7dd7cca01b5ba140942456db4c99ae2c1a81e82295cd7dae75129849a6b69f483a0382f094dcf98d9af921983d97054b78b48ca4fb4478315334d7230482e2f22d667da8bc145fdda2ffb3fb6439cefe2a04ee2b3c86d57cb11665709b1b313bc097e86712672bace5f7e19ef2958600f954070bd4d3230242f06d397ce8075b267600ebc181b850019b0bd78152a6b11de4d2b461dd7fac296be19e8115b87374b5ae1ef0bf9595aa54088a9e0e773182b3e8fbef33d8811901ecd0744ac4609ad123f303f84b583524159624d8b1d141b21d168b2885aec512224aea4a5507fda2a138643e428e5694d88070cb5424714844d4f42c9ccf23c1e3b33ccab7b7d0e22bd0cea3e422a84aad2b06419c331b59c9a3cf015fa1e75643a5b60d51426853a51788301f54398c5b0525c7b6d5303497704b594ec558501e9efb8c6fc0f917b5106faf4c9612546904490d6832a9b62bf4c022ad3a176a1cd0b11165e9b179a0f84ab0f968b98c2b0a2b5dd65b0ca24d6f470fdcfb6d020d141c650a566be902d4ac81b15026f19d95f11a14fc5817e786bab09b6bbb1622e357f94ada0d9fe575c1abe9f921740d764ee715ec996ba33ff211e7c500d2c2aaec31b6c3bb71cf52b7438260ead0811936c1b855f80a42c90b7b5dd455d7705f754093ca08b643685c9eae565925ed516e618b32cce0b4a8d462d0e60d0a5d9b977b71202196333ca41ea22adf2ae594a0a84fe2aedcae26ab99b40b3eaacd4a1a717826fe4662d2a0045ee14b568296ec3b0c6dddbc6bef659ad3ad64db3b9a69086a4bab8a83a567d4c955d9ac0b78673441a89d4e296f3b4d11ff8125d9b9ebe72b9ac4487217bd0a8f9a9d0cc992f37df8ad261b9615b1ed1974a8f51e47abece1673211439ed6acfb4b6addf9216a3a38f605e22237a3171f439d47a1b04d5db080832c166d2d521fdf940e227a6b4f92e7f6f65e05ed26e8de7a27a5ac185867c722dfc69fc722e3c3eb5bc8ca1efbbe54b4ca6feb7786797f5bdbae6549429e89803c6fdd9012e9f8cf9ef588d81af82bbe89807b24277547b26fe6d62b4d77889c7314cc361cb217d4b6c0587bdcaaff5bb2887f726092eba30460e0cd192968296930d7d05fb24bfcaa25b74ff71713c8995386006f04409770f66c73d2d52e3eda71b2db3f56797f1268eb665809d0cea11db8ebb4d3a70016d77fa04156e333d0a599116b88d3eb2cdb31ee0a355942a13ae7532da168f548744bf82e26a5a6346fa09893d10c9e21f191faaf9b8b9717fc75a01a07ac13a42c8900e3c6d9520bd2dddc98a94708d27094bbaf4f12528f8fd6e1f5674c55f7e2a23363983faa892aa6a90e8abb322a16428d06ec5eef865283eb50e1cc7cf44b791ebecf8def7691422c7814d52ffc4ae249c4546157d90b03db6e05f093a3eb807033449d35f94a6d16b4202a0395a10bc72bd02ceaaae858f322a7238eda83dd31eb3e0ddeecf106383096d385dbd73e31a8f931a2b6db13110c1c99c1f6d91c6982b5195235b1a6d50f260e4aab70a0ddfb2f820370220ce7fc6509c8f4644ed289ed2c902502bce9e2cbb1b764e0ca62f5b7e0b216e1bc64e245727d6a1b362ff4d7d312f42311733c03adbd7905b34269a01190e32180e00e215e9089402679fd7044f0bb3b6985a41e4e9910d038865d4d2f7719921b18c742ab133dbda419201e8d7d2eb68d663e55785787ea0b51a6d7b23f6373c8389e6bc92acedb6854d30ecbbba0532f242529203ce5194fe4d444ffc88af8c9454019fed19f225757d34afbd245254a8e0f8f90ce8423c4e771919422dff30630249bc7e07a046c307082ac5282339d9a3af49622c13a23e5f9776e43ea1106baa9e0e3e6158878be9e8ba146098af587757b2d6555892adb667e3a35773a122ada2f8c3aa068ac60c899f551cffa1306235b0d16432f75a039316fb7e911c4441c7e738f43eff95e23b76314f27f5f9416c7c2e39f80dfc9a85a136038da1d497db97a0ea585d51f3fe19c150769d7cdc7dc231afc9ebca3e3d85b14ec4d32bc708565824f020f10046ce718414270de98bc5145c27a70a9df39f161a2938f19c0220bb43ad0e3a1190acdf12ec7992f08dbe000d5a9393066cb101dc3631678e636f8b567ed8f660728a07bea9e015cf6d184a8e46656c0b110f1cf0cb8bd91db98372b3f65b695867532643f46cccf3905003916e6b9ec342ecfa077c419b4ae3a2c2acd98935c52949af28dc165cc6a6d3e7bddaaa7189f14a2abbe71ff836aa5aa239c14598ef600f2d17d6341c973362165ef16bcc4724fda50d57c70f882a1793225115b2ae14e64801910bf9588acf75130787415e0f0639300f84e99216300ebec002e776017e749e22e469c2e9fb471df79fb2a1f9a221f6872a7211de687fe308666ae626e543234728438b71e8a1b63d0a0146d670ad17c4a1aaf58b219da611524f0bec9c1aa851a93ec5630be95ef2bf2fae5d646fe8215d7845a2a2e75bd7c7112cc8a6af1700c76b367b4517efb2402f41d69734b8961c5fdd476cb58bebd1fb9fc1551880c1adb89793783d7a6fe3ba3ce0fc93049cd687572f0dba81b7611e6031012a0ca8c3d238cde4115bbc741e6d6de44a053375e8f9a1b2c428632215c1fc5f7307adbb171ff05aaf5df31d403c22b0eb1d7a34804e8b9f78f1f24ae012f879c23de9bd1422a04d721fd2e2d1229ec467c293dbb6ddea7fc20430948a70af1b799702f6f4abfa2b09cd9702abf8f781c7316c3f183a0855c8ac780482d69627b9b1cccd2b587c2e0d493c4466f306ca5ddba0db6b3e4e6b9c2ddaa3abd8be2916a20ca05bddb1e30085ffad0e2e0b745de6dc375fc654a3d6eac16e229e587e4cb60286fc610500218ec604694517e5ad482a9acc0bab3422c2ce459b40c4ee4d642eea8b497067a5336442f12e782bf5cc4f3174c191391414ca14f488596c1b94faf5312ba5fc5ab2a39517a59379b912c04b66ac4ee9921db0f0bd116950196454137e2e4e5c4a5388bc1d9b681d1381092b7cf66e20569b7a60a0b285581562b83e12cc8a98f5db2d0e9d06a8d5ec1f55bd68bd7c8657c5f6d2a1f4af1ad6a001c2468a4974506fd090b55ae1c82cc14f2f3e08f2f5418f2b8ab81c5c89bd95a1cf0d6d1556ef79b4b25ed433dd4fbb0a85c996a4ccad17f68ae145e918f72effedb82920fc2d0d7a1364f1bee126dcc636464f63e5616ed1b04d4c9538ba64a35139a7c83ae5b695887cb0a589395b4ed67fd4a790efa089d3a39aa4f20fc14b6acb5da71f1c9b63d9bf7d433839c896dae2cf9591abfc769e7ce804adb31e74d5353df20f7fa7c4f04d19abb3d8e7802278e563e86aa6af4915fa72a144a4285ef6f0a32821478a5143bc21ac97988d2a1a0a7ab2a5e33f5c8ef8499ee053fe9d2107382035b3714f3a6093c60e5678489be22d6e0f08a96a61842a561c25f3108d121eff5ca7272667e061c2f6103dee1ca6c0af23240a45fac68d63f78ee3ad0a761a2b6bc74d797802158580febb9120034ed3b983d70b8d5bf4b229fc1dd3ca21b9f2e27dce0e4598e3bdbce566c66c2d5d40e4c5c0ae61dc613dc09f77ba2f430f64253bb0bd10475f57e86a915e912745a6ea26d8710381b68671f997f96540f18c5905616cc8eb784116957d891607ea2a0a21f73b5152a2ade09c8121a9e94edf72469da5e2ae45979429e76b128cd1a6e53f49f08b861b12873446d88a8dbeaa66c709f4bd74c5dce33d48268443a5bf1778d775e20458d887d7753a225eb5093b2473dc74d4bed4ee1e46bc1aad5927d9a3a44fa134839f5c43a21a9d5d0c6a1f54acd1a170b5ca16e9d0aa54d4aefccbbc857145b403b5297b84c2ea89735bcb2af46380df09aec342521a1794510e70f4d5a3ca4fc6c5dc6b2d884b3e32bf85d432e464834d510d38afb74cbe7805e2d72a0e5658ef367ce804fd6749ab54f2792860cc59c51acd8a0b621e1e35358014c3203ba20ea6d5c408c424e07f96c364ca480375499ad660073834648641fa4afe35f38fd5a90b24ec3558fe7f8134202bacde290ff668c7e987dc1ad1b579cbbff2c086fa6a03455eb820800fc19b45b2b7243731ce67f648288ecbdb79452ca24650aa20615079306feadb8711cb7e18eb18cd5a6d4a6acf56dfdf9b65a6ba58cc5d9c9f9dac77dc7755dc76d954ec8a665e37fc5e2d9704b8bf8da6feff3fd69f48ffc8abb06fd4fd322ea87f631feb6e14fb3585a6de55194d026fb6fefdfcd772745a37fe6cf1adfb6bd7dee23aa0707372b6d5b4f6b1cfe66b66ce1e245071dbaeca094b7e7b6edbf9cbc5de7691e31729d9d37df280cdb44d6e67316999e8c38d1738278fb6dce97f127de7edbb6b9e57210c2874ffd037fa33812412eb77b19659451c60a717c358eeda7974b1ffaf4b8afde1078e30d91db7b7c7db04ddede7addf6b387ed27864d91b53d872153646d5f9320936f718b53cbf65f2b6f1f5fb107167bb68f44b1a7976840cadbc7a26814a3c42ab1a75a7baf6fbedab05054ba59b2650b172ff6392d87c647ad8fdc56e2e20ca701f75e9f83280d3c140e176fbe7addf70d86646a2774e548370165a9eeb5faf43e0fb8f2a47f6ded01ed446de0cf059b2c80dc4a5af89021aa03f96edfdabae54e1dae7dcdbd7873d43ff5ed0d86669e835d6ef7f4bf98a1a419c85c317cdae1de7c7dfb1f7cc2c19e8c2cd71e7a43e091b54fbd213077f6397f0d46892cfbb387fbc557b6eff6350c8d7ab80f9fee4da5fea796fbc1a7b70fcdb8b27d288b3d50c033100d9cf5ca62a10843c1309b88ccf4e7ec4987d608f1e2d22ed688d9944ea1a5824162713a34fb2daf8ee8c3c6d38d3c0266f519cdbea6699ad5ac85462ff88244780418a54a1157c275910523d270b83b778466933970c4fde0abe76b2e72d438d03f6d23b252ab66d9f7f1a5322b28cf871b78ae0f5f28dce117ae4fa32482af151548b231a01556b136be0e1d298f7227847036a4df9e083d8290d813a3108b2152b7812ec8c593d80e6188622139dc9e4642aa8294610e8d23be2de27e7da6e78339e4f84321e4d03f9ddd27042316eb3f1591ae198efb649edb774038eb3cb26f725419f4120d3055100752058946b68fff1c919869a43f7fa87ed43cbf6621eda77dea7daa1f730371890658a63553af97665893a71742bd8e84c618f32cb0b8f04bb9fb1022325f71a98240a0f91068e25707345fe50fb3ea074ef6c7c98e3f24f94a0766f6222a4d9818299aa84a62a66002259a151214b04a09a8262528acc034636e64697c40e26462d2a481d2051a5aa2c499961eaae4e0b4825d4206c72566c918778959720224312e341072b92e468b951c98182e37b89c89e142c68ad122027900b8237e37327c78801b7047fcf842fe569e741bf5c3bbc0c93a30302323c3946c89c8297e2df3f8b576602bf640f84baccce1504a29b5d65a264fd8605f4654e132fcd9046a517a22b665f8d209939b0cdf2d8466ba0c3fb675eb5cf43c0ba1b543acacc5845ab2e32752e488bfd7b11d149c3bfed11b348ef85f017c389faebd3b8c25f52153b8f0592927c2729f1fde4031fa681c718410e611b74689828db7b19252c2e8d2737c69a02cb883621d05e81f887f1ac77c190fdd139f2213cd9a0fe3252ce9a68b77167becb3d17e434998f3308175f02b07bf2e7ee160994ce61ad4bead85f67b93c11ddb0934984af76b270f22eb030fbc20201e073e226b7eca021b06a171e8903d3dd5df9e24ad564b4a4a4a923f3ae08e24ef214b2c93649aad74d36ca59b662bdd345be956d3e8f8a1375889ace951f2a45d29845e9d4ee313dc41b184410b96e81f88e50a8da3760da14cea72e5fbd3a766c888419f68e8c0f94fc7a481655cbaf23dda3be325e315e3158f5e2ea35fa347f2d0ac27f7a981256c077f0f037f291dfcddcfc19fc5df0d1cfcddc0ed36f055e154eae7b74c722d18bebfacbd37957ab1c95315a4c6ab5e858da8bec637500dcf480935dec617b1815541b0111baffa062a52e36d60940735304be565991336614c4c4c4c4c4c4cd068bbf659d0c8a6527f8695514577be84492359451e2125f58e1d57ee8ffdd3af33ee8304687e0d0f0990cf9ccd7ce992af974a31228b8a6a85b5f7a652ffacd60e8711c89560bc67e05c94200b100655804c10066110066110d6104731f78b4a7906338fe849ee03e3e5fb09ed1361fdd3a477d097ef4aeeb3f3b10b2b2209201ea96215185d3f2efb2b2a755cc0eb2a05d99b52ea1f144be7b9d71ef60d00ceae0d721ee9743f7fc924ee17612ac0faa7be8c58b28c30c41658f2ad0efeecc55fca5ffe1a40fe5859c2ec6737fc5d59adb85f37f50ecaedd880cdd333983fdcaf9d60f62002ed78329ab2949085e6919f4ac19e22ec052bc3b5e1e55b8eb2844950c979e44f0fc21a870a6d817cd721c67b54ba9e03c5280834100c29e596678f08e6f288fd2423060cb2564a18d89b7298f02ab35f77ea564208218491faac47df2eb5399fcf5a4ee9cc51e059b473d13e388ffa0f67067d1caf368fb516d8bf9961df3dfbdcd659fb9a263577cf7d4654069f35b7b3099502d7ab2444a9587da430e0c912013d0642fbdda5686438b14da5a42c024d1b2ea243086d4eb12ccc82daeeda7be9dbc8ba94e2cedb5ff74ba56cfc8dd843dfdf1bcb3c3d0537c50192a16ee55e023765b7ad2f65ad10c60abdf935ce49572c170f0214005d507646014e208004b9797ac27810d33cee72b90f0830348f16ff2f9521a6435dfea51a92b29fe0d22b64622598c91d73b189b9a48859303125251d1d1919c548780971693f4549d6feb3b66d5b0f9c528b1f6553dcd9ec9f975b6b511a7cd6b4b72f9fe3503de4869a0012a0ee4af79af75c735df76cdddcf7b0bf691a7d1e51e3b4e76e341c4dd3344db394ced6b09961f1e43c914ce499ad6133c34227baba2fb88edc8510c238d4caf063078be038e87a016eed8efbfc751f1e573ac0877bb99d9dd3bf59737e2053a99e1227e130882cda359a5895231825c72d312a3e6cc971f6a730c8c1b4f2f11dad8094dd433607edb8fef0fd2fc451628f7431173aed481cb2a6691a06597ba9617fcddda5fbb35afd53be94334c1b34734e21d9e5502a47d6ec9f565cf99faf893d6eed4d81c0091112595d54729cb881e00981e25e80ccfd99cad5368664228b35b5efbee172b0938163a20f049a51699bb17be3ba3eed935152ea8a2bff8b4db99f629353eca15146e38c4379db77def6b96e767ad29fdcaf6721cc66200869cdf95d914e30830599cee186441787c43e10ed6d912c1c0662bfe222fe16abba22b64302d46daf795c7b9de998abc37ffb960ff78140fe46eadbe754ad02327f53350642edf69c6d20ce1f04f751716f85b84f7dff20da5b6cc4bef68e8d6401625fc32ace88c63510e7a5226b7bf7de79b6afde96ca5be7a80840a0faed11fa8daa9f08cc2ad403a9affd8daadf4896ee8d685fdf48961b0c44be7d23f5b5774fd55885c24034e701ea3010fbf28d48ac6aacc379b6b9c455712aae7e10cddfbe11f9da073102d457eaf78c062f5f806c4819ea9c4c1fae0f2a2c2d59576a92269e519232f6da828a87559ca962762b4c167b29494996850adec38c49af51b286e84e71a235455b162f222d2daff22b23ac9367fdea5f2689660cdd80246c94b85045968a1975e2b5d6fa729eb615882d98008144a117494b5fb089f1048a8f91515abdcc3126ac50030f99c64cf0c10a19fac9e5729de04fb9976c38d34fb5d64a450827a2e8f55f6bad609c261833130c14130c9a39bf86614a02459812d0304f24c9016e7931e1caa14926822bda68a103966d4bd1db49a7ddf939e7744a72527262726a727a72921519d167acf84057a16c8c8c8ccc4966262583e2656858b2352d591b1dafcebe75628a75f22d0aa35f1c2129810a0c4ae810046c0545442d3164eac22185a42751acc8252e5e906c9ca72d1109add6b45a8d4830459e6eb24f57963a13791a8959e4e9da5a4d6badb556892ce281165d31a348ca02a394522a1d634329a5447305b35a842da3c212b7844b53e4e9272bbb67228fc6652605558289b300c7d040c2042a2cccb0c310502212104ba8236eeaeedcbe50072098b8a1e2490914882626b802f6b0e4ca1affe1894a152ebc54304f6a98618ce009c2a09161662f8f4f81352ac02f3125587280a19920cce57235a194d2a52d9a32a54c7904580c21a8c28936302c3107c9050c50c0c498bca0a6ca2baa205fb9979858f3825e68d890941051f44afd94b604634a40a6044ea9222af5cb1929a8124cb4335560972478431836338c17499400e288d22048c8b4664ae4ca1c0ea594524a29a5bd748552a6d49571d8c2499532201083864ac461a6e4b3589312c01c88ba68f9a245cc9298458b51142a4d6e8be65a6bad539099c229f274feecfd550c11c492bc284a12c515f1862a56a063056cc9b37ef5cffad57f156d22d1b37ef5f7ab6023ff5b4f1c955a8a22a46fe95fba42446104f28bd952cc05661e910487524a29a574098929534ab53491a9675a6486524adb3c691a17461a105d305182f39140de50844142865182490d4cd3612e97ab855a6badb5d6da4b4720e5ca94657582cb744289d44244d1ab625b69ad55fb5a6b9522694ecdbbb256ea449193bf292a7ffb5bdf562d42e4fa3b4078c995456f9320c32839a93153c50d49614270840d3fb8e60f263ca14de56bdd565a1d909ca7b3a6a960092ab4a0b0450a4078116bd802e3b6bc40e9945202c51170bde2c8ccae0097da55293bf68fd6434a132efc01d45ae17c0933a73d8043fd981deac77c8aa7074210c4b3ca3e21fb5a74a27fe8c34cadf6946a301c8f13ca9b0f4956c94cf167243b8e373cdcfa35e883f91f01f2ecea0189ac3864e6284dd84e409a3945ea94135e404738589168021324011d6945a182035096eb2958818d15268ac02e5268023a6281175c9ea49cc7bd227d041432a023d10aa08e177cdd8c86218e80248c483544ed7fc5e2694fdbb64db32d27212a85e05b01464e32973b06822f8ee07aa5c5708f64ee43cfc019854dce6384ba9e289b17848d70f46a4520e9bdf3d0a6e9a9824823f62510042010ad3fe5577c84be9c45b204816aba10e102b22fbfc811faf52d3e42dfc8918a5d6ec68a2217907cf917f8c7a3235510aa0a221fdf7cb9f128c62aa5053d687beda34ea3828a581e310228233aced9e71cf7903a3607be9c798c97325ee6549d47d9e738148755f1350c9b9e54f106c72af0a737643e8ab339281d23f57522ee11771e46ceef7ca382eaefec3c37bd21f183705e7bff2141dbdfbcbf08418a70df3dce072982fa8b0aca09aaaff31e28b1afd3bd7d194723c81878c753519834af97721ea80198451061480422f0220c095205d91ee771b011eee30f095205c141e97cc43de6cbcff9fa5cce372a08f5f5b38e67733c557c2440f639b905e182508ff33228e8621cacf2bfc1df6d9ecab1071d2f78b29e2ae2961db94866b449701d9b05362cbcaa76747f3ed4a65c993bf601269f44c63e50420c4a9b1fba682d40494aa2b920c3caa865d4325ac1d4bc6055281140ee184c08580f1e834589c16e4001d7d1dfbf8016c00494893d81b9d7cd824f25a5b329f62429f6441643c145a78c3e347cd816ae638b002f80f6b96d00aa2149fa00095e312724c890f90243c17e4049c3d90e59a434d9702589d8439b0923e149c52f278da5b0c512cd84ff55973bf62449febe35bfd09bdae9a249bc29d87ec5094dc5128a322397e0e06d185695e11c937d2c50c75290e59cdc3114d464cd8974297d2801484ae952ca1851982ca5d496c418111059e68e1189f1264e6022bac189ccc99929a594524a296553fa52ca87eeaf012459725bed9f4afb87cefe99de3f1efb27c2fea170c3df7c0d20c9f45f6bed75b7ef0eb6df3621f91acc9c44fd101292ef50885a8aa90fad56136b5b1a13777777189bd094b8bb3b7c77189b58ad3425d6cd38dca2bb6115fdb5d65a6bad431503fd9485eadbea7dfd541bd53df7bdca32bebfa5cd59c0eb8162ec3c97e35d89f130763ea707c6c74fd58fafe3491832bc8facc8aa39e7df7d627cce16c3b391a77e8e7723abfef55a391c1059f5519e0f0e3c681cf5bb7e7cd816469c3470bdfa601614c39b2fb7c7d8145cfb5fcbccb09c9eccac3347e4992e6bdc2ac23b57b4e711e367b3e08f95af6d7351f6c68b7fbbfab03e87ea81f276726c452c1c0a7f2d27fca172e70db532065a59a8fbed3beeeb705dede43c8cef1c0f83c88abfe3e5883cdcd5f1de7970bee30deaaffbe8dc779ecbc371bcef6f46e1afeb3e0fb2d6dd285fe0208cd15dca49bd6fd5238582dbd862711b7f96da2e6effbc698b8a9d73729b5a77b71adbdddddf0872e36c1a4a63ca222e6d1a1bee9e26d60f565750683b107e26df4664a51a477f08b70d11396bad523a57d4d189e5e2c2ef1b5a5cf88dc407bbc585ef433d264be9d68b0b75c4252e47c420f7f3e89fa0c601ff46f461d958c968dfe22fee77b596f671b54107cad4500696875a4e1c44d6cd751ef81a8619e5696d2ecefbf3c0719f9d12eec7dab8772559ec2f79201c1e71ebf06783c3dfe78dc3433a362832c40a5690f2503f654de2540c74b4ba89eed04fa9b9ad70e56f2adcadc98d51624fad52f1152455c44499563cd3da5c1fb1a7ca9fafb9ee07c20584b8e237c4ca70040eeca49888e4d238e6c70bbe1d4f6b733f68e4ee24dcaf677604fff90df54f097fbe0e1e13f698ec8119903823cb432dcbd493597a7d01fc9d6823fa58a0796fe4f933857677af3d5b2c9b867e299865e370b893bb73348e9e5af0681c18e8f860b5666895670ed6ea7b1b9c5501ec892916de9d4d7323a5efde3036cd3967777f6a054e725084957960f8c41431d0b22c1431c4d079b811593de6830cbf8bf467230fad72ef403c9f75c3067c0987bcd863ac3fe1628c5cfd39edfdd9dd3d337cba1359f4296e111810bf97d2ce11c029fbbddbd35cf85a920bdf04d37f7e0bb59c36e4ce7fe3e8d9bc52aab9d08f6224127364127d3ce2501490fa943e04a295fe120bd48d80afd28f403ce2a5a80de27bccfed1038abb11f0f9c457c24029a5744e2927a594524a29a542d0fa94524a29a594524a69a574494ae8b585dd45968c9db5f7a652ff2c56b71c62a77fe64b09348f740006175c8003c70000f0755902691cf279305d1986ebd537dd7e3f3c437f76d9b8687f77922870b5aafff9cc67fde37558584f41a69204d9847563b5fa8fa82adba4129745faee9af9abeacb67bdb4f8721f5fd326d3df72877d1659b1886b5f7bad7de28bfee765ea4694ced6be1cfa1f0dffda49ebddc8a21f5ff453a91b3d7a746921aa876d1cf21ba5612b03d76608cb1c0e540ab2d64cdb76ea41eef28360b1c7df7a579392b583e6c26fe769db661a3a716fa7d9dcc0257fee580d6cace456ee980d59642d51b20172c7906079be4403dddda5fc5a39b65c511a7496df19a27a40eb71e023b264bed138a20737cd7d1272a6cf047d2d2b633dc5f82de9559eb85ec58f4be1fc5cc59e9c68ffeebc0efebec35f4adbe2129979e765ecfc7c203abfa47b9d9fcfc347ecd9bcd46b71bb8f21035b1bb12706ee224bbbe276ee70f7afe3cdf03a5e90e37538dddf7ceeac673bfc713c9cf33a6f1a54dcc9a40937b6850d77d81e7a0d61d3c6bd7378f330d0ca9f0759687ba1fa76c35fcb71dae7fae4b072bceba53cadcd8db7bb8bf171f097ca1c87bf2e47685b1287f9b309777737811a8729353aac974053e3d0dfe572652233c32fbef8e20856e96670d53f395167c7766f9b173f7ed08c2c3ffb5de7b84ed334adf384b6b69ad675341e6a429d851f91e896c35f845fcb3877f76efbfcbfa11cfe9fe6f893932229e293fa7c1e3e3ffa44a2908c3f92ddfb3c4faff33fb9267f146a58a83efd88c4979165cc321d81ec92400431de278416c45446fd6f2847850f9594e0cbf80a9542709f977fbf9d4339fe208d6efbfa1446e355f89b51037f770696811ff063bec31dfe106b7ef3e5ab31cb1ac097f138a80e68e06f060e7e149e91c230879faa8171e00b6918f5283869e019d81f07d5a17a54aef33abb77eeefee32b054032d4033fd79780c2fe7773c18decd438f7efc66e40f2a35d5f1f0bf1976d53f36f7fbb039af43bed5f08c0ceb268647f06b654dc3170bcdef5efb4f4a3570870efe5a4c2dd9508ea11cadae9b5d4b359af71189192a1df98c19f7ca23f952cd508edcfd379423dfc7e9509fe3a5501a742f74f1072baa832e770f95dc8746f3c0977204594a6f2847d61e077f2d9454037774f8d30012a986ca59dea49a2953f067c84294bb4c1f2a6571ca17e48e6589926f409359b963378cc9b11bda642ec3e76e6ce4761f9def9d208e83f843522408bec551b2d0f64732f43ecff4b9b73688be63782d47e5f6f88b79e32efe8844fb1191dc6fff49fcc9a0a0a0a028422e6b5051ede08b1d7b70b8ffb4a7147f10966bdcfc70394c24e68a89c42c31a5143a850fd828fe205605c117dc219f62975fcecf1b21d98195f85a2a3b6a7b681cb76d5e678ee336a73ad49b3cbc83b88770b3f52db41b16aa3b4ee08e9b8f48841c16920f39a9aa8fb23fe16f283cbd6d72413029a594720b9cf267a46849d1aa41866546856ccab286d96b0a2c51b0a0e1f00765518e6fe3c9e498733c22c7effc23042ecc29a2189657c7245c479ce859bcd9ffd1f6370d0bd9fffa35802483c6d1e374771792f661a5744e29dd63ff405aaddddecaef3a3548632470f7a3156477279ddcb123347169892ca8d04206cc182f4da230e208ca9114a232751e9db01d95a05d41c1bd02c5cd95a7ee88049a9325945227cc39e7bce282ea4a9713d860a7159819473192945941469232f2250d2e9d2465e60c59a066982529639d1e613952ea664e5a99ce5e07eede4f947ff4543fe6432c145fe5583e928c247bf454f09164f73a882e855c487edc892b984166e50a1298c08a1556a670923b56a4b0220ba33171bfbfc1fa87ef0ff185f67691e5f75a19d05869ca3c94e4f80e88c940e4a43d71bf9681e0ffeff2e9528a1dd0c4fd3e7ff477e8abc88a5a13377e8c5122b55a4a58db5aad4620e52a8924de93682591c44a5e91244611c3130c531821a794531691650c67980c1180dc31188480e10720668ec8f2d90ac1ed1b5d8652b69c0f5f2373fb2184106235ad1611d6b6621a0d89cbd4626a4d18973b46c584588cd3230a3e443df183f683f683162efe8413778fec8e3b86c0fcf5777794307631a7304979024325c997295d34f95223776c8a2cdbdcb1294f637ce8a187d56a07295754ca5194241ea49449e2458a089478916244122f31293fe49a3b262549a94b972847b9cbe48ebdd01455b1d2df81f6bb6de4e9bbca93e9469e58a937798469724baee39473ca0c28b5b1a18b165070346382b28406e58916fca65cb83bf70af1a513820517ac8cdcb1165c7036f1c8a5bb2442e1a61cbac75a7065f7df89ef2ee5dee48e19a1207f2f459eb963464e48c17d57a4e32359fab3080d0df5478c810c3f03cec61e08218c104208216c488486e5a54d4a29a5740512eca4b4484aa6452a90e0c2f3187d89a2280d132829884118c972ca68887c73c78c78a0a2d57ac1dad66a1545ca95d21769d4342152a2c6881814143428208061ce39271413b42196a86033ca32a595ba58b2b028cc39e1ac4293523e91e64a13172f3c4971c552d111a8223328b850f4e5a66808177072c78ca6d0206220986958827008a28b9228b0e02208202926cbbf3264192ba2018a0bb7732c9edca804ee7655b564684800008000331500002810080884029148240a8571f00314800a839646744e99ca624992c33008628c01861000083000104380310841735d00a6f39d382ad4cea9167b95b6cfe2acb28ab1a98b21de486f4e8a117697d1d2e477b3280a9880d49238a2ba69e70df89f82b1160892a124c36bd5abc5d6e3cd9184e0f96ba2bf4d1355896f0de98586539692f0f31135d6f79e427d9e8644926907625bed5770736f9a3fe46ddab2712405cdfb77c8ccc546c7fc7a48a72fffed6bebb2d3850de8879e6b1f46d5856b0bb4c1352aedddce8682b238868efb1a08e0b2dccaf5a89523b3b2968f7d58a02bbf2bba343c3ca793cb7a711e7595fd88d1efbb008a59ac55388229c9badacc8b70d90ef39d4a4ee50482a85b8288efe08f6163bf9e53d478e18c12602894efc3845391b9c20211ace539b14548bc9711bca60095642b966f2abc61c8c8a661eb96995aba58c1a5857e8562729272a6cce0763f6952c86381ebc1dfa792cfb6fc1392ae0025eb73eb431ce8a93f2a4aebcb87f5a875258515e67c0d27bfaac000d7481299c279daac61b69ba69a00f48a942b73f3dd638d468a1491d839de69c57da6665a7bdc8fc78d13cc67aaa9b109a47e9d7f1f97688426b6feb6fd69b13a3c59353bf331f687c2065c8af51e82b3245caef135cfac321f81e997ab7ad53c44f7d6e782a521bbc5e2f3e766c498d9876a909aec9432911690bbf2ad9858d01a220b3522d9357a5e94160da4d6ddbabc85618f97ffaa637cc1758dbc432c6a34dfa9c40ecdaafea26d85456801a31dde6494c6367ddd6075dabb90c26d46c7737b77752bcd77384c1f4d2eaae7d5cafa071e041b650d7252c5c205936ccb73f793a119398a1a14c474882df1b20a082e4a78047bb52cc4accc32aa641ba1640e13a888d63bff823838c3ce975e31cf658a5080f5c43506edf97ae90c08e2fe6d4f9ddcddb88a8aa651e326cceb22c076cf9a9b72abe31a1b4231f9a10caac44be376d68095354f9cf76dd6416eae11a61eafa9115d0d2c8bcd3f49bc92d4a577318f89463ef0265a8b9a8dbe0db408d6fb051ba0c50077ad0447b8bdafaaa75d8f0fab1b13b97062915e900fed21b58a5a37b9161b7862d92fdef36fa009fda20b79f65298d4c61aad5e46823a249c3492f9888a5a6ab819b7bdf2de3f59350aa4a318875691860cce94843f088328261e87cb7b006227c4a15a929b0fa3690ecb3afec7fd9c46f0d48576b33304886b7feae1ecca495cac22c1513fa82e5a36512a152c6ae7d11f81b7559c526768902efd2d18ab2b1835eccd64f694afded1b861d9d7efda86f82a50814a7fba74a5961eee4c5b5f7294939ad5ca188fd05c535c82412caaffc161cba2fa0c93440df571488508ea210052406da21d9898a938ab9e34734c677f4a74b54a8cf7c45a336e40b99d0b10cb7ed8db0d10f104abdc45c9f055689fe5087c83409ba203eeb4486c7a0b2361dbafca772f7fe8360e31ccac877abdfcc08df23665ea8317e84dd1014a904df308aae270f7b4af2816dfbecca69c8cdd9b8cd8f32a01cd219fbc00fce2afcfb7d95b3da3c93f7c5b86b817e7a604534a61eaeb6746d28687877fe8e4c530ba4eba91b7e42cb608fda879b6a8ef95073f5f9f9bd5142788a86426a99709e626e1105d475eaac5ce4ab43b17e3bd5c40c510282ec0dd883ec5d0f31b89531d00a9d91f43a38a313e7599cfc507a2679a84fbdc587cd54a7283680195c400c1f32041342008bb8effb26550f2520249a5b7ccb795ef757605f1096df867e2cc7a17f7fd64ab48de5203ea00f96c06e027a3a1056aa2074e6f2beea64f6de34897bb6657501aac1509e5c21831b11d38db6af25f700fd77ccd17586d48cd63202b084826ecf1170fd8df227a7e5ac3b090cc498e78112192592182fecb44faf1f1010a825a61843fc319fa747d92f3025da0b40a17ec84a79749a0cd94e82c19beaa4d6930dfc11bd2d6c2b1a403289171dc8ba9073cff854b5e7d1c415fc10217946c53384765a7f86c6370d47d5950f8d236ece646ecf0ec265806a07aa4d87d91f865a97b96ad0aa978b2ab3e9edfa70b477411f4bb4e34ac1438f403b3c04f2934855e4e6b7cdb4a70df93d5f6dc3cfc3615460ed57337c6135c67a85a83f9e5db9e9fdeecbfaeccb8fb31af00bdea41505ca8b7129480939cd6f4f2f553e669c54922b04a0ae52721345230908a74b028b35627d4370f0a950854513719b01b58a801525f1d8bc3495caf2a29db498a90b81248407a9950910c84e430f4c954f4bbb61511e2930ced03e87587e2b131142d2729f5d34cb261144cf963abd416e858b014b8b7158b650d406f7635d5e3833974a0d0c689d00f5d99829caa791ea198a3e3bbdd14e6fb7c2c85ecdc479cc3aa712c5822a03f190410250482f9e372ba233aa910d78226dd7939db1947062a08cadc9d932b38ab1659eb3402c75bff0bcd3f12cc7a88dd0d1aba26faf3dd6eeb5835c9445fa291cf311be3b05dcfb7fd22e63bd3135c716c2854fcef3a8521f14867d2f8e14946b5a5f855e4624aa08da523ec51ad4dea61b84e6204027f4a2d9462f128fa053f0174604b22b5a2ef03ecd8c8854708926293c1a6b0252cf86636a8a23449a5b45307f8f8c885918aa11cb2d7fa4cad7a62563fd893d1fb713a101e5229796423d617405dcc933a4c4010d3c850cdc4ae84c9952266083e386c17c45fefe58a37c6c3bb64d781c705a1d4a53834695388228de1580db447f0d01b3ad13cc539c5df2c94540c72dc73a8dd3bb1b5e2ad5e0a201ac2c826d10e6fe1b6e02d14057d5f1dd0b51109ef0a5440b7342c27e72c25ea5780988c7dafd8c6f7ea4bd673f50ee8cec82387d2be4d22bd7015f9500706e80ebfd01065a28c416ed0993e9f7b6c28efa3fa76c727158422c1db5a06038d8fec524629504447413283d0629a36f601ed0580e50872eb57ad15327482063aae7bedb238c4ee07f6d59a4f398af748b8deae5c00645a4bef9067c3eb73e4c24f840b4a736195bac20ebe07904669af42da15a59b2859db4a3c87aa8ef35151bb1c220de416bc7ef52098829823c40ae2c1d3946518ac116ee3928f7243dcfd29c95eb42263c9fa9d68c27383880ab4bfe0d618c0fa765017afb7728518def28e3e4007d481f98a4aeb50695c8e0ce4cb02115db175c884b45b2049b3b453c57b09480716c83eb7354bd34c9336f30b4a8ce1e27ad5abb5b33097fe5da6519dc8a0d49406943b8a9ffabea57a0d6acff09d418c8461e80e4cef119e8a9ae6f594f8317afea57b62e846f0179b63d26c3c133b9ce6ff79e8ee392a64f9eacb07513f436d37c62527318b02aa6fc93d9bdccf1a29f735579ba7b83cae0f59406397fa0c42c000011400d6a05ffbef19dc8a2b430840cea21b96ea91eb1726d938b19aedf4789111815bc70503866352342dad0d1c57b05a2de3b8e2f9fc7949b8e73149881e2a39a9e3b0989b4aff633cfc1f0505a750faef5e9b81bf01ebba4402a6f00b8d25b6b621db44ca505cb2092ede79882001b94af7e8cff8274534797d3b2090e3dc440f65bd9f424037a64035f8eeb3229ee4b2c7bb99a0a0ec9e8712009f99ad6732932e2ca5e961be8d7c3ddfb7b49b7b7e06d12f027d5bed30217837579e14b986e6d0a64d684ca6bb9a86e61f84485edc376391dac7e51dc0a62f8cb78a0769ed9a69a0577cb10d1c1a1d7d5f59a97ecb6d73066db37e81ca92718aee97573a9fe7123157245d0a218a001fcee0667db8275490a79c174d9f2d5a015ff705b8d128cb198b2e173e46b849021204f43bbc952cde283b5c0a283d5baf95ce62c0b8f1bbeba2388347ee095b57731ba0341ccaf50c0d15ec087f6cebf753eff94107bc8ad72cff0eee494dda2ecce86e0f62bdfad4691a298b280a9a7418c36c1f1a88e07b44523ef4c3d441eafc1ca19a16060945e54f3f043a93b16b6be7e27d501b9dc362be21bcc016d76c540590232c1d3702cdf254f31ad30edbedfccc4d51e8413276d9c925c1a282d8248516f21a7957df04355dce1330f88657bd8540725a4ef247b66fe1c0141a18e88a4dc87db94729367d512214ab11fdd894306b093b055b27ca9653dcf4e532b2964e7586764614f71d37e13a2ea2b130395b82cfc0a1a0ddcecceaf2d6b91d79524a71d49daebbf3e4dbc8ca8b2819af3b83b371f066f7be1be99e17233b07bcf17da9a9f0c857081d5427e791dbfc4223742bb488367d152d09791ee26187f9fc22f924728477f22f20b1965c9196c955e736b77194571d664b2b983e4a19c3f7a69c18c5983493430f37656829556050fab8a788cc85897fa9474493a9f407f049ac7692205db4849c70bf1385f23f58276499014da3c1109ed24257cb036d3224293c695be3cc3f7d3dc5c3f625a7d61e6aa4440bcf4ef355aa83dd0c60b063f7d3bd95478d84718540477a9f76a50dd7a7d2c2ff3ecd8da91dd075f038c01640384fbd5973a4c2e165819897907c93fc48a17e8508aa6170b5a89f2e1e564fc68be5ffd0888e4ff0519034ac22d61ab53114774d476049cab03d389a857010eaa8e37ee5cd3e8aa5db2679fce776e54bb27092bbdac7d621de20c65b9793b46df3d16361f4c8ed46e767c49c5c1aab29ff9752191aaf3670245c2e7b83e44be4fb146f3b2f3ee42fd56da5b628228e3cc46ab16a184986bdec48a14917656d37cc51ca1d7e482adf753f13510b0b9c26a3dcb627703f2019233fbb855ced38ccf0aaad7713a347e273caa4d48a90253ac58a44dfa6e0f1fcab832dace27bdca11bb328ad2b436751fd67b83ccae4608791f1f42a075f2d5a8eea95ebc149668c919dee4b2ac17920c31e9a22b744ea28d47ade24d81deec11dec56a130c31cd67d67cd058dc96272ca3606db764869d15e11c09bd65f4d22bc7bf20f57951d13e972e5102ba87a17616a084c99545f35d6872a4586d02ba77d4500be57c95c8b957007de5310b1e100111e76f3d5d78206b31b581878a3acfe6e294848f54c1478c74ce608760675977a399d5d5fc43c4b7d28e7e010cb18b59b583354873e1cef45e42ec093c7da52506449fda20b3f50a638b30b39ff08fd7d342446415d1d31b874c6f136390052ab067edeaba1ad831e5157f25d020d2912ee8d3c286d0fdf7bcdf91faa255b45b6523a77f3ad33daaefeeda95e4cccd562f1400e5995355d775adc278591a23383d0777e1231a1cc9bc1b51f998db7460a7e1fdf833583ab2404c786ffaa96e8271f35811027634976ee28feb0e139aa413a4d04cb074b26ef5d0382a122682eea63d4f0ee6a52ad085e8be0338de7fc29740bc21c52ccb4f9171344c0803ff690af8187630300ebf072a0cc3f8e2e30de524f2197847ee4362d3cadf25ab93b52fa4b0f7ec953664cdbd5ac671d9154a30359071ae12ea68a39466d428a3dbd4479300cb18837d53c797a91cac5d3fd5d0d90a9326c4d30f7809ebdb1a5f19a5aa37e66a21cbf888118fba2bd97c0158acf163c864ecd01bbafb53d84b8e24b6bf96ff1968a9b40df9dbce9374f72d1a959562e7e0a48f49a2ad293018f770965ae3eaffbd4e191035a7e7815d4f468bbe21b49b25cf4cc8d529997d92b8b7f0523b06de0f52459e94685a71a400b8a7442ce8aec0208bf307aead5a4d1a9ee8a72d13bc51910153e73fc736b471fa41490386f2bc6decec8699ac2b40dacfd585e7614b994724261ab8e4ee569966c28cf6b67f2ca7b0f39eb9c59f528346955b1374e53aee0621dc29b38d4ca7ae965648a952cd2902e6676ea1dbc074620ac6fbe26dd15474baa7606935c9df12b2f20b7c50e4410bd53bf116796e250a2c3a1a34ceaf2c89fb50744c89633e7a8c3209ac49d3ca22414d980495a8920b4bed539af138b1a22bd63a581f3a5a2d3b74994b1858a7544fb521fe54345be2e181094237aacfb7940059321f60b60ffadaad2c28ba2994b62eb009e156defae91166d5aabcbbfae73671508b2afd612c146558298ef9b0ab70e830d7ad397a2157ba7460e0e4bd79f50f745096d47c8edd2e8ebe23af93c8b0b3303ecf2445bfd80928fb09778c67d1fba2526d07937d799e66ce688d8ba25113a965a043456474ebcc179202facb51aa0a1bbde31c2bc90aa438a7f122f4b8dff660db778796e678c9c1ac62cd05ab60793a23e399f2132dad75c4c148eefb52435c181c99d48b9106f5117d041c5ee55dfda16e4d73a50e2f422ccb4828552f06f3aefd5e249cdc918b4fcf18dc48a542c6db63c1c9e9be7b6fc35010710f089fcce59e10636acf0154e90a984a27bba3669851baec6e88dce6df0f449f125facd8e346713339f35ff35ee5a66005ab865295799d17b2924eb6890bde09b33baada3b8144847ff930a56edcd2ef8f457d4f6931c1e987ebc120fb149caa5613c7cf7a851f06f0ff024e5c28853ea6a440d5b38a8c0bc530549372c8dd67067dd26c60c8ba16f87432873d62f62cfa61c9a7378d44a466d21c9925d4731cf519e392a21a756714b66d00f9035c710d0e2752d454d672aa019c48db5f7a07dba6b2af6320be032599341cbecf322b6928240533c13aae0e0a2231ee95f4e76a2be9098b9491265ca51a292d2e5aa5bd1d499508271dcf34b71b6d582727e081c5166281aa6d540d0d709ac431db35f59532159cc7b59ca28d9027d1b46464714a7e2113048d0e550704e657ee8b6754e70261b8e08f4cef81f2cd644d81ae6cc534903710e85d3a4c9ed90a452cd44fa1b3390c1f5884c8d5f4f31f00fb84c55dd7e170d815ed73dd14eea26a691695a1e4a8a948c6294f0713286d91121c9e8787c189c2cf8bff2384d36099e46dd48966a163d3a575c1a81c34b8871af8a8157ee732b15e39062720a5cdbb91261c78249f3e0b497368d5234f113c99a797a07d2fffc18373a49b36aeaa2fa21bd2027dd7a54f340104909843b48c59552e4652a438557b1923f8b71ceca29617db2a242c34b9be001bab5725f109b0208c16593e91e7320807063ddb41b92f5ed94ecba10fb3d5dc0e831131e125a9e80f8755f0952e66e4d10aedb6083b1cf1d41cc097f6d68f51c25da1de193177bc47c0e423ac4bda05f82abfd4f45be632f261f41af2a7ba457ad9641a33845aa6aa06de2addc3b4691a9472a160f16bd90403f8ad35521ac98dd205b71a18c33ab725057e089d2c6ab47058275313a4c8f0e83a06941ee1cd93efdc3338d973715daf5c358699b8feb7620fcb5c8b5967a332e33da08f7fab130a480fbe605e589265572abd41ad4c0c07bd3193b69b5464c9a90acc46c12c24fb1c9125b9fd71974c61948f0508c0a0428db27061f6faa35e6808068fdfa6e8daafa5289a51b92364ab5796df5b249f153d9d1a775acb90ec8385c7d1ff9d07e7e785f7f4f61e9a6561f3417350e624bbdbdfe579342e4c222ce7fe7cd112d0c3cfa32fb030af6ec3def7527472712396fd3ce58b370535eec413936fe0ac5b3403d4e3c1c5f0767354b270b81754433f99a1f7c3e2953545b14865f47f68d231e535380991c036f05671e63e580d2dc07fa09833257452b5ebeb2cda4277ec604c121afe973699888b31850dc76efee9b5a203f567db2f9f05e19551f319fc5e0204f64739016635f24da928bb8109033efa77d0ed96cb1b478efc2a7d865f435fc275d16a07e43dc7e145c1659fcbd28f7ad74c8e916d776bcd6129bf1fd161044bd7fdf8e910d8538fafb5e49f10d4b92399637408a25bc0c2932090eb4e938f6e91625cbc83ef16faab94cf5fda21ccabc84d9716b36ce068218d57bea1557b0383fa45e4ec0e165bba8f6cdb50def45e4d0771c2c4a850fe44408d8a596bc07d35d3f3fa2f2f789f4d7e32f6ea5e973945adced4f09e46d635080bc402119a84bb9b5111ff904ca36abaf881a1a943e3a057329ea76a86fcc595cb5d2a67c2d273426ba3c7ab67d5fca60b937c606122a11cff2294a788aa38860fb2501f5e567e2f6c8202c7591769024bf59852e9713b324324e8d67f059784b0bc3fd671a93b613446c885b18c34dfaa648e808fe6da4c57254d602d157e49dca68b7275bf43c1a03fe1062237d3abca4e86c277a1ec3761b4c7b4acfdbbbaf66a0577f3c97dc878d219a6bec340c0066b04dc689142d165eb9b40cc9124ccb3fc0a2d8add3f09f4244756ebf9c68519076509a5ec43c72ab00fc63bfb0c68f71b3fd820bc1bc812af47527a11cdbae4e1faf034ba1e9ef6cbe0dec4f37b071fec7044b322cbfc503695267c4350c236025c313e708f845ac8c29f24257127298d0c9ff31d4c12cf6f92a082450af67b43c40d1c01e1f94ee4b063d164935e003517a6a3d725e34c0694bcd5ab2fba2a71a1146b15a4e18e6ff50a08abfc96be249bf51a64685217e85e1b27061605d0d6476ebff905c0511ef0373c7cf11190a7368cdcbae21801a324e763b80f21f0bc054ea1d7bb9895a861d14d774abfc255de44c0c868f04afc5504e852812d96a48a8c186bef12d768ca73b9ca9d96defd45dcaba6b148a70ac36c6e1d62582c9a0542c612f538e52237ebeef98405d4c8632637186e90d139350196526c81bf9c0ed8d0a00512f5c145f3583ab286af6dfa0acbfc0b960d03a723321d771c97803058a8d414c4f7560262181021dbe541a2303c71c48f91ca341d8e1b3f31e0e878138386051f050d840cd677323811621728f2589b9f5f7bfa20f47c18717baab82223f5d2000dd9bc437efeb01cc2a1c2a3a3ec4b25e4273274e029ab3ede4d2434216b3f0e20e63c4a03babdda959c98f92dfdf7b177f5bacb45d88500c6e571c837122505f1c1edf5381e056067d3825d5b8769b01e5758d6e8e59b93ee7ab190a8f0fbe43af727af008e2b42d0682b9a78f88da31b57613b469619aaa1e8754f71ffede85c9969d5137821658da67a46ca73b5f0d13875d8a203d142c81e315a6adc014fc20da3a8ac40fe26a951c931522b0a16ebcd24128bd9f36b4724c341653f89b0f3adf939d363a23ae4acc30d0b99238ab9250e0903300ab26174edb091571332750a0b247d2f133e0b643ceb074e6e43a48e28ac806755a95a61219685bc3f8a9b7cb6ec4a84962dbfe97e0338bb597344ede5f2060c62fd1df807480a326231e29a378a4f2fc7420687d02452230fa4f7c24d5ddb2749975a7114cb5f3c63ddf5bc98ed594dc464a8581a3c902d3d04fab3f157a26a8d4265d338184e2d07eb731e12e0febb708f6bab4b082b630813d6862189a2701c8e220cb2f5ac11ef5c95f9923dadd465c7410377ae6c16059f9c45f34031675568ab6b4a477450a2b08b4f5cf38f983840922c39a7709beba13c52277462ad021135284056c616b81aaeddd10e331a44dd58f9e1f1dc663b04469ba8ba4da897f738c6acc23f9ed823c18434e0c8c1a5390e9f931c643513ba47c2b136eb605d3b0b238bc0a431e578d6fb7d4812ae417be670f0f255f0b4e03e10de4e0aa9ef9f6a36880d71ba7a36b9cb91b078bc6509253a70f9d6741111a5dbc7418665f097bd1dc556cb98cf7534e6a1b7c111f8047d2f08dbbc14ce58153ca4308abc5987f901c0ca5080652491c40c7784170f093072bd90b0aa98b81787e64ab9258bcb85621d38d30edeb07704452b42caa455ee172b20830ff129e4e0fb010236dbbafbc98844fb40a35159040ac144f82171f543481b800047a40ac8ffaf39b5d28f1db636ce827a021a1236afac9178cf3c4c8354cef0f0a99ab9f28995707ceff19471b6b3c6592b56d6f7662b75c65a0c58a0976a8969b8239dacdabf7963dedd9e770962972e3e3e85020be0ddf169aa77e0a5408bb48bc5c23c4625cda9618afae6cbc4b042d89693a05b46defed256e0e697ef97ea8a2bc693e1485f19328f4d959bead44c2c15dcd2a16a0093dc4921fa6cb842dea4e7ac5b919cf5c88d88080950a4868a906099522505096fad19d2c17d98008ca047f4247243b9108d31c9b3030b8a709d2a95319ce2f296c421654c7ee0742ff12df2c26f679ec11cdfa611cd47eee0d3265515bfe4452553c8dc414c61a486776c635d971159cfce3cf895b09002f8fba2d10e86cdb426cac7cab6d760625ea610bb50145c0bf6daefefca75c39d9bc3f862b8b06de06f62920c66c65ce58ab5150dbad27f207e42997fa0ad47848bc844df801231c10fd7b66b1220b0a84fa683a449024b8a0fadbf2a4d5cf689051b96242740f24b1a530af714c5b0000a86f778cb5847a2e9d197eb46e874aaa4b3be8051f22e45251222dcea505b529f7990d81525937b4815608b2add533c5dc95e0a69d8a0798dc6cc018b4e9380172ee8dc2b54e5b07bef085274235ef178d74280153eb590f539dc3f17829704fc1457f27aeb18a40c4ab42ab124e92da1db8f84bc9151f61a0010aea7a1ef96765abdd5cf927a669ad08bbe864cf1613b010b1400781f45507ab1e32cb0e1c2ec142495cb4271ab4bf2886858644741974a99613d866817188ce4a88449de3589056c6eab7911e1a638f6540c991fb3216d6238ac0f5e4d128bffeca3e130545f753f88266f10baa3ebcc5377cc270beb1e9a11b86e158a637f3f28b3d84024cb8ee1e6b91d73253e90452aeb8f85bde0183d1505e3a86eebf276a769c996e3195e9c84c19df4e3d2a954e25012abc713c74a860c5de9252a3afa6c5e468180a2a9fad3abff6dc73847063454d60f03a463708c799458430da0f5f5dd04ce0fea0c94708ed2008dad0fa5a8cd5b1f1c7440412ab010db1beab2f57ac73d66f499523d0cb6870184c97b0a690d44e162f26c820cc83a3c1af27c1f8609c37e78cac816cdabbd701c7d39b73f4793e3eec3bd2ff69f07bd9256d8e3b1a5d42a564ef647382fac0a7373132340af07446545933b119ab9beb2b4751f49ca8d642280cb7b9a2ddd1f4b0fbcdcd9b910e2d19a7fa4970f103088a84d5a6856cc170a320c755a02fb91cb18ec9200074f25d3f160c0d971286aef7a874c8227479dd62864cb51fb53865f269dc6d83a5eb1b048f584ad792324a818c60269af13eea2ac3b61504d2fcf7e53f6faa3f8e80325fe682b555a00a9506126c3ec22b926f29ce382a78bc66d60188a01c4be18062ee681dddece21be00c03f9475ea743a30e41020788114bc79a12b0a562435b4ff37ded903985e380dfc3d4b21bfc8f8c964059bc8afac90014064a80571ba865c9670b3748ed6e70492e7d83e2ef1a97710963607a8b4cd4b8968ced41ba282e27610af11d36c3a4092b93fccf2bdab2514a80b9062da3191612b4533b433a6d0b04c045a0aebc4434a096e7615ae51d6721fa0c284cc70a7c468064c4105efc9e82cc75fee003efdbcc42aeaa00241ff23a9f341dae3141c0ae32e0fae06600121b1a33c198fa5b7c52395d2d6793cbfa21299657d55a637c6d63a7d088f8eb0f0c8430cc66602232d2918ad52e5fda7350c22bb87338745b5d6330e4ea78822e5b30f2a6619f90658476c0d2321d578b93743938e27adda1c4a8e7e3a03232ca797f53dc99b2dd2f368115d14682ec3902ab5d384ab366723c436883b3a3316cf77e8fa5f3e7bb6e298486f8f82a668de8e69642c371c0382ff61c2aca0ef50fe19a430d91ae035be9ce50acf11343d2e8c6427c2f7ca73ebe6b3e5d42baf765f0c3b8a83ac40b1686e1b4dc2ce4ae59d661e68db6fb07fc331c2de98037c717bbb9d5c91f46a45514bc1ee3c302fa07011613a154e652984421e91586349c8c0a2b423160153df715dec4bc80280798b6d87490619314067d8d3059997370b9de848363d67fd5e0ebee0a1ef14df87696e200499245c6a1129d1baa8ad496a1c0e7eeeb45858ac5b816071405c26a8282f3633dfaf362c7ab866951cd560a7bdc60c93ed81e9ceac2a0df55ad851f188c798533baa3265dbf52a5c92b90b0047af258ac0accd1c10399dfedfcba72bb972c766ed3b744fa368a5535b3e09f894e6da6556c6b2947827a6eeff743bb5e64be1013c62000e0950a8559ee5e0fd0b264a25bbe5556be654fd12e25781fdfb87d9630b85c4e9bc828761358da3c07816ece6f9b207ab8d039d0e964fd23766235d869e2b3e08edbf0f60c9270517f36ff65d30d8406d964aaa152ce1ca6dc517659db5ea4faa8b7ac7e3788831bfbbab57313d358bdf271b284629b893412a3fe1f8a6ab60a930cc38b4cf12a7d09f0674f4c9fce30c155403ad0b0b99490b810a9969517fec7c6952f3b00fdbb81ed1c4c0df6d1534aaa54e20d3b3d22d389f56d94245cccf85154389730aee9f31950111dba9abeaf17dd201439064f40518a7a0513e3ecbc67075f1562092b4b452f2647f5434d6acfe7794fb51a751b89072001e4a666138c059a7c76ba0491bbc705e672a1ddcd5c6a391068784d94d55aae403e00a8a732331c6cdb85a62c664c2ae2b5aa8176380a436e95cf2dcd1934c8c08e40e47b8cd7173855b2b9410ae19014b4ddc8e57867688fb5829ca313fe99ed311fa3eac798b46711b78c4afd1f681464bc04b20a87ec35aa147442261a2502b6d518780c1bd043221679fb896691b490ac0607d347030ac1b1f103eca38c6d758971cea912bd9f47ff311ed0470a291b31802460d939c51434e001430dc12456cf43f77fac9310b83ced488ec46ebb2b08997be76382b82a8194c29a7b84b7c8fa4ada91fa0c3812c2912951501e3cc38290cb5431881b951516c25d3c9cf3e740ac253a12663473c4e42e6e77ea4edb77a71e9978768b44667bd68d27440ca020f2fe4ac04cbe307bda9ff2a59b52db99da38e0e9766a7bb6dac5db4c4d238e32c9d16980a31488f0e9ce9d654aa410f97fc4e03c47af56a1364200b6e0e7d1ca4346deb47f391c28fe38eb335084349bfece453db4d37be813147bddde0c4e6eb939e3ccb33f42e5ee106c1d18662bffde96b8d4cfbc2a07a0e2837b7e35ebc0859740715660c9e210179828310b4cc5891502b75a1b890b6571de83bdbe988525b5bf8e2bea14b0b08841ef9d2517633f6a9190c5d6ac80308faed2dca6b81994efcfa9bf0ab21c58b1dc89a1d02436ceb8c66287fef5991ab1db37ec0de445725f1099851f17ebaefc08efaa144f27dffcc56c56b27d28467df7a30108371d97a8f9970ca5686515de83559d1eb6be9e745339aa4f334b0801149004458e67ec1edb88e002a169e14545c208c4d759c7f9aa974a44cf151f384a80e01420639949545cf6cd412f5031ef84bb7beb7ec27af457081aae5f17290cd080895025b5277fa1f09f07caecfbdbf02682c21eeac6bed6a6d48661e5f1c85c50a0a795fac11a178aae1106e6c301000a384d5a55c4996006c222a2b45c87182c1d96abeb9fe8205a6d6dec827949ca93cd85842b66e60b482976ebb63f4493408e4af1bbdc85d0e96da092a38bd92bab603ed90f207f42700f951762f40fef7c442c3195d6fb1d0b50c9334e61280dd21f4082dff8ca15b666f5adc3ed7125f86afb6ea50f9948d46e5f3ef3efa940afba7d0b946984e238934dc0ec720e9a3538688aca05180cf565b4c80cb4f57c2818582704097111fbaeca6d461998857e7b25c317fed5891b61c5ae1fd8609e7115325c961f4f21e224e76b49ef0b89a51c00d2925ded5ed8b722f935ff0fb51adc1714f16f441590e7f937c47fa751a948254e8c44bbdbcf277c9e95e3d26d25907718b0e5c7698c6f4c23e0e149fa7a195271ec86b4542148f53ef67dab8214d773842454bd15a600b582b28dc27c2fea8876a09f3dc098000c2df90c75d8d2c56a8a40e8d28fed4982bdb21b458e957acf1fd59b9854f7c964c11b71e0ef8ae456a7b38a25571cfb40aebd320d7ab5e88e00dc95a3db046ae9460c72bb8e5fa99f76afd4f13e898037c7e286ef1ab3c77d50a52d2658335e33f216750badef7058e656dd51fedaad0b4a5034f4354947d685b9d488aa7ab6dfd4b4dd4d885d7565bc0d1e38a556a8bc4f188ae620376a2d7716bdf41205cdf889603ef8a4dd83dcbaa81b778546479ff6eedd702b6950c428710f7fe3ce5b2420506388a40aab633f0846e407ea43a4a38c6e3022e8e9c7419983839c168dc99a9d6920f751724ef3263b91d92a63277f9c5bbc053b10877ca1d0f5aa3fcb6952101d429122f12bb44b51d1e33849a0f727704882a2110037121d441ffca71373703c693ec15d192198f0fac4cb178944ca79cfd5dc8e4221cbe75e6d60a40c4bca9f292cfd995a915c7dcb5e57fc10ca726f8b5e4f87e545373f33b0149d1dccdd1f992ddbb87f0f5d59edcb7af31679cadc80d3ff2872e716a158686bcac8048e2d197a91965ec880d5252e99efcb4d3fcd139c6c9e2015fd17ef7d4717007cdcddf7a88955fc10e36448b23f5f89bbc40c31de8944493ae52380feb73645a96ed2506a8ac123daa1834a68484cc2f32a9ed6dd64e0f996b17611dd14703b9adf3bae4642f16103c5ac0b790a0171e084650ec586a630710d1d83b44b062dde63b731b22af03dd4134047152aa6d3fc231dacac74e6d9ae374517a1d780bc3f8fd68594c41af0d39d62e09c8623f53e56c836b85ab1ea6ba6cc13f2e29c882509198f35627b8dc9866dcde5fc148171f1e26ab8c3ad5a3874cb59033a2cb108333ef1d5ea115c784c26b0980c66e7b966514c543519f8704c6030b46602fc4f0ad1aae0018d95e6cf2db8abe1b7a00c56b022c50243100ea7ac6473c6670d33812f6d94605b74af26eb7dba8c205d9c1d95690d3012686c424ab53bcdd5034bc74eaa9061e530bb7a2e8a2d67fa9dc76f47c796bef45235d49f11709de2590cde5450f60aeb2a7b456c40db76f3c09ff09d50e08eaa8b9f0ab4ad150e168f849e088e6f3bb44240941ad187c3a2836d512cc4a528b235efbb2fcd9da3467b53a805b8b44a8515e6ffc02cea3eeee494ba231f1460db6a14d7940aebc9babd639ea98032fa36e3acdb17a7e7413fce0ae72a16dc9dfaabdd3b02fcd32c248c9fc7dd059310026cb837cd3c5cfe004428ac64c1ac2160e4aa6d10fe6e717bfa644d84022ca4e026b097f4d0d7314ae383a64b09dbbd3d4c267c05e131304a4603a107aeb44f011ac3f49c02423748f0ab7741f2dc1dfb079adc470e0ae5329301af783fb82083ee1b5aa551452095c134710e00dfbc901e0df5df4284099a8dae5f6b0ef7063cfea66c1efcce0c7f50dcdda36db3fbd413c4660fd1651802dd3997b6aec6d0437c2d9e09fde29ce2ec0b934865009f646ac56d6abdb102090169aa82d8500e334e307a965c4bcf3ee2836b36cbefe0bd73894a93d74b976918475e41dc4911fb031bace1075bc493fe79155e730432a8b9e9521afbcae85c2f636b7c71c0c96a9be33ffdaea87902a6f0f550b7be455df53e3e00a291c000c024ba10a2ce708b92e0c57638798e01161766999409e62211d6b0276bc5b63c96ca400dca3340d8c738f00c7bd0d40774eb3e08636436bff89ec2009ddb4134fe069b29199de21b02d26dffe3865c9c6d4fc1415d095f3a3a77c5c095d9d53ecf5e6f34a71d98022ee670b411a4fcc08ed8baa080db367fe16ce1ef888e835588754e5d6872cd77cdd2264bf796f2e7e1e63d60ef84ab46a00ee6a0062d40b79794c6571231e2da34c5a8f7fa22d2faeddb4b299f39c1d50370dfaebdc0fbade8fb68edfc2bdffc2cb8279a2f7bfe04934266fcf79ef947994ba3d3a4d0bc2a158a1221c966c47e1c16c837a7c2408abe29a5e64de4c4da8d1b20eb82eabc7733064793637a4d50f6b4366cf2cccc7f342c3a4a81e86f29b61db25f25f64145cf44d18fd0d78b9111beea3e76c69fd5902ca9502a5e24861a99017f7e750a8af09a4ed29f102811ce7e70e638819de114e8e7ec5f19431a9fff7e51ae424bb4743db7ab355783e1902d23a6603180e6bf134403fe8214a9712181429820e55bc5cd3b100854fce6fe01402d62f707b318f1b4b8b0f7fbc1d6fb4f2bc254bb0436bcc17e475350bcea4785533b6d9da28bf1b58e47d183a1e13f1eae0cf94bb3bb93bcedfdb41c87f0c0d2074448c732e96e9e9136f4644da8328f4d1b20a5b6833f18a1c56dbd65ee2cffed7d4b00e1c8ce26b5d72657501f6a891baf119b1bda0661030080788e7923a81f6b3ae14849178f3251c0c5e2fa32e338e17274d547136877750cc8d2790d8908c7068818b0a755afa7569908f9d32834e111f30cd7388f14f694f526e57873646ea125726a09cb55212fd37b07f42840ef1b416526b766e43bf86b910bb0df338ac2f494cb5ade53c96876cc2b983961eb8cfcb496d75b0144244ceb59263404fa1c323a39e9d49050accf00fc0aac0fc27c0a613e60f4cfe07f71613d487367e5b71af79b2d92ad18ad742902878f93285068b59a75a3708ac163566d1824fbebbd2080ba096615f16024274b2aa23fd405b380492df64585cd1e7e3a9433844d825f80d1eb16a09fd1fe0962afa42a128e476c45461ea1901e784d1469e955012c7aa4954af27090b1d5b7eaf782beb73e6e90bfacaedf430c87866f7b98b9ae86eec7ba0de7068f6019488276680ec4d15d91a6c11c48c360ffa07220d6ca28304cd5c4755f66fab71f6806b05a98d23f56c8c4862723ba7fe175c0a2bec9283411b505d19e5fd894ef72c9976c8a4db8fdbaf70c68974b3b24477c3d7a5bca8ff7d249841e96a420bb1a9feb52b1acdf1041a818039ba5ff2301258b14e6058150d9cfdae31d655b111393bc9ae9d1ad2a041101b474b68bc84026e7c782075df1a5f7d6b06f304769282e76d9575cf4e5bfc551ec5315cca1aca1e318c6ebd94950b335c0a408080153034ee2d019332c34d66fb4e011004cc338b7fc82723425042fb82785d3904d79c30963392d9579c1fefbf451413a557e0902159c7fee2b278293c2556e6ec4ca58fcba59255d3541386bd39dc1f64dde6a69e17455191384db188201843f290c21a03f72dd995ee220a59fc180c1959d8ed62ac4dc4d629e587170dd1afb21eb8d051707baa85448013091cdbcc13b5d09f7a5c4d21375b7031a2c8fce9cdfb88e840daf4fec321d0431da2ec444d6c636e15ab152033c867c23838a98442ef99cab90ae1e6287b7c1a1cd27e516ab3a81e1b10b8fe41374f4bf34a446aed089921ed245d15aa502cc86e9ccd09b9964f815e2e5ccca4e9246f2962a25dc7625ef841d846cf1d6e74dc2c11a6a2c7a5636caab41676caae31d076126f9572627e8e7b855df6f793618a9b3883121a87b42112567268d3c9942b32c25a96ce5910c899284d75c2e8684fb14771dec52f87e7b33ad48fe1f27bda72616b8239623c0640a3b270f8a1493d1b0b193fa0fa0614d868c878f53f9a10c57d9aa5c125f60119649da0fbcb1453c3a1f18d494f4f01a0a8b163140befdb3e5cecc2d1903bde1f9159234d7102ebec07d6be28dea3c463042ff566a1ff16305a631829eecc16ca4f970f350d36f2824af7cb8f2a8e3deb3668719280917a369f4247bd470e1f11f90834a425e27426a282296dec151971cc4a6dd7127ae6e4c25882fac02209ab368357c9a548682a46f900b47c6be8b65e54916095d3ee699a9826713724c853d4ba833118cea59dceb2f98b454fbd5c678560ebff8241fabc9ef58d66972b1959f1db61bab6670bd6da724e250b376a8e7ce5813d04e48e4f475df6f47309e357bc3df256e1a2a70029a410223cf85d137df3bf227e426c145c3361fb8a4616f056c64aa9eb74ae91bfaf1766dc000bd94672798a00ce741abed3144175bd2b820afde4ae29aba0b8e89be0db9f02289f305c266ad8dacb389fee6c6998afc395d1313df391efe416e6edd53f1fd9b03380c94cce1cedc3516c14faea3fb2eed8508bfc066661314e59411c1f5574a97f486e0e140d8d842e94c16a738f8d8d95775d7b348e4db70c171fc7ee3f181d624a17c1d35e6aeb8c7bb979acaf1338a824dd5d65ed48da65adaa39f78592ab2afbbda75d9cce718709677c8e7e0904ec62e32c7b6301a93aa250fc5914b8e4531891ab7dd819642b22ec99221d087dc65b0c3a24982322420fb79d5567898c6295b51dfebf327cda4d0dd1e1abacfae9ced1eb50e5fc43744621ba095deb3ea95d2008f414fd41f8e0ff340e3ce8f559cbf7ab48fda143d084211dc89d939b33a0bd3d2fd3473a1b1e59cfded82be673de35e00e1fb640adcf5cff0fa4c0ca78b8f53602a61400174cd04630a67c4993e5a1e76f3dee5c7a7e3e6cd2a7c1af62a0931928a2feda0d8541d6df79b3c755fdb96c5303a55170a4d8d189df7677b6a17bfc2c47017ecb5e0161edc6986a2c4414bb950c0e234da864d898cbaa7bd0c16c4b7c63ebc21fc3ad3a7966af7a3fd29845b575a67a5c1df45c1ef26068c812a7a552307bbddcc74ddebc9318f959aadb3582ce82762565b566c4bda0f937c6d728f9032c3da7007d44eae1d54493ee8e43149e0b4babc81cf65c8f92d92a0134e7bbbd98d617a917a1995eb2816db8d56b020cc37a1a999e9928d993d47ea357a10280752b3f2d419ee7a2153647916f1623009268187bcb95a9946da8cca2e17e34a6e80d72873570e790b03c3c192cb50393d4f4476e6fb639d5bc76af0e958758c1e16f086570e7a6ebfb0726a3b7d7ab16dd29838dac9151279d89b7ac5f21446f0102d6fda695c2ae8481976fee77066d4000bf2c0bda2f18f7dffa26e096d8cd98bd75736cfe9c1531e0b0f0bf817d3422daa67862b2f6e4c0577425535a65daddddfd6ab4f6f03e0517fd50fb33b7220fe081ea842c45ead382a2081bb67ab53699e45e3ea76425d4d50bb25e04245732959f30f772ebfd688751c5c518c3bd4f2c6d57726cea07f1f6e2f2d0ae57ee1aa0241c222c64961b5a7619aaed463cf5a2873de9b4afe0ed71967cb21bbbcab85ce995f972e8c69f760634edd19f5d6db307351cd0a8afd6ad2fab5b38384e82e401ed5a143600ebce4db724b538e9d567de5d63fe4a730715260581ee0503c0770897c976f7b6d6ef544587a574f3404ff8e1b8381fa52d958e782ff260aac0362a14079e06f8f5c09828d2e545e35093b31df05a60eaf2c743bd6549ef2867207ab648afb3646dde3ad9c323efb1b4ec8d221d8c4b57d0e39ad2c52f5037292ac4692655f7eaa4ce52f242d99152e54ba88e2a9e4efb3af2bc2bc885a580b65c7608b814dc68918aa1d12efd4b18a85ad42430e5d4df300f5ead20c647674ec7c42382378d6b754c70f1e53f04e03b6ebd8b668215463dce4b780e7347ce1dc860fc36b24defe94316c0379aeceedd4895fa06252fb9286e14901b642d2cffa35b0539bcd8113fa8b59878c4953db36bf5a8b22900a58ea4dd87fd28e4257214436a11881797493ac5ba5d6acba6b4c602da827d76f6b83396f128481b7d1ff489b796b72432d94c858f82f1c2527ad305a96b6c52d405b4a06d727413bc214c8afbfe6889b55be5aaddba562cf4f8dda95dc342d863041e0bc0905171221c613ae6d5db1a24e7b09fc64a190bed5cab02857590841c4acf7ff85759336ef166676778a1db6c13eff4df632da8b221af39c31da96c221b477a637b1bb4e8256e350502594376c046a922966f81fff07326ff4238c41952edc6b9d9eba55eaff6a64a829073cee3df1b19b00ae0054e840cbad0d9233234242829542296c360f83e7f265da7ad9769a1a6e9314b8cdab8d120cf1a54a9468b4fce2bb87f825e127e8db0ed04cf0e05715ba3aa92314257c36fc75305a51ff04af30eb061123901b8de7f65cea1de2314298bb72dc88fce80dd7e1df230cce17aec18b611141c569c5446d95f858f4ca343e6d911880b9edcc31c9b0a5b02f84d6880013cec671d34adcfaa109985fcc608a10ef98f648511de68a3351f0af91f5f61048df4509db72f8d9ddefacda365942edaae2cf0d0604fcfc79609324ab1b44b56153923d7d3cb8bee012fc3a71e64f3492e021c36d32580e57d71c2142dcf4f4de7469488b23863864eb7717e571c2e8947c335401b26cc59149c8298d8044b5001e6ec0b5586a1bc629c3edc50bbea87f6ee06b6665789abb130b4590bd099d8ecc71c5ebb19c3a30e8c745b801084e561cad9e0a958bbba5f61af8dd6ce126c422f5639d825fae06f724ea22a3c4f02b983b6902b9aa4a799e232c322421556a130ec29b852c1d7259e1c9a584b0798c03bdbd64d00afcad065f1c398840b94e1adb23759ccc45a56a652902cd23eef567a0f3b9562efcdd24d5ee9633c5b0731b20a90bc04fee9d76dac786806c431fa9ab54f5fde6ef56a0f07f4b8801e155b59bba9c87b4af4d5703f75cba5a045accff6ac9f8f26f103546c6449a4fd505f537c610781cd1f568b6d02cbb0894b352f148d6faf9866763c3f39f0eb90bb7f3defbf4b4d2c976d109c85ed3617f65d74da8d653841deebd05cf18dc98ccedf2eb3e12cb8695e348e0429767b1d1ef293c97b337492d231f60b36124d113fbdf849cbbc53f68689079ec8a94f4ccb58c835d93f4f185a343ae8c9aeea6ddce1c1cc3cdfd9b60c8bb5a9dade58525d551259fdc09ed48dae46f711b922010df8c5c9ce45f037b50608e3cf0115334baabf7bbfe51ea274b7ce0d2a175df096ddbe26b63c73e81f0b6d24b70931038b71e78899c4a35f9bea9aa87f39b7572628a52c01aaee1fc6b59121ca4331f7bc3d3ffb68ad98ce3cefffc64539ba6d857d3ac046bb8bea5ba15661ba542f14563934faa642c44c9540c32a6c04d35504acf20a898902d59430ebb64c2b00d78f313234d48f0fea36e11704fd314201172ea76e5340224f29c684b71c3db731d2fbc87d36c14bc57c6eee4bc3bd962046389f2c276e22c2120935ba0c5d6199e94ae6bcc069c43e4ee902262f4dfce6c7b6ff622e3af847d7e27ac8369a5a42bcf705e9c0d4aa52a13c6b54cdb5f99de55d5815eac050460dde085ef60c734c76eaed9646160ff1da8e3d9d566bf05c045e7492d56cf32affec42c874e64bcfcdd4aa5108a84d1863ba856259c356bd0358e63ab125c4f0a937996d24def3f7a8bd225b86956dfff477f317dc2b9595eb8e8f34f535c3b8a0cd609b15aed5a19cc5ed1213cd522adcd4a00dffe5f04cadefed0c0252efceef8436469ef3c8d916ccac4ffdeb653f8d3c80d90f6db6e58eccebd4d5e69fb4ac78c3e9cd62d89fdca185069279e7dad94fd1de6cb56bfc30cb2b565cbb72e304845aa92c2704b1b5f50a4486cdd1219ec5f97a91c6ec43f16b6512fb16b9ea54e9628952e6a43996fed06eaf1ea5db46dca12dd31ed22da1fc35e95fe49376964ec2e2dab793f3d68f52bdd22e2aec295ff19398002787ee90934a2b494b3e77d3dc4d41279a390cb80fcd17ec16d027253fb9dd5ce701b36b3b00f16efe46b99742d6898df150d36b31de948321d8c1fb46482e0f66473406d5da3f1ca845dbda34e67673b2975db2eb4405af6d5ea342b2f054aaeb26ba06bcb385384a47711fe6610be8eb82111e50790a848a2775677c99aebe0bc284805070aa46f9a7d02d35f3ba2f47ffb0d09ba4b73c245c20bf89e77aa76cd99a653229a7a8ffade8c311e915bfb7220a6e20d751c171f08aefefa2905305fabc73efd42f486ed76cf54aea73e83edce58a9b44c4a4b714ab1430745e4976daefccf260e3269c3686aaadfeabf888ee3b6bc1acdde77b6e3d58a265f7ef1f261b53da8131baac4976549aa2a38202d25a884726362a29d721d4e08dad5b6b86bd72d12b46a2770cc416d73ab5e837e3cf2deba044a26888c3feb72af6d8dc32932bef17a67cd5044a349e604c453b6753d559a38c9b62878b94e28e68bbf27c29e53442dbcfed9fe5a01eb95e3d8e1c8a8c370fafae9e1ea520e11ad306bb49add65bd145484a2e6a6ca741e5bcfeaf9a91690dcb6c18553631deb0cf9fbc6a50f1c520d149a58a4b8b0f9f7babe6f190bbb70ef0e354b7b07b3f20a82d6efc0301fb9d863db6bf1c88b3d0abae8b92674f60f2bd61e86eb2af134d53215ff69f14d6a97a461d0cd85f597d7e3a598dc2c6450c9819228f516900f3660a69b703822166b0489937f0c3d169522027d838b7d564c1e0aad2cf3aa97e0095ffbcfbdf64c70c7e91d0c6362c5225c6083a996ab6774117edf6aea75aea7c1a29efdd88c9e3df6d5d57d25c3da01b9348e53240182f7f5da83ffb0b55dacc4667dfe3f6db350f254ac55401003d289eb1425a30919321d06ca756129927551ca38e8078e0cc095e10e740e535b7e9b5e4b24448e9f40707b85cbbe895ba62a29f7d38a075132fd5a4eb00cfd9f6cf1a9b5b096d9ce92e9abe99e28b0a23ac60bd9dba20f96059d417bdad9b2bd2096f5218b404ad4b88276a000be3a87a3f932db6cf02c6537aa4dfa88e7ada2e9a73445ec6e06289250c5cc7a928d54fb4a267069e83bfff7d83c10093760b2c12be14e9cafd960055f16c8e3ded4a14be15c32c895a3d17912388b890100568fecb947b1409f27e3236075438a0247ffa5f94235e9d5f0f7e227054afe05beb77f28c4bd54a2a4ce17b5b96cc5f2bc92715984bab23e4da16ee646f34b2b1ef2a5c84d695368ff080076b989ecc602a4e14416bd41157ee125225e41e0fbbbc4d8c88b1b490b855fba06dc2077bb44beea37fa3962c69473da0a26e4bdaf0e9992c95365c34ebe9ff860c601f8e2f451e3b14a6985ee17a9f7e73c1fd8f4c46526770bddd0668d5aad8fe12818e10801662026842e0ae4acb426d453bedc953ed9086892165d6545628929a968d96a506887c9698c953eab3879b7534347a632e15a3418a32aac7a619ebc09f78cc913d043ea0f447a880b65bbdae46931c5df7867730fe76c0a46c27b9407ea3dc35bd63cd1707fd0db4cc91409923d5387b98e60b2fc5accf0062c9448e62581b8ab377592d127366e6bf6ff894cf41b014ffaef2af16f349118b7008120ff2633948c545e1ff94a8c5e7a6bb26f6410b2bbdfadd86d707e46e1aac256f88c289ef83037b5dad7b2f50614073ffedd774800147652676e2c1016377cf73ae0ca11f8ec5c3f70df0d301b155432762fa48e7b318abb42f03d7853beefe26172d0cafd650a79d12e427f5832eacb00dc15b651e6e4ab4fbdbfaeefc28e43eca0397224ac4fd22232ba46d7934ddadb18a5f575c2b62636ac390c8126d8243976e362470bb154f8836d8f0f966a087bb89fe87865cd491743ce0ab3e74d4f27f588961fc6a7c7ed762c8cbc06ae6af33fb5c8fb8201c64a3bd82cd8d500771baa35d4aa3c8fa58d262ab283773be243e126d57df275e76136593501e7e060fb4256486f436573e1c855cb50e2e8ce542102275781007b7e139428c48005bfe030de4b181a8ffc207716ac4a8e9c877f37a68026ebb57662470c9942c03d3147e041be78e9511ae51e923ac05ecf7f7a0a06bee3a7e3f934cb50f69e50d5da1017945828e7f1b0305baedbea925a7f2b94389d367adfb9d660af9a14f4bde39d35444efffba9c6a3060096994051c4a98bceed94f05c3bc23757c30414072ca93c5c85efec042b4d0395a9b54e9c691b568980bdac82dae2908e6d25a30fe8936229ef21ca5edeca163a6779d83923d2dcb4aa585c52b2063d64a469261ed12a632eceeb8d987a94c9315523634bd821dfecfba4c05c35d44009767c4f444d50254807f6fd2a30e0bff7968be59f0a2ad94872d0520f8b9e6201cadfeda5f2c0165e75b93f7e4d1335af4febb92d97f22273336981845df25d04e8c51bdf033899aa5cf47295c7dec2ee2b82fa35f3dcc9c8e3fad8e8c2fcf5996766fc7b412d76eb9489968c2e1a8cbd0484861393a771ab7cfa73f85f17aa697e1ebe82c5568181d384c93862d0fad4166fdeab4ea8a70224098238e18ba1682da0b989923e1182c511dfadd8ec8c974501b07960ebc18461a2c3d7d02bba702e8e79151b5b1b36f0861d55bafbd5112aa2ce0f35be4bb8d3267a077803009dac41905dae489ca8f5a34cc9e16a34cb4223a75093d52e8187727f859634c12622168aee678c0c0778458b6c44c55263b74713b058dc45726fc5f5cb6536ac0d65abb1ed42c2825ca227a3b10c540d1d91ba5a3de25e3182238e64cc0881e97c267299035a283c34bd59d0ee2529cda7710a9ca136795c6be6a032ad61cbd7c5189149e202a41ee841576cd1187705160bbfab55136714c5ae4641a1baebd38974243da0f30d9487d4d6fcf2411a2044a585753b0f4d0c01359979200eca4c5c6dbb64e0baa0564170ee5959ba6dfd83bb2bda45b8b33c143c78108e5600cd866fe5d3045de239e5cda56a8b20debad5390bba5afe21dccab9f70cc87940d0862cabfc5bc6d52fa397af112d5f151b9c92b36e9ae197f3c518acb3e7bb3b3cb16146317d700a4f8937a9d7ba83181915681a8cf5840f91202d93eb5e961e37b16980de8c0135baf6cb141b50a3640fe41e0ec19eed0cbb618fac86f8d03adcb96aacb1a35e84aef151b9be6c21a15ee463fbb491d3cfe3a4967182284ee96850a150eab1086c5818ed01c6f3c90adec55d78cba5d3c3a9e2c9ed0f4a11f149c15885f14c815bcc13f7d4c7d6c04c8e2e8cf45fda1f8225b20b14c2dacc7f01ec0ff9f7b7d6c53c6befe75773fceb4d4dbc875b862cc534a88595651b98e78db042c6166b0c082f2c0571e4a477cb8ca0d90832b7ab2c26e77bda2cb321c3ab7195f1a9d450a23eb9be856a1cd4d7d76c7691d0fec33340a30c17d6c4fa58f30815bae406fa78256adfc5545468abc884efd0efc3e8bd1d287ede4e8042ff8cff42a7a4340be0ea4d518f186ccb0ad3bf14c55e5c9aef0a53065c3a7c68c0238c1a227f484f2cb0316e591c428e22f143173b5aa7cf3d7316f5fdb108db468192efc47f2f61435fbc27cdc435cf7eefc86ffcacb62c9dd4056de00850d8877577cb3d3a5d8ea024e40c28e7f272769b33047bce351c4d9ee71cdcd0e59d33924aa3e89c71b608e76bc3b00b5f8f7130ad11a65748b828825cdb5d9f18a90522681888ffd340fc9f03f17f0ff4f1af80e05694ebe2c3b14814ec48a42749d4ad24de9349a4c9490c2118eb9823ddf7d2eb8dc4a6a1ef0eba909b8b2ab2a2b2f0a7a38905a42b30900417330ab7e9a8de4e88dc1877ffad341988907a8cbc09ecd3fbdc8ade79216e2dbd1a14c8509f4e8d04e6f30ca389618dacd6920595682f61e00280505af5dbb5704cfb469c3b39a7f78cc79634e2e15289fe2602d37d5623147e0f887af07ca5e452e55c3da7695e38574b9bb748732edbdc756a2f38bfc2a7793c58886f79632c689b3c5a16383f1e8316fca796b910e14e631a24f4d38c5f50763b0eacb088eb0771db745a0a5fcc6a41b13127665a9b9b2bf9172bc9301cd59e3457ba7486f039ca478b085433239f266c9a27dadfc2912dcf7cda0b589678ca6db989e832389429819817261f346e267ffc06706847efd290bde62728151c495b62922822271b39120a4770cb6c89a494928a22c43e811c46d4542c77324a220da0e7f52b79e0e3b1c8a0b80bc88b090356e01748eb21d84a7e24803844e2391055443514cae9d7e25221f8b12614ef2bb9554e27e35b10cb5aa154be3345f0b1b17bb02c1e7dd31a6c267045b5895a1d3f6a81d9b4772c1f670e9a7679ab915ded512525e7318f794e5dfe78b8d7f2c48fe805f5b75148d447e6bd4551e9775f4fc8848debd856b7f8b812531e3fe16fc0730b14d4410cbb9f16ddbb9c7de21afc16b895852c07de1429dc62b1e0e2a1782e6a08cb6ad590312003d2de19aa4046f4859b2afc79fa34c6f147d7cbd3a1f385f3fba99b866eda0c8624025527e8a371c41c85114a5f5bed61201193263f6770b21c5c1d5fc2e08ee3f06a5035223269c53ab6319fcdc3ad2a59726a70dbd8b011ccf39deee7ace7bfd2fd197b0d862c4611aeb684b2ce98301db582b44affbc50fe40127e9f4925d3a318ee6c819cfb0802053bbe81c47195bbc4870de81a4a632b334a6220273c28b6e8d51d626d7617f6830fdcb1c75980bd8f0c5e5c310f7ef76657b336bdc8fa4437c3258b8794ed1848fbc3a8814f6b273f3838c7dca3aec7a62f415bd9a45a6af9bfb083912a35791a32f155f15ba1b07badf804b5c042413ad3da04155e7d8b3ad3db432bf06c6996d5fbd0aa843db6fb4c6fd34c6a026de92b5764d92c5aafe9f93e1febdf7c247c4a1ecb2c34148ead53569d55c332e93b5aeef02a5500570a0e7e14c5fac0d0365d7c3f8b414099e17d4d94869de3576c6e0e1820218dd27368c2edda1413e776820f28f1dda91a53f656deb3308f6d5f37555790efa587df19b26e8a6be29785d126b9a5ac06ca1498bf188cc6582a60fa150ae7ccac7fe4c6a113b5f56cfc88c7f11f63e1b5a0ef5f0c952c404a0dcca56f77f6080244e3ce067d1412082ac1ebef61ccc9139a0bf064eb9c0fc12fb56dfd42bd06a89237075097086df303b1def7f67b1cbd6da182c956e5097b2228b1c2a42ef1ff0834a7c0106d02f021c1ccda9841156fbd9769b1cb9500baac77efc0da2a211ee3c58b4838d6d6d2d72ce930743e3a6aa4094ebd1233fcfa9c186149b1beaa63c86e331dffdd19e633423d7a8fd32f6313c5c02acf3d663eb38a2b6879b4304e7494b6011deb369a9978dcc224d9cafd6f28ae639c61dd89db562f9d0049d0e69c08c7bce70e670a05ec9e9d04f9140df76573116c95178b4f75a5353270f768ac306f48c500a2f703227578e38108184b153de00d5237768f91c117ad96453cf45c29ac2249ae5b05ad156222d5ac6ff6cc799cbb3d2083fc54232d556b467b9799063460d69429007e4ae4241a47e10c8dd25394e3185ed67db2091d643d6b750206bb8cf3fe9104c874ad963efeb2d21f67dc26c2080b906d2150e3698e52a699907f648c1f7408ccd301ba51c14759404a69261d4481c318e1f06ee85cfb0014560a0c71502492f1ea9cb9b3883f63f3cdabd54a7c58bcb72b1cc00b3b06ec3be67d33ac5b2a3ad6a5ee27845b158e222eaad93c5948f85e28289b1db112912de5de726f29a5943200043704c404ff345aadd7c7984410102d1bc5c12794e2611872649664f5fb3fb5fb0cb80b8e6493823d29a064a7d48947f4f173af37883988a81a71513afe2114f9b9177a0b063d2792f949ee65dd7d0e647e4ec9998ebf53b2a5ebcf419f45fe44d5881be904398f24d39e55a399c4d4819ea81add0c06fd862cf41c44927b2bf4fa85c6a1a01f42b1017c30bffd0e0ff441621253efc045a59ff165a29248a2d2e8c85d91fb3d29e880768ee69c73eef2063d77d9033de7eef3386708fb49f7b9d71ef96d0a26717ffffedd263218016512aa5d9ffbd9d35b7ff7de1677625d0b34ad57ea57fe3f9f3b6b3f1bce91ec1effcff39fe00fbf3ff7fedcbcadf7348bf53b4ceb0fb56896389109e17bbf1f65a2ec8acb7effeccaae0ccb464cf47302fa5bcc1de715338aedd36a65d4bec939e79cbb9cf37b469f7eef3bd19b799ee7719e48d630376616b30fc69d16b9ff4410cc3a164130eb4a75c445da9556ef705a230c3db1f08604ab777ddeacc6dcacae589d99564a7aae5fbab502d2ed13d51115c9d27aab38bbe5df132743272a5a5d20cd32099d3e6f499cfa02fabc2101d3e918eff6bb7c2d0ee3f76b70727ea9c8002d413be6eaf7c1e8597f3eeb0510f52725f034570b3bc93be65d96dd9f1f6b2d4deb2d765cf770073f74cb3d884eff04b3e6decbdeed599cb777f6f7166bf7c42d5218d9d35f0c4e12756bff93c1c9ddc5cefb09660f83d9f3d8c2f6fab6ab59ba3b3f50ebdf6c5ff696cb95c609551a37f24af3681657849dab948a97572ddabe06e1e1e13c77dc4f6bab4c7f3501be96e99f9f0f0404040404c439df9c733ee64a03fa2db2b000485c31eb402fd39c03bd8cca64b2c9c2823faaf47152ee94266a7112f1a7a2d08f387f24f96f202e92223a7f5df7be611b7c0b9a001f68ffcf1fd5ce5bd42edb7f64f5164948f5fa1f149f4f521d188c94f3307c6f0f51af4bb5a852275eeb407382fad9e058fa49e39f3311f07943a242f79c9e15c4e0a84f5083b1038a4516f7c4c841065f8a8e9f0316544dc76f9fa42ca8a5d24174a6133afe2e69aae9789c73823b92b923e977c0443fdbdfaf3d88f83b8856dcf0d5bb1f4261bffb0fdf99081f8bf385f0cf39c1b5ef3d16499bab5cf4ee7624ac6b0e3411be15393c1665734ef09d7e2ddb1a3cd1fd86cfe28607129534a9ffe783c4a1f067eff097ff1587c2f7f01ffe138750e8fff0fa3f8c43e198c4d4837e088587e7efe1f9f39f608a268a3403c409fb39bf0731e83b90e0e7171295807ef69164ea1b46527ffe230b420c12674af9f9486612a21238325530a91387bcef80b2a07d6c8bb09ebf05d73d0ebc6fc1f5ef8b45005858d0272801262add8e7386c8df811adcef2ac882763bdeb7b25e4911b5265efbbc2189d2e9cfaf126022e99c213069c7fb33697e3faa754edabcf6bf5b443fa3853c8ff6d001039ac32c67211161b84145101731f67993d2a44f09f49c1dd0053ba42a6d4aa9eab47f6138f99d7e6038f9bb568dc0e8cf9eeab4d68893b9e76a64ed4dca903efb156fe540578d6a07a2a0748ea0ebbeab276a67e268154103f1797968437c7478083cb1c801ad95d27a7fb06a109d44bb8ccf4e27d10e72cb01479fb729525d449f372965fa0433e0369f16687d9332a3b7a89d45d73bb87dfe0ca13f8fcb38c516f3b76f472115481e3377a2eadefbec754fa7d1e54e54b476dc3864bf62e98e3b515dfca39eb5823b82de91e3964640e74acbdf1a8e79f74e5498fb0bdc394340c7b34ac34f5469f8bf3afc67347c8faa94bd951b2daf55279d447b1da2e2a6cf1b153108e8f346054827d22c85939c771f569103daf1e351c8bc51b9d3eb8d0a903e414bb91395f7936b1a71eff149c1fcc43b849f76dc8fead72e7a7227aa6adf896a7e8c0f31ae4a2f5469f50b2773aff995a8a8a4c52d8a988ea5d3e7732469add5de5b1437417ddea2d0a1d382e959f5c764d65b142075fe0c99467061c996269b90315eca6445a9a1434e14102ebe17cf2d1b980f185a365200e2c5c5fbbc5d795dc1c1f21da1e3dcaad58ae45caba2015b37705505a5ca5745e60aeb2302250914214386d466b3cfc7bdb35aed4321e7da27e4499ca8277966407941e33b01ecf306a504284f4e703401f2a5709d0071faa69e6875afcfdb9336ddcf90dafff4ace212958aad757dfddea842f6765ca22ffbfd601d399765b9ff8dd5c377e0f01e9ec32f51a910fafa94fe7d15f4ef7dfadea8220cc714e312958a0e4fc7a59a2deabec37b183b8c4b47745caae3d2dba2ee85460d8a7b5ca21aa2c0f779bfb4ff7b6f54f1f3b271894ad9a2ee7f9e3e1df7b8b4812dd2631d97a81ea5ead371a9fe12950afa755c5aa252b19f8e4b1eb045ddef5f7a5e03fa8934bfea93d4c50619169f484147f667894a85fea0718922e9ff7920918b1f50a9d8239db21f4cc9b038376dd148ab6c912ccb1e3f58a2aac044c2cffd44fac60ff04f24925675a4273c9e54f5a114dc5f802261a439eb7e986ced88d4be1eb5afc7ecce6814df4d9cb83e6f4cf4f4796342a78795d604c785d2b3de8c343390ed2f73301ea04be0125affe538ae130abfe65bef51adf75e5b9f5e1616d44a670993bb611d4fcde7e657f21b269501a915c2b054a7583803a0092a725218e32b75af075226ec98efe573c405959b8eed631137ce9de1c6c4cd6d89d70dbb61565a68da11757ba2901c9e87df0a663c52ada0bef5bec7527ad3bec7a10bd407bf02f541a6ee89641649dabdc7dd33f54f9c5ed8d230ef8b1f528efe9c765adc91dcbd02efdf724f0ff73c3173fb73e2e4774ac5ceabc38f320617bcf7f6be0ded982d1d1bc0d5b9e89ee31ee359a9c84d90eb680bab74c7bc655c1ab6c1378393d445f71bd0e1b49f68d1b9dfa0059dc1c907e1b5abcd347c5aa7350f8ee6f00b92f6d3bf43a2efc915661e3ece99f3307aac7410233a7e4cd9a167945a5e9e769797261f6351c4b2c074589b7d65464c183b5b1bcc4d9f70a599583d31b2bd7e3cedd029947b4c97a78da54b93fe3276436c3b8169ad361a8f191d6160d8da696e2b5c6db1da3f8ce8f9a1ab765c29dd7079d269b834ddc6760e3136601f9f3648cce83c61b66d6b8fdd5eb8d2345869279e8d4cf1fca30e8fcd428e5d26cacc1619bac716177a053cfb84ad399dac45817513b6dc74b256ab5b67bab5b656b3236e1db10ca0472b0ea7652706d6da0375b5d080b25a724069f131430b11195f9f372d55390a97f5e66967c9a9a1b3c6687c5ab49c760fad1b9b8be31d5352dca85585af6e5c1edad0da82b5c0689981d27a0146163e323ecfac2a32b2b2a09a6e9698cfdc9c3baec55598602be50f5ce508aea2e40508236731c1530b31c7a283e5d427c8e3da7bedd787e33e6f5948b48f22fb0ceffabc65fdf8fabc6591d0657ddeb29e3af9b5215866b318f7ce6ab519b53004698421bc828cc1991a224605c9840a546b81db1d02c7250dbeecc197cd3a51f54e4cfad916d9a2ef8866df48ce886c17562312730fcab8b3d2ba51891b67aef64bad9b83a0002769b3fab4fa21c84cbe91a5485334bd30465ca4af89533b6794037a760d6e56b26627ad05fb70fad62ed1b386350eb534e08b594de80a812f665a73ccd49245ac7c80cc06c40216ca3b36b1925b52868a0d3d34cf0957ca3d2e9401b0e5d8521e29ab941e6c71ca0db6362575514309005b8df26a5d1193a4061a3a8e946a6c3fa84a3e6567802fa551016a36242502388efbd12dc16264acc80f2a61362c357cbc30c158f0526e296918c1802e25016c5e25079b958966cae92a1d60b395784a05d8b80e60a350a80b70a81ca921f30684654830c9d03a15d86809b38517e88cf905553229876c45ca06d83e9bcd28708d658181cd141c6c6e54e1b2e183564d2c694a27e5d4f3b67966b611a2b73ae58fcd4709011b9d9ac4a92cb2dde051d229585f614a01d8e64c3a251d414cc9a7245282b0bd29b94ddc9300db84214896d20c1a37e502b62d0a9d010ccc56530d2568c391029b12061d60ca382a941d6c67a80c9c8dae40ade6581f6ac2fc426374116100b7cb572a870ccf63ca6142982815a682147182d4d9e85de77483bf95b9664e49a624b2d11f1e081a37aa60f882254a9a282b4ca646352da010a60c6d5cdc944fd34c9f3463a5089b1d252188a15742d8289b69470b96b24af9c1d6c346417833f3d020a4ab9452d26c256cb4c98e72e2a121c80282112871b05ee408418e6d4aab9cc0b695a566665160a36131d028e91a2e655439b3c1b0b51170404912c78431355055ae9ea6bc9429279cc915c315091b25c16b8669dbbc33add029faa4ac494ac078c993450e1822f6c94a93d454906d0cd60b6a64862903d8c475016194b5101c98404dc4bcc2b931b4457516de107552cbe1adfb4de19f1c4e9f572314dcabd6aedaaf6febac62adbd8ef46b5217b4e33440d1817edf8ae49881d895eed79f59651d98818dfae67c732eb9f1db302c00cfdc16d90fbf2f8ec13401f8bc7a003cac94d671c6a903b400f8bcdce5f61a3e723c01f14e3bfcede824da0300a401c0e7958068883b51e90e78edf346854ebdbcd2760d9ce4dce438fa958269a7591b6077bd95abf513e3d656fb1cfd4fcc5a5b2d140de2039f3f396badb5f689685f9ddf0ccfcb7ab0548dbea7851e08a286dc7a9ee729e5b93dcfdacecabe8b96f0becb2daa6c141ac9da3b8c71873b6c3dcf0dad947a626809fa9f77a6abf5bfe7f07fed9e57e7baeecb167d4971de47bfdbfdeb3e05ed4472c5e6aa5ad714b6a87a5de4ed1d16870d35a8524a3d319de7d5795efd0bf2ba68023efa55b9667d20dc7d87ee7fea57c761ac5d5ed737a36b6badf5ba4472772091dca038fbc5ea9e62fa1556158a343f8dd3abd785a71bafabdeaa7e49fa352245fdbab95b31dd0875f0c91ad6efffa4003f4f37f5ebbed7e5757ddfe77975afebbaceebb24369649446991c541c277df7a0af6c5cacc9ea6b747c85ad19024af5290a840e99a18b9f814fa566cc867c9ee7799fa894a7f6bcefa3de1755bf0a4a758a31fe32c623c6d81b95becf8ff148de8a31aeb892208feafd083aae168350b444fd8e0471607b54abf7158ccaa054bf947b95528ed26ab9ade3f7dea8630c1a6b05a148500a94ea1d074f043dfe0912c1289a80cefe86e7307278a191cc1657fa1d84ea2bd14aedf39f0eb68acc3c242fb7158ceaba0ec4eafac318e3ec8d60547df0c876f4f3e0be0e3bc256d9a2fb9cebf02a94850279e8852118c57d4fb6e83afefa95ae08fb475780e048aef046300a146dadf22a54efc2b0f3b22ce8fd06a368090a46815260d406fa41ca8d2c74d010e1029362c1f6a8c2a3df2a5336b83e6f68ee705d4a29a594524ae9fda33abfc6c9a2ebf6e9ee6c3e41ad58bd9cc749a34f276d76db8ab64f0b74810e3837346ebafe40133229dc034fd86e5f7f93567b65f6ed3839313008bf3453eaa57327e94867aed8dea798a4239705cd1609f90bc758aaf8b5a2b9d03ca1c38ff4a13e6f6870a0a941c2a560099cacf51a891741e20161a5d544dccecce9b6cfdb191abaa6f286b780668389a1614b4bb132c3931da5ca8e90ab1e2ae4d070ce406d1b679af6e4e922672f8133829a225d32703973e5eb2a4e122d0211dd666a3319618899a83133309ae8b122b6d7c4a097acc1e1b56378c9c23245ca1c25688c683114b290b0e7b42015a305199a0b9f21357c7be2386903a3050df6854cd68642656f61a2c350dd80ecad1d9a87cdaa0c0d1084322e76d8e133431217b89cd14dc26c1c5ab6952a1a89934fcf912d27853dc3042138f40c5e4f34bc5e38c1e322ac84173490341bc8982db64543b9e9325042401266c836e1843722b44026846d868c935633f6e59983020c7bbeb61519225db40b2cd41065e7b1d25b45b0f8b8a103842e1b5b86ae18fac89e2e3a34c07eb0d945ca68195c6cb2b8980266091c15f49b1f20942065cc8d1a63666c257d76581d6d93e1899b2066aa8041a3a573606d214df69115b49820523c36540983981adf981810a8eeec2f1ac8bcd17cd0dc11b349d8f2b262e4090a55ba498856d2a3cca1260cd48b304d35e4d94d72b0e068186ab696ae0f0f97efce95dde66a7749528388ae330535821730512a80811103f7f4c8e19ed816014cbb69e3c54c0a6174095b3b6ebbcad50856584688fcd021ecb8526eaa2f4f9bca9726d0c5581f3116c0d6b41963463f8589daca722baf5eb08ac1c8eef3636a8726a1d474b89e787035dd19db71c49280e9176d5c3023230c9e2d23b72d75b5039154a814ac192f6ac768480200140583160000181008860402712848c2589bfb1480086faa32623e24208ec23808822008621006601000400006001004011886a13046f43a002d76b00c9f3c245f144519f9fb7ba8e54e4bcab83bcf094d8bb6b25e2fc7f5c23ac17454cec19107521f081e993f948a28128cac923b995ce80e8e3b258e06eb01fc9c0989530d9e2ae354b65f18646c8e354cd25ee13700c2c4bcd14a35b494639332303c480900269b03d794595a5b00a35ebd4b1872301f4e3fe118c6ae74f116e96a2e6156765f072c807226c9b14ac7bb811e905387d8491110671e2061d75c24914f91e99cdd1b6268ad4c23e43d028391a19cf6ac7dd8370e3ebbdf5fcc2ef9e311c4e6bdc94bbbbf84e36ef87164bbb5aba433c6f91093dd8db0d77aca834305c161add1d64c1a10389aed08831b2f4b359ee47ccdbdfafc37c8c611937b42d1b098d973b38ad1bb9d97c7e0e41a84dc42298dbd6e9f57da4f9141506890ab3624e69abdd3412a57922960321426d2138f8866d8a01eaf760ef49501f0e6e8297b526d1f3bb5ccd221636bfaa89910b02ac547b84a4d5c398868cb558a7f7791df0f2ca12f7b14a31a1c89ebb64be67d2e0c082bd22b54133518697bf3241a8bec39cc8cb201d76c7f0f08e19f6b9c31ed28d466608a33caefa28203f071e6e250f7e4f8c5e093cf0a03e3c1e16a429217054f19b391a7532be82de2d9e861dc1bcf1d6a4b2ed98c634318a92f8fb664a3986597c508d1493ce88a53363503473bcb8600209690250ea5bc1f1675e62aa9a625c733593008a00c314f4f6e33f800a78015b34fd6bf78fdd368f49a96ec0a2f6ac9adef88ce7f341f7dc9ef7738e6bf4219c15225bd02145884cde855dfe0b0cb2b69aa95ad3281e87921874ac5fd6ab54b573d8b99a3144896a38fd619c9340a156b4fe8009c5819a0bd3b52d7b6208785a388a3a61bc0c627985fa085babdcd9b7640d205491b6549bf407125e3603f0841318adc424824212a6126428473c08ee24395d0f68170cc5bc9fd142d8e51f6c44cd782417b3a163ce507c0bb38b7a8146212cd9793a94054cb21bc955aafe2141d3a60cb6640265f08040233d910829b2e00ebd4c90a76f1946c675d10a0159e19abcbd4a2a9ae348855619a92eb4322780babfff8be944c6488600dbb1d7f5429caea2b8c2b5fd1327b073adea06f618a28a3d453238a83c7be07289b3203abb8fc10d950a5607cd30b911236046e3491e881d4107ca3a36fa632046a18d89a0d0fe583c42b110c7b70401b07ff93f74e129643418f4dc8260cf35d4e59179088ca038e2845cd28c0600737c4fd385d1a1ce4f887f8ef6bd998d7940cb367882bc4a465635b6f6e5790c88256d647330f26d9f8c050ead24678bb72f0f6961de40aabc798739e98c8f1ec45ef5d037fb1c0fd911e03a6934a926ccccdac68b7f8eb3f784d4ab2b15af8015279566485856432fae7689c45401f3f10511e3b2a0b6269c1398054aa9e14ed0eeb41c3ebe31bf92d87e23ac3f076246569d039212e6749b41bf935d115aa33b87a349e8d7c490bfd0dbdea1254538db48a64e318701bf96e3b323ac803188be3548140e0e32ea4c8af806b1fb46bcf1676b3739a40ef1bbe036a310f52febc0d05cb1a5d13256f5cc7a4a775bc3aa6a361032ccd43993112cb903e94986271a33f3e7fb4644c698a4af1b1e1e004260e59ca4e16be4a0fa9f8b49be25dfcad3e1daa591b6c6cdf750fe3fd7a6628b90e38dc9186ef3673c614698051802e5651fa27216f8d740b91e751e461869e7e6e9ae2b7c97614ed3aa3e2ac3365345f6c505eb6c080798d13db12b3d501a4615ba81862e370929bcde6f3a26f2340bbe5b092086c20901a4d81c9320c88717da7f1791923410dc713331eacd26dac09addf938318e6fe6628135fd8a00f7cbac6aab1048b21580ffd10d7039094fa0f47c55a186421aa01d5dc31ebff220ad7def4292787a5cb2668f35ea6f67a6bac46d944ac9990f5cb61436f5c68c398ca5c6b69d6d8f92eda8cac4f6a7c0162aa5dec4b36830a6c6f8ded916b8f86ea650b4a15ccdebb25041fe2984e04797d82dee679f65517f712e0ea40575b477bcdcc2db17fa5c6672efebf04042415461fe947db18de00aa4bd618ed873994f34fc67ac3bfc473d9965546c65db0c6dca7edab00ad94179787025da6744b578b6a84148e07e653ac77d139edcc0d13f12199b4556c68dce758087a7fa8177da2c8247eca70c658f4251b60dccf694a6c3f66b47d36d1581c779c104fb07af2aff4702a69d9f29c49406efaef456742b359935e503291ee7cf5a9f1c1748a3da74da81c42416e9ed175c89be781755f281556fb0871fb8584cdf9fb35a4d6fb60f5ac12b580932b28cf4f3d0c8dd1de2e837a5770e4764234cc84d5dab6c9819f237af72b0ebe08d75c53e7d0bf737109478f4983f298723b5612de31bcb4b31ed9f1ba7b0bd74475906e194ba317205bc6a4a2b1c8d56e12ae37f7b7d45be42110c9e07bc0efd91950792310e5f514778fdd66b784bcca16411424e86b3ee07cc4eae63f99a7fc7ad49766204d2656a210bba98290b2e6d71117767d1b54d67fad63ea860f98de3e8a413787fcb64dd9e281afa4f5fe77c09a97b24a45029ea1edc8b4228868cf795ebfa4358e377a25877c9b2f422cf24737a6870037ec43bc1f7245c7159a77734f90d2a74e293b2db3ed03ef133234c22b536402d524e4744e951371e0256e2eab89249e3181fa7aa8588f9635ceb091ea4e4721e06bcabd946a9d662e19ce4e9e84e324ffd95f39db1a20cd611625ad9ac5fc96a68afda1e02a60ad36ce6aed6b211fb2ecd0c06c1f2e2e8c150f3fa1a70d4ff0ee192afa42476143b0a94acedffc601c8283a8d13a781729783d77f40f3763a8a2415ca073449845e292a1e59c098be60f79289b7d205c353922a2120f38fc7572aeab366750f35031b5e43c58f96801ae7fe3892f95bb3ff1ba3311e7aecbf3b1897550338454e88f95959c1c4b1d2371d110189ac5d6cffe4f6086e097ec0c5a620ca36c682fa4322e4951b02c2aaaab1d56d92d6f4006494fe52e93b908eb4e55141ebceb2e0c3f37ac76039704e5c732503406e3f61f04294efe5a5c586554b6a6cb6d1083fe5acf8103cbcb42c9c17470ec1f801262258bd584c0dca6291de3f302c1a00d101c9fe8130917f73e432e84d0a73a2bc3783e48b8381486ef42192172086f6b578c998e4f573bb90b4087799b2d06fd558e536eac93a24706c51ccd7ac32080cc125d97f3907c705add857b4ccd8430e0c5413b6b08c42ce9bd3e12038ee6a6298fc66973232718e826dca72ee5cd8cabed7679329e54cf101f93af5180d174fde69f051aa2dea2697044c521eaaebab8f48d025068229d3ed11191f4a87abb795e9d537f8a8143512541491afa571e92996559bea92042230ef58c9130f7e03a76059b2688bb08ce0ba4c136c1f87973b223eaa759dad9a988387d204509068274df5722ccda57ff9b581ccc3055bd0a3b9dda23e3067348d76ba300d2fdab575f2b3109553f530381b56fbc56a2e798abdbe198e1b99094a4ce84b31843f1de46f7b6e04430ed547844c5ca057c9f73269891ac6a0298b5ad646acf7dbb95127ebd6863e16302393f8bdef7ef1daeb5b61a0475054170eed580f1790ed50033636c2325b51a563b88b59d1e02384a622c1c906e82ff0f1b1b8e595640acaec0cda691fa5b187d7914afb21c3131c565fe1ff6d868d671a1f705c9174231f73fd1a5a58f4b9d41706db44ca0847b7e0038b84aa5538893a30e0a9ce079603d86a3271520d24cd98676c218467809648cc4860c2a31e603095eb3dd63460051f612ba63abd58cb21df6fccce08be6abcb7c778929f32bcd8b4b56f2a887dd472ebda7b32fb5b41e6232e2062b5a38e62bccbcb569f1679982707d7ff70cff3d07f272fda3d0ccfb8c23e9b5e01f88914342b18e0cf585160f124485a5d5eb6fdf38f41381909eed5cec57fd75f01ffa304f6113a1848eedd4f271760cdf873e6c4be7652b5f5d7010ad8272eb6ad6b1bb3babe773010ced26c01b5bc895503bfe5a309e73046ae9bc8be6bb3833714c695872ed625ede2aa8a6bab5e55dbd5534cfc42132dd8ced2d092c99fc560b65d28a7551b7469597d7bb272957f1dbf8728e0860b7953658394964780a661ca90f96484eb0ddf1c8bc1b6b61c3fe30b36e371fcc491d4bc2719d29c501d27183331fd9467d151be85805f43e8e3eae47b554a2f3a3bc0205d47135cee1a74cf0140f1b4ccd1714016ef03635576277a70a2d724364cbdecf861ca6423b2a4a779323abd9703e3ec21adbd104f584c453c735414af2803116623ab5a180f3c2642867847d6cbf1c328f4f5340f592352f93d91a2f49060fee45d9b8ca04eecf189a53f7544ae153528238993004c61c229343fff5958dc82dc35f7945d0cd6c508a6fa3e513fe5c9955cad1dad009acfe5c1027c69c8b089cb2c0ac28fab4bde721776d12596afbea31da7f5f1d4eb99fcb9962442338a139d3a342a2f4d487fc616047504adc613eef23aaefdb782e566b7e3849b988835bccc42b9af24371f78d54983fdc2e50dab006621f1e383fccc39f851befe97067808c6c7a0c8bcaddf8ff839640645aef4a9c333e5ef7101608f53c869394a98bde56509fc94ccdad7b591a49ca49b7ccc7b3b67f6aa2b42ace4d64fc8172173555f12c83529f9c246d33117b7d2a6aacba7a29c02e52fda753e1483fc9046b0a03cc239c52b9a9aa400571f036fcbd787dcd99359c51dadd4e087710bf884547a483f18fa3610fe202f493e11420ce1511f4ffc1eba288e0e1797d72cdbd09ff9168680d15a62c9c29422b4237821df112c22f6223112dc43e0eae721141433fc2dc2e949f188766112db41f3e3ab5083e71ea58447cc4b95d703fdd775654fc48a65d983e62ef30904882aa0152ed2d231e45f9e95bbb4042523f35e025d7c3ea43266105a2072ad32f5d24cc618c3e03ef80f2fb381a17628223a890fd3cb60ea2411017647cfce166df2e99a51ca354ed2b75bf5cbb9d929a793ee0aa7b6dc3b5744f8662d85072428c3162d53a6c067dfae0b602d350be6ceb61e572438046fc3c02a3f0195f6ee4ed9fa65b80e886802f0228f4cf66e36544b67afff4da0595ff6042bbb87e486e3e44f410b01711e1cde70eed22d107a70e23e2830eae8aeea7fbedc2f207ebee041154f3f3502308918fb018623b821bc11e820bc203f111a84474e4fa42d081b002a12988a0763eb65b21085cc4a5109a21ae3b0283f5e98c63c1e423f7762102f9d2ac114576775d3e5cd22ee49f1e36bc02ff381b07b4b72df6c88caa6ab66b21f000d88c6685b62f72730bf2ed25885346b4d0fcf0d1fd49fc94a64504422dc287c7c61a421c8216045d23c604ea5314ed62f4419853ebffa79fed42f7c3ef9610ee08ea8d081af51146bb50f8c4383447606c7f8cb442445c042c44aca5fd90a15d28f8485c740862046b21381d81b1fba08d3bc5e207a78e05c40f3fdb05e7d37b8ee40b9fc4b615a70ffb568cb83c040b8b1f5bad1841b911422b3e76478c583911115e7cee2d8a212e721f25272f443ac23e623b821ba1ad88df787d7cad5de43e487711d1961142371f63871041b808df287edc1d122382e27eb8d42e649f020e20c4d121acb87e0ad78041d483b046b474508b6a4d24043b818830a9454614235a20202da4a194445001a89e12b8c704c5634fe9115cdd010431ee46ae997af78433b994952385047c621ae1bc591988b3cf0bc712443fe8ab9fd1c572d16bdf094329d00149c4d287f79a59b92f6dfd1118f5cf783b16d83ed26862287e606966088d12da74cb17cad8a0b8b5e8088e887684ba22d6eaff915ebb507c301d9b23d8aafd183ac2107311cb08df8c00b4fbe944bb70f121bb59044a041dc8ee8a80503c44508a8fcd4614626ec42e2230361f347455143f3d6d17227e1cee3aa0cac5e76c9a979feccd24c226084e443b42de2330fa3fd87340153f9c6917e64fdf3516881f290d23112d147c3cb536841806c7c90624170ef4281837f9f8036bf517745187c38ae67cf0b965c42bc213111ac4a4dd32040bef8f9a968f608b781731368ab04a7b2ea2d1904f6f76f55b7e12db2e4e3f6fae00913bc3fb6e2f8fbd82106eae522230723f88db0508a5885b90c15d11040bb90fe9368b4005e2ed21d6d27c0eb6a21071835006711bfd164e16fef31480aa95140e078eae57f16e38065c08796f17513f465788c089b8084213711d100692689ad096c7291917e81dc4ae98b07005baf1a31bdc623d94a6a04dbd40c4fae2d998e06fb09c89a34ceadcc9b29ed00751387b539006184a82ee1369b7c3b08a86d8c925a50e0aa3ee3244919e5981aa99fb7818856be0f6e3eb88f30dd7f7ae6f07ebad9f4b1dbf17c970236649dc46aad1146d59d9d1ab02c423e7f83c3671e172859c5c46fbfb848988d6dad90fc5e277b63746df4a396c2e12a073518429c049862367da0c91f75e2f019b01dd59e3469874014b05b07ed9b44751c933d89c6c2d524e3f4a5ad39ce044772f64c40eb96e12a3f1170e8ae0ec901e82023a70ef30f0286c21102351cc5b94f2ad6f4129d4e1eb56cacdcc95f2a85de98e253bb59e5c1d75a8758af1c916cddc924cff87b8184bd066dfbbc4ae6b644009db26c3529816fe788c5566d4db7dd37db21e258f004e7dca951ac7cfc2a1aaa922fa243bc8d0091763e7bbba425545b28e5fe8982bb0916ff8364f53faa6a668584026ee7bce4b046aa83dbc994891723ef1a7f6dc9337b76d02a34e8f52b6aace8697ec30fba12a9395e1d89da4e8ba039b731be39a1e796eec821103f7128811b92b003bec8a2765a385152cf08acb19bbcc3f264cc57055dc8304f08c4b0c2d0f851907ae0383009dd8e80f901086b22b755536630ae6f0026da85abee48d6ae295ee0634647dbb91dfea3ed5c3ee19477f740a8f27fddd5a2b3b58290f2f22a119b2d8008d4c076396a14528cdd9d9cbcd621f855c57e5e59e3c505864cf088f031c8a863001d6db07341d3952b00c1ddfacf7b0f09dd13465b46201b35c1cbe0b328fdc28ee8deaa7e37a1acb8ede90451622ea1dea25d097214c3b51e648aae24535d06e407faa13ec15d4f41afb596f84357e0f257ca4967d715cd5c7783e9f1448d7474d5bad25a40b4bdf4b71acb7a0fadde58f92b1a599b35ae2a1945eda4d209c185177fad90db1c3554837733fbbc7509ca03167fb9af8149794b99e6b1774171e7d3dce3b4583509657c813178b93e84bdace55ea7d516f1b3533b26a4d396158afc52b61f5da132fff957a698b6c7cc148bb49e1e0238fda8a2b1cefc9a360bb843d03139c534b0809e294235121e3fe8d43a9611889e38d701ffc2a4576161de1a45c20b1c745539116fbae63e30421aadf674f4a2b670fc9f7099d104a0237c5d3b8757ffe685086e0daaeb1f0ddb932fab522a1061e55df3fcb4f73298e4f6112e9077f79b10da1ee63d0b5ecfd2b6916c14066ec2cf562ceba75ae0de19d5b5055b2c13c06bbf52dadaaee03de4082c9742f67e851759b291b5c11b2975de08269e4b804bcdd78a074762b4c91646a976924adb26a6ecaff0b2ed3a76510aa1b33a3a7658a24b409b05b28066fd41cbc0a214dcc0af13ed8176c969aa6f9504f64e158fb30b27aa0fc0191d65821796e17bd6b428d7dc9a880fa1290d570e08bfa01b97eedf748a9df2a7609aa144585cc517a58d2c7caa030b5c47da8251c404b1cdc2048bf27d6c1cfa3b31d4b7f67495c66471e4ea8645c700f6609fd2edcc0d8d8ff541005267b84a7862dd9bcc22b87655bf6e8eb96de632aa9e0d7a1a17c0ec90e0c6bb49f394275b4c7d10493e84a1e7fc02b2edbb299b8553b83298575d4b3962be04eb1df3a936e2603030c8236e1b8cb102c1423b0274ee55c736e082b24f04743294e1caaff490abeba05160590491874249ecd517560479d1ea8b57b25077c9bf51c0865813dc73c361b1ba027b062b54e81ef9c0f8831b50fe5f27114f305e00b19e8597fe87189e5de8fa82baeed2aae2e5c180dc29d3f15b414f48464d7014e8859366f4969e62632504c316066c6d1e3ae3ed7b5a415346d776e235425bd77198424a67ce4f75f22a338c99373ebfa0d93d00740b8d1c4b74d8e5b3075dde69b68f680fa04ecefeab634ac7c4bc5d509f344d7d48dc2d9ca4c064942692bc19b10dd72a554bc10d4b2b0ed63fe2d8a5f35550014f31ea077ff113ab4580c1746fcb856e962751d3dabc8b3bdb85236a5efd423de811f005b5cad40f9806c7d504c4bdcbcd3960f52e10119235ce873164e28815c50f1727252c53d2bbaa7c54721773f5158ec759bd048b317bedda360910d37c083e361dabf8633c4f6ce493b5c31226d595cf5a6a769c4187da57971563dec64599138d5ce7d8bbe7d983eafa22b662a12cbb12f58008df787d2bcc866df69786b5be30f333cb7db5f82f5749be970c800524962cf560f5ca75a370c9d09ecf5880dc8014a8064cc48c80a9c170e0f599d732424078e5b20217eaa9ffc2982f116907267d3db32d30c85e9dde822ab45d298b9632af7ad95863c773ef991a18d2a7e2ad0d3a54c56d1a0e5cc5a45e3fb044e08e123458a06f072e36691467a446ee3256e82c1697766a85ccfe109442e622426e48032c3e104702b4ab09d0437c7b59c4bcdb3cfd2a525400b4dbd4ee6edad82f5aafbb54f3d310d83386eb59ca6cbfb72ab9d26876bf7ec523afdd83edd7b8bd4d6c3cd81b2a4bc88030854e3cfa99b84f05c68e9295c1cf0402e6463bc8c577632eb0135c5157b3eac9048e8892470ed5125a68b617907a1079259efe7d322f340a46c713002184ef807eb1bf9d0ec9a8374d168aa62a348ed32359f0959541eefcdf53af03e13f763ab6ecf1454f0c130df108828d6e10f1fe3a3cf570268460429230b3c1655268a96470da1948c89ebdb6cc584a7292d8a875b2ef65b46ec4d6b0bcd61e82072373d2995e114d31b86897cd71632e57ca5e17add1a39071e1eee7c088ece6c79c38914bd63991d5ef53e2a55545533b04834ef9e5e286eccb4d74a1fa50819b337037c16900fec0471c8148bc26e5f480481d7d31cc5976a39e116982e91e1e435b823ae880174900707e078a4a31c0c12c26f29cc4aa85a06df3ab2b5139ec4cc8a4758e3bb46837ef14d37428e8ffd6391220bfb55c7951aef49f90d2ca813f063a2f9b5f629d360f18e8dd58450351dd71928667507484c13095901b01fae5a2cf322c4edfb904d58c82a61a583b19f66847f9fb22a52e5708fb17c5cf5a693a46992d07f354a8f1d0883e14b719e52a1e1d277327122df21595c5f59848397cbce9f58446145fe105499179f3d8fe69e142b8c1332741eef9de7c281463cbd7445fc88a0a550810be8af5afbba73236e64db6c8073b3bfb593f5da364d292ee107f2cb6f4c30dfd68e4b6192646bfe9894c4fbcee1e66360dbf8402d01328db4d9b973cea16977ebad6cafddcb2c8216ae7077b059faff404e3768c75983b959ab29c93fb12f48a8011b947830f3f35cd419b3e5315aac6802e2bc43e0a4bfd7f867de0fcf814b4138fa2a5d68045b67ec7929fe6389e7f02f67762cf63b72603745c025c3b52ca10e99c9552fe91dc8d38c304db943072b8658b1b6771341b0b73b3d2215446a94760ef88fdd4ada359086540468ffe3f92c65a4844840c988b04472d761f84dca946b2bf64db90603b2cf4a8764bada984f23010fca5e97ea5642ddfbabe1a59db5d9366ed43723614500d06b1e0f3fc56de736d56bb8fffff432b62d44ab4d456badadb7f452659fd1ffac8543be07ea30d3946cf93223a3b51ea5bdb3f5a5ee88d84f539d640d94422045f54ce5e2f364cc959da3f166a1cb008748621a02ca275fc217ee4a099aa1eb01d5fb9f8a81715c6ca1f553c45b2eaced390430c6da11b39e75ef06149259498a56cb43d563072424ed388337b98dacd337019e666650286c003718af6f510c54607ca72681583523674507bbe4490d08bf7fc03a1df3084679aa074bbaef4b0173b8e941f0cf125103920b95a533d7240e5e1e56510d1dff7df524ff3aef87cc144fc7e699bc88c4631ca8c983d165244a28365786b69b35379cb2b0561697e61bc60e4721c8763344f259a81b1f1dbc300326be32f14d4f8474627d5c9610f7a0843f2cf56d04b1afc88cf9e20c1b705a457486757aafe3d0a7f3aded4e122ebf4759e5297ddb2787476781c4dca3b1f21a51cf98828832ab05c79bd29d5abc0dc1961d0a028931935c2a2e6ddffa5fa8daf340a5647f620cce94dc4faac427d86428f7bb620ab354718d44105ca1042569bd4137aeffe04cd7fb45b67ddd390479e71440a6f7ca2ebd8d0711abcf02cfab741490d8fb73d67fbdfa81231f632c4b066cffb281358b13c96c8aa9b1b9dc8eb8c8692c1f2107f69f8d7246f6bf3121ca022e5e30c66713a7c9434f26576dd1e5063e6d8f8afaa20923f5a0d6c5faf0bd55101e3f53f65e4e7c99333c2a40b66c12d6836d07191df628e96cff655581d057f3b71a9ac10a0217ba01c309105b66671ce86f31f3426a0a75bfbd0c44d4e01b3e99c2838ad039cf6dc9da5442f3eda17dff743df5d46488316af848b68528a4c493cae0f817c23fd701852be3683306ed428592a18502634176f3468295cfe1ec05dc48039a1cd130be9a3507bbaea0a4b3d6aaf8edbefde537a78d5543fd22aac1a062d8c21839945cbc9c9a1757620a83febbb454832ec6923158b796e8d621f035f062ee84e227071b4454ed4f1e04ee314c80b35c085d713893eaabe9dbcf18c762316c0f544e80daf0eab90b047edbfc28eba72973df526f218d5977379bae1e178e2cc04f5edfe762bf9035e79b80ec678067603acd586c641caa5cb6e72ca189f35e531a7d9e69639efd8955c799b6451a3d98b3a7b9243ac3af02ca9969fbb8193fd8a4e135aa6a53ce7030e4146d74c2fbfd1d2cd3d0ad7ddf791cf34e3c715c73ca409c6e1543c70688ee40614ab33319053059df05dd1096bd78561f0284501b79c97a6710e19e15f808c810c169e1ea68ab7a570115a773709afacd3fc6c1bdd420831ba9d9ec4deb757714d6e3d3a8ba74369c4a44fcd028794cd6f08c5e130373e1a846b6878ecc27d2e778e2bf15d98509f5349e83fb372148ad24af1610f58068a7b2ce2ea28b192129cff73bafd2796fe29f4af39b58b346b525c60bdd78d8d62205bf632d430c6825bce8afab28ce786596bd903268a20f9a4570cbbfb4150ded6d41cd384faece5c6d0bcf9f7a2dd175262071aa89668b1e0e2801a568fb3caf38be06f5efc75de483d9627b472af5dab2aec8a8e268114d9c2993a466be9b5efbb00e36f740539295d3ad8cfdf0784fdc69cdcdd616f2d9a86ebeb67e749150ec643b8f6bafba89b1c91e9fc6ebf5a7089d956f13baafaa880117a897971cf3c0ee7c8ca1d7f643cf71f67bb4e86d1d287f85329af92692a07ddede1b6ebb81932c2aeeb013f1dc6904ed2834028cdc9298fe8d16bc5d25477b182ba79d68f14bf4970cfd9141c5373d2153134172e72c55d81059f0b5ef173dca344abebcc5d3f2d152e8c211d7117c4b7ec9b00123dc4d0a542e9764d1a413180ce16ff3dc9cc5ddcad0c5a333568c99e6111974b8198fc6c2de1a1e875bdc16ddcc80f4832ddfcd80d206408f893046e7d613da802ba86cc363abe7fce2f168c35815931eb0388314475b0012e853e79a5904a80e582d7e785290d02a6ddbdd3ffa147eb811dafc554cd038afcdb3bf465d8c92caf2e4795d395bbdddc1e3309a6eac55b04a0f1830ec915f7873e2a69531ba37a02d0998930866ba749266333859abd30bf888b083470931a48730f98a790adc3f324902244b57165f922b2e2d6588a3a46ed92adf43325f89df7583d0a54509b6d172bc338fe4d0f57502729feb785e0b4f8330887839194f21b993750d9e2b9610ec320e18e58c05688da42be885812226134f40f7abf62ea079e250a386a078500393e1ee30363052c6a8bfb96af4662209a1106b35a0673f4b9984fe7c38c6b94b9404dfc7eb2c44b3bf6dc88094ecda575543dbdc157c19c8d65a71a41bc56d7abac5311f8f69cee159cd6a650ecedeb1c6652fe69c2104be537b4cfdf3cc82aebe6c9df880800b8e2eb133f4b27a952050348176939471597022164822209aa165f506f8334cdd55649c75af1985e3826bfe8d9ef4bc61fd3dcfab58b8c04e84b4ecf3f1628fe4eb2c5ed5616002f9a114dcb92971e4cf4d2bcc261a1aa93c5089231bddf23ea11e2f3d6a656ede19d9012c0dd52a5e9c9d415c84227c03481d9442be6a4d5ce00a44ae7568ef96717943821b1344174e7173da46fc14b6425c39adf3db1db5fef52b31716ada392d7e83105299b43adb91fee2e63be1b0a16da393576a23011f585f08eecf630ac9c426de82b135254e071f01e4f542c08c57041d4cf8ab1187efeafca610999de427c92628da94ccd648e012804767e7dbc9ab5241613c1b5f45702632473b4420a6d101ae0c3603197c4793b10f515dcef025609a41e455a1f923136401ef73d3e73aae6d78b36b0f1c41956ede7b3fc86f9da3c95e5771ee90a62054db2b706d261fab6a9029b321f93ad12e5662c45cc424f5d548cd7a4e5098b25c01eafee1a91c2d823424a176835ff391e1d74d3c346bce1f9b36d01104e952bd651c002d2301195b97d52e95143abaedb6d0ca668a69b56c67f9ba6e814967ec5693bfbed7dd2bc8a9fb638c9f2b7c4ded2b3e992bd7146a48e99501920dda673a13ae7bdb563f731c69c175856c4c9ca230adcf1e748a7a4c4ffe03d6d5ccbf39689936a59d7ea56cbe970478325ffb7ee35b5f92eb092906b98b71beab3be010e6419c7af3923bbfa99accc1297c09ab250a3fd536fbcbb2f5652bb875f3cab21be02c34adee685257b05a21b3e59234cb8bc5ccc1bfa3902c10e6dd201c2bae5b709eab5e338b40a4ae656b43ce5699c4ff7c5f39609cb311fbfaa139a55544bb5693d1a8d1842d6892ae5833db5b9e78d1b38ab6de7b47cf7a4cf7db8a526a10baf23dfbe2507b25a921d5fc541247a1a636b863afce288bd7ad0aac7aac81b5a27e95e485b9cb2c3a2e09346c74f90ddde964e8e3bf96babae77e82bb810f4c61622c780ed87abfc9a003f479acf653c947b2c4d9b7652d6557566ac2e54fea6530b1354c83548e527e430ee308e756c4c43817226922fa24f76564321bd93ed83fc02487c7cc1f2b393b74673a02a7370b52e18d6d1bc0600e6d7b3c3a6efbd0e02e78a33dae8e79a8fe2da281714d7d6a8a31628eb4cfd6214b5ba649d6bb15deea9643a5fc01ba19c9eb51ff7ccea741eb8902f71b6e0c51ce87d72e26d3fc11bc208bc9d743dc44d06014a8991a43c6ac03192159f69f1420ee8a009b88352eded873763989d56491747679f25eec530d45915f23759f858b9cae591d46d3163cf9b1a16f446131a9fee10955d272867159ea2c3ff9054ea56b5b698f1bf599491b1feefb701ab9d55b56fd5a0a477a28914a2259bdc820419835636bb069a638c1536c821378f246dab56fa30c41ae57bb0021b0ca56de42f78eb986bb0a1e4d5361e89e24b69176e1f7c9e22a6bc17d36aeaa577bae837c08d637c11d669c481f9ce10a61e17ab2fbedb7cf2d8688710d66eec7d81e100ca5d128f5f0fa5713685e09073a731786ad1ddd0496e77ae7b3ef4ac1699493bdcb666709dc106d5d2894bb16c92bb8d07947727935047b5be6f42e41a9bd86f0cfb14e3e68d9d731face07d720af5ec5490eb367c8e545b43471fd26e1134d082a9378b45302c14b10507b46d4bc80edc77286c2d6f076c41139dacdabb702c854afe38358910fca5a7ded8cceed771488f328e1496996218cce249e5251ce76149b6de964cc501ecb4a389f89e544918178bcdc2788f5ec8c3c7a6d1b6e5006b0bc85083add66f071370456f05c0047c27bcd2ce20fe14e0a35ab9ed1bb22f40eedeee9960281682ac01c3923d43bf92c4429e34f48000040a7db901b9dbaffcf34052b29978b65891a8347ef82e796f9e32985eafa7f5b17f53583cda3f550abbdcbfc180473d1ff19411620ac1b0170b06da63510d09562f7abf8cfd010c3bfb479766da146e5afbe5598a35a15e71901c3ff1d89b10146e9806132803d9d2d7a3d6e2c6a7c47e7c3e92c6cdc9898175625e9abefff3ba4d7b90104d8d6d84e522b212da215159862d853353b5b7eaa64da61915583684820caf24e745084b1c9e5912f44d10f0aaee08b2d88b0444c2b4d35295328cfd2ba68b8a2e6a096e5bd8a6d06c3bb84930e9b965b2edaba2f752c6e49744aa26ecf2e3863a9a80d99432d5490da057ec1e594818e6e0f17b8474835024071987a6a33298126e7b6859c7f74670b7be4e759e229a456218c9b18e58a27710f082233b794ef078458acc68e4f399f16d6dcfe60680d022c1d054eba04e40f571048eab839d4804c086240465535b8efde330950bb95499c413f9ad8bfef5264c0e18a8687c320fe26da31daeedb1a32598b126ae0ef73ed69914ef5a13fea0fd2510f1b3472156cad05b057738a5eb25e5a5ab2a54c01ef0f6c10540f2b0aa555fd988294ed58b1db975002b22bb7ad0b526ecfe1949bb52587e33d282abcdf3a87f2a964a1588a1d77c7a03b02715675e43dc86de3a7f25248d6c9ddd613c1c96f8f15ee1da4c2c30f5dc78301381e84286b4a3fc303123c38e2cc0e619cd12107a805a431e5d091dd16811dce00cfeca0460ea8048050fa191d5a507aa59fd1810b042060082682c838ccc00409d8c2031d8cc10403b6d2cfe880c41a677250e34c0e5c5043e8603ca3030e38745fe0209343960988c08b059ee00107c230635b0205dc0a78108106c4266c9069c00f5cc2335a8af80115c43f8f333a0851a24a3fa3839652f63b2713809b1254b000c28c263ef0021b6800024278f182eaa1080b4af045053808a3022db60798613ab3e483204228dd4c9a14a419c199252fcca4b1810daa872d0c4a87ed413369ae286dd29cf981e779ded1fdad43edd0e5513e90dcbb27e600436f81cffd68c3fde9f3bc6fa1d4f1a5747c9ea73902b583991f7831f3033069a43093260c8a072107a07228012a878b05ea06aedbec77dd8b50767f29004ee1375eca6a90acd184df78e9a950389022943e069da5e5bc3b36c952722a9908a56de2073636b707052318e4e77d2f7e3b5054906018da92c7d7803102db45c1bd978bcb382b72d8dc2eb7cbe572bb5c2f5f8ac7f3b8965b3d41cabccc55d9b8b51d1197dbbcdf9c4c79ff93b9a79275a30ba6d2fa7b1f6661c32d42df5258ae00d9b109526697f872afdde29c73516e299b3452a30f48d95fb93ddb734edb24e00c798e7d4f45b92bfb3ceeb8015266d1f874b19ddcba5b2f6a303ab1069734d294dbd2c8c539590e32389bb1cbd865f4b2841360bcc011c30429b35ed8b7566c5658320fca726c7fb994db8ebbf2df964630ae417269a0513a1864078add5b8e43c357de83248d347ce5a56c2bb7d2471ba6ec7ec0451a56946e268d31e5064a37e38333ca53cd122fcfb064d0f09645a3f428369c4a1cf2961df21ca06de3366edbb88d886b8928fdef87f133028d6290321b06c482e4362f63d003354e35f7c730485bca6c98d27fec82b4494a40da33178dce8c33eeca7ef6cbaa8b3324f8630ac8eb450b920cfbe59271cbb866709d4c2cc1a5d2be5702d23e487e97b248a8463148bb39c0394bc68eb1624091bcabef53e5c8e17d29eec1545776a2b7e3ae6cb020573f383bd67a09a6f4ff7257a74f71597caaedbdaeec7670ea3e35c280fcfbe0b6755dd775dbc91482600882220f4edb38c6053d202fc7dd51bee9c71fafe7795fb36de388dac6ef0bb7d83e04b76b777270721ee31764f7dbb6f3a5c61e90396cc480e94432874db943f63b6e8f8b3d352f8ee3970ac3ef43bd8f6128fe2776e2493cf9739bbdf1607763bb31d6a04373efbd594acff3b88ee3eec671dcc6dd3b451a6494dbddec16cfb17f033160c62fc8b106a46fdbb675ff53fa8eeabf3bf243d7755d77af78efc542be48ea10dfcb2b5ef18a27f18aa278c5ae9b427cd397e37b8e42a150dfa350ff7dcd83e29b5235a831757a1fc53195a5144fabd2b35ffc9266bc2c79a9c152e96668b054726598517a1d96cf927785c51e01b71b0b44c7f61e2bbbaedb7c0a92234970f24b26818617af86fb134782f105b21fee4f1f932651bcffbeef5389e09f52e17f9fe759532a0cc350247f78396c78ac3c8e872e0c9923d5e4aeac297c9769c3255e9afe145a141561b8dd1b86201882a00a1c494076a82a8242d556763624209bdc1ed9af7eae8e5bde8ecbc1a95bc1ce0fcb3191628c134b90488021c28b0d2d5bb05c019f66ba8606d0848991245b901b8ab3dbc6a150dd73282c254ae450a817455144dd32ee858d25d094f981aae9c44771dcc6a964b19253e206dadde038aec688aadbc87bb3a9441b144a25034b91fb6edbb88d3b01b9bd91cd676705da1ea87b2ca5f8a7ad03c3b01b814e3a6afe88fbafd965b7548a355df85b4a34a594b8f15ceab711e8f3b9a14a726f2e68044d991b55582fcca0b1545a2d4a37b38325ca33a30ac853936ddb36196aa342efeac6ee2a8bbbba5cdcd515568864ca4821e614660924be7cabebc56ab14b26d9f6dea331d4a6345140cadc8aae0347b003eabe0bc34e75b994dbd6711c676d672df7454c0dddd51541d38f5e90e0914d293196a8cdbe25f8529cd9c66ddbb66d034110dc3670dbfcaac614796fac7857a6b7e0e6c496dbb665415ad7e6c36405b20f04ca2e17704bc9f657c6a820b71f7d50dffd0eb9729fcb04e4b6753bbe47c7b6713e3a89c2a56c86ac17a76bc3079db5fed6ba7bd78d40360c6d2882a0f5d4fb5d59abe2fc033d7c9bb2f6c1fb81ee6e1f4cdd0b82aa7bc1d307de0b7a68df536316a40c2c1dec4c2727dd471e9032b0ecbaee8778bb6e15762b578e5490b29dd2ad003b2e4729db2987dc9eef813ed3cfce0f1b96a7148c2f20657f0253da96e30948d9f7de79350f7e35df8706d9fdc94120b124bbb7f111e8545353f34bbcac51e920ffa8e6bfaf517d4f7ef859ca8d7a32e5e236a6c0930904c14eb4dc0eb2f0dc7be7f62d3d95cc5dec501b501c3d40dad2df4b752314aff43cefad67bdd34d796f5352d8d1aabc3f7de4a6f2befb6164c1bdd7c66664c1beddbe2cf0c633e49802d253a93e046c9be562b9b460db36cf4b63fdbabb735ff78137f5bda7ac5fbfd6ddaf5fbfeeeed7ddfdae94d8f28ab703c311c8bf0f14bf0ffc3cd1f39efb442e9fc7855fb4400d175c61a6054b665c40c68c0bb8e440cbc845992f36a5c4e9f45f3a9349357ae94e18739db837db876190f882015276c27f39c15b5e5241de2fb3f9e0851765aa74335e90294f3563ea9637cb38aa442e40a0e76cd622f1c572b15bc6905b68531386e1388ebfc4cb71fc6efceec7ee51efedf2841ac55396f2f41754719c102409a30f48d9aae456650e9bd373f7aa4eafc4963f529342fde96b52de1d814051147fc9f847e27f2faabe1fbffb2ce54dc9f698f29309152fc78333dd2d89310d5206fa3cb1fdbddedbd4fc7d50165efb630a45a6967849fe1d996cdb93aa8d44798ff29e54d5a44e2fa2de4b9bf214be4d19d94ca12792397636158c6adc2d4e36e4f5d2822d52705cb8745b366b2d09c22cba908b0ab8bbbbbbbb7b0fc76d57885b776f5db7eed6ae61c6065ed8004df9bd67c60665cacf0662be073b1188dcbe97dd07c56f33814b3ed591e9080c32fdf73de875a5cd08fe7d29aeb4b9365f58da780b1449f1fb6ce9a9649e1933ca30a38bd3764de09b4c5f82a1f7847f7bd65bda12f496abbc3f633dbf6ead90d596dbb6c4f4a04a47900d6f790a026ff9897f82e265caf04f26d08e417669c9cb946010f8a08a0b39407ade63e0e457dc44ce5dc56ddc074870140179bf7bb0245d658fdc6c7ec5725be3e4b70c2f4a37330332ca104a3733033425c771df719ceae8baf5c61190f71d071b1b1b1b1b15a8c0bb4d35ae809481a5152f2a96f7da3bc6c9af19199451ba191974614606509431330330a2288aa217e0268e5c6c3d61ca79c810280c55e1f762d89560cac394a934a964a00dbf1590ab1f9b197891811ae5e98a363607446ca2c91b958c5c904b42d5077a0ffe6f3e7e04b481f27df8a72ff561caf34a4f958303a455bd9701bd301383336662c0439845b805074ece833b59d0cb304c9122580509fa88f74da9fb76b4e0db147852819d9801727bd35805b971647c21c30b136bc53b3609c0d8c4cbeec1f7ac5f54b7dd8bfa7e8c2bca31ce94dc8bdcdbdc115545f8775cd2ddd3078a39763c2f4edbf65b16209b9289a52d3d5076d4a950b1e4361a9c3e9fe7c23f7af193815f96d24bf9a645c845b805088e22ea644ac9accca25e7c940aa5929d502814ea3dd47b7f57e5e943239b919ba50c5363972d95ca72b2b707200886a14a07132fc35fe265a8d261faa3f0b90f55dc9bba944cdce567ca527e29542cbd9bc5b3b60765be2001e64bf78d5ebe325d77b99409ffe354a7d3c8450a3177d5a9be5880bc3f76b140190f035c2c7739d5f76d62b6e7b84d069eacce96927b8fdb549b13e516e6aeb6b75fc60b90579665c3a232b275f6b9ad9365b90079bf800139319df51480868b17224aabca4192121843a6cc192bae4033013b668ccd189b313662c690f1ec66c566c57685d8831436363b9ec70a67679440d8496163b3e379ac7076c490b6dcf13c56383b620fa297313656d8ec588d21633346ec41dcc2e58eb1918977cce66397d8b6177b38a964d664da32460c4550ec01cd105e589555892014e29fac5571774501727b102439711bbdb4292fc728c8a3f0bb93fd6ecf15763b7dbffdc6c5c6c5d6c57732a5dc05ae34b2792aeb845dc28ab1626e0f68c58c50d80fbb2c56b63469c60a90e047415aafe34a992d6563979188d27b2f9c28654ba021c394dbe768c152b99550ba192fb694db365ad9d2a4b9b64c99cd67ebec4905962937bba3b46f32a9542ad04b8d5dac4ea7dabc102f0006c788040e1c23111d0e1c5c708c48e0c03172c18103c7e8e572791c97cbdbdcb041aa6ee0d851927fe3c11be4dbe0c8b1cbd865ecc28147881146698328dd4c18684e3faa6ebc4dc948727c927c71cbf8e4972399f72349cab872fcc6f0c70f24bd37799d38fe48deb841deb841be918d1c7fdf23d43bf936fe44be4dd5905f33deb8f146ae0dd493376a6a46afa6e6bbf12a99b561a366e4baf0c9f76b83fc6ea0c8b7f11c397e0d67faef51a38a3b952695ccfb50c77df023452f3b0043764f8e5d4892fc910b499223179224472f970bf93635a338d6903bc01a94cdd865ec327619bb7c5cc0004cb942e966c438a33cd5dc23d9f7dcdb50da6e54c9ba9a176b4619576e620f6fdac69a9ab1a6667c23db68fad4d1e9bdb463cd388ae38ba6af5159d9ca1a1bca2328a71fdfc8ad195f34d5bc4a7c144a259a3e144aa6b3c848df7c4c3725f660754095acfc282066e4327219b98c448c5e6c6c6c88b95caeca86881245717cf1de7b6dd87810ae0d9b1b7714c72e366488816ddbb6f06e7fef0def66652b2ff8272e0ced87a1f8e5a87b2fade95eee3eb7592efc100c344a9ed2cd8071268c32611862c2d812861a006b9e84fbe29380a242363e372e39ba2a99358957368e228effc61b62393eea6fa450b134e1408de249b5bfd2a40aafd8830d69e382658819bd8c5c462fa3173128315f3e242f1752cc171c1f862a598e32fcc03047caef0d8e944d18862ad9e582b2b1b95c6c6cc62e6397b18b18f27e664edf732edb2c7745d03e08beb8c50ab14756b094e06fd6ca5682ce7129b73f53fa28ddcc175e4a30a42857a59b01834b79da46f00b354a154a37f34516628e9a1f3ff4a292895b507fbf1bff81e0936269e3c5d48d0d958c2b49948adb5f099a54fb2bbfd3a842c5f23b8d4b64598e4e2a99e5de64da2ca872e154762a15186f0735f7963179294f35e2fbaf406bad3d023f6bed078a29aef4525e76b95e4a8e7bd06e0e3e68e2516e60e729f16f4aacf9d3c9f41704c1bf5cc0fba140f05e10a53a32fd67c372379eb3714325bbd70ba9327da88d0c75e1535dcbe414063d77b958101453e3b8a4e6399558e3d920b9ef6adec484bb3540de2d539e4c269309b43a60f7a894f746b67bbbacac055d10b91caa9ded66fbf7cd27870a0787da98fe53c9c0f1391ddf7bcfc424fee9c17189e98f4455687a269bcded62859854b25075bb581def7a29eded72638b1b5a40348c40dd5367c4c617847321531183038e6e6552624ac1abc2adf005c10103492cc12102408440ee68195f4d7a38b374aac18ec861e4a9b130ecd8847c23f4dc60fa82782610b5f9042dd94a3029d9c192e90b1a8540263a8094984226a2903904034b2270383d26af8563f44c2720150120b06402999850e4c352b7919df504e0993a21de0a458e9c6aa10a2013cff48d30260979704f421172ec4881841056005970414a0a379840d6e763f4e11314e513b98f84aeb5f58422a7c21bf9c2cfc4e9742e703f466ca7634b7521ec84e06b0b0224c406348510fadc80e4c9e907b8e278703cbc082cad80e292742c7426843cb81d353db612705862e9d80db6e5705b5700150186c8809a4221013465c4401181303d64a9e18a3e82e5978b00556418000c2f084569120026ad1f1fab145000c0731ee8401a1b9431460b4550509130c2076604572801010100b5d02a0104f1e49d2133c5134b2811c601498051c00b2b15745847246048288d1a6714c960831a688048b521041027ac8810d3b744105e7cc21470c1c412ad203d22e43899c06f878e0b58a04a36a13c09409012a0057431000f37bc00520514128840962930f8f4d8e4e04a802607301421d2137e5e143b4c3181061c60081f0ac080052c0008284f8a085141b4696c3eb86870667c0d2e19dc18f7059d1756051705778b500b318b5b828bc52573a3d8a0b8479cccf2b0278025743bc611ae0817049bc3068eeec6b561490e754f9de9862078bfafbb9cddacf57cacd9746c1958e27e58e29a782bbcfd7470030981a5ae13bf1454700397440f4e04314c135e0f4b5c933004d30e9b1c96c218381936134edb134125e08f67da84d8983a112c8163967254b921f4d9148003d1054b5d9aa54e24618b2571ab32b014daa0ee27a4d3e988d802c269042370e0b82cd5a46a525b8e0d1dd0c6461a1c3a16c09f6fc856b30d01c32c6d4e7ae87826cf89a5ede491c0e19c7a6c9613391c93928e852f068f04cfe4c9c41c628ed0260ce18b615b03078f844d0c0e9d154b28c8b8d913a15002d7126b3c1b9cdd7236245c145104ef7e533e1ddf930e0494f54e5bc789dbb6ddeddbc02d34ede0b6ef85ef464d14938dcffbecf6713f381dce82236c3a6e084fe89a58423971830d8fd30126c18173010e2aa2f7343f1823055c94000d08aca8190905e105e8480b447cd4d40635d05181ac013f2a3240799286045998e0042076be186124012e4001161fd0c005a050428795c2016a1b08bdeae0066674a145161da840161b08504586014079b244c90926881002192ab24021011b6a202a61879a9e8072410baccc96d2fc80073ba8424584106ca0e0031ed880062e60812880e862002202c43005ca93202c48e0811154f185c90a5480c5073aa0810c40208c0f3ae470033350a08506324066025a96b21904646334438c305c00820e503185144c04f1433689085085ca94202021ad1b1b2316240081028e08424b36091080202540425aa8917331c2c0820421f0001553481105134274d132430082880869f9fce87173c306e769c408a305210081073a40c51451302144105d7ed0f205d10c555ad061a9914613176a502cd8e1858b0f0398b2d3801f7c50baf2449866fbc15da34be3fa006c828bc065e22a61796e8f6dc7b24e391b0bdb8770c2dd61757c246c23581b4e041b4288e3c68d8de46a44143992208e70da61b2117ea0f75dcfebbacd3a09ee26d284c5ddf5caca6811d6c9a6fa3ad35a09eef63345f19c34a94813096478c6cdaffeb379eaf47c7dfe3e5f88d28a571c7b3d3e3fe44098013214e3ee7aa3f4ccb1a4bf7922437e4564c8a7a7512e0a97c8b0e6ee7a98fafafcad5434038bc5a212c4c42361c7bd13a2ea5470f7139c04cd70bdb2d235ef8d693aeb66c149f009f04b7a6e9dcdffada6afb36afecd2abfd69aaa499006d07433cd1bbf26c124669a49f006e81fdb4669461fa6feaf2a6cc55b7f364af11afbd0e895b5c65eb33cd3c9af13d51ee2e06e827b58808f08bf71f795bbaba0b26278901e5fe4d7b5f65a2148909f203e417a820009f223888f203c417a04d90912e4e7e7c7e7a7e707c8cf8f1f1f3f3c3f3d7e767e82f8fcf8f8f8f4f800f1f9e1e3c387c7a787cf8e4f909e9f1e9f9e9e1e203d3f7a7cf4f0f4f4e8d9e90902e407880f901e204080fc00e203080f901e40768004f9f1f3c3e747cf0f203f7efcf0f183e7478f1f3b3f82f8f8f1e1e3a3c707101f3f7cf8f0c1e3a3878f1d1f41787e787c787a7880f0fce0f1c1c3c3d383678727488f9f1e3e3d7a7a00e9f1a3878f1e3c3d7af4d8e91164e767c767a76707c8ce8f1d1f3b3c3b3d767676aeec6477d7e1a43700d72b6b564b75f60c9657f535031513cecab4aae16bf802fce398704c05f8ff7f774fc1dd5170771ea297e35b66b84240761970c2dd4770b21bc2e5fa9609c7e5fad68665f4dfe4bad931a373fddfb08cae5cdf32337a62d89ab5c644881049e91c7b6d3c03808aec66a8f2382aa8f01bbf998f5e678a69dd0ff7566783e46ee0afcf5d2bfad7678eed5d73b2aaeb0a94a4aeab7ae40a77166b02eefe39c935c12df9cd0f19f23d569f53f589eb53f5dc3428dbdd5531f7b48afb1ac57d5749e2be53c5ddfd49cec6fd4a15724383e3dcbd0ab9a1e1ae2a8a80bb377172434227eff414f100e9f9d10303b28383983e767c80fcfcf0619a3c6651d18f1f453e3e3c3ed807061244e7b5756dd52137daafd968c5e8e357f71fa5e71ad3afee37f3b90eadee3ec5c92dd42babe844f7aa1661f71cee8ec3dd79b86f3ad8c6b8916b28467ad7ba02b93ec59faaefba59d1f09a94d65aad8dd67496e27a33a3287eb93be9ee35ee8e72d1dd4f1609778fc1496b0669cbb841eefe2d6da635b5e861eaef9afaea26d22b6b87e583d52347e7ad54a4e383e7e7958314994182f0f4bc5eb947ce4c7db18a6ab17d1a29ad5b9f4679d5518d56fc62e9a4e70ca37986b58e5eb37e41e7890c79773739e8eea33bf8639188e0a4257277109cb460dc7d9f284dbf6b6317698fb87b084e5a1c77bfe1a445ba92cdf47c1423a9b3bc12d12bcb54673aaf8c74f3fa5c7d9ad11ff2b9e84db4a6c6f4dfb87be87e4d77b771d2727a65ed19cc7377ebabbaaef953fc664ed7daceeba7eab9f14ef32ca3b4d9f9fbc4eb7ea3f4dc1bcf5615f6f87aeebec349bfe2ee369c7422dc3d4945616b46525f699f2f4cc32fbdb25e19892809af3aaf55ebbc5414c53a4a2b5e8b4ed4ddbb8d73f7db82162d2a508125a108659cb8b90008b044614106866058fc88818802ad5230f84183230964f9e04b194f500384097f54370ce88106c7083db0369a4ec2a305d9161d1c009e80fb42e6e46596964adfb823ac38756087f2c090d3f8321b72f31953f794b247c61a6cb80faa968e88e2879f897bd3e5525ab817dfa66a08dfde30cb526a87168e6c6f4a69d9628f6cbf430b47b8f7713472c53fa5fcc829358e6f3afd167bc4a445d422fef8365583e96da8aae18921d3dbafe1f457247528f9de3bfa544a28ddf7544a286ddf828c04554bdb8f293fb2e58f981e4c69197f873f627a3baa96545a6ab0617b936a69d3b2e58f8cbf8d328ca91a6cd8fea45a7a6e14c0d0f6d794da628f983e4c6db147c23fa5b4ecd0c211d36fb1474e7fd22100eec797617bf1c19496704a9623a3aa86afc1f4b78693f7f6086a03a4154f537aaa232594ee2ba1c43df79b0e01707f7f688b721f4c45e1dec728db6fd7c3c069fbd3963aea9e53a98c6c37cb665d38f96665bb7f395b8193cbbab7d6da232b03fffbd3098bcc7e00b2782bd2dddb63e9362ca5e9412b5bf9a98ebaa34e65054b19aa8e3c239becfe11c871dbb6711bc771dcb6bde5dedaf78e89936ff7b7f2fbd3a9f3a06ddd48292b36e5d155edd2aac00f5532ee2da8b282a5fc549df5b6a3bf55d81dec0e9c962d3b809b0f162c36dcdfde06fbdc63d1b2e58f7443e1776f03f8a6772c3bfc914e85c506ef4daa2d7f64fb506503a8daf2476cf0ec77aaedfd6df06c7a42993983ea00b8f9dc3f62535bee164ecb164ef58495167678c24a0ba5979972427180e3f6172ea57d37420d23ca28dd882ebe3851da2f4894f66516c9ca57eef01c0fdd3aaa02a4ec6df9b74796a3bceedf12ef3f93e829d9f729cfc9f76eddbea7b6cd95dc7761c97d77f246271ca7ca91b2b67bcbc938ae1c4728f6b7cf717b7ca70a93e94393e9c3cf8a3257846ef22741268221f875a6d437bab005852a6e0c5f54724bef9677742108fc40f03f7ba6fcbef253a1a820bfb71d77f43d18f4a9381d25d077cbedbb6e4cf7e0124b8cd9fee3a2fc1efc1edcbe3b000e2ff4c21c38421c37641c098268afb83d5be91fc2a8c496293f0efc7bc3c611f841a08abb2bf0c107bd34ddd5c9c8f6a5dc451b1e3b43980cb9d02b5abc582944e846718c188236a2dfefbbd05e61cf1c800c5310488adf16e4a938d5e5ac6f1daa4c8d014032453851fa1922d01011a6ec7ce44ee5fd2f4d9a346794f752e09e51de9765298920424b795df0b76fe52bef6f2b5c96d2899585e5f75bf7a575e2fdfdbceb6f2d0f84306388a593355dcf01bf4b89e45df128b794e9bb5428db9ee364e1b7d972fb4d25f3be7bdba56461e91db871be8500070d0f2b76fc7809a6c2ed646df8de6f3fe05bd90e8fd21bc1068d2bdbfd56ca73eecbec77f75150901bd7eddcd55de17829db71996568defad1719d173227bf6780c8a2f4335dc838d3850c1767bc8c094016cbbde79c8f9e13bec7a3ec4ccfa5be4fe5b26fccc9bd65392196bc28b9bf684aee4c1066945e7a79ea44ebe4aedbca57829e637f7b242b5f297a4ed739e94627dda736bb393842e1fe06757fb9b7afd2c0671fc5c451f74f90d65be173272f65fad0a4da4627de7b6941ceeea00b12e5f65dd428ed7b65945e66f1b2446942e967bc6c29b72db7b7d6b3d6da2f253ee80e7ea10d7ffccd95a2e79d4620cff3dc73c6ff52268f47f99dde4b81a04a667f3385485c69559db5e0cb3c279eccf364db7b47f6b76e0cb263907d4fe579db6701c2b1aa94959ad27a4ef9a01064cad3cbb294e10f4e945e9eae40824be92517354ad3873f74519e706e8f0cf52752cc7132a5c41f4fa3c8a344a5c211280c4b99b7b9b2b31177d8745d8da892853f7e88fa310582a313d39f5459408f567aa76e0432fd0965adf7283b3a194f3ffae95140a7d33d9d4ca9ef51fea871343d373a31a5c093cac34ee53877e5261cc894f6ef192e4ed4c8bcab39e158d5b523d066fde8befdcf7b0e3c92e92ce57559a7ba2a9c2d06276f2df1727b2e4894aad2cff88046c959a92939db590f7c31741e25ceedf1ba5367372d3e9051b64a3fe3831367804003883070705aab7dd9f7dfd7f1f0960c444541dad27f7b8f13dd7994389ee3178b1ec294dd3b11e57dbbe47bcea66c9ad253e908f2b7bfc4553a9038d596a5e446289df79b0a69d301aa82be236fdbbbe46d5b7eef5d224aee3dbc971b75a04c26d4dd4617bc1797e0a8b63394ec069017f40189f27b530f5a4aeeb9f073c1724a748c8fc459b15253baea4f56ac13930ac9de110af7ae42b29b4a897513f8819efb26c6bdd7da72b3def2d255dcb5560c287acb5b5d141bd7eabcef9c6ccf9517c996374b67ed13a72d0c1165f7564bb96139a3bc1f86516e67b66451de0fff5403be4a66bf7149687a1d566ce98fc495f6add48c50bcff54b2114af7ae926d7fbdac9175bf0691a5be1ffe17fecdb9e517fee6543a82b60f7f0b5547a10da5a764e13b1714a66456068e566a4aed9e230b7f84b2a9b8b0e3902c528deb08fa7efb4f75e41ddddfb6ecacd8123459ee01271bb8ffa428bfb736700f6e395382ef71220892a4cdb6b3d3d96e4300428d0676d002076a7077ebc30c4eb859bb214db8fb6d02d482183ea8e0030fdc7d030108343530e20b1913b8bb978022d0b059b47e60c4dd6d0b425081e2c5000a20e3ee360c1d0481450d23c038c2f521202602990bdc7372ec0966ea0afbada238af46a9ba26d5d418ec08b68aead726ce5248281b709dadf36641291f11d588b6ce9b852266a6d1ce75ebd64ce3a4214264208ccf49d1b316db2f2455bf68565b5faf6b342275a7279199e697ce2692932548ee7ee4e49398eb95453ef991cf75a7bfaab019ceebd646502bac1881156438d1e2e48874c2c45dae3fa570228299b5517ab65a619aa05758e1ffb7c6dd6d70d28502b8eb6c6466258cae19499de5e8b85c2ba6bdc66f7e2e7a8d93c800ccc0dd9da554f46ba6fd4ef1b962a4cfa9fa3a3df14e5524288a914471c2d259ff466b1896cd4fd58c16d554f373d1a3e88983d75ac93262e567e5d9b9d3ac1f7f4ecfd99a7736cfa3554d7a25147d143d93fe754da739cd5a8dbd7eada9313c4bebdac62ba6d1f0d74c75a5fd0a66deaf4cbb9257d0e7c649f9c8b374ce493b17bda99e6ba6a5e7ec736ce85bd0a7792679d6eb736ce7d9b9d71a92a740d00e57dfacd51439c964093f7aa94df0c6495ee591359fb073a7d90cd2f995621417f1c0968064c2b93bfe53ab340b822568621a8f412ef9e2cec2af1376ae19e9ab2ca9c23ad7fd5786253b8486947491a489925846ca3c4e2a61c1f52ceff3cd87a9af318a64cd518050f75a12352e98c4003eb3202031c35d356b5a470421a0e1d4b3daecbc826756f2e7a257775e5f9fafb44f14ef5575b2ae404750808690e0b83522cc1462dccc5684ccced738e9f7799af9849da63afb34e7a29710a54d9be5cf6b4e7a149feb7ed809539fa6ee7d5ec949b68bce1b2d3ab5566939b6f56cc59f91d422fc39b655fd660ecaa6fae448927cae43eb2b3d5bada2596d45626f28895675e335ef53c3c0cce689a4aeb4cf45bf756da686bbbf9c3482ba3b08dcdd5a6166537da5f995d0fdcaebaabe86766878ebd9b98dfcf0806c0106ee49ea938cd2ce750896a5f0f878411d32cd1423597394575a53d3b4dc1a37d15b67a333098ab73a944d15c9ce42e699446bdc64a7351589ce5ae797ba46790dc03cd7352341a1cd92981969cd3a4bc9af14d7b40eca48e77ee134086f9c44d35ec8a68a24293f395af16ccd1b4fa1cd5626696e82a2e54cddba86249b2a12a3f434d31c4529bb8091329aa5c43466b2afe427a8a6cd5626796393f6827926c91ac7a2a4eab96baf7c0548cad6b8899969385735b66b656d6b95490f3910801c82c6ddd535d390511367f4d5fd7a9f45bfd37cbe4e18ac063b637aca10d2dd7b9c1c72c57dc70701783ed519cdb315eb9a7a22e5358a5e593c2c1e968f9c1ca57dae98e6007094c39c14b2a4898cd273d5c9352bd9247a65a44d4b91a7e11751524e2d10aba44714778f0068b2e05d443b6bd79be909fbada648dc9d09775fc2dd957880bb87717707b87b03dc3d0906b8fb029070f723dc3d01ee8e0077ffe2ee46b8fb0186707721dc3d0877f7e2ee40b87b1777ffc1ddb9b8bb0feede83bb1bc0ddb7ece0ee3ab83ba7650d12c65979ada12786a9af6c3e4c55579a8ac40c72c5631a1351f921036b71ff4f83cc1347c95909f9d3230c4313eb8bc23034e5bfd1d1395a47bf5433273df14c473d592cfd524d1d9d96a6ed1d5bcd40e5736c280c43d34e3312104b6bdab95f98363b3f9f286d8673128ecba5be99352e7adaac56f4f877367a1c55e85939b67fa759bf8b766e75bfaa51fc3a9f288d867fcd678ee9dae7a4cfaff4d479ab4fdee572bd901b165ec89a4f27392bf9159e85cf194694aaa75e3d91a79d9b686754c80deddcab178a5f4444fe77465755c9ebe87c5ed5d4e8c4d9bab6ba5cae677d8eed4f5723dab96be82b3d5fa9e8716e68e7fe3369f566a6e1d4394ae88ad17376eac79fd6d69c9daa2bec53fc72a178b6ea14e7d9efa06769b4f642f1eb315a33caeba7e7ef34a72aeddc8f4d13ff9a3746710c7f7ae25da4bebadf95338c08c5e909737d8e6d94766eb4367badcfd8d0bbbb4b699fab7aae34d7afa756d5a257f7ab68e77e14d7f67a22a93eef1a6da6bede85e24c83e25af389d2f689d6669f33eccbd7c26f16ee3e73928787bb19b46b50f0baaf00e5b5b6716a740aa12836cdb2d66abdce35a7d98888a65fa74ecf755f013273fa42eaa40f1c1f228f1a3a318d6369add5e2f982c70b92e70a777dcbf51bff9b79d36aebaa226911113d8112242405080622a025a5142843424444ada1fc4ad53447a7d5a21111ed55a5d16a3aa7d5cab373a7b5b5c708dc7f5561abd1397b357d1d90f862a779a684a30c65a315c790ecf460f5c879652414c533edd6045fed5881673ec58e1287c185bd66a4547dbdba5f098de6fa82dc9de6a4ceeb95a58dd233b689d64c7b9d3bcfdcb9189460fadc589b79e3bcbede283d73d1679ad2d63bcd4879a5bdbabef0ec85b8aee0198f1ff23757f08c878e95157ae6d7ebbc15977b951872c0b8cb10431538349c215e8564410cbdb268b3d7153c9ba96ba6e1958a3e9b27d269beba7fd366796feceeee960c7777e2240b4d62fb5cb18ea6a94844af4cd3434630bc324d489f3aa77989e5ec498b2e5657902b4471d6ebd5272b94a0020b4e6448d5739f66aabef24a7b538ded3c5bcf9a95bc5a23fc6e6e51e0eed8c99b9e2026ab262aac602889a8d5d2a97aea34ef2b39cff00a9b72f4ca31242930c016ed7ca7e58914f934a3441b96512213557de081061e52b8db9abbbb9ce4018075a7598786679b1307e060f0b2d8da7c2244fe66956694f55ab50f3ca89a70eff1393034eb2742e477cce8cc31563632730c434148ca2825921ff257cc33afea2b3d710cc989374e121425a63193224568b395c91014ef54a5e15cd558913428cf884ca1562b9feb26a269a46cae38294d529318e9d993a3978a1ed99868a75917f9a90d7965185aad57466ab5ccad89681a2731716662e21c7bc264abeacae3a386a4d288aee0d90ff1274c78905a2da2ad9af808556978e324a97ac260e6ad4fbde62830b840c34e725e878ee42237663632cfb5a87c1c3308af38ca6ac82bc3a05f44e70d8f8fdae3f0f8a8ad320da726cab55cb34264c63466d26a9938c7885e5666445666260f27701b70770238694211e8592beac1f2c1e2c95161e9999351fcd2664e8d4ead63db8500043159a2e49a6e93122890268d0ac870772a4eee50c3545322ee6e831aecc05264e673dd40ee9ec45b48dc61aaba46c9a6faca49769a7551197b6d3cd3a793adaa26ce5294d69d02a1d8c459ca56512113e758a92e49d573bfce75eb2c259b7835a2bd6074c2521589893393971527566649320da750aee59a0062af8d69fa4c9206d1662b932bd94c83b4ceab11106db63271f7d28db4e08ee634c53124b4d9ca446f4da484d1bcb65a4444445b8d691a4e85f2c65bc8283d8db0d6d9090d1e80a30b2d5a68400cc400c11229184205042f0b5801938d0a6011c45341c34d7360811d3a803106851a1d9a2020e565e429420152489183039b03d890400b2692d86082a11e88b4c07377216811deb5592b88998b5ec9c47945b1bbdbb8fbca01e09e224970a57c4484e297da8443608425ffc1eac1ea9193c5e4b8db2ddccac08c93365a5c29c59fe2d8fe98c619063bcdc79f9170ecd5fddacc39fdd8eb8c253d8ed2aacef2ecd59d9e26565133ef576ddd3a555faf84a6eaeb93851fa6c674ed958adecc9f8b52fc72f71f77ee07016e0e7e64662b2f646ffc7863f3b5124e42f19b599fb1fd668a3fa671ecb3a9a6d8956b2886a1d532739a04259b46e9197be1d7e7157f9ee20ee4871b71f7199c14218ad36a47aa8afee061ede4149939f95c3729c20ef76f65537d7d468b70ec85f39ad6decc6bde69fe567aba7b0f77df01e3ee3aeece72771aacf80f775780bbcb9c0c017537d5175136d5f45cb78ece48e73e67e74ad3c12f9f9d1dd88e8ecf4e109c7df4c82f9e203c3f80f414e5e48dd7ad8b6a5a47ef9a7af4cab197ce3e8dec119699f73e6733f56589b08e5eb8485d3f177d8a5fbf716cffa799a6befaa4072408526c555d5f07292741b8b2e6a2592da5bd1246b394334048e2ee2aa43aabe69b38c77ea779c551dc71dc5d06277370e1ae5796ced14b458b66796b259d939e38f6c22ba6e9e89d5114d374740dadcd6a2f9dd7aa593beb739f284ed7bcafe447f14ef32c55d7132905f222dc9dc8c91c4836363a9170aa93f3ba8b7474aa9e2f163c353a519c6938f5aea94ab8490b2469c4dd8c25977fb3cf39e78858ffc058b3b3613fafb15d081665411ecec737223813be0b821db759eb225c965fb702e05ab0fe09e9bcc6b36eadedba1ff774dd5abb5d26d67ef65abb79345c7bed77439062ad673fbf76646dd7f356a6b7dcbd9c17cb597b4d5607d786de59ee6ed95ad9b5f6822f5c1dd75e8fbb7606d75aef5a015811acdd2e68a6db3e940dc15a6b6f900b02b85905d86bbd6beddd88ece54ce18f2bda22a0ed786c44ec772fd76333dd6b6f6a7a6c01b81e27255b94eb9cdf07586e5b71ddb59b7745d82fac5f2749d2ad5bce5e5b030bde15acbdddbd9bb53eac8e05ad78efbd1e12abc2bddcb53b1beb340298821d6f90708db0dd1dc17276b37ea3dc3759ceefe9f9bbec0f9ba7cc5837e281bb59cf729f1dedf6e55eb0b5d99fcddecbfd15c395edacfd76b81e27ecd86bf2c06badb59fb52d7bef0a36cf8697db90acead6acdd726c78ba16fcec35724db826dc1236dfdcd658ef5e3b72e4c6dd11eebdd6b31ccc863ceca9bbb6b3281f6badb53a6ed0770aaf2d02c5ef5a0158d0daed5ace32b125dc2077c73dddef7676b3d75edbb225dcd3fd38bb759bb53e76b32b1b5ad15a2bc49a704ddb6741ce5e6b5bd67a21dc1c96bbb6e36c907bb2db35c16edbbddce56c907b2d09d764430b72d75adbb2255cd3b7590ee4acb53e6f6d5600876c2c7476b3a1e56c6c18b64e5474986001c0d97bbdfb654b82b0736262edb5d75a9be39fd35c862cd68c186ae01f431264a0892115461953f0171278e1055ef8504a052e944409b210c6c2a52441460152522a1401242133230afe61a4491226e48009deb11324091b9d2018d584cf0b461e3e2993ed79815da3c79566013dff0367b9d23021c7b5c4c5f102022aceefacc002181c1b9ce07af18417e18683c13183bbba20fcb91cdcdd57d02b0b6f6c12795a4c288860e90bbf9043813d5fb895200eddf04405ae3c13f8c3893596133d222e691b371b1c17392460c943dd2fe470c6127e24b064824134391cd40df7878eee05ce7a4338b044a449121b395ccec435b9e1c1120c705801cd0db66bd938c1c80d972361cba1d954918e052d963cef84285a40a839a2c3b6e4061e964608a78839c41c34280181066ad30e9686ec70894b08f20bb7b13be20cc0e50690437925d81a1f378cd18070852d0237b8bb009cac62c7cf247d7e118d0c174e6609f50999983bcb54424ff509191b77374a4ff48c257d4945086a6b8e51a1434e31c6141498628a728a142bcfd457d6fb9561b0fcd9d4e54ea29d9bc4800c304084bbb35c6a2cc975621a4eceb0c749b1d78953db2fecfad20c62e235b026343c07dd182aae57969aee34cf5427add650929a5ea0870bd070019505b648c2024158a0b48058810b54a001ce72f22cd7ce9a68cda899e2d8df7c7abe2b1fe1dd6ab91ea6aebec7ec2617b976164aa1b81ea6aedee572b9948a3ea72ac6b14751fcca6f0ee5bcc284744ddd3375855560891468b83b4b6b15fd5d533fc58fb36b455a8d2549b184144baabae2a4520a26ee2c295666a64017beaa27128ee5227dce86a080119ad246717a2a61690ae89c61bf9a4019d68d0a9bc015f71b75ffeacdd73849680246deccf975254f00c53a8a3227d297641457bc6646c1c43d6674c65e557714efce525f55b7183374c468c03d27af34a5159faf1396d37c0455d5a29c571851524e5bad21a2a49c6e9d4d312240c105144340b1040a974017ce726d555d5d37aefc4ad527abc759d5a49c2aa13475a5d1f0dfb85cab3f596bde2896c01212c0e2ac212850a42061bd52117e02064f7c7902f604e944154e1839d18213354da46942024d4c89401a7787c1c908301181983b00fe595bafa70a6bd6ebd189fe4daead7bf519e94471ae19dd648d62d80a47e3d8a328264a714655b5e8cb6fe5b068e72baf2dd7d6d9747d0e8bc57aedfc383a1be1352ba558a98896575a4e6baa128e99f1ab43cf5a7311ce8d2bd74ed7a779551fc7c431738a89325a84899eb59e3bcd1100995001134c5c6101009ded188bf52dd64e71d2d754a5cfb373a31024089ec1c5c44a8b2544b0c41567cd6a5ae3dfb5a23cc3429fc332f3a6e5d7958caf00292153228854e20615103021d0e301633c808807e0f080fd80d50336771f8093619a0072320c2c4ccb013b7040051cb0e4ce9ae93f92e4d5f4559d9e503e0745cfa3df6a8a6213c7347e259ca48f5635e95d2e33ada178eb5a12d8c78c6a6a9aa5b88892724a94aaad560aa5d51a72fdbf799afa73fe594afb3433ae1525e1d54cf18b28af359d66d7e7fcb7a4b06aafa6284c3533ce6169bd669a8a83e2d7b9cff5b56b45493e87b5aa2e174e4e52d15cf4fa7cad42106b5d735e95b85c2e56aa755e6139c3320dea0a237ae973760ea138a6714c85a5410df042c3792d1b1073774fa134c088e3a4f7067812689450b406cb684926b1c5592f1c33cfd759134a62c78dd65a7ee5f5d535d39093aae9e3284e824103860896998f3809c68764801aeece72adeabb5c275066c0160c10c29df5ca343dc3457ef4d48a28651794f2915276219bea8bc7478d01bfb310b98033dca138b9001c16f02389930a30c3dd595909cd1bafb5d70b2769a57c5454d3eadeaa2a4569caafb0c20a2bb0308a9e2e900a18e3fb9c650510c0dd5f705201211230209100f32cad94aa2689848d233270841447843922872390dc5d004e1e81420252908032ce42519cd73de5594a6b467a7dee349f2cd70d921514578fcf61dd64a453a7af5dad967a12d1b4eb358ae2d7ea5d37422b28ae6ff5f81c17518a5fae875dc9286da6bede25e4723d4c752171b96e849e8547924df595948b3899802bee2c1aceb1d72a14cdb2d665519e2294002509c07177ddf45841717d0e4bfd23ec04286b1c8b5264486bbde6594da7ea6b056ab5868a98414343884c5445c04f4e6bfaf5f94af9e84d5415a2b4cd1c7bed3349cf5065cdaa59d354aa7c8e0d21009ca10a952acffa23552dbfbc2029a7458686c0a034516349455aad221affd0902157d423288a5f5f7cbef830a20b6729e5a3a49cdeb89272ea5abd1954eeac8d9862040b07f082b56614c5aff48465f3f599c3d2b5d83671de3a3d7150141fc088bbb3b6aa4a29a28b229a28820877b771b2082c45d4c8228e8af829e2a70815dc5dc84922b2709d210f00d6cece0ece4e8f67e151fc727d463a37463ad76c4ef91cd6cdea8f24f99c42f91cd6ec6cf239ac9b1e2b289f5364c8038045449463438e67a7d1b9aaef12723d8a5f3bcdb15d2b89c8640cc185bd19021dc205aedcad0a160577cbc3c921c821480b0077abb23b52eef64fb02548c9287aba90949f98d9549108095183bb0bf142106b44f9012224847f1fe199b9aa9f9e592dc29fa4a647fa94f22ca5bd669abad25ea5e40788d6aaff1f2042426fe69d4d960a4ba6142561e52315293db50a53631a33d97a3d6b2bedb7ce26aaae66efe49bb0f43e6727aa5b3a8567c5689faa678eb9f2bad5f461e7dfac3e6b142b79968bc747cde5aaad5be3194e5dacad55f473d17faaee547dc1cecfba865fb9e85d3738add6d0ca15d319a6e60c83a9337da638f6cab3175eb7115e3352467376cce8445fbf54f45fe7d6278a9643f27e65a4c73743795dfdeba4a9fbb193676d7da2ef2a3234c435cbb1bda66a9ea95ad7643035c7e8b79a5e518f3c2b273d1f06350a46f59994aabb161b325f3f6bcd26ce319c67317996cb25f4ac9b7dbebab50a9a8667ab7f96c64e70d61cdbd948ddbf6b3414df7c7afed0b39204bd4e8ca235d80c3f79659a50d638afaf34481dd266ce4f5eea509ea94892a4665ef3464f25288a91745a76d8c1ddb1dd119b61fdb966aa4fcce041052310010f6378688287303c1cc1c30e3c68e12107779afa3728acbef53a7f83c22badeac6668a678f83c2b768eae3a0f0e9eabf85a37f062a3c482179f8b959b586d6bc661a8852351552d72cc30e2d10d1708e69a25d53b3a9eeac51f43c228aed3389e868c5b3bc7658e850e5071dbc04630627c1c0e2241855b8bb087e420a2e4290178071f2051770f2056b38f9c58f935f4c71f28b1b9cfc420927bff080935fb0c049303827c120f2859626ea9ed58c566c02ce1176498e294a6c0a640e3eeed383b593b35575d5e74ce7a5cf59aba5af3889038ed689bdf2fe8df7aad2f2fa59e38cd25e8899d76c6474c63eafb58c74ea34c3b2f938a94a15b70a2a266073525ea730a184757756d62afafa2bbba6736da778c546ff34559d129a582f6d66f4f5a9aa715e7f6325a189a5d34ca3e1d86b5c8493563c8bbdd25c94c21ec5e72bd3f4632402a460dd890d82c22103777fd4c92c46f4cada57721a7503111de19c7484f314a157462232f32bc3606633ada947fc65c3cf0fd658c37eb14578a9c10527b184e18f939e30f589bdf2aa914dd7b054b0f0f0e16401c8f02456c8027c71f794995f18a5e5f555a575c8e228c0104b27a9289a9e784d1205cadda9b08003481abce895b5b3ce48ea2c34a5aaaa69347535df4c71aa2a7d5a9ac0fd89934a4eb86b149f4586fcd638a3bff12b15a151fa21affcc095509d8d308d8673ac0564aeea2b4b5161694ed524ba54cd9a90894429bb609e664de80a902ba2bb6b4ca49ab59db56ad674121796523e7ad5ac69974b356b4252dcf34c15caa9fa6448356b1a298cbb034122bdbbc6492f0ccba1a96b9a8ff0b61cf88513b190071c70258cc4b8bbdb30c303ca408228eeeea62a28fcd4b8b8abb093a846f35a14f7da0fd74af9884813d576d49c0cd744fb0ad75b8a8d841677df3bcf76959dc4ddd3edda0cd72dd066bef5eafe1a2d3ddfc447f4ca6ab55a267ac65e2d77c781bbdfc0ddddcb00c158afb83bcfaf60a22a0dbf542757d72b8b07a9d5b2b2390fd2abbb66ae2a6ccdb45cdb1a373180ef6cb4e2fd4488fc5a7b6d01b8591da944fa64dde8c77243f4387a950296c759b39966bd52ca47444a4544b1d78ab326525a717a16b174769a8590cefcca52cc15bff499a454c24ad5333d3fafea6c069789738c6867dd6ab9a87cce42cf72b9d01a7e7df9ac3c94e4736cab480690a6a751fe9ce4ca349c668a612a0cc76a49669af5efacf45b4d698fa2e7d69f57bc933e8a13294c9ef5b467cdd4577abe5ef1ebf5696624acdf4c315651b348cd49b9966b56fecdac71d2ebb756631aaf3f43f30a531feb13c55b09cf708cd21367d5e79a61f877d667ec44f19a67394653693a9fb3c7afcf9fe57d9eaf37f3ab66a639b66770b9a8b8f24c1572bd3e5f9f38da5cd5a434e859a85e5f9be9a97e5a3e6b6b8cbe54adf156d357f39467e573dd5a857dae99b6b366cde07251c97acdb1adbe9a26e1fc30f55de73ed39328555d2bcee8eb73518e12bad35cb39275aabe567563147d9d696d67fd34fdad67d13eab2f5692ceaf7d25a7eb0c4049a02069b592d4f4880845731295195cd9545f2d1795cfe79ab4662435273d0e8a53a353e31cd5e875463a8d34fe5455f5ebf259a689e61386f33a0d7a9d9e341a94284a47ccbccfa233a6ae518cce23aa3a84374e92d1228c9e18a9dcea1373ab4fd42766fa424c6326472f15d5af93a60e6de0154b29ad19297f7a667737230c1a94b1c3dd6b70b288027a65e5579ab5ce44669a8f5eb808154ac2ab19dbe714336f7cae1bd3b214f3859d8586b6569b6c5d4b62e624d54c81b01838c3d4300c4d9aca8761685ad57505c263d0108a622457b093b4c915ec84353bb7ceffab0a337fab4f744acbf9e8d5fd3bada933fc669ee127cfc27985bd6994e2d8eb715e5868a6ea4fd5d7472f157df495d2f259fa7c8d5fbad6021a82f2e4594a68aaba5c8f5f675d7329ad78dda9fa324f6d94aa287e97ebb5c6d130989a4dbc6e9d67eaab76e45d2e5d5363a8e1bf48912178e3248f6306ad515aadc72932a4d582a15968c8ec8c09d1b09327f27955b7d0ff17e05b2dfd193d6933f5a5a62e970be801f02cfc297e98baaa5ba3b419be923f9b8fb7de35f5612acbcc35adcfd7fb4c6b8fe2ad6eadb44ff3ac5939d3a09c04c5e74e73463ad19296b30b19ad9939f612328201c8c43989564ab113551d72779f81bbcbc0dd6330869354b090546862844145c7dd4c6b9fbea043caa07dad9979c5d9fcd769a4369161051944320611c470c65daed748ef727d4e0ae55937f957d831a373b6c2eaf5ebbc62f495cd7f20c6d8004c02bea8119969d644aa59d39868bf709a11400ea0042e4bcff7f1e1a3c7a995f40074d019e94431112de72314c5446b86e914af7b4d6b44f9b5aa300e0977841bc2fde8a4c829ab9be2ad0a96ce3ba3d94c833c08a890e34d6119a5ea9af479a60a3d4b17d5f4c75e295e8f785e4e5aedf5521f76fece9ac8ccbae6513161bbd199dd11ce7d3983cbc1cd8a489f46e9b9f57925a7b63427b8732f3807c4f9a4c0ddb900bf26bba6e67dbeaa1f279b6afa39b6b7ae05c0dd51e0ee5b68e1ee599cc089204e0e2571f76caa695e55582e4aca4f183004a6279a9e9f8b7ecd4819862984c4b04ab75584aa78eb044652aed02b6bd766a247be74e0a4699d346f38699ae0a429c449f305274d2a4e9aaa7b8d08374020a96cc0492a689ca4b20227a9e0c0492a6938596574b2ca3b590588bb8b8e830472cb124e6e91c2c92d669cdcb285935b72e0a4014614c54836867d4ed5bce6d8d00851b6ce43aa5913d2422670f712a071772cdc9d04641430eeee36ca96a293887a03308690817ba765a8e44e30b6454c32a5d0cc08080000000033130020381c128945e311a95c28a558b3071480088ab260824817894190c39442c61863080102002200000030336d14a5dc02a3fe92c85aa90160a3e762a940c1c759bd9a62032aafba953cbe317e705c752922bf5080cfdd67698df8ec91124aac5937d944739edea71dca702d116d56c8ca7557ba4c0a0c22510afa9f55c45354946ca7c3b3530212aab1c1ea01ca516793315975bd94d0d1052a976a7282b2e8b02aeccb84a104b978b67797f135c359ac0466a6dfdb12aaf459fde70d4af6f6d29d1ce94d4bf344acc94e463bcc4716300abb7df003d7699823bd5c0a59167f520ac84515d4eb89fc5164489da774908748e109fbd37f68e4d487dc7c951c5982040f977fa97bc2ea0e84e98bd57a0d4111c885c0cbdf982ad04a0b771324ea2b195791f0c9ea347281f1350c49b9c348fda8480287516abc5d44c7d2ac30a39ac3f48e9fd5f0434023f6a81bf5d6a1615a55cae2dc8bee49cb5836ff3640d98bbe90a2dfaf778d6a96ffe2398d962d64ac00bd2b6aedea0c7e5f3448b10957d0abc11b87656ff8878489c582cecf71e5d951e32ef57278ae71ceb192a2eb6f6b8e3f4f740e387cd5c95741eaf3fd2b38c9ea4453a04bac8ed0e8e9d730f7eaed5c02516f78a8fbcf68d80820af9143bb2c2d1aca30a52539199c514d69909ce3669f5f4deb717f0a74b88f7253188213394f1db25667785eadb32714d1db3b53ee96a8e5bfdd952cee306210c0d88c504c3e8659486728dbfc99140dfb4adfa8388bc8109e0cd620f1287dc2c736657acccdd9964fdac0db0004ac12bdc99a639484280dc46a094bcdefbcf6e69ed3624d65b8227eae21e45644b1e834da0d851fcc6cf2f834c998e1846f583b7fa5bde23e10cc485c90adc2e1bb593e94ee654992c4bd19ac5e65ed53149f5d92b7b8694dc6d5c4c487d1a3d124d94903acd4f24b61c4bc130c8ed317751c744e21bb416085e86403e4aff097be60e8d91326cea5a6bb11c2e4fd74352e2c7a0016032f8e08eb02b101d74860af86d232bebe5b2b69c4562a3a8b7edf17610e184b1658cf4adcc990ebf8e2d15edacb53c20d5e4bbb7c7d681bbd62401afca152ac434f93a178359e33cf5544368adabdc37ec8209d9b3f83bf872a1f3a012044af22adb3a860e1e0525205ce262cc9d1bb73ea7693d338b5957cb2a38b75d339f7e786c7fbdd73269a9762316ac0f1c0ea91d46f6d30dc2a3fe0dd1bec208de96ee9e5f253b73904bbaec0df0ac1d48454c59387cbf86726e90c7a015b9c4c6e21461785f9a873f6e4b0cd940539eb809921439e28c9c04d826e2dee199d2d062ed74455a9a817c3e711d37955314218c16c922ac948565cc378ef960e90fb301a3048c45acc59bbf6b700643e08f919cb987a6f119ae319a06b1f379cdc6d87e1021600e3c17fe1d5250afde2c37c809e33d9baa7bd258981332cf7f5f3b8c132ff063acf6d4b2ed43e6d4537da988520c35207bd77e40d442f60b80002e11ef36c1c83c104611a16487d41d15df0ee99a238b31516567616ce194122295a2fe96b520149ce82c93137efc22f48ac7c722d4de57720250e8bb49a9710e728f722b983eb6360acc60d597a9ba4477373ae06b50711c9cdc9ab50cf47bb47ab429ca73eb6fd946d83f6b5ad43ac63bb1e6481b729a18c0a5c4605283175a8a91a383a744c571181378e6e430c855dbd81908d53279e95754bd5674302ffed84e72dfc7937ba47516336009bdc9e9b7b5c5291d56397dc893c7da6d56e05b0194d95adf5a5e87b5f48bfeff700d1181372a22d6fb6f7e53f82751dab00b968263a33e2868b3a42cf45adcdbc9614e2c0cf77afbe619a485dc35675c96aae2c3903f706a56bb1d2f2ae32005c64b4c1592558cdcc8a2887b47fe0d11a1cfcf2ee5bf834877f238bf4b4ec3b976f0c38ed008dc1c90d354e363cd869653fadee0d43714dbbb0aeffb59d77d705bb1090dc36d49f308df7542fc6f86af3b9e129bebdde19459996a9ef16866bd61a803843c2b15b089ed50998d4e7f4691cea693a37bbbde4a94360517a37709cef659b16a43713f4f8a257524def4af09bd0a1e6255d8a6eeeab9183e2f3659f525d9bbbc81d8cc25df7744079b26c918c32e98b5d8ac7cc0bf97c6a6468be999c03bb61dfdaa0f1c84007c33ba71f5650481534cb385954b9bc73b05d5f0fd8a1e8a10008bb4d95cb36574aa83efd6d2adb02928e1aedfffe00a7987d37a3d1493d6c37269587a2dec0988257cff11f237ce3822ba6099b483e6f5a57b561e243939c894fad6c272e1c72aed46cf97d4ac56a9554a847883bb8d99962a452cedbb457b606531f5e4ee6cec48839c9b6a124cf8dac287bdf1c0a9a9aa791801c39406a9617187339c399f7152dbc854977709f1781a2aa0ec0a62315378220ba8654c349f1525fc568f82c6b089be746668c28c96cca880bb07a916769d5f164c17bc9ad8f491890870709918b46264790d03fd0c2c2e83ff261edee1702c119680f0da0ca541c57cd752700f3d917d2da684ec23fee453a3b7c8282fe64479fc93937f9c2b41f04a6fc035372a99ca937b11443839d1515d68f31e810d27030ca486a892427c86cca5343ff86c37c797e9ae984b6310261e2ef762d9a3b7f6e54dedc49ce538b7f7048c78ab78fae0c3222c0ba639eba851c96a41d78ab2d82b79d65d5797da6fe10eed6c934bf8182c479c9501e3afd126d200858674f78f546c83755fa249afe390e2df64e16334b6fe788902c152f71af841bc0e0a5691cb0e3aefd51b6da187f0df270bc3b2d98214cd60e780d28d5540aeda5439fecd3e75f270d793b7e067f71b5a407af5ce7ff57cdb8a2ed363095d396227d91b799cac255cd6b5cc657302e2f53889d6e88d8747185002c5be168f160a7abd3aa6433636f33f9b059cfcc837316a826dcf2bb93ce333c3166dd8a17b0940020be4f220f8cfad539c9d933e67f4dbcfdf42be977c0480fe9d884361bda4cd0720640eefbc9f2db8d8a3620024cd374876bdebd30b840de8af213a288aa153386d35c952a3f6e90affb3a03a821359b1fc074f1c126e2a839178f19c017d4bf4620be8026cb4c6f97c81719c75334594c81fde9c46231881e820b3a2234a822627bd7454c699ce8c3718d7fcb8ace9c2c801bd58b11519eef886b436c7ba2afcf618cebbc251b04adf799b8593d4c92ea044eca2ca716ca95a21182b665a7883a55dbebdec10c689cacfca20ad9553f11096735d7f595456b7c08952b15ce8b68227676195e82c444d3ff85cb5c6a1dc34f615c3d0d4ac1592b57aa3296a40a39fdf79688fac4e4730be02dac963cb4134a862cfaa0d0ba9b4cd238e4ef85770a3b0312ae7df927d01037c0a5cc780a0b81daa69010bfe3e778f93d92ebbba776cafcecccf9991fa4e82a3420bf0cc7f8f59a600b799ac5c2b99cf4ecf764d8e87b489629ad4ccc961a403ad3249d9caf0b5cb6d15ed36b48ae49214f9eee6afba08b0df7daf9f984686edc0de2d1b30c970fee3201e9b1bb1e1f550f8cc51a834028cad7cfd14dfd6322b96f18bf7318db750a7e5fd1afa921f169d0331301cc2d6d589936be1ea8cdb7d2f269e30bccc107463e78c699da59fdf1ec5357ad6124d268745f2b1f431ced3b965bbbbcb05a7eeb18205a48e1538ec6494aeee1eb864afbe77ce89de2681d1df99e1cfe5ea5946d2d77df1037c16068bf29fcd72858397024d716c927d979ee7b3d66e46160b7b21e02c2d06d8650ef9f3edc299bbe3c6810cc080d9636c994416316546a99e5c9034be5a865877547e1084c7d5f60bc62fb9c45b4b17daf6f0d18a5b0cdc21920684eadd197cbaf4d6741718576758d85e6db345fcfb68bc835cda045fe360f29e4a974e99d7310e390effcdd2ed7d9be83e57dede553e1d8fd0fdbdfc92eef45fb3386c95bc359fb1b322f40d7130d59c4bd177c1d2aa60ab947ec492b170b1c91a2b70a8a762c87b5e96d3fc1d20ea193feab035a31931ad43ce4974ca7e454eaf0f38962a7f688371c3f72c186d973056d16c736529cbf50a251eb7027e9a833bc4b6256e0c150f16fe65d899210f0416963d54c59f17f7bae07ceb66be7bdcef601c7895e4bdd1edc2ddf11e5bf8cc896e45b51f83e2ba60207543ffcbe84d8b63b74318f3c44ac043cc10d4f3d15d072948895f244ccffdc48b13eeb9cb3993f24a299dea71704d722f904d2cc71940703b3e4a728e807c1c1d14a99120cb3accdd6587d36bd75ba35142ced62adaacbd3da4b2acbaa64bf19a1c6e44a584e90fc8cba1f5118d5f382d26db897f214fcdf1b63076a3d5f7b6c09bac9e827b32b62e3e95773c5291e5b5266eae3337fb784b7efc1f9d648d5daf0348e9c048744f386e7dd8f10fd78d525aac7e27ea98db2de146c0c442d2fdd1636a83fa69ddb0c0e4cee2d961ac567625cc87f123d7bfef65a7e3774d01e4de007f385b1294f3e24c8be101c9212a975845fc6d809132ccc14bbcd130e59c576f8e5f841b96264fe7ea838c1361a9484018c46c4e6820df0351adbc268e982f4a835a53168196781a1e88e4259944423feb8a8ba6ed42aaf75c19eb89865db12be1bee48815bacb27b8e59b104bb81a1565d26004fa3e7c312d125757357fe5f831091487893bba5a0e290447cfc62660252bf4967628d23daf3aab608d05c76cc93ae3155c8c22b82ec3778fc9ff18996e64a2359984297660aef9c8608ea4a9c3f7e873e1093359f40b43e7e00ed84ec7d118c89b687d465e81f24ae32ee28dd782b7021171be0bb4900fdc60746f64afe4a000dee58be069df1d042a0bce6bfd94a10963c6c9e988a3c3ad1c1b0b74695169fffa78580fcc950d1df1cae72c05e2c3ad5d5095fe125e7972dcc128d2e3a613df18d7767255cddccd0409aca899b85ede367c609deb07ee2516d41dea6f4b3b149688c6d003edf3852ca92d9f07d0fbea351436edda9ab4a8444f2a474e2d6f46ae659e9316b1d332a93078db6a8a9d86f195a1e1b3e08d96d6bd16c62171453b3ade0cc90ba2dd3ebe68452bf032fc7b2fb47b9c5fb5b0b8c13dc5b76effd40b53e837b3120cb997c4ee437143136e23ba233aec406376c0cea3ee05b2ce3099d2cb36993ea250021112bce532cb5a46b364f563d4f777cae4f6b3ca4c9d6f8fbb087d4049f2d9c9f643f5b3d628343cde96b1cd2090d8e0d28ceecea1d473b3f7c362ee484e60cf41b69325368cded366c939cfd55884fb3e0492d86be1b17ef61c5655e9d521751606d4f20fb002820035f77b600774d63399cf6f454c16bca6598d7beed09cc7eb33cde558041792f20f39e07344cb98b2c5df3946b2beb112aec11685aea73a54f67b837bbab0561ea21278af2666bff9c3419f651c0e2770c6db2010a710f5cac64ebde4966c8d62ef7d6d4f048c0fd693163e431b6fb3c63c8e23d7dc5430e7bca63a29197cc9a927180ca6533eecaefb12aa2d16ac260219dd1863e993f672a39bdd0521d469aa1fc692d65ee74693bf8d26c2457829083593903c189e7ed78dec0cacf0288919bd9ec07a101159eb9840f63dc44b9635058c6550d7754edb050ab0b62d49a110f3ca40726a437205397df6c07be937af400cd32db5f2300b0b304a47bb342a021a5f7d59a3fcbfaefdba9f55fc0ffc644b8b886e386d91885367204a9f9c5e8b25c7cd766dab00a77d3376a1f3cefdafc27237f7b5b54ef85914e26f0ed4e6065e90cd92c271c8913249d33a3f19834ef0d056d794d56dc5903440b922c070591e92e0df4523b7d272dc45432a97fd22b51171294214e7e0dd401418445b40e8a2918d523c56b763adc3f2867aca5f744b21657792d9d86a2031f3bd06c86dd69ce206bd5a6bcffdead10b95b9107b61137f8eafa30187a051b8e42120b2466ddf5e5191723141f802b7272d9a9387f33d29643af4457eafc6fb49839f1aa00c154bf4543ec0130206d1b301e9910fcd8bf6dc1ea1661845b3742e5cb1f34c15a698397ec080b05d9125f12425acef220fa1086b45ac8016f56f3ff6e47392f7dc0deadfb2ee5f34b17b106f74fb05d6a0ad7ffbc8a3959b49d643922ce62d59f59cb5f3ec7788772d7d4092264bac2b6963209aea01532a3917e6dca62bdafaa76b275d184363e988aaa85ac570e7a261a081d39b94e83c6096a93b2704b4e059ed836c4853574e296cfc300666c620867299456a1b3110ffd224e66c7e6d6ea5753f0a9e869825439b5e165813154158da8655e6eb6fb8161bf31cad6832f1b6e84d9c634c28a49f7432f09b5ed244f3763b5bba75a884f3dd368e43337eea00ca09e81d540dd338d720ae065804590340dd56604b70abac7dbf0f5e9a768638267ee8884ef40d93a80fd268ad06db8fe3c8af0ae64d3d00543a677d05941c4074e5c7f936fd3009a6709dd97395ebf693ec49302b2274c7f48aec92a2cce8fed39f9d2e9d63fc03066d82b91f208a1a7f825643a7918a5d0e92e32b086f88a24dac557f5c4fe7af23844835c4df2bde28ef730b8d8adf377798923f85816f8f60472b9a1e1ee5b556783034af2ed9e95fcad5f39f7750b80454a19c78e774feea647fab8f7d039f7275c0add15cf038ede5da9e2145591414d99ff246db0a128a625dda42af6013c6041333f0215950beb4558e9c77ab441c8bfa8fa0fee94d818729a702f448ef39af683407493b3456c72d330aa2afa21b0094a127f81dfd6f493c40a1787dfa1b675ee43bb93a48b46f29f6663b3dd1ca57862e41c252edba5fbbe655b92ac449db3a03cd791698b9f679f7ed9cc7dbb7a8886a7d5da6a64ec3efa624018def510ba0a22e4db16015a70a085ea328531e8c73e96566ccde65a9ce2ee07228eb382d615a4f935ce45230066198e1f7d527ad94a41e54f884895ab021c4e41d89d35afa555e61ee39090a082d8aa32fd53fc8ab90f2e2836ddd6d9f3c2e577ab6d91a18d8018215792642a6d04e95cd7af389902a9c91d15d182393225018965bfd4619b36b7acd812ad48e861184a41e689a81e238ef143d1002a4b4884b211698c70f0c7c0aa5333fc63a8db6e8ff25010c0cc9ce578b096abc14a38daeedc67f4d8120133de8e307202711569c0f7b2accdc894be3a77348d816d845094ddda5c259c4202b4a6e8b6a517ca1a0ebb929925e5a3466c287bccecb1232fcfa50dc8b64fdd89720039305529ba3905e1639a3dddf884a8015bbfe60710894c0ad61831a8e50c5aa14458fd897d313f1f62c72527afa1a093643d0a7585a46acf9097ef14ca021a45ea034e676f95b67fa8c29a69fd00da13c24297df4d38d4a973523280092b72687016f9699945c0176018eb8b56ce0f99e272879f184b009d2aa4fca3cc6f2e3048193c83eafc714b18d4ba84e42fb6ec4072fae71c1fca720ba8122a02c2f0066af042ccc042575d8c4ea60b3682f0249e5c2e811425286a57a5a59ffaec9deaa613b5ecbbdcd06ce0ff795d4b33c8a0002b0752160372b9a7b2d2bff7bcf8ed6e78e9bd196e90545c4d998cbde49a3fb5f23905a3c0f635961dfedf56f8a80c393ac84629d1133334aed6d3233c75793fe1780d37ddfb62196613b9fe3c81d7db448a1eab930491d232acf5c92ee392a7f9762cb7163820c8193c8b9bcd15b6f8cc45df669f7b1932f8f3d7d3ef7c6b59b51aaff8c0aa792c6266c5ddd132d4fe89f37b653584f13380fd560ed36089306da150821f69962f709faeea9c9db6104b5299c9ed41a7897da6f412f3517db224928b4418c55884137c3f7917145f4a3699e0025b450d69788d899c22db304b9656c098dc72914eebc8c4cc7f13e99466b0a401c448cf1fd641899b72caf42f4ba2f58d64a667dfb8df0c4dec308505fe8ffd15f9cece05e844f4bbafe24b5baaa9e2251849c80e1e5ea2addc2b11de85e2e5ed3611f5b03524e2497100889297e013e18caf258d28472cc7512c315ae90445162aa3abbace31d61f2402d514e7308c1fc7b7d59c512c051dc78fda152443be9adbc1dd25a4e80622181c4844750899e23a9948b98f723aeb5f590ab5aca1b4360f56c76d96200f17c1d52eb09354d9383a1b4483affab08c06022ec26bca036ea8b7bbebf248131edfc88a36d9c857f53211a29ce346c633dc4f8327563faa0b7162fc46dc13e7f2cdd984734667490e4b5c84a92148682f55c14206e002cca0675086a07e37fedd37c48842fc2541a9ef7065708e40a34c5300c892f038968be631d9eca3d71075000bc4a37fab99c41f5023687e95666090d051ea5f6c011a4064393629c39c82d3e127fb04fa8a8768580677ea1a2bda5674778410a4a1540f17621db281a0e8bede139b1dfa6d942b1c2395485101c58d0c6ea5c8353756608c3a40f5df105de7adb3fd60373248512648633ec1aed065a2e6d54ff96ebb997b2f7634ed7ad39d81d2ee7a1bec7d9f9749b96af61a4523fd2eedd90219635e55a37e0458aa998dc341a1ba21c68c602196ad54438aa31a547f9a6e7ca8fed580ccc9fa5d1f6ce7afa9f37e283f3bf55d7aae827d3bfd2de262f784561b6a0a8e6858d80de03620ed7f820e20ca7f97bf4d02b376211e4ae639183004b3d87d01ba5359e5ff0deb604883040c7cf482e00861dcef067a877c311abb19bd01b581c73fa8ef444c1c40a95611357f0a6bab5c1f5705645d0e20635c2e887a557ac3fd99b1e95e0e2b162269951537ef5e4abe56cf240f7d12fa17c3f3cb78c9851cbf2d19e472cfafae2d47485effef921620dbbdc31a03f67abc2bdb3dacea5e919976f2d67db0f7f34544e1f0be49a35b04955e41f0db850396b1ec41668ba9b617d7ed07654f86f5c377364afce1e4a0d512f2f7d76f445f1472f50399710da2ecaad9d0f6dd1a69fa2e0574ba0cf63a7acf28b3e4c427c7e77fbae88ac884721802e5a49a55632128eaff3f104f7cd938b6d1e9260ed7152647ba54508a78c20d8fc9305f7d19897f85f12f5fc72b5f3ddef73566686de0d5af6ef0d68d173f781d12cb5e6d133abc04c36ce11327a309e34b32f8dca98b33b99153d12d949265be6af2adf7e17f9943764fd972830b63b56f68d639e48e64d88874e2c1fbed2379ee19f4f1ef6f33eaa115ce42db47e49fb6664efe94539b8e4f5f71866f2995c095d9390a63145685359ddfc78d232686ab7db8c625fc6f44619ec6077e3820977fc4675d4fc965ff67c4727e65cbbc68060463ff9337f0dcc192b36d33d77e069fb63eec423a215dc93e6bfed7f036496a4d0c9f5914036c40574d855bef67b0bf83a319fcbf5c26cf1f6fdab82bb219fc3040606d70256e9ea55bc6b7d2d225962670fa28a6f8a30bd2742f56f431c8477ae5d008b8c99de2de81dc1a86ab8b0dde44bc73c31a06cea7084ae45328fedf0b113975dd93163f3b7d25af1408109b0857c37c849f1d6d2f9955b6f034b72b9fcc05be4c53a38fdabb80ff2c8c37c02936ec9ec1fe8f861e3d6e498678e16c9377816924ebd3cd4e9fbe2372c3b284984d26c3d645218688d6782f8dd6d18a8cbf81a9bd9777f79748ee77993f14b68a6840d3d5da0e2b14ac9e958d3a850764b5647f9c9647062a6ec3483eaabe7f5a7766f92c4527660d0eda832155415370d2390ef9a2edf3836f4f105838e347290b0296196a8a7a52d8464ec5efce9cbcb5074574021e1897bcdf1b1a5b24b9b3906c41df5ac674c4608020f742f5ee35bd3f8b1cbd77e0df8a73584c09b0b6572cf288516398587e97f3eea82388f586dfb1a1f3fa1afe17888c6a0024ad048b61c7a40cd36695704c1b330728620d28b150e2cba944b94db7c3b7ff2633d781119210712239c4c4d04f4d77119689ed1e2e876e019866712142d4007bb2771e4fb3c8032a27910826c057d9b881210bef32e1a35dc41f7d18676f19f919e21ee5460b43b37d780a2d34550820cf39f9e487f83e9cda199e63293d8db6b79ef67dc8307cbe36d7afc4fc7a4587fb88f420c04a34efa4bc5775f81ba6198c380674cd25d99ce2f083f1c719c002692814e23b39ce90901c24376e7ec0a4b95b186c341c3980d49f085630e080eddb7221ddecd6f39ed33bffd6f20fb4be6f03d1278459d631c606ea672f080288d972e83d82221d1a2f07e8dd0e19a660384c38d41eb6126b61219bb7c239150197447db6a34797f6b6f3d8aed71eeb3c376dd671cc5822242b5a9118ea3816d42f169e3c9d70e7308e282348445ed2a9c140d5ddc55ef81ba6c46d2d8fe9f403e28d28d96bbefa754ee8acfad02f3d89437bd33d1467305bf7dfd3327a0a3411d1505bbd6082de2c21517470ffdd3a156107c1c76315c442a4eded4cc74b382d12e0f7f5398fa31834b44d4142edbb8f66bd97cb37c2a9dcc0d69078fbcf20c87fc71b175d82434d6cabfffdcf984bd3c22a21f919361730dd672f8d73741df1e0ac0e0f3647cf172bb9953e3f0c9551777e9ffde05e7394bcb6f7948c4db5d316ee0cd498e57714463649a58b6b546c7d7b9c271ae70149cfeb0a6341fd3aed225516129b4ba2c69139b5102625c7e7a6f4864a7bb4bd50637fbc1a310acf041736327afdaaa8f82a5cb9ac49a16de739cbfa1cc8069781f3cf645e6951b9af465ef80e8b99f502dcba6389a39b9953ad3e02eb07a03200872d90bbb65f4169ca8d74818aab4f070617dc608d43cb0309cbd19b96b7807aadb29967bdd96848f79d2cd8a8b0d5a70d0b17534254933ec76efb09c19ac54c85775766e748d1f42a027ac55e68f937dc1fb5b8a9bf9e697226e26f34332e37c2268f35bc9d3ff6f2eb507b7771a3ac63e2fa9048e1adf4f5a07245ef21b8eb4b8379bdb5e1fc574811fdcb2d7e511d2ddd76e3f6d63d6f4f61109db6fb9381c708618f66af3c78a3bf06d8616c105475829ebd42178013c4dd584e6aceb8ed143069876d54fb838737b8be457a85366203d82ceaba3027c722bc1cde982929e8cbda1bbf81fdaf162412fbe95ae424529ad0955f79edaeda5d0efe1a803a59852bbf8763e22b6973f3c00d66db0819ea168a47dcdf5f731a076937af5a93af7fe867aaffbf22274034413cfc03f2db32a41d711d5e1c0a572b58a80263b14bb4b61d6665b7c8228a8f436ec03cc935f0a648f4fcc7655dbc7fc28a1efbf36fdbfab31aad68d34a0cb1ff31d4e57934f459c4e37d29da2fed9e3903cbfe69bfa3ece212da6513176d719a8a4c6d12621839d03e0b678c43440e9d98c7e708ba16f25ae7b2e8b9a86b62a98176d0a20f1213b7ebd26e6212002977d477f4278b1d8b72e11f229a74cce4d710e1431eb5ea13a717d2361fce025c027253be6b7dd18db3b437e0b7837d76f7a0ae7f0db4e712e72504e7d9102d1eb0adac0fc93cb848317290850a7b3b8b88bb88e793a711683baa037b6f86299687f2b489e9a62d439b192fa50122171c8494bae6d05fb0c2f9ffdd647f3f809850cdd43dca633395420b49cf0f0bde37f84d209aa725b972976e4fb113787080f393ca00df3428995b007644fd67b4a4781bfd177bbc3254d31cfe563137d747510f379935b8aac1019bd037f5f0d98a664a9973243299ab103e462ad08b88348fb079e7bb04cd9c178b1829b30823f4370b197d13cdeb83c4d881e9e8320e5d3a6897695d678ed8597415bdcdeff3b780143bdcdb20ef385a833b1d5907cdc3697839d63d771890217361b41b1809248269bb5f35fa0aef4fb9c1cfe872d351a1f65502fdcef4dd803a0c73eeef402c466e28e9914ab5d3e8c784dc90667bf0c0a7c6252fff3935b05694a08b19c8bbf5a03193623333487b514a40f0801b71ee8068d6a00a4c05ff39b353f18e05347d090fe67f5c7bd34183fcf0a62710b292159445ac9038fd6fa169595253031fbcb5ef86e8fb857930b1ea03c0dd0aacb9afe3b2001aacdf8681be3987936baf5721c25b7c4e9340cece4676a23dbc5ba76ed38f407a6bfb61f959c13ba26350502bfdc141f621da8ae94e89955fd4cfca26649dc89a29066831e8df1d48fd83228343ccbb0e0515f999d63f1263846c7b82fedfbef60984a7a2e3672d43c56d510b86008a82c36a3840e3aad6b9984016f6343877ef8105a53e999d43884739e4f0c497c37a6e206b298cd0c773a3f2bfa6a2fbeb0e36ee0bcdf9455bd16db4088ac1a68ad9e1553bdd9b2a5013d242f7522fbaea74cf1a6db899892e9500e4c2dc9d123ea1fc1b2848387b68e402dd7cbb4a63d950fa28cc8b6487aba270ea1913c894d432940fc3b7dca26d64fe4bed99053b855c6e426c4acc652952f63271326de362c605f570d300cb61e48d25ebc8a3945e422eb00d0c3999df258006b1c2d3a785def182ff9faa86127f4234df4aeb8e3a1cb4fcfd50fca2367fb56417e881c62496b457e41f24be53d594cb050e7c650ad36216539d1f01b26b8c748308de44cd3c3422a9fcc92a68d28f630c42a4ba3cc3dadf65ea07465c1ce9a1518cc2640db0c706fa38041822d762cb7b9ae5503285190b9ce9a7866fff38effb4c4499038dd5f72a1a0e62247893e2ba9f7042b82eb8d7e677f6356ecd927efbf9ffa4b17fede1ba3603fb3900f2555bc89855816dacf07de7d543b6eda563a3a8cb58e9b948ee8f0b537a45966bf46320ff8fdafd721130835db37ff2fc8b83fff2f84f1e45ce1e7f6ee775f02852db072a541a097ffcf22f8dfb708c4b1a934f2136ca5cfd8d94a2073d8a1a58d6287aa3898e9aa523d47b1f84f69f83fd0181729a57146dd255a1d163f36b9dcd311c66e3b27bf757633192ecfeb0eaecd72ae82700fd5b375ceb3b18bed667494d88b88ac76de07dc7c29885e33498a3c97c18f30b415a9bcf09c46eae768afbcfa638078e5bd751b4ff79b524f5afce66ec6ffe59714284f6af9d28555119f35ed6efaf7fc4e1186af2b773fff2a5bd25814f2c27e6f38d36a0f0c6f13543141df23eb18a4709a427a7d2a70b99bf2f97cefa233cc4091d1d5916b85d5fdf0b9c19f3fe16fb8fb76b7cf78503902d5b80b627347b3030141aae356e826f117c5c681646aef17eb312f70d90e9eb3d91fa9946dd2b7e474bfd53d1cff894fbf0d3b0f6ece349fe1a3c6cefbe954a5fd1fa0e1f7d85bb773ed26b386d763b11367bbd48328e7b0738f2f58af0f2eddb7e26c43f3f5fa66879d42acf06f204f470e7d9be53841ea83badbf0ca4befbd4fed950a834dabd4ee4d96c6be80fb67c40b84fc91a40fe758ebece429f0cf2ecd6a3b74c8feb895e83c613f8f9250d2f99f7392bf321307097f5abb7b00e8c96f7a4b6867d00fd8b39f9778ee2b2a34ffc08d539f2fa87761f7af78ce4fd43fc008d22968afb443c3f97fea8fc7084e1fff03e52f033d3953db8167b54f927ddb87a475b67145b2706c51f41bc1fc49cd0ba6f2ca977d627beff73f27f1c263eaa9ba6a0c665ae01f2df7f95a5114520a27604078c5af5aa03135a5e099dabb1d6fe9769d9bc434fc7259bc25b9e83443af8b254f473054b2781837b38324ce078352be6b30fa1270e7d5c41f609579f82326981b9f444c7cf4bd71e0d802317a5939118101639278842290b98ad8cf7fc53db0c8ac23d032fbe0b87ae3330f6ef20e1a4a1d9f3efc702af0fc25d627f5d65283d9151d2b490ffe571fa316a7a965be0273444a3b7906c224f34c5995abe6d1750bb04cf9cf84f7577dabaa7d10b5fa39a6bff3026cb83083740177098f762aa26fedfd6a6a30464549827ca283fc8fc5268f061bda5d7dc1196c260bd453cafd871a0c3e8310071670e735b670bca81fe70875242e5585c854d27b71015c27392d6c2a3f25f2629a21685bccd7a957ee96694f8cd3d3acb6782100ddb5d36f9fa3edaf2dd2c6f8ba6671b6a0f98b627c39d703285521237e0c433aaa9751e9c9b1931dffeb85440c9bbb07b7a97500b7e39128000183a9db974b23abc86b603a6156037445152b1e9c7d8666dd489556560b0deba667acbadbe8c62140c3a661e4d8c9479c1abf889f2faefcc0f68383f046273143a6143de7745a02eec26d9b813f4998ff20ecad1ea1ddf73ed4d06945eade3a916a1dd7e89feddb232c9e03ec92d1905c6a5225fe91cf8b80acdad48fc525a0c34d33d9576f5b0f86a937c22bf37eaf1d719ff974b2b88b4cd3c588dac2168633f4c23bf339058c89667c6586482bccec8749c13e7a6019853e9b9f28a14d50cd0013a99b25fae773d5cc682472832d556639faf5355a820b2b5fece349fa734d06821992040644d2be5848e04783905c81627659679eede049859fa71ed3c97ed9fe9327f58d3e0b81817777207abcfd0079598575bf6caead377b93600414cb6d8c49ef27c0dda5b204f18fc7b7a4f47fc96a5274e4a7f8cc380923c74b2113dd2875c50618fc0ddb98dd84cf82e9d35b552b87fb541491ab3d0a8c4680d56ab888e2494feb919e27046d80ecf5cd6ccf5b4223294b021a1742547ff1422663121938dc04cdc28ea928f61281c16840f42e7a957576e1fb08b1680d189f082c096e6138ef8637925341257af8d41cc97774510158e14871f3a107f2d25bec24607221355c2c66111dc1514d6156a689e43f742e8340689c0f6d264dbb9900046c97c97a4cc47d7fd121c9b967674d68f6ad728b4c4545fcd903317fd8f664380cb05aa05ac5274f3beebc297ab2e2ba52503449ea06561aaf3e574768b946fd435b5392c273fb74757b81c87fa0c9377c73e4722493acb8f910ecad25ff01747439484a9d541955143d553eafcc669026dc21d274946065e02f16e057790e8717aa61637564dee628a6909ca912fe854ff913a43819b69d5550115debd426ca39df2e09cea5e3ef8127e6a9b90fc8b3978af1b910c68943a5aa55309fe469b1a21adb37de6fb60c1aa976d32ed6e97240323caaea0cbc7aa01c883fef282e1c6f6c71a461b0b9146cfdf4080e943d090565f34802d9ffd00f781f67f88bd107b63734bc640a48c502c83abcb56dc803d3375e2c4fff8c1c1ad31d45d1cbbfcf3e2635bd4079218481f60459e0f502adecc7d03443dd7d0c817ea3887ee36ce5ba5b628e5cd98fb67e472be53bee460140febd26abe2f4e33f8d56d36dac498e6751e88833f2b31b7950dc8704c4c1750eb875bf52a2b10d6a13a0f970e8ee53eaf694419f97b8c670a7df6db1272cabb790d23e4eaf1b9f8604daac59150eef121707b98331671688824be08ace16b075e6e2bd8227c0dedc6323f9e7f0f046c6b178c79adf77069e7f497304e6997b28bc29299d437737c562666b4d413de46ec0f0c6542919297d840c75d92299bd556826441ce57d8a6c8e5f4574103cb77cbc7388fa5074ae2a46d630c6501179cf99bc66a738e31ee2369b518e40fb005470b59881345ec59c656741a5e8968b674cd2fce59ab63166a617a868564c4c94331e0ff880c9175fda6081169438436fa2edf473f433f3bfe1dac1fd5bded691d9c19aeb07d4f7a11f0618c8bb6b9b22e15b98b53522945d5371337a7685075cce0283e13894df04c670c4d9d04640fddf5992966d8af1350164120e056e689df189a849185b1409d2a399f42e34afec9b09462a44abd82a9abb2e6dbda0e508de9a3f72112d7e2be9c445dea77f0d67fb4c5b6b08b78ff35b43f184d906ac6d8261a21bab0e2d05753279778fb3a04e05dfaa69412a7975da7ce4891cb856d546513f32583eb2398d815f4f00a9af06166aa54d82bce8358bf2495ff1d0d78507493f46e58e2c921e08093c84547a8ce4a981c231cd24c2d4d29255ea752cf23c66d24355da842c2b508501d5e83d2cbfddc5e45563b4138106aa4b163d48d537311793edf8ca65bd729c4446fb1b4266def8d6a2e006f215d35a96312cd4b0088d859b12c07af57ed0a39dc1ccf19e8f15264262886ab908ed5207e3b181d45686d689aee34bc4beaf0acd38874f3023008f844614d3e5b5a42f5a292bf7d93be9490e0aeb0aa6dcff3ff661f49730255907500b9107244f426c3e3b4de309a6c6837394865ef944086c1f3dc29211ca928e1ff3ceb4433ef5219557b91f1351004e5ba704358328c401e19ab6b02d412d3c8a102291721d4ce9b6f165f16ff1931db1e1b9279fd3d359efeecfccaeaa9a871736fc572d26c87c06edaa48ad5a5b9fd82f846f9e4b080151fbb21123a55f7e838f148218a2b8e7654a3e4920b8dd4a5ac7c0c22b77fce8e5c6457a9f3238d51eb60cac005c5369a62f03dabd87789a9118bf5e4abce551fda14116db22060e43dafadc28264b13a114ec7745dd5def922ca96fae2adeb7ed1c1048e3e40b62bb1c56f78657f663fc60299b02a68b956438b598c8fb4ba22161942b3f4e76ac66e717c8d214941622475ac704597b4fe2bc34d424c54aa2897e43c161c9e4b0519e0baaa61ad14bb8645751ceb8d2c771588b4bab29cda0dd3d439d50f7d903af79f644d8db35cd376c4e7bfc79651501304eb3fb7890d9528f88a867a535b35fb33bf8416bf0fce1c307819c5c6893b0662e7046f8af0c3ed0f5ba1b7e4169466743ec7de0a453567d4154b8b7dd98ea15193f22838084cbd168d45a1ddd7fd61b87a59f3c722a2be45a84af9a67f433ce58e6b293305ed29a6595a68af717ca3ff6c56173fdf7243439c2979cc081ac5f83fe14c41226a81d71683d6b446be56e8cce0c90032b4aa98f3a72f9faeb4c0cab7d57aa2ac70b60c756099ab28273de4fd2d9b0abfc900f396fa6c5a963878f31d3c00a9ff266ce26d10e1196f3c5cfbecdf2de3409d4305a13b1de48f13f7eb162bc5dcdff13be351f7fd8b05b1cc9550f0686f3257757fb45d852920fdf7c3432846f1d7b97bd85c95accf2fe8c51db3902a8d33353006ea86ac4c540046e5963d47a318292e974716e0829c2813274c18e8daf7982a36a2f48a92cc34983ba711b61bc4ce0fcc645ae77cc85b17eb37f57287705645136830268b4800177e043cd9672e36e8a839311d9cc7d737ef1b9a856c6d188a8c9c0e839cc977200673cd6d683630f291ed8882c3797caded9a2b0c55dfd1542dc41fb0e5318921849a01fe68475c8857108fcd9038ec153ed0e131c74422ffe31ee131c90499b5ae8b3c2aa97b2d8928fc2958583c0b1d998e3e311a9ff3e493f888a799781df643973cc038c8ff51315957d91211e8093b22049dd94c3d38550a0da243dc674d915378f8aafa01bf084fe3e6e7ffd8a100798fd4289eee27959b137ac8b18bc6acc4b7c86bdfe4fdfea2729848d95fa384dbb343db89808656e9ff4c3db443d4261fcbf461365570025c096011d4dd4e35c36422c00373b21046e80d1c84657ba06f84f2d2bfe78ab4f2516c4b71f73303651cc244fa4d8f9f70f808d719aa5218a11d1a4cf213b5d8fc150168b6a09c456b39f15bef505739206dd9525901043a2c2ed10fe4317c626f8eecc4ceada15b70f678f990c7ea241b9be3667170111f7eb1a02326458f3d017ac82fe0e5cf693c422f6acc052a18eee3eded41ca2e193ac003904fef7446141810c77438d90278da7425a6a62c4fc1516a04962952472839671fabac114e80dcb9adeb4bce7c77d2fa0e7a4d7f1e8b844c9978a5213b6434206b4e0c7411263066b864397b79ee8cd96471800462da3cce27a9c97e25cdc235529d812bd7bca8b4c0ad7d6df2619c4cea7e18a78ba8468c61463b9419f49f80f18b6c38b189dfab7ea49775e430f112bc8712e393659f7d71c69eba1e01203821c5a9021b5888abaa627519758280263430f8466a093e2783c3d7c59ae8c5b4b1f933177246a19005e049897b620cfc3e205057dece084331bb5ba8b68effaf202482cdd1288f5c41984414b1b66ed725790241d13f35923b24caee9adc388f731d471010780319d81640ebaffc95e8e8532285f8447ab47ffb618d8f29cf28c870f0e265ba813db490e473f530f628f03a00bcb0dc13eaf577109c6a5fd039116d79aa54b30af8999afb5f21b5d4732dfa56f59cd7d26939c3a0d7726aed726624cacc651f1bddfa60c05c58e27a7b4d46ed58bc4d9e7028cb017af773645ef6eaac0fd657655c0b6a17f4394630832feb89594fdaad8660537a65fddd35285c87bfec0effeccbed9f71fe7bf87ac96def8d42312206e6a007fc8b5177260b660049f31b06a03550e6f9667034666903ef0678407e01fc5f54ad4e08c88346994fd131bec70b47725f4a000fec1cc6f1a44125cebed969210603f03cd82034424480f4b5ca91ed1dc4d6983e14d4bfa7208cd5d367a4bd37d090af982a4bcd1c09e1305703bb2841ea178c06843dcf8f0c21d6ef7121c859750b8127828e1bf921d8c2b306f1e4fe629972c4f47e23be68aa3fd934fd9ad3836766bc784c41c11f302fc49f64a6280b1dc875ceaed1b049797202840be2d32791e01724f6c653e28d04dddfe4f8d116c741252c32be3b17c81926721ed32a15670d1bfa877289ebd8fdc8103c7b988b5e1ace82d523ff783a50a38b12fee72d707b5c3d63e02ac45279a2ceac5035eab907acdcfd702343e995a3c92461db25fa2112006e7190bca416cac8556b1a4e741e31584407a2eb398261800e4c96ab30f5cdf4093cc0f334f6386b12c214b68fe155eef9d3b45e1854decc7411b9ac6020f68b08355d454c3183de1c02977906ac806ae9a143e7a63476bbe7c87c976dee67420323fb2932b9db731f61c8048957da3f712076f9f79886055a7e1975130f23b923275536427ae37b3dc6e0b1225ff374cab71b9cf4177350e997d16c0db5af55767040ee53a87c9495ae8ba8e3ac4fd65b5c979209e69539d49ab9c806261cbda9bbbdfd5a32b00c16d8137f46e9e97a6954fa2c1b77245aa57f605ade1562b950377789f0c0ee6d58023b18cc54bc177b47f792e7a9006e156f6708ad8edc2c4c15f3dccd0a95b00f7a618aa1e9143c4779543a63d833ca7cdf1b95230d9222d4fc1b8e17eb6fa1d1ba32d0ac03c9cc9900ac720974818a8500a3c01ca0a74d079c565c6a612acd510e2e09172c7bc8b1509c47f90a00c98d5bde120fd0b4d484998e76fc2aebc5498dded25b13064e510ea9264ce2bbd707c704397c14f38c3f5fb3a0e3c828f7d6fea96f9e1884236abc00b5d262ce4e10e703b6b479166ba818d1d83cf22b76bd37edc166bdd7b9411e57a1ac898b5d94c0b3d0e8f626dc85a2b061042ac3243202d7940036d8015ee78b866e927e65234b1ae39acec5ff27891ae5eba2587ab6895bfe31ab67a4c02344d29da71e4d462678c5ad8bcedc1a29934831e7b59e994a0f98ffda626ec93a0b8080d5a1cef1049ad1c8adf4a112a1ae99e384ce3f29e909021445e323a799b5e63cd302bb6d943308b47e01857f7c0881314a3c4687299212a65ea38d03a47115468fd8aa46f141b97de3eeace2d742e28601bd2ed6d3bb4ddca9043d0b9c0a6ca48cd35f30895487a3bbb40e96ebd0feb40e1e6acca5063666d13bd1abc7a3036e0b00f503a742a0fea2f2d0594d563cb7b8dc4be0180b7d777cbbbea19e970f0a1246babed474e2ef24c461e1bd3e17b774b15517bdacace97ce46cda5f8f48553470f44f55212d6576da2234e845ac24372e4d437087a2cd87b778af1021f2c194fd7296f2cb2b339920d4ca23d6c698292c4b4d02129c878e0f5043cd77769a16abce247ddd3230429b69654d714b4fb3fd139f353c952aab71075f2fe0d2350e03adcb2cf66f754952d3d3e34601c5b406625be1883a08d28f01ea1bb8a0d87af37dcceb75419d5e0fb70bf4d2abbb9bc4aeab779df1ee15668ca0f8809d9d08a43a11ece71ac24f9bb622cbeb5feee3218d4417f4c1907c893c4650aaa7d567ff3469f1e8a477f6132d1891e38ddb28e83dae9120a0cd3c8ef8867c76426d147719b81d6d289f9e5dfcef29e4a07f6749fe6317ae5a0e827be2fb66ca5dd7c89a64c11d8fe21dc0d2000abc33f9a1e1f628ca12d16ea162decfa4b02e4aac9377445fca8b36e3878c197ac0aaddf70c2078ec196cef86ba880ab077063735437075c939d07e5f0cb677879a7b1dc615fa631042b489a87b2d52103dca958316c880697a49ce763ae0380374b0159fff722794772c7c58107a96f34446ca2414dce9ed02eb759c3d017df3fbf8d296ba14b05d062b9f852a1ff2eec7d8cac5e0d1f4a8678b79d60841269c678deb418a5180e68cfd615c915045057ad514d06f650461868e52bbe3e2aa4c67434f08ade7726f9bdc30c6e073f67b7bf2c0b1422fbc2ad0a38ba89f940344f6bafca6e40395dd09307ccd800ec7543c42f67ac74da86a1ea5f13656f1de524f374d9dd27895bea67bd30f6dc705b9167d1d6286f216cf88e17cff93ff6a57e95337aa41face3a0059d80b9588831a439346626fea81a6f17258d1356811973c499cad4a10b2f362d59518974ce31436d0af86209b40d9f75aded6b19b50ca9531b039d20daddb070c73eaaaaf9c78361b6cac2926fa827fcd3c2e74b2bf2198715e1ea8f5306a0f4f6192a3627c283896e860283c900ba1e0f0c31529290ebb640d4bd3eb033d4a88119ef230a470f94e9067cbf024f4127f9086369be5ef9db74592a3447d067e59f35f0d49352e9c2674e138f9a4900993fe996779d71f5e2081e941214fdd4a6ca91b987e4769d612514d69a2ef92ad6c0df54729be2cda232d1cedebd3d820b2544b3de0635c64903f2b83d9bfab4b7fa785293d40037b6589f88242de87c3f305830994f09b7d192cd5249f963e4115cae0963b52b39823aa10e98ab5aac73a07d013433249de024bd4a4503d1f34aef6a0442d53ac5e6a26e1ca62c9a8dbd25ff8a45aa0d19fc02752f62116b5b72ccbbd9cbcd8069f5451a62b6699c242e57300176ba716262b985b5806ca4ab4ddea4d8d8f1a5f1e2941d119dd40e3c1aac98643767cd9f6b7af5c27167cbb6d94d39a48095a7f5c0f16223ca835d9e68567f0c4836c31585bf5601c98c7964822d99da8b6cef878b9684a33f1ec585cdf8818faab24e825f7177ae85451fbba0fcb2d8a45396b03422f7daa678928ec3329c50ef49621be1296bcb2c6d9c2794b0b9c71d3643b2b31b766666bdc1a5be9b1b68277d4e26fa7bae797aa2db4c31c8a864fbe91013af7e52eda741d661a12f8ab873583ceed75b6da3092e02f935eee04c40748938267be08845757ddfd8b7bc42941205e0a43119b63a83c5c421ab536427144ed31acddbb5af7e32b6ae98a160483f6e4ccbbfd046fb7cbc938ac7340e00870e58c8e4c982990abac5264f24ccd7a0a0587154a884c8aafe91d3935309afd84a72dd3b1a48fc77774ea4df4b8ec9086fbafd5617d255d6545fa737557c6ee6234ef5c365dba4bdc693144cf709660722ec218f79f6045436c01fc04c1dad910dbbd004302fdb673895a01c90297879ba8801dab6f4c5b9d5f62ecaa35319a94b5c2bb1d6475d21e765e2c42476b505f3b4a6c28ec6d38754c9734f6645f3b3f821c5f868719a74f2b083c9194272cecdef655af304198b2b62492cf80870c0a16a98d44daeeead24f52713d402aac27e75d7db683763450634a770e5a94eb32940ee8641430481d4a92a049e31dd037b12e5bf385062a2eee15f30593b208f82a56b32c89434612f87cf9b984a99d3686f986b32a3b9619df84a8c9ec596b11cf8b4013cd08575aa7d945737593bc3a0fafb96fe0364181319f6b8c6ea9d6771387c378830c22e4468b7bc0f3af34f4c00c6ba5e8de6ca1fa66c3dc3b1204c3f571681a94fbf24289e050dbe707692eb58a7a59466016241b1e8a1a8efd8a5e4676070fda23fe5800433510cc692e0416051f2373d9c5c69134be5893e30c855dc79ba775bf64196c4f373dd559c8aef5b3f03b076452ebeaf64956da5f57c72b2cc9c5d3af2a5e1d2ace0b6da4e4b73cbb71c4b0c5d37e77444a70d7a7edb0963bdc2c8f4fa62b71b23bdc612248303401376fc9e61ecc429c5ae495ea0a4822134fa2aad00681c992802e6e8a2c7b293075f137e63bbb798e672408125dd976995137592bb5718530e18fc96d464521a12c60c5d8c7cc082ddb48bb80f9b9786ffab9844444c2df07792a8e5a98dea659a85b6d59b45648033981d5ff2572435a4bfd4b48a23a2b2ada22c18ea50e50fc72909c834fc715182af3f81a9717a2cfd0d2c7b95d93b4b145059c39b063b3e4e2260cec4165bc121ec62d1b25e57201ce8e391815baecfc6bdb9a562db063b8c741016364303a591b44fd9da4565d4e4dd9761f00f8a403df39afe0f6a7feb9215a401c121b7150be92ee00e49b8caa9e31281bf064f93da327e56d88acdb8d93cb2fb5c07bba3e9d2cc5fa682cf672d05ef550c70a0ca403eb2bb00504ad99efdc0edb37a394573182277ec5d6b86d50dfd6e2aa44b2c6c3566ad67be443c6d1af4823bfc0194c54392e60fbda1ef5665f9da6aec8dd5b08e4ba77cf36e33ac73abc6d8b651669658d78be1d2f863816ea21d4e92682dba41f31ce8a1e5001af31543c4403e9b334c35dee967e7c23c83135e0acf5d54a22329c312d6985457d1cbaeda1511cf502a819035bfd92b87046072110d074e1a3b26efa0fc19674899a0cc74472f8293079e07df8fa2865abd2a39866864bbc23e9149af1dbecdf962a8b5b7c929dda512f74e739e83c8429b51851e30ccc214ffba70eefcd6fb5380bbfb353be924bfe8ec2a1492a614c24e30168943dc0a596d2ee3a44f57ac84e2bb947f3c1386b83802386c0764a13eac4c9d24c322ed1ef1d4ce7c99819a787de51673d95d6fd4d2c899e2af36c329a14cb23d66bf154c840b41b00f98f90b5370f949c383ff1687522c91f2b06287f469dcab0d4f69e1032b38b59ec34318c25d518085e9d94174830457ed83a9a3ae1309c1c77e246218e9a09e3e0f43c35613c5e9a6795c3bf370d00b669034af24003cf76c65babd8005155ac67ef16316fad623dd90d32c9915c2dac9d22f6704d729e8530ed154a5a9d2789d1d323a1ec626515818c385ce35e23cbe191c6797b0436d941bfc88d8d03fec2b80a9de7e86a433c3430094d21a356938e469aadd0bc797dca67f4a95c37040f4a7b30ad082d4997aea830c6693c78aedb75237eaa578a01795429e170d05d3b21378fa7b14908e66815273af833375f7b69132a1b01241e21d038e4cb5d6bf81de7da45f74489118e7d3efba137be5113f3d7d85f156f1bd56fb8e7cdd9bd396088c93cd84d04a31d5c78c52b317aeccfa93acf787e3e989736527f81cd20a34a86ae08f2aa97a65f0fc305e43ab8707ccd25db8123984920fb856c04250829c68a3879dc7441878c282b75a5772b8311cf26fb341ff1f199c990db0b43cc87ac77f7c6f898d76ec008e7120a7dbca5aa7b5ae5f8a00804994d45da3f04a6b8aa9e1451554f1f90ad32e3ec9f47e51db2cf006a3ab54782ebbf24bce3e39f660a79aded91213d7c991d71f8dc931b7e5933bef65ac3e0041c467528ec0e5b73bec0f9f1df1b36773e044c24f1e2ccad8f2c52449984ab70af0ae4eb9eb0254bb724fcc51711e1e0a3f129de77d01a03f91581e519b4fa510835a818ae22267a0a60b57c9f2b88c1325a5b7d92a9fd82e214928b393b052fcf0ce442220cf0bf82a473eff7f5a6686f3560e7d360bb157646083bc7abcc4966599425e8e0db43c553dffeb9a9d7dd16f6441e85f19d3d3dc934b3602e41f87fe01c5b4477af660aca3801b1928e6b0eb8985948811b44afe3c017927621f163462b62357aca4a1fe83d046fd182c12d99416d951803f516095e017e32653fd5529ae4c50f00c39c83b75acc1014aa510f32efd016493889c7cd75657fa2e8a179ba78c3ca2fc80786213865d551d702df5cb83b9d40ec6fcf389b26af21a9285ab378946e2ac5b27de93fa4e3d91142386624d0f2fb7d601c5145c12853f37279d8396c9fa613d5874cce783fc89d0e0d3f506f021a5085dcde7e5f18a99c48da24657cd4b44debf0512847ae7cce88a883c94decf7642a84df8b0ab5f8da6108e390fc28466a28eb2f89eb65901b8c58d8d445b1be18858d1439cc53f9d3b6e02129412b8682c9427e5133da2838b5c9dc307840a0550881500c652fabf7a24f199b7a169ea2d2b6e65e80ed102903c7f25edb94246033a4744cb058924dd1c12428ccb96e371e69b5f2d33252714583ba8a76a2f43936c3bdabde901c5d2fda9b5e59ef02117c9c846b620e1f631f360fb11842b3da9be45d5965c1d734a1fd67eebba9dc9a4a5cc7a4bd0ea17811025177f7066e969a50ce15bea92e626e07da5c12eef91957fc21b7253f9a13b2e463e555bbe78ac308c831ea7b40023e8aa6014a5864a7571c0fbf44e5d06e6a90570d0660c56df59fec9055c452786823041704abac2979f09919c50d1513bb3717094c710d702de1df64b33678b6df0845793b126c54776f066d13017becd4892e4fe830b36ff3c6a998849dba2740686b3772006201e0ddb002ec326944f088a38ebe08fc048f12ac00d319f3a4c7138d9405caaf9e36f1e80fa882509c6450860c4d420081c98fb00fb0214deaf2608ed0585d60921253282b8d68389136c2e4c53c31f460060521f06b5188c6de68d174ddb93092692afbc7bdebd6943d740f11540b33048220e07bd7c68314f46eba023da98937365859d1194b211f744bbd05d6228cd9316bf7fb204b90e4b826e69ad49018190a114c6484a7fa84c782419b9fa514429b47bf6112fb4e7e8b50e6a0b6184c3e8248055bdf933ed5802f8f2f10a094b3659607227e97eaed61a43188e43046cb5bc1e191229c82ad1db8eaf425dbca1e129f001fe3818ab8ef88f700aee64fbd49accaa188225cc76485f8a17f88f81c966a5fc5e44f8ab355acbd32ad0a54647443ac4dca9a6144fa2d16fd8faa9f519ab8b0a4f78c6a1c5ef824118de173bd806594b2188d610a029e63ea2ac0216692e6befe5cad1ed6799e6f319b038917ef0693929dbc3912411fac6b7a7f61a3269551244736c5fbe31520f8bcad70456ac89dffe6dc4664bfd92a167f6c5092023e30ea66d85cd1c605dc7956f3967912250ce8bec6fbcc5babc72dc29ba90283a7723fd76468622cd66b0bca5f2fb7193d14924883028e95b4f539c9acf7b11679cec22e4712c155b3eda1594eae064d08c3946075fbad39917b9ba32ca6f253fe2a51e7fd121d68bea23b83c5c89a29368a2282d8eb4203f3de504b0a7b1daa67adcc80c05641cbb360ff855891598d4043d79596bbff763fcf6f5e678744a06e3c1388041e5f33cda477fba281cfaabb860ad59f90e6f4edaced3b03d7dd1c75b551abfc317410d1dead86eee8a25d30a770e8d08830ad84041450ea3b6261cdd209f949d77749e5830eae6147c7f9884f4d6bd8380248ea662d0c13c85ee17c6cdf06ab66cb9ec624ba054bbce9830906ae34065e4cf53dee35bac835d1cb1867d48511607e9d9d150ed502499431552bccf6db3b9810403a6a80e5a1356c9ddb0b6ea758b04fad443fa087eda05da5d7441bfa7ad6944778a94bce7eb0ac7f4a83f53645457525b7ffb62fe3fa37c70fc19f21d3eb012d696385ba67131116e22ecccd668da47029c2253297c1efaeb5850911f899cc095b2daeab513244c289c375b8ed960f360ede00b811d64b66b94b6dfd0393950f1203a098f3e91e4f8d5752c4b9db5998e773a1b63f84aa1bc3a9c555c2f0736835a7dd4a13eeb0827fc4ce7396d8eadfc63a2a4b1a19dcb27f93d4c494511e9b37b8fadbd26dd06ce53a1fd62f566370b95249f8fc853fd9a3a803db6fb3c694cf0cbdf6484852fe79868a7152a2d104dc81b263bd37f0a515baf9ac34f6faa343c561759b71db5b950da7f45c1c18e61bc92cfd1084630d1d9ac28c5166bdfd33bd805e9d17c0e420881355f2ef17de81948297ccc4a5271ef94b4110c23dca4022c4b555d66a12f36b3a4ba7f33b0356102ef7b8565792549f2fc64df9025ba9c416c2b2309b41846eb65064397b7825948a0c2c56c392a1db86c1c907f07f378c8504cc1142ee28ea6ed49012327ee1461dc0d92a4178b0828f38372efff270f12604f895b05ae9e37befc44c1d47f1cd9a01328f091ccb858c09c0c771323b521175b33870eba16bd4b992ba7e3944f1fd5d8319a388c3dd6901b37cc198473dde5aacc18fa5c016df313d0d95c03e7c190c0dc4ff76f418586164cb110958c8d568b1a047cac68eba0ad7235ef26a7f72111c0216f83e2f59fe3a0cd10a75c265a981b0b3c405f012c314e65eabf9ac5b452e4a62b2b06715cb53e658c0e377ad3067b675979dcc0a9f9c0c3bbb4af3af6da29f0610c43c9aad54c32cec037dc9c5fd0ae5ae8c34a0d8f15052f223875f975d263c489ad1e81979300e3250267117f9be29dcb36819b20fad28802e0c81bd332f59c861ae33de5f47efb550bcfa950dc83860d0e4a2f9d70e90778b9fe26f673c0761451775b448d9fa174f87545b7a69d1c14a2ffcd8fd42b56096247d0987671a0d1f2c232034a4195939ef4a7c344a46866f22de82dd1744d6b6582af224da5c29290896c24eb33951db6966fa66b31d8cc5f9c30246d6fe8d99ca54197866ff5d3499ae87367eb0bf8094b3906cae7213cb1fd65022beb5d801e49cc0477a7efd709cb075474d74e50018a94412c80182b77a241e9c8a88e8b9ba7aa15955a0074811940f4d57a8e5d4a16e6648968703c0fd9dc02167cec625935d6a15f2292f61b76f2acf7357e580974d4728b50c99433ef108eec9bd6a09b47a8f364627b6c6fede1c3842ce800853dcaeee928ae8e2794264881a7011919085bdcc3f26d12341c62498c42b457add01defc3002a21650853cc8a4aa53106f954c8c9ebeff4135eacc6de0c09792ef70fd7aa0256383733736c5b8338baced430f1cac63926f11a7ef663162c723a2d0a02b7dfe06a4233676b917422c0a381ebd369eee7d505c454b6e832e5cc0c6ddd70c81a3ef3fb4ce375d0464be45b67123f2577fa44f10d945eda0f4877313f275f42d16ca586fdcebb7b669322e09b6e5a2105aee315ba9fa17bef67a541494de709f86a03437696c7e639e75bea93512c5074f44c9f72719eafb550d4444887e4cbda44ed0e92fb06735bee941eff7038a8bbce7041a129d6e4f97c62e4f970f1b1c7439889ff11756e99db0433a3dc1a6b6ced8c731fc95130f0853cf73f4fb9b710a539fc69aa6b9e3377c8b670a4d12baf276d7bbb52e8a3b539fa2de15019006f7632ea84c104f19aba7517d6835fa45f9b99bd24aeead818669981c2bab20c1b4ff6bd0ba3601d15e0ae1fae27b757d792b1ae4def8f4b430fa89bc38c898c187abbc0aad1650b66c88a28362a96bc0188bfa885ac302aa18282c3fe542540801b19f789acb46c409584385b90fd48ed18f22f4e41040b689331de883ffc218d79d463fb6de60579ff8d07206cdc3f91e0c5789bfcc8eb04806b76d23c5a7adbfb841ac51155ecb305bbbbd7c4df903916004c5fc8f4232e299eb04609a0210b7519a6bd5b1bcffff6eafb9f2a7cbada0260a6c01c1f0cfa5d8a6103c00b9287848018a8a226286e68b4a96cc04f07129336d29f4bfa5f42d55db5708f2ae2ce37a863a63b2f1389cc0c36a07490064c17881d56316f6ea7ad6e9f51215aad80d6c091948434aec7c4f0399c107615c288bf13c336c8be0cf76c6ade0090740c1c9c505806ded1b8103e896d6673cd1bb318b860a98e627c07087fa85d5b1c8afa92783996d69cdbbf53e57d18adb8540f58fdec33ea8946f17a97cf31a64deeae30f361bb96c1a91c5b51f1b38201826079180ebf9e3d2a05f3177f7d0288aad528ccc5667ea5a0eeb2cd020475cc663030e2fb7cd232cc3ffa2a54143ded946f7442f2a4e38baae643b93d642d5d9af65058a37ec328b877ae4301033caab166268f4a9c25a060d97cc46c167c94e8f23eee416ffc907755e6b5d03d2e6f3128345a47f02e828757f2e5d9d960b5b786146c91405b22d4151f74917ee46ba97fcb316c11ef9de9af215290db682a5acfe31aec7c91ec176f28a5dd1a15f57671045e590561f07852c8f341cf7ccc3f934e6fbca95b977bdd7619fc10564e10e996487fc77a182d9c06371aa3b61e7043ff4639ba5523dc32b5662d0f4860f7c0305c70ca1ee1aa083f20b4f6fdf44908e90ccfe1f5e69df1fcdf6d6a4e56eb55a2d2813c1ac9f9de9ba26633d7f8b1e03d5f8a225d5e944a82001dd1fa814754e4ac7bd355f573cd51f7aca73565de3a503d22f38363b1a20c9d0a0f2b28c8d7a8efe4e5c031a2f4f6e641bcd95eb91b92362bc32944bd01d604ad4c4980b2792002c2d373ace10cb34ce0c4dd5a4c496ee8a576aad0a3e33d3f4a6c80bcec22d759855845ff0967d34c2d46629c37aaa8e46a56b156070f2f95c3ce135dd5c28529592cb56719a571614bebbe5dc8a910515754d1841434598592576008aa453d9af2ca636dfdacf073d78f83f7e81a1e90d3faa73566dcdab8fdb2deac5443dc19d19c2d52f809ce1872c120acd5d21b6dc94709b2a1377a67ff366eb8dae7146397da9825e7f0480c8ee622141a23149932561b27e9e2f4cf45c6367d1f4c46f092408f5a345eb219e89e3bf8e952f4c94e7ed2c7a3c9d27c2ec1f7b8d34eac367e750050db417e8f69f44ca21fd092646febf158ffe4917a188aec3bfe979741a196bc09cfb86e365f54bced26524309563d916d2e062d0d06b518e8973abd644b37d41c1d7c236af6f7ded219f483dc192e7311a05fe779fa72f94cbf8588b3c9a01ea234cc6123814758248f10231804c40f3782f11ea0593e2e61a3f129ccd0cd8628ff8e01bc6cab7befc1f1bad056b5de4c9471c678d5652f54e0d8fa00ac4bf6421d154515d7de83fb62a800c96800dd50df4d6389800113f5006618c9f69a99b46acedaaa6860cdd9e45245fe730041de72acd8614fbbb21ef02dad2d8bb67d75bf2f548eb51b9122f892afd3fa0efa59004d1654b7735aadb4f80d0b9f07b721b00a276f0d7aef39339fe8bd179131aaeb727dfc11d58c9ff50b9c7dd804e5f91cc668e6004c1c2e52a1f237f9074d4924fba2630cab1bd4a28193b257db6b40652a8f4ef8a0cb422a6b3b193d5a820d319deb6dc7c464fc67f8c36a6d919d3944276ed0ee7db925feb73454cd4ff510399fba8c05c6a8d81f7a1581c01e57d9768a745e020c842076be6bae82901c887014a2678031f1679c6872113f9ec5c0ae1761913725c6847473da15ce4505cac3a75dbffdc2bbcc403c1a3ec7dea843bd602469b6796ac0e47a3a8beac4448caeeb72cbe3dafd45603ce40cf0b58d0ddc561c382f0ca6e4cba694f4cfc0e6e7cdef4f075df2f317d888150625a5fe7b0553b504f87cf73de9dd1b63b39d219d8c8c8f78aefcee33c325f238613ad8927277c73459db85fcf41bbe9241bc114235712fec3625c3cfc6807b82f1894a83ae3dba5a50aa725933f8c921b10a47567790da308a009af25500d00cdc7d454cb78353e4ef0dca06a6f9e7e98dff4d68a715e84ca5ffa9d8c88bd916a5774bdc1cd7de83c426d672f638388f2166ba93e5d4baf3368c2af34b2e487c46141b7c30300cd7bc647140db723b354293a5600ad2b91effe2f4dccb2e61e6a4c7fb51c7011520a0958608ed332099f6422052063e30bec64976a0f62da0af1608b36897c1b6ee5d8feffbb504ebde8830e51fdd145abae55d14f0e365659c573bdd5103072da5522b1b135b3ba9780314c75dcbf12824d57c2451e33964470f6823fe242f7deb865751f71bfbdaf4ed53bdc844c2f101bfa3d86c721a7669657143ef3592f4921799979eb09d0e1995c32b010447641af4ce29fc4f455ad1e76a29cd608f270e856a83c9a99db8ac6ff578eba0d938ac3e1a5681d8d7d49174dc67a04883369d54568bb21ce42c3d4bff14938cc770dc63ce36255a8ba5fd1b68222feed551741788a95185532cc861061dc42aba0bf6a1c6a78c9e50ba7636d0c2a7bc2e20b5864959fdbf6ff4e1c056343e51b77da731cbaba5762e3f6cafe54b7c5eec7fdd2defd95829851e15adfabb77d904a17c893af1793d6af7e58e204e85f48156bec29ec5ecd04de7a4bea7f7f11381a196567caec15640227676f753b91f03eb413d17c0204eeb72658599abb66181ceba2627053090c61021b274c00d50a06afb92e69302660ba6619df8c66a8151a690fdd0b3e14d4f43ad5740570d905d866452ae6c4d4d5e3621719cb9cf7c2d6a56a9b763ba598ee8cc18db0ebd03a4b1d9b9966fd4d80b91e0d437f2e812ae266f57a54634368fd58069ad5f4e3fb3379952797fc9b210e31698fc16601fdf6e0a32057c6f5dffa6e8507155815fa8ceeda2eabeea0cd20c17de436158a87bf681c457ce70e48575cef776703f57677b03c8cd669dae454f94ed1a99ae9649db2ca6f8a2bf94f245e9f2c022db61b0b42fe0a77e99f1925e5fbe83e651951f2475b3b9c2d2aef097c42f8ff8e691be4b753a1ffccea4790d9fd8d742f21706c7b7e0af1bb45bdd2ae704b37337946be2341f698d2c7a44d0dddc00381b44a7e76bad673a6fe6f7345f4246f94083ae0c14af3cc11bf4fa51917c461752c72d4dc163c795b4198ebc5c6ec06b0f76ebda0998ca57bb6951dd9e83eb3b470ee2cb8e5dd51ffe78d4cf1d4510ed5bf10b71a1f58a77747c908bab6d063917d08d29a58edc237579ef47eff4988ce696556bd7462908f8df67d6d05aada7a68685b90885028a987b58cf7fb29bd1753fef9ef8461232a332d72c3e9931af4f3414a76dfc1495bd61356603f8239509891f700a6c801727c34e5735ca3626ddbfce490f9633d220efe22600805b0a6313dfec0f3d2d94688dc89293a85c0f4abff80d212576cc53676db22d18686b5099c49331ebdc7dffcf7f098200337c1442c7f28fd15f43590f1cdc9be55456bdbc07d73c1e170c230b4a71c3463eeed0728a765c36e8d6913c15140b7ace5b21290dba2ddcbdc6b7abf43672618c3b9dc3a7657aff6793094873d491d17c6b695232528fcfe313feafca750af8acd65960fb8f3cadcdc18c3558f5079dd61b8a9430aba235489e72b15a98ef112e105811b5b188ac9d4921c03eeb27e2b48b2e2773c973a0ecc9b5d57d4cb9395fb381915265366956f6028e03e93da4d339fe1fede9555526b95431cc78900f4bf5fe5ed50fa9a0932b5af1414bb74d1232e1e5a8ffe36e163914de2f41c1e1dfae2777bdca9e184ed681ddf7632850e40c72442ecea639944c416202195f1a9137fa5cc4ad561e660c43061dd77b8edf0de1d3aae2a5eb81f77234c8da132f3e0bd0795e3c27df5d2207ea897b02f658aac1afee9908cfd1b357726ce1631163982b9ff9800a4c5ade4a238318dea3f3ae1ed70b8bb7534058dca8370e930661c6a0d19840635de58ea7363756fda7671d7f37de993487c2204f6591c59c40cd5f64203b622d9cf225d842fad11e69dcc8881ffd40e7f92b070712f532fcfa1092aeffcc8e12ccad9d1a95a811a139c37c7891254ccec75045aced86a5ceeb9b92358b77eecf687b32c242166a86ee4526c20f49158c3f0e1603e5607802c1afcca40cce35cba2039f6832edd0c9f5cc22d9e0e0ee1f52657dd909704e450b58ceb84b1fb024c9e4b2c4d497075c1271404250bfb46b117059ded8d63aa6a8a2c99eb537c42fe1375a5b5ff8ff1c0345d1aa94c18829552137fa4f8c41815450c48b8bb85ee22beac01cba0c1be74a1f23b33aae23555d98732d29a17dade49ddc0a216231ef39fb17a092563a69f03d33db11c640bd3d86a00f3309ee87bc718bd8298a6aa423f5b95522ee749daedcdc34d3d5ae56b6de231a568461494c055531234f13ebf442d7f8c79fd8ca897a9b063e2904d92658569ffdd906c659283b7ccaea57e22cb54107c212b7c705d648e5aafd8008db3e389cb0e601bc25bcbbd095aed22e6faea969c6e3128b9a6c7782e1896ed67bb0b43017f93d69a08066d4ff77f4d97c3866b7c416d846177b8248818b298cc48bf781d3f9c6457e1345bae62cd0c9ea850e4d796391a6f3d6ac584848dbf854cced409f4a6d4e1e1079b68d5cbb40bef16ab70e0d0c01d8ca80afaca388b9a2d75cb6880bf3322de1bb473dfa970bedbf2b68891f5cbf2aec685ff90d77b1323b77342fbc4d2e026a9f0cdeac29127065208a8bd15be35c048c305f2c4804a406939a966269bd8a6271a4eefa2ebeb19995003f22c131548f0426cc9fa669e470783996acd4cac5b1dc72e0742d8065432eeddc6d5df833e21b28922886e3f312977e0f757bded2a814000e1b703c34dfb31fc845beaa51f6dfc67313ec39064cf6087a93c0cd960fd4a8da1c0860fa4aca399e5cd6ad3901e8feb9c51b708bbc7cbb706f29f666a45c8dfdc382464cdf898c1ccf9027f0b497916f3302157e0eb7d90c95183531818ee0044ff93165f106ce6ed6bb6528cafcbc0fb8e08164e6f0f128e2267d3f3cd2edb336d3ce4929e5dc08c0426ce40f7d52986162117271266efdba4f0a81b480dfcaef92500569875f6709a015320d50902e7ad8b56e520cb4741803e760e268fdace9cfde91ac4f6f4f43201bd94ddc3398328c27a41f6f376bfcfd34d800caa5c1c7fae47cb4807fad7cb7e50a4e247cdf641973c006c4c2615170cbd388c0da659a3cf0e179503552279d8cc64d172eb7310ac05829f5aa63db9a3b723bd3f16cdd6ed701a6d3eea6ac72b8ee2a1cc4890b048e099abdda114b67f05ab8263fc6b04fd447ad74b832f01a9ec500f2dbe523f25e594156788bcce8dbca7cc03df3cdb84cebf113e3eabdce4db2a18c5992a1d9842a77ed6a6a8c822bcfe8e22cc858b10c7d26fa0db278ef0850841971a06176cad2be66d744ec5f7c8f644c049608b433155011efeddf5ec8b5b7078bb94fcb146b1ea0a9440f479a8b3bbc3e7ee0fd93da8c713f5ef38bbf2128f146a5bbc3f2e026146a0346f6bd63905e8c71461ce06bac4836cc1af63905127e8819320e470f46f87df300e2db89e6d5d46de4fc5ad6b1629b8b6fa50b678fc239e1a8c726c785daa6fd6653833bbf323840894d58032435fa717db00f388b7c9d741d3ce334137362ad74f51be7fc28afbd1dadde0b58f1e2ca8b123e98b17016d5b7f6d75c2aae10bcb3bee5f13fbfc40fb03b42e1c12e25a3e144b4342ae6b55d5ff658e410c591054edcbbdf579db07c5c1afd6bba916bcb673276b13f884364d46e7ec76d9b82d944d3901140574ad83886166e1df2e9c0fd7baa98668ee80b27f9fd1ec71dc7f31c1d61f3640dcf8ff320f222c5b77286ea1cdc41faacb1183aa998b0cbd9fdf4919b5bf0aa8ff9dd56af6eb0dbaad6f3774caf4c0f5daa567afdb578bb79ed03dc83d3e034cbf60d652dcd026893b95643eccfbdc08e6439360c22ec27f761f679c2b56005b3530a1484354c582b10edc01011a92068477d56a43002188a1b233dc28fc5ee6395d3d91bf8243adec7e86ba71eaf3dec8e334e8f2db91ba47ad3f86924bf9f2fb8af20ab2e1fbf192a26de8ceccbcb1fa429fa430292af373649ebea3ebbbe367ceaa446eeb445b71b774afd011cf2c23a1f688b99ed674737a1088fcc54f9b7e77172b0a760fff7b58978677a2c0370c42706600695d0c3be8db024edeef4b685f9c8c0f4d2740d1f685193b5a591d90b7fea59c0c9e415a34ce29cbc0dfcbe982ce16b19a0cfef48ca1e758f06be3990e02eb378727861702378fe34d499356d8ede7ab17a7086e79380e020b632efed0a0386f899664f7c52de88856cf34934c660a10d1ac316cc5275d208042ca9351b3d3c0e2c86e1075a40c005f4cf227283804cdb5f988a75f1b974a29f2d9abcdc242f57306b14a0abe079a50b3c082bc43f541e8205366f5515c5cef34bc712e0656da80ba85d2f5dac696c5d30d02a0801f9770d3f202822c5189292e12d70bfa532d208b3d3e4b9476f7c622b6135761ca9ad927f8e87297c0038c56346c10eaf739f42a4907830f843322dc2c001868857fac8138315f9408734a805b44a341e8d5bdbba70ef01045507ba48c76db6bd2fdb704004caa2c2463091cedfc166ff47fb307a3c679458ec8c4d138bb1a9f45b3bee2ac38905390ec405ffe6d50397d862b87f6fc40b581c1caa6c01703160847c00ce468b3f57bb4c57868a423b5758450f6610dc047833dd8bd3e15c606f9d9e9651af43b625417e6ac167350199f5fb700dff9d31d1834e5067ae2d2768ae3b887f971d82d0db0121d02fc224b0b7ce50153c505e9498582f95176dc9bb7ad8332ffc5e66e30fe9c0830a9a5b9fc718e76b79c83dedf8b6fae77e9a0d525ead4e1f6f9d766096f2b71fb5cda34b8071f16557a5080be461f0d28d5f4b0b967b20060e2f06cbd238148385da7207c24e1383970c3c8cb37a1818cdfe26d667f1ebab0f590e01363db9f30923edc7d8138236eb2126c4d42d27bade1462661a9c9a37d45c401b89d176989dd66e03884bf018db670832e8f570ee6def8c6b6223ea4add1fb1a4a3dfa10a3839c3bc17fffbff9d9d7e279f66b9d1146ef6efb82a9c98bda813cd317754a6bcfa218d40d1a3ef1f99d18d713df44e4a74932425326f5a0a9e5634f440bbfc3e6e0cca8271df6763cfa2596c7cdbc8f196fc96229f3885b809e0c13affdd97bfb0f64a830e494127601a3deb5ed551689cb6c44ebcca60f3f4603efb14638cfe90de33959d3cf88b4e521c29228a7e8aa1b1d03a1be16b29b5bbe58462c4f39a910e2f0fb255f903c06154a9191eebeea8f0b0545c7274eb72b54b387ed05a062999bfccada7c4d7cb8eefabfbc033342c877c5822ae5b679c514f63776a922a53a70e9be1b6883a0649590ce7eeeb93f8ff1d70487dad73485547b1db3259b5c933ac118db6a40f5927533b664c8c0851014011642c326c4d266d828c4e051a58839674d54e4046f5cc24bc6f1a09bac79bd888f063a348720d5fe53a044801dec82a766103837659b8b7c5f8d6451f8d5fc0e9d9d45ceb5fb6cbef1c3cf269cd33a4971df965c63934bb3adda1558fc11a09bb7f872dd8766e4d7a1797159cef4ad513968b4398e67b789969f7baa3b1e376e89c2f355f2b3096b656278c0fe8bf7294d9bda11e5cd9252ad50826114f68f2541a600c015c0fb043b0c496f3b76c30961057ce201f66401618d6d1f089c7b10d63ebfa84f760899b0f1aec98c15e335fd8bc18dd78ac6043a3ef2fb61bc371a681a13478d7ae5f1f6fab07ddda471808d63b838851ce95195d2de8fdb3bba1aff8fca65716a7f576637a9e22646c4e998db60ee26b88000d7c85cb7588a465d2dbbfa535d88aeac4337068ff874bcd0cac6a49022371d2b096746eb09ae56d3932d93906f359ce5d6b404e49525cfcaeab1e9c42c72f41c335d21c199612f3669b141bbbd1130cf492a8964bebc82cccd3a8283612424c784acaccde2cbf3d97e753a314c8a15d102dfa874d4a1f46898cc5c0c0d955287691e28ba8b3abff4f059329cb8b47b8e21ba8ab7c9b80b5ba6cfa89c98e7d6eee094688b6d95f2934adc1b604533047b04eb2662ccb57ad1dd54f0038ebfb9fcf27e7f230cdb54715b0ab88fce63ca9a137afc2d928c67aee4800b2a68c6b3a4a5ccba40c5f823c4d99b590611a491d29731d003f49a056a30e3a259c0c28f07d93f742ef5e8f0e0aae1caee6830980103b5bb3f8d0e17ab61a116fcd13d063bdb8aa2e4e39800784269270b49cec86b1a29d13473f7d8509bffc619a853b7fb2cc091334819363984314d52d90a02c47c8556ef2ba6c7be23cb0ceff66960a467b2ac7e4119e84e342e867041fa549f0d0de76755adb1b7c12ddbf409373142d7b2c78134ac38bc1f752e4d0510ab99d820eb6796149fbae1970ad670a9513543e6c74f0ba78e5aa669205e6c5543a2dc2e63657852d4a346a94af1529f1f0b15058538a1847b2045dd948097a6de4de9c84487a1aa9e8bb14b17502dc05cf64718d7392c3b7bae54866d8cdecf42bf65c2270022078c509968bd2b38f11f8ef9618b029c7e032e4d05d10e3710c0d3a4033330033330033300d87f84b5341b51a36fe4cb2493347801e107c6f8433c46dcf82910934c524a99d2037e0ceef09bbd591bbb10220e2c0e8c8b6d4b4c9ba59da64c99c807100c67c40bcf6a36a60c97bda68ce9e44719272b1bce1897cbca86e3dc38e171c282931f679c5c2e2bad72b95c2efc83912e3c2c3139429cd6620c9b72215529ab44992b9952cccbde4f1ff6b24c8f7566732935e37239f971c6e5920b84912d3c0895e6f64aecb175ab10ea4a1f403029235a78f235e75a4fee1f315a994d8687912c3c689572edd95a73e41acb6cb27c1074b9f8c371b9fc38e3e4fd1a628c91e9b419974b73984ca7333c4e789c9871c2e3848d931f679c3c623c0ae7c7e572c1ac74d20710ccc81c46b0f0acfe7cbfd6a3b7f89b76e639e90acfbf6ef33ae5a9f121c5a0e8a7b4fe1147af911a4773105be171e9495b4af4ee925a98d9d47c0ac61f0e4e85c1b0f4010443c648151e6e9f2aa96e8ae89d210c46a8f0f437ed5e56a929e798a7f03c43942f69726aabb14ae159548ea16a8e9c12521985e7bb35868cd952eeeb1a0a8f5bf46466e49079d3a0609ea5b38c91277062b54a35e932a4a98cc8b1f7a4162e468df98e38e1e9d61c3f7566bf5a6aab090fa34eecb1df7eaeaa3f2d1f40303318610222efd42ffdb972857209ab3d5bce7d1fbb450a4794f0a88418be4bf9f4d5423b9284a775235bb9da2936c730ad11243ce9fab1a6b94ad33a7baa1e39c2eeaa7ce4e9b2317f99d94c6b478cf0a07bea09992d3e949a622842de0ccec7b1394369305284679f2a6662ec75d1d2362e970de771a0d9682e179516cdf20104d34688f024762d5b76b2e37aef2a8d0ce17177a9de7bd69ee2e78f4784f03452574b5d5aef2b8ed720ceb3c161612373392c1dc42341781443b67ad7bfa79eb20a46f3299b435636ae9c6a39f971d254cb09eb8f00e1497dbfebf6a932fa7fc563e4070f63b65dcdbb3d574aaa2a18f1c1d3ee10663fb65ac2b46a9f1e3cc8b1860e2d3f6fc892183c789075352fb7de5b3a0b07c365ece061ada9a34e8a4a196ad47c0a4685bcd3a0a83174f0ec4a4cc88cead153eac88c1c3c28f719724ab1bf23679dc1c1931e7aabb9f5365173ef65365772583a439e4497dbd63a5e86ff3eb3980e8a260b79d8dba6f45a316fd489329bab3941546aee0ae278587375534ee9d143ee583a703c0955da546817a194bad1d3f2a8ef7b6faeb1f19f623e65a58505a30fcb93bddaef8ed0b142ae339bae57d0a5f3b0c5d25396ef8b5dad6636950cceb36ba9562badfbf37b9fd9ec6c5c4ac561e9a075836799156ad4781d7b8dfdcab31c636fe98929a72e72c1e641689bae5dcdf15b9992e659ddcef79b72f3c576559ed58c6917e22e6ab6ce05298f274f8af19d9d797bca6ca63427c8f78a26e75998bde12b25f5f0255b8ad373669369b66058541e2bc30689d3c34d46e4de4b6536372c1a144c5a2d98ef707a25a54a8b06f9407997742db7ed8c12a2cf6c2ace6b343ddac83ca8fd34136a8eb944ff3e65a5e50706795e7b4839e58bdd63a858bc85c3c24626635179c804efe1e5fad862097d42ec2db3e91e937229fe87db27c6d2bfe4a8dd300cd76ab0e5030826887b18d3d4cd9f68513227caf59c8dab3f6cf9bae654ba3672a23058f900827941e396b89e2ec6d446ad35f90082e97e5ae5667baddf18e37f5c821a3cb8ec392a468cf031c7cc668725e6c1a79ee9b7dba7dc87740a4a4583873f71c3cd65e992a5cd6c2a11cce0795f686977faf48eb2c9209fcbc666f99e6ae17b0c1e64c8b2656bb386beb1151514d4803c4d3fd371b6f5de22863078fc21b49e5a6cfddebd4a3d5ef0a42ebbd57dd652f3d2219db2d241d93c4d0f47d1b41a97cbfa0082792e78d0bdfc47d4d6aa4faf05d1a0bcc1e8c6b3ef37b9a5b4349d3542b9b48d476deba2a6faf49c3d45ebc7a38f2d2b74ac21b5fcf772494979c7e5030806066c3c4835ff4a477e94544a994d8782f995212c7bf2a38c93219a302e97219afeb1900f2098678dc719526dcc91a7abd738b3a958541e075af0f45af95cb5a51e36c48a50066a3ccadf776b5c2ed9e762425c8f209a5ee372f9209d950d26d707108c4b4313e2ae5dc6ba6b9326b2b48d311fbf4f6b95cb6cfe38e384f32c3d785c2eee5156367eb97438cfb2d2ae2f17ceb3a090b1c6896272585646c2e0e3616c61dbc716c2de953eb3f9aed9605252daf95d9386868cc53a2b1b30d078fabd5ef8b99042fb29dfafb12b484b7ba758541e5a39e349e9b8546a96cf28bdca6cb2a03ccc86058358f028f50ca147e4b6d927cf6c6a60050f6b4bb94f65c6a6bcb4c7b3cb39b48f0b3d7dce5866d38cc7bd2e6b4a21f7d41e976696b15eaefe6649b17274c9d9023254b1bb5a9a9e63df96339b6ec3c693d0a1f78979b5bea73bb759638cc418224d4c5d26b4eb700d1e4f7367ae75274da592b9cc66ca8a0a0ac63da7331db662b4c7e592bdf7547f84f1b04cbcd2fa871a636594e96c2e15f463863859c355ac21b751d9705652d948c1a3de356286eb2de6ae2cb3b9b2e1b844143c4b256affdb1af347c4cc6e58509ee0614fbd21e592b7c5ad2db3f99a4d8a631c85a5593a9a698267a1ef7b6cafa162e95b669389510264a66e5963a61025c499bd5c2e17a4382c2b2b60ec4a09a144949a9c9918f3a202474acae5f1c67d859eb9d5cb0de100a5d3c2d9bc202dedc74859514151a5d2a2412c2a2f0e7efcedb3c4f49cf6b745ef6d983da93aa1b67c8b6163ab329b18946ba53f1c3df661c7102b8792ca86d17c8b45e5a1b554361b4c100e060300f5ac5abd4b9b7a3bc6a6329b2c1ca682f4bc76ec986a6e6fad7d2eb38959869ec79c2d54e91a15d1666693e5eac3f2a16f8e14ed7a6228b319c7861324359f67efb7b937ff5fe85d6693c3d269031f96bd9e4aacdd51531695c76d90e069687fb595d35fec7e65369da6310f07e753170697c729d5cb0c5fa1e24f2fb399e9b4ac60389b8759619cf038f971f2e38c137f37e2e8353857f900823963040fdbdc448fd5d5bed42bb3c9e98c63f05950382eb85c5854dee5f29c8dbb80a5450583ca07108c0b44f0b0d58c9daf73a1a6b799652d2764ac7172f2e38c138c0605b3b2e1b8550ecb0a7acec6930f20981384e05945951eb3faaaa7b5329b9cd780e0610f5bae7dc8d07e439ed9ecb8ff0e86e583a83cf95146a74f505b4ed858e37279958dd334e772c9743ad3273fce38c124f601043362840f603a2d1c0c46021e0041073ac081ce062470f286774b49d980400312c880053010811d14b8008a8acac60316c8400526408109584002148840062050810708f90c051c5081065880010bd8a1800e24401170000368a000425ae5020448cc26051344831224c826250203d821800c0400615250de4000743af085b26c363a3c60228212960fd2811cd90101898e2486d39fe2180c8645c87f40c40086208021ca30f22aad29218021364180018808220b5e084304094730c21084100420fcc0073de0c10e7490031c0c1112071c2d2c1dce0d56361a95141ba06482bc773ed246ba060858840c4410b00847908862002282b0821ec210111111e180183c3042017a30002123ab1861c5082646f430b207012842a4041325474880006a2022a219a200355c2005454840009c201200008c918000206084e416691700c80422015f081149c38801bac0052d68410922224528c211843084217050c052001111143452f09cd76850769440776c6087e65370c70930b043f3292a0126098e3046c21849802c4e408b36ac21035c10e30a4e105143c48d1488888848400445240139d2f029ada1685c3f27ad961c25220a07060ccc4a2701247d4800c91b1240e2850fec0043043bc078cff1c08f38363c563aacc5df8d0eca4a181d94950ea24959514119d9c2081d123002019132509000912488a0c0049d771b0da6f383e5d9e805f30210bc00810816a83032124483620421dce03970e8420722605879160dcaaf6c7e687a84a1f99534363e46fec2e91d9ccd134100021080000840d362ecb8b07c67080b07c539cec69fd312062e44c1055cecb88507be608b3288886c2007aa10111139514fa8850a30223ff081880e72400b278888344b078c2f146216b6f082884847169218e9c2892c3c20222224169a1011e9a06c6281b158828810a7e90ee792714e7f070071bcc6a48d1d68642002119c000527d8f101210ec5032cefcf00630d4e1a2cefcfd8b163c70e8d0c72b0438843c17c10f79858040210267108c2094c1002344a20e10a04ec688526be153b4452fad9788e1acdf9e63c4a29a5944a29a594524a0921841042082155555555d5cccccccc4c545454545454545454546666666666c618638c31c67677777777d75a6badb5d6524a29a594522aa594524a2925841042082184545555555533333333111111111193999999999931c618638cb1ddddddddddb5d65a6badb594524a29a5944a29a594524a0921841042082155555555d5ccccccccc464b64b25a489864a0f188c020c111191e63c093a4ed342c6c6c7a38ce1525a362e886393f262f060f94e270ccde360c321c3bda60dce675878b816638dcec6078f47b341694d1b6b707e489fb1f1d11de7cf93f2194dcb0e4d6bdaf840e77f48afb0a0a4a0b4d6f4784e0b4bcb6369e1b4b0b41d19160e4adb71d9a1e91d292d9dfed629615cdc97a083a0743e6185912c88888c604104019f58b98288484ab7dce077b06c34235410111999821466f000e9c106668c678c3478f878306ba4b1c61a0fe639a38d31d24003f38230d000030ccdbfb1f9f1292d6e83066b4181cab3f43081bf1b9d209b14d7e3352841340f0f4f3440e4031e10111111e921292366e8c48e0ee732a4613a9d5e29c208115834ad415141e17807c5ed5069d1fc8e8e4aa7e3d8b1312388068585b36961ec68e98c90dfc1e184193acdd26388888c60444446683083201a14f76ba4344b932122322283ee387f4e875329753f83a4d626d6d8b0ac0ce1b8a230dad8701ec81031341b940e0a1c286330cd36dc0b4121834583b259c1b81782f2c00003b3d2111161114180263cd0e15c58501ad3c47438bf92f219a6d9928939a4c1434464c48d36444452389cc73729296164220726522e910a11368268503a1d14348470092158c20f227f0906f40a0986b0fc58a3b3c60e9520dfd9916109030c30444446d858434444039c120a58a204222656305142259c508903884cc20a223350b4a304ac25069318594acd0000461246908411444484a08888881a0a0718609820486748a7bcd3c4b171299b8d6384b40a66458593c1a8b46884b48a905651d402091f3c42178f50c22338228a5a1c610b11d7030c30c0e00846b2814628424444a4117468c4144444769cc0043b76805183201a140d4aab3ca7063b583abd0287d3b43f0f75431346bad139454a4a18de4141e39f0c46f4d0c11621444444e4392d2cfd6f470d3a9a160c1c6fd420a5b5e69da651382c9ccd0886fc1b229b9774c11104d9a49c212232c20211919115882060116af400a2084fa08be60547a08963c369994e6714a107110428c20d9ba7e9d16348caca4a183fe490080a8874504a50030c6783a9c10ecebb149416313a9c9167648c201a140e0b1b6080a1a805059d4ea76038bf22a45530425a0505425ae53bdd50a0a8c5044252fac721ae90d2864882c8e57261d97c4a27e5e1f0ceb0a08091f2707c0a182222ff1c3234ffc6866544059d21adc6ffc37486f44aa7d3295e881e888810820e84900321bc2022328282cdd3f4406348abd179186c7c88888814e08708020661890ee7e24a30888cc8b3745e83e13c0b0a4665c37924f087030183f0b1712d6cec108109389b94e60106180200030c4ce71d46f3cea16430282b8d59e974fea0061111110d4aefe06c1e4be7597684e10643886862137e5005b35d236a248d2411911ba838f79d160c0a329d3643c55fa0d2a2c1f4c10d17d7072122222d3b3461f4815df8608b95153e6436ad47c0871afc0f3eb0354410b0074b8874583a2b08d883177eec214f2e677f7a6c190a4fdab4df9aa3d7e50ed1139e7c0dd7ef520fbdf5d8098fa3ba2ad78c79a995d984a72d5a68ed7bfe0e99cb28e460c2b3aed495432be17b5bc65c428e253ceda95532d46c51a37e253ceaa5ba6f7ab76dc992908d18978b7b219bb640c8918427df52f48e70a54f9c1c177220e1d995546ae9352a574d7784e75b29d7d22744a8d2b1111eb61c71aff4774ed5a1ce906741111ee41e72c4d42f7a2b29663619262107111ec5f4c969d55269ed7b13720ce141ab8b94635acf35955408cf23649a4ab5d628d373417892ddb6c79f966363efe500c293dd289132afee578973fce069cfc9ca3f7fa1ce97c3074fa3d50c59d5af22f2f6e2e94db5ad71aed6947a79f1f8e2e49f095b256aa7500924bb78d45b8ceea542d4dcdb4974f120a58a739f3e55ace5ff38430d24b9787adfb9e4fca97ff46eb8781452eca9e4fccaeeed2d9e5ceae9e255ce1761f6e572b9205b3c692d73cc88d29152dc24b5789a3a9476b542ca1e2646428b67f1397708b5d48ba93ec92c1eb5be19ea3666aa3f2591c5832d39f4725733f4b23563f1603e56a4d0a22f01092c9c52add5636c88574a5f2e49ad90bca2a1e6b4258698ddda26638d13a61c961537485cf1b85aee1652abea75c2d78a47ad94eecd7721d4bb4ac28a47dba5efecc4be3db44bb28a87536b49757aee63ac8d44150fb7c5d5b02542bb9639492a1eb5eefb7c7d29879e0e150f62b44921d48f35b1f929d8da5d6c31e74ae55d55b6d8bded865ea1e55633c5a3cab142a65cf236af2dc5c31835d69a6bf3adf516299ecd47eaccdcdd3a761dc583e850beb6f634adb72406269fb371a46e2011c5d3d672efed54a743da2c0524a178965aceab1f9523961603c5d34d13ea5ae833a145c9a279e7bc1a8bd983e4130f629ba87c9393edaa1583c4134feac5a9f8e52343bd4a13938c11249d785c136d2e47f8323189fc40c289e71563d9d673d9b576dec4b30e254267c5eb1fdb6ae251e6befe98f22bd750cac483dacab7da6e7a27a628b3e9306c04124c3cc89573b7db2762364e4120b9c483cd6ad1aaf4de420da166890719d752dcb421e61e739578ba37a12f7e438eea4d896719b5660a31bf6ba4d4249e56e6f69e947a365e96c48350b77bc558a54d6df7fa537807249178d43fa7d284ab319f3d249eb694c3cd7d4eab4b37b32904e5b160329d9695f488e77fb16dcfc5e6d27be50f12473cbd74f93746c7b7af546693f30d6f163638632c199034e2c17fec922ea787381bc324c57c4818a190a53e65a7f4bda4329b9a4e5939f9518619880592453cc83d6feadaaa3a7162d4931f65bcfe3314622151c4b30e357a7d8c25e4ed56221e4eb9f62d7aedad970b21a2ad6ef7bebbea2c7308c9211e6f6c512bfe5ceb116783a9342031c4c34e21439e983dd616b9d4c68645d3430d92423cf9d8b5f728ad8496b2a79010e24989ed7255ead0a5b31dc4f39ea9520d7fe54bd52611c4f3bb181177255c2e9fe31a273c4eb005273c4e508d131e2798c6098f13f471c2e304d138e17182679ca871c609e7351a941588f5b8dd8fd15bfc8d4b1d9000e251895933b68b1ab72ac5d2d9aca027b740f287a4ca0b2d444c0c2d62ab88dd7356ce2d77987196e6ac60364e25aa1f9e4688ae13ada76cc6e872b95c2e174d4cdd03491f9e44e70dfd5b4ff5e97201091f9ed59823c3d5e9ed2b4e7b781ac394a8315add341bbd400fcffbb5edc833537579cbc393ef293bc42bf5f95b0e0f8f5a8d5e3976dc891fdb68307778f4b1d50d6dc2e55e6a3b3ced543ba79afdf2c4a80ecf635a8a174a8f98a27c74785e3ae5563bbfb5739fc393cb7d5a28a1dcd794e5f02895ad7e5fae86afd0c7e179d9d4b2f3b2d6181d0e8ff272f6124beace53726f781caf2b85aa9b63e9dc0dcf2b64dfa7f8fa39c7de86079bbf6676a8fe7b1d1b9ed5cda12a73c92f795bc3839657c3a59edaaec79a1a1ecf6456f5b86173ec751a9efe9428b95d47eff9d0f0bca668154ac8356ccbb1333c292145cf1d53caa9b496199ee77625fa4b0fa9b6afcaf0209790bfc767ebb967647894e25cd5fc5c39663b866713b673fd96fb9948c5f0b4aac61e66d34f9f491286c7f13db7a99cba39cd0486e75b6abd6be13aa75aa1cce63f870593f92b437ea49c04c9171ea6505527c7b874edbb179ef68ca942ba7c3913bb0b4fe3e72d551b2e171eb69eff9b5b5aeb315b6fa4b4b41e9c34d6082d48b6f0ec2feb5afdd7d829bd161eb64f25b61c6b8e1bf366e1696b3544df9827ddc5c4c2d3b0d92b72e2ab767d85079d6a3ba494d537164d7bbbc174a5551086c40a8f4a9b88d2aa74f50fa241e9705afc392bd1c0542d9054e169effd329311371511a30309159ed69fccad2d43cdb1f5c98f334e2e97a4702099c2c3e8161f7b0d2d237c5fb40389141e86ed5e1babe4dab45d2e99985c3d9044e1c1ee7cf7eb35b41225048527132eb36f94b4693b0cca5506c9131e6dcc9e7a4cbcda95731f978bc2a16c2071c283d6ffbf4a457eb60fb1e6f9410492263cb878ad969c632de9bb2261c29376a9274a2add2ef572754896f0ec62eedae3c697ba0c930b244a78b46d62ccd6534839d4740d244978f635b3f70cf11d62dc487818293f3b7d4ed5d5d8111e6cd64eb1e51af5ee2e89111ee7489763bff996e36724457852e6b7f69435c3d5f6498890a992173757952a9569b3d7bb77a8dbfd59f70a4886f02ca7985cabfa6677d89945f96ee3233112213cb92b1bbde74d9b3c73c3a212f3dd4613064910f2a22101c2e3edb9a55dad59375c9ad9950db59c5c2e4db520ca3190fce0695f6a1b628e3039738ec4070f4ac5b8ac30654bcbbb170f5b4c6532c45e5e2062962b331517114bab6a3194b4b567bbb49adc0523bb78d4a633e4d67abf7dca0fe29ed77f068f13961615953738ad62863295491289115d3c88cbf639fd617bd5fe51383f92074672f13c26556c351f7d176a665365c379e9e44719978bca8643c6e5c2128da06204176e9d99f55be9cda16fba45a2546c53e2629b1231654b99b1bab7dab75b6c643a6d06d39556b1c5c3dea26a5cef36ff519ac106192c38e17162468ac3482d9eb4bd1eb96e8ea835a5c5e3ca8fd366c3d6fa91ce22514664f1f86a8ac8984e394c8e2e6963f1a847750b21d3e41672299b8719c26161273fca38b99071c2e3a447a3a1471881c5e318abe74d13dbd36a651f40303c1879c5c3e935abc67eadd2e51c1b97cbe5c23431b98911573cda122df4ba9f199565a2218cb4e25908e1fad37f9709b1653631984d10c68a8791e77ad489536613c31a8491553c88fa35d5efed33d5faa89911553ce89c63082de74dd52e4fc5e3502af6a69eb98652364c54543ccfee1053e65ea55ddb5c8fcbe57221638d13561c9695533caea9f6d843c7ba5dda34c5e31035d6d6bfcde52a534a1c969591523ceabdd5dea14c4548e993e27967eb3c1d5d1362bb513ccc35bbbd95696d5b2f8ac7ade6dabeaad6b0b90bc5d3f4e1b74de99bbae40e8a87df526cb60c37d151fbc4c3c8d7fbb4c95aaaf63cf138e629bf5f366e26efc493b8b497cb576df6654e3c4d25e72f2157b7eea5ddc4d34b1f3abae7ed31759a789653cd4cc89ac961ae4c3c885d32b44f5b39b78789a7574aeef2359715fb124fa2a51c25b7845842a62cf1ec6e2ad5d65c27d7952af1b054456e2d84ab772944896725b71ca5a4a9e953aa9378f2b9e55ccbf5846d3725f1ece3538f5039d7d78499cd0c0b4a1c6993531aa50f2018334622f1284fabc855fffa5fcd653621f1a44aaaa5464df9db5bcc1ef12ce37a459ac992bd37473c8af5db638b15f6ee4a34461af138a64b3152ef5eeb2de6128c30e2f1865697e1be5fcca9339b18f79a383618d79b94cb85e5835c2e273fca40e1fc38e1916e5c2e974b736bb330b28887bfb7bd952a73317ffb9c96ce26c5314c319ff1f69516cc1b9b4dcaeac98f324e5a70c2e3e48c931f679cb0221eb5a89ac9df3c114f6672efe9bea9a41c3bb379e2b6e5440525d3b9c071d2b6e504139011443cef3573f8db1a6acf93db93860ccd91433ce9696d7289f4b5b33f433cac89d635a58d355e76994ddeb0687afc50d970c8f05f61e3724185781eab7329f1bd67fe543fd4fa608410cfd2940bdd35c7b59dd8f59bf16ee3e372b92ce60308068e91413ccb7b13a366e45eeae3002533730581bb10c395d65aa690a5d4f4565bbd3811b2e49c3fe3cde351383f52da37675c2e3c4e7e9431e45990e9b4193c4e96d24d1c3ffe8d4e11e372b95cc418630867a3f268288572786124104faa54cf579d3bfda605c4c314abb5cef5739a89f47241228cfce1f14c66eed632d6c9b17ab7f1c198cdad0f2018138cf8e141676cba4c6142d79ea574f8e44719273f386168ba6648278131d287a7fba57d664d71be732df518e1c3e37a354aa9506b874bf91e9e96bc5fdbc7d037c6b7f4f0ac4345b7eb52ea56a9f2f0744af4b7b6db57f7437878b27119bfa78c8eb96499cd75f2a38c93cb45e1b85cc6b85c2e974c4c2a1cca6b18b9c3c3eacfed98116636374fc36aac7122c6098f93304ed438e3e45786fcb85c3a292b2a280a83e90308a665c40ecf6b6911624a576bd8aaeaf0a86abff6356defa17b2cb389f40623747876d332629cfc39956b680723737856fade866811fb7be5e4f068ebcba6fa973db6ebe2f0a852df96b97fae4bb187c3f3e9bd54941cd25f999282f206a3373c8c351b62c47da53e537130e286a7a5b2fede44e5e5a43a6d78dc636c1d426cf369e6b2e141c9126b8b2197cf30a5353cefed95d3a6986642ab653673c8881a9edc9578394df6758fbdcc26cac1481a9ea51a622c9133b79bcf329b88848ca0e151c6745f629f5c32b79dd94cdd8c9ce15988362147f64cd3f2cf6c9ae1499e4c93bb37ca570c339b4a3b2365785a229730dfb353d5bdd990e1e967d89bf99ca16d2cc7f0bc52fafe3574d8cbad97d9ecb07450843cab8c88e141c42ba9b6e8edafa60c1286a71723be4bac58bd31ee2c1b8c80e141f6dabf0ca9e6add77f6793d97c63e40b4faeff15c95ebb7262c2f3aa4dbd5a6f5f73f5b884e755e2545e2f5b775b4b090fcab5fe9aef91e96396842739ba2af5df1476dae74c90f0a4d49e539b1e63fafbcfd9609219264778f0fdea27d6d062acad34111926467890b6d6e9d935457c9999cd1bfc0d9e944661e1b41a97cb8a8aaf0f2098202645c88b09119e75f6ae6d7ec2a47db9f0c16408cf4bcb5afdb2e7fc1131b40613213c4b2df5d0b77ae8eff1c27c8249109ec6e8fc10363f32a6898c4e3001c2839edf72dfded55afd3f7858b6778d2166ac2162131f3cac57aff6d6d94a8f484b7af1a074c48fb12fa6f63d0ae747f2e271468ba9951edda55bb88b57a921f6b67a76ba7098ac6a1f37b65e6a2e178f7f15a13e84f9d0d241092e106288ab0931534d2a2d23a78e6d53f75bb49f34cf60c925b778185a877097d33584f3238d355c0a4a86c705d5164f4bee0d35c46835337f2d1e8789df6a45e49a5ac9d1e251c7a798b7d37bad8c67f1b8c5c66fee1927fe95c5b3b8102ffba62d69d3158be77d1dbd52c89e7a94142c1ec6ec74d4b0d3a1d7e9158f734a1bf15bfe8d1642ae78fa315d2ab5549cf41d0c4a5af1bc46999ecfda6d21f658f1b43bd7a98e2eb32df6ab785823a767be967142a78a47257588214bce8d9872a978debbffe470d39b7762543c9cae19bfeffed6aab1533c08a9ba62aedfa4ef96299eecb64d954b855ca52ec5e310a1544d6ba952be14291e6eb99cd03b72331ec5a31eaf65ac341d777112c5d3c85a6ad265875a72a178b46d2a4bda4e9f3944a078146bdb101f6a67d8ff89e7b56edda6946b7dc5b4c4138ff3b7eeb16c8d515397259d78341f2fa79e61b66ac2124e3ca81e6384d253fcef392cd9c42ac5d04a46b6186752b88bc92ca1c66df9b3e36be241d9127a448cbc156e6b4249261ed7c6a754ab7cdcfc987856a9e25eceb565dafe5728b9c4f31a7d6943bbda4a8b9b724289259e7d97f9c8eaee9c9362bc85924a3c4c13f2e6f5dd4aa13a4a3c4f57b15dad989f4aef99cd210da3ea5ed3c6e5d28592493c8cb1e3422c7d438c5e67f6e447194c120f2784967aaed497a33b26454924d43666ea91ff623b75459440e2f1850b93ad73c5d5b8994dcebfc1d9c48151a96e5c2e4c14258f78f4df264d4bd71d59ebcc262a72e3724159e994cd660509c008258e78dc5acfbd3dfd3a46bb961b62a4f8bbcb85f31884da8992463c8f6d3f94fad5ddfa4e99cd8e6f09239ec5de29d3a6166ae9bc33bb282859c493743de5c8586a8b1e22e6cbb85c92229e447776ea3d256aaab352c873b9301f40303d2849c4935c3d3db4987be5ab791c1b1e974b1c1b0e2719221e74fa9443acd4a6b4abd61925877818156bfbd61e2b31c4836bb9d5d52ae6effccce61bff1d8ce6332c98e5829242346c8e5363fec67f277395a59410e269af4eb16f665a08a9f4635a4a06f128757c0d15529ed9c4689efc288365b3e1a8f47358d848eb0308e6062582781262e8def67d592e76209e4fab2d7cc765cf544a4a6396054505250593615979b77c00c1082901c4e3fc8c1633efe6ea5b3290923f3c4d71a7c48d3e7d2df6123f3cfe1833d71e63cef93d8529e9c383ff4de95bac8fd9d496f08153b207d69a26b4a879522c7158566c50a287d5d6a7d747fc9431a6b2e1bccb252545f7142579d86c5cb6c858eae41489a1040fcc9f594b8add56e23b2cf51832ef578a5b95a5c40e9fb635317f4ac8ad354aea90383d66ce146a552c28a1c3832a173dbf76ab9aa92a99c3932d3954b4c9bbb739c66e94c8e141478fbde9f3878ca9861e51128767394eba8993fa9692631e4ae0f03c668a8fa99faadaf51b9e7e4ca5f4bd7c6ca792523b94b8e161eb56b7cf968c98266343491b9e87ea9095430ebd6afe682861c3f39e9f9f9afde31a9e54cf0fad7d0dd5a5b56a785ed1379488d4aa7db74ad2f0389792b3d6f0197b8f391a1e64a7b9f6b127d470396312b5507286c79b26640cbfa9734eb1191e87ec3162f2639e6ca592323cee9c7b64d64d297dbb329b1a94e6b8d42f21c393aa98ac5de123c2b634576ecaa0640c4f722f5d732b6f2ebdd7ac50228687a9c4c8ca5e7baa555a0b112561787c5d5aff0edf4bcad52f9d4309189e5e4c9d3b5f11f9b92f3c6cf1b14b9572c150e28567b95b4ba54bd4d71a72994dcd86e5c98f32583aff230b255d78144247c8d353ceddb1fe209b2c5f06171ed4b8b1666dbd4ab72d4bb6f06a53bbb374e5cdb5d964521c8aea204ab4e0da2be962adecf66536151f4ab2d070a9f24a2d97db638db2fa50828587595ad794ef73aa09d51a4aaef03ce6c2a4525ae96c13adf0282fd789174a74adb1cdd3f4b85c5849151eb5da2355aebaf918d21c4eab122a3c4f7143a589ddac1ebbcc6687078f93210f85f36e5c2e994e0680122553789c557a6c1d7a26677b5270991cad6ccc994d94068f0c0b8a0b3a2929619cf03871a38d131e272c429e45b3e171c2e384c789cab374863c09536549141ef756d3578ffb2b9b6a09149ef71c39ddc78aa57668b1b1d2e27e8c0e66a5c5bd3343c9139ed62a1fdb17e2349438e141ece4146a4ac612bf2d69c2e354cb7c0f5721476c9c1bd7d24926a4b5c8c99c70ed5a4c15caf495e9705ddfb5ead6c4a88544c9121e5c2d9532af37fefe625211a244098f23d63c25566d4eaa3b0925497892e73a95c9eace71538c49243cfecd9b27665e5f4e8b611209254778566b4cee39e6905d5beeb95c123b4289111ed5c494ef29dd46941e8f93339414e171dcb2db438a94ba85e90ddf5c2e8c49299410e17985dc4b8e51e2ee47cd082543787655f2b6f2f77fb59d101ec4ffea717dbaa516a1203c0f15ad7ff91a080fb695ec98525eeb536942e372b95c2a51f283a77179674b994a177b55e28327952d5fbb7e35665799d97ceec5e392b7764e295c5e3cfb104af4482d85ee9edac5c3ae2d6fdced1fba65a48be79b52c43a1b439cee31b3f92b073972f12c575d7d9d54b56b6bb8781673a5d0ca76df2fa1e6b8c5f32a75b6b410538d5e55cb8a2d9e762c257c95bedd6ab1aca83c9a344e789c380d0a0b8670bea505273c4e789cb4a4f4524ad5e249b51eb3ae3eb66eecb47816525f99c8522532d566f120566ff5b9ce5e6a2ab12c9ea556e26bddd01329660a63f1b4668f547a7c0a8b679f975a6d13bdcbf4c7e9150f5a468c9ab67789adb72b1ed7ee983397ed1d9b62a6a945c8d18ac7d5ab6db7d62263be1e2b1e9690a63bf52f3d5fd9ab783ca9969eb229459aaeaa78fe3561424c575f2aad74f2a38c1f2b9a1e3a841ca9789cb2b75caba5ada96d8f8ae7f9576a7c29a964d74ef120a55c7a8a76f5435e394cf1b8728da9f4387da1428a08394af13c5e0fb1a5d81b3f538d140f73841ae92a85fea97c3d728ce25155b4ca14630ff152288aa753aad3f7bca9d26bd7505252fa695050043942f1383e2e67ea534af5a4cb7c00c108c9010ae5e9914b7caa35666736c550e38c4ca7cd58994e67d227dea653ed7425a2c628f1604f3cdf3cb15ba4ccd36eba4e3caafd7aeed5b9edd4be45059392d2ce585ad0d09071b91c2107271ed76b1323d6d632de8559d9c6b7218d062a0b8a0645d382f936a45534555e25c7261e45d4d412dbb994ce5fe772c9a189271fa2e4cdbb2df552c3cc668e4c3ca899dd29e25ecdd0551e7260e2594ebda52e77a4fd1461920d392ef1ecb73773469e5426b30e8ba695be1c9678581729d3d58b15b5cbccae5439831c9578564be456dc646fad7e9478d26b776f546d9543e856f59063128fbef65fcdd2a2e7b2a9249e4f8a757d9b76aea5b87c00c1b81c917810bf64a869fabe85df9078da62f7e91e7bc8f563dc827dc4f3f88e77f73dbaee96329b9fe250309acdba1e9a342e97ce1b9b4d4612391cf1f8728958bb612b2fe222448e463cda787321b7b09d628b329b8b114f53ef5ffdf9c8febd2f829343118fabd64fac5d35969aabda438e443c2c357676d518db42ea4f789c9cf038e171d2c6e582413910f134e70bff73f56d7b840ef1ec522dad4ce6c5d8d2108f52559f58aa7ffa125f211e95ae142bf59fda2d72423c6c97b3fff2a410626f108f424688ed13f3a4dd82789aea4f2ab1b72b99ab1688673d3ea2ecc616a6f500f1306a8814e9ea777dff87e7a5aa6cee2d77ef76fbe1614e8913d2f5e45039d687e72d6d28a5e4d85d3a5a3e3caf49e57b8f1d43476dede161fee49ece99d3478df4f02c5fe68550f26e6c9687a7b9e5a856a575cfc6c3838dd56a8db9464925d43b3ced533d879a95d3ffe652b265874793f732f26b2e7b0de1b0646e321f40302ac8518727536b4dd57b88addcb554389c30c248496915362e1784c890830ecf429830b55a895921c71c1ece6cfcd62187edad9d1cd44a88897142c98ba95a2bb9efe4bcd13ab71a6d66338ee660fe1f46e5658d21471c1ed48dcf37195b63b4b939e0f0bcc79bd6bed7a6ebaed81472bce149cc4fa9f45632a40aa11b9e86902265affd72c9d92b1672b4e1d1e5d0b564a8d9ccb1312626df351b4de221071b1eec6fcfd4f425e7fdbe5c568e353cb8cfddd06b8918a3eb8568c8a186a7393a6f6f485def739d230dcffb84ad5efa6bbe146b27071a9ed59ab58598ee6ace13a5b351e30c8f7aa7edf83fd725c6ac0439ccf03cbf47de9c5ac9afd17bf408f23e2e171594cb450839caf07cfa44d6e41c73cdab92470e323ccbbb14625acc9829f7313cab39c608713f5c564cd2687a281a39c4f02c8752d246a8b1a9e73647189e969e4b2cdb3ef27cd939c0f0247e8bd872652b11bdbff0a8758bf52df770a5a6ee85a761dac5deea3b5d5a5d78dac264e9f51b71e15908fda64a6a294d74ddc2d38c98266d64cfbc296ae1594ff6da8fd739d77c3528cd19830739b2c050f15a687119a5b295dc48f1734ca5e756aeca6cb674308e526936293c2e9755861c5878da31c492ae944ab9aeba5ce268cee5b23e806054725ce1e9fcf7868afcb721944addc86185e7136bcfc85663f4e5407254e1799ede23d73cbb5b2fca418507f142fd5a620c6d36de1c5378102572f7df9e65b25b52783c95fdb9a65e7a4ee6280465785243c81c3b57beac2125c393d89051f2e77ffa0c5b90852fc6f0a0e6eec9b9c752537c2786e7b799276708a1357c1186a753115aac98efbb4cda064ba79071b9689e85a5535e3ee10b303cad39e5d790b3d4be9a7fe14156f8b4b3dd4b5cddbcf03086505fa27c6a13caeec2835e5773c5fdccadb6980b8faf6cdd54bec5dabf690b8f42a8baee305933f5b4f074429eafb123a6afb5ccc2d3ff1ef66a9b5abb35c4c2e3ccdd522831771f7c7185679d6ab67e316ce952435f58c1005f54e151a4ccebe87cf13de608bea0c2b392e2766347fd9242c65f4ce15108b1bd45a8bd2a13ca6cae1c7c2185871f3ac592f27fbe49ada0c491867c118587a937e4eaed5baff85fa2297c0185e71fd2d6ca8a2de5123f83c2174f78fa61a696af395f5fb6cb095f38e179f58b21629fab098f4b9fd0339bebb48f094ff2e566cfe9adced62cb3a979164d6b13be58c2e3abee0f3da133b66e6158bef31c253ced6c9f27f454257c9184e753f6363fef6be3f67790f038f5eeb17ceb38a537858a842f8ef0607bbb6d117623e6533ec217467894a2427f564ad353becc66111ee4ca186a9f78a17b4c44785c4afbecb9a786dc99329b1b0d46957d00c1f01743785e539e18e26bbbf62dcfac0ebe10c28314f3b5b345c9deb2203ccab56e7e2d25526bd18df005109ed41cebc365df45e42eb3f98307d9264afcfaaf5bf3cc6c12e10b1f3c9f723da536951eae5c995e3c8e214a4aa1c65c12820e5e3cbaad5a214fa8b5e6c5ce2e1e84b0a95bdcdd564d7550529e0525130786e583e8e2d166e48ba5e51a29d438178f6bc4ddd2d5223a23848b6795a56c4fd17357a7b77854beea5b09b55376cc0a041db678d8437f6ef12957a9d0073a6af1a05eb5892d55afbd74478b0731458d553ac456a3e668164f265da859773af24d8564f1b45ad9b8bd86cb0b2187980f20988e8e583cbdb0712655efb5ed4a1db07812e2d464dcbb38356b3074bce251efdd4eed316c98cf3a5cf1bc648b29e58da5978d5b472bd2da646c1959e24594cc6fbd63e5fe38d32e5d1dac78d81d7a2cbfb985c9ed5ac5b3103ad4dd94c2f5d8298791461274a8e2597c2955af840b2d23eba123154f226dea3196f4b9d572e940c5c32ba5e790b1f6972cfd291e5fb6fc21720d39f6e44cf1344599d2b1569b88de96e279744c2de4c99b737d22c5839c35d45ccd21d5e8d0289e94dadbfb76265b679a021da2783c91a7d5eb6fa1f69443f13496f8fb8d5095f257a078385b637cd5bf1ea14e9f78942d6adcd4bd12f14337907ae2e9d54f15bed5cf7d0fe191983c071d9d781a5bf7da7a2da184525b994de6c493f89df46da62adc65818e4d3cebee997b886b512ea2a5894737b9d48a1252fa127b4847261e757da825746cad3ac4cc663e281f1d98789ed12b87aaddf1afe72b2ff1aca6e9d07aa839c46c9f251e4decddcd2f1d91fe57e249282d3aff562af9394789a717157bb76e2186d8fb241ec79a3363a4ff56266a92785e42c54ffb9453e246e2d9a6a9a17fab7625550d89079b376172b79252ef8f7878196b6c8c3965d6881df17cf7faa51ea3a6f4166bc4f389aaadeef7112ec78867bda164aea9f7de2ddb453c8c8b68b9979c9afa2a453cabb5a39752a3266a4a897898f3e70831a5dece878807b577bed7fe7c5f4ae8104ffaa4d4666e37978d0df1ac95dc5653e8696a4c5988675726b3d6b639eeb608f1b8ea4e6f3175ce5e251cd22999d2a8053a06f12887b4ad878b29a51aaacc6627bda14310cfdac69e7e7552d718caccb6a1494393970d7404e241f5c54cf55b56e752bb5c2e97ce02c4f3b0dddf2aa6e3f23e273fce38b95c94a0e30fcf3ec6d93c315ba81d62f6c3e30e912b57fdfade43ac0f8f5bdef7470c3d1f4be6c3c316f266ca212a4fee760f8ffaf34497cfadd9fb7de8d0c3932c576be48668b1569487c717f16a4e7555315a544cd08187e713f53e72af5132a69ab5e8b8031274d8e1c9c5f44f885e62757898314fe4904ae6f57c5ed0418787e173497d27d6dc3aec393c681f4248994afa2e752e3ae890c3f3ce5e57eafdb4105fd3118767a5a5ad8a9cfa26a478080b8a2a2074c0e171fbfab73d5d98ee7f0d6141417d432fc5a61242cc669826e870c383aa256c2e1972870cf5e5b2f0a0a30d0ff3cd85d45becdb5a45362e99ee77d5a0830d4f4b8cef7ebd6a9e1cea131e274f8359c383bcbeb556a935564c991a1ed67c1f6bceb5bbdb4dc3d398732e1b21634d292a1b820e343c28e15bea5fb5e5a9dccef06c66ebd5de2c11b16b0ce7df250a830e333c9afe21fb5c2e973a236648c33c66a523068b90e7726111f2a8a30c641803067488210c18d0018610e8f8821776e8e8c20474700143011d5b405909a3023ab490001d59c0c21508a0c30a4fa26cddfca1e55a7a6c69151ef596538a8cf891d1bfcc830e2a3c8a962257df1431e416ca818e293c2e3de5b2ed7377e99ca5f0a0f712b3e55c626c6bf5101d517892a1bbd7be15d9f7a20e283caf55f9baeed7dfe99b1bb8a2e3094f6b62cc33a54e989e920e273ce89836fc566c9f092d1d4d78da53cd3513377be52c810e26347f466c15dae754f2d472831fc3df8d5446d1b184f7dd88dd4bf7ccc4dc7bafb031e459b09936a143098eb8a57cded47cb1f6baa023098fb357bf1e52fb4c5d39b3f9ab70281a3a90f0f4c2f5b0e1fe33d77c6536153a838e233c8b9662fb86edb963180c06a132e830c2b36f1bbb1353b9ff9cc2fc177414e1412f31f48ba8faed2b96d9542de820c2839ab372082572fea5586a16740ce1c9a48f3fdff6fbbafecc26ef157408e1790eb14b9ff47dbbc739081d41785635cf4d462d35ffb5207400e1496fa4f6f562f733543f78544acd2dad96ca7169fe41870f9e7edccc392f5589dfbd5e3c281573b7da0a5b6f42cd84174f6ea3e60ba54f8b39fa65b28b27e53f6b97da534c1d4c74f130b456632a75ce172dcac5c3dc73caebc87931192b4c70f16c7bc9ce9d72d5b5874c6ef13cb769db21b257ecd6dbe2d1e67adba95c5c2a39a7462d1ea6d8ce5e592b36769ed944cc8416cfc34fc98a6962e9ad4c060a93593ccd917fb3faa756f57abb0813593cc8dc2d5c299f339b2926b1604d6d9c49a1bb5b4f3798c0e241eb92ae63e674eccb6536311b161e62f28a47f9fb2a674bcfd9f1bae269fedce1f2326bf950b5e2698d891a7a2a7afd5463acc8b6fae94af9c921d5ff8666e9154c56f128d4de5aab14a74c883a26aa785223d67e4d55192387a9789c97a3b64aa997e97f3926a80082c92974fdae64ffb0d56f629a98e2e1a78ffdda87544b9cb0140f63aaad74ee6a937bfb9a90e259ce9025f5989ad37914cf6be5ac8bf132513cbfd859ea5dcfbbb4a1503cef1f396eec29a51423c49880e259fc9dec13a5854c91dd30f9c493aa2f9342e873a9c49405134f3ca9faa5baaa44560c3963b060d28967e1e7ab6a8aa9bcda329b6971e2d1e72bf97a9eda62fe94d64a9204934d3cfcb9ceb6bddc87af89e7b1f5081f91b3e7632a0b934c3ca97bbfbd562d215c4c2a104c30f138e67261ea7f9dd9e4217eb90c7125f181c9251e5f4eee2f615a8929a5a1788b7bce8f1e97cba73494209a9677b9f02e4c2cf1a073e8daa154269578907e6762fbbfc969a509259e4eabbd6df2e62a31fe241e54e467c8bdd4502346289848a2317e4d533ae49c364b91787ee937629a52e95ba909269050489d21bf4466ad8f78d4dbd78e9fbf4d081fc20ce1b00869344e780c79169cf038e17ca6d366245b6915e408df450df9c25f2ba9cb6c0ef937302bad928ab9d22a88b36193463c4a99e2445dcbb6b7558a8309239e4eaff317f3a3db6c0ed369cc4e186d3059c4d35cb191b14e6db33d438389225aad6367cbd67be24dc4a31a72af54bac4fc96caef194c10f17c5b4d9a1636e75cab3fc4e39825e723768ee8e15a709818e279c95db5d67c1153c9b1106a19e54abb92624ca5558bbd435cc7b7569d333721c4938a612a449d5a1527f52894268378f89dafda97aa88e4602288a71b25e6c83d554feeb9e968363c2e5d3009c4b3fc1c7bb945ac11314e13403cbb36dfd3b6c61a61dacca652e372f182c91f1ec5f5da8df1bdd3f69fd99634f1c3e3e9d5e6425eadecf9fdca3e3cbf2921739498d25f65267c78b0bba94c0c714aadbd7b781a722ff7bead386d2f3d3cec1b7b52e97db11b537978d81fee426f7943ec351e1ed7a9bcbc354d9934e91d1ec53e19ee6b8a58256366f383705e059304267678b49327a6fe3b17fbe73a3c8c1d7a0f2965b856d3e149bd6ab5cf848829b59fc383dca9e48cfab9f5f5f5289c1f89c5440e0f36a65a6ae4949fce1c8787d1bdb70b79ae754fcb7c00c1684ce0f0f43694ae1432a78b95d21598bce1712e9dd3bb2b76285373c3e3da73eb942533b6b85866b30d4fafea44f7be4b5d6ac986a7d36bae2d4df4dd4bad353c0a61fa638f506397d8a9e151bed6d94a9534ad86506673c886c3d279b767bcdbf8404dc393de89fb93fa324de642501ea3e1c9c4cbd743f54dc9ea6778b4d16228314cecd4b996d9543c4cccd0ba7de7a3a7f264c665787a591f13aed4c9b1b7c8f038ae7fe364cde9bbd3cce606b36a988c013df3665ffe2fa16d6e13313c6e2dd674993677ddaa994dce86c57fa5a34149c3240c8cb1f5d5ba4bb5861283413db5c79e93e25e29b3f9265f785a9552cf0eadce987881b5a9a7ceda2ee58bb80bca75538a5031420a576633b9f0b46cdf9dd0a9b614b5dbc2939872dfa92ce15bafaa85873d54ca892d462d2df7b2f0b8ff4546d5f09733f799cd0e9b8109169ef67656d54de6e6efaff0b45b8d68217e2f25659ad9442b3cb90dbdbd337f55785227ca84ea29d59cfe547876a1b70a9f7bfb66e753789ca642e7d452ebb95fa90c13293cb9382957cd1fa56c755178145afdecd37533f6ab41e169878a0b79b7f6c68f507d983c21b1ab44b4d4b26636550f13273cad99e25fbce9255d889af0603a94545b9414a8848fea34692047411003200802c198d72a0083130020281c1c91468301a964dcd6d61480044c5c5e7e3e2e2014c6c2914020128682511044711003300cc530100381144e5a8799001e4c5388a0e5b9ced0bbff383cb1dbf010399be84f6acea1a1faf999482be95389b5fbcf92ef957b455d23dcab02b19b913c1ab1259e7b66e7a58817ba9e5cf9fc0f3aa99776bc03549253229b0e6c0d03e3e5712480c51b9337b2dad549952477847979ba23adedaa24f4c608941a51dbd25b7ec7c32346a6c8d86b35b3a6f1e150ebecbfb6d306a6476fb8174bb16dca199d09901c14c83348444ec76f15f39775203d67e0f7a8b7387fe4b898c1a12be65196b6160ae876180070b2cafc61bab0d8726d81b124578b043181f3d4f269d8dbea166292087325b9eddfd73ad660621acadbee0586358f22861339ef6745220f3f0471cb84d8fc8708382365d72910c46377bb88d64c20481d4a284ea0641db80c7288443b295dd9d630b549ea2af8900fc731edd46ffc5b850c5fc09ba0a8dda4686c4a6ad424fe021a3c0d479694148845ce8f33965ddd04d430b9f125c8512e143707da13e308854f4397751289cc7109334755026e103b18359e8348e0a2728cd2e50ff417d9e62d424b183fa70240461979f53dcc2770162ff2c77136f13bfbcc0d6669266a92dfa5cd811b3f16970d7f7cdb12529f6915a8fcb47585f39860330d1bb48869c9acccc0939125a8384b858760e9342211d4f3f4938e9b2fd0f28c223ce4735cb2102c63ce2d0f3fd7ded05e95ded6f75a85bd562dc24905abc9d4c6b6bd17247a29aa065f82754b4a187ddd4fd87d4f8f09351d3d0e8c5040481615db1e01972e7a8c930b9792c83dcf7290428fd9c7937d82d10db14ef627c5b7dbe937020ea88011f1da751768e7ffb3caa38df1fe568494329ebb640a414e544470e1c07b3c43424991926eef8e626431c97379554c3f27e8290b9ea8c82d9654696c54e218c75da13564e7bd96dcc2698f2381a39848af468dd3a1ef98e380ef48af23303d3f918046ba8bfd2e09acd9d3d5ebfeb70b10672ff220bbfab9105cece1bf8b0533be8ecaa5b961aa4c4c6c5862ff179e152ceda0d37cec36568f7b47feb57ef322e85f38463b96fc676539271f3d71d93031ae271a3b7c8e3f6ab9525c7d22be8e1a4497553b948f89cdbe0bba09f6e5d8362b5b2aab9fa7c9479ba98aa16983814c5e6e9a501fcf8db91b739947e900e91a076c253575f8f895a7434374c13471f5756ff204b9af91ce4b2f03ed2bd58f28e20442f6fdff076834b858a3daba9c20d0fde00f2e6902b80a76ff078b0461567723c009695aa0b2ca98a61de7baa8bd5740eaef8a47b14e31b195ad8cba1f340f42c7c1282ac6ff65e97418db2e33b2959c3cfb9a524fcfa22a0209fe9885555bf3a72bffbdb69c7b51ada5783de748ad273ac4e686439ba477ed457088c2babc286cf55070541de3cf3c0588b398f51bb8d768037e924fdead4910e3bd4f05edc66ec96091e881f1a8125a970c0d6b93119f182e232e048f1f52caab0ce46d6072c18f1f3a0e687e663e1c9cec90b44e571ad0dd4c0a49f2e359a642cf6142bf0ce8262821ddc48aa5219b0e4c3e918773f0023a1ac0340eddb13546da63fbeb00ee5437c1c6bf530e656c38f0f1a7fcfd03fc49dfaedda821694ea2326a311f2aa254c354f2e608b3a12b69dc50f5966d8d5845439a340a4f903f6f28190b8615a830eebc8f9c8d7d781188303b5cffa9c0f3199a22e84ced7759a86c09d41d408fd41986536dd85b1b1df8d572262414a7e9153b5d09f2153b5d6bdf0af490a5c3a2b0d8e972961f76843b95cad3b3cad9b0faef2b31a9ee158c883318bf08d081963ccf31b46b664019c6bdb9a8943723a04f6646a691096a92ed3ec2f32d6568faa6a1db7b6ab1d3956b2d769ab53c6f343a9d497c621cb60234f1c43295db05655c581871afbfe1134a3c89fd3e17da878a223d1d524338150201eb6b1d9f09f408187692783a4397573e9971e18b8e7d2311a88822e2c1b791c90432e3bcbd5e3686c24b61f7f410afaaffb78858c472962cc16dc6e193d3314f77f0b08ce4fb89218d6908ac20d6a1cd9452c72118b827b3ef5d868db92e2fdc0ddff748fdaa117d120df98b2e96ad7941918b986c40f754325c21c6ee04794c09e3894b5d0ed5258c8858be358a5f12dffa13f5f2fa8354a857ca37561f678a67283d96ee4aebb86c2f3dbc44fc2a47f33b51842986389f62929f7d94e51dad695bd6ea4cf865f3559ea234bb04716e0a5e554d9864c889045a229bd6d7385f9006d6976dd1066cd048fb090174eefd7256d1aa43d0e4f0e8f82507b5170bcfb29c20074567af752d280605a35e021c6bcc81b3bd8733d258342b7389c78c88f2c72cf5551525e109e41219363a24d1c4cc05838dd0dfc9916048d455043354faf20804479000fe882176fcc246ec6c6c730992d0d32d6939e573e6af19d9f0a80a7fbeaf8d7ea1cdaac411c7c53c8f4fa5b20dd79560fb016208e39a7db3de4887e96ebd3d2c1b9027acfa1d6239bb9ec67366ff6ba8b32f6bea6c50d5383d2f6dcee3046f02090b914c5df2131fbc7ed26f480ef490344771f15e4f7d22e39a95d26e5963b8237eb0c200bf63341954c4b910588fd169345d59d328f86fd54b4bba3f256bf4a7d6ed8301372631a4976e77ac852020e461726f382a09a305e4885c631fa85393fb00d93d8636589db81ba9494d310593703045f94e9ff54e2e17dd1b095d44153532bb955df2b9736292f16d4b98cdded7f685016411465782c6590010e44cc3b4bec7a16a62d9934fe58cdb69cc5952272faa3dc6710c199131894fb326c193a3298c57f83b81da48b03c4ecaa5c8c89b61440c04b0c2394d27f4e9a50f04d0ac4ad9dcfb9e0413457f0e84c03d184dd36a88af68b097c68774806101abc70c0e9bff0652004293aa1e146468fe226f9e28ac6896bdda1290ed95881a478d3de884fdc7c4a804bba22d165f2e060b656afc93fdf7387a0f50f0994d30e890c945ff6d0e8b5543483b007a90a4073e022417057fcc2da6c209abd77ad9dae7b5e9f4bc50c60e6dfeeed7438a95c01e86141714a09822fce995e0279183c1539a648609f6d9b790623bd13e47e2debc57e5cf88ada20a62df07bbe1af4346a435c0b0fb52d3d3ff1dd57b8034f8b670600ef51adcd090ac69a006b354dab2376a553d68833c0e4a64b0252d548d037f014ebe08067a2195bd4d6734c198a49e72b1da676c98a2fca0b8c38f930fce697431552b9e6dfd99fda5164dc2b84200a3ed1f12321ef7595bb00bf0d5bba69d2e9351b697478d1dbd72f8ed82335324fa992b99e4a86f4788dec26742cd6de08be387c7a141bca176706cdbfa5d4f88cd8b49d4f9a0b7c9c85b936777577963b6eebdeb2228b714a49aff10b9f86d17200b4e76023eda0f1da024ceac650a065bfb3c0edbac6fbcb85cda2279fc09c2080381e007efbdb75b5609eaea160831d092586d0b126ee1681565f86968de574115312744f5cb4390c9b15f0c2d5ea7d72025e14019347f9dfb98d116a956510b069e576e68cbcd2e38737d01d3e83d12ca2b95190d40b433d5c6b45692c30fda4e98357b6bb334b1b7e1ec9e26ae067e2f08a70047c9eaae510671e7051da98cbc188e1e1787fd4e8c028e1dfb2d78876284a25a6566ee06831d3d6db8f446b0f3a5495f403394728a66e3c267b773214f8e17b96ce0d5675800f56e24e89e3542cae4c0f926a7b3b30d7704735929a9864d6a399cddf7408680681a1cc78744e146ba74ce002dd9fe643307c3fc7ac190ac201d9fda6f43996fdff48938e770e7a44121ae907ddc39ebf3946bbe0880a3ef0e3e2bc0990dc55f7f39da505574284651ac03512b7c3fb3cd59586ced06b8a7be83947112831ca640af21f104a16b50cbf51186dc983628a1b02c1922c038a67b68eac080831eddab34ece28319b37f3214f5bae88cf8277816c744ff3e0ca726e87a40e88f0fae40d36001e15da0b6cfda2676dd404ac8bf7085f2b0a447cd79ef75fd5f22a0869fe067e43b3d236c1062122ca50affa4bb36a9a93dcbf06625ba10596deeda2d44c448fa5c25a91662a849614fa1772acf0c18d307c94c568fe299a89a0022f306905adfaa53c33a1732b5c183cce40ba8a7217217c182a4c8dca93880415a4241558b7de16bda5cb3eeea033bb696d3f8597dd7e952a6e6f8c7f3401edf96b0aa430655030d6aaf26aa23fa36fdf0a33526026819bdea41f391af73d0538a2557d610da58085d129288cd4f76ac0981cde525fa44d2ca191ccbda1e440d3ea0c7f4c5711294be81d36b6845e7bd93088305f99192c065b40cd14a09f329eca577b9d2ce18dddfe1c83966340780341b292f0732a112dc886495e3bad52099f269eab49087e0f18f46064f8a2d978234581b44ccd6d564d8929f4e53bc7d8c10507474a5dca297721930ca889c6063189df7737163d2890615cd27811c8acbf69aa09b8c8505f1f61705d5dab9e062f12e449df37d77b2c1811eeca6b6b1bd1e672112d170aca452a0a053d45b24795a3e915f12d3e69d86e4d25fb5a14d94e6624287451d67d18d0a0c80b85e955865805efd80f01cb7f3b2c7a858f9a8af28feab797f4c90b0b973462edc7b6e66e725329f11f2466db24da962e8442cf73736e751d9d112a24e8edf92a92007d7c91eeea25c37e44aeb1e9f6715f8970ed91c2cb833c2fb04dab7bc5fe76b905d52766376a67448754976bbecdaec004ab75857cb0ecc6e96e9ca243b9c3b1dbb1977ca46f7550613db1d5dc705d3d1007f17e42f46889621fccd3c9bafb54a804adf073a68d484788fc7e2230a2daf21d1775978caba3183dd155ec4a9407c1af312acd9cf6d8d32932d24150a92861b48673d50cef85bdc04f185ece511d1bbd9e1760fa83d853081904bcee8c657228b5d79811ff0545b10ed6f109dd1586b9c6416eae550568a9cb841ab845974f6b4dddcd9712cd9e5caebbcf60f4201952fcd1043bff4fd4f0e6b401af79f7a2763e5f1b4becb59ccce65a9fea4c8037997072a60db4390d0a31999f11f021eb79f869a693b9a86ea43b826dd326ba3f2c1182d3bf5b024030ca110dd9f753f2b159ad6f6d05ac1219b0ec85ddfdd9b13676e710b4ea83a2983eef04e31f4c42d279b4df7f07f1957b85110b9f5d79cbdaf8c2eff3c07dd2862ce8030ff15af6350078efdcbd0242f38483b43599cb434003d3c56b3b10a46a9d4c011b1430d09534dca4e2af9cc7c4a9d043f7e4d705dbe3b23868a58d1007851e8b908a23618be33bb7d26d327801ad9b6a6c0b10f7485f075ac604e7e8dae920d3ce9d80953c22de19f693e815f4cb40b870dfe4cae63108bdb8ef2471f97798bbc4f0099650f37dfecf3dea9403ff8a3c7e57dbc06f910ae87f479b44039cb7edfa6fcb196bc5a6798a1320b000930439de541adc1419c0e5776d3dfd756a3199f2950abc4ee4ce7524607a81a3ed04424081247aa70c8584588328b72c56d1d23209dbfbb4882b5f247dbe94b072710e68614ac53f866cb2cc05ba7c83605e9f6e0db1662973ea0fb1a7487ae44a94daad3f23cd3a3d4c4e6b7bc090f4dd0f2a83d7c73aab0daea7e3791c2e517257d8608259c9420cac69b51f8634aa7ab837eabdb6707f5033d317214899844d6e4031f8606f34eab06c8aa75dd8a769a1da2ce9e40a3e32c4fa466fdb9d489bf4a51e7281572944ce375c5c199647ba71122072366fa9c223477d27933ddb44ab21bb31a6bdb00713066a71f9d5302cc84935ccd82932651ea9e3121a258328e4668231fa5926b2d38ac20e4888d6f57ba3c17e2c387b418d0ffc509f036369ce272bd2d7a141215aa22371e2f1a3bb4fd2135517d47f7bfacfa1a06448dd5e0e464cdd106e70ccdb353ef3e57c8fd1d015cb46cb3c5d2824065016136421d67d084218f68c202ae785823eba61fa492fe2ee22e2f390ce0aadf50661c301d042677afab72dd155d70269709a9cc742554f54b2d9d0b2153c283b9b5236ec930b1162a0b8ade9a7899b55189778258f86a361e3431991cf63bc2738aed09c7b450cc5f1b356c8f5d5c7300306436492491fce2b4368424784e39a04e3a09f99f02e41be94c25f399f7d296bd5ca42c30aaa20a9f34e35e6c59b15741583be6e63b74e886247ef7ff244e3591c3e83a95c7fc3cbfc232a9ab4df4e24c39029d35b8168771df9ae935f2e8480b968e0eba264a44a5af60ee4a3da0acc0cd1d8cb2953b995d5e89a3ae410bbde14efdc8edd1f9459053e2effe6d5587a1b8142197aa6eeaadd953729d5451dfe04cb7e7d5b86cb317d1506f7e6e822c59e72c2f3e322fe62e693f1dab3746bf71fda29d436e128fcb813890f0ae0085cd24293f66755aaac5454e4e8f22e1b53a072b6c700449be7413a4c99087f605d8f1620e9c4ac3753dfd586e99dd25415c6d53a5f7e3905504e62165a5447682bdc91cb4b443eb10fc09999736209f8243952acfcb814de92c19e550b03422f2a9643086509db1d828f37f8b68264071a0747ad1972fbe31974ea59e75fa34419740a2e8a192ed68c721a21321b4d0ed348bc8797cd1e750871f0de827d6e63098339be98f1214328376cea7eba816b1b0c3cc0e100efe16b309c11aae935bb77ac9c1679a34458b0d6d8d1fc0e41ec16bbd82bc8bc00abc6009ff329c39bbbfaa872815bb89f69be8941d95c42cc09d8448d60ba0610f28347f0e05ff9bb05af28530df87402f3f26e864d7cbc6d90b119758d1db82f82b488f1a0776f0e159e7f8f02ec04977c6690201e4c7072cc9a67ad6ca50d9c13d79d820c8eeaa1b1fdcd46f290d44bedfe3dd4ceb8fe3fe8c813051434e566854f0d2073cacbfe058626fc1bbbbd910e62e6bc28bd7c75e38fcfbc0b1ac12b4aa464996f6e8db2095337793096561ef508726ef48809838e40a019d3d8cfe441b9abbab8d58aeee09f97f51d68f1ebf987bc00bfbff01f094532f92c97a4c960726bc531a9fdf0aeee74b7c10edfeca95778fa6307fccedfbf34a64947ecdf379302e1ed83158efe66a7a05ab008c69e419b67c8c3e2a3c299489350e8478a781b70960301ccc52915ea98cb3c7c013de53306b3ea6fb414bdc8a5e90ae1ef00486706423cfe8d0b0e202926d3f261e7a72ec4e24cdcbd32fcedba05d4680f57565c5c8b1d6e83d11e244fce4e8e5189ea8c3de1299a1533c2235d534fd4e569846ba2d7a35e30cdeea5b5fa028022238d54382814fdd8e16543cb5bf0834ceab9daedabf5dce8b610a430d9674285da69602bc7a8b98deb5cf8d1904424c6b5f72b6d512f87ceebc09ad3d35a8a8cbce5a45945d9cdb1313e9c519787a1687bdd998d4b46710e26e044ee9fccc48949caae78a904264e330bc4dc89b27c572f3b0d24642e2a404e4a97e9578d726b07bc027ada43574af0419c8d79a3df7486a52ca51da8f661d27226214f5195b86ca6837be0827c1e51b7ad723283ad824c9c665b980c26c9bb10d02fa7169f33ae056b6bc6d2cc27af77910ea7e97e4630c482253515b9ec7d3e579a22ba86d9fbf3f5d503bb7249b372533d5303513477028c2b666c87342368b732b92ad48dfb4025e69a434b6ae1f24300b088ce73820d64420fac989acc84d30ccf6b85a98a53b8c53cb0b0dca86393e12d7c567fd0c22db9ae4d9768840c0d4628881121c810bc17478da5a121d46c1b84a1b6ba596fd6d4ab664eac15af8dffc9061205e52bc49b6ecf3438ec4f72783d05a9042729eee7d485932ea397474f3b8a1acc4ab34f1eb1d896d607d233cc278e45f1cde2c0a8d574e01f12a6c52932480124d0efd855f77060533585d34218c0ca2c867455d22e8a7a8382ac1da6689262db031cf7f89a3d81f85b1252ae1a027b7fec5daf2f14856436a3514ed6868c7d42d45aad032e43d4e04e72a4b3315bbe095d8210b25f37aab625dd18b4d213ed5289dae0ae07fab6e00711489ec835afe4687f006a43c64bb9dd92e6bf77aa2f9bbbb79ab55587313528cd7d0ce9db5e7c32ac0f896b155b67d60d06c9854c1186ecb846c186687b2b34f154d02798ad5309e48169159e0c23044aa3f2b277b2451e91f541381a6648d2cf21bd55df96d28f6b33532426ee7365b8eb79dac920ddcaadb5c8e753b3f162db9df5da9cac1c99c92e14ea14140fe6e2f8aa9db23b203a70d7797ada7ec4f32aaa53180a61b93327c4a5603083352322625908028c6bd988626a50309b038192b8d91019727c8d1e81a2e61380c0fc6acf20adaf7f2a4ae312e97b4b9fc04bd712f443db7e774738c49a2bfa16ef4257dbaa6f8edefa3fced348b4d7286f36487787b623fa7eabe00d517e9107209d6eeda96dab4a72c4ae3532660feaf83fc8422bb2587e23e3220a95432a5188de1087b635c522242de678d25e9f118671de27726a98eee885cf5d4313726ba6038335cdfefb89a420e72e12df0b413099d7b4b301c0f5078081119ff2d48d4601c08ad3c0d1e7244a70096b6065376511d041725e5ec331c8e2a7a2648a20bb5630cb30cc683be6350c26ed8caf8d6dbb057175bb9fafa49d2a23bf542eb77abdaef202fc702330895cd2715ddeea1d1bd5eb40182e32eb605f6b48b2fe4e0542d7c7481cd936f3f5632125509d33d23b55dc1a4607cb639b5818e0a03902e6baefb9dfbfe072f79686842b47c6ce0c7b0d4053186040dc14816446c81372ffb003ab8322314e96c103c20d596f1fa0bf0455ce81baca7dd1256aabe876d2baefa820e459c79e59bcda811112a826bb2ba3d9fd0fc7de036ce4738c0e465fec2dc1aaa0c8d23459e938e47eae51e1a1f364bd9984ef0c5340303fd87e0185c207d0decae051aae0c59e9b98a3ece765178f1400c338f443cc1228b54a12d805821a81613e5a6d91d13e72cd940b1601d363f5c6d78d165368ac9dc8522d17ca2992a1efb2e698e01bdb031b48a58210eec418a68697fbdc80854097837091c04daa9b7886c3343fdd9e0d8e303ad34a2e7fe3b3927090bd806b541ce5b90513f9c2e356bc179fb0f73eccf1f130fd972ec8abd8c1f18dbc0e2d7bcdd60ce7987207e9027db6098f9922ebadfba33dc09985e0c2d36002ea3040f2a6e3e344af953d9525655833b1bb7881888099dab3b225d27303a489247085545295aceafb45815e20c2ca5cf585a4d91e7802ab645602fe0fd0cc755e5e3091d3ba196c038a29e2d0ab0c0c8e3281e42cbbc365064dd4047262800327b986d8a074792d357ef9997a461873b135312b0f97d090bd08103181c99ae0cdab82dea62922226ff1d4564916c79b9457564d066db8c13bd25ce188f4249dcf995c209a8c86e025d8a4d7eb2de05bbdc7ab6e6bafcbe8c33081f869412ad629b6a31d1070f427340916abedc0f2a44db8df23193aec915f7cc1633a68f5f6f6551fef3eb4d4da6cc5abdc0f4e133594f070f8d5806e8b947295132dc93faa29874b7e1a648711f60ed03f3eac02bf075050c69c43ae007e442f3766cec747f1f873dd51f4c130b5459a2ab178fcd5b325cc1404451b22d9f5ef8a59d4329c05aa2c3c439e8d44bfbd55a568ed873cea159ef7c30e83631d4dfc81f13043e4bd1563caf6ea653c2b8e0fa15409d147f35e02e29771f6676ee4855269cfdf4e03f48ba08e1b46c488ba0ffc32cec910b6d483775ce8b979e74f1c00fa0a6caa49bc8c7e122f8ead2959643fd1e55baa160c904f6e7f100d9406abb30c7e1d1c7b35279c146ca3ec4eeb7cb37101a816ce3551ce9d46c3b210dee481432417a64927b93d9c055dc05c48d004e0f9ba8799654d99a20c5c14ced79cccf8c70389023e9b9ee4131e89c7355141e77e2bc017461df17cf45aa230d45711d5d516f66941e4b47af018d29f71e879295645e6dc3e4eb797e56092a5645542fa52c0c086babdf720e7d7d41fb09cafa69e77b984db4ed0b7d64adfa7c7e6a3f1781c4dfc98e78042ba8a52e859d65e3405d3b19afe194f5fba2886fd9e70a8defd4d692990c56b54966906d715a49fab02a3a9b93ef0a9473e6a55c55aa27cf14d394969ea316972a68738e568c2a243d452dc428c34e382d6b55a6e6d4927199342942ed90c8ed9fd3a0e3bd4e8d8e95f435f8d6df7325ce1d110cd5f00f65a3a772bfdf02152d44e53e4933bee273c7353c824f4a498552b4345351a2723e5cd6b075dc5e02a0b56d61ff6ec1f80f2f8c80ff2943a19d62d1e2fdd9c3b5a2ed5258a62da21311717f15669e40e8b2bca0ea4af0506315fa39c8aee6772f3f351491ab74fb7b901359c9e40d484606f4a764e21f1696e329140ae0406971efd12260f83b25f7a4641868e24324b521567946c5b74f6b954bf906948135d078dc8818ecc30688a37f0c6e118639a60dd1a21d00011f79a342e3574d05abf3c9e0766d290afc68219c8e01fce565d27e699ec26626973116ffb5e07b3ade0bf512c4565e18ab300c1a31c084a0857ee64c7ca0a2ea826bf2e17789825d1aa36956cbf0bea487097686833fccadea2f7435cbd5065e14afcf555e182abf789fad779842ddc98eb6457e1210a3cd5e6b244137fa8a5b8111d8e43ac2193843fd58c83435c2867eb884967e1feee461b5e5d2352ed87ee9079e5b2c09592522135fcc1569ad49737b30d4abcf0b1c144aa50b354daea5dd82539d6fe304dab47108426893d38cd3a033295071d7b4679a9cbf038f39b3e0a5e03055cd643e9cc72348dc955fd3a9a53d5a51b5b9338da00272fd60668815c9575a878acc56f32df3bf64eef4be0e21891df285276a9892ba997f0870d308564563e25d6c7654c30772ef9b60d4efe26f7081c38064a4fe7a6964ea7fc6795347ec489876f14a1a2b3385f12e8fe8515c36a63fae36fa32c4b20510369a9ccf3c24f14c312cd31181adc711c9433d87197d1556cc466efc7acf74a6f82788eb3fc8e81d97a3432b79b4daba5d64ac6d90d4d40ebc96ac714ae393d733cf8c6cf29989094b0808d6905e0b2f55680ded01a4d09e927c06cf66885f9e61a11af0d5f4b461b45371b47969a32eb7f936bd22c83405ab4af8e78f39015aef5ab5cabd17440e673698f68a60cf2653407f22bfde0210cd804d7ad25433829eb8934f362e7db0702f4fc5fa098b0b328752e7d7fce1d4c3b0b15a4befa75bdf709e02d5e0e40ea5a932231908bf01133ff73921982e2b226f12b7bbf91d7c22b8c104ec6db4c6a80b6228d0420159ef01d3105f216595d913e88d238675da1301aadbcca9a6afe54c883af6fa88b942d97fb6a5fca8f44e664b6b15baa7ee94f253e99ecc96b2ea39677296a57658146c7c408dee8dce6c2af8a3e1b5b669985de72f62d8f79ca05c8cd562daf98e457afae9143e4d25b968e8ed4f9d19d9c91a59ccad5930b5ebbdc6578afda138c00a855addc627f245ac5572eea5a6c38eb12a0b65ac0e23f732c472b1415e0ec217770f9b2f0127424551d8a4d04cb1ab00dde198a675848a0fcafaeeddb234b3b516513890ede974210039bc70a6136629ea6a465075dc68b01bad6ad086dc668edb94ea921d074a8192b9266c4ea924fc587dbb2402272dcf58344a4d4db288fabe7bb1392a83580a94c2561939e6e9b8fbbd66746b67e512b3d2621fc33661d2102452b44f353b20e93137353492d44491d824e6c57d8446f9f0d31195c7769886bea98324ff7af740cc691d9c4fda793c75ec9f2319b00089aebd4c08fa0dfc0bcea14511fd33a307517cba534ab8784904adb403ba702ce6420ea236a8dd47655e70da8366b6e32b624541b2128824f9d079062215e73885148ff3b028e036178fc5e04126667af8dee4cd7b6a4b8814eeb27a4ad55a71c1e02a3f4d22b4f15ff7a5ec9b081ee703a7b012f83f9af6e28a1babf4ffa4fcdbfa2be485f237c18bf14c75e537fe1ea5587ed63d59050f967862ec8cacf086965cc4a607a48ac63de95666adb7cbc436c5319ac874bd5f769c66c179d84b25fcd34c74e09e6090e253f038ccb3a271b5823dc0da14857719b7dcd92e39a1594b242538848af102fa1feeddcbff16a81e4e4c406185a2ed8af711f2a2441f490900c8aaea89dfb7f8986e4e2a268c6fd45afa2954128263de6252b91cc5f8ad69c345db3062e7f99c82d9a838cf84cc6d54c37707c930649ae90f9e7a088be3233013d5cb2ce993d8c7e5339243a6c61438dafc5bea3a090c0788013b4d21c074c1fdc749a9f41e1c1ba217e33e958c6757f594a710bffa07fdf0884b7f5ed1119f58732104236ed6ec39c3a189515d29ae231593eea5ee668177ba03eb5cdc7cba687a05954390e556df7f2c0073f33245d6d279c3f3cd6f264be1cea6510ddd5499b3cc6b1da916ef48df5126d26dc3d2abdd026e65b061e3bd3744ee5fa1803489079a757aee860401f3cca09d9ea4e09a4fd8a1ebc9efb1c6f4aefd0002e67b68c7c96e299bd245927cc5d9792e9e3123beb569d6d532f819c10b952188f4debdf789d87af05278cc9e2f9ef255a4d47025eeac20b68427d86d62a33d9d01624e9eb1b64013920b8b7f1daf74379f922a668116c3f248c39e48cbde5b1ce645d81e220646422449f8504df33d34c1088eda0248a65472bd9e9ad71a022de7c8a5afe32d991c643a3ccaa97b87294bff65d166c460943b2db91828088f56a0be9214b535c60b60156185e98081cf7ad854df427b3937d40cea827360ac6b088d65368c7ac81f0781bc968322c74b115b0b436a5dba949696e8629277a4324e9598d5c7dedab4a573e86245112c91c5b37134a7e1654bbe6427b8b320e6ea40e31ff4b669496495e1fe8a908de54f80c47d0ea43948688d7151a4ea1005e718818641f733968f1d9c72e021b7d11a9fce441355aa13ce27e019ae4aa638665c03e16b4a9e73d4dba2cde088c3fa2171b6ce7408d37928d7546added9a74211672208614553683dfb06d4d94981c2ddcbd235e207bd848954574d4490131b10f2cbbdb9577160b0a8c813d957ffc3a29969423bfe87e1f904bd601bea8ad08987b4f406d9ac0480ffa19846754e21bfe6914e2c10e8d28ba5bb1a11d1489bbb89a765d763c12e855ce65a0b5d8a9a9c7cca12a117afbeb2d48848b7abebc5524450ea4fbf720a65aad27d417bb019e17cd33789e8d88c7a7834f83df4cb5935f263d404dd524ab53657324f705fb810cb8083b5b349cbb593bdf4420f1fb8ec5c126e9937760ccb3433bb045f25ab0e3513bf9615f32e9f88b0eb678d8a8ae6cd610277b7cfe139c3edb35fd4eaf323ecb7eaca1a9400f6da2ab02f0852b0f77f7ec560d72a94f49f709cb6f37f2323d79f692151f3bf30e7a599c6d2cbce036f92ab6bac86f9cfe985cc27e6a139ba06e4db35d92cb299a36289e464cac47950435aee8cdda436f197f9fadc3be1cba542b4ce62a41abdc5a20d19f352a1200b21f1341714a6814a1661061080742a12acc84b9a352b91a68d8320028f0e8e4fa2563f33cb80cc61de244c8815f7405428b3b7d184b0610efe56f02809c89b2f6c35eed638e30a5eeb29c7c5cfabbee01e9a3c5db1510fef8d0212910ff8d683b371765fe8d0152d5a884dc509c976b6ca5514d0953a52519858db230f782ad5086c2de71ed63c9ed103fa6aad5efb6d672b1beaf48db55122aab8d506d4c1b4c5b1420c0b3ff0a63b03f107b0127cf7855f5138d0cff212b38c4a5e836e0bd710fc27fd2f64c3af2927fc5121c3c7b6852bdebf409d2a6a198a9ce0f17f94da158f11b3cc375ea3003ed023c72bebce2d8b529badde3df62a7e3b7611ce8b4f266f547bfee2a108eb51696163fb7404dd1e00206717680bd0450b358e0443f323a231e3648b4843dfaf561d1f40b316853985e0e7e6b6b183a883e78b6fe052f7353de78497cfcdd1bfdc80dbd680b8dc34cf7b95c0376f23b268d2a8dd520c64862df0de08ee7f381d3900bc3b8faac11b44dd287220a7ce16d62389a83453f90d3255a3d889a24411fc049137c50571500d08f473d0f0780775c500607188b44a8840a480fe9da92679fd00ea08f8a03800f84cc81945a0f813dfbc90dd2d94ce40d0e74f54dd2150cc349ba66fa4dd28d3081d3da604162b707f01e237092d01c97a1e36af326e9ba0e4ed2ef368033134ed29115601bc3493af9022cd1e124e1ed558af9243ac1f677842f00161fc3b23849d76f8c93942d12dfa2065ffa4ed8384967552e15519195301db5408e5d1558671586bde885c07c9afa957a717bbc214ed2b40baa65f688cc942ee9b8d6bc9a6d4c824e92860fce896acc498a99a3c102afd37dd003d2c6297b55fd759b7034eed4d1249d846bfa1df3c0b5f15741c3c0298ea59388a8d732495facadc21279968bbf7aec041ef75a19fae5b52572c48b92980f4f6d64ace44bcff9917e3d14977880686307eae0d475251dfe3ee8fee6d00db15eddf262f85e5e1dcc3738afff3a0d1fea23493ad1fa622a4f7b2441c3c60f567dd5020f2034b3cf57be73f7237f7793fb9737868e3c614c8f0d7a5d7e57e310da3d3b5e0a30ec8028f4a910bd950f401b9b138f839a3fe996f2c8869c95dc4c3fc4cce3a6833cdbae2bbbf666e6094c1d3a4f243dc7ac3351b5a35a6b5e886bd0733b87b17418476b62cda792293ea20b0f126f42c80a5002f9f3f6913b38847a18d5922a386047c0cc305960c52d9993edc3ef76bd7d1667461e61340038795340180658e1bcdfca6cef83e3fb8ef7e1c46237ef45347db9f3f213b1ed71000cb1100a84d1165444d170035b142c2fecf4cac5df645021bb89e58cada71090b1fdca50bbe65a8fc5e081f1c6abec82f2fdc7fbcef49f026ed3e37cd6f3dc5c6afb1f62373ddc401d72ad4e567109a33d7dd8a132decfdeae094b9bc7ab727118d1a5eda41dc9782ca76d3876639d664095273d94f2632d1b6d6a4697dc105d9895df8a6f48563c1e76fa5b7fbfeabec5922983c3f2c085167af7a42e113b0654a869e7ea2ecd3ae5b8d038ebe2f0f29eb75aa811ca3437df9472e5d7dc5ff759050b34b525b610c605a7febc4045bce3bd1043348e1678d11e510f17513fca5a853ffe8f682e4aab33d1fbdb0dbb2c9afbbb7b7c2935b679cf292c6f0f03c7856ff2e530acf9a861f30f2bd232d42b3c27baee2cb7d9b45ca0768a61b8902712e06ed1e65cd00e912f43a61ee76e1ac3452a8b61dbaa37efbed3e527c4068f85ab7d90b21a79f54cd9eabb9677152fbc7b62c0dbfeb5b63b105310c48efb1ea855ef1d476bd9e657ab59e0389bdc9101c21963570772d8aa46684cac41a76de25279bf181eb35f5b6eb2904c783e2be599a9fb29eb2c8caa252ee494ea5f4caba60b866ab0651a4b0a29e38398d08fcbc4e941e3cd58e1a529559233d53de7231c7f91cb0ee262afe4040407ccae06328722d736f99f78dae8ef6ae6fe6e060507700833ed4ffe70e983e96a63c846ece7ae3635a39e21f818122082a8fdbf01591c6c873c8da5b6d79738c9b8e3bd506667c98bf5f008b21edbb154b62703d725dffbcdb89e4d237540a3f90a113bf946af8dfa2652447001093ed94fe62e2a69b2e9abc1d2db3014d95bc3852e0ddfeaf51ac366dfc8fdbc26612453bff09e38e7813e7172b0b3fbd794ee7195c5874376e6eb2c6de7018e5a2b382bbaa3f60cd98c87a3f738f63998e73ddb0e7435446fd7385d65bf2711dcfc207f4ebedafcafb60ecd1e634271f8bc46f42f68f621c4793a3609b96686f74ed8059cfbc7b837eedf8777f99d3361fb23ce21a03917c3c0792afa6a8ac9523da2393fc2aae5508e859574bf879df37b73dff02f59d9ab3d6cb7dada8a316be5174e5a7b44cfee200f08bc8ff66849580fcb71cb62bee95cf7fc79112c6dcffbdde52d262b4f0c9c528acdd4c012f39b5a9e7ba9ff49842acde3ecb5a67ba4e8f90e95bae9f055be881a6f243e8ca56612df6f151b1045a5e8043287cb786f4a72ca627a72d517c8856a2cb43b6b0517880bbe6473cc69f1b0e0b829034b91603a3e4a6f4a2fc5559da83197a0144680e342e160750d1f6bfaaab59d3d448bd2b8317298d9c02431df2b6c17df6163b54fadb6933b442934572a90d5dcce7dca147bbc9792c26812c546ca8041626191e02aada7557ab58ddd2ab451c9d8384ad8c8689828ef2d628fd5b5b4b2a7aeb14b392316322b8b2417190db5f2836df45ea9955676eb347127a5c14469611373a2a2a69738758edfca9a32abe3ce65e35a46e0f6f9b6e968cb97cd22d8b4bb06ce1a79aa4989dac50e76ec071ef9b122dee5a24394c8abd2245f37aca1923e91c6bd3fea0c057f5731cdfdb23542ba4b89c8278f56a1319faa405fdd3a828c7b2f95f8c9de2e349977c9e8cb738e10913715925e6fda2241be2a2b53904be7a35a437b3c4171ce6f4ac4ec59c2fe307d6663f09d0feb8fdda6beb310116121953fa1b76e44d6f507b2bc00d0791cb3d4b5d293a8c806e6366ac4a283e277cd72c64be12836bdf6c423185a936aced8fabb0c3447c5fee115e740fcabbc8b2302600f9af8a7e755c62d3675d72407201f72a4793c5d97d3b0d93953f3ab34237815399b93ff24942fb5c4afc50138cd6867615ea5f6b8060ff276688aef158508eab6b74e772084f7a9de2035fc088a4d03a921a789ca51525aed16f14b4dc942ef0d8c99b3a3018424da70c72ed7b6272710b4eed45f46483326dc359d0ea3529a683350f5cc0a7e8cd88ca725934fc41440186ccca6722b57a39999e9122064d3ed13200ad825657173029d5b94d99460792fe70874377af1101250f384243b55c9219786bc5137b971845eca1727810b4f001f09e5835b78129c651fbb6bcd238e6d7c57f017b5fe697a4afeb3e311e773f3360c01e5e623a953e59fdd79ad5e88f445ccb4770167893c8770ebb645d05ca25221a8f47c77f51cc11c92204b917fec5a668cd1ddf0c2f4cf29e37171904befc3ae676da8c5b6f979b533166472fb143d908a3afb9af383024cdb4f5798b3ad148dc043a64f85f087a4cbb95a51cc5889833caf28ffad477e7887fe94c66ff59c869c559a3054e5d17610ae35df981f27c005bbdb0d41ae138609388fa2a72c30975a9daf640bfdda145ac918a83706bdb271fa1a14fb440758f0304709d31886e8a75d1a42c14c90288ddbbeea42cb2f59e7a05bcf2f04c7df6ed5f5d96277772ae7b1846ef2987b55fd101b89fba71ff8bcd7b7aaa4a6a3c13707c57a09c118b543cddaf94bfbdb4bc077c1b94fc5cce6e842d0fd28d4063caf56189c683423df5a0c40e358bc069072c3d9f66ea543507748c5e7b877582851d6f10e3402319d0ef5bd69aab82fe602f13a051caf5a53afc7387f0ca69efd92dde33cd60ec5c003810f8af33d51b7696778bf91369bcdde3007836fec2280debcc6089cbff562b58b64f2c02a6d36026db2cf6b58f3630d9b7f5f913987f53a542ac2ba057a313542faab50d3e58fc69fbb03a916a1973f462bd4de485f18e207e1fc91628a915a80bc846b31ec91d61e9ea705ee223b9aaf5a932b6bc2fb4c00cf21a5ad6d8ba0493c73255685eb1a6fd5174318c70eb453250054efc5c642bfc6b04aa168b0f1936d357f80634fd5cd94718f1bd919932efb84b330cfa142e512c3b1b024ebe0b5d40695d62d02ea6cdf0fde9ffe8e13d29aaef8ac90518c0987a849e04955517254274f098147c9610c03f45d32da2ea5b49c5bce15ca25f0abf11c6f9ba3fcdd7c08bfd376778b05be5013cab14f4b9dd11f5edae4e73a904a9c8495cd1aa1d9baa79b3692528dbe84962e45becdb2e24f45753ba155306b1108eb121b51db36930bbe34f200f2b123ad96e7a38c081b4857fc9203bcfab7d9e551a8dc2a7169d314bb57e674393f28dae320a654791ba60f9fe4be229c8e10b8f7422579e4e1425524004c5b066daf13ce42f96c8724c5af3c916b384b7ddef0ece6dd5338150074fcf4467a8bfff45ccc7d24c5a32b8e11ae08da7ee26247de9354f9db087b3dfb5abbaeac8c0ab48fa6d404691eee0d2c0dc3da79f40bd386e95dcfa591b4d3196b84e0b84cadf03191b45b22d3dfc09cfee0df904502821de90b6482aaca9a3f35870ee259868dcdfa468a9191d69c17e3e1b85b65ca12820118ce83717d3ade54861b08023bc874e6b15750ae640891f5023e928ce92aeb2c83b82a00fd5d8857864641b6432797e3840229fec07079bc74813fed1d64354e2d9055dc28a3e32d9c533ea99f450a2f8bf7b4e2732e132e77a72602eb8f5e353b34c8a88827b010ce03aa3ea60bad63eaab10caceec88af27af2baa815883cd5187c686432f472804728f0568d98df599d3007ced9e81837cb1668fd94425380e221eda9f4c49dceaa314179a1e802d4b145bc8618d33877bc1ba2560ca65d97c113f9f4f96c55dc8820c2f74032f00071fa1544dbfecb5978b9bffba986ece0c2efaa973db7b9c8356ce441b9e8460609023d59d802e4a53c803553613c962f013eeec30f52467a1cfad166263b8bd94d23067a17488b7f7515ec9caec6dd9fa20c0f900c0797723bc286f67a3a4ac7690c46e7cac866562c7488ddf5ce64841ef11daa2188f134cd1464814b1214c78b43484396e5075ee133837829f290bc9dc1b9e47b4004463ed3b3dc033bd729aa08a9bf917c69e6f3b4a9f33fff4b230a03fb31bd5480352e95431630e284d758f3c03e38f302cafa62cc7f45b26e9ba412f9267b0ef8eb0d30725992d227d5bc0f0c6b53b27ee3370261be0f9fb7509efe28772c9e1138037d8512d274e57b22459a2a03298cafc08c5079770fc6381345b374fc81a47b8b2c677147e9357ee62189c8e298a6a60f26ac3a93e9941d362a634e58936afc1c0486911023e057c56162bd7bd85ad41028e5cc41d0b3750b0a6d001f3ffffffffffffffffffe305ff8da9350bd4b62fa54c2539c4ea4901d9814b29a594524a625091dda9510081d357818906f52a0b1c0b850aacfac18492247568d4d8fa2d421ee981be48cbc0c712b0afd5aaabcebdd7abd5acce3463a2a7d0bdf94309e5d869553b08b30eeff7133e9250d660a7a3d3c88d498da0f08184d28ba636797a4c1ed5f218c378d147f83842b9245162f6f84128f9361f4628aec9370de2c4c6d4a322944f8d1a1199f12628f90711ca2df64187feb0e76a7f0ca1a073ec596e2741c6b91f4228ff2725749efe4927a60a3e825012d4d5892d624fbc8b3e8050fc90aeaa31985615d9031f3f606bb3edb4f632dd5d4d7cb4a6cf8fbebb37f9f041b9b4983a31f1ae49591f3d2827ed419430ade141d9e2e3cbbd87bc09f90e8ab93e43bd0839f7ec4307e5d4df2565509fd65e2e0a3af3c8d89d4109f2640ff262062e4a1f7783a79defe7a08ed16309336e51fca83da65f5cb38e0e211d6394a00a336c51ee127d4e5c8e95e6b0da1966d4a2d46bda1da446392f8f16e52e79a74b98a424317a35d874a0f5d891c38b3176f060c62c4ad76eb2e896922f99a69da08b19b228289df73d87fc3f494b6698118bc29afdb59e6d8e9ede8245594f5242d5bd9e7cda7b45514d9ad9106ac36b9a5da4892122922606a6a161862bca3b763a87d2bc5e92588f19ad28998c3974e8f5d24f25ac28782859cdadfa648c76c62aca9e2d4e9f6879faeb9d1bc8060644446eb9304315a5caa0a367ba4e8f494a444444648c1e222263f4b85494c460f623b4c467293120cc404571b6bc3fc961e2c71234e314e7139d9932b38b5de9801264c0c68e12cc30453978277dd51427cbf93b8a8888d9816694a2ec26a3aba48adc4ffdad600629ca967aa55fcdc4d31d9d01c271b6b73346518c634a8fcaab8c2739b223c7c80ccc8e911ee80bde19a228e6d0385fd2d34f10322899a96d28ca49ce9bf1bb1c312dcd004549ead17a35a95f4ad26d61c6278a5f23f36f55ec7b8e01c30c4f147ff3e44e67f3cc8ce4e8719672e4d8e1c5716046274a7eb259654ede896bea81be680f80318313a5be18a1d4c8e456f2dd44490751be7d3afb2faa26ca312f940c3297fd9e3013856b378f9dc4cc5bbf61a21862d276899f4ac97acdb8c42a7a9492492a1527a7c20c4b74b2c4a634a5496fb93da31206f1b650d27b435d66b6a3870e35cca044e94d76b8768eb1bb4fa2f0a763bf8c2a6dc442314312a58d97dd9893772ca1f502470e1b35b001868d1e3a429036e289199128bc9b24474936ce80444195207fdb275682198f2896ffc63aa97711cc7044f97a55e39b6c4c92e48591d803331a51f03325c8584a8cb915ef0c4614e4d5933c23a4ee891af38c4514f4fe46a88c159e7f4e780e2841067084c00421288107b410331451be0fd24d7d4753f1a24494b554ec89a97ed9a84144498e2a2689692be93b93a007e261851987b8f5b6732a39e885091266182299c48f59db1935f62e44f9f3c924de7db052a2448852aba8aecff1e4d47d1a4459dc936849bb20ca19fb6de4a98f1c88627dac0b114da72603a22484879bad76bb7ee90fe53a0f9dbfa9f359c70fc5b5132adbe5e39d491f8af7da252839c56a7d880f65ff24ac9e3c4ac973da433168dcde6c7fb5ac87927f701393d89edf9e3c9474f99f8e6c97b8f7e0a1a4b1a34a5a4f579f3b1446de85dfe772bf8e1dca37aa4a49924ed7a1289a367f4ff0e95092447d934b75959caa9f437174149d7a82d424a7891cca3ddad44db40dbf328943d1bdf3993cede1505c8f9abf9d94db66c91b0ab24d2c31ed1cb356e386923ca6c4c98c76bacbb4a1a4f79625462b3399c386e2f9e97b77a59ea4c4d7500eefa1aa368dd7dcae86624ebfa374c790fd6aa7a1a827497fb27d7f4e66a3a17c625d8dd8f24c26c919cabb49dcce2746654dcc50b6934b0ed1eb13ddcb508e150d25952428f32c93a1a02733c7111e1762e5319446e3bdc84df1bd273194c4dbfaf4ed398ceec3504e26e63841698db272c150142508db12e37ea1a0ef63671c0b31a2a35e706e2bad3cc4553cd6f3e30435259358d25f06a330a30bc59324b9944d3d5d3d17caa54a2e4f689dfe5db750d269d46375bffc66550be5bcaa11bb0feb13d52c1476f48a27e1a2b33dc542c9d7bbd7e45aa8bbf40aa5cc645792dc2763a7b442397dcc68582735b9ce2a14b5378a3639c9cb9a910ac518ee277b69ac3e1d4ea1bc319d3efb543fc9432994d396db8dc9feb9e18b42f1c46aff097192b0e541a1a0a91b4c959e7a8ef78452f57638257e1efb3a27944a899f3bc4f327555d138a63d2679334d3d549624239cbb47b9edc2643b48462879a5135624a68df94d00953124ab2f17c7b3b644d24944a7ad437b9eb25b423147406913b49c6eb5099114ae669329328e755b245282941e9eccb3ba924b56ab089c125f08003789c80ed0233885012e3f2c1841b8d813a306308c59cb762d38c8c304308c53a498e25868f86d63077302308a5766d4f9ad7e48778fa0633805052257a8cd3a394b4ebfca0a03566aa93a3c9a1323683193e2889e84d6392346b19790fcaa3614c06edf82d629dc183820acf7136b3a4e6ba25f8c08c1d143b8a92d3897fd11d634b83193a2869f79234ddcc09a6b5c00578c8c845b9ee3f08751e279a88b828a66c1575627ff4936e519257e43d557cd8dcdba2a0ff4f50fba3f309f5ec56462dca37dbb272a2c4b38368511657cbb0e9417437627adc40474bc62c30214316326251f23bd72d1d4cee6b0916c59874c9a5635e514ed7932aba4af2f8619e2bca266e84f024786550d93b21a3158571138ffb8c7b400e3258511e351ee29d7fb22504858c555842b7688ebfc91a6cad0819aa2885e66c93eb93ca4f5d4d3cebc20155d00d1d615042462a92a94bac0d625a03840c54ec39c94176d0cb384571d5fbfd4f94d43b5a9b424b513ed3513c3b7d7cc8510db62e5a06298a556a1ac3693695165f41c6284a7a4c9c7dc7f4321a248ad29fe8e8e9242944c98f0a324251be4f2793123bc99724074539063731068d955e57956541c6274a23b75e64903717f3a64086278a9661d4a787072bed844046278afbeb5d32a852f95633270a52b32849e8964e3ac9d94451b497d97e283168d835d8fa0b199a286df41876c42741ce23692023132652323051cc25271944b3b6046da01e3970dc8921e312a5cc37417814ed3931aec1c6c312254dd36592be7bea6ec8a844e9fefcc22e4c6ab095c14006250a72a64c906bf2c9266912c5327964e8b73d2ffb48226bd9758fb3b73439799372b7d1c48369b3070e2406d2489447aaa9f424892766fe2151ccd13f6bd276f288926fbe8f25694eeb1376043a08791af39a67244f006a90d18872eb5d998a12ada14d198c28b8aca9c7c320216311a53dfdfbbfcd1cfdda0c38a00b0760a00b075ca00b45944cc73254575db89f12511294b0c17653eba90c21a23c9ad25427fd10a50f7f3d2274c72eb93644394bcedd93319b46890b6132086122320651dcfba47f83d092e346100551bee14ecea08c409473f5e43ffd5aff7f02a2a8361e94609db294ace51fcad6ee6fa33df38d34f9a11c3b0927c9ec8f6998fa5090d7e92bb497d49cf47c28f968debc50929acffe1e8a318752a2995dc7445d0f05d99525981cf485a79d8772ec29394f92649eb8160fe50b99547ed76e268ddea1b4224be98d63dd36423b94b4899d316e92b89a5887f27a582f75191e3f3a3a14f4a7aa5f076b0ec5ac41f6ed93a88949e450ccfb3a31a77ff42cc6a1245789dbb9a309131e1c8a2d3af6e8306a94b6ac069bcb7843614e26fb9c64e632dc507e1374d09a8427a30dc5702aacabe41995ed6143c1b3e9d47b6238151fabc1bc2058c14822630de5d04912b306e93e164217c850437a4cd298af3a6632d2505ecfabbad59a7e73d25720030da59247c6c3261d11dae40c05efa4d5b38b798aba6598a11863ea9aa05b4735c9915186620ca64afe317d52cf4b818ec82083a3ebb9def5edaa6b1dca1843e9ec2e2de365f40c722cc8104369e457d7ffe80ed62714a128c7b1b9b971d1a5e4041405ffccf598f53269367da2641bdf49c67d9253e9ac27feb897c95e83e7b4d560f303e944df16e39a7395da159abba2ba6537a98f9906e144b93386afd050fa93fda6038c0d8c61011e3c8c1725101111c102c826ca6da228bdeeb44955b691d2c8063080013078981988885c8f1c88264a42ecd68d66f18bc1d84c945ad38919226312c48b291d13651363e83869bd44517c4f38c1df3e9490d560b344f93688081d6495f4c9adc1e61a00a944c133ebe636fbf0714c104a14e7c4132afff993a559832d9737003289e2ac6afc977635d85a12e5f21c4288e83a313d58836df5225130bd31c466db491dcbb21a3c4c0d8604183972cc0079c4c161630638c25000882350d3a94bd384de3c6ea0911d3946741830cc14a411a699e9d9e8b7566a5d6b90f939c631419e98f230eb208c28a7964d25c7a04b3c89376ed8e88088480e1b233a4016514a93a69dc4e4c7cfb9065b2ba2a4c49dc8b3ab39c94414b48326b1d3c4d58ab206db88c560f5743ce29178401051f64d4254fbf728213f4431f6e7832ecd0b104394c6ba4d6e5027bdec852869feb41e74793ef14a35b88010a2244a689a47d5dd9ce47c00641085fd92bf56c4e7d4f1d342002288c2dfa69a7daf02510c729497e850cfa4551e8028a9892563a639d51ef11f4af1418792ebf643f94cf89c4fc3428d5abb0fc5a46b4c2e4fe21280f0a15cf25a94e841a88c27dd3d9475fd3d6ede0a2d1fba00440fa51e7515ef94c7480f1e396a8ce0d871769a87928fe79869885b2825207828c818649a5321b4f6976ab0d90540ee50f0cce96c7392df33c8d8a1b4252659ecede7949c04528772f82ef151f4c692ee0e2347004287d2a83817a5c6442ebd3914d4b5e6868e793849930377aa67f9ee6e39a3bb75d52644ab66f0310ee5b4794e1ee52aa7a60403040ec5fb371bed41e6503257836d643d50010b84c00319d811a423c7f3c000c81b0aa6faea42fc479892c423a6390071433973ee74a5e2c3bb3d6d288ae91d8dad13af3af288311bcae94c8e25f3998a5e07b28692bad10dcfd2aaa1f8b9c35e68aa1619769034144ba8f5b096a7c4eb183494fe3d6f7be4894ce19ea1ac9599fcb6fe37a88803103314f75bfd73dcd2e6a51cb11e8094a174b3594efc6df851a2642858ac68f5ab2063e832c6db72f533e5ebcc35ec6d0655259da0e488a1b43968a9cf69e35b99c250506ec243f399688c6930949468eacc2c9374895344a447be50aa758d6bb2a46a985e444444c4023005102f945f64cdc462d8387801ef334fc32e14cd7e4cde64c993c1c385d29a10f7b2398ff818826ca1287373eda3e35a28cbfbb79c2475de2df5004816763755ab7333abd431eda4f3bd64fa8d261b040ba51dd53aaba1329aa357286b27f957692687f512102b98cec47a28597bddd14347154a72f2898554b3ca97bdf080035c0708158aeb36ea393b4bf05c4da15ca3de84b92b293f9614cac142a95413bec9548d4241a5eb7f956062cef9650c40a050dedff799bd8da925863000794249c99d8431f94493f24939722437409c5076dfbc96fd23d4ef046942c1c415b9a9ed44c998634249127f4d4e2b7b07204b28e658374aa6302d994a1025147d3d294937c6d292e477e418c1b103b1ed40361a042049286fb5d6c9e2792414773b09a62656cc9d06e408250b93e47ffd33a10b201d639400c408a52a99c4b4f93656b72f42c1772f37094a3f491f118a79c3aee4a44f968f15c8105817efb09dd3789b3bf1e47b2ae76a64d6eb858d1b3a48b0a3070f268008a1249a4af8ac92fea64a4128f79cfcf5593f296172805010a24a89d1318934dd82fca024674f2ed70fba4d388d9801c407452d39aec4b7ba64cf9c01a407a53f61a6bf33c8ec69abd1c37821624078505a51e7969fe4e8f59e306ea01d3ab8417650509db385123e66daf76bf4305e648d1e46478ed1e312440705e17967629256d3838111ece8a1033f725192c4f3d32ab93fe8a415e10317855192cc98459bb2b17c448701836f51727fb33b9d2461c26dc6e88136826e5b94574c882ecd74aa416fc3060f1b6d3c6ed8e811c6043e6a51fc601f94ef8d6713215a9474dc6492e44ef2f7fa6316c59c2479277912379d541fb228e8269997f9672135ff118b922c2dbaac4b89694c0d8b62123f944e71623ca54baf289caef1d54baf39c9e38a92f4b5d9c39fbe15e5305d1b3fb6748ff25951bcf4dbcb20b6ce04d12a4aa3748ad9ce1faa289ebad04fea93a404db3f52b1ea87e767d5e57dde2c31d58e8a82693e2b496b0e42cfe91405b7d161f4c5cf6ed60f5394f2a49720abdb5214dfce3a56a8dc9157c2a4289fad798a5e358aa28666c9f9197b4e7c5194c4a7bd1216c284f17028b06b79f30eb76dcda0d4e68787133f061405cf8e9f4cf6f4fae9e211e3a138f8f8843b77d9197a1976f6d6b5e349f35629d34e41b08291fff044a98376969c3ad7e84264081f9d28471ba13f2c838bc529abf0c189f2c9ef13199452baf5772b7c6ca21864124d45b54acd896ba270820951929edfbddf9928e6cb2cef7d52a9f7e0b0516304d5c0060fdfc031c20726caa9abdfb6545ba8e72f51ce2ea36ab724f9b044d12e741c9131e8119e57a2e0ddb3b9fa46664d6228510ce6211e476fced99f447964f239a5b49bc68e240a7a469898ff04e541e644a2643a6d6c51564a7cfc2051b292b5d43bfc3c6c924794adcd72dbdebf6b5347b0ba6b15737b5a333bee495a77688c1e9d3dd78862f61ad5b129459b9e8c28761e1d5c464ca8f0b188726c7e2ba542dced7c468c47d98722cafa26d49e52c2665161224afda7a949cfe62b1d4444b1b693a41a4fce25d7fd384459b34f858e312f49bf86287e7febc83a9d6936fc2844c13c4385e91875378608513e61772adf8396e83a085dd7cbd63d65b6bb544cc409a521ff10c469322b6a77a26f1ae7cee0231085eb9c35c63971d4bdfa0188d2998e67bafad424361f7f288ca9ee074e44b5c45e2df6eeee6efdd7fad63c4686b00fe590db645e995f691f3e944dc78611d23bbc89e7c71ecaa79ba5aade41f3a71f7a28ec76724f8d6d755e9287f208557a27da6d8ce14444e43ef050dadc75dae4e9fccea13b147b736a47b17cfbd0dba15432ad6ed0df3f22af03b6fbb519d6e2eab19a693baa5a847a65ea381d8a79319aa7ff842a25660ee54f428cc98cd5f5ba466c071f7228995ce269d8fca2aac238149330ad1a2d933afd1f0eb799ab5ae795e6cb6be97f5f8f8db2ead4ce1bca499c124f857652b29548c7c80808563022f2e186f249371d9b492b4d6e379272e0a30d2535a165a2e98b1c37f0830d6553fa83feed18a9395c838d7378600d6a99c9a859b8ced9e76ab9baf667f6a8c96ea32fbec8e1011d39402022f2458e1b8a231f6a2829f9546463d488f0918662f468ca35a80d2d51c4c3d4f082476c8c0f3494e3652ed1a0f7ebb530c0c0303e202252a3878d1d464484878d4444a441b082911d1f672879f0d4951b1d32c2fc3043f1b46a9fd84b6dd1a532143bdf4eac4296a41eeec207194a8278fe8fb1fdecd63486b2a868c6e8f32c5b6231943e9695eaf2bbd0a7ea8f3094f4a9b9882a3bdf24db4cf80043498f99c6a6ca33a1a11a1f5f38c711ab1a6ffd46c287174aff6d25d867ccd117f22e944a4cc2e4937e3eebe2830b6d6ca8bb6bc6b69b8ac9373a275389b5f2630b65cb4da3935ea893311f5a28e7dfc792eb5ab1b267a1207a564669f0749a3e168a293383babb3019f2fab842b9e4c6be0fe739797bac50beb41d137fbd1bc7ab4249d027474da2f1fbe1f44185b28765ce134f0c99229a422aa7359a769fed31e698f999617a238582fe2c72a2e63a49cd298c1ea607099e870d30320a05a162bb5b644e236ff30185d2d8c9afe9f166827bd6c2a0c0c7130a667aff83a879cf7e72426193a4dc5cd3f69a29694241953071ec3e7a3a7b858c95b9f486d5ac2856e5793631588887575150bef3276891d93cab8a72899b1fa127fe7816a5a21473623eadae938e225494366e8d2e3d41f54f748ab29b0c2f21b39e9c49a628e6933e953695a254920c7ac3d897ac0f290af24689b26daae44e328a92da50a6346e8e284aee25a6acc985a2e095de25758995125094ccf3fb7cccda95fe89e2dce5a60c7d25acf5444149566de7514df6b21325f9e3942489fdb92572a224ba9c248cd62731da4469d6554d8e0f9f369a2867ca16edeb17595d260a9a1ba672a5ef3d4c9493e7d3b06174d09b5da26827768b1225dddc752c51d2d6b8eaf93696872a518e1d3f9a49ff2b27871285510f3e5a367799499484b490c14d4e92d79228e7909f2ff4689df2235132359eccc594a50912e55c25fb7d6c0eda4e1e5110934fbe986afadb11c58f399747cf34a2ac31c77785ce8892ca0d31e14fcb997811253d26897ae762d2ce8a28c60cd576d35baf73220ef51c3f220a9e7af46c7f7eebf80f51f8cdbff119e4dfab6f887292e489d9b1d91dea17a2a4fc64f8f150b2593e210a9a7a5496540ea27c728a09599739882888a209eafb944cff655f20cae96f3fee49920a88c2dedfe547cb2f49f57f289ae8d759c47cda3cf9a1307ac6f39b4eaa7a1f0ada5afda924a9fc3a7c28fc09a125ef3cf5670fc5aca9eb4b7fc8cebc1e0aea6bc4e44f82f76ef25036f17cd6bb31f78f8782feca4e7692c5ec77289975a64fafd359b71dcae1c44a936468ec88eb50d0969e4bbb7583bf7428890ca1fbab574cce1c0a3afa4f0e4ff9e145391494ecfecdc9257140b7893ff14b2a8143614498faa44bf3a92b794371f524f17513f49a927143d94428ddaa3ea73dc8b4a1247d65f39d24069939860d25db1ca5fda21bce63d6503649552ddb94dc496fd450f0244982da9c1354ff260dc58d969ab663d050f0f6d5f8f4934cce983394cd6dd48d4979f2e7c60ce5cb5152d4c93ea2644d194a5a47de8355ff556bc8501c4f826c8ca54a4d3563288838d1d444b51f4d8d18ca256f6e726fc599ce84a118449e6e8a8ea56e33602866bf8dd3cde37196f942c174ed447369905a192f9404ef942668ac93a9d485d2e9c7c99a6469349173a124691719db4aceb069df42f9c492938e9f3b97c8ae856289497aebead194ab67a12474a86d6a6ab73f1d0bc592b3c9399f903143e75728e6ceb1ba634229d1732b947ff4f6ebe309c23caf42b9243177c29e4e85b2858ee177d6d1f7f229945773b6f827eb303a52285f4659d5a4f56a3e51286fa898933aee95ea40a128ea663e64c93ca5e409e53863e3492e8fb927ed849264baef43ca26a14cba09257fcfb1d48427e1c43413cad9329b66bab5ebbc97507c13f4d99c5809452d51d2cb730ca96527a1fc69a3d3efef3d093612cad916fa6fa56f37d84728cc8cca8b9ac919c5364269c43cdcc7d0f6f87511ca3ee25d25c91dfb4144285b9e384194203b4d348482f8b095f27532e9470845afcd3db13e3f674f100a4a368bc9d4014271cdf3e6ecedb531f94141c488766d11b2e4f8a024c23abaf5694ea3e9413163708d2346e5089d0725b13b268941cd08d841f9536398195926879911a08372c8d3b1445b75f9967351b453a2c88ee9d526cab8288c9b341ddfcfcc55be45494ee7b07db2899224d916c50fa77e52c9b5282799348851378d1f322d4a26db1994b693a3733c8b927750dfa9be47c8c6b228cd899d474bdcb3671c8ba25ce82fd59e345bc6b02887ce8aaef92494a9f815e5389ff24cf6db66932b8a6b2645d5c97e133ead28c6111fcb4f8e1d9a6745b94e4bf8e81275f5afa2b8993689e6a6cc645f15c58d35b24b50fa75946c2a8af1f92676972c2a8ab9bfd16374955fc99ea2b8257a3cbdf9e7f4664d51f0134ba8570ba5b3d952144fe69a773613d3334b8ae2de5c6fec51255fed280aa6bfa3e7d920ab8444512a71a34289494251fa3c2ffb41e4aa7b4051d05cf1d19de236fe9f28662c294afecac3f99e28a5f629d9b4e40d53d28992a022e7df6cebf4841305d9951bcb924d14eeb3e7a0a4c66ecd68a2b0de1a42c9daf8419d8972766f965153a25ead9828968939269d7b89925675fa68354d266a89f2c5ac5507d113ebac44f1430773313532fc48895229318358e8123d8b9328c6894c133beb9dcca9244aa1047526079947b6d34894cf6f93bc322a6d94206152324d8eb7a54714f4e89bab9cb499458e28f528b1aebf11c5116a72b264da0d278c2897f02693d825f4a4c9224a3a42ed84ce33aa4a1451ea30debf493c112535361a633e349e3822ca1a4a8f77783da9f3214aa2e724c6cfd431969b862868f934de692ccbd72c44d13508f15222444990ba7f5ed2ad8d832895983d99f6b5e42d0551bcd31c84d0e2222f0c44498ad15b82d83cee5f02a238a769e3f866924efe50d824d3a62cd946dfe487c29698c40f22d487a26a5dc9569f0f25ad1dc4881e65e59a3d9444aa78d4580fc5db934c8c2668d4681e0a566292c4a084c99e7828e6af9027c62426e13b9443c9b95d6b3b144d6cb80e0531c24f907d9252e24c875259495692245a49329e43f1d4c878b1b9abff4539945debb64c8e273b22c601f70ef3194b877028698a911aaece44eff00de56c92982488d6144a0add50ce1b731abc36ed2d6c4349747e98ce7b8a1ab1a1dcd1ca5cb7449317ada1e4513d6c3a995343319b20eae41b37b1a14b43b92ee663ac57367d0e0dc524644b2e71943c267f672889398eddfb09ba993f3314ed5ef4577eb8ccfc95a164d2959c6c0c3bef1f190a3a94649224fb1b4341f36ecc5e94eb29393194a430cd2787e50976726128767ab97d0c4a6d4e0e0ce5f3a083d666fc9225f785a249ad79ed6ed36dcc79a120dfdceca4c80fb2b92e143f3bea78d2fd30f671a130abaf49062ff9efbc2d94c44c09ba3acc3e97a78592922b971eb56b4d765928f52941544f899975c2424988df39733bd71f5da11ce5326f9ccbb81e59a19c4f9263ebb1e4309f2a14c3acc4097ac54b75a8507aff113bd9e451ea9f42a9a348d592c9c37e2f8582eb98c90d9928144ef49854bf29e9631c0aa5eb78214bcce0b6e927146db40455ea259b64cd09a5cd4e6265975a4fa735a1b8396b996019725734261453e9eb58d2b33e88b684d2e90fd7f63c3298cc9450ecf10b254644e78959128a75231a93c96c599921a17caa6badfb2234a7ec08e51c4bfc9a654628084bd1a23fe6fb7d8a504c92fa78e79d45280f114ae2a34a8dee3dfbce104a4a49f326bb6e09a617424970934da9d33362324128fd5cd606371ba1314028a6fc683a96499356ff4131bb279deb74bec6f601dea635ee9df4a058923659e6266b19f3a09cc104fb78936b4fbb8333c975bd3e0fa08392a8956a32c1d48b72510ca23786f71bb517e2a2f07a9294d9e1f9d7dda2e4a2b724c94743946c5190e9a251dc939096d5a2ac217346d3c9617b5a1434bc7437e80ea7cfa2acdadbd9a40b441605a14bd2495989314b8c4561c564b55f8f9ded1e16c5183265d3b7cc6d4b90579444cd249d92e14ec90fcf00c415c55872af66a79972cd405a511267926eab779b750d8415a59313d74a4e69cfa6045945d93607f5d920a7846c6bb0e1d9d8d12355519026aefac9e527b9a36ca928c8b5d5d1291e77b3e5818a82aa0e4a7ed0f9298a39e7dd4b36379337eb4c51129d63e4ed9aaa65598aa289f341582871c4bf4f8a82cfeae8f3b4e1791a4551b6d475099a49ae154551cca044b9b8fc1d113094409904eeea1a0081068c71a3478d2f6ce0904089f08ad803be078f307614200063241238080100e8c1238c11102000e80b13c61738cc8d1902e0b1037d1827c70e1d1f26484102bce061438741c01800e0c123112180004c0f73440a1000d3c39c1c3b44640060000cf8d88162f0a6078f9191040020000b9081367a8861e3843132f2412310c53bdb7c721ef59175d6e03e0be30c0cb463440c1b67e4a01ad870eb81c386086800a2a05d3ba9faf87f35fea1a4bb64ea48198f73bb1f8af325de736ace8fb90fe5ddd4ce9ca3bed39e6ab02d18080ce481c3468f1d4a830f68a3c78d1a3cccc8c8078d3da08d1e37c200636464060d3d2031728001060243068d3cf4403cf0a0038c3ba08d1e3b6af0b83132f241c30e63e87830101806a05187927f7cf6e9a957ddde79e8c8315234e850aa15a544479cbac8550387b9e1053a3940d048630ee5689fa4d3ccdb3ca6af717228da892da54469d9ba48230e6568ac88e6e69d9c58ee69170d389452338a524a3489814620222206dae16f28cc7c4e52e78b4c4a29b1a5e186e2c61cf4f7c49862736ab10b2f3ce0000c8cc0016a8ca0d1063f45e642decbdc55dfb5d484fecc5f1efa3e1b4a3aa97d3741e6da4c138d351437b3062bff4d4a0e131868a8a19c314abad349b4a70ee1c0008e34c2230da51825f719e7e4b41e1ce686393494373d9c5232499ee1a61a6c3ad270d03843f1839d4e9eac3d682b211a66286ac93bb2840926a56c6ec08046194ae2e4a45c3d7577cce6d081090d3294b34f3a1d32c73be47c24863f8d3114d36e9247732739abb335d87480f1787684800734c450b43c61ae4419a0432720038d30944c7cfa7a5091feb9f3004341a869fcd35ed2f842e14cb20ad5a5be7465396878a114ab9ed27e55b541a30b659383cc6d7ef5d873e1c8010618391e6d070d2e147475ec97caf51c255c83ad078d2d944c575fc8606659f5c9f1366e90000422226946430b45df98d2dbe458af399b5c200734b2506e3761ce662c554fc74251a4c82869ebe4244d8e88881781c6154a7ff25193ea2621b7e3f5041a562827e93bad7ac74cd26eaa5058ff9349ca14a2c2725fd66db5693aa73756a133b7a7bceb0be9148ae984d1317d51ab67f58086148af149e9a73db17e9945a11c8490f3a984126a4e9c0614ca257d57bf9f6425eba5f184d2272f59468941b6e4db09e59837ca6952aeef69d484723aa549b3da8ba57d6830a17cba22b44d6d28391f1a4b70abe4dd34e4b2e4be66ec3ce638dfb99f1d57423135748550257bfef1348146124a36eba7fa47db6fcca18184929a243ee7742a636aa840e308a5f8905f9a7489d598a4065b32e886e9a06184d2a6f712279b4d94d9048146114a1a5b3242bd043113d2204231289bbfedfc2daed31842b9ba7a53c91099c3ad3c6808a138429b1215930f42c1c4cf2aba31ab647d4028bb6bce971f73d02429fda054255b952453e89ba0a6e1835bbdc2b4f3bce374e6279127631a0da61e94d4a5c931f26368f0a0d45d9db7caee6abbfbfabc99c60e4a92e7e73731efe8f8785d8e846303e7868d1a5d7817347450d097d3723aadb9e0b452ee6b3c634cac5e7dcc94da7c770e2e0af7f5d9f4d7cb6751e5f52d0afb414eecccaa318ac91625cf574a37b8966461528bd2f79fd4fa1dcd93f1105a14746ee8d6eeccf4981ad9912367518e31291f696ee2c493248b926a0f224f4ea56abf21b12847353929b5d6a4c4a4c2a29c9963e9d5faec6c7d0db61da8070ef48ad2b5df9d5a955c51ba2d1943acc427a415c5dc9ae424a47629a9b4ac286fbafa187dbd63164d2721ab28c9a5840f8d994397f45451365d4a49a239fb67f3262415c55371ba9fe9d1d62c1d094145c9b5b6d2947f8a62c7e073b3ee97736d0b424c518c27ad99564bd167b5cbee89ba85ac6ce9f9cf3f415f9c4c57879002b9f224546c10560f42465152fd5f529fa6ba865644a47c10228a92992939e6aa0c52ad148ae2c6e88961234e1ad30e54630666750801c51d9625094feef2567e026127e9d9f6d829251e396e3c9b7aa21ce797fa274b26213f9d28e7edaaecbf1c25f6a817c209d76e465cac3267c553b563be8fdd68725aa54d9463fe83903f32a749d44449b74473aae9433251f46c6e926d892749c42198f0c443c5de3e2f6f365f7457b47e4e9bede2147289c2e7c674155ad6fb7288254a4a69cc316a6693b4145289825f2729633f23c79450a2a057ebcc45fac9596321932867d3bb54f5caccbedb36ab7b50d2ba799d1e2289728d98ceebea72f2e42351b89d4d5a52a6205112f426d512647dfc983fa260a124ed9be7ab1b5b4714fcf5641859615dc21ad2888227f9353b7dc488923c1d3cf389a24ace7c11651bfd3ef32345261dde268428a21c8397246e335567d744946c4c5d7777d2a2a685f101248420a2204bdcac8c61cf37af38d00d3b0d841ca2fc7126bba89d1e53df0b420c512e0d666627a8cf2f18a8878d9131709819201c233b728c18a2b120a41067a655e8ce6ce6c7abcbf9c7a03b4688c265952ecf2eba6dd31540eb4103845d840cc2d1dbb46dcfb7d6aecbea10dff9cbc43b498b2182289fcf56a6796bf59a2181288ac941ada8bab0ee0f208a6e7a72cc1874186fd31f8a3a3aba6958eb8792f031976c62361d0f3d4910d28782ee94773afe53d477217c28c9eba52f676bb429d1903d149314e16eaea7b63173c39ce01c11a28782da378da1a49d6cf2a9c123e80b1c66c7992d42f25092cf7aa21e6b57b447878e30f0504c3a7375d64e5a739677a019e4b8317270d848770ee8c20c217728096a37afe6b5e6f8db0e25cb6c7296bf35a40e25d9d253bc3a86f03303f088103a943649728f8c99f3772a9943b1049d27299f93e4ab56834d8c18f45622440e859d9b8d5f62cc244c3e0e25cfdc6c26ee630cbfd76013230623c9a01b23691dd03b44081c4a4ac9399a12934c52e1bfa1602688fa9841c499ec20cd11e286e26aac5262df099becd3869290419574bafb3cf4afc136621783103694caa48c7582fcee60ea35144d6e3bc91ee5e34d216a28c963751dc264eb7c280dc51cddf3c46c8baa6f18d483c7480c6e8491a87d81c3861f3a3970241a0aaa84f794b14776687f86f2a68d4dc2f68919cae326650cfaa40c057b997591a574b9ee6428edefdec97f253dd718328672d81ffd23b44f36c74021440ce5aaf07472893aeda60f4306c884218312128682fe57676ad390ed7108184a1d3bc746d59c9c73ce08fc0b25ad592d6f4b30494dce23c40ba5def88fd1fbb511d28562e9eae97e53213abc5883102e144f6e4b991825ba97921b846ca174c2aaab070f2ab745374c097810a285b279464d626adb707250da20240ba5f1a4e47e10e58861a1a09387b330d9903fda2b94e4cfb1e4124a74500f59a1686352c8ee95130f9e2a9445e76cea923ccd9a9c21840a0525bc7d3013fc7d747e0a05558d7a7e3283ead743a4505e8f19d3b6c57bd0180a42a250f8f4197e6fa659b68740a17c92f81a1c843ca120a2ae2753db08878d649d502ed14ae56f67439a5090ff7a1e6646288409a51efd6127cfc674721fb28462ace8d29d64b4ce647d11a2044ecf45be5e46774d3d344dd84ef2aae770926edc8e119284829a06ed395a8cfa09938007085630124608125acf56790d4a4578048352ba5ecd7c2e4f1c214648ff0757ed2842561d2145d0da72e534df5bbceb653663a91953a2cb5d7560104284f27f2639e78efb108a63eba3ece315423954493a223e56b99c4128e86e6f93538692326f21402865a9e9cca6b33f288a6a92f1bc561f14847cfae814eed66ef6e054734d5bbb8fafcdf2aa0f258fff2809e141797348d58cf77b2794427650ea3aa573497527aa93427450f2dbd2b1aaf3e6dda45c14e6ae4d849a8f703de1a29874927a93f5a5989e6e518e9ae7bb83acefb7932dca1e73d0595aa6c4b5532d8a314df692e25f4fdf448ba27a1091bf13937b4db32849b531a6979ce4d134c9a218175af5658a453946935a4388127f618245d13b08572b75535d7a45317b5a8fb1d13b4f125794b73b4686d11e346b5a510289d3a8840dc502b240180e07438170200c0ca5ec5701d3130000100c208d8562a15040260eed04140003403c2e4832221c241e12161216108a040161180c060502613018100806038150385c17e9503e35be50f85f69ef730cf471c3438f2bc53b110f2113c1e17eb6a920c3571fd71873fddf48d5dca8a08abb624327ba6f7985eb70fbd43ad53127da3a7b38d3efce7eebdf59bf4a26e77112a8fb4e1f9c7c3149cb3efdbbc0919afaa1cf6f3ec6edeb01c7404e7724be93a09807cbd1578d6802fba2b0bde0a970542367fe818adde8b4ee80c46162c9519fed55cc46ee47c089519c1a37530dae628c11ae86bb15a34b296b092dceaf0c0bf8381ed246c47d20071622f908317e51f36960e500c2814f2f4ee1dda8aca4519abed106afd600db410b523a411a9af14df15e51093c75d87347da1a18ea7716704cc8e9a6444a5302f7cbc3c24693ec558bf81d0445d46fbde5d9f516331b9116f3ab24ed849822578d3a86146ac4bef9d55c076f5f29825de658ee383ebda45e459a5bbded60057ab09b77be532ea88f640f952ab66cc4a60cac7b6dab130b4223f7ea5fcecc2855f06d517e9e0839c2730b8361c21cc9c5131da3980be2d34e67b92f59a82d26ea2a29c4397346e6281670fcfa5fb507d4134cdb32cb101dfc40ff332cabe11937687cfd01c78281c7d704bc5a05d18cd527d909d2a0f017ec2f305e89dfaf88dd33e00e59ec635c9c72b203a14756af03afc7c42808bf60558699358ed60d034e6a5dfc9091df434697f0680f32bce6cf5c682a4874d12ded363968278418f76393caa6803d600c25e6e55e5f5d1b0e535066e7a2d137b9ba444ff9918669bef70080a46ffaf8e960949ace8c8807abb72502175e374bac3929ff5ee705c01babe519dc23212351c656aa5a09448ceebf020c8a1756905c25c8fc30b3ba5a9343424b8997f4ebc84af78bd08f17d9e0d3c2498d3c040b9b35ce1a38348a8e571aca7a851872bdb9c9ac0701bde4950f01a176114da18c4202978858dbae87d8dfbbfb80bb6a6bd14092b3b771f743d55c13acc1df2b654543365cf85c76b9e8b0fb0b2ee8635ee99b00db9d9dfc3d1e27dc477adc12b448f2730a68806520ec6d78f6a6f591358da1d1e65425515efbf6880bae8f6fcf9b359d85be20b0a72eff728308d96a043d717ef261ef2a7b3661719a4b675c960374e3913048ae5226a5a69c57893268e4d625cb7267ce2af3e61b1fe9e7894ffcc960b2b1abc5089a75c82c97f7e2b520d87cb80946e2d61773bf345a6a3983a9667cf7e468c1443f43e227f44594a9c2231b4c520be9d409d53d3738707673e7be84cf000df058ea200828b76c3c05d28c119f4148938242af0aeb00c683400bf090065aa6704ef6b87d636a5c10d11ddaf35fe17864d6e4f2f33813090030e9c1a3f395fa95fafca078139b5a855045f1719688e2c9e21b3e35f786dab2b3d6ff952aad166284fbf2e57d901246b30e0d4ddad2cb2ae1cafa2914a9e91054e97e4b0787099b8c0aaf2b036e24e4ecb133fd32a9b3953a546e9b5b74c7ac952ce8705b55e560dac8426f6bbf8a228490b7f7e22704da60d9905a40dab672876abd88180f2a2c336c0ee9b837df05f068f56a0d8b98992b4519117bfa5983d46c86dc178bc239e9b7399c9beef0b504629dec12912de2fec151be2200b1f2e94500e2049a4a67a1515d45c34f4129b1fe2e264eaf78dfab04bd0a5498139a2a67e13c6b3339d7b97d9a33cf62f5163f5848ffc8ce8e28b365e500c4897695d0e21a83f85a63aa220235c7fbc0aca756d922cdb1d2c959070d84d7a6d8a64f6ddc7a46ad7eda16d68d428f3a8520ea1d132b80e9219ccbce4691d05f1a8a769d5b8417239eacb9c21ede8c3e25df2b06251af858a4867cb95021d179e0da8470418cb24441191c143692e0149cf04cc5439448d0e293c212444a05cc54c84053d224ff30ca64e7167e2330a021734d1e49cfe20804a2c204e46028d45d178e5aeeea65328719bf3bd1b7a387da014597adbfaae0c237d4a70eeac73f180e2676158cc211b9caa34cfcbd43a0916efa40e70b7b2a89e5e9ae6433ec5775b82391ae9374e8041f2152fd91b19ef53fee2a1ced261eaab98fcb8f802da2d0917ca00642e6d1e1ec2703c065402fd53de5268580f4bb9ecdf02968067f79b382fb31330e565e9a8c58c17a48b7aae0aa6e35b1058ed18fd0f485f347792a9bf5e75ab5312796afc6b211fdf53460e5fcb71f8e5ef443550e093b0ed826a28a2e0b23ad225d2ce0e5c210d6e66a52b716d60d1646d2bb027ce4eb1f0c55695d6e5ce81da8b3afd603ca75f18ebeb699c170501800784480c602d7d658ee80f0209037b290fb00f0345425d40cb600c4127ebd6c67909f209574b7ab43d6cddd0058a654dee8ae4a607b9fc4be39f918fd141b83ae399128485f926abc01290c3173f8eb2ef6865518b489e274a292f07276888439851de48b0cfaf028ec3bef77f1bc91e15da264bf81b2271681dde3f19474179b584f304e4dabaef22801572d7c628b155e3be03c573934b85ab4021b64cc3bacb9cbc68878007a75c523d5c8d09ee86262077ad876509cf2264ac7f8d96e1911461b50b150752e4e35408554fc790d67644da911494fd56eee66c444219a8ba928ea8f77c196140ea159b8bf77b5c905da67a447440f1a7ca21c045308a67e78f4f0cbb559c99f6afbe9e21921efe7e6c69cc33f8dc3fa705bf75ce585ef34ea126d1541cde6ce1e9606c518424212c4ca853b6d47439c9c39135f589c3644968a1bfef65bf540095258887a0f40fb9bc887f1b4e33551e61ccb93e3ed343ef344fb6ef5dcc78b60afa7399d33e50596147d6c2b308ea461e97c30e690624d1270a5b3119368c4693ee3a1133dc508860a8aa132d56d5ddd583d0b4f5b05f7701fbb0b7f9ccbb13aa52960d5cfb075850ef9eead3f1a9af20cbff1cd593d768c97f05ac5d45ccee37bd4860fc9678c51669c15aa860bb11ccc9c51962c3b5a19a9dcf88b94f3b18fc004fe0417e2f51c9133a3efab3929a90576c25204c144892aa0234bdf827d26a7f71661284567309389f524e0cbb70c189929d7e7922d7f56802967e9a24649b5c303de2568d185c4e8431aca509cc85b3d06ee21201a33938d72a8211802139568294e30aab0582aa29e8228a76c0aa9d451b2bd65da795a28ecc7fe620e63f194a702153425db61237665f3c42172ca137ec5baf88b70856466cc80ffa174200d93788e60a75cd919fbf428999078a9a3f2499e373781a3002a29973882232062aa2c077bb1afeee256b1889eb3b8608c842502c108412457185f2ba5d308ccdb7efa17e17a8e30dc876d68baeb9ff6495ba5d28e1375809ee4fc9fc1e5bcc820885894b988e5a657f87d39dac7e0c28aedbcad837fd4809939a56b69ff361dd648295e153de98683149174d21dded888e40c3ca71cb2cf5c1c166960ed84ed45937d445a35bc10ad1159c900aab8fc5b729199592799444219ccc5193fdf82a9296abd656fb62cb564435c0a73d493d13ba6dac19303599440006213f5ac804e358c8e11ed089d1e74203b6dc84f710a27dac2709023e78a0fd615bb1a1dc44107f3ddb3baf1961204e5a840016a531e5584044d374a52af25ecf65dcea35c9a0b7cfd5786612bcd366f9e5b8fc453dee29ceea9f427c391b130496cb9b03051995e19acfac84fb02064ded207644844ad90b7edb3b3b704174547e475b02f9a1154fba098f1f3890ca7e7467cb79e5426c029a1a66969d3e9c778869e1ce752033aab3c547be98a90cceceab561c17f4a83e81d215c1a5e1260280599a606f2786a281959606244063354433f2b01774ca0a9d16e254c109031ade29e6915c4e8627722ad2a21c442f0a782b5a510ac620e4aa12ba5dc794c110cf08bb4546a4ea15966aab3d5b2af0d7097e48530847026c678a00458f804daa883c06b3e5b26baf8b1872876c59af5ca32e84ae4be674edca58ab8cc7c5298489bdfa9cfa23844124ebcb2a11dd1759ef05b84ede1aec62b5c0e160750bd0d2cfb00ba7d5986c8f87fc72ceccd107dbf8803063776afeb62a7eedab2bb4e9d40caf11df766d5d8065f350db0dc239b81bdd91868e4334c459937197bb493705ebb337d8c157a89bf14365b4be56b23c98c8bc1a915a814ea4ffc2512ece5a6de8bc060cb56a747f12b9aadb5c6d5db4487d0ca0f49f0980fee2479ae466360fa7ca40f45fec6e9d324ba84dac055a78b976a3e89a6ab59c5d5e592c3a22cbbf9d68989c4e5b3ae4d3f025d6867bf9147e0b9fc226d95e21ef23bc0327462ae09914d2cac30cbc0fa500d83512d3673f25580f857e91267f58aca521b60b9e602f75fb3ddd658264f4f9d5b9740c09d1243afd1ca98670e9376220b154b9944d74ca4cbae2aeff81e03b503eeb853bf596bceb180c18857f1adedb4920c371918fa25481bc9dfd4b3c6b03912c427b594e271f9bcd0ecaaadf5e5acdb1fedeb2ab4a7a87e618e1ff39a64a350daf29c89de52845c4bf65e452b1de8462877da7b04ea9a37956ad20fe757e9705556fc0ceb97f9d241721b16e675b608b2c1f4ec6d96bb23905121a430312f45c2b1787bccdaf481cb1837aa34a83e6f95919031b0dd07e36113caa53706ab94db504d5bfc06ea93c4210ba04d7d6801dffdb90763d730619e61c64cc3b2504cadfd343de8c2bed2ed4cad815a1c1a2baf7ea123c16457e4c0fa29e7fc498a8d78e5c4638c9b384e518c8f2826bd68470248257a87e5183d964b8502c64f5d14d3f0121d3f2217b6c5bbb4c4114788a449af12132c2530c252ae57c69460a00ad0fa6b8814c126a5c3cf303493515980b31775f449b6dc52d6957fd623b41d33decc329894cd759df1a41e8766bfe3ec7cbf085e59c8921beaa1c90e9bae328b0889daf06b60b1b587a24d3b5a9020898b10c2027395d0513edc55508fbd54c2788771ac93cd4052e4fe1c3554c3b92efb6785fb2c2e2b12eb78d70e6448820d3f7847c3a30f958f8e112ae5ab4f218653f5439eba8922c83db91e84b3274e8768d07f92bd5bac2c3a42f6719b686df38a0c1e42b5ec425207aa14e44868546e59364bb5e66c065c4ccf39f7fb2078706a580ad071dd435cc0c968ce3411108626e02d35753cb1ecda381219e9f5fc678a888208105d01c4a9071629df46bb926d8f93ca035cb4a59208441ec6503a583667f52c20ba8f27c1a92676b3afb4a9bb52c83298c51162c785b8c0852e462f05a804324a59d60fb48b99ab74a75406977aca93a8316ad16196e8295e408003d982795d16c934d043bf00a404c002d083fc5c8ec393a6e37d46f62824b813e2748a8fcf30ddd11058827a89334992af131d9c285e0e11668551a431d440dd07d0f21be4f758f0fb921612dfe030f4576131e87b5cc86e53805486b5df918ba93ba1cb1733edc5cde2f0801a41566641caf9ea2bb9bbf8efc0f003384915a70a4e25a7a15accd3d34a63890686acdefdee8d9069074c449ed2f636e71a1dd1e4d2c055e932c86c245dec7be85c3ca36400808304771223b72b793b0493bb157399a50b21c9d42846e59a44084dd35fe0aaf755913ac4ea2e3616626996b630a2db56011afc6add520fb3c8243400181ea9bb225c8929ae33b3b28e79c08b90ed59e871383bebec4c11521c6b97525c02842aa569acdb3ca28b2a68cc427682193256841b1cc71c1769d50f963be22410d881fd01e8c3d57b57cbab6785a059998b636b335eda177722160f0897045f007514a3edf9f6620a3753b328c67b729000578beb297f3d0b9c1ca936680aac330a4a5082860ff64cad4aa7bea9ac0e6c4c70a5e96eef53d4bf567349518f2d010a4c0cdba6e19265ebec3ce49f8741613a8b0c472be98f5c8b17e6ba3a7b4659b149822367424f2e4a2c605039b48f6b679ba2d021dd17f25d5a27706244843b85d89768e36769e9ad657e72550e842cd309465544472a786754273de6f99c06f0460718a8af333dec7b006aa49aa4e70ae7c0c645ce3a1c32eee4b5d14693c42ecfed6b256dc403a774393b8fc56d47d07eec028849ea8248fb2aea99d88dbb791f74aa3e30216bbd3d57041544792a3d6a3c216702990d235521b60d02b7ebfb23744ee3a7c38c188519492333de15417c61180892f2cce94290057e0c1cadac36debd5c9fceee98dab6f370cc3084b46e0b246c9993a19e0d257759b3b7d2b7ee586f3a29683ce693a8342ed3907dfb6ab4fad45e4ae1b4ea584f06709952d0c6441d5ec6a1368bf845156893d6cb2a3046f9020244835b82ee7b68402c728d22111dec0b23205bc23b2c9848ca42dbad52bde28123399552339faee231ac954801a01ca00cc1359333aad3f22657cd49860ce3f34a616a35c5892b14757549aa77bfb04f0b45e030d81ceaa9ecaa6fde7e7de1df5ba0099914629c9397c74e81097eee95539bc5d1c2bbe58b32b2f16c20399bf70fd685690787f14df7f6d02651e182b7120b55742b05bcf9f93f5229396525236b04c7c3391cda3ebc393d8d28927e222b2bbc71dbe03cfdcb867a2017cb7e167484cb8c1864d9c680dc48db514422410203c00fb91250f0169e3ad1491383e4a551ae0304fe78c1e6d129d44cce1c47f833539e20ee4f61bf5d08fd33c4e80881a6cee313c2c75127382953c1e9418cd03a1b446ebd19fe84732230e4e8cb3b06b92192136fdd65354846f885d12d107a81d0696b49d2a483097559b588c81628b4e412164b21056d988cf5719f65dcf80a186ffad9c7344be22de203e9b87560317f867147ff9ace1ef8a33249e0a92a43946dfd98fdf57581558840b9455c27e79df60d4db38cc129ab6ed71bf563bff53c6e83604c7afd769c8f4b8920a594162cb18043b24753fd6b336c4eaad23d9954664b1e5ff7df9f8f04de71531ace26e07c06cac6f1c88a1823326d4359df5598a4c333f8a5216ced16a5c0f56f5ce00c4aaaea781f62822c924d3d53330c81f205649c97c28e67e911d909d7459c38b4c7bf795f116f4334e6e0fb6bb7451b874ee54ff1201067f88c60967d68045ac416008b32c229830d8a8945b7b0317bb51008c6890e271f98c4923fda27c299820f7c58899142770c20108b249d84df246aba36b0cfe42142566bce7c56fd122b5edef56ba34889bac8f10dc87ae1b80a2e9c4fbbb841f3e212410e6a39b29d7abe701cf8032533dea13d48aae117bc4da8164a0446c8d589d1c1bf71846faf7128dcd240a7bd86c8cd6fc6cfabdc101caab3c012897aca2b064d88617158e74d86eb89a94b3a530210fa131d705a6a400aed3e6ea51f9d85e3c2c4cebca3ae6816acfee8d39d682951091b1ab77e9673a566c1f3178a54fa68b180303f062aa79987b34313df969a4ed124aacd8f640c8f6ba9561a57b2369e16c709b4e2f0d2b2165f08210e8c2e1bf48284cc165bc92ab2cb4ce9ae3d9fe2920245245790d53b47857888d7d436423ed7a384556c9492f8b9cb73f3a20c81d145a41b370f5556b4ee3a90adbab00fef7dc28d8766ede2ae26a82693a89ceb16ec484eed0ce646089c07b99e35621bfcbfa10f1a43a3f4a846d0eb1038318dad5753be77cd56011b0874696891e2c96a8d6c50ec6b55ccfdb5a3b59d219dd88119309466a88f9877edbfafaecd04b66651965d9340abc4402c2eb39b6afaa87ff445812b4917b2d1dabd3241e3f28661fb75b39baa6a8f2dbe91f719b151e893769e317092bb237d260e785a582226263ee5c82e4888e21665c5fe015ef32389212177ec30a5b9a9086f160ca8f62bc33527c99d5a508a9445d0b949cd601154d7d95c1b4e35871028163a525f906785c86591f9532ede8c51dff902c25d8f6e0bee1628da7a4cbaa4c3c879e3f878adc213fdf6ed5beae8345332fe512c0eb3ad381b6e02118b0cb1b33f9a9f7c894b3862a0566250e46181224d3e43e4208206b25d53991e6155af2b8f57bf629135cbdc73e3910e21cc05981344232aa3a53ce4d568cbf82f661ad1a3553ac1de77fb626760061d459f0572531e22a4f91b1d4b282bc88941d4eb6f0fdf88307a9092ebc6eb859ae7c3a56e2dfc6eb92c430fe98ae5a8a72f0ba6b118918a00fceae5d2d1f937415b8346364f8ac7abbb7f1b30bb60c01f4069b4132199258d81171e4c97e8696f4b20a724cf4466169ad8295da61dadcbe9d96349b090591946024b227aca47ad2e5fe8c35b71b3da498b4caab0912e9ae16e92e6894fb3b5691acd928ca22ac8111db681445a951ddc2a5c91cecc1fbad037d0781063daa2161f0b28bc077401071d41460d897c22229ab0894bb104a21a655148d154512c15ac860b59e932a3713f22aa95bf30f15b4e2c7f5175ca018b22a2e6734e3d621522274482de06522200ecd73d0b2809b71a120059890563ce95d3e603802cd47993ca6c536be99252d9f0751866a007c57a188a86c1a8c35d7b84882119c1d9ea5142ca3925edf490d0bb9db176525a0ca7074f7acea50bb0e67aa3ea03c687fa694f813c0298a8336d79278a211b2a1f959e9b6adff11ca89049e6c838af7b1d932181edf425f1eaf92a172edd6669eb6eb0576f52f32654a4538cd77abbe39551846eeed1afd57a8d650e2872edbe8b723da855e110b3da98e3e7817082ce61d7bd280f73bbfc36baead4804496ececdb2d9f4ea674fb42adb932c03862a1d684889d94a06c80f2a4a1ecb030411ab4227111a30eff1feafe0d0343221862625b2992db52dda9843ef88c50d37a55762a75b27c2f700d8c7c75740982fc157532759ac20b00cef8f9381e7460f94caabeb6e7c0cc7570be87e5061ced162bac4fe36900f80ca29fd7bcaf2359d824f5c6e1da4a0785022187cf2b82eb93326a34135c08f5df4f57f2b119071d1013f3c8b79bef88fb7c227a688dd4f1c263f7b72ca9a2f02ec856818dddb686ac54a731b88c899b54243b24568b9ac6400edbc60843cab0d432ea1f82ae64fc49ec483dee824b9ac0f5b9b1fa91e28b3b5cf89cfd3fa23d2cbe28a0b631e0c845de875a4e5d14fb846030d9b901e412a18ced8ad5f548423a965d9f480b0aa9df0ca3a16b30cf21d0c72a6f6893e7d75df5cb030f0f2c101e568668913b5dcd7580dea5328b2b097b2bbd0e4bf014211b5e12eec23c7a22be52496b9751f8c457973054a984c887e0a94d68a1c4ef6d8be7b382be9a3aef6d96040b3b4ed87d59dd3b4fce8d81e540185ee2163d7aebb92e6896e071d8c1b732770ed671f2f1f53d0dcd42f0caceec8b7a150f642e14e1b1b4c8fae51a6a6af7abdb9982300ce4066eea4359bbc679eb0e397e4fe01621be01ca810274d637bf204d4af8b93cd3cef6b1065f57bde8ee23f6f4e3e64ac7244d189c4037c7dbd77d967993d7774fc4111432e55b852ec4d01e681f0aea0f52f6c373234cdb29b289a010cb018bf34a94eaad43864ab81d390d8d6da85d0aec319e8bc2b30035345128daeaebfe2ba43481ae7b4b3024b6e6d7118d5061990c041998926cb3ee05195c9614e6718e5e5d897e0b8981417267ae50aa2f603376ffc0f13e85974665758429010c17acc61d0ea0a40d2dc70186288ff09b5b17beb5d4c4b7ed879086b924552b436608cd61ff65df19b85a8f32de5008370313e10487b56a605ba3cac4b7c81f2d80828d020de501cd1fc582568fd64623476b6fe8895d0cd25dd3e4aeaa5e37dcca58e1ec0c7964ee9f781e2e2827a8a0f07b35a076b4d05ebbcb213871f44bf897665f2a0c15367ddac79e6811c42af0d8ec6b375a6fd5a529b8c622fabd679bf3ae0993073a309703b48ce2dc39ba6cdc802101caf1c58a289b04bb7b0815b96f505a1e31946278f55ebe1237d2f693bf4003e7bee169504fb30f808a59d4b5174cfda7aa2b5e448477aaab3bddc87320f451bc0833b0b30d569028c3e13b49e7a6c70324a931efee219babb04b13", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0xae2f5cafcc1a57aac6a0e51fb2a269b74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000c00000000000000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/zombienet/tests/0007-warp-sync-relaychain-spec.json b/cumulus/zombienet/tests/0007-warp-sync-relaychain-spec.json deleted file mode 100644 index ab871f72d37e..000000000000 --- a/cumulus/zombienet/tests/0007-warp-sync-relaychain-spec.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "name": "Rococo Local Testnet", - "id": "rococo_local_testnet", - "chainType": "Local", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/63035/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm" - ], - "telemetryEndpoints": null, - "protocolId": "dot", - "properties": null, - "forkBlocks": null, - "badBlocks": null, - "lightSyncState": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x0595267586b57744927884f519eb81014e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x06de3d8a54d27e44a9d5ce189618f22d4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385": "0x0000300000800000080000000000100000c800000500000005000000020000000200000000005000000010000700e876481702004001040000000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000400000000001000b00400000000000000000000140000000400000004000000000000000101000000000600000064000000c800000002000000190000000000000002000000020000000700c817a80402004001000200000005000000", - "0x084e7f70a295a190e2e33fd3f8cdfcc24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x08c41974a97dbf15cfbec28365bea2da4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x08c41974a97dbf15cfbec28365bea2da5e0621c4869aa60c02be9adcc98a0d1d": "0x0c020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f270389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", - "0x08c41974a97dbf15cfbec28365bea2da8f05bccc2f70ec66a32999c5761156be": "0x0000000000000000", - "0x08c41974a97dbf15cfbec28365bea2daaacf00b9b41fda7a9268821c2a2b3e4c": "0x0c020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f270389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", - "0x1405f2411d0af5a7ff397e7c9dc68d194e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x1405f2411d0af5a7ff397e7c9dc68d196323ae84c43568be0d1394d5d0d522c4": "0x03000000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x196e027349017067f9eb56e2c4d9ded54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48010000000000000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220100000000000000", - "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", - "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48010000000000000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220100000000000000", - "0x1cb6f36e027abb2091cfb5110ab5087fdc6b171b77304263c292cc3ea5ed31ef": "0x0100000000000000040000000000000002", - "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", - "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x00000000010000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000055a0fc01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x00000000010000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x00000000010000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x699218726f636f636f", - "0x2762c81376aaa894b6f64c67e58cc6504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", - "0x2c5de123c468aef7f3ac2ab3a76f87ce4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x2f85f1e1378cb2d7b83adbaf0b5869c24e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x2f85f1e1378cb2d7b83adbaf0b5869c2ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", - "0x3195e99b3353c0f2dd3f53c10740793a4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x3195e99b3353c0f2dd3f53c10740793a57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", - "0x31a3a2ce3603138b8b352e8f192ca55a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x39e295d143ed41353167609a3d816584": "0x0a000000", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c54e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c5ba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd005894f804ae5fc66e14552010ab9a0ec117fa6058596ebc671fe7774ed143107932f0c4b28cbc70d5a0785d72e5469c084b32f9ffa5a6732fe618bc1b54fc473b9c38549e6e1dadfec5885caec5f28cfd521fefe36f6b7bb735b9b79429c9145316f512cb13deaaede3df3f9fdb677a0d16991234e1688af232e818f0b87dda3f163dd641c2e3bbb3f61945f8f6196122b4cf7cff9df6e9ae7fd83e7c438ae3fabbfaa769ae73fdb97dba3b8270fd3df971ff841ee3d93e41fdf25dedd3efcffdc31ef319c30dfb1a267fbed79ffc4f3ef70fd3f8bfa8cb2fc17e068df4cf2fa17f7eedd37ceb323c6e8f9f754669bbcdf287906f4bb72b6d3ffeb128670883fcf98ed2d6976f4b50575ef9127c8094e1b21da56d3e8b51e6e59fe291d6e5779179c838ffa684d59d56a875f9798d3bbb234fddd1bff9b2c80d63518620942f2f7708fc12147aa1f0ba95b626630ad4942dfd63bdeeeffeee3e45e9babbbb8e378943ca185296be7dfafb61ed33cedbfd3a33b8f1e3b4dee93be2dc7eee7f32f340c8b719ae5cbec980c71d61b73fc8e59b0cb7cb601116c23124d261f8b50f7fd3bffc1e15f9ba28afc743427939ffa8c8bd048b38f70c9a7074394f8225d0e7ec489fbed76009e1a5cfe06cd87c6f7e2ecaebf9c789f425c80d1b5d57bee731c8d9f1e872efe258e9bb8be3bcdc1369cfc57101d7df63b0b3230cb77b1747be5d7f2a8edc3018a0b4902485eb3f72c3c613aeff4849b8fe449c8a7c3b51c8a7a6a6c25cfa2e8e22dcf99efc5c9c4f45be0c3ea0bbce8942dda57694d7ad909c9a9a9abae3d1f59f22374cdad930f9b3cb1d1c7172cae0b1ec499660e5f150c837199c6e6d1fbec9d074f9bffe9134fe57fbf0cd16e6f2e35c7ed6e104782c42289f9f559ec7edc3f2cae7f75adc3e3cdba79fdf93defcb87df88ef532c74c600e371ac6d7e7fbf73b58a42dcb9809cc1147c3f8ca7791a7956091da307f0649e02bc122fd445a8ae1f1ed7ed96d89f491942678f2a5c84278b345dd71defe2abf56f61feed8185ef96378a7944b5c7a4b7f222ddddd5dbebbecfe7adbde1ce99fdfb204f96dc77e6f29a13cd619fff67b6c80d0e32121bf3f8345f8256804069bcd26c365cb0d1bebedf7fae3f691df3edcb07e22ede26c587f01c2f9aff6e11bb60f378cbfdfd53efefdaff691b79fc1223ec5281c5ca2a37ae5d72bedcd11f9f3e54f5b24af5b068b483bca2b9f4813e9bfdcc1914b5986c79775c6f0f67bb57d462041f208e58fdfed1ffdb9613ea17c7f7e061f203f881b36cecb4fa43d29fa053f1e3224a36e948f25bfdf939f14e7fda4ae5077a3c8801fabc56009d366bbf289b4d71ff310f9a33f378cbfb6cf28af3fbfe7626d187f08a13f3f8323cc86f1bbad0de327d25e7f52ecfbf1902179bb51b82bbf1fe42143d276851270e5f74bf001a1edcaffda876f3f832548db954fa489349126d22c72c3f859a76d5078b983a396fd86c7edc9e7f619f9a5e586f1f31f4949e3f1cdc674b90be2a59b90011dab20b7207704890a8245902e41b608c245902e7a521084079e3d78fae091418f1d3d523d2be881a3c74acf1d3d28e8a9a3278a9e11f440d113478f538f143d4ef04cf1c4a0678a1e15f490c153468f103d5a7a5cd00344cf0f3d2fe081a367069e1af0e8c113078f1c3c78f4d878c2f0e4c103c533064f183c33e0e18387063d32f09cd173060f1b3c2fe8d1a3a78d1e3678a478a278501044071e3578d2e0b983c78d9e281e17f4f8c063829e317854d053464f097852d0f325880f417608f203cf1b3d3df09c6046c70ccc0c8d9918b312ccc8988d31db62c6c5ac69c6c42ccb8c88d908663ccc8c983531db321b6226c42c8899951912b323662198fd30f36106c4ac871d356441cca69831cd9e98619941e13590bd40e602991db23a6474c8e690b54036850c8cac0d9909646bc8a49045218342f684ac0b1917b22d64379916b22c6458c8b8c8ae905921ab42c602991cb215c8e290c1217b43a60259942c053214c84e2073435602d9161915b234645e6464c8c69089210b4306860c0dd91932336450b224644ac84420434286450684ec079992ac8a8c8aac06990d32196438c8966449321d76ead8c963678e1d3b765c20b3ed4cc9acec9060e78b1d2f76bad861dad1b213821d237670d859dab96127879d1a3e98da912127891c313e70e303137c80468d1d3575c84ce58c2047899c295a37e41c914344ce18f3e903232a973ac50c0b26179b14d04c7d53a6145e1e353ae40491d3451da3a60c9715ef0e9b3966e6a865501a6ef400a3a852cc11958abaa53a51ada859e4a471d3021005558b9918381534884a068d548da296a07e2153c50c9819856c2adc218729c7890faef078e9b9a1ab987b501d7c0a190d3158e4542143050f182e9ba7c4a4412b87960c2d1a5a53eaad478789450e97960d3334e87123880c54080f06354b3942f49860264c4ed38c0ce41e3d7bf41cf1c11e337bc86ca9c1a1b19899ea2e526aba1173454d0e2d9b6b31d3871fb132a35543ce172d29353bb4748031f5f011c385678d9e1af484f92c66f4f0137cb0657aa99941cf1a417ac819a2c78c160ead2ad3041f133d5e62aaf8b2d8a8a027cb4c0d665d66f8f880063c4f418098c963e7e9fb627fb0427c69b0a2b03358222c932d2267891c2d34871c3044188877b06a10db426422a709981a3d6a744b9f1b3154b47a6821753eccb0a040ce1d337180327858c08a8011514730f3464e0fe00c540610a96a9955ccac20e609d61e74e9adc0aec086006d3010cc2d9e16393fccc8f1446c30054e0d368802678a05c506476c80044f0936981293450d23078d9c3072b0c039c31bc1cd1c3845e010710386a5e53323a4c15ab94983f5844c8896139e1e353708600a1c2b324b80768846acb800d1e3c68e9b366ed6c82922678d1b19e45091e31413450e173731b819814c1137596e98b0e922064c4c8c1817338d5919b32f4d43d7d03c740f3950e47831e3f246b0a478f1f0da6146053153b068608386cd1936536ca4d82c6133430fcf0a8d95171b249b286ca0b069c266043472d838d968b179c2c6091ba51a1a84546af8a8e9c3a606d70d1f10911345cd18ada59a2b70f68875f142d42e1e891a1e66ea9879417da279016c8d1c2962ac9899414f951929590866ec905da15dccd0310335c3a5668f192c6439cca59c2c72ba7cc0142ecdd0d0a2322365a605d58b9b2636c0e2032ac014ccb880da401a66ee7029de8719a4191e7c0b9913d42b2a18332690d1229325c78acc92cc94983d586ab0d698adf158be88af02a4f251dcd0c03525664b43f157dc8d0a052add84b141784b9e0e3834086d703ede4b8e086660e026a85d389062c78c07c1cc69e6c40e1ab38d1fa242e1b71da90f827699c1833505a2f1219850cc44b19a608d80c9388b82d5857505c8c4e28275038b606dc1ca02bcc2f28265054804eb0b1616a011ac2e585a8020609180c5053c021c824505075138173b5e583254315a33ec9c51b7d869024be061691ab476f09adc0c1c1e707a907a8022100013332ae608c0a4d6835e61257123474d980f8d1a3d3ea881f5819585e5840522ace15323a78e6f8d1b353e2f5e0e375ec411b0986039e1e4112a7d67e4d09163c7678220523d535f12372ce0594198438f0cbe326669e48020070a470f9c30b3861c326e6690e343ce155f0da10e1f158ac3a7f4d1206990c386c7865702ef265bc2f3c1dbc1b30236e55c01a5e494009c92c3849705eb043621b039c286089b226c8cb06192cd509ba858acb090497030c54e9807a2c5434b69e78e9d1adcd0f1c9013e9153c60d1e3966d8a49173460c143924b089baa9c306053946ccc091a306ab8f5652ce132b2472bee484e07bc8d9920344ce162c3e72ac889122274bcd9273bbc923074b8e16ff43ce538c53ad2207891827aa143c6de478a94fd0243a8bea241b8285024a066da24bd0115031a808681894090a06cd429b90d5e0e6049d0dafa5caa092a0ce60c636933423c33ff123782abe8957e297f85b0c113148c4145163468d1a35673c148fc537d5dc6abad46cf14cbc139fc44d17375d6eb0b8b9dd643133c40c11335770be4c3e70d8a859018e972f074ae55b9af161e6870fc4f8a08c0fc6c079a35546ab04405a0064063665d8a861538216112d11b48a58c951b958b1e0b73cd33bd54ca9a95283f4573c973fc265840b8beb08207bdc2401e103ec0296017ab17aa29ab182c28bc393f2564013039a1ad0e001c40d2703c80958535834b090c037c03a403870b2e04481a3e583db075d3ed842460c193564c6905943868c55977ac6ca0b1c269c261c23402a3a0c70cb5be14ebc14ae45e60919285846009903481e40e8782d7e8acff222a82ea876bc7e785d7901f13cecc4e146ecb4801e4187a021a05666956903fd81fa40abcc26e80c948789030582d640a5d01d660d661f3c75501ba61a738d39c5a4623e316fd851625e318598404c2b26d3f4613a4d2b338839653a31bf984a4c2c73899d2226096619938c09c614638631c798494c114c247652309be60f3387a9448970387a66e02af0373c0e5fa327871d2676b2cca4f0321c0bcfc29770261c0957c29390f920eba1f7e829afe2353892f3e041b80c6ef3199c06c7a1f9701d7c085f721b7c4af7e1490e84e7e054fc0757ea1af815f7c1a5b815efc1777021fc869d256447f4538bd15a4823baa945d04a74128d4487a08d9825d13634951d11b4524fe9a5f6a173d8e922f3903590329061640c76b0c819781fd205f205332f4aa416920cd985dc421e21c39065482ce44d7221b9c82e9204120939867c9259c82629028945d2209324925c424e91523ed0820a926905e903500760107ae264c90530802449062c30010944000252cb024e7880031a70a404124630a200a9c40f084282405149e1c9cb528604aa762022251b40024509500b489078d25570028404c92abc432794ea0007e10b98a809132545402a2001025ac183d005fc6405274c90746008e80521244ca0dc2227402e7440c9091fdac1404b9c3c718244c912274f1cb0e46e10d6a1c29325402a7010d2c1441d000a22ea00d0110988e11c444c16d0812b862d082104a313b2806100722213cac12be016963c81027413c6c1432fb0c06405274f96206102e5026d40098d2684030a93168886809c70e009920e00057910bec12a0039618109919317963c89c2e40521202445434fa0000d090955c02a304152044434f4c2921f6114130131296232f4a485a21794206101091328570914159c28191a21274c0113110135d92044c14c78025ee1c99321286e709193179e2c41b28212a02634a10978c805175c68402b6c838b8088900c3d6102e576600520205a4dc806130115bd008588890a35e1176e8148490b365c838186a020011a62f28210d01012a215a240e92054838b9c00b9b0421428b0300d26022a7a12050912274f70422fdc810d204183a8099013274a5a5882048a0b432d2051c1c90b4f36e084c919454e9e2c4122e4820a66f093158084504c54e404280a50099805274c5470020405095091121598a8e044c9929db00c0652e1c9920d423278e8c90a444044633051d10b508a5e781280500c175e2022520280300c5652a44405244e9e305101a8888809d11010140f4230980868e8c912241d2862d284c906943461a2248a920f9f9808ca0b4f86584092137ec144434f8a889e90a06448c909af9004cc012650ee1050d0d0930a3c400cbd6020a017805e80000a2a00b1c08212143e08bb3051d012a0169674c144454e8086805a70c2e4432e9c3059e126dc8297302172c264a8080620241d6802058a122443402a3461f2022d68c99326349cf0c62e205152a444052545400d8809b5f00093264a98143171c28426cc8283963c69b2012440452f2c0182014826c482879e28e06309d464034a8a9cbcb00292a22540434c5470c20409921f42585e3aa834ece872f9c8e39bcd76e591ffe05453a8a69050643737a094d20d06b0c10694d2015019009fedeeb3a6736ff78e7976dd734eaf6977ef78761d779d7373379bb941f7ae5d327bd793bdebd8d93bee3ac95ce78daab9e99cd7dd71d59b3b1a1a6ec9ed2cefa63b0756ef6e15d8adaad3ab75bacff93977d7ec5cc3ccec80ee66f50ea7dd2bf3f4a05900b4a564e6cea757bdb6c7cedc1d4b97cccc9f7bb33aa7ee3f7eb83b7fe04e33bd5677771a49d3b3bbae3b6fd5aaab5e9d7336f76c66a6b3bda3cced2ebda9cb06c454ccdeb372f7c9ba6b9cbb2500dcb99b5d4a36c1f94877ceed75d8dd4df7eeeedc27b3c7b3d59aee79d759679d33335de8ddf2bc76ddd3a74fe9de49afe3eaf7bdd8bdc3aed95b767bd3e6e6da75ddecb8dba7fc9cd95ffd720678cc8bbfcf4be0bace996b15ccd963fa6b27815bcdeded1f3bcfe62fe673eee89cd5f39d6e4a6e76ccdd81f38e379d3233571cf73a82b3f367844eef5a16f14efac72ca57badec7536c7cc1cb38b25e7ec629564664e72ec1cab24c72c5d33eccc719c7bb333cba8d8c52e5631ab58fa94edee524a6666d607aa9652ba945d27774b97ceee75b6172ea0e7f44e87bbdae9743aee1d4f9e5d673357da9d94ec1ef3f4d0eb98ba774c4cad353552d6aeb5d6ea9f3b534a05a0005aadec73d6596b4fae554a29dd9b5ee566f696bbb762dee0b77777b633fb4abacbae93b9bd7bfa74761cf7af99b95a679837fb9c35d2bdebbab9bbeb6aad5dbb76e70191e6c93c9d6b77773da777d5594a76fe12306b7b3765b8e7acdcec5e3733bb9c3d794e4a71264fca4cbb8eb91d019d75596bb7bc4e791313d341d7755d0731ec9fb3bb77af03b07499e6eed8abdc717bcfda9dd7dd9d0c40d779bb775de7ac62667fcdcea9b383eeb6fbbcbb79327b77ed3dbdeb3aefaebbfd93d3c5dcddaeeaeeda2c9bbb99bbdd6537bbfbec9e4cbbd9ceee2d99bbddddbd9db277dc1d77ccccec1c764b67eeb86badb5e764776fe7ae7d52dad3dd6b6566769f3eb963e66e32bb4feeba1f937d324ff639997d765700d4aedcd5f69eded23b67f63999b96377664a999bbd63669fde2278bb33b373d7b97bb7777706e8ba4eacb5bb2a251d520021a2f843c3aeeb68d7ddf884d0349cb4765dabdbdbbbaeebbaeeae9ba15dc75dd775ecdc751d8dcf8eb99e737ab3e76ceebcdddd9df349bbf68ea50ce225881a5ec3dd81a1272e00b9c001d9c00b44312022242e3c51c1899221eb2a22421234f4840345404e747e10c140800551c189122440434aa0b8f0a48992254f9a80a00293264aa22021eaa04705a0212015869e20f109a10788c95091003cf8d1f3e4c91090a0254a36d0a4c9932101f028011a02022407c80f9b222226300071454b94103951325484a488890b2e3c81f530590168088a65dd380182024589641e1772180868680524434f8a942c79d2a4891220cce3029322272f0c59d60a452f6ce0c20b4e583000b580a4c80993212848961031710107049f0d6078c281a29c20254b960005f984d0f336427a7890f400052969b201242c3861d2029192169e2b1a525244e4414f0733272c302112679887a803404148963069b28117a0c08600a002101111d01014179e2cf959710f5094274b808678827c42e881b204886847d5c29222251b40d2021113274c5680fd0a4c8680a27450009e1042e85101001c00152919027202c4021225442a2c0142f2a4084a07869674a06a021405a809121894b8c0c10f169e3441c28213262cb0f0a4c90f1918805470c2048913264a5a58b2c20a4f9e00441e7400280849110c404e76728a8058f0208a132097611e244e9e30211a028a826448095093254880585032f4a48808890a4d98b4b0044951931794ac00a4029222188062519c00794f784373a74a72248fb81577646474646464d41d19197992230926399247f2a86574343b89913c3232f22446d2e8e8c88d66f592f0915127399246464646d3c8c8e8e8e8681a1dcd247ca43a92474646466d64e44646479dc44872122323a34ec247464647f2a84bc24632c9913432e29218c9a3a34e7224f9882639929ce4481e1d1df9d14cc247479d848f8e8e3cc9913c9249f8482679004d92cc2c5d2052c20150361b5be3bec64a195b83e2b1fe185b934c2b5bf3a89a33a96cad99686c4771144b31511737636b5a50887999afa9bea604026df5352d28d0e7a06e7f4d0b0af569df6e32b6a6fa182b435b934e1eeb6fd99a64d99a2f81b6d64b9f6d289b746234b0d063697a2a5b9b92f4d156b6a60505d5cfafc9a8dbaf04026dda9acaca288ff5cfe76c4d4279ac9fda5a57db37c9d1c08b3cca90420c192494b40247122c58038b94ce1af5175138b183197c0c419b564a45b9d48c629a504b50f3366d37679a4edc8f2ee524e54e9ca556a2e88fce1435c5442d5df2a5f963437553533560638d3086589a962af54dba408d36e028e2a90d1ad3fcc7b6ddeece00428d2a6820c30e1ad3dc529bc7fa472975fba553287fa4b6db14ea720746f648764d0e59b66469ca72441622b25849e24a123adc18c27eeff22d892424fa907930bbb3b3143945d3c2b2323c29a594d6b5d4439444228efb6a2db3d7ede7970f6b9f2a52b71f67a77dfa366c74dd1602701b0077c683d73024c2786ccef91edc911e51a33b7f543580e1b8d462a9f459ac4fc5295277428a56ad8dcb589a3faaae3f119fa207d7930c5ac0836b248f68371a5020f098cf9052485e7fb983c72b7c1f7842f2761059eef7f45b2492b7bf4112f8aa6c907c550f4996d12faa5788a7aef70d1af97eb5f22cfd56896c65fe17c495fbbdea3d8f7ebd7a5583476609aaff9e488fd0bdf752f45e257eefe091fa525a66991cdb4a96c957bd278e7da52a4abd425e035b913ce264db2179fe07773ef756e2b8dc7727a400c492d3de61ed73c3fdebc092b4608589d2743aa8e3d29df619b98731e5fa4ec2974292f6a1fc6442fbc84b7f06c418973e0874ce2e652f4f3e7f478ee3d2fa506ef7cd5fc4dd7e6feab40f1d6a091e4172bbafdd3777967987ada7024d38d2825b71cf3fcaee5bacb61339713cba5c100796d075dfd93186dbcf97b3a3bcdda2bf27bb8ff8f711c9d923f29b3e8ef70398cb8954ca70c7fa7cabc225f45cedc33dfd098e507f8c61aa04f99c1d5b865bdfe3b6d54e1cb9e727e29c0c57b64b55309e08977f5acf1fb60ff8fcaef6593df3e3bc4efbd4e787b50ff7477725825fc523cff39e487fe24d7d9515a53b1f14827bcfca9dcffdd074e77bf33def487eaf5279ef49ef85fc7aef05dd1ce99ece8ed51de9589df7f53dd5eaf9aa56d6487dd5abbedcf9ab7fba33887ef7df57515e95834656abd5ca06d11fe7131d3d80e8e87e1fc4fd03e67776e4feb32abeaaead18fc1cf8eb5fb3d278ef372df12bd9398794639a5f549cc3cdc4b1a11ff448f7e9ce8df129956c5232a1b04fe7cf0192c12448f107ce7bce7ec08be676fbcef9e1e990fda1bcf1ea9cf7df53871f55d50addd91dad512e6abecc8bdf79e278edfdfa89eaff79c78a3b246e87bdcf3fd61cb9defbdd75fd0ea3d3bca3b72ffbde7df4afc7e94f76bd0885782679965a3f7fe2acbb251f5fef33d3baefe133d793979e5e54b4110e1f2b3d74f1aa065b8fcac99102379b4ea2f071fa0dc07db106304d1431609c4e7f5f7dfd067499f39f186bebcdd7731f33db8feddb7485f36d75c73fccd556ec9dc13714ea4d7a36253c943d82fa97f747e94f67b1434c26e701d8cd5b32bd9860df3e0fa5127dd0c8f2511e17c0e3d5944d84d5cbe5d61e27611976f4254b9b0cbb720b894502445ea8e475cb83bbea003092e7f4b16113a17976f4c33b8b2cbe55b114fdc9dcb3722da90e0082b32a2ae50922b45c4153262ddb1e80d14bc8ab863515311de1b772cb2e10d7a472236a4f8c00aa83b126d81ba5c6d369ebafc97bf7df084e49def4d913ea56b5cd900ffb6e34d09a73b7fbefc96e2cd11bac69d4fd7b823d1d19d4f9faf104f4d4d8d47b79f3a5d9945e98a57bc5e7f2d7270a948d7b8121ce1a3d0485bd447de45af1b1c414e5d213945ed4d09f2fd4790efb6c8e35b12596e515f6ac7fe28f2fa1f5df1ba28de2ef22eff1195cdc7962b5bf6facb7e7ed762b6283bd943c8371e9a6efd6e046ef5551c571fa4fafaf4bbf7f75afcde638937ace73b1e5dd677e2d86d855a374a515fd67f2df186f5f286efcdafdf6bf1a68469b35defe7f5eb7d8b7d1b1c81f52d31fc4e647d8bfeb5c479bdf97522cbe0b644bf1efd3a91f7b82db1af375b32ed2617fef79dc87ddc1653d99305be5ff07b37ee27f68762eb89784ba41cd47d7d37e1488bfa5c2b1b91df49b084eeeb4d097ebff7fbd9f1888bcd765bf4de93a0e421f49e257a2fc3f5fa6389de7bee82eb4d18301ed7a31f4b24ea6e94be2c0cc9ebfd048bc81d42efbd091a6137aef71ed3d952d60e58de77b1cd7059e2ec7a2bd5b7073eb36ce581ffadc4d1afea3fd5b752bd270e7d20d8ffa97e25326802efa8f859521b366c5a7bddbe1ac6921d1810fc3e107c291a81200882cf3a6018cf5bad3cefa568e4799ee73deb783050a96a55a9ea77af52a9545f7988ea59476583425947f77b126c9675dd2dce86759565dd4bd1c8a8fba9e221452a0f91c3e32861d7bdd71a81af8ec7b973eeee5cf79cf8b1ac9bf5521eaa5cfadd1371ee8efbae7b4e1c81fbf944ba6b24bc11f8b6de636666e696cfa2bc925b1fcb5adf620c21ebc1ffdefb18c2d5abbe7ef73184dcd3b1ded6b7fa5badef160abc5609dd770daab8effaaefafa9c7be5545e57dfc528f2d6fafe6eff561b54bf7b061b5055763cba2aa9aa5577af4fc4856ab76babba76ed97fce28dbf7cff166ffc5d2481c865de19bbefde45bedd7775a8e88372eb335842925bbf5ae69d113a71ac1fe4dfbd57453b24c45236db2d92b9ab772ffaeeeaeb33f8002857f544ba8a434209b8cd32ff22eed6befe2a71a87e117757cfe0112457f51c0825e04a96a9545f559679c74123f46b15e577a3bcfc541cfbe5333882bcee62d830fea32abb313ca6314edfa3fe9e04fb695ed7763cba2d6b1d33f3777ca52854bb9d6c51c86f4b5a16c759ab64d15da89b9a9ae2e3d61685fc562be4f499fb4e1cbb8f12de26d326c31dfb853a3e6498ba51eaa80a9a5f9fed185efe16bffe289dd05094ee121d5d698b30f75dd477f5dcafac90e4e34e9558d477bebd2941deae7f8345fc399147f9dcbb18a539eeed2854bbf3e978743bd9553bd66efd166577777d497424e446f8fb3921bf73daa023f3887cb741fccd2a597768d8923ebc0f840deef0f449c20ff090beb71b85033db45d296d577a2dbedff3f3ecaa78f53c447ee2b36c76f9b912ea57f9558a7c25b8f25646542d793d068b701713366cf5aaf75e8245a41d8fae54892bd1ab6214794779552fc528f2aa545f45bed363492be4f7c6885ff9d23ecbf8e5ada2ca06d5f77e8242f572ef7d5e4bf5129454427fabb2fcd2abe2585fb5b2e3d15dc9222bcf8eb5ebbd1455a2b7e41df923038eb4b8cc3bf2554fc4856ad7fb55be1285fcfab34a944aa17fd822df4e945d4eaca2273ff99d7823ad90bc9ce52e36dbfde0724c78be74e73b7d0fee48adacd230be7cabc2c59355da87ef7c201e3234bb58f88f588e97cf6c393b254946e35e698656a57d5c773e90203408c726575669d8fcd90a4e98c2bd7c222d6de128abdcf923afe0ceaff1871e93c1152a8aa0c229ca66a3712f7f0cefa449d13699c02104331c81056d4a928c265f6986c63f25a969dd2b2180269f13951040ab6941417eed048fcd9750773ef7352d2874cfd91a118fcdef6c4d0b0adc4b5b7b8fcde7ec8c6f37f92343f10c6800038b1d6d2ca18233fece0fc247c8b4231fc6c0820822b6f8f2440c684ce31f67773e8328bccd469355dac7833b5f2e754f233ce621e3eca835b64f09abf9744ea3eb148e3b2d1db96e7e679d7076e4be893b2175a9e57e743bd6eef4235c460e97b3582afdd1e83639ba723927079872bbf4c7694718ae3be132962efdd1037772d609c771a9856aca82006b703177d872712edf76b872bdfea888a5c66fd49a9a9aba425361b1d5a0c009292db0cd97423e3575b1d836b821891e988600c0d4c493ad080ac771b1d808b00617b62807987283c1c6652cd1f8470f5cfacc066026c0c8b7252fb7485e2c33701c3495b5711c34b6357e23274418c1860c7cd86cb46a6d536c361aff587bb723146f7e55e49fa27f831420c01a5b4cd1f819a4408c0a50a0440da44c4dd1f85dd79bc3c2f33945fa527695d2f7af624829d7480e521deeab61f4a728afe7df7c8e4e7967f709fc2b0f71e9f55df5cebd73efafe2be72fecebd77efee1e27f2a545fa86f944ba9f7bc9fdcd7c79fbdecc1cb8a71d4745792bcbb8edf098fee421dcf3534e04a16154ca9d358c3e833ed60fd4f79fd5d387f98ff7f471da6736ac3e7d213ce459569fbe27861dabbf126bc7aa4df59f57c7ead37fb58feae9731c7704e1d2b7e121f5ddf6712277f5fd7380ba380dabdf2f5f82f56fbaf7dbf7a6eb9e6f4b345cbe2d21dd57c3ea73a2bc2acb0dab7472a2bc467d44db9df0b87d3afff99d282f15e73338027d669911fff93c8061b001fef3eb4f3bd63bbb97a0100c536690c17685460eecd1c7d4e59ee8e87296a8b3e3fca662933a650619260c0d1ea97684c16370043a7f8246b867968db413e5e58a4c7b5382ff7cff6983faa715aaddd16f3f95dd85d7bd27c122de7f4fbf8ae0330f613df71e4b347274c7efbd67d0486505d5e7ffc4b1be7c4f5ebee5c0c7a52ce31a34d2fda0587f25caeb790c36a05fa57a5054fd4a64f90c1651d9515eb6a3eafb5389fdde13698fc5ef3d91afc7e0086cbff7faf34479191c6175996523bfe7c9cffb9e48f3e78955fc1ae65f0bbff77e75c75a42bd9f0d527d7be2a87a79a45f25572b91af4ae45bf9726215a7381bc69f742b1e0f85f3c7d7a53fa37476e9d30781fecbcba58fd33f4da3225cba73e987edd34f29a5cf3ad406f1cdc86396cfdfdc52058fbb98af61ae13da67fc2af68eece5cea7df55fab7e37ee42fb77b219dcf5849689f316ca17dba17a17dfe769f42fbf02d07a7db3d06fa67d29cbf7097db3db78f7847d71d85dc8e3e91c6f15aecba48316ef75e7f2df67d9171bbf7b8253b4b484e5deeded53ef3bbeebb679dce06b1943779cc81906f3bf071c77a4302ccf5e7dbef63e81f046b9f1ba25afef8c2612eb75df747f0d70bc73f74d7081ecbbe08bf2cb73f94311eb33c5943381b269f6bfca7e82213cf6fc0c3ddfff6ff77c7f0ea7c0de320028cc711507c9981143ce840078d6762a665b088fc19e270a5c3ceb9fd5f6569bfcb371caadc695f0d937ca381c74561d7f6f900e07193b0df631571430f38de1116216850038b103adcc185c6a0279f75c699282f5f4fce86c9d90f98237076fccb7de52e6636cc8e457e57ff6a1feffd71daa7f33a95ca8eaa5fbdaafb1a16b64fa77a7faf13e5f554227f2fc11136b89f1dbf5f7d27f2fdc422bfaaf764b3745627f2f544be2b95c80d1b5f577ef51f2a4fe38e31cb469c2bedc8792e2527f24d80fc2a16d12b3faf3f182ef72c8ed541ee62e433a8d330ffeebf611d8b531ce5e5c422bffc520c1bc696dadab00eef57ff99369bcd66a3f9c378885fd7b92b4941e02eae10d67a4395dbffbdb8dc7e9c1542f92c2f148fdbf3f83b72205cc3d2e55b0db63bfe6d2a52f7fd67a763fd5dc46b71df5108691fbed960e5f68bd03e7cfde533c84238c2e80be15b95a6dbbfd33f92d62f020e4efbf4b3386b58ef34acdfa928c24023f2ee340cd6b07e0d8446b7b60feb3495be83b78150bee7c9f79824c844735b9c66313d772139259fc11abe70976f3540815d48da5dbed50086535dbed5f0824ed6705f36dc97740759d61fcbfa598c21e49b0d4ad72fdf6c98e18e95bf1f64b18630f7c55d6551203c6eeea1a084369b4d06d90f80dd26d2d24ac8371bf0b81e5c9f3c845f08f94625eaf2e5ebd16ff290be3cfad397efbdf0ba45afdbefe228878478eaf6177577bec781475ad79f48b7c82c1bfd2b97c03d7d0647f0ef88b48b7cab38d21fe5f5efc49b23dcf7b70da2cf3ddf29f2e5c0231e5cce32cbfc2758844a27b0db3f92268f701e4e60b7ad6459bf830f805db7ccb2b6dcc9b984c7edfe2399dbed286de091d69def629479a7159253d79fd9999965ccb346ab65371a9ed42194cf967f781e7d6e58a54f9f487b1e8314e8b7e3d19d6f4473b0c87c22ce600afe6d6b47b4dafca6b98bb5231afb4fff58e43785902fa320df6dcd8896a4452801977b49a3e2b4a3bcf43971f44bbf457f22de340651709a7c223d45be2d328dfba7d28edca8bb952a407f16f9ad542cf25b82b4d96cb62b7f8a453eaffc39a574a388bfe7a264503e91a6f4fd1d2ce22e76fd1294dfa0b79433f0e44b7104be9e14abb8e0be1ac6cc4c8394bfaacc1a245856d06f8245e4e5dbd2d27d356c8242f332cbf8275844484edd1f2ceb9f2c52905f8af2b22824a7ae7c0a1699d6d5b07e29be58d6efa251c8371af870fde0217cfbc3170f593df57b5dcc19f59322d398af61dcb011e7ca675dbe29c1715fccd1e92db96351228842bed11075e9e51b0d532ec7809173167926840e6bb9442164900147774e5bed91940b98420148c07c71673ee28fbf41138e6e105b21a3cb3ff687f28a2430976f494f77ac77fe07976f4957eef438d1931434e1e8ce11e4e57e3cba9cad2d06c983be37c122d441138eae33c8fd0d678dc8cb3d676bc3e4b3bcac336d5068c53341fee8df520cb287946cc46314e6fdaed7e2a8f7b7f59f941ba1df9f4873fbdc18e9f7776ea41fe43f9fe3beb64f5feebb378f5108bd16b74fcf4f0a73f94a5b1b367fbed7628090d19d42f24ebb018f3b0cc6eda73b8a30013b6e0de3cb56074b67c3c66958c74c800e241ac637bcdd4b0e85c73a1cdb68a308dde53208fd5369b72bf8b85d5145d611be4efb387df93b23b5df30e9a24ec33a1cf4908204186da840ca174bd427a64cdb647629a5d49fe951124a4c7b4471e587134491c00a05c10dffb0f9e35f9df79fd07f3afb3159b801471355dc50431c34eac5a51f56b91c971d2edfe8ebd8b1c9ec4efb2d08e5bfce07c71d7f466be0c297ab0d2a1dbec6f0ba42ffe112d8402d18491cc8659ae1fd4c1a3fed388520dc4a93ff72251afd71e77250c85ec4f072632e7b09238ecb603f91de6922941fca978f33ce263af7ca0c3f9336e74b96f7bfb985883b7ff68f14dabcd38e4d742e37cc3f041372e83f93566f8ba1ab63f27790086d2edfb62471e7e5db1623ee185e69837eb6a721a968da52a5a7b8ddee299e6ef70c06e1f8afeabe7b7a2a91e51ce1eaf9ae5e7eb7ea3e68fe7c8f824554261c5d293d074be85eda31a87b09ceefc4204e25ca5bbb2955d25d503d2041f608b9e9647683fcbf86f1775fbfb99f3f3699ddfaaaf7aa581b4647d83ddf5689f5b2ff545a7fad0f8822afb4d33a995dce06cda7d688e52adb06777797ef2e1b059205663499d12c9106134d6692054d7466df1270b6dc1147131d8ffec8ccecd4f29c0376c3cb0277b4081fac2c11e631d67777ff3df7cfd7b1eebbf7ba67896011d0d686754fc43f71ac57dad1b512c7b045e081769c79f9c2635cb623f86093d97532bb41dfafc6d995e367c7d9fd5ec7f5fcdf3e31a3ebcebc4c8c2842c3fa5d22081d9bb1de8732e27b4c7e4be7e5ba20f8a1ffc8840c1609edf87d37fe059f258ee105ed278eafbb12c7138cfc28ec3984d7755dd7cdae49f70c1ae99cf0971bd47dedc491bf7496f5fc3b33107888f7fc38fd5313b6646210a0f4341ad7ccf3cac68858687ec615d67cc7ccfcab61ddf7cb88b361ddcf88ae86755f237ec7ba5f89b086c9887c63c41d2d42d5bfffd0c4ac68c4dab1ee63c4b061dd87e2ac61ddb744101ad63d4b5c40c3ba0745121ad6fd279ad0b0ee3df1049675cffe23a4635df7f22568a4efca72c33a95ed669a2aa14638d6cb715606c923e42e57ba11d64f42dd8079f9315edca51b45f801a163f4bb5ac3f0f5fa87cd1a46c34e1c650f97b32e8b45356bc36e5dbb164fca6ef739298bf23bb0c8cb4bc87674711a21dbb15e4e9e20e4a72cae607feecd1555715fad0d637fea1f446d6d18b3acf532f308c39d972fcb950ce674af93dcff60199d359ff37b9ff9a3d34f42f51ddddd3df63a0ce89cd144e7cee7a457bf248f06bdf33bb0c87c9c86f1bf58c60f254c41d1a463d775dde4c622f77a9050f2e3ae81ed48c21572e7cb2fa17c662d76d898ee1376797c71b9f3dd5fae11caf726dce54e1915ca975073be736180d07b86ba2308a3ab89f090145806fef8ac1f613f4276fa07e631ffbae7d9f5ab95718463b89aa9de6b9d231e48638934966e939917131a0675252bf49804e527ca0b8a3b5a84a31021fed37a7f222dd193dfa7f21f57c7bcfbefe10885dc9510ff99a2a57ed2d35aefbf80f619ab4f7d7f12daa757affacf8e38bef2de9b08b9aa77f0480d8c1d9070ba4df8cb55cdcba0ca36acd5894224437dcd5151e5edd2ff72e9ab7f48f0187d211ea3cfcf3b5884f36b0da33b5cc21d2ac2515a9156daa7bf6d91bc45aeb44fc794a57d3a8bc5a97db6b4cf4dcbdb851ea335bc2c65274bed6811d22721051eb28270e4a84b3f890aed539f7e0b36285d6b9fb109eccaefa70f8309d58eecc5c1229c2d9a320a96d1ef10465727ee68c1d44acb37c291a52ea50fa5681402836c9aa2657ed2d390681f2999da673eed7cf8d28e04bed536e12e473e90c41960a26e138e9a9713e79d22cf0e41beab7f9856691c5e4a1b77ae3f95b72e8739524a293bc7ccff727d505de727a1be65b7ec6e779e577eff27a1b8fbd1ddbde3196cea70df4fc5f175b9fb9152cab2f9ee921347d7652a8edfe50a02cbf8a90c88b04c042118d069a389cea520f0c374a0bec7c79128907c9f562ace8649cbdde14df92d4a13a2dc8e275c7f298eb32ba59472845d139accd8cb6d220deb97dc458808527eb94f429af43be1a81b24edd1945e8590dbe377ef7ad1af45be5a89f4e4d601418864ced530eef597e32c155b326531cb66c3fa192c22a44aba86e779fc2df2efcc6e73170c5c9dcb5fe3a211e736d1b90cc2edb061ed92963e6ce78bfc944d845cfed96313ee72e573d26f98efcefcf4478ee3e7f88338b63d3abb94835f4285f2a79423942f53e08dc051ca4c9fe907cdef3945fae39c2fa968c72497fe14251aa1fc59442f9d1f44a5196193bb38afd7dddddede34785effe8eefeb3cacb3cc4efc8cfccf332fbf88fdd3768a8af4f4d311b60fee8de413ec521798bfaf2119e9a929779887b2d7a98b6b5a88f24e01eb9f41e3c3e807cc1acb4fcb8cb1df2b8a7b832450f32f0e43f8187ec02451ddd16b7f90605d32df2ebdfb7dbf1906699aba64cf006da1282eb44d0a99c6aab0a15f8b4f234bcfae55b4581ab395851e0114598705289f96e90590531130297144bb86664626858b39a8327c508a5e072fb77665278b9fd20b44fdf1e3db83c6426e022e08e38e290ff5094f0f20bfd8de2976f778a1b5c6f7e530422beaec77d53b4b95ef74db1e67af59be2ccf554df1465aeb7faa6c8733def9be2ec7adf37c5ef7ae037c5d5f558df1455d76b7d53e4ae177e53a4d78bf9a638af27f34dd1af37f34db1afe792899971d1b0ec5051780970bb9f5bf124184e539ae0a3893a6eafa089a89d76ea414ad9ede4e494653ac5e13486d38df231f370b283e32b5138818413556a175a515961a8b82fab4fa2c07302ccf749d10929f009252427f6607dd24aeb4322e42b4e41b8689cbe18a7717db7c7b831847c73f2f2c4ed862e9a27a6a855e6934fa831c3b727dc88095b2cf0f356aa2a23338627bdf8fa6ae28bcf55e24926c28f3b8a11685e044d3c35e1d444171681f4e730ced28e52886f300f3332d4b423cced08bbf2594655718af9eec3f0633a30fe43f3636ca91868c60e53f3f3b2f92d3f6c5be9db77af10ec2d1e6b278f753779ac996e4d28dd514a31d41d3b8aa96425d3eb656a7ee6695ebecd585f3276fc9fb1e3cb8e21535b91aaa109530343544d8d0d4c8d528d9254cd52cd52189a2d779c4a4f7d948006a406aaa6e6f5e5f5fafe8ef21f9b1f373796614080d81f3f7ed8d86963f3bd5e0a8d7cd558eee54b26c9f4d4124c28a39e7fe6e597e7d6330dc9f512ea5be28c8d50dad6cb279a1f3650f2e90b1492149aafb12fa49a9742237fd8185eb6a6c64a304447b76f2ceb76d9b1ced83194b1e32bc68eb0d08edfdf12fbc661c2a051851142ace08e10d060fd9454471e35d83145ebbc8c2d7280c0a6c7153455eb818712361a6c22a079732049f992c609b0a0b1c7580fbe47d58051ea838bd49287b1326d314ca6186653172fa0b5162b779c4a2358ba7d63c160e1ca8e2f951d5fd58e7f3b7bbbdd7ed82dca630c86b36395a2760c4710c6637ca71d5f449ab0798cafdbf1afd34ccf0ce1b1ce386fb7e66bb6d8fcd8e2f4c3e6879c563cd66f3399a4840ae3a271b96a6a7ed4d4d8d4d400a1a171592429ae477ae17ccdd77cd3dce0744080fc4d7df61f1b6bf340543facf74c7bd9186a6c0c34bf7a6f2e79e04f25b0f5d3d68a790ff31da6c348f5adf32dd59d54cfde34abb5c1b847cd47a2b1fe85e6a5b8669e694834d6a17e469c56249415a8db3ff3a3840273c7b649cdb4dc3a8cff7493c7fa6bf8eaa6dbefd9306deb19db4dd2d64d617d85124a36c9304f92d63f99da03bff5524fb7a56e433194ffd0b8bebcfe048fc9281b193035cf1e0b9f86e6d963ac97e2ae678f7ddf2ecb1ef3dea3a9ef7ab0c6b2c7544ff32d1bcb1e5b7dcdc7d45e76f6fdd38affd8d8133c26bf46c68efce5ca8fb163a509edc851577ecb8ea1cbb2c758766430573e68c7d7674796baf2bd69e5f6cffc6765c7aab2635867ddac525be5d7ab3a9269191878ace3b1ffa89edf0b2325692a51d2186a3679cc5695c225fe69f31f7fa697957049e9760da77f7182f21fa67d899a6066935347b1942bf90f92d10cad7e6d5a7d4d4cdf8ac9ca23d53e2b4bfe83d4bd14ae5a57f2587f677dc95da9b75ca5dbef5f2cbf773f9f7bf92bcb6ebbb3cd59f6985cea2830566effd85b6e7f2ff94f585fa1fb97d7b4ddfef1fba9f84438ba9364dabf66d3a5c99b0403a6e3a4e4cd498679da6283bab5d297278f3527a37a36dd9e4dfed3594880821508814318b4fee9e43fee030df8c0b2c4115cd0fae716ff914936b03115664a0d5affbcf90fcf1741bc3195d485d63f9ffc4752a1070f4a32d8c1466b2bfdd28affd424cdfb5e7dabfe678bff70df0fe5eb87c17f3c4b82c7da0c69f39f953da15f2af98fcaa6d02f97aa4d1203675bf0587ff7f42f2cebf72fb7dfdde57bbf14a19c52ddd1ecd00b18fc87bdaafa515ab99c2469aa6fc53c8b9f57abf7f803fffbf05b3f4aa5cb5fc5182bb78009ad744a92b416686553c87f4292a4c5fcaafec84f3ff2cdfb51c8e5efc7d9e587f94fed84e78f11e593d812e5179628a3440946f5fc15068ff99fe031f0f943d0b3526965e552dbf165a5158f493bfe6528a827f9a36482c1aaf7feb3fad5f71752eb54a9de9f04fff1bc87794cbe67bfb3233f5df9e37376e4db4b65436a472157fe18568f4d3bceaea4ad9ac1639db16f2387f9f923434d3bb21d6197edc861ae3f15e12899a4eec861c248f9cf972f515160c08cf2c97f6a6f3443f3974cfe53039f7bda7deffdc84f1d5dbdea47bed1ae7ef7a3903b4a2696adc5007216e6b1aec5c0fd28993efbded36d655f2abe6da936ec843871b6b2c7c659af8eba67175ec8bdbe7dd28e7bd6f3ff575fb5f23ed0f534cf5f9dd50a636664fe4649d25c343536407e4a52a5fdf8974f499ad16e2c901fa2eb25ced8d4d0882f97f88379e4cf88b553ad98c7fb80dce030cf06391c300f0b6c85313240a4fb522d9cabf97e6b1bfdf9dfd7dcbbd96e6d6b49f1faddd7dc7f7eedb3b596f2983b4199852a9617aebee6614379cc6b12aac67289c98be9288eda9a947ae9d4fadbe736d5ad6db6db375349394939a9beeb282f7ca6793f3613b8924c21eb470e5bf659b642819f7d7936ec25950dab7d4119cdd03a5b3dd6cf34ce326d7aeb48f68a0c8f754629553b8e3efffbcf7c7e4ea4a2149fa214efc41acd57b166f34633b42949206d729f2469dcd29c4fe7d7ea27495afd1a5da9987e92a4515fd1cc44ad3e49d25634b6362509a44d514a008de69324ada60505d7d37ccdc6d66a6c92a4d1f8bbfc676c4d4679cc5fc62649daca3fc642f198bfcad69278cc3fb4499246fd5bf66b2c9b2469d5d6428ff9835632d5d863fe9f4d9234cedfb372c96350957b2ea44cf236a1b8e7a859c752d7573fcaa895359aa1d15759a319da7ca6755f9f69f547e954c54ee4442a4ef13d26a5eb4876d749dd70fef81aff8eb0191be1d0af58ef2ad5db1840ef7bb5f26c0caaefe7b3ff7c368655ebe5b3ff207d3336422179bb271ad2f735a520b4968dc163d918be8e0bc385f11fd02281a0e5c278ccffb348dfd7bd7ceaecf89e45f23c7993767cad2cd2eaa5d4475a59dee231ff69b9302a8ba47a29d5c6309f69482acb1eeb974e1eeb6c3336c221ee3b4c96a76e7a6ae25b96a7cb7150b2a9c97f6a52dc68865657ffabfa7ad55f85e11d65534d29084dd507144d8ac7c01e4b8014ad69c646f8b7ed2885e6cfd8088df48fdd937422944e8463c7c485193ba62fb2a9efd83d754ffe239b3ce65f6b18be5e77ec9efeafad63ea9e3a268ee38e1c14178683eab92367e39a381b75fa429d5c779c5154296a75c7b934b7cc257a47bf81712b7e6b29b7f21446aa996cfdd474c3348d32cc4cda7ee42fb3b15e975184128a50defe51367552973b30aa47b45b60bc1f04a049f1a8c98114e703487f2e1c9d6ea68726a56dfd49b2a3798be63634e780e61ed0dcd6b8570a42eb294a329a140f634be268add4b45ed15a86d640686d692d005adb1a7da5201c8b30454a47539ad1fa939ce694e620cd6968be01cd0140735bf3570ad23e69dbda7ca3195ad735c7bd147f51cad9d06d4d2908cd5f2908ad36e3963d26df6886a61484c6c979f3de7f94c2f6f95392fe45eb7e4a5248e3de7bfeea3f539440a04d717d9210daea933eda94a4a7a9be3effcb7fa628e17c608bf5e127e9d0bce70fa728c168539284d0627e4ad28c36f349309acc27bd68e14f499ad138188d328ffc29494f9bcc239f3904f9fc33228b79e4cb8820f3c88f115bcc233f14430e417e4ba4611ef92cd1c53cf241b18679e47fa20df3c8f7c4170791bf123be691af123fe6915fc5ca21308f7c4e04c23cf2a988c33cf2a7b801f3c877318779e4b7c801f3c8379a915d86c7cd4f9a6111a628cd68fe4993d63ee97cfeaeaa56f4f93f6a2bab15c6c8f8f3bb5804a549c322287d352c8292cb864550c279b1084a3a3f5804a51d5adbd70d8ba054715804a570031641e995c322283dad9f9f03164109466311a6659045701b026111dabec7e4f31b4dd9511eeb8c14aa8970a44df4097c29f3b645f552180d2cf47052028136bf26a5c97f6ccd2d0d09a081b656b371b6c63d0d09a0a96ced280b1734505beb0092154a4e8411c514ad46430268d3d68c5870a50d2b4d5f78a0f97cfa53923e1ab7c157a9dbafe4a2a938cae5fc6a3245519b9faeb771d1a781e2e065a0e6d2b4efe0d7b4a020befd9af7e2d76ede9b7fbbfd7a20d3f6fffa9aedf6df1cece0756a70bea6058599aff95acf7cadfb9a928be6ff4da7db2ee54e3f9ef535a7db2f755bc7d6c0efc0beb5b550b435229ef737b6366f406c6dbe6ccddffacdc6d6d8e57a1a5b9b500ec5819d4b31af5fd9daccb1736e60937668f5553f863755c501f237320fdabcd4edd5c730ada26e7f65a27915531447ddd81af8406c128ff5d7d8da091eeb9fb1b599c7fa3b5b4bdaa175ffd9da747229776aa71fb6a59ea166dc0bb4a9799bf0b999d6874eb759df5aba0d3ecb97be07970214d002c6144c45e891c51519884f8060411827d0e20a20aac0e3071a779c51022e4260430ba488c10efdd334c5089a60810a46f00506ae04ec30079839bc54d18210dcc139790388369ae23882052890d2c106005cf8a0214a05535401c50b5a3b0cb106120f70744152c3053bd410f4501a4209386828420b3bbe27803842054f4c59a28c3075ec30595b544105131633d8d842c7efb8710213c89047135e7a9803c801d09063cb1d5150c4808b168430c871c11620c0e38a1fa0e600130399cb711c0c428e6fb72b7770d1218b14152c88c17c39eef8ba3d82165220b1e08929534ad07a05b73ff41f9a1b44b0c104022d750c41ebffcb60ff25d2ac23b77097f0f57452ea85862681eb6582a60efd87a91b655cea7a4a296d30dcb8b9b1c5dd045298c0e98ee1f751afd77a71ff3c8449f043a40d278ff1bd47528400410d62b4c08830e0a071715cae8d2d976bc38b1bbe68a82321def8a28d3292d8020479c041e48517b3f0f50fe3a6cf696fa1eaf28d8d3eaefcf79f900d19482e9e8d172471f1aff3e3f28d0d35d818e38e3f43da628be6e20d36c0e8220836aec0410a36b0f420051b3cf420c55fbe7d89c11739b2e0a6a023984ab8fd428492145f7e5092e2cb0e53a49838976f6bcce0ae2edfd6a8a392e1f14f29e4537cdcb64996b5d1ed9725ccce4a86d10fcc1ba5a51de2bea85ec90490b5db3fbf06fda728a3f4e5dee33e074b98977b4f7a4b6775b7b3427e397967fbb86d2d66332a66afd79617b715dc1a6ea841c71593ce49e7d739e79ca2e6f24d8d34d430e32580349650e315451469e820258d1ba6a45183947ea275f9e6658fdb5dbe79c1c3899758dc18e3caa72be3b8e3cbcb953b562f6e5c7f1c33dcb82e4569bb574a6b75a428a75c222dbde65e22e49b972a777cdd6e94617cfe2f2ed71fe786c618d75fc755c0814664182c031bd00d060f19e56d3b450906cb647fe5216d8578887cea83c73a734e19867cba63bd47842cf943e40c2c38267d889ce105c3f88e35d7e51497ef2873899c41057fd20044ceb88209c0505438e58352f94e9fba3d5a4266b07f8553a9d27c62f17f9a73ce7ae79c73da71ce39bf37a8534aa9534a279554d249a9945648d24929a5943eb523a5941e49c9cda0e5b9917e9d51c7954fb2ff01f2a99d427965aed40a6220b3e3054fd2007cf98f08f925161e4224a75c898565fc438824184ab08cbfa71277da271ec21cc7653bfaf317d7ad7c62197f3b857c652e7f37117a976f66407d5078cc8170fe58c779e9f3cd8c5bf5a7f4690b66385d4ee3d26fff9beee84f7dfa3b4216d03eb2e25cda31fe71f6b3fa51849518762cd65f45ee587fc739eb503ff29676b4c797a7c7edbdffe03c3f09fe339f1f8afff8f3cdf3cb9bffc8d5f31369c17f62cf1c3cdb6f3dbf10ff613d7f12ffd9e0f97b7ee9e43f3aeffa99e74fc17f649e03f01c3effebf94ff09f9ce787c17f6a9e45500076ac5700dfe20dec3d78003c15712c1290c7794eb41dbcfdff4ee4c022710078d8573166919a7eec3d51c722e9fc77f0a0b8413ffdfa3162006c009e7b0f9e46142d92155fe76dc41c8b14a3f9fa3f44a49b47caf9127cb90278d70e6d839cc7f996889463a97c4043023fe781fc0a88a5c2a271f03716e9c7b71ec752a1a121750fe45f37effad5cf884837aec77916ceb3de65a9380dc9e65baf1291702c15190d29e67158bffa2922b12c9503d090bccf59592a3834a4d503f91b4bc54543baf9f93222124db5547ed090ea03f9b6542a0de9e6fb3d66a9481a92eb719ec652e16848accf796aa9c8d09068bef5352212cc52b9a121d1bff1c052d1a121bdbef501f84f440a80a5b2a221c970964a8b86f47dce03c052114243e21ec887229214a4239a8ea5e2010de9e6fddf5289d1906abea5fa7ff1a588d481a5d234a4f0715e0ad211cd5a2a08a021b53ec722a92c52f848318f24f348ae9f792a9296f3a2a5f24343523d108b04e4a948da5b24f948fd48fe48f4e7732022dd58242a9276f33916897ba4ee91ea23ad5ef5f2371091661ec722dd58249a47aa79249b47faf1afa72269402c92f748df23818fd47ad61371018846b7fb43648ff1bf4498c7f86dc4133cc65f23c2e0317e1a5132798cdf25568ff1cf88338ff1cb882978cce631fe50944d1e637e9628c463fca098c463fc9f28953cc6ef89d2c963fc2bf1e5317e9548c463fc556cc1634b1ee3e744b9c563fc547c8ff14f91048ff1bb08c563fc2d4a2b1ebb798cff481ac5ba62f1b8a36efb6dac6338befa855ae00b793ebfc8d0f749d9faa0e9f4ada0990587057ed06c7a8141130997173499422e685ef9a81d83a69586f50ff94f3b06cda586f567c76e46d1b0fea0d943c3fa5b08d73ff7f4e7fbfbcd7f5cf6d97f64ec0ceded76bb79df1c8c83b9ed601c8c5b7177b772fb3bb7c2d56ea5aab6935aa96a27b5f3f4f4f4f4d44cdd975ac3179d4b61fa89b827eedc3061c2840923c340492809259ba09a9a9a9a9a6a93b4d9a44ddaa42d85ca85fc8567b3d96c369b71740ab134b778acbf722a3b86f475b7f410dd3f97fc87bb7b2ef55cea28560f6962dae2f247c5b1479649d008df861071b3ca7a897e907cbe27b04cc6f8472ea9f8477ea93c8497b6080bc0f312c31f1e1b63aebf47c579e592ffbcbaa1be424bf28bffbc5e61f8e5765c8b320796b914ace3e63710e128bf40c92fd75f2eb9cbd76b2e351377028f75bc191ba110b3ac3b8187f0652b7610a16f51411737e87b20dfef5cda670c02ffe6c67a9c2eaddfe029fc9c31629e0328997f2f332f7ebf7f699f91a75c6fbfdfdd689f3188e63b18ddcad7ef40f42a0debb7a22b35ac5f147d4ac3fa5f745bc3fa39103b47ec300debdf406c1cb1a51ad67f233610b1c1344cca1ff2256d648da411dd0dffe25e1ad62f233a948fd1b0fe50f427efd2b07e96e837e7d2b0fe4ff42d4284dd6dc55ba96a7777b790eae17cf507666430f2d62df84fad6158ab8fe44f881422bfe90bf5142aa5b8c4b2aeb7c1b44b30ed606e836958774f69584b3e1ad6128f86f51b9147a4ed2a3f84a304038270c646c817051e229f6f19532edfc8c0e38e4d0698eb3db48ff77467c9b1a45bd9b2f9a32034fb8ee221ec514b5f5ff5abf7beaf8444fdee3f95da27485adfa2022e55b8f4b174eba18b95a72b63304121e1a5a97d82fccbd4ccd23e41eec6d4141fd7bfad846383d9729965dd8f32ca97c05c7f5ff2255f72e954653847d959a670944ad75f2a2d35ac4aff740f3df44f5fb9d23f8d0412fdd3593ae6ef1d45c3fc5b887014725d88c7fcbd65c7ea852bd08e2fd5df4aabe18c8774b6b7743ff6525494cbe7493919d55b7848f7eed9b1ae7ae955f6ab1dbf3b3276665c19158711ce8ecfc7f89278346cda3114927534ccdfc811d9537e08e511285556ccd93df75dfdbc5f3df8df83ac6f3dff2be6c38f797e9c9997f91921f94434ef7a1a9d86892ef11bd63f23ca8831a2d8125922288662287e5f153b711ec9c886a2c376563bd8ed3ebb6b40fb3e69f5d36ddb9a11f7dcb7fc7bd237c2e959fd8d544f5ffd46dccfeeab3fbf6b7ebf517dce7bdabdd1eafdf94399d6fcfafd46f4b918d5776fe4c98446de7baca4150db4523808bf96b4a2b158ab37527931fedc7c23fafd4a4068adf7befba4152db4523860d99aaafbae6fe43f5f09080dfcac6779a5fa49dfa8fbfa3523fa7465e7d78c54b67ecdc8bfbe51f7b31a755ccd884e236ffb1d428cecacf0a623a076f34a40686e6bf36b491ccd853830eacca0b9ad25b168fe4a35b429242795d29a520242f3af49e1206945a795c241cd08fc9a97d2024203e29209595eccd7c271d5c8842c6fa615f3aa9171852c8f2666c655e30a65eae46668c20d6a5c32ac37fa3ec4f1541d7d23ee1dcb06373ffe45fff5b25238a819d5d5cd0f2b85839ad16a56a6c1120d07488d4b26f4dee87bd6d79256b41b2b85831f2f5b530242b3b135a3d5d7b8644296a7eae81b7def5f33aa5fe39209599ecadfe8fbee6b46f36b5c5f33a27999af19cd7cf835a398677dcda8f5ded78cc0efdee87b558dd5a1b1a1cbfe8c75c9589c18fb0aedab657158d6055a9d37faec7b365c5956d9afdad921c810fa6b469cfd3a8410fa8da6ad1d827cb7b343e8e737ba91aa276fc64638449423c42fa47aa1fa42dd0b712f445f68be10510775fb898a0c491e623bbeea875476c4a93f54edf8ea7ea8b3a38bfb21ce8e21fd216ac7af613c34ed1805c8f51feaf7e66e1ba5e64aaba36a1f228e23a2f4858854aad5137d1f51ab1512c9c8cc10b9d310d5d4d810bd5e483ed1eb857ed8a0212121234684e40bb95ec85f28e685582f34dffb23f58ff40bc9b6a3909c9a9aba2d7fd8f125edf83676acc171d1d8d15d767cc5ccd85126c68e2e5668c716cb8ea107daf1f3ecf8adeca88a02e4ce8f02e4d6310a90dbd9b133e372fed40a7130353575a71da300b96ec7ce8ceb3f1671d76d949adbf62567151ece067288b4fca3a6c501b99936af3ae3a2f9c21899b0685efa42ad1ba546c543868ab83b5f2801378aebd22143457dfd85fc467981dcf3b338eb5af19028dfa543a2cc4b874491b943a2aca2f49d16a761724894f0f647615d1f1285bb6e751a2687b4f52c1ecf1f2aea9e7fd28e5b3d7fad2b15ebf93fef6381cf1fc684df723dbf8b75655c5fc4dd992faab942ad6bf3fcafefd2fc5094796dbe68de9a2f725da104dc9ba12299fbfaa1a2d5fdf14351b87bf3457d810c0d158537e7878aeadde071bee87585fc723054c4ba4351fa72609b65f28bb82b3f477496c9df409c2c938f235296c9bf11552c930f44ac2c93ff43ec5826ff25722c936f237e2c935f237a2c934f23ae5826df25b6582665b29065312c9361590dcb6858e662d90ccb7eb0ecc5321b96e1b0ec866540582693c9e41fe5480f1372ffdeed3431a9e51bc23983e728a560c0e0524a67985edc9144c85dbe8141c71dff4aae3d8daf4c7142773db9f1c1040d82804193141b679820080f5fa12b0c81b460ba018e2ca42002cb97a7ef490b1ec29acb3730d2b863f8de02ead37d7e8143f8727707e38aeb5568eeffeeee5d25645dbe81a1e5bb7c03c30830aee4e18d58a65b232dfc5a829a34e16febe4ca37ea23d946bcda3edd6295cf2ca5145bca30d658630d319c485abac2694a521b6b7cf1784858efeb7aad2e1c855c1fffc6819b1c37459d86d1a0a2b6c9ec721cc7d9974b5e9d95d22f6c97e3922ec771744e773086b8febaaf03c6941b5ebe3de1c135f5d252382f68dcd5c1e3b8eec7ef7292e3b89ff5398ee37a8690e33a71725fb9cb3d395d8ee368cb10f29d3fbfb2ceec2b4668b8608b33dc88630d3568ac06d771c63a7248c89394216690a38c1c6e40e32949f594831194524abde843b545520c565ec82069f6fa820e1c247d4335e77400134c502851c40c5a7c71c6175f805f78c1e10b28585f6cf13a72704a785e90408a0432340e2d32d010410a945290c71566dcf9e11077beab7dfc0b227c68195c976f5e9c71bdcb372fbe78420ac76eba1de53f1c1829c549288f713606cef6850b13a52497a415189a9466fed37dff28843e6d8aef310e8a8a3714984f9fda18ea4f1ad33cf975454e8080a4754fe777d688fb496b5a28205d204518365afdf93523eebbafd688fb188c3a6b7337e8e8c1469b3fe9f7bffc6786e036b19bc6ce72e537dd50803ef714ea8602f3b99fcf491a1543d1d2a3ee0e0433ff691abfd76abad25bcffaa11456affa966130855a25d21100df7bcfc620f3a07bb498775b64cad4183057fe8cbaf23b29a7f959f333a69379b0be07be077af6a65fd536288fc997f972d361ae7c562b35532fb5952b9f8a43f441afbecccbd81862be3ed340999ff9191b43f732cf34efdb1669d7cfc4bceb194ca1fb995f52baf2412b57be4bbce1fe88e67a8f8a43fd29b45ef5fe4329ac9ef5fe4214a879ff7deb2950033ffcd57b124c21e6eb4b3085ee65fe8429f565beaf2f636fe6d734c1e031f931a2ed664aa62b9fc63ab9c4a72b7f46bce1b6dcae5c89a1f8f2d81091bc4242431188c00b0da5704381d5b77ed53f94c20d055a3180df7aa6c97cdb22f4e7c77cf75ecc339802f89d8c1823def41fd1ea7b138c00d3a6acbe4501ef57df600ae0b71e4ce1fbd5339842685bf6c69f05058a9f5845f6d84abc717b0277085faa787344638f198547b42b1a1e77db74da36eb22cbe55b1757ba8ba5db48b48f7bfcd35338d6cf5d45e5c30c1bbb87db3fc65c8e99c01c5d6e5d70b9457dfd87e46df907b80d3e80bbd28977fabb8890ef1c9a77e42f29344ce2118ab79d963cee30777ef75eabd639761df7d38efdddd3addf69b1e572df493ec27e39efb77a7e8ffb70a89171beea393b76bfb2372570af7aee55753e67b9fef6e1207b849d0deab877b0011c4e575f9c486de87ec5e39e134790b7dffbe46b01e6cea75a7cb91d5cbe6561c4f5fcfbaf7dc286f187734123a3fcf99d0dedd7306f5bbd9809d01185fd6c10f7fd23f7f47146faae7ece0651fbbd03973b94b8d831a583cb372e6170c1e299ce1ed6840e2a52c0c7d40d4580419b62dcf9e11477d2409bd38e6e9bcc2e78f966050a6ebd7cb3828e2cacb859010583f95344e25aa6e26499fb51c8372eac5c9e3c847e3fe5213bdc977471bab34b02c8206c7461bbbc0595bafe5e7710a10473478692ee74bb338c3bcdd808fbf93686157ffae43f44c490ea188b1106caf64529eafa184b1de33b5230d79f32f9cf849a61fca79f9ef82644c8382b17d2d7943da178485ba2ee8582faf91275d69b58e62fc3b0cc5f367de92b615bc907cbdccbe59b1857eed85fae7f13118ed500fce3fe3fecd3ef53c898ff58802b522c0cf3f7296401ee38c3b893ff502638e63f6bf8fa1fe6d8e8c11d3d68f001ccc5ed07128406216f71f98e33cc752bf0b8457d6794f907b80c1ea1775a4a65e784c7fd236d3321f7a88a278e7062234c0c629085c6615cfe99340b78dc3ecdd92a8ef5d6ef7848c7f1108ef210ea3cc49b87b4e4219265dc33276d10f7fe1cf7447ab657b997d58eb55eeebb8ee3289dd3bd79487dee6509dda59513eb735d3b2bd4dda07e9fe2e84f7474dbce213ce698dab09d868d308f7135ec867bbe95208e3bff86b346fa72cf37a82f973e910530dd7e28b5fef19bcd669381d66f42fbf0ad0aa5db33376ed3c6f092d03ee16ddac85177cab439dd91c1fc4c01a3b4f0ad0aa83b321eb79f132760071771027354112730c752c3f8cedaa7a5d2ed0fa3b2a824ca942b94999824a1436a46682441000923154040482c188d08049224c8f10314000f9db05654a0c9a45112e328848c2186104208000000110091191207001897fdd35b915f8a1febd55527610e0efaf606e4470a3ff45e2671f2ebde8b29b8a5f4259bb1258b70fe55afae2abc29bba51ab102c939f975af1b8b2702ee98e0f4d06f6f7c724af9a3773349ce7f7a1ffa93c25b28d988256edea481e4569e34bc7fa2607ce91d24aac551305c5c8f45e1a36f9d2718febf095037906076045fd7da3e59af13464eb2b94d83dafe80525edcb3a6874e7c095d6e9eefa0edeab548d439dbe5b7194b5a8c09b0ddf22e0daa1f158a8076a3184912312627c9ead1c9da80ad2d466a2d8c30a905faf2273e4ea6882a56a7d5fce1b7db614c4f99a3c3277dbd38ad1ff87b88175d44fcb021750b6d32a3f7de1637976863345ca320d22951a2a3355a7df03f09020e0085fb8e1420a04e9503890633fdfd6f438cd075f5a973a0f81eaaf43ca856ddc37ff8f16419ba0f1a4144ffa5e28b2beaa2965508772c020a5decdfd87c051c1ec0d54b288c2922468b932e665f34f066802ceda2d38e5e037df11ac3fa02ba694fde044e188de392a5a6eb6e537943b21eb4d10d190736e6f40fffa68b4f42cc0217b771a98b44a8190883fe702ec1692604106261683b5bf8742eef4d4c27ca97d666af029962dcd724fd37d8876d9c9b27e37816e667f883a87f37b5eeae65407f94d652d0f14ab434f081576265a554f63dead8b596ee854a0b2ce3e6021b372af0b9553c59f900085c00fa8c681a9938a4aa762fc4d7f7eadd6f43d328a116de46d01d3b127fce9d1962296c0028cc646d99295643c508a85ee6f014c393402c880751f041fa66d4d7c6f7847e753a2b386469c834b25560df1df80d52405135715376e9e6c7e6ca8016107cbfb25cf5917475176d6f3cf2b925839bfe76e09cc9d9a1b3610d4a8bee2e07d1dbe351ddde9b73bab1791a81dd89c1bdd1e9bd79e64398c966ba942ac370a61fccb25d74c80a2b100e2fcf5265d469846542939742e75ed9792da3a0a0f2e5ff6e823c98390e32a1f0f6ebd3f4b29dfc3ffed369e5c5a3c0f4f8f0974a4c8feae5805e200beec5aa6e7c12df9a28cc5ab9f7be078dd9f4d1cd5b5184a18edb4a89d86ba5daec14ea6e5dbaa3a596a75b4b1b26d4e2a7b74636948cad314667d772ab25e3a5e2ae279abcbe415ef94c35354f539d05acb2b4c9b5b5f79f05522ed19061ead297bf134b1dc52fe99e60f8ece0d3c5d23495534a4691613a2251e5f5dd4ab84423bec98d1373964493ebac5f906e559a3d67b13cfcf484a4534511565dfb5a4a082a0d190b141bb36d0f7318cd5d0d8ededa7565f3a9e35ba59e0e19711d37ffbc33b3eb69b7c579e43684ab816e7e91eb62fef5e074d13518a376871f32c157a92ddc1b9afac295764eafa13c17767d01e635b7780ff1d78ae1497971b92cb984b0fa90f438fda1ae6d2fb847ddd7bce4c917cbdbdbed5ce5bb4eec20e2240b06cccb18429754d5d1030cddaaef808d8e207105ac0b4abf1f1e48fe3647278b2573938702dcc4a7546c13c52710679292ba96e48c19142b617ce9bac0bea7f1f8bf0dc6139c0c90b17340b135dbbf1a51d7375332164afd8d53061345d151f6fb20db854b43ecfa608f2b6a6b081f3f29fbdf1650853190ca194b3a749cfd988786e7acee418f51447c6af83ba49f585b92716866af051de80b92cfa77bf368575ac61b77c8b08e1d8dce1b4ffdeb2a17d9560f5c0c7b05fa484fcc36c4dfadc6794e9d5595eef14d5408dedeec7028759070f6520e2e77b002f5c5b1b8b55ec8fc50ebd68480ae986a3a36575017760a4aa1252cf1330d68506bad151642dc90561bb2bd335b3da1f5f761f17d7f844d23db389b4ad6614a28d864f83f5b2365afc8ce2cdb57834aa87527c5161437a87e6ad4059eb8e0d1763cc64af732d5f2739e8c2c90f77cdaa157c0b19bd419baca7b639d5e5f99b64b30621b94c19ad3ddc260bf1250f9566c34977c3c793aeeec0d1183ac2ff4402fdb76742ce54f0a9d3acb75347a57091f7dd2c303f4900a57c17389152cecd765e4053b42d64d38f9f49beea6f87f7a30858be818d3f740553a027d2962cc8a73eb5808baf96599e924cc906de3b1701843b4ed145bc630ea10d386543caa914e9506b7a2747af03df702aa74d1f81ad76f106a820d7db6c8391a808e3425f9a1e59adb208853a31fea7dcef5aec39f32345a50bb6cec8a5b59207368e92f22133fad7cd3cdd090c05adf3e874b6fc2eee561b726b105fbadb89a1f52de8d38d86d99cbf9dae038c16ac8cacb228b6fa5b87c976c65ca836f9d786d1069ea88602574f52df2662eefabe8f9bd14eaed474f2ae21f90bae1e6e0bf3b8a3d473a823e3e9a50fdd1be71fc83f34e7140138d6375b49b7ad8972ec74e747b811a9f7b8086146f552eae316a2cc44b17fbf8fb22636d28007cd81acb4ade356b2b068b94080826597d1418e7ef09b6d762c5f5f2bbe2b7fc00d7dfd1d175b6754cbfdf675080174b67d70de00110f23bdddf59e5be742a2fed2f74c9c344248f965363019d02ea4a18575bb80930453c2770230b1c787288983d9313570173744a81bcd72c67584801bcde83097d8c37b321c2d59a8d5486551c0cf773597504325eb97b3a6b6b48886caacefa5a9c327e61672326e92473b5bc6e164255311715d575989371f5004c96a46d62d36aa820c268a4ae20319a6d166f8cba072ae9e3252a30a07c241e3423a98a344a0744c723954ee030a6b7f9fefff1f40f5f7eeff4af2b3e52edd95b4edbe5517ac8a9b590a975f900813eae8db63d8c951c20b0054ea07ae5ab59727f7be146b81b9d694bf02ea71cffdb71ed15c24d1461e4b8730b381a12326d5f99b79f51c99550cc493d92f7f4d320e2cec7c6560d3335db5942f723f6a4b36c69b510fd5171d56c4c177fc6e749c5d1cc245bdb75c80d6e9f0a06ddfe62068af05add26584dfa3ff51999fed5249166025730da834b5bd81355c4f9c9456813781530b50c83648ce17d866f79094116722e30e68ac08e926b164861d4ff1b2be96576919a2b94751c4cd3eabb888a5661c67e00c62c1d727033b5c55da1f869d46ac50e84beaea2da2c285e69ab9869aae2706211ea7101cd5f00ac159ff85cb4013ca9d512c14d95704a8ffb02d7efd142af857c63dabab23756cc3e5e3048f3adce16516030ebb600839d12ff05a35f62245309b69ee4fc35436828bb638835db655a1b3fd11030bd2b20d081242a2703958c33d40b5c575d688b73f2d87fee46dd831d3a8e5c9fa2e221932fcddcfba5b2753c083a0b050632f259d6991429d464e8170be313ef1788d5d78084977aa7276770c276dfd7b6cbfab470c11cf510d47a06bf2b4a21143df42c529bba2a9323b0163f535c84935e0db94278b78408677b2c5e9ca7c896c0ef398096bde9e902f8b69d03cc2d1c5b2a5ef8ca4cd6011aaf5be4faa53203989680cf9189f46f0cc05c3ff8dd49770abeb6f9b59caf93238054640aa28f600d684f2cf584cb986b6464fbe2dfe43b4fe127543872911d274a10f06fd9e28044b8a2015b8a7436c1bea0042b4984ff2df97d6cf9756f73358ca4de466599c3f9121fa88cd333efd91db1adea500f39fd6c66d66b3e0596340ee31c21a5db0d794e55b0c67ec1254905b7020b5519729a5645eb554164a982fc53c11b4593a9593db92a285c9afc77455656d37a05abadf7be527f037bfd8bf7657edf13100c2a4677f34ecfeb7281b7b2e8c4f85d9926cdabfdfad62d81bf11034a9a169a9a6b83a02753df01edc779859a68eda859daa93199d80135ab1a2de2962eac26883e9f205e53b6971a696df6c29ad546782f31165d19076b19a11d841fcd547199bef04d5a49b15c57e393de89350838aa3ad17f28b522daa0597cc94834e4c0b8a28483f674f19539b42739014f45d98d2b79c3da858790ab0a24ca617c3945e6a24039bb6d64e45702494f45312d5520e98979d6b47b3008380209c35ea4a3093df0b66afc81c3512a4ec8a4726d1b9d01ed103c09a37716755a7be18ddfa73e3a68786a26a743d4812b1821fb90184741df5002aae2b18b0bb96e8493a80f5232ce0824541cc90eee597d1e92e5a1d33e585c38c81ec0ad08bbbb149149f25fb569260ae7242464697690102fadb7c2f65071632be17c7f974b0f69fd068b3684984ed30f63d7e2fe2c6da0c36bb9274e772717976cb96eeb9c7022981f320c8ffcf921e90bbc9e5e421a0aefdddf9ae068da7a31c70bbfb042dfee7a71fa47b9a6d0ac1b8d4422ce07cb039959ca364e5edd74570aa546c97b8c5bb1adb8ddd8756314c404581a2e787131d8261c111bf74f3981c09451df4fa776371fa530d40d6c24d7add25e031033d1a42f819f677a0d84279096006fda8d1abb080f1cc6c587ff530f92886b93d2537b241b0085090c58a391e7e8e3e94e58417ca5d2b1632a7a96a250e00f740ad4002effe2e8a95f43357d2afc566064a5d8fc5e1558abc056abed1a67216b9332dfbd82b7a902bf539b55e3b38a522d57d70c5e58c3956bf95dfd0cb9210416faae58b990e17944a021a54c311b8637490a608540df575595744ac3b97d3e2d273cc2cf8b0970347f4f20595eab1cffe7a972685961d7c905a536df6fcc9974282c7d9c02bbe3ba19671c17442444f6425de1feaf77ce0b3aca8c045501d12892bbd6d33ca335331f8b5b1da1fd0061b0eaf89e83dcd7901a2ed50eaf79d35ac3d19aebead6a70a69072dd43055140a93d50572b3a38befedc1602a7f60860a3a9c7737f53aa038b1d832cefe0322df5affa1ea9b02103efdaeb32d53e953e0f2f6e67dc22166d9eed533fb3718b52773a6e191237b44c206a2a21b517212ce18eff0610e22bcf511b5db565de28c75684b423f8e5b5946daeb86c2d4b8108e67e7d91cd638bd3a7ee4bdeef6b21b1131d392a0b60477f71ee7c21a345d8e6c588f120c717c50ec6ba020e56d3083bb2876d3c02d4c93eba033d5fc53a95858780bb33a6bb8d29bba6c4e04baddc157252ca69e4e7a71324c5754b9019f52d7193208dfcb495425fddb414f1c647ffbcbae34d67f917d3c5a6fd11d8708b3ce0863981656bd748047ad944d246b5d0ec0cdbbbd619eefb996ebf3ee9db7fd15c47112cd7bb846bb3a963efac2818ad5f1f23e0378b9d843906d98aaf46bd9b65b2c6d088be2c7d6602853b8c0a376b5565604b428749fa89ce4bbdd41dee579f732f54b490757671b4c816e3e434d37a736a4ebee0e3b30fd1401692491080aa6a4c5050cc85d8a40d112dbfb5ba080c32a219f9679c1076c166e36812d2cba3332122593268009a4389cf64f7d09ebefd682c6d5b1ff05ae11cbea4b33c1088e5d33053e55e925fc0a5bdd08c0132ae16bc5dabd43c34014c5437e160d3a1dab8029b931ac7eaecf1c5661c7b5ef1a1626649fcff68cab6d7ab1f1bb85c91c854e87c3068e674525f9affc9746f7e457b491babab1e69492aa6fa7becdb98d1c290f9f1e1af171b6541d1bcf665f7905e2eab19362f3d60d6b1cee0d0448e174b80d8e5342629b44c9842d111470c4103de2d891c2062d96d040b0ce65b8d128276d55ab09e3d0e5987ac41aa1c763fd92d836cae071f50b7c1718d214bb9a4e2fa3ecc97ed70e98d665c686e97892b96a9a1810f796005ff37bc62b0ca499f639580ed4c61077d94c6d9d8b54e17c4c2ef36e352af2029e3d46b008f8126d0d32d7969920f14f5969a11bacf2a93636742fe26e1fc88aae6e7eddcb1bc99cbf427a1154038b3ce6aa20c282be7afc0b02fbbadc9c6e092590347715a01a71eb1a20630999be02e646661c4bc38f519aa2e170f8985670988148c102ced6eddc48ca3fde0ab281355cbe5d9bad492bcbad00d97cbe1a0fe270f686501d9f21bfaba2abc01b4230718d184589c5a5b7143c1620d1eaf466b957fa8ed28f55f0080c5915415ad4c8dedb0c2dd5bf8190deb9d64d7b75280bfa7313374f89a8166c8bfd8101e61b6dbfa47a70bc4fc996ee4d9694930fa7aa023145e8b4eee7852d88c9838092b491029419f2c51273e91b2a60157a87392c4ebc3dd60895a1cd0de36f46146433e818401913bca3c3fee4d806fe06ebf3b2798755c7c4a890dd7d84bd399e409d34902b4f08cbb6a7b31a66d2dc5407da12dd5b885f436903b5814e68b2ac7197d5eb4c64de080bad9e55ddc8489003b46e550a14ff69f85606215e6ea5d0edb5338384ec4c19a4a3c94790c66bc17a2d4966463c129549cdfd1163fb121fe6b8f3b41f0f30fd401e91bb9e865c0c6801667a1c43bcb0deafb413b77b019fc46168fc64566a3a11a50591ce0a840ea37dde2c6635acc626e01d87cac33e9d37dc5458fc0b88d9240b46c93d59e101631833407c1b5a0e5d709137647e938cd6ded6225df261a543e8e870dd36a31369e0cf76640456c84af86d3b5d123ad92dffb1b911d226e2cc6b177ac933ca0e1f8dca174aa33cfe5f0a57e21e1198c6f7a8c9458a81b8aaaa826ba767dfb5431c352525f79a7dd542cede5d1585da69b58153725e153cedc6715a5d2f9af11c51039e37999df857a2b50f5f2326a8f3631399857bd149ff8bb4e49f68385b916a29c015ca9092f953f9543b557a8f1320fedbf6b49488fa57239573e81bcd7f42f794fd98820a5ade3799ede1a07ca994ace442c26e3c2cc54b1b3b13a0abe62f8b2790bae50026e3304be5260f9df67c6a2623c7fd78c2910ecb1e818ddc0d94c16766410660531a2ef7a0a6f19048c70af3640a63203f71dff53b247858be428838836d08a9feb0f3501179d6a1e63251dde49935cef5a1376422d2dd1652ce68efd4378425416ba79dbc7dad6b511c4eda675840c5607c704099bd7b5c230341ccee67fabe792f61c5885e2f06c4fc0dcceec11123617b8441943767e4d0194868139e7117bbcdabe012a56f245e3630572dadac97f8e7a8d23cd7c38608f82ecce7481f1fa6e0cc3d4dea6b129a518a276f3b934b02be3f6bb930bec0625fca78a1de89737a89b0cc1dbdd1e1d9e2b6a62e2a1d7cd1112d634004aa7fe5858055ba48ae648bcb81c512f4306782f350f80ba6e060077f15eab06aeabb6651f6dc5f8248900bf5301a2bfe49fe94401c33735a8e8276d510306930c43fb1f3224ef0831841ac7b879ff24250bf801139ac076a3f72a2ded7a32ac812d04e3c0110d2867e410748cf0f7f292911e0f06adc2bd433dafa62eb6a93b0e628fce174fd60f9a70ea020c09c956245f199df6583ec696f1c7138294afa4d734bcd086838c246033b26e231b79fed9f7c4ba72a3ad38586629778a4eaf8f631c981072c569a2d9fecf82267b6edc389df952189f0789fefda15d21a1f12f200e855e558e8f4cd6786c18cb6ade4f82963248ac3d2d20ecd124be021a4df359027a4b28afa305449c6ad604caee4a978d71d430ee9beef52817c9561432db6a588a346b59e8162d47628131302efc538894e5d75ddb5e898f5998473bc972d5085832221b9a69011368ae6f80ba48c7b4f82999c48c8b57ddc88d1254ca1fd8bb442da3b4a009b68100268e8150f869056aa1e9ed1ae1d9a5921e2293de263303222dd3d51ba8971a660c70a34b2d6a39d895ed1f69bd64d742d454441cf63db61ca4d9235d11d080b04886f58bb59f09164ab05b937dfdce669d31f2bd59e36fc94507043cc73b89861ca257a20838d169bbde00d4cc4eae6332bccb57ae45e217dadadfc5f8f0a5120e32fe6fc2559060dc25f523c241554ae3662729ef192cd25355c1c6d0774aace5f510de73bc7a23bfdc4e92ee53fff5ef60a60628da21aebf4c4aeffec8b4b40f710945a929f7b0adc2a39026bd158cd9a67ae3cae6767cd6f3593f92222c603e616128cec95764fe0ea93f79c92460dd066d6b12fd4310ffd32b5da88fcf136c8042bc70bb0b56121a34913e2bb4eeee7371a612dbde9502541947060305869a8e2a46483fc3016b55b4d4955ac3bb4d9dbc17a8f7c183a6b42c5c31b55b1fe6669fb0cee89459a1b4b3e450a01f135fa875cdd9809c3e7e640eb67bce5502dbe590cd0f62bc8e155d1873ce5a49dcda43fa872f1b6fb2b15af369e679d3f55aeb8395c9baddfcef18290cd8c4d2f2b93dd4be91a159700eb9ac4c30df9f246d0af21c235438a3bfee3008de60652a51502fb4a5d254e2c10342336e3f7bd869ba5a2a50bb95e186bd6f6fab57b078773a564d964c6f4ed6678e54a8a5f72801d19dd69657fbb2438ac8625384852e7fa317f060a838c4c54a55184a172109670d15b3a2859b5997eb9c949bb657cb8cfda1cf33c94d3f2d1fcd36a7a22a9bf203961b08f0d2f3c9611109959d2519c4de8618dd884b1f4e421495b69fb7c75ed271380d14cf2398444e1a20e5ed738e53074d31b08b8152082be12f730a46d7a9d28fafe8c88f81a6e1c1114b42f32eb008257542a860be5a67d0f1a968faaa134a2b54285b34bb5f16b83569afc7714214a3402a4338a902ef739b1c0cb89d6070ce83226d3b8684774942ecb6d9255fff5d3000bd4aa57fca04a345665bf49355c8d52ab7d454a1804ed904992b928516d408973ee851572ec405f06d9b10891f6c23cbd7cad35d59d905e827acc38bf67b23c5d876737195b27e186a4df420b07bde5fa616fa386ce3d8208b11b7e23b7ebef2f6409f31bd798c7105c004fb3a373e0a4b6c33486fc24ceb9bbebc5faadc16411365b510291446c221431a3e24f2d89b169fb81d20a58d8b925492ea011564d7ebd8acaacaff4d0a96345d0295558badcd125919b7cccc5b6466905ee47fe14d2115213f4925fc59db1c4dc13b7192646059f363ee57ca6c69937d2cc1739a654584335e84ab60a9dbf2a08914e7d3dacef27d5237fd3e28ec956d2e528c9df98f60c3c4268cc75dbd252c988346f2ee30f3e57285bc68b10a977a0e737e60f1050c92efede35624d394311ebc52fb70f2eb1e9143a3e047c8926ca74035452ab849b2b37613f1279d864d9ca35a47492798f6dd5d7044293612235b57ea143a8d720dc2f9c827534f8a8e87a10bd87ca3696859386e8dca65c72c211490d3be747b70018e86acefc749d823237ef305ac656e31a2e7a54019f2307bdb49f58215026de8f565fbbfb7db7e1af7b18764fa5e03a51790bd2d78c67df666f0dbf4bbf3c6c9ca8558b10c76a015decfc1da4124414d2b10d35f56c591b330e232b3c0b705f029e5a809343fddc46f2bb28771b43e1f18a5e38ac22417f05552182c10038bfbb10aef300ca2f140432a6754eed55c2617a8686bd7ef78ccf77c29e9bd5bdb3b3380c02c6285c052c0a038f008a97dbd65f293b2f858b6206be64cbbed7e19ad6ac7fe0a399b588eb11f47e7ed1e9fa79bef1e1563234a23833094d55ce0c626e8e7ca5ea0db83f59c69c316b28cb743a0287fedc3c8218b60deb12ae1f2b6a97c5ef66ed768e40d9b28fecc2c9bb0a0ae493a4e4a3ab60a92aa3e9517f3160539ee3845468b9c263cabd3fdf706bd2df9cb12c6876e13b8196a15d6bef56bd6e6ec622c170a129637542dd9081894c369caf60b27a4df9f052a8ea75902577ed50b93d239b6c5a06643916d916e2f45fef4a9a27628e71b91c21a7aa4dd14932f9d59d164dfea4bbc1201bc77799d7aa26e68d49d431028df03269a10e5d89d6be2022cd29788eb873e1aff961fb0ff480293992d72516c9619351bc6de5ccd397dd674662b69e4ff35f175104c29fab04a58d31c30abb3a6e5d13ebbde9851e21b47d44b909e206281a465ac8a7845aeb56c614b5d5dd741b5393e61b83b14eba4166af07f8c3e54afc3112a331d94a6f4070620c696598361acc4304080975b42640c0c6cd0f2ba047207f295079bfc07cfbdf865b609d56da63c31f839039dd31da21120cc4a13436411fa70c4629d23942dd62a515e827c4a4c7721265361dc0e5afd9d44783fa60bc8dd1d397fbd7e83b881349eb188f320292c6c1b086647942a26c8923c51ab1d2d181fd629ae59f7bde20345f01f11359566e775cb3a953ea48f7a3facc31729d345eab18ad0c87b2e3751f80bc8315369ec37bd7ea8f8cb060d610a5afd9ab5f516f413890334cc07536cfd7d6abac7eaf2624e2de0788a2545fc710e1c92689d18c67ccf07c9a193b9c0d64d68a6ff4d2c912f1ea1a2e87086961a67988089218c9f7b4b4363dc5c6777b31ab530ee2a03eb175876714495c64a703f47ab4c0e76b7094b3edb7cb92dd174ccc8a86ad85e1d89c0fe406f283df48f9a11b203f3837d6e70afd606364ad5fe75f17ae0e6e8e3a4bd6498903bd894e3ac45a0f6b13af8aeea704b4190a3952c0b9693fd23c184dd94dbaff4cc3eaa6d27892589dd351bba0703c09f3325cf5948a53505433389f4f6532d28eb7a2cecc5d71b90f5a9923fdfa5793147936f5a87357af40ca3a336e036719f05359c9fbb03f5515f1afe77288eeb2cc53141ef810313a5e215230fd3f8d61a375d03f6e12cf02f38408035dc77caa6d9943fa502285630b4a2bde4606c73397898667246453236db0ce839f5f8deefa388858860a4d1a14c95873b2322e562b41a9adee44c50406d7798121dab8b2344c32a4983a0781188562f7b9f344914dd245b264505fe01925ca5718136046045178f2239c96aef8bd7ca24cec22307156a2b500a6c73dabce31b60af431f7098d7f1e51a474a7c6dc6a1d7930ed1108f7c7911548d6f0aa88917d4960456ae550d824ff4efe71e1c4e8f64df1255488e03611eea58487c818d49236051ab8400616adbd0745e4f8350f27ac4618f396f0709d553ef4aaf9b2f24b30fbe3e9b731e6ed8b7c5b0a5a5c3bbb0cf049a212db8f818579e170ef1127c33091a1684b86425b70786b5ae586f2d94a51ab9f172154e1ba17b0d5c195f26dacda4f2dddd86e0a02a18ace11c4219e8ac0e49616465ae434a424c1186c65dc5766158d74359e8127b4d798dc46a08587d1314ff58efe21e6ae227d7ee1aee2320b457a27efc109d6c0ac42f859c729dcfdaa1fdccf5463ced72dec1efa94aa38d8c2f37ce5b8e027a0ae72f154c4fcf7f2332e6ec2fab8afb15330970ccb6c7466dd3d5c3b54f2218ba0017d372e8c96c30662818397eba54fa5c1095794f6844fa744d2f1c4d48144c852cb7feeacaf2e098e5adec090f7200ca15dfabfef2f79745097abba58045b313f0a043bac94873ddf1f4386e52cce853297b5d46df52429af9f7156eeaf36acb03734ffc16908bf080c04f40eec3158364161f5bbb2d32b3ed55fda4551c9740b7ab8a07b711cc86f5f61c6e8dd96052002347a24aba73d74fc8d42013b6c8ed77326b572c091726ea402d2ca58949d5a7b8358f89d17470790392793869f500af6da458620dd0b8815e55e9908eb2c61b57a4a88aa454f7012f2391676581d21143956903c3d96c29eaf2ef6742cf60ea29b65417908e6dfd1a5a996a03a1d541b7138e61aed5af14b6c54b483a7f48bfe6f328ee90114c3ff12d3f8deebff0438c69b45b5f86d6f93844499daa10d595a8034baa44112698b9c0620b59e793d079e47163c8040a589adbd733ddbcc1d1cde2d8e933ce3e85ef9bb4541b88605a3c2a1e2959b799db673ce281272d99913b2d8afb699c378c1af9ebb65605571cd482efb4500f3bce749199fe4158a08503d0dfe8ef5b5bdb56d85a2f532c8c9d66a8bb6bf01dc3934e19b4e9cc0f8e8a0109ecb5bae86954c049408f32f37bc0621e7377f9504f4fd80c36eb8e305727b12d202305f11e3287e7a524b90cdb858a00f1fb4f3c845baf8de8fb339f0622e0623bb31f3d43cfa84e8f9ee210d06f1f82b0517451f868ffe02c3265c4fe8048248be0c61c4473b6c6ad8043a2770c1b6c31941746c419150c39d9efe3388b7c7a31bf8b158eebccd6da19d04267db5cc714203e7f6f1f2304834da6589b8824c123ef2814dd7d46749b2ab685a18f014326382f7863d0d72856911b68d85e3ec3121f6fd491f70af20a18c5217b02b3ea3428237c0ab29cb2711f8edc717d7f267f4d11f0a81122f5b4b98be91239ad31026b7283f91301d24c9a6dd7c79c17f2cf0df12a6211fc6eb3f7b69c98230c9917d513be77c2aa1c0798f86c1e84f9c788ac88c5b4858cbbfa0789219d2e8a7f363ea22ce70178a779ffce6ec524a22ddfff3c54250529382056878163b825f770effb2f47721fc9d1657e1b2085709ab061b3a46ccec1bcb32c4ba9be61b8d73848d19ce6f0bd70d9aa3e382a8ae060a51a44b5ca88cc48544126f4fb4633bc0f946f15158241add68d5dd69d08d10952a32c2d80750f30a11bcec57bd7db3080c0cd68746b9670cc40c40fa6fcc97f0c716caeb8af29712eaa8c24c826f13b49acd7e0922e6f025da6cb28deca6c40da5f6249effef7059b271d46d9f388dfc19be5d099ee4765f13fadd8c1e378172b99147680a713aa160e79ef2a57a03ea462a51ca00993a4751e7b4c4e0db3c2fb8d5c7c508d73af3b4cbe1775bc8a9f45aad3d6abb982214d38df556b872865a5524711c55bd04bb324bf1dc7e2e676cccdc51963478874cf3856182da88ab829c32c24a29978e86ae30e87554e9c302e62b0274b04840032bcbd3f512da9e038b69640de180220813ebfe99c3928f3689ed502eb1f19b8c3fe34ae54858ccd4181bd02c367796eca3edb18410e5aee094253c64b70440329c3fa5603a53868bcf422cdb434a041e1c645eb15306042ca825deeeb0fbe1cb688f25b6bbfce51f140bce99f01db402acfc49dd3e63733fc521ceb1c0b01278668631fb788692342ee8f6ec01078e1256dfa3ace7a0f394cc8d04967af489a75254958207910ca019d186afb9851bc075268dc78857a2b061f683261f5137ac9effa45087ef2ceeb83f443ef47895ee83360d929d5d4abcd05de8208fc43b157eb6ea4a756e7cfe2f61d19ec90e7da22977a03da06f838c7f2a7d89d699a7b75c5e8ad9ef4d5b5a224e2287f056a423f476e00721b75ba3d689206953a3a2074576a3469d0b88dcb64e0d1782d46a6d54085c504fdbc12786a8ff0e04795b15b51e289116d7fcafd7c92af98701831fc4c1117c44b4e93ba0fa7ab1c4aac61e4298f2aaa50190eebe39117dbf4d31e1661b08d9479c7b4751dfacef70c4056e55c6ec2e08dab80a84137703c677477a4af0e84fd893671dd5c7d48c9fb2774b3a15e1740635404e7dab2b7cb6f33245e7c0a8416092626d8a02d792b029b882b0fef0bae832d6e0bdcc2b131f892c0f09d72815d3aa335f284b6feeff47d9740988b7a2f3c5e6ebaec66afc2e3f2752caa911baaae079479cf8c805a4e944b56730ff9025564ac66522840e7b99eb135a097f9a083238bcdf7936f2dc8a2638ced0d7fe0dcc295396f41543201996cb12eafc28641b2c0d824a042c0a84fd8b5bf4be873f5465ead0dafe596821abbba74ce525fa9a39b76dbc3dac649c318dffdab00d11bb538b88761d5ea1b6d023406d4cb3f7a4ff06070dd520032709a62dde07c6cda0068eb4647d3f832b1d35441f92827d8d9e5063304834c305c341a58dc05f523a2a8f063ac10d94b591f832b271062a509690c22a1ec7712e1568141f080c04aab11f685d0c10759afbf234ce0dce1cdf85ac9037d9136a3d7759b1c5e813f492dcad1a862a93742be73424d7f0dba1875aace73c15f337291a74c6143ac0735e54c1f1170a3181ca5e83edfdb0ce1de6b65dd74189b49eabe2f2d2928da724204d7255d637d4f0d19ae36bbeee011905da613d683b2deb1d10a92508666d2eca4416349db0a6461a5ed4f6bb19cd3f68f2ef4120c50a91ef92ee53c75b13787749ed3dd60151933bdef6d7c5fe2911db6351f4ae9f1a855a71da9209ad604b5bc5300f33b78ccb58a3692f02e52cb33b5dfff698c563bd7e72e94d4fbd0d93ed0281bc044f3b35095716adc0cfdf3a025345ddcf4e25577f9abf99c196f6a788b9fcc51c7ee15fcefcd539f9db6423dad58e9a2f8634cb9055b6cc037a4cb7ba68240cfe74dec57cd65883e1e77515748310b862e9325c542cf52e799a9b8bb41c4289677cdd6fef7c0179d1640c04ab3db9bb0258a96cdd0f3a799de04256ae3ff7717cb7dccd67a32336e599cbf6ae310005814ddcc15e919bba79f9e8102591711307978f8d52df866ab71c4fd6d846a92843b0b431644e6a96e0be51b3d83dc3913776ea398e3ea7478aab63868bc8e15798011149694aba9e4e374961c8c96b7fb485f4ce7bf5ba35a1894d59379117d362ce65c42e00539425eb2ef85bd7bc011b89c87c18152ca2a5beaf4679b153cddb0132c40099177472a782d4ea32076d33f9deb9bb3b61a9d586095d3504abb77dee2a606e30da570dcdee5be3dcce8b86eaf1fcc986e1a2d6796c9d8f7636121a613158ac62270ca954c21ec581acb6d42b0850b437755ea13e1bfdcb89bf1988956884493c4f236e77ac093fd13b974c6151f967bacfaa1f94d311463fc33c24c9a3db509f3d6d760b18372907e29f2ce2125c66127c96d8aff1be1144d94b0c27433dfe85d99ba9e7e32988d0ca1ea2158fcdde72678b815480951479bd442710e8c6605543efe465c9ef581a5d95a7ea2a3d12b9a976e5348aa321292195e9eb552e82892e70eaefb63f8136c231701cd76a3a6e04d7d9fcdb6cb723bcea60a07dc1033d5f354235930e07573a604e5244abe07b321a0e1eb83a2217799be36d7f477fd3f4d16e54aa55fe36f379403311c209a77101e80ebbdf9029006ef9662bd8a32789141991777774e73047e5c4791080a94e72d8c9f0e81850a7ce64d3f674c372243daa9dcebf7c49037e345b180a5fc66f10eb5783365bafab8d28db8df95931e89dff09582aa02c48eeab012d87ff8c37e77ea3568558121133d69c804dc5c4ed292b429028fa2b5c483051a62d6aa112a9e7caea74612cab37cfa7c096ca5b168675e93db009b961c915053c8e156bcc648024173044bb3f21c3a72003e215fad8f6b534b07a125f0b1a1cceeac16bc9ceaa1c303e5b0ed3d8b4c32ecd095d38f9141e343459d2450f25f79cdcd1db1825d5e78f7dc763b75fe5c8059338868b0887b9c7f198e977a4dec6585b72753facca502d279d268a145b821fc4890f3b4965a80fea6631b7fc473d9605c7913865948984687293c53cfd547695b1aa84483b71c814d2066ab578c18ecb664f1669dc88af8562db15d6c8337407d322b4f028afe34f83d0fcf8161c4de0d70ab36c6104858ab93535d85871fe32662dc80e6e8448bb6d5992e99b2c7b3be5000ea7c5e1f25d21fa45faa30236f12ab6a412facd8a23c39291dfaaac720d9a34b04d489cc06893a12b5eb6e8fa3563fcfe5c7c5572b7090966a33c0a5d27d76a8e0c1ea50041930d31995976f85ec3c995ac242fd6f7043f94ffbc961e1638abc89efb0e8a99d7e2d5f8b6cbbcb023e6f794f7ec946746bcc176c0fadd2706c4f8a011942ebf8645aa2159d3501a95a06c470bfc35cf7b67c00328de4144d3315de08418711cf5d291e61395fbc37cc4aa3d3a6e379386e0323d44ddb4764406d75909a7965a71f9f9ad625d43f96769ea3c3be6a42f83824039c7ac47359718e07409cf1807aab304f381cc022c1dde8ccb95681c8d6da4d176664d79b18f9692405b58eeec58524986551330fcfbba6fdd2177d6d485db5be4966bb08d793e906fa5e24c4d724610eb6837a0bc678c3cbba16a94f1c7dd75908459e1653d2a4a94c2deeb7ec440adcd5617696725b5f69940889c0531b588a4631cd8fcf9a45e50a20364ba8740470325c0ed3569305e9af419cd01dea608ebc3fc90df2b7820f0d285fe9d8e37c5d7e69f5a76068c49cc9b17423c307091a446f3317e4675600e610546f38c1c01bc2cb2f0f3cad273c10c908b03269ea22df9d41c1918674183600e390aa143c2b62e7aa2484a72a7e7c31ed2d8ca1821fc7b37fbfca8b08b10fcb50e7d17912c11905fd3dd04a7da161a5489941f4c23d377dc5dfa8f3e0d729830be6c5079f17392c787e7e71067f152f8a7baa757276e0c56d8d51da553a253a7b132669018fbb922fc49fc26f5b75c6267d998946ebcd349a123e51f05b36b9af74a832fb0c217b2ef32492ebdc8e7e0ce7318de8d380bc3b725d57448b853d68404204ffc9c38e6fc07a8f4f70e823a0817d24b43410844fba8efd80e81d4a49ef638622a6b8b314590291d048cc003a80fd976a46b940d1547174bb2eb1bd701175f39ec8d6397e0740c80551384f3ee7c302cd496e55f26e612a59b571097cfa7fd0638645f76e1f51ba400950797614fef95801e8cea9503b983cde9beaa2074e0006c5ab206c6a42db94ecb522134fcbf5a8dec925fa5a2890dedd427d484cd9ca65fdee2aa9310c3ae911da4cec5f687009490c54962aaa954485a265d79674bd3e41fa708725a3844582a18d84df11f6045f320f2b20afa0ab184b72fc999890fc6f250539faa5df0718f2df6888517847a5a1622fd61fb5b7f243ab841d5cde90e7f4cc6b896674c8bc2b52b81e4681239503c9c7b9e3990a9c47207ad1d4e35cd0a5d161ad539802b6babe2add9f0c6b40882171fb7fbd716a845bca85135a0a4fa9034c02eeca40cedda884d2c1499e7eaeca4fe6b6ca0f3260450c531f78f94ca2e77aea7ca1786d849e2d1a6860a97a891e1cbf628bccdef0ba96b04908bb7925ec78c18a31ca5030751ca32410ff67af724c9bb89876280cc25d43ec1be1775d9d86f561c4a742fb80afb5830bf2cc81c0282348f38b86aab2c4bc01539c67f1fff315f20ff9170a087411b4ace2141b1170bd3991766713744131090c4008258d5e5b1a28b79df3b74ca00b8680db1415582282c188a2ef8a5c3e60a0214333fc88c06439122502b392eb89cf05808056fb832ffb77c41ade9563b8cf48ead08c70be9c168692978781d2416d5bad28c9060b9ef400a0e595a0966cc23d13d612bd67ef80f51077b2bc3ba4478d06613a37f639184f4e911c72c6572cd370d9e9c4edecab1739d9e99629a20f8112e99c327a909322eb8b580c95ac0118ca59688bbda87a9d4fe20d4b18c5c74f0c430434d8b1f4dfef2086b509e2756c6b70c92f78c7258f2f0b7b1eaf4dcf47ca226edb46a4eb643b7ff67feaf7f018fbc844019c1b81440368f432a65a4f2d89ee8ec3965b00d01ca3c0ef736cf654abb6e210246ece94873ff1dd37c92566720c94ce78eb72e68eb6abb88064e834c3669945c066d0e68c6ce1ff47438d27ec3e1a1750e045526ba2dc5ab4ac34926d5772bd7dac4db19e4bbaa593dad56d540bd606d41dbf3f6c285c036ca8ecad5f5028a15f575aa64ce56e534a30e1ac7c8b7659957f46e5149121e24eabd13f6f53085313155f3781b5aa829dbbe35ace5443058e1c30c635c401233cc10bb2991759f6754c18cfaa62529955a727eb43d5407fa6c1b343c1fe86e96526a926dd56a7709ec81db783191c38f56787de29dc6922a07d8745d9fd60602eaacaa4a74d9492d9a525e5fb3ca288fbf921db18f1e453179ca899e813ff5d80bbda0e57dd3744ac00a0e1ef0461945a46d1e8be3a7295fed6bce24210430a2e644a0c19d4c61ff23fd833564cbea19c592051f83e97a76fe4c5572b0891423d8dc9be468bf3178d4d53ee0ff57313822c9d992c45e105db957f14ad70194ac9939a64c8e7466f113e77e43f9bdd295e1046938fa93afd3dc6ea8584a4a17d871fbe9a2ec19dcbadfd6846269fe4e02b59a5a4adb80837080f4dfa03267888e2301bacc541f4400d2d1322865c2dfad9ee7133d7f0ef081a6b81c3d94ed49713c14a4c77705d42daffc8a9da098a5d824e714df73c93d2ad3d372862d4dd46117042dc3833534f08fe2ca902141772c99679cabd1c3ea19631d00b0015d4a1365e8edba3c03c2fb7f5b9a2d1542c4db72129e0bbe9dd70cbff1cf49630e09c386d788a98d393c83c3f1965ca83ab6d041f04639d80a25b9f87129e3c0325c7888f41604683ed90bae42606f72c9a42372c66f308f0aa29f0a9d7066951ae77314685182db747607ba1cb6edb9d580cbdf8e388f037c59eab9a906ddda6df7f689912d6c7efe2b1e7657c7a5d9edab67eadff234ed2ffaa4b7d482ecb0d6fe0c9ac6d3b41d285fceed73b402fc9450462c619b9fb481c1aaff552191f23a29654d050e56e89a051612822bf0b4925d9e3616b1831478d8d91daebd6fbf5e6894833d2604c76d19f2b649375998c8253cbb4df5139ccf3e590e549c2ebf7242cb13487308d1ece1ff0b40b3f9415b5d92bca652425eac76c7e2a9b17e07dfb70feba5f289bf7752adcede1a4d844e07ae600b5ace9dd6ccb0974b43b2a2ed88407a951c6eb8cddf001d3d5aa895a9d9c8913022a3ea08096b74e0c7db29adf5e85408da341a13ae2e73a576310e9666c2d86b3480bea909aa3d009da95aaa06b7103009893a058026b66876d80071d1248f698a843e005b690e58ef3602030c1d8993d995ed26f69a68db4be98e8f6a312e13522520462e293d68edfa5e29538b98009f021d626a3b5323f81823725a965f046ac11d8170f69f4a5049189731400b14cdb45028e4d56f8c2be9bc2ad4a98a26d7073b5e577abe85e75ed260a13add5d007963f3d501284d002aadbd23086486a6f227ca25a581ca7e20df6f924912585e9b6a5028e3077ce3a98cd95dc76de8d26e2401ec5032edc8b32c80e5f4e012ab51d0a4719517543aa5c0f39d1a0b4eea470a1f23913ddd7f4dc9d63c46b649cef7e159e6eb497af63206f24ae0a9810629af6648dbb293ab2ede093f546e940c23c0d9f784b82ef2716c7b0147b1894bdd1840fade7c0d609b315b41949a19af793422d839f5289036408aee437c47506681198ca74dcc5b027bfba1be0dbb0dbb9101208e9c8897783f0c5c67fcdb75fe22fbcacbbc8583e842352cb832e76444b78106b58d2afa4603507eba7b02d91769e212fd873b0b66b79692940bbcd4ec64ff0e6348f05c271d2c55a3c55ab2e9b9505eb60d488e61a0acf17d2792abbdf5e60bde559c432fab34d76d6ea8a966aeda6d78320ee13e4ad77052dce669e066b4a2d74caf2dd587b0909fa7ca4871aa96b20f1a9e3ada835b63f34200c8178e6ccef1bb622c1a6f34b5993f690915e3c17109f4b45ddf16a83df991a72005e698369c8926011696c0f87b0009f49631f99d5d313083b982492b2e3849712c5d0361758c3423ef69866a03d6d983698cf2ecb748d4f6c9935ac03ccde00b9b60015ff13a523cd7156f9d50376de31eb14b190d8e4e9e2c6f3050d533d2eb02091192a9aaf77bbb8678b9390a9c7d48b9b4573c5b1c84ef32f96ce522e8a65153735535f263f9223f1b8d0ba8c74d0d7ca265d0914a9838479ed7ebcee122173f380ad2260fb10d588a19bc74c7419d65e335c5096b1e628a6598525747be1a7c4be989d2e01f8420b8d0b2f72fb6725720600cca8e0d8238146ef8aba4d4d98df47bce23b5465bbe151248cc7b784d4acf47e5375fe76125a2391ae8088f01975ec4c487ff715c6a810b7825e9929216487d05a37802631d697f529a8d7cb06d285089aeb69b1189012e6f50d05034a037987b08b9888657aa5919fec5ce1886100f26654655c1c0e8eea108b4eba41ae6ae8287fd8e816e5d447a17359403a5bff25d7458e2d1ecbbd02109697698cbdaa485794231509b6d8fef46d9f22aa4fa42b978f969465f88e5f36817ecd63fc065560379b3a004eac82bcf37430556ae67c93105b94dac888489c4a8646e5ed02a66158b891201d7926bf9cf7fcd1f218770407d55ecb9dc0e220dd025eb046aac4362232962586689ec559b25e4c88b6e25e64ac41c8b7e02bc5265b9cf26c59dac39afc522caa2634521070743c4740492612a0d156951b6a11b060fdd247cb35df660fcd6c74394a0c9b262b7923f4c1f237fef190c65f601211e5cb2b8ab3edc3dd498238efe1680185bd093c8aa5d766450a469dea708f0743169cb359cc0724a434d8a2533073fb09b04812c0335a7c6820c80df6a58053264da9ec7f92fd29cfbf2e96b7bb9bd5cb93c26586e8ca6c565fcdaaeb715012424f606bedd45ea26d204a96cb6a568384723aa85e4453c712f59389a691d6f96fad9ec881d85710f45420ce6bca1cc0bfb328efaf731166674c9b048611ef0221ace41600e41ead131f019abbdc7d665218ca8383421e51a166aa9d6a5e0076b2261c8cbd3022ad893bfc8afc55b3ae87e82fd9b529743a845fa36cc728dc51f82b0c823e0e612f8869da4b1fb0f30359790442d6dc34d604d2822343bf4c70b59106267e712e2c522f4a6372d80d7d18cb1081b1517ccea25ee26d7a9bd54d920df084b81edff692e398d68a8f0c73040a01246859e3858011c49bf91130bf5279573dd15e8f504a56d5fd1d216058fab258fdc5dcd3fea8d4e55d380634a7e207ba990e373c718b97e2b985e385757b440b993c3fcaa035b104bf02d4b7977fe5879762b97b0af5fd13e1818417d0b8735b73ce876e062f9c637a2f41c93f9c2687f75687d33867bded8a95934c56aa75c88dd4961042682e1e251cd3549578ff13457458a9dc7c632ba516fc0f930d2f1e0bc622b7f27eb5a044c63fb324eff17faff77d433b866f5ea96447501ad71ff062bb725ffab1f4c84099c925617e01ae71bfa25de831f48cd7a1d388f60fb8b10737b0b66da4eed58f3404b1c2755b1e2ce31a0788d54d8023e0720faaf964feb4c3dc5bf60f0173b8291a9cde3153808019e64a6e0a609a08952929a555a72bbb365cb8b17084c4a8b2ac4d5c29ad104b423d4789e83c97983b916b412889fcf18861d70e687c04991e80f544010b27e7c153a1c73636a5b8ea79ca65598d961a194dc6d1eca4d52e65fa01ef40fdee807756e7d5443c489a8b8180832a4c4e397297928d1b1004d9a43f67bfdad88d91c3d7fd93d713205f38bdaff0612ae97613f6d01de9ed2eef356868138c7628eb622c1e057dcbea60829e643f0f8e623f8a016a25576d68e981fb5f431718e5fe40100f7e4f8ab9bec718d66ce0f0a00db619468188c7d47d4ba2c4380f298f6576b313c03649b57888700c4ce42e09e6b59e1cc9809d4557f52f6c8d2427a9ee509aacc3f2c4c4cc0884561ae640dc8153901b4b415b03bf20d8bd06c18fc7fad14352d140a0069e6307472434a71050d896676ed17d3e67bd7dd91185561e92f6d32a7c37ffb251a99d22a9310c5779e56a950f86e1f701bdadbef742dd2f7be5a2b60dfaec04772cd502a3489594fcfa44b396a3b34da209fb7983ce51c87f6cef1a0130a0660838d7c355822c7eb53731a05f970f9c3de624a2a3c04ed25f4bd27039f27fc5cfca333e6b78bad66d5f7cd2cdc39cfb52a01890a2c309071a99d45742175f4ae36e8897f23b9f051ffc1526782e138c917a9fc390e7f0aef4bbaaec2ca74082805488ad893c8f194f4cb93397ea9b43f67f19ef2fbfe98642ab59d9c9ca72813473cd239079a273af4b9a89db3669784eb3b28614875ee8f15e89858c1ba69f7e7d79654dfe185b557133bf1f388c3d44f40733ad1005f745ca64e6260d4842492014932dd2553f50fd8d377e7434de396b70657bfb85ee11db33f2c181c363d3dcb7bb282da9abfa4d6c5c4ed18dbd90ccda085917512511a7ca43a1dc224b39efb330e462bf61a261513ad6f24d29524d6ace7886f6fd47e528d57199c9f0da2fea4023e1ed408cc8545220a9c8bfc2b8328083cd72787b4b2ef101a64e020aebb60db37fef16e2e182db4b1b29b6f426b3f1023c134e4e657053b5b858ffd403ca331ea428446b38ee651fa41ae83bddadc5ad5a32908ebed14db5c14ceeda9cd0d9e0a4da975bad5b7eb011097562e009163f67684ed80fd5dec0a5834ab0505baf31fce84a075cece0413a8b4e584c357d4e466abfbfc30ba3d551f4f049e5d0b1c582b09e7c0bf7216bbd2e566536e5ed57ca52cec3c6a6e4e97da8be4dd71b7583f56e1b0fbca58cfa7fc7cd11085b0e14c6674ad1c4004c00bb3e4af8002988d3df5bd8c59aaaa5f4eb73a5f9523ee5e8fe0e0740fb27989ae2d9873a8982a697206571db4de5df60925bd5088ca32e39d4e53c9c7672507c4c1b2f7fc1a3127c73bf777814a0780315f687b2e79cf1085fbe735494d1573fa2c168e71cfad0b6fb143d2c21a39cd7e45cc7b88068a863a75689a8001c617cea6e903f7276659a99421a7ed74c4b7e21ed63d96275f7633b65be80939f9e3a1f446367fc1c08caf845291605cb2deb8bfa4a35c340e99fdf0961803177cd30bcfe33ce364d0c052e5e3374fe308c4196ac002900046c4d6b0f493dd14c6106a8cb0355ad4335e0eb7f8d8cc83b2844e52976d7f78301ee83869525a911011635bb2b695360fe6d5bb04b28bc57233c0a9975e809998672328eac9578cedffc3a2df8d21c61e5087e45948ce19ac55f241c8b50d35b7c629f8166081b044bc6b9913abd242e3359044ac73e5f47b641377dd94f05aa666e219210bb4ed710a7845fe70c2c0335ac3182b8c83a743c920b6295d0748795944709bbc53c99ebc4ea6631b45befbb4020f8ea97bebe0ab4c558a886e9aa634a4c18ea942eef55bb0a6594322e1c3cc8a82ce17205d1f2172c3f5ca18ef8066090674292d8dda1d58a0b9fee2075651ca21335b5866f35a5937ed4dd0403c966ae2f57bd9210bb9aa8b3f3d926aea1e098e0a9b6a3f5f433192e2145870185550aaef8b8e1f89634408803b4d9befda99358409202b93ea02b642db4cb8ed1202777b427c6368ec7f03008e1b348fb684ffc28b746375ec359838eeb3cbb120b5068bf069da98834346ef8d79d9b23da02f5cde66d030c0211989e866179d83d8b23df3b74a1e9ad14acad6182d955b1075b77ed16893a22698b5e0ebe39ff26986dd5e4091320d67227ec9488649de6fe8160500d0a54bb0350006a81514c13030d0f724e760671074a8bdf9c2faa3593ed278c4c27c9d03bbbab3612bc2e6b5930c611c16c3bcfdad757dc0713995eb44c8ec843644139235aac2d14d0870eb151b300eb481f143fe181b9102c1a4c5121b654756be79e9b199bbfc2d885eb179c39d8b9c4b70adc1618db83727356a5418fae013ac29761fa48be22c8eed8fd4ae4787a382e020a1b8b6ffd56d488580ecbb76fe9fd46fe4e8f0a628fad7d05c16807d2091650f513702ed8e1229b81e54b2fa03019e234c48f4460ecc960ff2b9341fc87608ca597fb97cd5c60cf389f173ae2cd31037c31072a29d2be60046ab1f7c6b23cef964de7d2103a8c96a6ca8d3c4ad8df8b2fe15ad2183503d23f834aa7440c955309280466266c8ba8908e44321944f67e82a2fb10edb81d38fd95c3658e901f186014d2e9d5e3113940d801416d4d31bcfb19ef6a761a9e9f99cd4a1e7e1d37feb83d2b946d69ab42f2e6112a3cdd322cc42fddc5640e152f14cf2e9d88c17607219bf551cc3cfa9351f01a8e9c6678e585ba6765f457b7ead533621a03254e296bf9cae8d9ab3901c80a6046887209b60fe4cc9f1b018acfdbd8fe20a3c17e9d769722cadceeabaa7ed52509c16d3889c9abc80b835c633e9eec167994548f725133070528e7cfaed047c2e149cc1dc880255bba4bc3ae96161328f321cf99f2d384a8f3418418c2824c054540b58d45ca946170c5b004355ba6f12a9babe92ca6ded9acd31f1d1dc97f7ff45b7a47901fe724d4aa885c9745f409d3ad6e153160d34fa24f0e89e2d12e42481bb27785ec9db9878ccb1429843ca18168f25ef7714afddfcf566e5154298bafbbcaad044f8dd01835f52cbe5c209c8ba10aa0b9b412ea681c7fcddbb0556cf5534501b636a62e2702d5b2bc67866dcb0e19cf1e1c0e55f5dcc61f6b0d386b62e4f6cdd1ccdde35a72613323ec49098660dd0513cabd170d562ac0ddc96ab6fd27270a33eb95e6ca4f38c653820f03b4bbd79139d8425d509d6e0ca4b0b32d04d6c87fd0fb869fff16e32b22b94ab436e07d7b5de8ff33713c9b0d38a12b46b9b2c2440002e80ab355055fe6bc1cccff135b5ee319659ec3991bf1104d9e74f5399d21677cd6900e8c5e2f1743af5a0cf913b2cceff8a06c499bbb7f6cd377df36ebb00d97770e8b8d3d318d8c33f3f22f00e0687fec57c3660e0e41884dd52507188311201b1d5c3f0a9e10083838fd79701d767e378b93b327bae0c4943b54356f589eec3c8630936bb09c01c287be20c05a0d7601a2f8cace50bf1faee20b90edb4a15712332bff15127c5b07d7269dc7823cf216095bbfc8af8763fa2e197f6c6afa85c2992feb24384c6b129a2fc54c0d4d21764700e7105c4f67f84408300e75d91c5006969cdcda39a85c2ede4b3756e0b91e72de4b77a8cc517f7828c71fd386021d13866d10fb4af81be9b0cb52b1b4d944ebdae0860c224436e892d9ec4013f09797ffba5f9055024ec08bc57c8bc4a1d0c7aedf6277297841c3d32ad3e88645e17e0f41b622ffd42a198be86352cd23eea8313511a38a97f9924302ad6f102286a6a20eaa1d6330b78f9af11460c59a14ec924874ae5b8b199c6587c418f230040c4d166425162a571c612cc0adf4d0c594c4267dccfa048028b7cf5b88cf5f9c474dee5895e5bb1c0c31dde09ce6b9d9fbc4fd39d6ab0f29c6aca01264af7f652ccc29831a98c5b6cfe0458776126ce1f36703341b2af10ded95bd8e551f70fd8a22599f7132419fc8d5e83351a84fc3f3d1e351390033144bdb3422718081ae2d1c4a35af5d8294ed155b7ac062de55551c297d8e392db04e41f13e7424b7545f921ff120d1baec5bf9f98206d3311d5dddcf8c1916255d40dbd9f1b03c0fc29db7560ac62a41bf7d8435cd1a145dbb669221738d98a08d38a02f63e4754b2cda61afe65c1ec133c6388d16cc7c13060b24ec7d97519355d0ee1e05a7334b321df53630594b9cce505b6a5ebb3f3e0da74ef5b9681a59404646e879c652b3a96426e5de17bd0a9bc176ee8b380d1d1fb1619126914ed547e1242e12713db2016ff8661ff5558d96ccf6018dbb66543f0b121d30fd7f045dccae947a71a3a645f2d9c3a67d2502381c16d48a4d67a4bd187989aa148a2cdd27ab1a7d6a4c2d8b477906ed27605de12915e84b6c6f883eaa1923ef6157f69c04ae5a87e6b10506cfe49114e8e78bcea8dd72f9cfeda57142d311a78fe9eade17dfff9cdfef2be61d50f9cf17a0db554e123e9ac3563eb4ea99b98da3105f111bd06918ae8b8ea6a2be1c7930d4349e10b945a935b34e994536fc57640e951f3301f038dab83a9c5c876a386f88a7772f39b01b2a7bbaef02a8c6155af6adef606c6cb12f42c0b1106157e393116b64dff48bc1d5ac911e4dac14dc9c5343bfd32c84e7c453edda7f1d602e615002b54faafe49480fed25acbda1c913e17ba4fe2d0b9ecb6da351fededd329d562a97402ec1f5b983a60ba4aa24f9cc2e936d1e96d33d41cb68458a665e02a889588ede402e68bce53895c957f770599f944842b299d9c3be8f3c9014f2fc96fa0bd37b3f28884e91b4842c81fc556f053afcbdfa990cfd21439d6e9c539ad23c35be921c4175447a312b36dce2fb75baf09e392b45b3ff115d7269b84ed0e6f92ae0a488548a02e3f55e500d94b8e161759b344531cc15464e0691e23f4b6b1de52bebe7120b784baac42dbf19d446d5003ace9ca7d31303db38558ece2ac85ad5885adc310c561ef488c3a9c36925f1b2ad446e933e0890d1b6edeb636d5deed50ac68150d2a045ec1d93fb227bd518fe3da5f9e8e20f2ba306c090c0b409a1392b93347fbd4061de11b805b67e4c3105abef12550cfdebe83ad2617527309e24c6830f7e2e9cb232090ad013acc3ed2840b6860a9ee2df2b60b484cce48a90b2b5846cab6ea45d671c4107dbc485ca78534ce6bd0b7e4c3fee9ba39680569244c9dcca67707a872f212588867c8985ae9fa1fd3c8ebd9e1dd1d85fc628f95c94878d9f4675a52060b8b736cd0142596d07de7f6898e0dbcaddf25d4b7ca43d95486a1044c6ecef10d03457b11b177da98524a8e1a4510f2aa15f46c21b1a06a0603e1f0fbd5d88d9bb04183b3fc3c7755b0a971a82af65483287beaf6d8d43d083c74a21c902d502d01e29d7243cd8cf0e9572e2798f49782a5211b7dc1095a3800d54b539f0d20e26763827182b84fd063036fcfbbb8136d3c345a2f5d4d47a055d613151e37eb749fe1f3db102d3690153ceb480438a1852099ae406d0a8ed22489a8402530854e5283c44ba2325262860af891cd8a7195501952df4d25ce8efa5fc46b44db3b7ceafe2de6f8cdf91fe2ea39935d20450bef105dbd73b36c8a52a964ccfe3cfa531fdd51be1ca016828dddcf4f938bb0d95649e644234a4e111b44c8b8acf0dcbfa36ef3f0a0f8a6f8408ca8c2e062c36c22b38b10aadf57a97cc6719a9a8dbcf4374f1386e275b630aad0cdaa352aacd81cd7dbaec655b7fa2a696aa23e1bab3152bc01001f6fb6001c812405770c75769f801b1d5e645695bd0db46622082050801efa79269748d1c7688618937aaecf673a3ced8dde6835b03b09a2d105f37a7131ccbbda47f70dce0ffc3249f4ffa66c6b6b0de885366d390ae3175a4b6f1686491c857ff8e851c3661f695feae04c62b03cdd7e7f4fe7117cc492bf1a68f7f96cf2df02929be4a658b9818f26a5cd2cd082ba82d71d84af1cac6098e98685247b566a504fc0324315b083ef870158c0ca821dcb8e54a5ec710fc2cc5db9c51bdf31e97f77b8c362129a292d76a9898b78c46104b38ed970d2833a7882e32e6a9f562b564c8ab7c030e28729d1aa38909bfd691a720d3fe9f71ce443b6c81b49c9f26e2d9bd167f363ef235f9307d1cc58eaa0a2a4994e84b0e4303b36aee8362fc99a19efbada5d167e9ed312f270a6c7da2d0ca9a676b8f165bdfcfa73f9877154979853fdcf7bcb919e2d7b673c3e130081f200d81a70546b87ec61ac214c21d0e68c695335952c22801b254d45e9e50fd7295a731ce07e417156d455778c467c7b0d10ef203ef757e654e7b6e08b6aef952fce9782cef6684c6d893883606eb0535eb02171926fe7c9a52c27b20c2ea717661a0bba312649b4b311086a6dd9b788b0091640ce9017047fcc899c55e2307f74113a7094b8ac6032ffcda86020a98465e072ac85f9e9a8902f64a4e42d7ce91294600201efca153d9b2ce6f81c6dd6723d34a1b512daceda4327ded98fe41faf48c0785ff5583b727c2cf7c3b292d5b59592a2dca03604f955efad60761306c6224bd50eb929b891447a6851c19b4aaccf9f1b1aa98eab25fa7f66fc344df84af1b945ca59676cc26f6aced8d2546b9aad65702fd14c2db439c6f8bb0be9f2337ee3c47614694bd3be1981d3a784af61bb46bd066a2850452f3fbb345372ac2aff29caa46f088200d46d5d4fdc22a80f1772ab7390b108127c8087e7f599fd60f2fc80d80710f1365d6922e261083725f152d7d9a093700c5cd0dc8a8753ec38f404bffbfb62bb7cce55a49cc1a63882a1d8083c66a506883046beeb2726fb6f08583a5eaa3c3a25e57a6480320c7d21683603c3644c1c79060c081160a4459081e9171cbade3c0de5b9bbff71297e499e149089d6f5e091a30ca19f792d27cc2ca78bf21769463e47dbfe0ba5a688899280261a5b9e391802003cf0d00d6cf287404461e616ff987dc4a91b448fa19f6c34214ff95981ddf958ecead82a4bb4408c31c726e5ecee208027d750cdc255be2d59598678a790dd2b1c6c025a2ede7659308a69261d4476d964752056ac7c68de0325bb750f8259038008e8d3d5aedb1510228296a4b8cf3b0ee6ebf8eb9c60115c07877735ac8c2ec2a2456c4e4dcb716c0e268b97b6b3cfc102608b109184ecbd09d97b4b29a54c018607e106680755f64d9d1b75a028903a4f697c56ace8db3ef4793f498547a1d71c2ca5c22330f45a19c5e208c4439fd900d0fb39c847e1f7994ab80ecba681ebf5225ab4dc5e6bada6a593dbad57fa574a1b4da935866cad99d468b97aff19d65dc54d6d44bb88b64ea66edda68537e8417afdb4d6da396dad3dc3eda7b5d6de36ba417de6b6416f813ec906597bbfe5dcee6e1b8661ebacb7e9df213ec94ea6deede2bd371c6d9cb0aae8f386b51a9588afbdd7bac9e1f7569a9d3669684e9406e74fe7d5255f1921f6dab2b42f9db60408589a0840c084beb7d0f49089b457788be815b92d786a27ab8e146b26063b34603b634e307c4c56c818a9e14c0c659a34d11f76b6603b5f7ec448b3f2028d32aa3c28501f76a47c76ae3cd9323fdf5b686f5e82ef2db42f30555fdd9ec9ed5d7794bed89898591bb1313116f65e8cbf0f0c6f18da4ac38bbf0f04c3b0f68d6018d66a369b4864bce3682b1dc3b166b389e238925eb77bbbd94a6f5db6511c471287598cb75b97af8eab597079b465ae3af9b93f3fb6d29fbaa4eeaaebd153a7aa949edaa407cf97979819af2faf2eea842ea144282542afaa1e3c6d76f6d5b1d906ce0c6a79b6d79981486bb5f65efcddefb3957eb45a7b2fc61f7841d0560a5efc7d20188635dbb5d96ca53630acd56c36511cc94b92b652d2268e2349de6eb87c73b69566f286c3e59ccbfd005d20205b29d00f5050909050870e1e7457a7b395ea72e20f10d068cb205dd0684b0fee0b8942a32d3bb487ebc183add443781b42aabd75fa42e16d08e9ad797ef015c6047fb3b4d1583ec3cfd218087d752cd51834ae3ac1473cbb0b00031932446478682e7ca179d5f842f38276650caf7e544cb654bc72fdde4233e17434297feede5acf51de7a908ef7a195708407de2e34ac3fb35d018d47468bd261cfb258f71ce7aaface89766daadb1599ce1815b5413a39522c0b397f6fd1f9fa1d9d2e70ce0a73b8401a67380811d2a34acb9d1e3d401004e380d5a28e2316661004411d61c03869701c374e619ce8b573a45a4f112263b688d0421d2e94471c331c678e0db10a7396d8a20e95a694f9d271462a8d0f6a3547ca37e70a55983160c0a45056838bec069704df5b70bae06c9db70b1c2770b4aed956d90b368b0c4e31987d5d333027cb05f7bd05e70a4e8fa72d70a8a2ec16b332331aaa162d3c2d5d300b2948612b52a06adf5b655a655936aa940989aa52c6c35629832aa3f10215a2fc7d9f94fc7d6fccd4a2feda9bb1307f0c6fdabca93365a3d83025dbbeb7dc9871f3d5c12b0c1428d60e2febdc779f930c7e6fb5d9fad37dd7268b2deab0cd8e3638fe74de05417054917960cd411004415b4206413660b5a8c56a51af68c1264d2d6a5c2bc332a8ee3e48a22689161a5ca234ed480bf550ed74dfb5f9c5d9165dbf67f820d5839ecd1e04d99c3d0882e6d901efba5d722f36af08590c9156a5e609c2d3704d152d57e85eb1a2c91894c6c9f42eb07fa55478f4392e39a84d4733be65dcc73e8444b31e5bf39cc1413e6a0c4e8c4d25dc5f53eb637adb4dff956d8bd6884d74f6598b278bd0a9d740b8782be911aea44762930ea864e8b8921eddca3e2ac9f20c9f2c6db7921ed5f22bc917a163bfa5cd3f1b2ebf5bd6c6f28a6590ad6686e5b964ad4bd0b4466a838bdfba89b11fdfba043050577c38b39ec2cc5be77adbf5d636a531bb9da979fab3c5deb2789be3ed4f20579f40a60fe823ea7d26d60f0a0e215e4e5ba668a041098e344e56b5de971bd290d1b159466a9e9a80b1c1a27283deb8216d872d42e27b2bcd90ffbeb7d2f8b0462c16cf62f16e12e0405807024350f0e113d285b97c498a475b900771829f1eea506b21286b5a03d55b74c8cc50391db23250990ed998a7900e9997131db23050950e25dbb241878c4acdab062f311a3cec6a4707227f6510f610d720a6a3a215a1203646cd941d1a40a814d9941c44c6e4cfec536213f178bdd5420109500003aa8ab303a2dfb54800590fb2aa3f4306f527cf2cd7f4d080c6ce1a3465d96bd89a3c064d99181b19de90396b014d970b2998f1528316b02a6351e03089610437595e43e4fc684184325371d0d85083a6c60b19ef9921633c37a4a539236346d6068634368c7d8989999101ec6b9bb1af93d76dcd33b4d68e79bdb5b6bf855d71abd95f352c635dfec3e0455cbd93c5d0aeaa028d32a404682e1a5f5560eb1d921a7ce6e8b8448143b66e1d3b48bac0d4dfbabf35a9b783a40bfa627fb7a6e3213629a58d01c64e2976ea2dac12f8353309fb3daf7fc0f498526a439a335d35e8b1e1e9d65edb6958d3def67993d85b54d205ae60f861a4efc37e3f111c434ae2ffccb06fad8d1c63d53a75ce9c3920867cc17155e5648611bed8c87120c6061c2d6a4a88f2234a845bb7a9d20396e38d1d3e3d28211773a89a98e0f95ad3853e11a585d0009a2e3f689499e983843a4dc084f5456487992a226069680da0375c92bce1c3c5a5ea0ca541bf04b9caa2a40e0a5459b48982103860912343952f485ae863a69116e0a2254d0b54d838f9c1a746678f08b617f26849423676c606303d56601828275a3684e942852607ab21124680fa81c70b9b1b64c0c1aa0388302e687040e59192439e1169d80756192a27592330c982c74a17b5851565ac096bce9b3b7601289c1953c70a923028764488bb618ff8f6ebe7047ffd14faeb27f9d771afa8f988f10c45b3adcd6c5b33bbed0adab73118ea36a2f7832ef7146fd1f20385bf3ee27bc4b7a8fed5abe45eab827eadfb1bfa996b7e869f79b1590bc15b71b65e8ae9476badd5665a761399a179c1aefba64b8a5aeb2d79a09f154fbdf51ac9d593e4ea747c5b6b05c30ec61a5a3ae2ed65f0bb07a5e3a290f1770f4a2a7ff79ef08c408fd0287feeb8b67248b32273039e3d4715ca57cfd5ddae608292ba8281090faf334f3c1e0c739c3c88f9db77cfa90b8e3356b5ef9ed35418b88249cb0d28655d489a5c31e1883ea1394a7cf79c7cb887dc452b7aa86763ab17f5c21dd2b3f175ad7a35d6fcf7ddab3166e682c9d58b5c4077f83691f08636b4c16f110ac7bff6b5d66aa2ee68adb556eca7eef33383d56f77df7a6fbde6597beaa1afa81d75ed5bd43334aec21d8f46d55b4fd1c289f9d67b4d5278ba5e8dafe7b5d7db3388c780aac2df7a8aaa823a79eb3ab0b70ec2ea32786b63844fcf9a77ddd5ca10460d6ca325fb49d845d16fe5f9e33720cfe519e4d9c59cd7726ef3b1eca7a38cfca353dd8f4e9dfa6d15fd2dec78928e73211f4719e1d79ce2700e3e59caa0de4f853cfc9a7fc0f4a3d2e84b4ae00b9932c21fcd1475c7ab3b9b418bbab39e2b13507776a9e63405cee634fbc9f300e7e2e7a28db4d9461b892b97ece3fc2b933ecf09b94dc84c1a3d7c9bb7a8a418348a6e735c9964739c639b07551536276fdf03194ae08fae44fbbc52902f0d21f993de4f9a494ab4cf8fa68cf0a99922a877d49d9a67084fed0bd54a0f96c2af790b2b5225fba3b7a8a3932e549e4c3f7a8b1a54f26aa55202dac852b3c52843097c01b49175a5146dc4234d161de6c8d16fb672c8e66439f482fee8b4c95326df242de187689335b2a44b90fc712ed2d203ea4bf65d505309fc24d24933a9e6e17f30fa817eccb3662a81b852867dd12f19c3ff64fa2fe7fe39b34763c9db0f6f657b2e4fd083cf4573c97ae8403d98527ee4c1bb8d6e7ed3eae04dbab891e6c9f4e4494fea22ceda5a47f3a46e73d171a552085f7bb254b24348b4a6e5a1db88473d451b596a826823abab3bdb1878a0a4e5a473293ffae0dd46a42b7dc0f45a3a53ca8f74de6d34faa8f5c1e4d9a2d1d4d2993aa2bab3eea1dc9519d49df50e650bd285cd85cd9b144d6751776087b921ea74c90fd5cc17a1d65312a879c2e857021fbb0cfbd84fd0cab0e7672a814348e15f0fff9a60f8b448ae7ef264d8a76e816aee478f0f3099527687862027c819c10321665e4f2d30790385a684294a183a40a4443801899c24729a4e3872e5634f1524489aaccc8b903150b0a0c1a2476af5ca51064c93af2b6368d61541843e486a44e18cbbce15991ac652b043870935d287c8d747480d0abeece953768138d53d7b9660f178fa29bbd5c0470f9fa91b45fa4cd988a2e07b6bcf973d5830d6b50105a5274d0e69d7c90336603ca6e4c4119342b1f4a43d5d1abaefad3d507af0fc99fdd6b84db789777355f1dd4a6a6091ae5fa4ea49d7ccf7c465f2745d117fd6bfcf995ec4e406b40f3d51fdd691124004c7108f364fbe153706a1e3ddf93988490dac0622f8cf717922dd4ffa1c97fd6129a37ee8626da424d2fdd0b1bdd4de30363fffdc9e19a4968ad8ad02d77a4515b7bb12c003fa8d6befeeae97561caeb0df1cd23cae5fc4979248d45e520312c922554fb266be75571b83be96d61f77aa594917d576a54ec91b1a036badc5985a6aedb55197da38716e1c7abbef8e1a0d2bd8dd600dbbfb8322e20f0c6b617fd1acb3ba65abc6ae143004bfb2ceea96ad1abbf803bffeca3aab5bb6eae20ff757d659ddbaf8f657d69935abb5d6fe32a39ff4574a1bb58728881f18d6c293f73d46abb6e859cdaa5f177f60089ebc1ea3555b67350b7fe077f2bec7aae8d659bdf8734c29a5bc1ea3555b175f5e8fd1aa6b79678f55af27cfda40715fbfaa9fd65a6b9bda28fce25de940ec4cacc9f2a72ecf923f431d889d89a1067cdecf416d3aaa790886e553148ba3cfa5c2a35acd0c5b58db0114dfa406cde6dbd41aba1e426f1d81e073108057c5b5d5f4eb77a8cd06807ecd07f411685ea65bb115b189f0dcc962d5e4deca23f56788274b1edd9dadaf0e8283da7404fae75aa0f9797982f03769a9fe3581be490d4a7c9b5a20b82aaeadf6abdddda7cfd1a7f579931138c0d17769a8757783f6bb18dfcf76777718aeb81e829f64adb5b5ae85e067eb5a413eb55bad0dca7130be8d75d7362cd76c580e9f8665f06958fe9e86656cc3f27d1a96edd338362cd7a76cbedd8665fa362cf7d3db46edd6daeefe2ea65f0e02627131b6568eedeeeeeeb695c5bd61dbb63a6b2def1b4ea64edf6dd6d66ab69b12edf34348b657a27d3cf0b837f50535715c0863e62b0f911b7604012204ec062c1a745c7922a2c7e9e81bf29f1d3a65b0c4be15015959750219d7640c20c79949409ecd24d2714bf571e6527d2073344fea38a7241269b6ce5cb22fe4d771e6d9e6ed602ed90ff2eb42e6493f28a83c67bcc5f9e8e258e24a4a22d971c4c0677b29b9c1293ace47f3d6ddb9643fc83c47f0d647d285cd6d5937c099b7ee4617cd6c9ed797ec8fe6b964afd9d66da35bf35cb28f265baf57573fdaf20ce1addb9b8bb7f204e1710e54c918d96f9e2b71e6793fe7b7b2eb2ee7947cf1639e4cffe31784cf790b7b2bcff0b3dfccb1ee70dea2e64aeb3f2539faad04f29be7ccb0ee707e2bcffb386f3246cebc7587336d1bd01fcd245b25912c50797e6e4b7083da8fb7ab8a9ce76c9e4b353b90272dd507f233c8db719e2bbbee70e6b9543ffbb95495ea8f2ee63229e7fd62d32beaa2f79e48bd28dab1491839f39cf139bf792e4f103e3baeecbae2861f7df0ec5db3e3fc43d9b50897c4e765d0fff1fe5cd91fba255fd0073265d01f3d97fd41e55245aa3f9a495703eaa28b1ee46309e4412512d0cd3c9946cfe549ffc77337c79539ff29f3ad243d177a2eeb8b74bce529fad8a48b9c8f65765c7986f038cf9548d9ecbac3f9e8b73cc752f49b374e249146d23c67bce8ed772ce9dbae69a36ecf2510c610fe5ea7d6540ae197e853a1a7eea1e6396ac8c8a931c6aa6b2a489698a9eb3b277247e1ab1a5b41c8129b902955634e7cbcd077cf4993d47dc20367cc07eb4b4f992c194a90a25d5769f70acf084de8f07439490da39b1cf86a0b7735866aec059caa2c16a084b9904398ab12eed5131e631cc8928a7aa242333b53e1aaaa7615a46aacc99a2598769319a6c89a7ce120bb4d4ee0ea01f1eafd10c34f5480d4b972d23186330622363576e2bbd7848a099f37df4d33bb6ff2cf0c65b903179d8cb30227dfbe7b4cb4ae9dfcf3dd63e2e3cf7cdb64f2bbc7448a4993b52deab7fbee2d81f3f8bbb7a4cd153436c4c8314b5688225bc205458697185952f5017dea78ac3b4ce62060a6c4b319ba788f646cd5cbea3d6ed1dd5b768bd227f9ecad15b48b6cf59ad7e32eb2fee16b7fea727fea3efca9b3f422c9a70b5ca3052baec79e800d5415d5c316320c8fcfaee1da4aefedbb238a7d808cfb30cc59a7db7dc53e561539e46ef327769b9f1d749bffdc66debaab94e9ea3be836bf5443c0385caa8fddba884bf1ac8fbde62daa68334feb4b35a4af3423f4169596f4c3f245a5ff9927137da84ccd7b9de0225b45ba28922b2459b5cb9f401004b5ceb0161ebca4092f9172300adc71753808826017ae8540dc4cd96c51633c9bc44c92319cc1effbbeeffba26ef021c302b3aab2ae281129af48dad4a27e246761fe8008393801f3c4043d75c020c16303bc1107831f08d28ccb20a75acd842c3738aaf0ae12ae57e285330882e0f77ddff70529e3e4bc3e3c5ed8634d4d4d51351093d0a5163557e895c1744fc2ee4190e74475771b4c2f499b287cefc560af21c16c47837e867f0374afbb1d783d3b0846b93bef2363b19a8e7cfd11335c47c66e80fd90adda1735a6c277c9babc112e23bd215d51df7741b057e4cbea8ec93963c20392b428266aad67c46eade10cafd743ec97ea778f21df3d1e343c35950ef01ff8771b1931015163c5cbc94a0b863129a4f16821acb743ac4755660685de0e3329323c786ce14125c4778f478f27bf7b3c6c5c25dc5f7c5a1f42a259f7055bcab82eaac574897e2d13d41381486619c1bcd0a3b2e15228aa2a4f5f3daa2736be2ea68ad24167cc18de983b8668c5d37dfafce909f5a8dd9133fd49bdce88f2effbcc24ebb7d207885d55e42ec51a1388b9ae787a7a12c53bc2de6647f9d193eb4cdfe48bf06f88b3a6a6a6a6a319945e400cab8ab6e1b7e72525f09794c067fa265dd03ecf446906709cb1d2e1266cc4774f07970e2f27c6987a12fe4aec27a594da50b1f63c05a9562760a0bab3854d5814596f852049b0c2fa442922048619b6a4c886c8b81185062c3390cd80e48bd4961d44a2dc48b3a2587b9eaed5111d477448a102b18e1ee4bdf7de0b7af0887a82b5834c1af53295838e1a564148c081cf0f385fbc9c70c2d49c6feaced3169aec8431c6188ce4ca4e744e561238f5540ea7315cc2a4f0a60a0da7b22e5f79ac49cb70e6a68c85207bcec470c9210597e38b08b7d74c697d25c14156a3c8961c376e398004b96103933768e0584d9942b598b1e120d3c221e63675efbd9766c18145c4818254168e291d0e253cc4ef5e94951c5706b476c46025489b184ec09225810e3238b0413ba1063057c0c03ba4dd90a1d123ea8b182f332b3d1c515156e1e951558ef4a2a8f0c0a812fecc2ec34da107f5e47ec9e1772fea4814d51313236e965099bad2a44a94c737b470b9bec344c024537e998c28f902c6c307932e344ae5068d5befc60e1d40df3da81c46901afaee418dfd99bd0cfeaabaf75eae3c7279c9b8ef1e9495a7504fa43e7cf7a07ae030c78619d4930d39ebacb532d8e0f103a68cbdd6f69ebadcb0f6f2c8d6dead6cfbee3d4dc1e377ef898434f0cf4ce5c1c74e565e58a0a061c10b951133748a11253b805c1b43ee409550c58c9b20626a98e00387550ecab927c5c30af7dd7b929a33c7c9f6dd73e253ab83c70b9b1a6161da549192662408cd881771d73c69531a9a671894ff82d05d4aa9192e8eb876441d31828ee8daed1c41599aa60811240cfa29ba8988762688742e40c0a81fd4465d827411e2855ccd366669b8bab66896124a0404310e52b0e0d5eb95ab5944ba28ca21f8e15b81ada0820a2aa8b46f1ce08eb0dbfea4af854d221233aa28a0936b07f46ca4272818bb3cc72ecf36a35d6fe7083ef4916804094a8244df112348902841bad8ed481875d746eddd4545e108a3feb500fcea960489123bbadbed1a1755902b6d4b622caa60375a40c2a8262a188d2c182f2061d013240cfaf1308f77793c9ead94c7e3750eaa40170422c4650b82b2ce829ba6eeda4db4f97613240c6a44ba08e142aee6792f303a71c1d8a5d87d0200bc000060ec1205be9d4c7f8207000a80b6b773c65f913706f174419436892158c8d5e4911a501c0002d0551cbf3cc75ba208212657f31c530840c50ad2050b0ade4ea60f03100012461d7d7c13f269e2bb4fa61f42b25ffdfe4945d03e82088508b34481c243a0408102050a0a26408102050814282a0d4035cf113c35917288e377832076156b8cfa27d387f4047590ec459c12c5e4036a11b81d593304101c85b6a8964af46528759fa7de62fe2363804fcd90be9614b8d5f4d4d4d4740492318c5ea9cfa0ba347d48c600f1d4fc9ee25e08e1945ed4feb611f5171fbe45fcd5dbd981c7a3288ab69a3886a2281ab57fdfe63982272daef43609de6650265a6d12b1dd5a6bad2df1934c5db463b5b58e96245f60b7a40b7bcf19432f3e7c7bff876f6baf79dba8860730ec87f404751840df6da4658e75d7b9aebbf08626530faabbf09928a54344fa7df5f401a2e26382d163c7b22b87720c879b63724387b015ca375d1dc284a98d25980a2455a6eee1ca5a6bed01ac154703748f23d0910c2e3982384380dbd803c08de30f1679b4a084eeee56819301c5cf28019a11d0e8218c44d08823814868b4c5d97518cb1e22420f63871b7e7563891522fc300639a1408271a8c604776824c58008418cb62c4377825184230105a3509e0f214609d0e87cbce1002a47d2cd4f688e204cc85d11a3055d99083762fc21732331da58204b8c619822cc2073e9bc1c6c27f6dd69befd6461cdd3da4eb27d65ead75a6badb81bc92eb6a2b1940a2d18ab5c8516b6cb0efaecdb2b205db4e78e586badb5d8825102b46b62f43d99bab54663aee9f6056398464f8c3a234d79272e303261410545bb122446108968b3f4ee10144c006248820f3a0f1d8482807e50a0f8efad798ee0899c28ad35d332b3b3bf1a60c33067dd970b1479b27f2dff6c3c590ee822eb614dede6ad978fa701350701b3a7baeb3f79b4da5b6d1ac2916dfb8f9a6c1d6b65eb7db740184480e9f22aa126ff6c2181c524ac0b8ba8a94b07d1153c2546c835392ee4900d892f19938dc021d7c2488065d2cbfccae497b4304ea24a20f20a438257982122cac2fc20f1238f7b4a4c9d95f09245354475326946040cb9c3941163d946d9f1c8b74909163259c44cfbf1454502890a517454a021022cd7f090c002668e49831b11525298a292433423d03238c30823f903132196432f124d3290961245c0945006068814982a113380b121022d8770487065700dd1940c9e292127dbb67a39248168850c1a09cbb5ef1ed70f930d97d588355c53443d14867c19d1838fd82c6c041bf1a2c7cb145662e6cb14ce72f2f7bbe745eadeb23f04057fbd34c5609dda7b837691e19bea4ea7e4ab8370b1af3150b7de2f525247a477c2d5a54eb6741884e4a90da921d5812479f880bd21eb89810911c30929a39ad1e6898613acd4a90a524648d728044cca9de804a93f9d57c5d2cef860a147161e516e74190147972138ccef1e973c5c2801700572ba5a3dbb6f09d345050891137c30c943268b94d32c63a1162961d681186db8a5c9896add5d2e774e0fcb962b58567a58a2f01a3f7189d928e3c3863a4fa05ec06358a06079c2cb415846f83343c17172ed2df8ee5dc1e14a9a08578ef8a81d29820353204b4f923c75c8eaa8f9ba476c501d698a4251a549052b1f6fdac419938576b3eedcd00acb14d8e971857143a54b950b5fb87c5c31a167c5ace9139d2082467b9a685b0bcd337f354f1db69883ffcc93031375f79883efc0c45fcaab5a7819bbefbe6befb5d72cdbbe7b57c47a57ca5c3277a22b60a4b2aa884e382b0b678db0e34a0e2b39b8391bb326e7ef5e952f77aa484153e2a6ca559d1cf4ddabf224870e1b2a6354cc54f0dd9b92c2142f628400c975b1816d5cbf69685bb8dc9193c29736b405214ea1901c53378fedac369642262be3746318cb384da1220621bb8de118c6324e4152180b02e516a48b8db1204ceed40941b06a4148782abf7b53acbec377cf043de198d850b668941ef5e91ed9ebe39f99e8ab8fe1b552bcacd57955e1f527d15542c7dc3321cd57371156163e3de2e8391773a3ff9439f3bc9ffd9667f8d929e9e2667655f1e3d95bd8dc1dfda7c4f9ad14b3e74aa09cdfb29964afe7caf3c618cd6cdebabbd6144ba607324f26a4fa66deba50d75b0f7251a423b6f6ecc02fd94f0a72eb4d6e20e4e409e41edc9a6707efa0249c5fc795f88a3a2ecbe33c90bbf764c95b1772a49bdb9c5bc7648cebb818d9cbf3fe9813cd161900e4d92dce1c1ddb1fbf94dc60746b0e896efde6b71c124da4eca2e77c4883eca2df4cd1ecbacb394ef44f01f481fcc74471279616a8046b196d9a542ae668240000005317000020100e8984821cc8c244da0714000a638444563a2822c783a140140aa2408c821806421888611880812006831cd3ca5a03afba71746780aea9457f2a01d6bf3326129a4ed4800f292106a3eaf1fd7ed091569530270919f07ff66bcb27b50302a76f6bc2250ca0378ac71120ab7955340f211c6cda8368004bf5bc42fe31f7f26443069126a76774a388967e71cea1d45670b8a1497d8eb6a5a1e6e009dfe265a816cc2c46dc2243a887a64e1763566cac3ee97f20570f3a60a1a8c38a5042917dd1aa195904de34d352776d61485e647accf24be57901759ff51b11ce5299469ac43bc4dfe19f92b3905481b05b3b8e9253f6374ceba40ba5ed4bb50a2c0d976fc80082f4b228b555e30e6b9407c288ba19d9cab6755d7b50c3f3dce952571211526a0bd68b873f5aaca72b0deeba9cdc08c9026ef04405777eaca2ab34922aa043ae0bae64b3a6c548a112e37dc1937ad2ed7a90671f0bd78a48b526d4c1cfd970b356a4a13f498821d46dcf63cbc9f00c072de3e4ac509d801a8a75c7880fd6b806170bff28a50975257a158aa7304056b6b06d716f445b8acdc7c42e9205aaa8ff50d951c4f7f45e8740d7c65c509b496cc60f41d1066b9e0e6bb7470e8bacfa1a2b18a8e13054d1729810a75167aedfc7aac677c64b1ec55872b20bc6fe13a33e9a8fdc54d69f196b7e7371493f816d70b7a898693e94a7d40d86b51caf2f750db7ba56fe137643473146c3651241c57af89771f78a1e89e3f80809c2ef6cad096b752289c1b879466035e35053fdcde0f820ff93b7e27d9daf0c315e3feaa5cb742d83a424361e2ebe58cb898bde20bb968bf315f9f65b2fd576ad1b39a832b001c8aa9af27d6188c46a86db70cdd01cb479c82f3464e829703bf9d2c4607718d7bc14bdd76ad4d7708f16380d5cebfce779855bae13a0ee44ffd735108ee06ecb1761a285d7099288a89550618ded21d4fde6095aeae40de02136c82cb7ef1ca04bd6f5982ecca0052c42f98e4d420214222510ad1e77f98a441f9551de47ab45f801514293aed63082f2546db9066e2ecef6d96e4c78be49ef3a88371f9ab746c43ab4e50dc79f684360423fc5b30010a589fff19ef3be14357267fe36278235fc9b28251ff4481509edf922c987ad25b06873a65840d0330b35944a77815e6fa68d2d3de4caf01f0ade9a2c66c2fe6243c94b323f14186be25d9b9270bb349489a5c3f22a8e12022fcaabc40de5be91eab01c93ef20196c76afc65a142db3693205c1b6ecc0d5e9baa1a3d2ac90514271dae6b6ede7d6f0d02dd64ab74a0355cf2635a2517e1339d7046df58f06190aa42d36109bd2a0174ce3e230a8ba9c33fc370a3fd6ae01fa61d148651de287ff5622b897ba7608e155e24b2d996a20590763cf88350620046b1f0584a42a6ebb6b0f3ee85f189f3b37ad66136c461176780c27e02cd79e8cc91e05398ebd8c4130c5d8df43aa1e3c574756b1833da571d4234d43779d154416ccb04ed215ab1520881899015413c4078311b9cd02f11522633520c542e65ccf220db8688f2576a18734977feee88c7c137b09fbd7b8a3859f1708794e8f3cd1805f0b81f9ceb6352ccd3d45e66c5b8bad7980a15e503d208d7c00b5f70a09a703ef08c2afc5434ee740be082307b0669e227302f9e317ece83200c95b27013bc8fa1b20fe06d7d870020ab4e0418a98e2c4d1036c6dfbbd8c00cb04941e2a633add92416907ee02855d0c652e6216fcfa66a139727f8b16fddfe281ea79e7810ea6ddbb9729a3374b2dd089cb12a160037010740d492526d1ecacc7d2814df6a2f79d658096b92751e81968044528282e98848a09b1eb00503572147341cc19c279edad3861601fb830208f7f0ab748de71e3733c340ef99a8e142f748771a963ba25257161b2c41ba7386cd8be4b45107ed8f4e9a61e71abb3646bfa082a523b40ddb40d556dd46e3a16db40356d781288eb997091b9c1e83917d496c426fb4a8c64403aa7218d2f58a77adbb540aa51c73ca4dae03cfc5bdd80f895233ad118678c4b4a5e28481c5e39302a31693482f5d71ad621b529bd6982e349284b6500852e410425507d975bc94a209403fd8cd0d766796c82d87425fd8248c7b5276274b0d59354fe8e279e6f2881503924480013d51ec83f021a5300a9d01d8ac72684f608daed009a57d008dd06653e4c453607015e75aa1a8ed216adab598747eaeb5645a0f65461d801cd7705ad2f1d0050623045f8851c937910571f65dd3299dbd49cece604f04a64312a00aed2474aa0c07a100822fa5ae09a246cd2f310313cc33360d3a78427336c0e7416ad00c1c63bf5a1a7410b6170e54cbbe350173b8e24f30bd9c8680f0b7f77d039d147033130ccb575cefb1622a392f3258b48a3927f951905bdba305cb7aea83e9e567da4856bf1ae207b41913bd84a285d9bce7c193279d8f844d57165a2e1d6e632c2385f5353fac20d2eb64f7720faac3ffc8d7b52ff617c52b557df00fd36fdaed462ed44429a3cb566f2149d24a5be3b35314d04c2a71b524b784687e0967d1fd8259075d9e6664bd53dbbac43619e79518439c87fb5058a0542972983d93c1efebaa4699505b29f2c5053b296ccc627dc66f551dc245192b8598a3848bc800d68a416a08a71bd3268ec91548a032a6e48b80abd105e2cc3a4852a3bbd36ee4dae424f027a480ce0639cc029cfc1fec4d16d9e2d134369a446469ee2f88be536f53fe5226b1740107fad635a04ec153a32af86e1f89b230187f7e089593737c08fc93e5079cc7f3b481b8eecb40aeae30b863196968e0fed397226527dca85bf6402152985cf550c6aa795875d37597f498900bb392c074393701970bf37e7fe68665c02ee55b01c4e4d814bc0ddfd1cfda95135f6d94b26fab2bf5e01b1b4fdd47a443373c8b616ab91933974c9c4e7a2d0ffc656ec6627cebc9ec78a25e1a0c256ff72b708f9428c512e1e17367932adb2cb9535ff7931fc96aa44c82684e144197de326c0dc516f3f8f93d4114a82f17faba9036bb00e47b40485e3655607c3969018609c6017eb04cdd2c5879d2056fd95956ed769c2be7d2a7b5b0eef0179d99c9d1818f37731bd54af4f8269d82430e25085b38df650300d32250903817f9290dc215e663463a6f9ab2357f270e973a1f62cd84f7c8019b50a7e7b539654be01ddda4066f04be196b34708486c23517119ba78ee62aa56dc822e79e056ceffadbd7c4ca8abcde5d6449a376acea04589e316b171305fd0c2ec15e2901cc2bdf4f942a409cdd895357d5d18a9428e313617003822f2df79ab2f5ba7841968b4da427434f46f83d25b2f484fa7ab502e4597021e80d88a1103f23cc0775a1ea080576b7e00364b80de3f024ac33380d7aa5de8e6acfc3e1a069f75b875a954dc4d0828bbd4ffbd1090a8f33aaf20c255420029de1503e3b6de9708795f633b243546ed0951b487c53172e124d5eff9cb694acf051409842a8d0d091e447d68431a6f2a4c8cbb4e72e4521ed1d66072d0ff3b5ecc09e4edd658b84e2360d123d02ac01dbf8bf321ff0809d3ccd81140e81a1a893555ca8274e2dcfda5396d036d55f5427dd78aabc727524e0e4a8fd4765512146b88e77215787506ab74dcbf63949b200da14a85f578fc894c5a6024473d3b84372078d2e994c5f39663019b6ab06710003b5d6b691518cfa59b0b4fa5656c4e4ba0afe95296e651600dc2e4363234369975a6447da8fdf0f5520687adfc8d3afe970a7e6e7305a92afd9fdc5adbee634a7664a98c2e745a126e8f263aa5ab5b6a179c61c1d93148d30ef68fa7efffa2b1dd0fe5e856d12a916760a626255111d1e9b8a103daf62bc276b3af3ee14b15498fe84a2a091d829ed2e740bee8a209194bcfbd78dd281d516b5caa621b5d52b5b610e1d1ff103ab7231c304416e42eb32f213e06c60f390df445532170b7877e1465c5934744ad4a01548423db8d6e567a913c352162024a9112871f3d65c5d981e83dcf76cb00f7f7be5fac389bfbeaf0f9c8392fce7aa8e8ede124d070d1115722b986d968442bec4ab78a0b1d1a18d27d4fc6a78d7a3aad5764fa585d56fea179d648870ecd5e866a1b71266d10f40403454e9e9f72791db4d793565437a2d813dda9259a86231d21472c87d0d4f93d4a07f898108983f03b3fba5682761e94a72032bc428a7156afa58491799b09dc25c7aa46d7b3cd5b3c702a7c44cff0108cbad7027ca8106eb92a342f0b0fcebce1427b11720a042a4b38ef4eab8f182dd29d64e19c6e12ed7e5959008610ac2c590fe1828231d2a92def36b7f958e3fa67b3f205d2f301088c81d315f9555128c87a91196b6d21a6b7eb4a0d7ba44b99c7445dc6d0c402c65d5a702533ad1075dadf11c886a81c907ff485993abe92f453975aa3be085a4508cd9045d21e39842cf3ed03ec442451bd0736bb9585a466932b10e9735365e95573a26e4ab16fe1ba783aff6b42e65e22d7738ddf78bd61f6cb3b9d9f3730ca7ae9d70f49d525a074128827718c12b48f05653dfe3b7e1c5413039bf898d5e636e174454406d8ef9b400d5f5265515d0c0fc07bfdb9d5cdb2582374a13363a9c048df5efced37ccc4e10b543a8d1c02ae2024a0d1211c111c01cd08eecdc383563d96a8079239c81749cafb434712ebc145a491488d98d8b5f9c9370aeb55fcecf1e920112143767a59c8a4fa684e08484f6215a970e1988b37793aa411568db5abd3e4879490a3146bd7d665d4cd08d152421f007e4978b0c10f536bb9cc106d3564079006dd6f42a4e123c2ec05bb68ee91ddc645fdc49a1c7d36afb5ba6a2ad180f1ab8ac45645aaec8b4cb527b76c995f60d9a371b34dc16702b52caa5ed3682552710c85942b55214ca4c9053fe96315d62c919dc048b7331d402801d6ba6ef6782a98473c5202033909a00dcb350a79d34faa9ea54ac43e4f70dc222bae64f2bc09172a1e414888d1a00c818fd24bd2b777654b865f77b803f780954c10fc38472b13d9def2e6f93177f6edb95466d9be793ad439a7c5d988791f72696a1b2a8424aef2772139abd75216827c898c813c6997bf6d773170f68d5e7cb03985b2e1d2e5bf898f99974681eeb98a982545df69cb29c9bd54af4587734255bdd2b425b5db515b0dc713b0320f9e23db6c12ad3cc2319079f54e75dd47377ead55dd6f0df1eb2583edadb3ef93410bb380ded6c3017bbb46615f3875ca65ead011e13aee3015180ecdc6e1c09c7c457db0bf4e4b9c550a88aba07a434df44877867e5e2240841411893cd7a2915cc440bf1a86e80d1b926e581dfa0e684834426225cb92cee1579b0dd590560c50bb596ba114c67a420a09be55353775a5df8ac20952427e4c5cf344bbd93be954bb040e9ab026a9592908bbb12110bac1152d7575a7c053c9f7dd5cea768d7cc657a16d9a8eb431ed8c6ef764baa263078389a11ca7ec50dd68f568619a07c9ac7f097b2e7037ee79949ffa76be439fb1ebcf6c55ad398be0c5bf5d1cfd0657994b550e35b5cec0c40055f1e44baccaed110f00b1b1f543736efcacc9f6157f8036fd22864675976ddee90b37784c8a7dc2bcca6edbb3ca1dab93a0c57ac96ec6f233e7c20416896e7297213b8ab7f815c5d7b03e1c76822c65df6aea9021e5d4eb1998c890aac1f783aa4e1adb3afbf3d9052b23447f0981711ff6188a2dc13529c612efd51da2731d66b03f9a2db92c08712d02a80043f655c9d449be7a6705ddc55db1bf230e5d818f6b190e8b5a35fa732e91cc64de90724eac44909f248f7ac6ed6387bcf9bbfb943d40dba6a81dddbec05508622b614761aa1714ea38b2e30dcd57a5cbe7c29e34685fab420663c19716886d07d00a508e6b5ca0ec136005205312ca41789c11fc4954afde79462855669e3c1888989cdde0ceca625cce8291f70f8e2b5b04f1ad17f6a9b109fe57bbc2aaea8769696af06c8a306113bf7c5e916eff2410e540a1d242ed1f3bec889021f24e82eafe281eec90320cdaac8d8f0f18565ff2afb8e2633fd1fd7c7b3d83ab55eedb31096b05f5b624c4518516fdd2f5c0bf332085e10db726f08b9649f97c02ef4bf3f655b064355c507a6f292626ce53ef98ce1796b57b7c3d75729c752de5dcfdc690b3b2a6b0b3dca021422c03298e417ee74e3e7fe5c6cb2f351a3aedd0af3e2667f6c3eed366a6588f0464efebb89cc34bfcd86369337f1492741ac0ba3890ce60f4edc46408002276c2bfe055a2a069cf5d50d821ddccd955c5530d08eab1cace5b0c53d5f68c4848f1e6e0407b726f89c1dd67826da63978e97202b717928861524efac351024eaae6398971e92864b263853b89d1db4b031cdff641bcc1e323e5c69ec0632942cc3c3fb1738442bfb4611db70819c348dfc63e3e18b198a0985e5cbcd3dcd2aa79c784edd74a42abdf1864eef1d6ce50cfccab3d09e563415f2b4b2f5be4b0412bec08809521df6950b76529e2e287a5d7f82842279010d4e6810fba47a84578af2fc320c0c0b935ae1df1dad5858b2b5e4f85ff6e418530b15f296783f8ac8c18f645e60abb269c9ee3093ead98e2cf08a2f34085c7cb024385464dcc9b83d64d588e2c30d7f19069e02dcffae257371497ddc33c8bdb2d7460927e5653621b56ff11efa6641f9ee74237726ef0130dc1f8f05c6d807428bc906e287f7448fc072b1e4994aeb63b330c5f8b47668323f234486735412b2fc81f0e880af1ec96b455d6daf34507deb15ef7a5c67331be8d16cd3d7370b65b193b45b446b5883a8ae274a5c936ce1ece89820d3279231055433e4e49715e08d4b830c8a0ec0c9e312200725346720ee215aa0e18cfff46690e56e41022f8d0ac0a1ef22df58defc01fe6d5461e13cadc90f6c054d8280429c7f1840ecff63992fcda54578e2205acec92bff28d932cf96fbdb25a56b555d054665c0439e9c4149abd99afabd2b028c66bf781d670d56a682a03afe1da4aa0d5367a4b9a3981a7a669471469e0b656b74668942c3c11270d807d17a009e4588fba4825549e04575c881fe1a2251ec95a658365d2b61d9c3ed15754803e968b99de4810c30bdc49168b61c34297ed499d161c1dc979269b02453a588572159e5f48121436dfa45558f85d1dac924958d5deb21c0bcd6d5c4e0ad917100a291662d800ec0108b94937dc8574a8deb890aa3f04ef974408b73d5122460fc2bd79a3919e6c5b5ad7be452c08e448e34a0fae9091a93bad6671cb9106ca4a650b643e8af7e5e4e42d8db81a3c2cbf7e4be3d45db2c3704715ca1a9135ad0c1d9b1f975f141bfeb34d42a42a3b1a54e7c733df681c55020c63f89bb4602f5749152a9d586826e3ef8885e9f66860c173ae7f85cd85423d78117b93ca2ad203468a4634ac78f5111c6197e3e9b19cf608cb7c0bb70d7132094d54aebd7dac3c0f58bea9291d95419cfba252414ce728d0d68fe38a9495bc4db08d06fedf979e5ecea907923280bb6bff3ee148f9058d93700348022e25a84317d793010a6299040a27a51145bbb425cdeaed7d305a2144a204a26a22c1e5c831c6a39170ec125aede14e687dfe35444966e4bd238ce33bcab8d405082293f5d11c1418432782a5e11eeda3e0420cb17bc98592ef3686c2bc4951dada1596012f09c53ffb739795168367d152401a66c00e47773d082a39878326846f87a603a2a9978b826f45a3fa87cf0831a522ed6c20d95bff9469833b016476733b2e4a5c80d679da83e2ddc6d774fe43e426260f20f535335f0b41ceaecb074161ae84bbd8dfea2d5db860cfe416fd91c44038bf727ac699f147223f9bf5ade85aca11c7cca4efde73d344c2cc8efc69cbf231b511319c77048d0badbf35306ae62bb0a249150a782374824ce9282d3d8516992202f58d92cfb61d28151252967939b464c44c346f11402d65034fba8558fc8edbf59fc8fa3fc6d4d15f95290beaf9f474b95a6a11320fcb39f6c7a8b400dd03ddfa95625c38d4ff18d3da3f6658d4aa8a13fc96d705fc2ba5a0b4b7d8ee148920ddcd1f4d58ddb6d6693baefde22cdbe135ce102f9fdd9860edd61580d11403516154e8d664f0e3d5b900d8bf6969bd8efe574490abdc9b9183dacc2b73b2d8a800e8cf5ce9bc55b5604624e559307c1708bc8828c0ced423dc453651667f308baa3a8b17d7fa4d1a779976dcc7ff1e23c8086c13f4ac8b150988950056ae02ea56e71fcdd602e58bdad571d7ba8f9989e6aea70880782c4fc3277b251c18248e7b67b61d70b1c7c9675bf5b6f1e7aa7c26dc0f30d0fa6163a491dc238ff5e9d1d5d0e3363b51e95b84b52a7ab84ac72674da79a9aa22956704324f464dd4d221f86c5b936353083f8410e0faadb899dc0a156029f1858abf146841d9216ba33d9a854c47e20949017fd5ab93b727318ac8739e2c0530cea1ed45e84d5d7692606b56c445a42a651d8b63f4fb2755454fe6bef54719d5b806e9428dfd880b8089b21340d1b758b86f95cf223ffc2b895e2c0abb0b424eb5bc1d5e1c3e43d472588539856d866cd71eb2aac2662c5dab9956f5fc7b0be00ad2a78392811843693e20d34370f2703bbf6d1eb1e0ebc29de48e6fb4e2218cf69a009cdfa0f9471d8bf5343b66b4fa425dee69e2cd463211c978a1d1493769744d337cd9d866aa554d431aa81577960e360723e34c2407387316863334fc49047ef338ffb0161c509ddfc24e462b1867edd59e1f180271b41904ed920414e43c92ad09b8f50f4b32fa4a2bb059cba9b26549bf09b6e92744989f03cdcf41f35f3579e9b5a92670ec00e2290a5f67cb493fdee8726a29b61b347d09981d142000f701507a6a26ad78f297467f4e37e830d0561d0de2bcb0902f5b5a844f09ceb4be976121a05c59aa633a73119fbf14c9acf82c206af9803b0ad9d4f228edfa41500cd797b68afa2fd9fe30b1346c60d4573f8bac1211d9683f0d688c7a9e5ca7182d057f34c05bd3bd3ff3ef20aff513edd40385caec95275531bed7b0faa221c45c5a8b266a0363e021b107d136ccf5001b80667ca9512a4e403387530ff92727108a183bde8fe2d94040594c50515e81f8243b41ea8e3ea253a3de7b3321e25c1a34f9be694265c473f32c0dd6bb4be6f11b1fea809893f3fd5087928641ab3a11b5915de6122dd5fd8ab141f8a392802c2f2ac467df9eb7e3497e3e7cf9037da840a7c07ba7afe9fe2d837963325c2b2a04cac918548f6865b2dc3c51731934dd2974cd76751d27a92a039d4ae7e2762cd6d5d96942c2f07af464eb747581e24247e6a45db1a1bf1617cca544f00243300904ae8c1d053b1f1e0f1fee6a26a853a94cb2d716c1a35857d5dafcae81696f68d67677e1dba8c35f742ac3ef3a8a4ac0ea55014d7b25d7aa006f7b256069df23715f7c911be4443ba390883eca97b36ff742e2bd685df7bd895a4b0fb3243c4ed790bba495cc137be3fda1f8dae96250dc386d8d2ceb00a11b67f02952c03d46e4ccbd49b8603f1235fb6ab899fe98cc05bcc1bb31a6cf598e88648a7e9cb75862a074fbd4e550650ef891d22480d68b972cb9d5e1dd403d89ca2016c010db6a22db9426e93d2092d0103f28568daf6fa82c70af34c3c25513f8938e163e8cec1f35d6a5bc9b8c60f870687279933720318afa68d704ed0ccc6771d238c9eb86ce99fba1c796acfbe7e4f7abea09c528c8d450dabe260c800cb911e4616a624306bb28af4cd9efb5a16809c7b00b9cd9f3c1bf1a2cf012edf9dbf3c022c3bc9c61a508f8a0d30bfa97a9b6efc21a98b4ef5e09dd99a8d44d5ab722a29f20bd0abbb00ddcb6c5c2853c638e757a4e20f4850f8e3535f9a91e55e63efa10b6210fb4a6c30bb0a67fc5b3e12adbc7361b593551bb356df0333ec3a2ad11f10bd2f40a39ef4fd666b00e503abbdf90919ae7f85bb9aaec3486006aa6e5389948f4e28b0af38bccc5f247ca725a3c6aac06379acb59f341893000fbbc4cf264bfcb5152d50debb33c4e4685d5dae81fb0fae292f77cd039fc29ed2e2dedbeb410800f861735e5a34e79760bb243fba9426e460f0c72f53c78a1a1a2be7363a67c55a9d3b4f4d53ebf479b424b9a8b903e1bd100a5890329ea3e97081d59783775ec2f04bfa7953762da3aefbdba7c7875014dde4531a809a790f7c9554071cdaefbed2ab80dc3743755c4998b93bbeda5345ff5ef6f72c478c8b1889f60fe0b070c07edc7046eee88412b735b323d7512c6e5243a4412b1073427c7e214c033396062c7958f87fe6cdd22ef765b95d6df7817609259df341d6fb3ed4f72a1089ca82f23d2ede90513f970ed2484640e87a2063aed2fb0e907262871b62f69871d57d4b51e9becf2f4974efaeab92aa38f1e0625b48e3f942a07b164fa50bdd54fc252f45306c2f337b4bbd1650b9e5fa45d50c7db07d0cc3c016edcfef60531bc7113d5a1e0fa514c4f0465dc325dd0594df9b99b3e01b82fc25450b2c3780177b151d9f5a2b9484ca0416f7372100fe23e606e49766afa97925e7af303ba87ef9c50c9220e5e248a7bfe4c6c68b6b008fdb50d421ffe285b4d68596e54218a26348ba110356dd9c9f0716ed2fd4d8850c2092db0c5de78e9dd980411b96bca00ca86637776338159f98cf4543e86da32e9b647cfacbce9a8d4f1eba9415e5aaf8d8132ba4bc7bd2a0e709a248051b29633d596d904ada94381867633ea60c4fe71e3dc74c0350c2233ebba35b03a58422a4ec0e169292748e709087c8440a3df0c345aa76a8318b48c7e1a0f8f915b236048ce99f71a486951ecb9dcd151920c3bb98e3175bc5c1e667efa3e077d381ed16adbf3adc41c57cf49839da6d937b6fd8d842bb3f32a42da0b771d2acf51f28a1acc2e06c4bb3e5fabb1b35c28bbc54df7f420fe8c3aa156cddda291243bfbe652ebba662c03126f8391226a96facc2134fe9783d18869ba4511eaf05fd414ecdcc9f1f51eea10b4d610c78f9adcdf32b4ce34ec034a464d9bb6d88085efb18c3ac5a72d8e11e81064986a5c484a8e3887d4645567617594dfaddc7efa4b571396d50875c7460f755d20d951837a3ea1d8729e751fe4ab23fc7b225a422dee240ebd5e7990701b3bea4f80f9f4c535ede802e3eda20e618e25c3ba0abf1eb6dcbfe40eb910f42d7c5af7d25291c5ddd46083f29ca45b9dd82a93483c991ee710567bab252459d583b2873a5d7e6ba3ab88191d12f2d4a006add8044e56270c89fb647e8085820b3ff933d0dfca6ec9141f6843968edf6a2814d0b0030928aee97659d433e04b6b32140c67b6644b116fb32860847c68bccb16ff1406a42059994f9de6e2493ce060eec0280c9be442d9fa4d04a58a14ed224314e32e43560dc36ab5fe1044efff30e1f0aca6d93d6d81491948995f42bb5b08fa0411998bd249598bc8cd7b197e1220208aa612c6feb59e6431af2c975f0cd965c3fa128fcbd19621a498ed947eea5d0786fb2219d850ae8e5112e307f77654889fd0d31f9afa3e64c7b5638d9e040a90097abc0cf4be5480267767044be41bc43a05b9c8de291e7ccd854956972c41a6d0cc321850cbe693fc3381ebdffa4b74f49f8ae4dcbaf231af591abfe4b66b90b9bbbe970e1a1cf4d26573438574735f15c35f513c16da49e0351e9aa1d01868b0348028f8f529febff7432f1c248857f2d1d4402bd313ee22f99de755d7408e5bd95e585377f756e9eba5e0f379f6ee2b26b30bbdfff04b1d15ec2c5240e19fc19fd165531c1d31e462d19a2357a1bff39a058408be2d546e0c5e143131bcac8450e16a3abb9bf062e530cbee88781829bdfb2931f1a8c2f95cd5a3ab0ca84194ea187623eb8e7e4d2f75c6b3bfcb425dfa77180c066f51888b405d326b5365514ff777b656a73126010a8f615698ac711f61de1f1d3eacec6c116e13f6af87f769ced6c9e9f05a798381398d432625a77365e5010ce2182d393c44ce44d4664df39710d01b1a93a3660ff4d8a618ddb139da74a78038030bf5263ad25eac788eeba08ac99eb24d7aa80fcde0346754a4836d6b0a16c8c0cdc6a4aef3f6b9b514fbdbe3b610935ee692858f7a23279d129f880034a58787531481fa53f6b07356f53f6565d4d95c09984e8e8e20af471db5dd00de16d98f3279b8b773224ebc5e07e6ed1cf36adf98d30bb3b7ed16f69edda31b3dd7068f6ca64e303a41360183d33dadea133b1442d109ee95d607b59320702994f460336c681e2c987428f43368a05c05e19d26af01a4e2905c9cea9f84088452fcc5589b32132fab2bc480c5d8d3ac8c1a2a0132d5de36b1cdecc271b06120206e1e861d20f1f82a2e416cda7584af53a219d42a596c9411be96f6accac3c23ce7583ee0b6b4016a99070b55ebb736f4270b14c525ca44ae0548d24dedad997e7b1b49f654d7729b3be23801e7e99c4ad5da20cd4b77d61e1e46779101c8b6588d93b1da4bb28e7460fb59d52022f0f97b2bc73bb3028c201253935264b40df8eae31c65208667edb3a7798e6ba786061786f00052a3a315e600b4129875302d3b6288b47bd91c5eb3b82999e3d8c38117d66acd0e8c649defd937e239970bdb3a942fcb4e9fad66da9e6bd8b28b536454bc1132368b18f19e7a87d4fe462f3cda94dddda2b587e3093175bf2458eba86624fd9c4573abb15fa32fa6404287d3c7082dc741ca05013af824621c31b114f8e46d880178bffc2982068d88f33baa98e63d80cf61ac63c6ec6c872dfeb3d436fbfc48c589d99018d7144ad6b659f249a9009604377cbcce79d5374ab7efe433628f80afb6cb15a1363c9ab2bca9d47a948d6e1b9fd321e8a4ae74ee42e8c31608be0391ae6114ee86479b3382f61d49032c333a73cc8ee48d8cc1403646aa241026bd31e67074d1dfc8bc9617e88e8ff150218ff9e35f319ee1f1a035f99a57c34837dcd26325855fc5e976e44ac22a257ac50eb70425a37a597970cdfdd021932589d255c85f438d24798893435b2b46f17036d82599fa736a8e0e95797c98ce30bd65d3dab40a1895991c846e505173b34fc43e0d33a23fb706ab5defb39e224397e49c24eab7f3c3479eb2b389d98032a66a462c9d3aef4b587053191207802b3541a64299f1a26db35da63071667ff07fc39dcf68bfbd88ae60ad0f8ab7784472b197220106df5dd1e02db4fa50e48620aa19c8f7b055ccb9d71d1e43ccaa793e0f000b617afc6299ae1c72f7284bc8b92aab487a7871e79f644aebd297afc3bbb6387442af6b3488fc1946cb6037040046ca8e84ba76d2c270234d1c9218d5ccbbba9b12b1d8b44a6287eed788bbecdbef6dbf8e261cd7368bbbb207b394e2609706f7856d050e73d0f7a52d5bc4e85f40a86f9a5704dd1323735566e76c304bc16d664e57f70ffc20036de645135e45f69517d990d522c667108164385ceb6a99b6e9b37d793e60431deb78dfc084a5ce030a9feb82259372f976df19f36652054f1f5c697d3d4528b0299ee75d07bfef97e992c943672d59629fdaa687dc89d1fd5dc585ea878e7d2738d08d36e3243920e8a7c99278d386b954817e763b5dd05c5fce1a380499493688b1214796f1f6cfcf8c0b1a1fee5f99be632f36002ecbef80946aa4b5efc77a25e5361d62008df405b3f3f8010a333de9485c487e66c6f44a4466d66bf636128bfa8773741b195873b4b42fc037c95fcb4112a54a2f3b80dbecd989dadae80ee56fb345c2645e2c235083b93f34603b17a4ae0a1622820cee4682fed89261cecfcb3beabe5d146dfcea9afdbf571e51fb3bc77b51ad2a25b7c5da1ede4261f405117366a55d9036b303687a995b6644dd15bd3e6005196703eaf3d6858aecbcf98576a349cfc3f6069cd2db25c731a9214b9ed3429682a119aecdade611954595a71752f7c40ea211d4f4d980edfb7ab6a0e2d5c17dbd01b2f5cc02b9b74dffa1e2f2b46c3863f5444bc97b35f00a5f960103748d55777128be85188c512f095f5440f2bf9e8b650cfe78719b57e72159d0185ddc8faac5aa689713a1aab7165f35e613d321b8e5d7ffd5bd52293118060e875e5597bf725a52b40fee6a7076a676ecc9f893cda60817a5563b08dbf2c2731df806f8cd072c47d4c73228b51dc0eb9cf95f067007bfa601352754aa2cca628161b6bef01436a850120276abe3edadf211569e86f95c6ba17895ade1c8b87916f94060722928504650c3a65f5d3fe65b466f8662499e2b5ddd6b51d9b7806529f7087728681bdaa9503c45ebd69ae852da0b93288d28a9c793ac72c8002da4225a120613560eb35c636cb8e27c6b1df7db26dba1fc02f65b3b99c53d554c62b944e95e2ed2def70007fb53f3a60c106c313a56625959868c7e6a1cf8eadf1b0fb6e5bb45eda7157c577df9bce2413314f022af1abc6a52b3def6381c6f0c709d6457110b84087850192db0f449a9a4e01d67d53a077ce71a7cf043c3f2cb77788822f1a993a8895fab243cdbb9c07fea0a837f04019e0ae1142090d227a77fa1108615c17a5ed7ae58c3daef10392cad4ee388f3e458479f7fb2ab7bdd775e6cd5cc413919b512faf7781bd1fdf8ce8f074f26d67c06d1b08d109b2967c920050c425e5087e9ddc2478cbb050454d1a6c93c2e160b22ee511b3376d5da7249ce517f5e413bf96ad8dd028be22b737443f4acd654e5f20d4ac2a735dca941341c4c6d33b5646dabf153934b6f74dd603bf0e03f438dbd6ca6f85f029aa60b00ee66bf64ed5bcf471ae4ffc07b5ec83b00227230bd68bcfae8d9f76f4279d559f929cb2a72ec25715528cf2c02b3e91d770d0cdcfe55b53246cf549a3078bca536882a5fda69331924b75fa1d318b71ffd797f0af77b6dbe52ae23ba855267ccf2eb38632f0b2e17c62a6fc30dcd201f694f716e1cb55b2a6167ca2be6e798e18e8cb7bc94b60be8189fdff3cfe6e9035f0a41af8e9fcea25670f9a8fc6fb064ae3ae08bbeb7a6742263e058dc31ef77149ef2a5bd2885b3164ce3ff4dee94b81068b33aacc07c9281181152aea92a9bdb0a77a33379b7070dd014c64f72e80766ea1a1999bfec53a105d91a4cc3f4ee2c7855080629ed9d4447645a945f546bcae9a5df51dec621d96aaefa1e77f44032ecd19fd983ff7068755f4a49c5b675104f979ff78a7142d971d70822ce99706d27123ed2fcdc3d9562f571b7885cee3779ed4ae4cbf11f9923835d037f063473a2b540df22750832bfc56f4240fd414557af22a963c0186af2e6e610298a52aff8b9c2d3207c802fd0420d2c1c800962db849ca6ad0aeb6a860ada48277c8651c5098f20af0827c2cb04e1f3be637220e068471890ad032ca4c4b179c0fe07587817a10abb25e4cee9642bf866ff6437a7903a8b98329a61bce954ac24898b6361af07ffb20de9053d209527bbe8f25119cd71e00c9cd168c5c2fecc01bdf8d8c2d70dac8529650c5c7d5c3ef13a6320ce99a2c2bbf38830af8b0587ee07461749ad6bfdd89a7be829869a04a4f4873f5568f12a5414c58ef04b39d842f42e7403d3e53be0679e1345c10e8851080cedd919a90e7093fc6770031a2683e68c0fd6e8ae38a4d4107c8f10127968d5f25731c2b37f0805efc410f499dbf54cb679bedf6f90ab0422c2110f16d0dd93485bc154b468cc549d631d39ae3f300cac3fe5763eed0502d861746cab550057037be4c3c9f815ddd48fd177f7923fd1ee5da6714e689a3934e7b4e633b2df981a449b4e801ac1dfbba048aa78335aa42d5ca5d48d388b5d15dcba8c03ec28a2dc2d974c9944554f9113ab1ed9de020052d914a1770b11b7560952c1a74f274ab37abcf0fc7b36925ea05a3a327834e52cccb5e3599005f761cb67c1f2025d13ee19b8d3007d6af8d26f868d3737df429206c6561c25977a6b012e5121e6fe80956a2d88b618721d345a107f8b0e52e702e44aeb59ab5b106b18ba577a0792e3efa4c3ee4d272b00360724ed1ed75821510878af540da702ad1b1ff6a148f959944a6644b406274911063d5ab903719134972cd86e32313fb8646c1ec681d0ab0dd7a2c8c692b4468fd033c9c5ba332eee655f5937f7b2afac8b7bb5efac8b7bd957d6cdbdec2bebe25eed3bebe25ef69575732ffbcabab857fbcebab897dada77522e808a11b1a3c76bc16c035dbac0a5cffa4124075872171eab2fb781f0a3f38cfa28f6ed3d6ebd41f79a9297ba69f217181f5f6fd03a26bed00d4b80c6dd5330cf52eda6f7b5b30c2752819da09b6d1a30b9ed7b10a948fb1146bad69a02a89c89d8beb8be36bff50e83ef9eeb318506d651aab020abda85c85c2ad8daa886f5bf2f29ae3b9721594d1f0008cf1313f73ecf88e9c26f21ab96b07e4805e2f0a51a66ced5dbeda1e940b2d28162deda93f975e556b07b4b8c17931b80ea99c14f0028478f60221d48e1bdd6e93fb31c2f5b0dc24d6099298b968119139a08d2ec4ee17241a734d199ea96d007df63fb4ca563a47b439267003fd0fa194cbfa9748c746f48f20ce0075a3f8e19aa0ff0c3a94d77c0875b9e99d9f72a8d9dfcbdf5dd258a6348d26e1edf82416546c2436a87fa7cbb84715ecc62a0909b420e094576f646b0f6055e8b5577c659cbad535cf3a8fb3e8f181a4342616b22a46d6272ee92e037a741807b84e1d0aaf69c0d6597912e47a13386f18dd8acbbb471d2c27521ff6f7d9f1e5bc0efcf1b052c09501020f9bfb7117204d116a4464bfbab48a7ebeb0d42f0837487352bd11af3c131327f153f2a2ae4195dff29a6819a9e540bd3fc947ceb34e0157a0a0fe854d23bc23e375620e64e7f5f32f529181111495cfbf79510d4102cd80ed36a1853a6fe7d0fdba2c1cd9c17972a5eaf3c6a54e0e8f9a23422d9142d2dd11efd40eb1ce97e8cea63313b10b39a6047290f94d220f87548d404808d20df4927c255c44c068a514593b4ba99e4a46360bc5ff094d2538dff7a18a2cc4c71d11eaf133bc8f865e5fc771b6b97df45c9f1c38f8ddc3e8dbf4ab7bc9c36ad0c1c7cae3640acddf5574a1aef64637d5673784952fea1cb6c64f8915fe1f96cfca54fc865f8fb6548a3ff43efaba5f1e78b4b49f74bd7c888ff08f45a1cf3fc2969d84bec5b6035874c2e55c7b4c44085e7af1a9f30bd50207d4d330dafc562c61dbbd5c3dc9ee445ff6a272755513ff2ad3bcdc6df4a7ff67a7cdcb135475862f179b7132457e8df5f1bfdd0cd271d1f54ef036ace87ce5a204e4a5207f7bbd6756cb79b9a6655df69f60d33f7769ded72bdebc92ef7d1362a9cec541d6f6fc659a3f2e63b3e55b128700e5252ffdaca19abf6a2020eb7cd2a485c050fc089759fd407de00ff11c492bd4bc8de5b4a29a50c7e0c170dca0d45b0c0e0866e6bf4169dea0b2fe544452584b5a51767e525899f2d53b4d4583984358057a02e162737143496283d5758c02f84597cb85a9cc83be02c43c22b6a402c67ae4411660192b5ac099500b13c7db719c827c42c39f246048f9627f88a4d95854762e9a5ae1cf9b0c8c03229194427524b2f7503a2e5858c05069e2c34905cc22b3df0609902d4f22695258bf18a1930cb0f3f5a9c5c36211622292454575e48dd86805aa690596e371db4961c6e9614422d45c82b56f060096f4e3d940786bc8cb3ad52b0d9cacab0ae5679b58665307449a4bf98ad40d9c559180c9ead7d3c4d8a63edc381b02bc330de9de15aa8036bdf0cd4d92a88fb74b017b2cf766176866da02d05a3767575766d295985e119c57db5aacbb0fb8231a3ab1207163a4f715ff9ac55606a6fb5d6da7bad4029d5da0ac3a8b7d60a215a0c449b79d076bcf62a6112933cae1236e9cdf7f608da5dc1d66bbdd70c6ff8e4ada53607a9548516595966735cc7d85a8cf14b8723124c7754c7669659578d23d2a25d653f64fd737a0e597368022c2a6c4fe7f50964c73e8112a0306587f33a365fc043045854d8c69cd71c3ab339644d0764bfd49ae04a2aade81aab30ebaaee6ad24e456fd75777dd1785134589144d96184105efac326b6b192b4788581142a44a1c2355d8ac50c5cc09559e8c540913c48598d4532a556e5cb23071c182e585991db414647592ec684196c8228bb952c20f39e79c6db0b2438f9523a6e05045c7aaf246ca0d55625855a1357d5912a506a73749aaf094807a22085692dd963a6f8630a2a496a1d2048ba1b20394ec061463ab82c9059a2ab2941c91168955556b52ed2a03c1b58e806bdd156edaa394e292747c586f380ccb17457393605399bbce48d0a5cc5d61b0d0fc31333958008cc7ce6b23d2a27dabbd959ef91d86b550b674c35557731577a686bf4e7a7065361b68793c1eafce48d0611c0e0783dd1ac6b6866d8dea7eccfefa836e65b7d5a236d0dc1cfc757fdc6a697db3793bf0376baa1c444a29b55ead633bab301db5517a6fadd55a6bcdfa2921ce60b6edfe94ca14de5f1eb6078f2a6650a37bebb72cbf9695ec61dd923c7824e0ebb2421bdd5bf7346595d55a6badb71097d3b9ed2bbbacd086566b9ae51aabb2ba546178c7eb81706f618e038be9bdae241d3e3bb18b9ba64fc3d0bab5fec2292f5fbef9e68bfd52ec1463108738c421e8d7451004c14aab31100441ba0b9d7a2ae5d7c172d35b5986a17fa1b9fd5537bc2a33a4d8afccda964d37c96acfab335e5de255190f8743c07dd99aebbeacacb6743a876b519b9525bde585e1873bd73f205ce0e2c467f3d62e93cdf1f9270128a044a194b53bb9cb0a6dcefcbe329c5333a839f3db8646b654e1fdb6b88c49a55c85114ab0f96d6b58097f2eebef50a48a13bfad0cbb39625df4edcef761a1fc815e8590346bfc930014f7fbeadb7872a03dbed3b3b3e33b3e020f3edee323f0b84f8f4982cd428a8cc784f1388f6961d7a87aef1a556dbf2a445ab43fdb5717a28e85f6d466e589ea9edaae68792ca33bea8e22d507d8d32e5da3217a63d9d7745fd409071c0c06830139abf65c6bbaaf1d3170a1d96cf7f5e3ac9e6f19775fab2c487091c1ceea397741b84639acbbaf2331583451839dd5f1eebe7e4ca953a74e9d9abf9babdadc59f7d541b82fccbb46d557a459477357d857d1ccb3afb2af99f6d54173d7a5afb8869b74d5f3ae4231e166e9ac8e9778f755635f139e651eb61961918517cb3273e7a56bee0cfbead4dcb8f7d974cd504344ac57fcd7850afa9a210c1e44b0dfe47a751f5b006c0e59a7273687ace3b72635aa9eaaa99e664152fbed7f6dcd899f8bac1ed4b3e963cca68fafac759e92d9bfd27e2e9558f629f9413daff3d09a7e4321d43a9fc5affcca8f5abbcaf645967d1124e9107a875fcdb1a7d6b137b1648f1753a3257b7c3d464c663145bfd45d913d3e5384fa3de8e790ec11666f724d6c52b3c95004f0791d9fd6b4245c8bad68a2720e6c78eaec768aeeb1e31f4e7a2afc54ca24cbb1a4542c4310b45f693fdb81636b8a901fd7a953a749cc4f9589add13d29997aa2fd6996179e70b22e7ac58aa29ab27749b42eda320ba12fa9647b588aa3b81ef7ce6697ec819530d9232b65b2c7f7c9641fd903cc42e88d6b5f7de39a924e776557666dd6c6e3d5599d65217405c90ec290d695e581cdead7fca410ad8b2c1ed5f2207b50ebc2b4da8b47d7ce4f7960ebaa4949b8d6eb62aed5457e702ff68bcddb43f5f7031dd7a8ba8efc813eaf83b42e8263253fb0e4075adb7bb3eab12b9da087eab3d943f5d80c79540798204448788d2848f2a8f453248fb087a5d5ae305691d845d64e3d80f6a8f545d60723d983a424499264b5e10a3baea2bd387f60a85a657f4af2f84c6aaa2a0a724d3121d61d0d9e3a0d2d0678ddb8348a14c6a9f66ac9e0ca15a61e2317dfd0384c2d98ee08c053c7f4e5d7a8cc923f0338064f3dc6df2ba5990f4c324a02a3c500af1b9fcbb5e3040ccddcc8e5fe874c98da01c053a791ddcb5d4a85f483452592b141a344421c5f6f8f9e7a8c231cb4a12c7407a53b6a3cad26b9baa18d9e7a0c1c3db3158ba62e8dfaf581be5c77883bc5fd1a1131c1d298a8655d6474f5dddae17923c38d9bd4df1a451a91f0f45418688c8aa467a9c7a756b1c54fc97afa015ae33aa0160cad8172ad20302f68b06e081272a172233444442b57182232800f59690dfd76f79f21442ec808e14a195cbc1013848b81f3a1bda064de528f21a68b15da11f8e521180caf03d4a3d17bf2e625981fa7184eaf1aa234c1b4b8dd4428cc186b7c7434741ffc9c97768d5af46214f5685d6f08355124030b1e1e0ddeaa888c91d21d74eb48c2e05d463b940c182dee2e575212a966068d2efa767b1ee35f278a4454a3e10a4ab1b484acdfee7e84c565b432aa41e26a1c6931f3f9a66440df14cc87bea9169b019a5eb716ba832ed79794f4dbca74e878d5edc80614e22ec6ee9f10e16003e9f536a52289401a29dd4179ef146988aebe1d0037461bf2047123695cf3dba9057fbb4e688aa491d21d54cb5bdf2e2f63d02ed44a6b038de38f6814c9e760108031a44ec9261cd8b2490070782b0867b36500fdfa700a1c198cad9db24e83be2eed1a590f6f64df2f535b5a8b065d7ddf0c464a77d00c02800383a41b38008003c9c6510d1c462e1c38cc12070e1c388670b8c041248403070e1c3870e0488538401c383e0b5be120e9ffb8f6b7e4bf98fabe18832d10044dea1cdcb0dca07f7b7c9c4b1b9a2318ff9a5b84074d1fe3d717bf72d3a7cf2e7e6315213f568da19c1e14702ef7fdfbfd758c31adf9bff20cded9418f3f4a946c78d2bc089687f4c03e35cd520c6bd4a216f3d9595fb96998cf63b8f575ec2a5209dfb2c5f8336e9ced45b040e30e901d20aad6f8058d230c58683c6a82edd0c84a826814a22274310229f16264e110c2185551843e962d94e34f0c9b6349431863f4e101178d4340b08c91ec1205d3184537a16b6c21c76814d2d5a8f17b8852a48dc153af5f1edd6be3d2354f69149a179166fc1ee2615d3c75fbf5f79003e83592f1f53100289a1b4723b9b33112fd8091c6232d001879c4f0880993461597502969fcca1b1f25cad7531f96dfcd9fcb6d1f9b01184923708c3803af6bbeaa81d5344f1dcd8b1a546a57988a1a60ec8e4557c7a206a412f5bf43f9ef57db536c6a300a51a16bcd313a1dfc1a7780581d63588500c6d64cd7eff1058a51bc2301289cac0be31dd8dc20583ee85704a0e36a036715a6a3b6300c43737f65f939f60741d0dc9f19d2f082428822b54f36cd53bf3afb947bca387f20fdc03045c3944aa42a7124291d49caca492393d58ae9a9b36a4f4b6d694f993cb533eba2de8bb2265858542f8a77bbf284bb72bb62ab4c66154946f25566a39efae53d4db37bea390d0819d86bfb0c92aab5f7629c6bbd15e70fe7ef03c1304cd59a52557154d591acabd55859e46aacbaeeec8c958767a4d4a705fdf91929502d37eea9a50fd9a3beb6ae5ab6207bd4afd5ebdb1fb602a027d634b52eec737d70fe3018ba4a1c4925278bdcb52a5262913dea8b2e4de9ceb57567e75b0d75f0fd7ec15bb7bf49786bae424d2a893b75676787e6fcd6eb6ffbd65a4ac7382fe4686b8ea258516053d9a450d95880fb6a515f0d5b17c65aac3070ba9a1be71ff41e83525a6987ec017e980740cb4d14de9f9f9f9f1f5bc31e3c523c8e570c754ae513848342125ac0e8a2ad49e461120e938868d10b8ed828281b25c2f022fe8c40646b15c412d24324c96345f26805d520da6af9ec0cd9a1a14a73102d857a68b9b50b17d7850beba286d625244491868a5a37242272e1c286d20b170cf7b2a44919d8a0e0977151d1b535d5d2a1e396b6047ad182113496b6c280e15e96a6a954a4c391d200bf70b57f3cae37847ca824127d5cc4781131fceee1712344942c37202932e4dc3d36c9ef9eddd313b5a527ca16296f774f13aee709ae8749d7b3a4eb99f5d0de3a8feebe44b0040c91129e94c0058573e937cf4e083559b451c2cb09369c9b87f730fce6e9c99e480195440a5d1025e7ee79e1774fecadef1e590f1230094f193009d4dbcd9303673c4ee08ce7a9c6d354e3b1d56e6f9d07765f0a983d61a3218a0d280071baf09b27b6801a6ef012c596384f2c9c9b47f6487ef32c5d4127072485a8a873f3b4f09b87f6d6374f8d87890d1c3673deee9d1ecf0d2f0a84ede440980e84eddefaceecbe6815bd3762768829d1f2e464e1f70eed6d163e8091396913a6cdb9776a7685df3b4d4fb6182102862371e09c7b47f67be7f676efec3c7d5176927c51769404fdde59fa6c3b476c4870ba87db81e1626f5ddbee8bdeaa585182105e62d861cea9c26f7dcb45410342899a0c4d4bcead7129fcd6ba2854a0c989a2cb9228e7d628fcd6bbb7be354f472dd151964879ab9fe8dadbad3f9afe684cde3a4b775f3f6c40a3c3982968365491e13cf29bb5c31c2335784981290c9073b378467eb37a6f9b742803031d2ab636e7d6b03fe1b78ebdf5ad656fcfad917c4058653e202ca8d037cb89857bbb59b92fc66afa622cdb66ddde3a0b765f348ae830b30245051a175be437eb87132254a0b0840e923a509c9b6563bf595fae0481eaa14dae8821cecd9a3d91df2cda5bdfacdaf79bc514064e98396ff7aa975bb9c945ed56b99d6eb77bebabd97d512a3d2c99a19744cd4a123be4f78aca1036580c81824417c3b9573521bf574d396860e42801c30c6d4e38f7caf626fc5edddefa5ee1564f19ca2a4986b252b23ab242f276af969a7a4d2bd82af6d649db7d31608733b12880ccb9a18a0df29b54c24c11298c603972c512e726715fc26f32270117bab019028dd311379c9bd43d90dfe4eead6f92d7f39b8cca40c828198894b79b6cca31f2498c292f914b79899c6d92f6d647dd7dfd08c2095492208288a1a18513f67b1c22862070bcc8d00b33c3b9c73abfc71e8e224e58fa8108131049ce4dc2e8fc26636f7d9332fd9b4472662c7366841a9dc6a7b77bccedc6a6dd68dbdddefa08bbaf1f505e0033260a14386298c8e2f718fbb10465e50d12428c48a18a738fb239bfc7a51f3ed4e912b574820f6cd69c7b9c8db4b7bec7dac884a988703015718ee8468c7abbc5de4dccdd74b7dd5b1767f7b54193167628f4ac6841ce6ff1c65b4345902a9a9e9839b718e7b748d94811050c153244454939b708e7b7787beb5bc4894f780531095e41c9db2d2ee125f1c812124c53f5304d846d31f6d655b6fbfac194a50b1c2c4bac61c2d4fbadbabdd1dd40278816d2d060e4dc2a2c7eab726fbdc87aa0a104197030726ed515bf555ba5ba7054178e4af584e9adaa09c3544ab08ac92ed553c5defa56c95e3ce75621d9922ab305eaed4ee5dee2704fba54932e65d3ddde7a0a765f548c094ab2d4dca8018289d38adfa9d806275c4961a6a484364bce9d8afa9d5a4a8aa206384aaac88902e6dca92a7ea7686f7da76a292627709ccc79eb26e4bddd61af16e66abadaeead87b3fb1aa213c3921e9014f1018a8adf2195f3460a29e8b4b14264cdb9c3297e874d4d4a68b0a20d136f9e903977c8fb1ddedefa0e71e1d32d1226b9454225e19110c9db1d2ebd75b00793c5de3a68bb2f12d42821028e91314d3d9c6fac0c2c3cb1021d156610726e1027c56f70d664820c4cd0c09ca8393718c56f70f7d637c803a3d88051d88052c0274c53fc069bde3ae581331e6dd703636f7d83bf412461be32613ea8cfe9c9fcfde56cce1a55df9f94b75e7d7f57624b1fedadefaff6f6dc1f13143850e684e7ce6ea2dee65e53ce35e99a764ba0c87189d591218b9b73e7dabbf99d9bf2edadef8ccb4f76859cc4aea0e4edce47de66d9db9d97ec52cf2e65985d8afd8f2454b0f084993449b410e484e237bee15c096ca6d8414a0d52ccac3937d6b5f98d776f7d639eea378e3a83a39cc152cadfb869879fec30530f2ff5f00cd3d2d06921480c53c42173eecb63f3fbf63696f1fcc648a0dc3250a0de365da7a6a7b7b76b54ebedda6eb0fba26e8880e189203c175e40e1dcfdbe31299a48c2b694258a99d3b9ef9adff7e6440c4240c1030c416071ee3b7b35bf2f2d87ff7d99de26815393cc79ebdbba79ebf41ae9ececbe288e4e193a4c2811478a91f3092634402161838aca92c2b96d2dcd6fdbf496ca95284b256c8982cbb9adedd1fcb637dcd35bdf36f7f6b7850a814d42d92879bb54027b846791c4ea35aa0290924300d4557dd7285850b16288196020f3429ad389dff596abbb1752bf6bd4dbdaf4f6c9dbcaf4b4af330bd01c297a7fa7befeaeb233bf6bac0351921893822e8adc9cb3a703e1be7ee030c5943950b327604da77d7aeb0ab02f6df5adfaad009324c05401f224864a3523420d6d969cac507b623b6b133f01269ea0a110031c24be5426de7ad2f7d6432c7a4cd07b07f7d57b4a30abe8bd7345ef9dd28ade3b3cbd750f7aeb9d99de7a8cdeacdc57ff79d29bb5fbeaa51abd59b4af5e3ea137abe9abff58d17bd5fbea3f55f466c5be7a89d37b0546ef55eeab0f61d17b45fbea4353f45ec5befa0f1abdc9dd57ef99416ff2f6d58994d09ba47df51f357a93b1af4e3446ef71f7d5ca0b4e0f82eea0bb5a4436077dfd3853ce432aa54825705c41eff1f6d54b387a8fb4afde0383dea317bd45347a8bb7afcec2e92dd2bebad01bbd55baaf2e1485de2ade57077ad25b55fbea4038bd5536e8ad827d75d64c6f95ecababdae89dc27d75d54eef94eeab9732bd53b3af5eaaa077aaf6d553b1940b319b831eb100662102c483450fba2695c018f40e75663807dcc2820a0fca78d059a412e8c344efb0f6d57d6ed03ba4a37708fbea4259e81dcabe3aa9456f10f7d5c92c7a83baafae0a426f70f6d5554c7a83b5af2eaed1fbe37d75518dde20ecabb7b842b7b042ef0ff71589ffbeeff3d6a7c505da83351ef415a904d2313a7cca49522935924a5f08f5a19536501f865e645ff80cdd868734681e9893cf01e3ab8ba452b81aa2f717fbeae4137ae7dc5727d368a21ef4ce4d5ffdc88a3eaaa2775efaea3c60f4c6bbafcef3456f7cfbea2a2d7ae3a5afaeca529de806bd2feeab13d9a0f7d5ad29ca6e650beebfcf55a4d297e34361f6a0a74825302495321945ef5bfbeaa51067416fcbfbea3c4d30c642a4c863ec4536477e25b504f07bfcecf3198b901e8ecf1eeef019cb90349f1da43407fdcf3f52e9cba412e661d2ab995ed5a085a4d0426ef4aeb7bfd7359cbfee53e46a59d8cd71f4d931a994e96b0c82882a4c273e6dd2d7d97dede8f68eae46127aeff0c0be3a0f8cc7849b1cbcb3dbd19538e892890e79fa8d6e25d1ad25bdfd2b92ee7966b584d096842781ed152a7271d010ec17e3d1d9f81531268dc66768130ae5c6960d9a32316a9f1619240388a4765f9f3785a5b8aafdc0127281f6d72fcde6c050588f61587bd728fca4debd61efb66a48f2d2d778c616919e11e826438b3115640cd0e863a4c8d51a3d0c8e08ee8ddaa745e4452e1b19dca51ed1189671badd5e8c3e27e8608c4057f848f6c0639244c4061783841235a4310ed5c1ae918441341add4b58a3f6c39150920d2ebd7834b68450a791c891c6a40dac6f0c9e3a8e1645ba1ed2ea06d60ca237aedf211d5ee13502803dc90f83b0006536c70e6b7ffdd600308663bc7563048a0a6d367a222ddaa0aca6abc518e3169015fafbed0f16d1bbf6f2d2758ccd2cab2145b24311c067767c667304124e7a8d2c28b33230edd8f4c6f4be3e1466f4be321b2243cc60414e6a8048e2a4068824f705ee6a4f181f185c8ccf11cfa968dd80fed6f4be02204486a573070b5985c498ecced0f4703512c5f4c6ac51dca223108e1e9a43111049089fbae0503b531e0195871e9a2384aef21fa703463a148130f41f2710154dcfb1a4672df7f8d971e923e9ef58d253144b4a2a8124ecbcfbea62391481d14927736d34872220fae8a339c29094af9e5ae2820576d6154aa08244ef14fdc7f9e3e4e0e23204569d3a74fe737a8a0db0518feb8fc0463df661a31e7ba5a7aaa46758d2335552abc11e4b960e3c2350962129b494b089dee1cfe828008d4036b308a02080aa0c552d3117c89c366644181c6a969a9b1c8cb0600511a748afc5957ad1818a214e9168149b8ad03b7c31024d19e2f90edd119637f6034d77bf2c55e1dda62635182e0784ed0a316549ec14cb9db2be189606c0424aed14ed480aa13b453b8625c50531c6cc7982971f9a4e3167da631ab2748ae63844852b869d203b25844ce87d8d5065637a00738e40420f95a7935a0d48a85fc49cd46a10123975c96223c218a400c6768a4623bdaf211ef68ff0e18aa6d3be91428526202cda2442fb106577dafbd2758372045b2ba20a27b093041599a59387210f689aaf4ed37cad37c854819de28d71e88dfe7e7c96b50bc2728adaf1f2830f0d5da2585f76219820e3971e7abae46a9a8b1cd6961e769c8410bf50e971b3f2924577e161f525c6f2922488cb108d1b6f58acbe3cb16e50e296362b2e2f084dd981b2020385b8e50bcf1734998b6d87cbaacb099f53971d3035f0382d69215b75d98d5e84f88051417f8101c809aab5058990130bac30415cdaec7c81a3ea125ad3cb81af7eb38bb6d27a5760aee0c983a2f9eb99e41180bf2ed28c43bdba669ea9701045149a9e8414a9562044f108bdf7de7bef0defbdf7de7bef2582085dfd5eaf4257bfd6f1596d7661466f461131a4c86872844ef58a6c7853a4820ed7d0c04267278a6a3a55c6a58226a7c450a3f11317127d9d1431db68929784985a931b580f5b80b052c3152f4d0891a1d0c5f5020d372474188529851a195934686686115c4c379aa7071a737498c30c253458030d1fc064114289b468b7a84ee58659547b8d6c493d2a5c0358f34a95b000d5d4d6b54557df3a7f2cda03edf0f08103f859020c3728a108536476e070f6e796520980f6d0e05b8e51893a7c888a38bea0e8e51e1b46924c0e1cee03d5697bd788680972a5817b38b2b0628d667ee7dcb5504760581a87de0940cedd8096d8e1318341ce4c8ed584a7474b92191854f888d4c1e20de8722525e9d081556f7a7c6edcf89d7360e9824fd0d3dc2befcf092d7eea20cd99c3f31756d6f003b4c6469a25d2641f1c805a567ee7dcd1d78291a3df3997e5c8aa88c174e8f86f28482ba886750a3af33be7728e22a988101a32e3ca99c969518a21223334726672aa1673885cccb02e21275cbcb03d19b68e75232f6014a5c83630aad34a0484aece81157deb48c2c0c83453cdfda9f011c9755a58e837e19a6c7b2e9cf4475b4ab334638071a7259c409ea718456460e070abb73d8aa4722a928185bfa89728071933d6681747e8eadbf666e031b4ae22345cf94d6bc8f672ae675d3c349791edd93af49575d787dbe4d6f0f6c2c053e1f38e089873aedfad9c6b7d4b6f5b39778d6cd04635cc04e5544251358e729d9ccbb99ccbb9bc047dd95e96d3aa4243116634d8f6aed739b29173ad6ce6adedbdedb562d0d5451b556cd43832721dd1389a21a328c6917954fad1118ca3a317472e8e8e8e8e848e888e86828ef0d1d1d1d151081e7df9e8e8daa3a36a61ab7c44d2a764cd42d7dfd97374470b1801da88211ddc2333ade8ead65a1bdebbd383ae4e7fa0b6946e6e3f5bb424a1ab5b3c54a500b8e7860110416d30b6a0a386150d301210d40c16ad48c573952fc4087f8c782d67307c72783124c40526bd1085aa2286aaf846a8451641a1109a165e1de921a1e0096d0edf39e2a24316cf9895ca0b49d444c4e41495b5d6526bade57102e2d50d652864056695305d2fab2583ae6ead593a3d3afa196fcd1d82a795688e387413b3e88d49237a8743734826bd7108a577f8d4453f9a29a5d5fa11a2094408ffba682b136d710bb75c2d3ce2d0881a59eb460069be62f0d6c4d6459ea0776887e4e80bd6a1037b6b12b110daf196f76d39c49383c65e7f53dc3ba06e60bdfa036a55a26eeac4d76a447dd39d11bd513dbc2fd03ca246d52b35da38be6ea0bf52f9ead4dc2f5c14a93a4f0cbac66c8e15c0d0a24d803f9711b0afbab30eb0392ccc0df6ed83cd3dfea6b8d27e28669c6fb635e79c3375adf68f2fed83453cbcb475c1a754c05c516d210e5b5823e99e67f6558d91305ca238a9d725b4ddfd0f2742dc4459610d9b2a68e7e6e181dd170da324491237e470e44c9cd3aef9ea3c4ae80efc5504d8653607e641f29f57e0afdbd262d387ebaf639327665d3c301e13acab3a0f1abd79603b697676360701bec2412a0307090ac909e9e92d528e0786d4c40343b2f120ddde3a12ecbe7e2cc161f644991f900863c2a9e637524c0a254458d1c60a912cce8df4c46f243a728ea083c5942974d29c1b29cd6f24da5bdf483524a69d2d36e0ec6cb13187ce6f1b3ddc3572838bdad1d9c8e9de6a1bbbb76e63765f74ce2e0c94245084810187e6b70d1869a278a1810e1514aa9cdb8613bf6dd8a658d9c29b61f6f4c3b96d9cf96de3f6d6b70d9c8da71d273692ec38b1a1c4c6111b48deda58aaf56a366036626ffdc8765ff40b134118e192c390296abadf4745cc44d1030f7472330c39f79199df47b9a3dd5bdf47bc2338d40547cadba3a61dd8d11318d38eec684776b4233baaa1bb2f13d0e808e1b530c49a5b13bf6b8c2fcc00c68a314b4841e2dc3598f85d238a85999122c61421c50ce73e82fa7d147bebfb487684e44c8d32676a40d5707a7a5b23a77735a4e81a57de7a0dd87dd12c58388da1c1e996050de712bf6bc46a2cb978028d4c0b9018626fce5d4389df35686f7dd7a8d560a20287ca1c375154fc36eadd8c7237dd6d6744336a32ba0df96d84337a5a629464899112a32346482aefb7d112ad47338219c56eb9ed72456920ae281a884b8aeb898be9adab49c75c4b3ae69a69170ddd7d39004b18a614a0e4c44c29f39bc68f9a383b584953468b0be7a691fb4dc3e989ce9a222534fda0e6dc2e32bf5db1b7be5d32171256181a65586168406df94d23c7cad170ca3db16834b168d858346e6f9d06ecbe7cd08058b3242a4e94363689df34b2389145883a426e60cae1dc34646fc7fca6b1748b13850c11606290726e1ab3a7df34686f7ed3a8d160622d81c35a32e7f67b468f4573c3a24535cdc835e99a766f7dc6ecbe289913b2a8f1214b112b6c10f37b0603b0344161892db22154ce3d0389df334ed0c298326ed4f482c439f78c30bf67dcdefa9e819bf134c58c245328793b63a937e3c8aa87841593c18acd60cd88bd7519b6fbfaa00826624d3f2831c49913f75bc62d04298c78018c0f33c8969c5b0698df32ac44014514268ca10226e6dc32745f7ecbd8bdf52d8327238a8a8c2854a4bc95d1b4bac97872635ae564ac723256391945bafba24d541182841a26aca0e2c5cbefa21f4228b1c29423d2e0c005ceb98b9c7e177d404e99244090342167c9b96574f92d23f6d6b70c990c244b8aca2c29822a727a7a5bb42a5a15ad8a6e6fbd08765f3f5ab0a9d01405c6cc0e339c5c7e17c58a96a080e3846d0926253c9dbb68cbef22da5bdf45b522a61510382b2073dc44bd8dd15bc562ac623156b1183166f765e386266e784e20c9a277fb1da3056b604bb04003658477ee185a7ec768518598d8102266be389d3b4696df316e6f7dc7c0c5783a1323c999184a621c89818400bf632ced7abb18b018b15b6ef7d6b7c963fd36a3a89851a89852cc2726d35bb3e9662eddccd9cda4bdf512051e9860608384ced3142cbf4bea26892f724e80b3821929ce5d5ef95db6612288963558848039b769e5b7197bebdb949948969465969450a553f9f4b6246925492b495a59ae612347c604ca1a25557e9746cc1871836c061b9523e72ea9fc2e11a0029958094f946401e5dca5ed77497bebbbac954c2410382490396ea276fcf61e19f31c19d391b1dd5bf7d97d1d194182c4961d96b8c266ca6fa735dddefa769c3f9df124675c891f71246f7d69d7db396c177beb306cf7c57302152f08e90191c409e711bf61dc7230766f7dc3e0c188a202230a15296f61c0a8e9f80d638431c21861d0defa0bdd7d91b82298c4a0039d23ce9c46fc7eb1dbc109549c393b1b9ecefd42caef1730136868a20a981c8c08736e1845fc86117beb1b860cc6f8627cf1e2c5ebf78bf1c5f8627c718b2dbda0bdf5fda2f682690402670432c74dd45b17bd31e62237c65ce8c6d8eeadbb98ddd78f174a68c345052774d0183989f8ed82d6646ba24c992b900013756e17517ebbb8bdf5ed0237fe76f174c64592332e94b838e202c9dbed6249dc11893b17e2ce0591edbe7e144104962b4d6e548882a1e937d19a3a4880f1720314299c9b6888df445ee2388185c90e585819726e22217e13eddefa26e2114551218a4285480ad113a6b79ba8e946b474239a11d1defa90eebea89c18d03c89d196c4b04210bf8776bdb7b1b7be8964e26f22244b86ca2c19821a727a7abb8772e25093386413876e6f7d08765f0b10e2c29c3943dcc8c0c4c9f47b2836e4458b1055a08c00d9c274eea11910bf8768b9df43b52126b188101cb188d01c2137516f7d0bf544991094284b436b12babdf52d847b7b6ea1a7324249ca2879bb8596744247744248783d9e104c28f6d6836cf775c30a1caa843942892a2cfcf03b4886344070676ab8274c387710ce42f91d94fb12e68dd318d90d40e89c3b4817b47beb3b88f7f33b284ae524288aca8994b73ba8a916f4a416c4640b5ab205cd6cb4b7ded2ddd78f13c8e066f0c1851ae2c870d67eb7762c30224d19384f309460e6dc2ddefbf0bbd53b41899814363b30e9e1dc413dfc0eda414148e0b4cac0817adbcac15a4eb02795aca592b554b2560b765f2e6c479c18e2c80b39c4e1e1770b85a7a72f74c6186172c3b95b4f7eb7ca20c14687355bd238d970eed66c87df2dda0ebf5bb516d316385be6bcdd40291c500a0794d201a57440291d10d0ecbe563a166e4803c419294374f80d74013863a29c085143c588730339f90dd4642a4923a60d0a53a244393710ed37d006227f03a59200a59200c5f80d949a01a56640a9da4faa0694aa01fdc4b9116152c2071e144a9afcfef9418413283518b1f321c7c2b97f72f8fdc3a5cd169c962894f8103bf70f0ebf7f766f7dfff07ea252407ea2a480fc48f979f2c3e4bf7f9adec67e7e5ae8ee0bac193133d2c20c575c61f2bb05d01b1d7ac025892d0173ee1637fc6e41e11889610cae8c131e9c9cfbc786df3f31d90f92147eff2cfd2829d3a24c19a8b7bb454ee7a47b7aeb2d6cbc162d60f7f581182c68a09062f643104b7eb70061e643939cd8131dd4b95bcc7eb710df5c9133c37342b33b778b1a7eb7a0d598defa6ed1d4424ae8044ee864cedbedd3abb9a945d97c72369d6df7d67d66f78580a5248ac87d09724b72d2f0db8706d4440dae8b921e828039b78f9de1b78f1ada9a1ade68993224766e1f25bf7d6e6f7dfbe0f26f9f27383e49e02879bb7d964298cf9110e6832494f542990f2cf489bdf51edb7d6920080f75a61421e688955386df3d3711d0c014a11bb393c23b778f0df9fbbe9b8170511ccab93c1264954745e5d1aff294a86f3ebb85e5202cccc2705879d886156261e55d1e175ae66c33ce21d09c5339670fb3836176fa65b2836c8e38576b5fa83630abc456f9a07f39d16cb54a0e94e1a84b18417847d4d29684145caefecc015897104db4b84eb601bc92e8952d1ce8a44c8ea2b9c3a4a4a42bf50a112b67ae88155f81c7948736beb8f428da18a188ba321e01db00b221aa8711d8c03dd45a6d78f3f77d2008e6325f2ef385a3be813ba87a984832ceb88918e23187f9cbf793128efa421175350ce98dda74243d16559f06f718e2ceb0ccad6365ee24d2dcaedffa4753547df8c3fe79ca3f73ffa8fde7b8c4d807c57d0549a54ac9109442e751490f0cf038659a38021570c0d00d384b71a31a2092e0c02362fd8aad6313471c6dfd0e79701d3b364580efadb4d66a9d419cc55aa17d5ab5c6c2bb3517a746a9f0cb2108fe65f003c19cbf9c13e9069ada2cce18e38cb1cd6e3f107411b4a0052d686db6260de1e60cfad6299f28368bf55bff67ba28d275f1075d7dbb5c14873e389238a9f1b155016161e8db35923ba26f1b9f3db5526540660457a509ab1699f2ea9683eb6376b134a2aeec205c2408a48c28e09ff295ca0c29524ea9805562a5d07eafbf1e8e3a839edc1727700630247ceb6789a36795af4ab2a4174dfe11da0b470cf1cdf9fbbeefbbb905d5165c8414f4cbf7eb92290e9dbeefcbdff77d437c50a852da5d5cbe9c3535ca385586ba043aeb6caf945ac32ee2228cb355f9a6571e0fe071068f6d68df44dba755f4784cf9c68f77ecfbd8a957ba4106ea8d4b6f3b0e3200faf5d67dd5d835baae59a0afcc6d7f53a8903477a847736b51652a85dfd7183926e68112043cbeff4c1028d275728c06a9eea6e3adeba83d8df16355bf2e2d6428c0fe228ec6aeb2a96c695453923e9b2adcb8458553e154367ac6ca1095ad85ac8591f7428ebe4ebf5a98cf07a2cfe667a348d78f769fedb3511c7eb53ac3d1c2aff63c2730d55560bbf00a1e873e5c8fedab855d585a36b76c6ed93c80265d7debc83af2f761d7e31f34b62f1f63976cc2103f33d5207b4a058f2bd5207f372c4da854831c6617e0a7df97c10f0473fef285c23b5bc489b815b4a0052d903d0a605f45d867b7e5f691a98c2255a7e407df49ab196233ef9e76eee9fef39d7bdf099a62ee067d5dccb4da1505cbefac5929f7616cfac8bbcfb5174af8fce5dde31d5bf622e650848cb1a8325359e8a450ff9794730af20f792082210ff216819b2336f5e3aca835212040b400f96d6776765dcfce5812e72ab714a67d98e6372c4d507fe3dbecaf03a103ab5381fc578b8187f392c738aff0d87311fad237c7e88ecfb1a9a3064518863060c47e671bf89fa9ba51a4eb260bb6bfaeda523b82ca11355e1c2c8645fc67b6722ad43b3db674e8484a72b9dc5b58c23195c2f973615c77764138eadb4a49d314f8f6d8d46134222ddaa32d67247929cfec95aff98a75657bfbec35e36c861887f68abdd957e8d86c599c1361999f58a36b665a4de34cb339e895bb411e2de70c4207cee441df204fb5645dd78f7e502de1dfaaa5bf9e77a6fdb5b83be4c812b6b8d1f695107eb35ab15b8c31c6a6750eec8ddd3004c17d818e4d5bbb312f76e9bfa5da07f7044d0cbb46d7cb13ee12e55d1ff58dd92f3e9410ded837030227117df6f95c44777c9e3d3b766129a92b7bce395b2f3f6310fccbe00782397f1913d1ed1699eed8e1468de641df2d56605df9b3390245ba5ea308da3341fe4d7b749772d304ca4ec7e355ecb5c455872dc6d8baeb71cb5f6292141eb0461c5ca30b9a9f09c213aacba553172eca40e5e0aacc94199a1884af03fff2f7619cf4df119faad602de8b2fde68ecb5c7b6f491657607ca63c735ba233b363766a331fe7ceffc9df178f1d94ce128d275a22174750ce5779efdf5ec23cb1eaf091266d9ab6a374bb845b04e94ba3e3c0216c1d64981a5f2e99aadd72a02fecf6db5d47ee60bf49cf34de75c648d6ecbbab0e94e34a9add0396b9fd687ab0838e3c74f8b2e1e43b658befd957dab3e670f537447cad1e8d204d1839440bbc82a5bac5c7c968101b2cce4e7162278acfff36ff5d953650ac057fd7cde8fbd03f03f073bd09f724c7af0fd678640ebbccacc1429b7e073a576159a982265af1fd520e311b08fa4163a8cd161044937b43905eb389738b0d016bb2884238eb66eed35f1ad7549a44557fc1c971ffef0f8f533754b5b2ad211934aad16766c6eddeaa27dfcc39efd73b0c48185c61e9aa08be0984b211c713476faa0635209bc98ec009b2625c32b74c5a452e8daa7f559ebca5272f85f0b044b7a45950a3f103c7f5e6b0a72d21310d4f1d9afefd66771e5d9dc227c0ffa5726891a65274b7d55a9b00463e9d428bb58e6126410fccbe05745f83c60d5a953274cc1175aac8348a7fce739955539e79c43cf1904415095ca39e79c73c61cfce79f873ff68fc75ffe722633a59202d6a1b97d8c5da8eb73fa51a32ffc6ffccf2be9011da3c3181df0f898f75dec5f893107f6c326b6185b6c31f679eb19e3f2f35a8670ebd88ff2c250536cee1097ba8dc6bec311ef60d695cd6a82755d772bba7af863fe3ed387253d48b1c064cb633cd481c5e60828ef312f339193eef6ff9c86d7f53973d139059aae07b1575795941a81e1832b78ec2178c19cbf2f7c4a9a23703d3693941065dfad2e0ae03f0c8c76b98348df3b3bf59f7fdb07a5f29f0b26f4e7f7de1fbf2b7387a4b9f568ee96686e37b7cbc74173277d0bc7e6d6e180fbfa315be8d0e19394d4e372f1b8efb45adafc4c4ae541cf531efbd78094a5140934b399b307a08931089a3e28150f58ba2940863ab0feb9f5cf1c01a5f2d8ba72958df62342a41be82f93c083758afd7a756c7e258e38ba36207c91eed0644600fd6a8a703da01e8870df8650eb5435b5c2aa09b49af5d67a6bbd9ef197bffce52fe79acbecb80ce1f220bf4591acff1061b34d568acd513d9664fd9a195897fd51a2b76db24db609f734c68f5c4123a18729b720cb39b0ada2773d007827f550dfd78e537705505aa6a851f550f3943c0c65c7391b4f49afa72e87acaf1c9fa972c89a3caedb0fcf68ff1578bf75d2575b6ed776bde8db3f95dae1efa4cc9e925e23bb53ea5269f44af2105d15ba2d4155e9c3f561ca2969ef7710e4a486e943af3e5c1e0439a901e2c3906566608daa7360c367816652f8e12e852bdeda30a2f57b485f1acce4d08c3842e64a94b3baa6af1f26fca06b52460c902f50ceeaab5207c98113da7f87e2d32c2c54f1d60c47fb75112dec494091aedb26fa3a7dba6536e7f197e0cd0a284f049bc3b6f9bba586347fbdc8beecc9e6379dd30109e88e9c1f013720721ee85bb6547d2d43a821d41445baee29e87b6dd75602bf610883895600f6032000f682585d85d66d29d11c210707a03ba8539775eca1cdd1c3c1012892f51e6c2a5197f5035817350d409160d0b00de0dbc7f806a03b546f9d529c4ca43baceeb18b14bb0d4abdbab12f0eae11f6568dc2be89fe8bbded8db96b845d6c6197bbd839b837f4541942dd3f7cd0de833ec6071d7f35e957e2fba261a875cb71d2bb4c5fb7d8b1d7ddc53bab7b23561fa1f7d85f50a1775da2d6a4eee3c64a605dd5ec556b12b568ad15af765829a554ac1b6f9fc73884dbc384b62e1271e37cdfd72b92454b131504bf1c72dff7adf9c030950ac12f4b98efd3526b0ddff71135c1aa350917927cdf8704effb3e324c3e304ca542f083e203c3542a043f166a25a244870f0c43f013aab3458836587cdf6726562b1886e0b7c687effbb27c60984a85e017e603c3542a04bf301f18a65221f86d615204112178f5fbaa9cefcbe1fba8f8be197090f45f4623099c0c3174d0a9de992cb7a22f317ec0b9802b62ad50d91ca33bb253af6fa9e3268a5395b5a6a0bcf5daef0c73f1d54cd58ce4d252a47cabf88d1483210e534536c3b003324d5157f60cbb2fd2014228b4f8ec3bc7280e971f75e514fcb5d495f1d782bf5ec11aa6544ba52c9661d728c3322cc360e667af1bf8eb15c466a5481954855fb62b52097b8aec41d1fce798e41180ff5ca4f88a2a954a65f52abb0a16da1188488b76ae5568eb0feca9afd10e0e3647a52eec34bb8082b55e8cc35af4b445b4129fba8f057d83b1de483975f12b317551d7488d2abd11ba0d72f1966efb7bac3853574d6d153caed45541173cf69b0a2bc679749529fad2d788eed001a2b1a834aad7b1a21e540ccdd008182008000317002028180c8984b2300dc3b0881f14801072924e684c1dcae38110e3288a52c610640821001030440046888856001c866bdbc7ae60b7ab0e37ded08ce85554b9794227fc0aad105592e2d0ac20ad5588bd7e997a787d0ac6572162467f16454b7c70b3860fabee2e2544809d7e74e4e2878e2ead90481402b429cf5152a3757b8630e0f2f9d08724fec7c2b15c69b26bce93e87f2ef1c76ed24f58d8e6f000ce010a0262fc80e8b2eaf831d98a51e69f8c75dfa69b49f8f49429e32eb8b939fadd49bf973222c185542a788113e55a072c1801631e495f323a5a27416f8d9d5103d82ec980347d624a7d574b5f367052df2513e36307b4d6d397649c2c7f29836cff9e0088bcf07675f3e50b6da426b6c409d1e411c7d622af3dfeca44c528ceb15fe91929e3b2b0ec3c5768a6276a0a1b018ac64a11d11ed0022820560e6e4642f0ea959e42407db7519ac540c6d8cb594f7dea4bd338c24daf9ff20bf71e0ef67b3bf9f4dff82f3dd96954d315ad504c13f02d1a61132f4a0a8d11abc8a02b9a27d89e9564ddc4434429fee17d20442e54366b6430a64f25cec8b3b4f59f4b8e0b3fc5d03e120f352b6e82f0b341f48c3f39c6e6b6f5a29aa494da628fc124ad689a7c3d9d5ecd414ee656f680ff0ba5710c7cc3247b46cbe3757119f0e6c9228c4c927349fe4503363eb5a75fffa2035389f1d07950f741ba072e0a0240b1bf955d06ff417dc149cf1c387b89ee8847a74219a6492c0762012a458efe61b226eef96ab6b9a370d292b0897cd8c1d16cdc386d1f51d17215d33866e5fd63a7410eb6b448389e7f44dd152c486bb6b144a9c92afc409f23f443a3a9abff2b73ce26839f430594f9e63b0fb78f5b7d2222b88519ffe3a5d9d760e042100b425e532cb2275c54c65bf490e967d40339a5bb7458e43f16fb18fa640dcb83a3a27e1f21cdfb14d8a5317ef3a9db7ea31cdeec1a7efc6a19972df441340e43df72613515f4e5f34f91462df6b9514d567cf11f70531e89c288d43628cf30951feee2876bf97cc7072f3dc4b9683cc9057d4c7887dc300484298805ab1557e9b94672dc66dcc5167306689db4563f76b949e6cc07e8dbfb8aea7b6d2bd495a8d22ba5d70cebf2f80a75f402ccfa9ed34c4ccf729876238a16bd08762521f5d93b58b9321444d1d5b9b3fb79828cce109d9b84bf492d8b0b854189e33a8f150c150c726d3ebe12c9ea51a2d2541fa0ac7a0d1285037cb872cbac4a105efe1c77626e054e9305db92bb60ca25049891ce9f29b1bf1c64d6d5e1084381b766ec40e51cb6541ef757007d8677bb3a104ce23b23804a29011fef2c9e0dbec2a388bd246ff97e4634711b9e2c164a699688d9b5dd6bd1efde45b67048057d1b47678dd322bf0c289bfe4551e7daac531d9a8bd369b36445755135a6c2224c275421805ad4378ec83dd036d0134a6c5e8fdd0f89e91a0416512f6d4051bdf2e0fbf95acc8e7fc67881ac2031e97df81eb80b22d157e0333dce27127d238117546564313114b1976c3071f0a6982b35796a08cbcf925754d6d3b3dc25363678a8b1652e1d8e8d2c98378f1981c055219252e7b6c0ff3641878207dd0c73cb5315b96ed50713acc99e5a4956d073b0f2e6b4483bc76e5e02e79032a2cdd48b9990c492448359a6ebe373751e0ac7a370b4717d281fd7f970ed9248fed32bc5824ec4013a019e58c29d08773374131ee99b914806f1e882abd4237cb040fc06a5e5127cecc13051db63bf7522505c1210ed1275f1efd71ccbc12dad1f130078c12f2741bf097d96a17c6b982f552970e3d704c409cdc16bf4e35da688d36326288c6db8ba964237a3c7137b7894d96f3ad0cfac58f967d6c67c5d5ad01ebd502b29e3589f951833c4de2ba1758339cbbb12ed83c45893757cf5fb1a9345a59953056153c4abe7d2bc0a5922762685c30862ca4835a05fba66ac69c2492b4d6b6c295b947078365efd33a1f7580f0278f6ad7f8a26b3f950614d1fbe709d61dabca739cfcd2b7cbc38d9bcf341f42085fa60d2d956bac890d85918645e358408b0104684fecf2c8413bd875edcc68819d5def50737fb197c3394071f205081a5bc772bd43ef64ee7e2e9f68bd93660c6eadde722d56b6f0f6361ec01e907ad2faccef819248d9585fa2e7a84c13fd37cd5be2845c56930c8b5dd133f8ea586af9b4417f4650b2bf71ff625a1736ccf25fc3629ba990f869f4f7d737560b3049167fa02a07f585bf7d7c9d5a643f48f7e495cea5a9904d3e16ebe0b8ccbd94a78a3aa8449fffabf9aba0448f1959960d7189ddfd53cfd2d746d7c5f8052bfd8b58499db3f624c729ae46d2d5eb67fb15ecd1adebfe078594bab03a3be20742adc79d213238de9599e00cbf894ac12ecc5ad6d02cb169a5aa5a331bfee56be8ecc407491d4cf7bfa5308e8e5db028cc179361c599f7a6d5b2e41af005727a596f0311d37a9f22329cf1e3847838d3083afee8f33f8e809ec93e5e74ef232d056493017161ef1e20d33ca7cd467daca757f83e3d9692a0e90aa1a7c84f97f51b705e016a98d13a882b09526acd0189f1e1175271b502b26de13f25b38f2fd9119073c30171c200909dc79c5de1eff14b2dee0d793c3d95603f77440981eb86fa2a15f73b7e43afa9f472b81740f6c0b75393ee12f7b074d76a3e23a0df338041c939d57bc58f78e64a1ea904cf8aad3533647301baf18f14a9461b1e36c97838a5231cb21eb15e7ff96e964e9f78ecd9d32018849dea4a9d291c6bf33994198e768a3a2db22124d74716d024669575113bd089303cb59668963b93c3732e08303b8f826b300fadb67cfd003376a2abb7a60bea9c9a1f3933bc0911f3700d71292687f2209aec86e633b502eeaf310b03fd907d4870f12f9c15254beabeaa609150b59ebb383c53f0274a110356c98570c0affda61f532e57c38180081c1faf6b1c1879b03cc74aa0166f82fb7a35fa38f1441eaeff6f0c1951cb4b6e6eba7a6b40a1040688a00f5329a6cce0780ad785b928e2738cecc15b94b6649189efe4abb3de85c1a2947e9ca4c085fc9870b4ae770044ca9b5f80bc95720102b9f3da2f90483ecf1e03993f0000b13ac992624c662ff8cb8553307df81abde0425279fccb256ce5e4f0d6ae0482270c2566ee505005c2688ef28f027650d79b323c2436fcf6bd72c0c810626bebfb74b997e59469f922a2638e13c8a4bf81e982b57381150d7191188d1fbb615a31e75196566fe702b4caa3626af6f9b9b65ee4d84f4f383cf0afaaeaa167556ea561c966107cadb895aeed32d374592991835f09d1c677498e912d04828352200d453970740e51d5807c3d50fb83ff18940556b6ceac5c236b4c9dd75a5c126fea93780e4421fd3b3a033d9bd42df109908687408e4c0f1a692991ec17ea21530eda250387f57628b843147ab5c32add2f727920620c9973897c1457840dd45361a2d8512d4b540fd4c212c4251fd5dac8e282a421729b921b7abd9c2ce083c120608b1b9303df2bc24f7b65ea1478a151142025e04469c21d9bcba7703147cea7cbcb8c1a98479163c3c0691d1098e92c9487fa73597f50d90ec3293b552f4103a10687c48eb7e016db57b5610c370f54f87b51d5d4e0a32bd79881a9381e911c9bc7d36028cb6b106df3d3fa1bbbdf33e45df40d30a48fd5af1fb43ec150941464d604121af9cb1ca33e2f237782823178faba6e33e97555bd634ee57a2b7633813c39de40d72841f84941321a69a6e9ec1aad244023ffc07fef5b9c80e07bd50b728d0121a7b51acbc06a8bd6979a4fd4c490078aa257d04ec1b43495551423e827d7d612143af00fb7782f3a2574def1d45654c12e45aa5dcfc117f82a9f42b653fe43da7ae6ed6663f0460c74257d59791915ba47febbe1aa776723eb2b3fce91799c96d56b2f532ab635a78dddc5445e4caf00b294e98d7cf4ae1f4361bd57f7521073bca695324448a23f4e9c7297f29c9f28d71380c441a83081367b7eeec206e38bc8f165f964f906bcbc9704b3923897d719bb7bd63cbcf32eda4e750dc645a6bb4a8b8f8e149b9d122a9ded8b017bc018e56d7b716572e450292faf831f7e74eac47061b0065a9c2af696ba79f47019723fe793f998d1217f891f1f806e31c492a8d34262e837dc4501731487c9d3724fc7f705b26ab184ddceac7ef3b6004d7e5ce61e73d583f8e7166b25cc00b3108989fd6284273e87b5eb2f31a1314e4e18648f695b011950ae7856998aaa757785e2b622afa89b0e6f52a34dfa4e8739ddc0e599fab1f5c95f8cf9975a02241c3001ca49e42054166dc6a27edec0010399fe03ff907ebff87c0fac06b5e5ca10cc274042f7afdf4a506478605047e9d5fdeea0fd1f3ea50d8d2583c6d1f4546c3b37db2c58701fe7072086056e3cb14c34e038772795075bc9e446033e61bd1113a80a2a3a2812f438a2e407c76f5ca1bddd709a7f49016ff1662c9998d384b80d67120a7cc1f817e7c4cf18723a1d4873a813287aa8578214d913337d4496a890dedee26f9d51dba9a0b7ba586e2c524af9a46c030e93f6766063e2d9c161c0a3d9f90ef85c58ba24e26a190a4bb5978ee460fcbcf28f758a9290a4cf26508a07b47d40de616907b3e378b6e5bfedfaade3334b0db6389859dca7eeec4eaf863654edcd9045a7e4400821d20575ea7991a5047948d6fdb4a2967fb6fccfb2c735d42c3cc3871b9068d78964abc826e85ab49b489bd5b4be5b4306a699e11e15c6a16da0a4a8e04fd484f92391c8728b9bcb7aa5038cd7c46b4d9e0d04e8e8f937a7d1b450f3e395489d19e060b9dcd041be86720b2339101f60757c707973ad5c4c82d8b8e280b426eae11cafdbb33e4d95a52f3ac3595400dc809b282410634e2064ab9b44f4b778e7b510bf7442428fa3fc0e7f266165e365047f82c0dc93bfa0dba0b640152b4a978e0232cc17056c01c41d4734243798e4ecd042a8a581e7884c0d0d610f7685fa2d36c0995ba2a36c16052aef7159192ed4609b698eeda6a9ef884c7243814a4cadd45b6c44bcfe30e3f625d45b3458654e1698fe224ff24ea4d99623e0bcb284a99079dc7af50b199bf0d408cde61301aebe2ec1a83c4b4d0420308d8a8d4b764733be94b882b4b4b3421461e4a713f1ff7bcb2d97dcb6d70825265d291f88cf420e8accec48cfe668ae3d9d1ff06df0a4a0effa31b6ddeab5237ebb1c644af89cc1c99d52c4b9802270d595e5cc114b73144afb50c9f78b7214120b1f047e6bb02c7489f83c3eac53ad3b9ab3e017df70959c2b2a984baa4911c05b6cd49e060c7905ed54571f9d1e9489e44c65fe97470286993a09129860963fc20b4f0b1400c1689842023180b0614dac1f4c146c12188a6632c6c5b18ace15d2e34275af37f03a25bc3741ad8a6830d737678416795567756c50b98c4a7034c17621144bf9c6104cafc55e5c131cc822f9168f9c2619845afc9c637f633d164c2a889207c4ca25a814a396a2a8faa0c39d95ec1de8b94a11bf10726a1b3ff68494a6788fdce565c36deee2a24404d8768bc82085149ce5743d855fbf24ac4b1f41bc03d80a6b723e1d3062742fa991784a8690cdf6f629b14522a6942ad43407cde5eefa66410644784c31ac837341fa364a585452afd4fe1786a978a740759c819dfd25bb9577c84f0490aa3779c63a558d6491e076a8792b0aaa913441944cf125269cd7614948d05d0b7a2e4ba925ada979036c3e7a5f9ad86545156c5fb28bb3e662fc8aeee1f7e742c1eb3092240d056ce4e0781d769752ee7b6687291561f2609ad3ded4b4a01ed27271a33c54e7180b01db5b5f8059cc9224a04d8ab23159211414f08321e813a5d08a19612f691c8d104155ecc34b8cfdd86d9030b0a16055c5999f8283e5964492b23cae2543580cc1c4d683d6dcc7dd94b137295795cbd81d826bde1815df2415fcdc2e28a902f4ecae2e9344d40219548100662d96091919a5e3714b0813b310325d23d3a3e765369cc7547e45b62ab74b60891562579b3182f0456926b84570ca3a6853476c50ff1ec425768789d321eb5cde98a0231e0ad548b19c9a8106c6a8a975fb2cc72cb700996fd638e234b146d2988474a4fda35200ad9cda8fc80332e00dc4afee44eaa3036b7c9cbb9700b6e9afad502209fcfe8c0f20a2155b53ecb4e2ef51f7aca9dec315222cf96d4fe9f271598619403a56654a4713d03243ecc07b34735a4bdbc941d23e89003e1b558d70dd447501fc229fec29ef6f9123b75ca227714555c60a9f1e5585263077d09cc441c797c2641b01ff111a2794084211144cec689058d370fec14f5538820123a66d73f427cdfae26f972c5c8f4c630ca3c7907df61fca5e49fac9639f4240551ca104ba7e0fa0a8373f460c9ac3584b416114d132f781050e9703d7540b59771528f1b2da345ffa048a143a5a52996c0531f3684ae47ce21fa795e18b8de9481282483445c7bdcaa4239e0e328fa960b58d56b106db3faf60f577a5b059c4b41fbe540bb79e3af44a782cbaa55b0753b20f2ddb21f18f2409ca1b23d4286656c5e4667b6f2d338ee5e7dd51dac7a1ae2e98110f95a50e5ec9ea31ee7ecaeee232d7e31f68f2a448697d555689058779f6624d5d74d9706ef0f7fcfb509c70364b09dfa7ec0a0606733b548d02b3bd087dea130eddb3d09e922cf7b7a4ab8c949dc8a2a19eb258d23bac932d38c689bf23cca32db1e0610ee8892c9fea8085e80e11f8cf9acd73fedc9543aab70f774c6b517611f8a998e5203a80ac4ad0c290206391e9ff31fa333ae36205e8fcae9e150062d02d4f5fe3cc31c925ede7fbf61bcf17f8fbda1618cfb5884fa90192ca517959ac4b2ea4f65efe7a10e1e186e9e01556cde5f65437d074492de799f2db26005307b3c383a4c037b837d1f515050389901f35adf9402d94b60f589d60ea1aace38b27fa6526cde4a92397534fe368b7d7dd72acea43594446aaf9089b2ea575b99071b68e9b227f7debb3b7acecd02bd186aa38fe4a2320c065fc7e4a026fa564a35e21fb2900300df8765ad4e56253b0a3b612f80f8a7641fe10a6ec14ea9289897c3697c4da92aceb4aa47d56a4941931e3a31c499cd62b2b2c135a0c24f126f3809608b4c991b836e3d10accc4cb1d91562c7796324d961fdad55373116d91c6cebce54beb3c088e1b971eb25e1505221c9c5a5c0952f45115fb8842eca3f8d6404f9713dd6a869a4d745b2a47e711e14b0a2a9184ce6fb983fd5b823134afd2d070a202554ff58135a6960aa3f777207d362c84bf28882d3456982a26ff26dcf39547860c2ecb755ee602945dd9b6e49fd1c00aeb5e0763a36407b887e00e22392ca90e71f494e6b3f4c5c86b435af2561bc0a1140a849add64412749bb1f9e98ea8c991fe07639f1cf3d9234f30a45600782d8e376bf67e6ff12df585f50c86d1f064b0002b54f8fe4560c8141588b5b1b40b501f80977ed3299f576bc63ae220b2e7336596d4c2ad0b86e625d4aaae7c05f4a10a261ca14d095150d7986090899f4dda86f08aa0f130a510dbbf83e6431617e22113858c842d52251092fd99dbb795d82c66976ae70930eefc147426d7c906c584a091e686f735b1282eefa586f79caaef46fa856dea13744abc8c0d1a1517c951d707a9247181bf68aa116da4025d5f898bfa730c1e7f6597361387405e47577424186b84258327781fdbf392c601579175ec79568bbaa555108065f3f209d039784e49c8eda9ca6d366b4822032594fcd0678fc7f6dca4e3f167b693937949756a2e34373e1071b6ffb68d3d4511dc156b26ddb629301de020792584d5b3d3ea18140b9da6926acfa9c404b35aab524e687d098353bc545ff457440e57ae36b2b8d34e5d968cfbc30c6a7cefb17c9d9e19a59123f85726bd224c97dd1bbc5ddabc4c7ff1a51cfaa21f358b2d109b2e313d34635dd6c7975e1daa311b1960e24415e62354f6cda9192d47f42ead09d3bba3d2a632f989e82238185af2b052f4735a938ad071c4b789f66c8d648b8d8a4ac356e0002a418c075947db718b7bf82bff340e35dd629cfd956943324bfee5bde9aa7ca456f1a8f845f8585b414f332745117f36b7725e481f8f0e39a519d0c41eedc18317d66007c75aafee8853544cb0bcb3957be5ff922c7128d1cf7b402b511c49259a2e966fb058789b9973fe3e71fad7ff39f487dac88820c4f83382ee2a36044360646d6ea0ea5c86a55220ad2e4bf63d2b80f148470f7f1ae87d3500f570634b6853368db047c9c1b37475d2b4f6923debc16efdd5c49765a644235de617e22429fc2ff05164caaac74da89f869f3e7372794450771791d7b971f355ad3edbd34c69e5abe9051e7e458939b9598256bde1a657924f1e908820684757ca07230e8a13ff8278de1938276aa540c98cc64905c5e30755a3dd8d23143676c1c7776818024bbfd89bda8b92596cc753252655f40a22ab653ae12510c634f71b1cc9c9f079d1f0a9a9324a2eb010839d1c9a1928277d2c509f5aef58dc7b5cfb22e9f3e1a0495b7512b7933f51b7635822c66a383197a85ca167309e685561e9022a6d970d7cd0b06b071b91235a35b86c04125cbd4d13c5a68ff6884e92f6eb960e684d3030eaa2a8402c83c0dc93ad74b500c608ad6d50903127d8da7658d68940b1caadb20e816e8ef86309b99f163afe14d60ef825af73b4365a6718ac37a25d9f1aac25e04484ed092bac97fb2975e88758f381a257a2f74a836fec5d3862c6a235ce280534b8b9dbe31cba436cb88569b7c668abc781be8bbd0c3d2fd2f9708fb560cfeba5876a340c023ae2ae9b6f9c0cb0453940f443aecf15441f40da049d1bc645b345c52455d7b670034d4ebeee93e5198eab053773db1843ab8d1b73cb3c6b1a50b8815e9771ef672e1e36219977310674b86eb1ecc7f718fabc7b6d8bdc333e1b0b34f5c3ddf84ae6ce5fb92b5b69b5cfd0d7bb01be79aafbf94c317533ee3e8f4e176e7a2b16ee69587a638af57141e9fadecc8421d392a9aec6838e7bd88ddd186a651ca875b19fa36bbd3194fa6eff8a87f3f010a38bf680676e92c6dd7d96069a1b380cb9ef8a730ba39e5ef78cbeef6d8cfa3255b7d0088fa3a186fb4c99b022a44f0e2ee4852c1a5ad82bb89ad4b7ae6a593752310dcdd2889ce05a2c37a9097648a11b8727bc48a6a3ce7d00902a9eae7c28bd3c48ea1fb1dc789a9e09ac6758e58e13dc0f24094a1183bdc95b3104ea6c94b3a43bfafd9780c6341d2ca580590658ebfcaf35384406d7df2aa4be601a66e35b4c74596a641ac490fd3d05b5174f764253895fff84787f64de467bbac9e8f739958ab23c9cd67995e62c04252af2269200a56a6cba25d7a44f77b04f4ca9301230687d65a140622287cdf2604613308a55616ad2e43348eeee6205a7f3b186eaf892916c826a7c0873294075baef9b600759854fad794ff7e04957e373338a32cac4ece4566dfd6562aebc9cf5b782bb27e4903f37b1577fbe3c4e17d17153f986cb9f29e520d110a6343d770d11b9c03e3e2c69a9a8691e65ab8895b2faf12e84da04369765954e6b0ad67e58fdd357395fcd1c3b60bcf0e7f0ddf00fbb5b1952718bac37f9bdb02a20e094487319614b6df000a6a9d43290fb9888901a86c8a6ec74653bf0dff9e6b4287115f10f43bb109bf476257f742f556580a88e690dc9858d4fd1356a356c9eaf81f27c5770bbdcf923b0f083138a6f9b7b9425caffa9224c02953dd9a22b281bfb03202427db90b9f1edc58d9cfd4dcfc7803ec81da800dc6011789ddb013feecdb19058c291055a8570cc27d70665180945f348584ec83dd88b135803c3a94c793e6b97fc5088e90544210ab414120f8fd7f7580a98610f9de7369a9b8827969e0315b47e18e4c74b50e9b89e60ceef6b903e8045b4930397be8022fed4ee8e0754ad3061b99f611226a8720ecb334c2dc97a2aa200baaaf9b32042264225e9372b65ba9c7e14155899b325c4168313b9c915003622ec0a75506c8ce2f3df09fe1050c1e8c985179afc9964b02173b3193a2160287f9138772b7ddab8b28022832bdb10b7dc5b70bb22eeef34894b0be0be51787afa9836fd46c9b0ad1b0667959c574d1100e591d0b760816d58c841d5fdc0eaf87974e3b96dcc13ecbfaf2770ad19c86a5bc2e05ab1e07dd9c14b49c04b49602edb7200a315f02ac0659924bf690540f29ad201f735045a40b41a49a1c95663e96d4ba43a26cd39f0774b6cb348c05f44f1e8109b9a6c899dd16d553293cc9a0c30852fda1dfae0b5823538748d15552dd90664e8e4cf2855b6b5ab02b18ca18152ec5799910e5c3abe0230b8b62a61a6e80cb5e78cb253572b23e782b9682260c9801e2628865ae5dd88b8c3194d68079e4d814f1d02e5dca527658d88dbb42bd87b6c2220718067a78d115472f7cea0cdcc216e836543b198c69afd261f47219eab63af4d9e21c74a30158354cb36cb8f78e0564a39a682cbe705283920402c0013dbbcac03fff6879ac96e22c176d9c2ecff51af1dfd33338922e967c561a6e8625252fc402345a400c94e0a2fc5683341cdeb2eab1f54f8ad7f0e130bc335bd17ab09b077e6ddd6acf026b0f2a58b2bae9d9f887551511b871ecf3d8eb07b55bae2c2fcd43052737a9d0895f18923cc74c4f484c8e8ed0322665357f6f37f8b800432964b4f1d3cb595829096daa7ff334eb2b059f3a88aac6d89b7b246619ab54836871de0f1eb4ccbb70a5adfcdab87d1f4380cbc760017609dfc7fd6266e62b5645a8d0b1963412714dbbdd7103d47ca336efc0f437b27654d1a0d4f071b809f37cbc0913d3caa54e1ceb001fa700f6c4920101be9b3f3b150a53f34e5c10b2cfc16ed57065fd7aa8fa83a0e532088b432753e1af622232c8edb637f5102c81a7a5a31c12e9cb7da06efd3f744f06ddae90e8b1b050c8d1c197434e2314e066d13f07196b80ce74aacd9f40e45edb5182c9c1aaf5cce05bdab407ba558f51fd27ffc05c4b8002826568a57a57c8aa6a6c71c85bcfcf371feca0ec5720d47447f2c43c2bc165b226723c8dcfbf25b5cb7a6fcbc0a91445dc24dcc62067cde258f7bc7cb39822738fcef61bb448aae86aa2c48f28fc61b566eb6c8a2566ac02c0bb86b7d20047c19c489dbfc5d1f732bb9fc310134f74cfc890fe83972514db1f883daf4d6a66764f21d8fa5c3f2dd8df7dd8694bb94702d34baeefbd310a0f7e46097853702d480cad4e4b359e5f3b02f55a994edbe67c16d69c1aba10527f2c1f2b856bebd09e9db603db5c06aad2425a12653727dda8dd89bcd0e409b7a955f802aba752ca392c430c408ee9cec5efcbebda85487b240b6c36486b3dcf4ce0a7f6d33880532ee79d9084eb6fbe1ca5fa5799e1713698ed06ecb5ee6020c9468abea5a33596c6d0c8a94070cbd2aa8fedc900dc7f42b95a2335291b574db891b8af8bc5e8a87e330ea1b8f61d4d33f418a6b054cb81057bfb4b803da42e801f5092fcab4dd048d59bf0820a5a001ad223f6452054d529fdda0031f8568dfd0c3c3560c896d161c94520e548669ce38f180c91dc2cf801619bf033b9c138c7a7063c83934f19389fd99eafc42ace807628a4b1328d03c44e3e5126a445b6a0bc514911305101b5e3aa0223e1a2d7b0ff122fe885d644e1240365866336245fe1357f477228ac94902070245c0495048a07936d8cb4c3314251023f530995abe61d2deb390442f1bbf07b72d80cc68b044408de8d460f97fe2b028ed26a0e90b86395a462272c45bc9ab2ed262c7b3a09d8711e692d904c28585e468b146917f8917b9971815093627b0baea36462cb561dd6b34e960f99198c6dd2458de4de2d149b03af76e564b32bbed15c5e79f8a4effeaed649a5dcc07bbcc55eb0971b31b30698e92ff56f39f4b69d971fd0a9f6ebe1c2a73362c7a7f190587e14e7dd4dab9db3e71171286bae9f910b3747fb0bf6645bd54a9cf037beeaaf6ce3c330d4cadd12a486b864398c2ac4c41a6bc8511bdc7c846b7587dcf892ce3820d761e0c49efac231e17888e58bed96aa3564fb165ef3180b6a07a1b79d9a7942ed053839f0f94d1a8519bbc81710600f0c30211c3b9200420705c6f9cd5b1e6db9c99a80f1ca0252b8fa073be28d9700c53989aabda98268c53665950e873d09a31a8505f5259520be5b0e6f14165b31c14fd4693f264e74c936199653297d8b60578a49f0d52f25370252c70693a5e9831d50e1c60c1fa3273271d104551548bf9b8978b04c677351ad33e21f54f76a96b90518426a40b0cf9d30780a74316ebea3c5e2b1638e54d9bc74354f99d20b001a8224ade5749c1268804d9962429d02ba8e60ac311c8aad1ec7f46f7fbeb2e6a2334b8bc83861e5c5403e63cd8ab8dfeb31e4cd8e574232c4c49bc02024d07f941aee517adda15a2ae92eff456c644e84b77c4780bf4978f28db8386adfd8cd802295ecd417bde2281f7d28f7931dd0a36ab119eecb1ec2d1d6d99e6fbab3c182f6e491c37bbff911645c427d49fa7871e99b59e66e10c80b61891c88e981c3d36913238aa931f93107b7f1dea8608e346f1a46ced3afad44f149e4a942b4caa52267a2e941b28c35500158089f34047f4d5c60c53e5e89048bd1dffb0e2188690ab4a8095cc61ab0c778210f55b7512fee6b86723a0c351d65af44ba60f5415de37b45a2f4a02ec55d3116df18b2747cafe42bdf1b5bf7039b226eeea6bd899073ebe95bbce86bb63653b6c9987f73c1e86661000b7bfd56f3f0e94807ef5051c5370a0e367474c1acb4863613818c85f84e208512e54a9ad06ab048a4dedab49c19d5a395865591ca3016fe784fddf958124a39ce94ed7f3d7ee593d7b9d6b806f0f8a1eece9b49d0eeaeb466dbb0c820db74deaa47e48b192bbd661e10917935a6a52594840fec9ba15c6920028c1e2a8634c3fe5e41c87a97f92aa1696d703ae43555047337a41b033d4d2d89ff83e02f9764e76472f1e5d00a26d6e9c0ffc23779af102db95318e39c4cef53b8428db8e281346791ec7b698b97cdd725c5c9099638cc8906f67ef505124128e6929b2d2c5690e76cee9ec3c5b3aeb782dfc2cd29deb850b1215032404608a55e2fe5a82fc5af58467459ddef14bcbe579cbfdf03b5dce08669ddd5eb3c244638d0627a9d23971153b7f5915caa5e91f23bb4f9871ce31c114672c2b64bf3810fb1db69a6b275653bf55277f74a7ae7196c28b28497597fb06e464887c63b5de4c025d6473727e2547c7a5451bf484bc32242f1a7cc7678e78b79a5a912d7ded4513fcb62627e47b5a1cd727dd89382a892d626882c0d28bd31024b1db67ce73d1536199134ef73dbd263374faccb29966812f78e8a9425b050c9ad7b57da4283506b4b6556249d5554d6edb38f0eccfc8b2616f7857337cd0ed2f56bc04ab2daeee46867cd461c0c11b2407094814f2d37757935e3c0c75e3f6f54d26fd81977eb67b8cd321205f6f09be91efa3aad3f00913a896f8c6b84e1abf203502b4d4548215ede56abed560c5b80904af474ca3416fb8ac68693eafc7a763cd1c7e439288a1d83754a021b8f2548e6e61fddda557e819d0a97caa90894335df650fd7beee482d6888d247259cebbe1e1eac2a6e22c19bcaa004c682daf0e13e9d7003d78a5054441b04da85887e10782df943589c0f3725fb34e0340b2408a42896e96b4c06202d323fe2145670ba4710a31cc409c857f232c8678d74c76a25b53439092ac91571b5776a14f50af85a3f56c47b7539baa411df9e06981290836421a7e1edb0db96da38f23fd23260ecc5fc181171c874a18aeb75ca2f0a9c7a2a2f5f2604b08244fd8e736b3e592f53616fcbdbb8601a074168ffa9a221587259cf974f394249200eb30e77fdc9f38c5e9a9ed8898937771a1df41f87de2f421a914deacc1c9ffe44d74adc8d6d02844ec73ed13e9d24b93a869073a6e2867a50aa78c3cadd2def4503b2965cc19793c1006696160751db22d19678f5535e7c21cd69e5f0d24043cecbd92237983f8043969603de75bd15391c25c65f9193e9f01ac018db70dfab219ca35bdece8616003c4132422dc7f90b10abe49ecccd4808c3192ab02353824075b119004617e21aad776d1950393925c693e6eee43e7a40b2a5b89c6e24acb6b711ed3c7bde007ddccb0b74214ae35a443ce540feb73a9fd7528c040cb8b53e5940d24b19db6ff000e85874b9b1e305058826709dbd57a3a04bc7e75bd9f77da6448b1d32a0b5b24840182bdd866ea46cfbe272389e14092aff39dd7be2ddf7c20b34b689b10b4adf873ba6363eee5098f210f3389d7234b0f253f84734f7dbbd363d30f30e35f4c5211582d7d5bacf85e0479020ddaec85fcb9a67a81f1194bda5cc1eb0066b83e2ec31dff100681f42262ecb4f17f87ee86155ba0ef03402e976c2ad6f554b3bc4a0f1b0b3f538cc76753a5d09ea53e29a77d740f13a075366ddc5144af54744f7eb0930be448e1b9c5d06987d905cc19505b0d8870938dd536ad8ed188b420700d3db66aa6a038c021461d437490cd4eca99b7b23686c1f310e842bc106f5d2ebeb79c9f89053ef62aafae42f56f35321c0aa12ede63715005c759d9f23973793a4c3de017bfcbc7b7b3b581317a7816500287a3ac6d96d4098be5a92fb56becfd5b8217390ac62b9a7c9349cb4eeebee1d3e216e7dcc169d62d382edc5e3c7f915f65433b491a00c204603c12336de0f9672bc021fdd73f730b75940d2cb25cb295648e44bb77939009cdebdc70bf8df05f84e4dc05ce2f6038b9c84568ed5c066d858e2f192c3ff3bf69af6ab8c01321e7362135d40ebf6f32145a2045c4cee805bfa26422f09578ce6493070ace41757df0ce75b22f54cfb941dd03f764c5cbe9fdbb006cdf45aa03a6acb978429ba5ad084fbba61051fe3863ebdc385a82c889a0a50f86bf322d28f17edcc6439ce0f2cbf38585fc7c4af15b04badd7066e6f6bdb377ea4cef59a6c905837cd60ea3818f3e9aca03bb4f0ecad9242b434856e669dd9cf8da930ad1e0a6b231807e7f8d9468ece7969986ed64a8d9559c67e8e8f96b7f05aaf1bcb965b184636ac356ca8998ddaf8efe67f9a4d1d8bdc863b6c8102dca156ea01a6254bb885b602fbcad5d09f9220190268ba6ee9f525e0127d587da0d8141c23aa61fbfa1d2298c87b79f2558acbb252e3300a09b0cdac9f71cfaa25344d111b377726df73277cc770c0b10efe39b501e7e240b1f52bfa747eafd3d14b3efd347fd9286678aa97e8dabd23ad0ad065278fa3b2f8992c1de9e0dac7d7edb3df31d927f4e8ba0c059b2c3970c18508079029d67618fed0c875caa298de24946e997f1630985f5b948ede27021ae392ce1f280bdb68d632b37d4d5de937d87750479db3e0e6dcea30cfbe9a5020e4242ec8fb2edc15617e890640f3219735e09ec42dfd1af81d6d7e70e713805b04e3af862e0aee5f7f70a57e71b102a7bd7bb794449c94841083f1bb6344dd7480103ee0878d0547439853dd80a0f97f200eb1a08d0b44b8736140ddcb90adea91cefe362d7403c72fad9edebda3505c6c80cf02d00c8476f3c4f429c712d0fa6ad0369e2e3304450e4e2df10580c7648d961815238a3afe55beb2baa3c759d5baf6edb6b1bcfdee7af723ca3165a6d98b34d9119d900a708a5f6814d414daeeece584380647c1b9c8e72fa277764f16a19b31a3418a62deaad4388aa3d2cc344be2f984bd309ba01bbd6a950dc65d4051585eeba5c6560b70dcbd13db181fed16f90d235b13a7e5a002b29c64e8852e2441cdbd781035557b9acf57d2f1d1aebebc6286351a66f98f81778eeb3c313d5b12381cd5fed3d56c6345c04c7b09311c94fa63bac514455eb83383148a737ea95cbd24180e90b2bca1048d42fcdee734449d814146bb2c902bbe4d0ec6c9daea49a83e9a63688c23e3abb4fbea1d85f23b8c9a284c9e82dbee269391d743c1ee30bf7844e48795097b3f5b73b831a899ea2feebf8a9d37799f91a58a096ae7800ee85ad34cc9dce02bedd684d7b2c634575d8186fa99a314633ddbfb0f5f9c14280e33163e16ec4fb45ca15196b3648066cd0f8e537932b03c40ae4ea8cde0e2b1fb357fe028f9f65e9e6aad8edd65b0ff36e9beaef5ee761750c57386c8b959c0fb228d8790e7c173e30ffdd94241e73590219cc41b2a56a4eb7c5bc661cfde3571e8e62c45efefd9dd38e350a288991da80bfca2b9942a13243694193be496314e4211ad7eeba95a843b27d3e81339e02b6fdda89fe42761358834955c4b46223eb4910e77c82660f130ced576def767a700d520420f4843cccdc2f8aadd2028d892b3b1e305de14afe65386de607027b8ffad3281e6033b41a091f0d18e1946a30b3424fce820831cba31569e890bb6821702ffc5fcb095da414db1a4de76c146483aa4b6e54efbe84f9b98f683c82091cd3b49df38aff92a598dc237aaf735ae313594433bf59d4ccb05db031397ba9e281eba9247533ffdb4c130f294c3fb44c3859f81164cfec3dee702e4e5a8748269ff4f3a60f5f9de0cbec1677ad53484677fa86f508661931f76b0c6fa69e766adca045fb6ab57f7668ffafcac10f548713b30df2fe48428c664c9b5e6fd0da9933d2f040b079499339022265427622c9bc526c3e404539f9d301b5f1e1615c6f90968f0f013d50ef02636ed01e432f54dc241c4c92d85ca040f572969e0d330e1962ac36ad4e0a69ce7f75ed17feb09fc54732eca6c759bdcc11ca9efb6b880ff545c138cb227eddd83436da4d785c081067e4d1c7e1a83d38b496d1b4de1140176f2e63a75de2dbdb4717eb1f63b15b42d79fb8f117056f4b593defeb40852f49545b8cd22c2c5bf37cd26b953f753df43c25a44309c73b649a288c98249666e74753f77f342267947c0bbc34b9b8fac7809ead8ba3e7cd8bf0f77d50cc98a2d15bbd2d17c32ed6aad47ca5ba0c342c9435487744161754269fb3f37140c860086d432f12010165d953bbb913f81f2a77bc1645f4770b79daf66a5ca6dea3b50c11a6e70b1f80e0a42e88c758d16db4d28282a653151d6bde5ed0506073de6e3e90b3f320a4b4b0325ed97f0194786d7fac1b4e5f085e0953ab7a1b8434b44774475e724b87f75fc628f80927d2ecb8814934826950054a914a9b31c088ecae2a268959c4f57ef66dddd5bc047c1fff5ecaf5fe18e0a6acd55dbd840d09aca686bb47ef52e10d20d8e249a869ea14997aa7476906e56aba7aae8e05ae32eb59aafd339e72b39984827fd0e9be2a60b150d91f025be967458478946fe64df138bb8584b81304b234ccda631a2d80aa7032f5e97690d412016bef6c2313287b00e9434d2cd0f55da50e02c5a5b08a0f37c366ca5ba168aada767a6818b30c216f3fe31692161b1c2a180a71d4847e96b638515036550dc6b41a5964a6e79798eba72ce71c0e85a340c3c5fa43b1008f23081324ede03012ee082f0a5baa8ff0a73dbb7f0481f075f800073405db05dcf0cbaaeff60ffdbc72fcb6b7ee59eaf19bab67d0ccfc13c3bab79a7629d05eda64ec2c4fee7e0ddb357dab5046861901f65181c1bca327f5744b2a0311b344f9f4f5548959211cf763b283547b8ee0d191b4cab2391a4d2485f6c9c91ee76326d8db997223502f0ab41f0ccf4179253c26708786fc82b4ff13424a212a558275109a3d526fb763a64008c9b40d4e7fe45e193323ceb4a15841f517f0f6e18cc1cb4a228f55a08de630eba0a8b19239fd754e70610fc0f7f9dd0a1cb8080b92ddb866427ba4ba81a00c94a7a355998f2564a0a19844ba61e7cc7414eb48756e65d9cd6f852513a19079a5fc907c14895db153d7ab19a1940807f8c820aca255234d61f486e015b8edb5b6099d6c39d2b5baad519ea245d2d4ebf11afafa53cdc740b348b5d653b6350b6134ebd5b6d2910f29c2fac042768e186262a90e419429b567f83f71eec5e042188cedd2fa3b8a21b2b10a0357f5bbecd71c8bcf4f92629e677bfc7a4de0a420ad2a7b8dfa848e95c45095ab8580ca3d17128d4b0de3933cfc7b325f29cc44949bab70531d87040143493933ac759a66603239281e1086ee452738ef34cdd26422403606173bd71ff7c306fa90ce86df21d7f2388de825becf1ab69ff566337c02919f6071c2d6a9e0633ce2d7b78d4b47fbbb3dcc0942cfb77cadf2d8008622814bcafdcfd801ff060de6c5243fcbb41e8b4da38bd9e2d71ef244e75b621647e44ef86e2808197c83b4db2abfbec0551db9adbd3255b415e26396f4b80db4495c0baba07475d450b33c34d668ac5d7a354694cb22f62814a2ffafc975b6d23a35cd38ef54e29d4d6aff863982d8de95e4751a531e99bfa877791c5bd8ea34877c21fb567b8ae20dec21d8c8bea4ef7a1916eef10cc91e4ecfb6c80f965d79b24ed6c59529a14a0f08345a86debb16f78882aef2d68f6fac63b2672e915d3a92c8e2f69bc35b4a976a89ace5303497dbaf875edb803e32d828c7530d60eecaef68fd90d8907351251ed0b153fe73fb1c73d303a770a5b88173db8380ecec05c9a7f83de975982e8f22cf043b13e821611414bfc093426505a08941b50d3ce835e5af6351c04bf271687bb781674661482e29920e8f5f771311588024e5935f4c368df81da534edfbbdb5cb48f164ae250e91b1d884a2209fe34122442eb959438e347c09aaaa6435a027e203675e64088274355491dfd8d11584867907af171e0f989f139743fe1cacc87b2b3558ab5f0c38fc2458dba0ae921ac3aa8c4f03a6d5fdd5801c3390b40f006fa3efe53879c5e14de3bd7d76fdea412d4edfc3f43974a30d5923cc50e1d865158948e78a26467a52019da37273c40aa274a6851daeb8a8a529bf32b1a01262510a2444666deb4eb63be87d52dd128b50b9ae504dff1127e0255d6adacd0a1fbb025572f04d5a7fe72e301329d30cfb39f0f81abc862e743ee88c69d1ba77970d298a7c658ce6c93a47de41fa051e969441cbab07a5934bf46c643cbef34ec7f9a5fd6f87c28c7ef0134da7ebad85e98854942adffc22f24a11a8f7c7bedfb04403d39b6efd94a103a460073783a35cbbcf780ded71923e84ebd43018f29d70d646940b387fcd348b6c540529cf886ebf296845d513a6309e6636b67b85985fa668da0bbc9fc9f8999e5274d639e3c6f750d7fbe0c1f2d768c47841e45d57881f8cf319ba07a48ae6bc918697b8169e79a5d1018b3558497242eb61753ab65833135daac7bca2584a9344ff67fc926939b934ba94375e0391e22324753b198e8f81d67dc6fdccb65962a3106670b2a633b2b8e7d36b509bceba69586db4921335e9b7222269ca8697cd1cb7717c30aa52b7a9706b1c8840808226a7528380e206d89b230e7f0ca6df2a9971552bdb21110d923dd721acb15b1a2f372dc201578d5955071051ed19d6212142d190cdb2f6fb2861e02755bc72873d64f1a1bc37663a3b069c3287ff1507823e2bd92419c9980eaf0412d292db215c7f1df8c52342ec0d17883702d0fc8e90df28b32c0acbb1233c0712ac13541cd91b2e8a8631cedf8f0f808a4864b2c0a9305a4f86f1d911a350bd1bd94703202dbd369aa3c6f15998cd4e4f0274ccf1f191c963f31951bffe22b0b5e274410a3e1cd0515beceeed68ed30d35d3b71aee3138056b74bd6e5e96ed0d923258f346f2e5db2d056cac21dc03d5a4c13512b7d96f8e76822105dfecc15254b7b0a4ecd17f0fc5244f4dbdc9545ad477287e3e57c03afd37b1f23096f5d3ee7261309ff8f58488ee2deba30e338a69aa878d21f3088fb1ae527d91a00d133cc0749ee1188f0ded5a14e765f8f9b0dea51f45afa6f4213e68916cb56e5f61af82307194dd5273545e6bea28f68ab48ec8fc269a211d81fb90a15d807bd89648454956d5241f5792f2eef7143d8cc5ab2278af53ab46df75e667d1a75921d3b515d4d0ba09a0a632ed8a1c5f223cb06a7ac01291cec5c44ad9648ac51dcc888a2c839139cae8f6809df9cfbd804a9e1bfaabb9015c7c4133535f290b4b91daa25925e72e8c3299d908caeaef0a4b6fa9c429bd19eb837fc61b3bf6c9fb8de9f81152756b18dca9e7ee7d8203753e3c5b9edeb179901755c347b981a9e101a3db6320ca66ca6a02d70309750b81dbc2143bd013d54d13e067966dc727f4ca044d503053bd9842975a1d325120e9d249acfbec05fff081d97a9203a44e23bab46ba40ecd05b01135057c47d13a8ec8e84bd201b55d3f725e5325923d23404a5d930b9922c04c1cd31dfacb451deafeb0a799c4f81e2a47af4945164f875e19712b8b39c76265617b3eefcbdc5154fa58f7c411456da834e59ee6a9b1c8463084b30e8ce58d0a6268ca59e1680e7aeca8d9487017a242cfdf43a6ee00bc2943a0b963fce0c7f21f3d28b20c5a9478988d821f48cf8bdc2bc4a24b90910435b5f5b09a2156e9c9ceabf8ea10bff55b4e5423d7e99957195ab83415df0ff92ddab82a8ccf2d07697460f795b71186d701c4e2bb694cd66eb0d0fd966030386c9b773aa4b7a959ecc2dbb1f627c323e86b160c3380a722d836d9956862dae5429805f076b7a23421d6771ea86f9e00af257dfe9276e71c2d66f304d5edb6cbfad97c1717116263a3060b332fc3cf26b8393ec35858ff4c1bc4c0681e43a3eea3eb8b36b5b21d1ae2adab21477a8b4b11c8073f888f2ff677d816874f9b422028db4a52639f34370c32e924df19802440e200e9448bd51f87001c50352eac8a10b1e7048cb813a1ec9086e0664cb0da006c670afeddc2264091b6094086b9b9fd32e6d32aa0646a42273203a1b75dab1581ea2fa86e6f7b4bac9761d3e46636c039c9c263f46eb1ac97146711624d59725ffc9163c70bdac2692a4c92197e65b2afc0657df24fd80f374067a1f84e62f12a2f0d4fd49d6b8ba2b00e9b562a90a0b3c4afcb87d639de27707d472770e2cdbec236bcc6890867be9791e2c6247b960ab9068173affe2742036fcdf13aa8102f3fea41d667a203283011fdd95e9a8f2d520b17c9ee7e76a6021eb9e051485a9bc44d0e552f27e4d88b4784f21abfbab71ed7596ca03e253e9b78cd5295a4fbb64bb2c64d4c2b17f40145753fb8e39393be623e6765cc002e669a9872637a636e94f0612c9e9c5e901f2a7a1715d7ec3e8b2bfa2ab9466d1b8cdcd475242ab8414a5a284357cfd4392e96df4f31a55f2b8c25c3c62aeaba702d07ff4dcb79b3078476f9bdb02f5ef9a3270e64e868af9cd547482dc4db8eb97e8e8cc1688ec13dea2a69bf59212fe80ee1a1c45e28f131c77ba4d531d4fa567a72d3e6c7b334dadec6d71bd546f88daad82ea40a10204321e7af1f96c08aac3bb0aa088f023331ae44be083baacd33c8d72b27e3e9921f521f72cda724716fdb377aa6808a8fc54a68e4e5b8a3701ff435bc39f24bd6adcbbe015e5b7fe28c8ce1871522f5ca01a8760021267c21cbf13855b267f7d4606aa0ff484f00fc5418be835950a911c1a1ab7a5e38936685972f927fe7010723bce0c617d7d41ebacab813678a4911dcfb788209860d8d719bda2b4f14b0f9fac69104489c46c1ba0ae832bc9ecfb3c19ad85ad214799977abfdc8f4828e6bbf369a1c95b4f0413cbacda2ac98346160cd1db5ec90bfb5e9aacf68c913495df3e4a09841c5cf9bed50263e943219ff0c520c07d58127bb979a57442ba85dbdb503213fd21ab273f97813e61c51e1e88cdb2c9bf53b1e7121d42d589fbfa784718104a83e48eea966c08eb29367c3c4646c081e452193c7c9b19c0c26a250830f69a8ffa70b629094c1be816e343594cd1bdce92efd09307a098756606e4c5b1a5d2a1e2061cd7f49e579da7f955c01ce7bb84b06c072564e1c1ac36e71d0c642c22e89f716b27122aa907845bf40d7e364cb31d0836606dc75ae9b8ec230663bea367ef169505b8fc921dd753ed31dd6a63c7fda82a95da2d23bd654d81a9f2d45c459efc6f0da29028f72e06670a38b520f69fad2b2dfd9c80453ddc07e2b844b060028c05d798357318ae51f9788f1842739976f4ccc8b8135a42871ebc203d7b4d4a463bf41c41170c244228bc3d0025da104e3ac5bb0d93651725aedb52f61f22fbcbbbe744fa88b27194d6051a2abc93540d433550ca81bdf0b6d614758b05540f3ce1bce184535d7b5aca474b0fd5b42b008a1c1cc9ad451c8ea8c1e23aaba184650c24101960ca24cbdbe0bbc685d1ebec7813aac6290d080d9f7f22413c0615969778c33d526be594525b654cbc7ea50a89e9c531a3929a9d1b809a281d5628476ced7d700bfc59d2186ed93c559b7d999dd6e65829b82601d1a9821d5895c14ad1aa00fc0fae8473fefb5fe8b8379aea39faa80790136c8f0a67b6d7183ddeba6bbd487f90cfc71b2a0315d7c484f63a67ceb16dadec5790f786c9f0b8ab60ca8e54bf5bfc2f1810c8169285cf2f3af246de17d519d97df9a9b13c209047bae3044c84bf62ef2d2fb55bff8f3285b278d18659a023f4210c6fb25433d4360182204a42b8f814e72aa96ce8ecd8ca7ffa58eb3661d3483965b63e27385654db3b504729d1be2ed6c22d7b5572503479fb0533602f14cc989934b03eca2ec9e52148418d309ee5e6acc71aa34ebc084a119ecef13976f3de013e5379829f1c611878051f2f2dc671a759bd7b8cb17e317366014f9432b626193b0f6cce1589ca60ab24c1567417ffdc120f8b2e28c3b568293dd04f33a258a0344c004cc5a2130096aff09ce874ac81eccacb2103acc2bcabcaa7d8b34cd4ee2b6a32643616837279814cf49103e0ea6f47bf85cb2dbdc606cf8377abd23921b9ffb9a222645b5242cd2cc8cd86e6d452b08d86ff140f6105ccf9693b9c9ae76da5d76479b6285daa75ce03b5c6d71e3777ba99d06c3f52b800f1433ad653d08be88b2108f610f572cc6945c5d96496d97df2f3cc7df6fc7b376ad2edc0f7afec0732eb99be868fbc770c2987b9d70c68775687dcba0e285055ee16bdffc76e5439f9d6b1adfa9fefd8bbb6a5541cd8c35f5fdcf565be4c0cebb0f4c9f968297b5ee82e3bf10c691ee99d1b42f71cf8faebe755d967e2dbad31ee8ca7ce08f37eef1f8f985c7c6e64d956342bfa730305d53ab0be61a5859c5ec94f7fe7674d2a3866d9cc30cc1ba71cac8bd0197994a0b77ce08e395cd07beee83e99aa75bd9284be421a78d42c134fe8bb2789c57d40698424c029681f7f81f2ea1258550284865ea60531d0e829028d671b9ddce5584c6d024d0d15993c76c587fc4b20b5295477e2917a5a907e79b04a67f5108b12cc4b7349dfd5901d7f544348bd5eeaa6ff7e296b4c972ae42e227876bfe441e5158acb4094ad85644f4ab90007313083436ddc3dc340de8548cde3a298446d594a963c66bf7bf213d1f7a10db30a8677266eebdaf8f5f51220ac5f3a05c8e69638a98d69a88a1a610433c9b7404437b629dad5ca3530b8cca6e80a43aeb92130473335d1ec49d6ea569a126a9688c044d19ccc43ba5ec8d254e102361ffe7b3c2128e0a81c8204a891cb8d9ea4abebc96dba6ddc5daefd1957b9396a9d74d015bcff373dd48064d823f950b038be60528733d9d8eec1681f1e30be7d9c807b7e42ed64fb8b9f3bf9b65d9872383a71118eabdd1141633e40574398ce1f4786baa948e8bb1fc8bef2bb3dc0d7298080f0d30a2849ec7b07c7e67dd52bb51c9c83c5e41c7213983c980228ef0b8164baeb22dcf8220fb83b8a0dc1105912ce9f5f8a6d3e5a12d45114ee5e2692d8ae9d9a1587b391142ba84a34553c8c2fe831982a3d8c79090f7781a843e2b5e1f24b5f98c2ec17f3305b98f07f725058e53213340f02b3a248cf49e717e43ee3188b71308691cce4ab7dcd48b5220d53386fc5cf5810accff6c6b9c7964d2b234f5940a207220c79ae6043b8cb66f7f35488b8343279cd23d6e6de51bd5d89e30cfef37dba0a3fb0318d2797e90315508e6711f81426c2938cc91d2441094cb6613a131364ae7864abbed4fe95413ad1cd329742a3747c28062a63d96b7b3be03c580c6ed029159d6b1cc38a046071fa88168ffb88a77d6cbe09e81339db878eb05f494543d25c46441e731e7588a3e3835e2470af89f10e615120a592c1e5e34e98579269adfbc4da6c4590292fd6b90a4779cb25c94612c8600a620df1298c0becaca5d946e1485c4a33a54b71c6a7bab1165a020b554a31a8d1920c743a882f4006865788c2f786f8bd2ad012343bf8a0adaf12f02a156ec056186b0e25987f48210567490640c0c0a149432aa5016a41dc6b03e490af12c8c0ffde7d92056c1468866229a4457660d7670ba36c17a7bfc720934ddac71ee88b10d48963cf5d8a15651d7c12f2a626065812733aa1bf4cb509d2c548e30d15348b4ec7cb6e111e0bacb05ffaacb298e687fae92cd42c902d10d13b4308cea7f57f2a0b4b559bf8c54c40cf6ff1c3724f4af35904759e27392724b6c4571e2a7ca226e25d72dfad0b5f48f0abde973584a8111bfe670e3c2dd7c475ee534456672f60ae31bc27d9c7573b54d0a8e24a9063215586dd3efe81faaca6edaab693ef01817c5b8ca4e5310d507d1855fce901b1974c01f6f838b5377d952bc2b66b74062c3373028e6bf616ab18f097caa974702d9d6c42d31f7eef341edec7948b06a256b8f3ce669dfc350ec076893504205ef560ec899d779b8fc39f53abf3cbd99197d73fab4a727071815c0884c0bb923523dc0c00bc062685a15ac1666bb896112507c62e53bfe86a84789150e017639671a98784e1f9d593b3127eda41ad08660edb088ef1d5616601d4172c0647a914411a793f92b912ca6ccd10df4cc4de4a7a5797163e37180821e2ceb28d07a2fa2db8a96504c66fa99d7f67adfd30e562e6e34f1f54b713dc1d7326e06ed3af038b8a9e4233eb3260986d04702caa0dd6c1f1ebfcd1dc944667675d66b8968e4a70ae80f9abc6c08c80b93f81df7b337e47f00a6b1ca410283eee2a3c85a64cb9235404268e1d935bf470e27e186cde51d8f29421bac1b4a07ca12787195d9306bdfb6a87ca7fde19a07b8bcd36621d24176833162d7c1cb356aa8726b608366bf389556da520e392198a3ade7b7ed20f7f9de805220fed629418d0e28afd508d3a3fe719db3f9fa4def92f2b266348c2ee3bc0a9ad27032b879b754dbd8a10798748e83a7161cd33d5ce15729318e8573857c1928d05543122440466eba71931ea404a457ac546571211f33eb9e46d8ff1978f2f40c10512707ffbe0080172fb2e3c4e615c794ce66ba584a173558d440fa523d416ef35be4018ab1007a0f37e38f44e94a1bec0f2e478424c0feff7a67a147422cac4102bac9aa7d744582d4be01cf1f1f642f1b13652f1b4acafdca922ff319db32c3a98fe1b0ae7d64fce4b30981de97b096d965b8d86530e5a4145cca9236b4827c4b820411728c1b63f2514fada617421844533a42eaf45784b740741dc301ce3117732c1a945b4ac849d662b8516fe0f8e83e69a6d3b5e76338987c07879e555bc16e9fa58bba262da0a676d3f773a71673a090d1fc1604e681a49f41b34b019240d2ca256b0a69aa08fd8c9c6f607e3a8058f8898be5bedc9f1e55e9e3e0704d04646f0426c8f8e719c40ac919cdd8222c848a1512e199f7fb7198ac55b0429a82f74786c9687d7d7a19eec53e97051b3fa8e3736ed700420214c5e6e1e4d00e617ef3acb8905ff8f4702d367870393bfa7651ce01fbf3ffae767bfa052166fdd016bd8fdb751b22ff0d9cb944159f0016cb4949e9aed08b071313f5de29d98195b4a46f6ecd47355787d7605a8d116e356c78b48e44c9435d2c65919a1e9769186fc0ea83d0a49b64ef33752312658a390a103761b62f532561973b23faf3e9f2f62c11814cf4c5b467ed84e94d848e41c09004dc73e08dc02acf306f531a1afcf93dd4de9d61264306a8077993e8540e831e6f70536bff4fae4b56346ba824362c8ace873acc3a338f27ff57034fbf433349b8200bda9647e2bba6faddbacd03bdb7b7938d0923748f51ecb41379c1f1203c3b578e043a8404ff875e5b6923a2a5f2a982ff6c4855e15fa4b9f50558a7260d54da6da2d879d6abcc94eda4721b60a4bd3d84895ef014193010108f17e426582ad2cfc64a1f772c238163ccda9a5660f73a82257772914782e128b705f241d53ec58dec59515f8b095462df13753319566683d0dd46deba726f791e5bed22bb3d4b1060bf8405dc060d2d8681b5132c442b475042d9a9d82536e7430857ee08e440351ac079039446d36ae5836db7967fc44ecaecd6235c99a851457c660fe2d78ff3ff39ebe9801f6b6f022d9191575d23dd4f42e5c01cd3cca6603fa23b29d0e4dcfb8bd80da831850a61f75582b1cb3b5849ea5e95d368d0b70670cdafa6849621027ae508161d41704348cb02bf6be46177cf9181779badf21cb224b60867ed3a35dfb7e31cf1d5ad6d899084c5962a50fbb1e597195c2fc21d8ac307fa7589f98f0d6be28f4ced856249e2d07d197aa1bf88ea53f0db0c07fbb5dc3a991ee06e866b59a98c561e9a944256e32e177ca8fc7956a687233a5e0a5a15f06c22d84df97a9c64ec450806de69dedbb5d4f1e1b611817b9754f97de5b862bc1625e1e50dc31a9d328194d3319121d00dc7e025c97217b83f5f35374bcd04cad5b830b46c551f922782381beb5698cb834c33601c1c038a5cc67a5820d03a4e07243fb8286a1df33a3cfe8f4e489e8e5d6da82372ced1ece81d1842c17fac80449e4cc150b3e6bbf1d7f307a0145048256ab59b263a1f40d2541a1be963961e8119ad6dc5b939725ca310125ad2e49652a6945240075808950745f5a3ce441aeec1023ea851c50e4c941982cc00c0b86285953054d635ba01064cd4a8cca0031a49ba8869378ade18c3e8062775ab6b74c34f0e8da69d74cc6660654a1569246943461823fc4007bad5352a1aa27ba2a9ba46454cb81f23abba464537a06905408c94120ea960c7f486d22f3754e1b65031a3d4a8c6c666540353695da35a1bf5a310064edd46fdbceea7ce23a48b0bbc6849e3448a9aac87164a475814c10619352f49ac01c5fd77e6dd4dbffa85b41355b5d793b2c14b9a9a9accd0c18d2e96eacaa06e5117472685abdaa44b356940e911fd684e7badf6f8dba05feb190d0ec65a70c12b3f0b5bf55f192ca9dfacb0d9a8b04829880a5fd53c2d8310c28ef9c36721b894e4a454b9785f3eff776125610af1eee0ec9647d3c0adf3185d81545d706a848598ca9d4d0fcefe569c0770dd8eb53d987f79023f5028fd5cd78667b05b3173336dcf01a00485f5a36d450320cdd7bd05ede66eeece97b8d5e1fdc1da1efdbbe28e55fb797f6ced21103a0717fec2ddddddf6ae78b03df665a85b77150000e4e0f0d8d1ea80830d6e74e4b0a1ac9a958a4ba1e62623f4de1efb54a1f80be9dd6eb7c7ac9ea05f9f033114beb38e0fb9bb43e8eed0a13b7408dddd1d769d06377fa0fd5cb74308a3d7edbe18ea6e8f6577afd927b85d9e5d16308bd09ccd05cc70696f5b4a295bfe5c9ed4cbeeebad24b0aa7cce8542cd08c8c0b93ed83795a950dcee6ba550cfdd175f4ad752d67a7cd97124813bd85e6bbb166055a155f9c99c41bfafbfd331307452aa9a2a1ae4eeee44a1bbbfca238411b6936108217fc385104208650464804c3a5075930321eb1801557fe6aebbabfb7352baf2815c376fc31a083b1596a9f29157f73b46f831baf63de0e565d8c18fddac70ab2180eb2fa882d747b195524a9b22fe4bd0728c327a4b19a58c3146c9857c14e0c2b959892acf0a22fef2385d6e70ce08510dbf9010ce861326a5742a230a9b16ea52ca0dc3356deb9d67f5103606911685c90e76ab4d22e23bb7a4896ab886af7c9068cb5f1e638c31f2ca073eed85b0bba9c9c1573e12607e2a73020d4d8912b9c4a9825ca66f1bb4a1ac9affbcd5aa762adc0d88090c82ffdcb890d16382b4a1ac9eeee91ef91c98ea9f2a61032e14daf322a824947faa94aa2f975595a43270b9308ba793186534d35576ad1d1315578874c230a337016152ea7c49a1b66d8b01aaa09343548331e00874946a0b53a8b2d5aa526e94528a2117ce8550cc68f31f4cc77f3d39fedbdaf6b46224ace7ffc1d8102f543a5c395cad1e1236e681f51c85d5aa96db9424e23c29a0d031183cb03115ac8dabee2b3ecbe5ed2b3e7569a9f16b5c2a98ef9f82f3f4ec2b2e53f52c9c883250c1aa590494405f4e158d9389ebcd8a1967909538f83152851fd76ae0f390f3b4e6c367a62e2a2a547dd57a523f0fea0e1eb95c100421ac1f3b7110d394345b986a9c452236b94158e454bf4a6d70ce13f849b6ea10b0afc800115c1ea58c52c628b78e53a21bc9cdd7d1707e7f9622698b2e7d3a6a7a4f8d7189c6889a52e572ed4bbeaa7c180c01256c72939f925b4f8e275a78e8d93ace3a4a262415e912c2eea30b46179abd83cdcc9199996337a38c472b9b70a959b352a120ac06b682a93a2ea553274b58276ca3b6308556cbb53b672b4b37f5021086e7452961ab424713f4e54008652092a18a0c532aec985fbad6fbedb147db464f3d032a4440852fea5a1efa3d104258c45ffe3db1a7d6742b1597da501d0c455a4e95560942a992b2db5c5be3caa71fc23d0a9a49a66a5513cdd0188fa46a9ee33897944519d72ace05659cab3897cb38a8e25c2de3a48a73b16ce552c9f9427a3e7c1efc1f55801b1487045608e2d32f763823d03a3fb5d5b0c04ff1e9f6f0df1ae34902acf1a52fc043503f8effb20b017738b0c6872e38e76f1d69d2e32eafb8582ea68a9a119965943e65744914a78a4a3806d21b8efcb1638c1c9b99c639593e7f8c11c208a1e46e32b8e9518c8a889571a636948c545649c5c8db446da95f58650ca8b93d593893640cb695914bcdd80e162a2ec26029d700d68b4fc4799cce029c9001f83205cc82aedb31e924caad898cd0779065c418e39c93d649dd0c0a92e4d019396466755061c20d24f9d479e6cb18639cfb928f72ad84616e326e314ab9c98643860153e177d236f99018150d73d349f5f35af7bea4fa4f85bf2c6c353aed011b2455d87dad820f715063277f7448413faf0d3931858721d90495867ed498801a0bb0527d1d6cc21abfe70512010641cb0afe6220bc8441f06fd1ee6bb16a5a2d556a72a9a98fbf82f3cce525df6ae2253c27fff00ffff08f910c53c0d47391eb5c1ca8d0d5818fa86ea7179f8d573e92dbb685dd119742492e8ef055fe06b7ed85e8677646156c8c160c85b9af18e5739473ce86354c8afad80a03e30d8c01b60aa0c5125ab48c40399baa152ce93361facca43e6f842afc7eb24b67caa02afadd386d294691e2b416aa9fd3a68a9ee9a52835c03372e669247da0c6872ae4b836c8d3ca21d39a93521d4c28ff078bb0a9a2393a5a7878925325fb93941c6394720bf35ba8635de377948e6d962c4f6afc1e6aa51ed33c1c0cf5948e6d155f24d5d8b41affeba31a3f280c1b9555c5174bf5eb303536518d8f9a5bd33af6755337756c8bc444a9f1fb4cfc5ed2314fa2c65d8d207128a2ca8e81f8a73d26edc5f7800cdacffef34df87bee46342ca9ee6e449b557777772037a211b93b12d559365d1d94ed3fc77f3c06fcdc0d1a947b7e661afa31d26402ba46578ed4d4a77efe2ca5e25cab09510bdb013827d4e040513dcb626019f735bfb22c48bcd456cd392b6d89a13adddd73ccd4de0fb4e1581ece62db697fa0d918ab2a98e569a730959f0328e8c74b959f973a36a663dbb32f5156fa544afee2a5c8b592f37018fbe29f41e5af41e59f8ca6722bf152e5af9b78a9997636cf4b49f9754e6eaae6ec6c5ceb7a978f7c5e3d003e2abe74a51eca6da63e76ea63aac3f48b63d74a4cad347dc06a2b394fcdcfeee3f6994486f84bc814533381487bfcdb9ceddcc4476a55d092b27811aa9caba0a87eebd93d67cfee0925945042d8b05df0a7eb46ae2ae0b255c72c28e8d74a4b20a1c1a8a2be953a967afe0e33e7c775cea8ea54e8173fbb6c96b15465dd2c3b38d1b4015e2ad204f55505a08c97c8302d4551bf75fa40a3d01e2ff94faa6fa28029034c5d37ea82212383234346928c8efcd45da36e1119462ac7ea0c48c1993827c4d8e1f8ca265c99105f7631e04099b1a3ab0aacace52f9682f34a5547860345fecae28e12ba020cd3e56d2e98e743fd680dd2ddf5f40819e2af5a0e5d6a9bb0db114942c155440c55527264a6427bfcdda5b04c95ebfe04837ac331e26fadcb185a8cfc4ce3253f1d5b1d354f073566d2b12dfa0289857ebea81f0fa98abe60a37e5c8581b278523f7e52fd23b7eb0266fc3490f81b6325ebf96b1db03f74981d03f6e5cf8294cc3b28837e8bc44c48b0493e033907b93f0b0d6d11185f547faed2315a5d0699cbbec94c639a3fffe448e2639a57a6319024cc83faf91ff3c03f548f349b0501d5e99838d53f40e25930688e1f98c6b315bcbf0518e7129a3f710aa23a7750c540d6793542571638e967cc9831622011bf1459a18b266eadc16bd43ca4d096c8d769df11258ae7708712187914112516c9e3485353935c615ba16985a626af69eba674b5ac05254ac7be451a1ab23fe0c378a27240a55a4b5c8adb81c44fc79acca8202472aa2eaad50e272ba51a1e46eeaa1fbf01f29c20d711aa61b5b460a50082225b4609891661827edba4548b7d53081d5264ad50b2e1118424aafe92c846b59f27898638cfd64d7f4929e444cad13a43bf6d92b48e7dab2497b48e8cd2f2497555111460fefa64a879bf9ae0601401af801cbc2307eed615ed3c907088068c4944b9c569e3810353c7be1faa313f18087cff20dc0c023fb7cd1d62e8b7b5f8462305b135263d4baac38ed4a9824d04d05740f5ff52d551bf3d881eb68e876210f88336f061ca942970001199c23cd922085903f5b9a369fd8d8e41271de6c1a4c9a95beec1bc2905fdb6c60f2154810acb3b8ffcf8d0d5c340bab359107454ffef47f56d39a1e44c3c86e47b426ab2dbe86a598b284cf3cc7e29750cbe4733d5e398eadb3473708251a11f55b5b85b9b53bbdb4a93cc59de95eed1a3477787707f85af3ceb664df00f2fe119d3daeb3e9a412bd3bffc1000880a2d888a910faa70ca220d012851aeae11511969c0a881161f184151758d88b83c658101ddea1a1151b175521a113d5165fcd2792560e1f4c11a444cec4074844e91174ee4115286e841cc10357cd084d6b4e125611ac01ad4a6ae91105c64110249889a17b33151c628c374892306341c4db942f404090e397c71e3092b677071449416cc6021c5142d671ca531a24809336d08c5606806338a3882a6861116458051c5154149c4004306334043c9882a44d030394c71c49121acc03104cd89a409418494524a2d5e5ca18496c4bb682165498c310e2017a20bd50d64803aa86b5484c4d4a10c67444a297148396941194b288931c69844860d150d4a92ca78c18664b7a851e1dcbf0533aaf15039a86b44c51bb30aace5a5891f201b49b64c2186cfe0c9c81535d4fa8b95307ab831e2b2c4aaae111721aa4d5d232e4b906400032320d2780222065c04712587165b64149a1971e5c886315ca838103d6c5dc00401e5c3d4cfabbe43258dfa6dada67e7b6444454b75245ad7880a95baa3ae1195203351c628a708b3c50b13935313263f48a0cb1723c82c3511070cdc878a450a307250e2055d8e8014e004192649ac34e1041927324a1999f0a14b1a1f763073c69bccb82990cc265ad0021a9a8809620def41c90a08e888686b19a58c4acc7043fd7e0056cce0e86a3073d2028ad02ec15a6218b942831b5dccc438220d104f8e90524a29ab40954112a5155e7cd9b474e1c60d36504871c61357c8b8228d334982582801d3e42787ada7873daa9ef43344fd56a9fa86f16fc176a91ae970a6ceba463a98a9dfc3b6a7273f7c2932230b124662b4c047481a02083096829af080040d888e78a2e58d1f663bc0ad6594321220093aeb1a51716600409cf1411015640890058d758da80843366b7a9da2304735d6359acdeaf7b02a4194a01de18230604ca9f2a3c35a41002aae240943082b44b420070d6cb142c397245484e9c171e0200e346e38a20da119b3048ba635c020628833905c5162048b314bba24a991c64b928e882c5c5cf1e5e8070b122ab0284152a6ca143408410bb2258aa525904c510335fc06267cb2d002c40d6284f9e1c18625ac30924495274e6af07054831f89c2680c9633a21891460b23324cb10512a7a01a86e0f0c1698882c588500e4b4155a6f80c54d2a4892f4032c68c0c2268305380921b8688b862a60d303e9b411b36a831449113274fdc83083ea801058a1627946ce938e0a85f8b852c46783143064d3c405912e587298a623026a94abfb1658635d6480b531b3000d435d2b2a5a6ea1a6909403e90470a8e7f7ca6b4f5535feec0144eef9942a4b949948b9c6853ca0e5e5839fc63b6c1a5c23666a8f071563e90461eca1cd18419386cb1841435a49492074a890d2736822afc1d2b1f489178992df8e5ecd44f2776a64c95df5a63a8caff35ce9c89a2caef60e523bda4d96c5643123a4801c2090d386c188ac2440942082107aa2d760b38a1a8f2691a30a8f25b6a20a9f25f0d3135f0a2cadfc0938106228ad8028a2c3f715cc1040e4c744008e14d96fd7266d3952a9fb66a8084067154f93abe84a42cce2063e589234796e0210a29a58c9f63e5136b3480011a6d54f836052043bf0945950fe5d3958ffc99cd6648600e47a858d0013902006254bf2055ee9107669498d17206922c9e9cd1c419334083893266aafc9a958fecf929c32a03a642f8ab950f8441521ef999a1a6caef09414a292584aa950f841deba08c953877ad600289890b2bb86cc9a204922e5a2c2edefe20a3c2f905e1a0099f42f83d21400821ece8a45cfd6eaad4a972c74795bf5f90faedd115f94bc401aafc49afa8f25bf2bf0ca52adff3a1ca87317151e5f7045165d10cc2a8f287746c8bcc30a2ca9f2b1f99a4e408b79591a4c29721d4a004c50f567818c20d1752e203a7aa0ea8f027193242153ea4dfe33c23e862072e4f4d46ca9c71286c70adf672709cd0afd57a32385408bf2055225158c7e4fbe858aacaefe9587c299fc8fee0aa54e54f0ac654d1f65806c970927dd0c3efa4f4a69533e516b74d0926be13ce2e42fedab8569ac8b6eda6959404e917deb62c847cff9bdb5634a64cdd24049266ad1a07bd8103cd86460068688eba457094d104cda95b04c7962ce020aa700c79f15261dda237c4e8702d24b4bfb777979bb723ab5a4868178d71a6eea85b34e607aa5a4828d7ef59babce630823260797ac85ff0217c988f9efdb17d4d4b854d54e17f3beae781e99812aa6d7a4773f754b5ab6b67b13de0f790f3b4177ec1875f27d5ae420ccaafafbb8049ed0427fc9de6596f8f2653edff7c880005c78447753329dbe39c30573071a692071f063fe5a2fe828f72b5fc05e1e7f96c90722004f51fd8d30c7c13fc611703f5d7b6dadb9cf616feca881491ae8f2e8f797b84f86bb9fbe8ee0f696f9bbcbd8630a847c1d9d2d4f1425aa956abad7244b9fd7c6f96fa9901418e6bcec33eec8bbf88ca4a547ec8354682403520d8a9ba395110d6401684dbdb50564dea552ed4731b8428140aa5a3e3a37ef1ac3a66c7b58d6f604e7b402da0a09acf61f32ba35fd3bd7b301facaf4030a0201b570f7509e9018ac010242235ae22fe4afa0044616905570aed013109c50004437bfc4ebcc4b951240697ba48758bc438325414c699ba34a85b14460d4d362fa45d8899c0502e49473e84822c0f27b98abe141c7fa854e1efc33a26859c0786758a42cec33faba0edc1af5af9c4cab42946ec6e6292f3b0124fb01295ca1f8b98899358293293d0f660e6d8b55a93e3522956ccf171156b62ecbed4cbcfc1aa59f970a9ed39d7fcd416a39473da740ca65f369cd41e3f7f2c04573e71c76bcff39509aca75d0c38506a581dcc7b84b417824a88878610e10d285160652a1452e08f895c106ae226ae573648286594110a7121ad23304228a18c21f44bc8151a7f25017f7ae2f5f8bd9d7e2f0132bfe730bec7ae85c8dff085ae71bd46762c788d9d073b6fe7067ae9209df5200eead893a430cde351dc9f6b8cc460aa47e875ac81767c785c933307f9cb196873b98c8198813ac61d942dd65d4e7b73b6a61fc16d0ae862d952ab8b454b94faed525d2c5654a92b746cb16c09a2f6bbd0319bda8fe5e8a8eea88be568a90ef50761645193419949f16741038ed464f3e3ea04d46f2f5727b09e9e9e9e64b39b6d3fdf5d2380b2753827b06c7b966d5d0c52e24b11616b085468c0915a8ddd081a70a486eaa4f8cf2e0696e19cb0ad60fed6e1c0ef061ca9d5e92b13b69f5d0c385052bf32d46f1dedee5f59afd00f437fcae57590ee9ffd5b777bec7ed90fbbdbbb3f0526d81288c369d5544297eeb78aa0d8667bd89c808d7ea6fbc3a76beeebd51576747b300b30d4e631ddfd4cc6141eaaf1932805d9307fca671b966c189a2595802e18324375475d30646ab599a8990ccdda8b6f64bd1b27ee20eb88dfb4fe69a0fde1ea1f6f9a9120eaac63edc37ad1e60265ba6ba031360b922eead7442a9b399de8d7af896e6c68d3e2cfa6c567a7290633ede02587d56ad51865a8bd9b1f68e3b03cccb42fdafe4012555c66799ac66ad4d842eb3f5b49333e849f5725738a3996efbf527129ba7a8084aeb9d5c8df15cb7631517bf157bc8ab372ddd44eedb46e6aa7765a779fcf74b8dfc088e284c12ab393f2bc8f896a7c244672948f09fb9e93366d5bf974909edf82ba302b4ebf0cdc4d4d731e9e72d4b165247fc59f73032b946324e76925f615ff89242a357e17d518919c676549bcd442db23d6d4cdf23343fd680d210ae16e54d2c555da8b2fa55cad96a0316835f250d1183fdc52911732e4062ae9fa31c6d4d552b7680c202aaf7c88a4ba1858967aaea9bd7806e727c208b45cf9743784dfe96b13ec4c8044926652e0e39c905a19f7a90e675b192cd2de06da8b2d14bf87e2ab5c28780afe822eacb04d3cf357fccd05437b31f212a6b51799562311d73a06a7748c7ffa9cdbdc7ca98726d8b1507b9183fc05df236a8b8f8342055f2ced783e3ae630980f14540882b45c7a9294c6547f19212375ec63a5ca85c1c0ef69c13ec04117fa71eda863dde9ecab96a098453555f99719b627718d2563228982ebbc6d618450421977a73d87b26d9d90c68246d70b4d4209b0c6970fe59498d33c29a41d1ff50b52f775964748849057232c193e3cd0827e9e909e21b5df51d3b59302ec2085813d9eb3258fd8f1dce1b651b1dc5dd34f6cdbb6fdfe8e0e5571dd5caff57a58a0f633ff0b03b517c03f5dbf0bf0742afc9fb3ee4f551a1cff5623c70823e4eed5085b651d1714d951bad55de5a858c8dddddddddddd773a76b35e7f6b7faed7bf5f0a3715aaf6e54265d8b110c309ab26295b4811839fd94cb675bb2f6ef802d9b6c10ea15f0e8f2874bdd0bd207895dddbc357d0aeeaaed79329f017bad76bb617d25bcb6e7bcc7923c43574f9bcd023c0d9ac051768e5b6873f6a41f0117ad6b500b787fb74a8f522afa0cb676bbb5ee8ad5712f0d8ec351576d38763851fabcfc6facd0addcbacf67a3b1c8e94444ce8e7598e9f0d746c8d6e3053a463b4b6fc11d2b1af350428845e2eaaf6ced0af857a21add393f33b3b029d55f99f8fdadd4d90fd21bb077045cdeaecbe56dd3a05b841e9ac6e95efb32aa42307a9012194718b33c64dc6f6e9ecee7242e6adfbe64a5f49840078db7d9bb5bebedeaead8253aef5226a6e1aa8fe0cbf3995e224d690524a7f86b1818839cf7c9d8eed8eb589fcde2b12bc32ddbadde7fb6a049e617637fd72a2ad1d13d52dbf3f17b90a10d805acd53121fe56e6c9999a2c7638155819f51777fd0a63205cf9572673578e10343a3cf24665f676a2f223d184906810a272ae823810760c84ca9f820bcd136b3600c5a6201d5ba31a8ec82333a90617d46fcd54e60553f9a1b7af46e0d668aac9a46b655d2f7046cd796227e50689f2ef8a057f7aaa281afdfaf56c5017490951fd1649a74708fafd4c1a51a57edd23234d473544a9b0ba4747dea84caad1515035405da32b4c2a8fa91ccbe3bb0b3d462e2fa99f0bb1fb58ae484855b81f5722c88f0f9f690c8493c06552ddf5ae9c095565d06f6bbb4b969330101e5393a468d56a7ff0a36ca0df7329fe2ff5a8e7522ed7b70753a9d7f16aeae1a73ad43b0fcb20eae1dfb4381d5fd06f56089fb6d72f1e533f17baa23ebe74f9ca87057eaadc735c8733642bf7226ce53a05a0a193fb6fa65c28d797faf8db7c212d439d1d2761107e3a0f8c08a8892a8088c2cb19195c6d0f1824f2e0a732ab563956edb390f8595cf8594ef448f37490c402d3b1359ac14ccd81ac8ed1ca3f444310f5633555aef9a1818afab1dea8bc3d1dfb3ca0557e5e6fa2f27b307e1f95732ab76beb2eab4a5d56149650f7ac5a9dce138033fde267d61456951a3b1612ec02d0d41e8341f73f16d2b75382e7c10f961f980112205bcc03694e18b715ed3c8478c3218f2970c252b0d8eaa214f38f928716df8e9c1de9d80753f58b7fc7a9675fb36580ea5bab08fa6d2d8e914b603d0f7fe8127777f77660fdee39cc1c1d7e3b743368ffd21a3e2abce99a33a88c6defd56b0218c8b28f0a801f0a5f7eece2f30b7158c2f6f4f40447855d08f8fb618dc49966aa1cabbb75bea6897e3a9eb703eb18ffe742ac3dfba36bbf4e940c84a942170098507fee661aeab1b7d4028e83740a8fe1dd1ffb22acd6c5e056e75b6e771e5f8e9aaafbfdcdbdb2495bd53b5fc5e559d77ac31eb0aade7530c6aa7250e535ff4940596739a1fc3e6b3914ca0fdddddd9deac0e970bbbbab1c467f0eda2994b0696b0a65335a4ab83d841b64d9a4c944a19c267592106e318ada10ca891327144215a44e28e784ba5c2dae097dae89084e40ce1fae44e8ea1f553a3c399ebf3a6251fb3fafcbcc4d95578cd4de517b5c3a020ca48b1684fe30b51bcc95edd1efac1ea214f35deb5ad7f6d5df579687488f91d45e6c527fe92d1e11560f9b34d150ffd99a14cdb7fc8586ba8f6f4de8fc1137a93a37d516b8b635a1ccf1d0105cf4f4e45bb4db688112a72d7ad362d79311a903fda6d226a394713855196590d4aa4f4e376fc6d64ac0bce0e98a0108d10dea163d1179f1348563b980f277f72a07ca2fffb3c0ff2c943fcedf0ec68e99666f3c82e3167677b76c2965cb6f087feb6ddbba257475b3bf7c16babe7661a1fc5856475d8906dc7aaa52292ec7f6883a44503db5aff8bbf2c93182eabdaff80207638c3e7dfa74f7f5f8703746e8bb37eedeb1dfda61bca92cb0772a9fedd6e53c5d9f0aaa3a5f4a29a77c9fdfab12604575b0833a88066aaf7f1aa1dfefee0e270fa006026a5a3f69af3f471a40b5833638c3ad0ec7cd5b9d07f5fb2dee6cb607cc51e1f308aaa3f6654382ea2f084f50fd39c25985524af8312e3b333befb6db6ebbbb9d54c5684deb25383854c1a6555ec18e56dda9364d76cda406941d3664aff9b139337ff677369a306af7b772fa75fa613d43549b5e2e0b06855ea62cb67d838f30ed0d27eaf49971e5b31ddd7815ba1b4e5477438dea69a6544fc3061a347c7c97e7004d32396f80387da9f0291a1f9c029d73a8c48c5855350a119d080000405000c315000020100a060462a1603c9035d90f14000e6d944a724e97cb83b1280762100531c818438c31001062100186102a2a1b0007f316c04266d83d6158a8a6dfe5abc249c3376d19e6c897e315d67f816cabc2e41618cd66263028e1d118d28fa70730c0b0d6f375a458515fc1c8b27816a4a2d9aff975f6ba0d915edbd4829087b5ba39efb77288a7b0b010b546f743a441ca07a1a486e140fc93089e26b8673d815da018fc6b48e203ae7723d6ce10d72b68ff4afdca8afd1f909565009907edd71d5313f8889729b519248129a0ce1bc331fd072c7ca413cfa0c3f24a443446fd370225954c540d372758b247ac97843aeb4dc13d64ce2948b4068e794e165f7b2f85490f4a1721a5acaddb283c0ad26943d8b8c9e6fe86501a7575022a9dda46de28122dd65a1d556dcd3b4de6a2642cce3c040d5dc19c2082beb912980588bd0439381a1ed7dbd9d4bcf5e0923273981f531d2a0045e504ea4844e6face523a6ecb13cb02689e8144f42cac6d5b6d16776802d2f7aa9e1764037d5aee9014037e9e0d6774ee2aa3c3c813f69cf7678ec9388dbc2af566ddc1caa2e9a27c99af65f62cdc6586c4a0a9cdf074d118c59694a4ab84d8e566b8d9a118b69243ee9af9f40093990262d25abd1565609eb42d58067d211d6d4079028362f9342d8712df6b2ddaaefd93066885cf9740739ddb4045bcb4e180392b282e8274d87730e5538c84607d5b8fe0e2946e907ab433170481fbbd8ee59054808bfaa4dd8473f8a91b0107a5ab3030f5b67851445dd09c42970e5b0f0fbcf1106e9023d59a9e1f2f8b9f822e0bcbd9598ae55e9a467dae7dd0802deea389f3f5aa7c5d4796371f025b82015fce397ecd852a18740a8b03a1b2ce84fcc3eab6637ca7ff18fd2310f162f57365fbcad4ccb9c96cfe318b8dfcc391e05b99312933900e264f6e985fad0259424aa15566626b8768f9c280ef2c0ad199ae61db0aa31aaa7fc67b1e176092847288997cc4ace50e85059f8c27069baa240db50083c7ea448e2081c2bdfbad18aac8a04cdf65036bebb862483e21a9328246f51a738045a5784087aaddf0b9d375af49b576f8acb9952e8083c3c9617bc12230dada3feb7bff8168b172b1f1ae5becf238df607a7dceae4862d8c45829edc4f61352871609788585f43553379c3602b71b9f2260902af32a8a6fa050e40260644a389da53037cb11dea394ed6bf485e0e16edd63b75e6a83f7c0779bd65024ce68c149bd1be1058bb532e0539b8c6ccd147cb6de5d04ded0a8c8b39b998cb53041a552513d6b0fa2e023a5765a5c1cef525b7a4ba92457a477daf041a44b5c4ae5b5d00da2afc34bb9c0494799f6d536becb78c829d59e26dfeb9a9b96d3e5030448a261be72326bf28181f1a966d8bda5dd568a2ec7a561f4f6656145959928c049dc4c97c33716b0d49b13023bea18c5d6b6d07ddd55b235d2c91195f58f8474b1a694bd8a846e6ae49fc4f48d8ac8912dd63a7ec0d28987d77bf712d887ac852cd5dcf72573a81533debddf8c2b4f6454d6f94a9b60d44fab58c075a52183e8761b11a34eedd3563f6d0f663e22d84456ceda8dcc77cf2a25269102816b295a2e1143426bd284cec4cfce80dc285218ea9418b0c821dd860108dd86cb264ab0db129caa889fd11fa6aed4430b131991854523ade350496bb8a52babc4d62f2a12b2a86e6cf0f38a585be703683b193875028af0a46a3129a984ef42a42f95a6e8273aa390004b702d510690c3411a956905d4042c242a30922f3f429b9aad2653f2adacd11e1573aa7d05e6038ee246a286ca06e4988c40354e8e65706ee1af8241e9f1a7a9924f6419ca84b9f0efc873d77b5b867a7143d36372ed26245224ad0fb0deb0b5568888a6217cd2e89ad0be985e4800c0cdadeace68a6a3fbb54d39034c4ddb9961632fa936d41470020cb0c8578b088e6fd2d6f03c56a0550d6cac4e5ee370146128c129f493e41500170fd559c4bde95da5ff8a8b6b996d530bc94b3cff517afce274b36ad09dc7869d02d64359d32a069978db846621fe6b7bcdd20f606d637d2034ac65d591cc59dc3bff4b196db0f3c6ec6314d37ce9944b6c04f03e12ea5d7ec709d2f9295c0b45163b942e7eba8048735143f3d5d125d4dd24359ba338a769eb48f34274a650c5f0a6da430d75712e837fd85a9d2fd6d63c64da445c104da4c017649eb644841461962a4418a86f74ae8eb2ec0482cdc90dcbf2dc43594bb7612816a56a3e3059729b06cc280b173a73d952be9b18699b080b529cd1526b14f3024909e7e936c13280e014512fce32bdadeca77b8bf100a76fe95d2b1a5266a38d3a2147efed81875a0ed0e500b7c96a84c644c5aa0bb42fd78d539a23e479a1b90967e1d8da1b91707bc0f85eaa7a7cac54135d695dd90209ab1d591c2d19c9d61449f533252196146f8779bcf87baf05a866d0f9d421318b5cd10c175370cd005bca182c2748e1eaa92684159671da969e34d8055463dcc7ced52b43760eccc5820c3c64dda620bec47dca8d74220f78b27a5216a52f7671f5cc94193a5969f994c364a52783d74f2f7481580c7aff1f40884d03fd10330c0b6f51cb4518606ffb41e235f2ea8aee11b194384d5eeb5f981f0608d950cefa33946546175e33fe915f81822b173c0da3f68b3ed26182089af551e3a076d63276525f45860b12666aa0831b6b219c0d5b603e19bc547ff19822417b8cc5b4d4b8fb039cb01f97c2d14bc08c97608600204fbaf6ec1ace0ccf5c2a4884180a3ff04d87c7cd2139e0de335e88c015d62db1ad50467543123862e7b3c43615aac4d2983d70a244aaba5721f55677604733d8e8e48b7ab0894277906143766ccde443116bda962e2c6f96e6a3891c737476f2dd81396f9b91d255e25e9ac12455382e61fb2fafe0f0a59be2e535738ef148c9cc2d6fe6d5e0d80e777e5676c52fecc0ee4baa6324b8b00a6e7101684c9850886ab681882b03a8a8687ae5637bddcdff1d67c822f5cecc14ce4e774ff43c34a55818427244300cec71c38d8b27ba7e85c43ee0e80c7460352127f4c950635f930f4898ef7d9866c1fc6a7e5b5b1aaf298cd3422b847dbdea54a85faae1894a2de591ef19b154f4ba5317c5b967ecb803798a0bacc10ce8f72b828a32c52396cf2611e06fd583b9dfc3c1b2afbdaacd42c4b72c4121bbd2b85cd665678269cd4aa0e39c6b9c228eac05d9490d3776f99ebb93ec8a28a090869c502e585d253a626d8d803a0c7a69ae8dc65ccded70ef6c3d38c7ab20a68fb1431e43b20a822f09753d5ad2685637d6425995de1e4a9eb4f52c1c1f07fe30ae16043aba2e544e741c4b599a0d80cbfe2bd62c595ed1c5537212de0afafc1c26ce4564dd5fe67884f94e98e4c4f0672462f984ca94f6631ac5d67f5ff407660c432cffb78ec7e26cac5079c7b839227ff593410a6aada675f690c90d71459a2f31ca64ce3018a9d2a905785f137d22574e64918f2451eb1813f81f3cca2857ac9fdd908b2bf49ed3b1ddc48e491bd8e2a39259d571b2c1cedb4e926a84076956714c1edd0c9bdaf72c6a7c07f079d0ab4948c8e8abe50ad09dce542a7033c6f346fef4b37874a71a818c0237f163db17e51753a1c871cff05a6a8e2d4287515dc15349966d9c0054e7c556803e927ec07267d379fde95a88de81c4f96c4564e04dfeb7c8259d1122ac8c3d8ac7d86e0cf3a07cc39bf8b332732d51bd35a928992e771b1eda7ab6692955fcb2b6c40369dd7e91982f4885b3603777c0d98f0f5f9a83676a01af748fa76af02dd2ef584762b6316d3f83055b0a9b78300baab17ba5e14d5366ba836698b2e8673397b2d0cca8817cab0f362a9cf05b51bf1b72ab6868b31420a54f111141ac99638c48d17eeb6dd32e2a13886490b1f9d8ae7309c8d723f23adb6c541a060426c6602b028d896206839f1b40f482b003988578029a99d6324557d47dd899e86198ed4dc927131f47367ac2fd29050103ca5be8a420e78ac4092b75102a912763818d2ace87a416a38abac3389f5073003f59b336df22868f4dd6e053de60ce50740847f6dbce87df66be04271ac73384588e61fb881c8cc167011c72cb3a8043e3013f7fb3f76109ff45c863ca81f07cf67566809e88728ab9e26640e2b5b815252d8bb8718fce1393c4717f82d2ec9fdaea231b093700070c1ae89787df40726506c2c361528b609480b143f50387cb58e7e67133c7a8d1c3d12e3db505a752bd3331e8ac8fb6f6680185799c5aa66e5c62c0a425b5aa4023ffe008dcb8da783765336ff1354718e589fd023c5ac06de0655faff569f918f9edfc98bb9a78c8c8d08ad7f07495a61e010caca49085b7d6aa2457016c58ce02501f97bd9e75805a91c4b6fbca48ded99a97836d343fe990252b71245333f93417eb5034b549d2de289b403495972b7dcba97329717287f1dcb568f2e665bc3678f29224700b2b0ccff26910c5dd59de6a54a1bdf8bd7fecf9caec95be8298110ebf5ae8590deb49164690c794618cb7a4428c5672bdf33ba6d0b24db8a049810c431d192043338324016473b72e1b32dea9ea3d68427195be63c285f70104bf1cd7195ef964ba3d88a554743706d4eb3d967660d92f666da11ba53f7017a8a0ddf5d554fe40d51a24614d07e363b3520388a34adb5fe608e7771e7b6224842cab6390816b7e0ef6efea1399a02610b00467493669f5076e443a60f7dbb9ba2890b160ee8e4ae5369180c48776f6547c12cccdcd51b5dcb6ceb4d15dc253a0ed4d4b13fa7949157243105942e983c8dda05d28f70527612219f820c3e6f756c235baa97b841f16da92f76ebc3c90cf20ad04d112b3f83a840d55f91b2c1dbf79741d8cf83f3b4da305ebe8923f5aac3257f3d7c003073c407dd686c18d086cb38f7e3ecf233671e9bd3662a959b6610c94c5bd992e32a14e9152da87cad3a7b070161753d00d0556d955e8702968497c9c915e9966e920dd6ae10ac9b95a01da779416d19ff48a4f2b3e757883a92e7a8a828e1b5ccef4d547fe96052b1f3b55fc03c8eaa6ee683dd535ef1536d741a4de7737e8bafd570ebddd8a14279f85b807c727ed1a99df1e79fde1a9357039d794380bb2ec29877ed6afd25d3b7326f6d2a767a254e9f5bff38842598f31f1b3426634a4b30abed54c4c64e462c6a6631e06a3d3162e6cc90a81240db6a48f0bf5556506a5ae8f9f64d54a35d61de63b86765d3c01bb50d547c1a90273fdf7f8ad560806acc69c15bcdce64d5d103819e2198c816e1463fdccd57ce8164377bc6d827768db3f1f0b51b19c3c1d47a51926346b2b77d51610cb5a62965295480f804da449ba1d954f34aa10516ebab5ad8b6eb858e746d560ee224b1f95e6eb1154a7b4741ff2bb2ef7be3b666990224eab6cf2fbbc1e7eded9c9c0bd74b47f39b0b3da92b864aca5780ddc664edc38d6e870b20b3e7aba751cfe336123711a4fe1b52ab6fd62ca31bb2e64fe46199c791009f4e3d7b4e538b3e060762d610adffc1838a7302618f38f7a05a03d8f38abbb479c193b27de7cae5e8dbabb702f26c06322e3f292c4cbf7b2cd16037a53ee2b3d9684ab6103ed4ad24cb8e2f720bce124bdc96190beffb2f426714ca0900ca383902200b87ab89c975e0f3d7d4c971b326463ad300ae47229ea112714635a0b2f6c42f45785ebf333ba771e4c5a6cd0bb0d5935e1213743ecb5103c56e2a6035654e02433a4381ccb1573af3296c0fff50ff2ec149d49172b1a9deaca110edf1fb149c4892613ded4224441d412d4f0e6c8be3e1ee927904e6e6dab84a91dbbfa14007ab7518cfb8d005463a853904de3edc27e13c042ac8058777a38e34ba32e4b99631107e45e051c97e578a7ffecb24ec172c328d73c8734c78eb6f6e988d74a218fc74747ca0f1935c7c0f699e13ccfad6b04772995efd03af029b014edd9c2b7f0377a6a9ca165f74816ede5a65cc4f312f5cfc07350d71a184825511c7cb6cc1d4f805beef256a54d30d4d16820f8fe8c5351071e8daead4c4aabd5314af871e846e83d9485a5208ce17e7d031bab2f88a7e69d687502555bcbd8d8b42bf9fb98c97898e6e616fb11a5321c664cfe911559bd9c2eb6c8155528c9df1fe7df8a5c5b6eb05dc4caf9003e585ba75684e4095a8c15f10033cbf40fd041b3827dc5c770f0a94df0e99b31516c2dac662bf9699f1ac073a5cfa6ce7d4d24cef8197229586b0347133629796afadc7ff64258bd70ca46ec0dc76d9fb7da6eeaeaf3513d27c023c6c8808125d3d307a74fd57c9c88d1cdde9bb6dc6686e5368bc8fe728eb00fc7a332a0261f66fdaf16bc4c239d058c879b4ec96bff736d191fb4ce1033c24354bf170576c86e88efeefdf7c649d7831b43d97b8651288b6200aa2f940b21eafd8bff4c7ca93882003406f02a6d419f807cb3affb8f97c3e38467b191685373b3dce6a0fe6c614d177956f4d668f252c28c53a46c9f1828fd9b29a80522c1f297a4130f1ee4e17d85f9397ea45456180cc19a9b33d9c8460800b66d1fc117045a9000f121e83c92d9c33fdc873597817ce4fb495b8ace71e4c615ef33d16200b888d6c31febac9be8b2ea656b931467871099031e5ad1cca76a0ea353323faba4a9d86c4b761ff873bc9d3468a9768b71f4f4c8737b5d41399300d8bb993d252a5b058402af23786a499392ce225db3741619b8a1d4b92221693ac9721a8247c4c65f798d117694a9bf1e532133738c57af69772baa809d1c85ecbdd71b21f4055ecf7b2c6743c98af46bdc308424b83dbcdfd958ee7146a16f3b2b41a5b215b0cb1afe8f0560ff09d916c66b8d1c42c22a7de7f51aaf0a6cb726881aa4fedd817b756ba5676f08ee56ec594468aee2f256dee35c896a864c79ba8a3d1481c6cc894a4613f4f5f21a9e4ba84bd6cfcb165cb7d2226de1a8f832d78779995c799ec68fe42a4e620680d3dd1cf4c71bed85bf68b7f5d8e7cafbd3e45cbddeb31ffa7084f07c28624ba02041275db85b6fa83272b80c7cc88ba19773dbd012edf4f5ba4a1632379a4acc2e7b61f177bd76e10b8ea817d206ca65dd49c030afaa9cf2eacad6744dd5e8be557939637afd464017336ac892a86f1356ba87aa39db02393aba638d1203a51556da91b062ac74f1bb3faf4e36e3a817834820f60b37026a8d8d0114e844f741122eadaba949226ab5675fb4580c5052f45b47b89256b208c741adb3e5040fa97341ab886f0fcbec2147e0c9a9e16daf4ef1732fb8442c7a243e87ecfe6675af2310ac6a72904c3b41432d242fe3819fa159375dffa181522e6b172e540678dfeec08933503c369029963ff2038a20e847a35aba0d3998a19198de7ff3033eba40cf97266d7088a547f0329f03a5f450d1c698ece65a842e1d41727e6fcba843d0c1c3b71565666c97a9cd66b152f508b52163fa62a26111ee3c52c018e171ceddf382d239c2002a654c94f3868eee695cd696761bb8a384d663887c35d984cb978ecd5c1a494b53041713a5028892e0e0e41beee2a5b030b414d925fc9f2184273aed95499bb45d4cd8b1eaacdd82ebcaa7695f517d551337cb8155c6b0bb312ec5434cc79686be83c35b29871028c832471905b72611ad2bc082b52ed4c183c92af85c2550a30c61710bba041863779a60627eb87dc3b9cbbe91d144597e48c1b29fc6939018238099ec514ec3430730ab3e07028252cb4f0a697de45d2f08be7d3caa5c02ffa611f873bfe6d29cb80803068c9661231496cc392f2e1b9034565abc9ef06d0000b7949e322118b345ba36276421021f3753cdc81349ba166b0091252fc128795ac39b17aaf0648a57f46eecf31e2abd082d651f91cab2997b303f0ec0a6498d3b522535706147d00d1a15b87ee30a75b0004d3d4eda6d8757b8fe31554e29c5814daf94746f3a6b3bf20fb318c644afa135c28d569777cec9c0437b2641d6095e4e6a7fa06b139c76684c49a2eb114f82baac69c7d09bbf3c36ebad2b965e828e495b2cd3a83babd8ecb2766464654ee5d798e8eeb663fef909dd7b13ef54f2a3a6fcf40c18cd6cf623db8c372443306b0f487d2672bdfb5462911160e2ed121fc74e2562bfcab71bd087302011eacdf6be2ed983fcff651bbfb2855da404d614d5978b2db40a80075f835c1e60c864ee9ea63c6a3144cd6d01ac888066bcf10abeaa694f89d7656abc61d134622b1b6a23909362f32a8255b77e6eed53f30323b0bdc95272ca18fcbbb887d08052a0cd0444cca78856fe3698620b15fab76860e591f68d02b1f2e8e7fcd24bd68ad547016845912a3da1a26f53635d9c9161f0e00b481db399fd2e27434bddf7a31c0df9df41f93be617a63ec221010563ade482c7e78772b46bc2b619ec952f0ccfa7fb14a273ba4ee095aaa25d16aa3cbbba51647a5755564ef3a52cd40aec27cacf36884419ee844b521e4b873faa9da86febbb84a0d553433ba190481dcce4f1fcd2d322b3c1ab0df3d60f32e2b6a1693d6ff6806012bfe700a34ad879cdef4fe0e610add6c657d6c6019e5f3f3190a39ddbf2d6db60e88ef4d6ce8199bbfc46effb44851b8557add8ae717b9fc040d3698261bd9b88f76a9eb90672f928f3364bbeeb256065f1de261c7ae2dd4e3d880b8465aedc558ac3bf6d47b162d9546b6a54a20455591321661ae63628edafdb07e0040382379848677c99308717bedf4896982b8c5da207cd3512b6eec27c44a7914e2f766ff4aa18020492b24965a9b6df88cfa2bb33d95b01c6cb7dc42df5db14387b752603289053187d3accdeecd693229076e5fbc8f326451e1d935a78a35bc8be982c6d72e9f1fe4ee882d35b9fac5866459500afac2e015efdc8855380db88caed559f19a06a085e17e04da742da2f2758c763bd195c2cbbea21ddce8278207083e47c245dd33bf38f2ea9eb2f704bb567669e6e9b064ca9c25afec027c57b6a37899de0f51334d5838cc71cf3df5cdeae8e3fce13f1384ec9e4728db3a1af85f2cd4ad675d0867d241c788739c3bdd966f66ac6f285ba8d73a54f2eec7adefa638aa2549d3769e6c4ce3ad20f72fda866a3d9e897156131307e434246660052212e0cb3f8f2deb4c39df9eb63141a395e29ae48de9239f6f54a41aeb3efccb8f2b80fd25ffa401ecb1a9391bf600ee98d259d38a7262176e195fad5b44d1231db14d77f53f242dd7398190899d52ff09467609f8e864843777438377610568461e615c704d5951a15f8e3a52997124d29f0842877ccb137269af3d7ea2e8484400378debc0290648c56b1f17503f75e67175d68eefb4a46d8140143b323a1bde8817ef2e699a3689e8ca905e5d26e73dc68d0db0f6e403fef4c87a19fb6ca96f988c4574ce4349c93754e7b76955390957fff807e81abd0ae8230c53de6d458b283286ecc8e6351b9b0cb482f1ce414c0d343dc4bcda2cd6583a3f274e1732388b82071e869d3552eaa36088826dfce01cdaf36a159174b149fd3e042de8ed7974b7bf191c707bfbfbbdac272ca137148d039a324cac56f6321148b5e50d42a11454e34eadb7feb013d8060c819a5b9bcad13ffdac8a6205c74230bb7dfe56d9a22ba1436708f3ee3972281eb11c38d453a0838af7a5d6ca5af03fb50225cf1a08a892d5519089d56e78c286b5d3d85458277db035d8a946a5c9ddcbe2a9c055e318d0d0ab2dd1965249aef6581ce005bab0ffe359f58a42e6345208cc0767cd8c3634247455a6d7ffc5c4d5549d091883e8616f117bf0f8c195bcf3a0387806768efec62d6bee9d9ec5a38846bef57e39d99b9813e94848c47eeae752c2836dd5986028dcab5409d1a8bdcd88d07580e49642dbded6fce0f722eafb978cfd6bdd3d3aad4399aa7b1c9d03cac5d78a5504af1489f02bd20095f189e7e619c300e28b7c31632208cd6cb89a51fc3d5097d367a3a4be7f4edfa5c4c3ae584fa39b71038ceee5ee8d5339112c7adb94cb231ec2246bc37dbab2157ff0585a1097fb1391326f7ef1463ec10c576cb8069dbbd6431b745ac68a5a30c7237b086648a4d518424a513a33c2916cec7d19cab1d846145f6dc370469a958618f9e425cb116022fa5f45bd149019b6014ace7fffc7970e22949f1d29718027af225e6fdb7310ff2a7fd92d778af786f7fda58b422e735889c96d49c379aaac90bc6dcbe8cb455cce693510405f17e5af8b20bd108f20d017af7a2d02209b0e1de64ec41540543f18bd15bb8cd0d0aba734eafcc3bbb47368651f7ae98652a3cf4e0d3048b99f7ac7b821ed6ee3f07d2716f9944d89de07042ed4d9b28d609013f14ffaff8e85024eb39cdb03a6185708dd74f0e100b8dc3a9f8d08b1e92a2601cba2e7a863c6dacd3b94e16a1d04e3dcdbd9d12ccd7c998b9cfe91b1b2d4b8e085db4b030d6cadc772150246b6666bc5b92a4869c9eea5e66a39683e16b3e83b125da9687946b4c64cd81eda73bdada3bec03fbf4924198851e746153d0e5c232243637e887ddf3682754875a9c478d55591665f5087d4bed62d40e5fd344a88d52a2fd94ce3adfdf91b9cd28f445e1477e32b4ebe250a74ccb35149d41a412f4b2300a1b01750ea3c15a8469f9a12d9af94b0e6a6fe5b38039dba190f4bc303e8ab82d94766af96135228249d24a46b2214e92cabb1952794816a956bb2cf6f167a849120627608da24f934624ed664202a90e245b724d77e9463b2759d8e1a6aa7d9268e03b00a5585ce08b108d47389462708b50d23a29b6053752c03a635564b08f46cf13f352af5f887740b1ad40d126c8979282855d1e8534d9f73516b15b1fdad74289dd63ed3f65605aa17797312502e9a7864b316e261088648c3c85a35e8a0d1084f93409afd3d19e34852a32d3e22970aec7720d512950a413efd387fc5304ad8fc02ed583c31fc0e7a199f999e66306f63d4b9ef2f0a1ca7197826409f14ca0f58ed6ff66109067addcbb496d5e793d0541866567c7340d939b32488a232c0c95358d2557f1a5c87344d1a208fae9224eb5c81e469583b983c5b4f669f3808f47828934dfb0ef192b91419d525347f56405418d77d1edc73e35b515632e1fc1f3cc5522b4352eca398a2184d4486ed583a349b71c3e68b58324b8ade1eb16aa5b2d2b74ce734d612fdb9108c25db5136953a9f298f556502deeca6d197ff61bcfab6c98202ef592e6cda190c977d5c3a890f3c39e7145638b51d817d38a23425a8526c7d5dd2345e2a06c0422ca969704307fc0ac8410a415fd1c2ae4e63dd268cabaeca4b4b8f03e41c67ae56b5f8c5175dc1ec7f40c9c2c1f32fcea11aeefa06d85dba7ffe1854a948e6f857009743104da648ca589d3db7bba3d06c9b8fdcd86c38a3a3a9374e8f1d5d925506a9d71968537bac155ab70cdfd36643ffd5889b67109949e55b01e42fc353bbbe24cd5adc2bac5ec1b386af7c12c531536048e547530d4dfec81e636362e61c2f6e875817e64bf537878cdaa9c9f7ee3d4df6a159db554f3c675c50ffebfaf89eb9344f9778caa781438a94e277d580d632e34beb55f8d671078eb949acc5be03a6ef9d446abdff436501afd9dc5989e1ef1ac29b4a41574b9ddf26afad4fbd6e0f8cc20471eac97642a215e9936794096ae6958cc387d554efcad289d99691a8b56fea4b2e2aef37fe406e5b079a9ba6389f9b7890bb4e057f489ca55e8561ba90219444a67f0186e1cbaf187bfdb494cf178f662f2dcb655333f4d13c7e8e803351b5eb502d1e055e051c5f37b2de16a49592366093828cf1744dbc481257b5632b7c30283830c6d4d4a57e3a1a62ec57df180882aca0b0fa8b0ce1237346f5d0c7cdf12ecb11870585143308ab3cbd546ab118f0236adaaa6a24006d099dbef59130fd93074a3b69deb9f2ef38ae6f06eb701f9e543313ab6a1906fb8110f775daa9043d39a4fbefa5be3c042029f878044c5bef85344aad000902040220c90654f04c819b5c769e2ef151421607f68c25ff335726b1db743060ac820e146b3512591ca61cf4a1cf194ce9404f6e28be2df77281395c723df03d29ffd3affe6a6d65a904729d4570fc3e267f0b46b4bb6e43c23b3046a340e25bcccae2f6fa68c821dacaee7700b2df4c2224b0f2c00e5d49b6c2b82fae9cf9d1be7fece35538aea1c18f7772bc0b51677f43be534d8b61ecd0d6aede8bf4fa546bb69e8059d247a98e629623dc6ba1d932857c92c4f46656d3b2d1720d1da90cdec5c3c18a699776b2a9747f134c8b149c94d76677c125ed53b7c5120d6d23a5e41686c1e59fe56afc9d6e55d1b1258307c8da12e07b6ad4493398f20941741c333040fece27152bc1584f61a82cacdc1656a326eb5e4dd805d2a73961d2b9c5ed728a1927d47160a78a5961026681e7dbd69254f4c19c778daaa66612e8878cbbe6bd62083bb0542953832b54bd118d3d662ea1f17aa74822728c0a98169e0c0cb26eb51df770907012dada0306cd2d807c1679e9c6ce86916a78b037834e57bdcf4e2ced02e1c0aba071de97f4ce40d64240b2f0e457564e02ccb2f8616ab62fd1e54b24296b7a92d849cdf09c2ffd42fb972dee0fb505a437ba1ee6452224422efcbf211779528d5e0f1460eddb9a33ca8866c3922f367694c65810e823981fd48567310c1be869af919bd6ec8bde8887f796883a02bba1a5171e355b41d6f32d62c25beea724353c4a4f62343b34c69018a950576df2537d574a26f07680e4f528657c91d8931e5f923035bbc0490066816ee375da8d98de2b2321494ff8a9af9507eb9c71c48007af49fb848c032bf7e08ccf5891190a885e43fb3bf2e259b171fa8a5eea54073ab98ae1b0a9a65de24c5e8084df5bde6a7fa905f2bcf3f6c8e5d6156a0cf9388d81d2e156092b79a858d854d82c04944bb775504d663c10022110449018e317814e4129dbd9621e19b9fb425bf3fe831c1437f712233928830e36e51542ef7be814a28310308897412df3647a76cc3cac090695e1e6208449141ccc25939ab1ab084814f1223f23e1f7e8890d6ecf807e13399df4634ae608f7a1e3b316084c19ccfc84ac65accc071f9468f6675396d7ee8a73188be49444ad0085b36f3756a1b663283b08afd4f4b80459d2e3cb693f13898f40331e8f1a9eed901b7500b8f9588bc415e7a8ff262d336892b9667bdb0a84ef6f1827842cc03254e039e10d1458fe90715ab2e1144ad668c297265b8d98a15a7c7481a632dc5fcc4cc0fbb6f42c05612e2d39a9c335120709e6cfc2480cdf5c626f2bb63ac366acc9c529061dcda6c77c64dbb557fac1c4c99e9665c116e5c7a949bc83794db8a5c345f28adc43ce460f983956a5b57dca9e09fb29797a8f630540b86ff8c88f59196333c9c383fe792259c9fbeec08bf3b0ccbed67b2dc118ae225efb3b894fa784d1e8ccbe3b3cfe44f321b58defa6c949d84ea7aaa4ea26596b150117d8b49cb3554a0b36c87bf534ac05119db7806e572f51bd205195f20d2201335252ad35dcc870d5b2ab338559384db5219c5ec52068ccc2b7c31609c40f76a91dcc2747743d50f7be8b73f3c36b735e4f5407c1ee48472e2f2dd0de038dc5f21cc0bb3cba4e68a43dafca2d79544e4f0b8f8f6263b3dbb73b847b97c8073656736226aaa76b33602248c4bbce14aa2948d6de65b1287a98da7df30a707473353c4df65da40cd4b7fae13e45e33e6eb190f81f8f5dd48d02984214f4641ad68556a7d83c4605cc3a81a243469903823a1183216833ecf220110925c94ed631cb8220c5dcbf683a3f5108eaa3092da0c6c6ab274fcda8f9650889e54c739cd6da7c16bc8ae408112943d7bd421ffeb8416be34b7899c924746eb03a194fc61c0ffc5063303fee70acc9d3fe92babf33d75da0f0e55a4f362633ab54e2e76ac2a55b434aa9d80271d7d6fd254c9a7f547a4958dd55c4207108617b249b40e690b7bd51464576c70d3cb5c82c8347a1ac1acc19791273033dba6d31f31c22660af1aff125d465e1329c0b4496ada00274e7d344cdfa6baca7caad297d8eaeff0c4113576305635844740333d7843cf9d5c9587b1c799c23f7b876fc7e8104e741a2970086ea3e171bf68559e429f234b1b9d974717fa32c0d4f2552fe953f3803313802376d15311399c61f447bec58f098113eeea68f6dfc6e8a9123d32cdda7577e1735e502cdb0e9b160753650fdcb67184236ec5746b498f73df7205e42751c48ab7e206c9347846599301c94802a71caadeb97f700c29216cbe5cbd79e77f210eda7ca0e36a9e193011573d1988c87c1caca809e47b7045185314723e54d53e30e1396ef060ffbee0c2b6c0dcdf7440c2790999d3213a9106fb36b9851bbcb983be808dd10d12a5816a6d1027f5ff1f62a56191855afef9672433cec070a401dd3d59ccc778dcfb8842bacef28c9d192be7f08068c65afd3ec9b9a2e019554c679462df3dbd2e194ee5b173ff10fab365d074d7d1c9131ead5cd0b72708149a5f9ba2a98d7ca0a303e14e14b45841ee448452d7500c28190bf857af3346f4da1c74a56a5d35f226582b5cbe4d7d17dcf394e055537208866eea3b31164bb04688de1483db604a43c51472079ad9db9d58e07e65ec436f86a53076d6642494321df4c0e15ae8b6183346e7d2f9905980fe93dab02f08b7d7563b04e99f0f83034c413790a36ac027baa7a55dd571db38a3c42ca2928d78c4a593e31eeb1c28ac5805dc3948a33dfa5b515ce607bad2efc30d03b58978a394a258e9dadd196147349ae6c20298e735c3d632bbfab80a5a96e62b20ae059832d5e9a0164a8317a35dcafca9d493b0d77514d901a51177525380b50aa8da9da5c9457738f525f3392280e20ba1fb23b305077d5574798f00a40d9b93a92ca53713c79453e5577933c44c97a0641ae1eeb8880032e519dc1ac0fcdcaa823ae1a0a831f388859d065e693baa9361750bfe529c0a6ff94af838036231de3cf19805b8689ea8a09fe4d884b2b2e8db04a3bc926f80075c6a73502f21088146a039687b065cab3dc012604200d69819380011ab918a005d2a52611331ca4b2ec934e25d80a5a9a6d78224a197d64c10d0b74ca389e92f71457a932bea8bbf156e86f6ded174e88658df4df136d95ecd5ab5add0d8f38934560f6ec7d9456e053048e83cc1cd865c9117c02e49f980c389adb2a02bd409206cbcfa9b272dffd73636d4bbb57d7a4b3a6c53f9891a383e6d3b873bc34f930ed5e4bb53642c1d6a192962330a00f91b13738fb4318c0c844d6315e5dee811a5c840e23b9d6ad02291650c752fd349a50c496053b0d3ed873499aa08695d205e62260e90a1d2b78c20c429c2424d46a8f444eb925900d7c044ac2ce33d7276b8a4a9185ca3625210a27fad7d4c9198df3b2fa24ae15df8c3f5063932340f30315a475382bfa81eea97434974ba8b119dbe1f67cfa8f887709b5823c92ab518b1e6ed65c26a655449cb8bfe76b4ad731dc33d36d309250353db95a691b49ddf206775b18e699bc776a0965e8ef8ff4255c9334a55961c8f6a65d967ea562bb98f8b537d2606822e23f92d6ccdcc2548d39f164a45c987d54adfa8a059e3298acbc4b6f61b26511e6132e53471c205916bca72cd0c9a932c2ef951dd059579d536606e0dfac1d824452143ad52d3b6e586cc1a79cae3c46fb63092ab4f9bcd488b2db69d898d2803a7324b9b478aec4ce142075e0a7ff16a2fe53daec9ebd3b2af8a349761999b8e9bd57ff9e984028f4a9af9bff6a93ad6c7c48ec1e8f57e4d4ba672ca873d76f0b0d4130ac30a53fccfea36541ace404aba29749315b789525555f9fc75beeadb642f8c1594737b3194d4c87ce3dd72b721a6498f6eaef645742c25795cae0958764f25d3b90bee2484c110dfb60fa01df16ba1411f3bfd950179f3a798f8c4767226b84975268d4c667dd454b129c6c6d7acf59f216b2085d7d86f35a9cf0a735a13923e0510ce8d585e26794eb096f8e0c901ab0237b1862002bb7ef1e4c2b066e3ea3581a7bde5b5076b095f4352ef82c662822b6d3a85511b5cf7f62d5e2cae3dfd2fd5280d65f45277340b93f8c820c687d68e8eb5e1de7031e070db53bc29826e9ff07df40608711bfd2e4da03e1ec3ff6550cd30b0400cf14733c732f13498be31cd7bc712c109860f311ffaa3c148ef9d3f1c1d7c67f3ca7857d310385ac1fde4af2c93456de9c4ea252ccda6b41eef0e0ac9370db9cf7355c5fb0563c3af3d7e4867f141b459af37a642d174ee59818385e16776d55c97d25afecffcb1dd53c6737d2d4f08fb25f8ca85708d165811dcb1ee5b721a79b2c10e5ae41d86ae1a5503d224fdfb919bea48298e6dd48679aae98b9148cb7968acb71eaf7799354ec6c7177454349f27ec82264d01226b19c5065e52b9259a973edcc1354d3f246c27a1fd100a9d98849c66ad05f2adc2e3d1608fceb2b72746ffbe5b7b30ada59bd528ffb9efd0024811378ec7b1024254cecae5cde1bec08c30980304ce9ff3d83aacbd1a309f8e081c39aff43abe73751c8d13a83a3479d8c1231033966b54a054c8f667b2e1f804e7829df51940a95c4410e00b01e69289f5143cb7a6937a2eaa7f7d52e591730adb8251c3571cb46bd7ac1718d52a61454c0834068c5089dcc13078152eb6c03baa41162bd8040bcd40d985194046894e1b9519c14ed46eeb92efd599565502834526e8ff9d8ac1f7ed7a314facee1e8e20cb9d3d6e74930bac5deacff170e904ae7912cac034a2e4173e41baeb14204a9d2e446a10f15db5796b99b9034addac464346ea0e08f2761ecf68508a064ec93ae5c5d964589b487576aac7a50e06f2a88775c5c29339a18d56257030e8ab99d17d7ad48655c0379f4b35744c56b5b70f92954b48647c55e102d67410fa9ff818c6130a14b6e214ece3ac6aeb96781bb80f1b814854f6a90a583d31091dc1ba542454e390425afa926460b7d7f40c85128fecc0e9842556de15ffa1dd27aff533196351ead566d3796863639db8808bfb26c0a4fbf264c6dfa70d3080730e2d6fa2bddba7a0422def52e12602b05662923e04cb4a324413c0cb7d90926c8dca7df5aa286b98ddd15346e39ec05b32fb7f145a943f68acc75d5c7b310eacd72dab4c6c341d678a14dd686f08afdb59388e12ae5ec99feb4fa51a7a5aa30cd81516746e7fc6818bdd3a7cf739754278f9ba497e268192757c4c238a6a8c0d7b41072eb51a8f39149c7f434e0d36e1d330b969af45ba58208e442ef28f531ca126417b7abb867d2a2dc3d5a4f91d64233e85fbab2641176d164aa60b74b3d1adf83d96e02135340c83617b3b8f67fd1d634dd030944182bedf759306e77d45b59b6ba36c58a56c0a52ff1872d6016f97b8d9249cfd5c7a3b86d0d00a580268484c1862bc972c8b288701c1be38ed779703bc97de4856f6de00f600ffadc6daea9f42a920756c9851d0622df4ec74e548130f116b334d577f17eb7c1be1c5a16c3878c04531cac4d81f796384590fc5b74b1b186f828083344f089e832389c0a93cac82a152f160d31185213c9495ce2e2515094a6f61d45d45defeb823a3998b0eb89ba839cab34335104435608f70d70ddbc99e44581b69f4b0c5c23abc8da5b9cc017e44b81512d1a0377029c561c8a016632fa3ef8df9f2712a66ac639c6ce305b2ab4ce040985535ee598d945b196bd1c6b0b3af95f82d6f507aca59035547196ffce52493a833768d74b12913d9319ed3ea792b3ae2cf2e0c695ea992b30d06036b4d99b14c78f05d51659a45111cbb9c5c31a6fa04f15c7a29e549eba38e263d5802786e8ee08cf5dae18faf59bae0d3c199ac3cd4987a62394cb93937b2b74a8e5e19d7524c0a76f7abbd0464a54d2b3532ded510a327c7f48cc680e08ef6611d4a95640237c462a0adfe2287cb00248c58c873ece01fad64945e538391ae1d42244ef5b0b3d38136ec282c07f977031443c94a6cbfe1da8283b540fa37518b4c7a4638112c814e40b95dc6f618a135eae9c2571a29ff7548a75e67f7e45a88e190cce30f168eae3f437b94145f1fab0fb1898918378a6b24f931912894de5b616a98efaa3466521d3febcbab29a96c49d5dbb0cb9bb72ca4bf24fa32228111b5e614c25284dcf74f6dd64018eceddae74e90380d4d996493604c0cada9b03396775c10c891e72634fda5d75c6545e4fe0bc8a8f5e55e667bed66dc979e5c40effcd67e0169f777f2c35646db0dc733318cecf0cb007465da70e60f32aa856f2d9d5cc65d135939a205ad7558db52e5b4697574d2d811f463cc1dab5082fc7b2c64312721e334ad85d1b3910dc5d5f781fedd08b8582e08eb5333135ab607a3f554f9869b9e88fef9d1ddc221c45a3d7945a9c4baa149783823d59e2663f54d5d5d7f0436c1fbc1b7959cb89867ae60a1318a5a82b8f4c7c1824320d8c2c32e7389e32cdb57a3d7ab6345915e329dc5ce8db2e3555ad2e3eadf186d6728ce179a58a0296e4ec6c84b70852e0e74eaa03486e9b3ef23111ece87dc3de73674d7498c60801ea316c4f4e5da1058e07ecd3f80cd444a94b72a13783b70569104bad251ddd81c612d4bb437f44f9468304c7e2a59711918d61d6340cb2b05aac09c9ce11cebe65f7d1d9783087eb8f1ecc2209ad595757486b61e2c5d1404aa06b6de91edbdabc493e8612a780b0b82969673350f16887fe5dc34f64d84769e541046f65e2a79f7ae5c9ac634ce2328b054b74037d51113679300953a68f240dc3375b587417f3471faa51d706db6a4950b95381a937a46f9460f0a399e208417d8d968c7123fa13ca2c8ca58d9fccdd2d465f0a3fa773423b74f2f6cb220264cbf40905b99682c1899ec087e369ee2d730b861f8411920f11a231a083c40836414769850330c2405413dcfc0c80e12ab9228cf2c25ecd80c19242529070b7de613def261b5b595c50b3074b1203ab224f0c4142851ea44480ec30ff3c18331774a853fbe07c23ccbe05d09ea4e2b15e31fdfe685b66301dcfb8afda77d31586a58a35f1766c76ba621984f81637320ee6b2bdbc926ebbd92c14e74cb278916d76d3c5bfa3b383e492e7947edc5164b82a6422e8983c2dfb064d037d1b1f61b223a4a6c76e0d0206565602458eca183e1060124a978f3e0948902634efc6b9e47dcf258570a029b4e413da8e756da54ce0e0895bc9f44518bb2b6e2eb8252aae2ad5f9e26cda02d2f599ec10f7b59bcf93c84940c93ab414b70ecd034ffb034b8177686200f3093c9339a02ba28d14520761927a8a8412fd023fbbdf3621299538071975f029af08704e300592ab1135dfbcd2bc95d11ae14d310e6359d6d30f37bc2a44eae1d001cfac8989cb353e6fed01df86a9bc18ff0d7cb2e72540335aa361a7ed88217d92582d64819b20ee487d90a6a0e311f6f39d002419281d9e45a61efb2a770a2cddee25b0b97cc94f80028752ddc38a2eeb6a9078333e62cca22e5a4fbd0820e1d5ce1b31546689b48c5e8669671c21f87930483f32ce46c61f6225ef907835396611b86389c5c070f67a0fc3e52a24896a7e287f58c3482c885b35ba802e0418b01fcc47184123106d60db765bb4305952b9cce7639ea14d6b5b60e844d4c2e902a3e200a846b9fb96c0a364560381a12a81fd868f23733c025f0a31cc2ae9b0373e061cc02075a74ff8ccc925aa2c9b28327df2f09542512dd839d7bb7192a42cfdd5e576ab81f9f9055fb096256b20b1a240bc535f4d3984355b04e1b92dfd864f453e2869d1230811a5bd46ebdb10c51f473369228e0de70c621a9daaedd8d07f56cd84b442e9e3a7c73395b8f7fed25ad4ff39b32c067c4f4a3e7744a0dd3d3c3746bf0dd9bddfaf1817c846a26f4f367122b307b0372a73ff1b65368c638a3560676115be083333da3cf47942c62c9d4422f26d3396b0a1ecc2170436aa6b5476ebc9f575e890d29a2ebc06abb31637b068bab4903e6735d8d75d603b701d105d79000f38eb56823c548b1962073d6542392b29ee0d4738139d4be562b65c433030e0ec3b12f672df8ea63770120378a756421e95c692265ea3645ad8595c145852b98e01eacbf1c8d160c855511d29219a606210ee6a8dba04eb08cd6fa693aa5500e65835f90481e06822202555d9049811957af318487485d41433e4ad4e1813f5c319d6c1f793a70b780102933ded832bd79659404a3f921440f099e99b05f18137d7e19280b78ee8e16a451579389b589101e42f1b079f3be829aac7d051f57aacb180503fb8466a12c9ac9d4093077f3329c974624c74e853eb976df2e62afb74c66296bcad0bae2aaf9b140cb349f2fef969ba6b4c62f6560a8e56997c061c71e7b42b2d38aeedde07cc2a2001259130c4ddd842fc73f79856bae197612f38c68576708f3d7538a9193fe624cea92079485bad98b9a00975c5c3ac1d2849c528fed73b5950b6ec6ca9a509b64ba4857defb2d0fe11661115480bfbd44fa4073e6f76e2ddf08472a79e20a0c84968d0688673aadb6e7220c7b87c5729f963b5e6e3ddbb6a7cf13588f5444cf8a167a677081063ebc0043adf57eb42016063a60a5e582572b49369e598eef8d480c45d0f828c44d8081ea7b35e5200f97d9f694412c8c9dbab6df7c247448b5f99e7236eafc51a61650c9e0adccb9e6dbc7909fa87fffa199f1548c6c2de364cec165c4d1b945505280df7cfa939f14312a7e9db0974de6781a3ffa6e953efae6884db2b0bdc5d2343decfe71f4107090ffdbd6e39d93ef12f128ef0a5ac022d176b005c04ea32b1e26010d6ed4649275ff41bc7a07d703546eda0474b8cb5b8cf1378b3e610a8ccec121cf08f9a5ba693b99df75184d8fd0649f2b18ff17c57d17015d8b985f24070a327e54f38879fa4db0e5f500ed027e5c77c1700d32b3fd3d1175a21e8270a76235b20bd3cd402bb3207367247ede2457dad9749200cfe449cb3958dd90e3e4d8113a167685aa4689fcbdef523954ab3e2a072a7bcb9b6630503439f4ef48d180f2d574bda915c13659ab4b7995d8012b42f8f02bdb4241b9752903453af80869e23ac8ed656430a68819b1ddc092b742a4f0407fa2824753a54084f16b53b6060024d15c5405aa7064cdeb481e2c3c8433d4a64708d800f29527fc1640b07701370abbc1832879a740b54db5195a2fb6474b47a716d68ea6fb36a86e768974b7f0ae885bf9aa5b2bd972f21541de955086cd688e6065eb45772562bd26aa2025af3521e4dcf31a2927e86597642accfc7d684dad2e1111900303fd46d169abd7cd130c6e374d4c2496f1e5b7528cf544035954076f78726f8da37507adb1fe26735da4725638cb9d8ffea43880bae0080326a16c433146a88d2d7b0c0f0ab877fe26fdbd2a0dfd5da74754cadf54e48451406a933ff0b203ac3544ecffaa5fa409641718e1dc7ebedf68e9fc37f03c0c4725bf449b1e28827055dbd036777a020b2671fd46ef8768134d00e6dc9ef7c0ba4002a58049c8d01c1a3e7747b0ee5f1cacc09e83d577a6c7b4f52d8a8edff66a3f917935e34fd161b0c288602a60ecead9d1ccf62ac78c9dadb3fdef472f414621b860ea0b3822245a20107a795f9c699f8f7123d37d3e23e298bb05b65605a29492f35dc0fba8600e15c22541f9999561124b6912eacea1ae2bd07dec0bbe7079b95dc1e090f84e12761a242c1c9daba59bcb58dc7da782a74898bbf3e5d358d577ad2770fe06755a949aa00262d44dc9b2a412161c83178eb0f677f5068e7e93a0de9de821fd7562f5cf5fa0011d6c6c0620cfa210a60036b651c436206a451155239175f1c972e023020fb6017d1539a00ea10e657ba02b8ef071b4bd794ecd7ba826f7f2e4cd5e9da50ccb486d7577a64b4e8d25a1b5c0ae773309f31b78385db76d04ad9b398c786b45c0870718eaa070f27a5502a5b2719e58b15b255fd86a6392f4099f272a21e8c2ea53e3a678346a41d1fff1790639a5fcdef583c213f7c9f4a8479487f36b83babec843c1bca56afe434312b3bcbf3b9db0e9e5e64055156fb2cc8de793b46c69d05a70b2624eb8ee2035f774d2185b467c81feea70425ecaedbb48467f0a0462fb49e36624b957e5238b5c9ad23a9f3c8cdc28294ec185edda53ebc24a9b7b1e2ff309f166eb4735ccd340b16d5b222807e3e29b8771a692841f154746fb63f2a5fab07b1b2702a54ba7bf67b2daf16007aa214226dd380443029afcb90a8fbf80a036ae26a3e9ac7a11f30e3066f1b0fef26f361b21850f91d4b9901b9a69ec004c30349351d58f2833bb52542c234d078d41ea0995cf6068d5e0adfc3230e7883d2c2695d1b6f1a1b3428f2aa82da355509662e8c72f1b85dcc09591a8b2ce81178301264afa49e747be46330e0cbca53fe1e2c1bc5c7e038df25c707402b5aaef6882db18cb5a8578ca1df3b2e1db04da2fe699af4db3eedd6f7c4761abb0cb34c09a464cb0e3cba64b8f2ae9dac22ea59367e99b72fd8b620165daccc00b1b129aff1a7f731a7f30d0db1173fda439e3c98ac65dcdd7860241efda85945794818703700ff7ddadeecfd1b6e7a286e927989063fd418c1612532fda7f17c68202bdcb70d02b201e6f37916e42cd5c58d60dd7d5538c1e0e2c9d052fbb60e47985daf99f97ffbf96a106541810e0a565b89bd134ec521e009dab8f64d7571c83bd94765d55f08983d5db37f6b22c984ce08a765d666877406321b8bab0f744aea02093600387b228379143a32c77ed066226ca385a9703d4a389bc48c10eee9b0c39126d42b6863e505e9d096531ac79ce825d73de9df9bb8046db9f9a941c3c08f0407bf4baf9409234b07b7321894e53767a54164e7b0a10eebaba92a241ad6a9436baea37a8dd6b5f0e8ab444eaa53ea84909d3c4482fa5286c1535733131e6c744ad6f2d9c8ea2fe19cb20f2f4979c2b4923890f335e52e56100543305f35d0b895bba9194a610c8e01c38cb378c15245e3af6b5f4db5d15369d5629d854c92671d29117abce2d57394f176e9239355b59609331945f719d54c53599c3a68ae0fe720e97aa4c6923559aade77d24e199ea06c4680e400ed2ca74065e95afb9035a61a775a81885588175aa5e8f56c29be90a588531e6ed918993371278d86f1225c35455178079180c8689cb48b5c5e3c2ac98234913fdc41432d0be5aba6a449a5d53c79ac8337d12b737c50a604a1dfa73eb7ad381c12a39efc8c9e13dd4c3062663e2e2e04558826b28cc700615cec997c9d109274c432135f0ad5096771b1c88f88393c0edcfc4be6a683533b928928f0d215d1a5236d26f2dfca7980a2ebc3ae208375df3cd7cf747da251238e499c46616421ecfed7fa3ce3600a8b6bc5a1521320b8077e38ccf283817aa553b0135b664d55671784ea28b6e1df7f70d21f34be4c4dadd7f852fe2948b487c7a9330118633064ef1d54b755548ef82edc59fe7b1ffdfa0c8e49a6cc5a9a6172fe9e45277ae48f0dc1d7e88ad29bad465a7fbaaf00703d6379fa384872047e4f5d08cb825dc461c7d5091ae9c5a9263b2dfd875217271bb8303457fc86c9a948f6b5606575bd6f2a3561dae3c32eb5804d693c1c652bec7d01dda4191fce039c99e32b317493102060cd7d12263732fa1535261db270222afce07650a53a7198b3312c090361ab907391c4331e2352551f776dbb1568b92dea390a4dd782c51016d15114566a4c1e6bc4543451880b4b52cf8f83b3cb94dbf7bf746634307dfb8dbb976378a2064bcd998dcd35e6769e9a08842bb6db4c3cbafeaf33dc71e36c8bae619ebecb470fd604db420b912677b06a5b41e70d0f59815837f919e0351d77ec3c4d8abfcbc1e5407c0a651c5cce7456e95de3337ba80313d06a67ce7c0d369db4a0708c203a1c1404c024cebdf9e7a1a0e7ee3067f934e2c9490a86f21bd844720534125d16fe144b20b848063b95144a0e65e9b9638d046124a24a84a78d24cc15713324b24c564827f30b61512247810ff699b9080e0a0cf882cb9b16914472d598e3bbad470c479d0899a430ca10d7c2f6d3c07f1f8c918e53b95301f224b29c6829e01b4d405595712d0c15accb86978f88d5f63b5459d804b3e2896bf7e48541f1ae23e3837277b4934bcdf0f2901de353b78d5705f56cd8280ca178501b0354a58b334464361310fb262098ddcf6093c52c1889e49e04f0da354463923b7448e1b3a35331444a6c1ca466fd7999cc7b59af49b98a5361c84594c5779974fc63f5ca01ab9494a5482a837f5bb21a41fb293eb4a39d3b07e00cfeb75a016172aefb9b31f144ffb8104869e4a232fb63e48b1687c9446439b69e21a2c203769ff4b054fc743d22e0bfeac794940b7744c97e63ed4860bf00098ee2eb43c6d4e39e1f550268bf7b7bcde43b629cf3ed35ad0b23d0acbe2d9e108c2e0e6a236ddf7d35bfa4d59d780709f0b46e6362c1f758359878de620e8727586be0e3b416d99f221344b3b532fe107ead926ec4b591020bb7cc92120600c31a59e0046308e4393cc3fbc94c16f316e91b3adeef1148f063fe189f72eae0b702ee84b95698cb6b69e5a75ef9ee07a1fde23643933882663b7cb75e739f8c0e4e0286277e7d0cdb069e381647a508443a7143820336fb90b75e9b009c8a4b569726d5d85834074549a681c9436200718002dd58ea0039b4c58efae6060e60ccbcdbcafd80409d7160b2f763ce92bd50926ed7d8628b596fad6e39d0f8a199c7edf7e4354b8b10f4698711b054ac0f55e18ac11e1e51a76534507c5037a6fb0d0b8767849cbe4ce8dec945c461326b4cb020a12e6685b30903a4e075aeb77ae4e2134a1d12d351b63f235de02671181cfc4a8358fb745d5c3bd1d363d81088ccd650eb496743ef0c7f7fd708d73a6caf5247e0713c44cd5708e719f0b3324671fa2518ffc847d41444bda9652ca245392017206280641065adc220de628ddea22a3302d61b0a1a1580c0b9622a3ee64c75cdae39860f9e53631176f33776c6e761867d8a5c718af565d4a8f3105197a6ac73d3dcd49a9558a86bdb0148179752b48084a142e3c4f12d9af813c20270d8b5aa86ea3b4af555bd2b0bbbb9bbfee8e714185d87a2956046d5abd52a7d9f374462b434f727bec11c48a036bb316ee38e52064dd76815970a7fd8739a79cd215638c31084f5c3d19ce044ad54fa916c968740640637678d25dbe7858d28b91b53ac0970020975f4895dc977980b30e6659f7687309cc5faf20212851c284d9628b2e5ddc8613fb3110901387c92a3eaf6f33770f0530f41c76cfb49442ab687821a442d41f8f6e9949ba6af1cb1898d5308ffcd6b6c06debfff6bc66b19a47c714f716449d66e8350ef4faa1d72d0040af73dc2f04d73b005441638622a64f779f7346fa011a6f09d1218f098238e7cbd9c130610e9dde30875f0450f60cc31cbecd70fa4c97dadd1dc4e6891a633776148a4211d6ad2f0ec529918a18f7635da3f66cdcc07e3146da42dd8ab139a79cf28d84c055affa2866e4a32806ad0f5883405874fd1372f95d782d1ec129a38685ff2af8a5930368ae974a7f54e44343312c55ac2000010e735230fb310c46c58b24a574d2d9b2baf6040a7e6428020d131078590ab41a40c58f272e50fec429fdef6907034b97924aeab204fa344ec9037322922c2b537dfa9c7452f75a2b11394120330f38b707c19d76295da3a139c11f26401ef11f10860677da691892c2a1974a372e3f0eb3707b461cfe6e4f1ccec0ed491fd5ef8c1a72dba2b4802edd5d4a4a99db2573bb9c53327b37d0194035ea50cfbe5a29e59433cbbafe1ac8a3dfeb2197a57b0dcce9f79aa5d7ef750b97a5d7c82eb60bb6d92ea175ab5dba4f9fd2d4552b55efb21a647223b427756025b7bb94d264d2bad530a0575a4a4925a57252d36b0cbdea0d614efd9add50c39e4e5d6a79c49833bae5915b736e86d167bc837eb558e66733f7a4ccb3bb7a84edee6e29a5cf6e185a4a9f2da5cfe69646aecb4e4af59a447d16b4cf5ac16a402e546928eaa1560c4b152b63ee8742d5eaa33d140ff6639807a3628b36ef592dcdc2d5c355f304798010e841afff73e16ad7abbbe66160910329b76d041d4cb8cf10eb22a3303860b1608e2989a56a2de6454c48a85b309ec2543c1d3ed88f8382a2c4a21550903963074300c12422ddfa2972c4f3aa67e3c77e508c0b31d02cc8a88e9a55316e554c85a55b9f2a486545a525966a92ee6723c4d904c555b4f9b9ad73fa4f75fbcb41f31fca3ed46c826e7c5550d4b19d2a1657f1696a9db1f6a40aca388d13400e021c70e7ab6271dbac55c56e8f5bdf149bb98f3f237776524a3f39d9e568afd42ada334c11de2d4a8ba0975f5622728240661e701982dbb5ba5483e808698cab06053524361980620c8c804924295918f28a12031f71815d0c24a751f69fea426a815ec52f75d9b62179a7821108b79f833cfa85b0e4604ebf10961cf4fa85b074f739bd7b98d39cec5810e21d4412d2ad4ea15bdca9288ca620a807dc69970be8a5c4893f172e5bb65cb922c2fd3c113ccff33c0f0150e7027015df0692fdf8e7a7d53de04e47317994315a400c15c424f191b7b066b1e2e2463038a8030128e4f3583ba273f3c39d19b4c48d1d88e1813bd3888d3e4662301c860742713f0f0acff33c8fe5c33b16600e0e19f6e322af880b0fdc9962c8e0c2798b186009f200224752082304494c99580f05c8872c1f50477b18dbfece7441e2a983718505b61a00bdf8b0c5d39ec61d00aefa4bdc061b1024ea7870d5ad66c1dec0e59e919d8539fd35b7bfd2be5acdc20b18217431a69188010583063228a9763c6f870a18e851b2c2c25204a684a55b45ddfa4a46252d252e3ba51d2e0c7c3fcfab19c27ea5582956b242bd74746482aa8e12044bfde262b94e497fd2974dbf762d50daa54ab077bebdb3731b714a38280356bbbfb4518389aee8a4c3f4983eeaa4f813950cede891e3361150a7f4b091b8f0a7b8f17b28ea943a5703661d1235ca2537c67762c58dffe5f0da886b242f13643f09054ab7be865d5853a151e08e0c7a2247b77afa9c724af7152c8f7716d011c5529aa35bed3b3cf4ec0b45ee0b2e5cb65a542305fbf3f3f3d3432385e649e0eb933e094cf3564edbf1c4266cadd574b3cf208f4cbb590cb79eea370ca5ecbdfa27136a97412f3bdd8c03b79e4ab534f33c3d53ea2accc9b253f77940e31c7a99d7ad48c4044f26c45bfa1d5eed768c10a4bdf8343434ae759dc1a5fbf429d7f802a92d479645d2fd32571542a910dcf187173583bdb990cb17345c18b885e2cffdaa4f4da2c17e5da5e87e5468470e2ceac8668fd385fd6a12aa0beb81148ac5eea7fd5c7e3f05451dea62fabafcdf0976f914021a9683eecc17f73b11fdc01eeb1ab21f75b92e3f650ba9ebf24fa4a8a375a65afb27120a3d25d54248f69376c4934f644e06dbdf51bad51d0fbd69267652e8f3b48fcade43bb9a14a9504da2433da810ab0626c659833f6417f10fd9b518e6e1efdf57c09dd8751930c7dfc958f9a6db363f17aec0c618ccf11aacec3e7854c48a3ad9db2ef2af5bd645a0b8f21fbace29b1fd54da732a259db4d24a2ba59476122687b61b6cf4973039d42d31dd4ac12c0bfbf793b0ebef32765dc26aad3129a6e8eed1db630e237ab0478ee5a33dfed50c2c7c22fb810bac3b01bf04441661dcef35971878eacd89852a7681b95b0e262202baec00244939acb0f06dccb0f04f6658f8364958f838562c37c5c22f0d61f94db12dc6e04edfb81ac3a62820024f51201381fcec610ffcfadea552f0f91e3b1524fdd8a552882f5f7645e4c7acf3e2ea09fb6df73dce47e4894122eca11c941cec710ef6c42daef8cdb07fbf8e3159e27e5d646d77472332fee285b1bbb8ccb10e19318f15c01dee3a0630a7ff42fb23855f71650473b280abfeae48526e3f17b79fb726f693af57d4a94141f5be48e80a9b4335c63fe2f7d732e04e1450a7bd80550cff885d1f318ffe2e95582c1d3a40002195bab95fdfb0910a6cfcaf06c5eeb75d5a83fd6ad06d28ede56065907cb5f7ab2b36956561ed85528861c1ed1ff221bdfb751deaafd50edd9e5d27c5152784fdea2bbaac129bfdd426d903694932c4b1638c1d6367a5d29b4aa552297ac7c3a980c91857ab49385becd75a91d36b6fa487e68df4f0ab10754c5d6aa62b32f3a637d263df484f5f7ecba91057f289edc60dec0df65364c4577bd109e7440f5612f6038a3a304b0f3dfcf105a55bf37240e00d818c9d37151f0a1788b9d1d51e67e9e17699f8c3c523ed319f21051319ee078f22fbd8985893099efc23670a12a403f636c31ff2bbbb6f08ca63dd607b8420ed310cf55f18c1cf2dfde44240c3664f6188e14d1e79c488eaa05297ae30f16b28e6eeeeee6e975ebd7a756f6fcebb224b8c9614dde0e40625a6e8248c285c92c65c78f289b0bb418b959ffbc1a41b922e7f117641132c056189a464606188c15e4f0273f8dd06c88367ba5848a4c4e87eee3a72f93fbf49c470284b5e17122d01bafcaec45f0c05c2660e818c95dfd60281d08b320432d61d089078a57cd941d613d66391f6b8fd48b75afbd1361dec0793b29a09d8600c1076fee6c4d600c5e81a88aedb427df9a6183b1266aebb7eb07c14754acf48b1a75dfee46abbd01e7ccac5306b2620c614088385444cb4dc0f26bd46a45b90888995cb5f84df5da69e5c5feaba32e9c6f77a02226ff6cdf17d8101376321ae9c2f9f7c22e58c48ae8bae1b0219fbec4aa2ce07e08a5f066bc3656e72f99989c01c7620ef0bfb19b90cc5c2f7a01b1e78dbe00e1039b3f95b5fae756bafbd3dd4f42ee28c66c214fd37b84353a95b71c01f15d8e04ebb3b3bc7d83d48a975833beddc84494a96124ac8dd25449f730a8ffd3e85769d99992b73b384518c54f9a0152da0156f1ee69cf3bd9b33ab947673c620af9ced31a9ddbbddddbbbbdbdbddb9249194522a37afdd5ab8fb102ed61fa22e0f415d762f2638e794de5ebdd2bd21189f33f7c9eb40bc69b80ec43b5fa07796bcb030f07cf8b38b21de1b9fa6c670fb6589898d2fb596b1a594d2b9ad74838def564ab36dd6b3f41f94a49470d53f616daffa8dd18904c2ba1de9f6b4fbdc6bf6d59f763cd15b3a8c32c452a954eabeecb32ceb6a7bb1d2d9dddd63b87b77f7b9bb77bb7bbb3331c1d9b269e7ee5fe7dcb63ba5fca9ba2e339dfab2fbd9dd2d913e2965731bcc6959e7943fe5b7301b0634fe15eacc979da589ab5803c6bb32d6e6604fec6bfb09d318a3a5c2c6a71fe9d31d28b8ea7804fa802d5b89ed87dd10a80568cec993277f77777377739b7e28a59432477f722f30a522a5f429a54f297d324b39dda52739952de594b3639dddddddddcd39fb29a5f427a52f69adc1dd59bab3740f41f70e23522a57a7457d254be9d2997b812fa748b8dc51d350a81c39543b5a1f8c797b37486874cf62043d2ed21c0e73e6b36b854fdef9ed6dec9af20885f8b3e369afc7b01fbb188afdce88441d214549b66357d67dd53294ee0721fe7cdb14bb991ebd6abfb1639566b07f9ba471bb7db09f67615acfa46182aa8fa6e8ce376d5e2ccd859b177b337774c09cf95f5c411ef3e1dfc86221f00780f33db8f3c19dcf823bf44e30ee845cdcf973ce04ec686f7eec3c98339fa7bd28ecac3f7ffe4c4140be7f0af2bd4bf5a4e09f8a9d10d3f438565ccda71c8c5914f6db9b1fbbad3d6f2804320c77e2cf9f3f1faa66d7024d11771c23ea401384ccfcf547c82e5d4aefa875776cc87d100a77f97117723f95cded5d7caef3fadc9d2561e2961ddd5dc609579fd5c02c30c8e2c2bf15563bb3af791c75650fb025e0c2e7bee5d30a71f0c458d4813dd068d239c30373fa618c672609d3943476cd6c74ddb6bb14bb6ad9c9a7b91abb351c2e3e43087bd040e8331ecc816f621bdcefee6ebfbecd7ddd8d6f9a1d69241513ecfe2f7e7bc7f6961dd482a8eeee3ea5fbe7eeeeade851ca661e31c637217e7497ec2ebdeab507dfdd3d83df3528c627313e89f1c9f4e9f2894ff924c62752fa8423a0723a0972307dba7ce2533e9153c26230987c024673675d259573ce39699554e32a7ef30072c358a761bcea7714b00e0f5fb179606db861b18d2766bbd5d073ff78e137ffa03c66a40fe7752a301b68966525ad2be5d998473f64f9c04282bc343af06cb3db4af24bcc2d6fc9e7b72ce10f14f3681b310d1683c1ee507b54daeb2abdeaef47f18f5e02f2e8d7628509148c7f64a5ec668a0fcb72ef631732bf55a2e6f2abbcc8f2b1c318be61e70662c9cc5ce2c9cc4718885f3f44e128973f9e7299a95cfe1a7a3e1eba5bee87fa5445f7db71b31e377b68829bbd67d9db1e906ef65b1337fbf76107377b0f4a969b3deb071e6ef6f5e493f9a8954641a9ead21d97be53faf645c5a5bf2db99488072b2e25eac1c9ab864b7f9e7c286c65774eedcb71a5ea4af935c995f2b71eaefcdf618c2b1fc6bcd9c31626e8c116e07e396eec72a30e576efced09096e7ce844cc8d11429d052489a2e5484ff774ec669c31d9dec9114debc881df73d081ca4910d76d92f85d0719d7fdabbf4d729d2887a2eb0520c3be4a09a2cd6a50ec575d600364868b264c510d900e94ccd81a929c6a304483830d5ad28c0f3798c49c8c4852ea02a651b121431a32b10049456d43a5296852d6058789dab2ee842f5cb50637c813be18a267d8e0278411226ab20612980be8041a88792d39c10b24221c88407202126a8319d528a79453065844f10cfbf9f94902051658c847d12ba5941bac220b34ba2a255d10e08a9821b058c3abc1d628218011971fc2709982c44505555e315d133c3900be7f732d40d8dd0f04deee422063639057761ffc0ef0ed7fc8b9ea34cdd29c73cee9b2a400538f1d5b8e0fa57286566e0bf3fdb36c9a2219cbd77dce2e65fa69ea4ae85b3f7b9389a3fff92d99ba5409f24d0f4496264ff3c48cf39f4e3d63e7a1964cfed9d7a813dfd479a52eab3663dd16f8e967943ee3c0f2a534fb5a7afeaf4b95ba12fa7e7c53a68ff18d5c53978a80ec605c953a23b7d6cf9e27661cfdca516a648e2076cc32eb53dad1e95475e97faa4ba594df101500ca58be52d29ff53fbe5daa7625c0f6e8cf48a53432392231a150728b417a282b96ffd32e10fed9cdeeb3dd10efb6c09fc763fdf9fd9d0bc00c3f5f722d7097a2fff1ec52b44b01c6d5173bc057fa4bce392a893132113b3211bd99581965f46690320ad92da390395460f9654fbe1d7fe8f6a2bd688fd18610962337045ab9115a7182374fe960b79a352c7cde6c7b5d71e8af31816596eed25517e2f02e27a5d38bf92e272dc3babbbbfb74af5e7dfa0985eaee5ec88f5942d9d4a374a78e453de2914ff36442098e8263e157983c4611c1b8bbbbbb7b742ee5cfd73d8a0bbbdafdd92c22f274cb163fa4a85e35f774361ba2356bd87eea75d320acbc1205fff9e1e14522d31e817419df4e4d7270526d669ae4bc7e8dfff5462ea54ac5ce664e58affbf6fa574b2c240262e23a6cda720659b4f041d2f0821ca89849b20b89808e80edd89054f413c491afa35c57b71806898018733b53726b609a89bbddfddcf5c31d38b9cbf7e64229963841fda07460bf5e95a949dd2a232474c40c5babc939cda5fd58b11288036a194e0a7de7a4b8be87be76a4b51fbeda4fd45cdd82b36ba1ec65b39fae26b5b78a6285ba1538b098a0ea63cd46019aaaa6477bfd260981f4e58ed5c572cb8e9dbb494a7902d293da87cc41e8791186ef5ec467f033cfaf9306774c3bf2993d56ddb88cdba6920b773ebf264f65587e9e16c363d24a3b3c2fbbda9b9859d51dfdb553097ed98b9810aff3b4698686d2d8696be03db7e1a8e16900d4e117f462d3026251e10b6e7ffc8239fd351a843b6ce316b78fef5d9e368db1aad3dfa07adb50271f7fd40e6c650f5f832d1f156e17527eb9c03cb8122705ae6139c808ed3da05de01f17f2e806d30098d365f06436e0683637361cf360a8be7bddde6b75cf9d95402f49d0248186124b684b28a9e1a1189625c2b81f17311730a6ff380c8bf93889892df7eb9f3ea2fdd7ae5672faaf9df42b4888ca93fb35ec7e4de5720f55a1f9afad60b9fc5dd4464dd0703b8cfdaf915a8c9aff7a4c27fdb89c70e27e11e8b2139bffe2aba1dcfc17a34421d8900c1cada0fe8b58b4e0fc17b944a3cb1f8f221297fb4531718c8dff62522c73e33f3fe240ecaf211dae47d9fe73219f82e33fa7e2432998c1c581e3b7930f8eed6f9c7cb61b2958726fbc8d93cf8d6ae3714e3e36709c68c1c579d4c907a7a2fee6e4837204dc5cb9d9716f6e9aa8726f9a20e3de3401746fdee6e47303c35c9baf39f9d8780d9513dc9ab7279f1afb34271f4bc3841697e6674e3e3433ae3bf3a793cfcca7dd13ea9ede4f28d8724f4c10714f49f7f4dac9e7a4bde9e4a39996f8e19a4aa5cf4e3ea52cb24c092e6ef61b6c05377ba8040bde004ad09080245a005b338798162e393b53bab8f1372492b8f13f8919a60835c72e0ebed96279b375ca4bc93cc1162a74f0c0da112eb893cb9d5f4f90c39d4f73f2999bbb0b881250090307318250f0a40a0d5e77779ff9b4d5fd501edc2f871723a4101951e60822ee7c2804833bfff4cc02244e7076342e79119a420a19d7dfa4a306fbd9ff92a3081bbe1015714424250577ea2801113de41031c59ddb131a4e6c378bda5ad575aa17517ab8fed4321162422d435471fd65016c305b68704443bceedca604beb842c6173e5401e38c259aa4b1e3f2ef60219cb83e6f5082865bde2d114c40a6d634a9b6d68a83521a84144c6c4811b405d1a5061c2a60378200c3044585cb4610366072138413441a2e9b2a84504133d45021e626280724768a242c3f36f6872534598e6a8e683283058b7da2c9494b8c468b12ed05b019239769cbcfe92849090b921664832699162053509925f50547251b9050298eb21c924c297e2a1032892a91835f419a444d50d812c382499657174c509022466402325c2864817d0774e403f8f1f2f2486033290410026685355d0885172804c085172d573cd1888ef40a2aa94e2c940d05a228bd925e909098a015ae2a57aaa2f05206083d784943882f493a2db67421145f5e55be0801021216c785507c5901192c80be780102195fcc00e10b3b2f84e20b1a5cbea8b1ede0e5e7628123c01ca7d1c1f99b26127570baae5ba65814b91481b5e743b07e1b3a0cc19a23626f7b4003db37d57ff3a9f8366fa427d58ff3a918a3919ef88a3ad00b18182d4ee8a0092ac2f4f4e976e7a9c07eac5d2a3ec42908e0fccd5300a74bc99ba7404a76426c3cea610fce532a36b8f88a2b7f141783e2cadf867ba5e4e37c6a3eea8df4dc7029f9379f9a5d0a02376ff329dcbccdcfb7e98a2031bb14701ed515b1f99b37d29345617988760cc3e150dc1657d186b35187481ce163cd7cd6fa401dfe0212893a0c13015e815b6097cf5ed3676b856d30867957eb3ed6e52fa04ebfc2c09d25200ceed4bc7d53f7c130a5ee835b64dd07bbd4ee835b68f7c12bb3fb4490ddc75a71355c7cc19c8f61b15f51276e812bffc8035cf9bbed3e1e5bd0749fd765c6e34b049397ba8fc7cae370d44cd95dd40273fc3b2a69cf2350175dedb9ff0a08dbef3f334d334569e645b890b5e27064b507dce12702736ad46124e0aa753e30d37d3cb6e8a275dfc32ba50e26b178ac3cee71d444ee780a87c18165243e6a8fc5c820e443d5477374ddc7fde0faf3c09d78fdef08ee70cc901cde0ecfdf6bcf860ef6f371b9679b43e2fbf30beef4fbb3e023eac09e67253ee67a9d9e4ffffa3e587fcaf9b83e7da07c584b7344c60b49121653bcfddc04eef8f7b3138eddb67255b0c00a2a18a9b082741d565c452b184c17b8055ea13e5fa3b5a2acccf11f6f5705299038b9b2fbf8a592ff0c833936f070bbff83d8b10be6f473317a52c535aa2940f262808d3f857c26c618638c11be4fce1f6e5eace9fb249d7fc4f9b1f6da4a7b558aacd05eafd09e0d1d5660a15b90c80a083bffc80fdc8197a57d9fbe9f59007f084995c03f73885d7e2355e04ec63aba7d850b5caefb77856ea5a6d77eca69593011e246d49c3ed81b59e0ce07b79f81ea37cd4c09ecccd3fcc4002b690f88e397c9b5839d1d0b2bb4e7a161eba3cab01fbb5cddf23f4203cd0ebe0789f8fdaca823847facb0d9ee21504be54e1c6c4fe3029b3da8b46c194a7a1aa219000000410013160000200c0a054422915018c8a9b67d14800f719040744e978ae3b12c85611404410c318000600c418610620c62a886ea003de5e1d9a6350566125d925067371e45d432140ab765f015d76e64b3ecde383c80a8aec68372f645c06a6f9a20fdb21f7a15b373a77fedfd873f223d35808229d389e38e892ef1045b7da152b4deb5359a561cd54baee34b4c39d2e8ab446f9f902ef46af036857fbc91207720913d19ba0ba8afce2fe68e1bbcd0e4ce5081340aef8b7d91ccd1f44ecc6571816a96a796b7c9bb2069111301a4b6bcd66c20000a0796d7169110a40cd5b9488380628753c9193fa8f3512a271ee8af624feb46ceae93879a54025b8385f5de11a504ae9713d172d05f5ea13b69234cd46b0cad69e59b7c424aa2253c3fcb8ccffe5414af359872b7940c3d22907a94696bfb79a198db57c27d71e10de7f3e9c75aa629cd793b6eee72a03c4daaa834e26af83b22edef50ac2d7787d1c5de6b138cd076763a6a41068dd8fc04a5111a895879d2a1f3748873bf74e441f96db708494f02418cd0e580419b4cf32f515c398e7b43f86fabf3869d8408c10566477077487f066b4ca2f2c20a1170ca6309cc3f4cb0ae25a9181f88a59f8c702312f2fe4b91606178d4e37e52abc06d3da073405d03065ef7558f4e6877c3c0a60f129174f5cfbcf836221f7104c090c4d69419136775b4695424d15091bc6cb08cabce75fdb81294a378704fdc8dfc4ce246aed7f5f68975a2682c2564368395d1c1d55a858eca725e07602f16ac9f7c206efb827ce238b795a13bbd95fe285d26bc9e2259e2cf6b47bcfd3f2ab4899b250fc6edc31cdd036a3815f9d8998154bb12cddee55bfb591f0b165b0ed2dd5428ef6eff41a4420f2bf0d68ffb5eaa2e14bfe815803a8145d118d1d63a775433f5a54190042589a12d37e77b44141afbc57dd47447f5f3085d970efb9ae8af554c66fda82e45248db79a63dc8ff59e23019175c6a1accae9d4649a58341d325ca21ee53146443ce8ef1a2e739f182061ae0fc839b999f1949bbe90856e1372163fea45aa4aa1bab09c1a98174b440042a9be74abc33e9ad4cd026638ac1e21d2b98a8ee13fb5be093b0b7a59ad958bfadace2a1dbb6e56204935b68e7167b3cb4f8457c4200b48dfec56ce1b678a1d640b763bc8a0d21785f17e66344e7aab3f8aea7713679f111d52b9b2a0b7a37dc8a19d4b8a95cd8b66fd3a9dd5b4006b6bb89c63c5b3a8935622560a32055257dafb45344353d095f35fbfb7945f5ada3ad537ef82d6143ec638ee6bdbb695ab763b753d93a91b0d66891673081c54c2bc08b1a0083b77e6a31721d8cc5bb8534cfa90a88e64adcd117222166801f8935953b2da05650471f3c9a7e795e98dbc27b85853f053f97dce5416bf3a222e7298c683ee5d41bac704ae076da3f8ebf58450bbd30b3984f0360ca2a7a3e72e3809801c3c3bd35f5304009e728b29033d1fe384dbc12aa804d7239d2d814a3ca5c3439d4e60da44b26eeafaf7ce20c41c2cb41f4ff56e0916986792fa07561f003d35fcbcfea7a138b0f6a1d0a27a3ba24204822cf5c1efdd0a3417ed56b902c9733ca16306dd6ee822144f85cfffd42885025e5359eb3b8d24d57750a45fdfb6867a513b7e4d778e47d23ae53006d5dc448b2e1a97cb8b8d4fea4573cb193e1fa4c3559433940ed1208ea1a4c20537eefed9ba92c363d3bbc097dbdd46705de85dc5f5ffe32205197e46125e25d4c669e9e3d593bf8c291ccb71d5d523d3455ee885124901243037db0532b7adae9ef37d7f986b3647325060968c81a00ccbb4b54da2a29c2019b454758dd0ca08a078d3768ce5898811da85a1c6b20029553cc32162a8a647c1fe6bab8cf7b3d10b17a13372c75c6b88e9707518bf1479b489ebc75d5da942f535e4fe946ab691102bc258635eac645d8550044fccc1d89f86ec8fc601efd5f0db9f65cc49dd44eee80a4650f52a72e88c6e685df55fd921deffffde581be8eb1a331903af255f902f71f09e1105f4b12706443a706479b83d406fc22fbca0313144056cf5fe53bd611b30047548cd97b0592c02d46a96d2b454cbd1de411f420364160b5600f1ba3693c45ffb94e8db5f9ac35484f878adc2ef4183511e24b239efa95db0f42797f4727ee519f9441dc5afab8260dad74af73f2d5aa456bbff575a36d327320fd0bcab9bb282c935680d3d353d2d70ef283dbad477ad103e0248331f224a6f0409bb72ca44d602292e9894de5b634eb847cdb63381674a7a6d8d39211e35df8e24de29e935ad9d11fa5173694712ef94f4da9a33423b6ab61d493c54d27b6b641b302d5bedfe27a9d6269d94f153947bf2003964a8d45619913ec14f8c3b74b51aa92fa88388c27be27e1f9a50a8b04cfaf83850d5b6c885124404417113206e454fc7ad61d825b07bc4906575eb409b47948d2914b6a7d74a9d860ab37a8513ef533d3df45f17695bc04b71f38c8139a38743ee2843aa76b683ba2e7f5b7e9223017a36ff5c8b07d36889814d14d3a055e43e89cb36f80ac1bced7088b86723723f39f8e39ecd876778bb46ef7b66dcee81237dbca09d5ae8b346f86dbbe6b90501ab64e5ac75ed807ef1501376bbfc7687b662827768ddebfc2227328c917f6da034364d39c1aa9e4edcc6c3f7fd915d21b872ed020c8ef8e57fc2fea6878a4cfbed89b482fa70771097b49be4bd1ab8bbf7a80b69114d8b8d91f629ad7789b86e036fca61eae49c85cd7d7f432f5af0ad3518e42ca2166029b6fecbc3fe1efb929cd0d4ef27c70e4d018d49184c3d0cbaa45ab8bd67748559792787324806154819077b6189c056c462599261ffbb6353caac41edfeed1539dd5319ed50a257bb106fb01fffd0bb2680fdb0b6f81f91436ce5df002515018d9362a1811e56d3b77288f699da832ec54157d01cfe0d48304f2e9fa84477022db268d15158633d84c2613be8c2c8a10dca95e84ba49ecbcc0f147aad3cfe656e856e8e1dc454cce845fb93a00470131d207abe769477c95e44a89647e0e32e5fd62e4a344a41754b90e23536d03ce3f0e8c637941a541cefbc1d4a5555ac8042db1cf57b0db17ffdff44f8e2e0107070b50fca70436c9e0f48cf49c7e7a731f40585429f1eef818fec719ddfc89eea8cd15fe851812ca0b60caa252faecedc1575f1e390540dfc27b789346d77018ab61b96804909b19b263c46db58f9b6be393eca1d72ff07f547ecfa0f02c46b91cfc1dabdc12d71f53882ec9b60d6e496dbb2fcfe2214ab105c56cadc80ee5a8ea0a00ac827680b7c3efdc19b4216f3a311ab6129739fd412bd8507965720d48a8a368f77715ab90dec5fa0b8071de8928f08aaa980de8d1969e3476e2e7182ee09130f39cd626f3c2e255614cc596fc6a5c29a2adaecdb609ba1dccfc702d3d93ed347efb320fdf7e13dd04eae4ae4ad9730265dadb29708fdb8c1d916a682aea2124266a647a2c7a53044afef1e923dc777796ddfa8b2319e7896577b99201d110082c231da14936d87f498cd0235693a616ce8785171395a3f299cebfe7660fc0cdf04c167439a2e3f2b6d545bdc92e1b98d2e57ae99c3d01b0a7e589d78d5326fa9c0a850127a00e771ce2a3e38abb4a3941c95085fcd7a1f338663c77536b2068db33bdb889cb5310bb807681e08d74ac8cc827b3938173f1514b2f944131d7af2a7ee28319f16156d3241b8384dce64b4b6dd1d33747cc0589150770061f8509b95533cecbb0f67104ae1276c9f490b4e802225dfcc322b725a80f19e097b4e57b53aeb8e560710f195542850201a377183ac48b74e13d14a05528d91a27f05d292c4de184b2983221b3e66139148fb7e881cd4ecb27b0313db55c6cb7e0d1397697f69e657a52e608866189ddbf672d39a79cc652ece7a64a63c13024875b354009e0da54f5f2813223fa5268b75bd1c54078be0400b2e63acfe199e12f8e49e415803557a3fcd5ed591c2635bc63832d1e9cd3a8920cd9a29375356cf464e14adfa2e471035cd1efd9976f40660abec9f64a438539d4b70c57653c30bfdd38de3643815cd2f056649efd241fd1c7aa7d38d6e184d5ab11717d34dbde29ebf281c66a513e28cc20e8c9c72ca9c1b28cf0db40bf45bf2bc45dd3fbc60a612794cf1cb21e3a319abeaee817334e50cdd70f66d29412aec04d8d7f46c3dd883e6ffc6293044a651e1178b72988592c9c20693ba56790cda158b7519bc01c1762588ace2c4af0f1e5ea0ec0d64bb59d49f6a8c451bff885078c17442d35338ae5ad98c3777cf26d37e1b1fd2a33b906e538580cb758eeed6a3c5c85d212a124d277654c8d71ce76d03bc39f6cc72a3a64fcf8b076fe2e4f63f6ef1fb6bd8d23d250d9d1510c3b9a4168417d95f625b52737d35fd9790ea7ffffb9f7652438b9f950ef8a99a5267752f1150fb1893ce4ac3a0ee37d0904c858949001561923b44bc4521453c56407555980583a22f8252b8cd568de7e3deed604384b6120d67cfce71e7477094e92565f1a550c63148f7cc5b70a76c0644157258ca3b1cdad502a84733a1828c6ee3291e8354f127701a5e9a15ceb34046cf9a7808ab003b747e40255ba8642778f61bd6fdf38e75e8515769da8cb9320234ab136de500894529e116f2512ce4683049809be44eff0622750d2ffdc09efa7507e032e8f9f12e2332d96982bc502a74d39925cfb304bd6ad7a72774019daa91bac9d7e66a2ecc206a81a9e21f549b7f4465b8f56a148170e1b1a782475d537a558db5b2b340a0726a5c6bd5dc886e08e8de1606b8ece1b431db7ee7a4b086120898cf9fff5299cb549bbcc80438fa0bd8888806ba494b8b7d9822aeb2d180b2c9a9abff300f757dbaf35399bcdf38c174548dcef6efc1a0da90ab972bfb62107262674bf86d0920b4f3a631de0b97a07cdda0443777213766baab3d5ad7441003f5faebab5ca8c83f13022669876e4ffad358db70cdac4eacf60265feafe4605a3394e0c1aba828614adfc66607d37c8b067979f7c3baff9d81560f1c2ea5a28cfe5e608d812a5823d1776c98e34df4819fb288d2583ae1d4e52b4e61f79b36968f56fa23ea9c476b69341ab6048da433b8e2ce47caa11576be727ce520dca47f20a83e0d3f7052235d671f7159cfb373c7a843be9372dbce1d5fc1bfbf232ba754323a673ef7ed9c837ef602617d6202edffed159279f08050334163588728e302f75048eead5c3e6e8db3c3f0afed5fcb38b5420b6a0a66b51739c9694535c43a81b09776035f5a2cbb7f437f7c8b951e42a764ae492b801877bcb7327e355a5cc57d994f7b1a567d0361bbe7e31b8400adc0ddc53f00a363bd72e755aa009add0fc23e7875c2227ecc81b44bc5efc24928e4a8d5bf1f4b52d02f29fe56400b1ec64169ef0237cec05743580f9525b4a3114a81770db43191e74a28d4b8f6a122db5542552caa4d8a5eb27d9dd685ff42e2f0c234fb1501b0cdbd53d7f30b974f27ba0d5415ad84b551689fcb4f707e838abf04faa4092ed62ddc9a9f384caa2d166be2753223d3925cdc98fc2b106a26516a331d5d8cb3d476dd0e381895db8ff432aece92e18aa5e72dfcded81082de5bcda1e20853624f3ce3fc041dea987d1eadf0c7b87611cdf3a51848fb05f48927ff0413140c292b5e2903b94c8bd28939d806c4e87a43408e5fbcc422a61df0a75a1336ae11fb4266e0faac2b810485cd7cfa3187c83429faa3e7fab52280ee120585f9e4a726acf5c1e9adefeef3995b1c01079abfbae1bef2586f9ad3e4ef0ee8fc038d0b0268253846ee92807b6577f24d128f4feffa10029e10f2779a9a3efd4eab4c9e8aa04fb64cc3c3ba71ec48f198036704f52184252356ceedfbaa196d33335666d75954f7414bff8be9208137d325529753dacd0c644e330a9371497ca02e0930c4beedf2048b9f340c7f47e304ed4b2baf1905223052b14ee5aac8657e45c9460e072b7931fc7d829c19e6f3333e80d86b9d984b0943318d53d137746725b0a7f6ac1cbec509f44401e17999d4663e3d13e005dd271422e2dbe938afb21f348405f11de259eab154757921068c879a6175849569ecde30fa9236488230d5f79d2cef4ca488bb504b0d13254af13c77ac6a05cd4f42785865c7c562d288bc5d5d4674fa60c308301f9dae881d801039599c2fe6cc4d35ee428c25a932552c4265f5c8794bb968d89986454d6e3645d0d9ecad02a7ca542047c8f44bb86cad962813a9c1e63fc25d80f5156b7c7ba335e212e9ca593f40591148821ba07701204900dca32d179712f681ca5df4e6a32330bff409331252ad7549c56190076ce5fcb36e8ee7d6af6614b38a5e4eaa015244dac3d06bbe786b22a1f4ad9e5e77952198745be009818d3f1bb5a7705549f55568931c3fec26b8bd5e6d5fd072ab96e8e69dfb7b6ff838d5233cc1420957a5c12ab67a0a78ef5e84bc39760b866b016031c2616dd5ae032fb81e9d73a595b5c95ee55edf08d11e342e53ac3e25580258fd4ab8d40f000f4b568765d588042b820714f329c94bf7f0ac9b8aabefbe3b00e2d584e0e9a989fcf6a06dc978c2175aa52732e4ee46c3164aa7b71b79503f1c1e5f1a572b5b8537fd0b175288f758e9c94434d1705a6dc9863bc14d6559c3b8ddd7f01c7c951d1cff0d0880dfcf218625b5be9ae8769d93c173b38df8504f021c8b02181c2e93bfd8f874abd07c0061aecaa4b5ba88b0147f78cfbaa0c8e981ddba895b2dfa6a2e2fa9ac16792cb84d9b532f3f72e47491d94da3a7204d0fb9aa70ef0100f480734ddef496e3e39ecf1c7f92466a6b7f327591dbce8d611050f3544b6d88f0cda28c68f687c040503459a76264bba5633f3f8ba98fe416390c8c1e004143c526cf831ca66d6c402897b1afe62064d5517013872052e4fb015871e29a42ccec92170a6223fa14fd378b31a4295d0780d54ddeea6f4affeb5a1e80e50fea1e0567c4f9081a8503a4dfebd367b4c46fd29bf3dd4451840dc81e3b25f6cbc159e18601e65bd110f66e7b13cd1df0036fddf9f9cdb1e89aa5e1cd1600b6d9e9b72695bbb1da0bfd0b57876f32267a2090eb34cc2ff6a194f0ef0567d0ca86a9323c16bd2da5676c595b665a0b03838096e2e1dd22f4752a071c7bc935429f8019fabf4cd057dff4a005178e8cef240f80fe1e9ec48d51e8b78556a1af5eb7732f669ae89d2d5100365960e5cd22e2dff8cc564f4e0f3024413e28aa1af56a2a441bfdd8601eb180bf3f3e60753fa992274a508d10cb466bc6139b3cfe0136e23a3567ef235c5d664cff1ab62d6295989943e2cc8abdc36cf0b64244f9598e6e2e3393c4fda7301b12015391b54a5b5e3987ce0dc9a8c76590b92b33c175bf54622b738aea015c03efed5d15c3213d4472136ac6c22933f2c57ac73e370912be69d4a76888c73d67f8db33236ebe304e7a41ace177eb2ecd3a5bfdd56fd6640bf67364e38df4a3817bd762e5c27bc4d6a1585fbed06f8faf796b4b20f14386df11dd619626209c1912110a61c565601147914a597fe017e746e8452c079bf2d05b1f04dca482bc2cbe01ec4e0157cbd439e1c1f6f9c1b71c677a768bfd763767d79ced7ebd75a4cd1ad9bf18a7b0de6a248d4d629e43b622d9cebaffb52816579e53c8d315b2d6f56a6e84ebbe2e1aafaf7276285d1a1b19c2c250da0243e518e2e0c1600d470b3aba7dd90c840534cf71e155107278281deeb668e267fb58534f0614364bbd9677417ace2fcc338332b9f3ee82ee61fe904d1f89247d1d451c8da518da6032b059ecde727d56df61f49283a48652476a3e84f5ba5d5d4c6752f4e9391d951f359776242d2f540255341dd9d05285ba97b521a50a56f2b61b5942780d6c98a202abe6bd5bb28470ce7c5fc8969713236952249a6d6d445a0115d062010a6bb5fa051948983e9ea76f34a14eedf813486727639bdd1db48af2fa4566f02b62047875c505eae1c707f3d86c9c4a63e23dd5086e710343c8082dad2eee2b7d4684645f7421f618a08b6ad4f7e7c0ca6fad0c5b7c763d0eebe4fd396833acdf5518a0593560024d250be5c14ce670e48b24fe0f9a5e9eb807f6088c6ffae15e290bcf1395cb07bf4ef4e4db62bcc1474ec2a04e038a0a6e8200bdc3548874b9cac56421aa2145f750b6ef8e0ee99f001c6867c27b160862d7180434191f0d5e2bf76ee9d90ad576417f1008e333747606824090bf3c7a782a9affbe2e8a9426cd6c32f0b3b09ccec0f059c1a8a30fa02f9afe4f90928b8c3a34a5423341fe6273951757a9f528979a674f692ffbdc1bc9c30a0a7eb42f4f497aab5f040f718999a2c7f18885e11b3267a6dc88fafb6929eb01f5a47bd2c2520cccb5c22132a129b536826b701fa045ee12cce3d87c3277ac04dbbd387efad29f1b3d462804b0dddf8a868991a5a30bc8d1acb672b70d65e73f449130be70a17b392357f6c3d98736e9cf5a419b7448c2c8396f70a3e2d43c54eab2ecd28dfd9a3dd9900a0fd062c5a110961ecf3a6f07a6696a840011568993570e529dc51c852f2685c7b90718160a50506550f2ddd2ae21ea80834e2df5eb9b52c20c9399818a6d42b19dab8b129b96514ffc716e0207d0abf341f151e5f6367271dc7436a8a50d2a086a388f4236acb9f16f8fb9806cd3f096f8230b8ff98163a3f4d38a0bb52f2ef5b1cd404e428f82490665690137548f4a434fc0c01834089c7ae2bb61728fe23e82c42e5a5b88556763506e73dd93520a96f50d5fd1304575f5aa249c85c4db215d4c2131f957652a3a820a023924c0f4b0ffd3e0b48c4ad795da5e6c2557a38b9e17760711ae82b28cff698a810014f9ef9a77aa64be74e22c9823f84f3dcabb56bffde9b08a08200de8fa6f31c28264624063e31c1765caac2abf0bed0d6eba3893599830696098400cbd19318b8b13e240f343ac96c3d99946c5124ae2ed786a5a5d4c71d5d5ec9c0d5454769a899e5ab10b5d6e460316086a8e7b42aa4d0c5adfa3a546d9dec2c13d8762235fdec065055d16667706501f06393387f28c1666da9aee5ded3d51235798f029ef1e3a5b2ca63df8654d4f59b429328ad836b7c9163130b5ff3cc5483f8147db9fe02f5cc0c971884042b3ae76d10c99d191470765d60964be80c107d8c9511475b960f02046efdaebcf4670b66c12b3ef73c28e35f2d4c437f5f2a931571bf224fa3a142e06809d48452fd061329ac16a9b5b512e1a33699b3ef3978ac78472f92df8297e25f9146d1495e8e32ef060348e3cddda7e7ab6b4ab430a4751a0b0cbb39ab97f7a633183ee8ea7f0d5d95a4609218221fc4f99a48d581cfe1a89359f2732b92c46c86317f5f22d86bf0566864ef94d512a280949528fed081ce6b06c0e0a176b05eb67816132c8189f10cca3ec9e25bc13327131681ee77a08867f44b4497341210d98a7d7be2b53d7917ff7dff8e7a8497738b652c3e2a76294d097edeb7e26056ab5f7778c1e30044f2d717a38ec27af6bffbd834dc6a84d529019a021652758642085202f26ba30285d944f19b8f2dad25fb8e23eabf1eddd28b3702d0cd765e10e9ae85e6c677d609630e23e6c2d8fbb4dc3b1a89ec288c46e5b1c1efa489f35ef9ca2d69ec3198034b8921caa6bee2ac8e91c3a4638c445fd5441d4a26792a798446a47ae075d435809f0dd5d21014c50f9aaddd4f3817b816ac882d4421ff0b03cdc0a336692a37683bbcea21a625b3834166b18259b8d9519e9670a45c9cbe840123d7e670b11354f653b873eab307d14f40327958f311af571dae26887d761dbee7c5d5aed52664344b3f1b4a24fa98d782b3eff40115f4bf12db32cc05ad27ef23cadffd5efa1c21ae33e4c1595c0a779d584f6295e9e68f5d685daeb96f9b40eb44971f47c87ebf584a7eb2e85bd1bd812ea0d70fa7a478fadfb2284fc3e83a5393c33b142865cbb1c5ec36e98bfd33912d7e4825727b62ef39c22f619d3df61a2ef99221ed158624309c7ce8013da7f8caa7a8dfeae29d618c0a02fbfe63e6daae89c56b7e966aa7af5c57385100884aacf71f38a2c3248fb3d35027b4e6fd2bd18fbd24031b21f52ed602af8333d156ee69afedd59f681548a2687a8d4f49bb764c431fdf89273ec1648441c0e02d539345a4ccefb91cb8a6b8fad9f76437b5be6b804789bbd7270d5e05d43a7905d084554e6bd8aee8b100739a3c2b3303c107019117f3336ec01c9705c60b11df9d3fa82cbbbd0ccc91b1a92b4808af393d4f7d4d8450e0927883a9591a31b76841d882746a97d71fb16acb21beef9d0abba913961f4dd7066d9e38cb2000f578f8d0e9edea67b979fb4a2f903a515841c0f3f8d3bbc1b92b00f2478d513e062f446b53a938d39231e9635c26f2c71ce7bebec061749f7c08d4f656d1675ccdc480aa8fa863038ffdae98f5dcc8f01de4520f8cba5f3cb8134881977d1b41c082c4eb9df11427bd7b125c74d2cd5187789176640a230176aa6378ab71b44cd104f78ab575e83ab1193eb0e6be00bb41f3b539c2b39e712a3db28f49341399fa264e1024b7eb8e8d75b2ec3ff13c52854830bea5529b2f795ed4fc6212cffecb48c4216d728f83144a9961a5809842baa719799047a1dfadbc48a933444ffec3194f455a1c2b55f9993bbd8482cd08c25607406a213840ae9d2eda58d75579f358d9e5c376756e56048f610545165da4355c373d3957e908749573c180414eacdad3dd73eb17fec14db2abf03c3e05e054a99462f72c66894c81e68c0cc289e09490fb967b10167eec9cb8060777055ce7d9f201f6e60b307027424d42fb740b87d369ebe2685c8b91bba2f21ec080cc1a64d3ef393643d6fdf6567fae840deb4ec1c9e37671e86076ac0d7b9e89f38710688f330ea1a46eec214dc52d8bcde5886b6c3bc04bb411de8252c59989c3bb10bc5599a72869f04e47b4fccaaaa3a737e00141a3f4b4c3fc3bb0a5c653da02edfb87d93e7dac1daa3a1e7df4a4e2389920840c1517902a71be2d60d34e4d34bf7da1dd159fe07c06085a1c5c2faa845b47db15e0a248ba059854bb1323ffd614eceb5524a888915d993c5f6c7b3d98bac7f795b57ff925c61b6e11567cdc2a028b1f62d316801fd2b28deb49835a513cbed4ae14dfbbfc0963887968718bb4fb8dbde18ad6d302cf0b48cdfe64e6dddf4b9d60dd756d8d03f8c747c13bdc0794983251d4392bbb51d7f71ce70c74fbb7adce0f9d6a4f04d05b2252bfbc38fd930ab9d9938cea56af2efdc666318465e94739e9313134c2221af1ef23f16e8bc3f7e4d410616887a2cb00df9bb6203bba7fb8c21f7587cbdceebf3fd8990ead864a0971b5b5d0f2df4e47e23b963f8042f08055739f1e2d699e83182e7b6090745ac34457d01f0eab73ac00d34486ec652ad6e86816342bb45e11cea2a01b30a67219793231693162e323459eaa4722772a86b7a0e4df05414a82621a81405d9efd95fe98e45b5bb9f65bd7628008ad2b7d3d3e2acdc563e49263cde3c02b40554fc4a9b7a85234cf01b18dc199ceac2c4a5dda4cc69ba7160e44c70aa61fb0aed3903c70c1481017293f7b911e50965c9bc0104a89f207e926befffe80706bee0d7aca9e071d83776ff16289e3c03c0605c4aae3b125e570b2a2584cf08a2f1bf3755f90909f729b3674f0bc0162f834e40213c44a2ca0aefd0c15803d0fc2619a93c99fcca16b766ff72fcad95311463411b4fc7882a234c09a2021656d60606557c243c9253ba7c446d9bf4caf24f8c8f1e72e021262d0316c8e7fc60446c9a08938cecbfeb0014e6a952ff4ad7ba885abbf803645ee712b6070f757d19906d1fc892a0f93d8efe6ea15c69ecd8b203b18b103074e048af4d3114290cb717173d40c1119eb4aa93189dc6b3c3dd4b0e94bd2edee4225e266bca4accc01df5f4ac0c826caf28978ee7c15e5f5417ec29c030cf86fcd07b2e973e1ce7394c8d1984b578dd44b2f10c78a952e189031a814e68096b206215cbe87c385ca38436812320e30dfb1ed5c2b46d59362acf150186056d76532de0dbecc3614f6a14c34ee8a0971bce13ba2334afbfb1e4b4e660ba8af564508b8b0c1364bc38b5b59ec9b4dc56d8090248016247147ef3bdaedb6c3d63f8fd7342169f5074b1b335352987cd8525816aa2024d1a1c6b2d01ba01098f728386813aafe8027e21f81852ae5f24860cbdd0f3f2992f02d586c181a47c5166fb3ffde1070dffdf0846adefb9851b2e2b3efe221616119bc58881c4b19cdffa2f017fc760b1a1e8492a8d1710078460a34d3e47c12b9782296c4cb010b773d3a5822dd3f2ff8e47c0a9325c5dd15f5135478a9c8ef8eb42d54b2724eba1a646887d148634f602f53d04e5c1f47e1f759f6e581a2b2eb0240ad9a0970cf33fe2b6f4d5a4259b1234930c77a5462805240d3c8317c0ab8617bd40ad4ba73de220c527507263aa344ba2434627806ee422366d9ed060678835a63518e68b56a88a71a248e3f60d55ae3263014e2638d86c8eedd8dbe3dc789e21596d13b5667756d4c2289e9bfd99bd67aa3c64688a0059ba9ec88c276e62595a3f0b44c5d1d7b71a027d6996ec015ecf0d45378085130be7aea01ea12a4ee469255d76aa38bd4f65a282761f01b81b82513646b1d55b868bba7d902704605375c9bd2e22814059403e2db739b62831dd6e3815058fc154e1360f5c5f15a1768f6be7e66a986081d97b28ac19d802171612e98a7b9581f6c33c0d97f2e205d1f5bf04f747b5738e9bc73984fccea16484f9c44dfec9ecb5ff8e7d0edc2f9036ca3f821b4a3cd2601207c0ff3e6a7fdc48cbf0361e6cded2cfc9ee31ebd8da1957a8d8488cae3f5df2b6b56eebb00349a86b83b8c89486ab923f4914a2042b559f4b85fc980684e56461c754d661d64a2050435472f3e01948036b772008fa7508f2ae127af50d449ec22d9445a3a814c0b4a2feb40280164e2f7f9de115cb6c66b2a6ae6a5537a154bdc7394c7e68aff4b801d035457fddcc901d743f04d81c789f0a84cd45d1a36e0bb2f211661d6ee498a9aa92e12e4a4e78f766fa2e41ecc14a4d3cf4e1aa6a94af661375ac088b59c60ed0c599df434f157ff238edb7090e77f25d09105409f62a212ba3c778db13a536f4a6a00b0df7c5e42e3cc30aca2368a92e33021732c9b841c1cdaf4bd7c410373ecca70266dcba0f846b0f69a3594ae0d53dfa5dc78e2a9701a9238ea6dfbd1433998132862eb1b3a26a5c9e68363b5574698523983e9fbfcc363a719096099a233f86f8271e75f022b5872faf70917d6f330df8772e83bd10994a5ce2500585b4998e6552c19b25a63b86cdfed7318e9351e7899c4a50839486f4b9a8b2bb324d1f0423210626efd13d8b8feecc7c7477def98afd1920820e63084e383d837b7af09d70312afe2667bbd1e285191d40e862268345330350d326246cfa285997b27e56106109aadbb2ee84587538f34a955b4f58415d155a177ba310e57931ec927a64cc97f0f64e59105858d6effc23f80a81c743bd58855d1bdea8534675417d67621aad1654ac3446c7d5f4d4838f9dd03c162c8fff60745107669c3e6272ad27a9038e8effb1515b26c19f1189536e3d5fe672685a2b7dd1523002ce6bee881e1d57e94146dc8e1b62629142b1190a848cd3dfa5d3f2262cec7b1c21ba597aee2196af6216bb0d694908905b7314e41ff485c41465c286092af1dcd62eb388f09673784efa4658578192c1a7b8d12bfb1aa1d3166432e3386474b20dbced3b4d5024dcdada070df1ab5e97a67a727918b234e6e7257c1b9804216f844fb18a190003487e22cc7a6132ff4e0318d023fa9a725956ddb599e7d939e244b2c85df5110469a54762d340317f379910b827a1f817e636d30e4015f708c124917883df69b6f7f76ae52111bf8fb683449d12de24b489f9edc2638f158c6bbb9e13ff49a8de6a394c0638aaeac063ca5e3f0b8390a5529bb8bf2889a9e3c39840ed9b880dc93ce39a973efce239cef392d7461a45d08dfd478a0593736c15440285ba55ca5c6d7dabaa0a4450974b591a32c799a2bc8e5f2dcdad53e7184d4f7b799481f8fe95578778d4161ed6aee63ed90e0999d906a77f5a3f5ea301220ea1c725ad32a239492d8d4c3df074c3aaa0855520aced441a607f811871bf7df8337877080caa66062b7c525baf1a34779e421b53959b941199d81276171074d4135e4235b488f4c7a750942be3a9201462205219194a7c995f0310e5374ddac9b56fed515445553d3195be34b94df23c4aac01f0e27905500e45f2eae2343cd46f0215e4beca9bde9f875c8a37e446712103667b613214df663d460d198c6710a62c428c14b0862fc0d26b778eaa3c5c56b340330986020ca17401d4ac091ff680d32ea1de53904a0f381e10ab652b2922cd766dee0f13b70fcf9bd22f4161f205c464db27828eca16397ae2805823a19cc2750824ea7d69e2f2d5e3b07d4913579632daf6e318d3442ec7ea015d676ba4407d7ba806e3f9e3f30f97940cc64aad84e3f6254a6fa9b5dba0fff220504a83fc1f8fa1731e113fc77c55c68e9a930442ab0659a6044c383fc6539d68d03ffd27b4f62a92e4cbaea05832bb8b6d6d99590026111f20d8f0a31202cf631eb1aefe800ef8a32e3f0efea425c9e147010e1d487a63a8044dacd7c6054a32b8a2292d46fa4eb9e9282eb155332d1c3d5a374a1affa4180fcc5f18f402fe0b392567441b56a024cfaa41d6ba9701d49e99ed7b3660581e2a7eea04218aebc3543932ce112fd7255c49d8f7050c21c0109a7e894471513f5ff3008478e79b93f5ce3379bedc1da3f8b48df4bc022f202f4ed3db5c341a48d6ce1290b4f12aef7447e9f9f3810506d3293b91813680c090668cb32a41e79df6130608e7d02cd356d9c025ad80bcce91433d6b9000c3505b70ff84c1fba8b20a039707e0f14e30b05f7c7fc79960ce230558f08c0e3fab4b9f65f786f2b8a54e753d015466d1dc3ab1b9c14afe0a1e502756108a583610aa47800e299315b4c8b57ef5367fe784c74f26a9da6eaa98fe823a53ca74858bd9d91e1625ce1182ca0e003ba99ff985e6e31ffaab2a42c64fbc79f967e1085d64a288346b35d3c85c7d306a70c299cfd161beb2de1a411fdaaa5868d608f2fc701c52c8f0ab01f470f80119c69412a51c272d91e89d5164b1c68ef8a3ec54b0f1c5281aa55395b21248c64a0da111b66787db9f60cd008ba6911b6e0a7cf20a5d495a32eb323e2271ab69ec2c311e65d4299f9664a4ff4c94878313000721493a4f310294b3be3b146960223d7bff5b5fb99e28da50db50f2aacf4120c7213196d13c7a54a81171b96a3d64329bbfaa982671857bbad14584e7cea2ac68e7597f163be3d99a3592327e450309a67ae008a8a61905611bb504a37eab5de100758ba6949e06a58de6150e55548e254ede668f58c91e693b14e79d8eaa11c2e0421ca61df05cf938d7134e383ebc7871ae1a2c58c2f5517d87b9908d802e279e59528e3e537083387604da3bf35ee154f321e43a6140ced63af45bd6fab2207e6a0fd763009163901c729f0129c4a1e2b7a0579eaa28195780fed4dd0026cf0c7a67b6d1609971d3cd126a3383aecc2ddc48a8a982898cf098cb5d42afadc1c4a47c4a2663b57312932d7f32e7fefe28c72791d3af9f0c047b893cfa319dde0b3cdb8cb0ceb0e8cf1e0b95423e83aa95c241113ed6a9ff261a3a9d46d7aad76ee6de9c78983dd6ed30acb9d25cdc99c5a1be1e2a1f0d9d326157de829e80b2c9e115095b3373654f0f1f2c79ab2ef14e286d3971a03265587db68552bc1087b51668b4f73d848d185fc6e3e9877d9cc081aff78e1dc9431597304988c0a75f36ee5120144305f8346d6357900af093c6e46313ef64d50565092d11e799144631acbea0eee62230036e3b3045717ef8bd6aba793775b9784dbe8e111a7d2228bf51a1074f884cdcedd2b02165b7798e4440ac9b23f17d56c13c27e1f255adf03be24d383cbe1df45f22b13d7195d062681e7eaa0e818fc6b77a54225b72e12d3955f1ac4cab715d0953c378f1ec60fbcd96bef90a0e3aea78f3045f37274b62e2018b6f00c92a2c6b3ff6ded0367738a71de53239809f3e989849f4fe0838b95794374faf94e4c057be487c909314e001a2ef65670deb9baf78c6033782a6da2142dfc4ac579ecd8954128f9184738183e24ec0669f68ebfef5d45acf0c55d8066f5a9d90560f0f0bc2bebc532cff96fd60a0871fed64c6d486fa80577a00ceae9e0970befd704202313bef42c5ea60388220b656a349c33043538b71ace4493419f74ed7c2a856fa40b343863bfeaabb278a9476f002baf0661f307ae1a0b54becc819be74ee85fb4acf3d1b28258816e790b3df688836ebb6a296a4afb9a83f09cd605dbf1f6fc69138d630b6fb0ed7df78684ca308f3e250a5e5b2dd368de117e2dcdcf5a7085cf131845d52a93ddea3d9c5e5c3856e6edef39edc4c7c1418cb18f36842f9a14cb2d9ab4f76aceac7f9bdf5b265db42a40fba1315015df3870b9c9b72cc594a1b0e388e15189061c836ae34c82312c8dd7d60337f1a525359b2a6a5814e945312612faedf35d1f31598e61d6ef6fec051531e19499c327c86767f59c9351402cd2eb9b3d1057f517947f2b48f8e29f60cd6e0d7356decd5ccd2f8a6d78236a57345e217cfa010217627f59a984e7e22f46fc3ed44b6d782b7c0ae1b62dff37b4f29e90a4dc36db46059ca6ef10ca19a6a9b165abdb619e8a6e88bd714cfb1794f455344890db922610ab85a4f51b2b650d29d040cd87b9a641496a5d80df6061ae3c3ea838d2cafd7c2efe9f6db320c160c318a79da0291fad37c653f08bf83dc460de309f3678e5546e280fcecbc925fc078c487f52219c37721d8f8a988db86b875112775f07b3fbf22c916b9a146698c0a2440382f505ea43de230c3dae864bec3e5b936df2b0ea2ab2ee9f1f5a1db35cac543990ba7541abd46428b554f1b48e60389352702dba8cd6933ca96cd51b58dcd02c17241869cddfc4fec42d5e58a78bbaa19ee5608465bfa2a8d1c84bd89d78e270c378501a69bbae83f82485fe5549e321f445dcb2b5b3364d6d3e76a3bba9d0eff6723c9cadee792d6d4cc018b2da3c0923c33c3cb8d6700fd529fdad01b1e67dc6ce33c8696a081fc88e7413ada38af2538c48d01dbd536e514b39fc792617f254812425b82f81d5fc38d10308b34d54d5f33df66062e6f465b17bb111e699028005802c91a936982d70fdb00bce4f47f69646ea73d83d5aa8c5c7efc33618bcb1f3ae1fd930fac172b52463bca165e5a4b6254358cf264a8d0b5c574cd1aab2a363f83844eda4ba41b860bd58f9aa4c11216c8e8c9a16a638a5c44de488c8f6e6613cdc21cd1bf2e729970d8670a72e5efd23b598268b992e620aba4245c1c77c3960a6c417374826bc4547ec587573613ae6f7e3051f4490c1fae56c06e80f00155142fc7d3753a155b56dfbf190ecda9f3fa2e2573595d24de7b441ee8ddc0d7e7c35aef48df8242e05bff928b6934a03c8e79cc6d762f24b1ec3637bafa0f3170290203fbe806633b351a3a514c13f67a94245d8f7184bee14f956494b689e6034f616d49032fe7fbcf2d9b9c324deb1342e8944d581b84e7bf9c154713ff6f74c1b8445dd29dcd1110c243d277622e95639e08720b43dafcf82c29122767686d82fbc7bdf6dc58960473c0deffe9e5de40054217aa761b147be64a3ea5fccc2504680c2a94951a54e48eb68229b53521b91665f3f14903a9eeb8458043295dc7c38cdca52c48d8263161fba31469a85dbcd1bd23a39be57fa4226e4dd09211fb482c985ba202043adf62cffc9afc18bdb3bb50741fd6f9b456a9084301f15be12acc8aff89a376750437db0d8b044778fdb4ce47a8b0196e33ffe43ef7a2b1da333343f7f88a6807911a8c58fe2194bca44c5ac1b306fb0fa8071b2214226fa74d4d2747df8c65242d085b17e9741cbb857d2bee7e4c9d3a58aaaf7ffa10b47dbb55a9f69869cd4644ecd381cd92cca1cf7803d0d3a12e7935a84a957b8be4c112853e0531008e7666f6b286c3ccad03d4b255fb7f35ba30c1c25912e5f1199d5f13b503a2f8138c60bb9f0dc174abd4b0e50589505c5e163f72454c697a901c088ad7fcf1093ede25b2d9d061a2013871af05e67fa47c76c1b6d82687681ce3c1fb5d21b5435890cb0e6cc2133ed01ac0c98d2b92b47a8d00a6810dd6696ebfdfa102e37822745ad04adc6134368688d4a87c4b82bd47316dbdc0a4b3c4108c6b8038b57a71a326847d317c3067eb8613e704386bd377b808482d875c21fe4cff2a41276de88f9822fa5aa35fb029cbe4edf16b847e038a8abb896a68e713b2f203c2019a05acad18dadada8f7c96359af0383669ba49103e2f5b3581016eecf3cf573077752b29f43b894c266a5a521f6a8c56318df8da26487394cc88541e9b663ac49a379c4819b89ff5e57f50e3c76e1c1b02c1446ca4b5a8d9443ee80549d0edf1009a263464278ae68b69902993abb4879508c9653e7793cc99327e876236ac5d8f54e394da52b31be3f6a8ea0ca8f8c9351b6e85e352a9f8b834fa6d6839db58be27d0fcdc01afd78e08673c53d930e23147631fc7baf8be4e0633501ea34f7e5c77e6ce94057b84e34840b816492c09f71e6b39c7f1152a0a3056633b9217ab6854b4e2afdb4be7f45c39e2e6addddac8b0c50b241e065244d5dbbb39a1d71e2f4013598d92442dbed6a898254a43d65592f65327158d8a9456aafa105a28b97c9092ca237355c70f515521455967d4cc7451e6afe8c4d8b5f5a4951b8ddbf4f57ab9d222a5cdd10c46749216c5128810413b94f83ea429fa298e71644cd618f33be19443daf9d8d91135ea1fbb5be4ae5cd8b8361325cf7d480ff2c5109264ac4771df9dc4fb407bb4fc897dc3543a57ea915d1f98385fccdbe914e7e3dfd110f896b7c65bf523c1ab284724d2137160ea96a985f9ed2bca22a6a9aba69181296d72f57c87aea3942649ad034a687ce13ea39c8029d5142973dfce2ba5d64f3c6f5a3ebf9936584017772a2910c87cbcb84ff806c7fa6831b9efca3a1267438c1fc588443d097e1611e2c27f65cd7a7540f7c9a067edca37bed5e55ef6f9da7368da1b1dfc0f22f565391485143460d4ca222a69cbd92e636303ccea424254e581592b595630881f7e995f3403ed5993bec46e57129ba794f46aff834d653fc92c4df46df28f45d8b0b2445d98caa00992eea21af1b623d898ede84b4a6082c4e645106582bac1c9d55555f4047031fb8df804212fb2771ce2cf19e9ad8c8f59aa2b9ab31035c269f1120423444b9a87f3fe0f7f0c872e297202cd08f8f3b540dbf404d5d9a05256e89d66a2be2deb48b82c95c9b9e4b224dc7c0d064c3109cd6efbbf3516193688b387d4618d5be77d30a9c0c76f40044465beb001c6036b900661fca26b573c3f8d074b15e98dd56b0e1acc37090721625ceb4379c25313681edaeebf8d86e1e67740f33cdea8226869296c232824f3cfeba17660fcd198179bdbf1c49334b7e2aab09136e5cb5bf33c4fe6e1602fbbeeb5910e184570a05ddd88c684926e0f3317e9244f60f835a95f51df64a412233100b145884367b8f9e196f1377a7235fa1ffc50c5d7b56069af2e0f2c91534f0db92f84b7e4463f4da025310a78fa772b68d9ab409160e008dbcc15baab75424f328f5530480e1ea4c915a623ebb305dda5194722aee63681bd0bf6aa497dac98c652edfadf9d6bae4490635d32d7ea165c85d9c781da0fec61e742a7c9cf2c0224681c1ad5e98e4f1dce2353968290dde2303980a453fa535980433e4a5a1c593b2619df9566fce8feda5dbc0825712c35d9128f946129bfb0938627f7bd1a867f76f06cb1d3af89aca20ccaa65dbf7b6d436aae8fde021c3630bffea069901361c68b894a55bc6f3a50cf9d73c74806da80fe333164a7eea32180dac290ccc517aa936903ca84c87c99c5ae88344dd0d690efbc389f0ca025123e884f2910eaae3a6e84dc01f3141e2a0fd8c0b915d52805bcaea15bb7c20d4a61884eabd257cb8c0a4ed9c6b8232316f86167608fd57738d45afb47a239d3d7973ac6490e726674fede640c85337a41ceae176162a19998881591f7de5daf9f79d9f01ab93479f6087db740c5b72a78bf56882270310264bc914da3e7d7da26a2bc633a76d5e1a91e6d0c761745e1576a2d6289e9c2095070d231cbb5114d11c9847a7bb3e7776de7b83cd3478a0a89211d7cd77cd132056873c4c046e363e4544c9a3d8fd9d1179af9a88a1f08164c6cec6e1652de9e22ab4c44ff67d2ed3f8aa39f846f1f7b2a4148df0f0aa613cf85bbbd11b31a8b24bb711f458735928c0499f8963dd3192c0efb9a0ba1d59c008a5651d21b14196a28e15e9c3bdfda4c9a22d5c5b44822fd4713ae447d7369d15254e02f1c1814ebe29c44d6dc3d4d75eb0983a6c88b1bac8d383de01793260f35054a22c6ced75e992aa0b0aefa59e29b41e42567a4bc0fac0b1d2829288f39567dd6787d3433df090327d62e9636c3aea86037dd08f96f01677135660fad74987186ed57602a636a8d626dc4c8fdf431b036e6904c30acf2625976655dd06d4c111d483fd667d08dff1713178edd42070c7a0f29401a1f63d1c468680be0744e5447146739a86322f538ccdc2048127a957f437295af60fd7521bc681c56c17202c93bf33ef70e19c33249d5f39dd697232daf685cec6b50acc53fa72b73832f09af4ab85c8db3ba72a58d0f790b67598493a4dd1e97e3f4bc96b8a85051f35b38d636f9c4142053ebdc8f1945411831033ac7ec406cab8b730934d5e114159d1cf7de61bf2ded72d75362228d15732322fde735929ba4426470cd759b0216049da4dd7b1c0296f284210ab95431758b57923572929840da4a8f8e19ca8e91a9bc34629194c242867e85a28c6b48ece744353cf217ad58e9c24a631168a620cc5db1e2160326cf870dd104d1fd11e93d80fe9246a1fbfd92696c8cd44a8a88e4fa8a804637be78fd13c624ef502b1102e3a577e87eec945a2969ff848ac4e5c5d959639565088d0ac31e85d2dca5e695eea0ba1aad2046b7d25b3a55620c77059ea67a994cd6652e578ca4a9269e6e9022eb4b5fcbfff6262331d702b77a39573a6538a71d15faf5581661ac43160ec6abb0877b0196325ddb5c77755c3a464f1f7556f08ccba4182c60748cd83b3b60b8de59fac6307edac23c123143ab2968f7117aa6709fff663e8f2c7af04596eb1d5884eab2696bd3ee51c51929b608ebb39875bca48ded45a9edca2955f9ca42c847d896044708705e1068b5dd279e42e9b3f15a493cdb11ffe7d05da49bd594e22dc32900877fe70ddd57859c1fc072a7745c7ef68b0f89c636ba96feae8c287fbd36eacb9e10224aa90eaffdc7c73ad0985405a12d3269efc675dc0a404dbf79b039a2c36e489cb8226c3a21f904e8cf5f16bf6e63d6138f38e90885b08934387b1f545ae7a5380d89d127a68e1d8f9d582a4812980d213230aec1726326885d44890ec5a066f137b2dedc047daca66340d2f0a7104952fd8fbda9e7658f56561e8cf6a5f9d853a92c222927da3bf7a8425b19239a8558b5cd5d44735b92e0d2503befc08f93eb56140099683d0befd2a64ef231198f7fd678ad2af5c3217a8d8574a9dfd6250c8003a53b5781f7326928323e7b8973dc86aa3013973866c48a938443778dc464584040e12dfc36fad1811f92dc7981abfd02330cda7993be7218ec3c4d9853b7a6ba30af4627a88a798046b9d6a4ef8524eb7e14872609c73ce6727619bd83f42343429f91d82a24529f771be975c92205163d89d8493ed15d56c17cb1ee33645dbc6e5a4f84e77b339bd01e8e67efe5dbb088e5076029c362628682251d959eea02ea5fc038de2e7d0c524d8534172af1aca1124ef68f01b66d6071170fea31c280f334326f35621a071877d0a3b4014660a42c98367931324cca8148aa6ee9d9adddf189e0694d4b00625b020ae72d2dfd7080ada34183922d819b239c1b17e7393ed2a2a82323ca31bac485344009ddca5e4788283e862bc240c8c05cb8a8fed853c8fb2a45388ec50fe221fd47f1e48f76158b53eb7236e68af774cbc79d85423419d2804457c55dd500af8b77bc918e00060ae9be51e1599c6c801c0032ba61ccc591fcf18d26a7fa59726bebbf0798c78d93b4267297ff6ce8f26e658090c15cc8a665774507b1b560f7fd440f90888c2a3dc21a0da349b04af4e0e4a286d0bc70141107942d464d5ab7011c11af5230426ca729594a1fe0e57982ed328b47150eac46f0fdcc019cb6290d2e148d87240f26bbad4034369c36cb2b0313d20c5e9b6b75d159e1aadb048f0a20cdf381248f7653aa0d38fdc6a91e3132913f1072048f56f6c1bfef5a8d33bc0547fc28604bd20a9522ff5e1dd469ea2d3c7e42e209ab81a35f2700722a75f0dbda0d7d03501b3ba5a39af7008b41948d13f9f6fe55a56e1a27f471fa5d0adb595ae4487478c2cb2acb8be0bb697cd9c3b43511040b215042a9feb690c04bdc3b160e992842cb183617f4220484e199089d30aad9c2e660058953f33ec8f59833aa447b6a9b519e6a1c5ea2aa7bdc6bda675f220d408c246308f352139390bcbf6164db7c9ba395fda4253ef85ec4a9ceee1c256b091f82723989d02a9a4d5880a7c85d397ef4caee6c379bc7f7a39902bc2a03da5286765a30d6556d0ef921e45457d317e8db8a8a33782371b8c73a9ab49fbca41dbf616676ba833ad834c97b7321e3f199e41f7f518641010c4cc7e33df7e946d8206682338177097247d8099f2ca6c75a4bffbf576d77edcade52a69452190743071307e00fafbca356443233f833a4f4ddded5e1993770f711a658254fc0e6ee67811215defe7215bb3bb372777f3766b94ceeae7497ef60bf8b524ab9bbcebbbbbaa96ec21e0bb3650645fe0cdc0ee7f2cf75e7239b77c5102da54f9f9e512a73b4fb9c2ee522619353eea9b43f1ff3fca3c0155774b82f5b94d894db41bc1a4ca36966dca5cc04b12f7b3a4393318ab1c570a70e860423c5e4bd945cbca6a5baafb0b0acb4a8b8945e3c530a0c124c77e262b6182319da0cfad987815346ce384dd3d8adb12c50d8b89dca8965541b6d5c474af14a53a55b6169717931c18039c5c49031e33f50668686460daf412324cd2535386c1a4e23b763814cdd4681fb8d9a3192b1c5e062ba1309260586672abda8b8acd02a52da2896ba8d5a71517929993c182930a413b78deab651dc366ad428adeecba75f0662327346d2388daec1dba8b0a6068d9044e9ded83aa9c8a86b94a6ce542da33db8d4969a517045e05bcbac1b8dac1b0daf5b0d8e768d3024390fd6ca617146b36adfea8435eae634ea2669ea4c1d7d5d0456a753c9d42d03eb46bfba695fb7d18cba6d32eac6c5a85b175337d2a96e293075f360d4ada4b2c2c2c9afa5d22f070f68e0dc9aee032ddd0268cd7e6b61a99bcb8b4add4ca5bac1f0ea069352b713a96e315ddd62c8d8ea366354b7d7eaf6d1ba8159dd646668bc6e346a701ad7ad26a586376f18922428d766bee658633ed876465471c980bfdfd28427ee92da1bf8d1bccc37e34275178f101e154f4f75508a6ca462ee38aabfff9c1dd89798bd0e4e8adc3fec37effdc3c0d2e77d38d6c659fc3b85d47123aeaabce858fce54ffc0a1f12343ec60e14d4a811fb5cd5617758e2237be38abde1b5c88b0e270c75910431a4f64f171e024e0be0f7de03c5d30cf5e5f979eaf6bb6ae529f5bc5e5951394eeb6ca35c8ed323f53c53fff7e86d025fa4d5fb5defbdd3e1b5fc6ecbefa25afee5eb222c4a3cc94f5e9ed81b33f686acfdaea451a517e2cdfc09fbd5a1791520c7e1f17b91febbcc78d124e3c5180e44f3cd7cda0f2b08525d623013149e687a79f1053184f1e2c3bc683abde8c5bc4847c7d97eb237bcef0f14e983a2370394018a314031146f6240919e6040d1040334816288816203aaff0b28be5045ee71f944afb67c22d7cff2893caa5ac3beaaf6f3fb441b558bdaaff2953e0771ac4df69e3d0dd977f629a0781376a0f81c98fd068e404dc98c2d78a203f9d828715b0e74848646d17cabb3cd7c36ec8b0a4a70a27303f7840552d0e181a4616dfac56dcd7c324ff3813cae4d8fbcc4121effb837bada40a3c78f813ecccc7c36ec121ca218a17303f7c4053d3a3cf000e6c3382b031ae5e0c906768323a7c376a0ae3ad8ef329f83deaafd33094f742015d7778b15986f74733767efceeeecec8936549895118e1b13fd68008f78e24dfd1c18fabc659d0ef639e7d4b2ec247f6a59e612e398ca1c769adce9c03a06cc9c1c6767670f2bd7e042e5bfc921c20de7bce0e0f9f7d6f4c8a536e9fb899d0e1a50c03adc733654d187ac3c46bf75f6f636f0e86cbf75ff823c7cc83a0277b217b5ffe1d58704db63bf1d0d1b98034f4a27071b6e88b2441557d8a28b2fa2e86c1f844767038374cf81e04ef65bf7f3d93efbbaef064e8d2b550f9013e0a093c346d1e981a1b3813a6c1fc4037582200d7430e904d99e7b0775a03a41e812fd7c11844913246c81073a4178d0bf819ed7ecbbf0bedaf6863305a9d7f4633c4d93c5ff28b5a150fb6396083d54af4327de4da723632eeaac81ab58d6ef42ff4da3b2da6f010d348e0bcb4677864d2448e8501b4aed9fe96c0af3b584a90929072ca40c2501071d569d9039e79c2d3a08e209ac23f428a184ffa089ce082d904770ff3f83444a05331d4af9b2b999313b337b561282b24fd91207ebbbdcc807b749ed7724823ad2b82bb4e06e306ad984892d336fe63cdf677c4479347afa1aa5bf145c538772fbcdbb29044fee27a94b29e709b6eeeee66e6e83d2dddd726eeefca269dbddbd674b7084ea0474b8dd6e3251eaeeedeeccdcbdeeeed85c5ec9dddeddddbd8b43b36649bb79bbbb49249725db2e3b499ad15c4e78b35dc709c32c78fc3e6546473794a425a051fc061840cd476548e96ba411cd1947a42da3c16bfaa90643aca96118d2e0386177188661b87118d7cd8e449224df5260b4e0b1c7a5d06bf80baf756415c326a5904861b837765f2a3decee6e0a148b496fc30edddd5dbabbbbecb85dcf4b09f906af8d1c7951c4dddd5d3ae2dc9dc30e97e5966942767757c8ba2439fb06c5e3f7f7a234f5a2ecee968268423c7eb9bb2b6feaae208139f13453a76c395da6f432ce5d0327c66525d18577773db051bbab713ce2e4d6e9f08dd378901a0f52e341ce154f5d4b75cee971efb3ca2e01b9d178901b11662db029b1239826e82036b149334dd326866529cc2e90d8ccb22cc366064a99c5c45cc0ac05867d180c9a0d674d05aa7f1bcee7682e90a3476e871d76607f2db460d6029bd8d46826bf98984633b9438e2f2bb225895c4e5e45abd56ab55a61af71a6c6711cc7d9335593c85ccd9f1596d56ab55ab5b88ce3388e63edff4c3060604ea798981832a40c19de2c43a5cad58f64018532e85594ca56d84bb624919357110c98d56ab55a9db017f6c25ed80b7b61afda0fc6903163c6fff781325246c69b654af5e5524a49246bb55aadacb50adfe4c91fc992407294413266ac56abd56a55fb653e50466666868686460d59a38637d7e0461ae411a5dc95ca5a5ed361f86f32791ef5222fe55553cfab4c60d6a2592bcb5a58d69a594bf6cf6c34346870fcd5a0aa1a61b723a4351400120000f066003848531da654154d794d7bcb89dcb534e5389445e9068a9e8945532c9aaafd3494c5aafda49ac3715ca51a55aa5135d270d50d3cfead06d5485d8db1ae72958a722c7eb1f5338fae8449ed97ad20251df6e83ee510b51f932b2989d47e2a876852d3bc59932a0c73d1264f6abff61a6d4d3a6cd768c4e28c28a9fddd484a31d261b3523a1d9e2af590daafd2ede0faf5902bdd0eaede53fb5980b4c896166f6e59d0532c77a9c6209e285f2f2e4933607ad53fcd6aa01e3be83506b5885cce4a752b954aa5524de472f262b1582c162b954aa552a9cd5361617915a5ba276c2263508bc8358ee3388e2a954aa552b98bd52b168bc562fd340b089bafd7ebf51ac7711c552a954ac562b1582c5689c5c5b4327210b798c8e5641cc77154a9542a95eae52aea54f7b46a8ee3388ea34aa552a954ee72b9cb5dee7297cb0b07e3a4c22a4a8457fcc3cac0388ee338aa542a954ac5412d2672491fc7711c47954aa552a960bed25c39d917a7e46b745518fe9b4c9ec744f8a7791cc7718ce1ddd01c6f3405c95706c2f0df64f23c3a678be76aae56f295c917265f53bea47cb97ccde0b620dea7d495d784596f3973e538b345a9e7995e9c2b9f2b057475b67e668b640a3bd28fc7dfad46751a966ac016de4aed0d7f026ce179b7a278ec299e6d1bc5cc10c074e6f3b73a98b93bf98d92ae739a80d4c15eea60a00d37e84c5587fc446cfd3d76e58e8f9dacf683c07f27abf27f388f730ff6f77dc6de869abdfc26284a0e788b1cd8b5913b36d4ec37ce9cfeb61f077634907a4d6593d77060875b9beeb03dfeec25c69c499e3d98f99d411ef26975d0c11f5e9db0f50cfea32ebc07f070b0035e4f33f0fca80b4ff2343b6026a45c8c0bd287575e002fed4682133ba8a2a93a415463ea2271e2486da26b2b69525b0993da1fc3fb1bee7c80a776ccdaf4f3be3ff626de75ec73233513f7b11eee0df01d5b1ddc6190c7efd3d30c3cfc29e8c32bfdddb1c34f2918d3616f1c7ded4591fee8e76fe536d034da3690077ded79d08fe9b067a0afc5e8c29b4f4151037964cf5379d06f14c51eeb9d6c33285296b686ede0d740d1c7c446a3a682641ffdd942f118c98b0912222aead61c770a9073fe0eec77f06313939f06aeacabb1bcef1beae389b412b1edcc9b58387666e6af5b5004a5080a50735160669ed48aca4fb1a0c0d6f0346559e61addb20cc3b2c7407f1e193732496cf36da45189c929e58d3f4f606d386b8295506a0229b831baf0be3a0ed612f42a83ccbc79ee8c056fa54b6fdacc0ddeb494524a39c3199edc98c4a40604b74fc7b04cd2f69b9c8a4953c75f78934a8d7d3703456ad2e4cefd2c6094a7e4dca7b7cf205e14ec4549e76e29c89c73ce2c5be2e5f374c94d2ca3da9c73eeeeee9680b4709ba4e4fce5df482a3a57ac579680bc94d8144d2323a040810245be40428102050a142872ca2dc8174c285092b005285bd8dd5dac67884a9551cc064d04450ca4c3d48e4696181407b436fd356cc049f5e1810efb5f238981cd02441ac8808b019c0c1b34810eb7c571dd926e3a45eb360636c22ff48d2f7cf179e423aca4d908c7c047ec0bfdcc84977012cc400c8443eb721240bb1c1dc9c440401d4ae1f1731b359168e6d2b8a054ae6b0916c058020a7195102159e2a74eda4a604105437842083af16f6db94b76d88eb9877a42000aa2050680210cd1a8d84f952e94c8014dc55eaa729ca8d8112c540cf3609002ef8fdcc006d36726d164c82a89a21f686872a40717d060c50a8b228729889891021334aa298ec0c51456d4f0c1145a60e1a5d465828a1c88a0a2053745dbd6f2b88a924d45f0ba8a3266a6b2906e87ac1cd89afe2c6affe4a2f6cbde00131d784cd41f72d16222c63affe5899bbd3104ffd4688188fc9915e970ae8874384f3e782213e18f7b4a5930e5e0d81b8ed33fdfbba933acd31b7f80e4899f275660912a75a474b0870faf3ce8679af8c32ba66d43785b0dbc1e0efaf04ac1d3d70cfce13ebc4ef0f415037f780e27751809ec791dd26f3edd6fa763e3a953c47470eedd9c8122f6daa87273d26fc7b1e9434af99ed7f17ed786faa4803daf93f2bb36d9674140550cc53a842255be0b9d83a351bb83bd0b6b233190b3c124057d3c30f41af93e2920f51a299f847d363a94df7d395ea3fd86713c02bd0e6f3a9473ce39e7f4f94b4b1a3d29e088ea40753bedf320d49302e8bb11d581e046ea76d98679d541c19dacf2a03f411ed853ecb32ffb1f5e3350dcc96ab76327dbc92aff0cde17dbc7a35b1bff0d4c1d54dc408f4ecdcf7e03f3b3979d0edfbacb3e1e3b1ca5fea035fb0df4e854a5e04e06721d66b44393fb047d825e3fedeed9ddb2411ef369953d3fc3fe87d79dacba3331d2ba79777747df54eeeeeeee72c6cc9bc9ef2cf3808f1641a3e82f633293dc62261d1275c8600d19d880065c2e278de2207a98e03590eabbab49fa19364516d246bac64720b3a67d8ee639a9c6acf16834e2d758541c611603f5aa87e89f0e9d8dd023b406053b0162239402615aa665e06423327752e937d3eccc4d3c7147f126c74ddfd41b2380aa6fcb896d92e2cf371cc37c8ac10043f6f35bcab6d1a4d2cfe4b5642bfef759c2c03170f5e6210411d1b2d7441f4da4c541155b4ac1cd300c6423e8672f1f7b3682192189340a0baada97801c210e199ee0f5b7287d390d72ce67a0358263e03a7f4e49a44a4ecd235c890f79ddcce94332d3925d1c15db160c3ec3a83a0803bfb0d80dc700832ba9f3bbf95c0841191c671d8482d3f77272a4b4b1381e0c3e647271451fa95b0abf5883a96ef41b8863d0e86fb66d1928b26c1ab89f75338cea041b097e611feb7634d0917945a5dfcde7c2e7b97336a2e0891b24e6c8d0a8d1f733a07f0216c8c1d1a88992cb03aabd6863ac378d04c7c0db47ea76f3b4fd9ef665ddd7bed3523a92818621231e7cbaa79f0fc7804f86263c0fac31b2a3c69c909f6598b8e27e062e77e2a26dbbddd54c9a88c99cceddccccccccccceccceddcccccccccccecc541b6dcca38d63667ee63a520a29853d66ee5587fc4f8a9e34904e3d297af25212a484494b499092918730111ec22a6ee6666ef6e60c70333773b337df34377333374fe77697724e6c62589651aa514d1b8db68d1b6d1cd77524524aa7b4d7a56e07b70a330bb7f08b7373333773b337b333bf208472b1333e0608bb5bf618c7edee7ad973bbbb598661d4e3d6c3b8f53ccaed7b1edda7de3f414a49b749b7497bb6015841a594526a6bb31d834a2aa76a2f922546ea52211bef96d666396f6d7eaa18037383b7489010893195fabdbd514ddf4436187e7855273dfffed6f2b5d4dd1b2dcf4fc3de587956797e7eed8d92d73dbfbbf646cac480a8fd196351fba9c643ed1fb914b57f9338a80d7273083bf40220302b188bcc481fc981876de56379956fe5b7d2a7f29bf7957edb64cbc7f2291fe9bb2f656219d5461b47fae4cff71daafe0c44f5672caa7f1fa9fece43f57729aabfc441f516cc3f267b710ea1fa779ff7a4ef445fc45e50fd491f8cf6226645f5cf38d20763f46266a4fa933ed3f622cda1fa6fdccac7f2a4ef857b911aa1fa933e97dabda80951fd37fa2ddfae4d3fcbb7f2a97ca58f5f6bc3ef7d3dae0d7fcae7aab5e1277dee125964718b50f9479fc8427016623351f9b34ff41e2a3ba1f24f7e7ef9aa2bc3b3c2db92edd4f24e2d1d6c726219d5a84bb2e4c4329ab9e4c4324c4e6cca295fd24f45e85311a8cfd0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0500b10212121212121212121212121212121212121212121212121212121212121212121212121962c70bb9c5846b5d1c675a414afa4b2c2d2e2f2628201738a49b956a9130c0cd38b4b4b0c19336256b3e5726961595129cdf8d3ca55252f85d4dffd07c32aecd571dbe80361a8b2f135ca40191333485532332f95005b78aeaab15c0a68a9da290acda56e145e8b64ed8d18da28d5a2c3b633a2c6aafe9b2f8e0a8abb27a5e0947e5feace28c186fe2adf07b6a604f2ccf03c907a605ff067f67ec126f2eabe3b1da4358214ea3efd8f6b773a5ca4e089da4a94da108ddade5ffb69147764f4a3e3ec3cd228f937afd0c9bb4c445e6b0629a087e8d0ada0fd68ab0e3dc76ff6d54424e993423af4ef3ed9d321904fa6dc0b2fead03fc7717cf41affa0ea44d5e4aaefa486feaa37307ea44397c2fdb5956b2ce7e99a4a2177a5983c4d524ab944e0e65cb65606a2a03047e793e335fd3952bedcc2b7f058061996db75b0edcad9a06843651a6cadbabfbf4fca01b35c6d726219d5684b4e2ca3d9f8ea959c5886b16a7cc989cd514ec92a777577dfe0c0e322eeeeeeeeee3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e5e6c2700425dcbed72669b65dc9eb99c58a6ada671bb8665541b711cb773a38deb48de7a1eb77b295e4965a5655b5ab8bda5c5e5c5345ffd306693e93aede9c4eda7e91a624564884a8531c15a414ac611480a2bc29e602fec6584f533c46ac59c35c95c9e11654c3acc5ad86218b76319b7cbc901a9fc8ec3a2b40dfb39b53798348ee7354d05df3c6906270b688e41b345348ee3388e2a954aa5524d97919e2e97cbe5521da14abc25b59f0915b525c84a79a629279651954aa55269d3355dd3355dd33563e3ba8e444a49f14ab2c452676af64c1591b99a3f94c873999cfc2b2cc24695d7b44aa552a926d01c67d06c4d22ae23a58ce3388e9e4aa552a954b5ff555658585a5a5c5c0247a84ea9b539f5b03530e8a9386c4da360b8d890ab8217f5e7a58a27971027d70f27d74baa08e67309726975c884c86b5c5c8264d409c214c17084277640142332a4b28d4654a4b2f750d948e5d70e2aff0ae843b80fa5226a7fcce7409f0d1b2a3010c0868d027005e87430ffeecb78e2ede7f0fd46cf5f0d186bdb9b18d503618a7c5c1e861a6844301f47b4035051794d69ec7c16478508951fce894a7ca962972a75a9d105c86bfa4b2c95204a4a288d2e40360a80428d9ce3361487ea74f8b83caadb21abe4c09524418ed3adba55ed0f6a944a4f735058940a0f1baaa81ca74b9546c7d1889c88c52905616b7e1ca7c4f29a8ed52815a0fec1a25492d8b03fa58a5d2aa58a2aaa94baa2a2aaad028a2f5e09143d0f2c8d2a63e702e4389c1317a0ef04e33bb5bed3f89d7ebe1e3ebc9a3dbf0a0f2725b5a751272636ec528e73c2c1d600752cf041ed2e75ea3e982298d7daf46b448e73d2616b82902ab11c07868bad4902e6890a50a360b2d8b07f75851f34a2daa71e8aaae852e41285cb13fb42bfe97379f95c9cb82ce9b0dfe5736939711c17221757edef47b90429f16418692283d528ea45840c712042bc70204fbcb8e249e517bbc915476a3f4cccc9d5a82627278d9a2edfa949d7f4e3743a287872e59c723a1da7261d9eaa38b94e55c84c9eaac05e2a05bbfbf14ff38fdae0fccb2af7498ae26875f97c5a7ef4f91055962282d6a6c7714c405e33b2a85255f4825255fb786df85b3efa3f6366f4f3b289b1983aa00e68a6d3d11d91e9749c5c27d7c9a512863502100000a88c1df60ba0d3a1a2a483410a9ee81234d67e17a246891d50eda0252e2d17268d9a1dd0de5819631b69ff8132386a9a378634aa325e1ccf4a8fa00a24460082a4083f508470058ca79c53ca68c19b75913c61020b8fd645f2e4882c0b231892273540f28488172110100a41ee44cb206a020d7a5852440e4e086229a5cc154138814609490862890d163caa64a6076f3b027442103b90218247aa9b2408208210840f4204b143c803105fc82401c20a404ce1c30c8d0e1ecb10aaf0b824689ec04ac2632942430540f4400520828050bc4d0b3576f0b42c66152d38d5e899c1d00e9e8ca209dea86e9219308105a1ca972aa59492e68919ec80a6082fa56e9219cc009c814a052c324ccc00888c135eb7854c10cf93c210bc97960c0a92805728c25ac2e3ea2629320410de563749911f8a8a08f9244570e061f4e18e19309c6981a772851f6f850a50091e8c2432397834099a263c169f2f62c0850c5430b305cfa56e92186ce183d75237490c9e6005afab9b240648a8e24b7905104c3f93d54d12832475ab9b24065054f16f527ab0b1f606f65cf9a78a48e5973ea8f341221c576550f421375e9ca9c3d6e8d0430f3ffc20841075e7feec013370f6d430599245e589337586bddb21a362a064d5307b2a0b3cfe6e1cc8d448c7c4ed726219d5465cb33a0adbb87d3b1221217591088d15ac8b44a848bdf11b1ae8bf16c4a32f7a14ccd1cf83c72f9a8055fbbd6213144df023457fd506b7c38ee11878fc62db192ee2872a9908e57ea28825b54b442ea58e04c51abca73a486308792fc4a33c33e5b74d3ce1845167a730624890ced6dcfc9887244be0a0b351c8010a0d7436093f5638a12305d00a88e86c18373f1b360a29963042e786941f344167bb0022576d28f5e0854a67823c3a590abc70735450844b477eabc35136963b598321384d40da10835011a38e7c1e9d990eb9a794fc9c024f76c8eedd6d84693d2e722f82229520b95deec6989a593c8f39e79c379c72a66bfa19fc49e94aefdd658da5cfb68ed3bf3a2c3133a3175dc876578bba6bc5e664c1c3822ab9df2d02078a3c4454693302c5013ca07e345b83491b0954f97c812a599c152b810d8649907578b41bba3d0b5bf3a4aa3fcf127e9adf2347f5e7599b3dcdad3cfc5dc6cba8fd32102049b5bf8747aafda41975db6d5fe4e93a3f8e52fb136fc0a1f6e4fd1cfdbe53fb3bf96fe5b1efe00c07a8fd3d4e0b3840ed3f4094ba722789f69cb09fef148711d7f9b60391fea8bd193b66540aeecca824e657a5ecaab4f326613385db06cc1fbd7fda8f3e6dc45df780e908a8dbcdd0ed4040a5e00e022afdcde39c65bb247da0eb0facd20c740c9c6182b2b1256cdcc3ac6e3914af98212c3b9c51103913f54d40e4b892a56b9a85e000128a1ca9d89f66c07e7eca36cae52736c75d03b0d744d6c0cffabb7b00f63c9f7e293503e98e147e9e8cf9082d8b2dd359193d947a1e0b15dcfdb75979b48c91056f132c9c6ce08320591c21095da060dc510214511055018b244c2c91031028b902899391091f841042941430a90216534c41092b5c89d781124e28ba620a292041c491103481c3500d8420850b2889a09f1acecfa9f371346afe3c82d33a8d44156dd4391ffbed66e8d302c0d30cac84bbbbbb3bf63d41fe45edd61cce5fd3fd419ff254f9fd382da04e9007adcd3bfc371de6c0d13f2768e3863a4b29a51fa93ee39389278ef0e4a6db6f50fb092314d5ee6efe217d9c1650319007f8835609dae8b09f37292733b79d833b5efdb1f7ecbbe97067d7465c25554a3047873ffa776cdce4dcb034ca9f00aa2da31084c4901a80ba41480cb16dfefb75f6f5f81daef4776c75d0c74e5df9ed64b57b4a7aee65a783d48122fdb4e77668bfc351360e3cd1df2a7294825c8798f8c3eb0e175506c54e0123ce3ef18773a36f27dbc92a0545f9c3ab3383e20da97ac310de56032ffbfead061efd7d4a7b74aaee64393aa002a8442d39f5b87488060200000093160000280c0c088422390c658128e93e1400116f8c405c523419ca22510ea3308ca220a48c2180100208310c90a9a1a102e033232cc6eb722f3a856b772840c7c4cb52f02e5cf31490d3b5d577f9d67ae6c6aa16e51205ed9aa5eae51ac49bcf7694ebc569b758b204ba2073c15080fdb3f61a211f95c50486a3914915fb818aed2c23cc0cc2d4c77b5bd34040a8a604b992e1a49488dc33fb8f28e7445b371526cbdf0890331dc89db689c11f6e8a0c6f65eaf86036979dd8a2ad2affc552ea62ff00dc839803de41ea6ad607e58fd5f9d02e513afd58e49820d4531dc88ca9b2923a5cfcc3ec67bf83fcc0d7a9ee624f51121f43f6402615045db1aa158da2c331243e4f4ba3444db2b7f6ddeeb1c9fae599331e3db3f2d1a6cadd3d78e7384cc557a3669fa6a0200afcb97f09aa544c4c5430aef3b3c6c796ca9190cefe13192df4b1a29e1f0d937d7c404e0782a3714dfb243520b2915ddd31c65af9c0e746ce46af2800a1ec2bf39ff5f83e4fea3ffe134aa40b2e8910ffb588fb8069cfc44be9fee820bab48f4ee182be098a9a85597595edb9034d50acf7968ec5838bc982de50306b83a0643de4d2e3d6bec39ef1bd3941ac4a0f37faa37c1567b68ac9b5d52ccb74d6ac77485620904a52fa743108a2d22036d82a63f5be11c10aaff420a18acfea383e895e31fc2fe73ecaf161ed10cd3b151725115d438c537ed55eb4829f2cfb940972c3f9e46288c4950e68b14acb32fed7642adc62f79da96bf251f782c85fd1c1231d4a5a8893180f48ccb676061d86d66b061573577178cb49dc513778ca694002be77a78dd43bad6beac4d6d7d62247d2b2a455908a92fbf3851834d86bbfe8c6bbadf2a38273226e64753e805a84707ed9e5339ce56fa1f6812d0776a452653f91385fa8b305980fa840a660b774b683fbf1deae4004fb402c973cd9e4767af612af418db54ba6ff5eb1d69904a9a5bd4df607769bf3181a65abe3ffccb7aac2c805605c711d006776b1f4b22592e57d060c279b8ae33d5da1ba1affe5f51394eef811acd98193349542649110e0cb3f854afaeebe29de76a30043b880158efe94295c5750af3768a4ab1149936fcf5544f2d15ec1fe86172adb3ed888b1fbe8a47a7f45a868aa4dedea5686e75e7e16fcf2ea0a115a363ffdf5ceb9a2da064ceeee2e7c0f164fe572ee9d321ccfc341b5ad02e3515cacdc33dce68cd7dc002209b09ecfc40ba09742b0b9a0769ee0617a410fe116b40051f14cfa81e2d8ca36e908dc3097251a4e0738f04ad5b040e8a93c16f25ebe0dea9946f5e4444d791a5d0a975149a401b5c28ed922dc586d3ae91478cec223f0e1d95f29939355437922b133e992231d4b56f8010c8da5cb476df00ddfd3f1092663f3a03457c0170a79b94875b4ba6a60d8941cbdd47450260a12bc9a9ed03da80c653d4e0d533b8b70e88be810d409209ffa67ae5d5c7c718d3d03a6c8f815ae3c8432bd963762a1bfc52e52882805c0a881bd2cfabab16c68a9c48d290c92aa48783b11f96bc2837749589c44840b462494103d049951e239b40b12c89d7719f475a8562cabc3d0c99003e15ef3e9365c010370786d1429e62bd1202e72f768798085b95bfb944c70a3f956ef01b6bc1e0223e37fd16afc5cc79014314069dae73fd6b9f95197f72de6507ef460bdb25a8baeb25cdc6b5b9674c694f73d15c98ce28a42d301b88a152954969ca212f55aa42749d5a40c3ecdd75d7b5f1fa57644298a3df26f018586885a477468e4527aad0329eea15c9b0c35f78c6322f47c027555a693192a1d599b21e064ca88db40527ed3a0a718deef881de2d3acc2de0dadc7ec5b85d04b8a4471d04137d99fd25d914f97d991e4e71eefaef6d7a9905e147db003b86d878ef4f99949ffb0927a95009cf8169d8c2484ce2935d07d03181a976860a646128243c431d629ee18f81fdd918dcca8bfc285bb0bb64286ec8c9d3a96112f784a703c334249e636b11fbfe8e98f0965563e5474c504a650bc89196cb09bedac6f9d43e217458269ccaf62cb93343d44c1b47ec60e6fc7031be014f0510ab9a7794c7e8cc9d91a7753edbd8df04afdeea0e7c565c7b95005c8c31947f3d464b72096a6a1271b74fe084e66b128b5b6cd22632b6401dc45d90dbb76877001b34971e96676026bda75d72588b2ca9df80ef58e0361046c00a68c4243dcbd802007c0289d0e5aa3c66451e38b48418508b8399ba1d127e0b3df0a5562ee40196e283db9bbae1a1258e339d71d94a1a9d01329b06b800e3172ca15bd40119513451eb6f93c994fa55275d878714a420560b76aa5c94550163c858e93d149744cb651b1d85255c2a057aa83b720d4ae27825767401f44b34a2779f102f9e7dfa69c37b26843899094712d085061744e9470b4af034364ae71c702d3c73d4353bca0836e9fab2c910e19130ffe6482e1589ea3cf50899d82475a364218343ac75c4cf30d43d62a2cc4a9769b0528d68c59fe9b8fa838f56d200e14b32ca755a2bcf763c2c7e290d6a1c63781cb67ca37fd5057b5f67b39a186f7a048f891f068f56490d1ca2156c613b91e4f16fab7d8bec613531e263b649810aa2f375b87fee9f01f2f23269865288cac232ecf41644604526d92b5c9d6763063809487401f9b107ea62415bed193600d52c755b1bf6001410d22b8bf6d38764746120646bec049a2fa72a9ae4ddfc8a367aa9a1a2cf70c9c6e7e6393624f4f3b56dcaa71a2e858bb34c6bcb1bd9fd539c2ce55c83f07f75467aa3a11fb3d123b635c6cd492e872c2f949ddcb4c72a57baa38c9cedb2393fde628baa25a173fc5eada44724cb5d227c0bf4584b2d3bd1336fcebff815e6b94324e5f0b867d36f10fc87af6b0cb7a9e8cbcdc806f368fde3502ac0ad91c8cb0398558178f5bb2319e326e8da3da87d0c10563d31b192f2bece720368ad38c7ddd4ac0e563f6575b8acc6832ac5c8f59cfecee834b1e9cea71c2ac067f4055809c93b2573cc7363a81f39b31f5d32db218a6b3744b1a661e69f852316db78455661763cbabb9aa906fbd16af68aa15c2f36c0d99154eb17b61e91e7562db6426008762cd2bd4f5b99b160f190711d603e324311ca83a1591426ec1434de176e2af6847df20d7164d2cc8640db9f0bf44aa008ec8392b63d0ae5549d76680df3958cf52414ca0e68a16b440975e769a5e6c864c47990d31f5280c2806895b237242d2901325799e90a53f4ff82b3063361059f9b03d765b1fb8624e26d83c3ed2e0507b2f1b8733c48b181d4ef164cd1606352443702a58908d2fe0b7bce83493cca2297712c1093c9bfa4e24db6cbedc764c9c7d9d0b7db94801dbd322d8d68e32066fbc2631c9f8be4977c2cfb5654111a8c95d3b22e7bbdf1c7eb8a0092cf6b94a04c5583f87df58e182a66077826e04f82bfcb6797cf4f79c7a2de329b0ec7d29260fd51ed50b151c617d8a898679b40942288fdb86330dcb609e9f3f4168b58f89f755660d7b76693c60de22737fe6af21c45a8f4f04717573a0487e875765a4f4b7f2692d07c1f817e95ff9c8abffb6b5676771e4853beef9d3f2a7e0011f1e4be9ef3d7ad74effd6c076f0a1bf491d10c8f5466872e8cfb92a2f94a200cd5b2913680469c81df8843928acefe438334c08e540d9dc67a74deca7d80b9d4d81e6b3e241cc0a89cac31230e97bb6680ba1f4ae53ba6d9ed2f1180b3b933bcc434ae34f7236ec5607d97e25db56a51457cbc850fcfa5dd0fc047b1c6586de171f7308d9d04892de5ef6e438edc142082939f3deade3c04fbd9475337165108fb57d75eeb24c7703d9ef629c0d381dbf975ab3fde34939e0028cad7589072dedc39eec1d841f6c3af17e412a59813320627396dee45d916ace101a0984ecdd9b197b19973a1d4fa214e29e49e7931f95dcba68cee73a6eaf5242c357761f093d795345234e241407df406f0523b9a673866c8c0ceb391418a67c33f4650aeb4fc1650d4c0222daa82840f88e382d464bc702cac3ed34736ec96e45959d5ae673282124aff71e063abd6509dec5338dc14348e601444238450971823d240779b4d10ef3e4dc814804733382987959b468431f2349b4a36333c9248d25e4f9b9438b0936e94960f62cdaf4f89fd9b36d9d2944e174e28b3aa28c6797e8d8b859f4bb3c23d7a8c0fedf4612b702f1c4cd22c6529d458f79cd4d745f52900dd810c1ef70225b71f83f121776ff5f8f95dc32b5ce63839712e91098319f54dc2c229ad3c2d24f93382d54e72e252b60523c23c9fbb633067e547505aacda25f0878d2cc828f7b4c82d08fbb70f78af0d156109827d8a55cb29c98e26749ac008aadc9f3af1a6d6532b33970b8c56bd68ea776f72984718b5172053eaa52fb0acab75be8e81aed8568719b6ad5949f87d379459c90fafa10d6d1995f082613ef2c40399ee242705934524792957a0a5c1694ae2d49792847e991a6dd31ff91d65c1e1efcdfa1bbb629fafe52e457d6a78ff495241b348da3f97a586c940c10620f10634f5986fa27f711b2c165d19547b31e3d9b38f5e8b2f03df6bf7dde6a957d32f72281c0f787dacb80b006107c0a3390a4c32eb8ff1d9ed4e8ae74772df9091625c5fced760f3822adcca943c2c2d905605f25a617d5c4a25986931ca426c44eb456f87dc76ce0afc8f28541eae73d8ac33541b68074dadf505cb22a8b9c49e2a8b7d324058b738085e621ebb0fee580a663943401d8fad06aff8b317de771b08b1645aec9d76a76d4fa61c3acd5f8c4dc80cdb5ea122487619277a543b6fcb52668d8cbc8f7c9786e4f56af98255968eb07f703b4ab5db58e6140af69cf69385f9e4ef673a4aeccb313105e36e319dc318698439764bd1cfe3eb0da278fba023b1572d73791b1a654ef4dca79fedf266f75da6864f840e5d4b7d0b55a9e945219d40f1b1a1c2996cf75ef66bdf4d30be0cadbf67e640617173599a2a2bec58dc4959fa5cfb8516f5a4dfea30a579eb9740d3878a4efac8a82442e801fa1fc64a00b11127cf8d24844cafa128eb3235100043d5204dadc6af6881c7b45ffc19b9df3caa20a55209953a949860e04d91b4253df29e7ef4c4d24eff4bc50f8c5881ab3638a7ab1ca9dab8ae6a39cc103e6d08f07eed90fa602079b5a9f4649c5c0c71c8b6a9a3a1c3b0af69981dc0cbc9d81ee3390c4eb20b0c8c50e4ae3b3ebe370e4ce14aea8112dfd4483e54a3bf2a28a6c6764253aee5e1c66ca37897a892779fed6993e19311f888be40d7235f2830259a9f04ab9918426238573c4e0f241f6264ba5a549356425d556a32804b799a9e0730f69f2108eff713556db3a3d90d8965bda27b02ecd40b31d4b932c4b3c541e8127093a3dbc58b1040709260ec24965de8615e58378a5d4ae4397f8a574065086a94c1fcf18b94a636a0436972ecb7d3adda961734dfa2accf8b450bb63ed53e872b7533e74b52e68b03a36dc6f08a88e4e891c80a0bad037d4a657490b045de71dd24925425aac5155ce96dca6eca233af56b4633849240f3bbae8afa59b0d981e5d98577c3e21d68ed4e103f6fa6e8609b857df274d5d74e3f1e09c897d720cb2197cfc4eb9da2dfa3b5678ed30d0290c984459a60c0cb2f1ef29255dfc5735383dd8d9dee2b37ff091baeb49b39600576f10eb6c72f4a181dc442f04dfaf8237c633b9f5b5e801594d0b30345f775cd8b030389fcee92ecf47d6adf771fdff055b2941cb02b8ca357785ce44c5008a6d57f61f39e63d5ccffb2a223e0f687086c69ed668067bae63efe8c817b664bd93f2dc104017e5c8bc037e6e0a669707055063bc30230632e806b682754a9906e60c6316a5f73cabab99832e18d4e0334f4114490c2a126959317efeee5967d7a91f886170d34b077de958a6665c2d6b2e6abd3a57d6ddec9cc2a9be3628e29a635722f062486548ab7ffbe2aa790fbe83cb69c945e68fe2b743129537d5a827f7ddf9f6b1c185f0b37754d99220604265c0cdbed4a779c60e18d98cd8ee58ebefdfbaeee1054f737ed44ada8f74b5c940922e3e0d6d81b9ef14233d87327102d95f7bba8343c63a402673a5b901c882ce8f025de82a4c081ae55d8d72e4abfb853775f17172250dcde9b02d7def0866c2522160f824eeef24f38b24323e75ed77983761cdc8f2363791b7244906ed50f6f03ab2787193d6e27ffa1bda97a1eda3f4fa30043acd973630fea43aa8ca9fd73ab1fdea3d2c4b56b348d77db2ba3342869aae5a642c485fa3547948f9c2a8758549d00adbde9f826f5250d37c4118050657e8ce5476c53a7d7a009f722a13e8e059d055d5f62440b0a5b2734b3981439994c807535f80f117e0f4c5c31d2d53131d8f00f3e27809870b37750156d594302b7c8a6c36b8fd84649d875c88cb8bdb5125c723bb0429fed0e716d813374312d4cefbc6eea25341f5ca46a911a7ca440dca974d703e907c58cb2f30643158f5a9047f07cf269a01c0ad4edba858b723379fb5eef3c45a27dfcf8a82d1e8c92d3d657a722727c591512ec44d3150c36402afc77589ba0e3821582294602ba4d177d829462a9345d0b5fd597956cec61f3d25a4262956c361e8e1b05b5f73b400a4b07172e616ecb30874c1ccfcb2c7d2b18748f08e4761d4045bb764912ac13e9a3cd96f96e4a0029d7eaea8df5a621f05744a018c7a23195350a0354a673b3c4eacea336890290f8817023a475977225cd27954132cb01beb3dcc1e253b0a67ce48188f3313c523ad69e170ee3a60b9f279bbdc7473a79448d4f9207aa5c63cfff3ce79dc48b083764bedd0af4a180cca181ab50884bc3678d3bada2dd04ace630bedd7f38d890a7229a3c723596f83a4bda62dcf7a886e41045a1ad921e294f37b056a2d3e4ec44701ae9f0071ba3eb9d6f7c4d9c80418140769bf6ad65ff285f341d81c1eea4ee9b261268d2d49d94447bbf721e6dc63fdc53d2218a8f98aad12296ef4407990c0ac3d2cc9e03050c836b7720865633b83aa9af5fe87af6ce79885a41046a35f4dfe525658a96add72dc1993f5bcb3688378402bd2308ff6801aa698fd5cf26774e791256be1d571124a9b5ef93d0d0508bd81dfe636ddf27c7ca0078cdb63615d6c0d218ff9010d644e9038e6bbdd4cabe1dab806c1e47e5dce170ceb6e51a35375ce9f18dc159bc6d4886966e64883e8af2eb69a1aabce165d4297db2ce00e280a9d32c1969201bf98d5b7da5bfe295ae89a6809deac6dc6c802ce194c4c507b420b41dee5aa843707549af78af2ae54846c6fb50eed681cf93fa2547536a97d38c5bf31d80c27d2f24cbe425547b88d53765175d1ac9be3a8e213c3412f5d8ae40a883ad732a07d613c72645de3b9835c871a64dbd888956038b2a63dddb665c6d0dd2dbaaace26f1f0f2d57b9cf7c3bea8115f901a4709f544b421ff842c0d247a00d38536d8b4275d4f00839b2d8aae58755cf77a647111b97e21192601dd9d6079d7c08af69e8002abe2e48bdca3ac3a1b6312e27f88e5641284fb364c60604471391fce5c00fb20fc42f1d3a42cb9e1100be4e535fcf7057c6364809a17b13fcf10f04e6301ea7cdc767f21f87710ad3a9b00b8794e5fb4ba9dbea363fa0d7cc48c5c937b556c1c3b3dbfb0bd904a96c08a7148aac47de246d5d9c22d29a4b29c4221f9c4b67c43b29231143d4f1da1a2b8d08e096cf9872efac821788c146b9e040c439e1fd1f79fabce9694546564d07d23c727d4d985fbbc5e28a95fbd7d64a2abff14c7f2b0724eceedd61d37eb26b34f296bd6299c7493c832d590cf0629b7bc56f446ebb74fbbce9a16d9d5aeb15b0c1478a06e8e73b6d939d9a4c6422e9c412a96e5ca368f87e03e12bb67d1d8ef092108a82874ced8494d947ec73b1154ef0a4539d0df391513d1077b191b67c7690674ad90b14bc90735ad53f5bad1e5a2186bb50d426a58e5a90ebcb209af133abc5bd09bec63a2b05858bf4e66eb2017d2ce1cd330237c57309917e90bc1da664b85ae5eaa2a20bb4a79437ea9b1af27bb54a4e3606744ac1ae9b2b282203c808a13085312dc9214deb38aea47057c96b19cc1a77999350a2d3ceb450494f1a8b4c0bff0ca6b53390e5cbc0644ea04dcf3f7688d201dc4937b1c07c3caf7142adbaf129c4144557a5d6ad6d82237ee4f34ad40aaa8188e40ce546f855f51cfaaa0dba3b2fe242b46342a97c99a763c82c88400e46d647b1e4315e4ed4efb688a4c2d0e9cca7087bff444f72484a3b8bca2a907b857d6d32d5bd71d9c9a3726dc838f9f07d1b105198e8d05bd9477f32320b53d831bd45f1e39ceec4423fe10e701f0bf0a2f529411ac7bfaf5a7b65aeac98232667a898187d4f3b6125680f71dcd246004143106f51fffd23f84d5d78ea1cdfe171be5af8e3d6ea9156ab71608fd801f01fd7790e574b04a7fe0ae3b10c13a5862bfd36ab4ece3623fc06d47d6f09bc581da8b37ebb678100a6dcf9cce8e4efa53775b809e1a5525ec6ad867b41e97c01f34c5903316f9fbac8a9e9df586ce95c8e5148e72178890594313fc894b63922de28af613869576703b705741b99cf2b3212d7a1eb4b7aba819db27d218b950d79386c983b47327285512f01d46040a394a37ce8437d5b8a94111c67b6b08cef860968a59fcbc810e076f63adcf5c6abdbebcfb0406b7b4496eca16dc322803c9a7bd11b6019bb3e04117ddf4e88a1d5916eca4fa13e760ae9888793dfea363dec233fac0080e168b09bc3e9088ad35661b124bc468317145017b55b6aee8335bdf620235b2b53fb5cfaa385017134f3347597b0e38c8c15e4c7437a5ffa7a0dd7dae5d5100638212900ae5f6dc4f4a23e466e284a3421b45b07653041756c6cdacf2f95636966b7bbb4cacaaefbd155732b1aea6f7653ee8bfd67b32666d5d867bb89315ebf5d9aab354eb3dd3d5b7640ee8938d50c29f6236ca1a36a575e21c932fce51f69e7c2c1f5fb26269bd77c9ceda3a3db7704f26966b7bbbcc07ddeabf5756acd531ba0b67d958bc3e5b89f5b5be375c7a9f8c017dd96065f06459dd75109ced3762ab83baa3c4966280b00314454cee1760acc15725fc6db45e8deed7d6797a8d5fa3efe935fe706b5fe7c0ea28b10cec1c27050e5cf3f690426cac1f44a40902f468f657efad322396e3b1b494e5eab8fd953514a41068494632c2ecdeb6e6e0d5c2e539c1d8fbc299ecc792b33af605736987c495ec8d9aebae2f988bbb42ce542e053a9f714e9960b1b2160e4a2c9da259e9a6cb9ae42c818d602765cbfae47cff8d93a4cc29506f649deecaeed3fe767b2153339b60f4c265bbb1b13c0dff7dd0e306ad908cce2c8914e54fd0bba19cd0659544e305b567f88d692f66b97315e7febab9fc5ae5c07b4d53a37c5184813b65124d5c64198eda77972f190dcf029d49a2789505bec74d96cd904595eb274e89fc8983b35d26dcd803e1e28cdf6df68769dc78abe06c6e3ee5035062b16f50f60fe29a79896c824175254ce4e5d99210b7e0d8fa73beb45c9d544f314cd9c926d10ff0f987034f03b3650664ca0852c64d6d0c0f2ea7213b990e8586d5e8907e2ceac3388439533d851abbe38d410d28bb1c9978ad21428018564aef3c46c7e9bc17815ba8982c7166ab87cf698bd355ab1f4d4227247ef99b0b4675c9215e84dc2630ca5a300692a41c2c29b9f00aec0d378d7c8cbcbe3edd4d0c2263bde2dc918c4943730e674d43707b10e2310c0f037e79e856f343f9739e13b037075f1e8f8578ca0a904479a4faa174d56227933af7941141e3df3c595c0969687d1fb1c3b3077500f4f2123c9118b79f594f6d34619f42a28d7c7b22a33979d6da9019444c74c137558e193993ffba64c86e9c7cee5608b0e80f1e60a0b3847b24cbf1a64f5e07b8f6c02ece8c3d89b378f7141fb25e7a85af356b936cbec07896f2ac1265fa0e35eb994e5427b2d0ab651abb95898689c66ef8699413a7008f9ce8621aeec0486e58dcda8d88233e4ac34a32f87499ad13615800bc72f07f07604c7b2e1da034a4a3c11fb36c0eeb07751620020cd44af016d18641e0a314afc82909a0c87a503db8d6ff9a89c659fa3659b3cdc197c9222b4e8e7be7fd0fe8055687aca6e2bf7023e5aaa902573cc6720d10cbe1135a7db9722cebb49a1663a09c39b0954404b5bf3f638978c4b527fb984d185eb33b061f9180f364204fcbf9387201fa7867d76e21ff4a1d1db19205eba0cc786898640f47f6b428fbda64e224b9d140a86d0e42a4640bd140a92aade1b689f901dac97b7e40c064cbc48498cc141d02e73392ca9d0401ded57ec4e60e5fae896ec9382ebcef250301bbd1c7ba5c4becae4c1e4368683d7750c0a6a055ebb3126b17999ac4de7cbcc1ac86278029fdfcd79097ec43c71bd020347a1fac067c807d45fc801b6f90447ae600a0436f73bae6ca878c37241a30d6a05789a85affc51b3e35866856f2c12d8e24e6802dc4a156bc61938c9cd5045a53728f91c01d13ca2abe03741825448388e15bf041d132c42b1a12427d4b1f3bebffd580535b64b532b08639b06ee450e0c63864b8d9431637fb10e4a61c70433d957a4d6e2037b3d520f4732c8c5e60bf6f7203b93daf82a43bc5bae8f5adbd2a7a6777905bf315167a4ad9677607793bad50a1f73b7e153d6637941b35e7ff7207b9b9beadf27600371874e1d67f9ba27fd59ec7fa765c1023c914d0116b8c10b3c7cfb5dff7d8badb3d4e3cc2e1fa0ebce807bc68ca25da669658962edb2fb2f2e4ef3c13878a775af60b91bdb443779f7f74dbcd6a7350a738180354fb52f94bb12e7dfe75b427ebcd475d46c7dddd992c12f6813283e38a46b44c39117ae752a5ed7e84e040b8a7765734b94aabe33d9e0acecfd738f63d33db18d86daab28bd618a59f0ec2331a5d30f8621ac4b59781f0097d5ab7c1e6b856a97c1ec02b711b9ab47c1ae6ca42462224b9496cee314d2ca917b2e175a66fba534672c6e407a8b6b88731c4f281746b0e929e02de1222d026b6dc01b9dc9962b9e009406ed8f491ec4756fb5806c19c45a00cef800bc7ecf60c84fb179f673f25a515ccd1cae2badfc3f90861f04573a6e23c46737f1469e1873bf9c3d25131d3e6d06a449a371994b0008d75947bc47bab2f1ee08164779ecba5039be223f9f399bf71af888e6571a26f7ee6b3bb1bb0447ef6a506d935c0019bdbc3c40360d4b45c8241cccf88fd41458c77b77f292c8999f02ef6ac0a3502530a851ee55abd45a5a7c6f2fda802326fa5f5bd1b8f57deaeb8889f94799fc22c650d54930d8d91d90e49a4637b84c6e086ed26383be64b1478d22f7f87716ec84dedffe9be43af6420bff39520f413c40c40ad9ea89ea7ee345b948f20c3f2ff584a131a3c43edc50c001a726939f3570b32c7059f860adb793a176259586614fdcd9c0111c24541c645e2baf99684f0b86d65a54e468e4b0b7b56c4a96d5404e1478e1b89fea35b055d3643443bb3897d6bb64979b6a13734a67bac96a34b3d6afc9614ed36cd6f5288e992e6b8092eada8815b2981e6c0a64bb4f92a48ba13c40c3659ff69a7aaf6947614e218c63432d41e7f9aba162f5e315584389a48b92292a2835ab986c029bb815c3a468e45c0afbf80eb4386ec92cf7ed9403e257ce0723d9e6860f69891fa75578da4b11a9479241f8e37a45cb0a624db15aa0507b5f4ae1af65399d14100b0b4b7b7d422c6fb9c40a6dd8b2cbee8624e95ab5631b2a92a5a7b859fbe6a16dd3abaef6964eeb67831c578d1445352ce0c5124e529304dd5888949789640a9c3e586780e62ef5db20b9a54d291d821ddeb47c85ee5d030c274e47f38c3f3ccd92ad96f652412eaabb38ae68a47e7280f82de36f4b2ce36c07553015ef70ea0ba4500a18ab2110569e1c45c6e8f24c8c67d10897f8747edee0e5c94260ab955f911e43d5558a0c2d39067648f666276791ae514b36cfc7a2e90b002332628e2cc3f27d4089017003fe3cf93ebdab6845a7f2b92594143bbce9803587dd8240539a9ee44d2678a4fb6e4ba6d2a83716cccf9edd2fe157a49d57a7e6d330dee1d619e18dda39ae2d5038e3aef70fdb07df0d35ee9db3bff9bd8fb5d155facb82892744a8932628a5c7510c3a97022ce53ba6d96d4aa8513bc9d25ef0f1b68fc8ecc0b012e13d46469db4d32fc01756288b5c16d6204a8a18abb0d179d7491906deb1949f682791ccc26882b205f07c80303adb526c99f7a72a73a87ab5ca132c2300ef57c288f7a50c020015426430d015a53c3a1e160270fda6373826816d221a2e5609784a1ac42034cf46d4d13e3076e50431d2b7120ba8804c4b8c367d11c20c78d76664c10ea55c47425d514665806680f866d6ff280f707a545a76825e4f83cada6767d60a2b37aed5e482b78017e905ed68536543a18e0b790bc375115fbbeb85ec22f203ccb068cbd36261626990e5f6553a3b311778847a1a9346d7729dfda1d37f1419293876e3700373cd4f953bdfd13c889e60ecf283108022be5c939662a2751a3903905e0d89948ad0098e14d899cff07d6981d5bae7d35c0216e291b239f390e68f031e49897091517ab0f4d8202998b93c250a193c735fc86815dd670271109306fb2ff1b78d355c32542803f45ace8b18251b786280ac7c5abe8fe488d77b033d8ea108c4b513e9f7d4f667ca2943eae083199858c0464b75a1c0349fc57980589cd7b0a84e057eaaaf9b73e54d8ae00e7d6f987775662ae3b8b8df9871a1278a0131b81460bff3b400cb03cf312fab6b5adf556d0ccc60a60cde48853cf7486d39c92f3c5d99a995899c03a17e0d0474a287074f7dc886ac9515221d4250efbadafec74103fcd3a2938d0ac554f26e95c60b09628eb7cbdbc8dbace3da6f5d013b120ce68ae79d263bf003eb5fc93445e7fedc300804a9fbfe4ad8898eb2445e97cc7055a6f622bef9793897df03fdcba4ce1d1353d73e441421d848174f64f1e32c83eae4b2dbdbe409249899ef911f92c6059d276a69112969087401c0df8cb02f7bc68d6a0b1ea4c0f88ee733a201392d123a63c7963c03be3ce4415141f891d04d70391ad148f3021c614b3ccdd8b16b91815da29a8fd9061adc29cfe17d1f0f93c616125c8b43fc0c48b92cedf82a5f86dfcf0708b383032859322e5d74874e40c3d8ac1cc69a4db79e116261c80b9a16da231194dec0815b30a95872fbaccdd55bed7a83a28fd7acaf9aac074023a9a80788274436f235e43ad219a174e88122a627a4f77c9d4653145a6e8f1b6ddba3535cd26424ad0327557a4e8827b435b3cb9156de44028b6ff9ea3e73b4486dbfb7dfcb2762bbe78112b8e9deb9dfc2bb1f9dbb70c520cbbe5541b2d9307b30d55d6d8045f0c2ca98f716d4ad69eb842164930a8f2bc4888f23388d640643a0f121b82f6f304ea5008a6434db51aba39e2816303ec2791a18c9975246ff382f4608af2a41ea8fc6fa0f635c2fa65762f56b162455d120e22654711ba084e0bf531ac726a76ecf7cddd79544fc0ce6189c28b134e107e88c486ee133f89ee03cef3ad618991af5a83ee65c69a7d0ebb78f11a3bb8ac06b407f5709c4007c7448649d4a22330b40a681de802f50c467c7db49ee821d24413fe95c3ea27ed2e142fec042699a307a2da951f43a4f8b2ec52a4584552c82da41cdc36623d92b396e47b3cc74b042b342564bc11a271dbdb39a22ff4ee0cda7bf0a746ef4536ccc2f4217b945ab5073aa2f7d51c70df40733ebf3e58f575a8c68caede4f91b191cdea2ac30fd7ca195f1dc15a90a9167877017c46aa41d8cc0db97fd63a49cdf63a7fd93d2196c7406ca144e4679bed475cf6895aee5eebb7d3d8bd1263e731e227d612d0b578f1518c0cc3dda2442a9d0629b6045613081f40a0f2d9ae5a6dfcdf40b750f5c2d01a336126183b3294b1f3469db626e49addf89de63ceefc0bd44a79d025d47c8c6b8470dae98ba10995464212e651e6db1a32439ac72571007a62bffbfb75817f03db434663c873cf5a64c0bc620a291faea1e11e6ab90f0a024ded45188c6e174390aab410c1d4d25204b8b57546877a586706036d41210519f0bb3ef98e5681db2b79540464dad00c57454492edc97f9ad8c25a507a0c981a4d8554b0fa77e6580dd71e07652b051f52e27a9d325be30991fb5899614a625398d43a25748958672507163cf44c1bb29278a93a3e63247071ffce66b1013801bdbebd813a42d2d03b8701c6b40f2869243956f3412d9af7016ec34184aa665c73cf4643f49f70d83f64b2dacac7c1602f5580d120506d07218dc94b85adcdd6c7dd9542496a90642263f70712d6c817a70927ee30dbafb9cee3905676b6909c34d9156bee0933ae848cf22c0f91e0e3b4a0f0a6b9547eaeb8e5104c1ae428cf0e4e501d62fce70641296b8aa9828877480130026487b52e167de61fffa76d1bae69d40180b032643296212deef3eddad5a9c42185925de586180f2e6bea1101890a7de091825acd52339a230501a6c8c6cca7966dc43cba8478060112a0a7831466d3ac5312bc8cc83f1626a29ecd0075db629c7ab47ee4221a47934b635df9b51930c366f2202e0329421417d74e11cab9541010c3c0c76d8e1cb924cecd0482afde7608b2d09b95cb38c503857322f18bde1043d93646e216de907479e1ddae18d6d4dbdf3816d265ef385a226a0dc03da191072ccec9c78562716fac7592d8922096311c7c048be53958ca08a4022115444cfc09f7919db15708c48b05e5d2d2830c73725ad9ac66b41d0ad757ec4e695e56c9564ed953346ead566280f3fab433a596b6d649916846c829135355e274c5d83f04985eac92db74844876c1edf21e5ec862e0a556b218d3d46b1731a07abc222beae88c4e3ea5d041cd1082b72a76dc54e3a40b8fd9d66f59a070ee6cb4ba2064ddefa28e726b87d512d6a42d2edf2d8f5635617da749f68a824a07bef4a9b44c3aea9fa8f1d524e0ab122d07d84808f2bcfdfea8624a28796fc94fe3d09348335a2db5b583e91c7e80bdbaa2ec30a370a77d30c82a057d473184a880d1f847cb6b07f1f33f5f006a19d9b2ff193c5dd5ed4ad6f6f3cde6b69252e16f97867d13d41a5c3a764829e60b496e9a2776bf7964eca5b88363f9feeba6a3918100a0aa8ce35692b2f9a456938cd614b510d5025ccc8a6fa09d2a8d746dbd958cce17ec1bb8f996bf5ca0d1bb1232be92e0c792a014e3d410c61db09732efae7bf0d8a54623b31fffe20652c674248e68ef2acb8e35aa0e84c934917619b818fd6897f9391c285de896708d6654036cb92a253260f740db9cffae03b52068401df07f29d06248ecc13e4989a8831450ec549bedbe9773c35ad72e1056e15bc5af5f4e49cc9fb43ff78689aace7a61fc13b24e56131dd8a694c3ce333f3cd2183ded4c3d9d31bb2a9b3d49a0dafbb6810d57bdbd17c512dacef0bd95caddde8908f301cc34821eed0cf0ea34d38e211ce0085930e70baf8ccaa357c27cc20b2febe9f44465ad06174d54e5a3073fe50b07d0ea1bebda1a2d2ade688709d8bc9e7b376501185cd66172f865f6d651994aedee208afe22d56b1164be199426468e01ee0428e5212e997a6d7166abb42bf33906f6d1e26fd8c0689e356323c72910767cc01dddd9615ca5053bacc704fc64384be914285c406324702b9c16553c042665cd1cb0c647f7b02494fa98aa2932a5713e3a1c52878b1dcfd95bbf98feb8f0e54c54569076ed29d0308cf0f7afe677d10e6391ca96be92b6a0e889761c5873ce2b16543dc9bc6b1e0a7f3119c3079954172a826f9079ae2c236c52b2355cdac0ce6a62f48b0ae1142b8256a2319b2ae8447dda1e10b8ab95a8923c48c9759a37b30a39984ea8cb38a882483b5f2136508d9ac558a659c07b6e95603080eedd1c12bedbc0e18ccf08544f99f18f10d1e98fa3f764802550341031edc40f53579ef703958ec73d39d8bdf904b684d51c1fc2a525a079dcee86d323130c545fe9873f85d681e7a7db3e9b355ecf293b57ca0afcdc0eca7b8250798ad73a7ae0090c96770acd4ec3b90da6c72e38b05513df4d9aea280c7f78520a84a0d400674b5367456a37e2e5fc3e15d639168841bcbbcc1a2b656fda385c75189a2bac7f13a1134c8bb4df1f86a0963d6ef632ac22262a4831441979ca1e078513ca3dbbc0301e73425bf306ae29f887334161d93b22663a5aa1446f4859931cda5e1fe70394b14022633284509521fc950ffa3361f2f1e823a4196191c9b7bff89378cebfa1d2740fdf00c17f69211e32788d569081b41b5e5675cbb3d44142e730ddce3abcbd1503b45fee59670ee16b50c90a59f2a81a61aafd14ffb5e66c62a7bb2d34b4bb7c7636171a6ac9da63affc76c4c52f46456267dd0a83d668a0d39b316ef5fd3496fc54f8f02a37b0be1cbb57e4f83b245928066413ddb17164e6f86e8623a6c0b0402109029a809b04f182e58170f70e52645fc6ced4cdac24bca0d95554d102c75e5eb72a075bf92cbfe73ca2ac3636f76239d01b6cc3ae2372cf0abefd4c9c20916e01463d3fe825a30e6c957f2d832b512b6019c65bf7401193db79cc48065ac9386aac62790f2e6ef998eb99b4c042ee7e48fe8c0361d7478a6f4c28e527febdfbe71ec62590dbd372e7e15d1ff41107301ce1deeb6f29290da075b39d65ef17fb6d7db75ec94edf8f03a64ead461da86b96edeb9cbe497105f2e700ebe1e7679a330cde68c50769d3e58b6ad8429ecb590eb7d271ad02d5b82ceebaec0eb63c8063c80567df9b64719ae977a6fedeb3d50f4018b0af8fb22ef41b8bd2e008ee8ea3c531e440fe76da5a98545a5c02e5fee7feaf9f17d5cd550c303d11da26e99549b9cfdbcf3ea03192834ac01c1cf5e54c984e2e8517ebab552517ece1fef8e938967f42c3debaa00cd2309dc799deb72f1134cb108ca23920037304c725bc1564a02b59cb1c31b08ebd5e2efd474b9d74e147c96f272e27c8373551b953296a69254ef062546ba9bce5dfcd5cc2f5a42df8b7e34502874dd8bd4ef4e12a1c3cb0afa7acad375b45d65b35da04175e7bd679cb8955be3e1b610f5bcf5a7d9f8f2fb50d140a753e7062aca1d2c21116d2df3c0720aca4ca553dcd62a60d40c57b22bd468c02fbb5eebe3fbe2bee502f138df297123ed4996e6548594cda5456cc9fdb99b6e421b35a8a2a4197bcde0cbec11e7fdc505aa91202402df732b734f3dc72cb4cb004a30355b9f19af94357c8dc21a2179a9dad4069589152412bed43af6ed11aaa7984faaa14c7141307f26732b5546f32937c5b2327ac53fc190c445489de1c30d45843d0471ac3a8858873dd1958f2ec1000583c15c5afba1b2f64563e7fa5a5b1dffb7839260836e90025ceb0c9614501fc1cb36e76818a1f371bf4fe5ddfc614bab761f94140f973f2fa13e347fbcb505b7c51c6a5082a42cb5131f99347c15c6745a67ee69a595cad405a516ded66889e6ba4056a2966a374cccf8cf22bb04d92b48d49745ddf4ccf001c9ac9a8fd27e10fcf89a8f3d68dad8d7a5ae9fc43f833b39e1f442f43d4c3561fc6be5c3450c4ae9ebe9b37ec68ca43f293b2f3f183cf032707173477142f802d6922ae17c719fb40773091c2f312993b30bbef1de04a05828a74b07eddc5b2523f146245c8e84af0b72abe589fdacfe58187688435447e126dfec6642cc74cdc00a50eae54603e353acfc5a346c2647867cc44b7a19bd55ef39e3fc682751967094089eba00d40147960f2e23055700cfcd57f2564727126a0e431e47e78f8a7e3191a2d562e9b4848d761b92004e247cca5e8d93bfed05340f8a081ffffd66dc6afa37b062b40d78a54e5a0ce53cce15a541c25544ccdd76a3396cc315c3ff4e15c4f5e8525c3b5428932e4901290376dae2583c3b761366c4c62173c0ea85a59f88a0802075664b54d712a58d0fd873ac00911a87067899119320d9f2b8f534520b3ec9a084777782630c991680acc8b6d47072552dc72f2c7093534c01264a7ee47456170784e0b3ad0613c048faa77a13dad106d80d7e6944b11f130a8958c275b49e85021bccfceea69330d629127fa99f7515eacf08e53deeafcf4244d34652fdf5790f1ffc02922e163f9493d15e4deb39b70797d4faed2d87cc61139e5dae897368fafbec9a07cee88dda40247cf27341dd82341755b94d17c07549c84eb1700a0c3a3290f0ad7552511247595fbda58dc61092a95d0c00d8bb6e447067757ad9299e100dfff9da74a2ed2e651e6e2cdda2659a68d73c1cefc72eadc9850cb256a86c75718dd10974de84f535c9db89963aa59edb3db5d696603fff404cf5ee31689de64b1a24e5daf12698c40cbcf1b026052a6e59af2f7dd7a79538ba661df674213485e43a6eada3f6bcac857b6abab799152d73f140f254a63c2495796e94c84b06934bde2ac35d8662584d6c91b83632324c9938fff371965d7e48db0ba1d0284f5ae4904cc552da7e166bdf85f0095af8def5e388b7cd6eb6c6e1186bf12566c358a74907462fbedd3957863abb90443562e1f7daccb15ce3999c04ecee4fb47d225af542a34da2bdbf5014188399d5b0568852f9b6c341ba1a0a7f6195e8614c9e453de5e1c7f667085528b1526244d540e02110f1a86168a53208262979df0eded14ffbbede16c3380630440e6642020a8376eaf15c8dffc64a3676adf54e37ca12487cf58a13866fa07d8461563efb4a3cb94b170d72dca648a934f8065c436c4f4ffb8fd15ab4a4420054ada2f4a9fb3ba15c8e90ffee300af4b7fc6bff345200a6b505082091bbadc9b826408f0dcc9cd6afd880899a13c9ce6b95a1743b88ffee0acdadd0ab8d0440ad4bc5049285bd28ff3ef0b3892a3d2a9a0c23b94cc1d7491de50872b3d4f47cd62ae97a5c0a0ed4d9b01b66af0862d04004a182fe66e1adcf0da206ed4a7db83dbc80baf24f0f187cb8532463eb74a58082d713027555d3a9d621ace12f9063f25555d0b599cb02c7e4c711af9fbf98cb7e7e3ed30d8f48922ce5470e120cd13447974e3382337c0ab58837f79917b6495274d14d56e2b565a8a11478ab4a53479dbb680fc9f8bebf8aef0fc01d477cccc36ee4cd73598660eb755a7b60939da0775751c7a688e1b7d9e0df58132ae00d6dfe5404224a01d99f423684becd766645ed6512782a7c99feb9340a39f03102d552abc9b39fcaa029419b32886173462514d6364a0184a8763e7983799223a5b90ecee2457b4a43d547c210742c2abecd78279a92486f63b533b10a4b78cfa731edcf58733ea46d5e22e45ee0571817dc20bc26f4d5defeac01031b3bc9fc8621e0c1d22a7c27d3d5a7a953b4ec583fb212302e38c08e8a27aaba1bb202eba9eea04268c873819a95f30068cf166353159519768ab6df56be8280b8a0be94376ccca9edc97458bc1ae1a13839531fc47faa71f0037a463d6c52f3641ae199afc8b364ecbff481a84e40cc08310c1c0724309059342568d1c87214dc6ef5ecdfa7db6500ae260750db09abf1295a3a1dc4263b1903efc2c5b25306d3b15a249fd3e2f1b05796187532247ba330a4a71bef9a656724bae28d7ec0aac70b004512dfcde5935908c3f135a34a7407b1db167d7f746e337e4af45a0ae5b55da1fc995e063b75a2a4ac7d4b003216a87e4e980cb7a9c53e8ad0607407c1b5d4d936ed517139b511cb1f472b94061629301ebe2f009e99ea1e066a9cd6bff1bb082647235e7a7a1b367e722a9ab32f45db139a29b51ef9fbf9b81173acf40c1eaa49746327ad2a9221d15c9d149479b641412ab251d05e9d248acc224594b1141ae1bea9f2ad4db7dc78bafe12c7d2b9f590129f9bb992b585e6a8dc0c549e436cf577766daf3d93b9fd6f9e9cf4eff6c5ae7db3d37cdd96a9c6f776677e7d33c9bddf9e99d4dff7cdae1f93e894c40eed1ae3d3ebaa0e3f682be14cad48d8621666243b79be67d137f2dfb1494bead4283f54fa99bd00251263efd2b1c1c4ae9895db2513eac86fd04a0b23d802d2e13b8c67206d430ce0074c67980c6780aa44116f0aa55f00ba209f03f77119531947ffd5fe8dcfc269f8291bf5dddc978a37ab3b1bb3a3475eb48163b16481f4d645abc2110f5638465543a6eb6caa3c5b109175de5c08595410bd6ba1fb4d495bd1dc4cb2f688b3dd32bbb0eef0dfa217814494f58ba6b942412d55ad0b00819eb9077f28c862c2665662a104383b462db19b5372c802d3aef8ca3a5fdba967816d6742d8e77068945658277a63ff00f8487c29c7eb5b1ad5507ed70d34c729ca529a3d96792068e94539e27f06109c4a67e7ba6cc28444312ba215aa36ebe2a21e9dfac70ada1ab62c2b1f23c4afd3191a4eb1d8ecd07a7c2e532515cd2cfd1e438805577309d5991d1d70da91abd3b26622b562e803ad39458050705cbac44bea8ac67c9bc40ac986d22d60f30aac4455f5a666724094f6954d43c0ed844f7bddbd88f769e9f6223de5e1065db48422e1ec2da7e28bee55641d242dca92f93152d0daf49e35ce6178e1a7d1584595512136e12565f281d04cad02b5a4d6c6242f63c6fc77dd8c26a1703cfb7096ce501b9d9081ee664001bdbd28a041a37545183eb57a7ff8b55aed7a55590d85f7eae50107caeb859e667d07305fddf9b44de8719950ba5a275063dcb15ba3cd333977ad398064c902b1294343582c97494abb882c1c5e28a2075b16fad6a7b2de00131b340f19990e994046b965c72f41f94382bd4644f6eed8494672d510ae6af1c03247dd7a5eab47377170a4c99a8a6e3a578666db6088eea6f47827676e66641d58ca01dad402a5f06f0ebc6e3d3f50de87cd5caeba3423c8e920a37368c712e0235230565eb51be06a58aca038560f7f34bb2b6bbc97618366241c3739611471e545481366dbc8fe8e2dabd0fb288f1ef078a31b5a0791d81914358004c4dcb0c7159b781710446e0f172f20764f8e5c390cc03ef0686a2c897de0cc194d70396ccff69946804561e3432ea812e12825bb260af00af6444d511331c7b1e9f6454c220335df6c5884b069f13502d0e78adc492c3764544b0bf76aa8234962572c7b6960ba3abb97bba6b86150c43f9152531250452d8766f54e230cd62bdff14dbf4353f62aeeed82a4074bf9ef51839fee6354010a94affed4ebbf01be316614eaf401c1f30bfb5415cb098df61c567e0188c44e981a2de0866e611920e86963d1caa944e21dca1a005b5ac145e9e556e383597bf2f0a36588301f8bf072102a6172b819d65b9134d14f97634e3065fdacb9d5134b54b58470ce12540282b1d4b1cc0fc83e4c66f0e89b60aa4f941ad97c7e5ceb9a9bf5b623e9de8a1eb3b8aefb39c5e480840643b844769e1c1618190b14866971504cd8970fac5592486e38557a4a044665292d44bfac56b8b91698a6da0e546749f7c6fc6edf5eb69fbe4cc744043751318718e78f6ef5bdb99f67adf59e822a77ecad7c9dc8c8b11cc9c702bd2734007531cf7e3f8f01eb5dbbecc41ba611dc80651229ecec67e2e686d6a3aeb4442e63c4593ddd5f1e2b0da56eac50e61bb6aea5430a65401fefb62f4cb44cea430d5c491ce5068ec3738b2ea4f6173d2246b2f68feea56d2dbb9cd3aa99ea2f9e9d6cd27b33d890606e8354f44f186f0ccc4e8c56279ae08a83a5868d18140e1b7bf911e6942625d030467e4500c027d9406556994e0b30ae676486d1f587b24b854450a8b0a53ac0b54aa4d37509ff1459942191ff03b49a5c43d55a0618d20e13ad14e56e3048d140f1ec098eb10b39a8d2a65124adfd6609891387e722b3b1054a0ad5390fa26d7d06ba62132d55da5da7744b9d9834d41971b192260fe4283bf1dc011088e73550ca37f4b07533d123ffb56e1969c31f5321539d316305a5625d0026653180ad4252d79d33c4b2a5a3ddc1408155f3fdc0698bf09ca2d71dd61261d596c18d8b1cda6d0d2af6cc0972cf9a09427e8fb32e4e897da040d5a0873c9846dd86054a0186b92c172c0e25b2a8cd075f07c645d371947ceff939128a626cc693a700c7814513820c1910813fcba056c62833c6c0903f2c0dc76c8d287b38cf1a38771f720d3deea0b11eb23de7e300b01fad92bb2cab9e75d2abe8a201e3e1919f053135e282811013812f7e3a6a1d34965a5ae2c84928b6e44670887343d7fb6e4b40670af3ab214f4b6ccd852520efed4e87650eede6bb6316ddaf2aca9d9aa028fed7b62bf76514b3841ea190a53ffe7ebbed5be7f0d3e43385475ca17a4312136c062d65cf0cef55cf8a399b843872b557aad204ee86b6419385863853b9452bdf29cb4ce5afa43f35d9f049dd83830747ae54edaafa7a317cbbc2920fd56c48c5e0c959cb49d0ae8afab203ab60b8f9ab9b3af31c7c12e28b975110d028286284da057c1e649c1c347fc810d657010680ee22202dec9873325d71b6590c12c240e77df9a6a3ea56ca0f6b8ff19fd209c438ea9d1533ba692e7f701819999213b94e01bb6457e13cb2601e159c2b9ff24841eb1aab7c34ede8e999eb76bba45facf11e77ab95819683dc30e0b11e5ef13d64214aea4ad16eed5cc14c82a2fcb74a37414fbb4037a5cb925bb1c20069d6f26361de7264a940ee7f886443b34c62a86995c25361e488bd0f61d6a13ed044d4112d43e2769f6bf8b460f98e2b4e61a0cf792853a3272da6d25437b1d3df5994d09e584a19ef60c814232aea22a144becb55cae7b1b8d742ee1898d4fcc69598fb17fed3311cba56febd12ab3a8f499b1e2e32c8fb246cb0c4fb86ab71e755723df62ee64b7bcf4f900e0ef5fc269ae48531ac5b7b56b9b7a3d82804c0f43ef787ce39545983a13ff10dce6fac1919a68ec496d7e6aaffdaa77c458a8c45b52bcb52b73d05d4dcc3268e02aa544b589a21e8b5863a30dac251a54c55b3685a6fb3f30e5b491ebbf69e7506553ab9b8d04f54b4ac78a54944e9b72693cad650e37d52e4e1e5f36e3b83ea41bc81499710bd6beb0d450c1298e58411cccf331e2b325a9fe1d2abb1d970b4eb36050863046b665f1568b6ac0685e0dbd204eb62ec793780ffbe259f8daa7fd1a25570383b0ca01b6240b6cf7163dea40233f5e02be874c9043d1f5a283a0d7126069348eb9ec5a0d8152c44fd66af8ac13de5c0078a4bd870c7a2615bb0194f3f8463f6846507d374640010fd3cc6d97fe497f5e0701d398ddad64a1b4bfdd7f05dff5d438eb47231118780d488c7ed609cb8f3a553a799593e085188dcec18b20edaa6e83c3f02d08cf5bae97548d5fbf4f0e89bfa67a58df54a6742f25a85d3043b1c2db38f13bd5f111ce3a3e8c21ae3468f52d2e5e878c4cd0f4024dd2cf983eb69debef3fb42c4c7fa6355231c35ea187aaba94377980e801c775f663e04208dbc172aa7760ab488d5e7c0d7bebc7f5615df43f3967b93221834cae9a4cdef8132fd12c02e4cb422b38d4e2a9398080994d54ca4151dababb8ded5bf64d6f2bb7c1a90970f40cb97ee3f0ad416666053f6732a1b8616dd46acee147e8f7ea1c2c0157b8c6fd9341de78b6a1dc7509748bda15fe533de3f7c442c74453211616bd12b840fd9bb15c67b5a30b38d58e42b0248402fce0c09a6fe6e119133cdeca6dc64eba9938e54b110a8e0d4f8123b1aa9bb8df05e0f48462c24330c172ab1c6474bd01b44f8343e1774c4c9d64438ecaaa5ab853124dac30de8357b45ef080b51c9ba114389c0dae8642f336b0bfd912bc592f08a450ebe34a157e877e0ae0dfe081d3a07397d30e036c314b3af262803714d822dea6e26d2045f6ef5b8fff606dbcafa551f697258ba03a345a84adaf95e54ae8efe3065fe740e2b0e848f30783a45845ac23e535405fd8d18b4db323b2e3da1119f4c5291340223988902ec96303e7bf741ee7b5325572a828d398a1f9df7d8bb9bfcb3f41cdaa84b2ae024e92430669db50230811231267787c2b6d49484544ea610c1a97172889bbb205e56207b620b00e12b905cbf2b7c5431eeb637e7d73641f098fdef0a040c490d39677cf24927a297f49547f14c75fc93cbf0b0f62e155f34636e27e1ce63077f06ea33fe8f55729336a662c2f84eb58b58539610e45703820a8b661f1626490301a1093df739b1546bf112ab5db78a47d1bf7d6a3c288abd3a5fdd46bb1ef510fcefb6b112c1eb41f1aafbc393fe340bf5006d18ac9f0b41efc7039b556c36339b010d235c285d5798d011cad41511f90c6a59f0422eb7da9d5d5597db2a9786b795a6220cadd38707826d96f67f7c1e1952a308edc570212cc3320a8d74d6baa6bb185df52993047c04006cff1b91f4928591c2c5eda9783b9914ecd3b561fec9e4ae78563ad02f260719daa7d8c77f75d0ea42c8e61a3bba138a488c812a1f0bb63b0928c56d443fa9875aa769e8345fde419bdddbc242f3591b5bd0f6f78150c9bd27afc688ce8dd904bd4db47517753508e6de6fe81090faa31918b65b1ab1e680ff674c588b1b473587a6cb554ec76221137e18fb41caa0671d6e5face9354306f53c52b7d1dd01ee29c3cb1ce6e0cfbaa3b92e6c6280c04703a07f36ed5a375d67b34b94c67a0b5d25818856334eeb5b9f0e65914848f33c9957e69e404d96b55c0fd0d57130ed243a90bc5d48e0047107f184e19ea0a80170efcaefc80858dfd28c5ea9db1159313f3c17e58568e142875f6dce35fe12add1e0df965d0f9bdf6b62fda83b13f0c194aae7e3744ab0944141ee66a7182656d85a1af3a90762a47e5e0638d37f90160f5fa97fab38dd4c63db2f63c845f271c04574c9aa4f59982b414aa97aff8834a4dee5b2e4403505b2779cbfd9f6127957a6d5b29c1c036957282bc087eb08f1900a0f545be1fc08c93f07bfcffb789f14c4a60c386de0d7e21fd0811d78e420c8bb03a64eda00f6ded300054d65d62bb29f0a6470577388e1f37122c499d586c89d2122683c36651f7a6c1c133ad71f1e45dd3620b5bf06e7f01dd4af0140f747ff940a4cd5a0c83e4c7a1540371479f8a386f126a302b27d14e0154ea2be0cc47d2515b945d059f81e38c39cee3baebebd2c86f0d10fee441186e130230a67b50ea9973a7c5a1f009a35554c88defff99b7c63d48ba16b371fc403ccfd31f3c589b5af5729ce12d6d22771fcb7836e85cf602651a76ada45370a3efc4c31d256840832d68b97da852435f4ea2a88d9b1ac32ef66158bf3e33d72bb8340e332ab3f609d90a3856679d95ff8446e2b11678a5912c772926a7aa698a45442bb80bdae079288bd64c5994c1c9cc7ed6f5fa0f4a935162e742b766be5395bf85da0032a182b02116048906ccb22c738611394a09d39f263be3c923f520a4823242751703f5755618aa4b58b2a84ea05e459f9cefc8acdba40158a698e9f048aaac749194ea1b35ed0ad0b681442304edd02bc8fc34032675e242f662d8800150a4feaceb79a1f2789830f0afc84d10242baa9e66f20167f4872d647562482f4b7cb2029f89195ccbe0e54a88c6596cfb956a546efe4cf121aac3e1d5380200de9adc646559729a142e9cbc98d9c91a8ebe400628617cff71a92ab8c998b99bdc34aefb7cb003f0e462facc5498aa8acc5570d6e059e169f149bfe84bc1b224a819d4ea29708a1b71fc9226b8e89708cac510993fd3a04011b5570b161f765a25b5571dfa21d1c1d52bda527b4538f8af305a7f6bc20c94d8e405b4b9553c68c06c410b0b3a438d410b0bb45a7bcf2cf5d05b207f0297bf96668f62f8c0589d60797de1fc2f5633d89c1d21db2a2c04ea1c5445daf793fa6448df45b9792a5c0a05ee1da191eb4167a30b0c9303eace42945c30542a6e0e192ef6a0159a997af4cd3acfc146f921519553dab26e6ffecff6328bfa4b6c05e92b1b8465fd3b895f75e8874ccfe7136d8ec64c261ceddfd495e2a25f13a9d0f24ac9184a947ac4eed213f1d6c4706969691329a594325309f7082f096227ab34f835fa2aa970cc74d005a736d263dd13febbd24df49a9354bdea9cf05896050a27ba1922c2ea98050a9859a549d22f90bbd942a4e3d7bc05764bfc3cced837a67f368441a693aa4a839f4710f6d804c7aaded8279d509a189b903e385695061fd9f74d9958c76f923e1dbf4c4cc68754d51bb105d6b14cc7f193a9f8aa0d1e30568d216c6b1f3fb863be3459b2f6f089629b9a75f5d5dccd9c237b6c7135da0307dbd4acfe32b50eeba23491d6459d17a577b4eba2f2e3d7e845e91e9d7ae3a23b163b6c0a100c74a670e17c16bcdc052286d0c2f9ee1555602c1c1e46455c7005e239c285c3c3c6da2187808b1ba87078182571f90e29001d81e2f0b00dd9e17ea1b3821487879108c66e370e63aed2d8d78117467c707ab03cd86b81a0e99a1d1af93df4db31b5b794838b493cc079a4628fb4cd2df10e6793c36ab14d898d2b9560571aae2b0de9b8ed6d2f0b8dc84599362d3d0bd254da4a63f594feedf103b1e1a58d0c37df3884bd6d6e4822639bd547cf5219704abfd6ce7b493f0f5ab0d6225fb561ea9acf0c56eb4353f574089a0a41449f4289730a2282e89f06b7e7b87f5d0e4ff757c857c5aef5f3584264595313721cb8f7378e5fc2c8b679836e105605e1d4121bb05dc3287e61184e718c48c78f9f5cd4a84bd9b67b57b6f62c9cc2273ee1e7b8bdc7f14fd576f1e9055b9366d72ff77775cd1cfda660632738899aeaeae9bc289d4f20c50f5a74fc58243249ddc4a7b5714ff835d3f6b66fe4b7e0759ac85b258026008d34711d348108ba89511713ef186c735b1f2caa9b9c537cc2fa7d7c62b13485c15e2f6cfe43d99acc537457f613e9c1d8b3cdb163aed2689576c313c622c24abf2ffdbe98199937d5e8c00fa6441ab7addbe9765c1de73199d2d62d3f53ea6a9daeb3ee48d2ed743bdd0e0f592111a00ff84578864864533a27dd83ff7d20c8ad68263a4743462b6ea775cbf36c9d274afa66be999611ccabcc9c969f854f2b7c529564427c6879a14d604ed4534f13a59fd21659b44ed798a22dd776cdf0d1cecbcb4b7ab6ce1a1de79951cdf8c00a62263d5ba709edbe136697b228c59aa4afd6e94293485d2dd485569a139f5c7e62e9194e7a978a31fc792d57ebe542bf0ffdbe8fec34afc9090b89b8a89214e017a21169da42bb7406ad3b5a2438134d992204a2d581e7ce4da175b6d0f3433bcec3790b05e768351ae214cd4456623af00167455827121f9fd0c5b9a9e7234da8873f56a53191a0c9091b0d519202f6426b70b175569afb222b5b3402add1719e1a35bad4d3bed49e26564b27885ade3fa580bd943851cbfb629d892f149f5c2d232d2a586710b646ea6ab94ce8f991a1abeb5c49d096cb85b68e9c3be879ba5cad23e78e6ba70cd7e97ac136c5d6e972b58e9c3baeef3bce1313433eff077dc02e4e14b402ce4433d119274af29089bae33ee7e112b547123585fb261ea2f8f40a61612a453ddd77a5ba54494f9223270a8c541fa355abde7c2d551747fa45998cd4d2e403eb0ce22cfd9462284e95c0a8272b3ebd94453d5d54a989e80c27a520b4540535a1b1163e9db7dc71a12f58ea6ab9bef4274d4742f4fb3332288c5a684b880a455114457550b4e7d583a23d4cb4501713ad23e70e135ffa7d29da4ac1b4ee10cdf0497486456a6a342464e1d468e503fac0ec7d8a4422d10c44e7d9425b4254288aa228aa83a23daf1e14ed61a285ba98681d397798f8d28f1c9dadb38553218bd58a5d9448a6838a124d11cd700a9c9d436a0afca29e700af4c1a73b6a8d50008a6633d10c66ef4e74f6b3653a59a520d11422fdfe3591a096e0aca6e103382bf9945258690bf08b520cf4c1a95213144cd1baa892145f94c4484b60a4e989824a63a4ea3872bad0173ec1f0a985b684a8501445515407457b5e3d28dac3440b7531d13a72ee30c16a7dddf7759957189e552a90dbb1e33c2fe4b983b64e17da3a72eea02e5712b4e572a1ad23e70e7a9e3baed6e972b58e9c3bae73c7d53a5daed69173c775eeb85aa7cbd53a72eeb8587a68b91928e2fbeac764d7ff429734b1b5d65a6b4933e780d16effd68a2f6631715001808cafda3067ce5b863bb7b41ef66ee7e361cf7b61b4d7f75c3865f28ef4fa9e918a1abd13a74a5fdf6bd51bd1579e45c7a173d2eb774d2aea862e566ff6d7efd27a33fa5a6735e6ab69e6ab19f5545f27515359968b50cb5b5f07515139480f51f59ad1e8f573959ad22accc2a997afaf5bfad4ae7ad3f275566f42cf846c83b145af9fb388a24a5153fa85d257d4f2be9995f4fad9898ad2e92d63f586e5eb6758bd09852cf1796f9617b0804d438319bfa656fc2c38f66fdbb8f8f231d99cc6e98ff3904845d05a9f46d25bf290c211ec85bfc0ea0e25f774f9b51d88394b8df00c918c5c2325c497188568062214947551eee9fb8edb114b041b313172892f3cd23a31c465fa8845fe381adf00774bd167d4d12d29c66e093482612e06c34b9830140a737862ea4d4da914e6f0c460aebd9691c84db29bc27daecc9c06c3a7173ea1ad9e268cd4935792fd94d028cd4a62d493940e462d5941f820ca7e527c6231fd842f19be63f8e8db3606840131ff5e5e5eb811ec1fe78989810d6122c5a72e1dc15424fb31c13cec1fbf8075d12d930f37cc826632318df9541af1678bff3027ff8fc8521012d5cc4fa589e1934bd026cdd295fe19d1480c7aa418be76cab56a8035c21c4ffb986c0d243bcd0b91282146d1f9987e3a9f999fbae3859b524c86aa1119161191664def624f6e0a626a836d8e602fb18bca3f721eb85ddf7f9863ff3be7988bfac7796abc57c375cb9112b5bc2f82dd804345894f64f007f401280b55214f78866808835ade0f5f5d8af65b8334fddc32c707bcc7e0c39470a101eb33b1a6cf643fa2182b22a6e237c59619f58ff3c8bc27d3f9682698889b5ea94989c90953ac54a5dfdf235e92559afb3850e9f74b62d4f2fefd192e9a788cd8a49e6cb4903ca8d03a1f1952860792bd91b8e6c2275627c134c364f31024c3d72dbf0f7353ff2e2896388df3bc902452d3344cff3cafd3c25003b01922ec3c4a6fc94730b0c6a9b9f4af07b8b50efea7039ce159a5c2c1bca554fa172ee4e57fe07084fcf038427ed838ff357ee6359e832e4a7cddb20815253e514b510ba74c3ff8a4a3a8a951917ad22f9d5e1428bba5bea2a2c0295aa55bcfc328ea8efb35780845ed717f86874ed414ee93780893e1610b0f63294e852a33c2308b7abaaf4afb86f34286afbae33e8f9748a59ba294d19b6294bec52b447f5f6c527d8850aba3de809fa24f38e9e2eba24c4d6a696aa29e60a11b222a222ab7c44f0a9126a7494b6a60c6a3c7618ecba8a505268d6de3b8156e893b8d8b641fd8f6c36de374cae50859462ea3961f5ded87be42a738fcd7be8fd3c0b2d4423e623dfe4fd784deac0959587008dad8680f0386b84ddb9ff6ed4f244d9fc8eb449dd7bd90a62e2412eadc72e4d282cbdc63ca36c5197a0018628a6cd28fae9134d9600a527ad3579c12ba038934d940fa988f2183e08cdf038e1d9ff435b4a1447e2ef26b8d1ccdfa05bb5fd007f4017d575e309db32921824d718af4f6bf184e8d6f85740baabacdd983adb617d7fa527cb25f2aedc05d1ced40f8894f42b6147db5ce52be6e96fe10e5a2e90f66a029101fd0f98a64178553ddb3b9bdbab6811cae5dce97eff09d8cdeb247db0a23a46398153f5d7ce796556a6a7bd513fedcf1b63d515319552b933087efdc12772adbe42777899f16368cc13453551afbf5622006999ec91864fa25b9cf86345cab7d42f4af708800048cffe98ab5b6312c26077afe1f976724352ee8961686120331943d86b2671014816cb5fbb2dc17afb517c83dd0d8f93f93a08e38c3a9910c0a430fd63f0bca30fe31ee9d8639a0935b62d1eb87c827d4f18b7c2e2aca4dedb44ab81acbfd97c3a9d2dfb71eac9760256491335942ec8a6d6eafd945d174fc20d04d8940e2952b9734fe488a403357b6c94fd04724037d706a7bbd383c3ee92b89fc01b3f6efbdf776c0f21c3847f9f6ba25dfc9243f6bc0c00453182157df5b8a40a5134c5396712485be25cce108b07f247a96b7610f34b6f7df6b6fc318bcd7dd877efb7bad0ed3a5d27c36fcb187306c64fe511467b784a1c2b95bf2e7363810f4421a8b9a2a91326828fa8bfd03001d7f48e4a6be5b23dd17c8dd146717d4b9a5dde0917a63bb26444e74aba5e836896e5b40edaa37b5db7ff1f3d922cc08338e248cf1f61267a620273bdf483b6c889aa4e3d58d24fa0db4df788543541cae2e49ae2e4dab9473288a7d51a64f56693a0f1558539c6dad6e8e23d8b9ab8458bd11ed466a5d6bd9b4c57c50f61583ea8dae372e314d64826dffde7bb929cb68a222dbfe98bf6ab1b3fdd256559afcb16ef5eb19ef15e66c4b826498e369d072a1ee8ca8462a096a101586cdacd1b5ff78889bbb6b0ff26c7e3e3968b4df0db6bd3625b71411d9db5f7ef29d7bc297e4e70d362702dd7bba97efdc548914832e4f7261563d3da6883d3ee94dcfa76f382686f3139f4c64a90719bb6e2f12896d8a330e9676fdc2a7ff57b2bd2a0d7e5114216b25aa223cb1e8f86b0ef68f7ae375fca709a04c2413c9c4994c5f7ddf7461885cd4d63a02b373511b8c2b094ccf4599729e4186177af844e144d39ad666b825ce648f2db629928982462b9d75d63f2eaabe707b98b1cded5561dac577b0c930275cb104dd12b35ce9df0e3e1ba08d3047a4e496f82b01078e30a7fbd3298b33712602e5f81ff7a3a10973f67f19832f2a1b4001eb27f44a45107cfa0e6468af3b0803ed3d7add4118573a4af4a830677b302b189518f4852ca3cb62699bdeb40e75429d70d5751ee7795c0412af88302a21302b719664eb2f0486a0fe426028fa2f0486e6e763e6207a2fccd1a29d4a8539f955d8ba5e551a9d6d6cc29c4d04da3086ef7b4cd91d7a002a2caa1bae7a1302dfacc1e51dc2b0f510a957b882f7c3fb9c7e909b35ba59615c376f24d1f177dcfc7c3adac318ca9ec9236c91cc0b73f812977bfda13087d39e0bc3fc9ae65905f07bb26f44426cfba42fbda98faf9fe34c67a5c9255ef37a91f80b933847f109ffc8b90b9f5c402d6bfce4307e7294871ce53dfcc5777812eee228ef79f1539c7dfffd28ccc9df12de1508aec0824896c5feba4e537eea54f4fac09007932d9ace7a2386fe3e8b75b9a9512d6b9b924d893883615d14f7e2eca26ebf154625e4a2c2c70fb30ab908245eb92526c52018d52d85dc12660586e24c897ddfcc41a3a29708967767ca2f9cca2b809f0eb619b670ca54c3b883c986d2939e440631dd2f7dcc97bee28ce4d7b24fee60b2617cd39bc820a64bf2c8fcf8a61fbfe290c81e702e697e67b76fe2302a7cc21fc345192ece6e0a6f82ac56b7af9fc4b797299302b03ef44b6eb05b621829dbdc5edb6b835d54e5b8bdc7f12f392bcb3e4bc1366fa01d9bb49817813a175559dd12e95647868b663705fc31a2a08edfc4117071442f52b629ce5ab36eea94f4232986368cbf01b171aaf4f8b9eba26e0eda5eb08e9f27b9a9edb5a55cc906ebf8b5cef612836e5922c5b7b2f59b221918dbd469bdb98f5fc75cbac975fae4a6f87939da3177993a95d24df14ac76250938a12abd4d249458940559c8956b619aeb2e98e2b5b69ee8f9cfb58005b0065bae9ac34f8732f7bfd9833b6c94deecc99ec5f0be110d22ed2c7315c41c71f13e6e4606faf7ae39d292f089fecabb8d5c7e22e803fc05a53a5af6f72e3c75053255234c327fc245256472a283dccf1beb7fcc78599c1667918255b240baa372a9c22bdf6442db7d79bbad54d71b6d2ba38d32bd248c6bc209265b14d7ef2b3de801d8b5e335e6c5314bd3afedefbefbbff1ebf48c915ad74fc305b53e2ac9ecea82950864ff88bd0f18baa7f566c59c72fce702a5cadc4d92c8c61ebf97ee69ac44acf27aa4e7fdd20fa7d57d006dfacbdc575c0472be4a375cbcc47ac1191165b314b1d25192519e9dc12cb2e0a5f72f482859b60c8cd914ec70f72b3ec1b377510dd144d7176f3cd25150f49d357bbfa5e9267fc1a1ee9382412eaac70aa447212c7919b7bbc3b7bacec97fcb1c4b66f6e2f7176c3a5649b2259c72f9289a8045d54c62fba3252ddaf239d116b446474e4a2b8d139da1925b928532639ca7b6e897912bec35dfc0c63d8fa8d1e646cdb4d7166f293d54d6eb6bd3afe0fc706e0859c9a1d3c7aa0a0030034394e30210554ca46851b1f2bb0702a5bc0e1c28f8e73a38400bc90a3f3c6791f18b2846ac4993813819474fc62d0458d1d3fcc0993e4a66e62e2958baa4ba0f4c0e8b02c6c0744e8264c6b6369f1433761764c18d5c9772e0a577123f672ed8e10582cad2f8882cb906d7218d78eebef4ada528f31b6c9f974fb19b0fd9b5d92e47ebafda874fb980625abd17ae3d2fdd41b31c599286ca407ab349e142e1c4618c9a67e6d21fda55f3cced8d7e5f4c420b93e58264d52129e182e411face3b72457a5c11f9ab90475fca15928c8e5ac37014674ad23704bfd37900fb8a5feb28cbd827a510bb8a51da2a2186087d4d4e6c16fda22f877f76c70ea010ca8280b825aead7aa712347cd69ce8220f7154ed93c607bfd56b5bdd5db0fde9cc3a7addeb27205d8647dfb1f977b8ff43ccff33ccff33ccff3649eb73df79c39fe983624088220088238788f430e55d64d96df1e04b9ffde86307ccf7d0d09f03d67b290395459df7e2bfb9637bb6d3638757f7b19eaf6c974b1392e060e86f04d8f34c1ff6c68a261bfe86dd82f62791b42cf429ade831e0c21c9bdf660656ddbb907bd0278dc835cfb4f73db7bdf711cb6f7fedbbec7e0479a4c34e0df5fc3fdd023a0e2080901fe4d821f82fb2112fc4873eb5ef3b8ae69ef867ef08d9f4df8bbaf38979b3069a2e13ef736d8efc820dddbe7c8204bd4d0bdfd20dcdfaf389f09456c73052042bef7fec79501a73ed2849f34d1709f7b13266bb8cf996ab0dd6fffc2a69132fc28cbd8e6d871237ef3bbd6e30f9b8bb536ab5b0bdc506fca6e5f877ad38d36888d860e97bcc1049d1c6e697fd41b7b032f65bb86bdac34f6c724fbe362670b204d73b9b2c3633073db7f1a3826d9e0066ef7bef6dfcd9cc69126192a47f6406323afbe2fdc931d93ecdbcd528a2017bdb72d5224a6ca7e4c80ab55badd158d6e7de8f639308610a3dbb09bc58db1a48b275dccfa17caa18b42d52b01aa946eb274fb2cf506874a52a03efe21d643f5a64ae996343150bfe1b32e57f6bffe5b729723b9b173f8b5e7befa638730e00ce82e8870d183c1afb26dcf7a4cb277af0f8396aab562fcf8b9ffb0eeb66deb48136fafb5c7382c80f6e016430ce92e35d8e6e6f1dec67def718d14fb6bfaedd506ac2117dfb106db1cc568b2cdb2ecf76bea4dc8a5889dffb3e0cb919d9f47bba6254cfa6bd01ec7943fc8f6f54d9934699206fbdad71064894cd6507ffb20f6b50fb204266bd8c81a04e68a6dbfee7eef0f7a7cc8b062048a20cc705c8ad8a6fd502c890f0683c1aacdb8edb6dbeed5362d6cfb44c9514ff651e056d8538c4efe4919a54606fb1cb7b7bdb62cedf34d82b7efb6c1362d2ca80338d5d5208c7120432eed585dd281d6484ec82e4a93c18a8d04034e93d2c15bdebccaa40da20376085d83b80e541a1966b82515dbe7a24cab24ca45e1bc737681c1132aae1d95ca0acf1941f8aa0d9385d5f1bbea56b99aebdb1ff06b88b23628fdd979df16bef667dc58c89f8eb1acf5f16ff651c176e7a23cf24b72cb0fc527fc3e3529ecb5396f25f3569ece3d7d18e8961f0e0bc0a97abe25feb205dbfca874fcde8cfc82806e89cb08836e89b57e6b7f06685b0d0d81c22be12c26dd66380b812e0a2472c3209c025b204bc4c43641950a5409b91f950fc5a9f0f525b9280bb2bc15c8f25620cb5b812c6f05b2bc15c8f256206be5ad2c19f6843390c5a2ea38e4093de636cff7645f77fbd57edd02360d93007ac6c153692137157afc5ad569d54edf3cf4ba87380b0bbc610c7657bfda93ca096042d062dbafd6768c6d0d1f940fca07e583f241f9a07c503e281f940fca07e5baec0d82401a98f70699eccbf90872b11fe46200597cb5defbd65a6badb5b6da5a6dad953415d0cdf8be6f07fb9bedf8aa0d73c7d9b5ff6cad600e25ae37679b75fedb33692aa0730f9312df74316360488f257275ef0bde9cb70d93536aa9913ea827189234a356328dae3d69c5a76b640fba46fe541d1acb9b395a63eca242affdf8e4a2f66b3ffa6834309c6a49699470395a395a398ee43843bd25c5a931c6b9b4a4e40f9f01baa5f6233e33bba5f6223e43e596da6f3e23bba5f6213e23e5cefcdc52fb318653332e7cd25e8b9532aa1a1915c618e3ee668cc9999d5b6affe36621b7d4fe7299d52db5ebe4961ac699dfc72db15b6a2de92db596b4c5898683357e1651dde7cfb3aee58d53f5c71db95e712d664dd3344d9be9dba84ae7040bac6b2c9c6a49ef497b6d6fedb5ff367354a56b63ac25e5b4df38472b8d26a38ac9a86ea93d8f33767e5346d59d00ab34daf308c29651e160755fa3fd74ed3bd2cc4d04d14df2e7923569a5d1f29b38585d7b3347ab6b8f83556f5cbaf6385af54677ed4f80d51bf172b4de70afc9a8bac6911995e93bce7d4551be6ac3ec585dffc7d2abb9fb8b6f8e1de6cded815aea51c3e8d77648d72f924074fddaea0f63b3fc8f6b7351a1d728d1eb904671aaea241775dffabcbc6963292caff2aaebcfab8bd2b92856a8579cb2013faf7b21cdb26b17d2ace9dab6707c65c47110c79be310c7546ea99f8563d92df5dbe8475f20696ed898c6389bae5b7da6833dec2c1ddc385f9b6bde58f087fa257192d52dafce65dd526b0dc066cad8da5fac7334fd665ee18e25ba5c175fb5c162ed4ada9a87ecfad65e9cb5b6719df781214b08148d44a31e1737de72145a6b472d1c0f9f16e32d5dc29cb3cbcb9317f14594f23921c288305a2b4c0233c28c5a052c2a184923e908242bade2564004a9442a1d91c4112a6e0542944c25d39323d2235e4734b1c75b8220089a628e08e26c4b17a150282433b3e2aa98a9315323c4c5f961f13d19e54edd1abfc623e94132451e5b5a5a5a9e2309ca2e475e5e5e5e38b9e2481006060686248123914824126cb4886032996c94d0ca76f4c50d1c3770b4c050cec58db7ac51a3460d1c25cae52bca53791aa3a549c9e32ded0c4c0049208104124c38617602584209259470428e9d59ce01da904503001a0018d13242e775c44ac50140070074ac9088c1855674d4e8a8c9447618353b6a766cad73efe0b1838711b38d07495ec1e6d1834768019b468f4ce4dc3d50e8d143b79010a249196fa943870e1d28a08064c519d9b163c78e145238e20917ead8233ea46c52a92e059d189961a3828d0d1324d296282adca8a0020806b8b3e0909c482c2131b9f171e303b4fc569a9dac82f1090b56480491c13de163051f3e8e907513647284944ce45d785660618515a6e826c8040917b43429f9042c802d581658087374a5a93446f46cbd32618116fd3eb8f3c47352c302252ce8e9f7c152905d99eca0dd042b931d571f5b007df8f0e1a38516442b2e802cb0c0020b2eb8f0d2831fa00b2eb8d0b9807f58ce31d9f96acd015437621dff2753836d6e51a2c040f1bae945e5cdc945c5369f8b32d92dcaf6b349d9a85c54b8cd36a0ed8ae5ec05b71c6a2db05d3bb7711d9b09c1ce7f35a9dd6a79c0b629cef819d29ce6ba2fd49f0eb5263f11d02db9f07bf8f0b3e33aae130169fd91a64b3745b22d3a874dc153ee84db71711bc943e2309ef1b70ffdfbe6632dc7cd663587bd3e218115ddd42a1bf8bfdf9762635fec494cab72943fdbdc5c03c8a8254d30dc8e1fa8b573509ea53ba317b535a9a7fb59701b1869a5b99f6728d4d4d4b04ba5cf29d9d8581f950b0e89ab5c70ec0c9f424f8595558fe9958a218cd1cd1e5a5ddb92a44e6e79b7f47517bbe5ddb6b4d6cdb5a121d8fb6dcb6b7cf49b6f6fb90efa35d3f65088d7dee2f2239e43957551b8814b008c83697bedabb9012b008d347f606c81998e811eba047caab8bcf0e313f1daa5e4918fff69a088e757eec9230eda0c568633871e5a5d9b56db1a456cfb5bbab970706d28abded48baa176512c0f6f6b7b77f476ee4faa8b970ae77546ac04062dd85733dc32eca92162000fe06dcf27e0cb52fe096f72350fb036e793ffbe014e9c7bf3e2c22b05bde29426e43718a44ee40ee006465714a5fc39b48213fb88053224d7665714c5f7a1b4c5f22830421bd8934d9377dc5b1a154224d960412f325d2dbfce4967c4bb758c764e71cbb65f9dadf1365d62b945e974431d285f0a4abd02b15429835d9dbfd2d68bbc2f2f7b72cca7aa3f5bb89d1ef0646bfdb16fdfee7588ee5588e612dccb1360318933ab898b1bf5bb203d595e4a26c4c46886d7d6e595ecf92669d953536dffdf6da6fa94bcbd7d1579c12559c0a610d6fb8c33022b9bd90a4c9b590e61e919b34cb1069d3bdd0854ff7432efc5a53e16f2ead3169eece717b8fe37f6ad6b09014b0e91a69ca10be4e434b66401320481a69a491762dc7409ffc936d5880eeb5d7b84dd724feedf146e66093613ae0d73a1f496f397293257193254d3490def4368c5f2283947e7c131964891a4a3f7e10d30b45512e8874216403619c6cdb73acdfcf3152895d97f020d64d2862eb80b9108810d3977e8be19429c529d745659dabcdec9bb9c4f3995d2f53b6996796d4669945d250718498c8129939ce6e693dddb79f80293ab7ac56a57ba56235031dbd6a629b5bbac5a2cc7e58524ed94599f948bf7fcd8cce2ecacc3afda64e6e0ba5bfbf6d4f2ecacc017d9dae7c84955ba669d3bfa5f506074d524037a9371bb7ac6b7d8e6ca96db9003f2671d0a4f5b96579f996e49e2ed74b96dc5c1d1597b9f9ecdcf3ccb13e246eb2daeca2b4a04d8553a6bf317f7f63e194ccdfdf5ae6765ed56cfbd97cb6d83632429420bab9a5d675cbfb256e51235b3a858559987d7253e3c79e98ec5b9325f32c03ddd3fd4e8a9d5a275b6a6daa834604acdb27f18a33f28aa39fd836667d2e4a9c893725e5da1b2e2ab37c5d004e85be7ad17588db504fa40e085d9fa0e3b71b01b5dc5ab48085e3589173e00290f3b8e9fa6d0d3a7ebbb7ae913b2a8de66100edf78e03789d2847476186aefd57835336ea89fb8ad21ef8b5e4fec3361ad0b5b79aa633a9394fc7b3418e5be5fa53c2134065dc280290ec5a51a2b3c1e203fae9668d32e2afc15aaf4b80b810f27117b54395dbb59226c658d3fcdecb6560eb31d45e79b8617cf9bedd44f594edc673ae40bf6fb1a77dbd6fb75e35d6c86a2d15cc71f6375ef3be371bd83afead672da767d202358d8ec98a2fb6b7e67bc90022ef71bbecbd81b0f86a806c90458d0c32105698008def8a194cdfa0052ee0aaf46c5594a872a40a919d9a5b73354d2362960212663322b219102cd860116c90b1b3151bb2ed91816487bc2841b5474e4a38b2c71e127a369784f4626f489423386d58d95d1123cc28c110cc18028619ab2fcd5095c1eae6d758a1b1d63aeb10c69605e75c738831e619e79c73af34f51f63acb9d63ae39cb3f6b48a31deb88af9f6853999acb57eadb57e7defe69c71ced9d35f062bc638cc1b63196238e77c7366d196e334b63967fedddaba5962ceb0176320f8b47d70d62c3b04922faa6ae076d3f1cd71a4b953b15bf3de5bd35ce7755ee7edaffb78bdb16fb38fd8f637afa9dd420231f50be489cedec762b19045b3847268e32d92a1c66a2ae9b403c88bf6a8aca981a51b07c237105ca36b724d0c088ee9588e8d760b9018109fd81685584270b30001427ac1973f8c3d8c336751e036db358db1b556878a640e77361cc6e40e95a12217639c3f5bfbb5bec63b672bc6a1158bb3d66ed6da7671e526ee3aa7f59c73266bbd25e9edef9a64c71773f7de7befd5bd7253d4eb1686d62ea8652d739b2e63dbcf1ab7e92272d69a97b522b496b5c89ba68bc0d66a59cbfab3e67d596b1faf3a74fc03b50f6bd5745982e1cd3be4cedac756a4e4ab36f2bd60c538ebcf56185ec8d8f63347e69cb5e67595ab957b14724a2eb81b1bd76996d4e376009bc7ed7df9c33638057e858d75dfb06175dcaf0ff25d4fdc7fdc76fc03c330e436b226c72d51b827ebe35475dc5fa15f1b650986579f4415e8f82d4b08de5d857d7bc97d4b5b03de1af0541cfcb53eee8cecc7fdfe931a569811dcde79731875000a6410c5084d4c910204b6020839e0c230b2afcc0523319ef0c6607d778c2fa684ee942d42970a92d1754d91f596cf17e5c3a2300589d31864a0b6181c514d31060af21562505103935d01039609f6ae7b4e0c223218caebb9667bee0861245153e318421022c3d1341780c0458ebe524493d6aa048417be16ed3db4d8904ab696b33b676e5b20b862430cf12caa945365f4fca4137cf881165dd37e0c73b4126cc1c1ecf801123dbf18e6e4115015144cf0420a0d525d7b97ae69bfc7c72578a233656ba9373a8c9e3fe7173df1810b54e8da6f12a87208a8e7673961480fb498e9da87f70a6bc806f6a0899ef37fdc106264efc64acfdf5d9635011132c09aa6695ae5c21c1d0383a7e7a06d72168c1f765942200a104ca9228c1394e089264388f0b8cd81bb2c73dc54c6b1f5d571c08dd5a660480a3488c5931f247d5f2b458a6c95db1cb8475f403142a9b9352e3cb80284c88a550b0884d8ad91088408a53051111d96263f1b092bac4216828110208b050a203e2a5ce114423c1bfc80e9105d15b04f0743382b625e0f866c69abf3a2ca08b493f3228d95a622dd80d0c955a834228298c106e81111ccd0049644103350215bf2c50bfa36433a1bcb70d1bd2e2183654265ae9a5bc3654d2ba1063bd4eb122c761065937a5d8285141c6061042b022280e0aa132651b4ac93629ce0f78da9542a132c89ade0074d0764599dbc7cba75f512b0d861af4b6248e09062e75e97c45e80a38a980c6650943a5bf7ba24b684049e8d7b5d12ab828c153ed54e836e961d3b914509965089c1b68594ed52657b245075d3b6baeff47b9507547a4baf4b7800a57f16dc2c096a6a2cbbae49a2eb32a190a824acf746412d15cd000000000316000020100a87c462d18094a5792cfc14000e729252664e9c4ac45914e428084286186208310818428021a0104d6d0302f3162b8b7c929f430ebd754321d3001880b1fff48d957054b9f3d4ce93d58c1fc783852be50f64a24625428cc6be60e1150ba49931d134404530f4f73b02a06944250386536567e332607d2724233b94b1372182c9eb870f3175e0f05f853687525a2d72c885c540fc4c75fdf3c18e44e87d5ee607850f3420bb0feb58918facdd9f75689c808f771d0b71b5600dea6e6398bf159b1a3a20e3686fc7370ebf8ee1108e8c16be8e66967071a0bacaefa6da037ed61a9f0a303f19f774345b7e6fd286b9fec25c08268bff24557d619a0c45552628eb8217b6a925a1a3539996ca758cdd21529d7ef27c6ccbae9365857c4f32d7e57501a7f02e1e400a2292b687debc8916e25f9921a788bbef9e2d10c3057d1fe81122f54d5309f9a61fc5accd1d4889d6e52f92f8b69022fc3a5574316df329869b3031c926ef182a934a7d5c982e29319819d926e02f06bb7c742691408bea3d42a4a283bda3a3baea2952bcf0e1db9e0139de89405bb74298f3cb4279aa2a6e14c74406f97c04e70e527544466d307e3981955eba52b64b76c1075a67150fe63e3292668e03e696caec4f6013bbdb183bac470c2ca57386c43bc6d45942b225c00a5dfa746364e1033611bf55c40c567a9db05c213824a113784f2d970f4f341f86944d317d21044fc2a20642114cbede5a21617c0a5a6aa67d7a8cfc3c8f5c2d758758b98d01d9fc75db5bfa19c955d5d0fa2ae03d62851980c57a5341a7dfa0d0702a8bd8e187a23fd895caef6814b98eaa09396eb53ea7013a2e37a73fd9bb17b65e55be1cbe16d2ac25b00864b244cc5837da426cfa24fe68070a43d46d4cf72c787ccd8011b36e070723fbe21845c1016279214678bbd44ca074cb6d08f967c27a767c03b85a7258933dac09bc7d40254298392e38f75faa06a63490961f883e53d81b49c7a920ce4f8609e90ae8b46cc4dc58d4caf3196845ea51ca94b7aa3fee893029d0fbf46258b0f79c49f2d75e6a4d8dcb2fc421a145583c8e6e7511a38ab803365852de1accbce3972bcfcde74b45f89a4144b51a879e9eafecf28de3258f307f6f7a4911bee3c1432d458d3f585c4bfbbf32fb201ff61131afaafa9fc35721b396d040dad14b229ef940c4d74783455e850802896856d27c01484be2d79060ccbe1edb37a1850d445bdf0b3555bfeb19601a4d5564f315a0bbc9f1b4a8438900a21af2b8c55206205d73ef8c06d46b20c46b1f71416eee7d97c3bbc677bbda097c17a53222193e76989cc84104d864f86ea5620980fdf25a99b34032b68df5547103b4d7834cfcec4163fc8652a481deeedc5870236381d666f6c31795db6442f847dd832ea6a19600ec9d8c68f4bf018085598a7d27459e3ed81c595a8df9c18ed373813da240f7baef494b2a5f505b9909584070271b3677ccc2e6a467cfd09b9a6757b051fb458949a97c7312279bee103fdaae7f8a2c51bda50f1379a65a505bc17ae13930fe76512552ae582974a98aa84e3ab3051d61b44929073ab3db98a4d88ddad9ae38d11b6ac8fd6cb550f1ef92037c12d5ebce3c58cf2f2061a114f75653ce0f9c7fd1e535df37938e4ccdf0583be7af64e4e92f420aaf08530408c56b0896aa2e22e3b20500d29d1548a833486a8af513d4d8ceb23eadca968b9fa171ef2f66b244bb37c9acace1bb14a1bfa25d9d558bbc160720a1a6fd24850dedaf1087160f6623bce40c979011fcbb184687d87d113b3efdfa6ca462f4c1a72ec5d2c548e843a7910f759f18e436ebcfb6bad32f232c38f55b2f7983b2459e55b9a63bbdc1d722a8a8a95cb69a20a60e4fba48c8897a1df9bde04b4047e92d64a1ff1e73314589dd980d1eb099411c9b6115dcdb4011398cea5db2e3b16ca184ef70d512106c26e96ee0a14fe48ba49f106ed0c3a1eb3faad43ad1c7e92eb6447f93bb2b06533e7172aeebe7a1cb174f4ce7f958a8c41e046eaf9e7410731d3b933a677f037b333bfa033d8911eec406585cfb61f5157554d808f24b6d82731eeddc773c6b31d085824f9d00c540264b8eac90529ae8ed69d1807a75c52c046046c7d1a0fe6413d3e8ffc504325f08503ac6976890ed82ccc1c15ed5612f9989f7c0dcd20791d96484e5834e563a69ca3e4265059759dc1fc45cd403cec619ce46c2592e969edd913213a081af48d885bcbb7edda98838390cee9d8b75c9ed098a809c132a3bf69c0fa33cc3fe79ecddbb8e9a319742606361e1044fd8a1438e85019bffb209a505f05fe34b3ca0b6a68694aa36493ecfd77a28f3ba872de10537880ec725b66413a11c9606cccb4da9ebe379171edf3346060d2a4d0163f15d1482b093cce90bab8429da3bec019454c834e5f74c3ae14570726a330a6d2074fca81e1ec1a1bb813e3c82ab4bc8dc515d2810d7732096718c8461a300ded65c3392f9d624c3a9c182dfc3ff88a4ce57094e90febb37c28d260083ee93321fd07f6d2bd0ca83252c2037da3b3d6ce90de654250cdb68a1605d1c7aa5559b25b9f91e13535fb3c1fabb07480d1b92b21dd53b6ce55b253b5014b9282775343e3e0431e0d0bceddd762c34d5950a968aa13779a328a77923b5020b08c9f764d4ef3eae0ec64581459f3486caf7db049512c1f5cb47238e7bf1819c2cbf43fcd9f5f4519700e66976099e31cd7bc778514252f21577458d8a116a0df834219ee35d77681280714c9f00cfffdc6d47602a75ade581aa7ac0567f06ecc6e759b8d187482780cb4736ffb522658caeb305acbdf26ea733150b2d185775226691c5881b96df29cdb36d20cf3904adf86206d9c6accac3203038508f5c4033f291eb86bdf36b65299f0d90095a65303788589aee6347a6bfdbee565f6d5a9f0d508c84d4e3c7fa99bf89e0ec97898178c96c5f5de2adc56745fd55efe36954a3d13a4b6a8292032abd4b49c96bb4fc586848132e46d9483799c9a7037f31ca6a9ac479b5a4f1058587df9b0abf79422972909a6613fe7201bb2c8b32f135cd5df00f34d8a065546b2e1d0995e75532d70bdeb3c7169b4bf1d1212cbccf87f70ee2e414cb58825b9f82bb81008b5e797cfec0bd0b00f02e5c4ee8f2f12528085966666aefaac1352b686b129f67897754c31506f9fa5042cf38ec854820d45fe11bc856e2301d4835ff425807a6eb86ce784eb14dfec44d7728171cb4e133312ab0dbe38dc99bcb59adaa02ddc5013773a8e023a8055167b9d61c6bc277d20efcc0b5a99b80c89089255e165ec1cd353a412890304017d9e62923579cfaebbe35d8db5280d596310e814b9c20b1172c0c7a4dc509517bd6b71c9df96bb8525e704ee2e281d100de1a2ab13d44efbdf39a3712b1b4176db45c726296bdc970a5f3bcabeb33c89fca313723ee07a4ee793cb4e779268eb3ed3448e4b205050f04ad6abe91da5d513e04427f81b4dc201e7a15caaaa12c7367377217ff81a9f72335227d403dad779f8989907059de40e5bae8e62582088b151a65d3a9d8e8c952fe31c097265b716161bb11f23937d18326d0702a0457e3e8bfb293c50dd54d1d1d8908f7df53b21ba490b3cda771554066218339436f30d8c6c2e78e03b86e4e776289be4d7c7f6deaf31752728c8ff0fd4956631871a828200c00eea634579d9d639ea3736448541ff4d5bd012a3c8db61cf351ef72342c7d7891e456c3b5f7dd8679fcbd9d493687a51761dbca93f0290b7a5d399e1dfb4b07f2a0e3a0952ea6e3743df7594c976a3756b4c2b94f756c7d076e0ad864768de61f7faf957df47baf7bf15d29cb522fd50c9e1f4fa074352e30ab974e7887260e063ccf6f3f7a3dd3fa68fefc197804ff57243e4f097c6d4caa93670e1cc16f93c313f8bb2fba3562804eb9f6844defb23e36851f010e258743d12d43c52b93da4029c225fd71b3930eec278a9684cf92c822e49571c21f89f79c22ed94e0fddbf009a4cf707130dbd41f745c5930a650d4d30d9d675fd7bda6f67c2864012c61a44072dff9916237baed2cba71eee18d6ec4b8ddad35960619a0542b61907ba827e16a6135f88cde1a83a3d34adabedab376969129b3ab64d0ccc82d6eaa0a4dd783468905dd10e280461fd7dcce8ede0d98d8a1039391b8e8c9f63944d64c477290e38ba43e78aff27077e741cbe36a0a268d36a80641e39d233b168515f86934c80bb3d05d1601c8c5e1bd9df6c09c9e6cf3b18fd3234f09dd39ff5a9e44cf2a1caefd93f035c7d82f09292837121a251d0b86301f2dab3a3e3b2561f1294ec96021d70fa0b2e7e00c0c7b4a7f42fa9d5cd19a89bf3a7e4b2f1f02494ac1222f093ce4c711d9154fc214f3eab197844894fda436c7c6e2cecb73c28e16b965b991e71f41aadf2f79aeb088866dca74353e2a5337e5a38877351e370ca1ba9abd36403a6660bc350f6c9a953aaee1a8a3e10a123d2148e114e092e888dde9c3ceae6d0d2e20e13ecb93d8ad153d91e80fa9d59ee16203443ec12357c41892561c0cc0c3d99453d184108cb290c5636f6b27288aeecc99c4009347734b17b06d1d3bd000789ac74144a964bf3f6f48f4c29884b312508697d377c318fba55b14fa56ab3dd1b75f5868250f4f5b08ff53b1c4c0164cbc24756c08d1e1ac42875cfefe7bd7c33e90b639e30f03713934e93b712a547f409e54ac0d6bd3daccb4189c27906bc7cbdbf8eb4bb8e6695be74b19d5864911a3a68424e9acd88ed91f28c5c3e260a0c51e1ce3be19c7b5894562c50e7f120a1823a43b00f21cdacae93705782f043f818a4f8b6b7f43db9ed6c11f9afecb2568ce9f12d2c68f8ede1a624edc1740b0460f4d32fb8b031274f95824c8f5901c1cd5ccb26488f8d636e496fa9c4a3aa4449420dab4714bac02a76cbd057be2d17f16159cae7044b9d6999fcca8bfe56771c6de9fd9780667929603d2134bd0b77c02046072879380fb2160d579f26b58b1c73c81a18426604e7799af0a13cff0e0dc049c79b437072ef81d09411462b362cbbf29d55c9af18bf7a214b59adef21999073843cb41127f8ee347fa1b039c4c3acd69142d8d29a2822a679c47ebe94d9e2f5c4d0597a5805967ee18c0eb0128fd734b5bec7d31e55602331a1ddd810f163bfc73f44ece7873763e60bf1bc0babc505677dd2d42b0681a1d26d9501370026dc60a9c6f796ca69700d9f83971a761ba8abf05d4071c7215161c98305c6785971690e219e133bd47922c2304815b34b0a044a5e86471641dc926748a57cb11862281d52b8dfa9e9fc35023362420e3bd4cac88149edb2d590ec1a607b1cdbb3a78089e4346d730ec46dd0ebe34a9f73c8ec782167034cb9b65942d6bf142efe30bb2e1b265c8e61d3737832d4c6c202302190a934a0d49415928f2da924f43f179cc55a0d155f9b6d01125c77f3d76a6ad8ddb75edf085fb42fc44aa91d639c59ab92826191733c133107ea14c040e32c3c1d74dff277ac221c582da79b9422a37a3b7a5ef6b88dadcfe8a0e7aaaa3ed43808fabd61f94b1f823fb01e3174d42e4f523d172380e18381203e81c03043c8030a58d895e42a17573a032738e708c0fa688ff50d69b00778b5077e5a4e1a3fee37ee3d31b9b08b139c2356794dd7f8e1a9cc1a6154ca47402f63fd0005572f12a8baf05c1845ac7bcc7d8099a3b703775ed60c811148ebf5f008167f89fd3c8190ae5d9142fae29490eea64f102bda573ed0f883d7b665ce216cbe882e6cad95e13e35b3143bd6be71de426b4a1a231a3b06f34f05150e1cee5117e024d9efe41662666a142c05f6ff94967254ce300d1fe86aa6e2787e09b8dc5cb7c7d572d446c4c62dc47f2f2bbac8e334a706fcef4e335772dded8633dd07117eb5b2c4178065c67931c5d8a2dd6e7889c534e43e780001ee725f7818777ae4fcf15980a9b5f1be097b9552ddfa66f1877ffe0a657a53b4dc27ae685f6541f590395e351aa825a420868a5849ab72cccbac03e939fd0ca512fc0da477afe2e98c0460504b67c4688c384e0ea98012b27544899252268e5bb1cb4f7f29d6b89f52c251aec9ae49a77b617309ec77344f6f17a3bc2b972cfbac1b746f8eb30238e5a314a404b6af4d36d222a0a00d12df610185c2585ddba04ec2b938f8cf4c53ef2570fade955fb5a43fa571f1b2c830d36c355d9a88f9a3092199703531e9e86688ee626d0d9773f1b1ee718bcc9364762d3d0d50f010a72b4cf570a868176849fc29802afe7b78d24b0c7918449da26c4abb50b4d421670c21b4d59211de009dd4f65c039ba63c1c0692f880055f45caef065d478f69ca2cb5fbff70483da83beeab41b2b6abb913619209ebbe345dd063c5c59845ca1f611243524c7caf0506012e35b4a7534fd700d665d59c010af76da5ccfe48ac8287378ce1481e005982f7efb687c1512c54b2831ca60b549d15dc95894d32f5026bb573e0827a1f35fd0031de714e971d732008ac9eaecf87e60b9eda8faf692d444c7a8b517a59f9e598b054d9791f9302a5ccb5464867e801764ee4290494f8a5ca378a0104d9a3cc36d17dc134f6352b5fa27f3d2e6abe20169c50b62fdf39a6ab08e01cc74f381ae6c6c82690e08d11b8de4b84cb153b4f0c9ebfd4c893b8de3a03ce645ef71475f8cf44a9a9e8e42015075a1723d3737a3cf31fbc44314a262413cc25456a9644518042c9e33bb308a1ff4736a8a74dd589604e804769c05cbae7492a8c3254dfd809463234c14eed8e57c9f7ad33904ef355eb1a0698e54aedf80773d83b769f18a2e1dc00e3057c1e09b77c63eeff9835d4ee0501e18aeb3dad0e234f26bfb5c0dc852a0feabb60550d0cebf05e1f7fb37e1e2748a862beda878c338bd9793c499bc5165b401ed87efecea07fde92b5f9cbe57103c7d7fdd2f31d92835c59d831da5361b7989931d648e94fae6925fdf28b510037c3bbfa54e4a9d51231b72486da9fbd494478f2db593d0090ce5fc16bd58c43da332757c59a9d8f7832502e6faa1e6e7aa73134cdd25918b04e691097156d39fa07b867bfe54a7e62678724434c14b190874af22311cfe1aa240c222c64144f823ea3fe30bb2b387d517373a3cce07f8767dc2295389a2057f3f8f38f2ec4f84d07eec6ba5e95d3111be71507d43e0416b1291a85ac22871c409ba31ded998d2266744bd63465925f7fd54a41d000721fb5cccde16df68d64961ea044c3b148e45270d8cb1c16af191eeb64c42d98e748e9af6454ef8d8438c078b8b9d7c8c7e420b390161c0c4632d0a518333f888ef0475ab80921a400f1a46e553f9bdfa48244e9d3b337fee7224331463bbed31a801e2c27c10b06aaceba5e88bfbc6374c02287b600166768044c8cf08882cb8bc8d6645e851bedc4e3a38f54132f7a12ee6bea2e229219146e14b3c18ff2b3cfa6fbabcb6bcb8ec03449674a442b59830e8dd70a1e589d309ee88109838bd05f4a0795d3d23c57c33fb7c577ae841aea7112b18b53144d83076861351351f9ab7919a33275cf0380859e4a9db61a09ddc1645cf823dcc3cc3de4b5e7bf468b0e0a9d0ed4ddc850afb578ff2efa8bb1aefb01412fad0362465fa6625358ca66494c34894791f17f777c4ff0b25b295adb68239bf09063294b15771d8fc7f6dd201b8d15f013ba702df4b31a92b6edd452e4eb81a682f8aa5aef2d65d70e3e4ab81f7424ceaca5b77819b13ae05decb6229a9bc7517b839f95ae0bd2496ba8a5b76a19b53ae06522fc4a4acb8255d70e7b4ab40f642540a2a536b9d20b1271e4a92724fc95cf555893cf7509987bc96088d7bb19dc8e7aaf49ff079bc607bb86aca3bba2587f9b442af78f5c56e22f5f14f8ef2a2481e16ca100d4e21fa069c6383b5b46eae39e2958faada702ceaab53c011a56fb243e774dcbcb6cc19902aac7a9ebe873d4a30086bc1182b9944144d116a9afdfaa48059a1315ba93dd31f63b2af11ea9f951330bf9996f39414296e4b2f462e4aa90dfb86d3e87f9074654e1175e7dcd7e1b6017d94b87984b536d8cf1d538fc7d1bb07eadd91c03ab8d8784a72427edfd74a228d24ed9c628d715618d216886c02b4aa1d14d145d1fa391243f25f3b328371deba29e1392be4b4722a89a024c95a155472c30a21f6d500cf2d9261a9239e874a38bee2e0f15ec436f7e67e7cedcd434cb0232cd01e44000b813026fbd97a064f03a2ecfc8a11c87fc74a8496a809cbb39239bee1bc180a54f0db5dccb7f2e961086fe825ad738f58bfdfffff1d4f2966f1bbece56ff455b3c5e64f20c1c915bfb25646eecb5d75b90c77f12696aefdc96e0d699e0ced1ee000a5a99035e5805db2380cf52512e1926995d68e26c4a5739eb4211d4364ab07b20a4e1f372f6b0e5ef2ba8c83361d5b6cb7350ad84f72a32461c41107941f4d44af737cafbbb491a3161031f8277947d2677963ac9fd9ed784b1090f5061b23cd6c98dfef3ebd0b7f41c438b785b64468faabf82da0c97cb119384d164c11b9c7c7094d9c03d8752922e93464664beadea9be9a00490ec3ccfdc21ace419542e6418856dc4e4f1551ef3a705a3f65f7f385e0a7a24cf1ad2bb433a40c69940163a61866008f2dbd40552d867d73677b5dc4c75867eaf53828c827832b9ed0d15fc69f93e1efcfaebbc8893c3c683eee9f860e89c880578d8f7e3d9b77456f6d2659534372f49eb5ddbbb2ae02a59bd808a4a3c61140bda863ece10135c5e5cd8ca297b823ec61f2d3470fb6a4102dae3a90877fdcc6268308bc26460437532a7be27ddd494640a9f106cba55d5208216c2538f42c32f61b3de3dd62df828cd85480327c9c7dcb6273826f5e237da5e9c735e111ffcb3417588fecef37d135e4cadce4d88cce63f1ae0e12ba1d5ab8dd65278e7e562e5584bc06dc4d3d2681b4a1565e4e5e54ba98bfe08b4ab15bbbca8cb8554b414c76424e8ecfeb034bf6dcd7e2067ebfd99a0edb5a40eef0d80e19b06be4d84df450211c864a5f25dd61eafc17bb4d050d70aed52b5ea4709a1ae99a54dc801a2caed72068ec7679725a623c1c62c0adb17ac2fc83c89bf321c063d0b2aadafb510f67eb23d7a2dd72fb6d5e8ac897ed5c02c9024f40255195c75baae7668b8b48d714d286338fc5123e22bc5e6090a0fb8f4b180f2c5eec6f8d140c8bd986bbbb1c634a5b414e0816ad9bbcada58ab832fe1990303269cbfa46bb6d29d21898407b18ddfd181a28f4ffcfc00131c4f1f755eddd39dd8865028e7f42e8adbfbafabfbc41c78dfecf4cb7eb7ef74d9be0902130e4575f4951e211854f85bbaa79c897fc477e3349045cd63e9f0dc0bb8b20ca748bf419408e00ba1806cc17d765843008a3ab5db758c947891fdc2fb8ce273b33b32c9f2655299a01698f6140c847c0d48e2ca32aa90a1f56fbce17f4f57d9a5cef7bdc18ac8e322aff316b8757e3d1ba4e132b243f1f9a67140073a827f4cd2f19e46f4570e1d11958eb167f0b27653b90493b7b367867eac7ad803fa9b4d840f68cd6fada7d9d90476c144dc56c748d9db06ad3330963b940148a8bf4e9e1b92242c4ba1f8c9b34be1370b02659b8135ac7d77d613b6980743a3f9388ae17c16860841f81d36ade2049e2d7e71dcc59e05000bd6cf97ea64bb0b2484f1b390f8d034469468cbe60c72c6a65b3f3800887325c332bcbdda0d3be6217bafd10acff7716fab23a55ec4b3dbe7b412b5993fef77646da58de6d170dcabe7238d747e549f4e02b7da8a2c4b2483e67131363ec8d6abd2e1e010ac6122497daa2f19d1f5549378c93593fa6aaf1d8bb34b592126fc7c51d9b440b7075c4957fb17068a4c808f6368e6fbe454edeca95e80209131cd865108e007c0727110eec84d27c18177f6477592b39a8e1039884b77edbd865e8536316f4a0f11c5e09c477cdb692c100ee7c7e945ebf62b8fc834f77c6e4e91c87d9e9c084399fa1646430db0ca40b3a13a93a5168de5d62992dd0d324482dd74f26c72634a7cb626aa1fa6c723e741323c87608a69e0872d7273aa44bf262771d4362e8d3702ec784f8125853f1089db4076245e59bcf783200e861f872336ee3eef527bc10f340d208752851c3f1d37b99cf72e4433f2ceb7afecadd216b3a6e6611141542a41ceb7866c5420c2a331672857ccc900ac35fe1fa35acf83c1de711587f10edd2993bb7f92abffad189b2f35f1a7829c6ba67c6be586394f85f4bd4abf441e919be3619fabb4464162c4b4e3efda1d954d02b809b43fd51497de6509417403c0abde2d6af09a52a4a2f22bd2e723f4a25036dd0d08959e4ff4950394cc6d6211b8eb8f34be1a0197368d0ae0b039f0c7210d121790ce5ba52d3edb40820789f2c668c42618c929fd949aa803a1a0b3ad56f69368d032b51e282c3a2d9846c693e7f833740b3794c99708dd556592c690ee610ef1f372c70da813a4558d3fdf453e7f13aeb697fd5251e0a34d8b08818f36e0a33ae0708aa5838da3c23f58dfd206568b32216c69262834bd3511f06b1a1b95d103b5c3548fb315c113f53b413db840cae1acbdeda200112135b5b1ac9d9d6690a9e9a659eac510e446fdeda346ee51e709bc66dc82b801b236db66f6d78c166b05dd2158021efc37d1b1aacdc3134278a6e20822294acaecf7399d2503087478b766ba745395af3381dc521e507581cb9147f2df48c71718219cd3bc4057330454f5fc2472782e2b12228643e92d3271b8a0059306e3a35391fddbf4fec53eb277cabb501a85b7f82fcf23826a419f9c5121b3b3c17196d6a429c88f99c7f6de81834f32076b004da5e010b50f5e4823ca0aab18ec8d2c21d60f970635b2bcbf3d239356bef42485e7048442cd341e3215d4889784a6274ba02a945ec23844a31d26f383c0349f307269c321167aa2e300a4ded4415a0470aeca54337bfc88b1547012de9d9c4ca5c3a60d257bb8c7e31f967bc34f2008b6ef9c075cfb60a30ab422513c44a009e3e4495ea42bef88c032caea100c7b651e00374190ed50cd3025a50b1b9195b11c90d22e270b670b3d1d19bbd3aa384e6270b6b6b775e616d45170aeb16773461c5aa2f12562de428c2eaa66c06d53c9e29f5608d45531dac6fce801aac64f78b00c4e4005cd9268bb6faf0ae81d5b42072508bf34e65d09fc4bef74196f74504949698cb5ad9ab606d78e7d8b7c1643368725f6bfc23f6d7da4419929790fa3d3a807b1035f861aa6e9b8fbc020c15022b9ae92342e8bfc6ffefb107a1747ebf3ed3c4258555977b723a3f8b3e716f497b3228e1d2b6001898020f8072dd94f1c1b0b6bf6caeaafedcb48cfd4159b5b7c01743d39e4b145497bab3f83821ed9363cc13128c9b5376283118afa29314b8da95a98a8d4b5df53fc6afd76e24c61a33265e856f078a4997f7e468308d0242266c44d3582d0d2c403e007639cee44f4e6fb27377562fdab32c1639f60665fd5326ca4483ab10a70803e27037b06737c0415b872c8f69051226f79396b88d163fa537d72bf42e20378220c16443c9a5d979d31fd3bbd517061f8866d46d8f22be6ebf6d50a993e1de5628ad76de72c298a385b25b15460c58cf722775bd302fc0d7d91c80b07e0e15986e829f684a7dd335597efb03df68101b5b53d5c4035b7f29d0b21e7c36cf0c1bb34604d67b37f492fdaf0cbd2db614df9ea5f7eb8f93d66a99a992a9c67cb668744dc6f98552842fe08bb6857aa7bb711bc1013e88ff462d1064a0c87f7601ae5d0c0668606d0d3ee113f4be88adc273da7291f0b01f7829969d365efd3736e094a8d5229d5665af4c5f8b9a1f7357bd36fee0b78c0b52718b9d44346f8ffb2e205c06c035b60072966cdec75f43a86d2d2039fc79b7fa9298fa5ff78f739a2d6212154b4e00c2ed0e3c12bae7e10cad34d846553546ffe97110da47f59155f7371ef17b2f6ca0b789a352ed8ee30062bd775859bbd54cbdf9e5fdf49ce0fbc0233961b1eed79749a4e30fcec0c38b6dfec9e87a22c81a7751ecddeb3418ddb5f485e7cb122228390c8138e925ce84c694b57426d8619cc62964e221e56e9ce1f6e66db547b69ecc5efa5f75aa899bc51eb3edd81cc7c196d3c3992579427f1cd2b17746d6cd0c7f62ad0a64c5ab4f0c80b09a8cecef2fb7737c04539dcbd26c4db5423675728375e860cc97bfefe416320c73c4a99f4f84f21448b44441b35f0ed435726a1c325046b93daca7a53651c955e90093eb26f33023602252ad21c03e46cc8ca9016eba4687564480dacc4a9238876132d04c667e4ec594eb4740fbc8b99415f5578f1ad09ea5dddb6da928506da945912c3aca0c9fc738d4de779ebff281e37e99739cbedd40892d7b859c19d93cc212ea33071dd7f77d183fffe6ef579db70b43775a0b5dd8e0888c169c9e348299cf20a293c95f0ce54898ed846b6500e8043a50a090281577df9235961b4b166c68050a46ff6b61fccdac661661b32d752930b96150c9d306021acf7ca6d5f0732d3bbbf32778f4a9f920b2599c3c155058112a10d5a5e82fc0f67646ea217f59adbdff0363708ee6c1dc3cdeab4234eb8ba87356858745c3a5f89e0ab0fa9a6411680fd2b3d94c4d231c0cdc7b5bcb6928ca3aecff4c357a5536c3ea95b686888cd5b1a2315bbc745209d0017813e55fc552d214b184e29a26a921a50d1dc80d043d51023ba6a459df66feb30c37967d5fb8890c359860b067eeb1219b7c8e9ea19eadb5fb67e2e62856f7da397b15dd123b0526a4f2d5e8f44c064d60daf18b56ce344c2ca08b217760b189f0abac60823dc20fdc8181260cad70f64061633950384afaf0a529f655020f3a754734f9ac41afe463b5f808c0e9d07fd3db764e52a9dfb8771f85839b31d82c9fa616006096d9a0d522c00eef0b94ad7a04649021b9a48b08a8d2e4665cda798328d706211a1f314c86b779c8b801504cc6f72309b786f439a2ac46a140414975ba6914a96ac23ea446a97186f136e6159c04783acec7eac860077fb1b25b9e40e3be412f7747d5243b1656f5a2c3667803c5cf3681a6b690d400410a71866ab9e2a7d03ac2f820bc125e1e304e1d1aae31ff380887d0b1c954a21ad8296e96132f1a323106504d3d0614d38d05651363818a9b2c725c5f4e55e32f56f1c97997f1f9bd7058048c3a52afdd7d8ea1356cbbf9ba9bbaf575cf97da71f93d9f4d62740aff46c9b2d8456581ad724b2eb6171d480f3740dc8bbcecc34e25766a94e81c5e19f3e72f9a96b3b0cbe46b57f975794f615498de5d44df0a9186ac09a6d66b51c7bc4f884bc24024dcd5a63b5231a93038f2f8bc4ba67e5095345f177bf66bdd2350f095160f77fd474c7e3a1505662f1666702e7b12dd513ad4d78001cfc7a6e64c151b065dfd979318a3269ddff4c4cc7b5d625df18ed73b82e19da2ce5d456eec3fcd621577d7db49ad65ad9352bfaff9c08db988ac820abc2fe64367a9c2bd70693d4ed1401fbaa48c26619a1f9c3a8b28bd46302226bf8826692ee0a20c934d056c263df844de2e3755a63b7b95480540ea1dceae29c22833da33ee26b35deb04c99b60f0aec34d3611e5cae3dcd846686b0edf5d0cf3a1b1aae25e78f4a8258539600e11f1cda3ba31fa689b66811288eefedc7cf1e6f8e92da9b48b3e5f6ccbf0bc2c09d14d1e6a48a71e838716abed48b0e163cd7e66510233d69bec912a8d505fbd6d7908e13b1c14fa4d8ddcf047f994940cedca035a1e2495cf034d500f3a1926442bff9950962c8f38a3af161e2a61bbde21be2b91a1efee3724cc9b804f3901e47df7e8610daf1dcc10bc1b05fb880629e27adc8a3f9130f924fd5848d8240fb2d91f87fb6c266b6c3c84f96bf13f3c9f9de98d58f3db11e4c035d07140be925a47c9cce2524df9b783f4e0dbdc3bf740ac9ab8834ae79b330ebc3b4d53bc31f7b43014982c1dae45755aa5cff6ee38730de422e495998018ac1eb97fed7564c044050f3e379b1e7f5dd41840d2947f719ff921fbd28a3ca5cbbf80d12189fd3530ee6164acfebf717c15e40714252d9b2f039894e5259b09b6fdccc69cbbc82c9847fa15cb364776efd60aa1d0fd204e93d0af671d2d81c07c61c0354b5e25e98ebfc83a93229f7cec7caa426baa4064b59ef05f8061b4d6abf30e98f8d3db84878ab77d1b00cc39e8a0914d7768cb78e490fa7e0ceec1a1dd7889356de269fce4d62fc44fa7529915d323410c644b80784580e792091f2e6e69d0492223f819291ed805263b7e4b2900390a3c49a3081c8162f47b537e03728118e58b43d9168ab341440efafce688097e17249c8ca220f8ca9e05015489644404051a01a7aea924fe249dda73589f92ae114ca4407ae828b52d22806faf45f50fd27df26cbc1b019123c29f501c066426060949e455766e55fa062922f4eb59d9d26a736f9c43bebd45b1d84967ef51c6928e1422eac50b954a3aaa2d4839357343121a1fbec33318226412abd260eebdb707138af7a304bdccfd57ea497c1144cfd716dd791e6490f16af1ab4a321c5a90791da6c9ff06b40ba5373a21976ff4a4baf9ae7b2bad238a5c7e6f59682cc9465263efc22c3e40e5fe92b8b32a715a36445e90bc563a9e0742c504d7eb44a075e0f3c65449fc1ac4797c716e87ec09ad14db9c47400629b346e984c6684beb375418e84ebda2bf49b71001a570b4a027cef38230684f9450c6ce1f9158914bddcbf108cc1672c586c9402dae9d2bba3f9ac6ff8180f4f34baf0ed08f5849d57385104eed80cfeb0fd0716e360a4a41f84dd48d3b190c3410fa1619b94cd5f0d8c636d7f808f63340e68751837521b5a10f38aea8a8e6959ba8e016ca478987fde3b6663d71b6a6a6f4f3e9529c40c6691a97ac267466a946f60c3d798aa745dc4c5eaaed6743dce5e3f2dc274ebf46878f3dae433580cf03e07323acc8a8b182065835b2455523454c883013925c208290903f0d2b7ced02462c72bb4d508cfdfca3ce10c3438e8ec6831df7d74f7d109baa99375e7807f218c9862bd95470f1eeda08c569322fce6b80c63eda083902684ad180bb9276d8dd0a10f1e8a0245472c02879f6501eb05b231ac62dffbba3047e1e48da68254d809095f02db516a1e8033b74faec7dc025d643c8a1d701d1df652bd46f25d4de3327ff1608e62b269916029ab748f4252be3c401b182d2182e10dd084de377dc4afa5b8b75bbcbbeca07da4974c862ef47f90aee67d1ab28b8564446ba220d7bd983fdb61d539ae5ff5c8800e8bf1eaf214891f35d9293e37fdcdfd1594ef50db895892eb69d95ff5e6f6726b2ffaccbdeb5610b2b2294d903dd06041838d8ddbfed2b5bdc99a9cb036de6e73b8cac76985a8f9ba7b01f7fc0d00b07d7fdaf2f124313203b47cc0be92618ae6e58f7a1e2e5b1a2f44860931d9db395f53d5ac680df69aa567f91ffd191916d968ce4732aacd6dadf2796f75e277be2c160f5673bcb791c20fd7fb40f5129b7ac449bb3268a1f73073447ff8de10a73f36786a1061184e925b5281b340e57e03e6853ef0f339e21e3c42d4c7353b598a24696fad24d8eaf6772757065e4844fbfb057b9be644aaf297f163fe7fe1e7ef253c3893e2c9e0ee4c5cdf90de60ae7bd43c55593bed3de67039dfabb973c86325fbf85190bb142815eebbfde5d2b90db2d254d3af6b7fb5c64f75894c2c2b14473a7bb69ef0fde87615db6f8fe221da6f24141342b9a8a0cf7f305c8bd8aefcb00c7a6d03687431b29ac1ec10a66d2eee5b9cc4cdd9136648739b48f2bca884d3ef7c0c6dc12df566b8e4500b16c83f15e52279bdcd1ad947445c28b27615fb3f7a174233fa81213f8f94be9f045e82a93b4b4d4079e9a74457db0b7c9a64fbd7be69219bd2d838c3af698c698e31f485e90c2c766fbdaef6627bf35a1c9871b19f8dea5f5dc5fb2b13f005ff4b97fc02f66a090db1e83fb3707eb17fabd9f2b024c0076a83787c851b48bc77685b8d7efbddec6c2cf28c2e0bd153678cf1fd71c8b0f97b0d421891252beb24942155b7737e5404cd9141861991c3b69bf901778c82743806a528092317568e502bf5ea45dbfe3f40c73da3753bccbecf7da4a75645a200733adb0b19624b5acb387dced7e34d1257a36661619c3ace61c74267dfc489f0eaf5958eb4720b4c4ffcd01b92668c9dbf8592bb6e26b85c30759a2053bd4f5285ca7128cbbafa78ea0aa6452ed03da74c95313e3fb1aa0f1929870f53ee99a4621dea8d6b47e2091f7814a9eddc01676fc4e018fca0ba3f5ff1a3ce540a8ab160fa009f390a6566cb3011afafa16dff0288cf128dfc45055fc90ce0d884d76ad430698eb904467d9709cb86c3f2c539776056c49776cf77a564e87b8cf6c2d9e6ae06e46f20ffa84a403eaef5f988b26b8f3513c9b25f0485bafe1bd563c5176616746463edad0f0b789016e695c7feecb19dff338901e5ebdaadf72e05522711d931a865ffa9c38c2b119c59513de7e14386b30288b84aad3e34f8f5728d07111249027e6a0ccd426ac2905398dd1fb458857b3675ff3dd75510c04bf81c312a1075bc6e5ad03b1c901ccb9b1de0c53de273cd09b8718abc8d77192f0bf262648aa0f1295624ef8bcbc291f1d205747c6095546d687f1ac322e7edd39a7f942ad54c320db01aec733fe8d9ffc989d7a208d904584bbff49c3908a3697809f7c5bef07ef136f2f9202b04e2c5f9f1d80aae5eff163d0e30a9213de370ee30bedd0525f4f391ab5d126c258f43c1d4a65acdc22e02909c9710796bd394d2da1f6006ea82fc812724417533e77915dbbaf0fcd8675920896955f7bca99143dc4acbc5bfa98ab218b49f8df0a9902cf1221032e516173853114ccefb1083c767cc73b0419e0e11e331d4d65a5c66e589740b1152e0b51b10a17539e4e01dae0ffec5235e6a16ab46e40d288e21f09457740e02a4b21002a86a002988b6ee65e7ff190dc0049206d7fe854a132cce268ff7e6476f6d7539e030a1f249bd98096a20ea3b7e887562d68b04e9ccbf093609f424478aa752c23fb702a6c3af7c3f6056892176d0d544d1d91ffe148ec187b174c985c02ec0f7d082ced52655a0db010282bf375e3451c4696d14f92201c8ced6b53980d1e316c99f9890147adf06c388160338badd6e501df8aa36e35aba67c44cb3488b4d24872199d36091e3b3932cca1762847b1d40d15089de3cb8a9c009fa22dc53f0f02069fc7e80d881aacc39af07f81e5f8bafa078616f891decd76f6e321acba7fd7e487411553826f78287636f61327d630b42826b3bea40e647443f46185d595cd369c42d6b1d58636a99d9108c422a0207b266fcccd5a6b17e94d1580afc4d152d137ed5ba885d2e2793e990c31a48e56fa2a3867dcb143f1992bd69b85737e998506a03ef3dfdd5a5676239356e9a4dfb886a63484db25f76c8012d145e9c4abf76f71a94de046b8ba8cb743e7e517afa39d3640b60d1cdd3aa4823f3d737bf8f0c148282526a899be3868e7c83e9dc190fc8e49c3f1a536a27777d379af24fa40abb016d951885ac739427f19ccf0cb2478b5b85ba1554696b62557ee02ffaaca27d4ebe43f43e1dff004b76b9ccf29b7e51d25e53883ba62ea48b6fac2696ad89b05b1c3ebacfd771bbd20bc77913598b97233f9376d6da1671894a8abed66b404bde55af0f3fdc48dde2a1c36abcb3c956f1ede217082f52b1b5374e69095d177af4896bc249fe3659a1b1246854a8fe50cdf6de4d7137812f0703ab178e6dbabb53dd90b9727cffbc2971c12991952f23c264f95699bef897c14c103baf3e6ff450d0299bc968affa25025cbf117df7194acb99704263d65a3ee2ee76087a225a6062b50f4312a0ba201b8a3158957a3d3800d36747d15d56331c41a19e241f1a83f789ae7142c6fdbf5e3e78c843f39daaefc8f910ae4ba30fae43ef4d53715b8273e5a5ffbf64aa16f4705b23028021540a8e901a18eb0a9e0c925e9fc26d53bb73ea87df1d8a1d56d57da4ae399332f8c577bd47829a8a17dbbc7bec226fd4cc0365d1c2e5f928ef22f253c744b07fdac53a12a189bf453db5aa9f0eef588d0753fa428546d06e896d400902a282cf73debf9109db6b56aa6b5ec6ff44c163df7bb6af7b7d8ac1a921d77550b6f1e2a1fbc67acec1f01ab2c474fbbff9cc3b5bd9d9e4b03867d305a62ee70ff4b97b4ac10e3f1def23e1968a9f23e82f5643687d9e47014a1891d2495c217c0f583e4c04df1577152f0c89d0a411bcec20e017e27d84c6c3b2d36fb603d476699dca977d97ea83abf11faec59727b11d9b14b1618b70e8d18f302cec101e459bd8256d40c5025cc3052b8724aea1c45c2563fb82614869283b83cfb8797ab53823cc2a292af60536e9a10498b094701f1adc860c3ec054174b69a32dfd26a40977a04ce3ce7251aa41d55389706aaa4527ff41bd4f7f0ce02a8c45d180ce017a93da56a01f1b20995bcd4ca7d5779a08c9d3df610b271fa54e84da4e8e8d7f41dd8a61b939ea15f879bdebf6d392420ad07ad2eb4273947986a732c50eba95a7723e66e0863b07e4baaab18275123fa97a20f8094e9ea70d58fff5b336ae7c0982843c7479d3e828f1a40e8d9d55032f606da9a41e58c4488cb023a173aa73b401f024e26843d35f0e8e7c483b461e7b127528a0bff16e911c5408922243adaa63a23ef01d06387a921147949572c6578da183ffd10528a5f9f97b58c6debfd0cf4b257bd1575c444ee270e6f9c10138f31beebf48f8a226cad032d6fc66425671e6e24b0acc459cd5d8c25479c9e7fcf77cc57614d65f2f3b913b614a31c381aa3aeb5970054496ada118831dd055485bb2ba6122068761f7fc53aa257be5b63949e246a2fb5a8651b35f7ecc1ce7edf7edee18b9b72c2b6ea272c219b8ab2279a3d9e18d2836b633fe400793923e172bc5a241a4051e9e794a1145181e6a7fab7cd8890ac4b0938642ec8c0c1e9131540d25105ae417d322eb1ac0234258e4eaac4fbc6dda2b09981fd231bd08494cf7313befaaf53cdf8f56e21692bf81951238643937a5d3c07ab0d257bb845e383fb1517e8b114a16ec1c6925a908de6f9c859a9d29e6b729686dad48d64bd0d40173a30fe00581471843c5b80b57400f7b1e94baaf3a990c1794d25596a11a10cf7bf536f511f6f1c5e08ce2b043dfe7cfe8023eb06b8d8e1222e9fa566342660167bf9f0cdec23ec93b239a1c05c64acb1f6709fc8c88461e74d0175663c905e59ca5c8084b886e3c3f2f0750780feb0ddac927999bf210bab6e0c71fcfc6a1549ce6285caf01ed52fedcb60c31a87892441db461d15769e6f9869a9fd2024d527459924340f75868c2d9a2931250bc50c7823d17e4f98d550548dc8558d0146f0e63458c5bab55ca6a01b1926fd440d39feecff397678cafcccab39f0ebd305de8d958f1fb07dd3b42a8b1f7ebbe1c92df33fc3521651b82f18f290b72b289301487f900d4a4804ca112864a446c24108d9812b790caaeeab0d18e6e4b4ff11290939901ca870a5e04f5ffaac71207a9bf43436e8ac31e34dc8d3eccf228ddeed71fe6db23520911db840c7ee9a61720bd83fe1b00f7ff47b04a9599f6b61814518bcc2bf65f8f706e3e0ecb74901da5842176ebe328f37a5b7561a627fdd021314a4c724b61f1603e678f4fc66d32db0b13454438dc9aefb0a67477bed694f8453f9d97ead601b023034203bd418fe13ed2249ebcd9e3340d5d71841614bd6c483f755f510d503a659c5846e6891ef9cc28b89469c1e6b81720f245a1872601b7585e6e6db1ee3176f2ab7a97da531f0625bc52df852b5272acb0f27f155ab5f22794ad6edabfab316864ee534373ea78acb567559864df6df6bc224e42d0381eec81feca477853b0faf82ae4f33ad04d82b2600fd0a5d1fb0178ef5b883481b6e03143c36d07bf4f99f0e9f4db80139c8a231b04284d199beb95ca78f5fa6241d56a0f5135997e1c2366871ae31be6590b88132c99eb4703b6b0a2c9f5a2f5b4ca5aeb32a208d50b1155b3e95d7026c160647360806ee231db2faf0f0f691864dffa4ab01f827f6e594583912b3dcef586d1f6ac75788b3548302988a88ebaa24a1bfed8e77edb5c20825ba76bb160c9edcdc3f77cf6be08fbead3e5aebc01c7a9bbf509975905b6b4858144d91d3bb9c867482785d985cd5f8492e0dabb8b03f00f6cdcee666ace3eb629c44090f90a9ab7787291ab8c321f82251268ff8ec43794299028d3f52f5f2c9b02145505cf61a7a3911c99109d0509131b52d9c0100ae56e6412ed0abf25f6337f32e7d43312f3283756ef5cb0af681a9016d9a06eb04fb106e19ff06ae0d1310d14cbd60353dd09b1c12eb082c3e7f814655952a00a3ee1e2aa56b20fddad7d8e8034c2bb3f0ab0d29761c39ac975ebf1fafab1e4debc242eb0fae2691076c821531ecb747b806c3e987250b242c40497f5dc530bbd59cbf98cdae187bc49f7a8da5b5366a052b5279a7bd8a604b43059cf0fe4638f6d6daf5ff2371eef07e6d66b62e65c51dbc712607af1a1bf9d2232991768c7f658cf9efe33a7d1774970f527dcc3f05e5c0d2585911c6ce2dd1c72519e4e0023fcc09e999a9f22765c91e174d3169a3ee543e4c543d493f38c3bb3414bd9017b2b892edce7def2744bce1c592fbef5c2a56ee9ab63e888a54b6f03fee5389b6cd614d338ad53f7bf3474fb78772d9f44ed3e3ce1d424f567898324f56f804c39992a57fe1f05ddabe508a404cb6f23a44f78640c9f56965d23aace4abc9b9d322cbbb9af54a203081c72e16074913bfe8e28a74dd621ad65ab821003991e17a2970a727ca04410d20d163b0d3ba1c037fff5d8a181c10e92d706574302446fa5e67ea1d9a73f9229f94c03d6dceb9edba16a8ac3fd7f50ad310468305eec9d55c5111bd5b7996abb70105cc18fab16b3878d8535c17faf549f102ac74412b4c8e66ea7aa5f3ad32d071b15450f8c2a5810c8b8b7228474512c682ced98673340215a66735b08aebba31784a3ddfaaa5d7bc8879bc6a84fa42b88b3b099787e00f4081de2b919a072a8797e7ad9cfe0f83c7c035057337d4641f20f74c65e7acdeee24f125235c85922291cf022a304acd0b6258b2eb71858c39cece25434c9e2399fe397d00d048947700260f28c585385c9b3fea1843efb4bba615e3e04ec2767c98aeee118bab78f5baed0e45ae25d5fdbdc3e5441f5040311f4c0a2e11fafeeeff92aae9d794f06b0a4c5c30e67be94af788f73d764fee05f77ba6ba34c2fe7b8614a18d83eb1c30c9dfa4f36ed71388610c9492ec580094925cedc1c8a6d32f7124a907e72705c4b654ddc9c7cd97518cc198ed2d5ec3160d5cf71df6cf63a11f3be6c7edf366a0c91241e93c0a9fc8ba50eb1cbc428f0524d9065d6b1e11675301fe9322a57ac70bee16d3eeab693e9bae99d214fe45a7460f6b3edc983cd5dd001b280d239ee59532f2e3899effe4c4189e558ad6c8c43ccae728a1df6e982a35017b6a9f0bd10f5402607065620d474ea1c141bf8837162b39c04bd715cba1392ac4b7fc63194c292db52e86caae2c538daceb2c420607a47479594b01ee1f8f85dda90f30e1c12b6a1bb52462e9aef4e803957de6465f75dbeb17c4258df55e1ebd21fed71c5932cdf0a0ebe3e00dd67909445b8a75273f9d2d61c4229644cbc4167addcdf850119c1abb5afc31a19d980a0f7b933b1d4ab0b99275d8a9498230f45c84cb62d7abb07a5e06b1a178cf2e0dff63fc94e322276023e5852a481e1932e36fa28a85dcf2469f2247869814d3fd7c440a4cdfc1dc57780ed33423cb2c927514f91623b81ef41cbc0737b2af1412f2a94d39d1d80b67fd64ee1725d8508e9cc42c9d9d8a69a1903e83cef6cbe8909343a34689d59270bb2e1c3c049321866adbdb8569d5fb9379d740c2db447744f5564689de7213e6602166ac9843ec386517814b5790a62321503988212a1e1772e6fe7c27bee355fe9eb710a77805913ec1a779852b37e8e50bc6b3e1136d47e43166ca890375a344278520ee0ceefccb40adcc8cc106a954446f21b50127eb0f26aecea5b323086d9f19ea91883bd448afeb0cf5aee21a544af4e077cd901e49dc476adb08fbac106bdcb5467982b3d68507d02e6ffc262965fc82eab9f91fe7428ea47de149209ce4c4b3096f4f1619016d0d0066415eba2566b61066b886bdbbfa34584e6ae4bac0707a0034ea1750e21f415cdca25cd2cdb818f4a2eba52485df6a190b8bd538a3a25c06ccb273061b6dbfa1d90cfe5506c517dcf543831026ea1aec53d42a6fefc7b59d188aa040e12900f957fca6257a4978c17ce05831eb3ce370cbc4007300e9df8b4407c43613dbb6318b1fdd808ff190a79f0507a5147198e69a77505b0095b71d8818615a576c9b462de635190006d28091d4aa43acce65fd911978777d3fc4df4f0a2c66220f518c40f213e998600398989b7d73bbc5487c61311a013fc041797d2a12b36816fb0295cc24dc509faa28b46d9694e7d63d8620420d9b1f79862f25804395d7ea4be1f730a5e2d2bd6cd9bc7ca063a8c41dc496e7550d932f661f685fc573af2cd318f3d368c4be442a59d12f4d19ea152bceb3331c5cc53361cd47e3e21185d8c8cdf163bc63891cfb230322a31eeb3b7e0a04835b30d60b3f9b1b431a649e654a49a0562b13348b3fab6a87c9a51fdfa0d590e6da4ca10d019621d7ae1c6267d971c1080473c48a0e8429d903708d4a9daf3efa2361d8b2d5a8754bb3c32eb3888e8a696144cd0564c9f602ee362eb95ee7f36e33ed771cd5d2b44b6023db5ec622b0acccc92368750b98cb6658b5e0e81cd1b71119060b7a96bb752c2fd3375024b00813f958e192aeeab103ca80d858139a83fd3d96c9b832e0c1b216ad2cdc4afdd84e305cbec1d35b090ef6d2fc7f399417279c37ee3808a8bc914c130c3d493e665db029524683bcb863206af03230d32abc87d15349b15d6aa49a3ae9bb5dbc8d727d66dbca8deb1081a1da17c2a98a60aef6c21406dbe96671b30becbe8a4cde3ef8283308efab8201d040b80ff5c8f86f7f0763cf8310c5a1f903bcd67b56db741d11419b75040bb5a1c8c01981115efdc2c8c827232812d3c54d84c2772d7efbe1308236273f792387c1d71ea96e225fb19e3a2c02331cabc40c41c456c193deead1d8683aa3c4a1a052809fdb5c69101630283e1c25eb6f5271a7f4674723dda37c59db6c28144f464e113279ac04eb87c800728f6325109916158b26d36fe91c2b6acee6e3c53b96aa0f5b7c533bce388f97de87006bd88e95d07cac763448025b13160b32d08e8525f67407847d807fc6782a0ae78dbeb0c4a7f10043358220f81e0a40f4e6cf9f0f580c804ab24ac19d82516cf4c609df5ce27b1c17ea5e177e942d4d1cc17f387a1805d17e8ea5b537e87ca3ba0a1c98322cbfe09cfee84dd19edaf352df8d9749de62788c70717a18763b26a3e717d33b883a93c07f1ebb1ddb25c7f7e46fc98a1d3887dd2e84041631e9e629263453fda1c943ff4830ba7386b0fdccf6b4ecc340e9923971276722c895940800495950ecf46a674e38549f7c59a53cdfa39a26439b4b2c4df445ba15f08bc11e1effac8748968d06b0600aafc28886d2f4d4c69b9ac9adc44c7d976aaa34d9ff0f8ea5bbd6ac14ed1013480fcb3fed267fc97a97a2abe6f8a449c33b2ce9396127177ce2ad49dbe91cc5dc535bb2c253a699b29621eb0d9d468be068b04c77da12db646678cb245f8062f401896d6a54ced837b6c0bfab529e062129897be9a96a0b39f14a58c8e6490bce2805e1975672b1ceb7100a35bb1172b2ecdadd25d02f164f7268fd937078e0ef1580809c4a60156deeda50a15d612f06620c49b02dbf7f10723205e88f5bc675c097846725730176ea36808daa034f9c86ecd029d1ba01380c1e34cb04be4d65f88566ab286a0189f7b4d0892380cdc10f84384eb55371e844129b87ff3262440f928ef261a6b34ac8dd54ea18b9d8a51e5f8cd029f3b72b8d0be70bdae54ecf81427b43e8c4d3e7cbd27e18eb85b13cb197259796a6ff511b6e88d08d3c11a47cb553a671c2cffc17fd97f333b47c530e53045d5c123f23232829c9b3a77c669963a13cd89542064a6cb387aee638da58f4bd2314fd13af79cfedab26259efe09c701c9745b6d9df4032c6c8683d582f44fb0dc126c891f2bcfbc188ca0a8b7a2d824f2f692f948a8a9f122dd08361688676dfa1dd63bbcfee9b59ea6c3fc6a02a596381f7ff527352856829f8dd62c244938054ac8ee00498352a2f0e26e1c69d7d698ae1c6fd65294d05b7e00572442251ba48873071ecdd7105d771d79090579b8fc88a6657c2ffeab0ccd59f8db8cf1e1230e14bd2485dbfc78448e548a179d6ed852cdffd442f88476d405fd53dc47383d14281a8265662d4ba644af6817778e4c080816beeb2c2263103c3b8c184f969ba24b326fa1f2b2ee5523087f7899ece92534928d9efc3b28b12ba8a288b3039cf33c54783e15659944165fdc6750a5bd5247d7ba8e8da928abee002a380de61ddf66073bd7eb2113d2c853519ce46cb4d8fcaf3c452c30bf0c09cad2928a426a484d637129c3bed71c6d740f3fcab546c2695a9be68e73623dd7fa202ce5a481f3a7abf9e0db9459d028da160ce0c62069ee01b8cf9840c5e57c767b66b16f7078c0cb14dd1bd794e57a31eae4b683bc53aaa2f97fa683476a2755d873a4b93bb04b12f3f287896ead566a8113492e6e7662a2936af7c96c141800d224b1de5172417812c4678956b39b4553c773a6752a376f36d235eaa1d8cac2a90850baec292723f7e2729895bd33db37001274cf08ed85f61565559d2b6de550fe2e5591d0aec6791815a00da6de264dd9c93c3c8a2092f179af8adee91285bfb9c1c0012af4dc2f1292a6904597ce30b8f7361940cfc3096ea3ebbb81f3bb4b01688d0b0c1e57b094e4f8142216ccbb88dcf1295e9bdda79934cfa221d85cf0a11d45b8fe21edcf074ee139dd635e440531cfb829f4dd30b299bb6705b0c1ffc0a7405c78c1ba630e87848403f531c7db435322e6460fef07c4cf60df8cec9ffd98ee47de7d09d09b8fe73485d547d62bd867fa0782d71efba30995a93426924fc63d943468d1509e1aeee8dd4d372753ace601c66930da9d11603eca5d651f64d80404b5cd691d1401ea942b8416cc4408545c3334003691708cc97b89344309630a11ee328c9ff09b7b5655a0ad6429ebea931658507ba0a48614b40f669cde832975b8169ba152be4dc570eda848b3e0275686f938ce72b6762df3af0593ee7f8386a1e6deed7ccc2d4ac073cb7527d4fe88d24a9fff3e1d51e7994066a77fda1be8f53ce1736211e073544abb5e554c633c631a85e5153c77cb181dd192701d6c209f8d224d3bf4f29ccf331a21037b6a764235b7172d36899678569f7b2732dc9f01ee4d095ac7b23a3f6e9463f25937675a793278486a30eb6888cfcbafda49ffb60ec1ea3875f923e344e87167b8539592737c635def823dba1d82e642972e6c1dd892719b75cf5b468070942bb86bc4c68b61f8f1ac801a089a88e84fe1390bc91ede81a65336e33022b7fe21dbeca4d461a7c046e86e0fcb1fd9db6aa34cbd1387eb63aa90776719efcafc1e59cf603dc583192791bf27392c71c211e006fb3c42b151b7ba157d9b19e361b4ef53ad4c5aedc3ac4c0cf5f5c3620f3e6fe8ff286b209fe91f2bc1a5bbb4886931beaa57130d297c2a0f75b84cf9f67e884f0a9bf22fee410dcdfee5ab7c7a2c60871c3f1f2a23fff9083960017ff21b90f35e5ba3d3095cee8b1c8ecfafea52966f0fd3ed27b47b0353700cb646c9ae1b276dd51b616c9f5e800c17eaf4f090457fc3004cca65361a475f8b83a510dae712444a89a44530c0eaec40a05f9acc48afb6497fcb358b782afd1bb0c762389a099155489c7f00a061f51542620e52038c75fe99635f865982dd75d7f123dcf1ced368cd203e98c8ec2def9c7bdea0f6abe306db2cd74a85551a925602c59ac46581985c83ebafcc5a85437c0acdb1af1a7c5b91833704547c0435eeaaa12206d560c60a31a39114548bff98f18519d8b205041a473aed599b12b3b542a500b2a31107058dd1382067c4e28e5c44fc700e2eac7ddd20c2d3b66582fd171798ba51b45f3045300ce032871c00f37a70059b97ae2c8de04735e5804fca5c915a8e9bb3ac9dcd4df5632c25f053baa9208b7eb2b3965e9a7ac7936dfcf9918fee3c6f78d1064746539fe69e40378c1445b9d7835b88587a9eba96dae7984309f18b11a4b6386165baf8d59cd46c4ca10677b962c499ced6b97a1c790f71f3e37c2b4c9042dc4921060d51d3fc1c8bc0d89f3cb293e84d742f948a709dd91ef420e6dc1358b83b02af211150ec116072af7ff291b857008e37914c0fa606e8dadb9e744e0a635be47789b5c34841ff851359b10f3e07bd7a1918584db30a67623177eb4ed361dd7a9813fd70aa0ea3431e7c664f60e032eeec8476c2c25652044271b4ff9b070dcbfd2cb420daa9892a8ee2fbef64efdf6dce9ac3acd339bd977dc2934279838c5f271227e2ec0099819f323b75859084394e04cebea171b8801b76ea0e3087512490d5972ad4008a4df7267943a934bf034a5c799a5178452c7062102d016df3768a4a9169ec7a0cca9e015640431fbb885aa40c162138e9b5af44114705be32741af8deeabdbf71feac8b1d311c3d6c8fea189ae263b768a361eddd267c54654daec835fe5f1a20d4ff1ccc42cc2bac9759d6bb9f80bbaa0c587f80abb3ef30612a1bd9cf0680918cc4f2505667f321df1bfd8eb2cdde6e0518017ee60b10f34f80843bcb7ed975a0733b369f0582f06179142a5b6cabbbbdc07ed87a04be024bd9afcf84777a63b4e51c294f7f017f5a4573af28f838df85c089a9e5b8ea70deacf8d9115558462844543d967225933a154dbceded2c0ae78e7d6634e623475e18874194dbd6e34a3701656524157fc841dda6a12ee4503732fccc8e943330d9c7c21abfb4c271982252aa3f4358502570023340b9d3dad857c8138c38fa9fda493a5135f1e9707fc6910ee56f9543c9da82a11b87b8f97d8994de9426d8ec344f6f6e6cccd7c8cf837c833104a8207e0a56c2faa308a4401316818efdeffc34be2917a6703ec1451f2d4a3a82e59d5b85cc34da111c222bc8599503cfae5bab7a37267eaefc8aedf1dd4a44a8acd09b58afce44ac092006ea4877c0cb6cf92217c4a297925a1b431a08a8ca42bae527bbe327d5e4ab904436b4ceacb452849f3390ec8983701d323748acb82906962fc592c214c680f796199cb970b953ad7f138b803781e4f5a46693c0f737935627ec944b0af1ee5307b0b5ba2457a7f9a48ce260b34ac4a0240feb8bcf36ed4dc1d2d5017bb2cc36f360275e31b2e38b6eb092140c739f5734261a444fd14a568f99af0050332ff6f5f3f78ac99483784e3d78d33521c73c8e5f3dc3db72bdeb6a6734402d4e01cbaa9debc3ee2c1bb06925a66d54faa22c381f62e8e7470318f51b894da01a44183db3814ba298192c41f896cae0059b37dca303cfd36ec9b993c84142cbab01b5571bd2ad1b42345f02d76d97189740f8298634fb385b069dfc25636a339bfe1c4b88703982e512b149cc05f5f17fa99fcf4108d8c5e26865868013a62af0fb04a9f8cce98bd3770a382a6a71f8a2f221a20a0ec0a89385e836a15a329b7c627ba5bfa9816b85fdf5fafb8e6954f21fc0b3596aa17c9a1f11e3e413526329dd906540c583bbf6cf1e37d9f081735c253f23c2961415034a42ba735c30523a4a1b99e7000a519d51b2eab21aef7b9d67752d23c40bebeb8b2bafb05fceae3cc9da6bf47835a22144203a3eafb03d10004610045256e1917d04d43adda97f096ff483fdb8841861d641da717f8644b62629b48556f6e69601cc060a072f0734de7673cee9f94a847fcb7936d0f6deb79de7de2d6d407f48e8a6f1f5bfd8c55fbeaa41d5e05179ffdf73ff9dbaff348effec9e79e8f7671e6a363a743c8b7dfcd894dfa4f9c423adf9442ddcbbf67e8f7b18ad30583c8b8cc1a65a1c618c1ff514ebe4e8e4fc8e1c1d1d1d1d14638c31d631678ea923c7df508ab30ce5661f953d7c1929f1d5f5505907c477669f6e782509cc46edfb0ea4841281d164df779747f11d255708e9897ddfa5f80e1cc2cfcfcfcf0d2c78458c17fb4ad6fd6cda97af3e9b2c5eb8d1fd8b4929b4f815be8afb7ea60da1d8d378a761088d57fd89c63fd48ef8a01e48dc180826818e9f3d26819e6fb3ceba771fa740d35ceddec629d09f8e5da2175fa1fe7efce2abdff723185f95fe7e0ce32b197f3f8ef19d67dd7725be03597702321eb5698fce07e781c43d022db56c09838df3f4518fdfd29c73ce39e7753ea593a3b323e7eddec1032787ea501daa93d31dc136ceefe82a20374e373dc541ceb1b877fde5de7d1b61442d8863c1249030b92353809e454224e171ccd9531a49e0202b7270671c64410cbcecc91d8931e3e217f7ee532e8271ef3e095c0c2353f72317bdb877df6ef3ede7781d5ff378ea9833c7d4316f72bcdd37237443ec46e5787fe9f8fb9e05773a74cceecbd11dc136ea6f4eeeddbfe92a20374aeeb82053f72f8eeeb35df769aefb4edf7d6fd37dde8dee53d9e83e9efb55f3a97919997741ee684fc9fc95f91932328fbbefa4da321fbbef653eeb3e4fc665de761f4f0d07dd93791437dd93f91a9c754fe66970d93d99ef91272e6e19cef433b8cfde1781a361d2705fbe3fc37d7acbe090c86d5f8633fdc64dee33753efcbeca57f4ef4357412c577bb84b1f37d6e4478d05f9d94797afb20e89dcdadf77a1a4b95c0b2257d9df7bb3c7597ea8e19c71a0c407b67dc7f6ddda93afe4dfb7813fac6c79cec309ae250e95bd7e1b582d985e7749b637fd8d2d22c52c86ac7a230bd76cfefa58f7d1c7d9e3eec345b815344e881168b47126e43e96547373ba207f76a816f49bdea4df06568f5f0cc33016f0df2e43e23b3f9619a79d20fdde1e4de3e6c62ea63fe332966559a6b1801ffb8ccb1dc661dd3759c00fddcbac06e47eb600f9baeb913917c3b04bb19fd8bdf73ebed8c522162fc69edc99ac6d8345fb7fa78cbd0bfeb2af7bd91777dec5bdab857b4759b4bcf6cdac102d3173b248e6b41a56f1a17df1671cce1e66df696719861f839e715fc658e752dc93d808ecef67c3c6f9b1cdb22c8bd1de87b6c7ef95a4a08dfdb5cf822c56b6f6264e7e912ac47236b4686bbb22eed505cc872ca82d40bf942fefe38cfbe6c6fe06c9baeffe0d2df49759ae08b782902f51a16388c0fddf707f704b11af7ec6c1edd9fb67ee04f7fc71fecbe5fbd6667fa5c682f6f65d6341fb7cdf5ecd35adeba9ff41728fc4b9c441d6dc1807778ee65c0e7772af66eed35e7318d85e3ece1cb68f399bfdd53e7bcc4d8d85fcf7a9c6427e7b39140d347eb869fe8cfb92ec4f7b24bef34395c679eee18c6a3ef831e6f0b542e0be1d12dfd9631a91986173db7451a4ae20c4dab4a085ede573400b59c157b9fbecdfaf5f647ee94d1daa85ed4d6fea92987eebac97e06f038b839a4fceb2377199a943b5607afd3a3365dc7d130731be5fe220cb94c58dbb2f6e191cccce2c0759a5ef710c1ed5084527b4e4204b4d9a81929a83510f5e392055c1b02b48ad6d37bc82045497e00b2184b04e283f42588d66ad3c527250a73ea5d7be8410c618e1a79a50d60ae1b5457018aa19e30775788050077b40c3ff6ef6d74c085d7631d0eecb5b674ba9559540c7570da1e9139f10ca19213dc19452ea24747ca7134628dfb7b41fc8363659f7fcb5bc50475ba8937d2763b9dc47e826b48e3d5e4a0879b8ce6b799252e6585fc11d52e25408a1acd22455c562104259a58957c5da2a4d46a822e5cc6e9ea82a747c2aa5941a45458e1b0827a538f41863407823a91ea39372564939297ddb6cd3bd97522761a39bb801a10c191b33326a6650dbcf4f0dbdfdd09871da9f945242086bd0100185c7a8a1f9c0873452ce684f76a0e3beb1030d77ecf1ae898e3fa5ec7890b174484a6973637b1b1da1ce34759c94720a9584a4a4f25d1b7ec703754989230b512a250ec2d995568f41e9fc4f4a295b1b3ead3b60c6021fe734a594920afdc4104208e79c73e664dd044fbe41c7afbffdb87c611e3ade8347545dc0487ed78412f94028a1ca042ce09c780c2d5d4a393b23325e7915d4a9f731fb18a5d77a7fd25560292184fa642ba512fb1eaf34bb15cbee4bfd3005bf76471842c8d90da1ed3e7f775d4f1ef59c9366d7ed9432039ec516af2da4c82b5b40d970c72c682045842fdb2d0d0e87c8a2f1270e87c83a3da622763122a1fb6fb6d6ce103f6e7ff96560d7a8b1c54f9acfa49452ea011e14e1023164e08412312c2aafd8548b4d29a594d292e6438f4c805fce06a874d9f3ad0f7bbe5692b4e79f3890c49eff1dd8b308871ce068c97bdec0c59e55ec59a401a23d37a0813d4f0e6002840c905c5c5a37482b7a002263cda77e79d39fa941daf4e90d526cfafaf4f3f47afe69fecfb8823d99ec39e79c130651004d362dfab1b271bac881b7e7633856cc31aaec1e7b5a0a1cf10225464052b8baa8020a5136e18f2124418730844da9d6aa3927ec81104ecc608a1320e48035a9d89387277b6e7bce39e714c38b4da5a8026fb1bf9a3153e88c19b3e79fc4c8e1a7e068699310b4709281789578d0c2d35ac1a2692188e143e672e51e9edc1fb0102efb812a991322c05c46370c2e7ea840fcd830907ca043d80e4da607c2d40f304940942d53784800105f4ec02401415c19738549027e70c9d4a9073327d8c04d074070c4848e29acb8a20ba3656c78c50a1c8ca0038ddaf08a15629e40e9e28a12cc6057ae7805e1ede1cd37bfecfa78e3e6c632bf6d8f711f068236f632dc37f7f6d8f3e6831ad2384f388fffacce7f3ac777fc6771fed33bc5b333d5cd7f5e0e1dd9089997c95666831f7358ca2f3255bfc6faeaf49586564343692d99aadf6997f42ed95d7ae83b9348a6ea974edb64b2dbf4d0eb9b7e16a13f97b2b7d7be3d8feeb350f6f63adda73dcade3ea77ae1a9edbdeced77749f05b3b7c7f12f63f6f6a9ee3bd5972db913a5786a7b23f6f65ef7d925f6f623749fb6b2b7d7d17d272c7bfb1cddf7dbdf749f77c5de1e47f7a9b4d8db77ddc7535f1ac99da8c453db07ed0dcadea2eced6dbaef5421d0923b2a786afb317bfb1bdd7702b3b7b7d17ddacbdebe467ed91ed57d76fb1adda77d7b1af54f1c746fbb9946dbd7ed6774df69db9ea6abdbcf74df697b19dda7b79799d184fe2c2a07487f7657b9e19e4181fe8cf8981be7524cf6cbc93506ed6ac4ae5e760dda15ccf6998a18899c73ce39e75c0393496f5a6793496f5ae7ec9ac964d24c264d3399b4f61b06b466d24c269366326926376593e7ecbee59c73ce5ad6b4d63967ad75ce5ad668d65a6b9d73cea66cca39775adc9e73d65a73db6f5a670e6ecd4116d51c161ad6344d7b9c69f526bbf7c31ace6ae5a9d5860b1d897c55ab8d96cefee2cff0fdec7259f6a57bef8da5acd4c1ecdacf4aefffd9b071f2e3d0501685e290943824f3b24349ed6d605dee9b44f0671d3465ed332e0e452951c8bd7a1487844a48b0f41a6670af9a5e86436d1d646113d72304bb0f7d65fafb996b2cf8975e6a2cf863d997b26b7a24bedd3b213deedd219fdb75487c886afb0ff92a4ae9913b93257f76f625eebbf97d6b8a9c6c109af9a25f39032d7bb4b3ffe6be1820ca1ed343dc687ba9fb90ecd267dca79afb6646f22e7547b0fdc58d3b1954dbf55f4ed34f33de57771ede389957c91d99afcf234fd5f3fe2bf4aa699d2e71a71ee852ad5fea4e2822b4fdacb1ed91a9faf8e885cfd64605fa9bfbbee6a034552db52ad323370eb230219ddd52fd9b0080a1f17f46543b7becb52f7558c31a2e492c6d0cd9dbfa7267fbfa90de9ff7e7bdb79b9946247bfc978b21eb50f7b3ffe2d61e77a8db01891b3efe4d0c2d2477344cddafa6126744b5b5eecbbe02ba12edfa35c30fb50c7348dc66d03eccafd98031c6da67af7132a8760cd867f7628c71e9fddea37d1f96bcd3b823b0c8c65fe26450edafc88e417bdc719fca5aad4fa7df9fb733031214115a0bd58f42a5afdeffe9a435e5a0f6d86b4246545bfb1e5f80fced8ba8be6c44b571929dbdf6fd8d9379992ec985a2035b10b1926c9f4f805e3230630551bec428fb666376f6706f1c64e58d83aca8b110b9237267aa7dbbafc836a2cabef268c485b9f3de1e8f39fe843f4a2f3d9b263c279e14cfd71ecb587aed6fbe13cf89a77c3aa79c99d37b827bf76d8ef46538b86d9cf91863e4296d407f3546897f3f42c9321e3a7e5c29dd5ea642231919dc6737ee5a34ccd97d325c2d611e95f7fdc60ffdb4f16bdfe191a9fbf8317e8cbb4bffdebf9b08dda769baef34d37d2f834786677f3cfbbead9dcce3cf7289a31b6a406c373dc73d3ff8da7772a6d71a9ed1353739fbde9f164bcd472b3dd4b412d630fe69dd0b9275f1c8448322225cbb66c3a2a131f46967b9f8f06dd0f00546afedffd92371578076f39b5f1f42ace649dcb0880825b60d2188d0be4211890176473024db8b8828c26eff192bdbdfce9753e023183e8279d9bec5741f47c7254d3e90b84bf725869acf362796b13232afdf723240a31d83cc6bfc1967041a590befcdb2b7dc872dfc1eb7dc6b3e310c11185eeceb40fb3efcbcb5efc3cfa3ec1b66df879f2bd9b368e8677fb14b1629fbc2a229506e1cb3af6bd957aba951f33d8ec5bcc2006d39dd48a37d1fead0c1b21c6324a6358de2564d81e97cb520fa65fec4c1ade2a217eedd2f5ea6e8fb70c32b4210da0eaf08c1b57722ebc22b3100e3599e6d55db7adbea1ad4dbb7beaaf1f6b3af02ee398d161a3ecd140d3f428aa5672f475eb8e7d3639723a39adde533d4e0de165357717a805ad4e0ab2f126df7e25e0403b7601b5af49c2d68b13db65a24e27ce3620b7e396ac00b33f8cab6e01e14a237117d2622d2b42eba5a4cb4a2e8cf5d76cf7824b7eeb3fbbeee4a5deebe139eee823a9ea7104ebe985052469446306af52bb224dd827beefaf92ee4abdc7d71bbcb85b848c4c52a5b34177c85bb16acd52d0d88ef38330fcc5414527ab41662a5f9ef51a610eedc05afd80ea9171ae2c65ec6c31584b8e71048cae03c8aa7fc5d447a76b14a24722ff5022db744a2a3cd6f92e4e31c02fdc19710ade2abf8d60ab91419bbc81dd9c5fd055ffe822f7fc1177cf90bbe5ede492fdc93f0058d1c4ae9afca791626a216f754c8417fde1385bbbf3cbbe753be56358b6779b927fdb57b84c4e83496688f8ec53de9595e355bcaaf9942b70659662b6ea02583172b49068e909f24034760ced66089d4af118b9c0f9f570cfdde82fe93a399427ff28baf32540b99b65987420064bd4c798f195cf96141160e91952589acaca33142b3bce5b28b55b06abbfc327fe49725f4e7cdd6fc41cc8e9383f61d3b94dd79bbc77a020d6b744f15b74ae59e6f202f7d36ecf8393741d812a7d4a7b1443fa553809e553b94ec6640e229ff4b85feb26311b9938a4a22d0cfcd0d8685be0d88b06899249aa0cb0f2f960d819effc157971e2ac3c030301899814604faabd9943e047cf5c96f40acc13d5a43c47e6a708fd6f0c3f508493979d52431d28fb1723570f1878b594392d2a61f8776620d8c282cf2c08f119b46289bfeac511be2dbca6cb9195fd8e087e51a9148df0270e7776e58c2e364d38fd6063aa69848127f6a708f86d934bbf25afed24359d2b8e89229fa383de80f7681c188afbe0865065f7d3c4e3f0ab18468ce9c4d12849e0f77dc92ea195d232b15070193a01f160d10da1f853d8c55ac6462f4fc8a7fe2ce88a7301757c005d00f2b35864beec02053f4ede9f33616f38e3660a06b90a04d61e0b19ac7cbb376309480d69bf927d096cbc15cb4765f1cdad4c7531a7ca2165067629b02be88125d5c78dca31f454721fa2925b4ff175d41bca20bfe2861d38f51e00fba693cc1a6f1884d85d8f46b6624674e82bff438678f8b8b4566ffeec93fb9274fa69729cb17fa9bd932893ff90188172b0bc1c495dd290afd994c2f5f5d7b4a925f2b61cbaf813fb02d31ec4b9ce572141ddd9b7fda46bcb326233a0322138664d397e192c8781997c28b18fcb06630ecb1e77e1aa1f337c057f163adff59ae2672279a24b0ede37fe478dcc37ee37adcc33e05457fa78d7d8dafb40e45e47e7cedb3c7fea471310a2bc2bc583839e8ef1f8561188e18f682afb4c79e07fe2861637f823e99ba4fdbd77aa40c075993a381568e86c8615f514422ed50447cd3a75d0cf47d4316bcc1ba184c47f40618ded4c7a79ad2f61dd780d10d96edee50cb9433c0485f5ef1f4272e3a6aedab4f0dcd6e7e0d9ca7d4c90915cd4b7f99d239e77cf7283d6dea353841e82f4bed4e66cc4010fac10b9a332e49bcc1135c5eac6c08204cf9a179e90f8e51b2637c81a50272d93052317412f77082d05f54b2e74ce23f754ecde68c835f4801f3858c415ef62c61f19d080616b9a2749132b427d19e56f6a41e95f8eaab81c1575f5462c457128b3db51ea83327a5a2673e00431709c095d421091018edf9304c23f412a0a7d0facbd4a45c04f21413d66a4de7cf39ffc3b37633b8373d2ef457f385fbd588982085095eac1b24d2192e340525d6195b5d04726fa68cf457b3e78c46a630b01f813fa4ce1c8963eceb4408fd651930bcf9a24449e9c20bbe028a507c2742694120ca7623305bc92cfa414ad10f52c228b1ad2a867018611129837d6fe071d19fea42db00f7fc5fe85c70cf534cc82b72731ad0e7febe98ed8b6dc9b9d3224e9ea752f1f0c018e08e11e8f870e6cc39e5ad3ea984734a5ae39ea45ea5943243acd259ea62642b96e13ce79c73ce1df8b0a58efb2ac7389b2e60cb0e7a5407033a076cf971625d843a5e6bad310729c3f4e6ffd249274fcd296b72466b1faa2154db3a3622ba55713c50c2137222ae296c2977ba2939e851fab24aec8bc8d3e9014f24e28a711bdec7b6fc16640efc5137c4f4e6ff6a43e6a65f13e7f44aaf76ca9a9cd15a73195bf022561b32b7853faecd63acaf2016dddd5dcaee9b734ecca9d329a95777c7b42173bae71617e1e898cb59ffffffe9fc6a7d55318959b737daec7fbeafa0fdd78cf6a3fd2ca7f9f1348b7cb0028d76d022d381266e8a3ac045910f25d8f36dbc6042f952c384cb961e7e28eae10928ae3d1f35e78458c82a5aaf39e79c35349f49e349159bb2c0524a29a57409189b524a29a533341f3a7f4c1c4eae3c71edf9faf473ce39af08eab2e7fb9873ce49a3f9cc160c367512824d7f268b0d1634e061a2832c7828e2e1064daab47a90b103a8065c7cec790209fb83589668d161891d9cecf025e8057bbe8ac757b028a8067b1631a9b227ccc20487d2b6448811b40fb8cce460250a201cf62c02aac19e6f0a3182a1602818303f6832864e27c0d08904a5130c9d4800d1e408309040028938f47148074f3ce1f5884975a0f309a44975a093ce8a3469d581054b66d24c4a92326926cda4a420a8a080028a4985d6a04aa148a235a8d24a6712ad33a8053b50248a8414231245a2484827b993318c3d722be627315b02099f1004adb4d24a2ba543d02692549fa3e1ac65fc0015b723e949d293a427494f628462072ba66841a5934e24a49905cda222515a5b406b16262862082a545a62c4505a9368a5b2821534f124a805954291446b50a55024d11a3467a5930aad41954291446b50a595ce245a67500b76a04814092946248a44919080d0128356289268a542694da295ca10ad24c450a14245065b2bba9c73524a6badd8635a9079339cb592496f32326668449871a251239f722bff0077ead194ed390432da019c158798a8c9379af000ba91a3fddda296391ce3abb81d5c87d3e148e1b8f16e72a4600422a0193974e8f822945ceda97ef993c7b3e5d0cf8c7a646d3d3a1af244d080643b0e69d19147c8b935c28d979a82438805a98cca692b768db887634c42e2de0cd8c5c2d2485243181c9c1d9cd0c9068b1d29d0f789727ebb433648c09ddcb2d95f1c8a2948edec724f13a1c3a3c90d20a01b7a043c7ad8e8a1aa51a14800400d7dca9ce6847be18636c5052b77305744480002e0e364a3f9c8125622ac7668f26b874700299041945b32959920c2f6d6f520801f536484720beae820840300013861009b8f120680825ead341fec775428a85230c5b8aad895518ffc62f5063c3dad25a520b8135d50b6d7231a814c8838c41e1e5d310e451c504041f3998f8216646ef959e756c59bc625b6ff975b44461c45132211b0471150a7de200e753aa4d033250b096516f46c9ac3fee210de3f48fcc0259b757da8260a281040a5825521cb19ad6bb60f100b6405868b443c34273a1a90b9f78e2e747cac82cf901c54538f8cc8addc7aa21e6d7f5d8304c53d576e0509a2f9cc9fab0991a2119168e888204232843f5405c0af7d7665212f0e01b9a147a0e37f712812c9e824b7e44e1c6a0d0df1d080f4d89108098d75f0900278018844222b6408911882298f45c09ddc6a29b1bd75446bfbe3155424a84adbebba0962c000030c1d281125a24450c48811b3430880e40efd583f3e75490a1f3b69efaf0db6ff47c2764a34bb7bb484282392ee52e09fae282afa93134c29cd72a9c8f4aea3d1863d4cccc4399fa111a18a137bc259f6492bced55007bea4915146d16fb094ff4d5ab96ffe279fd23d9dfea436f276c3373fce3973bd6193e5fc3c67c60588b71d33919c57995d8723e3c071934ae1c07c0507276b3d68275d4bbb4ec7e1b8c93c72dce810f2bc11525a95b3630a69123266a2bbd676c30d3730b1ee23534a573b797a76ef933f4bf0b11280e603797ec0592995524a49a99454d2ca7dff83ce3921d498893e217fd9f086ac848ebfdd308001a080420a73ce14a49c29ec78520552174f243181a482b17bfb53bc2a6a00db39a747a18af14f609c7af4e8017f405534c1a454cc14e344b461f4494ed161e25f4142421a02690824a4a4a4a43049619292ea95ef2bfc14bb369b50f3b133d7d69c7cf0dc3c18cde57832079f736639bd08dc49fcdf77ff8bffd5ff6486737e9cbbb8b32ccbe89e7eb138e7dc74cf2863f42c4a2e1863bb4eb9735e42476acab8e808c4dbfe8ea913eaefd13bc9c4104843204969821851306bc5827a8c312681c481304961928238cad2d343a4a58e0a3d4ee89997d6f3d4a3859019e81d1faad3abe03d2f9d5f4974081cdd055a4ad752bb406b0d7fc0ad030fe7c95478a24b1d68a4b395393cb007fdd3099e921dcf165d827f9c3c3c1b67c31c0f0050ec9ce029ff28348cefa9dd83878707fe807b8a7184081da450410e520061085c4eb4525a4d18e3c78a9790173050018bca2d9b5aa1021af860a30bad673efd3e06c39bcfe6b5bd078e3c7422cc89f047a438358579236cf857c78fe7f1ec1c371987504dc7e53f9d6c367cbc01c9ccd4106106d08f19d92b7bd98c407f343441befa8cfcd028a101f255eca67b10fea0c164c85e3b86f95bc64bcb90bde46730faa3b4c697bd7209f447f3f3d1fc6cf9ae015105000c3de763b2eb26adf27ac5ff68161944d0ded86c74eb31571212ea5c2d1c59e886da1c3aae97dd0b637f343f22f800ee4c30b65bf8039e2c8771f08e9c93b38c537116eb388f1e793a8c6ff3a2d1008d255adbf0dde55184346a88ffec50f4a10df15d529e6ab8f8d08d94bf65ba4be52e95bb54ee52b94be52e9554b9e89429272ea823a754b927a54371281bdd019d7e4363898e0f7dca9aa8024abae7dee7f990f8543efdc8a168173fee9be8797e558d917c61f8dc04e286efe3f240f3a89cc4c833777c11e0a883f60d8b8474b0e3c392acb1a2e50b5366bec7f10b7227b2be5cb1c5048d550d08eeea75ddeb2e8fe255fce5ef595c8bbf5fe13b51892f2ec557b0e80340434bc0698018b1c49795489441e072c1702d7cc13d18b01c41000677657b3f35866e657b65b2307a09f7e267895988300c7a9095b7f316ec1c480920b933e345f852f7599ad7ba4fefad9b41eecce82c4d0753faf117add03069981c12ba923f1f3f37e47f7ea48f9ce9e2123ec34196e66224a2c2876e3ecbb2a3ac79491f7aeff33c08289d7ba8b4cc59a972d2291a11010020008315000020100c09c582c15814e581a4fb14800c7890466c5418cbc3b120896114c418638c21061840084008019a1a1a9200f86c68e5385e06638ec9ddb4f1a812a485b6be04d751345c15d1a18933875f8d1533f68a1be9c622efcad1ddd0f4d1095e85e5b9bfe2e1ccc4998d6e4f35e53a8bcae3f98dec663c3c9a3acd1ba09a344c939c3ed6185577e70aaf83986ead3a4b5653b032655d32ad942d02d283b128c032ef4e731605c9fbd26eee4e739adc8d11cf94a4409f91fe0814d365744d2f7e5adde061f98676e33e225eff397d54fab66628dd99565cc744fab4ea50b28d02cb206ba96953b608480f8c5d60d6bc3bcda11844ee0bb679775ecee6e040ff7bab02902358d0834499f4cd383218ca7fd2f60610e8f32a374ec3dff4896c32b91baf370e6531ed9ae7a4f4c38a1d86eeaaad557d73b536f6b1dee3f2401dbdda5d5f10ff922e02a8440161b66207fa1f86f52dd33b9d8fb52d6f0d3febc9325f7a45ea413ac30d727f3f3876f568a9a71ec2b9ce620f3096d2fd918523969f70b41731a3b30f36cecba9c34967275f4d2be47449f580ee86f463ec127d0173e20ee59d387f6aac6cd219631dbc791f30f6f50cfb1de3caeb4a4f9bd68ccd3b7365eb484c5bab9cd5c6db77a4f0bb72c496a1cf9998f1e09bd0599df47463d55192fa8295212b9269a46411901e8c5d01b639779ab35870de971673779883ffe0feadc8fa35721949e266911dca9d70fe6a5e91b157dc906e167d5718dd86a69bfeae5841c81f318373d00c52212dfffe4e02e618ae682e71af5f7a2fde288fa47306e994b92b53887c2d124568091544638d741a29c1d66a2fde2c115d657de50756171c89d227fed82da1e4de6de87ed066a6c4987bd8a487ab2c20397714d9e27b10724686abdfaf7f647fcec114929f97a44f6e8ce2083db2886ac320a3f46aebe094460ea0b8464211e1621ad1e69d941771571300c58aaf09ac5673d2e4070c5b447b6a6221ec680e17e07df0946c9054c0813a0e5f14cd3bad33624781829ddef214fd50508df7ae37830e916f160926c7661164246709db969ac3a3fa8c6d2a52973e4a18bc756a7af075b9ec5d7c6bd0f8d2b22646ad8baaec3c52211af3bca5770bb7bccde214881b2dbda809337fc66711b4e44eda561c63d5e5c918286aefec776e1914b505e05200421cbcb19c11b404504403316a6861b0e032105e6811d9ee86d6964400a0cdbda1f55c6658d8c34037923b633cf74fdcac82c2e1c50e934d9fb5a4e2e3962bef61d28aed107129404a8c4d2025b3aac8c39e57a80ff07ba2e373e4c191d5083f64815a95b08206dd09fcd0180aa44ec349654eaaff7595339379a66af15cfe44fd04b6433e0a6192fd4d4e9f529dc2d98e812dd00c3bef85e0658e187016d2f4ff7e67b7f543b287f1d90f3b0746a000cc2fe4b4877bee157d2cc8cf6609a2e1b2054d536f969f2bd00bd616de5816177e8aeda02152818b5d807ed3dd1dcf202c02574db91bd4de686a83e2ba4180a4a9baee5d00cf45d39d42c0c602bb70f7c65dc9e97a83f2433869c7316ac10e3086815e749ab73a1f23479849b7e242bff751f846bca18930682daea1fa4a720111eeebe9c7e824f62d9d895d549d7a17f52e6c9c44a8b09857c407de067d6bb53eaa9d4fd0264bd2ce08d12623427d1016aee46d4e0a9f7fca0aa901c4f2a9d37d8580616e30cece68cafee8a17be5d1dd184549bab6f5175612982dd4862e1c74b01fbd75c94def02e658ec13a15e2143c5942722bc0116453b4156965ee5c0192e33e2dd7b2e716cb6cdc579db656a3d2180da47cfa8cd6b44a769784f13b1be81503b22c1c13aa4e6f9a80d65c2a7e67b98efbb4388d9610b2561b432b8493127064a3b101e488c7920a2d8b9fe93d498ced96d95013708c41c8ca704cdcb5f79f8a903381c6992d0024c109ac0eeef61bbc1ff4fa9d2cd3ecb006aef865142dd2827de6ed3562087cec1b28e2bc5102cd49c40d78781d4ef1a093b2708da8173c7214f0078d409ccdacbddd7e0a99d47a98cdf35902544f837242c8d73b8f467c73165d6f76b2ccd23508d3cd27f8e2189329e0d7ee170cec8c436378534f5449660e1a0c84179dedd8b210604ce60928f0e5536c399e54f260fe93bee9eb12d48d4b32673999892b84f47cf87deb682928b9dc0a545a820d49add3d920d240872e6da3554acfd8240b5df0c8319a9bec8ab183e3b86408dea195f71aa3c0624272aa6878afc79bdd0be419bf3a5feab35ff19cde658c9aa1d6456e524a307afd855d373503a5b9481c5c55c38a168ccdb32b5052091b0e386cd9a9ea6d6143d08fe81a462bde1cc07e5a1da4eb8f5c9269296578eb890067423c77a053ab4960d992403996ea21e3a4a96df19592273fcc5491b5a41f340ef1e1606ddcc34adf72c052d277a3e80c056f57340080561830a32a1152d7cfdd16b0adf3640e623ce712d48b3ae2485ae6eb1b1581b18cac73f9c276dd4015eaaf71a58747ea620c888ec4289c33bb2486f64c1d703874124e1a992b7ac0cccb5abf1550938d3873a3976456e177541cf503d5f9eb57432f8a4d14ac6158d26ffc88bb1a2646488139e54f97dec9e2b80570431bbca92bf77c9894ec0a47062fabee6e217f129f47babebd6b3e455ddd6427c107c324856ac476657cf3e6f24725fd46e6d395f403e8966a677c2b89466291736635160efbdb0552c62dec65ad62c9df3b30a3faacf03f21e372530e2bb18c36d7a68b826ff4aec1c5c94cca9c0405fb8a5c74d980fe41157ddec0c3404c919daed926fa441ab7943580fcfde943395bc920ecf4c4683ad188269be07351ab1708869759e727d25df434870f6ddad9c34e1d21352f615fde6733e82b8f18c96555551f7ec2bfe0a55b92caa57d06d78d99cc6b97306b838f750e0cc4ec49cac3546ac9a40c7555e973b179466718248e81643d3ebfcc8f5360737f8c75609090154074b1795a2ad4a961bf9aa57de22cc1c2e3790d58562207689e94e404bb7b918c4940c2cfaa0d703a9ce37432c3f4364cf27242729cb65ef41d712f0bca6bb3c8509b930298ea1a2a280e48d792f063028dae4afc97d3675759cd451a46a0b5adf3b07c6f92d942ddda76fb99ecde9c3564c239c672cb487c5a13d3e6c4a98c5a891a1dc92f667c58819edaeb4d07f1bbfa41997c507470913a579f810387f1f8968c6ba05d4136d4fcc65fa947913bde92128bef3d556af4cc343e39f4fa7ccbb0e8ad528f4e1b0a15fe7a562b27544c5880501ca0398e7b703339d32c5148007e3b5d503f1ca9d7d174c9a13331d92348c6f6c0eec9829b5a617e993b17499b448c4a99b7ddd8f76182623d15a71a603491d392147ecbbd44337ef17e634d0bfcaf68515e7661b5e8831dfaca17811f019bf08976a9404a11db8cc9c5423adec584737e6261fa63d172fdd0e271646317d5de69b06d5282d9d313832a396238c5e9259e7b13a9929cd5457c4d83a31292463ca4ea95459e62dfad3b1079c5fe108540fa91468a73e313349980731c02d198d45841dc42be23b647e189603933b21691657c7dd65c06fe073fa4428789f09a3abd382dc67651090112c61daa9af4f1160d62f1bd44661c8c507e2b6e5fcdc72abc0b9ec7481bf6dc8eccd54800a7096b09b6b6986cd0b7636f2310eb5de7709b125c5066a385831ab496abe1ea97b4c291c590ef4caa8831c1b4fe0c5040610c931aea0ca31d17b11db770a6115dd9b80a7d37d57fbbf41041603bcee01c49720c8c3d56f4890f5510c9d46b6828db490137168ca348cd47424757505d7471b8e0da7de23120ca091af808ceaf9b8520cde2100d9ab28cf6a73c47e381af2d0c039bf9cc3c621c212e8dd81b5b30d0d647939845850c20df85eeddacb289e524418417a8c58f9155c56b47085d12d3defa1d71f3e3c4ef7de33486415d09ef6f4109ae50d7aed3b0652fe63826ddcc78b9af480f5126872c3143d6472e1a0a83ce05aaa7877ecf82e132baf87ce274dd96da8dc9b28a04d2d3595d3a1fde287da8cdf42f50e6d2477d2aff305d0cfcb36af1e602fda1118e2913b0cdc12e2020ff1bbbb25bcb01d801b05b411611244bbb57928cd201f8e78b4dc52fa1440cb0ad6e43d292cc0e306220a0df2566c5ab09dbaf2025d68c684ca4cf8199946f3f945ec907aa5d5b3ce8df18c6f6c8b44ae35bff2bb785f371e9e0a95c6b1c7e0a6c412cab3d0d17d764aadea19b715df9d4d09b8f9c73fcb495c5b338bbfa8d049effdb61f50090c94d5018ad68deadffe411388a0abab41678466aaf79b89f7a81e72d325cb9fccc20a128e432e83e4f74fa583cb8f7dd09ceb2d09fa40f4f7a57bd9d0b25a0f77349e8f966387c53e0f29b79354e2c6f514382815db18e6ed4bf8a3d0d0fad4196d49d906c4e86e6ca98f302a44f43a003ad6dc25e317b76e1de36a1250ac8516ef31150fda77f0d54e02c0393f83384de65b707bef288152bd82d50d57d0055ff5a224b667df50308d157771c449078d1679030f911a241f1d5bf7d5856c018628858537962e441620a592e8abc811b34cd26af87775c739271f4dc1adb581b3e9ebfc539f6748ec08a98e4766ccd40bfc0e44b36d123243845bcfadd702cc93d5f6901583b275c9eb7fcbb7f795a22d2291cd26ed04d29bdf1f45933c70a75e019e6c62368b4cfb7603152863dd57085625471db56209f134835c50cb27b96e0e3449a6e3d61e39bc8dd03764b561661da5ed6bf21433cd0578b92fda0a41cb22e78a42dc0b50fba88311e05e16088f23af64c04822a884481d795d519fc47a5b003ae9a5d926bdea03aa8eb5d378f7ce6f92bd71e1985efde1a5cdf5c2da09a466c2befd28e5447a8f25e59f6406628c787ad95fc01f2c7fb904d1c8d41ae6cf87b9d5759c52913f91acdbcc4997aa29276e013b7f08b91bb7ec451293e5f1ce2e05ee7c1c0f99c45a453854b007bc16543da0106f2c326dcf7e7473562efe16c595277883c675a672bf5d0bb8ed3a7341db245ca9d8300cb1eca94453dba807dfccd114453d0b4533695a20be99d42067f633f6c5300a26ea2f209b5c0c875521150827bd9cb174a3ebd046d436d3e5db859db34f3aa6bc218db8ff5a3964bc47eaec6ddb09fb0a5d1f2b9d812f8967cb39cf4af31b25aacb009b48b17eff38a311a77d7a12689ed0e257150a827ae939ece5fd4c05bbb1102215725989602eafee8158e36939d23b1096cab16495e9fd5442004eeaa4b05487f74c7081cb76643cafe44c3f9a7f52ef679a27f31e03091ef7b4cc10d41682032c09352ad92d7c4a3fa44cccce429666ecc5e9fb98d2d637aac784c6bb85c7866d2983a738006f2d3985604372ef1fc0156182ea6463d796b2c739902d1700213357aad8e88feb3bdbbcdc7e9a877a51eb54876223fdfacc204361995779da056126696199087add46a61a6710af68fa91bd8a2987cabd803720189a6d1eee010e2d830a2244a4d96addb4b3aeea8a0992765ef5b1997cfd03e6b1f51fae907e044f0b041b0070ca65084e349ead110311197fcbf9bc012f305cb8a3f5358917a195befa41fa33d0a0f25b9769c202e96d06fcc6604b9b1b1177fbfb4c1d72dd84dbd6e07ee1eec778eeda1a7e5e9b4b4fc86210d902b65efe73d353930795af9b055cc9ecb8305fdfdc238c882c0b06f10f7cbb32a33189944864e2661e3d6cb7b9a26faae2936ffa4fdc06fdb806711e6c03b37bb816070f919a6f59a9655325b02b088a361879bdf6133994e9cbd687b66418882b7341ad55bb7c7409dd8c1b60ab5b4474c7458874edaaef331bdb10164a7681d625255c3bad345da2e2bf3de71a1009f09ff478bd19775aca8683ca332ee0aeaba98130277541048634a06deb8f55d81c5a545a7b1cd418b030c612451dac9e4c562cb4cebcc26297740f323c1e46896f41e4bcfb5c86e9ab44f80af9bc819d92f6fa8217cd320530d8b09393afbc7af08f81171fc1bddae9b08c8bb0466f43fc77092cfd227b850074623d6b73d72ffecf0dda4f06c3603a79ce77f0294445dafc87a6e4cee2a70cb537e51324c14a45e8f55c93d498d71e383d6021e58e5c117b004417ed986a86a98add042ed9997a684d5a58d86bb287ddafb348bbb70592057bb1e3d7138124e036fa459553a1024645e024a9c4b1a62b6c1101e2fb3cc149bb57f8a0974201e145978d551065313cfc0a41ce388618ff7b1fe8e3fff9764549aa4eea5898446e928fd75cd6051a8e712bff58798dd158cbe20a2cf8256de2669b1e5f8f8c899fd74737c6724690859686ae059f3c3abe210f5e87cb1bc7d911715d4bbd14e4a124547875c4adebb79e42bda075274d5b907dab445123ca381df1e32dc61409233adf97123c2386e055317f0740980b89450ccdcb60dd8d43ca40ebe850d7db8847be6cb9def86619fd731454d597676ce2bb9147ad034c69931716daaf95175a3e688c904dbf11506765079701993bdb917363bde7d422708aaae36089baa01eafbf790e93623cbce95155163c464fbd8a848082db292d0c73836a9a4478b52cc0e37c40fb388464f5e5846ae842dc594989a1b4215c351548347a9f9ba6247dc3e1456f2f95dd674c349357e1f005516242a478d8d094f2c6d5f6e1b57e69353b63f77d8f424193f5a0173e0b136465f29263270106acd22825dfe75c0b7666021ca260ee3eec09aeba6351d3d92b29586c9b55c232469ddd6e94bff492f7ca0957e3306feb7af2895bd71b5eba75e74febadfb4e45dfba4d7a0eae1b5bb7c7272517ddd2b44aee523ff9cd1850e61e247b72774683d73ca0dbd6525737823c3ae5d92ea4ea275d8c81c54fad3cdb3460c60d848b5b23b8b6703e3c1b9db535360b4f9b3c0751c9e56df0df83a9abe82bbfd258ec178240a561c51ae91d762347ea34000624086d52f1274c3e9cb0bd5db75243aff4de9b4b281a7454e87c6af038422410876b9452b0d2295d5dad864c348a34774566d04477c172498a65e14a4ed6500ea285e51acb6822412230d9a8083328b5682c7d18de5fa8aa642a48193b3d9679f603381114ec3281d277b4d925bb86fdc801dffd39b6e5d51dfc9ca5f9b35620b708f7b975152ae3c7bcf31b7a71e227ad888b77232a41dba1fdf385c8a7fb96d9228dad164ddea30818d2e1a2c0699d61e4cfc248a551e33732c3f4a9eb61161d416bea5ff24291a071030b813ef6497893f6dd4044fb299836e2b7b8a455f545cca06da4464602a93bc2b706085eafec147222d3d9be4c607a11cf0c347b56ffece5fec4645111d1f417458f6614e8ae39a83525405d010deae0f58d75683fef90998772935556daa3313a9d6df06e566a08c844ca6ae2b96e5f20a87523a04c27f626e45ff771d1a7925dabda2b5460519587d1dc128aae478531f69f803e3e333b4784cee46c545250fc9288b7042e97e9da0d873db44199595bc1b726bfef1e6086d0edaea49a5f2fab0a79d63bcb1500b0fe8ed902f89fafe8fda1e0b7df5690b4896ce264463e6141c17a388264a4e7bf62e6962adb713265e09c928bfef4cf84be98e9d532af22cc1171d6af37e79a45873a4221eafd7a3f593e228c6ad3bea349016d5285388c5d2cf6674e039698433ee81f9c2685a8d83e88cf4f89415a6ce2777db881de02a05fa85b2095ff706428743087172c25c2f81b7003c91288f40a72fca9cdc88e244e98172599333fa209373953a53b902f18311c7076f0acebd689f0a39c16fda6af2ebd60e0306d51785fbda1ca8e24d57081ae15aa1c4cef6578ddd91ca16df58f5575ace30e755e812676ec8ef0ef20c23df0941cb78b946b92b28f06eee32056672ba6a0b7948dcf62e9a325900a78aea754c90916a85a2cc4f815b7b11730b05d6a01e9a6377bc186699d2578b74c1dde76d5ac07737f12d1d648b731fb47b25dacd8264c9ee000732a304e9bcdde61bce87a10ae4cfe17ddc50e38c3b1be99ff9a2ede5b4e2d4c790fe5488c13785ca69556b2766923e46e386845e41a8ab49b5888947611ae2627b05c9ce17de24d25aa4b53875a3006aa10b608d71f0b16b55e64211ab334073abe13730913a123372b62977acb0b975ce0c528f9a6633d337b5b5d4ac4b541733e233ac78c3782a01ab6faf792f43393cad395b44e19528c9f1f3d3ade417a896f4f5c20635221609d8974b8182a5609b549b0ed7fff24a6e7ed1ef2261de8b2b860c3b65a14aa91c0103752b93e49b4d96f22ea305f269da6d2302cc8b5baa80232cc756b8850d75b376a5dabb8bc985eade185c18c2feddf9e28666f3c67b7d703006d6a3d005a83d08a858f23225405931005428c06d0f3bc49851a1a4f9595a852a17f96669775849eb16216da78ee2a0f68af0d3e5c65a03df00cf9021133a35004939dbd1e338cdc548a7316249f9af4a6582f00d21ebb3f341a6e277147789653fc6e156e0e6d843eac46996dfb6045b6c5e21f4dc84b4c6f6a74db971056df59d5db802401e7f5c0b5b468465f18f4dd83333b4edb8f533beff6a5fb86d10e94373b7153bf89e136690d72e85be711992bd8934a57e627fc5b493c002a6383b6e86695a76fd4f9d729497f6021eebd4709e3ac3dc952ec4e60b5babec0f7ddc0f09a27785533b0b00f2cccfeb553f886537d46e7e71f649779c549d5c8a029b559a4879b89f4221e39bdc5dc6362a8e174d39f4520275d32fbfc29ba27801342c251381eb62c68b0416bff71f611984a2f0953eaa7a510f4ee405fcf9cb561a542efc9c08fb2589a19d279f81d17579ea55828ddf4bf63df77df21d22c0435d9f6b43c0ff4eb42241cd45c6be1870934ead1b4e08160b05b6bd3baa2c5a6f4c78b20f24b48c0254b74c146d6bf1dd3eb0cb8325f5204fe12963dc7822474be5a4d4d80fd7b300090cc038a5d0f3801f9b5b29e6def0349abf9696857e7ead5e465115754a9ae123b0d0d6e82a64fbdc94de95b23989a322c2b3b5614f965147b5943abb2fcb60030c3ceaa54d3378ff5ea113091f42cadbd066bcce4107de04fd34d0cdac337d80726d89018bbc26fe7276e8740da85eba4e6da8e95adaabe6efb613b36d8661ecae7085234041aee464bd9a1e3851c82301a23b314fb38992375553a89097142cf29fa329ba3bc7fab6caebba205f5ce79f13e7088fdeca0d674342d96d2a5066b143b17195c7c5588d0de4194401d586e3a95bdac0ce53340da929f7f1120f127a50777f547a8ed9f152d74e798163188375707ccb244210d87b500154e5de87a327a26c851309720904d078e7421dd35980b20242c16b68fa90dcd11556eb360a78ba1712257032d2f38d30d5e27d53f919898f450c59cb89b49793331e681b15c3d103e6dde5e176a4e591aedbd3cf4cc2f7e08b49d3ef1dbbac7a9006e819d1fc073df591e828943d640e8be6cdc8b4536cbabc98748c44e8426196c0fc731623cca7d2817e11c8fd1ba4e6f3ea8200db121f0c0b90b158f17bcf1b7cc0b51639039eec2e434b63a9d406015b20ce21a924069e88638f97a08599cf19fe429c4b4383798750a39050ad9c5f9f6d80f1f2f5d9c2a8c7a9b4e9ba1f65ecaa08161834b715dfb23f95f82f2960d6826ecfca027a8d4d4b3d35f286a1d47a03a4ac19ee43f00abbff004f16e6b792d08a6802850c9fc963f20644a0eae703f9e7e9415b33f2e5ce630c2d5d526abd5be46f741a5d7d9acd995fbf8b103305f0eb6fedbaacee0b49ae93b4fa4ddca9bda7f737e6c972b9e1acbb1f9fa09ad59dc337e0b50b1106c3b8ced47741046709264eca6cb28836a7aa217218235c4500b0d222626c2cf86b99c323616763442ba6b86c01eed05081d288360380061b8edadc1f3a5bae03c687078b0b02058e3f1bc95aa21b69e900f1c5eda112729283cfaa5ba79173fd48e989fd2b4ba5d63c3632d5a6254b0d87bfd2e8daac8031e7bde916fde7e930671c83869b15484b3f5dafdd32a65c7443a35b507285f4d38353441d8668645f142f83b268d7ffc72b327e62b4827aae5342a1cd78aa13bf6473606d9e0286a577a06758edaba04895eeee8fe4361b312bc818649ee22739df49166ba9284a249b8d8a87f84e2cf7d5cb1cfea847fae6f0f5ea2bc0746b8b9607e7bcf1efaddc76bb23347ca73d071e269a321769356ef6cac37941dc4b90234b0bdaae005139c1f788defb5139b81c864a943d68fef08ca684007a09d94af3dda06acd247bd2df3b8660e363d259323aa20cc8f36ddf5f2d406ad3927b0798b1723d74ed2e173e39e5a8424aac1dff889d7fa382f4f732c30e91b4061d4c632cbd456459d5d3153eb8db4458964af2b9daf8a53ee54c656d6a5ca69c429d53f218e443987569cf1f07f756d58cfbc3a1f215ae970dd38f9826eab7957ea9e1957c37b4f4a2d3d4f1a852a6e6fce305bca91740f5c20656bbb06008c79b8e6009e53903dae4f6eae0f03c68ee21bba30928c960eae25a4045387e61c141f1c4364ed804144235efa8465a4399a05756d4bde9d49d97a1425fc8140aafdcd1f725c69124c2afe075e482a1a49f7b9f2d967d295ab5cc97cb14bd3ade42e85499ea086cc329b621b348a18922d91763362ffaec7b9833ca004a20018e818d81fb1ab848aea614c4922df004d3c5e7e83c0a18ca00acead74b1042e3ecc446db7dd14df63f02601156485413551f59a00e736e7ba9f24833c1b8d3deb77e8662af70a9415c55a088fdbed0e139cb511f048e0fd0d7060f902b3ee0d21188723f4987dcc1b06bc2c216473ec00b27cb1b6642c94569d09de96f182bb50b58a2392b8b9bcd56fe70d960dbfe8ede943c5265e8ec9cc8918413a23ce8cb43b900ee625522ee3a2b6284a00fb5ec612742f442c3bee304d948dee6891319d93a98773dc263fa38af5e1eee2677c7e844d5b844df61ac97b2e1091fdc75548329ec1e3e7973d4b40e19628314af38083c9cd80683863f0012218f47b7ff2b37fd1fd59eaabe61d94e6d398a07d9b67b49a102066f0bd81382ffe7f9fa541e703a9ad0bc796499e111608e3d56cdec2a014f185f8bbab7987c10a477ae988886b4d2e1bb7f62d3bfc8765f8cdbc3444d5b4b73ed7a104ae8dbc259b7341014b7a709c7c50bf4fc42242f317347fe6f1c1178b0f5e826323e0a31644e4e00b30e5a0b1115c5c6fed3fd0e75bd9856b7d34ae519f220ae94920cb4c183752a47245a581db9814853b97338b1a4039bd3312f0ab60a2bf868f249cf69393783a16c4cc1a220434880dec98a041191bd36e637097ad32850b71d70271b291e368734040d209350dee799a095476aa9d77567545c13e90c7d3fe843593c68f3a6d6b2f01087d8420dea2d030f8a5273322f2b5e90281f3a5409d8b7bc5de9bf0121d5422e9b571104559bde51eccbe03b266f935582f4c0501080cf08aa240b666c674af11b3b64c9688ae71a3bc0d7b7781723074a1614b8dc209e16d5ed31eefa27e9cfd6385505d9ab6e7ce48ef0cba9b2dd8fa80b46c35386f1bd0dad92cd0b064b7fa5b42f2c0aaa4689e80baa6c6ad6ffd3868f10d5cc46712986680b59f5e73da11987cb0428a9bf826745207b82ac8c1e95c909dd716a26bc5997e99ef0855b3623b894f7f80f017c1d91f40483b4ceb378d18c5ba01ea780dbe8fb26eaefed5579711538503d796923dd7d8237b3ec0e75e6ef857ec52558426a65c7b87154500d8666d9bcc64f2f5985b9e5e094de10b4949f0afa96502586d68f60ee140398b5707de0ee3685ad2d39eb18e3ebb743884b5493618419d38518c08921f350affba38fc5699427cc6eadac9ba98514c07dfbc58574d6bdece17d442422e24f1e4d774ef009ac24988403eb79f24dd8c996f1f0f384d84932df40dee331a7b4f031887d4d973eb1d525a7a6658b9b5842067cb77b8c82e502d3084253e556cee2e46ba9168a5a4ca4b3a6cc74f489d51c38bf41d9a8cf68f7babe09c1ae84698922001c2204b94bfa8cd9054fa046710af12c176a3c138454f94664a6c645e256459ac4c54687d6623f61841869631326a63ea6ce89333d312cd13168d5a80ce7ca00838829d391d5448a48b16205c8526c811b0bbdef959c602a3701108e6bf78e5fdf68514be5c38353f6ad543347d3f342f0cfc05785fd0b40f4c6b57750debfbf111522b5bd9484b3416ce9e4c45c794535c306d084b2367c15bc0ddba69ec3fb35c88e12c1a14ace2b4e926eab35f387f59dd410b51cfc50b74d0cc2e75624d9427e96fbe76954deeeff560fdaacb62cfc4ccf9fc39b6172360ba7f1906a0bba6e4eec9e12e0b99b2b38221d4fba6030c3257ecb685f83e483fa51cdd3bdb593e00e26286c0ceb6fa2d156031a2f8dc7d06de2cab5825ec2b17d586ec983378d317a5d34dcf1abab4ec330db01766ed09dc4c69a0878a44c6d7f2e914881593a438a4ae3f031e29d0ebf8e87491112fde019e9a4c9900597d7adc25451be8ae392c183e8cfb2cb2af2b1593a216a7f3fa4cf6f199d06829b2e39c2b44c9f4819f86b6a5b225820623c0e4b66e295f146b0d46bd83554ccf2651ce08ec2719cde970cc53a5513b12ba1b80833698a0ca2dfc94fa90e4244d3438acc8e95e637c8d7008a6142e24af6f1356511338e9ebc444aa1b282fc0ca166dc270b4d212bb3fb5febe2ae85bd6815610c65ebda673289ca51c30bed8cef7ff111b3cf9fac8ef7a7e2b9609ea157080d344c465fdb16799fcbe24a3b4445e117ffbd57b1595e916463c0d20c37343500280288c5872377659bb50747cbea24c80ac3ccb0690d0007539878c7c17ea0a508e8288abb91ea0347373e45c2b16c493a178032edf5da08aee759f614262d8150308e5e2ea94ab131ab033e8639dec615b5aeda3fd11841c4f3e598b1c9b3172d06122c8269f884939bb7073075f6f514de620ac7962411aef306cf57fdbe52832ab28fe7f9f6c29c76e140e0d0e29a32e4d939c676981810496b7076669ec785f8ba50bf917c071576955ab0d6818bb72e412a355a5060b7e30eb1b50fd53ba16aa318bfffaa9f1349bcb0375b7c5ec086cd05c381e335b07d1b7f546155aea84e9a1fa2f7fd16ce27d2a0fed5a017baf5be296283c47a1638af6d9ec7e229956f4fcec3c870293d574521c17443a9c7fd2dc3a0d41c4196f6427c50cbfb1ee711b7ec5d6949549be5eba0c5740e8240c132904a94944a08aeb8ed09d063ec406f766c38153fbb88c0c039d34369339b029d50c7aa58b5ace38adecfa82d4b739d3278545d5ea1a4b9247943c5b93d296733360a77711f07481e4af14b7110c6541a92e448e7a1d785cf5b532ec13f9b208abe2960cd61f09d5f29f1cfae8f3fb97af6eb17141dac3e7ab445b4e42f2d85adb6bdc03d4a81faec529756c08f32f815bf7ae151e305a47d2625b64c13a6d6298b20378999c750032b3f0b769f0bd81190af99c75906c2ae98a2d742b680e2d2b8b59d4e18a75cbf1882fe58604ec74506791015490d461c010a3bd43418c1448dd2faae2a4088accdc9c4d282dc9857c83301d49dee461e8af6f2a4a045bbfe380ed2d1ed5fd63bf17dfc3d9b6635faffe6d9eed06b8540be90b4055aed276914f756367fbf567cf559d7113fafd592cb9b60d0084482db6d5909cef83eefccd3a89447cce2da3f180e253606c7c242b3943d66ceb9df95c2d0fc64c21b7aa767002de18b7d84373098eb09da6c7416fdc0ab4d10b82f862b4b65a8db85777d406a8816bb2b264ff04489fec2c24adc3efca6a1312e2e3debfea280180f6ccfbb54d49e207bc41a1e43b065038fd8fa0964e7e451f344bda862972b83657aec0d9bc235b2c846780048edbcd2b0779c6b76980bea4336be97b7d0de1b255d644e2b21dfa7011a3ce3804b639fd76f0b9655dca27fab1ffc6fa38e5bf2f8ed4e842a51ae86d20533a0e2badded15966c2652c31d017d596cf36cc985405c2176d3830d61aba8cd775872da1905ea9bda839a655b48cf6826a9013065ef24544b3182483c465c9a99bd56c1bfe21b3f9d187b9c1ab636193004c0cee8a7e567b575e2640216e39ff416a79d9906d9e4093cda53c49e96ba022ae0f09c00a02df69e0bf03a3a40ec34ceda1f3a2f07eaa16cc61a07ddd0cc7ca0d3d7bc73d8674db307260bade558679b9c5266a3062d08540eb239f90770919ca9e8417bb8c491e8985d20940d9dc8a37a2f3a5a278bc9f1c6d1d73e642155c55bddaadab0899a8750b22763db2a149408fe19279832705bae4404e130280aad749dfe62d17255046822550ffa85104208ca8d448c55393b94ab07f7c9c348dc9c843ee398f5a9aa8ec3850eb9b9febee0490c54c9da9c2e9032b8d128e094efcf9d312eea5069aa3f7e323cdf093ffe06eb32b1a46a62f8b8c9f56400cb370a43ddfd5202f769077f92aa77bcb89556b31f33f0ae6fad501a8ab662024c8d3a3ed3d4b325ee68087a07e7c0af407349315df8342334153850410d9c300a6b0cd79fa83f14c7f690be00be0db48bb1dc1afbf5bbfc920edd70f4fd01069838406206f68cfd04a1a408783c27da505afb58ac32b47ff5ecd832af82243de1e51f69eb3815d05b48c8e170ca8f3a0569124286a12e47f3dfd0e0f0098748f82dd8f31b9c2edbd284e0adcf6ecbe000694049f029575e2d913355e03503fd0d1f0fd1833d119887aaffe7aec4404e994d49c1e7ddbc7487752104ee2a3a4d4fe2646f179c455c280eae119215c865c0bf6941d1132f60812985a30980fc5307e14960c50440f142e8a46a21936e2a6442fc8b98f341523b79e130c07d4266d187084729e563e3ccbdfec9eeacc4939531f8d2ea721411958cd914402611c8107bc84dfb480637a889decd508d4bbf3f0c5494735807d5b7c631f99eefe549e9eac7b02c3db7ac1549d2712e3767e7efda63dcce12f67435c4f26966ab2b9f280a19900d7d128e95664c153638ce503f41cf27307a6658594f470950e7ec14e2787b37b4978c10af856e3c2e709088ba355559b3af2068ed9f1bb3168fd3cff02d7a7bcac37e50c62599557479c81c67e5d04f4882b6c4aeecbc4bfb951d9b316deff5e36182df4ad0f5093b83d045c798e7015e81480660a18cfff49647a8f8123cd9485ee4e2d15d28ac00e39ea82403a526ece5bbfef014934e28c1e9e2c6beaeca3b310d9ee30eb88f740d515ee4dd157d7118bfff03b9fc3c324a10ba7d62acd2e577858fe67d5a22e833b8b0c61e8ec8c3fd6119b8461f51d355fc4bcd02073b72922d0968ba29742c7d4024ee47998ff88316bbf4a5ebe556572481907d9305050d588a0076b8a3c75a308342cfe6f10a14a8e2f7e21f415e8509603e76ed025cd14845cf4b8f2b7da4106b4028c7ecb5a7808be768393ac78fd09b71283ec79e802077269fb5cd5f61e5b473797bc03ba8a974a42d0fea87daea20fd14cbf212ec6652ba32aa597bb28502a55712f91f8cf15217410a1154589909e17a490bc7fb1fba88a11982e2b7ae824461f3e4cc63e79932b00482c636399bf8c5a56859838ae9c95603eb1e0fc1ba41817644b9cc93057329055d8a9d70431ae8cb6bcac7347782395213684131920ea93575a7b101657eb8a4f5d9ee808af33327b33d7178d28ce9c914963f3b180897ed61ca8a8d6ed4bc0faaacdac23e3bc2d522e66007ca7dd5ea7c229a6b5f5297ff093185036f3ab8c505ee8fc33ae493371446e212f1ffc66e5af9ca9f6df5df07bf1b50ef76b911a12aeb1fe85d475756e5af0f7f272ff4c157f5ec2f5770bfc5f44eefde844027f1afc6c185742232a419ee970cf692414fc99998b56e19fddf69c018e39c1841c21a44a04f846bcc70aa536fc1142c8d959bc833728e1aa5125db589c3cf4e3c00fb897a3ba41f7a75f112aac355fa17b3ac63c6aabb40143bf90f2b7e79360f8a099a49e5582b3706d7ec1f0d1b446c0d4e97cf42a6e30e12bcc56f8f7a8752f7971afa52a583b97191f87ed41df442d0e10ca32f87543c6a11995972f145392db2f0ff1261bb6f2d31a8afb1e3d2224aa0bac98727b065a78723f486b8fa5397272671ad0ae18000db3d9b0df340c182a68ee045d16a3aead7169ba081d13243191c5ae05c2ead38fabff399caad24323d855fd4a852dd801637049e9b8b3b74ea71a9b6899b809cb08d49041331b1c22ecaae89268904d0920faec9f7e3d207a8a3bb492057d341410b5425a110930c4caeec587ed0aeaf8a040b9a2737c5048216f770428b8acc633a79822b0ea710fae545cf1a2dc6d52f27e144d4a80baca259372fba533271afa6ebb66f6347e3a82da2d76f459e7230e556774b7042586386826d650791571700c4e5f1f369a4b649ccb92210aec8964800e07ebade40d6033301121cf8102264e16a8de3b5af0f1f5b60b2664220b4b844e9d1dd13c131ee3ebab7ff51a6739036e3c1b02a8f0ee879221e81d7e40c8d338f0765baf920c759bf5465f2292f17e985ead2e21d238a69144abbb9eddcc2277a7757e31c1d93318192cb5d52d995cb19825a4b2db30e164ce074c691ad94f34c66d98d76ded0332c3e0896b74a80df29098c758dc70f32677046a13a52b901d681b12a366c60e7f6486cd8041c8e7f8f402505cabb1aa169d59ff71513e44dec565768ed88fd581afaea07283cec8aad561b09458041c8d18d44f64e660abc1219cfe8b346087b2cce1151c28d0b103eac6b0037a6dd60fac7ddd7b612dd31eb4a70c8d7fc9f643c6cea5041bb2dc7e582754eb6c616f1d9862aac3b8b8fb81fe7ae1b42c0f84a248aab7a63696451b826692fe550a5ce19000405d32201cd318cd609869bbd69a05897e178363c48626b3c66e43c2046581f3905d31b0d450a94206ce18ea3ff218f773670c2bfef66dea755d9c50748b713326455e2b61112d28439ca96f7192526c8a56a06a9620601f7a2140c16f99464f399f3e08282c69efa0dc1f745aada468573e7cd3cf5f0771446a13a497749be92e21fc2170cc8264c748e1bfda1160735a907079c73d4e28087466074879be9e44f991f6f1fad5c774e8a3b6f786008798f938aca763f620bc23f777320d3075ae8f232d028f031065bb217a11a5810296c840fe6644076c1be7968eefe28e7b04d7c888f6ed621fe2babe793f6d09c57eb219df9508b09468f5902bd177366438f9d34359397255d5a03c904e5901c9eb6c5ee4426bb5fc1a94bd8275a8f3be65be2dbe3a87a0cc32cd2e7b5be9187463dba948940ad53fe6d1ece7796cfb9e700fc25a2d37c7c838f9872a2426f7b247be78cbaf25362b4f73864558755d05213ed561c6b2413d041228b42013b001ae160a225a76733cdce37893d3d3d75643f7cfe73a3d97a5374138b134e93910b4ce7d4aaeb5c54fdd84bd41a5b7c0719d125957a69adfc7121972662e61878e664e8263279e9c38e0e0d61650a94eb49cfef157d0796e5edac6c7a0870b3d15be87f3d1a0392a75597a42f7d0889cb39302aee6ed03e6fc13f37ddf4fc8b79fb9a5744b40ac194794f080f44cbeaa2fcfeea11dccef9b8c46db044d696f52d6738354a29ee9e94204cbb1c39883bc6d1a19a9cc42bc3184b0095addb62150d7a4a55f4a4841f7517e0d690f8df28971915df1a1877c33e491a11a3d94534085d3f29aadb677a8da778bde1368193c7dc3b9d9273e866dbfa5ba354a1a795638bf9a30197eeb79c0562dadf42bae0c62116b8e51c4939b714af6dc20965325d3b504b57e9165412ec4e3fe305604d3b71d682668168f955807a01abac58a2ac0a3faa39abf25d074ba813475666e5b80f4cbcbb4833964204ec660763df311ce0ebcfcb4fc0d5c2a5414e26c8231a7e4408ef1207417b16a8802c5b203b9052ee3025e947692e8c45aad7a588042b6a67f08d841b6e150ebfebcca652599d3eedcf5b787289c31c58df6d9954a40887d60b1a2228cdb6f6b3c72554cc15d5b574fb4b17562fa4534ecc8f1f4fe63fe93fc26f1dc62fe0068e087c03264b01f9ea77a38b7fbaab2c8067bf5137dfc10637a9ba43b95c3d302a30ad42799f7e4ad1feee9ee5db39ccd7c2fbed92e99183e0c251d94d42eca8a6e658a44540921a51377744c6839d1edacb11c33f533617d6cf665b621657c90285915225bb27454020797a51fc3faae173e3ce0d6406d3979218b6ba1905957d41a406eeb7245be19c4e9fa128c21671c90e23884cf2554d68432f4651baa253cfb37100799204ce41550496aae4dc91b76ad0002e43f89e2d983619ac22cca54ed368fe433041fa434fc5f903f903ccfe4270d1bb5dcc034250a06756f523cdbdcba3485cb26c0a3aaab6553847d34abb91a1c270ec2fcaad8c7ceded874166533449cd6da754b67df8f555a0fbb1fc4327708ed33264c512d634ba90abea1a9ae4698aa1c8958a81896340a0c64d410da57576e6ba9ac3eecddcd824820f521d1c195510ac2c2b73659055d653145467e018d40c7819bc0aa524fb0308997d89136e204d7b4151d5ff21af74d941af481d2f9e770f6bd854eb23638fc23cc02637016373ac4ea15330e5eeec48fde906bd8e1e3309aeb2965ea9bcaa66368678a0f32254f8fd62c1ce7f86340741b9570f233b6e63d8481408772f009219a9df47a445230899b37a3cd90b456edf0bc942ea684c0341e382efcc8c289f97019102ef5b660e250c5e488d86a3107cf71c6932dfe8b2c59dab0fdc24e15196d9a5f848ed04afc48b5929450a6238ee6e5075722a3fac68f922968647330040373a7729daf3e7e2e3c557d7245752846b70f4ad6474b0a85f24eb49008c42bdc6b66647992f870abc685c82fbc9080236f66e9377a2ac24bc0424e7f1baa89c2caa7308271e5965e7d679bd29594cb731aa5141e5bd287898162d9f7b05bcfc519716e79748a2e1aabf9fbe3648ed701a9c3d7264dc24db74c6ee6b0a71bfdc841d2ea9a1f1c1672374370caba691cf772494b3884a40c78146d5e0bef206b57a9d7fa043b116939e958206b31f9b432c6d63773518b57aab648a6a9a816322ba9b89ce74b7248db6d58c47cd55352f3431b36b61caf84eba7b4d781428cecefb61eb99a96cd1102cb51cddfab989edb7f8f742b8c2b4715d5bd6a0b282553befa527480147866e58916fb31a453ed465ef867da388c9731e987b9b415f564feb4aa3184cc1fdbc3efb6f8bf9333af732ae46c94b6fedb6102ea12b2f89224529bec83d603d8f7f0906b7e94e990f4bfdd307e1d69b3132b711a52e8799ebcbc7259d1e3a89e166111284b118d673077d031f233295c3ea139a03f349b30fac3130e89f5fc3e7716638c2ef8ce78c435b0c61df2a982063ac5f1057af89c84c6277bdca5d4fd889b18ccc2faebd794126e391b32df612d0a718707e4d37bc133e5c0db0c0d8d076507c65b6ac4dcabc31da308b0c0f3d626d000e2e05dc8cd410fccf22a8a160a5079633bd2b3294a23d843c5bfbe430c6f3d76ed516b2b1da4fec0955ec4668f65f42474788e9b39c9b622861937833a53c401bc6b0121bc616da44d71a5dbca7a2769b5fe7b8a21b73f2abc78ae1fbf26bbcf9517c4ba7228e814d26993cbe0a31dce4dddf705a4aa9198edab2c01323e51fe2fcaa3262825a9112d9d0047bf3716993f6c2d6941add859e7eca93de04b55dd83bfb94f0a555e18a15d997e01da0a4ac4ad68bd374b0f9708e3afc2e74eebc3ca51ccb6dc6c693d052a06c32b33d12e1b06c23b4fbd6881b4e87bb7a422c73fe236b40043e782a973af4ccefab1e191bc7c74ebe8045bf72432eabddb237a47cda91eadf535bc0638d3329ebe0e8fe85d18a48173501a93661996488a947da0784ea515cfc8dec5e059d46e5c8fe03a09fbf17edbc723d5c9592bd3b8a70bd0bdb50548bb97058c05c0d70483744bc40c8dc8e069936e7761197a3d32af9e928a6c4f9c06f9914542b2c4bb6aa780fba2536ac237226ab7e6d10aec782535776b5d7a823351e55222cb784c2e068e65fc234366272bd120212f6f6b19bd04976c33af93e364c1115a9c7f1bf4fa8694d107e7d8860af101ade09087e6d70fd8c91adabf94beadae12b6e14c4ce904ab52d54b9ca8a8c6217a146a83ce4078405ae99bb2f1f42eba2a0850b5f71141f54e1439d7ffbe20564027b7bfb389fc1bd900846bd7c18301aa656c53dc2f843d9c74250b4892009914ce758f07f4a4eec0fe2152fc12ac2c0f2dbb0b4cda9aebcdc48282d12c39fc4fa40afd298011b5190d37dc61783b056a3a4bcc14b51b78b88df8f1423b7268ce46a60ce97c08f86e6e79e00dc494d73e14e2073dd11b7f018d48e31cc466536166eeda74a10da3e76fdc0e5fdca28409ead3163c4893c569ae42c2f8ffd288e723bcdb68fd7622e859fa9d2160b442a5aa0e418aa2dd1207a11bebf05b6522a2f7e8e2250411f3f051bd7fb489bfc32c1332570ed123a9d305bfff2feab46ca158cbe39cdfc0a05864320d6fcc3df652e922ae6c4eebc66ab5f5460e5e5caff2619c4e049769f2f9188db4957d2aa2c1155494f84f2a6095fd3c75dbd6df3f5cc454208d573a7d9bd2c3e66f95cd8d4b185c80535bffa1ce4c6420c56329ebd6d342ab540709b7b2809840ae8b0a21b591a8d33e73219a7d8de5c6b35cfe3c71b45ba2e036b192c6bf0d5a32e2f73bd1fb3b89a104a3bd4b87c16a0701ec949f288c71c6f7557642436d9d4d6b139c575473adcdaa82417006eb0e2ae531d3ae6172aa1e3d8195f3b2fe0404e6d53bf2aee328294291438b6a89beb78aae21a02f7e11618e01f02256dfc02d1897ae3e471e7edf4bbca55ab1897b838a956f66a0af33f7695e3f7d674af3dc303d4e3ce69ee30ada8bd91782bb53a51f2cb83f71db2fce358a9c7772634bbe8313c8d4484c6efaa38ce52e37c1eec95b96e4fa374694dd31297511ed6c0eda1aa524c820040519384ab8524464110925b4884a5b8936260e67672d35223908daa2a6f69e0bfc7470b5d7c5a77e2e8733a33128861ab39201a12fbd2d2a1f8eae660e1768afa15e7f0f80d2c5fa707190214d1b5d8be85044297e0cf1e988ae1bc4bd38ed016dbc8c65783cd80a6cb0821d39cb958518747518bc7ae9f57093863fc3f31620c0cb18ff8c1c0437aa3a37d38e71dcf72fc21e4589a89362fbf37216baa50b6414f85773f84d4ed0582c91c3248acb68271390c9add5798cab2d75ad1824a9bb5d6764f4425c19b05156e8e235efd5d27421f4326c67afeb2823db322db67aa6af6e9e1e8bcbf34aa405292462c38edba5db06c67a815d25f1b282c0ac50c39a3fca747f14a487149a442d09ff2ccea17d601f3d858c5f7847226bf428a04faf313a53e1e229f36457b2ab8f89df46514a455536c3e669b0538af5117dde42798c095f97a24992e3e5adc2c738a3c37cb6559de221d728d554d5360ab9b4d892f806f300277476f460b8aef5ea49c97583dd85315c5efb99a3a9f3e094de33c3c50df906818549491367312a39e6404c5f9345991115b592c203956978531e4114546ba59f8c6e610ad2bf6738b88da384f48b0502cf776f5a43f2c68f5d3dc176e2bf35fd95800be9a78113e6cebc8aaed22fb3297ab8335e00581c42e5b79c148248f01f1d7de0fa7950a65efd84be595e45d5d05ad8192deec82cbc54143355dd926a764c88a051c9b8bf6fd9d8b7a73e089f058407678797e7baed7252b0153f6c54e68cd5efa240028ce5d373741e1eb4b82616ca2cd83fa1a82e96d0f92df283fc00dfac65c920709c41825ab2e5ce523999805aadd84c22fc6754fe375058521b1f505575ae0e7a0fd09eaec007a57ed8901a86b6462c545bb388e394725f66f37477ea7dca8ea5e18380cb9049157020934560a3479019cf72571097f78db62b95f0b36a66268600821486c6256840221d86a41c8cca1f39d873b6045efabfaf9c855d4b5516a42e4f056b7373e3bf114658ec6c5bd0c7cbb9de9c333f55164b982b28d4dd02aac79d4978c214a3c02f1a3b6198c1576451e884f132962aada0fd0bca589c01ac33e48293dfdd250fbbfe027172e1e37ef5f0b0c752301f7b93f0503362f59ced774a89f0c7f6f07d640946453b6ecb1903bd8368bcd2ce0efb1c42fd0fde88fde74e3bbc98d93f671471ce3904a1723967745713fc3f241caf4f4be11e235fbeca00ba0a471b79ed511808ec93a7e9cb0e12e0cfa116cc1f79b94501bc6796071932d25207d8553c2189ccf060568b1027cd17bffae69c0d7c3e78c5cc4933291f5c9089f17ad270112d1cb38210a2f0e03e6e6865717a7d32c1e5216e56e59d36b84507cadfb59b2b636a66e8a60ec7777bd427880f27978a7072c17ce71fc40adcc58bf45464e8c1ab7ece23d2e3eab4b40675e40e21db9b9c938bee8ecb88384ff597dceed6d2bef7994dbedadfa510ee5357059a25d1428a374a5505800070c25d03ea52e5f4ab11cb47fdab41a6fd19aa79311f87b7399f1b8a12c8f23b478f10d1b241bba6199d6df4987a63cc417526c7431ead94d1fefe251689945a255c4777cf8327cf54eaf9ea9a548a4b0bc12cb8096934e1e7a8e93080984cda98e9a5b3d5394cffb949f759ce77b36609c75527869ac1a17d8436eb376add19864d95b516a70ea8e6db3dda92268f92e8ed68507f21031c51401c442c9b435f331a3d5f979a4be1679fdca7b25bcc255e372dd2b7ebf7a86eade8ebf3e3691b6bafae6e93fcdbca45130b39f53ec48860641691f6f8e64d379f4d916e99177db259faad1f9e59c5f3ea5f40f150245b279131ba578bdfa9c662a980cf2264ea067eacd707a326c6799ad4f950b6f5637a5061be89238eb2c038c557ab2aba7217c37242be406241498e23460c0295fd52389455d069a82cda660691772181d1675df11479982a46c2d0e52a8c19ad594014a1ff13123c6b5e8942d5bcf083a4013c120da26519478e0ca2354450682afa13d158ba53e0acd420aa41924dd31522e4ba91fe9749498b1245443920e0d0421fc915a485f3d208754890e20cd883d1d8a0e64effbd81430943e27802bf814bf163b82009f55f17ca3388e9c472c952e8c938a5b25f3cd33f6358436e96d189e0a9b1dddb41724988ae8aa9036945f563542962a1d1df644d9af23a825b6563c4209e9ccebaa9090e71260282b50eaf12a3ef050f9c69dbfc89780f3c332fa85c13efbd3fe86feb2a0634b4ab1e6007ee2349f6c2e664ae19fec7bef80697c794c57be83458211cb985e06e9296a06df92ad20d23c6f4199c909c921af40292da228d7f868a739f9aff10d729eed17ea71b6979c7c9259499478cb5310812856ecf82acb4ae82370bd340ea28431f68788b1c36bcec09f660ca8dbf81cc54336f32f23804788b600450dd541d3e43f9c7b3621212fe27d98e2e3e57a762bb618e9e42edb05691c52511a98a0505a770f2733d0a1e0e4dc04e33715a31525fe2c82c147a6c7a377b7f6ce184d33c77dc2461434be97f285a5388196c2829ca3a2c68c6cd0960e520b790f8156c330e87c801e03cc5e4a0d11377dac629ca2a68f74b3dedd8329ec3b280fbb5af65203dfd42d9e5586bbee88ad3223e575b9abbc779832d506dc884ad057150aba42186b7695f97b75b1d057d8d66e5d91d447d57003320a9f2d725880818403913c1a483be0c5134236dd4556c0c3ea72ada6b28da8975bdd9f827ed4796cdb761d5237cdf7875719c1119894e7b3d5658a3a15dfbf11b0d4ef1b9ae9dc30c2b627281a6fa21daeb3ca2f02433720bf77f206f878c8eb3bbd440746dd537d7908896deb85ed0870e0cd801dc4fac0b59d63f8b58795bfd11f0223b19782c02e86613af887f9ac4ba9be754a2a59588bb34e124de6572b55d69d98dcba70a889150e639868fee6d113213c1987f71c0db9c968c4185b824bb969d6267598d0c31cc744faf5faa6d04afad0e538bc200d1a47097b25555e134a4c21bf67cf1ffda1c4582665e1853201cc14293f5b995eff0dda0b67071c82746677c332e63e19c02927b048c6279a93220a0d895537571c3a88625b51f9825f677437d409891ad85e2bbc0140fdce2e4a5ca561658b59bad5f82bd0864e3da621f08d95e2b7b4d017b0be0a9a3c181a1e86332648e7456b0b7508c7c470d51f5c18abc18936d47306a6c66324fe85d736d61c1c8d6ff683893915112f60c658442af76a2ad7a9630609db27f76bebfdfc97505b428e18d560d33f30bd6a82504668ab04025e2332c303ad2de6f3dd291c1a9da694069ca9492f20162e03d47b05ee8e0acc9e0d67befc8da0c4bfd6c429994b06deeeea8204bce3a66dc53e2831420dd6e55d3e9a2e10f765d95688431cee45413b2fa20fa606961b5280b9947cf05901998e9666691dfb213520862ea8d34513f4f7e8b98bfe43f0cd2e8e02131d1f571b375b7dde6c0e9cd89c086b1f211f2a7231ccb02ac7991d839b8f13c56e16aa7419a2dcb6570496c4cee3be78d919d5703a474a68e0af641f2a02b43d569893f94473335e558e4b627ba85b27d8b323fcf114d1c477739390f372d936ffa3e2738f00790d89dc248fa7034b859d8e579b7a03531d8de215265bab86cd1479827d23b8383fe5f3d82ec57ecf6d423a17b6f20fe2a98a2aa71dde7aa46da5af7a2506152647667795335284927d63c75e610ca1b902eb1194d96dff6c7649d156724ef6425ec099f072fb34ee6444326f947a6d78d0e1830c319d2dd64573d8a2a6d76fd089f59f67a54a1c78a652881fd6361909013698105dc0f09030c88f625706f921edd27a0be7a42055ad914badc6d648f7ea4c2094c0a92ce93c8146f5b8ca30f60183f4a2ffd5cdedec86afc8b7d0067b7d4fba3eaf3bafadccfe297a9f53feb9dcb1d8d5d99b55d8f78f45f8caa5475a04407d504b4108e70f75ea39770dbe0c09a9cd8a7ba798987957a6045940bed84cfdfbd7537d8d8732ef19b460e3023457aabaa71553161b9d178c772af01c4982e073099ea25bd5f1a834485de6f906815790008dd09ce4d66a4b8785b816e6292035a70d5bd544d80c8fe3bd38dca75d3106da5ad794215f134c184acf7a33d9cf221c84d886723c7a3291cd303cafea29b5c30145651070a5848ecf0a157df270c75ea7330ff2954342884dd684739b4b8cf70a45e9e605e6c102852206970dcf2aebd9373785ff7799d8bf918ec0091261ba363e0d4ccb985f86f0c7b715c7c30903da180d8bd9bc8bda59449cacb095609c109b55455935812cbfc5de795ec3c873aaad7a6be4bb4d0011a2afa0974c4e4db553f818e8e7034f46fa04b4b3f10144b0bb63867f5483c40c7e0033a50c4d44a1186cca3154106dc8c76056b69c789da12ec623e9736f501f63f9f23c60ea88f45bbe2f8859c13cc6e4802099c5012f403d717ae8825f8dfe7382c69788c0ae9eba8447e95fd24a68280af22e68ce7f87da5d056ea76fc3c9f9f775d764146514e04b06fee82319dc2b8636a5461cb5538fe3a4cf24e00c9d268ba3f1cece73dd8b481554f567ab00cce0060c76bcb6be6f08a4afd502ad9f62893859572a85a316e91b13f4954d145862a86f602b38a51c9906999c1623dbcb098ac4e1f588fde08787c600d843702ea3d2379cf8922eafadc226e923bbb49eecf9d590fe6f1dc2456bc3e60489d4401709ac901a0f6947255eae4aa548e81a67c4aa96c77a794ab522757e114beb2019040efab7dada9731c824db6cf10f1a4b16f61b01df2041468d0a4903992a350da714f28b590f39492422f77cb83c15417069bd1442e73d7f40e01e69dd151c2b9677361956cf0084fdb6b3e249f7b9fc37ae653f80bab2d0c6b3ca3963b86e6672c41e3b9f0849f41cb650c8cbbde7fc532026f458f7c52880bd036a8edd68c59430566002c785478545d01821db071b3a2cacd329e34b3ae7613c7ac3102f5398782f417b4f248a212ea39ae1ec7dc4c84f1e4af1791afb705ba8553c73ae5abf79da144c6b59567e757c4e2fba8089a121434f43328c8161454fb1914f4f3a50d0a52f2a79f41413d4f77be035f01c018b2aaa9c35101c22840133ca43de41924852848cad0cf2029b627fd0c92e2e4679094257f7f064951f2a59f4152644fa73839f0e1f9d19b902bc755c31cd7577f80c3cdf5592d74845cdff5c1c7f57140408191ebeb6890838febc3600da9124840e4a2509ab0c38eebf3c01a521f6441e4fa3eb08674085d08b9bef995a81428883e13ad09b686057819f9b83e15b086dd4303c2e6fab20db690b9be13584305dc80c4cbf5a16e8064e6fa568c682eca44c9ccf5b18035a44e9420e6fa5ac01ad2265aecb8e850137c30737d2a1815cc84b1f560c8f5bdac5e567345b548e2c8c7f5c1a4625230313133263711571c01737d2bb08636b4016480abd20e4efc644c19b49a4a1b1e37d1842b8c5c5f0c5843fa8318c8c0c745c140e2e6fa64c01adea21ecc5cdffcbcb900238b1d9990ee300410c866884e9630fb710084df0ce801db9dad7c54b71dae7c747b8eebb3618eeb8639ae8f824d14f1c4c7354b9de3ef26cdcc55cbfb7a8e73b1b48313a718fa0c993024e18e13c330bcb6ce9c78908398abc3e9ca691b6ca782f8e64c79e3f6d8bf2933fb252f93a447d911998f4c4c86a7c79ec70e8319e951e765761ecb44e911ff903112bb0c19237d641891491e97328e3c7b23c6039ed88d98cd8aa22c6ec464c47ac45386ec7790fcb3613ef1904b94cc4b94ecf6b8c9588b6dd260c756d0fe7e292354a26444bd45e972a33d7699285846488b2fc923a92fc9980ca39fe1c7aac8ca7fc0c8a05512c700914b32f62fd98ecfcb80cd1efb67c30b19468f3d859f154cd60d208698ac1b3b3305d9c4c13df6146229f8d496751b4334208e3cf659a6d0f3d8cb14668f69a078ec34b58983e5b10cac47ece5ebb18c91d78971eb3146b555848ce115495cb9c0f9f51f9c5fb188922231e2ac24077bec3f6e112baac4e96ab194b15384144365c559c9164b19afc74ec6628cb07f36b471b36154493246c69a75c91a09a55b3130f2880f4968e412f287a4914f481f5ac5c2c6adb6ac63b761545bd7b1cba811b1e2ea07e7ea64d8ec15573faef5ebd3753b5146ad92d83951c64f25f1b5a0ec4bee15430060606c492863be44c9acab44cd6e10c162438f7d969c111eee456aef24bba758279e629ee3bae18956496cc3d3cfc988440a4f453de2d3d1877aa1747648216aa74714caab7be1a7a34f47353c159d8c4e472b2b2a2aa81bb14a62c7f873993f7b873768b159ec24bbf15349ec563cc978b447ea30d5234c0c0d091ea97fb012452e65688f6fd09af539f61bb1dab2710341ff28f875d7da23495a7b65476e6907d9c3715d873189e479617c2938d99142ed4b810682a59e52690729eb3199547a544a3b4859cf9124b3e93369307964472e31c03e293b815f503ef9a9b483fc5090a170a4478c2aed2093f488354093294226b947237d7ac4e48c94adaca44094e73989442291cafc2b25f2a7c5bf14d852da4132e9113b296459d2237671a12e24ef278965049e9cf58859585a5a4a3b5c5c4a3b542c2a952ab58252a94e59a552a9a84c25954a6522639306fb8d9fda5af9b056bcf17363565b2b1f9ddb1b39ae4eac29f9e8dc8a44ac77e25849eca02dd793cb8bca514c5c5e5e5c6cf404590dfb8bcae5c68e9166d52c1ea37c50b34a62efd20e1c548c4e2e91b24a62bf21e95349ec5fa5f4642a3df09e8d5bb3721efb676ddc6acb865025b163cfc68d64e3c6637c1b423d624f29916710117abeb421f4d8638662889a55dab83d764cc66cdc9a55ded8b9b13371d0c737623242646ce2f01c9732422f63eb117b0dc9656a1eed49623b9679429371d22ccfb1cbd86ec49a35d6d3e78262f285a91e572e228f7e974f6806d2503528011812823d76d4acb6ac0bbb4b088121c084bcd9a4c1644fb3aa0f64cd4a1df169962909396bd68a63279734ab62e1800e6308d223f696b024973c7696b0247f1e7b2a2c4fb1c7be1296a79fc78e0acb53edb1d370060ade288533d85358aa3e8733d8a3c72ea447eca71aea55513d3ff554d42decc2fe613fc56a6bba6ca81dda632f4f47b32fb997492c4f3e9fec4f2f9f77f1a92d9b493392856a6bbaf02cff3cb6a1dd32511e42c93acae313d1e3f2b3f91519c657de0e7e60188310268286605e5e4c20c1877b55948c7b19ed10c184381dcc1979ccf13c0657303ef3d37bd8189a053af620cd2a397621cd6ac78e1d86daea1cbb0dc6363faec3f84ad451e27d1d92b21e4924cf4961108f8604c675342e81a217723b9c11d86327633d62ff42b2a747ec3021296b03609f251cee55491ca3931b3b4a866be8117bd8579e4772940c3bea0876940f76940d3b2a0a7654122c23f4d84b1493c728da6354ed310aca63d4ecb17ba496116a56398d64a260520dcd2263988c3df6398345196edc508d80268a607bce412af2744dd775eba5279beecd2ac6decc9379b2e7b8cf869ce315c6cff9ed893de7b726d2aeecf5dc6c49e6f273d555de9fe76e3e5f5eda739c0c892fef93e71c77d49b71ee2d69568df29c7b3df8d263f21c165f7a4e9ebbb089c3b3d91cacb5f6044a1491febe38a5b3a73f4f6935210a453c453c453c453c943609410ea678c2de0e5f5c5484afb8dd15b6e85efbc4b557c4e0052730c2881fc000e35e5b74ad114d9a28c1b3f384bd4d8aaeddb1b749d1b53b1877dc16f6f2c03323aee58676ec6d5274ed8ebdf6165dbbf344086ed12d2afa00c8418182483eebdf8a9729315e4825ad13a1356cbfedaae22b61f61baaf8c7812b61464d79d085d4167d11a139e8d1eb74f4d73a571a4295781aaea3c4921f994c7e12cbfeb2755e75f675fadf0dfb3569ac835fe4945f8f327164b7afeed5d55725776a2be5f6e4d6fb35715cb7ee5326c32a55ce352fe668bdac6ff2395bb546d4a37593a7c23ac5755bbda844cdb255565b95a8c917c639ab64322e301194900a7125af9fc21a0dd54cbeb5b7426e535d717e4943f7d94fb94716911461f1945f202927a2e48a2767f16f967cb088b39227b1cc7ec53286bf9ed2516f1844f5599c3d7e9e0a672555c4129bc21968a95f5f254a2d29a70fdee6fe6edf47a90c13787e7a6581fb211dccaa7497e8a79b6a90afe5b035d5607a974a610cfac4c410a96aec2735d52037e8423805794e1aaa934b45d6baa906d9c68098cf278bc27305b572ca2b2b2b2b2b2f26ea3197b6ecf0ddcfcb9907639cda6f96cee73bb80bf4efba15bfcf360bcc29ff6cc90136c0c824afb4a36b01042fc92fd8a51e356fbd23398c0d306e0b392e9300d6bfb06512c03a17a6688d66514f047b24d18a5f0445eb8217f7e25eaf17a52febaf4a5ae7fc3b225b9b00dbe4753b2f18b6ab8f1c81b9a0ce3a6fdda93bd548b3fa458f7aacd448480cd4c87216771f6d28e6cbdeb91677dc249a46627c498dc4ac86c8d57ba7613725f83b3e562472535bcdc324ab0331c4575fc1d79bda9a2edb2cd1570d3d8e5ce4150bb644b2f261451cd091ac7ca8bc1557b3c7cf01714d252b3746eff44e78442ea9511bd1a366e1f4586fa614f5387f67a7597602cd682d5fbd7f4843fdc592233e567cd9b35911be6c265f3b465f3bb51ad1842fa9ced7185424f458e1e4698e72d93b469a55bfd6ac58e26b7bf59a8f14ee501769c7089186b501aa935c02992416f1bc5d68f7441d14e0ca6d80ea5fa8aa64c5f1c40fe890e322b90d917480c80e453a407205b8725c24241d2039124ffc4091761b5cb3844312895057fb0f7858f065c7aa4fae5661262b3efb85d33561b6d4e3fe15bb77268dad3f4c1aebdc5b28623fe05bb759a15b366c50a840cadb0a1bdf364c05452628643a7ca9c2db52f596c29a55d61f62cdb23d84b7475f82b6fe307170dcbfa80b86fbb2e94eef88614bca7d89bfc8ed9a2506c82ced9ba1834cc532a6b1add5d2c9715d873189e479497efa777d3e102c954c26153c1bcce08e49834fa895981da999544b0b6d616169a1a10b752a4e8f06df9c29ebebad7f2adccc69131afa398958289fbec2649dbc54c04f47c0cc4183d6b03edda659b9d2f0529cf5eb2b62893b91c647853e0769604c452789555461e2a89cdfd0849a2a3e69d01c5c0e6fbdc655259c557e036d681633b2430eae72fcb2466564871cbeacf95ae2911d15529f9026e9d13a15aaadae3569bd661cdd55aa9c1de39c3dcf2195f568bdc8abb88e6e18c639ab54eea34a488f4c1aeb2afda46d3d5a5711bbd6a375502ce9df5258a650e23a89de12f1d6bdda5b2f1b765f1e1847c023cc59f4b627497cec8ed591324463527b6acca8088a6d96a48df40e911427342aa33d47462f34cb09e56fd450a74e7ed27a9c6e65b6e7c84808ca925985552353886a4e8eb4ac5f4751847e96501e0abb05994f6ec05b1ee9a473c65af026d6d28e9a49a3624ac276cf009892c8539cb6da6aa25ea9f8516ed6eeae69c502676f27a28ff339c385f4dbbf0f3c42e6fca3b4b95aebdb9eff7d6ec38f532979d96f89e49811cb0e3c3e81b73c7b44892591e79ce420fbdcb4ab0935a43e4a9c93e6249635fc384373ac406b54afe3682acd383856afbe82e7953456d2e879d94fa76d5369c30fa96fc59b4953ddc505b9bf590b32f3dd5ff1962907abe20972895f47c90cf48754315e7fa7b76d169d9dcf108b5d587abf7870ab1ef9abe7b7e1f534d4da3c5f3bbd7ed38215572b17402ff90f93ab7869d302dde42aa2fd40cf4b9bcfbd4fe4d1ffd9a8505d071018aac7509d866eb5d056f8489e579f59796ef21c1718ae3c15bc70061fa09744223795aca0a8a30d507dba6c1ad7710423cf1eb1d88574cef9ba467c73a6c43723dd52a92a8faaf64cef295d647334bd9f740b885043118ad246ba756777d63cdd73677d64964468c950ab8622a3a369d43a4fba45633128b128312949ba457f7e96fc30f971d22d8a7972cf0bd1233a41ba458d8034059a65f2e93058a059ddb9db6836dddd5dd3ad8ea9f8a4596b418c412026f4bcf5eb435094e0f903fc84a2c4ec29ad9e77a5213b3ee7411f74cee43ce873b8568bd562b518ae615925ab635c6558660303525bb5b62ac639d7298471ce2a95fb38d6d4dc9985c56acbce7e542a98914a95f32c8671cef4e7abdb9bd1147b53a9a85111eea3ac93ef2c6716bfb3091486ce57bf3fcd7af9ea77e84ee9d6079b404b38bab6af1c2c0c147c7985be926661e4e0cb2be5021571ab9e596ed85fc3313289565bbbb6b4d0164a733d8765ce67ca12cebf341cc2e2f3d2f0ce7abc3f97497869e15d92e96ca5e22967f12fd39c3bb3a0e22c9e0a57fe7598ea951593777519505eaa78fb29ec9145194e9e9d452c49ae626d2a65f2157103f54da876ea5488f5558f2cc3874da87d1d718fb44331f2f512cbbe7a13d556f7c23b19a68a99c22e4a8fdd5027a523eab19bd215f558bdc23a1aacabc13a5b17e33a59e733eb66b3215c6dd5566d2fa31dd857b7d516f7c3c5acadb6ae0d5683d16033954f96cd5e78e7ceee921eeb15ba3ff7a6b2c97756557906d3d1cd84db17e0271013927415ca0f7215aa2529442e71add6ac89c38ab7956ed980468f4dc59b6655b126791b60e49a644a2eedeb657566daf3d924fbd4496209de34ab82de38e710e326a7e332f525fe89edac46f926cde671725c13b78ae3dcd0c9285fe1a07cf5c274a1a8ebe4ab1fd47572ea3a895e499d3c5d39ae59c94a9a562c983c3b909cef7c0614993441719266e9d9d41589d4df82d4db0d40a0c5cb309d86df249cfa329352ff5110f47c058a3cfac18f3e0ddb9bbefa8d4ebfb2a040b774405a50113c586d85664d5a10cf57073f8f84473a46ae5e8edf5e67f52e9c81bed569f0271796b39ef0ea46b3aa2aa6fbea372d54f731e39170f501edeb12be3a581d77b5d442c7d5175cc721c96b6b62c7fe953eeccd34cbf33098c71a1b155648a9bc6927f8794ec3cf235df1ba8e8ac3d989764edb8317d6afe64b9ef7c93dcfbf9570ba502ba85048c9e4345411cb1ac7f939bd9c260b98441efda69b16a47c3b4e0c426a4ba7ce90f0e2db6bd029c19cfcecf0ed54a75b2a98939f9b89359d2011e55df061909aefdc03a56ad4018ae367441267ed595bb4aeaa3e7e0542c2af7c754ca3879c9f8859736d91747c98165a81b191a1bf11ddf68c78e3acf2b1a6b4c1242732109c1392e41f19c501c535d5f7fbba15c6362a40b1361c3819330ea47c6946bbe131d78dd66958227afe17aad0a4f569bd73417ebd4eb3462ac8d3bea80b3c779a6375167bfbd613063e24e51921dfede21426ac1790caed66e298f9761c204318af2ee73e48beba5ec4bbe28a135da04ef2eb45945cd1c774cf8b5027792226d5da5271a20aaadabae9ca753364a8f3cb2aae58f03bcb2aea106dbeb469b761714000220b22ccda0dcecd0e35f99142022f7c7c7c7ca68f0e9fda721f1f1f95112414445f870e40001619018061a8864692e7100cb54e22dbb661a8b01eeb0b12b55a6d55a80ebd05a6089943300c4918b230bcf80c5118ab9c46b527cd2a2992afce51241387aa46f5759e6cc83269a87337b44d613447c310c4d0556d914bea43e39c74734f9a83f22f517cc29b8a14df9c292fed2d7e90a527dbb8f52e74912273de79a99a380ef0325b38aaa8898264a26433696caa47eb1d6763897eb28d8d0a3a62a0a15baad90a3f2a28424373caed54cc4c4e5d9a5dc2fa37a792ee30f594ae3ca5e18a76b8a21de6a72e4f43d5d36ea7dd21f8b443d4d3d55d5d4f3d77bd43cebf394b261f93c63a044a4f6d08a1a692574c968e2b34710cd516c9ad116b0137ca5b9bbd59c064f598a3f51a8c73d33cf4b016c75a4c9120db581c550b32fd7eec79e270e1345b2f50d2ba15c2b8c55b2fc3b7e5c4e2ad972f3893c67a6a2783b60ba3d6afcdd269bb6fdd07cb0b06c6c590b53a7d9ba66ccc5bb059cdbd3c1fbe395372b4bffed5792fcd2618aceb3ccee3381df5967376e9ed09fa754a8f7c94a7c9eb2588734a05525149be5ec190f2f488c187a5bea4b05212fc377feab3f88f8248f895d7182bce2714316a3fa18811c4d370c589359ef579089722fee3e8e4aa6948fd4ef51d4e2858d0febb209de5607b2ad2d03fa4fb0cd8ef5041fcd78134048ffc87411aa266ff91c00e57d567d00d4c7c751aaeaaa71ebbf756fcf7818d6d0821cf60ff3a37ab2d21951c6272b18943c6fdfcf5c9f9fc7521772787eb17f6ed340fb487599adccc9741dc2c529010d097d9d425d310951a521e1a0b67d00d434f4b3c4acf89342c7dc94d5e4e1b8e0bd3366d346a260e0ac4a4b97e9d00b34583a0e4f52b962f5f52988a134bca821335c197357f27cdcd266e8b7c5f9386f34b9b3858fe3a7787d031383b9be9f13a5e612952feb2fc9d7f63605dc8de8604922fe9cf5f6c43c2c9c51d37335ef7d1acea05d1539ff1cad1b20e98f07081c41286e49fe26bdaf3db003ba01fd83f47325e06ed67cad3db10d467497b9eb600ac0e4fa91342b839f14488103001c35553ea0304db67a06ffdf57abd3ece4107c92f7263d0a9d7eafdedd86b28438b41c0f6761d8d415b6b2d498e2bc618d77008c5a1aecf735c363dd29e21e3a92075eb331b3cb12a007102830f0a34cbea3c750b38a057984f7574ea2d48b3265012433cf51884346b466d5117ede9964e29899fa74e8f744b9c404a44f976dd348b7a0bcdaa4b3c95a1faf5cbaa4e63dfa517b8b661e981d8e32097e8afabd0ac0b9676556f5a6892ba9743ae644fe6fc1b7bac99a1452e27510c419a861aaacde1a9539d6a2bb6314c927a3714112cf92a12a5382386d431c6f87601d01c2d92768ca611b954d1d94a0e3f467ad0020e87a01da2fccbcfa01d68efbdc89749b6e3eca23e4baa49d38eb5c837a20ed57ba52317d98a48563eae97aab0080ed73927d23927ae7e709d98ab9212cea59ec5a8d151001a5511a186b6acab8a8b1193352a14eccb177df17d6962c154ccccf5ea362f4f4806478e605a34eb027dc3cbf0724d9f0368828510c419be9d8110516cf142520031042d7a8082891b0abad0a286d7bf0ac6b4483e2707e2207349d0414a106e781e56a4f4894afab8571480002ce58ac8d4bfcad964f0a4b69329644e9e3831da4abda6592f4f1d48b366ab93dd68d6049a41ed694903cad3da74d96440842f6794a7743ae1eee908f953c28d365da34d11b9c4b77b83e17c8a2b4cae1327edcb2904847312a6b1255e503cc755f19c971446635e1c75dcf57bab97d83b20d5b163f75c47c330e3b173349724f21193c44411939c4f124bec9d08a447187ae4b8198fbd87cccb80dd1329008329ac81ebc0f580fd4025d245a80d8fbde43a5aec3c7148f7a0498461e49ce425194cc8a0c33c2852198d854028d0ad2a7bbd5e26702dc00ba159637ea9b2e5da24e72fc00bda24e7771d0ccc7f3824b917f6203d762ae3bcec9cc66456e4ce4b1aa33d352f4310ef49e205bcc78eaf771c1e430504a64688d6bceca00617354bd52a2f7e389e6e8d4dd2da92af365ccfe310dd9abbdcad40a86aaa554511b23a5e5533813cd5ad79d922975388064ad1c1c4ad5159798fbe3a8b455f9e9852b35dabd56e6e6ab5da4dad56db2197b376a50c154da93539a2288b9818b75b172cc002c808202374e8a868d28322dc70c3e9757a1dc0c868094b00c3525706c32d60bbb2ebbacedadc4fcc3a6b25c2da246eed07e66a2fd78956d523a52cf8bef6f6e92dc595e39ab3c790490692c109be56b7c9730920683f97f8e1e8698901245f59a74f3c75f2b4b4a3f30e411f5e6f6fc8407066b9ac51a9541d5a1f5edf3543b954557f81a1ad5945ece509a6d7cfda52d55ada419a53be1d5bb00be7d784049834d56f58804963634ea0eaa521f2fc2b2ae9d493f6ac78ca37030d33654dffb51dae5d37c36e76734e8cc312fc6ec7a22a15e333b4d4439e3e9dba176313a04849c20652f800038b430c72a0404d6a40fe046a228237fd043a820bd5f7d8b2ed5e53a3033a8324bcd6d16befb56170b710dc20f060678f59f05027b63906cadfdb59b5839c02c016b9fb0954c5144f3dabaa70e28a659099df8105aae206201b9427fd04aaa209b68111545c6105e906415c1f7dc69dae200b1522f870395b67a3010f40e05e7a1080f872a4616f000a4208529001088e884d513224025705ea02a88b285f7a0da753aaa61454e880c41426d4c0a8411da38e4183044a38f1010b643cc0e2c7faf0a04000549df841084c3a1dc85a7e024d1982bb1c77eb0f371cf15c1542f0e1e154504510534854e0b00487ae15688a0eaf02f28208bff213c80b2c92a0b42d5833819f9b42d06ff881179728a59404da12088257d4d12d5ae4cfc3d40877ed936fcee4a2954f2ec7b18e79448527e0a0d2d040a19e40a2babbbb672d1edeb0cc8b57187005c6802a17969a5a39dd2a59dde4160659c5fb46d3371a62df5010612788a4881267e36c00b30088a503402c75fc0dbdde72647fbd45bccd66c06460392f98c788255e5d87e9f9ebd6d6e2d5ed0de52daeb2b5b88bade53a4b4d89285f1151626983ecaf9f4491aa84653ff9eaa65a2b7df2554a92afde49e131ffc27e064550824cc51e436bf4bc32502f9f624c12572c707e3baff49639b687d06b6d581f8728cc014c00ccb1c624690e9f35da67f457ce75344c69fd8a32586baf004c43e8186fc595f5f932880c986f83913c0e779f4a064da5d34aea85c5695b0e7b200a668ed22ca9e0e79d3838eff3d9f9741f1307a8927d7a0d13c7c9a7136996e9d53371a07caea4a89366bdf8745aa34bcc1c544a8b9714e8a7f74e13219aa260e6a04992a8e0a7539d3632bd03930998683a04668e205378d0f3890a5ddaf8e90498395aa035daf3a8a241034f29ead7d14f6f51a24af2e04a41302f3529aa7617b12696ddceb1cc4a5fd2198ffe2c04bd85740a2c0985b55b54c924e4e6f49455708298c4b2754a62498f6c60876b5aa8a9a15f17350d9a830a61d6686f9d6fa747d40b1adf3ee96a67e2e88a64e594523a6b6fbdae443a85c8069468c25efa545433801238918317bc665d30b13d10c14501031fa67841122a0854c043153b35a5220e87ef9b1307776d6dda744ebb0226beae7371aeebb2aedad4d5857492d6397b4b2c74a6496da839b5e9132a9e4e87e3388e8be2870a5c410318f454b1041147d810401104952f605064717bb0f7de7b4f507576b83af7de7bb92852d00141c7af0f6ae0831a144c64e143050f336f0a286c70c4b30d01fc0964ab81b75104547471a342880a5b0e8678be7beffd6a5b4a5b9dcfac823b5b6db5b52f9e756836a5a717f7b1a6bbce79f25c85be6f929eb2d01b3d5a6b6d58ce7ccf39676db1d7cbdadd57e7a39452db3de79cd336aa279760ce39a74a09f2b43df6dee6a8bd1c27c4b59c109cad9cadf43abda2b55c1542881bd8afb769f5eeeabc931382d3ad12381d866ea9f87432aaf0d36f746b245d9fe3e70405d5cc0c05668e15688df6ce7125dbaa847992dfe7ed7d4e3decf4fbb290c7f9f1258d2b8cf73bf186c333572ca7948ed263e6c6d66ecfe768ba3307a635daf334d11a82210bb9522ec4e9b17d34d92ccc1aed527a4c9a766cc51bce06a69a68e6e6a6e3aed75f106ca6419c1a56438172d00221ea76b262dee2009a42a8875453d46ccf9e3441831ba62081c765779c00620559887e9ff460c69330fe7a7ff18408160b2a18b893c226844d0a2e620ec0418a26f09083ecc90e423071c00d4e9e9c20040ec8c1565b9503a125a42448f572f77223a8e24b07c20b86aa788112bef42c04039d0b04031ffe5e4fdd6e07627414a425568bf912943f3a7e9ff0ed3540bafb73d0a937e83989b64a342461fce41254fd752527d93c4a9584b992ebe892e35248a3c97630b4292d911bc63a76cf6789e4556f52f5c63546c6acd17ec31993a6554a72c7826fce9493360b93b4255a7627b9cb934c4bdfe2cda4b149f2091387751b23cd611d855963ceb9f2e568bd896365b6404c73d059a35526ebfa8b6a85d25bab69368592ef7d5ada81a3e39170b038df47577f0ed5be54cc4c873048876a6d67f11c57292cb9c97d94dce4ed26918892167d989c4524b2e27cd58e32399115875b5cb9d0e22cfe23e528b108ca532831cf9692e7b84efd53aa522d2bceb9cf58ef990dfb278a6c7dc94ab8c26111755472c557382bbe7a81a32e165ffda02ce28a135713587116ff71729458e424ae3877f117ffc152644554d289ab1e9d5befdc8aab1e5e3b8bb872c1c55f7cc5893f5cfc65ba5ac415e72d9ee34a892cdee23e58bc4524a20474222becabeb291671657dc5390b28fa58f1166f1189acb038830f94677f61ba6c2ab972a1c553fea3c5536211253e4e9ef222592482126d3f52454e224e6a455c5971061f2b7ef217a66bac64f51527ae5c40398bff40398b5844890f16cf5ee42412f11f99458421c7554e1a8b9735319d6dc5a7ebe4a5c3f874ad884a563dda2be710ca53617696f0e42ba18a77a1e7604872f117a6cbc57fc87095cfd28a734ec4797120324425ed2b57798ecb45860c5149e72e9ee352a93ce54566255bbc884a1492721797e1368e64bc5e9564f1186ff19497f4d5e22c3e8194c7882b1c1616a7ae9515a7ae15d7d12ee174adc215e7319ee37a09579cb8c271f1f99cbbac7c252af1dca5dd2524a2c4878bbf884494bc305d3a4594f878f1ec458abc881496ddc5576ee36825ba9c1cc6519ebda4b2950b283ff904b2c3882b9cd3c9a94b45c5a94bc575f44b485daa90bab890d2598f3326f7e7f532853deb972cc96ce6124e5727a139a15df189add564d83f6f61e9c0d4ca870a2be9851ecef45873251b77079ac27e55b2ce4092cba6955db62c4ab36a596b6d7bb558f6ce8ada7a8452dbf6354a53a118e49e75b8c362ceadb5f8ed0b946cbfb4251638efee29c7eb5414df372b584b3bc01e3bfa2f41f94ff8ce754c1cf33b8fa1b6ae777e4515dfe1ae73951899fbf6eb33e8c1142568c114517ce1eaee093eb954914bc8e5f89d8f3536079864e7d3a96833693a2f6dbef3643ca93a92ea5c886407bb6a77c39b4a76dee10b94dcad4a5568b2f3d2127974181b60709dc77cf6ab5ec5b85938639fd8b35806191f3bc6a18c2832f6123300f41eabc78e3bef3af0054abeb8b6b00b8f3d621217198ba3924c4b383a57a77a7b879f4c6f1e15cfae9b5d8767d789e5bc3ee39641c69f3e2750d3a6d54e6c84e2e0fb66b3e8ac251e73cec979370be00c4bb0ebfc76b66758760e5f1d73b7ab1dda1ec7c0a15f5fdb863bb89ca171236692b3298dd5d9a661a94a59d0c504931b9ae3f549facb81ae76aa6aca5e6bafbdd662d1aa52f7de7b5d7ec814d7db746b6bed6ae98d169544f07a5ab2afbf55b2af488d90c8f376c7709c3114345a56f990cb5c7383a650935951fbe2afe7eb2a28607fdd2bedb83ebbf0610820c883278cf044ecade35c93c4a0eb668ade3a77efbd3c46deadd1c45b7c735eb002268ec0c30d7e7c8eb8ae05c1df7befe59ce079ebed2bf87ca2a88a319a98810c88b8b9aedde1ef084af0770a65110394cb9a9a266e339f929c494ec6200167b3612162b701b64e49cc724d80a0c793d71311740f286cf68aaeebba289c44f1240335c1450fb41e52d4b24a0aa0286c2012155575cd5d8ebb46452c09000f5011b401300154449405445153920220289400834506fddba264748817b51d575b335ac4cd15e7a4a10ef030c93b9f5f2685a92f979ce485315764ba23d2578fd6c91c642239ae92830de294bc9676b424914bcafdeb278d75af2d1725addb960ede7ad51103d19c9487d29e19ce2b7243df9cb9c10d6889175093da7ff756182cb2ed7a3ec60990e2bf9ce747accfda4d0b3835344ba75b2d331fd7e7bc24dc0139d1e1ef0ad4a3301a688acb3d388fe95175798c7ec66f935cfadfd5389fc678a36b6a8210e3cb29a4c2acd934c9a5cdcfb0086e4779b9310125e7af3426a67c494b32a09d2f2993af2cbad363c523fd613a8ddbbd3e73431a75a44180af1e13452ee98e0d9eabac29913ca140a8f48cb665450c95a2191100000000b314003030140c0744e28048309826122f3f14800c809a407a569889b328887114648c310418438001c410630c18a1a121020011376e50cb2d0205aa05cd95208518eceb9c72d5df8bc020229ef8b953ae2cce03d6a96c611219dd06d28dc33f379e831c0f7e97675675c5b12a04df7679bac3f8e5895cc3ea09209144eeaeaab097f7bdda176018d9140f85590827f1b763705399319c83a2b14d07deedbdab1d07c94e3f1e59eb0082eea11bf9a2b642258d4ed3a9d4de654f04bd6e5375549917f484b9994ec3c53f115b7ac6e0615481ca17c78869eea63a5cce06d0488f9a042dbf798a371bd595923c0259f545fa297cb2029d7447d661e18f9f9e4b59fc4b8996306d16c81541af23a05869bbb7686066cfb650d0d8deb5b73d32c3929d95ffcc8e3459242750aa764ff1ab6c80cda889599a9830098ac81cd190175d2bb023b8e801cb22d6e8203185d0a89efd122db92500ad385fd7a546da4bdbb420f264430382751531ad81193e108313bb28461dda55bca2b06b618634a40c5d874c47a1c953ad40564a270ee5b150a467d5a83c8a0adc1a09f013997e2942bbd1a6cfcd776c854f10f77a04f40ab6df74f252d139fff5c7d80fecc98dd5504aae583985791ae1282991944275da85995ac2910fad3b0e51c47b2d7ae305cf5371373c99dac66b085de73b1b74a99463d3e19a819b3c0c6ba51b41958c36e24e129545953cda131e1a66e3db4e0d0b30e38b55ef5243dc85604361ea05afe15f0945f1987011188db43ae0e4d991b4986423b132383a91a0044aa4308b94cd7a3cc6905fad953cb7b306cb5a8fd0eb5aa58f26ef7c1fc93108002fce665615c5c7ee1b0489cb1225e0be4b4025971c3c1668688ffae1017433d3acfa107400cb375ad5ed88b4fb5ea7dd6096fcadf4b7e9353d487ad84fc8a36e483223d30fb8aedafefffe76a7cde9b651464522fed9311460c5a9e05ad448a100560515301c261b60effe7f3ba312f69cadbe72f26ffea35c6b6ba57eb17ec2aed524cd40dcb6da8ddbb86d16ad852b4a81f0d40c9d31b425686a7cffc9d20f5e2f10649a61ef5fbdf2613ddf2a9298ca0c675cd9cec9d241fa515119746de564600b86e20b92e30ed7a4f047e29af2264a62617f0e31d050c2073b3ca7037a22b577948d3d46c19a02f600796ed2fa893ff66f1a224ed04165f17209ae181334cdebb79a39a97e58e2dd251f5c22b609c193986ca9c2e498804b0316cecbd88006a3004dd6d40de8545abdc41051a2f8ffc437ac9c3b7f644d4833fdd262289fb6a87320945e9d8f34fe9e999a9d9ee19d7d551eb4848fdda7c7e932b4ecc4108823457c5446bf02a3fff441eaa95a30971ddd35532bc20756b163e831574db1a74a9e19ab3cc686ac95b3a713194e74171962db6f000c97fc44a815bf5853f1dcece2b8c9f27b93a6e3bbf29611937c3e0802faba2bf958aedaa463c40c2f17be581231c57e2d93c352ae2e6226813f2e83173280882710d6243d60dabe6225b858f8081e2ed2be10e46ba8509ab3a440a1801b447a6914547096f548923d48e4b26b22773f32b72cfe8ee6b91e58df44c293aa638736daaa228d6eefa40ca73a52859ac83ae301837f876b47e847baf8e5c74652ce758d259b42074a2c55fd3352a0b26ffd81b634d12dc2e954e860cfaa0885d67d71d173f58e2ea6ee2d29c283d932cae1a4afe6204cff2bdd80570dbb9c45a082ac7663039e8b32d7a47aba2f79a24180186fbed9503973130ad41f7e80937ca4a09c866090ec5c20b2a11235abc180ab25282cdf248957f2ef7f98992fe307a73e1da40f3009adfea6a4c2c5de912be5877eb80830511e88c389787a2b328292f9843077d385b9b514cc0db8ed807abdb0974998cb22c36cdff7a0ffad36a2a8e1fce847216a4f77c234ac48c985ccfaf9a65deb18fabfb48e79275cf742001d6452329f004b646d6ff905904226e86ff10f99d08c804333ad194c74748496244ccdd91ff65f03dd06af1a6356fa34d388d9866cd1440f00f4fdaa906cf998dd4f1d0883118d6b903775d9719d236fc3fa816262c94f595b21575c38e82f49b3550726c889563c119527c70592f0f45a95629faed5096386ef493a701abf3c5c5554c595dfeb8c50d80a2151f907186a8002b9bd8d20a7cd11a6d920c0643bbc0817ed8508cb9b9db01201622a8b310a0a4bd3c87e4521b940e6fe41f7f26bf845784a23e1f3019d2b1d3bf2e8963a2885e81198ca3389e05e0b6c8edf21c4c1f92239cf8ecb184c38161500fc7560715d996fd0e86e92c7f1b970bcf9ca0fd739b16b4ac2f50366351b797ccb09b8103c0f6bfd5d3e120a8499123ba4557ca450f9a9b46cdb70f6c439195446e505bb139a1c05a30e796d47b8501596d4ead98a634bcf6e40943858692093d9ab0fcaf8cb1876eb53bc671fab327a164f862760664b0eea6b7c56a489a16b41a636990b944883853d53cc001b133f32b6de1b996e4a5c9195a1651bbaeaa085e8290e4e1b852ee6dca1ee5e4cdf5551089224148bd7a8c18a9185fe3498827ae8269795dc46e672c0406987543737586538acd2f71899efc1a6be6c65e8498ec9201fd84e008168f199b074b506b321da82ad8d348e3228dab0b46d89cf59645dd0af8050f90926fbf83cc8341f299d11e12879878747724b1bf741dc28c1bb1a8a8336df001e411560b4f6228b2c85d21922c033f1c1c26481e4bd114a29231571a842381cd34661f2823d91df536e8e62783d41f8dee8ae9a41a0aab2f0df3436dec889c30046fb3eb73d4d42b7493dbcb04bea059ad7beca87d9eb527ee0f05affd0dd73156610309e81206f31598e8516987a01ba46a99af88655de0bd2f5b93eea1e49bf97da9ba32e6afc43e21f3b1b5009581be29c2e4bbf2f034368ad3d0158f5dab1cf150819df5213c1ee0ee94c78436f04276324e968a6c790413bd87636cb13aeacbf8d728cb39d5098c8dcc5b92ad863044f06ffb123096712fcc39fd4c90e43a1359429d0be5e4f311f555f79a53309444911676c5983b4374cfa7a2418bb0f92ef228c2a486e51c5e1b4bfde5c16df7f6bc984f42cd9d75fe5823c37b06a81b242654201299bcbec2c9c98b7a081aa1f89ca80fe2476c8f2ae7112c150070d96de4e2a2489c6541fa5a6aff26950a6ad991995873ca858af980ebde03f092b3b8b02cf6ef9f09803f65f966d19f6d59aef718ae4a2b87bb3fb201115cae57092a5fa9690ed0b39d5f6e0979c5bf7daba4f6260947541b7313ab9e3c0167fa3b3736e5b57610fdb2995c60be720dc232c38b7863cf549f1ea9c60f1a47a52c64f9a106db8edc59f5a6d30cbb50079a0bd1801377c486e444d09e033c109136511aa82a9b1ceb45d2d626eae050b79b3c94701e4cd0e83d95391fe2624d0cc138e1cd62e3d7a869d00eb50dc71567a8ec089c116b6b18bd1bb81d7ac6d5a4e53e1a89db3bca8ccbd63249c5818770689ca353e7493429d4758747d60942cefb861684d16479a3ad0d88d4bdc7966acc157e826ceef7aae8b3a02170b0903c6734aca2f729f0f950c20817e8ffec2b4e250c30eb1106c4e2c03888aae588d3b99167276efe391c088e37995720098a1b86b4cdd2c4722bc88b02d25eafd3e575341afa910188dc1d3ba7923586f3865436da640f5403483b6d434de0149788fd0e05aa5563807ea4da51f5446133b042fc041ac8d0c81052e746f66935da635c2188ac5bb7b044f933ecd64e97f3684e1b034b5982575bf96bcb13eccb662157a5c28c3406d1f62c85ab8cf9e4368ebe69cc00af0563c78083f9d84a198ff4d9b42fc7817cb5474ef42862997dbf3a8d95d742ef1c0cb7961ef86430ab6d7efaa35648a3628d6fa5e27a09cfe85fee78be78a963ae44662c1e01ff87c058dea4e50a045be561dd0b9dd04bdaf87ea94a7d1a2c26e191e2c17bf494a9e435f00f13fe867cf116a183fe38411def54f3e0a1e01f09f8ea4ffc3882534eda340293574abe0f452c22fc32783245202a8bc238c62be8e0624bc46d0517a714373062c8f7a99a2cbdfdeeabc77428875ce60d6e3421654e343fd63b8c3b19ec83ba7ac5dd72aca3225d92d6351ab9872c111c5a3a8d5844a7a5677da7a4dc01fdb34aa9f8b901fc05d92ec7bc0c22a1f174a9f3b460dd0e3251d8bee73b0116601bfd7fce5f9cde379783c3bb57cebbe0b1c978ae2b397ff7e25e7a5d1aff022c0d15b491afe1d31fa0a6a08f831de198d0e60ce512301f4a7b7002dcf8bfb0f55243c3e05b84b6c35a01ad999fc082743a3ff981a4e7488f5f3e316522640a0639f980ffc3b10c50708de0e02f23683761cf5a8288d47e5d12ae2ea1273d4839c9fbc9f50b3d80853d7188146c3564bb5800bce4ed2e505380ef9e2dc6aaa98fa56d1e40f8d6b3d664840214de1f40da5a06d7b14ca1d5fb575d8f3811ffccc3f9cb8184efaff02a2d3abd313f37f25186b75f4270a180e5034ec35a4b51f24a50a617e4be664dac934f87ed06324aae92efd66ab2911100d891236b89f106d20831ef5ce28132fe9512d09d3c996e97c14ef03f05e694a3631ef34e03b3b33602b6dde7e9be51d825f377def136450b91b8e1955317ae186e453b9a3c1ce9454ef4dba9f29ed68a4aeab3369e059f8c567d137652dfc2ed2dde8236c8acabb2f7b40c869b8ab39abe0c6036a528f316b1919309118cc2310ebc2187a9dcd187af80b84cc6c4dc462290a06e834f20c1035d464f94965f62327c1f9c9f4b5f762ecb06093eea4b318399701c61eadcda922dc5263a43634d9b7db024e4d0e86a4c72db9fa690e358903272eee92762cc33be4d5d94030ec94610c2b92d2017e0bd377751024221d6bbeb7c6c1855f754d2e62a98e2e7baec1c81b35bf4067065884e02cb102a3ca47e06108cb6123a5ac650691970b0c09c721849bfcc46d30a780be14d5834fa93c790bf137250773306d3ed3c6f25d58f084fdce49d519e1bc577826841d8fbd9f0f67705ca056c968ffb34a71b1065e55b8f80c034a4a4cdda668b9b2af85c2f4401779e5004d456f4eb3771f04d50490a7e2833a6ca25028ac85afb8195d3d4ae134e57b4e82a3aac3e1c9a9ff52fb252ac066a3a4692ff2f35858173b27cbab84b27d847482814059000dca8b15454c9d6b4a3691a8b5308ff2b5028c9fa042403ada03c039470cccbd9eaeabf39ae68dfa22986429a9ea36ceb16fe2b912c5dd531b88fec68eaa90e561aef56edec0b6c31dd81edd3a13cfb7832fe7bb5f5028605358f6e3a8f6d6b3777dc7baf5273aadb9a6607e3c66a738fdee913802425780ed7e888552a6e789054481cc7ec0c622b0e7cf4899e443a867704780d2da1f98616119439e49e2bb49d7d1bfa12369cb8b1ae2b02c6b3e9ca42eb43eea43b099413caf2f642f742d6e9f67834be1fedc0adcab9e2030a110b286302664f908179343e8722a6bb8c166fd00bf7424c4c901cde94def2c8e70618a849e2255400554cd74502ca1f077e3aa4964c169d81d541b4aa9a6daa8a6706646ee29ada6c1608335dc4f38f6a652e24f65f3ab2070f7e366beb2fbb08b82d424608bc03f1d39029b30d1c42383dd151c02aa97c66064104bc883a26111b8cae42e9f2f10c3785a4ea918f9840fd3688ce4911a06b475a8f4ac3603888d4a018850cd7075377c4c5ee3bcd760625b005fbebe6643713816a2e71f5408d80ebb057344d597cd6a834faf8bb0b920eb8835aff048088bc1204ff68e2a0b798e6d71a207f32e3d3d2ba2df5121bf662fab507f303d6f62dc5e9451801422c076ba214383bf9be864d970dd31a515d1e473f1512f51771521d1eeb8d91df8cb2565248eeaef9079904ae493d28ae67c6ee34bf67c7b9953955985866ec2e4ad884f8d5e318d104f40dea9b306ef07302fc8c013304d7fbef180196d70b25a06117e47d8741f5830cbd1735116ff637c01849ec737da5243466ff43ca391b59500a05e13852c37341bd1bf46ceb5be1fd407c1a48b6d48e80daeec5fd2b0f9bef104beb0517658fc6ddb51118c85fb1839fb4616d7013441630ae7aafdf67de33a77d267eb70f0b0d7cef41cf106c6dd5b76c19f723cd59b9d75518fb35a88daa16b24ad86bd1b436b537f13d32bf9de1e68477f8b5bb27daab68c00600d48c8eb03223e8988465df3b660b3815bf9337414213a620ee083e1965d392ac1da273ae632a702603539b4b988891a8f6856bd31e18ebdb29ccac0e0d3f30258508449a8e6469d3236ee1c5b16439feb8d3de0dd51c74bb703ffed6b319b6e63b32e538203272e119fc52cb2b1b267c02519fa15f42349af37d80a426f636744dbe7a892e6e80823732f7aa738fe848eb508e73700f3a202475b5e4922de2c8a123fa2a8ab5caa9b818d1516899bb8de8fe80402ddef7e5c40b41505036504b9746352c776a3419199ae30803be8bd019ed9092b3f7bba1bb7e851b48f1e511ddabc5c34175bb6c99719413d668cbc176380becb18dca1fad1bb089c9a90e8905f51b8aa3a5cab773250434f2d632f11afae0d581c2fb13a82b08426d23a8a3e27681b08a53e0d206ac59c4475917f1ad3133cdaf0109ed9362c4bff43332a6c7b9bfbdbe68738cd7ff2f4c6953c5a49c482ebcce5d02f66de34c2205970e105a8120c77ecac6d93275117e46f8a2753c04a2c2dc8e2980338da422692df0ae8cac81f8f8b9c43c7fbe46a4f90f68afede0deff50a3eccd94df78c071a28a946248e9e8775e05749ec677ecbb2c0d01cd250206f1f81e06f8a2f9f02c4b6ebaa8f3e6175643755a33f714ac90b5a2a5d76574f6a4f8a0a2e51ce8bfc4fe5b6df9b9d0454590bdef390763b7508141bc2e300758eb7835ee735788534ec9ff718dde22a0d02038ef287c54bf64683e1c1f8a3c2cbb8cffaa79ee710b9c68022d5a612a31f2efac26714b35842baba2c1a2fb6672cd253557f677efa8b095e302d6c5f5ec12a3d198b9827b9d0b94748a742a99339f0146b1ea4702720717115f86322281cdb2411652228f4e254de20dbe1b0f4580a7ef9204cd9f920d8cbf88630b8c84503547c19b1d9880eb8f652feb65051cef6f57b4061b028707c3e5efb08cee4f68d97170700f1ef3e0b4077212aaa169e6c6c8d6827bed76cc59f221551e01bdf3b0bd279bc3564807bca3376eb8d77cd0779b08cc38feb97773d6c361bf5d150012a5b5fa06cd99ceb5146bcb278ad0e430548b05acc99c45f59e97ffe6da6b34c5c1b672a23c8548306f4a73b84caea241afe1a93d3e98a496663f45f630e505f39153b76321082b501f4bed59ff77f33d3a7a862690f8c09021d5610a85bbea45036d8bf134fcec5a74d6971001115aa88a9a83533efd977de2f10723971079419bc21f0a0824eba39f51fd0824bb3f2c1a6f51a8781f043e82b5e56a1a9a6dba4800bddd435de4544fa4b3432df58fff8a1786094fd7ef11186beb3c0dfb95e5efc79003553e325783f179de7955aa78ccd1aece079739c08581de330ee04241a3daf79d2bed72b3e63c7d74d011a3fd1c2c6bddd0726fd2e793d8058c47359d78fa28ae030cf624bbaf5a5e61edcf0ca6a79a648c5a1122e0b45fe8538509baaf56a7245bb1bbad890b25492f02b54c351b241fff954b6c1d3cf41467d17d26b7c9c19bc62ee2c41a15a7c1f39f111e0ba491473c1c40671f859380ac630e16a980834c2b2986bc871853a718dc30415d40a812f487203547590359695e4b3ce264f3178b99d4deb6d545d5e1b417d8d2be5223c9bf8630f696f8e86267d1d43d73b51b0439460ef641a0c03ef89da60ce0805cfe9792775ab610c0a0840e26d230d6f79366d0ff9fa2a8484696be1c7e391b42b668994da45dfb2af26b982518550e71200baa69b8d8d859706336e51bf7c5d5c048d8a70d9c1e32bfa99aa3b7aae937ae8c5ced6ae8b34bbb171a68e0b1e0cb87c958d37bca606aa9c566ca9b2e83dda200a37b1f33cff6b8f54f7194d2e480443b43253c3a42a253f5dfadf3cd1a4d22b65f922c926b444ee00ca5f65abb81e96e5719efad0bdc3c773100af98eef0e64df10228adad7a1f410a8aeacd22d1005463d286f9efa8be4e34e6ab5c0eb8e90c80186e9fdf966d7ef541ec0453084246fa58cc9c90d9e2e87b6b23d73a3c994fc9264ecd7e4fbc290df842229345cf6bc43c0a9362315d07173ebefe30097423490b9c7e73088dc36d5308e8a404afd673d3a30c2006625fe2da1380302878ae374c607382c98ec9c5cffda8c2896612a62900d131dc5ad0a99d8dbc66950d9fc94b518f2269442fa57aa8a3fd734c708be30e37420131c34c31b4531024c23260e3c22f414f68d276878bf6978612e72d20343b7d57eac711c4f31ba79d64fc0f154e3ed9db2f9dae2e93bbedf8280643c2d724eb28344ac8d8c6b3d848a870185a62236633cd90083a98618c653ac1b1753359eeab0855869184fc2a9e5dcaa2086daf3583e1cfb018c5cb297a24aa08d5ff91707918147bc7f2ef3408473b9275ba77413988031e88d5b61be3239a1718d9a2327d6de972bca40d476d96e00098b0d1bed3893d278025c7ca1931a865b537867d6f12a7c423229139b6607caa11203825d69dd6493b8104627e1dfb957380def0a63c6fcdaece98d0cac02312b54d9d9c7af2ae5556f4d4c542e342db81f2395fe652c3b41838210029b68d338e74ac4e3a407f0f4325cf966fe6776747777d811221af4f1d8c238e5aac7bbf235d730a66a3facbbb88d571036442224b5896e61eab8a2e4d6090141238b94cb7c61d0a4bbbf2d89d11c3f7e56169a42defb68968ab6e1d39adef14eb94155acbaae563980444e21dd83f2915f9497dfb16b2ae6a428ec30457192db9947186d3f72613863ecb93c6c4bb8628c31813ef778807fc117b8603af45058b70b4552a8ecf673b1d3e34e27499ebdc09a6845f6bb93f98d0a562961e9a4ffee3f0b42ac4c868918bfadad164dc5bb129759fb289028114bbfd2a91ec0ed3e0d2bce5fca40b769ee016e6e40a7e22bec13e361a9593537e0a86219e3811cc641ba01b634ca213174b58b4c13a41b786ed02390bce5065ee9803ec964d20dc0f7cb27f3695ec652772b8d76940efd79fc260310df4dbbf0c1e87db89c7f963ab0010c9f2dd0b5b4bde31046bef49bbf39373ef34dd3f1e44deb97c1d82e2ea3910699a2f966b8048e2a56d5ab7d335ac8fe286c21c550fcc896ea5dd22f3cc66e0768e8acd8da8eab28ff12b016df797bf104b1c2dcad89b0fc54949aee701a80fda6c1bc5c38ad29d0a68183f6d236f61be495a625a147547cfc1aca67019d612f4e79196cf937e21616c0fd29df92d4adbe0e5f0645b19f9dbd3cf0ac9fbd50a3757943bd3fdd087252017a663340f2a110e83ed8087c3fa33566a06d826e0f264cfba3926a055e28593429437a08a80406560d1688fee2907369d1cccd86088ba2afaab886984e617d6685ac49f30e852fdd2ee3fef7159ff09ea37cb5f0600c9d648339ef51e2351b33e3c3c524aab38fdde06efe1ed475982c68f53554e104dc539d0a2b497ca9eb9e4fad0282bb33faff304c380befd87cfcf0431937b4d633bfc0f5a00d2d8b796c4855f45b6363cd53042aada4936a3448d8234117d0617f67dd2ce4248038378a2f168b32ba260bd7126b7126ab816832dbb61b80e911594476244ac2cdfef1a24de334e170f134d2ca8725a3daa334424414658916875378034e0863d8e3487256bc5783aa86071b8bc0ab024751116a9ca1ce0c66c8735a0b10ba9212dc3e566d537e8a556bbb21799daaa901da70c04fd6eb5f5cc9ac064fd3f4e81ee66ec4e7c867e2096592ed52e31167dccb1d97e6900aa5318379f367f869146a4c1a90b58520f9436161f1b42a50ff0c1d7aae2152f733c7dc74c81beba23e3544ed33b5da21b25d07227f7b53611159e2258ab950232c498a028989f2c223e3f89c6b66449b12fca4efaae0e988f54c043167513ba6959aa7f9a46849801fd58ae95ac1c27c34cb4af6cecaa9992ff8d59e94cf013e475aa7682d8a5da7b2e66c288763e46f5b689d92903e5919e803365aecf955bc3677f0bdadbddff43b1d75147d24af912bbc5cdfe8a1a70a20c53188a6a4c761c009fe81bd16f51fbcc2d4f946c9b946e9b2b9d56fb86bd943ba95f4af6d43a49ba5ec34d6793eee9f7a097f903b73e0a24ea63ee2b350055e37d9e4a71af1ceaf1d5bc86616792ad02fa66a88ac06c41847c39f619dae21e72afaf6fd386fec27ef7e10065c8d87342584171a2388694e56f1f59bc925401b65e34abee5efa00886c8995424484547b926d0dc962280b84e79a19c1052f77faa5cb0e9770ae23339363dc0e262835d50d6e954340882900387246dd93dc87aa3c99f18aba0c9609b63674cd1d1c48862ccd6dc635c03543794e30563fd0e393b813bf137cbe1af41bc2ba9f53602ab06b13cd1fb38da6ae88dde8df20fea1d96948de5690e18c0c42e4f056db18eaf1f5e23a092226553d48fccf4fdc2b554fc57e9f42056b2c34981d2a60dc8591d6bcdc20b2bd1353e14a946bbe687cbc204a9174ca881fca554fded00182af204e173e56c94990f864b3a6d03677054662ce5af44c0e0bd2a1c4c2c8f36fb0dbf08a2ff41335f70e6bd1a3ee3f2b26dbb69a0d476a6c8428498f340183f5f83828648242d01c4a77ecc6f7f7a20ce54f650f0a2cdfe0542b1fc99f7721a3cf67695b2bd1da0b9bc8476976bce9a98f883152175c8b092e6d3d7cf3918c252a55f415ae0609883d0fc31b28450e3fab18a4787ec4e0fed366b20726a9e9d63a13af04428cd43b011f9638ff55f28e5359e10e980e35545e1780cc5f5c2e6eb8caf2a3fd06b788602fc641ecc1c5e9c5894dd9b8272433d37d324d11b0e9013967d51276c3053343dc3c444a8b7e67bfa43f46ad04ed65b603896dc86e9978b26c22a61bdcb244ae7a976391c2d9afab12ef4935b2d4b370e271f76d4f6c2374c41576d48d68321cf31e5c29fa0cc89a23132dba83a01b393d3a440d4436542f13fcd2496298fc55792530c5a42e39be2d8fed849376248df5f4bde8b3247d0d21dddf0f1c3940ce9dee54de9c8fb0cb43124b607e0ce72ce21afba19a1772a79f5d8b8da842224378537a56351fb635f5f44d26d169bc7ff8c94857e5d7d635bb75927bbc64485d2134610268cfb8876854c7a6e642c15937364fdff274bdb6bda72733db42885f69a8a3048bd69b986d2348a355274bd009e663429a9c4206d087870c7b41967fd1ac4a8ebb69f44d4bda8a82b8440695af0270dd0b9116883c25311e8011d36312ff46f10de54fd7ce86b6ea9356a6ae133b49e38d47e1e2e844eb19398787c68fb794144b48f6ee148bd6234d1757586a257ffa0c0059fa28014fd880af9c377ff51dc5cd41c5787810a3e481446a28f3d118d3a81d60affeb44cd9b88ae16e2426032b81269bff3864403d06a30639e73348666dc7ebd8159ae09e2180e2d3cf00a2459ab6b85460870e7490faf854da7f140903126d88a10668761583505ff47459f8c70197849e24bd0e37c6b025b4b0eed221a161dafac54d2a952b627e0bd0ee14be0e989a58c6989615ab4635f805399a24478085afe43cc61ee053e231cbb9a11da8cce8e3b635a7ff406d57e117a93e513ed3e388131e765444864f202b071f5a08300ed710c5d4025a7b4ab88f780e59616637ee972d887e9e73ab1042754ba009b8749025832e2d37e735d3d653e38d4b14139bf66fdfb0065cbd18c7b15571bb49a133c40e7e41b50701ecb63a7f3f7c531a44cc29c4fc0254c2b745289a442a2e81f2ec357bbdc9822bdf1dd62fb45377e3545fab04e0b93621c6c3fc2131b45244eb3a42ef805ad02d375457033d6f4cc631ce3cd1b22d77fc4d2ce557b6961b05061d1170a9a6227c0a64325788343d5600d76c7307520c7909530bf82b3b67e5a2abe090db257a822fe617db44719aac636f695a5fc2c51347e830493addc10447d0fb9d56d308e234f4a07df0cd0402d7b614dc6248b8a07267209d4fd07f4a315fb3adc45913c91f211dd7502809af46b6e1c18c667f11eb4d5a71d39caae24f93498957e45dfed87080ed013badde01bf5ed5fcf59211828beb5bcde9e49cb4717a9033138c34c20759aa3d5c3b68704b8b99920a794d1f6b2f3e57761b286a3dc2d3c72cd53e4700e6fbacc75fafe91a57c0f74abee7c3574a55489a40c893447d5950e905aea48aea24d601e9ee206db478131035cc4e95a0fb5650ddff074e38d60f672c5bc43c82012e02d7e4d7b67b134187fd73d792f49033d8f0141b93ca52ef28a693ae81555b9bf26940a884ef683226367ad229a7c2c41d48116032d22df375c13843c15277da8a5ef645e29cc95a873f55228b3476ab48f1d4591e4ea53b7b3d12ec3ecd5864064d8aa3ae6ac70cd9bab714b812b823090113dc229094f50adf499cd6b427ba9ecd3d9857c953cf0a9f826fca387d2fb729a999d21865ac8f8db29ea28756178e5bfc2047ed489e3882b92d9f53261189044d09703683ad10d932c3ea2e8b246f471796703a31f6fc43b785800711f3e31f020b533b82d64a1cae67681de69bf63e07a0bdc1ce69358c979927c8030858e13dae8e0c662d7ddf9132f9fa0fc7486d943f57d33bff3dce678bb762cda054c4627fa3d7301c39de26116437ac48018668cb762fc3a6c3c1a593d5c8125ce23500438216d5b06088ac5756227ca3cce1e552099e5ec7e7ae816e13a658e70f6e600f22e3cdab47489b9f763f94623319e1a73aa6c92a1c55f2162ed837a59989ea00d1e7fd4f930f45e66f3e2f72b5f786a68978207a185620edd189f0980bf242fbeb040a29747f52fb9df2a164c1904c3abb1128333f362c156b83a33c2fb6080adc295a0033ecbfda4aa44b79e0b0b7ac26f63c7244b426ecfac103aa211abbd3bf24c5e570362d1b204cb8b0ee34656d12665cec58a7162c67d0169d5d512570ee4c5706fa38169eecf3213dc502077d273d9ff8738b81126bb928b5e29e4e4fee9465c99bc62751cc7fddaa4716a1ccc58ea51d20ac1e45726b168d38f581c7439fb343d179a991e7672786d6c8c3824736b8be7a20ee0fe276ec0a22cd264fa6bde59c4e29d550f5a0e78154e9b77d98f7a6d44d37c6b643ff31a5b48977fd1bf822737c67c69f375564fa9defc3d083fbb0095800d0b2e448aaa30ba67713fe7f22f43406bef670b18b52aa0ff7b4c475100866b02c334351305744d2f0edfa1b6053b78ee5f10745cc1c67cb090c06e2e0099abebf45164ef9807fe293d6531e502e5795d800a899ce842b36559fb0abba9065c32e0cf4828a45b072f01c69dca176593894797f9cf6091a8ad7af0adbae9f437923749b648434aa9109082467b838ceeda11014e48bd4d9aee3449cb8ba12b5d8b434f8504e31c03164190d6f8c091cdfe67b6f7517ca230b660fc01d175cf552b62ef8007684ba71e01916b0339b99c7bf0ec3f1c53352067c89b0599e9903c944c77688fb6d5b040745f866ff9c62895a8471aa09c279ff5bc5493592d9360762435abe9fb681deca3d528ae8ec216d4ef998100bfa8b13cfa7d1ab52492219f49aa7cc5fe9dbc423cb1d18c842ff36696884febfd644c350c205ec2a99a79d5b4f45f0b1944d8f454c19bb01f9c188d769dcb6deb9d9e7181bf5d8b0403d6991e48a279aec329594b66955b0187f785d61914f7b7a55af65e37bf5f9a2e8480a67ff01b3c2f7dbfcdb92ce4378d65d365e99d145e1084a5d0ab3de902d2c762272fa7fc5c61df1e8d9b268501415f3c37d86b9603310356c5159fd69f74b9512789913d80069f7e027c4b8ff25f75e3b654873796e15711040a76545821a5e35be61b74cfea1700130240762805253fd29c3da4760d9a460a1986f633720e61706b6230bff4450ba4ddf95bb0498ef3aa54e64318b34ad99f455994e4acc6914a5c0027b390a50534563170b90ca043c4b30e0a28492634971368846bd029f18f5e4ac608ae445e6e896b44ebd08ba8799c79dc2d25b2d88aa561888d288c4fbb24341d49c647a07a1e7c0c1abc0f8c82b137dc9bf83df6f7895a88abaa2a7c7f9488aa7ac50791c67717a5405da09fae376c686ee3290044cbbbfa45e3e564f98b6cad50d91a431c31c4ffbc157d3ba294def0504a8f1b0d38bb6573f16edbd86fa0a5b322c8500605eb6c779131d1dcdc815686e7c7427db1d9c22e6c408afda2b9c0db03cbaca1548f9025acb17fad2a50e88b4c47d68f9cf6faeb39046bf04e2efb45373783157d52696e04b12ca8093ee25845e66cfd344098524b20f134cb6ea409aeb68e9aaa4ff575b263f470fa0288145bd0b249074152f836b4431737243b85595a2a4d6c99cb3d6f5f5f2ece58746bff7c609923fd620005e53ab32cd6cef1fb5500234e8ada7a9f5255be0331be21c78e62ceecbff17ab1e845d9e8e673e7523e567ad792eb063738a43af3a2306275abb6d2013304d8355a100d8405b8f8a948095160d774a8a46c01595e4f72bc398308d6a99df72e8b2cb25a744e43f82607172c16959b3c3ab7183208e6e3d6ba263182077112ba39c997d0c7adf742773180f77d01e4cf123d4b43d8172ad411a92d6a595fe008e10f0a2cd7c7eb6269d15fa9b12a089b692f40e88190ac3c0779e9c367ce92327c490194855b23941cd40370760bcbb92b307f6f61408a149cddcf979b2d0fa8194c10bcb123350bd1e9e283c2195480b0b2167f6b5590b91f84236c0e1a355a2151b5a32f0f85bfd588dd98e010a13153e2a434c81ec1b8e72dcc388e573f07f3aaddf902d9f40e3f611a711112a14946ee133354b830a87e4a52a2fb35d3a54114f5b22e67fcbb70259ac0a770ffb424950fb1cfb2535106ed97af03a14be582c5dd35c5f95711aa1ad57b63ac54a24586854559438a8059d1cd25e53b10cd75b4a3ee6e0f9ffca31f5b05c6d75ab3c208c1a1f4f05fc7b5366e63a970facafd68fac47d35bd3a82babbba1f8935165120abe7758e6469d3466832f957d189efccaf7161b51d4bb06929b06a5b894dd761179d05a67654a8a25d7d18c10339906255ea0f17af25f40ee51b9bd2f2420e02fea30a1a513047e5f1a046d1926f96bafa83ca3f2c7f84e826f59fa25fd4d93d369c60dc2e6262dd4ac542c54695d93b5ffee28f58a8045350754c3e8e09a44269bc3e51c7d2e8f9bffe85b480ce2dff74a77ce5c4ec1460e42173fca9f1d85cbcda4e5f75a9785523e8f86fff4d27a6046e2ef3119e971a394037075259bcb9e12d6d3b265d6a24f601b2ab7d729d174e5b1ec9e2396bbdab2c2bb33b486a8becd80400bf488f922850eb00fe03984b852a9b2e1e36c52e2e91e1b6a91713d804c4877b4a271d9f07739bdbd6d111b2a1dca1a80a4a718a1d82b442f1f7785bd971001e099de48b7f3eb4a7d86993f6a64abce4808af0aad2b86924bd4e1a367079cb5324054da250b74aa753cf5c8fab1315402ccdbd2cd7ba75d6326b3c60efc196d05194af21d7ff736c9d5ea37a8031c2f1a95cf3b45affaf5928c085f69d540a05657cfaedb5096196ca27c161bda1a475d07e4a3c427187a157689cfa201e2cfe5ecff7c8dd79ed074e6d3ed48895f0590cebfb97b665165fc65846321da87ae75383b041839416326e9df536e311b1f6425eed5f3e0748313e98bf159d76428cd6d9dcddab7462b17b57f51aadffa295dae4e61db5277f9de937ce36fda4ea4103ec67491f6bf9876648834c3858593e3171d87d0a33747983739f12c2da3d6dabaf5079500fbe832ebb00de3c2871050f0b7af028a90288088484edeb25d6088817e30437611ebe596f36435590265221c4a7178bff8f2410d92116a4dcb111ecc15459003a004a4e7e1184282c9189ed8219ab4195082c8853eba129692d79ada2cf9f4e74be17b2bf34c463c127ec1ce2a0b4022db7faf6fcb774622e5d6c27acfdd740ea6414d141425be90aa16426dd51f301c17627e41c054be01316f84188d0fc8d42b4c7100fdaef041987e32931e9685999090b515eb15478a6eb7ce69667e04912e3817445f00c478b645a3c1de28254401626b8c0b3d27f478fed9953be2074851f608867d4a8c8edfeb2f78678127e8bff2c44f02cf7b8410fb69f166a44500da8129b87fe9bf1000b50c05d2261204dab07744cdd4c85e89b25050b7d42364519392f58f39ef1d67e06ebc8a71197dcd8b7b42e3cb57a41e3655c3642e3257fe1093077a0f1a287712d1ba2f19272e15178da23e212699c2a758e8719636038a98ed9a6ea74370d14b83503669ab2cbd655c7657700acaf1169e5b978e08a08272b1e030ff1701b192101854858097bd5159dea3fd7eedff20a113c1a31e251324e5d32132b4796cbd346b160137db62d120b99ed3bc7309e5201bf1baa372ac3008f670fcf2e8aad10e54d3c38ef6c0a9f9dc9ac4773ea3e91d82bd73de1d2c3be501c867b84004656d32cd2eb69ac4407a10b82bf362e364724c6dd2fd347292548cbc79c2cc4cbe3e2fb38d20768986f73af9171b151b714721564d1afb5fb5a70485b14374fe5fe176ab7f4346f3b9336d9bf9769b59cfdbbfb87cb9cd33f29bd678278e5bb3105ce9a7f95cf6ff6024efc07427f4bc76604ea9ca1e888fb003b6b7d6f723fa2164348af914984fe262cab9c950ad887c52d65a2720acf07527a96dbe0a71df012504ec025ad69af2827461b1570c46785c01d34f6de7c863ae6723c58289ee4e5fafb3959a022f3eaf0a36ef81ef044f3e04c20b6189c4fae24cdab8f76d3a6b0c9e0188e12552a9a1f59fe1c1504279b3c8f7690a34771948974f47399701dfc6aafa27fcd7057b8d7ca7f0fa421e6abbef761268e8e9d4e66737992663eaa477d07152c28cf3281e098a588db46454217117754511276015fa404427706b2104ed555e12552968882ed9de52d01146f7d8ad2de4df0c14c390b15e625343cd1009f905940eaa2be05b6b22ee63c9b0a63e476dc4057c0a7520f141bec3df76160677348662f5b69e86fef488d8e93c31ac582c5a8fe688dd0fc2964576a6ab4d9c1837248e72857be2ba02b84f1e5ca6f239e8f99ee843dbe91cd5cec297a9224bb4911f2924b9e650a5379a3bc506f435d66527de804a367653a6186023d37f3cc4303c68a58ef6f01e517588fe8ccfb1e789f5082d353c91ba490aa5fb8e6613f167908b148222985c6fe20103d827de3044aca2399de97819445e1a6de8fc126f0dfc8e1a25e079df8164e6d3a9b8471686d08d26caa1df2f55b22ca57d770d6c8d07f6ba2a00714bc89b3221ddaa23285d26dd27263f51b6b0c082772391cb9b4689850eb762909d948446822932bf295ede57e567a2afb04c76377b338332ea01dc7ce058c791a6e402409c8e9ad2e3d3ab86ae71f059cdb18f47a94aa5702a411fc6c1ecfcae0eb0143a273dff3f2b1fb0adaa16c43bf9ed01c08fca84aec733cb81e3c5f8d308b0101108d3c25d4b474644206c75df6deaeb61d94d9a1e075427ba26f7762bdeedb49c5c51e34d39f49a8562f9607033260b6c05d418f04a65d774dd1957be511a48623b95003ce2b0c84e0692e47391a0c6773034edb711a8c022d0a4a84f42c6269425cb946442f6b7192597d2f6bd4f8352a88ae7a4f23894aff6b8411f8c908c36cd09ba25aa75beea4543bf41c617cb93c5406d211492046f6262560d0a1308f28c793f94de256eb00d81bf955a56514fb684368cbff8b3b690358162fdabaeffd12a5c64a6b8487e7c2df951a32910ad32a91baff45dc5244385894ae13be5f1409673d62b8c7fb832c4ddf3728707323b6572b234c959bc80046fd7a998c5dfe7f3b5aa8d9bd5340a2323ca75517476dce404dbfa2a2378c7a7f16bc9fe2eb9e36c0e3671268108e48b02295464f53c085be1dcc7bb8aacb67712497005920a6c40d344b0b57d864c4d632481188c1ea5c89b018f22b9c5a17fda165ffe106dad8a3e82fbcee7eb59fe1180c7f853d74aff8fc5e23fc7e282c1bc655cb84e65ebdce2a391da47e85ed0e1274c229804a3d62ef2e2207c4c54bab6fa0cdcfe85d97536f0ccaff06c3fa7fc2cab95bf816b61311b77fbb0bf201a9e0e0d1d86c3efaa69580d19ac1f47c2f1d27dd82e3742afb7012f491c47679ceadad1f38c643b619378b258d462489c06c810b6e375703da76d9768283249be072768eb2760428750c7c5d00ba1a961eb0691ae9c74e22d03f8589e7190acf54f0cf00c9b90a105f9364180b6291cea0e3fc7db65ac3d57762ba79999083a0c1261019a699f78bc26d4d1c4891dae7c8f46ed97baba4bac9d90ec3c8a705d37040256e7c60f9261441a22a23e74c0243dd06e118171f264262dc18f3a8fe0da7971cc5964c121d87419246d0b5ee7b4223fad42a8216654ff316ab931c17f7c9a66498104730c95eec0084697f64d401a79825674e7d69fc9268dbbdc483b629b67b4634d0ddd29d5cd1fa30130416d9b37a27e88c90b85bf8fbd83e713d954f6f944c1b2d37f1dddd57573a94cb80d0054a3afa92e8a23331974e8ecd52703d2a3ada981ee9ddff889ecfa9a281e318ca07408359356e515a8208dd4089a3258607377e843ad7081ed94cee0c50d9323c31c5242550d004e62b1755fd498474db55cfd8dcf500f70c5bf76e382c2b700412a1912bb895fa41a564bb38086a9eb06fb0a33d43ae482236ffefb719c25a7a0257d53d95fda109352016e14ff193af24a62ea0bb533165b283d90a1f0ffd232c04af1b8d199a63d91448656ea7b41dc0a307fb781d423ea4077a06741cbc9e0c6383060353663a09b0a9d41768ed38abc250ab8581f3c2c628735e09e1998519c25d299c41e69a343e5fe58176d314ab0b00351072598301b1d54ed5d9a4e10c0d940a1be11daf6b728e8135e10c90c3cee3182ef8431a29787398da7540c16253cc8c3ac92916f02c93dd85456e956ce7855da9fcd9b5ba987670e6c8117ad16529f7d9ff6bb223da4bb1959d5ba58c362c26d4066c9e85a3cca6a294bd6352f08f7f9db52bc1ac6b0ce204b8ab6a5903640fa08cd5f66d2aabd09552c44d94d028d4529b661fec3c7fe6db1106f39a6c3101eab0a84b1d58672d15ed61c2d86e0f59b9deb2785abfcd96060f7fc57162ae2dad63b4174b3eb09f96233499725f929027988336c352ecea647a277d425a82936900a83264b294266ec4560179c4c2f730adc5107042770be327a982458ba4a6a180a23c9723e2243defd10b706cac8138aecab183e4c8cf4f26a66481518c939d8c304e2f55fb70c8e9ca2d1a7982bfa17c3ac4831806d25415adb3099436cc8ba8bbaff10145d3ce5c28cb0ef1a953c47857e727868510230362359dc37cd4606deeac1b8fa4213ee7023ed95b6db6985983cd6c588d0c1003a9a2701c13ebf10add8d193e501822509748544b2f7a97259e1bc8d7e586c496ac255f926f6c5e71cd83e40119fcf3af0c2ec1a6ebd1b5af981cc0d169614b144b1524ca0423f6a05e18fcf3ce7f6b56959850781245ac0f795540e17bd508a886cb029546499a16226b36bd7b08b7a59f15414f70da9930c8134f885372864ee813c6878821ca5340b1f0c707e3304ef488890418130e085dc3a275391ed5eda368925d7093489e6c629f97a10ffe7dc3bf896f0db0d63944fd9a87d3cac214a722390e44f42b64e9c6343122a148280d595f337061c475a1604c94eb4ad6740169e2dadea9a1776864d2c4f5dea701efd498f7340a69e93adfd380776864d2e2daf47d41d148f31306ec315f5a2783cba45f0f9031707d408b53207386e6c2d4dd49d9283ec050fbdf422c195c868c2c830c2c1f6b572432b92c325816190e31be631964665964d096ed2debc42882325fc4edbe1b801b385b4a6bd46177248a0eed8d8e13c5c808fd8c88559b40255ff4b08a26cd8730f5be05a6c8887148432953f3b3161681e3a80f683b82df62489d73df81ac0058cb33c6158cc8e30f0b29c4af5ea466df11534bceb16355b2b845eb3067e28b5f6b862764ce2fd05a8777fb91d55de6d4347449eb9a412ddc35f5bd5047df547338b21d41614ba1dc88bdafdeb7755e40a15fecb6745274ed4fea40506a554c32af19e13c492a42a2ab7eb014da3cd32efed2176bcad64d5e247cc71234a20a1def6b261b67e13d048208a7b9d68129551b4d0eb10291379aee8c955ab60478bd5e5ffa41aca8d95fa58c5102a97136e401cee68405b9fd3d623e2cc1dec004d81f5a7b0cc34e82c0de1ffa4d401e6190dc0cdeb0f8f05172c474dba08831b5a06f7a8a9fd74e026a6bf0150c11d1389c044a704fa58cead6cf4089cea6941f0a6f259a5a921a31f72c1b32728c059f93a0edb14b2284e8080a544dd0a5960752be1a4da6d7c49b958630899e0a7ac6cf2e8c324a8823492d2e1556378582bb9607d628b73cbbb3b91396dc4812b81052042dc49f3ee982c212f613842c27f794754d81700757b573bcb310f19496f58b22be56ea8ca082376fd542156bba122bad317b783f853a2d85199e25a8e039b074ec964834042e660948e5b5006d00bcedd277b426f7b33b4349247340309f74f2c989d6e690fa4736963337d24500c402c0f1d88c3c35e211d6e026823be79a4e49c41cd8c1d702281c7420431e5e9b00dafff0065883171740f13e7f411b3fcfc239ec081f404421dfdc410fd4e49c636b006d6f50ab1ea85f841e5c62490a7c823b8f3e54dbdcf48a53e2fff2f11a58753fd8d501a09fb5526fd3ad61ce377fddca4294bef2c8d9b04019db0dabd5cc455877b1922cc5b67b076c070cbb5e359129bea6c440ec9eed34f5fdce47914f1623ee81c15d83af90b8152d3a8b63966419b6610ba409eac48014b4c099caed49082c2f2cbb254671433068e11f67bebcc0e8f92ff3e2201537631ec6519383c98402c9da3ff796d99825ca6266e43dcf4c70f48dad5d91569c9054544d2c959660f0406834333bf46696ade13a360ab75dfa7a87aed191e44c78274320a26a5cb7c7e1ce8a3cd603181eeebaf116051c95e6c98a14320f054ab953804ec763c230033bf76808b9189a2f39497d49bde4e5309fef9bc0de9e36602f862727a7348179fe54b74aef7af2a33ae3daf2cdd05c9c324ad21bb4b851993ce0f475903a0a678299b169bced2ca447963679ebf53398740e838f21c1fa7f7b37a1d56824d2ff0429df53136b73c1dce0caa508ee502eee3f5988f90c09562b1239f9a64ff1be30ba7c5ef329f6b0bd1f3ce8c7020195087db91b75ad854eddda02dbf092cb920e345bf884710950d1c8d6fca0fe055d0a3c15c601830e6be4c7ddb4b00088e411a61473e080c539abd338f96087cbd5639e648a644235413b4588ad8afc242867fcc74d9935fd3c7c30cf5d37cfee8877cb9c7ee4c4bdc3dfd84f58653a20d80f639446566488302f5420ee49df9efe67e8bd534431066c11c93d78ef4e3d92cbc21035698caf8873b7f666d0f70f0771a7fef3bd8b574f0cf9da8eac62d47b87dbdc25cf229b6cc32df95c007d3388fe8e89a30ca8b8b866c8d77eca2ec42f9342a83021682410dc5c1285d46bebdce11989b77cb91b596568cd8e4746f0a57ae75630d4a4b605316e1130f5033d831779ce8668be08983adeaf876b5da77da582359d822513a5b4c93dca5a5731da991107785cc8b70898b0c6f5fc4e044ca9509c54a7411cae0a4701a45ab244113065edf62c9e3de2b0d27ec1cbab061384b82763bce96772366b2c6767a3b658963ff5433ed35d7f7618f02c135ebb6df519fc962f71b929944e2610a14e7a9e1e09e82786d903045d47a8395cb0573f2124c3306bb1660a46e3f4088cb1f9fc1df29a4887f35e214d14241478751f986b1792d0ba768f30aa55b604957bd4d43dde2382cdf4a2062f610df36989dad503eea3e9e09bb98a6e90598a9ada4dad1b76eed439aa684a81e88c15fc6e7368c8372afd979b5b0ea444746c8b5d89572324ec408051ccbc3d3bf768f5445a0332d1395e6cdf7c37f01f68cba7bfaa99ab8a43025acd96eaced72a860d991f6a1dc3507dfbc6dc301158d94bcd5a5c8329de95bac8cc23cdbae105ef2f87e46888e6521728f21c74b5fe22f49326a5294791dc4b2ee35c7d7895b6eb78a000bea0b9831bf882a6a623d5cb7d748a1c0104f1f2982ae60ae20770e1372708b7242c38825832c9d95482103bafd6dd4ef46854b1d3dee1a214bfbda6c97f0831d25a0284b395c653465f1a284cfb0a5bb8f527ece0a1b297adafc1b2aa2774804c8c28b32e4c64ce8d10a5c4d6be79dc794b38651db6f696497d0bee3c24756ee8b93bbb46ac87ce653ca8469e599be78c3cd3e0816e39446f394c45fdb93a75d53c57f850239b6c78120725c2105ed1fc71058a6e37726bc348d4462929c78f9652d944aec94c47dbf814e8a75bb94fea0b2c74e3814472f6a51e70ccde545ac13c4b9e8f3a5b23445021a57a85711c88d672448b08c6df974487455101e965d337b1e7fb2be134e872193fe8ec8eeb36b953206f304b2c4f0f4ec7e11b6e2f28aaa2f5f7be93249a0831fe33f9c5ff63a0dea3cad05150d298b1f8a78c4f20db374099c029e5bf79f277b0b76c4747cb33bb204c3cd32f1fcebe960ff6cf5b153f40b05c34df12db6319097c2490a28c39a77dc1cada1611ee8f56054d245d1f2cef12e4cf05a704157681db0391503d1320101a309ef01c56a8a418d7676b0ce0818ef8b056241de3154d7f4c3f07de10bca0799ff5b3cb60ce14ca0208d4c3c4760320389ef0bb001cfb2efe2fabfbaf6529f4773090b1163f17d3e09028cb51d380446bf2a687a1e6b3021591a860a4d3f42e5ac95e6ec7ea65ada02353604bbd1ad631a124b6774a1a17dfe520e8638fb9176192b61d4f1d718ab2d590d634fd0aad3fef746dbb52e26ce3ee7bb2ecd8f40f87619efb78a847c8aedb3893393e72ffb2a7f9a45ee6a9baa3451ba7f62a4d1d6d3df1b7d7763eeb25ed06598182120cf6cad0e7b6eccbdd3f856ffef6122e655800bc865ece903a53ccab05a5372c2b0cf368ee6b357ee42c403a7c83f69264082bb0cddf1901b6d2300c30e7b16febdfa2420ae51bacc49a09e5b8fc68b64effec6b377fd893962af65ff96cdb00cabedfc7ca916581ab4ac04b9b169f655da6f39105e57144b441a2fee7ead6aad0be8273ae8b27b18f23f49e95993580939b835a57e82b470c9f888d71e4b94526605149a7f433f72c1833111241686e0a78163f5bf184478a7955322cb05c998b7d6573683506e9e3d739255feb15699a6216942b2ccba4760844949eeac52b61d1cff9717aa25f1fe593e97dd49e07002f18c9c6bc4fca9370dbc9bcb8aa9c292dbf92171044f1aff02ee2623b94306a495949d78c9add29d980dec93c8a4fab41e0a3db9b6ecbfb5ad131d15436b83bdbfafb896bae9ec34cd96a1d6afb80274c4bf34aa7ccd1a7ff62fd40ac9ffe4222bf43c45048b2b305289cca32af19e4a9d12d5a47cc6e2311dd10a09ca30b96eaac5df96ead1bbc724f09912faf9bbbf81dcafc3c8816dc80c218878536a6fc0589784a749b445791c7e5f31301b55e9d70bd058310f80365f6ee0712351ec90fdc6b3b5f96600abe7d144609f069da0052715cdabbaace7043f36daaa00fdc42b8dc1dd0f589ae2bd98f7688355c49d758c8599271cb6ab75e7a2d60ba8f6bb513e4fcc8bc7e29852d3fdb159199ed463bfd6d7baa92f35cfb36ae7c51fa4dc6f4030a9d3c292f14dd6b24d4e0806e66438ded9fbdb00054bbe38076305d6e237cdccc5c4be57b9deb028ceec602669aa380dec3b5acde67fc8864c7223108311b04dfb512a5b8e1a7885acc84792320295afd2360da621e091f33bbfef3959afcb44280a69c5f4026534b44b407057f0a0da127dfc8448f4f0b9fc955046952571ecf95a8563e9d95e1279e084f2cc70ff236087c2cd0a891e1da4f396526b85a6376a7f568f579d6ed27cbf25e265aa023bdff2169b98cd89efb75c720e97c32ab23e24854f651524d263407f686cc963e965e0f6aea48f14eb66782b5ec90d83fbd10e1621bf45194a3ee6eaed6e98974b8c621175e26597d08f0bc05b412c1f60c959bc172ae6886745b954c77974c84770cfe5231c97d0dd4fb3191acef99a18bef9b88ac5236767981fac2a5889d897b6b2290e45a9ee5ae209ad08692d90113f2bdafd7a0ab58aca5c156980f03670340b82d620eb0fc381f38110d7518fdab990a995f176a09da477409307df3eb35adabb0297ff9faf975bb7584807c6ef5569b7bcf84944642840593a7fc75f16bf3696367d67445970c415b80afc58a497397d7fb88ec13bccb374ce2fe057fda5c4f182b2750fcf780a76f3f632ab59825a63c9477ea902411245b1a3058749690548510da2321951081e4436e417175e57d5c375729db22293508c7480ffacd4f77fb6d1fe1b9c41d4348b031434a78d8d6c8f5538baded954e0f37a75f25e63d15beabfc924970222f443a3f81ac3ef57b162449bc8de7061d6f17cba49bd4f19899e9d2c36290ebfcc7c8047171e2b5fd9ae0ac6e47deda909ab16102ee303d7ef86d9d64d59880c91d9b3fa473f76c5f53f73e1295352f5a65b2149e520df7ec1b17ae82185d1fd7e67270de14f4a46f57e8377ebb5a1db56f181a02dd6562b80745f34339c667cd9004df7c13ba974dbc6eb00c3d1f2e4aba73ae829e991d0088bfe9d2522d05a332e053870309bcb00fb9203997737c41bafd3cb96a176ba09b1cfe499923a903a1316890371e85d95256d8eee8c1e2232d96ac9bc6bd90603660a76e80bfae53b81825b4ccf816fe5c6f2187febfe79f3509ccb7afef4ab0bab49a19c408e58c17abeb602dc66c1b8737ae661a0ddd164536505be258976713aab4265f33373b92dfc1dbf410f1db4d63fc2d8fada12dd0c5aba730512b8d6fcdaaacec63e875fcff3772cc71d324b1895709088736040a8219bff3230169bb6103cab2c51e997b808bd1ea814ea9144e130e9d9c1b3ab9ca2be7e48cf73a9c5a1e966a24d60b4bf73909bc470f9a609d7491b5a6863dda3cbe36c3f1bab1ff391500eb79cd36aab0f8ddcee684742e10a3aae5dca8859614e4052e58e33caa8a493f6be1d0474d6ba1104c65a1008151de43301bbb9bd30c211a682c510b8fb162398658a81e96932b968a6556a5c0661925545023e1b09eef8f33224f64d4ed9d968c991d5a2e69cbb0aa7b498316e040405c731cd3768d5a191daeb5c29e5829a120af14dcc70b6b8a51121088be63b2892a339be8c1449d57e03e3afc3539ef2f57ef75ab4bf2061ced382c7baf2ce1710babb95eb7cb056602e3d22209c913cab88c9f959270f287696f956116b23561b1514b3320214fe7125959b881a9f93dce52809583b854d8728e355baebf30552b69019b41561604003cef0f9100921a064663cd5126fcc72ef696b369506ec75601adefea6fca5b44a44d0bf80831f894ad75a8bd5ccc324119757a9ad21bcd6fc542f2450a3ff3b7dc491e61941a0f9acc74029771679b5f8b2c367de8ef8396f816031a762ff18c32629c78493c8fc02281e4aca7f3932cd4cd9490381847c37fefb324b100a4f7d34428e718111ac91578dbb5df9003510d34dc14eda41368a9b6241ab1e5abb5bdc7aac8dac51f0c636ada4dc52670462475ffb17dd2b4c6c32856b5466b8068080627246275e0267aca2b7d66d1630d0b96c156169f052bbd8a707148bb0aa0ae4464fc14191f6c5a2641dbe229d97fb3e1a4bab0fc93398a5bec1ececb167b039082a6f8ee020a55e336c16c742e723c42bff119785407240079b3c00f9d8f1ee577111699b3994db0567d1747dbbe454a29407dc989d3af5e6049d0ba9a71a408988c7b86922c3a5359fe1b06504ed8b3aac4feecae077ec94b392d67ba6a74add789645fcd19dda9ce244dca847537333bd8769fcfe01123cbd719cb163fc8551434c9c48c60de79d5595cfbd777a4078af9ce63fd256679b1903c8b078e57b8cfc40c49e76118ce2ad3d264462d895c9f0a16eb9485382ab92c1d52b4c7c5c7dd8147845c453cdb8bfb6d88099735478021fd0a902da6321a417bfe63084ce03692e0d68543635f6a387cf72b1c64b7d7391c37d0342573e30fe7d494e9a3595837776c6ac2586dcfec716b0b3d0353b2bd27fb9e163eb7cc42d5c3e7904107a01c198389f07ea1ed1b8844adc86a017c0937be6201d06c4d75084b49a31eec52304a359c87a5f091618937b1a17053a4377542e4be9bd828f667bb3e8c72e621c3de2fdec491729b28cf2a0ad0284f9fb94bda8b19772f658e47792a029ce487e9ce332dfb8732d61c19d3626518a45a7c43834fa23e01b9794f658753924d1d9520facf9055a8ddf583fccfc6bc3e0693292ab5c95fb2087c3dfe2cc1f4360be5a85f600c4001666c892e6e6ff07ea3817a91aeb309325b58ffffafe1374c5700859976177e39fc988b50be476cdd2fcf1d273484fe7d400d95cceb4d0c6478c55749fce6006aebf45d31921cea529388d6204e0eb788e555e468f377261ab9029184e66bfeb67e48f15dbd11c5d7e9ea96328c61bdaf23bd1b0b92f6ef8806a48af6bd5ee36596e459fbaa1ef8308bfd7fcb56eb52ee4dcd9f3ec3fedb0bf7d7331b12abf59e0df5d8deea1948d0e2e8686c51f5e9d24ff6cdf7caf27e7a716c0894a1bbc54440fefa5e6063807d1cddff70dda00ddac11ac5ef612344f0b39e046ae07455b1802b791a6bfa81f1fe375c049230f9b1e445cb4f3ccac5cf174bef9136b95d995c25628491ef87f51f2f4c2113548fe4235080879f530d6eb20ca2465c4fc801cd38b539e49d4cfe20454414c5c72214e0f60ed9111ba498fd609ac5981689d64cb9baea477c90623b7ff006c7e9faa20b570bcd8b5fdc3f7d0cb378aa74799def56aaf5415ec377aed07c1456ca3b64bbf93a2fc525a05eebff9ad08a14980e320aca6fb934336bef531d78d5a39f6f5d28d842dd2d41e0b23a6f2e8ede56a2f49812323e2423fe9537f27aa4c3caf1ffdb7ec232f1295e7de7296791dce9f3c495b606a3ff05512432423ae746416183982f60aa99a170d798c526a506d6ba355e703199fee4049d99346d9000bec89fb08e44b3c9eb9e0ad57b17bb4d8e7a039c531bbbb3b0cbad8bc0a6e3c3ba397c046b3bd9faf6379f52b9c77fa483e5b97bbe10cf7ba4dc7e21f6524db0c6dd609c13d033a562ebba06e61f7468f4df6378d874fa40ea430d5860acdd1fb2cdd899761cd81504800298741f9f7d34ea1c57f516a749cd6105e920e51991c0b8bf620a4a25cb5cab507e6abab9548c632575b40165490981ffa2694bbe82a3b1df8f60cfdae8adc32e9ab388c2f6b849b6b8c6f87316af360ecb712adeddb1b25c06218b08eaf17515ab9fc59aba26a8a64d5d1d87958278ba10e9b07068f978c634470b8d88b986f54c22e7eb24306e00c8850d3ca4594dcb65767169d482433c31ee2fb50668d33179a2f24db802f59a01647cebdc81c7d68a0cf52e1f08cf4faf25150ecfaa710a51a9114a8d319070e02461bb5b62ec00c3ddaf31202d68353220dc80e2f24892408dda2c8e6c24cd44c1972d45a4bd7308e32c423228ebc1c9b84e64adaed3cd2261d573f7e0f6b970af1aca7e88c23b89e8acb53a9464f7fdc4df5d3429dd0cc3138de81d6ed7fa05c76b32de9a5f01138aed9b8267754866c76bf0b464d49501384006710fcbcb8ccf087e6f4ae07889622e19e8d9ec583b5ea61192109943e013d67acdec6a94b581ad837686c7abe9156a47b8111c4afa6be3d97dbc5aab32b778f5e07908870357462290791f9ecf1ba09be7d71bc4a82543d8f64b1b009f79b7daea47685374b837040f65feffb96b2e075eba226f2d0f59d0c4c04252b37b872acc9229caa3438a63fa63504db6761d0ae051c36163c03f73b1a27ce00075b331422ed26783dfb463a9e8a0a9614f4b6ff01d2ac6a8e390f0ac07fde3e6d432de2af26cd3163edab4af96feda274c6d57e4c843c259d03207786c1d4089459ab8e932a939222f1a4e6b653b1a3f0609e0b89c3ab6d38a7a141d9d6a68ffe8d4b1456d27b809ee40e03ad44b855c022ebc12b496f5e4424a259d7419880fd532a3ebdb8ca1d6acd1b415d77f305bd8785478eb02cf92ade158b94844d44ad7293648411d7b7d2588836d7e27ca54b5d2226a756e2a7cd7506d2b7681a7cdf30053206237ba1377124c53c9a5f7f57c1d0b508b8b8d73ef75a3b86dc54b38d81c9e55f17c6b0d386021ff9d3b39f45310e72890f73050b31f2396b9ac9cdd14fb7b6bac9992134ac00584bd352a1d18e84ca79a330fc92e8f9c2ca3b42bb21064e54bee9c5eb5e171c388d405add8389de1d842b66d7a839c152b6a2c90bb0a198baaca6b38ea4082f65c7b16d0aada72985b925b76fe22aac40cb10a7cb2f0e118df2c1f3d338728100004b8d3871b8e20d1ac7fc1e0138f56e0b3bd7d639022eb25e07d0df2e9a3dabbf217c40906c7afe8929d1a59f717bfe6514c636351bcd790bf8fc09e1f7ff63939f97b23fd7473b0255cf9a77e5c658392c774127e70115163a944c782d96a74968968bb6b8ab808267fcecfa65836c1400702dd67eca496f933309a0e02188b2032d88be4438e99f7446c62f84ce7b11a8248f10306a0f3a9126cff7617b70a6951d38dc74f2aac360e9b85f11e7507b5b06cf4664b465a783d44ae0f4a46ad89ac4fcb2382252f2ad746959395ac8d5ae014c7087e2e5fcc5785c330db98c63b9e7ec4024508fc9c47e0e4b9916b4b818198475544b6f1219ff526139b644a0ea0d0e4088e5bcd3059c4dda9077e5311b23d4b09e7f5ec77d020b0d0837d8330633c0e22836669d7ce24439ce31778a51830e227265624aa53c744a4f95996ae73caac0ca26293a0daf305df3a07d69dc1e309ec31b6819bbeaa495bdaf7e7f93a45acc68ce90e92bc0f604579f613fbd55cd036205a84109198361ed0693fbed47920e6e887dd097b95ac05187a1449738d5219926a07b96f9239fc4f6cc114da2b49e61c63a00c6231d12d3c2a178cb90a8aa18bb4e8b4d657fb7d587a6404f8e30b9fd8f35c189b5099b7458169f8b0b5b76dc61ba1fb94387b954f2639867106be9acda7da3ad378585f32d764209867dd4d53a02ba81957ef60d880fb008f590c61ac7ad51c6e2d887d9254f7e321afcb71c86effe0ae785554faacbca68deca289af0bda7747f4ca8c3e574697bc3aa074f2a42ab439541337aa7b40323978307ec34099258c0b17860c64926e355fb62a1d622f9c769d4063c336ea321494e2233d89e911e1e0c9519fc8bc8640c2f4ba8500328393a37b36f3de24bd35bf477a4eb78e7867244832341de7d9651796c50c0cae4b2cc33c7b69867be26fd2ef177c19dc2a0f7c836b3a7fcc889eea261118e625498a2834daa072504e5c4df02d227ba1c679c2daa6ed3e663647dc6fb8d977f0f011bf9b8391ddca6fe56b9fbebf4a3b4e6c5e214015fecfc8d9c378d0362ce2b9c2ca003c215575fc25e118e6a54b51f2d0c45bf8cfef736515e55cfbf1a282ba6f9d7df31879b5cb8a515fd7c63d1ba0abb8de6cdd36a3197ddb7226716038551ba1ce0ded0eb4968ed2284b8931fb05741474134a2b97861b335066b11e08a22403c09f6a1790c8a0e1840a9b4fe46230e95c4c03258ad967d53403a09fa34e0daa5fb33bba060eb8093140ac0402b8195144acc79b2812110b7a416e95f4ab52982097baeba64599747c8a0e3843b1148d810808a10a1d7b99db243da0d886ee033dc54afc3bace84208c14414a0b1bfe53ea47fa0378103dc86388356feb0b28107ea7d5833ea1e1d2b2770607a8fd575932d1e6d090fb09c314e781dbf21e8a65b4d5209057893c3b9509e030ef7653c2c67accb1f5626f040bd2fabd41614ed37117bd0dec71a401f103bff93d983d21d056651ac2104aa5747a759309a59a5318929492da0b51525b5709581b3828ee9e66e54f4c49cbdb35998670821acdb2a6041441dafed221c38bedf9cd72f6ed8e402e7345c8a6d76e55d47bc7da6dc42a9780c6be7d1f911919bec2df7967b6f29a59401ea0a530a2b0abf3948fb3d97838e4ccda3fdea6f06d96ffa9bda06376fde2e2657081675fa2aaa4bae22ba024130b5e731dd33a7fe762e757d9203278cf00089a92f26fa52aaf5d792fa4b69ce3999b4eaac36383928305727280458b2c39844ad4533c7e84252b1b0c32b49ac4b755a2772f015b358a91158c62bc618638c71863f93c6abd6498bb89452da3981e943188f764bc0945ed775fd5c9308b7524a297d965d18a6318a514a298d788292a5c4ab3bda18f1690853ca512be02d4fa3e01e59eb85bd4aaed6fa53b7fc74e22981e50f006e26c0f27182744e4929a574562a84498a825bbbef860c77f11c329fb9da45fee25d1cfc4cfe6eb838f82f6a1c2e0e7e3866fee2337ff19426b0f699bace74f203eec0922924318529b6ec6147a4278c9e683d116447a42a7ed8557460afe85068afdccb61dd1e3e5d87ae3eacc29a4603d1bc46ebd0e86f53e96f53e96f0b8a49dbe9847395b602388d25c08f9b07e0c2cfba1958671d0d2f9525f0c5db3cb26e32cd6b8e43751b1d64731518741b0d5423c4a2b9b939cd63d43c30aed24034877120d56fc095c81240fc99b3ab717391ef8b9f118f0300af798d0612ba7772b2a301ebb06e7c134dfe3c55febc7ba7a1798d060ac0690e8473d58558b1fb6edce080f1cfa379cd8354361762e1a8b9002e001d44a379f0d4dc4603c5a0aae980c8d2a921b274e6232b001a00fa487c64e168eae15fd7a1aa1c5938c74d93238b850ff8d7315e39e9ef864a55739a075da571d004d5e853153e8dd08e11ebd07bdc17cc2f320c1d55b2dd2c39eef81f471b1f9543b9515fc9a1dc2b31eaab71df0d190efe06190eeaef0699bf509de63caad368a023f8409f779a47964a7ff1358f2cac796caeba4a037d9efe6edc9ce6386e4ea3838ef0a80ee341343860fce6373a4875189a65a3bfa8bf1b36afd14147786e5ef320ef363a52158e9adbdc4607dde81a1da90a3fb2845837ded97293bfd3bf9595538c95d30a985af1fea53c1bfda1fe793c36ff3e94cd4d6a459fb40e6de99e7289b2c937fa5bf997e2b9b149691e00bcc6cbdfb782c3f372ca537e936d1ebb93de41f74d49396a4bc92abf7103382239f96147a42a92ec30467149e9a7be2fe62b6f7116ff3e989ffefde5dfd772ef289d8ab192af439c9815f0d482850e0f73aad19f77007c2fda467f2d28971cfed48dba4acb498742fbf49843fc7907c06b8ef3f7a5ee7de5f1f836f94be91b0078cd3f4fe30080aef9cd6dfead681c37b7f98db6b90ec559e5a7bc83ee1595c76e07ca26d7e448552df18a2bae18c346a96cd4b76e06ea2cd967822a63c072a31ec62734f84c701e759b1a1963c63ad2383de63073502b72e33073543eef3373eaaeb9cd551e73d8cd50b1f15ee33d7a1a6782de6dfcf8a9ca0be3af4883a7c3babd9b6af0e36bf0a59d20d63813fcf59c722fc77dcaa129e52939259b2ebb7853fea17b676f51ff6c42db543dcff33ccfd321d0f61eb32ad364ce9eaed21f7ecd855834fac3fabb4173d57968ae3abe4a031dc19a47f51a0d74aac2571d08d35c88a54363be7664ddb94be7c891a5dac1e91d77d33ac01c592f7264c57c01c7eb502d637791236b2647968c0c5987d6d0fac48b4a2c94670b22ac14531c31648492e719c111290a485170b2b1479af2e900279d30cb13d8886762028e0251c7c10481a7b89b5dc2d92312149868b69b816198866d5cb6d372324061f87279a509f84bb16ea381208dab88b88bc0d8e5b6c7e149ee31c1eb87281810629ce088048524fb877fdba3bd59064102fe8a748f44310ed0448c14c8605b0510695a0706b8cb35641b51c0564be0cac1240537a0c0434964b58eb8f4cc67f2801d339d00ca9eac6b490755d14d891d919670b4e9ef8c749a8ad82bd5f35ca520eedbabbe617fcf637f4fb7730fb2bf9cde1e74652beeb96d0faa029a45a0820956b0b6c955f9841e74f551eddc29d5dd39dd83aae681b86b5a889523cbeb3c535e81814c924a44acbd0fb2d73e8ff058fdddb0effe5d1f0f77ed413cf6dded3b0d7484e79ed34047421b5a0461c8ce01013f8eb68fa7b4af63804eb12f5d2428f5abada7c4e27e3f802a380d52d544c08f2396d59ad641555d06e2cdfccb4a920f69c414ac0004ebc8ca0da412a52fc8a10c4419514ab964f547e771a0abedf638b4dfdbcd6a52cac78d6132874b88a12d9128a25c4b11a20c992883897c72801963a507da57708095e86afbfd3cfdc0c6da1e591fb8fabbe63f1c1e178e96b0b4e3b0df74d0111e8f0b474bb0b45bfdd1db47168e1c4a70c4102c4d7f54dbd8ae694124492007110e23132332294b25ac48b6a40432a74c8aaad9a2524a39d403a807146cb284004f4edac90999328746e1c8ecd3882329a9a41ce5516d3c20ae706ec80f20ae6ccc503b1ae2335de47efe5ef192d4140a6d1b49a16cc920392a275b14089245dc92886ccd1cec756271a9051418b523521258d8a10c125abb6590dad1101fda98a03ccf0425d215461b3b766551f2a8966235cb78b020324e930c324169512cc0f20371b523aa6494c143cca94ee80191216cc9fdc4951c9267c981945b72609765dad4e57376c676ec966699cd91599e09c62714986047437c917b1b7475b595f27634e656801236e0d1ca0a74d4b9df4eb6e3b31db31d3b2924e50c4f28baae1e98a09884a8263ca8c74d52d745012031584214540c11418414006104de9e882c8bd3e4046068e3d215c5d251a4f3396c24c04018b1a37e2887a2b641700e3a35c8a11cae5f55e6f023759559ea1301c65b0e692bf8e41daf8099835d0ecdab6e9ab31020b114b3b023a5c28ef4093c318238542541300afede71083d30d94b330896bf7c80591831f4220a4d8664e001775dd049c05914ba8913175bc057145e0081892638a16445d2124e1ce118716f8cababa66c865d95ca3fe6aa3832f3c2734639678c736a261f628cd7cce88565d955338b516dab5b9d71b92b9eebb83859b6d34c756a45544963a4f88a2debe903916a414e5aa55dd9588e733bfd08412e4849c5555570552ba4a4424a2aaeaa82ab5a41651862a497027468bd2a4e1110bcb00833411007bbae6b63bd22556d3d6d3c95f6f52294f858899ad004c7040f5406508530309102900e4ce108150542548886868650c04409378a21a965041549b410040a2ad1904a9568e20ad6891eb899e4a1b6f726b8b03dcf73020f3c2743406a8208576f134f696b242638b097104b6042899d691bdb981478500210551852674e5c4213a820a31c494111116e820a9638a2205052da9ebc2ab04b14619f294e800524f410042821a8272022a269014ba58070c2c5298c4a5df8004b88d8f5b50a1ce22ff961633d84a0c3298c4a551513b0409405812dcec4e9c187ca0463820b80a00da8a28a1f9808a2d9002b8a2a120964b5492c5155b44c48821024a2941346384c4c9c6c6217865d333d38a20411f86a22c911281c916246892356203901040e920e7e48813a7dcc6e2bbdb04ca3503bdb861201ca673e81830b900c51e18925434e4c8084218e3423f0408907b0105cd7755d54703ac89a58caa008418684232932278e30021eb22986250c211484921814e14715424ec0030b6909285882077a9044032455f861a44994a112f4a00221062110e2c108414029c2083e3c81082450020a4a3c39e22ea04ab00155020a82b8e19ca773eaf03a56694ca5309ed8a51f336710e3c35ae3f55a8f69997ad51905c7cf4b28314efc032c631421a3ae494cb298149ccc7f1348bc89977b654b2151e29209e298136099495bf64ad244132c68a289269a68428917b40d263b9dbbd22bcbf5dada966de42278ddd2158e30d8e78561dc962d76ed57b7635f35ad591d0aed6cd27a49ebc294e9f86c08269830c204134c30c1440c39ec91b9589164cb9b7e2bb792ef8abef6869747aacaba979cb56b7fc9b4ab616ffab559ceee86171dbb1af226db99b25007a16dbafcbd3fdd55def343b7ca539e659dec74387777ee3ecbbc977bfa2f5987de1cdf8539ec94471acaddedee3a73467753feb27b3cdfbfec2f99e679e97ebd9c65f7b22987dec394cf4bf9521ebf72eff7a6fc999e729567d9ef4a4675ddcda8afe48b8af7f15d0e4d5d77d353f2d7a53c1ef594e3fc79c7ef7e5554509953d19187dcdc4d393c699eef9ff797bb3cf434cfcb5de24dbf387bffb2cb4d2fd9e559f68e73f62fbf3c763c2f9e0e855cb2dd718f9d0d01d8b2933e74677a87b94d45c0f211332101d31dd9b14bb9b12cf71c42cd4f488532699461617bed77722620b03dfda3448aabebe924cf25236c7a242988b250c5fed25c4aaa4a668efdc9f6f68c6e07674e04b32c83048e5b66bbbd06656703a7b4d2c555685f33cbafe5b4aa1d69290dd394240c7a4dd3cfd9be9aa6a58e94ead1d5b02cc3324cd3329969ba4850fee791ccfe9c331d6ad7ec0c1baa0e3812210a4b5b861d874084265b7635eeeb891085ccf2a4a96482365707cc5fdbb2c3a5254f971c0aeda944053d3b5c1eca9dca92e7cffa325cb2aecdf7207864593cc434a7c5c3ba2d8c8c33cc261206bdb53afcc9e81294d29487314f274a2a4d5067a15187994df6d1ccb17a87cb2f4d1265c0c44897bca5f904cacc6171fab9146568a77f2a35845b29b3b553aa1150432dd4af96e5cef548cb0849f67588ae6ad25cb2a716a7ead0a616e76c61ec6bcb9ea6b0bd3dd9933dd947fb5998cfa528634e1b607491a098e7db3c9d4c309f661da34ae511d4f45c8a37f49c1770be7d38973a1cf940476c4c8c0eb35b1de2b0edf3affca97bc7bdcb5b9e7beeb1bbe89c81f4bf176d43ea3a2460db0309b16478900c3af5c9922cfda0c9d2cf7682df8d5fdbb7e899348f66ced53be8ad9e4733899983e91de14c2214da554f252dd7995687a9bb5c67ea10d3b48ce5d4b33c54c53eed887414c5c69ed97c6b76fb9ae91a26a8656b75147004b6db3e8c474b33c7c9ccb1faa7ee2733c76efbfc43b7cbe791866132ab9775070bb85c685f8cdb5c72b663e7807f2ed1d54f5dae33b7fcb9dcea7de3cc61d1a1dc4f4a82b2eb43a16d6dea2fbf5c728f50d376a03becb1537fc961ea57cb6947436e7b17d9edb4e85068db1b2255fd5a4ee91c6abf6c4bae67c971bbe4506e174d8b1103070704ff542ab503dd2e5ab68f3af4bacdf72e39757f680dae25c7cd62f7964359a7cd7a6c2cc7fd1ca9ca6eab57e25ec9dc51998754c94b212aac499b1ed37b4bdc53280c4200c73cb4f697c6ece7cd37321de61edbfa08b1a6651a7387dc990e85a4e907dc63815a7f595688b1a398809d6f73110e68b9880672cef95617e140d0ef83153b1b590349d675a4aa8c06f6eca2366254c59819150accb46172a34c981dedf926514c4e734454235999d0c2966048604568614a5263acd07277fa10579c9e4344a28bc8115d4d22ecc86b11d9b315e30c678b5e99ee39445c6149cc3b5521767788b5aebc9153caa22b89947185b5a86afeb426488b96c0f246342d9ae04cb2e7b156fd86b5a8c68eaa5126a9a4f29abcc228caa02176b4e9f027a3ad0952f9498d2a861dc9cf4d5b5353236a34ad9e2da309ce242dbaaa496a127b9e4a5d8d84c0218629cd9c905b32738e92c0923025b41a6149604758d27d881dcd384d45ee2f977d40454e6b392fe0c8a2d845c51057989e57f5c0fea53327911c22c49e9f447445a350d58ca1b789d0287435511055f373be469944f1e60438a445b488891c725d9ad2287425335573c7d00087936808fd21fca1fb8739658600beb21057338a28433e453f80add87352b1272da24ca86ad61f620e15434441cca1513e89a89293264b8a94a49260244c8cd027c429063a7364bc9216d1158d4289e8adc538959a5128a5c2667aca649e56619392c194898c12cc8f3d2f0e9b7e4a5a674e94719a8a5cc7215997ae434c49dc2833445cb5e88a64aae89310b1e9ef955c4b76c12ab4f593d149718e8a0ebdebb3a5a968ed5387de4ed1b56807f83bfda3315324362f6afb0c4251dc639c81129130286da572ae94a64182d02033f5949e3925c34c90522272866a440545896c7aa2170a6b99fbb4f2d34acb5bae335351c64ca1de63f44ca741e88ab6b48a0e82d2f831ce508d4818f4f8f784698bae66ab1a9133cc201206bd0a6d6d5a8dd0a34de765908aa4d59d7e06d1547468a936752d8a37f42c52c02fcf1ed6a2941cfe647bfea48b04a5fef2948e402ef7c1a2d1daa9439f14d804cfdbeb90803d8124ab25f5998ba47ee5221a48a552a94f5d8403412d0f62c5ce464a034d56cb75664b6639ce3ca497436bca21aacb3ce4a5df722d42edb066fa93ed4be32570dc2cb948659aa4d0240b516cba23521698d4b8ea2e86b8ea34fd61aae6a7a61ed8b7d65deb2481b6eb655ccd28af2c96c024d0a1b7354db72d600924caa85ad5ea371ffb0a195a48896eae0e7fb2ad7dd39ab63c7848d4ac44170de4f5a8ff0f81ca244a6736bd54229a40a25021e82a28bb761a74e47a1076fb1ae9e45253c0750a78ee7824a060a16847242c0c59ed8874052b6c9944577288a5d16dd91de120442a282a7abb2284825209077bc6a5a680b11dff490409cb961c32417ad008cf6b4da4284dbaa4d104e9a9001ec10e902ccd052a1bcceebb81dd9e07bbd55fe5c9aee9afea10d3a824954c90e6c83ab420b054924913049792a06c4a5c29e555512a5996653ee60aa4aa4730c4d1c116b5c37874c9cbeb2c598104cb6357d4a81863a47565ab76ac92ce58a3ae61adb5d6ebba2e2c5e55afa45421d64a694e6547ed4a2f5c6b55d93d95d65a6b44a2275a1ba3ce3b5a4a2fae0b3340f9a0503ea8285e6802ddb966eb8505815d3588cd98b65a281f7a6115095db1ab9a90e4a4f5c2e235b35968ad9335408c4b4558e9ccad136f8ae05a2b6a672bbb071589602b963798805cc996a436902b0944ea60cf7814244890b91391d8f5d8bd2b4faa34622130b516637a63b2745ec0dd086cda92ad1e9476dad913fb7a81ceccfbba8e3a26f2c51238db11e90a4feca15f4109ce0f5718ba96b8aca084734d218334801dc23cf1408b273178e2c40a2ed8d7e724522255808222aebaaa2c5913a45a1e542ab08542880f3772b064714004c5112420a2c8080a23dcd04112144e10dd4002040a2c04b941c452ca081b143408e2c50a30b623521142bcf881b91d918aa881865244113235c0d78e48451c81f4832894ae8304e59563d6db98600e31e0f9dad598baa7ea1c3c76e2a08302d8374d8109ca73307bd65a2b0e18a671d0a103872a04dba02bc9d2110a08567a80c3ebc8ae08c1e1759444b363a92be5e4d2d7936b698274e95a92289625144641c1a050e3890ea1de122d2269d32877a0b4e96d90781064531f240e701863dbd3a380c0a1a5e175741dd115f7cbe9ebe8caaa437b8fe82a460c1c037ba99894f1df5187566a9caac16a3357f10894d26694d25a63d01f6025aa285541c9a6d7d1a694d2288f664e521254c9a647f57b5698944c2505b13b9582790d3327ae5686c8508104043852025acca1865c4bbb9edbec238d6e83f1a67edbe07691019edced735c1bda256883aa2a935da5bd066ed97d37ecb7f3d86f9f01d507f7da8a32e4eba9a4464733475e9918ac753f373d9a3977e6ccbc9e2699392e6eac96de4caf63c7a40ec5f20cd5f64cb65d7c7636f438e28a3144d997f6914066b2dd2e40cb8157a7a8c059d89811468d96a45a584880940d96d918cc3442ad681eda2d071b2282f531076b61f7de7b6dd3081be2da578b5a8b314e1919d1daca74c5f48619a9189224148cccc513acdbd45d76334c94c52f15ee2643de747ef1edc88c0b694455f5563699442411ba6d3211898ccce5ef34a2c554221206971fe23f44810f5334dbb94f23336747f6696416b50087b325739da96146b0220c09ddb2cb51731a0da4fa274f73c9723998b1672c67ac45c68c1079f9cb632a11ac55af1de0f06ad516d69a57ebfbbeef585cd9fce6a1dd007888570e807c936d32f623ca008fb5a6aade5a8c5329acc562f496dcd2f2ab88ae6c5e7f1981d4e81a5f3631a9542a959294fb7eb564f6fa225f3f8c6a54a92ad2086534c17a17b9cee45a548d1091334ca308a3bed66b1d0df4db35ae763bf432c7aecc74532a898054340fa2b964f5501a4dbb0e09d852f5a0c952dda8b90ae6b5a56509c448c57db6645eaf43b9bc4d233367d33bc2696482425b464f2431a7423c843ea2eceda1d01026b7a209561de6c7b4b8cea4f7ca4e3bd5320dd86588b84b0984e6dadebe5d669b0eb1c75c87ca2d93e9b7eda1d0758009e2a4a86872c5964d228cfa1655557d26384a008bf08844ca0038002df9a8aa0f5d725c5d2daaaa9f46325cd2cf408d248c7a61077196c0d843d006678255522359a9518e11c4e1023432d4b8696a4ef3ab85e90a0720c4d505626dd1550d54556f2dc6a9d41f821b3fc4d9f8e16a87178db5e2f0a7df2d5fd79902f1465e97216f35d05505a24a5ab1a5ac3098aae4694e691186fcad310e5093819c4583b56a484ad2580bc6ca601a1ae7e974bae8108d3997e3d63aeed855ba19dbb74d63d8d59a60bd8c602dec580bb39b3b779d99b38f04b25bdc7633b8cf969c399cfc95323381901e6cee2a92687357e96cc84c20c4687392d33b58a0c585764c4d8c163adb90e06cab39108c196148664e11d6c28ce0ad86058b63d9b2c8dd61320ff95d2d1e1295ca616db95a2b572b44a9d496cc0ee393568815b1ebbdce9461ba9c026d70e80fdd3b766868a886cc86ec8a2baef8042b04b0eaf85ebdfd6af2f294e6508a01673ea2ec4c87f73e12c8c6ee23ca967b9b44fbda1d4272632138cc5a522525101a1a1a1a1a9a1a9a1a0984e627b37445a3ca8a66a6028ee083e383e383e38343ef83e383c3045a6be853e79c73bee61db1476a1f9c5def83b3a5a4979d0df2b45ec69c831b656e8cf16672fbc9f628c510298a28572ff663af13ec68c03487494c0824733597a8aabeca18c419a6d1136c08917befb32bcbb2abe790d99a5b3ea13582121555d24695b446589e5b3ea12b3964aaea9339a4a5676bb660364b7441cd550f261246f59199606dc91399ad09664964822f4cfefac2527f171d4e39a40b389c4b467369dbb66dfbe5631a4519dac39898c5fb2aa34a6a970e5df4c43e5b3347d6983085eff6971c4a24f443e86a86ae6634016260807948599fd0950d141ad9de7e2ba669daa5762cd372c564aa95f7e65066dfab73eca0bfbfea37ec62d8b71ce26c19d33198501d45f30989e7eaf45eca2509239343e8929c01c6f52d479a2ffac4aebfd7eee5b7addeed4a2cebb099ab1c04a0c1feaa1c68f38da67ee9349a792803b37ff917598687774b2412c6f790db7ff110b52576a9612ea3b8594621a164531038944f7a5a5ceecf2113899c6116b1b80c4876fd8b24d328de5427f3c904e34dfdddb44c9646a6aafecacb0efb96e9ae5d0e179fd13397ac982c5b5f9644e69095d7cfa2d3caf3905d679543e24d2d02cb21b7082c91b290b46b7644ca020bf6b59cb5314958e5f8b1c37a00e9d7cb1f732533835c2261d4a3c2b95129a62038944f66125355aff33cca330913eff572899c41469130ae6622c3106feaa55cb2eb2f6561616139f6b934a39839d7f7984f273327e6f58a51b962ae0fab31af312c78b3d8cd829de52a3046db7843e3e5f737e3b64cf7ec68b037225561402ffec90309b1661e3473c98add8c1d2eef7999c9ff64c96cc3af4302b67cf1a0c97af11b2efee2465106f69887315b4b69f9cf361394d8cb4b8b572daab20e2d0b1de24f87a91d23a3bcc8a10fce7e81b97fd1f2898b4b0e7d705cacbc4bde118f019c1d451413ac777928b45b6839050c0b2c03f55880ac614b8dfde537873ebf2f398c4bf9fe7947bce2cafb1ef9ffe1d521ce0bd58b2ac7a802738caa1719c330ec45c77823b384f2ef398c39ccafcc577634b8e897ecb2b1d3c6b0ffbec5e590968d7ee636e63287f730d7a171df63f7d9e5d343c7947288ce81651d4cc0d8c3c844023a86a04ea813eaf42b8d6097445a598afc3141a01e51c685ba5017ea3aead7c45dd95679ecda6e0686ea1620b4e56f0e39971cb7cc307fc97167ddcbe553ba19d82da6e7138d6b91a59c4bf52c8ec076cbdae255d61706bcfce53a3326fbe0ecefb59bf172f9a4c5142d7e5b602d30faf214ece5292fd9eed8bde81d2cf0b1c83e13ac87c9384cb0febacc3de24d7d8ffa1c9e4ab5d08772880b1c26f8bdbc5e12e991bfd85f7488b3b1bbb8cca18c01030ee510593473421f9ceaf27a5969983a13dc2e722aa78ee5d0c676d13152997b4b0ef19687c4b0641e72afe410a59279d494188587c4438684a86dcae1cfbbbc8009d673b98609d6e790808e9913b72cdbe4b3ba2180657466cef67aa01bf6d877e6a175f1027cf88d3d0437865d05e6172ef24c8ed4c6c674a8dd07676f5a87c50870d6d98854a56532dff2d7c6cc652ec2012c17d1c0cccccccca58b190d24592e74a4aa4b630b7d7076764d1799b9c57e3d065dcd68991cafcfdd05b984b63392188a62d7ec98c4d01131fca9e14fdd54f760a79f1ad33d7406fc4b563d633d02ff543c73ec4f9d532e19dad7efbd97bbccfdc6ce145a1e17fd9275e77254b94187415c369dcbf19c8afea1dba4431f2e37703ae5455fb9bd1ce2b0e7dc374a16b07ce5486310b2ef598c6c5b9f6506ac9ce558aee1bdfb95f99ee6eca61fb49b7ec0f55ee9e51de8b723af5d0b57be03dd3d2dcfb45fd33d2f765d8ff72cbbe8d0e950687b2ed2744f3e763bde4d21ee3a1f3bf79c7cd7f9d85e4ff7b8af4bbcc9e4c57bb97bec76c8ddc3bdcb3a08d5e8cec9eedce33e7d71f7e0c71d7f3929e3cde572983dbbe97367dfae3231151d668f74c52387a1fd43b70e716f79878f9db243ee944c07a17d758c37a6c7a7dc45ea6fe73efbd53da67bcf740ff7ae87d763dfdf7b99dae9f1789e1cdaf837873a76c4261dca21ec61efa6141d0aed149bd59d5de537874f513c79c81b5ede75d7a12aa7d3bbcce9ebd90eba4feff4f5d89dae33b9f79cf40e7267cfbe9453fe529ecdb8dfd53c76bc9b9ea277ba73433bd33b5094dec14076a67be463cb4f590e6d2ec7dd6d4f0eedd8b37296b7acbcbbec6cb867f9ec7656ce72834bbe9363c9de6367c3ca597428b45958728f1dfe502f7f3bf72bbf486320c1b6372159a1e4de8c935d8d952d754f96e950ee1b1fca7dbffcf2971a5df6aef664c7e352a3bb3405e1cfdc31de98b8eea6cc711cf7d130dd4b793767f7e279737aef668fa1fd33bb97ebbdfbf46ee24c2613103edd444d261dee984ca79b4c39ecceeb4c1ec77199e3388ee3388ee338d33d6eda1f9d8ba9eb6179ea2efa26eea914502a77a9540ac87e3bdc59ce9d659aeaee9e3d25c7094ed3b3dc711ec755d3e470f668e2b86ad261e5722894e5984c579b949c4e3dd9ef4973dfb32fc7a93a75dec99482674ace8e4da6e3895bfee10fa7cc94290595ca2c6fc92b2bbf99e5a97cdfc2b232bb87a67ba66e7657b9e93725e52c79e59eb782f54ecabf2eeca6d7ddeb66a74d494b6099df10ad9466b31eab71edc409d6109cce659cef91141cb38cfbcd7887dca61a6fba4793f6f47d0ce5c6610e2e67e9eec27297eea72424a13bb1bcfcdeb2d03f8e64a96bbf26dbddd3cda69ba317b97b7dec9c2ea3d7e9d0d3bda7df1edb748e33c993942b8fa8c79bbc1e95c77d5fa38cef579b7e6596377633b81cde73df524e8f4fd1e13d3ec5d3c5307987dcf8d341689fb4e9f858aef106bf25c709e26fe7f4fb93eee1ee753dbc530e7becd34ff732b5d3f374b8e3a9fc6452e14ed9a4c2a95c67725887421bdb2ea7289e3aac91bdbbd72fd0ce49ea0ba3244af6a0f40efff0557e8fca1ffe3d2a7f27ee58fedebb72754fbce9e5a82c87b68c9e1cdaa61e96bbfc85e5de656743b7c372971ad94fbff9e4924d2c777171c9f6d794bf9dee2cefcec27907c1591e90ac23299de919dee9ee3dcba6d3e9d475f8d2cb113fc6249563c91dcbbbabab91ddd32c35deb078c6b1c8717235e20433cd1d21d441e86651c60eb963bc3175f772dd373be51de4961cde319deeed9c70ce6eca1e97b3e3ccddc49d1e9a4e7a87e59fe933b570f9331d9f7b96bf7b77584ef770fe3abd736a39be4afebcabbcfb6dc92b67c928d4b9bcf296cc9d6505a5e304718ade49391def9c8e759ca04ac64fc9de095f25674fc9a7c76e073320005b5e09a5d47c718261af4d36b683d11a690decd76b57037ba5143bbde6c6ae57b1e5af28b63c3683eedc6075a63159437e3c17e52177d53f72d31da4182e0d99ed6473db1ce2abed0433ee371ed13aab3d4ed094edb71c0af5649fc713bc5dde21b79d5baef1e6de946b68da4ef05add937920a6cb6ec70053a7c31e9bd51860c2616f8fd3be760c30e922f87182dda6431f3bdb597958c7a9ba2a7bedcd384d23cb3bf2da6fde6acc8e46667beced57d3d666c772dc57d5e1a39bd7133bdda3ae1334d5e8bee5abc3bab777dee94fdb3bcd4db0fbcdd9efd6fdf4ed378775d70976ddf12fcea1ddb8c3ddb98c7508b4ad57e3e6b0b78b335783bba7aec6e976df74e8e99f79b9ae33dd7799cb3526b8c3bdd371821368561f8b2516834b433ef468c84b1e1adadc515baa8af73776345cdb66b3ebbe6593ee7288b9b03b3d977bb4cf10f3e09f748aaab6eb4ccef4cd94437b03d6276da96aebd12eeffd7a39c4dbd38c5cca7939de703a3e77d9cdd0a1dd0d271d7b3bbe97392f47ef940be25ebb1b4e1a6b5877fa87ee9f32a7afa6a1edc873c7f9742edf807fd291aa240ded5778b9e3ab7fe8d61eb530fe875aa19d23c461d016c0364d4c8839e79c31524a6916aa90ebc55865953ce4a6f4d87fba8dfd3fbf74cfb7237fe91d99dec102421bd33a5cd7e1fa0ea77d691de47fba2d2f5ff58ea977905b4e2c4cc15a0e85abb877bbdc2377b59abde6b8afcbfecaf69a3c60bf309c29fcd66c7f1dcb18c5a8865d86f2d8af5aab04c2bd7b465d2748c3f482291f65e21230185a51d6e4e6310e240f31004ca0344bcb0866019a508786b6cd260fd5882b7bc07347a42a4c4bc08008d903ae3b1ef92064cb5f4ff680af1d8f7c1802ca492b96516a638ca1c65de1757a7197bd5058f370514a290ca57882faf27a48af2b5353bdb4bd4ee755759499560451b03c7d4d176c1623c528fdc015e35f2ba5284a2b45515a4f4375dac78001cb47596b04b250c839337a51715dd7755dd775a9e03a49eb8549991ac2322b32cebe66df28a596c3281f14cad3b46cbb3030d06bcabb711ca5f4d266f7840d493a63ada64bcb78734d1f97a3820bb254afac4e91655996655996e7ae5ec8329d51aa69b4650cdab66963a85106dd36996a398cf241ddaba152305a4ee17357c454c7b61896d59631603a5a4abda02d714a72521e33e8b38ba32b1b355ec0f2b7666ddb0cbbd8dc57eeba1831326af2ee466dcc9c9b75abab6d70df55dccad836ec3028d4d2bd76d72ba730e63a1e33b2d367c7df741899683a8c4b56d74c37ad3c39c704e7b99407b07c1895a68cb59aaab61165c4ce34733a1bd20694bb851b8f888eb61cda934eba547f2f2761f2646535e97a5d1198cffccdee18ccff9a6515ebcc1e8ca41ce8039225936200ea539f798aa128130a90a1484fd943ca429320ca58348db959ead1ae2c4954893299394deaa993b96a59a245ad5d29ab9e259b4f9286cc9c900ee160d7532195dee00b0217556a671255c11481575e4f5b3327fe80e30e27945daf329fd0d5a42b90d216fd9227ebcab2b3fc6a59db4ab59258f254da019e0f67528bae6a88aafa68694be5216d652e99c5637783c5e74b962c167772455ece22bbb0b697958cba4ca259868f924929d9f1673723fb29d708d2952c42a4b2895d2f855a8f92e24dbd149b3b8c1255d57b5932c9b2895c922fd92543891227f863d7532130d0fc912cc901f3411c481d049295d25fad9209b68009d624a94469e670bb5e46f186c825519c3cd9b5ca2a6c86b56ccc9c501a993915885d7f873656b18a556c2849b327cc052cb74cca76783fd9bebe801a2e0a0535512ab0194ed51aeda71447da37f82bcbcf535215c86801a7ec8844c5139090f450a312540821b52f85d90820408c49e01d97442701a882c650feb0a914228948a1b4e92bbdd5020d363d4e6921079bfe507e6c7a100a129b1e670b3f6cfa183a5b70b2e96bd8421736bd0d0f6cfa1c3a68b0e971f8c1a6485cb862d3f72802d20524444036459a220a9b2251c1834da90c0396e2e8c80820f0e1075030a1e8c713d6a5827d993046d5e3e0c8aaa5bea1045066c0032a58819482fac3099a9c348ebb6221aa10d30e724e998cf04d464a46570cba8a1d972335daf6f6e3996742551f4fa4aa39698e980d27906d2735ed9057ec0c5395bd7ec0e50fbb108b32c91fa66dfca04954658fa18ca480155947a48d128eacee36a8cafe404778e6b9031de1a19fa7df74a781b6731ae8080ff74d03e9e8a981a8063a4dfa236be9883eb2b6a9691d13b4c781aaeced099aec106f7b4dd33d30217018a36cfb9925cd2c63b0f6e3d194c9edc7b39d7ed374c9d2a46daf39b122d30b70fd8df19bcf2ec4ca34d03d76a0edda85ae47aaca5afee6b70bb180be899d47c3be611a08d4522617e053bca1565b8ac56359f5129d14e93a95441b9344f43e92481239a128ce3cba7894f2094f70802d0a0ff0c57823934419dfebb121e40c6684d520ce505b5f922fcffde50b05627791b908629fc93682d8656d61d8c36a034cd3fba32d6da63da4bb89845131237ab40435a249e8d1046bccc36984196148b022cc4893db640b32bf02a416a8448d7585492d99a21911000002004314002028140e080583c150301eca92a43b14000c90a84a705418099320c861ca20438001801020000002000033b30d08103a4ede1a89b22ff90654ec0e745fb82121745cf4ffbdcb1ac44453eceffa0bc01323038975dec5479fd896195872bb31ae85ba7c5c7ff0eff4596906a7da582284f7f4775d6be5e97df2c7e7317cfe47b9eba8de033a21d392d99fdbd56fbccba9ad2a08208d00ea70774e7eabe57655262c0c31df7d2ea876aa7fa5eb68c4f7fac4419d856cbc892f3a1063a32b288966e0119d392898df6a168ba2abdf6a08727cfd6e85285565e98c7c98c6d37c1ea4ef35bbc11b80c48a5ba6c6c700b8209c8774c17935efd6ff3aaf25a598c771400665bcacd92cbaf3dbbca7efba7d46879a0e0e2f6ecc2479fa3b0f7e3bfae050dc1b52d0051968782fc3bb227e1cdcef62665849ad9c3efe47b85832d605f1c901010f2a54c47ea93289015a74a56efdfcbe19ad24471868ab99c61dd9352e19ef55627eebb76051f0f419d7c17623b9a41406f1f2ccf19dc3346e43de920cb068243a0db7402acec59cc050ee6fef9dfe07f00b10444e94e2bd5babb98cff8c8c7b8b6f1256ad1a0dc160c44a561a8d77f497633463eff087da4e4adcddd0bd47375a01766f55ab84c021dcb4dfbbc2db3fc0d70c52e09748fe01f3bb7700ea738dbcbdae4e98f673c0f848d315e82b77b96a7bbef9bb179cda3a05080efecab9823ab49609ec4715a44b6107c3f633003270d410b9d19f2128a75d281a0d20e741e12bfa8434b2d97731a88678d03e3ccbdbca2478c2519cc71aa2884f0bb4875e0b867b55b208abcd86558c0b090c53b1d96c7183d86fdfe02c27ccf65182638f15917c970bfa7fab029edabed6ccc15a99654f66e1dd1715074cb68540e08ea6f4161f1ef75bcf1c831d658e244af80f0262044eef27a8ecdf3fbca6e2efbc77b1a31840f42e7f17e4319a90ee02bb4d8ebf96a4937a874bf40e7d72f42b621c6bdb4cf47e36ef2b13bdbf5ce04fb67f48b730eafde1247a430b0f6c1f423883639bd5ad00763c9f3c76e7ddb593a9e6557d6146255d11bd63d76fcdf2c91240f4d69ec3971b5abdc08fd5260244efad85b14fa91c99f79f87dc3daa8098ebddfda3bca169de322ded2ca1190323edbc2f3d3974d8d1cbf715090a7859dcdcde3f3467d3d6f0ed7876de622460e63b6f45fcb648ddb9b6fbc75eefdc79fff0d64ca53befe77733145ad0cab5c3e637e57367a5598854dd6a8cf4f69a4572ea32e56a933a15d765579044845c9ce84a70249df30c7a64acfc020abd1f14930303eaedcbc879cd0361ed81a945b8023e7030715bde50c4d7d4eb8eafd996f7c44e45d4bc12a3e86aff0ade3454d9fe30cff7681e2de5c570605d5cb1a36401c363b6f561f2e4b6bc3369c1f68dac6b53ad1b2a09bf2bb740213e3355715ff9ca5d14b0ddf659b7bcff410d434ae8cc63b85375e75744a9e0b2d5bc91b5bcbb0f423ef2144d96bce56dd726144f9d2f457a62d0fc5e50ef77c75e4b94c94d4036579497211b5bde5f5eebf713797f9d5d621845cbc530010882eef06c685489d6f1de702a018e54b7456584e58738876b024235ed051180d3be089e8b3203fbdc92410c59bc9598e916bcc78d487556451fd8082219810df1f86f14ab88ddb06380b25253df494945e361bba14a0b7909d10e096f889d78af8af64b2c5c78c3ccc636ae75eba0c1dfb55b2231dd2055d7fc8b896ed095da7d6cce9f7300ed0da8aa1c7626108522bd5ba776e0c4de763337a1d21fb2f53e2a66c15b6f7b18259d83ee2971fd88c4f2ac735b6facf613ceb6de48b7d71d4bf50609e034e73278e29ad3bb4b6cbd39340a890bdc30ff7adfccb03476a7ebc898207f2df9166ebd493b33e56a9559c39413b43d395b6f97958a1f30fc4c73b2372b70d463bf800f202e00a69c19f4c3293c057a715eae02288724c89112b5b2804b723b3a16a40bf215216030e2feff574bb7ef3fca6cdc5394ca3ecdf08a5968ec61127b388422c7b95a3df64c52bc1d22ca0e97d096a0b7780e658634d722884cf65445286777579203c8fc734916c946984f5e528b7ad5bd5a06d70114dd49865549aedf3d0963165dcc4fd7f72e5f3200d48c1c00a1d57bc6ce9b6db823ec5aaa743d7151d365012bfa272b4af19ca74279f16a34c1df667d7653e75ca2150a9ee77940ee6c6bc2095a1422e061e55b828ad5be460cf77f0a56d295f0489c391c5155970630362bfea1da73bd00909525477a10a35a3d45c2026d1b93332cf2be2d8d82207893af30b49a8b2d894bcf32d0bb47935b46acad62fea79aad91ae84d1986a084b15dd4e250db9a5d8de25c4b6eecbff4d9881a742723b584aa241e9bb72093e6b2ae7e579de1b79e5b1cfe2053e1efcf8a18ffbf3ad558da2bf8453d884be7ca4887882088f2d17237ea3d66daff9e1fd7b448a06a01d4b2adc4d7ae8704995bf024dd6aa6e4db2dfce4ecf26596a33041f3e2f6a4d223604412cc49e19a7e62cbd98c42b8a5f16d8f495c0e446ffda209798f0a68d267556eacc2844daf8b9ac2a6539f63f360f3093e16ef599cfb810261d3964c8308e4390d56401b8b256f0d31428f054e01618fff3d30ea2d5e9da7f81b7490ccf8b54a774378933c9b82a75346df64093d240f9fb28dd6c3893df1fef8cc6b0cfac9f4d06cf8526289003c0dcd4d73629d9ec7dddad018d354fe2d17483990e5c966058f60a05e8a2b94de34353509173732d723fedcfb8bcceeae893770eb5ec39be44d02deb82f4de59751dbae088a00d458cc2776ec129f8d0f75fd518369ecd25e413bea6f1e8f3b97a5b460e948bbee2366f7083ceec3a3a4b67b21791dcd77693e7f30758dac2c7aba45dad7f649484304f7509af8e61d34d29658323461cd47d5bc7894f21bb58b5dd8a7db40ac34c1e58adc3c4bff3611f721f0729824e98a8acfba2801d6b126658a0474cc37671203bd5221b4a343cb5666f62cdf64863a3ca2f3e173d08e601ea6cab1e4b6d4dff086064c4c769393c5e67dec751bfbe381aad662b6c659019220ee842ee34fa8671a5584cd693b15170d9628dde09453882b469030b063468bf3c34f3e997cf5fb1d2b85c5d3f3f733a75878332905abb982bceee540a9b913c8c1ca042b2860e1f908b7fe954019faa5c4817302703ef477459fb3c0c734f4c592356401ba961aafda14784fbe5412d2b04c2c4c2fe59ddea2758b6f933da2cc47d531b05d0082a534f3cf111eccae8803efecd05e5af3e8a94c5d10044954a3d93dd4951c22a551579711bbaf66c98d2f5c1e99f0d892e16dd2630e9c1786b03db331302696c6715983c75e6bde38d75ae0dec4b7c169722b4952863330a08117ed286c092dcb153d8d413ecdc438c005985a8c9af19b2dd62c698da0d9564307a674260c64e82c0c9be7e0e3459ac12c68747735c830394fb5e89a1bd5677ac9bac438a5132aa10fef5f522d7e00ea4a306f8b7d49e1ccc0ba4bffda8fa2cae86e7b6676befe30c8d95c2928ac53d6c7a9d80e55d1bc0b00f27b873141d882b92ded66cad747c03ba8cc51063338cf453d1689f3ce953bbe43cb5be6b8523280831d0170679642cf48a411f898d86e5a7a34e0a290f2668c54e5be575dbe71200c23c453256ab9d1886190c249a4a7158f30384c3ad30749e63c247b046e3a11fedfc3b7dc40135f393a1f25759a8806dcbee1a679d6cf3acdc97b151404c739d7fec7f3041419ac0f4ea2eceacec210a6ed337713fa0a33a0ee33eb37893acab192bf0266d1788b80cfee1cfebae95de94a15ae75d546cbbf0949f80de467f2ca92519f17d6e5a13c731492c37316d58348ab960d3550c36ae1fbfefd68e336779cdacba697e7c7d51e8345a0a677840eb0e149843e577ca9cc42c4e76fe39c10281e9355d4ed56f6d8990300ab1ca4984d37febfe41951efd41954b8440612379ca3aa0cd380ae372746a896b8aa2b7ba086245421f20a90aef53f12253ad592c278c5e7fa8b0893dbc222b1c9843d2c82596cde1875c3deec95b796e254db98f66e24cc3978d2ecc7e875ceafbe1dafcc013c1c05282161b3d672823955f04758271b42d2349b85c29bf2aff83eef269ae9529ecdbad7216547406ce64fd3fafcbf3fac962ef276b9775f146c1de865e9e3e99a841adf1ae897cd1f6385a12ed8986e8d9a86c4d65ca155cc90bd9ff9c7cf743f9fce3553720832ec22ae34548e7eba6d73991da71befe181eb385cb4ccf08c8db2156ea637ca61c5aeea9da7023c8d6fc43b8d8d6f74e8388e860f0248f29585632d71ecb1d393a4297018a180b188e1ce8bddbc1d49c1e17590337cfe93bf001c1be1e4a51e4079d28d1a481db60d696c42fd781a3ba516b62188bfaedbefa0ae9cd79ea5a03d453a112f794c7dd495d3001e36bf240105438000e91c9a476fabac803ff6e9b744ac12c5ba46bba0680f3f4a40b7c5c3fc9f42998e6033d0c40883747eab7123f793000037d2d5889f8424f3f5e2a3a19a8b3888599544405c6190ea594f2831e9500c296a7a3f1e5a7fd4c55ef0ec071905ef5f50d5f3409ec8e1311b2a1677e1617c6159fcf2a3f94d8213be39bb5a0b94423162b768dfcc89e89aa08a65fd41cd18ac93436e2e68e6e02cca3023de773745993f356f9d77545d1b5ba28b36f0e57dc42d28fb5c07e85552a8bf1cf090a341df2257b134f23d92730b3d70e58060552eec216306e2626512acecfbec0ae150933301dca0f02276565e94bbc24bda5502487a0664cf8acd01e308acc02b8317d7ac78d6b8447e67b0d5e2dbe80babc6996f27f452066b2e64079ddaf486101973f8b14f36fba346733b8e2992c8694699d1ff5e48b32eecbbfbb18954619c1913fa67d979fa570293d16c608ca105db52181b28009b12c8e47b3eba4bc9342d92203ad3aa27304bd8868e6f6baea011d6f721bed71c555b66b35e5a9abc11431ae13eac1e9eef06b00f0625c343b04f319df612e3f3cd6ef5f8760b9378748025e6519a2611e76d5cbf283176212b7c609f17dfdecd238df7cff86e48af5bcac7c64dceb41b117260b05314f08ef6a676a7c6707e5c528071722f4f74f60734228e6d376fdfd1046f91894d3430734cd4a203ef4ee76a3153ca89f0388d01984904713a7577b43b9d136a37fcf1b64316fd83cd8f02c19479320c6670d276b53d04bf518317e9110c5fd10aede4eb1aa69385de90453d76e4998630735ccb5826bbe2ec63432b62769a8b6ffa8e7301349a99c743de5ac096e9e8a9ff9fb888b20c8bf71269467eb16acc2552dc91c0e42b0d4a138425ddaf78bd8389b12896c7e3e98fc374963359c5a2c86be75f1fb5287013e9edb58a237f35e63429807a7749b9d30ca9f2a6f0e96c13b38ae6ec50ab3d236a3fed685964b8740e87091080a70d6effd16e87fc511f71ed871a6ce48d6348a9f241f023609561d7e82269d1d4f242c908c3b3fb22f4215145b5417eca6c40191c05012489c46dea5fd6b16a3284d0c61dfee5c88a42ccc4ab0bd8bf94c5f03d30809c71e688989d997cb0a2cc4678665c5cb946ee9cfdef7601dcb614be4cca0588e48ac2e8f5b7e4cfe16025e7d72a4e75e65ae18fbb046585e9e7d10815117f98b2915871438f282705021bfd1a431b7fbcf2f36384e63703580ce70f06264f98e192baf29b998dba45a429ac6a0e3529172b94a09bda04ee61ba94561bf06d2e55766b2338f118d30edcd9a844ee6b4c825b6dbbea2c077f8fc9b17d7e1dd67ec0a33e2969e1e78e00c07cdf3073d3806741a8d944abaaaac4e6eee39c6745d161bf8c258661aa20eb028e10ace2110af5e36266ad01bfc33e9da895b51f4405085e4ced5b50f2985ef1b696cb998f5a0e4ed365738376236d11b001267dd9bf978c0c3c2e895a645c4cecb8693d50f39ccd6d76983ffd023eff8b41e4d5fc7f47ce0edb309284939c71797395ba960af626f9a5b0d705cf97f874ee70faf89d66764c1d6248655e3eb138038c687860b1c43231cf9458d259f7795d3ff2d9088182d1ff401fd3765d00560a93e7295304e91fc6600c031f58a85478b6aa97603927c27ff02581f0208522ea12bd966e62c359a4d53ee84a50e9e2949634042116c6bcff0374423b48803c74f2756cdd69f945e6e9d0520fd6029b12817a6fdffff4277e1b83e57fce9291c9f461025ee5285c91487c0c068dc8e66d2997e02baaacd6e65c46d55ac0a3ffbb55e8b571cd07f5f873468deb0818f821181030d8185ea254eab3cd7e19dd4da783d437606a5105820d133f0982a88625a03eb7f601da1ec5620df92d7cac77534b388eacd808b6268131566f9b5adc40da7894a33d1c24dbbf725561d32dabf5936e5a63495ec3b69b6abecfbb844158403984007409a8ca318d25b105f6015a2e91a894c0dd3c757030bee24547a66515cd7124ffc6d03243f15bd69300e4ed92cab54958a97a5749c2e61cb8cce3ec4169e8cf68c54def9930d6c5ce5bbe5599e6723868b098d34f7b2c5933ec8b977fd5dece3d05f11530b50bce089194c592c2b85a0521a655b23588f880ff7bd4016c9d763a00ddb2c3b06613611ced4ae9f8b91ef638de22d5202fe9516b93ab0db0f95cdcbf707b75d9d4769f50f1eef3344eb1acd7c6c22f8701eef4e32f373c32e7b14efae085fc4f7b15653b1010af71c0511c0702df601928d5e2a657c7028ee9cc2428cd14546bd94fcd61db2aebd66a4f6f015b9d9a205d9b9fbf7b4f83000ba85d1e3a8113cd1098e08f7789c56922f3f78b5a1ca14924a9b94e1da2641c9dbe9ce465d95c3924b1264664da04c854747c0cd960ab3f60c3df03c0f422bdcc39276781fdf27005d5c2a7e10dd18dc61d0a4e035d22f02e0f9b8db1312254d636d23fd74692bfb4c52d7c80922f4bff6f4e8b575e6a4510c3c18f9aadb442f14271c643e874ac3f8aef091126dc8ab24c8b781007075485e58506d5c169ca561fa9059330877468b319a9a22b0f5e5d3956ef4081dcee7fd88557d54654a6309cdc1152996b43146505efe2f12ea6e3a5697f7bd1b92ef9cbe5222319913638b848f7b40460408abf3cbcc3fb40d44f719e7c8347df6fb82435893c6dedfc79ed115dd6cbdc20f905cb05d7866d6de270f41335cf2eba6971d7508e784054ca7cbf608d4e26cb1d9b0847a218ad413f833facc2c8aa841a87a9ff7051021bb1f0626d20fca0feb34d9228d358f11ff29ff77e6894644fbd62c98467e4cba8ff25d9a5dde397272071f0ca557936aa440eb9e4a90445f4c2d59fe1b99eb73124e7feb1be5e4e9039c6223f9d37b4804034e75c234813d06978666fd44f9e0d59ad07c1578fc180ed9b1e38a18fdde4042a05be8de6e1311e60b2e5fb422cd017845e1c18dddeb2cf271c4df56083fe4b325b062755cb20557a21e4f7bb9210434db8c2307ea66073048154e52122ecd9b7a484ca5ed2a7ccf9ea7d59caec2373e26ad95a735df0560bff9d37f1e47363f928063880324e820f1b5809756a3f090e428abe1f48040b49cc68318eec8a0a0aa28cb7410582a40d9f0c2ba5aacc9e22aa212c708a04823d3455a7ef23d51dcacdd53f0eb40ebc3bfccd0c31b99f94aa03f140f00b6bdeacf8dedc0a8f75e948301341ae35e3f1a2f841dd72041ff7908c16c78cf44a9a11b4019952bf1fa4d5eb17872aafc38087b47d4bad6334ce7b1c446c388b8f0df1dfa65bd2b478f3eb6143f7e31cd655693667e9985d3bd895d210e401993157c2b3ea8d51ea32fd7fb2c51599a38a0c4d6ec3de425dfc26773d2805489462c3a89e70d1393bc6f4d3621bd01be832560b39b0a150a09acc4a1610a1e9ae5d4651ac3928d2d74532c19a23e0b8e118a358f6819841e98304ca38ddd8a1a54ab20f776d155cb9db32ce54fdbe27ee32a5734dfc4be7910f947e8ec109509605b95b83eca65b9b654f662f7dc92e1f8ab67710790702610e455dde2e5b218f57b04cdb6ce673c8b249df99ae556db84c50c0334881aa1a7fd62105f3312ab5c11d995b68f16e2898e8ad2b0ced12cd72274103ebc7ca93b2e8e6597a4751d0bf33c328a260e9dd56a73fe0ce4a677b6a1a0e1ae46de418655330d10bc13c8ec88f0e4774322f5243d64a1cae9f31aa812301ac7fa6f731fd700027784eb2d2d8bdef26687b40de8587633bd70766f505324c1711ccc2dc91136069704971bf3fe915ef43c77d96733e317aa3df58794adedcbab8a328acdbaeb63e61732923f9fa9b943263b81a647ec6a9d8772047303b0b734739c815edcee57939472f99e610784469e20bd8f7d6f408ef974822cbd1f034ab88e290bb5176d92f723ba1c0e9e30f9a80e2e08491da769fec6198c3a685f9e0ec0f87ad99f5b4d95bd3101141edb9a106c2da7a9739972d61e68417e8588a39b879ac4325c114ff4031f94c7fc80e2e92e0a7832609c0b310f23dd39e7095579d1972398b2a4907a7020fb225c6629ad552c877f832d5d217749ae1b2fb6ac2e7bbd31e5d1b33b075e93c4800f9e333aa10d53523d7fb1d2cd152fd501764f33fb329be970201198f9beca8966259f03db693dc01c19b6cf1cfefcfdfcd5b6b8393357f0e2560b3fc866b2bf3ac0178c40377136bd7e5b9c05d3141d07eee3f04309766df38d2a8b7520742a08b8ebac38b8e1d1a40e675beb9845bc28d5b27a1d4e9bd3ae0c260308b41fe5fa00e3512be14043c590e18bf11dbb50ce2829094855f9ea3ee754a4436464b36840b62eb52174e772987e945311936276e8103c07ce539a2c37fae31530cf0af300d94b1fb0b25441af90541cacd676313a303f95ca019516ba9c3246bbac622b4f28e4500328cf381ebfa06904deb97ed0e9bf279cab02285b06a3829bf04cd720c0d6696061ec38c239a02c309c7ef8f23a393b0d69e03adbd10686d5993703647a22684d9949e1361967b74669eae4e207e2db5a6791f945c327096accb0639ce2a8522f9ad4d6a530daf8661e4061e1d7d942f6cfb64421dee3a4fe228f5688238c1e58272d76f5d5d1d128fa9062b3b64ab12dbefa28638b3f9f7a15df5b31f0d21915ec30b67a1e6f421bad6bda9a8567af099b8be36a56128f73e0ffbf466657b87558bc10a6d0ea48cada2ce4a1c0e35097bf102a1f345dc4e713fc1c499ce656d26d328f8e662d13cd97c13609bf399e31ce6027431c20ad11bf58a5d6aee75e700ff37f98283281ff1a49529fb05d23fd38e2634b221f8873c1b81381cdced6b5a96672b3e7b86108f648d82f99e4b34dadf8c8a2d9e86d0eb8c826db73548ad9e7e22fb5c8c01e62cc2b74796608aafc8f460670f6061d842ee13fed4e04cf9ad32bba64899a4918d6d7dc9a260a2a8d8e2f17cd5c57e13e4e4cd7f48a7a06a73d5133493d84312937033cc5d163814644c4c43d1d60704aa668aa7529b32a4a85d1c748154e9785866f5e9532b1616d1ecd8ce302098963c5d6304eb26f4720606a0482c36fa726892e532c9d6bd3079c3983eab4e3a7f2571c39d50df2c94a456db24741df6312a9aadccd634b7cd5b97c2313bf56857303d29ef68b059405244ed3d05b6b42f947cf1c947fdc10779a5839256fcb3df8c579afdd1f82391e12141b7dacea888557a1ece004ed656867c36a6c96ecc6be8e567255e61ade4e1922ea6129dc8666f7a8563a335c71014abeff7fb8a76151304910e776cd6f182343534411afc2152772de8f7cef8033d75a7035231e3a20ee7e7e45c23310197a34cafaf6984383d8f57659e00df163119170d69bced71e6031eb562cd13c83a9fe9c9f932d05b0008fe8e6175eab2c19b21885c3dfacf9b8885015248584e749d7e155c8142f7c9cc0b603b1ba29c79e5ffc09e1b0ee944cdefbc9c37a2bd39bf3b1a36af2674b4f6d9d7c8423c98d77ca2828f041e4d475be399f8ee16ba815ed2b05f1e95141204c0b1125e11f75369439f4c1229853293a9cc21e83fe466e7d378aa3ed46b852fae355abcda71bf9e36244f4ab51f6e391ebd74c560ab4d1407e59024196d47cb6cde3b672b1f984c25d478b6a23e8c7b8c6a34299130055e2d28979b8b8554d8e4106312b4122d31efbd9ed96a6ef2fe4ab90dec46ee51e736a05e40218d8f5acc43bfba565cfd35239ad5c69d7d6c9af8045578511d3fc71b45e44455ec061f19092e9d59506965d53aa88b3852d1f73a01fa114f51c64b810339e063b2d9d886d25510ba39880514083f2aa14e96343ab021a1d0f60ec163dff59530473b41a90e2f28e9c1de3865284fd1ca903b542b2083d1ccc8c793d1de65bd881b2dd8f2c506e0f01df593264651cd6770ad1f930e3da02ccbe034fbc8c89851b56784a2225a9e68ba4b9f4bca640cf9bcabe3896b1ba0af8600fe3e1b5afb081c4cb221676e061281c4003768d23298250a6222ab57d26ee08b5b46bb11dd392b2a1fb0d8f618a66fdae4a59568ec6cdbc02f66eef5d85bb3a72e778487aa888ae5716560d7fecea19c5ee5703a6e949ea9ff72d10bff4c4e421ad4193af8d1c67cdc4e15ad5632f05dd5184756b15de7adb388f6e83978ba21276bdac8d841524a4a86aac702164d56d14edfb9ca6d331ecee1eced7030551b96404601aa77cb8a2203e24f720b709fd6030e5a94e957a98ef118f92f7841123acb850914f0018ba0e78b4f62b5e0d6f0c306610eae8d81c0918e4eaa3331d0c86badf1c97fbf1125ee2933c862a4281c3608317c1eb278c6ea2b4e3de9b09babbacc74441a13125f0b8a29f3c857b0f380aa8e9f4ad2a813a0ea4b3d50faed96ffe2f506329c632092955319310a36235a0227e7062ae063528eab803e58c0d067c6557985acf812d1b6aa8c0800615952de68d5863049ad51897a8c64444d44b5116f15329fc02235a4ea384b1c2db1854aa583adb7a4a8da12ff3080681d3fbfe24490d723ec87abbd42006011b28fca50b691e70ab9d23dc0463b90991a5178f430dd2e40e6cc85abc4b475810cb4696eccc61465e944fa3ed0269fb7efa7bc415c76f9c9d681664205dcd07f4be1110950e43bb67f4b00f220ac8dc4e8596f85201b18962bc2320ed695f878e8cf0b70276faa64b16de6b04f7e91e4f40b818b8ad0c2811991682407a73757a0764caccefa473deb2d7f12e77da9efb5188a8f92070f65daabe7b7ea821cf97a210e7113b99ceacca8f786f1a92e4f4832b2d10250978d4d4e74d780180054ba0a00b848d9c09b694531f902e44ec18a9b26bf5e2ddb931878920bf4e791ebbd4583520ca359152865491d17744c2cfa1382932bbc451c8f183f80a74a94312b67ec820a5884d86d2412a3f20d347613f36d399d886962f5f6b242039f978811b80582191b1ffb4ded520f97fb0ac01e469328a351ee9086b562700c804cf09591625c3d6b005408c08ef3eda642058c523229e52262c03c399c148ea19522768742407c518dbba40e6f783b08018ac597e423064dba1c818ec5d8fc73b868402c815c1492c3bf7df709c915f715dd1c9648b93fc843131c60d833f293950bfb2af40c0e2917d1204e023b8b263b2234fdf0391837825d30236a475cbdeed5881601e12f24581c64f4d7041314a3c72723c3c0622920b4a5e36b72c8561348e213e4b802c01b11083178ad213b3532c3d167ebac0a8b5102f5649049487d408c37c0de879b734cf28b7007d277f336efae1a9c5277f73c03398c77cea8f626076bc28d6d5a2abb90ef3b4574bd878afeb74943628929c790bc3169676bdf528ba50e16316766e3abfe8538173a81dbab9dce87a19fc1dc056eb7cd801dc619ecae95d3b452cf54ee611594dca9d247df3acc691d569ad1453b2985235dd4b1cfe78b21eec471213300b5f28ec6b0a0ce2e689d1cb31333644195593124e387c3c69ff88eb204338a5e48c10a5e30f726e41b051aa50738c21e130b75c13a8ed041e3d2741e9e58bc0634bdea2699933a1786b089a3112169dc0f481569a8fbff5c516b23adc6ecf15ed729b8cbc40ad0ec8109fda2e8729a59ba35378bf5da756db41979bfc1a6691b6ae231e36fa3c68f7c7cbef332dac725520583679d6047852b17097fa92da41e2b1255a43e79f02030f2626c392798cde527eea5f6e42728ddfbdd8cf61c1aa197a286d27d78fcfdba2824c972a40992a7be85c2f3b19896e9772ef382605ea3dd424c964f710589c4de0f4e694906771ebad083bd4e2f0654cf945942dc51224dd2608f7f1495be85f22cb480de754e98a7d328b6f8f18a4e4d2ea72db9e8a609503598baedcadb681a3ba1395c80053967c8eef9a867065beec886622c3a82f4d6d73b719296ea25d32b378a8e0193259ba6afef6eb97d4111371fd97e1ee43ac0f979eb11c9a51d03d485e323a03300746965a66305299c3dc6528222ab09331bc3f8fe5324d566f76e4a942b80c94e89ccc50310b9212686f7c191aa9dc11a4e0ef8e6c1da6a7829f8d10646f308a20c07b86d6b603adc9f73e3c1acd5062ef86671d500caf0b4ac444c94337cabc86d4f1373a8e71d0c184fe062d9d2018a8a8c17b0335f3e08eab45e875f282d44b0950ca646d389fd41d10f259877bc1c7640ef6a3e84c8c56e36d422edf727a2472241da3469d621a4dd3ed9b505e210dfa3ef58e903dedb88667f2e4b493868a57098403065f20cb948a894a7afd30b34dde71a7a62e86977fe62086bb0fe0998d008bb6b0dd5b60e839c5c82835b84e08a546596d83d7bb4529a991900fd1a2482f79092d863eacc3e63ab0f98034a413637082fb9dcc59fc9007d241cbeaa9bf7089ca11b0ba4e83cc45ddc0b4a4760e0e7fe41435a336196c86ae1ffd26447149f19427de701f4a59706ce86f9456536827259749fb264b2043e74a018a9a4779e9800d92b21f5f9b01e42911b02beb8422e18f7c7772f9f90836dfd6215adf90ea7aab2e0143d57f46b25e137091dca0f2bad452b5485788a6930a01dd972413c424aba4c9ea96db4aab423e34f2c0fdc62542a64f3ed1017d078156b4ec35ed30a5cafbf840d205514927e04d4a06a1824ad6757a6030ebac251642591e291398cb6b52e19298478d355ac156f16142056f13abc6b7e58942a0f11463e387ffe34ec51d57af7717dbec41ba17b82c75ec2cb20bbc203b7229d7d0c7123f3365178eb66671b6d1593333eea0eb08e2d387823d5002d0cb7575ff85ae253a236eb12670de9c827ebfde651da5a6496dab9131877e295711515fbeb1ea8ebfdf6ea7fa5d48522c1bd6cba1d5285b4cd58706195fdc17d604c004eee77bb383f38c81b31005398fd374df3b3d3619c092bb506f5058bd0ce26566f85e43d0b6300559d18bfe0d7d6dcea1a9b6a1a8e43d35def78cb68c0505d12c4c2c0fafa2b33e8d9dbd670d7bc468a0627e824dc6a109591007263f9257ca0a95b3d00695c9115580b83da1149978c9706e28ccc7648628350520cd086c400924b44ed6758be23bd6b0555693500da5d3adcdde28e024089acce8915cb9aefffdd730e55fa24a14e1a4f5aea330a10780deb97c8e71be42fe68c817a42c09407bc10244a220784d2140816a2a0bf25ab64672a75e0c1c2f1aa30531c3f0bbcd14dc4d742f9f452bf44d93c6cefa59cc6860207305c52b7b56cb84b021f11c843793e6d9f2129bdd64cc4cce5c54ca6c289be9789bea01bf58ee4b871294891a913bcb5ceefc4d69f439a922235c11c8e9f4deaba44470bf50c7daf2a3c2202ff44130c32225c1891193153d0c7ef251a648511c7c320383ce751c896d18f8f3c8ba135065b1a07b8bc0d06911f489196b11b4b74034614176af5784bf60f765eb8ee7affb1af5001f47ed7c77fcac5f96e63cffe8cacf8ff25f0ee19a8b6f5d5be5808d9124b6fe634ea30a7c20c2560ee26df74275448b79fe5d53afc4d861694829ad3c124b2836def7c0e84306edb61dca4162cc18be2cb2cfa19018d0a1f6f19dd2308d709a705938d21ac819c0a4326bdae089850441945d2fbd63b88a533feafb474529abac6302d643fee43bbbce21ec7b2e41627a609a8205e73f011a2848316973ac285eef47597031e4ffc290b88baa032a2b994167f4c32143d50065ce41edb904a9e5145694d1d8ff8c6a4ec5260c34d242195951b27d81840b77eadc0fcd04a50570c163d8c6f2c244b192b59ea8cc42d9a5192e016a84906db9c44da68ff4ad1c4e4c8fa475cec0ee7a87f0aa198e707bdf500c2a2c01aa82a583307179519637943cf8a4b0454b64c58990ac43db0e0126a3e693c3d867deba69eab3c5aaf3fbec93b5c47fb986e63a08b8a9a0f5570b0d2de7907bf611ac1247e536e840fdb3506cf439bc959bf2a9434756e6ba7a36a00bc2184a0c38ad5f944da7e03667f3b09a94b712d29031e30d8b94d99dd9aef8fc93e8480510b0b33ce02749da610f61e1527fe132409dd831819d62f5527a7b612277e272af0944d9f324a9e318b322e12221f696cc53abe913c078efb8b800938aba8f2d4de40685c62f55023aa0bebec164c9333619b7b3eac1d72312c533a8fecfe59d2b6c58ea7ad98d757fcd22ad07045815e4aa8784b997da3d8a1cd3fb10455cc94228aa25d393bddbeb592d4f2349de508ffb910cbf623b15aa9f9585e76db5d81c4683abab3064b66cb64133b6f4ec8c849634400e5334fad1116501b06bb4f18a51e2ecb5251cf350c7ee5a9786250bb1990887457db269783a3a191ed933619d400d8d63883abb462e48e065cb23d77f16d9c5ebbb387805732a7e7fb8246a83cb801257cbf54290c1ea9d53bbf334462455e551e59e99023d8987a311c536f4e3cc1548c905af78ac9fd3f81375647a3d744a69c1736cb531b0531031e7c897520552b0c3189a00affa34a4b9bf9fc437cd25573d7265ab4c8f6a3cadb42a587b9ce0c6984220ddcc0ce3722d23e6f6c2a59270c410b47d6644dbaf22affd6689e01f87b0ccb4df2b9e13b247c0665f5bdff8641c11d6e927d225d85fcc20e6c168548c74aff69851ced0bc84109622aeb103862892ba8088fed00df19e3a6c93741af221d1aa508a9258e2decdad5690cfb6add91cd54c521e6f07c4f7af7bc1a3896281d42755c1532b8e0b516a48d9cc087704d8aa91b5684ac1b557772b36cb1ab7bdcac7079349ee9c1e732062c501cd08991df54b75cbb436ff61da29cea122aba51c8958013b26a1f3e24e2330e1ba076f11899f07b5ad6b1751e7956780ecd0493f9e99fd8570866d406b0bd399851157eadf71d295a43b7e328222d96f335ca045a68e76ba958fd2bb929a4c51623c2bd81ec412c2be58adbfbee20bbf3d88745539a814af4abda3f98ab63e4e644ae60ee58f8942646aea0bf4279306459a3e5919a1f48add3c25b8f897e02d997d5ba3bb9df40b7755026a8d710298e96ed356f7d8c0959a2c4f24f3e4336e3d624818c472800507d5dbf6ddfe99dc477a5317b87e7c11bc67d181a6b05d182fb819b6098494e6c465097335f4a29a014406682900817dd2a8dde83dc4653fbc2882574c2d5600145cb0e6ce5682c02ca0ec974cb130b17462da62fd9f602d40882b6ab5db3e017a9ad6415080fff9dd1da048904676b3506109fb63929dad7cdf900ec8bf58b458e11d96c0b824024f103a1b468471f0a33e8ba72b931385ed844e945a19c02fef009e70e2707f915d2ccd9daf4f1cb788ae9bde9e05885e1243f0872134ef70d3c729da227a4c44c5f8c01210c12266dcbfad8bbdb3a8a22cad7e5dc446f21a07caca803a8b06057968c02f7a23ce1419e21cfb5a2f707765e62e5aa073d33b09df9bbc39903bcc9848ae7374c228715e3906ba184a454f788062d13b07fc0a3c033e76c9c49fcacbea9644ebd924613501491563038a6361b0c5c921e6c163c431cd91401ab277da24f04c913479c6b07053084a47eaa89b0a0b20608a70c879196cabd2caa665e88ba3113a872bca1bd63792a5f5bd5385b0116e644c067974ef94e4da014bc3c486d25ba27ad94ab37162e7a26492f552210c7454028139c8d853e206000ccd63e62d5f26483351afce7c0466addf927428f6502a42de0ab17903e85cbb7a41c9b8461d2a2dcfa1b51e5b04e07008f3b4d0c422dc99617f258011bf2bff4c0466605e0389af60c219a55888450e9f1ee540379035fe25bea94a4f171b4cbd6b0a3ce6e5a6f8afc43fc13f8b039993927cd66c4d044c840fd3645480a96e0d028622c9d8bd3d1ce5abad5233cab3ecfe132b7fd7fbf0444a3dd6f762708ed9f3bdb714890ce6d94e704fb95b500faa083af3e078b600215e94ddf91efa900dc0b0d8902f6e9d5ca25605c314c3ce594f87b38432ee0bc3a05bcee5782e7cabf599c669f6e13a01a2020c76fdc3905c837cdc67c092f69bdc43c7fd1665b7a5610099dc1120099fc7a0551b5f5ad6817d631c1715ab069d155e0f0388c459e6daed9e667e7fab90ac84b4773fe3d38c405a78309b86534294b241c0f0467157b61207402afcab67ff0b2a2e08d45778d8621ca59c1b60114c7c5361e81fccd82d30f9bc71d014ec28a35903112e63126101b19d387c31d0890d6355a58f7976dfe5d1d019eacdaef27a4f0b22e322de21b9b9b2dc23d9354bfca1d7507f9072a213966e642c8608f172bf7c84cd63f4ca865661f0583332bb32fafd673fd4424de3e44dc853593d22be489e67ed2bfc967a2549800430bc41481513907c849fe2a91b682f2688aee9b2db08f7f82bbcd7dd0c29ff83638499e07bfbdd17b70453d5c9eb1aabe12f44b0e5838405054b0805c3c45167333d7b0888e12bda3d3391990645433b3820658a1edc01157a8649f7b7939e7cc6e3e798c0ae2181d37ae92174fe80ab0a75f37fac3fe49c11f85070d1576467a3cef49292941c616287e0bba7a79cadc4997e827193934642f8e6bf9b2b9e5623a573ede58fc9e424d9098677e059d5be3f513d4a6ec60c5965185a71203a2996e74493f2829bfb1baeca57dd4e4908dda4bfb1f0fa65462c537e1df45359f7186cc721ad4f24ffb09a7465d161f60c67f3eb7e2844c0560ffbbf7f0e8d13072339b411ef3a38a450407ff60398157cd9461bfdf64280dc5de748aabf376560609904f0facaf7e0ac7f116e1cd6bd6b41b17654bc31500af2798e922983c2240983c3019011ffd1c98031870f67c40b42544b14743d08e34d0155206c0c6ed47e60599540e2bb305b3bfc9385f77fbc9c6c123893e789372b706155a3c62e206e17eadb84523c8d75a8afff8e5ab5916aca0f7b9527d6589375da1edde9c9c7751944be1f76df839358bdccfee9911a18e5bb969a21670190c543c2c5e8a4f0613c23f0a9b98d1f4ae78ba14026a3b91f091d73fe9b0870a3c633801fb48d3f54518f4fe0daf28e4c284869b3b549c92e6feb6c6eef681ee879749c35511b8de1fefc766dc518199d97b88aee51c7279ecbfb56db5ede9c2c3f3f1962d9c4b3b73897ac74fdfa5ad88123473ad2321cac65bce3d62039a4b3d67183e9f58a9d71e285361d3b08fb5f167eef1f5e3efc0ca48f554207a3579108332031e004d4de9ac1a0a152baee0bc824070f740249876747040797a10c07562445aad2f7de71cd88b88e90763bb951fb2ad7b80e3da343f9e3e369d8431961126cabad4ddf13085c3138e6d05c419c6d0f5ecfd32479eafa39a263105f9cfd0b5b4c16aaa34b17a1a240b9bce56f26f20b2dce67e3970b9ea3b70dcdce940de5590579067f84ecb39dc89578672a3d121938575695839a3d81e68da31a385f8d598ed3d52e96130767393805985f57e6338523cbfda9025654472b35c905c1e9553ad98d1a7c87f7e70491de0794ac23b869359c8dbe08bf347e9faf3a9ac1706ec7e50cab924cf96d5a8f96909fc1289347fa42c28919a278f538fc7e00ccdf70c1541815afe4d5a38ef547dce20893b7ccbcbb5172db497481340e6853a813479be4830fe175171984ea215a744464520324290be69e3df6d1a46a40888af8fcaecd137447f4cd9355907d7029b230f97e7bc8977092693299291e995eb7bae8cd2c5cc090a574f4b3b1204b70542535eb31ca6545c54431657436977ebe3b41660bec3664f415f01d9a9dd07b0c1a33dca49e8dc56750b34293561a8e5287338bd577f6d0e2076b0783e98a1f5c8849bf2ad8e64393afbf034dfa1b9489d63ffd25c5592104d0b94fc3b04c396463d53ee8ca5c3a422273b8a3601045afba39829d81ca7f0d83be6f808d5b4b1a8d3584a658f2f4e7b1e1cf60c375357db25ca271e1f8754d2c198896f57c23164e279288d60870fb89c1725745ce7cdc05e186a3a5fab04a7275d9f866aaacead94ea251b8aa9cfefeed3e1c8ff593c440264bcd09964209516d8710287c85206e6ab5876ef4b88b7ca926a6911e680e941102875c8d2eda012de4dde06b0893ca4e1dcb55382272b98453918ce837745c8263e897a5cc4e51e020b84ef4b6592aa9f986e1b215567e96c3bda68f7e4abc19dae93bd375e2dd5bfeb79eac9ba013e99afea401ce47007219214efcbf47a963d78e766f5cc5091a2fe108509d3b762c038a0b85e7da7a69120e452281c63b0295809be659de72589e05d8229fe57e881c0987759ab5b020c148b9a3ffa58b73b31a2d2cd8ea9952516ac48a2088f296b5101d71ba0dc840d739d5591e5b93188a4b4614b622e110f0dada579275e7298ab33c1aa6fe9fd4872ad5e47ef1f9f3d380249ef64ab704031e713847b23b36f7db089487f2012e1e8d2849c94f915d140f19766846e68c25cb3e6461c2a15b7f7cf8b166fd28af586325d3a5af2b9766c444784552de527e0f3075ffe56d8124e274d4e016b43b55da24cd7c18255bbd035d66c1ce4bee24a10020534592f13a6d29fe3aa032ccf75921fb48d80923c8329f079d544be48e66d897859be8b6f577f58cf3dcf47fe0bf25f61f87feeedda72e47a314209874c1b6efa5e56b2948d532800d0e9fd8653bcfa7bf5fb418805962632892caf18369d82b79ba3267abf03b289d6d112fc1227017d64254edb4540327b89150cc41286498d310d036afd5ec096944ab05c412f16fdc3052ffd41c9ad463fb9ad985831c4daa5fef789e374e88a1696719c300cddc5b72a0bdbf9f99ec4d802b2d84c5ddb120dfc21b050344d6048558ff304a057b23aff78596b591ff96eedd96a7e9a05dc9f83caeb6f81d59af57fda8c13503fff5601238257b88bc307436a21c60a3370adc1cc3829ae0f5b7d1f5de00b55fddea093246b3c70926af4ac22d89a8fb4507928c878ced80ef6cfb5dd8be6cb4c2a637759f9ee86dd96abe980f41128ee9b5162cf7574e14cdc273b28ff809ccf503fccb6a84c1794234cd7ae7297be19ac5e8eda500bc52b4cbf50bb03502e582633614ca4a168643ec6585b60280a9e55ceff7dd495620044b2df53a68b932961c30c50f7d42c83503d47a44f260613cb62fa8e79a37c2952c9346281e5b5f7a5e28f1af51111930a1ba5e513c761c4eb05c862f5b5e3ef7740619db2d7b0068a2391edbf3be2544ea4aede206d77884afa5be873e0bdf9365200aa8048ff15e19883d6e638f764663f0b7deba92d1f006628d639f3f8e46e436a7511c1be70f20fc5feb7e79b839cd89c670c6af3a239b4a2cc66dc8645d29009daa0cb3a8297fd1172ac2336d7f2f1e8e0bba8c13e0ffe262146d5760de0c0df3660c2183be6b8371953d8632eddbd07495a94eb5c5465461538d7cc4180caaa1ca4c9f08af923386f494e513ea337eb0e9bb6e4add2291d7a2babf3340b263cce4e355c09926729c3fab33ad685a1bc60eadc6143d514fd6d043ebcd290ff880ac45d2c08cd8a66951c1d7d3e1a2c45af4f963873b0b3b5e1281a8b5087d1e2510aa214e3e09b77d44437a97af58de16b103a1802101a3b64358d469c95ee86d5f9cd8e0cc6bf0a495f5ba9d3c4ec6df9d5ed2d83faaa20a87bd2ed2e16898b8bcc942aeb3eb2f1c22d88040a24e9e166b31c6f1f9157207c78910f251de2090fe8addc340b9b975d6e8d6387503b089f8d577782c26aa41c7cbfe182468e473cbcb07926398d6afd425178674746a8ab7d23d4e2d25432d62158bb758b2506888a1aa016a6307b908ea7cc6bfd33956cb89abb50af1e352ad5c60a27e828885912930b7197139b8e0c9dd9500a528e2e46eecc544324c4d60a90af5e32255340424a3722a5a896190c80c5a872d05b1bde05f011dff2d7d98fec0e472ee1175b825b20bc44f0676068aeedfff56ae65b8c17d68fad4ada3aa72040b8a5a80e2a63d432148e3659bc9f4cb3c934532f399da5774b860caf7b77b9bf2aae119ac60e4d4981419c3626af21050439d02db700fc37699809accd146fdc5fdaf57af11b351b8a9a1f7789865c2d35e34736798d20b0218fbfe4e7cff32c111b7701a80515cef928d93a13cea28f28c87dda28aaeb6fe01db98d89ccc3308074aef3c0a12c11ca797d7bf5899ba2a9eb1b01ef75471ca6aeaa5fc3021101191ddafb0427c88322a9f2e906f744549f820f00f331d341555f62f368102d70eb7a7ab0170af5ed149b842a08382962da77d2d1908220163091277f53dcce2ffa6507e4c6cac39011f7cfdb97b498f616cb9e7445da48fcbd75d7798de74230be907e3d937441f75fb59912e4644b6329b432194d6fc0ebff384cacc5d60d3a216b00b9296a6fbfbee9e80d19c0a74bbc640977f8a417c3e159d8a97c65d1ae47abc8fb47896af3f335aa3370056f48ec910705067054581f933ce1803b5de213ea7bd5c133647ed1606d275c0946ab64992c1d5a8e4e3dd20fa630d35bf9ce9b86bb0e775f35f98fcabb10f689a8f9573d3a422a1e8dc7a4d692afa722e5f2ea40a63c9fcce56b0eed55f82bda4e7e7dd5485430a5c58bfc6b83ba8054003fa3d02190709699d5210839cbe483fa44903f8726b997ca4dfdf64b28794f7076604d1416d9cc45e6710a1d2b7167ff89d0d49e699b54c3ad97b5cd78748b1171ae4ed19460d6899b1abc4cfbca105902935da7f4568466fc67630230ce1dd38cfbe471dad875088d4d708e8d03626c97ee2613d9a4ad317894c81043324236f61886258f3ae60918a519f40781d963150fd1cd76534a79d79a6fbd716344ace677af529cf29037036ae65a1618af6fd675c7604da5c34d303c8e3bffd90fe901589713c527bff456b648660e78e513aabceeaf152d4eab442783d01e5bccbc6713acf4687d8ace095bb63bd4da902c28966926022a69f7e31935b0ea9318344bfbb822b37a58ba7078f795eb3ab6065b8850d684ebc2144c028f8c22ff54db844ed1b875b81dd51a32309e0d8a0500a8c246885884241b858bd980c268d41f8f67ca57aaee1b80d4d3a8f1f1889de6947ee110c870ce72745964ca7622182859ec7d9f52f55a6e02c1806a6914f55418ff4c6b99b76e7fd324f372ae53ca4fbf1d46607c3a6c3591e14a19417900b08e5dc8ae7f31f590db8ed487ae43738519c156b833f3954ee3cca42c0fe422312daff18ec7f54733b424af881b621148553b59b2d91bd2cd2b9ebb56eb38e1af0c73a8d0cced904f2c30c8d6c25fd608e6f478c6d3792e69e5f61da31591ab8048ce0f6ab1058eae5cb5fa170cdc669e3af5f367021ebd52f897087613a65be320d24201b53099b80704ad1431ae50c47472065d3c709ac2dd1be3d875b02aef301ee61e687ecfc37159a4000c6cda0cb2bd420c7e61e9cf433dddfb998f28a8247cfb9ecc7d560f41a3cfe8b8c235d098c2466291e3e40b81712f8c445ed3b7e08cf7928be69e6e0c064efe17d4b44d9b6431b6a3faf417caa52263deac13bcf2c4b01dd3723eee86c7e38514c484224584ef709ced055471fe0427083a2e4cd9da4e3048ee44a43d9870b5c054bcbbb84a6a78f80820bc5eb098a41a6c2990996f459b4226af46e21b9e986de4bfd2347085a2a06cb15011403568c9dc9db7854402ca7ed2b2e0c5677f1cb7c67705f6b409c95d94d8aedb7602c9d227fdf094e16d757d6a0b3c44774bc19267ef7c83e5a2893bc4c21277c3fbde63ee896ac65e89468b7d0f2bf80edc3483288c10605ecc1e26d5a6f24d4d2903ac0dd681e45a232d21c3e0ad47d462d30b56cdaafb9d76436fc967270ddecbfe8e82e7fa42de1e8ee0c01d6d988a40c57b0ae89060d80cdd17aad53f839f1a2257981cd70a6aeb92478af061acf63e3dc69d4364a8a951998a0a440c3cd0799fe6e656e61ae5c2ea27f9863c1e6920de134faa82f89b77b7c4e214b76a4e6027fb11e0e04253bae32f0b5cd3e1ac5e75261aa799324708bccc18918bf59f867a9e60b1816831be487f70362de5ef0bfd97e208fb41ddf9563c1597c131203b7493af210f14c236ac7b92278c6bdc80ea2ef41bec40fddfe5da97b2ddd24a271c78ec19082e012ccaab05eb847aefeb1dfe9265f99cb0e94624e298d98d0f485f7b4e300d9866e1045e254b4df0ee655c27133278239c34826846b117491fb556df462d13635223c540aaecb85857ec4a1f93a1462cd0533a2892565a000d88e9932bc31c0016f12f9f73ce19b158eb053ba406b481e94f5ce39ba7e153b4a15ddeda8312f903b2143eb45461e5cfc5c957905712740944884ff540548584a4da458d3d1a551f1d42f0c932a71d6d9172ba3bea996ed8d97a2f51fbf85a8568966439bb0311641b6ba775616eb63c26513b7e42005050b90c4fb376778d92a483ebba858640de328c195c7e118ed8bedb9c84db238a6293d8813481420034225e8714dbb11f5f111c78ac0293848c1323fe0641fc651c8648a2bd320261c7abdf455ca637846c75b86347923e80e8a624c97df09b657b0ebebe731d1c16118a385d38673b1b118d6fd139d3a9818f0fb89a164ef8fcec37b29c9c2c503d4b4b123fe60a4f533c3f146aa38048cf91f37cd7ecbdca2b921930b159e0be23e0f706c60201107ef28c3bce60b930334120278a8dae87bcfa22a2becdc30b1ab78074e88fc86c5040cf756dbc42b1c86372017457b0fda7e373e15e8af26355c0e95ee637848cb1ea0582c9c9a12bdba17eb803ebf8d810eb541c48aa6d62d203281c92dc2de05c2e0d1af38fdc3f77e93701f1b926e77eac45d48ea19df99aa4fcffe8f92b09d0bde60fc9f391e67012516285ccca560d302ebc69d0b21520f8c4d189e4126e726ade234a10b56db113fcc253ccb524de516f284b970a505a8e72f315598c13adcbe5a018a99e208f58a2d6acb77094bd5ecd73e4e583f14e92922663d6e5a171f199da798f4cfa146f2c7838ad50d1dc378bfc4c5b6a0acad0cb718b4c5619127fc954b5f35996cad604b3ebc6c120c9daf2176855991dfdadd05d44e437b9ff46331fa8cba9e2b2545d3a41d0118964d5180ff8c03bf660f514e9850a4f6b06bfa4dc9cd04f40c681e41e9bfe998635a27d741070fd8fd5a05cb8ffa56a0075045a30c419ad773ceb0c5f5aeeec8b7bec8fec1a5819500e7dc8dfcf59a1b4a66cc6adf18f4b5f476296616303766358eb449a3a6667ebd3fefffeda7df0ac36c817a1c1bbdaeef7f93a2fc171a1c2c9d7c83889babf813618eb7516c08fcaaebbb53dfbc7ae9c13eb062fb171afd684ee0b9138ddc7e25393ced3d65debfc7368e4919ebfd491651e03f08fa0c1ec335540a0d1547f87fbe2dfe50b4b9bb592a8678c528ef13b00c148209c6b04b046951c9bd0b43a89101d2f4fbc2d2f14206a8fc4266c1730b14db2102838b12231f6c19cae3166aa1a0086325180bc8d25728e6de24cd7474acd5861879f9543c49c31c86b5d70b638396193270e25a64d7b4ef7033a12ad5d6fa8daaa3f329473c8a6c05401b2b4e335d76b880f159bca465ceb913a5560242077a969e9c1bf91a66922515ee1329df161ae5717c1826c81a63098c8ca97245e9d37398ace8a86c4cc8bb897a27b1e1827e6cc9e2372611127c1611f124531d05b39948ce7e3799de4edd60115f6608889462b908c31f84868bc436f0be78101244647ea789af0078ed6d3b06d1353718f4d5c1df090fd5ed62935d3c92d579f66c2825c37488f5fd894ac91158b64d105de4dc60e2a8204479059a6e48e3bcaf09f699f3c97664c8414a89936629d4372adb97bac2744c72d309a722571dcb1967f20f7f166217a6024c322b7ce1971aa21209b6dbb94d7b4a08ba1a8cef61f685357c4f14061ae451a0fd658865e19a08b5c5933b9c39a0408d68ffc2a48a57dc5905c5772bf115b7d754d724298f1ed8b7256b21f1a0f08a0bb9eba2858417b99e3882d44b705777056a80ec239901d7a10602851ac1d9809ebf243afe39ddb9b2b670899c8457a0ca8047c09416874a55c611e3bcc943534298a5e7d0df01f0d1109de70283db27d3e46095ad076c42bdd485c478b6886bda096692af8c66751e54ad6541080d47acb3bba13fb46a877e72e848601b0359a253c238869c2bba3bb663409f7ac2b498c06375d362af5c7c7a42db662dfcde1e15777467eb2f3b61aa59bd497e090ad3d91b783e2aab3a402ab46fa41a863384fab8b8ee3ccbf6954a20ca9fcc47b7c2e4efa43afc7358402e11fa0f32d2eb2702c9a03098bfe73fd164502a43f791b796a8efc697ed7f1f0112fca8c18282442f1a61b2d21640429785e4034ac03dde1211e3e1477ccf5f8128cc6bf1ab078df13133690a19e610967581e1292c0811c1c5729f7660a796c37f06740f9ab3ce049ba07c7bac480e8365735d242f635cc92f301820673499ad6f2104f011ee0e73f93858a0e1f1bbb3f794c4078c33b3424c5b089ac24565fc4343c50729e65e02173d814c8c9ca3be5f8dce714677aae7ff0d3e65818602b5c208f727857c132ccffff9f58af735f97c2ff7599c7a4efa9e2de21946587220f220ef4510af49aaffa3699f25263f8463445c58fe9b6bcd40a38844f05a2cce495108e4f0659bdf324934b29f8ca5445b6e08db2512d010c1962c2fdfbcaaf231f02a40277d083a6f1f82d54bea2aae54e5c5a2b1124559035803bca4d125b64f1956e191b19fa93755b6d399027933a4d4e1c4b34b4d05cfb02d5e8eb31026fd9c2a09dd54357ab6ea6700ad3562293db0f1e00e670be0aec5c0e44015569c75a04cf49be5a33c5015890d75136d41b04d7dc080af54d661cdb4dbacec227530cf3b67824851010104cd67b3971f18857e6b1daa393a5856c247e61fa185564f9c174d31756cc753d7683025ecc4c60d9dd3346b593ad11e0d7090f215b2c9b2a50678017001de1d767c63b5d0b4da3ea162d580d1b0515b78cec21bfebe812384ec1fd52e7d06f871a0c5163969887609a97e3440281803966aba5982bccd9e5fc0e10044a70ac710fcb50d6f296fdd2bed4e72b1a71a1d19762ffea759c00126ff57561d5d62b1c3d831822998a4411b50fd2e450e792b5c484b47359490d7361b09636b732db3f0252825c8ba3ba2908a0a40825a1f440e12dea885bbd4c897012b273bdb60a6c4f78c084dd4a2497c8acc17f5807b14d0b7900a0111f94d862691e1411fa747decb92ed0ca9f6e4006f0ac6c86994def026f19cab63fd1a33f48ad683e35b12a5ff5b4cf92e9a0b6a97e58fd6d02cd8b2f995daf9aeaf5f206ad0bbf7f89b044f9cd6056b868a534b2fc2279f35c8adfb766fe2b60468def937e6fbe202d23ef0532d5891c30de3046c4cac7cdc85199df1e3c34eefe0176cca25d2a7a868b5c0b893579db0d057d6ba462b23464d8db5bf4c1e579f508f43c4a3d19adf4e8da73f2eedb8013ea504b834c30d34ef649cb9028288d79cf28a7fd2ee3d6c198e667a809bfe9c7fd29bfd23bd2983927b83f9e16e9a7ba5f6c92b1f1d0a54b5e18432ec6aaecbe60c13bc475ff2606ab801fdcbf89637d511d57bdc4b4bda74add1983077cf14e04f18ca899afea9e0e84560da14bbdf497cc344e74706f2c1a51525417302d949ac7acd3dd2e64aa5bcc06d31338c84170f103728ceb72b0863ba318003ab1e2750bb56884a0241a27fd077b4665696ba2a9479bc8abb9f86232571fc1442b06c1d6eeb9c7f5ee179c6b0f6a2f57a37604a9f407037555a284cb1f577757af55d9a6e01e385206b98a4678ea7c42d9ffed1af3f90878c0f8fe4935fb6a146282c9e0cc511e1c8a633bc28344102d3722db1a9192ccb8d2a0ea30d208a062591069c06776aa7f70ce6f87ca7665e208db069f5a557d63d817ae4fa5b3c2865a22d98d73dc7832ab708b8eee2e9de4034463591a90ca67256edd087645dd7c8495bee24c9e94b3e519bbb8178e2024c0adae5562346f67408ad44afd474fc34c89dfe3ca7fa0bfb7c2dca2b83433c2a786b9e26d6ee4103c23911bc2991ef6a39e50faebba295969db2576e5e38fe240c56b81bd64e1732a8d0dc533df05ce376260777e341d04ff7efbf5d1397c10aa095fc40c5d3269a2dde4526894a7480171f3b502c2b21d3eac663911c5082c036bd782219d4cf94fa2516635d958b7a77249f2d90d15a5cccd39cf8aa696d3a0750cb1d9ecbb57b888c532fa1e5bb5dd6c4e287b9e0ff76a07552a78bf89b66695a403a0113f99f9ea5a3e4796ec509c204b37cbf6fc03a87044f0a1c4c35977d1cb2945ee0c8d9f445afd4b4f6e4b82287aa8980bd1f085ff3099ecf013544b2eadb6f965de975ccc27ded37cb6e9ce1cfee2d0bce8c359b1b6e835577c71dd80c075bed7d3fbc0154c96d3affa5b9a433b6680bf14f74419b616fa82134d963ae0a202712181e333aac1de26fb8fc3dfe396fa984363aceaf85b0012dd43b482edf09a3aecdd4e1aa2623b0113dd3fe7e34b9307f362722f4b3348d125040516289b10ec3320a61ac65651ad6505cc955b14ec33a0a61ac65651a16a2c81c9437d8826000695f0999210ce8ae15fc45fbe489f8af0f027f5d0f5ef2a27fac4f8ffc10b71fc177b33451572c92c60a4822023e6c83d26a81c66006f9ba69082a391b95d799707c8d40d8687258efb2444341f8f74c88fa13f32c6b72441aa1468f572ec13bee18b083a968c4ee4c2cc82a761d262e38907054c5f6c497bd427f21dcf35a1b4422fd19e31971a30974fcaf2763437f14ed48cbc733fe510bb2349fad1234e4591a2390caeb9972fce218c45b011426152842433edb8dc59f54478da178de4d23ef08c43b5afbb8a645eb070348bdf3e5fdb06a5a89ed72b7bb0eaaf8638486d997689f9a1888e5a160f4303f1bd90e2856a2844cb91637206de289288cdbe9130d8b326be4d9f6aed45470a329cc54e2f267d737df04aa8fb5b40ce925fc13bb7f17adf9e7b158d078f3eecbf5f6dc197d2374e17981c46e02d97cc22be732c8a1f809cf274312002fa477fe9e9fc61b761f3ee74708da9f3844b54ae4df4f83e16963d3930cd0c5bffd40472d4454d1021a611228067b220d795c16970e81fb2c3293106d76725fe6f1213b16ad6b6b042cc4acaf278f2378cafc1d583f16856d3fa76c2292106f9341e97d12222aacab33351417aedf57d682a0c71048035968302b55f12bfaa1974b67fc6647f6a050db8bacd334e563e53694f5ca977baa9fd93a3fe2e1c56a579380d700557eac399a5afb72351c714063872d6d2af1ffb43cf074f9651cae75061a341b1426814e0470254e3053f4e4d504d948f3d4cdf1552d603bbc5c88be1776ca82bc765dbe122a28043b0dbb3d2a2e2f67de6332a06eb39e25cad5e0772f77e51353d6465ceb115f3f475157fff81ccb80195957749de3e613137146b46a7d511bde28bb48715115a08a33fb67756f9d3fd06bdb8cba288ee74160253ca87a3324ee7120fb032353e76847f8857ce06b15e926a0ed62133efcf68995c9e1022ec96a9398d8c46c82134ce90ca3fa5b920d7fbe49aba65ca3891755e0045944979c611ec7dfb947e0492bc2dfa4c20c899fbd4f58dfae914a1a46168ddf09dffd19953b11ed6731308a440bb16dc99d0251ef76de92aab886556315d2200e0db9e9a8d75d3b3050aa5b3aafb0255d791424b297ca385819fd1900ce4ab5357773facc47336d54be101d5d1f53459a921ecaeb1c54749d51fcd75c6bcf089f82acb543de5915e9269ba3bba5d1a1041c4d9058975df4e3e8a98f36be938f26dd7a56e616f8e8ab850395779299f36ebf6f1552d18f774d995d6254a54462228a5297db4fb414137e8f8f9efc0c16718611a1ca5a87f24d736711cc38cf761ef005790fb25818f2968e0a12f08cb13e34d0d02f16fe0534c5edf0f902660bbdc3820482fe5966612aa7b3faf22d0968e84ccdcb7f9a11e67a72e54945fdaa2155ff55bc655ab253bf5fa503b154211fa301570fe0252176143ae8ea775db2411859e3e604b0dd96133c655542f89de09163b012df89b283640149ae98407785fe3c575cd99133fec142ad2edf08c307aa11de683d429033d63ba419c8129eaaf5d0ba1c5047433ff783b353f4b9a16880764204b034d10c4cbb219fa026f0392f11c9ca46b343731e2cf5c078072df75ef264201194e2e73ce27c07e88395402ebdde84724d8d7c2cf232c41ecffd40245f6b989d967ebf8961fe12019b92849ef857cf4a3e49d51b3971734faaef872007a1a7824d0fbc78b233fbf7dbde04acdc764f06530581ee7a3c60771a19a8340f7cc22b92d672c7debc7b930329f443771df63abd10a84ef297048f3bdd719b059c09603cdf6f94bcba681e40c2d8e037bb4622090417dcfd03101641b3ee5f2d827e6613cd4ca99d5a13e684975440737ccb9f05cab855790b0009efeb098756e5a3b227de5393f903834e546c4833af8628e6233d3465c72e0de2bdbc4915c3cd71a67202c8354ef35df304a7a0979878cdacca0b362c8a3d8fc251cd4939d25188cd79b87924a66541e7ebf557ef5528f06809cc671f31ccb35865e53874bc472174f6795a4e2d847845f497c6dc5be8a3194c96d787c38724264a2324da443f110b9faf878f0c973c7ea9048ffb53937ccc8e4166e304b08630d63a34b1cf04f6151ddcd78cac33566e89946fb6d0abc98b6b661e962198bbb8f583eb8987ee1348ebbc1335b6061e9bb5590ca7fabb63df44d2cd3546fda47a75aea26861cdea807425e09397c7d07c5b8c307924ef1eb435618e48fc60f224a850d89b07704b07ad4b36996478caafb8a742de9be8be6dd13d3d2dfd861113b031b33e38ea686f28d7d9a310c297825fa35e69135b3b69fdb31f56f00b97412a03cf873f62fb8dc101004deae5884cddf5e8e3ca32fcab39cd57e3ab87c20c4441381b47c4deb38c49d8d5ef4354d8fe072d05caefd2e24cee9610d3e582e26f8e0f776bba790a5f33d7fecbd2c20e2ac333414b643fc0d4489ae5c0166a921e80ca65b5fff82a907560737a4b03d752dc07f481f5679cb2788c02d5e77752b73bf877509f9830dbdbcdb50c6d2a51d65a5afe1e04bd12c401a6964665dc3630a4a272c8ef2f327453e9e856f0942b21e2075b75b142bfb73a3eca8ce2a1a968fc32e56b6a69a1e09a9fa32c208768a4a196f02821fe1926b6cca100e5fe10cef312d501de8e4ae68e6fd5ad3f6432cb9b908aeacaae33f1edb882403f78cd9f95d5082a4f1ccd2a1b6cdc55dd838ce22bcd42a78a59e6743dcf4bb77078bd58893b063296f2fd7b0f41519f58ce151abc1dfba9cc005d1aa3e219aa855b65fb090e9f26848e0adac7488af24263c946ba1cfd84774ed3c8c5b7f2d2a8484f85d69323d3a12e9982dfc411b80569bc66c35c3e456984cf5d0f387013c0bca4b0878f378f468ffb4d80e573165e33d1e753044d39f1233d3481f0b6ad362c3ec5bc4cda2281cc8cf7c0b67531cf71bd59adf88dadba5ecf73a7b14f31fbde7717cd91c805dc97ed81850f87d7eda60e3ddaf0c60587a2e03529b7ccac4ec33e2f179864700cfd86d9d9e5a9e8a38de9374c057b524524a131183286865c5e0df5e7210ef57a67f0a0a041568692dac217f0251e4f6eb29a9debf95f515897f20c2ecc55102303f40491601406f07fa9932b4c0d758ce906ff53be1ad5312c9d48091000180ba3cacd31b19bbac535f91e351424f4452a89c93389a83ae33246d9c2113788a8e3a0a17007cb3a31f7d9f0eb73a23652a7b0cddad2e93ae96dab8f002568c8325551ca5e0b1acaa408b11154d125914da353f7d0e4e324eba2d08cf7cc10771de4bbf5105c144ad9fa466722b87b21e160735ed01c95a0830a49f1fdc4398d8377627dcc6120928f528a35210d235e784acbe5eb497ccc05790e629c4647041c82c1830886fb6f17a1fd6e199f82251825e831cf5d3c79818a3b068f8cdbc9647cb8936d85c8769724e189128c56a22c4a2324c83e60e3b7b15a8db7b48d8bea6780b27892e0a2f3edc8581b38b56cc14025320661a65e106cf9638e7889c1b0726225069999fd056bc57bf7157395e50ff0125805d9b245d649358a799f49f11d1dbc5a83220061302d7b8fb18edcb5eb1fd0c219d5eb003a41f7ca26d26cdf019b6d77e00d416edcbc0a26fc034ce8bf04d01e11a11ff6861fd19caa490f8a174038f82892f13a282c99e9c6d11799b798285bd8ae861b7ae5271bd18a965d59797818ef3fb55dfc6a811f400a330574adf5b3977e1e071d11532711b17b522d83c0ef8c22278b9a166f1ac8faaacf268a3aa89a3b49593f8293e59a24b0f742c1e19d6cd1c18f2abd733a50a1ae78afa916a5e28634165e6a947f3755cca01a3891b9c6c72d06b17d1e41a7e23642c911570d6cdd8b27aa6a54d1e64a9a7a30b8962992ba6bf78bfd0e2555585127e79190dd3574cb1b6f2434f54fd36cfd136c6c2d683112e41d0a21461ccc05516f0cc074a0dbe222e59150350c442458de5e9b63832d10bde8842c5e7b65b60d4ea8ddf2add36a95f29a4600a3f42d048d3776fb580b95b60943b11e1f59be28f84c3e9460145ce1279eeab8a6ac3201ce44a23c30d641fe59c7f8c90e1071fb0284a2587daef863942cb4a47ce4ca94d0a6b88d5dfff318a5224cbc5965a2a7c50e1a95fb853a1490c04514731042bb3554be70baf40bf893d5cce14495d25bb1a8628b21a195ced04034749078e6841812841be5744b21cac97b375c685a238b06e59663ee9e92e334df318de77e09a7020e8a56e408e96eb72c8d646dd3a0947f295127fb361a4f2915b3ff4f6729f7e6cbb2071a8aa4b368ac8e47465f801a5d9a70d6e130469d0d68be9559f57f193315c9d8d4cdf4d4e6e3eb9a9401751dfa84234bb3f5cdd011e24d94dd102ba9cc57eb51445a460f7d4365abc563c39745e29844262d2c6d857baab41f199b377e3cb2f6b392710064de8d8f6af2445ac462d145409629fed4e50f0c7857e657300571353377d8f2da19e9ced55c56976cf276b84903d371c3fece3b18839caa06daa270b13aaa558360e3f4339988636a03fe104c8ce186d39dabb8cc00217fdc8faa9244f3602a69f907fe9c0fa5a38a23723141a547dd1578ba0f3866bd2e49532c5bce6c51270aa695d7783ea0e6f57b890f8ee03c42f813111c9948c22c4ab8306b11b3263aecc9ea0d8f28e27829843befe8a013c7756c4bd638e50f8c6c0e0043c43bcf275ddb0f5c2ad4821590e3ffee35d480bcd487f0d9ca8ae9299217a9adb8cdea7258e2d2cd669f70863ede10b5a1372d2ecac0472b272e5ed2dc6750787a667f285631616bd0f98716d6e6133cb24c17e204b8467f3bcc6306c62aae0a0c052136c556cc576881fbb090b13509e5da47a6feb038a59fdade7b5b5824634ae1f7ae6c8bb92a32f0eee796acab40b0c577628e344949fc9291c6703e9132c3f654805dfd82efd1c56e9bf2c514a17a3788e40fc686c04900851288779ce592c975ea14de401b985bf7ffe0afc35fd3991784610287045e4f0332c4be04476a32cf00d5521190ce757b7111e59fcb83bf99caff67a567f34e6a4c23f5ac36bf1da6ad7db596dbf16ff2b6079b03b93255c6a5dabb3fd4eb23539000ef0acd5a8b1ca15418453066c2cf821c111c2f28aa1d5895f8f139d57f692ecd2e2b130a5d9bea6171022a5fa5b4cb0affefe7b43d5fbc0e123fc6673d9930fd01c3fb62cc8f17d29c30d69b68b6aa6b5f4dbed458b9875c7b8d5440f4cbf7700d23e65e00f075a0aee1eba7510ad7a13d7825f06c0c27634ddc12e30cac76032c9d498af48098a597689e78499f4d8fb0aff16d1fb686a4dc0c8c7df0c52d0a77800460beabb03ff610cd3d90cd84fe4bd87babc028097416483d1cec1af16fb9bda4a2c97232e68c39abee318655422f44000e5a73c2f2fdb7009f8fbebb624ddff3a6f666f64dccbde8e8c54ecc947bd969a526cc4f896b9fbf9fd6469256d3107baa4410e9ded4681828412b75aae2cd628c14104fb571235f321e86463037ec14675c7aa2d766d8fbcdde75a3d7554125ed02ecac694359814a06445f6f67334637d5e889eebea189bb7e3c10cae99c75bf6b6903c6f050a8490a951b1464a94f238745fc5ee263a052497fd318caf9f8ae73b2e5d55652d7b0ecd30177f3fdd5498eee5b80efa5cf5db94eef7db3e606f306cc5edb57071ebc53032a723a7c5b3052ba4a07aa56446b8c6caad1a362781e5195f30a2da9426b744611f26a5c06e21d5fa243ad6887e72821901ea132598100480c5208612541e8f20cd4d63d716bad5cea711e6f4caa95db4f02351244f6267befbda59452ca9464000779072e085f33245e4665f6583d7e167b242274d230f99b7fe44636527a04a3f6eb2f18c5479e29a594c628297ddb974657567123398ab4733fd23afca9f797893dc7a1deb191bf4561ff9bd34fc96c14f51aa5292ce38fcab81d981667ae34577777773f9229f7f37a177bd59da19c4f95ab9070de9dbc7e436cc546fedc5b24ad636e43b6af3b668b8d3057bd6d2449ea633fed4feeb723ec29c771f8db668ee2d74990b48ece1e93dc0e8c7a7577f74a7123699fe9aa0b618fa7b8c4df54383aded569d330ccadc4ce6a35df9a5fe999a8c52cd31c4bee1edd90d59095771e1291483d4b8c31c6afbed4da4c752c99ba7717977ad535b6d6e3371abf126bf091772b542ac6e856bac6b1e4da5566c67e560d5ec59ad762376b156bb05fd1344dd330ec57dc4a7ca7b9dccfdcea8e63f31b5e45211c8c61187b54d84361e969ab6cff73654dc3df104dd3fc0a8e95a6619ae6575c2ebfb2cada7f435655ab5d0f98a5c3b2f815bf8225b75f61a2f19926349507c9afbfbd56af9735f8056ada36e7947fe4b96786b9532af10b111b65f3fba775f84b49ff74c218868f3c531c7fdae676440cbf2f8d18894874c5efc83d66aed6d1eff8eb7e66d8c8eb17f1e7d91f28cf0e577fec3f0cffb4cffc9ef8067bfb32ba5a47fc897305cadfe9edd38ce3513f62eca77decffb48ef8f284abe4d1357edd61359fd4fdc6f8442e9fbbda67d73e51ec0bf3945f377a616e2e6ef5e9f6f165def00d7dfb526a3ff5b1b776ce4c2fa499c6187fe29ff691485c7360ea37f55bc95a0773b44f953dfbede16b11c3b0788d3a8b6131a6be5a5b511dbf6b198b3fcfddcb40c766fdf8ddcf7f0ff232242295d67e65f1b5ee2c6b2c35a232fb5ff7b5cadab6fed7e1a1ea38baa210b45de37963c537dd674f53f0d1fff5bb4a4d3d75af35db66fd9914566d15a75eab75067f2e554a8b5d9c7376189d145561a609b234f8bb29bdb66f42c6f0fceeb1770de56fc8967dc39af927b16fce47d73f1fc337f67b8921db96bb3f7ddb7f3267fd461dd6efeaf03764cbd89fb8adb387b552194f2df54b7b7982dff21b4f9bd5300cc38cb81a0cd33416565343a33de7abaf594526cec2df9163df34d29efb298126ae1489c884ae1995f247ffc88db02f92a7f6c93cdfd53afc676c82d11cf94feba8da7f3132c9f4b9d770fb17b1945262b11b7b22bf10c214fa1dcffb61f803ca8d6fb8af4fe7fc39e737c6e6c77afa5f6482f54ffbd4550a35310e0b279337d246b256d8a7a64ded4eedce894d577c4abfe6664f73eb1345ef9f52c69fe48cdfa495f2312967482943ca0edb2ca6699ab661a3f99ce6db4feba09fbf233abf62afd5c72690a6691afeb49ff6c11e2863f8464a29b1a727edbfa3f901491eda1b7138d3b8979ce4240794a9fc9fd6a1619f7ded49e7c4aeccb6e29ff6a153b2bca60652f29659ef59c26412327cd96025db7024b7327cd5c0945f3634c95ade3e4219ffb580864cf0a0ec67f4c5deefd73c8c42349ce34f66ffedfb7e5e6e8a44a488258a6da47d91ecbdda7ea376b551a3d3b3de3d6ba726eed87ef4bfa31aa771b7d8e8f4da7b6f401e0483ba983f8a3fe9158948914cbfb1f71743cefe4928f9ab7fe446db17c97e726afd3fe9247f5ffbaa7e8d3fd924d73ff24cbbbf718d33ce384f7d3ac1cd2f0df41434fa8dfd5afb44aad7348a3f1ffed49f7e53a1df1ba5f6c4f1603dc546f4b7e758330f63ea6144d1af6fbdfd6d64e08de3e16fd43fb6ec1f64e2600fdbb0b0d3b75996ac9d2eccf474baf474e906dbe7eb2ab91ffb3ae3e595f17debaf6ef644d131dc54fee763a2d8339fc62aa6f0e779deec3aab59ecedb66d9b868de89fb6255a477da28c653ed51336a25fff86bfcef404b76dfbe67c9cec532bd9e21bec37a1d56a69c97efded4a99cdbcfd7734f3e9b9ec675c187bb49771358ec7f64627bce5ed83c4cf9ef0c7e1afade4fa1bfe288094ed6b9f652fb91d59439a310b64fa5d2053fa446e3b43ce87962dee25daa7d2b9f21509b4008c91e1c7315ee4e67eacd015c9cff2d71628b2b167276b5def2047ee87cd10c7fc7586f802ad0c9fc6184eb2d675d628c703cb36866c610ee77cd86cdb87f331f357645298a37204f06e0204a8193e013c436c6dd775b5eb30da755d8761276e6e9826a36718d61d8661180cc17191468a1e33a0000d46a1291350408f29ba3e6c6e3fc0ece69c73ce39e79c73ce39e7e41ee0f94719b0642ff21c71d0fab5970c49badb9d07f87d3bab5630c74b06256f95e14b062a596ea07900b764986508b66deff7c676f3dfd2c5ddddbd33841042482b95124208a194104229a1dc0e3326cb0a67a5f25430af7eca155768d102c51858a690ea5e6bad4116bb7b0cc257992b7c22278af56ef421fe62e0aecc436e47f7dc853f3c4cf191e70ed53de47ec8a030f4a3d5f6abd5563f5eed4f2d6881275f7bff5aab6723d66bd86b9d3d72eeb73f6ddb693b757fea3abb6d30049db8d36f0f33ca23e2053590e8e14bff50454e94a8334664528309d7921320d9828b152e5098e0e982841aa80089162801218a23567a851facb0019620d840c494a211e49c9cd33926804109131e9eecc007537060099d1a1e0b93314cc002315e5188a00bcf0d1a50f2620c125ca8eca08a2b4b4f39a7d4c19319be74a022cb15c86f21be20811658fc90832c3cc810bc7450c14b0729aa78e900e5b5648a9a246566814353122df91b322da5d6bd4876a9a3c9f4f911c3f6a12f7530c9f2752cf196fca9a38758db9768a2947ef631adc2b1f815187ca114d2b6d65aa45c1d22e5798f6296b891dcbeed41b0068dc13728c8b7cf4322e5491f29c723f7278a126976c3d83e615601861a9978ab5698a9639bc42658f892b81fd7ac7dde2fbd3fede327bcb74c8870cb23e59f2782a72c92e9a9079e3fedae4ac44dd5c955ec71adb1caf3e2e64ddc6f979b8db7ec8403cf0a698a1ccc7d613e6de119d59f9b100fd23efe101782b2ce7ec37da48f6c190a12b7c082c6420b413c8876905353bf261b7f48a71c7c43790bafb3094427f430800af9ebfcfdb44fe3f9af1a9cc4a1570d4c727c135ca88b5e338409c22f1ac4e4581421f7d33e53c3b07de48f995f8863c6ac3018d9503c7175d225db0f1ad420918edad3db2ff34ff887b59652fb270b6d5b4a2d957336124ae7d339c5c82e621807d399e2a63c717f393d4629fefa0b973df4e2c7d473ef71dccb5c087b381a3deee56778c896b30d66b27e9761232c7b78faf9dd77484e9f7d7de750c8aae30fe984394ca966294e9edfcaf3ed1055b64f9fbe106d0454d9883ef65aac29998f147f2a9928de13b9e410907a54eacadccd7b6895b95eecf16af6f5d2fba9f296b3ecbfeffd3ec71d1e8eb7da3f22e1dc330111faf44429c5308a6133eb362da354db3a6f6a928d8099f552d9441425b7e3f4d93dd55ab12a9bbc49ae14c3a8dd60a0996218a2d050863f8be1cfd37267d9ed332dde705bcf3eea7a97e66a2c44219aa7387a280c21456108a98771473ac3906262171ea6f3c46032c5def479139e94e651ef32ff59d4b7a2497d2734f3f5e7d35c087b2656dd1494c127fcad34fc1d4d975eb1d156dd31a54f31e750a898b64f863f248cb60fc54d79d2c63616a0f5f2915e0c3581f6e8a2942a712ec3826e26204c4098803001e9907a76cbedebf60332f5927a670b1548dd6e07a456a6ae2d000952bb819c309006d23ef2a3a0fe74a3a0befebc183632a5e21abe483a09b5b6d0450b615a00d342530b5f5a08e2adf9364cf93bbdc41f64aaf4a3bf3d84ae2ce3e5b2dfeee7c2478e8f9cbecc111b6518fbed3ffbdb091f0101d23a2036da1efb06d23e46946220ed03a46a1976eda4d7cb304bbdabf21e26204c40988030016102b23949a57a95ba1f526ab21e359f857fa0ae45bdeba77530f120d4dbd5b3ee0a85423149e1af334a5a1b99a0ae4dcd0f6a81afcf841c04680651d178ffd33a6676ce87f65188a866f5daa9c933b23fdd8517e241918903861c79d007995dfdfeed768658462f478582608cc24b1e0ea2058942d27be8c72d530a993c6fdda9bd95f7f4776c79715e5ce7fd9032a5f3ca58d39c15515eefe6dcb64d9e9e033a9dbe701cf7a5fbd3ed388e03da38206edbba5a6b965a5fb52ed58a6bc5b56220ee3fa05c3fee2bfe80da7efd533d7d6d7ce416b32f73b7e38fc3d8868db8effe90386c646dd72ab3df7c685a5b0c7ba2a86518ad150371ad29791027ef6c8e8bcdede0baa7df75f84798a530995e3aff872876d7fba161a60f2d47adce97f285ce1c016cffbc19b69d36b1645686af244a598bdbe422b7442d9e254b3ce7f6f4a5f712cf8a7d57ebc38fdc47a88d00848f1bae3c8ceacb6cb111fcec67d3c3dd7f8ebb3cffa77570d8c83e86023673e47ecc2c9b7e76b1f9dcadf32b82edcfec5accc21c4d04d39ff6911f12443af55625035c72eb90e10bc952d63af9410e7fb2b94f719f4a719f5232fae8733495e22a873d576d0acb6866ddb8e7bc4f755daaeb524f14535ceabd6b747a983b85fa542af51e875f8828ef4fa74fcda0fe53711f509e3592b592a9a95dea6b244bae640df73292864e4cc6d699cefbd37faa94f7ddf7cba03cee7f5a47f6d33e1c96d88dbfc5744a9ab64b922cc936327c65e04bd63a69f4d5975f6456cffb39b7cdabf69339f529f4cf4ffb649f456fdbbc6df39e287a99f7dc35d2bcd3b6bde771de73d91f79e6f00b316f5fe4bd27f23ffd87face546d6754de3bcd8c2afb2ed5b50c3ef28cc29db98ec3dbc7d7ee4ffb6498c55f469ae9aa820863c42afda211cc5f1340d61abbc6aeb16becf8f21ad5ac5db1896c89d11b9af24f86af1baa20a1822151ba410c86cd797af73ffd773425c743fe5cb16e1e487563c34aad6864666a6aada94f33533f255365bea65e9592a9155567ce380d7f4874e5d138f6048caff5fd1a7bde6cdb77b50e8b8d5e2032e1277386f1912a79840c5f47926e8072248cac45cefe11309927c3d79157d67ca3dc0efbcd6d2a6fc167d5d7fee31efb8f423698a8067f2bfb10a21e4215cd136115fee02bdb973101f5f6372cf3a90bbd2583c2d83d3f9a1ddeec0840f02a3e9ab9fe77c21f1087a5e4787c48461277cc30f6f3d33a2c366a14b42cf14ffbc419af5b50cee4cb63ef51a11978b9efcb456bed91ccda18630c42dec3af977c3a389f2ac3cdf1043a7f9fbba6cd31e0f41b2e72a3802edabe8b367c642b3afd11596464fb1a6c514311ea73b78b9c5b41169d700d337445db7b517d9a3db6610845a88f512dfb274ae0447bf643432e57abf5bf5a795ec49e561f70295b2db3747ee6b506d9960f6a39c185a02de28207a62894bcd8e083ccd2001aa658e185164862f08494e23505c90cb412db25bc6f2ee17d43b209e6c8b2099630233b0d39bec3123c675bc4d090d812800ee688734e2957eeb2cb38d83a5802cc49e0906394388abf023a7f229f5434eb416f2d6c3fd2ed13f67014f0bae117788567d004ee214e0eac76c39f0d82cdb0fb5076b82484055e8f9a254b8e04e458390ae408ade699119b2557bb0c3cda6889d20372f6605256135a5938542b028bad94c0321b27320d0c6dab62e3585870271a4e5d944e05d701885cb0f288babd91585f781f5c9a4b3c141528192864562916d3504ab5faa29a79cdd00c4153b3d252b332c18a8504cb8675c5e666c5831b1c96161c195cc898c10263068d550868407fd60c7fa5b8988504d758395123c7064b8e4e0c74765836ecf03ce169ad9a68f5b0c4f4d888c2c60d1fdcc061b305c764fa61c41161aea8d2c55aab9484abe342479616de40072327194070c972b59a93e6490f4a76b8410d9860a268ca28f29c73ce3981b08293ad14ca82a423983cdf44a90f8ba8c7861416d1b734e8287fde1bffce2e9ff03ee20f2eb9b82091345f1be2ad39391e78d1d69cc42ca8e077050ec0007be6fb0083a4123c207922cf31794af15627d14d2e0085fa482f9921cfbf4678f35bd36e03b2fcf7ff6cde1cb3f4e51d72e97ce9d7a50f1a33843141a61f25fd48df050fa2df75851ede223a610b2f4814d2f04d3f2cb22fa578f3edf562cf9caf8391ec78be144fe5034f852884f5f020d7508c51de6c01424a94ae216f4d1f4f038ce7d2fcb6bc35dd4917799eb228bd3af0254fa62a56b2915e020203530bf3ca0107f96b2d7976077d2fc483280e4a79be033c489e20cf9902c541293b6ed100e36d5478503e529194a5f914f3e26dc9d8d76b5f830d6194b008bbaea16f95935dde9ab8157be8ab80be90268f85165ca86a39a8df3b90832a45d293d21c0eefa12d6fb95ade124243e96b318972e48bea277101540f5a220496006951cd145e37a1b084a04c63d18a8a144abff0e203798b3e91e3d8e1f216fd19607813904de9e370a14ed2caf4e1116fd12cbc0f3609a11fa9470503437bbdace41d97bb90d0c111de96e1eb09163e3cf1b283032fcbf0f56405b88b47337c3dc9f264c9c9164dc218dd31ebeef64a59e98cd29d4ee931c6487dba74f7e8eede399dd2638c91fa74e93b3c42f749fdd40126295dce39699cf261162f74d60f6e01c08542de2a1259fbb2dab6139b449d85992d69f068bf958d934208697cef1b8a31ca9edd6dc05af8f32184d0f34d031265c4d3daa39c544e38e18493db312bb49b967d724a4a2d921925a5945229069594d229a9189487298bf80146fdce497998b4881f7c404649219c1fe45bae4c85c41e1f8225447109696a9292723bb4a7580c92dcc3a5ff5239d31ce07177157bdcbb2ef4884247ee80d601813692fd317f2398c3bfc22f93ce6921e6b2c3aca098ec2dd8244408cce17f875c17221642399bd549616760bc86dd60a49adc40c687293606009102252eace032050af9ca5f3711227f0d25b7942f2aad3f90b5971e440254c1cb872e25a85ad0440c0cb394bd345132bb1e2c75892f884aa86c4088d70692569d9414266b5db9a0f261531b9fc8e5f7941e45f710467e3fc9f25f7e4b7251d224cb9aa594527641340f51e4f9b3872636c4f03ecf05c4827f69608c2c5f90e58b891559f250c46a098b75b94bcb9476cc92dae5062946139dc10d51da3098620fd40289152e9214608c2662242980184b564e5caf1fbc70bdaad349e9dcb9828398fc793c5194c820032548787c7829c141a7094fcbf0a584098f16de29c39712204ef821cb8b0361a4327ce95025cb0c5f1c108381ce7e98a5fcc1304b19cbd0957df6028fce3f2ad019b68cf034e949fb9e07c9cf82704b7e9665d9db771179f56dfddabd3d8c42f1a390ff268307d35a8b61f8a607ccd8f38019c3fd1bfeec57a091727d5b6d8533053d05143a01f618210596e0d9eb7f22e4af95600922f4155864e7f282eced44f666227b83208bc98e7dad37061a438d160f668b894c59c13e7dfa935d805ff20b714c1879882acf8fc09c384a0c9ec545f6e9fb8f10867d0f7e29fa17f6747e5683a73df6da018b0a46340c0f606f56a88f7dbd8978058b6f26c537b3be02e8dbf9b4be7d5bf1cdc42ad8aff8874c5c819e4ab1470a145e37f196ff6c5909d34afe327af03e2f4b0f1a4cb6a8a0c91bdf050f3af2a0afa544dc4a3798f0887c4bfda20db15042afa0b4db2cb15ee6459b2bb30b2a250acd6fc51ed6473624873c958d1243de7ffc9637e429c950a5c95aa25979f6f07cfc500a9e0ec11c4ade8a50bc356688baa852ffa6414ac5033b2441bf5862e262b000777fffee202a4f95921d6d46008294726a52ca183f4609216c6c219d4574774f8f518c172c947c195da600b6518e727a8c16e572b99ab22896e16bf489cb5d9489103b503c2cc3d70e3ee8fce0c50c5f3bf4c0138537337ceda083159e67f8da2187fcbdc7e4b5c30cdb172f1d6a90b72aa20d746090058a2e3a5064a0cb10456ce10549d31355602a7212489ec04009a490820be9440e13294e40c50c5a341581e588a51a493f98a0a0091d40414313529860a786e6d265270b2da4ccf0626afa0114412841154ce078811740e48004104b32d044971a4d74c9d9014745d3182c3660c30e58482c3b4c475879420413592cd1822f240974c04030a80073240460b060ea81bcb243a50b0f0c62120134e5e313424aa652299aba94a62ecd91639b5393524afa92be94db4ba94929e7a6650b976ab14ca34b9a49132716cb345a37ed76ce305be9fc21c729c7898b932dd95d7f13020f3e95b8c16b45cae9df1768e8eb2c728c22fb7fad85eb3f3bc27f9e08ff0dfd402d900bf402af804cf00b6c82606018d8051403c3e8a436d2473a492f6926dda49db4524349a2a97495b6b294a5b5f496e6d25efa8a66ea2f40ffad48f8ef83fe6b0909fde78af87bf99acf1df2960c16783effb978f80cc52f06d77f459446f8af881411fe2bb2e5e7bf225ebe224c397e912f391669faaf08981c8b84c9f18b7491632c12868d886404e9488e484972fc9096e488c42447a426acff909cd8fc87a4942312941c3f242932fe434a62c67f48547afe43aad2fa0fc90acf7f485876fe23ca27e0f8af87ce7f06b8f19f0adf0a39b290630b3906c9d101ff9f90fbdf10fc9f0b39ff1de508438eff110122814a8e4142df72368510c21dd24dd9070fddf8804c500440def2176249092e194c77741440490a8194c8a5d039460fe13d2e292141856ef2464a1556f0421304951708b618994a20d841def20408f96b231f941d391faec9adef962b9782969467baef9b65c8a560e3fb87671b4fe4944b8187c7661a6feb43b8f5fbd69cfabed453dc770a21c80cb9147a478f1819d3c0169a0ca3e8410ace6a95fd4f681d44ed0397fc73a0d04999f55cde92f2cccfab65c8a1109724e5eee7cdb28d9f17cb904b81e7ebcf145a35430e055f4a4aa2197228c0a5a4a4ccfd44a197929264cc3c4fe4ad27f21ed7b5d743c9d8b8d05b23dc99ebad9a1b7f9594e3b36c6e706430e97192e3b778a0e4f83b52727c1c49e4f83774aae4f8d852fc8d86961cff6ffccb25c7c7177a4b840b63cfcfad71e3e7dc2b802e0937e80a7d459ae42ffe10a2d6e1533e90dddf7555883dfe235c16628fbf08fe3fb78fc41eee3693db4d5ae93614d46d29b793e8d455f9cfdcc64273bbe6f6abb368d972739b0bce6d2f7d85b7fc67dc66bafde57613cfceed30b7c578cb5fc7ffc6f52437e247ae27f1254caedfeb4eae2b5d87e22d29def2af713d0998c31fe806893dfe41d785d8e34fc285b147e8dab89e7b6ee7d6edcc733bef5ca87361ceb99e6b5c98f185f9661a17e61917661917669c0bf34d665d985730d3c0ac825906664fe8c2a2a00b8b48b8b008e8c2a2112e2cda3a4bce2efc92b14bf3cff5a5a4a422112e44c1120d962415b92e2cb2d8331686f7f9732abe1423ade27d9fbd39d7cf1bc5f52e0f722117f62adee3ef8a42b6c8a978cb1fbbc27b2ad93fc8842304bf3ee0e81b6e23f6c8d6e4a13b55c7e6603532acc518ad07c1d8cfd1f0209cd1c9f07050373629966a355343435333b352b152363237289c4ec6c9fa402346ebc36fafdd0c63356c4ed5a13b9347b6628fdb807d03c20c6be45042f3f6e8b227ad33d3360e7542751e4a66eb946a86a666c5b2b9d9e69c346850f917d7c8d1d9e169f54c1c38bc36b50c8d23de88d2862422259c3d73ea5079aaddb1980e96e5645a0d6dc31b77b9d34b22f2d4d1f05cf03a6fc69c9e0b9e87928192c19149ddcca9c30c6b866645535353b3a259b16658362a9b9bd40d8e0c8e0c948c19de0c1a5decd21dbbe00dd7d06ae464393a98ce8edde1a93c2ddaea993d36a48d1bf1060e9744248e1cdddd396e96d0a84be9796249a471c41b51da98179012ce1e9fb4452b4fb53b16d3c1b29c4caba16d78e32e77dae605e4a9a3819280d779335012f03c940c940c8e4cea260555369eff6aa59a61cdd0ac686a6a6a56342bd60ccb46657393bac191c191819231c39b41a3a3f12795f797db5c70f1866b683572b21c1d4c67c7eef0549e166df5cc1e1bd2c68d780387e38039268e1c38729c6862a0cdd8c0830fab27874090b492dd44963d48c992264b29a59c39f2b779a1b2e50362bc560b3c2011822b43f85025494ea1c48993b7fa9c98555bfe703e1c03c81fd014a62c954c1993e5afba64f92f5f1ec0e2034c642987320d07a678e0c75671d1a52940e480802ba838513d0e56bdd2b9a284a525839793e14bc9cb0d4a61d42008254b411481c1f076327c0501c513416c9183821d7868f06e862f21ae2c11220633783c19be86986167cb10472831c4143118e2064ebc9a0c5f509294a06c0067e1b5327c41a1522308285e746c80e28356132272d0001149ec78e1d964f822e2045d1041831c1a1001c616de8c1c6a60c0534da9a1030fe5840e115e4f86af22a8d8c9c1cb91e1ab083076c6f064a404e1c95cc13df06eb47089a2c54e0abc1919bea28ce151f2643c31e2e15cd1c922a50a9d2c3c55862f296072c0f0689272e07919be8ce88187031e2ac3971145ec78f15819be8c1801cf0f3c9c0c5f466cd1e1814723c397116054ab9f0c5f4738c1aea8c98190dcdddd2d642b849ebb15d0bddb8a0e051efcd5a6c48338b963c4f16e194018218410c2ee399d5a295b6e3188992f3cf8fe3047bb1b4529ad9df9c8abb036a86594f2ca0c2194d2b16e2fe295468e5994c78248b13d8aae638430b69451e29b037891631919906291764fe2af84101231e1c19736c6e8b7238c8ee445da3d498325c06f28b1853d78fdfe10df440c33cd443e4626296b1dcd101d678c32495226c989a82293783edfdd6712cc11a3cb0886166384314a196574022e45b7abff2c5b520e4139806fd572ed800f9f5ef1b5a496182184391287945256d9524a5831bcd69382524a298594522a31cc33c72e7abe95524a98adcc73cef992c865f4c05c01c793ce4f71c81968d083bef8f0e984d67a7477d742caf71e793eec98f064a5154f40e689870c39d19c7c971f8544212fca11e2020cb193fa480ca007a8a46c19ea6aead094000000411000c3150000280c0a068422b1581aa6a12ec9071480117b9642705a94c9634994832008620c218000020c20040005000435443a41001cfac4479965fda83821f47df75a5473f64e807bb27449d138657a8de29f40df6acc60f28375151874ecb91070c9e995ab18f5dbffaa64a2e2e0270c501a0ac270c90dbf5ef7823ab75e62e9380180a59b95820847d350107fa91912eedd5889c004d16f36c79953b9dfd0b2848861423d6e4d18e51ec1e9f0b7de91e7c403587492f8056b4f905b5f1bc6be909e50d3c237849eb0bcd217df3678afe9046fef86ef57d818b0ac296ba36ff20d128b1fcbbb9da902845a78e494e361566666827a8848644637b6665b6f9289b018ba9b3c46db7d7b92bf629e9fac54523ed21f3135b862521bc42587ebbadabd47d9a3928f81ddc9dde3cc2c0847ea1b5edf4ca79b126c631b1bc4052da2c50f396a4a1714ae744710a2f99867728d990dcbf03a32f63006edc49c35cc8360fd295ecdcb4bf1214722e96d8641773d19e1f1ee6ed31427f07103e4df87dd8ce79474157d814c767bd751a1f740a7e2e290665647477703e5693fc7c740fd09962211256b413a540717297f6b82a4a132019ac5d7c63d04d14c3275439dc9874bd31aa048f9c5f8819b1a65ac98029a199f5bfbc5c7ce546d3fcfeac6544fb0d6069829d2c492768dac0e530197e7d2e474e03226d643319982f5a5ce0fefb9762c642578003a3c070ae782a50bbce99eb842d31d97a5ffe337b81e6081d40f493556b5bf61ffe1e91738256f73375eb342d03413686d45cd8db7f3342ea8424ea38db7fadcd74f10366969913cfa64c623705201c865955e87921498be18990531b01b88113f908ccb431465191647c892e4014a6156c7e66e7e349fb2554dce167e9bacd4da56d0dd1d8bfe1b00059a2d5e95bfb1e381969fce06f97e2aacdd5ac1aff55c54b4b0cee691fe0269acd4efd2dde1d29ecf7651cf3619a91eae1d3e75797cdf5c5d100218b2e9de4f66431edf2ce39fb7ceac4642e1579bc307b7e010e4cd292843994356f984905d3e26820f9b02658dd946214ad07adc125faaff4751391a2c5825315608f52853d6451e45a3972f5e3484d7a3733cc7a1d1e06c8cc4ca2cb5dbc796f04651d681bf441e14f7c7288cde98de198f3fb6da671b551bc8fdc5eb9557cddca7e8dd7561629babebac1f6a05e1d133a53d63a142559055b51e5dc8b800f5a2d819c389e7d0ceb05ec037b9e4ad1ed52841a46c1f97bbaf59506dec7d9e07b20d0bba004818df07bd33043e8deeffd59c9e3dd95718670cefcaa37a4061c24c7350ede102911bac709c335c687c37a2318a511c75d90f89958217095d49580707302e84d14f6c9a386373bc3023d1b3df5dd2c3aa4f09c17bf4b004caa8538d490bb772f3fe4924f110d0070444834a98a126d05a2d956b426ecbe067d818187bd22ab5f7f62623d7e09fc56fbfba2bb2a68ae019a01f7aa76776b2f5550cf5bfc3a10fda7fefb8ed313757eadd08830391e3d2f6787a5e47b7479a385aa2a2dfd5e637b5b68ffa0ded3b9381bfe2dd3e8e500a6c97e8233a5bf5dadeaf0ee0bf8fd2e2c7ae1d9a64f7251edda88a57ebd7b7c0501448e3e3919b5947746948b3cd98b19753169421d28e1aec00c694f7cc88f0491a981321e40ecbff6496d36f2f5e966fcdd63163c8ecb82c9ee44cf42df76b0df21e3bf436ce55e3073caaafc57066c42d511341bd27af55bd1eb28a6ca86d54ffdc7aded36584fc99a062ec12997b4923fee9954a13a62f07dcb5e9b4ad4aae6111e272bc8a64113d473bbed96ed1c35332a55ee33efc0e7b42ec5b80e656f52015b43ae6b607b7967dc5b08979722f882befcf1e586aba9468f1f489aff5a1e5cdbdcd46b8ac712ccefbf03b75b15c32c74fd687f29011bf9dfa24f9e4d2843d9fa0dbbb885a6f547ca794f7cb8848221b0bcdeb3201f36734cb83f0f98da74076926220154a3f05b850fcfade9b9fbd48acefc34fea05284560678e53ecdfdfbdfcc1c1d8e089f41f6339658c9fae8fa525337c5b372a5766f899faa05c19e36feba3d2c88cdfaa1bad54b891ec48b18d7ba7abe877a41098ec43a0cfcab2a21dd4d8562ceb18ee925957e5ed739b38f5a11c32c76fd687f29019bf5d3f964b66f86e7d54aecce137f5417965c6df7a9d0b4785e0a60556551432dd515e540eccb080914054b7ed54021b4d7d8f76f07b4e5dafc6e093f147ef5e48d069ce9bbe5880a09b599f91811571c118e8f14207e609433be2869fde163e5626d54eba461568a16c5a3b032db9e9f06a3a17d4fa560dd5c1cf0d8fce8fe43c1f8c697ff183e1706c8486cf821e9e9d07aa433e6fc9dd4227b2ee1554d75175ada24a3778a46d9a67fb04fc7f76c39426ec3d0ad7d68fb3f9adebbf7d2f89e6ed63b47ad57ccd72ec378eebc058507284a4388817f6bec5b8e92c0dcf772c12f768776c282f1928dce8954ccd5f4060fbd199f0577ab0cfad3bff4a9affa42cfc2a1ed87fd7762bc469f07dcbe4b2a350c4b9d2fdb878a0d31fc04232314378df7262e7a387c2a7e326ecec3e60512a853aa7e160fba5b2f0a77a61df513bff5536ffc84cf82b3dd8e7d69d7f25cd7f52167e150f60afbfc753112dd17a06422f4c025a5c1fdd94c4f5c0df533bbf4532ffc959f8537cd8ef569d5f21cfff6426fc541fec3f2be7a7ca73de605d6a54e49be9fb53011dc01b630874fd485be61af832f02670951cfddb0bea6ae6c5f525fa22aeb30b16f31f4f7aa6fd6e02844b0518381f28630ba35f40ad001d4bea8521e0ddec18ecc42b0063c74c1ddc249943b1f877aad57bc9cc908fa018500cd6584ce0622fef39211ede8673609e8df0f436a515f59890816cfdb97800a11c53f9d4782974c2b11850990fa16bb188b4108de297057a612079e906ab8a50ca0df806c4994d5ff90a63f013d8d3b06c9ecfc603c473608876f1020ec8bf428946255909a72132fa2197e9db85f29e11650718cb23851ead878447180a23859f2d0f8427188b03059e6d0f850ec270483965ed9c46b057c23ada2ce8221693dc0c3462e6e4c92c37f856ca2fca7d8e82b7c943e101067598c257c343d111866580c277d343c21146759052f03dc30cb82249663f27069c216095c79c4a1d9192086174b83924bf4ada8189030f1bfee87fcbef5e35a897f053be60ebe7a0d149ddadb9bc220310e5fe3f3b3940923205ba9aa75708b9dbb1ebd2465853229533df43277c74e9feaa11d0f1a1c45ee0fb90607bd26c6519b1c41afce54a2c1ad1e0c65c85c26e700be00e8c709796264a26b3b499d2ba13ef6c85bdec9d563fe64315629c970226ea5d507c2b29ae1afc1fe1db0b6ec264b4cabd5ea581d5ebbc9f7f7a3a5de1887acb847282c1bf52f1febc09590ae4f4d49a973c5dbd0b28811b6c8c98e8dddde0c6972f64e284396ab3e2644f1ba7ef61dfc3a568164e847e3271b11d02016a507c9173b624b00dedc02ed58b3c717db0b289918edc1067344d21ca6eb25317106281d9e33590c1f558748a1b944156b67cc287d15d5b7328a3673fe9c0492dd968e876d3607548b997f01d82e5b46fbab57d200f4cc741d40cfcc46d7a38eeac5ff53b29dbe9d7358905ada132bf53af9733bf4d8cc422e5874b95c07ca2578a3ed75bf5f64fc3d78407bc7aee51c79aac7ebc21632047fa128ce9fa99029240733852a1fd29da897ccdf209c68ca0d384fd035a4c5849b0c1bf10f1a23888bbb4e0be37c06bc1b3ef974ac90e59aaf041c06526ef8ed32914bc58e58914b23ac988de533cac7b94118eb3fbe35ee8c1e423b14f6265c218a7563bc2ad826a1f142e0b4dfa0d9d6aa3a7040c9d1d88fca423a7340215138d4ef735555aca7a767dbc50d219b53484c660ed142b846e1557238650cc8c8f70c99be400124b096900178ad83a55e50a49834d6e29eaadb5847ccd8aa05eb1155def101a605f1594ff76a86862788ef7ccd631472e5bfe412d2ff3545d7141da1178a1b89f29a98c4104cf14e4c9e3f0a5c32fe3a7d92800dcfb150a52e3881ee3d6c24f5b636c9bae3e78648fa14d92d34b96e2bc75e788be6e3ae15d2788c876c1435b88ee14f6b8ebfb1ec7013a7871cb4747ab3828a4be07b7f2ceb08f830b5d2b13efb13363afad4e8e5446dd9409095c12d1a211a3dc695f768c144e2cca48caa654a27f3672c3fac3d03ff7f46e479bd0a6771d8222e488c3500aca44c401b3240a47a8502dd19ef9d0637626265feaa1a0e6725ab0505d67444eccb1788edbba83a47fc0c4817ced2eaea214778b827a5e03fab68d4626e4019e3beb3f702877d33422b727ad07ab1d09b6c80b7ed6d904f5d8c5d549d389ce813217265a9e2ac86856d4583d031119261776b8653384383efa7a3164b1bd4ff2768b196b5058a990184d11d7b84460f446144c2051c7fad36a360812ddda689d8c430ada6a39195393e52735130c4274c00845ea125c151726eb979096a59d2cfb64a2ba7ea5fe353cce9fbda54763a42695a024a52eaf512dbb9893bb748b24d695938cf60f567dbb08762ce3b749e8816e22ea0aa95d9a1dd903b89b90bddaad911532ed908230977c547d9274fb31d8099c3a40acc36d918d9baf2c0173f4cb278e90b90c33ccfdc14a3d7c84a112e8a3037692158940ba1ecdbdb5e4a9686179cda18291c95c3c140cbcd17e744e2c935a5eb783dd71912bb2b32e785dbafe39b5ec00d4ee33561ce8d2488c1ecc5cde8653fad0cd7780a5299f2b8ea5f122c815313054e68f400f53de11f242f68199d6bab792d588ac4cae6e82dbfab35a606d6f0736bdd3b2af1409306a2336bc29281b69d727572dd6b47649c2ac2c4ffd1907f202a6af01baf1da31ae7f59984211d58e702d7af2f29e8b3a642f8c3483a1e6ad202761cd309d033b2351cf9a73d2db7b725d50c671557533c47c4d2aca71be60252bc7ee29f7f69e8fa3802c5abe7f8bc0169260420c519304020088b9fb0dd0e0892269d06e02b935be85b22606c3cbe457bc3a2f739c1bb90070d3e2e4281b1c3643f835ecf1a3033e61ce0fef7e5187178e748b136e01a67a0a05645ba978e8af4d27548c80b612b3796760a084349778f75146eb990f479df898f6b2cbf2cbce7f5d32c44e509b67d4b2488e3a1da2c61cc58dd56971cbb577cbc0373a9d7ead8729a13e6ea5c7f56a5a66ec8a56cdbac4ee008272cfb004066a61d6726eb4b07c037c24816a050928616bd5cdacb7dd1c9fa1691f9c5db100aab038c65cba86878d3e115a313c8c3b66a58affb0b9fed2d43c8c6b165fb6975d6b2a53dbac35dfac092e9878918a6272fe8f8e5aadf485ed626004250446f7ca7242491b459d43ad0bca8bac12e43b4af90a2ac2ae2dd4ace5dffbf0d7e55d8c277d695f58900fa35681f485a5025d26a9fc68a8d1c820532e72bd4a2fc7414532caa8cc45e132fecbcd1b7e8963bf9902af26662478c0506bcb643bcd5ca592e9cfa9ebe55b3902a9abb6fd0e9862281ebe903613313c8b237efd1d2407299ae4630fda575d20f3ccb9b7fedb22810d55c9001a7b62a346cc64e5ff105a6605794cf75aeeb19048eab7117182be63ea313eb10891ea37e41f1145171c8e67e8138e93f2d825282068e18aa6459b6570f9d4b146d594664568f01af6e184303ffb9060bbc8723faa012f4d39194fc99231a34a06d6b957f18de44ce9bbc074cfb4adad0ad6d848ce4523872e73c76b913397138c75c5c1d5854b5d5d0a7e87c292a4a9eb51b6226f06894c11459707d8c1f039f12f847ef97c6a7230fe59968ce16a586e53f6809d7cc5e59e75b1b268df4c1481dbc18236b77e4e35dcd02236c8d986229e05b413c87062af85d493fa1586e38363e4048e4f3a11caf812d73801041aa7a4dd0ebdd4349c103302c519337c7c645adf48065a917e2194b0a2b8595632340dac1897dc0b56160d5b651ab382b4a0a84d16a50911f720cf8a13e7be97acd3dacbe8945cdb9a158b8ff4bb82f3f6197461894a441eb71d04e12726b850dce3db9200c7129d2ddeff60a915d1f5a962b6ee89f022c1d5e90c8c0dab19b5537f75c1a51dcda6aaa9bb1922e51be31495bcba5dc77c0baeb9e3f929936dcc9cab43c095f5b7996eba3d2e76fc71adab65007052f346d93b64cbf1e485ac4f077bee631138043cdbdde51385262157efe2cbec9dba227a728a4374f9d7c012c47ba9619049cc9c043b26684651bf2c162bf50a4cdef288b4af64dcf675276a4b161d743e4e980d9c92d3ebb3b1318eee460e6b743828c68ba2152adafcf4783b52065da1fb8a8c638b5c0ced3023acb28cd7322ce8a8e896a86188e08f425cf59087e181e652e7b2209471036c0e19a479c82e2420024407da578ae636951501cca63239f34a1bd0c03234cf4366d0d795f23c9a3225cfc3cd919689b97258cecac30bfb4fceedc26a5481cca51711f7c757b3b5398ec2dc34858147cabea8a7d0cc81091cbab1bb01a288b464558e82644aa06d4e03ba291e5214410365c1cb69c90526239fad811451fc90930d8ed45ad3b339593bd59a4406046dc101ef10b794d02c135d64023dbb45562fbc2cff2121be40cac52fda361d4d6a22d685717dfbe18d421855e7b79ca70c1b9c280d990b09f10576d8eaf291acb444b70511d0e0f637da4657766913c7d9db9bb16327d8d6b7bf0978be93c46fa957f6c416e0bdab93b3b1c0baf8d66b0133c974d7be3c9b634b64afe1e5070a30eba88f058e2dcb862b50bc202c73f32f418e9673d0ed41b4305a8e1a3b8067f00365fa9ce77611f6c74513903e6d949bb12e81af8cbbabb3cc8104d68b15dc8b3ac344ac840fd448353db56bf70e81d935a001f6bd7aaf9340775d38153c8fa902be676b0c76b4e3f604d16f96b416ccbc76938f7f6a0ba004b405ee315dbd70b5183fb0a0db4c0cc4cb182c56015dc6dadd67a2e00634ad5670958c2670a1fb4daf29b43a230f28e47e4d5b5fb09af1031776df7cf505ab2ae36fa780426eb109b73f5970339870f34e6c80407400018f30863e5dabbc77f50cafa490d4de192dee1e7e88fd25a6a8a5854828ded5b0823e38b8bf898ec595e9b456e802d55fcd1ef310211d511c05ab365e40417799af3aa007fcc1e9bcf5a71c837f830978d817d75a695ee0155ea1230b2ce0bed9d60a5632f2c0c2eed574b582558f2fa0d05dcdab1558a5e30f54e88ecc562f5c85c60f28e82ef3d40b57eb8c6b87d1d7423a915895b350046b3461f5f85db2505a1afcc633483fbbb0d5607355705bf36a0bace6e80716ba4fa6d50a57a9d1031774cf343585ab7be40185dc337dbdd0ca1d6de0027761fe5ae1957de4e08185dd3279bdd08a75dc5ed90bac5b5d976e315584f1473e26b233096ab0d1134cbaea91889ec168d1d90afa1d5a0d5cac81ff6051dec22253b8c434fd4dd687374b3672cb2027d58bc167a72c60b97ad3eae930f1c84ed857238c3558e97deed8df9e60c3b2bfb670bfe5c32219e7bbcfb74b6573e07d0e7305e3dec8adf1d6f59f33f11913090f50361c226ac4ef34911431eb443c1e6e8270b57e12068e47600464e181e454c4c2f334733804a314042d7ec4c098ad4a9660ee79f9ea17284f8b08d7f3c0c45a893ac0a1b19c9d21f6ff1eba601b2340de60eaef42c5a0d7b809eb176d0474acc7d958c15a90152c6ad739579c1e7daa2520aaef4858199b92c538f333f808bc4fc09940b6a167547bfe74242b1954725129c60d1e446f8f2b6afdd5725f271be8146fedfd8bc673f1098e1eab087aff5c5b48e5f04c2e6038f501603517e2b8b4a885c1192b7e672299bbc05d1de00156bfa64672b31954a42cbed776cae5f7d89c246faf2ada8fcf04a87a8ec15664db102acd0575ebcd3ea91df9c558dd551f4e4a8ef61f4d4446183c1d745ad0220ca28c665ed36cab4f685da334520db12543612f8cf683683b2929d2ce83eb7bc0acc08622e5e820d43646f6e531551c069e92801e75a5d6386bc5d47987f705088ec292071d7e4475571e3aadb682fbf053ea52d9ac9c35038cc3848cc9821afc2bbd1f7b64c26129369b409be0db736cee6757a77b20818020209e680883a4107f66c73bb86155362336e161959eca6f72f58e580fff1289df0bd648447bf8ef1217efbaeb45cb2dfe249b977e291e293cd8ccd2f15b61d4c1f2c5641bea3b7723251b8090e86a9b900c40546675dd15cb9ee805784a70369333907f8e714715c384669638b1331c15f878932501415f698f2eb22b8ae89721b021fcfabcb0b50e3155d234c4487e154fb5bd3d46bec4f33bf24003b7a041d92e4255e7b453667a2753f8c3d96745bbe267c33d3a04efdb4518c164324a2480944c1ad615de30300caba314c519290887960395677a8d37bf2e6827f970b6440253e14ea0403acb4d4b0dc7a1fe2c03dc5595ce8e9d03f9f31d5663172fcf6a0690980689860fd88dc8cfaf65320c82c6ae180604a2787a84441cb75a9247b71a41e4bd76a53ea8bc45ddfcd19507c814ccef2ec3c6345f6c38d8bb1f8b89140a1527b7f4131711094dca0f29af789228dfbfe9792a62568f44b37c705f1601387cd111c7e5f59a08b206ad38464448115e146d44fa8c02e78452e103a6c1a33d6816f00032c035d4cdf57b42c04312a6d16672e4981355312184eecfca209ce0d63a23385d31f2dbc3cb63dbf746e314b2dbe527f46b17a1811793d9c5911fa5b104fa50bdb7867f3ab7edec09b212b481f4841847f52707992b80bc702a44667b835b7f80297d63aad87a220b3e5ac6270ef3fecac966c3707f2150ef18afddff03d7f97b5b8f5207e310957adee556bc4d18ea8073ff2878224017e5fe9a98609afd292783c6527f7cb306d3664b56c653b3c9502414fc1039b8bf904283e233cec361d3ecbc0fa559878b709d4f17816630a1aba295311a1dc712bb0f23d753cbe99c78f4078b8afd53638f598e7ef6522551bb55326d98bbdfdf12842717692754fd2d4d395a7467c5a5c0180b96e59e4b8d0607c21ffc1469da8ba9f8b5ac14b6818bd5519d0f72a9201601c5156fac15ed90ee3ccf7de4b7eaf0acee80b8a82e9996a574b10b65dfca76b756c2366bf161ae1e9d24dd4a652a570ff6f1c5534085939bbd98f346bfd6157afbd39c4746b3de019181e95f7ddc8f1ac4b0febe3515c639855f1263416cf5003330d7dd19ea02bd1d89a3c5600290286566c4ee915af80bd144c12594db5af9e8f125b30fa682d5256a9268cc6a302534ade45cc5459d473bfd934a26bcb78aa26e1aecd4beac036f2cf1eabe78b8903ddaba2be2c40ba9125e0c9a614e7fb00923ccac7052439a1552a89581c9b49294a466672af15e3065936c447f192501e29539b31d604edb75dc8495add0ca45cb665a9056c748cb06ac02e20149811c526e8f7f075217e2417f133686e0bd1667c8ecf5d4d0ed3d16b8d1ed89b8bb7211ae3da1abc88e976b4b25ff02a884063efb8bca7c571c40d37748c404a85b8e5c65c42c58e0481b68c4c2473a1b166e2820bb0852a1b4541705c7bad7668d2b7f8a58eab70703f30a6c31b1a6067a56f87823b15b574abb62374181a65ed7920cf45804322abde591b03a61d8bb880b15ac274b9f6b047cd1c5d5bffee3f2382aa02ea6f1802b5907d45f7380d29f7bbd62825fdafd9dea57ccd1766d148f5c69a9c7f9eb2f33b0203db8d788c56698588855d4b14f47c6a3097211b04fa56b9682e855787ed8d02f0aea4cb8b1f097c8738335df722a46199ee5802a482ef1c20ff026e53956703618872deb8f6f042a1eb0cca004b17cd57eaab10ec02a5cabdbc5610ce1065382c5ce3b4dbf6d02ce175f171976a42c8d7d8719aeb0f6937d3508fc8a94cffe71749fa8e91f4d11cfc6f1d0e1fa4b5da051e3878abc54f37f429bc2c56eee1e02a7fba58a55dff7dfebc3b74e6cba5091d7964c580b12166e3098682e90c9b9e412eece137efe1d2fc7002dddc722110357535a8c9cce2baef0803026bba124b6008fec3ea10d41c7e14306bb2ed49a530962125c6519b8015b64e87d73135bcf13d17bf88a7292a58c8dbcb196b980068a3812738a8f12f59b8480221f7e4b98fa23bfed8964ee04668a6460ce3ff1b10aea8166d3cbc0ae218b90fab8777125bb6b12139bf9e8761dd6516973105a69a39c29d84d060284a164a0cca1044d2ca51392c49b5aa3cf7fddb5e3948e6dda21f40466ede57a9d222d8cd6e7f4e36e5002d43715d6843b79f22e7a3c9b6400b7621450800f2cb1e2c023d9ddb04f130ec45bfeb3caf137cd8833fe92ca2913c5adb01312c389c8cada91383ef848d5090c1f6deff8d25ab7a03bd95674750adb5f0ff17ab4249a6d7dd63328c3212179a861c16a920474ca034f962293d3258bc3fa08144df228dbb6322c1d3d975f21431f17923a6231a865ebae5aa8ffa53f93dfac22b85de6bcb1ddc1cb002fdbbabc434e1e141235c2a7c67bdb2e4a0aa49562c3c75f17a45fd0fb0bd73772701160bb975043ab234913a06dbaa841ba5c40dd272eda5d673d51b5d108a2a7bf7076f46bd41070eb2a885d19a61d27505cf1a82584dbd18ab1063260005e793232ad4ca019b730ce1f24fea10bc3df8e548145d704c1dfaead8c59a56bd6bcc761a1cbbaf52f185ff716d3a7eb01a89eb998155d4fa923d79a0ade5600426bbae23a1e2dba84a55c9d26be12c2ce3d15da0de59aedce492d08bf3c430d486ae8428e88a169fba3add8ff30cc19cd7a9d38fb60e9639100e8fc57969eb968eaa6008a0919a3a0f131c43099ab0d4099ea8fcee9ea64deb719c591cbbf5543650d0ce82d19d4265aae0c92503306b336fddd9d70647671f40769436a3b86f92d31327c50e7858d6166ee10d032358706284e83ad3e3671f07a76688a0067b1cc474eea8704ddae1b3c790674e9409b90447b4a063a4288fc9c9f25b3690d289f08bae4ea2bf506988bac5db4eca6e42392876f4feb1975626e9302c8352fa9ba44a1c49057d8b2121e303ad6f4f921d942b6249b3d5d4abee222b4409260011b4db265192e46096d384649bba75e59fafb5e6cad2ec94eb266535d9101021d769efd5cfe99403ef5a71c64578452e8a2fde79479e9b081d66e345201ada4c4917efa6334f6710258b5a2cb75e1ded057d56f670da0b12ac02af3c449dea8078402572d825ec09a602a928b0f5858241d847b9a6079cdd2469389fb0746b0b3b32215bd341a93b19782a6bf986d6ae3d12c14a68934ad332d110896353a7361fb9045f6e6b94309b2b6ac03e116e771df16a57b7d1ee4ae536bb332aedb4b30c725c585149ec78529827047d98a2326333596727250fc615a03f725214f61dff71292ebaf2f6d78e3d828b1aadb0bb2d347b55d73da07dc2ea0aa3c8177ba9939988806981e76934cbd40d8b4fe21eb65adfcd65e6a7333e3803203ba8a85231d3c838796bdfa8c423c1d9b7b48bc3b2210e5985b8d2adbad60c88fc2c0ad67d4b18608793561afee34d7f543f62a8193af536203d20652bea331e54cc9df0e5e24539c2ad0130724d810fe7c9eeb70c8bae51d4076d1420e60fccf43b2dae6bc3a0c619197ed84dcca3bec444570cba5a6ccf530cd0cc93d8f1f23001909499cb82c35b04080c89c40e7a2ef944af76eaac1d3b88af1f1a6e5ab2aeb8530df62feb2f3650bd4bda12933020aad6893d3e26b185650ecc2da149476266d0a2070856909bd1add26a02dd60c9343e89d6a9cf301a6d022c475ce2d97e61d7a8fe07047e0f165bc0d1d1800e11df7453a992f8f11a1a3859d03ccdaba3392b707ca26611638722d4752898d6328c9c9b1417264683b8afce65d0821dee6cbcc08533b49b565e4b9331a5cd4ea6af7b586c5c2ddec7b58e72e1ff9d8155c40909479f1c10411254e3c95e5599f5c13085abd7e82de05c5c16ca3e9892c65fe566f81ff6ba7ff82bb0aab541215b8c0a28e88d6a10dee000e5c5db126432c5e08a4e1f301e8fa8ee0a9ffea10b011b43d786712b149ae75762037c578c306add3617b078832265f93751c5f973a55b2265190dee12a54f0aab7a55efe26b0379c2b9000eba398a811a43c1f551fb20c9ee5050ac307344ffe9f953c23769430eee080f6907b8889f45c58cdea4e9bf6b645ccc026122b9b80604dbd04a2cf13772ec94aa5edeee73a95e85ac4aaaed902d32f9e3a4ac5a82ab8e88c313823153720e2e23b00345c89a6d48c6650b08fdf34675c28dcd4a017b2f6dbd12baf62282810815b2fb03d99a5a2336425906e6383b7ff7f7529c9865805fa23803dc453b428352f6e737631a479437e075e44925063e2196963587039e7e1bd1d16adb80905a9638989d42055ed6971873d07bd1e2e0b717c377021fe806b26b30e0904424bea95322eae2acda7e41bbb32f2fbf541712e434a5f865b94596eb20a7455b9b353816a46b8b1c0819234aae269839e0e5023d59c9fc207bb21440e45841d3e6bd2c5b79595e47873dae145191dfea1d3cd3ea1bfdc0394ed7922120aef5f5be0b29b0973b2050d8ef56740ec5194e8188926480f6ea0d3af07e8930a8877d1f50a6a861d62a69b6997028203787d2fdebedc8af9e01c2f4050a5635c5fa080a13a4a903a3aed38e17d1211381c6f64dd283af5694b10fc96b9b1899a1503fc10cb4c0b64111a4fadab70280bbb3cdea23026c9426707d1819760c7d7adc1d40b123494ac6595588923a32b316a894df7393070090def47ea24e8f1f3a5a5b23c6d39f45e378f0c0937e942dae76ea43f626e13466a46b2766a626e7e984a2155b33dc91ec9530e5cb83ef7314dab3a68c10c881d60f661d62c62cde1249c41a5088cdaff3966226dec7309826a12abff22c90d2b55bfba6160ea2127e847f9edaf9006ca530ff565a741f4b4023835dfb2719659cac9b4381a26510ee3619ab5260e2b422722cee328bb4d229e75384c217b74c814ae4143da8cc4eab7a23a13880f8757416cd2b50bfe9f5c56cfaa8d5c630651af9afab3de4a6fa11ee29dac49345671f4c589a3ae9e4a7b09259394a888839e2310050b5e75e52ef4b759bd6103ee9c4da7db86d0634162cbf028fd0e4e525da05ca8d65b3970764c4b0490b44c3b834e5c54e8545cd0a15f8bd0dd66c7fd3454e7363b50bf93d8a847c887ea6417e74e19bb8870927b6b739f2cb60f21866b6be5cac9623761879b9d86be6c67e2ec36432fe0820e7b8588887ed2b127105abddf3a5aef46b1d37b215b9676469cba3e5d7653a481233beaef20ba5008f97baa07eb75b64fddeb7e785abe66cad9d5691dc8c08d53d2b1df21babaf79215191c7b6e4eb163a8cb1675ec3b2135e3865708ebde2a4576e5d89c3d4bc1af136f845e097053c31347047b83dc3bdfe5102a74ec687d33a45dd3cdb6dee9eac69ca1381df6adcfdb72cb3ee57b8fc944ae7260e3d344422260ed08258eaa4998aee1f54d834ff91712de078766a31ef28b5b0836e3296c03dd9e375ad8b614c376e5c4fe9715524bbccb477c9e86307aa8d495b90feb0f840d50ba6fe43017d1e360ab5fa3d1dc84702b43f15f0146d6f450f02a1167674bc4eb9fe38f24a0b560e0bfd8197619eeb1408d879f4fb862efdca3f46c23f46d8fba39e2292645b1724625d71bd246a440a33d6fae9e51a895139a2030a94d401ce5669a3067e78f2f4722da9e9bd205801f48f6478c1953a038acace36a6a7d37f1b930d4fc2b638dc355fadbda03bb6ffa86422abab80bc4a064b5092b1c6df3cca92e7305cc8c5fbb6407a2ea5babc74f49b3b9033a77e423d7eb43e42dce5679dd8abc4880504ef865d843ca9a6fc7b57e00e4ae95820ecf25d75551a5e4fc562561454099696e20a924bb516ac0c018f331af91c4e8dcad5a6dd9bc5c862fae10a75b69547b8cc70e766250e65500b865660b64cd2733932f0ff81e438a8ac4783e8de901a489550da45522c2d93f3f7e53d518713821b82ef1996187bf2e450fbeb75593cab47da703644bd4734be9369f23adaa6ccf4c212a74c8036f7c334f60d28b556713ab655f01ab0feb38067a1417da672bb71301b755a50a478d1551d42c3ec8869ab4f21ad0a89191188562f38ddfa333ed15158898afaa16e89a05889146d2d88d20637a243f29eda95c1810a34ff60ee6ef4248d902d0b8309f30809ea71f06b97d43911684c485083dd591d3f94cef0d9ddf7732c0b64bdaa6dc2f4608c27af4a1ca268fad0b52690f57a367783fd59d4ac5040b829582b3d43de7f9472917df4fc8e0413d1d9598e9ecbc533ac7df3d8fdf581866193b7e094f5601b81339810aefab86dadfb50fe412960c5867d7fc57e6808f06f15268ffa8702460f0037926c22236113941def893bfb13204d20f9cc5150088e68bf7c658c60052d896b01193de03b14b347271ea80fc2c24437ef2e9ddb2bca4668b57204baba5c5d843a04f0a0c26942d5a3430b6034e17fd31a63029cb595edd853879f6f6af9ad9619ba005e33fe66c89dfcb89402bf93544551fa11765cdade05214b2a822cc39617354c58a8558217b8cac89f3a3d1a5030b5a47c9ff1d1972381423f9196883963453be7fc6bc5f86e500607fe7d71e5340aa225c7554f3c8c45970b5f22f045cc28ce978660f29a10591ecd4de4ccc83e2e863a7a26e99efcd8bbbb940bb0e1239c79eb84ba384932bf8a749c4f3c4d701550c659890ff6b2788bd8e3f3c314fc883517fdeeeed853a60e686518380ca1cb1dfcb91f61d57a931b790d88b7727ddd35743c15a053f7b0df3386d4e5d9df7605c0994414ffcaef5dfb15aff245a0137d95b2b8a125bf7f7a81b10c5668f28bee2cd961e3df56aa28123f31d7ad1dc54983763c8240a4545d59910c90830202cbbb89f946fa821c3e2aea07284818a95d823a1922200e1bc332666ddfbaa43e89b92c803c391716149628c68fba8b20d1286762e3d87cbafd6a58b42716e90165517dadd755ed33b27a3098b6bcc0820288a25f6035035ad8bb96545ac4f45bc12bc05e9250c9892a8e3c0ce90a7228399aad78fc9195f92b95478880b12eaf7a7fa011911483e8fc2c4fb6651ab493833def1c42fcf2b08f2e139eea0cad57fbcc168fae2bd6dbd62b8f683f64ac9e44435d5115a4194c0982db9873e2b082ba3c520d0cbee6ede2fd02d4c4df641bfae0222773f9c391145d4a38fcaa02454e7aaf8ef6efda75c98e5be5434cfc8fc77972040c2009d2741dfa8051d567baa58b759933b5133df2d1e70c93bac7d8504ea73fcbbb8c4e993b41a3a52aa53320ece2aac7f5926de3192760f07e072d69f17afe953ded1ede87dd076d40ba35443b767fd23d27897df6a3c01ee11c647264606075e6b7ca0ae6f8806cd5186eb19073271bd631bdbe1f525f2ee90b4904a6688759401fedc22f23c5ac8cb918890ad7b8299fd917aa111988c3a13c22291e136f3725bf88233aa444df7b76ca4fd605f7aa6710248e507268345ed72cd2a7e1f81730fad540ab7995a312e118a43d72c08c6e687acb9072d96555b7f43533c6a87c7c1b4ca5fc3567481f1b31b01f568a8fb2db51dd224493895c30036c6b531d55a615093cdcf5a21336d1748444b89cd8b4fb8f2f7924dc105e9580974c374572520b3ee77aa2c87b59abc988c6374f7743f927b201715e8a6c9c49605550f0189a20f8d6803d794bbb2a07d53c5463f2f9b2a58ba724523fe7c41da4bb9dd1784374ec3d88788dc0c6aa12b125904bb17a274b207f1fcde3b10efb7c74492800dee24c5c464bbc8f35dcca35565ba3e9f9a56ca9f00ff60124228595faf9bda46cbaa7762e232774116f7627da7269c6a0e59679e085b45d4b375ceaf08dce43c2cdd037336caa99423f7eb99ecd2fa2492b35e9a2fdc8584289d74bd1e5c739380e455d09971dd7b7a456f2c2c3c17d81c239d46321397daae9f944f6d84e26431cfffcc6eaf5327198a2f3d704f2e26a7221f3f6a80be9724929d60dd2e238ff8f294badeff04eff926c5b46115b35d58ed86aa177de4b60c727f20e51913c78724711da00772e4223c15ddca8da696c74a787419eca915c4e3e291e3f0ba4166df324f9e42db239e1145539e5aa2e58c4ee9ec7445e81dd3f694c56ca6698202cd597721cdf2c85a2a5b8dbf167e19ba80a533e94d20132a3b3b6c6f911e2271ddcd15249d8bed0a3c45fb04472e8ba9b188b351069b4b1e422b887d6ac02e54bc6e0c56388be46e9ecd915998a57778e879c7006cb66d0b8965dc9c8ec54a1bfa88653322fa5eac211a2a304e624c3b8d169e240cfb7c626351d37dd4cf3a78d05c7ee7daa5d0d2d6de6d29fc40b27eb6a7553d0be96b4189da67e4a72e5c3a8c64a5bb1dedeab4a529fd73219d29b04d5d8e9699db15e3c3ebd6eb952d90cbd2c791fa4fb01ac6063ecb760a940d7cb642553216fae9d99b32581f330c3fb9d26530ac0ea3f49a1946675a1ec221925aed1e74f30f54803b4bd36856db91f5be8efbfae476ed0e69aed87968e93501b71fa627adfcfcebf32dcc40992a20517db22e1226cf3673ca49613447b34f9540b7a010718ac5b0898b0a52051a20b0300011e19d62c3a429e56a664f7fef390fc59cf22c1ff791b2c016bf3cc31b46812e87de86fe89c93d4d425bbcc0d7895b4b140739215da7a87f448a2642ae6806f1f0146643bba20424b0a1bd03a813baf739e5bb604adb7b66d56a0cd895dcc213d50cddb697cbf91961d304e05a29ca60c7909ffa2cea8d79963362e26e14e37a951b0b498b2e94ae4a92f06a94add0c9b16dd52c9c824663aacc11483f0e0b8cdb0de0608863f1ea67b7c2f18319914b9bbd67f4d16a46535a1fa7566545f83336ae07138e8fa089ac3e85c6e22181af2964d838c2c5b15bb22e8aa44653e314cb415120068a3e0883ae042a7f6808730af4a28471f2be6493cabf8804c04bea7e8379346fed24c2c6378bc7662185b1d5b9fc5969a73c542898c456002c3e20b1be4001b4f9514c15c578d87d83833ea7ed1f6ba925a5ef8a4af93607181dfdb5fd0c1bd155723241b503ff9d319dcad7d0a60dcf5494be1d065f0e598a3a0d52886bcfbfb212e624accb2ca5d488004248d60f8889f647078473b1ce82267f751b57523c27188184300830635bcc0d80338df134bc38a2fd286872f472458cd0c8e75b9541e3a1ce4056736ae3e7cf713891dfd30d9f60f979537b56c447b9204d543923d716e6702e2b661b98671feb7fa949a58d7290bb3bc4acc0725087845597bcea1fea6499566fd9b27b9e16b1bf340668677452790f61767e153344f959fa604a158468819ac1d1ab64e372c603901cfdd39c078c32b2e6cfb96f20840a39cb5e754f13fd695d1bc8c5bd8715ad2b6b840e93fe6d2e5017436cbd7fb2ee8a2b7be44a90412101aee81ebcb5cdb9354012dd95542bff63430ae02d795ec5f8d3e2dc0d090073340db9ae197bdb2930a65fd952a76e038778057abaca640c677db491cad7756851fbd321af231b163aa5e0bcd19b4b4aa80baaccec4b137634c75ec2ffbbf9d3bc4bce3329f06d4fb29a953ae7cd36d1762598dbd5fc648598d50266dffe543f5747d54d17385d495c93e6fa511fe7ad5d177735721ed48a441d5eae7403254d14be7cd584aae6f494f5a2a41ed1d749b04b732df2eefe2be6826eb938e3f2d1ca42601eeff59c2c39a4690984e3f1d8e855bc15b6355d5d23d1063a36abb9a29d4545747d83fe2778d6cfb04acf224e1d783358cfbab78082afe58cefc1cf4ba8d149c95a3b67037389cf5250a4f053d9bc01b02e426388367492897330b9eb6f4e0c690cf8d60d295004bebede4831b023eee054915e6ea5e19242c88e92d287656ad9edaa500df1a0ec4ee28c300f7bda04f34060f3fbd0da0a7f3acca4997d3d37b045da3505da09aee276954514944ee522ba5ae423a3cf4ba5560890c1b05f1c7a6e509e65b3e7b765d08fa14b095e835086b29ecd335b38d9d62340cf60d233c38e73d3eab320e3aa045fb60995e9345eba465a72eb9d2698a800511cb5c9e81c752d46113a2c0455494b4c6686ce7ec07ff4b184aa4f037545972955a88103a265b8e7ade51b049bd0054fcbbf72d7cdbc71bf9cdf2accbb9e2aeac0a6488145f7bf537d1f810e7e0c15ad9f9f9dc9c77a6e58ce272ade6a993bd8f429e8f59b86cf07e2b68eaa333b9bb9edf4b232ccba4a6977af1c04ca1916938d048d5eaad8048d98517706b1ad2bf8ed3c1c29bc0c47b6adefcc68389f40ed731b8e40cfc52212da9831c0909a36e1ca9de3a1373f0dea39cbd130da5e0c9108dd7465fbb741e7fec338c3d2922ce51f94640545e33767ed30eee7123fa829c050d26cc5737f7927522e08b082e995b846530072fbb42a425e1b430a4aef1fea35445caaa86630bdf530d78f0ceb3d86dcacb740d223b0f0c8804fdd48dd949a819f4be49eebea42f1f47fc979a650ca1f306a67ce44a015214f0c15a8d14253818980bfbdc92cd0edcb2c0c899c182f52e52afa1a941c96e9e2f5122db561e69f59149c1871c67bf1984bcaf3ee72b1191ae8360aa313c0748aef4ed5846d8d9d4fc9667e355b1d00fc40d309b723874a637307cea87cec2f505316ad4ff0aac0402c3d488cccadb62fd773a3e342e1362baed25b0a3685e0c15161ee4d671f9e88bc3e20d9d08ba276608841f479553a17457fef6f2d78a0b408b7f8ebe61a59e6a8d42c85e5086ee353b8d9033ca821879234e5569a0cffbe6acabed6c33451e315d0042f80483043a4e9f05f46ee28a4714203b1e18d7e54c1d1be146dd2309bc8f6799ea66523204c54ecd7661091381b7b6fc9fcd75133184065a50b2db5677dd8b0728a14050328207e4ee5504895b2218e1e7d5c22917fedb4d0ba025a73262b91d35eb4f8167359f06bbdf7ef8ea1e6a83f5fecf6a6f2f935c0beafa8fd9a33c7a2bb3ea2636e9eef42cbb8bd4d2be4d3917c6ae42f20ec18085278aec9a8ffeb6299c9d6aae3c4a282ced5965c4285ee915ffa48ed19b7567963450d8639fd5f97c903d86cfc128bf844d9682092fb32b8b8bec36c4cc56b7008314495129c74348dea59046ee9cac7372549ad240dd9842c21364e650d6845a29c25236ca2dd5e3d1c7ff34c124566510b93f4d2c4373d83ddd27048f554460e00dfd01f1762161f201afc4dfdac067692844c8d76727c758bd43ed535b408bde398c85e37a9e17505ade189a85b586c146608e043bae8fb687031a3fa4708ffb5917af026af007dd3e8e25fea0de0ed735f2d50e439260fe0733dbb9240354e6afedf828937dc88670c481221033b377821ae76326513e91c34126b2349fcffab1cf23d55c26a9e5403162b17d5688ece4dc5c85f98d47c06a5f31e3cad02734df79690a82c27f92d841b9ca8e20f98cc8956b611925fc843724e8c57e0e54b07556f7e54c7f433b4d49b2b502771b28540900aa3302fb3724e04017a9feb98a8ca109143e8b806cd0c5e98f5a8c93a6abba0940942edb61c4530232ba2aa0821bc9886570fbf60f989836ee373853781a34219dc586151954c1194f6ac9b8c5df077258e6a17f81747843dfadcf16f5b072200deb9397a2e4005bde1186718eabe1c1a57237984d0d559f4c99dc899a360475fce8c7a243d2d039ddd2aabd6b4b18ed32ebc0f609eadb20b8dd50248b17290562a14a6288833b9012dc2602f4e6a770a488a4ee992998e4a5de540e7db3d6070cdd64e6e3b32006cc43e6a0636b5372faa7b556b741a6ab40754ef261b967dd826073d004b25e861d436558a7687965caab276f9ce3c4877e0ea33e75e5c726fbc996b3cd5d33bda78c1f20d9b887070a7947ce6827b31b0ba2cb97ccb1af846a18938dafd02b605a2bd0bc989532d81e35213bda442df7655c592f16c543888cbbc05e24743bbd8149171133acdf27b4e8289ec13580b7d59a8804c9cfe29d4e4fc38e4224043ddf58d11828282adfc3f099cdfdcd1c5d9155bbfeea0d00fc4bc39a40702eb9f9b099e86694c1f870aca50fbedcf93a7ed6d7831111517c255c8a2b170c810aa82a576a90305750a294a84155e8de76ddae2b698cc8de51b5cbbd2f344161295dedbaca02ae0e39484f8f94d49ce86af34c073a6ebd02014731012f92df4c6bc4ef41c3be5f1941284abc83b8db714e35fb60cd74f0ccc690cfe04a142b7cd1a65cadd88deb957fef23fccb5a342b70091afeecaf89667d14dae9edea5ab7e3adab6579051d51e5c1db6b2b3112459c03c8e630b22d445696a1c1168a65ae84c696b53122cc306c3855055aabe771156b4db6ce065c3d5d769a1e84d67b6493bde7786db67cb07e45a5ff0423b7e87a7e6ee600ec63ba18b972cab55d2e2562bcb42d7afde776ec2cfbb5ad80796f48abaa5584e17e6558bcee515893a6eb22e96ad4b266ab2845087fee01ed8d432825df08a8ebdd77aaccaf626f0bb631014fdb4cda85478962b94c985c4e402d5b9999065c9e4738914187edad656d04475342c1ff50eeaedfd7bbb7cd76b0d6e825acf271faf552e9f7fd258b4566a19e6abad6966b49547f9479023a74098f664b1703f73ce7fe90005c23b230ef4b7747d3bdd9fb3bbdef27e65684eb8d31cf5a38b5302846f9c7ecbaea77a064b7132fb8a0e154b50b9a959143bc0553fa8f1e3f2c94111b1581d74aea51341c7b53c37dd7847fe2fe53b31006e4db13627cb44431fd6787e43b263519bd7312b9ca05e8ac731e8f0bed6d22799f19341dff2f2d29233a0c8198cbeb9e3ab33b1e5e4dcef1e727b229b2a2155bb971318cca0b0c402c9baa6365eef3fc1cc476778b873cdd15882d86ed0b7fd85816b8164152d78a01271f6ad1d4f501c95b72c84808901a7811823a41b57d2111c7e1560dfd215cd8b117554c803a9100cc83fc1289256d650e23f9b2e26972a01f72d07afbba7f76743b4c0e60f3ceb6d6d2b50e4c9957f85be778dd724cd710a2ad6ec677947bc7fe8dbf186df335cd12884d023c4f1cc11ab650a44d3b9362b161b760bc4d5dedaa369eef860b92d8963a4fb494af92f5e756752051245b4239fb9b88a1f1535acda39d03a81aa3373c68f9a9f6c75f752c97a043a01066d084b829b615c73d20bcb8e2038f66bf3190e1ef08aa77b4c6ebfd75577ee8285e78bdcfedb0f2ca883ae6cc86db63231b0b2bde4d7cc50a80edc8e2cef0fc76874c71ec44f63a2935388a02303acd1b62e0f3fccb5d5d687beadeb30b7d54f27684dd3cca770751d0d4ba5c2c5bc66a843a1870c6263aa4e7bcf62ddf982da674675142e62122fc0266f4ed49ed8da9b0c29df896d27545ef96fc985964a65b72502abe774887171ecb6397354131121db76cc35e83bbead6d4a15e310b7e6864d456d2d03a86d861fb5a2f559f3908131ae4c8b875759b24b29bb0506f78fb6d69f29bf5558dcbbc16fbb73dea3555516e0b0c5ef7ea9710171be9d0d0436bdc57f2ffc8f22d2096bbbae8bb4e1afc6bed8886682458d676bb4e8d5e6785ac551bf205799e3d22ad3477bfbc883dbc672414cc023e66274e81f94a023c5a13105697a2a8fa794ab88acaa56dcb98c8fe37ab0634ffff67b76b10d3b7cfb67ecae51e869fb673e0497d1da45326358e291be2bd1232d976a2554f5d9a5aded5591284510cf6725ec2a3061c6b2cb7e2f397677728543d4dd4cc76e2333802715df5e31b4baad8db9f4312e3a54c9383cf6fe4ebdf05d57505a71c24fd2eda79390a70398d2b49e955587ca4673a19711762c75f38e26f1a0a04480e56118bf42a6962c97318ef0d5c180cc851b050ee7ceb18ae0404a1b7f515f688c1d19f0a3fb959e470c4f7814a63a556470e13126674106fec05022f236d6d3193adfb8e700305b78f65d5a9e85292093db2c26c366b30882db3eb3cdc27c88b351d83fd4ae775e9d53476af9c34a9b6ff1706272d5ab923b81922c5592fda366e0aae1f69ac4522e443ab98a8fbbda7edfe71fccf49c58a3245c3e2209eed7b929773d375b76e78c28b8de8a6a60382d83f1550c85c16af9a13be2191cf7ed96060c2ff3ba7c9a0751dad8600b9d3b41f512b9bf62c455c71faddb3ffef55361bdcd8cda652e649a9229ead4e0e2f6b483ea101250501b84c41287db0a7c536ab5a9743286942fc1d3c4dc23827dcc5d38986c417b5ba32676d214e60bbf0019f560cc84868e0d0e50e8452107f28f793f8e2eaece45e047884f03d8591fe6be02a3c90583f7213371d72448beac9718307ed2d9cc32154cd1d468aed2f6820152124a3281a3fa1de13538c72342f6471d25a56ee0d11f21018e12dc0a5b22684f8b90197852da32466e5960766d8dc9360f51e4992628236247f60bb5038ebb7056611b1147bb864c54bf28ae395219558840f3a24b0187b7a2663d31c53d25aa13368d8ab6b70b445820fb2f2c9e33c30374d00facfdd89c9924ffee2dc1dc93411552f1f42825f287123bf580c29110cf10cfe82e83f45fd5c135464a75b0ca494b582ab517bcfe54cba2543d5ab51a718c7bd8cfca76c43c80cb893d876c99282d864ca7a4c64fdc3cc0568a9da304d0387e966a1e968c166a153376c3f078bf20938459b59f5a3cca34b0b2382ee60f5fcff34476b37027865c000e860f47536581fb1c7fd5f10a37de74deefef0b3f9ce1e2bc18c369ca19a3ab02bac15d5aeb72d6c4082d5d2a2a7cd40695f04afab7b1c2b674dcebf18859e750afad0170c570a544ead98f7892974c8717d542691ddb59d64705e64b9d8d104452c556d71d6aebb0e4f5a9c3f1858d765877b224dbb61c7c529c20b27637d50c9147f519eda96e41797dfcd1d8e3bdbe200606a19aec914e2fa8bed1ca5f1d7b5a9ec3a05f855c71bc9e552facf3b005c1a39e22b2fe7259f081e91433ba40a44d42c90913aa177c21055b023883178c4f7306af10c0e9bdca0ae35b4c53510c0abb29120393b411b1ca7b457531aea28529f56d24bd9b1e8287805244f9772bfeeca80b77fdfae8050b71cad4625bbc11986ada65b35a115940f062506d058be8a91b43cdc35440d0f5c44956325d92d9539ba931e324c960a513f231cd4ad3614f5a73c569125c8fa78de576e6fd263bb679de6a89b8e47bdad986f4d116e5e9338a51f138206b2a4ef047606516959a917897dd7ebbbe3801b935841b124a9463ca1a94838edb4ea5a0321b73999eadb5addd4ce88b62eea367de9ad1560805265390e1e204b4469e6d1e32317f08bf7261b7d7e16d1c64ba9fe820dc85d0c3635607734d4318b3c98e369d8be9b9304b7ec5f2876209c2cfb19660b11faacce08b1dc4110b69284f2078292b6a88ffb2610b846ec94c795c0b794834aeadde155ef13fdde4ef7a2a46e607eb0251ffeacc37871cc9841a173c3f46e05fa33ed2b23ad67ac0d66d97ea4e1cfb2d20cbc78b187a4b04e33787a5f42f6505cef39f1e675261fa367d207624c1fcb5de88223ae893152109c2eadeb742935a0db29b12d96b6406ca42ad3b449e6f6d7524109f0f6bcb2b54c7aed14a35feeeb7beddb7360e55c9b395b2f813ca58f1373ecea51410520f71b5c5c52fccae47fbe8b7836f086257e5273839c01801478eb089180ff8d00497fc59f17f4a8bd5cbd52926c8c2c0ca785edd59ad24ba4d8001e324183a1842868ad1fe00815612a54034fc0aa38b7f186a2c2068c4f62058f76312054f22d5f954550235927a17a7154d2ae73f67992b02c9c82f610b562f32c4b05476fcbf8902a09e1020dd62a31e949ecc93ac084c774ca67e142a305d5582597ba10213ef7d09b4235b96e77c9a2cac0984b35e55b8642e030344bd353cba57ed0358f199261868e1bd6fd1f29c29302341219b5ff702ced8458d0890c2e95182e15eb83725ad7a179c3ee51267e6e974c236e6a2778f9cafc7b299e316688d0e5aa25a85cc829fac6d508bb3a4f98a77ecb0c934c704d96aacb2b9324ba4bfa56a5446259ae2b7c135e24513a2a858441ab283b549a33f3ccc023dede2542a9047ae4da7288308846c63e1811942a9de481e1744d2d38a49094f93d6ccaf3dc81e2ae613c4202ce941952ad5519b1f93267c4fd1774f27cb898e709c1aa1204658a131c27634d611e7cf17ba0aba686a774e24dddb7c2accd2c4029e89a8ed5e88154a5c167207481aeb8ee5cb3006c95ec02f96509ce36dc65e0c1f7e7a21f2a54442b0ae0b38ad0c735f5157ba2b7191a1d5c135867b9ea0879f9975a85b1482a10f78683ec37252cff915b3bf9ce4b09774b761d0c356a930e46e07db7400f8782933dc1fa2979dd08ce103a2e4f23ebf46442f97ea6114a809fc42caae45887077300b766af61abcb1dd93161d050dab3c4fd1328fbd482247ffac531adeff1e8a68de3bb189f7596c895a9b9b0ca5c5d95cc624cd6ce435f2cc3483da61e02f64985b8e87c6ef61b0d26c3f4bbfa6c3361431114cf4df792f78833db5800f63d8a5637f49d4bdf6f4fc50cae286529bf071eaf2dd816824b9623b30230d663697d8f11a716f5807039b4190c432c7a3df234d9e17ff1de6f8494704ab2b3aa3ec296757aa7e22aa58e0d7346a81e0e4ebff6df4405f02320ecdc89ebbb6a447705163ef0a87f6f20d53e9a0d38819319d18f1bf38e518f14d24e4c8743cffadfc1d8a90a4b560d0fe1da9876a228e007daaad4e2bf6adee816be48f43b99f2476227e874465fad6b39eebe7fde14ba989f7dd1ce652a419bdc0389ab7121746be911f2230e844fbc014f4c3e5c88cf64527ef8a9fc9a36997f01e4a968c8a649d92c0cc5e20634f445bbe11bf185801d622ee250f1d79b5860548ed17f25ba035b9d4bae11955d1dd21d74eb049cf75438b4c151bcafd11cdfb91bfb2148c61d3d8b2d20670bf61ce05b2a471d4d1c487aa4f0a4f4c1863b5613f9e2dfedada4ba68eaea34f2aecd426e57aa7180e05d231405a1016ec87bcccf0c06ce1037404e1c08ebed21506fa3e49ab257fa4500a62fd1641cfdf6a2d0fb3493dca55859a8d65852177a9de86337d7852f0addedba9a53024acd94e2e871a59281a1fc695292e9d44e878b7ca962bfcc9d44fcaa5d83689b1e886c12f3abf8c9e6bae92ee32d555ba4026ee3c8951fecef847e719728af4ebefa7aaa0a0dd07fb277f2e2ccd07cba3501768fc40c94424f1b78fc126eda284ed6298cecf18a7110c00e2ec3438c533487bb7592292cefd1b30ea4ea9db9c2c9582f7596936088d32a21afcd8c2bb20dfda18a6771e4387a2c8694e676e7f55a08a6a3857060968c6ce5e01ff9e56b0cebd618cea7e3782d2b6af51cb344c4cafb537bb5dce7f98d9c5bcb03f8dee668084a81fcf489e3d63ab11d40d560351fb1828c85c8a12a3c5e1232362114cdef40fd9bb2822769ec5ac007492ad1dd0635caa98143efb40360182ef4d0b620ecf09aec7803a18a43511fb5dcf8e8fffa91dfb257db8048541319995240880aca275fc6e29ea3cde4ac5cdf31b0227ad930e685de575af8f3aaaf223c30e0f3b712bc6e4b00e35a1b1688b1b741dbfd5120764ec30d6400876927daab0caf6177b61c40ff7e4851014e6a772d42884d86d90776bcccdecd90f647a2fa78b5c2397e1fc8bde9171d9bf592ee8c90d935b2cd3a2bc561afe9f466ae1c1b68078925ccca6dd62d782fabe06fd760ae334d1aeba324566f6aa62e91583dc25f518febcfdf87e4d5c1b24755e72490757b5b340e199d8254a0ff19310f5d5a031fb2ff8ced5e986000d0101fb142114d69f5bd59fe276057d9e2f398a4c2895b48b3a117d75cabc3c33fdbdc356dcccd718b39042ced8d6522eb985acef4972a37bcaba2bf80be28c55eeafaa04ce0dd1b8d6be03272e60c737db8ff84880c6c18de9bac95fd5ce878ac7f164413438ce6bc29c197ffc7beffb92d4f4ab3b25bff96fc0f1cb1e760e3c76b598b9f6d5f13efeae50cb6af92f09c86a98a1d0d268443494b30f5fe4cdea9b88a57e461e1dadd9012a876683756630758e51ee2dcbaf28dd29929be5c5837f4d83b308c3998b97a4a7fb7d2e39e340af15444475f18c6b95138b4f4813172f58ffb9daf54135d005b84369175098634d07a9d20b98e4608647be774e0007d8d2ed7f0da89883b83e22634f0565dc54bcc9d228cb9557f13a15f2dc184b3feeedeed9c362140b35ffce838a75d45ce6ae239355c8a3f3e9939c7a91fe33fd5eb82b06c85a3ccf7a188ab6efc28ab2473bf2d1cc00c4d2a83357064d8c111159521f2cd2d359e90aa102049aa1d51a1eaae3eec5c8a291820e20ed8286809883e4a594a01a5df73ea5a9665fca45a3a6480796c2d993a418e0904485bacca11362982e681990a6903cb43e6f105e94fd8e773f302264019464264317aa8c7da8ef865721e341761354db57824af4fc174e4e547a6e23b26dd806e4b2ff90cb8afd7e69f97197efec4c942108eee66f26a43599ba1ad18d1b8c393d8ef859eef74db0468d1bf8f1ea3f24e1d2863100816cb798cac5f3454723c7d0cb569ecb99a31deee6589803bff1a2d27e56f1ea0b02c0fbc816e9c1b6ffafe3c20b4fe799b0ba2140a58cff9ef052024a153da70a2f17d4d773554abc1f414129c119760b57d5e23d551405db701243296e1fa1d86c2ba36a14188b5d27d1101178de118698c4ce3a644cc1471bcb5e6f07f0a6286b1b6070b9ff6e58cec25c27ef3e1a4e74ede1fcdccdfaac2386377443cbec2c83990a2b69c76478fea3e37a47c30cf292fb632f61324fa1c39ec1f87f11dd22bc6efdb35d3b8333a8006f2ac01c4ac48d2d1b5d2906c92df92383cded84ca993a93aa4dd26cd0a085d028cd61d25c4449f8a92ed36d1139b8067281ae201b730d19d35c7f88ff4c600028079fd9b72db990eabedc5c5f5dc6a7c1896ffd1d9a0fc0fecd6f02752ee55f958528ad4755114941e5b35d5aff685323df08db7d6efd88d93ce2b1efe3db37c8a4c51385da5dc02620e94773e004b2feeceecfaeecc46c0db210db7d2b5add3dd013f000318b043bb828fd817a06cac282b633f4e7340653af2932ff28bbd7508b22b880edeedfae8e29a8dd0dfe41cc640384b57b20232e5e0f904bb7fe82d15e3bf16d944ce13f836b5d1702044c006a4c2c0f3d5067e30630112a30b2010101080840602112f9596c78602422b388cd4e445455eb01c311aaf845c88456c8b609d99aed1289ec1289f09b1031827e34eae000d800e500bff7defb7fdb9bd2bdffc1d9ba1e67ebfa9c0f54204880c96836ff0f2489e494c289567ba90a67ebc2f8063fd1eb63a66dbae3fe8124919c5238d16a2f55e16c5d18dfe0277a7dccb44d77dcbfe3ab1a45610882dbff343dcf8fe0e66355a310dcd3e300377f204924a7144eb4da4b55385b17c637f889dd7364daa6b96e61c1e42292530a275aeda52a9cad0be31bfc44af3f201147a66dba6be042cdb0e0a040a0d30c8f2392539a68b597aa3e92539a68b597aafece59eb9d55b3a17672819141352815cb858152079244eff080449e06faf0f0f0e04092e81d1e90c80320de77819141352815cb0593d16c3634b0774812c9294d4fabbd5485b3756159c837387ee2a36d9af3ba0e492239a5e969b597aa70b62e2c0bf906c74f7cb44d735ed7bba3f7ffde7beffbf9a7542c170cc6f4317d8cf1638c31a51847724a1fc929fd9c53b3d97830b9c0c890539a68b597aa70b62e2cd3c41f37cd759f27a734d16a2f55e16c5d58a6893f6e9aeb3e2fdf396b6d80c62c4db4da4b55385b1796690e36cd75de57eda52a9cad0bcbb485099be6bacf6320e069050552fe96bfa594ff524a2925b7e09c3ea7cf39e79c734a397f8bbde96f1a724a1315abbd5485b3756199d643be1f1c37cd759f37200085807ce71445cec3b0561ef6005ae4210f3b843451b1da894b55385b1796693de4fb4770d35c1721e17d140220262224a63451b1da4b55385b1796693de4fbc171d35cf77914da80a8190874bda020110191e0a5e9a5094284060e2815cb0593d16c36e42847297f74381c0e8bf7def314fe17fcff839ff7e0e7bdc24b13adf65215ced68565daa6b9ce32b9c0c8a01a948ae582c968361bda824927a734d16a2f55e16c5d58a63db869aefb3c39a589567ba90a67ebc232edc14d73dde7e53b67adf9cebaa156cb0037cd7501d5564082440444827f48e42191af582a104cfe0f5420b860321a6b9db7ce5b6bdf5a6badb5da712c204924a734d16a2f55e16c5d58f6e3273e209147db34e775902492539a68b597aa70b62e2cfbf1131f90c8a36d9af33a6ca5a414829e861e36783c209107f26050e16c5d58a67d85b3756199f6396b180d4ac572c164349b0d0d92440f893c90247a48e481a0077a1a329a8d8643c3e402238352b15c3019cd66e3c1f75f81e082c968fe3528158be37c0f47d1f91e8ea2e3384eef8ee338ffe1f7b087a3680131112121a73451b1da4b55385b1796693de4fbc171d35cf77903025008809888900885b3a8f3b22fc318c31e8a489c50551d13c08181c1a4c0a02a0a6210046118846310044110042140100441100481180711e33c961e4d5d546c0f1fe3d3c68807e320aaee5817cab89c637c858fcb3ce673b6744d102239ee892080e50464082e1d61b2787ee8280408723a36bca5c24a22b14ed34e47ee50f711329d25bfba6348d157c93a0f47216488a10da58455b81580b74a3a52d921eb3423d631d516202c9a06990031ac9232d2d1638b1d756c51476cf7e8c41fbbca80ea81ef4e7c3bd7238b255025ab78fdd925b802aa1cfaf726b404444f377400f9d5790b63e2a117c8965a44e8223a9aaf5400aae0b07042c8bccfb5992e83cbbb59485aa009b8260413d49173c776d0aa6561de55af86692a9456e0042eb35c8375ff795dd2ded75636fa1c8bfd8609d957dc81cb9f0a4074ac8503e67b8958e375ba1c262d248d2e1c6b735c56c6819c80749485568432d2383b21fae41857334de8ed6b43ed780d5f6178c32764607fa2a7602cf3b135a0a8b4ad62102db6cd524869914c18a8aea8505e24097a91b83d4ac939af895d8b614ac29a482f905bbaf7b9fc6bb988af3c4911697a3aad3a9e80f0be0bb6991c6d4edbd97b01c56b7359679e253b205bac36085201c324536563dedd46ac04ecd5eea4f1492e92fc319ac11e7b998334a1c4207d6a8b105dc6451ed2736f3426ee0ad2d39468a2ec68b142dbada17cae6dcca9d3dbd3f274da2e05aa5a5b5268e80ebcccafe91a5fe66b761903c99a6656dca82d92decdabf4ba03ab09e863ddaba009ac36d751d3bffdfbda079b2ca1e2bac211442c4b925ee5f1688e2ca0aa1eb9aeea428b6bad4a705964449b9c976ba1f5d5da13ad8f60a89959a46958b265f6f0a671d3c40e62441f47a4d0985d152dbcf218e5ff272bfc152928b4f6ecb609917493e8284c6825c2fb60b7e476a03cc1a9a6759d0425fd7c134eee734684a2240fa2ae5ce7dfff670e46dee28022753ccc35f5bcb987332ed111febb76105a1e5887aa1e0fb37af258fc3a5e196eec4ced942f2868d10b37c144810ead1659dcc201be6dc1272027d813f48c9a6ea3ea05367a24f2a8f2afd743ce8ce72e55c07c998f3962b2aa8bb4228f0c4a3fbfad352da4d0da8c01defe5018578ef0c6455b77af6cf7e8c41fbb6ac40ec4fd44680dc0542249f866578ef9469ec483f8292fcc07f898af4f1277e82ba06ef5885a7250881566c7eb7cb926c7eba1a117807b82e8fd21820dd18b164c4b0bac8e69c652ceb51655902268c2a5929030e5546999e3608931186d7a9ede9ea07a5729be738a9ca6f5fab5a8ea86ae8229c9405e7e8a415b3fb44b0e27faa0f3095c3c55570ed00cb8d4aafec8460d1041e9e839b5c83eab2a4337d61edcb4ec9151ea88f3104235b25d77bd7a7e08fa1e1fbf835874cdd42c77566191350475a459559a38363bf4cd1b7320aa31556ef66a45605d6df768c91f73f519f4ae42d3c3f4d9a1ff2cf46b5253d51ce3d3c7ce635561077c235671240296970a5fe9685e47995fe3f58d777095aef7a83a5bca9656d84811b01226300c1e6de6afb3517354e5ec51aa361ee7b4d61c8d3f8882e5d8134a58b32320632828d06cccac6a16a51e6d591cb83f1c85c82166b12ba111a475aa35b831df886928c474e5309a2a58ccb7b48f45aab7852822879c6d66bd1d64d35daf9e6f346c6b4e70c9e7d1cf3e6a0e6322ac9db291f36505d109bd09a34c158da9a8866d5a104ba5be51a5614ac7b25ba431586df49e9ea5a1ba138aef3965046ddd0916a60c8b3b2197a29a917a7ee25082cf9fb4c2bc1b2a82362eb7bbb9aba61349ca2cf8e27edfcf3fcdbb7999d2b0a8508c19a63976c26c32ae086867421b608276edb43d9aa376688bcc911db2c5c32a3c9ac0a56c02e7e0845d76f7d2b3095c93b70a87fc1bfa91ec6cf3c4a6af9e80d2a2c6d5713beea76e3b32bd41eb63751ecb033ee62bc5e5c8cd3277749dbb7374169956c0ed849682bb5f8121c84f63c8bad16c0c53f3037c98389c33ac6e0dc3f4e8d37704d4a3027ae359615d30d61da7036dde45cd8ebd6ae995430a12dcba701208e80e39cb48b1674f0bf7c844ba0d6d803bff742d4b1132a5f8f89ac1010c9cccf42fe4595fd1d0f1b6637c81b7b018c9e1ba0d7db517fe037db807ffd288ecb626f796322529030706ee051906ae29b30fc26f012a4b30273ca18545ef04287cda9b1f2361f2f24f7822c62e59654bec4f80220abb664e80224af3408aa1980f5e46b0008a21bc3cfe18944547f040052faf598822348217910f0943660b4f9888f222f242655623d8e083d98bc89cf385d4b34cc534773717cf4372a74f2458b2d873ecc0bb4e28952c9ecc92d98a27a57de6c9734e2b9e4fc9fe424ec9524a24a625a46c1cdce0d93c7165542d5858d95d918a510173512fa7cf33956cc755da2894cd1357cabc50d7e1e2e90d3c2795cc5cc34cd00a1fa91a9cce1bdce9edd3881697a2a1e1d50c553acc2a558b796e59d1a43ed1a4c49d2e3ebb56b328064ec0431d8e54afb4fb064ec05bc07195d2274120a8b1b1810d61528e2512467e0a71996991716c3a57e11d86f58a8bd8557d8635a6b85c54daa1053f5a23cf30c912ca22039a142659d59b0335cfb0dee9aaf08add0ad0955896e74ecbec998b8b0acbb1e26bd8157569b679f102c6b1d00db19e103e4c1e9e56ab5ace67ed2f7242b55477970c299a5cfa75892c7289613a996e05c670c053ebd24457786a00fb9dcb8011ad0cad9432a594d2294d2fd57adf49f665e8a16ce745e8c4004cf60cc91e1ac8b0c614970ed12117eeace121d96333842765cf4b49bbbf489df304decce1fd9e04e5cfe4982fdbfbf9a5ec2f42e74ce2c9f912d9054ab17309e33b087cf5d95dd7d529579d37d875d53d940f77fc2ad2449ae7161ebcaf6b50e655df82b278af76202757f4e5a90acff56b30f51ef73518f32adeb35f8330ef95be06efa3defb5edefb4e5f83df7b6f7a0fe6eb4aefc17c0ddaf754a4ea7b2b3e165f0b4ff5b50b172f1d56c9a24e35f0ec53c7c58c97c0e329bb98dac53cf54ea59ef3d47f9255813c4ad93740254af2cb9c3d8c3032a2671f00cf49e02938b95ace8653b238e7e7502f92abe1a4475ace84624a60004bc20352129f9fb52626650ec2fdbc795d0c97057796905caf3d902ce9d7c99d3e56a2973e997b512d52522925134ff29065b1cec0c34d8779923235c106615053e5e0c99bb1e4b65ad082328aebc3b6807241a7200d8bb4442967673c1851aee43efcc2077714479b53798659cca17d8df95abda14ae464e86ba53123aad7889c64a9954b610e3ec19c5d362c954a25a761b19e405514a34a078d583faf0472e1047374f355ec3aeddcef74aa7e3ac1de87451bb6f50996c2910e79cec8eda6dfd4d2b44c702cd5cde4608a4455e165715574c76f3a09c22275ead43f76718c6d37284192c4d9f7c15dde65387380ea9deba85de46b57ad8b97438c00cbd3ea636b869d3ebb952f5b6fb0432100c2d31b5a049eeca4ecd0c60bb7bbd99bf9c81377e600d6dbed78f31309bd7272c79baf32f471c3633b508ead9761c8c362a75eb8d4a6666448599c5d0e9ebc192bec796896723ee16871bbad60e1b36935d0c91d270de943b2b6de99344ac42e95f3388dc659344edbacd5f838693ff68c16d17a67da84a3ad99349a709c453393e6221ce74d8689f855e164c26287294f815da87cec990b17324a5aa88bda0aef4c12c09ac90b92bad6b6aed2431de5d95dc8a896bcb8d1c14b9f4d48136e6609bc23f68a27959f55a6d1b4227b381791fc480af00e4f6d4699b4cea50a979f509d415376615c65748bda4a9bb540400eba74594f38da670b4db099b4929e39613126883b9d0bbb528e34b5f0005e38fb4c4abd9869b7d3048a04dae5d953ee81540b4da25caef08a3dcbb353279446a3d01ab5512ab4a80a35a256e88dc258e41f5eb123b133dc20156502820e7605809a3d497564edbd2a958bfc179c8f9a95df346d6f4179e53b9003fdf5127978784457dd09648fe844ead94cbb7cbd78014e2dbc9ab1ab5415d6456a589504c77d2cee63711cc7712c0e64b13890f57d9c0d2c962c6846038d9d968ac64eab860d172c64882b711563860ca45bc3468f1a34667880c59a41f67dac151f6bc5f77d2bbeeffb58accf069689652242227330643918b2a814559941164463468b869dd60c1b3bad19365cb0b832c455eaf489ab18302a6264a456b068a1927131435363f322c64a0c002b07c7c11000346adcc0986143c7756154c4c848ad60d14225e36286a6c6e6458c951800164e8e83210060dcccd0b121838e6ba7a5e3da697d1c43e28e54488832e97aa73a15e2a1139239804b859ea50831138eb28443fa91691c4899f08a8578a857cc220677648ed11a778314a1095bd22b1fee78655049893d3b8da4a91bdab2541ca449722785018a1d3f7cb43c7b0150a080162a262fb9bc318173a834692cd286e650690eb16bd67061b7aeddd050efb4187625fb080da5c02b762d1dde3934d3833bdab75f8cf3e1f260d7e85ee5d96f7c0a5025a7f3f983758408e9f047908e863b4aa41f6eb96a0a7fdc2b917ebc88c11ded37a35c8f3852d56af6a3c961bf2c5a9f1db33bda4e76db7b18f140008de706120b7884c49c1b453327b8a3ea258bbde2e7fb452f6499a976dc5aecd9533cac3343822bd9ed7d35c7a0fc4d05ce76476ba406fb7e54f66dc75cbb83dfd5552c3ae8efa33a0d8bd4393005d05964d57b4743aba299a826978bf7d3c4b67c2e1047cf9e6ad920f2ea276d3c364a220dc79bef709cceb9055b3c2cce3945759824776cf1ccd9a185e28ead565bab82856a84d8621d769411334f78441108a367cfb14187208211105168a620b144c82891888030b292854b17c929e5e4976767a09db92536afd4407bd6f2ccb09191c8e9eadbe3a03972c769f446b207c6b34f2bbc73729e5798652d9e523cc3f8711afdfc9441aed865d410421619f1a34432b2c133f1d348aed86d0da97cc1032c3fa7d111e4ce4aaeda5bbd627f7167c8681f6bfc388d64fb680211422061040e6c304e2350aefa013fbdd51402e3047eba94a194acee22cf8729035810d1122ed8787e4812736e74aaeee65440a47fb7bb8bbe12b158f4d3b916fcd5e2e18e62abbb8f451673b854138f34f1238f38bb5c977b7fb83d7bca6f6c50eaa28b228b6c45f79bc9e15d21ddd1dd43afb5a0dd512559bce08eaa981d6a4cfb41c67555d62ac3f1c7d30a5ad661b7b11ace48a72f1d26499d3308fd0ee98c0c5534bc622f41b9964516577047b11eb93ffc489ab2618345be21e6b89095d11d65122764c8ea852ba5586d7091244d55da7755f25d856c2ff985adfcf45abd2959ac95d608f110829193f8888fb2b016ceb9cab3db88384a4ae53608a5f6b2ecaeb1f4eef6cacc848f38b0057f31920e77e42346e298091fb16b4e194d5c294518097c18a2343f9275584a294367d1f60febb04bda135439d932e43c3ec8c49c1b3fb2d6ee9af16e19eef428493775736783327260727b3b1fc5b064adbdb753a938f71af24a05faa3b4ed40400d0ef69b5125504892463d8c9e3d02577aa0c03aec319edc511aa1d02302507af40e95ab964853c70d2c8a28b4e9dd2df84b060ceedf3967a25ce9528aedfcd3432a591dfef421ca0c371cadf2cd844a1cfc52b2586c26354b2efb4c0c6a10552a2849cf4e73d3b9bc195bddcd7dd2e6e8b2cfc0e006c34cf5a2bd3dfba7a2c949d52550ee12207fd1f0e315fb0c67dae7eb20aa1a872450a8f074b11d50786e482a343437f7abb7aafac6e2910dd784823b76b1187b17e3c12257ec513c6fa975469ebdbbf6ccc31d4996ad573357eed86ad9e8867ae8c77b65cf9e9a4a9ca0ba366742ac33c43aec2d68b8cc4c6613c9e2211e12129a4c246ba82bc11d7b68c62e0729993116ba407c820bab30efa709e736ba1be8a787d2a937984203591fee0c7968d88a69e23eb9cc61cb5bee5060cf7ee3c53471c7d6f3978ab17247bf919432c5014c480f579e7d88fd68e68ff5d8d7dd3d7b7673d3b9ceebb88eebb88ee3c28f45163261acc30efe706777b4b124efa7057fdd8ca51927639d19ebb0cf98e08e1d33dd703b980b214e26ebd81562d7d8b1a7f2ec3d0327e38238261df4ec1e7884dd9b813b2659b4937a87d698e2b2ec67c88d1d3bfa9193d1b083f50a7481fda6bed28c0e61a59367a73775f3357865b8a3b4ed984edcf1762edcf1161144088b4c6bad418604dd512209f1f18ef7f6a0e4d9533f82f00fcdb36ce97557eee3c61405d2f3f6351c276cc80f50481027bae3bcdd9cdd7e1349076fbee48dc9866ba76cca642aa21e903cfb44623f9aa0d96567d88f73663acf6af024cbb3fb300f0f1357abe0d99fccc02f36e24749f4d3a45dbcf9a6e4f1611df6af03977de489c22b4964a9dc2a2a2b7e8557524a165e9d00458d0372a72621b11cc91eef69bdf2942611c353cec8535aa3f81d95f7634de2698a7ab4739eb15f17f26091525fdd20f68a3aa53440dcb18a9446ed8ef548d53b3b6cd46b10e18ef5a81eb18bb35424a65eb97040ec9a992e3924ece26241ece2669c128e0b532b621dd8814211b7a902c2b6633217d43baae662bd53a98b40dfdc2e84bac71254e5c49c3e4154192d3d2a27b34392a5dced76430185dbed86c2ed76dbc2855d74078fb63252d81214ee875d1c8c5db4c7122620ee286f49325ecd1539789e3cf94744832bdefc9cf31ba5d28edef9e1dbcdecd95df4e1d180196cd99149b815c54a9c89ba9a05cfb6ea8373938f9c01a4644d07f297e7d63ff0865726d154ea98b0283ff54825a64b28918314d63395ac9bac03d997579778a14f9b4a9452ae5acf40c94569b35b2f390d19205fa5b0f2f052e54aa2238a888ea8cdf028994aa5b07320fb327130403c3f2dd89775209e57c985bc736ec10e88eafb88a157d1883916403df50e7ddca6ce793bd72103e4ab7300015e9c6c276e60e245e425880517a014f122e222094494e0033e68010532bc885c231cb4d003292f22281f58c420c5112f22a71c08018104b117117e020424a6c84106ae0240053c7ce045e4647b35a176087740064498bd88b038e2d5843a65b1d6a9430e30e8f0eaafd5abd9f5a089180d5e442e92d7342a7a02cb8bc8cdc18b0b45d6995ee4e5d18fb343561c410a1a5e445ea478715ee4d57de0529d3984c612a024a11711eee1072ebc5aacc3d5293b2598e8810d5e757e13595dfa98a1dcab86403cdc6a91faab761248f5aaee71053909745f55862b74a97a751fa65c6b287bd552888a382ac2ca8b0dae2432c246544412911135a2228e4a5c08645fa54e3af5694b39ef388e936d4d6815e6cb2e5d5ed63b08ff12ebf2e40002bc28139e942ef6514ac99e9452ba0f15e607e197d283f0cb6ea1e6f67edefc3cb0899c92553d707ee1adab5ae5cb7ae1943ab582330b38f9e73d4e9f57eafcf6ea73d9ab22df7206377314f9769f3681a3eab98e44be9d82dce90035bcaed6da27ead6039bacc05c7777d3d34b295c81bfb325ae505a9d7c4d6ff7990594dc7a8f52d843d648f271f4455e455efcd3f9fdb15e230917884c922f9733dcfb8ad67e1694af2ef404d4f8a6a7ceba0f417abbd7d705b79d67cb9028e90755821241c0668e788f705d0615fc373f9ee11d08b0c2e2a70b81b94d5b94f79fd986303924227e7e945cd82bedd15b72889f3e3d474e01a609ed367eba1c6f9480ae3f87a33492b69b007676cdb04ba229b5679fe150b5e26972886989750da03a359c7245a757029bd0d9a49eb87eea5396c03e6da96909fc29cda8ce271d459e5dbee848e40031cf79cf53375981bbeeb6f5c5862b30754a47e0c99b26edb384e9d12e5d2cf7006a0284e77d885fe4c5b907647679f087f3169a00e1793983bd4f52be6a036c036868299f1210f3edf239b049cf39b9bed47005e6bad92fd43bb4f65e21eace2b107352eeb7b287b26b368e5a5de04976b1271114e5eb749e21abd095300d406da88021b472a09e0e50bdc3248298f4494791f6e615f83bf7ecd7759d801abaf0f9a04ebba39caf402d577ba69fb33cbb8cfc3ea64bda551dd5a977dcb373d384fe26973e19805a205d25ababcf5e290b375a120f22994f01aaf8987670c7ebddbeaadaed1df96a796b5fcba60f454752082ecf4e7934e0cad7c18c6e49ee8b09eeb4723392ac05bcdc70b9a42d92c51cd251af68ad578cc41db5d17337166bb01d08e864f09ad635d97d09baad1667f311e2d6b2414467610e7714bfc51c8625094165ce0677b0c8be82e18ed2a8071bc5302b2cf5c379f59bba2dabec85ebd46192b0ac728c75d8bbe7a41ff561affe70478e89d389d8c5d1495f9d5d148570f2ec39b11994549f271c3739e2678b60dd6f601d902884ecd9736eeac6c6ccb92f3c70ab0f7309f5d56529e67cb5d92588a4695d35d3c31d55309871ccda6fa6c4498a2b0aba23cf6696d2e81c298dd28886b894f6ec92724538b88245ca8fa4a30a143d7b0a5a786e54e0c7d01337089aa4a91dea0d5a20dc244104356db0078b28f0703b1bee6891a470e08f38bd25b6a6385b39624b72a2bc37889f674f89393728987342c21d45915e3165c31d45cbe38de7398b38273c5a9b5ee7387dd53f5f02e341ec2f51519a7d77fb4220fb82710f06fc69f2f279e98463823254783543ef93b19d70c85061b19342e3073746ecb25161d78b777ed3f94de7292994fa0b683f19bb50364817ca840253143f7eb3efdcf3c00f85eaeed94d5cd3a9544dd354023db02718933d35d9e379e7a618a4eb9b9962b2e7fb709062e763fda9319b242336267b4a1efbcebd1268f26fc6ae6a448aec9d7f38fc3c7b67e4d9479ba40f34895bbef31195f45d0088f8ce479ba4efbc0406c026593729293736c9eabc504c92acce69e070bb7cc955983236d933bdf3c02e95beeb6a9282704719db77d3c71bdb775e03c98b50485dd7759deb6391bb2c7228f17b31bad33be7e9407b7b879d731e3d1c0576f573de8288bb43f6a8788e47efe4f08a03ba3c37baee3b57b12be73b6ff54e53ef6abeeb9ee3b183450e85c4c4dc2263e639e79c6e6a9f3de764e6c973ce3927334fe61ecccc3f8230733fa78298273bcc052b4970a72bc05b313f1629a5f38d78903cf5ba45ee5419c81d55af585401920167a44651b17c75e2a9571b2d7a2a7dbcf1d4e70c673562af46fc32c3497dba55b763e752e8a17a63915a619142b92a6f02a15a61170d2cb7fac8b3c4863cbda23c346277e431ea1d5b8d9e3a9f745cae30fba276d96ba802ccbbe2d9d480e4e06cdf77b43cf905487fbd80cd07b1f93af32828bbeec22e0b3043d434e314839c5fd865a13de69a23a61c833047aef349870d4db23a3554f3aa9b64750dd8558226bd4d333ee5b07919be144956ebb0a1c91eeaed364fa40b25e442adc026cad71cc99ece6968b2c73a8c05a9a3843806d40a66a0523a86d2686bb07cfb88dae19be6098c8626592d431bfaeec29a231ceed07717d6be69acab693625bfd0f9a195ac7e2a1385c596a9c9d0585c31b9d347199a4dad348507f3c2b52fd929a5a15dbf1b9a5a67a569a76151d2fc74a6296869591402cc0b20a88af9e17acc0f54756dd7b100fe84a37b76cfef9025a5fb3e8ef1d5293917e219da06754139ce47f65248a733bbc9da6beae4aa6402a5ff8b6737b1a94f0828f2f6db678bc576fae3767f083b097b893b7edf50dc5122fdb80929eab18a0c60f0c18f9773c1f38c4c1941b07c6977d658b70e9bafbdf421dce97c8b99123325664acc949829315362a6c44c8999123325660a1d922c2e089ebc19756a95766b89e096dc932d27d317d34c715b6febb90fd3394d545210ab4c2ad5874753d15b1f4d55deb2890a73dce44c36166ddfce7289fb189c990ee39c5f7066864baa5f57e11ea70284710403a957d63dfbf1cb8389e1528789dd7add3ace100e0da7d63b9cd3b78e4383ecf96a903d25af208c23d6b1ae02e9ad733092de3ac3b8f5ca7a0774471cd908e3f676745b0aa92271471c59efcc17e7302e4f0ea87e431c59af7066bdb229a41828b848386c8c24cbfa07bba38d908dcd90ecf9dcbacd0e6e43eb1d53cd647b6b23746d5f84c465c699b486235385e0e208f58edb7a65bddf3aceac77da86138e38b4b730305ccf618edc51666693c44609ca5160a39c9022ea0a2a8693132813d81e9e6e92655fb8a3e916932ceb9e1236b0bc751b47b2877a0a890643c19ae7db4827982340669737757b0a8b74c1b09e3a92d205830752b43ea6b2bc751b231ade7a4a267ba8a790546079eb2a8e640fca4de08ba34093c3b8f113183c30452961b14f5e4cb41844bc5dd1f0d6c714d24a26598c7293a5bd751438565ae3cc4e6f1d27885d2f4eddc6ae17c791e1c084e0f68f38b25ac24df6d47ccddb1adc1147464d5794b068658458b42e3363d13a922b232433a3a0e9c6a2f5099a8e587c81a7096c04753483b73e4fa8a36e9431644f3047eeb4994996750289b75e53247b506e7b87b73ed22479eb343a6c9e968edebaf7c578eb25196fabf5d1747beba69ab5f79a6a3545d66d66b2a7ddd21d7064666fbd63d824cb3a0d1cee88231bdda6a3e651e1edad373834b6c016445c19426e7b8b237beb3832d9c33478ebf3f4854072cc3785a26459cf91f35eb8e4ba55a96e6871824a492ece2cc491b168adaf985cf61147a7f6a2041ef5588c3f9fe680bc7f9a45be9495cbd37a84840b7aea1c08029791a8c40db655392e15cd4c00089314000028140c078442c1502c1865a050fc14800a7f944e7c589c49d320c66114658c21861842080000006208192019a1a406319905401036448defb1a12fef12830426bbe599e630c354f41583f2dd27bc1eb3030a65b74e995ffee32f302cbc548a19d3e76cc5ec8d9fedcbe121316920c2ddc14e26c8c704619068cd2895038b64ef9b69f4f2df0df503150d7b822a0e9b784b60bb386251599c1c08d19034a1523bb644ea7d65e4e0dfeb6ea996371ea94fb00c4ad9e82f2376db1292759c54cb5a2e162f2212dcbfd3845f1d1547b979eccfcad416fb7cf1701d21209e801b1af6590eb1f075cffed54da0653d9813e2635e58bea29428119619d715090f964f637a5dcb9dae841b19ee024aaee06c3402ad318447fb70b7b59b7cdbcc0a8a0eaba6746be8e111642efc9aed8584251a8f39adc295e408bb91a3fa25a49c72fa5f546d4012a3f2d1894b0266ed161943ee8928f2ba29faaf70c9dedf7a19c6b060b2ca066723af53cd36580c4c8c083a9f2d333b5de0fe47a7e55509304369d3ebae3cf347c06c6f600c187c884736c5a478fcba5ee4bb2497000ede0739bc2227221df02d8e448f6ec8e9e1bd1ddc65cd159c6d448833c479b75d0de5819760644b99d47d020c4cb48c706e5d90be93d1dd1a282b316d44ddc44dec1c9561d3d69038dbcc0dc75f161742c5068678f8695c37e63b47c8fe0e55a7abba338420cb652ae3e2ee463621486456c144c671992d859cee6c577aafeb739b848778334823f7802a1848cef6a0a725210849cf0b32c07eaa401b598420863c3762454622832d16823c0899c06a374bab4f41361fd02371e1eaf8c3898362a2f28619202f04f142d2da060ab9b106c713e37184ad07f15c347415bf71270c08801d2482050d57707d3112d2bd6db929668654eabfac2908fa73f0ae7e18167278708c818116829b5492352e2482cd059385da76e8c843782758961666b67b426fb2c710bcfe0abf30fdd133a10f671908b85131ff9cae2aec1d40202f0707bc55eff10828ca47ddd0a015565e7d7a28242714cb253c4133c34777f343d0e4abb65093864b2d23ba126214ec42248ab551ea20db345ba89baf97389a369a1f70c966ae7c27a5d1b02f04f8a1273d0ecc9961ac4857016f8c83e13c2baf3d3846af08da1aff82e6d9721fa25f551a7b67cd6b89cab11ce1b9a7459219cab6f17d1bb13ba60c6ec054d2426607bef867ccc6186de2cc88fb96524ec2506dbbda8f7a7bdc255469e4c815a31377893af210191805c9182c9a6bdb876b4d6c7a55f52402b099b449da292a16dae77f81c2a870f0f12238d585c94445af8460896a8116d45c54d105eea0fc783cb05dcf5df58351802a8441ffe8942811f08a5f09d20aa2c61c7a4bc813e65782c71df2033dc8367633b3b0e882833e1c119210e3d94d60e460321a43d6af92b353856cb000d2ea06e9a55a6e3c79e28090a3559082169247df9f719c8f1a1d59ea8d5cfcb684e2efaf2f812e7aa3393a8ca823fa20ac2e96b37195c52f7668a90851aebcf6cc120b446941c2f02b1690d933651b849dc0eb49cd35824260031e86bc6cda9560f57feb25cd5186b86cbc09c7041889af0459d041933dc047508b0122d75371b529616dda18a2f3da66d013c4f99e79aa1fb230736eb5fa56aaaf041cfbb669d602d2042911fcd777649a2556077d6ec25d80b0abf16dad478716fc5ca2b128686cb2e71f968df6d777bc138672cdc1a5769a31baab268341d2de375859be5d9508c4c43c1dc3c3dc5f4e7312ccde78e554a9b7367e6ea5d14214282f89ba98e63f72b480b78df5957cf5b5b65e492e520c33d76575d064103161ec669244d76137db8ca00a1d63c618f120f9c68553a403ad430b919f3f55b55e7057268899865a72a6444b2ab3d00a96589a0c8f9c3291bfe03bcb3479346a132a8d71840f424552bc1be4426e54cbc56f0e13d9265425488545e1edc119f3015d34011551dd0cba8872876ab720ed16997db2608950ba40d271c2f23845c43cd12d8b5bf03868e1decb7ce626ea4c944c0d5144004e9ff577c28b78d4cb07b02c60cab870ff495de0382e7ceee3bcd8c138c4e4a2257f63ff66310f2cbfb184c53353b5df60745d52f05c0f6ee7f76133d188ccdeefa6d169dd2b69041df429b6de92fa0fc3255da0326ba5b376fb97c3fe4df8094154d14c7ced0876f98068dd801c0303450503d361bf741953a681674205296a40073346f7b44151f19c25a4928a7550a8e921d15a6491fa1124d66a24757a39697db3765a1ba6e3fd05ddf2c9aa11dc214b0bcf6ba121fb4647a1befa09fcf48a724115978326bb3e7049ab167dfdd084db62c4af26c45bed7f0f487dd5a9fa3a5528fc4701e82299b7b2027d66f0c1913d69e3f23dccb7dc44ac0ffe30a5da30710cdfa402f79394e80a82de8800dbc5e45732f8d838f83483043dbef02fcf45ecec0370a56e776f2e9c8699c4d414187c61f610b90c177131919102b451664d65cf1da87836007c321918513f6d0948006e90077b95130c48ace0c4ec72430beab089de4d024e11a13d0f893877b0b74b84c69c85c66f33c5922988d62216b96c92e0086c9f532df66757371ac2a4605b5628eac2cb180d0cf560421feb43de16f73591f7cabab8f6e5c1e4f8501d9aa98ad8a7a00c976c3a3016000a5276fe27adc3860f39d426df3f208c151a3634cd2bb6c32ba4f98cd9915544c5f3141133168380ce2eb67df35fe622f22dbd7e70d391b06c8450e708c65040ec0132f8726f1bd8e7e739033f3a04b80861d0d4a6760d6afdde95c46a360791d9a70091be162d5476a81f272e5c5e9d1003d2e0b0bdd901771d25d42b520ef1f88297108b4062ea331773d6a183c81f6397deeaa74c216390e045b18651f1cc00c187972bd4e6b06d459e5a8cac8334d0e0d0c441c4154da8190d844b1ef6ebd36c0939f4f91b4fc351a8951155009a26b52bd071615d0cbdcf479b0b34190db97c7414583153de74351e4ea99e68d9f54a424060a54c8e07e079437d2c40ddac18a24084c74a9f625424faf914c1b01193467a599e38769e52327f1266cc9221dfefb6a6cf8ad4023bb2a05692bd1a7e79fb320f8375b358609f54290d18c69334b0a4ba213ebf51e21b3c7b07cd5f8747813e5978c2aa493625e9692f0c5b48a9dc74e1510900d51e80ac86d0f8be6eb8b7e9af00ca914de1a0f0ad484a3b83d2e48fa532cb7df5d667eccb0c2e481476286ae8e43954a2f3fec01ac2835378cf8e195e1ffc31e8119c9c196af406442bac7576991158aaa8ccb3ab93313bc7f21f74cf65b76b072378db5dac523a35661db3118b40bc57358d3dd658baa4a102d1936f7ea80b6442d146f46ad9f86d50fd3a144799c63b8897fdbfd23a1af479405ef4d7a50126a0904ee52ee729da43348d2780ce9c8c7f57a0a317a119a34ef62cdbe2665d890b83252ff3929d2b8e45658009ee259623ed51f6d82dabfa8eabb102653b379205eeccbead9b8039a302311b6aeb42c15b8c86ce907822c1d7a05537ff1f9c0f77c940e7774ed3279ca7bb135b1651a0e729b415753b05aadad0281465e1a7833e39213a1aa595812223c606a3afcf94c8fc67a27027a63e3d1637fc95af86eb4ca5a3db4e2dce513de8cc6d1bf4a4a55b8c97adbda46d83b3ce93f81becb8ca11209cb24fc72269330a698b73a043def020938c83006babc6483ea1adf28a801651fb38c10c78adbc374aa1f30caebaa4ad0839bdf0e3145ef0e357dbc7a461a64a4d788e6d55b90de471d6ac26e9ce50c520350215ed880a989df8b9d19b2d42be42ed00d2da672011653a4874b4b9cccbf6e762db363778f221ebc871d7da276f898927db2ad3bdb0211fe22052c38a7a58750300e9464450d2964e71e6129ab4cc073ded90a5f268c9f5cec9a040d0af887cd04198d1d46cdabb203981bd53aaafe151612e066d7dd6bc611cf534bbdb2d346b92a3230dc78c5e7d40c3ea3a2093d0ff574cd2ae49e0969b7ca909b4263967bb1bd837db1a2726d43320d49413829674539a389d51be1a09ded0515438aa499804a42145521ae7008f4b7a4682ca7bea9b821ff4ca4d6f814424010eb3eb10bbb4e52b93f42e45bb5fe5cc0bbdfba9f1c0f1dc84833f6823d7a7f7fd61aa142cd3351a74a382e0f32ed47c9e25007c2d8ae5a0acd35dc76c5f335e24088a846a65ef80336ad651f9a71d418ffbe69a71963a58ce2f731ac96c0dcd05521ae47a10e8599241e0f684afc637fa3ce15cb14a5772b1d1abe38c73e5dae7623ffbc400d69af0786013f4c5d4149dac768378802892fe1cf23c99b33a855266394b3a81f5c36cdbeb721fc6a84faf377a86ef08c45c06e4381e7c91ee7ff7714242e0f1ad0226ea3b38af38f0c331a20212f532dfafe28d9d4108131ce69279be4e2c127d6e74851c951edf46e30b0b4ef03ecd42111618ed4d45b1c0e5f5a0d688b34f6931fb22b893aa3130df127b5e97405e261bfd6d18b215dd8c49e362fbacd2d2a38e10340ffd015ed190d72072bf86979c98133c06e70ba1a5ecf61618dcf3156c21e330d80f2f3414467059f014382a588e811035e1f03c81ff702c91aa3c931acda5791e24fa0ba1b29ec597e39ab6cbebe5d6255b4e12cf102ff588ece335c09be9194649da047b9709772723753fe5b4722612db51492522354f23af251c7f218f9af7c94f017f889ef85c51e6d6ca29bf81f19845a586bf767eeb60895ece8c8cfb3687e1c9f7fef7e3e9122bb73431178b1a24ffba50ddf1691f47eac958706cf101fea672ff30ac02e3e0cfc50f55e7d4058a00322b647a8da13e58ee67666c7e0dde96232b84bd8445e6d91485d39e18956aa95c66f9faa152222bde5f341e2b3119961d161e95ffb50a87cea4d27f0f93e7591ba1e3248650af1eb5c134c12f653dc49510f7065f7c364517bf07a5b2f26284e180a9d9cf1e279e8ef54198fd38d0f12fd5390a45c54539cc0a87a2fd4355e07bf56cea797e13c2ca54d550c03d74a50756c0fb8de2107afd4b0c28f9782763a047cf72a74b00b03a0d7ef94c4cb82071dcef42e3b00a93d0a85b1240b92176a77cc164f4703543a0fba4da912d81302a8a00dae610ec388ca24bb4507a02d8430954011c7e6913faa801e82a210c28f73dc9c25165e8098f8dea494218ecf283a8bf9bcc2924ba634be3b5559fe81a3e01ab272a4f447f011e6d36c97bfb000f7a3547bd16fe2a224b7f851d026fc4c6404fca3121b3f010975ef756ef85772afdad9160d77172eaf1c0c72e852fd930b8a565fd7b7efdab1b06cb49242341798adacefffdc4d912b04ae9ce2700c822032c722a4b22dadafc0281983ff49c978c898a605c52a9a3378e29df809824b31f6a90c9d1ee71966a13b1c4f12048841b86da7b7e9b3d07332af16317d53a8fae40c6523809c217028330554e18d5feff83c2a965ac9f22e4f5cf2d8cf85c0f616b5a8e5e3a8875d7b87bbb08516f92e8cde642f30165e94fe3831eccd01c726b1af2914ffc2613f90f8f7febcef0344822b7c679d14a010c1b26edbf2b7ad62f430dc4b6762b322fb711cca571a6221eb238ac069846750da0a4fe68ede68a6bc58a8d60e28106ec94d656d18403644ec6da7bfc6f8e96810e27add1c53aa3d17b2089a930623207c4b2e0b5a7ec7f9de142f7d3df0c303a3b1912a21873ffdcb83d6f3001e7c966b5ca05067cc781b0c772e33f6cd25a94f25ef0550d68cc8b1128a254e12ebd7aefd43a23d55ae630f9bb5b22f010a7ed588460be5f9b83c05d82b3900725e730a477b2143474ca2cad9f427093fdeac1372c2df731d67c4aeb9393f325f30e36c17b599fe882581f2d13a162b605249719d5ef236924de903ffe5f5693c2b1c98342401ac113ff23358e1bb227f694532d17fd0515ac2d9a73f08690fded614f195a53cdd2ec054dfc2b6684ae181ede1d256bb213be80f1ad0d015eeeced7d54221741ba11664ee64c2e0eb1fd1f1319a08a193ac4c5334642fdac755905bf30a6bab28c412ba1d3509a065906cf2239e0f99d7748db4aafc7433d37354d8c8e522285c28e0c1e9f07f14defd55c878ea647c5d469ce7052b82c960770703414d2a01858eeb3fa0b449f909acf9e8c3757f1013bbb709e5d534b1456e07e9028b754b3304396320a4fdb1e80f4e74b0d5626e346e1d8c4ab139f767bd1d898ea1c5acff74e6016b34ab59158e5ec315509f805994cf21b016256393ba37b5baaa29318943ba3e585bcfd4ab6c67d3171d4a62f69a6bea02a6025b8935631157141e94830b11df22f7ed013f8006d30e45667bbc7e737232cb4157629416885cb8d895e619f0da7c40eb27c8e32a837582d8495260d1c1e72568e8647f13e548bc8d52be306cbdc3635f79f7fc34c59ef4fa1ae19440b84f7ae32b28d05aad8180f5276b6742033b184ddb5105e5194b7591f4ce2b3a93f2a1bc95013a8d74c54617499d9e202a9a40a6c58e37ee571cf6b1242be2d98faf0577a8bb6b2f31a6943e2eaf16966a923354dccee67a726726d169504075a5da8582b300147365fdf019410fe057ce74219ef828589a893f99976c1cc01b998c1052d6cce8a89809659b97c42c87fea3ea4de6261b6203afcff489222174027ecdc80256ddb5d4bd6f25fd54e375ac07105cf2fa2d30222591a36448d4645aa9608442be91e0ecca90342ad95fa5c523c7205d4a1f029bbcc88c16187fabd01cdbb70a8a8aaf8dc8159915717472874c1a69090d94f42a28f0f0850fea5d702258fbd2f544d84c08dd411a8578858d4c00d62546c69afc070106e0048fc58f96a126d04558fbb6e7fbf7545ce2dcfba795f5353cbb57c68baffe05a3ae89ea6c139cd19e5b277ecf68403500d3b860306892f2aa2347d1a16ca1e2ab9aa833c7c3564463aadc2657e99f2c006e3cbf79c3f7e5782a7a80cb5e4fc8078210cff50a1e8e5ad5d03b154ec2d2e1e37b65606658cfd75512f0c41f164486982cd1ef3b1eeb8c7cff3938792056725b63a03a911ff215d238203f0e52f082691ad199df10d1bfa2233db5d76100e6f0e77e242a14e0354721454ce068c15942096e3419a2075504f1d4424c0ae00fac9bec40f89604b8fbc09111c15850b3182d7eeb28a7c1ac897e46cb89da1784d46a0c91fc4b00af13dddd9989203aba8fcf925b4cfce0ae4410645a3396fb89e5cc86280f0c8095659332bd92b1ee068580ee403b2d3940aa95a35c60103f5112822b84a24660c6292148e53943f88e1e587ff232760cd3f4f3d3303c20c081494b4fae5049efb32e6849913197feabc1a87f4aa5961d67b8bc4c28ea3ba85152de7b89c6eeeef015e3cef4983f2487502c95f0dd3c756d5ca2bcdb04b2b2ad114db5c5f614a8ba255ce745d1c0cf6dc1d7925863310aec3330b42560daa8b35cd86776214a6f23139112e02c15d79e300d6ab707ac65d3199615a95f9390aa9f0120932a73ff816db9f7b536a47ba4ccd3532213b9f3b0f70105d4b0bf4c3ad93960b862627759fda344609de92de5eaf679d9a8e6656f263804708e46a64ec18f57433e4cf8861be201b7df271808db7d312d848cd054343500ef7092fb62e55ecbf225922b9cd2fc13d2ad940808ebdac3488dfbadc173ae1339a43dcf4d91b8aee49adbd1ebee350a22df2ad11e126e568c29e635a794d0c7bce1e68c3c70c50a74767a3c9198eb4c8125ba1148dac8be00f716756cc76014573e9234bdea10ed1269a04915c17b10386edea4336ec802000774d31fa710fcef3e56458e99f76ce73edbb67f8c22f82ee9c314c31ee86218d2e62f709281d92baee7b7c9464cb1a77c8b300aa5eea071159c7c03835c718849f99973405ec5a354004242b1a955fc555522d26e07909e99f5c12154eee39d83713f7bef730602286882e8b9786076be0d6916ca804ab719029de290fd8937c06ad65cae46dbd963aed540e7655f93ee7728dc26cc5b782a45c66e706888d967f5aaed53bd8fb750da1cdf4fbd8936afaaacf342acf0cb64f42e005aa016945a13564f3a3ab3bc954883b06cdfddc6d6a7e739b83c8542e167159fbadabe5498a7cadf8b0b80403515daa813377b021b029f70b6e0a7a3d2864e03d09c08a4f1c26b38da430233490180cf9a024bcd0279d2d33cf10b97f69b0fee463211224f8f82a9903bc1ed39f6a827e55d28f8dce6ee9d048e4816934a5c50889c3f8ae37a9e318ba1273f1a15a906389673e10d66d8d7f86570ad994cf26f5a46958a80c0f0c14cb044a34d571cc444554da8d80f9f0d537dfab05ccb8ab68bc27c81e41f267dba46b709ffd4138999d164e09c8e43a657863fa657ce061effaa40400f7c4d401700e098270ab9b6fb3b38ee155851d2eab721c0a24e302cac2b6706d4d08e3a7762014d0dc0c1fa1f77ad827f7477b09835f2950d8dc3986bb4b7f0cadd5210d930a784efa99c672373d2c02e61c65fc98c10ad89733607611a05b5518f8041e2077f58f82bb8ab38d7a8d645c4daf8859bd24b4cd41a835ca0be713e35104a7ded2bc0f8eaea7fe1fe9b48bd69855ef0158bfb80f4be53c5959b465e25160b2b0804f754057b90cae7e952fcdd52891e91340387d294bcfb0c81ea6916ce6e82c57ea7df921cda41356b44d79d50d0b9e1cb5c9740b0f45c36551d0556480377fab518e97a47684d93e79b4111ff8c9deb16f4a86b6a9828ce088aefb05110b575ee7bb2f37c4eef3a0f48d802ebb83ea0ea18573bdaedc41888d8a8dfd12d4d71f739d502e341903e9e1299cbccfafd1629c75211f629ce03303cb437aff636c3e7ee52facafa2d5dea230d3a4146737d5aeac633578d4ac4c45030eeb7ef2fc803766f2762d119072f94f10b4f22de071d51a02b3c076381e68180404f64a409c5c8e2f0269ce2e050855627c66b91a4062731e29c0e2a3a8ef0513a30073b19c8b7195503d105bc243c67d471831a04b704d101178d303be30d5b3fc5d47d97a1ea3d5949171fe67a9ce9275e8c55313867aee0468fda23eebcfedf89758933597b97cc8e8c63310f75d6a62b98525c97f93007e7837f14b924e3bf798c1a9ce7c54d8b9b886d064767c778053d20e8d3cc1cc77b4c370ad64527ee2b4caa13d47010d930001fc371a756dd04759703671112c6992d422e4e600ce5a2186e8d8123f9832ee58301f2d4f0bb7e0299e41932c207bf6ffe513ea40c4443287fb839378408c9cda8c512ff79a52d636f72989f61115815e3131fbce193a5b4e79b8e13de2e2d7d426da130e34490cfd99017bb398df1c10050877eb3456bbdf7868c94ae8bd47dabf1bd2780bb60cc0627bd3fdf83d296c5ea37f705345977d5be83f01802036d9ee85a1072eef3566c04cd982f753cae579b6daa3a01c706663259a96d26a562852e4aad7666e8194f499b8d35fd786e28b90e01580a7ea83aee270ba3c40e45b6a921166f75f0f1ae8310a17542ff37b3967d034038d834c9ebf8ffa5125a5531a950c803a40c9956caa5087d3b0aea556870572b1a0230abf0462416ea2691813624a2fff061c6cb533870c2671572ff004be2259799b53dfac6fd0dee9bf24c57ba4694ad61eccd7828bab00909ebc1243dd66283dd4676a16de2def7b3283a7ed8c530dfa212ae77bc04c35c819b5ce400a00381b877d673c07ef95af1b357529f3ada068bef171ee25693e15c3e0f10d51703abd3d924ffbdd053951a16df1dcbc0d455c1970260aabb4fd85b7f5de41e3b9b16a39611241d2d3134d83e6ebd73cf331468c9d5ceb8bc5994b10ef4d6a546ecc07656383072eb0c54428b8dd017fa4d9668381da54a80a0147e362571d0401b9714c1f3524032260c63f2b0cec9bb64deabaf715ebf9416210a63969b25275977b1794facf7509ff54b03dd1536fab4c2bb43f582f559cfa81a5c659d26ba3df5be9e73e9122ae6a4400d82ef0a9d05e04b89ab82e06be38b8983282eebab7e39cc461cc365c33d72ed502f281c764321ef8352c3aefd87cae6d2cd4462e5bafa88e81d514fc5020da596a03ec15afd5fa17309f8822e8e8d92a303ee86f3ce05da0b674e33f527a7aef3b34f30fbd6542b34a5223fd5076d23d77d00c482c00a69aa2f873a8ba3ba231fbc79522c08d966b153ade695d8950ce04d5424bc5b5e0b7b435269b18977e76500af9476c806634d305dfdcd640836ae6177c08931743bb011a6508468b6d70706005f15df692f7016389173ab37ba7832d44140fbc6f8d44641fb0a005f613be1caa7d06d13b45e405bbc4232499b0bff03783c28ce20a87181ee534f256303fcc4f21950e63f7af0c4f0d3596f07f99de52b5c4d0c96139d5fe7e8ab12f39908716e420216caad7f742faee4c0c0488b63c0e81b07313a60bee8c3009c9d1bcc1538bbec7847bd4da53bfce3a8e7a2a2ea2e0f9619694cf1b7ad70d27b3764f5739229eb3d49ef65931476c98e56dcf439f740bb6454e813eb0e73f30f600dcb1d221f4d2b6d07a4ef2aa57a662c7b3e8ef1bbe22a4d6ddb9633da53428c207e196f441589b3284619bb50593a473eda21f61bb3d0ac98ed6746d84da73de581fe8898db6bb80120bfdd194f05c0ce1060f8e0391cfb3b3be53b7289343f315420dafa5cb1f0cf9ab635acae0acc7ccda7edfdb4dcb05187d21c36c7369ad66bef041a32d6e1e9ca68c5e881c7033328b4bd57fde943b38dd7d2616c328530cad725923af991c289e822ec03ae001415e1e204bb53d62a65dc0e6c4e7a637e1aec81fcdc903c86d804bbdbf28869e83a2b27f65042776a78bb4859305b3b003c02e90289e11150de1d5317e76a506b3e19cc072991cb57466744035c30c22f94ece8663b70d6f0e4f023a5b1ec35d9c445ca6348848b7d56ff347226c3814fef39470d717b4d6a8ca800f547a239ffb2f73c4d3c27a4099cc35937041beb21b88e151fcfadaf368e080cf8fd0c1ab99390afb59c2ebcf43ac145e218e0a5d361677cc03e260daed21a86c064984b16b87a07110899169b562d7063c06e449a8f48b18c7896ffe76963c6c0213f2d15ec263184a7aa0fdcc8396ec8fe9c305c3da2c584fe2ab552412482e2b7067d3faa3157671fbac8b3995bc333aea473c54c0340dc5df644f4de0da9e319ed144363fb80a8d1e4735bb816d3c9a6c4b7a448c5e6c81f4161cccb909782aa9ba3c12d4596c2fc09d80ca8be000ff42e6dd03429a324b178dc9bd3fdba006a68f1e6e01c6ae9ee78a09a5bde0069d482d513163ab882fbb8663e26d8c8b309fddc33b6b92f38d1851a23ed88f666f6f18fad981f824e95f8c5bf8da866b24ff48609fb9847c31ee4e76fb45b074e111b53eb32cbea9824023461c3c5b48f82428194191e45d1312a9ab739eda8c05e4aa15b09257fe01c80aa6d30c0cc293055acbf055fd2c86f32b8c5d5df2ab2375ff346306908a50247c53e1b64ab2856442dfa77b27b779cfd17c125e8e7e37a24cc37bd147973d45a52b89c5ce7f8363ae1edb7f2f5db0d0bcd8195b4997e798bd0b5f9c5adada562a5dc115e63c8c2be9f34145649c0ccce8d33ba8999d243be75009dc5ca4600e623d1982905175e2ba87f58a2392a32ec9b207de1ba4d52bdd23a1bf883f6c4998092e93821e07e806f08eac7f7bca216d990a3a83220ac10c3521c1b05372aa3741a284bd17077873263f72758c5d6a2460f79ce8e0ea7017b31f1dea745de7491d762ef3d435904a4c432ec05e0deea2c5eec9216392ae162f2407c38ea91a2fd55dcc98d3e793511981e2625464c7a36164332740456912236610bfb5fdaadc5cd4157c4da8f6ef73cce95be89c8dc4be8e599e5a18270a898aaa7c8c541a4bd840eb6b5d1c5e5ccf5acfcb2707b7c56a2137411ecb382c8cb992b489ecbda29ecea9739ba555ce29774da16f219d65ded17174560b55659d6464867130971af1cf8b6f2ab5b8e72b36a77ec10331c56f46bd758767799c05c58487ed60e6f06a509b17beff363186aff23fcecd2734136e4a4e78553dcd9b448bd83fcc4e36e924a01b8cacbf5d01150915e0027b64c16d8b47cc2d14d81d83be6610a79c2c5f14ef70c4c2b10dd29de9c4a11658816b5fa2ddf71a712f66f44d241a6b80a26904aa42d47713593a4af3bdd7e40163e749aaca58d1179673d43938cae0ce03375b8a74a726d50999cc3255f8140ed750c7c8faf29f2c86cf3052ecf25444883f339b400e875f846db945a9fc7e7a60d9f2073d2331da21cc439d6390544fa84d0484300dbe4e022df7fdfa0010150164ac428048130dfe364624ccf5990c5f41589c8adc6e81f49e80fe544c876031f19eb6642bb29e47503c5424ec019bb625cb26d9db9e492ed0398bd24713a6baa39fa9a3a8d73ceac9de5407df3b5cd95d14384710fb74082bbb6f2066adc11e51d5172574667f79ca79ed449bfbb132def6f0cc0aa2851d569d7e06f6c8015c7de8dec499ced5358d1a8191f0ab47c56f0adf6ab0e04aa88057c75152d62c4500e1607460cf742a37fdf00aba4436c8818221bc8a004832aedcb5b1170c89191c63c8dd9b3ecd2a68bc9df8284e0cc77f4503ab1837f3d23b931fdc3f1a5d04d84bd8ae693d8a1a4b71e41d00d3650c5e060d7bc440e47248e97415f0c3a2eb59af743cf883477c96041d58700fb6cf7450035a935d01b2b48a10b5a638f3ec94917b1c61633c1321d09564770e2851f0c59b34000893d9413382c4274514e9a37294c1ea519a2cf0a739511dd62079e711a457986fefc27a6d16bf739c9a4ff8fa589ffc0efa645378ecf075f050e40716f109050bafd0199d07a9330e0fafdfd033c6245258dd2b189e277e644845cce58d56cf303e6ccd6def1ce491a1d023a83e27a40fc60c7984173e6dade05aee1549e9f61cee0320a871884a31d5b241c33ee0461a7525308010c50b6ef98af8939a440ff2e68a184a6ff1e0836f234b70d74f9afd2729ba6d9afd3886b6044572d5a81d8b1dd2dc3a105638c2cd2a7840f8f890e38018c8d0332fd3fd0287a7309134a22d61f9f869db02cee3d9a369ba9c21c7e636b4820738f6726b38f751438763c14366501f64c83334dea8c42da41ddb4e12041da87be5319495d3934134a8ae1ee0f7f1194f1e69294722d8f4f2b0ac01a8dcf88652a7b1c345c95cab805acef02f2c6896cec16740dfdf3b046d3b7f6c9d3fffa73dac3c280be29d699ae59423a430bcf2f894573671a7884b16ad0fec79418d2e9fd5d9d9118a710f7d9ac08432f2be8faec9d8f2c523e99f54be687d86bb666ac31372b41a0344698ea8d7080d2d42b3622b0fe23c1d25134714d4a60d6464f3e8d4f0b519611e23075535c62e798884b055c6ea49c1fedc701b0ea2b81da7b8eb8a115c68f8137fbc9d7cf71d7b3b2fc42b27f3c5923eaed1a90c7ef81f1deb4746537ff6744cfa9e3a916f0935fe4657e7096df92b17c2b9081f07150d505058456e686e770b1fb171b0e8a88e244144bb30e2d9cf16fb8da2e82ceae718521584a7e9b3c4e3b020c3e47122c112e90cd89918c49e14eaa26ba3ee68f752879a6ba276bb3c60404c7c22a7f39b5dcd8c7783f84dd56c3a68e55534f92ed47a722cd1fefe60a4fef502be420edefbcdd9b68d98302c64705fe0582a1f7621864da63c459b024a191057e3f2f9dba90f982fd9c46e97d4e25fe07c3af32cd589365ab453dad97b97d60357d9fccdefbcdb06809a4af11a66a413bd2cc82c1eacf2ea73714f462de47a100448439b22276eac99f891641035ae2c7e16f87a07ce30b9b590ae06206278cb7088b4be1ac4de741088765904b177e1b9544f2ffabfcfac0e7dc8521ed468c8f0f0c1c3624904151c3f21d4253218fe0b92e60f4590469bcb7f1b5d411e2b5ba0b29b44936249a32d133996513561468ef83acd2f2490a1ed23fd3895ea1506b7b747e39e0c0f7c5dee4ab34d6c70d960704fe21b36aa2efddb72f3b63bcf218e9912a90b78e8e20886ed72608dc5bfec59a529f388475f0870ee5ddf64f85e37cbf5bdf603e4aced0d0770f608d3b79a9a3f6e165e6b091f926144f3122dc7b131580f259112d023102bba0b7038fdc0d590e4feebb81ecace97615f09ca1830ba5f1d0d54f03f71e0be2ccb48617e89849c4f12131e5c99f8fe9177d286cc262059793705af3199238ecb4d3f762e7c05cca16d146e2416a294876150ff2f26050b8f0d2f3a2a08f0507c59865c5583069502e4ed70c60e79ddea0aa1b8c0bdd1c70495f6701af07ad773e37ac40ff7156ceab88165ffc761a766b703758aa914b3eaa52a89d17c0d4dedc678a48ada17cf8102de9df687f9d2f7ef693302eeeb515623e1cc5869642c740c0126b943916998ff9284c39471d4a46f4dbe22f96c1f72f3181cbc39be8ce812415b30c084dc78e962d07cd6c68d24a2fe77e59c1ea25d115a9b02a4888fa39055ad8494e564140fbf98870d2380b765a11a8f5e8b5183ca5ebe7f6ebd9324521868bf281142c6c0bf5efd78e03636f4f362e82d7a0b803436f7edc6d66c78d9c2f0932abf188da09b32e43392ea6496f7a50fd5eb2d4ccccc1b58d2be1d0c3318906d79949282cb8ae5b5ff0e403ce8049a247af3272c80f9150c8aceaa99ecc1243d11aee4e76e02bfe426e6c57aed75f28c4b8c99a49caa7e3da618cba4d7d1d3456daa2cb426ebf72fd34347f3c43388f929ce0f9a70051c18f1620c8680aea6038579b408a147bb7299c73ba44351e3a1444ebb96fd2c5338c45614f614de11c612fb68385ed0921dad802c22a68ed810f3cacdcd639426265e01b76305c4fa080aed815b6e676a58511dea20f66036390e9870e8b4e8d96d7a4af7e366bcbcbf79e2ecc0f5b212b858794dc4c39e2c401471cbb2cf2b20eb093c9adc58055bb52b1bb7027be3a898b5a44ea74fe799e688a0ca1a0f000e30a68a2ecfbfe70c46a275ca8e87f7babd643fb1c842605abaefe052888382c517ae3e7ace55392841eccecdb725b7232dbc48cf4027031bbc39bf545e4d86df270f279bcaf3534a7fba89f77575b4e4b6805375aa544d332fcd296d1909259f1861393804b19620a5d07bd4479e92098fb8a710cc8d90fa9e528a646284d686c9a8d4b38a55bdbcb593ca8a49ef080fbeb8801a873ba41bcd109019825b11bc231e6c66db8a0a2dcf68a8c06ad96e96a471526fbfb11c05ef95aaca394260137d64c8b0b53ac2f4c031eb7f8e88483874f767df3fc428642713bdf1e97f21c0bf6befed45da35556f4744d83dfd0d9e458be6176ef49f2879c8a1e54de6aff9bc9409b63184e9c9a113033c27d452fee00eced57d8c6561a44421068372213ebea85f4e807a145aab49d8698837917ebc860407950baf91f04005836e65d9cc45dd98c23058bccf1023ab4ba7734d2bfaf1d90010530bfb1306271bcf3b3d0bd77f5fcb6afefaced9582e1aa8da8e8dfe6c9354ad27a7b0301c4df0c3422995972ba17c00abf834091357167f27744b47590e9511696095f3f22daa9fb9eec38e48941a02418024df3fa7236d6db6d791617d736b9be7dd0147c3c91a86e874a33ddec15a076d43203038de690635ce5db8f44a866ac0166d2327d20d9b51c76e5b267fe71d585128d7f277ff0f4a9ce88e02b63274e177bf511ae0bf1218815c17b5f7b142366d6e093ba5d0cd455165900335499864983271f9f8fe0ff40ed60cb0f8d2153efc72b74cd5cca6736c83a13c5f8b9c0f3167fc4d2c0792b1bff63a79de3e78cf0a3099327431784d5a829a48685cd00221c5e34bb9c471497701a58c953d417ec6e44f40614aef9cecabe989e1fe5dde59b9312a97a1849b006e8d5b2241f4725daf1a81c5b7408185cdf880ac1c0c1483a014064e5b8fabd5c643169b9b8eb8b3ed1d774e8786212d3b2b9b6e589b926805bf68d5d53a1b454d4aeef34bf467a42b2ed391fc83c151a22b2a8b76c498c892386ea0c66076f28be02da6290643b72557889515044303abca12d1271ea2fb38746e89f77cd77358bf5ad0ac13c97c4552877e37214ca64646a829babb0cb71e933d7f84a34f5253438725db19879ec58960d9e2cd34d781e2e8207e238951117959dba00c104d049d9125bd9d26d0bdb543130dd8c53b86a49c9f34d261c552e28e9a011e47e8770b2aea480778404f7423b780432d9d443f5f449af60c049398c69ff218c39c1270c911ba487b04a998387076cabda9ae0eff886c6d8302cb1a7e92cdabaf04ca3f4bcb1e382d327c01de4512de908b4b6d84c95b16d193f2c6b6cb91535422dba29822aa14b3366953328b21acd1dd4435d05e7d8610daa7ab0e63241317f35519c097751192df40cf5a9ce90dfbd3aaef5a4b256bb43a601f3c6d5e396c94861ca436c3ffdd56995004d75d588b087f6cff6ab867b444babe43a14f64a1270ec47959cab757c60964f639c758d261f5d748c1a00c4fd524eabac6ddf3f927d4061ae9ff88732660f6c18e9d38196a7a2e7ac004c9ffbc2e0dedc2c9ed24e4a49c1d2b1e0e4e3a4b2e5a79e4542cbfae656343b20d47d5ec2319586ba0c2a6528f48b4ae5bf617521aeb6ce79a2cf922efc26fb4ae047a7b197f77cd8eaefe5ad3aeccd560133fe1e8f82cf991cd15f32c5e3df72a7687fb55d53ce97cc11662ea025c0bdc01a5750cf2b3f622442282c7d918ca6fd43f8594fc72d291ac5733131b920c16906e09990b4277ef898a20cda1c45060651cdff896d859cd0b8d12e3815cc995edd22bc3b079f0874bc6fac1ba005bc2607b1378ed8d2437dcec6ae4891a49da0b13eceaf3dcd1447e0faff5bcea1ab7b833484670837d18fc073518930ee49304b4b12ae0c60eba74b69ae6c077f9903c035e552ff7d799675a3bad4023c03ab0631e2feb49b4e2ac383853bc2bee85617ba7095b1c64e1a2ee451035c743b917bb34c11a6f50c57739528dcca0fa4504e47eb5f4508f83e47170302e6c251085c6b66cb7a52a793e11498dd7f2624807c7a1f805b1e65779804fccbc38fca38ca5dd6d06228bdc84d0b5bac7f01b0b8bc5bd4404f0b7f417bb47141f35c8d6a761613debfcdd1d90a1163342bb80cc290c61f82978c279046e10a91cc864fb95ea1926f0b7d6c909e1b5e54087efb00beaede7accb68e1fa3ffe0db769bbedf48f432eafcd63892c84265b6fffeab080262255f98844b55ed76ae03f97d6b231dba308b730978b8936911bb64623dcb8626f61e41a86daa41282961603ef60102ad33e79e2fa5dc044c341337535ac2657548ac627b99fa606d62037362e71555a8192ddaff48ab964f5d15da36a58f64d142876ce499ffc7e8020ba8d515d5fedabb54de7687e4cbfc5d604de800e10b0a0182cfd83f7f7d01130116df05fb6269c56c2346d1e4c714c19c18c7940c86a9c4e1e3d622f06a65cda0708c7a23e9a04d0bdb9dd0a777747209cb18a50ea042d2f642094c5ebf579390be9799e210e3271dcba8a5c59441904a7290d4d0b19e2336455ed7f344437a7dadc63aa6688a66871aa797fac8885cca84484109606a069c073083b81235d0132d253827e28883067ffdf1f1d5fcac8dbbf8a24cce0148d6c8d091fd94bc733fc234bb6c862cd29a1cb25b6609bbe22c307bfe6f5700cc7e2a614e553543fcb6d3922db9ae2c3dea24a5cca13c3df66f44df289808b2db8d8a66ebf170faa250f2d92e581a63672cbe5bace6c2816b27cf272a7fadfe3c5970b94df04267215812a6dfcd4ca936c43dcecd98f3a5b9b7acfd4d12cde58a1b9c21f4cf7054d95ba11a65b440d330547becb3699437a9bf2eb9488eadddfb118a4357865393bcae5fa94c7e0f0673ba0fcf065776fad4b5152d4e1e4aabe421e032f574ce6fb7b50ba1599e4b54c3e71518b6421924bd1b75675f89f792791ee590e1c328d4da96ef5a66e38942e664ad27ed142ac124c5368fe4a11abf0b0213570e2ef17f3471b8bc0661067145166c3c69a6520eb2802987ea63f383c3db37ceb47a409f540e577f6d30b4fd160e6266f0e6591de74acf4304e3c450f3a7fb89fa6de4261ff9f503842c43fcc1831e813104c0d27b73cae9f0c6d1cb9bb1c7f61328f9b39ed4ad994f614401ef301685e0d6b23d4e59dea5dc800d9f7c20b7323389cf9905d6864edf18905ba9e92aff874ef7087761abad0652ce783bf4d1ad9b597b21aea4e619c114ecb3f2181e4dc391c07e2f2d900848998c461d64b039d824eda0e58bb55e090f0ee94a6f2737ef69514c1cdf6bfa7190ffc832dfd08036e1c8d297a29d4ced5c7af2feef8f4994e95f8b3241cfc176d5005f2d7b6d072b2bc5a9d98e7726e80978a36030a88c675548a670402018375813a22dc1020563129178bb359618e5ac03a59207b1b97fda33b1015a3d337e39d8530666f2b1745a33eef16444e80a6cc0b2b87a240a925b158213f1fc3a943fb39f628f858595bb57e04725f0ea856bb7127c7a22488cca3b6aa0f8d2d041907f042cfa0f817d61b4901b62b1c38dfba1d4514f380c6add1013264238c87f9049cfc4370421c3c9aa76087eee8bb6b97af6070ed5a84c4826f14cb2ca40da25f6d4556a832349e37de1f3c56612d3ec00441ac7c986c6261035f82ee50f4648519b0f91c70f41fd7bdb47ddd52187e1735b1ad861c907f5e3f96dd44d4d69a745bbbd27d11e06891f2a32f6d392d709f6a569c6b84bb84e4048824e362621b896867448934b27c1602354e892a0f0619eef88ce40f7cee7caa0eb33bc600ba62deb708986a470927df0932c5242481b0ec8b449c2f7407fe849d4656d1cbeff19fbe7a7c50b06869438694bf5c800155660c485eb3c8dd51bda2f6d2abfd76b067007052e67f4b39be50543164c30f2101967ad3c41a7fb2becc2ec2c2e8b99fd4991a608a3bcbf69f2797045da5fdc72dc10557ecbd10a947c80301636f1740346d1791fc291f7a78990e39d3a2d23806249481a26e94282282cf8425b1899f31dd60934728a5d917dd161961dcd388fa2f83448e7c97944567bf31b3e651bb273963c577a7672eb4c436321aab820874d1968dc2cae6b355859b94353d7f3887f03598dc7276cab7ec2dddbdc1fb7c1ee626b07d10492a8ba35ed793718e2d85ed9af5d91d9631803ac94846fdfb64aa395050eb1c0182938d93995045f16d8f8433fe28d8c7f3831a7790e6aeb782548b42291cd8e5e966518694ddef2c1786fdb02749a80fcaacaad43be2315a33ec577524be245101fb042ca48f37125f66ed5fc385ff0a2cb81f07f0783611391dff1073c4a81a4070601fb013b0f2a1ab7c5d36f3b3f868221d872d227b4e52ae22f58495ed22ca6f6400a01ddac11fd7ec0e61fdacf5e3ad9d82e881af09de30c65a8e72232937286aac2dbbb15f1dcfc47ed56b02387d5755b7b51c6dbee382fd9c41bd8d231bad0646ea7fad55d7007ed4b2f5b12f438c2b055fe88e8f62dca2c1bcc4f671e09a7fd8ff9b101427646c340005f653baf67553b5d8e0bfa094759d548d83fd56731bda05fb6a1006ad6a2a88307ec3057cba59d4cfb2d4abd51a9100866535d152c21d4ec8233861ad55b208c0392bb097638c2521d921bb6f8a11937ff8432eb16d8e5416f1fa5a2d7544058c2af056b7427628f8781de5ab22fd34e0be8cdd4d6daf310d7a02b50080e42a55dda4781101c61db091fef116ff617caf3a0d7233e708f361be3d6192945ff189de3366fb2b701404a6ba1ce869722db546237d44554317002c560747849baaa47d0c66f32f9e39a2ec7dd64eaf3ca541274015994cd1be3a603a479ea1b9f8ef4045d32c02ebd088449f4999b4ea20c0d2eea03ac0b072095203969d851a0ff2437fa67bb3fc0c45c31a25ecc288246291809f3644828d56901c232cf20460bd37bb19581d9cf4b4f8399470afccd4363c83f9249c22329fd8ab3b44b1a4e78ddf0ccf0697423faf53175f6781c0315af0540edcaffbf00cbb46ddf7bffb84890234f5adffd44177989becaa6ae9afa62c5eacd61598959a2f39facc8e8b8fb5ea30e3ecc7a9ff2d937a5f5e4095816489dc3e67289290a13fdd002573a8cb92f3442402891c4bb386609d29ad688bd2af2f465333d4c9480dcd09585e386cad3f4b86855a0ac62847dab2bd0ac163755e21a64cd9cb018bf761161b75ebeadbe78bde47c10e5de8bd35daf8268b8bc5e95e568d3c679195e2fb1a76ae11894f8a1fcaf9aa1eb725e309bc7cc08a731afbc0d8a9a8af4b257a2cb1c3338fb89c3ed1488cb9859885773ac237fb8ba9f62603f5c7acb49b61710a1c6481f2e8e2220559f9f977a9061c7b31f5873f9ae68bf676b5abe04f11f3de76cc3807fa014ebfb07c7b92320773430d687aa4e3632c4af1ef11de1c867709639585914d300fb191cb04f8de684a09f08a5521cc9e530b1c819e4169c41aff81f0a22d82c5e9303cc7c18934978a65674a698548028820142d47a06c67b7082a9d7e7bc19c36255e48a48675cf8af17415e6d46d53ac4b572595b137f402c301f257e26e6bd68d969e08aaa7c7096994dcf1aa86843cd2162dc9e85ea6c7fcbdaeaeafb0e1af43e6660ba6668550790ca3e532a14c92d7fca6827bc861f6b8fb8689ed77a5a33add8601873d39a594babe199607df8b9a041d05621edc4c3afcac8858e345fd72b543aa5c480f4951c712fc6e9f462853b74a220a35d28484bad304abf4309a50a0fbc369cb30fa693d6f74bd28548c177424f4dcc499833ac88922f06595b2e82245d97b907aed9f3dccae4e416d8dfd4ed6172e72a4078472b79f4421a369eb5bb0a9ab62d642aa8ae9f0705a445568365836f8018915968e7a2adb7038cc80c9f64c988c108803939fabd3b78f7418354dd0a703c7b2ec386cd06ea2b1baa36da6c2c811111c9042c8b319eb8f0a278f6191f531782a4711686363bda463fbbc9d5038864bd405806be2a4119cb5796c55698895c9a74de75789aa1609369cb69743045b091ea6699c09e57808168fe2c8c6219e54253ffd424d62f612a16124f22da30eb776b034b6ba21fd2bc1858b9f6ad4ea2a73a56705f28bdfec01013253d72b8695187ed36406598a655f6464cf5da25d03b02a373f26dc90d7b5c3c949bf7d26bc9a57462dbb504c1c3c086b1df4bd167e0bbc7e2fdcd45d1a8d2328cde0d87df00835e7d2c3b39a168d4ef4476831713aad58dc8ddeb85d268ab23dd2154083e165114e692fd3a90b5e67ea1a33d67a668c82a8c86c03998be7ec9b18c138d02d743e33b9483f10e5d44057a1aa117227d095a6f8338d7b530d5ea18ad3e2162e948e84e545b1f43576985c25a96743bb051e89569c9ae4007717570b6930e0356b15e9109f7e4c08051878459aa391a3abda16dac6e2fb985304ca094fa01e9c6406b89410c0e44bd91f205e474bba34cd598e0c9bd39d0dc2822b723f6bb764cc03d12b4afae4c437aca1fac2a6e50f638d11cef0d557558d627b9b52306594fb49a1cb3ef778eec183360b653e47234c00da793208ba944306b420ad03609c924cbfbd7cc092dd7c5541019d76c3e1ac8e73fc77b5ffe5b6c21b305699ca3a0c8fa4811dd2001ca11260624412b9d099d295c056920cf6b5b8e6f22b19ca97625bee281b4e8d2dd19bd04b802ec9803ea97aa875e3090325207a600989eb704813b21911dbb8224d2407556125f13258bb62d7675f52f09ae20f86ce3f7d67ba99462c3b0dcc53f3e4eef33733a1c1fc956be5e97d2a0008fba352f761cb3e526fe800dfd073f422cd97bef2db79452262903a308b9083508165bd9bf95d5d68d62a3335b160c983519e9da6ca35734746db6de1e4aad5e6db0681f65d4517eef5b778cdda60b0d33961615a4fe5018dc76e1bd4b745903bcb00d8eb48bf78523992f9746a496175b8dd4fdf1ec6d72839c40c05df485024d27896b5c2f46265350269431a29d35673606b14ff2fed5c0ae1d1ef3bdf73571ee57fb33c2f6fd5985b99f50d46169ba5c6d3f8d615ad55a412ba619367546d8b2449f6a421a61bd18fb687f646ed0f47e36610d695091d2576ddd26aef2d0ef0f16324634fd6ffeb8f03027d0c4815177dd4cd484c316382a5bdcc632b600e2e08b2d7ee0d9a248922d5e6170312aa145130150811629e0a00b2d968c6068983d83b4b041072d5e0800195a2c4af5a065a810000ab496020321243e20c4c48a904faaa6f39e41424700e08316f70c128ae18a2cc220220b2f98686fcfa02c84b2c861318481c0992a4bb3edcfa324854c5410b2de995f9fedb3da0a8399aa8b0a184d1f8443f8dc74797d46a07980ddf7935515cc34bb301afbf3400b4d5b8a544a928d92d8fe23dbc4b94ff202c9f60faf78ab655645d9c4a9b6c576a4d60324f2fc64d9de420b895a6e5e6d578068f4e29add32ab2daf42b3e2595aece837ffea33042fcf49d622fa3e1647a8d9f5c1d0366fee8b0ca82808c9dbe70d7eafaab0f10a20751fe5b1abe5271381c6f680e6cd7d7d5f13a7fbebc5beb7fe6db9ed7b49b3fa9a3837922d4b8d08e8cabd24dabe772cc28bed446e1b86ea6c4440340fa8abd9a4596d7555ac906857483f4424a02ca45ae621d9f0d8e12a9db5342ba9c0846156d83898c18a2286b08204e0120cfad0e0d692914dda9d6a2b7a7698728364822a641b3ffe175107c665b4a08a1ac490e40537223be506255a9b74c924002abcd8f65ba6154c74808c98173bd870031786c1c64768d81866638c31a6b34a2987844aee8b6d5f53f1826d5f9b6694971010301834215a816da2069f1269349d05802a53104d21dbf6458d45ac0421385500c5b6ffe58d6d2c1431c410112e9c40072a54e0b25236fe27a1d48085eeb027eae8ee67c721031eb6fd2e3f412468641fcf8d31c67832112445946d7f5621daf6afa8c352814b9a8d4f3063e3cff8f56de3af22c4be8263e0810da303d37082509b4c63143700e2e5876cb53651538c911716e0815b0e3d4219f7438b0fec05c7e406fd03cd0587440f69875c0bce05328c7c10d238277ac41e66241c1546421e7e46b82f8a801d9889af19bedd755dd721114232e4aab9f50c3278b31988030d59f6fd4043f7811f6f0445f0ac281ff1c2f521d63d91d91f863095286ca83bd02e952b30efc0cd52219a81ca6cb29ba67283197c8616e053a4b110ba62c8c68720aea002001b348d3d83ae404115faf70cba6287510a6d93450b2b56c0c04a133d52b088c18a114d3469cf202b4c381842db3d83acd0acccac90e2b2ed9e41562cb1cb5f350167aa1c6fdb3ef87a4d9addf253bf6aab656ca1e53c61dbc6f68cc9427f6028bed5b7da22c5aa2a8ab3ead7605e40459bf4336412d2b98da355531193f5c9304913d0c4991f0d4eb62d65b4d8f6658472fa0588d9d2aff9429b3830dbc6a039305b249b6d866d694e5a26346aba24d948f649519c457afb9614ab2d922d9b7ea55b5e66a8179f17d9cb9197d84bcf0bcc49fb245b6db9dcaaca3e6e2cb5d0d0b68fc7f25d8ac897d7b625c9b6ad4b94234e5a4a69a02b49e6a425c59c8c4297a4188914dbf6f1098f22f8c62f2f4c9c3583703cdbfecb8fb3c46dff05f762c55b7404432f4d9c3583a020daf65f82b67db16ddb8413bb7cb96dfb5265db17a06d2fcd5925c9a65f249bb3cafb6a6142835db634d9b6824cd82f3f23dbbe5b6a3fbf6cdfee5f7e359b17ca9711b4cca0675013b96d6bdc8ee34d745d448a4a473333a34bf767999aa12d80a9514a296542daa08714fbcc462cfbbec4b48953f289726d18d64375e85c70a45f6f957ba5abe3a5dd9fee69f725d0bf5fd65abffe8fb32a96e58a65583655fede8319757f2eed3271d23df732cd597453da8d178f37e7a45fdc1572f26611a2f8758b9cbc538a2e6dbb9718f6e3acf21631715689cb2945dbfd6f1196d16099e94e81a979551425a99173ce3450e80cf40d1b399c55e6d26dd8889560e77a6b0067aa9cc96d7f70dadbe3a45f9b0d567183d72f9dd7de6e74614eba0d554de89920277d8a938ebb39e9333867cddaa2ae99da8c8d89be5fced48aa0e0bbfc6434047a8b6c7ffbc9be196dfb7fb289f3b2fd3f9f6f565bd72fcd499fb9ed9929567f32182174b7ebf7cd3ed90eb2ede34cee0601ce5409c2d0ee1e9491427fb48806ad3842cdce5f6b767e0f045156d491e77c0c06a93f6107af0d564f460a9dbf14ccc9548f93ddc3621c147190c5c9eee79c73ca48a16dca964a62b6666ca9a2195bca0b2d7657a6a8d85dca067e9992b2bb9f612243a1a73065f15dec6e9ca9c1ee3e6442b7bccbb7bccb97333620d954759fc1b1cc9ace00d5560a9602da1d593471f297a1a793340523bb776941690a8339aba78be5f6bd1cd02fbfa0cfb6ef6ddf967d39c8a28e5b2a954a2517171295fbb3e95fda6c956855d57de91a9940b5f5f214e6e95f5bfdbe8f84dbf46f6ce2909efe95cd96cb5f4d614a285d55f8c130949142773252681cbea0a80b4cf990919a39d97d8ec3a052b7520ab77552b6aaea9e86882e53b294cc87875965d38fcaa6df0fbbfb52454405dbb4140015f14b01e0360d6754369df1d39ab15515cd88796453a01946367d1ab589236e1ab64dbfa411657f99c2d966006d3aa3b6bf9c11dbf4cb19b24d67cc368521b2e97fb589f36dfa30af89f3b2f59730b04d99d8ddd3d94ad9a6aaa39f72c16cd914a560b0bba751d31dbcf68cadb652b61490b36c8a52464c960d963b93b2d556896653e4ac1290db6099ac921193ec5ec602d43828da36b8aaea4ab4dab211aa2a2067d9489925234ab418666648a3cdcd89b6299a38a5dd3d8dd7c4b9bb7b0e6813276677afea6845423bc543cf2e53b69d9239d97da992b23b156e775776c1fb3645b2140ff74b1a2f97d8bedf829291c60b9b376590fbb36f0302b565914c95bf07de0e21b4fd565bd385ab425ecc8be5f06222b02ca845d9eec59ad47aab779339abccb899b3c0f7f78ee09c95dfbffa7849b6c34c321ff3262f96c34f50d21f37419f983850cc04981010f325b84b7cc321f32596626897d6496cfb9b50b68769001f9405fa5036098d8993f6c7c9267312a0042708a5f5c03dddfa56e62cdf1e14c6cfc94ef1d6846293386b42a1c12cd00f142543bbb460d86097368a2d6d93ed7f2bbed5d68a881d7a4e3043124f865c6e6520d0a5e73c37dbb230f484b204b77de8b2507210886c6190600aecb6c34e619e69123f7846df67903829640611f44593326188ac377274bd61ddbebbbb8fd75a9311499c6575a595c2aaceb08791b0fa3ac31e367738597138596f38294312fac254eb1b7ea30ced75db61a72f1a82a52eec7a63095d5298b34ca8adc9b276ac95bc0003e64409700b5ed8b4d8e1423193c59402d84c8f09063362688189064d80ba5a37d3440baf263c4d806a0b57725555d548161c65571c65e2b4d44ca87993b24094186857a03bd3452e97f3e12397cbf9c8e572ee9a21c3b014a6e159adab9be90ad7d9e991f70e2753ab306bf2068e1c255329cc5d1943369c55a9136a4b4269b4466f740aad42995099b34a2a4463f4c8b44167a49df9573670849a2609eda4333c6475e87df97adea5387270d8581d019dc9acafeae3acd2872aadf254589dd59fdaa43aa93d35c62aabcd879cc8b30c3121edccbfb28123d4dfad2f67f1d4d7abf6d417196069b55a3d0f1bab1b3a3e7e04c19143167daa46d5734582b378d858ddd0f1f123088e1c1c3656366ed858ad5ed986fc79df97b305b1e058beb5fb7385826e2d264774b3786b12dd28f7e67d40ceaad709d0bc49adc2981c25d3776f5029bc516e2dd461ce19c78ae4cc1c38040429ec870f20b1233e414ce041d3d9e9f1813347da997f650347a87dfc08c3d1479099b3d94efad36d71ede781d903412f7bba4493dffbf297c3e97d86b942dffffe7ef7d21a2b5dc2ffe5d46b4da35364ea7f0ef5b8bbbbcb60da193e017adf37895eded7856c83ff7d77b3e933593239f9257c0f7ef97d78edf5be7c3defce2f62de777368a7b764277b38098e4bc2ff1eaca28ecfbf1d9dda0a471cfeed42d4cecd9766bda98ead6319669b022292c85c207db2431850b856b8581871856e8004601982b956f01cb2e06614259e90b956f03146601b725937c095410a0d62ae212b50da075ee0c11552da2ccb102e473912243e422e57328444c805767954b2b07d8c326e00f4022598a70b5816424c016738039ffd79e0e781a0e7456670dbfe3ec0cfcb410269a6c255d5b14a39494bf0fefbd27b9393a202bc6f6c12820673386b4bfe2029ec50174f4fae070d7ab6bf0f2f8b404715c979433f445954cedd9b663779c487e15de22884f733f2e879a61d577de07be08e93ae935b22702528cf1bfa254d699b66990c2121212c43dc276ae8002e47a6280d46ae18a231b9111100f1e31ab2c297c5b5827503d0076bc5a392857d5200dea50ae50abb8ea19334842548502b0117b828497091498f4c2c606ae0430bb132c0080366a7c038cccfb303d6660a9de99bec077b068551c676d933880b2865d0d706492c0cd8221f423ab5e6cc5a0b0c586054789c1821e2bae3aaaadc5691c1b652ec92acb2cb1b31d8e5b445b1cb89a362711b06315e60cc600b233ddcc04231811c8ed8a208239a2079c2820c376811b4c5154982f8c1f592440c886290a50912445cae83145548f9009610bc5c3b9c5002030d29b84207295c0828010c366082065772081a806c0b3264418851c51597bbb626c731586dd225ad9da8f91323ba62b1a1654546d115a61960c9317962891326ba7882a87b014b0c44d83ab1c40b355f0206178a9482b070008b08ae132f1855f12efe553706186308b9b08a418a164edc24a210aa4482c8a861664f283129fbdb134a6c0b17b2b878ca27032257b22d820a8fb46790184d10a1049e81f6a0024f8918e4786e96880be36b6bac78dac30b6c39773983c480527f55c40ef70c1243885d3e26a20653300df2d52606b9a0d5c8808b99a9c603fa54f74d796bee4a24887e0542c3e4f4ae9ffad9f5496701803e99d52668b45dbfc4316dbbae76a5614293225bfe0757e1314e61aa976c7d71a935d428d0f4ed9df3cabe59ad2d5877345f7c518cc41a6c958560e87d7ff3bd1faa4ced993b7c4330acf53f7b3d8d824cea3426edcda00d5bd014ac73c6aacac198a0c7b5d6fac9f6955d0ac6a0e9d739653a2851aff6e22e7b1f188a23926e717929c1c4c89866669c6862646268c21a1b181b1a251afff228bc047f60b6ee0d8760fbdfd8bdd5564e1d6564286afc6ef4def0ec83e29bc5dc1bccc8819e1c707063b3365b40a2b904a3f122058091acb6726a8e931f0e003201f86e45009170330036996db24b12ae9444959d93635973cbf4d8d8738a1578a3b385bd1f0c3443c2e148382769665082e1596d917017cf2c9e9170599b40f2cbaa0ebc0e3cc843f346f320433de80840ae5607206fdc206b605407afea80243bb8b99db7a3aa747276dc74e8e4b4c8e8991893096600a14f1cfa964e6fdef8df8827d09d3b70f381ccaada6e9ff3c1de21440cb8224068ef24a2883d454e9e2001c23971640a70a1b8b7a9f2bf3098ad528e1583ed24dc8de1990af67c5bbb9572b59553caed236a241c0d9117b5cf0ec514008470953355fea4ea51a619dd42c255dcc5f69f330bd3143a4f2648b8f2bb9170df8d84ab2a1834fd92840341c624332a0d59ff4056d6b7ddc6d6a57edbb6f0d4e7d975acb07933efbdd96f5e06a5a4c95a6b6dd7596badb5d65adb75d65a6b6d47bd567bb2d6b1db275f8d5afb85a65fb1b5b6cbf6fe501f525b98540ff337c3157c2198010f8634fd8ac1a75f33587934fd5a69e908cf49f6aed65ae70ce79c73565a6b6d79bdb250ed9ca60b4d3fa4345a68fa345f68eae50e7fdf08dc5a6b5d3e5094f9c49850bbe048a552f6e2d6b5d9aead8811dbed62a2978a32a65c451d75c6a593dc4037e364e97dcdda959da8c88457649bb34693736b0d451df5667b4536cdd8d419362d4b348dbdf4bedba0a9bd6f1faca1e1a2a597061f74efdf32fdedfb58aa36fd1284ed8ef2ee11272913babcb6abc50ce126a11f24316d13c75e255cd4a800a2b2fd47caa5fd685aad34537adab12eefadcb1b87ac505137968486a09a1fd06acbf360d32faf92ed434b2851e282120f7f6068f15b8c313ef92842f71e4802714b1515654b1f1886e067f1e7479d44c8bf31f6cf6f4d90bed7da4fc4b77aa590c7a7fa73bbb516490d888a84c680cd0be809a50518e320f2c5eef22d75d18de5c495acfe54e863e7ef6006bda3e20e7b33fc8c12727727764f77f71f6a89389ef07b4ef4e39e2936c63f9a84d03532e4642fe7ee3fb07e27e4eefae5dcd58a7f8af5bd1d24106dfc3ace7ad9f85370168fb7a80b35283154d9f827c6b0187058734115bb9c5936f672876fdcc0d40a8d65125880eeec1dedc0ae9bd9e68efaa98e22e40fef5fa72048dd4507ccdd796f4f22786fc2b9beae41badefb75347dbdd9718eebe8ec37c2dc7eb1ebd670961a58219a61916f7c37e80d2b1b55569fa99b9ed8e8eacc916a671c71670471b10f1dee4c31b091bbec5dce5bd498e2ac1a2b1b99840378fdde31356fa6c994f3389d48a6b856b716d398385aa9a9baa35f3b5e5a7d4010d431124511354151044511141f9c2fe00bf802be802f2028c4c98aa2fba35b0443310cc3f0c5bbe744d10d7ae8216a84b9a90e49a8a86389cd9f94d0b4a6c655a533d9220d1768142c288aa0f86008ae447f9d304714be1792f7cbe7788ed35031f268f16176d03636334f52545b36a333716fe2330fa0d025061ab56cbe1e7199b36c7d312c6263f3a3f1f4e1dbc7f63512dd6ba27f7b7bb2e086225b1c695ef4fb9bc6178484460ee89209b43de2ac97edf19927715a133a6547a8b94f4a68ece4c317d4dc233bb6a0cb1f3dd8e3a44493beb42ffbaa3f7a8a2aed066194e820a94dc3f79988c2358cc4bca9ef287cc4fca0fe87c24ee64dc5401e38a1fd4b0b545b1887bdfcf5dd05cc01273eaeb63c862243bf3c6bc4842e810232ff7bfe4bd9c17695a12398edcb5965c7e3b418dd26fb2aed915d51b051107242b7c51bfd7a2c2f50b73896a5171fe6a7d800115f11ea78c4f15f1e9b5028d85d62210cd413ba4d47ecc4c92af33245689991486fe0a059d93091354a9fd2269a5097441104b51d3d7d3b428d27743b463f45bd3c0cf882127f8a54a431ef31ef220362ec9689192dccc912caf2d8d714cf05edf22e5ffa2cc6ee700afd89fa73bc05fcd397a91e57d513caf2b8aab6303fa81c9837f54b0e4e352e8e40374903b2062cdb465de9a0799cacb05d4710371d67d040812e9d86daee16d48c6df09de62c4d29a5fa4728174dc5113c8993f5f55397b1e55d1c217cf1290a1c45115e5ea3e8f69927a1d9a39f5edaa3d16be4f695ddc7a6dff2124740d1b11451a20ef105558a6390d576d8e82fd409fc9a67c175429dc4b769f9b95d9e843a917e6e4d4fa3277155f5999315b573fa9a7108cd9f5e44edd4bccd78dab1f99aaf1987d4bccdb3e09ad8061a5f1fdbaaaad2183150d8a34b2c5462a01d7e7d9ca57b390bac325f634a2f5f1f8bb4fa9a619a3163c6abcfae3f63c6645b98f68569894c4bc3b446a6c56192f5c5fab4be680c8ac2a0a850fd17141d4251225ae424cdf2a8e9a2198d4451f47ed4752f3b68fbf8a70b4d4368dfe5bb071fcc96589fa159ec8a0da05be441e3697e8a12b0f9d30eeaf428d4a3c621ff35ef58c85957268ee3aaadb62ead0655fbf2d94df29363853cc50520f87109d1bd1d8da5ce1ebd887af9745ec6e964f823d4aca18874b9dae27ff85414c106656355559f064ab6eb8b8416d48e1d1d13689d2d9eca90d23fa14ee369e7f4366f73a2945231fc93486b46a25883aa194f3b356ff336354f51f845f1f1d3a0a6ab868e443a5d34a8e93aa1a64ba348281e36f6c3c7cccda15c6dd916a6aa3e112123bb3e925d9fe66a7dcd9b5a9f020147a7d1487cfb7296ddf52d4f3d5927de12c0cdf6386b425172db150395f6d56424522067e15ad2dcced532767d8f1539ab7b1c848168f63fd121caf4a16c68bb98c9130023521970dffef5a8e8bf22d0b39624593e0a74cfac535176fc91c6ef9b9c75755c123ec7af0e6c5530854672de08d9b19c397b8f187ad1ababaf206885524a29a5f48e48a407499774499774cb925b19fd70d25195d6bfa37b57fbded187136dfa36553475a21d5a29ad740704dc1593adfed1b524bbaddda3d1e8529a17ad090e0ac305a34bad08b6cf66492029f262b5856f586b93e949d28b89a81d24e8ecf0e8e1c37f0071d263467cabaa2834dda5955927cea2ab18b9cb6923229a5966161eca437b68cf952b56ac54a932654a9428413b08070e1b369ee8d26462812ec35dd208d2e5b4ed7016fd189afb01a4e5b7eab5284b0556bb84d15bcfd97214577906ea1e04af8d4d676ed3b15c9d306f50ea6cfad55725fd11258d41561bfc917519cc824852a9c8c3c62460612fe8d84902312ff332a30ade6bb43057996d43194764abad6cc5af00d556c6016dff194fe8d28be1b697b9c90c96c459a595d18680886cce6295b568df9c557a6ebbc7c459dffb7b4e7cbc26e5aaf482b67f6ee2ac0c73d28b6aeb03aa2a2267d1c7e16e379bad560302faa13fbbc4b724f8f6b500889f4abf87427f4db2e01bcef9e8412fe6ac239eccab7951bc359578793e405cf17e3c202fc89b794c44183df82390c6bff7d218992fb56966c69724fd19a819940925838a41e99285d2847d7f74bb1a1e74e9c5bac7324fe2ac3a7a7ffca3df1f036127ce72797f5cc3369817189812cde1891857604a2fd32299640fd37a605a104c0bc4b442cc21a60926e9b2162afaf77c2286cf7641d52b4efab7a0aa9093d54acdd52a4ea2ea941bccc6ac6d15d95710291354a298d13b5289bc98122a9b5e6c832ec9d36adb7092cacad270dcb0b27fa24bcfdd0246600153f483f9e0a1e3f2f24173b62960a5d4dda99d6389d2847395832ef3165e91780c17bad4f59dfc182664cdb1938209290c09492105138652f8ff4fc1042143424c48c1042129f0d8e164fd9bbbbbfb4de79dbe4ce0b40607b43fad392a75af33cfa7d3b3bbe7dcb93b9ed7babbbbbb7b16c375a8e2232a9abe3f79a5fc6a1241144752e0210e1b9ec3599966aae8877b52ea3b6a8bd4399cbc7fbf24f30c73c407fc2e7fe821d22e856cffbc4f1852bd563a8a25d9f7a77604937d6de1ac76041259aa750674171ba1a5a9d47b5ab167ae39b38f590c1d9810f27c9862bc40488c2443eeeed65a7c7da59bdc7edc8004b95928b11520d111a91e0e3a3b39dfe5a54bbdabae396b3d83d59b8c5b0dfa965a6badb5d6e69c6db6d65a6be98acc3868afe5e42875ce3165649b67124d2dbe40ea08d21f4ed6eafe40bcd67720f569add4a33f80d4ce6631679df3e95f1c244c3afa0032bf9cb9f93f9cf4e974d2d19d3a75da7d7eb04301f1f163e6a68fece3079089479d1bef034890f9d9347db87b752c6aeb6b853f9784efa202beb1e4aa4c24e7fa305deeecdf2e7b9fc7124c0920ca7ee590aa0438712e2da78a3d9f66e2cc7d6fa53b6ad7d5ef7e87b3bad17d474e0e27bdd27b9d45f7fd71458257afb5d6ea830369684c7e689746fed0ae3842fdfae4b5cbfae4b5f1f7983875dbaeeb280e34d017e8adaa6c89d25bf5e8ade691de46cae44669732ca714dbbee3b107a5511a8d4669777c13e904685fec316facb53ec48f61a2cb999bb750f46650d11ec270dba83d836060b26fd863e23817ba9c37df1575c5fa1eaac7bcd97196bf7e1feb1127497f451d75356f788cc0d0393976ac3a31fc8aba1b3cb29f85ee047a83f1c400f0e98f003e7d16ec90dfe17f145500fa412e4b3b93be3bf90651d349d2b823fad863ded8afa8babd26cae9d9c85fd617475d51a6ef6b09f54b4eda3a96ee2667f96873d6dac7045126eda4b5357cfb265b75c954c7f106f93b3d9c65ff6bd6ae56ab5ccddbe6941529787fdaeecd366d3767cd21402ea5a6284a6a3b49e0a90f63c0d084cb1b4f3ade9f76de1b8708512e9180cd9399cb0504f0d45c2bd83c99b9bcf15e9b27b37befe55155f7bf6fbaa688bbaf36d8a84beda8646177e39016306e582be04cd91ac5495b6f3627ede906ea64e2cc6d730eabad371460a241e307bbb08a2248d1d6facf179af4e3aece42130c5eb1973b8a6d911db243dbbefff8cf44e11eb1dd16561b586d9ec55be2e8b7ca03f6dc0b8e9ec52bcfb6efe028a4342bfee859552610e89f23702208637891ed86cb712faa2df1ad38569b7fac4736933acb75d6d519aeb38ac4b63fefbda69ba61b05bb4bb744b27d6c4dd67a1722c0e68dfdea40a39363fc1c31ab2da761aaece340eb615b0b826d1f26eaf09e79631fc4b44e6c4775a44ee68d7d87e5ac75149a8ef495c22cbaaf9625409fc9ba77d94c06524b7fae264eddb7d2ac0ffed265277bb2a3cef7e14f97e509513eabb47d612f59ce5fb9972c47937821e7e3ac19cdf9d01ccde5f134edac7ee9324bad5c97d5d6293fe8b3da3ae5f17b705401fcefc551052176c09f2e15be0fc753beaefb1e124d472a4473aa1774fd92e674ee83e50c83da9115326fee53afdd9496dabe0fde07e99eb1695b22c045143fdd304193142113c7ee8b45777ea4c5c9be2d4e9c7562002e59d8783c652a9a8e2e1b3de6e425b368fc32496847e2a4e6b189b39a38d7877020dc03fbfaed1b4fd41b4ff47b0978ff8d2a08b123fef72a84efbd043ed13f0c5f1c4f10c8e38e379ef27b3f5de17f2ffe69e77bf1bff194471d97f8d4048356dda76288ba348b9338ec1b86c75c56abca5f232d72f23eada18ae87be71323aad8f7fd48f7f76991498af6f674f24425767d2c7db6efd7b87f2f5985cc9b28741d6fd871b56aa9e5206ca212105841adb5d59c3cdda0a98dd6c09cdafadefe8f89434d360863db9f3398576c6bb5fdfc7ebaef51db7f7fff1b870871c79defbd7188f7df78ba3f5dbaaaec0ff91e1c4f9705977d0f89ce23051ae9cf0bbaa2ec08e23649d1fe270880fffdce37ee78e0f43927bda33cfe9837f6b71785ee46b2050ced4f713486d21e7e8a6e74457dc4315640b5e5bd37522acb99e8e94ec93901a23567cde0ae788ba7bb5d9162d3a744deba4374065d69b2a9bbe85feb2f20f4e9ff7096a5c2e6769dd556f7d4be5e9e80576de571e6f7de1b8784b004096aae3cce2e67fdd2c9f1cad04b6c780b3fa52aeaf6a9934adfff86b3dea90d67fda675d4afeb5e0b8a74982167edc866c4ed72109a3f41106aa0bfcb9ec53c3ccfbbef7d09de77de683deb592f5b6bafcddd4e8e93d6ea58fb368718a6abb7bd3fc840f3b76eadb5d65a6badb516db6bad75dbb4d9f71e53acb5f689edd3b9503444ada5d89f52ad35d5945e6a29a53b6eac723e7ed0a7391f3720b51fb720b55a0e941a7e76a875d065de3805def3c2352e0e6b2dce39673be6905527a8eaf07056b5b9ec0925766497265b6d3542e7b4c04d8edcfcb540fcb8defb1b7f288a83c7f7e5f77dfff170d677ff334dd5a50f7a281e4edecfa2027c6cfc7f69fe9bc71c27ef6d0695f3d6e3cea01c17689b82d0a5cead009c29fd9564c955d75ecff6afb59eed5f0b73ddbae7d0feadfef7890228120da82f846e8a0413fe3355de7bef9d10c0ae5955f705babc40469c600779ebcaaa8a3eb5b78819c26d423fa013c7ef944da3c49c75a4acb1e97b9a7e9e38f7e95896f6c4133537f5a6fb14e7a4df5bd7370e59c1e58d3944e97b65f3e9dff929da9d95f70437779d803355dea1edd6dac9c2955dd9f5b1b20930439833a15fa8244d3746350915d108000000004315000028100c078462b158280b232d583e14800e789a40725a170b844992e2400a21638c218000020001c60098a1a11907873363330882552f37aed4698229b932cdba3cbdf14598ca5ec954530faa1aca89d51318855aa1b982490cee66057c488c69b504dc36a9d1f7002f7d6aaebb45302114e954b5b0f985b5c50d5fc882ffc3172b7dcee5757d4a2eb17b54428fdc0b7016d64198d21ec989f27eb90e41eac2808f636af3f6f1fe2bb45ac1872af4b996b50f4331453ffc52488b7ec86992ea985508e17d5ba7f4fef9f61a0bdedc15abee1a1d81c9afec393faa45cc5149c30a0ba7608fec44419f9a4b404f3ed25dea2822cfc0a7c26e76bc9ec712dc18c61baf5d40328828f4a7f8a32ff44f20bfe622d81e4eb34e3c4e5669602f34d6f85eae8539f780ae886e53ba7e81819869a6d47f233f738ae33c1b57f1b515cf35d3b31b1e630b13303b4e298f54a5547f8a948201853c65faa578ac292564229210b5d79e5240b402c65f75928ca5afc426e62a7040700895ad633fedc8ca4820e0711c0cf62808e7ef3daf87eb680cb7fa676e67bd8af3611788609f4ff6f496d857f7def944d697a7f8a6daa651b44ccd2f790b2d7081ff42468d9f3171f6eb830d0ff8fa92d8aa5726f1a1476300c27d500840e9ef8538142fe633ce1af6edf45d78864f240e7b55c267c22702bd4e2d57b715750caa0a7071aebef962b5201034d25076485e5c7bd5f39c7f1051459ab5443da96794d1904c2c06fc610002f2375bed4999a80856e43a0ee2073525e5cf78cb06d678aa4128bac17a5303129b20426e756328fcded8fd10fad3a0bf1d977c4358b10af7914690f0409e3d973422c60e1378b6b6137a76d0d8edba20e10113f9431a30d5038f35927a59f1013b5c7444edb7e62b343fb13ed0944afc636b6866ac66424e66773e17863cadb464397539fd445e3facb4c8dbd03f73fc6e9e844c355b532fa550980e4b7a764da50229f84594ee5726381b2c93afc4c16b941395f591385b536f1c1bd54bf356d92464ce236d4273af5d499913ba47f53aac79ca42aea32a6d9e9a8dd91690e6a6d56c1427c40e04406b1860434450090c68413a6522ca64f26768a34798d79c429522f342eb05134c79a368cecf7abb6162fc1f28976e09ef25cee145dd1bf9b277719c50a5af53ad2edabbd6dc65f6560cfe0fafbd050d4b9b514f9435306da004f95064e5b6ffb0017ee598e80f9585be3570812c9d68cbcad25de28ac9af35865b67c428b6d0d55eb9f9cd0234508fee4f2688d2137bc252461fe24edb4383962c0c99a606b8ac63a49d1bc8e6ae89f026c758d08e076fb6dec5e5504481914c080e1883ee9209b7e4c487294e2bd40d4897b471eea1a70e8a402e582efbac8abb518a679ad365b0bf3b68369a456f5b7c3e9bb44110dc007e7f2d6f789fe1d55840351c7cfecc6fdc2d25c90a7200146a23187c3361635beab0230c1aba19d26544cd83a31f7a3b93f7d3fc4e5ca467bfea0342d8d305c3dd51795301886bd94b4b8d6c95aa22ead8035c4672f57913a03c246bdae4f72d98ba8896aa99d28ce04ce58b60254e6cfcf859befd0f3d3a35de61fdb993d7e03b7483a0e5555277647ebd2edd7bab375f79e4af45bacfc410afe5dd93a753914db972a981a4a65469d8809fcc30f7042b2d17e0e467f4ea2a403b91b6459db12d9cf52fec36846da8e53502dae472febad49fe1ce5bc4a2e773bd1ae8fb5f8b1dee4f828d66babbe3b40a780a2c20342f0b8984744ce99adf4c180abdc64b7fbba966e12c0804f9e8d1e75622eaa983f2350932a0c46e884f7c9297fff147144c6659d9275e4d6bd294005dbb9eb001d20b7ccd951b535bd4cfb854708b820c0dfa71a73d662a19aa52d2bc13ab8fd67a15d606ede58df5a33fc7de74170c05fde76113308249c41d34832eda241525823e5562c32533b89e772e2b8e801faf8627e3b0a90a9296c27b46c2de4cd0cf7ec1f22dc8e29ee045b5bfd4ea654dd6b33f79593852608a43659743211bdd92399651cfc9cff4992743a99d66ee2a8093bfc92f574f237c801868de71a32a500b7c37a67e466f8c7527f4f06f4db6332872104fa9387c3072cb1d8384e2c922894b53f82e328724b8c7535ced675e054218787c491c217169441dfeb195c549b661173a61a1dab39ce5da4cec18b0f68897f91b8a658b1fd7b90bd30af900c304e27652f32e606056bd0f37ff89a2157ed27982fa349af6e0f1141ac8541f160a6c7e3045f6d9a42d120a32db9f55218f611b353bf7bcf61de90a096486c2e2b51fc3aa6e6de661e469a6ee8dd999ce52e79d3fe55886290f4c451677be8dc1aed793bae933402b43272ff6e1782e19e3028a7d2a1017c9960291249e0321cf473ae38cda01983f3c30adb1dfae530ab008b47fe3e08c815427c19e33983a683fe91e027c25041baf32c378cb8831cd8777e0fa70b2db06ac2f71883d46f0b833cbcff5c7bbf856ad03a48676b1fb6b83a9509318734948da11a2d7f0f25d871de76672dab8f7f9f5092aefd073f8863b55011fefd8d97fc38fce8a16a7ab5e922c75895cd925549ab42e06cfacaa832edb0a359568eab3d82108bc078e047c31df16630bad8ab5699f29ccd9bc1e4f45f274a545263e4854516aeebaa70c28c14d3aad7e84ad8887e5a91c7fcd32f2b07883ce4c1fd8a7a3364a7338263abf19440a29aff9989ea92d83f4f93c75dc70fe1122a7f581c4c212659af31e383cf5a5e0ae03f101946b5dbc870b519236f3812e1b1f1c69643e6765a6e424b7a280ca92f8e969a087304a1024b5d26ddaf6f32570f5001ee00624a87228ed93f8913e5845cc188cc94bd5037414fabeb308ecde7b8baf6216d7caa4b3bc8110e52cfc24cffe8d16bb9c1aafb9dbed931ce604c572ed9ac27192df1a93ff05b4e505e326e04b2765cd60e2199707095bed0cbcdfe4552d7d21dcbc578fa3be9b0b123d9ff01d53ac30416820c334f86b25e395d18ddce38e0efba23b6764db78896a99b34bfaec6460a8895b777e2550e2d79885bf7983b841230bd50b90b63c24b37b52792ef045b4c5546e3a02478b9b2cc320302478573c82517aafbbd62d5f444a6f804c2a24ee4bfdfa2a8282ddafbb4335e259cd878da3cababd9181eae44400d20fd1699294e319c88cb2106259de9b25026df01716ef8cf11eb7d33d7bfb69e1aa47311635136de23dd55448a3472ba261a34e5782f764b284a13cdaf9c13d5ac50c21c839aa309ae9ed52b455d1a72ead54d1e2284597b4b3cddc9e2136c101d3b53c4ec40cbdab85c785e4c72a52022e2162ebb28a11674ba8463b6f145f7529bc246a3552204fef31f488271be2163b57e11f749d33fd943a3dbaa5c8d5fac781b81196c18a253da350d29023cc2f58bb00b081929b8f7b81b9beb02c1a2be062918d5b4e62a67ce6837234f447336e6692187b707c565a109314b92741f9582e42cf7bcd754598d501085c142f5f41997f38d7132f2a207c60f8786f55e87db10e001402988199e6f16ae3065af80a62f9ab6751bb3bada687aed8d27f732b938744e0b5c34ae185f3a96326896b74735df5d24d5d41016dbab2ed126b92adae886598797ac08223ccc440b2e120c4e3c9fb20d22d6cec9e91b4d97bc115d2f194725016f398c6858229800a4081819d7114f3b7438435674c4d9db42a9f2b84c0f6a24e76f58c6565f6a20dcc551a4fa0e4a019b1f4aa1dd61f05413ca597024fece04e88f094a14e6c27daf0e3090da1fd9e8a55cafc51eb3eb6ecc34ce6b118c7540c8dc2fd55b4f51debc1cdb7ed7ea174400a5f4ca6e6f97e56635b6e3a6a99649cd9f0a11198dc33e7666cc8035c3731ae7a99bb517a8a1d0eec795821e5ad43e0fe72f6339a8887b3a326f6bf2fb66a22ca532a53cef70bb9f29c84b8e44eb29c3ce0a64d03cd82490e17f2633cba51981709e369a03b1e7af6f3463135fa1596ba1400f9726fba27eeecfcfb14d4d283cb725b2a5883a158b7af6077e61baf85d94acc7b08ca8a5417f5545df77599c86a3bfbe1a0e6902b6411f703891cece486cf3943ac46aaa2d7a2fda2ba13d2e423dec76734d71c0ddef0ae9536c95aa527bf48fe25a7b03e45a98d2f119273c814613140961169ba64871c39dd499fc56af1a0ae52ef50f4ed3ddff9dba0fa894481101c18256ee31dab0395475fe097c404269da0e6862f2a9ea0f1f4b7105626c5b680328e12354435600d95e8ef415c188373e701655ee8489adb8553b47d1d31c1b03c15d98ba2005535fed0b4917e50a06d70a40599bb20f302ca331264f7ca9be2df92e1b620f34d1150c881a1c7d6721afe3f67542fe98701ce200a203529948a021ef08169acb9e3b0471634146c225413b634e0621225d095316cd3596a4f3a128ae8c35e4dc10a47688cb5e33045d13c06344cff73020a5b4c6ea8df6661ef5f9fcccdc45bcc33bf8da20cfabcccc9d3061d1d4f7ee1bfca27c333d0442035b49e27bac3c93c41b06170d7bdee79d1ca01d773607cb477d1161337ec4942e06ed04f96468271eb06324bba4537275c6ceee3cc1934e9e490c0094b2bc891d1da1ce959f3d2adae73c856cf7e12e119e97ecc4f21da5f31796a69a5a00d6e9eda63d7f3dc20a8e2904ee2b149f66030d497eb9938fe30fcb6c3bb9cf69aadcd0cd980c32b5bac5ef35600a79f08b0bdbf827013706e102bed26b0b115a45fec7bbf643c2a6c0e6b48ced3895cb58047f151718957b052f7b85de8b123c187d990d4fcad438a6c2f7e706b4f0eade5da5e4aff963e22afeb05d56f5caf76392aea8bb7a9547bc80b06a1c087453a8257062255f4681f858544354ff906a367721ab6dd84cc99b3b537d581231801c45fb08147855b8fa2585edef9622f2fca3880e147494be05c8f57cc21e127848ff5b1e4e9c025de56cbe4ad3b84a154e1c4b262dd6087b531fa286254c262f92dc99008671b97553e381363cb21655329115c374fc8bad1b45fdd34f9b8ec2b2771c006bbdc5dc3a21e41e9364693818149fde06a5052ea3f53a80db2bb2960c010bf14e01733a4126a6ab632427e47ca5228d55950addfae9281df0ae10c78a45d4c15781dd84e5437059fb6e22643286ffffe4d2246144120d015b600b33cbd9838bdf15df4048653fd2d6d1b33ef2147d568eda3a952d280c508283dae82978bc3c933f589d098f22ab40f3caa175d0a1ddc9233dba760cd57fa2550ba517b8f162760648bb07650d746cd098552133e092b6ea3f36a6b1b058013ebc31da4c02acda72c7c6de34fb1055d33462f71d9f231811347cb2f5adc95799945dc993e3e187725d57f58b766c6e0d568b02e28a2abda292807828d99bba6db401dae686ecdd748d72c43985e2c00623702d3c3e7d5db0e29ab3cb044a7bae9acfe5e2a3cd65e4eefa1fbb611891487f8e4c5d9481ac309bc2e633d4e05c48a6142da6c3e22730949d19e0ffbaa8cc7217c42d36da242c12353ccebddbcff4e5bf68ddafaae07b62e1b1b1b3a86ca0689f2c0f03c5be27d9f36187731295f40bba8be40228d0ef684084fcebefc7b3937b2a644fe353736787ee99ce0d7e50a3b8c9d6222a39df7dce9654f8b3671f3b16fffc02b4af853c10b584e16ad44088a6f95f0890fbe5002a90256ab106b39b04e7c4db84c9e013ec068975a204d550e510122dd0c68d47d26f200074ab1e4d057895f91e0c9cad182d29a9e9215e80f063de77e50ee6a42b0ca0e4f40f4d3e5cfc69faae11cf00f4b5a2d82f44a041ab4b49da562829232a56b3a57a034fbffd0ac2b097d6b94f049fd08df485e064e36297da75ece501922e2861d70eb380a0a3288db19b1b71e4adba50c5732c5747758c2aae16985d0fe16be46a2086b1fe3a807898dec874f57b758d076b05cc9106100c9afc125761c150e4887646c1852a4722778b25f976d5caf6aa39dad588b6146aa23b3bffa62f3d844050a06c3e73eb4ca39b3edcb5b17faf9d0936a2c724fae0e13d917b5ee3a03f1bea1c52686a88bb3a1566eafa91ac043e46ad81a60fa90f3c0140a0632626dc5d2ade405492b21753994a1a672e43b52cb8d6b727c9e93ba1bffbf783fe2c11a137860d4abceef2f32febf330d4a2c3d206f713fc5f31400ab6a38f91aff541ef1043c78ca864e4cce8a70a8cbd311022139caa847219145d0e2f380bbdc8a0d5a9390896369945de876ce34b6f9c6f47524f877a21524347423e0a8afb214d6f31cb9fcc19f700b06a8505bc29c75046c060b518cecd2d731800fef950d843afe0cb8973b5d616ee25f2001ade7757c4ca2edd9bc103e88c4210f2c46c464422c949e53150ad7591dae21e8bdd817ca3e2e90f61856e541a414b0442e0823625da12ce07f5f2938430ba229a3d21075ef638bdecb9e6c0d053200e140334ffe32b744b22e466d4e5bf8e886e0bff1c2fd1faed6f821133d9299520c990d4b9f5b2fa929f3567d48b39502eb885d8fd4cb228363b96ec0476a34c01e820152533e0acb778992cee203be6b92e7d39bbf965c34e74fe872039667786a55bde4173c9e510c01381e101e20f3d09364a4adb4c722a55ddc21448a4f0f7275ffe3796d926ee40ca83be11a66f99a16861c8bb5dd0af63fa2949cf1359d9da8d9eeeaaf36499ccf305fe35928d190d889ee6c982ad1dbce041573c3391fdc17e13e5977f7c315467131c0f2743f5c02d8c21889372c6e29416ffaaff72881b3194f2e9ea3dade1ab48cc5a9afd24bc07df656db4ba6e2a8b37c7b9be4303f8fcb10c48a119b88dc149048e8ac0c2f9e1ac3407b18631f4bf0616772eacabfa8aa34468616c99c86ad14cffb114a6fd2f3563c26214c8c53bc1d9991d5c39bb12e498db1c452c6963204f258eb61b75c18e07d33dff337d87c9ee6e9eb2117ac28d938ff22e2ec2f2b8432b07427fa2aeac2d0b88447ae714ded7b7e8a8dff1078b1b8aba7c9023cfba4eb416016980cae6c0f7eac9237039e6846a59ca63e0a06f8a82b6680db713e9468930b865d23feb31c3909fc202d8620f167caa7e791ef53916a4c3daac61ad7da0c31d9a1ff7c01c3ef13a4139401cd43d0ca8dafef58a083c87f9ab4f0d5ddbd75ff9fc399f99e615ff882075655d14592073f440cc7c9916e516b8742782f7d6f27c796cc90d43bdd9fe08ab17e8f10fd8aae3626af85d8f1efb41c5618e8208a64bf1416d916831cf668e1a3230d898f3b6c2b43d2a075b40eeafd1b18dfac68d4be6814e2b387623819da309ba450c284c4b70594b2e11292d09a0387108217080848971f66148bdbfacd9e37aa8e04d85c2422c7e3eef0dcac8b6d1f1472998a54aba1809d75113c75fb7fcd19ce11370f41140642984c7fe298b82d285555cc8a8058d4c584130eb0af914dd3f6174ee213e342e1a026ba16231ba55ff024da77c2ab194b8c0bf57fc4913baa4ed10a1d1acafbc4a2c4514ec440026a342287ecd03f9ba9c4c20d1c9b126eac4dc1f40e109bf2c6037a8fb8575c8241bdf65025add8a0f851948824c86e5cbbef8de8c63b6c91c9983308df1ca4690252e6641945846277eb97f3d148392e22ce21603ac006c76127bcb5a0f1d143475c5b5abaf5687487f3222d81342606ef8ec0faa02bc8ae804ac6050bf44893356ead08df0861f1e7f0aa9e8023b57d38b714c8fb211852ef30f8a248c1aecde59d168c496670f50b73bb05e974b8637c4ed40c4191f81fde3041bd8d7ac3de7024bbe8f20b50b2277a0dca275ba22ac1b178f278d2e20d576e4a7b0f2a5b58f36cb1cb2e3661149cf62f0b95d224101d328c747539418110ce0884ecca2ddffa116a1ed32a551015c60e36fd0b4f466bb39a3b60e380566c0d7a757756418cad90bf369ca987ae91736f480eddc008f62c5febe96a45470dc2187b139822eef5a365d0cf25ebdb743f8ba54907f7ec440abdf0140f8f8c40cc1c6dd1423a9394ee8ae3411ee9335da16d6822c1362e8d8c4f065619bcf7293d634200e1dfcc3e324e4d9dca862304e9187240d5d0a887a890ed1cca095bbfc02dc2bc93134bfc07e1bd8fa0d204be836373ec7e08cc2fa2ebac03a3c88521a5091cd95d591c346be465528732bf61f4c97fad921aee16214c4630dc57210505a55897ca0a9ceb25d6e36c9ef5491c016403bb3643e2e4642fca612adeb083be1fa1281ae87c66ec015a36cddb9e2b4043e5860f8b91dee78af592b8211d6456bbda4258b1f0a1541440fed2a31006552f8860fe022beb0516008011e69c0c1c0c7f5ea7f6a9d074af34e4b3a03b7c6d5149f0fdb11ab7dde484846af02617233808c08977c8d741d316ad0528517ebd2de9a3ded7b5ffc1ca2cd9fd1e6aadb19c1cc7da0ff60543e1c049f626d3a01e2c61145a47ba69ec4433391596dd77cfaa9d9203353c91d7b32b70edce05ab1e935dafdead35bee265bda17fede285cff56b5757a184b6df675c15fa704f8142a33ec93e09f7ce81d0b54bb6b2701236c76758c45289b2b207d237433a4940b2a488182195dfc8e1ab8f769a0c21ce3a1e39f55322e5764134f659ef0eea9a0846d01f2495c7273be06970f6ed05586d2f3c5010d81ca3ddf08c90d791a67c4eccb3236b19d62ae868bddd99eca93c4bf50bfebaede60296832285db712299f6362267a1574b440e6fd43c0c13f0cd425de302131e6916b73f0f2dc26631189025c8002b160083d30b12198e809d2d538133901dabc61de8060acffacefb6d3fd2ae4e7c3b16e2244894128c94c4d35065da07aea1412e9cb822d09c423439ec115c5b4bb4b4beb272b8e0a39a4b01c272391742a448f75b5bdd2f05fb7ede46310ae6cff02b68526fc7aadbc8368789ad52d11fc991a17a60c0fb82863a17381e98fd1c1de217a636caa74ebe391916a15d9a93eb5da98ddfaa02d6911a576dd81b4e7eef598c5cb324461910f0d7632a3b44a66aad264baa411db7d255141a9400bdcb10076285ab842722c9788f267f20105c2e938b6608c724a506fa4b0cac143731adeef64aed7daf7476f75d8842e7211184bc5580083ea49f3df4fcd44ab099640fb8ab2043ae263a45fd4773d24e129e78b1837dd641d116d61228f98b53fd9da0ef5fea8f219d880dd3679b2e3c8a8d4c005e66ed6452e3ee77c25ea6d7d194e655737b0eb417ceb7e59008ed356dc752ec18608310878d0a2dafc1f3252398ff85299259ae3d0efd7a5e76af07e3d723c95005cd93feee6ba09dcaddea1844f80d881ec2bd3da50a07c86342597abfdafbad09ce2fccc7664e58555e906d2585c9b7cbf7aee6c3076ecca2436c8f7dbf32991029bb235b11e8feae105fea656e4c34bedb305ebd39ef3181a0240d8c40dda6f4ac908f3c7183518be2183bb9f2f2c10ed05f45230385b1e03d0891689caea4f609675a7d7605f4d6f8d0394d819b17cdf5cd6dfd4c7e6c01faeb231c14a0fff6bd18a9ac920bc6e4d88aa94fa17ec18d34de717a91f74d7122e7f6369cfcd6d3cf08d251cc56bd55895903d6ba82bf12d19229f3d960c5750944f2f6ada44508003e5738cd91f50d411a9d5b47780e86235b875949b33d14fb1c89809ebcc20509274dc470fc8c44281f7f7719ac6174811a39feeb6d24a3fae95346b368be190a781f3d5435929294cd8f7e1301abc5cb78e270e6181a6a329d407e7ffe23878d004f540870397ca7c63e47e67ec466b14c09b5c51acc65cb4b2d575eedd006840527c6dc3e9b785af186bff6c297d75819c1c7f71088c1a7995b915afa7b224309292949a447de2ae2e92e70ceaefa54888767342b588d6d70b8f9e8f78c851179a2d60d2cde0faee94928e3014fb877d93715a67493c56407f89f56ac4a5f74c869adae915ecd4a7f50fb15cef3207a1ec9d36d09223118b892fdd44fd9d57e1a0e2f2f04917ecb0a82290a8f0164be698fe4436458fcbb4ac945b8b08f8e59ba8dcfb62fa0b4ddaa5a69b9cccc3e3db11057021a88f42eebbcdf26a7185b3e05d8f4e3730fe467460dae646cb4fada266d043a51be18ed726772237aab4081c5a0f600d91f3a05485c2470f0de87b664f59214112e690afce73ca86f2471327e2d8d2ec72de7261d4171c709d8e3fb98f308cfe6abd4175a1171eee4b8fac2f27d1e999b42e5bc9b6d8f68b4f191a03808215aacd081551aba0fb1b50313f066fbe859b92a7d292e4572c047f838199e2d0903f1f6820a1795132841363f84ac487272cfeaa3f0a69b9ce524c30385f2274e24c6a4fbd10e60113c1d177898b1fac5cb8323d4803a4acaa27e9702bfafef4fa0de7c86a196340e4e927c50d22eb474c4142efde970eb6b38aec0c81da009d5d10354d41608c731bb4fc3a6fba2e09dcc3af9bd721ae17b4dc6ab18c9b4b18cc0569a1636d286ba9e84f36600a7d6b0b8e85d41dd2fe00538a24aa800369d82e9fff5ebd71e5d31af9bdeb65151bb49bc3285ba175ca4cb354afeccf95878c8f5993d5fe1b24b5c1e1a2babc89b6525b97057c0c93da0c7c437958c97a82e86c3bba05fcfc52e940a1006a8c38032f8224de95130a106eddae5b6046d6730cf0f69eb0c32e5abfcc59b35cf954432eb9504aea5281d405d248804827562e274c59e5ea7a5b01c5cbe810abcf1bdfc334067647d04d83d919938c2c33adb66cb184b57de92aefa6b5d3233350ab019d8272eeb653a108b9f96f5c7d653292b255c5b98e98369914b35c83d3e7c4cb3cfb09fbdd45b9831f6a8592f5a29987811be6a8feb0b14af9a10d5aad2c1b479bca4f4b1d48ede2ec189566238aedf0f2f52bd58bbca7da09e734e4547985aa642ef56234cb26b545fc219577ff800e6112f70fff02c9b88b9ff05b879310203e14418b18c475e2aa8f6dc1c7bd5c2a1960d3263df43b2573f5a6931c8ff8da281b06daa45f4f288a05f98e08e3ef943b44a754c152ce085e2df042dfd0d08df104a6bb129485f1918345436e706bc619b7b1c5b5ce9da40f11f7d2ebda99385a806b2b8bd6ac7e2b73827e8173c27aa16d72e99ccdece5480f2c610832bc1e96216de28ecbc06fead51c2311d20abc5dfae5e0847644c7d2dcae3a1956c6edb6cc53e233aab74e4d564f8eea1039f59d1123b9884ddcabb2428d90572a9232157ec670bff4b7321c426b4cbe9e336b7452b1fb97f72a055247652a79ec481ce8e8fb0a080b62da9f7d08b7f28ff6d6ac584ca8d794d964838aa400685a8fbf6f94cac1969f57c0d6deed25fea774a29700972371759a7c3bfde7f8ac43facdd3b68c181a9ae226de8d7fd7df1d5edc1e7aedc4239303eac6e8c2114fb831051c132388d0f772b9297401f1ae74fab1590f89d264b460173815cdf279f06f06151147b1da4796b972f3482acd6c0d03552054bb3ed4313754458ea9580c60c5934a13cb8ad5b460c83e443fd3b3f75439870a7ec6a5ff258147d321b67e2f416981d704b2b0d0da660d700675d0cc8ff90812be9a46aa763fdedffc2a9ae46815a1950bfb47d43ed2ca3c91ab939edf7210cbf7b289217eb34f5df8cfb47527a0ac9ea5c62f3b14d6d14c48f88e8fe2c0891b16b5abbb50b1b44c2c72626783ddc2d1833d7952d21d670535d55144cecea9cd2e85435401d0b0ffb63bb968d310db08e49a2ab2f665bbcb3910d9febbe9823ea74e7101371187cf8444d7dcadfdab027a601c467de424ba493495e9076bcc8728843b0c635662f7f806379d300f3fb351cb9e51db96b857878a90cbf5830ba10517f758ff8f1aa010a1c9632f77717acf23c86e2700d91103cb0796cc5dab1403a8c9eb30cbc9b3c66208c45ab98180eb3c2e99446c12e835b91e920060ce48489b8b01fc2b9996d1cacf66f9e238dc937398dde2b3942b4798fd9dbf4eab6949e4116bb3d1ca991ef5c4c0bfb34958f557cd44701dde57050ba90dde055035308b13d6551c03fd3b0ae22349a310086a9ffc02bcb7bf37229ccbd56cd51c1db73cf1ab80c28c59cac3b60fee26ce77b4d5aa7f14ff6035b0afa78e286f48714b3ebdb2b887175f4d0effdbb959614b16b6a2e22994d5b5c1dbf9754cdcf8485ddfeae2d6bc0ccfa5320a527909120fc535e7069c463f774d2d97ab65e836143cdc23e5c583d9fd1a47ed9c7fefa4404ef50afcaed7300d20e60089d958bf3607e7819c9c405c6e84301e7c3dfe0194fc0fb8e3362b8aea63b6d946d86a629e38b234799ee094051b9a94eb299b2e85ca45bc302c34e3674344f810f58042eb18170aa0e829a8b4b4a91c60c825a57a6db685f8a6523a4c8c0961b456a6bb2ba1bd885f740cd71a3e39dd9ae7afb47c092c66c367d413f567ad3c908b5f7d961a6461b70b160048d125c8efcbf9bcbf43a673dba020848e254797753361b0a2f230aa70a93c44389d9e9313eb889eed9ac520ecac6598f70a0734ddb59493d54f27fa7557e899e9d95cc6b8dcface051d437f66d52da52a86c69aede74bc4200fe8ee7c6198d7fd8d4c7f55706fb48dc31fcfae81443ceeecb5303d654451143f9aa86e9b9b200d86bb64e1fa1ec5c789c3def88956cd2fddabce62a6ad595117024c829f2f86be0027f3510b8079930c42f83707ba9812feaf2737e13d3b9c572a7ebe7f87b78229a80551ac28e8d0daa5ccca079f10a53b4ea75543ada85aad1b48d86f48060ad1f5485b76237f6cf4d60beede15e5311f4995526673a256234856cd93de6c5ba9d56ff4897173c37484d8c2113f9ef551c5151dd7cce61de460730a26218552813800a3161696052dd506d11a03760572f413cf5716f699a380d3b26ba24c913bdc3d616c90a9ead94bc76a40168645271fea2c37e73c33b92f9526b1b0651410766c7aba8c64be17df71ee71676aefdd2979fe7e42f4dbe58be52d75366358969c80ff0ac6ed016c0ca6cf80105c43873e9cf448d8271d4aa6c775430cce676f1bb2f89f730fafd72013f7e69ff6374fe9ccd8f3f9c63313a81b46d27b8225f358ada12eb272a2c5400ea2bb19349c5941650e8fb1d814fed7fceebc44ab957ec22bd21f6fd76795e40dbaab9609099e9e5cb6e2fa12fba060a6500064ec1f4406d9e8a04086bc7796cb8450231449216c08cc3ec41c509f5acab2761ce9d256bdd4dbc27bbc01e6044a7807763561b3cd3a29579e34206a2da3231ced5dddac7727810db8f9b37a5f5009ddd9bf8bb646a9a622a21e9e68c1281c6295f065b2f6f5cf5937b04b057b336f7703619a5926d71b241229139a19025081ad173742f4960a4708e69c32c5f0807a7b6e57ac95e24c2d44b05f18e3ac108c52b8c882585d3c9eee2bdafd418274f892f7644c54333eb3161db05ce44513eabe12a9939d1c9cc3f8a05adf42a8003451fa6b058b24ab58c37e01fc9ee925accaf51d1dd3228955400f77e6ec0cff525a3ed7b5131cb6454fa8534fbc58e0f581f49ddefd26e578a0977d29b567b76d8add4e848633599584f582630171438b8190231ea87b0cfe98ea1c52e5c0e11131c52a08f1f825d562c699d53734409f375652ad2ebaf3c8cb222f044e53092f5718f0862692d589634ac69d2d652cab0321653d8285de1ac4d21b783b92156e0c9f5298c75c4793bf488c6b819bf71821a41d23acf59460f2a40f2cde16dd23b3ee3fed0d87ba0022fb129d83d34b7c1212324c3ba095316708393600753a1fbc35a06a7ff6cc1c982d58be00296ea7aa71cfd811d601e32c9b2750109a4c2ae5fdccc67029ea44d19c6d300f1f50fb2ddcbc6122f5a4ab6b11be8bd22910e1288280ae49390e0ab5d14d9b96b062caa671505b294082cb62057e0a16bf9d5919b3561cd0c84848e88226de980a21a0f0a2c234721ccd24f47a203200c7782386c29bbed60d7e9370a39073a5448941e0cb87c3734e452cdac6848dbbd0b7205d6000c6f70893995085aac4e18c5668f310b9f137f2b597c24769e0e9cdb5ad0c4efaaeb674a81d18b54db49797e7418e451ea0a7594724a14d92422d1f084bf8985196762b3968873ae179fea25a378d8e68f2edef7d2ab5e5ca94ca28a14dbe09aec564111202b3c085928256fb03b10546db98bf98ea1d5088044c864b1cbac27c302f25eb001b38d3bf860970ba8c7ba9157785444a4a01546660280edf4aa368e05a39cecc3c7ab398ae93a671048e14013c3c7b0322f9bb64281e87313ec3523c3530bf47b2915d411557a019eee65123ef7fe0938ce756a4580e5dc8655a55f02eeb9d7bbafaf50c1bb7b230e81d3521831d495ba463861269b265fc3920b59b14228597223dc8827d4baa1a8e00b052ef8038c23d74482111b51ef2fb3399fe3901d4069eb55d02b2c3c0440922528d680c6b57fc22bf9b6aef6b440584b202bb833f8c35ec50c467b7792063fe98de386978864ad44ec5048844d96a22aa05013db47fc3f4b9afcbf483ba1fa3a9a1514deaa30a9b9177917fed334087a84338607fa54993fc11b1496e367e9bab1da5667aa0ff60a08675504a1fd2d56846ac94ac5704fd9c6961d710983134d7c2784f3664fd10cbfca03da4f8cf82125720e6d8a577712e4f41268f90ee3a7d273f614df33cbf0487645b86e70416f29fda5533277e4a12f4109ad64aae4e57df268e1e73f31dea55567e87c98523168faea719631d395472675446024af07821f206758ade66b920c4a535d21d64b855efb69ea09ff8a8596f9915a7d6d8b1eddbf262fa32cacf7665070cd152e5aac19819098290230da20b9ae5a6cc3bfea240ccb4679feb2fb42657d15836d3ac55fe212edc5fc81cead7dedb962c49ba926a1de8ec6a3c74f0df1453f23ef9d900f324ece4573f3b1c0139d7a1b27ca105d94c876cfdaad0ccc97bdb3fdd7e1637db0358e741a7a38b97e753ef6c65f4931ff166e13a4eaa22a93a3aad66c6bfa47653da92b29febfafc924c3f524ce180b4b1bb36e49ebc195dba918d50e20c7e0c6b5f00e5da51c46b773f8f108ff868f406eb5540e0b35b90c6fa2701eb7cba992696c0360597d436831d3a12d9e189c78eea212d55b14f0ffd1f52dfcda50724638781b6ae7fa660c71a142fc44f0a67a97bf11ac3f68d5d629539b13b3919ab344a9167a6c6fb84aa72174d5af06308cccc91d28ae9ac354019a3cba1b37e1cf9f85f53c10a64bd9d5f50306601012d93d778a305deaacf318981bd8575d14cddc51e475a22ab1130b7f4218f2b3ea837ad68a9185c23e995f71a9cbd5467cafba703859cb356e9abefa1410739415818ef729b4fbe8fb351998a684ed2ef14bc3b86695366b374981937f8ed7d37876e6d1440f7ba9965b4ce7c4a4bf8efa81dffb23907d727038080ca1c05822cf2f29443fd6072f186ade14a18311a58d9b693f7810f29dc590e61352de80487facb88bf059c0bc67cf81f8027531b38cada28b4217d705ec30a9058ad9f242a7a8bf6f3d1d6144794017809034e5b6a30ce16481095f9018d5abda93caca33d128a3a5da7e86a121d78a20fc4aac0c2f77a180cc2e4208386c4f6d074d71188e40229dd7b6c479cd2b8cc32e743f77f0b33cddd09427871cc46e27f7bff833a79779e9d501e2dde9f197281827748faebe82adc1d1cfc19aa2cecbf33e04ac69bae6033a535146477a2ae63850d728ffbc237db428ac237fceb69a471c7f66ed966fa85de295ddd192d39b8572483f9355d56ae571c99603fc7896f095962a55f494f753a6779d975a125d3099924056f526d47d497887a3aaea845e4cec1707ac00eaa0c4245ece334a56e9e35603471952cdc92514bb7b664c1e6806c8def60f9e6c64224bad0c82df0e9cf06425f64126b591963453cc6866bfdbafa81744a9170c45300256bf674bf9cd9fa5cae6a6ae3a5d77fd57b24d230391ce9dae954083eb7faeec6222d373c75919d0077fc5978b30536ff8f7a6492fd4f5dab3bd3bbcf736ed6daad13491a468ee486453409f405331a5b4f13481006319a6c17d4834d039c810cd871843e4ff0a8340eeab903e6428b856742e862bb87562129d8815f9e85330a2386c4203893cd20a1f7fd96465b939f8446720fabd7716201ea6eec298b3ef4a65e6bfb5c6e52a97ed3a126c2bd450df0a71c44886a2049703cdf493c04a3c2c637a42a2f728406c61536bcec19f8682714c92e26b9de4e66ed7af3cbebe16340428bd08043f7bcd7884dad4329a6dca4cfdd19fc8c067db3e8e8120530e938c5a852ef4bcd85076e7f6d8a1950c3880a2b3d728d6503033b90229477c3ba5ae1911385485a843f5fd610ba49811ce231f05a4217a87b13d960fd88fc2fdd94f59601e324e09d120e5876f5a96439cc6144fc889acb5a905833c4b24ea19f05ccbf02470049bc6e561b3bef00f10b022f8d358037b7814d578867041d79cf28d622c8fc2e928bdd81113b2612c249c8b26a3072f637f2ee94e8296e038cbe011185ff038e3d8ec6f19b030fe7911c15c6fcc0070dae8c45e8287507d33af2dc034b2d7a4cd6d4ee02ad02de619c5359456cf57bde8935a70ab19cb881c9e4161a85a8c05bb799d786d34194ef22936117c2b0562a880d41314d69458b06609082704d20ba853c05e6905b5adf5a368093a67547c0ae92080527bf26aac3bc488ec18045089dc1527901116f05b82cc3f5df65f1e9c9ac393feba80e28eed65d8c8ce935bfd4ca2bbb35a6fc4648255910023b3eb301416056c6d7457e66380e527f8bdaa6f1e0f324a1af754de8bf57eb824016146c08e34ddadb780757275300800a2183ecf2990940c7862878c89660103afe9df2425b3aed3ecc1ac8782bd90adceb517686558b2f9e2bdfdd0b95555910c51c9deace745fc03fa0200f0db5d0d4451023c44540a0d144998fbf810ec8e028c875506b05f03b1c64c284043f2f83f999234390c76cff92c28b5b9d82d26547d64446094f24f97361e5f78c805604240eb33396a2f681ac8fdffe104e274cc6983ff429f0d62e1f7c0b53b53e6c8cc011f91e23a839d3a8a1b00d8b77904360ef0d4674882d73bdc4c183e00971731f1eee1e307feb331784ba0f80bdac63e07a600acfd6859d977e6de22c5dba49a5ff9f33c755993ff46a7059b31ff66cc0bc1c9de4ab6549ce002669276a51d40947c8424a590d8f879151057a495b3cca47c52c32c5da1165e58aa65ca235d03e2a9beba468ce17d3015b1fed715ae055b169ae197cfc5f716f45cc8e1ba4c35b4bbd1af883e6d212cb63d6dae7589923e3f90f3f4628999a8b39affbf75388183890d6434269a4105fd0ddf1788ba03ab6909383a02d86682d6ad81151e27a4baea64fe4caccc7002f9ebbb6696d39eaa9639351bc8843a8c9821d01713413bd70117e7896097294d5f11ac9d499e4a6b9a726516b41b44baff59e647d72986db7c549abfbc64cc26262f58fb8bc078e13b5cc54c9bd759c5c91152494e36e02434736849d9c2c4d8b0227780df33dff67a13eb8a94029f026f9ceb7d628f2ec3f97bd1de3a4a84e0e92ba54c4744a506ae63cbc286e1ef80214c3486bdbaead7a1433348400222f6ec52698c82b7ae84f6a1709587941014da02291963f6acb59a5211a00646c245638e9b33fe4fdcd0103542d769cd4e6cdd0617a30107dadfe31c720c5764b008f8e904faa0253d360772f41245fd1826a18185903bead6caf490905785326da894da7926604d9e8414e3eea1f16a1193327fbd434d9a5a5831b2b7ccce358d9b84a8f7605c8b0979aa3ea48f91b8104c6aae85bbf135dabd82b17c114f4e3664cc543fb2913baeb148b1dac215eca78f0457cc90a3fe05442f005798da044bd188fa541050bdc13860cb826d6f02e2b50aa36e2acd511f12c5d3b2da9dca5c8a3ccae5a7af8252c6f1d6bfdafc8e874e5a9a43f1ee1bc4e0144d554253fce71b30c5d3ba37d5ccf26de095437d1c574f5130966b2cccbbd07bd34a2fc60fe6cb02113ac2b6d11f48ade4c298bf11ba09050ca1737fd37ec8a780f5d02746aff0edcc94a21245dcf2ff1f24d9872887de55fee6ea2e06990a779c15001ddee15b7434464065acc2257775a0798db37235e21e301e4b69fbf1b979aa5aa95f93f2511ea5b7d37ada8e3aace2ebd02bdacb57583ebe01b4a541401f8f80267a384f091284efbbca2df3402573531cc92c7354e569a14ecae9540df0ef1a2be0d285cc82084f12b0fee6c15a0ad07d96a3427bd4770a98e5a843b3ea946cc245022b1fbdfe8a67543e078f3a554a4f3e7077b484dad16c4fc3fdd016286ddc1e95dcd09ca0bd7cc67aee7e13987321ebad9fb52a7030129105a172961b5f221161b7e1ea124c971aa3c58f8649ea45f374dc5909d2c8baaa85cc73112591495049840da989e895a5ea880e0e4a887693c8b1aca51e0b5d11e6314e5db2fae74e159dafe70db3f9984c323705f436bcbf6e3e0d103ef5bb8253feeaff319d5982af29cb1765eb8eaf4c03f13554f56beee185e3ebc20db78c4afda4b6cd558b240a56dd1bb9e6c52d0150ee9580cee20f155d001d4495ba655b13ef7796fd22d48eee186a849333ffc4d3fa6dc845a9d42bb93dc85406c596336d4b854c46f610d695da96f98b7a6bc34d5d14fe25f5bb70ea6db011b8c648712dcc81a85df951d12917ff08b868db7c2c956c063cd0cd787dad3d577c8029c5db2f37cba62c64019c148153ba5b04a6e584475baf6cb825ee389963113195e39c8bca2792c1e6c58b6b00624e1236d324276e98de4eab8ada868a4601892c741d9ea2f6b042aabe97803f65c579f7ed89daca8ba5ec4e18edf907caea316eb7aea3d7207451d1f76cff02b8932dd481a02295b0283e26362cba0d163a66f9f2fae55a60dc28111660143ec92cb03fea41608e377004f698ff3e78a19ff49003070d25022557fe71c3699aa1975892e999c8dcc60e822fd12bbdacba8197511e547fa7784ea00073cbee8cda1d1dff86c93fa48bfbc2e79e5322ab78b134df3f37709c29fb6104d64802510195691297c64e0f8ad2107db349cb705a499780d51d8c9da9bb58dc3b266716c4e99d28546abef01c83ea79265740d87556dfdc3a983840369b1187c699d84a6d2b83aea81222e5b69a079b68a6a0861c30072f9b7d4ada64f37a6abfb35a2ec6d5862eb2e98199d47bf39d0d8efaf666f1b84c3ace39b61f14ae16b0c5e0202e440c365701d415a59ba13575187dca672277275799f882446c8d146a4abdbb1056398b5ed8215bd82d996d06aad2246c2f8f88bdf4008528455f5e03e3cbf23b31a5a6407513cbad28a52756070c4a5925f8a3f832eb04b9c2998d12272d202727962238273c1074ebc019284a0e55497e6177bf6785400cb62e29b50a593f41a0088200781942a196b8cab3d52db7f15ec2d83970fc4eb595d0f1a4e8bd44f2a99cd9a92557a951107101f3b56b93711dd52ce36cccb9910c51c760300952debc45d1dde79c49b3ca032fa93535e45443e862369716ad2909b9fb604fc6e727672e9a7ac20729d1cbca11b25090e791f7e04845b364b24c9d0391dfa719a3de34d8770cdbcc50cfd5ea7c8306d0f3934a2a9c1e4ac9aa46644d203ab7cd55ab14cd411b8768e43ff699078e221539d5a321b269a6282c79dcedf1d0088e29a40fc32079ecdf07e2b0708187a90a09891b8e085ad09c4a00a2f1e2ec51c6f15023b5ada763f659f92efbd168c9855836411a0d1474bc58a2056d20ce83b2c5a0016a041c2035af24c7dc243869e0cc96d37c91ca92792b4a035824faccaa3cf0ee5a7392aa4694468902cf9c19a62150a94f496d9ce8016a0c820c7bdfd625d251d57bdbd10080e0215dc5a6a2c9205912cfe0b493585100de9630e530713947d4cbd53084a7fabccebc9b9838eed995d2d8a90eda72d99239675c1a1ed2c412bad91780d6bfcaa7770c9b5d992e29f141b3cb4dc56d335122aaafd6a6cd88600544357ae51f21bcdf4c81dfc31d4f00f0fd493947da4639e49bf22feeca4de8074a426cb80955d8d665422ea8ad9cc55d78b9624f33ca74d7a6e283b90ab24a5e663e758200433e525e0e2bdeaec63ab9e0c4a99c7801f75df2945096768e89611092ec026092b05029316a34c50895e9df774ef7c5715e4a27bcf2fd6fd36391056b50ec97cc790100536a3c32d535f42cfa8cd63707a202347fa3b739aaa44a281f60f511c2b1ed2a9d7c253cdf8957d092b0102dc41c8f43be560a66ee4d35e7ef2ea6d926067ef60c0322424fb6721a6e94d4d7e6884ba72c66eed6fa343619a33b5647e4958ebb4d11cf235171739a6a2bead8d327678388b323647228f3279229ab3de63c41dea994c9031ebccbc47eb9f65227e7fd27dfadc45735bb3b23b21f9b484bdbdc3b3f8f81c176f878d1004004a2cf34c4459322082538f8db9517627fc6c18cee0347e65a5b54ca7ce0674da148eab3ffaea96143b738b0e92a9b41916aa4de1084a90b8ec8af664f98b149bdaf62202993909555cfa870b07c6cd46151f7f6bf76085d959cd22fe9d70ede43ca70b852882559622138096da29308cdff2571fc3903e03d1828ab660bcb434c29194e392171ce8e0648770dc77fab915f6d8dbade4f8c8474ad4db712a720df870848c1da5330b318403ea6afec16f08205bd00160ff5333f05bf0066f545df3536a33ea2c7d318f496c48e870ea21e3e926ad42abff22b4bf82bffb0a4f0eb5ef849a1b693d012eb36339cbc27498e1270015ab379b8fc62cb13aaa5e5acf3a64e4d73960bcdbf32bc0325243aa7125d9114317d215293c9a5458c011f871086610fac8eaf9ea771897b6d89b8cbdf5dd97bd43804cad82e33483f3eccc83ea1096374e806db575d8da92922161a62d009432c10a05eba86fd84c6f630412abba367c305e807b9ca5d58d0f9f7613fae86a31c94fe43f9c09f81170ee966316bc710feca22c79ff3da461221571b183f2dd6b94b2956f708aca2294f2083dbbad58931fc0bfaf678722c204c17c503ea6132e610ace7978b823badf1b9ab31ab4314860ef4bcd6d55e9f2469e3c1ea84c3fff6b0e7ca51c0df5019d28d857a38a20fc5978446086c955e3f0dca7134a563376ad70bdc956210cc5da073869dba63da0dda275b00946200bc49af6f6c5cb7d52580be5454d875c620e200c41ec34b842f8e9e79be6c4b33f25cf876ce4294581faf716b2475f78e93b35e8f46f0dd036148a3270059ff5d20fde7a9842e47c9fa4b9816705ec2060d3f144ddc9d7c5181bafdffb6e09a4db8d7bcf118de71d99d11cba8a2a3c2d5c059a0cccf8e44c29094feef27e974e24f200ecd73d63c3cffcdd15be669ed94df09e79d612c5da20940d531abf698b53f802af458cf7c5e2085899842108041bf08e3239baccfa89960afeec8a6a9d7089ba4044e1082e84eda9b09d6587b4a900e84ade9ff294774cee779138edabcf117fcf4b0e5d5576014703bad721571976c858b63ae3e2b274e377d5f2f4741a0c83f94e5f54326edaf92101444ef13cb9938fda2a41fcde2663f0a1e2b2e23df8fa159b171d991952fdd25268259c4000b240a11432cc21f8afc0e8ccf08ebb90282c7435471ede26d492a08ecd6c361f9a634ebabc263d2f467f9c0eedc9ed5fbe788e04d017a6e1d8c45623e3247d54407d81cdfe3faa403c6869cd42cc276c5976acfd20cfd505c987e4bfa474320df40a7156d3861804eabe9e7ab4fbc3a140fae88dd19627abec6d644c571b6f39d05aac21ed1483b5d8889894c05701dd41aee3902426e12a0c377d890fdf5a4c098aebda05c33d75dabf68920a0e4d9790bd37ab7d4cd9ba48fbe6c0f84c046450f356d8aac4880f4b9356685b45473780a88d04400bb5e37c3901ba09c68cb987d929f404a0951173eae1879906f7fc75f43f17f5feefa05d11adb62352ee0ecd0f44fa795bc894b17fc30e1d50bad3d0c6d3aba3e4b195340473df8295ebb699b34b587d8b551eea4c423d58d2209b3226557787da18d1a15dbd07c8087a29d681a090a62d0a812eec1a222e67f7558abf307e9c258986b82e0e0916ab2faac3d97e0a83608f5320d7bee4009491d088d01b1710f2b7e1da1afc89c72216b9b028e470b5174266c68a369240a87b041d7cbc3da7500b4740a273ed6964ed83b5bb4a1e0dea14922ad8314ec8fd5214a1bb2b1091acc1072ba1eb022a7c3ce753334515e5b454ef42ca5e720f101c15c7ea97c714923568e03c71ac6c47bc13b456379076e81fcdade82797d73f3e5e1b185e35bba85b0b2828b376069b8f2750bd226f00c5a1934b3650e9a510603c89ad8856d32c5e320580a2d623d8fa6d558d3c25c0cd0ab2d32eeefd1169a4e03531ebfa7e1ca914f5a718c653150b637e9bc3039d6899a268c9d6fbb6179b1e8988788a57c72264e9b45bc1c09699767f63d8262b4f9ddc8fe1e70c254ad1af480be3235b041bfc83fc005948fcddc6fd0ca2c39313f4af6889b1ac5e9ea946769048f7f75bad3b8dad0b4c0fd154b9f05a5fd81245400299f8babafd1a99a74f63040d8f838d0735565a5b920884a0e31a7d17da742f6a02e41746718542e2dd14270e8592e732aa15fca9077338f5f9f25f6efd96a4741753cb323cd065cdc0b86b7a3831a172e589c58690f849ad40d60e881f8a1ce4383f543044d0bb07249d460d0d51fe43501542f1eb8c90cbc0aa0f4fea94145783a453532a02c138e83ca278e48f440f70d37d0dd5d21a716e1c43b50196450e74eed1c1534a95cf49bc772fe8f8c77f53903c5907d539d822c789e10cca555db9545b4c5b5ca91de9a9edce763aad603420893c2178fd5dc532f1e577a5639c2f6342f511b5a14c4207fb07ca99b1e8717f15b43de721bce3487a15bc400498b612ac6d0c93140201fe2290cd1291238c789d6c637802551088ceef67cbbbd2f568629ff2595c114647714b7af7051a733ef6ebff7b35bfe6366b83be1de7f32c884f4fee474dd96083f75b4d0dc2da2a96c602a20c3a447e6cf6c01676e920298bb69a5182b301da35b1d4458816c4f7ce913a8bd628a5a7c166e9a1a2d834442a058d14295c7b46ce15581fc82183ace44054494e4a5889669f82f5949e7b582b74fc334c3da00641872ef6410c752fb1237e36f919404b17d00aeaa63bfebefce79db3451ad045ed7b464f31b9bcfc5ef142d49f05436f3baea645105a65f95d616b727a3c77ed9556345a6f60f24919f50544334a73b90600c3482d6c4077b4116aeb044800d85af575ab1d4df523e90eaacd2f42c82c8eace0bad6a30e3723bbf1d72285c38513f18f6ab132f157a54f6fc2680cb68feb0c391171438191822baad4cd0f570bcb2d202980c040e9025d840f9f7afc4d4080f4feb0b6c0cf16ae435c0364ea3076933ac8ca8ce7452193549f857ee5f6d04f45e08fc0f4d8506c836d423d132800832fc12fd40c35923a3ccc762aac4d762ff73859d0550d0c067a320ce3b2d2c43043a2024556874fa8da49a050dd63605039048acc62292c1c614e8cac22e4ed875c7763ae25bcdc21375ae6e29fc7bbb0826f5aa2d9905ac4fbc0c2da8c45662fbd6027001c1faec60a130fa33a365bea860032f65a8a6942c5c535c31fab5a2a54a6bfdb55a67a0ea4cb992185b382b86b05638c7712fc1ae8c233f5fb66db4e3297d2263225fbc65927ced2e7bcc81fe6b9f3178aabe6c114d2f2d622b1f6e1345343d41f859ffaa85722e0f46f9c793f87c4b44bd651be379ad9b396b0b6f794293d99b627b9a96eb21349cd1399eeb0a70b4409b8bcc08903ea9174eb8e6c7439726170e6160d0b7dde1cefb78a5da41f3ce91f4100a856c7ee8c0470514b46bab173ed3f7b49bde15eabf9f748d76ead521413cf4a4296b2be67d6b79e3ff14d713f9316ff124fac0d64f9e2493e2de4f03e5de8077a89373388729fc28fd24933cbef59bc55da70c5f77728d06b59ac7bda550d29643990d054f602607c57434a75e2804d72ef1ba1d65ddf5ec0495faf592c415a3bd1020738ff25d6151ca05c3d82275f233769fe20056115266094b0a9d229189234e6f7e3ceef75ab28ab34000d7d93e950f778a25294512989a0f20a7fe67020495a06f0563d9219dc0b82e5dc28dff07d55fd41d080cb58f311a20ad19ca399028a30d99e8dd3cbd9ab5d2baa980bc439e6279f3223425c488af41454d5747571b25e0309fff714b95d0c9563979b8d674dbfa979514f1c82ef379ecd61281d1447db95f2dd3ceba1378fdedef29f63728eb36972da4b1dcbf01e51c367c74f35cd1d3dd295522609df171e8eb72b12197430643547e53cc6c44052504cc2aeb909e9fbdc030766a4c3073a0bfbb202376a4b1f3464380f82a42afacd84cb525bee6a927269bc2bb1af59a5fbc5013ca3546d771aeae85d20b4ce8227b865947c514372304247301563405c1c389c498a23f186f25bd23f20aca43694af7f00cb5a9a5494b27757500a3110e974dbb82910a13c63e9abbe9318210e43569f507a3862fa40d368bfdc3447785c9ad054b688951abfde85a64d569e66f89a3a42ada929fa176b4702c4fcb1682309db9ac6e7f26733d5b2c36dc0e4d3f1db309268044ed4184b7c47d980c97c5258d21bf75cc55b8b646e252d119ccf581e8a910c873433acb4ceb3303aa70584cad008b9f6123771883b86b13a1a27609bc5fd1a2bdd11519f7e1799430b4ddc762771425a439af4e3aea4b9cb5204e3fcbbade990005176672016b1a01095f0037f99e016bf4b8049dbd0e4c9974b4cb0a24c446f251b0e4a965544542b0fdd5dc42eb1b0ff03950ed72022414196a43ca7931f622063704d5453dbb32af58e0d332018529d95bd0c7415e0c3373c2aa70a8180323a609e138abc613e31a911854125959bbeb0eab71cf697c210168f1dc7e4bc3c0cdce929d2b4d8f63f04999b2f53b139697b18b5901d61f332fc30b3209deb0834a72dab602abff4249b7ef5387b735a994328118df1cd1a35927f693bdb8320a77f301f8dac0361bb468d09de315c114a4e759eb592d3624c05bbda5387090cef888df5faf6886d54a69f134196c8fbc5a7e985414d2f957eae80859cfb954bbae58a18cde2c2a507be2802a6c2cc2f60e41a51280a49f916a368a8ae148a02956675513e4899214ba44ae9081831c743d2d98ea64b54077afea769383e2dfd072edc9eaf2e5e7b3644ba5f08896e2812a13da5da33d043b243c91ffe4b4f2a57fe4a310b0f3e903241d60bd2b405b6afdee8fc8c5e1e815774bc5b8b6e1bc4b54ed52e5c1319583a036e82d437b2d43d3c6beb30dad8023ad473fc4b8d6675d20c6e988db4963329855eabd1700777b67888150be7e9b69ba7149fcec0a83dd2c7d77e000abed6686df8ece56c087f093f130ea555e904f086e5c68ff59b080b179cbb4d1559832b871c1596f791f435b60b86ade7149e115cee59bd7c39e09ab2a195a5925e65cb028b3e9afd0058daeddda1cc3bffc0358d3c0d4b849a273614358f71721cdc4657622bb19aa50b813953c9e6726941d293bb7537f6d45b370acd99d3ca0fc50ac2743e858840f897d86e3863b1febc73d396816eb05bc43860e3878d8cf75150ec9ce5b929cf17d280b807e4e1b23ac02537269f225302f3f86d1025429997d56aed8bc2c0fbcaf6c061d53f76e08deb9c4069c55c598b8a6e56fa4554e1e737022918effb9961d1b91ac908546fdcd5927263c7fce19a00aa967f19e2340bd8e2354913b52d6a9e144c65394297c05651cb6bb3b9b57bbc696eb83a92b6ace3db5522a284cdd29d53d42ac4d4828dd741b2251ae19083220b55a2a113e42573042a665199a16a1b3e710635bbe4143606ebeb57a3d2e245a0e9584ba0851c73fc1764ae4145f43f525d43932899f08bde850742013cd5a36b04b9316abcc3dd7a7a3fa95e52a4929072d70b7888f2c3c53952d06ccbe759976f3ce8927ee3bb9c4dfa7145be2d5de5b2a9083169f8bef03dfc0150473c52df287a5681ecd98da0d921616415166dc616f39a478a90b3d6ed96886155290e495142e18324714ef84607aec6624fdb66124291379c04b539f72d6d3674b9011468431fa60f4a1689b44b3962b0a941462aadb8a531e06cd99646a54457ebed5dc33478d6180ded486154cba7bd7d583dd0e726c991282a9fd958daa0470b521ebd02a1eb517adda082580510bd96f887d42ccf41ad9b9f9ba94bca90393ab0973568e52789cb0001031a2f8db9f28e35564399943e81214c492d09734079d3d238dad02ecb5453b7315c1aea5d146ab00762d8a1a62e5297ed1a846ab087fad452d217642ac7732def1bd2ed13f76779503cb4c45ea26864505521e7c7a1d954d28bebf7a6c290d6f270e9f6413126daef2a4a857af71951629399c4c5039c248c9e0258745f4f37ff42d0e94838f7cd7250ab85022a5f74656fb630483ae4bdeb1505131ceb5590e262bb84a0464c276d7253038935aa3e112b4e9971866d19273a17f4ce051a0098f76826c0e4c12ca8828cac09c06e13a2d8ec1fd14c92a23b34371a9ea7a2d3646559d993ab2bbb0461b4bd84aca9dcb3de0528c16ddb84244592447c7efa8831a29e6d7c9737b3e0b3f0df8f76cf521d8d1f180f678b5b9aae896120b4af8e62d773180827438241cc9e91a4d649b4aa7bd2870808a003b472a422645ad9aa09b9635985c1ffb2fde1e9e6c09c347700cf2b91384abf8bd1eab912240b8a7266eeab8ddb1c483aea46c7a0669855b58ec62e032ff05c7c75ae09ec30b426ef56ae859ccb0c5066fae7e2e2fa6e8e5b088eaa1944339bfa68c51f54359e4982c77c0e6a6b77272b597d0cd6fb4f60194c64018a20cf67711939d53d3dd19278a18e62467a2299e38b67a8774898497f267e5a20293dfe13f9746ab84e6c92f79abea7b0676030eb01c36c59a388fe974e6d4c3bd885076d80c45bd18f5f917ea67550801a06c44254ff3f62412451767256d344f8271468b021e865f400e34bde108d167506e084f186fbd347c1255e27bdba583e682acc217e2969a378ee0f6afb999beecba4c2e394ce41faba6ad3d4f83ed6f7a6a9a0fc0b4332b7bda57620398743e6d86d680f6546e82658459a1629dac1f49e866b636cbb18ab5e91027133a9bc97923b12ef70de931086cabc002f159fbb62e9ab4fea211b1d586641d8eaaa0ac706c98770a59c48aaaae32f88bb4ecc64f981194662abc4f51e09c27b2b4c1132ad380dccd31ad8e99f1d133b5c4ce4cfe5147dabb06181cdba6ab57144ead5a246e29d8ca6342971aa749d3787ab7f1cf3884d16649684b9ba22bc0d5359925b94bd22ebe2852303e6a397e92b6d37977df6ef6e6ce0449f9c831c1ca4fa09ea916a651c1ad90956ef07cf074656f6c87f1fb124e5a21a3215325f8be8907af34ee02c028194b046d7399fe269b8f831c8c43625508291f64d1401130070440258ee7b5eb7114dafce39714e38a43e56691281776264161e2de5632bf0048cf3d549f8f2e870f5c7c3973604648a77d601c553777954578598d17158384720b9d012faa2a9898813dd685425996e9345c133bf0232654c3aa374c0e47d5a4ff33b011aa5274b0752f9db9c5e192cc39cb99d5026e73e0331bd54a5dffcdabd26262a7fe64a837029657078edfd8b26a55bf624f4955ad706de1897e01f8bdae5349105470c33679bf4eb928e9b9caf3290befbd5c7d5111922c21d378e2b010bcaf16763a70b5d7c1d8304dd8a72e96a7da9da513b7da43debc5f33f0206e5d04bbcc009bfbfd679bc9d062bd7b77d173ddba1582291329b6a006832292d6f56f40178588b212c6756e1a839bc7435b230e4a4847424ca5aa85749a5ebea67460f1bed73b6f779e4b5ad1f5fcc5df29a4a3b1bea65d6ddb100db89953ef13b77ccec32b53b741a077caf62b103411f772cdf8f5e44550ad54f9a583aa00bf3f7e134bcdab6e10f296879167912fc457d52afeedc34cd20fb22dab2fee2b8765625414d132bf8970e12372bae75954dfdc4d1748ab4bc220ff8da171fe9391019e1be79d05f85d5c7f96f102ecc58ccfe750e2dadce7a0ef3f327cd1eab964b226dc716b670a60b60b37b3370ae76e9a12a16143c41fccdf0a28450d174906ec3918f2a5a95e341697ed48e057aa26c3b72ec7b7e746fc25e7b7482ac432a50d170e87aaf58bb8ac246135825058358e124eae5af6757297649c1613da8064ba0fea4109e0d599f066489409a8428500606f3e3f0fbcd3bf2eeb44028865fce822d4ab0aadc8071e6502abf77cd4d03bac4d36c720cd5944144fe6b136ab2f7857646090319495fd5001419819515af2b2aa46eca2a38bad40aaab1091b347b0d1b8d2927d12a20884c49d45b72d94a690b216b83c2e477c987f55e3e5486a330a15726964e9df32205372bf9a7382b4887db7d7712e5f205075474b300f8704944f3408a9bc944595c09d5642bb2283b5ed409603b8b001aea17e2fd0ba6b8552a9b300274cf0598add92181713014a2c0a8abdc10a39442dcf72d52d90206bf66b63124705d84158dc9b5d285551cbad906de09392408509b0036610a61dbef36089ab9e7dffac2ad51a5072cf9c271038deae7dc7f1b162e6edfbba5595a5d4c1e6dffa6584d903a705fbab1c204532a940f3041b0d25c0d543fc807bbae2763173f0e86165a693978642b0a04d0e2b19328cb4a2388ee826597b899f69b52a62fd95acc4aef413dc25006bd37b60403301005c2a3f1879aca0e167a8021d401b1bb76ec49e16b65c9f8253022f3681ceed03d99cb4992f4db1c9cc9ab9c92aabdc6340e1a69242d69a127b73f9fd387b11b23c1e9937f8067b654b92163c2bae486b5abc6602724a4351dfdd9e9c020b1e8e601dbd04011b2b5c50c963748dd903b22a23267a1b3508672d341bc1215133c704f1714560401996ec09de0549f081030631b5f9f81fa410e4cc2e0333f4a181ae09b63cd7813910354ef619c5f50a97691872ecde0cce15197f4016867ce190353c365cd75d9d500c15be8478744f2e50a0f0e24818ed252c0e573e1220188f8d58d3240ccdba5edc119f9a6766f6287b516226111ea8d0cddfc05276c2e4b132a2ef3d0c9f7baa2d019a13d4a9e81750a8f94343309094bdd50886bcfdc43eb0b23c5790341edee482316f0e733e32a8b4d4b6e3fd351f00c82c7e5b56d6daf4bfc0a478fe978d21a230b8851797be19c630277a0a57ddc89b6662eeb809d4fbe8970435a159637614214ac630db44b3500c64e70f5a5ba08a292123018cec038a09df9e541050aa8a3ab0f2193b81cd70e7991a504182f3e28e6d56427588bbb6a7af3453f6e7c5e61de5dae307ac57d3eac015c3f884638dc0bf8e572e0a0e68e43f3566a196484522d2df27516ba2366e237b6f295392328e09270ac4093344649ec7f3c049e609a408d2611ceb31ae67aeef9b239933f304a6f5ad87f9d19f8565701d93c9b5de5b8f83bf8c50c77af5acd58b3fb258ab67fd2883eb192be68705b27e583f5216f3aa0f63ae4c4e06272384eb99eacaeca184a85432324232b96e619a1c9eb9d1e0468cc3e5a6c1dd723f0dae67a30c8e26d7b33145234433d4334f0697fb53bb9e7906ad1f997c065084f53c625c0be8e648f2b0de7be43ad6a5c738140b3c320bdf1cc99c1aa3d5e3c0fad68f2c5c93c3ae9a59b11e93d1b3b11ef90aafd0798577421887733d73e9f0117e0363699a24021ec2452b961ff52ce53564c89cc643ad37fdaa85a7f07816cb85858530cef41225a462f11feb91d3787c7fcdd050c76a8a3ad658a8654256acf7afc1758cf538d7b1c6421deb9a5cc71c635cc7bac6ca50c7baf563ff90099a25f4875f63d433ca46eeaf2143f2ccdc5f83ab11aac9d178a45e2668fec0381eb81eb564827263d9b1176ccbfdaccbfad56ad5ad57fdd86ab57eac47ad5f3d90ae483d7bf9c63829eb6fe1f1e556a47a74eb1bf588f52f57e6fe503028c9abd50a081c7dd4b346fdec647f5c3c17c8d41d6b86502da0dc7fb23f230979acc1e57e13c6ddb8f193fb3f19dc9802e994eee2ef6347cc33d766aae1a22bec875a81e6921af6312ef74b13763528111b0912d3033faf3611a194923ec5b40f07160462412156e6f45ba3fee20e211d0b003a6609728c1ee41127d33742944c873235c22e53fa6f44a61f3b821a993ed5992aa8200a338adad872061b35ba46a6ffd44790e91128a574468a9579e6f17f98841823d72e72fdb663688bad89d4c35a36098574ed0ad2717efd70fec33ae62358c1c6c95fa4847c2f61fdf3c23af6fee3c3a4e7c5c47ef0c3beb16f58688af5ac1dc7f07f9ef381384e76987b1adf52fdc8b4def5f3ba5cad93ebe43a89273a9224cf0c0fac937c00499b45d20b5954e4df72a9d3a8a8c88a4bf569348d8a5a2d570b06c6e572b95c2e974b7c98d349fcd6dde1cba7f756ebf4aeeba363fd7d3ac9d0ac320243c7dc084810993bad144161c799042497944bca252549326028b2e1ab54a73781a09d6f2025cd2d3631a6c8050686e65b32ad9996ab253e8deb67645c3030e287e2493c9dbe844a89457804b12d726d992e3c93265052d21624299341ec4892329963dad6338ff911147fb430ad161e5ddffad075db96e4fa7126b97e6ee9989b4c30784e5bcf5cd85db86d9e2426b58d84f77fc12338b3c237388d044c0382335825f191ea8229973b9e32ea149e40203b8a1da3e9ef51cc31d50f4cb7a680d46532a15c502e2997ddd19c269369b54afd2af5a6d64f8149a55c68962817981606a2f5ad0f5b2653ebd4725117a552c58eb328871ead5505d372ad60ae6bf5ad95474d260aae502bd491cb6456ed5c26b389a284a08c384d8471b5441857cb093b82598a1fb3ab563d415556547debe76db554acb72d6bed4b9665154d2397ee2a554bb55ab55aad56abd56a85bf62b15e7577f8322b0cc3ab5235eb9bf57d0a59dfbaad3b05881b7485add66abdea67abf533b75a3fbfa5c2483c8fac6f9490f9ad7b83aeb065899281a5c23998f2b4a175c14cbde92d1e3fdbefbfd3873fb3298a704ed6f75fbb5e503fa7ccab44558caaa5c2e37cd6cbb43ea685c7f9abf00b4f2f5161f825940beb4bcdd66c59f19f453a97c9fc824730a382d881ea9834e2b4199967adf068553356c6c658d1829fba32bb7c8f3af550412aa7d8f194e9a9c606f655b7d4149807d2144747870427bbbc6ade1127abe6553deaeee0c2c54cf6177d8a91fd5992367d66b2bf66c649253f0a04a7cffc1965e289e78f8fe8f3235142a80f4fc1937d11479ad96fba3bf8905d4625d9e59b2922fe9498ef7679a739e6da440c84f8e287e26562ab9203ea67951c504f1f85675e98382041e5f01423f1ecf2e215af0b8ceac1d28cd2329f1758cbc48e3dd48c43130cac3f08162515151541c9f52b3d5194d0cc1076e65078e28a7a66df7f5ae95965ad5efa9b5031ef02661717d5a3de7ecc15af943298abc223ea533f8178ead64709f95a90d9fb122ab42f78049f85477bc2eeeebec3cca71f8fe4a942c5d2b0a34c721e6cd87116cd2b2893e9551fa2ee45bd0083c28ec2d308cf2299618c384d46fc14867917bc138341114bd40371faa7faae1bc40e2ca44ce6d60d6287155226b3e99a9eb02ebc3ba574d5ac3882602281e779d33323ac8304b5d65a7300b24149d0823cbe87259492477663f72aadcbe4f774239c5687d27703f4a8cbfbde7f209dd3db6ba529dc1788ee66328425d59589e943d34bd37b9ec9f4f3ba494a37993cc80dd235ec9ffce33354f68f1bf6bf4b606c7e909e495d1e63b11f3cfe1c6ab561c7fef1f00e0630e199fefe81b5acbf84857bdfed789c41fe2d693984859ee69cb3ca89c31420746a55c699bfa70f5e26e09774c0c1039ea784007c996b122535f0e51d9548d410107b7804eff8832d57fae0154249cdbb1f9eb65610e8ef5a6cd8ddbb03e1624bcb64f62e902e9a740f94ec5b6421e48f836cf5244f064b620ce6617e9e170769d94cc28b3c4e2415c48ecc7934771d934db1a3dcd9403fbb7d9f21b6a165fe8e6552d85e61668a2ab0a3f84e43af946de4c2e48530bcc140e2993e929a6795307a0afd1e261461ede91994e9490f4b8a3f30ec180b800f99fc019b31db3dcc4c1f897b53e64cdb317096fa2657a15d5069a16792c88b28993e0c3d53e529367f2098cc0c2182c1c6451c8b2ef31ec433433c0f27a942c49b35f0c19f35b049cc65e2b713abf9f7cc0cfef38bf44b3f4308506cd9c8838aac64f094f2cf614a7d79254f911f0482a789323269685b4d621b7d5964de51abd846f14c9159a33f6bf40720e4951ab6c92bb559640e9157f22c027d39411afce713f1bebf7efb4f9c24c9cc10d32ba995becacc901faa10f9beff874c4392dbaccd67326bf37ff8f0bb0ccfd45752f3f04cc53c10f1f73e8963eafd6865ed7bfa276c31e9e8e480e8fc508508f8fd3ffc00e221276cf9b0cbe81cda9209902511514f96ee442a97eb4ef3b895bebffad49f9ed11f776e2c8909a763206a8aa503bcb14a8f240fae66e146f68eb022d7f7274dfb7238c933bfbedf8ea8d851f98ca2e4fab2bf9c43f990421739b2c8d53b22e764ce11155d5163172499533f1ce2eb4b42fe724e4345296ac2888a2e5714153b94d051ae2ff321e58abac38ea69c6a7e7d1fd5b332678e1bc8ddf5c39d1d20348b142405dd1bb91691f1422a8693ca8158ea955ce79cd37d4ef7e93ee7bb60091d13c71f74ff3e69c23204d26118beec99e941d01496c0d043939740f7cf135d505530fbedecd9b3c7a5f411c41d1fe9d80d726783b794f25d5a69a59556babbe7d5dd77742c153b232377776fef2f051dee1348c81b572fad337cdf3908a676bb5dea25ca6f2e4bc38e7d46ee1ffb8c172c9eb12fb34ac86761fbd4e089d276f909d4330a66bff4fb54ef503a937f23128994512c7406a2d2446edaeda1a267720ba227b95d3714f482de628b2df238cfa0bef323dd19f4288f7e25b7bf91258f246202a56793889d9eede8ecc474621e94056d02b5aca7fc014496d03b3a5c58cfc35356a64c57efa369abefd50dd2325a9372d89cd378588435109672339aa60f3dd952b66ce9b5d63a6d778ee62e16d6c32392975c319ee997b5204df14c3f9d601bf6f328e6c658a9149363a46cbe2873e68fd22867e5eea3c16a08dbddefdd46e08bb541d6282673d3885230f1c99288c92d6b9125d192a11c235a4245f69e66b1548653a61807fa21bde00be5ef87b27f589f3a123994bd129196d1ec78881c5ac0e618fa8a83a439a8c8720b25b2c82de7f7d4911b8fef496147304f1d4829037b3e2e7ac09ef537c5dd90b0a2aae124d7ef339af6f5dc5a87f326411fd0cfe79303b140e288aa460f6e0b904f4f2ed723698fd34e574e6ff89cb0fc9cb60035097a82ebc99d763d92ca06ed4e90179d5cff144b41d299eaf986e8c099b0cb2d6b29896261bf63ed1982f5a0d487f3f452c7e929ea057925538c43eb650e67e41c4cac610b676eb13eac474bd811e37ae0248fe9fb0a19eb0f6b702e2fab7f1b99335dfb7e4d5f83eb1a44bea2bddab2bfa8de31ae57ab775bf6159632078fac4f8d9e5df0588350bd60dc1802a48ca47571f09f790a8f9fb93344647ee6674828c28e34b8d4873c6e7da365fdb2964ae17a8403fb5088c8232ecadd1fb66e76e6c13c837960a397273d2f779cf9e589b53571fbf362e47ddaa2e3e2e815f3aaf0759bbcbe0f5faf57ccadc9d508bd6a70af9baa01297dd3a43cb68084666e34389a5c8d8e8686a6e6454fde9c3d8e40c50f0c17ad54eae6208d9e9acc2b0952835399c08e2d201e352f130b9e592f03247956df53f84c26a863fdf6f4313ac9e38f7a1148f2b83c0d2e84f971e6568f685a3f53780eea7ed78f3238d68fcc6911fc71e6668393393257637f583f2f4632a7df84644a0a5937bc996ef8a463d656f323f8b2b6b739ed31aec1e00b4b97ed7860e97865847df911e35e4689831adde82efbc3c304318e4ae141b480c61a441e5b40200d0d0d6ec2d258e9c0d5a1a770f2850f2e25e510d7b27e2cd433cf3be8b0811c3480048731033760e00216b0a1021498c01109440002353c80060718694011061059800266182243026280e10504b8d0020b2b080972801ace405430400152f8c143801dda0c051f270cc0049d120490736b1ec7e7072808972bea61e4341ebebf870ee3248f5b9b2ca1df7e7873616f735f1fbb37dfe3da3c006eec65b7c7e35c007c00aeecff06e06b2ecefb75c93cdc263561cde5513bd5c23ed55c542df493cbb540b609979afda9b9a95a4d0ed7e06a70f3a4c36dc28167a283cd66b3d53af03bdc1e7e037787d7c0ddc0e77075781cae061ec9cde1337071f8f122790cdc0cfc0d777c0b5c0cfc05ee0d5f816b81b7e15ee027702bf014b836bc04ee04fec8a5c043e04ae023708ffc032e04be861b8177c07dc0d3706bf8065c07bc914bc333e036e08b5c23bf80cb8027728bfc0c7701cfe3c25e0197c8cb7067f82157011fc395e1137087fc0b378687e126e05db82f3c022e0ccfc275e15bb808782197855fe1b6f007b8429e87fbfa207785c7f7005fbb411ec8c59f6fed0d7081bc0a377f0ad7005f80abc2f3dc14fec72dc0ef5c9e27c0fdf1b3bbf3b44b80f771678fc2a5fd00ae8f3fe1a2f03a77006fc23de1057075be846bc2df2b80cfb925fcdffb3537e7fd9eb2b3c61adc4ccfccad083be21690d37838edbfe6fb6b8c7ab89603d716350a365783fbf11d74f80d7c3f36725a0eaf81efc73ba721f97e7ce4341cbe1f23396dfc7e9ce4b40c7cffcbe6b41bbeff75731a06beffd5e3b40b7cffcbc76916781bbeff05e4b40a7cff2bc86914f8fe17ce6913f8fe57ce6947beff55e434097cffcbc86911f8fe97ce6910f8fed7ce69357cffebc8690ff8fe17d22b096683dd603d301fd80f0c081604c3c172b02298114c07dbc18e6048b0241b9bcdcda6c7c6c7e6c76941bedf06c826c806e7348c9b309977d4aaac7e04600d7fbf4dcea6c86940bedfc6c8692a7cbf8dce6906f87e9b9d8d0d924dd28dede676d373e373f37373137483bbc9dd14dd18dde86e7637474ebbb84915d68f00acddefbf41721acef7df24392d000f80efef71739aecfb7bf4382df6fd3d7c9cd6e3fb7bfc38ede6fb7b0039cde6fb7b04390df6fd3d704e7b7d3b8f77f77faf796761c65b4044649e074e22898e5803579359dd293cfc0e17e3700e176123acc33b7c849170d2cbf6babd7a5e3eaf9f17d02be8857be55e452fa397eeb57bc00be99504b3c16eb01e98cf0f50102e5764a4db1d2125d9d86c6e363d363e363f364036412eb3c9d914d918d9e86c7636473648364937b69bdb4dcf8dcfcdcf0dd04dd00dee267753746374a3bbd9dd20dd24f5b0f5b8f5e8e9e1d3e3a707508fa09b7a294f78f91b37240afdafdbe401cf04085bedf5f8dec01a0fd806e7b201b44087ef9c6f017cbf67735a09aff36dc2f77b3e4e1bc0f709df3ebe51f89e7dbf97731aed7bc76904f87e4fe7349eeff7764efbf1fdde91d352f87e0fc969057803a800247fffe7e3b4daf77f3f4e3bc00711f2fd1fce692b7cff97731a0bdfc2f77f464e73e1fb3f9dd310f0fddfce692f7cff77e43418beff43725a0cdfff25392d01df0fda9c26c3f78337a70df97eb0c769337c3fe8e334057c3ff8e3b4057c3f08e43422df0f06398d015fe4fbc19cd31af046be1f34729a03be1fd4398d86ef07774eb3b101b2f9b1f1b1e9b1b9d9d860493024d8116c07d3c18c6045b01c0c070b8201c17e603eb01ed80d667b25bd905e472e7bed5eba97d1eb957be15e412fa0d7cfcbe7d5f37ad9701246c247788775d808e31cc6ddecd802ca0fb82290346187dbd2e1b636705b39dc96066e0bc96de1705be36d65e0b66eb82d0cdcd605aecb02d765c37555e0ba28705d13b8ae23d72581eb8ac07541e0ba6ab8ae075c170dd7e580eb32725d0db8ae221786011786c88559c08551c08599e1c20cb930325c185c022e4c2e860b5304c385317ae1c2e8107061762e5c98a3162e0c120b172669852bda845cf116e48a3d07b8a24fed8a3fab2b02c99cfe7cc5202057c4a970c59c01ae5854802b1aa57045dd8f2bf25c910057dcb96292cbfa6937c61683c28df171634eb8313f3140313a3706e7b2fe126e8c006e4cce8d31ba313b97f507e0c61cdd18d98d49ba323697f5f7b8323797f5df5c199b2b03bb323f2eeb7f5d196c7a294f68bde8028942ffbd529ad0023a61a455e49832240acdc2313a99c3e3fead35b7ea6edd75ac052456116190691579c477a433c8aa3bf638a3c7516e951776a4a119a2290a873ad634452b23ace7b07e931fb689265e5ee6143040a7f18071b960440be3f240f104823d722e43b5e1792fd68a1e18da55e82ad68ccafeb0547885ce2aafe7a8227937af898a2549d562595cfeb14df4cca99c5a3532df8f73b8a86772c45672632322a61acd4b140d332f83033e7ce0e0c0603434f336c65a309a37db164658c9534a4fefcf292c2d05e18644183d6f53d8f16d90e90b2292b224dac24ab659126d21948bf0c992680b2c59126d7146fb89667eea954c3c3383fdd413b19fc249aacc4f62f14f4c44f5f62d4e625f49cdf43344bdea65ede482676660bdea8bb05e857fa84264f5aaff41ba0c8559b888ea59cfc23fac700bd965cd34e7db9bbad2651565c292e7bb9be83bcde3e8c04ab73542b014d5740ad0652ed650d91191ecbcc08eb1147c4c597338a2783286917519b2b1226443c58652f460c305f80b5bb3247ad28494275162744629a59452ea5577982b534a296577b7a4b4dddb93dddd527edd2df06499235f14417076b7007ede47b30799d4bdbbbbbbbb3d170e42091be56ca7d5fb40cf633a3b2f1d2c99ea07933cfe25a9923959b64d96b236820142fec2efe4a70fd5a8e94fe9e9e420787a5972f9524144029820cb53feff97c00fbd0fc84a07e3cccc37bb47bd909e4e32882040d4e7e212eb18cded799e975431b3de649b170c67777793b5928aa7eef6244f34fb4dfde89486ab504a38bb4f9f5f99232bf53cf99dc025ec042518dbf19e4710ace7493d4f27cbea799252e9d5126832812593bca6124843144a7edf576b0974afeeee626bb5b5e2ef8e145c8287ce3db4ea47fdd1ddddabbbbb7bf53ac5ce9fb34aa953cf13456bebf7e1f07d9573860bf74aa630cb90237257034519d15d09fc09e5799e872a6529d151ca5272a9214e98c5c8af0444ab9a5e166b85b45168552ca75e29044d6058f2e8f56e2e4d139dee64057af54bfda04f3da3a1d52b993ed4c988c80d438ed46044374d3147b2bf3cf9d0d10182da49f20b03aa85a20f7575a53e9aef252d9452fa25940b9f5d8488a24c759d5a6cea64b5ecdc4a1f42e661d62ada48aee69cb3faf271a68e4926cb5596a66c6a493b32254fd820688d4aefdefbb7ae634d861108aa4e52f298da6e9147a03283253cf0396ae38a27d4984f9e3821429565100d1194e983b5d6da5b7a8cf8ea0fc0c8f43d94105a2b6ace2a5d95c028532f2a51095ae045403a21d72ac30aeab8c387091d53f820084fd22839b102ab52da81a04eeb9c8492d8f92d8c24c09de9f6839e6f480a4a37220c6122e95607123f4e9e10e1648912444972d202238648c93989c1114350f0e3440b2743a2d82c153aadf3da626b9643624cd123060ec684185e6011c30c29d280e95e778801078e8e1092a809be3474e0060eb2dcf1240853f4a9aa504443505a20e4060cee109243cb7f95318c88aae88114eb0323f8dc80288b114421cac2045608c9a1e5bf8a1c2cf9d50f2504fc2f8d22c8400b387456378310ea5355a1daa25027156a8671c50570601186152db07d7a55adb6db9e50aada78447df8e3e9671aefd0cf42e330a2fef47d5990d9aabeeff827d0714488c561fb789ef7a1974135ec875e83a00be1cf785f2a83a63d91e62f635927cbf722489a634aa164ef47b7237b384af6e8fb3b4e4271929983254962d49200e1a1d146adf5498048d5a0461f087904256a55522ed7f5249779dfbad4d62878ef7765038bfad48f8ea47aea447a2e96f5ff8247d109161ead14aa44f61c29c4b615ae498d82a7cb2a3c8a8ee4593cd22390aa2365efb6dac2d27791d292cc2ce01843574b02441d42a356653e107309306a55523fda496fb239bc89631df328f59ede5c65c36f1f5fe1113ce11185291134a867a8f79e52416f92e766efe913c9e3650fabf0489dc89ecd52b2479590c1e5675e48b93caa5b9f6ae18ed2b2f6bcef547ba84b4f9736d131efc34b813af6f446a1d028f4a7633d1df3bcfef17ea4b7ecbd6c8ef66105a53a2606221973dc2c9231870a167cd829060a0b7ecdd5fa737a2cc76292e773fd187234a0430f389267e65a7520890a9051a00941d5b53775434c1383f720a6e958b5a02d9d1ebcd5444b59d51d3d6c3d06d33b0d4df8a80f43d47d094f42e883b77260e693775d3e9428101ca710940b787ba8342f1d93d92f38ffdb4185d29fee942516fc25cd60cf3e9a8f965139c399722693b1fa55e6d4afb1faf2a2e3a5c8d8d9942e652493c328bb125387514432b264a9afeab1a5e96dca9ec77a7ae958fdfe1d5584bea38af877cfdf38320f9dbf8f9039b57b644e6d3287a5376aabffe153c76416b1d5427b7a84e4d0f2a9961676046573c814151d9b299c0aead8fc58169b0acaf341ef1f41182e2ceaf238c5a34d9e2309798ead542e8a2782ae8c2a3150c44041868e8eb47f52c7eeb5d6ea5ea94bea791894142994b0d1fee4faa1aac73a1d3af73e9934877e902269319725913c5254621281cab34aae4ee45a826185851dd2b1fa25dc42c7646ed851ea62a0c5baec3849cf6c3f7b7efaf46c06142397c7162397e4b233ac53d3d323b405862d8114bff7c4779374ac8a64d816c9b0261e11c89cfa6305812ca1becc14bfe8ec184ba25f033d828dc861471f926a9d223dec437db73f253a84e4d0f2607ca53fe36f5ff52e3f43f19019ffd4db9f713c43d752a8961656cae6f05dd56529f2d5ad3897d557dd1ae4b2faf6562097c921695567cbf5a30349f278f4f461d539ed2bc293565dcdc99c5ab190b2fad58807b9562e52b8feb8ac3e90fe6e55f7932ba8cbf52b929f51cfe657e4322397d587e1c27e5fdc5cffb32279fa5b23573cda0f8d5c3f3ca2f2f815e5ec42f2963c185562a0d01dad6cd93f051d1f319c878934baee335ac7470ce761796c5debd0b48e0e0c17d68390de93ddfbfd1b0dc973b37f9f2179a898c51b0eef355a974ae53b44e6cc20652e776df46e86aee9b80c95bf9bd569a446d2b25ac24237f651eb649e4f987aec7c50b45956243adc20871d5ba76b5deb6ceb5ad767f44e3765d7fd14b7ae634e85ff4cae6ca01da1848120088260cfe44feaf5f3c09268c22f545ad0099531d087f94c8452babbd7daefb57b3b1a423e84e7799ea7a588de1246933ae81445841107d0105c9881820ac6962188287d600d80c8a7ade3cd4a6ba52f1958304ba21b0c603cb05e96443717c061bf2c896e2cc8e353a2db0aa6a7ca92e846829b4f1474d2f993651285f38bf0add305388984386a9b6bad4a64719ab504b1d65a7beaf06232550108221915618b19d8208d18d4aa1bb9562fd75a6b9d3e994ae1e140718aa52a6e392837319ec810c70f1a4f647863e7061145444db4f404b94c8244428c000919e048729904c53839b1c20bdd90910c5a36fbf5a955af7215ca85c83061ddefcce1fb7bd73f04dd145aeb260f94481907ef41a7ee4edda9c924692c2624ca3114b971b3203713d6b3fc21247a9261c2d28cfab09e6498b035a33ef44e324c84df498609fb65d487a1cb69a25800df8b61a7ee943a75a75f6da852d149252ca158e8ec3dfea33b969e8d8d735dcfa6efbc9fdee8937e0ac5af1c39cd6bfd957aae8b1ad742439d44ee2fb91492474a9e99db243b4acc953c324f9d1d3765c73bbb930c13d6e30148073830b0ddddd62969a530a7f1ea1fadf5ddf3d92b37ecfc0ad2d9b441eeeef246e8c99a69bf644ff43c0fcb6ffa7d4f3ff7c6630f214e4a7ec7e47fd9cb282132d7da127647a7ee28215def877aa19ee48f3e9b3e2baf52d9a565292bf1a6698d0f7ccf443fb0149edc253553a9afefe292aa2e58ba7cc5b463154b53101935c59e92b484b59abcde0f2cd907ef14fb2569a1d3a52b0aa857bfe45528a6e755283c3c658ef73353af72d224f4ab3e41907a5e3f10fcaa16cf699296929493524a7fd2ccf95e29f52afd9cd052c127a0e731ea51b07a948a20cf77d07b2d1e0f424e5f7ae9a367608afef44ce1e96332967249cd58ea252a8654924cafcca6ce61a34e21954dddc584a5cc313d903695aed799e9a55f1019fcee14157e69d904414967aaa996b09df22084bef7a753cf40ff0abecbda88cb5aea5ababb38aee148bfc0faccfe9d68cfaa8cd59727ea511004c10ffcbe989fbcce2335bca06c0d473c235e58a272cee972964c279a8a8f18d165094f29f8c0c92714cde5c797540abb8020ca8a5267922f7559c708ab04311407b257ef03b3d6f044737b9f77ea59c9eb491511f6877d5f480939810eeb4f1db330c394100a88efcd4a6ba54edc6e544024250544524e302bbd4831820689df1441ef2183285b721b4a546173590f29f6cb9228ca0e368405b3248aa21312c508a466845bb27c222b57b2c43df409401405594a389e737f39e2f818e590952e5c9ef1c6e75162f19147b96500799c4d76f2389fe47146c93e9b8062257b4e7628743841a4c41a4426b8e209d109ce8842e4c3064e47b444121522267c60022214000165296794da21da42269ee7799e0c862831a96354b18532a9b5d65aa5082e44c81045088d2562b044891e502314711a238a2088781151591249596284298a445084a690097a44597376a03c49828c5c9fea80c695319a788114299cd02d488461a2f46451a83509152011845c65510953c2a8e244880d336e40ed30c24aadb5aedcb0a39877e68bae7bc994e6882e5e327dd0fa20532224aab03df3f9adb1234e11ecc1f2a4067db625688fb744093c06bbda8222fa4554c0143dd43a4dce2a45ae25a8d5599fb44c4201a3d826442a4f452c7f5208b54ce651277fdfce115718a18018e0c2298280d2834a1c4fdc208e2b8a88230c39e250e3358775653914871caf2c87902a092a9329b5889a25518f15266177f7e84feb8c52efdcc38f9692764b29a9154c76230882a28b7943b3bb274dc7da8f6232c77f6744299d3323d1dd0b6eb48105500cda38028d3a32f084104f92d470630b2a948e1e2d4a3c932a4129a5ad64499535808860870f1873d0a49e27503c53c7a940800e2d54488105098ee098a307caaabf5a3f8f7ef47e18e68958986812ee4a4308db0ab400c21341502d5a28a51407d6b1ee194dc7b0e823c5851d455f428e18dca863063e10f2620c2168961d58931274ca308486b8e20a0feeb04208588a5c66d474825a6bad2f69953d28620da42fccb8c30630a8555a845c71d607181482ed9732a7293d499ef6ee9c501329b88306528470c70d882077604410484d90a2b41b7003346a7084a338683024470e4655dcf182a0268480a3a633834cdf47cfaabf6c25888c78929bccdafcbf634b6907f685c83f56c76b75f7dc73cfddfd65ad4eab1695ba162f65356624fbcf962d81104ad838914e2da59c724ae974528f7ad4a3e30bfd7977f0d3e9e91f499a44129192dcab5246415cb31ca146e0d971ca32825a6bad42e862c0440d9048411d0e14c58e1a45716596d1050e600086b1848a2565142146e3b4e0083838e208296458a9391d4276a222bcc8fe2f22511156645596444500b120047b36a7cecec73ee9a5aa37a6785ea1ee52fa4b7f3a6bc5524a3aa7e74959abeca156299bca13789e9c58ca4aa553e95406d0875c9d89714eb163b4564aa947a947afe77993eeaa0dab372c7d494393e74fcffbdc4bd78222f51258bdcf3f2c3dafd6ea795e8c0acfab3e3e6ffa7b4e713a26dfdb65b532744e2f8bb065775bff4f142d088218885652bb7114d7ba3aeac15309f18376cf1e689e629b2952abf876aac99f712195fd53794a082a065d267d4ebb2594b091cec679d1fcd1d89166095d489e899d0832c7931307ff494e25702ef31e04ad1545dce7452cbcc22e18851f05e34ae1d1b6bca8287bef1fcd125b9ff60d0cad492c3d28c59efee5bd772ce48c2e2163de7bdf38a7bde0971fdfbe0b920f0c08baac6d61241cf64e98be511fb9f7a0155f3753a4f52fff827f78f9d6cb5ad8ba3f2c69bdeb93b8f04c919777bd0bffe04ad27a17b62e9bdfa821add6555293282143aacc2021493b8126d004f2212929292929292c7dee6345f16359478af51c2989dae88df6b8cf8b2dcb6fc923c5fa28a979ef40ee415ecd7bcf499e497f584ec47298f23ccff340100475443bf842ccf33fb08c25488479bed78309650c539e5fcdd0428a35e819538a0c4e79bea301e492e7b774d0ef7c70be158bcac822db3c7f82208824963fece1259207b962c7a3d8ab58a6814ac0e9d24548f33492524aa937756c3b26fd89066aa00602aa413aa0ec5e869c51273276739a09fbcefb1efc120e4e1e3d080582276b4351bc65fa031b933cfde3f3fc367f7cd877b38412481e0ffb0f640e7d4c6f344bac3f9d492ea30f82d68ae23ffd3146938a8a66d12c9a3ed367fadc00962c287eefd51db06441f1fb58dd01bd4441d1f3201d2976f45dd0ee082989da26ce694a6af43de7345aa3ef45f4ddc8759267d29e931ce10f7f199b3f1cbb204bc02fc89cfe1100361b174cd4a44c21fb90304c3d540b28272cf8611b739a0b52d62f86b71ab16ec1071d3a165bc3d224421e7a00f3d7b5fa61afd03b43745ce67de827f97da3567891914158fa3e3390f6ee0973d82a674f09c2297f7800ccdfcb2c755e66f9e2fcd1b88597913c132340e678af237e4ebd4cdd297a8f02c193b5a1289ab00762af847d78494236696cb6b2d0193f18b63e155133c81a5804ced2055d26c59b3ddd9588e9b351e82f76240f902c796ae87c3923e94e0a24e41e9a2685f013a4679228cacffc519241bd674d9e3fdfc79c734abc23a310522379e4efa8113397fd435969f3d8d966a5120b78025fa6b52e34d2bc1c9039fe93ca5993c35139b11c29420c278e3cca2b311f3acd01c9331f25c44e7c44878e84ed87c99448054de446b90093a5bb58d611b665a56fb4825d572ab11cb122d288b0c6ff31e8ccfa13ebccb8207fbec43e665ca02f5f621c2c6518d23157922586a1632e649efa12e9a4f6210909d9a9681a8f1f97443f4550c69fec524e89255bb96166a763fe540870e4515ec96fb8df3a17030c3d934f24450597eaf0a50d07416b45f13f168b8df396c40050d0c0a796a4ca8c0bae240361da522b7d78a3fd92a77be68fb6d5515407ee46b4044a260137d434c986240ae28d2c77f3569341ef8690caa8b5fae0e7cda81072ff0d56de905872bfc4d0990170e486b4b03ac3fa0ef38ebc32c3d2af617f07a3a3a874cc37663deb149a110000008080009315000028100c0704429150248c4451491f14800e72a04e725897cb834992e3300821630c31801842c000190011a2a155e6abc1f0eff98a5a68a59551fd2a84a489e20c874c8d065d4848e9139e58a41cebe32a11dba4bf8ca7e59d069f016e2760b5156c3cb78c30907ad851b7e34b2f12bb8309f5099500f8f69f9d8a40cdd9a8b4e4786dc7a1e79c22c0f1762ea3b93c581235afc569846b9f4bb8d2dd624be75c6762b0cb40ccb203208814b1cb9609519dc0b471e8af3e56e82d4833a20cf7f075f3ccce0e5910252811bc3d580a25a51b9b2b1043332ede8a162d40e9496c8acd644ec816d2eb81f02c07bb762d30146f47d557c1c4f3b1925791b9343118a80bd4e2a2014855459707c043312d447c1625519a49beda77b794d305323f05f1efe572789d90d82f475b97fdfd662199181f1e36bc8a490b144503c22696dd69cc42ae0c68eaa354e69d184480e6fdf616e61b29e27e3b3391351f5a8ac78e4cc6c9acee6f06e3f855bb83f75e4a91f6a63a66d195b8b4abacfa57295081960f54f48d3e2c1607d3cbaf4c87626d1e0cdffa7db23ee7c1bd624dcd616fdc1441edfd96e7a2051f9fcad9893ed03f6043c08cc33078e414d044d8840fba3f67ec6a3d1b58185657b79cdab909708c66f255c9304c7181403414e28967bb049a809e8a078767f5f83ace74356124c3d921235d7dca6ce27524d3f93a107000258c5714bf429b747d7a39fbe9479101986cb0c8b19c435edc7d24d010f6a84067509f6896dae524e64f3e325305f5e99fb30f98b6549c45b266bb43b8146b6f04a50f54e47235939cb3e733aa32f72d374ee3e5317216a01f23256ded02572a5502091f53deaa8df15e860cd84b8bc6140ac9873281e7fed779c971527c028b59eb278bfd7b29a3655f861a920e4bff53fb6d63698b0f1c6154ff012220228bb28809a9602df5b59143024072bb620dd386e90592b1831484f0702650224f4636ffb70f887a637f391a8b951ed3341f8d15208af24c4dbb4b3ca50425bcf8d8a61a5e7852f45d67c6fb8aece4f69472c8759b936592602e857a110f487156d505750b22c84dd1c767edf9b4ecfa6e427c4b163d36c11a8a0641263bad01ba89ed3f97f7d3d459e124c8b92131d20fe07b38282f326aedd9328bc6002bf713557796d67b26c2d6f051ff33dd174ac9240ccf7ff06fd2cb20e1d99af1b2deeb9aa44b1abf5c7f5bfe976c98a015b5e349cdecac46e8d592027542a72903e5c9e5db88304d25966531fad720ec0cd2e3637de8164559cda3d890f43849e0b7229bb8156328d3e1b8c8826398311a26a9a8355cc49b41f17e4869a24756b2210498c10f496eddeaf871fb45a2a866f47e975f3cd55ffbbda9c627cc83646b0cb08700fddef03566c04870cd6f05a19951560913caa45bcf069f13b073b82d08eb822680bd4078563296b615925ef68126e19a92ab047e568566f72f880b2ded6c3c7920f6435db8b7ccba55ba0985d1f8636914b27b3ac29891925d3c66a65b1c9528bd2b20f8c0da37932c3dc35d5e2610da74eca3a81bf340448c8381e484343a49d1b30a827a153419400dbe1c61083c6b1fce9f87319c6328c961d49f18f01ab69a184ff8805cdb99797d3ebc2e11d91120b59391c3c7c8b27b9749505a62b5264c34df438510708a9ee884624e5365c9931a72ab12a351ab0fba5131ea68a055a08e97183945ab5b241b245db42441d72721a628f22e0dea43b312583de79832a168512ec3e10c429b83fce781dbdddc8d1944affdd10d6618340401d8b5404f3407e40e569fa2d4ae00a054996b47feefacb1039855630db1be71a01ba986241d9926b10cb331202d36ea7782101548c083b0d80abe0c76910302942d574968f38f74dc1fdb32ca1e543a30fb691162a5d89c7592fd13d3222a30eae25b3c210829f027d3277b1ab470527740807c75c76190150d6ab032a8af7dc4263b71511b66c64dd62105c6174f015943012d9a4afc9525f06b2a330e1d22a9f07e013da98098a283c2c88235c4dad0e3025a72c4b9b56bb7f1eec012c46b0029cab5573460f1340915b64d97106417eb770a58d0ef314938dbdb97629d1f8673e13fded6e99905f4322388c7ec27b8dbc19a60fc650362159cd03d5cf35429ea07f5d22f7c65c43359c8a329b8dcd661561e77c6025edfa083c20c3009c9e4a9b10f323ddf18f63eb53ba6246ec7053021eba0e91e564518803d75d82f6d5be514e114627a0353dd91e0b113f208ad61b301e01c6603ca11ca0dd6d69d028c735028259b19c0a5de131216a2d74491e903448f2f89ddeda3e9f28b60250630b23417095f29692f800b9721a27f5dc7702ab2528a4856b2fdf5b57068498e33a0d1c3755496f9bf063dc59a570d6ac5953ea41f2a356e581c72239801e41cb63f2f0aa6c861049d889617805023c1cc07cdb67a4e859b7890cfe44b5e6456f9f612799bf8dbc997a8162093ec5bc9dab82251aecc8cb5f0f5e9f61e87807169230830bad3e6834516e98baa95b7f7c44d604398780ad8437c169f508f9af11a0b51d10eaf3848db7d0f4cebf68188f2db795ee06e8f7472fea26e6de4e12d1c3bea469ef99b9dde43bc669c15a171688715a614f9dd6822b3e936ce1ee2942115380d07b05296d53e0072330b93e23e226dd7ba2a466cb239a4e74e5c20bfd52551b2a39f0eb9a5a3338c9161d93beb51181d9521444f5df2c9ea524256001de278e13f33ce5cab01bd6ba5fbfc04fe2dd14bbe77e7c8db5b2a97a6eb32978bfe721760b68aee145c2ba308a38131d8aa3c5c259773ad17cc98a8c289075c403a5223a3029c2d77ecc1a4ba2f07cca287b05b4697b6dd50ab4b53f2ba5178bab69f6383d6b215c8e4066ed4a961c82c95c64e2b3ca79dd2a105c54232ab8a78f12484eb61256c2261a285dca04696387ff69a63a9864a91153708ea7ed81eefc276b6482aab6a6085a2e1989923aa02058e6d137dd880090d4fb8f88453b5b4e33386731c3d1f845c881543a2b4c8fa7ab1c4853a08a6d9b09c38d043a92e7e1b31bd119a6e5f657e7ec23fb956b9082520ad5f66b16c612a1a9c0831e5aa68600d436197144b079484268ac140b53232f2e290affd539abf32816353a6e3023202bc2cc4eed037fa368184605c00fe28446f219afaeacd6a23242a137b29b39e5ae49996961c959d9d814530952588a80dc4a9c0755b5077cebab93de01ee06ddf171ad4fd4ba570f2219f568955bf60552e2113c76c6688d3ebf4fec433505ca5b82ae1931ab8b747e5ca14280d8cd4f9c22268a27a4b94c2df6b6a7951d6b10a2ecfcd274a6414d172f52e2c090eaadcaa7a997a9f3cdb2438786aabf6a59c8f2aeb64b9dfa33936fc0edb53d4b37878f957460c16bee57953b1921b8f179cbfd5fd8aa985c623bfd0e076ec55b2a8794180a13133d1c97e3ae7f364fd60c6fe53a5daf1c278e3d501b11b47929e7a272def07847baec18c995dd2c305ce2b066cd1e0b2410ad73c98b8678f3ddab0252304b47d450bdf7dc0843995b73be8467890f6698b5277c2d638e58899257fb65e1494fd70da28bdc183bbb9ac92f115935c0af0b36f21dd4358ef369df13448ceb8b411838e811c43615ad573d5e0325c6b28bd66eeb9c3e76a8c2d13e45308a6188c96834ff93acf5301eb022e342be4bd924c7339d31b86af447ec0a0d85e0a7ddf74f3a3320b0c5bae38680b2c9a6b35e391fda802c8886014769877642ef57d1d12df146893ab75c08d1a29a2d8f1d305d8e7a761be7c888d55bf8d2c73f7632093e51cf147f2c569883db2c6fd1e354fd739b1c3899d81f3cee8ae43c7090bb1595b87fae8d15d47744a5e873fdf2074ccb1f344310fccc3f7439943ba557fca5f1867abdb8045d727735247e63e133c0431a0d1086ed16145e73b5b34c44ed3f40f55bfacc6a49dd4197f269d644c182bfe309daeadaae42040b2ebecaf4f38ceb0def94ddd53c818a6810fee722457ea1b95663dc19ed578c08b8197aab1fa86705315475532b487406b64b87bd3df5e1148d26b37a0ca9ddcfcdf83ebdb972fcdfc77a9d99e6adfa42915e6b786575602211f930ca5a08f1048e33550518adf89e54ef20d2b928111803f482ac81243450f9116bfc4545351ad5153a696c480a01d498bdd0d005d8723424a732eb11fca180987fb6369539376c9ca52b6fa528a03b8dbf95776df3f0ebe0044ab4557d2f1dfa6ec0cc10b174f9ffa7c50fb742ded72746c128d411be1400732176ed18bf92f95b36b1d9fc2dc541952ac34346b039630735697fc5461a54e91e186949504cc6a9c7c15726a9f9be366cfc0ff959e2c910a621f87bb91b66df692af4c0623d277438431a113c2af5d2f00afb743250d5c55389f0d37656d2e60ada64f8226256bd6d7078d63b1681b78e3021d3b5c906d955ca95fccddf81fff58b84018d1750660d155f864cc9bfb5e2acb537a43a246fa3a5cc8e833e1a48de9d5a67d5141a66aae7496330bd55c51e52ccebd164c52497873cbb54a58320adaf3aa5e4229b1a03f8593001a143145f7d3b8b87f507b7b1a94581432c1278364eb82149d49de36dedeb456780984fe714452f0b14cb7865e4a8ea533b36769dc1f12744a158357a3905393e51f124898f6a2ada1aaeff4d45dea65d1a12b063a670b65e8ca0c12454888b544613c79b7308ee0ebced483b78b3c406827bde96dffa82bd43713ae63e34b415363181db63d428f8a9c407fddedb6973a0663284609cf5c259ae4449ffc6a56dfc7dc82a1613364d5a18fb5c045b1ee93dfa33292a80680328b718f1e99befa68868d7758a9c012bd81b9e3da434e29027d2234469710de972754d9dd3b60ff3306237419b29703d54c533e2acfc26fd69d8f5d6a1d9cd02db69c9dd74a232da59f99657223ff3b41197c1fb52997f733c735b0c63f6abb2e20cceeac7ee7d5e7f2510fa54e816ddce780d2700b66a8d9bfddcf66b4b698b7587c67fdc90127196c08ed2c0604311f65375c8e95b254d23a7bc28b8a1554801ecab5bb9871cb99f18a8647183a7b1dcebf7878d2a185a9ead8572f9b778f14f95b462abe30be7f45b017c30f6d5e714b9855c425723a0eb90702cfefc7f48fb888f0235b3822f239247e7ca7a18713ae62502f32d2fab7d6cffbcde858306630d34945dcc9c9d3d974cf89a678e6c35b952e324969a61095fd784dfbcf4dc8d4c4f0c06657be3f800f7d9558d958d3ed1d10e7fe588734f267525186eed8286e875c050e5e78cda2c0c4b22bf86b379bef23b6afb9d8dfdd1e9f70c983e1f994a3665cc0305ac63ba7bbd6e1c59a2540d9ac140f94f06f738b83e1bbc8b8082d8c1020b83845f8512a075164201059404f4c37f15a351ef7384971e1247f5fa9840ba62af9bc5f80fa870f23cdc72718de5b96b9194a4ccf32c21f7311f31388703b1cd50d72015c3af71620a3c2995da2775a1bf11f0c924096a4c3ef02ac8805728f5ed3a4713f3a247011d9738d05756b7d35ebdf01529b06013b0afa999fb21793ff676dbc63fb2e72746fb884ef3efa1152bb895b81e2055a4c4f92289fa466880277638685ab2713006cd7dccf7168c1912f05500ec2199dc4c195cd27b8ae448afcae172853b6de507fbf841fcd02ee3d98c32e95e773e2b2717ca879fdf6fa4b15ff0adcfb59f5938fd3231cf864d22b9dcae93f8f1c28b8f9ed4595d7d60b78f277d0080c0e3d877e644436ee6d351b5f47e7c201c2bcbea34c823c2fcf302302da85b7ea566b993aa77789995c8f405eaf7bddab02df7bb65cef50d91fd204071d1e53b92fb62b4943d06645f3e9dad9a85e21fce302b771087acf6bc72cee91534becaaca62e373f8cca0009ecbce751a6aa21b1f916ee54ce7cafbc04130199fa1c3656e9fd90ce38adb3c7618a63ed94b09f7182216964ea03f347e843e786ee3ef3a37525d42fa2491e39b70bd28ec16913e4a6d924ea03d67d42138660cbb065c26d496d59fc4635bbd98dccdf7a950625b630dc1d22349c0781699e1543020190cb7fe80c1b490feef033a32d89f87a75fae13ee56e41e4f3d887edff88278e78d41bc243db984d7c7b4489db5df6a1e77585eb8561cf2bd4a27268b1b6f415bc875fcb9362336018ad37049e47d216c1d8dc1230a2e236216a304bbf32deacfab4a9a52fe624e505d4ed2684f79cab9130b4da58ecc09fe3b3c68cb93ecbcc4c49cc04514b8786305044322ade15cb49c51a1bfaa3b272136f8e775623bab61f5ee376e92d61d861235054f1c852e7be20b35a7406cdd32f6ce7403b1e22ae2513ef948d75f65cb2160253dcaa11ca8b9dbaaa25c24c823faf6f7d57c2c383bb8bddf865e63646ed8983c8689203c1187a5fab090d4a0a0091953ffbfe447b02fec700729f17ca68470b119764b2b90ba5658829870c85fdb29242c1af09919aa295fb96b36cd2ba5b886900fb27225a30ba56657fd9dcdfabca83d2f5e9e1777e77328ef17a9dc185354089542cd5449d030d63efc53d37f6e401f01a1ad04755c6467175d88bc005210e6f221102a6261198edccea463b10e0baa2da10f5043c831add1b7394d882efd814588b11941a44f745c014fa3d21a4d0718779f084c66d7aa9010c0d71369b89782dd288607ada7bc73d9670f3b13806b44659fafb738274cc0522c6d2479fb9d63179f4a733f6dacb826f332614cb23824ac231f2c7001b9c88e13724a1f67f6ffb7694efa7960181368651079ad8c47c262e237cf1ea71f2088551eabe62b1b4bb042e07e444d295aa6fc828a09cd1b1f6d35110b42b897cd47acdc8db3f915e87a912d50383703fc5de6558b123d40cc19da7ad4e0a30715c7b42aefb1661059443a9996540849d9860d84565b6fdd1e9b30b49663ab99554b321460fc4bb5b580fbfadc15944476f5feaecf4be3c7ea9af56bbfeeb1fbf02486fa94aa18ed70a24095c1a94b24ff2244a9d1a1e08d620765d2a6bd2b05c42da052b274cc83d6072470d0cdc8021d916a2b24422ddb45baa3b3c8f91c130dd0d5b7e65f80402611ac4c31bf6f9fd0799da34e0dd0ca2610154c63d8dfdc7b48c1b0284b3f630ca12e2ca3a5afc3eb8d8ac5a5f7e109e231e330358b18a588c10c7d8df9167c1ea774b661821a4ccb77e0509213e6fb4f58463c56d9347958cb0594237e2a3218072e1aed3487f125bb0901174de0742ed5872d21b9791f1359aa72ec1201b000682de4ef073c067c31d7283064ad009bd65cbc84ec5e574893d8d94feb2ebc2218fbe458526d184223859d3ddfb955e6347560a101cc2f1358164f307cdeec1c107d3804932e46d892005da82e343a7412b0f8c26d42d4287b792ba8aad9f82b6f1e09fae8b78f9192c2698d5c277ed8fff1ec1ce5d24b7de4f865ecacaba4f822d0ca6c6ede6e8e714fc129862f50f787e9233145444bae64a685d82bb6df18a5d5e4765ddd0910874876dd2d0834be44d7189e3f95e3afd7020b37530daee140a3b1c9d57116f74bc765305fff14a809697deeefd7bc6159922b530ce6121a73c53f0d46a1088c4678cc771c1b53b76a9642446307412f820c4f05e06ae281ea15eccfaafbc6aea917b4fa3e4fd2aec0b3708f444111f8ff14bda82a48996f4b7c6aac196f2d972cc8a48060cf225bfa9c33052421f992f3182f2d7b59c19add1a14dd5c744640e41a2cc7cf16fd226cdc8af995961147c78b483b9477a847831d9753d1f4d7f532a82bd480bc7f64d19ee85ab7de84f99086ba2ebcd7f490dbb535bdc09504711392d5984f18b8ce4da003d3e1e1e3d0fba8fc4546ff8d4d6829fc8dacd954f158f155a5bcc217857c75866f0c70414804c4cf3c6d22bddd857fbcb1e9b5719e8a60d76b8b444cdd3f8930693360dd8d1a09a0cfdcbf5146acdeca6b723ff8416a0f8b43dfd625afc26b9b04640c25461bcd4cd9f2c74aa1be591b6a68c30ff06de3a2b9a12cb7c51c64043e53e133c75168186e4fdbbc97e191c02a1305e3f90feaed80fb00279617704ab3ba1e847a94a96d35d502bb9daea7a29263bac62b650f73fd2f99121180cbce2174fcbbf7c494910ad47138a4b113403bd2f0a3f2deea9f40d10f5f1e5d5551d3b6bd48cb50ac145623543a212283d86068a9c91f2ba6fc0201b192f6b2aa17d50290e5171974f691f906981a0171bccf4dd091cc8331c0dd189abf539bf88d1a70488353a9db138f1d2cbf457c7e07c3c02e4c5c0c4e898c259249c4bc199ec1cbbff1eb0b59244ea6b1e1e88cf829eb287c144f4c493042c30129046de9eff5a9e48efac6281088bfe6e2c8452f211fd5a43b708bd665433663d0ff173200f701e0ed2a62f70b9e47e299f7888262181d441ce92eaca89a99201e5c336715726b60dd87fe146246984bd4320e0279e8c5630defbaa46710e8bc6b11c8163184dc5fa8c8892b37500d7f66c58a6a0f1ac0fb19ff62d7302abee5dfd185086ed6e516f22940fb2bbe9f77da83c415981b452d4d3d900e0e68a9294b596025349bfd35452bea60c1b987c810a7da6841fe2efcd53241a9aa8e3b6bd087a405bc87ce63e5bd83efc11cf4217c85939d3fa82275fcf9463d04133aca875d92960cfa471c1c2b31ef3a6d934464848d11949c313cb8797a65b61a61671f05fbb851af58837faffe32e74dc9b7b59389b02e629408254b0d966e19c0b723f54d840f23279c266f80d090edf5a3361041c4aac323b4ae54abd958d351d91f360ae1d3724a32a089951741df34d44bee7d5cfb1813185da31b241b5f9c883b68965e770c3b1b1284290e4b162312f153984fbc0a43f21c7f84cd0b2517d4c005489e2f96cffaf8ef8c59d059914c78e2b3241621310cfca1a229f6ddc12b19748d60b941b4029ffb74c708479b93308f8adc894038054140253ed81e7ac2bc8b5ba6fd365bf66cac5dd04c183f62c5c188b5a2e9c160ee916dda0ac8c5e82243ac9824ef702365c9a817db9f2847ffa4e2b540155e44fe518bf5ee018620f0b9fb9e47c9d7960b825612f61392f42c825c2d65df85695b48b3a05b544abc6efded59bdd19ea1cc10d21b9a3bdf32cd4c43cf913f42b04cf4f15de539e75d07cf51454af945df8928816166ef0fca3bc7d014f88e23163ffae98b97d91858cae09c3c46b68028e5af618b3360c422b72ffa6444ced5e898b2e4c95b26b2ea0fa2b242213175e85f154376a440b97fcbbac9471d2c4d7b38f38cf466791a8e9bb6dea5565da0ba0bbab3833b847642c6959d1904af796224148b34f895e07e73f0f90551731c792e98a9ca0fc4a5b6a709740287fa51ce6d9adc7eebb299df0b44a534a9b00ecae12694d968cd403bd90d74144f249f366a6fa87e2439a4d024eac938395a3686300bf0fea8a7d88ca5697e9c6e127afdcad3f51710ac4219a25e98ddc6e2a4022ad938f864ee503f8f5e8212687a940674c2f9a0285c1278cd10c89a2642073a2d0e4ab43450f10aacb8beb7c7d603b6963bd25df3954aa371614920e286023f22a4e50620b1019131ab23bb064d22dd50fc315a7ad0211ed0cd9aef41afe6e41eb0bd95e00a727fcc743496069b8e4b4abd0e334dc3743806b47b4a5c577818daa5ea076bf8e40b528f4a11075b559af966d9e9c015f7b08331effa40a36e0fbc70435276a6c8797eba24808d25c678cdd9c72af49d1d38bd0e65ab841487c4afba009004da7662e8b36d244dc1a8a8c2508307684220e886426edbdec30b2785a243cd707d895699fd08409914064b98c968455f125d7eb26adb7d6e32eb1984616b2ad5532850da83ce91525794e8802471019e6260dd3d90a8992bd15d7ad49dc762f6ce297fd075584042e6efdc7ca3fbbb8ead94b6811b910c5cb2bbd0e94c4a3a61f8853787c6c5e2bdd6f45499be3ab021f7b7103ea94a1d8e2d44facb77554a833a4ce03db0cd5f700e06fdfe67b666260a57adf5f76fdd07dd4147f46b5867b7226e9373030c0dfba693cd718cc93954ba9446f399b9d69560a0fd40ae1f331a82404b0b6bc89a3b0f9efc0ee2730f05702a13aee558770f6b84c5e37f01b4d5eca14bf3b11ac24916c6e5eab31e020d7b8ff70e9604fcf17be8694328cb3d43972caf69c4844883eff5ce6aea1ed968c2e7c5556444deca240e55eaa627365bd12afe1fab8258d68f16f62d8dc6691378e1ab0f942bafddcf9866d90cb453b9a955fcfbd8a588c9a9c50b88113a3879d3a9318df0f97318182e2d213f28fe37fc5ebaa663c7f69397341da8a366797f77efb41438fe683a60603ebafb6543eadaf2790d0b4341863962d412a6e109f0d0ac3e9b92631775c866044d57df1d6f6c6dba75a65c25954a78ceb198bfefda24bd9ead925a930a145042b3f622fdc2b2f5944f5b5249153892ca6dcba910116d40f2c8d1e6fbc2b2b1276602c69515c8b450264e5a0fabee7d0be8a5670d7aca32cb9fa24ee8778b0d6d611d9a2b4aa4c40988a447aad7d9cf5a9861f7f0838685be8cfc150010a50b8103c0d083dff51a801b2f62cea61f8896eff7c724157db2a641ac046ea1b8dcc3d8f540eb756f09cc2c6785f9f487c62f79b4a52962da3e715cca88cd6935f063f7835d26e114354d11d7816079b107d029b807109817666be29b2d5c860e29db3d11fa7c073c954022e6df0be03feef8c587c376578d343bf1dfc522c54fcf3ba47d566e26b6de54b11e70025670e22409dd691df50a39a4677e5f3185c1eed125ad7eda40b8e6ae468dfa2f7a8b8f074dc3fb54474c183e767bf50be61fc95c747a5a3a8500340585d35502a6efa1ca78632210030812b9217a4e60a752dacf55c868581a857e3956517acfae2c8cbf5681c6e03cc1372b223274a6978d100091ac4345bdc144f762826f1ee889f5fffc0f096ccefe5461116909c723df0c6f0548c06383f091bcd3470bdda1de80dc8d81a383577d4ab037d6099feda0185cc47c2eaa76bd381e9b44f93a18ea5d8b2399557aaa094386e975ab33a9d3fd60a485c01c4debcc3e8305917ad80343638450c017813c1ed3b38b8f68712eb121c5d11e605352514775ffb31276813e2e02af0b087a890f4f18215585e99e5156cf15a9bf2667a457d27716783866f16ed40c4ad59c9c7aa2db9a68da2b37be6b01185f45d90c0b6476e8f39eeaf044e8125d47d808113f448e90ddeebc2a023e2e43b999050edbc9e246dcffb1c00f303677368caec870927fa69e9c68185b5e26fcac453313de16d295272846a570f6cc4e7a4539133aa2a8231b3649a236d32968cfe6865cb768000578d42fd2a02a0497be00c3c5e15f06ae1ed74709a15920cf77ca1a9d0602fb51046306e1083b612856786bef4be768fc3778c6871a28cb72f69ac62bf2988fab9ec06cde6776be9d2953af11bb9b099842699392deaad3a218a13689ec612f831eda42191bdbb482967e414b0633b742f7fc0bf00b8a23b696943b98b0c57b0dbe9c366e738193e1da154be4ef753013b30489ab77684519d15e6c9582b79c946a89559877e4919d5006804aed30a0c49537b815b66d4b969dffcc5e84561e4260316420cda56131c0754580beaa7085bf138ea2943cfd8c8bdcbdff2eb8298001e7f4a1bb2d54a9a5974e670583e9fd65cbd81a3043488a26e13a218644ca23c34f52d63bebf9de671cd0d01694867025181cc47dd3006f337ffd620e4970efa35e074485755f0efe29d3480e766559fb2a45f8179c1b302e7cfa39547fc33918f354db42618d6570b354fc73d373f8571b86fb9fc567631ce1a2bc4be7cf089f18a9f3334d5c88f3b78e05554ecad1cb5d9a51ed6f1ebdaf92d655f8688cab7e848c3f8e7dd61d5b814a1393294885e7003d503725830c8b784aca0c9096a3ad208306aea650d372e90fe1c1fbc10a2c59d31030388ba8774df3a32e58ef429a85252a0903394df34268ddf5a108b6f14bae58b330bf66acd2b9b5615f8639e810c5104aff38cbca51625f50b4bf1e28ce320a3e70f3141d7526844610eab3d335a50312045ea3a7524712bd509cd4e2d577a0dda0d2ae21e1e2e347881cd9967b9d5168c15e53f08fc4d021bfa146519d4e4c30ce75def323357803088bdc7011e57f7182bb6f3186e95ae47a2f66b9397fdf466006b57573c9038402d0276d7ffaadcca1b987f24386737be7bd9b2502183572ca313ddcab9665b37af72320dc9e4d60902d5db983205d2c7743a4bf09adfa025682fca45ca33f94332611e79a0ccbabeb7e81a9f0ca9195d718237455014e0723b8db51fb2b8998f9775d10d8b3032d5a2c042da4bfdd115a3647b7f31388935bf89fa9f3d897d843e9ce42faf38ac146cb5a17f21dec019f49471cbbd8e1817a7a81d1853d645bff0b7a01ab100c93b93a7585338fd7f49cf3ec013226e055456c24d83ea4bb010d82e0612f47039b9b8df7779c65ce80c07f6c1f4f045b5c9f515b05e2853cafb12be7e67eb41e790a6e5078d6a525bbaf32869a503e13fe86fc56d80ab6ddab17f9faee28cea47012bc6bd81d51ee5db1c99512c2c265358ae88f66374d02df3d65fafd0093ed20b4102662d1964cd6b1b666c50ad0c08f5aa804d3c5b36515e07ad4372878fae43ef8ab0e64d4f7e3af2c2406a418c6ab8a8cc7aace6ccdf94289a9064bd323010a13452c340025e4704e288c29e25c6b139484a390569e042703f596a4b2625995ff84fd5c85a299d76c36c08bb180ad8c83cac3fa8db33a274098d682819dc70a521d775e29a7233b947789ab73902c185908167441b7f15b7cd1c4dd418ecc56945403435cf0edef39e2acb1236d7f4e12a3b28f54af9aa0b3e0d6dbe9437d5e0b12cce82cfe96da5b171f82c405306cbbfbe6e1bdb40cbea49fff3c60fce95af8da6a8dbab7156b76185458c5d21f1f7042d45ff0fd62f3bf1ab9c04d6e4744ebdf3a1f847594860f9cbdb8fc6956dcc70af278fb92cd75973a4e8cf78eded11479684c56cf85d8dba2c7840dd00e0e0fc39a2e7257cb5e49ad3055ce85a7995c2b9c41de75e02f4bc97b5f465972081a0c41133e408f074b3b6830fae1c85217aa3f9733bbf45ef98813dd001523c6e7848c006722b4d53d0052ced627193dc7caf09d154aa56eb5eaae8958ddf567c68530b237b7c4d1d2eeed7f9d72f862e8749b0cd699a3a6403237e3ec95450d7e96a3a26b16e7d7e1a10f271ce7e6e9c79de513537d3607e933f1a34a028fde722cc03685005888a7bb8218b4508ada38325b88d4767d6f01ba3636afb20231651a70c63787042a4aa23bcacfe5ad018edf3bd540006161c36b219ef7fd980313f8db3193e9acb818f0e13f4dbc2b5eaee57fcf6d45c908d9c47415709439c0db2ea6d68f69684169162d11f1a9def2861374455e68d703abc89f018d29282e0898c38fa01e6a82aecbebc54327956daf251f03d7cb12d1c4b18ae220b727bd9e0d4080e603916ec1a81704b8ea7aa9384d42cf6c427589a4a2f0890877dbaa97e11d7755b8dc24fcc0d5fde5c3b0367c7caa9fc4781966757292b4bc16367f4225c6f1228c2e7701e99929135701c0c643c7f6d70ffc885d8ff6a36575c7de7ef4ff0a1bd46f19650951810902dc0b08bb2f2993c3fa52f98af2ab743280f774d592043917dc7c2178b930101748e704efc588d77fd289a19041a4988e6dc02d45cf32b2ba006995d0f92f5e599459990b1bc99bba6531b120e301d9a73a9ac6808e022129e253373036e295d2c4bdc9f4d80be1877ac26f04762b490fd5bda9ad78361872958fff96ccbdf10c7ac9b8147e5a736e426bd0e73e8248b93b2c265ea3007709ba5ef456cccd5b32f77dd94faec1a107d247d4f990086c31345bfdb932a6c4c02dfa3cf5c69ac58045e41a6f62c25a87849dd65810dc3613fd8a42b6e8945082a6998fd27b60fdf3c64098d6e26bcdec2b8200ebca8bc85cbf986cc46e25fd43f3c3be4042192e7456cb3707d561c4162a1805875e1057bf3609ccf6766ecd340408d62071f48cbaeed1cdc0608699256a91e586abf7d0296a76333f34505841270f5603d5c71be8d4b183d8dafa3c13909d6232a26c409784efe0b204841bc11d4446aaddfdd67a853f6842e1bb31044ac728cd630f33d00afbac8e5ac2f27bca47a076517ae549859466b399af19df11b46b89d46730154e06057bf5aa317906d99a76144154736cc16d19750673cc3a7ef9a35753c608cdb1a688ce5073422a2c32aba9c6100162f8abe6dff47b88e2e32cde8859a7b57c9ea5ee2ca1d85cd3dd65056efe6c4fd0c6ea602e23b37e8fc3f56872e8e7eba2125664a6985bb2f3c89e886efb3629d2a66fc9d5fb4ad9eb72fa7c41a8a9f6e4ec01f20fdfab0cc3411dbd7341e40e7ce0959dda3887432b46a80667a1484056263f553a87027b1c324b70990ad4d0a1f784f1ab6c9a3f3e73080223c316e918517912da55aff57604024187f352512e41c84f722a13e790afbd1c166bf7f93be7b610729a3556c25a9ae2831f653bf1fe99752e47ccf0d5b6c1c980d02764724b64cf86b61b4e420888189411e5f3634c5928025c1ae899417c1b11a689e835da358f5acc27e68bcdb653595fa32bce2c20db63dbc590169854ee567e5f30249ca0824eef6ec0c8b8849d1013cbcc141712ef73e3dd505cefbdb78685d09b612a7699ecf1197f408798ec6a6eb44f998c1f7584c3c67c3fb63ce50c1bfa96bbe304ea2aae0534c98d245c0ee21a090f15407b81f673de71f9acdf812930ae399fe6387ce8d09d8786568e5a1ce32508bfa27f686e40a1e9d80231cafc4eacb8003a3d906854eb643ba33b08f21d8e34309fbba8d9389f3c857e6cfffacc806384aca38dd7a9bb68a52e30dd1fb8716f7a11064f201800ecb0596843a4e82e62a03b0372280e7df70bd1e23f0f1047df71ece098dacfe76272aaa00e5ad904149cc2c7dfb3331c1aac28579171b8b0de1c6fa43366adb58058db1205621964c21a04aa4feed02de10e270b93400b8439319a62821845da38800883ca2204d999351d94ca9ea9c1a3fcf1144a629ec97b83a2417d9485fe68858f97480943f0cb0f76c67a9f8d4488e80ccde96561a4bc86afb11eebab5e6db6bae4495ceaefa72cab475243ee490d98f53347c9d8b81a886dab42080939bb174445b11a41ec89cf99762ba82888c0e20ea11fc2387c06e487379591c05da9f620bedf0df3e285b4502e507850384126767bff1525cdb0a297e13712eea346a892a8f350f6b4098b77d923f272cb6e15006c5bda3ef251338db1759670c9f559f8c83afba9012dd4f79325c53f525c8d08148435b061188a133c8b9d7ab84c2972cb4bb4fed6e9926fc708d735e813a1830ca08cd458f3709441b5306ae219749c3eaade1812e49eb4b10f75e9d670992011410ecdb939d8dc66ce30e75962506d45bb52f0e94663c75ca0a24c66dfa4810212ab2ad52ec2e93db23cf4177f50e9a17c446cb9138ab9d0d949e2d163580f579d3330048aa578727d930be74d6276f51292232396160fb4b7a99e3c61c6c47e1ae457aad947693838f99e7b7be1fe95dddf648c31e172b0bdff65b33bd3fa8c9d689bd434224d824c93068134b59558907751b7eeb8ca9fc2a05cbf5c230d45deecb0e681a2c9ca20fc6e302e972d64436f1f4bb941678ab514cfc0dc7c6192a48f1905150e7edc5a17d1109aa5c9b9e8ad214db1668ec64dc1f545d95f076193da0dcaaf399936a1763794e9d7dbefa5caa5150a9789a17c0c93c5a57d39865b8e7bb4f68a1270fc6532d443f186c0bd6774befc5f0be42b5ad65eb89b9ebf1378388a7c187977a42d211ccf92d368804f0aa681daee80f730ebb7b3e0d1a06ac9c9bb1a6c30fe89b1f3525952f72cddb07df3e8763618ee30d083f1a63e2dc92fdc17784fc3400799c6231284525a0f89befe4fac27c226bf022623606e2a514bdc090d48a5fb592256ff9002e1af7ac8ff06bb988f61be75c61b18a0fc486e7f83192d94fe86f43e9d9ffb6064ae4068f003088ed7a41a5255e0c975f15dbef999c4492ecca480ac13f692c091820b987703801838c3da1382f023b325be400d4f471bff1669d9364494ddb3c8ff2a87a48f62e9ebcdc1c0f8a6ad74d35415d532be3faf6df3d33833a91b53ebd3d259c9e1b809328320cd83a06ba704452e25bdb11554fc6e81aca1286afc79931dc0b8b9e471285f6b1ddd0b5b84c15d1c22533c945d80ebf8a015bfdd2967c16bc5e9bbc248f7401b914bccc0065b20d004111bf8ad3aa96b48905f3e48be86d7502cf73579f28bea6ab7351adca6e30efd4393bf76b7df341f0f6f39e91fde814be70f31a977edbe3fe030183b6d625eccea7f848ebc46775477f6b7b9e109da3ed1138c9af8e8cadd4df82fab4a92514b73f7bf3f30acf26f74b14f2260f034f18b6a92c51b029e072f7e6d3c63099dce0393fde358fc46ea9d848836b75fe038f49722838bdd86b702c7d80094c0fda12feb21f46af5225e0a1c8cc4b30df57a72207bb1d847b24fe3377a01ba3abaefaf147466c08e455f3fc0ad6c55cca4b150b1017ff595014cda1107e57d87f0b73062dd4043b40dfd81dc7494f318aa07f1bcf36c2a8e208186daebb77e154846b57512b1eea51455f0a86b133dc9a764cd57fead9a0e22f74c3cd78c29c971df59315ffd88359a150bc99e117debe46fe1d344d0dcf5dd7fbe8965cffdcce734f8f223f43b1728e701db11e5b916ae746d9adcb397b74fd590d521ef40437489d18fa0e94330c28655b90f2b8dad74beeb2bd32b642f18bad3580da293cea282e67749ca04d6ccf0be227434223d40624fa273e25100d81b278c83d9dd765dcc7a191014e83738fc535b7c1f261a4b4001f08ad2d15ebd946e81d29938ef00e5080b3cc8f016c5bfee2d4bea6aea3e431f7ef8c9f21737a2214027a2c9808ac7c9d3b330ae9450ee82e404977eb946a11184459d40f5601bd00100b3a19bd1ef8360cd8ecc27a51dbb3aff0eb32685ac6bb94a5d007cd7d57442916eeee06f1acd88813f90b214974b866986d65a786198d0d16681630bad1d32c1f6b5dd86fdfb4c87be6ef77713cb54eb311242bdc614f822601c391074020aa1e4991cd921ad4981b3bf5a9c700cc1a4708439c8304eb72dc56a7eb5042778cdcdaf56bbb470b3257078c76b02a0f1dd4ebc884da9d7ded80b63640fe1ac6ddec88ee5dfbeca8d7ec797db632ac6b7eaaff1e2530f60f0833dfe295931de9a00415c9a371ef4141e946a0fd9fca59a77ce706f45c6c3b6c88e18b52dda22c184c2746674c425ed210b29954fdf489577f130d58839da6c8d18079c5a963328a5c4fc7aa7bcdb4d7527882725623b28d16dd871b1405cc4be549cad6e22ec96afb78ca075b33a461e327544134a957da0b05db6537d969d7576ad834d48aaffdb5de440245589c2d46a2325d6a4da0e23e64ae15440c008d93f010d77ba3427d5b5a2b72e126b8452daf3b0704289d9df3e1ffe9fcd08b9c1ecc89905adb50ec1b2bc404bb20094e3aa395af3dd2325aea6c6e56f375595e5036cc339b69620f80129de0624b44a584d0632f78817ff2a1f84e89d49bf3c131841a43a03ca941a88e5cf62a5c3b6886afcb7d934315ce90e8834a8583b6b8cbae8a70c8848bc9dfccc1a3d3b8421040d0fc4c497196be8cf4a20b261daef5b677d0fd050ca7e249ffd27e121daa82f23afce9c4dac5535f1699d5d997dccdd013a09e93dd3ab65733a13d28afff80b30cdbb7140bdce1619733430e16c80eb66b8ab10f45c568bec6ef3fbebba7237ab98dc783519e181acf004cff39d2ac75d7aef9e184cf321cad94f8be318c2663fe5d66e51d6a5807619ddb08a32023346d26a13481bc7ebaae4e7315d1650915451704f8359cedf5539a2c66464dd3a07d49500eada8e1f7d4693dcb21d3226e1720c27d9dff92d01d6a0cdbbe039bdaa2db99e704b99a03a37adf4c5c7a18cbee4a147653381d41a92343d6e761d244b9fe16791369751f2c938f8d0137a7ccb5043c4b59e26c5794059a4340116ff2692608d2c726b0b50401b09a1047f458928e858fe46716e547b9c1b83c87b8a867612dfc581b97ef28c135570c3e63289dfe864b74a885b7c682af8306ce1134f23a1872845e4bce0243a834174b1e8ae3a82f7702f87022397a3443462ab55a2b60cdb92cd1b85ca4b01f4263ebebcf076c3250a694af2152f0998fd9646ef12b19108b702d0faa59028ba4ca43ba92f79276fd1732a8bedc0c24f1a19d0ba518301cdfd423f982cb2e306c6412309572d1bba9da525ea547ed9f52e64198e002ead6f17848bd7d97328adc4da97c9c2c0dd07eb71e7a021a37683fb40091c97416ca7cb497f14e525ef53f00eb1806b0f952365431160a2f7cf7a8920937a010e5c8d8f4c16ac326672775e24580722f8e56c7eb9c937c3168df98faa738a4e6af601e9d81e7bfae15939213da300fe7436fb38b0675945fb3f6c33909fb8ca51cf18ccd7ee4a30631f9163521efdb020174b90983b21f7a52ecdb36f222471343561002b82f90699061cf3f0d3919f60afc3f112d7fd5b789f5b2c311769736a7a621efa14f7d59a9ce642c687d1b0602edcff101b6bf8f408d8d616058c5618d9620819c81cb1eaefaf495b69a3f144175cbf5c385e974768e87028b8b738cbac5da01c172fea39c69affcb1025ceffe5b6d889c55df8140b885ce4949ec848792396ce7129bca6c0bda98a33ed8f8ceb916b775e1cbca73cbea80202ce691183ba0e106ecbced313a188f24d025c300b31e57ea3b3a3205d186a38c4fd633509a30ac23dce27fd362c30df06c4d9b7b93f20eb89e405fd08d3480bfb265ebb45702093a3756f2f50ae379ac548f5a21c71701bbeb8d97d11b1553f445ab036f9e8fa5aad72f6f5bb5e0e12ec20d1e2a32ff9ec16ef571dd2f525b1da7034b149018c01204b63d39151423caa7d5c9266dfe4294d1f513df8b85e7be245acaada028d30a31dd8363faa26db61d7700b1dca122c92f4cf1633779643fba8f4e514ee841ed81d64c81e43dfb751d4baa7cd4b1fd4b67aea035d14002ff8121a33e124e1fec8df5172e8837ac78da84be79597ca8a5cb4da99fff9d41c361d3a5aadf5d33a068af62a00e17b902f233aa2f064c3141ec3ed9df7e6b4678244126742181136054ff850d0e2ab1f99df212e4f0f0be9dd799bbb303067851f845541f25e60ac92f621d511de65d33b4b81130af3c8f34db6bce8baf075b74f64fe55c7456bbd8e5e6341e44c23edb526ab3f32fe7582a7de39b0059f4208c552fb15dd4d0dfea912e8a85ba084a82eb5073ecb72f17ee3135cd0582079f7111a0a31b5befcc579ef6670a7d14fd225848e947f9e70691b83194e05b13e0363332ce76ee81a04613b97c7d7931e6ba53f5695985c48b9e8530ad89d5342095d98297cc2ad7137d1f295e0ab28b58045a5f63481ed99b58d24477091ef6058acdaedb45e93de2e3f10e25cf446e642e2f014e90b978c727aadb92b94e01f4a98f654946105a00f788382eded0709d256773e39eacc10ec0516b530d51aa97abeb3d35d8bffe2d0b0013851864eb5ad5d5f1fdb88efa0b7f3f8f9cd849971d98a0bca1c619fab58360e533cf9054fe08b2b796f50fef0dbb88c2f80a4a6958f6f016fc0904c6e8c63719101a04fad34c3d0342b60458eb28ffba1bc96d9ae4f70d695a2b0857fde75bd05b8ecbc36312b433935b790de0ec92e3ad827b3645b9956597177e42a17b858cf5fcfd1564119c113a05bfd052658eb927502f2eb0f2baadb735ca6588c30da2816fd3846a0b4551f8d64572eead5de62ae59fa332c7a8e688dcd7afb810df5ac0284817fd8d61d35c1a4fdbd111f9fd90f9bb6aa9c001c1dba1deccad5d057419bad2e1a5a726423e0e006ce6cb3dba2feb55822da5798204a0b2928769c7cc666ff676ebe63a4d22664017c1ac8cacdfe72bbe827ca8057b915e7a41d936e3e9564d2e0aef7334d633cb11e1d1b3f54b83da66ee48ff00dc418658e9d90627c0b1febbc29cea741d96396016e557966c20395a3d069b60d118c82f3c2df88ae59187a861787c61c7b3606e460dd6b2d99c099c74fc76c538dccb6683e6fc0f05c7a6043e864457e40c5200faa044c7b06863fc5ca78de8754f86104703ded3ee97ff45765c9c8a2bb49f234292b92c96015d3151b76893365931a579af40c9ece297485303165f2900e9b8ca25b46ce6c82a1d832fcd5f576030df026df3d58b65fbbc2a87fe23ccf0565220990679962cb53f1e37f77756731ebe2d4c3c1a5fbb06195a8009341442a92533302e3c3c03a83cbffcc58970489239938060cd6c1d7fb2c883113446877ef0ebc42efb72c48a1176ccd9fb45edf17c4587509f8bbee511f602a71303f2cc4ddb043c4386b8d9b5229478c835eddeb6ce2e9c3ac7b7d9b5e5b58ee11c37f488c2b278901a5c438d923f28e2ec2d0545113061303a33907e32bc80b536fea2411a6b80089c463916a230a64532172c020f262cf76672573d36ce6ff9af6de6b3c86ab6f7f86736c306afb2880dbb7d81ed5cb0ab7e5354e6daff8625b8044cedc9796b312ace1ee62e3639c704dd8fd9ae1c10e1413db8ac4fcee2f834bc470e1c905504831edd9df3186536c52e88bad064c65fbf5aba6330e00068ce86ac63d3b1e549156f87644157c026695b978a680b33b8f6826731ca7591794c5f81f44902517644d1a5cf756a78229c39e577ed4193397df1e2f695464a74fac5dd15739665b72c5b41fae62cd6fca17226e18cf7429b5254458728a3db66f77c7634b9c16177c6fc8e467e5ef7a874aa2c8ed88769f5cee83d3189f716d2fd46ef50ee359ae5c194f17b2e681fd6e824399b0a33d813249de2833fccea82bbe99d54edbe4a5fcabf7880e48990b312476296f0313e9f4ac609de3d32ff81cbbeb3a06fec3b42c5012144d421949f74452156650b537ab485053441c0e6d4fa72872e2485aa6c7957f03e0dd0ee52a2e10cde1cd4e99e43bfb8bc71837350e58d05085164a47259bbedb7752a3c8dd16a1a7b80faa47769808928f04e658f1171f7bc70f3709bae7680846d532e90515685befc04e292345c3960c808ef0d546bcfd7ea2b5d7540fa320292cdc40476d273f4cfe0d45170c10080751e7c840f4cf252020b2bcdac36d34fb7b64bfa0f984b88d8d96b3037e5cdda569ec45083c0e056b1a3c0e0eeb6daebc578dcedb334cb28247cad946343b26d16ab35358c599eb6ae7ca14f61ae5a793e44219008191b0cc92372d14514512da20b0b64320a64999c2ba89a2bcb4c4cd089497d844195f6c86c0eeedd5a4c88048f342d06d8aed21c514d1a6ccd3359639a953132ceb09905e2785eb57b23f1e0dd01720f09acac60429f6082e4f9994dd517807b3312e476f21fc32b43c7a7db8c2d4f02f62a3dc9e00041af8fd3d89a01fc109136b9f3f689535f0273ee7954885c07517cad2a3128482735db5e8d9eb7a304f6c4a8ab724c57e21a4bdf3eb4fb2652044460d3f369b35311ac36d1107dc6e914d1f4376db708f98512ec182dcd44a47179c9e229ccdacf33c84304882d8d9db2b81e82acd00aa3b61d57dc7e74a65bcb412787b2bc1e35c574186842124e4ae31d5f64db01eacc4f50025d60795b10ea8c4f56025a20795b13ea880f56025f3d5f00364dc1f96e7ceb09cf7c3e5a41f96e7fe85b815623cb83ab87f02e716aa6b538b47aa65eb484878811feb5f10398c6cd94d85364fc4edc33997bf04cade8070d97348e32150923c6692f00c997cde086069b7ad468312e1d9fdd38dcabb0894d1a4e051d00cb7cde73cbd2b0758919ee9a9496ebadb7afab21104cf48c8758240726ee18191306915d8c4eb63e4a0c21049be486325831a677a3e09d3487720febdd32bc8fad1f9ce1ae2d18fad1199aa79962e65681776deb199a8b13266466acdc6554cec2f0b2f3110cdec8b9d79da58b729e37a63dbc54c439865d1314c5f762d22cdeabc51d7e0da84c66f445147a359c1ec1e4b9742b94324480e242671685a18db51f44010d78c013921443c022d05b086f8590eff13e9e805edef67e051a69af11e575dea4f24f60c70a4ab31f3fa004ba4fa721006b93cf890de29803cf10b850cdc36be961514f5fee8ff844fd74ada2d732b19d6fb44cdb4fd2ab39669bb4bae8b4aa842502642da0627620589ac634cb55e13aac528a4b8a67c6ee339dd38559569d9c9d64fec6db335b9968d747dc2e63a5f9569dbccd625df4526dc64e7b919bd881210dc03ed50197a799b7d9c7a0fc45047a7bf46dd84662f5d5eaea59bd92163129f4e357cc6c1eed5fc658a8a6f461ac097762fadf4283aaf5f7d277431df14a4e88d2388e95370e08d17eb143d974433650c6721b7f317626453ee7406aba2c9ea022d049f07806253c0094a25703600149b82bd2a45aa5d2d1dfe9bc658673329690e569dc5f0555203e0d0406506e8050f8595070165e9593133c4b2a72276c80bcf0a0cd0740fe4f1c506caee94330da38f1c941c59040a871655fdb2a1ba41fdd0a2c68cbdba7d785d4e16b3e0f36e40039c9226950a7ddc201a758394c295b71691c20f571d776c55762b7700b7fdad2f705209c36720ea4ad323ab7bc17f8fdca99011a156a81cd96ae87a9a5130f1342a810fda6c70e0c6710d31c769599c8afcf9f20a91ce2142ea3d6f36cc5eb5848d6beae28f99afc2dd67a2c6cb9a8b694205f4c07358477a98c180242460654129085b6d9afe5810d85f42dcf3b85c64ee30150f8feaa3b59b027ac45a8d743f106f0c0e7129ad8ef881ac147883b8e2c62b96ac4399891cc69a8f01e769011bf75e36f4f6a0b7835e10d443ee82dcbfeaaaac29950a9d6bea9a403dbe055ff5515f04d6cbb62d5b0601f3596450eb4d26eeea5ed0ce77a87df94f9813050d78604bcf23b158c82114101dd5d9c65d32e239ecbc3289ec56117da641ca565bb3fae786bdc35ef910686f868c830607c342ad114fda9bf5d2b8f526ca8d4f1117f78272c0539a535e19e89f1f4d12474bc8bd3ea3ee3a833cc145757f2c9c2de48ef1b90ee4d2780975e3089488bfe5eaf3737cb8e4812a9c600016363f4c13babc11f304938f988d9a13cd2faea13b87842611e105ff9c186b1b10b8ae884d8169c5d2fb58cddf1a184ee75f40c578571a54239c1d1c2fe6d2b7a4768f496dc8446cc3650ca072f20c326386c39c19a4e0be18e307ac19b34b4c8e144c694d2bba1664bf904f94a229c2f11d7ab47f0ec67c7918b8843f0d2b326c370ac8afc592e837bf5d6cd959c3c400d973de35108b883ca660860310bb3937000707f8adb07867a001f90bcc39eab10b9d146c5cb1f20480cb0299818ec6df3ade9bae9b7256f7077e340fe0d32f1c4ea1d3ecb2e7fab8e82894d3f08e11a51c0a5a60ac1f0377022fcc0822f23d19c20a912644a4b487e7d2e02a0ec1326b73bba101446ec3fc0a788667d8d5b13f3dbe68d8b181fa19d06569cbabb59c55d52b69525a93485a182991a6c17595194f560da33838de09eed48f62e24b36a5a1873b16cdcdff44207e0f168e6ca902abec5163205369e532c6682bd73f3b9cc6afb632d75a055e0287311b86da347136e1b7acd8715d3b8904ffed9c19fda5f8235eb9c532bc02c482903b53e2dfcce575864e50ca0fef2490eb3b6c6d713d5541448ee364e9d45f522c2f9b0f62563d105639040bd2c9e2491a1321c37f7b8cb09345d3b3c0bb0bed580ddbe0252c70a106f50b3b4fc3c57e232a7c0b7d1fdc425007a4fd1d182af40af3b5713d3975e009f328ce5387b7388a728cbaa61f4ad0396d9bae8912842a93a72436b450883be58178253c4e7a4e53005b729863a8a75a98b29f0476eecce002af0443771e78e0fbe3d85a6d3f596ae64a35d7e11c8d356b268f33d43972696d34761c0b068274133665b691ab849ba817e7b2213e888e95bdbc98fd9f257ab8346150cf788a1e6faf8e15a9107d212f2fd3708afc798f759252d27492e5cf280c5a841679a6c289eb8771188b5cfa62ae5f17d4e8f36116f51ce9cdfad80ea73ac509bbdcd840e838af1937e2beecea249fe38dc510fa752a8a4dfdd8c19c3d0f9538e5a7bdd988b2a95cbede841a374c03446faa9b6f608b2ad8665ed92fd42b70cfb023f1dba2b470ae46dca6c967db4b7e0217c6ef0749d1a47328a6bcae763c23584853482fdc04100ba95fcc2ed753be7846dbb730c34ca62d253a70712cf55b036f049b77f5793359537bd86129b3cd4b8a7bebbeda1e43a3c6d82f2277c0812b91b9801c4f93886c3b1f14554e91c9724b12aa6946b088af6599728bff50d0b439692a5b987b03be4c2fb29e60524cbaf674f1816e6d1db72d30f2a20569629df56979b5b036f485ef87a37c605c98188c338ef916c72de52af78ab69561c726aa0c6be17e9f04cd1ddceb8e725b3d26dde761057580e1932f347a8e0cc7387ea5ac3cf3196e1d49b4d5a2bf2ac48c145b0ffa1764b4adb77f15c6f01f25b06c227ab63c39d970a0572018e810ca3806f550ccea1702f4d5d5a6791b117662404b281ac3b7fb17bb0ecb33819ba7c774ef885cdd862c0080ee2c784100b25857a5547e159c773ce5ff688d77369a025b82e4c30bad94339109905c81e0aa735bda61d3653d935780a8dc9a010136dd8ae9a4272014d58052b00de0583f1e95a953af39cc070a264f25759d9e2521d18995b23387b93311357ecf8c06494e03aa36a888ef094d6b7ba88f4ed2783d72e28964b2daae1b4a3dc74b512dac40362543138af028b4b5fc339d8eb2d7e886d19d6a3f37aab1ddc881e75a00f3c5d73cc764486522cdc589f08bbc377c122e54336255787ed5547b3c6fa7fe27711176b8810908c5a9c6ff4a99a09d5d6c81336bc3021347bd3a87de456fcfaa7c9605efcbec0556e0c2a866c1b535b65cea9d874b5169891bdb84241bbd332836d23ba3153201d696973cd49691c7b80034742f8b22780962792480aa51fb039f7761b0cc534e42e62562f857b05443fae555da91e12e30526f0c944bd2b95a3c3d840cadea6487ad58e33e8064d05b962f43b2e3df0b931686e068b612a9e60cbc8d1f1cc6ec08cb4780554ff396d7b0283b6c89e5dd5ff0c98128faed71a757699aeec4a0a8466b97f182f5473c130e26d84941f4e53674154e5ca54ee6a3b6c482d8aadd996c962ca9d29a4ae9b38555fd7b4d0b662b771c201a208b841342cc7118a2c8bec8da6c2f9277af287462cf2c86ee7dbc1d6d57eb555533de636c2db3ec8c7ffcaca51e5395af0d51904984133e98e74ef42691ce4c43c73b52be6a3213df61fbdddccf5de9d08d213e6e37def3de0d205fd65a2c3a331623044f360f371edb0089d44d482d6fdd1cf2b593dd649a3be5076da405438a0ee060d66bd8001d3742a3251af136f956c17355372b6d67f60ca21ae53dc015a14beeb4b6e84a41697b4f87fccedc65a04159cacca88ab086d3d543407c2f3ae37c239f1f1f29797e4825006a36808038c5ca9b843f9d134ccd82b77ab268ad5b44f87d989810879807c1a1fb90d46a92a88958da59ced20aa209379096d9afc8194850614b278b7f02dfa8a903663e6ebc25e9c1695a1cf3699292b8783a1d804c4459cfabbaf39181dfc786e49caec19bc1d84d56de306e357f99e36a83a1ca23574e0a09c06c307f67c33387bc50f8ab8400bc18a8603835638057ad1fa4c30c28bb29708d50cc1c6a17683c796ae2c44474555f03c29a486f1a4129582c5ae293835f4c7004192992d95c32af0a01914461a1956aa2bd635ac9d088079a25f6fb4bf4f182383d932042c82516093a30b62969e5278c7bd235c67c46c339dca072c4217b3dd291c60cb938f697053d3049efbab52d9ade254254a06d813f471d1945b0d164960afe688448be30a322e3efa220ff8468c1232007f428cc32fb0f3ff08932ee0f6a6b6dad95f1fc4a009a9c2266120490c91cde4ec889e7e43ec41b34080ea34f8230823537c2d077c20c88616ca0a5365a8b2d48de7c5c16920b43fb32205ea09d3bcecf87798b42e3b5bbbb2a171b40a539b23dd4de0f2330cca071dcc5469e8ecb3eed7f7ccd215e955fbfd96b788be77f35a1cbe7921657b9b5d6e4a3e3ca475c297078c8c8184621247b9ef81d56eec1a3962ea585a9d8f51614c20ba32253981bb94958d88b2db93970fbb68b23ac056b00fe3ddeb5abaf8c850f059e174de065a8336193d6419a3ba27848833b3862a11d52097c3078d173dd036bb0c841d5f3a754387df19cd08e9717bc5f490a11ec06237d209004f648abbeca6cb748c5490f6669635d61b36290df5316b080eea919932d430fb99b817216ce97832a83f5854152a207b63ad0c1e7246e37451dd8b01da7668564c44ccb2f55917214b136e420e736197de651d7373e10d3d89cf97be8f18a159d07e05c2b2c58ece5a10e9c99b64528724d8cba139b283bf688bc7917319c5a5bee55d867ba58bd727f1bd85ef89ad420f5fbd49f1c7c6d0773224859c528ade73f844f6702ba86bd8c17eccae008b18a5e7863edcc30d6be939305a589168a4c00b74fa5f9b06eb0fa547a10e5a42d199b33cfe8504a7bbab8942783a8a719cd9c670634c5b1a394fe891775fc4e3b615e4a9b2d9df670ddd9ad7db06c5d9f6e9bc104af3f587701a84304928e140723c2ed115d8aecd8bfd173130fb9c70c4cad67a2976004d90d0da5e07ad5d6237ac1770be7e7ec762858f21eb665493adc02c53591e8d1950128adf1d52af656ad9ecbcd3028ac8c8b4edaa5d4542d8c7fcc57f5bcc6eb3f21461c6f21a1e1fa2c8c0098f923c0ebecfdcef25852e35a819ca7505edf5ed38efd09b284a3bd5d2affc3bfb4d51faed97731d62ea04fdb103912112f64b6b099458b210968679c6f4cc33a825b7b71ffab390bb8b6a5f71c07401edce2a2f72d9c1955e120fc9c1fb8c61afad5179a1075e77cff2063f665356611bf2003bf627b2c3e479fa4c9bdc458e786f1dada1be192cd8821eb63ff77db5b90fcdc86385e639af53a652263512af40d9e21e85f7122b44aa9558258ad54ef183e0b1a7579235e79f29c1f268a47933aca48686fa8e5bec58babdcc6ecb38793fe1d8a3536c937d46626fbc54599d792c4ccfe161d0ea7617a77715474ea7b957d2f6b84447ffbdf341f2b7f39139305f92085cf7279287a0d29c49af30de23b521859010b836da267736fb1d64f47f2e61cccfaa3476be4d25dc30a0ae799b2f388d52842b06a9877daefa28340ba6772019c2c2164e3af8e18b2352b6ce5e8fca611847bec7234d603f632978e31e0ebc185c2cd8c05aa3fe09d499eb612b0f25f15ecade8ca881e3f0993568124af16a13afe16cae8fe9cd5d228b9ceb2c0f20092c6e0b277d816f570c83de79b42599205639c6c95cf04359ce225153a955cf49acff0606948d04c7b814b2d2d5be2ffec93b3f61f75b2bdb7e111054ce9a10f17d62b9d8c7be2166e788b68a49f5e4cab612e0ef85d9df7edaceacc0cf4cedcdd8ae629f088e8e4a768fc6b8af087aac759d079767d0266d7b69c5fa71f24286d3fa5aba1c165e126effa702d6b7f3f497b0641b8ec97994be658c8baf79edc0265ea6e4ab89a4bc34a01ebebe9cb5b7d6a5920805b2f1637ccb931d47e74c8b54b0d06fd5557c98fdea3a6f5495c11cb42c328c1fa0e2ef03c73b1a2d7de480baca425129d48229693916584e53fead79bd5b39a3d82e316b13c27e4391e5e9b13ba93a7018d8521834d736c0f8d7d929192c1e648abe018c6d1591a2846fbb814b952526e032d3f8618277ae903fe1a26244d5d8b9304574b48b448116aa73394e00213f72d50f1a2556d5e0cba7c7b05ae8d80882462848bfa034640104c838b71ec9f93c46028dd437ac63d794bcc252380073457132440d6f9b12344ea6a3144380a3b6b82176a137ad35b5eae471fdbd4e0f6dc0d0614a5ea0d2f69cef6d645f333548e7f67b836c0d29b574125ce120db700f0af4bae09fd22a65465a96b397a25d53d4e704c643e90566a16c36b21e8e83add4c41dc57a925142ba252ae82efb320b6a362d8ee91ac8ef34721edd637cd44c8a4a524dd6e2049a54e53153b2aa3249c9f6b517ff76484764970a426ae918c5f44de3360b42524c72123bdc392a6d83463492d3396ee6e2497d58afb67f003749564de2c137082e105f07d32123a5d496268955844a7724186a56bdf1c1318e951db2037f742539a006cc74c74d2218cbdf70ec064dabe56203832f4de8e9d035323ec43c5acd32c9ccbd56a34fd54b92675c2df77b4301d4a27ec3f41dd1517d00ad9a025b5943534d2eedc9979bf4b06712e59bd6e0b4793097769b73b1b040b735c73455a90d0335522e719da56e4c043c813510ebfd0acd70b76b9416d7358c6a2841189328d9dbfd23484988286788437b007e03bfa904398c8211983a1d0028145281d27b028bd45691c96352cdbf8fc5c9c4fc5b2f2b10d7f14da79a3f22a2cfbe1baf9886852b0820a9940a027870cc8c9f0bf8346db32f30f86ff6e129fefd667b77abd2c4353212e8141fc91fb865b8075c09613758ad70161c475b9ed47a179dc1c2537d49eb8182ed487e703fef82e2eef1ba1966fcaf09f836895f4c1c1c57b4dab4e9ececbfe74e01a2b2b1ac0272fd2210c2dddb5fec7127a0ae57063ed0f81a23dae94473b8af88f8beb28b1dc3b02b217de2ac1cf6f93a2a40950b2345fe3857cb4d8d42e46612fee38ac35d21b7cd2ba021267da7873771a382db503d869e4f578a7de92ae6d45283842c7e3ec567b268be5611f2709c685ced41af16757e946b97d6cd3c3d4655b8cb08c43e1b0e8e7e7a3493ee34437dffc5c87ba51af42e10a53dc0942b6c7e0faed6cf8c26caefe9be91e3a772ec50898bf2ffb5a6314548421669d0385b8929bb619c0218677c5f0f495211a7d902c212cb58d848dcc5865d34e59684ce88961ccaf3da4afb3e4b224dacae9721e4b25aeb8bcf7c911c8e9310b08f5f65ea49149a8ec0cb64de46c495eb7b816afd4222c5552e66b4b159ac8084c7e785645990aad65c8516c5c760f0eea3f3de4d9f8b9cda7961a6bc04033ae7e9592e8aca73b64146f609a774897bbe6bfd3f801688ae1e850cab5d02a67e3c2bd16835e852df86d0cf47e837b3940466e0ae917e9855a37050bdd17d22da45ec6f082eba51532442fcc8ecd8bc3b73047af8aba9e655e35e9b7c21ec7746f3d03688588623e08390fe573ab6e6dd153d4edfe46d9c1c3098154cdc6d47e640d2ec18309d4331482566cb453601ca69785efbbfc9af342289c776693fbda9e7cadd8536b61f78de1928a21c3e02574a8d92801eadf9859b8a232e30c0e6e8b8d2f92020014ae237cb5ff1a5e21c577e59050760de621057182edf5af297e50c8d4fc1c478dddcb83727a806d618076081f70fd8547c4db5232777792449abcd49085217f0293ac899baf004265d19682b6d12697420547da1c0be62a7ac9f9600a6c41965601496692be0f4213fb5f72f89b8f084b4cf308f59c4ef35249ae5cea826feafaf5816d9db3568b8bcf9d8ff64d17eae6dcf123ac6257223c6b86571a649ae08ce28e4fdf1a452a08a456b366109b9bb4908ade7a9a6f3258a1d588cc7837237213ab731ba1446eba8e2b594f7bc3b6be9c7ea2a578df7b15433ac95656a4472ed5146f4e3f9590ac88e9e4c16fe73911a743c47fc09df28cc0b0895ec9e5eaffd26a62b1630a8622bf35cce11a81fd90d66000f2a1ab352d224d59ffa841d7ad182b270eff3be4ec97cdf1070d2ae891175fbaf861e2239c28f36b0c938e830832025314dab09b5300bba5403aa483d864301fddf43f1d7f51591e87dbad6dce9830ff35d4c0b0e4656a475318088065c08043c1a2a32ba98506fd62a5b0b6f2c1a52a1c8125870169199f547da901a92eb451b1ff1bde748d273aecfe48550f64ccf610a93ecbb1387ca46d6d8c3a3a6888316355f7c0892bad5e7b080e5b32a09fc815c180e34c27841e1a709830a41bed1465ef022d14bb148dd43090d6f0aaa35be2b85059d74630dda65c9c105bc5b2a52d64e794e350b3754655458dde494f25adf5e1ce40d3d7e256ce6a68b661bbf7d6cac3809d5264df179830dd86ca881344aa4bfebe4f8ab2b073188e5694ec33bcc6d6f57d1d4c9663f2025e5d36337b0331fe48a704b1fb947f6b4a186b944d86d362ced76567bb3d6beca100e51ba9cdd4868690aa9e63add26fc7435ebe676bac9615c8f74c39b569bf57effdd1a84de41ffa9620dfb4a61d2042db60350683b23f02f17da87cbabb24296c19054b86e1a4447a614ff9bf392a20c6897bd57d1ab83a78803a2747490f3e582c3012d9566c121f6a7a2b661f97b62fdf884335757ea3ae8a42837cb52be42c30292d5c0453a9b5a4859d29ff83e2cb2fec5f55afb6ac0f665b4e2ff0ee98829544affab8cdfe246b52e9001667a951c8d6c72d54209c2c95362e2a645653be297a031eb59b6cdaeccbdc01a3e4839175c1141dc773882a24beb901072177c1952b4b4f2e79a5382fce0d8c130a255b886b9b7e7d0763cf2ff391314600e29cb71abaf11150b0e7e3a59b8f293b707e0389e8e6cc6d9352b030b6af3f513f4c1133d2d4b99f37927cffca5386ef1bcd2e4d84754957017981c8f29d9c338a1fcea30d226670e4d239aebed627cac198bd8bf0b9548f3c9e18859d66adae2d26496a609e357d41123a8fbda9c531ff04c188c183091362f7271a6bd4bb12209e37a5815168781b136910b52ea632c8bb4a5b0f0b99fbb737e956ef94c7672c7f078d2d7ece9ea38e8d42cbdbd3f4566eb5be92c7703353992e8c7e822d0194a103ba9f2a875820d2b24a078eddead3be3998adc42fc570006df9f894f62b0106a866e9b27aa73c1a207fc23655a4545cd5b830a77f737703730fe0ae6a0c70e95e742cd8c6a2abf65b1df867dff2ad03ba2caa6c64efbdb7dc524a99520a7c08fe077f08bf7d4fc2080f00ee3b8cf3e47c09fcd30d58fd8d6943f5ec3c340fc69e260ac07f0e1c8f03031bf61291f6ded744a92662ae758af55e6e30c0105582177a26fc7f8e17f6f53e2792f07d39fd5e47c51ee10b5797fb007ce10a005f0e9c0fc717d655bcf9426be30b57365fb8fa9a2f7cf0169940a55f4de4e0eaae7298e05567f9e75ff640a295e9a5b0c17411429f411480fc2823093e13d42d3d46ac37e949ef58983d3a16eab7c3411f07270bf5c3b01fac33670b456eb0f359f6181c15eacb07bab23f22118a4dd25cfe95931004631221f26594b165fcbff183c141f9cd5049e41f9133f67264a16ffcc021d890a18e38cfdb2061c3bf12f4efaf01ac232511ff847c7f6cd714c2c639dce5df2e3fd522135e6edfd0a15889892ed115836e7c4aa1628f640a23a3a494328c8b8182820a03556f8761a20ee5609483368ca294817976c8e01e9fc882e29f79429cb283b884081dfd88eef6e748ab2c2c47160c4c4831ca300e32c51e876256fc5a991c6a853ddfac6646bae527a32494835142e5847109d51d04fad2c7aa831c0e7dc6c03036ccb12a2c36cc6972307617243a6e92febefd61a2a02493f3104556373531312d2d2525212141c52992e9ca181daa937f429c72639481c1e86408ed202e7122c421198b107130824dd3256343bf8e2a965f0791e5676f5009cbd96f55faca89d59e7bb02575c51e9059fdd8c73104571de9fc2bbf50caaf8dfad5562894279880ba0e7a3e5ae619609d8edf0d963f6cd75175cc68636666a69d65e39cad48690931b7afd21261ee7c0f721ff229777ef78c4ed1a9a6c8e658b2733ecf76b06d886c8b8912820ddd45e43cf19be7e5aee8422c336ca8ca2e3f76b9ae9ab074d5845d356165748a5d306b3e3fed52e82ef645a7ecc329820d5577e27037581598cb50375c5d161076081baa2e8bc8861de52fd6991fbf645fd8f8149d1c64c9c0861d75e777548bf9a6e2e0fc8eb26ac2c61bbf93b4ccd59dd89c7386f53661597043145cac09dbde5e53d877c717f3e8cc64b02ee42e07e76aa5729e96aeac8cad9f735ecc1ce5c67721e7e9b4784fff3014c57958698920b9c40d4bdcd089b8d1bd7152786fa886720f054cf4280c3df2a0cfa33818976c90f374ec97dd8d147ba251bbaccbbaaccbba75eb2e1badbfec8e6f6383e5966082baedc9dcceacb02ee42e2c36acee72225237c36257ac1bb8bbdca5c0dfcfc5eeacc9b6393bf9ea7db0f1c3558c4ada87328a5c2deeb9dfb22ccbb2eca947d98eed7146e92784880e196cc85cbc8883d17ffa378b3022adbdacdeb3bdf68549244864c9f60f21f2806cf336ca51a7488e5ced33a7fe8547aef68547b22fb429f88747eeac58e53be4e313b9d4734e9a5f12797bcc18d98a4fa43d80e39f1007e3673bd8161c8c2c256cc8493f1c6c81f33616c34a98a41677fe794035830d5737823cfd3b767c9c07c73fcec1f83a9cd8c8d33171d9d13d72d1dd2d57a53b6b5d6ced514e8ad54cce4cdb62a4373217539c9c1847398ee3389a838d2dd61ea3d3f8491a7d4629d9c148a974199d36e7dc11cd60b3ced3cd8ca0665d09e8c4289db24ae99cf3645d094e70fd3bab5c8956bd2ae10c6be3b25252961f6c775929098b0d702081c8d65c564a125ac3aa2e2b291166c7674749892f0368010a3a7eb4d8a1454c1638b0220929491ca194c410949490e2ca9fa10b20c2e88a2984b042084fb4e46cc1954056a4f041cb1015222e2d39975c29c31557d65c29a5945226e42ecd1275e9002ed5c28395524ad9458a932b6fae9452caae0b22bb20b4995c2ed70b38ac977695c8832e508aa09452ba7541a8369772d0e3870c80f482e386fce5064a20e180f4427abaf20821ae3c22cb954848b95209892b5766715d9925872bb36c71e5d3d531460f8c2842c7081f5cf9558716dc16375415f103018ab8e2cac7a244e5a00370412fa972e4ece84144132522ba983aa0b4a8a20644f032441557beb5c1d100982c71f4040ba5231fd460d5235b92a3c014214c181ff0b086132d395d574a71e5f790524aa9c38c1dde766061e281658c104220b133840d2c363408220a4d928a064855665c3534b842061689860664c84c6089d10c103354492159206a8043e79201820b156e0c520a88a71c36264c9d131d3435b8222ad9045a10b53551c50c69417051054bc3290b620d2a94a95e91810f6b345d49cae175650b1ec640615982c3045c4b58a8542982516471c592a5063151399a58f56a0c194d393d902104129288614a19554c9052861125fc50c61633ca682aa10c28d6652786401465f38ecc919b9d96b8245dd6c23c6b1229ab3dbacc46714a2b31f2f37cd2030d1be338010ddb532efb607ba7872fbfb24056b6844183a82f3418430d39064a0fa49452ce1e862efd4867685239558e2be50e1f3c146145ca95ff5692d8218d9d1984d5010a06738b284c87357a905c1cd11d7898213a25cd1d8af01e38492968c0300cc3b6589a5b30d91dbab841025c40d5708698132e3b610614ab29ab8a4aeec262927f98993f669dfeb62e19143207550999232eafdbc9105a56e212e5aec0b21214622e7fbcac0445d40debf5b802c3aeacbbbb7b1cc0d02b8a47778f3940f703227f38d85a7ca37dafca33fa4e6a2bfb8e1e236b287a952e92ce2ccbe8f7bb3fcdfc03323f9f1c20b392146068bc587aa51786e0fa73fcaac00188cbdd0a37d7598362e3e71c1f8f51c6e913003b4755a64c9796e51a918b0f90a0f3e0ace0fe81971fe83e031cecf9a3087bfff8f5fcfafd3df9ee1509ad5ad8abbcc7df496d61df5f022340e84de01f423b2decfb3d4e00167fb04e3fe6050539b12d057001fa11c027f43b59b5aec40f8847779983134680a3191c75bfcbe8f17da41b7db89d43d3ed1dd679383663d9987fbc48c8496c31c15a574a20afbb8498b4987fa2c7189d999bb9bb2718393ea53f425329e59414cac639213349fe09fbcedbdf0eebb474fbe00e5bb7f177e6ceaa3fca8e85be48a4a685941b95a91dd6f1dfd9915a24e8207b9e027847ac9d05f1950a7c35b2bc5bdc05c1c01867b88df60428ddd3e34be73033d4b1a1627f6063ee20789452ce59b32c0d4dd3b68d524a69d7c954a53232d60a459999a194525a6b381a4a3fc618638c2e80393954d3c6c6868db6a152d9d874416e6c6e6e6e543534373733f6e6e646e626d5dddcdcb8bf6b49d7887fdd169b1c6c7238e17ab73d4715836ae3cd1333dc53d9f24fdffe66ddbe71e3f6e7dc49a05bfe409cbdbde09c501e09394f141f8a3d1c7350bd322ac8c6ccccf1f5e57a92f3a4911fc0b5af358d6a54a31aa5946eeeeeeeee5a6bd9966559a6bab2e56b1e92d8de659f7c45594ee87563ac918a83413818a77891888c2843f2a82b6266c9cccc2c99995932b364342665def1a9f1b35187addd006038d2c639314e49dfbe6da7dbddc4b4752775dc41dce6a6dbb2466f07b65fb57a769076f439fa5ad64e4637f575100e527047e3a590993eeeab76e53c9e6ad945c78f73055922a2d7d993622d3b766b72e3baae657777ecee18a3dc78a6a6636913bdf06d7035aa1bcec6042d494bd2a0d86cec76e95576c7f80dc52827e5229548145ffd3330b07352492b9d81413fc6612a955d39d95a2b478d72e458fd53c6f537e79cabfd9eb6754de9c730947efc96c921f3396ece66edcc0c0da53f63c4b018638c5f48a30bb263d3237a84f50867cc0cb13869c799cb0fff563baaec376ef2b9d1bbefbebbbb077fa10b1c3bb283a9a79b4aad1ea84573019bb7f1436e7e75f3f9dceefb1b62a344f5365f7fe1ceedbaeff8054bb7fb540d27e3d1bccc5b6b53a9d4abc037f540b7f3c22f72fb6b3c1a2fec4bf329affb70d5359eccd3784077e63340f390f9ce0b7b5c19073ff5dda7bcb0c7ed8c6e7fc7da9e0bdc74ed17da558d335e713024693779c1e4847932062a85c9c979a4cb0be6914c98640c5408540ceed15c9ad010341716b63fd45c740c3fc98fba98cba5adb4c61e6e4997f3d02707650cdc43a55c7f2a467ed4b18b5131b29f9aac3805f1440494962827a4cb459f7210468b135c9aba387979fa0205268a3e4917d2e6a24f29fac43af4491bcac6b4f69db59665516badb5b15a1b6b4cbe7f63595604acb5accae98319ce82c8da0e6ec3c66521fea11f372d7eac0583ce7429b29e300f6d1ac32ca74bd1a916cc13d56070298ee118aebf3f33e11e0a453128d7a1281466036355965846c6daccf5694046c50c7b29823b5f324b7b81762bd418e53cce20f61ea6001bc33ddafb4e0c35c352f46bbf98c4eea6c535e494718af7c4a5c892cf44a5c98a5310373e1111a1b478363746c51ecc85b95c3f1cf4f7598a3d591767f97b61fad204260b9345282c46c52f636a01e66a969a4b3b62e397cc51e86ac5dfc7c99f65e64fc627977be21366d58ac5270cf24c93300ef17c29679a308771687e95638c5122fd4ca139e79c4cecb30ecff89f828d1be79cce29a9b981ed97b1ab94524e28db562f16141ab9311eb9fbdfdcf83993832e05fbeeeeeeeeeeeeee965894320ba9ad31e994347ecbaeb5bbbf9851afe084f8a77e8c31c6251bbf566b6338c1103918a9c4b882df6e30de43e71bcd304717292829ca75ba34853251a191c8e6d2a6d893654d99d10856bc62cf26c659fe4146518ea62051b96e65e93a174466d4a56073e7b74539e8bf2db1ce3a717a36307726e7b9b9fc9947bd388b9e00c58691882852f19e2c88cc680ccb19ddea4cceb3e28ebae0d85f8dd1ea6361b13bfd4ee9d7c359cc3b190efc35c97fd8e4c4b1e5603d9bf9fadabb7dae3b49b5916bb71cf795fb6d6b2ec8f6f6c361a1be7d15ea5b22d73ed06d2ff442ee72a997891ed0ed247e539d17eeb8da735e9873b50712376dc69be9b1b3034b89f757c9a7decb9997dec311a7bf9d560f67f96747161482126d9c5394f2ae28f5399288ee43a4007483523ff34ebe75853fe501f97c1ce42f04ba2a6bc3f090f6ad75771f778fdb43a9892f97b3b8acd484101351377b1d4196be0e19d81b80c49e99efd768de7ed7d67cef20c08215dc100591b9a6f8b9eb3a93c102e9a10b3ad80ee87e1a6fc68b5d10e68f08ebf4733711d88f79fce5238b5f06861b464f7d3dc559fdb20b12bf1ec221c7fbffa555718959124589ea53a27a9a07a279a056aada0c14f98838289f85c586ed92a9b7299bb7f9da95e3f296285192e5d71c59893344f5366ff3a9fe0ace1599076a8143587feb59108bf51a2cd61f489c2a4fc90f2a8868d262c10f32b24c69d17c57e2d3cd35bf5dd6ca7c458884b1a95f39b1345ff31c86711c37c48955bdcd87dc4424f6b44b069bb192c8cc17d6d4eace76a59e2f86c33e363ff5199953e6ffcaa43e9c5f1b7dfd72505ae9d79c29210e4e1b8f4864c9fa6d0c03ebc87c2de46a622621da675e1299992309fb93011d90a47605b51011eb518c7b96e9bc8c888345a6f65388093b3fa885ec772fe385f2cafcf44225f66307653e1564ca789ef2587e1cfdcd4be261bd753e2d52a99e7a38f3e59d4fa448bb5a48e57590b3e44ff9190e16e7f2961aa47040031c945fe3d11cd10cc15f8d910d2b7bf39d29fdc2d9373a00aa58ff7c4608820d6b12bff1fbdf1350bfbffa8e1e45f5e5add14be2b7283bb253dac0720f8f735663f272f7ed8042ec84e16c1d82e50feb4d92c126b9b6bb4bd90529ca7edba68cd1b18f1e126e3a3f9c15e2d35721ca5a84e1f8675b2a67c9cfceb0208b8648fb739a82ef83e5680e02a8eefeff99fcc223f73f2399a7906d72138000bc7ff9f2bdf73ccffbf790b01b793ec2126fafd33e09928331496a49ea7f76d0e3625f85ff3c2f3c7243f949e4f5467aafb5782399d0489de4af33ecb368b096cb4a9af0d18a8d1fac1bf92b0658c5761ac70e5af847fe7440fb151e79f05595ab1b5faca076cca81e4eccd5115da6b8310212681f13f4e6d193aeb08851fc237f48fbf0e6d14d2b56318c09acaec0a8d98d2c546615ab9886c307f9717ea44277684a0fe4ac621a0e295151514e6820c38a278c89963256764ada85194a0cc1064f558099610e01418c3ba3b4e6e46e758b21c35db1c471798b1041777559c98a28ec141be7849d640e3b298b0da32b8d1b46a6e80aa32b09291e55bb0a31a8e872115d99bdae948fa3de708bd2aab86136c4951f62504236241bd22deacaa7ae68574b2c7d8d6992cfe4ea5e6174f74b2cf62f3333b6e52fbdac644510f6be0361b3cb4a56dce0ca2bb64e855eba51460ffb7584e56f236c28878ce2535c5a8a4b71a98bb0613b61b19ca464c5d1ede7ec0babbd2bfa853f8f62115bb703ac062906908106ca00678891230c3966f640649db0425b74a878ad8183115f9461c5946284136e8619f80ba622d4a04c462c69d256b585c806222755c007270c6e0846f1c08b3150fc5005073b3b546056582e708ae2a80667142dbdc0fd2dd25b5551078512ae257665a79d2dc061f3618915d2d23d832d42597a8b10104238b8a1c5c18cf2c20ec040634c11a034c560420140184ce850031a636850f29d9c2d94ce502a21073609ecb2d2193f144d218f4123b0010c1df440892c361c11a5a0c02889c996232b388861baa0ca7cc24f46628eacc862440f32b03e97a5f749338d18e69c73f2f8420c274c5e60c60e425348090aa827709873cef914c578f2ff3ec41964d81947375e563a430757f0525ca23de59c52063b2f6fb12108243c61652e6fb1810b2f488e461a342a79b9b26db1418a9bbabcc586a41e6cef64f9199bf28f5483232955e152ea52e484c4f4f224c332ec69ba61127969e8c2149252ca29270a433ee3d38f9b877cf7508872fd270a42110518340f6fef0d06201486e28ceedf4b1b34f395b2c93dfaece1f8f797eb532e10df24b3c7973fda05614ab107e2584f6e08b40b9a07bf046a18bed06e24d8f5ef975edf9e340052d3031b5a205146b5e21f3d9c6727458695ef824a88f370bba07dc41c1b6cc84ff7bf08ef0c70e7913c3b96a144451835043abaf50b5d60262aad2862abce233fbbf27b4cfff498cca7d2089286ba49fa16a560be2b019adf7ce9c56f7aee8540ae3bfd633532c9594edae79ffa2323934af14f2ad575fcd3751cc73f1cb76dfcb36d9ac63f9a9665fc9365ac93fd645fbdca3ad963fcd39ffde41ffe497df6927fe86f2f33307bca3e28f3c85e7ecaa3ac23bf3d8c7d48e6213fcbbe7a9375b24fb5f6c28d94c7ac43a557e9736f847ead756686ce503a5f765d9844769e11fb85dc275f9347b6cd9fa55569343589d4b499196d66e69bd4c8f2998fbf1dacffcccfd85ca91f3b6824f536545ff3fe91a5f26c8db73aa2d1b0ac76664672f6c697f1140dd4483fed3137c43efbc28ac4485c8186f42bd2587045fe157f9c7ae59d73ce174010025d11603749bc520529e57f0edc73351c2703740474c4a9542a9aef9a12005dce08f77c2d67bd10e8c8c605669251a954325fd1a7840d5d60a6063ab2b151a99889c63534b02f3c72eb67a4292eb1c9e71c185c2ed7926b532f696868686868b41e736734fbbd706393378b9b176ff55bbb6e7bea31eb6c55477e61f6a9774148e609b9be698f646edf0b37ae2791cc2f8191eced1bc95e3e10d7a6565fcb3e7b2dfb906c37ab2636aba7f1aceb32ebcc7ca1fde46bdacb78a11023488c68cf3704ba61110bae5c4982228a95241d08754166286f1744a6c05c6b0dc112005df959f648b60f61b8f57be1c6ed4c7e48b60febd76c5f3f7b29bf3e90286bea87a4bfa227381e470d8eefc9aad5c4c6d77c4f6aabc98d6f629925ff66f54d6cbec9479fef670fc4997784f4bbaf375e131b9f12ad8a0e45dc50831250bc5a36292f14723b6f7b15ad1ee759de24475fab5e5f8e3d4a82788c125c08010d358ab0c69856cd33e99610d66a02d4aaf938b2ea6b99fc56a02f2140bf7eec56c0aee45b3d2efb5457c8af77e73ee085bed887e302765f8897ca19b73d6cf5d96bb576b5aaf50b85dcd0859d6ba43edfb08d604f1fc9fc10865bbf176e5cfa61f5628c31c60f09c551d3c5c66746d217fb0dab9f03807684f543323fc4be5f0a998fbdfcea615e581fabb7bf0f09fd8afae7c79f6cc196c33f8ee304352c33dd10e8e8862e30137dbece84be12a016a55f5855e0ba91a39ff45eda3827f49caeb37ba839a171b91a530242ad0bd65be4aa07d4da98bd53c16b9d736a1a1725a1f0e635addcfea903f354075ffc33e514b75f32f14ffca8c3ed8f2ffea11f94635ab9fe8d6158772a54aea87a40adadeb3a28d71011914f21e2097d0a9529cd7db9adeae276b7e684b6745be574fbfb25f348950cb75543345ddca671baddef5d90ae4d3fb43d5dacd39b8738535c7f1c3ae078b1cecd8b719878b0d40b39a778f3bacd39bd0c20e4145db1d95a6b6766ba20dc172d290d2d89737aeaa71c4441b5b2ef06a875f3720fa895c3897de1c89b97ff8d15ff1b23e7d9aeff0dd38d17ef9150bc2414de68b97e9374fd66e9fa4d97ebf1b57427e7c43d39715f9c077bff9a242b022d293e17c65f33467fb18e87fe921e70d0bfaf0507bd62b56a9bb66d33f35c0b2a5d34b5361b2ef3e29432be0cb50cf08227925adb0d572dce90ecebd74f0926e4a5a9957d759ba199a1a1919e64c51683ab1ea7ea82c88fe39c387f7147feb272731384bff887a5bc3192372f19a5c739987940addac9223eb0e1cdebe6157b6e5e37af1194ac1c010756f2bca9189d12c7eb89628ca856f5b8e539f11cb1f5af1c6ceae99637995c87c2e9aeaaf06a4b0873ae0e122e835ec6b3e3a0ab2e773e5348f3f09740dc711e181ccc76da553f998b492087f6d1549a870575d0daf63617d904eb786bc1a08b4afbe8a4e6e1cd45532125ac4c740ed7bfaf87a47f070b9b82934e18b1d8b0939a0bfee924ef7ef5ab5f37f78648ec7966c58f1fdedc909b46e01df165356491cea633f6a70222ab8dd5c76e9d34d6501d2728f66d0fbba158a77f1661b9593af9d0dd5ae4da01ced3e1006eed3159ec6348f3f0cf7e62d977ad7d2fdb0fc4b1e933c4e743f7ef4cd29505565fc8ab1e51ca49b33927c52aa514e41d9cb4334be83ccedb309f0fa398bb534ec523cb2486615d1059a7b78ff83cfab9fbe353fa58b782dfa60f88976212d3e2c671dce632f66a856158d77591857831f931eb602f65d45e4e1a7fa971f84cf6b16a1e5dea539fea07dbbf750701ec6a5fb34e967dc46a865d761e0f386bd53e2cc00e06032b225b5631aaa538739c343087120428a0cb6a979582b044688c2826638c113586d3184d4a609ea4e49191010e46a7537a8c31529f2edd5d7a8cee83dfbdd53cfeb2ce8f506b95b23fca2933a63dca49b12ae79c53665aacb526d56d720560314fc1585cfecbbf7aaed53ebc7d3004b01bbf6d9bdd96e2f8277e37b9e71fe4d133432fc1b7fee22f455c7bc11d9f2fac6027425e622e563430c6684010e2a6c30873c3a3747f47c20d73dcee79cbed0e70bbee2d10d4b8ddafc298e276cf75413a7e1a0297a716b7a9eeb671b9dbf654c5dd805074b7a72753288181a5ca279e8f6236cd39e7973077fe60893bbfb841e98b12d8e3882f88b04fdc30c78d60bc08c20b303e78baf18831d4386a79cbbb20fdba405d6f3c28f9a049c96906ae0308ed0320ae94527431c3955374e18545c287aa71c104e5890b2da02471f14514168e707151c613262ed48092c5c989100b481839c1408805a423a718c4c0429697afc088f1d4dd008b94e6c4c0ca5c568a82088a288a4a308a02092e6c8da2041e44510554145b3c8d020897529a434598c9820e6282a24c992cec408584282c7759290a349ca46002da60e7652529a20411830a2baebcac24c60b6ef83bf4854dc13d73c78d8f71e11f26fe69fe70353f6cc9638c31fed27c4556fc1b638c738bcd611de612ff8925fee95517376258dc884d61032a08c7ceced4e23ea237e8b2557807a79c71ca0b76cf99cdd5aa1bfc1c07a7bde052102e923ec77970e0b81bf5703c19d6ab92748691352765c2cc651e577e09f23d1fd69141eae7f00f76f9573ad8186dad1d41ae7d94c03c5a9a70fbc3d495238cb05a6d3fdd47ae7e7e39acd319dd301f5931f9c3c1fe7c2e9021ec0acc01a5e27504aa93562b224d64e152ecd401f8aac6d58d2f3664a8955094909b78c00c2132e9d38abdb0265cbc68d4142a54c6165f9e96a051362612488f1eff0361a24018628eb021330919e23c9caaa97d88f390a06f582d7bf92aebf457964fb6f6382dd641fcc37595e399c1acbcd82ecca5eee0e8010670cf4796f730a5b4050f38e845a8b01b8684cdb813cadd30ce3a8fb77b0afb8eb0ce24438a578459f3894201893daf1b7fb58a401e8b6187cecff9b2053df839ff192002172f8648e28a0e5b4c196c9038dc0004c40d3b50e30619c084b122c680082468a0028be1c1cff928a8184f9ee8408b2c6890cf952d6426f6b2d380edb2929719bc40b9e1ef6c4530fd15127b70b89f48ec994fbf02f1e5b702f9f1e9b7822b43e4c70f8757107f7e38fc1561dcd281cd6eb07fc31ddeb123a36ba165cb51947be3f296a3d796206e8ecb4a4a4f70402dfe1c39ced31747fe6fafa4fbfa12e0d64a49f73d50eb7722eb2ffdfa96befd94d49dd0ca7cb8335bdc4a3d7dc6912f24b2280924c0ad0650a056c84c977e38433857f7dcd7ef8a08268e7f3817c86cad385348f7e108c11e6708f7d8738f7db76217016e71bf49cf9bb9630a49bc3d83f52497ebfa0f9884705d8efecc625531b02147c9229115594760883ddcd3e700ffbc608bb40fff8aecd3ef00f70439015bdd0bad5a366c5702845662fc10f269751fb2102e6d715e0f792de420cdbe766fdf850405719ffaa0ed651e47be7da056e775ddcbefeca744e6eba45792fa96805adbe671de118efcee815a4838f2c38900f7db4bf90dd9befb5e3d1459f49518115d2a145954ebcfb28efc19d6919f7df58b1c5952286a40ed590b361220e93197fd5bc8c471e7efc41eed6764ff707cb1dc778f6d31be127eba5f91c8aa9b87c39f62c2e14f3d504b096f3f44fbedf9b7ed5353fbe60646d654812f0956acd3da6f1f3bcedb368f3d9c21dc6fcf691ecef6d5afa96516ffaa467027b25886e9cac639ae1bf979a79fdf27f668dfd2bccce3883d8e9020fffe99db1767be12eeb59fdf165f485090f6dc1794fdf601892ccddbc199bf3d50cb2702da673f44fbece767d96fd967230bd33e8e2ca016508d2c2c35036b5967fe0cebcc1a599599da23181e777af430408f1e97bff4e83189d044f4912492446d84944457f691f431c5c7908f18f820f241747d2cf918f24184421414845018ba2824a12084c2100e9b3771273f7ad8bb273d6e8e619e65588661528bd78e44f3f02dcea3e85ae49452e61dc7dfb55c0773bb20d2b5440860518b83326e1e816ad31be4156194aef84177bb4fe982a494731291b2d205c130f9b52a3539293539d104755597959ac6dc151634dc551d620b13cc2df853e3e8d21e54c46703408478f123e4c9ba9c273e3fd1075b88b63e3ff114d62587322536ce096975698d2389f615111e6f6c31a94f0b28cc0ff4110605256844cf0e67f573e9f283727127aec4f1038834a56849fae2448e9c1d3d7e78e0486456ff12c726afaeac0bf3414b8e1d158b6cb5c58d24427ebab1dad5b62a83fbc1d6e1a0a1a65c2e976bbe4b882bda1a415716b6c6576c97d2145e6e08de28c5971b5bf1392529b4dcf83b7086c8b4e86b37ec5b443f25287022400c3b3d98473ebbf8a77265feb984e392dba1ac81935de2a4132ebf4f01b68dfb306edc4feeeeeeba2f3441f7f576610178ae57fa3d9a876fcf59ad1f021805d6f1afede3a779f80f9eebec2503ce43b3af378bcc3a3b3d18ec1d7ee4b34673d9adcf803b3d47acc3fd8505b86d638c91692a54c14532c28d9d0acd42766768821b9f757a93336c3915b64e7e2af4c559a1b674410da118a834cdf665410a15d1400000000315000028100a8804029148249c88da1c7e14000d80903e6e56180c834190c4300a828c31c41003882104180308323554ab00103a0d4d5b6fc441b4dc7d0673d1baf854f69ac1beff3452617b0a1ff09069845c282e5a9938dfc19fcf4dea3564d3dc6c28384e38f50c98302876f595e87e1a495e3267ce8c231cdbcb98ad00bc9ea5853b286b5d8fc44d880603af8f86988e9202fe751b6d3b1fccf6b0a901a161177a0f97b611ec4016383f237b4b3795d9314078117af25a591594bf537a6545b01d29b51d5c42c4cfc46d6406a6344a5e775fc8019521b8b85324a05927781f58e1564f7181b775e69a9ed0636e4b713824afe0508004fb4a7ef93e018ac441b10a41d4bab43b640cf4e00db48f0efadb762cceb9e04ddb38b9e22477a15b16b0e60d69768084b05adc14cfc98cd85011082e1ee745dbb7089639416adcacf981731c4bf69c07371a5ecfbe6c7fc56c7822a3cef4beab994eee7e0d83174a34c490e093b64d02951f83982f40a16452c4cb4f566882a97d127377b73af48f4034ace5f440638258edd55a3d3d652099f7a782b7c2a836b1391daaa8275f69bc355cc428d20fa523f19499b4a2cf5239148567d6d9dbbc6463a5ac48920ced56e7fd32b14486d535ade0cc636c8b28500d0cd1f1e8a132967f1ca16c60d50b153e049ea62e7792586447a8993110b08501e03a4a0278292f859249534b40e8427b9b21414a1792687662f557e31fafb24887a62ec811c0093075d9ca2d20c240ffbd054e500ee4ffe293715c8674f71666a52ae08c19dc55784cfcd9139f2e556f0f23e2f605f2525da4444f3d7a2c84e4e7afff72ccd4448b6732baae3eb4484521fdc5a8360a030c2a84e35baeda07d846c05765cd476a7146c0f40fc05c049b8c3aedab77672cb2a64e3f9f0c0ecd62ca5eeaf64711589d73e876be2a2571a0cc986e3fc845fcd90c2bd050ef6f8d3e86774b480b5af58e5a2b895ea8f1f258c22c487ccb9b60f4f3b0b8faa2683b599dab8a0758e032a0b1a27b303c2cccbf946765718486b0f91a3a05f2748a1381389f7a1c93db976489534d9d430bd40cb5de5edd1c41f810d574ea4473dd8035c9ac4c4ac0465e4ff1cbb12e00a404e9c202c95e209b099e09e1f300da44fbe65e0fe0030ac0cde4d88894577d30783e6783c37b70000b64654e2602ab93f6419f570f0f247e08bd9b3ab316cada8be884deb4ae610f024521a7bfc2f5a2f68173e4c5b4c9e5529fbd5455ff55d154efb4b4f58655be60618c6051ccf57bf66e2d7ec765bf5e77c429ec2e646fd819be596a5bba671d16fc885f2d091c93ef28c9899d1f0b211118b1446b49123b4994de48922afa57ab516af8870614e4dd2d009ed11ff0500cf1fddd311d0567a13538ff8724077286d40daf24c760332d8407125b072e9ac4935fa4717bf8b65d0679bebe07b2e1a729db6474b25858daa9bf029490ba9a11ea0b6e511d4009bb490b143b3fe0867d1ccae9e2a8e5fd4876fc2a9eafa7ba05abc1d22703fc23fb9c8388d23f008ba46c5a11f196079f905bf0c129385eed731ed0a863f1800946a1b46fe703828496f03f2ad702066a76955404efd7f872e95db358b4cb00854488a3b4dd2b15d27d8baf1a4560394f483c2c41c4bcd570b5c29c98757c3a1bda2233b70f27326f1e79186d6a608851fe8e37fd4be83f2574afeb079a92accf6d4e8c246310470d6cfc0fb14f8455083c4f286070fbd46b36209c1c96be81adca7f07914109a915b83f24391386de56e83c7d8db9990fca7096c13d8f98c916857ce69df49fcd92ae13434d820d1c0c65660254ce41cf374f403681452cb3f09809308fd51a0dc1b66e1780f6bb100c1008b7e7ea09ac59216ea69dd440f3d055185fedfa3db04abaa87d4c316af9c3a8519bcadb1a4b56255d5b8988f7b0caf5992953d2a5c8bb4b438724e28992487280f36bf78cbd16621c5acec4175dc5b59ffba15d51e3e8c161457d5b7228f7880c01428d00793791d35ff1100faaa55b30705a89b6dd2f5c39125868d5af434f490b81772c9f4f26a082abff5c48efa4b3ed4681ff5c2dae4e5244bb684958b658a940aeff5ca358f85c9cfd9fab9ff8b37af2adeb5d604a79e1e20edfe949103918906fc3334894982527d7732dbf9ff65237f9fbea84fcc1b078ad62a29da56024fcc32d9241ccf86497a381aa65b484e8d9e7a4ea8cbf88b0caa65a4829e8878fce0e86869b54b2d4dddc115abaa123e501102e8655dec510d81e2832b508698c2173baf79d6f9e146bcaa566695f7b6e7f63400d30ca013d796fd1780785859605a9068b9f86d73dfadd1bafe274b106fd271abb80bc401f7ad58d53d593618dc4acfa24d9f0793e6892916038cb9dd343c2d7f38d5e756f495018de2402a1304c135cccee45965ae5beed0ef0ac658666920ffe490a39acd5824abaa351309e1abfe3809c4cf5ee37bb28334b95907c68930a1d569d94de83afaaeb4c246f25a8009690f5d748d43a721e41fa1ac2fd88bf742bfdeed02a4cdd0052bf2e7b6bb7a0596d57c7da36adceb09d8766aea5a8faeefa5dd916d27932d447fc9a2fde0628d82bcbaaf54f36d3a8ade832d9443b1d893a7eefa2fdcd0ca97e7544c3c612242d2a5a5439058f0a231f7092660c0c990aa6d9640de43390582943aa1b4eb273eeaaf61ca937948952d9695fafa955352fa283c78bf1be3a2250f795cfce7499f7469e13e3a1d9f16a6ef960e2981cb3a62449566fefcc5286af059398ac506121e76b2e4a21883a17d640aca9fa24566cb2259085f394274185a1ffb83df4e89314bf9e13455cb9492eea8ccf7599e6d2ce71d2bc86bcb3d76f2c87db2d7d3c4323bde5a69e10a584ec0555a5d003adb5b62a54999c611b20421b2592e63503431438592088e0bf6d8a9f2c1ae41d705b060ef2e93256d02758371f506fadac02494cc3c09fa1ba933edc56891678762c2a2c28502fe228947e0f496aa636bae78165f1319a1936c4eb6d6b9fbe27aefc44b9a0eda99951d986e837f84859f833f8f599420ed724d643b4608f54a1f79b5b979dcb2aa4a04bc8faf00c23e525b5d678b83f5377ab056ecabbdc51bc1c36248cfc1c66fada1fe90da59f0ccbf8ae0ec531d6cb070c4f8d1ee23a0e4262efa24c4c188e23fc30c812ba5d38667e4c309f4086fd7d51ad9f06111397e9541d7cd8a970561eab1f81be036c21948ccca010d646e011460716e3868679277fae678e23ac043d20c0441cd465df36b69e670e5a9f9ecd3cd198de2611e41c8e645b8493d5e1f51be5b41c0e52a0e3061089149c20ac3078d4f2c66b3f0fa577a12b809daa26e77a5ed645ad4a4fe9c044c40fdd4fe74d5ead20dec6d87a1471175b5d3cf329f070730977f90f9073017134e9dcfbe57c3606812d84bf781a653997ce5c198ffe27b47c7f49c414fb875165710634f918ecc4792cc1dc0398a33983045bb6c88f7201ac6c093914b3625c2f15a5cb100b8e809e9464a62f3af86c3b99fbc9df3dacc15435291993e90bfa4463bbf3a06dfb33c24fc1d4a92a3331ada07ac219de4a7a16975023e80887410040ad6c361ecbbaca78b46efc5d508cd65334459a965eaadedd55a3ef34c14a619dc0fa3ffd126d9a905a44bfba53adb2d2df5dff5f814c8db92b00a1f106807efa4c3c5a0db207ea18aa4883e163c36d83f5c5166bbc615ca8630d7d432a0b395cdde492a6e0cedf4d3bd290552d73886446764eba030677f8535a268e8b005cfb0b3be6cecb4555d0ea0b18f149e97c5d139669c4a831321ccae86b9286e86f1ead07cda1bed7c36aa05909f42f6da2215eaccb35fff662fa829906ab6f5ab9bf514f079960f6fcca9599e49d4d466229417b3cdcc606c970eeb0e2fd29c99f15dbd80182c0de415ba73c343c8d95d5291bca3e4b574427725337d2a5d5778312670af038e858ac313ba93a864fbc0fadde6aa4e6b9ff233f03218324b8b673140d255ed6c5250434eb677e2942ad080a756d352567474e5146e2620ffd3e3e952a245b1e0eefcd7bb26cadb4e3750374d1e1a35987f72e6697ecd04df0bdc925790024e2d26e2583acda8ddecb2921bb20f8724aae6b7c20901da385e51d2adf5592f70bdf707649c2c60225ec58638f5cbd249439a0b650b1b30053ca0a54501e301ba75ad0021a20e0ba23140009107440edd64c77afe3cdc3f003805752b77afd89bce419a9780d3198a735cdd9711cd4ce4df108e3173377a087877ba66569ae8c3f86685adab0eb91adf480ccf0faf906e969c33aaa904731ba976e6358da21cf635750cd85859cae267e65d86dd7a371b8a39e2c4b9da4dd3548c45aefac13fcfca33a2ab22c9d454141871035ae138944a62156a836c97465fc5cb207b1dddc9671081365e095fd7c9d339ec58ae7ac930902bbb227840991bf0e9adc2164a520fcb7273f22249c60d59cfcd1b99fe7df5acbc704ff3ef551b0a6d5576fa320bf84a8bd7d94748839948c06d45c933544f371cd33f354efc4d2353b2872362bfb37acdd8482341cf7e3e283c966756bfd322a1567d465e21c4a43a384e2d4e3315e4ba1af549acf403da07309621cea154649dc9211b98d4c63a746a3311044a82e74761da7e1fb8213a879e617a552a81458ed3cd67c534725fc426bb8f041feb1e6be50e49df519eb485fa13cb5d2f2a3d3aca81672d6dd2181275c762014e74bc81bf0e1fa62aeede47242f7e10be7ebd367802f27679c8bc0b1f45f41e5e27943375f7a142a135eef8118ef95323b8aa442f5beefc937ae4d7ebe5732573dafc994f4368a0ceee59821c2800ee8df2f1740787ba96fa84767e03564a208bd82bb286037144f3b6267556cb5fb7368c3b5c20d0ad433cc80d8a41603a3e8734b100166f985dd17ea6d55683fa5cbfeb5c036e08b3b73a09d0f1a5cdc7bd03cffc6288429c341f9422486c3db4d6821c2624c82bd2f965a0e12309453a058186cc5eb2a02fb9923828d7e9d84b0f392660e2c83981c7e2ffee732ce923830f058c0e40299b4855ac1c579c3cd2a5659ba54e3c410cfdca66c40110a759ee4871690134807b94ac4eb7914eaf356dcd317c5b4686b764018f90c8f45414237d42f2c5868bb073a8c2ca0aeb6cfd20882338ddf1667f93093d2a7b7a445c688feea7fe06d0579d4fbc09f5662ee29a59403465ec0a1215254330c5b1aa1855a828e57588b5816bb488c983292fa34feb3d9612f098b1f3738ece2614a49eede9c79b8acb0eb2304a7d6a7d463ddafbd2d728aa6d909345c668edd93df0f0bfc0b49f9b0df7cad516cd8e83625543789da0f1c8fe7b07338a6f9a277f1d17c12432574f451f3229f9e5f1b6580993f2db4301e94982725de008d900ab9ac603c090af2118c5726d259366bf245bf1105a885e5532505015e6473f4d20cd0a629e5e7ffeeb458954910289ce486a0c28c5bff339e3c059d6c6aca229ce4a984f0fb3b8bc1792bf20441acfb049f0f3a71bf78390d9597733db416ed9de0bd3a339a1475dfadd2a5408e894359bb4b0f5dd9d2646a0ec04bd9d66211383ee0a88a733811eb145a71159dec3023c7e5037a756fca772877494ee48d16a500fd0c159c7c604bbd75ca454cfe2977d878a95d24eeea57878e9850d9fde8daadd74c83a847ae7a3093dbb2b85c6a8414f47b84d09dad5856441dd6d784627097ff7f698555db719a750a3665dca000c6da1b2c400074c82ba66b24c4df37b962b1ce313065a874c1a0edf2ea0432ec8d705de0d2d7d89aee0f780ce3262ebf8c63f0f3a1f11f34b95618fdc710cda589f41e5b8979cd4aa015d80d440369643cc669b3b5711c4881bd5e3ec5db6bd18aa2b8c785ca7627f1d899ad6b4d5f97b33ed4c90f3cb4d6ae3a180c60dfa38b32d1d00afadfa1b9879c185094354cf01e74f300341e3f29601719cdc793cb41e0b98c980ad0f28003a3608c3848ec9739cd372e93046b9c82f3901df5cbf218d1d370bee8d709338f59dc17bc2d118603a37e593be55746f28cd288ebabbecffa6036fb04ecfe4b089dacbdc8f9c505963fe1547049905338a7f696b5b5823ada674b025456fbd26c1263155ecc36ba52701d92e16831e0fcdfc1c18b66bc6abd2f12ab76fe8538133301715d2aca729fb9e8dd9d7a8d78bef2509178d381740a609e53e57e0f950c0271841c2d84e0f1291ec56195a1408e24870528b2e7ffb045f2d6194a45dee1a5fd2224990059e47dd74eddf46828951dac4ad7e458021dfe516633ae4ba0c339493ddfc833c4251b0c53c143d615512ab5d07efbbf419fcb4571b82f3ff1ecb87c281b6c3d88f8d2768b252f4148efc0aa16262fef048d5ab4d748e699bd82194a85cc53b722110ddc5afec73bd22d10c9a291aa2abe55d33e896906909d650092a20e404c1d80601600e3bae1ed8be5142719c149a3a1b19aafacaf71ca20e5b6b89b1a8d41f05d4cdf2631ce0da5e06589ddb7e6e5b0dfcb475872176e9f06b41b8f4df1780f70a62d2fcaf8bd2f9a4982d3f662b88d91e5172c5df37780b46be04f92778fab2a74cd5a8007f989001e85d80a83bd418e1a33a227671ae05062488f12ab1127dd035b3ae7dec2d3e5a9b605f5b3de7e3b1b096de0785b76b5f235966ce2620efadb9a7eef390f19367da1843d86bce53d4a0ab347ec9cfad019d7bb8c4f1a288f306d12e6ae31e6f0357370add460f6eb77bcd7bb24064a5793cd77d34bad07296aadcc5e8603c1472baffda450f743620543d793fcc390d608f28bdc15d74a9c1cea169661c3f8debff85b39901784c03160e8059bb4ed951c9f028d88ed6c03c8e802fc9661c057eaf651c3a85ea9cf527b81fd341cd5e123174016c733d23a62bb2fbdc7a5983a3a810188f073888f1be781baa164d66abf6446c9802a8e4ca4ae5486be721ad940255c0c375538dc7d4b74406941a60e88e55803500618354201d71854c706b72dc561970de48b3cfc9c50ec82cea6bc60f0ea2a93fa1e142f545105e9caa07036eac23f47d25db03fb5485d9f950268ed143c037ecc3349a0747a921c53996924a400cc426062ed4bb0b86dc6c37047cbd037ed79a56fd482b02520679bb234eda98d21aca843d26e89b1205bd37434ff634624f79b008322206880e879817f2081e8475865ce4fce6c6799d62568ea2b2560acb918ce51b486631bcd4f4d5934e92f442c4d6d999582168409b96b06d26e954d6c60d6e37c3883918f8774b38826a9cddc84973f0e9346002ffeea782f72727d4b1667ed8a1bc67bf215e73b7d53cabd22009aae6898408d83ac5be9d92adad140f759a4689960e62e4eab29bb0a124851bbb9084d8ae85e50d3641b84886f3d6eeb802a6a9d77523fda049dd4d302fd3fa6082f92f39044f42e98034e37f9f1ef90c7c2a0bf56db5c36b6f176e796baef6811941cd798097bdad06ab51eeab5e6ed5cddd040be0ad9eb86897906823b7e459f2b201421b3a86b0b94cb96685bfa5dbbdb7d3eef15a217cfecd01f015966130b7284b9841bb339741101326af71214d824e6bd10f4263dde08912c139dd8f70c3d53129e46b4e9ebbd31b100b028aaa913f37518eb40fadde557d03969b1d79114e70c6c591b7d2fbdbd16d7a6b678fbb1ff1687bd66ee1598f7bac43e4ac6db4aec358a394d4bd57264b664909e0f5030052165d0bac0a6a1ced0a03c53d3eda328dbbe21ee6cd732348f3153b5fb4f5b7db9dcea5e48d8bba1740c8a1e80c6ba54ee4a16926893ffc9e6b20c4c44853a7ffc335f20370162cedb5c57c28076eec0811d32821c7e42e95d89002f0041b4214c119b63ea642ac09edf603497ca28558cb364091a053992013346dd21942b68fc76f11d496b953e07c0166b887b46d1c00fe8428d053a3c36c27dbe52a850acdfce8a29104bfac652c370615e6a0abbfffa86dbb707e4c9b7fc9f5d21d78c6b3d713f7b31d4e0ca43c353c6e8626bb6e03591b7020edc2b12cab88bc87791fd6aea8cb0f95c3aa37250f3888ee589c4b01ebc779540cb1d8b180eb2124d36bc2bd83dd0e33d0cf7c7019d4a1edf32c47c2d5889ef63c7636dd07075127b773d08a56a06f4887a30fabc0787ef4912c40719ca5e7d105b7d38e369356343d6a20500dd5423620a0825aea1c5661d26c6521ad2175813d233a417cf0e62d3759e28e5ec89370972368bdfbe730e289761cdb81abb39cae54766238d5ad7b63867c92c0ea932c5fa9ac90103fb49c588d5b38341276d101ba438f68cd436c276e883dadfd063bd1d632d75c343de874b6c780b0aea83f11004f76eb42440448dc2b1b2dfd0eb7349223359dc51b756f83dbba61922f36204b293158d9616e0c04ec9147fa9a187ba0c6a5db8bb6e0996179df45c256c3230d87df633ded1b20a6543983fbeb65cf750833459a598309f2ce7ad2c44f42758af947ad460c149caf62218a8ace34dc894579b74d9d70f3bfc7beefa22e4497db7b6a2d2d336ba5ee464b62c7e3ee757f238a61416746f82b53a08ed37e3279ddaccc38808e54d0f8edcd75f8bc2c2f5dfae2e473c691df3ee00d6a2bb99c61fb959ee5e9f5475f7a2251b18bf06090a44e8efe8794f6e2a6edfdb2455bebed71d386de7beb31d8e74d02a1b0c8b49c7fa4d737aab68b5129c4e888664d79a34c366b92c339019ff1cb87a333ce6604250ab8c374b23883968e5024882261f5d1dbd258f90aba1bbc20cb7e0922239ced08ab285191c91e43ee286efd1cf9caf39fdb64394fedd0dbe42a5ca2ed29a2d80767e9054e608dae5e3685c7dead1403dd1af5e4dc27a01ec0b41a3516e0b52ad8e439259df1fdb446f2c6a148f5ea8af84b4345ae0dfd20fd3f472123cf7818b33718ac1861df079aa209d7facb5960847568000655de20b4859dc1c3d10fd14c209a9c91c4119f69ebee13979f26ff073ad78ee03b1c48a9308de950a3778d0cb22f998aab5f136b972c78821543e7a1c588bbacd547c03512955d7a32202e132debc2eb1af510add9223ac71271ed25f38a7b3264a09dde51312fc80dfcd83aed9c6c42b8142b6a59162551fa163a45b53a231464ff7bac44d8a89249f4209406a41c9aee1a47552a03f81b2874b98dd1dd83b4d2782b48d01323483dc9992c6b1cee4d28a5e56d45b1f4dad0fb7d88de7309978047263ec495ef529c8b30002d67780160db6e0c2013de6342e2df3ffe3024f48b7ddb2e985630ecf7a87be029e4388e939b9555c99fcff31cd81c4223ea2af341aea2eb988e90f448f0686c0a97b26b33a3c934ca46b3494fdb265bad6aa8d2af2fd2a3f48d6a6dad07ad72dc5c6822706c3126dad9a09de498f2336bd767aede98dc5139db4a295718a10119a00d93b18903e233b55c2a2912302d92fd9b01caba86b7139d84faf9bb6e9ccd7642475f5d2790f43de3b6c109e16b2deeedc575bd08b130dcd57c2339cc0713648ebd75df7d1bc6c7ea7a89d079f187b43b3dbb2265181c79e82e3dcdf978851faf0a286a528f6fbc0b2faa0aeff84f69b3ffca013482b9766299ac5b4d608e1d968edea7a91953efaa5d13a5d2eedf18abe533286d2b421a3e1ba6e8dc36e8b40a3f2cde5d851b1ee01f1a2a58d8873da5864718ec7e3a11c313a3840f2bbcd81a19e875cfefa9af1c7b9226f42204d4e817cbeb4a3ac84408ce75b6bf58947b0bf66b4dd2202c10c10a922a6cc5c9f7f07475910328bf46c4bba35ec43ff2cf13949fb386b23b56d5254b25588456899d1101b87801d632b32c6f71c2119057140594aad1d7f29537b3b7dd083d16edb836716c7ef658873d9680f73cc6c3cb54bac6507f0f8d11e44be2eda7e4d25a6157e1ffb8fe8018a45bde9f5085f5fe74a9ddc069a64709531e611700bbe337c4e0e673e5c80dabd5351098d6c053573f99aef98980f4c97a18639a96af74e55d4c135029ae9f407b9291690624b7b568e11b0847abe6444cb82d7d6f48dc6aeb5cc58cc40cca4c0e416d25a9c969278af3fcd4b07e87b027275b59ad66cdafef3309d433db1d5984cc1599e520b918af336ff22cffd47811d44660c335c90aca98232d81da2a2aa6ff939cb37797565fccde9610c5c4d235c295d4d0f96a950b5803a3094a6e5e0b1e52ca99488fff8a1744516148e5ef9aafa101c7b5e6d2845c1780a629aab2913c39a45ad9592281be886677dff3120bb095f5bc1c422551b1cd120f2987f629aaaa1210581488e5393c857b336bcdf85b8f0201e1931f87db0b1145863d4ffaba10ade6e87db8fce1b093454545f99d867588e0f811f8123836f55fa8945a98e9e47dc45a5b3d64c95f5494a4d70285a7df0287854c90ad9714dc03aad269978f19e11dd925712620e425012438133f08989a65ae0a286048051a6957b691dc5e51527be6d88e2d3627f8e89c562c61c94b97a7750bca706b614fb18e96d5d5690d2d9878395f024f2b1da610109179dbb0ab042a5046ada00637889ee3a071ecf1c9fa183e8b6145b34ddcbe765b8c441d334b2d7056ea6151c3f1d976d832ff196528b3315bace991f93dff3250545eb2799ada32dd44169072dafdb52d945c8e20652bfcac2fb22510c150194e3d39976e2b61cbb071187226f25ecd096e197349d03c6038aca181fcedcd219e0da3f7720b1b7e11124505c686b28c926b51159dba3c10b849df7bbd8f8dde4907cbca265e02a0db39f3121e0289e932d62edcb217b8f0dc205ac60d448d5943a26754a1f7750c40adb89b8281c3082718db70936056004142388f4f9b814c3210021abf41aafef7826149f3b3c3f5b92ef65c28f31cb47949da41cfb2ae702d3511bd42fba1af97f61cee4bac049043f82cf1e8b2b3925cd56f14b8faa741325a4ed3d767bfbec55c335b11eea8f44a0a1ca5539d60fdc3b5c73e3613d21ec382dda41df861ca740ad2f01c133313d86e304043e4be7081d9956d9837d00f04c656ac2ba8a5d3a680b6617d840b0eadf526ce74430f9fb07650cd9b84604c2fb3fb32554c8490778663b1c91f753c0bfa1ef436f97eec4765de1e1bf6b1cd36b39adfca349c7a59a39356e8c6ed0e6a2091ba7992b590d047b0ac18c1f684f9e01e1b96382e8437bc4380b588ec13f67eaa602214b772c57c29c58c3e2de3dc1beea76c04ce3957adc53f91bb626fd61a1471ebc14c33f223b5cc7a39458dca342086632acd27bbcf3250ed85a13ab4e6989afc0a0adc2647a564649927e9482c874ca897cc22d0e09218b32b6d2eb35966d2e02b4067fa528da2c5376f59a9a54467e86d0ed95cf36df2214cc582febdfc888713c13123ee8d6384ab449a61323538a717e823a06180aa380a41d0bfecbe4103c79014df6b99d04955afe98375a8b80c303365137b5861c1a7b56d7b04f2396d773b34e667612ceaaae41b42311837beac591b73f13866e0f4ac056c7555d753705f4f3cf4523875c1594f3e97dfb17af0cf7071a8d9aec965df6abed593625320cd8c30bb8e6e05309870313435bf5db1453307c34e7cdf1a3823a150808f89655504aac6e877281250b217763f03c174e0afe60a8ce29197aeaa0f3e266c02a9aca63a0d24a94eef6f0d3974043b42a082a0f03eea69957e53b593174dc5e68b0ce6fb92443f5199f7b10c2134bed58041bc00e9d8019e4bafcda9d2f94706a33c49096a5a9ab76d3397b36b344a090a4501eaef63342f60f9d9f9c57581b05eb81fb80e9bad6cafe764a500af87e6d46b2be28cb464cbad2b5e8a818c68c6960898c6187c73e7a5795189529fd6058f250802b5d03d8f40e495c679a7c0b72940833006bb0f57894c720d230535fe1eea0dd166a3800e0b08b108d0b571298408320e45d1ad46e0bb4c0c2fec3410f6229ae60822cabf5822134173ebbe01d43711cdd94d1f976d1125caa08b403699a667b7385d429dba9192c7fe1918a66ea71f289a71bd0ce11f5a0ae44d5d77dcea8e61587e2707d22358ba0cf037b5da903b4d6b72a2d952c32d927ae8c859c24a7629537f1e2f5f5dba5044e359d33315b965f0089d4dc2fe33bc7d9a191e0e647facb4ffc68bd41891ef07a797fdecd15f56a7d9bc231db708efb884f276a39b7809517f46731f4fda1bb99d2a1c7e8ac31cbe8b57905044848854ae5c485eab372e6d9c0330541455c6af43909c33be42397244f1395d150dd5fb4df3b5da2db1183b2350990862ae640c919135a7aba364a624268d223f4350f1c9f23e28195970f3259d54808aef945e7a7861ae10434b79b24c712a577bc79ebb3f4ecebdc1f424c20d594b0e20033abe3fb9513ef669cbe2f855537cba7e200ce8bfb01e80fe73a2f81fadc6cc17e7c2e3e34aa4dd21cb8db7728fa811a789a66348dd0e91c670f2471911422e25bcae143247cb57133e7f1ea5e88ac251a02dd6201489170117fc4cababdbdf565fdaa29e37f3471835d1d63109f188daa291bfb67638f977c1f932b503d2a475020284233e6ec1de19e0cfbfe28f96ec468628d3f69d640ef0faa1518448f58d3e47d69c0267fcc9ce16974d283cc3126b055133345c2d53a064e9223a2ed2f9d9f4b02f79a698d9659f3e3ffd95862fcbfe0dfe9e831cd3e6c84c05344f0de61e340ca088be178e61099dd613544bac2410195c4c913c45418c17d965f15a79b7450c80fa599b193fed09731eeebc7b9c5ed3e23859ef2a1731ff95e2964ca07fefc455c69046d3cffc518a9657696684a301957302e4223aede12849f95428f7cb4983eb1cc0113857cc2b13743f098b3d9436ab2431f24b9e6e770d3be2c61c23ea8b39310621df40d358906c7ecf422453a0f2a2fe387f8e8a2b9c70f1de09afcccb47227872fd1894a806f5d9d746914303cf3e44ec5ad6239121d3a2fa4ea729f1dbd6d71863cfc10438914e810759814248f3b986c25ca028d7d2375a426023a9eb723c3a5c74cd13006919af25c0ccc16b83b81a84ca77c7e52f2b667586433d0058353caa96e9a7a88fe192e87eda55cab6b63d005385806a5228d5613f60333d701bc2c470b849757b8288456bcf0bb240a6b7890278c0597e14518ea87324234cecbdc5e923f110341b2b882bbae8fa76b40f6c0e739bb4b932727010fd1557da42715f8ac675bed53ad0fee2394f6508ce212bb277c6dab145dd133f096552f27ebd0ec4a00f92b2cc6e17bf15abaa4462ad0ae9dabd0aed68242577042ef9282bbfb93a3b904c75ed5b8d72c9891829b6dbb7f85da822bac8fd8b04dcce98861672dcf56b1dd7fce72f32c5a90bbb52aac0783ab2baf6c549e87b1cbc536c3f4847fd05e304289078ab441cf0010480bfc1a7a55f325f4339d7c365f286cf59b2d073c413200156d8675efd573b895984d2f61089e712fcc574685746a2440a6133c862b864d030f51238dd8993118ec05887c969cde836c8e7c600d34b2cd867b8348fa60b4204ac52ba08fa0aad244598eceb0723f91cd96f939f9e8e310635d7ef7195bb5f8872e1f8ce28aaa95a86cdd510256320601e905f51448cd0071eae46841d5cee62de3a2a85c4db7102eb008b99cab74b1ca9d362de4d2f924c5b9b58c10b07c3d044a4983b7f154fc473a863a081214c7a4e548b2a8993400364241ba378bf47ea3a56d09aabfcf354bb0a1fb41864700f32ac90d387197a606fd8e73abb03babbf3560eaab714cbd7919f4c90deb992be16c0e4e05e6efaa7882f5609ab5f130374e0040d1a9724cbdc8f16878649e4d7bb613bf1d8bbeca41d4c7e66a188b8df5b1a5895ca482433d0a9558052e509e99951dee01372c8ee6980f8538e8ef5ee823e4902e88ca9acc438221a74bd0bd0fea3d80f3f387f2ee0c5e1ee029b055e2b8a0c33bf7b6c4a113e75da56ea01e5d97ea333a0ee5e1a19f82e7acb18bf5ad4cb5055c61e0d47dd861e3fa56f72513dd99c1bc14f32a32af6b8ff2e46db726027be4632980c7781bb32ce064f5fd295ab6261a63679406ead716325e0ad0e851e321f1fb489e1dcb0236aec39810a550dfe0e95690649d5badabf701cbce1e1db6841a7de7fd7b27aae69731973d8a56a91d576a2cc2e687f25f9d35fcc369aa82517790fb06f77be1a9149d472e5e3fb8197b7e590199b6ad74979a5a9ef6a2f2a6586d3f74e43da3f55affa4e3cafb98f06f5e3200a3ccafe324937bacec4fc6a91c1700f4802d30d8605d810eb5f4cfbae4708c18b719a6154d9d45d3816aa8e4a40d7dc5b2f54588c03fbdb78a7ec128f1e92e4535d361d787f791c314ca21a2fa22f2702b5c5d4edda79722258a97603379e1a34bb20ca71c6ee9065174747c19480e5860099905b3b6bf29042129a1a1122cf46c95c2329dfe396e75685dc49060088e9534036c533bf8093d2da7c86a03aca32734864002f38aa7a6b011a7fd88543679d910a57f5d8827bff858b45290b116b72f86d014036dbfedfaf9685c1051a4adf67f2246782301907471bbd6bf8af7c3833cfeeaf4ffe053ff0b2abfb92867c99067e2905b834464f9299dbb7f94f3235306a9f26a0056aadfcd152ee26a312452f800b1411397fa938266f4f1336f1a2f855d22dae4f74f28efe520433110bd0c23445b4ea07ef376d9d045000a668094a76eef4c9066fb8097871985ce509046abd309b14eb9d07c2d139f787640608c4890b977124177d0fee2d5c995f27d0bc8226af2b276cbe32929b9632fe30f94a6f0f5fc4e134646c405f7514eb14261e841382a56b08790839fde089219e7f90a7faf82e0fca4d5fd355c98a168b0541d260242d020c361e8ad0cb589c2714636404038405109dc25c510df9eb0fc1b852ef3c2f2261a5953c84f69021b1d8540f0bc3612a61a9f9a2aa50782eb765b2dc04b69235ff68cc67a7f28d021045651c81d592cef06b13476feb563137881db25ea5959e8ab5cdb40df4f37307c322bbe7e9303a6b3dce578810f7183713eff9ac5538bbe861b8b43c1f5b23b201bfebd1ad9feb0619fa128eb5a146eafed14f40d2e6419207bb727814938cb8ff10a93b3aad883459111be50174bd0bed4e6c58de16c6afccb5bb2278c7b53443ce7d660efdd922df536a69f49bb540539664ce0c05613951606881cc8e40e33f386c00f5b38d5ee24b87f766724421c5353ae7b6dcb5d3c8faa58b9200b5fea8009fa1206e82881e290aecdb8a3ed42d7e78048450d5fe6b322cf97af05f42f244ac1bc1c65bbb212594f0d6e5e9d67228ede8cb4391a5568c59bbd56aee8416e1625d86da6324933a276aaf032626b11e67ed7e58840b202783ba612293e417b50fa88b76f26648b606235bbc591cda282040953261883abd9a20d7096bb01ab3500f2050a882104dcf97fa10830118a37af6c07c75ca55c50c962bb21f284bbb8aea0aecd5bc40a04312ebf5f2cf7727a26f07565bc20bf38a7c535e7e29bc5668a778bc5d74fe05d4d3f62c28719397a27e75c2a15090df4580eba0820eb3c43ce46073206d7511ead64cc74a61398a96575daee396924472874fe2f1832be05e7bf580f677d6d3dcd2a600fabad5d612664f88dac6f59edda499aa3e990cf96d05de653fdce441e3e15335f4f03bfe222902707c5b0b9227524b309844408cf09aea5776eeedf7dc2455b70562af3451eb116f5cea46e1114eab67142203e93940f137727183f68521bdb546d8e09f951d52652096431d199e09295d1180039898a85cbb45303c2eb0d2b2475ad31d4704144d9f948b5e5610bfc18d92b3b67cd0a22166c6de31350f45e51595a2777c3a9ceeadd72b006851e15af9ea05f53065bdb500e5420e9a183d6514d66909508efcffb72ae0d0ebfe5b3eea6f87cdbda4a0ca9c00e1577af2d9e0a31ac06e2c313d3c79b94374c5304a83cc6ba0f27e12aa0ed8f07c1e472f6bd2ded9921fbf5dfd8294d4b019b2dd4afc642b1bad613042735208a0e4891d2b58a384c46499cf4fa6e497064aec64d324b0484f782238fb4a8f45273e159280e7506b39b533d3f1ab7d118b5ace09460df3cdfb012e12ea83848f68f8b31f08b19a877db79db23181ba0cb8579cc47902504d020961241164e2497e61dd3c7f5d5c890ad23d2b5344c745ab0bc7d2198e20721bb3735e4e64c8fa37b5dd0339edfa9c1069500b69e9b910c899c5adb650130846e30b1f7ff6cb97373516f84646bf4de43f16a8146288c65bae471468671f30cf16885e2f8ca796948e8270cfbc1a39b2c3d637303957b0a87554c0fe84127833ebddef1d5a764609e59bc390c784d1df7ff9558a6ceeed131ae0bdd4417e55804b989c42bc2996d703b8166e52808f9b485dcdde8313fb7515002b51e17224764986ee3e67c62bae2fda5416a438414510a11b7ec20cf6041e165665a79f54520354cc7c06e51420f2679d1ee206e2a5f653c8617f4bb029057e4137bbbc4fecded7c763052ce45ab4f34c476acdc0c9a18a6c5a02e8cafb8c9138006a43891748eddfb498d3850468cfaaa2c9857f35b4426e009f5821cf1bf6899c34d8026ec994e74a05d369d8a0651e61529435c680e7059ab9b5c7329cb3d0b3f2e8676c49192c1e51d13af68409df26f6dc881de11df5db93d3759aa9aae4ebf42a74fa792aaad1dc82c3f05681a6fcd25e82dd446eb2ff82e4ca6728ecdd6d979a2904a39f45a645d6205a14d2ca26ca98abef356cfd1737ac34e9422925d761e6bd1c971eedc89e7bc9c00e29df62bbf837673f2138de4956a789cbe790570cf6385d926784dff6fa7ec93fd44b5d8a87c245e1a3d3d5ac610e6c9a4f57342aaa7b1acbf33138c68b1f53f2f8b59c3ee7643e114755be2e1bb097d28e46e5cff1aa469305eba6b06f16fe5689e389921e82b21790d0f3e85a66a92a987ac58d3d9058cc459c332ad2525191a1dc122df6d073b3dbe269154cb4b12d55a64abf0da3cf58e3fd21a115226fceb66bd562214230422b1f6622548b388bf483f3d738518ef213f803c4aec65ce3ac26f51b53d08374da717a695206ab068955e6c148dbeae0bc7a5a9a4bad20daaa2afe0adb78c73f227d432eec9d68d1e19df6abcffc5f9c3beba50f908ebbcda22633eb1b8e800b299e0fd935d4835daab453d03903ac482c572401ce1df2c1de1e40aa9c4a95a188406807c2257c73303551f5ce56572b29bca3678acd17c412ec76389a7acdba592577d28bacc5534aa6383ed4af1396a4a6febc88f9633958bed26457ad4e6c03d45d14557837303aaa7f536602f8d782045ea847c22cde0680ad76dfbc0d1b7d0eae57aa833236060f81cb0bc0fddc1e42a8c085d54e58aac389291e78e9323e74c90b3d00279c2db37e98d2d133331e372df08720cf3864ddc2626f0bcd67ed650e4ef5142221b22e3d6dac20928f01b2821ab4502c14d08a7546eb11efc91363e12df6a458c4102ca2a8aad52a3cbacee53e33b1d03887f2a6a945117d5de87961aa1af06a31044303392171585f5c13a3c9d8a0a450f00393e310315424c42588faac731b6f0632ff6c55866a0c3f4eae2b137db708ff14bdfa29e24a02cf3c6a02336ac9dc47ff3498b5a0a910f24799280530a0509a3c2a43edb49f38c22fd62dffa8514a2135473fe4fcaa69a0af5db79a2eefe728335e6374c870841a42840d12b66122c191373d1e310e9ca9d889d4a33dd4ddd797fdd174fe485c45d13199afca8f1e9cfba7c3db2b9dea87558ec828f10fb0e015052a2ea607652f52e4fa0e9d022e03edadc07886634b58a3979d9492248deb42b5a078239030d7b2eb1bf0d2d8a8362ac68d3a9910defa4daf44b27dc28546001f018b31e43af60d7293d4f6095777853377a9ee5f6de2db4be641583c394412995ea8a0d730cc2df1401841071fe4184970dd1cfc3cf4d8ce8425e3e905e3f1bfbf965c2dcaadad501b1a5f85683143b39a3e1fbcc2d67fec8c448487864bd1fe61e16d13097de830b532c4be391a1b5cccadeae91bb91c1985fa8a74469d797f1ec7e5bff8f38740e6905a1aebab903ad94ada767575291b4f80a0af291a70ecf7676ea2c744a81fc84f331bc1e2496f1cebdd9485ba3efedd3a4822057efde3741638b9d8fe8689fe0d61e830162e249267dc00bbe9fdf51048562b9b493eaa35ba6f36492787dbd341813d726c4c6d0cf6aeb413943b66ab96eec4a3204fcc785d390457c5427bd6d208e6d6f7773d57598d88765498fa2e29b4ea6b903e5c3f901d95053476c9c2c73e2ebd513696a0e121969fbc9a88f6fe1cf9b4fbf3fac2e25f5dad74fb7363d1704d29b553af14fdd0da2ee28981b05ba0dd5ff0f745c1443633ae2763de1393d80cb8922d4c62a18e211182a63f1fb18004d80c5190536ef0e012a1a4dc6c0f9e1b4f3daf4b828d81048096197bdc5054fb9884ae957bc4fa7d9880dec6a67c62dbb2c8e54d7b66797d21b95db0a4860cd78f2c4294c58de08ef7509e5f5971615c24760a4b05f4e01fee603ad70476150c980ec011280d440213a5772e57e23e16b7924cd6f7ea0ffa32c324740e8bec82dfb3f7bc0c9591c230c0466a4d46312208f2ebae72888131dc41045165e551f0257f50cb58e78ee88b6dc760f18766c44f506426a557db554d083b4ba690fc721112d763c5060f4ce67e83d79cf6b807baec0dd03675664996f06341431845d9487ce25cc5f6ee0dc7cc1b877d231b500542c8049194475b4f251feed4b931681ed08a2110e0c8a84524c97a15d05b26338b98a07fbc2477d0c639161ba3f3d006aa8f6098d8aaece65268b45695e95edc182b2bf48a3f7f3a290c13e7bad8388f5552476b3df3ae9dc90c122e51aec5325d82f21cb6ab1fb465b18db5d7b613c443287d0a698ef906f9d34820a6711ceb97a8cdaf1819698c042b1f15e3cface713045663b291ad2fab56badae7a279bc8326434915231e5ccb8c857b5c9951cb5554a897c01807a3820734c74f3e153cb1d0cb4d67c19400a0f703bcf69fb31532fcdda35040c230f511db47b3f6876e94a8ebf872366cc6a644e937c362ce37b10359b5bbb1fcaf1edf8f4e1db7db0b16dce99431fcad326645f3fe1e1cd1cadcc8a865fcffc2254a348afbae9e6f44b5f3d90dbf801dd019b5d36ce837f0d8641b976191000588fdf7e60e890e4706f189216afbc677b4476015a9e5101de4416ee4d02aa182030ebb423990dd9ee90073e8dc0f2b1d7614b4e68b0f66c59abd347d0fc6ce53fb8f3e8d3af0ba71e240f627ac13b01bc29ca65ec85148c594f0e608389aee8db6501147785b07efdb78612bd9c9fa3ca4d507e32531935a40bd9e9ab44a6dd3842f63d9d56e302b974ea9ea540833cc19aaa23244f63d80818b69f1740146215a1e0ad37cc80b6c83ca46aa7a556644dcbecd9a43bc339e5a08738743e94ea24c4721ff08ed185eeb3104be52d91c43c2b2dcde8eed013c44ce6d33e36b25a4cb1d1e845e0086d009ce74d4eddf0f709ce66b6cdd4a53402d2e433bbbd7958f85c222c70f539d13c40525e6e1bf1f43dd6a501c85846de54a887d97f20e7850eed782bf80c8fece80a4d28a8a7c3866d799af3c1228c4be797c3d92e7b2c982978bd17364980bca342cc38b336c1088d1824d26c14a97a7ca2db48f2083ba2e8b4e94d3f77646bbd867959b50650e4d1f0d5d7db20e61739e35fd44bd30a6709f6c8c0ac14539f604bc75d8ceb1eb798f0a31d3df26213dcaa11077a1a23d833154c79bee64af36d0602d476efe5fb1fbbb89491e96c4840090a2ce4d3546ef2a651ff10132ca8809565bdc3243f9e0567b8c965620bee192a48b5d10140f8b7ff6c692a9f28344113971cbf582d613be74304479e36c529c21929f25b4a83e444c52953ec8b2ea0e9eb4d97a7623f4320899501c06869582c49a9b4f228a21a096324f914985948b0c1261caddebd6dc4458a22ceca58f0da9fcee03611aaf85611ba17414b08e4013eaa203eb2c932463c13f07aaca4725c00b422adaad3a60cbe1f9fc9112e7fc2746b9b0bdc31b371937b04828de35eb36c0e142c471215a0d1a544701d7d2418ac807c25735bb5fcdc4d8ceb32e41f63f3d9b394a2664115dd8d163bec1aa4c75f0b2f2544bba41f11a20b40927113f7a81fa48a3e0b2beac5c60da28864be6958539f3048e9b80a50fd687d944225d77bbf1a26492a8e22f356aa2bb3cbbdb797a46def6f814aa16a9409aad0d9bfb100962514bd7e68eaa142528cc7c7500f2e5cd50f40be8ac1ba7e186c37d5a8e5479b185320764e95f8ec1a2ecefb37de23cb014675cd49d467b8a252dab6548f3d23f2e04380e72e3fabe7be2b785b9c35febad4fa396305a123968113bfba97da6c8a6ee6a742573d1ea0d283a22ebd4904a8ddaa657d4a7ce0a47744b8c614a48aed722ed23b848f475a04886861dda79cbfad6393359052d778667ba12a2da1d98bf367765e3966f783e85b22d78fade4aa22241bf88d0cfae304b23584365de036314b473116af23e8b7a1d42a24bb13427d9bed4046aca89c7330e41a6c2af022cce0f0b9d6cca1022b5cac710ca2e71315fd52829ca3ea8b26c866b981ec8c0497d1e817cdfed82067e33b1ebdbfeea7b0cc7021808af13e137e9a2f55af9640e3948c3480614282d2e5c6d786b674cc801ae95d094a98a15d700172e2211334808998a1d9338ce623dc16e248b623345785279bc5b376824b75c08eef22091a7ff5aeff415ed0d6c9ca08688af95e13eeaaed2233a78ef3c1c804299f72af9f0d0201390dfa3f6b1f18f5ed67f45de36348240f10a52841d5865c7c95d5a9ff7521fbc0accd358c675930a51309e63f680252c33c172cee1643771d7cb736fbc24e5c5cb52723020261d7df87d58600276f1dd6545d813b0b1b8884000198d8bf1073c578427c04c727f1748200f561eb5c092c27ddd70cf7bdeb6a943d9c71196d0cb81a5d91a36a1e8d40646415ff9130198cf401ac3efdfa06094ada3afe9ae9fb1eee364ea99f9e4362540a18fadf70415f2068176e88cbbe378bfda002be1af46c6f4d71ab2663fc33fa9f54556877f6d9363cfa81888cb4490a9243baaa5bbb0b860aa03826283517ccfac5e8290cd5925c4577ba61f8232418b526b2e4f85030f2b4af82079225376c0600cf11f5c1a442ebc8da83d61b14118792811b4d20c8181f84174d8c5c6d87a0a529366b8cf91380d60a4a93db1ec14ac688b011b34560b4cf15402479834b020b34197eec11c352e19c20317b33ae196f419bedf58199595dde53765e8645028b6496956bff783f72160f473ce156ccf8d61a851f2d1b82ce904f83835d1166d4ad97ad694f3a2ec4f48f17733182f34c4064b0c8f631ec996e803ce86aeddd29924096905e0566db0895894db84e04bafeba72d0a498497a2e151ecbdbf6a33a462c06f26bdacf0b944a5a090362180ca37672e40767bf3d87d2a31e91cfdfef6634c281bd71f223e4166ac39327dd5cf196ee7e4044d705cb2339bd778ab1da0aabb3f16b8910e7c222ceb3f1105689de327d07799d2dfa029d283da17398bc872a1188c53ac5eb8dd303b70d66a01aee73e0842a9999c3e93f9c50c422a48ad3a8f03201579ef61f6888613a10583f300bf54827c2fe4ee968faf8690d71cd135c9a389486cd2e6189debe2e46e074484fdf8be9934c1f9f23ecc32289687886044e1b8fb09018a2631442a945c4170d6f69fdecf320a8790a90b6235549e68cc6113e6690609db9f5c1bbc8593084c5352cfe72eef8336aa633f2558397abf2980723b5a37cf9cfef64b7739d7eac45c0f76d666439c3f1cc352757d74ed8e817161e0bbf78ba9df3ac968790d5335ecae7d4f117c71ea5cfacd468bd36178206ff8e0ab572700e1cbab84aabbd89c2b0bdc28274a2f78619c4dcb85b3e6108421b3a3650aea45a501394f537de252007f257a4952196e4046f3195193556b639428da1f4af0c63404f1d3ba5866240c843920b6a2fbcadffd2ba27ecda62feb1f7208212df5eabc41d1eaa4af39c5679899238053e35757b08fc236bd16776cf8fdc8aa548aab93c27848239f2d1598f16173a3c96b1f46e969c6d9cbdcd81ea58fca6e39fae3ccd15d913963b0930e5085fbdd92e8014c9caaaa2dcaf9210264376f4c725cc8bc9d4d64e643c8b0537b9e2903445a24938d7d0d8605f65dc1653ba9baf3f2af91e63cb8c44db6c2f5bd99bfd2d9ad98da03ba61cdede44001d1d402cc89717583edb40cac00a248cd8275a990aa3e4de01119bef59a593bdcc34903d8ae620ead7327570ba5f80539d45c93fd0a0b64af7fdec99f618657b90a83113a54c20b3f1f9a9a5aecc3767c995e73b2f4e386fe54169ba38894f6ef4b9cd4e583be351d5593c7689733aa7b0f1565e149cdc26c178ec7320cfea31a4c7a9af1b9063961d9c095548557fd186a52347d0d948e83db1d9457ba07e412a56e784b274311c1ee3b1037e35037da9d1af308434c9d3db10879fa6b2215e7f5320e2a79b84a8d4000ffd14e943c8408414fa36503f603522fb1bb91d4206b2b68e057f25771411d6952f9abe2997819543966d5d3983f2d6f463f9506ae01352bae193e37bb35b61c2871775c11d5535d80913ea2b6e913231963851a16cb3f0db4dc99875d9183718e9d00fcaa1971a519dcb195651b4626b600c46eb52dd0e28c42d78c9ae9d73ee202427bbb864c7431e24b9b08c8ffec74d264a010865bb433a149fb030f0d49ab543f0e63c756bda08e3de840a382a2796ab52549f8fdd1103589d48c9e12a744e546fedb5a2987952027a4746d88fb4110242faaf86c2604f415ce456131020a0714e1f97f77186cd782e09a9636e44524cdcba7b3cc3c148ba34c114456eb2acf88b4533af2f6b14d52b48ecd25a82e25ca3f5f8cf7c263329cc3cfc6baa47aaa838e58d0ab1938fbaff30ccac6049ee4561de7f6e161907fc28681ed01a21828561ff75e54090ca3fd2725cff1ab8ade691c8c80303514277ba6e9362b28b03a2158fded216ccceefc2a45a0a83aa394861f16d50441e8a1eaae103881b73813d2a857aeff9b1fdead84ea050c1547a558e8e62f2a640e9c63c319e6a7bc08f53597bf694e150b29389f1748d6573ec585aa7c2942627055f83497941847bb57fb156bcebabadb03a6cbc0662aafde036cd4f65db2ee300050d88958e53ac6dedaa0e6307dd558a5af9aa12f1163d72ae3fdb1206186dcc1a0bef5f805634481b4a3b574d3c1799e70a0d61e0c1dc89b121e661ae610b8a3b2cd8f48bc099ad9414d02209ba1662eb91d9249104369ec6ccfddf299f3f49b265e8c663172cb8bf78abb50b904980432c90c58713622730587d49de1beb2dc25f1253f2a4d3ebbc71b19e6f4faa9ccf65197891ef3435859a072e02b4f587f3c0edca080e4445bf6409c5f36b832441d9af37df0b9ce7670472969585a965a51d0c1584041cc6e69d9205a8c05fc7e31b07aaff55bdbd74918c7766b4a7d9e001e766d4899773cb0fecaa55b8e8a73435517763401539cbb55f5a4d3e264a10009c99b2be22d160aa313a2e7f22d6fbf0d3ceb061f4939435f38dc921027030173624c9c383439c091826707816b6b3610a2988d94223f971b0a891097cf5436d00419e8888fcfc04cec5d31ffe8f2d51203f247a5ca5da5e5744d148ea415238429076331e9994ae3101ba183034119f2d0f6f0f91b178cdd33d3074c660c04dd78d39cae9b1316a2275bbd1d27c38bc08df054bfbc1e7755c59c80446257255f98f624be04ce494f0f8d9b7eb384897592c786f19542ea6708b107b88ed19b9d6eeb75d427eb1b7fade13e223e623d599fe80fedfdd65957d5e86550e72c2648cd0560226b7302ca35eea8cf65f16bfc4ac31a88e40d72ee6af7302b68cbca47dc6c4f8a58e9f7611fa4f21a545f55452d3e2ffd4bacf1c3b5f790be0f672e0b90f363df84849af42143d81ff062f6a0e33fb59c9d778a55fad88f1e51ec4bd3373a955d95f6fd04df271819973437395057f47c7bc61c73098a2546911f650a8081c698b6f366e3d8058cd9b50cf04f186089ed1de656b0bd5da6ec402775e9d959f8004c41982de6542aa27a47658def9602f977d0726243bd750742bd27d83d85c628e0c750e7e4e685a3747528996956f1b4b8a996bbec81d9dfd5637b4bc5394cdb6b598bb6533266fe32f9b835327533314af6c7452bd782ff7c21640bbe240ce1543e52843cca719204489ee81602501ec5a8af7ca889713acec8deb02d8553bce9a6e57ed7918aa905175fc440a0b0b590aca3b824b1326d910f30ee90eb3f9a4136f8941b13a7719147300e458b6ff17ae370694f3662fb017c5dc46f0fbb11bf5b93072cc263aa142f7629560a6b42d91573cc9b751360ea20929d5db278165888018554a85d6544ab953fc3b976a5a61f5d261c021a6201b17fdc4f9c54b73c7f582af532403f4cdd210608e3a2f3d78d11be43528d53b81a95ecbef29154fa6bbe8f1d8658a33cda5f248fb5d3412ece32128ee48850fa7603e0eb778c3c28d4f7d6b3257319763d3c6f276b145703c082522647c88f0f789ac64f10c3572a9ffb16b148ed7ef5ac24320aa1db62c76c9194ae016a41586bd4bd40eb098a968408a145489839bf20b2d061464409af015794d5031926254463e82bc3004e86ec0fb20d853929b5fbdac89d9468cdad473c938a84df1024182fcbf3cc2464cfd96c394f121a41ec5bb354c068ef804b19103ca166fec70589f9b83eab3f691be90d5fa20d97917788a804227902a2cb71e79c61e9c1df2832b5d2e93ca08e2cea34459192bf7d926e23046272a79e698c7cba4eeaf26c53bce233fd4b0a5716f718ddbcbd9dbaa8c906e7e0f2a5af2c1fd412a0c9cbd52cb961a82d018e7883b905d53b2e91fd1eb7acd7d6c8df9381e64f06219cdbf68e9b2b31d0dadf0f8d80b8625c68c02c78339a4d59bb8fcbb8b5cd88a86d1762ad998e04220a72436569d513afeb21a676032f06648260e5ae287176206f01a3fdbc94be20e9c3dac2649a07fb9142d66e3b4117857bb13e60b89fa6a2646080fd63d42b83a12c2cc2c7d7a42cab1a384d006672e217482b10bfa259884cd86ce9feb9a841c041c92428d83bd436e5c63c4da29a161d825e7749e6bd594f547099ae179ca106283222f7a8a182f38b525c221785d6ac6d4c4473ccadc891f66ef65dd7ee67056531cd17b431fc15c3cd622c6e15e5e38b0a23e8c0c41f2ee783b452783d6e65d41a247400083a3443fbc3bd7b5d36fd387dd2f3e1d1b14b56d2beb290cf026b0df14a9f02929834aa34d33169ebdcd2170d12f8a9636217fa58528502aaf0e70c480df85daad6634b12d883274aef929c09a5b32c38ed9c16b782ac216fade2ff6285912f6f26fd8470962007cd92c7ea2b1caa5397246d6a326c6c769d80e2a1d4df4f3214d32be3867b3a408c396721d89fcbb0b1487eeac7f87bbbd2e0a05202a37520362e51034f25caa1aea5959c31ed2f832715862b3f586399577f2d53a4e39cacaf1a681e6e96013ce4d6856f6cb0a2f736cfe6261b63d328e501fb09c48541a118f6cc5a13c05fd1694becc577e096041d0bb6883246603ac40b88b7f2881b4d800bbac5fc97a1509da68e165461245d817c1bcd0d1d563ca9148445934407941002b1b415c2659a2b24b8dfe608450b193d99951139d93df3148c4203f8297c9700236a8ca8ef2567b4f99e616c0177840043964c310083c0075e501ebfd3489954fa419bd558a49e86d78ef60cb24cd3f008acde4d004c744457eaf1374b43b1a3d9979718dfb0206f15d36a077ba25a01a93028d75952060789e803776954c1af2bdd3602cd73dd91190fff185aa400d16167b2334911978830e3280b16640362c615212b974e288d23ff8f0b4e8bf437659e9f90449af71c32f592cc497cce91113c5af404269013a2693a19b566eb9ef0a5d148798f7d5955557e8848647614a4b2ba2f3dce668a8a94d1444e8bae7b6c223f3b4861cac4d68a3c39ac026e5f5d9bda219caa828c9edbeb4028fceb3c01adbf7f7da54881534505f5b2983f649fbcd3feca5f683b875e46210d26923aea6ae4048b8bc383c70409e03160a429483ce96b592400a96764008a75f0333cf3e77dcf92f712bc45c471049bfa7928ffc4a08f41395871a8191ed2c2db3114dc072666788ca0dd4ce4ce2ee756ca9aeb70abaa4f030f304fa6b71052e83bf606a65d2f04288f37ea2c70daefa76e6fca68489c1f7eef83da5eb9a30000ebabdddd7417faf37dc3af66f56c627f4fa5f0c616befc736c58c36d9b47abaca0b9eb7cd93b70f0777961c2e0d63890b24a0bc4d2d0040e1465662f70a3d147a0d7f0d3144ccc61f6d3bf01aef8c041978055ecc68a37334f33a18d74c8a0b65464beaf82a541fc43fa6770928744b33ad175f691a84b8a7791e0ebb0b7b327afc61aed3786b206f6a2e6151f73ec1a2b5d477a2fea179ac9167e8e23b430bc24548d6947c5ba7c1003f70ae097530bf7fe84f42993c9a5660c6a9ad0f79c72384594edae74e78482fb378ad669bffb72865cdb3ee1d180c8039098c75f5bbebbbb1347a6e7c92f45dd548e45e8c1d3b88064e935bf279b91eef8c6fb15973eead081aeb920f25c026d424ee1834a6cd55ce69ca98acd7eacae931462e5f3125a9136c5a10eb7e3ab1c83cc66ae3dadaa4c41d8f0e103cde01b16214fb7ae235dc8cf3aaa093f0b178ecc695cdbd369557623cb1b470e82abb442a1f07f1d97078c9832264b1e83777305f084ef086d0b06f42f407a461d963bc31321d456a8d2f98ce93adb3041b3c6cbe450ae8906c1b96c1c03a710692f07c255dee9f6f0858c433ce8aa14ca46183ecf36e39d0e92cd9ee001947c5fb4f1c04bf76c12eb5f0e7765a43ad1117e79634a77d403d431634d47d42706d9b9f982d4570c18aa42834e55d9d0dc4e1e088446e5d6c64ee310f9fa93b5aacb087339ca682d6f0a9e99a64befe09e563a7e4834ffc4e5d49487da4bf59b1babe9896bd4af0cde66799cacf7a3d8adbb69b9748d58efe2d07478e6b05b36e495f4c8241482a98024ef1cc82cbe60b4d1858debdaaa98930277a9d2b59546029cc59ffe42ec3b2388f920ad8e51d8b000150e9721de0df8b0ccd1f6983eca5d1a57e246b1f5a4b85586bd78e5620092b5169a400f6634eadddd0e434e8b0c48a1ae3cb35818305cb1d7fed0718921190d3462c018cececa5fc1e093e8a78650d6e4c152a017509d7d430fa9ffcf2662ec4ee20b49f4077064c97af03fe78ff0903963f8cf3c5dbd05dad5fc3ea70466df7992eafaf4957365cec0c4999bbfeda53d306b5abd9159691b718876d13fa68a11054935e7ae15e96c152118e8ec72fb12d0b11515ea2e2422a588e385a960cf52e676b93c69173f801ad116312e415fa67083a9c1a853d96414ae03ad4581afe16b469517db9ec7d347e5b70d41ea5f26d829ddd91f791a0e0d94d5323d686bdb4c8bb9eedecab464fa08d97ec9b564dbdb4267f3354535f2dac4f70b36e02af5d5c5b1669a7583a62b542c5ebbb39cdde534bce0baaf26d83c7e33d07007ddf75f4aca01d20ddd3e03969485822c5822e40749b37b10c1000e4cbf47cedd5565c10f74aa136e82f4a6cf157c7dd374f018f47452014f136c9217b55a207814bdac9767856ad5fce38019b3c6d3bfa4e243cf2e4dbad5fc1d3d63a7cc5611f0753187f59b60e5fe506ef5d4fefd9671d5983a3b66ddf1fc4fedc907d897ff990150c03c561c2d8f2750c04f06fb2ca94fae0c4032e6763f6b8eadeb542452cd1de3bd4f1f6dbb92c4d2ebab794fa7305635ddd292224315577516dbccf7480668dd38f67c6cf87621304b31ac4bccc8352c397f86b7e72a0c58e99795d87174f930a3fc0e8fa3156b978c561d760974891de10bda31d85299f9021c27b0304a276ae257aa87169341a9ebc09c157c77f0a27ecf2b1e486a4a311adb7da86d4f1a67964ba6d53a98f6552577a1e9104c6ff74168ae0fb2a24a21ea086f7a3a15c4a164a432d97f2b77d2f612a29145d7eedb6319d71df2eb59735b4a550ba76d461df5b2419875ad79a7f7672d1f1828986dd0f1ed785f1a99c1e07182288ccbc9359e004e282e63d9bc9a728adf32edbdebc9053b6a0cc9158da35508113e897ae7fad9c2990cab70916d971fcc2d2bed9f5a895b30551b959713a7e9375c83aa40e6bf923768fd669c38e3ab6005970e2e6c454c2b08694e8a4f732e944d85dc6117e8015107723fb6885d136c1596ecc22a0bb098c7c57d9d3dd44d13affab6f3d7393cfa2d358540b6c7038a7eea5c4e88825f0a91da79c806393b5d04562c965a4f23396ffa2a3c17672450fa66e9b26e1305cf95e078560402adbb531b2ad0203fc4b5b55358725bdebd0f48c44dca236d69ca7ddacb51d8c23953e017b9a6e9a6ec7eda882bbf101a50f7cea7ac8d3bb002ad8c4f0b574982953cd6ca40236db11cb0029838fa8fdd6bba7d4df3538328ebb41ee79576770a82cbed4d426ce844af421b7aff780b0518df74ddfc7b6fb9733af0d581968d337224aaeb449fc28f5d861b3aa068a6c28a5b12e9e98029a3154a58bed35ced1f06eb89e6d0ab82e2d6928be62237ac7b5c6c94824b80ff220852557760b9f751ee47373a562271a187037a4c02781d95b8ba5c04ff6a2d93c0e6f9620536d93015861d065a62b2d584e3526757c8ae500f73686fbfd9106757cc5d994741e589be443a9f11a4eb14af26559e929aa0e0dad0cd0d22557217e9672dc6d0accf0b6c732721579ccc643c7c16c2fd57310966dde8e59582834df3a262d86bd5399dd24554e1072709b59f6ec47e6729039df01527f7b20cf1d6f8f640b07ccbc30471d5210da7849930ac525c8a530adb814112225cf4490ff2194c4ab856d28896a0d5290e39a12892208286031c853084ac990203729776ce7ff5c6a767a634ae2145cfd874601d81d1a145769784b429392510972378a7d062228e90717f856b23e7961ae9af0b4d860c4f48eef4b40d747a13a70df82c4741ef65b0b924b275817223951adae69593c075a9759cf823b6112233a1081cd84c864dc94f04144151413609bb58d293eb26d284759e146ebc26d90b35ebb55fd21b176262965f3765ec850386c7bae03221de872a7eb9af3d3773fa8b6a62b018d43e9100b9d7b0406a3e086cd0544c51c91884e0ab89cdf13dda7e92769a5cdce167fe350e3c4886a74cb815847589c97ff48490bf2cdae9acaec1cd4c8fcf2bc0a1430861f8182672b4772a0316ec812d123f836321c270a01e20b5439acc5e2cc2072fa5910b2bdfa0d746569a1aaf436fefa2dff7252915e1c6467200c20f94981c533d6931658a0b6cb56b503101c7b77a612ca3a301d3160025984bf20fe88b10eabfeb4a1149f1c394c2a38d617fc4e4df76a0becc0a8a7cb80cd7be5d4d343f5226f40605e30de41a0ab2c1ef59221543abac4a6dc13945c4ed9e4853e36771ef6d36a074c4e68204dcb59d97e6ed5bb768ac934ac390c553102a867955d185a487f40092cb0cd36b64d485d0862e3738d6268f526286d6f5b751f16fb7491ef6262dd34e26e35a141f7256371714dd026fa7a188b521dd4617b0716fd020107fd0b32d21baad8c6546295c705f46f1ad1985b5859bac1d017be5630e2dc3b193dfb5b225d39baf384f63b32944bdef948354dd520cea4d0033a8ff6825a3054b24a0705db47df663772432a11b8be023670375bb4ec2607ff5153b7653b08f9c0f47e237677707e744839d433008421a3d775ba9ae19cf8564621bf74fefbf143c6af7c2857c6ca81f5979434114bf6265bee2da54c2905ea070f082008dcb43f4a828282825eda77bc2395047a7f2c92fe256ea4753fa0d2deae2b065340e0b37f9335ad7658d0b7148b1111111112444f4ffe4a3c3e18423885ab2c5b118493bd2e9f82de6e053c44a02d7f8dbbc0bf5da4c4bbe800403023c7db8bceca0c4a72e85fe2a41f8768972879ff9af3212a0e42d80bfb837280fe80047b9ba81b824611a020a8a8031eb032446425034f10421e9ca3ff05d6d1b2e2207fc9b42f708e9e800f812ff0d743a095d07adde11cdd92564e18b42e58d815f4520b8736ae39823eb4e91fe20f1fd6567c4e7611b0bdde1d2fe8fd772dde070d15b4c7e608caef5c4bfefd22a8bf8cefb05ed75bfa79416f67a10e3b71d2d4cf356f29104cd8ebb24550fe1b17b3fce3671616f4bec727961f861863d73b9d9f6df8ad74c0c976bdf48ba8b2f58e1afcc53d770fdd43cd4305178d6fd57f7bc82606b46fe7f008371d69a5de81df4850677b98e4b5752f7bceeb97c71f2ce441729ebf76d8b3da43a8fa73c4d0a6fe4031947478a2e8c5d5091b064e4c79f1eba8bd7f6bcb79fc8229ff6dd278eae82d46a9f754917ea5ea8f055e5ceda156f21a09dac047794da4d960c43f9b21e89d99070505d9fe5a5bf165658a8402c2c635978502dabf5d19ee2fcc953ce65fcc32ca85ab3bbd0365736a4c80d6c0304789310f09b51ddcf3bb70cef66e51de04a6457d3763609d027003d8010ff020c03afcd38c607df3b8bfcb48b0fe3d4bb0fdddce001763f0ef699b14902c05c4019cc3ff863e23726b9ae69a06512d31c8136d8b43b49cc31f7a0ef01ed03adc89c7782ac3faf728c1fafb192f38c239aea06c2f5f31e20248bd7f02e263d2331aa2afd4c75aa711bdd36e9e4dd14ef23b72ed2437bb35d7b4537b6e630ad676ba108b51f6108be7c49759855ef41838a0fde44b48f616a322ddb0a9c20a9dba0745b67f93c18256a0759873681ece44f784f660fbb93b49eff8b763795c897f8c143f08e60075b0ff6d4e14a55ad7cdff6c6707ce4969d7fd27359085dd485e633507e7a93b364794ffee1449975f50f6d78ed661b6691e91091abcc0fa734b01e14e08a8e4719517feb9937fae5239c5e840afca49f5a472823afdc2a26a52e2bf2407cb3b3cbc23eab0fe0eb1f01d88e5b0848773f813c52cfb2bfbd9c597d51d68a31ac33f27a8eaa9aa6c8e9c6cd074b2b1a6a0dcf00710427c00094c097677379445b24822e15df6fe30c2ff5c1dad42a5948e02a340ecd54922e0d0520cc92499fe25539d5d88218410106b01edeeeef9f135eb8f055e59cfefbf9352946651100d21840e5148fef55b59046da0d08b4a2ab27d5149513c87882fecb5b1fc2efdd4e3df3c5503f69ad0a651492827fa518d9a816d1416b65151d81b781c831042c8d9c75786414f12f97735cb14b5a0e2024888412446509185728947ce73803826e84531d925ac0ac5ba18a5c79e938acf29d4927ffe4b1c51281453929014982816c62cab37661f3dd9c546312d598f30455908b86feed9bb016e28e68862140a857a768f3ecd23d60e6a1df2e5d7c03bbaf6053887fc22a8129cf327704b51b5bc3f053867cabf37f63213eae533c07322f7f2952cc981fe7702e7c87f56bdff526f27f3abda4d19da2265fd6e299c437eb601dadf4874942e6a22fc9344fec9a04dabf7a695e04fbe94b2a5acbaa0d58b7f68d3d4a78664e36f2c14d06e6e4e4abbee9f5ddc75c503daf274e3710114154ddaf554d23c60854b38f08e59e10b3807e431816927f3f08e9455026de2cf49a9d3524b8136f1bb68165da9c15f704956a197952ceb68fd9d167406d16a44d06de401dbc4ff628641c9e8333ec6b9b578fef2cc09ed596982287ce701ebf0f41761d8d864d8d867d8e81ab091e86310b489af8a43363e0fd4814b5cbd5fbdeff25abd34ae2875e93aaa824b314583bf5a2a5ced002ec139299dff4410ab5d4cd58736fd1a1206a4b98a8930947400832f20f49630e86575345fe33972015de303b465bfcc96c0ee07e05824fdee2750ea2859fe79167a69acff77f33896b2d03cd8462f0241ef8e0d33a8fbfb478129f9605230350d1964b13e7c66c93108027a996927a2200b174e4a635879bad214a5194c4c4c994fe64d1f2626261fa659fd358305bdccd4a484f1bc6059a704bdccb49345489a21c7b03bd9ec8114f6361759b8c87a7c4cbae3c2c32f3b343ea218c6c5c5a878443806c531275628429d8959c176342c3034404242a2c111520b982082a09ed7c9f0405f86871946777710b6d07d487c201bfda5f38f25cecdcddcdecc5eb71f1bad432086ccccdcecad85184862141121c9b2155484ecedac600111ac944dc535307e567a17009653034059599973448eeb547cfeb197fd8b9d6d222c59b682ca12f676565081623b25e49d05d962b181d885b333ce38e30c32503c04d8ed0e218c319b130950d334140a6e1be4b8540ab6b4b4a838160a28bf8a9952e63761089419ce15c73a01bdf485c58281898189898961bdac62625c684c4c8c2aa6251513131359485b1614a5e4df57e336ef3616d6f78f65028ac2c25531034cc71871e0f5628c9139c6185d359c83dffdc63f7e97363a9452ca683715333333b3ea6b01c96c738e8e314615d10c9ea3c528bffee919172363514618b19a33e819184be93cbcbd75c018638cd373a037ec183fff387e9412d6e61cfc30c608b599a1fc85878d99390b22033366514e2cca89952023029b130342c689e170314a4c935262d98c583681c02216b3c9a136c9799b27a59435462c9b40486c4623603a304c7e635a368198126b8c75cc1c62c42adc388e9318101926e78c98d49e358919095eb4332c248ec8e527072227dc0dd1f739f19ccb4f445c0dd1ffccf3780e5067a61e99a1d1a271e1a1f15a3466bc6de52939b20ab2aa4afceb57b2fadbd6a52e591d6949b57cea88921c88f889c32172b95c56cfe33cf1a5ae38720e21a8e7cad92b293d1105e95ecb38abdd790dc56da2d28e8c735b38e4e16125cb4e3c3c667ca0554fd456f6fc82f9c94e58f88911432e344a2e9c17b3fa17e9acc8aaad21ac871f845565bdecb27ae9ad56d5a889701b2fda1817241f906039a54d70615fb01cc5142c56cada5178b044cd2f4103bbce28e679bca3409d98da439f0dd0a67fc6eb3c8636f465bc188fe3901734b613ff1a8ae72889df501af5a8687b886b47d18240dfdeee28a91ba427dd0c5be2f338e596f792dc481c21dac35a8f70f7bb692fb5d96fa821069080de1d9b7db4d9efc0c0d3e339b07f06180f06b7e9cfbc9d2476b08ac5c59129d5d4d4949404b7094018247a1115bdfb631d95fdb459c5e0637709dc6acb9b07328c200621c61c638c1063e6c720e418636494fcf61cedeb16638ccf317be8ddc0db0d4ee6c51afffa012888b3c3137e1623168ba15ef36e60787d2c5f1f8b243e6fbc39775df546ad625572bdcda0888503fad65dfdb15df421ffc631ba47c3a05dc4d5087b974bba1cca7a69ec1e208679fc9a50076b229b1c11911fbf49f6180dd9638f80ac2240567e816184114b19fcd8ec5cf371fd1f7c08f6d1596e433525bc91104b1b8d149137ec3120fcd8736a083fc6740cda365bf2da43c29af641e26b15f24b6614ea59ae837acfa2a5dd2be1d9091cf36b1d9d31532bf9c09bd67163fdb3383e37cd63851654b0fe2fbd94951565af4b461f8636523e565bd8f38b88b7b09f16ab3e3aa072ca28f2b367067a4dec77007a45a0170dd8674f04fb0cab2d7f7e11892fb9d2cedd7b6084113f4744b08fff03bfc59811464001049f8884f063fdf901da82860acd5eb228b54a9799dc486695c7efdb08211483b68545b8823dfcec61c46084f083b085b58532e8120923e47137d2bec675b4c7711b862eb519c44a63f483202236deb60de573c5470f6adb1ec5281464a51b21caa209c0c24e1c9c3efcebfeae97a21e7a28d486fab9cd396f5c1ece4eadb19ad2fba0032c34451a0960a0c9690de916fca8023ab9aef7864543e90e2eed82363ea3431f028b927fada2c276bbbb43c8eaa4840982de2eeb329a396d30d1bba3bd4531336bdbe2b641df7ae398169fb68330fc88a92098edbec33056c69a5a8669528b9aa6691ad434cd5be31b2df7c7a260b9de0658af3448e5d4de13f4528b85bd2a2c2a265629114d1590212588338e58c194162c0d21012b569450e2e8e849cbc9939884436faf0114284de088c287a4269e849468967f9e040f24a10495a7a727aa279e4081e24529dd9dc76d0479a007461856a3521148b060a0b93734d6fde903421f99f5c313257b5dff84c59c083a3641db08bed7047cce311b76090db1804806f6d258a1012f8ea04140545847f0244c45f754c2195c303333f30e5b1104510afcc916421d28a2054cddedccbfc3383b90ddab2803c3300cabb73fcba01081bd34424c54307b059c2491e5a779427a4924d12bb14515d33fb8c30d67f985d000d743938f8062804ea1fd911942c8cccceeeeee0d8fdca9b08e40afcb3a53017f9c60083244a06f2fe53e329112f97f720042b20c34c532d012966be42b3709640ebe64170e4a885e97edc82d88626593e587c942638c310937d9fea682d551ce7184df06ff8e1c6180e68406918512534a29a54060584b09638c5906bd4ab79422ff5450d0db45483c69e26976d3fc204eb43b2f389f3061ef6350508ff28313218a30863bfb00460b7840f4b136f42c843b493ccb11321305614aa177f2e03a587ea944638cb1665ebb0e36fa0b9ac67e478ff8d7bf0283d22a4a4a7352da75fff77327c80311178d615e7d07c7bfe61d7f977f2eff207c6039fa03e59a86426c94ff5d0b2bb33bc0c416533a8aae3b626b3585369307f43920037b5d341860e254d7ae73b271cdece2be0f52385585921e9468ca8190124fdabdfa35221a04189c9214f407ffacf080135814f1c42915eca08517330b91afbec8b2871c7fd0a6c1e8f9daf35824fc4b301b31f7a8957ef9e1f312cc46fef8cb3caf79cca3174924d1594942622e94d6286dceaeab33cec9dc495c368a60835f64847a160e501f1bbb82d2f03dbca3dad881c15df47719a0db738ffd951f01209bfd7571de4346c2efbfb167ec9e7c968f7938444f0991f5d93fa3eda1ce56279d16a54141df527b85ca499a80a94110e505a215866c3ac873d258e7c8afbea0ff326a5a65f8cea9bc7e719a96f5cb3d97c2395c092c20d022ca0c88b0188aa2839cb041d3b4a750c7e53524fedb6b7f59697bff0db3fe26fc409b28487299b7fde646d49f2d5bc144936d2b985822cb539b0104fbed579ebb789e84a464216aa2e69ca8cd3d96d242ffcb3815aa69f7ffb95c522c34523d8fafbea0aeb1266d823a2e05dac09fb35e4abbeefffb9aba4948f519f8d7d17c973229edbaffefd3b4b6ee7d05bd1d16d44fc03b2aefc02c543d161e853b61613702faaaef6883e76c7009666f0480a8a7aa2fb1dfb49fda9c28d407618baa2d9441976076ce979a974d2f5319a93e0146545e67711b2336c06e7a424a27b93071fe8284a1effb503dd07626a6238ae960950474de780eef48559f93521ff81d151df780a6bbf1914cff5161261675ca86545b07f93714c4017a3b08b2240dc309724b97af442af44edb2e970bba9aa0a91ade918a8e7daf058d435e6c6ccf087bec1dc76d6c803d90217d554d073d20c1d22c51a1f38868631edfdcc71ae937e29ffbf867243342848bae4643ef1349404cb05a13e7e847290d807b60a50b638187ec7fb0e003bdae4e0591d9cb0de3b4e72035ac562316ced18f79492411f48c508f425589a8a52b9296e4924c52629e0009a925cb152d59aec0b24c4a29b18c318e55505902972e68abb6fcdb7a75d5a965c1d159450a8296969c509aa6698f7294a679f051ee0ea36f36586d0494fbd45f667271a9dc525d566e1b0e11231ee7b956773e32286a8a45a27d12ae52c5b94e05d1eae52a3e9db2fe33f3ab3dbcd3528b71151b238edbf40699fc7342b946868f7fdd40360a9113a7c02905146ea8efec7d88784edc503cfebd37834f7f136575fe31bfdeeb4e104d0a8a302d8e8e948af0c88f7136047bf941b02a23521124288190ff8d10b47f0042f85d9c5c8440f9790890b69d932c8468810b82faf5d32ff8504021254ee11f0b2792244918897cf83162f026019a62e5774346e2ff598604c3705c17a02e3ac41216ebdf1f9c3c3258d08ea293788792b716d67b06d61b0bebfe8dd4df1040c03a9de4391de43e704e63403312c2fa631fbf1b5623ed8d401dadce7925016ee3463aa993f8b1641b10aa3b3ca09f2589b7512a5553bf6d03807fdb7259c6f50c9bcb45633196c56a3ecf99cf3a3dd026c94df48262373838431afb81f2d49d2c39f52ac0f66bb5dd6209b0f726090e8f4b6d0a4db7ddf0dd89afd78e7fee7ca566095585ec96526a40c90a16206181344af42186c1aff9fc5302bf1f3af18f95601f1fb693fbd98842ef4fd7e1577fb713a32ccb20129443bcea09fafe84885e5672db347e9c854e749f59cea59e776f50ffb992a06ffd074cae65998f7efffefbbef678a6d713047a696834cd997d3c2b882b579248a20c223f40447e8058896b17ade0872656b001248af0218b228490c0d27242dff213e8fc849f501f9ed3b34dd13810e313865d4081a26a273c6003279430c5141f9822c8064edb7391d46fb549935491ed539faa4db8ca28d7849ac4874618c1021e9afa1f766fb75341209c41480b83c2ce8802f8736d7533080cd8fb31651eac6c1164d98a165c587e8c0a5bb95205ab62f93322cbdfa221f5dbb7ba5584fb96e7bee5f91f8a80f26f2d5ecbf7b7d49fa3ae445a5e557f7e80723072e4e94a4f135f61f9ffac9ef55e89c0b83ccc03bd6eab9f3ebf36afd5b545c3f6aa2fd2f2b436a1df426bab5bbe49abb7e7d78a45554f5f3557f5a77b98caaa3f3095d61f55fd992edf54d596bfeaf975bfedf945ff762dcf2f5a5b5e5b34b05ef54558afaa4d8e88b83ccc37593deb8bc0bcea55b589cbc3bcea79dc5b0e61bc96b384625e9286a44449923214a59389812f18d3d0cbdf8e2223a57b1a0ff49a797ec5fceda4fe9f232230bffa9fa39f2322f259cfef527f8e88b834fdaafe1c1159bd4bfde92bf5879f557f7a09ae9656575cbae9f613b6b479adfe976f752d92aaad7ea097f62fb5e5dc6fdf2a2294fdc4de533fb0e46089318e50d4f2474452bf0d31e48f3e046df8f9f9b7bf3eb4459102875e9a5a62ea4f4c4cf52738d4f4d2f244c3c3663cacf36456cfafd55f6f5ab5fcf527cbefe2f22f170ef995d4ff1c1191f96d2886570c118efb54fda93f5df554fd71999a817ec5d42598eb4930b5151fe8c57a7eb16a2b561fa1246cc9afb48af46bfb7e6d9f7a983f22c23a8aff132b11ee61ea0f8c5221eb65e5612e5e1296c4fd8551384e4a93546d11a1aae76aab087d55cb87fb1af855047b0a22084514b11414f4824bd086ff67c85fa9b700f7aadadabea5b67c54dff2fc2d2881f20b5e8136cc908a0f4d64918517a9dac4025c0dda7eab2d1feeb74ff1df30c517054217568a6880a4f2b0160f532a027dcee21f3fc326268aa08dbb70e315cbbf61b1fc920514e5c522ad9b8c7af1eb4622270f3e411be60e7061899c0cc5a11820e9dd164924c1fcf1f8f08fbfc75f67ca283d4ed3a2c73f76d17cd705711c69946864d5bc7f18bf7c97527e3cc21c923df641b229b194ac31226d2008f6329344420c3358a909249070bf61c14a73e36d04a6828a7eba6d1dd503bd34b6bb9fa6bd22812fe3671b9225d2428b3dd6b1675371717f74443f900d8a342df8187bce2cc378f314107f18e78c43304321a64c618085cf3436098d85ab20d07fe95e82084b40bbd7995e4663a5ec1fe8e0387f5f75cf68bef48c685c677eb45d9ff125a1bb04f4d2eec9530f4f2d859a11fd7f7afc27a55df75f91d8047eacb388fc282bbfd8e5fdb473caa315c13b7002cad1e94d6d4b125cb90269a8c01b3f0240329352ce2cbeb366c0412323a2fcf044153720b2d8ef14d91e9cd8d0804b4a293029e89dd66873419d8ddb9e7b22db731bd7590099a4b3fc5f00ec19bb40f6ced7509532f3409477c38f455d0b48ef8608007167e7f74aa048b2c71e49f6465b56b12aa5cef6cd00b7e996105fc2f2fb12966b5a4002dd29b26cf9778a2ca7b8da80840788602f33d1306b3cc0e7ce9a8b11bab6f837b0cef610be12de212d6c1e2c6c1d2c2cc3c26fa4a4c94df64600e86298922343a0ab2bee6d367a5cc51162603995849b96a03d83dbc08fd3665d7bb8a9891291d15276cf496995314a29e394a424154b0c6ece39dfb20eeff86c3f0fef90b63ba8c3d50e8ae2028a6291f827e1261bb3cf9ab37addb969561ab7e9d9ed74bcc4daa19947237e20e205545e80c5bb7dfc33e25fbf435897b83542e43213ec9acfe5443680a0ae7e8c88db348d440289d903755a3ef163fde917ac2da3f8fc820ff4e23e2528f43a68b30115d8ae77c77233931331cc3882cf358c043ea66915071038a8e7f05c02ed6f596a88f6d73f424dc2182be5c25e17f7502061334ab525b3a93d349a791aa567b122a53333301f0120fbf231ab7f59bdc8acbc1799da1a22f32e1f4426e6e5e559efb2f260fec5838199a93facefd5ddbdb773765d7c1bf3219cd104db8de7cccf9995a646861d16e6f7f5c2736665bd0c9f10d7df18dec65de1dbe8c7a3be8d7afcfc9c6b04e451df463e7e62e97954a5d728c8cfdaf92780ef8f01f8fe09c3f7733cbe9fd2f87ed6ccf777ddf7d3c87c3fcf8eeff7f1c2f7f7ec7cff0c3a374584eb4fc0fcd6f1aebf395e85efcfe1e6fb7f5208ca11726108c7490b442b282e512811aa6f9bc7f10d80ff9250a072e3af7f5ff87de3f795df37f531bf3dccf7f715d6f737172fdff784aff9beded7ef5be34df86e3dcdf73fd4f989af199e3f06afc603a2618047792d343cf55605789617e331c906f033de0b99f91584bc904e004202502f4ac86aa6de007c27640521cf5ad54085bc8c016664a84247f3ae9e051b30d4dbf1904166c606958185173aeaeab59105a05e1ecf829015a690b7f19d90aeab97c6cb08e9645ee88847bd46429e05195610f22f030b2bbcd0918d7abb878146bd32cfe3676a9061356560d196a72103ea672a134e061a3346323cab86950c4f6b781b2f74d4522f8d1700aade990fc0731ed72385cb7a5765327bac5ee868478f17eae51ed5a30515d363c7af7aa4f0c2ea5b7cb87a5b1ed5e3270ddc0fd7abf023e66f6e50cfe9cca9c2df542694b25ee80855afeb676592a1e6cedf54267347bd37b3878eeb513d50a8d9a3ee207484123adaa9d7a8c7ebfcb8e9f1295426f42605d4efccd779ce87aa50afeb5ff811337fa8b0fad1522f7dee47dd41e8c855afd18f57c127e6c7b37c5c2abcd0d1aade96df41ebe5fe8577f15c7c54a1a31bc3bdf1382a93e923e6858e725ca8d7654571f8b8512fcfc7f8b8e142ccaf08e052efeaa98f5715c00548153aba39f79b3870eaa5efd2824a85a35e1c8fc2f74247b4de16b2181e85ca64f2d48bc2f481d3c2531f94aa7c50d50b1dc550af918fc70182828fbf0104851b2f74d442bdf47154dfc2bb1020e75d008263027101c8aa5ed6bb0059b9bcd0514ebd4640de0502e000f21f01707c2f741453efea73ea7579171e6648109aca64ce186a6058416258b6a632a1415e31c4542699ad37e65941fec5639259a301c0f454a1a3cb73eb9b5099cc1a1360e4cb4b4dadb7e64da84c684f65d51b33fb3208cdbf2a931944bed0112b088bf51284f5f24247b65ea3206f420f4d90973d26d0bcd051ac97f5f1e5e5c3542699351a0279a635eaa9993d31f8c39e98ca84b37507a1a31898173ae2a9d7a8e763185253afd1d0bf7abe5626d4ee207454535fe8c8eb8d7987f5c208200030f0d8f1c28e4e8e0b382db0e0d5f815bcd6bb3c1d2a7839fa35c3df78353e05aff5383c9bcf0380bf667814bc1a7fc36b7d8d7742f5bc1ff89aa10a1dbd8d5ae3d5a846439ec66b0df9523fe36ddf79dacb78d9f62c4ffb172fdb9e66dfe2a52a7b5bd5eaccaa0cde8f17e2f5f81eefc707f17a3c10ef47a5d086df87d7a332f450567a98163abc600c1bbd0c06435ba0c0420f7e4087a52158f7301fa270f281b5800b9075cf87cddbdd68b6d52cbb588e41358b31c61865c4309cd48f1a4ad0c813e3ac382ef93c3d3d3c3d3e5869869e9e1e1e56e2f1d133396682c2333637f41e706359fbad66fc1de3b7778958cdeb9af9732ac6771cd7e11d1cffe4bf6841ef5f2516c99268e1639b8781edb98df37e78db3e7ad9d69d6dcfe35b56c352fe169f235fb9b1cd59565dfec99d4ecd23c6582265f48ac4b0fd9622c24a3ffec92ef23ed945b1a5605e4be922ffa4fcb1f1b3efa26e29a58f202b7f8631a0482b567e45a2f2251d014c93d70861cb093227a4e9dde406e763a6d7d16d3bf3d8dff03070e351b8617d6ef0380a375eca1bf5c6b717eb8dbef13c7ec38bde12768af51f33b58a7f4e05fbd74c49546cc8806a5f8305f4f690edeeee864150dfd5fbb67b19efb69559612ed818feb9b7743fc6c43b1ad658c5bfc854ff847fcf84b75143be7cc725ce91056542f6626658ffeec690ea9da9d95016e49f67439e6386e7c8bc09bf49ce0bcb1f6b609a28fcad398730b648c89c03fe98a937da99df5a9cf8f6629e6b6ac3c098c53f871d5bfa97784743ec845aebedbcfaf5521bd5847aa7952f8fd5eb96f5f125eb7879d677c598966a50a1d1de2c48e69798bec6df2f32c52558235395b814e439cd1497621536a1e250a386d7f29b7335bcd46f90abe171bf45ae86b7fd26b91a0d21fc1ade752c10d6f0e8b7e7590821ac5148416467fe2d0f6480c590a08e2b411b7fac552fa581c4f225cee156fc2b836257662a66d304bdaee44a50e78355e9abcc36dd03604e1428bd51bbbf5de7652fe3b18d897109877ef170e8958743bc1c53f46e0c825894601196bb447a27c5b6c285fb3b51273518d65b0ceb6574155b4511a678141870ec527721e312d43942b1ba641d0b2a528e743b383054244a7482d36860e31d30b04d3f4b966182f6d0e0f1e13932f50363dad91f2d9441e3bb1e6b810c0c6b1b61c01eabadece77711347e16a3acf746c67e5aa2de53d4bf5db9c2c4b4b4a4a49484c49f046dbab615b677c756b1509a08d7e9172fc19c120d0ad261e9d54e5ac80c1fc3b358fe8ece257ed9c033c5690a51b48201279ef4c5dd3f38b9b87dc0837efe4dfe5c466c803a2da8f0396e52c0f16ef3fe010085f71b5ff327784e7df7deff6dbc7f4bf11c13de6bbcd3bcb7de69bc7f53f19c99f7ee5de6fd7ba9abc0bc7f5be92bcd85e7acdea59b3a4b3bf518dbfbb7199e837ad7dedf8578c764618577e9782cc773c1731951c1cbe125f194a480c3cbe1270805ef86d7355e9fe03594ea7514cf6b22de860935685a3466baa5666a2b5e5f692eb074937fee94f27a0c6e43f910e7f067c1dbe9a93a3c266899bb8a170675282eb31ae9c0a48eea4444bc779cc3351cb857615af2afdf1db5a4bda3965ca825566266ae8426873ca7ed9224b2f2c1803698c2065284c06e90830982b6f881ac1cb2d9cba343a8a4ce95543dead4cc0c000002026314000028100e874402b150342055754d3e14800b8290448056188963491004394c21638c210000000064646066868409027d23458f69591f27f40ca1d3312ec600bc33f46b696987edfb7944f8fbc46b87b44716bbff9a4535be43a298b05dfa7cc9e2ef762c2b2856d3526a41c57c2b317906fe3022a6c78a2079dfc66a2331beab35b203316f30892058c8ebf4977cb95b14233458f3f70b3f03c8366a8182cba45ac80294b56764f6b44bc63ff6662c0d8e0d01589f56924fb535591182517ab4b7fc81e4a45a39657439c5afda979044efd237e5a4bafe611876bcc9096fdd2159d3f5c8ce274287ab490bf4ac172177fa49b6706f8b6e7e5e3a18b909a861679cc541e8c821d48408c52344352a20706bf4124da8e03c07aaa9d284e378026a59393a41bbaa3c32681ccb83b62fa20ea082e08c678c8b6e915fd7e1ec3180d3be7c7995ec41b0b4b240164d655b47e09016a57cb8c3827b04db053cfcde6536b4f1559246215f5685ca811336b9c02a81214a33a9a51783e62a721237a6d7dfe20df7f90ad887dff248f64da00acaf6b18662d36c805ce2e90e99ffee207393dddd3f1b4b4ff463b369ebd4ef84d4283343bfe98ce5458b402b7298cf6d53e15914d70e8efaec886b69c87a488d7b66054a65b0ee4969191640555f5823441586681ba1d0d30e8c15265b42619e1acd681840cc12099c5f600126dd84df96521fd9d89904425e1ecb8c90ca1c58d2bd9d7b739679dae296cda2c5dce495703966a7d236863a665f9b57803c1cfcf8feb464bfed39f6670303d133cea399db987ac26c4baa0bd59d9c467710fe75c270c0591281a3697aea0aa0fc0ea2c14dfc260b7bd2c8543c81d9b0445aa26da69560c228b827c7003d61b4eda1419af55f411aece61ccf3693e7efa7721b6b60d87acb426fd393a8560aab3bfe0dad3fd2306ee1f007f438259694cc5de39d73e5ab117e88aae2a87d7428ae10c952069f0b423d1cb7cc0c95ac196efb066f68b8c2bbaceee6d1a4f0b96b6397e60efe1aeed2f8d561d7c565d86ef439d98392b7b1a65c65c0b7aa34b33aac3abcd63ff28123e807bac7ccb9b9ec5b0acde73be4900ac861b78984243f692d40b72b05fe3c18dbb608efa436e835bc21e90e7db02865d831cdec2345ebb120efab123f5880c25087a19852f96f19c9b134158ec47d934a773744e345aa2b6b2f7414609d17a6c9848f86bb34deb5e87307077c782aaa5ef8454ff9617dab56d18b46f875c85af5b0babd6980e8ec14429f4b779e4ff03502a133f6809c848bdef2ef8a14bb012e2f99ac17eb2281adbe9361226f776ad377e6c8f255147e5ef08c9d7e7af4d2f347d7e887443b69609e3d649838a3212da229d4d505c080cb21832c37855e151ce0c755e6bfcd5afb38dfdb250120ee5cf84f3874b2c83d3957bd3247f7b887dc5fb8f4b93152970c7362672121478d9201e1421cebe4a9b214d1011b27a1eb11f4876e20e04903cfa1d7fed0fe4bd93589452e42ffa2f6b0393eb6ea809d94caa4461919909b1df2f3bfe525834f63c2d20925ebb9085eb4bc189b276e964cbc7c4295410a07d04952444380a177869bc5cdb2aed8f480a0c96c1c7aaf1eee872b80b30c2223f51f74fb3dbedf7725615489bf4f3fb886d16eed8dfecaf70f1cfe31e89fa69afd8f5ed7906aefbe8500a408606ea2a7ca23402bd3e42d8df8c3078808507c3a80f81a61633ab0ffae7553faf02548001aeb136947d67e08165fbd52c4a6d7cdbc710a5b343af00a5d386c864470edac1e30e031b96b09ac23f5b7c2e4f4925d5516f6f36717e1fb33f15c9245c6a682582ebae2b784be6f60669b5e6651f3642ca119da3197f1cf59e785440ca67987a74c3db7a5e43c91c3af17111f048f577e3d8db941a8d14d01e940b5b609d1ba67d37877f4852be36eaf4ca78219c4bd2817753e4ce40164d532d0e98041fde44edbc774db6f348cf85584e72b75543498b3c2770356e357a53813ea3f88e498944653510a5e2671b59369843ba4e1cc965d6e3670ad4645e60f142987f956c3481e55bf94454edab0742f616fff09ed3ec470b5e2729198d243d1813179aa1298e7cadae8e77c5c50206065bd07c3fb90f604c41f1471cc4143ec553c298db4b897d20512e71a28ecb5dc80d4e462ab83c210b43e235376f19c51880127fab2e9914ccf4fd68772e3a50ba8209cc22e08da11a46ad569107e0ac45a10f2f89c55b0faa5f2963bcf36a87364fde1ed3c674ca899e7019b6d858e82390f0896c22f50e3264027525b3ff7e939ddb23abe186c7aa1cb9c069fe17c337a4887611226db381db1f38359ba60011101d1bd29819035bfa1fa6677cb932052f2f4e6eb66786650182dbbc7e95ff585adce804e1a1429622a24fc34df689fef08682151cd9c6a4ef48c2d4ec62cd04c0a5cd080266b755c05d10fbdeda4324efb292e901b9f5836ef9d5dff6d4999c86a6638274179ee36fa1d697b14b812016495a935d1103b27fc54f74093637bddc65d03ca30dcade057a440bd968c7dd432febc546a24dc362b7001f611412d9fa6390c94185ad290edcbd532d7e738e9b715a8b0dbf5b38577f3dbe89f8700fd02dac89bb74d43974b807b758c3c365fccc57db3d697e6638e2f710f4569c6cc58dca8c92b03b1ae385b355fbc3fd3e0f5321751742e2a1233ca3263eea54296e390bdda280169afe145924d3c36012612f85097845ecc80546b20c5dc82aade162a2613c3bc86ab05a6665342252bf0f809fa1044260f964b5ff97c179c780ae6497a65f91d236ad6bffb7800b1e8be6ca25a9f2b2b7c3df0d1ae817573fed3a5c95722d9fac1011c37d92e5f2388e448b8fefafb9589ededf49e2bc86b1bb63b57e5000785c20e31d36a54a4b70c5c04323a27f4ad2453cf7e1e8f24ae666eddcb6a97996315915e3dd74c892c293274937dd0973aae6de0da99dc0c317aacd849af66f807f3b48a6496ff2552c3648b56e88b6147e21b9b1fc57b6b256a51391b2ec9a2e87cf4d1ffd2e1401bcb38991a3abd91a1d6c55dc270a7889300cfc12624a506708e0b03f72e3f578d27a73688eea9f7b4884ecf19683d9036cd70956bc06ee36220100023f3f60302539677f0618b24c845a2cfc85fe1a10f7d252011b909f4216038a631b01350299a0eb4d9f281ea0a13f7dcbeb09b3e39c497132a932cddfa29bc02299ac2e63674ba516091d63db51f8318ac68a92558ce8d6f87a82fb2adcc2ee4d2e8c30dfcdeda24d69f7628c0874c8d637507e6dcc6ea7be30d7980a8c7c67f63b51ee82fb98d9e710c4cb3c887b2db9e3684682d005e9f96b8b57082650388353c51841e170a202ff4b84fb0d6b8be8eb367790366b71495b45cec3ed9b7a4bd013a3874111e1ba6602d5732ed49da8a2d6c4707ec9b6d3617e0e94f24260ff68d9357dfce0ab78c41657690ae9ae3a2451faabdff28f5f64912d8be48a03c4c399bd86433ecdd08d593618f52d10d51433d51892fc0a3a8b5a87439a3c446fa215e2d5571ff89122c65f2b90c4751653e7f1ade67e5d1a399405016891e7d8d2ed8531c4d6bfea7edad078be78f690d70dabca04525a8a29804bcd07187c224d1f9bff54a1698c134a5b64402d791fb6bf1e227b88cb619d8d0fbf0e280a7e250ac98b10450c18502860752b94983d5acfb8e5d1b4a1d6b64b8e241088e68c9a3ef61210d2d4c89e39123b38b7d61ae5529c5513663fa3990f532017500a2006a1d7a20ca42952b6ce9cb81d20a41ed108ca2397631d7f6137872f19c5ac0fc17cfe9b2b21c7dd972d07e85b409081d0c33eb4c27c9911810aa5a5ad2d970781af22a67620ca7854698a65aae699c53381c3c044d1a643964400738aeccf19fab794cd4127302a6f3f84f969d5e5358e17a7d7e5ee703821263624cc2235cf4471e93d231ac8cc7f80645c9f1a01260d5aaa500554d3c56a0919ce19426501921b2d097241fa5c7baa1550bfcc4ed47d52e1c13143d6838fd656160bf476073fc5d99b4a1d6cefc6abddf2da545e9814fdc054462205ce858db91c5112b3bb98b93faef3ce7173826fe3e338f19ad3edb6b99d66d637cfd2b07249a3fe96fa18086a2a05cb8da1e251d02a7c1bcdf11d334ae5a7e7090a0585d3a8f88af0efa6e082837461411dc61f4b93e4a0ab4f55aba19c72bb883f18de9c813747e2ba572fd614978b8ec81d2444c93283c6948f90314b980fa336353be647d26da5c1c01e57d7705556f7dfc9e08a90ad62831b576785b760f39a6031ca6e07f27581d30f0c522fc76ed27d3d5b03912217e89c89f8f00c5f935da4fd7462a9e7883a871d8872776dcb8d2445f26c71b7afd29484b3e5d219584c571fef0adc07526bf822379a13a24f65f1f8d5237b82f40c2bc49bbf5aabd970a4d344c72aea44bdfc82c59fdc4eb5525516cc962d8a7651b9a203353894cc81ac1c309a09efd29974b10aea827c097c259c307d9270c9a372b3302ebc4d9a49d4b01ad682b87725e37e3b58e4add3a6af3b88e9a722372cc948262c28b681baeb02b84174762bc75132bb90bf650f5572508026ee822ed48173b694d5db49e49dfcd329ec9b17d4d979395c2f734d0e8f52aadecf8a0ee2b32845028ce2b76daa7501fa651b31492b202e11c1dc383df4abb23338dc92828360dce6227663add6ba2fe7a1e6d458a40bb6b2a2988fde0551b625428a627208375b653706da74466bd44a24d60bc7d6dc4849ab62a05fc01ce193810706c33af620591849a85e2062922ad19fadc2fe9fd18c153a8e2399f9ff2afe7d727a193a1d94d69137c8a2adc95def99b9fe19132ba547270e4697e39e95fee660f273e3e5dddef9af351a0e7a384144451fde11c340e0b673e9d8ddf8cd7ec3ebe56cf281a2baad553fe2a1fcc1a7dd8c018129cee62b1764458a68cb6ca90b805570a4298a0c7eba17875abb858d4045ebf8d15d6aa3ee33e210178fb86561d5f8097e8a2bc93b321f88057421c9afbe48c08c434289f82cae7a8b49d293b0943b2098b6d1c6bd6b45ca52df184c419360ffbf8a8b4dbc18c069d842be99dec5691c92bb5fcc6b674f535cfb6d7dcb70f3015059ab4ee86f8c8da429634b71170dd66856465b1893c70e691a52775f4964b25222696aab475b4a98dde8dd49c94f8da5f7b226c491c06d34cf5437cdd9d0255e093f3fb63755b8b7f9b7bd977168b2832915472d2b6976e8ffd724e423327f71d193b4758d0ff447223334a3b255434fd9edfe3e548efb8b6d904d263fd1c2793228396aa78ce69aae7e85acb8ac3a45dea0c826498b383538878021a2f2e69e9d4130244a11673cfe17227b0b4487e847c7c711a48cb9ca4839e057935418e47aac12a5ded30230fe489094456b281a5007a70b6ec918fc38de251a327195f274de3a9d6197fecb816b48e7b06688c945015b3ef361d77d491fc725ee2dca12c59881d9cea6c452dbd2d63432aaf5b886f2eaf61afa681d1d8247b5a0f2c6058abe4150ef1f2b2e445598a8f659a22b2746f56156c652c099ed09a5d22001065a8af8143b558d4753c066ec53bb4915d84b9216a5dff81e8708cf23084419170c4197d53ca478c03a2054c469d3b7f44378e89a1c51035c9337d7eda3e0255ff94647d59844efeec281b73543dffb086563e3bca277c579506beab15ac6c9a38315beafca21c4c528f5ee60dbf6c3ef4301f2950e95a9336826f7a89ef3300eb6711dc625a670d2b9c314539e6b2bf84c5008ab044b407258344e6a979bcdf12b7092b68eb7198101c1b6b8b808c9bd97f91dd67015956fcff82a2e67a9f0545559af096db13b6b0f6f4b5524065f166d3b6e03efb2c047c2957ccc850e83bb62d7efaa1a7718e9a3e1b70ebee5c2c85fb6c67c3d3e91b8f9ff2326fa999b9d859d1b98d7d2870ee1507ee47ca89ab9d32c49363b29ee666c457ff04d2bb896352a86a29624e058d25e32abbaa1c4fb3cfc2bf01269030b2fd76e881803e84d0e4143ad9618aeefe684acddac25616ff0d7faf24d759c95c2c517d6c8e8471093cebc796682d86e87148f815e36b311c8bd6ac8695377d5e3161c0af1105d0cbafb6cd4c40579d66e8347d2cbcea90d05821dd768e7d2c671e9b6800cc791ed9d78954ee59d6170ad5c9566d9ba45a29950251a603789bcd9f79837e20d807bf5fb9c18dbc4f35d1d291dcc2caa89f5974f0846d46b9329ac30a333777eb865cdaf023c0c9143cd588218ea68528111f836e784f9f90a9e891924535c01c54323554cead5d98d6d0604b9ff8483df26bb1ec6ab69fbd6992fb77bcde24d624095b3bebfeb1283b008aa3623476fe3154c04b3a5eac07dd2c67748c025cf17dde164e5998b9744aa7f03e654c35b0331acc6e1298cbe05db6bb7753ed9a1731843517ae715c733289a0de8a74364b233de4e29ded7422069f59f3775ac29bd9109decb3c66c17c1ac93bc1ad549736fdb73c73571a68c4aca5fbbea45c07a227876d1e796efde744a96a2f115e5ad9a8b542369680b61f1d5120932506415192c7f9fbae208388ef286b14b79d164c8292b7616e1e159164e4f00e529af842271b9cfb5a5a2b10454da005f9c6c83f2532d765d51b7ad4e582b0cd0ce8e59c4968f1f780217f61019b695158683f47516dd57dc4f57aa67c23ffafdde4f2a0a5b42d9c4942bf350f1fedfe9096a55acef4be9ea12edf2b1851dcc6e04ad0e49e5d4de90fe2cd74bc2b4e11ab278f81460cb308df2e1d6892f99105cf80d37dd555d29d006f4b59e1c6c1b91b297eb1d91356736255b6f178c0735b04ccd52ad28f4fcade4fb037bc9b3b8035e742b295e97301104ad948a8cc9f714b4b90af70a98202b7176cd04762d8ad58180a2fda1f3c76173abfa06eddaedabada47db7a70e04c9f10bd6df990a0c42af127934ac290f406eaf196f5c50ae19276c0b35c50b8880118c254e375e430df1a0ab1c7fcde8211ba8ae500246ca1200802d1f242f22c3771c448111be41d005e977e3c8dae27ddcd4b0a3285a4cfa5a088ff9f0350782d18dbb3c4716a9ef655705e94f02712e45acd1b2520c19fb1b0e4ddf48386ec2d300f37aa015cfcf8851f91c83af49cf883d4b7a9c2ea4d4d97d0748924aace2c01562387348e139e25c5c256ba28fa503d5e211bc7c502887473f5f43c8b226d5fae73572471fa1dadbcfbc8f0ca9244fdef977b97af56991ac6a2bc3e5adc0c9576082107705ac60e82876f43051704b475604e26bc0658879d604b90f44780031fe0686c28a9aca56c840c26655afad8b8096614d7c52d13e7c16cf0d03c64f7714f3b9cd348059582c12099092c650da975b86c90128813ee540fd5eff0874eec4a0d2867cb87e1097f0b5ed3831ed408ee4248c860400d7c21f3386921057973423935edf04ab98e543a7791e07cb3789eeb14b141215e740d8dc4846a1f9027650c988e5d9ed3eaf694237bebe109db41c23d2e52ce6778762c6b2037c18e3d8b447e06da44ec150f1604f48602ee96eff326bc372e71e447c259866a30f9c20149d9367bdc9ae1ae16fc28a93dc1590a9a58fa82fbebab11c8a80cdf0f7d6002aee1e3a3b0f14b375149b0d397759024027b05c48c9258a52e6269ca962cf6c54752e54b88e4a483bde74caf0083ea40ed4f3b35956d98c6be17e0fba56a007a1c0cdd8eb09e4c2508d767c87318ad2f650091de78e098d1c0ef6bb84f4c1ddfe0b2bc6363a14623f32d7e912221a04a8ddc10a32bd8ae9b9dc498d12545804f823c4211e90c97467ad7452ab1283312fa4b8b7afa078d074070914a8479d24897a7874d36a96fad0c2758e51af28dddb0ba081f00b10557d218f1d2640b512855b0e56281899857084b6b95cec2e206c93210d9ba52bd1e6c334a29aae2786bccfe76fff3013d9be0b06fc6be9e7276b90a70e169d3ecd557e4176fca6a991bace89867a762f3e0a9a365c890acbd54601d64fe21b03e3a7359eeba7543c7ade6049f0061f798d9152998f383c7278022adb9ab63f7515dc6218a5ec2e5b2ad7a8261a9a80c9397c6342cc87517f40774c0f8deeeed11c7ffa2ec8c11107d8b23581d00b9f4028eaf369956c966302965072fdfec2b71599896f6ba926506a88090b51a26277f8d9555c6051291381a17ddb2932713e89c5f603c3a3b5a9f63e6dfd11d679dc49b577ebb309bb874a9fe2ccc134b3b924f46c638f691bce36472ca4e47ec3c2288d16420ae8b2e664743e44c4b182e16d5eb0ded5f67c3372714175b0417ad4a1e326a105f6f7de1ef4ba8733498a08cd2afdcb964863aa79a61ec3a8817b38e202ce349f8fb7618f5d43d75c0a3158ec9239d4208a003263ce05103d38eeac96b5b18ad43f3713391a15b8011054e07eabe51c586fb4e9f9a3ea77dec8654cd2ee9809a7376ad1e6b8b6bee71c4664d2a6409c37d31a4826bf2f5e758b43eb22c9aa6626f09141f6598aca1dcac3b18fa5ad1035c5385792db2cc2841e194014115f1f4fb33d464e8c5b680608d09bac15b755b265cc4b79541dc6e29b03629f1e97c83a59611e250d968e7caf696fba9c61e196fcf7650e149dd3b3efdcfc83ce6756ab90638bc6a7019e93547ee9c2419d845e4e2c0d9dcc504df69e590aedf9e5ce72f52a4a8b3f40b9c7f20834ca146b8e817081e353b5d5bd8e42f0181ce2a120365afc0130702e40c3b15af1c8b6bda70de1401ea801a6e1852644fbb1c24bc3da42938cf5972f5269d5a5e927094f7fbd1388c1f2afb0ff8891045bfafdbf231139f94f0e829122da4394f97571bcd09c98919ddd2cd9772852bfcdd36abb9952abfb03859784d0f90e611acfef0c4f0f1116a0e2aa0a26d79850991b0c8d01f789e91ec337d29458051524256a32a0e18afbd05b78e90d59c0a1732af72eb2866964ee2ef8ddf2857b1cc1561656e4cd89d5d5e7c36eaf8122c953c27e0b14f7733a4b75145587df1213ebd82e29bb24d596c55d33abae5a23d5d0c845d15c67d95c8f8c687ce600ccdf946cbf28b33c902259f54195a5e6958f459f70836819005828de81fd25fd6c5a579105ffe0ec15bc1a73d276339451ab6a098fb1c23c73031173310664573ceefcf7ccdf785cb33300aa50a16291df1ec76e43ddb34f3c06d8972c62bd63761c3506230d21ffc5881925ec6959b4a76e2886c484624737d4f594aef4cc3b4e3f5d0ac2ee770fd1e4181a9d53cddc20ab948529692c2b15175726ee0797d3e1873115d10685825e57bf4dafb588a0280146090d418796f2ccf510040798c0d72a1b53a071e438860f31e8fbaf3ced090eeb5164c1a89d18a25febc1ec15eae5e9213854e9d28269a970b9b52d297826af41853eea697a013308f26c9f67fde1e15344323bf1f4eac4911b9964256de45f783b0384067dd27935a2540618a0eae6112122125281293776b05ecdcd1e93177aed445573a77f46a4f6e88d247abad19969f82cd6b47add782a4fe1d039a2163585f80298151e1a5cf68d29236ec4815e0ed9d326b6232e35b596bf890ef4090fea10344095db0fc0521ee4cdad867df29bb3dbe920a4a9627a63f503f8637a783d5c2ecf72e1d364b40508a8d8b02507aae48fa1a78be008bd48a1d43d64d991bd9314afd0df104b1805f2aad5a8965cbf552301a1e14514d9f18e8a55be3a4f814e0fe991e8d5ba2a89713c0917908b92025b1717a7ccf06b99ace36d8ce994e804fe5ac11a0b183a6851bb05dcd44b165c6af6f6333b1e57820ca39cc9da048d6f2d075a3e355ecad61fc72510b8c6b6cb055100edaf483cdc68e7a56a06dbdc1df79d3ad68492edaf95728b7d6f36fc25b47d7fc5d857e66b432baa733f2a67d8e74e1b1ecc7f9908fbd9c1cf6831feea2da39740c5c769b441e658ddbc5fce8a5c3d07b4f700ad38b6d5a8e62c85f0aa74df8213b07adf7d395a13fbf10f9bfd0c39b78843196fe51882832b1759458ff4fbbf44ceaed668cb9df8d615578a29c11ac30496a4210d863bc7e7fd15fd239c6509dd70ba00614f163a081f8d04a274f760f33249739114d0b3f08a0eac85cee8ad1a6c51fb36413d1b8a048d8cb1ea0efb47b305b29c06509a3fd9f2b5bc6c74d2961809ca843de24009fe4628e37bb158925157aa4db4f81c5ba179550ee102027b98c3f673599c0a7d3b8bfb6b837e513b47a262a31871373d54a212962a2e01d4548b3c386cd7c4b05729d90821cdd906dfee86647f54071a1b3bdcef7ba50f9d8ebf61194d0fa82b789ed0806d82c77a64df22655edcd0467be3f13977d3196587a984576478e9dbe0c7f65c551065d09577f0cba66ecdc089edbf8bc6d54e064387c642d98c8d82f3394f7cfd37f86445af5962fe40f2ea09119c389e03e72787976f76e85025d7d1c55e58c7a4309ceafb3936d124c9ca5603df481c61c1edd6286265b6676398ff659d8dfa83972605d7d8fc1f3847a004bfc6e2c1699c97da5a1a8da9a2897ba9bd2ac6db657a05c953e070965a74d8ed2cdd7e002d293fa348d4f34ec72676df1e380863e21104e50d1a6a422c516089ae58e4e71ea95da61ddc34abf64f54bc68544c6c225d55cce62e6a4ff2e08bad0323ec05d9c2fc3244dfb6b79d477d5848b0918792154385890baa705211df218b0b3025e253180d1f41eee683e12a3e024cd1e45228cf83c53e9b2656404c886c4423655938e2f06c94f1470f2efff6d454a186089f46585ffa46740dd5dbd5800a93ae92b67f8dbdfab60d473a9e884504c6f9152349973aea4df29ceb5d45e60914ea1c2022a143078cf29730e1b8464f05bd0c99e1311499da87f67836a014ecfb6837ed40c4590440856674e7ab20f8d3eac269d132f182e71d0ea1452b41e9c02d6aa7cacc20577b1d88a6999b320f237bcdf02dc2094295dcba88c077623c4680052f184e4be8bfe2282c5383e4494b872b4428a09bca3a32ca44580ee640ec5137245362152523362c2c7c5123ed0be109977f0477cc09d4435357cc02c170d5ff7466f9b6eac81a3a60690d9664a0372d879076efd8c91ac3049427e653f9b7bec25eb010078bda106e7cafc19900af62599b0815c0460c204b3c8773b8346d3128f792b5971a678ec7bf43786dc3063f9ed8aaeac2dc8210abf5cf83d2fa1151ddfaa8cc4d84162f31c956b71fccd08d5879e22d2839b07d8150e40b21c63a7ba7122bc7033af434971d6d62533a3305551ebbd77151078e4c73dd37f6cb787985e7ab49b92ddaebcaf876eb7ad1362ed60f351c3ae4354a9a8604c5c1a483f65a006adcb16eded4a81daf1cd36c7f16d2020f61b3ef84b7364a36ca6f63c3ce690209b7c223037ced9a68519c3b85e804813b343e01a401e0fe6e158843a770de32779f24e4764280b8876e21eca86c46fcdd2667e00781f31cc369b266bddef3037ef99f3085b202c79eba75e234cc6146b5ffca40c8189cfac8d8bb9664b162d8906362fc34f73800e7ec124d7b7b9a0f7bfe1ca706a1f8d60efa75e6db008b9ff00a3450c36023e09ec7672790c2400f4c4b8b838a409ce3c483d99f5e9cf8a300558de49c0277c22472c78fbb138998a926f95c44f0883e69927bf5e53a94a4386099ec85c1914f67aaecb752f8904f831ed56ce9d8a4330d45c90518fcaca237e6073a0b00f1e0f37519ab0114fdaf9015d0ecae063dfbc1621ab9e417604da8880fcf961810426b23317f1f5dda84541c0361f75db18d7c72c835f84cf21d43cb1cf01b1fe7ced94d190fddef76d013b48653ae8ce9fc6b0980188b641c8ed5e1c2d7d373878fde46a62fe92afe4345d0ef01b3febc5435a4e41f663009419c6f3ba086780fd894f94959f7809650012cfbf998238a6dbdea8258bb8901b8807082e8d9a971007fcebc965acb104b33bc1354eba0f0251ac6cc379bf29ea968c99211ebdb2d81e28e802e064b234a4b48a61f905a183a6afea810185c9b0be3aaba6bfe0b35ddb9609c3ff15cf39fdc26aa0efed4f3fc173f0030f8afee17c46353f7d0604764746a9565eb29c976a3bf428984f55d605c9888425db0d9850e2c1c2696eabebbc644e100ded96951610a25d1340d72f6c42dd03ba3d23a5e78d9b514d1ab2ab01cfa81175929a05430033d6c7901aefc2d930f1439a496ab94ef7f6abc78328357ff017044ea2d71f5ecb0a9cd4c4d4f292aed69632d6e4ffe659226ae1488e0f9aa6442ab6ba0f2fc2d1676f01f705046415cad06689fa2816fd7413b990bbc59b45b71b7e4f72ad28e57a74df78b85315e1fafd0db471365447210b0982591d5262bb2c01a19520c86616232610c9fd9e6289dcc3a018fafd986ab8e79e44138943721da9b05403dd138a99f319fe43dcf7ff9895a57a1b52b473276e755bd1628c8e3dcedab2848314acc28e83073f41223f1cb47c9fe9967a1453154d4514941146c54c2845b54b01c5ac0e896a20a21a87b3db8bec6beb38cc05999f6b4858caea1bf93885c42dd0095ac819074afc01e4051cf80fb4ed26885aa5ab7e78580930f9951074f2d9f500707f897ded912c024affcd9b5327c2c3b7cbea37c24c5c4f9a32d2c2872ccfa0a1462c9c8f083516416089e9c7013d4dc5e4e9c824c95c1b2145c78bd0053a53d564412d1de746f56fe105e6ab2dcb3864bc7c490e2837e819f38287a0e3943dfabc612b5fb907a50679e1b1802595fb9f5428ba1281eb388d6d54978ff9ef92579673a7cfbd46ba57b2fa0137824890ff6357d77db4b21ce0ef4584d5644913d0c407c4707c2c571fd368493b24c4ec8ebf6c6dbfab6251f6a2b2a8516304dfe22ab9308b136b809fc7c97e71e5fdb46562f44c16831bb0dffe0953e29dc184d44fce369a800522b4016cc64b9335638d1b1420566e6b05b039fce0ac79c4c1de2a93b981c867d5e4b803aea19288b3edd852ab5d279013b7807f07b126c23b3037c674dba83a1141f4a9b57ba49eef7aa059b5cce62986a6218f75682462fae9e4eae932121dde4ef951d5a2b2ec977d230c63e71309b83c5de91dd103e0fc400d7dbac7c36697b4ca30fdc52da24b08dcffee846e797a3036c0b24259db8f89c3c1ba5e5d2691c74582d5ac5264c0f4c9a2a9d42d35f7d225d5c52bcd65a2109c45ea2975d2c66714db47cf73c6d56cbbcdc74811896b43b02956c2205b4c96717b0569123765f690c95a9bba51a1e8830fb3cbd1d8d74cdae11a17b349f3fc87170c997409c39460ba009c9deab51d7bc4a2f0568fc9252f7233896ef35d6662ea8579d206df2c8e27d15a87ff0c31aa28c29a6d71f8528490a181cda3cde6e64e3e6b110deeabc4a91005c1782488284a01c63352e3f1c7bb997c3a9a29bfcb730dda04a24673f1e439e0c2319058292ae169e0aab07c36b522b830cd8000ac4ab6728d805cad08ddd739fc2aa64039942c050581adbfee5f8e0d6a45a0bb05018e89118dd9ca4a0fb59b957d64e4895004561851775b71663bf03f00504560f6ce37383733f4f234aa9a3ea7992ba1d38f110e7ed9ede472d51c446285d9f84a2ba80d6f4a54349888895429edb55b82eb5f08213cfb7b83a814a58d2bab8d35cdf84c59d183d904e9916b0bd78fd178555f7f043b72284697e5277504c15c46d4fcb91adc72b00331b2fde0d076e01388030ca3876787e13b1c80ed058381d84a2de13904369249cd4d29a2e005829a8daee5d90968041562fbde94f7cfa098be22711b08be8dd02c72daafa01744973fc239a711057e6dcd6e59d1a5a056eedf0860f367766ff3ad2ca87af91669c19b0d9dbae972ef03a5d0176066a510993eab3ba40365b2a29f212cbc16143af2ac91b85512aa4acbcd382e296078157ecbcb0470adcc469ee719cbc6cb21e9e02058aaba3831ee679948fe84fc2d722ff8c6300c8868997fe0f33273e106337ec8a1265216a6194460541dfc408a518fe4d435044f8a6c7252b8d28169d298c16b3d7b37bc8daf26be3726a39347eba3108ab73b223e08d1146639004393495d4ab1e836201fec6b3134c8935a1118efac98c3f0aee20944957666a2c236671639c22a7cf1bc48dcfa3e5cb145c2e2f951d53a60829a01b52d562c75884c644348ecf07743ba001c1cf019fb13c0fc396c166d54f47388d940defac7472bfddb901a1324a6c3d047507ac02e64319aa939e248f71b7320b49449d6ed0afaecd017fdde9c4bb215a074dd1e5be1fdb052154b5d90218c1566e303338bf47b5799f55926aa63c6a0930b549fbe9e3b82d733e463fb5f97eed4a7b17734023b5e983e22c72b901375a88c3beb109bb25c5e79d5bcc4716715f7bacc2ebf648531cd075f78a2538c42edcd29c510483086f208edd6d072c7c58e8cee9fbc8c3c6f8c69b9eda3c809d82c4719f669a198750bcfd912463a5b9dafb296b73284cc6f78302a04ff911bb5986c048180c6d5c72441490d8e781c856078e8066be4247501ed3ea2cb220ad040c1367285a05600023bc0e04564873ba9c40b584ec3705c167c8c564c108465041477bfa98c84adcb8d94d30dcfe9c5a0f023d08aba081c8817363619e40a6ba511e1e93567dbf842baa47cd091711996520033146609e13e3d909ceff691ee8c008fbcb16c0f1a503263988e8817e14cbd1c95d7912882c22bf21fdf8ca185557a3ab3abedf72775dc481eff9f296907418f6d5180322e98f08416694ce868c139b028647a117a680b06a4b6d895e333fb3114bd4a274834c0cfcc417408b33f2f2949d2a8e504c4f069ea2643c2a4b8898406f96fd32d93416db282627b1fdc76e2474d611d058a1cbdf7e0ed2d628b92b61cc532e765883c54b8257cc20914a14d3214cd1eace0d9d110576b85600c101551031c033b3fb8c82a116a4301d6e49bddd3d2946fda0f1157c255fb72875a4a3f70840f87e6877f4d670a594bf42e93dc9ab3671905699dc5d2582b201e42fd8da4fdeda3801994a5e94921c3ccb048624d524ed9764eead410ed64da53e4c0ebd859700baa1c46509a20f541a4c0ce61268ecf35af0036eb006e83168ac2ccd40ff636708d0587ccd0f5706ec9ce8e55d52b25805bab47c99271d03fff4b103a4c97dd700e4232f858abb040d1e4464ac270a740a811c890863466c47137c016b988cb62a81c95c968fed7be5aa39f08108b3285230c105505c9a9e9616266bd49d192bbe2ddd3e83219776c5864713473398c3b484f05587b84b2f640efdc6d33b3ef70eb5905288afdafe45a1dc2aa050022ea52c1898c8fa3a484c17472ada52f0bbbc82b242d46900dc2d31cd45f8d7e37cc8f8e403495954c774e277b33d8b4350da1c4b9fb940686e591cd2b2cfdb099f1e405538433994885ee540f88749d9204b01e17eea23bd17ca49c20dd1905c08845fda0419b04ec21eddf42d286bda54e1d66454c3c4b25aa904f934f64c5b6f77304ec1c5b18ec7823d7ba8051a966c1cf6b3e0348b34be04cb6efcc68325b6010685a4f6206fb90a4301baea7d0686818f383e710d98cca448c22ba3b5d94c269d9fa703ef47d5642e94b978a42b02c4a15cabac20a04a5a4b6d8e5a7905e223cea12f262f8fa69565e3ec5e89346838ee4c40a0018c29690d5c017827cfe9ae3cb4b6a1ea6e6189db6d1108ff87053d720a2099e9ba40b1c6183b9907954f08b64eb6c718638a99882542065e0354172138086c30de290787116946fa1a38310b384c2433311d9dc5746728d03426ab2049424bf2365003b39ae4c4a5f9c0f71df3250cd8faee184c9a098350d5198591f9854970f62379ed06d5203811034b4208bab3c8e5adb5ad7ac787080fcd84fbe2e489916486139049f463f9a1d7c63d2073de6c2f462910544c05215971892a884d80ade0350ab3ecd5c4fb366d99a9a085e102ef8f2f5f240f9ba767734fd19442285570b8282cc9cae2a4ca7b305903afa0212d2769076a0891593359b2e903b9298aecd0ad30203ba9284ac9be8fb58125ea61f6509dd60812db6881708b10a83ead2dc1ae4e2fda15a16cc9096b67ba1ca747c8f33a1e91e8e063bddabb4d126b7ad702d65e19333d127a004e81ef42860882b121c58af02e8b7337bd5e55cece7127632e18516d8364c79256c640bce4b45d3e5a246acf76e41497ebaabae79387d43100bcf066060f44d9aed144293df91ed5f99f9bd73fae07335095a9457b11816cb436457403b0218ceeda76ec4814ad931ab5d02e8d17a0afcbc22d656affd180e78a9a461835eebf257b55e607fcd2041e4a0812370ed3aa7deed2988b09452c4bcd423ba639e6b8818182303e00910d2f662e441012ebfc7f6577266e23f46230004eb3884bfaeb98c200f8d0e6177fd204f2755e97c3df73e1f88c5213419d613948232614db36d4ed1c0633ffa41115cfad3da9141ef1e8c69dfb7de4f36903e00db03fed108445c340688cacd581240f49602cfd0bbaca6f057417a8d1465d9a1d82c171d8c941d39c2b617ce4216f62b32c9605fe14a889e0e44f0d47f47548e5439bca282b2200c9a62d2a14ac9c307cc9e33f7b4f60cd0599cb19be1bda83d4ab97c63e5f2d31a251af709c78394a496f1b557c4afb632c8b0e9c4340f828cd17890fd5a0520ef1f07e38984df0526eeed81b41cbd9490de4c62df72ec53134707f2b79eabfc183c025b1648b8dd1c1a30037b8ff4683fd81b6eefb123a85cbaf6e991e825e2b58a74e2f506cc2ba31bda7f66ed402df592b5758dbaa596101817c2276582f05043d03578a195f360459e34b3a21dbbd229e1c14897d800fb0254b81d885e10238be65a7e5c83361646c9b8d3a8113964014537742ed0f558383202e645a37e2b5103bceb46ce1188650841ce9276188fefc8119811c8c36479540c0c6b8cbf55e1e29aeeff584c6a55497627b70f809562fd8fcd7aee54968f325fa6422818bb60d438315e4ae709d5500a8a6e3dd0a561c6c4732463faba9bf3f64b0617c8ef23c8631c416a2dd3f6d2871370137650e90130a8b185d0dfb340dbbe3e24b05b2196b0ea0c41af7714427fdfd9c0fe3d6c1c557fd797cb0948f4ee867990810d7a7c45d7fd18bd2cb882572b9cf9b73da488034615fe1e14e20161c4f187e732d11c002d489f7431f6bbfb3f6b59c65fdb60aca5c5039777f29597857887eb496b13d054c78049f73eabf8aafe68dfd26dd04093d5ad90148f4ab7f61c4039654725ecc008a0b379414ac52d1e86d5edd23b5b03e47d441efb5804580f9ee2c80908da57394920d9bc9b714ea86709814d2951950aa6f9158f03f61f8cd2d8c00340464b2833d7e544e8915fbd8ac428e64e79a2b9bc9003811558c077ac83918d07290c3d8656d09280f344ccaeb533644a8d038c7d393081754bb09d63036971899001d088d47748593c54e0b623a125c1eeb5227d920c911a8e0f4682e78d88cfa084e8f055767f8477d84a10f1890523c6b2520bc69b519ea2ccb94f08d8236f40156a005bf5ba0379a6292e9b015f6ad59cf9b1384aa08d02af01a4bcbe283733f2021e19d0ffc97270b8168e2b7dd0548802f964953ec4045a7b803d10776efc39aa4a7f42c0a50962f4542730f79faee224807e9bdcc2605d5e49075bd7991122d8ca7d048c7a87d411f9c727042daeafcae9a13aadfcd8babb6c4906f9e7fa58ace5364cd09db3158e421bcf3734f89e51d53171c121d34ea2965bd4b33d9965fdfcae41f99a9fb4eefd62618e14b13303e4731348f630012c787855867d71305a98e6c1e98af7b28fcf8e91a6d90b9b27088551cd35cde4ab80d554be189f388bbe18deb00bb3bfeea0d3e73c8d6431bb8ebbe6a56a801aee96c437b9abf503e5bf8fa04bcd0acc5b4c4a7a7645df023c21e836338c9b8c69f92d2d77c21681a309d38657d3d86d59e7ec9b6aa2b0193ed1a334e9e8d40b90222594aa6deef198dccae0c5c383ac38d8e7f191c908927eda51d4cd4a951db7f0f3c4e233bcaae802812ec25e9af0d4969f5ac5450914656a5e55f4d54534a1cf88ac6a566cb22edf182e5171a1cec5405e84d92053c4ac62a2191eba615302a55d3214becb53c2e4b537d8c58e05a0e478134f3732f28f56ef8e8a339697354a2228c9b538543d68942ee00095a5472a2200c83f54d71d439ff7f633e6eec1a32401a32057d6e24767edf55f5ea6550d2db7a8bdd8ee470d1bf32996ed475a9df73cc108606165c1d2fa0446674a61e4d912a0c14fdb7722e56a866c1a2a623b540aa9407ce381f5a658d63aad7b48275da999b25f48f2a6fd3c0de271a1f06e61952699ed4c4f621d6787f9607fa5726eb46ba9e87aaba98a2008d389230d5404fa14a71621f3c52f9dceff78ec86ce9a5a227734a56a775d2386a5f87e6da01fd4562e412a102f1f540ec08e8583223a38ea6dae2961fb4d985f92b93e146bd96fa4aca0cc1848e3a645d1b47031cf4f27f8d7d350f803da340f1199661e2ab0685931c2e4335e009b352281ce78181e486255fb93e6d717de4a086c9bf18181ba4c47402c81235256edf14bc0a134a3904c9ee4224a6015227f4d00c3dff22b0aa45412ebaec1c803d81518dffbb88d625eed246bd3d642e767d6f1c42fddd4e40ad787017a3ce5071b4ca31fd4895be0d91ddc993f4d19335ca5b00897a0dcb1b7cc9be8307819fe43e8259f4215000b5592660e5f1114e3e244f6d02972c93fc06d1eaf0b180c6f6da94ea2624a3107ae226df484a0245dad2c23eb28488167e1ba654d495932f4f563626d713b29754e712ef1351c6305b334a7e73011169545e5d9d576a4669a95669a89cff1889420d2fe8bfd7949557d0e1873fa890283519cb595bec17f57f26de3d09aeb32040a5b58c1e9cbc58f10029de2d4d5309411e9acb84248af2f2b9255cf785fbcfc16925311a302c847438651a5a7cddf43ae030c145053b58ffd339e039ac7d7549f62f8a0742a551d34d58af98152f0a6dc95b9ffe89ac050ed43b4b3503dd1c5bfd1539c494d8a888b3e802f58359b9ccb7843615da5e60a34e924a51c501dcd551ea45e4a45631c53de0c72c6ac6f4a824d0a1d16c446949d04a0059fab43fda3df43152baf8594266f94700e4c968f444caa41290792569e3469aba01c0a196a2053d4513c63b167191e0adb7a12264286d9c923980f68f9f91ab2badd90f3bcc4b859188f2c134dc30871c488ed456f89b3ef03423113d88fcb3ae866a36249d1e2f9de2f9f829794f0effa999a9cf81495e0bc74ab44c94665eb92033e0c7b582c9eebab50a8f561ab09487a9a535f5bbcd21c181f46b69e1152a48e1bb62459b05f841eae4194753caf4d70bc07740f2109bed185a244ae110e500dc22390209c5aae66870d91710a6a574804be3b3a54612e135792a96dbac882ebaceb2b79af6ace16abbe908516072b3e28e3c0d521478802b0fb3c978e7a71edbc75836db40deffbbd5057fa5a740e5272cb9d471955ce0e88dd3923f5426570ec5591b3c360810c3a56ebac27cb7745696645e8025f7672996722349b7a5f2324c3d0b0a51b93d3d745e8edd700d957ec914d9534a6c143728d9997add8aea4e454bdc89a861c30621d8f4fad1d47619b9f27ab86cd70e8e458a9489d86e16d22099fb38270442954031615557adedd705ebd28189a9ec46f5a5197295b48fb967d6e2ca2bf10402d5e63a633b406f226a9af25842fb0e8bbae36f5e110c5618d1eab670a9156f4f56997d95774b0a23da81765133cb463a465033d6fe778b32e89403480c92b45e2a1dc2eaddc437a63adb5c84d2a532807364c1863210f1f2f6d128eae4a35e1982b67402e112578fb5a9887137e125eeb1cea0c49b5d91a6bf6b9e5aba346cf7b73166cc9444de7c55304693f2b882df5efdfdd465cf21aac034742b9dc2dd2a4177c089eb5bb88931152fbdc7688cb4ba734ddbbfc4acee45ff6a94c430615f03772acdc86b7946b5fd1ae6041d4875e0c17666c297648cd0af5035c2c23e252633e6f77e5629f6c5acb148effd95f472fbdffdd54048ec3329adda2edadc8b63cf8410aee6acaf2d8bae822c3d3243ded8d430315d5cf7e381d75825f543a5a460eefa75bcd45faad319f00e82ba7e1235886edf2fee7b256f198a6a51f5e604f1f3303fbc8991cc58e8780a22ed1a4758d933a9e4e2c4d7868a6b6e80e4aff1538512751dda987559a2049727795e0591dafdd4a2033f53329f983f127fc2f0bc32cb141d81f032a73d67bb9d805c4fa2ed01049660bd198518d26764c7db856bef36d9336872e739d5167c2688e3fd0b896b8c695d93a047c08d3f64021e9ad0c01a68f77d99965500f9075407fdabf9d4d2bb1959764755de2b71aa7962e7e52f4c7916f7d4ef938dee7d8c7af81e2730504e33be2ead75995b19e5396fcb043d9b8798112512ec053a50b34e6c04633819f6cd82f0cf57028a5b75b919036679feca5ea0107c9e6be258cac9d28c1caa37717a9034d62b59dbf1fd914f4cdfe56da0e3ae5506cde0552dd899a15e08141c0b1e4020147632964b594da1918323526634af1b48abe33c4b2289c71b114c299d0b5a55210e64ccaba5b5ab06efe3d9e531ab066ce6989ec4f4fd9cab2b91a07e0227a20ad4507c257095f076c26d19fb92c8b4c38015b565756a45f331d79bc7c4689e05631959b1173f5d5531ca74466d3040c7fd5ab9ac304b5cc433d45e97d8008a1c6db2819a3b3d036148ef642d7678688162d505fe18eedd6168589a5da10f8fbb427583a014d930194b39208fda7452ba8d3c0eaacee42259d07c5f952b711e5cc022ddacf21704e164d7199cab14e2acd5f030ca17795e26913b5281490431bd0ccbb01c7512989ac117fba4d242df567badaa4bcc65123c6f7cfa66a71ce53c75921ad6a8f85bdf1c8166ac7c4b4a15eb5c2096cf2cde4a16582600b543adabb00e5491c47dcb55bac038f55814dd19bdfe182f5ffd96f11ca87313941f3bf401f499fc6f04ba2cf4a02bffd8f8342bfe3b64d3c8b1f15b6bf7f268e083ac582877fcda453896520d4b9e64a62eea0620931694a65bede6ca444fbdbd93608af2df9f59ea41af33372c023cd42a688960ed16d83ef28d2ad49dc5bc458aeac8243ac8da34e4996cbbf941a30441d0974a197a6e5e444b2face33900d2de8696f24384b41b9cf9faad88d253913b1624128cee43e08e894962286e96d83cb6653442c1610cbe193da003aacd8b3c50161ac1ecdab89e1856e148324036c536dd7b286911160ff37c58fbfc54d4fb01ae0174265c99a0144374f1803e1b3c16cc7340804d65539404434fdb04ab7963e1e11e2053c6ee4202d2054dc022966e73128b7a7a9867821d9a61f050038bb845cff006efde20422baac4d53959fa691a9a8c8e4610488523a4aedbe76f91094630d3abce158295b7f4ea5c8c1104815e8f7431ed39b29a87ac0e3f4da4b14e9dcb2ae0ff5ba45989c34879d4a3846f79c4011488560b154d45059604db482cfe70ccaef52a3f554506c862a12417867646766adc6f9224a766754d15c03dd2a426f051cd748f2344c5be1e011f63d218c543b5f22bc82719f4f01c559bc3ef59574b3ce1869b0ea5fb146c62b49d81c667508c7bc5d0dbf9f016f6fa8e444db08edf440498eaea68bbb50cac5363dc546d42a751b96be401069b0b1ec2163cd2bbc8a76a589fe008baff8ece54fd00fc8caf4c8be47dcaedba929960f96878c418181cbfbcf66419e27e48362143577610bb107aee588819a518d7252003a45ba7c5b81048a2765654a3b4f64aaf46a04db09abafd42c6031232744a61f2e363620e69bf5681d8d9a99e65ef517d1cafaee164af3921b656d3429d2196d8675442ea02bdd841a1c3ddf62f2182607c696fe69ebc4c3d0ecda5b96c3a85d160311a53b32027e0c49aa1ca55784a5146d55365b5693dc8929f9145b93c4f0dad6dc8e84055ae32bc213880fa8b8b6976af662e6415e6160017f4a5531ed99d37e4e1f8a462d1b7b0f1c02a38db01486b0f9f1a0ea6a544182dc14707750aa197ce97f676a5aa404198706adb40f45591b597e69887546d03371ce5a4614153174222ba730e20934d484779a0ed9b26328c2418697d6e73e223aeb23a18032c8dd2f95cf1cc4a47ce4ac0a1ab0dd461f154588c1e70f4309cb51c2b18df0df7acc282e276afd60b325179359b0de2ca226f248cc30b39fba500458083d5ade4530cbe3610941e237c8e0b8dde8f50dc85cc0bc0450b8b08896caaed87783e40ed557a5d42f6fd032a4aeb363f43dc4619bfc80950cbc301d1d0c952ec107efa6342f0d052cabc03377674f1ff2fb6b746ca07be16107dbdcc7f9bbb6b31c3216d2549917918ae3c5523d6c38b0954822e9033c95196538d9c34e5c4d393f26602370ad7e9d36cdc4566f75c745bbf048fe04b5ac76860b116e64d11659683a077904d0131209ebd60ab4d5d4abc8dc6b37d5c20d7558ab3df5b507d2d2dc5a1841ba661391f38aa14f1005de24b2e05bd7ea5a9a858f60ad8307a8a4fcd48b75a694c44023afc2dda35df41e907b067dcd6304a9ba67c0c1db7d292d98b5985db36e8fb26a6c87837c6f7fbf44aae557bbfe5be2316423e8207080fd8a340fba6cfec0068835183a3f0f88c1aa4dc3e0e608b991ea6b285fe71f638b1f9df89992dffe0af42a9cacd9178f99c5dffbe406f83ae2cc70029e1c770a6e5c54c870770065911256d31b363872961dbeaae58076fe048b28e3b5a6ab455735b9865daa11ba60da646ed7842621eca71611aa4329bc93ec0944a041a92ad86f6c1dd29590ef844eac210665048b5a53c189925d0fc042c9fc0640c6f45a1d3904ba14a026c51fba9d8a727ae57be08d1dd4da0b2729932225ba0c6c84586dc42a237c8b854277d4255d0755ccd1f17ba875c10dc79c430a62ce52af065e91a4522cfe1fcb76fe1d6196039d8e4970bcf8d0b75b32220a968fbbe36b3629b5c71ba6bb2fc4e6ec7942c847e5cca932805368be1a781e31fa9a1a679c85b6bfb4fb9ed2dc1eeaec6d92e5a71cc91723a7192e5c11788a4b66b690890d7064f4823e241df8fa5ce965b373cc08c896a7dd7d0ae77fae91906d3c3a644415b356706288f5f2f9c1c886d9cadbcd71ad500fee4b94a95c5639d9aec267f834f462cbf8d85b6d5cf682db9559f71984794c8a7a16ef49540f750e866e677dfa0d83728a8015ed26127f0770d5cf94b515985a2af6e55e8b48e1b433060b6088658a0a13e5acf1741ae14296163800b6af6602674a4b4ddb09b2ce7fbc9a05cf0655758efeaecb891d24bd460a1fe1252d3336c3dd2ee8242c9956e0e3cf92ebbb86247d2cf9c8b1a8867d6a7c399c4ea134c28bb09adc17ac34665507214040ae7d26cd01f2016bb407085043e4a161225a2e2a40a8d1b5c4dc071354488e7cebae6a01316b98c344b6a1d8de7517267d1ca5335035def470f093879453b803e50cf6580e66dca5d3e7062f689f1aac0183f11eb92acad6e9c1185ae187f4d425e459d18a942feb2bf65bd4294a485a733261e3510c96b22ee09c2de9bbb1bf5464d557ef9e381ca9872b15e52c7b302ce1acce398190438a7f41a0346050740ae7db70b14c28a5e86f419b3ec101b0812cacd3c139fc0560ef1a2bb196f87f443fb8a6ace3a75faa245e241c7d19692e52236a15e8e7f151c946b65fcc29bfee27e9567a9af954448b2ca58d12cb9b2d4273df9a6d92a027dcbe5564caaabe884567fb53b56a36ec30caf7088822ac745d59bcef97701407b682dcb3eca12cf6e81277173d6654118a650f8100e5470deb1d0dc036ec11f7a7c15eb2453ad86994ee86247e647a877b611a8b7d4e3335e86eeea068b7d73f25a681a7e6f237bb35939af04cb78975b6c350775e61f0c380fec945b16312d5488ae4f7e7c428d180b4363ce406e590d5486cca9a3093f6b22b0b41983980d4b195245d7baf658099b162312402f9e6292a2933f13d32984022d25a1a101a7480ca71827e6b912c1e83f1e1cf49f721e2c59e9e47120ee556d174d21c1360c4de2d792152ac8f4142ca41dd7c1a835422f3c4b8dfdb420576bcbc0943e189144c3874af14384a3a98f5550955f6ec48cdc9a2e0b3c646e6f2885dab45ae0f8b8608a5c5ee64a985be09bd04df8fb5229b98ee8af64eef2885a66d104e91c2f8f3da6a822089f40a1f46475f9378c65861325b1442dd04d7bb5b7c2810a2e9eaf90eba638805c7334b071239c25103844d9699118b8f08eca5eb1f38ba78a751c003389ebc2e24a47aa5d5c47e64cf03309e76d6cd783270238120e250adc5fef2bd1572ecd5a19049fa5041a8f2db00f38e0f723ec5f2938249f78ffacbc7fd9d990a79b2bd243a535190f8d622dfab2a6ba80ae1eb6c5b6293af4f61a688a9c0ad3db182f7101c3189f78ec1fde7b7be5b56e4bcf67ffa5aaddbda3439ffcc7972044b07cab95eab92fc21acb5153a305a4380d9b7f0ef452e038ba940977a2ca5888f207a81f40f9e3d48b4a66315f3e1ac031d59245f4d5bd22a5cb97f68218f969acd66b4545a75d213896171717ce151738da359dadb8e385040ebb73feb216576372e7c66d87232782a758ac0b0951430a10e0e1193bc99535855c72abc7f917e706812496c9987f8d55cc8f95e62fe68acc6896094f22fd4869209c2d6cc68a31e217fb5f3577e2b9e798c8adc2fe0ad23edca7abb001f919ee0b33ff4639fd426fc380085b89ffcba25a2bd600cc09f8173e58669dc454fb4a10e04896910474ee1120d86de3227e0a0458a191e158701775b420ca5c640624cf1c53628b7889698ca837e2f572b70911298ce45f31dd4eef006962cad9e09b7d774eec59ff9d8469cc38f08589f4b14e257dc5e9942085ea388153523391fa2d6a54061ab8979b41059c525a68c0c66b99e8d3fe7d6aca14fd33b7c18b52a5dbaff3a77f3645a58c520e4f22d15bba48b27b3b5f365096f91f7102d9909bc3e32b18ef59ce2ad6ab8a44619bdcd2c65901a777a945393b69bfcaae53323f0e81e2f63377601dcdcf970969c7327f3274279e5c2b6498078a75a083c6d8ea401b47413121211ea56e1d4cba763b70d846e0e8548bbc616f222ab1210b13a85381940526e25f0187c8bdb8a7310106f6ba0aaf81c7cacd9b29c0e564c3ebc07a23e756b6719ff864bd6b82bab871bf29ed5967e9ab2e2288c00d1456c9da8d84a7a996464cdadd9334a6510d3935230e06101ceaca6f0ef2167efca7e901a1d30e238149035ce1cee771bc6cae524d33e9ff7556557cc74087c2cc079fd82e21e481f244dd867aac48243d339a252dd0e57b9c48c31802119e4b1e0baaaad12e791e1ed034b648e7b8b4819221a96a81d6c0aa45ffddee9f438f78175d2eeb2284ab3bbc7e7cbcec9bdba1e8b6d43943eedee4034eb1214656984e9f0871bcbbbaea36fec98fbcdc1674fc43dbc43281a7090a154f1923fe7d8b5c954a45e79bf3e229addc6a591ac198dd97f5880f143c8012a952fc302845b8760f8dab38d3fb8c376cd31ff1b4652f32af311531095f467ceb91c55f57d12dd33fccadf2284fe64a889033af2e28fb63a5411228062518aa87b30da296641f8027afef19f8396025f7605c2f3e51d7f223023c18e5661afe9377c348863d79d50677ecd892718f2b5cde41dd01438d40b4af834d007211a967d2af3db8fd10c806d30a7f882696bd7784ce2a89dc63aa41768944c48818cd07f16c877c3041e6a0eae8c22ba89ca76a88fe3a2ac1d56612f643695a5b06be1aa0cd160191aedbae3f3aa20ccbc287813ec2b5e209fefc505057f38846400a2bca62d5366742ffb734155fd908c58cafd86f8e55cf84865a3cf6dfaa1a7bfd8f9af08a93ebcfc6b1c2b8373fe18cf6a034df3c54a97ecf3dbc70508a46132e4753f7923df1b20acbd823d37aa57730fa4af6747f3700b20b3ab386304a73e890cb0dac1c5ec20d48bee0dff6dbc4505e00d8426197c64b8926a2ff083be29fe01fac244bf3111c977e35378e7941f62186765440dd32c122a5f9c5b763977b8702703e6158342a12be8c2dd42c0ebddfca78299cb42e26c2d031654374d736b1fe780718db157d871b011890b19083140d2082d6995344538b16c1b2e7b2441ffc6a271730eb8bd6b72c9bdb84592c82e68f1461a609f2e72268b908fda79fb38395e31f38faa62f3fb314611460dfc16259917aa04a062ab938a5223fe2a52c4a64918cbfee694295475df3c0bf055e57d7dd7b975f9c59342a307ca714bdf9218082fffe14693b6d8c1621e6bfcd289624bb4de434889a47e0afce9997209cbe09aa039fb5cba6eeff8aed83440605f9cafd365e9f9cc545240f5f1a3c9652a59c509a2878640387fea590626db57bc18e1d8a7a412ad29566617248583786f4f82afd060291404408739313e387963228b00ae692143134429f654deff71824659802490bb2db0f87a09a77f6fe06a7eaf829cd389ec081946683542c030b7372e865ded5a96bb3835ccf5a7aeebefce59e81a3d33c79ee71f352466ed9df67d52d2bdde09d6020d8377dc2fa0864249c322c2d5921f9ae5b86039c3a6ee636391c056714031213da0dfa7b14f4eb85974550cc7f910ee37cd4b67c32ed1a8a314fefa14c03bb6d46d752411033ca412bcf70d0d932cbaf7a74e52b3d431e505c07baae694c5d9b791f88be571307e45bd8a0922555515f8fbd275c06b14fdc51ef139c394509c91e9f26ca101165cf2e0ad3f9c60591a62a284bd15c94eb182fb46193d93f6441e1c1c14a41b2756e26d3e809811d916753e94a6adb7db832f4d398473e481cc2009320f56f6b81cc6ff227c8524ced33bf019a2425354a3d36c5215617a0a64891a8e9f24cb569a7421a40f2f7b5ecb2b86b63ee38ca0bc487f129addd9712ee01d2f47747d01b00bfb000260f733070ca27c486ec42931079e265138b5402e5a7ffc044340f9191ddde99ff0a1ec93a4947b0f4b7ee9bee23f6e498fea2c3cc0114da131038afc6866c8a725f1526702dbe444af73f5e4be66038d7446f3975c59562ab89647bdb0a83ee0dc21725bd5c79f6037ba13765dc000c68fdf255905f77465f1a72088b78b04d52f6ec8428ac58f223ccdee8f40ae96944db590b6d59aafdc2691b95081f5978253c2f40f4f70757146022cb84cb1a003085fb6283d31f684799a01f9463f2212d8fb84eab4adcaebcb821e804bc169345880fc4f990308b7f12bcbc17664556b4f3ed09ad4f96bedd78f4365eb19d24aa5993d39b244745dbe284bc0b2f40f42492612b70b24389c40bed3c89b6cc8d735532aaa664673629e52d31c4e2bdd5f176804baeb840738793c120389a2ae00bf9835dbfcf2038595fa64b570634a4ab22ee31ece8e694702d519142ad90706b54500dd5e15940c855497f4483701b420d62a77a50e6ad30e6c84661249cc4ac541beb40ed8a1402b6047a4ad867b6a6c01b85bd54171c3a235a5b9904e93e43b03a631526b6a16b1ee7c67d8cfb3490679af62702b936279a0c28f41094881884b416ad89e2d586bbefa5f850d33d7f208fcd9d2650c21adad3ceaa16dc07dfad3b55991ab358358920150bca3c8d9f3aab064337923cd018493a6eabdeabab25f75ce532636a76e2795fe5b34f0e6e08d323ef716484319a237f4f8d79490f1200fe09cd3b00e6e2d25b412236d9d67dd8fa09e11de28ba564f910219ee9d713d16064d8099967f9c3aff49e543a28302aae104acd6c47f8531b6a131235dfc35630a6e1c48061693d94530feb07688c4b04fb45ee8e892afdc5f80b854df644e3425eb7d5851557260745e6ff34d1db823e2549240dd42c4610c334e0447c76c36124271d29a1675a3d3ddc3f4903b0a0e0e9996e8d64493acbd502269ef9d78b2d8504d870031227ee4116f36628facdf79da10d1d7a88918ff05def8e8066b082fed6e3356d30e8af0199d47304681f55b90f1671cc979a45e67d7fc4981a8de19e304dc3c343a4ab13afe9985090f4bb86ba5896c0e7f76b48a161b46828fad6477ce78b48b04411716ed4e5626ba09af87011601873660c92d7db88c4ffd47f238550f02c7d1c64e25918b01f53f1ad8ff19a3e59336253562041ba8292337b961f15bf60acfaf5c70028d9e66b2f98ad2659cd2b71703014179a169ecf4ab06e83535b9d299284ad9eae213fdaafba137d000b3eb5e69279c127a5a97d1ef61e375ee347b68332486a160da41df7150b327be53eb8ae48e3f4d20a434bc5b8d33f01294bc0d71aa1494c09bd8b60ccd820022b68abe657d00ea582678addf4021c5ab07b299da0ee5a17baa0cd6e7b4941d04615012c221e109e3349bac666e42be3e8652dd201a8e43afbd3692dd71b58327d30fb2bdea2bee2c6c04e428f68e73b443e47a763001b45131a0e7ec6a654c211181b004eff38a213c63722606aee8af1b950d4ad278f2a517042f1399bf8b471ef2be38e7ef2bc33858171517ad08013efab7d81c42859d43e0f5e539bbf360b7e573da9c8c9d18e939cad48f593382fe858312d11e21a85eb9bbf736fd19080be8e1db12037139de09006275240471be1aa2f861a87314a9641c31459951e62dd60617558556bfed4f747254ae3b26ba54bfa8799b7a7896a5914847d18febef2b3c4a2f2dcc6570a87684b119ae2c6d0cf35372bd583f5717538fb6fb4eb010bd2b0eb66ebeb1ce5348263b9f1810afe084d9922863e4b120f79440a97305bf01741ef16194c5c50ab403f96093abb52d17a9a6e340de194269a23464d4aef9d14b10920098572af075406735f501ee899ea8a2aa9de116031d7c18b03a51ab6faa029336017f4509b10775ffdf4c6fe9f6018a330f8d63a24196e946ddd16f00c7094f796478aa6a10a336c220565524259399110a0ec1b62096182569b27cb935a8a4af3e892973eaa13e700dee4b08bce7ed8af391165e03497a40cdd888205b1349b7aaf8e275ac676dbca5803b0563eb65cca4e6c4b0b8e2695a666efa806e9906a0053f36457b9dea119ae2e37933199d7a7341a4e0d7889f1c8c48940987eb0fb6fbb97d4f4b64358e57f68765c853f43938c8d78575baffa4ef8b77cd7f3f23fea30117a5fe86af87e000cd92f74e7037ea983f258756e9cffb3ca52b2aed80bf3cc49a4e820aa040e155360c1a639dd46946d519cc72de0dce57e33eb60da6fd794dcbf4c0c3fddc5753036d7a7c497e38887ed41d705df87270036b19606bdbf8a4728d6643e46da1a125fc4523702fbc48613fd4e09e125c67486065c70e44d04d02e14e360ebca71ce92660f997c6eab8d67d875424a1aa3901b4cf5e7581572b8f2f2799c92e888107aea751e4b55f4cca491a280f8610b247ca9e73e59f0157e3ab65ce3a6f79174cd22fab53b781f0ede3e02152233583af13e795e1b781db57b1e003cc242866457c2b1e4e6c6b820a57dfd4450f8efd77e2790eddd46b7469cddf1e8b3afd86334fb15e97c64275e4dd2582ceade74e0355b5e8fd903a26f2b963ef94a2a5a0d2e56b1d0aadf1ba0a7a0941a79f51edd92052c14287c033d65c5559bff29565bdb74e7abe2d78a959202e510684b57f857c34678dee79169952acc0503378a72dac086843bc03ad30072a81e05f54a956780b638307b8b43ee32c551153579c82b1e96772856bc3f31fc54ca772abffad4cc7c10af7a5482637e1dcb77f7df3a3cd2f9295ff0f81244b4d2e647c5d14a1f49d7892e2bc78d854a3c902ac948a01b99af0ff5f0a78afd8fd0712eb7f37018a07723222e2c937dad602d3be2504327981b34601001856e2bc7d2260d9c21e26b71b2019dc48363fa89a50179a41af17c3ccff50c138ed6c6be4a845008965912b7b25706c7f1aaf1eff9eed0510174b26a7b50e0926d6d40508e92865d88548f978212f93e56792d0d6de2cffebcc24d0fe8f6b6232b3720429c1f5f882a617734551878a19334dfbbf9daa10e07f59a0bd64e6807fedb9791c277c3081548ee2ff3a88fd8f175cc7d752f3904d1b2f72db40ff3bf62ecbfe1f8fd608dfefb87800adeabc38afba66cec710e4748e60dbf40e4d006ff53f754dc948f27d2a7a114189c858172de4bb7ceaee75201436f5816257e6f90ceac27ecc137a0586e7baa14333874ce9b4c5d8f999a1f0d9b104064d4bb1b371f7c57eae65b7a5230bb453ef7d94afac665beea60153169cb719cc3de6b491024ef48a73b534d261c71676f41d54b947e6fe12e30e396e0712b7a3c573b3d12b36b16846e424f9b51c149ca4bdcd97c603f6dc104808ecee6f3ce5f13012ed87257b6e0ef9c45f9d7428e83c9412c7c852a5578b45f49d0d1b4e9b24ea820b49accf93317accff6b250658f1d3f2eae0ee1fe4a177761a55496449001f90ad3363fc77326fd8695b6d6a0192239846cb1173c5e9367d70cbf6dab2bf37034e14cd7df303b0d8b74526bf2992e2ebf5eb3d093bd56a3515e5d73e039db7ac09094f54c4a72ea06b9ced158b50d5777eda3460f244e46a320155873aad9466b6d6c4724d7c5babab099f9e4757ba0c39727dfee60a5dea2204c4fd14294c568e22467c4553949aefbe35dc1293208363f54a6cc325a3d8040bb1b8d2c866d4a7765a0b5f96ad374de45d131c372ecd8ae74a95c19137878ce5e8d91a81fdd9bbdd9a8da772bee3545eef5511339dab6da8731ef364050570a67b66c229d1615c2bf6e4704017c3353d5b62f13e29117cd1c13363c123f6c16644b27305bb3c0c199e7bc301d6ff0eda8f03be061d0713b6362e67c8a786a78fb5199eb0563ef21a1ebdb7fb954dd49856f26011607dfed844da14f0a8a3be2a893f8cfd71a197814f1cba40c3808581ff84c5c9049bc33545cd7c15d04b7130b838a0f7204db86297c6c25c32bc63726f50b7bca64be60b3c4ae2a9c342cf042ec76726dabbf095825e60e4145710d27689011423dd31c6c6c8beaf2c74e82344a72d97c2a401686f95c104ae7577b75d30b38f901f108ade5faacb52f0c1b65472ed3e18400d1aeeb363cecdc448c44e3e9814870a42653f5ac9d788685282e31f47dbe36554e3d9f4290fc1a04f0a6ffb678095333a5f6a572c252be5597bc34a59ba5ed033b4f42a14d1a5d19d912b99007de9e108b2c93b081809f45f3e247ac77d97b3fa36742ec090eb68d4efcfadc3d97ae68efee13d7ebcd4b4cd5dfc2bb47d259b2bc255ff66e73dd310f9434e8ce4a472bb2cf14bb4f297e474203c368d0f131dab164a6b67df5bc55c41c6b7a80058b37591554f432673cd2aef3dc3e04bb50940c306860abb30b7e2760aee7fba99456b9854032ef02551ce56c77d96b3f2f25045636ddd986d0da2f755f672f66e71780963d967d1d10e52d715d67ea344d3c5661b8dff5999752e01cf3420089341863354de383a6abe4b8843c9c381905ad0245e9394de198e9521c2d954cabe56c06b11acfcdd14d77d952b1d30f3f88cf0d3a1605282289470a4ada55b5754f3e922e37bc0dbeb4644edd8209c34c4a924a5a8f955ca96d0010124b679ab1efee68a316b56ff5b34580248841ae49b6e84f6e3c7ba79c3539f0c53a60e8b00f2f89c50a78d770cdef9e9d5cb7aed73a87d3cf8db4a14693c468b8dc1f3fd8e82691b86535e2de8c16b04937b00ad2b16b21120c828441a40944d5c9614aa5ee70d71a1849cddd222658bb24d1fd040319a05c278befe238114319205579d7905ecd6f52658638142fa1890a8d352eff1d3fbda84d07dc18d014cd79906e96ad7fb898ae64114b4e643ecb6e385bd26b7ffc59905d9ff4106527cd849a0da33070d620c90d8a1c91836854cbc2cd325669204c25ff734c093954db07d81844473c21e68f0daa6e3585b35c7dd0700d913bfab113e302d00ea200eb64d1aa4d1ce87ba221695a6360c1b07832ce1ed4ad522e2489835bdf9b639436f4f9848524d91620fc90a2808c831d174673af990a69788db6f01d170406a74a043d3ed68edc3250c2e103e4ba4bcdd040e8685be398e8bb5f64149f9caf84ecb3c94129d55ce0484a1a3138a3209fbcee0ad839bec4d760fe7bdf6fd9862757c6bdec22a492b95c6efeb14ed535ad4af746679ce29eab69cf49c3e8d1615e5e167557ed6ca099c90c3d9b9a1e69a30b3ed41fa200b4c232abe5c9797da509ff869ce02992ce66d7545d147fd6b7f8d180d0830910c4d5037a82ae8157200ebb4a076de9087365c44f747002abdeed92a83434231f1f7e0bc46d4d4c544c2c9f08fb53c4f89f532f179dc526f0e0c4756572d1459ccbb8825a6b1b4c4f23c7be79d4f7e27c282ab6fd9290bdf7de726f995292292d08b3073808736ee4bac738ae7beca3dacf24d85f9ff6f3f34cf33aaf87dbb9e7c7eaaf79fa9fccbf9e648fcdbf3ec9fceb4b923df6048cff93ebb57f82b5f649aed73e10fbed8b3af1a1b4a6a7133f179268fc4169fdb630ed03137f5b9790a1ebb1676769458c1be38394b5b353607083ec67452b847983eccb35db82f20a81901e2129a800b444d607ebb8958a06a999b7c1f2640c9a097f6a56647fa607ab809d95a74315800d28503d7bcecb96548f0b66cf5997d055cbb2c962f809b041b8f60756919213b243bc6a7c05f1028c8a53f1074344cfef64c0092a8e8480010e195c207328811473e5c1dff9bfe20634e40c3984560045982ad4a8c206b3c986b8b0c2534363cc21348866f89d1ec6ecb4a1b36e930c386820860c5778aa862fc394098481d954759b88a6a09ee6bc8151a12c9a43a96c838a193387e6f020a36e28a8217da721cb018ae23833449a2ecc9c9165862f534c71c20b2b304c91a50a1218894316d269ca85451c50c0f0e0efbc0a96e0ae28628ac14a0dbf4c043a41dc33b8e0dacfeaefe9df75dac146f0a1a158dd262a67567044c58ba465e6e5dedd65e6588b6d777863cc36be4167d7deced271bbbbdbb723b755b8d95bcec544efbeaeebf2865883b445eff718e3abf0be32f64cf5c8f52ca61054d314368e8a88a270c262858412106d2922018aa7262a60a690108590190e74d8220d1b94d61db3051c03d032868b2b5ab8e8a10550658c9ed090300c8b5d8ccf31cb6e6ee49695482f46fc34349c472c915c6832abbf46d43c9cc33e47953f04128d2a98086c2b7b8d6887ca967b1e98b5bd29736b1eb734a2fe991a5138438dc8a35b98d59853e3b38eedaf0b5266143983291abbfb9d303855db49f494b030bfb39f31abd14700c4da00049d1f8b8c8818644d591efe6c86b0477688b753b84e194c51e76e5597edb93b815bdb6b5e7412c3c4a0d10651f2620d9bd480da5b2a5018897abab5f908488e8099456c2b2b688c4fa41b8876b7f466e69dcc3db5c95fd66fcf2617bcfefa4075f9f906b9fe9a980755f7d9b43ff3626bf3be1f557e1f8084cf02db7a612f6a80053d0845a8fd3dde663c55be014af02ef02ba62b09eeb9a27429dd089ab131c394344d53c4a85ddda6294facc8828ac2cb942f1a54a1b46ed3142d030863ca951afe19364c54a139759ba4b451c31f001714a76e9394a80d6aa0aaba4d52c0d8194357759ba45ca1811b74abdb248589079bcea2bb4f5abbbb8f74777777b3bb63eddd2e65fbae0f7ff74e7777373363ccb158ddcdddfd754e168b99376a2a1d6db6c89d39bb9c57639485bdff4b6fac88fbec9459e69af466628a600fd0bbf496de1b73dcc4be0728be4129cf6fe99a6a55da461e47dbeeb86f7ed57679714bc9a0947273a4c466a66ddc3739974d5420d526dce5d211c3965282dec359590dfb9d6a3a368f7367791755de8adb20fbfe3d7ddbb89b2119abaf3a23bb5249ca7560dcecc009fdb773b8eddf3137c8bee350319beffa763fefeebafb94aa63e67aee77efd4b69a6cef6e6f23dd712133d9a3ce89f9a48e71d7943752287b77c7e96883c66fae33b2cfdc85a1dadf952a845231ec0b02416b154416e9d2bf709945baf42f5c66c9e2523ec92cbe06d41a59d680638d08c71a98d41add5713755f72c94c96d5a1b4ed4e2819e947474b5e39d77561338763382d4c66530811a79fbe3a2f7c7e4933bbd99ec6241b2a7fe8a3ee076015108d620745f647f5663a8fc330cc89b66d3e2af6b909582bfb58689e2d685cf2fa09e6318a0ae823b6037e322da6f227b141381a151111cdfec97ed5dacf3c1536d518948992a8ad7f54ad5dcae951772a9724eb90701d504fd7d333c2918e6bc9edd6bee6b1687b40406efb476bed6fb47fb2d62e51252bf406878b5c438dcf32ec4f346a8e5f4c5a45a3fe914d847d54f9e80722b9d4a100076b7d2b752b71db3f3b5aaa8edbb4957cc2382706d4a9b3e89c711cc109117137dcc080866a684a8e2629459d0f1d6af7de0db920a73ad0164316755b439d8a2618b82c9a2f30ec8b8afd7441c5a234350961615d1107143f3ea47031040c2dffb9ce3e1ec0d12683a22c38d278944328a1910218547106064a2d89a5a94a1b5a9529a05768f8b37effc41f3dde10a28b37a6e000a2fe88f27daaa2471ba5ea05a8de2605d59ff53fce285343ce8d21336e9ca9fe0c461b454eb48d32ac4b879c2d596ea210e560a2073a8553866815c3d2cd9929aa21213a55c6954e0ad26a4aaa064e4a942a8a952d8a5477c58a1683198e87a22c06a2ad8bd184214a63c3c41527366368706253a68a129b1454195a62135585042126366a90008311095192d8b4610309433cd8e8d8b04f8ff915ab687105918ab272588b45185f8cc8a7ca4114aa75a1c10f5a8861450b343498d2228d2db4700305542bdab94255599e28c6058481aa8ad8e182de342164837cb2a24ad93b7d1ad5c5c20da32a8dea0643d05977cc93192a94ab3be6096a8ba7341f4859a2393cd8d0c772d836cfebd6dd3d278bb564b8bb64e615babb3d7a5fdf07f34ac1ecc5cacc5c77aa8a6c90fd1ea007298b7939126d396c579115b249fba75bf52c50dd8f443ba3513ca253cb0033eaae09b650c218580510891df06f9917b72c288988f023b18ee46744aa1061d41e5a507edc3246f6b917a32c285f8a1bb59d992bd22c16a51da5ca386a5fbf39c7edee4b353f153688fc25e3871b0fc9f2481e2fa27a82a2d4793dcb239ff3da37b0d21e2474c9424dced4708292840d46b08146143b5cd942dee085049717262e4b381534ab18341549050b2f2398664c1c86c080b6ee21e34105dc13a54be9a00eb4ab3b66ea0a1c53442a6053431a83294cbd05bfd3051dc38619445d38982d63a34ce5ea8e61c3e90ad35df7bb5d011b50f3ec64305e32fed84b6c5bd8c5588bc01f3f7e4bfcd311e1dbc04a5d614fddf7bcbbf98d4d4b94bad825bd39aeaae3362d9b3939706ee80a002c1e3b7404a0874e06ef43009f57f77d8768a041070256fbb71d8eac0a4350fbb70d2ee9ad0a4550fb370e362d9bae0a836ee84ad549d506b278ecd09193e3526d3cef430001e8a19301a6fac1030e80830d7634f8a6aa7f23c0542d89cfbf249a513784f8fc7d7de12b227577f7817677d767ab138087225c847fa84123ffd0e484544754b7d84c3c286d1669aa476eef6eda41a87639504d3a4cd5fe1e56b81d86a8a110f7093ba9f6f7b716f6913dd4ee5144e36fbb1ba4958471e30d7f1ff54f13354ff7b32701176029a24afa875bfd31291e716d27aaad24b5d8f8e36f31c616762cd1f98cedfa7e3b96a89068a6c6f8b10d57c338c54535f2c75aba0f9a807319c908fbddb9ae8bd5c34b957f2409fff828351d99a94228500e439dd41154bde24a2d5576371268419af5f9d3f272c75e627293532ec7c8dce54ddfcab1cfdc915833ab58413ba3a476265125d6d233814e3d93a81e01a9e94903a2f933ac32948c18262291a979f8638c31c6186714ea1f9e935216eb1f045948888598898946a618a1549893d2ffffff7f365494884dbc50c5fcb02f2af1c215db3353ff3094500301f5f480e03f8b4569330edb17bed082da263c43f54f0bb158f4044508358bd5425b18513b424528a808658012b2e5917b53e5941fa84eba917498b42edc6f5ed00b710462483043abfb242ff6d10e21b243aeea23df4343b757f9d5047532b553ac3628f6613c5a344cf4f045053a605e3c13cb9849eaa01d6814025940dd3b0aaa4d387e5dba2f88799ec0b451a2b5ddf529c5a478b485b2b12485a93927f1773efb824c8d5f1893ae2d34ece9ef4e841c2ce488e04894a0c66f497ffc36c96d9a132c4738c050c39844e4080888324dceb06c72840de2ef03082b727311d77d7757cadd5d9f1f7671efeeeeb6dc4e604437ce0fddddf339b318e717e916b03ac3176a9451ce79c5256207fed73b995f0b9847d984caa46d9504dd6f5e2df8acde5d1f45743f72e433367e6666e9b3eeb32e6f774ebfb3e7bbebec6306ba1fba5f36f4eefec4582cd67a11a59377178a7c21b2fb508441225e37ee58853cc8a30c1a3fba925ea779c6cae7fe607f7d61378b6ef74d5d1929f5ee279c8b2ef89dfe7823011694a10c32bda194c1bfe6f64b8fdd52aee736c835d9476218867d218661d88642ea15e3e5854da494da754999611e3b90120b617a6361d05bc0e457ccf3ab6bd9c6755d2fe53b173bb8bc6eee8ccc2d942fde517dbb3bc8be0f2bb4df0ada9d6518b6699ecdc962cdcdb2bf36c3e4e79f65fbaddc59f9c426b329376ba7ab8b2e41fb4321b5070883eb72c77d9c41b762ebc1200bf3721874f7bf3e773ae437c8ba40fab23e8a4481a819a3f6efb00f4e6df79652caabbbbb63179b7677fbd744d6d8f3bd8fbdb78f95b0df12ec7daab1af190ccecea980d8bf133be0efc1cab9be492b3f4ee55f9cca24587692ddedddcd4c1ce60aede72406f7091086f67b67997c296599ba3fbf709ea9fb181a26b33cfbeeee5c6c937d76bd678796ce2d9d776273393dbcd97b656c18c4ee3a02a4833da76302f7daeb60df09dc6b3a27643fb7ccd3c1384f07cb9a466fbb3772deb6b20d8523950950f6dbd23c9db82ddab2555db2d7bc6dcd13b8957dab137fd6e839eb68288b8251f4487630dbdc9b0f6233a82082a9a57a9517f442a4614a93506bf5412f74e0c514422dd507bdc053a6cb15add587843de07fa11bb2d2d4520579587499a7fde6654197c14c768320bbbfa2e615e9cc9bbf65aa0c8bee3865e775dd77de912eaa2f0046f488575f41c94d8b4a9589c190dc5686201224f208838c84415ea7119030c811882dd614fa044cf74f56affa27387ff3ab577d92d5b7cda3faba2f09ced7fd8e2d7489f5d892ea8bf06a89198c8222c00dca04a8625f08a4f29668fbe66fcded9017670d2243c33583420abc8292963c54fe26dd138b4bd106206a24d297143404aade2af2229192528d5f1887f412262bc554fbdbc04a31d5c8b1ea04da6c23296301979fba63d424d59d345868948a623046ed0859aa4ccf20676a50d6545e0caa5f75ab7e557f5d2ad5b7279f08a95e7b95a615e186a27cc4465c54f9799ca0f1432e629f3046315174028a53404849908ce0154183aa541edda25075a1a92929a9a8282828262627a7a7a7061d28d4ba4e0fc8ba85df5ea6fdf45a6840262bf6b32be18584842a36590cf2f531d1882423524c8a5c6212fbf417678b7d07cab132a7896210cbc7a81cdca861cfef40c359d5d8e4777777778cd786452c62118b317ecec5ea02f73a79c7daf6614fed3c2d9b0ccaba20f7726da6eeefe24b8aad8384daecb7bebbbe2bbdbb5bca8fbddee103dd1692aa1c01c67e9bc783183cf222939cda2d06f2021a4629f691bb20931caeffa7a0fc6194aa4db453536d74c6c63ebb603631d6c4a663d74f8e59df41a07f72095e310cabfd921bfb26b3ca0dd23ffd3dc0159bbe4142ced5c0928616a5a0fcc0c41946ac418154142776c05206e78541c31fd314e18f65ced4ca450c7f24c3df84290b5a2a63a9ccdc06a8829437a470fc2e1745748165052550628d291d6e50c30715ca1fd29f0d98848460f8d2e26f6f630f464e4cecafeea7ee6e1e82a0e28a1a4240210144abe5516d1a8ea8ddfdde2eaf1b213a02f6811588a971d8e236754c08af5aa2cfbf1e33e55fd1d56ab57afa454efaa20529625916ba42f7354f47846f47fb7444f896f8769f7df13a6a4825786679f6d1d43475d5541ffeda4cce779e10235a0eee0a1b28cef6c41fb290f615e149ea42bf862c54a3d10847e412f541050d9ba96e0cd34c2d86dba9c9f41383576d2e4942712949d23e65b005cbc3a4893fd29061ae54f9920059241612092778904053e5d3248e601569a9f285004929a56ca623dca8ee5e48ada00557e8f08694151249cc569d1de8d6c8e52891a9fe4a6baa1ff1c4bae2daa1290724c9f27a1d1ae8d72e44dfba5e4c0d7be475050d67953cf2651b942e1135b03cfd3068aedb29d920fd3c4bd066ada9c00e89dffd438405a48790fdf99cfd39d23ccd3ed24709830d81ed254afafb4709f3f48b519d9fdfdf8f740e937677ea35b3b351e146a971ff44885f972728f00781f16fdbee04feeb0b95d479c48671ac25d8cf8f1eb6bbf385ac16e20c9554df00ab864aea12d6ce2d7efef39b5c68f6190b6b26acdadfec89c1dddd3df4668e9f55ff0fc01c6d900fc0182dcf56f9851e003768569755307390527ea52f778c41f7a58c606cd8b3bcd01c5ee80e2f74abfb2c2f54abfb936379a118cb0bcdeab2bcd0b97546b62d62d88789ec10270c23a262cf73021a026d4c58609fecb1d7818532cb0b5db1bcd01cde81903d0b0c62f3336fc713951fb0f4b8ee4801e5bed391abbff924abbf79f93737371fe4bf7a282dec753441fd8807197abd9314348c486d6e1efb28d53fabc7fa31ec59871d1237c80ef18797e76887a87ec890031ce0c78fefcb20039c2a3fc4a9a15629f6371e1f350ff69cd2978a2155eca7161a32968a61611fedb1e7ba0f1a7bcf0cbadd3cd88e2d348c4edf06d51e7bc65ef38218c41eeb4468c220f6d9a7c3eac1da319261252861107b1db002f9823e58314eaa18f6d97f3d0c627f8d80fa0937df092868d8cd4df641fe37fb9464f5f40bea5f7d479a077b2026ec331f0302ca3c3eda20d827607f5887e5c11eebe9e1e1f13c0000e0e606a8621f990c83d8c4a430ec4116501d24fd374c9d962cee4ef7ee76df75b9d1bd1beb7677776f77ef767777efd6a81926cfaef9ff058defff1786edab7486687c9f99cc34d7b6de387e4eeb28ebe7feffbfa6fa0d123723b618caef07c86fad66d8c5beebd10ba506fbd56b198c4b45dd29ea7c809317ea7cd0755f2704aefb6950bf1aab7f3d5202e9586f865acaabca760fc80b659debc6c6e38c387b1763bfdaa53b8d83c6dda571ecee76f33863de4809570c8f32e2641f8fdc8d146c31cf66b6e2f2c39ae9030ce937acf13572cd1b6b625c13e31a5f735dd70f6fac917ec31a5f23d7bcb1868b8adc2e2f6c66daa65a654b61947c97565d085e379c1c5750e764a786a25051243aeaba44a32f3129478e6cc2200b393a982889d2d1005861870a4b1e97be1dcbe3c8145c68fc23aaae4b911450e0b1ac1ea06562ca9c367610463371698926d1c8496eeb582c90885097a50d98281c44ada104bda40690055d91a141183433f30616445f9eb84267dda62f6196be10618562759bbe001186522f6466242ae28a55d3971b6ab852ab66aa4d116024008baa6114618497323fac868a309c8ece102135a3281150465a74d70f2296a8f225cba73f75f76bad484a333f0e777713d0ad1e725db8a8f25d362575a952c2d165a9fa164c0a00c458d901b5c4dac2061d6120f1e062460d395f44ede0a2a62887900e21231c3294728c6cb841139503081a2811ce11452b33906ea030528d0145b198a13b23b53253c48191a412028d954d0ca44e081864d1cc30c35199212b4369b3c1ca74d27ec06242184910990046941335987006890c0d26a4c0298c2313c8306a1a22063c4ce9604219424d5dbad460821851ac34518438f3c4152b3458ca828331d451b0a3058c34cae000063aeb8e3913d5c5994f05f46a634c0ad4206d8991dbe58509619fd6326d466e5375215817bc6400a32c0ca0b8261a582547d6773ad1e65ed3bb10fc5a2c68dc599eeb57def54246f805af9d14aad3e5b9befb8b5ed2fdc1391f49ff38691efe39c3eda980c28b4e58aca99da2ca28e4c5715b857d5e6f64d56f90aeb337124061d17c90618aed7222e29ed0806186a422e0b8e206215ac0c4193f3875b9715aea610b27294da56740735179793406991ba278e38ca717481faa60c1dca20a356ec862862ab216c8b071796265b42dfbc88d2377dd54f2db2fac285d4adfa00c9725c47001d3c425494a179ef3d56de232a5d2ba4d41ac21b5f16b2f372d3d9473b6f7f777edc1e89bbbcbed2f10b65e1f941abdf0b7979f7d8452358f858af9ce0563fbc62eb37d151ab22a7f8f6f20f6d1891fb7e53ccea390f36df3e03c0a3bae7816479febba33d2c2cdcd83b0f5e6a1d4f6c257817a6144001beaade8ea8b4b70dcc731b87df3b30f6c9ef8381e121c206ee17cdb31640254e3fb7b5d70264e9107a001a3a091b24c83bb8b38b504eab85544e606d203a4cdecf77f2fdfffd8ce72ff7f87ac53b1b98f9710397621f87a409ab9bb7ba7d707776e775eb932010bfa3b7fc4a6070b260084ca1b787b7353e0f296dedc6b7a23e621500216940b7040ed8f1e2c9800106a6f20df57f57a97504af0027ad56d0a42ca8b20cac03273d87abc884d41005165ff0001555b8aa97253116a02e289004339446ad86307480d851011537d7dd1f8fa8fff0a51dd7f522d2ca8feac1e9eaaff833e1455ff1e1fd0547fa02246d5ff08fb6cd30f51d51f090a38546f425a41f5a62d52547f169a8038928286d3855c4b952a26ec30a5054b0d26f09024773841186470c0664c18523f087150778c1842d7bbd7428ca382505022428eb04fd86304f6b9aeab8708fb2c89ef7fc5785dcff41485fc5ffcfdd7efcec5493471918475c19e8db8204209f14d08990055fe1cfb843c76e8c8c981734357aa8edbb46c6297f466f76b8d6d79cb418202606bcc8b01fb795dd86fc5b00ffbcbf3efeac7baa30e3751dbf2a042c1bac3830a75063122b64dfee5c5703d763df3755d315e7f3190babbdb40bae705dee90093d2098278aad96331ab3afd5e25f691c6676a256e25f960c59e4717da5cbe2f745233126a480b510a2b217bc77c45c830f73c10ebe4bcb96c3c8668b6496d4bf9e45c403d769132c81ed2cf79052bf7e8f15b82f27f7b7754b32c298504abc7bfecd0c5b0d8879d89c1e84c5f129447120d7b2a10ee6b82f2b373387b42212dc4da1f108e46e2b63a215cd5df6bfc2a7ab2cfe476db9dda5381c8a0cb20eb89fbed09f6cc795d72fde3b6ef0b0213a4faeb0b5a3dfdf6cbe98f3c4c4027b048760888c20e99b57fb7bb1fb06304f44811064134683855e89f6d1490f4cfeafb7bc0f7014567035653b5b3ab49f7af907942bc06ec90f9eddf07dca42b0bd857ae2ce409f94fff807a8468b84f2800a98d847db06f81f043add0c69998a8856e531469aaf65fb595aad9f69a767546b4ec4300d4f89b7d78536316b308d4ddc69c167fdbbee1189c1f0201ed10ae59967d02f667364ff6d9efae14599665590684c12cf31b0994fd663f3ffbeddeba03e1aba6fdf631464d8b3b99c482a9f2bc54bfadcceb9efb13b6577d4f54bf3df73d0193e449f6db9f309ffb9e743f9f6c9f4169655da7faedd309a2df759f24fbeee377f3b72fa8fbf941db675d8e17042649d8a5fb13621a4a5821d47af282d077df0b4f8aa868f774b222b02dd5d32f2868bfef541f5d7d943df0ef5ef50868d37daa0f49f330f7db7b505adbc6dce645a120169a875f85cf85086c4b49f3f0b710816d751f816d715bc75c0b5c65448a46484748461b739cd7fde6a936e9619f07620b5ce5abbcc8e44212d5775f5050f7dd1795be4ef55d9196da77deca4fc706d158992c13cd54aefdf11290221ac627cea05c3cd3d8e4141a9fdbe27f1155f981d09d08c6172f03744c184444b89d0d7b54fe9ddd2a2bc6c84db0c5d752b9c5ecc31c83510a27d090004d5d6f3742ed141928744df0845443aef2cbe7973b64bf58c5b63b1d5fa044b9598885368812346ca9966a35fc5235361c2c2a1da8f2e5491aaa6c428a2aad6882a2c25a77c2892730865833b5c6d41a437cea0f9d1bd88e1dab50d31365d836ecaa578d45502d4a8e798a700e30747e4483615d630701ff467808f8c72d91bf46b02f6cd27d3b12265cc52e0cf374bef374fab7ed396f87c16dfb0c0ba50c6e2fbff9757b9e1968d8a36eef5f921eaadfaaf286c0487fee4a909fce067aa1db4f0814e186a0fc5184ed5bd273a4542faca3117b707d372588284b4c3e5c696de52ef422c153f5a8c4252e1929611f2eb15e4d40d5eb53e09f6e5d614e987a0151c39cf6b41d75bb9c7c8055270c5ebf438a2e2999f9c2a5ca2ff344959f6149114d8f9a7d213b55f93ca4537f874422bcfd895e22cff597144024a8d78706a857e4092312f5fa90a75e491be4fa1f4a507f23712872d151b9887f786879e417a5c1a286b5b4596179e45f1fc9f0f531e9f26fc3436adad46ba31a161a7a2696c1fce6bab22f5c315516e11f51d0a48bc5faff7a615f4c924275b087524328284c33de75cd2f26adb39236b5ed4e8821556eecfa0f62ed5a30927152127f611fa5a527c438b14f0cf9a932e7c47446a94ce5b4fd612590fbed392755db05b9df9c933889db38ede35f6da4501b29e4535c988b4f3d4d110089a9cacf4aacb4930292fca227032b5cb481460ca010634c5c2229aa4b5a5385082168142a55e4889214077644c40d38471c884a33552443152a60e4962723d8684f4a316479f077fe93b0a24d511742e060050161849a6cc081055169442d8898d205115564f89edf594a230d8b898be251c8cc2e92ca6009739a969c6a06759b9646201b4b6d3175630752ca2b5eee2e658472456fc3d83773dbd3c106a95de401979702833e48f68c0a2b2861e2bc35094be93dc0ca111f68d070a1983aa8fcdcc10e3972e6aeebbaae25a2df6dd45876087f8c31121531e843cc4595060d7ba8fa634becc3d5bf872ecc0b80151af6517f6dc4a00b21979e60629f3026557fefee8e1bdb99c4845972779c209a88d1b08f0e2f60286a872cf11365f574ff27aa1b31e8440cfa53a1212b1979187e82c5d8215cfdb72632da322ccb26cb68492af2c4d25043c43ed83b73611eff22fc230cdd37fa605fe75d4d75c1ab0bee1f8fb618fd75626425f689d59fc3f8f3d23314fba4e19f0c94f88925ca341193e1a790cd848c8699aa7fdc36629f15c3c499eadf45ecd34354c7d2b43454fd990bfbfc7806fd6723dd84d922b7cb4bc80e616c721b8b2e8f46460c114d88a6655f84b5ec0241667083f0d32e7441299ba32cd49ecdb107b9d11bd1b0a7f68f1ca80b5e3b04126317c28c527bb09494ec5313404ca879da11c010204294503281126c96e8c18925d654ff1e26a0a83fc608d346c8c442f43b29cd61f590408cf0168075c788310493531a6272509ad281aab484596250d3b44cd334ede330514dd2171e334a5253ab86c3b00f931393611fec9fb5f04f9432ea1f14ccf48f9366219ce752a3104b2af2b625c52f39229a18263ac5a778262ec5df328e4ada2803e2d329940506e32b61308c523adc7be53e87a7c3fdb67264396d28137d2c148f568d4ef6b1667fe3e964bfad9bdf346fa5b35ad16721f6e198a3c6b82971518c61d2c4b8a21afded3ee0c8efa30c1ab250ddbe4f67fb8f9fcef65e37f6517d3afb918b98013afbc5a456fcc299146c347fa09c83515a93b467a31e198ba5a980bda001a45fa854aed7343574342301001d2315000020100a0704c260402c1c15a55dfb14000c76883c7c5c361a089330466110640c32c61043080108180360a6c8b601f817803f02e34b40fc14804f01f22140fc04885f81f129201facc0b5cba4dccbedb32290ea6c178a0bc3475682ae980f351656936a8096686d4ad05c2f0616a566105439e5600a56e7949507f66151e5dc01daf0cb5bb21c9818964bf964d622eb1151519a8adcde0c280e75e80bc991f58ef2248bf2c283b2b72df56b854c2a48b94ddc8f03eeef00fb73c8be39e47e0eb9bf03eccb01f6e790fb38e4fe0e615f0ed99f03eee720697f90c3b02f12d6ece985a91522d21e52ad13fdcb3429f432bd494d86aefa5d2d125030a32be62f5d53fcbda8b08ad2fba296150adf8d0aeb28bc5f1459a3f4fd2858d67c0adf1b95f1bff3a87d55666514cd8f6b20d575b1b1efa1a85f4c48c3f1643e7d71d6a8ea9db54a0976aada3b2f98452901a7358e9201cd84b5b9a42305e2d4d243f1d6ff285e415c0c7508945d83df016e977cb3da2c83097a6e9e73eeea41ccc8c08baf2518323450a082f4cba4565ef86bc2b30d46bc83ae653ccd3aa62801b687ba3e256d8166e6ec37b0102cdbc6541d3218ad0e7c489ff7f8ef85898e61c20fe909760f8904f8290ef5b56cfe9f8a1bc9d5a0dd9372663e717b5a867b05906f8f7e9557e7f9c520b2c23d0852e87f01990cc637b7c5e1c5596a1d433a5c79d7157b508d9dae25ad32ad88949adbeb6982dd2282f69611512028bfb63865eebcf28563eb82091245ec3966d017b31c140a5cb9286f24a74265c22571b32271f2ecac99b54668979a13ee2180ec755cefb314e024964556dd6e52b9c4c7b52fcc07afe1d8ab88f40523fa44071dedc22055a95c382cf695a7dfdfe64a119c9613623580c0abb240caeeb59e466325b106b6410ff09e2cd60bce89259926e5d512e50f2bf8427994d2c664d0979409d4410cae45454974810f42a0a8c870ad024816920969da8505e85dfe1e198643692886d0e766e5443763acadceeff0efcbcfc077426055059b03eb430b71b271efc8c0fcaa0a41d53fc0b44a3bdc6542f08dce343a53ead11be4c0433dd70b9620a8eec4ea810c1482174a9f9e013a65557bf9ca10caba15f447bb0f5b44c1e1cb46f5b967bd0069734b07e39490d2f75c1ffa5f7818dc69ea76ca78bd3859d7db4873800afdc7421e5d53ee8123251edabf3e5807481d9880fea73f02ebd805eea65a138695cbc5649901edd9fc8f1f14c3ce0b8bb8dd61d439aa309defc39d50b1966e1a50ba28b98b37fa5b00e6f0e50f9e9038cdc86ac6a72361946f31522e58c90f70387c004e821c43b173494e1a4f1395ca7181885f70cb0c5e1fc8b0cdeb9bf1688c17111c16526fcaba2e25e2beac9bdb4eff9946a3bd9ced9085023918287bc2be00227367e82b0afe60673ae1844848b675522bd09a12bdb4cc7e9bd0fefcf5a0e8dfd8f797cb0d77ddb49fe4949aad8a7ae9fde6d5ff96f1c0e743dee590a81f90f9a049a9d0cee396f0786112b0c0a300269d6018f7e59c4e8931231a53a024484247ebfacf02307c344ce7115a55487c0fa510d690bb1c10ba3d5675d9464c3d81ce2906d98d8d8913a395262f88189886c735fb597d4897b9ffdb25f5cdecfb994a4b2c7aa60dfef1021c8e3971500083cd19a6686f44b6d59dfab6c9c46db7edc1534d2f1967b424a09cc3b9028bb8ee3ad8c2316500ec98296e2bbf981208a14d166cfb3037cb808ac15501f0642459b67c82b8cfa6593f285266cd28904419e4b46352e73f8b64cc96b3d0556e9c8967477c1656c8cb2f7bf43cbd81324fa02479167c7aaca412113eddd5d5f2721065598454b38c91d6eabab0090842ad5917020b9bdce0cc585832b2378d2b9171b2323c96e4355b19584eaa7067b479e8285a19d401fc62fbba5a81a54e0b3da72898aa721a2ce648d9ef0838e3cf9a8abd814321065905cca3a7750061529deb5630dc5c00df6e9ec8954566b759985870d7dbb605c4216851bfc3c8fc0830b172e6661714e180b92585a2ff449205315066f3e00810a09b825fe7b265e9de139e1993e0a675a7122a8394dfdeaa791d8ecfc4cd6df5dc1e27d893b09036cafd10f76393e88999109ec0dfbf1d3a2d3d732038de863b4b2cfe26e6d96475d94485e7a7c650694c5906d461cc9907d08948107f9c1f0ca1017f2966f677fd3eb485062e8561da12a7ddc77fb56e9c768909319914773d3d2fd0e28908b626e577bb5555c8c88dbe6648507763e966159cd7223981bb6ded95d323e594f32e78515246ac6b23b23cb90c686724022dac0297cb40aa6f461f4149d0d0f2dc149725b0bfa73a25aea53d6f71e31ebd3809f82e558ce1e62c02469527d3612e06fe0b08440e2591447b875cd06d019e286c510cb1892e1150cd5837e5a748c7f5348d9756882b531409e4a35378fd4830fc3b57f10a576d285207b450babc283d40bf52832b3e5b00b72bf8ef681962bc2267253882945ea12bb967318ffb9d8342a00ba01730b15adfcf3b380ef12f9d1f19a24f3296a95fcd9029c18c577c8f82cc6e5b03ad32639233734e0d2669924819f28401667dfe0cedd13c1e66f8fe1dfb9cc482e8d398285699e2abe4f5f830d6f35df01c790500a00cccbe4894fecec86323d1dc31ea71bade42dba4e1b0201814414f8f561acd58fe8260614756c6431a9c2883640fe6a1f97c409ffff07926091bca8d67d89b2b007b387e4ecdecebedc2339f7964d3b307996d5275a398748da59bed92a5bf59b28ba4455dad6cce029aa947631ffb2442c5400b439ce80661d123023eed42e66f9faa2b6275ddb1c1a7f1573c52cd05fb4fe5792f92411cbda2c937043d81e373d184f7f24620fb8f999a08cc768b0abece02771ff1833402c7eab7503c83742056462a0825850ce2cd6dae300030c07f6b3dd37c7c69c5f4487798e2905139904294f19325dbe8746a2036a89b1f7e6f1d3bed2c597ab8a8c778fad9fc5a3f276d56d99f7ea24c6d44299a799f4d44d9c6ced9c068092aab32b2f8e21b8c47d7214df64f69a9ac24cceaa9c588ef9682123c4e9d89108cbd0751fff18f0dc4b93cd4044a4ba9096b461c87fc25da65d0f949c846d12ec1cc6de55e98178eafa8a496c043d750240af8374c33133b28fcbde8764ed4786903086a5cd52bcf3903878f7c00ac166634164748d6e7ddca3f5aab477ead18eb3bd38b2ed19ab2e63aaf5bb57062bed47f986b27e81866fd5ad096c0f1e6d5ae654da5f06054533c0bee5a2ddb7d275143da68f606da6ba868f3314bc8cceea9b7430a1e55332615da7abc983d438adfed27aa8e5551513d48d4e7cd2e79de38490e381266f623d6b17c071fb1f038735213eef3c49052e7902b24109c8279c4e999ed1b88c0dea4335ab0d474b19de3b1addbb3b7b27de34d851b0e116e3ba4b8591df4a37edcc678661bc97029f48f63104d49136c90a22d516f714627c7d4264aeabf2e1a2af5a49ebefb0d16d585ace5b4dd7d60a8e1e126d1a47d10afaffce1242a7003e44c127e6099d014a7d9da97cebae69373588cc582b0f31fe4c5fac754d067342a6b51aa1dd21e13d3c95ad12f49393606c4108d30d444f1fa9a400af6e407a990e9c2f78560cf3042b3c7251cc46b3ff28950fcc8a1c4dab40fe15db48f0a05cf6d6fd99d5cf98e7a213c08a33f2ec0e06906703ba4daacfb1187cccb1b0ad10ac6feacb2fcf362bebc331e8f5a28516f1a640f3bc6b8e0be9bcabbe06e114894a613f1407141d49649f365c73ce5d873c8fa8130864bf401898f157ee17853db606116cd1a28773f721f030eadae72f571b2c33b32c069010bcaaf98964e38b6fe2d033a736fa0a6c0b241ae0cbd7f3ad8303a017fe44d35b791a9f1f5413b1b6c17b663bcbfe3c8be9c93095a0e1b0d8d2d505bf9b6cead1f41fef5dfd4be944d5eb81d4b27a7ea3fe3bb36d25eb6988ecf434e25d15e2d567f25f89e877a1a6ff13692f4533c8c3a39f625e46161dbf650135579ccc19193c4a55fff77b7f622af52b639603cc10704c6d9e5fbaeb7993fc452ba5502e95696d670c7e5a6a0409f22e3d28fac9fd46fc88a4d4d2bffbf26708986321e381a9bbf97ef89f233df12fa8c9c70067905441cb862a9730fa706d03ab96f2ca4a237c82ae9c114015753f7ead5dc073371a71f22cfa0e68977a390cac8a756ca001c9d3f144c6579b84fd0bcd11c5a95492f1bdbc5fa9d8792b2e65c24612d4df26bba45b194819ec9d727199beed5db9c51f98397070a084efe4b16f13d145c72fc335f0758e8aee410e80ed808dc5d9d5fbfc5cbdccb8f79050fbff93f4f87b7e8d20576e8782fcf2ae591bac1e1ca1963d43bae59ee1fab7bebfa70781115bd74c4f3e709ba370035f2e39a47691c6b3355f39c59e31fb53414bb00362d62aa1deb37b8e0a81f39d568d223e457388eb5ab3326f9dca9a9bf3be0b626c974286e86bfb2018a3b0ecbf4fab2c15aae9225025dfd6bcb66c84d8420b8234e2feebe08c0a7a2a391020765afc17a94b8d65c8a0bb44fc17a20fff314b02e037a57ea94e0e5ffa8d301bfb0ec1cbbf1419203edc5d2247536b3d666c57887820808e62e1ca6e3757b8826541cbf233353dceca07c66fcef01be09a4f4ee4189fc36234c6efc71a83e80a3f4e3292c91f7394c598aabb2359552649ef7252328209d757e3f73d30188453c5a863109ef35beddb8313b3158fb9a485a169dca10d12a0f627bd2818733b47fe3834e9e7a9c37afff1824f0269f584726cbe4bc039a8eef8177c6f6c1cbea32afb783cf1bf31de94698c15bdc09363db79d241a210a473608d430fa8466b5ca4bee1c5a62e36acd0add70deeb29f5a655e8349f32b3c3fb4dc82268f17c5d1feddfe0e6bad19f840154cea5d750a0608b26b9a36120b8b5af3013d2e9f8ac8624a3c786b19ff1b8dda2a2a64c8ed279839a8e58252e705bd54dc888ec968c8d4c4befc1564457b04ae65492da4a7593df8597df255945c27c606248d95852eb65980fbf91fcd09f2cae2bfa6d4bb4b392e035255a1e6a9d0f6ae9bcc7b4288a9b50e0ae658ae770a74a3e987364e7230486e7631e21ff5f677af08303b328c04dae3ecb01ba4ef7248a0081ae925ac5fb9c7b21992579157b9be0f62ccc7dff6ba6fceef1be496ab27e04aa92ddf348d8497b2170263aea976c725831f5c12ff4451569488f284efbf6aaaf286e71919a807300e196ba3ff6fc0d3459312694137b696ec7c401bc6d049f2c46093de76544d3a879502fcd2dbdacb9264dc5e1d53e54af934dbe7d35bb6980602c9b695ba7fddf660cebdc6c31991597efb49124c802c28aec858ae7975c7e70a654127da26b87c26d475efea30efd55a69e3fa75d75c8596a0789a4c22993b8e9c23b39e8af926c6ba14a0a31569aae88792b09c71f1c8a6fc8d2068f82a3717fe3c54349f7a6c0d23ffe1dc841e063dd1ca442c56252bf3e71851eb4e0ed01d1f9a8cf52fc20ba9dad5b9b7dce142e1c46ebbed0277748c6abb8e84a4713da8861a95b135534467ac4403e49a8d9d2a47a1307da049c01ea83e0de9592b632f6e254ead7c9c9a490140899c17b7569b32a900a563f8f2f65ae0987e22452010c5130bc4108de8ad292194fbadb4dfb070cc89c5f220870cda27a8b92898afe137a7805017aa649c12aaf1bf25fb5614bf22c291e6234c80ebf67764d6aefcf398814a4b2ed6e7dbfdb827392e44bd1d3f8d055451a1a65f85c2644b0895a74425c2075ce3c79fb04499bef6628a436614e1bceed7122ed35386c26d719e940515d2818e6e9076b6b62dc785c6f9d163f4ea337a00ccee81beff51dcd46d01128814d5ace71ca2fe787af8587935054ecaedc8684a2743d2cc182fd8442c3d7f35129852a2da4e7af51866efc6941acecc017241e4fc6a7818b8c86d7567126f91bf3946a368fef6ae96ef362c7c0baa9bc44ba1862efa6912346f4fd2d5e4955aa929cbc183540d4c90b05ea39316b4cbbda53823e3f1a30f953ecd9e76059870ef22eeea9f6400b7e4f8aa49be7319910a18a5d4acfd83a57627659c8e3cbcc53faffd25c447f089c6516d76092ae67d816e16680ff665f00ae950d749337193d824db4f01ad14f89a2b853d8b611494dddc3304fe99902d1c689e2a47dde01a98e3d5a0c4b82e25a349b3083835eda6252b2ecc8902f41fae7747a1566c229d9421c97184ad26c0e9d856ea886ca75ab852c4699d81110df858b846580c476c1e14df1e1238abc45cb55a28c03e790b41a3846ccf4285776d64f4ff7c0f84c1c6c74cd9fef087285de535ca3f11f0080637981f960574b1eae4e1887a5d5e61d25fe9b08fcaeb4251e4a9aeda6f6c4a362a4f2b2f1a74eeda26239d148b9c23839cb2facbccbd8780eee1e9a19a8cc9a289f97598d263dfd35ac8a3977296846c32f8519a8c251ff68b48676b776e1af6e0a414bf015822532c02ccb9c6931be079a1cba786d1f24cf305762c8a7b2ba90ef7694e64077c3c2661dd8d985d8ea398800a1897f64c1d4abcbd30c6f16abaed1299717b4c8512b272ec8d54f129b7374ce7cf7dd24357763dc9e5df30da15ac7dc8789e2220ee01278da7a44261d17716430b26926564af8edba5458b6b4988eccbadcbe259d6b1e67ff956f59fb3b958d406ef555bab7efeacdeddf9130e479cc38371e7d847332de16dea7344b1f8f3b4395d520475bd79fd9c01a46baf3e5e2abdd9e4129bb2db26f7b1859fdacdcd65a6b70f85fb79ea2d6cb13656ed36b16a0071aa0e25b6fc5579a952e119116dfd27aedb19d350c3696e02fc63c73a56c2fb3c378b6a92398631a0a3098abd8a0f141067ff017a76bce3fdca55e44f678893111405e2e7e46431b47cf2ebae9e97de344faf342d42b523ab44ac055cac199e2c26662abf5c8edbb60065e20e1fd45f1c47fb5eb13100a89ca717a54d42fcd6fe39dcab3cb168e139f41222b2459949da9dc8439f8229054e874f6c7a99860a9ec63a9c7cb3cede3b321e488b561008bba399e137ab338d819aca6e6c62ce0c045376dbb1f9291aa1edcbdda768c0caf02dd506018f3afd189c2e474e09b2b3e2626212830e2864e423a51b8fae809607071a0c0f8db975398dbe108b0330b12493db9c8f75342dbc6eb5c54ceb5728426e2f60946f7a8ebe31b76a9f661b6bdd679e226b31a916603f87b92d8ba75a1dbfaadc5844e1a5f9550ab50a79b4ab554ca1006b29a69a39c918085682a9004e736a334eec34df09b42f28a285a6454e31221e032555bdf1346927cee0b2e93e1f9d2502eb6ecbc29154170b39640d9b4c4a2accef122ced2ef716a377c3eae533d01fa8aeed3d1f85b7918492e7e229f8e6e464d40ab82601b80d2a673593122a34802afe6eef6e0beac0fc8fcdd9d42ed7306dd1cb77c0ce5623768a9bd0e3751cdcef7881c1d298134e11662b3d7a8ee15254bd0afe51391e83cca8a70a163017da91a3bb7af2636d5ca6dbf012e0b44a77ccab84b73ea499d5b27c14ddd72c9cb62800a160ed112c99aa1a6cb12dbcf6ef8ff98b37fca3662b01a2276669811d891171fac7c3e3792af0fad82965529021891c0d57ae54d5b56c3a9bb3a6565d988b06ddf2423e740bf360e0d0593afb86277d85670b331469a9fc4b56e672e778943203385f4be6ed5ecb8796b5d40319d2073f953b8e6cab4c60653a3e86270600011d5528e8b3cef2cced43fbaf2ce612eea9d5908099087f4905df6cfbdc1e1692125f245d435f7d492cd19bffa902ef2146ae0bd408cc8d32d3516a805c0157ebf43b093ae8413619f9afa3ef663f6687d7f961658bfa55966a8f1c067f86239a38f860f003735dca9dbeb3519b7919f6b91c7ecefffa059b39cfff106c5c973da897ed6a15b95738e48ac2a2856abd9ada6399c9c90030b291e5ab23b0dfd4a6f300da5b89eb977886771429b0a712dd24d5500ff095616406dcadb42d98f57f49317c1e47289b67703b2695c7d5ebe28ac00667edb1585a5d3abac431ddb5533f47dae851252320670224b67a9678618a87d51213affc579bf2e3ae6930fa52d150401928443f604fd02388306d1500106817360415d0bcca4bef75699a490d7d1b15590a692cf096568e44ceb7ecbd03ed271dc02b44f454ab1ad1b47077cee021d1c875aad1cf4aa44b161109a2431c0d6d4c001f1682868a0a4e58ab30e794bf539a4325c248f58228f6f58019f9b6f7de63eebd3d709609e9b527674b2a4a255a00aff8f7882bb5b2d1c8a40c975c48974d0382b0ca1089e248047b01416d467f6ca02f33bac71ab4fe21a5aaa17274306d88608b11277ebda71f2c960c12601ca8398854af60a8275dbed11325e33ee783e48f1bf70a7c1af4bafcad5f7182c1240b624c17f32291bcc549c7487637d4cb025323dda0ed952a0a97b9b50210a20de44eed1d94c5119982f9b88339a674a07d8b976e68614591a20cbcf758b68498e144bf2ac88808836f1fd02f34a68eede182fc165aff42aaa28e3beb6775c6f266fa5385b691d5ff77cf9219afd3400f17739fba41bfa12681d4691824cd2a96c706c6150e5918998d023b84a5a02f24d9dc12bbda90925d3c705d6f43d8da1b1779ee5a51f5d85124669d4db7b481440b92ce86213aa4d88e371828d9bab60a2d2ef5f04f71b4fd77659c34d9b72b67a5b8b0793503449187006477720250935c46a72feab52701f871a8ff5c1c9b0350661b28371e60a94a21c1e39ebe506b0b01ca816a54827048f430b8de8a7c548f7a172cf28f24d372a6efa782eeba27fd30915d05f362f8a12fab2f7b431adff6aef01b25319d3afd8356c5c92eb29ac6449812bfbbb5a8409c3de36c58a5d0dfc5c8c4bfaccc588102a06d656e049101337289e4f0fc4f2f7253e0cc326edd75509c2dedc8ce7d8c34fb99b23705f17fc57d78c9b4d11ad4bbd95d0032fde5fb6639b1d861b9e27e262ab9ca32ead72a417ac8ca9752661586575e7d22668fbb77b68808b8b7a768233ffeae423ed4547b7842de154258d2e0f314f980dd62ab5d75fd87bfc271989b4ff1bd5f4beea44e9ff306566961e55d6c6422a2e3d32d0c1f5d0bd571205527b36e853c24456d0b3d7670b31278621c85e29a386d4852904af3a3fb051e019f759eb1223d59e15760d1f0167ea114e3f3002c01d781c4d3041d255b7339338bcc86685c0426b1be30126ccf9ae308b32453a5461a577a6bf8543a320fc7047d406d8ca91d979372e977e37c4e9f79af6561d28332a08166d7d33466044fbe85daa27d338db8e87bd55d45b01e7e336b3f628cc68ba9229a9403954e745b5201a66dfd1494d62d623fd8d9cee1298b663bcea4f96aed0c871f1505d4d153bf1b6c7f131ef0c63a726d1f7cc1619b6c7b3bc635dc00aeac45c7ca5d47c77c174b582b8d425a7072f4a7c953c079c6eb85170dd1e75a06812adf2fc5d8e4dee5de179583b3550a667ebf425bfe86094958557099a2541918fb62db0af6cd00f470b4b4d20ebeb971fcb8e090f70acbbd468b9d7c51ee37617ceb367c94c8709c25c65e13f2c9122ea78641f7d62e722dae9ea2ac18632b71efb1ee00bd9063ca51b3267ca39755c1fd91faf42b6e21100faded67bcb98c03feda918d371f535be4d85845efdd5e681d6b030c9c83dd8a96b1c931c1cab4f87a2e5d8ec50a89211912382a3c283624144ec484a2da0295f13ee46b34af7a5db5b52a89f60851f9bdf756cb298dfa2c019702be9ec2677069c2753bbade584e6aed07015e7b2d76d64e88937b759da7da5678d6a2fd817a25dadca282af8e3dfddfc7d1dfcf34155a7f9ecf7e7a2d937f8cd852ff819c6a1bac1bba180ba2e616fec5bdd9350db1b42f2fb2e771222ccb806c78b051d2503fe4c024aae43af4d3b76ae1dad4c955e97e06ee8563c4bbb8ecd5091f0ca444bb0a5bcfb31449cc60082e86e1432f64442c40920b6886fd1be51d3f5e3be1b9bfa8293871dc46ed2e8466c346fece910e83addab156dccaa6f834c1e624203115a467f9b75384e6efd87f0c841f8ab67168e2c73143d3e06634aa7a677a2281f6475a6bca6e3721827102c6c683e79f209494ed3b723558fa428e3c39f9525b6a40ee79f357c3a107b34aa4d69137e91fd0e80c7bd226a11443a1817f827f88e52317b611b6bd3b4c1be7bb8f450c4038b494f0cb0cc6e1a9536bf420ce7e4b8b5bb796ddc77c22085c37ce8f6cdabf146bdb9aaac9780e7068eeae7d43e93d0645b1389c40f061b64ee8ceea59154528dc4903592ebae9c85181763b587fbd4f989f7a9abe35da34f89e8e101a8823e4749d2e805ca1da1112193b13f5e21617ccfbd0b859575f255c0a73fece5f49343d1002abe128ddad66363c5142241601a290bccbc8ec184b90e4fa18564c673b0c83bccf4114768933b528b2183619920aebe5b653fd290082099cdf88d8f2a4d32ff0fb4b53df6ebb6bfa23b446b26ed92a802d6ab6aab49cbb4ccf3daf3f6b943c64ac4c803824d2376cc29966333fa7a5b9f1d32b00394ad28cb74ee67b0b4ef5c8b7d80addf0d2e62fe7834c4aeeb7009a80c0049bf884737e7063411af767da7dcc5ad7f4ec0ccb4cceda536373d53519af8fb11bfb2dab2c8d25754df675546a6b032867ad1f9f984d478eefb57abc0a9415976499c2ccc0120c46e9990e9b118894062df3f2d584db4541c64682fe0886c169804f3b3fd3a23ef357e56db5f2a05f694c7a938a8f2a6af52bc401c19d68874925816986fbe7614e1831aa9510a94fecd214492375f9698ece8c384b3fb045a293957f42507f3bd6ab137495e67a22572314b898856ea1c7bd4b8b8994d3435806d6a195a78843d524e443b1daf36469f7826e26d31278c10c8fc872e48589f7a46a708c821ab657a65d46dfeef32c3e11d339f1ad311b849475259280d5b0d54937810d96eaee9aa7c1bfffba194ebdd9d2e63d5f90922b060ba7e4660c8002dda49482173f5564e8688a125cda2a752d4b8b923fcd77c6a9a59628fabf5a815c6419be6ad95f139035944079801972f5967135ddd4edb727e8fefed6cd089f8838d6d4e7cf99e5d13b5b14200637c7108b3599275002b617a69e788a253757ca1b690a5036c413e2787c5e4b60325568a6cfe8d5d7458b06241c06e7b854e0dbd578d1449d526ccbd848c6d4bced06ea7fe1c0df7cd33bf704fa06115697dfa4105a60c33e776b4a092a36e8114d5f8890bd0a58790df71bd9d8adacef44163811b4f72ca31cf7757dc8f0fba9d4304e51cfab91fd58d7c762530d41819f2e06ec8698ddd1599ebba24994b53e1f9116238cd664827b2fa2ce6710847c545204ef0090ea445e0c2d746171edcb3045e1cce66b2d353db3a510c815388d558ec8ec78e5a37a63fda6df5e7f55068b17769d4fa6a8e7509b8decae119d8e928dc0363a3b8a2d630f1215a638491846addcccbf371345ac996694876bc358021bba4cdbb95e8f213753de529b4d546df6ae2f344a433b8365769d6f79858209d77787f574be51038fd54b9fed8690cf7ad0263302dbd98b790689969869068c91f979c25384616461fc8aef8fef8c871b7efa08ffa839528f9141dbcc85b43d22de0d71814b93a680be513a8fa9c7242e67324e4f4e1a441ed07a2faba46b4737f342884c834d1d65df1041a683a2b0d0e396755bf9d1f71fa485f3491c6b8227bc48bfdbbfd132d34a42c732d0be73ba051c6540a66022acba99d9794cbaca9dcb91588b1a6f66a38f8debbca3bcd048bc2191d0c6e875143460d992dd361228e96ce18980aa3e32eaaa57966c40335aeb897c63267e04e6f477bb86dd8ed1359f8084991aca65fca1b48ebfafc17d00414a0839e76cd37c404565b6e3c1b805e406e43c936c7fa026e7441a6867259797493463ad32cfb9afc27340f8bb752d19d0624b256f74564022d9e8e6ae78e1a70660b4452647fb1cc48f576e66ddef04865e95f0d3e11f3cb7c4a5ff2933a0c99d7330e7431846106201c6716c0d388b39c684198362755f33d0c409a42e88b77082e12bdcf14462cebe7f7470445763ff37fb62052a2c2f5633cdcb838b2d8afa37cb55c9f6dbe8e2b6218f9bea6a18495fa61d4540129db92dc052f3ba1fa5e60b342a9d356a52ea1acba1471c853b5300b15b776c33b597fb7ec064dd92be42e6aac93f5b9c94e45526f2ba90b5de2647ddfb059a1146a8b1217bcfc74caef8a5d0a4d5d0ba51739ac93f5bac93e48a6d669087ccac995cc4abd41d513c66fe678e827595c90acd2375279c6909b1903fd29864b512b017a9e2c292731f91b42de5e78ca75f57bebd9c445bca16490b129e14059a254fdc19df894d72e11fdae4c10b9e2e5cdee351a9f22b9540915da6008726b095272d6cd5925f2ff7bc7ac1249f0ed6e6218852de7b5a71456c625771795a5c1e23eebec875d346e5e952c1a02063e88d33a460fc6efd5b175a6ee95eb320510ebada23d36ec7a25a2759fe9a222c2ffeaf609f5447bd6f0ea487a6e48c5454bc8dd0280f28fe07e00a1dd9c7a8ebbe10b44a64fb90a8d0959ac9e133d881a186816ab79c40e3738de65db857f4ead8534c01484142d2e8465d13daa580ad3147286e0d365564c581630e2a61fecf6f4bedc1ece9fa0be0036c1e8034a5a796c4e552551ad9882d0710a211f64ac358425f12cfc8b6cfbabfb480ef6f4d37a29370a00ac24a68a8cddd2dd4a44a96f932e8e1edc828b1d5d0d4c920c7422f297649cc694e3fd522a00a2d28a54f3162c54bd827da9ecbc3ab7d95de5dcb3659ff65c4bc67cffc2b318be9770554f3558eb35d0a1bc34112923ea8a21d789840c74ebc2314f16720f3a1da9c8e18d54da80d13d119a31865d546485bcc06e359e473cb0625ad06135569065340d217f4aedb3fd8f632bb892a5c6470ebc3ea519da5c5016079395d5342506cbf6b6ad16041ba00c9f8d4934306cd7b009b8960e774f2870cbbddfc37a0c67d17199014ef4847838d7678a39bbd3c9c528c231e696125d03439429bdf369078f03fe98735611b68a15cf952fb32fb0d60f9544193ceb46039cbee4391c80362c9e4b276ecf24e3cf1db33715072badf762de6d04d8384b46620b9f18bc8e816cea30d7b040fd6295f6725c90176c10b564d0c2d43d9f0b70101389af981c7784f03efd368b4ddea6e41a85fce8c32796b6269ff642c50d908e06d3439cf27f628dcdb93f8b47f021542c156892f25778a5fd60cc8402575a2f3c535c1ab0523611c5640ecb8cdccd3317126100bad0a0e94bf2a36cb036ed1aa861699aa12d22d4ac17c9cdfab15324fc4f562f1223d632b06a5911d6b51c4a0dc5bdaf14f0359394ae70b2a1f452944d560b2bf503e8b6a95477a1b2d6a641e572e7fb69aa27a36474c83515fc11c134dccf32859140696c820230b1ec330978827565b815af46c03f9b14e0a11d9177e13ca2d1f02b39716dcdf6f147c8488cf482bc1ec196339e6c68ec29a8bd44c8fede80abcb6d8a3665a5be58d0d41787e0b7568ea87dab4dd8b21baca415cd0d668b8b9f8748c492cbb6d2bb2893a8b648f32aed48cca769693291e44cad31641a583e01e7f96be661cd0faa0128ae64c5215ccde1c1d49dc83f1276db512e5614be74d60dec1748bd78bf6aae2f86caec795df8e738d0511ae19a2b179de91697ed52eb047a0d426375ca794304903ea763d4ad0c2400d485ec5b9826e4baabdfaf649f91625c88dea6b99387296704cc9b51c903cb60f25820cd37b891ab05d77f41c92a1264c438970e97a7dc7be9f1b545d3ae6b3276152c298eeba4a5d2b946c68eb2fd6ba5bd65a35bf31a47a6ee7bae6ab727a1fbe7f1b19baf79e6398f53918ae8656b2c41d1bf6f9427068a8e026b023305b9c30961688794778e156f5866edc159e1c4505a36776281cc8b05986f178e75b908448804b60d9e0d4a60922581dad236ac68dba16006a815bd486463c2cc462f5cc716f1d26bfd2edf426760bf49d3d7d7dde7fd51f56089d4c68a2161b1b9185f74b27a1d731835bf9b651e0e7396403cb395dc7747c326c7b6e5a4f48d0c4a80c2280486934303a8f965320afc77a6a2d01601c8ad6f80853e3fa874d57cd76681fcceb52dd007a3bc022017da75c02a8512fbb1a5facdfebbdfd2ce6ca82762b2cd0e0116c8ef2b1bbb1eb4befddbd2b11546b62d2f61d947403f3a5002ed9a7909a231843d82a5ec3bb1ca2a80018e4a0c04c10173568b1a403ae3c6a74414a1a6b1421d466a9c2219a372b8d3e600771abcc5c53b1218653d496a5705123c301367f5e5194da3be20fdf52310dc504770af39e76810152232d71f107cda6c6f322c847a172ee526efc28ccce99406684963385565d93598092e9613339ad5660a22d665e5329dc12f226b46f06f6c194401fb43a9d99f094d40214970902b8f0b1994e5c10871889eca4922e10ea74c3dcede700f745c5440bc90062dd07e3ee3c2ad81b5737b5c300a4aab3717b83d0e90d0bbcae39ea2afe19721444742129ccb17ac3ebd5927ba7114a06cb83209b9c4145bd97524e22fea23ba08c58ae51b7d9f381d443d3a90430337f6c5ffab7582e66e9adec0b85b42238091bdd9b5df1e62260393368d9eb108249d12db23592d91843481257e2d077b5202ab8e9462553375cba604ccf0a79ddd289bcbc183d5bb5c777543ccc0d0ce15bcc043eb7af82925d70699ecbbc7c9062af5d0ac5778914201d5d84fd44b2be364f4cf2336e8b248996f3081dde19d5568684fb1e53fdd2347b1628db45035354833d44e7ce1874c4354110e771004e369d74906d2adbcbcbcec2da0893bed60114be201a549fcded8bfbc017e8a35c566e0d5646a39473528fb314a31e6f5ab098282c19e53c7b3ad7f384d34d26a504f696ff7adaa8bcf4118645427b193cf31f26fe1547db737b2ef23c307f6a03c42c29712481f36a0e26e29f860a5a356e1cf1595e860064bde626e1693ab5f10d64e9dd0d66b76eb92f272840605704a7c5e045b2089a9d744e3fd135c14abe743e19f30fcaa08f9f80238d8744fa33a3357d6a7e14c6eab121e375ee79f6f5775ab238eebbcef1f3429402bd7acdcca59b06286f7b3e6ca00a889902b0a3c0ffede7781e7c24922cb3bbfdd78c9666e9444348e53d2be90889ede61db5330fcf8e91165d0a641156fa63ff238a47ec042e8768c1f197bf948c26bf03f7e61d6688f8867af93dcbdaf38bfb06510cfea764ca38d33c1ded055cb89a1a48c1ab9a2286e8ac67dae70ada0df37c9b2ccefb04a6a0d66c81f301cf3950c1bbf2eeeee303b658ccad31240873b0de441b3595d968ed081ed59183422403e7f98adc23860c30c35cbcecadb1832c96b61dedf55e4af242814180d998eb8af605c60c44360fec3aaa35a4b7dfae3345b732fca4efbaa19e462606d96d740137709a900c6ee4931910bedcc672b8b04cb32e44233f56dc94a41d98c3c104dbe5bb422589e011f84a96f17561281c63522aa717e8fed5b723e277a8ba5bc89e0eaf5d003b4d78d10f0cbdc1ed6dfd78085147e79cfee418a9836f0543bc1b2afa18216bffd754427d52b8ce92578716515333358e685ea9c5641248bef77c905202702a26a4eb55e20e2639267343f1bb9d4451a3c36770629c9836025c17a9cfe2db12e768e07c092a418b5cb5442f4b2470d73e6ccbf7b47dc80a4c86ded5cfbb0cca6763a7db82e06e9be2ea3cba2be3a7be5fab7e841b5884c0c851fe46fae6430a888f937652df689582ed27e0782d8d96783f2416b1d9b656c64770f59a9da5d265f7b35d3228f80e9ca7c031fa28b04d346b94a71d2cbd9b8beb5cd12e351bada8db149ca8d7543e3cb231c179c4a60be6a42605572ef8c7ea2e9079fc3ba04e91df00e85f60a30ebc282d5360a8882301ee000648ccb937709db5f121587e7eeea557d939e8be782d248308e8ae907b9218c9dbd4a6371e2d05e752fe094cfcd1bd8dd14e753c2213215b24dd3bc44b5b318521a830091d9be2f0751f62a8ba45309626269cccf8b87a7f4d8df48ae0b6f6bdb0e0d227abca583c211f37cf87f8c4827b73db5212e02f8d89e4113018411e53a6d0c7f1a85338ea179f68a263752bc6b78f5878009301624112dca8c5df5aa0e8b8502ec0eba4cd04fff069c60818016fde009b42af93100ac60e1470fdbaed6b105924f27dde6495e1474e3614f276db9cfc4bd9faa32d8892975c6bec83e516bfa7305cca5d6639ca99d1b1223e488b7fac63c7b1541e8801e0d0d032e1e14fa5afebb4c6cf1bf7b8d76d92f53153f5a21c84de1fecffb127f9f9548b046e715e6c34efe93b934e3c5ba4bfc3791614ddf95cd828f788a2167a891062bc0a84518c4e5ed3cec61b25299558cdb03b9ad65a97d653e0a07f0d868dacf114aa312badfc5c967842695cd54d66e2a0378200762d521432c1a8670187e382fbe1c306717852a1bb0a3b7a2a13c891b05d942550983fe64e39da967c02289ca1b1bf3c71d665f681ca36c8270a97d432d3d3e84aaaf85ccbae7a52d106c4ebf780f4ff001eb16d756efd43f543b899d840e4fdc4746bab0d501ddb97b4b953de69ddbe078f3263a97d877b2b141edcf99b2130a937e7a1a80f627ccbad3cee9a7f1df52db49c9761d66e415310dca3dacc7f4403412ccca09cf56ae13215135e8159871d2190f6cf6341bcff1294093f8a93bebc0ce6ea2be3e5694bede5ef8cd829ba9be91597c1c055946d389b877438b336c32d525e9487620754fc913e3a437940c6f54fe42b4cf8b274f45f24d6b60475b4b421303e4eeab5797fe7400b36ff5eacaaed628d476f619a54c2bcc002676850d726afb29f183ed20833ac2776a2e285eeaeccb31f8c4065131933696ab8f1316f2db985c5539a300ff22759a89b0b5359c5f1ed700ac72874f0d80a7df8a482bde43ba0cf99f6eb51c749e9c9d533fa05c558cece71897271063d453062a16634df97d706be76aca848327d6014ba8280aa9d19b56aa8fbd33660e6a1a41116d8d58da13b2e0a38e1d7fc51ba0e6a0c817c54f195d4e2e9180e5bd6dfe5e012033bf4031524e84247a18247a973af5a9d53e14ec0a21b77eb6b846b367efa23d5c940480e4ab4474030873124438f204d30401db2191031b1eca43f19eab54cbfd9689c3f848a28d1553c8dc0cf24a9010135984bfb085b12cca5614f473cef4d176701cee89c924746473b494ca894166fa18cf7072072677bc4dc9cec5de1f2b0f1cb38f258763d4d018b3eb222511252551c76403e7d301f1a602b71b57c48490dfa91aba51d913119e2ecbf68ecf58ae88bdcbad6e5b933876fa5aeaf0141da7c1672222af86264e9cf698931ae8d5f9f486f06b50488653b1ed2e8812e804dbff33e8b9c2020567a3f94b0c15ce61c09b8f7a7298cf2c067c541162bc36e67c00edda81e1aefb884e2e20e421422d9fdcbef1abeac3dba4140367aa27b95ded05651519312a564d689e6f53826a76ffbc05892c4b7138381223d5218d69796a76807d2094ce1b02b8893c7d740538a33d4a14fd94e82bbbfe508ee52e272f639419f34fb2d348bf8e01a3b115ff5d071e5a3969453522d6a8b49592a57ba804f974a0e975624b5b99ba88fc147d2922d6a47c3f0914a086697a69048c6748dffea85e042f11c2c25686af4663ceac2b395bba457112f91881ea36d09358569c902630b619bd1368e93877b1963d25e02a637d2124963f7c3746489b310a1c7b92353e1cc492d5d370c56b0cc73d02cfbf5ae15b79e908c4f4898d31ac0000a192c57052e1f2ea63dfdd34558e1a654100c8a48662ce2044d29742ecaf2c28a96ce331cb0b2929d41b095c1d8d5769df370a8cf6a171248280606cbaf7e216c4995752325996a4fa00d3c599e3aeb072d7b2222abdb0a52bf3ccfe8b65a7fcb40a4dd4289fe6e119aa869ad62fa5404e855f37a278550837d0465db49a70ea9c88749154f405b7150125240b1d5cda6e23b413878c8ba4436978ffe81ee3e552a9266b3654a2e662e545d31898d89bf986fd3b359fa9db5330e5f1eb9cdfaf06a713ef4a6890bc5a50356bab45c486f95aefe9ec106dc1918b15eddc8a87fed534eb9e2f90913b325c6119c4c8fda61d97b0458b35e11c923eff73485b01147a89a1b8c6592ee3bd600d3793d0db8ff5ffcf7bc96177e4f25602ae9bbb21dcfb6f79abccbe3849281be3837a481081f247562467cb0f9137bf0fcd652ca88ac104227c52d731cc032cab5c2c2b2be4a6f6eb748cb93ce3a229436aa1cd9da593ab3fb85bfeb37c8a3b99565a531ab92c1b1a26cce2df78bb0991904b3806610df902a59210e8165652431b13caeaa530353a5bb496bc7d3ca69bd68059d0704d678acc8cf6a0407ba2e25fc609033850011abc17caf4955a8ae2d2b4316690d4957674c0ca6c51d5748419f038006aad6b52971c63592fd7df165001648b021f9a77e0910c04e1b6dd93ebc77a163b6cd73324d7067d578be5d6a5c9e87a5dadec4c561d133b06d4c0a1aec143a14308db513f084e07081971667d388afa9df22dbf256f9c6acc142281e485fd987900b1a1a0455fbc902f5989f2e2c243e97859b0fad2fe8d11f489c09d0e1c8db046403914d8905de5331cd6254da585d8cae1a9e7e1e4777dd42e5122fbc6b481cd541dab0869e6790d43e900d2b439049f970df8358292696f75a8ea8ec3df9ba96e386bc52e56bf9d89116b7cf3f387a988414610064ba6e3f637998103efbd1eee9cfe3c8340c6d9b9785d063daaba99109c02e2a4e4fb83fc0bdabcd703eb71faa02081d495bfd5e915b2693a234a6b2ee8f65b832ab7ad4134ec9382af2a2218b101287a1c57f71f38d9a2565da934c352587859a85ada22d1e556fd96a415d58027f408082431c086329eba775a0abc58f0cb2c448e5726ba1954db757a1f5090b6b4cef11c5e52b1ef8f4dbbfc57e1edbf8655f74882425130ef0fcfcd372244e0411771e1c308eb4b6177c08bef0d35e89e15a0b830740b3ef74c157bf0cadc2a85e77b90e0e2780debb56c3fcb0ebf0489e5a92c2a0daac6208ae80a1d26c2372cc36927e2fd2977b10da9cd1f20a34801a3f951b2990e1f8d32a391787fe1731058baec08264c525788958d2fc5edd60b02c10a0511a03da2d11af9b008a585f98cee2f0351292d81864398b299ff534dcbea5788f84bd8a5ba466680044a144683f86e83db353af9ff072364009a2e0f6067cb2f5521489eedc8aaec783ae3fcd720e8eedc147a8e34cb167413cb056c38e747ea4e71cba5d1a4643282f1b84c664cabc47a7e767908f5c205d5cd9d74165ae353b043273d077aab1ac025b945820586b3c998c64b1b006982b431963942fd4ade8c1caaf525f34dd04bbde5c1f905a7adb51ce174ab8eb4b045fc3239f70a95ccf7523b6fad7e43afa26313462908feb2d6b7db7914fa8b6ac973c379684d133366f3df6f7fcf680ffb1d9abbd0e10b132cbac9d98e80f369cb37a04e2afa4837b987dd5f943c1c4d272db1611d6911b91eecc71265c6ac7db06bd4a4c56826fc13ff3bfb341152f0a9f3d498742ba7beeaf05b8a348101e6defaa7908ada24fa4cb00e325041c4a91f9e7e7db66bd7f48ecf6e251b8dffe1ff579859030f57455bcb10366c0e9f960d2b4aab7eee1abea4324b2d8b679070de92d2e9c903cb1ff15916bbc2da4ab8029128da753ad7fb074cd10fdc5cf566bbbd400f2b787520b0f6ddbf316ddc8096b8a9cbfcd575cc6a8b9ced09d65a2806eaf2fd44b5563dd428248bf189bc532c1af516b0750a8bdffc9d13fa42609d5a49018ba9169e6e78f1a4c987799f29a362c9c855cc9af630fb001b96284bf3ce9175abc0a8efc84408c9aeee625d42618b38ffe6a115c96caa35757900791e370bb82fb97c5d9a19d36824fe6f95785ae2fa6ce95bb28faa9e4446bfcc2edd0feca8057fe640c04bd8bfbdc74a82397640d5880f99044d107e3af28c7290a89045d1d374c33cc7059f3214a1ecc31c854694de0d0d4378b486a1c314a4167b430683e4ff6c147fac071ee40911e383b7456bdc5eb3b27e137b242ca0cf44ef2c6e37ca64f42dd2d4e799aa728d6202e9d799db32b96a4363772b63607dd272e36b1cd471bfb63efa40fd98dc83ede95e27e1c5d9470f0bb53a0d94e5f4da6287c39dc2f34bc6428dac52f8c60f61fe21dad8471c0767ab872b90cc3d7ea3af7034c8a11e93a1977f7783923e291d740a18bdf1da9c72de0edda50d90f1205a442e64170aee040f30dca2bfacf52cca113044eee43de6a2db075c855703185b30d79a6b892805e9831b4c80942ac4dc3c2521d5813c884475c3d61e1c3159eb8b643ab7010c7bddf3300766a1329ccf36b3d00ec345d4cfd7c37ec6a310eeade1af5eb9ea269e764a048c4b44ada4943c2e4b28536a4152e5392b01e305b0d70f7b4214492e764004f88564372572913ce3244586a32a70ff5393eaf130195531aa95f8030860ef71143233ad9752b30451bb7fd39455eb7278fc47f8e17f181f301bb5ce02a9b19189a20c7a66b4eab5d158cdb984d258839859ce00cf53704371aced03ad453fc52d9c4ab200af40f3a6403c56cae5e577261eecbf06898cd9141d985821498ad0ea967396854e602892e0323e7d319b12ee41deed1a99b01fa1c73e5a0bfa483fb5984388b4293f705dc3fa81f30705e14f13e34b07014afe6a16ba52bc524220cbaa75fe2560537973446b8ab589671d89a3bef69b6c26c7fc15f3c08937829302689e2b70b465ffc4ae3d4f214becde232ae412e47be65f798acf3bedf154a96c8025ea0c542187c918ca9b6c2bd67b4662e39c9848b4790fea68ff3285202c6212f8d6b55d4899fcca4caf84c85fef681e58f2e540d12ef5ae4a3d10dfa1c626e62e870978ba420b1b07503e0f05e93188066407525ebaf26a7c6b14c881742e7758b8fe37f3e292363102abf655cd6300d923746dbcde85e2817423ef33ef3205a592678750c543802c9acae32e804da220067a729ed5923be92fd80531489f2eef1252ca61bd80a9cc6e9634e3243d049fc58623c71d4abd3410dfe6158e29654c0b9a6a0d31f0f10acf2f01c4eae0de762e6efcc6858fe2115d3b362f38563f7fe93704fe0a36b4e14b605837f2d6cadb7fa51e4b709cf6f30d1de20430ed67567d58049a302273a36012b020acd0bcd255c6cf92fdb1c855b417269027856791202e591bf01ed8861e66404ea85cce364e4ecaacac0b793263eb02ecc5918b4fe08ac4bf63ccdb7e3641b2adcdd322829b4858146b0df2ff4ee9c27111157000d91136df7833b49d0723b49c881a9eeccb8ba8f69b874a065bb0338ec2cef2427f601e61aea7f44e27c1b594d75ad1974604c7d5aee858f116e2d5cb37685f271e63fc4f60199c2536ff8e0ccdf824cf7d86ed6787687dcddcbf05eabef510ca6a42fcd7d32fa2fef9b752db835beba5ee318d835174acbd61d9a1015aca39487468b582222bb304c4555b307d80b83cab997396dbb9ede9e31cae5918bf4501d6e41c47105d7ccdf3e5428a2c475d461e676042940d6ed1490671c23b8ca869a8081c87c8529c7957e177d452b66d5945900a10b42cb41606f5700d2ab8c099bf66b262c9b93916d89ba82d287baf91217d06ae4b2133f588019e685f3d9a837c066d64a5e709b4f6eb19eb8e2da83e8665050ece1268a8a1c75e8b6e7c7b44b24326f589eb3c646823a6222883f267388cf72a379bf0fb62df42999e11e678fdee1483ef87f7f9637ce5946534d507302bf892fc28f22d808694370a20df0102136c2f5736e278201fa04a6f1ce8d0138a5117b56ea14fda044545fed05e64675d73e3aedf7a5bfb058589df18dba18ec1c2962da33f1c53d51bae7f85d2fe48c130364ad48208f8c68b1b7bca675c7dc6bb2c5c7e78e09334df97d13cf90ebf4dea1e291cb70aea2c6be0e543a6d50714ccf8896719cefa253a13ff8752327e16cd0964d279c0d38285d1841aa88c99e85c0decb3262a052612f91cd5624862230b8cb98e10e32a70177121e0b352cc0003a2c01bcb6bd9563495a74a767df7a27bd390be94887e25e8a549665d2398b754f30e7aa2e385eb57319a9a2e885d773a93ca1c8279f6706661913fa1bf52aff793070f386b747cc8440b2141d9f5af37e16debed3964e4cd8e04d86e34e14878e9052c3d6aa1630cd3bb904a976c6c5afd373f6edcb53b7dce69f7d8f1f9b021eb45e5bb9dd8d2a612d4f4494a8a69a5664450a8dd51d94aaf144124a9211fa971c442d9f82809b1233406e3280c8e0cd424cab1338bf404af93204d9fbbffa59b99696762bd6534db341d722ab0bc01881ec96b429e4ccd56103757301aefd7252c43c8cc9eae857ebec19d8744ad459fbdc92db05ce0a94c28967abb7790a18a05eb275a13ef16746e2bb70ecaf5010da2cc9461411dae9738116262807095cc24935785ea1058e0762f8351f0dc229c2d89041152bdedb1f1bf6993ebec3ca79cd7b97c4876d6881f782e4eef2dc94bc7848e551521d9acc7c5b9a3adbc4fed8adc1eca40421be24bb2a9691579e78c936fe27bef54f6e0345b0ccab31f35225ad6e11792e2b38f6437de4af708d8a473f14c2b160fcb5f14271f960080633a07c7cdf8736cca7adb6116ab3bfee50912002573d4498c3494fd535c8251454263a88a41133ffaa98461327ec038c45e6910347d4f6cf892cc7e9910a22e4321aaf8eb80dd39e34bdfc8ad42786590e203eb341018458add6d74a579c1a7e10032f63e1fe8a44edd51d806830d6998475b92f31f1913837575b32c29526db2b785458cf44a049cfae0746b5831ef679cc8c19b4c7072c995c79fccac0e6684d1fe3eee459d8fe2bbec90b31128e52007bcf4ccccb18abc9ab18914851a939c901632673300169d342bfcbc4ca3ef0d14fad3f9c9712c9000cfb7da2d6b008bbba199637754d4bd6236d41e9378c8fe4260d92eac47ca5534e7a4f93af1b32746ca577dd133032a45f12f2822c840fec556a5fb050665937e8e0ac4829c276b502f31fee8da555c2cc2cd26e41cb7f2f0d5b2126b01d1a008d48e9ecda0a61a76671db44f312536c8973ba1bea4b716d618a0da3dee2298a2bf2312dbca0aaf237d65026b3a029fe5e614c7b664e68821835001381aa4890bda0e8c20d62203b66302be7f62f80c03045e0d3b4f1c815bc96269d2ed1b466c4ab8e89c3febf5cf7fccf98cb5f151387e4adbbce2675a243bcdeccce0b0b9ad98c35a468e7a4a718d541550e586ede0f736a3834bd5b255fc11d31dec3a671d321bd3ed873bb018900781f9bf76279d882eae966cd8e7607071413e82f97b684011161d68250dde208479050ded11746795504b14f4d5e3cc3edc9622a1848091e1e8e3288473d32a701b27c1cd808acd4441bc9b5188a7032d35157d4803dc98a8dda19f2a4f0d27c5d9bc8245c774839b2235f12be037466e57051520cd58c9d36bbc0b07793478cc8c49412088cbc910d0197bfdc7c6dc08d1eaf5402baca01d71db189101506641e87ad891b91d926168a14b4650c8ea5d5761b85afc7c4b55f9bafdf021383742af5fea022fd8a9c3401d318490020529717464af5a7d89a3aedc521ff1d9308ebfce3a010732b497857bc34e842a12f303c2e88c92a3c45491af74187624bb3f418e6ed4ded60e1b777c882f0879318036c4d48615cd84a97fd3f7cab27a44a2d83d15440d3b4f5c206fdb6b816a92423f42dc0471c8fec076885450b4ba4a55069c12397d6e066e2d6e2d3547c22d1db6d4277e91ad2ba6d59b0bb603683fcd98915970ad02727d08f8b9a085ed71030a9bcbb8db02f0eb495523c955f42e0eec49e9e6f109a17e541f3aad4ffff4169bbcc28edc37ebc997a88415f4c6168cd59eec406fe082f1d5e9faba323b6e6dfac12346c3ce85c6c37c81aa90a7b02686e4b30711a8f3fd543d25539c81ec06c685476c0cb5b9c0c538835dee82c34ee331047d32abf6d45e1b0d2258d624b525f2ed571b089abc7657fe89bc23b296fa4fb74fae67eb5f4fa8889a0a9b3ae993cd98fe33634f733bc65b1cadfc7497998651f91ebeafcff4eae8e8f7415789cf2e90bcf783972480a400c7450aca16fa2e562768d7c703a04fd17975f6e0b9637be998c0f7ed1d33b07560d426148d97f47c69e195b821da1d44f0c02751b03311062cfd016490a3c990ba70190f1811794560291e023b225eada945416d3f0778a42a041fc39e84c9d5c9c4a8acf9353b0999d4591ec8998b28bcdfda7d1f202e853fa1a4d3fc2ee218be4a7b0562ca018e0e3d0ad762b513b45de39b84e0c2509918071a2beec6678d25d398a4040d1248c3478edd5e5b245ec761d64ea9750ccdec6e66516ba9f539e45bb2800fa5be02967445d0360503f0946607b532cbadd6a93899cc1292b231355f7fadd875f82b8057921c78c20d57acb0d6a2f47713e5da0cee18a404f9051bcae5ff55c102f4d74eb05eebadc874be50ccd1f891e318eba0d07d11ef163b95d65cdc6cad826834e1ad619d8a1c4a7002eaf608bd5120f4116983a43fee5d4576dac32070b93d5c6763332faf43c2ef931abef754768342c20127110804a51e2cba3efc61d0bc8c3dfce9d89bd4788edd722221691d811787696eeff09396c0d0a8ce2e7acbfbc05cb24364ad85b8bea0737f331f7d5bd72b06abd47acb10cba9b54c19960f52521bcf7225c9d98d9de0059cc28e3819ac66fcfe7654cd18d9a47d84dfb8c84f85ff68e519667e9955f5291bee500418a6a94290f00e5151bc74b78b2f41287d6970a9f8c5fcff931d52abdcd929dd9b35b3ca98a59a161e853b5280e10254e495a79bd4be649417fd449561205046d00c74ac4103705fc7297d35c846b8ba06fe29f6bb598d434d82af74c3a3e3baf898401001009bf39ff9961acc4daeab4f0d39e463055731b61e145694b0b2e3fe512759ed8945a82891ef4ab655adc0c43c57ac7aeb073b7d089ae7c233aa85a42ef4d22b52c11f68ac1f7d49ac9ae0c72682422a25a7bf84ea728164ac8a52edc76285c2aa9e8743083df4b148205dc4194986e9d03ae52a786fec6fbe0ea8c73ed4ed2c7c47cd3729f3edd5bd9a96660c854aecbaa986831feb7934511ae2756b0c5bf7cea60c6096bdc12c080ba09bea3c75ec8f17890430802585f786cb05a913dee0de143029f7a1f0addfa284332be21dbed22a761534816785d57fbcd53828e98a144345f3619923ed2dd18f641a186643ec81421ca3f32e84cd1f4f4061a9b638a320eef509c1f9933bb172472a3c3d3fb538555b8ed85e3f4a6e5c35866c1bf64ebaef98e6116586c1d9623948bd48cc1f929827cded45ad5c1de02689099a1a3d0d600246edc52e3658a37af4c639f1ba214915d41a0bd0fc175f40d7dfe6ff5cf267b24b717aa7ecf962fd4c346e0682a61f0085c84c34ca1ad4c0d3f86bdb44f802629bba454f35ebd1f3e3914778b772219e118b348f73b86e7b72eca2c6bcddad3dffc1edf030f8f612f294f4826db2d95598071a89e81961291973a61c217e68f1e90b5d9205bb93322176fc628166a62c55284c2e488088beecbf94b9330d08f15f90770f32a9dc3e0b785e21734d1e98963d30db3f51ed7cf6d151d02be00ffcfecaac8ec30713a3cbdd1485c01d0cac121aa0cfadded458b9670ff5abaa8f5304010a97fadcbf00dbeb906b9477b7e82fab176d8d769c0b6cd3481d43bca027872b31a3683d30393e10ebb5de691f410c7442d01d888f4e00d40e0f9936400704799301b251ca3ab0a746d89eb5aa7113fcc17f5ef8a933e08fe6f2c003f8adbf11a4c2ab9759e8c3528284b18a292493c1b65b931e776c1ac41276c6ca90b586b91e6dd79f4d5bebe48cb1b4c18311ccfb7a237f49d22771e4ee511cb16a30ce888349a4820d15251c9ecdb7122f601a0a60e65be9069ac57c106143fa976c479faaaf5cc23d1228e52cf3eb34c563313f28ca2b67c0a4c9dc95b9c39945e1e66242005e67bf231b90a19ce5b9b018312e09ccec203c2fac2582922accfdea8e8280b818fd217959c9da1a8feb4adb71524d4bf05b1ebd94808138da0e4732410770a7374a59fb99128f31dbdd37abb7fdbcb704e976eadfa951af8100b1b2577925b31b9c7ac7589f55a5140fad2a868b5fabf886219f308632535b94f8b871f6b5420f3a90d4a3b25334c1a2035b09b12f1ae52c76b1624541344975d74a57f3ae64a851b74ce1c903e54247a2e5ae2ccc591d15505a0438b304a6fe5df44a033cd2117f64d0540ea81d7c7a48e0fd665dccb2a4c5ee66a066f9b8b8eead61f7924b101408e06d7a14edb79eb2a085392f3bc025cc9763cc15d6028cc6338f2e3c6040d66ef897c10f3307f4ca5a8082d434789c80be13e7942911118c144228f7bd6d20f20906d210347009a50d0f8a69f62e02bd9e561e2f4fa8b16cb30781dd748cadf7056c035fc7cd586d54ebb897752d7f63f42d6efd261d56e9476304f158f8dd5e747fae0cc4b540685abbaaf069fe406004f255afa5bd4cde7e0088b1e9cf41e1034a74168e6c38348084fb529bb3f178985b58aac797a0e41ecb112e9e5cf49c5c3780afcc1f587263dc429885243f38efa5d11283a8df02b5604d558f9c90b0330824b9c82dca361c951e16b6acbe452b96bc36dbd138e764a79c0f43699204b14e39aa598d5392b71d5403dfa2c34ba35756ed0fb08ac9631c7ef458b982dace92291df27b5423734da64de158654eddd83809dee01e2e547bdbda2c568d5f4b1939adc54f43e36b86e45a65b45db3f06e4be45700047a2e50866134d290e1f8716281fd774d9b1812a71f38836c7e13ecafee9d4a48c75f6eb2aaf809fdc1d779a13f5896249b9ac3aca805bfeaf19408865e14e5be9b111b5d3dda9b6eebf344139867cf4d37449f2a423e7647e4555034241a3daca39939ca63541bda28515748a4dd38eb283f51bbd10c32fb77d21773cabc8e58a03bbcb6267fdf830dcd129438d0fd272c68c4aec97339274af951a39487a61cbf83528eb52d047d2eb768eae8587e1f4ede58dd07fe313751f26f2f312efb7bdf7325d3ee133f215df60e3e210546aac3b0f2bfeece1244394a4523e002fffc738480f3358fe9715b1ff7c4264842133592077a61dd3c0bf2ff7651bf6727242e9ba542a29ee9c7feb9212d90a08895daf939ba1f7172a2ba838cd3bef320a7d70dc9bb3458315e0e881f13321fcd9e1979c840defe0332d6517fbef7c824d8bca0ebe1616752f92124fbd92820487b570d0485e670c5a9ade68b4402142babe797631ef63878f7cadf2b312de1ff24e14801d5c54abf04848a6929134c462031fe3f31b296b86ea2df4c2e3df73a4c7c7381e26923ec6da3135e7c93b12fd42d509dcd606cf6491d0bedc94adba0f181eae1253d18eb1668ffe04f4736eef93a4ebee4e46b2690b91c703ff2eb520b7659a267c0e4da5344c56f55cabdbb2408d54dfa032dc9be530c607f0f29369280a3247d358d1cd043537902fc591ba1722831313314f74d581e87de61e714774bfdc87606bdff1bc8aa5940eff09c35aeb8e3cedb2a68b394b1a322a3d3173d7e689c3cda54999454a6d714f011f48203849bc90d78d3a39d2ed0bda7e7eeeb208375c98c4d5c7a1f003a8ec377904c34b663ddcd7558d90c93d6f727af7d839a28201c2658c95723f8ca44a3221f82d3ccf203817df63018cc04cc89c59c71a5b24fefbed850791d01d6875ee9f6f48c18b7e7a74c8d36aebc8c346bd9a893b4dd39a0fec255f46867e00b4a2003b4a37d1cd52479cc0d4d79ec61233f53ae3bbc6aa28b44c7f51b0c22e834a3131016b66030369e771dea111e0906611878e1e6136546d60fc69dcd5e6c0b77e965358819618e78350a359d8aa602c69db94b827e8cfcfb63bea24fcbf413657e8b97c2dff40671026383c228e7da0962fd8f7c1d00e35eb77ae7ddc10c60c838bd52bef75e072a5708719c0be9a92813af7b09cd0967e8fb38d099b0cf3eceb517b691756a46a355b591a927aff565f3e8771f55ca13b0bda36ad9b00780e2709273be66b9648e9e5a894a1ea943284f3054651b813a8ca1adff780604e1f2573b181eb67329227a4992afb4cf04dbaf9f970796ab863a93b4373d0b0d98b0ed84a3f8a75001c7ca270e05cd0cd6114a6c7758ee376aea0603ebc19b39c199afea3d1beb902c99f41e1dd6cba7f62f531c664a0550c90c450aa7a307d4c45f09936a0c6c0468054be130bde4470284dfec3eefcd2162380d420ceb8b99af7d588fff67f536fce7d37636f12fb0b45ba7dd3a2f6d81d6a3d679fc335f09284c2548345d3e690d67a2927e30eb088052c8523f5c4f7771a0f06019683094bc2d6a09c047adf45f3f9bf9f77e35b460fd9306e4f08d730b48de8dc8bd43f4d7d4ac82b86c883f09c88b0acdbab6c96878fec59842fecc2636e67a6b9f43ef7dae175df9811c2d69c854af0a74b820e1c0b4a9862dbefa56ffaff3c9718270db2e6ec902f31085a556f7912ca310da4d6261d949ddcd1e6bc4d6828c96a8083874acd1cc35701de2890002f8d0969223fa9dece9db31a557f0a7c256dfb11634afc4a57c73f0923fe20a75715c88b41a21994fb4c19d3a8f644ba1e43a2ef963f8991abbdbad1fcc7daea8570d41dd10ed2d101de92fddd8822165cb72adc0e3d0fe033a4bf4c63ef5849dcd42d2567561f1ecdaa1856ae59cd18c96baf3e854b0696d6a563275ff73a436ff4381af1d73b772610c28c49e690767c85daea20cc8f3a3f1915400ba05aec9ae6d4534d899020226390d774244ded6ab58fd2ad5574f3f76ca88e7ee8e6c8e5ac11b83d0c28e1f98c5a4f57398589073b490a18e328b1873a7aca8e2dd2694e85750656aad4926e2c1202559238ebd7a48aefa371dedeb310fc272d664fd1f52b65782569e165492ff5cb4293f1d6bf119a88d501a4a353a881c6040430505820728825ce90a6294a50f0507f6b7032202b972dc4be04d189ba1adf2820a043c73ac19c72f17da14701814e64ab20c459acf5c9f4c0319742e728ede5b30bc23212fa442625e1fe1cafd08687a4e83c8da1c40bfe34b4c03c0b479803f47499121dbd0d80d1c86fd7944d47e01aa774d2c19edc8e3ad4a52b53ed994ffdfb98bb97bd43d778f0fcae00830e98aad1b089b3143217f21cbd707ee5b4cc0e3dc72ce7dbb8ecd85ce2ccd6588ca6b892ddbd97249a061198eeb182d86c61b21fdb396923b425705ce098a2e0de2f2972c86c6fa88b816c246811301f58ea97620c3ebb1940cbdd3ff350f6743bec2456439eb11fd54011923ab977d3e78a8c94ea03aa2f6104a5e21df54216be27ad7eeddcfa8536430f561eba59ead6dd13b8180da4783d94d33b0a8de5180ca846b7603c0de72dc526db3b756dc9d71889c7415f3fe227488cc69e0d1afc8d00d731dac6a5c52097dbcfd4c380a64411fd7c62b1ec4a142d8ae32f9da7c4b4329442ad471e862a96f62b0f38f52c59130b6e53a1fd70a2bc6c295dc67ba2d57477882c13073f39eec03e6c9103519159ed82b0c85a85fd794b7a931cd6b2fe7a5c77f496908279619af7a0c9e46f011338c39db410a740798b27230186e7ffcca61c5a722c0006c55f853f98fd27a7d3297b32a5a0f581caf96a5acd74b8020d892ca0e3fe4f090fad3133178fc08a6d8f71d2b5e5e8757733bc34a7cc924ae24836aadd1b2c59726d82a4701a16439a6d01bd4028c13c086876eed7a16e9d80c49b393d028fdda27554ba57f5c629bbdc562a2d7f2725c891bf8dba1a2adef37b71e10b1743a86b982bff23cadc698552ca081856494934dbf2886728dda47024d0ac18b9cc0a32e0134afa30a17d23a19b22fc77600c6909ee35aa3fafea9689b3c2f4f8cba4ad944c6f3beb8648ea0d836a3e8f64734e5b10ab4c3eac9f1186747116da9f6e54cc2edc2d0249d34d49ef2cd28c614f881dad3e3872910e6e4d1cd62fa32906045f1446ba209508bb421ac913e38ef1778ccf45a3906e4f8bd7f18871d5d28df220edc57992c141ef55926226988575158d35774e5619bd90bca6175ccf315403fa45e796db6de5083298eafd6347ba64928e43d7d6ca98b4329d13bc97541eee9c85fea07bbf38f02594259b34fcbc367ff05984e88b4f3e7f0a7b14b2bff7de0d76196868a0422fa32dd77b5da30c04c1dde208772aaf00e726f46e0eb526a2f89db5ba0839bb11d5754d0c7fc818457faa0320585dc874522f33e5bb32042b3ff9132b989d1afcfe639b800fa087eb015199cebd2e8bd143ff8901e4c8288463f1aa6cec1db117efbf2d0ab5c4cee47c74ba01c7afdde1124f0ca8d1922e667f9ea28fcff5643abc49cb925505d6715f12fd28596423096e3d49cef810c8890481536a0c0c40bf6c8f3ffec22ac852f715484033366ff5bb3b9c56ea8109b87b0c32114b813f313609e9a14296b9833687e022628e2d0a0e328c068976e8892be7bbbcb2aeec1130a8be1044bd59fadf9e1ce1c79f66d9f6cb80ee727f5d2e6b91c4ec2016e7d279a7b7e72c3fb6d7202fd84ccb42cc7305b90cdf84f2697dbf9075c4a1c80022e09367dff0258a0f8a8eb2f202ac7bfde40c1d7060a0bc241c1887f830212273f2597e20967800fac2ba04a5a2f1c688dd8e01c096f2accb845ad4f0327a5143f09829a522e1c766454e4409f9268ff3d42a14d5f49aac892cd1feabffa0785fb911234a606085452c2528a042d062bc6f0dbe8a041aa4263f8f43ea0cfde571d55b04fb3671479a3b1cef68d9a090f08d50f0031764061e55d633ead4f13cd4b7eca0682669a61af9dc99de09048053c7d782dc280ccf6ca06bc77abe8defe5a7eae973af164164c7a71d5f50485446ccb9a01399bc8acc29343056bf6c9fc8c68af1d3fc6e5e073540cfa4a30a83a118156d89f88055c28a4823a911d25f11a02d761fd04eb7b190555143591a556c3c3d931772e27d15cbaa74c4ecebc3fccb51be5747bddb19928655d94b8d8234eb6ef053b244e9db2267551c79e463dafd913b0d4b548f6c2479ed88f5b6c142c755d90bcc8334eb6e7163b254abd81bde5b906c189090fe3e87e7d4f7a2a88a34fb6f5f7288e41b7d477d2a071241a10f784eedce8ee417f5b85bbb492551f4901c01b6765b7c83e5b8ed70c3e02eba76bd32167e21382c8d6b46071071c36d63f84aff70e9d99295eb3be4b2c45f2138dec4e71fe29b7e0c7696e2b02f208ef70c917ab25ac1e568a9e5384045b2d1f3d05971b6c40241cb5ea8d7bfca266609138937312706467f38df0ee99e03e506fe76343e92b81f3a4b3825a690489e0486f440c6d17c9f83b1cd816913738281c447e5c2d70a97404ea905da50b28888e25a9d2078be7066245d2aa239abd01919cf20130479475853a13a0a4d5a96d1029d91c620cdeb9b251d89e9db6c47afe31da0543489c5a6a55367be7b83213d6ac093b325badc7082e31e34f4c3df5414c860c6bb9e29384d8e30eb843c73380ffa0ac3d34bc95a1e1af3aeda553bfc10674d66a0d90f47f93b1962bd86f7107a60e22cab91040275562c489cee83c9de1df82b6ee67ff2e562bf27778f99b390797713dd992e487fda0a81b2fb0592d3fa5332f99b7e18b50117d80ceb3c3035d99cd083988449ec6f55744393059dfb6009a2e6deb47a83cdc0d8cd317dd194a2414c9ac9ac37e2a160747894083db02140f06f4bad2144c6fbec9ac87b9e575a022bb4a29a0a3fcec079959e862ae5506e2cf701da67f7e7605f478eee269ece70a295f580f510b7ae5f379fe8dd2f4010d6dcf33c9d0a5920d251e3969c91f996a41f2693097e720d12e63a4b1a83a928f13bf41100d775140a99ba835aceb10147e5c67eb1579ff40564895e29360a9feae1063f1869d94e1edec22699ad941b3051e02776ca584e298e54d1da2a6272918e5140da10fe8f2600a6f80857da2ab742db83dc793b6f14beaa2eae48befb2203353a02cc33d739f849f5720584ad79c88ef93466f1a2888f08b4fdab8d2ccd3f8642a4d0119cdfb81e494cf914f9af5d9c0e9937cf29c4083d4d4820a13c3405f2900d439130cb879964663c64da5ded284050a0c8e69655790345f01341d3da2c7cec1ab0d9c77e2be875ea9d45a33ddf208c0b61d8b0ad3e7b754f2d7ee0672025cba866128f8524b5234ba972fea504090e439c32c4d69d77ecee25f01f2527873287d507eb2cf36e226212e074187d2a913404f62636a7788037dc30ccc8757493e7ed4fb1fd9dd02aaaac8a93794305cbfcdcd3bd565120db0151ea9b7bb44b7d3419bafea0c55da2699a30cae2f8612587b302a0eb782fb2cd3a9a827e54a5991d054d91168043f872cca40fd93c60f9fab3e1178b8ce3e45b135bdc3bcb3d657fa9ec7b568384aa20a6de9a3bfb30ed679982b05ff172eae01940c04aa8563b95b2054aaa20e39aa252a7d50c66540ff326581d1ce09c7442151e77ab2689c91efd847d3fde60cc70714693f2058b8d000c0e7190c18407e2d30d4507354fbf6b9ffc952a65db01dfa0849a55432c62e557c21dcdd76cbbdb79449ca0f0bba0b780b74e7444cd2a853dcb5725d75cea2dfb2ab94aab3362afb4011eec76ba54e8530d942c6c406b9fada09957ce00b1a3971ccdd174028222715401cd991a24f346251c8481f568cd469671a34226ea40f94424036830cc8801429098e68424e1b1a435a90461421a20812002500a203312045af0754148d418a9f0d764c48112c63092794dc4e7001520c9be80014a4482ad53c7530d3420c52144b359300860f8ed09162a954f30e09678ca00c2e481f08a0c5143b72ba004a5caa797e0145116490d79fb505d0f6d7a1b7fff52f396b62d31465201922eb0766333bff35c41074aa305550010515c0b0dec46d3a9b506e98b806dce0dd7003cfedfa633fcf794e880a6d9ab3f3bf69e79cd3bac5fbd3617e63cd7c2a24e40221a1efdb0155c159f4692a6a86cbcbbaf43ede94fa91123280cbd22ec108ecf26cc659a51302193d9c0a2e76408a75889334be20454b8bc8a28b2748d1a3a289123f20c56f8b1c98612345b0488b217e48f196aa2062051aa4784b5e9e59d8e00b18909ebeb5e5ac39494d8640450f489b27f9291aa62f8a2924d8df9fce9f2c08f83c2d4487f9250d7fa787bc1f660bdc077579457beffd207ac8ab8320bda8b50ef3e97ff34be23ee96a21ee071186f77e38eb0771e7adf383b85a555bf3e7ac75566b8638636ea0a9d5abb7d659ab57752010270df0b54f63ad0e0bde7c73f841f7d4d359300d052e67ed69acca7e3fe3acf9de0a535771b43af5f71e3d1401e2fcb4101de8974efab93d20c2dfe921c327650bb87f4d830c3f881e32d441885fd25a07fafeb00d2611be186a21c20f82440ac327dddaa2b5653f8890f441cc0f2288595bdfb404f84fc8e2b6f7e22afc6c8d0daa42f545435010cbdecfe5e5bf74da67242f564ffbf294bebcd04c77188a62c9e5954846d606dda0b7d906397dfb02fdfb5797f4c30fdf7a6fbdf726e60bdba2eda9aeb5412925f0dced7c5fff67f2982f3a5b2fef85432f5fa2fce54b77e2959cf695e8e7c0f19ee37078383c1cdeede54b87f28d35395ef24b98639cf54261a06fe9fd2fa4387249f7cbd531ce7a9914aca697ecb4ec4998c0a497bde8e97d9e0a761611ff1c9fc3ed4f7dd91e76bbb99b21999ed24cf449f4e5e997c41b4f0365e17bef6b58c07491defb2fef2b7f8979acfca4bff2a45c278bfe7733fd9cff33a52f390521e0520dcf7d3ffc6e898e30dca7e17f2f864748b4a020a7d1bcc8860fb91337f2966c0fe62c51c8912fc80605d16d64349d727c0e93d3a19abbe812775d1c2fd61289f45f1692e377a0fb85f6a811d92623cef27e026defe7a7461ab8c5c6d70f72d7f7affcdedb9abb8adc65e3bdb7369bc45de392ed7956687b43dbfb4ed806d9207bc4d2aa044af675386dab535f3aedbed515a09b0ab1faea1ececaa1a7b348ff42c45950706965f5c85d39defb6779ebaefbde5b597d39d0cb93b46c7b9fb38dd596f7e268c717be9f818285c09ce53d0f74f710628dfcd4970301799ec4f36a496f3749973cfbab3a6779ffb94af19607deec4bbc967d08c8c3a169aa4bfe749de22ceff5114c7ff52d5fe39d66b48282fa3951347e23ef78dfe8b4faba56af740faa2f9d66e3cbb98301fd916e93e9dd7b4fe24293c79cc1f4b402745b5d963e7c9a3ab78b2a9593f8af915b5079075a02b3d3760069f05434f64eba54ed18eaebf5f4967d6ae7dd1e2d9fc5c2ad9c0422b8a655f9933845771f77d59928183f8d4fada950a542b5ea17eae3c7f541101ca2617caf2ae37bb0bfef27f87404ff94a7bd17e3ef1373a8af96ff4a627dd2b7643a5bf551b93e4b06331d9a2b2aa507a97e459c3f3520f07b920a4822d980ce2a0ea22856ba8f6c102479f6a8c88935b250ecd1a96849cd64a218eb0a503aa333677dff819afe471485915d7fe5c57bc5d24aa643cefa7ea6be686d6606fc3ea5042e599761fd3427ab2f96ffde8bb81147a2fc7d223dc5b90bffca7f336d9d05b3e1e77bf11b3fada24bd5f7e29cb2c1f7d9e004bfddfe1e8f3d7af64ade6d50cac92510b3573ad0adf215b0bbbe0ea75d57fe86155d01ba5574491f6b1dce025f08d53838eb7b1ee8aefa01e338030606676a03583495ecfe9e1eb9ebfe6712e7fcc057f9c0cfa1e65ab50da75cd27d7a1f6fe9aa987e12d58e4c28fbfbeffbbeff72287de2a72ae2aed37f7f42ed40b76ab6aaa8bfbfc1866f741c4f882f4e919644f14e52f8314c1ebec59780bbe616bf0777d5175f86f952d5399fb0b8d8a2284eb9e20ca6ec19654fa219ccb648c75bba5236fd5a976c5a73169db14ebff9ddb7fbead2870d6aab13ffaa4c22194cd9e50aef893431a8aa58baa02e555a84012e67d116df690c936afb31b8eb62d48c11bf27c439013c89a0880285ed53d99f9e78861ca91fb075163d420866a420095c4d6797b8cdc9cd080765d730b7bdea5a58545ff762acc355f77ad5fbdf504cd9f53f8924db966e328cb0edcd59e11430dc7d45a51d2ec32255b8f374b83352231dc98ed844293f43259c4f909351672a320497aafba66ba7601fd5fca2daf22f2a2a2a12aaf762ac529984a05829368adba3ed1f8e30fcb6b7faba437f4b5cb7676bbb54d1a2c9438abb665854f2010e77ee2a4d424736e7ae322cdaee2a4b509c6c9cbb26016ef0099a3c9c1411722831248a6a94994d3279f88cb5f762ac52fd87539ce5e12e9c439832fe650a2f5278c6dc11ee90c0f6e62e283e3b052160ab93ddea2bdcd596ff07a980f04fe9cdeec558a5fab7b7ed2fde701550afefbebfe769d4589ac1e15505ec065f87d306f57f5f86a38d7d5057a07a5fe5816e1beea69090b0b3da950cbbea92675313ae060b3c2376d415d9d423b2a9e763a76c5a8574653ddad4c8ae42f5352ef196bf9d526b3eb588c82eafcd2be2691b65ef60ebd1b5557b6dd7e693b4d9bbab1e6b361460db766ac4cab1eb099cad5a27ab7efd99821030edd1f3c26f4b471db80271facbc7c662319fef7d90d01fc2ead9257df741fcf290ff9c5227c4fb6921f5ad531c71ba2b8bf3e78b88fde5e383a4f4a73f64860482a64122b1effdd46569c893485eb8dbe6d0f940a903bc6ff2c83ce800eefa13e8d93ce8006e21f5e7eed973aca169ec1e4a21208a734e4a7b10ebbb8847e0f2ee2d3a25cd409ff430d027e99e7d73694b7affbbd63efd817ba6a20870255117457727a9402239c97d6e52ee4181ba5377f731822e0d0ba96a5fc4b2cddc56a040b5d60c50779c65a9eccea8adb5d64a006bbd1bf529ee5ea7538753ee979ee779f37a3d9ee7cd39e79df468d21df7bd9f936680eef0f2dc53973dec69e991b3eccfe9cd39ed5b951298e0843de797b8355bd3b50541e5823e11bf0f7f6f5ffcecf79f7e4ace0ca9d0cf9b9932b58677ce097e1e598520ce3ae79c9507b403b8be6e44c1f34bfc4e8833b6e93b757729db3dca76f71a9b3c6cfa029b3e79025eac2ac1d8a631dac405361d7fd8f44befc9180b8af223f3b449d4c0f7b2c1587d958cbc451f8aec68b629a55280369db2e9c736a5255b1a787e498a6dff497bb43d8914f4716201b0c7016c7bc2b6376c6bbe6e0ccbd27feb645f586dd151972af1564dc5065fb0bd11260b24fd6c6df06b026ecc9401abf715466d17b4617b5f3f0477b6e7cd6de91ca927ab798ce2ea6bceb9e32ef1e79412e5684241793997ac74943194dec0f1f2f3552b2c2efae95f4c4bba7c16d6b5130db50d5daae8e354babc9fd2255681bafcf774c9f2beea728656a0daa2b54597b765a5e9b591d2e5e366aac6d55a5b748951babc7b459758459797625d0b35a57426fc0fc33aa9fd8923531f06a094524a71b48004031f98842da862fbcf10b43fc39bc9b2efa0164c6cfff9d99f2bd8fef3049b971cce96f5669dd3ceba721c0693346cbfebcc0e707d6b6b1051144488a2f0d9f36fcc9f3fc4ed79def7f1e055c07b2aa521102baed3e6c0f17263e56243f501aa4d7954977d3ada7dbff4d0c0560bb1ef7beefb9ff7a027c47edd42bc4739cbb1b3bcec6139ae43708edaa69f01231a1052cd70cb077079dae518daf4730cb9cbbfc4327bca39eb14654664c9aea88a4f3877ad5ea8bee99f72f545c9d3d13ee9826cbe91554350551d434fbb4dbf646d5a62d9a63333397620ce9852053a41a97f1a54f27d6013a083b4ef36e5fb52b51411589b324d4c991418b475abdd2784beef3b63ee80894f9add9ff00b55507d957eb4f4fbf437854ea1df4727a54ebfdd5706a5fa3b63eea83f690ea67c39fbe5a64c094b600b134b7992a61f69e298794a7fdf94ef833b15c758050b9972f863be343e96bcb4abaf6afaf1754ea71f4f3fbf544bd58a4aef23cc67fcd27f630d4c7cb194c73c8ea552e9794270575f27bdf26a7afc3aa757393d3e3d4f58de5a5be2aea2dbf8e1eb8c2a3aa5faf8eaba6379155d73b555afcebda216459557d13ca4176b4e666575f7c3832487e5c3e709e261d136a8b6aa15b242364817d9222b84c370e57b48ac57ae13aafccae7a8fc8a8a5ef915bda3a2ef4f0f895f277c8c9f67e5c3d7c1aff298e55934cfb545bbdadbcacdde6c2eb4399b0377602e465be5e080bafabaf7ea55cefdf043bd43fa7bfa78f0e55265cc1d38c7033056a33b6ab59522aa81b11c1744f40516415bb5bec059ed2b032c02b76baa8bdaedbb41b91d959cf45925b4dab2d557f8423518dc767d94145cc212d8de1fd2875f3f0c9f07098f6cd72f85da93d5562569bbabadf0d6d2eebc1fef471614545b5588c7a43da1d20bf28abc22a19b77ab2db23492bc3492f4cadf750e89a4c7d38faf537ad297f063cd137a372f77ca79396f377a3b6fa792d5566ab7cbd1affc64ab1c9cd055b1fa0a751df5ce15515fed23fa848ce877fb88e8eb03c348e809a1efb325eb7d1f1894050a0e31a2d54d141c3285b2907a928a62ca8dd41052bb3b82fb937a3277f0f0680adbfe7c3d5f23a0ad9ada5116acfe84e88e9f11d0173884b6ea7fe0078216b4df3794b24d99fa5e4e299932f5c121f4f5f180b62a6581b24075eac9dcc18354d1ae5f5351d096d02e53351fb7eb546dcad41753b5c943c97c5d23c2b0965a9272e227f0bb2695529827a932e22e96d40d95badd56e08defa5946a824d7b36a51600d741654aa926b8b2b4a054a5dc4cdd5441bbaa683b75abad2adbf54570575f2452f8e2efdc16560b70f9ddf677fb70f37ef8340e86356653a6ead2872baa73eef82b1ffef8ab103f92156c343d8fca9fc6377d69369b65fc2c292bf04cddeee3993fd568664c1a56ce5a0977436d695d0eb5b542045ef9ca575ec833ea71d4e397bea477467d7f3e0c9fc7540a573a5fd23ca52f5b45e012a4d19837052e698cde8c0a03833bda4a0a97caa5743672d848d52a93daa69f2e179433b2eb7f51ea2462427b39798fecfab3fca4ecfa2bb08cf97ad90573e0ce0b70bf00b2db8316642c32fc72dce197a0105254807b565b75ce9400daf56b3962a43a09b1066349e22ff1ebd36af5551ada95f4a2be5192663c49f9fe5c310571fa745312a4a77131833a70b7eb93f44e0f996f0c3cca575667bb7e09343ccb814747ab1176bf9fdafac8495e9dda7d5fa0a4dc0fbfa4430df2843fea49525d82457b554a35c1a45da67253c609a6333027b28c304803419dbb562eec4ef282b9d90f50908e09b32a86a9ca88b3360a0a3e69d411be3767d5378d3794bc3f5e552cb54bed6842b522915542aa09f676f9e56e9ee425e22e1f534d70b8cb2f7733a8ab2dbb573368219788b3aa8f392e450a2fb04883dce9e1a16e9df2fedcfaf74747bcf5c5158ef8778e37930c9fc6458d82824da30c2a21d4111ec7d4ada66e58551a61e33879dca0da9a325dd7c8649d315dd788c9aae5fd59610516eb2f50141d06a9065b1dc0169cfd0081412e100830f6ddbedb0ef104bf41f535deaf4630a595c67bafe6194b30173e0da50ff50e121ac6bf7a6707c90a761f07094f7d128fa829eef4a1a6b6da32d94e9aea286ed6d6d51eabadf0eff3ccda22cd6aabc64ca276a0d9aeaf82cfd5e2dfcf21bd89a47b48d739e2dfbf2bdf43aa9c9ef43cf5f17d2028799fe7a4bd565b7545f50eb4a69dd643960ee4345a5bb1b9adf658e31c879ff43ccf83b5eb6aabe2ee9f748dd556ad7f354ff89a24fe7d1df16f49f790254dfa9cf17bd2a757f4579ee527d943defba5d7b9e3f3acbc3ffd2cbdcec863baaf63fad37d935e796ffa49eadc1c36300326c8ab579e86e13f8d63591a6bf052535856f2fd09a5c0aa586a07e656f48b82f3fd3999b214f8d37d2c215ca6be5c9d39abfe8446e0afb35d3d7dc459f50716be38d6b8ae414deabf123027e64bab2da0daaa33fc49483467d5137e07e2abf479e1fa6e933553442bf395aacd56fd3b4291bb8cfc752f12bb5d6de5aded595312db55c844ab2941c12eaf931b54de24bbbee7941671d6dc2930e86bd256090aed23ca02a8047482b6ea5796123cdaf5451440da94a99f6a82c12fc114440194be2fdc206df2f0af0f26018540164c1e570453a689c9c23562eea85f415a8a0a6a956862a676b15d9f6584cb2fb76bce5d2518dbd55d9fce5df46bcd4f7dddfadad5567d30565f3f33b283227a00850f7464fd16269fd0574bedae116765d7f767ca6881cbd42ea692d5fa0a3fb5abaa9faa1a677026f6066ffe0909a0f40a37a5eefaba4aa090bb9018f2205a7d5d23dee2514a513179a0b0eb5fa0c963c92dc17c81b9daba4ae026c01c0c764ddd76ad7f73eaf60925c1f7c75d2578bb462e90bb2e12656aa78ad59fd4ce5d17c859f56b6a777f5859e0128c95a99b8fbb4a30b765a4d1c68f6c4ac39bbbfcc80a767fee9c1a6034014419b11819a6ce98adfa3fe884d8f54b7047442cb59b32f57f82c623f35309a283fbb3ebdf9faf45d89fa63dc02c7bd66ab2ed15a1d99bddea2bfcfa295c7dddaf56db9b55a51ecfa91127c419535a9b0997841631b8df10b8bc34178c381d1718558166547061b351b1054d75e303b85485354f971b02cae9e0635c80cbafba8f160577713bf0004b07112e59e24c0519a0a9c004332acc7cb1216ab0020182d0c0e5acd5a0014d0186142f80603945625c01e587061beecce2be8881b62d826e78c0c489b61cec686134c141024770397328c43e1d130de4c21913216639f0b0042ea74e0034cf6686edc6cc20420f3be5dc7db86fc683a05be30117311f1a7b8979b31ffc80352532224ee092ca5c6a5e1050c0213e74468bd09917fb220520ed8b2b7e8cd01f51f7c58400ba34216c148822c1042e29d054a2f3808c6a378b14041da1412c3532acb833328640693409a595703f200215a2435408e7e18c82906234c404b44697d070496bde0c8a220ce48a9cd0a215701fd01246aeed0821501b354a824b6af3869000714358d01b85426f14478f280ea8a889682b824273340acd0d51035a3284d01222922ce1006dc9101ca03a2aa5864baa3be96c50968c312e8cd01d9d82025cd25d0aa88b9f2b84623e1e23c58c66592ce13227e2324c2302848516b32233c0a5cf806a35d05d11e5c7480c70e93f281bd1155b2c41c2811c8915e0d28156704998e840d0110fb2c58ca6a02571da14136651d8a444f1a403515c21250a5b13a12119e0d2856a25da1434109a820667004d613b630a1a10f19a2ff15a188b5951449113215c7a11ca3e11056481cd6d6ef4025cba4d25a673c20788891ff8cda1cc70e9b71910b25a1a65e08ea6c0a5e372357446319c358a1561a401118e18c55a908be239d7b994d2752d311dec7ce7537ce73253e205089e2011f3296bccd294e8400c191122705965453fc448b015c562453f14416352042245312b66459ec0659d853329908c4009dd8f112870597f646a5900c1091320242a90c906244597c590a02345b8ac4160cc8ca0b16646135a924af37057c480ae0081d01012b8ac424b8aa0a8d49658b17341a966c36209935a6d4913b8ac35590c4d0a24310b9481d126459223521cd1a2c8c90970598b6cc47465dc80a80082cda8092eabcda339ee0918b32a8c6e50a8c065bd159d8a9ed46aacc8e804255a511327454f8ae08e8cc065c50d99624ab24842cb42c429c902074ab2c0402eca12fa22259264d3b73377d5d8f4ad900a678bb86b12151dd9348644506d0b1a6ba2036a7f367d5bddc6dc55d6ddf671574dc10e5f63acb91af604db40c3bc3de0866f082e27ee1482eb052e29eeb3400df9262c36609180b3aec6a1082a638da77370d6d4ed8c353d7853703977e307ee16a2125410271f532c0c5cd2189151561a6be8ccbb012ee96c89f10437806095608914f7261a21fdec0097f4078910c85914e8080df2cac0250d5a15612c824b8aa3a248c5089714a732031525630aec177a170c29cd36e42c8f0a2d7156cd0b022e698dc957611fc4d12397806a5bfa37084f8c41d5c63104d36d35083e06bf4c9dd0221fe0921651239b0aa0dc9c451f0c5cd29b2e0632e69cd3de692d1533088b36f0e1cf9bc16dc2e405326f065ce820e3c905c30517304a238a219e30011932d8a63d89c8a0e5bcd65aabd7951de047952a95ea5e4f7b9e3522964084634a98027bbd62c6c4dc70564c15d8bfbce1ac1b55e012635a2958bfb6dcba757b2f59679c6549406170a753c6495bac250fef16bd92f56f8b60e9f3b6784b6058ba22a9149648a592480a4dfb567d2ad94ab6cf306bb6d64a9dce1a8b3533b3c20a06f07e7c4e2a3a694e1b7a777e6941f7ef03bd39e79ca4b1daeaee74cef973ce3104a2348a5e48f5e974f2beeb9b6a93c934794c10a47a1cc7c963da591aa7cb4e1e93cebfa3a92492c2d1244e197f51ac40c89bcefffc4eddddabbb4f9b4591cf7c24f000d73d89c8405206194c7880888c25689139650446b08801115600e10912056420416793570f0c8450810e8a4cc0840b9a2027928d59f40821eff3aaf80108dbf32430b355cea2f3a73661022508dbb427132839328adce0e706392661ecf604f0d6218707841a8835c79db57a9e32b55696bb755b6b5da156696d396bd76addab957edee7b9bb5f1626d4abf5c003b88bfe004e68ed1be6f9ba1757e2adfa9ff5ed5b5cc579b81b6a0b7b3397de9953dd11dbea5d5b3dd0fb56a8dd80ebbc02d37790047e9fe795461f4d1487c3c5b066a6ca8dd27903ee86fa37e070e207de3065fc27ee86c963d2d8ca136a675dc1c24db7684befd6a28f7a16b700d3b7efd45a1b84b5b6fed41a845a83506b103c6bbfd2af9ffd82e0cf028b40a911057bc4404bf53b008d25c00a76e6fc405e4d2725bd9f53e67b72c6a73f0b54b96bd6fbf9ee9ac4745b6d06abfe63583a404a75dc981c8cf1040455ec12bfd114ba8b316640c20930694fa2315a20062eed493486124163008df18383a05d15c2621546612ce543030318739105388351158b5de2b738b8f72dbe3318ab30b5334a9b5f547f8cb67fc5592d76597344bb4ad9eea5f5d9ee56c672438c1ed820084235b8e2e6c9609755e80647ecb2d6ea12777fecc4767ff75b925dceda5cb2dd7337e2a288e843675dc8764981828e7c49936ca742b4c80b10ec92daa8d1f63f72ffe20aff7c742fb2dddf814a0f02c309d22e3dc97617f2a1fda52fd9ee45dbdf6d7eb3411076e9b8ed7ea4f2a5e7a2acecaa2c8c21f79f4aec1abbc6b78c35355a1e35d6b47ca56154b151596cd4b38c352895b74bd46314ea4bbc518f52b9ab9ca8a78ff295b10655da2cbb446d963054b0597e5e60b3b0fcc56db1595e65ac61518961af0c0cbc002866c3c9182c30c2c9182c3082a42b3f4bd45eb9b1577e0eed959595c71ed82b36c8c15e793cd6acb850d82a7f1a6b54c25d9636c66028b1f117461bbf69acc1b61879fa71ac3995b66997a86d32996cec52c73699fe7a51c6363d56b24daf324181b24dcffaa205dbe44509b6e94b638d69ced7488ea55d2a7571b44b5d14d9a5278d35259715c46a4477016097a84d8a6293485c84b1495c906093fe8e35248a4678519b00fbfebd8fd1d8f7a70cf6bd2af0bb11b1450c3e3fb23d8f68db8fb26db5b35d83b6080105884f036060718bf920091574a1c483e2f68591334866882b805c8468ecf2673e18cc1cc15da08181effbbe4fd4c0d0a701117840446ced8713155ecc3470832c886e60c6b827d10d6e008538e74b4f3badb5d6de697d70f72f2e510da05c95ca426056c4125a6ce00452c41822c13d45819da43510c276ed3c723205131a903921830cef09fb2ab80b2c598d534f70c9da946af1858e12aca05aa060856ddf6b18a1e36fc4d0e0881b110d80b00409a30f18e9587a8247b00a10074c3ad061150c31ea762728842845d199888410cda08d586c805454b24109a30089b6a30d5c92ad0719008342db1032f0cdee9320649e0c3cd0814f36c0012b83cef63d1181105507433a58829f20c1011976907be2040764c841ed496d2683192a1c00111d31912a529930410e8e8ca8e1714fa223222450814b7b121dc5a410b9796be2ae0cb99cb7e62e31094362941123040ef7241203675f10e346248606ec9e44626060973fe3b90017a0f4d3738cb7ec3fabbec4b73fe305a0975ea794b610d9c7a2584bb865041f982f142562babeffe108cf584c51f1c3f73079a4109b3c4a44589a57ca342bd416acb6ec7b59051a320e25b00053fbb654a107eaa3c2acee4df95ebcfe326125d3eb5bcbc5fe9eec8f8aef4f356afce954e3e430705b0be6eb6beb6b62ba48bf82e2417d2fc6fef353ab6afbc4efe3e8eeb6d194c7d2873909d38b9e94f0bd2fe90d26282846679717554b4c1e1f269b3e671caf738e77c92bf025af4015cbb7a044eda20aa205d1424d779ea63affa171b7f1df97a074188ca0769b97c59fa3e7a44bf619dff4e2c4d1209af298a9bf9bc6f1659834fdcc5d893e82e183e197b40e387e7c9f1c6ffa50af440dabf1a7ffde06774dd5f790dfd3d417feffefa9cc5dab1f4ac45fab7bfa9cf14f7fafce31bd6a07c78f5f0cf565faafa431a0229992a4d50dff90c05abe285495e01de853fd104cba7c6f63fbcff7a7efe569fc45eff490f893a8f12285e2accf7f1ca8be00f09fce71acf75acce72f9d954f0f805ce349c8fa47c8aa8771f998d5ff8dcff9e59f84c993cc7992afab2fc77daffb444d71f476136b0955042e69118c3a79b31702eae329d8df4f2a80d24de0a31b3165be50fbcf94f96a9c4e2fc3648d9f63cd5d9ed67ffae6beb8525a7dd5f82ff59f8da46136f42a7c1b29bd0a6dd8d03b48c250e7e08c04965ff44a4e863989d3dfd3bbe057613d6b4b86c993a6b7dafa5ea437ca02cd8d2f8c9bdec22fe96d5cc1f0e378a257a21efe9cd363fda7f7744e0dd5d7f0b637ce40b7e39cf54171d6f7ad227e7453e67b1b26c0be4baaf37dc2af5303967a1a7722a96c237bcd67a176d90ab6223dfe1e7245ca191feb1d24a4dfc19163caf126bb6b649efa35fe947990909ec7fe09fff839f847fca1cef937e99dfaff222d8d19bf29ff8dfdd3e7d83fa59ea473ead7d0ab4be375abf2eafe2455aff3ea6a9c4966ede3f3f23eabf7b1f1a9f7b9f13e2eefa3b2f19f5720367d8ed3e3c82bf027897126d9f2620d95cb8d948dd54b4bf6f141bdcfcafbe037bd0fcbfba8bccfe9c7efafa6416376a0eab4dafa5e257badb6be67c96e13fa1e95bf49b2e449fa4f6d7d31681a67b184b0a77006ccc77e7d951b3da0e72f445266f930abbc98f3711cded220e60f347c7b63031b4f164d5181cb99f3f1de670826653364e9876072149fc645bdd343ae3c8d8b5e06027f6fff01eec22187fa727921fb2a5b52d9b6259da5bea43f2dab1cbe4b26bd8d5c7a55163f954d5f238fa79fe30acc9374c993b49127a9ca934ce549d6c89344e549b6e4498a34f6eda76fa0c149f1661b9248324c86fa00deb26fc304d8ee1dec067fcc3ea822b0aab66c04a68cfd9b7b7056cb3e294f2a8072fa60c89393a650ce2088b68e11c061cac8307d5a82114c9f264122fd9865980cbf947d86cc90e1cb30497a3bd6acc0d17b3aeaf0fd0edf7b5ffaf0d32b50c3bc56bdfabee57bc895b77af5d5cf09bfee2069d13be2937ea7f4e1f75831cc2d4fcaa867c9f555b20e3387c903ac2f3f0387c9c3c6b6d686dff239e1b7d40fffd339a447e91d7fd224c530cf954c497105ab3fb7e34cd2c707bf8fe97d4a1fbecfe97dc6f7119ff434be922749ca39d4967d31d331d399e907e7498e7992241c4229b0c7120aeb3b4b8fe76315e214a2c29e4458c4886cb33d896cb15dc59e445824d9ef2ecf6d6c7b3f998431b43dcd836f0aa876d9432c16db3c04f3451ca599636c1dc14718818e304353c9b36fce5ac3c08c30d0adc29ca81856cd08314f0209230cbe51a71c4fb06b950df4ea867f757be189216628d0b68ff7a177767cfc0d10176690e1851af269be003e841536b200ffe37bc820df43ea7c0f49c3f790357c0f69c3f790363d766c1ef63d7a7c0fbdd3030131c07080fd2de8554e0b6f803780de31c0b7f03d244e0f9980ef2115f03de402de867cbbf81ab22a0a05e419161309c8343a790517e464580c359c7c430da0591112c081097c9361b9871fe8b64da63213d470cec247cef24ff98016a9d567ee2a51ba1c18c0a58bce45e7b273d7a446e84f14513240240bd99e444f76ac3d899ed8368cacbe1440034c6c1503da2e3baf2207538511955d2ae5d04266a03bc7e778197ce7787147def13aaf64d0385e7fcf8e39abc6838939ebf3db78efabd51e13131303137b18998f5ffd9d2f9b5fe9d27ed63036c3c8607c6c8cf6916d72ce303118194c8cb473976589398bbae8b2cbce5926c870e371681c0f24ef4c253768322381fc4d5e5518ec6d5ee7e67d681e1f7ff337cf6323b2c8dce52a56a5e115f02e31cf128bc92c323170cc972c3118587c9ec6ef380348c68ed12c32673d8de722a91ee0fc9367ce6a7500d72ff30f5a7df97879814161f3a8bbc208c1d476315fdefdff2ddf82d2893819e74b98188e5ee504799cef21fdc52fb7cc3e19d32723f3c998be2f579c39e604791cbdf3e3836894aeb65a663f3205aa2d9cfff1b3b69ed66a6b923f1e1c6b60416a36efe34b5aa3b611679238da56c3dbf0399f00cf799bd749c0fbf839c216f034fe23d7d70f9cb72fe2e4557d9d9fe48f1ce475705e4707d13c3ae2ac2af54d3046dc55e659add4c1ed0f03546182fc616092f8c30cf9ab460d86c8ecab79e69f8be0641e1f8ff33f328fce07799bfff135f8781c9d8c24c7c7e3e82099c7e67fe89658109ccff9f1385f1f07e783e81d1f8fa35b766cfe879e55972ad8fbc8374f43e6b9791faf80cc8324e7e67d3c0fec6dde4557ef75d18d366c9e06d8db681a6ede879eb5b5abaf952e555997b86a965107c8d39145566d2eef36e1bdbc9241c72a091fda079715c4c8bfb900fc7bb68eefd937f2047ab67e91e2c873cf11869ead9fc64596188b8fbf5ca4b0c42a8bcc45179e00b76480cbbffdcd5d391e48b6f939d2e0e5a630d242378e3a367a9503a405a332804820df438e3bb2f8d9b644c71a980fec6fde4da88f71ceca51759e7b479e1b269730423045db7f01d907e77d74fec7e7c87e647f2e6184d8fe2fd986bc82d5f02b9c49d6a07790e400799b0ff294b4f9950e256d9e92367a0709ce247d14f0343c90c73958de419203fb1bbdb3b38047b282d93cce246d340f121e1bbe061f6ff3b067c0ebc8abffb95f5ecc7e64af3ee7d299d842569f6badb5da9898afb5d6fab5563226ebb0b3634a9e9bcd3ad41dc3c49ee30cbec45e3d8dd7fc35e7ac172260fbab17b27a3fb285ac3e899ba7f19c573f571a1fe1dc555da478cb71f8e8c8aeb9bae8606649680cc8403e32d5e93ec803f914a62ca0066de3432b40f320c9817d029ee7e6739e06cd03fb047ce9331bcd63f33e7e92feb0ec30b2faf24f614a10ed2af8e4f49009a8e1c7c33e07e76f70f4aa5a9df3634747efac603adf43e6e0fccdf304813d1094843d0f8e76dc0fbdaa7a078aab2dff1fb9da6a790dc8976ec3f992e274b47f8e765d6ddde81ad33d4f105d675fd618ec7134105dcb3a83691e9bffa157f5613fc99b9b87691e24393f1ef63c2bfb40be87bcb9c1791ccdf343afac5eddfc78209ff3e381e81d2431bf03e47fe895fd04fc2463740ecefff81f7ae7c7e3e895d5301a5e01b01bd8dfbc0eec6f340f929c207ff33cab0ac3799d9b873d4cf30481bd4e90cf817d9020b0cff91c98cee7dc6818500d364fe3d5458a02328c0c66b65d762e3a4ff773ac214dd1c93039194636a5c0624c9376cef277d1ed5c6cae42b9d64223bc56235b0b901699f7b9de2a947a542b0e48a61d9842c48c9c638e8fb7791a47e9449b0c23dba9300c4a5751bbda12ab2db2df9374f141dad45caeeeaa0e0d8c7709137bcd25484e10450a9e98224919a43f8c6cbe7a8a08c10629a802e888082ac801854d1f489ea488f2791b5b01d6b3285e7a1b7935838daf6fe36dfcb7baf1deaf64f8defbef9380e1f852b4edf4507a390b14d9d5023f1698ed4a81d8ae626caf56ab9a4b2fb7572fabb7b9d65614fcbd60638fb9617e8e3fc71a4dc798117ed697cd5b21313fb75744c7474e1106e623453ae230393265bf7c1651f839d6cc9c70239774df2851ba1b90b479dc16c097281d69575b98480d9ee51773cedaa7e6653058950780ca93a0f228a8fc092aa58fad7ce9a2bbf9c896940eaf64a02ff332ba9479fa3dbb44e972bb24c1c4844ca0a027a2a4c0a7c7b229e32e2fa6ccc0254bac9af0a22d619a091a0be12430c0c4268f00c004c11c81a1c134317998f03b66bebc7bac41822ef11651d0a56a8b35fe045dfe167fce97f893be566ce3096f7382de41e7c7dffccdf7e871c2e7bccef7f86923ba905728fccdbbf03df20a05bd830adf636e9bbc3a412701e471dee6576cf50533a36d9beed8a175729097c96f42fe33a60ccbfbcf124f96200f24dbbc4e7e5d6df9cbe47103d17fb3c98ffb9c0c9730b7ed285d9e6d7fef092e6162db45072373d70e32cfc3dd26c01071178ff78799b96b00ef37f75ac9d5d6a8f3e38300f939e6f4f8207a2747c3c880e89d55cecd0379207a0747c3c4f40ab6cab1e4cd5bf246eff840daac5ea05bc6814260233d041ff8217b48173080596c6e9ef432595cc9f94ace267ba409b90277cb6831e62c133201de265b02989059789b5c318f2cfa0c208b3216dc652a9db6c423aff003c8af3721bbde263bb992ab2f98d84a6e25b7fd459915b2f8ca62a6db95552ffe3077f8c34c9898189b3232796e9bb7a48ddef181bcd1244c7396bf8d8d5ee1a129e36f63a357326fe3824d8e91e202f0a7e30bbe65748c0e350546c9c0c864340ccb0bdcf24fe37868f290797f7cc45d3bde1fd370127fddbc3f26e22e14de1fcfdc35f3fe5836799cf09efa3247eb4b554b0b0b005f5ecf46c297ce821785eef03fbd00f2937637d91b7215f41c757cfccdcf31c785bfd13bab17e836e16f7ee78ee046dee8550a327ff33b332108c246debc0b28646f264f67e978f126efd01fac302a227d08712492991767f20e5a4d27686f3665eccfe4167c6afb265b2cc0f82177642f89b3ec9b903d2167d997c9de9229635f472ebd9f6dbd293c23de8a4259f088983bec5bb1ed074097b704ef8b6dbfa54b55eac8b6cff26c486cfb00f06cdb3d0f6cfb247851b6bfcb08dad381a5afd9e623eddbe45f3d1d6d5e3eeb39bef01f9385e4a79ba6c2e4789dbd9c7bf6e732c7bb9057392ebccdaf6cf48e01983889913b2ebc0f5a08202091d477e15df897237089429007a4bd1c69e01206c6c75d387429012fb75f7412b227611f8391ddc8738b303ecef255fdbcaa1aa5731609080c63354c0ca5dbfeac2bf0f7254c4ce7c7f7781f757cbccdfb98e3c2dbe89d6945083a5004d285b97bf46c552e452072d420ed3014db658f46a9da254ae72dd9a58bee9e483b5c04c6098f885dbae876f048b9d4119276a85dc2c474ec1226e642ee912739471f565b9925e22c98989f3ab04b98d9765bc45930313b5bc18f6c816aab0044bc4046fad0b6479ea437844bfbb36d90a5a181a915b2b551ca0bd916d5963f0cd9da6acbbf8417c09027f9420e5357db35d9de2c6e92242d3025b3cded6c754be4b63f4db6bbdaf23740f6725001b227ab2dff16b2b7b2020f0c4c1f85dcc382d7c00371c6dce995767ba4595b36af6e6dd9595299cef2f4ea854954c66da553c5af3fc9958ef390de7f92250f7efdfbab6528c04a8616b6f72d0809dfbbffe5722583f7f7bdbfba024e54c6ad85fde54944c6d116bd9c430bd8a5980d3111228a9332aed0990194839815bb3db9d893c8c90744b7ef0ebebbfd3cf02aa18556f264bc0ec6224c670c41b1e0bb408920874b8a83d163cdd5f70c5cde9df18f35aa0de052e5dd1c31383e0d5cbe0e960a37c69a991ce0720625a4b2450650466e7040f4e2c750018315746303b8a42b1857804b8a5b1160acb97a85156c8c359ea699b51e634d0c9f0670398b5239cea201a142a8744cf3a751ce42a5484400000000e314002030140c88c462c158288b7355521f14000b859c4e764899cac324c85114440c31c41800080000000300644aaa6c02188e4181961cd6c6edaafa28b4bbe28b41ed979d7d036bf25f95f10e916ee22f4a890f0ab90c7bdf099538f136616b575fb223641cc861ec8375c4e4fa8f7dd5edef94e40908430cfed6b2aef4e43ef44538ca396fc020e07c80769e01c0a621bdbb9b7864e74aa16962a740eb167f5fa23ae9e6941921adfb43a4d6b83b8e92510e08a4a70b8bfe781df07c8a55483c5c1bd456c6850cf3a09b78ee41933f9acd2e0db3dc5fdce3855abbb5fd339aa34a3cccb7f5851bd4fb182309a6ec8c747922d804bd9f1c41495c6d04e1276fc7c6da864f0d62413b4c230b7a72996ab1f83d04c27224a910174a1ca7932fac12eab4083cad6c49cf53f2ad6fd69233f8490e9d6f055f1101728bdd9aad027415954b2823019aedd23224723a806049d41a928122a1202e6c63f808919f03c1cf8d690a01a5276c8bda41716bdc166770fa20689b5fa4a2d8f7b30fb0f2c6a8ea628eb3875b188f1473fec750abfafd0523453616ec98782668ba65cd58a7fc2326165e730cdaf0155498493e6ce80835d4c12b8bc4127b67e043dc78a2975f4d1c9496256d9b64305795ce97c9c42842da5fedd266a741070a8ac582931116e07520a510fa99a91e1abffdae5323ed7022e424ada990d4d5a07b32957f2078f0f1becc09de1810a945918a0c534ae67ac5bd483e8c269ff0341924c79b42a2f87d105227c0bd384237ad1733ed7deb4b1cbcad89bde28c0926268b3df270d91224237a181af2d35df207160844e31f7bba2e894da6d3de01b08bf3ee9112744a71dbd4a2019addb30d6daeeebff5f2d2816b0d89a42380363679ace656bada6b32094c12dad09c40cbf2bbea0577bec0616449037ecbb22c2c555ce87b5a42542570f73b0100683b4416d85e5fab28c5ec6a53eec9650e315475137ac1e3f7934a41c7f9079b4a4b010ad9163feb453a3d95f2ba06f9b0f416e413ce414e8a66317be3f4be59433338af5f83f7ae506007f3bd845643a506f400369b9172fa5e48b0bf2e0cd98d68501031a1b7514b00d0b1130b5a165a32a52909ba69cbeb83606fdb51c0b73b9e967541cb1219a9eb59a26f15100bdb6dea6173aaff8c39948741385b4a17788ab3a1c6b29b7473e2b1233cc430bf79ce743283011e081eae0c5a203de2eac5964cb81e282d9d7105f73f3710e89e403353134e9b4c9bc7f1092746a19ce74a23af770fe66781baec70a24fbce088576e8b72dc0467371773159b9aeba9354b53f1c4f79964fd54ea70aadf8b1f17a8bfc81e03f2667870824d0a7a69d15467f875dccc4a2a9d4111ba83795d0cdad5f04ae154ae9d55d156ef049d2174eb525103bed465e5f7ba4d21b8ad1e077d7f9fd45c15575ace49246339ec66e97e171e41029bbe0918d4581d918c58b5549d0aae6b587bf59ad610c6ed0797b04bc00964c6ab8c678cba2b7e0b51404b144b7026f2d8094abe4cbaaed65fe1331b6f8259d18e825ba5fd81c270be5fc6a963239cb6dc3402eef8a0e492411fc65fe9a86d4ee65d694be1a955cda78b9c2d923f826da16bed96f32af6127ec0425a79c774b3ece60e4b801c527ae0cdcd86f4e50a85ccae85b6bf10c2c523ac0cc8c99501a6148cd493667bc56bc3ff1c80f90f420cf57bf933376071a04fad34b9682741044ed24d29033c713729cb211777290ab79e20643ad34e4bbfc02a8d1378f62ead329610dbda4b47160872f02743ac97b4cdfd921c1be6ed71aaab8a09c0eb6602e3b51ece1986b8b274f72b601e86550639b14166257f672a081e5488add638d46f440a5d34ae418c8d27c06d4241daae68ee0c05d17566413a4c68e37073bc1a14c462b3a6b6e5dbdeb0910f3b5da0226bd7ad54b7d2430b10b346ab16caa8feecea3f2c788d04a819b2a0b010020bac9e56408f04aa897fc06b9dffc43e7096b636733c21954f2dc8b13cd26c85054c58a061485de344ec11b84b7c95589994a006a23dc9d62fc7f78bad175286f4190f905de7006a50db063ce11c20d3c957ec177dc0375140e61c80a23d30c93900e2713856bcb074a1f0df9e1211f8497289d57f2913374cdb2d7bd94ccd655e0e5192efba1efe6d276c593184fb6b46297493a322d86bf56143667088070fbc45e0ab780394aa9b9b76c0e2524374737b5a7b5a09ae4b14239b4e9209bab90f7416216668076cb7413a840fedff8aa17272baf8ab4c132224fe20320723d715e6e8132de0cf01287e0407a8916db1a2292d30ff07b4d8e007038ce5d4aa68d6d485c83e2ca5d234708dd78c5da5c504cb042d8952479a992c3ce0dccf7c18991b170c604a3c915faced98b3516df2931c51ec8ad540cf05de6e3e3d106bf95b4e5ad794dd0aba40cf528eb8310d3b105f0f0433da8342b92fa7f3dc91ac9c026182219929bee985b51c8375452cc5032a7d1a4bed03b9b4a06dc207e71178f21c47282644246933a8c022a61ba8a5a2014ef1a80eb12d4e0981c8a72e2182d8edbbc24c288c016e902e9ed7cb2c5beb847d934c44042c37fe08468b00e940e122d53a6220a3d83d75784f82a003ec1a53a6301dc95c0ca0cdbd90a4ae5a4b6f675d3c63c4bda5e49bfd3fde28d54c255ce201b35f67cf2a4f12048c9a88058579d4856d9e711e0190e5609b1ded71c520ad28fa2580ff78818a1ba0f91c8be53d6e57bb4f223058f00d28e671b4e7eee800e21d1ca52921da8821f2f9f418be00bff428e499d3c1f6612001bcff5d8e74349524ee00e716e1735bcccfefeb0bf80cd985c0d1f53950883f4444128f16b0ac2baf0119e7010469f2435815bc2e02181ffccaaf17d2a772199117faffb6e5c966ff05c204b7ed5d08abf06e6a413a6792888258e4325f617822a755039930560da0c986c91aa4e07326818a27afc4419902b2d994bca0f75be83f103df76e22e3cf7171cdd34ef95a275a9dae136565e69952c085ea4231f51cfb394ea1832757d70b02d0120f076ab32fa094a321ae143194ce0645ea8aa7c6af4ac9d7016b1690b7b6a7c449a5297df4f935b8778b5fdbfb6ff20001cb4648f2f693a81f674e4f3a4b9205a842663518c17c0e194bd0475da9f51f332bea9473a0ae5fc4481bfd32c8aa3cc452eff38b4d382d29b13e4b5cfd0225b6072187ef6fe8d7d48e0273208b54af72812d87115c64c2e383db4e60273f58d0fe32ab24248e0b536a88bc48eabe8618dc70b2e664e1b272a6598580e013cff86a07c84f264133a538507527fa3e6ee4ec2104812a3051631540954598e0a3aa0b85a702cce423b07df56e62040b931544cba38dc724f11184d034bd8849fa959f6280842257ff874f99ebc9a8cb3db4ed4c0772cc3fcf4dd666fc25a4466cda78de2955fb577f1ca84e19f98e7ee1e0b18361d28e4744d9857e4195f7f2f33e18f68726eaef9edfebae327a555d9ce9576b0a7b41aa1d157995deabcb0b95e8db92c6f6a101aed2f55499259878472a4a2280951c0f50554379d8455ad8c845f32dba842f0ec93a521c9b44e9fa622abc1075de4831ba9b91d83d2a7c8c49952fb59f4a1bb59079b4d0bd43e76efab9877ca3d76dec69ac7ecf93ec558d0eb03e069c6782c293c79a03760cf45260a38525fe28b37f27ff9e183312c16165bce7e8833d937bae1f99796be7c2ca8f0c0eb55375bab909bde7ee50497f6e963ed4439dc0d2a2560e0b7f2842a98d1f282836df8ffbedd8af7c77493eb7e3d71cf1065b8b3f1fbc1c35f9b42ba1ad678a48c9d8a84d593ab47f3a55a1d6a0b768ffb2c4396c192ab4e59122cce6cc579d049038f9f08d823a5c850060a576007b2a39aee91eee1bdda5be1b57efaa31455cb8a3c6e629711a6b1af8e1089f6e571572e1df7a815176f9c08a5d9cdf284ac775a8c7ed6538821fef5e42cc21f727644fc3fbbf4c39a8d9938a26ed0f826835da3813e1795d4758995a7a5a5ed8c28dcbfef1bd5e830c99fdac2ee38b607ce204352d2ad3948197fca339fcc69a8177fa0e26e8aa0f1f614cc6091f417cfa82b5fb7a2fe6f4c38f0410ddd127046be3b2985e830270114d5f1066ca91d3ce97ddca5ca9b20d72a851e11b8b948e058c0b76842a6e30d994bc1da4f75bece0530dfaddea22c13ffdf84f41e695c9f02964c51fff72936bcffcef95b05010203b77aef054dd6d1129b921c2ab27eef81218b3e720588794ce3ebab374db894299545447be7ef1d6adb47ff0644a87058afde18c584e0268f7a2050442ade83be73c8a3e39c6e33dd6004971dc5da1fd4e61b8ed9e31053511b5949190c11ee267d8bd81e77d1453dc9ad2d08f7071a677120821e81c51706d423451b4946d64dc9393ab88122493919dad2543ba43a85d7c28e3d6a99f166c72ec57fd55823c2689227dfc6cc43fca65a6592df5bc93a9075cd222ac6c33647ffa31bc8073642fe19c62e336c3fa95f8cc1b9d0a311a77d2d01841b0da893d86d0f133600f5d37cd39da379dbe4d24407220a4b60e0204fe34de4638507295476c8ceb1b8dfb2a57ba6e177734b8952ebaee2e2e44bfde556c8b8ad6678307fddcab8ef8e96a4fee7057eed21accc5ea77defd4ece0c439bc0ec79b3cf95901fba89ff9e168875a110ebe2f0b9caad1f1bccecca31efd4c58d8e5fed4a97db2fd96c958beebbfb0bd14e0ea6d8f6f9bf7dddadc17cfa121e17c7dfdbbf8c5b76021b4ca2143cccdd1b65865cb09642eadd0fbbac0050e15d40ffe07bdbab04fefd00cc72c27ef9a348fb9e94c2644f77eb69e8e7c9f6b6c4b355ae74dd2eeee86cb25ecf453248812e685a3ca42194b37a3ab73840ade36818eab83933a1775bf14aefedf6e69bad6109dc30dcdce4db8d68e82fc71edb771c6998eae686c6b5c29d0ec68d41e75e61b31ed63f6cce6e3c3793338e8a0e51ddf8856b15a680b469e8e75d47924c5f89d3f79c151c0997efa7ed4cdd5d68deb78ac4b1542c190b8fe433b7f6dc1ef06873cee5b5a7a1cd1a8131a813052c6cf24960f10987fe2579ac4377fe508ec6ffd2fce52bf525487b7e14e9beb6640abbc83ab0e8f0801a604246abb544ccd909d599d42860662c6056669c3ae85b80ff9b294116cf563a73f8193fa3b3162d9353e314c0cfaffb586ab523a2532ba85c379d645d471198d1a1a1a1a9b3ee453051ac44231ba9a4e90720ad92e912fa778466f84b7ea5f00560675c9bfb673973be2aed46f5bd7205debf55627dc33b2cbfff2fb1dfb0ee995a109526ef0fe0d140d7983997dd80e98aa43f082953e4ec415165f61d007730144931afd2a58de5f2f15f41c5e969c71d1a1ff4c88fdb53626d20be8a8bce8491c29b78740ee8099a71567745a7315122425316b4e30dff68dc0397ed606d9e016d1fc92b39558691869c4ceadf07ba6ef048fcd9697c02a42837a298918dcf8a7aa4f61e9901929e95fc6a3c4e17f96c4fb78dcf87f2f79d8d97471caa951e8d537e71c5aafae28dfc4d799a848c3c0200ac396a484b3c96c0142152b6d671d85100a61861228034884094ae30b21649b81b16edb6905887a8f2ed7ef4069ce3d224a1720f72a76aa58f4c69609a830b6828229e14ea7264132f296d8e95141375f4131a17794ea8a6e450a9c3c22fd1ebf47a4bd64370ebf131350f88615ca1b566a2af850d7cc6498d65bc29e8510c8284caed42a1894a1a3af3b81da4c8542b99e2ee3fd9c2d385739c920c014ad6eb80702c1aa5d37df538c162163af716a287c51845c6cd1d96232a32c1784039268468481ee3f9ac88d85d1cf7c70bf51c18cd5f69839311f387522808cc5ceeda3e1dba8e4a679fd96c5c11b030f3be41111b90fcc5088c083a24eda90f23a8be66f1a077a989876ebffaf4cad4c423c311edd9ba6c8f8794ae5a4c6ae5dd72e28c1f780d80ed4330e6ae1b05ed0fc74941a240d389dbc2c2dbcd1f213787de5e907cb2dac792d10e963d4a9d9724b541c4d1e9bb18fdcb435c19a63ea2f141a346bf95808b6e72e6b6ffd65b26edb67532676440b8ddd27dc75c403ef4fee00ccfe1c04cc521668386c1e8bda6a4ff5650f73073654aadf151a3e665b55523e523acc607d643baf145564e83f911b9a24f06a8fb311aa08f48b596290c493f1ca9f21f3bdccd57d43cf34d380c0018c9d221c1e8757dbfb0864cb5655c718547403f23374fd5a56e7bea81b41610be72064e767a88f102b2461267b23bf2e47365977570f88b41c465481787ae588f5c745de2bb7c2f432ed04a6519bd92c3dd0068500602b4da0eb2c180110580523d1a8e0bd663a3f2f766f2b2598d49487d13187e64613716b6b3fd0a4464a009dcb39e16df2d2423fb7154f20bbee75c453b004b9d5e879a033624770b10b0190e9fbe137fe2bd98cad37b01e3f9a042614d59e24899219e448ca42dd4cb700e866d244fad71747d416aba1e85c017d8f33c132c45e18417c289f0c2d572699842d885b6c0918616c03f992180ff25c729891bddb74942b09ce98b90e77ef91ad48270c84a5a928e8c86fcc91e0471f985856abdda521717f00e25a071433d35aa9e23edcebccbee67624ad262fc9a3d04a1b0ee0800e3bfc1e50ff796fb9d0fad3d2991b0effb88b148089218da3c623622a7ca1912c182a4f1de382a04cf508e3b61817f34dcd2b671ed8dcc812c7f18330c5086c4d07f019306096329407307a819270edf05c3f8ddf8cf8ed4910826eaba2780840baeeb3d386ea7359f1dfdf929e2ea4439fb37e415777abc3f551aa5d1cc81bee055014dd043ebd977376b712aac120924a61e06af20bbe7e0032a6e8fc2122c44041049e23c026f1d85f0fcd8ed1d51ffa708d5a96b5b63d7d13aea1f8f4c2439909b70f59931e324d15eb538293fa93ae7b591da34fdb149e382f738258a216e2c7bf846af43a4c76b49230a344860135e5e94e109e09eb239e3d14c301ce1e0173e499eaed86e1ac7ba96785cd7e816f9c20fae8afd70426af20089f31f4391f1ed51a5a1137b7535d71924c01516e94cd6917d4bfeadcf3aebe0ae7479d2f5ac1b1b2a730393a3dd1e25b12111d8a4333f51c4f2b48b010c2bbcc4657cd24cf9b385a40c2415a6fa038b84e6d0037504ad981b9c38f7be8e48e1061aa42f4651c40c61725d1019d17e5ebb943e591acbea5c63716f786212f58e653f74eb973dbff74041df50768bd10458b205c17781bfaf49187a65b81dc422442330e75a4893b5c253a1dc03e8c01e7c13cd199e5e4a3ee9536a83f51a33c7bb8da8cfe3e277433c477f792853028f468aca96c0d028e186a9ee3d00ce9a70408ed6b2cc4c36b169249ed71ae86d05ebc6e46917a267be02c3dbe6cde60e4630044c5f4e6bab68f05eb7248d70badf88438b5a42a48ef03ed2977befcacb90b7b52a9ae61cad3c50f642d45e2d91af0aa24d4d4097c77640c9b63df7ba12c1c231f20e9820cfd51f013bda97a40d4a6d91840bf227013e7aeff2e69c4195086004b6b15c0ad925503772713ac636bdb3d1118c2ccc98b32c5d22250c868f648fc2fa5798d4e6a311cc85164c7602b2847b03c2330ac0d76bbb4c440117b08615ee3d3ad424bb6ca9b79a8ab998da322dace2ed7f59f6ecdbec3e036270335cec03cf9096bbe6566d1faabffc1f6d75cc03484b35e55f949390fb4dc457946a518ba02be154487404653a5f2d642cc8b32cf1ba87ac18dea9805bc08e7d53590cca02fd1fc9c09bf05388821053f4377745ea214de612024fc0399fde8393a755e416a0bff8af0f51d0a4da10dc0dfd51ffe830bdf3291e0878f7f19b05e363415c9dccf3b682c61a106736908375db2b2190288dd923cc9b37bea1c20197ace0aee958c214ebb0fb155139c9ff2f11b47ee98975cdd983b9ae3b6f9c7dc687ac883de6645599fe80747b4f297ab849d4e3c239ecfb063c34968f216a7f57b44e83cbecfbf102a81e083c950fad8c61baedb207bba8235a9e4eb489cffe60a2cca934012dff7feba6a3d05d475605ff96ab40f5289002a9255465ef719c0842cab0a27f6fede2e987817dbcd29a4ae5f06c9d02f30b960a4a21c0b31a815b81e385de81e37c6b88f9fbc4d8af1bd834b716e910203353c827b6b2794a1e1f8fae73972891ed7e2f997b71ca399bc2c68b701ab51c9521f37478085c05b7ba042c178dc781000653cf088f951e6599790057401d019d0c2a1e82e4961c065c172e86abc5d6bf0e39741f1c596796432f873ff4d44ecf6216222040b41ce43d3879a7d0cbd44fe21f707dba12a4549c8e0f55b6de5f4f0534f4a5be1d73a5f8b7793d19d8a12110255ee59d16e7e8d7c3ebce0e9c245bc987e7dfe13d80781b7f72596d7d4b960602f5ea14e792b4c1ffb507ea73dd18b7643b22e3b5fed219b921ae8216c41da0bc173907413fd438ff62d7efcb2d53414fee999519d4d07c8749f308efbb61ce828389a205f4942748fba2d395b61f4a08387cdfa3654910b73d4c31f85abeb9781370d6d5268cfb435b8de42f292f9a00fa46aad0fa13ebe001d559342f29889eb04e1c90a386e094060a13b016af8566377788b95cbe13e403da5d9528fbcb300b1555159029930ebde35062c84ca1fd84e86274c41fc4bd4ffe7ccab29aaf73ffc2b5f52615a67ee7dbdb3dbc9565a94ddcb8dcc93174cb97bba3ad3f20c85c8cdb4f9b5983e84f72155a6097dc3e23d3470572ca8a11361a144b9952e772a2b29bd7a9a57876274f0e18e28ba82b8b299d92b1c4109ecc000fbeaf469fa5b16672390575f4845b4da12d3561583b581756b34752cec247f6e1a6b4eb1184f0eb1df968f726f281ae5de1b6c780490b9ae104559d015af6bbd4e66c1e2a7348b4fcdd2de1dbfa87657a8fe43dff97dfd01239a447bc7b2420f5759cb1ea011d009c53ec48f0f8df52202389aca09c648da06f3ad1a26136038fcbc058a78de49592e77efb624efaad9571bc4f22b836608c16657bac1c67f03fcec2d769c88478323bb82dfaea9b22c41c5ce454098ad47b4364bd0e52baf052d617f0532229309950af87586cccbe498179941e3596ddd696c2533ead8720f63e4fde1fdf0b7ef94f72b25a46a572209f3a7803751dfe8bab1dc4ab609403ff490e9e036c559cb20faa6de8d41680bbe5c625c1d6793f10b1d4fa1e600d46e52445b94519bd5c83b6db9b702c8a08f65c1c002c572ace2da0e372232cb7d65cec9ce414a9c6959b37779abb99b25c9b4392c30e3291a4387f905a77840327d22d4376f5e3d41b8a074610c3b0737267485b06469cab4088494cd9757cffb4dfc63dbe74ba42831fb3c75d4833b82e395ccdbe0b57a10a71671fe70a12221888c878ee3ad18e2a7068a5fdef6756458b2110858768f505bfff399dce0eeda52f1c3c0c4ae48684c223cfc61d009580d640dcc95732819f313bab6290c29e6d6e3fddf9188585a31ba2661787de85ccc58a37e1ddae422b1061921011c4868f3a17290a4ec47ce56a36e050cfa9b8ad9a85219d50c44dc4a41ab6fc01390424072e960e558ab2874eb6662f44f8ad5e96b3fb2aaec1ef152e2426eb5583f66f62ce944e7ecf61471c587e14db53d68d15b430b1834cc5bd7f8c3231cda15222ae66e367de2d50cb7ffb8630420e26ec3e6fcf442bd040324aeba56e4eadc27a3128b49e11b6d11194082870466a6e01068d8d4415bd1db3e7e0920a3988716e53fd52a4b405e4960ac3aae5655a214ce3db4fe685ae014919505752e81d6ea657c8771cea6a81f351e8bda85b08a802143d85948f04f58a580ac72ba8d3c6a1afda51353f2d8c328bf551fa23e2bed4b350c82854853512a058fb85182123491a8476c0a4ffa169a3642b9615a20f10d772fe6e5d16dcc871496f08e40dfa360ebed7d0df67c4f2c8c0ed2db83765370b85c2c81a788471c08d6e51dfbc5e6358fd4dceb1b47dd1a3359545dfcb5734370302c4bef26e7dd7d2c316875512f7e3b7d0929db59a1daaa45897362299f967e5569238f6da3a549144169bc8a6319351f4e3b7eaee7eafeea95d1007d207450da11a76f2cb8048e0711b65bb1b718318c7797579e33ea2e2f3a8fc50a887fc8affd8e4532e3c5bc715e1dd961fdebfef7dbf4d0f634504e2359f50de007be3ee8792b87bb95b973bef1dbcef0b3327d25e389feb2876f2980c9d210d3c09c0867d3143a6b940d3d680cfee0c2c5f08f4bc75ab4a76232b92b4bf679c636124f6eca248ec8957b6f0f456ffa871fe9c17183e57bc8179fefcce34f69c362d22024b652664ce2053fa886e28fcfb46bae7eaf4e24e5bd911e0c038ab1dea4f0ef49bb6b223c08171563bd49f1cfb9a4a65fa3847604d43ff7a8e65f23e43cf4080c3faf6f413217512dc3220f6f4c97c6dcb471488675587fccbe9bc39d586f2b07f130cce1c552b2afadb5777de93fde037815d2d17c4351e9750f1a4e13d3facf8c086fafd3043bb6b92618761634914077e57e201403beae3a841ce6c049a9085de04b26dd7644a562841af8a7175f1ac38c343c00e8afda63bdf859e7f2d6fdd93afe3514923dc00dd9ea2225bc49075c0b4f15574da927a87590690f4b08d9a0d702f824cd0b31e678f478bdcb40444d43a4d057d05ce3a959e30ce38fb528b819574bf2b4c33626b4eb75847cfbbc57df60ec9dc2408cdeabf4d4b7317e62b8a4b6dc3a9b5cacccf27569528596ffa66dea00191c8f713dd2e5ecb1d1d41be8bc72e1343da6bd17d981e819500c8f7b0d3e5bcbb2430f1841256eeb25d1b339bb9401195a42b309860c2a335b00a288e2c2205a73d1e13fc678e7c372f016de47583c0819bf8b69222967a1ee250df46a3f516e3b0e8a8fe36c3e362144d29e05beaa0ea6f7ff862cd6574252df2b7a1ed7957244b48bd32736d59c164163bf0fa1b0af8068224bc283547c79550fb7a2464bea7f3a29f82620adcb21a30b38a1971318d2c13c0c30907216fa79f7b016782c27f01560271ef4500e5c11673c10a05f55a1c6e43447c0f27fa82255c49c7c95f4a4834dbce04df9cb6ec004fba64bb8a54663e67a619ce3f3fc5aff5f7fabc4ae0a2f241e333b7cf01dc667a7a1e095b1bc0a4a908bb4ff5904d5c193d19ca9cae754735747ce391f0ca7382ecf5bc7e53aa6dd4ccc2e664745d4f6f2150280e349a82fb3db134664a052d11689335410284a424d41cbd699b9e269c381a4f3799108094bb7633d4307f15f06d0ac9c51f7a9167958d6a73348ed056477ab7f1cc9bf4521bbc91c051365c88e761c445ab179d43bd3940c51c4909cfbc152d281b30069d12bda0e361b4c0f09c101b795606af7b5c4d34cb628a7e17c55594ea0d56e27d5adda63b4ab8888ba65c305f578ed7fb08b8028df6c1d6fbfde5f6b1716041060a4db3db2e77a3346838ecb424a4e879c567bd9d22035a0aec04412b11c16eb46756674b84debda992d549f4ddebe808eafb8165d51ae79b973d0ebdb5549e5129235c03eb825d0b63e191f8ca8f5880320d8e7d5c226d8b2752220e6e7ae281e87fc532be263633bc63f572a5534bc5b59432fb97e877a5d649bd5f5818beb7b88446fda1247707161d8105a93b2535a94bb9bb67cc1f9e8a03257263fdd14a1e861e1af7548a2f93d4f8e6ba88a6c10fd72709cb962004003577a70e78c9eeabab296cfd8ccc48b0c6954c1e02612c19f1e84f6bd03949127c1e7b452573b5fcd19f2ff45bc5992236c24407acd71fe6b5abc288e809e0ec3e58763ee8aaf837ba6f7255e4621b787a02b272e67f34decab9687649814e8b51d6430a08798ec67d783dd7ebd9aa15edad076b2572a551b039b16554f83f3de74e808d13031cbbbd21833c73a5e979464e24a41ac0e672b6e3b3b8e42281bedadda068e72c8698db2869d2c28d16103b0466772090871fc62f0999c39899744b4344e239def586a0b86ad623955a3b5aeef1deca030b10f24876d30d52a0476bb12ac21321e59fcd912bc0c6c7bc18901e953501fb057b2624f053735a4e064e324c8f0fdc59f3de3ba4a4f19ca2bf59b2d88970a5fea1a4767100b53f868f975e87c16943f7301911a65bf1974dc9b9ced20bd668f1e2269d4a03767ecd4463ad946b90231d2d1418f2b7e9cc9ce8894161a33b19968087d6067c525b326b27bc14124496cd86de84348450da6c42d573b489f3bac52c43bef76c3595787cfba5ce8ca727978f5cbb803eec194b170909d1d26b57af4dff8ce7b437089e9748590a1210390ca227c1b908eb1bcafb39bd84d83ad6143b414de1e920619b727e60591137b6fe2beb59515c351c1dde0974276ca851ffb80b64776d7591a091051d7c446b33e8f80a55647f8bcc77bf4a33221adc3be4b28778e84580b1aa99ac04827a755906575cb0563c2a629f55533fd9d0150a29a4519846ad7dc0dbc6a54f6d54c76b4f0cda082c39077c4f2a909f6c516c6433837e893c402ecc24cea66ac5dcbc1d3fe60c415c8ae23fc5c60b364e626f09890dbcc32549ed4143041f4b53b13777c2b84e05b837270ca8fa6b8c4588939e9ff75fb5e0f35ae12e7575c143881d9e748569f6fad540433ad6d08441c830b8baa88e419e70add0d30a03529e092a0ebf5f24432e69428eb3bd1cac6befa24da51690632b3225a8880138d09fd426caf8cdf39cb0433ae72041c7f9007073fb89f0819c3edf099cca779b413d43db84336c380c3b0cdacf556e0f0dc2002ed284f56da2101808aad0dec877c1c1d422d17bbb90657c390454720aefe61985fe4df68ddfb5534cc5889982521b4c8abfb82a792b2812dca4c0b47e1595318bd795648b4cd8c90391ecd2e62d3f5f98466e9a2e79024c0f54ac3bbbad170426614dce40448d7c7f70e2a197874471df9bafe5dd9688ba0f45a10260a98e447cf371eb58c398d4a34b829d9a38d990abded63b461dddf7897ef11f6f00e8e1cbbc46b17c69350fe31e5dcb7d9097999b4be21e963b5fe68da3f3c78f2bf3093f2e8ed1a90908aca6e0c5749c072cb39bc55f9606e2d6a8e4e7c78744690efe1e39955f2c457eb1927931df5fc33abcc03a400ce6b98a5d589715ef8bc2499224344b03c2372d14dd711976ff37d3abfcdee664514260326fd557247699d81be762b8550612d00c4b66d13802719aac6958e82bcb5c8c3610d3f0f2c622f1291ecd1161cdb446368aafbac2921841e8d094b1e945e0e00ae47c1bce0b9fdcde34572c00bf256509b0c7958850002d30b9898e5f247e4cc8498d6addb8b124a7a203188569c0c18408d8164a6e3b1320e8eefe548bbfbd43a3015a80301630c171bf29b23da4c70f63c753b41e10fcbcb58107a72b21532169c40a7e4149683f62e95e33add1503726e011bcd5d9eb97da523305d8302f9a519422bd6b98b6a52c62662398650035d4be9147ab8c5426560ce27a6aa3b5a98267e93358fa694ad177ebf07d87e67e1dda0d0842d605c96d942fafaff1dcddd3af7e4cc57c34e53d3240df56d08e1bc015f86fde8244582e72c55a90fa3aaae4762eba67f7de9c79b8448de21c2a1291fb034e8cd65b48f8463afc461da58a383b74222c446c3dc69d7c2d1185d4f3a394a62689839d77dab0696900de73db3dc70444e187bb23a6ea7e8a7add6cc11805d0b3e4fb37a1d09d0f8925171b473e40adcf01e64818bc0d314de4c27c9330800953b05a2d55ffb629b16595c825c3bd80ed62193ec0597a9d463d815b3275b03702de3f644755291af9cb842214ac8acfe2922474e4f93fc1fe1b40f18d0178c194775ac6f7e818314231bcf3525f55f4240119e043847aa3ca6282a359e7d99152229ce042d451f9db8e95dc53362a6424d694ac6c8e8a03bdf4d15f77370f89e16402621b4f5ae29337a806362fe717edb7e6b540a3185de330e5d3e401c73aed00b4758e38ae006ac3101039becd762c7eaf9b6aa62bfa6e9d17f8b0c4cc58a9b361b5e5d76c1ce2626d261994b0f5e219363d59347e727be36a2c6015f2584fc33bcf24f606ba1ac022cac8c48bc1b2f88ff340e6929e7811b5fc72e71cc24cd8b05bc7f7d989438b28232f742d12eefbc1c076fa85b89cc45da3474292a65b98991c9fc63011882d78829cd40911b0967f27e0f58a469b3d60ebb801fc424e5f0cbc988cbd58c67cea00e86c374a465cf5b07e70e4c0eff5cf135a4044c4c5831d3cbf107123e0031136df7c5089f28acf772e9f1920b4cfb0521910b7c28002d3e7a9972128bdd80355b00a6ead7de40171b10632a523822e3ebf17b79b8f0d21fdc27b280c1a100b51d0e455e866a07161c40fb4fc718f5823963df992ede41aa21bbfce6c6885851ac5ff34651e8774c33f456e8ae5c8e110dafb3b0d1c0d17e1bfb2eb96dd5f49c2601b169d6bf8fd41825ad224a24b1cf67e98f5e8be20961b84ccf8e0a533383caa9e7f333ec69af0eb9326e7827b0d416b43a73aa3670d51f8988ae35757b6666f0a744904868631bea6197d8616b6e83d9378c14bcb2a951f8c776ae52231e4fb11e5bf6ed0b4e3e87009115c378a1ad2aefcf386d64ad74ecf6d5488781ddd7c939d8a14a495d6a85b7b24f94de3418142f162b5f6ffcdea3d199f4a9c3a863f8ae93e509fee08abb549dfa44ba8711d4b93d95e1d199f5ada74413a1ecb1a4852a2e51a8e20b7fa6be379a3eac5bd084abe959894d2157d7d4fec984da150d25db8a6b7dca60a086ff38ff02379c187a53b960461284ff493978c9a5b0a45e27d82e29093ab3ca1320fa07e2087dd7bcac5f3733f6a970345459a8fc4535539fc9c4f4fafa4c464b94036f4b42e33a812b80b225cfebb3560a23fe8d28d6e1ae111ba63c0df54fd61a8f3b325549a95f89008867962fc749f90602ace905e22e211f1c1280d01536d337eb942509817f1d4548c4b930c296e336734b88876eff232e13ec75f6c12cfb63bd6323d1fd28fdda97fdd61a7b0c4c3ef6b1ad875bbf31a4f30011b99794bd3516b85ca8a64277d81f0840084e0b73de08ae2fe1d3591b693f5da767a77306ba0aa27aa02e384f7e20aa58a1b9add7bae0743ee21b5186a9d3eec119271eead744b8e351e218860456ef738d87ef999aa32ec4fa5f5c5c5f4ccc7eb214190ab7d8f36e077c59e3fc89d07fb13105c5fda07fdc809b566e63f63952a1e5a1cde1d69885440bd433591ab5b3235a9f56e3f868d578f0a0d6476f4f25f1ad9709d8aad2127738c1d66842ed0fad1477fa07dae75767593c954f5dbf528622e6025d890c382b3e64c4fcc60a8f73cf1a3308872171128b55bf91690c704a2684ca60163779e1b47811b9834c7801085f0a3e04245d1b0daaf8488c679c46f966bce0a854f8682bc1a2bbacf229dd0fcc7323c3e83dcb8c4c064840a1aa2e18111a5f2824d44beaa1605a0ec931c2d3ff7c24ac1e68d67ff028a995319252ee45082729b4c2489366ab5959f40a3159e65a06b12176211c3d43b665874f5ad28976aa9efa427e3c2c8f0bb7cf83839f18c8c48305a28a5bc6611a6fc011950a861a9e0fd415fd3a8aa10fd522a78b272ee34a95a6f76b390221c5305c2c7f90141bd28e9de2b03ec1f2edd7251bc1d5e802b07015660e1998807181d2080cb8c36bfb2e843a43d875168bcf028d8aa7091f0b0a81c1a504fafab097a98f792178cd69d99d2775909c08f0a48a564373c4406a15ad0e11e9496d758864c0a6970ef07d032463b3016d705e4f5092ef4ef8bf89465518117a2837114173f067ea53c8efc8b9fcd313d296f3d756384e1a2794f9c129d97f433709340ed07dc9e65f88f8c66d8e7ea3c8213bb54ed3ccb76d21d194576aa2b093b755833c3ef50b7f49666e409b05d052b5225c6286d98eafbd6205b8dbe754704d0cc8de188ebf8ad13b6cbb59a8cd236d31bba93e87133cf17d92e345e7f9596e4e61faeeaf5dd8cf73a04d225f2214cec1bab395a25b3fa6fa5ba66176615a34e232909d27b6bfd20ae09344574d1fc7d75344106ac242aaffa391d9364bf6b0d860f4caa5ea6d00802077385b3082113d7c8bca64691b8b9f099a01fbeeb69841ae6cebfa5e26685fdf2f0ecdb9d395382bf9963fdb685ea3c0178a6f6b3be66950c731101437243591f9373da2295e934b4f005853c4e446cdc0b056e0032550d01239c09276eac58b26f02ebae85e593db23b30efd6fa60dccbef3e96182166c5af94f44f1c3efbd92f086d6c007489a9005d7f0086b04651b61fceba9d80ac50dad47137bed8ca363f01c421812059a92f460535c5750b55b6232ff6e297979ea25ebcbbfb7d97fbbb52e3b866fee4b90b1ffc4d7a695adc4b82eb7f0b4c7372328ee94fcbe74d2363d3d358e61d4128de0f34c1d17f0cb100366bbcc9e00ebd01d5edbe054bef0acd200c10fa5f2ce6553c1e4b8e1f04160c394e6c5bdfbf2e69fd49a72a516a20d653094a5e0b3b0b475b8d7124afcf3c119e70c2b9b53fd4f44ea89d683b263055a1d462b728365d034085c0d2facae5a6566e004a1855effd4dd0bce20a71a3c3a5294e786a90b679be10f04bcd595f04824bebf152c573e3185c2d8d0cf5727981297b588ce367d39b303a1ec1331e1cc5fac1ca091c00a22483e28e023758b5eddf115a63137aa0245ae27cf6aa8bcf0637cfbe6e5dc43050f8d698ba37b2efe8936e49b0614986308a77f5d5ae7030437111a007d17af1784948d6e94961d2a89c2a9598043b9f5db3ea11a1a0c13755f7e3225fa18f544d3383fc90bb75990c87322bb6dfb411bd9a6624a4861ea8a48bca8a05757553a939cc741c2daa7db5d53e9b77ba08a1f8ca37fbdfad5601498c98f710bc0a9fdf59bfc7383154ea4a75dd38b00ff8a9259f84d24fb4e19bcf9053a88da1527313c105f3556d7350a3e2bb24060062c2e214ca3f491a080a7483a022d526576e5965c5cac749a3d7b05366cffa5c72b89146d984a8f5b53e659b06ac50cd3a99a7afe6c94d3fae33e67ef10e061d94b6a2465f03cb1fffd2314fc2bbc6812cb89c47a49b120b49a2ddbeaa4d63b87013eab4e9680a0175b2441162c056e7391eb12f7ea116886012df529096b85c1bc7b0d87a17daa60d83b98ddbf3eb76855e8a2f7ad80facd9e97b276b513148126e4a26bdc19d45f4ad643dfb5510d208f2244c40f5e155249f3933605d39241ad82ecdd6c68c9c83de24b610068cdb759f12c2bbf3a0745b1360841add126512d8fc2f8e766c432e15495743928dd52f3d2942ab3967f5d2ae670e3ee7036d958f24a866baf040f6051d69e78b805bb04ee04ad904371316dd133722d7981423fd7d0bb3d2154367fee4302b3a8b09e978646fb88f0ccdc43c72b098a0777b7a4b78912857576c6b7f6d280183ed596c5af879611c6eb2c5a22f2d2c768fe7d2fd3a937434fb6ab83cb7a4bdf08a1500f2bf92c8510abbc2c635b547b09beb84a64fb2f401d08e3850b4f3948eb15106d6a1f6e421708e70eb0b862945bbaa8494b017fdd5cf9254465893d891fca66f708471ce88fe2d401654a4f8dd573e86de0e212b24571a2f38b84c53ca0dd88d701458a566c23be800a20c095a886063af918c3de3ef8e8f3b5221909678552d9825c34be350a5c297fcbd4c48e522b21bfefbd52c446a9951e8ade1f1c7cc80a319fbee8edb7d8963c76056664ba861206ea487e60d81f9ad2e26504e0988c8d45ccadac8ebadf955c0823c80bb493cce468fa96c51a437c27b1659841b942726214fe8628cd1ae16e0e222252f5e2b6aef9924a9ffa2294db4866d553d6bec3a93118e0fb362370b2530e2b9f67f8474c359bbd2d8007e157dcc6aab54fedea8550644ed285f4df405c857e40cb4dbdcf0d967332c7c6872ec0224276542f833a1a609f5f78cf90a38845b96e42fdccd04a6055c66a8af6652fdcc5f0af51e4f8bbc61066168679b178d0cd8d1f1615fb8b05d07d6f5ce9b45719fed7f653aba086f9559b0fe89bedc6a6026bda32fb705fca54e8dac482af251f49e332f7cbbd0d182e390a56b4b7d9513a4f2429bbeb3270e326c50b0f04132a6b4739c42b164bc35cb7e4ce3c0a7c1c5e7cb5a53eae2de3b9f1116bcb3bc0ada26f5c352ad3b03d4662c3a02902c985e2db84174728d715806c657794d12f76515d52cd2029acec49cc66381df20d36877ff7941900c3cd2a89376dc405e8648467f7014bffa8893c20104c0f654a81bb2a5d1239b76b6f0d8b63e9dc52450c6f24803289495167387768ddcf227f09d9478431a0d62af92ae51f57d347dd0f5c2483cdfb9878805b69d1a87c45a993850447672e31726473b8d3b82d8e69606a61eda42f138fcf54692f6ed00fc16587e3759237a64a75d43cb9c40e630153dd65b4f8bfe77602702af754f0c4a0695b6c4d52cd2227a112ed7e8e2cc51faac879cb45f700508bd7adbd6dfa9d95f401e874c5b5013e6e9411eb45b68bbe8c4bf6c0da388aff845184b86a1cfa47e7090c60f08f624a6aac677aeb3be54be1eea8cc5d15b7b7e0f11d2792d9cd94fd2b66d76a3fa47bca4494fd451822291ab80b2d4d0eea83320dc5cc448a1849d7012dc5686b389ebea2bbc49e6e99f9663ad16f1180a563e8279af3c0959e88f8fc4594a09b686c034ffd74bc64311c17829ca8b5eac1753e3a34311f8ce32087df25e2fb0d4ea6bfb5d29a804d17e35c7dd4a316749abe7ec97212e6676d3b6a736b5234560c4afeb2421605e6844dfd3b741937506a8e8d483883bdd893b41987e0ff779e08e1b1696f957670a6f80e1ce467ff10123408059a736351075b5f3b455082114672fc1bb8626395b0efff8a73b2f1c8a5c5de4fb0e3438a641a796d0a231b49bed6235ff8801eba3d1f283d53312d85ca271fab1a20e9ad145e0e440b406889ae65c7e31e7a2c69940f1c1e4114c73d3704d1715e811291c6550e1604dd81e0f7032477869a4f9a9bccd73ad81c4e43d72c8f75d14f188dfaa0a9ad8b616190b4403c2362a86911201b3ba99d9c478ed0c732c2727835ca84df133a3026ac651e83a30a97113cbb83a1054e9cd90ac01ca541688ec065ba425314eb23eb46126cbebf5d730fe396cc2ab602a9d6f61f71692763625952f5e84f5101e2deea61e442d69db8882f3f33c3d06716c4337fe10f3698bc84b70c29ea9ad18144ff61ddc2127fbe5370b4049bdb5bcc2066d60e559af6c6f8fdfc4d65403d2d39e15d77a0a04d801f5bc8383d31575f7e89c6a0c9842aec06f3f8dc79c585205830867ec2abc48d8247e09437dddcd7080aad3577904389f15702f44ab97d28096a19ae8245ae7f96a1454a8b9f99d44fe45cada1f65d03085ea6a87dc2c6caa0b4edd86f606b793e6fdeaa4dadc0f765e388deb6c4d6fa814d39dc8f9b69bb992a72cad5febe4b0246a8a29488664777fb1318b878edeea772a1fd48d9c5b5fa05e67d35f22cc857cff323ad028ae35c3fe5cf7d73d9d1bbbc5e9913a9025fabfaaff6333126aace6e8f0e5aed6f2322382c5914c956c7dc27fa5840f93de044faf5944b0c8b5201e138b5610fcf203e1b07668f0041f6aa8234d16fcaf769f1d22ab22e0679d73783a292ef9323ceff6151d3439b55d728073e02c11ee9d63891bf3842f7dafde5779954c8c57684c8a62295961acbad43db41edf58aae42e73791ff4d88355244932acf9fc0ad835f90191d457dd4ef40f9acd45b1924235bc9996dc467e746b71e8036d36f70fc8a800c4b2c2e7fe0fb8b07716fb5cc79760525b7c406e3ef079ab8d59bc51b24ad55b4e53d8ac8773e1f6e11f2c6ca064b5b0b054e83b164ae8966037828015dcacfb337772c8d4e686521d7e3abbcca1f605e5643cf827cf53cbf2a91755d1f8c5bac7f02b3be5267b5ecd964680017c939bd27009bcce42278894721fac119f060f17a677f1d1a588c7ed5ca7f7876ad40ce4adeb468bf95f849d504b7ad969ff04c253bb26d78db993b44e4c0fd973b43cd25619989a270bbbe83e08831692005e5c5aa72ebf210d120726e52232b02b5d5d71bdd692677bdf60735795bb6e0670d7c4442af5a7ff3005ae7545588170e251050537486b0ff1aa91be05e0e9edf7fd5dfead325fc5c3d39b7640b6da04566afae705ba720c9bb51efc4e1fa6636497aa57aa6e81ced008a406ad24f96413a5b5d1c88648e6be6e917a3b818f7a64ed2a5cb6f66b710fa17fbdd1ca8954e76d80e798c160ba53db3b551b0de98bb77511a9ad90201a0fb207834b0d2f042f5101639e38da1da468e86a53698494632fb565618283493ac709c8e9009f734e1bd7f4eaf2e200846ccdb3a118f5b714057cf48d0bef5556f5add479d14c430ff0feef7fe208123863d77b1402f9445cf961d71902ccb20bdd870bf43a965aa801fbad6a05f3579b28e6a42b3e264680c18d28da88563bc6a81d6c6b8668edf6c2330e757f153d4460dd215e9858d3592670ec91dc7302beece75338116a83d17406f72aafff8ec967167ff53e0283ff028dcf71889666b5d25d06ef7aa9d2824c27ba2cb4371b068583c4218dd2fc09d69faf4561ec4bb5bac277f5ef7f3fe43d20d8f10bdbef64cb8592d56bff35f1f4ff3d17057f3ad450f8c3a9e52d8b3de1adab25bf9df19c86307ef4ffb6b5be094b3da97ce23788656b00dac921fa0c782d761c4df684ad50332ea8f30e01b0f71bc20e5aa55eccce40f222fcb3b6dbd69609419e4fdfef7f3eef4bf3eeeb40f235ca7891ecc4abf4224ebee14eee83c287981d5e29e97eb6bbe5cd6054653d019d6eaeaf421a9aec51899af9d1726bc530cbe9c3f7dd070e3fbd40783344f20a1d80fcd58a5f8045453fb5d67588f0c25b277506368d41d7f22ba6235dcf9ac680226594dc433cbe0c61a48163076772152b0f8d5376d635a9040a614cbdc3236b60b388f9601e39c22e79358fd823614b4f2fa37f33251dd592d6998960d8e82989c7335e14e6533c4679746e9fb95402f91ae3c9f3551b8e40ab06ce4b3b54ac6100a0574e7c63967d9d4b672be032057ff387a0791491fa93a0ea5a48cbaa6f167465892530209212124d1c82a799e6952a0a3fba82d1c966a7c23978126783103e42a13beb5ba71bb1b6c55c5538327a5ed929afbff884e5a17a61d233387e39185e0e2013d509a84601c5f625652df67cd98c8de28df0c9f923d16490186feb647fc5d447eb7a276754f4888befdaf851926e69be095eb0f20004c4b4dc2421867ff1d3b650b0b9c440700be11bb35fa1ba00d3c16b5a49c60400c03a09099a7483df717d5b496017bc3fee2bcf57cd9ee792a7b46c505828363e5d99aff51d633f41cbdfddbbc1a178017bf8c00a7d3b5b57877e8382a4cf35fe1d1e4d8fccd5933247f12d9eb964db51803c3963fa364951baffc436ccebf91f197e5647a36d5ed0904ae5acc549f7a7887d7d63eedeaab91fdd8b52e28b4b0e4f15a4231508ed5d21460885ae9729c33d876480b18bb74f09af42c4c2cec85fb17830eddcb37cfdd963d338aab6dc7e801673ce8005981e26f540b7a8409db3020a335c468876317686b7458ccfc60e44a3a276dfc53e02a701f0e4990b8243ca5014a0f54e6ff1ca1944d888805aa2babcec95c44cee17d8460af161b0da3fdc3e8670d96c8a95362b4ede49653ca2f561a35882a207a340017c62b711cb08a2aa823601c31ba107c238bfb339427851aa66c26354999b487c89419dbcecb15bcc9a036a7082a31d36520d30a59a20cc0e4c51a58d076add31d9e1509cd8bbb2d2a5964b8e0d3c1730210788577e87d3910a4ad0068b11c0dd51f44d2bb35d70fd43be5aa9b0d046f89fc929b483b73d7d8064cc1a01ecfd2173c042a12c53ba6d896a6392b929686b10f0487a8445e1b4e7f1ef0d0e405b86061c536aedfb3d8482d08c605ed60ac68f634aac84f22d316624406907c65a8d4adaea2411bbfe10412edb88c69bf80a692adf06f1a7eaa3ef1054f0a966c17e69332300a0b5081c6d83d86a3443516b045c3be565d25130e5504373c696e30201f739d2f0094b6995420d8a46c547f65da0167ec122da5df4390500ea7f28f77d0db9c2e921c5947769691a065c94391a0eeb2dc8592f2ba48330d047a6baff95d0123ca0b483a4142347a0742e4aec84641850e50c79263358f4e49ca4add3e567290e74cbd2e93b042dba4b406761dafd7c7db49b91317997e1384596e31e134ad3b012471da716d36d63244ff4f3dec857a7b881b55f806205a3d815c60d2e6980de72946bf47c34b7cc64280d7ebbb61b9ae97c68a5e4b4254dab726dffa6e0220797721c14a74cd8ce8bfcf839763c0373b6e0d424da056a67d6732edcef8679f2f3d84ad1c780cd615f3a8e2f9ca4d7c2d8fe838442b0e61d2b9dfaca59f325b60a19949025011e902c4761903862667a21543ae59b73e3e2cac5a181f8a2e7ff5f496060ba57b8f72bf8fe27e37e1fcb8aa3ac0b0aa6b654c2caff91e58ef43124a7b9ba03a4f2f649bec90650057e511a9e6823319b839837b184590485d1ff565b1c5acd722527c7a472fcbff5836a7acce1e3d8749fa034c7f4be9dac3837529fa3db0cf0e656ad921e76891b9c5b83753e24c73f8c3e37bf7690b8071e44ee1044eb51aa953c41d8fdcd7c7804c7a284087d2c0ee9bc8e4d86581bd3e97e461d6d85dd7978cc9bee2b384062e843c656effa39f5ccf64108cd45987095e61f4ca142fb88e17727c3b2faff1980b3ab09823a86c4ac09ea0b9fc74a58cd3f76964b4beba07293ac746288f0b0d2d44bb6b080001aa55289cbc3b18e567f6f6fd7715998b36c1803991cd1ae1f65e866e439caa521668a48010a9816be06b1658a752233aa667360e0b0b0d0d1aa1e694a88fc0a36eb95d16892125e232ebed84fda72966b27e02538a4fcb51c33cfed9f447713040b75260ebffa5e7299d483ec85dd06ae980e4170811370bd99ababccd6eccd4363f03f6dc75d5e0971860a16051cceb9229c6cc43727ea1918d3b22320704c5d524f14554b6d93bc8c8d79525895431caf1671bb754515693e2240e21803660b5892c15989b77a50c8e87621908271f7e71e75fddfec59df56cfa00ab032c69fd822236d8efe42261bb135cf74d8c753d6c879da4ae677d9d18f391619bba8ba58ea44dfa878302c5e190c11171bf5467c6a9db64049f5261c9e3ce359c0fbc5aab49c80da4a8d885cfa8911d243aa6f7faf74f58589ff620566524ae85e100c52784f617a6442a70b02384f5eb8cf9d2a8760f76f63bdf1261036378f85039ed1cb2842ee792bba6079f97a2456f527402466f51c61dc0413653174009aa0f8af9d071caa17d622a03e8096eb30e756b212a4ecda4d7abc7bf6dbf00885a8b3eb32513d6e89113a949ef831209051a1cb514cb1df3256e4f04a97ba55ae3e370aa34699e89ace9c6fbd6c19142e9121994348b68eaf4b2179373b5a445afca87b2a15fe3325c0e804203e4186b1cf0ec7b741d282929cec95caa9c57ff1c33876eacdd8970ebcf6fe1f63f3ce781830544f377f9aaa45e2ff4f6a99ddf2d2a759a9a5082453493e292a886288bd3aa0754c396515bb28eb043befe446351353262455088499136b431c988b50bf511782a6263a34228b8da90bf2ac24485fdd9410c4346b8559327a2df2aea1788ec439f77257747decfb7f083bdd435280d878af66f1ed1a1e5a1171c36210c9beb567c4e9d8098afaa376e493626e7ec8295fe506226727058e381dd2a78639983ea9137247478f0f660da0f4b5a002c79e1fc9493e3751011544b2878106c91d4ec90fe387361128e78db1fa155ac17f348caf0a500433143ea94db64db0e307c71217f65d2f06f0d0a0415e000525608e70c17b93f8f12defd14e065b8b2ada779785436816513a5abb48b09844293f185127ee27c0ff534381e1ac56799f955cff46ab419a3ee2dd0d17627e8e6db4965d4a5520d1331c16a9432564af8de5fb1eed3c55d8a92cb1acfb10472db14b173c2d691c867904c575bbe82ad06ae5bb6e1090eb98a4ef8db6da4b499559720dd5a825f960ce5da1014bd2b664ba733cc2a87a6b1c22c0d0fb02bfa13a1c8135ba05933f1a10c6513fd5f22c452951822f699a4f756df528fb6f62de4677e7140be6f519c73f3023b3911b6ffb1b2ec6198b10e606e7ca0547a696df71b4f5cdf7e214c8023fc730b89b7817f0c6c2118963c7735d6ff7fceb1d536931b588951ef75360e4258c60e23e8208080f9ac37051b70ec1989e6fa9d814a4298cb95c7a782065cce6df647c05561103e5b4de43b22344edfd22bc5a4b0e310081ff02bdbe6550013db73922f84831d7901d8957cebd40210ea46d5943844c2257c448efb3a1ad1d84c25c5a5313663ce58b29de88c57fb0d981da72d942b81bdbec2595a73876b6b6e3065dc659b58e847c27b82c7c9ceaf1bf900fb93706b7d1a982ad5b0a7bc1c4fecf998b4274d57b1e4a9b08ea700d2aee69a669305df8e117b4a682952a39e848488ec88b031a9584ad39606867d13f91b05746775fb7d19d9d916464f189e26585dac1dc19007ddc7e1ac8aecf20cc0c83974a59ba12bfb8f5e6787d2265e9878f463303770ed75c1b88e8ce705ce9db583c7792dff24ff47fbf645b20aab1cc41bb0f5449f5da5e4c1a3453d337e888667588ccf6a55d589d1eb9d139fcb0f5c97cf24584fc5935abcf77a444bb81454ea64665c4fc4b4632a9006c09c8a134caf077e2d734b7c7f68e709c05b12f89f945af54a373e8451a70b23b471e701c485217314cc02fa42d0c3207aa43695e5a9cc11c66d2f0d0be675c282163420bcd807950df1182cc82901eb1a76282800b62b1283e0ded4adf09911b631b816be77b93f3dc3581926bcf81046c940fe8b8fde1b65ce968384149a76b05baf938633ad35bc05233921435195014ae166ba9dab0922f19e99ccfd25a6e67bb94a274f03aad16ea061d1dd0cda43ba438efa40ce998a4b9097baffa78dfa0a08e7dbdea0f14ed2d7689163aa212bfd25d9b62cb688dd9595587e0f7d4f56bc288c3b3ff629704a03073f3ff9437dcbb8fe66b25142614bdb6e095260cdb8e8649d5c91d541cfdc7013de6fd9bbffeac1a077b9892a025086c73dc915530d1070d507f53e18fa4d0314899f293c519779a60829ba096a2e1d339f9f9b9af19b4cc70f8bcbce8dd6638a0b61f573261e591a037fd1a7d89fdcea1d3c9b70dbfc256e489f020eb1c1a977dd7872d8f91a0ed97b10de2e09826ad42826e9925c01d45855526cd6c7c6c7a7b25297c79b588c5c1b4e706303e8e57ced62be2cff26542049c56667286650c784445b5afbacb9b398b66b89d023e4914bf12c4a4c549db9e06bbbb4182cef02e46e4286ab80079780ab5b6574dba3eea99772c993013ac8fccab64d8fea9cc28cf5fbbe7edaf73293d33f30dd757286db45f5e6935824e663232ca1608a376eface088b2e978d19069436cb90f978334576da61e276347e1e22125fed269d25b842abfe0591ccd128d91aa907e3e5870f2be32b3f06802c3f5b983f5d0c79c8199553ce1a89fea09f12bfb7c8010a3df1ca2e304ddedefda01e36fa212ead043a79b303e41764381fa95a9c0101c34d443d5bc0d81550d73c1bc9d59ab129249f3f36d0c7f079ae927f54da58659fbdd55b800e6a35dfbfe89e67ffce513db13805e54eda36cd1a11f2664b94f8238c4d7551b0a458f0848e41dfc39380ca47d5e2632c56262293e85799eb92d313481e4b818f8970a42b5de82e4809fa8ee973f279a4669d75d7748531e3bc6be0047ac87c0a46631f9ea36b4d24cc374035cb8f9a67caf48be76cb5945014b1ec4b5cd6c4f5348db800082370467320bdb68dda97b2366481116994fa84e5caff28dd80d8f38818d2f8060a10884a595f3344a958333deb0f95e5b4da03da4041d67062fdd645b1087e374c3cff1be6db7a83a9dcc4e40dd813645e046533a938c14ecce6188fd9eaa38aeebef19253f3f49bc21788498c7841bb57bbd3e1ac94dd1dfc745b1600690bcf1ea78661c9c539ac38b6a7bbc9a85065835802bc8331cf55a4808839d87b395a28b091b20d22ce19f6473bbd3a6cd0d14d401a2947e8a20397f5dc4ea3d2965a96b329a36a68134997e1569a091b5182a959b18c4606f09998d7decd4f862570810e634bd910f132174f9881e64d4e8167f8761b571f201dc53994dbd11af2b9f17b7fa72ed86782c2170c74d00e7ab354e750c3b5be6aeea5e3fc21d0c5f167be40b83e4693d3f3eddba01cb4546ecf71a3d09843a07b2127853a30402a24c7b67df03866bf0e99e65ea47678225094a9ffc48ee8a8a88adad7d78a59d1b0495e14ebc240248b200f61ad065c8e7bb75643d224fbb55cb7d253a23d66497d5d6cdb8ed3ccc2aba048d28584d1482b3709dae2e3c5a2f1b19de2fc95441531bccfc7e2cb23fd2d85915a17994a63725a4be5969e086c00557573c1c0b3bf2fea86abcf522cbcdd6db211ccbed3069968168a1fca56ce241137a15169757c82041b060789d9c25aff0e9b03fc9fa2b9ffb518e2dcea09d5354ba4bee4e47193512402fb35e8452b9239006660ec2019795271e7417fb557e80598212416ca5e48ca27b604150a564bbfffc3ef02d55dcabf33201957d68f761f24a7f71fb8e8fe7bf1d518dc57b7738b5f8352c357ed84bd1fd1d5313ca0b33a37c2762968ad5200b2f9badcf94feb012f8090a9c05e2364a1b0172c641400f59e6d1addee835b2cf11badde05aaa624f88d002009756ea42766f119aae766a9e524983a3fe95ab70d6d5025c45e713f9567ebe455e31e7c3cd1bce529b817b5cdf301ef8c1e6bf30c6e9e26887fc293463e9c1f751870771839bb44a0d7ccd861cae7949c69809d149c4f60318f122852b04d8d81ad90117ba6346e57ee476281e214ae042e0966a66c14c6a91f3273ad1c63502d859788f57cf48010fa0052bee1abfe160aa485ba5a148bc1b44494cca852530b9e4ad4e4846c488116d8e3d9601bc752d9d3d9d650880eea5d9c91449e5fdd2da356844056d262f6486d8c93483b6be08ce1fa6f1b9852f9d090ece4e90158cef841332356fe49d08798157a7f64d50a4748da99ad8e850f664b84ea46146e03ee9af0e98bec1feda8cd4333faefc43601ee6b0b70828e0594719823ee8178f21e970f0d6a13770ee07e21c0e9fa6b05f5958b200a869afe7481003f0aa240c4317e04fcc857027cd3ed48e7d7c3446ae6d0bc12d52700e5fe57d9e124a19108fbd89e3ca57e4184094cb07bc9671e06c75f2ce9996ac5e441d276b1d592341fcf96b899276486a97ea51399666e439dd1b306dbd47e0c57e1bc33121d9c07b31030452a29c5b8bde4440f87c03951cf6d818cab79ff444d6cd43b832349932d46f9c81c4c95457dbfded713f0e52ee9e29806277f1a7585942f14028644200e3c3d30749df5a0c84e06c679805d98720cf9ad358f2f5e2f4419ff53ed7699c580d48c87e4a0f8527820be8d1debcb274bcf4ce831ad34613654d6fb44e50b1915a37e7b3b1662d9a12f2af848f079be7f630680cd54bcd29d9ecdb81272c8e3e5e087e65e505c988fe3ba886825cf28138880297c9ccc53dcb69920d91530dfc46f4fa9d56fefe9e7fcc0b7eb4a27aded291545bb0961eed06fcefe913b3bd87fe6d641021a1539e3077726602be1374b12af1b3d343b6febfbf695a1846d4f1958b7a932bb0ff0cd178ba06424b11f6e0935339a815411f094aeabe0322244a5ca1b05a0ff85e6221cce6e1a416b099f083023d271438f02ef802f85c77b1d9fac035c78cdf81445210f29e89f39f37fe55f8566bd4af59290c091fd2a71aaab14f3cdb82aaafa851f004da7061818614c542cebac6973a1c98c2e6b9d5827e47bfa5285e682709c6bd6bc93bea45c9071cb64d59060cf413de74ee869f2006624a28a92a8cd10f4009041f4afa87d2aaa4940157ee9e8938aedb687266ad137c617fd6e0ba6e79784e4a3edf23e82d46b3fc8b81a94da78b369b2e54941d986c720647a75a9a081ce7b2f160029d838978d18694a576b80e1cb8fb3e2655e7e67482fc426cd13d266e131bb3c3cef5061ecb7a3af6d0be58df0c37dbf5bfc2f7dce1b5d35397abe20e9b676701cedca16c62cc308cd0900f1111b0cc921f959c90b85a32784b0d964e0341920ba5f4f0a4cd8a31513e8a7f951b4da4980750462b53e3cfccfb6132dabba6d27e05709cb4a3a1619ff6a942e79c831e1bb2fd9d3a6283091db0580826b5d365c4fb3d214ad1688c6da2ebb46625420548bdc9e6ee93903f7346e92366ded16cdcdb3f24aa93bf060ac2cb0677b4800b46f338515dd5b72b5a992b4ee945e46ab0bf4192282683143ed71f6fcbf3ef64c8e416f9f2ac851c9595091fa9abf389f3c9d21f60060c5a6a3ed05043a172bbc434c0af2ee8e7603751afbb69ff7d00594398e84efe6cc9c24986292ce3a6307e73d80ec22cfc244800a6b17913a37511dd2a6055d2a199aa6bc78f5defc0080c833b7114e5b9963f7574d6c9918a06a16b8ae593946b9d45f774b65e53218768d180344acf9d06778bf6debd4ec2bc0e4888b5a5d2b8b0c910ef4b0358f12b6a33f673f3bf7088eea86425d55011ae48dc178124204f6fcae76901fd4969e52c33e8175be560032ee9b5a4c5a67b920fb754f6b3ea0226cc076f0c4d3e97fb4ef8e6c70bbc57f56fe8f74093e4799a16e43e6590fccb82b2609c9bd367f50762bc6d3a5263e739ce1eedf10c516ce2e06e4866bebfde205f455cdd4de665ccf54f2b401806810e8a52533f3e21949da90c7f4abe4939517e914dc9d9a9e68090272808127ea465b1d21628644430d96da486d4049a47c88dffe156080ac8f12e62b058e3fde3f95f897de108aca28be3526941e26cd2700e6291104cd649bac01927cbcd6d77146b2d0b9d641cc991e7f00b034c14a251f3a3cc00a74094090b3e0fa51005cbdad5ce2e96f6301386edf504de55c12b47cc8fc5fe7adc194e451002c90512084eb2414e037af942fe892f7bd296bfed9ea77b3b0f7b14ff29ebfff9a42d14e29000c9b60da7d2c8fe07d3149bacb9ac46a1c6010bbca00bd4c09d542011aa42524fc03e8bbe6ab6cbb20f58f9c07780ec739dfb2b130165d7e9a3836f683328747f1686b0eb841139cfc96028e04b0131007be0bb6dd84403c8fdee377fb73791e7d009177d91c3cd858ceef6e286013158e9cf0b1824dff4146fc98b5b8fb51c4e138464e41dc1ab2be0a1b153b436f49988252a59b53eb7f996b959e838ee942e567cdec351c3f999d7f1fca433b3dfb5bf8feffd83bc510f45a021c2bf84d487479dde29e246907b792c6a9e39baf1f071349dbf57b00b6b9874061679e1bc2898f5802fd0bfb2ffc66407a5c5994575030df8a8fc61129e7342a85e030fda4635c5ac8775644465c4a2461da7699774390c4d49b12d30190a2ba140e62d5a800998fd7e3f45ed2f8998edb60002eddf883bb0503372a176af9ec9cdb2056af472c9e046d8a039f2fedae8a31e92820653f068cd040090d2cff1b82523fcbfd03ecafedbcf7d15fef5f7ff6cfc61f213b0730d5dcea8c1eb987dd5ac3ffeb02a0f908d60dd62bf94fbe49f6e2520d48823de9fee7591c384d18562da00579d9b2fbbd969882cc5f2660e0599042adf542ba804f222b03df41b2fa0030e4aa15d06cbb7e598c57d011fea1ce4b3e71a589b09799f4b0ea9498731559a0a5f25bf87a057fc170d749af48da81e73a3a0e48ad1f93b62fec625455f085d9c614c06d78970085e9f30d8dc701ada5c18fde8b56cc706998a10752c565acefc261f065b895a116ae870c43ce7333f7c91b61c84e8ce09a36d8d8bcb4435a2cae112f5529c6d3970f9b917aa36f4a10f00bad900e63b11108a2e47e1be9a54ee27247135603a59d72d2f21f4681796fd4a8c3c4660454a31ad6600dd3408335e584d413c4a5039acc5a8e5b30542a5207121e37c3d4cf2187c19998fed2241cdbc3ec6cff61a304f5ef1a869522bc281ec672282b531e7bcf16c258eff3510c001a5b9a791a5af4472bf0e0871686b66e9854e95e3adc34b7f827648590bd7713b9a5943225199408c808c808f47a6bee1e72f70eb97b87dcbdbb9077b52d8b036e9c1db9464458d1eb69fc5a82f35e363a13e43922c2bec23c72c914e71cd75cbbfbbdd75ebb793dbdc3be5a075ea25723225e5e8f879e4b4dc05c1be914344ce6c8c9bda3a1903a5a05325022cff772b73421ba359223d73672594bba028f75966b4a7ff217927d3ed733e773b0b059dcce5c812f3367855c899e2053f3474e2692713052b79d684ca5378935b60931d882e5810e43890c5848ee0b6135c68d6777572678b43923973562faf9f688cd71157d4dc32fed35ef342148bd814020afc7caca1676dfe1f75c8774ce6a839ab029744f655a9129e4352ec9d0d99ba4916b4c1985630bd98628ccc00dd26b90c02e8138fc2eb490160ad110d64261f725ed797828f43cdcac955e1d0aed735a48d3bcb2b4300397d289ddb5b0fb92a6692fba587aca2a65c0eb10c8f382abeccb134ba9c5f4f24129d31b8b288acd93d8ca2c9cbd386f3f7e5800f0e54b10b4a228c689a226ad63fe686feebdf65a8e1b472e3a728d70463a2325232223d828679464f4a297f3d9cd122853f710577a516cae462e4fcd1fb9b6d0b364959a80b93785a76f094dbf8558074b81bb59e0886b90279e419e8fa19003983f22a25718dba055b112641c0cc9b3595b13a70743d7659d5eb24ca6378935057092a3c32abd1016570a43d16ca64e34a62f9dfc4b6ffa5378a2397d8bbf498465071f14f1ab246223f6552a323607abddc6bd1604e630c618e3d2088ad16b44241ce1386a3e188e5c33352ae2a9f9e3c88991bbc1f656ac4d701272e5f5c8d46cd0843faf678509dce32ac9844894277a47fd55cbcf2efb2672b3b96a11711232356f49c4dc6ce4662f99637a517ab9aaa314d94af4fe04ff478b24cfb7af9f2c6badb5762b85ceb2d65a6b3770fb52585949c821714cc1ac972d07ebc4141b6ea0b012f1d6d1cf5d8f0bae09f783f67a5cc5592151f3399dc919017344e0609dc150b29ce3388eeb908b715bc8f920e49cd4e02c50e4603335b714cac0de21d73c1c2c26655aba0e9b009f83713a73d5acee8b15148155537a0ff410bcc86121b93f723b5c2c4f6ee6a839db27b705da27e3e0220234b14271948f1523979479c9f347436e783538cbf4a5f044533a7de985b0c0f044037ecbb788352ddc29b4add0ba66ea149e6858fef42ca26d9db63f3dcbb784279a14bee553106d8b78da9e4514f9fcccd426d2e02cd39b44d149146942789a0b8b6479bee847389e29268a814ca18ddf422b8a8962d4270ebd297496283657f6258a8962f6655f21fba6b0b2bc9e3cf17b3d5206f4f3b71fb9599e5f7f34b1fe386ae27087cea3d7338e8ad80885417a8d0cdc6c9d80470e964b2051ca1cdb83a164b54fdefe3e0faf5072689ff975e6aa0df4436ed1827cffbbc09da675b8f36646aeaee302bf5cc5fdb4af28f20e2e06f1402bdb0fd26b64fff9a322bec2af999aaeb902472f57d1cf7922632379fe383a923b73cf95f0abeb464c2776074367e1d75c8d5c178f5cddbd9dab45d3539649acf100abf43cdc3e1856d6c8357275e198929dd3c4b185eca19ca9ce7fca7c5291b7b4212cc51b0a2470120733769cb89c18a95f7cad3c9fa316b73f0b288c5940b120553fa4ab7c38ea85d631bf456badd5aca6518d5a5aadb549acbdd329cc5ce19f3f5c05048b8d3371801244a2e6b70e4b6dd850c81cad83f9637320bb5920d9bfa9a6695ad3eebca9b77639dc3ca695b473dbeeddfd89333d3db865d0b02ea438d332d0aad76aab7577cedd2b98043642081cf9040d0a999a0f6a58e3bc17b676bdd80598c681c11ae70b9b481430edade66d6fdb5b6badf57afdb4da16703c48bbeacd3073f763975bb3da776190696d5769a55abdf77afd567a32783f8fe921fd1c204693ea6190bea128741607eab4506e2146926c43cf22adb3a1ecae21edba4bf2f65eb1ded6ed6b6ea9f55097acc05ecaf36b964bc840224b1e4eadd785bc1ed47a28d43029e3e5f95ca82b9d812787418fbb50e98ce9fd90562891b7efd0b3cd928a1cf8e493f6a1d7b2e71d72327b5267f77460e0b15d43c21a47cd253c315fab55bb61677f1440962d6132852fd875e388ef028c0b5205843c7f364ca266246ad26cadb54ae0eec972091425b99f9b1d6d4aa99dd65afbee757bdf051ebba72da5954878573ad93bfc4701e01f57c8f2c55e7d2f3fb171646afe14a5d4d149fbe38bca7f14f38724899a6f922aeca849d33bac28a58eb189b8d83812357f925cc8f3a77477399176d25df8903c1b8a759fddb4f6fa77087295bb2804a2594864701e3af74bfb49479d5a4480dc420c22596e214692fc60e0b17b6cf7744fb7fd3a6f000b4630ce5d3f511ce5d47d9eb8cc674e1ce5328e0bbb1f05814797d5eb515cd5aeea8fc9fe73889471792fe86a0cf01f4779941aee0c9f1d562772efb2e9b2f934f497bf464fe2accf0778ec9fec6fc3fe89e237ee9a8ee32a1ac6bd94d24beb74c9948baece85c4ce5cb90be10947b9a3403c8281d2f8aef6abc4221be2b8da5b3b8f7092ce3979e4fe01d72c0944cab090e7e7a083abbafbf95c6a0cdccd66b98a63ddc12cf5048f720664aeee96e5830ff2bcf7bc8a93bd9758c4b548ae7504b97e3542eea040eb985fbf12f1faaa3852c6fb3aabe268c3162db0f63cbc491e6b91fadac24aa452c07f4a24e40972af06cb0a7d176ed972ddd75a6bed6aad5dadd55afb321cebecbb3048af218e75966bd36059b3e3c2711373a8b3ac09206b4d885e137d7745218ba7e6cd37945903b71f70456541fd439cdf25e00eb863c23dbe0a43c8ddb9b2b2b2b2e27de59328ed24ede6c5a08d4ba126eb811b576017fbdddddd9bc2884124b619924217d8a18037b0c02e8e945be94a1e1832896ce053f5421e0240539be4044353ca77f2d3a965fd4ca18d70ec523a198eb8a565b6b4784bdf900d1b9e0c9da9cc71c291c2bc2c2c2d2d2df4480175e3c67f184a1e98175a9052b395e2c031bd4160cc0c3dec1a1a85e4520a30e00dd387a307f28d1bff61288ab7470bf8bebc48008c42326d1df26dfc2964e96438be90535a54089215aa3a7e4343f7f86dc0efbd4da824dae0d09f5ab4e1fb90e8f17b5fdb24c261fbac7ca16e45b23edc9f912f47a76fad7d7dc0fcf0f1e3fb01cfbe168cd639b59bd651dba0cff5bd3e9c962b508bda28d733b4d5aca156c8f3eb46ed08c5c215305bd73c5cdb3a50dd5ef30e3f21648ef97836575f083e25f0cf77449e4f3fd7e702552c6b1df3a7a86768fbce3b6040031d90abcfc84ce9d03bb093d6f119f11949b27d86b89e794196fa8ccc9574eca4e6ee87818705d963ec24cfe7b6104541618599e1388d5a2cf27ad4177932b8e57a669c15eed0a9f927a9469e120a222f88cc31afa883cc3145a3e4c15e8f13c55e7f7b41eeb7d77e0a5d98d5c1b0ba776196b785befb1bfcdedfafb510b5ce5cb18848666c3c08fefcfee97972d1fb8bbc3f8935f8bdaf098d2d3bf5d83ea7166b902c1be2cd0de96f54fea6f4a694bf5979d0fbe93cf47f8d431c18f64ad83c61cbda47ce940ae9077ff735a20f7562cdf7f84155e01e74e0a92102330d900f90aafa724692a49e219aa50e680be576418d0a634429fdfdf07d3f90f0cc552e7e2e2c51f33f571ef12ccfbf3af7eaf44ecf1a4a2be924ddd34f3a76bdbb53ba94942d04e57befbd295db5bf859eb995cec32032c7fc99b9dae103120a9ba863a46d50854e8b63cd53c8ce8154519194c7d60125d833648dcc5510999aff19f960797e46749039e6df26aed2745aa775f2d5a8ccd15f513b9f1090df500617211499851153d83a6ba5954e172e1060d039279d945a1cea732fab48e91955a05135da944e3a3bd4fa9b01dd2f736de9cdd02245e3089c4ae6af600559de074f767751cb0b59aed4c598227bf6ef5c64715009a6a0f430388903132443a2fca431a446b9cf69dabdf7de973ef3de7befa5f77eb7fefdeffe77f3b95c05fafbdf1029d3f9821f13f97e27c8f72341bef7da6ae46a57bbdad5ee73a070fb1f9d41e275148d82b7909bf7ebbc3fb69fa719b69fdbbdf7fe36bd1e9b781d75ff82c41a73d47d1417b8ef4b1cd7c2b8a69ce6ee3e694f103baa4b3dc19fe2ab1bee817856273df72d4a0671ad0cfac9209038cea75d8804f45cf88387386ccf81579ee1b8bdfdf618d03458d60c3771e4c06bfe7d1fe74f0ebcb2268eb6f64899a2dc7ec0597c4dc107cbda73564a19157785cca1713c33a5ede0ac903ab44e427194f6e3286df39139346f556333a5bdacb299f2c12317fb5adfcde7fa867c48a40c7d9d5cab919b836159b3f5861d06914166d0ffe83c65e69a8b45c1338f5c2cfb87a719eefbbb1049354d8b65ed83d5253889637c691a43ef7021d23aaad3d6349136d5b4165d88504ea39f6709f27c072f48db40976bda9452dab4bbd6385f85c4185a874b2cd42b972c44255ee8eb28a54ddb7dd489bde33ea76def2f45bf854d7cef6113f8b96ddb361cba502cd14b21dbb66d5b290af63c821ca5d40a1e34e1d1a2826251b831180c0683c16262603780f57579bd5e2e2f18cce5e5f28a8909e500e5eeee06852e50c81c31681d51b8e824f154832ea7855c60add6e8f2ea3cbac0babb394d269375739a4c26ebeeed79782cf6f22a6b4e1b437639ad070874f1056f6f2d936d9b73d8cb23e8120b59138e1c13ba94d2a62ddb71775566f7aacc5ce52baf95232a505670565c2b45547e2e75fc752352a7b964d12b97253a36572eaf1943eff09fefb2c15a878b9abd2e447ac7067359a2572e346897d75cb9c0e6e64224cf77777777f710159a648ef92e34e895ecde91b2d1a9f92c6c3100533ebc8f979cd87cc9017177abd5ea06392736a7722f1736d71ed7a07e1c5616085471ae8b2c1cef8bce0bc63809258a1839e2a9f92f4fbc207979c10bec258a171d9597cc315f5a2e31979794f11b57bd3ce128d75cbdc070e6ea45e735572f3b33e583dcf1e284d4f18394797141eb2547c65e72642cf6d2021fdc4bce4b8e8fb9727181c9d88cbdb440668494b9c46e2ccf7791cd075d642e321718e772030de40e72777790bb83dc1d047281b9070269d7530dce899a3038429943d3a8a6d28173a5e2c3993a152279be49e595a70a8e154fa44c6729c342066d30474101839e5be1085699ed20cfc7c2678b9fec452bab289139748047151c16ec9a2b17d94c81345896e85d6473f5d27259933cb2a8f8ccd47c91a83243618147dc1a55667983e5895d7808c6d960aeaa3bc09456d84b0e0d2b8b729a46bb90a66954d334aa691aadb49331d1e6689a885e0e44e916ba80e1620417272e3397279ed2c2042840e6980f0a17d03ae6df90bb513a011e6db8c8648ef9a527e0fa2eb23cff2547caf813ae4a80a3607335a3335710d87142ee98e1c505f3e74b4e9e3e5296e0b1c262b83557d3855b735559f339a77356d8112f92270f867022231e92e70e1fadc3870a19d97ba9b0ac6286e4016ee1580a7692c853c7883c615308181979beca13747cd8591142a333346dfcd888e2aa6d8bc2883c5f258aaf5e5a333545afbd8840887c93670a15785499e56903ab44c9f3557c5cb583a6325381a2f2e32ad0732f5bf43fe2904e4ec3adb95299e1166ea9cc384e65c6a9ccb490f83d657d22edb1278ea928f2fc9716f7d3cbdc8f1ef7d25299a9cc386e0b2b11dc5d3953d753ed92625f787a093438c981a6dfcf8404434412876442822279c4915bc891e7bba7719a168e54b453c4617aae63d7a75d451c26ed06415c8da0c3491c63e85bb76f1d36013ee90a0c8e88f8eaf42d3f8e8a14c0f457850763662a0655b9abc2c7b80aef255107100543ebe862e6cabe3c2ebc1efcc236e65edbde9cd7e37de17dd14be4994cea982bfc922d927133112786f70537f37ada7d1bb9b66de4da386b6d7bc8b5ce4390572963845c813f4749e439329227288eac28858c2191271538f62544f501dedeb3f772e1bdb5b717b93a6b1cc01238e32816249092787d685ac77c4ebcf7de4b4747e8bdf7fecc5cd9d74c795c783df782a1b36ee5dc7be3621c4fad5ab785327b57ebc5c0a3699e9a0612c940a34836da9748566a31b584a258186bf9d39b4ccf228a784ce2c9ffe42d73c5e995b5ac65df177a0f559eebf649ea5210c944322c93c948ef2251cc3b1f3d0f577dee95701c459142255d81c7981a03fa59ffbbf0d6289dd8b3ad966d75e71d3bb1dcd79d20654647e09374d4387772bf10969ca9d3cc6dffb93c2e8ed58702da0dbe9377e6eaf2cc547f7b0cc43f31dfe9596ca6baca72a8b2dc6f81cca6d081871ab1877eb78194f1b7800c235b60268185efb45a798a27ea24dba061b76e5a435ee0524899f95d3fc85c234ace413ac9f461b1fedbc4555feef614e00cf056a6a205e6d3f77ef41ab98a1698e2e947cb20330e394827795ac06bc571144e117fbda23072a4479046f627664e0e0c16853fe1aa53eb382a096e25b1c9ed883b182236694bf92038c418798ad33b4c7194c48263f2454f0659fc432970bb78c22938cb9f1ea44cc985c04624913d05d9939093513ca40ff90107484276d415fe3c38ca5f9e64cdfe3551b28bb27fe744e1ab56c2d36ab57c60c9253e4f7a878c21723f91bdd229a1643f8199250657552ab2ef80d9a538b6cb7990410a21bb94a13d579a5823ef050961f573331c3d967db0ccd13f051ee509244af1ce13cd7dedafa88972cab73f3a15421d4402aedd27ad2270078fb76be1060ff6971e0e47494e04727164d91e470fefbaeeaabf6717c707e48d092ec3cd777a3de453eac960ab77ada5b787e6dd97ece25801ad0743b84250e4b6f47a4821b9b53802893cc264d9f575972dc11af4532b2775af3061cc11f02824cbff7b9990298c6f380e834cc5148ab128617215c1176098500a3ce9cc3cb5ed0e7c5e505fe2e0ee3dd1207aee9908a1279bb26422049fccd1ae86a227da806bc73d280cfd0cbbdf42fc77e3666c389187e83feef1534e871b662af4ddfb7bf741fff7bb90fb50d8d52059a3e7b8f66ab04152fffbfba070fb1986be0bf173a1e8fd8635a4f1443cbf1024de78d4e6ba1045f4dfd37721ca7d6c4170459108022cc2cc14ddbae71ef4f33771fb90789fc7b4219ea97e6f76cf796803aad95eb481c453f5b7994f23f21781c49afba1afd9a664dd966bfa6f6076db49f34297b3bc0f8537401480e5bdcb59a1d7c219ef6d58431b262bf4a0d046f4a0ef424eacb901c200acee5dcde21ed7b89ad5fda9be67838446249e2ae86d4e757b1ad18368422f126bbaed79ccc671410d1c44aa913120243771aa41b2b6af913bac0d807e03db4b56b3c6c6c9f4416d84fa86c3491c9a80d3e323c36109138cb846851a3f0d85263889c318b03074c288c1b0d36a5527748193ed73f4ab7746b48e1329482277f7f5baf7625c0818f7a1f3382a7afc3db3ef20f041aaea5bfcf4ad8c894024e5136a6856e87fae66268f09beb58fc3ee6958c7c2d69929fb336ce23373d5b399b26fb5c8f6ced96cde8bf14ce89b0c29655cc8f6db47ca48eb3e64eb42e449c37689c41a21ac6ecd947dd538cabe1776677f8517e0b167b95bd97e3f71d578038aab4619a567aefa992bfaf6ef0d29533f1ceba033eeced6c38554cda942e631533259dfdb9dc4cabfdf3ba4aab9d8f9b7d7dacd6ef7de9d9ded5fc0ee9d975ef5920d047b47f7c87a49af1a093da0e72f5fc297e825d9c518a963f68e9c89c400e24bf8cbddddddddfdba7badb53aad4efce0883cf4a39f1e13f5eb0b9be52392df4ff47d9f5823840564a65aae97d7ad000596f5cf4deac65f3932b8e97a36579d0c0a448842af2155f687ded13dad4362d13f5a77a9dd6eed9d9d264268ca97efa1028d84eee91d1b903ae638eb9e98181829659483bf9ccc463a00f157ffcc727023a4d061bee33c29dfec59827500b2c21378ec1f207d636444bf2366477391e7cf9d9daf80aca50d6ac1aa813b3b365ace0643e6682394d14be858cb6413543bc9ce6b94385c40aa68efa040ffcc7e661c8f4e42819d9d4ef2234fe049aa7648d48eee711e3315f31e77c2a1e871299c67a70b7d17b6937e92e77bfb7801be5928343b952570877ffeecde73efd4a20df84362efacc0c67b5188238d46a1b711bd67f37d8826f49f0dde8b441b42ff89afb2041e7dc75f3b7345729d3cdb478f6515d15f29e2ebeb1fd14ad82c7fcd9e3dbf570a5c30226564ec3a0105a8223dd4448a0e2a3245ac11f291c276cdd4cc99296f8518e09db177f2fc513ac94776421f0a25ebe74ae210f573f5fd7ce9b9188141acc5fac1e30032f40021256545ae80fc356a2ebaa7b9983289922deb1df7986be147e67b11d7f1269ee3518c46a3918715e03157a384024f193120a0cb5fae84afc05f6e024781bf5456e44af78fbb7e806839da13fef2d7e484807c02359836ddfb4f7f1bef67cd18370d996c844c216cc2db08343a618cb1582324861f30f756e49951e1c3146eb0b4a810e217c3efc310fc0f459f02e96f84a7ca129e6a4bb8a2422859e28d50b25208256b6686fab0220f0b1a9dc21bdb0efafe347a17667d0f3efe1bd17fa6506854ea4cf8434f833ff4f643628de8bfaf011fe3cffbc293fdcf8a6f7ff44258dc3d5d20aed2a15f7d843e0fae924a745c455d8d43e95fcdced0509ad0e39158e35991c6f49f58d3bde94332537a10bf8d279eeccf0f7de845a14d279e68981ffa931569e687ba138d3f7e3f55b106c92a8937372bdffde86f54f07f1f26a98c5256bad18de843ffcde007a24328ec9627594e4121d7455aecdc9e6db3eeacb5d7def62661d74b19ebdb77ef514a2fbd49b01899ab24a97241a25c18f1f4f0775dc8a6f4a195c7df848defc26f88a7666afc88e4f9dfeb737d38bef236a12fe15ff9f95efad0d3ac3cfe2e7de86d5879fc9c4a111bd377e07b3fc1b7e9de64e33df8a77e1ad3774f03bef7d23bb54883e9bbb7017c4f468ae1b17552547e8ac6ee972962eb90c43b126d84cd6a1d9dd6d9ac8d1d2943858d0702b34e3fb68f1579f4a3c99467a391582384c5f22bf82039d1af41b2beefa15da79ea76e1c958671b7dbaef786310c86d96066eac70fa9fa7ec0b339b3d7dacd6ef75e7c6ffb6661549dea1d5644359ea97a8599b08952e6a01ba596da6ddb50bde36b31a1571f112d4e74bd751a078d836641d631ff332253f37db66ddbbc5b4a3374c041eb8040601e1d665ac79469b8fba596d6d661c6c7e70798845530f4523ba72743e8dd0af211d13bda07a963fe777b04e9c7311fb56a52cb9c871f7f279efa3d9b538ba799eebdb7a941628327dae0efde46b4097dd7792f126b4cef7dcdca772fa4bd1d82fce8ecbf438ffb33a2975ee9032defdf229eeeb77c27d2a4fce853c4d326d2907e3e493c5df1447a1b52def43690be85f426d2a78824b1e6c335a21f8d300bfe9e44fa4478a5f59166424d8844a228de6ff47111167d08ccd5cb538a5d33450120672e54fe74cb058050f42fe1377a51850f4f350c4f557a2710875d73d52f17c699f144dc12453f3ca21f2ef4be0bb7941260fb37c21bd17fda0d59c21a3ad503182511bef0c4199983d22073d0e701f9f61b1736f1fd8d904524fad3df7c3ffa4d3c81c499969414f1749fe585b0e8f398ab14441bd23be9299299943fddbf8fc5ef59c49a9168437afc5fcde9f1db98fe7b910d121ad2f7a72bfadb987e5e91667e29372b7ff3bde86f4a7fa3f237a41f3dfe510801203d84ede281f944333cf8497f93f2a397de8c48b24429234c923e3c26219c9792c0491ce3a8955df648e992dd9db877e1734876afce11913f73e6eac2c090d307b9ea229e9249199a0390fd4147dcc9c8ee4a882289ec9e1aa71131de85cb5065689a783138049e797c6b7b07287b300c32818bd02b6a62cc4cf9fb682504902bd7999e837e8792477fa2c473205d67ae7c08dc0d4809b6a2f378cc51fe2927b0f7ccc7380778f499f6c455d47bbcd2516b0aa9ced5c0be4ce9dec56dcf3d139d02a9d27efbee2d0b12ae0b65ee3c6fa7a39df6295d0a89143a8ba36113db57fb5a0af71d276ab18909f0947dce29407bb02c7b7a1f33655f76f42c61ca9f42ef6d842a6f0abb2f81a3f0a4ad84274d7a92c5f998abe6e97cf0b40b08156f90754d2901be9f12de6ccf3dea67ca0a2173bcbab043c0f511d9fed625c8f66f38c6b410546c979692f25dcaf47a9caef6d20b425f7b1ebe037dadaa7cca53f174c5196e7bfb385073b589a72a229919bdfd18f154b9a74979ee2f4cb6f8666b84b4df3852e6666b6ad7e6448c55019e3996002953dfbe02e46a023265df5ad945f672156f48f9ed21e03de9b9d293c2130ddb97fe54451bb62f9d6c203df8a4074b4f0ac113023a9f8264cf329f6a78aaa4f0549f546b409dde996957ab07db3de96bb657218935a4ef386ee58a34deaf88359d78d23cd1c69ff4352a628a6883e4becdfc6dfef634f337f1a45d91c69f249e34b106c91a8937371ff7db4bd6661b27643d5168ff0bb776e1db2e0ca3fe99809338b8a6d3fd5fdabfeaf48e298a7eae4634735364ff1187571d89f2d973d2d92e4a82df61fe3d3bca552e57d682bbbbc390fdeba4d327a5738ad79b5f821e24b07fd5f94cdf6b9dfda018701207262e98131d273d64f0640cdc1c44d40590acfd587fb43fcea7a04bcb43671e53869a9d9db5d6bdd6ead63e37a7bbdb4a47a9d159357b1db475d351331cfd46a1d13cbb675b4ae97c396beda427c511480a4700b37c39299d75ba9d5a6b5dbdb5ce39b5cb8de04e5aa7b66d9bc31083460ca65645ad26cae7bcf61850ed0bd40b31814648747d7851d7692c68e09b82c637ea6ef7d00c985b458304d22ec785762fa5d7250c577b90d7633e7695d5b4a9bda079301b675b70943f1918c7ff771ed55840479de18526a537a5defa12345fcef974ce30c5aedb11305a8377da6a6d754903df2c990461050e32b09725932092a8f003bc65c92488183009a2892174664ae298028bb26412c40b87141867c92408970c41b4701c21474a293176ff1b3ee7747797ee2ea5942ddddd09ee9f524a09be0f6e29a57435b8b6f582f02733dd140ec048802c3f94f2eb0d73d52d5a69b57656da6ab51a4716016ac994bfec1fe4cac71023f8894add2073f40d3028148f981b6208f0f20d61c8c71234e529764bb3e183d576b75a52468281f24bdd884f6e10250288186c1b1dfd05f6c8a2904aa041184c4400c6125e1c6992c78e5da1e5b1b5e0e99cfac30f42d65d7a6103349090810518421471451efb75a3823cb69123b3026390b184144f663fcc80e53cc8653828a488264400230d2f9a6c2105cbadc8fe384976cf228f294d586e7e9029fd8ba364ca04043cc894091025d8b142de5ef37a6ce05cb9eca60519f4d4556106c1c0751fc02398a9a04f3c253328f2fc20cbf77b5c578df4c1a72c8e72d5afc607c1dcac4e236bdf436b65eb3b3bb115dc083c3a8f0c64f115aad56a7d60a7d562f5d3f0ce95cb5cf601579e4f5df5429e5f464c8641812ee371d508faacdd48f609a100f78da1edc38f3824c9136e9860c1119c1a2b628c906c117dd822d367b9220002d8a7117d4a99f850c5934cdf86d783626bad3d42042a6da2ad24327dd0eb41496540c1a3c6154818e1a43229c28751698b359464fa2b33bc2008683421044aa4e184254720c1c1bca092e292c72e458b3cb2f880001606205869a37044b6360a5c641ba515458b3498c8f66196a4f145b66a4091ed92356eb27d92d7c3f20c51b2b56a449d64fa9fd7835e1818178a1843e7092eaae8b18245779029a596897dc1da97630b06c8e30bd9fed40095ed5ffc53846c1f6441b6fff60944800213d9be282626ff608a1d405163c70432f0a22a8181852982471819f27ad828644adf3381138ac0628d58826d950e9c70023a842cb2ed41b62b08018d9c976cff8e200dacf564fa16093ce217cea041b66f871823066badb567b832a53c202284309634111b9246ad62882458fb05b636cc81e4c9422573536881189bc133a4fe10c14b33a38b22e80f235ed60c3146307fe0ecd42566a87102c7a036f394f4f951c40f68022588b82162c81228332882881e22649e9279bc1583320041c4915491640858bc5481bb2c9754d103852a9c3c514513d0c037cb254a807029821222c421609be512254552b25cc203210c8165b9c40c2379e474727f0b592e29030ab793fb4f7f9a7f41145efdc898db836558aefc67a656373623575576635313c73bc58e892338c3e7e651927942d0c4519727e6a896c01a99fe073e7fe91373c0132df0a9becc9b6cefecad4e3c254b027671bc3db97fe6ea5a2153fd3e680d21f78381f3335792d572e589736313c4f1dd020a05136b82f344d7d1cd6783d2a2dccf19e19ef055e7e06c515c2597943184a5638dcfbd72bfc01a711e379fdc4fa7b74791dba5c8fd3dba0d727ffb14b9474f92477742eeef7a24f7f7588b90fbfb0ec9fd7d995c2652a689ab2a155a74172c79ecd89386f2421e3b763384486e1de4d18ba8f2e847b6edc67c62e078dc21aeba3817e7e25c9c8b735f17e7e65cd8d5d98aa0b5345795c9681ce4f57071a61e7155cda93935a773e64ab2603a01a139a8548df6453d2b15d10c000020006315002020100a078442c178344c1365730f14800b718c44705636138943510ec4308aa290310619430800860001646a48a803c14ed500c05468f837c3d47226719493c9397ffbbb18118d88215cf1250e947c270345e927ab7aa18b9f5c481735a3e2c31a04854a86eaf16b6f201153c6189cedf1c4ecc1951dfd8a46bbc6d21dd080a344cdc47e4fbf256b0de53d91078770e85942dbe8b4770ef0f45f0a4383f5228229b9a758a6b23ef26ed768ebdabff29107cbdca8dd815783da298769d13d06b2e3a519a5d02e4437b9c3cc9aed8b187e0dc49521ae840205244377ff4a0420d8e773f7d7fe113e5ea1414bcf891f3e5b2e7d930bdf7cc843f3992e59cfee307732c89d9a3aedd93e5900ac3882dcb5beb41c8eb6a6e601db173ff165ea9b3d7227a4a02541197799be64d6d33c68dbb282b6104ebc3639770705059736da1b2dc6aae45cdecc6b0fb670e0d942d9d438e3e03c8cb3f3ca444039908c3cb6f275109d963b7b3c71949ded5ab0285cded3c8461d67084872216cf15c8367c47d9ff4b4596de56171e515228c5fa297ea2557f2ecb56b26556c4c15af3c166e6cb65b1c1f58991eaa7c9d8f4226af9880b33a799e7279158187b9ccb493778288222cacad7a1196c610764f9e5851b699d56c7763c9c3a713b4ca6c9d849d7154323de9d56c700b54253d82db0609b6ac4fab7b5cc8ff2b1c2c07670fd579aa625e1bd487695ae349a80dfdef0cb4069e8dfe2e6ca825a08424a6f8d2e5c5832b09a11eb46009abdc22b81779ed32679baace2be60af8e21440c6e3835a4c40d6bd5462fa356d9673d0980116325c423d732d0a37151062040ef79cb19173f1ba96b11c58429ca724ec7cad878c3c9c951f2566c958e22fc88e4943c5bdb422c68543ccfb4d83ffb886b465b0b3a8902670baf342fd896aa3c8a1babc9ec9aeb3fdf9013d8d163f7b86fd9b49c09595058eb04c8863a371d8921f1002a58cc152ddbe6f8d55354b1738cd403461b8b1736299e9dc7c45aaa7b875334800ac46a6ff842b40776c791b91b8f56eb3b8ce15da3af6cde2e6c2c03ec324a507d38fc3ffca8a225bc6053859c7003d4be62903bff70b125dfa6aec337704e2d2837e68300f39692058d485a3cb27fd268a5b09ed82c1c7da652fb2db2ad398f273702fe353821c0e23afae8e20ddaf26615604a94c5fd60e23bceb4990352acdd3539a05376c4c66c79bed344586a75daefd42e3728aed4d753e7700a51977c2ed8af9255da899f3eedc43132c987d5290f5122597e2c3f4236dd8cd07c190214368cc482ca357ee0121ae2c3237c7e199a3ea0284cac99963958ed22768cce7ebb88fc0a8dd30439a569f71c220beae908aadcf5c3ae6481361d9e5d0b62e5fb03ea3f35a752c80e8d6d7c2f62e49440eb066252e5c729dcf1a2b87c78789b0c5ff5d51c57e6c0d2be770ce866d2dc8f6471f2759cb1faa99213ed2bbb7262cb24943cadce890893f61a4c86d51decc8600ee1aa2e0640604390b943b6431aef2583205a1d29661beeef6d6bb7fce320bf1175b7ab187d27d1141802975167613a15627ceb2e0fa1792954d5cf85516088b1c318a0e2bf91b942993a0b8be4f90c7b582af5a663e96995f636681897acfb1afdfcc6ab982cffa8c8ba2a97bd21581983123ad52c26b53cbd9f61e4833a9b0f8400ca632b55780781cf9a2dda71b4c4b2f120a694148d4a226e533dd01ace52466d2a61c9e1a8de3eaa38f66d164ef108e49a7ec0fbf30b7a81ed7594bd3ef4140d3ce41d6a54156078635360236ab580cf10542ecf96c991e2716477b7cbb71bed97e5f2e8ddd7f09bd63516f025a77ecc724488f0a9b85c220a5e7b08fe423e85ae957d6ecb08b2832e267ed9e37bb209eba22ac88654d655d316619b08851469ebe3598be390d00da77b17ac5f9370c3821460e53b82b842dd381f99fbf95403f422cddf419207a897fe0504997ed83c8655708b28963eb8594e9b2e9741d82e59a257668ce8963419b3ce038d81a87673d6fffe701ead60593842e73d1b366a7d1ede464620ac8fbd976b2dc2bd512a326665c842edb522928bef3e25169ed24e510ff91704652a8676be6028db262f22632971e4540faa892558aab8eb8834c3b94412cb3d70749c890eb51b5dffd9ef23e811e79453312bd0543f69c2545456020d5df71aa5eac8bf9284399c26efb9d8b5c63e99e93c106021c4eef08110e671c642a25955759d8e842b63c2125f3660c9098fabfc863b41aff3f3b08909d569c975439d39246c92f96c68dae72cdf5fea0a50825e5803d78497428cc4b8cd2c2e1d745186a47f8950d4b71d3c4e1410d337bac69003b275d0dbaf1e00e5da205e566ed09676022a8d453a4a24c79771a03f5cfe419205a074acebed9519865e65c743882cf00b1aad31c628c6076cb9be39b1bbb4c23c93ad8cca6a7f00ba4063d17a5126304ec6546945fa1b1e0be8c110339d98abd1dacf640d5a9cb95c98200b3ff63b3d10a6368efc0a0e69424956e1c033254783e03067c0d9a45b180bbfc59e756a4cef89162e7320d873d4d170441347d68763ddc3542b657817c69ce2927350af7f9bf78b764d30d55e80e251ebf0322b3eabe7d486ae41d1c11a6c9e39555a1d5f5f8d364126b6a55004686153bbc8a061dee1610a6e982dcb0dfae7cffa5d88b1e674547aa9509ac1679a826bcd9a3ed337914eba5b882cc0e71338822006192f01f806762bf13f6456e6dd0334b5e4d7b33d95c78638f1bfce39f1a78bff38b47a14f780ff8fcb427ffb6130885e6d895941f19b60426af64ccaf8eb9b04ce130a5668d30d4695b5f3208c727c9cfc0a25a4e1ad1882f08bd303fd647218941078453259ebc1a987c1315842cc25fe5940458ed857444c52a7838f54b8b0d167a0bb687b42a087296e6c99bf39dd8d295060e2994c38911866173d20a297d4c199d4c9c62dc9cfc3d2d922f5b85a8834efc97d170cf8eac9c1d3c0b601e6dfcb9dd8d8f61c1cd11c924f854d4a13573737efcf5c220f7559f03bc2c2983d8320703ba9f1c74a0e14cb84f9c03cd7061ae317739f608907b3935bc84ceaff4c2a5490e0883c4168d4718fb77cd34b77bc2896d5a9b8952912abfb143dc4025a4ea2ee9e101f41fc3fa6c28a7fc52b1f7060c6cb3ceddd42aef9a87ae7bc82dd392228524001cd75dd87961f8752ae515f181fa816d06eca77686fc1d428301171e4e45a70695948e426e95a04b49eef4cf5a06129004349fc00ba9dc288b99aecd84b64d2faa00e42610b2d958e84997ebf7d77ea099951f283ff5e05fdca2d44bd7719c55207d368a3eb841a14b5c85756e459bc37c75a1ddd2b3b953024cebd7a45330bfc19bd21bceb2278c76af8187df400e65720ba2c20dec283ace3e244fb324f1d9088b692a3db7bb0f56bda748a723d71e2d3bf768b9f8230340c15378c214e58494e06fa49c0c122d2e2c246a7c63443503e5ce6488a13bd9b48f4d6f504449577b9af415f64036098fd884985ff973697bf40b32a017c8d9f61467344f67e3fd2a76c9b014a4ab1d995b81b2d0696cec29b5d4fd136e58ead562fb88081f7fa3c53c9690ab6729c7d21e1e8ff301052bbe18441e3507989eb9c0f384b1d4a052ef74edfd0fa9f7cf6e4cba0bfa1c83b405524d8802dbf3af215fdb172a2ddf20479216c9b9606efd95ba63dc8e9fc9b1f3671e20c68b264a748b57fce376b99dc53a04e85b4343145aefb01926f566ff0385bd57d9cf6a303694e36e7935f32d26fc24832526ef60567c4f662cfe78e1e5f1e755284f444c5f0736dff36cbc315072da7e6318a3f55071da70f25f41900dd32c8cfd2735db88cf7c3431179308c1f3ee2a273782318f000ad2e338e7070455f53d401db05f5f4502c5a6c2e58ec9bbfe76057753368f863b95d1ab1ec75a7833a1f7e5c000f3c4628d2b2bda16a41ab406334fbe54d6153f58f7c8ea77dfd88203cb17cd1d733a15ae83d7016d83b6708d6bf1646f0fc512a90ffd2bb198300eafb6dd38b98bc514878614299bd5d70b6167977f92b2362dadf311a1bba689020fd18d42a68a9451c1a9db545dc22a3fbf32f3371ed508fbcaf234130a81b558c5b3edd9e995bd3bac578282ee99f5438971c042408141c23f5a50f30b1da8178e83332de05e9d67e7121f8342eceb63c028b73ee4d9d9b7f74012224e57ddeeb1c11d04399844044f520f43a804fe2c808b525c4b3eb061e6134e59a8e2c7b2cd1c1b3aa7f88fbf3df6c801c2a3ca5c412046f29d24c1e6afade2a0fb1e0fb8120625692308baef9e9220e42c50dd27fb925ad141f1a21c43cf1351911915af97c6f6d139350804279136acaa0d39b4d3bd63efbf840fdb61da34bee73d473f93c3193d8e8812fa81701638b3874428e295af93df745cc63c9581da7a7fa2131008557a3eda6e3d3b26aa696b16569d6470b835b13a68cec043236b078dee80e9f9aac6c3c13e8df6c26e60336fd29421e68be38d51b7dddd006755a0ee2dd35d4f28fabad06cf0a5cd03164990892337fde7baf132ccb3dc2343ee35927926baed5bb36de0b6371fdb91b9504c1eef1aadb77fa68d4e653625536cdda049690c5ca24a87ce4fecb78ab14c2e8be5470e3ccd272edb7eea120749e8084c00c78dccdfac3258201caa207d26a67a8886a7bc581d9c22f93121d7d01146027ff4c9e1780cc477921abfb9293b70c94cfc8afa549d2d9130ac221b9c3e2dba428e6495a9d731a02813e71b08845af18058ea12dae788ac8b37c81d32b5635e5340f84b263bd028455854dcf05ca53eb85d9d5d25ae2bb8457886f1d443151937204b42ef06c70588b585a1993e46223bd909a16c56e8da641e10d219a330cc0c142b4a0995136f7d0812f888239e29f6ca043d38e97699316b9af9cec0b83f5edab8e25d1a2ad80cf3cd6fb5b100eb603c87800d90601b462cd40982fb0e8f068e0acbd98d5c2dda9e585ec42e82765ca52fa25ccc9c89ca9044ed884666eb5531d03d4728338338f0a0d5438cbe19485c98bc274a5a6452f35bd7d650ac10017a45da15df80d90e4d62302ea56270b602256ffad2ee266ba4462cf4d9798ad74a185e30e952a7aee712cd9366aa9ac5352af67e81bd93d06438ef68c37a4f273fbb7ca5f321b2f760a62692e345c3078ecebde6d2aca9da9030de9e1831e0a1f6cf9bbbae2cff69b7c82af94bbc17bcf348e9264d4a6c2aa3a4be92d68acfec73152ff9e49d4ad9c052a16833fdd8203857bb0450527abdff5365c976d2fc854e28f4412e9b53f8e79502cecff54b0393f5688e9e74d17cde9d68d21fedcf0e4933c3696756c999058e9ec5718332fb4584a3e9833f011bb74422b056cb4980ea2cb9782e45bd485aee5588fd0f18fafc208fd89ceee33782898e1716b60689a35888751079d04d6bd4fbe0838c3420957d660fc117c7da39609bc0ba033d50b2368bb1f9a7f8023946e511d9c01237fed08ca780d61881494bb09132f5d42d2054003fd95db0eeff1f0e3841d3245f75da150e32b6567b59248655e3b82c19f482428c4d5e4d4bc0565dc87042adc1ba08b51680f0c02f8a7d1f7d9a2a67c56276899d5476072b29d9f7e3cd7ac4c37311ec6fc5c316cca6e234b234e650aa48232179eeac52465efde540e8ccd8f737a4afb56752c2a7b7b96d4208b4a6e0cc295cd17e2688c03466e0efb815b72272805965f1f25f4a93216970ca648b15d11a8a89d14f9250aa30a68e12698e859795d7e7a4ab37885e2f39f9e16eced30da2076d28902fd62c80331cc802a662985950fad6d01f0e641053c8989cc3bfb50a649a567462987224c4ed735f6637d2a620f5b5a6769a3c8ad4ba20064ba467947c68a6b6e13d4584acbe5684358eba51efab425e881e48e745cc4b63937563b6efe024d72a03ed138530dcfbbf4de2e62c7e635e5db58960fbe8b84ccaaded2357457461d44c02acb473e01e5ea7b1c8971461b31d1f1dfa60bb08c2d66be00950ef6cc818c4600b7107ef3544d31e61a30b2226ab7ab2e3a91b25912e841349f76ad072145a3056fb6ec4ca9f073915519e1f1b4d9cbe09846f2b96124036ed7876849fcfb05a9bfaf470cd278d19807575353601f12980d4916487a84c209429db93d301bb0246d8c28689ddd5ecd7709943e79e4d370c6cffd9459974d1a4b9178e09ddb2f2fcd909c33a1f0bdc72bc31afd6e72673ae3b25709807401f3e033eb0141e8043509c994eb38adc00f024bb1686b1e27fc3744a8a1bf7091a23e2179efd7503e656f01ea5c8a9974eece0b78f4e6724db3fd1673196c207debcf650e2e22e343c09498586bd3717577f45aac0959c1f4684a6599092ecd378157af0fc069b99bb9f26541279a95b3d8e40b0fbdbe5b3e27e1c0b2f9bca05346d42f6609638e32789a9b58628019cd3a07cb744b90d991c0810be061cb684b4be1430dc93e4288426f9612d7f216c7a5e85a1589d8fd700af152efd8cc5014bf3bc0f290378318a96b5f52930ac463a316fc1c265338379b78b3d8cee4ee36c6831c0d3384eea8c941cdd78f4e5b1ad930db253f2e8c065ae63910142ab7ef169e63a4250a830d09e90e5f02b26024b240cd95404dcbed3c423a03ffa33771bae3627f7aaf5361d5f1d0fb67b1382bd955b6ac54b663acfa5585a058aa70ac031169f9a10cddce552fe310a622748732a0b2d03b3d8fc791c1f2fa4d1bb19d1c83ec884fa6da9b1af3952a658e2ff2cc538745f56a0e84b9ef667d22ea806d7b4ce68113e2927f88345eb0439faa47883323c885a5249cdaed060d94aba34f034366d03a4f3e7a2194843275aec28995faa2c61398ff5c59e9506d47496594388d8e237b6ab68f6b2d70627599db11c1b5f68a40da1fde83c93fcbfbab304107b1207d2d48793ee91936124d0f67186bfd8600c861444f3b264bac2cf5e9d0107efa5938388a56a9ba379f0e726c9dbb58c31d334e00d024a352a75770b6d2dc3236f539c85dd9f93c42fced6c403aae41540837b127ecdc96cd5c89b9c689e66320a973a7be88d4b1d2487b36d3c81f4d2d9de28b90871795c1db74589487128c7f171b831c1ee8a0e6677860e2e0c20828cb99874431557b8c5f1e4ccdfdfafe1fb969b9311c9cf88f649b822ec4604644baf3465314c74a40cd0a886d9808735f86a9e3c05511d85e302f5cbbdb49b7261c07b9a0bdd0900add0a694d5222655dd1e7965f8f2c962654320e54499eb19cc6c702b0d19edf1b82913cef8d6b85a533ba165c2799e1b5713319ea05ae1802bd15e7f2e83f953dd4f9f59e13813e0661d60cc5cad0378235aad79ce57f72de1c450eca446626f7a1cbd49b197b94f12da9a1512b2c6a7d718bf51b9ee6064a465f2a1b9f7879d9006b9145c32daa3f726c69c69263a1922bab4384d2080251ea6b819bab594f61447589cb011cc8f1b4c8744fd06994140b0cec314a885f48179c071c1ccd2ba947831cc85cea38c9f706f23875c377b98a8714861309026b58b2609bf6120ac731a4e53d1dfba34c2929289db3efa2b7c82ac1bc3a21be20b85cb68158512f93c391e6d7b9f0d93a983d0212b7418daca795b82312711927022df7a665175fe1fb4592b9e005c8981a6c482e8e48b227b01c4669468be15149577fe423a6c38791eb03156216a1fa33cc0c2846012692a924034fd388475700d71f2b1c4cbd13e13fd68de593c2b4237a1e37eb5295cf1a44f74d7af24d40edb4a57f189d226aab09b513b17d2216bc45e084bcb88c248ab7045786495f409200addb056bb70367c045b3711314239622c0e55ea5523ad28dd370d858d1051427d26b4980f2cf368f1b4cf60248616adcc5527591a0f6a7247fa2971043ecca31ef87adf30ddb750516b5549d67031085c5842d5e0ddd5e0b0755fe130ff7997a2a9af94a5983ab0390b677dd8f9b2510a78f46f931d72f2bbde84c283091da66594e7a0c8c68f098b8ea3bc930b5435d630883085d833ae7b4dea7b5f7d820f9d208bb460bf38e20244eccbf88ad9ee39b51f39372922f85c77dd5a5c096386ff3e880abeb2e13efb76aba64e2c8a7bb9aadd5e9e2284da39fc28bf9cc7cac4b6d75d39380315d14176f3a4c1644e0ccbc0c629688cff68ca4a8892c50940efa0c4ace1ca12f01c485cf3bd1499ebe69a4977ed443f56734ec94656f780cd8acd484ab4419dd6209d1bd1200d26e2e61ad3ee3e807cc2fbb027e762ad9b8bf8c3ce89ff82af02b160aaff360a458a08a54744e11bf43d0dcab21a7b29f8f5e9605aa68fadb6b1df372288208dbcd4123b50f8a3a94e09e82206845d3440a003c18552023b69ba862d4e68f97d97c8e43384450ff0da778ae86aa4ad6411206203992d9515650476f59a9afd6b51a0324acb71ca0ab429196c756a7f5489c802639835c7357d673b01d956870616ab3ac328a19817a5b057551dc38020398600ae0bf8c4ee0adf742602010216808b7b3bd5d013e749941353d2fba518486901b1ee95374af6a20df5e69f1ae9b2891b9cc414a1e101346f7f9fb5d48e2ea01a922bb31efd6da515024329b43f1f7a4d72b8e4ffe6e00809f0accfc1374f0af0e5fc870e24bc34f9712bae9148ab31544f1be86cdaf7217014906780d723955d6d6c2fd5b1c6c4fcc1c5690529ba495ee8df3ea142d8159850065509298d46b3200924034b3c63d06c4e45edf44070387ad5d8757bbd02d08319c8ac53febc3c2e2228c24b85d12c4bdb2e04c69114576769ddfa34571a8d2beb8e8107e6e1d8156fc48de2a1d539641b86be6c166c5779ec20e920bc62efffd60601b8fd99085f3862b1476d77ea60ee46eadf7cb27712f0cf953ebd759de20f2021e55addd812660f9e9a51f74292bd07aa6fec6d585fcb39bb829bd3ccf1abb6584e43bcc646a3738563e1dea4e52eaaa8517bb64234c5fe1a142626f189a11ed951e4f37cd3923c6cda82851e6c30c531e310db69dc71dc8f7c0eae83c962e7099c85872f3b0bd15a7004377f2d674175dc906dbdb361e226c4cd401a6ce48104fa20174c9459464620cdcde5165d407adc8808482de0e2069263c952a145d8809a3cdbd826572bbd52a933d97081ab5f2aa93e9a3a79dca89beefc08eb05e7bc6ef560140638a674971cc594e41d569ca6fba5964796468458c677ca4dd15ce427832c27edc1810c5aef817c10a25218012d8b4ba3527ad599715b615a94e598282ffd206669e84e0d5282dc159d1f3d3d4a482a13ff7bbddcd7a7e7f6704245d70ce25f40ae1dafa50280e7c43285ec2b3e2bd8f96c673c161ee195a574bfdc30c627fd5e4a678bd9431c744efcf0fa0c9a4ef8119949a09aa8d9d97f9ddade47479ad8afe06ef8bb4ed17466594cf6a7dd631270638129f492099cf649146fc694dbdca019d03bf70be2cfeb0266a13fe94fffc20b02083dc4c6a41b44d39cd67bfe6b185863ec7b07c1cc82e9c181d0068897164e0714b732d8382fa42fe934d756f30c26dd207218bc4d2fe5701d11e6705fd5f5dd6beaca29a31d03b589f255d7493d5cae6368d41c54d779a21d9f6aece99240b0daf5418757c6960bfd49f0785d202e741c954e7b57cd0c7d1c61d1102580a00a899d54cc46e634d7c7ba8366ecd38b3d74476a98213ea5c322a821a98fcddc1d14461f8176138ca604220ff164edbf5c57652533ec65485877aa7b14a11f6ce8de70453e933f8b0ca8e89119903516d0fc23ad0c349db001f3f7ca88bb792a8ef4cdb72c7a7da39783bcb54b105d3bd496bc0cd180b8ef0954921dc240e612f23251eed8e70ad6047fa79328d1ee94a0d3038bb58d78f1bce28ba6ca3c168bc37e32c7e9499766aa50f2364d9816bcd88737466b9cba987357a2ce848a892aeacf1d43203ecf51a57288fa58a7d6e0d556f9dc207897d680502cf4d28438bfa5c42459a6dac85d3a828d9c0edb0eeb5c4572ffaa9334f15da4e7ae2808ffa0c9fdd155facf6b96435286201e6bb7c3a8ff1fccc7b5bd201b4bc987603e88f8ac584b6490d0d71565f8b810e01c9a97222c6069be930fb083156ab787dedc2bdfcb216b7db190f8bf3dc88a1924e3423fce2665ef9c279fbbf20b8d1661e14f6e91a832ebd9e9e7c318dbde0b97f9a026bca4913bc735d45fcbeb464dee8e41ec6df8fa107fc32be19fcb5fa5fb1f05f4839be87e6def48e20bb1ffc615f81b920161636f7732807bb5023de18d9a99248e02f052da9498caf49a3d0532be97a26c13b4b5c4745231e1144ca9dbb015d0f497fd33c4e007d99458cbb39f1cc098cb7c0011be1d786a4949129c11b4d15dda96f699f4fbda3fb31061290b9f239c9cdb13c070dee4e84e793e470894b38c17d758833db1e6b1905c729d4a262778499f3c38f2e9af7e2a919badf9d631bc8635cfa99ce61b350b5ef03929dda05aa0b4864426c21f110d37241a7354cc950592837b551012398bb31050cbaf7923fc5e54323118884aa12d9d9026ef05a69ca7c05a43b8495a5e60628f4cad46bb6bdc7c67bba815ad40dfe8e653a75901dfe1444aa0cfc0a9d75b54f8c3c823d64702a473e166204acd32e427ba0fcea7a9cfdbd30e40211f565579cfb6e934a65cc724c58ac89b4597bf2ba00d74a53211f8372cc0d13844d0c81aad607db35a69b823cbc00f61ce2096994f43e26260eeb2b8e73df9db00a5935256fba62ea55f5c1a39427cc9e4415dc536c742a04bece1fa9144b295a900690355086100f83883774aa05f46baf7f288d813f8aae87ac43d5d52eede850d303908f69fc554045d97807d404c20bf25b4c881673fbd61e8d0974c8ace38c46c982d817198402ca645b64d6c371cf7a4fbd0c4606720bf2af842ce414da12936cbe58cbc4d697808d9bc1a68106b7bd6672b27685426402d2b8cf97f0dcdc3e44157b2619d1ab6a309aa12ba6a24c7ce7e800b06347ede577d956609a8541db4be19ba0f53c360ec280b89935a476592eb5d6ebcfbcbe8953bf22e2d539fbc2915b09e2f5c59f970c5d5c2563fe5dd33b1bf626b373a13da952d2004aaffa839ed0a3ccb7badfc0dba07ffbfc97bc645bf5385f3e9a02ad22922ec1f7d280583d448b2b00523efc3c18572f30acd9228904cdbb093b5b1ba6bd9c666e7011b7dba40de668996527869203a9574348fbf94d86e7d31f0f7d9dd440b64573e8750d429912bf2445e3be4ddcf442a20624fde06e3ac25aa58376e84c44ac55db37aac764bb45df99e2af5f100e90573851bd6de207e8d4fde1d1b966cf4727d306731599d58a9409500d23b9c722293774d87ea521d27371aa36cf2be6999aa10f585e35360a8e4adf3bab074f266e0cca4ed8ca789434b77ec7018644111c7011627ba562b4ca91a8267dd80ec78d1abc6a5df5b827c48a5b0fe76b7eefdb3d793a579bb3e3460df601c305d3a4e00bfe6bdc852d46e6d5c801ae494bf3cfa37bafbf57bb8aab29de305d44ee2a0443901a390be1d2ecadfe0c96cde36bf5bb76973044ff4062cf82d25dfe289432d7c3307ebf1e6072c25a52fefbca369bd4915ad808f81993b3683a9da148b812f0ea0e6f3368137ba4d0bdcf9a0c6a4702862d4dd826e661ae074a2b6811d4ec93e724b196b5ed95be008cff337835c29d24374cf606d15cc0439b8366ea700cee2da178fdce2a74e7ca4a0a5674821d43197925f685f1788b4769140cb979b8a936c560e4d4969d48a2a22aa86238df7731621ea6ad4c68d38739a3b9bfb998a1986435ef06a260674aa4171dd7dfca27a8030b3082770cbc6be4386111de4945e548639a8e4b3f12e620b9702f2968901a30885078d934ae441acf3e21bc6c3d2ceb725261ad889e814208481ac8ce8069cc2f124eeec9c709a1c349c404f8b14b2767fd1a860c7be00fb99dc42d0cb9dd806b7fe5e052818469df25d986d6170b3f27db5c860603009c67ddbc235460383995d1f2de48fb2dadbb4dece3e12b0e4a99d42e2bc0d1ee19ac3bc9fb86a99d03033a97320cfe8bab5d4b58d5b0d1ff439bd949af1750f2a0877319f5b4bc3b88710fb4e459a36aa21d604adecf02c6bed73d11f30888b0b9d66f369ac25e12b1a25fb29a010974242168beb43651bb3faa1e4dbd160926770020b13a74552a1844f7d0c533785fb418a2b4b5aa0c21fedda544f1831b6f95d7f1f26612ef87b3f4218263e040375bcbe12f6a00590d4ba240c0871e5434b10647579e180cb2c331014c6554670e6d530ee8f37b0c020c75508a56f9520fca6945ea2f7a994267b23a44d12fe5d4405b72aa95e8b7cbd7910acae684ae14680c9589026612ca2c9e9805fe17a00a0f102a1f86d64adb1e1a52761b00085b9615c8f5c94d3d4a5931bd8af4bc26b2b7ba1feb26d1ede59704b468b6b032f1f26a15ae7021a5037e07c60748bad151aa105f0e1b17b83e5752df21d563533223c66bfdf929ca78c9d399272eb3b8c9823e7d8faeac8ada8897ddd15500a4afffaa405691da4bfa9a3211e0ebdf3855c8d596a8fa8a9367880a7470b6379fc1a4754486068b8bea1060f17a43c6cf02c274f8784dd966b90b29e27a8103a26373712367b2a1a82a6320fe137bcf1611ce6a1c3350fe1541e8893c9e63240d183ba65855b165be6819f5d5df5d05323c9df38e9a4eeff57581a7ab8f100ced40bc4769ee4dd793e317bbe41bfad1429a18776b4c40630893a87ed381e31a209bf0cc0733074f25fa62c5177e351bc1bbf67da819cc5d492a14ccb7c7faabf65c53d463de18090efc6742f66711f5bcbe1e59e71e043b237be4ded60d51d1406ca8e615eff64c677657eb9771b53af3fc12d26138031be6dcf8568d03e2b8d14563f81da160eb3ba2695ae0b013e2a35760729f4af90cedfc272778021eea5d0323a5b20464e665246141de29b09a84b3a9c2b0c8c1e1d3a3db6545af5c83a0c8d9f6edae8030a74d04bd0542e3597201012bb3c048260ccfd089ad038e700c840335d78a1f539dfe1a50c90407266ebfb689753112c0c6e214ae22a49180145386da21cbc4e27a4fec74d36f5a7363303303bc14d2b2c2cde2ea0f9c861aca56cb108d3c9e488f88abc9e53d3be63b91405e3b8aa63110604b7300ac9b1318b6d858b991cf6aa2ae9f6a24760037ee4d3264d01789c8e2e90a0ffe6c1b58acaaa395796d441b233c6c473aa464dc9c5591c34a422ccfd9a760bc6d7dbf1780c6141591c0230fa474668e60f62479379cb78a87af3cf66ba0132bb431159a3e129e8ece206278efbe3dd372a7c9f340e453373021504ce311ba733a4c789d35835011f471f5faf8222332088c71c4ba503814f4851ecb9ec51db8b832f452b9db80060918404cbd35146e221e870813b92b8bdbf4081ee19bd6c723588d4514402253b3c39970239e3c7f260dfa520a14fe2d45dff3bc11dad08886d61246592b83e645501e7639903d019e38552762459ba5d9b6801b8ced71fe2dd5dad5c40e02b85c06172b04118d251f375ad31dcbd17c20c3e0b14c0f6855beef5621fe2a5d083d580f33eb9ff6e944a126383251e401827f5cdd20026083f57a187e75cff9ec32030dc0d663b391a603b39a11391e3d6083541e2c76844e9e226877628511c43a6d08178aec8626107f74dc4c04cf188ab2574115717762c92d454aa90297190148ef2806154af03fefd9f84916be42f4488e61bfb48c4998f11eca1399e082252cb17dcf809519a82bea074c20b4341cf155e67b8a4f2c24fa25b1c9e4a40fadf5c201a48b0b41e94589fa2832b0c33ef2248d27ff7ad0b87cf37e231aa16008fd3854b00a454fa8005a92ab89c4ff0a8d907f2c12fc39ec1ca56c5dcdf6f2dac8b7ec49c159b78e12e2e621b91866e6743070a1bba93d0ba8f1ec8c3bf92b9f5ca0108bfb3a92d4eac71e0a860cca62c60e69586535a83583e11e1142c6e3d6aa4c1890fee49082795e150f5d7c61510bb0a957c1cea26e39d9f050973568a0b047e5bd67d81a571c93fd6a681115022839084d403e0f30e1b3d7bc58467772516704b808269c737721729d6b5b14e98fc8a1027cc2438b24e20c49fc30e5b9174a801d2d6c1d1e24cd50abf416db5002766cfd7660b8167a2e27bf22f1b9a39d3d45b0881913c62b3602c09fb3cfe1208a25a22e6bebed9d59d4a9d5d99dc01b1c78585ef832a452bdf1a8a35f6c8a9bba0427cb4017fdb120635a28de7f60312463f11443fd250fe26fbcf0a9f808e33c05010294d511514d116b3faab2b7d1a53c8fd40bd5b00f15b3f958226f17d9bed006284612639b93fa80edaaf5bf433768117d433862ec234e3d0304cd648ac9c201f0d7a7f8b0ec99d88d8df415935085fd1c940888033e3351050c107e503185464ab420efbf55bf0505f4f7249befe521eb0d999a911cec69d305d2994276fe8ab9a279b5189fe97332c4950e7570f7f2ef7de9798d30356362d903238ba804dd2bd3229000b878779d782fb4ef8b5586d055aa056ed0e64aebcc4a4234b682a891247127082cd5006f994c054fb947b3aeaec2d913acaa7d81fd08ea0517796deb021ee8aa003a08e712aaf62ffbcf6892f6d575e09238b68b45a29da47890ea9890739545288b885d9b243d989b0cd9456206d649c1823276006abe02adffd76454564b0dc0668588c2741609d3c95de5a24176905c20abb4c025c3e4b1a73ab760f717022180956a8b94c41cf18490d6943d76dd549596439c3ac836085c4b6bd42a72c2178bb82d5e4a2ca227a32cd4735360090f4cb8fd8a78506d338d30f8f6641e5a64323f3ad9450e42b548b4c9cd3fcdcf9557c0b41512f3c5c7b26aa389c5f7614d1edfeab8aba729e856e7170b1a5a62b7adcd53f4cd0ebcdfe0bf09e09becb116ddd5b2b20c3daf9c2a481087224eb9498b02d6e27bba4de0af7032f4a862b6bd23f5bb4ee939a4a57605ff4d69556d0307a76fe9103db521174a5af91f32c4edae49bac5b48e64521bbb2311d4635b434ea2fe62e9ae69b4e7120e59b2a8f38f06de3aa8e9e70fa220027d2b644ba298cf28872e1377b33dbeae8d74c4bc21107e90b41f27dc398f181595f3d72817f6bffc3747e9dd9fa6da6677c34783dcd8a162d1a50e852f031b2488e24973ae3089d874b7165ee303f395b151f48585bfa0afe74633e290a3629793c705d5f9f9769c913385c7c2035a839f6ea5b2088d08766dedefa4fd7b599ac8fb0eb2858dfa6467be4c63a9135f983be423412acf5c2693411d4738e7fc08d69f7459a43cf7d39ba09c3dea105f39f7b9897c75b2524fec93bc311f440b77c856cd7b599d6613dc14fe3afa3e8923db54e40984863618c401a17bd551c330306e9b69c48b76833424304bd1d611f09e54409970305b80ee296645301d353905c61e819a368738bec77f2cf0865b01c100bb30df916d258ca437de2bdb2f0ee1794b037e8ea58d19b7bd4424bee573dc375606b55053272ee2b4cd29dc151a1f532beddfc145649da6d0af328f0b83e5782c318ab952c8d20e7700c93f1979f860b9c27f75e42e373416f2cc7653fa7112a2375ba188758449d61e635e87c258f455a95780ac25f485cac403bb4baad06942927b47c37c79be2a4fc13304dfeacd7e6ce35393e05084aa7a8493199f16a9387906c87789f2f32523ecc3d9800c5d8018f09b90942cbb0a007ffbd54ab415b4cd6e7f8a9e332ac87017c380b0755bdf45d5fda0a97a2933035f009e33c8d299aa6d76ab197cfc48e971bbc2ebf9d28d194bbae33d0784377334363298932c36bc153f87f82bb97be8559dd1bdbd7b4125f1ade2454e6c4266e82cf98dc527afcb118b08e62996bc901a2512970d5750cd9f2b05a7b5dc8d83006a9e8b5a8227a34e73833bb152ddb522ae8fd8b0e1241ecce62030eca52fb04dc90cf3f094afb3704116af9cbd512963ba762e52c90b821fb8f84f3e05846af3204513d58356ec42f6e1365cf3ddadebc207bda15441b6a9c2c62a6f3ea8b048223879e9a7660ed5d8cd7dbd30419f65843b7a60f024972fb04fc989ffe1c5df3e3ae38da64582ba9e47e47eb3ebf6ad1ccfdb2eb43e5117122a748e5372e5b61cc686b38193bee840573ed3f48f48c68036a830088e94a4a308d33150fd902293d420ca35112708fc30c75f9685940447e47428d695a0bfdb4c5ad64021da6d11c928ce1d95b89d58b0313d788112833eba42705db3faf0f231315bb9486906d3e49e6b42b3dbc8a057c696cd145900700a9cf59f75e36e2728812477da3b044962d7a86dcc557c859a176f50afdd9e0498c8920abb87b7ea2b6e5068a6a8c81c3e8132345b63f455fd813e9a9838353f504a90f628f14916c597491a916c97b4f2154a3f4e0d4ad0ff04c95091286c4e8899003bb4b828f89b627e7f63fa8477bae14d8a087186fdb08d492a4778749c4cce1d0a1b6667e91b8d0494471be65f7c9d78c2c88b3f9b116e1a0cccc4f6b26aa62aa92d0afa7718d2e6324e309c624b0a00b8940078fd1dc0568e323a1d283a876f485cfe9cf481923d373293619c2db5e21ad8d432c92cda7f11d0d49b2f2ef8b14a7ad5a145f6056629018aaa82ad727844eab58b61dfff3b9d22887ec2088740e849549b3325812537784b8fc235bd2f94886edc3371b651a4e724a3a3860f6337a68fc451493279f099f2725009e1c83a86660622d200f9710c308c9ab602c74c2257062514efcdf418058621986cd780e5d664355ca08865df9ab2ca7a9e3824db669f73f2a7d9d7d61b24ec7e5f2c17ad8963f15658e9d79f2248a6c19c893bd02fd98a2d6dc85df5b7507e28bb39c26e9ecb99dcde3b01ee73ec19e4ec1e68c2f7621ed7a99354d46de6527e098779dc2711467e666eee0190ed28ddd4a5684c8cadecf9dac58a0661b3335e34c8a1cb853003664ab5325fdcbdf8c52abd2718b0285eca85b8689a9cbab6d693cda8e22f805bb0a994bc965c3635348b85a5a81f848b96d1b69e1464f45953821322056a3649e56172b0999ead532243638f67d7ad1781c94eb667993f6d9b5e8b229fb97931eebf41018f6a5ab4a951321af07dcd6951911c96939edbdc59d1082e412cde414fa4f4c3965fdccfca79982bb627ded81a757716b9f5eec31f02cbbe80ab6e49e6c37b33dd0702dd7b945d3fc622bce2755030e62fa385b03cfcb81bd694d91ba37bae4001c54f9cc0504f6e119c09a941c71ce897aa6f4164b7cb451244ea4dd680b3c3c42e6383ec4292839535b02a7120353f805e1bf423df0d2af97bfade81ac3303db59b1c43c1185ec370ba7bec25ecf693d8ed9f1703ecc8389b73c4ed7d587d82899972915f22cb6f04e8e144a870a02517e0db5426b041e905494f9aae1156b6832614845d08370983733da03e4a7eb7493618e98a42d38c9454eb8a840afb1cf6bbc86796666cb6df52e91b196f180322eeb4930b8b738f0815f502c6626597b2aa233b1d2ad11bb96fd112e810d5ae8ae30ae5af7062a9689bd62c4dcb66f3ff0040c60737cc7dde05266671c00f3b3c28b52f6cac3c9e487859559a73fb1a4b7696f43ac22afb49cc196da2b47433f9ec78465c278f3ddee94692a0c7b3355023f87d46a288076dcd80c44179a347f9e0edc13bdff1f8b20161622b6941842144b38ebfcb66f44411bf8f5b6b3297774342639762a10e554d6b38af93bf4ce93b7b6c0286decf894b8fd27509b5c4f7d189f854c9a35bf58cfbea952cdc71f279c9d7bc8b4c0804d70a81e124f745bfee4640a100e188db82539dc049796f5c56017bf73d798f089b7ae0adc5879c1c7f5059336dcc2bb7a78a5c658036909b67ec74e539ea87201b8061d3b266fd8b82777b07346310bfe19e5a64b592bcceeb9782a9351eb32770e3d20ca061d5f22c0ce3d651e89c968aa54c315856797174cfd7f9608d3bd5d791e2e270ced6d29de1b53e45fb39e0b3ae94e496270cc127feb34e6bd54bc6a1004d26104ba8bf546500998601c2ce9550c0dd68360b902659c044c445c653a349cc80e0749146efea5d0a1e981ac04f8c1e1b1a0ad7cbdc97d4015e88002133393d735c1721543098eb2ed7c5c48b6c1ed2fa88343cfe7fa81073c82d04f1f9bdb82954e10d61f09f7af4b15344523883c3c240b7670d2e0868dcc471e00dc6f82c427a90fd4acd2d449f9f4ba37a6e1ae1545cba75f05ff3320af0bbccfb2f76a07c18b4ee4b434e9f8050054e6f10f0abe78292db4fc686705600cbc21fd519468210080f78fc239cdec31dd26545888ac36c9f81b78e633829e555c08ddadac5075d81a798e5eba44cbf2c1464b59263fd0429f6047f1592cd5453da4a4557f9413fb33686e8033d6c0e2ee32320497faea3f824eb060377e4492e08b6fdcccb2a5476a81644a8928918344b688b5f1ec7c5648f2037867f43a8166b15e3cb2208564bc838c7bc872a9682d8655ffb0162f64d5b9b344bdc1baf0d256b519970c07189e11b1a2f5b9d2a1889606dc25fe2e6e46d09ecc96c1e0f7a59e5b330c9a7e092e7ecd59a2329b82d860d05f728f1ef217a2ccc97efdff9b2d39f445969fe2a6ec3ac91a00a16f25abfb7622758a3fdd40f8b6605336de3b024d0e1b4fd83012f4b6f146b252a15d63b40adf100d15aa2965db1e61a6e1be2b8654695b3ad786134e4bc14fc33390ba44734c2f2ff270885e111d33b8e089370b6377ebd34fb86c0d4f200b5f3cc0461f01518641465f0aa365b8ecdf6900bf53f97cc0e71e880e6f303591db968fa7e53fbd594816ff8d81b00a8d3ca0ee80c72466a261e08267cdb35b8885f125d8bbcb943a707dbe12ee1956b393eca2ee1cc25162ae4a4c0ca7f97a2b174d6bfff8ee8596749f9fc50b25f78d42514985bf4dd4ddeb6901ce1334e32285b9e440ff60f94b4c0935471550a38628e1224caf743c92305cdf2e91850684ef79cce409393ed9ee440c9a40f7b3aa9a863b86781cc0c2f21630a9a1f0851a240cd87bf9ed48e06c2ea9fe2925cee826a45a361116d41b6eb34a42831b2bcf3e2c5f8f9fc2bc134500122a6f3906d5a1444c49455d41b411b0384f00a3008723b462331d1608268cf03ec10847a3a64f7dde90f38a7f8d6a9fe61b18691c2c95bd55c6369a4cc0d59f440a0f4cf826da827b857803cf150592eb54bc85aa4b6a83664c89f9234e21c3aa27657614dad133f081a9aedd898b067c2d6a9290603102c62ea35b7268999345b4dc19fd84027f4183223432e69f253de6198501a2c3a942950d391e34d29020ccd7e42c4cf171b30b07bb97387ecb659a3feccdae4782653618df2026da4b18d3fee8e908f7955a858f20e39f0757020969ca4cfaf203f10d9f603400a72bf679ddf1ae1987628f1a5d9106d3eda55419f830eb7eeb8d7c08a8002ff88f06ae535da4550e0a3bf9d9cd040ca4fbb8acabd1a73a1adb336c36af162911c11b247225042a0a2bafa668800792c0f4b7b13838077106e9fd0a842f774e18e14b255154fb3924ed01ee13b2cd114942d9120105978dd8e3f4036e22cdb4237f6929b0cae4a3136d6f927c4194bdef5ddda90c9cca168ed79511917331c81933b7333dde90a23d62325e278c276e7313b4106cff00e4be7913eba8f194c6ebe24f2cc8090d6ef16099fba3fdb247ab02ae02edb83eb86ff3b455d3ed630a76ee0e308dd161be33a2e4a74276af4b0a3387bbac9c19c68e21339988360833f15e6b52d260ebc3c4575c2423c81c6fb512c421abf4d2f2921923418af71d75bc2022a07a8cad01247e9c4a4ee4a5a733b8e41a24a815880c95e0474defc219bf8abf4d04ae63c9bed21320d7269b2ca9fc41b8961bfaa567ca6d19b2ecb8799860e29e093f5bfb0b09e5e23822b16b4c7b3145c2e3df531d6bb6295a5b19c349ffd2480a69d7111708b9b9aef9150abca8b6def4baefebc4555b6e469b6a939682c34b49857dba1858598a4f84bd783d99bff1745cb08ececc0765bb4c6982c954e51b5f85ce3ba5cda2222f5640694aba67da6844c8b2c1e28d90b310c47ba570e037d690869d838e9429daba42d38118d6ef0deba4ad939e0589f6eba81575402f41cd595c0faa937a7993ee48c4070c71966c61d9d3050cbd6dbb0f29e8281d68227e2937636ef459490ba08e2b6f9030b3e85d181bf544415537bc70b495a0895cb216b12bde296876942818cdc4aa40cf0068960be0168040152f76cf91a0b2bef831441fb9463f6ab47bf0bf8a49f8813252a13fee8ea4cf093614218460f02641c66a6ade7f1e0e4803c2539ce8de5d63b65db31374137e3234e51e788126397e14b709ef26d78fafbdb634f600b825f2a52052a7e85bd0ab80a7ed413872a9b4d5fbb39e3de93c5851d7a2b80e60d483898d35c89b55d2dd0360c16666030a04343ed47208951c3ba1c118043a8a2a4e9a80f50951520bc701e0a3fc3d98ce21e6166a19c5f202ec4261189c1a1bc64a8f1e7403fdce2b500aefc11122089faf5c4b60c8533c9fd39ac57df4cbb635d72f5c8525f76b267f5455a16152bfb78b0f4f0e710c0801d463efa2aa621065c004e5f427a6242fae288ce6b045f301da8a21a343395723e75646e2445072c208f730904d0abc640e4bf911e43fb55fa9916bea6a0dd45c9ee99b65601c003a00b820864b9b1b7892ca21927cb87a8b32cc3a3292c819850a17665e14802e2ed7efbfc6b81529cad4f07b996daa82777131f36517eb0828fd53d725f05ffea47fcd9fde3ee2679e94e761829384de178fe9f609b16af7f67b408603dfa4e3f1dce0c44ee35f4d9292d44d512034c8391311683285cbe3f85601ba43552ea2a70d2e11114ad3866c82d029a119a74c7d6025645218b7506c43701812d48e2c0eba1257e401eeb0095010756626ea166e055a286cba7e1dd040f5ad1dedb127df0c0db2113ab51521fe91f0732aeac5debbd232303d0915f298a9ff626e7386ab13a46720f42bf5bc0c0ec6a4e3e45e006c6315e75c35b58635fc57f67c1bf75c9d9beb9e5829f0a7f643a14d73d2ff09271fd6e1070737e35854f000ef721fc6b13fc53a9b404f0fcd043ce450bce9c78bc6e18221eaca0d83046bd21e00b501e39738464bb031842d364e10a613303667789e9aa28f88c134ee496bca3cf5445bbb2ad51c67577401238a94f243f118327769d5ccd8e74371524b7a1676729c0a404d895872a4b2ada05c41ed1ccde5190703870b432c000dac5cd8a5ebcef06190012e001c667c205887636d952f59ff657169c6e093373e5b75d9927ea5309a4ca39eda92ec2923034b65436a6ba66d054f69e35cb5471de1659579cc1bb92f1ab43c8d010c4cc4c7413ed7da2431b333e5ebb1635b026fd313b713b5832366b93f3f19f33c5a8ac4ce11095db8638e29cd22be952bffbc5510943f5bb23885103c15e9bb2ce0e6f36b5c0a1cb29caa730ffc032d30e0347119eeed441909a3489da6212acada8c324825f9385c3b5f50546ee49207db0aef6f84bb9fcc0475971e429809e4c12000b07eb5a1b4cac365e507fb5a3ccff5ba9f9ad2e47b9077ee3e92f610955d1633448b1d9fc89be5e10d01d71c0575513141bdb3986b474a7ead04e3d34f86ae9ac4c96766ba3c8d3b8803ef4b808bd07db69a6ab8fc46db117bc526f971ced343eba7248fb719a6b8b77e5bf23a92116b6d28559ce475257b8b0af31abec2911d13262926b853c49eb4d4c1e3d6a04c1be3b99967abbe717579846c4aff90e63771f5c56ac01a21665482e91e7152601229c669f190e865a1928fadf9aa10a06d1cf492604a22283b22104802db4dbbe111cd7f90b531dfbe1e677e85697469e0fee539a9cc905c1a2c3726dfc3e6e06e9df8ee01267d0ab6b1cf7532d7531027482e3fea57805dca855022f07075cf3292eaf048a09a4c543f9c1a75de85df7549965328e6c0c2546dcd53c87694ddd489fb1597bdb3bc91dbf9ef2bb20fa0c7b350d553736366612a7e86144cd7b27b69c5269ce00ef75468d3be5d777b59c5e16ceb83ae1f556d29ebb73bc089e32264e21476fb6c85d11c61bc9445c6df553931f52f1b6425fec743431623971de8f257bd58c26a27408f4cc141c9fa871b861dd01dfa6c0b595fa7e5c64ec33bbce283b5950fbf7295ded209e12bd0f965e85b7b003015b06fd9023b476e58ea7e0828147a56ffaec2462792c87e81f2031ca400b120062e23833d7e3c12deccde7b60982a7b419bd0cdd11a89a2f31e2138eb6c85cb17523c451440205ee90ad689b5a63a71077c1a24d3503ae2c102305550ece73b9996a76c69a1eca9d5132e46ada21b7445c32d1d1658c7428ac504e422919762c141339357dde23cbf1fda13c7501b1d01374814e8db4adf6624b68872ab6a9a308d740b02ab2e453ef015181d1f08b177b1322f8a223064c841455f1c3eb002157f2bb1dd8ebaf23d4d1be0d434d6db88c1eea506c4401f335ae77f130a65601cc34629b36d3f364377f3f960c0310be78e88fdbe9c453bf9a01d727b3e9a3bccd83a0e71bfb4e387e4266e9889683d82c0c46365c964adb9a1e9c630c69139c1baa6bfe33ad709a62c78a97b86565ec32401f22f41241b69b2d53d478fc3f0781e666ca295deec41da885bc3a863b82f2d43c3705dfef82efc7989dce5b123dba7e29fe0a3e184c862d230292c5a07fecdbff307d634cb0b0b25a9549bac056c340d671b7c487297b88cc5d4b926ac7ad9a8a03e0252e8c6bcff6326d3b1ea1a0aa10d6398b312ce224a014f085ea31b6229e0d5a2a36ddbdbd91208a47e40c01851b2c609096ff33e052913b52fe9acb0037e61429234643ea6e0301917563106cf023e7ea8594b42af4df3f50c6cbad1aa8c2ccaa3f5ea4d324482d768b7888d2fe9aa3cdded3c95b88478b62e6630553dfea294eee0fcde2e2cce097ff8c8b5b41205706068be130b54943e4a7224f54cefb68fb00783c0064a16d1f29980c87f9672d88f14b01846354c877e566b5c15f2941fbb18a72b19278c45b3a2ec60341ee8c885cae1f583b689c4526bfed87f03c0a72da1366183b89efc6e540cb0e413f3962f1009061e1ad7b30ea3cf4ba1077a8f879f391894f3fd09175e3864f636448d6164affbf95194b4ae143f2aa0dd79a13309fc97609128475a05922356ec2b2811b63d036165bfdf826a1ceb86e7b1a8a90b6d3481198b8167995210272e948dbafb8be7027fc5c892d0ef6a7c1efc3ff352cf1ac6864af5852cd0e8a8a400c9a1df4563c05e0629bea40505bbd4c48dc46b2222c19c68a1617766f5626c91d28fb0b926eb70b64fd85ec4a0d881daa166999ce954709f8bd4e173e355c86e3c338fca0677e028d9a4786103e125993ed07f32229aba4ada76f54d607a4b06ddc5b0ec842c65a9298938bfa80c42437a8ff45ef73151d519523b29c9949aa76e0e271472bd576bda6f200579e7ac444418c41ec68306e4ccaa52c8abe8a929129a4489c3c2fc6fc4b31868257037639ccfb9dcf2ad81de146f2271ef77b81e8a9eed2bb1ac932e7b3e6b2004f85126316d585f64e2e52a90bdbd1fa63169d830959956afb6fd2c8aa8148535b53d1693252662c558b86c88beeb689cd83bab282141a168bacc3fd2070b35e41cc8d752b7e535f843dd4e6bfb558b93cc766a54fdd680922b21b801def33d0f57804b5632770965a6c61843bad43320f38b1ff548ad6da87d1b9ecee70d7560caedfbd23b465ac003bb844c95d5f93e7ab153d48935868cf7c4dbed9a9a22ba867ee450b586310d9e25ec1bc65966e92e644347a6524560a60e42221fd5c246c82276f865f5174939c16965ae9547106e888284ead74f9af4d298228a3f4ee1ed28ca36e8625af2e36d83b006efb03a29dfa5c815fffd8a048ee89c78de8006cb7c671307ecff4435fb0b4981c782499995b3a5824aa272049bc0bc2e48c879b33658c8d9998f7746ba624aa40b21dd215348de540fe469b629447b1828465a6b02d296ffac9fbbfd32a78fe51f648c87200d2221e23457500455dfb3caf03cc0ce4ce571b429100f3fd4b9a702bb2ffbc3134519deffc9e11a5ab701e79d0211f53deb5be536fa65041319ed3555514b1565a0a580486f82171a3eda01ace9afd3e67257796170126fcbfdbd28ceed2183559a87ab6bb5698418451545c60893191ab688090634dfcae4f4ab0fd7dc2ab13fc904c12eecc704341a4e84fe6302075b5499a4cd45e87cfbc12337577057bfda03c5863c6ee7c228fb65adb5ccf6e46ac2ddc5d535d93146681b390cf49271549163df0c4745decce5010c919b3ca27b6ea9e08feb9815b9dc5ff1146d7508996ef92d508e8ff231a7d0328cb3168f55784f54878cf7cd4124f7518311c4275b38633bb61ee387b89872fa534a8808e0a7187e1d9ae51232625fb08b645b779e8e20a673814cbd96c6a7b8bb3908bf1a912b31642019e3691ffc07a69c8a00b16bea3c080dea89e592f50b1f740de1ee14ebde902494674269b4ff20063bdbbb7a4530435990b75ceed7b891b478d608915a1e46610f28ba7426f43b952a1959bf1f4d237097e829b771acf247928836d1123bba85cda19b7b9762254a78e6d9efadb2f3868cf31194477e06fcdbfd3555e58913ee3baffa2f670ceef238179bf21fa7e23fc716913bd2bc8ac35b85e3b22c584e1f4f48091c3ce954937a755bf3863cf40423527845cbc45360fe8e695792f39028a0ea7c65f63ff58e321a0638baf56e4bf46313da0b7e6d3297baf4099b52015072c977656fd140001e74e79d5e9f2bc473ad5262d670ad4727a55e7dbb3de0309c84a92ddea04923c26045990008f720e105df67608c7b767a64eb5f9b9f175bd141de216f3d357f7bbc52038cb8b4e422b0d141e098b7d125438af722cfdd7ad3cd05b1d48d111e8434fad390cd33934ed8176a101a9873d5d7c0896f7fa55a620ccf31c082cfcd8622cced571bbff0f35bdae049b652e234ac39669bd594773668ba08feb9f7c3c095ed506759eacb18e46c4149531d5b323b9e435f82e893c74d7fa1ee47561544fe9b0fe7585b7f83452b4530e91d83968eecc13e9518d2c0e3238900017fc17924782d1c36d4ce6f774317374867fcb05eabdfb561e15db3278d5f32b581baedc0565195248166894678183c702d5691b652e1a10ec0b3af12dbb9fc051b14fecf5cd93846e8220c0cdeaa59ed9c050d55c7090b72ee3fc574b619eb029885ad4873a3e231b111180d85a27920fe760438a4a04438936706d946ae9d56e3fd27f69ab0fe32f0300eaf85f3f310ab561b95f78bc5e0094245f6311bf554e7853f541f7fb68ba3f83ce22daa40407a812775dabf08a488f3b8f47fd6b977cb825a7232d9434eca5f669e9b82c2b8d1889299328173c387b83fe2f979104ada391b35c8b65c912124b9ffc5d29c49b735ca61323c7a4de272d084406acee79f2d77c74ae3e55be6b3c8f10136ec4fe477839ddb7ac11e3703b8af3aead0aad2951aa78d99ab395212cbeb1b7198d0a14df4bfaa3e0e40751434292a59efb5db3336e54a827658b1a2dd15976b26e3845f1d10c6f933c52a146496591a641d9c893d12185f696cd54719c36c1312a626c2d2d8c5e6c4a4e69dc4002047621925dcf010def04ef220315bdc34a5db55a6498513fccc42c80f263beb043412181fd2cf818809167b4f118b1b7110c4b26a95a101114f0451461c7631dd37d91c9566109f6ad35e8de923b6b0d8e4abbe9928441c47d85d07e9b02ba49e806c11435ade71ac4d256fc52aa61e720485c8ae57290d50ab33c8dcf42d25f9151806385501ac03ec7b9c0e3a2026698e725f72a7351e9f45da5c711a45195de007057a5c296dc815aae4a45072ae8b72aff13f8b805cda3aa5655df284f0fc8bc461d52e5a06855b1402358e825eeeac27716efc7a82eb41d6bb4d3ea54a62a5ba9e6010b09c096372ed80ad49152aa02f9a94f29a27c0336a3ba621667b21092096aebe6d9ac6566d2d6bc06e9a340a16f6b3fe3776da0f1773af4d001602ea14a4936bb9dc5f5a3e251aedd75db414b36fc2840607ebc453b76c16bd6458515985ff949962e6196e778b94c9b958cbb6e83aa467f46448371cf04cc5872799414b485e161c294c2553c9395b445861a5690eacd00a818aabcd2ac609728eac799694977f2772a494a086aee585fde87ad20e4ac187fc71346afc93490f2297921ad0a7509caf7d8c9b5438859dc1eb5a845bfe7dc01eeeaa6ae067f35282d9414401e539b19b64d9b6ecc22e86df54439d0cb5797c8f6605a43f5a8c0f09926099670f1360c3e053d7e61c8021c451a220f0c38205f19a68e25ad22a71114c1e7eb7463021d34606927f12c3f13d87fee3e9659e2f42eb9decfe4989a2fe596d515f9fc44ee57363010e07c0a623da566564d37a3ec139a2b70987cea96914b94d581abff3bd1e54c8277f6058aaa99332f6c2756a1c915900586bb41405b923ca644f807e684354b02e262bc36a1369bff623019173510cbf25e04613042977e5545ada0c456bec4c7394dda8b73e6c7c1546dd5be9f2747c3329573dbcfbe35f7d1ac0954cfb01f99d65ea1e407834c7867f00cd43ab4697cfc344765f5c810bcebc81b2979441f397e4ba420506725373bd00e42a9bd64c6423d6b4128ec26a013662c8f68d5511197588c0c6b7c3a254e4311beb20e89a34e923fc2b2b06e814f3184393d8ea7e02acc6b1440db93a901b9172650c7533c1fd9ba810cdd18d4748a2618c503da72f1effc7c7f2ff775af914bfcc1018294445655597e2f8f5133bef6057e5bc19e376aebfe5117a94831a907f52373374b02c721abd3832bc98adb7c0d2bdec7593fe48ff8affa64e20a081f90f29685327d7bb0227b770d304b2f80bd2941980544dcbd4866e2cd341395fb673d3c130093cf820f52ed5442b00f7c60a2bebb4ef59cb386704ea51e66898e9846bc887d3a6424d15683d34ee93508681cc12fc2a6c193bb1bf613afe758d0037959dc225642dd8ae3c1429b133e87cb0f0d6cf1680aff652aba93278a992b6b0b9fe34f34912c2ef26438ee32722f51a43a6ccacb6a822ced915390cd32cdc386b06b43af0c480a6f2d294fdc5c2af757e3e5bee91be9458c62221c3afe07c3abbc023e5d01804a80475182b61a473d022d3b34714c9344283f65c8959621c59fa540316d98c06fb6aa779a977c51a169667fe6781759b75c479335a9f03ad9e941082a25e299a56d0ad68c79a6d49cc433be724ad9723af29c8590ee449cba2e53b47a7f09f48092821e2dabf3e09f6761b63213969bfa9e18614a6464eb7b08c5db79338a29443659f4239948dc3bdb22579496e139783b87c6249d1d1e79133696e8c2dcdff9004a3200343aad3e821f49ab93c54a0c6f1867f9d62867cf3613557730d7dc9a8cd1706e6ce351118513122b76aa38496a96cb9b9f7bd7d812731137acee41b28ef09d02dd760d4d5de2d64cfc4aaa142f9b091a39fffb78f7aa3a298899c012aafc08a4d76a1e816d4292aef3be48c2fe19bbe51dffb2cfdd6def0275c2116ec5688e8165fb5e42a1d39979505158202b0118fc961fe72596099bc62b3d560803f5bc729232e2090a026c2d3d99564dd9b3d787d89b0945567e3df233855ce982625992e8f8c39aa707f9ca0825d4b6f53f774810e0c1dfc85b641a193073d8912cc68541be24130559ae272e5189ff279650eb10be04afa2c01f2ba0db9f4e7ab0fb78a1b10eb8c2be402e22f94aa196dd1f6ac6fe34ea8dbacd5e6b637d34febff64a48c9ec1eccd74e2a596681ec7ede48e730e5da9c8fa57e2ff026941de38fa35c988b9f91aadbee359aa8c81a4dc8666e2618a103d44c9509b8924a1355a32a374e4cc847430a98353ea9a7cf4f3d917448ef48b307a2f1280dd28957e7f0db21a02f4f038a2642aece76b2d3d92a1aa76bd7b17975b3d3a3e7f553bd0aa74e9e14d743c9c2a05e4c89bd922f76bdab44b886bb948e2f2654cd45aaf8160a67d35f9873556c9bb2f4c642e241cd9bd4a41e6247f0cbc2143ff142c9a3d81a654d450443227c50d3a6ab3ff063754ebc43c07659296e36f513b994ea543c08124cc2c037f1d51437e61e670e06925dfcdf14e45c9a9aef4fc0a826bd1654c912c4e77550e96a035b0bbec7d6738db8644948eb00106345b4bb93abb93b7fbb3d1f100d394f033628b524f2b1ab55c2c613e069ae6c8240b35a58a3c7c1c7d761265ff4b930d839a677b29fff3971f1d92b415e36b18c540421760d2a0e1300b72dbe814f4024c0fb9b048436688863a6a246b06bbfbe290757950fc173e353eb5de792a3868ec2a0e590af6b6376bfa1a05433da3d3eda19f6991f7a821e24ec3a766e3991929d594068716b92cfaba33672ae69d70dc19ac1cb1d9959a66397ce00a95a97cff4a95f96f3325ec077d171ec8e25c09cacf771b21a0da96a8322b16b45dd7b51c5e2ef2bd2ca1f422cdfbf9e2ebd5fc7085cbdaed775621c2da58339da946e39175ae97730704d23d3f1676260663c76acb7255305dc9d9666a4f569f16ac6b1a9c568164b487d4d3479b93e410429d53d4da88442c4ae75ff17b4f045d54968c89482adf3548266a61b4cbc947b616444da401e7ef41108b83f56e3f4db980390053a0a09934e629f80bad655039c6a36f49946f4eab03f94fb46cfd857103380e75f07d33c465215b747c28b2f1631641663f12129f8ed3e0e635b28d883082445eb0f8b140d49381b56965cb880e952e0642d9fc1bdb070ffe3c09ddcefc6bb10a75664752e6249ff6ebe142bae213c004c7d29b5a31225c30a648ed0e12a0174eeebe8bf25a7cb5a75c23fc1229bebc45fe3c5fdb826c82c4a65f947995f085f17d7b11847d94714685694bf9672f95478b953c60bba4eb7031e288983e02b3e7a58c5d4aec110599d42b08242695104d2d2a12598c70276e7153974564d8858894a8ef64bdf73689c5feaf367a2819e3124eeb9edaa6c72c0a4acdb01e634ec5795a381303cdaf9d5755122baefda1561fa6a3f125ac3435ba7c069638b813c2bbd6666516a79d907e321f16c1101119301a76526113f46422b62f86100593f43b0e54ec98d04e094eb44f10e256475aedd211cbbaacc2936c2ddd4e35318b8761ff62855dcd50ee79fc938436afaebc18c033744193717eeafb1e0b1efcaa2c1be43f4950ea09a6021e45030c24f938fb0ac1b6a396aea08e1640444031a3d4e745b305616a703a970d4e139f6cca9ddcb006e6eab4d443dde3063b2d97f08ce30acaad56061c17f02ee709cf33eadb7030b56f9353100e67958fd7f29d701d7d9fd2fb79f000c612cf37b69caf27443ffb790b6f7de5b4a29b74c3205100745073507372ce9133697cc1b22397367baa8ec6e9774b98b2940c1f3bbeeee2f1181475193ae99d2a47465221d7344a7ec3715f4bb880d274b4e163859332583902d1464ef314f4c30ab83f274b9666a0ed127ff235e73165982e54a8204b904582ed144f67f42ba264b9bacc9aa55e77b62e62c5c9f1ae9bae966407878686e4a42e0d07f550958235921eddb4220db0c70175658d57151b4028f281da7d134adebbaae5b02d73c967201a428f1da8fb525e53788444b05ed5f93e88a8286b1efad8e89ecb7d4313e6fcf940e7df29ffe289a59f7cecd66401cc6eb24ce6b27b644c62da1bbeebaebeebedd7dbbebaebbeeee6b4dd6b65c312638b01b9d252fbb496fb5a6e7a98cb028f4792a232c0a7d4078ac395e91541d25d5beec94e8fdeff6cdc34c8942d927ff2d6814e412a432c2eda9e628c461cf932874ff3cd5f612dc36cb6ddcc6d5d8efb6cdbe8c7bf66edbddfe76f3ce3befbc77db6878748ce77e39cc765bad56d7e5b46e5c382f2348629c978ce8b68de6a553b794fd5de81d20e08a2d188157aea861e80dbf6c7277df2ab5bf5d91e37662221efb44ad3339a4faa85faeb5d65aabbc3536c122c223acb7b1a9438e5ceffd735f51a9b52d178ef5a2eb1f2f5862861949a8b1eeb66d6f64090aac699abb865b5802975e7f5bf7e2596db27f0b47f0586db24c6c0335900b33d05b38fba7ead820fb4fb92511b1c063b5a920a824a83635047504d55593c80e05aeae4d5a9d071f50b6407da192b1d5c7bd382f4f0963f0a8540ee32ce41f6838404f03c9e88b8b9880e7cf39ef3bc1a3ca61281387d1542a55ad9589ae7f5861051326c098c053467d6517b984c925f246129139ae4ed4c94f075fadfc4cadb89452686121adb894526861218dc0c09d47c9a24c76f2e775dc76ad1187a939481c46472a19bde8fb13bde68b44229108e71612caa5746f0a18b7944a2cffcd23a2b4294329925224fa4e244552762351d77dd7755d47cada489b235b452f419194527658a45d14eea1f1cbb848c4bd08dcc1a37c52f4f2bb4e14b68b7287e6e98e11fdf859047a29d3949ec0328fffe908bd484728c4f585471c043c4a56163d4c88a5a242652085855c20c5a12f6a6403690e129d1d5a5f234fa106dd4de93f0c06bbb00b9330182e0d4144cff46aad572405131e0c01461e514bb03fbda267eace949def4d7c34f63b6a9f52ed5d93bee649fe04298f3da3eb1f56c09c68148a2c6b509a648dbefc348d6a1ad5341afea09aa65177cf3dcc2cbf731d0110155b44f1b8000c2eb4935e62777234fad5d03ae66b8f3bc6696ca630a62c44e053a7684c7497f23da4b18ecd934b4d6bc7fde2a51860fb14fc21b54929a5b169414a9fc40087540bacf21d60aa831e348d55d15634cc7ca73d940bdc3132fb6bb3450aa33b0e534551bc97b65cfd82f3f26cd0f58f1ba0326cca90fdf840d1344dbb37df80a1c465621de39452ed1ed1313df8e0a163bcec52b2bfa4c1c70e3e78e0c144471f2e3a0f32323cfefc6af87e4850ab9aa6696f35cfe3b53f3aa4c0fe2f7f58a103224ac889324409ac2f640ee30ec3c21d629bd8a0ec6f99d829b6a7b51b8cc2ef041ee5b1249778bd9cc09bf54a1de3ddf54a2ea55cda228ac368b6be5b33b2db31ae8d66a4c5be6c8e8b26edbbef956b2104ead7dfc220f66f58b24c8094581e2b73f16a2c32c0a395591e4b33c47efdaec745b74eb25bd93cb9f632e2e213f8b3d622c68b49f6d7b4971358fe685f9595bd7eaf24506de689e6befd5e495094775c7499e5a9b6c7c660365f032a92efaf01a2bf169ae83b01cf1fad6c562bc359768c111a6465fde24fd1e894bda24ffea8d309045d5cf24883ac8c06cd2c433bc5453bc4b2ac8d95b58b54e6a2d3202bf37a9c38cc7c2bcbfe543653d4e527f930988e4e4e8efc91a2acccca6e5a825698e0830797911f76902c9c19fdf141e597a9063af573878ef1ec5204d9df47c7947e346da632f073b3bff417b7c0b93bf6ffc5cfcc61e81487d17e7e7c54176e59266a6bf3d9b61e3e5a383b5c40dadc046d3e3dba0db75c928b000a5224b1128200564e16abef03e9944aedb66ddbb655cf744ab5214919a894caa269f4cba43329fa45fb1f5b05c29116b14063a061683852232ad5a8aad4be01fae45fbae296543ed4af8f4f8feda6be7662b5b509a1eb1cfd3c7a48798109b4ecbecd85b2cbe0c917fcbba6634000410d56426c0e0d56ddf79740183c86395fca50ba200c528601f40bfe3105f0b2a3fac59f650613e871df9f8712c2911a3942f6ef1b8eb4c810b27f935184da75007df26fd487e1f7dd7e0f0f993790b6407a435d14c7c5d74ed07644a7823b13dde6af3c04fc496110d1fbaf84fe41f0ca0acf8d27bd8cd3cc14e96fbcf6a42fa1b1b272430574f911b8f218acf1225085e7b1e96c78af7d0478d87821f00ac76b341de3d268e4f6d011d3ab4853177a4fe5738026cffb6e7a9d273ffa2db9d0a76222d9208535a6af51513179bff2f84d2ba14987959f6fe2fec6fb9b7604278d66c65714aca00f17b5670125204fda87cac8da10fc8b40bf683cbc0f812cdccb8f723f84f4defbca865842ae4349199c553ffa5dba1f9a6cde61b2f66b589e7b1beef04815ecbc0226a151917111d52fdabbb4009b74e05abe829ee547b3f21e18c4df7b0e0ca2f168d9aac034336012fb1ce89f4987effb5656c0ef49d4863bfcbd99574013054df4fb1e9e6c89465ac7639e7a6caa8b56c05373aa4eeda94faa92ca539d54585da2ed747f48e89833a40c59744dd2391de342f6af483a46968810ab6174d1acba8328b4930ff058739078cda19436cdfe9daa4dd49c9aa38535070cdc2b393be3c8184f56238dc9cee1232d4861fde2afc467de3b4324b2ead41c172b8bc6589da94ecc0c19e5a13dd4a7e6c0ba9d9aa393e330daa4af3c9672a9e6d41c4a59bc2074fd63272728080994306abd9921b3e4009fa0b08266b9c4e9182a95c8242ec8fed84b3d98967aee2df56099476c8514aeec6343b1914cb21552d864ff1f3c0b5603e4063aa67e056566990277cb1478663944d34f400e34833bc0f69b121c67284731853c364fa9c706319382802bb8e5fe5aa4c063cd1987ced383c43224cbbf1b689652f278025012d62f5b14cc83860cec9255a9b52e1c110cbafe018319d00c094de84f4b560bb6e4468748ce8e8b7a4ab2e69c252ff0ecb8af127116601cd96b0d5d661b5b539dc45831560c08decabe7f0e5d43dfd03272fbb1c5b81f731945bfe0af7a229dc82966c8fe2e7774b083a9c6aad51522a2eb1f504c396306e575c64f1da263adb53dbb51f35e8c4b2551dca8c7a3c7055224a740cbb075bf5899effe86360cc75f755ee8bbb0266c01111bac6a84847056d2d5c411abee815875d6f391a3834614ca1c930c43a1f442f952d9c1ede274959a6099c7fe6ae4142e668083558d90fa049d557b0c35426a4061e5c9d7cdaa7b4d2586db8567dd26334df6e50f341fe942d6afb8d064c3bbf2fce4aff50bb0fb83b6baaa8e0b092ee0f961fd2829c28c9ef123074d7c8028173556eb9c95c5aaac7972d64cd127340a506b0beca326e0f159dd735d585997c2ec1646c91ed22972888b95c58325fdca9a290af4c97f2cd91cc9fe0e032c4ac1748c3ef99b71d1a052a84fbf7ca5d6deb87036276c8ec003d43a824e1541776bda8e77534397b4f05a6b490b1c9a808f24424a19b826640b640a901822c4ad42dcd5f6236a4a967c8172883e790c0518a509720f60eb028b60e011955d8612270b3c36cfc809784469538713421a3528fbe6da36e97ac99a1889e1c098e46cddd2e5f2ae3b142af6bf5dd085ef3c49974f918ee9bbe191267d66f5b9b6be7ce108eb579de8fd622033250ab7d0f5eeec475814fabc0edf2bc238542a7dff9e8842ddf6bbcdd0b95cae1b3fe1bc8ce420d109dadc2ba2eb1f55b096b0842551d2b0d134bf712cb0cde3a5940a200a4d6aa797367f7e7c505a6dac4e106e7a80644da8eadefbf7efdf99fa79fd711e9fd257c9d0a06a99fd7450f9d9e09fc8c72a29e3859a7d5685f045144ddb418265a963be203a8502129215119560674102b3b4304b1298a50498e508dc9f4a5609a25147cca811cd5aabc307e98304477994fb5b80cc341fe8cde58ed1b3d9a60a9b479b332094e257f7eac1224a13584d68c2841f314441b2191a204376e0d0dd6d677650a59942a1505f0d55e0953ca2b2b5d65a54c7d8f71f40a76c40c950331d93923b1c469be91727fcbb81a4051e2f093f018f2da33d5536732fce4b740431bafbf6eda46bf77eadb9079b7bb2a40a50308b0cc7fb77524d2bc530fd520c4bd3c885470ad3fe61f3da5702bbd242e1959dd28b553490bc039472b4bcdf8e67aa46ba60096088b112429d90825512f91254a902cff6be2e9c7b6ba52f4a0430bac324120e8398de9f64b241228d56567e345a1991482bf84320c9bb716fbc1078a5c2874292e5bbeede1a2ebf02a8f26058a384c3d6b85cbd210a79d78e4c96cafb752e2a7f4393adc15223ac5171e95cc015975701838c7e6534725959a9f12ba377f9518d0f82dff42e2bf579a8bce9798cbe46129a1b23d3abbcca87c0203a985ec5149aec876ad4f8d1d7084d3a847e8642937d11e9fd4da4d064490f815028fc1a151708905ef4225258b3128afc473fba110e1982e387a42022895a4a211c3842a11ad6b20080157280218e0700287a16c0d00aa0cb83218effec57637b15c021a11771f5862864ede8fda3f6a97dfaa157e146a886dee56d68ea429a9591fd1ba63008e94dd6da7047e86f84352e1ffa1a151b58147a0dc56d2ae0e883985ee55dc0202b3f7a0cd624d94152799335e13008e9fd475f83df149a6cb863e555482aa3efcf74c124342e3f5201456090243b482ffa203834d99f3ffad187c020a4d074431bee983f0a4dd45fe4efa2f22152484585347a2c12915ec643a49551af429cbbc470adb56b5bb183a08c9bfb5e914e80fd677670f7a15a6bad5e4dcb94d061ad6aee0be1a6ac92d0e741caf0ddd03fe46a031dedd30722ef60c3235c2883838bfe93829d37b08252fb421f0a6be42c09123aad15f7df6b1f4d88061ff3e4ff813c80b88abeaf7a28955a8baf77460411406e5c30dadd4dbb1bc797fbcec8b2e71d27521770a00179743328c03444892e3681a50b3ca3c063cba8d633b5deb8a8db220435cfcc873409923f728aecb12dd9ba51b554dd9acca32a870896f554da7b5ee0963caa54383e920ff02865513cc5c33cf9e08c2c5a861de40bde31f54b44b00f998281689c687eff86b2fbf7d371654cee0dbe4dc0363471dfb973c9e493dfbd9cc795bcc0348f2a95013a25af902a6943297b1973f15ed2b6495828775c3cc900cb664adedb92212195e8241a050da382869932904772e827d9868b5e32c2e6f0bcf03f8b2eca8c9041b6e1287bb2c3801a51269ace3b9e07ff227709dc846cc9aa139fe1b3f7862345b2022099ecdaaf5f8ce4e020121388c062a3691aed711867e1fa3ca14ee8ac12a13f1aed9961d9992d60afb439efb7803488ce40fa034ae9937f575610338f743602e5aa6566a6b048d4580e414616372b96ef4a6260f92c604dcbb3b480423857170d447b6a84682558c12a09f74250ad20965825b14fc7e89800b07c8c4af1da6a7996ef31a98f8b3d5860db32fa9a96af096b46bff2534e0d88d637436993e5b780547a5de8bba626c98e9667096b58be2534e1ef554dcb9bb00b88570808d8178e321e8f1ea10e12c8949973caf639cc1972213803f270d11da86390d0a9e94b982e25c6e902d96b933553f6097df2bf2228c295ef8d12b4c705b4a75fec947e09298f38ff8214880681b407ec91bdba60e711fdc9026ba178051ec56f86f6703f1c90c34cda437b680fbd61b151094234e575efbdf7de7befed69656fcdc0bddb87a97f84f5ab4e14fa3c51e87ede9da1dbb6ee84f33292f3ba503869dd7bfb3687455fc785f85e51a78205bef304c4eb9c9f7cae137d2b89428df986e35f0be4c685f332d2babe795162e1fad86022c2404bf48ada05bca288f4033cbf94a9f6251d1ecff344214f14027b70e791fa48b91a550ef384fe504a39954a7a9ee7799e28240a799deafb68ebc68563244747c9eda2eb019235e942dfa7033caa787a4ed5544dd5f875481a52bace645ca4dae916bdd1260e739fa763bcfbd18693f24879f29ca12f44bf63bce3549ee7f3bae9fa87154880e8b7ec089edcb223c8c84dc305c895cce51a8225f549addc56a9ca102ea026f703acfd886ac04cc7a8909d08dd61d8ff320e2c2f96788adb50d65a231801cb3c96b44f870f3948189e8628326e289b39c02e71a8343346c0f34717b277f7c864cb2a9db1d68513e48363ddcd4925dc8ecf66403e7c39eebac8d1ef997a2c65d098c8fe3660301a02e6414e71e68633d213f00d22f0f6f5ce994bed7dcc7d1e07e27ef96e290658fb113711bc7d7df7388e03af782b076e14dc3c0b1ef1aa17d6d499cc11a390019118b7508016af00fa8586a9dc73e1488db8ad97dbba8eb66e705efd324a814d776f4153b61e2a55a7aa74f3ba0d54f53cd994463ae5023eb64f43099b11aa3f9da252b5fbf8f4e0b82ca24401e2017a62330675f965607f4a29a5657cc77ca42d70bbf8e9900790511d4115c3a34ac644a552d5289811034ac22b093029add96c369bcd6674677ab7d6ad53740c32302d9181775c74a73e45e0f167fd3345653787060681c567028f5406f68b7f2a9427ff01b490ddfbc58be0ce34f6057e18a51427cba7f27594fc3f27860aa5744ef9b714c393524aa96f57149ba94d140353080377398530b069cbdf178a62453085b9f8ea18f93968d17f8aec3f6a3cd508a7cfedb8d830dc14cd5541a7e8903062f4a888227b05e5733b0e438368919ba24362f4a8a09dd4b6a822cf0e89f9ea171fa447c5f78b166a3ca258147215c5b4f9d3866aaf12e37e3a7a4367406edfbe46e025e4e3d8e40de413b289521179c4e90c3cf60c880df26912291f439ee07be90f904e8e2f83ad7d1f6894bcc0252ff0758ee3b696bc7d0d6832b27d2033f54e41fbd2befd74d80d3cc2bd0f87b95c28ebd7ed86352e72712282e7cb68d53e1683ce6a6c80f48bffd6047f1e3be62ac03223326254bb3e7241f703f464892c6644e24cc90da49dec8041852279ad79e839dc5b0684cbd9d3f9c060b19f284b7c767a80645476f7bd18fffc883e76a48f99ba17e352e95f147157120377220a976aba07615c2165552384654707abef85502db85825915f7ae23054746a06d63101c8f38bb905cf15d99fb660238be5b17fda63182591ecb6db7edd5aed11eb20575fe81c00226fdc73ff8117c4f3c47d0772df516fc2f084e152090aec59c2eaa67d0d35dca89c4026915944a768187df24f92040a28f2d83f63ff30917d90799cb0fee917a74e3625f0d499392e8a50664ece409ffc7d7cc0b28c090c06f3d97c04c341501fffd7be057c37dc66c1db2ffe7fe757051e5bc68007ccdc9043107ea6eeed189f2feb712293cd509fab056d2a522abae0ee14c7690025d54a13b83d17af67ee097814a9562b115af69f73a68608a15a79cfbaab9519c62d8babf67e14e5269d80478f0ef4e8a161e87fdc6b5a8b1bb2f2da53c00c8e0727c563f158429c058f78df59fb3b7a78f49829d36b3919354f1af726d023514ae9879aa9518552f198010ffecad7846190243b6a3cf8414c1f3e7e202a0e4d9735532ba1e9d6f8bac2caca8a8a8a2bcb4fc768641afd0a614d8d1fbd0547cfc9d5bef6e1d7004d3a681f6a1f86f3c137ed980ffe7c3034dd77f9212afc101b3fa4c697447348a9860d155c4c37704cd6b4a9ef3a2b5f47aff2d10c49e15b589ea4b232e2629d41f3545f05d46cb4560ba8bde62cd75f61e5fa2cae5c3f85d1fc99a72a7342f99a3fdacf5f696dbe82182b2d8ee3e64f90e6d28c44d15a401a4bc399712d7f7ea464b1582c16ebc663b1244bb274e8de85b303284173e3b8ee054d32f5ac45a9e41155ea8248095eb0aa11b202153e2bef856860b456dfa3d0e8948f799a411d434b43602d881c24c5068ff327f6235f1e83c7d04929bfbebef9e3a2bf4b0b77ee7972805cdd7992e136ca7635799c98417336531ff795bb5f830ddbc5bafda552ba5cfce6cffc911aa5ef8173bea808ee420e49924ed5227e24eb47b27e244bb2e65689f48bff090798a3f9a1e69ac31113113f85f367eee820573ea4e4c08fde40c3d4ffb1d3e04ad7d699993a42b2fac57ffecc1c869be230dbcfcf4fd7adb45aa02033c3430d0e34f844e17162657a7a7a7a7a7a7a7a7ab4c0328fd75a6bad160299732be00ba76146260c3c7e116ac4e91763a054b487a7492c26b39d8106cfeb95c3e30489cc48ac89ceceeb8531c618ef88ee3e3220531507b262e1041d2461a6879d99a712ae33345e9c800b18ac84b81258acb897dda05ffc65586132ec4dbda937759b52c986db30e9855fdeebbab0409b137ed9fa7abdbe3028fda7de9c937677cdf10176ea7283e2f2a7e898a654f4c9ff8a2df0173416fb5aab1384d003d94c67f664f652c2b5a95dab0c7d8bf04865851422ada8fc8f4a252c6a771b4566461a61844dceea14857bf14c9c55a704afcd5319ad6051a8b6564a2ab535aa2d516d856aab7a9ee7dd5bb98feb7ae5b100579d79825558f6af3a4f7a82fd455b60961ae0fb2d3081efdb6f019eab1330fdb1b67ce87ed1fe871e6caedf81996b38d6efc1762ec01e9859fbb05df4c21187f52634692117561c17bd9341a144d1e6b17d424ab2d76aa4e2d496c3cc595df5660e8137fae9c81cd883e44c5c0f326fb5555b371d53d32f26e854903ef9e7c871e3060b4b9ecd10c80cf00dc72d6b3ff64cbe9d8536485b81d5b414502184179ba6fd08e6b167f2cb8186be8637d0afffd94043d3e7987dfd10187a2ad61baf2d27f0b350500059d84cf9cb2ae999e34ca9add70154aa9e550ac4da1b17ceb5f1dc058b19a5b476775795ea8b580770cb6437f5a59c5f13204383d770fc5c47941671247b26c0fe77de5b7f7b1a56f0079a2fbd99ca6fc959f0befc81eaa836fca537e0884214a290ef91ef81f0a8aa54a55259dbf9a60429dd4d4b39e895f4232dc1f33b77ff743c10d56ead2fcd27ca143c68f824c186fee0de1bef73010176ed768c6b14c6041e3fd31ce24c717d67e87edbac19b56b95557677cbda3c9871b11262b928b2badf179c80c7d0ad7d5dc109f4884088c70ff0888241f555cae3c68563a510c5aa0843752fe518b2bf8d8e91b4de24f0bbe8271eec353418c69de156514c478d2260ed671c469bf3ce8d7eed50c6c51920acd5d078ca94fa85e2c8c1e3c78eb07e3573f80cf3e9bf8872987e6ad2fe9a344a7f7b028b22102e758c690132d77e4a9ff05458adb0d84f94253e3b3d40b20a8389a2288aa228ce548ffb0f96ba994769e3ee5e053b6b579c295fa150a2289e8a804709d3644cca602528601cb90bbbf742930edf77df77a61d212fd5519ef822090f6070054fd0e904b8fb20dc7bd793e07f0f20d2061684a39aa4cebdf722e0de7b20b29432f0a48484d54829484021a2b5124280339270df9f0ed90547df64837cfbf281c8f5d3e1830d4df7db24bfb37d2032a90778c4365ccc028fa51cefa29398e0f1337dedbb01671a1ee15eba4ab93f1156994898571ed10d46afd9cc6d3c4789bfa6b8cb9138cb6fe86cd6d3c3e386c74cfdf7f43881b7fcd6aae4f17fd63107c83e65e6e28c87bf0f1f723061198ef22567ceb23173aa8a40a7a414d4e904822e2ea3d1cc91b8e8d223c063c622e230da6c36ab75f4ea7040c608827cba5b6bedba53245487bea811298028f0bd3796052005a671511b618147fad274b4c8fe74a7631a63796593a08bac8556606dde7b9d50e3556be5669d4d97d329e98674afeccf4de95c1d928ed5dd64ffdaddddad421a587af7b7a7aeec54094fd6cdb30a69602a57d5037d95c215df81a61d0fc48a93d229dae2665d8eb84476da2ad21d31764364ef82c8fe14059de2ae12f848e96d909d837131cef301be216dfdc032e7eae65cadc9b9688b73b564ea7e13d95f94d331f5dbe756afebc08ed5d9844088cdea865d6b9eba225dabcb5122774ba41006e6f2d8b964485b2d32b899fcf17e36a2c0da8f9c2b3b15b4d53e35dc6267e0919b6196c354cacdb81937b3b6c62be4d34ceebd7dfbdeab69da275f966aa9869517e0b1f44ef0b5a56d73e1bc8ce8d4189d01a1d7529626987ba741cd39afbd5e89cc66019efda8344df8053decd0080000000153150000200c080583018168442c57e5241f14000d6d8a4676503817c8a3490ec4280842c618830c010401000c9001a2c2b014aa92260c6fb0a3f46e32b7fdb5d5c2ef3cb7928effe3d28d08e0070877cdfd394f2e05e8a2948d9bf96a2c2232d2912957a8aad31a8c88fcdf3312382cfc34e1781716d284e84c852895a1d650e28e660a92e9a252c3063a9b8a009c5d79c5606a237ca84c2802481f6c8924162af5e14b82114d0c9ad6091128a9681584d659aa5fef7c1d51fa2bf01c74b93359a0a951f497fbabf10f08795fd464c05ccd8efd342e827fb2cf4b3a535d4b5f5c8c1a01ef07f131c38b3c21d030a635cfa9bf20d823c63d282aeaf7e894cf1adaa94ba46fac53438c6b2c4dcc5177f2e89887dab0342313d3e0bc939f74943bc925d23afe5e79e9a517f35e3c4a9a49de71b522eaf8a5634095f740e147e1bcb21877f0180a37467e668f3da129980b4f6e844bbe6c1c6bb3be089406822c6e12c54f5e158fbfa0642e8516de6d848b567c0c655a8964eca19b2a6141478006599f17023a663365ca222ef09da76203f477107cc3c13a14cfe2f8f9b3204b343e101c8e1dc2b02c97d95a52a3d9126b7b6cea6ee630243d011f7e12dae4914b857ee1f89484c166b483610ce045d0a24cf7a139216303cf0ef2b034cdbc19fd0c817d4708fa06738093570413a27f8d5828158653a4d35e1e26bf9a8153cf90b5985e976c579d09a35728044e3868c70d12609d334fa134cf6fc6ca89ab01697397e18fc1592013b0d15ee3ce8db61ee17671c236100898f96d57631029a4e59e320120f089d503e68957470d69728cd4b91c832f34101598875fd36ebd2564cc1ab919a33fd9da03be6eee82be75529d91deb7a69ebf6838e736c3d5f3811468c57a4c815a4184c0f098d0fede963dcf89c71d6f5fefe2c9bf7733c74f5b40ae527dab0daf46f5a45c28983ca41fea7bed10d19159d061ccb97e160094643865b239b3a9c488dbbb482c45e2d2c248f43a624d570763075ce4f8c62ca4425a8807c6b91a7e5b26d7364389544ea1df5332df3243d661eac255302fccaca6ec5207a69abdce88e72308f309883bf930a4b41ee6e188259c1eeca9805ceeb3c064b3ae547b42f2fd353e4b7e2551b68e67bc03d8c18a9bfe22dd5e71852c66a38ca7f71d2fb39dd69ede947dfa821752460ac7fc92f29cb563b0246585591d2a0a7f807507680d0828dbca2e51843f0160871ef9eb5e26db1ca2a9cee8a124074c904370a69fad2dbfb580e9a75bc126495b00a2f95ac5669b18f1e47a5a83bde1e7e92fa592c1a010fd1550ba850bb899d79e6ea7271030eea3bef53403288662ac428de833f1c28c358fd61cdc29f25cc1beff55a082dbbf38fc7eeda1741799302cad803109f600d0b6236100f062079aa0cce61de73348886f47ebf94dc17a9ff903d6acb0fda006134f8898b8ef523b01e03778e91d2203f9043bf956a9a9812a10cb44d89900454854beb1333b0ecd7f72d32d06559aa914d117a0369c2621bfb1c1e48194ae8c02f8d26e78ccfa73faac5d3e9b0eeec09127afa9002cf5e90ae0fe47455633fddec7d303d1d2d4b79b73737b27c51cb751a06662c4a8e5049bc69c48e56a030e8b08948acc2d622c2cf44cfbc4524e2c1ad9bad6539f269fb95ac09432893c1294b4e7bb3ee357306cbbda1426350fb78f9d9f607a839371fa8917fe0746051c90b87ad46a68fc9d63d6c05efe541ea25e5982e04f49244c6ec0f9c27c66f0d2d55c3642768ed024a8085fe4f7ba39da50cc68bbc5682fc08306660e0d8cf0668c9db85417cb6256270d083a5fc64464bb57f4aa8b13ceb0407bac51f008c5e38a77dfa7da3bceb81dd678a8944ccb9e932173fc2d6456bf8cc2154d5c84192cbe2aa21285596baadf6b18a59d7c665a180f2e9fb3070a38a90482c547789017c3f72b26c08cc1cfd9febd6ebd8b2d0ed23b49376b98696a7b134435d57bc23328c553329b913e617315dfdf7aee15a2b0fc780ba9ea45b0af8ecda79762fef77737b159c048fd6e3ee8d296574d62b8b4c1ad28a4a03c397e0f1b2263336b41371b543d79d44e9c23ecda659e06742568db9e265b3d51bed50657caa7a68f56e32d27c33b1cc3554acf3f7b4607e56e291fc30d83c1f181d1b4b40fa9e2132e35dc18081bf66087dfefcff852cd73e51a811c1467e9c58ac6089ac656c45fa6e2906cbe2bbddbf9dce69d1e6ed80cae4ea670f3c34acd8685c365f80b2ed7fe3d82ce91bcc91edb8de197a1541d10110571bff5267c6c8669b5d49986a37060606b2325267099637f84c23dd8188052e037ba4700d85bcc717f0dcce5fc75ffd55e9b475645f05970434548bb08f2fe5660620481b27ab91baeb3e4ce84cc8e60349ce60d0f6d826d17c267042a05bd8a1640bedd0fa642f2e5a2121369f7f9a302c11947c8ed68dc00e413f9af94d7c801daf3f1d4f9bcd961f09ed405089a78276050ac22232526d914f75d10f37b14dcfcd76c7f1ebbda7f4328a1b34ebf914ea285aea2b2dfcbf76dd6ca6a7951aabdeaac889cbc353893a861ec24309558e9a4c77941378c219c38a3d592ddca464d97edf9db34b36289431904218fda2ffe3382ecc27c84e4fc5f18a1ee94fa64e6f389df56c331722af7526067589ee853fe569d172318328099331a910001b29de45b75861b4f0f670db529e314b582b15ee63d1ebecbd317c2d88164aa6f7240ae7b80ac56e981347d998980407685689abe988f638ed42adb0e0a94192d52b6aad894bdae1cec7f34b9b79853cb5d17c0317f689a1414aed99f84579979c68fcfada52e4e04498d0959950f6168db1273941001ce55f72c09b106b32900be3a9abbd04b99d2f9b3f071acb3816cc2ed696d1e5181b57382d32dbdf1738db9162aad542d94ec314909181a12f60c599070d39b28098c8ac4f0254813ff25c6e758396875a4703555bd813151abbc40490d68bc301d42ede051f6692c7f27795c6db71b2c9bc68cce57a7ef9696ba7da79c7a03cbf633ddb12564c19fec9edc549b672bb31abbc236f3cb582b9a26ac5249e7f3bce60b841ee311518dde1cee8fea1039efb95eb82274fa2b260db17ff0a707070747c5f4ee482bac63a81768067f31e8e8be39cecde5d22d64d54e7da2c380158f6c6bc63c81cc4d033ed41464c656d99a58c9bea14fea27b9e6d0baaeafe2625a8b1c78ad9987599637b525bd1f7306c9edec15348386364545c33e3a6208c2fbd777dcab0213d879bbf53ae50d90a9045dc70c5bcc034cad57809398c3816d4ecff01e4fd10ddf3a70bf17ba4d6b881278b456e71068dc697c315092845bb5a299a134ada504bc7f9aba09fc1107828e9720d1c6d3ada61763417ba04ae83c26000462b58a2f1c192102540648afb70c2852ba1646b5b526cdf5666997961814dfe9df68b40e974287f64f14c35cfcab16b6759da241746e4f4de15892759bb1dedcb8e54cc0f562116e79938f68cffcbf3ece153b9116f2eee42e0db3dbcbc9411db955cb30e8fd143217726a505334d4d2b78326d300b3ad216d5e77283a870ce3e1dc1b8a290564bccb5e87367e0ed882e9198e18d320b0ac10c504289f3f640abba9d25906d23caec1b9b69ddcb060f2514997079020c4c41be1aeadcc38c0aba5170b5d794a0b25664c2c1028a2719ad420b2311c3a75218aac2817496202df099ee05dd72144c5310b50d0d0814d901b2fcec1d020cb8c0f7adbb151658fb26219ac760ebdb6a6c3631af688663157574491802ceebaf4313b27aad06d51d31fffa9518ff06b005c1929ea993be72bef8138c57b1b31adddf4ea5ca24bad4b56d70943117d664956711f2a642bda9ad8c89c8cabaf52e2246b6f8889c30b04e70add7b6f66d5dc94dbcc77ee77204aae6a02d122472e0b964c4ca775595b447636087adbb96a4df7353f1b772a939b1d2c93ed0439e787bd5879a1781c58adc22982402b9df4b5293467a03af6274a4c6101373ab1a24e2ab2ad79e93af3db5dfeffe38f896261546107116392f1a7aebb14c63b51a59a8960aa458246699eb08dfa34d904b8247ff9f58dcb9ada26cd35149add888affcc15d8d066d7313ef195b34162e32ac4c0dff27c13f86e36147c312523f4ec1aa9cc38d2562940e568908cc020b8d3f2f274652abebc1040f767d2832f7701f111495e76a18220d62bf04c08b91752826563529ecda311758264b32a93976b902242d1de590e5f02e2bb4a30ed55e180aa51e23a7f40e1841fe388eb09142368850ccc127df7b20a23dc21318750a4c3e127c8f0e3a0ad9e0fb7c3b569c2f6232886e8354af9c7e2e55a6b26849d47c0bd7f481ecfcbd230c186ebb39ff1e77c443ef05c295490a155386329b04ae60c763e2f0641922657d07672719563621dce877bc512582a3cff94165395a62a89fc0bac47bad848051af9840d86072df08de7848dca306245f7d11bf4525a581d6c2ee16509d0d660c2d0b6ef22bf7b5ba0142922036a112b901d6a78e27ad15434015b2cabdc596cf82ecd91adcc5cdc56c4df325ac95331b418c987520ea2632be35016764f5d484382f53f6e265709ba11322f423f7a606843e3098db20d564f7a9bbcad6560e4f18a8bb39c27dcd870e576ff44cf898413223ae98518fabacc2d89ac7ad48960a9856129f0c7a9d3c439ddc7ad2c551239f27989bccf92ef092871abe904f5eab7b51c6c2ae50134e6cf384a5d40eca168a22b4ab6541d585678a4f6e415c4c089e26c15965f8e7830354b6139d634ec55aabbdbdb10f859e55cc7fc316407c7b20c237eb4fe4b02ef9b399ff96eee026927a0dc34199119174cd0e49a0e179ff07d944b650432e4708c73bcff9a6c8d915d7dbd34beb1fb0476d34781a8f352c4c231513350c920c9586e3a4b4bcc55777f336cfe6448fd1b77e6985f5274b299747eb2b0f20abbef221de42d9f3983a0b708848e8f371bb7a2c8511a27c68d3fd8411cb2d92afaa2e6f51827b08df6b8a236e9d2fe7fcede03530adcc0f37e720cc119414cccc9b289c4c5c12eed6192daae8021760e3332981e31839a9714d021c5348c370d836bb722ae3c62df41f0e8f87fbfe5f90a594f15009baf32eec5b0d50d9ef2f945a1c99f2f93978787c2a1a357fb317598480318e54bf14019f4e673247387234e8900705c3132679604e782e5ef183b9e3ce9a5f896168745ec2b1c3ccb887feef67d5e0aa72e07461f9476bff006b0575117d2a89da0654bd766eb8bcea7232c20d4f83fc6e38dde5775d3ad31fbe0a023e1f088437a4cdf1ac5285c4210e13873e059d96dc9a1baeb9f3403b042b01e86da60b8ef26437f02a05e3e37e8ad51d4f788ce58e3fcb0f9abe3894b1f56ee08e04ec6216881a13bd8e4860a7737d6a24181be215cb3cf84e9bc55d133aaddd8c150b9a5ad2b2323378a5f0d024a12ded8ba03802d58aa9a867a13798ec288a3cacf304444239a410b10bc12ea91d6bbbbbc91ee68b1ee3ebb3b39dec0a9ce76ae9617a9c0899366664a8b544e86e18b6cc3461ace7eade0875325416ca31a5e41a02c231129fe1dffce65437d876f47bf4988b3569e4d6412d5dbfa4f50bc89bfc250a2aec51a7aaf1c17815bfb2886fc876f5c143e4705ca9f4283301432f8701acfb251c07769c1a8fb052b7ab3ae5eaba4d2e9add15105fb705d3cfc09afc22eb95ac9381860fb6d43da53569b39fb23032fac01408c03d02cffd90638d94e80acf71c4c376d39343f41881dab790dcad9c0018479a42066c74f76808b359991f23f4ba6e48edbbb1d20efbb0a222468f483225ef8375ad5c48bef2856d377820a9c40e89b3a2eb307d08369993b0c3dfb7bb313c73e8f154782254e871e194a942884e6e2d469f5d4c064c29b3822cd2680fa10a2c1beb208915bbb4cc6ebed22ccf67f22798a391791604f02859a6ca368251781246b708bd40a355da6d9e1d7c639ea5c675d634220a2fcddbeaf4aefcb3097dc2c8b4ca8d54dd0e07bc14c368c2aeb9f1194f8734773e567161eb8e43aab90e835ead131a6e5cd4ad2e3dc5c332e767e811998c991025f57022d4067baf5beeee556205eef41ab548cedd642bc8fda003a9ee0de638c968050632e4f7b76278035f09a02f82533741f92bb1b752ea91a7058e74150efe37305b2801255be667dc405a97e37c17e1ca42bd0872e70563ea23767963bbba085ec50bc9a960947dec1111c22f494486aec0958728dfbe2aee9dff85083849280731dc95b882a995e48296420e421141978bba8d4a2c6624bed78946a555a88364892692f8a3b1982312837f6ae10c4fa491bf87e2715106410a30e87e74295c58b2625487c41480aad90052dbf3e920165c819480bdb39c8c07df76b81304b48fb512b837c58bc31d2f305dce1230ce4d4083dff77a5e83b5930a571f50a9bedb75f663b08608e911877798e62e72d2c02fe2c367b3032d3d0ad1606cc536f4e7d6c4d855fd2aaa706837f8b5cb68e4c603de4a02f35f8b3c6f61b7ad7e89a40d778dfb1ab072e077e9d2d6db0656ed9f8f18f8449ecb081124efb4640357b02156d38f2fc5ec6bab8653fb18955f9b0b6721406a40b422ec9ea2712682a5fdd5709fb24f5bcf214607d721f7703e5ba5b664b32bbaea590f8b86e29a19c5ec315a963e6e5c3209758c7a279138230b4978f3ac4d95e7b5387a182fc40041602396862af6373d6759ca628945a21b665245ad4e463bc719690bc82e7e83c9a3ae7a856549f2ac9d2e0ed5d6c944380f596f2ad914fd2ac1ab5738c968e20930b8356d5b88c8cef0641f6d2b0bd0282363085037698ac3fced0668bf845676e51aeaec2704181bcb45f056a80c6790220d63f49d470c7a8559f018fda33d1968d65ade2e1f72f6bb0504cf24814b19649608462dad72960b610e740fb6508a46ee471a86162366a5597440dd5f2ba86d07035c54ccaf36cd5a828222b20e536123eb20be25f44d1660318e93aa229eee80b58f4ff5f657092a02fb538015bffcaed74c4e99a4414894aef17648cf587f9d20af7e240a5173e208556ec4d391218c10f574fb72a4872aef3e975ce55d4a09f04218c5b16d23e5a629bbab19c5c6e821a6d704562f0f87513a5fed56e0175f3d18bcc0a736c268978736dbffd1167839620f9adda03f8719ee24f151f267b5d83d9a8a35778e28fc17c0f373d6ed7f2134ab5783e2bd09181287660ccc5cc671df0df0cb29ba1c8afba4ad32a2eb4ffb8b5d608d3115e65d008d87dd89ca0f501b8ab9211115dbd42c4395b73fc97bed177b7d9475eab4757bb98629b5a11c2965a45b5c9c221461fca3fe7c5fc0844b474c5ef411a95c2c3d5ea1d44d801284b9d50384f3b76f529ac1732931907ded1c5399b90b3b9bbaa2c670735290d28a1ce1fc6771b8bea3d31984620d5b9ce40a203e6406f9b2b2c5098cf88bbe35940383151b0a01f06ec79d02f0592d09119b7a4231468b3c5eaff68274d1f4263a342f2b4dc3169de0a4763389654c65c366c7584beab9d8d394780d814357223c1afed253948b0c584474773d678eb0032fcd9eab1521069b799f9ba75a9f1b4764fcee8bd5c2bfdcf90778146c81409e12615e3d7c2a33e54839b12616526e1edc308d6b71e2c708535e6529841173223c968f4f5e3cec9942536034bc9b42f76e3891d5b01da36aaabc287b35fc063b74473d19fcb8a40da34ae26520580a2c6676fcaf8d8c5f95a25917dea6e46dfb140e6a371238efa0df45cdbe20fbaf1d5f65e393ce6ebfcdee3273c47b6c1838f07cdbbb270e6e74a4bdbace398d3750f1d59e10cdfedc07d9ef68e25a6ad6bfa908fdc76e075b06e03e33c34ba25c7941161aada92db9bb73cb5e2e2f8b3c7edb14a5cab74d05f4c8b19726a20e5156667acd34cbbe40178f8f261431761845d5bb32b4c159c56f7067506b5d1ae698230c53f5179e3ddd8199a1d366e621a8760ef4e242c1a049cd7f6c883bef4294c95884777caeb38aacb3646dc74bc6d5833062be2280a7d733587366da3319083532e978ac0ab5e9fe393862fd598f29a44f347e1000a6449ff1c6d28c617d7f13d0627eb6a888bf0eee02e4218d2b7a2e67ade3eca1fa0d48f1d73b61bba90eb54bf95ce8191990fd75d06b0cde7b08742dab719644d8b7eddf32c4877a3ff82858790fa29363c314423c5137194cd793066be4c2fd7a708f0ab1a9cb12c620804f2914c175445069fb779d10b6e504813f762856f0973d4ba3c7ad20841b50a6676178b898123776cac9c61db4082e03d738599c7bc2ff85947a28f757c8f4d3de024e19753e7e3333130cc33fe3fd2e9faf7401cce220ee530d42d0ac3e2a8e6f253f94e2c366d609ae6d805a49c9f956c1f3352c9ccd47a5723fd270733d282a2af1e2820185df9a0ea0a8880acf90c8b4c1c5d45c9c492c54c400b5f21238c48064d02ea22c8f1b18d0b82643684b17ef1229d671fc54c1227fbdfb0945ea8def6f514732b9141d8437db6125139a2636767ff1a84a145454d92c4025373f2cd3ed6bab8f9f003a74986c29aff4b9e964e90dc9120f2c9841b148a7ead25d113303e448c8938fd7750965a91ddf0306b92c6b92e46b81c35ece9dfd859624e4dd91fa25b79b9ff002e3c8a2be7db2c3e458efd4c8b989ae1b05bb0401f8eee3e5b1832635b78ad87ac8ac72d84ed66e312a7676c5b2471ef1fb8fe987ad0a770cfdf7abf0a54b6c34860f16599f8e18277379f39b8541676e839966b41ab6c942f74c3e3412adec9d08984162d59c813756ef7b4304e7ba0d93627b47596ab4c13dedf952b483fd281ee11d0f7f86e8aecc260e7fc75d9fffbc1216c14e13a04f175a674662decf532466b13bd5e181a3d4e3dd24b8d039c85cf6f04a039d881417bb6bb8796baaf2afaf87d551ddb656865d435501997509549fa243f6dab41a3c3d24553b96522c832439a0b778d0b66fa0fc435646246b3488b0e9961ce2e731d191cea6bcebb4eadb1126b7fe2b1470ecbb4003369b9b2062e3f881707cbfba2d9d5021cb49214a32b45b154aab308283273dbc51f2337db627ec042075aef3a9deb6b61066c9bb89f8b1bd08afdb61ade52cb87e3b2d07e7a39bc5b9e5380bb69853bdd9458138acf3af36bf6882da3b4e81b32cca97eb9b5ca0490d0df104e9f9f3d52cc3d8f0924824ec5c98807bfcc6169e5eb6ec9ebf61dc512e8a4d358e0c4fd212d02ed025a6cd5b3a088c25ce6a0b1674fa48a3072886a23527d187d014b699b2d3402156a7ec15530f51ec5546902f4be6109b4138068568f52dcd7e7070188c56ec2666207fea8c54d0dd742f22151b59a459d2ab02609898bc5529f46411f0d8c86431d616737f995d2de863d9968855ea1935a9ddf178a165cfa037fc117b11f0418b8cb9fdf7f339be1b67546df21de9778620cc9ee14b10b6ce0595a8e358983d9be3bbc4a0996251c36440a69d090ce4f44803e0f8306ee8585d5d8022785c542f84cc8f126a7ef1ee810779e2993d638079c8bbc7755a71c11412edf37f7e23b38f85b2d37c561a41ef60eae49f19b2eaade683c059a9431f44e0f66741161bde4db951b424e6a11c4cd178d43cbf60ac8179925ec366d3816033b0b615223806c07d81c9688c7dd9d5288765824b5a54d06bce73326c44cca6e42a6a573c4c8615009054d057838fcaf9da44d83dcdd618038e66282460f5b5ae5427a812a7cc9a8aa02e30857cbcbc8805f9346846c1cb9a3b02143a186e14e430656a953f1c3dc2278e7f69c58ef9782ddb0d48f17d3193f108755e0311c29e0afd810a8096efb9a31d2adc008e020474e740ae2808e2defcc872d51bb94ec3f6a8bc23bc4c05066f3f2b4965009049186732a063ecfb89c0845788edfc7f4bd40f1c3249d7fb6714e15480b4bb898ffa05539cea453515638a3c1a3b65bb62ffcc39238022c7ba158f1435bb317069a389d56cdd153ddd4e2292c0704c5109e5fc62751139a8bce5dfca23386ddeb81c40fcaa715c985aa8170f28d11a9e10c575fd64edb55c11311734a374a120dd431ffe226a94731dac4553128635ffc077959c0c8064e0d34ae1134bb496f0044a9f4aad88490413274af1e7fc027407b911d58b1583d7b6fa497e19f041d8c0973f122c513fa46e4c792c5f703151d409736a8c6c47e53c7f2afbd9acd8858e611f05546945b04d0c7d4893eb4de30197227236357571a4bf62ff7774405c5fa5093dc4e078908560b12d14963b54e4a56bec89a9dc4b25f546ab2f48491429adc490eaea1f29ef2729f55f83f51199d2cf18ae8786d4e60d5049186e288bee720d8e82d18f527d7e4801917e69e614823ced046ba418ad14e3ce735307c1d42a6307c6232b754776925b1839c03d451cb5f44017caaa7a8c926bc71812858f4ab9076a43d450c9b48dcaf4d714c8dc06faca43e56e3a37f539194545818d3d0ca62665b8089ee51a40e86e45ff578989ed533887981bfe1e56e58f0bddff051db94441d405d04a01f9a82f512ca1a898e46ab4672b554f777e879b083c8377a92b4f803b49873770810d66199cf39e4ecde18b43e5cc80934ad677c227a2ae34a9ea6a8dd81fc4e4e8949ab5072614ea22253485b1047b4158a2408b82003feddc80de31f44609da7e0d9ed1d2d2352b59977d4002c1938ec43781b50f0163d4b21b052b01154ab4edeb42485375543b368bf5c9cdb70e31d72a3d752008a88edefdd256787393bdcab20398e94437ad4e93610502ee89855aad2dddeaaaa33fb08df79a45897091b357c964fa270aa5dff72ff40d9d6f22a93c11d7e0b651219fa6002ad9877880e4984a032c2b7f2d87f4b15fadb086b4828a151198249df02d9cdf0376e53615b7a5514c32fe636c3a1a89ad8a68b1e6d23c631a28bcad1d89c0c99b26fe163962bd156bb602957520758210d8fcbd3ef7459eb98ffc38e499ad5c91af35157df31f8e109243258d6bb39873f7da2c661946bc96fa203926aa529d4a9be3d6627d23d4a15f072ebccecee04bccd9bebead07137916a2a8b441ef98865c1e8b1d3629e9e0d3e57830b9b3d3c6239e9187cb1b7b3581ae0f77ca2e6d0e6c54c09374d7e5a4e29d1dd9ea0540a825f4da2daeaf88465dbfb40b50e4d10c30362577b73e9dd1b15f5abcbbdc0c1cf50301a9c6914a8dfe4651f3434db3f3d588c7a2d9fef58f36632ec8a37a17ce77fc24125b33252f3a16c2dfa7b425075bff4e669f140b12880a5ff7ea14acdacd74322cb66d26ca20a7c383a2a3e3c330e9054b6191ad618fb6bbdfcd27041b8b468458b907cd63fd110c50f86e421cba88520a35052067f151c157ecaeb1824fa75758c7690ee039ba2c51836d3e3a40a868bb642e27eb152ee8a37c6aca27d2fac13fb20398a888946ac4532f1a6fa77a157fd5853e8df361157aedf3be635d56c852565c1233125b7262058a1097361a7cbc2198981e8e53f475c21c7f198293e0ed0271f59b46022f885c155ecacf38fde32c74bc0cf431c2263e5912137dbeeea4800eb1351b35e71ff5ca6c007b223bd68660791e475a6ad995f68d2098578f6ceb0996cd979b16086bf2da6c5cebb1bf52236c58b1b3b14cde905bf3b5ad3396f8320ac14aa2133571830d9f9b19e46c24db57f5af773cbf5e6e45e490adbb40ac5c0241f4b231301c95dda965719a3520bea725f26f407eb58155ad4cee9314a82ef171d87015f967706cfe2cb36b39c1a4707049df9d2fe3cb8adab080cea884c4ae8d49e249296f3b02d5f19b352d0642054b53320720634e4d6fa9fc01b1749edfd8bbaa4b629ea520b277edb609f5ba1c0647e78ce936f17160be0d19ce72624ad050535247b9d166d750ae07f60a6bdfdc301027a230c2436109f397042804eaaf8651ac76b693390fafe78f207fa90b0a34554432b17912dbbadb015d7e0cb7b027f6713a396a63315299d5ad679193874ae592d58fadf57348c4bc1658fde092e2469919b058eff18105403e2a6b4123b20f6303b988a893f6492d1e79637bd0f03890150c6709af052a0ec57de264870fa739c9ae560f614364200ebcbd1b46032bf036261b29eee2fce97b633af89b24d80c04c672da60ecf3a4279999c0fbd7fee0202ddd59b9173dd9712ac5351d799b3012a16e2be211a3f02aa22f80d0d37f992e569dd20f626df0e0141ea111f2ad90116b8dfcad7dccc417de0d2b959867b7479794bb3cad571c9e86c91157090108a6df91cbcde3fd7bee0850cc43c45f80bf01755d10f597f0a275a3e3f3f24de9fe9cf1dfd7c458147a5890f17ca4e066819f20f59ce001453ef7014d41866848fa51b3676373d1318579510880a91a1bb6055ab64e0cc7d8824f6fa0f074cbfbedc7a624d06ccb64631ff6e4e8d218f9a61ada2b2ec340955f48a50882d6cedf2cea869acd90da82a7e06db8072e65ade6e003c28e76dba16ba24d1bc083a0997ada330dda4bced3f1a61e7ae12b38b46e0a64f68b3220383fb013bf5c935138012155c9cecb65f23a49064a601cb35887e3888a5c9d09263b0beb37c60a5bcbafbd92a71a0d084589031a07a7fc819dc5060cc312b8b264ce2f62b52818afecbcb5246ad519aeac3c266c256d8ad882f9a4a23e989b16ab73b945568d60b2e85374e20c73e9acb8b43e18fa611e9a9d464ebbab338579d8b3def2ec6b6aac02a32bb6bba4dc3bd7133f5a8e257315d628500d7324062de55911b4d82302a356b17ed01203293dbb6cb4768bc3ef9bbf59a7ce3e88b0dc79618ed2fae62aca117943505c42da5eff7d2ef3f3173753091d926482503765616d75191c1b2beba90cbae46c93e6c44975083fc457c19e6ed87e60e98fd46baee63b0a16ea2d06fc781903437334023a3735862fdc9b961b0008a2d15ffe1f86815cd518595ff82edc7bb1a214e30ce2c09df4396fdd34e3538a4cf8b296025700cb1fc1b778742ffa32f99c7dfbb08c3c3da4542ea10db9ffdc7451425e416dd90caf5bab5e69973403dc0911ca3d5e1d20a39f3777ae7330b9e08e17cbbce50a54ac7f440277cf60adb9e0c77394ac911f5689db91141ad42b3be00dc1cf6d3bf8cecbfaaf5df18929430a6cc52a252f8286d6b66c08c313af45e1629a1f3046809ab231e6538935f3db8e88f4f9649a1abfdf294d0a9744f379c62d732cfc45e80c32733f843ddf70892613a1bebec1d319b55c3b7d2c607c43b128cea13250e74e98d25a02be7abb0e860ade8e3c59a8a94e68dfceeece6c53a7487d4695e8ceb074c39757abbcb4c4be65a589ea44554005114dd5cf1f802ab9f66a65960a2ccf2e394a9f3cf4416cadb350b5457b3269cdad939f76deba92ea03fa82dfed7a94312bbf0f589460f72511ec4cd355a0dbd9c3c5becaa34370f3448d56ebb8348ff380454c5d7a26cf30ace53b7ec6c78e9c5f816efc951adf2cec77641637b7d2d9a2f64d451b30961f69f0060ca0f74f15753f1e23c4687db22bac7cc6c63c52415b637d7174a596843f19e27d248f6470c0ff38e0a0312b0748f51292a83a950d0eabe690d904b10b3108be12dd28f0ce56b63b25624ac73aeaf3660a377b2315d0885115a3116a31728ea9f347375f37f196a8b67d7e0604059a1263f7c2c0b3f09d236467627e1d51c77574968b8f553324ecbce91607bb54a503d1eeb12721e3818b54291978dabae196ce071d4e3070bb4f5474f68c46e638f8629852d0221f034da7cf3cceef153293a1aa38581030173f167d29f560af1b87de5c682f29296921e9ed208e47a80e71a75a00abe6510a6020a604040e7a15966ecddc81847b803522f033eae1c28e13ec1df1c8d130e68ca521044ec1f08d02a80ac39b8f6788ad03fe3877dfe9c2098d1f59961376ed706c47e40787884e561bdd2f7f6ab1b6926841008a0b5d5f78c98c8f4144674c7408d0e842d0d0b30541e164501c396f714f9e746f8aacb217b0281ced885691ed630a0c826261ea9c3b1bf37339fe831a3b399ee75a7231e59173f5f67ffedb5154ffb62fefe0d53224004f072fac656f85745a0b010ee4dbc907de8f31bdf001d68ca2c3d8784b61389750ef43d01cc7fd1c1171a778147c3e186627101cd01617447f8e2e62f78d6b9d1eca60662e79fb2efce643d9e60293ec8fde9391870a0be5e0e2052a700119411b8d2a366f4cb0d025fc29c16a6776383df4e82dace6557290f350dc04c3063c487a04f8b992628ece18293ff3472aef93eca9bc58731b3e7383c7f48129b0520c84e3cc8e2d3a10dea4658d8990378a9577cbffcb048d6c6e1a398698939cd4080780d5f7a8df366fba1c40c041640fc4d4525207c543c0e5f8c9733fe39dfa09962c1a5577d70ec2b1630b779e45f4b22e49487ddb6d364d590b5410f70da30c0d652c2f871bd0220931cc8236da03a865ce362c4629e94850d3c4a624298d5b912c3b16624ea94b34e5b823a93ba69fce2522a2d7ff457eb3d9445488e0ce1c3515acf715a49941443fdd06be8c1aa35e3c0e6a0d224075f696a816f91097d47557ea356ef0493a7461e9094636cf0f2838e42dc2d27ff8ec5dd8c22e1d1f4af70574f0388db6d1ef68c8be5dd6427b2ff590014fbb88b50d86ecaadf5a558fcc11e75c4931f61ccb86fd069c124f18df6bed8eacfb1830b5332c34b313b05b6642d8916437c87ddc247d015da9d78dabd8157d3944cdf0f26e52aa1151cb9ed1da8902d99de4f2ac371394ccc3622b0c209b8fbef262f6620daf223c6629e1e9cca8b7798c02583ae13c092b0041af45097511cfae709173d0f562a20e5d140290800440fd0054dadb774f385487b34c7aa0ec7e4fcbf9705eb944b692948c1831b01136667a8fcde813869c019f834dc06834e696e80189e30d0ff0f63ec8133363eba4ece7c02bc89083f8cd760128a074eeec90ceb26d3a600ed7d7875d2fcf7dae9cbb3f91eb4a0eed06e68badc19434b7746f59acd0e555ca1394c34e3220dca6648e402bb699d2183176bc5ed2c81241604c062a1e6ff1f8207cce9ce01910843e982cad9afa2422f9890a9f2479a2e83dba55c763921147fc5286926330320e614cca6de3f77a28017e8887f5e122fd906746df94998bdee77cb6a6f4d168f243fa9f3a9a62a6a689fcdb8249e0819b78534dbe559448ba0517bd17445c0b2bcc6043dc45bf96162488dc30376ddbd4e2f8237e16c04450a60bf0ca6099d86efd6b45fd114b3a6d7209d8e67dac4f6e44be0252187576558d8bcbeecb7c7d3e46abd1e620b20fc39a96b66d34594c3861c27d4d29b440e8be7d5bcbb5213d19e0d1dbc4a84313447ede5d3fd619f00c578385b06a09844630513bf697a28826c87a2b8bb25ae7f58160d7b6953112b62bdf471c4438f8594528e9bc605409fc5f9a88a2d1915feab498c225571c51d0665a84002286a41a11e817ab5c000b6f7f14cd801f0e50e97c7e9bf931150d0b894c461c97a142f7dd0f42e77f7559da338537a84bfc632e310994e1f06f4f4e662ab404699035ad10ccbcf672ded5d81d168fb246705bd73e47adea041f359b9d89066d84d085b222b70b8760cd2ccd9024018d3a3db475c709f1c39ad13f44c0734fd5fd726c2681e3c1173d93197f9ae8084bd01575bfdd9e5cab6bae05cab341de4ff1ff65d57da11d54da13f1b5d3dc96a424a4cd03874b9c957475974590c213d5449ca066605f8e6b1bb80c614959723aea30ddaaaec040b54cf7133831240898946cfd908be82d65bda7663d34b720c7dc5e84888d485027c4b10497fdc6621565805b8705e9d230860d629389b33c430d6901b8bd8298dd6797568aafe5bbbdacdb6b8dbb3a88d05a69479c41fea17ac03d0afdb6aa4e99e3d1e3dd5dae997aaa8232ac9c4bea1a115d29b1ac2c0433550bbc8596ba66e0100eefd6d5f2c69a08f0ec9d7629d212bccb98a73c9bc19250a556b7090714431a9aa294e5d17a23b35560a30a6bb272f80bc2a9b68becac23bc3a0ac430ba8e61aa9fb0aba87f116a5b64dc6eb777f1b358346fa68a069f27a1eb4ad7389623f22de3fff7a1d5dc35d445a93675fa51d6f0e33d44b7fa8cd5ceb644f7c60d76dda534c0004474b777deccc8629ea4522ea36023810eedd645502c7f9607b8016534d4d186fcfe6175a1471c780f1387f6ef3b17aa680cbbc2fb9dfe9e03d3337af4268f7ee3f46b649a93e1c63f6c515b852d6b2eec53a356fab90db1df8a9bb49afb3e67d2cca1179caea74fa8d99ddc4c68b4aa83cc76eea9baa391fc3be733207b80ed9b1723b89b3414cda4debed73b6bbc64812878bb23cf272ed9d6de5e7d244d505355702402937ba19330c581c6097be0cf99c26140420268f111e599daba472c8cb0a9f7562c83383665fba9b22269a7d15b97a7eb6c603b290addfdc5ef16047b5f93d8596f2299c1408a0acb359186ea5278e469451cd842ff54f277c468ab8b67173bfe87269735d325b237bb37d740dcb886183ac49fcca578a71aea9233a98a3d8fc28b103223d3424870321f7bc96454ef57c0e0ef8439e3138ccee82686d6971c22b115c3d82118440ed1bc5a86d47bbdc2ce934c2ac9843e092f0f9eb1bec366a5ad4f3860b769ebaee7229ed2de4eebf58468d9b3cb378fcd49199ee5c416a400bd63dcc53a91bb83ca1630f164d1d07b7655814ab16b8015426dd8699e8f90e5764af7795b6a6557c612a03be441a7be411bec863c6b03a3fa8420a3e52079b01f208ad9d9e69abdee49bb39d6ec16ec7300c49ca98a9f083da7b78de4f2e599c6281e606bb619cbdfea41b789c687742724afb766124da14ae7b063ac19a061a4aef3a06fd04e79e74320aa216d795f93e1dd97b92ca10a0f47ce80501a76472b8374b54326f8e6cfc89072087a25c732bca179c2f1dd18b7bef18a41819925ec3bd632add6779b07e6eec4aa70b6cd52128c3ac039c7ceffd0459e5f1aba1d7204ce393867e43af164f983ebd7e263c10d8ef8b6572615007270d6e56e7043a510daed342d1817a4b9ee667d8795c3b416ad54f469dec700f0d4a63af68d0f6d117f72e502358f666c407a5b363b2d0786f0174dd2a55957444c1e1f0523c41b1a901eaaefdaf6f505259ab4ad7b50bd9c364a3293f2fa0e9ccbeddd4e752f42deb07d9047975b585c1677db1d357d8ca56ab8e2d9d364f1fdd813f7fa39a830fe59fe6b1b650e05b26f0274a0d94e28f97d68e328c3a880f9fdf5bcd1a1a4292dbfc444da76e4436fa9c762d24ee9574c6c9648a041970b95dd1085a3e99d5b3e165a3b79962a521cb69f1999cca7d12522de55868a65b8815e3739d0c738a1ed7d47320cf3c03c2e8abf491284a3bf5fd9d4ee38392fe39a850a1f1694e2e820182402bf6a735bc3c4d65c2271e6ad291dea5a1ee2c34a88c1d030103aa4caa52424b5b5760746ca528278931782a2b90f624b81a439c370a00cce12390c7f013ec8b08a53b0153602d2b60b8a297852cca02e9413f5e04cea63fc46e8fb7bc6222f8c3369bc0243c4f5778d71a0dcb4fa039e39817f25688b390c2c909eda90b38885777f042f33085160a5ebd53aab094ebaba42a9c50f77eaecc93b89169f0854a66d5ba6378ef03a627ccbd5a2fd5767581645e5d2dcd463668651123a463d0c29ba0b9e37719bec3f4aeb959b8972ca11cd8d5003c074029b0617164302ca3dc5b75d97cd405e6e831991bd7d6e9d2a980db7e4c34d03962a456a0808ce939544da155338dea171b021c1a0aff2e34792b35396c2f44a200b8b793583f65e14e47656b2fd9f4f4d4661bcd71f8b8110071684fb3b747b6a529b9996ac9fde599c8342f247b4b4fa25c6c578c244cbd8afda691ce423f6aec8380fb9345fdd568ed244478a1439d455fef7a5a3e600f9026e0d372adfe807b6d58568dc9bfab7613081a158017d6aaf7fe61ed235c0ab52e4d12acd4c544643120d90cf8079f5c65dab20662d7977085b7f79e369b29eb65fe350ac9547a3e787985ab864435c477a68130284ea7a7a8a3747b3bbbd308a9aa488a5e28f78b6a631058cd4d3e0639701d3b9f875511d24123b28e33914e7249c970691dc4aa6b69cc8a535a3001a0d3e699be54a4459c6e785af82324f1728a5a8a230ad914b710ed1955ddda51d46e127748ff65e42711d9babb900baf72e9863b52ef17b0786094004959fdb1ae1c047157f793e0c6f28ab530dfd11caceb0b1ab56b84b849259e23e4a337b33f94a8f0ae6fe59530441f3035e36174376a477807daecca1a1fb66e170fb207e68fa73abf508fba5f9c517c7aeecc02c9f04cda2e4cd67e99da8ea9dc0ece26c30df4cb4ef222f98ada444efe5723a35a4360e94bf079afa5e204c6cb8da4168aeb3d867cd223ae67343539ac67ea0017ddeea17c74f239fcbcf621a8c6d691713d2c0fef11372869f585693c8960894b5c683a9076844977432fa301088a54891b803e0e4749174a7c41c9cf36aa33fdc8ce25b869a8b244476150ab3f2f64c563f66b47d792b934a02fa17326d0ac0d6820bf797912803d3c62f151598d4277a35880cf3be69ac9ec76490c4717441492ac12689a7f289c9f303b550acfa6f70240675c5d36ac5007d5566c4adc6d460049d1dfdf4f432b908f7320c6a84294fe3fc594164e090f5fac2a23e59e8bed6d553311ccf80b8525b566e131596b9d7141e26191173fdd8a65647ced196f91fb874a5d39858ec22e677ec6bc28294aa72cfa32a23dad735be0269afa650f78d9c7872d5b9c767d3af1e99de8b00af5460e135d899f41c0203e4f5e25fff4ef011a757bda2586eae5ee3418878379bc9295596c83c11977ffd3c323fab9d383b64f1ce12e4840b48dec96556d163a0e02b6797b39ce2c9004d435270ae78548c57fc5bf69d90f00fa630b4696c20de6b3857b85bfcbb31d3622348735f64458298d08eb7f894beae7563bf575619afcefa5e810230d06a5254bb719ab081e2284b8a07a4936068fa10f3a924d4421709b425155bd1be5de60c0c89ce7853e5bad2c74f69d6bab2c2b687122f479fd699f1a36b5b53a99120640d8a6399c53ad69634063105606428fd1780fff359a3adf86bfb9dcdd0d30077b0281720f41214bf1dd8d0fa30f8ddef1aa37f4fac34e3855da2bfbf00327138ed2707c0bcc4bfe873611be59525c4f2fdd6dabcfc407d9d75a6e26d0dbcdcd153b8836a8b3cdf8f9be3273d10f3f86097e1af2e64785710f1d37379dd5030957d6b8455b0f36e283c457145ad7905a85065eb8d137a3728f1d636fc3ab2b53eb3ccb673056be1a090862f12cd68469c322c7120bfd2da0bbb8f5cdd1cb33ce13d1414177a45a8a4aaeeb12a5124ee618fb943a8fe20ae63b2519c1de69955dffe563e8817112d082fe80ac273e4e01b7f963c2fbc1aea334b8f4ae4d310975120a5630e452cdae0f57824073c68caa310c6f53fe19cbd3ac9efd5ba8c9c7d342aaa78a873ae6c1ca52abbb90a1548db244c70133ebe6a352fd7ea92eb15b4e85eb5abfd65d4690e309320b06dadfd25d60f537e442deab74946cbde11bc8776e3160ce73fcedf40fdaa2eb5cd290863bf88daabe7f8ed4249fbebbd9bca3c8129526c4f46923330086aa9f1df639522236f8fd75be390cf5a267c7bf5ac7badefa4ec8a19f62fa149be9304e3911d3593725c4c929df4ca739fb9ab4eca3fab7f58b5a95e11dbfb36eacfded185ffc689998be6fca869ec44629c54c8fbe6514d2df095a85ad8f3eb75d8981b9997eebdca74437ead3c07f7ec3e8640713e79d34a45e9a9258efaadf7eadaef1413247585dc12bb63060ad6f5fc7e837feb5ce3faca94335fce02c2467a73ad871bb89d526f9a0a015094ae23263a425d49cacef9abb3a33d33c9ecdfe429866667bea9c6fbbdef57300fbd02916e7a4a4fe7a9e873ce4840c522688a8cea7c7713b67bbea5e7a66c972c308ed24fb8fe724a1431c8bd48781189880c1bba2dc8b38a0699c583f522a4d11758bf36034c0783bb82015545fc370110973d5f2fab75c179ef5c9700769140d14cf400c6f01a26ed06dea2bb08a646b902e14917580428400510c98698bf7adad69dc7162112ade79b129e66b3c3b50f60a706a83d9ec45b6061f6e907cb6f6f1bb2ae93602a4ef70de5a537a0a156f7c4efef8cfc466d41105abce8a754b2fe596a22838c2cf764ead7dbe14c787d25e3303cda1569292b2b8a7df8c35cec12b05c42780368d3b9b0515839d3ad2338280571df51cc4a90bf7ee2fdebc60daaa1d9a97e48f25f03f9d0ae9d0bf989b05a21aee8e94b4edbb491fc409c287b11534b177e615ad161390fae48469cac5d216a0e9a864f8f6fdb47472197fab95690099ec842135ba62e1c6790e8a49c147c2eb77f7af41efaf467b8dd5f4ae27dfdfaf04d103f2268d1afe400bacbb7a6abdc230203face502a8e6926a2248c73281dd782bb427ac13f2926acb77811d41339751c3745859d53596925a7590a8e72a0c0f5d486d19c15b3455c2744e731b100e0a3d2ad205052427c4881da8df17416a350ab52c2f40108b8fb8eb51b80c31bccdc60dae8d8ea5cbf2d233d6a195d8596f3a5d82b6679857cc87e2265903150aeb3ed59d9e663731524692949d0ed0bd09c838681f801442312a4430d7583a39016a8196aef917d4c27e3578e3a07296dd4f7bbb79ab452d78f3c64c3157d54ac5efc61b3f1a87be85037c35e21d8a5ba322c4cd02f23e3f889ca14a0af3184c52472af9b93edd155b89e330ae076f76851aec6d6f056479fa2fd11c8701914bdbd7dc67e92d0f85f314529b909ec0d82de1c7a8778f2095ffbba154a9a79402ef2a752a75864e99bc4db1aac4bebe011b7632a139fdcc194e36965bbd51af9c8614155c8f122443327db4f1ad20e5605beac47c02461a0979f9bf699308531c4040de1759e72a9b952db28d503cc141995a7e3129dcaaeb218711d27aabd076ea08c96d83e2d9f47eaa9157c48c9a1eb9065248843de9c7e4106a8131ce9aef6b6294d1ab9d3ea9ce4b8c83380ef23e81c7cabac7ca62772debc5d97463bb15590fa99c5cee68330110cba7e8b3752539eddbdfcb06ea510b18405a885c40ea86198cd9a85a712c1c3d3c3b9efa9bdcfd190400e104137015b6d62a6b8c0650dd7a20e87177a293ab8a30ad7988a9925a74dde6868d42f0c95fdd7d1b7c4d7c47edf70084ddd3b2c5170aa2acdb46c10ca4b32ceacbd62e2a089e27c23ac13fb6c8119aeeab767d17f9d40d7cd4f541973a2ae9956682c3b99a9a621a84c8c615ef95c6aabfaf848febee079d4e8c735d3033b5b1f9e1ab9e2153e00c64d510f98ee75e7274d82cd26d78668a44c324fd9b0aa4c3f8183d06aad7d280193deff51a72cc082949a86fc8ef5e55e9bd4ebc98186ca1f81dd355e20227d88df98fa9748242233309635734b107e9b12bb94d026e452dd741462ed090135c6ddc211ab1ee20dbf65685a394fe3dc8c2a67c800938d7e649b51d8eb39665e5108bbd673d076e292c7c86aae46e79f23c84c2ce68d395dcded25dbe2035004f5d04da9d6d00139ca0b71f416178adaa776a0b573d6a20683de1d89b28b40f6e73cdafba8bfd9a62dba9ff896741ca8246bd68a1a438152529af63429676d3e2a6db4423bf5b0f06672e559b0439ce31e6596ad3949240554e633d0ba82fd108d9de000243723a5ede72a055d3e9eb23fb29921ac9dcfc32ea51c2304b2055b6f25f63d159984e17f0202f3f8986a2fcf8b0111bf0543bcab5ec47ac245a76f5a9cf6602ef8e8cdf1253e01fdcad8ece03d4bf88f90b55ed94fffbd1c42dd27a16ed1fbf2e851b126e1dcb1185d6a7f94c80fc77d6ce91c9a21cc74c8e235c440ab3f7ff0eb7c862768a86c6da548f8f210399f86126dfab97a10f33979c5c193069dd0f3af063e8d6f6cb2ecbf4ee2161c7321a71908deaeeb1fac56e735ab7eb6e16048392477ceb1b11544bbc97c6b93a2b0a568973ba7f797750d1366a74c01dc84cbb184cddf87d1519651a304c4a02b965ec690d3c586bc1f8df4790f58e78b832c83ca258430d108e44f4127d5eee320013eb8559d67eff02b7250837c3d7cdb2e9cdb2be1e577ff1b242453e86edd25de1323231a389e7fe131ef78c8e8cf3bb4a532f64a4fece35d74fb22c2b880571ae4a159badff54577175c274f940b7f43b69f4e3247cd8c1700636aba6f0eabe55f623fd124818952e5eccba595c082f9d8770cc33b553a8fa268849b129c2689f338c004814fa1b7aa13bcd9ee8fde20dfba0c24358419e1c987ca6a49fc90640eb355faef230d4bf3a3dc12e3fad9247a82bd8d3f1f1079b8a73e4ed79268bc30768aa2c70705a62c236e42c81a48f7e8f2869e9d16f3454906f6443ccf91fa7f984e28c6de2639db3d1530713643b11741cb0f515f48dfe8ea150a525b1964743d9df2339bade80cb2c0ca6fda17dbca723c479df5cb8969d6f568c8564af4a8d19373da8e1859bad6388ab644a158806602334f95b9dd4fdd8cb63022b8e094a96e83def94f9185b852690a0897e01d4427ac31a36ec42b70d3f19c3f18d655fdba5fee2fe550f933ad3a54c3f5f0a857304fe3c06f40b8572568c3b53429abe3141a702d410e6884e6dfb3843fda01f567fbdf00c48cb856a9d48baf27889db8c4811f07cebd7c0151c3e7f3f87ffcce0a3273a354942aed1a83b8404e8741caa10b26f7cc3fbcf821bc10a07c43ec163f908f42e2b9c4430f84f69b27249d52ca25d9983302f026b6c135a7f5ead8e3a267d7d45da7ffae47647beceff9d89815326993c01e55803766f75caff8e725235a369d3972d43fddf6799c6c75daa602c51b31b3b945d6872dad92d074c9de5a8099ac993fd4ad4c3cd11161deca3d867efcdce3c4243a18ef80eb3059df0f890b2827c388b3feddbbd93f0ef22c92c15704a8a615586172855a5dee473c1284a2ac3e89cd049bfb59e0975e9b9cb002f3aac11741859d638c49969e49b16f4654c4a644e25b61392bc2706e0a7aa09e31acb2ce5f3377d47699a0c417683acb4788177bc2508bc3129baf7403956ee8ab99c0a123cf91a85f6f506ec814bb55664d0321924dd294d3020e363eaf1a9d03a8523172b16eae52e7319cb83a5c44bee7cf748b29f9672a93393ce1399d7265ebda90e2ea73cbfa9dcf15299cd52a7ae14f002fe5df21fafbc2f59758db40175946c08eac162c3fed3e906b06292e9a98698ee283645b84ddb5563531e7d3a5308732312d42eeeb8e635996eceb9c98bbb8cbc915e5424d2e852b0be84932d89a20cb8aca2e4450f8fef5964960202c56979bd2d76b1285ada7f699c444a84494405f46aa9ed7dc61278ad1ef7e2fcd8336cd0b79153a01a29cb93500cdb559c94271dd06856fd5f6d9812e9d240214f3941b85712de6b8944cd5cc638e181571f85342a0d36f58411b0e81fd502bb107ae85f2d12c7a9f93f7d81ee02a2e38fd972203398aca66118bc8408bc125fc7044f3941365adb22f7301d1b360d496dccc7a100ed98687d051b72019c814bd227e5015805f9294578c39eedba15acde417979f99dbcb189a57925a78ae7277f0e1ba777f8f8cadd223b251dfda3729390d665360b2c1ee7a7d1329f28f3853c8d564240cceaa1d1644f88df681cc116482aacc59cb0c6fa51792848604f0da64c414d00164051c0793490273c160563529274a651bb8accead7b36672d0578f4bc21b8985e79d4c5cc513ae045368b853f9543c14407e5db9ca48d1bda8c4afa2af5aff2905da8461d210330e85274126de2dd60b554732f43ee8a38b626c83980f438d8877d95660c7484f21a2057fd2c4b994d4515e0b679828a3c4d194859d49a79c01307c1f7af496865c1ef8eca8ec0b2b27af9beeb18023edcd5106900b357531728fb3d6664ab00fa907ae271163c497c1b4cce1dedf43c53ae0cdfd4299c30a6a94e5fe57f6fa250e5ce0e1004b83d7bc13470e8a0d9ac358657cf0afd7b2effeb68ee70cb566ae7eb35eed908a17124a80651df61f41ecd4f807c224007091a9a5dd4c80f0bb52988330540a4f69c3495ec818074615e5f5780828de4817ad2853933c248c8a746468b2cf77438fa29d59250bc880d0b4b581cb59e66393aa3863af4353a182ef204e8a03f22bfa837f2fe1bca8d07c8189b09ac7d64a2b23f43b5b45ff272d00eefd542fde8095f7ec2f18dcf02e1ca8785b63b108ee30e493e0b0bf58eb604156dbd5a31bfcb28e33dcc180a295cfd29a42d225eff3e5843dc74f5936ff9159e4c60ffa9cb032ebc195ec18c387ecaf8276704ffc8ee9c3c4457141ea8f4aa368cd1216abd76640d3a78499850006e82b7d64e80967c2a3c7b0f21949e9216c8442b668532f3ca22e1c7ef379c0f91ae4dcb305ec0d44716922622870acc851cf84c36efb839bb31338aa6ea67f8fae9e52a6c5ea9afafe0afc1bcc2dc2253c644c97297b9050a0fc541bec0097d4a2142cb08329adb4f8e789bf353afd15823c21331f0e3161803fdb308da6ed76764d995d03ba1268f3de72488b8703dc212ebacff15bdb3c5683dced1215e6432acbb6cdf7c0c28f41b1f56a01fd550da60d4375ffe23dd40f1b07469445e6533b85fe94b585ac332d13d875b85c63fa085a4778a61784161b9d0413a8d85a8ffeadad7bcc3e8c681aff16f1552f3368314fe244fe572802d81446de3d0cab7a1c056aa2e69c58412787695dbf32091d09641b24c12d6256c169f1395e5aa25ae4a61ab663f9f650e18a06f20633562e7133c8797648574ce66987a53a0c4d8a31586f2561ef7b23953ef7ffdd82a5600f37a041d5d3488cab0a13c40122f59c2fe1affd91b9b57206a193255c8256ba5bb11085aa310918ab303cb37efb8f478aa434260e6ad3d005db37fc1cfad4a35ed7fd4fdebd28cae8fc92efbf14f55ed67f56b8f3c9381f8b48dd7bd22035f6d640d3ae898a060a4113ff7d727ea1fa9594c10848669400f9c96d78ec931dc4e267e9d5447b60c6b9dc88e7132493144537ec23132f9f9b83e4111e1d062e5cad5e265d6e8ca0aa7fbe8da45ebe974c5b0372803d97933b615aef262766f791b11e86d6f0213b10fcd90ad0c7e1ab2c3f7a388f71a90144a89a1d5e5fbfa9501ae050a725d170a2f567aee0817a7fe425a77d2457c434a3948af0080f04943396eb820afbf9c004450c2899136cc89162c517ec2265cefa49c9229903b7d4b00a4af4221fa1cd84701991096c95d3a13a470354d90833959a959c269a896040cd7dc467ab0ed52c290600e43b4411fc681f14a11abfb67e313a291456ef939dc7b0d90260f2bac8f112cfc4f9b0c51fb0faac1308a60dd95df4ae716ed89bb52361584928c218f8dfd7f8129261896a4abd676c0cc58f402c166bc3ca6348c286f0a6da21b875029d36eb912008393b21f6b30860f842385fa447e905326959f0d75856c4c004cdbe1c607a5798779c4f78f28693e0aa6b1f63065f51ecb768c5d7f8e557a627e0ff37923138851a40e77d7f7afbf61bf6d0ea3a175da8247f131d50905e6d1240cb970f07e37a765c0f341695b0234302d769de3c93803d12a7bc927ca158e745f456be687ea9a408ecc84b0d0af5d813105c78b465b1f10e092708577d79471c6fe4e8b76fb02cbc0437b62a088099818dd13a951d3a94521140949a8f2cad08214e9da298f822da084081837a205c1d845cc6ae30b6254f65472423f5fbd491ad07a4f1b222d2d2fd7be7f64c85678c60d6cfc66385334658fea8163e78e170223a1ce1d908a1d30141871d21f50a2a89f936a523951d3e8c30721581a9eb55c271c308889e600b138b18bb781c2c977fd30c5708162e4daae54d58be3a043727cbb028b7126405cd5403528ccd4a13989acdd8357a22c98eb8440111e2b9cac15be60762380b22cf815841b9184a4e15a16fcdc8661729360851644f94a3625ab8020c943ee8c161c16d3279767017dd43db8e92255b5c53a01357f52c8d48f369a6233c4155764e5750688a28be6fa1ba6fa8677e10e38fb6d83b78da517850a751dcf1344dedec60844449d35f260ba3a61c8fe4439b05ba8a1d9be38d293000c33cf30e0d63d007fc72c074c2f0bb610eaac5b6053c0da9e79600b737885e4baaacec09c5a8ded12c5365333b96cb42a28b6e4ce141f21bd517ae7114f1e2246a7481e4a1d814f3b63b79408dfae18c76cf33271608c814042bca264c8d079b1abd11c87da9310d68e5bb059400ca136071ba54100d068df5408a770c299012fd461fe316314734ede77b6e7d9a6f6684b774440eff47bda7c076179fccf62819527426b9e7bbf73e5b4a4ce0b409390baab31d061f9fa356b48a76ff7fd5c11792fe3c6f0c5189485020e6a2d860dba1281ac3a7e7c413e787c714744d69fb732706d879a27d7c20c3fab0e4c5c67b2cf0be393be4394df7c1f7047236b7c4face3027b3e0388865c1d02fa135ca0340b0e90f0a84c04410cc6781169b9feb7e074a6a10b40c98f2fa84107141c2b5e2ed7a9e040adb66337962005139c4ed93d2ad0a4bed5b332a7020d0b8d7448fdd3cb5b7ad19e37594ed6273db60e1934f3fcdf2175cc50e9483a48939ce4dec81a5a6af823f8c16eab952fc8429e980a1c3678770c59bd6d0c25f56027bafc1e5804f6a00c818ead5811cb3f8ebebb739d9821027606109a033e45403fe96738a2bbe03ff60553d837819678bf9d67c239b771319efde34df124496e213e119b20f2163abd7087580e923ccb673d0e19e28f0298280d505b499d52b185491c250b31e74b2c37b043072193fc5f585c8a0182fdf83f06cf6363c60200a26d0e42ca85a168a8adf02374679cdf81ea8974172a5f25de3474cfdbec145be78f67d7c76f0d117288316d1778199de82931bd9bcb41829653a6d067ffe8e529c1264edaf4cb454a66e219d5aeac88979cbfa2f9e3fd187a7c640a73dda5b633722bf34bb5983bbe083fe0c3cc288da1a77bb0d8cfbba1990eab318cd0dcabdeaa65a14f48d62b90a7726ea04a389b30eda3cead9e3a8a904df164725a805ae1b077f94fae436f356720598c86ebf2e861572fe79c3bfbe85888af86768617226420fe73c4a57eb08f3c9f32f2bb5ee9b0b13b805266e44d80ca3de950c80ca1f3ce902fab5ed585c30d61da703e974f3b5dc4cbc6c17c9b0766b0b712e4edd8540cc76f2a9951c097a7675121c275ee2840012d3a1dad00384b686804ff46b1110c26bbe19f1b686ca0ad6834f217f94a18cf759375d38b86621b8c9de524a29a59449065f058a057c055a060bfdd5e8d8b6a60d217b7797d841b7bb63e807b8718a3635e3c0d2487dc2dc7f71850ebd0c0dfd6009b952da1416631c71dcc9b64a5dbe707cf88f0338c816e2264cc7891585e14e66096122b41824498b4b1097a125e4a12d19ccc9232d7bab655bb6354fdabe7ea1f5486bcdd3a8cbb6e8cfe6b72e6973a9481b9bf3cb70a169f0ebb071d7024b47e9d9966db95aaeac8bd6eaa66386122df74b4b287ac8979efbd35068bb3f6d5bb52302c59f88f6a3df3a1a76b61f759d8fad8b5dce34d91407442b477e0f770e06f3305d0f6992bf5d49a5b678b1a91c2bfc71a4679d9c221da7492a81841f96a04a5068e7ecfb765ff3b8edf0d40edb9b27bb4334c937b2e57f3553889b245bda54c6604e96b196b45e59beb89137373737574c79d18a830a37318a2d29a01569203fec119e4474f98d7bbb186b5c1914116daa0711776e1082ff7327dbf6156c7964da30055bead17e7b1ab4df6edc6f76922b95da7b7f7b1c89710f8661818f53cf32d35a6badc5580a7d4f829b6ce958055a85e4f790aeb33a3cda8f1e47e2745a0cfef3726e457a73bb90f43a1ebf6dc744c371bf575bfd8cb4d0ac7dfcf84fd3d2f9dd0b7447e3cdcdcdeac7767142cb8996939f1d41274590764cf562a3b56e3d7a5e8c999b73cacce1e4703735d3b423e20c9166fc68b9254ae3dc69ec6baf032af37a502d0951f8bd68c3664b94fc9b2ce3848e353ade2415d1d5b8e7193811ba94b988b2ef0573115583843ccff359fda8b4a891589aa6699aa6699aa669358bb0c27ca494158661d68855a9a4aa0b23f1a45fbe26b524244d5559f3a43b16cb7d6b2abdd23f1f1765cbd77ee4a9aa26464193bd64c334955e693f5bbed6831f07ef42a5f9486db559166cf9964e2da54459d53c69aaa9a9542ad5c45853799c94f41445ea8614416df861fcab2a6e9d8c4a536df9aa9cbdc767c52235a1d65abbd0547a2115f7de4ba4c95c1c6dd47f4185ba44fa7dc1457ff85a6c99dc1bb5744ae99c33477a3da4a793b31386e07cfc76d351398c234fb9a380fc31146323d9020c9e0b355c37eab53b186b43a074e6882ef926eb1416a538c6084de9acd5278ad3a68eef11a2920a15e325a3217cd5cba69141ee2a5f01d1a6d623a2275f93eccd1138b67c05444f6298eec35bd75d6f7f3548d3aeb6a4e755515952ca1a145491a841d85a9f950e24c74b628c38e648c22d30c618632dc35a1687887e0cd924d15a29f8c9deb4adb32bcdaeb219f2ed10be3f72c6d7feb084b0cca6588d01314fa3c9bef7a5c9bdcccf90f6104f32688768735fe663de4ad70fac59828142ce282b057922fd49bf10914621fdcc6bdd0c6d1229113449d619f98fba76cd8681cc92d659986ef31490ad1b75584b29256bbe5e00f86f863228003352a0a1abd20cb90070a40700a73f052ee667702fbee3669e8693798e93f1252e463683a62483649074c918ee05a7cd7086f3449d7ecac847592a87f1d09fdf074d8e354f330e9b2697e1a4ca5fd3c4712f663a2f9226fbb6e3d912c7fc4501c65b94aba3b930de07e961fc7d18fa4b4362589f0c922d4bf32810bde6698631fc5e6a6b24ce5133c458eb29a38aa6ab7922d99f5a4c224b7a1f344adb195a1b13d30dd141d35c4461ce77e6b0e63a6652b13fb7481b27c06bdb7f4d93b5334653b487ae288b054e3f01b8985f81eb5e058e1b00890bc0cfe06870f6a457d0b6ffcda16ded04a7cbb52d1d658e09fdcbd9c7f4f57cd2ec68275f4af4dd5323d1d74fc37cd27c3d9f887efa32a264e72c6d34227134fe311f69a04f9a7812b1251faace5c95669748c3fee5664c7af649dcc4c24df6f55cc2b61309b3cb0c33c724e631c7449362be6e3968b22d3fae73256d6e8743f73c31cf7dee68b24e0786fdf9f3a283a2f36f692ee9ef8b6e08d7114121d82998920998e0364ff304f31a57da777f35524a19edfb04025f73c8feb597c7fcfa3ab4eedecfbe5aee0aa9fbab014110a4375b238020086a5e220df9a00f982eceadf34163b10d78079c19903be190b4b159a44d052738c17b573f308866a6e857cb5b2b48793d01b30451c1ad562aa5f9e81c15a28db8f1bb2a253daf081affe7a924b82d42b4a959441b2a5b40419b7b13b6fc68bbaf26c1a20483bd469aa73a1a4b7317e55f6e84718771a7354869ce155947839fc6c7472d3b4091822b58a8acd34c34347443a07cd387172a7b0dc86c265947c49ba6ae344dde9a3e94ba9b05f0b85059979353a97d204431c742d2e6b65aad9c7f58422f182539e79c73ce3967e7b6e058e533ceb2d405922b0021f1168fb35c4a8fff648c71ce39679a475afe12111aefefe77b3ab8b13fdfcd96d1c67cf92335941afa9100067e4ca00243d5d6fb3f524319a752a9ec4a1248f72620da8872c4d2f23d76b9eb318f79cc631ef3985f2974374b76cb71a56441221990ffc630be79490bec01a88a0aa4907a287885de7804473773ce1e7cf30efb4db6e5f0b8ff0a1059ec2f8229209105f6ba924367679a886424ba99a626f4575f334b0fe6bc5b8e49e9cd151f196c47404582ce9b9b9b5a7db496b5d6622c458dc1f045d38f56d2d8f726b653d9b6c8da540c487fcfc513fefb968b3470d7b560802a05b5d65a6badad7fefeac746516b18fa44d7c200d3c8965f8464adb5561d25d0d3078dff3ee5c19dce3485ee658b2d65eb441bd565f66b86ce63591c3644858eaf4aadcf4a0b25a49e305d95ee589b5202c8622c4774a4f147a9b40cc018df0b8424671d73ce39e7f803480daee5780475fc06477a30febb799891cdafe9fcf901649e6262bc0c870dbd483226172d07838bf1233dc9c570ddd6e1dc3992dc4327477a11ccb225ad17528322e38aabba42bd5297fcd4a06aa5b6aa146badb596156d6cbbfef86cf9f507bdbf9ab5e41389c26a75af8ceb8816839c80c70a202ba8d894c63c580848d31c4f190831a538d1093a76a05d281e380ed0e1c23fc0345614863b390be292b3bf5e3aa557e9557a955ea5eb598e66a6da897627baee92134df75772a2e52c451b52ebcd7fcb4010d342a20d1cdc0e74dc41e33755a167909572eb13e9b09af93215934fc057967542a40b789240c50818eaabc991bb183fd0da9683a342836086780a810b111ed1e23c60e1ace8283daf8bdea17db60fc84f13c48648e4dad9e3a7e191edacc35a1779648f9f6e3beece3f371eb8cb37e7584c48d6d21c66e8628ca30bc776b15ad8980dc3275dd854165dc0f02508550cb90b2112a10ed522586badeb75c5e5c211baa9ec8345bdd28221a4400d29b2813178a2c40c27527a9eec001683074a7a60028adbacb0fd6b70c8131eb9bbd7881d638c31c6fe55478c95650272d30f349eabd57fda4d5168f7ae9bb1a2ed6b1267d13dd5bb987b384228e54a2ef12ddc8b54c91f8f499e0c04b36d94b91006e709631c31dd465b8757a1133fbd34c26d2099d8f2e5113f01c1c23df41bb44949891ec20425c9832361cb87e183fe3c8485188761a45184fefcbbf920ad592e3da1473bfb2c8afede87c9e8bd95fda86bd26a659d17653dc85e78d11e461ad2bb84a9941749cf8abfc030ba2e1004881274c618cc41140f1c7c33571623afc5eea9d0c68ac2307451e989992283653069237b7e322f2a2da5f9644459d195d20704bdea45a1e5fe3c0f856cca7b46345d0b15be45dad8cff2cfcbdd0c964206bb2bc85edeffbcec2f77b766ffcb605916f154c1098b36462f3fd3126f682f3fab22665c6256846893bf0e75b1e58b8b8b414d9569e1322abcc6962cccbc6430192946ca6091c615fdb7ab2ee38515facb60ae6c28cb223da98280456d5d05a7493e8c95fe32188988b405ce6071db01a382c130a949ce3e3e736e32586ba5f6f2b519f1148138e4a552c9023fbe682d649e205384d1e6dad81b31780d0c1bc279883f6bcc29c61b6decd7ff64fd196dee57afd65ae98c619b585e8bb36439dc19f100cb888a321890d56ae5e37885639c01a554ca690a6bc5f111c05cb009fb69e271d50d1c5e23a6220d18bee88751d99f5dc5a01a768048afc66456c30e10e945576582cdb5b1592c2b014d6289b04d6c145896615e958835fc876eb01d070c88a6b9a858d876031211c63e38cce0ddd8256ac1e2425ff7876bad3340fa7bbb03046bce9603e3ee04da7647e8d10212b0874e8ea927461a338763ffce851f000b3718865a7f097c4130276796100bb45a352774b6bf1276c2090de3841e65332fd05f8c813e485c10d25f8d0b36d05fcd1e494fba9084fe6a6eb8dd65ace84f576aadcd41e8d4bd37c61bbd6c4fd967a79244138850453010a440653508903609905ba6948234bd8835e4c7e44eff40b7b0cd68aff57e583806491cc1085491db858725e4a363060fbace193ce85b6f464c1c47960b8411fd315422848a02171dc4b518bb20f47308d49f5c10faf6a9ffcf907d34e95dafa45da45174a9d32f95a0c5202900b9f470595283607d6c4c884fdc2dc07c12211cc8eeed61fe7b2111467b2ab4618cef8c2beece3119bd96363c32786659357dd15f74c560df41108b0991dbebed70e40ecc66b72938f52fb7811c5ec35b8ed7fcafc76386952b8ed87e39bc63c8116bc8c79c8e4843e258213d28b1eab215a607b0207c802a52bd5c4125672fd2904c348f62d962eba4237de548d39ec62b0f8a28d193dec5b1c42a51a342c3e6c9778c52f2295bca48d31074dc3c23d42d876bd3aad05f84c954a13f5f5d98cc61ba3faff4446f9fb92f863bffe5be08eebcdafe3273b5a3c94f933b2de3450b5173a8bf08cb4f722b67ef0b908c61589973d2494b11c7d2132ddd84454ffcd6da1660401f733c7896f69ce1f59a5d2c592165c8085c30b95e7aa2edfe4a343e9a53c747136dead1777b8007716ed63aeded7c48d3e5222a4f89bd96d0a15348ad3ea31fdf5b6af59297764df65f5df394751963ed72d520272a2dad6cb82109adb57071efd39929c53f4d4d4a4af410ee1ea3a36244f9a663dbb9db6140099658e1417d8fdf39bbfdd2792f9d35f4fdc31a29d1e200b6fc1754e8eaf87661b773ff7b1c6ddfdf378a7fcf4d07c5fe9fbef75a6be7b6f6a5c51c934cb59aa3236de2085f8b310c0aaaac5582afd8e4b922adc82239543d7a1d7d841955a75182d1060e79e505d658a969933e6e9aa675252b4b45f235346528b9c0f0492b1220632c482d641823de62bc233ca2d70b135dc47a50da1cc58a886414898474d1219e82c2e50a0aa6487aa3d73ad2a8c319399552649004ca3e462b7b66ceb81ca494409186d41ee8d36157ac35d823439c59b9db656b73549a27d7d2850518cea70022082214bd9d8c31a13f87ed68e3326553557e43a6acc0c085f6af4f5fc317e6447b098c3a1a2a019ced472e41f95af5c89e07d8f040ac7d0982395829654d0db2668391869435b2a646d648b0664b296135121cca024a50823eab174459caa852aba439cbb2999db7fc1a6a7c84e7e74f65f0b734f5b91ce4ae3b86536b47404da53f7c56545844429cf564480edee34b3ce548f208c60b4d82d946305e6812ccb6d1407f563553fb3e0c201d6396e9441b71ff20da191311dda069acd10cdcddddc3a2e766ab464d2d3d2b9e82524a4b2ddf7c7a94ca53c31d974bf3d9aa7474621776616baddc7438a1b50b37d0d12d16fdc5f04b388a2fb2a1d29b58bc526b7313241811a55222e0723b11757fd0eea666a866884efaa3561f221f6831888ba5839f233beae0c727db2f2c925a7d7ec614edf5b4036472bf723cd089f7bdf6b8af824ece12ff95c61c6b572b78029105ad055f31ca7385c84a58346441100b919ed46e31c6f2f7ac3215b0f1500c4b15a82145669e5082dabe082e220a148c4301bea28dd9454bf3b18c3927c703edbe58250c776acd41162f9d1f14f011899c27c2a2171d108b2bd65a293c47144d21c21422f84c81a272dbde20902a00110a3f0d969e34c9143c490de709bf772f50cfc7101941a8abc50de8d8c4113f4d1801b41d25b744540d11805822068b732489fd45588f9c24fa8be02bbe7498d01386d246ae96c82d7a543f325685f095a9544aee5a6bad3294b179ba2fc39c694241a6f6e7436ca9234d4de8f99f9461ac280c436b61f47cf971ffff9c5f333f64891ea3b59ecdd8ce1d6d6c31b868d06d384f6ee33f34e455d7575d5f7579d5e55597abbadcca655d205aa57b740ce31fb7b85fc842e81aafba5cd4b3d5bb77f57357d005a594723c74d66a8134ec18471cddbde2fff0fe6ab1c5dd97599c618b010bc41a7cc72fdb8e126f818fe889f10adff9c3120222b560bc6ccbdad60492362b6c29f3f56482334b906db58282828282828482bca020eb414199ed9cc6473684660689d21ee6479f7543665c00eb821a520446092828f68b44222fa8ec7540690fd3b96ad4f9aa8ac7099b58ee6c451bbf2b6ce600369598c19cad20ce59910611d1241fa806bbc9a6d527744c1285a84cf0e307cc56b6ab14fd1567da77dfd7761ee442392c1424a6548122a81524d49aadd9ba1786ce0248a5ea09a2e20384a425b45a7255aaab65579b4fe86d7fde135af3e4d35cefbdf75a4be7f59ed07a7f5ea6659ea99c3810dca4c484dbc008250e336de1d540d3af1b0f1abaedc06f6de63da149486c8fca85593f25adf295b3a4d7f21af2fd070897ce7b319d1508ec5a8c7f58da4aad1e79dc8db84a35b71c4c728de71b7f9398644ed5c72da355c5a2145459a9505a15fac2d41cc4096869aba91cadb6a3a98f77f5b19251691d56243daa9aad63adcf0aa6c8da1868f71b33436840b4e101bd8078c33b0fe03d71441b130047de3b26b6dedc8b811063a4910aa1cf42e9619452cac99d2494db13ad2385a6af4dc383f4dafef8f14feb3128db76ba46874e21b5fa602ff7de7bff0687adf7de7baf0cdef5b015d26296f9dfd410221ac1a468812e98880484044352ab6cc301370db07107f9dedce0584c48fe6109651cd45af1adf8f2008278ca5ebe90d38de9eb5d8c11305163ad5e3dde8f771b6959c6771b6959c65e13748c315eac8d7236aa5a96f1ad3a62955aebb3aa126bc15788ac8445435b403047c8a300cd39698efe216214b0e0055bbe1be17443b4f1c29651f6e00425b815d1a7880e02dd405b91349994fec2fe1cdc824f591ee50ee31c797b6a4fcfec2a117a7a1b7f7de939a8c16b1f67e20d781b5bdbc3ad70342f23b44e8e8391680322b881031f20c2a51cf0822098b3b7fa6109692eaecb5a7bed75776badb536b4a14f4d8de7954a5ab6fa919e57e345b4200912a8214570002107311414ff2235422c014441d1febbb9b7c7cb09f495f1d2ae589655ddddbffa8ffe721a88547610ffd13359b263134c7cf6e73b3601832ddbea591abd77961583774dd995f42c00a868fb3c6215db7696959a272b1383af941830d037e802490f0422fd278017306ce8a9b93dc6292e9afcfd61741fd6fe3a747d02d89f0d6dab7611dc309d776f5b587aeb722bcb1ad5ac851363ad4ba5ffd0f37c7f1174770fda2eb45dcaf6ee5eaa028d3428c5617661adb536c7074d048a7d22323ec61329fdcc570f67473cf90ed1880c29283e66bef44462bc8c2732f3a5f760f61741b9d1f8d320e3633c0da59f799711e36de7a3f4334291ca5697b06aeaaaaaab3c15627c230aca7d979ca7760c9ff11e4b14c62d6e5de52918902f36b415e3eb8a91023092f38c295aee9c73cef663c63737168b98908cb9589a31a6d071db67c2b5ec955ff8a56519cf9971c6b60ae9b959504aafa5d76e38c88fedd7cc10e7bcf6da584c48ad1706442426e82ccbb218ee6442527a36134df267666cf023de819c92a804ce98e5a853330000000400f3140000180c0805830171483c261a2f6b7c14000c657c4a76543819ca834990a4380882206390220010030000042840544256006c329725bd4eafc9c4794687f9476ce61311dd7c09ad449e05fcd37221df7c6fcf279e12dc8aa9296282ba35714db578229f2bdae7dca816aeddfcb13e394ba1dd734b93072e652a70e5480915a04f8e05b57af9fa0cd2238c20f0f814f208580eba18c4154e7ebb15125d00f1826d8f7aa3838004b32b120e26d75eb8bef2b0ca4295cb2cf1119e15db4920a9be607fbe00986f5b84aabb335fc2a4345e7197fa0c4feebda9789206a74d46889e8af5c513b54699af4849f894f239c50c54830ebad2d594c3fd1319462af5a661f6ccb29edecdc9446f5a927e50f16e3fd046156da08954c282f6f43c93b69801e8c4488fcb889e2906deeb976db8acd6cfb331d06a1b6bd6cacd79e126aa371773eb93487300f4bab92ac9a28d217567e34b28d5c107b4221088c3b1b7c3d84062c71f854e4c69e6d98fcae46437e166aed17aa92191a16d87cd1d8eb6619d443a2d58236f3d2f6a57b1038094b16d13b92a823eb0400c4dc1578cfd48f9880d250e53d5fa205728491585a471f1cdce4942d3ab74975d8bdb5f6ac929c9231ce5cc45f90b4811726209a0f518b96bf8db1cf6d1d7e664832e6053c40cc657f81cac3550eb0e9e767cc0055ae4cd54102cf4a193d0fddc04bba0f974f605400f27f723c3320646a5c47f101c7fffd6dae538f907528909501fd81171aab19d41214e4591746e70ada31d8b9b38659ac58785331eab50ddb4d26a1f20536f1b0def006b4617cc5e854feb80deb337b34fc8b2ed4b6ad4ea347b9530bb79135d7232877d1a7af24a9d3c20e840e476c0f5124d278449c3902061db8f9d8136d74e2c71e72d73f7ff5c08ea2651c11f8377fcee45110ad8d958ed479e540948ae6d9babaab4166c961a4991328f69623c2a223b6757e7963d54e119a36f0943ec9c9665f8b4ebe6a432843004012b8497b8dc7316d132ac9a9621841fc4350c38738753cbb0b711979b363e9f2ac4e50ee11e79bec9e1dd320d690543e3ddaef55ac0f9e965af132d93b7a94d9a7bc9f01e9b7b329f5a376587c412128719e2e0cf776165cb8e555ccadb09e840ac632ad4905988dc5cbd2c6cc8cc238e8da4f44f1c90d928631ccb3c976d70a661668481e44bf5d25715a8d663971bda4bb2104bc80547b4cc908197132957e08138e961bb83cf5ff7b018edfbfa334d809e49c9a0529f2e78369c7174ea2e12157e0c705394ac90e5c99a8319c0c2f4ae4e3ed6bfcd4b5c951e9a77754bc3039e364d5cfdec860a53842b8a69abcf954fd07d21190a5c0dddb9e00d136a81a15e0d5b55025884ecf59a9a875bdc6b57227237a3611f2eba88bbed524701b4c3f769f3706b473b208c5b13023c5cc6971e6e6aeef1872ed34ea44b1cf24b2b3a499b74b8d1d87ee2c30c171341a8df5397649e84eb36e001e3ccf5988aa98da90e097cd09dbfc01382ab0649f0dd2fdec68d6a4e20b8175429cd17e67bc903f7dd914a5823d9d5b21b90c8f369599f0e3d66c6c34062de645d305341e8f1fad296cc89e130132d27ad7ced09b87469f363dae6442c9eedd250f46259c255d2198d7d69f3dce260fdd0619afd7164f9c3eaf89ab9cad076f09a1b08126861ff608267344b39106efaf38a4b5e02083d71b77ae6e9e1009425cc9ea72030d15d625f615a241ead1ae8aec192d4f0bbb23f072f5cda3464b5f6a2201ca4bd134dc373e4f56ee2e1f98e1bd7d293f550873bf9926f8f221c8488a748d3bc3381bf20f9084266841a4baba1e1418a78453d5b9596a2db78da859b2abc5d52727dd3ef3e3ed0c0771bac60f295b699450ff57c596e88185152180a6865b45d81eaa9152034295afe09cf6c50e1ff4640646a1124344eab3176d7dff5ecc56b66664f20ffed3e62186706a727784d8c815ccf29b4a15860df6afbea725bdc10e492a7f59f2f239d4182f29f2e8fcff07825049df9725e865ed97954c1772710d01636c97eb9b8118e29a0e90ce49e602df8d1d3243633ad7b29165b2abce428dd1a12ea07a380d0f021d374f010a96cdc65b5450c03ab3f37f38e6fecfbd2be0b3dfbee212251c2ce4122aa7acaeb6c40328e5f92e5a7a9c8452f2abff72cb662bb56fe006aa4694bc9a3e06e2c64e90f42499e130084f432a1b3eaa56fa1a1404865f04086b28743120fddd3a7bba3008c818cf89575984df2c063a632725f7469a45d9f86415c64364230ac0105f16304a48bd78e1f6018e439b21e4d73cafe596c381032fa3a168da7248759addddf01405e37c46a60afa4a06c503d0166a3103ddca320632f0b0d3f6a256d179b7dad605407eae8408c063f699bc9d2c485e5d16f4504ea23c7325716170f7deda07eb09b13e53dfc17092415d0b376342f55a99f210842572be87c6436aeabe94cf9eb59295c995de11db00cf6c6af00f439bfc97cd317d0707b5ad77a29e2cea1031b6599722daffc2d608f11f38a0fb452935ccc45b3e8a282c618e071fd152709e079563adbeb7b235730fc56b415ac8f53cceeae53d43508b056cb38cf8767092506c2f9c7b76d2f75033a91ed1c381af40ff4111c8a56aaa5e9a1a4e70cd5230e84c88da4de8dec43ffb2627ffd2a0a08e198fb0077cc3b78063558bc3879390790cfc6fee8a71126695afe97a03afd395a7301c7d792e26882263dd3c26dcf717c7bcccda34d328d2947e4ac2a7650c589a1e264a8e934c85f7b82598e93d7760f05927c1d1ba57a73d56ffec33e97d9f8fd1447d27216ae115a722ad3fdc4368eedabc9dc40d926d710742f806cfbb6468ad74a72a6840e2e5fff9664a2b6a45c21a920285d2a50a14867da831e6ddaecfdb30b80851a05b0ac6dc02a1fd05bdb3b7cd27e9b8a7a75d3f65cf9bd5180c1645ac0e774ab5188c54527bd7762224be0b9ac25835b91ded68c42c954af939920ee7bfeb551889acf1bce280f9e0aeb25db822d25b4d68f8a8b53dc3a5d9a4aea6641ff2287eb5369673d442ef88396a8af99e93bbcb244a1d039acf5c826981de821fc6aea3b8a67a53f6dac5901a6f28363905dba3c949604ed7236a3644a9b6d1017eb1cd8e941c86abca2d1136fc821a41954d0d87d335449ecff67ec623fb9c029f53f32f3be2d11360e633f706d2748a607f485e09e49feecd9b387bae6a92476177de7c97c7132ef3c69324de075c9dd9b142f2282e4f3498dc8b5fc493174950abd0524f74c1ade4b5e0a8a5bc6294e847c82d5b60a13279663708bfeb6f3a429086df4d9c13f4725b0bfd9196f775df4c6c72a7383e4d3b9d0e13d4e0a704af5571a52e8ad52c589fe7e168b567059b2360bd1c0b8cdf32d6776e5476e838e0ff0532eb337698be3de055887b4fe0135909a6cc3a37ecde764abc9770855866792ba91266219cf00dec127a88f34460088d903ee41fa62c7e78d0257fde0345a11fd5488581550adc0e3f2b3d51376b0200476b0d9a9e2de14b9f0f500016552d07028b0aaea8010e2341bb027c5d4115515df827059812ae8f429a8459aa92ba084fb0286b73d4f08c42b54d3a06fee2e7c0e20fb8f6233f46a6599907549abf1e2d46620c6c472b7024d0f101ddf1f9d937311e523184d2f0c9311129572099bfd5c524a34dfb77abfba45b8c459f98d239ff8379f318db86326c12e279f8e14fe439a39b8a6dd69361d1757715fcd744fd822ebef2f6c40764589ef029db83e336a538cd5ae5115d0c5b3123da7cd88f128eab42de9428920172dbf7b674f3358cfe3eff148a66146541ff940a1691478990c0a61ea228fc84a9414e0a5137657899fe640308f21b664f15ec30f0a32efc7962da7480bc98af614d93c1296ac7b1ac0b31bb023516b75c0ecd05cf883a5078e04c7f85fd243902072b81068fd06a611346c242e29cf47a82d61201d52c7474f49d725b3840a3cb0b23996fdfe6fbffa6dbfd72e49e32ff39120d2524d580ae5e7ba4e3d965f3ba3cb2fb6da0cc6ef36e27d272a01feedf772784e226cd4710bb89057f939c5883ef683f37e19d3cd4f0699039a78cafab59e444190f1fb27ea65e435f0118b0b966dcf06d0305bb8686148299b7583169e096826058c52e9bb3894d71c2abfa4908627feaae5cca99c969c84c991ea196664258bb2b66738d740b8ab9acdbe4ce64f4095fbc56f19278b3028065447f6654e2b755c7db12dfa602384ef5fdb9dc730dc1089552115b44382c2cce240b7bb0fa040b492b4568f9a615e306dfcff884e34ab7d253896b31b0a77e368eb5010467446f5f90dceddef12090daa89b87b05227b35898861fffc2a76dfbd41612a8b6589148890c3c09f60a65118f53436c008d17544dac7200e02d358745a42ee97295cb9ffcd8a16e260c71faa9ee15af6d5154cb476459cda72fa8472f6de8569e612a191cccaa30e13e93c9164e13c5981fa78704ae3055af0e5a279326c60de2f2259a5703db4913a213a46a86093b138110e2512ac71f9bdc7f62c0312ff1934c9f020a3637e71cadfcf0d4f87e326a0fa12cfd6bcc6f3c68d3dbbf8431cac487a98ff4ea16bb49797060b28bb921c6c37ccef53742165da7295168ec3bb017a48b5af106f3dec998e2078a6443532e22dd612337a1e68b981016b43928c8f7b0943df4e6e4844d351a7c9cddef5ad4ecf7821e082b0c4fa581fba7c2f31317d511f4736427bee828f89a5be1f39255ee5dfffdec75cc21529f94088ef0a216ff068194d314057047b9c96f41b2dd030eeeb941f4b621d893b4dde927982b7f346135f33c7c6087834e33829c710c46c1f95e916a15326472a55afa8daa46451a41cdb349c36f552963d8303273a8d05c82b3acc087b310aabfd214b18a698a5c59346bb30d95b10104fe3ac7957858b66a70699f21246393118c0767fbccb86a65505f24905aba433b1d56f91e4e9df4aae3d62eab3f77cf1ce709aa23aa07c4813d48df9c21e47cd9505a34afc9e18da98a2a0d2275d40bd5b72373036440f983a11ce43253d6253a3cea077d23030a00a9546c7dd21789d9511cb1cfc961abb2c417ee0b22e0bd76742967fec334a5d59450595b6760ca482c7a916451749d0035f0f0db8c1a712805d0a31db3c884d58d706ab83f98b76a3a79fe4a193e8d12d20677ffae242294960dfdc53d1a782d6432942033fbcdca4734e6df5bef4e0c7f21c6756b172cddddca64e742b51827428545427d5b8e57990b390fe42a1253130738df5b8343cf7d69a40ed0107d9592747e15b5e93f6dc03db210bd7f554e4f089452c58a45e8c7d94004bb10ebc67330ebc9e0f404616dc468a998564f199572026ca19ecf524000dda488672c023402568168119ccb780019625ad5983e8e69327353830c2c348c742fa7bd2a8265978c4616007b498a25a52693923bf4c888d80629566ea648041befbcd5b4b7a3eff63bf0f84b696c41da5d3bc97f55993b6bb8fa70e8cf5efd81a62571c79a6030f2ff409081668adea2fb1d70383902e183d81d22354a7cee062f5d47fbe941b1e86b3498303191e7033272743a10e3be4d47a99b3a207b342c00b4093f9f3b4f7e218f935bfbd8f59897f99630ab3712ecad127687df435d04270778e2bdd62363735618cbb09d364f69360f0334431d2fd9ac8e35d919788907b915c3263b947a760e75c3d800c06b1dda2d777c917405b0f62b4be2708f7e39316ce4ddf809a96948ff20df4221a4e65bfb00f894c787cf3d34637dd43cd55e42f06dc4f48438e1294cf52a26dd9c5e55b838d1c697f449be7eb91dac120efae1db48198237617e7c72d2b390a34cda96525fff44524f30d2099b7b616bc307d117780798105d292c2052b13ab1d61857450ee5fb77df447652eaca40152b299b83a3b4ca5d090c79d728c1f2ceb414b8778ba3abd8efe08b72dadf3b57c65f15195f995be764d7a64be92ef012dc1e62b23e885d373b4f2d0a457d7fcf83848059f32a4de52b247300787dfd2dc78005f6f65bbb2d35f0363e7095de68860c1a4733c5eb6b5fdd869287a99792092515649bd39ba0b6e6510912e4fcf4ab8ed4dfb786c344bff65a4113f9ebe49a3b800494e30d30575eed536a711ce04ed05f48d4b8d24c9ae93aad136828e90bff4daee52412fa35ff1a6d316c95936c90c79eb597a23ed2fca84206db3460657ec4e18850ccd3a6b12d5484017bccad91eb0d0e47477fe3e95defb43d5a3cf7000063dd88141c88e53596c73cb5acf0fa2e6d9686003d4453b5bc5facf2bb1e52bf37f6ad3bb29ca00256dcc0a9f5f458e4281482549fc358eb0034c85a28be75619d4fed60ea5b73ddd37769deac60243f0768738870afd4a1d1d07e2638b217bf3c00b7ab41e5f841854cdf8647993e2c879ae318ba00733000d7875051285561997da6ee48ca002be5734284dae74d105f38316a4538c4256316a9e017f1500af3fa61c3a1c3b8e698769bd9ccd1dec1e745b718867f7aa020c7a555335f4640aa129e59857c539e326fe3c5965e20f0575150bde2d5494f912f7fca240c18d3ea8bc5a92c0a3999f1a6608ba4a4ae9e4185fabc37c2f5b18e8da1d95657c7962c4651c79ff164112051fb885cd3f2b640350d242232380b366b496c807fc08b5dc789e363a0bd10331f73c67ef58cc3ccd5facdf5c4e92f11e93cdfbbbe76e3b2c16768a69a77c790cb1d14118ebbab49128a278c83dbd923002a24c73cd0e398085029b34d8030555c466fd81899c37443c58f009a97411af7c697eb0657620148059bec51e45534389b5ff45c398bee514b6ff5c6f56b96c94ab683a6124c42796347178d57b89e5579d864686157eb3b83ea7d598eb01e7851797d0e91a782bbbe2cf8374278143a78cfa556e1612d5cbca870bc3017540124ad8db557bca3c63068b996859bb37ecb50f51d6483a5cba2f79af592f0c5cc320555959ca5a920269032a2bd565b01ab0c9d7e6c62ae0387f02169954c17ac50c07565aabec1d599bc864085ee83df0f2a13c14879509b4eb66a87661976588b880d712c742ca9c27ae8bf91e2aa32e623dc56cb3a24c1ab0fa4257e20387b17ac8794e7b6588de2206074217e2c7dc837c45d9b022704f0f3022f091025e2ec7d90e0809520dd647b997040461df0bbae69f26e247844f6c80f04242f24f3fbc700d87838eaaed35556b0754b35a1e7c68640eb99b1bc9da003a027d4308dc3a1222ba64d9f5879a5ca4acd08776e47de76a2024428acf24fc858deca16c1a295852974b7aa51752cfff55a94c905904b44d0b11a5bc7796769c4b79fc2faaf3cfc2f33f22be00ed116a589af609f1970f4c501d369d525588f265188283503f07862c05ffbe4ede30f01f18013be03dd9aedc3ac590cff4c37c5a284c01f8d72262646bc46e38d612a526af509166e2e69e73aeae68fb960c52ac92bbbd884be7dbbe33077908f4073c232e9542967a8581eb90dc19a5a91808af7befbabb0bd97eddea155109de5e522b86d31627c88dea0c6bb78289202ebd1b7e8614e4f6337b551a33f25b4fb3a64be0aaac9c68ef66b4ec97c1cc3da6f14b453816c1970cb1e966867c9e0ebd1d44df9f089b33f56cb5b2c0092ecf30901ab1f994fbcc623548e0f17cac578b758beba1388488df5d28bd192b0901ff6ed9ae72422b14df347780689620e950da1b6087040a90574c393ad64bbdb923c16fd7e6f12acf238a75ba5e750a2c6c06c17f7bccfce268a50b48b76c0f906c5016cf990975810ad7878edbe361394163c9067312c6a244767ec47e406df021472a919304e880c49bda75074fcc09f5d37a68d051a5ce2ae550eef1982f08066abb1b1462280f22c4765a95af5dd114ca9065413c612843a54fcc4127c3c022db656f2eca2b08c6ce33c8f6394e05a73cb64f11d9ae4590c776bda8d73bafbd3026747a803d361ca49dcbc9578a49d99a0d15e6c8aaadc6329b0f6b1ad46eafc4d6ff38fc0ee96217a2fa9b5fca734da7c494e8aed08d54b8009df4a7df665e0041adec02954ae0416e60dbfdea07fa0915126ffac8073a2eb44093016b792c23da7b5def930daf2f4d0ad6adec7e4dcdf3ddfaf3c08de5182eed9d3e6be35acbb7a5f243899dfc40c73696893219d8de34e56c96cff3578491fe9585977f871d6afc0a87ffcbeb5610097db4fff5ef9aa2df1d92c4ce5314b3e7d30710b46b98dd85922fcab52132a981af87b20b1b11d916fc112f901bc43cdaebc8b56e160d00fd2e491b896298e71f1f6589311baa1d82c1bc69243e7a38f2398cf84249d61ec6b790f8f36b157dc9f78ac296458d5fca03c2c5e127664678be4577122242358b90de94804991026e257358c85f59a63e6e574f3d28ea166a84872f0da8beca9b05b5ee655f99900e60b8a621165d7ddf956e29dcb864c280199b981709ecb9652bc932f5a75a057bab5b62038bfaf512c7836b04d140e0ff3b47d55e436a9019271509182b6915390d09ede96442e9771c9a4b0d2729f97a715fa46073b982d25d9f452838143be96ad7bd2744b94044a66e2c35b14bc2daeadc9d9015acb487668d3d707b96aa14aad66387f8d6cf5a027fff438c3b5663a02bfedbd0817610edb748c886ac0ff0e23b5ad7c917cf389b3088c3f5f134d00f61986f591d31167805b6c3e8751471742717dcf04b6929c3f82fe91fdd539aa9f6d2b5edb353208107534e01497e87615fd3529c540733e7077c32dc78db6fb285424e5d5fe7d2261b420418f02af1a5f92b1d840cb4b4bbf13d2f8944b6a5a0c420beb1ce2ec7988a7090e9a03ad5e3c273ecc889707c84afd5d9b849170f6a3cf01566c3309f8195e869487bda58f200adc3badf85c32f740c8544dac5dc8194c2581c1550363babc0d5b3767dd7ec5ef1a4de8a344275da7676841c728a73b84ae96feb68063bee169fc0c5d017c31220185bbaa32ae59ae3a92d0eb74b9ddd6a2371caa93b3e8c561ee4b069530bbfffbe93213b4d1ef8fb00511b811dff70cd168ee00e68f7f9f3d6eaf7bb9a11d128b16e8df0cfa1a04ef11816cc120dade9739c14c6d66520005822bb1b8f2493b19cfb95a8a37b8f1c7426b79406a2df200d4194a11fc7f1132bde41c62f3adb74951ee7cf493070cde1a6dcbc3d85aa377c7cccdb59483b214f56569bd89140d6fd7111d220b101ee989aa8f6e523f414371de38614f8d07dfa50f9ac9e7899fcf7a87f393f050e1293b422de5fe9c40f231159903e382a1a8c875979495026bb4f2693260e9c9283a9903592ac833b9f739bfdae68745998770c0217bc308a175db573525c2cda576447c0e9b2eaac5aa5aa2404af69189d508ee9355c266dc0b83b4cca9f30b881c2b0996dea87215756e0f50606eaa9dcf61f2b1e8794645c21c49500189665f1146db34ae33acf99b0e98ec4f7cd2fc49c772afe409bbe5e5e7951153b9e933d1bff346e5806cd464be5dfb84388fd1832cd8a7a08bfb55a6422d2fb24f360929bbf695b63d40b750d52778371a35735d3f79b77109c628db94ebb5b39bf7552aae299c8b1a66bc7612ce8f2fea4e0d3b2f5003e12f95ec130138ac8327945c3dafc0cfcb19d2a439624dab49f211e06870d829d896cf7c922152283494cd13e786d0947f955f8ae7ed6e26e659ce60a9594f74becd1505955d140eb7b3f7c1614dadd0f618af8e1cbaec35387271a76ea32ea086f2087f276c5833b761411ef53d237476b9a49e7144551791435602ccef562a97040bd6acd5980248e04698423094dafa7d7503b9b37b0c7c391c05e2890d1d41bbcf3351da9a67605cfa54e10c3b895c990ead14d409d52bd70c07cb7be6159aaca5feb7b242bd0ea916a6b0fc13c52ff242ed6a9ac43f6efd0540fd1af57d68587894d8a2bd8614ab60f86abaaa5b2ac501b67bcb3ec201cd0561499289ff43ea8ba8e226b8aa45ec39184a5ad2f0b122f22adcf6b499790bacebd5d20a3ef1e73248de57b888643cfbfb62e1407610053c91291adcece7c637a78ba8a7b906eb8a05db1688dcbff23dbc452920a974fff38edccdc5adadfa29929ad4ea551a9d74eccd32b19104b4bdec344a3ce14adf3ed9ceba30b032e70149b24d0c80635a7283e844acc208f2f24ed7ff5170ece65bd9e421997780cb1be890ede45559701175168bf0aef52676c130d598a0a9a8c1c4df078a7f6c3ea5928257390c6863fd418582833070cce14ab54293969ab733a7c8e0a5b8a3458454d34dee00ad4f79ee7ce84f6f9448d713706cde2b4ce8675b9985162b9d684d3622abdce6d8d9791cdf7f1329cf9cedd9a4c36df1dcdeb47d5bc91744876acefe0b44be9df7cb0fa429c450f0a37431e6077ff999fca5547e2a4dd0f7444ed1e9f4565b801747c84b6d8c95bc1510ec9a296f32b575bc1eff1499666b0749bd98de672350ed5e48aa0153dccc9e701b48a0efa3a6702cafee83956a08cbbc942a24866780021dfce87fc9e1dafbb9d6a64c8c3bfec9d35dabbc64a42d2cc55fcb2f7fdf9882bc046aa647bb7576275ac877657efd565574e436c5c7abfc1a4de63fae3f4a12d9a11cc824ba577ca7f08777b4e266916fef16e1d17f70cde063eeff1282952533889bfdf383d7472423222e685e3fc4e945f7d1416afe6ce9b47ba79ca0bb9eb640d6c0e9b77a219e65ea3bfcdfe19a748089d43dcd98518af565bac02438f118da249f402f9b39519546d70a6a3b49f2d7c28f9bdfe50c665d6cf75c12c11e066123d10432590a741667ce1542ac25f938dcacd522b242e5821f2cbae5adac70ba6d06e3010960598ce5c428a60266bc8ec1b2d62c4fa859c930a3474cba2565b514d8af5bb9fcd19377e2b2d68a75f8b5e6c84c5ca16b2c51f961938a6ea26261d6efc49c72e41abbe41b02beb52c95bbd52438f0e041415f58dd6000ccb668d03c426c744f2d3f4ddefd5091bf56473166328a9f1cda2d3409b74a23c7df5151c15840e36ad5ff3fa27f8d983ae7bc4b37a019c64cb2ee73e396a8dc7eb7ac7dd03ae7c9a342d298ae192343df4c168774983988034f6275e5b18c29421fed0b54c4920714bdc4bfa74f17b880bf06336f134a21eda48adb165d2f7ab262936070db0e591ac69d2d7589274ac555bad5cc4106a59ab998b7fcb72fcf74c11953a84850f4537113eb5adf4a5aa9ea9e6e1959a9db9bc5c96be060c50dd8c971dc034d10b38fbd49ec53d73d94e623999d4c2907d5ba564dcd9f14ad91fc700f0435c2c8998745cff97e35334cd9632e47ec9231cb62839efb0ef46124f14ee303ff9cb5ec9dfd66444adcf2ba14f0250c67c26646ada42a5ce1e2ad8c5cef6224bc33e1cb01bfbd5f490a105b6711f2f5c8783582914f1266b026c1cd5f61b222ef8060f5fcb80c79895895b807bd6c869553fe30569199b1373957631fd97b321e22bf379a07e62021add7299640ca8e5feeab0a7de25269877780ce323006c542ca16f10ad502c927890146bcaf699299acc07cc759e86b676eaee54fafad1a1cdc1d5b2a3149230393c653ed2d2173161f29724ae9da8d78c653e3db0c582bdbaa8418199cfe291996f38ea9eab8c0bbaa796e6663e870106c31696bd1dd6075685326ccda21a6ef6d424804bbd9b6eb41fafedd4301338c852f55a70601b20b585a5c668ed6917c6f3d2a29286a4f8ea3d5a01faeca4d51042c4505435a92a6d7c3be623f04a48fd169131cc9480474cdb0064bf394e96943a5d53611a7a46b37ad8d2aa91b4237424872fab400d1f420899d3b47b7f626ca9f33c842eff6523679c4f9a6a2a8f3c0a1952ee9475fb978d25c2c253a9c297037270839da98ec33256460c90d251c53bdd15356816ba183071ea6b149a0a737b73f8c98ec98902d77c3c1ce04215d2e296c8bb421e3eed3aa09ef512ac2c6baeef01d95f5e9fc813be2d0ca54c5f8792168f03af4f5a42dcfaa2b46905b2a4285a93a6882c5485f547fdffabe0060628d38bbb89cb15bbc1eceac48193388db34964ced82ea0a62ae4d6b226ed11e30636dfc366debfc97b6da455ea39509ed44d3de86e076a2adc4e3736307b32b593111c80d390c24d9f2cb4225aada423258d8087210728999d0d9d9808653fe42b5526866754ca3939fa6bcace89181536f1061a186ded668dcb2a391d5041e17284245c552435403f2ee5a5b00a2bd713abb13fb699d76947b4ee7905c07dc813315468e06eb855ce80f4591a4b5c61b8be4eafa01b7dab89b404afd7fc601f86ce4e8ae53cafca477e93a36e5c47afc7fe0e1884d1939015be85f06d6a529adaffc3ee991a758a13208edddfec4c7deca8a5541c90106bfc5c3f4200863e541b3f62d74fa6ceae6e72dadc8e306a8572c640c2065298fdbb24aa831d1cfa1786efd62cc42648b400d6560823b948619a7f03f3b22c9f04ae766c35b33b570ef33060a36bcf1aca0efdf3afec6b3e7b8305867c2313d8d40acab2eef5caa5ac0ae4ee8a8ec633f00e2790f37eb36a45554435399eb5d2a5b064f0f33ab7b4915acd2fe0a89c8ce29e92b1810d4c489fbea0da523a46749f211cf5b0a922d6df384f491549df7cd659376aaaba17695eb8a26a29b1adb87f92e05255747d00b3264d7c9d4e6faf697c7a980512b79324ee371acf729a466f4481ed34b8db236bb1e1615429b0421831b80286ea40308a899696cadacad98ab59d43a826b3318a34ddbabd1ba337a8bb41ce7aac5e86de571d87e1c91290bad4aa7e5d034e025978ae14de45f7c1aa9f8d13b836dbd3b8757ba8887d30f9953229644c8dd154ef7bba045aafa72c5f1985949175d040c18912c7d9321dcd4bd204442979bc8748c200be23048798a505cff4ad10f0bb6d860a57e31e73077cb4f4d1d9413c398ac286f14180a17701c1a17b1953c7e5b92fbe0b216c482af12b8bab4905db3aad22908b40abc13c567a4fd89465c85d777ef862b1846307750791d7bf85b4904ef84f60d0468b0bb6daf8a462114ed4efc507f8788530f95d5fd8b36e86d4518794ad09c2a8afd7eec28bcec02a99fb5155cf3d1bb0b1ace063f28dba9e402bd2fe2596d562c882fbfc2b7f761a07e45746ae6461ffeedf956c29c4facf2bad69e4c88946f01b6623d6b0650ae01bd8de54945ee626c583980d6ebf71552019362031122a6ff5825b497636b31374ece3dbd42cd51979e5ee2a2fe8e67d2c598a3f23849c641c0f73b0641d4d2c92f5cd022b9900d1ea229397cd3e740e44d8770430dd6b0d25c5192e49c5b62876f7864787031bc4f205946e9c255d91de3ef42e96dc6d35675222537e7d3a0f3ff52644dcd94f992b56110dc8c35e645a46da001d75baad411e05fc4a0bc201f5cae0b4b8f5b7474efed4c9f6b0675aa161e362225add85e6ad5a054891df5beea98794dee606c029a937b84aa77ea8e37139eb152b99db73697e3af58a1cc6be18949e514097452c6a756d1474c2c6a5278795d4d79397972cb972b366a9dac2d5eebc4610359317a74048553be44462c1d494c3d423c07ea9c98e489d02a64e1753a36fd18c93f343d8685c92550ec021b8315887c50dc1a07a8a1b014c052360f57013a4765434661648e8560730881094fa6179593bc8c065d38f4a6fba3398e10acba88bc2a9525ed8aae6ce013b3091970e89cdc47ccc93622a007e2bc00db2838d101afad7c74a63364bbf9a0dae24d2bfbe812ca3b7903b79f306ef8b41707feb22aa920cfd334a286f35b021bff924faa519780cb4024f4bb8d448631190b05814c6cf0850d000a354c929ba6e75f997728c6755d310e64616f15e1dcb2a8c2ecd54dfe06a6d71b746fffe72a03dda662142d8fca5b131ceb9ed2f3d977058c01875e8cf007a0cca55038bd8184d2b6b225435c6adccf8027c8b73c0945d960a4dfd122de7ad5aa617f9a5d12315f7140b8cf9f141f769f200503ebc30df5fe8d595678c592187c6daaa8893bb603d47a710e50d4f3b2d137ded2b8d36be5d84acd7f334cec49e1961d4500711f475e7ea740e76ce7e26b8e3675e0b8c98e11a7785146a20117f7704cddff628a8a1ce737f5bfc3879476b109fcd490af0b4807dcbe6fd21732c545f666c18b64ed2a91f148334d4640f62708f3790a113ed641b9385243ae87c89fc68beea0fb240fcc5e608dde5242393a5dcd3e12eca74499509b14492618428c9402595cf93e311c97e9420e557104af13307c15107cab14afd8f363d19bbcf3b19edb84c2ad0067bf6c243ef630caa9565926d1669606b7c67438904f679c3b88c036278e1d8ea0e87715d3ec0674304c1a40acd75478ded3f598c06db26292cf9723af457958a47dd87ff01f0c9a3cf2b3ce3a09d71814c3c40e24c430f8d54b5d78776a97f053887b2fe5591ef1d0f430fcdeb370fc5ce099f687bec093d5452b2784dc0f9ac47c3394a12e51e196bcff26810306398bd4ce46b257c48b583fe0e60fa3b25926854c7ee2892c04a3832b56f593ca8de06a63a6da5d6e0b5b5839b50752234369d88d4c0422397f4284762f55c27ef616d23bb6d60a83a84a1a2c3ce491b13d7ebbb07be40c7047b8658666a825130f4d80e62a1641b57f9d05b489cb1b2bc8274dd6ce6eb6cbd55be7795cd40eb20934dcf40ba408c818a74ec58637ab6e5ea5699089511cb94e48dca449abbc7e793cc18e63291247e1f11b4f7211fd66232bfb3b288d239f86f9b879c2732119db738a4f5a24b004b536afdeb65c481758ee5a7b3ce414790aaf084c3ef1bb7490935e08d39dcff4ba2f4cb262555fc7232228bd73ad8b487cd511faa2aa2b761aca732bfc4c91f7d47c88032b2f9c0953467895c4af106b6e9925c810a50d2c9e57f0b44dc0d3d4eee7779b22a140d48b6689761491ed0b990f832412671fe183cf342bc132fa020a92f89bcf9b7205918199d0d16fecf0d0d1fe1795650a6484252977c64ca0facade113ca59c14769565c89cdbbe79f7d4476c3a31e40fab04665bde392ccc1f1bdb2ff39114dc0336809d35d52e15e31523cd75c28ca3d19e32e460613c8bccdbee1a91f3763977217b2a85e9126c812f12e09d8458f7febe799fe4a20940625addd6b5f3585d1a3e089aca4da0cc32d93d8f3c2a4614d107725027da573afe5ab7a42d672d3049d9e27f4f9538356ca6eb0187044a1efcd84e36cce25fbffe6e2f32643624cbfcc4e58c9686d11ed010d4c80d7ae91d2635029a0accac9768fbf6e92ac461aeff8427d180e51f8cfa13044cfc005f7db16bd39d3998e234ccefb985cb464184b87ddf797b5899911a5f26dd43e5263aa20b570b12a65beeebe3d26738da123945a0bd15cd30e2c0be48e175b6a55492878ca3c4928968d22151d6681cc2b10498227b7c6607d2934edd6346c34216c62b12ab517c87995fb4ab23614a3352362d4a150e2590de05ea752692a70fedc71e3fc670b875194e080fd4504af1a77afbe3e31766a3b1cae380b32a30b49ddbfa846c9f20b8a14d68f84250a7d0a3f966826b580507d6ad884a6f28e980c5cb859f9191aebb94846ffd73f116b44cf74d065ff323f0c74d6a3a12144ff5f9a955afeacefd19f4c2b971d0c79eb614b300a859ac5bf634759685e404a525c921a07346517814153e841e3c5ef373770725d278a92ff32580fb8d6a65564fd482471e374390fe3ba8ab8aa4946916a655fa78e426e359b31de093da44986bb1be7f8af754521f7bf979f09cfc4737989d04f01378cee496fcecbf3b69105ecb03f86809f16c0e2045c4750941419b97d9e0bbda38af4ba088e822bef5c9f2b5f96944a9b82beff2c5cfbff45c9e9562b0ed4f4dc137a4acf5591a71b2a29f6f8d43c51a5df74e3d400d752514fdc42da152d968838738fee54419faf7aca6e624e4116a4342fc082544c5ca9f3b9d507cfea0f7042b4621c5538e6f851d240360fd73663bc5e551ee367303685e0a66a21443c4bdafa5891598bb4f59718f20144c5effa60181908cb8741d39e969396a79518efd31eba6664c68bba1e1b87c04c60210c5a727f09b655532276e959931a7b4bdd4b3980b93649d3b004df3b1a8bd9c143460a7d519bc8ad066ab564bc312805325c8044d37a704dd2b14ca97072baa80259855c1ef13014adf9751a3d1da565a337a66993340b1d9bde0ff1930f51e1465a4439ecc67cb423accd03e7cfbf32e862d1adabde06a9686b6ef098cd120d6df1d97c710e076c41e20d729e0df5eed013aa0371cccd66e33ba2092c3c0acca4405d6e38067e50f4e1e4c614455a19f147094116f3a93a4c8ab9730ee7c669d3d585bc69ac20fe7fb309b1fa00cf9a95fe4d52de6dd84f65f880d9bfad495269721c59c16d08742e35e9713568594732b26d2c891b359e7b09ec2d1941405deac5fb7faccc7e694a29344f848320ad46c425b7ff2d613fe197a7180912b5b75a1ea2f4d6d7d69da28affcf8485a78eb1d63247ed5931a7934c78ef32c82cbf1d1e60c12f5ba8b3f1a09da752e8be1453765d7ceee544fed08b74ef54c52444363a6b1ce6485ec0b5087a40d002f4809b85d454096e49a24a945c285af7e7e14921201119535989cf93cd04c3f0d67f3ac584135c10088e66c121aa40f1a0741367537b019c5a187b9197f5f06458dbfe26894ea62a19dab4ae9be3a55311e11a3ee53b2c563e83bdc23ff05ad48ffe4764a033633afea13ed3d9b824825865521a6eecb046d3639b5bc49b0578340d7cb5a6113f716c2fa2e273947b1566d0a7170de60421ca56654ef1794c03197b8c884acb82512b366151db5b4de75320ffd6edb41aea1f43da7ccf58f3393ac8a2a2233d950a6c82a30d8a0763140c06d4b6d70ee37b493231355cbeb30ecc2ff43424923ee4f8b3bbb46efe8496505898ba07cb598d18fb59dbb4b46719af1bfcc7ea474dbac6bbc1ebb2507a2871c10485b6c70968e56f1c8395b0b60d0ad22b6127708695ff87ca14396452f7ae7a097aec8896c381e4bc811b6c7eaaf1e25700c699737d34951cf6c68547d7fbbc94775b6f2c1ed791ecb6c692d7df811010902f06e50b9709594677fd0d435d0ab903dc2078047442d61dbeeedf34fb04971a944b00ad259fc705faa4549c2d1ae7b5b84f3da41b42b2adf0d8d72fc8d7bd1b083b7234642dd00c79afa1e503cd351f06abf4ed24de84b54c7dc7c793687d98963d75515cccd20d44a51dabebd303afcba44c0d5595e0c98a7ede19c5620398cbede282c674f664b87532d51ace018289b2977d1d0c8e33560e4807f7787c9e11b35bfaacab00b6e6c3074cebb65780c1f8fc9ea934070395a2868d27f3ef5185b32950e936cd3004f1b364184a628fb37e040b01fafd8f301055dc843a3a21ebcabce7b5f951e1bd24a0f5076dcbd3f10438f1e3693d30513d826a0fb1f16cde2cc78f278e0f809967d6367e73ba56055690efe31748de5ad6a230a8eeaf60439d2c22ea3f546c3c746bd1fd822f8a102582410ea9ace2d94eca1837e01cebab4734afd74a7404d069b8a0101359aa97552fc563c78e6d3a37fbb6f9a73dc9d27b08a4a9db52ea25db5178a0b979fd238bfc0995e8d985027afed68b2912ac29e07c88e3f2a9c6a449723ac3b73ef867232711620c6dbfe133fe358cca442bcb82857a04bb97993e7a41d9af62601fe6e458fe8ccfc5e67eedf67bbe61edf2523be4f3f9997ab9da0da78286450021ccffe4e1c3c851be0c6dae5f8f27002580b4faf9421f933228cd8b0b33589a3b242e7d649b294ffd9c9bbae7d92085b08a7a5d3c2ae1c5f662718a10676198fd02ca4e005ab07f1641e563d4e7b1ae6ac53a8dace30188840f946c402fe48e9bdbd1e6c27073f9ae30b1407304156c655e19323c04bdcd16b4e60d8779f9d782722cecd5da15a646193d5f6294a50a9c0dbd2b476741db2667ee2d294b2a0b8ebf72e6f2a9a0fe5438cb9e4aff72f898fc1340256c1149b4a9da2b4c5cd48408afe39291b5584aa056e19ad2baf0a8bf6517e9d8dbeac7c9ea4497cc1c6cb1ce59636c13bca7a1553259b578f16846e190201ec2e40ca1ab547556e99421f5c7413fa03769850604a09298e9a015480ab679ea9f5a3e219c8bf9ae117e1c8e2251584a62486e4fce03d0dd68678488b046473c7efa1930e4e0293048432313792158ab48c151681a9cb22c52dfb35cd59892446b519ed81b039634813785d7d4b2b52266b7ab42a1b71b0cc94253c0ce888cb9192d13c627e0c46e5f9cd5119f2b82111faaadba405943b1f76da264b8d320b80c2bf83cc50d303456b02044ceded127bcfeacf8c4584ffbb8dea447cf5675efeb57e2ea178c47dd1892eaaa4352cbaf27d590e798d652aa757039c98439f7dc019fc5536e2976614b8de7bf378016de70a8386a1bfdb71800b5e9731999960ab31d5e59a2aab2bd404f85a6d05c0152a0f5676b65e20c7b3ccad84d1633dd21373e71356c079e8e5910f77a5e0fc44f55f04fd89882b6c6fbb3ea61586b3b3873552de643bf6c803451c360d036cff82de6ec8bb029238051de8b4d707e01a349f4f982bd1a03df82d12399b2aaa37648b6e80e0ce2ffd6a34a097268b649804317eaaa213c15f791d946b664dde4234656a03ea570d1305847e03e231a23ab481b786a86c5d40b243b4964aa82bcec0743d1905f1980b006c11986f2f2fc00e31da2d22600326a31db2d7e9bebe9a8cb78d487179d1e9dbc5f48c041b45771a06935125c52ecfe90ccc9c298ea727a9149a3ecc691305236ba7d9a7e4fc19e7b9fbc26eec6d7341f3189e62dc8c2deee6e80525b08e090a5bd7ebcb20f143fd509d7e063987b01faff99ea27062bda2c15e291ccb49c32edd71967f5c5f22863b7b5b37e42f519e0f666ac6fa305be3ea5c44890d6cc78c368499e62f3aadb147f782e94f40712e8437dbcba3bdb67e1043758888ca2be817d6bf8827b6ee368ae77d3d8f53d49ae68c7187c4fe925b608a5ce4134b9e037c77d882a70dbc16f60a5b6df7e677dee26e673cdfd54d7af19a656e556fb5ba3883d66df912eb0c01131ca2be6acaa26c84278408920536a1f4871e72653ca06bbdd74b0242b176951bbaab7f0e1f71e43485bf34948129655cab21d188411a5b473f40fcb404fd30568ecdcc56402993a79adbf30a2a20cdc71a045bb673f91ef5a4e8767892f2a5cf94111eb89fa34c5029b5c2cfd9372c6d2bbec2f73ec3332963fd8a80f70685cee4d707e0aa0af3b0910ebbe2e49690d278e8a79b43005beaee7fd6aec45d7168654cc99a5c9561ac5e03fa9d21b5c80b18339bc34ce2350b310b76c361f587bf4c7c95ce08a426a535d408859104ed2c6a8120f9bc2f1e5059d2469a7aecc23c31611261198891d5dbb2619c2b50ed0ed03841b568f8fcbbec127c020257880ad30deca9379f00825ac9fead5fa2992389c1ed7ef3f19edca5f7dacf2bc05df3e761ea4f1145d7033cc85bac55a4fa98816168c03d25b387b4a19e2da24a8fc66a1b341754579dcc50a69c4c32da4deeefce179da181109e0d22b293ae02577c4265f309a7c9f7641c67f634316feaa2507b465a076ff881ee208b106b3efe81e901de5706b62adabd0fe991f31ca8c74c7c2e984e6435df13bca58cc91c258269893a47bbdf6c7650d5ce37b50f17ca52fd466a55c70e908fccc4a3aaef30321fece308aa8df704573928370deb82a8a04988849cdbb6d16e6719c609198304a3eaf42bbe832193e7c6dcf41e377b64297cec1afbe421827c1212e9c7cee6d85d9a0d6022191151d2497bcdad1010433dbe7ed39183299296d8d235755f1059ef2849d28124cf91da5e7ff0b54f6e5c3ee5748d749c72354314804ddf56d4f60e48028d1a9c2d454180e09c01a3530ab5f931f0943df2b85555b6128de8bb466636395c395ad46a85f0a869e9eb2fff3fa2514e99eb7aacb893700b02af42942b4f2e1bdeb8a8146b007fe09d3de104829d252a2f0284514c4ae6b7158f116931813e6963079fec016569d79d33a0f5610d4fb130f8c40155a8cc0fd68aefe4d10a6bbfeb8c9f0314c2c5ed18d78f621e93e1e0f8f285bf5b0d57c81c6700a76da650dc611d232bfb20c1667148a66031384f23ca8daf1eb01c6ab0b5cca2578f4450095a500afe148680cb912fd37bcbaabe0ded6d7647c7880a202fc5779f718147463f69a05e21c1303eaec50d7668eb860c3e27929ea5ccd8ffe81e3d2a87d2a0d2d1580b8499e766fa83a5a554f237c90a77ed009fc77cc517c01a9e02b4c443879c7fa41276499a27d27394edd6ad38dbfc3639e0ee3b4b1ae041342a2bb8f71a4da87e12d0406eaef9cd5d2cadf6508877a281712fe37ffaa6d46b8ac1c6a9db563031890bbe57db034edfad54ba98a1e55a587e37726e0288b3b58aebed7d51d9acd4bd9387af84aecc1e244c32b5afdf51d5f0071c2ccb0324737e5511b370dbe4be6f07317a686cb9fe9b55502c3d5ce9a7137f9a8cb86197922eeade8a76ece014a02a1a5e3ced4211fb0afd5dfbcf751783954f8cd0d6bc65253efe3c528d572fbe1a4393e00eef57ab9c6495cb235cb0545dc202c05f62f40f6a487fc05eea300e483a5933c2f5271061b5216adb92dd9adeb4db0befeec75359e16861856dff06b2673f5df6b0cdb83f2aab2fabbd8479e0322d2b36be5e79a5d0148c4c795d7db97da78216258a25699c5a61ce050353203a3c51db27f27b8a9e2202ac6dc8b1ef362b09645d8610ce2661cd92cebc9f37ef5ee0e3b29a96da699121fd2223aab8d9fbf61ae544c037a20da18c1d0b60b260ef17749bf2fbf7845b815b2f9fd8693c1f3c441db41b3967c6b31a635dedeacba0fa96aa8ed6df488c6c0de6af13430ef40090f3d0b2d84b622a742c904aef45e193ec5e5efa6f850a5401885224d7827fd664b7f98e90798930beb8c0b18331751596a6520598bde09cab89dff3feb9348c70e3744e1aa7210ba8dc60c2b98d52b99b3074d57c869f7b3caa2f85160d5ec6df28b8aba7a63b3af935c14c9a48050b61748947a038ea6eed8844d9817ea55fd5668ea8ad81cd27ba123c870695adc8c12b3fd2397d5af299a690d101ea21456d31825972549d55015041d4861795e63338a33fdf6afbd9f2b037f178941f5151a5d9856ebc92f3c375af047462156f31ff9c78b8221595b300cc2fb5f0b39407d09a727d080e66521d83eae04eb447387c98c81054258ead06bba8c0fdb3d32a26624c1e54b1e4c7f06168cc9778703d10d3ddc2c92a5336b61f39140e018de82b281aa27411fb80a33921df462626a52915d41dd8391340003f052dc326aefa0cc15a503bdb9097eb2b11065181c0e3052862ae3ad8a1339f07b5128eaf0967a3fbba390e25b6a25bc7a1c5daa1a8f608c48f8849b8ac61d6499d8409716a03e891f92853fd4ca8b0755657a31e6113636bbec8ed9f4aea9496acab42ec816415d8b51466e2feec570207465b9c007435ead5c83556ba00a15f9c4b0ae2a15f1f8697cf87ce95804df298cbe258b42ba15709de047c858c6a09ebefb71f516fb0afabb8086d06b1fac9f2dc0cb8869fdd352bafa275bc7c3c1a506ca6d6f72b2af26cf06e13a7271af5baa2c0cc144a839827ecf357cb5b5a5bcaa106ec68a97ad8219a249b6f580c83a997b52504aee913a7bee000479dc23336da46ede05d76f9676c2318bf71dc05f5159b3e06f869ece01175d8ab05d56717279432db68b48a022fdbe8cc9bdb09f5a1f3540a0e8f569f3ba82b6bc3b084fe619d43bdb3ff70effc39b7f12128be448cf81836693f2801fcdf5a93f1d7305d3413b920f32a47ab624f5f9555ade2eb1bbf40d912fc1f24b728d1f9de598fcc0a68e40071c8016b648d714f44a6d08a08ff031504923162197954eaea896c6f03c6b08abd0a326208554532d30d21780287b4454de3e29b1f5e9586d7e46e91892521d17138df3270d10036c698a48c32413d29a650cc82de3bc49438c232b55326c7fb07ee8ccf9860e5f8ce9ee21807907cbcf75ae370b02739f43680e6384a3f0a66f5f5af4982caea7ab579eadbe834d101ea9f429944d372083b341a166e0233e13499aa4a871438d7b7098979acfe25c62a7bc39fe27d8b8de6ca48db86b19642c3c04748acc94a034bfee15caad757e4915acf81474078823da2d98c43079eb8e6fb58aecf429d3e1cec9e7462e30898faa4579538d12d654b93ef4edecccd17ab89ad88fb43b5cb1e8fb819daba488b1ddb827729c6a379e700506693dbc951aa2cb4cc58955a5ba05f4ed7397f54971d57838aeaf919f222701105e4ae7dd6e08287cad5b7e2d247cf93332b8bdc583bb9c524a8bd555a9f41e25e102b414468d7437e008121e472b33c1edaa05b637a7fa5569f72cd2f90e92f4b29c2002945a11f87fece088fa7c26bc61ec5effa43298567cf7de9f69eb7d59ec4f30171bc3fcbf072007cc3e7f910c7dd157e51b8bcd3b4552fef09933ec0302b31d5dda2c0661c9dcda9c7850733c2dca7f4022f1bf56900b60effe34693959ae49cc72775a8ce735f26631632b4a8f782ae847e77285d23f1975be6436ce02fdbd4cb00a8cd659926656fd2d039288afb73c3b6ff0234189ec0cb60953cb5e4ddf67d4ded3ac3dabf40f2a2400e529d7f09a812e98fd8bcd636ec4e46c728694495862898393250b9725af80c1d77603951b51f78962db3fdbfa53a1e1a06ce5609792ad314f623e37b8c1b279a8c57bf6b710e9f60cd46877462b1540bbd4ebdba32201d16480c1c8c796aa61dd6d97f84febaac548940d061678994fd0ab75974607efaf3e89748c940ca284422df47d5d8b8943b2a45e40b58159ecbd414a84e6451ea7dc6452afa3ba637af4b4ce2f0c0682ca917ec2e84bc8a8e00b70ca300ea65740f5a8f45f9dda6a054eb580fac07433ba5f8d1abd3355c9c695f296b015c9b5ef71557609b7c81ac1bd936ab31b15f024ce76d9ad93a2ed62e4f671b0bbac758d60332ac3bee7f6c3d3439597611f0d17dfa5e9268a16f609ef33864772ffcfc311a868055a75a25cf9c151347dfd3730c1373e3db8bc3ac7d729ef6501a341beab2d6ff9f56a1b85ea2e3c29cd3b72860ab03f39438bfd09c3812883288d7d19afee3cd1d080b147d0f1af7f18783734d14c219d191b643b01c4ed30b64f1f0fd8d0db0368131ad73464dad6ea036e3c9e71f4938542f4c5d9136d4204b05ba279c4db20f75be4d1a62731563e0fcc9f8a851a4126d40be2a9c2b61802fef156383f16e649a39d45c16e3d33e92bfb3bc3f94d0ba0b66db42a9a218ea28c942ec6653450d1f34c9c17a9728fc576e9bc5b73788d6c1b87dc75c3bd3aa2dfe22333eb378a2c23bda0922e4e065125a850fd1d02d5a65fef77ee21206fee3e306c2b1b560854b6c8ecb0a85baa433baadc156c5f8fb8132d74465c2d1fac38ab5be2b14a16a520b80dce812a1242c2f2b31a9748ee07c80013728101ef27b8341672bead7c1e099ae236e4b9537c4ff2662b50a9234ee344a43c05b5029409209775a646625313856c397242a664481839611d29d0454c7f3cace09bb0ad63d8dc93891ff5f86266e525e9c218ccb7f65813a5b7220f7c795705557e800552eb0f3648e59abe12585095f0486ba82cb6ed93d0eb66ec20e6f8653efd0958a558c787b94b582a5e13f25e5eae32655bc1d280cf1a7ffdbf8600e68caf21b401e12c9209342226de26843e428be653ed75fc96ff7e4db19033c154f53bb6801ad3895ce3f68c94e545a6bdd5dc8f665d98fa82c6daba53c9f76c2abdb86c8f7b52d7f859b62abff61d9b3874f7e2cf40cac4c7265bcd0bfc4c643c9e4c22124e08c6f847c56a35daf86162e96de0763839ab94832568fca545f87c4ac120d2252d3f9085c19d5ee2b6fd249f0d51eb7f17542285c68dbc5f9dffc1e796ba0f3e9d2157597a4c9bb4070408f9226c369d7009c24dce750e25e8b71eeff4eefeeeaa1b9097f808488784652779f248f215a2ba4bbac9e451a2b74e459ee97194def2002f7e2c7b6be5960909dc445525b7fe55fdfa8432407d4648dcc72361c8db29720828fe0e0183895d54a595037c5007cbbd833bb83a4476034838e7cbbb24758e881b5a5d366c279f51815095d44668b151b030c94fa731d33eaee30ae621ad093920a8b68004071a573f6e25480ad15cd71ba259ca06cbbaf357f87afdc9dad71f02d4417868fc5f0f825e3c0b855a2c4f6103ea033dcda0acd60b604803f90d1572024070aefedbb2e5700529aac10d8f8703e680f7674847e7af424c869807843a92418c6cc464c6a850bc8a13ccadf143297e1d76e871101f19686115640a4073dfc0b824bacdaa0600a274232b696b29a144548c3a7b2ff0fd916d8acb0ce10a9c16fe0b1c517ee6ed248e64bb45d3c4bb119e7b2d8e111f1e19d67094a17b8588d7d053ad5da02b687eeed67d59605535deb577650157d5b4aebdd022352ded894647d95de1a0dc6b55636db31cf40df8ce501b8891231e405115d7a828ad6efcbb9680297f5c00e3eb855e7a0c2fd5ffc180150ea4a3c899245a91f939c627899b23f14c433df2e8460627140538c0114b3aa591b690844ab729840e8a6f46ebc6067a0aa7bcd1e12ac6ac1047d48d8e8d02d783d040243905117aa91d0b3da658f36b5568a72751136e8b2e0727b0ee89b99dfa107b7c816dce7b4a03bf41f503165701ac319f2b7980479194fe00f9b4c93a88d0d4612364bb465d8f662b2bb6557199af67d88705ed043434e43915854ba0589447a9f32cf0cb4cd08e53a013f2c042f8ab8a6c8749581f249ec05d5a51d66cb87c3321f4db7897dbb7ae4812149f22cf62e6741864c56d19c0051f3e46a4acc1156b73182a00ca0433a1283e8afc66edd2328bfb3e4275488dca19f659a54346b31211a6c0bda0e7daed138e10c92404d7c3052c2db3b33e01a97de67e14c296f048e498b1f4fa70694b245e15a9a70c35a896edd81504f82ff0afa9a8e56ddac92a02b9b626d818f2662c0a6be421693327c8f3b94634cc25241c015b1a436ef4e80b85f54cfccfa99a92ab930140ebedaf2754622a8c4f522948e827238ca5c174f729460631c79a0e3c89dd5c6496692aa89b463b9ed88df911c80734153f5ed8bcd9977842c3e3cd020b695933d0c59ab3f24938b600c45dacb95096454352d404c9328ed06396aca9307ebd6c3c30e4b03dd6540714bc23cba09a944940ea3ee4b292179b8da2e3dc3d7b60b99658c40996cb7585a7e264644aa3a2dffe6483b8de75bff63efe29a914af7c0d3e02b5f9a51910dffe098bd1e563407875c1a4a37fbf8a1158cbd841a945c45a429e310e357d9cb21cc48b8b5207213d01126b883d363221bf6c724ef0a1a11f7d9b861464e1a4a86b1788c15f41b508051ab27c7aa01aca5e3ac3a75cce92f3fb53d3f715e1af035bd0b6689ff074895c02d8f452c25327e088261e27218feb0146e537a8bf91e837832efc226477cc4f6ecd85e92abc71bd815a3b330492c0f9c73647104b2cecc6b2a76240207a01ecfc027ab8e9595c3018d6a803e9930e4b953b4c596fb74ff5422e4949583c3b424854ab148d772a38b83340a409217dda117218d5c3107efcd808ba1f36c08f7f2bef4718ab2aa3f7a5c8ad0f8645ebc7ec0a4ef32715297a7942f6de5b4a29a54c52067a058b05a105ffb18f7dec63ff1314f177983eb6d882a21d2261ea638c31c616d30ef62c983314e90500e428bba0099063b2a4903133c6d21af790b51e1e0042b798b2fd674cbef87fe2f73316f39c6b562628741287f4e9eeee35eeee6fa79492524a29a5a94b5b3e9b44412ba2c4430fb71546a9f33d7c74b04489fb0a7e0f1a7219cb4862d90891eddf820f5acc47f2986f28ce189aba68cbc31a8ab668ce5a7fdf7fd89a24f0def324e87ce7bde729d011676acfd3a4c94c8cdb3fab3cef3d09baefbcad5a68faa4f776f71d201ed034fda7859ea0988f5896c3e480bfbef7b0b3cbce9cb5b63eb69cd723e2b0a7687f079bc3fc9a3bbcdd6dcb01fffc39e705ed8e3c7a38f79cd35231ef3c7ae8ac4d5b5df71d90070fb54ad92833d7e86d099d575915cb2a1680b0e2052628c91207169934c976cac4096d65d5d8b951a9b2eade94aa86eb8304d6e9846a2949b168461c954d3e9d6ab5b586dd2966fae898b866122444989079c89ca79951f984d21f10f97a37e76ebbd12bdf4d0ed3567cc18f6350d7fb39ffcd1b68237fde597fb4675b73b6b65e59c6dbb6c261a9e28a2a598c51eac193986249119188e4e3870c31c0648eab89b5d6a668907d185321fa0ad1765ba9919db6685f39b32bf35024cad982315829dbbabf8c89bd44f245f47a128389ae8ccaaeeccaec4ba4442412754ab0f625239365dc6f34b769a0fd1b504412b4db2a730369dddddddd3f1c36674aad0d293167be77e508c6f3d33f98fefd4053c7d6450433f452c10c629aa08b79edcc81df1f883761d81e88e7cd20c4a6c94cc903ef114260e288922c15a96f65647e0e94e7dfef079ace1df627a86ed9b1819b3bb699058f19ba13ae59d98cabd40e7367d1824ee6c0035918a73056a9eb03c65862399b4d9488a672d6fafbfec35094b3d6dff73fdabe1b551f16682fc53cc834b90f598cdd81f2f6dc8b9256d241479e2684f12af9cb90e8c84b24d2fc18418b73c6c32442064458dd6f28140a859a492fc044552f809dc918e9a2cd1c3f5b2d41d0d5431b831291eb059cb085e38887cf3a690288a1e7cf9487d2c339a5c4f0c20b3870dcb8e1dedebc4ea7339f13913068f7045310a2e7a31c464aba39937eddb0dfb77df73770ef75b46ece68c855a829691f82d543fb0c98a894fecd02d49e390d943051f8ce72ae5961a711066bb66c39452a0a26f7de7b53f882510c41a4c4430f9d21180155f10224482939c9c969e2a49c208edb5c9d239d94b22aa9619d2101906618fac1ffabb5d68a5f8787734a1a42a9ae95b44b45adb5d609846a8c21947a38c009c2a0952e0bd9a58649b428da220a7e1b68008d45fa8abcd21ed6e61858128ed7e93161ebbdac9cb3ccd20604bcd4799ff9cc673eeb3a949e76ce39e7df19e4bb749a333c78109923042310b2fd69105ae333a7d191d7d16dd6563ad2ebbc0edf42bef863d00e1efa8c8ebc54729a474df4049aa50e5e627252eaa10e512a72bf04a50878a903eaf040323c7ab8b61c3d9d509c30913597e23427e453993978f030fb6c4647526ba75586fc7dd01f9059c6361e28b2c4556bade53acf8ad759c99e8ed7717947be40a873fa046bb6f4524c73feb23eb910eddb56217a5a8ba4a593c8110f0983229d84b6a871c7711bbf39325572e792779ca73695504d73200f2998342ce3b8666baa3a0c9826d39ea0f4500440e6fc219740c2d417e27885230ba393398caa23a08ef0a2c1685a96e7933c55aaa9b21b0aba6e1728e8f98ea7ca51bea24e7b91312c5be4274a6b3a44bf8586070db90b14b44ac6dc11063ce439202061f01809c8177f778182ceb5869caddb3c7078e2a1894486fcc5d9924186186278e1051c1b2c0a5a9caa4c35a511032dce9664823ab2efcc3173083202a65bad9a07c89c6de5846182fa7b6fc2b580c912a80d4ab32629e0e3cd495d4ef9532e9922e7c696d38bc27618dd01ae9a5693f1c855a93a1564c8557881dbf7de95cab25055aa239cd860f06c42c2e4d750cc273e40f77c5176214a2afb87073460c1d51c2d1222d26baa547a46107475ce082d4e55e8211a5d5f14b1e052f4b5aa1a97e7879b47cf9c14b55aad56ab01c1585583ea42860ca2608cb19c41a3e59fa0ab16df5dad75cec9029225ee5b4096666b203ba32b797a828e1b48b280bc3403344b2d3c4c2a80d881092ae73d8902c5113977094b4a453adf8388081f302915e9deed94c7d8daae6b6991f11f8cadc5d6d27cb72d5f6aade761db4daf034a0f413a78788e8c995dc8113599be408161845759b9b0e98432c25afc568aa55919a0294bb5a5625046870b578ab12cb5d818be7985030f89193bc3213575cc8f8bcc85a67748d63f66c875551e21b42867ffffd7647f88edef72d559e794d1c10139c23f8503f20583e23d897187a041c8a5c5b7f5de948a0573e1388ee338163772389c8ab3d9dc3df57af988a3f190bf7727c61c0d1172d4712819334f983b71a7ac5ae14e74945146ec20db5fca2696f92b66a7d0db8bfee282c811893bc998293926b82192238206bc3790bb912f270f3f1277daaedd3667e25bf88b3badacd4384c3e9d38ce25088c65be793ee868f3216534c3c8cdf3d139627e970869062418b4e053c1fc3e6f7bee3befc58f34b10680c897890a41d741c1f6ef308d0571f0e121c907beb51a909c6b562bec1d23f6fbac7d1468fa13fcb2187e3e77fb7ddfbd2e20a078342f06efde9b3299e8486a90d4f5ca170f71edb3f260b6e6a107a3a32e67ad3dd8ee6299abde180aa253759ec9b3d92e769d6adb388c4a8bb6e6559131b127c81cd7051286918e3ce03579df81e27b3650d4e235895dec7ae0b5912ffe1f25347db153b56e1452b4aeb88184b93a9030b6256bd9239ae8541e285a231b0909b38484c9dfa970e696396ff4c6ed75e207db57c891b5f1901199c30e91304c198337effd2df73a38b2a7f8d99b9b2d7e48ecf9a245628bdffebe4ec7ebb82d639712598e47639102bf9e60972b744729b518e450d05cb0a234b1c11835a022a734c36d2d00119300520e04c030aed46a12be241229678b99c8b9f3f9c2ddafaa26e75c699dcc2107359a6c8aea8b7b254d61097d535842cfaf610350149d3d50145d97d09e2d66a7c1e7d38ebd7fedb55dce3278e87f5f24ddcfd7e69011f769c07b5e1974907e766aa8d7e294aaa6a362dbb64dce6628f95d07eaec54ce2bf344297530af6c31d3a811d74a0d26db14910fdb6489a14f305b8dcf9f41b64dcae0bdbf8f91074e56963378bf81b4ed27284e1b71de6cdba4d250378b8e9c882311b54f96bf66153eca17ff188811dbaedd363c839cb63ce3b68c6b56382ece5794a470beefc362c70d1edaeff3f6e4417bf4f0f0c4c3be286137580bf6f0d045546465cca499801c4d2164c8bf334f3360f3c4c3bc290fa52b36c5ce1e8e86b16183053f7ef210e5218f1527aced116a4f79337f318d6336a6e90cdb1f033e66084187b2d0fec59eef5f58408ec2fa0f08f76708dada2cf6fcd8a461c0478f970c0e74c4010490443c3619b3b5c7bd3a0a9dcca106a724b092d08465b170514a31c5dff7c95a0a4768df186f7f9f4e3ce7c47352fc348b95d28cb1f8c3b618d1a265b5589f8c99469eb0b72256b0832d86e2e7006e537cbf2fe79a95abc3ca39cb2c65f2b7750370e2541b4bde0c1add83476184204adecbd0d1ff4b76834c03402c5ae879ebdf9fdcc671d407e08242c6d16dce074cd0090f3c7da9b3523ce46f67498a68c7183760264300ab25369851940dc6d8a2a479ae1aa876cea1c99cb92d958e0364ced3f9acb0e57a6d5b4a55b3b2f134e1c2184b3cbd5ab79c73cef934338b5efb4e703ebc2e0312cfb0e51c9a7fc3e28c8849793d2191b2d49ef232945aab83fe6d2545a9b6d62aed9cd67e8ed073c8d71b9debb4f32dca6140bfd71a31c53c0039517c4625167b11eda13fb353c38cc3d821331b1134dbf589a3e9d3f6d7265a37c3d1b82a26202c8d8e384be3681c8da371348e36e387209020c1c963962d5ed049228400bcc4207701a8b596525a53e3915db09634499decaa090cb6385d19b5a407335b9c4deea962b1fdab87c44fd006fdb99aa4098a739c77aa2eca4355d6206da1082dce93ec649a81a19fc3073370d5ac5448748de2e160db36b9c94992ef7314826c902f0bc8c20adbb50085a621b8a9175bb88c18cad7c5a0285d9bb4937af06f3985e3a2e5254c54ce2f99c9d1193a418bf225c3a3010ec34510b015d786f825835ae1b8262a5b71738ef5484d2ca6ad5d4062c0616c7d0b5cdab4354b93b16e039cadb4094ab8df9198650248a8b9f12c46206d23b76d1e1633960e40036e7c444afe05ad9fb04fb866c75251efaab50ea90ba52ea30bcb25e692e372c405b6fd5d6e5c5e2e515c5a2e4ab63fad34461a238d91c6c8593adddb9dcfa55dba7e476394317e3fa3879f247cc60fcb4321681b346e760b8d11004900e002801270caf60769a024db1fe45a21c90a48244c76c918dbe16c57c18bedafc24cc6cc7741b2fd5d5a2e445c8cd86e8b90a3cf6891a031ca9724b4f8a9b1c0032d7ec615884898959a154619d3ad2cb1c2cd5e6942851ba38ce19e8589ed2f63ac1246b6685d3266fef8b9913136255f8a4818bb0219fa67b418bb8c2e23c62e23fdac7c650909f369e233ae34f1a92d61d31899c8ff597d9ab03346c6fae2a756b72dd218b76715a07cc61b446a3746171aa3cb783750859845b98c32c6b22435c997daa28428b7f862a3e48b73a9edcf112143ff2a5aea131685922fd3655ca1b5028ecbe832ba8caa9a102663acd553beb2c56cad552253b15b752299e8006b6c1b0e7c12089a82775cfdca359be190aac254739e32585ab4ab171d4d9692bccaabbccaabbcca2bafb5ae6cb6ac4b3b95665c8414d5bdee5fab65f942a70fb2e6a66f882462bb07594942d76af76bcfc3359a32d3d064c672d63ae642145a7cd7b5b55a0d6396ee055666cea96bd8e024169ad1f45f32b29ccde4a22efaa255a14d665446a950188d9263b11ccb33e63370efd22e57b8c1b9a2b3598dfd2096632a558eed0c45e6988c99b11c8bc9c8189ac40639a23b98217feafaac78512aa84bbe3c99b90502842ec09095a0e9e7d87402e583b960b0272e97ab6685b399bc2f30c65882240c0c255edaf378bcd72fbe07e241be9abce024bd00f4a7dc59d25b6b67beeca4573b3b30ce201b366491931dcb04a434e13ad00ff0b717e52cfff036aeb1b7af2091033b5b0288a16bc82b90884106974c61dadeb9c1f33768ef57de3b3cf463d0c57ac5d3f170cbea3df1ad59754b382ee74c29f5842fd769082168648cfd5edab55b296ece93ebc4e1cb71d58b3c45cbb8adeb5c4a8e70efbdf7e6178908e967c88fb117f7b284a1c5ee0423841cb1bc7f472363e6bba04b62fb65d12b9e6ddbb6df3c2b60cea76b3d5bc6a7bbad64cc81e2f474b8ce5be1386e5be1386e5be1386ed35f4bdab3d2e13caee338ce933dbd7204d838b26239476037af282d2578ce99fa7213dbdd5a3b23081e343467483e626851c2747091918de4a305100f8cd3240245e334d1b8af1d8ffb69296bde5efcb62c61ce719b13dd7bc061eaa8036b05a7a9f519ab8645e0023c245001ccc514e19b612b506c9bac5bc7db3e219fd7f1604f3c741a30d0f2e64b691a877952cad123d114e9edbd96769299e04c579ddb565522983f00b976ab6d422c94fc6ad26ab5b8158eeb498dec64273b29a5ccb2939deca49432638cf1f453a699669a73ce9decba558d21baaeebbaaeebbaaeebe45311e5464986248c0564d88210babefdaeeb501dca43fc62873a75b686c12642322d76396bad013aea50a7ee44eb58dd898692d0180cc1405b2a1e7a47471c6dfbd9d16c9a861c831daa3bc9b47db13b7527293bd1d146db404ba32d43b4d89df09d4fc4c846225f3a5460f7de2ddf2d2781d22d6f3590ae75a954abd7139b36405506aa39a02aa5ba8d22dab7e8b21a606d8552a03dd796a653d6c99bc755ef358769797fafe2f2787e06f80145ed9e9701aa583c2c2c9f4155b8597e82e2b780a4872c5f459be5755016907d0d12716c918ea398bdda12f5165d07bbe7e7bcdd684dc9d934833f70dc684de1e22461746465b515d656585b616d85b515d65668a38cadf932682eb80b4d6c32cd5a5b6d9d5f8d975f0389ded1f23abc73791d2eef111f5196046b4441652a10a1c59ca33fe7388ccc4367c108fd81428b3f62d8f357088296b5f6cc57a35323cb8b568a7ed152715b65b6c5f9ea4173beca3cbd3d906a1a1d61d8bde37cdd71beee385f779caf3bced71de7eb355f17c44daa49835c402eef9d1d57863cef9e17b3e745ed7971822815a7b42357051a083d55aaacefa82f08fea03f35d0e20e77b668543cac59a17178b827f83e68f1c51f385cc042cb7d5950a247dcf14ea03b2f52da1da94be9bdf8e110fe7c4b3d901364acfc9cd5ca78b903dd323c55e81c3620e37f4b19bf22e6d9f697f15a566bed197f8313c5166995181d76f800def5599e8586cc7e5df9f9d2a1de1de896f15df570a0a3f9f2b4d0e2dc1f920c3744317ce10b9fc7a1bf1b9efe64af5adbf2ba5ed9f23abc82f4a7e56967c7ca772bb5e527dd2d3f3b0c902d5b460b7859f7e68e4fb4285f9b29969fe37214b47847f187a87b4ac5294dbed8eaaf930d5905ea65a22e25af25af269698b678a36cbfb65297c354196c771a1dcdd76cf2ba230b516891f4816e0b44f284d0f6be486915a4491d3290be1bef211dbde0a15befb52cb42529a832b36488992543105162736da534d36638a8888c83712e1dd7945996a065a82b08f39a4cd65e131d392180182653c773476a63b766db7878673ce4a94b4343dddcdff18e5b9eabbb8403a789bb4f6eecc23cbc30fba188c46d3abaae9680f30e0d3e524881dd1b86f7be20f28ed036ee4b31ef0c027d373c0c3f120e5b2f8ecf7031ae59d9c06e16d79573189e4e2d10d1a79cb9ef9e9e6e901b1a8290258690a3eef33562fbd7eb7544d0f774b2b54f165ab435dd6da1bdefac82c8989cb9138dd869f19d175abca74f179a0445ec93c0766a00c11b3aef01e54c53a72108241a6087bb92eca619f5459d4223e86c6bcefa9ec28cc370db6a5638ae1ddc7bafa41d05c9bff7de7b2fe80373eb307fc8970e540143873943be5b7ed2f5813a68fc309be180f12cc7da1a106ee328e536cb6dd3d6449f3f833c7af0f05024b2b6c65620299514d95a9903282940115ad2b495c96416caa41bf734cc4d5f763eb0c37b1ae64e42e7570c87fc1da3a349ab2fd68bf562bd582fd68bf5baac0a4e2997551f0c6d50efcc3d5d9a8bbaa9abf270756deee8a1a92644036d6dbd29554679637c38725eb9817e960aaa90f89d4ab135df948a0948e0689b561bb5da9785d9da9db14fa8a5515b65539a5a82039ced3d1c46b42f98c8cd367dba042767444b74ce269bda279b3ad9e26783a8d09d6dbdd1ebc8e877d9684cdf4d678ecd76e67733c68bbd1935d0b9b363fe8c21fa5eda07ee4f8b6d116ac020904fb6776a70f981162d6b8af2136a59f6354594abd9666c33b6d8666cb1cdd8e6bb813622f40db940cb3c4d574c1fd30f8ba02bb52f2e96031b5956e7697d8a6dcea65f3ba0222cd6b4a50b0241deb6764054bb77eccbb2ecababf8da17b5576c7a83ced7e19576be4afaaa1c2d0521f76e99854ade5ebeae95912df13ccfcb4273dbdf781cdba7bbf752bcaed3b9611df1e6e58176d1389ac3f8ea86ab42056563a2b9370a351a4e675f1a1d655a0d542c18f7de19ebca74c44d91217f4e0c134703438bfac4d1f4c95734e49fb3d6b499293278dedfca2c1832e4230fa82dcd53c5bd343705de99ee895b9a3ed151674486fc9124d9de31d9dec19ce858f245eb16cb43cdca596ba9836822f410cd449d6da8b40e38e518aa110000410013150000200c080583e170403420962c9c7c14800c5f744e7460409709c45190a33888a220638c32000003002100881015ca063812f0ce467ec3d87239c699398997b48f4510f6629059760e1685ed6328d98c10063b159d1e59edd12711a2d9ff10acd8464ae59f160752e116387c55d5732f6735de722ccd76cb347909efe491a9104416ce3460bbffb1457fe410dd5f3cababdb3039e97b56d0d88326031b0ba0b469ac019ba00c12d38f3d147b09825a574aea93efff4eca7219e43a20e0ba8413feb017b0bb499bc23e95562110d915461055c016b6e03592aa977e827ea24b5add791792fe13f19494a94b4730d65f5437cb6ba592ad050ad711422e74dc4fbcac0da1cc3705e2de4edce861ff84559b590acb149c021564076b0add70b0b0216a7d61d3d18861830e9c82a9c2151833b48653c0ddccb6ba584b17a672f3e8edc86618267f77537bb10ab088eb4be2ddcae2c2ac33f0eb37d03b1ec432b12637812b030edce7b294f5a391aa483b5baec777e134199c125510c855cce4646ffaf918fef36fe6356e21a7ba7b190f59a5957cc0bf541bd23667aa704a356bc92a43eee5ea174de34e90ff60080c2d9fb1e5f512f57ddcc2fae46b9e8e6f6a3c44a6a21c5b94505ba28704bae1949f0e1b7ba608eb97cfaae95f737e6554741bed0102f527deb2fac199df53de3502eb4a5a453da781704cd7e49aa349afdc2db17eb6562f64a882b62ccf8799c663bca81242c0533ef476a4a30d29a774cd14fcf51c5c61b52c15a00fb57cd3273564aaf624998ec8d32355156831607176918520262eed5b1c741becd419e86ac85500fee571bec7870534e440b0c087c631439e12d420b1df0a629f210b3fdc052132ce16af60418d7aef2951a851d7203417d7383222755404b767f7a76921a4bf72a060930db7f29ae04afaf0bca0159ed9c3a388042b707a8ddc01ce57c382bea7e7e8bb938eff95bf1f2119b89ef14f3508ddea863b0a28313a79201b727fe221926655b51cbdcc30113215f5b289c465fa3dd7a241c82488d9d36f0f53139ad55a170f1a387af962fdd7df53c22f8571b191e1f2cfc0dc427e4662daf1b199b0e87a81855bdf95b223e279d8f5fa335abd726eac01b4a3e34b1994defbdc8caa7441f394c3857f8b6fead0a0dac1c794a7158b254a8016711c77ce0c68a90d13e67fc57b40c1c1ec1be2b2df93e6137e74814f256c678d96e8fa455ceb7e0a27bd0e774e1af45cb73aca83949d66b78fc93ea0df65e59ce6b2d75d53f92eeb373832689c72365e4e054f845c8081ee1d563868d3d3700085ae869d9f5e13b18213c60bf0081acbd221561cdee47c26487c8d2efc4b6037bbd15c9b034ad3fe52aa48e992d92deba8c8a5020689022c906c973355af16112335886840ce1fa18a94deae144ea8738db7d8c59a5c017ab517b8a80704a110606f5f5c90a5b465d16489238ba4615ea36e43d860a58a940be9cdafd4300e0fc3382395e30155a4f41d0ae037fb91f2ec3d3520e2e246306fd19e80f207d8bb838e43e9f3b55eb14e235f0b47936d43ba6d4480c28fe6e5348548a923ae6f7441e6c09a0fd611e429d0dab24ec34c7b6b08f7985d17d7889e2c38a07d8ff4b2d2142e2fa36b48e9a491d02b054b84cdc15951d94ec7afc66e9b8a7525bec02b6222a593cf0ebc53b825ac902761a6551ddc9a129f393ff426e149d227d121f24e186c0319f92e6ff4a10753829c2187fe6bd2c43b90b94b78581000257894da9bfbe97c189cadad17a10639ddb4fdae50c10c2c0ad80ed7ce6f9396aab9c9d33c544c856fba7666707facb6c9838653db996704af58ed49ab9d7659387122fcc9981ce012a00446b86a2447e5c557391ce5109265b94b739c33b4a6038778eee2f1bb056d70bb921c3ba34b56f869a0b86eec864356c98414a928c4d749ae7a126a50734675a72c2bc19739ecec321e167c28cf8d5888b81c597c0f90d58279cef4f654c8f66a4a6ddfc27ca7420aa0d30d00e909b3e8a1cf9f3830a0382ca878d2a0e125a41e8d6fc09eb239924287a4336dc9b77fb287fde5144910a17eba3535aeed08fe7ba2cf93acc3a2d5fa254dc9442b67fda49e1fb2d096f8cb0e09e1c9af709c34062131875740b473afc4ba864e1d405c3385f3849b6f7bdf8a4964f41009c79891447a889aa28dc34db24d3c303f8fe3682db6713dc4f074d6e2ba3559b9bfb244f277945f02c34130a59ecb836487ccc1434bb65ac5d68998791b25a82743892c87f1e66d7e48d18d261d17fd432c711bdbcdf4bfcb52f0ff2b44186aacc01a9fbc41c428a4dc2dff305522c9e3dd7bdf76f8b1129a19737d520ac94ed9e45490bf2b7de22798cad185615a8b9907d09cb496ac27027ec4fda58b48fab036876fa36fa24a363dadd053ea7044c161d11dbc22823fa486094d0ebb4f9ecc51dc4517fb15b387aad41408875a72229263d9021c59270b88a1e29f240c8ea5c13fa1bd395017bfe98aa2006f7874504eeefa4711e101bea1ba30ccebbc662adf62c0929d054b26b0627143560555b9ceebaae019e5455113989af953da40a73d538d53f4c1e47671bb406c77d9c0d75d636dc15fe1fac3b3ade64f330b637fff1634c8064ede1c814a4ef81a4d43814e012e666d684c6869caac1a043b4903ae834d3ab7418deb36fbd5145b51d5c2b08330664e7a706c37f4bedafd5d7a10a8f5737093446ba891fdb9d7de54f4ac86f72263aff68b93d63e2dc617001ed980a26ac7b1b2e62fb87fe714cc1cc363f9399efdbac96cac6cd69f7247004816ceffb456ab9ca800a89bcb696ce5f44f699435be4a250007b80c2fc35bfba5a2920425f6e5d2f8cda4e0bca0a61d506d20e568fa58190c14e326797e59feedfaf532e0da795c33d54c214291f92893193a524f089f2beb727603bb1b5ae80452c4611b93fba1ecb89074c1085daf8353af825f7e7975d4417f8ac11b3d28d42f966c8c54dccacc4ea94c2444a67720117cef1c76c7579674386e7467f03f7ce6718f9e29a250bbe01f6635a01e229d0c8d7279c60dda9b5bf4e9ccd8f74b0beab6f1cad42604e2e9a5741c94040f61a5521e0d251abeb1470bec1ec60c35f3e84fe79a4639c659bf8e23f6fc0b4dbebd8a782fdb387051112b79a191450542b7632c35435b5c761ac920b1d016a66e4462b09a46583c2a0d66f13f871fd4b86c3c8bfcec416d1ba928c25ab63a25246c633a49264c8c88a56d314294bee6cdbbe2f1f7e710b6a9a5ac93042ba48160b3c3dde639b3aa6a4c2a62a1dc23fdef64ba8b40b8c37a805dab7983d2aa945102b96ad2a575748aedc35c2cd30cbe66b55a7f85f57416ce7ae09fc0bbcd084d0a53255c35672b0200644c8fa9dc7f51835e571b25767c6c9a91d933a6569c2c6e791fdbb71afcbf03a41fe590dd898c5299ad123b28e637c44865515ea02f140a37b3cba16a941b454f83e62352fef469a38ac5b6b1ca5e9079b12b924504a37b743d756f59f8eb2d1266b9300fa8ebcdf7dac6bd483d43623a55cc418962e3be9c32b24c1f4200b69c2435c3fb5a444d78a79c124f46e07472d141bc48abf0740b85c2f95a16c441f419522204ca346750ef5ebf78d52ad34a110178863c121c9515b435db2c8aa83c63aeeda0feb2a3d71ee12ca71ea60e566bdf7ab4f8950d48e9d7be36f0cf1fe047c7cc079bf5a0655fc0a54f47f66d0ef87c3a697e3f8fee183a3ba68f23187597f64ad09280f5f6f117ef0b0cd6b1438bee398ba47fa0f911b1828f27c5b7a2e21f706f72334db752a0128f8b43b8ad208a71ae107f2c26d803dcb31d19f4800fbce5f83d1674f6c485aba05122398890041320fbd7c4cf1a158513fc3e744767986002820a19c5344b4d565c22852af688038bb01a654afe2c0de9193c82cf9548b6d850b1dda50e1c4e249efcce0a501d953742bfc52a3b189de008394a7c8684575393bf3c83acf0b1c45f49eb035663a8100f5bd6a1cedfdd0f08bd61f0af57598c1fb4e7247b63a065d88ee8de0218af05a0fdd592655524ada1c894455b212c3493bc950579df26b860c2be95edf68cbc03c944e706ae46dd32b7848eb031059c298db8a9997897175196e97c157f12a9278e332fb21e005c6093d1ee2008116a041e97849b687a70c2d62c1cbd82d7207f1e79f61ad062cd9a684ee5328cd1f0ed92a460e4df7f1c5623586a91e74420a9526680dcd13116cbaed7d03ea75db48d827f37886fe2f2a7355da344280c3ac39fd73fef482b139f5bb1025abeba2a32551f63ded78540e0f9d10a636e84846da9e93ed57598830059a3ea374c14d3419ddd831f8f2a7a572f125845e99654177a29e7d085fbb8d1031d307a7a1148bc4cb444faaf870dc65dda1d5fb41e88837e85fce77d318d2f453251651f8d25444eb8353fa330ab274406b1a2999e0c2e1a8946f77240b95fb3db5ba6c3907b135d35c28cf61e6e4462a0bd317889d7ab89ff3476c316a2496b5b22b041bd665b03a938db6c7ce7fc81d9f00e4b00d4c0cbf3f21a88a8e70d1ae65de5f8a3211a6a8f164ce02fc97acac834d9ac97bf419d3ebfb6c47dd895cefad3120b65f70abc30b3ff91762d5fddda01540b317a09c37b21822ae11c93b922c1ed1dc0f364135f2b3af67feb37cadb9c35bcb870bc429ed444626a74a764436e05a65ada04669b6c5d6a2916772b1c2795f12535793613e6446a5c899aaa02154164e52c8b6a02269c81a58e5522a9021a78a02748d458b33eeec407a7886f8093029a38073b9f5dbca59e677f1c71965a920dd2f84187bc01bf0177fb1ca9315098531cbc816005910b3d0df9a2970cc681c593115e2b99cf3a62a87354aabf25da1a50a08ff810636a256e1d0a398e133ec89692ebc044c3abff1ed43b1e5a6ed642e06c0eb80b3ff2b11fd2d46530d31131862480e05e7b57c792b0e9c2c81139c6e129edaeba88afd1fe4a78d3580018e213b93a223573fa33989dd11f82db4d4f24b76d701ca21e44420a1a6441dabe6753c81c4ab57b765b157443282e427e9dffac5269b8a0c59a24765630c957e01b807c40fa6346be6dcdf1ad7b811db1c59efb957cbbf99b924e2e2ad41620fd7625e38a5df24073093b23ccf52e5ff483b0b3e8ff089a20d8cd6067d1f739c6537e98eb02bbdf3c52415b0a07a21e67ad9e43107d0f53c249a2dc83a274591eb249f6db77d73a326fd47f8c0e706dd59b007d3f178ef4f29f7bd023f402c31ab3316bba807819c012beffb80a95c5a5fe587b4cf9a5e82545d8fb31755de310aa704a093811cdf3bf53bf82c8cb58956d8d0f2811111f53d91d755851b21c075bee497c6bbd6fce0946e9f00fac72110eae75c6cb28b0a32071d6600ab0db660c713ae35be0b5a95a40fb2afe4242dbb1a2ce90f9ffa7e77a35a1e57a3b3d2d48462118a540806b451b4c0063092b5b53566aaad01caeef5132785d0c11fa0e87e70bee68b2c19c139c97f9839afe0621ccdd734cab0850a81657b96cee2453cd34760ea2f44224e6034ec22d8b201bfb3b80eae26100f1d9fa0f11bc630526e5d62d25264c27ef1d4b7efb336c09bdeb22a2d9ff0e8f5c5c807d128f4c4e444542e2e5d227947470f72fea739055e9795cf585a311eea248df3759172388e4c12fa7c6ce54b6f4ce5de93a3bbcd3c55f53311d8aaf7a1f18b936ed199d4ab71f2f9f4be230c92fdbca4027bac783249cf89942353e51b5b6765829f602c0f29f0638383d2ef3c0172a4a42aac42268f0b22cad30c8654b48772dd76df7b685214db7a31d473d002e33a79e33933246de92614853a1c21742a26e74e037ca539d2dce528819ad2642c65f15cd8c1537001f735d603cc2cd9952a159dcd5dc59da0422c120cdb904f8bb0795c18510eb5e0aa7c85cfa4602314374821feeccd2a95748c4a19a728eacceafb41d3956980909221087dbef2448f529c039e0c65a381d4a14873bac6dbbfecba0239e9a19a39e6c379ad9220216c5a80e20ae26a1dc702147b3681b4c8a8fb4142b62f68d25dc40cc263ccdac2675be8957006611f1915e281806ac23a8fa28ea83819ecf8fabc943292c20fd17284348c57e624202619d13f4fd7f2453f95c33525f3086c7fbdef606a22c2c119f6b3ffc884fd5da9af8563e7ac1e3fcd04d89ff3dd4a6c74e224e0f245f820add0e8c6f41bd5b30619abc9dac252638968d929f98f7402e34018f814467a9091685073888f98c8206721099ac65c30a1414524001ba979392b778bb801c735a4645205414f87b2bca6584440174f3c10bdbf880391392167f13d86ec423329096e37c7f4129d194500ead3003dde9a128c030634d91bb0f56bf4613e11142d83a0a286401cf865a092e9129aa6990416c85f7a1d8ce52c974c0af4cd4273d0643c4a031cede65a316aa963e18bf67ecf2b1d5c3db52d418ee1ef9bc8ee095efe2191da1cf0c4a8aa840283fc6214030aa6c348ca74fe99570fb5d227e9199efdb00c20dadf638f7347939abfbb1d9a953e826c52fc892df6f60745d6014bbf07c8b5fcc590bb42495b7d2ca0dc506b145a6111591b8c1ae42b0f0e516b0ffd68dece91661012e126837df8719a8cef9869e91b258333cc58d3d10ce768097d0cf05b47dff084b2e22da653c1949e1a6f3b063236469cba5020842f73eab95b031fdbd3f5270c8c25685f3a4da9165a894ad63ff345b8579c0b66e2e37b69a4348bbb4ec2b8584e24be1a92ab6d0c97576038c3107ae46c4d7de261b1e555e08286e113df410851b95e1a3d2f380d30c364493e64fe8c45351e2355a0a255e983ff392dbca4a564e6c9cf92a7a0a25bc19b8a2206cf5068c5e5e2e9952ab13991bd045a0202b87ccb56423422197527d959d4a49ee4c5aefa01a82b172751d2567a572b30b42b2d60b6966cfe24da0b93e3521b1ca733c4abdfa6d505850fc5444838add22f1c558045324f581f9125bb34190db992795f32a770777b941698973b4a74153c0b1545bab40353ff9ad7b10b1949dbc82c2bd34a1dcc268720c83243af05d5fce028b2807206d7d91eb14fbe6bfb9e911f2e8a806dcbaabf3dce4197a9b9f937f00ac1e41568ff43186110d8fee7c3571786a9ef2785520f0988e6949b8c8357e20641d116d1c65ecdfb0b8584d92798cb485752ad8c026fc550f1c5f1099a7e80e40589c896c6fd6378d125d5b931359d6d1c2754985e8803646e5e0e1d4ec0250659a8687dda2d94b1999be60d061087ee9f267b546ad92148d3abc36775e71d3d8012175d8c0ba94fa5dd9018325db4c62533fa43493e4b14d5f7a6c1b3d5f72c8fbe49b567fa89c56f80acd6930994b01d78ea22d7d7f9448d4a50431fd094a2d7693c4d489b1ae877bd1a19c9285d31e9581efbd8618b0caab1f0d7a06b59ae23b0745bcff3dfdd1ef2ca03fb12b59856a35451b8b4f8add7318a4a8a7741a806eac108f9113caad47d4f6de9351343ddd49c87307c58c819b352f606e25ebed7113824b66c403b4c2c8a012f5edfecc434d7bda7ffd01e95a6dc4853d25bb8e18d42aef143dbdb0ab50bf5bcfba0b14e8143e45f0b3bd166491e4cf2851ae00588c324c7ff7ff52dfdbf102f731706d99fc6e61e93752a6568f6e34f05177a1db8356cd6309d3dd5143a7ee0e0155924ce07bcd4a85359834cae2d23886d012e7d09befa844279509e6508fddcd0a2d19ef91b2bdd6fdac364b10d3d20ac298cc13b6a6892bfdeb1de6f694274378b13f12a480c67c501205e575cf42b8fbc739ee2a43bf72c1fd5ee3ff9f440284766b4372c52eea815024aa1618551c01b888b20954f8e9f8fce4df82b4d765b5b7d2210137f3435395ec4936de24900d84ee57b37957a64e94ebcddb2299b19207896d026fd64691bb978c5267b2ba9b6afd6f999a7c7607837f2ae2f920470b5df4e94c1bbc45736a78216d3b9c202df853658e1b250a411e73742643f392ea17267c587bfb44ce1a1932f199004b692dc4f74413018ad7c0fe420a6202824b68dd034273850d799e24bde06973191705684f77bde6578c7b9e3692335917b47c947e61a585f5e266826f862a829c1ea0c383b5e4f9ec17439dc74689a3f7ff19fed2abd115a1c44c50d495d8c9f5774407aa435a0208672967b5d38f858f0cc425d8dafc435099e9fee238c91966ad5037d79bcdad8adb2c5309e6e9c140f80869d92cd17f54074357750b36dc344b7c4d71a50431b075a3c40edfbd484535e3d6e560486bdc19bf4f409f9700e62324b3d93d253150dc0dfe2800e0cf36211161ab9c0651d3097843eeda264d4a0a03c498096f44450ef0f23d270e26f42686c51a7f4d27b23049067d0a0a170274a7a01fdec426604d0d4b2313478ae3d44d6bb06e8178dcac49d6fd27cf0d57740be06dbc7f8182da79b7e32624b0505b41a1b4b3e9f0011266f69ea5cee5517f4b026df799db94b087a29692095e9e4084a6d822577ca26f63dce268ffa718408fa5cae2e32e0fb04a3405dad90133754c58dbfd478230863fa992e0ee940458db79c0ffb3f774822a69bc00aa39f303b46b7dfe21153f19fe5312cf79b8471985230b5025ed0b672cdece175dd714912e49094ca07e5040b92b573066e6caefd6dee0a54e2d7b5fe15fe3d650d86b062270c8f69982c5f8abc7483a952d432cca4323966eefd94781cbe522f9c72583a0b00872126c6a7af7a3baca82ac35fa26c75cc7da06aa6aedf56acde7f8afa5740353775e28daaf23b5d40d3ac6cc2d340fad0b4f733b9d64c709f0ac8a2b50d9db6e8e612f02f26e494a077dc5455c6192663099e659a1104d9a7819ae89167d9bebc5857daf1b88aa943aa3535e72391428cb95489a67ed93e6b9d8a7dc7e4b8bdcecdbe79ee21189b6abaa08de0ea299301ea35f9fd18da0dd37100b38f2947ee483ecb3231adb29621a22581c34b6945741aa2c6a0150826260ba3742786804b3abb350576cb57f50e9dbdb9dbfea6d8eda57446540e8d475a7c3ff59511ed30f99602f0c42a5ba227d4ebda77cf11685eb119c62acc9ebc93fd3373e33fe7ad6cad94bb66fd197786e1cb390e753ff1638b29ea953213dccdd1af08d4a5d8fc468e6a9b8da4dbf603ae264eca8cdb57ae6ce64915af0eea80f4003e373c191d8779be4a8977629a0109326ca03d4b42a4c4f12da3166dfa45f95263b9d14fff9b6224fc7a825a4c5ba962f88a5811b455b0d3270c50a346509dfa0635c7212193e5e9da479a47a66a21850d316c2a075876d231d726c8d8da3d3244fc22c185dce7abe78b5e6bb01c0aca73e8be2a6a7548d2f4807c91338c194acdfd5ab89952041a7b231982e06f9806d5c08ecac6df6ea1aa3f41faf43e08b2dec6307f783cd9319cbd30e32e8a7f02a9c9f56a6334374664cf398f7988e6d936876007f3cb16dd0110f2d72d415d312faafeb0b99a30c127b96a3a19b307bc12dc14dcca67debeb24b5626f622052079ae38c9b8479acfbd523b3088ecf586d05026af701aad51955e82ba3e35f6751dded4604da95606863a317fae0be5b368bc7194de0b2a57d202c5fa08cc6ac09ec1f9f71a733bb37b3e3317964b107f25eb160f1511d53474c30745e53d8069c40261b88d1d1a23dfba87e03d089f711a44810d260e5638f733e563883e0b9b813d007bcec89de2001b578d380e00a22a0c3a5da75284317d282a38a3294abf18c4ba325d73678a702a87d255dd2eb6af34de62637e7a337e9b3aafdc64679bf514c8c02a21c4b600b3d1e4ccf5f393e1dd1bc49d009bb439c25b2ddcfb008a8734f4379cbbf89f46fcb1d1a701c00e61f07e09b21e40e0965960a5fe8165d715953c51c2ff24c898de153b949cb9ad59afe35ff13f470f1e9af2c1cb4dbcc51bf662d74070404a99386a70c4ab2b2a22d499016eca4ecca05a03d2d56d7a632fb44d280b2768e69f08a34fb71ebcaf58ab289e7ded07170a3a5123fbc568747c1bd19658ca89617f3a6e3a668355f8598d35b8c9ceb32a41b13ebf4bd426e6f50bc5b647c5abc991052fa9b8cf6e32f6d2d8fe6be6c7270ad5a7372529579550121d38ba868a65d4ce861563dd2986d3743ff9be24c71e308d7920842069357f34149ea1c685efd104bb5d33545c169e1dcf82e043bf48c72b5da09adff405ebf61e22c2bd5646beef3bd59b04908ca8d157d52844b48110b0d684a288753f214805df9619b0887e9ea3ae0f0b56ec9fd104ba0442eb482da78270cfd3bfcc65a298d5c3afa5ce0e7d52fcf0d025904dd8729025dc137b0d62f47d65d81c851a6d95d9f53f0fa80eaa307a028d3fc3dd6c8bcff24418ccb301fd6c77a0c90c057ad58e6be97ef0b68edf7d6bacf3e0de9209a1a62f4e1a3e72a1861e6de4d2a5cb076983ff8fad204890c531b6599b995c7ad9151d17d60cc0348d151d1a28cca1d96284886393a25e9aa59e7d253f54a1973519a955fcd479393bd74820345521d657a1086277fe9ea187de7b8cb370687184717c46ff6ceff33e008cbc6e4b9bbf2b89a433c1e77db763a9f32e8a01ebabb1064ef7c175f9ad257a22f258f00329dc20786a5314efc822c5fa758d7b4fe9e07511bac7e0a7133f4561362b57eb40e06b485a19d8ae700606a026418858e3f7a08c41ce202dc6c8039144737863543e87de39a7bac6d28b2093507903a0b139b1653e9c5dfd996660fd100d99d357ad8388f797eca09c7f88dc693d343e4832a79163ef078d0931abad5c0b00bb093d4a200a167585704436d5da0491c18928841501502d56b72413094cfe22e9da35e1880022702e08de16839e6fed3dcc0b1168493b91bd86a85c9fcddd855761727c8a636160edd641b56a601c1d004f22c42a54815f3a1101cd0e729106ead29b856707e621b3a9f699804f0c89c889953b281dba0d1741c4fcaf944e11b61e63db06699269d6cd1cd28768633e60596db6ffdfceb8cf9b77d41856cd185b5958dff855b67f39c2a37aa1f5dcc1b656a62afe034f304b51f94f3847ce73e53aefdaf304ab1fc724e6bac7529dec5afefbc800d2fb054a390befba4ce18cfb2ef5c75cac8f856fbf88ebadbfdceaaabd4a6a3fbb17d72baa8090b464ba60dd6902a404e65d676ad00e0447d819e2be19d7e8dad26150525a06a0f8a04a6b7c2e116e8884ee923f471569bec3af4210115e090026c80b84437792ea12fe29f5f08d16ff74d6defa5f372f3737054557ca79d0531185d17f990803b210fe26851cec60832841ce3c690ac4f9c7c53ea88d173a2b8ff53a47164af35b16b6ef25b7a003d93bae123d64443223c686a95903cba6cbddc5cc702c277110591560307f479b1d1a32bb0c9170ef23179ab75439ef834b164c4a3e71c9d71854e65e99a3c85c9489593508a76815b14bdf8a7da4bcd64eec94baa08da4dfef88be94d92b46e8e0a7d3e9c60a598bc200ed34fea73b8fbca9957de4006b07e8625907fc6e12d917f745f0b5c7d1e22dac1defa13a89195dcd0987c097ad25c919239c28092c3078d0e355006ea8c8f8ef617e79570655e847d76e148eaacd75c0906ad5b783d3e0fff3636fcb6504f508ea7b82145096461c958fa71f2560aa4b6fab13a78081007a8e6fb42f634078f08c1985310c978b04dcfa0105df593c0cdb8b42af2ad0e59cdc0f254a711f0ebe9a15308a5bc26846c0b2db2468b54e27846870743c22918008fb2fe0643789b461058b2c043186e24e777685b218f9150c6e962914780718306a47a7f0622762d47b1c20ccf1386adef216ca3b0efc12902f7ae6bb851cd3acb66bdd538eab75b3061232f7771c7c0e3feed3002f03d49df8c8d3b8f0714ae5a4317e44621f3d775703df6cfeb0865f1d81a8bc6eab1a8e17e41148bd336c073379a2043ab60cbc138dcc1b9890a2a8f148c156fff54d9ebbd20cc0db6804a99af16d226eda1b67bb106a7afaadedbaac017405d927bc1bd1e0927d4b80387554843852fb7e9d8504e2dd3e30794d3cb117c914f97b2e0bf850115a8fe67383207ca6bdb9b615a0146cebd20b6f3ffa016b0f7789350ce0c407012dd45eac9f456d4ba8e68497e17e17d1288ddc8a501c52b62a2849906b0dd84fff8e73959c39a197e7042d3870b846e056498237d5227bd2bcb6c31f7f460070e5195f31263b8348c209b497fee87ff259691f38516a8d9d0b26a88bcb0e937530d6b7c526d8457208f586958dcbbff089d30c39e13890c23def6f82009ce4685ba4dbf306a62e56cd3381ae14a66282f0816cd57f7e53965073f858bf7bd898cfd29215c4f19d6454026566f0b25d0c75e9aceac85c1daba9996a708c211a28f23a6b2962327edff83aec9df61225cb6248ffc1dc8c394444afb8b25283bc121b69c09d4e0c5838b588fb7fa1ff8e0bdd641451135951430fe6429e4005dfd8be2e18ed985d6fbc9b2759504d1c54614bcef1bd44c1ae4b556adbfc026b22575b35fba80ba56a49b96ae09031247e987f06056ecd3020efd28956757459f5168c5843d86f02e5648423b5bb61987a9d9229c77c0ec9b968cb90825c42a679076bcb84b1a2b7d77820eb1568f837852b511fe2c72f4eb7cb06a031d88366d610860a6ff544e1ffaf9469443f78b5dbd7ca90b81e9ba714aed374de0a682782ee8c7c995270b3338306b7ddf249122c36e2fc5b50054ef9440be7d56803eaf291f126527f3c15155219021a1509c59a2e5ade4f16ede6653d1f96c46a41c8064f99a4608940c1b3505c9caa59faf1384fb6e625d3526f254dc824cd6d12d60f4cdfe6188a8f3baa70c204dc136e9273a433fe9c4c3228df4059d9b2c5342b6d2158c103f80410ac69de72745900a1ce7b405e940f076d1a3c79cf0ef5c0487abc3e09a53801ca3b9826f60229e3db77af2cf7ff96d6659f799ecb1ae4730fc800a6de542022f4ffb85c17bf5e49b9016cafab39911754fd093e1d53e3af7574b57353df1b22a9d82057067e82cb043a434877a201c45d915c5802a48cf2023b621b1602b4905a4d139473d23ea93e56f8f7faa8a6765f0964848144464384e8785801d8724eea1f438a67d462531196749ce9bfdb8271f01e8a197ec9f3d5018109a7934a1f96a66bf0ac94fb6fa37d160280b0dc08243fe533d05ef93fd8140242765ca3824ecd2ff2e35ff6d64160e4a64020a21ae6e2a4e5f4fe231f2d221f69db3d5c327777ce7363fa9fbef01da01723cb77c462471c0499d85c98a8a2279ab3d1da223168aa624388948817b70061060d339452452ea051695cac7be79d7a85b662b1b788d1a130d5078c32622a6503c284ac0b90d5a6aba42cdf230ab44917bb4258704d16e0ac85e30efaec82b8e4cbd654db059b959cf5e1d9b6d237172a5460c908d0a3734fc0e0108782be6cfd58b75b6bfef91e006ff2b035bbf52acbdec3d6856d8fe0ea8038818a0ba89ed62449fe58f543355c37f15d8591a8fd8f38ae971e08a69e099a35e6b7d607ccf4ef300793cb1b8e5fb32f004a404b702f3b8495a01d113a1bb8327e8d56836fa91b02e1e92063fe258bbc71a73b02889f902e32b223ad1fe4e4453b2c4916551473dea9843ae59e364134de0adcaa58920fbcf3137774b8c62aa315a850e2b125bc031f86241aa4f47efcd5a8cf126a5bccc576c7041e635bad847d72ef5c4be36a5e8e266a18b5b34179acb4c95e01f9390fbccab87e1f8346d041ed0c3ecc5f27bedc55140b0c97e6a15edf896d78b2374e320200a47da0a9aee3b66e03ec8ba78bc585b85b7aa5be68de144d2dc31dc79e199e21642e1ddc9e3de34c60544b136f7e3c5c2661339ad8ee6e204b512cfacb5b6aae5c1880aa2e3d47f6bff1839d5ce1098444af69b3017d6c5a0a289916173c34595f89b32bee3c5c8c20ecf369e95ae6437dac7b09719284bbeb91fa12dd1901335f3647d67cc68da251cad0d2f06bd2d37fabe72acd0f8ce1e74aabd225e34b3fe50c8745b08ade0fa2afebb01aae882831d182e7670d39993f4e00101d84fd35b1ad15c3ff45324dce23761c67da76dc76bb99e570bb4e731b477d9c8c0d73b6e84a5a7a8b4a2dbf23715c50ee6226e3e931e32071451d49245b01eafd713effd6760c8746777b9e15bd23b9d7712e51bf5a54f0630621aa830206b46d81d543ec9eca824520453abcf635537ece9663e5f4fe3e82515cd52e9f12ac1205943c2992cd77097a895cf815806b80e9011894087b1502cc3078793ed5806bc54cb61b0113b198f2f1d5f6ff87b7a283e308999be6319b63128dbb8e56b3f7ec6b54e25c8e1c7186923c5bfc0c36f36afcb4198d79b366fc5b957e365dfc4fb03d8fb26ce43651f57ecef5e38b388ac7992fb6176d90bdb33f461a0b27bc9268fa3103137750c6ed4a76b2428912193e4897f269703fea5ebf7a3cb05be0bdc444a5a3937a9adfcb01149790e9c3314610e94f11406a748848be652cf1cb46c1e67452642076684999233871b6cfdc69ba02d24ba3366538a9a44cc052f50e9e825b6457ae7586a5f554c1275cef77b0fab5a0ebe26eae47ded3099c8562aaf56a78b78db4f231caf74ace5317833be84d2aa16eccfa1749328d2e73eafb4f815d6490c3dee3d5d8c37e87321ad9045587fa1eec21f43d3f9488400ac39eb5803921671a6e224c1e67c7b3759f61ec257917bf61f8e643e85fa05e199dcf1f76a043fdda4d19068c4326cc71b464d667d752143964bee6af13114fd04690b3a5d572e3a209565559698a0a745adc3a327f5b4de68d39184c0fbe331d0800b406061199a31d95fb11699a41a7d43a256ea8b499b9015574b3944c48008a9799186dac7a6b2f905b288463231d38112e94508ad68cd76e355482d2409b1141604c92995afad1c0bda95e07b0a97d30bcf61371a01b8042de20287f2cb91628bf2e6c3a3c3a4e15c2d6c9acddb05d26460baf0c9e68daf4c29027a63df9b6f8d80cda300f4450255427c2d26785bef675e1fbae1971b0518617da8c0008e3d7e47f59122f9adba2fa2973819e9e44300cf5b9d28636a42bf26202cffe9026410b326a0bc8dcb4c07ae1bf5e329b7264860f55dea096b0272387ab996f9f2da0b305ee727417574f50630ac448fde7659f71d6284070de4d261c4174e7b25d390f77a040b04f0904df12e02692c8cacc0457e716a4a4d6299a3b991806de68ccec0206435309b6c326e6683b22c52dfb8149608e043f6e9b4cf5a6a1876a732ffc58a615208d17a3bf3dee7b5671951610ee50aa1041e2f2c325771a8013dd2559724452b59d7f3411b1668d5dd8b73587909ec5332f8a4bf57d3bfc19ebb663b7044c50bd5f32b82798c664323be378edadf27858e5c47ed5e76b276bd259332d2bf641495b189b9bd0cc56a691da8d549af903fe3882070adb5437e63f6e1308e9c0b6070a4f73af4e98a7018cca05c0ec7bceb565d281f832832daa84c2d4b4943bbd02b6d844ddb8e96a0c357bd8d7f1f4df515080edfafd04f17c4ec37f5581e5c6b791f3803ab88eb0ed816fb179b14be0e290c2c7a0e85c842c831693fc4024167900da8ca059f625f15f1373dbe9370b2d3605a4648c449d4084b8e17ccb5538f90be20f85a7c89c9c7c7aa4465bc52d9e223fdefb62a22e16e3378d8dc7fbee462c2fe7324137e9468717d996b254054c9cc90ac46cba1ce9b01909e9b5c652466bcf1bfa623cd10d7d666714939cbaedd05bca1ae39d2d8b871ee510191eea2df5c595bbf5e1019adfe840700205e925a3f58f931e5ea9f44240cb427015c0d44e07d27a0c457223843603980f8d12e86b2f8b51a638ec324ae7c1cc664fdff8280a2a5a3b55e26779fe86a3dc42f3d0752ea214ca60202e387d17fe0c8d09f2f0f1556e138d7ebeb27e2e4d6e7316a983e2fbb2734ba4fa081271d3db566dfb9fa5c8199fe4fa172e4ccfa1eb68d101882f5907041609b25b0d35dd23b0358cd405c5bdc04be6a5f83e0b93a7fe510893aa12a848cf7f7c57fb60501fb97a39a0aed4d88cb2dc00070103817f48ad95602e655e4d0d44a415672b3bdfb3c3fbf3eeeabbf5bf78f345cd9538a7c0ceb26fdeb1f208e125dba6005c58ed36f20464a9f73ae0717a3d8d3819fca385e4af6f80806ac0f044bbc808a05c57fe49c4adc3de860231424bce12046c876dcf745a6abc0e9c03a087dadda837a58ed7a214695beb999860cab8e6082169c7f641b350e6438d50458d9a39013b938ab394adc03b79b8ef97702059e64c16714042009c640968063970e3fb85cad2ff6f345ac8e6d0eb47ca246b5df934492cc85a57803530b2ef766d9f416358e891537c010ed9e96e8ae87b415b7c62dcd2f598625a7a36820edb43dc355285587562bad08aa1154f175f95aa0b12a32f46f971dc1dfe00de101e405ffbb390adc1f69150c960bb7572917b30b73f5f6f18d34c810fed12d3622c69300d91ef8bd41697e8e76d9beffbf15222edcb922d639ebd144712d6ae7274d67a61bbe2ea258637845c7c17e04ee31219eadbc8a283c79a8e15b259e63cfe9d8c1f58639e819c2e9d0df69fd2cae6739d8674919b656a734d15fb42928507cc09a6e5550fdeca4426cc9852be7f3b09e3f36137557bcb658cfbee7bb5c1b39a241e572c7693d6daf0819d15346acce02c85ab23d256bea97feef9e995f61aba53ad9fccd54440b374b00a1a8562e0f0a3046435c1734fc71409eba6d8398205362acff8f5b943e69678f21068f72756666322c5edfdaa6b704e517493512b524e741884dd1c21bdb07968f6ff9930e8b613c0ea557b126064de20e87cbca39941ad89cda6d0210e43db655518cb6ae4704909bdbaa23117aaa824d586cfb3f950ec05b65876a6e47c2ba9dfe202289a22a31c81189d1e15b74c9fd0c7d7b63fe33b6e646f6bc982e7aa3b4476fdf5bc35b3c5bc2ad94b3da90cc2b7c661520562daf0bc1671e77ad86b4184d97aa7504da786cdcecdf1609a780d24558cd02874c3100b0316f0082086008c3b2f24b82b828018aa3c0fdf971e298a5e93a7ca27b1189ff20a638489a4d1b3484a663e28d000f9b3050d5f38447ace7c9caf50c87019d3604fa1f13a0a1c6282cbf527f1f9b81e99e1144f2e979afc011d5818d42f20ec009beac7e6dff00d0d02b37c42fdbe51c626532974965629bb524dba0e145362c9e708a0828b9d9e1beda8b7974c2200720d1f2dc0d79b9635ff58484ea92d3dfe12635a5b1db73ae37097472ed0ec97a7dfd404e50d5e30fb01faccb1945e5c72104e4f5ec486a13ef94bd4af46464ab064ca6790b561460b77d491666c16fd6dde829725bde6cede895dd3a6d2d89678eb61d6745f6caee4bbc79da0d82bce4a40c2c1f848bf8cd6439ebe552907694210a6ce2a90345edc060bf5305589e7a1268f85afadc07a74e39d13ed806c1c980693ed2232d226991cff7ac555f20fde22da84f24c095b8a8a4a8ebf0420adf1213bb8e53a3c2f4c316503b8f812545e5d98df522ce7370f2db04f56f9780f5359f80be1f5b8e5bf34b5d873e3e201318f2d44bd71ae04466663be46252129341bcd61223456440c269a3c652da4953ee33762e2622c9eb3c22ebab14918f46a20be55d635c5f8c32edc37b4f0ef3cf55ed3da210c66190974548e81510c247afde322072b9e3bc4578cad29d88fae32b6dbb495e2ef9b728bffce48a83758e94b3ea5ec800c71d1c3e8cc67948587aa764a63f784198d90cd473be8bc3dccbc79b50a5fcf174d5f209ad48192e5ff1d775fb7ab1df158fa8c2d610a04c0e8e46ee37b62b367e685b9d5539552516cc1ea13d3cd0fd1739f50cea2ec82724707ea85b8fb5256e8d26a768d912f3ad3b655317b2fd8673119446204893c8d10ab106a40a417ff488fb06288ee9a6b4ef1914eb1630642a8080bd9daf0fd4c3635aa816cf05bad3ee3fbe763799ce3338ba334457bf6b6a224d7d2c4f87a7233e279cac253b134746b6d6f3f5862fdd88ed7ef10797d5e0b63271d9ee2f008117919494fb8c63e18038270b1e579a256008ba67e633dc9f884b1d53cd66cd42ef8040c35669d9c46eda6e76183059de0114ad4d6922e26f471cc30b64e7728d7ac9d9d9849efd0f3b26d372216b7f7381d1de57f492f7b05c69a286d362043f64e24baec47dcc29c34f7f33c06f75b1425f4b2b11086816b27bbabed9549960afa1ea8d12bba2cf2f7740bc56b40631142b3be7d4fccf21ff042b09d2d7601cba8d4539d3f3cf6c14b6ef9a7267f6f13656a09e3f1a711d8e77a7efb36cf18c438fc41380a150188df80721a709b87e6043d0dad2be5a10d17a4afcccf9637d670c6684929bbeba0a636cc02ee4254b479f5de3138ff88d67e3cbb902a50b3d2d4e59a2098dbb574377cd4cdb491aa6527128ca02a0170b30a8ec8e01fefd4ee48e7211391cffa43ce186186844d293c3394ce32cfe887270ba94f228fd4b09d76b0c2e8df3a17f27186c069fea0998c6353ff2a174090f20722d16f3effa0d7be0eb6fb47b0aa83dbe191a1d4d589a27fa2e682df24ac4dc6473acc2ba9ea871eb2f4188ecc609b5c609a6f1235dcde88c30158cf7d665d2bb67107b56eb456ae9d89478896804320901fe6c1782ca0082d8c12bb13fef0186fd9ad4007c3ad3ff3a5911d7dbe23a24db07992d77f2d00f5d136e555962a25ec9a7454a1d0a2b6179ac504f8688d9214a3fa0b017370d677b55dd8df9a995ac103c53ced2654854401d10b423a65dc9a62cfcff5852e2b96521e6f4219a861215552840ec9371b8d5d5620df9eaa276216c72a52877920e19edab9a9ca86cda80ee68654c5166e35bd14558c2d819edb370481e1755b5f1489972efd8880d229991d41de9c08a0f16945ae9a18630a9c289fdd38767dca532788a2f4a8b747ce000d641d49811823d6d6ab1c1a99ff6d6a9078248e15411b2741d85fc4d96fe660483ad286cd4a4a4c454160149fc5950deb97a3e71f94814326be10db23dfba2f28b6f23ce1ae6dfd8be4e592171a36620fb4f764a64d25f33d5676656aaf4397f42abbaebe2c314989697d293b0043c9040033f589a639751fc10e6c52a30fd5c430d1b980c882e212ec08cc884809fe54d9cf784102c6494fffa04d94d679ec5668821f6358378a65f4c2a618333769b80ab0b6773110e67d3dbd7dcd1992b9d68fb2933ce18e182af519eddc322a38baacfd56cb5a20a7aff3b08b1a7ac8255df02d5b098b1a666ba08891196e4148792b672795520a67c1b64554f07336310e022c4cd25fa8b91a67884c64edd3ec5682d407bc509d2545c351ce4dbcd75eba0db830c74dd3f6cc62da9af59514ea4ce6d9b7a53c02a60800c0503f2e15e81978d8d44d76e0939d6cbb0f729cf98d195a07b7ce53349076c73e8ade0af187ab1fe73ff4790271814d0e2ba76e46e0ef956092fd22a038f7e659239f41d0fd5859b76be498f84bbb7b8009b3b21a5e64b19e221710c529a162d81666ebe8588e69fb40bf277c87e1ae3014893cdafaa0551d04b285dffa1802470ad3830e3d07dd6732747ec666eae59fac78fa8a29a6e4eb7c006d07dd9b41a982d9b1c6b302637b7955070031c5e171e97d3814c886628d167420ee5465bf4c52c85eb002f441e258c7518c5dc39d8de1671081335b9aecedf74141968b6c38cd39e2d1ccb46484911c4cc5c7e9e4aceed48dcdb1ec3c21cc783bc040eefc7b4e77d5c51cda2f24d0fd491447669378469d1162615d762e9ea2a81cbdc0319850a565fa3616d27a57322c7587342908dc6da12b5f54026bfd6f3183c82d117198621a94e6a4e525228d6a2a4535b80f6c4c645d9381daca64d760005b31c2dec4e1731ce11dd71320827bbc6389b6a28bdd09446db49b3af1aac15fff8ac2f08281e0cd720bc3b2e38376ee01fd37758ddd9ea74014298a2b7fe086c9981c2999440c67e69be62ec000287515ad953d1deb1d72746f4294f1df785c041d6c9f21ec1242d019d92a79f5dc8ac575867b1a61f1503e3525e9df015e7adc094087b1118c189036bd0e7079801637c11409d4e53dc0880f9d44bb851e19d7047f05ce4f71341af43db4e53eac1e664511560b0cc887a14d79e273124e4e5431c50daabdf506d44acf5ddc4f4365228d3af6d3c20dee20f583c68e4d91beec6c48c1df3cb843cfbb322a6f375e4ac09fff92dd3095490f4d04ccbf61ba92d68800dff32f424a949ad5129987a4606297b1fa6de7d211956eb6d45c5c6f9d171710a45ac5ffa00afbd0e4adb9cbd5e58a343d76e9c3d0fe031ec36fb9af08a5d7c8145e9ca54df2d69ef152f3eeb4924626044030e45b06a374cd54c79e041b7e84d942e71d8b451aa739683c2a817cd8ea83a5e717a1845524104bf958ef65e807f9052de41e7060801b7d52a94f0ee04130f9abf12fb012657655bc2bae979d2dd009893fb195a8e88507e2d3cb8d3190741e125c3f82174d1d38b91adfabab0812721209b9d107c7f441082df0cf8c4b8632bf66dc18ab0a46df041a2ef9c55896a4072a1fc8323e45c52df25aec0aac9c520056460ab0c370d8594a9ca9182e3c0d9725199fc439f361e2ea8f4adcaaeaa81f7c4aaf25891fef0c760ebe06c99ef8342b865ecab5132cbea6cad177bee8cb8027db38158546c5b4a7c3960c7a503671d2bf72982814cb152dfeba15b10dcddcb3d348ea0d2aeec880ae16c067f68fbed4dd5b227de1e719756316fa432f91dd170c13d87b81a5cfac5cc5ca4c5e79e312348ec49d1e5bc843a21cbd4e1b6f06732123b922cb8a234904b459788bf5626e1bea6315e556386484231a8d3ce1de1e4e190a0d9754c385be082c51a65034d6ba19ed21a105bca423c2d0e009af1cb7a711d5f847ba4f5639ffad2c6e95067abe0bcae81a27c3b79c66c5924210ca6aa8cc9e4d432ae25e6d316ef12dbd78bb891ee838c814e1eaff065e1598289e96be27ded9961aad0bec02d6496756f2f6071c3d7b6c6a803be07da37ca09bad0a01d450d360cff7c713e91c06a4c4644d36c5f5db58f6e657974e7309b547c0711e4da73e527d9500f1a69e0b3c96e14359a39ce1148700e9e9882ed4f2ec6eb0686f5c0187128c852b604edd002cbf71d3e13081756c665f0f91e7cdae2aa9c53fbc8a1b68c8f9953d433c5f4675d35a6b1f12b95c268862a26d9460383a499e5ef3069d884c099e8f3f853fc268dc2560904e1321043a634472d689d9967feb7fae2dfb83ab2c54d192e8a5a9463d8dcf4acae9fc8ee2537322163c83cf08c5d4f2b9239f49dd7b7cd9efcc60f60db0761172e88f85a724881708b84129c1306cdcc41ef1cc44633f79f6d95305a3d57a73db3c80e5622423fce6727b3281bc0a5c4d90b42e5f77f5a1af859e4d7ee11b0f1b39872b7da86595181569b76569431e82c6e7d727051eb9bbd41e951ddf7f8e94652d6aa058f0243834152c0cd41e533dd4c2577ecadcadac8862d3f09e603836ff78a33dfc6412e55d895ea7c093ba7be1965941404a0106c4270ef9c8a0e1d8bc69e1b41b9e76fd8480ff87b3f5b0f8aae9894ff56380c68eb0ba2ad6b0858f3fc8c4756a86c8e42407a5254d82af82c768a51482320f87c8be3b7e104ea58703c4f989d8f722d73b627e98fa82713fa3f313712380b4036f8b5c1c83105ce8510558d108019d3ae7d4142804112f44bf920c9027412586558438587df40399b06c46aff7f9e8006cd1fef5b4b0b110917966b8740e02cdc3ba466f9b4e854bf51db3ce5aa99a61c35ac578890d67bfdb5ce64b824b0cb42dbb54bde47be20656055ea3a7a9c60338691b6b869d3c9d52901498fdeab7eb08df0c8f08c116572048deb9e9b71326adc3ddf0152c06f6211f3dc0d97e00570846247c78a01662f22feadd831da4d529d83a48bbdc20b0143011b588b1da6465a6f7a588c49d63f471af6b8c154126af8cd3e424df5affaec33a4cc32ef53009dbcd1013ed73fe4048fb6ea251d711e06a0379824bed104557918c90566437b0c4f85546219cdbc0e3402713bb90dd5d7a2e62d30b7a854779a74da269cf0c3951f5f2772428d37deb44c50797ac159bfee1174cec664b73026be37b2bed9e1b339df2575406432b957e426f5eeda5538d28ec2d5220b25c9f06f764358d1293aaeef851cebe8be503a57a19d5117ae080c8b962185d05ca3413c3ded5ed67247c9b64dee12196f33056977eb18c5ab325eaee15c660798cb949f7cb8768c4764a5ecf98245c544a19eab2681d8b120731aa3c8ea175db70030275068ed4df8a26c6211ee68aa86c7230cb9b03f553b4b57ac157e87850a158a592d968b7472b06e7b6548b841c24169b6d8085bc3840c2e6f048ee02342cf9328a17c283b5d8cfc893f940b9b12b4e674bdcb5668ccf9c8238847ca3ae65cfa8272c98144504c64c43ec684d0272d164e60c851911b4e78d100abddc13cd7113bfdb64b6ba7876de4414d57483ab41af0c5079774995970bffe2e7f197b3001e0e794772c32c8894c007f6ef8a8db80008e492082cafd31092a23b3c70c6bf1198260aae24b0000dd58784e81ebefc10aea5451b1dcd91e8fd345d181eb94ad24a98018f8021700911ec5bec851bf8f5362f2a915aae25795cd80d7c5e85ce4c51e82cb76f72006ba487fc3cbb5790f457e724f7e605f0b6fbdc189b759347abe52becae47cade498c42d9f8c44332a3f08bf05d89cd30cea525599a796522a1ab841bb5e7f0fc6cfaacf8b7c5d9b79f24b6aa1bb4f090d3808fdf0fa2247dd14ec97cfbfcfd2f7697126c6a84a2f20782324ba694bc595c760ac5d066f9966d2911a0b9f5142182570dec06590ab8f9d1de44d929c287c73228865b1ecbee1d8c662cbeda52bb05ff11c738b421e1048bd6a25367882753c71ef9de759504c2c16d9c4f470aa678ab7e86e98262fd6a2f32ab6f599d9e08968a00302f6b35d18778533a82ebdcb5bf43d71c95a67423077046ddc32d850949cee9c03cf06860e75c6bd3b0ca5fc2c65c031b1c50ee1e3885f37d48ad988b164853528970f3db4565a150dd5d7dcbf8541a934b89ae5b06b92af86d8783ff474ef9c13b8d4684e5a37a6675823b801d346341ad471c6ccb936eb6506eb7e71a860b3a8dc76efa6d5db1ab5e404920cf1243058abe211f94c123238d05f5a838c72bb2c5bbdbb72c4201c0e0eb9b35038b9e989fead6ba1b9c911768fab0aa180eece4a4aba7da92820eb4d6af3bd5e2eaf2efaffa5abf2485fb272c80c09e1d6ee0451b6c0545df4ee42d62b6f1eeaccdd045654360d3d27fa00f356fb09c5237e138f6113e9eeff1c196c2ae203196a07a834b75802c921f43e207f8665c82dd09ab42b82f0c49f80ad20ed44d12700ceccf67d9b9b5f6fcfcccac904d8ba6205012fb2c7940800972bc4acd0c831e0889fc2eec05141c284a63775c552526bf67ede0f86a31fc24caa7336e2a594c92f3cb37d91d7f75bd487524b3a9be344adb076d177a5b4175f10a12fac385a29197b47dcb29df6caab1947d82709e8aa8a255088f1b4486be9c1803bcfdf5082582ab4e7c76d16d8666e9e569d6a35a8985ce20d8f7042a414823ea7e21ce871fd5e30c1f121627e966d609b487ba3bd5d28ad94804f10f7d590fb3b1598bb3f2ab1950bab7f41a4abd55024cba9133387f2042ab26a074b40b9d529d8086de5468f4d22066dc5efa59072b8460ec025179912f7b7edb7c84a8ad4a4b79bad3f8fd83fe840c70f8bc15aa23087491671993d069478c89d8183123e2c7016d7c39de1dff9209f889172f0ae78a1f963190b4e66452ba893dd9b44be7777c536dcc8681d7b69238874dd15a478d0644e87e7be9a19dbb89dd850a8eecdb86f39addffca7418b445ead342cd34b4864e3b84adbba5178e7de7bd9160d20cd320dfc361a621670998629674632679ead157d8df8f91e520a6030180389b758321f02e96545d4f5f2a48379460edfabe1e039ca84671923646f360530eb75043bc472da4182044e7a0b35eb520f777477167be08fe6393cc684a4b159c60f5e3e8db8be29653f8440a65241eb7e3d073ac88b4a93426ed33cc3bc66d052416a5149a09b17ec49d7b006ebeb8954fa93e57480da97cb4c9e705d52d51e43c9212b9f9e014cf5bbe36d4ad22125a1a64d44b53cdf262ec965f75096cf14e4992a259e9f067c9d75a2669a28ad9d16511166f94bbb295a14dfcee244abfbab1827d723e435c2659528fd8a56f4885b67ed98d1342a1e5062d942b84189b6ecc992877f77f299282690dde287be9572c4a1f4f904340cc795148af4de37ab73cfa181e83f6adc53b68dc140e78d118a287bb03261e36b854b02b72c40c76cf7ca08e9dc23a99e6b9156d495340e38567854467eafa6c45d058516c9349d3ff013a23dcd0f2adf54993bb22bb3ada54c752e77503f14908299c29f22ef954becd77c39e40f91c985b73854bdb62345109d40ceaf430c409aa5ed41d082343432bda9f19c02fe2b15591f3501cd2deab30960820bac495f78a280f6f04b1fc6601fb3e9368d681fab9e72217ec62c95964bada63f0317e3108816276f00d4f7c088a94d9d0e4511cde4728b1a428bd9c3e598f39ac1da919530ec7050114e6a8a904da4dc4b2a6be8465532760b4500d2f24046d563396e4d4da6575420c4ad3b1c0d6fbf241d31ee8b34e5b31173fc5f9d9b87f2037f82a7a3e5d07d02962cdf72f68abc752bb2044fc376676a1107221d24e70a6fc2558b7f0f644ee99c30310168959160e88526cb01e2101edde4e1a7d471b803105ea92ac9941bc2928c4ef31b2e0c8bd524c0154ab3cc112f070999114c60c43dd1e3534c8680fe72d3ee61a1fe3fb9a4e1eeb4708278fb4ac09eb00c46e51d6309b55a78d4ffe2ce08beeb0f673afbbfe6c79f91f03fca4bedfa79867b77420c711169d42f76ce95248908b2b7d75a6b3538d0ff52e0be724c1827dcdda4e853724a21c67e9a6619f712e0c89ac887011773dd5263b3aae40340cec04e267ed3110a5700f5b3068fa451240cd83380f35c67e927535da2cd790b0760d41676b73fb74b9904e84b978282cf16797acf4b3e707fb0c91463c153a6b9c15ac01bfea94c2fcfa915239e6d61660613bd6943bf460ffc6807f78b9962a68eb2f2703ab60bf748aa94ad53524cd76a062e782e17adb08c542890131908c37dc761ccbe26fdd931173291129061dc82ce72b1428bb7d27d713a42590e24b12a5b24de8648f9b757c1301038e093c4d633e2655c70a62ddd7aaee004409481a646fee4a07f01262461f722f1c7e5e9213d1119c575a9263b128d6ab542598475f84b188f6ebea2c67342d2572d1eaeb9a8a3a1192fd60be1e3b619b5a5d31284b16c1df96f2335aa766ebd0253025ecf10affdbc333783c05fc72d94acc66995aab583526a7f01640749c5ff449ec91eb3c462abc14b5d8554bf7d711594e46a52219c3a98333168da9e4d72d0b8b01ebda5a1c862cabf3c361d7e1c68f678947ff961ea111cdba3a47b293c0aa1f3f380535e202bd744b9174fe44d3c26b15298a111917de069a586bd35f4f01b96db7366d1db740719fe2cf6f869346ea08d69f106624b6dbdccd580f1c547ef9d3f67b2b58652aefa7d467c615befa835b35494ede8cf1471a83948857cd1a297ee8477060cd94762a25643aabd722965e549a43e65e783994f5c621b7e4e5f969248357dddbaab55442f2ae4c1cc1cb601dc28c0f830196101b95d50e53910c69459e28b6dbee899c70a5927d626a6e98a5f6f45b5cf436c35ac06c36433ed9027581eac3d70c9c399050d826a0732399479c6b8c21e4d6232b508ab2561e6a8c32d3089a854d4f03440b9ed8bea05831a3aa2fd4a11c08bcb980eae98d979031c86ea0500f0570d39c79ed532b2c16b7cd7faf5a648b1d6438e4623c5455e172cf716abc9af2fcc06eb0f4995af1a26430d832efd030170d9d288422a44f286cd7f30de117cc17a1f6050a85755f6cdd491125ae7a236ecfc33293ca6906dc495aef080e3722e4e51db69f4434b6c7ab58a431eff2b08f05626f9f53adfba7319c8888cc6c29c821dadf6927db0d8c1528e14a118ae7e824414f757f4d05cfcc1ae0d14c9474a54615dd1b83a15540b3935cb2cf63c31ad80046303336dfd8c029d4796145e593f3be1908167d672217b977a85d61c272fc4f9f5b852d384bf84425c02ae46efcfc91355f7505f6f1e39c11ae53caf74b96cea99cec417cf85db704c8e98ffc2401cb532e8a51717ed62dc8046f7f47de29903f330cb0a78d2a2ae3dcb6d44e1989a22567055775487a0228c7104c832d6dcff0992a76e1de2dea54ade368b6bb9070c831b480a03b4ae03aa8a92805a30923a4a07c266a9d1d48d2f32cfd10bce09c13a3efb635496999d64246f382f07946e4ab130ce9d9c1245051ed259f461980b1440b0bb3be0f1a800f5f9ec1b8ee519bc26f0cd3e0a466d168db55f1242c8de5b6e29654a2905dc07d107e4079a03667b316643d08f5e8d7f04c6f3c71b6ec118c3e41947430c6192f7a63d5742b18ffb23862b508cddd78394446a58f7ab9c2ed4bf1f004ae83e9f80b0e49ed61874bfb5bd7f8f0b3deb83ab7f90dde1f7d3fb6651fdc436a4a0b1867f0196677bbcc66f14d56d5afe27af614e09d59effe3519d6784df7f1cff1cfd113899c7c1d1bc089cea6fb8d4b338d4dfe066de863bfd9e7cfab9756d2be7f95eebe89ca9a594520d56831b00e7f8af0e50fd974ff87c543f096075bcb53adee265c9c9aff16b715523a564a30302a279fa40aa9779ee58b283c1b4bd7faa8cad63b1d7bcb3787b21f465be46974495f222f3fef1e536c3b1f8b79ff9d3ccb3b88b61fb19560ca63fbde94f1c0bfbed538fe2580ad83ef52cac8b61fb5411ee58fa78aa3fcaec6040bd0cc7d23415c7d2683896d62d605da80e0828f540320f6402a20fb4fd894b0fb7820c9ee38fe22860f2a496e7782a2985d49ea790aa77b1a4f637f6524866cd186a12b44d92f0d730e95aab470f0d35fcf05516d73099424a21f5ce1a3109aafe292ebd5353fd6f4e4108505b6a9af6bb3e56ab23bb0f7bf8f26773dfc47e4fd28857d9bffdfc909b754ffd74a8c6cfec1a4b52c003a41e6ce857ddd76a8d11f046e886ece790900c3e4b01f2e1b3962584b59d100937c8da37c295657a21cf75ff86d4cf871c6b3b96a95340f6d80bc91efbfd1ba26c87fd0d51b64ee6e96bcf25d8d79e93d89dedb5672206c1f2a85e8b4255dcc6d1f5d6a43da784a2dea43d03f50e6b385e5b4d6b72a34961fdc7442b6d040e3e0ece5f048ee66fb8996771357f8353bdcd69046e5d2c1b1ab4d7bcd0a0a13a7e993a24daba361bb4dfa449250495a705b00bfbad3182ee6f2a2134eddba3aaf1b03adaef498593c6415bb780750101d13c7ca099f7d7fe7ff4ced69ef79cc75fd31e06e7493dd4bec5f2ac530703ed58a68e6512024d9f84e6e19b64ba2433efffe36210ac8655ed595bcd467b198e4f5035f842641e7649a26c9f047b99df3a21f4bd4b92ea581b7d8c636d1d4b01d9631fc3fc547783ff7cacbb218a10fff937c0ad7d7ad358487b95f635b497d19e46fb1aed6d70daba34af3dedb7eedbd3b4f788e8fef755839fbd0cfeae27d86b4f9d67beb6385a37844a897d2262eb5447e8bdbbdbddeddd108d6d7158f66e6c5fadd6c74a87bdc3bf5a7db16234b8cad5aad50c815efc9fa946864f40e0d04f40f6d73b3ea18d027cae43bcd904eff80990fdf55d6293c9e1a774370604433885f243df240e42354e61a5139065ed7b85cfddb209f0893061288cd20b1889029cb383a047d34d8d02f36242788cfe9c695ec06872ea20899584ead6fe125b6a7910c2185534c20ae16f186c16dc856ad01116d9452c043e8db969ceef8751e80aabc7a315d03501360edd8c42d462c623cee98f573077511bcb82c266142426b52430f37752aa5add38ce92557b2df0a048f55feafe5ac17ac71750d48f3661250a29acd0a1458a2eeaf71e0f527c4142181aeb5e9142a946dd2b55bcba6c3b24044b60208131069211105d96c008428a0db60885390ae345fae0bf418c089d79c89388448184422b91dea150240a76a704159bb06554df58dba6b9bbbbbbfba64989adab3564d909836075fcf985c4739c65b852ae5dadac42094dbdd0046593804279eac4fb3f6a4fa4774e3b935ddc12e9be15e6330b628944f5e1cfef449c471e2965894a340ccec340708ef3b09e124c44f5bfc105e54964897e12ca5196ea502413478e791f4e85cfcc3d179a7afa342aa68c708a637f94bb1386d29e13f90065ee5e72f204abe37209890495ea2e9fa8fe5056678608fac9ecdd938cb43f91de913d482103a5eada92eabf1f03e554e84afcae11f16ce27837442ad9d008ed07b9bb4f9e43eb4386c37e6ba1ee1b5575d3ce0c4f17e1547f212c8296b450bbfb4f4c4626a9ca30f6932bb22c2dd0aacb5afd3a69a67e9dd43ae09cfe65aebd589dfe16f36a6ff53e8dc4a5bd2cedf51113506cc0047c1d7169b24493e44b628cba288240b5e1cbfb2d33652720ab77ee54e7b3bb4fee6dd8c66d389b67eef704847b9fbe21c2e3789fb6e1a5cb942a4ee453a04861028a17eba3db584fe8f4292386f35042f9fd3f9a316a3fd14c0e9b4a3dd708837e3449153e4d127da649fa9c27e19d83531856e7786b57ef5c69756c48413f4804abac8f1bac8f0b70f5ef158f2fc12a0e219118f4f3a529b5bbf7695fda1ea7c6ef8e87537aa727563dcf025e592cf8cf9fdd11afce04c75a82e678ef372568c4a2c62b6a090f80cff1de679c8b69cfe35c8433285717d39e0ea784c8eb28f224e85d3a4f743ed6c17d3f55870e205b75b87565bfabc30f89a60e07b14c191d9fbd0ed7a123e3d7c1f9942de374bc0dd91bf10a24eb8a607548f63c7e4f2e64dd10fe5979e4e0f72507e2018150b21310e804022d814110a8bdf625f87231edb52fb1a238f744e7b73d2de0958ca0a4d3417716f41a6b9525aa02ac70755cc71ff1aaa3fbb82b82d51ccfa33be23547099d03a0f3292720ac25688ece99702895338342711e5fc2e9be99d37db346f7d1baa3fb5695848ec8899cc8219118076aaf9f0343e77f9088a877bcdff1cd100bcc028fe096dec9f873703b3a235e5dc767dcd68d49e0e6e3e8e098e3bac3b7eae8bccfb2ce888fd13bee15c1aaff11affe42fbd324f58eebf8790282f3f35404488e4f81ab0e8f777c0a5cbdf7e917582ccc21357e7a1c24da5104ad402c300b091c3c423a75ddcc8ea02ea573283339d0edbf5ee23858060747e020161c1ccc028fe00d0703d0bf3d08dd610f9074cfb95a6d1610426feeaf7b42dddd1eabb3efb9bbbb3bb7daeb02faf343b84167870ee1c464f41740a8028f0aa3c71290a0fef16184533677ff119650ff7dc064e639e7c3495738b567efcc6e7aafe4bdd971e86af882cdddbdc5c1eadd5cbb19ea1021842db07ce8515946d9c24f8db1fb60ada147e5875a7c9c1076dfbe74779f76c7a96bda9cfd49462aeefe081176f7ad2084f0a17bf7ff488650a07ea652f479c861843f218c3395da8a4205d9223fd2a53408218c8f42fda21e729fa9a22087fac915f19f1630d521a89fbfe1cce74cd3b2149c1f3bd47b314666ce344d3b6df053af71964aa5521042f827769fee98e309c8293e8afb5635facfa74f3bd830c6148a937fca4cd996695996650f3ff36afc19040163c68ca9903b99468547b84e54cba0e0fb539f91f8198929a43aba40b269650a2f957fdb13902ccb789be9671ca521cbb2cfbae959cc62f6dfc799a7794c3e0d37c3e5641dcb94bd4fea3df5a9d47fabfaefab4a3bfee99ea57e53dc4c7d0a48aa9bed699feabe9ff3d479f7ad6ae6e31bf741ad9b108312460821848eea298354dd4fed8effeef06fd190931e3f64387a927a1eea8871ad20da8af0877c0628eb5a96416dcc06582316b12d8a58672456d81d611610d0b1e2ffd4e83238a370c326f4cf5904e4f424053fc61863c45041688591fb68c560f711a9a86e08f6f0b713b7d5b9f7dadb2259b7683ae138374317a41ba59bda1c8c1df6dbca9b9eade977378dfff419cbbb15b61220ccd0e9874ea7a1d3d06968f7b5af937f84727ac9b113fef63c78f2dff8143b2b58b80825697bb18bf1e5a37e5ba6015faca038b6d2a307471845bd83fa8875b03d1fe745aadd3275dfdcba8f6addb7cabaefbdd6d7c3c305bd2b85b34d9fd8983163bca8f2a591c8023666cc98a42a53880f7f8f1c8155764362373b13d753cf6481f50e225a53d7c8092f395054173837a0292a869c8882074e4061e4841427a078ceaa565b84ddb0bb7777174ea1fc11a7b9bb7be3c0a9f2cc165537e76ed45c9d9e9387364946082536e1ccfcc6732fc30833a9f58d99d9dcc3c7e7bb973f31b9dca8d8f9f0fa8050e3cd07eeacf4591d3e0d61dba23beceeeeeeeec141c769cf7377779feedd1d9fd014c09d1b1adbc6f5d0513f969752b5b72febc79a6c454a9e4c5b9097895ab665dab699b424d92908949981ee30721014c2eda7c19330942788eb45cf366ea0c2776ce3fafa568312b3dc0ea3c466a66da6132a254fa64d4b5199a8655ba66d9b49cb646c647667684c3172da7f8b498b5b2fe6a8f101fb510f42639abd13d75b1febc3df447b47fb39b5f5e2a36ca82ea776a47a94356a406e35985c2bdd4e7440d58be4397de264242506d51f7af59c67e5a5c287d03b6ff579efc52aed4bdf0412c70e4b04aaf13fbed73bcec4161f5e31c698a28184372958c10152404685464d4851210400528ca2831a7fc608446a07721345118c89611866840ed00b2f320920fc0b21cf591530c13245d00b3a10328a720586bde005946c8915af48f0425575af5041858e2639d8a1036aaa7b858a1e7458a808b345961d7604218b0f57b46cf12920fc1b64a3db0e39c112315e62347901e10a32baec28824e2e3845502c0b0ed09919901003287294e1840e2d9c3c690209127c40675d23274c72888062758d9c085db13584ddfdb57737cfc6baae8e84eddd1dbdbba5d772f7eeee5ee1a8bbbbbbbbdddbdd677b7767eeeeefd07b3565e376984539258661927f6f7ea04cfbff25f438b39869b0a579ce33bf559fa747cb0a505700741523eddaf7a147d3894fa8e5687b914f51a6fd8d1ee8ee4a2eeeeebabbb77bde30f2e73ac0dd85b20474773746087b402fc618238d313a74083f092184d07bea76d12403c4ddd0cb863061b743092726a310134eb8ddc229c484136232a6012726a310326213ca88a511a58c981070ca28c48413a691069c424c382126631a7062320a41a3645b1cacdba17c69dc66446a9639845046c62633079839c6283138f422e28502af75187af40f234ac02a94ff6a22c3d11318e2901143432c5f4db6d486ddc7599af4effaafb2ecc9733e3d3d3f4f2af4ee8e177d603c1417057e3d99455586188a35a17f4b1676017c319173d24c1910e6186a02cb8b0ba433cc50f064c834ac172740bc31b364fe8da2628fbd3c01c1268f016a2401076aa4418dbb33801394589ea618431b74e1c1115c348d94787d592daa943fb9d0aff599867210802a93f0a1cad5ebf57a3581104208af28a2065bf4f00a011a492eb8a542082184b05bcdfc807ead75718b597583c3833b50bf1e70b770a972bb48b9624490521ab14532135572952294a8f261ef4cba7acfc88827557e8fcf0a308c604a952f030d5daa7c0a10f141958fa488335e6182a254f946239032244495cf477ca9728d90a0419546433f54c9453f54a130a9c27ebd5e2f2116c1077438451d4450397160ced9ea9646f403a6c45066d4834cc2cbbc824924013644183cc0253944108070389320f29c050a810b4a606122021786948c8860e2032e90e0b13e65d1ea160e152d41240051139322b49060470bb4b0808a162b24a880ceba57b458519dfcc0835b6120c5171233590ae8f77740772ce89dbfe91dc05240ea51cf825d0ca96e3d67fb7e560c5deb86e85ad30bf137fdc602578601f593932e2014e7798e179f392433a01cc4afa8fd02d6a5753744c13e861c434d188d719d5c2b44fb1f17d609e93f994c26d909d992d0eec7b54dce5d7c6229c05f7b07f807f0d785f8e10cc9557caa03d4efc6cad1529535a0419557ec7034a5ca193056f850032b7050a59c09431f474b962a1fca255a64b66b8ab4b4a00a332a5c2657b22c5d809044338b10e211564510100c4042a80a228482aa586208061c7154c50c983060e85545172360c00892260f584719a3dc2b3f90026ba42baad2a97be50747f47da83a17a42d7d94e5bdbbc6d24134f1ef7d49f5f7253ad0ef71fcbf9a40a9fa9f204b12eede6321dc5ace43c3b62dedf95404c8fc14b8622fb34f812b112cf256de82af89a2a795e9f5e20ebedaf30a8920d13c751f357519e755bcc8ad3816cfe2441116412221fe26def742cd424413a37215ffb3eef388daf3779a77acfba60c751e1aff1923a68c13ca04c74244142a9ddaf482a2caa89a6ff535b89aa5a1c6eecbde48aca86fae339befd3220441e76fea4ff1bbbbbb519d35973d2a4619971845890004da3f7f67688f7fc8fc6dcf34c3add00294e16890400d44ba9ef638e703f4e4e3a93fbd4f9fb814c7f22df529102c497dfcdebe4bfdfcddb4d4776fa9674e3d3c0149d1984040f33e3db7b5d75e888b344d4e3b75dd355435b17f7e0dae865371fdd9c71390d36f274e33714662d53606d11a3bb1a07da4e9788aa491d21e13fc2d16d509487794de486eb5c488da910afa3d0faf87bbeb5134d3a80fac0f67951750d0cf54dd43200597ba57c818aa01a86b24051337b05b3db752515854f937d42b6d1962c9480a23aa967d775f8fda3944a83575ffc45f7dc8d03ba6dfed64686f59e80a5767bbaf067f9fc64ebf2717b67b727aed7d1ac973f827dd9078bb2ff3fd39bd39ae0786eaba4ae770134d9127206d12837e4d5499a877aaf44eef8cd13b5f4f2b89e99d0f12557e72ea2edd7dfc7197ea12db3094407a418d1f6b7026aa7f3cb1b061288154a546d8537aa77b12f49c18eaff3594cadf75807a237552a784424ec55e1ac9959c07be9cc710d31e7f7b3d3f9aa705e85a210829d5f909fdbc16b8154c8054bdfbda4b0f6e99faf4e48887d5fb9c184a450b882d6aa52076231194f41da03b23f515cc7ca0df16f924807b557dd8bb7d8d91a5bab795a2ea5dc5bb266a0f28cb01f5207fb5e73922a0de847ea6128e68bb5011db0e31bab22565250a1259e0ec18909bd93df6f6a2951c56a9c6e701bb5fed807e3d35c6f789cf92b227fe0f2c7e02e26f8c3146b9adde89336812468ddf233636c2127dc529b61d120551108e82202508c9438ff5015b3dd6c7fc7d245e0fc0d81b1880d2605545dd6fc00918781866075833303d605dd6319bfeb3a81105bec1d9f5589d78020b389b131fc5c5162aa7da9cf8262ebee3cc005b55840d7929c308063f3c218aa206318b25a8482b4e20a59432ee30bba316c8e054850ca4f4f0c564115c513f8fc70fb6adae11152f8000b14e0c2a5b761c5159d7888a961d6450898111152a58c0ed8a0eb85851294195a96b44258827b61d92654b982661a6c42ffc36ecf32fcef7b5fdfddbe797923f49ec2ae0cd15d8d581459254cc8b78c59ce32a5064b3ad5c8122a6d5e9dfd599ed417eece14b96cc18f4295c7c1b9899bb21108b7fc46bec3e5f9cf6625b1cb844bf9f93d2cf6b0faaa2e47662179ff5d9a35e7ee4248d31a2663e8bd94cf6524bbd4f4738c3eac6aa06d27c8d0bf1258a66094af3ac8f9c05bcc67a83f5280e4636e2b79b9bb7e1b6ca1bbed141bd0df7fd541b1b1b978adb8a925c11d52f8a8f1889b9b497c45b548faa5145950ae553ea86e25436a050a877543744feac4ef3acc88aac48f337ba6d6fd5f1a0e970bae7cca01f1fc19f93d2d5eadff336e6930a2e040df151ef7cbda4091bc143f0790be42eeca4c25775df4f93aa7ab92d2704ea3c370fc3d02f478d5ff3db1ecbe6b77e4662653d7d3ea2f93929bde176cbeac05d9d9a8ef51f37398246bada3ceb371b6e45bfa036ff511554ddaa3dc8eaa84dc702ab5b1557c37a71e6c05009590f6f3ce4d23b360f9f937a67f5f0b94befd87858e3a1eae1b3d2167fc5dde88c7845d9c8b7516d3866715c6fa0b6dab05e1504f52a5567c43ba87750ac1851a8467d2fe91dd4431b1bab4f81ab0debc6a7c095f53e2dabea59dc0d0ec7b3e178ac6cd4e07a7c54dd8fa882f0551d1fb5076772a0341dfc196e06190ea73df8944b713db89e1f3e2bb420448669e2a3de59b8ed3184ae1612e1b5f1fb7e0afc027c668e0cbaef5d8f1ffcfedd11afdbf524a01ee1f57f38ddddfdc4a6226272dff5fce8a9fc3fd647aa4a77a6964ce8e3aca3687bfc2a1f2c969ed52a95b4645b9c1979aec43e05aeac2714fe9e820cb18057160bfdfdf4736450ee7aba1e1e8f16f7a3bd0470000677187aa77fb99618d4ffc3c1e99d7dff652f8173a61650ed0b6a02ba45f533a1f61f71eea6bdad05f47b6f2b1c5377570c47f81c6177c42b7746648d2f9f65c486c487cf2fb92df2294804d36060a112442da12e162a4e2a15a06a425d23a2312a6c1ea028f08d78758edd11afb033222b7ffc2ef033b3c45ee008a97b609bbdb3fb10426f3a970772ff300eddddc3b6cb03fdb7db5de82c25969bb78038babc775fac3598ea0db6f5411d42081d42082384d03b963783b1b1831a7f4bd9e8c231c6d81dcbbb1450b5bb5d1d6e252db14d4a39b1aeb7d8dce4ddc7a3ba2c0109ba0fdf2174251bdc18639c9ee3261b3ba0fb8fe3f19b33fefc9dbb1b318f99bbb73afc3e0de1dc186334ad8c11b6331a2b19ae8c74ee62bb302e779fa97ad2b638322efc85cbd0979c9379d1e51c6c232ca13b6df0ea786a7733191b8edc6020842ce572df43ec2106a1c619cfce210f107e2ba8a32e96a030ea56170b07803863b5288285280209e682082d588822b6fd5ab5a7eea07eab3a3d9fe6812ac460053af0e009a03126708151f9293311db3a8f0d31bc78b96e80c0882fafe93cb2630991d9cbff7169a9ff71c9fc8f8be67f5c35ffe3aaf13faef9b34b82752c21d8e9b1ff71cdff41fd8f8bfeb854fb356c1851fe1a6ee539fc2a8eeef044d0ef7b5a4bf46bade03960a8899301862754e328e039ccff61e8b7493169b328c5072332e87de2f8092f4c8a5c590f310a5cf98d1059254602d21d921a282863711e5633abe7f7cff95a9784d5affdba66c7ea2459c7ea0e06d38f8b9d393ee238299b016d281ed110d02b0aba566ab0b4c186d04d2f1db65486debb81516a5643affc9ca577160b1050e5e7a3de91a90dd43cdbd1625122665d4322a81f2b0135513f1653f9378d253542f7da801e1461dc8ae1a48c2297e4d6d5fc5bf9bb5bc21c14d4413816255dd4ee987d0ace82b0f44054651af0250b0ff50c0ab6c5f95e66c6b98309bc7081050f30ca1c044168629816b50cce6d5707a3b24b01bec669fe3fae2de3340e72dfaa623854c93d4b4896699cd669ffe3fa71f978111e33664c1a557ed45e58d5225c65f771b5c0ea21a6b49a13db814ac815597fcc3b19b95921376b1684ba452e4924a38922170ea73192f4162f9ab8706801b1f47245a1edb119564071e1604210907200c1745972e160021a2a20726d9ff0996074018d5c12f6419825170ebef3074e90a0b8e012683469cf034010526a810d9e3841113780f2526206563ad0250b145e04135b601973c5920e5828a103970cf8a00653ec808a2cbcf4106d0083194b5c714610b0e440a98bd59204144864f9c1103250e22e38092aa63842e30a125b22171fc8b2022856c045090a601091941031020f50114612537c11b7204207465d682941142330236af14c3063f12848dbde96b66186c24c552b2e44f533a9e8aaeb5ee1010ade7b0b18638c7d02321feeeeaf9b70eaded46d75cf0f9f04ac70f24e021414b926e8d7529240e7784703460535f9d7f261ee568f1eac052697940abfbdce1ef2c3771e96c7a548884108619775939ae4475f94e2d1e1872d55efd29e27ad8e63f11c7fe1ab3c0aaa5fe6a5ba6b9c07e8278fbcc8a33529750ecc450476777721dcdd5ddf2e637717eeeeaebb60dba43182ea1a899952dbc8aaf97f986dd854d8bac40775d59e505d715c65faf74457474afd6e6ee040d7888ba1faad6e5657be2c5502d4bd224650e542a8dad435423aa26ea98fffb73d0579827538c8c7bebb13e247f16fae5feded1b9980bf077dbfbaf68bc585eef7cbbbaf83fcd47efece61dbde767f987fd8f8c18eb009c00a271cc50baad4fe4c750b56b209800a0c0b6323931333a86dbb6967987677655e98843142e9bbb3777677a7bb7f3e31cf73d6dd3377775f775f2c8d6c17b6bb8a8e8938bed0ec0b9d15c7178a551c5fa8ac38bed058717ca1b0d23138bed0ae4c02ba8fe30be5ca38bed0adeceebebbebeebebbbb73dfdddd555445d30323f417eb8add5dc8ccdf6cd52b283fbbe68b81daa92f304a2c72bb0a4a2929f48ea6f6963bc696587cd875e43e19b9af3593545177991c380787517a09d59f84eacfcb9b038c92fbbcc6126ae43e126a845fa109665a7c0c54d8a19c90d25a9e6c5bad0abef67beaf8f57a3116a61d8d43e23944c2c8d8e470b13727be6b47daa4711916d8c78f2ea15c150413c17885602298ae104c04532318efb23d41762e29a58440f54cfb6cb54263b526943b37f14432f94155836a6212c61ee7c9f8f57aed0ecbc33f2c132d0b834918fd488a1f61711af8a8e9aa5f5bedd70868aa466b29351e68496986269f369573d3b46d297d4fa3147a804f27931697b0466e0619caf01ab9165680f247193d5a65b4e4a908570ad88048194a260e499fd08f9d180dbaae88cdcc9a4ce65f41a6d353315acd9642b23a9cc9d87039ad1e55cd4c268e4ecf312393b1e12adc22248f6466ddc464845a90ac4e67cc1c6c6f91206955a6cdb91dbd338e1fb9dd1cc813c9d4b46db58525d816e76b6e874836a7dfcb796e6523e34355f77fd63b24564ce80f3b4849925239a986667980a2c4efc07469b04a4e023424d540012f5e252704861964905c027c8a5a58e1478f165150e33ab0724531424408bb27cce66d0d15bb88cdcc9a4ca6c67936eafd6b9b89d7c7a6ea720daaeecfd9d3cae16c32550daa1acf962626233cd5a05abb5ee56c66b6cc52b0249692b4a37e2c25698714b4ea1d922c94b9b58aaa496da99a16aa1963db21465a2c0d61e88c2086f02ac3956a19ab14c64ffdf62ff053fb5fe88ead34f11c9ea2e441b4c7479ce44a47b052f5f8fb5e64a118858228aa22542fca82288b1b54676e17788743b09ee7ec0e2f65b258edf79f3530d7830a1affbb69f5a8310507cd1585251f22d55854ad08e56c0bcd037b05a002f078cfc7480b24ea1a69b1a4fa27a07758fc3295a6feb8dcc5dd9a96e784a133a0bc60c91656a070f1fc003d91f4840b2c72d0e284cb9f4f334e280bb110a320df9f81609ef9d87f4c84c7ff184a9035c159d81c2c6858475d8108fa3152f5d22318511b60fd18a9569e9ccd11fa54cdce4a3150490c4208a39432be00ebec20354d259482a11cdb37d73c3aca4f6ef2ec7dbe6f96da9aa856abe5ae753ee7142cd0018018aaffec72ac4e8c0e8010f689b12d4cfe9f2afe67aa2be3c907ca368428ffe6b015666ef162c5162b15c2ef1921c02d4338d307bae2d5c4c207269101508830274d6092ac2202df09e793242f9db3f59b148b1a046182212cc008410996b0586af244880743d09bba461ee052bff71e87a7ae510f5ebef5daf5de65e685cddd107a2ffbc22ce0b707659ce17284ac14f8ffe1bfdc016b1db0d8e1c9154b6378d14106a5758dae40a25760e9a235a8b4cdd74439cbd09000000000f314002020100c07442291382c9a2872acfd14000c748c44725a2e1a49b324c85114649021c610020c00061800804c51cd3608f8454be9b6dc9c8c32c9c2cbffc9021d1e6d7e272bdc10fbc851c87304a94bac24d47ff6e7bf16690161dbfebe0292150bd1f3253c2a1d4af056114f4b7fdfca17487b1c4edb6de2d16865bf950f89044ed8a8bb2c665d412730cbbb7b1806466544251c2f6a846d25bbc63056df68146ea43597d278086a937bf20ab5440627f27701783c3560144759347cb0284aac7a963e47c732dac2900241abf6566ba8835e4912dca0179eab0867dd628791b2ba0768afd6832fde49889e4965d4f06f7974f5c938c13b893d64fa03a30d13a1839b25a48f5f336819a456648ffcdbd098f64bee005cc76cb04cd841ad8a165cdfb28fa8e3be1572907e8af07266bca2aef898368301dbf6b07cef0dddd2fc8100c898dcc4b130cbf4820b92f01c648172355e90c88e5fae7f45b1938f6058b4571d1d95534ab89a3137b5f85f548bcd522a8ed970739430d482cd284317d4449ebc304072d2659ee9d42a4ed97170d324085a62e744de47adddd34d22d126d389cdf009a2ab0a67e7b830f1bdd369f876c6241d4ecaa977e07ca0bb6e67c6133cd6e386c072e62921c94a6f5b9b5b752f4f9e8420661ea851dd2df887721a72e4d92996eaee47f2eb42f2af2affa9aa5e3aed091d2d86931166d5ea784fd7c7a3aeb5d2b5673827dad6a883ed5a2b06f69117c5153e97bc0603a82a2c1595ac85e098a2960456f12ae8c9eb29821eb12cdcede45bd3cc126eb93737498b650e6000dabdf4b7f0fc544aa28c83cdc08b682d142856e1ca873b54b2a8f0942444c25077acc2c02eec20708c45f61b778592ea2e943691e296f5b9cd18750995544771760409c19a5b1f4ae08b0d64ba23c513d491a028e7b60b8c87f43ce582ade1c211afc6c96ae087a908187d88dfe3ba4e771828be6e9764c0bc5e5294e2babc772e05ddb0dc3da698510575bb785664620b0551f21328ced70ec940f0d3ff1a2390f568ab6c4f6c2f5ae56ec05a922916f143fcf4ae9e13c6390350ca853b18f6b1117577378e1b9cc4186536db8c6eca6bad3208d2bc8231ea8e6aa28de1148896d1cca74c578bff01fb90fe4d4f7401fe4646ba15734a3d2170230be93f11cf6af6a2200d7214407606a6648b8e92c20d357ac90bde14b575562db0c36ea5aa1394a3f4528a625e960146f47eecb8d176df996db4837e128a2b3d7ede29352e6b9da283760e8f9bbade56a0651a468a9419545fd5f04a06aeadd5c94d5b28f491f922fc45d563678156b753726447b12d7c9b02409acc4177ed0ff62bec0daad9cd8d5908e1e3264ccd5db207db66edb602f8b7e0708d147a1b9b3892634595424f7f8a61f552e683de03902b26470a8a5b33b740ee7254615da9dda6e6c547ad3ea29a5fba9555ed5d1a8a57a0b19c23a46c14b1758f8ebd4b7f619878c655644b869675440a862f891290989804325b6d51dcf2b750a51ac03998a67faa21a6da1f602c6f929d17229369574a3bdf18c15148ce48e71cea1cdc9d1aa80d98f45e11a0bccf9c9ef971773dd2a082906dd3986721e2901ec30ba5ee330f1bcd6b916ff6358e48401ba4c4d836e0b8d0950f22412f9ed7478c4ddad921c95489e1efb501ef2436a3137a7fe98b5e561e52924e104a49a7c68b928f1027e57e2ef6a5da2d08e6f0aa4473c88fcd617706824f2d8dbf940a586c743fa327238664f2d6108046b1d5357cb8d9e93d3e56166d9f9fc37eecea8bbff1b8e0d0e3198da19609d06acd930f17b767b8919caf1eaca55ad74fd38fbae059e6e046efe94587e003d10336bbc1a64d3e99b71b9239137c68379c4c12008bf812bf8954998c4c16ea5daf8513b8f609e19bfbfbe21701eada1eb1e9c5e956d43d2353fb33e9a884a912c24a8016a1fbb988da2745315d960086463e4306b65c2b1bfd90853858a5acacf1be93fcf125ac9d9cd552cc0431d725065044bd072b7143bc433b3e2d735ef4d0d67b8bdfc6ab7dd02d2e86a82c9b912be7245f629c4d6a83041d40629709cd87b7efa90b8aff3fd65f3ff7ecd6015d1cfa92a29638e1c195e2ae6fde63d9443777dfd25872825a0bc1aece77c6c9f4098583868338aed3b474269010381ac0196660036089821747fa02c0bbabeba3c0adc3ba5518a6e07ea686582bceb2f79ec585e12407cec6d3ce987c95b5016c23e92edb45f4a18280715812e5f6cd7e5fc43595e49a3c0802bd88311d503cf7637fd4c6492e1462b7df2528bbe40dd129c6147a1bd7a26e03edd6023d016f02adb568df44bc95cf64491fc76b5dcfa525a5bad157a78554faf9633b16be9f150da24877bba625c6b937074ab177efb1c3a77336a30f1dd25dae9dafc46b3e611c392e97c176c0ae4084663124b8c7622cabfcd29cb900b1404cc44a45c5ce2ad130af2e0a5e4b7b995981082b2cd478c5f5696153723cca173725ee6126368f820c8a349a7b889e3c9335108f058e45def14a31ae6bc9f12bb7ae101aea6c86fff41ca215d44e78ba5eb377b97ff4433be5ed6a536c99cf9223f0d6482b0817e9e1fb5811cea57ba61cad12fed75649fb4f18c1d2a11cf9c82fa6e8b7463a985c599cc5f38ba07cf7f271147398c91b1a84c8a2490599b79f95fe176cc37f517f9b873e96bb6e0ba75333b7a56fcfa436a70e7c51eb60967fc80601855f4d3db32a50f69446d425db4dcdc177aae3a40080e6b62c072ff860ddec901ac16aaee8416f17e241375fab53e772191944c59f62f26efe5653f04a202471173cea2ad3309025edb94cd30dd262ba82df554ce120f99f331efee3d31ddb648bf935acde1716f331ac1693c9eccb0cab74effb692203c55843a3a17e60883aacc8f89744d42b83aa5e89d51373d800389ec870c077dbaab4bbb378f90b388da8ff980e41ccf035739edf45b92448ba5e6b692cc7076d0fa4b457318525c8a406ce4cb3cb58fb13293c230a2d4f1f30fc5e8e006786a7787dcaf1462ddb68218edf353dd716afbc62599a73d04ff3003716875ed3035a50904db6495187bfc809f92042da2f8447827d038e7987523b54dccd2704b0cd6088ad09a2a46881d1207886a36aa679954243181cc844606dd2861a15e6c27e702a66b05ddeb24fa29e75e78abb1322de297a276fc43741871d8e34c9631acfee654cb7794acd25ac770b53e42a531404dc8329ac1212adec2c2bce331696fec93beb76785cfaeb0a631bf5aa1696d7d812f354ff18b1ac4ffa4516639846bbf52f51893b66d55af1efd903e986afb255c4d881b58294fdf50990005477e8a72b5d607538fc6d2f54c9ee0a4cb9e75069d19117c4ea5bb7ebcf99964b7ad8174aa10b91f2d9929515fb094f10decd513f24d9ee1980de659aed5bbd3068f5fb69ccaf19b1b47b38bf968cfb667ecd7d96363986f350867a090b716babd598a174d81506d14f7e601ea9398763bf3f4bd7895e591a32b4a4615859b308c728211ab59b6569ee69b6099cb8ceac7a59a4420c6694ec32202273ab5e27e14a9cd6de8d669034b60c6193eefe1c86b5845513da624e2a67eb678f309737e81f6f9915c855335b97536ef0816e2db43390e020601d82c49685584f9198e723700b48ec723165e5bd2b8f5e5b309141ca9a9f1b8b9f6b419a97cfb473942d3caa6b0b5827683c01cdb8f5b1a34c8206363498e98f967d3705076c68ad22ad87c115799faf041b4781d0eee30bee63cf47bbcb91c213aa01b49ebd283c6d3801fd23b0db52a274a7988798101870b1b98fe17d0cbeee734738cd20ca4e40cbdd63b562b551a7276870815098f6e64cc5f2a03af4421ee96a95dab9579b3733054afe58af238288e2956560c9c5c26a8fc3dd10f1f748eccaacc9912a30c283c4eb8449ec8ed1321f977a6f8760a5bc8a6aab37bd87416327d5fac3e306ed073e6e7a13706b92c5ca9fd8addcedb0954409bb1adc7f1a1d6d0fadbd071844c8bc1175da4668f7d6cfe4dd6fd2eb8193da43dd80328d439c2b7900a84df622d9f31f91a9b798dbcc96b531c7ebdb3b9f212dd286f37581e234a028ef5f2a9795e266a4266b80d89281fef6f1f4693e5d66fe62b314ef4518258e128dfede6e9e9504e741c35f1cab6d2cb652ba7ec4365969df54e78cd7883b3d4f1df55f2980ea6ef491f79f81c8ba23779c7f776cd369f576bb380c7c9c87fc0bf934d8585de73244eca9a01971733e8290bf69847b1198608d4f252b01537cd771490f9db6500bef2dce30063ec6a68e313e1aa89c8fce4d80be9318dcbc267caa40cf27230edb3ce06b4acedc85cb030e7d565b31c13b5e8fc88282ded2bf360d696001ef9f8d069061d8892bd6dc14419f7f543f4deea65c6ff9952afa86d86f7219d5e2cafe05a5207851d1ac8bedb2a40cf6bc7f6935c6c50f07943b842c8e4f7aa5e3c460077d17a65468534e1425db977f650ec11fe637018debaee59abb4e75f015771c3c04949f4c5d04b283450d57067235bbc5072b33f95706bc0948f40137b30e0a5769191a58d7cc953d9c667c33f27fb6b6b1c2a102dcc4dc1bcfe65ece08bf89c1295c30b67ffb1b28affdda6bd6eb1293df2293d6a3dcc6384b73bedd7c4e6b95f92802094fe0f3ef0252ff68c4a8a77a97020d9236b8da15f2b2322260713f99f5102baed1243729fe7a5cc8c5f8c51b317ecd20fa2332f1923f4a6ac50c3a8f6eab34659b705e76ed66cb15b395733193ac73b3e33dbcd4f47313bf3bbac0f98595084864315b569ea4ba0fb97aca7aaf0f4267d1bb24d2458a5fbfdeb70f6df5af0c061870088fd7c820110f9491e825be900a4e48419daf95778a00850ec05ab6a0f3370f118a81cb971fdf82c8daa695aeb962da9b1510442ba0000addc3e34e9b9bd147a1b6013d7f87280b32f3ff611221f1ac0a74c08156a3c1708b92a34e54225de76a00c4f40e2fb4b0e4ebea58e7ce2276d9527e644408195a07e7896d053a7b247dc3826fc733b80221082aa34e3a872ea31f89fa407265660cfee9df8eb8c62b95e874038799b1075b41e1b86554af7c3ea6ce58b834c5079377bc221e9813065fee06991945b100633ee44465cb44698354836503880b1706524746a8243da50e7714b1a1c9bc206a9265469c7c68384d4a928d58836c610fa2db4af209334e9121d093b958734ab06ebbf04b2b3bfb9982079c3c00fcdf043c27fffd52e6f71b1f98015e6ffdcd45a03cad677b6006ce4820bd042d34b06db01e0304ce8ac401456f957da10fb54a57093a4c6eeb650a14cc1888158c71069fb1fba720c7d6da01faddcad804323ad1161e0564c882e25aafbdc6ebda98563b9eba820a54a8bb70186802fa2e32a3dd33a8eb9649eda651ad5b1f1bc5766894145991448863a70c47951538aafa8d95614a7d3c47717a56877627f72200bfff8bce919170eca39281b0d93814fc7e01f1e258dbd0014301b61160a78f328028fbadd6b4b05dd9bf95893cb4b768229e217455c450b42910e88fa59dd5f7fa4afa0ba8ec5c4e1cbbaa3240b22406474520d2adfd8956b1b6c6cb1da4f38049a061a61e30061d5bff3a83702c0fb5e43ae3f5743df472643814b6a41564fb3f47112a3d39ccb2c105969cba7b722447c4f98a9cb352a1aae4e033543b51fa198c9664de6e58bc9bef12f11663c0f8402fbd837868788d9ede770ec77c05b579c96d1278ace364ac220e9bd82740c3edab123943e6aaa84eb91dde306d5ed2b4dbfe0e8303e0ac584132596510079d1ba3b002e0f4035f21e7b3822a1e69e73cabcfa16892e4534a8327d1da95d5dbf105f074a5301ea81a25a47215e3f4d97c023142c73b464c0bc00de2738da146e952c1991af025206633228cd8341adc50ae6bfbdff6521ea2c6af91b9cd615e314242df048a40c3ce197a2263fec00fca30a4dd2b639a8a1178ed7bc7e43aac299d5128903eedf32dbe6f89136a69a040f320acac995a771485645c410199fce88f2caa3b9cdf7a2482173c06bd6b5e7b8dbb0e8c303508d1c4392ed5d9fd7a1d1a7e88360b42fcd5446458cfbcff3807eae61595940799e6caa330705aca4d764e7d015057082fe6448e3007133417282aa54c88037e0447aabbc9515bbbe0522128e4e83347e6483cb9fa13d26292b2336cc1243941a3b2e2b25b61be552287ad5e9a205b61b52c1e05d0e70235427a00a56e3731a0676589a077bf03ef0fe5b672d0884ca8c9eda31673ce4f58890c2d9cf729e0dfd32a6e4d7497712b853d873e0164f220ac8d0e232108a009faf5208b9f83c688a9c0da2b5d4b6ce982be7efde272a5b8cda1841977cd7de5514c8d9571807a7c6de0d9d570ea1eb32e42a8075ae390c8e7c31177ec965b9d719dbe56cac89fa402b09278fdb4c2edbd77d8fdddb0efbdc2fef7cabdcf5383ef8d5ce833e3a298e12ef4aafc886b0f16106167aecf760a6ca1b1dbee4c23d8c29b650904f0772d5452294f0cd89ca57e9619074a28cb5828187340f02419ef270c2ac48cccbf16db4989c341ee589aa4d242d793ce6280b9594684084826d84bed924ec332a745994fbf1508564bf02404353fb0c667f7c8b87ce5b4edea913b365dbc047de59c5ba20559d606987a1694ce5bb8b9d13dd65db0c3e06f62a4cfb75e6692e3e50f84d3fbd0f437d9a571c98adada0fd6e08d4099b41048ba0f76f014fbe2a8247b26a78d2af14d442dfbda7fb49168510234d6c39fc8ff3f74beb6e22bdca555a05c996d1b0618d00728eab2f92c8c436115c83af7b20c54754dda65de0e9566f0d827d8a2019ae12e7218e5f320197159d8b986272e5b798d78e20674a72409a4073e128fa596df3ac81c4a686256593e8faf083c33d9f3ce99501342140836612d25ac55093b2abff5eae0c4b435a42effcad9c861b89d605d1bb145de6ac3af20f5708b930c949ae2f4d52e1dd6b97cd7baa248292fdbc4ccc217e8916d7a7c072ae6816c39cec40eaa22241c2bc60d50647221ae95675d6e1001f600b32f5bffcc5f6aabd66956e1e2af12ae4c6f48b58d3a207334c0687d4d9031df7b2892c5248ff694e9a2002b830b9d4d8b5b7685fce6e22e55f8fea77b617b1b436a0f60daa9055874d914f5bd3118c9fb30b6c06d774f3811528d8be0c18c7b71629e70f284546440670c3f22293b361ca90c334c33c1a5c54593a224628b4199c0b7b4e3af27ae3013c70e8f1aaa84b4c58ae27b1c104fa7d95b2ccae1adb9e3aef915e377e1c40b341942dcb93bd982e56d2bd5d0306c3e233156c519c3a57296b0b0a4005f671bb855a74db4553f856544ded289edeff67431c2f5acebedca845759d31d207cf70970ef0b65c703df4a61dce48070d50935366a88397445a4146a5e88f9b4eb03a9580cc099213defba8ab2443ad8fb9f6717461b95ee9e35252648a4c3cea63df1de4009d471c463f9887fa88f2b315a14d0320856adfcb08b3be40a57963cd13c321e3959d0ae8fa4a053251caaedfa6d072f4ebfb7e288758c5d659e86f3f8741f5e2d9ec226c7aef8dc895c3d582cb076147528fcc8dec1ec25a14a7d6cd9f67951dc63e822fc4b46bd1912e4264c033ace7db3905d9ba59a1a13efd1729745bf0a3d7e4254c50c56124f9cceb2f00e4a666dd0a3d665a45b4123fe9d510462b105a72973775ec9d77832fc9a1ddaf4d2517214e83d6b3020cc9d6149827d928b35410de88b7e8a4d8f0a5936fbe1d552c37322f596e3fe136f203dc1443bd7a586430c8fa92505bd51bde3466459554eddbfa3157600c153d78bde71268b3e709b8c007d3113021e6570aaaec7489af1b233c7c99e2730d3e20e81781b53aeb63da24245b4c93e816f440f4aebf0d017815c55d2e852f601c95f16ac2c9bc72a9f2626e85941e08237c8b72683208053e555a6a6991213d80e99b79e2d6e0c7afd7dfd216381cbe4759ba27213ef2f8916172a192ddebe8fec85011d5ee691e85cf04f3e53da0297f0c500eb3b9f457fd800c0153ced1ad9a4c5e416a67efaf250528af9262b654e93d3ae592228a22d8d29a683e3745be9031a2f000e3a45a3117a3c78d6850426655f5689a5361022e40c0a48662e95b2a6968567544bb53a7823729b8ed014d453211d735719df488878da265fb9aebda4dc99629fbe0cf10f0765954d861d47f05ea722e66599ab5b97bd6b1640e481ad2934a4ef3d06abfdaee983b50e6e80dd95ea4a7b7ad25af0b98884fcd8f56f484ecfb9d9cd2ac5363d0425c9da9ae931388d5370ee66d4c17fe0d0ccde55ca4de609c2d40b36914a6a36adee5a9ea95f9ea90a766c3f9e1f4d23903b06a00c6274011e1dd4a5271097e188ca04babfcda9ff9f440af58c80b3b641b203c8d489288981181ac01d8300aaba32fdef9cf3121a6e7499a33ca872903b4e33b595edd9f4ca57e483a3f19e3047563ea664a95385875b50f63ec22f463f1303d498234d558f4614ccbb991211318966748bc67afce0ba8969badd6ccac4f68d458e2db9df4caa4396affb7164022c3dcaf9cabac5a450f4ad95b6d7c87fc7de708606f8a3f2e2d774862f3b56c4d84830f227eb6ebfe42458d8580750912d14af4c90f4fdd224b559a6f7b8735f6f44823699abf52594bb934f24c87d6a20ff562b1d59d0362418c8d53cbfa6d914a6a3b7aecfcb118a4bf730e50fa0522c842c308e6be0155433e233ec8e1668fac4d499f8a9b2f09d8e2119392bbe052917b80b51b1d2df848630ec76d9b8714238cef34b87d82c3556051826d6c81f4d03e9cb87d0e84d1362816ad5d2092f46ccdce07a21a908f9c19425b3e2d9f20b091bc8382a253acbec0b2998f5a005760c7ab120bbad796df45d78a5411d9582da02e3a271ebd2ddc37d7590cdb2d48f4d4fde4ec561175677840e05e3f93927233d380f6324b705c759dba8657fc88c96f2f60349fad9e1bbd17ac54290ea413b638416acb8c2821010328ab1d1befa98f21690f2ab9c0f362d216b6b332b334d8083fcfd69e389c47474de9c103a2468308d35d09884d1241c4f9893c0b1828ab3dabec85337c7a28e06248b29d553e5212a75a29c0c4ca550b5d1c9f9a6d987902d5fd2d5507209adbe924d1b75c888a30ecb1d50c2924163224edecd646ae0642850c1371a69d6ff092d7d330fe59750494c0e8ae7965cf9dd69a755ab4c71838978c817e70d37c12f8e7c2dbe98f1bac531c143e52792f3cb1f57e764e310ffda01788153275e0175aa151b27c59ddd65d7b63f530e9f72be6e4badfe808a73f680745b02540a34828a2fc8672ac8813d6ba84ba38a0bf76b3ffac82694a077a1afd93377a14456f36c73fedd1b02b76eb752da4468d0266a401d1ac165e0e87c559ccc528c60477c2c31ac5682bf779c08a803e99411220a0a76df22f2752c9acf18c0389b4cad8e65dfc584deddf1ee702d62db6b7adac18480e5e6a01321f098d88611af998654459a31d1bcac5f214c903033e33490f342e47d2cf68c0cd10233a6341fd2e89988fb323ad7ee9a5f397683b0b514198ca192a7be0b83b9b7dcc3ed0e75a6746e32d910acb8fd6e3979a60c2ce4a5f263cd8bc7e7ec1e71e2ee10fc8f8b031b57203d56b8a8e107b7591702557409a31d5fbf43c78daa2cf75d4854ae87f703d82959bdf90fcb72b232982b5933503277131ec3d1c0a2241cd236b3c79792c57bd056311cad1d115c063e4c76efc8d8073151334046feec5988ed783bd8623fd244e89b2e4cc827497e5e9a9abc2074b5250e1d5a2d839f10e1a1977dfd86609e1186616a5917f3a2c2ca064390064f31fb3afbadcf5dfbfcb913ca48df55116f30bb26a688696a5954512c6a25258e8b952d02b5e1d6c2c86b70aaea025e13a50382531558831c266a520579b4cc71fb299c5ac9a86d48107731849814d641aa312828ab3bfd7163589f925379e69b839ff837b07a4b8426a77ae1c9a48a51e4a5fda99366425d7cf4b1f56ca4a88f0384cbc1bd763d18d3b0f80b8fdfeb92fcfa620bd0de5401f462259100c8320d5940c3694a98f41336f914709a34c8a664d6f686f546cde6f8bd95ce4d476c7dabcda0dde2d4a19bd9f9874e6b418c537515dfe875a85856422df49dfe10f9eb2b50fd82af8030ebc3a8e7178da63ab975edf25c012363aeffd793553b66686468d0bf548ec40977d836cb83b3371dc1af0242d2dbe676bea7595ba2d6a99481a7ccda1b3ce28239bdef8c98ad26e849c2dae63b146a5750511ce690c59e283df883efd9be8ebfc666075707ab68905633e5e284b9a5d736d989ae9418ff03a154fbeaa309fe2513320917fadbb8297a6a9b54dbc924544080f31e7c60d704292546e11851162360dc017aaab0e858951d754a7f87dde83eece56eeca424f981a541540b8ab9232c820b61a251e8debadd94bbe267a2d291feb46eded4211664e6a9a6de4712284373610c0a430ef71437adf97d1d2c8ac8e8d84d4bb42926503f48377292a6b6c22b83c343050a101848d8f5a2e53a51e5a767bb0826c372c17fd6bccaf4d13a9cdde79e727707104abe78f6567b78b05461c9b954ca3761ca4b284aa4658398936df26f6036c7f3faf8958150401364223963b6aad3b19e735d00e86ad32548bec8f6407e3663637d45076e901dc78e7853af52d5ae7cb61a7f478db22882ac54d9aee308d31809f0c5909e48a01b2001cedd50209027192564b64e5ab8757ed954ac36dba988704e5d967baea43f822db64aa0d7c653e06234e6bd48f07447b4458739bc3b319a4e4619fb2e0d7ee83586432a7adaf43f5c375182d695d2ce65dae0cf90dda4d9f4cfbf2dbfce631f02a416370397b7ab6cdbd2c4f5739c57931c04ac7256eab71d49a934a9f2aff45aa7ca4ce01ec10b04fbfa00562264399987c1f505844ca0a6f7ca9ad51168a29dcfbed68a75c0eb8eb95724272c6ff59a9b863e4ac5021b49d2812915b5774f1a8e2eeff3422fe7fd43beb344488c51e40ec2c5cbdc237b4a65aac2dd4e3c1230a7155530536ca4b38063b24e1d89539418d067fcfda106b920dd2d71a679005637f8213cc732c6ba65e26ff38264561208d6b6d203ae2650cdbccdd1953348ae56545d0c57575c246465f589a44a7ed101fe6f56a7db464206f66e565e978d095d65e0e420ba209115745ef13b8dd621a6251d38d90f368b5488bf91ebc53941c627934173faf655789b4813cbd518a2799c92cc6255d08708372bc46eca68dbf21ec6126981346787d72b3e4878f0873e2d3e40915a5682c38eb61278892f5e0b056e402347672136995ca32ca5c19a3cface2d1e99bd5268e7b4912c08127b45940ea3f8ef6c80de1b82fd8c70bc5a4c70bc610d8fa77bc6aae49e9ddc3d35356adec7413de782c786b0b5b02b8870ce42651dd2c08774c69b184b488ed54c6d01a78d0f5a976aa91999307aee834b4fef1822769066b2b48c5089b50e7d5f75d703c9d13ae7f2938e4d95ed52c4fb68be6b57055ee646d4619ceeeef7ba5719bca86b2b8a014395994fd3861fa74b99cd5bb153f69a14f099e1c5236a64a4852a13e4749070fc916cb7cda8152378c80d117ccb52cd37cf21c97982ef4edf31449ed0ab4b09c1c5ec2f4ca538b57f6547fc4e5d565af94ee383d74b23aee29001b092c1eff3b306e8e640fd4e65b5c9f3eca9aea7a4cffed62151007ebb2b7522eeb4b44c078299703771efee6123caf304f98db0c1c67924c984da0f145c1ab2522932ff2239b4dfc1cbdd4b4d254d2cad0481beb0ff12a97075d4d5eccca930fd00d026053786c350b9c7d675502338de89267108abd0c3d2c6dcc8e304c65165cccf785ffc3c070d96ed70bd0ca9631a7c98412c2d8033501057b06770ef5d70382582343a8063727bcdb74df3ea333b96c292613cb6dedac033be74a8a88dada16c9e645ea20eda6d57945e5e438c8ecd5feb2cd5faf44867596898855b993dc687fe4c76ee96c7e557df061ac6a3af65dfb5e2df9864de23718387355758df41c1c89fe7a66f53122ec5de1f0795a8f90e9b75b991ff74e3d16f9387f97e40aef12ee9f677b999ae0a552ba4e67da4b0db0474b0a55b33208dbb70fef69a6edbcc9d659aa6f2006ae2315f2e05ff574fc701ac15e8538b850ca6c177f60e0c914fa4c7b1f5d8b5aee97c7be3ee6771aae855770b8efef4f6570ae4424f6333e03de42980f0effea7dedb395c02407a037fe6b6ad8ba7ee00a9d4275ab824239767ff405de3912d4433b4d97d84bd3e76cfd635b279585254404abb2b3e60af7499ba833d17a69fdb284ffa47aed44fb2629078eeaf5be7993658db4bf7cae94c66985ba2fc27b3427e03eb7ee261c90dd7a890c1f517974d9d87f295340e7b83df180dc3acce6d378d7d4dd76ef36e01da2b68d550a6ba71066796e23098c99eba85bdf222a237029dfac40d3f7a8f7510597236fe658ef7eafc1544b742a0574c10d433ca554018960043345f0581dbf837e94b6843f86f8261f580055733c9ff18f6cb16cc0e5e8d7278ae77bd9eac16dfaaf4fe6276223e8e5d0608f39d4c0ada464175139022de52d0bef1c1b578d073cddaa1a8f3da02476c1400b7f4afc9db69786efd90bbaa6ad795d537b97f735f25683d2ca79334b53d20ad3d57518207059df7d67488fc76e6a9c19188732f59c61db2cd2bc833f91a8bd8daabe4a3f6625f205f5dada1e8e83f4ea098b2294c2d4976038b4e8458181b02b3d5984afd439dbb386722d9b64c39748552ffb04b1d3c41718d86430ed53fac71335e584970787d0e611d74c8c94d3865cff01bb1cf192ab19ffa87d4be870c78186d6b1f0c002a1bf6773f7f2f5b5941e88451ff789e767d98505747e3f5a722f58fe9fa555984aebf7d4b52445e9e9f4f2e300ff50f687185bd0f4b35344a48540f8d8b7081e9c8f7398e1121ce1e7898aa7638fde9f13c86dd17d98fe11c04250f240e413f39ae6545be379316176ce96f17a53e54e291161e81b7de555b18feea866b98276fe735507fa50471f6cc21db3ae4569169c8883c2693c862a7ee134d655b4165be7b5fc519dadd37b3eba77611d63ce05dfa95f455342b40de563e84573c84bd5522f025e4ecd24867fddeb4ae14ff1cd81e2279141218a00056e1e8ddc8e311fe5fe2b8d5c4e7692e3c58b164be28b9e9a0ad695a9560b8cdb672f82701f810e48a1741425ce4bfccb71a355ff5c63149dbe0956db6dc33bb8c0e91e94ffd846725f86d34272b82807651eac56d89c6cad05fa7085432e074f5e0570c035ab2b611ed482771dc8630712e22cc8d9dcbed5cb264c8d5d5d183ca568b1a212904d51b5d7059ea5822a0440592c5ee79aaa7392af5773764daf377caa82e45cd732c2fbdc8c20c6562b6ad8a2990a38eb56195dba0143c56ea3091e34886f1802255c50bd6ee4bfb543ede6487e10d1f437260b704cc24a718f7ee619eb098fc7ffec117932df5822e2ca2c43fbcb946a0bf96c1ad321bac3eb06a31f5b3217a9eeaa24170994039e237d01b4a45c33739e749741b93ae2307d3ad22335c5689a38aa2d7a1a03dd18443cd791b609d3c67a285dde97e1e29fe82c3caa48f4a5b4afa1450089bdd9a50908d5a1886d31db0df50e7a50ebbf1579b900a2a7b410f7f8fcfa2f4b2cd9228130e4d73a5f55f78ec2df04567798a99160353a4ace0102cbe0d31e327fb8d81accbe0f49d7220fb5047af0ee61b348f50f8717c6119c0fd1023b8765a09f3de5d5f47d764f2fbd3c0eea16cbc879e856d044a18a6d501dc0a1193bf7cfbaee31a163448d8b1a8e5d60b1131e852ab31b79dc65cac4f8ef221d249934b4c535562be9aeaea05d35d3e27adb2ece372a007332b26e6901942d6a33bff588780d64d415114631330cce4667d6414c07e2b543a921827f00d7ff5ce291e9906416c22f3b6b580202063835e7eba9471a5efa58c9e0beda225242a7828f87177462900669b980d3ca9b2f0a217f8cc23f02be60094397fa23252556b081e1ccc20b31988135f79c49b186d1bb3acecec6293a9e42beeb056d0c0cbf7645ea0cf21f6282ba312602753c3a0ab8bc41ef4fb7bc90fc673aac16bef8287b43ca03cab9157fbf87008db3d505a38562ccd79f2da72602b76127e977dde2b8c4633eb2d338fefc5cb483f377b5b64827f1526d4c3d22d2cceb9243f2057211d17aa112b14a249b8e5b2aaa860830d8687265e94aa80b8f47b87f1bf6c78585f6153e1ecf013875316234f615ad03c1354945f405d071932fc7a9830107f75eefab9008cddcab1adf6af363411c06e9840eff02ce0e90a4797c20e84af552f63cfc5c083eea33ce3dcfc2686a508443ea705fad58006b99ad18aee5b6af085f7aefdb3326eaa6572a1511915169634e95559e9f51344e43793224a2909f329fd5ac106c87356aa92a6521366cf8ee77b968992a8944ed698d45b80642a3b7d1f629f33a1b6327c67c52fbfe2b8b03c2918c5cb16b0e857588df785c0976cc05cc6e7216829fd2c7f1d8643832b0aa5c5a35057a81d1d422286eb30f72b2c56833200579884f186897ee6deed22ec0491004823f7f6ed38038d6800645803f0a4ef2c8b774c21fd103c95c00c927625b4a4572ee71e84800cdf852eee7b46ce2e00fd5111e0c9764b0578ed8f8d5beda1f062f8bf8988316af4120868582082ea913007f6489451e95fc5dd203a663a881115b3bcf748082b21624f086daddad81a7d2171174d9acd10820f0229500858cd3be01b28ccae4c2c00715d06a0c2dcc06818b0f6c844af7477b2ea904b5cba4cefcf36832e0754e64d971f6025ece8f6c920ac243d28049d481ca4a0d6a6906539a761719999090378178a4fa0d4f71e22c9b74268b96cfc51234f7c457c90f52099e323664e5afbe47fca7067f556139ad9a6a441d99e30b8fedd4b81d095cf9bd00e7e812d2e3bf0c6ac8e1d3c584401500bd54b115cbc4f5d70ccdc8c5dd217df7f682b3a2b862cbe2acdd3c345d1720f38810faa1bbef85098a7a45391c0256cea3e53c6c960ce3fd19485deb2238cdea71fee1654f2480a6a3e5bda8d033f1631c1922f33ce8dc7c42306c74c125c9cfc5c712fe5ca1a0c70e7e4799cd1e0574a0742201009bccced13d948cde8a446cef0ea5579066673de9666edb0779669f9e2294ece1c72839fee01593b4f37c8122a00923308b39e2acbcb8c0eb3f3f37c5eba9534558d1e6163fbc668cbaf9222177ada3e590156639515868cfeebc23622411e56e9925ba9da66c60711439415227f56591f0f80cbe77d76492ed57e1d344275f1f0cf0b54f50e80f56637934d21fb81518e51f717030c6a310124a992ff559098540e23ad5efcb99c50f5ba59024ea5c00d72cec3b9aa6114ffeb026470e88d65eb5de2ea3ebc60196378a5fb56f89a448b4ac8ebb0299fe2ca71049ae0ab64ff42ffe8d0292cdc45e29e87f67f02cdc2045086e82088244079850ba0725be79fcc02ba19f84f3456fe1356d0322c3fcc759804b9b362a22c059ddcce9b2793566dc154cd306309a122d914f4ddaf63546226f2321cbc440bea1374f9de5b33f458a6b92f75d670f08b20b7e0c0f329e140dfb9c77da4fe98cbd65f06d54ddfd8f0a8e04365528be84d78917a384dd34ba4841244f6f5e4c7f28659f36f0c8580dc4003b397eecace0cbe632a6fe3ab200f80aeb5180666b43f13603bf9162bb6c29a13ecde157fb51c308d0c6c7a88c84724de2e74152cc48f299f0415482c1ec96739cf150c23f0a9d51cbd236046c73060a4ecc6432cb340e3f6ca4c77537cdb9d197bf846c508fc395c3adeaf1396b3510aa1fe644bd8ca5dc0802df07a84811ec977e49ee926ea36e71937286aa322e0a09670ae61aa6c9e331115c542d49d471d29a314373a055dc5bbaeb2adf8ddaee2d426b4d78d1fcdbe4614e3fae0178e05a16c79567904c27ea7db6ac6655812cfea96bb91732c754af55e207b6f24b9ec63828b5ca0519e5436dfc81457ca05b8672efa16aab1126240ab5a561a493886c79c84972d94c8bc91615e8620d7b29cbfe422763551bb823c5f6d0ad21ca406f375ed5dd460a341a916943922652187a0adcd917080f7d3667b3f1a55735513ded1f557c6bc84d77968b176a604388a15d30b8a32c27506d46c308d7d9ef3375a9ebde188ec7fc13ee572c469024addd195b27745ffad137def7298fb4c47c863beb112f009778883d84bd459704e9fe2c8fc03b40ff386038a4c22e89a283c28245e19429799531d0e400b70e4aa8d143bb59b962b60a9cdb09985f329e4be3e67bfdc1a63e0888fd4111fac6bd1628c71d12157c512871903f50f63204bc46378612299a2c06b32c6bcb27cd6459bc0dac9bd585d3a76b9bdb00ba697235c1ea1504ac413775eaaba81032e44103d0e2bac974992dc6a5a48a554124bf99b33c5037016709efbac398851bab6e8b0e25297888b65033694442e05e00682b24d27b238d107274e441c30fa5d5055ee4438495a6f0e751a864d6820ff7a30639020f4b96785fc3617ea1d9ffcd880729f2ffb5956d0acd8c56e128879c5757071b9368b7dd94b80db8f30177c95e96f291147dad6ff1493555297a1b0981e73de95485471f2b0e4a2761633e185452c6a558cf345f16dbae88c10f3b01398b076b4d5484da850efab2e7b141fddcb8f0536962c13f22125ac8527ec232f8d35888d7722db6bf1e5cc97c75b732fbacb99113f583007de0e3e3b114b369c916919bbb9704c11041ed6ead298e7d080bf7f5d55b49170f0a6351b666e107d33d41a1352968d55651be929c80da96d7b0ee44668e7f3e710ec161562b5102470c9df96061b4e79700b4c3303af990d3d20d13217fcf1d4cf704beb75935a57eda2c79b28930128faa049a95cfd5432a2e5ed8655f3e244f5e0b03b577741e5e00768ef593ebbcaf8503eed423d574b20ff2a37d40424920c1becb3badc4b3b19bc94a948b976574de0a88434dc6c9ace4749398ad629b4a44cfcdbd87de1d75a9740b541afc1ea20f42cae66d8d83f9e630864d4e09e617cee461112f352d86fd1c082d033902945b59e805b660ef39e47143c375933a7b737b77893e7a4e60376ad010eb416d6849e048c232f02ea6d00fa44c8601d96df8b08595db6cc20e613352d922592106aca727104378d36f9d575f500b9fd941a051899c70ac4880d392778f5759dfedc268b0917275676e8f4518b7a619769ea70b573b87bd6d238927cadaef67917f7e54d2502f3a1f9f93cf1e62e135a91e385e238ec8c62db960498e91cf5a848b9f05add222d6272d2e5732c70d8e33a5d2d45c28bc33a70ab86ca1a58cde381da93f6ff197dbba6a340dd659412e7f90d4275041aa6c33cf9f19400c2ac5d193b22d979e2d3bfcd4ca066ab148ce37d6982742401c77763e3463f92a1dda50c4946bcbb7339a9d26c20ff25f42dff309b8da7ba50ad6b32fa56a5739fa6f470cab299097cd81bcf4ab20a44db8a38672b3358e46325e935593db8187b474294e8b2aed3899e538d4e982796293729ba6719e34554ec7323d02957862f32bd6572a99737b86d74e833e98e3550f7582229f5fc6b20764189de5c2d8b278bc5cd4aa96731433eca12f6ab203f21e885325da5d65e7c2b350275dbe59e450db9e64c7978e65d3f2ff124a636bd921ceac17d64744df6a5b3553a20fcada6d2bde210549584550665aed23e42ce691f258ba1adffd2d7277dea344d8d3ae8a13d608c56d84c5283daac6ae6c9b15d5cbd1a3bea91a57bfb4631d07b1e78f7752fd123ae1ce1d46b1a913bbbf67522d3550d3efb1fe359953e9ff358767d0c5dbbe6be9e4ac1a97e9746997c7e60cf59a940c8232f184a0b221a9ca5d9a3ec0448b1f8753d7af973e6e121c88500867eeb03b8973e245b6528c6252ce10cc8b3c91a731463349f4d79f8654d65918f2e73c7863bff62884966776f24b7d65d0c6d36a1b60b73c48c9b33cd02b94f89badca817fed5117d31bad9aea5ff439db74b2a81cfda33bf2b2f873a8f6e72df320b0ebc5be1b4295ef7ddcd0dec900bbd657f6906c919451c6ce2f8235734225abce4661cb7ad488af179bfe4aeac667089b5d92d63c2cb081e2a4ac61591248ab038e31f72cfa60988b34f4fae096e76fee20a396ae211b11e2c5d706d7d756ff891a5c47a003a90e6a0dd17d175d7c9bef0727efd766695648eb016eb0d81732789f6a41e35d50234e25209739da7c1872451b6b858f7ffef942db4936fbbe3d6c967a1c3715c10b4b0a7b1a8e2abdab58d002a9d202904436381bccc5ac760aa324be30658be52b9328fa94f96622415e8c8132c9f45795abc964603fbb1c84285a2627f241537e401a11aaa324c593c2f3aac520c4241eb08903a85e72d3337d3a7281ee71e9ec7da310f9dfb2f6f8a8993160b84c4a90fada7e93ef7a24ae48d268bf38d993fa23a15ddc55372d2bf23c6ba43aeeac3925402194dabf28b96141726997f6b94a0e4cd996b97d233634ab6ae0379a69d87ecf284b1a5452cffbe2935724817e50d94a9c3baaf803d5dbd0a36b67554131f1b4999ed6df8d854e53609d0501d58e53dfe217cf982e6c6b2145ce4125fec2fbaf89f62d61e5e180d38cecee5f1ec09d2b2a04fd53f616cf59d619441000795a4c0ad6c37aaf31da3f231fdf7fa9c4452f459919b672afa758989daf8a2d48dcb421966e4c1f722672bd75a585500de2c09a0fe8197c523903d82858cd01a053a56aadc9c6ed43421945e9b5255f45dcda260a2214c4f4b03f6394ceac7c97c8b5ce2e61a2ec92f75940067b7894f8a7526763744d8b541d20d4a6957136e11017dc84a2fc53c3fa3a119c5a40400afb635a638159c150bfbab5362aa1a8fc70f4aca4cfaaf8d476861acf720e08006cf95382caa355b5490d60cf8d6e88f792c58de82ad8cc651959535ae17c6634b8cee900b2ad5efcf7d4b53005a48ec452df23f3b5782d92fa9f17917170d588347e15e393ea628f687eec878e16df1fd519eb75755ac40f320a44b31413af47a31662731885a1541baa5be7854b4ab5a212de61a1da5b01feeed41cfb234436be888e2627c0ac0426b90426982ada62b2cfe4d10d38a89051eed0d8cf1aa2f47e2c154b49787b8e12477357333e6ee39bc35b0e17312e93897a221a071be6a2efa3bb68a6c83342727fef2fed5a26a165b473a2eaaf2628f7e8d6b9f91c9d4f45a6df49a8b1a7114c1a1937fca646145f87e7900bf7e236042be0108b8b2f21601c27bc47a06938c602eeac73d5f2d939ba9de9a48ff5ca62c61ad92e93524ce948805a7b5473f7a7c83df6c09d9c9a43b48a9814aaf98ac574d2ce1195eeebfbe2ca9d378b06105f4fdeb5fef866eacf88e135b4cb218614bf3a0300b4a75807ba5c73629541c568861340a98b3290db1f88b8b07f255b880b26f51b8c2f8a0b039c32c396d2dd86cd7ed67ee0ea5560716a34441940325f00243215cfb1de84aa03090bfebf8b7d1bffe3e330c69dd37b53a43956c7a4554e60f882d552fe369c590159a897e2b9eec64e1b1907d1490c82eb30981d607add602b7b6f2fd3d3f32747e01552a0d04ff7a766a2c33d06350b41ff82d8ac5256279992be7c51b0c32f0fa17bc332783b1f035c4b6219bfe8038a5b56275182839c1b7b1712e925f602dd1e0b2127a5f83498b03f48a580dfefe0c2bc040c3222139a07e3ab10db899a35bcb6a60deb24afa8d2285612ef1ce90b45c4d6437df75a549051b6a175b4762a2e862ed864c396f7ffbb77f34b904398ea0cc596f03e95a30137bb07db52a4233a4d3329e3802c014f7d866049f4d1581f1b3b596eaaf5206df7d5bb19c1e152e55bcfbb13e822c9a2419b44f39dd24780797d4daf497333814faee1b2161f0dd37d040a77d608dca042bd28f11d400fb2909dc270006c6cdd9836bb09df680cf66d9e3a783979ee7001b25f78913d814f0d344e53ef86521263bdee2b105d0239ad53a8666141153bfe20f38d338ffb1d05d7e59164be38ba14ca282efc1e7d90c2e3c30cff83a7ccbc99f40aa644776ca8d4218026dfb1427c6a214403d1433425fa3690f4a9ebf9f6f879578cd8a8506a05bd8fe66acbb8799dc14ff2d273098914d5a891cdbcfcdd880a4390318437504f7bb7969514e57e36857d78a98dbb0ee520037075842310fb7fed3400ee6af5a4d96d219227752272860dd4db9dcef922744d52ddc6480f394e1e26b50af4520efa2e436a7968da65580199b5d68c01584e083bb1059c64c56f3602aa832b6727337b5b5bb075dba57199cf9e5108cf460befb386e99dbcec1f6368671b07f365d3e7e63bf8f1b5141d5f3bc18f982a881157799b260ca9ded517ccf9b3bd5d2c944a9ef34cdbd54155ac3e9dc508f8d8236458a0536389723784ecdc874a87236448feb9340aa8062e228463216af81053c072e70998105372431f1d52188232f069e1a5b000bab201e4796ace4f7e3d977ac387303794419ae2064823a5ce900ded856ba7e6bb8d056906c7331df6e13491d32fcf7b168a3349519408205e13a6b94951adcf3c3ab933bee2637926c497ea284f3ae23c39bea69b542f78dbbdaacf58405108f8bab26e48bc02504726cdcb9f5136e425882ad69a5491ed8719599a2cc0c74fb645bd615464e50ff8c5ce6e13168488c468366fe89e21adb07431e736198cc7d342de1c37f5fe2667a2c8eb0b46892d8a367caa6dd08a701c41793d30a48a8bb9e2b671cbec7464e09270e080162c42fd553cf81e2095e2b83ea93a07d18680dc9025b2b021c8230499858bf9cf09bd0c27f95538c3e0030822e58811526cd3ad3a5e8db82113457494bb1d65b977285f8fb5455f1fe889b9432ffda32b1bd4b4d9627416dc4f134fd94975268b00d0e9d01a917ba6989a1a2c1b78e8bc925fbd871721001ee5e4625d5e97184fc894c4e51cee6bdd35db24beadfb640f0e0028b0104cb3931928b95d1bdb20ff6d771a86668214b64f6019f2b4acbd2961d2ec20759a16fa81ef6fab5483e2c61d1cc3b155a6823091a883ec141119b393dbe55d04f6c7325c507192b603b95787353b9f355188a9b5342d07c9d2c367ca30f14e1c7890705267931ce7bc6b95ef8cf3ec2022d266b1d291405c63cb58b0d0301e14b6bb1de494e7b62e400a83965ae31952e1ac70ad3b1c7f41c284b09f8d811bf238a2bdac431f742ef34f0ef35c4a42a3e9759d5c9cc9483a1985c4cac47fd0dbe6580d7770dee8d7e0aae4df44bc05db386b1b7265d8ec8e20a50d3ae51e2bb19d9ed14ed623aa6b231f9e29e9d4101084e834d93af145a7290ec3b55c85583f40447f12470da6b2ab93c381fd6e88e89871e6109ad4e103ab83424c968746f739e44c4764e54457e231034b91794f9593f9c65c715f8d06f5eabc811ad69ad22ffa0f12a84f27f2ace655644b328af564aa9b54e7905f4d38bb1df4129ffce20dab83ff332cc5a88aa857e31e7ae6123424f1e5c9d24618826159263491c86159a739e6ada2dea814f36bc191c892f527002c8d32cd45cdbe5df6ce4b481f5c82b1931c240e01040a0ec9cebe11659f4c46c6cfc87bbd5cfd52365901cc118fa7ec3cd684d5e28b5e5a6960d73cf6b4afac4c99b6d2743f693869bc88d600144c4f4c00ea1acfaf6591878c3468893a61d1908475922f9473c66a29f1325e2f155f1cdc8f07985cb33672769020107b89d2e4e34dd438a0ee62cc68d0609b0d80dd51cf541c4603a1cb2829e0c906b290346819e063470c916f51db4f922aa8a913c7d50eea6e4d0c2edf7d7166e2c56c8a791b7ca8d28f6eadc7ddf943ca0fecb56c353d0004defb6fc19901e1ead25505c12678950b30985537a5ac98d1c51c32311b19af31ddbe8ad899006af2a97f98e785dab8507fbd664ec0ebde03dae61a82468635a7e24ddb639601573914fd44258dbb8be0c0ea86ceb26e3a9fc01f5d42e33e09b11b6541d287719d6ac441d690b21182e13a4c9d1e75e130147d2c02c74f5c5d3a01d968dba3553a6e082bac447af9a075c8acc872e123109011ec35d657062241f4c35a8880acb1b56779121392c6b085840ae8d15aa1ea4b035b2143ffc6708f1bf7fe4d715a4240306da9a759915196a2ea20747289686b94b62f9de047cd0093886514175c61d24859e60442d5260aa6bc8810cabcd16d2666b60dc106356e879d861f286f69ad150916e9e8bafcfefdd79a0d36bb8e50a1c831e4792f90a93c091f80b4658b6296c2ab8712ec442f15a0fe17b5fde1bfc24f64a514b318dadb61d453c74ed0329ac72a7cb299c157803320d3b9879853145e2daf99d866b90a5821e331e0e0151c6e4649262415489ef81dcb90c4eacbbe8d941399f9e129e2d23c3ec44325ad42a809d23700348866ed425da81eeb7cfa5f98511113447d4bd749ad7045f49bf9d893f86f9e433c9a54aa69f0f784848cda0a89fcb7610733e4e15d0545c6abca6a1740453d1d1a7ac1e4c3bb0c303517bc50800f3b73856fe843ce2d12c2db6edc86cf6895ab050fcce1001b80cea1369ec3eecb519ae9de6afff85ba69df48718124202142664c4b8a7f226d1ff119adb9d48e66db2f373b91bfe4d23566d5b1bb85c4efb8478efa6fb3da18dd1fe12964f321c57a9fde78e625060ca85de69fa9869b0a50c27c506f48df69840d3215f9a6d33ec1afd20d173956f373b16f312fe8ca36014310aa4c2206cf9bc831d085e3c1533f52dddb82698423c6a97503684203282c3591f66bd5a4a88d98158ae9f8c8c01e883cfd38edb5c9e2ccc260e88d24a89e02b613447a73e83b1c5825c5be46c2ec1774535eb81ffd377057b4aec643feb02adad28c0bba34aaa2f9625f3466626f0db1afe2fb4037589a6900d6a5153319ce6e8430f830b66ea50577d37269ff886854c6fde2813fa4b8f8124eef8e3a65e2bceca3a94129d94c1414a3cedf97962f1857aff280f60cef7cf558f0827753a126074f436b3088f5e30831e7b334dcc3dcd877578abca48b1b0de7ab34e49024b24daf79c79f8f3271effe790e3a0c91de035f9a01c889bfd4c1c0d2c1bad85374b8303a738921f9b911a8ada411e178cba0a4ce684614401b51f7d881e073d21009fbfc7613d1c4fe10630013510b0c18476dfa7f94e1fa7c69f19ad2931043a070e3aa0cd2e3e44654988a17d05b4c0142d8a9eccef4fe11de1df9958b3fc2cbd669986306d1d3c6230a93e88558e6b055843ab9df55d72a1602ac2879c227427f276b5c11c2c0078fd0470d05f4f63d33488ff6eec25b2d95da407f087c606cea99ba11bdaf3e6f092bed4c21b86ab17738c4380ddbd95b9a6018322b7304651a93b31d6962ed561e46666542a9c60891cabf50981cbe65b31255c924d56393a7320772e6ad6c006a740700f40eb9f036abcf9a65178cdc2169f50b9ad97e57e5e3800e2df933341a94f843608da24ff00b73f5cdc07379fc401eade22053c0202813b9aa43bc1d10b787707a11d88055dfe6c6abd743b4ab7ae2a0a094f5a01c276d55d96cf0ed6179ed9204d1aa6612335fd3d843ad23d8ed53c64af33e3c3c05117ec05577bb05ce963457d4a1017239808c4cbf0cdb9a5e5025f96211f1e161a9f2d00b77557b7c9714340fa89651b00c8e028bc3231d8ee74da2d2b11e25a5c0615403c1c89434bf826d58a057282d2a39760744864077603a939ed665edfd0e296476d276a4509d6a44bbeea5206a8c08c5417d34905515f738a9aa0c3d78dc21b5f5d9284a421c4bf17507dcaa89640b9fc5947f0e0317ea6e63367b543ee19a5816425cb3277da6da522b90ac88ccc4b7164fe48d7aeb6dd8f8c9862477c19b32b1d0e0bd437be8d5a66291fda6ae3413cb2941c89eb2397d91024dd8b1c000e2e741d0381d88acdc63695d9a58e70af5e72abe1a54b38717fc57a519f7f9e87310555f9605326a44754311e25a5b99b88d9488083d0a4833287e6cac4ff3a5f040477198357e8631f15ac5458af88c765c1467d68cf77da814443f5db5f8757010f52da33c2fb62261290671acb10c87c4b2c21d4c6927385925b92da700f5bb6e7097c9884b1a54e57050f5d783aa09e11c0cc43e5bbbd6290fa1e26ea4e3b220997eb6bb8e80a6d181d8b7f83dbb33b304e61c2d8927c958fe5e82d386470434ed45fc607448ba9a1418f71c82c6607b56e4415a90ebdfa8750a18a391365d19f5ad7ac37b79131d3e6a2b126a4d2da55a0d682184029806ac215de6c20ade7af259ab8341ff734a5fc3dd5682b98f17778bb31a7f2d9f9263c55e285d5d264ba4b871fb3b8717348e58e7e23f95bf3259da357eb81a0a108954d922e3d57db86f7a0257ffa65ec6a2222413f892d901d03d96542d9728f1145133af1208f002487ab83af9d1eec63e2557b5752db1f81716ebb6ce9b26678fe8d209f828f6bbf8d299ad5b0ab3d6b82a5b8525270dd567ccbb19a9d042bcc61cce94223876e141e51929fb7b035822878009b8da1899747813701314e0007ca455a0e393d5a933af0256eeae6465653c8c8be268e131b70eab92e8122aab19ffd3508c4c8e4996347256e6a2e8198cd4cc7e717b6035892e785019cac219dd957bec48e6fcb6744472ec90e7794136a5edb4673ce6634de0700f8a8afe0d5c915941c0f8307297cf5991b2ae1e7cd6fd640ec6177e1d03756eab48618ed21ded0b1671503655d289dbc81f3995d6fdf3a106541df601c18041d29b4f0c7492ae537d52b050168002c3289056977ff23fb553d88e32078edd71289107252c12b1e018e05d02e4530fe3d6f89ff520d0e59c580b9bcb3d68e8868ea834af13e60cb15e2a699d2d4b8a910378de232e4816aed227197af9612516b031b92d299a1c0fcb3828b006d2557ebf89db9eef4716eb5d89712d959f74b1c5d2ba49f057fa73c4d5a76e7f40c75fb8c570ef9d3fe8eb5d6a9db129c3d75f3b2bb9b4c179e1621abf5bb395e32b694b8fe7f2a8764b72f237cb6477fbe80722d9f97bc56593f79af73e5d0564d809d1cda42b884a6a8d22a574df84c9d87b206b6295741274b86f15eb7a27c4014d284c3319ce11bf02128abe632c8486c3badf864186c1192e31c50d46c9cbd6f25064affaa75725079557bad8cc11d6ebb280cf2edca2140416defb6b3196597c970da3fc152f6b0576506942fff51cf084834c2dfa1a6b0d099dd023537c129b6514d87934a4f96cc5b650815cea81d263bdced0634410512d3504c49be0f34ce522f212412f8792b0b8329bd3faa1c9b19f08d1f4a1e44d6d5b147ee286b1a1ce57446ed58ff17675160584872f4baa750875de18923f96280474f3fae9114f0bdf663c59483101bd158631145a64a8ba3c556b98214e04d3e24d274497b678a6b44edac2e806fe78bf4a7ec2fb8af68e7c50e2ba6931cafb7fd7f933dd60edf0ec510eb1994e5eafcf5a3c85e6f5334f0517aaeb4f184fc38712433cfd104e7b88d35c78cd6ecbef99a99d45d2043b0f51c275525e2ca55f134876d374363dd7261708564694a4c24f75cd1f0edcaecffab7d9ddaad4428bf6ed3c06fe7f254c5f6fa93143da415708adaa270a406959c3511caec7e72093f378c3968cb1819363b247789074abfd74872e3f8ddaf995d2f9861a951b77afa225b6ba33074a39aed98ebb50e9f7ebcb509e72f1a77cf00aeef0dc68c5ec37d7533d97199e9d9caf53f78f5647e83274c80ca781b303ec29f6cd23960314f532e052d7660c51e342576aa0f59d2ec1bdf86eeff9799719259b3360bfaa2cde647f84ddd485dbd22481912b55f3b980d8d5b26769b65dedeefa85d3ed93022c8552715a16bd165540a711c3152adc43d1b459a3339d94458f74fb7ed6953bfe7c557309f3916b8e7ee9271cb259116954c48cc2a36a0edffd20aa238b5602f2a31c965a62047ba85bde3242d77c80c397c261ac54c75642d2cef69568a99a4a268c4c781e2a984d934199f45fdcdf2c5bb4ddef920e65d56df42cf7edc2f396ebe33fd0fbfd1b76d51094f814a0ffdc042357223743e67c6b36058a7a8f39e3c94178a84fceb1aec103cefaca962859babedbcf2658a35796dae48296d39194b65a3c7e8f73895e65eb7da8a90cf786287c2e462ccd97d34a2ba20fb71c949d41f517308d98925727ad49334a9669def09ff11b5ecc8ca34998954737746cd9e022389082963a83c349417ea372fcf479f24f7578afe8f6e6bcd5ec00d9782e8d77ccadd600a5a811c19844bb00b3a78fa49450386954499f6a0888f2366c46de885b7e7442a6cf7101bc0c3d16f8d88e518c4f9a38e9d79758a9fe7060d6e0777d76fd4ad780a6ba378e0bb9730d44ea50860cf7cd4abf7756f4399da76d30c84aef252ec102e1b74fdc9b7e2192168febe3260bb8cbc19bc143f21b01193516746962df1d97d9d52573e91be3589225260b1a6b20ef5c37540ffa6ad494d47e8df3e7672504a7e5ebc82dee922d75677a57d54a07aeb7020c476e6c27a96712af33bfba8c71f57045541ea608b1839fa0cb6b22b63dc821efcb3c1079c73789aa7804724316927b60d888a105c15a0876e9056751f7de4c928e6f9c71b7e1384577293693c242133259f5fa24e13ebf113463ef54f5ddf8b09509e41e67a91c22a0ef0df144f94976fc3dc6375dad01caa886fd7033d0d7010409da3145663640b980462cc3e9bfbfd16e859cd652286e6e14ba1bb86aa49f904cce1ea009c9e45c580d430814d2e55e8efba555d0320b605ab50c333f1b444fb9c38f6fb8a93fdaca058b5c1b649d889478332df77af36c8accb294f1c49aa01fd6a083bbcd8a43ce6193eed2aba936157526b8880cc13ce0d60fdf8e384b19aee69261697f4c2eed472d93f2f9495434fdd617d80e806922122e161c9921c6ebc6ed7fc5214ada202c07d7e180c541c32b45fa0689d96fd01ae7351a9ae3411721a4a5223e68b048b4787e2c3bcf101ddd1e0ac94f26c2def2fe112c0d163ee00d84e20ab106a052034cb4aa3297548e680cfc4673be31eba4d33e63ff6013cdb12a44a3a358d8ef2514bc349349d02217c8cbaeb24c5cbf8203477d7f39bcb384ecc005a50dc2123fa257c7f160e2db29a792c153041bbdb6d97de2c67af31848099d4a142340ac2f48e8cd213e158c2865394377be569b78b2bf4567e366a431333cf4518986686d8aaa907406ea3ad0530a1f37b009c9c95038620bd3d62a317f0e48ef8d39acfa1904071f6fe946cd7d69e0a9c5ed9d32f14253dd870ed50db6b395f0942b9299035432dff02e32e03fe453e6663739e69feb53e25336fdc274d23009c9997779239b4c937a078cf9a610ebf6e0e38fa5d8e2ba02984fd1db5ea21254d7d736a9058fa44fe2acdc060ffc8ef8fa052d673e2c0d298e48d8b4d98219d7b6f90148bf439265fd03122211858fc1ccb5d8e82db301d0feba90572ae22ab8abf43333e2ac3fe3055fe9d0ef12767f1cc73abe4b4c05024dfc344a4b23ba240ec80d1cb25b71ea504b89ab56533cfa7748e7669d5bb9d47c522f819acbf5cdc8d8ff039c67f48165735957e5cddba1973eaeeab292aa6fbfcdb385ade9bba268c6dbc88067c6e69d7453823c187b7749d1ff0ef9ed756c7545160c2341b0b76662a59a9a6e0534f6966c3037116e854efff1dc391dc603bb3486e614ef885691e9c7443029618fb213dfe2ab17f94320e07f0213abcb595011e063fd743e0f278f6cfe1a6cb773a320e1a094985c3127fc7d20ad40521a02f577cf7dadf633cd12a340fa09bc8a97f121d42a51a6ab9fb19e998bc4a5eef7f68793d6873096d5e33b67fb847d0ead872c70b6b7d1e1feb4147eed9ec26faa212ea96fd852e8018287531fecb3a45249fa254a165799d0e45d7b9cf01e662400367f401cec5f2841bf0d8fde4fbcea783c897d46b6b19a60aba3c92830b274f7f2e53366b02a262e73c32522f5694c2286427001154575935556bc726be561605328b418388acebb14c1bd10967bba31bf4816e0cc2af1b1dcba0fe1606f99c44eb83e8d8ea2cdf63cc5706a70f429113f1dbdfd2a7bcd809589ac2c6be06e4987629a387fba133b8a93c00560a5b5b2bd132b211862ca11edc083261665547a9ea7a304db22ff3fa3c3d529d1db09447da231eb07e3f953cc907b8a4c114a073af45c3616bebb3abba1a99fc2442f227390a8d90fd69ede1f14429f5c0ffff019285455091eadf22a7805284b631a741d79d5295f68b4b23a55701104a923640fef17a4b00c770bea5555677219420619015a02f978800c76a109595ccea6b9a0aa436e255e3bd8d9eae227837e7a0a6f3527657199a45abf161554cf3b424a201d797037ddf23a352bbfa8179472b6c4742edb6cc56b2b92ae48f1fc940505858dec603957fcd48758490502be8d4ac0469aed8e3e28764dfe1d1200c45474f5b7a9971cfd2f37723faaf0d0188feb9bd4565e5dc81c4e5ccbd42285e4b581fb748cfac10e9a8f12d68f12788d3caf1c26372fbcddf26fc5ed9afa250f581785183a64b1d256d82ecbb0e07b92f4b78552309542b65f39c6ac3e24252ac69e835413fae5d364f7ab1b83d023928f766c7ec4280250447e88d0996d7df584adda8304c798428d9b37a036e87f09253dd166843f270e2e08864ba826653f10b37d8025082d125a1f910717c8614cb3477ce90d62221692d4ce6dc2891dec988756e92a6fa0ea9ac7c7cc82be6914948e3be05b4cfed7d36cea2eaed16387d443dd15270d9a39ed5a95d73828d052d24315c576f41c7050f113d2b0f4893ced451f36f5847d78adc7c6ad1561bbbf4ae86ce2bceb1e8b19357095102146590b1972dd4aa8a688c007f31d5605f0ccfd861bb608f1896d9e64c23611e19f1a3e6b5f24c9a094f7d24fcee00ea8d90f432507af3abd181339f88ab9b64bfa5bd965c3bb6251851495e0877121ebe63edb4e20c2521e78f1c17cb6c50aa68668b4200c16fab8697fce5ff3731641ddbd768571cba3a6902d889b92019ea05ded58769b508f864de9a2ab00f9543e6509013cde84f5a44a4c3253b95a105c2c1cc81d0bdb94c0bf23d41891b0bf3def0f3c817d652b9a7634c0964cd54b410409beaf7f34a439dab1b6a38dc4a25b476a97a52dec79a5ac2fa2d0ff922618907b8534cbb3a9b927eff7f4839309cdd2125b52b24591acd634855389879800cb86387a0d3311cc14defd9197020bced826c33fe651a6d0029b8278b32ae4778eb2d934b6888d1f657307c99c9788429027f7040b71fa6766633d8bbf86b63b9b2dca4f93ea3d8d101422d8fa6f98b0cfd5d8b13c30601025de5df381b3b92fd2bc179c4f1587d8e36d2d9fcd53c5c19fca13a44d44b8d090e51b9f22ffb70bad5a0fb0e75e7a622f967333264437d5d54ad02e17d50495871175469c0f0e57c62fb36bb79c33b4922cdf5120178870c314ae7792bd1b6846ef6176d00ddf82e40466eebe8ce0d237e8d687d75b4aae6806031d2c9cef96bb7293fc4012a1ea32f4bf35e0b385b02ec2291bc0c201aad444451250e52c38f414276a3f1e4e3c563bbbbd9ca36fa982eb68df53f96647d9fd328a8ee41e46bb853a2940779400c34a4600bd501286a0164884ebed36f2d2b4c15a0cb8a7ccb2ad7572e0500dd241d09e38fde7a578f7ac75b0b79a33083816168c681707686b3601d359f917cfb9bcf01542cee8b80cc7f1e20aa67e7c2dcf3419e20e019f1a3fd6180989340e903d7b48cd368eb1620c5ec7bbba4b89c5e92a749683c7d40e1d357c51f91da16bce3f2857255f6d4a03df156f78c38b61377ddcd878ab5274891b9b3d5368e05d8c4bc938cf5e0d08949e96d64ed4734995b96e826f7cae171df7b96e6a6d40ecf689b27c03cab292d023541612cd8a23a082c09b4bb6af3a0ab183733f9f02f9e374c504f2305d784988268592c8ff5081140fa8714587ca6505999ea7be3692e3f8e00f5790ee7f42a383800783d589f8eed879cad191dac46e8a052b5d50307d41cdc086c0bf3b5dd057c6229f33bdceb2215460a6673aaf3bd117173f7d85be46b903f9f7e903315c82e3a009c041f58072cd18231c30a913ada7e667efafbb2b9b0674fa9bd748d23e25ced5b1a59180b28eb6d7504e34db6aa42864c9faf9152d22cb46a5380f597f8a2ceef084fc508fd756c2870dcd3c2b04f57241b957a22ee024053b56c9d23542428e10c5933bf720f7fc8bdb3dc1a51990aea8fde0506595ab68fa4becaeb9ee6af45ed9c35a6090cd3c0f3199a51c6548197380ec3c0234627ee5da2cf6c8fbb506ef6abf8ea8f5fbda8b25dc70dca53cedae3d3b020df25dcc104bdb2c4b3fab680a5a6ea7fe0084581ac4e16213be850b7407516b423efe75a19ff53c7219e02f04277824b36c85035682e0aabf1fdba7ee3c8c21a32e475b214fd98e1577d82cbfbe48b5a57aa0292a78d90155aee843e7ccc03f7188144de9ff92a8146763e68cbe17d17e9edcfe6630f614c2a9de8dd70920472c2d8bd7d4c231b39690072393144b55a21014933aca4a3a7e214a526ef433de70f9c3f893558c317849216566c8c0d9bed2c502cd2d2f5b09a8640b43543664099a337f0d81dcc4bb17441d05012c68ce82c76003e7d88c59cd7866820a45b9ab2fecfea30362d4bfdb96cc3b7f96ba9bb64617d45b7ab0a3a54babf670a8b9d1fa347ff81adf8cf3708224451246303b69325197c7b458968447173e89a65a901ccd2338dd4e378bde46c06c3872c1020c56c187d6d96f902adc30a2db9f22d90941bb382abd0e715cf3fcc83aa40ed785a27612a0a9169a6114ef342d886a02518fd05c36744f9a99d42104fa4ef7a454201a16251d8dcd14ff49ef4078779fbc26fa8a956f29f6934999a7ed6749f09f3431ffc311dc0e00687ad8be6819728aadbad3626efc675c885f9c4b793d0699bd88f6d55ff45b6b8d6c4208d9ad1142f6967bef8f0a8c0a440a2d377573eaf41cf6bd99d39fe600207c3a959e61ebfa943e754a3703e134ca3e2d88f6799cf8c3085b25bb448355d4473404213c1f5beee9305bd4d3e571bac522813af7a8e9446c5d9ff879a805d1e22750cede6233c42e3fd93c044bebd29eee625b1ef1c966d4adf325eba33de00d91d9fac9ea7eb23ef3113f6d3e33dd87a9543a4e67a02638383b67f3109c1d2e814de29fa6f386342386e01f19443b0a6bbf341f1a7c06462781346cb090495cc2859a61a7ba46cd70095cc2e45846b90ebb9237079a4ca3053172245e20a824ae1ea6146ad6a54502aa828851810da668129493e35ad870052019c236d81c97891ccf716a05390423d62800c91086f16a11a4002443394ce4b85dc477611d4adb05a6d3820004f3d2fa8b5a10f97955105b0a4032842d102800c91096aa1e54f00e0a403284a3c0c321f8c33b0f7185932151db87a116c45201163b346108c2f14226b00bf57dd449208d2a71f578624c0c40129aab360c2ac58fe88a2495e88a265000a36085a101b8a076f81131b982574cacc85891a58b8610c2f7d7dd8d1b4208312965b7b4810d8f67731d707c42cdb06e494343d3e30dd1bc1df0fdde7b106bec616f29e7a8e708bb64cb117659d3095e5068dfebd1bb461226da3c8a91aed43b832685adde108e5de510576f68b4435c45191d2432e016871824aac20418c21494af4fb877e00cb3640ade01f7b11808e18e4119b81f6d80726284318a4a052f91526ae3003060c211960861890699515144060cb0c0f2b242b96d710330b690820c337eb04617a40e0ce123a282490e2f68b2c9915442136ed88109720a966a60298fb5c00b2c5f532d180296ff09b024724114b03c4d0cb07c0f799c298c80e581b0004ba2179841450817188e61afc8055520e2420aaae0a46752564cfc88aac8821fd4e349c9c1046f9c81815471a5671e9687444d5081257e445530c1f934d10b4455b4a08f458a16f3b4b3cc018646f564a6f9d062ceab8aa7f91ba2812d03eb4fd2cbc22771051357d6537165fd7165fde1dcef270d45e2b69e1b4a5cad2c0b5a0b43cd078c92daef27716541c1d610861d7c84d10a8e39d6e5d0bba1d87a68e00c6518d85aa181adab30ed8c423bf18f0bc349c4022f70e30cad6450ac5b759525d6e476623d221620c1d6611ad146e658d04a7b8105e79319706e293fc409bc9aecd623f072b86edd7a059e0d14221a02b6ac28d089a72165868a467e5cc88f0c2b318d88255e2172c1b99db8f410d4a1a780385827ea6bdde416035b17eab763f51467fb09b4e2c5145087c6c1c3c1baa5851d6660ebf1e6d5948f81ad63570ab6b2f7e5e2e6a6025b8dddc056775f1db3c495755f5ce50e4a23aee295b8b29a495c594ede0e8b4993b8b2bedd5e923b0bb59174925612adc434620df69caa4fe24ca4d236f5b617b1c1c0d6ad7622013590b493d595591ae9b22e2b3166756824336a3b79126da095b66aa41604bbf2adaeb7ba8c388231ecc22bd04a5c59584687a3ebb01f761b4a4c1aaac42a7cf59368d350da490d10a125bcd5c3d9c50855086fe66120423d78330f5f970a5f51e1233e6516949211b0dcfe78b873a3c2671888df7d182a0c4d4a26aaf17ebaa93a9758a460c188c6d83a098481495c3dec047c23a70bfa895f1956c000d351f6ba93e7f02bc30a2618e257861551606a476fc73b569a41d51690e439278c4a133806247a3739f0b3a6402ab4a3efd19b61c96676f4d14562f68eecc4505330a96748a445fdc9be1b437d7f2a9ab87a7fa7d9a17bf4b0f45d56f852a94afa8ba417492f92328c151542a208c78045a7c3216f26bb09c34a377b375ba7194e213a426278dd1b060f16bc161695b3308b38f33e2d6cc205e8c381c4d57b443c56485cbdc3f7f2a352af646088e2ca1594092a90b6c97ea9ae0b880f4262cd85e79340c2d3a38a952b6e5c358f488aa2c7053cbf83756932bb02c3751569f4f98226d87a44f46242a8245b4f713581cc0b99c76c2aaee69c4f68663185de259419349324896f9575acb68dca8a1fcd20b08f3eba75d533f2a3439a9e917fbdc252c5337afc48c583bd8f5dccda54cf5cf3ba2c0a23248956f04416617959f3b126571959532718aaf17da41f6f4ef1908ec4936e7d2912500eccf0a927ceccafda86de131612b2e6490a9c7e9a8f232729deb3354d8446874d9e4fb8c7e613ceef511122ae260f31d40c85e6d0bb41e1794b08cf5b4de693882f0bd633f36d5bd650730a4f6c8a49f19c38ce804cb0e049e5098c82e73c7659425401cf0fd902ceaf0a9e9fbf35847121857b38b1458b6a0403de78e38dbeaaf79773baaa5bc37001131e24426a0655c38f4809150c8513d8c89c39e79cf3ae06d0849ae147a404096220898254f285149a8a284480c2b22cccb2820649b66006319cd88113b30c455041bdc28ad904138ad044133cc05907ee56b203dc444a6a804df8112911c2f9780afcac20fcacaa6403fcb010a8837c3c04a08df5f9fcaa80e31fdc423ccdccc3211260f2e83072d4b8823624a11e2179a2cd8befd10c4f54f9c2cb627d4a396f9d67de92f3d612d69c9772a2b0a8f9f8e54cf97965c7c601a5ef5ac822fa3c13aade97b86ebd2f10f2f33cf27309f9f925ba8897e7baef4bcc2b0fefc2047820101a80081e5b9787d2baaaf7ebaa786cd536f2aade0502e6a42e2576df33ef47e655c50bc4eb19a09c0ee3bdcbc50744b1c46a02176a8042e87ac2075c80890213c506ecb73615f3447dcc13ef4f06460984f0415844dbc41c0861eea109454a2a8913275c91860ccc09aa8452f6243a41152af386de180d9b0847264355961c21870952939cd1abecd9ddb34fd6755d274b8bd14df21c2ce71467a2c47deb17ea33cd7330c4469f6234241af8f20218535dc4c6d1835b69f992065624ad69cd69a5661a6cf3549c6ee0be59060b9e161534984736007eabd5dbd177e6593775236eec4abd2ca1669a49d493cab48269a494793be02d21ae8c8c9e743dbb47645050ce85d96a5352c809ea15218c1d231ab4b18b073be9d6eb395951a5d7253d768fac7aa67948bfee91a77aa62f311febf3d6c41093304af9ba2d2b81dfdb014f236374c2bbb03c8221fc91bd46bfee91d46808d2b17b8484c13c51e3e19c87394fdb99f71de1189c8842e5082890b1f0fb2a6641f8bd205ecfcc0cadc84f2104998f2a1d203ca242fd9471680634e22743515f54f879416074ecf31a45eba35b1f5d6b5dac67208c308a23b2206cdd7e01872451dbac30ac53a91ff6256a4b13e28d0eb51fb26d7ae24cfcfbeac925d7cd3ae6cd32d6a5b2e45581a13298a424087a4410abd74d829051543c47a476e592205e1042b4cc623df3da46c5939d66727b966d17d378e8b728593a69084020608e76573df3707ae63db3a49324255192b5c46a3224add83ed633afadf44c3c86d59a4a5d2e71228b52954866c1f17da506e1288570944b969c62ad41a44a67ce0b8425118e5912e18adf152b7268a04f26cf11961addeeb86a29e59452cafb1e4c0a0c35bfa123642fc13125c12032019109aeb0cc2004cb89276343f366e2274da5897d0921fcaaffb85aad62c72692f4f55e4d05164044db8caece9be97717aaf8f80423019f923aa2a8435cc050e58b3092040c223ac210ee0b0195c41a0cf715aac4bf1e1fd46123594118ea8005cdab333f6f5f46f5b86a2a389b58f72d2c6a4ec15c51a3d03c033de207c3d7df0e1ce094efbdfe7c4674c767af0bbbb0084f710553576f0774a3d14835111452e0fe293510c25272f1440e929841831f11144db05054940a23e445150b691b9cb69936ac61c31af5456758f35d99029110ac74510d923c09a36c3806ea0ad10ca4d42133705ee16e32832c38e7d006894993f8c48ba0a049069113f990f70c99028614dcf30c74a34468d5488648892b1d54221ff2fc86288a081545a5422f66a23882df0d36a8b04752e9b9b2888b22fb1331913fcd07912b898658a9844a5153a82280170b127cbab5e225550850851b54f3cba2f6e592b6d1c0fb43da6603ef4726ef86c78d783f2e8935079822d618e034ef4725b106877701de3bde3ade0478dff03ec4126b66de875762cdea3d80b700de0178cbbc01f0be6ffbfefb708c5863c33bc7fb500acc5bf5c6f17e793f89352eef9637ea7dd824d69cdea6d794debdb9f7611288040625d1361e28e27d206dd3010e1c0319c83e2fd2433cb71b1478ee2c423c3796093cf795209e3b0d093cb7159ee7ae1281e73e0302cf6d0610cf4d45c8734fd979eea2073cf7183f3c3751059e5b8a0fcf3d14e4b9c170c07347d1796e2f803c37941fcffda487e776e2e3b9b3e0e1b99b34e0b999e43cf712fcdc53e03cb710039e5bc9029e3b89029e1bc90ecf1da4c37374e3e6396649c073c4d2e3395eb1798e69d43c472b08788e5572f80f824b2592c915ade30d8c05ee297027914d6416d2897cd22da3e8a0a3d580fbf4027f9a0f0b1c27a29ca85916f5d83c04f7fc1c21821f2b027b84c5341f430e7b8825f21efb33311122ef5b3d43feb49e2144660f914f22456d03894c216289a888101912713f295e44c126dc9f415349b4a1d28c9e4870cb3370a781fb4486bc48c4be777b10b1f087a2665934053ee03d57e9ecbce73bef391127e27d6946ace9795f52893517789f52227f96c8870c1972229eb6d3f32197da4ecf890cb12a2bf46422fe13714fcf909b81f0900f21722831ccf2c10b43223d3d440ce979d47c10714a0411f6bd9ecf887b3e7bfe341f3dc7897128d6bca138462c8a532215eb53e2e081861a83f023c24a2c8b5ed14b5dc05ac0f6584c07d461059f8e212c8f53c01ee04258037c0296e641581c2e015b80f3d81d8f80d5710858021c087bc385d899efd8d57fb002b80f56e6412c00ee007baf63ed81d8ff87b5e13dd81cf76163ce83857903acea3916c7b17d398e4d9d01d6e50bb02d5780457d077bba0ed6f41b5b7a026cf71eb6dec672afb1db1160b5e760b31bb11e78086c112f6233f00fd80d3c5b0cdcc76ae020b01db8119603af80fdf17000fe00fbe3e1015400ead06a7838dcbc81fbef1ad1af8014dc1fa2ddc07d0a088105f7277005f7834803f7256005f779aae07e04cec07d089881fb40089982fb3b0f1803f77f20c27d1f86703f0818b8ef8028b8afe305ee03f9d18313dcf79105eef3d00026b89fb304f7f114b88fc38005280009eeefa0c34d16dc4f0016dcef7105f76dd2c0fd1a2bb88f802ab89f43df0815dc0f4111ee83a0ff81223e3250877805163c6c64f276f40f60a3016ca4b111071b0b60e30e1b75d848000bdd88abfe0d166689abfecccac22b71d51f808502b0300016ca5808806b2195b89a62838563e4b090c84229160e5908060e0ba3bc58e8058412577d1727fd53df642193b85a62e1145088db2c4c125748a0076c11d648073860717aa6bf013ba467fa1ab019b0af673060ab096abec5e101880f4278ac103d6ac0c113ab888878bd9042682405212a707e439fefc1e00753547bbc6991cc3e4dbf9b8bc0e0be6f0c6598c54545d1e04ac8c2c6bbc11a2690568c11bb7edd376f91152e63656173b6954d81ddbe0b9bf3bacfba15f7bb4f780af20896f327e2f8a69453c67f219352df7b6f0cf5bdf71e15dc126adb1045edcf29a9d0276574604a6650bc8c31c62069d5c0e24abe6ecbea2358bee79365d0d8307663ddf0411c610f5134d210d2365d93a04250779190b7a3d3b89e15d2f5057677bd8a7f2f25a56525c98e2c8661d8cdf357f79bf5392d879a80e194f835fc891852a1c4bc52cc07bb0f6177778c11c20b8439a194f2fdc84b297f1ac347268c6088f4c6eb12580450c3ea0823129498578af920bcf94891e98b1adf0da59b418d7f31461957502aa9f18d05bd1ddd59d0f7de4c42954c489de8a0eeee182ca1345084b14a7777cb0821c4b02b561182f26e72c044a9199b41504281d10d0c217c9c126d2ea1a07773b32ccb3e5b80c9a9051c3316239558337f4571e38282e5662c5e4dae2566d02d8c16e0c8022d6842368be2869325f26e340a4bca18638cf11acace788324b46346267c3cee2282d14acdca47309cd84f2c2283a57c66548c6509d3938a72029aa25ec9c6c09ce0792690e4c804b71bd83a4e2401c63e2d9cb3c808cf798db87086f8ba2090c14564b0bc3f114b5985d7fdde6b09a194525e4ad94ea0b1ae6b5ed7bc52a8133f222c5880050a52209f50b1d2a0a4bb70325fd558c1755dd7d58515298333aeebba4ea91c40e957199411c5ffc4091b167eb72cfaee7194d3ba3052ec695dd888da2cb10b858d9e3b36a689186ab2634d0b8ccf52ce4cca5399b5cdb72536a2b70537cdb2ecd9bc75842f9b5bd3ee7865de8e770c0b0bce28fbbd96dd2dd3dd1c0c2abcba271a5450f1041b98c4e4654d2a247659930a2aa80882ccbba1b1492d4752e6dd6018e66305459558ff4d1d64200e5d7320928936ab9e78759d0820b3b22eeb9af8a552bfccbbc98a301fc8404a8f39e79c734606556089cd255c9c21e4032ba0200963a461ce39afb07200ec08b2091836afeb92b28208455e010528b8b07285155450640536b358504861ecd8b32c8ba8891c4461d5543da5ae08d9228b102e820610863a02c2007050496208200963c8f880a8092a88d144952a95841f511364c0b9d6940ca6c07a227222497d144e9c70a814540a3c323c2b125a9f7e863fe01b18fec7c3f0f69138107ef7e823b419a80d36bc1b1b6cc891e3dde4c81113f36e62626060de0d0c8c4af56e542a1c38de0d0e1c2f2fefe6e525957a37a9948bcbbb7171696979372d2d28d4bb41a14ea777733a994cefc6642a95de4da9f476c4ae7b3b62ad1cb76d9a9665949248a31186bd1b0cbbae77735d96f56e2c6bce7733a7946fc74d778cef2646f86ede8e688120b490c016db7f79b98b7d788aa402cf48238c33563046932c35938d1f5abe532fafe3964bf0a0f622312c6198d4d1df61ee7258c271214ea71c27883aa534ca79394ff248406ce144ed96d52e6194b6b18725a8c261ef7b332d3f86d9702fea2d371fb7dc45eb01f5963ed522c75136ffcc1cd786f755910e31e9305675fd616cbea05cf2638c375b6f71c0c9675eb3523870dc9bb1d475c9613bffcc693310d6b45399c5690686250c0fad8871454a8653e01930ca29f0f20a9651469730d14aa70f1761791c4170f04843cd46f04f631f1c8f395ca2fd60fa7b390cc4e1637d52cb6e4bb45b1fc2d6551f02142c6f3a7d3a2e8f2d3b461c2381038b0008b7dc92f27455401e6eb9b4ee92bd351f5edef29e96471b9b4d7dc80ff2f1aa508f3f7d5a15ea2d9f2e2e2e2ad405f25adef2d3adb7d8d3e91c10885f3e9fba3cdaa8f3eebcdcba3e2f6fb93eaa5b3f33bf5c993d6a41341d554cbcb2ef4f631c8fa69b21c681c36626b09cd6d2006ef9219f3ef34f631c372f81e57b9e5a6e8eff696c6520bc04366952ba4dc4a8f24c2e6c02ab982fbd09de21958eb2790846bd351fa5d3f7523e00611e67e8215ed9435e97538b3545699b1c872d7fcfc6457572b9b9e2d35f6e0eb6be64b5e3746c92043f2230b2c0f81181a10453c971daa7ddae599d6dfb3c82bbf776e9956996be723fb1359d79a1b673bd1157f3beb8923ff81d93111b7104ffa06ea075a58aa243a834d389d4d242429daaa9d4d1939427543d691c77544bf78dee68e78680b90ac36a4da5e454d1cb03a3ba1bf7ce665ae7b9b9699fdb5595be9d5eb3aad2bb6b73ce394b976aa777d25f5c3d4ed44cf5dcf5a9efae0feab6084d9e15c5a1e639294f9ff2749252a3526aa729a5466f9e534aedb2e5dbea90b0562a99aa8a47b56d5d3784aab3a56f36d360b60ee5923a8c7d3d93429d6eae5dbd39b5996efe10aa39b59236e7a99654a7d39ca95a9a57cd52d54ca6ce6a360bc1735aeda5aacd6b93bbcac2709607e6aa3ee7b5b9693cb9080dcefe340b3129bb32155bdaa0a5adde7c4c927d33e91cc9871e92ba774b5b95f252ed6752f9513feb9b3a9adeda0fd94b6f79dfdc1723bd49a49ffa99e42e49dc49efd65a6bad358e747992563af726bd3f65777a92cd437ed82eaf9d5ad576ee3463b5aa36eeda49f49a768b54a2ef2e8f362ad5764a275d9fd2b9eb73d2acb499de9f894b579e744ed95f46c9cc646a928944e26e5d3b3dc974f312b82f7fa0a46b5c93fab25b8cdaa48fdee4d1cb3c046feff7b0577ba6bb87eeeeee5bb557bb9db3194d3d727faf9efeda54bab97637a7b4a734ed7df3b146afcfe8a411891e27ca3f4d9248976df3716b87d9a26a9c45af8f3ce9509ec469360fc14ddf567bb5dc711a6b366ff72265d2450084e5297ddb3c84c719aa769cc6a39fa9597a331398f497413c1a411cfc301f12366c89a52650eed466219876d22451524a9a0dc36aed95102c6fde9e1da7e7fc66297758abca6ea86beaee10343d33396a1fcede39ab43952da8a9f920cd465d7edefcf2f743cb4f4ffdedc88b9de3ac05bf6d2fcdb7d4cfeef353dba1e754d987503de643e438ccb9d5eadf36154f8e0b73b94fce6eaf36677fa777a76fdce5ad693afda17e3e3bb5aafaee74b5fab9de5a55af0a08d563cea3eab277370bc1f4d9cd42f0fc96fdda6ce66eba3cdaa8dcdd397dbb3ea777d7a7f4ed3831b34568f0f66933778bd0e0d34b41a04ee9be97fbd3b8e5f2dbcdef6697fbd318b583b299093c396ea3dfb296a89b97c05896693e489f36ce1fb8ed34bb59ce4d6a3acf2e6fd3934837d92c049bde58dbc47c7bdd68b0f4c1d51ed850254a15dd7ad5fd10d33bab65aa772db95495adb84b61f5e6d576a5ea43747708181ad25f767d48a7241317243b074fe9b9ee4abbd92c046f2ea4d251a77a1caf6d13f397ebb29d74bc1d75f30a6f3765cc45be74730a754f37df74eb6df918fb7aa6abdf6c2efdcaae0f1704ea70a7a7a36eea6c863a592060eeeb989b2c4f8e0c08737f3eb8bb5ddaecd5769d8d38b3b97431fa4c2f0220bc7d53653116e62a9be39bcd500896ef2c0fcc639e592062ce599e1c5775a8f5b0bd6ef661522e4253ada60222e630e789b9af612e8feabe9ee1b69b99c0f4ef3e8a49a4337105bf2659087eb7acc63a3794b18514304402de50c6166560d4502aa6ac406b8dab98b1360196a5ba1b8bab9ac55594b8d6c08c261e51e191e0080446c90684fae40f1999b80201a51cd4811fa71300dc3db0f683ca8471cbe1edd88050dfa9d47eec80dfbbcf0cfce07be87729b74e424c133ba034a68978f311fcde0eec8ac4126db02ce24cbc74030912254a309c624e81af8871053f31f02312e309a6314d508941356363e08612b1260da5063eca673d13e11838371437e2ea3ea958514c83bea73900e83e182f8482f426bd49ef53ee3afda2c25f7df5d5d745b20eafebd7755d570a53dab4618ccf2b7cfdba4ef36e4846c02b983e1b005fa7a4872f4aa22412121093ae0e1ffabe58a55a9f32d714421936a882e9a30da660fa68032c987e512d2cae6047a3853a1fe3839a57a75fb50d865d8b922c8ca4082f6a1fd6c9c4d588741d34efc600d8fa693cbd195d494d27d2896530bd8f424caf8eb882d895f2d154a94fc6c2c2143170b40370480d4d60e21a70fc7b107a80c36f480d4e0eb046144050344412030504a879e395a88f480854f02302c30b6c00fc8882a006ae740535939a2015bd9b4c6a822b7a3b9ae082de0ed201aca84d9c8ade8d3c4e63b509a928734fc0fd8b54841b36811bc3198a0e864141f8508a5058703148412c8aaba0f8a906ec22f936e3f268a346786391092acc3183c478130a7cfd208470076b4008619535c88010c2256081d026874873060d9630288407086388868d7ead060d1b314e01801803a08235e59cf20768e05c57270802186410b040adc68f280856c0197e444120838c3174bff7fa3df8221614fc0e5feceeea4511be00852e7473818d6e34d8884f50088150b3d7cfe6146762bdbea89d99c04155560c084fac0706283431c5098ab08431d24083921d98ac1da2a8008ba206969fd5b2e2185144e1085c14fd808c3344b12ccbb2747c8185185f68014b595560527d8104f34117c7e69b04c09249bc81922c2d4e0831243f359c5df144ed5321b8be30823005cbb78ebc4a475edc513e4bac5dbb34229f21c6b28831fe000b8635c08fc80745588915ea82c5145181679048a49f62b6188b62428d2f56c69918a56f6adac6ca79398ec35cf5540caa5930b4646b47e85c564a573d88ee302d56c5d3f298c7dc232d07caa1db765330160a65b6e670af56c6953d71a7b8dabebd72df0e9bb45c75943d823accb3188d4623e8248b2c6c123d03afb2467a0616d13338ae6afb12a89feef297abdaae1024a8b77c89969b9e7a916cdbe16e8dabedd22a6a865960484437e824aee0bb1e8652a056c4c646cdd00951acc96f68bb3dd08976f3cf0e09474d08d44f8f9a102d371da751191027568e9038b5ba8b5541e0e504bd2a39344998c21352e42005323023e7741e6ebc1cd3ad16fb7226cabe1c213c3db122315918050ef50c7c07733a1bcd882be805d4806a34196108f7abc1574e5f360ba34a51f3e9062b6aaafb475a19280bf97292c0d7b3fc130ccf83100c0ffff09505cbefbc29781a716199e122193724df102c0bb3ac33606718c11c19e19cf365b11ae6402848ecb2ba3ba8c2eb7a8710ce571bca96fd1a7b855f4a4a8a021a29e58487cf52f15c39d723d6e2ba4796c8891a134a616c39ad0bc37ae63d68682c3a22516ca463845d9835699348f222d11001e9992804a767a4a8d84b599a1615070a94f9868cb40dc411c230284310ca1b82507ae604b5e72114281b271b07e711d51ca8ad91823e1892af320a276029df830729a59472fae00b2fae80670b18a71e7c210c2f9c60f92b05b178011870c0ee0483b34c167ae0821e64c1032fb0fc5ccd396743014f15a081e79c73ce39e509064b1928686079298fd5d40e7680e5bf8335dcf0c60e3d7490419ff0a4084fe842a88b31728024075b20d2c1101429a05481e5e30d57c0428c8e2d886006175560f9141759b0fc574f5e704556b405132920d085a12db8700104aa5859bda096f023728288e8093390b0a68ec4501ad1030ee180090f57828282506059d64b17b294c10c28c0e0820a39d6cc822dcbb22ccb9239504e41d391c30da848418b1c3879c2490b9ca481a5ec01a710a262b32ccb8a4aa8421670d691c371de814a1633c8220d36a802d10da20454b33ea63f3c7f986e66029b8e3a67f331574745e07a4d1bdd3ca4c508d65c5a5c6e3682ebbb8fec10ac2581ebcda56fef9eb24560ede6d2b97754f7d7483c5cb292442265b67493d529cd8ed3ced9ed9d2565f599d58ce86873922646922489e9df88de911462043e54eca6d06cb4243be9c3e98427976d872f9f5dbab93b616edb4e1b9669759e6e1a4a66dc37246cc02200c2d96976b7d3773667f5dd7bdb3e6f49aec8a4e7acaa7b76aeb4a9ba4b9f3d3bfdc69dda5c044bca497a7daa76ee84b9ed1639e1aa711ab77159b6d12ccb64115c323d576ede2e95eafe7aab26ec74ca62c615c1db67692b956a89e3b0e9a69b8b9c30f7c7653617c95e3a65dc56649ee3b867dca418ce454eb9c88907218a3c2ff420064e383d2ff420064de81a90244a9aa494548a263db5944ef3a6596737b72957abaf7884e0face98c9b4c2a63fd36f3a356d5b47650593c8779ae9a78ec8e58566f5a8bc225c4d3f1d1513935df593e58101022666b5e280845e565093c074cb4974db6b5cd54fcbd5d77aa9ed6c178b2b2dcbb64fba6d5bb6edd06bc770a557be6e1add6aad5d777a557775e8d56e4e02cbeda7ad8d6e8db72b37d356ebf66ada6aed6c9074617ae9b4643356afe45ee34a4e933502e21967e4df0ef992bc71f5d375db4a37996e96783bb783dbb6ad94c44f27f1d3dcd64fcb8a3092444c02ff44c86da169b456ae3bd4eab95b94ab5cd7695d3dd16aadd7aa7555b57d8897ab3e04cc71bcbebbaaed7630dd71dcee52eb6ad76ddb5501f172956a3b0fddba8f68e26aab5dadb5abb5d65abb5abbfafa97217074b556f9f221542f77081cd75469e26aabb5d6396bede654cdab70baab55a5ddf4d3c9a4c51928d1549bcae2f88bad964755fff2cef2e0b8ea9b050247bdea4dc3cd6b93d35440a88ee33c2a9e97cb9d26ae68e2aa25ba6421e2e09e65b4dda7dda0665959a66999a66599a65d2f7ba41a319c3cdaa8f10aee6c44e9755dff61fdba4038cbb45f360b81b34ddbee05200e3af0885aec237b7d64616b9af61fd6b50b84498f361fd16c1602938070bc1780385c27d9ac035ff7452cf8c918ad35a83c96f9bd48c422ef5f52d775a5605e62725c8523b55dbbcba9662d1dfaabf44bbb3bd3a57475e6952e5aad2d2dc789f32d3ee478699b2eb73ee763aebf5c36fce0f2ebaae42f957ccb372c5825af4ecbeb297d77140a757af61fa76799949994a6d2c96432cd592acd92d5fe3459b240586a13755f5cfd99ed5a6e5e4209de5eaf2be3ea9f398e136db83cdaa8d65bdbc9f1797d72bc747d623e4fedbccc71658c4ecc7d30577565eaf22f37a7ae5269ced3c5bdf499ba48bfae1277bae6755dd7755d16cb14c6b4a0c62bb333c808677f99f579da4ed7752653479bb409f580bae9462cb8fbe9742cd8be54bab756964a9fdd71da945b8e1d6591803a91a4336d5e4209ee6e321d8542b9b8984c285b6fca32c9711c976d36036112691ea75be847a52d94509875a77737d90c844d59765541e4b3ff90cf2e103e92d92c04e62cea4f3b59208cba178038e8c05d951b0edcc02df811393103fccee8baeef4d35505e17efa0feea7fbe2ea74205cb259e2d2a510b86402c2d25e00e29065f55aed9c8d58b0fcf3a1655289254b28b9e610152511cb1ca21205869d23e2e8423dd79d76d94bf775366358be74b34a4dddb77a7dfad9ad0d844d361fc1ad9962c76c6adbbbdbd9a9a7e7b2eeea70d9667a7d4b2efb6c0955545a15bd3af5f4dd65907afa7a69c71da72d4e963eebf5d17e22e6aec6d1acb3ce6a7796d52ceb288ff8202581b99b762a77b3c4875a0fa52b9f93c0ddb6dd2caedab4558efba6ed74574aeb6d2f9975afb572efb82a7d3ad975df5eeb39ae727fb138bd75f6e1dad9abcc28a5b26ee7b477d5464c6126a5ace73aab536fb691e2a665b2b323ed122b1946f432d6d4d363b1e674fa2cd668361b692398a3e7e8b5d36cd49d68addab68d6ef72347a3632812464a995c5a22899e523b4f35db9dbd6d7669e95bdbd94e354dda6e38a21f51dab2337a0e427ab54f13ea74665b07e94e6d36f2839645eed26e6fcb9dc2fad14fb56676f4ccd66b04f7474672760b886c6afaf6ccfe48bcbd6d96f747e2d235995a769348dbb5538db469ad699784bd7bbb32d330dad96c0477f2128b35b166eb417b5b194ff5a7faedb55fdfb67b664926db0e00c2aaecd9f6ac745b66dcb9fb7e8e7d848d8ed3dde8da9fa6f9d08f3e1a5d7b965523385eb78a434af9233524b48fb48f364bb3d757eedb394aefeb8cdad131ed07bd196ed908779fecdbb9ecdbb3ed4aa9a3f5a0458947bf227e9a8ade47bb3cbd3cce50553adae5e585daced6c3a6653733417f24c4d8e862efce428cf46c23f8a79f4b4481813e99ec947697523e2b71657e9b99bc79ce6ed6396f763350a6995c348932d5cfd767a7b5d69f34d95dd69dedf4f5597775b64bebe5b37ace66bad5ec56c67d66aaedf4f39d6abb3af4f46625ae287105cbd779ebf529d529846b91299455edf3b50565d2ae297b3dada6acd62d7b3565f574ab524a29e59c96f4ae9b49624de9f353c94dc271875a0f759ebb79bb9b137cfa66bb57eee629846b92a924aeeaada425b8de5c640ad199cd3f6dce8d471b750a6dafb5449af33403cace755b49289b59a6c4952d9b42d9dd66129c8b4ca1115019c1194a5c912d8513924ca196c2092840c11a054d0fa6a7305866585219bc6158edc1f2e2341039e59453ce93899377ced5bc5a11192d933295b9b468afd7b46c72f5da4ef74d6e72939bdcba534db3db4d366bb4da5c6bede13e4f5fad8a7ba7d54dd3ae8abb3a2faee8cd3d5ab5b9d65b44861691a9b7888cccfce6d282ca50a88aaa15556bb53d989b14d60ecb014b7920dccbfb4fa530d4bc525e99b892d12a57ab56ffb45a379b7b6460f03c9d6e4e99ec8b2beef984276a9b13555f6e325daeb348406caa1585b23aa75bff3a9b7bf0ac57fbb4dd4d9d4cedbee51e5cdf599dfa8dcb4564389ded6a456480a688d2d3830c5c2092e941062e2401c3d350419f8c562f4fb97c04cb9b8f60ee53dbe9e4372b933eda21b5b49dae56ed276a8dba6aea18eaf2d6cc74979663b5fb7c67ad77dd33d4487ea4edcc773bda6d9698d3b4775393ddabcd9b0fa66bbf66c761196765e9f308777955f45245df5d45af4ea5ef46f5beb8d2e8113cb7ce749c384ba677d7c774edfa64ef7ea2e972994e765f6abe73694175e74eb98ee3b46d7b776eebb86f1a87d58ad5ac52780497ba9b2ebbbfa632eb6c96785e3b4e94b146dba92b2849d74f9cdacca6fbfc446c7a3efdbdeb26f737adcff6877f6caf9f36279131dcbdd840f19cee2ff6c599ee385dad8f11d7c35b3ef500b1e92201b1f639233c7d5ad34f56c764fabc56a3a90ba50ea8344c17d54d102a452300000020012315002020100a080422915038a2e982d27d14000f85a44e764a168aa32088619441c818430800c4001000011899196c000098097800a1caffe8413427c05c2821e69c8469a34033f1b444a0d3989c73c3a20df00b8a80a80df7e28338c5bfe8179e278aa44a9a9a91810f581b1fc07dd0e54aeae41ab0274dae6636fc136ac2ffd6bc486a55923c9ecbfb5679578d42d9ea7d1a821fc5702348db7609f5b4908e7975bbd54bbcc27dbda8b06d5062b6746eae5d2c377f44fe0493044b60e652072c876bc050c56c42668b310998750effa6674dd3a6d5460795672a73cb96b660b38e394b583b0ebdce04d4b12000a373d3e632b51666ff0574d00f096ab17337dd04e85fa4870b73485dcc64137bd803e921165405bbc159558e38ab2b51f3c4b371c4696c840f664c8b9ce5494dbc01631e658a8fbaa295f4f97180e3514e5843470592b9746fc553506a5f917a4c098a739493c1cc3d5200320adfe4962e64401b1473378b10e485ecb0c74253390689f18312739af9622c195424bfea1b7c7a0d444ad04bdf194061d8bae930fdcc226a780629a68029be881ada70042906e6e861e623dcea7ccc50d12713b34696c6bab86c9d4185fa6d8973aed8212a20e100ad535ef34fe322a774857c9930a61b5d35656f75f1aee8044c2ee9ce1a863b3bf8c58b92af16d31828da12837971206817de67e748d329f2d4e3568de282851fcd0fa93fdd44b2341f4f1fe14b248303f24bf3a8a8e61457d71dc688b7a59fceadb2de058506169faca3037cda03c2cb3be188554bf614a05599a9bf8764cfdd28c77d0c1f0e3266b4ff8a67fea29d020e3c5ab372022172109156dd07bfd9dfb7dbc3a4367b3fdd8bd7cd66ddaa55559fea12d9f20f0e689a3dfee5f7d733fbdfbd096c904cb3ba0fa4d052ab67ab3d45b604b755537d97037a557f314ada66499a31296979a675d1003703fe13255c7d4162423c8f5521e06d86bd00eefed25580dad772b30a30af7e7c80c980fd872667d12a5fc20464019ca8e14fff34d41efbbf065074f97d20761289a7f3ab4e86af7479ef0de5a7a099511130ab961484b14fd81fa0c40ee10b4b6bfc4ef5179ac477db20c705f2c10348ff2cb59511f934324004d09dbaf5e5d1c78fcfc176d046c1d20117a8594f397973a1bfe6bd837c52a9d43729fc202217f4c0b12da5c1bdea667fb77cddfd1bb9157ae03fc96f781c2f859e196aed3bd84201f1440a0a601c889f82704801b970a02009230cf199f5533c4cfa0b40175008fd8716d239663319297c576c25ae6a0999e5bf825727cbf2d748f9facd65bae0e4af213477eb1bb6d8a0a77b08ea7fa0a2f1dfa2314a82dc3f58dfe88f1795c83bbe9a69209425002997205316ab9ef52500f1038cad506a49cf22dce7b18431c80012758a28f728caa926cc083d56b5d8b151e081365836dd1a236f1424dcaacd51e07f7ba26b2286a3a7a3871f34e41e0cb059b0693baaa720e96a01c408a22b63d473140b7cf822d692f5a6542c4148ae20f35a2f400b36c8b18abc02894cea3b1d5d145b2e15b4622ce62bdb60c1b9b77e5991aaaa46793140624a944a52c6099b6f53582b33d1e955c830289cd07abe0507272140a39b4928905f6c81032e707d0406cdd997dcc8b09838b32f1284e2229f5c0e13c9dc0503ae11bee50ff2df9c9d80828a0848f745c36f47c2224b503b75b4711d43192d203e2418fef4f2dc9cae9820d3fe12b70093246e26c160271f4b7b6e22d4c0bc4845189bdef7a51246371c0a86b45c06d95aa00641a7b8aeb57992f919bec008c6941af10c88d13415aed42576f7f50e16613f41170b0b69993f98f6539ef9327f60157ea7ae69a88eb10488a60e247b7ab7697a0b05db71dc526f68a2b12a7ab8eefdd7257f5ff02f0b240b053fb19b1a317918bd39ed872c7b88013f3c52bc0479f52a36784c3839984eba5ba0b9e0a2e955bb1bbab0042aa262cf3eec7e435b63053414241bd84c09a3e308afafdc370f04ee44badf7397fd61e5ad2463d0eb3f32a562443582a6d7b64f3dcf79e235026eb84ed7c0a2f183196f3d50887023e2f59f7447e410a425b5035425746b64a48825b242cb76ef698522c66d68eb4a78b864bc1bb25b30aaeae05c575f83fae004a81b1834adb7e35753a07afdb83e60394fcb4fa522864ede5e83257f3ce9c0d47b536e1b6518d4560ca3c63569faa681a503e4d9e8665e8fa0bc63a936c94e9f301d2006f25a9cb1702eb342c49ca0da16f01ac8a491d22b3e2e15629515218e63b69ed68864a06b1785fc5b88470d777941c6c0f56245df3a1b1e908c0b57bf29722fb66e7f6f0914f9550edc169f9b306231320e85ed3184e7d24954da33dd9389b565df513aa5d73e38dd78935dbbe11872665ed7da93120306123f7e64cc47ea087152a63dac71292fc1dfce03383095f407aea40aef58f9968810c3fa0cb582f4845d3e0f5d44ea6b0f30d8fded39b793ba0dfbd94ddd4c8704f5a04d3a1bed0ff830625fffc3507f6c0d1354cc57b268e72ec8291092e272f2484af7f3fee3c49a0a0629b1cda03bfabc04bf15d13a922f421e8ddd10f7dd67fa6cf345b1ea34480b5c50cdaeba16d3ab4a39f83419d92628eb29600dca6e6125652948d9071266e95bc7e8de7263be0e0b07060b0ed8b7a8465300c6e83157e892a1ec2e09d7343f5c66d7b6cf43682bfcc78bf40154feb1314c2b1843a825b257e5a6f1bb0e20b888a00f7f7ecc680daedfc24b63830be58739dc47b5d226199365dd44a3a358e1bc4d701d2a149cf90b36f5ae6829e2fd4761bd156ee0cfe93d321e6d7ccb82f5c790eb02b81787c6473892b0d8edae501784b3d287cf221761c81d7a7270d84fd9a121200d265774989a0e4d49e36048020371785991d14ccf3901788cce9c7fecbacd77e966779eb9af31a257b6bdcd406049d0b41b0f49284a86a837175dd36f846814e2914a53bcc92182b26540a829a0d2a39035908aa92b9d16606da2daa58db8ead937579407d2c4466a4a728e0ff1b983a8a9170598a6131884a31e32a408adffa66de6ab9121d6a9d21380a51abe42974dc9f20f4f59085de6784291a94814183694fe5e535d63b0c4c264229e05c609a3afddd879a0b69838f444c82946acc9ae91204ad2c1c573d80763c933e6cbb1b41b2a93189c290a04c739538bda7c1f3255565405cbe4a8842749a87f84f12101141a163ab671b9ca4d9a79f754dc30e3acddcc4949bf2eed50a3b882b83589d7ad7967604194dca8d94b05546e8b04115d2d2a98fb70ee7cf06f8f42471f6a561c0539b9510f91a719c16c32e13638939a22db15d8ca0721ef5874a87d58fc0f7f018f427606ab66ff6494beb343bbae594437c329c90ae0b26c68cb24d19cfde8cdbb970e4388cbdc334a32a0653757f64f336186a8a5b457dad62b627af58c0bf282c939b870225ab4ea81ea4f320283b935d776632d822f98cc796e45170503ab6f0a009b1d204ffb0d25406d72b84a4800a42ec2e5dd85d33b49d24c0736cacd350826b68d9222830a0a8d808196657d48a193b1e992ed9c2c7f88d32a6fa7854854f727fa263c0b26fbb2d42c1183f6926ed469e4dd4bc36d452e4243a8ba99b3df2cbbfa4f5d4eb3b34633df35d9c0799d67ddb9b33344a3ff7da8dfbc1a1cc00dfb2a1a042a44328aaadc98474c5787ef8b4567ddc71c80cd9f0f26be827047ce29db705bf2260ba0f164fd8c234dafd3f6052811df9c4e7351216d3a57a03b0440c3c3fad78d88e87691e4bd21fd4d475ef9669f087a38bc1902dd866e5591b400726e323f1ec7cc152a17f1d51d99ea23f56205ecf33eda958ffcd08691add25e247dadd7d12b130201dfe244159841e9615240e2000db977277f4a1171c3d228170d1f37f08833904a5b89e76e0faa8e33989860de8b3c38cf4ff7e5a6a99105009e8e10bd7d9b8af6fe7722f27fa13c0254948d368f7403abdd85ca89d2d539ab50e0fb1c6b77ac79f97e7bf1424790072ec3d3f068d5e4aca9ae84245b58431ea56fdbf0e8d922b60e79c9793d2f7ed0bd98401e4b1add0ebe7caa3489ba2e3d6d8c4afd65505a3bb730ee9e2ec4fcf4b1e5917b9dd173fb7b427bc4cad6c897c2980ae29637e25c7cd146a19bf8a023a5a49ddf6fd0d52a75411ee8bf0fa6066639acc641db5d2caac14ce8fc5b828d6ad64b8c1d776c6abaa6fa5376e914cd5cea8aa7dbd8aa001bd4683677cb84a6ea283f792c4d92728e94172d90ea72ce56199c5de59f07ba8c58d9cda8886a128c3f3461642dcf1f8ed911fb78f7f044a7bd8283cebae693ba54cda6e23f50cef8e79951e06f329133368d9378ac664e1ad37448a124adfe310757193d6842e4744405558665170adb3425058727ec029aa5eeb532c9ce4749ac5ba1dcda4c28ba026b0455a3cba119fb6179933873fcdbb88729d8f1f8d152f91709aca28c48510df1ff78c2c7b4d98b1cffd1312a488134b835683f2c856744feb2a423895a6e4bb6b81d43aba8c73f02ac52f1b0a48f8f459b2d7b42b0f2361e745911acb5ea9f724cf36591be842eaf29b2a424e696a403b8969864044f31ae3ac3ec6e35dd45e5c0282c086f9c5233a1199dcab6ea4421a668c08c33ab93a32c95820ee5314ad38506014baea5d0a8a8b37ae70f4424c74a7e7b291d3609bd7cc666d3c89664f13431fe4de45babe4e17f5485c632c7fc6d73f610f8ba24214ab47a0903a741edb61833c9dd352688c8c6d156a49b9b651053771350671b2f9299018df13c1f364fad40f814d9bbd0e48f532a370869a67726080f43f72dce4a8861ae44260586a5a9abb02315661d8251cef9dcaee36076e6099a225a26197ee67d8533fc0694fccc78381b33fd691589eab960237ff02e3ac4069e5cdd023c3c78a814b44878cf4a1cc7f49831d84d22a186ddfb91bdab2ed83201a74b456d7fa97e95129cc97162e884ce808e1369393c7b3fedc0682059878d6101ec2b52480f311e0c44322031cc0ef2ccfdf6c623dfcbfa078ccf70f7066b5f9e05b5e926d903202ec2d7bbc1e079c5d963f8b1bdd6d51f300dac6b856819059c0a20fb4501dc0e570551dbbe0fe91626c4bc64966e618e25518ffff6e86d2d3eb323529a3e01091029385f7c0a43268bd1772b092dbc358b5db98cd2e622f2bb458670713b81f021b16583ea91d1f95054bb3d5625dba1f3df6f5b58003e28b0d22e3fa400a0c014264bf9476449de57fbce001c95d8599576f6e51523292989eda2bec798c888f8e5f288ad3e0ce3351a16ba43361b576c93ec672d653953fbd57d79706b460fa426d5c34a14219909c10c0e262d741ad0d8f735b5070cf0f5307f8ced1a9e7910c84ca49ae08cc14c1368ff0d0a3ff0ac1d7373f26637e10f599a9bdb1fea8753e63eb87421ec3189f406980185ca6d4ff5e2b3009c04d0d4e8f63775ac106a6f03db2b5b170161e07cb617afe18e6706810a76653d56bf9c84401f171181a31a80b6009c270854718aa9c7272ecd62abb4531528321ff5a36d5952fff38db567817d8807cb041c0f3ce7360a3af2a4edd5c3810b7afccaf670c5518ca3030769392139bb93a913d37dab605956fb0df2474f899f135de11fc7fc776d7dc6e2624a34e070db85e019e78d6fd54aadc58fc138ec2ce8da7933c9d8de402234d3da4869524ed352c03bd6f74fd516a23830c5c1a8a94e48f01c261f59a974ff49a513c873e353f03534fbbccd720ae44225ed6531f038b32ae64c5df0d1c1f3015d849bba7a0dbc6a41bab14dc1c54574dc151678e200a99a1c64e1a10202b5272adca59ec2f89fa8ab435986e03fb5dea8cfefdd350910ab685ddec3a54d09c4be7d28e2454bb91eff7091df0d21d05d7870f7f1beb81cde671d8572e90304dd91104a30ad286ec68a5b1bb6d6a01b6b75b784273a25840f0f21193314c952748a4c8d8fcf462b111b0e2602b406e62e7b999b779bade97f320f41748ce2531bc598aa268ef6464e571a4990b059d0a8c4d30b9dd4fd1ba391b3b060e845abb735a221803d27ccea53f115cd322842ad72216689a517c14bd4cac870369f110d0454ffc84fccf49196b1fa39526665640b714a9b04882d0943f8e9fdc175766ed66e0f8de47500991826e606e513879750e130e81f3e991670e700e1d157568c09a6980d5431a97ec485cb81731e3dd77ac4954b49b84b9b763e9cac8b5d2454abc20050cd129dd90968f322962e5e167d4edb82c8829a8cbd503cde045b332c3bcfa9c20f613b9c9541e82b179a745e85f3de2c1405daac310f87833550f6837fba60d85f9175fa50b8109cfafd0a9c399ec8145db732204e6b0362aaf704288bb8f9beefbb509a3e7ddbb75a180cf3572fafb849a73633393a9d06306a468799b77696733c626573b508c43eb0f2043cb65249c7bef3001a818f9a5c72999a8f988443f4a372a2d648365d7917a318b1b10fcccf9b858d180379aa90f8a848cf6b8c1eb22d9848a9e28f4a9ed71963e6aaf60eb08164981d7eb806ac7498fa0adc40b49ddc7f700a8432828859b5f1a2a150086dcfb84a9bc5c57533d48df22ca2cbc0ae1021b9f813c178a1f92e99357f04a07d069c578e85a97d2fcd3a4cca316323c13d9a9d8ad3b5bbeb96905119392b37062c3a2613804e89b982d8c94b0c25329f556490741967567157592a55084c9419ea3903d1ea5c6a38bb8ac8fa850fe665fc8683cabf6af4e9b5f2d20e9cc4d99f2184b5c78a2fc82009122307619a789510ef8ce3524cf2e8292344e6d78be15bcabe1667ee49b844b4f1419f6e50c705e1b8afd0d983540cddc78308a4c72ec8ed0b90b405699d1fb876a4fbf29ca6dd94b108d202368f74c88fff79f516295e0578e9a107383436268f14cb605bfc60b429b11f414ff6cd4e71b14cecee581b17551d8371e1b3e06ca7515055303f75f382a5dd739d6d7cb60e86eeb8695c94020dad2940edecf25ef488dc43b0b851f5c38e45a6e16cc99333081e814191238718d3b7513c35592850693668b0c0109b50b5e0dfd86aef61a0c1e17fa7c48a4b700a518662dd2d1e1dede046675454cd7bf5809f4185620c498a2ee73f5fb5f79a88086c207986b408a954b5f5860f7558b563b182dc31c82220c39b97dcf1213b59d71e4acd5d474b5f9c55e5660798e82dd70f2999cc6f1c6e301657d5309e77de580f62803562211e09251438f7981c223485690f9af09570641f573f41dd7a223e714da1b771cb87f46f1dae049a8868c4c6cd675f3c34ec9bb2eff48e6e9e776d093c365dd0b7b62c817c5ecfcdff881c5e679c32435fa6a106822084b7740e4b9698920323b309e934bca9693b1546f62682bd43a785d0a71245ad43cbfd79a6c8ee08dc8026b3c606163579c93c259913f7727b21b2a89247e3d61c414e0fee5374f334c4859adf28d90f92e86fca1d8bc1a160e59109a32a8abd5dbf46c0d2d40f7062304655b67254a5b65ce56315dee2940cc3a871824f4c8e4d4601a390ebbf33c5d2505e3d45f60e44e2571ef6f0273953d5a7e932925a091344e71763810a70dd0043c30c999c8c43f56e426548b1f2b4527e664a4983053c2a0fe387dd33153a95310150fc5234674d6a63ff39584048c9e879c5b277a592fddd413ba844bc314e8a872a9a2153d567b0b719c1e8922a9cfa3610a64e8d53b50772585c5aa753e17c3c02c7d24b25ef828de32e41c5cfa958ade3ebd1d230803ac0d7a8edfdfc67b7ecccc6a44caa12155fa7ae86679fc5f851d38c7cb1c2bf64188c7b68ee22084d71c6f2df35d649aa5023c5db819d7e3bb2026b0e439942c44e2a2c2597029ff7b962de765e6b0df68c799cbade72932c69a322f9fe5a33dbd749d8feb36568ef0665507153afb56b8646c58fef19559b651a23ce1b8eef8a9b15311a479d91ffcf5e5389f97c077a7ee89e288d25a58242f37c686fbd26ff0e2305acd5976979847e69b76070f958d8ba3e11fc622d426e7ac3374d362891280c8cd4995a8f3a14a770273e67a903e2fdb9ce762928d1233577419a81a003397d6ef743d626f440ac031aad0beee75e24f60f8e6958bfa8b0759a80b5f07feb14d0b00191629f8be4fa1ba424ff7cd445094f1df8c03e5b884eee5cb9c9c0ac51491764b0cf0d4a13a4e567b7275a68d9ec2ab8066ba908af1cc4aa2767df364ffc8ad55d1c97b7d38947daacc59ee9ef3405716a0cc08b8e3f8236ef84dd94c9abcf3f8a61d269fe8a5b1deabae144433633c86e532eb1cf303269a9cbf10ab3c2b34c29d3bf1e1e7b51ba85f77bbe5206682f31e627c60e6623836b34e9834c0a87067dab1c84497087d9ba7103a7a515513540cf02f3c6b33d82a61d2d3444d9e76d68aa73a84347197a47f52e3611f0ab2292749f314706fbedd640aa8e9f3de4eef80bfa208c291ef24bc44643f65cc7b3beccd18b9876a9029ea26e8b3780a58c70c8cf047eba198f900494096ad234a395c5a2af0acf9ee2ff94cbcf671d2bc00fd498550e582c9e8ea075769b8f49ae848c2b9649b006282efea2f62b93cdd4427c777137572641ff1559d493689c83fa799f0ad2a498a62b9a5e17dd8591afca494ed7ec0976886323d3a53a32f58198064e17c821f0534b88732554bbb2aa244c3fa19fab02e0e388a67e0e74ffbd02dbd9c837539b4f3d607e197f8d0b59fed03240c19625cf0b8d5dfc63f2f316886dbde0e34edc22f9cc51b4d8254098240ff525a31a37518883e96fce53a7a2e396719f3c177ff47564e4682079919049ac231010c2ba11f22e6b8cb05725e4a544d8f5b5d38aac5ef1cacfac7a5f6efc45ef773bad80fe5ba619cca85a46d025e76995dfaa289cf583d23f9e6388d6728deeb6fa354e564287c37e8c67940ae55c2effeac80e6bace7982518e3410cd0757d78f2dcaa7625e6290879d0f74697804d5d48ec8c6de548afdf61c5397a4a9becb91bd93537ed53dd9fc1da359535c12b7b7976a1214eb11103bb7e41b32075cca6f954835f45ef612bc3510a4e18950aeb67343fd4aff41a6b823d933a9c0005de1a0c7fc4c14d66444eb41e788b76aaf5f65fcd9b1376f20bf012aac9ae0ee854f49a8b8670ae2b9ff7f9030c81f2e58957bca0b2f070735ba2cb5d7ae02d982d961bed4f9cfe85248f35583d228e525b8a8c14412508a3e26ef56b50a333d1751ece082c9a9cfb3b730a198479ae441338658abb15eb547b1777f3bfa6de8534237f6068063ef3d02f7095d56038a586281d5a45ac7f48455600119e30ccc90991d6198d34b500003b708e0961bad21cb1db976ff61781e1498e3697a7ee87e4d85c0e881fb666dec49612126d3bb993e47c03f34db4e6e619f1046909fb9e5ff3c0622fb5a75b1bef31d9c078ecfe044648d19f3fc9c00eec5694c543a383847c2a6294c424c65dcf75ab29b14efac24586f7104ba957b3f703d176880cd723b5ca97df162034d1e5de0bbcc7999eb068b04b046e4bc04d1073b0bb5ce882db48fc2f9da84609a097b6aa6f089c18491f89e20a2936840600f6c9ce6b08ec13dd4deb968cbfa840c34206f6d40eaa7a80d2cabe5c402608c82087160d0a6f3668adde051acc730c81b96a706fac28d8f5bcd3f42dd70c2708f09cf294c8d9288f818464c698b12edbe4b1440c961997f25b5635dd668ba20638bf87375c819e93176de582aa63c6454a417cbfc92004dddcfbb36f1da8440ae717e23f84c38d0104dd135755fe3c629fd34c5382ee27299bb426e816c2d7c7d913390c68aca586c5a6272614df4a9724e5da48d924946ade0fb64232fae288cf74b8def90d0156f295cc4bfb2d23b1701424039b29639d3bea01b77055160a4eab48cdb89a0171388a28197a7489717dacfc2db372989bc5b69624c7909e9a8e5cd0c6ab2bbb23009770c0c860b8dd3a048a7f7e85bf5a383ed441041680f7bd92ebc6ba9defdb02ff5fc687cfbe146406871b740f4df3a998c1b5e6cc9fff53f959da68d16b73cb9e796f766080754b6e1da92ae47428b70c616a104e4a808ce3e4c32f345678996a6ad450108e17de4867bc770a9ff31250dd95c52d1026e4aba7b8ecd69c4271a474aae7b96140040dfc055167a347618b8e20b7a8cb8f25c62092a64a36140af0ffe50902121c0dd455127c768154cf6d931075060f4a15c20308b6d91858616cfb7be83f49bead987752abb0d73a74ab1805820974543950faca5c4efb9df068c00d50d75184c403fa1d5ffc189080dc969a2d63d0706cd5f22e2d9475a6086f984e71b7a6d91a28698202252eb835c2363b2161ffe4ae37f6ab76a07f39690c1c0e53dc9cb5fdd9812149bd7fc3cf543813195f4b51f4d3ebcdd6e41c066bcc37439ceb5c85b207f72545fdf1813901ef2194bab81915950acc47374f89a8d7548fc810d8c372c4279c3e0195b7362bd8393e7988bd0f8c7729d03bff49c66a84c05855e033f1a1797f5bedebbde0277bb7d37cd82ff095a6c31318f4d8d3dbcdf02214f6af8fcf82ae0f782f7bf5fadbba9b90341effb13df196966dd51ec269c31a922116ec2e18c0da0f4d232ebfeca801413edb806a43921b8197ae8ed8612d50873501a5010b75dda601e66daad8c71f6b7c67eba9207cf36b4303b299c9dea946b8a409e2fa237da1a3248bb36f00cced9b8710e5b6e490ca3d2cfed6af73328f733b5bdfc03df598393fe75f24b36b356ba27e7260a6a64dc7c62bfbe0e9d310ea25698960e1675ec72e60e4b174b730d8b0aeda5f1a55ec3846e27cb431768d5c2b520af97b6a1eb2de93f999996787d8f6c5ddff703c8cd9390b1ca0a157f66e9c889962068559d229657b275a13448ad3a7d25326b71567f3112cfe2a5f5a88832f896d0f32f9a39e5e983714e2d1d4170774fac80fbfc80909d42d5e7ba102411b2db470ff6b66bf40a560ff5b6b6cc30f8cf9045f646a178441153bb3c6abab25060c1dfeaa78ba38c25a2053f52443f021b9dc6c21a9b9ae310aefffa77da51d90ba17b888a7733cafb7951eb0a2e3925be1811836095bcb86d0279416f6a9086a0711171508bafc03ab2609dca02b343d59a57b4d8cdae2fe42ef953659652844065b438ebbc7d03b96f9e926b416184c1bf2dd7bf3230056ee6d3a1b34e96274db6a8c945086b2b6a3a14ded4a7d02ecc6d32fd09e7d1e58440c4f1c3cc39f298146e4995666b209f59b083c99cd73ce7e86f075f284db944acef61d1b1029a862544031c27960ab219f064b0aae2769b05a6e52cc5b42cd55239262a69d1cdb6315432743e6fcaa4172c0ecb56e9edd77500d316763449b35ab96a32022e1694e4c7d269a72b4643032eed01cf54893eaba560991b8753374209c0438144c3803e6695e5be0a6d3e2669c1deacbfea385db2b9ba3c5f7b5e601d73633da8b06e086cea2b37803f41280fafe8639933063984e6c5137a5b26c7f252aae096721e4742dd18d650c872aa203de88ad82a25eaf002168e3a45666d5494eda5bf1750a6d48de9665ffabd444f4d3e0e188d3cec3ff515709b7cb3b208a9152a9c06cf25669829bf7b7e9972ffee7ec020e064f5c72c2bd5a4b983e4d0055d6c4baa7820db828a4f91c664fa15ab4621335bc41b309aab86ff143d8a81fbb10295c3301e1440bf22638e517264b44f8a96658555c97927aa2405589ef8f207cb7fa30a137a1724c6e8c17521e6b7e826ca3958860240a8c75438d62b1d8a454e2b308118422a420425b12fb3e32b8d12b1169521523f3d046bafb2621e9b69e4b77d01d0472304245988c628c8009e3fee3232502a69cba294d3fb12ceca1f24f45f7e2ae19b5d721b7fc2b0ac74449ab1d97ca4a23f18e11bfa9485270c008cab3c3a2b731d0f0971f9796e9e10fdc76b8b83c71ec48922a577df48473089cb02484c0d19f2426c0083832844bd8223a49425765c8bb36f3280251bb08767df724de3f929124b2b5a3ea637863f41843e8d1f18b8d4b25216745ec636c4033dbfa20edec537866a926a0addcbfd4deb3770e6ba28147e7f935b68535a0dadd1778ea64c4c32863d29e9a17ecf056e0bbd2d426c84b1e515e76dadc1229a207ebe7ccc890f00ad019be2f6247c1291901f11c0fe8790fa2e4dcded323c09adf21f2779824b22a8238c43b80c7840ce787cc3c52972ee19da7423f5bdaf8d2777bdb9408ce426dec4a19091b34a9b1e1e1dc083c30a9bc420b588d6179635152094b88c8ababa355d845487a41ce6b7b321372b7655c6ed94ad565d5d3c142bbf165ca4435b2dfc276e23765f3f3905dffb25dd2312503dda1c5f7ee2079ad3282bb91d289b6902a5df97b166975654a43f528d5750f456fd7ef3506d003a58c0cef0b3c4d3cf5fd0ae22388da3795ceb6b8290107ced4cb62ee80235cbde6790d508be4ad864dd5e5fe468ba86031e9aaf366c822bcde0266c2591acebbb354f99b9b6ff05cb57e3ce60e7a9066a1771b90dfedee07da43cd6c71b5e762c135c8d59982ae0706648b28aaa8607ccb9215b05c742f8d3d2064961b9219d864c357663565f5d92f727d2f384558d84d095ab23707b1ae7818a785d6d23232077cb1ca75236a39b22f56d28528d7cee578a6b203ade6d5b67011824d971a9bc82bc23e0acd45b1b5c6dab0f113b9052ad90768959d4f2bac0e56ba1de7c75d2423f70777bec802fcbd9c4837370f6ca8027383725e7734fd03eb28000c264fcd07265d26c822282a7a1e940d32f3e1a409e9475d1c3aff504ff1411236fb15f09da0080ad2d9faa5500e89cb2ab78543286ef7c6669114150ab860bac2ee9323d5a17869cbf015a9ca115f25d2ee5609fde25de377d1ac15204a97d88710a0c28420ec3fab5c606467243f1676b35606dea499e4bc49e77b10dafe09b98ddae4669c1db4b263a39c2e03610f27a54bb652902494bf0eb4cb47908b654cbad28f23d10683b6b1ad668f19bee2a5b209fd877a204e16755c5445dcd25207a3c95eec8d9da5433f41407511d59bc407c40fb075a8c4a3d2c33aa2dd97618357da88627a4d39c1c590ad544a990b7d42e847c9eb314497339fb44b3432bdc45359f5bdc2d312f228b5b41cc578c726c09b48bf77034617da9acb212fd6cb741e5ad1a17d65a4ac6248b7fdb1316c1503819ad616c62a12379277305c10b2b9a211714a69a794f69f93a809679be5992dfd5aa3fcff80e15c25e5cc0058438df036fd247a760a6f27a42b00908411f0c1967b6a0cfc041d9ad4bc64a195ed134a9945bbc96d33b15210297ff5a803f2afd38f1fad40cbb2aef79279cfc5d697ba8c34b6bace150420ea409cd7a5d0e66beb5c415734954027ccc9fba373ad366f5b93a9ad2ac4565039ca539aa2f8589e7b38803fa7a75447e0d56dd68cd4d8a3abfe9c189c1d4a02d493f6eb229d1064be27164b192b5ea3b9874534475272bae6501e9c11a3267888cb1e2a60448d09502d54cb92e73de7e5a41f23122b5c6a7f8da83c2f86d16f21a14b053833f0730a700e4d62b0312f560424a0aa9df165859517ee45f9a25bf32262c8562fda19992c29c012275c43a1965a622e357c40ea255cc33ab0c1ca60e7244fc0065ca263dd6f45c95fc9f5620b859106c0bb085b825b265f16a0c2383828aa3f5d97321a46f9a31c2314dcc8aa112d5c15e97a47e9708f48c2bc7047240c78d6f01946d58134467917234d0430ea0202100c008d5c68a7205079b88fbe19a3af19f76faa0ead576b2c00d735948602715da3aa09feb104d686a6f7a07e42bc2f77b748fc48a17db5ecb0a3823db0744b87c47732b15e7e6408ae9633dd1d30a747868d766d498ea41d5a8d6f32f5c2e70415404220ea24805289d66565ce0f773bd17936fe792302041bd171f152a36e872688f784a98bb7322bcc28b9cfb69b01cd2317119fef494faa1197c44fcb2aee1f3d18a6dea8bd0e45013e2d6a645bd4f2236836bc0a7a6f6ac40a9f089ce028dba7eba45cda3b01cdede011b54e8869c2ecc14122bc7e6c6489258bc375fbe9d2e5548ca25b35bb14b79bc229205915fb5b21ad41718513738a223d05a07c74dbd8125b2262b05e54511c81ae23341b1438ec546c8fdd2d3a9ebfae039aad67dc25e3eb0df93283658efb1446f3696f957c5e3d47e5cceec50aff753863bdd43b503457b464453fa3faec9eeea8a60c72a06431d60e63eb007efb521afc59271aa3f69642b24a72ab88dca9d627a2bed39231dfd3746125fcaeb797f000e5ee109457d9ecb33707744e0e51f4bb48588cd1dc6a57d12c42339f071d03758b386e10efb2720459bdb50f9ec42fac23a01e819e0d86bd72a7d9af549fda3793dfb5224b3853c46f6be9e5633c53a91bacab2714ff936a33ccc6ce6673cd22a6aca12f1a04dd85b87ec69ee527a9e8a053497782a7051b542c58a938ef9125fac64df95a7d2ba99d9dbab4f957a0c6f5cdf9af00ebcf8cb7e50283e96a3fd20f2d79368ea0c8bc4ed254e2b0f0a80036fd8347019ba6926d64449f9c622ace76c8ba2af52d2377cd1f81eda788f3bfe6593ac93fa211af92ea1593f5a1a0488fa7e9f3c4c23b8558fc0cf966c7811231807e479f2eccda48a62e4f1e09a6a710f32ea4b119d6c8bee8c87b17014d01848e5e2eeeedabdedde1f6a79f31879299e426b3cd10f689545fdaf18dbd16386aaf66a2f539340c7ab1317234036c274da1c1af83811cd559e7467781c82f6f0aa3bd4ac312788358b626ccc06ed0377986c461ac421a3aa24258572401829e97608c9e852b66a8761a77bf84a5e461ae77d941e7964e68144a0abfe3663bc4f2e26679787f0e2d939db6c6085105612899dd5fc613ebee91654ad1c855e2c86cffdcf1ca641297a932ec242c45668cc597c8bede77294927f423e2d9520b30e7142e2f5032264a26a9bae5657f692269c51281f2c469b794383d9ce2d8e47abf75f2706b495e12cbe8834b6150a2cd325b193b4c7f48aae56bba4a6b262473c0bd50511ae8b752a17414b1abe0ed5a298315fe68c0655987edeaf493944f42204542d447483c5aa06bb400b013673a3c75a012bd8935b217032838e3f49dea13809b9d8ad97cc78fae2c1f0b5da9aa8747aca22e5df9528a59baa82b17897e3016d8547685b27d048a48dfa9cd47e169eec8b4c11098e9282dab33262cdc1f776d00aeb8b8b08b2258b7554629e7b45887f242fee209ed41dc9f056a899b30ff8e39f9ea745aff34ce6f0d98a5ebdaf47a56b8e0aaa520e0b82f0155e99ae80ae9bbb7edcceb03db84846e63799794828466d87dec7e9a3fc325df9565710d73f4c083567c8b78f121864bdadaea4a9f8492c5a85e09b449df7a84d86e562ae841b130cab48e04c78f35583ae4fb0c679a065f1208aa4788af023ec8a707a94d072d5c368c0130e02c48d62830bcc5683b0f9249c4c921374a9110b2e13db3796620bffea7da0a919438c16f211b85cea9390257da996cdcd767eed05b292d7038d2a0734ef4852c9990ecf07dbdac18f4954c8552b2c4db37616bab3a19cc5874cbf7ddb95f8d968b1344f705d9c5993745a32021981ff79d90ce58f3d8b7db386e0cc96e607120a321bcc5c5199c2e4ed96c84cb7fa157e1dd358f013ce55ffb7daa31e27ab5aec829bf4a2e2621fe59100d346fae3905e5900647918f99bb992b2a24bd229fd4c5e5eeea88b9d6cb44ba7909b9d08e2b6b35ede243e5f068c61a86714566cec28f268abfdcab370bcd4349b29748a1dd16e5d78d9f373a0c9db456d1e7c50a9ea79e304f30ebbbe1730c799d86e05539709d018ba06187cc2955f0c31defaf578d4b3035054e02abaa3168d69df14db837ff4a5be620ffc00d0876d02c2f2bc2ffb268755f66f1c31d740a72284fe20ed74a13833c1dc681f3710e5a3b340eb207954db1f36f94c1c876a9df1e6a3ad4414a720e75a7e45ace2137467666f12310d6063e902555a2f6554ecc4abff997218906ad2ec68179b6d1f22d6c9dd1027b7768779fe993e9fdd378c05345f3c2526e2430f14a7c14a98c390345e88b39156b09d6359c90171c83c6a063ad35649e36eed1f95e42ffd3352c199bb630d2cf76f7401405663b35e95316fea6b0ec80f14e5ba4f995001d8685b31eeb097a98d20b441f1015eb29e8580c75cfd55ff1d42a2fb717b4990ada575a04fe0ab28f731f8ef2e2ee2c471165ed8760607e5e54225c5b2ada6b53b0b92a6bdcc351b3ddf8020c4d0905b18d4917497fee37a803537a2391dfd6ed7db8e20f3a172640c92752a351a1e375403b43ff9c65c2d9451ea91710cc1e5c2cfb5016a661ca91a9e8572f92db7cb86b9e76c5bf0158f7ec27dfa8e07186c1e593755a5b97f06cb4f1d50ee7ff22e08bc1528c99904ca6f33ca8fdfc6b695e3ecf057f522525e3e549a9c0809a94cd2f7e964e857e866ff652d2289d3d2328aa6ec6e611381939f1a9591d554fc6e4315e69ba638d54580cad5d6a6a8c6f33dcab4aca4c466a2a33210eaf18eab68e42d607742fa5a7b3b47af6a164c08a1cf58c3f947e4517e07368dba70c96d15b2dac68117f817dccb3f200b3f432febae8bf2c7adc5ea755f9bc0b41b98fff26a0a19dacda8371294094b8a458d98c6472e08b9ee0245cc6d0e05f8cd85c754d562a691d54000ea0d009582523ae78170c201e10a500a146965d4ad5709281497c09c9011004a2ff5fd944b2a16e34a7dd21428a1fd37dc97622201f6bae4581f76be2114a73a3f8297ed1de2cefcca66e940718486cd467a063b3ff22053d7195681acf386dfff804e1203cd5893ab9d97fa5545689d68a078002663325156bcdb780c9c5e29fd093c1c18b60ac46fe110208e4e17932bc464f22ae45e14fdd76bf644d79f80b638b9d42b3d0ac5cdc358449969297cb62c7cd1bf90e39610935dd333d74fb7bb013c8f62f72ddaa9ed80cfc0ffee840175bc5beef244e1e011ce000ca18ac445636cab20e99281203dafaac4fba6c8668be594747ce6529018840c0822b85925d1e18e1c6a75a10d6713c6f835ee9c04fc0a07e5c83100f64cb3dafb451eb38187d60c047d46e86ec212491a6e01cda0d13c72fef6ea249c565f66eda08ebf04b6570380b67257940a907692b6edb015229ee9ccd831c3e65ccf8d184ee0a0ff0bcd09f8aff1371451f71dbdfa2f53800f4cc53ca9f36e078fb1ec8a13512e26e8bcd37430748e1007a1d0f008ce0fa4dae4ec544dbab2ba99719805f45e8ef475aaca684fd409da4afe9e07e591f02df2832881e8993e37d9370750580da6ed6c1d051bc526b784d0304ab3235f9884ccf8e67ef45142295142c22e1041395b2d360fed6693cb579fc6571b4e1b93a666f7e0dc24ed957349099f135174f2947eb144d38f497168a82ed92b9f089aac96c1fe6a098769ad90ed4ecdf3f94bd0d4b2543599bd8c19dec8bbb35d81e53aba7b17b285a099eecfc6bd33fbf75fcabd9ab4028cc4336f0d4b1debae90b7b4a775f58fb3b878534d4a6611c72409c9a4b8e42871c0a0d7904b4e481640915a48f863a8eac59312c0229b69afd815cd9cef4eb1f5ea32af290ca7a2a6aaab33ad524ea7939b776b4dd1f325bdf1e553eed4b00d9a5cf22152a592349aa01fdbf8270abf28026acfc7b76ef0c4fd6a2f35668d575ae9c04b8b1c7a37181f12aec36d9a241652cbff29fc48767395c0e95b7a8f3fa318c4f3f242e4b42a02dbced861a6c976990496c8bc1ba63fff91558f2c00d9aa01cf44547b092c48a5927886818f33a4768ef97e3e5360b13cfd52924c02584a36ac74b4c3267711d179ea3d067ef1cc370513f5c54a1422045c52cab0921045e9fce21f329ef29d0434bca93a968735268a7f826f15e6c7881bbb4522d0920a353a05afaea93eb0640ec70d9e59ac50fc50f78575ee26b54dafe0b117edc629a221a7a49fe4823f710506c3f61b416c147cec217073f787d8c4308f6d29c65183e7ef6241804c055075e60a735dca86f61131998a43f707f54b4a4d0de8e3832fbf0514a73cb6d08fff2cf7e1c47ce422b4ee5e120f6d11fbc9ff4fcac5f1977ed89baab6c4faf3dc63ebedd1c83571f7704240e05803979c7ccd7b1781116a0a9b9807ab15de3601c581fdc507fb6639f5720b7578043778667a284c88c076d8b9ec59cf8653c565dfb634c358bc81f949358ad97f979b197a5074d8aa66a3db69e391610668439ab5300e463e175c95b30bd43c0ee7c1a1872434b241d3f1fddca00b926f9b3ef66dd7cbd591fcead3f4852139d216c055434100aedc469ebaa41bc76bad9ca6ecd69fe33897b62c1c4edb388801d79660f8d7e56951e132c1c280dab6372d9f313e0975cc4a54c8ebecce802f48e2d7a5f2a14ff698e51877f79ee43a605ba0f7862fd4fa4f17ef3393e336570acee32f0770ae6f94bb7ec64bfed58377f64a9d2ff47f5e6ca44b7e08442a8ef28eb4a6d219644f3f04d2d95aaef39e81e60bc37d63a8b5823bdb2b5e4f512dfc5384cb157e55eb8b7a8a0ca40e3123fccf3383cfa2a3d7df8b204f368e49e4b8573f667478e46d3fb1e9c6d496f51bd3f32b3a9f9f0984f08c55cbd0086ec38850fa9d5b77cc48f7595478e72f157c5db57f578cff00331908f063ff1384b5bf39c198701e2845abd167205cac1c67bbb1b1405bd5683a7e403e76773177ab89a0e25d2f4f377973ad16dedbfaba66ca32289edb36814bf00b46c7706de844970a104f55720f2adffe67e8c60f7e1606676b6ef24b3921cc0f2a826af0fb04fcc4678029e94cabce070bb55bed79e265ff8fc3aaeb1e9a251618fb46336ccd520abacd6b36d804907f4f2456197f4a3e07293a29674dec22c13b09b216cd606822104160ce31b570c42c8ad5a855db44922fcdbb7a2f93bdabafe8d786a6c2c71f9a1aeb7070f5e5af63e73f871fdbd192c49c29957409337628e4235317cf330f4c6b60f951511ef3ff1d6c56e55fef916e711b3d259190a68cc886eb8a8afc35a253446f2da058d08c3ee9347a0269c159b2310d11d2a8e597924e53546c9558a9a48e841945f0ef1510335ba163839cf9f342c2e99cdb2305117680d134c2b989500904c0a3e047d999bc5b7c8aac93e5fb847ade21c19d6352ad79ca322343d6131fbb8eb1d59afa81de6d46ac8d5ce26f70e1a9ae90aa92dca139f664095ddc16d992bc69a926b8be51f2141da82b6f2c5f7bd302a4f34cf2d6ada6aa0e246c20a3d95bfdd960315e00bf117e51aba27c94bf998bb49bf6b6576684d1701e2246d1357d4493d080d02afb66d7333684eb6ebfcb61d3753dacd05691db2337c883ed3324c2e019982ff0e6b07313a9aff6e7899f7f916247edea9d751567905a32f48ec04b394133d48ff1ed9e59d719064167283fc4f9b8b08dc1cef1a40b834421c47da3a83c107ea766b669eaf062b9ef48b8bae6221c66272ec75678af73c5c73e35aa03de91e0a603e1416329bec4f30a342dead34db87c4a96ed8e7f1f97c181c6de162c44b75a6d80433af204b68232e2e7676101a70bd5b00ce0039a5284210eef05f5d02416ff3eb9b31f5f771804b923448d1bac7c8611278666798e3c754310b3ac8bbb16ae399c1ab28097c70505b6c0a1e9d7eeaafbdc22e800ce9297225e935cd95106e82a68a2c7ff98c54dd8669794720cf73f0632974b3dfc4394e45906c8d807ca608d4edfbec1ea9863deb727a89afe7027c3effe06aaf9ec2aeccfb90aaca0e46a30c37893f70e74763ba38220ed070fc62c994d57ba58d2319fccab90edf49e6eed88dcf754895665ee6582644e64d19856ec8ab919b52affa866900bba3bd9622f66cb919b4d90278119e2ed4e95a222b28363d9648243a92f1114c65eae7704f1d25c64211bf8580851fbc8be43dae467c998c556aa7d0d278edde768a59d2cd550695f67aa47b9ee86056f5a96140be78365eb13b60c36a3612e5ae8895d097ac5b9652f76f1025d0709f6ac34ba99ec32173e8d94cca07c89f90aacf78f1589fda58331577966d0f27b8b9b06527ded76174dfdd77601744bf7b91d15c28fd7c129ebb5e77a4338aa28b5b89d859eadb8e638a1db242a03444de727c953fa128f829192a6f423819b1221b9d13b2b8a56412c0dedd802695804fe21cfe0300a38a63f4c34dd8a19183d18a61a447bedf8e822b076f9b2cf3fbf41119ac0151c6a679fa4469b4a43a59c4a30d55e9bb137e1e18f088ad774a1f00dc1ce3715aae8dd591c176eb2a9d4e6493b5f397478092ecf31fe7f1257e0eeb97a0eafe8c165bff237aca7d0d4a5b3fa1df05d4b4c8adfe5d2b24ede7072090c3e7735d77e6588e4dab1e12bea3dfbaca032a942b9df858c48172f809b42ce2eaaaf7e5b572c183254f8c196554d17db8b991d4aafba356173be7e68beb63cfb2265b81711b0aa330d4de0b1b354342927d9055138c3cb76943298fd044cc9389c4f1c1d30cbaa46327e2bc818c1d65277093d76c04756c7287389be7ddf497c32f3f8bf2fd98720653a6ed50a161fed227f7696fd6d5f9b9af06493db3df98ee318e7a19ddd1c77156cc19527dd925c113d9559c116b2cdf95c0152eb39030a9611a5bd48ae476364c05d164990ccc4abacef47a9bd8dd8d54aeb9ce25ae539abb5c0175d522ce3d6889a4490968da421271d089a16ab125ed840625df0cd3d2ba64b522db8e9a76c0e442a7e3d5e5839405a0c5466ea691b9929387d3f8d9a26fd5c27adf76cca0455d49f38491b8124c36222f985cc0fd0d71bc92d7c0e1e3d1f19cc02047b7b4008992f2547865fbadf806c9e99e469bbe32693fe495ef82532f7c45c300de8c0b6700fcd79e8f12c10bb8f9268c1958508f868d3ae9bcc8145fb120b6d50f4e23e001c018cae1592b82efc562093bc6cdd850c3bb1319e6856382dbfb42322ddc04871bb3c1e726e668256658211be854518806bf9b43ab7f3237d647689979f6e6082c765e39ae5497824b20c7e2fa4e98558e426463d1a1c4c5f581424ef7fd301c3f5231de6eda8e7b744c1dc7206473b9ca3a047599180254130ef6e74b07ff62b31f6c8ef44cbc825290007d540e5cb6cf7f6034326b8737336fbfdd496503073fea9305bd23f310b3e6347261a00283fa9dba0485c8efca35deb4c9662f84d3c675c2b74c45d97a98c7b297683416c07f2023e3915e5cfabf229c5e22542f616b2efe2166b244f3c541201de46ee2fdf6436d18174d9eb320e28fb1af9f3a70eb4588a8e614d470ede15cfb08c3d8f8fe4a0e24409f2c18c713239a0ae17499e19c17227eb22c61f3cf387bd17b254108a47330361ff7df894b44bc04e886b8502ecc579e8c3d6d4ca19b341fa4954d2ab6b46da6b9611d966c7d121bd331beeede1114d67e94096cefe4021335ae074f56f286cad21f75aaf22b7666e5dcd56948c572035acb0197b376687bc46098cc63eea82515771fa3752356b174ff05c5c6553a9fe12f36ba3909b8081345b4d5286c05faefc8c7a2d1b5950521c9ee3c162cf3d834708e973a0f86036df4b8d5cbb3d899f99fe17560fef5d657700cde4e567970538a909ffd73b887db01b8c1a90dc10f9d064e77cb80cbea1c6c7cc10b1a5e9e721f0e71843e3a91e8bb2171ed47d31ad3fb9e79166e96bb5f609f7ff4a4ad82c3118ae4ec04e2d7815fe606759d98141ed5307b8559772df8630f3e7da371acd058c586ed2ff184d2a0c41d1b1bf940ea0016110a18aec7d5b40739f954346d1cd8f42fa1f92d3c5261d878d214c877b10fd146a44e1fbf717804321b46b3a416b29c9612b494e6a202679180cfdc61ca5f8bf7f1c62e8ace45ea3313bd36e4acd3a242284110adc27aa40d1a72549cf6f416bf0c79d978485e06ba0b8a41d9c433e641719adc8422102497ec1f93d66c51a29498bb50f80a8a9212d431aef20aa0b1e366f198e940c62ba00335108f419e9698183bae44dacf67a5e64973698f7b5a087893ab568462d110ac7a4ff2d316649e5b7fbeed0107ccddab614925f079b90f1bbca26cb4a3afcfd1f13d688527a6bba0f9900bcf0483a57340776dfca9489020efa9c81196bf8b25e23bff8c20cd8ea4633cbb8217695f4cdcfe36b8106e10832b52ce0d6cda1738613b3aad65fda0ce57d4b4006cf7cc5cffbe9a92870623c75a6b90759aaf1035b6fb81f1b3054289465950883d02125a7748b9e26a826381a0226b6deb276aceb2464f68f328ea4ee2b4e6473453142ec6c58f8d59521241d287b3cdacd2875ff2711fdad43dd0410f09086dacd530e31a5ed630e97de4f333e310d0d60c724d6f6dc4def9a043f7b43d9852c9c258d717d400ad6a93f0fbab679d126956db744263d9d6d8c684f576caf1b9513e900a56b14312df92999223361b06efbe4eb554c401c8bfcee7480271e788a03bc2b51906dc347a4039e9c123f8137f6e3082188c367c2a63b44528c879c319cc1490136bf29d0ae9f4cdf0f87cb3e285804b634d939180ab1f2ea6d84fe014e3ffd9d0c627af226b2b6a613c8a1a3d183cc4e39b4727da8137178a392602821c3b1ddf4b3e7e300674154be30168562fa17221dba2db200a014179f210eb0908e90fbf2f8c4beee88b1501396873d2e8b9fa4ed41b1b3a004958fdc4a367cb11dde9b4a427bcfb2304865a5cfcc0cb314e9c0ecde73b52ce3e3a71dfb219988fa47abcd2f24c23048be4c6639d9f68e8e083c476b07dd574b854bf89064fb3c3f8234bf894e5b969f0bfd9dc2ce1d24ce45ae229ce88c118339ed0355012198c948cafc855a8af2bed2b8696b761d74d457b99a0f0491c9852daa1046ae26a13161a343fa926702a935d16bda439dfccf586b80168043166a08abc103d122105c74a98979d3da46f7567851d2ea0593ff74f36fcb9b93cfc650e1e504c78a1be234dc70268656e21c72eba4a2d483f847bbd61cb1378b403c1ed5907653ed95a055142237cfcf894a9d72e1bfb85cda3894ab03a711cd0aa09b99a52485845ab9dae9d6aef4e61f128035d3174de3b573ac2898e0d85f7b1729876f4f24f63538952be4c61640a0baa052e2bcbbb153dc2560eec4230130af979fe7028bd0cf7303d61dfaf650df2b47d9b5398b07ef2308d65d259fb1da6e51c0e2464382c61ae1a68877182c6189f9a84a2e48d7aaca4d6642bf51026aa8d341321a21a6f95b839b1fa3584cd0d0cde9aaa6e855ee7f34b855a7b3a69d8181ea82b0af0c491517e749d80c4b9c0bbd544818232613d49af55cb54896df630472315dfe115143aa32545ea1cfcc707002e1c467309c047e93786e7d5388bbdcfa83a4663aeaafb5a9f04a739e69d9cdb254d7da8c19c153cfe69db28f86424cfdc8400693ec4b5b637349984a71f3f9e0ee430c5df2cc5c9dd7ec0194677f3059af5f71d159496c3e42b272eacb5fe35c9d94e99ee0c8ee855a788765f5ec865c0f20127c384a9ca9de9924b6c4e83f65768e1f48298da103869192bfaf7a1d562b93063c656d187726ec10e4b073527c481325ac46885b197bc47f92ab13410be54c78ecf753288e5c1e3565e0819fe905c6cb119ebe2823548f9260c85934aed2184f11e5305d7d00009d9cc591bebfec084eea7da45bd73bd7293d198b405a0666f481ddac2122369e9776fef7bbe54479282917eaeda1fb4c9ee4d12aaf9397b8178e3afde3f257e9c60e96922fb0206a586b91c8b7f99ef14adf406106d51795f6483cb945feb2b1e32d31ac8b3f265b736952a0b9f1686b285e90882b2b9532f83349e9def65d8221549a23ae26dbca785501665b2d6958e428a553575c401b42af09804c83f8b745bbe9b5f6ea6069df418419cf225c3bceeaa861d293e1bb3081f0af3416396629880a6ad45962afc382aae89bcef17656ef27355ea1a39aea6ee225174eb8d1015a326b4a44a35224a397f8401885e5f7f823ae0743f564d7add86979f0e827c4d655a523f4326919c24f0d249e9ad66049cc87cc854d151b2b430190148b8400c8ccb55f2f9d84aa729411367fad5fcb429715698df3b76ca9812caf6878d0ee0ade170b5eea713ba13c6c4ee34a4cb57805f1ddebd41ea9cb8167399b6b95569ca3f4bb4e6ea4a8f1e1da3104a64a7a5f0e21b06433c9e27c98293aec0e82651a51221c75a89a3ac9324e511948f907c04f63a000274580348ab2af37e6b200f60155240cb5415b0a4a59aa778b2acf18c7bdf5c519b4b419d48e4218e829e9879744bad151b4f4972403c75f3b353e9d8b9adfb3a40a46db7c120fff72285ac8c8fd18982c33438af89cd335924be743f16406f019c805c90896d01ffbb4171810b72ef44f6f6a93ce5b44f6716ed669a0f5d66c174a04b9fdaad6380c258703064f581d0751d995788e4f55c0035c8355e30e8c641185c6cbf2afeff8dc51e360bab4b6acee7b23b65c5d425b824bd352a067117321a8d7542539033707d74905aca2459f0a491222a8546c19b0d32791fc653daff0585c91e12cea5ef0c6675d093c7dd7c7ef58e6c97e673126990cf9a04d26d794c81e07b0b03ed56166fce22df7a35cb7a12c799c57231c766af9ff6b8c483ca53164faa395341e07f48dc1d42d0262f2d860fcfe92f00c9fdc4e2dcc25c5d05077586224a36782155b1c2cc96e387030a5de8f78ed255285d6a68b55747b9f06a0c5d6f523e4aa485fc66691a71c1ef2ff6eb010aff5b037e73c0310a1ee23c2a46d00c0ca8835922f22c60584a995a06949d8b03a29c8496ebdadb7cee8c3d2c6cc16444ab2148040210c3ab539f9e28634fd14df6689187cc5b3a219c8834af989535b6ef46410caba6158d27869dad09cdf3a93c73e7ebb7d45059b52a1b79b0b29a38bedca119f421bc75662d13a346a8082e1526185d7ebb9847af554034ddcbbbf751df64520eb79a5c646df0bd7c6efbe9a718e6f9590945e95ddc7a01b6a1fe084c5b8c8dd410edbc00d72a31b5defca675256b796ea722ffacbcb0e7b24b24bb874583105036621939627974e4a78988c530f50f01eb1b3c3d5946691f687de009ff2ebdc4b849c9541b1050f10e141806685db01313361041f90c7c2bcd4a941efde8c72c31e726ffaba0aa47920540764325e59cb06e29bcde69bd21545f006bd612762b7e8348cfc99ad7d7541185b5f751b0c075f7ee99f18480fb6335a4b5d2b91081c6aa8fb046f8e482ac0c845c1571a285097ac85838a0d0701a5e6cda91fe523e8511a031bfd056a8487f2252fd1757220096ae56a5e861310c338e65f42c8c532673c0a2fdd4289d1773119929cc395644bf0db91e1959e7fa4452b32ff197b831e6ad901fcc730cc22ffd6829f9f9494d7e08a3a53cce8a635d0c2eaccb390a8bff90bf8504110d0901c6e2a30961ec2fbd551a22f60375af09f4a53b652784316b2fa7460a8c64a47672a618ae3f534459e2a7a8c35d836f624a21e2d8cc7d3aa66cf0824aee7560934ee29bda06c89543b93ab1a1733dac7300be1160f26326a10cfb2ba36f0eacbe81db8b80412f7d28cddd5ae2ec108df7b846d80dcdfbfb75ba2ee146be81d5318aad4b94fabb439c4f161ce28526a0a362718eb922a2a9f66678275f5f61fd34324a8318e73f502632b827036b64f202079b2ea598a442c284e526e2505fc54af71608ec1bf9b6e9ee3a675867897f8a6d4b322739c8258deb074dccf78118aa44639f5eafdc53ee4570f605677f1b450db9418cd3d3760d602560ac8693876c0be9997676aff8ca5a4b2523eb6dbf5a1331d17504ba41e6b096c8c9e4a8522cf586726de5ca543b328af521f492b5a998fdf1af88b985f32bb62726e44157c615b13d1cb7ae11e11f3f95cf4ac871fc5a1c4180416e1be157ffa6b03e1a601a983b3771dd35f0c8fb92268bd5fafe54b3d0e8597c958ed03f31bfcda46f071937e5ed4bf71c3935fafcb98d2d885825d62b2666e39cfebf1f42cc8b7dc0c0fc0d41cec96457b5dca8dfccae742586b96c97dee2f76fa5381c4a786f39c29347856cd148a7dd68453a596086e538943294f62bf3d9beb1791b735918038110c37c70c40b152c35a97fbaa7474323cc1262fb445e6ccd905db15dc67809977eab329b0da1a90d08ab9ac8667f925220563a5ae819bbe9e7c28a993587684ba5d168223f666b45e5c3550fcc842a4cb35758024ab8259eb1a4bc041d4147eaab5b79f948550abc2228404467d44dce8efa00e33b0a33472c9e2c5600eb7792c1ae3d6d523a6ca3e236536b67b047adb96c0f248640568f26be9cedf947df161c44f7e16069e54de659010d5e33f3bea30ea42726dbe1522c8e998c33fa6071979a244a710b4aa3b988826d2581e4aae2f4a41a74cbd806616506540f1e57d77117a537f63afd89eee75c9c1ed0b7180f5a192900b98dc165063d45ffa92b2c1afc4408b209905ccbe0d3140d89a29a96f01508fd6033fc64d3020ec25c3db2951f178e89f7fca005729da26b932efa7a975a3f6e0da0969e88a81799b6348834fa00c96b80ecc3041fa9d0e859111a6258dae80242cf7ca5018e1f978ed31019c1f9c87effcfa259bcd9992964608a693e28df496ca4c316104e46e8e6e5ffbe035b5e5b56d0c306e6dc33c9408bf30d638e154d92b4bf367a190ea9ed516e655c763a0802eaf4378f9a59871692bb122f689bae826287a330175b16813ac5337a2a93266ec707f950416dd7877e18e85507397730ed25e8d04cf075f749f59c34c10463dc3a31dff6b9468484592821520dbe95172d56be8268a200db2f5e33df93e69a2c4fdfd16f3a48eb408be14c79f0ceb31eb4964787965bfbd09004cf9ee5f8e4df6a6cc91504ef4e611f2a51b59896132bc41dd7d43c98f0f0856d6aadd510eb1dc1ba54fad2976846ecb883ac51d72a957117c959a640607f36b1c01eb7cf802fb9494f7753cde3b8b31f34e96a24167cc11d963f1babc3a4bdcaa321c3bf89e0763770dd7c628f5626b1a083140aa8d486673fb1d1605ff30c39ade3e5b1af127b2e8b2636633b5fae66905acd8ccf7423048c97a86b483d1c3621fe9718bee26240a4c0705af3a9b23f4125c55856236d62e6aad0d108ec07b6aa012f3ad879ad58bebde8de1dd3c1e73f9fd0a7bfeaa7d1b135467593818afc6afa94cfb58a1a291ad60da21e7a1901ee97565d451c26b551711fa7f01d7c0a070e6208105c8a84e1cda2d1fbade0f11ff2c1b8fa63267251afbc0e847e5a84c2cbdb9185f0337b2855fa0408aac7154cfcda201c308bf8ebead3c7baf877842fc41f04b8280256d032cfdc762b7f58ec2381b83ce2193db47c34fc15c18bb891d6788cb55a615cd33a08efa31cdf224a581a92d3b3bfecfdf3299a9394ace87e8278ad09384b18ad0a4384bf9e540d05471ae580e0d513b2e8f646a6cf75192087f455a6ec8b107d69444a7b8f05bf626264c92dc2b19afb8b9bec900b8addc8982a83f30c4753f93cae67b3efeca9da6d17a7d7504d2058e92703993f181e11f49aa9378cbc86d0ae92a68e13bb2a0fca95f4b6b7a263fb0929e498467719afcbca37f3ad0b21faaf3e282ef6fe101243febd9af5f57fc403f8ddfa6d73d135c529972bad3547c698f7f8a67a77318657eaa1a0a122710a8b353154927d963524a865062cccd3eb86c04602618bbe0778ab5885d88c44025446e01c703aa9568990f4467ced40e38c04c7037922ecc224425d3312d568ce5c5f8608d8d4b6c3a24a8835a02e91c18988d5aa28ee5ba5995d4602ac4dfa20d6cdfbf9fc9e704299f8066a66b817a49dd3668d92bd906d95c3c4541da6e0cba507d31cdc11ba3296d64fd8a7c506b063618ab5d95d4fab6c8b60e0b954625dcdfb73d220400af1badd209039448c76838db9a5d80ca0d335122c28c0ac01d07a1950dfeebe8295486d42f285eb48cd39c283f51e18e96777c57f297ebc0693f4b4dc793a6dcfb50107511843009ca8f0a6682138d25baa21a8c7164409965c6c93b2681c0914f167624714ef7e231318bedfd7320c0a39a5ac413d1a15a58d6d1c98cf24ee0b8076964be6a6d0e0433810fdd6186b21f35e9e4c0af84d4ab21f8730f0f420d0c6d3d05c5ecbd93f1d551da4d6b2a8c1604d1bd9b87264dcbbd3574cd996f4696df8c2ab806573787f01112cc5cd63757cfd54af6a33aa50347ed913118a117e7e7aa2114d08731bbd48255935825a028ac17d790738478f9238624eda18b8d9c755967392255362c59d4d286fa32eb609768542a1b3b5178625384795032d4433a47d2a900e8fb4737510b55c4589b31da74883b1dda1dc98aab4b80e27f8e178c4441babbd31b7ec7fe19e9a644d05898ebe61b0f2a81fec32ad3565669be0c13efd137add19333f94b1fa1acc04cae4b6e76c66d44039c3b7171579dd45a70230c7c7556750e6f182416b1e5f93926833ec7772d734a4ce78aab5e6549d03252309ac26e7f7cbe07c60166fe1e735885904d448ffa88d1bdcbb209cada743e5995447fa7978c4169247809d19f8eb515ae6988fbdbd455f25ab6e35645baf90f7e7a8a51c943085c47165c699bf7bdd9c1c9266a97a55a0f179b5afe7c2cf61c9a80b947c9acae8de1711ec53987d2a69d8e20a485255a3e982444564e8825d2cf94777cfa767bcdb2e8c2795d160b70559a16870b9d0eb8dbd80b94f7155a4be3cd1881db07bbc3ba9395429aae29bd8638362cb8082f980df95445ba0538e2abdeeba462a279e62c249550529759cd3ae5b953eff6c452045e105dd3e14d3bb69e224f833bfead754b2633ec4d04c51b18974d47cfcd1fa92d2b5668f5781f5d71f989964a60aa79b985c56c04d6896de1fb7d621c0a65b013f947e6eeb0caf094cdbe40660801f569b9e7fa890fc16e8754ab8426ed5d1a2c731cd19346658f89acd3625b42313beb502c99878ea36f2068363e63ea16ddaabc9be59058a42c01e6528fe60abd89862c4361240b42d1c44004e884dbbd0c025a7c6b94882cc4b47a6d1e622945d28ba2c1a1205d2ee7df93d70e4889319f9bd4bdb9a46817539f119fbaef6c74d4c6ae85bcb7abbd5f0b9b01be235ebac83afa5b50cca802eb7ce0a5b0f6be95b35110d48c0037fa5d4dc9f00d780fb743891a51872f3299289e4de08289fef7d45acdb01ff163acd25492ddfca4aab9705e82922bf5c99a05064bf563efd21bd2eae7a743c31a07ccace19c8d6f01f63d744cf120c9282a3ce38b7848bddccbb399ed598408d8f6df8629b4b3da311505d65515baccefc7075a23346d7ff96e9c59047fe40cc10959d3fb881722dd3e1c64b4f36789814d24fdabb91e6948f76f0e0151c152f386cc41b1a64251b5a5bc7ef24a800b10afb72b003a5ab6164b8fef4c61655f484e2a500f3ff2bb36480caacadbbfefe7162dea9ce46240c8dcfe69f1e1f21a83c04a0b9c7bf1e3adcf6d2b296ed606b0049f7fbb961b3448d27e80a29857f83f4b9cffd5bc4652d2f4c668f5f5036c70dbc76689ae81503b879928dae0e1dc973d8a0b67d6981e468373176a30fbdf12e5003441ddee6a21bf3e18d950ca033b7d07d821a894628330689cdfe5518f68fc88bfc158146f787aaf8df8a3cff5efc1f40c9fd432c1da01d27c044ea0fa2728bee552368625b66a961e62953a3898a49facd0796da9daa4a1d28bd4b07aed7335cf3c46013dd1001e9dd6d6c05fcaf14dbfd7d521cf58bd79f409fb42b96194d27bb30296b87e0fedbe97b58c830f3b76797b170a27cb4998a6b0770a257727c10b5b4354e54a0520882c7f9420e68ea2292d29991790bc09f675abe7333330fbecd54c9f16ab67972ca9bfbf846948b2f154bcf8609ba0fa5e8fa4d44e08c948a7bc58eec1876ef21928002c008ad0330425b863352578db311feffa37724c008a5741a4e851e94937e8966bc48b147b785071b40b85365861b77bcbd8a2b89793bf7c1bdff1a019092b299df887c4ad137be469e9d26d0169fb284689808f57622f225a1a47013aa8b348ebdbd39d7de9f59e39345368120537a81337c7f08c5893e4bc4042e9e7c4f7012b120c51457d667cba77214f1392861dad4e0c53db63d14d83eb82eab6ca7164ee2741dafb251540b225f9cd8b63c8fb1f42b4fa9602fc78af1e6c25e0c5b2546f0128a1c2ed8cb18abbea96e8dfbfe2228893fb5feab04b39a8d4e296c2ee3ba4bce6c925a3d4057c98acf0a4764b00806198cfe214b6f335b83a5a142236b98e5b7c5fd85f5deac021d75e9ff6af7f8abc0ab61e2f4842385c27e873ed076da33d3fa7224d7a485ff5b3a98ecd8c004062ddb672cf1158530948114f69d5d090d9830112afeb3b96eacd53322596ab934002986f65c7f6891c7008cc380c775f79d5b0c8a44792460ba5abf40b6be28deac3c811df70cf3c729cdf49734411d7aedea10620b2f99be6844379f01ba72b4895cb4d8c701226491f25beb123f45b7cffc3ad12801cf15c475722e1281cf600d766264b74aa2d06cc90b373e7d8a237de28062e2e713399a989200fa1670c09c8a989c19e8c880b7613e58916b71dcf06b557fd99c8110ccd74946cb5c489f92e00650ef76585b91b6667bfa40c455f3a0856cfcc875184fbb653bef821cb0de285d669d380482bdfdf8e83f305de38630c6d7a9f75fb13fb1ade67fef5a3032f846944fc6012b0cc932dbb447f74b8845642c0cb2edecd48b765036bce474ecf44ffae7cebcb68648caf3853772fe7c2f6dac37fd63d60a535d659901a5bd06012247b8b9eb461f7be3ae7a7da8246b971670ae8484dd72e0d61000047742aaebda4498f34be5106d165c0e7f967cc4e03e7dafc8d250e82e60ba94f4ffe0f6f3ba98f348eb119b4ac163627fdc80a8a587ee44bc3234a3fc9034ca3777d819d2a7c771fca131e6028237532f2245590adab68c1c0599af87b0075114b91691be98731e620d3ee13647c97fa2a47f268615412fab1f61ab1053e1a110ba09ba37d7b3165c424483a2cfce6695d0b7238efe204ae28340c399f4419c676ecef986fd19ad8a12d618ab21f8acd0cca88eadaf904079a21271a8624c1bfa9d9a153e8b91ee4b84b052088641eb0accdcbbfa91801f315616baa86f4f2cac6e6d4c7ccd3925943e6df6227e985a1b47e2a01cd91a858118fed5196c14819c620799a542a218e6192f691186966e58dee9794f91ec60f50c19b383d4180d7d88715152d577bbfac5e60dc3bec27ae0d467accf6842393e9dd69efa391f73bfaac326df6578426c52a2653d78056f1229ad87ea75272834fc8c0142e8712c26c4102689f5143e5cad9378084d0e5d3c8d0bac86616b819ba368425893aa289e048d2ddca9915eec0c884dfde91baa412e479d9136f44e2e3fa25312337be39b5b707c51c09d9964499688857bdc2d396333f3c826166f6efb13158f15d0dd8a892394b8aec3d0675dc1ab3a46a2394fb851adc8bf2eedb6b04baa693c8fe2b77b8d03a6e6308e7edc44ef13a0cdee52883eef2137c25dd8ad56aa099b2f99cf1e7d54cadd6d5717eb17c8add78d5d6f6d3f6a214292bc77273375dfcddf4652f2e6320716ddb46d809e9556c80fbc96fe39b94090eb7edd2949dc6596dcbe9094242a089f27d692698dcc1c8bf7909aad288ea7763551a617803c7f1018e43f1f60716106a3c5cccbfdc012d00a8f3a8f3238604dd82848e9bbf9bafc0784c68e11a8d2ea4e9e608c16326bdba1f60929c0591bb19d13e6540eb1c508fd59984a20daebc9a75cf2c0633302f0b212132ae277f80baca03137d854aab8ca56e0507ff34d49fc1709d234f8108259a0e45e47b86efb3c065b706fcf867e4fbe942da42176f0bd0cb234047fb4e7204acbac5c61466f852d2c524fae7747ffe2a3205c01bc2267f6975097713ef1e1a7407784a17e87c39b7e34a2b89717d0d1c91363a6c27b35045b60937d26eddb658db8f288a9fada1f97df26b6f6287b01c89db30ba28a72d8147719ce62d6518cf492553ac3b6fb4bad052ca8d9640ddf379ba6fc69818940a583e410100dd50abf4f8aeec2d7d5fca9467db95e797fd4b492022cb184ba5ba54c24b1ebe2e2d0625de5c08b494e1457b99e03d9fdee8ee54df998573a2714da408ea020a4f92282bf177eb506accea51151b92a18409b70ef807a1b08fe416f6e89e15695a35b45de0192711a5deea6e2d9fcbd05bea3c66822b0462cb226fe9691f44dc60b7dd18c9921f84b15399488f1a3af1040edb4410300f286bfa08954064faa250224bffcc413f77d2e43b10151b89f5f39e0fde40d48e583c4bc7d04edf5e998416107426172ede45c82b987ecadd6a0337dc52328e5ecd4fdf1f0b31aea062450d433a4c1690d9b358f70c234526d29117b2b183bc4df3d31863889962851d79282837c2fe810bcb1c6a8d3fc051f407fe1a47c3d3b7a3d5206351530b5da15990a25b608691e5f05b8872d243cde89a16acc8b7e0177b342f1c0ff210fba93936b5aac0148cd04636eeafc0e837276eb861542afd085d4f3fce0cff799512b719df343e120748d807381d782ebd80540a8c736fa4b03366b1edb8c8d8af9d58c3104fbcb85def0655cc9f1dadabfe543dc253bdcb52403d0f64ccd801bd10735272d18d2129bb8eb08310b9a7b0577e057c411ef7e600effb395be8fc8949545a7f00cd8d63b2149cde49e3444531ae335eeb2574061749111b683f92f84028047ea89c7278e4f517c77e26deb9d3141dab2744deb5917a8a1d62da9907ce785d5d0d95c50942073bf987fd1bcf65733f1cf55b63cc877cd54277d22de84f36020c5fcb3baa332ca2dd406046a2e03a359201a56a503d91b5beb1f218695c4f48bfae36fa0d33ba0cc7899017518cb8530c42f76c7c2b1da1c30a84c1513e54c840170000f105565e9d8526d2f78e9609e00d55942422ee77b261e7d4208917bcbbdf7de5b4a29939401be09260a8f093c12676bc91cf56b2a85f10a7b653cba0e7147afad2571b830628efadd4e8a7335c175eaf670fde51727309d2a19f4d2aeb52097d74c23af9158aa06f0f5e5906cc926614757e17f2a85f164ad563d9c73bd3cac505ca6be14cc45d1b572ae38535dbf38813b0f6bfdadfe066543720e686619c69b0bf202504ea69bac9ed9936518a7521fd6e73e70462c86fe16142235914c0b2182b57f8c399ce3c8d0d53fbb3e5e6397860c8cbd7f7d19e43577005f9fe60978333180d75e7b998550c924c69b585f86ce5d3bc5b9a68c0c74ba94a17a5d6ec9a1bafb1278d20de85236adfe0040c9c465ea67f51d942d5036f1b07248f339d754c9a09aa279877a732e5d793cac3fdfbfebd1e112881fa19d2b90746cf5408ac63ab67a10054d5994e09dd1ffc165363461c75d90661c08520fb34dd3deb5169b372d123d6cb139c6504e4e2c4af0e34659b8911bf1a4e00f50dfbea4417e2581933d9568ff188678cc085249e7a4732ad1d2089c3ff7d530c315624c4c18c619e959c6cd222ee5169c7d0bfa8852089d0255a065b6f1b0be04a526409ca93be2cc153bba0692de188a968fbdc687a9a791de6111a667a6122c018e2d2b5a9aead8b262486f1b5d7f0701e24dd4b5d469ff783580e7bbfee135b165c58faebfe306af99babe673b7cafd93413a45181aef551b528085d5d32a239052e7e8cf90107b11fb77da11e222db5944674cc5b5eec23e803b5e12bb2b16fc9d934967bf874fc98044da3779ca2b7fd685f257d2c2824d3b5e6181f9456985bc7a152597407bbe879f546596badd586d62b3b6ed3fc070577d0e0d0e1a10d8f04e46024c31378a7a8a7bcc665244392e21f86f62a92b4a3b410f4bd7e94d79f5e975abae7c00275b2060c060863315ee33fdfc50b507f62f126eaf9b48658c1ac7e4068139282ed444064230a8e4f411d0b14ddbfe5795fea42c0ebbaefba94de367d371515d309a5f2dd7a730e34b277bf93f73d7defc32d9fe7795e0e72faef6442a9a8a8a8789e8af77da1e75d7abfcffbcf33997e973ebee7a1de0331febeef7b151515952fefd2e357f914b843e93d14fea84f26223405d2b85e87c1fb77eb52208defc0cd430e34726ad32196cea0dde774d90e819e797b6f7a1e137f0e7d9cb187f873bac7ef6df4bdcfa1391ddeb66de5d33ed48a0ac7f2d1f7380aaaacccbcbda743a4ee9e76b9a5c7f6dde7745f02f7d6e1af739b5e4b0fd3973ec794634e97e9ec4e777eed3690c89c2a288ee55bf93efc61cfdbb4eef17b9fd66d9e663269defd1cef2f9db9343fe784414e95b5e47839e69c7267023bcf3bd10ef3a04d6ffad4671ef3aa9cbaae45fb9567e93e1630e794537aef35b0c7e97a2ae0c974e2e26d31fdfdd37ba00c0110ef82404aefbd09ec51c2ffe1f9b5f4f09e7e8e47734e97739e3bf010023a319215156c2ad17827d4c6b282535f6bad95abb57adff7b5ab1fc7715dd7d55a6b7d0f7b2a55c5ab28140a85c234a592c9a400ef4d5d4bc9b452a346665131799e874d2d28940a0a871e0e94c6f3becff33c1c58b4d8baeebb6edbba6ec564525941953ec5627a6edbb615ec6df7c19de92ece7cdb57fa5bda3abc43a0b7ee7e8d7126ce7c5b096fa5d2df6f2b11999bca966231ad984c26538d4fc11f8046d6c32bd1409f0688031c6768bcf1eee944e3cc9c28140aeb2fc69bd27b2b5ede444a608c3397072d042c9ffa186fb4542e3dcb4ade24d05e2ecd94f2268251a76edb360fc7f7b6eefed7fdcdb6191db9e225187031664b9fbb4d90a469de9e4773adb57ea8ae6341e11595aefef7d76214e53e08d0f8d47f7fb97c4fa7ef5e930992eed7e2e51ce2943141d23641d27732e1ffe44a7f7275316641ada874a8aebbddf56e77bddb61aff4b194f21e5dca5ffe52ef3d53c6444d60296fb9ca3485402acb955cd5bad2df0c6760b9f2fefb4e600e3452499e5cd59a0269fcf7fd0573a091f274e4ca4be52b5724789500499b2049c7cff00744164c90ab0f882cc2f051f1af88f39690470f8c3168ea5ee2ac2f79e3dcb2a16afdfc9dc0ad43f34d1a1d97a3c14d1b1698a7a1f134dba456dec6db3c0f4771d82f10d4631f728a363d6e399932fe161f5f46755fe9fbde47d45f7e39bde9bfd27f2d8fefe937c6258c5bc014e8628a32b444bf1ae036ddb0f22714ae9fa2e1f2a8d27f8fca328c53a9ff1d6adc52ca3de414fddf9b1e3f77ca2d39a753a69cece2ed9e87b7fc88faf43ea23e6595afe1a3e54b7fca699153b4bcdd9fee83b1e5554ca6ef4cbfb5e09075423cbabcb32d9e220e1a65c22bcfc3512e2ba71c24f5f84d205d49a56068d8f05868641ecec282f1e92dce2cf684a78d0d4763a3a37bee7d22f72ae0c641abfcf48d474bde4574cbe31b8ad4f8afc67fcfcdae6eeff2f528a2bfdc92f3fdcbfbf872cc17d1f2d660327dbc25f06bfcfe6d337d090c716801ef88c4834b6ee1a2aaf23f294565ca92434ab9efb8dc458eebbac7387084e19b4ca67a32994aff187532bd3f484b8ffdd775dde3a0518fc226f0ab4fc1ef4fa0e95d7fe02e651d1add75ddc560144c39ed3f39659ba008f73c2607527f71189e1fda84d24ea50f73d229f5f17dad99ee7b33adb4d24a2bad343f80943efac05f7fd6bcef73a6ef7324ea5eedded3bdf796f087bfeffbf0874d5bc766ab41bbaf827592d2d3025450a92ef270eebfbf1708f7de570adef7b68dbe97deeff3beefe96fe0feb69794d247510efcbe8217fc3cea518f7ad4a3f4b70b6e11fcbcbcc2b2f2e1f7f096f70f7dff87e67e7f8f51ae94756c2ccd41503a369afeb5d1a64c69d054773a9d4edb96aff77937c7358e52cafdfda1f14b1a0f35c528af51d5a8404ca62fe54b534fa72f959ad44c9fc7a41d4bde291a9a30d455e55d5a6c50600d4e5e20367e7d9c4e6fa26f92d587f7f404620f6b6c6293a3e9d8cc4dd370de453e1dbabe0e1a1a1c38c23026c645d39409a5a956038c2e43a9e9ab01c61fda03756cf47d1cb7f7df3ec8d4369f37e77adecdb99e5751f5794cef477741cfb18f2fd7ad632381b8c4f77bca3d955cde3a3634dfbc756c4c50f423260846d8c026260846d480c55d500277af774bb7ab194ba7b26242d5bff7aa7897e2fb5fe974efe5bc2f7925ee6eee7ea7fb3c9cbb2795ab724d2814eaa26ee9a22e57f2bc54a9e43d4e81d469a07fba93dbee5622328310995a05e3bc3791a9ab0706f12a0637d638155d954a9d5053e5721cb7fd05557e037354ee7fe009dc21f84a799b3291f95db09453caf7bb5e0824e6e136dc7579f380b77f0fbbafe04d811d902d6322f463d1502c2b5cf7dbd675bfc2e275bf01b9fffd967373fdbe84b7ffb6af6febe6416ff8690bfefbdd8673cecd9b07ddfd97b7af0377f7a52e13a1fa5bf98eea6ea55b41b17cfd8e5339b19c4edb69ebbaab6ddf9db4a774cbdfedb44e7b0cce8d75bdf95eae14e7f4ba4dd3eedfef31117a1ff54188508dfa6d4a81d994f9f22642750d397858c37f8cb33fc2f2e54a0e2123f7bf6f68b955b4fcad434bcfa16550cc517fcfe870b5944fa5949f92e04b162ecfd140c14598cc8fa00cba2d32f79031cb6e98e10c9cfdbc35c83cef0d45742641a9b9094e5048d5590e3dacabea2e93d98f208d4bd1f667146db919b3b5cf715d777bb8b6d65a3bf5b4d66bc9b15abe0974cc34a4d5c330a49f9af56d6df90089de610c758845b1284aec35fe8fbdd484d65a2bad94524a29fd4ae9bb48c194524a29ad9522c162898e2d2c946897ae1fb54b1dbde6f5ce6ccc7cb0d2b1e5831ded57c6b83793963564bc915a6a51a67ead9e5b599ca9efa2055c3fcecc8626071d5cda1c6190cd29cde0227db911bda400c79650928e2d2124cd799732daa1f9a043b968af1e1d36f14666614a0ceb09a24cedd1f2b74a55c1bd214a1292874d340a95376569caa3934ca6bca74bb7a0e02a2262a231ce7b22d151b4e7449a0504a1202025baebf2f6952e3a03e9e53ad29b14d23289c65c5392905e594cd2363ad115098da6d97670cca6e76f4ec747e1643247a44388a11162282917516652571534fd420145ea90deb4a52515a2494495cd037ed31a38e037c541037e53297070d3fbcf2b44150580fca64618f09b06b180dfb4881bfed44554c9950dbf27180af83d9d90f37b92f1c371145125817cfc9e54f4f83db1a8e1f70c4202bc248b10f07bb6e000bf6712faf7ac018ff7c4882adf31c06f37a300bffd0a04f83d8decf04f8ba87216ce6f27c2cd6fef6200bf1d0c9bf7212752fdf6266a7e7b1434fc762a74f8d5425479d20cbf1d0502f8ed2b08c06f6f018d7b11e7e7f82dc300c06f29c6cc6f6986c6e15cf85b3a91f92d89a05d6aa15d56a1fda51451355b5366c6c8265e9048a82652f6feb227de682efc96434814688f5a8855d014c994992ebfe32b8611bdc8892a2aa4f323de60dff204d04e83f619140ded25ed37a2f69a3236337b40de9903f2c60db0b1d1530848de1903f2c60bc837e40da321b121ef4c0179e39cbc531a123dffc70a68aa32241f79673df2c6350021e9f909c81b46672d04e49d1d206facf37c1eb26867aa321f03e49d15206f4c809dcc47cfdfb1c39a2a2c0927efec86c5b2c91b466344aabcb39abc310d44447abe8ebc61346b86bc3301e48d0390776a3e4dde301adb9932f373e49d01206f3ce383236f186d8b2cd094992f43de590cad56919e1fb660c83b7b216f7c6322c5e40da3ed8a0a4d5575b990374c460222792430796736f2c62f54c8850ae95983a6f69aaada92374c2a8583f4fc14cd58f2ceb04aae79c368ce04c3a7304d42939c84965044d44a4a8a33d2b5096b48b42934208da5f94c27d349094923425b693b4940386b6550c85c59514634879843c41999f95c1104c47abde28cf492b217643dd92adb191a8a331223c2cac05e980b2b721ff7b9a0eb8e0504a120202952386c079301d683ad8a8ae28cfcade80ca4976bc912cd025923d89615b241b227cec8d7995d5926ac8f45627ba0e860ae294948af1f71c6b50d4a02514b487bc599a989b1ada0d88cb0aee0a3cdd0f35fa0c0feb207e89abe760c692a1dbf43ed181c389a100d375c2673b6a99439ebb403a1d9e9cb13d8ffa5bd6c34a11d002d7f6e3bad243da310929e3368f95bf3010d8d183ae28d6f1a74f41ab9e386225b87964f2306a6481ecadf881a2025e0ea11f2d178faf4cc091c3dc461d24cd58cd43db4e1d3feae16970a1d4755bcc9b4cff71883a692863207fdf89c04a57670c6b0c6b03eccb3e8fae91acad65092ce526e81a5a43834fdddfd805b7a541d3d945ae6ad1381c81e8ae8d94376d148ef4c6f1c7a080fe9cb0df044a2f37a05b15b83db7bc3edf18e1dc1c598ddf5e8fa5cb4dfc7d7c155381f9f025e831f136518a752e1a6d1b367ca7833faa4d56299b671ddf53e5ca2429a3ba154565852346ab4b8bcd8807910fbd79c0b9d0b37e7c6c7c5c474939565acc9626101e680b825cebdd0e1801cd194295a1204047459588037b71ac255385f81e20de7e28eacb5f685b736062bf3d65a6bc3b7d6c6fe5b6bad85796b5536bfb5d65af0adadb12e6fadb5b6e5ada5c1da786badb52f6fad0e9b7a6badb52c6fed0cb6c65b6bada5f1d60ac0a2de5a6bede9ad0d805d796badb52a6f2d8d35bdb5d6daedadcd615f2eb1d6ca2300b0d65a6b676ce92d7e6badb538acb5d65aeead0cd65a1b63adf7d65a6b1f756bb02edc80c1465543838e190410009a1c0098c121c30b312fc4c4a02213c2f0c28d18174e0ff3a60cbefe05f32ab9742d9bcbd6b26dd806f7b26d9bcbd6c2fa521bcbeac7aedeab4123c57251383859d4a95bc1810a8ac599ecb6fab1abd56a9338c0557b659bbf747d79eb286b6db9a4618cdd7219cd3c63ccb336f36b33d79ed777a4a9baf9fa5632914238e05c4d99ea8a37f3c755f34595d0259489be4f7dbc26e6efd324220ee591f94d65a0efd324f126fcfb74c75574b55ad19e0bc315220efda9f93db390146f608c5c4559ac231614569422afb1d145c4a14334fc9e4970126fc02057d1564ba8d56a112df19a8f22e2d0231dbfa70ef4fd09146f5afed22c89beaff93395e8fbb3c76b6afcfdb98288537966f83d89d0f705c95575b54a5acd9dd55c41f11a1701fcf6315ef186a589ab2a8be58465c43a6a79cd8a1611a70e05e0b7036128ded060b9aab65a40ada09bfafb3e8388538f687efb12fabefbc49bd3dfd7cb87f02349f4cdb410712c4f8edf728a9478a3e272955dad5e2ba48bf222e2d81f00fc965fe8fbb228ded8bf96c51a6235b9f3ef4b29228e1d9239eacc6f3985be2f97c41bd3df97485c655b2de9d3625d1cbfe511fabe2c22e2d82322aeb25264b8cf818883f1fc7d1ebc66fbfb3af1067b61d77d1c5c85c5f03b0e41dfcf8938d88fcc513f0eb176e8d0f771b80a63dde035dadfff116fe8df0fbdc6fb0b83be9f7f4f7dff46c4c18662e28dfffdcc55586bcad4bf4f65c4c18e648efaf763bcf9fefe0bb7862ba4e96aaa38a02953df85d58dd58fc4e194d4fcb0a68a5b51168b35247138160d43ba6eaf57ebd57ad12389c3f1e8a047ba3e7d4dd5d66ad1578bbe5af4c52371b6a319785653b5b1582bd68ab50d09e047d76dc55ab158431267fb09c090aedaebd57ab55e2d5dbf1e499c8d87a61ee9aab55af5d5aaaf567df1481ced2807cf6aaa34166bc55ab1563f12471b02c08faeda8ac5620d491ced6766a83555d9ebd57ab55e471247e3c1618f74cd5a2dfb6ad9178fc4c98e64e0594d55c662ad582bd6ea47e2644331fcb0a62a5b652b56b662e9fad890c4c97ee40b43ba625986b196ae1f037247471227e3913968ce2f93b7d79fe1070310a7e4857c23bb903350fd1b309e0d6ec5e258ba7e0c78ffc5f1c0bc6cbc5e1c8faeef424b57a375d4d2aad16a1de9faf98573d958432d1babc6c6da5843ba3ec8b2ad6cabed87655bad6cabbbadea3f0d2df5da78585e2baffbda78747d985396b58e5ab795b58e747d1b2a184a630d9d34d6d558196b48d77fb1766ada8fb6d256daea47d77731d552f6d278ba9dd7eba5f14c2d9560aaf72cca5a4759ab355b47ba3eb7b560d24857230f594319ceaca11a747e9d9268f5f33b45b355967f5c735e0a733d347c087b65012baff2a8d3cbc7e135a6974fe335a597f8a5773beee5df80430e3a48c0553fa5e61788a669423b3c944853e5021286b9902550ce71ca6019b3f12d36be85be0fbd744ac7d61091e668f702c2fc04b57f107c0a32f1f5adfdae7b0fbcff7d2514787a1510f52ba04a0a64791a60ea6b8034dec11adf02c23c0f97402fbf531a04651497c19ede1e9886794934ffb1f92fd9256fdc925b409897ba46b6026f89e449dabffc9e43367e4f2db4cbef890409f6dc0b28b50db0071e5adee5e90562e35b7edaf896e7bc7bb1c1c6b73c0f7f69017d90fae55d8a4f1e186ff1243c553b44197fa424df710123cd3c7c01ab76016bd0be059451640dec69609f029dc743ec59405f813e8487d8ab80de8302fd043a124f023a06fdc743ec3fd059ae0474200fb1ef822ce84c847cc8c3d683dec4dd49e649b3c86bb4d7f4b30ec480874e35a5f5b7a460d4b61a6447d5dca97f75ea1da5ee6ee447ee49424340b5761e1578673ea84b5046f1f03dc9a520798821cd6ce364d41805ed6dc932a9c3430f31f9f204c69e8ba5ce439abd443a22cd882a3ce515de88c682a0d8951ffd7aa6a125170f2bc6bd44925192e28df6d8cb2bd48895521e625fab7cad071eb46bd1865a310ca3e12f550069ecb91f519522c280045c65faad03470bbbf101efe0116b684da5894f8088e3542bd1d8fb8f87dc739cb53e7afbbb7db7bd9765f73ffcfe53def72ca5f4dd7fb4f657d3de3ba2b39f42403a5b82287ba7c18e7e21a4eedaee72d78e942694f5457bb6660f862306e5ae9b679773fe2cc7dc7017977539e6e6c020432917eee7ae14ba3389a66ae5b19944c3d34ead643f52c9192a7b147ccad9ef6ce3ee7ddff0b66ddef6dfe645d7b6bdcdb66ddbb66ddb76e302d9ba6ddbbeedbbee7639c75c201b9777f660bc40fcc36e82f439b06ea0d45036894dd9f9ce2a08f0677074169c439389cbf8640105cd24620eec2b387fc0e9e361923883bd064e247ee42f19680c8acb607fa4688828ae39b5a9cdd99a5a9b32d86bdacb88335b3207f6dac778d3bde67d0f9ff6de9febbce67714e27eefd0710f40dfa7f9eee3fb7db1a8752f8ebe3f8078df26de741fd27c987a9cbaf7defb7dbe40ee77efc5d8f71bff07737370f641ead286fd737777777777777fb935b80752c043ec8776740c3ab6b270a2b9994e824e34f39c5eddb5a9f6bf407cba7b8dae1a14f4239a8ea69335ccdaca3205606e8ecc3e485df30e18787913c2e0bab93353d38f5c41b3457952499c1ea14368eca71622f6534abce95e25897ccf295ee318941486ede9e47ef6dbfb0c7be904e79d51c0867f16247b6f864e08954e64148dbd7f8ce22116639ea193e0d41b182591a671af6d1af7b2bd36a4b7f7e76a3a09ce0ce354f83030eeeeee33471b17087d7fb936b8a624924444be93612c89249196399bae08e57289414ad2180dd55cd3b4cc6bb6ad87b6651f86548791c65ec7cdb9a1a5130fb19713604e4767b137817207a4600577104204eb0bc419ec2b1073603435553aee72974b4a6332cb1e969b33b344c2b97d1b8913ed267124e035f4fde57219ec67b6652e2ec7a3d7cacdb1592cd1aa6eb3139c3aeb3a4def01cc49345b8e697dd36f9ad3ef10f5fb5556587efe00224edc387a3e0b385b2e83c9a860544a46066b34b41dad4ffbf9dbdbb3857db77273bcec83d49ff6a90b44fb9b7d90da5d1e62db5d44361a7b9a2fb2ac69da7d1fa8cebe874f676f9f8b794ef0650b3cffe88d7c429a0f538fb19f1fe7ecfe02d9f28e39b38cf9a1d3b3a4484af119f2d710404e92986e0d36031f758164591ec9db5f22f1913ef3b7fdb9c33341d9e321f6a59b633d1b9a897df89f4a61dc7ae101b62fb9e724ebbd096dba40b2f7eeb1973f9255f2e6c538950abbd99aad56f6dd6fff2ecb9e9bbd9be3d907c971a044b25120ce60cfc37dc779bc863e863d67bb1dd810529398a4314cae3416856cbc46fbf8344ab8b4ce267106fb09ce9687d8bf5081ed4b4c461957bcc91efba741a3549a9eb74e8c6ef1816aff1e3eedd9679f79cdce9ecbddf6c737677bcf41b82c9164591e71d9237bbc267b0c49e659269d5060aa6c5cc65f286b61222debd137e7be671f648fcc3f033d9088d43763e0fa74a00e7003370dda775c9f2d9bf8f1f191401ac3b0ce779cc7572f5c1b3637310dd3dc35c11db6171be0d9c4672bde448df9088273102eefe021f644a4de3206688c3005bc667bec31b083d748220f311dda965e684c3a913e53a5c365fc776443b849cac9632f89fcbbcc5d52318f3d57d36dd504e2c087ac07a9b3a7992a3f7219ec312c8ac63097a2318c8708c3fc6dce3cc45e088d1a7b97c6b69b33b30f5267197b88bde7ce432c06cb412810e74460605fda97f6e57f174bf468b1d2f35f7ec05c144d9d529ddb23fb58e5f69203ec3f99b84a22314a39c14d26fd3945bc51624a11713c89cc419f664f7f2e893775aa3cc995d22420418e59294666f7f1707bd2bd0bb83747be7773e4db6c335077732468c15df5b4d6661c1ece4cc1091465e80769429ace96bf74f7c9ce8a590a9c14347dbce6c7559ed7d88f3a88f4a0ed29a745bce9ee77f2e62efb4beaed2e40fe96efaf97481e42f12497e2329e844d179274e9d3e58a026f4fd2ae57793f5df3c86526509cda039a2a2f034d8c676afe87312fc141dce5217d2292fef622cae335db8b34a5ab7813551e3465e80b416945a1f469c0c0db8bbc28ba3c7a74f7a08f994d98e4dcd073894705f6e7e63cf2906ecaa3e97ba4d31567e807e120f389c8a4e9e33b5e13c43fc9a5780d4fbcc19efe4441bcd99efb6d7b0b6e2e6fe92fcd81dbdf5f37c71d8a87f4fd250abc1d48534adf5f0e65fe64024e210fe9a44253cf73c93c72fbd2255d7b767389d337fa98940b46753feee3588f6c69fa0ee43594fe10288fc81e0d9c41e0049a4be20c7d99345593897b128933a58839e83b4935c1944e1167e86f5742d3e7689ae0357b4e57bc0923def807992fb0874fbf7d6def02fc65174bf878e72e7fce2c8fd86e6bda39e954f678487f1a790d0e0ffda72bfc1476d1ff23bce7cb97f428dec4296717238d2b7784d07a00e7d14ee3a19c59d6f4609f87a7048c05e921c80e7ffa58487d8633f510082e626d2b8eb484a7fd1db1a52da519bce1477dfab4f628a22bfde135914604a34c9c60a4128b39524a69a458a6482f46a4773e27ad5347daca6247bffd1f5e63eda76696a528d882d19081e94f2c12d52db867ba844af9cf1863a432888b311c9dcfc509c6cd692fa23dd34c63d3011b1d849b3fb8484bd843d4ef58145f7b1de28d7d93fc127ed1f23f2fcac8bf8f3a819987b48b33dd4f1006fd3aa5ef7fe0cd42a4ee72ca45c746c7f086d6410ab8be0c22de046db944d7af16dc34537a9cd37a54472d97481eaf0947a0d47f13029a6f844ec57c042ec69b180930699435150363a452d34ccfec4a5419a2c0f14950a3fd8ed6ce39b1d20c70c478cc19a7cc3a5dab86338b19f63c3cc618e3670f33b5a555eb843a7a18670da4bb8b87f29d3a75f748edb5e1d3d4517ace1f70f169adb556d9050884e56f5cb7c45e6252caad43df8a6a7f827166945297506cad59866173d65a6dad5698224e4a33fbf2b10cc3b09c9969a55da61915a2cc6ced30bf019685493b40a383ccefba29b3d7a1f1973230f651bb06663a4e557681f820b5cc34778046d74c732633e92ae08470d4f3b7ce268482983bb009592987b89af6368cb0f63ca6966d1e25f328d8d6f1287366990d59963d9681366a6c4e3338ce5f8e94fd452995944eec5252da7533fb8f74251473697f162a82fcd629c1107a66372b95b2f3cce0902106991b607621c606ccb7b8bcb0a468d45851419d4c2500cce0902106991b312e64f0616cbcb8b4d4a091625951419d4ca50980ad83c120f2a92c65fa251b46583e279dc86b705e2903cbc71fa31777c28f30bc4044e4e18e279d814def3b1efa3b8f87315c81b72769af35c338b2187ee3fcdb8626fc17b00e53196885a68cab6cf6e29e4463abb1b56c3b1b0bb7c2a9703e53c63ba129e3df3d75026fffd1f2ef57211e2d7f889d1dd1f267f2c649b47c1c594846d1f263a82e99ac44cb0ff3ce60c81b33d1f25fc83b35a4e5dfc8fb63f20ee5bb90378d91969ff3b6d1dbee687f2b34e583796747b4fccf1bc358d754edd8c83b25ff256fec625d4db4fc96bcb31a79631a79a7740a8c3e422c79a7a47c95bc332da58ca2776afb117dc1ed9d27ed98a1a32d797eb63ce2d14e1484cdc89627b8cc6b82d0a760901989b4f69c1664cebca5265d6ad87c1fd8b42fc139354dd389441a7b7fcc06edb79f20a781ceb5d8301f7b1f93cb5b7b1f24f645b47dcd3e8f89c93a37597b3c800525645046144f9238627d6e582ce89982c48b750259bf98018a271c11a28a27a078c27c81075440e485113ef0c10f4d581908f1338a40018429bc605544153428432e2104139e782186148a68c04406118b26a09cc1ea01909128cc203c5a41159a4c31638a2425844c01c2c918647c2146154ea86248102b6001175888a20a3292309718b28218745105245ef418995c082992833384f0842d9e28e287212401658a14422c71042e8c9c90644864c21856c0c0084f4c114612720657b002094124f9a000480b48cc1f86382144851122a420841196e058902189229a58a2032a9418828d01154418630c263839c2b5040cea0f428e68c20f5820d1808a319e58248654240c89c010aaf8810b21ae306ac10a760c410ad70d82b0c20c2a0031796480420997100f8448820b90d48842042728b104194801847d0111420070e48814e0200922b68822ad105204a42a3c918112640491c554c1101c4b6c01084514918493266508894a18b20492a32c4871c6121e30ac0b6880851e40218c188cd16a01d5c1901be4608c33be40a28a32640d844c255224ad945082082a0449a10543a810c5055b2821828b1df8e0c8905a54e48a1b208101144318c38926ec114f3c7105142694e1044a8f114354462469c2c80ba2d8b1c2169165f0832410818ba11e2d82008116468cb084154a7005cd1ee000410a404059b2832865f44c200c244b08828827b870c21221a45e31442621e4c50816984811042db290031608f901124251504213284140b02b1822861867a4800a4a60f18217f89421456a5046d0123f419002839d59c4100b9471440d8c70c2063748c20eb1002370418327b89ed8c214130921518a108060853090a0a8c2052a18326330e4fb02690a275853b4e02504088e48e1420a0ea40051c106d14312843084a231c8c8028b79058ac583292e08c2115b2461b55214c5083fa002105238b14008a955e4200420c8a0c2094d40e1029b82280422dce310c701846536e3167aa7b467fed89d02592dbff6445526bf3e902ed2f231954bcbbc89504d7faa6a10512688228a4002893a032d7fd719b0f46a5a3d735dc51999b74e05d252c6e898ebc386b69902c5999a69ce504460f93e9b00390737d00313ab3f8056c12c6f12e8ec2b68f3a67b03d3e506629ca9afb3ccb31ea6ce28c884863d135be6e1daac73fa675f1f7bc7dcb33a97e878b10cb442dc730f98e720f5334dfd1ff3a1e61e30ed7f86c5f649365f4818f6644a77cd39e7943fa704bf9873ce297f4ee960a0b23925cd93d4139f73ce297f4ee9ae39e79c53fa93300be79c7352ea4f422a4497908aa1ef531e61ce39a7fc39a53f9973cee92e776d5ddc00092ed79c73ce297d0973ce39a7f427b3ce25b851d2163ad06ee48a530ed1c008ed492ee95fcc39e7943fa7ec9630e57439e79c534e777faa3db7d820e7131a951b74e1040d6a06249a400165046405165700216946fc0801e9490f10a0c0d3f3a4e525099a42eb49147729494194272eb4062e464d2e1322284d9e6c42318c2c80d8849cd0a8d018f94cc11048381151f7041dc0201265d306088a2547003d29e28ec00324454fb0f85c57fc10b1f82295a5b22991280d8a084222596c8d409813205d017aa1e354548426e8e8f001460f2962042cc38cea0bc80527a8af181a6324793097941ec96381a40f51135a3e79695098c8c1eb897cd1255968225f4f70b0d0200a143a388ce6ca8b00c509e6ea8957220e46d7c50dba70a203239b4671c8e3d0132a44c1702332676ec1c88e1bf922e53a29a3904693272cd1098d885449a47aa16363fa09c2113a36469cc70fc1cece8e111d6fbc02d74f794dd48ff21aaf44266db1417e2622f5cc5b82e1b4f34c64ea9c8c0866033665ca14673d373b0c7031ce89f9a599ba158490de42c14c2600514666074849416f4ca3cbb3f01916a38d25d0506b8760c518466a06aef0594113ac904209260e60a568fb3865716402184144f102244cf8210b298db5e8d8d2a206faead8d20289de585218703146088d280f3d2ab0d4e1218e33f669e83633c218883396021eda7fa1026f4ce511fb41a2110f53c54367031147023247bcc9de3eb6cf65a0744920a908e90b2d7fc7275acaa7b63ed5f6a58f11f7a739d2c41adfc64a31e0118aa651727cee02a139461a297da4a41d5c46b2b4747712cdd0348a81e9eb10bd68cdd9b2d9bf44a22eeaca39d0cf39070f8b3c943f5d53c52308525c266a29049e7c43a691d29ca7c041d57a4d945428eaa178a385cc284ba32ccc522025afedbc82d4fe9e3d09a73e9c49da3593a68a0605bd00e15690d7b896dfa2320805f25052d64ca2ac4f92e24851240d1898b2a8120ac484d7c4555e9646d28987b28987923e47a7140f9368f94e7f531ae4354ca890d7d82050e24df6f22919f146d330706f79cb8c6a6c067928e95bf0a5140fe51462f2ba0a71bd67d2152616a48abaa6cceb074985d0921aa1e58eee616e61c73555948a28231f0b2d3f081449cb236899a4e57397066901cb20ea925f79bc66cf20ed3a4ae2a357d26390d730993f9dcca279042da5243569c54894774e24fdfaf2e712c96408a157e8faa21491965ef3136fa28e519858a2e34f1a17a640e27f8b0d5207a1ef72884c0429de24f19aa869a5914a2a773ca4f4a9a6d123f5387f561bc4a70e71263e954bb494ac2d595a7ae08783de3a91284bff13784f821ecff346b0925909878798fced33694ad9c1c1c31867fdfb1b86d8a57ca6f4992d2418360c72a73696122925f70d0d0aa97a675ad68ce3b405de72455d2e235f621c94d2f7a1ae982357792ffd6713979eef81ef319b42d1f27b709841e34f1ca4c77828a5fb739148269138f3e90433990387d68e42299b9a71c821ded08cba8e33be8be85a3395348a6b5ea3b97c84794d83d17ed36076c05ece24aff19246ea5902a620a8a4cc3785490d159508000000b315000030100c870362a1683452044da50714000f7aa0506a521909645110e420a48c310800430000000000008054918d02fed4e83671a449810d034177ffb9ed4b84e3831788131bcd44207a2f8e34143850c146d3913014a0be075dfa3d8ab48f435d1b4185cea710c7dbb995f18b542bb4315dcf0f96934e162610eb8fa34b81ac99f48b51150013ef9fe82d69ba200f413295484b1b76173ece753f5f072d653211fd03e30885e67145a1390dbe31508aade13cbd836ab51f2a27c9caf1c9215dd4e8d2fb4c4918eaf5e13d50cc48a2415b174fa8619e5a6b15072d64abbdad0d82b253e9fb0dc51b81a4358841d6cc1c9a0d99564092d6c0fc2c83ced4a033c8d7f3c19f12c36f391948049e47cd2d53351a2b9ad860a7c13090bc551025e87d728fff34eae1724d5ec3efff12583b8fef0929e92ed3e191784075f3b82391bc0bbea57d9d126f892326d158ec1e1dd6838f2c7541467a8e4aecabe3456f3fa130d541511cf5138d886f6aa9a32cf6819e0f2ca31cfb579abb20f0558314b24740a0f63407438897b730a2ada5044f7979236551938612028e8526d81a9d8140b873887a6612f8ca8460a181c3a7ca219f4bdd107834cf898fb4544b374edbd6e132bf65d97d64e139acd6de9ed9d4ea8ce33c706d00ca1f99415f3dd1519c11b1407637d4b169f57498e1fa704822fc6982e2160e27fe8b3a4dc615aed9ef300f1529568b293a429c15a893628c422267666fc0c8df00f8222a5faefc7df8e6189d7d7e72ec844e23b2071f81bd5d918215b7e009a712550109a161e5c8505416471a41645b70a6bb64424ed5398b001b0706c69c13a45cf42dc92b0d23000cc992170543152e2f010084d8dea8cecd8cdc2a1b95c71a1b0f322219475d68169b1908a88a3f61d61b42a5d227ea586f08b36f9121161807c1988700cbc3528822218c41a2404be583b72a8b617d409dc43a0d72b6291069e117fbd86f38c3147ea37dea593c3fd7484e178337200a5b7b26f81d241a1f85e16d5592af02a43c9d807f71b4eead6a8e0e740593636a99247d123313cafc9367ce3785d42a0a131073c9c8fb8137c71fd96422a6f137cc8454d9378bbe3de7c48f44981da7b8855157fcc73bc858e290a2fb1877df4d1bd6c437eb0c4a7c3b5a6610a75cb0db576904d88e6c43bd4b9be4899019055790a635089de70eb524f197837419ae04e640b91db42e72757623f75ab0d14eb6dd720a7d83913ec741399e9c34a88a06e641f3f673a7f5449f66cc9a6d70460185738cdd0fee9d2e722e0b116e9039b645b7779645baae0f04463f92ebd1fa3e7111cff7eb124b2ae6081f71a4eaf562f77645c2805d7b310c85a0edc779fca604720a4b19a71e00edb19aa38702eb6bc5842ac55f3c00c897a878783c28a6c271236e09687ab006b261879bd6580391de8c0b2decea1d6da13a920e5b38c661a3065bfb7fb3b161716f592e82cec5a181e4c5f3b5df9ac63d703e8f2463e778b1e844b06ff62d7e90aa68e77df1a78534792d3213c0fde12c58182f8270732a5009d5a6da63c998e67cd4e1cb316ca9152432422ce6c5254f9149acc609933681c223dbe2a436433b04f94bc62b47ef33d2dee4f8544cb6aa8f65a648902b921a350a4235129475d027f5309e8aae38e3293bfa5748475d1928a0151cc3c59f10f6515f3b2ac829530bbef65e332392b36249243793eacf69612a785bb5dd1ad5d46caece8e65cc56d26079026f4965f6ade9bf17249eaede84c33c699b2fd28aca694d562a63765e2b8e73a3c50d697914eb1980ccb07d191b7dc2f4d468372e85045c2ddfdceaaedaa3945c9fb91a938339367b62234b31f755b123185d2d61f8c08f30e77ddaed4ccaa833af8846cc7fc4c60aab645f5aa51d6e6305eb5881bdd292763a88f558633556f818d7fcc66332139868eed6487cd070dbafa1e3ad9175f83a5393dd48a037b26f1f84e2b731b227f048da399f485c57dcf37b491f28f1b40c8816b0410c8b7e5d85776eb8d4ca8e0f68c8b1b086a5ef8778ed7191ee725663c5bef209f11446089fd8baa50c453bed8ce2f8d4e5f79d65575d3fabe51de09645804a06ff6d115529502521f68d92666c4725f603048bb4bf095006b1a9003b5bdadb59467e325e70f3ec65ed77bc940d992149413dc00caa95d1ae978dad897309ba03a2d98e43a965ec0da88f323d820ec39c9438ced9416343e6d7f07bc9f0ce086a9fad24616c0e214c135e62edfa985c29acf8432c0c030d76b1ee5f99b1ab628bdb2c04d9811f26101099000c830ff11e75e4e2f6a05c2fc8b6fb9048f0e78f8462b7ad41b23e43cfa10d22d017db67335975bde2b027a25ff01905128de693537d0fd469339209e60e92a84a6237a33bc013afecd93261589292df39081e0b95b6865eba9689a1804c894479ebbbfe83f619bb15529d022f8dd52c4b6eda3de7e27ff50c276df571870e42a155db564fed6244110b262c3205d38f9e2ba66978b177ab0f30c1d9d8f8bfea6fbf5c31d98da6d2c1935403d366f29038b34af5230336abcfe02151b84995bc8893d41e25645bdf01771e2a724340eb1bd9f3a362f5d0fa284caa60d55ecf5cdbd34b7e205cdbe121111ab97914032385deeef405f8254777b9eeb078c2f178819633b664c4577ed2495fca9a17a58a85eef82d0769beeab3de9b5e477730b987752c20dc55b5a23a4b5eea8952d192ce5d4ead7c641eddafddcf0b1eabbe677e3fda01c0a94bf39a31649eccadcbdc5a8789d56ae5bb19699c780d6bd8968b8d099942854fd06f6c913ba106ed56c5e59a4ce2b83b0b7cef74f1beb80466027d55a870b7219ffd3994e6713cfb6368b780aa00977d972baa298080832d2906ac90c6ff0a03343b07363bfca546799b1277be2b80b25cdb9550a77037e5329a5a2a8d5086c19d6c638a68af76a9b7c98d623d19c79e7bdab9eeb328b219d0b44817fb58d0464d86db9b5ba3e555c02cce29cf655142ec335c152663e4cd1a1452c82e70ba338a2f373a89125cb3b6665a32389342fd2d14c5bf32845f0899df839ff3ea1eceff7690a69c4b42f975f9c3ce7f527141f068d0332954b174fb1458af62f523904627c5e32350cbbfc8f5f106c15c97fc47ea5518b6e01601c4b90280ba5e46b389348c7a1d14196f875931d12fd4471187071d6ea4d57ef17a591308307eae524abfc0eaa74ba456f7e550321f9eed30ff85499a22cc1b6d40e57cfc23ffd75e88b6535c0e4ffa3c3e4cf573202c3f180aa05de0fac1a45f87b0dfbbc8346784e62d2df1cb7c3d34c65a4792ae29f0b2fb9091d54b41ae97fcb3917b16cdaa28077cd94a626415b0954a8a7f9a08275f164ad1933e5c10e0f369c066e2f444fdaf6815787a38ff439a8fc0dbfb4232f2b993644c7149a839fdda0f9968ed65361867aad596a55c66d2ee5a263cb898e8312ef85b31a99906663fb20b08887fbb1c0e46ac98eeabc33cbe8608f9825d1814fec15d0f894f046efa704cfcaf605781b7e9304e9ed672771e354f96f3e7a99571ffb3e398e59a15a589d1b5e8f2c62b4dca3b7248ccbcb7e9c303c18eea9ce9b3faf1f37c6e1dde165575592fffebb71e8d1b45ba7f36d9cfd6cd8adcd35ca476454b01275d751a4f56464124951cc53f8b2662457e1bcc52da0537a1fc74499beec389ab10a3e9f968aa247a1c91dd111db452dbf218996768d9aad2e71266679f5e2edf0b5cff9af01376a2851571ddf4f5cf7dc85d4e0b7695cd258f010935663d3828b75ada1b60035e2bfe199157d6c27d90b6419db800dd5626baf3c81ecf72a51132690fe3794e4b44273f3f7b1d696aa98b921afadf92580716d33fd7b994036dee37c31644f8ad9574341b5112312cc1aa9b3eafe77cc26d2e89589d05c21abc6018db1253c46b7d88aecad6a79018fe342f10958afafc08443e510a107b79f5600f814ecf1222be295ee45e233e3d9513e4da3a2c120ecb6385298946e2c08d955e8b594bbd633b406b13084f0a9f699e55bc88aee5d44a6ae2deeeed27490ec8b1a1a37a4f740dd01adac8162a158bf61053c58bc0d915bbf5c58b6c018ec711168ec76c04ca0151d3a0adaf5c43ca8df5a71674e8975a2d968bf42dea1d5b8726fc308064a6b680b2bd1ae224104caeb0eed0f17371e47b229f7e9d281a1c1a0fac69df4b4b1d08748f592b2d1f0a83090eae442fd86a710e4f8e5953485b886b7ca63e4d762bcbfff53f7d99402674de272a0a75f3f49550c263e36c508ed692e69566694a4f074baa3c165f1d3a139a243fbe4b52ea96bd39f04d57b4d25fe67e72c9dba9445389f12ef96d94de700ef78048ee71ec0785b00430a3a09fa4dd321c2431101adb89dbe46118831d21ca3e57e5fa89521ac9e3fcdd7b929ea1e027bf0ac0097afa49ba565b45d9ecaf6bf3fa82433ff13a20a4e8f998add1fa5865af83bdf6d50118eb6d41afb24ab1e27d0ee268ab7840045ce5aa0d8b4e1ba321df388bdd00522ba682b4cdca7872867aa9cee35b50036db071814e7db786f76f402bb1c049bbd1a32da47158ebc923cbf23f80e07c00a808161c7624d8ad3d26ae0c3cec06126c165d8e93e0855272a1d5448a0ab9ca2fb90bfb4ca4106c000d2d4b3f88e27fea600e4d47317d02a718d9fc92c57e436c4a6f5a1700530e4ed0604cc31aeac8a6e12d5381e5841e51017da6fdf611aa2c8116caa1345d0ba24de2187b2b10dd9694050a0cc598048971ba4316fb13e358599b09dc4ed81b01b6aed0e96145098dde2e915a4d58b05e00acfe5f21416ea8de3864436b7a5563877972e89a9e2242230fa186fa4d3f160a4f045dd333e7aad8931a8a862541a1de081e2b2c116fac6f18b1bb7b604147ab909e3f031be5724cddca5025e226456c129d6e621c5fe7500b2c7a85167c280a5a4f7bb825d72f6a7a194940cf706ea8eea67a2a2c98073754e58aa2bf2d42e8e79369572211e987dad16af0dc24e330d10c4defe67b8a1e1f1a955ef66b095242a14b447a0e9be0707d34813a37ef7c2b57138ce21fe265a1aff4e4563f12f32abb05014c90e15e3e68f7e386b87aef0b502853f452fac9410b45211992a86024c275b352e96e9f03e56859cf1cbe600332154facb9c9b10ef564a8d1931e072b472c250b340d7b7aee05016ece8650617b834115cedf94bcd0f45e4d036ad67c57a74e2d6d03059eafa565c0400945186a8f8ed82d14c53a2115b62e9eda4aa947f8f90d22bf21d0d46f03ca357d323112907eb56e110cfd43d2607ad74bf4f70d5b5c5682a68ea6a95cc6c8a0532c29a7905be265e7ca0d4ee7255ecc331be1272b3738cb5d78490790420bf051bcfb07f0940e5535f36f3c45699dd1e7c13562aa7c8f7f9ad502be7ef203900f39f2b1e10f7f05c24581c72dbee0fcce2811b3c8812af3a298afaa93523de8b55799a52ea45ba16f4556fe2a5880fd2fdc969f39bdcf15639bd35ec20d7d0c81aeb4fb87ec1873ee45ae24062c3777fd27f6880b75a3cdd2ac4922f23d123b1e3c53a7202f60e2a82be53e602be3f0f6dbfa373ab6dcd262a85ffc74202dea7e83b3e8ef0304b0f438656f0bfcdc0a72c8cf19a4c07c51eaf6ddb1455975cfc06fe15602ff0fb646363ef24ae70ea95c5e0be9d447767231c4bfc2c07c18168a5c30685755b7ac375e2d70492192f00803f1bdb531e2f1f08b3290ab94cd6846e46ea9d5b3e3b22592d46bcdacd64b7b5982fa328471e86d85b9604b5b2ca30a23359f102eea3b97f80cf160cd515e5e48d2e5fa2f4f6e23eb2d1e46851805faa007815e78a25f3f2355d5c26980792a6029094ef64da4d1e0c8221421d1850f68f2a2406e24ed11ba8d1e52cd1e247540e040538cd6ae0484101f4d9321505990a7fc451d251f1b38567b793784400104b99941b728ce410fe934f6e60136e9a71990cf60890921aad12e081fc0114063f657e4aaa5be0ff1af832dfb381412777e011d2cb08a8d0d0894e9e362f356568e300152f726781a246bcc5717084d53c620033254d705d86875084a1eb6d17d353ac2fa93ade010aa9081c6152c65dc1217157c3ccc1571712ae4615106c022d883eeb87b283740ff5024cc8d41a013d17981c8420c7dc21e5a151dffc316597c0e626cffb4ea15b27158decc3b30bb70d87e22c0f4c16e71de5433d70d6abd57a9f6ac4c5fa0f2f17339188e66e796f1eb23af950d296771b0842c847ef3437505bb98e0dda3dfa338868ce46c8a2d2d2fec4e7a9e91c13c4174c626550116455ccf7a79f2eb7a986b8cf081c27a48da6c8081cffa4c2948c4abdac1ac521080760e3d3c7f416216a4cd0c0614885f83c9b50ce8df7d6758fdd89efd05ae87eb2fdc64602d541953890f264c1a0882dd125549f226cd81b09eb6193c864446c8cf841c6492ca48083fdb73151e8c529f71636e40055ae31fda0096d68a2eb3abd15a116ca3776676c07f33989a3e4dfd0380726b65243f439a199d0844046ebbe8c4ca0cf8254388b176a7d804e30213fc880556f02021f6009169b0656ce7b98f0a6ebbf89508ab2ab8a4dd01940de19074b0cc475128450e7bd9119e20251468d577f217cc48080c0314687772fa7813b9eb52e47f608d1c085cf4acf720f17d57d7fb60cb10b5c2e0a6d2eadc5747164523861e8570582c29be8ce038e2812cf117cb469a1e6b1930f562a603910927432cc86f05aa3948ffc8c79bd36d1a0a15e32660e66c0037110a12537f9b789ced5db7e4add0c25a342fd95b78c507e6b6f1967cd76155fa4399420add22ddce27a18a5a7a80368eb45a0738b5ce083bf31d038e580ea4b4e29f6eab422b4b19adb2adae0a3de4b865f45007c8c79d6d1b02d7c88860fbb0c0b8609af9037c4c9521bed2feb6334fa394f4980159ece328ab6695eddc7b9727a4bb89fcae4629c531def8b0e44b627f40f6177014841de036fca456f9baac5b0e69a5ae62ad17699ecadadf4dec9b82147c4b0f3592e1247f1be0664ce31eb58f21613d95a3e3e9fd6473900c604bc4cfc578315999f5398046dec7c49d6c98ed38b0b1f365dc97566f3ac5161c1abbbdde36b18726c5a7ec00fea2b4f3c1e8db4ea559743c37d783d1b030faabbfd39ecc6d75911a2bd7701927674227dce843c68bfe8352090ad70c781a2b1cd3dbcfddf2b76efa6b89bdcff6282c9d777d74e63b61176869938a0227eed112f34c818582a3b4eff30f57e09dfb02a6feef5c5714f8916d76791269baf8396686259c45a717055a3fc93b44172c5fc45587776c04f4f3fab9afb1b5cbba0e108d07f9a4ab0bb42febca5d467781e7ba3462b43765c6b8493b28125415f0005d47d5e1cdcd70cb60f5e08f8adea5e04a99841e6be0108a538ed0e67e14d3b61e5451095bb1c5b16fca7f77aa3d59acd66a745f8c838ef739c7e77ddff5bfc3a5b592be05de6ba4bc39e80bbbea96f5cf634cf99d2ff59886ec3e2890892e0746e5095fc02ca04fb63a141bb7accb381a16bd479e5cd2981c7b182d2aace81858b52f0e44246c21d045b87f83b2a691a0ac9b02a13713066a7e9e5df0f3e3f0b1b1833073a56c4118c30a090d760bbfe9e535c542cde0a9732576071bfca69cc2e0c9333a7c8217ba259743046e15a2d2b2be49958cc3f72ce3f66055ec4c98b51b8b282a8e54fb60a125f0dd92d253119f62e86035aa2ee1756ab41e678d0c3fc9951879d4a2c23a22f3b0f9d2408c8a980f0f3bce22123264bfa01a30c882940c2b10481b55d176d5ab99a6a9ad957001dd62d744ebae50a30f3ca1a7d27c2742cd0536c4c411b20879e63d9022338caf85f0e92c33b5c3ba351128256e822138088739ec111fe01309890c64a3e5e27f1eb0821ab3048401b4f55dfa01ef6352c28b8b657b5045c7ae5b18d490343204f75e6dc06fa5897721fdcd7a2a541c17602ee58997ba13a621a479cb17fc6d40d80e187bfe4651b66e66b73e6ffeeb5aa6f31036f7de263b56f95bc6800f6a123a12225587d761b35eafe75c057110edad59aba5322f40c3f3fcd87ec9109ba55d86208229bf927009829e2f95a4d8e1f8304299791a256f16a7b0829ef42f02df50d812068e415ff422f637880e8182e5890bd080f1813edb7778ad6c0a8ac3d40fb6aca13c5586bcdc90e28394163fb236eeaec3a23c8baa4d3825943439f3f8300c7552f24497e1bea2b156e5e06228778ce5f1df0138c2a644cfaf01a52743adfd61d27e5a4308a1b9600e1744a82a59232d163aca5f95c2b7dec7dc6d020aeca3df9160bfa00cfbd8d7594fd57a94b234097783ef39fcb100654bbe787fade872655467916098a7c3ecb5a0edf43d37cd582e210d0baf30925ee41a109a7f1c607b6e0a29d87b45b541678c42722edd2a5290d47b737cbe24bee884f5ea691185412a3a0fa074660b4c89c48a428496dd1bf510503a510100ded81e193420f023f4884777e0e856eed055741467af3ae8d5fe4f39e9285dcf59509231cf6ee0ed3e0d15485106cbc7c64eef6d11fc04edf95c8dfd6f00368d7e9ce0019aed2b82c120313f60ead9923acf409ddd6343a3e1c814d7ecbc4f792fa93287d7d8f7374f498cfd8154b91602527729c55920921a34d589dc6a414e6f119b2b52082930b9794e98873c4369892c90ee7510f7c6ce611d1f4422cf5d77fd8746578339abc04e9e4a9a6e053c210b90c683610d663bec8143a488a5af0924c74877c36b7f21a1ad51797b84bb11cf40d5ad3e608e5e7b21a67037f51ba75f6d90e7b31c0744507d77c2dc8a5baf9e4ab0fcafa153d0e5b49eab3900367b0fc6f4b821bdcd3982818bad4a2481b5d4ac47eb497c1dada94c9a0aabbe420df486a119eb6144ecfcb392585cb129ec0986f52be4e0007c52265313acbed82af4f6f0bd4f6025049c28e5d3830366c6305a71ca0b1a05152021b77020dce1c76900e6732016598914bbdfa4253e022af5751130b7e9ba86d30ef79ffd3681e3436cec5787b40ced5df4f93f611415abe848e14fa19b229dbb5ba450696f9db0dd57cd5466400530785794bacdf914b2ada2fa7891eb9c6ff9eef03a0fe473a23a3015e02b7313cafa893f6f640a0f75fe46457f5110c786518ff010de0d8c75781d6ecb8bcee934048f59ca9773940479be716a266ae57f5f221822aaade2f402e64b5a6cc2160b4ed33ae0aa493a68d255fbb388a405f10099e40070373396c5f4d6bff911495d6d12d33a1cfe92759d44d0cc6d11d837c93ab2318cbbeb184138739023b1c19addc391d9787bea68182717923b3422f49c6e6a79abc15e57c6dcefac01a919ddcb947e6f8c118e4e46dcbe23cd6cd136a4c5707f1f1fb660e9015bda639fad83031b41840386b2e8ef6b4b64169f4db409f2f6082a0bc43028eec12f1922b128788af062117ee0136749e82ab0431705fd1ceb7667b7a1b8fb6a24e1a062245a7fbe18b46d06980ea45a1b5f765541ca411fc6e95e72f06d6d3dbd3104cff0d1dfda0edc6d04ee2d542ba7e280fa424b1a7e686d9062cc95d421f6c8bac95389441a5ac2e1af4d550c24ca4aa2f32c09d4c080fc25dd6a33fbdc15d003746ed827c1cd0ac8ad54e1c12f40059fb8b8e54c0fba89a2ab9d3e16a02f2f87f12cfcae65b62392b6f1d90408a3e4189e5ba1b78ab8934ceb03778746b2ae1bc801ca259e5c38dd3e7c80b9c87d8c848eb1d4df969b0395711bfa4a8c1a7dff432eaf1ccd62001612a485b86f7fda2e9d96ae24cd2ced61863ef7baea060bcdc0764cde85fbfc0ca8db208b0f4c1a1d999370a84073e6f6c0fdd8e8f8abadf6b338724a4a755ff7bf7fd9fbed2e3b0d4ee9544dea9356822a746b706c67b4a7385a38ca520cf82f44ca22e3f022fecd5b2178a132002faee5adfb3d3b2d8ad0f4060f05cc31ffacff119d7abe807ced1a3203ec0bebb72874d6158d2d298f8198d76607ab2fbc23a492a55293b73c14c712eea10f14c73caf39a2d70cc475c3d79b1400e2db91351f17e3486323721c5c59f55e991ff22ad2327f8ee05dcc1e37196666f32a671a0f853305019faa888c9d79b23eecf64c1eb6213fb01211ab0c783cbde13caba14493b4c7e38b9fde0cd4b227857c7cbb1184d47879e722d9065eb7c3baa1c6fced6d70d352b8f7596d404f91dd553943ea7dc00d761ff437e646b0288dfd652db0b431a5855e996456da47b5a173a505072aa95faf7a0492ae1a82e4878e405a493fb714cfeb2d92814bfbf8390e48cda8eefc8db9c7554582e9278c8919fb138f4b0dd35df9df18b70f0cac789e2e6bfed3b417f1d61b5a08d59f4a7adede489fde4a029e269cf3e080130e00225c51b8b8fdd260b0d1d25c752d27f9913e7512e0d120c341eb71367a160245039b9907e653124e8d1bee4f30fb35dcd9d906e30419a5756d674b3d4c7696ea0147a92d5acdcd2215b5b9dd456a22fa0743f795b9b9fc8f91be89e171de6070c6e0f305b0ac12d243075167b86684ef1d6a6da2072dadfb1a511f2a3207ce3336a82184a06517d715a80bc41ac8e526dd56f9b61f3213fe41479651873275bc6dce0aa3fbe7ba84d6cbd15ed7e74a39596e3d4a3872b80ed769efe1fe711ca609e4385ca1ce597d9812d2e030fbad0c6eb821a5a78cb609a6191c037feffa1aaf1c5ad5c520b7201579cfc32fb933919d8394706dd778a07762a2437f804411a47357d5440c0f8a5f68f463c65507e51bc2101bd7a8a84436c5c694998ec5e20c48347e53cacafc31f2d45cc9e1fd6554d085db514b79e53af82f0f1ed369e0f74d1248701d634680dcb360e309c2433f06d80acc26b38b19545d9e281d5a80edd4d2e2dd469b8ae37f10160d92981c80a6a3f24e5bad2d949332e60d8ec3a80581d8a1dbf9782750e9b095584399ca887e2907601d8a02df00441139a9b3aa11bd7a1473dbd3f0b8ab29e8a42afd036a7fcf5f0be106fe64b0e2045d41fcc318b59b0e0aa84733089671d0dfe8faa2b069a881f1fc59e163427773c763e59a662637708cd2a3ac67a48f01634448529e2d40e9f94273e91ed8a13418d1b106f0f46f0628642732640cf7b67403f6fa954fa5480658ab689b7b920016f28c6909c863a0a4c36931306aa78c7b97aecf04b17594589ab993729d79864e3faad3406d43896b557f3cc6d736f77c58e494b2c11e54b804538512d4c86d5fce15c53c2cab50b3a7f4f203d122c315715a7007dc904dbffc0b86833343b006e05192e751e1e964a14f8388810faf754434bcd0242f6b2a47296b95c6ca4a8b8af510f15a5fb818bd33f97c3b6c7f0758cef27941a33469a4e85f7b642c59fc2da4aa6e6a178369c2e9fc3faa5aa6cdf36690028360f396e0bba5dac377aa69c08ebf7c3534c435451877896aff3af49fab76643fee5d861cfa494de8f6c3ba4cebde29d04e3a27fa84e931752e7682e47e1035f01d2728cc80cf6901fe3a5045e359269b984d58763b41221c8d85a7646dcd81af1606e4d3964ef5e92ef40ca755807a75e405c5c0fe51a44435db7f9092fcababa0bd4504a39a5f384ac61d2f76429d937d72b916d8ddf1e2a307655f3115cdd615e28bf75bdd3c15983c43ee92dfcca880ab1d5c42489ae0240c882950319fa0c588068ece4618782d1d67c19d6d75092aee0c4645fda19db92b3115120983a131f66472aa84f69167ae64fe3c576956ec2ce83efa660e5456f12ada8d1528a247deb35897a9c642427a2b7a2876e36f44d4b5b334ba84c366be37449de6fae7fa704305136fa43fc70d6b5cade667ee5e2e8e7dda942ecd190619a0d350ddaffb27e745cedba51561be838fa38536112fbfdd7c6dd7b00d866b162576fa518afea46d351c749cb20db1011ae1fc33b05bdb3f0953b73523057aa389238e7fdb195f26e8a8aba786272f63299660d925a8d0654d464fade4ccf2c64345b884be5f61f46a0fcbafd98424aaf8c395c6bd63f189f80e74683091d4a4b80514a10921682b4abba55110401ce13a5ec0b0b40ac56d9403b40dbc60690503b68e4c8d71e41c0d9eaa6ed0de4912ce7fcec6c3bad85e508ac451e0212facb662ebc96ba460ba695f70c8e70a6c37d8aa328a3f11399e47ec5238180a0df57054a7a6368e1667df2161fc80e05a1a375fc44c5fbb65a308fc5f175300771c31c25e13b3ff42b152bd5c6cf4b684458c79e9117abd4167f308b073f698e64c22f39bf9915e0d4364c2738f3121071ccdcf12b4a9a3bad220b40de5989b2c30fd9133cca944c98151c6bfe98074912710da1289469bb620e2f926060d8a0201e06984f16303c382cc9f9fe40a5560c75616a0f727c72529b9c40292b569b2f500cc169eadeba1b4ff30e339727da90534a9ee4e9045b52332fa82ae185331a9d8083fe1eb6f275d0c785a37384a8ff1187099af412077cd0b2cbb00ad5ca81ebd90b5594fdef2d40e93ae239a23e291819bf31e06523208eae572fd65c07d26a857675f69d99dfddc6c4c0096857846ce20705ae5f14a6834c26e87dc504299897db9009e0570a6881721eb29565fdc76f2364e242bd86c68130a015b17b159dee2710563feb0a71eac77b81a671e679939b61e1c65045f3b16133550774383cf0c728981ba1777a64156f7f4249c54735cdd09fc5f3c1a1c59b9c98fe1bcb0302ec92491be7f703ab4a69474dca5e6fd5c14e67569ea3f2a81225da8dff0ea237c5c82bfffb5c2e1aedc6908f6f0e6675c7c8be5bb6a5ffda5193cc37d5b51c4febb96d434642b5287150ac1aa8198b706b498b3386b2dc29748c8b2835ee5f07d004baede79efd095317c000e3674f1ceca3611d4ec88ad7ed101b20d815632fd94b6a1c32b32e0c111a3ff5b0c959da292f619772febc21052847c3fac7416ff62d8c0a2d51ed9a1a56629ac2156027f92bb3bda6f69264d6f709e69839051a9679862aab3c9a11620b2c4c58150cfc9a0cbe242404afbc68128897420d648af5732b8861821063da629dd1fc194e89458f8424f58177602be6006ad21801a00ae3137a2cc09c54b9de34fdf0800328940886ad98b6297749183f814847dac5f4d8f97dd1c3175ffd979a4cfc1edd8f217ecb049c967b984658a9836db20709360947fd97fdc0a541b25a282ae8b7014d95b7a9402e69d2a6c8d561cb31a2e9d62c561601f6ad2074c2b8ef80c251c76fdbcb067818407442986b73959e0fdc63173e30aff902fac318a814779a084e1950ee542bf9cb30b2e2cef161e0fcaf6a82c4cfbda0cd1157284be2c804c42f72ecd71a71d9ffb393f2993cb98204ff3bdad7d24e7e61a5310810f39dd73cfbde2ba24a01e27cbca7cd2301408822a8dd9daed2d41a32d03a9c00506cb9e39a11da10d3f803097da10cd5b629b10ee28c0011fc1971f0ba3938cb8eaa128fb5132b657ce093b0149d95077fb1b45f8a370cf42dbeb13cc25858e5866b4123f4567c1e23427ed45a2a5bf1158bf05c80f260653c38ed2ab25fb7d8ff8331aa0ab215e3988e22b457d2e2bb3359af38201b51cdf056c6f7589a629664390c5d22e46177a5cc32233b7a8cf414c02ddb51fc24ba383616602414f70a2849ab12d1f3de25123a81c91a7dec2eb3e3e0caa7902e2e9bd4db809fe36bcc66ddf9d9b7af82dbbc72dadfbf8889de61321f0c8701db40bf8164afb5501b67b09f02656c13e0d9d20c5b3281d8663f9745863c5e685289daa283cf32ab1a943f64b1b15111bd0cb24efe828eef3fccbffd03b12a24bcaaa82431bd05334f345531bd07f8b93566b290808a1a25b0c0db53bfa722417a4b5183c73c7cf18b4ca320e03b2ee726e444c93ea3f2db0e5f93f57416af06b9d8a16386a0a7eecccf7a2f9bfee69be59d8d19faa4ccf45411df6a3355c9e2be1ccb15e0721a106238e31ec24466169ae6d78e49690cb1028b82b38255437184d143aa2cabca94e73fdb2a263b7f5c56bd4a7b0d831261574645ef07949fc9916368b4cda5f7a3d083ef07e59c0c152cfefb090c14a458342efb7aa0d0130de77fd1f98eb11e6de12e9abad17df7435faf3313259dc02d49ffb48835ae70b44e2a411dc1b8120757e8d86a26bcd37d6309d3095335db1d4efd621dc20a015aad1b0ff3164f46e9f2db621311829528a9d6b4199fc973c1dfb2491ebd15249f280c5ed350d9749685632cbffa9262d8772e70c45762cad7ccff286e0c439aac428931635be8d85769c4ce0fc1ef04b62ffcec935abc295842458511d9477c7b216c5bac061be3a4c9369a8d27a970ddb3adb99c490ff5322bd01d3f16ed4a9f124729dd7d497c2e488414b4622c844796d889980c976aeb6748f3a2a44d0b480941705dfddc9db858698e7761e6892748b8439e17ea5e80b8bc7abc8a7ebcca9c6c1cb41cd7392e280f41c5e14d6308faa235b20fd0d3e805981cc7a8c8df7c220209690c8ac5f14e6a640f1d2df947e7cd29d2e55a1a21094ae817adec21f538ee8f92bf6bb449ad29b1e123c45aa245c49a810a69337dd7348ff4a8f158853093118233c22d29acbfbd59343624bd64569e726f13e38e570f8286c364fb4b98adff8110d5853039a52a92eb0c1550ae93dd61ee6c4ec8780febb360f03edd83ad78ecdc47dc408a4a45a494c6a6f404feb3a3ca4c73b1a56905ca3d6f4263da50862eee95653516f9252c43965cf234d9b3e8957824751fa2047b4324dd2d728e680ce2b25faf600a92127fade74231e225abcc024edf5150da5b4e41ae1be670219ec41a287c7d57a3be7a6de55eeace04320847a24776d95c43827e50ec9f5cddf9545c89fcb7d80c49ef8d6ee53c22035477b5d487bb9fc3e7ef40f956fb63d52df210c9f7956f388c10ae14431ceeb25da4f8230c520c72f478ef86482169561ceed178a59a1ba7a313d5393521944a45ac27305c1bcf45209c25dd25813a012a66371849c89578a4aa16786542c5646ed5ae59c1684d66badb885efa8011eb328b11011a6a31f69956624ea8a06f6771d5e3a1745bb050dbd61e238f455765758e46eb5f76515a3a26ae3777fe2beb340f230cc67d173c3dde62c798307845000170d36352c9e6a9274d16c7b536971aecd34207426876a9beacb1d51c28ed962665fb0c2e5df1c297b0f53438e5ee98549c9328b08ad21ad4ac96aef72011544c758f9a863fe6abe548b4bbce18e4ebfff63b77447ee83f62c0661b6646976a79e91503acbd98fdcb721b45a1693d324e35d82e2140abc03113cb763eae839393838d7312d897c27a4460b52950334a912fffda2745e3aa211e69363a52f4595d01cff89806d36e9c421c7cb565a594225349ea451a785f4e52b3eaebf94837af749c5542f0d7cc6864f22ed2f866bea0f126aed5b5877a8dff0dd816c561464407406701d8ee679ceb0f78d04904fff678519a3d2c815b5a75d0e7e18303a3723aedff9a0799d3b8b2fa43fc2125865d25d161c0449e27abaacbf97bb6e5ed61229d691ff29747f79797a69c5dc70bbbce5904fcf82be78faa643bb35af6ef5ba8daf8388fc7ebdbaca442331b6105d7d85c3774ceca24073656aee19e305a034e62ade9db7dc7983b41f171c219143bbe525c02222d9a988fa35895a34db47afed2f2cf94e2fa975fe45d91ef527df536e949e0a216be5dad96b9914a89cc241d39863af4c2785ef42620fe7f40e143af1646e0555feff0f3821b88d67de05d00d18701a37d535ffc62015c110c34736681285491f490437929c837695f279d8ac5bbfab9b09bd3a9799b1cdd179a3011a4efd83b9f69eb17e5aa274e922897c4f0ebc231cf2a7ce00f27c6ba00eb120409679e2a26545469d762e0a0ce50e6989c180c12f860f1e7acc5f0019f3a214a1b5386fa9f1ac1a7edd28ae6e871a98cc204e158d62303bb7d7cb0bd7b86a809c7cec92404f669679cc7690bc43a992b5b6a4c52a876738e13ce65af33acc6a65ba99de0d6eb59575937ceac155ed3ec9ff8ea6a0512c7be51b567b9384721272ac971948c42fd1c1f6b2e3bb28224edd2ab40f987e1307542008eabd595ff2bc483bbf4e5f15975cc87161a0c097ad9e8746e74e53f04e43daed29c760f82614f051cd0cf40e231d6e3f758c925cd04c548dda48fdbd6da384b1d6294d5ddd9de6486100431ec1b2afe4cf467ca55cc3f852c0af9ce2c654ea4c449b7d927160fc95c81e0ffb7e877f00bb6f8252cb10d9fde0a8dcdd3892f55f3c1c0811b6d5356584b45f7a6646321021dbc2c0d0e02b8d40c584bfeba8048a6ba51f0eaebcd999dec93c8a66009a41e0f458fd09287399f049977e19643fd1be8abc8dbc8d78a62e476dd06e4e4625dac19fb93e34474ceb8f90f8822b6364d5c5996a4e66ecc485a829cb340512740121b5d371c011264fa364472ca52b232a7dd0fd2c4454f7aa45e4223d351167530c515f95f01f6b738a95caacedfbc8ca26368287c3828b46d5a88e27b5db4fc3eac83a02a50370cdc68b2dea9fd187b6f90ae3038f898f84d4dc6008e0c7850db6ecc1cc16e2b158fb87c420b2010ca27d7ef0df0f741a70893b533f549257eb4845e929454bf74d21edf994b6a0a0196e17f65e11083f1ef53a52b2aa65dcc1ccd69d8b4b22c60036e30cf8d35c83c92041319f5936a1a89c65ca812b5ac6220404d65419cd6bd2fd71c6a38b5aa1e0fde464d2b951fa2948567a072eeb092efcb6c1de060395c76da23d0fd4bfbc883b6e8227d5f992b1148d71f904ae56989bb632b5e9c4338055683da631a9ce5ca0d66dadbd6a0529506f543abc1537b1ca5542018c53c769ee54aefd14275fd079200ae544b802dc362c43a0d89ae7d9106224f81a74c0fefac092ce5150dca221751dbb21cd83efba2fa81607c98493d62982039435794e4120444d9283f7e95a8d47e3d8ad6151c646c5324880c08d88af4289515a8986a7979174b536ac44b85b02e070b4a8c6e1ad161b6684dc4c3fba96bb9552fba0cd9b5a6350c29adf25b34a04197f8de463a5d35457c3cb78a4058eb473158984d31184dc5abf2d5dcff296543938b4857bd286b7cca559f6b629d1861e209d70cbb72d53e6ec2c8ff9f8f60c1e02b5a7108eb910903401525065c9a85aa61f391207711029e60b9c40cd1ee99dc01adaa300a857fabf36a9dc8477a7b8ba02bf3b30c31ae0d1b782aea7c149ff2c4570668834fcfb7db1c1e69fdfe3eefc43a849229d318d270c869fffe0ecac310a6cfc160eba5fc75deac1525ed401c2c702a397b98f1e1ca15bf6a4eb1af8a00cef472c56277530d1ac695cebe4f92737b2d7c48aaa81e639f683518d69d009576a68556edcb8feabdc1ee1189d1d7c3e9ea7438b514d754d02447227717ec75b2018f5a79f214548706fc0a542dda21e68c0c10230cd6a2941053512aaf05987866beb02aaa0b6d9703532f75d90591d6795c043f9a12a31da08b819c8b8620b82dc01b5a9ab64c69a9f691639d3dd3591c24bb9e651b6cb202ecbe8fd78edbaf9bf357e234f8331f234a013b839f4a18ea14b36568be843ea2efb695135536dac79444f57047d415fc1352f6ce61f3ff688a38daa1893b04bd11c624224410a8c2a9404860c9cb1ae0533d4139d9b0d6ac35ee348c8fd16ad51bf0880782137f905466a65ab4d73a75e55c2344e822e2e267e9e0aecd955d070985bb3bd6c75d6ef35fe4d6637f815674ba707cb5fb6bdcadaefce24d928679be12ded178c68ee6e1f5172ba920051226fb7929574c4688267b8131d3f7ed5637f494716fe60a670fa0f38f8b422cbc750eb79183e254973b6227cd9ebcce461224d2c77ca3e3284590a9db6c413b83f1c845c3ee6a6f9970f978d4ca165d59b17af159f94a88db33cd6158755963b039d5d9b10b15ed4925831fb316a7cd09d2f472d5a9247975991e734a64eb3a753259adcd05ffb96424732891e86fbe4712e5a6edc35ec95af6fbad29edbf30cac56810bbf43a76200b70e8ab17556469355d3af1ab68fd3548a4bfbe20ad68154fd004387904f90c53921f35bd5bb7c8a7236816cb00aa4a43eaf684eb1c3cdd0a2e91ab63fa73ab04e699f2490ecd4d0e894d008e76d5e1a15746a94dd4a318fbacf487c2918befe27b22e35ae653060a58c966a37fa331fc952bf6b466107ae5ea98f0eefff7246e1f62f8957a5a2ab5c0e58e99152ea0df89378514a04ca0324437f49f4a4721bbbe3b7390c573f23ba2615cd32e7c096969443c4b5e6e06773ee37624b5223550cb4d0ad6ee83152d90afb5f5caedfe8be5f6601b83ff8cc5fb3b5f151c85f8ce52fd08773bf0f92a3b6a2d65c0c99df8ceac445026a8600d3d5b1d9a20415a8462b2f6b3c0549ded09a265e2c0f50053279b84415d9b0e56cc4ae6c582b9252ae85dc17c03aaa8a76e58e1049916cad15b556aae6345618c999abd03a60b62a0da54e73f0d62d2e145d3a1e5dd0bbc011b93d0acc824e79b4fbb4b6c38d2103d11cc5ace1bdcddf329cf01290b0db80f2dd7b7b0ff0130df1aa5c025a4dac2f3d1eea9f8f27e0060666b9a923fd1ecf0fe718d8a603e4ea84fd0298ef306ae131ad89b512c198b2f4f97cfffc303282859d804c8534fabc49ff933982bbc92f181039a53783dce9e6317e586bc1b631c096636de9f164ff249441da360831f615045022ec3544eed0fa5d41cc706f10ff1d28aa0f13e9bf53acfcd342a3ca3f51ebb2a316a875f89e9831c2364758d8bec11c4ae9a944c88403e200d635d8bfa3285afcc22d382dab960cfaae8bf656a2a6545441ad19a51d0794c01c0f3538b7c72091ba4658205b9c880ad918a45d094293a1ef00c75b10450a0dad0a880e83c49102737f1bc6cdb1dd848d9d3e43981010518e77d65370845a9d326a0442b3f0ecbf8a8229966e027809c870e47edb23747e88680206e27eba26f4789d222970892a3dde3ba95b5d8b0c48fbd298b8769cd072b46c728aa35d720a84e82593910c015ef3325d03450c8a827fabc912bb4366a20597468b0a04896e22d2cd7b3f92bef68b569a3bf772158e9854c0389151007bbce3b0b7997da3706437a66eb5aac43bfc9dc8cd421276b8fac33539f7c52c4792796758ccac36adabdecd46acdb4e47da2213eea575909bf2fd60efbbdc622a88bc98f81de4abb058920d832b5c26844a8d096dbaf8e09ac83cc07747e86c5c787bc9c5da5b623da3a995acfbc537942bf11a6ecf4f2857d5edc8b98444797bda9d155a07fb0f5e380570e6b85a3ee76fd03682880615228fab92923b6a55398990604dec6452a8489b8130e74f31c6babed9ddf5b0e0e3b6c765cbe552e86c4c248b7e377df61824a66544702984076579821c9851e9184978c185d2ecc761e83a34faaef4a194f4f4beb36dfe21edaf8b38ce8040dc75e4e021f7713710ea8945772f89c8ed09b683368786fba545d8376c05c9ac89310442d0a2e75489b9958d4ffc7db54a327b1949bc7237683fa38bdb6c3858ae9cc10d7278e34aa0c226dfaf8de4dc21faf84f2d7474f563de471bc9b50745f345a88ccd066689ab990bcfbc89f98fe4c30460be5d79a9ae210cf71903d8e0996b558326d01051fd9c78645eac9fb40a10deba6d24b06e999c42af004d60a54399e37edddec0b7681979d2ead1100bd6e130038ee5fc18fa62ecf56ea793e8593f846a7d39784df39f6e9d199e0b927f72701089bd90954466e0dcc28625c3d38385a5c23a8c23637496227e6f8b3e16dc9524626526bd0dc84a8aeb4b5b7f45420e76f66c3d179bdcb37dd65e17d690a142282aba3acdedc5033bf555bceef220616aa6b618e3a2b9ac75f4517396dc29709af199bdd1a0d730ad578e8a72b4411897e924da49661dc322cc599e507b797e73a2d168de076e92bdf7b9cbd31254330619fb75261359a769f032aed12b5f6c1b1c47d0e85aed79056cda45146eaa673be38283049eb20f25a70e05f7e34fd403913dc9d80a3e482b102c2396b7735c78babe087255b7d91a674ad144629c122d1ab6d50afdc4b97b42499e8f2373f1eee0a47e7bb3af7e89f13cfb0e152d22b4efe8ff68949d8ceec2ed1bf3c7b4c25bc0525708fdfccd94f8fb321277291d57ed7f513ebce24d81b5fa1306b57ba6cee632ea3b38a53e969fa616fa8aabc62540d0672d0552412bca4e481920c13a7b63956153cb26ac2b3d62655d494410d92bb449c3c23bbb00bf33db05b22f3697391ec0361e1fc35e6d7cb665e16f1926d0822600a96d4564b0d185cd3cb5a1a428082bcb027e1bf52d5e5e45222aa5eeb804f3e9c4d8ef301a4eef44166aeaa559b3aaa8acb853ddb4d4d5e8f314fa01228bd8a7db5c9a783078ce03c5311dfc93bdbec141942946d48063952802d8d18813015eb38d037d3313c5be0be4c4a45378661556a39ec5ce5e766080c0f46e42b55399855ba114a147b6392dcc5c0362df29e8a36c9ee2d7ee7b8927cd5d28237f61455d4a5599733ad57d1793174936687e6155c72a99a8a0550016cadbfa2d40c74b284547e24a92d7e668718e3e8ad24f2484de4772dd90e1039e75f8af6ab185324d7d85f0037de27958851084ef5c9a8c00e41f88a2422145064020e02ad408fb2a3c3e761757e20241a09d67600167cc5d8ba932144937e4fedc94ea6a513158556d4100c24f834a5695b6aaed97c0e2d8757859dc27ee93973a93e5be27c44ef2c8928c55fe21f136deaf865d524df04cb367102f2f0687074ad3a61061e81f8494b9f246aafa8df3803080af09b57cdb151895d2f0429b564e04e69cf2adbd487059cfbeb8ad731f2ed6df03aef5dac7b8d54efdec49b7c9c9d2b5eebd7055676fb8d46b1f6ed5d96f7061a75e4efb644cdaf6503d31c7617e958ed455861526ece20ee8a28e5d975042c23fdc1d074ee192eed560bf754ae232cb3315f62b6066179ea4ff583d795765dc9722a80f9c48ed1f01b83d92d60047fbaffc382895480f30c5d89adc941dcf1e74f16557edbc06042dfa469dcffafceecfaf73c5f0cf8de70fb72ed0396667a113bdd2bda9ee5af7886d2d1d1af076d57527661c3648f44f63a04e99786828e13f8d403b31e3b041a27f1a0375cac4434309ff6904da8919870d12fdd318a853261e1a4af84f23d04ecc386c90e89fc6409d32f1d050c27f1a817662c6618344ff3406ea948937142af70490a6ffa7a14050f997cb64b532a45187ae01245c73cd89eca3f29cd857398487564aab3804b4576fe018e519a81c235026901728019ac29343290643cd5d3fa2b25c3e37d0f540abaf0599b1b3d0b7ee961596db126bd1b5dcac55169715d3426fdd2d2bae52ce1e2acf7a10fd715fd74e26d1504e97d61b56a1dc638188b0db2500e394b758a1930495dda59f3262a2ebae40ee01fda06e131ae7510d44431bb3c9d5d79c2a867293cb8f25aec988f992d0582139683d6750d4008ddc346991c44c50b0208be102a45d189ef53fae9e31aeefc4c093359063234e1da3d310a55e5e48724ba64918ca6a1cf3cf16fb9f9658452570ca47335931226a21492f505985501e3f82384c27fc16a3089515b40943b3cd4c3f9dc3818806c79a128d34b54632f0845907b6ef84cfaba4112207470cf27a9cba35784103ad7a4d3e88bac7c4c94dc71d3f3893d96bdb27cf93678758a9563d51eee807b4886a81a5f03775a1f6d29366a273344b39a32e4b28a1fb99af4570462ffdacb07fee52b6f8041b7dee479d78b9d630b3e7a64d2c57756f68e138a585b20e1df9ebc9b08b68e96c4f38750d5596e9afdf26c241433dcacffa1bcc9d614e1ae876487e5be92c257e6ff75c1cded8857bedbc720d4317717400d93a0c456b37b426382d0e0ef26efdc71ea18d03a25199c6a5213636892f39ac0dd2af4cca68a710e2c4da4f9bb21f88d2a086f4af0cd40a94b0d939f36d10aa0a2677c6ba927d181bd9948bb9a68dc3df7492d9287ab67ba303ecf4587a3dc4b579ad5c2f664d0444fc9decc034d2fec6eb3cb55e0057dd2d543900f6bcfd34692e057b1f6bb9640d66c3046729deac63dfc921f5b5f9d7db2630f9e864c9fd97a12cda7959330367666ffa45ec3dbb4774bc37b69a0c41429c4db849fb6a139ab00df79825ca3e9ccde196fd1cee71c6590038cb217fb2e6686dfc633929fd4021f37d5ff07840585896bd4c9acea46eb2914330e8b4e12cedf825c4532707691e4c4e9cf65c6282f83c8b3710b4bc7189ac61099c59548f402de990bd4bbfad37a511cfef2cdce8d66cb11d80bac03ea4e4506f58eccb9abb5c588d7aa73b279a96f4448631c0d8c5c949669497aaff9f49bf4945227e71325287c34be4c80947423b0b8c8a44c2c3660e86193275d1149fdf1d59831023cbbbd9fdc73539704a94d0d2327abf5f1869e3ec2786d099631c0761d6389026f54f56454daea052692fa738f03ad76deaf52dca000b48779f84632eb33c4167168345e5dc1162693e20875b82e10f7844bd79379af10eea7b77b921bb6d81205dfb7ce41505f6841c577327991cd53409e23251c92b5454da1b4320ecb91a08e75e3f9234be0ad562ac0f33a2a0d419c302e84a6273a8b99a57a8f3d573795b8ba81e584a60a2fe356ae8b676c273775d4b8a3b58889d6ec5cd0352d94d58d0fc316b02593ee9106dba35f242104a3f6c34c713963474e989df3e5e6f57615327808633598f18d3331e152d327ddd3493f439eca3f6b8d5e2789fb42b7d348360d03a9d5c2d6475005178368ef4210b8a71c0d626dc931c4c8febd555631c443f557094d23a0268db45322df8ec653dc266d2b172c90105be64dbfb304f3baa047a4c93e3c4403e87caaa0c581a151b0c5f2732ca73e30409f94a43d1280e29218389fc439d971769032182147ba792a1b30d1e9d90fd0499a100b594310952f21f2986aa40781c7a10d1b1dd059462a51e478c469fdac9a87cb167d34c34607742466e13c6d2fa3b210beff499d3f41038629cfa776b00ac2b7a22a0e4d7be19781305523c181eb8a7559096075f5607f2307c8c880908aa1021c718f10fdebce5a4265f9ff02caa3410733192a612f82314e051985dadc3a56c3d615a4b2a90a550c27a6284d87f712042e5fb5b859424ed5dfa94f300a8dc3acb7edafbb1322fcfb8d4d67822ffae7ae3393e6ea1daa2f84ac780de86ffa12a441f9465dab7694f620a3b478b4a0c13be2c1b3f3c01a9d29ae46450c519c9f94c97dae83a9bcdcd01a80927e2760edf349fe023973e737e032c825f88045ed7e58144cef9ff16f4566696ddf0c9779e342d5acdf03983852bd84017abbd49292a6910ac26f7dcc7f50dd0a57cb840db20ff960e7daff39d00fe0782cb1af6fe058475457c037cdb4e3b137f0692290b6bd02a809a082f8accd7685e533b8ddbc53ef08f518b3793f308c21e0a3b1ee0e65d1457bcfe801c9b87df7167f67c0b37df5bbc3e219fa09fa3f84e8bc15a00bec7c6a230e88225a316c8eada5be67ab38334adcbc9c2042bb44e22ad202bd790ed78606e12584e66d5c9214f59e397a1068f1d4004eab19010e2bfb024f223a7fb7afb471dc27595f05fa7357ead82dcec8277218aa63ba200fd4f1203f465bafc0a2b2a94401e547ac3754327fa0ce90cd6a520b605d89b0533308047c374794bf80220c94d0105fb1c09488ff37d7812a5ee4dc759f177b1d4c2913c144e235d0cf0fdddb6efbe27709eb5447d0b0d6a9ddb724a7071560f8e5a0c04f9f8964e47375ddbaa365849b66949072b700171af76da50558368c47d604a3eb67965e315edb6baab7cf7c606a7c05253a5dbe0ccc1004eee8105232454fe53fc5a8119040dcc309d92584d76fee0b1ae3066f823b5f5c62a4efa0a642597bc465bc0a47dbb90f76b41465aa0cf965ff4cff405672a28df124cdbe8e8b19a6070683a6d1bad63bd6b8a66a50b08722cc0056abfbff8db2bff614aa4020beba67f178849f14d8e0f6ad7e284ef435314524631d87ae4693b586902bfc3b5b7c83554c31cb69cc65ddc1892938a89a4ca4d49c534831cc4f16403ab3fbc73fed0aac280815e0957630d3ebe46867ceb43e9c763d4bb38ae754b5c7ac4f70632fec096bed48b90645ea183beaa9f2ac5fa7bc0c68b378dc7e9fa5764283a5974b058e1e8e189d00f49352fd2106963a5ae4c77c7249420562ad2197d5617b1c5349750acf17854af8c05e988444f2aef0e0a9d1c762e6778f66c3a642144b8628d86572ead4896e8733b5f52a6b8e500aa84002de274864505cf8b533471062ea1b0212c9d195ba56c229134950309361ffc238931e3141136f303fce8857a0b164410291acfeb440cae847220928ee89824e47cf5e4088ffe790138313bc7ca22ca5bf8b01700ab2f6fa13e54423051280d7506f28cc38a32801ef494d4c67008092227c53a84d1e7ee529e2ab865680d5b8a47bdf3eb44f788257056ca9fadfb4ee74666913325e8495aaf1a8c3e7ae116d8c570aeb36e2f73d4f4be22799333840cf46ea88d68b212f94021c129a9a652c932aa077f1d99804302c237b111c1ec8c827f0242f6484bac13b4fd3fbadb9a474a01e59465a93d80e5af5b944bf8f00450d3d60496e04b977afe860f2b802ab59e200439e974e54805a83389f9cfef76588deecc7df0069e7055800b65b96b864770ae37da2ab9c7451dc260b40e46214a952683eb69527252668a35d34504243188d0d63ffc0379f8b1ff5f46f0437d860d7b41f416c4a56b818a8b5fdf1eebfb21b52bf32d9242d22e54b64b4df9b8c9d601b72d80dc47f3031b16702c892f9f867aed059dbbf7e9ddb41c6fdd98565d43374b2685931f997b3f0cc75d95da7372f4b19e1833efae29b67559bcb2eb8f60baa150ea387634695b20de77cf8ca9a51ea1a3890461b7b55543898e0d05d023bf5387d48599e5274068a2b2973a017a83faaee06f0099b320f34d7f501027146f8baf3f5bf2a03d496fe23df68ca81f8d23706fad015015be92a3ae25de1b272385420ab18832ec21c9356fd36876ec0d4c4998046406579a5812f546f29c15702d7f1769bc5bfc35c6f1f97dfa37349e94cd2012d4cbd110e53c2ad5c9f6b50780d74dd43234255e60174709db0f3333db225f1b0d62804bf225c2c1ff4eb19d3baf4b9be613da30d8e4704f66bf09d45bf16ad04c07748ef3d09e4964773c5b327370a2dacbf65a49f84b77a0a031ac71f0418316ab0b9d8f63857471984a0eb52a1412aa3964cefdb6f6f6bc02b59881757a56ed13b02e72119bdd655f880e6ccc32bb9704a5dc106e92a5c0554c111a6366415fcd29d2068853ec1359ab815e158f5ec33732a3ef7e5b9ce847a970158d9328836e8b33ceb457d151540f562f7d200eeb6bbbebf5844bf7a471b3630abee77af54b18fa95648023bd5dadc1a06bdd59a89717cbf5f4f87be3bfe48933b27df46f7704523d1f9d40ca4f320227910606cbc0735f12eaf53793d9bf4ffe8cf9fcb3be7e19ba2a06c7044f405be8fe85df92d1d34a005ca1f4449bfde8806f0ae215307f5ce8a5903bc23668fba5c2a6a9e90a2bf20d0cbd30f5d736eb1b3f61f8652e1d0ec960e70ea580d8ff830d05685264442a5dbd2c13e27d4d6ff1251ff5d14584b1308513ec94482be46231ffb3e75580e68422ba7729f210cc2445550c2cb6964b37604f4699046a0e08f3428fefd3f00c975601ee6033491c9b599b1c1f9aa75309d36cc008a1c00ee2834d7bac94dec9ff1dc8efef61e58f06aec4cbd9a75fe7c85377cff86bee81c0e3eb192706451ababd3810b9d51282c0269c613424e4bc526ae70d0c70844729b013751e54fc66efb79ef11b12a9d43454708b2198453303f06dd172ce2dfd03afda26e3c5b1d9346ba8e6c88f19c5f08089947ff194cacf12baab1583321c7ea8fa9b291d98e6824f24255c58abc653953e68b467afc14806a97853dbe9a437129281cd9058fb3248ef21b1b70f1894204e18383349c4180e42d7b40ce3023ede7e72c0cf49b31ed007929a680d63fb4ae9f909c2d963e328b5dc82ce29608b1f89e876ad2652633186552f136f88f6beb17929b400716b4c8aa05c134bb135b937f52838919b22e69f063ac3dda733b64cc22c0ffb6310565230f5866570b548ce89c3f036ac7afa7e84718424956c29c307167c068623560e7a9459c4afe08508b3201ee470b0c8b0425dfd68b87b713cf5243108153330767496be0aa4adf09baf6ed9648dbfb33e79190458c435d3df7824c375063099d7bd961afec55ef9ff60d2650af7ebb5595e5094bd9a3a340e0a587d624b2437a1f917921c9612ccb93ebb91e46b923af578575a204afed8db785deae294726e331afb953e6f24d7c76381be6923ab1b0834bb2e6fceb2193d3d0776dd73f2e8f5f2d3adc04a129df6b9a3ddf554c248274cbdac23e814b4bd488dc4c360b4dfbc6dd05be3c82ecfd9319063da9f5e271ce4fc3933e8427fe719c1e3560a531653de8408731bb8b9ae18731b60c0429c5aab9932e68d391d4a681e6c1b99d87038999fecd11278f56b50d4d0c7ff69a1934d78c237242f49673993742bafe1062eca70385675b8ce84f83870484db292b00d4c163eb8dc99d29757f593b22e80fe74cb78873e7ef5d8bdee493388485412e24f7b301a51b0d581292634f25224cd1bfd26b9de45af7e7b182dc695907b808f05af977a97070efd63a92b80565eb1893d35b38035b61095e95462d04a294b6fb368b4903570d56f6c4180417de070fc86ae7f13b4572009cbc06702d6ef18b256ffe8f28a7ca63b8b51ab73152b9fdc2019aeeca69e129162ffe70a8e93a2d5bd3cedbfb2e1ece5e2aaaf51bfc9e5ff118a6492ebeaee0524c4fe8a634fcbadfcf5911aee6870ddfe9a9dbc91e4f0cc0228d626506d4112be78ce76c7f082dd30926b668cd2463c3ee7f4c8e886e1b7784b9b9c64842339c7980014049aa65e140fed89c33eb30615851b32b41a027d8667d84390f7b2e61e07419f6eec5029191d3434cc9cda99ad99961ad9d802c9d6e205b602974445674924a2d9fe0c9170b48d59147cfc57a0ae3b6d744381ab2d0cbb6f33a230e266fe34e2aecfa40550614f3df6a1cc9a702470d089d4a925fd3d6813c52ef7b8bd03e72882dcc0913f74dfc8c1aa3164e396436fc861e55ad8c36433e97143a56fc868409fe0b281786d84cde71e0ad141893d21fc42745467d486c6fda577eb9c51354488f666f4f05e5c80ec44a306c8d2926e2a4c8673cfc2403dccdd10cde6f3033a7e268195c1c075c3aaa5b00221acf25a8866485e85eb8b432776a5abbad0079ce7678fc26803113d5af6bca86ff0384b5051b441e807a13740786b61afb41873423441965e685bf585ebd9290fadc90364e39343b4996fe8240f15c5d543dcd0c6f8ddf79428764349b528f46d7f643991b555d4542b278b789a3f7446b295f639a322f57705a8358a8e2f400077c0f863855ed123a417088a5b8eb648ede71ff215ab25789fbfaa958570c3be90e4bb8b64d4de0632a32a6a0f7df4e03eb35611aaad09582f672fb7e612b2df61d1a47d3d5bc9e1e8a9819b2032dacb679d225cab7df6bf0523c7987d8b504315ed01d3a45e864899ea24a32ff195ae5fa4514267885b89f08eff48aba70b981bb7d31ac913154ca405832652d6541a48d0f6e133557450e29c00fba0b50724d5156150bf3b57cda53847f326a40513d30caa0452e2ce88dc88da3944143412df78298a589422e3a27c3dead8268d6920c74404c4d4ab7c360a8c3bdc072f377a30e1e89bec1d83345855a6cbddb12ff22d81af2529fc9cb09907b97489dc26bc9689c7929b9d89db566bc7d2b0cb6269228329be6f5c7bab0a9c1d3370b974d547bea7b1638b26b2731debaff9e9435bd3a70b23dc103de933194782a44d3adba3d66c3bb47d9af847b1470de490e0fb3aefaf96283c5996a84b9fbb1471d96be072b0533203676c3253dd4c2043baef850bc8ae121e94b7e08e471ae5c9fc974b61a1924902771f657dcc91cabe0039a3b89d481588acb7a0684996e62f7536f2896601205d4a670ad3d2f4f7f4265a773ce2bd5bb9e1060f1437a6960bcb76e56f4cb8fe752f1bcadde1c7fc5927d7799fb75ccbf14e80a606695e4616215289f9fe928599221062c799bb148431a99ffd0f0dbce5c03ac3250b512d885f1fdcde663ac716cd77b62ef588851f33c38314f1ec959a0c91e7a77e7288c2adcdc4295cd4073b6d7cae4e25bd80670acf70f1f1975cad51d07c77a5b195197bf46e6fc9dc92c60e030fb0b9099a16e9ca6819766df64923f6cf4cd18ea2f200fc00826e568ad0401c981791d215902a8b170dcdc4b94746d971dd2d10e057d387d678c6bd1c0fdd22d25c60225a86e1d0ff7aeb73ddeb7feea484cf38043c9d8bc0adf6f1f1338f54ff9fe442a14f6823e4db616661925915e8611b828ebf421abb6c0ca07dc612c0e6addd971f253aa7139e07abfba039b21eb32f4644ec61720085d07c1cc80ecf7358b044c9b7a6a8e4aef88b8ceb1b2adc0c54fada3b5a5065b880bf017a5a418a4e68c0dbf293cf9db674ebfed48d79dcaa94716a62b3c639613ab052b7255d3d09b353a209c6621da317d072c37319e9c8410f986523a58cc21610b81992b95cff5a9d28f9c504f29c4b2dd5690b9c9c2f9931cc1266a3e60583c6088f627fa2408ab0a12044e526b32f5e7f4f895add90886fb584699c877b541bc4cf7ff93587799440c0f93b9cf58395112e70782219be666e6ea151eecfe92cc701d2fde33b2e8690f85e68be5e7a959ef8f160761cc106cd2cda24799e30c753b83cf432667e7b89a4d6c046feffc54802990aa464019eb19c2b5c81f649705c869a0cbc6a90bf1291609768990d725ead144c34764c717abb8c030ada40238035d77433a9b4250e05392791a373ffc2016a17d0eb7e251449688a3d4e965de7e9e0a3eb4131f55a69a4476765465fb9a96206d94bc7badb00285b829e2b883a333681fcc64995ea2ee094017938990595de7602586fb4a06c0360899f2bbc82f8ff216f34b6e4129c10988d7242e66a0e5bcbeae00341cd639dd50ba038c466b075d8ddd4a18392e0da291d799d65b3b46363e73823250ea9b89b834cb270304915fbcbf03ff01f87717d0ecb2fc174219e53cb006754acebd98ae6b50cf25e72c5d2d935782f34c9314ce130a4ba7ea500aaeec957dbab5adab4f1de1d52b7cc6ee82a6f8901348cb45e628feb42c3e8170a8b25ffc04bf4cd70a388889fff238e612446fbac18fc861b3c5172647f7894659a8d026977caf540e685dbb2aea0a982abe8c7a3047de55d98ac3b76f37c4e0024fa5be2e6eb0810c6ab2ffeedb0a7fb345e873005d8152633400341c6745bf1595fdb55b80494d2410c46f14ea93436f8b2509a4c41342e59bb0b6bd9274c2a2c27adc5bd488f798a2fd5fbc5810105328c647e0519c60e4ea30af901d04ec386af46f66ea45923c9be607685cd1bad650bcec24cee170f89b96a89ac2f0e20d8f060a6bbca21cf5d83b416d25a1169bd948926ce12ac87602f586c2e6b91caf39f74cfe2eef5553a141718bfc30593b55301f3e2422fad34f3f91036e78b926025269351946deb1790ee648a86b8a9397229c22d527be3aebfb5a227a88d77c988e6b524018bcd928419eebaf218d3717388fb3bd59394c360dbce875373bc13183c39f949ae73884a68375b04ce5f6df09ca00db3f9a69cd7f9583a6e7ebd0efca3c1c7eabc6abd3f30540c8238448b057733b9297194630572f9d6c1988f21980ab22c6b6ee34017283457803ea1ef523078d0cc32f5fc0ceb693384499a62ec4503d28d56d9f09c7b16ed09391f7d10af2de788de586cf01e86e71b956144b5de29636efb42be3bd5baf1f274f74eaaafe0bca9e04122366b9967f716b4f1980124c37973ccd5ac0d7ebfd24ddaa796aaa868611ed46d0c834c634ce652411bc3fefd6f32c1f4569051b68080d7703c532f12e8c3e3f218ebbb81f817b89e7dde515581fc8b3c21f86403862fc4222f570fde6dd7884709fba8da155fd0fdac0739b075b573ee92589018bd4121b0ebef575ab90ff81c924445217c9687d1984da5cd858c177ec6fb729368836d36e34414616470fbd829417a6aa0d6eee0ed43a45724595e28389dcda238d6a029b97c4c722ce95d440949b89f4767ee4368de60b6a2cd3af4adcf6abfc3141592f20b08fa93f4266cb65e3ef4c73eabe4c014fe9f94b01d2bad4db6fd9f3070b443bf2305c86861626c3dba0209f51d822393476b9e706985ec1f81cec48fe32278b2fdab6f16bebe93bd37a0917eaf1300824a101b6de7232140516176f2e241449c74d3521a0b8f443123247269a4caab5d585b93c1c3419ba59509fd6bbf101a68553e15b771f8d2f5172ebe72f8e28c7c82855a858e3fa1c0c576e00376e5832584f7601342c10411392e6e2bd896195eb602820285ccf8056473230456fbd08b550b151e768639183f5d241c745b98aaae4a30129feda2391bdb59583050300cfd39b13e0ac5485081542be9adc906e83dd41f563e1a5eca3e8a9badd64535aceb8ca42694c7d71af485571028bff08d23f71e43c162bf288d4fc7d2accf97cbc99f7b75e9bfc4157accea098c6a74e48be33fa05cb71088200a792edf045651be6db91310f6791efe4507590af14f20f9f587fcf93772f4a56468dc52b03c1aedcec294126ed9a0a93fc833b4dfdf5dd3692c7a123181198397614e4a1ea0d14ec89908d21bbc6fc61f4c0f90cf8379b12c8ad217cd98dbbd7383fc854564ba03214c2fb54a63d86c48486e904040729abd26453e2abb7a49e64f8ae4d59a01fb8c42f8984c259a7d2a942a1c897d5c146993066b72eb07228f2670d85fa9b0624ed39d2eedeb705c065652005c10a971df690fb4f28bb87a9dd3ecd2125772da9bc569acbbc149ecacf7194fc457b017777befcdce86637be8c07108e149027624d5a152427c1c503d4d8c2f1332fc1bc98e883fe3a9c269ee4647acd306d04f4ae80f99f1a79de6bc05c6a4e61aaa93a851398b67ff0677a1f0ff0d35174822148ee77cbd43e3108126ff29e988b66b78d8e7264cdd9ef88c5dd322c72da500a07f8dcbb54369840d14dfe7d21658a5de887bcdb5c6337c218fa4efe67c1a3b58830ff5d4414c58e1443dc93cc8a2a79e4f07a3d7e25f6869a926c051c5242f3dc2214360cfe65fd8590687770fbb7712a9c0b9b3e231ecc077be681c5343593fe431f0a898d908cfd1bbe9f9cc473def0abaf5b2b198185dda83f9ed132e57994e17624ddfe7b036540a2fdaf422325a9b6941d39f2e8d7a56d86ec4937365d83c86027e833540179db9717a408dfac4edd7524312e74e71faf10f538824ba3ce57d6b91ded36c1c057a093dec847fcaf6045465c72d83cea6955c7bc34b366c349f2881023e0162a4af1427ee25f69a8d955c248a18db7ca76a86d312ae0c24f54388807459f8b2ee2bfdc017cac5eaeb552c8b91df0be44a24856f2b827a1e4db8404c0be5da1f36029f75f11e1b419737a04bc9ea46c08ebd102b246d1ff9a4a05ff229255c5fbddf521a6ae9c793a0c0586e14404e086cc7f120df9c0d4fc7c4ea12e2707329f2f15ce0bebe249d6e3eae61011773b6601a7139ff3f8c45af17753e85b01a611e366a59d351008a25be815385ec00150085fcd5c0f6bb645c248ed47c5e81752813e1349831df03754c837041f1f7614e199705b80fa3e28163c45e04eadfc68f56201c16a5035dc279f2724a8e0beec8358352f6f8983c21c7354bc971820a9d318fa73efef214229c5cb02e080028c828fb6c34fbcf32439d18f83b4f71b36304d80f7211c6a947b3259f1049c8de726fb9a59432a5147c08c408d508f4af8f25cc66369b19f6594b1152a985639dcce23cbe5b5f92fccb6aefaf69da6b6e83d21eba8d494713baa8677333bbf93a94896b267ce54f9d5cfacd5dd763f570951823175d1e2e925cb4dddca08098b4a00279938cfeeb9f67e36f8af18b3c9b1b7c15df67c7efaab41a6ca1ea9b0fe6924b49eed6c7dfe87a501c6b89daf7721cbf2159cff29aa1cb874b41f937d771164bae11f748dfce87b2d882bc0f318dbf6541ed54908821d17520cf6a514c95d7d80aaf5c8150e64a9622655e6361cebe64f79c3ea70e256a575131da53a13db399cd6caa5437cb78e44792ff953dc6f1cc89a58660af7d10ecda5ef3c73827655986659836ea39e29a09bb4ac29f5c3783511987703cf3b5a753cb3ec835e96f9f699c7cba699af6a78b39515175063960506641e1d71f7d8e30eae86f8c341e29fd29373fe3307bf9bc6e609406790fb3af1f24fb5aa9f336f2b9230e89dfcd4ea07b50fa94bb3ee3d806342a940c79d4d109fa68d4a8dce66771cba8e6cccf9f25e4f1bb9ebffd66be1eb672999b5099552d5cb3831fe55428787b32d3644c3f7b1fa8e5b77a1f4efc6c9460cf6f1529bf15912598bdd98159d2670928cbf0684f5b43515abbd4fd4a4adb37fbe46c0f3384da4ede0a85447532faae76f79c3d4918d6b9ffd49ce081ff30dbf5c560a6d4ecfddd09b6e11f32d7df999cde7f6a90c5afa4e0ba1397f7c9494597df39bd8b55f224be92b9737a9777b14afead6086509d58711412150a74260ee4aa2791889637fdf5bda518e0f2a7df71b1fc56d1eeb4d836597eab2b3a134fa8ce04080b35f3c7795837b92484a511ff6573d68a42fd4b39ff7d14c297bee4b2a71c7b9600be723ece63f8de10e8e41e1f27f7fde39cc7bfbd6f8c4b32d0b1ee9b50888f3d25c52b5ef18a57ace95851072e985ced33bff2ba2ed25f30fb11c96196fdf5937e6f4f4793729cf9b8f1318e273eec1b6366c3f3e3ccc5628cff62743ae94f8637fb96d9f47b653e80f05f2cc22d87ebce971c5f9c073b0df8dc6bf29c6bcc29454a940bff65dfdf1976710f733cefdd1fcc61080f5bbe36a0511f7663ed5198a8f7aeefeeeeeeeea63e8417cd709525421d0650e754dc2c7b9c476911173372719dcfede6634f33ae9ba9255fb9bbd32a5e48b9a1da27d92df39175ac2c7bceba69a4884bbb2234ce486bc0675e8fe358d73373e7c49146c530cb03bf1fa2defc405bfe99e5c5cbd0361cf2d65883e1d3008b993115b3fc062a9b29655fdfd7bbaeebba6cc7ff31f0bf155c3fafebba5e22798d051ac4852d1f754979cd38afc80d060ec27defbd7f6f00f7d98e7f32fff5f2e1c54cf3705ee420301428eabeeb675fdf17bf9f70c221b1ebf11f4a894c27e4bfa772803f3fababfa99e1b20cb7729dc65df44da71d0cd8dd5b400861cba8445fff629cb01b42f8de93b647bbd0ce2b627f7ceed81ffb79623711c3a7cc0ce364666638068490218490992184700819b8f1790af53d43092fa44299f9aff71e5ff2e13f66dba3dd687d0b0abf9ef81f5f486a55ebf6c38256d83abc8518a594524229a594dacf922aa594f25b83b5964a50ca8fd7251f46c8d6bb1e29d46203126be19d1cc6f7d278ef4d0ccbe8d3b6f7de7ba3510e2ed47e52331397eb7befcd96eeeeeef66ef7163f9d5a4e2e1a157e4a727ea38ee7e6e002f74313daefbde79e034b7dd2089b234129a9763b7c4d80b46572f9b99b39d0a8dd6bb28508e58441570e346a57e7d4a613d46b72f973a051e7dde06b5ba8dcefdc5c4bf4c508bfe7718ba9a5545b5a5a5a5a6c8c5aa6c8c105523b490c1264f646353b8cf29ad916a4e916a4b52d48cb96a3381ac1d168c415cb7c6a46bd19c37468534a398e3a9f2ca3daa633a3e3cc53674422d5089fea6adba84723861a19cd9ec58c2cb5d3ba07ff684422dddce003552aa9746682f89541e99c9886ffd4eeee1ec5878aebb6998c1e96729daa5eb785280821841042082184104208218410d6979779c908611e0c0c0c8c378f469dcf9dd32ae100a996341f2d2717f85cdcc5a55d6a2d954ca69696938b0b0c0caa64aaa76ef193e6e23d5d85ba41ddbcf84b47d8d2723ab9b8bcbcc0c0a0504cc4f231934a9d7298013375fe050655b5c7a9d44ba53cd513e694f254aa39a2361d1b5b900d885f9aea143f1b373ae5310f07cc1163e0bfe1ed0e3bc638e3c3b134f511f21e26ea546de72807b9e7cdf2bafef376adc554ed84c3dd5a6badf7ac3a39b620d79d4ce385da85da558d94e38c5ab52d54ff79491536ea7c68b716b2166c2c52089e50d3b6b59663ecbc88e7decabcea847aaf6364547db92f8de1199ef70c33c8512a07793b22aebfdfae88eb1600d27f3a6763bcdd6147ee6e38ea4e50fa3f4ec6ca0000cd29cbd020836a06cdb9ae46006832340d455c388396c30c1a66988135d50604763f0d9b4e7ca8d11093e34aa5ab4952ad740471fbdd61cf8e191a1e3d56ab1c66d46ee632777cafebeb1e983ab08cead0a16d3a74e8d0a16344d2a14347d55132b59c5c5e6050366ea46270e488e1390b001919669011eaf00e800df2baed88b86d77b80165ef57a3c7e8d1633c5d7ff8a89452c6e7a7db96a31694fd15f91755be8830ca6bc2399ff764794d4c6acc13cba80635ed796bcc19d5362923381a3def113f6b1b93f859da6844c5e5270941e1e4f2971c0a1334999eb7c9b360f125fe83250b962b4352be20923224a5d55074503fd14d2e7fec279a8963b9fcef0a8b61e5f2473180f0e12cc5c70d6df7f7208c124af9bc65fb7b10c6282f785dcffb8251caeb9a13cb60963defec9a189665946a1bdcb6e7bd6554d3b66d34225558ebf3ae4daa3048b7a905b6b43cef1693c67c62177e79d118060551a8e78dea9653907e81813030cf1b668e5239b8e54bbacc51a7017e1e59a0edfe9e0e8c51caeb9a139be2f26751e8f2675b1078a3938c524ddbb6113b33f3374722d5e64aee3d59abda92a945336d45ee73f721ae7f572ff7a862dec5e5e5a55fa2dfb6dd0f975d753ab9b868cd348c5250e40148fac2ae83c0976fe1f8d697285e9eb6d6f272499533327a669afabc912ac74d4ee32aec874fbbd14b4a8224526d12e47a2a473a526bfdd1f3f4cf3be2fae9db743448226d3fb249dedd2ce53620efb38f7cbbdf4726d2aab083145cc8279f5c9853caee760ca2a6fb4be802083bd5bd5e8ccc7def3b789fed2e192ec6dfa643310c4361ff1e8498cef5d2ff52c1ee51d9f0a20a3b80549853e8c218d4c24c5425e87711e87664b2591bbe5023d09d9fc520252213b73f3a61c274be849b0e865d5c4f14ea7e1fa3505f11842b2675d804fbf14658cdd876dbc37efbd108c346d8d68e1d21691949a3d9f6f388f6468af8b9a3ede9639f71479060dbc634dca3eb6e87776e3acffff59cae77cfc986147851052885e2bff72a47ffc72189d7fbbde9355ec4f381ee31683993448defddfd3e4aa10e227232a51018624e6fb29d4fbfa01bdf3d201bff9a10a0e55bbe7b4b947a5815d3ed62c4e0f2afd51dac397d37e5f3e348e5b031d60677c448af7173bc8db7dc9227473e85e39fd0b379ad160e2ee66f70f2dab0c10b35e65b3e478e989f3139622c175fcb9ddce0e0c5c1710ddd6bf26e0cc74c6323876557a538be7e73704cdcfe16ee2df194d06c707c6f707d71d81467a4889f1b63a3b0965ed735b2f136fe06c797b67683bbaee5f8ad38aec9756dc09c68dc7450a7d3a905e7cd59ab14325e8b7b52b837f4c24926aef28fa18adaf2d9bf70270f7ae15aae985a2f5ca999bc70958b5e38d28da18adab15eb8d18da18a8a8d5239cc7bfa794fb6d3c03dfd765db8938d9b8ee97a0f3bde02eb76ef31695d09baddeb5e4bbbdd6b5d7f42ddfd3ebe2734c471400509660c5e0a622b9d4f937b5989575627dcfe1195dbbff56bacc5eca702b8fd990cbcea9f4fdddd4916324de703475c77735977bec6752a14d756647cdf6c0523238a1c901a2a31f4c47dffe4c3a9fa8e0108b583d557a8eb3de45c3e6ff07d84efb14ed0ef6997ffd4fe4eae6aac66baf49a0723a51ec134e7b9e9bcee7e8ef17482b34ed89d22c4624e97569bbe7c9da7037c6c94ca01bbf11bda8905aad3ef357e2fac6be8737be0c297a398592979e4cf69595e2cad1c128dfc03028dd367bc46075771acb77aff9899398a1b70e084b82a8bf60607b5ab1927f3efbb5a4f11071d24040a70443ddc1420fe07490cea1610905f5d87b8ade44a1c6bd4be50c8b309e2adfca7c5ecf5348867c39895da16b2eee3ba7e0207164bc6da08a9914157c8b309026e41f84f715140ae4aa3c6b8cabb75c5008b35b4c0620d2d7c4ebb83035ff6e8d3def646ef4d22dc0d9179c30ff16cf811f11a29398b469f84dc54ec34155ef37cce9b1b300c635decf9d90c81794dc7566eb7aeb0582a151428592a5b612b3c704ec3fc542863dc78a4ef89f4efdde72cda3c33812ac88614120166034bed644bb6f8072b6be19038c85a31b72d8c904a06b5c301237471145d972dd982115205f190cca494d29fd86742c85c1efad953ec391246bff44478a0f448744ee99b57d83bf6d5624fc27eb44d6a996930ccd22771a38d592e52509142e644f258c628957d7ded312e05843ef67eb1fadaa732eb43b5fcb64ff9407a4a371e4699fb137e665976fd3402620d259c73fe9cdcc957de52460a2ba20aa431872378de42a15433d1fab8a11f867be15c386e698be1f042ed17638c40e2f7c76feb83e535310289792c53a992469b46b3b805890c055fd64743e135b365c6d4dc0021f4e136386fe5353f17e739518d2c4a9b2a95932b4e6477cbf750aabae137a7b9ea46daae0284da3950d740cf86675efb6b7fedafddaabc6b27b0e571bcc55b1509592ee51f5322e11f6ce565b952eaa857503bf9f433af70d65b3b16166592576592581b5ab1bd36a7a5d49580c027a703a327c203a347a2734656494f233ccb88eb0dc8c3a6b6e5706511853234dbd340f7ca220a572e86d9540e2d0467b93cd4a26c8c4df22ecfb4533bf98fe64f8a2da25c1ee2020aeaf210174137893fbdaeebca90f84de29727fbf933eb995db6c28be5663fbd66daf91deba3824eaf4912bf86b22ac6b7c135f4e3a3f807f6916edc67d943314d1673e5db60957c675e555bdf4a3e8a694ed7399eea441042256da7ba73ca784df6314654fde893a36da6df39bde9b7cdee98bec52a496ddff29c63b24a529b4d3180f4a6f7a1f42dd6644d9ae9495fa4c5d6b7f2233b2d6fb24ad8be558ac86894f2a173ea774eedaac93e490de1a128ce194d57693fff947132ae925faa248c9b97d41ce6400d35d418cd6dd239b1d7306cb451dbd90519522dd3304daba8cc4edbc1216d391ac11c63f48f9c105aa7fd7c6724906ba00df4d57b2417feec772a525099c185ef918a1454a0b85008ed42eb569bfdb2007f1ed13fcb87abdce74750fbca2e804c69232ee47018623deee2e7763da58be7357acaf5f721a609438d191a2282635096e962685dffd9d2aa4264adcb33ff720d4bedb216ebbae4a6ed627c4d8ada65ad3bff46e7b201614119436b8d2eba33b7bfb3b9fd0260026cdcc35bbedf470b57dfca33d2776338cea87d318cc4387e475c4742bdaae1ccddb698bbfd7c36a5dfb63fb94dfdba6d45b73e1bcd57fd9a97b8fa5cb9f932f78d5c324159a69b11e2ac7529b5d9634f318e4150fb66d9d3bc2feecb17c3b2d6ed4aa596205421a4509c5fa894887fc45c7f2a8582d4703bc3e2ceef4a465c8facdb36d5621a21d46e8654ebcef00324e666444ce33223ba7ea46f976ac13723640624cdabfbdb4a86d0e136914ec86dcbf2463ec61282753b2259276dc7c2b8e63a99db3fb6efaf1c8f38ed37cb2f6763b647664807a8484185c99d2d04b4d36a2c88c62b7aad7f8ff18687c76968a86e3c176a5f22b1efe338cb8d5cb3582fc345b75bdeddddf0f1ebf76c3d4d99e54291d6a1bc956b68d4f7dd83e25e335febda82c9cf24914ab5e53f6a94745d970ac1556ee7e3e4f268cf33814c4dfb89e38d6195a3d896511c2f12b7accad37ebe46e2fa6ed9b41d5719bdbf367aafd97e341a31a15a3bd1344dbbaa54a9a2b1d7506ab5694d25a8385ee4d9f8c8b0f814ab3f24a75508b5d0a497ccedac1bc55d671ab56f9d1910f9d1661188f617d771d10d46a5d65b10f91d0d968db0cdfe0bb5877527d62cedb5cc76ac5a327d878d9ebe892b71363612d7cc34d9c34dead01d26ac9bcb13b4fc28b310038acb59a811250b35a0b8f071de0684ab688fb6c64c13df134137b31a4a8ab8aadf0d214b6a2abecf1d822c182205e45df8457478a1cb1b908eabf473a11ba1477f9fcbcfdc4caadb4ee6f6a909e984693a47096a7fd741f20645b87fd9c3de85ba89f36f73475a67bebe81d30a656860a8ef27dc225eb9ce45ae7b7d6fb806855ae7ca04b58b64b065b649d4be26775df3c987a92190a7ed7d1cdf2b21a8b3ff3d2825bc384e2fee0879c955bfe7ad5f70c9f7de83ddcd85da17e7d9247e21f424d78596a7df7340297def3dd208e771abeb4b47a45afaeb2f8c6ea16edbf7d38deb36deb64ca31ad528ed796973f2f2bc8fdf5c1299c3d8bc6484cf8b883e9a472afff37a56a2f645bd55cb394b4ce3ff4e5476d58b409e0b4afa4d6a705eecc279d8d3c7f1e67ec35249cf4de23a129346dba6d31b12df6c43ee93f8e581ff92f8e5c17ef2e58da2625e66d4500b0faa51e130e47e595095a5f60c0fdd6e72841bd5ccd03da1a6d6e408b59b734e0885e47e749f830992e52e29a594725eef3ddcbd8eb872c5bd98e850f72a6a5d508b11005dd6620b2c5a6c11862d88f655931242196459574957d64d0ca3b6abf431b619e48e3490a9cd396d30775cb7baefb5cba49cd4eb716e370f3d2b5efb6e8e268e32f88f741fe93b91441bcc3570b7806a8fcd579fed301c6ac0f7ae7751d73a7b57a6ba1ac7433339310c93b355be0d89e15e97b45106553285da9c38cad0509b1057394f0d8542a1a6a4177744474810be38586a5f37d8860f868100f5e1d889ba9d437a13b77d9db6cbf1819a9aef73e7e3f825377bc96a65e85e6c656af561178661f379bba67cbfe4bb940fafb429f93e57daae6f10af146db5727b3c886783b3e4d5406179b6d2afd4d7102afc37eab4f8cd4d46e2f269384e1fcbae7ff649574d2e35e43de4fa7a406d3ae747b3dd0d35ed1bf36d8777c5d728a55466189238ed35b530b470b888c80e2c252104a70b4170801772272622f288b81857f9c30d554ac2ddf94a0c9eec94fef44a945c4f6951cd32224ecf39258e08d3e3a0e4890fa62ffde66d75304185d0042957fbc66105b1eb41ddf6a1bd7f73ce8ee95b9e88d29f3e9abee5e316443ec61c63c45146ed1b63dd464f440b114f484fc4e94bef5b8a01a72ffdce69a7c59ab41ed4d59e42cdc4a1ae70c6122b3925cd4601f494eb54c46ab06252b3679af938de73e4970968a99aa010d2f0e28e4e9cea5d94b8d82260ae60c1959c27263b93733dbf5225c9919549d5a0eb9f52258d88bc9567a055bceaaf316af6f453512d1ea7a00c351d540f618e249808e67fc1ded1c0a8cc5ed0c7711da83f2364b93dc5caed3f82647e92eba1fcc8f9a680f892c0cb4c13b1f79991ebc6db05d0ed7faf298e2f28e07d6f3becd0b1324df3d5ef8b972fc20b2fcd2b4aab13c3e64ce5f06ea348ed3c698d35d658e3dd6b7e1be9ebe1ed091f4b7de2dfdf137b29636e50ac93aabe86aa188e4f01c8efc77946ae0b1fc765fc29e5bb39f44fc379fb8aa28433ee1945b8b8c0726971860bbac030c22b4a9c313f8025088c43691155062e1fe1eeeeeeb6cc64743decccfc8f1b0bb49b194266e69682d2d67ce6f1649afe0eb201e9eeeeee7eddef7577c30b41409f33333333c708a38c315ac857caa0423d4cc479678032333333db0662cbcddccdcdfce0830fbef79ee5d903cacccccc186824f77d8c1fe3f5daa633fb923d5a6bd7a948e1be0565191daa577d0d3b9e773cddb4b76d2b2a767afcce7bcb6d8afc4e00bca8e10bafb9a18ad710200caf6115f1f03bef56bc66c7efbc93e1350df89df72b5ed3bff30e85db30fb1477c75bcec4ddf127ee8eb3400cb7f1a226e3eeec3cbb1a77e7fdf41477a7a9b83b1de5eeecb4177767a7c3b83bdf4bdce6b576fa89bbb3f316709b57b4c358ee0eab717776f88bbbb3f338b80dfcb9e1eef8b83b3377e765dc0606c5dc9dd3ddd1eece43b7813b3bcfcfc6864703919fe1f9c9f0fc649e1f0074780bc403f2415ec8d3e797808fe1f9bd8fe79e5f0c0e8f03019f03e76d3cbf1bcf2ff5f0e7c1a0e71ef456fe50cfaf003f6e4a355f9f1f89e675d0589adfc1e978de60900e0e42a1e3697c787fea03d77747fbd03a68687e5e1a9b1a42f33a9ee6755824ad43d33ffcf03d707ce30ffdc3777d673e723d709dcfeda1871e38be3f709cc383e33bc37146783c6f3333dceb817b3f708f07f796f0cc479adfe13a1e7fbd941bd7f9dcede94ccfcc44fe19ee51c183eba1919b3912a335c283877f5e1e0df81d7607d7339fe4dd19dbb13572dd063c0f9be4dd0648b7e22a39633b9f3bf3cc05e1c61fbe1b8003beabe101dfad20f01d1701094ce03bec52e0d976f1594f01ae79c53f0109440002dc035697df011cff0f1cef789c37c3f1f05167c7d3d6585c3f6f3b9a87e73076d81e0ec2e5e1df3684548485119787e74d8707cbaef2d65bf933c0769388edea0eb6435d9c67e345403c9bf7b300db4d05d8aedad7c176281f436c5713603b540eb67b21b653dd20b663dd8e8b8070d16b15c11f1ddba12e0e9e63afc5b1077803d8025802701206b57ed80e3500db55d3dfb88ded50354102b03eac0d01a8e1fb996ba8e179d3a9c14a16d79716e196fcf0487cce0ff6498f1e504a8f2857fe0edbf9dc1d3cbe837366c676f157cf839b791edf3c22f3609a196ec7f70624be8ec7793b3855b6e9ac9eae381d2b1dacd26191c0ab523d6d6dc5c1cb9bca42b9920bd97a36bec457f269b0dd9ca12583ed50570c5e49962fe32c1f00d6da0e75dfcfb369287825593ef75846b9f263b01d4a6399b17cec5febd9f4125ec9c7615f8be5c7d8d6b3b100af7e9e0d0ebc929fb21d0a4b25e3cab76151b69b5f5cf9303f2fb6435d172ee8d9c8f84abe435e49d922df1474fd74e557db55f924db4ddf80cc978ff346aaece766c26b5ef18aef65b43d8ec58ba600c17d0f319f1efc9390b536d0d28ab256d6e228648144d62aaaf5bb7eeda9d47cc33e722593e9d94dac6b525d93a99a4ca6d7bcc6f42f5ce5551cba89372ad6736d7ba25688c69d70e8b8e5f2fed485eb4bc46b3497d3bcf4e7a5363584fee9e99f6cf54a133c3b07591ebf6e4e71620d26750137f8792bae2830109dbe60428d2a2e5fc42f720079b0849452ca16054a025015b021001911c69546440104f18b317a40c7c8c17d7f42699787c698c1182ab082e52c2fd080861130694285c91258a8dbe5294d84a10bd544c6edbe1ae109b7ab34a4514797a73441a40ac3104f69c2083330978798d0040c554ef013ce2ab060a80a52eee8f210184ec2504fd3592c24a0b060f2f20a2fe2c7b6e2075d387561094bb0d0820d247e70031410a85861851b56f0a05aa1c576c41551c8504519ab257eb0c5c808549e3051c5cfc80a24c014810728f8810a4e519edc58e20a2fd838016a09206461b262061508377059e20a26e088c285cc1150a400c01150a890aaa26563c94b126d82282a6861421a4960314586285890295d11c6147050850842208616508880eae20463208185900d2084403b020cd41223482df1832f6c8c31c62b8e9039a28a1ac01c11638c118a095c8eb0a2899723a8603a020940f0c236c50a6b1c3145053c98628515b774798a15530840075d74f183a8822a9ea3bce63bc062a1e4cccb4891410d9090524a2e9e208d91c529d4f8f16304922340a25b0006dac5166530d13260c21170080c305c795f13304c411484022ec090c37a1930a470e5e52130c2b8dd476913b0121a8c263a8a7a7ca10b2f2efcba820b1f55a50a173efc276230825e33b30423dcd8c4882554715f26cb07cc3f06c034de8369fc85e84064885eb273e3f0f5b8deb16eb8e96180eb4fdf7c364f6e98c6732014fc791d72aef2ae728885e1fb33e72c63741c570979af244b96215c059deb2628a5af0310c4843e6fe2c2874f5c4057324de61e898f64f26553e4ad60cde88b3c08035695806b1a0a56c187d27a0c65d40ec9753f685ed6392098061e918fe4d2e4d604ff8077886713015fc177d5a804378f3ad1382028c034f025c03db09865d13693ff40fbbfec08924add7a77fddcb824ef6e4fe7233d111e203d129d43b24a3ae7d1f9cebddf384de7217997d247e11379364f660e044202dc033ec65140d334fe316d112e024c13015741696f98660bb5e32addcd0dffc82e13192425bcf01b0aafd12efc0ec36d6c20ea29a2b486be907ed3fce3c66b58ca145e5cf837788d016eb411709503980692a8a829ce8142857eba50181815cafca75477a6837c741d04af7c80d66799ee31e662b8cabb5f696a28b67f7373c5024cc68d12a480b9d96dce48dffafe5898d9fa9529416a5c78bb7e4c1e135dc40516601ad6dda8d22b956aa93e148a0b37435e127ee58a18d68b462aa844806ec74545fc230afc83dfc3709f3de2fe8ade2b6a31346781dbd840d464f88f03f9137d05087f401670fe11af7fe5e27d403c2af792601affd7ef716b0108f217e5fae3f62b5ed3bd24ae7fe745178b639b4e0f596825c13fdc474ed40e158314950cef7aaeacafd464f9790e14847ec4913262ae53d04edc6e256e1719d1f54fe9b9bed745cfb9be975c6f5be96ed8ddbed9e6e5b7ed5f3817eec4b53027bf8d1c006ebd31bc865c53d3304b84074c8f44e798de9ff56c4ceffe769ea47280d14eeb5344894f8ee9e75bf51331f053edeaab6e8306f0fdb83ec805edbb0ac21befb3383f5cefba62952bbe224b00a215011983db69f7bdf758067b271ca6818f450c83539a40d16c209af202312e7c5ee24c5e80e58e5a53824070bb66c185d8d5fa18aff12b5c5882db6931de225ec34354a45cf811f01a1e170e89f707fe11593e9806ba658d50508b3c9b7901b6e12e038d0b8db8f051ef65207d8a71f6bd0208e03e9a2064b841407f2f88b782ff82702b73351b57d3b0ab7db38de9351357e22a47e22297fde3b4df38230778314e993bdfb7213150ca98c29ddae44e38a81d5b09a227035e733d7c245ed32179370ef14abc037238aa422524680fed4009403904e0cb4a9a0a24a88114728a9036601e5096e9b8e3c3e7aeeede0ebb084edcbdddfd3d7f1028cba47c50d25710ca911f1f89ce79f280ebe3774e0a064a8e121828392f86379729a81dea3ee6515d1e2ac2cf25c295cb434428a2b93c4404a1fb9e631b16942637e062053c4002969c67bb1e6d7446e5212238b9f0f9dbddbd901f9b894a65812256459124a62aa2ba331a0462cacc36505187e2ba4a747bc9c9897778fd7bd2a3f7fbdc776883b8e1e444f56901579d9ca87f8d01bf9fc26ea006ea7a32d8cf36e5c718b6dc743a1a7163034911babd15a97523d2c334dd2220eab780abfa7750752444f46c1a4649d450da10217a30ca16418ba0a7b374ad7dbf3bf19a0c889e9ec6e2351d17dd1ea6f9ab7159c07a0497c80e4c01f114104b73539e02e2968b885e3f8aa8892ad08d4696e7824386cec2e3f6d718e0f66f71fb3b6742c33f9886697c038269fae70c6a6b0dc56bb4fb415ed31ad308655d645750413816b0426447887f41bf1be8ad3c831ec6c5cca87d312c07bff0e9c76fa0ac81a493278548d78a42fde3e0e0436e43c4bff02af0ca25f26c68145ff95329d75f4a3ff1aa64217a556ecc4fed5d4812725593a8b8cdbd8b6252bb998512d12f5c259d5c355ce5e3ce2c4ce34f7292e53ab6a476f3ce592b0af5af52352a0833034aa8cdf9cd71b23ff69cd75f97ed1ccb8d516ea48232012a84ce275ff580852512635bb11ed4cb4ed6a23e089f42389ffb854f09425366924a4dca997ba5c1a8a73d9cebc87b11931806dd067b0c7baffd29066238a843b8ea3d5441a1f6f74f12847888f11f858a81cf592ee47cc4bce744c8c95b9d514f4e9c5c9f53e85da14c80cad355f09f9583042c2eb691eb5ed061d0550c73876b0c6191a0b63d626488cb83e4cdcb7646ae988e0583da16baaa0458f670f2c480bc3b194e9d0959664d2aca9a4050ab3717bfe19239b13c2bfdd00aff8891a3c27d900799c36f6585d7f220f9f25d8fdbdf62ea9beee6be6edef854a7bad8c77029ee0667834371305c8680dbb693a8266ac7dc64e0c5763d5c6ca76aa97396eaa6d1ec4a3fb990ebbac9601a7fd2772ad5e8fd63980c2a8c98ca1d8d9ef966341a7d64ddd1cd1d7d01d8e6e606fed13f1a8d5af7e6d974167825d4b5108f4105277cd7425d0b6971bb16aa28d4ab585d0b9161467d1fe4e2d40844acf96a87e44225f4618e104c2d475195dfa1fe4e9becafeb35b7a17f514ec657fe5951ddc1d5a09444af9e73ce2cfbfecb3f9c665c97c10c9b994fa742c8ccf9e0d4ea296b18b4d9d91b6fafe5a7a5d2de14792b9fa6b71aed70fd65536054ed5360d4aead7066d4b65194beb158a9a86eb5c27081c988283d4b275bb2456a95be1ad73596be5d85ddd991be59d656603782d1f02de5a485cdd6d592ad693b9455b5652624c78c30bbc930cbb8953d8e671964dd2e7b1e7ef81ca960a8742eb6443dea508d000000200863140020201008874402c17040224aaaaa3e14000b8f9c4676609cc95192c31832c818034400404400000044a4690321f7ccae0976302acd97d54fee32feb8a62d542d99d189e5df9f2883f747962f2bc4302c4390c228888e3d72ae68a76e5cd1a2b1b1acb0a923dada9b3b1647ec71fd7112ae02ecd33261489d1927f6e3fecde95f7ec896c6558b83dfbf712cd17c02a8bd32e1f095462e377843e7a2a173024cbdc766827e472683ad1b2cfa1da2fee90135339a0696380a0bd12542ac49f2df84e5291a503b8b76f972ee78678814282df7f037fb8095cb9839dd7dc80a9d843eeac112e17984d66e8ec68f7c8150bd988330c1e464af110cd3ee32ae342942c257e5e57035442299ccc6cee902120ce89431b224b908b85bb6e49ff8425db47d0487761090da72df0ca202f474d82db1576dac517a4cdc2543861eb2891a303f9fd699fbf4c1edbd18bdf671e3d9ef1b7fc5507ccfdec751928601877bd34e46671259cf73e11085189f23c79a9663cd8d5ac816623cf2ebe8a574b35d88a5d1f63788178dd8cad05acb665a19f75814d23b423798802e102887a80aeb2e96bdc09f75de5d0e1e4073948b8d1e4a0035e500ca238c1b77e69ed1d2100648384c3d53b6748cdd29f44d1699b3839bab97d96483fdca072c1d75a080ea1c9e614e59e588bed02bd16f5a3439aa4fd1b6247963ddc033f7fd2b05918065efcc8d399ead641144213d924ef3cbc210a890efcc6277247343e4fc2591e49638c121a639b81bede0ad0d51200e80fa0807bcf99807040b818a01a03e92458d9d3a434d096f009dbf4624cb693c2876de28fd801561941c02a873043c634b5e905091908787dc4a144314a0e7a3e99a8a08027feb8ceeea0e94805ff16c258b0c31fe8ad1f13f7d4df5fe58e6aea13444466c26f33a21502e4c43eccb9346b1542afd1ae43e9f67bad045e75a58a9b9e1f79182a194fbdfede23a57ef658604c886f6db743a6a9c1ca2a1f64f45ec7c30fed064be86c81cb28f2a786eb78526f6d56619250620edc2013ee0c0e879fb40b0e5159ef11c29a849ca98630c88a6a9734f66114f281a875d36a4e6b3ea4fc4d6244ac4a848e6568d96fb22c1849d262334af2b5cd8961c35366c78fd4869c663004d78ed44e3a0d5158c8b9e5baad1f95e21381e42870bcd12d1cf33c1819842dc19413fe806284096ad2a568ec2a1be4b667a18880851dae4eb13d6c0e22392f91cd6ecd32a73b9b1295601cf2cc91624631da18c128703d400af41c0f4b9df0f6eab702b1a51ff17c43090dafd296dc4140a073bfebdaa626269fdab5bf55ee015c9e9ab66279b9d9f62013dd0a19ff356c2f028d763ed39a4ab36488fa0b972f2412f5bc907603fc633d51d636d8541df9862840f7b33232ca849d07bcae2bc4fe4dc3a2a05bde666f102f5aa5a0bd9488cbc9b64dd4743b66a8010b8aafa5393d265575257ce4e4d64e319bc2356b4e91ec9e9b9c36a871fa3ec354a644771c5cea3f449481915f55fa20c0c25e2e9286e1b2ab347c025b0ebd52d2d193254dada49098d46f0ddfe6c15e1253c32fca19437c94c927e6d48172b4f086d7d94213aca296642bc0e7fc5027f72cc27d8c9221add97be184695b7f2bb0afe58fa2e0f1b642d0476720003c0a23fa1bf34e60ab769751cb9f2d43bfc82abb9510b5aba7eb582696834e4aa883817d9efde107634fa2c08723adc43067ec16e5dcf123bcf06e33ee4b1d88470108cb4e5b033d2ab0a05091628378701ec4b6a95b72face43fbb685604133a1b4601c8ec3617df01c6563daabde7b38a576838ae12bf20c0f222f902ca4c541f438bce9136a00f3b5480e989c057abbb3534dd0555d442a3520eec923ee19bb6181a0304a88be0e3a1c8045c7d00b2e6932dd336dc7afca2f6c18ef4742541a2abab94e4f9f48d5fd2927bfcaabf07f375c72dcf40f90df1247a91bfee08683e5d94177c641b0ddf328317eb6fcec9b6172df256e0866c67fbfeff03f6840b661776388167f8e0ca57d0e57a5671ca54e71e55a6fe0969b22a69792a2bfafef8c378cb530c53a2c46a837b0e40522a26588b081cc67437414f0f737703bcba1e32ee17ee34923e0001b5bc815006d74910ce97d01e3524b48635eb234978f8eea7b77baa94e48b8ba0f1a99721e9177829e015e27cb1d656a11bf14ae592fb3bc6d3f4c53e2cd0fe7fee28a0ca5bfa8a3a2e23480ff75167421adfa4b14fbc819b35f4f80730e9b103c9e5e4f64491f13e094e125f6f98c169072b8cb7084c5d61a32eb736a2c02b7f6ac7f98abf0d80acfce4c79cd20cbf4479471fd01a3f7cab945459f187c1f8a27a0f952ae08f0664bfc70260ead61db3fa37808e49864752379a84ba9302723cb43f918fa3727a97b0b1fb182766f80ee3fa84f9d40cb0d5623ba93cd73cb90d9195781c3ae11c8933a25fa3d9cca611ee090faa38df52c63cd78520e63fb23c889a95e116e46682e08040138c5b1048f73f20965d8fd35e5ac8620edc37b6faa06c0662504c9a6c0dcc3146537584eacf5111df556b47ada6631587ed18ea57b007f558b0e709701bbd7909683ea337e4c08a823b031d17cb4219891b6c3e1de4a92f797e29a4e500693759438672e3256104cb02a33f91453a52303f85c5a41421a52f3a53c221368c4ed91306b7401ce0d2770bfc0375ec0884c8567d1b2528a4fbc062504af4d8519765f7acd0079ac27f60d688d441c779bb0836c8019ee2aa0c53750b2a4acbe422cb65116f5a6aabeb308b660d46311e7eec916e7d8a6f8f3ea823ad57ec0f485c5739994bd250685d1b230163b9a30419d5520cd069ec0568be213171cba77ec9591e47a68b0f084c7787c895a6c902b340ce73790ac31bb28e2769e4f58339840b5c140f9d31d4216c09c99329d21b66dd46bace1a2616049c81d56610353c8df626367b47009764482c773a19f4ddbf52ab98affadbb66a043ea84bc0d3196106721ef7a0ee6c031c2628d46124a8f3bd87d6a051d40a06fee4c18f7702586c0f186dc7c7a3f53a5cef24c129fc85f6bc0cfc8a514fb6d9c83097b2a981b2d2e7061c69d8b25b0b21ccea53ed65ad1dbd3020b57a09c72280d25611dcef09f055f40a9efc1c8b5b40738b699ea0d95f1a1d0170b0fc88f12285709aff88d269195b74662a9a25209e69007aebcfe833cddda034c88c5c07a132041ff3359c09077e8a7dc4626f291ce2188e5922733c114b5af2e7a602cde0a1ad84e43f6b133755f499120663c1b49a73a79a617687202bfb8f71ddbda15a198da0722109407f9748773e830c99b8319ca2b2591271d651ff31d091d8b4beb1c0fcacbde0e896aa1a6b899521247a354dc75fc9c44139baf3eb48fd6ce5ae785cd849fbb4cc84db4a89651fc8d2c2f82feb1030100f65ef518643b4257a111b2c59d708bf203ec381655427f17436a8b3aa456c5180d723dfe8c0a76aa68a3d23e0da5ed2f963a33b2dad0a823f37b3ae606e666ff28a31d9bb0db671f77e1e0b2119d785dcab68c52df840acc7beb606322a9898ba8f5ba0652d454da580bc4ba681e2fb2459948dae4b9499b0242d20b569564cb25780243e1d69782dc887aaef0e0b56e3c5a40374d69d1ddaf9b3bec9ecdf738fb5d22e3456e7e5d5f97ad449cf6ce20152b61bc09542b15542d1540c2cd9661004bc8b9e8edfbc8b99233005d0caaa94b285375a77848cab5b71e925473bb4fa7ce2fd1693900a9d7c35c00267341924e36120341e5cc037477049522636834fccbbcb13946efbe655f7722850c13b9d667f23a28fb168f807f705299fcee988281fdf82607fc9b20b285134086ad35aecda296d8826fd001d1dd88624de39e8791a2aac1e6662311c0012a35a20659b06677f59ad60c5c8a673ab71a17fc705e0667a017aabceaeaf9cbaa4e7643024d7451269a712bf9a94463cd118ab9e4beae5f8e30c6d0bef50866c777bcb4b7e15edaa53df067a4b9af6af5132eeeb7a6982b81d21ee77ef47e04ddad29325862e7a2017fa3df2656e2a9672b0f69ddc3fcfda4b78e62ae3f4b89e9ab51b8ffc6a0c4e727508c371e7b03c7d9973c3bbc441881fe5947b5796b6687eed79759d780926c2a45ab7013a5cc65645d2198996b29f877a28d86456328a5ab711a2000f1ac240d271a50caaaa9ad58af78627bdf94cd0e52843f82be6615464e003e72b3caa625a43591fb3c89dfad4224b38ccf9d22130f8aa76423e16d7dab6cea416a14b429f27b27c694bcc57229d1fb04c90ba88d315115b087d7b50a1ec5d130f283da2a7866ce79d90f35a43f12a07e7c7922401f714de90b93e4910b5d5bc76c75123649ab7cafb44d2cbc5ee46d6a067752a310c9185c44bc329341edbb056525320ea8cfe701e471d6fc36b39dba059ed3b6ffc40594dd18f9e8a58e6625f26bf4ba9fc16fbb66d6133fdfa75296076d16939073232a5689011704bedd6506d8ecddafc1e8bbbb595007805ae465a6eb86a18eeb82ad2ea5db1e7ebbdfe471cd7d0709d7f19c952b0501d03ce20bc12f9373f16340a1078e3fbaba077dc1901d5a48a8dc5bb45b783668efdb847a19723828bd802b386b56bc957522ab18ff1ada8f0a8fff9a6abc22a2177b54f52d8e8537797d7276f2d643833e3661bf514108df471ec189b09c00524b2cfbce467b60d84a3341fc528bd0a54d74aa0a64b5a058e02f707fd88baa311d4d95e6c7a290ee7f464af9df5247fbcffbeed48ceb3cffce345d35d8ecc5f0a06041ff7beb2494a7eec704f627e79b674f081a322dfcb341e6efe7980845d6a5a2140dcb831278f8aa5b2206d8a43f04d2861032103a893eb5878251b80909653f29cac6a2e1903560c0ebddcbc71c93d997b798791c79c990288829c47ee6f220982735a65cc9139a1b7ce538c51079c597c3a38d42ab0339583d9cf810c4869261173b8758db92dc7ca599ee9c6368bd64a91d6f1202921127ff66471fe88534c92e49dd98871a2f8d0b3d09adaab6fec129ffd1ca99f773ad402ad3f6424cc8b5bbe723a9251bb8e22f410678012bb032210e28b7201f5f9c4624bf13edbd56f930ed666087d0cd4913b7b89551556569b509382b792bec0385665771790124716108e7c3eb72ee630366f42e9bd600ca4481181e508b1693009c859c001b0bb20aa05b63d1fe0aad0040933b3ff51e9e2bd1084ccb4d95b97df58956246eb68a8069e2f88db511f77fd977a967e5459bd344a75f745e5fcd23412987791f803b0814b105a3d0af7d35c4fd0185ebcc9f84786ef78132221869289eae7ec589c83c61b12b0218319f009a2c1dcd7420188af3d7690fe0d83bdca7b0e191225be76b90ec7f245b7906d67bafa42aca5ca2a1c16cdd4ecd25f6f49cd58bd5de9e4ad584998fe5c7696b08a66e0f5e9efba7b4240a316f6d5f72eab448ce4410e0c896dfaa2c9c02363fcf9e15b5e28a6ad79a043327f5bef93626b24e827f58a4bca59138bf784b1b1ec5ca27a2890256e398194bb08ca917730cf7a8177a51e32dbbd230e66fb6f0dc6f819ac3580bf3e65afdbf5f81551330bec6d2063a459100ee73ea9a6568cfad1f4b235bb987482fcbf798415a445a4eb139142974c1dc1402d7d44aad4bfa6149dc8ab7381f6e471af6360a055841be20da62411b78f95f60d3de3e2a6a72e5767820ef146b0e6d3d913f1f47aa2ba956ddd3a93e631731743fe44878d09ea9fe7bb0f4d3d32db26b59a5f44261d169c67996fb9312742d91033d9184bc8ba1eb3b04df915bd418880813e47bc4006a978b017c5dfa664c3747998664431ec96a58e45da6bd64b0ebaedcb5a93b75165f232164e176b1abd132695d0214eee2f80a4f658a73f125a67a75087eb2925c14a4de70fcc734560e24d886ae9e0d987639e84716e327f8981c263907771094069b02338fd281a735bf24299c675de2b6e118ed7d069b106c0378fe1b54c1f239c17ae49a6a05811a9b3ad10a95ad8a148526a2eec8e08b1a157cce344dcdd1bab02504b6d764952dc812817a5537f7698a28057e7eddeccfb6e1fa87792216b1f3a998078bca85948b0ec031acb90dcedd1eb8be18a4d0f65b591f59eb9a8597b88e2e7d0e94af00b2ffc730328a4cfb66187c5cd9de7cf52e450b6c606aae609f29917c6adf274a2f95ed12b346845ee869fc46916685cb03b6773d75d7fab4ea3c13158fe8b06bbde8f082c18c77864cf081df70e589dd60884a8f9cf55015760c05eac329279d281ac4e25830598231403c35e00133343b4f1e1323204800c0871a94d9ee51e5c895519e26822ba245d4aa0543e598f3b83ba1de650dce90026f69df421ab0583a407910288ac60ab78abb5d3c990815b18b211b540a3d9c4f58ffac6e230dc6396c07da5601230b4f487d0a87efe0414ed5d0c6de22b60abad9a30d287d4c9a20321de68fd0a304f430446464b8627dffddce650f0a459353ab79ce9aa43473ff5276789453379f4dc615c8ea442dde244b0737d2805f102e0c08e271f98b2a70c2c3ae772d71efe2419d83f1532e4527e3bd9012674224569bff780a6eb0444380e2eafb4a1c6867b147f69d10b3bad692637409ac25bb1db5e1d1a0354b96bf0d2995a95d50f9a6a194020ea860e5b981601f42f0d66a76fd34e9b7cb51f0d7189a21305161e7a3481530b6d30c11675975ea4ec97947327af8e05ce738e7576fe3530bafcd2125b682ce7ed236cd553f7d172e6212416b1ea8db11ace7c18d274616925e3a936dfd42d2c69927837b53087dd453cf211c6119d3b134070c40b1f01bd0a2c5173b06b2c95edda0501801e1cfb379e09793930feb0ab65f7c1e30f87d36ec810c5c87c84aa7c193e1a9f1cf5318cc395e29d51f695ffc0b120c9d167d09ec68f232241b496aa56885a79d56c34735ff8c9e58c033cf5defbcf44ce0fb7f3735022fde43fa9fe21f963e8679e630c6e11d947b0b0a13af7aa1549c790e4afecf5eb86ab74e237befd855906296a59a4bd883f2d7a907d0725d4bf21f60a5f793e42552088d084ec813300eeefdc44f87e5a6b4687863f351a6eec23d316df5c02118714ae0295ac297b986490d52ad732df8af50b7d9e741b3ae54aba1658f41926c4911a58427396ef372ebd7791b75ed10a87cf2158b687999fdbd73eb3cecfcfbff282c41ea5301a6ef1a2852dd96efb94b9e864752ed5216033895b10e18b021bb151c696e54099d76cb17da93e74d3f085402dad67866ecc8245b08b846826925906095106bc1b40768ef1aa2f39d9e9914c970ae6056812f10205ed9a3883f50444fc03fd9bc4520fa35304c4366c57db67d4af6b4d05232e2c9b956ca9ce0f77a4cd742e016f14c46c58283e7a23459bbbdfe12ac9822d62af6612e6ad2a712ad4482aa5f8a45089a384e2abea15a89a2f0abd20811d9d53683bb6f02305f204545002e9ee13adba216accad9ca9025c77a5f9da0774ebcfc477eea30a3b11d135216abf634af7132544117f3fc5056588055e36c25d1f24bd815c616f52a2db7c28730679d513c0204890d91220fb200d2640f808749ed2e8fe31583025a7c468c3b477574f971cedf8d33a22f4e91bc41e257c29a264a03c7738f8ae3fa701152f203b8a640cdd2c61c66e0ef38c362414ae57144428ae0bf6902f7af9d459bd64294a78df53847b68ebdccc76049cc265eb9875f653f1738ae6ba1b6b015eae75a00a321719f30947c7e6746e21d4e2d2ef14db422b1daa8544ba2e991f2485de348bb973721a550e61306e59bcb8dcae0b8c6190dac88d5cfe242671659173721fccbf6bbb23c30aaa50f82383eac923a0b8cb076ca819ab48f7b48dc3c6458937c254fc8314134b04560317e6f032e337908f63ba535b50e80a10b580ba1e062edf6a1dc876f25e562b2d3327c77cbeefb0672f2682e94e450711d9251740724d99df693061532ad59a90194d28bf195960b2ade0007e44811df02bb48e519d9c6980966e6a35998e6105ca18f5aa33e1f22e15dc6bcdcd4e10e783109b66f1dc0108207f4fe4d14ceebc6ccc93cd8d6ef52839f4422fe804f47b25cccdeef71885928ba8ad8e0572f6ef5850d9b7f5e6a3f0d7a907847212fd23c9bb984c972fcc48be2b0f4a5b3bd938d027753d88bbfff0158448b3e8a614a3d68f86d86f313e78537afd91a140deef94cd71a0951817f7983e83a0b930c59a1baab16645e63dc33c583cd0de64e02a07be9214448b91eadca463b531306e2124876520bc4b5e7072708b4e7ebb04b29be013f7f9feeb707ac9141f7cc0785715d6559cdf858854bb3522f7b506f342e6179d4030ea59cb4711dd4fc3cdeb64734bb16b56abaf4713aa87fc3b0fa5c05d9fc29b9e2b3a399b5c635b521184a4b476b05aca21ef57d9ec71742a7050e095a38459ef38f16a443bd5128b7dec70141c5ee853ec8d782f26349c07227528f00c96efebdff9a28674e975414c6a1b4c1a07e0de75253d1b521e57986e28c273e480afd7e65a0a0845b394f7f940b48fe3a1841abaf723b9289810f4ea457510c1d5b6fdbb6d5742d0fffc9adc0eb80918e8b58e662342d4820e13d3f3a7470bb8577e6f61d05e7443eb22093326a9f598fca44670f06a1b9a8463fde3a53509937184d2069980b3b282286fc97cfa6f1fda6fea06165660501d798a19a1835cf2d493c5f3c2727e4fb0866d1ac1284e506529c095c7f933e5d49224d56dc4a67d013052aa3e3f0277511f7c81c0fd2f52f6da10844638b31a84701f5f430e565bdd711080974406f15c34c74ebc4628b5e09ad55685f84504e0d27e08fd75be0b83c416f63a62b7270808f175118b0388f559f82a15b3441e51921582dc48f57443cfcc8c2087058291282f572299ea9d4bb70913567711c9da4d53b02adab4115f620058322947ac4d58f793f4cbf7bf66d490bc85a8940a88ae6e432eec0aaccb0e2791308e56acd4b046f62bcb0c8137eb3d401f919a0fd1b8de354cdab5214e4263ce8addd41becb42133c0daadb1a22d47ec1cdac862bf8e58c26e608a787739e23794abc912553e42eba900b1925fccda72aad3064542144fc2a607278a0fed2c591fa58114eac62aa7b86fa25ecc95ce86367840bdd76985fcc0bf8a80f987c6a014d7d9daa1fb901974d69230d647f20e64e6a4e0b794366eb07465f437d23a83540f373f1f8d02ac706f46f201e9fbf18d9a2283e203c88df98aed7e76d2e816aef33f69f6da9adc981188540623607e6bcc83c84074ea6be30b8273807dff24ef749d2de7aceb341450e289cafb38ebe6a066298b8e875520b720cb06094bfcb157fa88989dac0db0b288ba6e3f3ac7f356d92d83e6492ba74670419be0974d133faa0c45107496fc62ba9f862fbb8cebe7174e174098e0ad24daebcc55d9f3df21a7f08f8e23d79681137f1acb3fafa794cd58be28da0e3486cc1086a6f2fd4a49779b818b765d8b02e9f473925c9781abcd5454a68abcb60e555f6200e3624fc947a4b27d080e2cff4b6d2a86973c7c6be8de3adfb398f44991aea2f74d8cca2dce0e83bf19f5b4035330ef51622d1f4a1bde2895b3da2b02d1412e09a4c0874a5787c30e9717c54409e73040fa0509d6b990d7387a810a7aaf7a90ac480be4b426891966a1c8c53e9990a0daeb6a11402dbd9746beb4eb331ace48df10ee612fab1bc973fd31d5b580702a7e3ff6b7605cb6b2ef1db46a6dc7309b47d6307793089689bec2ec07077c4e20d071a2e7149652d386932ff3f16493cd3f7f07f54ff6c3a06d9540ae8e047e97740e7f17ca3bf21fc9adac09645463a64106bf9bf93dee3307f8457b729c41b2597299ce15f8da51c3029544f8afb82dd5d8b6ef7ef412de5e04e8fb9f0351ddb7c209b3906ca68903167541da37557320cf440eaf293c6f6f53b73be15de64ffd2fcb0f29b19106070574a13b585d0b5b43e051264809d94ba99ebf610954bc2ac87e463c6c08818e322799a18df25beb3eb0f0cc77e0bf370140cef2314717bc70e909d8d4032a6b11958c95580d863c81dcb25050d33e2aed476c7b900847934b1b1e22fd44c84a494a717b237855b4974ca975c11b01ad70b55c1365a3f65141b5c5c0b92ea693188e71137538be38776cd2bf5476be562a2d14ee490115708a5469788be1c5048084aa10608e885fc8b56f189f066fe5565032943a12ab490df73a731525b91297ff86390869bcd378db33abe222ea9a0b6474c9bf25391436df7e0d82a6ef2ef68408782abc33f2a16f95e7d40af4eae4a1c7695fa061cbc84eb5f6a2b1d9d5763688095031b936d5e26927c42aa410d463752a5e230833f505a45a97f28ddf701321ab1de233b4b0ec17cc51129e74561c1e26ac5ad5f7ab87edc68f6f2f4702922b0ff403507d64e0014ed9896a0154a2ad666bf1f6ac164e29a6a967da525c2c17deb774d738dace012d1fd9c6b0d3b2940e161f1ad4dc2640bea644a87b363248e142a44e09fe3aacf9dd69bd4e2cf9fa39d7fbc234785026b43db9ec1c42661815e15145e215f97d60819fcc20ed0d40b88681bb2d475630e073c3074132760883530f74c1babc0d6bec3935ffa89288208e01040f7dc06b1fa12c816939d2394bee9e8e6e9e639c0c3cf8fa7e3dbe96af97c92795d24f28885f8704c765acf983b752a94d014eacfd11a7d4bbf91ea6021fe468dc9ad6a38ff87d6dacaec7d7082176666d763b951631e798563adb8e82f784b0019ec8916872e71a018ff365cf9f9675646e1294ff21350aaf3f50c2f1d4cb2d7247647dc8c1dde4a98f1cd94311458d0c94eedbc7e118ec8a94ae7ea9fd9054aeaae97e790421a41d7fcdf0e0c86ef59fc7606a7998ddd7abfde7709445c7dc194f383542c6b35ab47514a001aadbba1a2f8354ccc1b7e75cff0a76b32f13a8f65d18b935f2aa56e4451de9fb87ca07f7707e124f1d7c932bf0dd4d40d96d55991c56eb68197fbb9ee7c1b8c11a475043663ae4c7a3bcb90eb616f121de1048049eb7fa3cce111351a27760737418ba4fc2ea310fb4be468ec688f003c091c086ac66fbd9e1b7ffd82818fb33db66bffe9f18ca64f960340e4fc4598fd2c026cbdd0153817aba8f4b26a69c25a640d9753ccced30c8480a2f43f89c71abcc5ab0ed07366ea99118a75afa32a40f0e2ec3b8d4270c5613337a03f20f73fd84cd6a8b9a52b7da9395c9cf3a6386b887cb51640c2ae62aa0d4a703cc343dafb4e88803bc63839bf04d263232defbbf8f50ab814c0fd2c0af5bf251a6503f930d9fcf69398f411966450ebff0efb04c57ac72f213808ea146ce623c2c4ada98ddc27537f2ec474ab0a556cea89dbfa6d6612a0f0e6a80310ee31bb2e06af8e4405827a0acc033a888c70b86725574ce8ecf341bb42e2adbeea965c344e5f4d54bb3b0ed4ee0ce935c06dcadba58be0e4bb1ec39f2060d05a2cd2b1f2acae4cf28be8c2158374395f31e61baca461c1224c47c280f4af64c906394f04ab6c2f275dc14ccf93140dc6b2b15f6912e0142318a641e8272c78605bbbec2548770956c05cfc1d984196e438e0af0a557083aff18504a13d695ae1de775899d830eb1c097962b750b179f7d224b48d76572852908c8d6fef6c58032cd4120ca8e1e05f8e3654304a46c9fb1326a8fcc0ce4e1df02d04bf5f3b0afe4ab7bef27e79e6433ee270541afca3c4b4bb32320dc8008a4bda51b9810ec64d50a65f70f99078105b8914f34f2463e6b267649421ed1076cb513c5032b3a54c4316c67249a013bf0d54d64a15f4b805b055c74cb95b282daaa01716659b61ad7a24d113b6ccda833ae01fb9c8da4c827802e2b99450ed44396144d1233c035fab06eda8a24213b0f512959d77a70c390e66a4f94729b146dfff5f1a71599c8a93f300fbb7ea82ba794cc30ce8d08f12fa52e02e85c0b3661832066076267c1772adc04413dae26aae1fc4f64298cc078429134056299ad6f62c7c93ab0e7501359001235c2682ed3c47624f40d78a0495b6fd4aebac0e6447ab77c726df604abc89576de71c04e7f50fb85a368b2c13f0c2403e288bf6d26cbeb8c37f0a50f481f09d7ded061f1fc5c9c976e250395321df19fd0dd57e0f7bcfb34452088c90a05016c129c5e10ab7426075f03c8e4139cd5ee8f548688f462f28d6dc61b74aa9966e810ab3717e0552685af8941ba0d9423c4fb23827ee2861222d3e10ccdc938281040fc29936004b0e7be4991949084b1af7d9f62ee6780c4c6733f1728bfdfe2d6fdc18df81bded244028340de522fa0ad9ab7cc05f6c3f6ecf77326d889d6ad4777f2a95224c06402258293e9a620e9a134beab58d41a6ea0b668ba33236ea24e6a48079db4a24cbe467194d5d033d45a9d4e382551a6864bacc73d7bc517cf56372a57f39e966e96a435e8e0b2255298e12b4953fe03c96e4d3090ae33f0dc0bbe24e6d127ca75d05e0636277665d7c1dcaf07582c22eee236665c9b048f574aafbd4799a1e3c85039d2c070193828f37a43884bbcd0150e8514881d7a6e00eb736851c5af652553216665db87503f5211678a734248ab8e726d977a35b63c862521fa295d2b48abf5ebe9f06cbb982ce91fc349f5665b5b1baf28201237274d1b9454ec03a6c8dfd08c29b2d7d6c7828046c111d5b5b1d591815d0d950db63726527d7d0d865a1b72c4ed73c6809829b207eda90501411c5a7521f23fbf44bde3a5f8961d9185312660ff5390681ae53ceaac5c3a8b2a4674d62ae32d5f90299d776d37184e0bf8065d09d4720e32fbf6c9f47b0934e7861551f2713a3546b628e33e3e19fbdd16b7ba10eefdc8508a268a49cc5dde9dc019d6268ccf54fd54799c408d84f4378c658e6af828466556c03cc423fe4c8de9beaff0b9e099542a7d634d433b587e90ba4a59f61e6a328e8d3f465530e6d03b5128ce6d73e390cd3f8432866a0d64745c9d0d5e12720aa715780a1a735cf25b5587e7ecc836744c14024503931f6a837a6518d0fe2b18b2f54bd17895701e06a7ed02743f1bbb59b7245b0b90951fbca800b1d02df65b6109e2169a9a9113ded7aff88d8a2f61637ce539b36077a5ffe8e0334c528fd1473f4d47d51a85961657beb4acf45f4193bad2150b40f61bc94a0af4cfe95f386648ca14a169aba6e24e8e1cf772e111d2f46c5350d5463748603fa51605577c4a47618b92ab1da3f2a057bca460520054df519632e6f120be6bf6ef7bad5453a7be06d580003cf8c2aa4ff73cdea67d4167875f9d903e8f6d98896e6b6e14e6b5a689cca2d356878f2466c9464279e168f228309b5b8b3a689ea89701df7a11f2296d976e7d16adb611dba3974b5664591e70ef021abbeb702e8a41cc0ee71e802dc4f676d893ca3680dacf202f26d71d1561339f3ef983e272e962b7658627959a156402021275de3a4252c010f2615d5559bd1b253c6871ae7770d1c34922e39f71319e48789f17229451e650ad1a74374a74848195a52a5c2605314d52dbaa0fa1508b77a15b31a62371755fa2d8c983c4881438a05c7625175fd27e63b1887876943dbd83391c5545f3a4b3a3ef575eace38d8c52ffc39c6ac5b7643257ad4700e367e6fff63bb0f7e75ad64ce962a258cf2396f7c4430037f1fc79e372253963b7c474142ae6c87130bc5c9e2abbd511d9c6a78da9ed2423df49847ac1c7c61d72106a5abec084552bf621973771a1e5d057f4be8ee55ff9936ad86572fc766a9150f58d6f37af290552e96595d44cc30b8a5f11f7f2cf15cd543ba275c6a7297719ca71cec6de9b9956376c88fc6e431210d04c115bff2178f2aa648146ce9cedda43e16d4f3456096b1d053ee3dd158fd40644e45b6f9671614c1fdb64ff0aa1facfc550350541cce691b8c9b46c06a60c70b22ccd9f89c2436a0f09aa5747054909ab6f0d264013c81600461f00c4253b08a955ee6bb411011017468a8db8d6dd34cc540021c15fc0be53bd1a119a8a88c831a8d1d45f9d8d4aa764eb6f2280f57f4931d198968050e812bb388d88a1e9bcce1bf3d5418964d68bb4a72d202760a6d017efbca4d28199484e494e726f35327cd6f5c967bc7d9f6a3d8d3b1cc1f9fe77bb5f7dad7d8627332422286c704eb63d2f3280a9081ac6ffcd3043b14e0669b5dfcc28e39f54639ce84915ae8dcab46a4a13cdabdaa57e4f17bc3ebb877ed44d9c0de617a3fa882c5e48fee72547da7634ca2622e5c874bbba9b3663ca26a70edf1af215f0bfcae243e0cd445c2cab3f62a9896b2a9022114e19ddaf8ff89508146a4d6a914242fa925243ab0960aaedc2a9f10e4d3f667f8a94947d9c50feceeefb76654072666412c33dd9c876d93ef9253072411bba90d97459fec90586a05af52cd9430c4a2745f932a549ee566beafc0dc3cb84676889f25dc5888f006fa7745ca71cb244570dfd77ae0a1f0583f57e1f50ae31daa83f7caf1e65b79717738fe9d16e15404977553381407105ea631a661fb512cfe7bf1846115483beb03d5193d780e056b275821acebacb5b685d875d00143a935485f531704f591580544aa264e0a7a0e2a7420151e63ec7541f0310426e8ba193d078a22d9cfdd771914a258acd015bc560c32625fc2ea432db309def3dc2bdba1cfd392cb8bdf1cc4ada76b9beaacaa5a9cd5b732161a32b2080ab55bc73618863a06f0cd247c98c212ec6a824898c07ab3c5bcf300e6935895e0ed89be46386801cf6c6b4f69238685430960651c9595cb9536415f6560af5b87d333bd215bdf73de833ea6cc20ac61055ad362b1a25096a87934695359ae658909ca91c1d497dfde50d29e018e39fa765d551a2fc8f87acc29f53803d265cdd03fe74b53f0764ecd10e8a209b1182d4a650243d24f7bb667506e5b07f1e858c64981152cefc43b5899a0c26a97857503a53f8956dc0d8281a6b896c1537ab747c9001853ea9367bbc88b152c71eb7a195c32b0c06262678b2d76c301914eaad4bcf46d9337ba82e607a92f86d0cd862f70df9558190a913e5ff079ba6339a6d755782cfa1afc68afc51e2aa1d847e1133a3b958a5bfc5fb99bedd3fa076dba16de26ddb92b967dd0d7e22fa0d1f96bb5b0a42863462fb0f345dad790228399090f1ff449878819b58baef567cd7c42875d1412cd13e5e849aed40e20c01d16808380e55c20b9c2305b5a6a29fbbce60e5f60dc23aceceebfd7d7e92e8bd285e371453b997d0517103f6943d2455b54d234c6b35c3624d4ab0cae229f477f81fad01fe957a433f103b0f4c482ad0055d0313bc21bb95b165efacf43c3c45adc1a657a8f139073052138761bfa819269fdbdbafe60dc4b185c8e1b958bf630b6adf61188a435994c874f76c00102c09598d43ccfe66a593921f9d146364720a709b9ca8b660135b9dba6e0768ce7d0d0273a51915946cccf6fdeb004b05c6f3a4f53b122407f73b8cec46713a9b189a05da9ce9e7403e840c8875ee4d0cec3bc470d783ebe3d456fb6a7173fbf78a0a6e90dc5f870cc761c549128f963c4a534aed711c31606ea8bcaa272a83c7b1aa205f2deec7017d1f9518718bccdd0ba62e30ecf26abb85b07321c42cf0fa776b6411eac171cc86228bbf8fc2c9d60e7aa4f3208a5a3a46517b3dd8dc9754a242289d33b64aa66f67532e9aaeac554d070cd6e7eb79cba264dc818d6357d534e4f543eaed18e3c4a52431c0bd075b12f6023c8c3d62ff920401030b3b651159ba131474897dfce001feae96a4fdce1da9076a57231605cc1bf8243b7f716a834826d0ba9037d047b40132b588871859ce6aa151909c41d22b1a2cfdbd0103674ab226a9085fc79469fa502ebf60f921061921304757115e5b14e322efbb9ad5561fb67460facb841be7b113e8fa8903c808fbabb416acfeedaab1fd8c811ab3739a8dc10fc0b35f74018833c87ede7ef2ece7fb6cf221b9723ba6b16734409068ddf33d414ca301c9add28f055ed3c39c9c3853e1b5abc8d235e67c499165b41c5e881e6b0dec3264cd59b0bdb9a2e050483620866e48d6452eeb31c42f7f7704fe76d0b08ade64fea01c2657c64c5cb50758217243b43345938cd32c096aa0448e13c7274dc2f0fbbba067a96ac4b7b133b3f5c25663f6436c8a4803b4c8ff9b56645e26533e1c79f14246b1a89fe62ee128ec46d6c54077df79dcec064c1c4dd799d7c66c217bb5f5e2cb57c851a9c48a329ddb7ee1e7b4109e5f9cd62cdafc8112fcbf8ac03a40b4ea7e98a5537720f1170d6b85fc960c29f0eb7483bc340de8e4c07a2550d78cdd85a4305777b7f834870145ca3a26e355d865df665935df690e172bb69a53c044deee2b57f607370f011ebe0b0f702bd9978524362c98cc886a69b21fe4c6cac5e10dd2ac9426d6432fd3cafff5363f03db17214bf46c7a971d2dc625102911cd21245c871a68acd3ebe199c2023e4118421da1856798213d2a6e14864a2f5d32b5d2f6360995ac2e3f03c164c25c8d4a0d054927efbf1d3bd4f2a62ff981b05e8f5d6c01a73985048618704c6734e4cb6720c49fbc33c378c2fd7767b4c639c07c3ba39e630e68978e7cda0c130ccce0c0eacc2a6ec64f678a568c0d165c43a90683a2180e8f90f76c42e5ad0a32327e5018438a507539087f74000495cb0d6de08f2878125498fe3fc8137f2779824279a22ed6fb9ae30a9674f21a60152ca69e6a52ea8ffd7c93f3c71342164ed1f9bb13acf1fd32f4449b112d85a0af7ff6c4e99e9e201dc162150cde919e53d655f7f52438f66456f659bb83b553747a92cf27fb63c7f8c2d0a6769ff0dbdf17c34fbc65c522cc84b4628953b1155205036b4f310014cfad405dd410703866174fe4977471a417f8da5e89e1643da186d3737e9dc0a625ce7d977cbd670cf14d4a3a3b4ca11ed628cf8c50f91e61f36640755b6023bea6988e4f8eef132edff624c52a1ddb3b3ee1898118c028cf1d12987eb3025b69e0f5eed6e28aec40a1c1c6e741812cff548a41418dc971180e771a2db861a80da90032581a7d51e85b76037a2f9a3825bae3563049189fd37588d0ab1b9d7bef7d5028ec50d6ee8e710dbb33a7508dbaad2b16a211a0bc768f1c872c23ea2312f53bb84f563ae2591d59f03fe18cbe6f68d5f48608db4727b2da78ed5e760a4143380f39793cd1e440cfa053e221bf07bf4bd43b5a3abb8777abb8df135b4df29ed91f2c59980065d55a1cca8ae57536f9ccbd99c927f22339ed570cff4c0b04f160761b8ba200a7083faba667ae09f0e4940dd1f53f0ea4dd136a62ac24239f63a50d184b84a1eae8edc3541979e29600808c7064c8fb3552d32a43d8f86bbca4b8676efd352a7beea388fd7f8c93e5a78b143019999b8ebd0a18a73501b6e8dc80cd23bede8c8da2bf647118b73412a1888e2a1f9f9ff70ce44f7a1cb3e2e8f398bc435666ebcd46bd35867eb19d3f297e575c2487c5160303412c0f9071beee304da1d0337edbed945a4555444bd8c4fc9ca7a69b939e30dce0202f8c69f82d42718a344910b13af0422222eac8eb1bd9212d5f18a13fa811f7c545226b3a441581ed068325667204ac939e738279b1aae17eec43f5cae504807fa2b12040999fbc705cfbead3ba9e49f6a66ca4e43e6dc94afd885a4fd11571aa09ab30c0821f9fc9ccc9984d0dd13a319b3da38e63c87e6136a6a043cfd3df1e1b814f5cad301b347069c9b8911bc5d7075a6671c6b5052c4c162c4632882a274fd1e335994df5a37e4a90f331105eb3490ca7659808a800b20d4ee9cdd053ec1c175fbeda0383470fdd080a80e663303eeb797d78c15b68b3665549ec08a18388da0558304aafaaab0964d43a47d272dd995a6ad61b82e8e02e16f3f56bd223f914751243f373063f4411e94a2e2b8741070b9ab3ae59b9f485a4057d296b83468e8ae52640e350ee54d64b8cb27799fe6411d51a8e8729ef9f548d54178f14b0487e6416baa17c599de6f9ee40871aaaacbcaf36dba430f415f8f2e1301c14f021c1ab29a5bbaba761b6ee569c496ff933ac80ba2a5e937c82ec1b4df27f72ef86cd28bb56bce54442a9333964d09ac896dc5342958a034aa5b58b3b5385ce6555182a92ec71774990baa707c937c14ba6d5e92844a243ce43b71fea255ca771b85c72b34006ce2a27b826d66562bb63c47e69442300c384b78a416c5df12cd84dbe903d06df52c54b02e831d2ae7184b750f2d1aaf42ff44746dd1784632d61f1ce990ee75f8fb82ea30f2abde331ae5fed4c82a9b65d1db5d3be361a1361194508919dc0893540c408a8e97380a6e8a70f8d06008bbd7af52798c01bd90cd39de4e6e3306922c88faedd7435a8e55ad9237c99b14df3ca2161715117e505e9358f383ea799a8019597d4bb8d77677c0305478e37b2857670cbe5a46c90cdc24f46e505e94ea6f9135cfd84ea566a1c3fd29d1fbdac5258b36a5fa594d79a509c7c9c57af52df5382dcd5e6500e0181dc691eed303832b0a910ca053dd1658246d15e02eeb28866e557a6e9c3f27073951caccb972f77b690424f40271d2fce51dc5255b6478f6d0fd1cff5eb0f170d9956109acbd17677831cdc3f2ef2ed9edd1f938713ef4e6c4e2db9641b9c836e1f2d7d2d519e69b9e42f5b192a9ded5bce1690183e3fecaac80670e3a16e1ab64e695c2ce2738d623dab0801c50af74405252d1130209a292805849b0c7559fb659cc4a2819244427b20d537fcf390a78669954bfc59419f320bfc454ee794c0aa052a1ab1d44a4a7ba11bf699e241a24dff005d2b70bbba386c9c1abaf95133504c6747ac0de07124c866e892ea02962bf745f689410125025f542d6ad8349baaff1ae14213b5dd05d526723c20e50c202ce75c8cb0d98fce807452c9df43a29ef9a75d200db8e23144a26ef18f4f47d6b467a05b54062dc8de548424ede0bf6af4fd5a8d3c7a7a1f49e4ea257ef56a038b36567f2b1c0042eee4190ee4ca5df427c360e5b781b56ceb176d233e95a4c77adcc8d66fea14fdb0bc402a271a07dbabb52f852cbb5a1e1bc0a1a30aee332651bf75ae12fbef6b9a6ddcfb749ff309b167fff5886a1ee9ee01ea41ddc6188b440f8aeb5d5761a2b13a72d40ea9212d807bf81464ddf4a264ca4e56b795b1cd4480ad9416d8b7b011bb7fde01b8129d2ff1cb9171e1d630876fcdfb057e4410f7565a5bcf310bd5402f23ae5164d2aabab1897460b1d513254fe81d8612928ba26eef60abc155aa35fca88da163a9c08e3a76b0f141d1564828e42d30eb94bc053237fd582df3f482d3a70385571b44f6d068b41f5c29b7140b1ce61b9673a70cf5f6699e5fc91f163795d0c8a1f827ffa5395af9025b6b402e28d9f79a4144274f767d202aa67d47ecbe9ec073f684f5ad4db3480e42eb06284a6e60aa517d8d745b0b6a97bb9025278584cf26f130075d4b50c728329308fc07d7cf943b51d90d7f19ccc7dc67dd4d4093860cb700e15c976ec73763c561b9127c05d25762c6e774cc013ff0b07b7a92ed5152abc564a43c3fbd29eb6c8201ab373721afb52c9570294efd878a13bed727bd33a030c12bd150c7997bf383ca3b6647c86f1a714af178e1204554bb5d175e8f2bb82b29bc86687b4c2169d70ab533168bfd639fdfc8e5e586a7620972857c68f412eedfda43043001e321ce7172d97d8f323272e8cd74400219f4da23637b3880ae5dfdd0fb39bb1637985cd2da8dd270853333ba996d2210ee25b9ab0b7d5d0766d828078632fe556709691dc2a6112a0c41ba00ab2154dd22c9f8312daf67d1f94551722315cf23a64a2741582bfd3733bf4b96929bd8793ed1cb2eea3fca53c972fb43801a0ed60bd998b030e800ea339b431f5810402081e294567d3dab51efa91613cb9787aed9ed2b892f49cbd25cfff81a8a3875933aecaccec1d1d2304d876dbd3e1a2a3cda669e847d6a703d7ab122485b45a87867740bf6fdbf3f019b3ce067aa78eddd66b164f43884da2a98816f4cd732ee03a81511f08dd65be4e1ead5686d480bc7df941c20914086a99bf79a89dd7dc0a41c88e450ce57ea23b743ed2c7c6096598e85d77813ef5fa1bd719a7d8175c241bb2e7061dc383a7873f81e59017796b9754e0fe0c493db43515bd861a71fc28e58becbb1c56628abea6f8f81b3c0e2347d811aea75b78e9d3842071b0ad562c712907c431bbf44a3bfc02757cde35310af9cfb743260845f1ab538ec379d757f0401335a3c2ab50df98c7464e5d71b19b17fc9ce60caa9334f18c8a4cb1b9faa91cd92a6a74aac133db115c0bfc4bff453056e5958118abea33ea27396f779eed95c5be483ebfda98bf74dd3006b0a267d3095df9dc29efd589224aa3b50b11bc0c9621708dae0c6e6aa1a51e83b3cc60624fc9809e65b5e1d444955ee427ba1741f452e3dec62c7b4618997b0da3c96630935b371832252595404ff420a0e10809c0c02445138c180a2963a9308c50c4a2731c9b4b2152aa332276da4f58522d7b01b1ea4e36a86431825fce184f62d50d1f943f42b18cfe2da0b32324b102bdd58b433a90f27e7b235550d4811d61c2cd9e12953b702a5df6b119703c5796e73aedf223b112c906d6c7d88234235a344cf2e806e2e3166261fd7e0dc66b939b18cd5d1d57a74790902864f01c0dc823151a692aa47acea45698d81ea5ce0b2836118457d0e66ea40422230c27869ecf7be30378be63179de22783b6b913c94fc9b83138600c2c11bd2283f5b1c6162cf5f8fd38136bd3ce5ce119257096419a52a53ff8efbcff705f4d93bb496ec684da227d73db5eb2aafc379581dcbce01cb916c07d981628644dff7e6c3e698426c706e2dffeb80535ea0a62d16c348d07ff102791a93c5124719764a0cb36d276ea1c44fd95ef6dafa1098be68f0731780be1267a4629bb5dbce955e45bc946edb0fc8bad85be8ba5a614ca11ce5062a5fd91d84e58bad89f2dc638d07671af859b53b16a610812014b7d9f48ef76601833e1f6ff00e224cf0038f26b8eec09f5a63c8767ef823ca80f49e3d234cc8cccdb3af4cfa220bbde75adda67157c29541b97dd853cb32fd2d7d61bdb9ec333c736f731f869b198c6a54f541502e7c4662e55f1b42ea3f7fd2aa434c6ddf0bec849b0b2558d6b434bb077672af0396b9cc35e4ea24fadae195fce64ed9d6af10b57784eb239ee43fe0fb71a040ec5163140ae6a19fb3939e3b1b19a165cebebefffa7edf7fa985a7193d46dea829ed36dfbd357c198caf263ba66a3484f91095b797912b1a108de5f5bbb2ee3d6511e6476c8356fbc9e462a12198c4c12564a79f203ac42b3cb0be5d0a589f5e7d94dd7f23d333afdc0ff3b5c9c1acbb169e3364f6109275522daea8558c59b8976a67febf6d4008815d3dd50cc571d53b0d8e6441b9ccaf43c7023b9348fa7a35c75dc8597d0763d9f1a945e6febc205fa2c6faff22def4cd45127da80605cd03bfe58e7f6a62ce9464456c4d83bcd6b045dfe4d168c0b1a8416aa5d695ef2916deb49a605eecc70ab3de70f8ac24f930c1daeea6b8c9d7fe4738161afd4c6e2795cc044c295fc26415b529651c2b08511f4543d1eda7adaf33bc4e7f917ccfb9c268a06845a452fdcd928d090462350390ddfaa03b3f2e4e2f4b92715db1d03bb2fe4bc675b6024553c3f9ee704e1123e5678890b110e7bdaacf104a91859c56af5dedb5636ecfd8a7c2b3ff8eb4564fb9ef738675ac110f1e091888772ad8bb307273c2c41375617f6566025d89ffe4766c909b43be57378d3a4d908617f53bfa78f618e0ae6eec7d34d89dc4e86d8147fd831f45c8f2320843e59db113833d5da821d47ffa3d3974caf32e3345a096c37db8226362ec2afe7f759dfa070f9665dc3026a7d7cb3d21976f38ac739a04690b768c0b6ce45b802441291d0042e950b19678f9476269b66c9ca45540ffee0a7bc876d366600037a35be9d0b3232b63484c0c388cf1f9d5c2493383ae0a1d73c8d809188acf5365f05a30ced8a43acd7bf0a2f291a76e935ae3eeb94d02969f0883ed1243e29814df16fa2090fea57b4ef92cb3350b5f4cb16536e7d60bb857f41b476f8e81e71e007617a5649d7dbead0dc6e70410431b8d0a8d1c83e339d9b47f666f1b7f26f073c3781809608b9696e91955c8dc28ca72aa19c96c4d14122e1438d1ea23a48f0c58b09fdc87260ec4109a1a16fb3c49bd0b34ecd0283dd8a78d21e3a94aa277fe9182811971c474820011a8463e58cd8443db798c55a4af9147772eef75956e6245607378989e38160018a0b1c6e31c32937b761ed4d401d70024b84ca01d712e09515042c45e11424bc503eb1c347688f412cc1fa45751039b2bd6285a8ff9d5d30ded1b3c84ee70473b5336290be617ad9105534f49daa4c8f05623f918bbb762eb097ce0798530c896ac10d18f6257e48a306beb2908a6d3a7775ea334053e74f011a05c20342a0ae8f34209d9496a7f8e7a932fc6c9bd484abd280df2d52f7c82b01a60d66a3b616bd25e8a647d425383010ab1332b27841f0941a39dcee7eca10736de4b53cca8b12873e64d91472adbc67bfeb281690208371f4467edd7a0716c895f03edd66b52b6bcd4d60e8578255401bb34fe0646697fd597a029b59c7c13c4f7a087cf13cacdfa65e6a5f8848f24d8432f258878dd7be8095ddc298aed6afaa25fba123ee5f92211a65ba6214a12805f2f41824c2fbd3da36c68bc2b7b235c5823945d1314cda34a50afe54338671be2b14e0551bf8d64a06a3625e71364f006e053b3fee14fe48272ce234d8f961bb9138ea0ff221f1b40117d67b1e2a4ffb7964d5a6e793e67eb6220d3cec44af7459bccac5e0b0880165f288aa23b287c0984004a8e87418d81e30a74d0c18012487d83777803399c3173ffb9547d6bd1efcea70bff990c05790a5e4d7b5f675aaa7862f59ad987f6b8a89f93de61a7bd6d8f9c893f1b9e0e8cee3394e668d5c2e35db0277706fbf543de63d8f346147b60dcddb9503ae6062d8295361c8779147ce5df47b46bd9aab709b11ded14961f124ed19473d0ea89935aed42478a16c0f9890e7aaf6220ae85d8be98db63f5004c86c20dfa2355000811a8edfbc96a9d443511f4029d74c7e1805a9168d41e0936a710675d08182ecd31c9d3606c6e7650b2857e0ee1bfe747639ec42ead2dbad4b3a156a7c1dda1ce313db7dfe659e72c4c335f083e2f80dd081022fd4a8bce29ccde9be42dfa05be27ab54b27e51548266dd5b8878aecc24181fe621556890ee18a449f360d949afd15d3146341028eb2a3c1bd61bb35008d369dad89de362a935a757f24292b8a130bc36e9126337b86c2acd2b40b5fcf9fe7873aee6312379c9bf5c336699ed999a5ac6a4c2782592ec194e883f0238c997796ab01ebb7ba751f2f34e1d0ad674980dfaa98b41460cfe8f74ebd142f4a1cd3e5f2754957126792fbd0d5e3ea79da43bd60c5db83efb2ffad441fe0294820ee80f7dd06580dfc9cbb01b671fe0276ca20f901fe70723f39346c167963077fe38e0270b76556df98e10d5502dbe5b1c67003b483880d1ece3c2c1c4f8ca1e296e751f7b235268eb7d84d9e5f86c3fdfccd0edab0860443a19007310c5754d512a73e0bb06e56f1b04ba51c897122b93d20255d0618effed230cba90eea2831ad9941360c9069f6fb98d1e2b69aa01100c72138fcd4a90060f38347a087bec5b802b6d581c06db75f2abd4c0a92dead61b532eb6b8ef4a7bb5f1aa24dff3a82ddd051dcc1ba7c7154389945d8f52925811bc129fbbe82710b6c58089a6d4c09324a53b9b675d2e893edd4575a6d5e6fa84374263c69103726983bb926a74a80974bb63928af439ecc3a8c8d6341107d8abc24383c11fc3162ec0e6b7b620e54da121bab4a691a1233e43d95fb1ea72bd295384e232dcc6d700f665cbe6618b5188232041ecebe170791e641f4d02a5b0d2b2eb88ef5c41ad07c5874257058c75335e87bc91b926305dbc01b6b0171147f905b0e8bd0f8dd5e33e50e7ba3ea9148c4a803538098eb901c18729b4eb107118d754d6118b7ce4797bf792fcf6ec53e90e4781a274ef6011306a95c30ad69a9dffefe3870ebd747dc31c2d9fc0254c2dba38db7f8816a78d676e1762f0c2db5d52738737cfd97080849293bda7aa91abe5b47940bc7e3c31805a2f1668180e321cd7d6842eacbd6c84ed529c681b02c5b4a1a1127dae9ec2f68f65727ec362d24b949a1a6e1d6fb0ea78b9814b8b070c85fa17d1970a9bdb8ceb9e1aeb5dac9b764380337536a9dfb5a5b6ad12698b2e56b7c5244294ecef4fe576322b5859347c615a76970206936505796dd1136701ff82a9d6dac3c60da42080d39d50b3410324093ac96f90e601ad8cd9c6c352a4b29afd2c3e662bf17ac437283c4f2d1c8f1f0edc0d28214581204fd8d4a1fc69057e7aa5a51ec57f6b4b37131ef9d9e8045a88dfee2b8ddfef52d87feeb39587a5370c37a56d389a8c9d7072d0e0b56ecda03b7ca8350f9d341b803728b27e799648d0d79da9ad408184838b6e395f20df24015eb22b9d220a531610d06cf68793bf756fa95ac3eb011e863659828ee45e209272208332a8b30cf7310679c4ac14a4379975c9bc7255647c3e5468f339a8ac5086154096ad0ebb0c8ac65a0e3f0b2814ae8cb6211df7bcff7bbee8ee655005b23afe6afdbe6dfa80f105dc9515427aca99e5f8f66c0078361d04379e3d0791eed86528d477d65692c09c4dda50d1165702323990c6a91ec9f17db28f62ce661489eb1627ac61dd8ef4c8a992d67da4f44de5373715689d5efccf58e6044447105bc8570f8b4f6a12abe9c0b5b28c813b7313b66748fdc4186b85e75e4acc50921207c04187ccd19953388ab03851b6fa49417cff35837e98c62b4720b71c9bdaa345246f097ad045ea532f3b1524c73ee076fdee9adb56e5cbcc045eaaaf635acdd85f94ed51c6117aa105a6aea7e8552614140680dc116fa2c0d4ff78e6e7d73e1d33623c945ada2b714549f54749921cfe4dd96020bd317bdb4d2fe3adc712322cc8efb38d705b06150ae2d5cc862d54ffc6d665526d916a48637cbd727aef16685567ed2da77450c0333b4aaa42a0cfb0137e11f06e687837d877fa263e64cbaea6df38461282e78b345d4652e3c5112cbe15bca04f823881c234648ddb0d2a0f5b13e757c0eae48c5e408298429529d112dadf1349aa932c2172ee6e5ea070c0c5684851a4913e906a89af99082614349feccdd5fd0b22e6de52605c64215c8160abb3eee5929e122f27345e00091399fc98e8f93888ba7ed92807ccb14c679437e9d1cc4d9865b1c2c575d0957797a1c2137834d515d2525db7448bf99b30dd1d9d338b0f548977a222963cf82ed8088540c2fd122a41bc0ab16d4d1e74f052c79ef064a734965daba39f2ccdab92c171059db4c6c75f42ba079071a7494eda5f4d63bac8ef4ee7b30a9ba320078585f7614e6a9ade5c35d832f9353a2581b0f820220b34e2bf03bfecbb335293743525a36ce355c9dcc7eda9333a5d254e07e39d8d357d6a03df188ce47a4cc86a61ca871c150a5ef95625ed68520f1dc3c6b5738cfa795c633a5255053217ff5931c1880fbd4ef584fb996ac5ee84c837c3f4b09e2afa3bc778f3cf5d1285761a634d3824ae786ba2c4bf6177202c8958135734e576b5baf20734acc5cdda68e10497d92f3215c2fcc4169e107b1910ba817f3b0d9b3e412ce30881c80212c53a7aed63a8ff84deaf0408c210b50412ebdaa147a5cfd3ba59396a15ca175a9ea58a386845fa2882281cab59c76cddf5bad9682b88457ef28f17f4a40124504e68d062d5125a54092c5a4b420a7b619dea4e3e34cb75eac6af1b60e6b99c700fd6858552b484a181926df48a79ad941da58a66d12a92082fc5a19de7c4174d03192358b0338105dea3616cb651ed15fdbf96eccbeb90ec9601c36510ccb9f840e08867fe1e5ea49a04b3648c61a9deab76f8d6e5ae9e0f9baf4761aae4eb76ae8a19fdb78ab955546272e0796afb85186b8708bdf13cab03e3339eb0852408d55e0045b50145ecc024bd597389f2255a9bf0e0fc1750784dac4f8f5368e0400558c278a96a21477b2551c966c80d56dd383dd0806d15182be01bcc30fa48699dfb7bbed32a401bc9639cec0fe7caaa2b7b11ebee474325c190c341dbac646c24d0fd6816ce0b640c3a1e1e4adcf594f140e6d22b51ec6d284cb17baa2ea5622fd4c528c80b1062a7b0fa413a5a04a0015ee59522f51b1fcf8dd2e0678a04242ee808b6939d4b2196112913541dfc3ab1b5e5a03a3870b5538bbbca7a9322579f1847e684409c611fa65d8d64e443601219c3954afbe63035d75a9f41fe930a5e5ec5c6779d5d3dc61911bed2e1a915ec12d79fe0af29bbeef49939287fe81d224ca13e881279a00482e404b09c5c69d79fe66a8ba5c91d8d62a3a5e5d945b9aad32a0c3592b664caee6a15ec2301271a697bf30af08622f3cdefa2e6b45180f8b443f6d6ca4125be2fb0ec6455bfcb9bdea6aa5d8e9ed0edbdd84943e47ed11502074e1b6ab079e82352754b988c21d71dd39407a5b556dca2014d5b85f9ab74e1a167c1821f14fdd43041d3e5870b13d021b089ad4cac1427242683465314360e77560f717f4f40e6e3e94656e0d321143f506c48cb8ac9f6e6a746a4b203e74ba3ad08fda6dddc97c1678c6b5f509216946a59f60016a090dcf5f9553da92ac1da1353f145583441f69d6beb7cee41fc5b80dac36513aee2c8e1008ac3702fee6b8b3ba19a19ca7a7891458575bea321919c91ceb2c2176321e6cd706ac20964d7d5e49ddcef76f5ed739a7adc960e49b9df0634877b47c7992b351938608963993f2735e0a5947c30d268e0e06154f25cb5951c064fc1b4933916ed84dd02134a53a16fb12461c1238f89b51215836a661cc7106c88e8e0cac675e156c64ae6bab494d1790b1c00bee2e084f95535fd7845cbd02cb8882f606a55697690df82eb284214ad23caa428ca2bb859740a4245bd5a43302b006be244fb62013ce3cbae9489317a560045eb2058f164c962f87ff245cf38ee636f34ab6630ca3810f7c5924531618895d71e8a2075a4c9736228ed338635b98f95bb77f89a4505b0a473d96a653e2107227a20a5b8d8010f9a0c83b268c159d6a80582193641ce7cc57c230e862ea54c1de9017eb222fbd1a2d7f24e6dc25fc61ffb12437b49d75442f9ee5320754cd40035425b07d7050d548f2513610acd65bbf504a07d2447b1d20f48776ef988721132d1b9f6d1de79a59803cf8700f987649a58785ea24e9552aefa1dbfcaca5af3fe718552f168b535b698fd0bab2e33ec483578cb467fb54589d2b2562c266ec375eddc6681645e632ffd242eca479e9fc4f05a0a308262d7f27b8150e0b7049160277acd14343d01e621a604720bd0fa889c77ca714ec3e849153e1969a91cadd35c5a0cb1bec3a4f9e508f4f60c7c2c67d2beaa30f32d992d6639644aba22b062961f3b66c902a4288849f365d45b1dbb1324333ab84c1b15b50acffd9d56641fc41ea4c9cc2175c56b9461ad255c23e62be7cd074419e6c9591ac8173aa08727e0f9fdabd6ee3f99882bdb44daece702f2e0d3e80b1aaa1831881a673adcb37d455ab3dddc5edf5796a2d6780175d9991c0efecb4b264bbc5d608114e06de9b549ac2535f50f176e083016e468d339a81f05aad73d19e3f8899b04d4b25942c193815971d2e365913a28fc7034bad91e25be8e43022acb9d4f9667646e5b052176d34faff7fc7936b624ee4f4bd56b3387e6b88d673b14709b1b323556132b70552b3bd3cfea302c9a4de8fa69b22e77e936af36e1a8b9a0399083a36a441a625018364b881b4846d0d9fad774ab3b2f0cc82b0d8c4c15aad1b676a21cbe101b079bef62463d90444a9984dc8ca18d7ace29fc7cd042a13adc21a4db9ec3ceb19900127346c818321e36415a7bc084b284ad3a2d3687b0efeff9f3b1a6f7a3a424c474689e0b3c38f36f28d06efd16087f870c2229d9030211bfa2dd7a08ceb43f4def580df6e343955fdd019027ae0ee95028383335a20b93d92ae7f7e0b241b4580eea6a9ca77f905a02d5abf2f43cf0d9c597bfda0ccb580a56a5a8ace0820e676b087d131c56e8c36c209531b0ae443d60f5f99fbca600e04cd751773b20f385d5071d30e84833ea834293eb6f0bd621f909cf9b4a54add698dd86ca57d150b01640b19989116080ae13d2f923d6866b19e8a96aa42f05beafc8f76741f5729bbf9160d08a6010a7728b703e557ed3fae1a42592a440634620d9a1c6ee66ef08e9fe77619ed21f611093af3114368140ca2ec940fec1bde8620fe85051bb013cd4be2267286126c6b8a3a5ea05d54f9cbb448b211348d632a514bf44c25bafb565e13efd242b92f89561ec2be46b5198fe1b47127d561f416909aa6ae70cd97cb865f1ce8f202d93f093ad7e38fa64aff89e87e434167e7f363b0c5f1cc877246fdb3cfa562c83422c08d972c32bc803aad2ed5b3c1769aa238df30d5d6860e0ed5afb6c4fe8147bce3d11c1645481096ca2fa603da53863da502112fe6259a8362ad89c0fe343dbce218b7c2524e593522095620c40776bb9eb712edd7b9347034f6fa13cdd78c19fb0794f14094d794326c0ff041a6780454c056058fd65feefba1823bf84c24da28b91f5ada4b81043437a819654344d55da4d72ddb5739cc6a66860f8daa9564774b2684b9f2d276bb8a7b0e9043241ae54611faed626416866d8337940c64fdb9f0a8a12874405e1be5472c1bbaf3f9c345a3cedcca3d83e567f20e0109a9f84307e82eec4fd137ceb04b14cf8247ea0610a73c6e80800bbc26dce00bf313eff5564173aa05b3c101e94a6cafcf3b6cfc52242b65d85db951e25f206f3bb00b322f45ed26961ada927fcae54803dd4514dd424dd1188d514366b4a980dd2b4a3ce1fb78eecc06701c220527d9e49a1b07230a091d1bbf6aa6bdf11634c2eb85b00f7795df526c2d3e8a12c40be33b070163348c397361e51d8ad2924a0e0cf6f873ed74a6dd601cc652ef6d5b0e120312c1ff8fdc76223c8ec5ca5524b8d66cf991ff5278cb6d2f1661ccd0e00f008ae48f55176035f4ad712b5f427fb4b43c931b8ef0063821a1c9f3ea319583b4730682c66b52d114e3631996dcce9372928ed4fde67953024a941929ea0f3ebf278ed98182eb5c0116b1210e7ed610a8894be9f57ce6f1e1e038a81ff53db854025b551376c93a1c9888ed10408616cbb6a81a3adceb6c2c2368cfb4b54e278edf2a29222e4310b59fd58cd266d420a2510d3d461a65f3bce09b243e021476f928509122d9dee692e426987547ab13632337c8faea2ac3bf885f3f54d75f48daa9db726c4b41836fa9442ad8aa7ad4caf1f9ec3cecde98994e88213cddba1aa24ab7aa7bcb064b413ebcdd925303962e9c5e7cbad0ec7a89ce0ded2c36be15effcf8a71b2cbd7d4ccee2f7ccf2da237c655de7409cd8424cc018e750ea61f44ba56f73afb49935c99c8f67950c05167da6104de81190ed1448cd571165bb2b464aa26cff4d81c571c3a8326c43837bf44d2ded1aedd4c0045e15b4785327ceaa86bf73c4c9fa2c158f4873c3e104413c599b93b9bb7527367b5032d573f752aca849fb1100fe14e5c2f8a99331e872ddb495e822ae991769e198ad5c051d458e93efce8466a0f8046a22673fd88e0ac23b1d88ee7cc28622dd764763d421645081f1b59741165855a6c3626ca3d496cb37f4485d08e81ec1f6247c85d1f2daf1f7fbe91ac96da46f2f1f0ea422a96051c165125e3d9bc988aba3eb7e1afd57e12d2108f14443b185f568c4e1b4f89b06414745ba4d43b5535850f35dc1ab68f9489ee5a9a87e8f752f057a895988f1a42489b5dedcd6579239186cfbbe1cb1ac64710c6eda1b27d0c33d7635a7a2485e830a6139ea1e053d853358e26b82e28f3284c2ce20d7c56634ac373f5a2c8c3a5b294b1aa936d1538ee4f7b67fa7948cd3e1a9b5f78944f33b856611ec3a520e1c191b765eb50a63e0658c207a0f3d0ef2246a82f904119062df24387f7f879497e7edc34d2dbae43d6e376e628e7bd593643b63a083c927d3385e4e186ccec044059eacd11489db266ea181b14877c8b8bccc8987cc0b94d154142d998693aa92cf096058def4078ee143c9c123c61ed40a71697a9614a103d59ef54b65357390914716662230bd2f542a8d1c3ff2fdd732f209f029198bc2de5d3376970d01180b5b1fb92b2536922eda37bd1ad026592290773660a918a8e489e791dceb4b313508c551839b7bb0436ec40d02458bc38845af385a1fdf6214a34fa82037ce56aa60315639809ae6e6223ee5be4df530d1d96d7d9e3ba2d01e1c3961f0f3a17210eb4235923957f0a25ebd231562f4e8380e6f7dc22244b1edb9ecc2d3b223afc285535146cb20b5832f82b67e67ade63b4098dd3bda0a063720428f32ccb944262c1b36caab855487dac35e5995643d72a4edd22cf15157e666264d11f7f2f033290940c14e18b207a322b362c734abaa64bc582224bebc5232249b90a02c02d920b53459d51714ac3609603ea6199836fa2c12dc7425ea28ca80e1826f30304867a6b7d87573f253149b59d11ee14bee41af95b6e5c560655d3f0ab70fb782013b5c604f2fbb67470f96dfe8b59525795a646fda06b44b4d87f04ffde135ecb2411dd371538ef9f0b629d8ebae938ea3b996f4125063613bd75b1301e1a07869b76fc1586a01d09286ad10ba3d4b6178457cdc03bbc5c4e5c292f08912ccc0591b5f2132717343148dc1daf0ca0d738622b222c283b4f228df60b56813fa5ba07ca3a12eec1e1a78c042eb810d53791efc8f3beb814b818a262facafc0dfae7a89e4f58713f94cdfe440382e2929f845fe6d937360e744e996405b4b0ad35c8db9748e04c6666ef307eb5a0c57025a4310c1427ccd4946350588b7014922f63bfa77b96fe1227242723dc54e5e17a68865d4d5f00db4f0415693af65220bd08e08c43f141075995c4144222df53060f47352b04867155e75f76ced424305880317a65457215ceec38f231a49568d0e2af87819aab0770c419d1325588d117574081fb585f38719fb34bc806c6a9bd12c287c337ca6c2cc8bbcca630f0902ae24fa4cb6e783945245bcb5a07975fce87fbe643a018b6181ce3329607e2273e3d455ea2c477f317de3c5991d758857c482c224d8d6501ae08d177b8933f8a7c20d982c5e8d3f5154f1b8d96e8861bbc9af054e9b7d20a5c7cac30b0e52097bc164ae4f9bd82140ae44ddc767b269cca0715dcef4c247da12aaa205d165ea69921ef5ed4146036347b14b81be3bc5a5c5cab536872c5c1c7dcb46d054b5a0ab13babdb7dc2faefac329293f1611a07b55c5f890c3e3886274634c1fdbe4250f2ef1573204a1ef74305ab149389a8c116e8a219a94e62600cff6e428ff8b978a4a0be3a28524cd06031c863f7e071e8db536da39e42c08806252ebc180471fc0059986892b49d0342e30aa6598295208764c740b51bc0c6089f53c8d533c9a4038144e7821c929061474886d8900cf5231272b5b4281d07ffb70bfc8e1d785ace02089831a6a6d435f8649ac9e1f2330e6862459bef5e789f8e5020357e6fb80a0066297dcd2e48a9c5ca8efaa1cabba9dd9b3cd704cbe7687e24c562597ec4c6f92726c7356ab3b4e525bdb7a3257f972f07405aa19ae6a218de2e98c9cbbf0e6c9a653c9318c5897d1472c0c8c7769f1843b43186c1fc2bb91b7851650f28813723e348388f0a663c7263a2592f1ae7c57cb99f3db8adf8b5ebb780c2e53ab9529151e51e2048e441d9b818b5f71b868efe91cdc02b04417a3719689880dbcc1d81d95edfaab343a20c442e38ddee64121141c547708df917cc94b294a70e9cc647c0af26a6256c988d5bd7cafe9e38d081c8093aff1d60a8e02e978a2b97845b26f2e63103695a478c8c2161d0a3f421719414dd87121c498729dff0df521e2658610cec2cbe1b3bfe5c95acd9a30b5628f46a7f2ee6958cf87ad90f991f6f313023908c18e314e6dd86ce8b0fe78213cd2c7ffa52d02aaafa8dd1f354bc6ab8af4d709e318ea6dd03a34a32bca1eefa19a2403853718f03c5f5f899263d8a110a07b07b73313232b56d8a7d47c7dde4156e1870317848348857af58ddc80225744bba24cec5b7d5014fcedba448e80f5b044df26281160aa27d594d07706d4beda1c28778ed61a9c65f2f80d8ad435740d84c085ca761f6312767143ef56c6dfb03928aecd1c3d9f96b085ec6db2e98d12f742bafe36f8a15f8375c148b9e8db6c50ab9b44f7735ddfd3bab6a0437986ef2c060b34320fdfb9ca75800226be20fc08fbf050279d04438da2c4dd1c2d58d593810439c412ef884550e6ff9ca16ab71254b335c02a52be79033700540dff436d6822d2e4ad736f12d4c220689ce9ec8bc7a5e07ca2729bff24db3acf0bce65c90a824f9ad796185ad8feae1833ab54eb9b70e91a3de1e694b0f30b5bc8293bcb1c0eb3e652765135318f0e5595ffe3831804f937d41d6244a5b0cba174058d0f25c73137ff05ec9963becc8273a4cbae3a964f906ea4159db2df79c750ede0cdb08838623e05fe32e36256d86b727610f5ce485a17118ba6d83d1bfdacebfb7f7bf538e962150b250a32552f9a94f633e6c71b75f53b84260571d4d667fd64f3f27063d2d24c4ce54b0f090eb2c8b88b0a8c6ba4d516c2b24452b19bde3d9e689bec579e8110e3ee67948d33d807399a0924a757a51cb582f1cea360081bae38b7b2e278ddcb3d8dfc40a9a387b7dece0adfd9c8a7f41908a8d427c17b1d6595b0603115997541253a59b9865cc6cc8426967a45d321eee93d0f15f07fd83a2094d532b2f3d441c30caaa31672f3451ed2f206f4ab8de7731f6e58bbb633aff33b93bd5a3cae18246a8540c1d9166a222960035b1a4e2fffde623a2d567795b34b529d7eb233121e62cfa3a634e21e0fa9354de13f3ba3d7b834ce44b26424900317789385bd29ba192eab2574ca13616000f9192b1854ef3b0d7aca9ff3721f6097d8f019e2873f58ce7133063b3d18ea24a68b18f618229614056a39b91d0ce5ae651dc0db56e8a18a103a7264d440802aa0013e58f1908e5bf65c3b3ab0692f331fd08eacea6aaa18a00bdc7d054ce4d64d3bad66ee9e1d20a7f24897268765ff137627cdea99e00647c22c3240ec7ea650e27c95aa43fc31a70ec702585a4e23c684c89f54f216c79d2284cec9fcb52f58cbcfb071022a892af658fc091c6b5e4283e2a0a816b681c9c85e2f4566f91ca8bd1e30ef09b57d545764ba580a2fc90f2895382836b37d611f0de88fb2a1d6fa4bff0086e98876c675ab372e3677e37c6ce4dd5d1b16b7f2ab72bbf3ad640ac464abb00816e22a31792c7ab35cc5f9abcef3e95062d0a9afda1b58a51f0265f520f25a54fa8b2dacc6295f8aba87f15c9045325dbe6b30b84e54c47c7a9421159ec3d0aaf0f3da2cc712d76891a5b58bdf9a320b8b34025cbd998a0c12805b0975f8f515d793de942951ac14e9c98caf8ed7de1f25d0d7947edb04ed5c850ec0d798ea332f16edfee3e9a521083b7bef331c4d828f192fbdc52127cc46e0ec097c98e5fea94b20f43dcfd95690ffdb2a5550838b3b8778f7b3a844ca8a876bc9a02c282f3df441bd673a61122b9613c10a89629b4ae8a4e00d5637a50eee43e42882e24985a60a24a3ccbd69e9b52b1a72d9bbfa787a7a6c10e2aa25be3c94e64ee1119eb575fed07d8d53bee49fe6819660f39c13bf740c0520a433e495a37f0782d55f58073a73d3a068f97598a63c5028dd37a9f1b9caa638d32c5dd5b243667e3a6e66c834ffa1ff1301d2f6006d59f69c7773e2c688352d7bc497406fe2bdeac0a8da9107c2dfda867e0fbd459b58cc06dd4059eae5ffdd0d3cc8d23f32eb0df455b92684069e31785ee6c1032c46c4735d8073630d6126c068ac6a0d67b4142bd58d4d58d27440ad3b2cc8a63b278230dce10211ecea66e38c02b0c7ff75fb519484d991753245327ca3f0ce45a328f6ae7d959659f55eff252de5646641c489aa2f07ba0e886097fb5379d917f41c5a1e792cf27f374722e37709d9e795697ab001659c5466b65347bf3227a97abd84e216c793a3acffa6451685d58604e025cb68037fa1b6851c8f03b61a0674d4fc7b04dee327f29e870bf560af3b495316ffcad2541ee8c15a42b7bc97f01746cd8fe122e1bdfd6e412e75ddee9c7f97892d96d6bd6c753ab442acdda456dd777c99605d2d3fc0a4eefd978a76c7720c874965a4ed388de39f4900fa80771343f6aede2910b89db7ebd7a02df8f1bfe523319b60cf28b52d2fb7cf4dbff4649b92d07c939ec5f0d6a5348cbf6b10df0797e34141f514bee887a39727346fa6ba7c65831d6d09f80d50fc1ddf05bbb8f7087fff68d01dcc366e8188e7dea04a7836faac0da831f532f352b5ca062163d6b016c5df4abc77669f8a80805bd9f4d088babdffe4145b747b2d448fad3d73323c3a233510079855f934d37950fd419fef008790d2cf7cc46b03c817d372e167b535558b5d76c626fd7894cca18b84d5e380df3bc84cc39ecd21e8546444e53bdf86eba131e555d4964e191d72fe31ce0cb63db26d958feb00c20c7cba2e53e065ae1607fc299f5010c855b3cbabb3a43466281ac1b42b348e964dae664c1c497b8b5c5a5a6726d4e62c32980c05f7b20df7bc4b67f34ab01f20472603c10fb2cdecd5129ecda9d2fcc903be6b06d138c9026a36ab3aa5636bc819b16e848b2569446789f8c1a408e5baa9f4d9185bd6068cc9809a034dec868b0dcf34a29b4bf82302885855340814f3946f4a103ede4ce71c9cd5b758caae2ae2a9eaae150a5f22fdcd93c71d8bfd898509432781428ac8dc0e105a94c4d7224e187902f86d316e1b1ec822f67abbedb941a4b655129897eff71694f8c4b943a48111230f06b5e4365bd815d3b2acf4e4fc8b55aca74e7d66e25183cac47d829671a5b4709ad844b8028e0c5669000081a1b71b4844897693405b1b1c8986b36b747a71622cb2e2367bd76e270b381a43e83aea79e9b9d050783b01f5c8d5ff6156b2ccc8732abc1e0d6ced5d5257c5403a3f13ba70250996fb9ee75387c504f0518e58482a03496241e1d82d99698648a576116088c8efb731ecea805ecc24e8a67ef6d7509979de8b8f0edc6c6a06aed97d1ab212c35ba2215f3e0cee575e947fd99e2b089aa05af004b96737b5809a9f92147870cc37dcc949bc7bec032acedaceaa63fda2c7fc851289bff410f280beb05a7f206fbaea98eec04245206dd134b2959c32c4265bb680812e7528f1c2014d700fcd033ab29ece7a6d46610bb0e21f612911d8ebaa0014d41b8bbbbb5a6a4d40871c3753110d3edf7fa44ae06991618bd89046ae0cd275ba171da666b9605fec76bbe0cc1ecd1f42923b993b7500116d1c8f5b2cf6c9787b12bd237a1b5c93ea482214173699c358a4f0a462a3223e87be0667e2095b05eb75fd563b35827e848719a6b26fed5a7513909d67d5ed0c1922a85addbbabd16bd5c6f6fc344fccbce86c8785995012942e147b6b01ec97d4473ab06df857f06a74ce314d14e9cb750d8c99c2332279b302dba6aba8d0186cd9f29361d6c4829ec5be18c0c6082b366467857612bc6679cd6a9da2dfb58ab8621fe29ce3036599497abec33144fac42c1150f0e628b36ae1372260dbe3663268f52333989db0c3c10a360fcd2a180bfd127ac3adc733327eb6a20563ffd69ec1f91e237f94394df8b4ea62a34042d7a785c72adc8d8bc64f367b562d61f5225b20ca319f052be1844e56d0e6d006241147de9e324b5015e2ada8b8e8ca95ec19d49cc159f6422ea4298f770158adeb1d0b9f2d110722d6a92c8a5c4d2d708afa2c577c452c805d2a51f5d5abfbac549817c776749c220dfd636c5e43e14f79ad1280c6f702a31c3a0c45cc809870fe06d1a964632cc0ad82a6808cc788a4dad61fc2d8610d8f9234063b1e93f3f64d3d43b8c4ab4beb11250a2c155ecb5c430885a6756c20aacb9ce1f71cafb18e9d3ef6a13f2d116cef53437d434cdb43e97d807f0c2b1352853465fc3cba79c6c2a00bafbccd7f9ffbb257cffda23bd7ad0a2ae6695d2e6bba99bd0f282bb59cfaf9f77464feb86a1dced9834f586b7b99381c020fd932e3a039c87c8b50564982216f1ba33999edb3e21cdabf3894844b9c3e25df9d0147d13c0121c18ba254b07eb9a49515e19fd6b833b0e3f7e3b7bebdd0adce8a116c383c065a8add4ab14faa23b932c190ab1365023932fb3a791bd2f5a710876ebe5a3a296300e3bc848f898c7f69fd05d98c6b16ad9d591cfc614f8af37cec53a0342fdc5a944403e760a468259419f9d78bb0350fa48216b2c719f0d28edad91fbdda89131ecc6dba4e6c6c3c88906c0734135f791d0a9eb86e4c032139c48b36a67aaca655b235e278caeb7d733dd8b8a516ef42e171a268a65378f9618b7529a8ebdc37108049fdf0217498ec0b05c73d083a372f5053c1c044991f6e8d7f5453a6140ab081486cc155681ec4ded9e7a2be4453080e899d0e57fc1656429e9a5f42883e987ec9657c3b12c0027cf016ac183db015dbc6aaa43ab1aa05ffd74433ac1dab744d9c20b9ebcfa4bcf9dcbfebe79ae1a230649e60fd4820a7254e45e83f5993b1f90162d8c0e52731845d8332ee4395fc50cb996956fad060e62145e3e148df7d7d9055e0f43fae901c109b8a395a5668d6346a8ab27f8d35020498f84d40b2681888be42f64b359f894cb2004bdae4d1a72d7b66f12e32adf24376f81f3a9614e673a2080340931f6a68d0288249839b11db3f0ac0d701d61c169ece0c6bf2a0028c80dafbc431e5f71df5d6543a8e657f62596f04d807fd2934c590cab3f9f8aa85b2f86aca054efe4e026127564c35ccf6008765203d8e60b64d30cceb7a4aab2feeef1f6b5ec736d476b1639a33ad23fca158bb928db7d6163ad1ca7aba4db24a2121f0f05afa3af266517244eee33ee1af5e6a88d3a67ac153a0aa3cd16a28ebf72a18665ed2444edd11515fd8d8a66bf436ea46887ca1dc9af519dd8e50ba790c0027c144c4dddfd495d51425d520101a512f3a1ee298176715786bd1bfc4e2faa73a143713f45847ff96c836c76f535babc622f2e9b8018df54396e42dda8a9b016f21ff732ab1e57de1d9b077df4541881bb51de0bcb35d9b1cc163d22d3c5cedd245ff880ebc3926cd736872420df6907f2582807012cae8d4fe3d9f33d7fe113a8b9cf016323e90a179085cb885a692f17d4f9dd357a21366c9ef62b3a25d786e76a76e938d2e8f0c239d25ab6f436aba29b00c57919991353d60ad54cb2e9f8d42797f4faa476c2c446ecfb993e06dc5a03da61a67d5c304e425207ba3ec1b4bd89a2044a5f535ca4e151a1273c6235e4daeecef32b47dfc4ab28c2684a25aa382b33e757ba0220dc9c5f9c38007520e9f89bce2be189081b048266adedb6e6116f020ab0df56552116db36d9724b296592295f08b3078907b7eb29a58ab27d5b8db27d8bb34179ec2f4d4c2c729104ea9756f373948c4a5f524529a36a64c2285511f5d5d0d713e60fe4d5822b6c3114ba1680d022346c398aa1f0a216934ab4a86216fba8c9573a8a40812df65593afa8912aa204c53e6bf2952bb98293c5becee4ab1a4a9490e162354c001484acf2f9c82169cc3499dcdd3f764c58e7f0b54e151b9c93da9ad9d1d5274d3d690dfd2805e143fbd5ccdb20886b6abcbfde0a7ba670da9a9a3f89f6f3f735abefe5aa73cdaa3e8fd27f7f411ed089fff5afd687b7ec7b27f678357cc50738cbda6f35c11d48b1e90a877e3bce31a15e87353dd14ad9e511aca4f63fe3d067e5919577b83571f95ae7eb6c085d3781932111218810b2c2f0260621f85459a13752d04aa5da1b1a6c673bdba984c063e39a04dd296f08a5ab5a41e6aff9b7b39ddbeba5008f8db33efeb2b2192effc0b3258560b4e0932fbf78913572dfbec8208760a2804932c15801a688ceeef982281240a45ac97d7b81101de4bebd808bb6a6dcb727a8b839a27b01038ddcb727b29073827dc3c1d83298fb761404d83b474e72e8accf3b1951ca01f3e1e4be1da13199a42af72dcc4f066b1ca4e2c3bd130213baa424a43c8a80a809a02cc50fccdcade3cbac0921acb0753f34d038e677252bb9c0a39c5d2ab61d377cd727432d548a90b0d0f196b41102a983ca7a6c8a764c982b876dc74a74198490868a80fc4505ca0ea9a3fefc9e09eb7e7e08229830dcd1ee9b35612e390b67277a4c95021ee5cc02d1d106d115a6b6dc00a8e1c194933aac2ce7c357e9c7fb9ee9bee99aa4e98a9ec9640a52411e1308d2fbcfb4a2f9f3569df7017556f73b3c0cfbfacbfbce248e9e78bba7b9410fee4bb1edf7f4784260117ed4173e1bf08cc003e8d39f0d70567fad629edd82ef84fe0fe88cd286f3417ff79e67f6dccfa56fad2f6bfe1a3f84faf7621c86ff2c96ab9354badac45b1356a15c7c43fc21eb5d2c2397ace5fa638e3c86b9869d59ae1cb986305b550e29f1cdffee8e92bc42e640004b07cb597d83356fd0602319268ff24b96dfd9a892f9dfcd51ca21c3a07ba5873ec0602bd6bc29a2af5fda031e735433d2e808577359d610098f398a5cfe9a5656728190f532435213b32e05207254a850b1e206a3264d9a2071ab6292f8c9cd44ee9b971fba2b88f08873289356484a553ff677cb115afaa3ee518fe768296557918a16d57f5d2ac0b3f610997e05792a7db9a2b5b1645a6b77f7d7f7eeaededdffb48ab54b60d145452e4a5dd4455d7462812b964ffadfefa29e0e6f2eecf20f78ab1302f774dd0e97cbd5492a527c468a7c1272bdf4fa0812ab00df2701952593235c8f5f4a29edbed8257112f677f739db6a415d3e9d738a381ebc147d521d1b4592175491e7742470c9a7f678c1d621a1768a9016e6519de242d7755dd7fd40f9a182a73449d20386202e40228468e921072d55f2887f052d420040072d2dd800095c73dfb470296ac1109d25b0cd7d2b134499150c418262cfb3f072dfcaf0406d5bae1cd151e18a6c03293f58b1821fc4b05498e18725703f102141c136b9896410224271852d86301bdcf0979b280625a2e04243152e3ba0808b9526b804c142855764ddacb656df52c548adb5b61629966c20660b1079c438fcd9c0866c4a81cb5de21146e5be217124c90d3a346ce2618328d8e4c3063fe01a2100c002125d44227c0a93c7c761725190e8c2868bb200002e10330400255c8c8891224887872e6210d40518a12e8a929e9499254d215226c90a92dc5012113294c92581f1c9d13c58a176c499aac30ca334c87d1b93452ee5be3171441ef17b9a30946137adb561a4b4e0480021f356cf80a0610dc084b9221a8501228d4d831818cd02400486919bc8c8869fce6db5b6e2806f6e2214a0d1a0086cca4d84822a64c0a5dc4428882208bbdc05ae00059212169c6985323f1ed2a742912b44aee483a423e28b0488108389cc60844604071f19911e5a1022b2029a0486082252840f04b8a01161c24702598e888c59220121686f63266744124ee5268262850c8e919ba809241b54c1a8dc444ca0098998283afa5b6bad9d49706981258f39ac784ef2d84558f2d846fda5004440dc829861899017abc319295d9e1f063992040e3a48616404d782d1892f678ed8a2ca181a6273a2ce10c92f72dfcc982941272b7254e488ed678530b8d90750003139f2411899875cdcbabc207767b5b55a00f8609cfb36e627002ce054930d9a58c19d588f6432590b754c10b9d6472191cbdd6505a3ce650d62c05feedb989b0e164c73dfc620a141122ee5be8d5902cc6d4c9800ccf0cd7d1b538695466788508669a488a20115296e797c2d7895fb26c5131b10c19ffb36858ca504ab72dfa600d2c0093c23f76d0a15dcc81c890965c8059eb96f5d923c2b8d171c32cd7d3b534536a50a0d3765089fdc942e46829ce811046d0a99244053b84862bb516921490f9bec16851136acc818cbf5baaecb017751b513d2893ad0a04406e5a6c30f2f0ce9e0424f1533243d648e9018e990850b3d540ce1c87dc35da961011345413202ce703d66396f751e2f9692421129478ee0a4c460a44711231dc020391264840b38294034201da640729322e4d383852029b420295b7c7a20099af5f09149314ad2c3884c8a14487a1c299a02290a57d891f184586bad3df30961c11821b3cc4fc6b96f6586542f484d88908cac1324d65a6b5b892998706285972356386373f862a626851c1cc9054cb040bf0ca9b5d66ac150b95cc05c511224851b9828810222685d143179f87274b97cc139d2992a55e66c92c72ea2c136cb50c9796c3373c809e82b0d15b4146c46358c89cdff817313d1c0247bb98968a8795fe8a5a10c711624a0d0d0a98b0ba628b31adad10b5f0f32903683164a27a099841cf1a2187db72d66b8506e259f59878221efe705db43d17502439d32ebaed00908cdac1149e6507d2289a3c213d86807ff9550b0f9d37f5f8e6caddbefeeab09332929294db6b6cbde571366b6a209521c655257bf412bb311a3f8639104a7077f823d4e228e0f50c4b140cdcfaff9696bde411fe0685fda8eb9e7a626f2f39f88726dcb3d24858ec636b262455af1cd59df1562ccfacfe1723d6047083db3e53286d1e023e912e96b1d9bbed17fefa7c0d2a69452ca79471615c78b270e372fc6e1f04b180d52ac60cb1122908e880501420b155db820459520a29804845430c392e68a12601173a22d643e45d8ae60c12de6e4be6dc2ae782ffeeeb2de725109492925eac8a3662e8eb548a64d198f7ba18e0cc9fd5548bf50336739caa8bf9b4beee7d1b053ce000d6b1dfd02bf7f01cd807e9dbe6f9c64ff1147ee1b205a8753e41bda6c79494788c39fca584a2969a944c11235599047ca878247f78df134cb6e43e377b85c39c979273464a9b4c34f3467810e907f4b349fecef957e87cfee823cf2c75291ecb22b35c9b0018fa70af228959e478e589af13436430482428c86387a28239451ef14e919ef43a2e027f2b19cf7afb3deb1a935502b2f1e84867945632f91fd75f402fa65026b4eefffd361394cfdf865d4e3882815a438bd94170e0d8562a40ed58f6a365b386178bb5734ec2627718cf846089a7caa9d4e37b4138ca2f08abe118226fbc3c0f91b156ae6af5a431de957ada159fe9589512dc926cc2bbaa14d9877345b52877743bba1e156155c756f5addff56de9756f76745c9502a8443a118198af94aa552a91476e970e82637613344554d15260fcdf8d1465439e951559bb1f2986a06238dc4e15fa240c39029197f3a9d4eb9ec0fa368c2fc61c0b899f92b1cf29b23fd0a7f6896a3c45106c68171a4829126dfd050b39ba30953cd6ec4f047ea40c9240edc84d1106f7232c451460c31bca570a11987a96a530c715975436f31e4af5aa459f2fdc31fa8155a1bf9ab6ed822fbfbab66130682aa3661a19925b254cdf2bf58d1a1be21efc42b18b9d6fc753373560dfdba39d22c7f47cdb2fb511e514645137673743461e16db6d2481daa1f89c3ffe6a828cb9081f12dbb7794553fd9bd34d931c618cfd88b558c6cb3ea7c9343c96e72d9294a967dc637d843d2781aa3312367557ffc00b40f9a25bf66c5a319d00b681dedad4c1815e64c9c8425b990b2e754422ad789f239a594525a5dbaf5d58d4dfdb9b1d2d5dddddd8130ae35efeed3d81581a010eb44e935a8021d51f1f5cb39e79c738b84d5da6c0df5ce7c398982c892e62ffff1176d4929c5d126dbff64b704bbdb5795569b30af5bfd30b0424c14441c618158ae5638800284324cc263db8c5cd255556e94d8e80d153e365b82f97689bdae92ab53c560eb6cb5f592c163db8cbec038f0963c9a30d66cc90993dd41d561b55ce100429717e642dc84a1bc2561d75bf273da02bdb0820df0a2beac455ab0f4708971010b70d725007e0394be069ca31ed92332453928550c0d0d592a5200868aa0214a2ad2375e1c0fec132531949b2889a001e426f2c245be26257cf2e7264a824cfea869822b2a410804a975029d4d3583a001b5f6fd4df56fd5c91e78f60f0107c62039ef7010ac1dc13ef540835c3fb7cea43e9f07701325f125895b96b7a9f7b65b27d75283206890bb92f7d2ed774fed77ad93a9f863f008f2fdca3924f3ee0e0f4b28bdeb5dbfb9e21a39c8f96bcc81d4fdfcf90f78d3b549c16317e1fc35e777708b109f884fc427e213f189f8447c223e119f884fc427be43258e8f98ad3fbbb8429e2e4435b000c5179a9249a48c3d43c45a6bad4d61859a821121f5b645d592826c051b2406980c01c40b3c1019828cdd21065bc22052a021a5fb9c7352fa4fe031bce1cdf1bc1c1d8c39387056a9c61178b4f1813c2693c9415082df6785c9bb9dad269334758c1a1e97f2b039b4160cbbaecb41392bbca5ce966a89964aa55269964a2597a50064298e1dc82d62379d824e412728fea27fea3f0939ec34c4731a9a62a6b1e4ce052c7f3c0d9d864e43a7217f7d738aa7a1be711acaa7a1de691a47537a68a4ec20b5beac3d6ccc7e83dd537b3db7a13eb37c27f0e81378f88a021dab0f4ad9c3c6e89c52ce29de2c451c1f34569fc6aa0804851815efaa4a1933a41362c516e9be7546559109872cafee0dc51618360705146a83e2094f280a15bceb97a38a031da0ca26282077df38e56aee5aff44c6ab7b6b2024a6e65d53a9543bee81e39473560c3ee941ee886ab45c5f9ec8ccb06288d16cd521da8117281dcd96fd4b0119ab43b375ff932d057057a30064b486ad866da6647da3fb942c7b976ac610e492ad6f74df5d998c85fc811b76a7dcc98cb3aebcb7bb4754e452b793a9223246fe1a4fb9239cbfc6539a9497542adf13197f55a00a5bce5f66fc552aa5397d391d91507afb2731feaae208f26b3d3ae1fce562049c6577e458b99c6539b8b2a87746e8af7f9a95667dc316e0063ca60ac004fbaf0a0084fb3fe993569bddbf74d43b35db2f19f50e2adb3f9566bd132346eea2191925d437ece7cc00cbf2982ae2f169d0228e07f54928d95816849a55fd6317ad6c38cbab7ba7684432e4bcab0d578ede62c35fcd418e099b30fa3968f302c671c08c9ccbf7c7ce77b6eee77096fd6e55322a7d71960864268b93007cd377a5ff1e145326f1ce56f789ab6a942a9a2dfb58962d96f9ab66fb784850b68f67fe02b37d2c84af38ace6ec632766634e1eb10c28db2a79c441d9764537275c90474c255b1a1b312ddbf702ce52a97068dc9c9c193368d0a851e37fb50a4526f845269d08254c186ea4d92e936c41fa745f5d1dc1a3b4cd58e37c405f7e6769eb9dfbfe53680a55b917e32b6dd247ea9057e4159fecb1ef9a242da8260414649b57862695297445b2c0a9d738297d49048242cc13696db67cc0100832b3099d647f87dbbaa240ae33a929fbf7657f11668bc9fdd586e5cf4c935287335826110d71b95f4221612f64cb1f256133375bf2d5393e9b21f50cf4591058fe472795b12ed110312e1862825cb10c204985e12d5e1b5cdac10e331ca67c7901952b313a6999d21799524a698d14304535979b6e926bad8f53c892eb872f642215a0c895556fc0c206238e48b18508180b6589101bb80821835780040994ad4cff9ad121d3af78881213986aadb5d22092cd32fd795d2e4ff38296175429728d1b4c6504a0029673ae8e6c734ea05aab6cce778265fefaece3ff09925632ce9247f904cf682652df702ace9c3871ce72ff5615ecefee2bd8d1467cb39dc035f73b1415307d997a197bcd4fadacc7a8e84252f420988cefb7216132c406784bbea418436c6fa99cc0336709c509328f6dab53404b9fde8bb105b24156969a1fe4acf929d10239ab2255a49ac65fa84ffd34001a4c1fc523f5f46d502b8c5a9d50ab1ad40afcaf9a50a90e066af5e2539f5a7d6e9087d2fac6fcfcf9ea2b79ffcd8ed6fadffdecab6a7a5a1d8012abfd0d6418ab13647eb11a6b973cdf6635d6139c5623bd62a45d323dc114185c00c5c4adb42499e213c7799b810d30083383e6cc71d6761ef417e85e8c2d50ae4815c966b1376b7356cb09fed183ec0c561013833cbfa2c15656919c355b55f07891b2bf0738dba754ec89f1e3acd58ed99a6f2bad398b36bd30ec9b632871e636dfc9077384f9a3e421932c8e07fdf579f4d7203c286f498a3d29f02b09934797c9de80c79b77f8beaf6175fce53ddbe994f56bfd7be5acb56da5558739bddc363fe59c92fe8bff7dc3e50db27abb3776f71aea5d7c1fdde977779fd3bbbb59ceea3fc980a5bbbbd70a0359ebb5f536cbd25b279d975edad94ae9ed6c8da1a56c29ab746aa9fcd6b1d445da37baae3eebd64aeda49387f77cf5ab7e975b7a2f1f574fa4d4edfccf9abad6b4933ba5d359e77ce9934ee9758e40a9ff671747d7cb9ff53a54647dd6999352255feb5c1c1fdddbb722107c3b1187021d0b674be25802cb783bd68943648c888cd9f7e995cad00465591b52e9acf96bf690e50f91456d082f4ef2d7994420c15f7d433394e59720ab90bc698194a5fc5b8b5c90d1649147b9a491e4900ef460769dc9821f481dde48362a8b95a5947947cffd2b029131fb41625ef31ce87ef73e6ed7bdd7956257c471b1e70b1293669c25bde640b325345bf21dc959f259437894485a60ffd16b35281da3ab11fb905c12b329c223ce7d84307ff8cbf290e56fa0779a4e11e6c4e1449835b7972443701cb865221bd7410e2678cc3165a619dc56ede7a40e9ae553f9df04ca2228cb935c161a51fea6e99685508e9123e030184864b2ec6844e431472e8ba43c7696b791e5d3e976f59dc9d9688ee6fc65864c9631a0386c460b918598a214f2e8b59c10483ee4d19b08b1432ed3e92da9a4c2e0f9267cdd46a5866a48d5372c7c328c3c5f8553997158985365f157dfcea4f16294a7ec863caa8e72372c80c8a38a8cea96e753e9a9da29e72edd671d0d5c0daf9556876a16879584ea0f0e626a931a5485ea152a1d85e4af51359492a1d2a4869470b7841b554d54405c6eba509c599dd5220dc337481ff29cb8873c277692e7ac5982805a1ab8be313b14d28dac045beaacd2fc35a290aa4ffda94729a01450efd49f2a26797e8b630d2b4d524df21c6f8af2ec12945338e449554329269faa15e1ee9349f9842bd6a0aa6ea5bae2ac3aa3813be54e66301086e2302c744a830394120efb601aaee1265856c28d75562253324357fe3470bdd34675362bb532548ffa4b2b55d06ca198a0804e39cfcaeca6a86fa46aab546db6a66a4865a561a69faf1aea1d99a7aa4b9e2aa2ac0a22cf47214d9849547d61581251489e6a088544438a3c270d1caa081e53b5a13c5bae543ef48d99aae599aaa596f8ab894af025cf4f01f92b469e9fbaa5bc38ac02a59ad4f2540d5119caf3e71151096490c7942dcf7b44cb636a4b2a28cfaf54aa86fc359e72367f8d2a1f5457fc35bf3cc9a32a4b9e72e57fcae5f92a1f7ac77fd6b0590f9b38bd9dd3db65e1c55fe3bdd7bbeb649ce5eeeeeed45dac649c356f6650b7cc9e2a2893de18d1aa52a13a75eaddb542f0e8baf96bac64f27c1815e325574a694edf905f43640524cafc0064f91f00a94352daf24ad6b5a9001541b2cc9f479697187e502cfc01c960cb34511665d9f057df64e025e70dc8e7a096e5106b93c118398319f2d85fe8745a571dfbc06752525e79b3318787b92e053a9f57fafa324709ae1fac9edf110a61a02c83d0f2d8485d7726b4e967d4f078337dc9af2fbbcec954b007489018182456f3e3eda9017b401c0bbc78f96310704582f9404e0f7ecd0ac702b3635fb2e9ed8a04271fa79fe21d6f2e597ff90d5ec0e6f1dfd9ea6868c90dbb20307dce0b4f0f38420072df7262f2155bb2e97b6a4420d2823d6009fea3f4717dbcf81a11c8e95f8877b62af8812757fed6e6b1cce602f36b7e06101eef28c11509c0c7019e33dddda797dc1c4cff2a36b5d3e79c1235e7bbdf1b864d94bbd656eef672d36c824c3ac1468bf449abedae57fa6c3cef7e66c86420f4d2414ec3746c70607ffce81b38433cead94a6dedba1f954ef09467f75b6c593207a81c1d1bf70b16e3e3bb77d83a6d67bfbdf3c2747ba7a683c808c8ad863dec57dda599e8f7a0fb87edc7d7a31f474747f4074a05958ab5119283850819715cde653ae99cd3a98db675b4ebf27c7bebf7954c603522a594b3a994ddca25ce396fb6e9fc1a9d0d9d4e9438da4dac4e7e8eb3fab110967fe95dc939ab133ce79c14245369a5f7defb750cc1abd4744550f2bc2f270c3fcf560a7625dae75df975de7bd9337ddd07626aadadb42b7d261a46f180e59b3ce95defe5b52f6fc9ab515a8bd44aa5b42fa5d3689133b269d7b6ddf5759958a5ff3cd31581b7eaa6404c3961484da2d43161a7af798fa6c3b2e1e22007abe79f26d23a5a51187be0ab23987ed7d4d4cf745a796d05d4e360128cda014bb0547adac966954a23c8dd53aff49de9360e4781e765bb7768199ad3fc67e53567390dacc1126297a4fd2c91a5fc30061978cb63e7f2d8666240923b314449c0e0c30f1430eaaf551e4d79f698b3258f3a4faf913c1fcf1778c8f3052af224faf14109953ae6933737e8528650be1f7414d97b1e9d717f5e419ed37f6de4c40b4fb8745124896e30f9de315d45aed2351da573681bc2221a0fd12b68287eff06f94b66dacca1757496f15ea192ef7592efaf66c0f76dadc6f4cd1943c662ac707c843d3c665fc6c7f850042267493a2011c57e61128be27d90d8374d1debbee560c3123120289890c4a2d83c0a74c8865814ef477c34613d17976f6e5e20dba9b664e8766ff9fe0b2333c86b697504779f298f3f7320c8d38333dfbe0cb1e266eb7eb7c2991f43ac39a4d9ba33dcbd4d19522edf5b94ef788d8ef2fd1b74616858f737f2fdebe32fd3dfbf347fd5fcfdfbd33bfef7daee98736de8c43b4ba1c4f194475b5b5959dfb0422c2ddf1faf0cf9deaff568b6eeecd6a31aa661ae7ad43b12cd0b71c457e42b8e558a7c672e248267d01624b7767f69b375bf410bd8bfb3d9ba3f7333f779a6d90e18c68fd336618d2fc8e3ffad8ee0f1ce40f87e7cf1251b382c67ddefecc1279a3065f860f954bc3f6d3667dd7790e7de7481bfbfcea27f453ab4faf2474d9f24df1f5bf9d6bac8ca036727028972d1581142452ed6897716c08a28b258c754984949b128fee37580cc126c6751bf16c859f73fd1d69c75efbf90b9eebf589d20ef97d03ba5bfdf33ef5f6c12472c8ee1fdcf66d53357ff5e59bedf3be037f1d6b52bbbc45bf7bb75d8191ac7fd7195bb86be717f04c04d17b8e6f1691edf86bd73d30596b9b4bab3be716bb3753f0c31be1f70d6b51145e0acfb2538ab3ac163e74450c2acbe6bc2eeac5bf7ef1783076c6b54f27dbbc45fe0dfb74da40eff6b9be4fb350faeec1267dd9a1a0f3083a2adf58dfb2b19f0fd3b93e12cdf9f2d265f677936615e7104194233bab8b725687b07a66f5fae7ace9b2eb0fcfe0e9c80cc064063ff033553ebe4fbc673c9f7d95a03cf29b268184a514ad93a13565f8ad85dde29ddddbb9212e9935a5bbb6dd7d15bbb7a05a7d875775ecfbd9e2d1ec905c679b5d3f94fc13869a494523a65e7f624431ebbbbfb525aa7cd0a271970d2e8c249b969b7cd0a58e2ebe49b2f2b753b6935d9ee7aa55a6b7777b7ce3951537eadb57ad433cd3b7bae1a7f5d347146ca33529e81e18c9467a43cc3050c67a43cd30417357cb97a77daee922002aebbdd067e5ca09aacc99aacc95adff0b76008465ea9fae8292a7d34020fe0f16676e5d0f19c2ff7a31c7bad43fe481cabd2ca09cb5be22c7f11c81fa943ce206b35fcc81a35511d673d0692b5daad29791e5048f1b5f98bf314cadf0926693299ac08163645c0848d3342cb63e7da4ca799b0dee216c4823357cacc90242629ed881619ca2b25159f2a1297a50160a0855198590a51144193e45122d5b28da48deee33f35a0202443e4d185b27c213d4b911bb5d0431efd283b99299bb32cafe43cce9f59cb73c9389b64c9441e5119c6771019c6537f8919068c16a2c830fe05c8034326cb2fde06e47961b344b6790cf2d860fc279007e39c7c42b2433e7d0dc873aaa97910e4a9c1a00f11197c13c8039a4cb20468881c1133fd07f298be2351e4ef4b20cf377ab961a5f7409e524ef63cef312e7b4752903d2326c8de5f90c77bd1c002946f91335d734122cb5689222ce4d7c422cb74677625370c4fa10c43d614318362ad7d6bad25c18c0b541861044b8e8598a52e641b432e5b6badb52c94d191a9162c70c956005df0889f851364fbd727c967adb5d6ba581022c415d77a77addfef2c3b3982b5ddea9d35ddff9dc5f2eaef3f821559ce9a9665edd875f6bee86004827c6b51bbef372346e27a0747ae2f73bd63a6e504f64ee8fe031227735f9c559f8ccce19c55533290b1dad2481ea1c15e7d3954c28e1f13067eadd7266b1d5d1587bfb00bb6b9bb60991bd737ea874d60f07b0231555101162a319388674be2dc2749ad2c21f0c8c2e9a1dfd947f6957d21d96be3701b5a0ce49cd1965b602952ea3fa5fc2965be4eb0fff7620c9631e624831c424598b398cff29ce19ff827029eeca8d4ed7536390915d148008020016315002020100c88c4228140304c4355953d14800b6f8a427256329a88a34990a3200a628c218610620801c620028c61c8880a046425625ea82148540a432d2cc27522749e572d8688409ae5063d1b5250cec8cfde169de32c92a227a03e09e2cb50b1a39589c984a4589552a04e4271ee854bf8e5d55090b5ee4da62201658f180da186b4ee19b7c0554ddc3c68393638ed5e0a6077bae3678e1914e63c91364210a69dcbad1586197febae8d5b54cd18593bca0d2ab3864be07a91022be3033a79813343ee671f4a45c273be51481407db1b2c81ee0de913b54b33e32ef52b104cce1350fb29a7584c0066dabfc52c32cc4b236c1c2fc969c0d2b9f14012a1397061ceeac80b0c3ee31c9def71e856d28c423cf4a78386907137594cd9b8cf90a1616436d963ffab19c15910b7aa630f3815f481731809aa6482f7c5c8b17d1d68e1f0dc936e3f1a0575199c9e92ca2e5bd0f5a1b19f8cf59bfc078d4a65103b05ae36bc9da68db42497718f8b89d1038dfbb1306b3c1bb377593ce44763f906cc0439b619cef1b233a3f2963e95aa7d62f483218b931a446857175ceb714bf754aced4a89b767dfae24632370d712709b424d7f05614c510d84a726328f2ff949ee5def49eafa9b202e39f341d522cd84b23c90352880f6fa3114b5e4082d4346a34ef1c1efe7231dd5a5b4a5eae21a7e2948312daad9dca4efb6e44360687b8ec5b50648f10b2deca2b0fbf338f4525dad70f14d9684a1487ab9dc7d66c48b7412bf640c961d79cd219d8ee436a2bf8e2af48b1d59915974676b7f9723d024dd7ab6845421d361b02ee62910b275edf83ea831bb45c880ec4cbba5d06cb21ad216a99be601510dd00f19cdd6399c489d4ada0252970863ce52309264ed1b8a4151d92ed1476d08bf7a346f2330bafc078b76bf3241c0a95eb829c0fbd5be25a52b86d209b05391e27d120ad844ac75668957c212790d94e17088f382e06a95e29feaea4718799c37ce03c1f8de05a00049d4909523496cf710f109300242563d946f3a9e902a724176622942cfdc4aa3e8b4c7b76a17fcf344a91dae4d0e7000e065aa97c023aa9aa154fb186d00e26bb86eb00cfd8d3b4f1d38d4a97f3f7daba3ad8b2e465f522b56094bcd8c5bebeb658b6b7564aacaa4aa3d6a065e5215064cc6b259925fcb8df422da0c59b76fe4eb4480f2dc48afd9d62389218c36b9938430f565b0d4ef0303b4e279775cccebedbafc3b0aab5ecdc201cfce7f36252fa9dcf427008d5d34a17648bba7d3226d8207ca31ac7863a3ad4678c70879616f4074e0f2da1ce366ebff942b5588136b9bce15a70330a6e872abbd3522defd55d186030b13d640c14175793c782013dea215b89f8dcab77fc4a2be1e09381e8e1c750e5beec8e4ca4597da9427c0b0078f38f0e43f76c41a4c9b28fd2f40a46bfded002d2dcea6b09032e2be27c25734f5a768e41f7851461aeb75c2f84455752f7ee0bc4dc8d7d2680e3a80970206c034a6408478436703cc5da947fc68720921d17ec3b31b55148a01228377d6fe364e0b0cbcad62a120c6fa4a39db4a3c7c3ebdbde8a9a685e0f4502082d85d739819838acc7e61f2dfeeac5f2581938960db302552a2f52b14ea6b773a162f392ad6373bca49730d2729182e103879049cd9bf798c8d9406dc25611979837d53f3abce1cece1e9d42d9e69c09ba3290c2ec45b875e0153f4cae0e0b0ea301be1e2a6be7bfb0cde3caf50486177b905570d51e4e90d4da4d48775bcd7c5726d86c79e360d53ac8eca3cce359b670a3c6752f556566ea7cb416d6ce6ab08b68612a64544ab2ef5e22d1590416d1179248e56e7e209388ec854dd202ca60c68209cf5bda957bcffed1636038ce731769acaffe345c0739d95ba76b1b6a060e76c2a776eac44b2c07ec4c4ed020e1557faf234f4e08a600c2e05a72ee213e43eb2e5bc5cb4b9d492fca925dee29cad16a6bf1e499762a0e7bf658fe39e3ed7a5e79602cef023ed687acc88238db69960a18af3f2fa5dfd488d3a68f675a1a8591e8db824d3c1a0613d004bc8804483801b4ac8731132b049441ca1678a3678c59e4e52b07826388d72b1f4793e70cb2148d52eed41d820ba95445c02d5a40e21c7a62876477e1b7bde754943c9a4dfaa14d7d30ea4ed4ff920de7a07345c1524f00ce4c39c9c01f4eb824141b45248614d37f3c5ac4300e65d8705640aeacb92d39f2a3fc57d2c4f3700bb680c51e6aea8404e07f1cc772957cd23f349a0100410fcbed6138035dd6e1c1ee282295304aacc652187b5a448d0f6f4e6ad835521a1c957031bfd926cbbcf47f3d1d73a05f31037cef646235b70ddd42c03b57b3a4c8cf49d06d8c0129836ac5df5eeb5dcb15a9b3d89ce71035e4a657abb09f32b1502b6e32b2b6f7c31751bd4213a367a340eca36a497ea45a3786021820de27d9c74428370ab110aa2839a2d5f810396952f5f6e46140fd6e13820103737806403bd03abea76a473991c414d8a31664b0957c147dd12175cc1b9e4046bc777cd9095d7ced14dca3cbd418dd628bac2e1fa4e540554baa754f4d5188f04a7a287f9d648ce8cb52b91459ae4221cc4e39de593d72d587aaca2beaed99e7ac2ff1739027b6286ece2629b999d3162810e9b522e53a8a1b979542aade73e6cda35ae2441b26c3e8922c06f3cec16a10c1b91bf6ac01e7da8fab1e49a1d40e94b376c63eb504b8b6c1a097c96b424e0b378d63a0c61430d2161fa6393ae6420501e3a95476922e18972278a7f733143408550e70ad14680c0ea6db4188073bf3398cfd460a204cf6982d691486ab2c3ae34a45ae2348a10c71c7811b8d29b2317375843c20a66bd17c58b144d4111ee89e61e429e92b4e19410710caf32c4113e16d0b96624f5132138627537ae18be47c68d780dfc6c07a1a7064a9eb06132ba19a41a470c694431f5a8df9909f01a8e8b77c8c835c2b6a9d1754d1f6e515fa090e90bb828067f97f11fa4e5563913659bbe744ec7e72600be0b4a102f51232532a1109c61ac9b40b8074d66b68dfcd7ed229046659e33406681e7147cb5aaf267f1fe8b248c015f1d0dbcfdf7eba6d97979776b38bfbbaa1e798c169ecc1654989480e0cc958d1f6e3e1022af836eb49949c5bd2a123698b8b346a1267297652e660cd7592a751341a7803ac04856c9493fed652bfecd3a009eaaec8f6fa56c16ec31acc0f5a390871ca9c5cf459c60c0e76f3706432e8275826701b4433881a1e1df2146d67414950e54d87d4aba6e11a22b1dd59ff18205fe7d9c3b65ef0d7461f3384e8782cadcd38bc49883f5fae28d48727b0e0b5f9fb632f5c5c80499a220627c825ffa4813da5a79a678e5d484cd238b5789559718c29217f0c4716087484c51e9aa64721605d322517dcebfb848f44ab08f7eefb2703ee8c5cb80f6cf59fdfec5064bea5ca62dc56b44abfa338a3ec676319a4474d142b544ec9495e1031ba1e6e06ef64f24c96e039f83943e1b77385f3f43d9fbaa152b999166816005559c93bafccd9210615489fdbe86001c26a9d4e9482354c8595d2b15b70af051cc39ad8247ecdc7f0815bb066ec99d20e73ca6fb6f79ffc301655a2169aa8c804f8ed31792dda3693ac7edd7b83b99aeae3f3923b5654968651988de6a170e73c893495b20e3151182f9d1c508f318b2ad74fde1ae18ed217d9ba2bf9bd8249d953f0a8555e169a23c550b27514569d4352f78475641fe872c4b4e750751a680540ecbe35dca8205d7dc17361dc673810f57567b884776ef68b0e7963e309875db5ac1d48dce18ba718c1cb40b4a117614978984daa74071d8ac6ca986154a197f4d4628a908df546180b6246b8aa0b46af972ff1531e5cbb09ea42a5cc3ca38072e813b08a10e7adcb719165d1f4e0164bc46f243f9858d74c5d0b7fb451c0c972cca2462845f839cf646911d12f25d033a4ce5642d72adf907d759ca4ec8b281a304dcff168ba2432f66e46e115508e11831c36d7269539494b0ea213652b2a74cf66f6638807c4aa49709fe0f092fc8d67c1eb3f12600a410805eaaf16f9aac4fe4367316830a4dc699e8465142d80ff53f1dafd508e6440893ff82bc6315bfdc30a848322f8338915605ae182839f51f9006ce201e2cc74769736c94e0f36cda5c91f4198e90c69b09ea9ca796029cc6031b09006facdbc1244a2d56b9cc495c2ccb3121f164e688e8ae6663e5369a826c8630cffefe3d9aaf56e482f4d1098d0cd2842bd6d78a6289b5a40202106e42f481cbca46c184fa83bc888b0d0522f9b05c81e14a24930540b206b489b8adf50ce7938675b9342963df52bad51e871a432e38eeff1b7c3469efa1c491fb31cfc643ba8f423ec4e7e970499fa054596b8b28e56078271d93a5965b19a3f26e4bd888d619ad188fc6790cc943024bad6237ab10d546c45db83984b0ad27057f4ea9b7f4e9ce166a77e474cf46d69cbcb687a3519fae159c756200238553363c4a8bf650769fc8bc345e86cae302e05c9934aa7962751d88e709124d6d8c3da2127a310948ec82363ff7cd48f7f94009086eef93806f6c1f0d46e83e26d7b931a988386898cbe6c88b9e2341cd03e2053102bb5984079d2b34f8b9ce67a6af827239c81526239f62d043469ae4c412a85ecc28b07c4fb5fab6dd0c0a338149658854f47040b56efd97106bdc07f3020929292454402c9461bc315953378d5dc8cadc3afa0d3d04b346832c3e9535099a3dab9e742dfd70da9a48f62939ca426c6e97f9c72363df3d09dc587e8c3e452f92accfd8e41452014ce8385c25386f5b84ef6458f2d4f2218777c927015f3959618ba3dd14d75cba5d8f0dcc2c680200d90b414d0917f2115481748f855a3dadc2be64d56d74715070fb26a48f298748865dfed07ad27f44d390b5c418ea9169a0ba67e4142c9b7dfe71a054f557f6c2fcb8c0ad5c5257029a76057c75658da60cb811817cdf254575687b5c00bd6b2aad6f9e02cb380bffd253ab7cddd754e81083181053d1323dd7932680d6b9d7a8d72d5898d01bc0a89bfa30e78cc10a912a6208980939c9505f9d797832e62a847a151be262e680c2e2a167585f0023373e775c89026765a8afee3c7b92a335d69b31a1efb387f28a3e4c96cb6801b3a418f61bbe6f64bcb3aedcabb09433218c5dc18af4bf3d0a675a5e332057a801e4d945fee3978b368646288fcaeb54431d57d648f3c5b19867558f3c6093d4f9232ab97f8484dfe67f936a2cd9281e9601ac35c9fa7584af8013c3e861138b7767de506e701f38a998f0aabbb08af8829835a4660e9f0acc3479830f1bfd42005c93322ead07c882dbe8000ceb71c353cf5637285291a25e8eac98f07344371a39997f0c2c9c1b9f391b1e4ca43ff62a5d8a0a540bac3eaf0feb7902435b33c603588f1046c84df50ed293e8c36f4b39455151b1d344d0cedd594c9ef08a08a944f98f4837fc41296076e986bc1080d933224a3008840a854f514f68734756fe7785f6006087a864819a3a7893b3c80e3e6532c04e177a0370e3b3cc03324d149b070d4a2c23096eda298564a14297270afd20ddd3cc6f06f1242b7c0bedeff7b48a8ce08e9bb849048adb4156d50fe5429121d0c53aff8c2e52b965d97d6906c1d5304b4a7e7fd19a02857d9047fee43ed436b2818cc62bb0821ae90b361eed81406a037f49da4f69544c8e8202e982c174906c9c443e729027869c81f5662d9a410e5823a2b965c00b412e0464f281554898a3bafb199ef5709296b11e87e93086d2785749f0c7860f4b48eceb05a14e0b8a97220aab35d1135e419414ebf4708b9a4ab119b85c3a9996422ee49571e58dac0b3ebfad55b91b538ee661c69c97a91b194631cdec8122201e689531754ff1e6304bf1a3d9955e8591bc6685d701f4068591fa968748ec0d8093d22112e4f5a4efd915a3e06dce220a86627154d12bd5704a2675e465bd5f7ff6d156705fba7f5a364fb3bd0ed2a16cc8c513c2c56b891284d6ba4e0629ae2ebc515d1e0e22c47c5ad1dfe4189370c5046b71354a6fee099d83f189691928a7aebd1543259fc0fc4008dc0a9f182fce50a0f02820dc2eb328792f9ed224341d9a64fdf635bab92581c8d59882c22beda27e151daaedbb405de0ea23da0b656ee2927371be8d0c4814d8e74995859991a91ea766a86ffd5fad3d0e3557de994f22fa0f86935c0ee9d109c1ba5024dc841664d0415281fcf25d4e2d0538711080e3f6a56859379258dba551290283e5201050b0f285250b80662bed0419a9ac9ebd9f57d3be558b0ec586d187e13cd78c00a92c1c11392609a5a4b68347faa3d40b9c3cf70c687ed42d09251d3b7c9b6a77c9d5d641eba8de49638778e2525ac767949444cb2d0c3e4f9c4e3b27129f6e1c61924a15ae82302d835e047fa5a66f0224b973d104e4343931c37974157e85fd9d118e80dc684140f45c6862729d4bf05555abed1f62af6bf7dc2415fa5cd81399e8f30354dfb223801301b85f88a48d3dc9c1b9e4ecdd84b96efe3e39692eaa38ba514da6ab78e1b32fa5e92948fe3627ea0dd54fd68220e3a0560e5073a9866eb3400c47a7dd79796ddb4e5c94d072289ba5ddf31077328f6bfde3119d3b7e18a041f0884cf6bfa1dcf1e2fe2b9f0d8bfcce3b95e111fdc95784e0006e9dec0c1f40f2e59b77f6e204f2566bb0198a46ba189cb6a825c966fc313098a06cec1cbc8072591cc370e13292bc330eb3ee1f5a7ab67166040fa904162848b009eeec68f5bf6ee80b342b1a863828d909f07cafcae73c996c1f90a457a666901bc2083c30a9eab48683a8f89df467542333175555804a8abef903636a36426ef1f5e01fd781e35bd4cfe56da59503c5379d6b040c4b64eb2de916f29af2cab5b72d786445ab404346c90abd5d10d1fb1038216d6e6c85d1ea5f00a43a703209b3bd9503304f9e1e4a3b594b0ff2079d7c270de58bf728f1c6349f1c70a90f2dbe7408119c14a540fc8d9c4849d19549deb94fb11948c05183df7f5b2273c19e0f92dec55de05a2547b27e2da9b11db62a376772c738f3457631a78c083b3fdacb80b4bc40cbbdd5a104e0e9fb645b4c9c84b13c1d0ee63803fa01d54e6aef4bc1e5a34b9f33af8474de0c0c5bc2d15eadd9548aba07a57786d62e0647e6fe27f3e902ff52e2d2811990ab5af0f1559263905ac44a55e730f9a6e71ccc1f63de31ffb75af5a71cb683f2ba74f97f7b762036f78018a58124331140fc924991f6051c66ba78e324d7017634731db23cd2e57f35387ddd88711aaeb8ae44abd8166d7447a39ff7869c68a91f17bd2d8894cc0b91667440c1bf420c5377df1659c390da1af85dda88d83ec6061490d620e69cb6cd5529a2a8dc8613be0375d5cb9576735188dad800aa1f18fdfda5a082c63d25c0904c99915c6c7a427b59f60af3c9f90267ae9f051e91bca661a2f3a3ae77cfb31d23a05e2b278c3903c3a156de9ec5ed5200bd1e0636f0a1d27e457e652a537965a9af5329837bff565dc62972120e356f4ba84d5b8631bd8dd7adb7880f656209009265510812532d3dae1eb43fa0380873e2febb54231aa2421ae4b44554d47ddead34fe68106ae591cdf2def5a9e8f9fd4628b78782f61b61ea84e1d8925dea82543da8240da606ee8b3ae0f2c14e6dbe75446a23510ba9da24d4328dca276a5a0f6d7efb8d656853e570f0be1e8cbdbf1ea7cec3860d032372efdf8d9b51ff2b73d7a397c2e3bb303e5cbba4812273eb6bb6f7c0e6787c5a8bd9ca40d29ae7f6923a64bf18873fb32a11fb0f88ca91059c8d1623e1b4463759895b94ed9605b2c08fdd988084240eb5140a26058635a323f5af32bc763864c7a958e0463e81aa06d5c5b59a0f99feac27c48620a9ca28987a5c7fde6b4787515cd395d2b0eee907fb4f222078c546936e8b7aecda1dacc5aa75881152e0322879004d16882615cd7b324899d630a0f58765ad55973829ef51d05a5c6c21ac623a2324c999b956b79768ef1d925a820cecc20f8eb39be3e792b915264d4999acbe926f90b35ad2841fd19cec995c254115f13005d51d108d81db8e5b331d4e7669196165ba972740a742b6e2c8c1541123815a08504af3b29739c2ae020039303f21fb468f910992183d3bcd55a049460c93c83fac1401cac772f9e782a137de59ef37f7bb760015062170dc60d8bed6a54e82f26feedf31c8bbd27c3b7a1a3bbcb94575955700e39b264a5219683b19ca7bed5dc64e10b09ed6f30ea4b30eace8f44d0f4ff1e0e6eb5bc1cc3b2da7d3d3fa84f321d1be55bf606afbcb458c070bc0721c44102f97b1354e9138306cb6a60d4db3de77fda334e6b903ebd7e0f49b402fca141b34d4711503af8bc91a027316bbed578967db39fe6dbf9e2beb0c8208e9af9775f848cd86db2badf27ac9e7a286a9e0221102fd59c1409f56766453efaba4fbb61e0797b7c3d30c5667408b51c046a116fb2267294a224bf566d752a5494cd49b482628f48545bdc852e685a409c172c03d08e94248930d683feabc0aa3111e9fe69cc94ade517d542ea34cb2943100ddf8924bd71a2519f593a71a0b70ef2faccb0b0c6c34dffcd9ac14d128bd6a02994e1feb6790d69f41d5c313f421d51c334cb357e1278803fa84e108b8096914d958c572767f953c43ab87cb36132179d733822a62b4296bdf1c0906b943b28b088a9ad843efd6054dd55141f190f435ad54803bf0b274bfefdb92b37e62768250019852f7bbc5c2c6ba31d8410f41c62dc8ac1a7803ede7148823f213f176fde0dd47da28f8e81e4b2bc53143ca4b9b143d411598bba2ce093dc52dd37033b4f7060d8477fd5b179e4652399e0ed04df44ce8b686b5996353630b8b5e523f93682e4029a2701f581cfa1ee26ad2fbd0a2e10c76fd4376d2367c284a13fe32af72ed48039f8a562419d9558c32913ee02667f8c3dabf4e3c78f47138acc0824a6c61189d7e3525d3ca53c58eb352f8e68ea049e7f6bffd2a3529f82aa1b29113895cbccc518ced6aeca6a0c1f2a57305aedd7f6ce297eca6eb557f4c84ed037811c05a03a8e34600f79669bb104ece663a4e19ab07d6355d8a30b99679c2833b0159c6aba7d1e8c0d0c1a7e49602b7ca73df51b2a32945a78f9725dacf980ca1c3a51f4c4e4db321789ff0c537fe9ee1eebc89bfac2e66a41b1f5700d661b411bb929cde5386237ea1d8e91faa350c35bca845e90da94371c95f19ffe30454b2b2a413719192746a32c9ad43fcc5c3497238f4202d01d561a0a4e947ca075e61b1b981f0654ef6b0ebd86c6cf35931c507cb9b872efd496577019da2429176f10da2984860b427276c33234c60db9fad97ca8776359747215121ed9da68c8a76ff7d918c3b8325e89b64b2f0e93d6e6438fed20b6c967e2c933231f555bd89135cc9741e5c5b9dd29db9921dc34c755b330f3045a8b921c5c2f5762c221f41a93ce655ac5b474fd7388831ad1433b1a4ba6b9a15e339d930463f1418b5c2efdd184426a58fcc61f53216acee89164de0fd42f4fdf5590650beff347845920a8b5ef79933f26914a7029b07d0362cb799dbf6ce7902bbb561b59f9225852a81ce6d6d58344a12c8368b927955576ac3baf8fbcaddeeab1fae8376d4373cbcc8aa7dafe4615a36a8516618c7437ae345f96ac0cb086d0a9c5bbdb03e3e0a0e57ce96486c4fd5ec26b2aa57287ceb2d7b1bac64b98ce032b003ebe6d827abc578baf3b648b0ef12243748e938675b40b29c5ed243c62b5380c248d214aad9cb57ae5f19707e6cd553959e347b19438ae23d56e6a4eb02bdc9f0c203985c0d797de9c80bcdc98b3f4fdc1bc1d0a1a9234d9c208646561069123c795d2c0ec1e5a0757ca5f3aa3c44e0e49de9fe3b34c3b71daa88948c8087e182c013479c2e405d9bdb809c418bfbcf8ced370a4308e92632f2c57f4840507e81c4db84053491154b36374514cea9aaf07347350e6b46c369422e04554ab708b811ffc2b0b256713495991b921d3111b84cd69e9ed70bc0c6ec3dbe77eb6c8829ce4cbc73db1f17d6a4a351befcb5d3f3b50ee514202954ee1d2f8c35104a2ec93093e9e0daad7e922aac15d1df110336e8f12bb6fa23aa46f819e8c256ce14bfaa111cb1aeed361beb32956a72b7c4d5c064cd34aa53a43c07fe57f08cfe6da301c5530d1751b72daef8ea0f1ef7e8f095ecb1d0f661cfc578b258773938dc27cee70d67526ef88ffc19df6672310c20511b8f6422cfbcd4287c0e8fd2bb5f8c0858b2fdebcd8efef166931eb2c6bcb52697d056abd6e5fce06e49319a6556c9a4e915fee1b72b3efdf1cf8c69af84fcc4d59ad4b8415e1e9d7917ccbc2c1a46a509a587500f624a37b5473e0248f43533acd900d548cd0f10a2b3cc8f4c59ebc4ee4672be59ad8cd83e465fc5d133d5a7d91aa8912cd493b5848e45994f796cce21ed3501b0e8a9ade0d04d14499b9238ab7344964f76f909542ed8d576cca41350a6f7530d1cb99fea5d3c2e483a8589a6685a8787897daba6ddc86902c2ecd40e8013fe476d6daab7a3e09814d5d8b56ef76fb5ceb1262bca51ab8facf6f3c6cf5c9af53df69211c6374d85c4c25d1e82ed9608aaa742002d12126d228f25093c0473450eb333b79ff78ad09717d5725dd238d79e9d1b649f04d905af26442143e152fac6565f53701bd02aa1cb84f56e8b1c6bf0eb99c4cc56a160040ab349d2e83be7bb2da2b2307f4c68f7bb2bca5ff276684fc47723f5d9f31e964e9f819eae7f40cb1312c7472f203a0720129fcd21c905a4ff8805b20e8b5e8fb119d207fbec14497238fc83b7d271870c5839269b89622f7ff78dd06526c4e1fba4ba9833997c52bda6a41a58beded38a15a19da9b404ca2a0059a3c7725ecf42f82d4de7706a1d26d55234e01b93704d17a60675e994a03edd764e5dee5c268a46035987205786e0832357f1acbab1e76640762599b2158a3caaea3a87c39ffc6135290b7f60c8825671786670b0dac352c9c2861292bcccc8907bee3040fd2ca2632ea431c1ff95bccddaaf7acb63e99d9375955c6c8676e9922a6fe7ea2d3ed682a1574dabe890c901213308255a82d612c0a096b8837dd3e5733cd870356ec4c403a9c15281e3f79b6e00870662e96313360659cded85596f23a0063f16650a7fc400ef2f8f5f1b5934097888885a42a9e1e4b07d009db997e77874fccceae4d081a3d97dcf9a6c118e136691675a8f6ddbcfd12d92c919bd4bd9f583947eceefd3cf401e6e9821c7702ce4ff58fdfba99aeba92861691870bdbafc9c464ccc16a7f36fc7fcb7bf3d434ad08f8e9e0feb9b0120bb1cff762d0ceadd5102b818de24e9c20124c29c980a81249dd037b3d42a8192805b8be65bde50281bb3b63c060d6c497cef37a70936a473e4857b63a99c9b7f72642e311723d9549170974c2083b4afbb6876c1dc1d420fc2ce21d1f42fa4c6effe6c2e4c5d90f9359e236fb44b784004962118221e6661b6636b580dfbc8ba8b3b2e617241e3cdeea2838a80391d93430c2f26b0aa716d7758bc2b6a0783570c0e0a5ca4772f10be49b800dd37d94dd3602fcbcf3b0abe1840111ad2f3cdef920ebdf1478879cb9e14f614743ae0c92a52e6fd352de9984de48e1bd392162e2fa44a86304c7ad14b4b7af57d2b0da53a5c534bc28af1de35afb07682859886978fd9c6221a5749592cef20157d8be6a8171a62875438ee69d03318367a3596c007f67e4cce8bce07a944e7a498e692faed22d9334098289f79eabb95fd57537a85f59d359e90a0244586d09788182ca0f013e96c79ebeb549dbe9efeed432424e8267e7a0ef985dc288007092f0d8e86c0d7d7b1f1812ebdfa711e583f3059a0bc03e0aa66753b8f57bb22a407e0889824dbe179700bd7f9847d82455908911566f40fb0ba502bfe65342b47fe4a565e7437293d1acc692f20c22e71a6c5603be9a90866946fc7771b2a82cbc2a385dcfbb1b74b24fe8b816bdf4ef8faf67632a2814ffb6adf84b1b2ea79c033a6d023fa42b10ca08145d5dda39beb169c7d5b9b081a52cb89f25e080e0d6ffbb8797e139013713b36c2696c6e47beea6f625ecd8dea07ccdf4ebbe926abed2532105cb47f57ecc2f91aed981f7bfa3b7aa9f24e4d8b676701972dc62dc8fb186a040249504837ef6a96adb360848bbb041f137fbe46e3c3158e5c7cd48798e018b8b5c141362c5112d8879723b9436b1f9c534d8d54dc547a9a9f92e2c694e2299db55219097c9673036efe3bc459651aff10189c799160860ab9a49da932c0ba0390740027d488553131f8296bcee751b14b7ee730a2a8aea4928ce2e05a850b12e75e5495040d7b39942d5c1df52f223b161bbd1abe8a990572687a21c21466fbf0072f4cc3d7db1a5751bc6ce382d1a150f93a803318df07c3dcb91b958295a20abde6c248b7f7d3d8b99a28ab666d313f58783e3439449308d3dcc80b80ce029be163f6c27c33177a006a67deb2374abd84bd92cfb1121807f08536221c4c2288169a141592414852a33197a0ece91a1e2b9da6190e2cb8be69599725b86f2f805a379fb66c6d9014d5960c3ef157e54f03749cb68a4eb333f7bf08998a0650f07b25b0dbadfb7da051955494a196a04b153296fcd2aa8cb6dbff430bbbfe0f5bc155b4c07f8748c8342b09ed09a764409e02d793fe6acf34931456ad19833961a1be677ccf35658ff31754b70c717d11aaa1b113681fb11a67e022c78f51054e5cbac4bd73a07b54c5a11b8ab90c45c914d965f754040e18a334a49cc94f17c2d345948cbf9a6f63823731ed47e5e730c5fedc4993bb1c1e3fe7284f8ea68846bc26dce700291b696755278065192c7e0bd44b22753c1539c7b6efb400e60c9547866b745df8868875e3577eb1db95f5d40b9a9c4948c1b58ab809b46fa2e7e3aef582d2f8b4822a4df9911b202d49981690160d70940e866002918170aaa2b240772aaa521c9e4b827f271d9d65d95cb1307a1d6ec7e1f5179a077a239e8285a748c9157f94072951dd34752e7961b36e379a3afd9cffbe38a20ad158f5e846e4ebb44eaa379a08ee41434d19b8f2e19b87485a308a5961f758d468e780887d40a65ec9fda58ce2bcd076c0b44cd38f64c2ce98456744bd86f8921f01d85a658517a4779c6fe6304342491032a6580b482c32e58f7f61eda8e89ec5f4833cc56b9bcc82098897e190782fc81bfc4c612d9923ba7f720a5245e6e41445096334ab39fcb485cc46b4336c6acb4ef45562c4ffc25e8888303d9d67d43770c167ec43f6af177cf4a94a9100055c762adc0369394e81ded3a4d62db8d91e2f33ef4622d23fe8a3c0e6c694dd806a8d7ef27cf6b5198176e06699b44cc86ed30ff6e917c94ae73e0669205357dc5320126721d2af81bba6dee1e3f7f57c477bd86168ad50ecce5fb958e715c42d1e5de3a00781fbf10ed69e124802a5852e9a1fc797966c55afcb9a3c0828e448ca8a6fa664ad95d6c35089bf41f5710f587391e5aceb7c6f96ecfd048a5b405d7e5fc0ae482df7655535ce9833621b7d12617d9985d944c5a8024ec95c29f92812570603703e00bdf245966111c48794d5ced6bc16a72e573a74c6da2058d5c2f5ae1ef063b268909dfbc184f5a8fedcd6e84181c6f8165f865e50ec55e96a82cfa1ad2eebb05a19429392cc475b2261c45fa282b65afdf2325a89f1920402f9066493d0beb3f7b9a1c037df2bcbc634f83cd4c49e392b5267047e1fa0525b9ab851939060f7d946b6bad8a11b0be5ce9c0a02cb0b35dfb0515d275ad01f5b3df370aad8164d6a8ea14f717a4d681d7ef426c9603cf4140802317bc40595b211957a91da811f0f1491f2fa06926b7f96fdaf1be8b59cabd60f1248d28e04d9ea92bcda57348abb0550b8a0f63ca076685dd4afa7b51f43eb5a60f06ac2ce36c906109f67b7f3eb8138f0fbcec3db61c9359cb9dcabb141bf7b27a4a538a79a4b68b189ca84d5011d5837ef78436f441c30eda190d428af8a87984882c25c1e7e1647f49245a11fce2d45cc762e8c8f795b2cdfdb485b619333c113e3cc86fa6eacfac6cb7eb645757dfa6c9be7142110462c720df6a903b113ff1b9cb00dc6e78487ff0ec510e496e0e7982658cbd157f76b781f6ca7feadb33f84db44aa12ba889962f2b87bdee8d68d1c1abec61ffb2cff66cff25e20df175d57faa71f5037abebbed9eb61a9ebc407a60ab952f09cf20cd2ba94dc239e86c44747817f6a8638eb5eb9a2f192d6ba660bbf2ca2e530598331cea3fbf30357093a32e1e54b89e5a6a1bc953339d92a8a8b0876f92d616b209ceaf415abca99d319d24bb32014b31b466e37c36c3f1748986bc097ad9ab4da866bb9fad7f7c04713923a6d8a5e454fbc6892796bd4f498c0f5c3910d09e9f812b1dcc64c7047efbeff172caffd5dfb99d67b0e52ca43352824acffd7bbbc415054f9965e982bec0d632df7f9275c7a0134cb3fb0b28e9d8a431b36249c858a00c7498f7e15820cb50a3c3546568fc98cbf6119b2d6a51d02106789ec205dbad1c4d6c093e861061ff33a1f5a146d8047e01ed31399ee6b684ba2b2d5d5c17d8cc077b6d3c87cde33575697735d7ed147c28e7394432571c0a000e17393f2df07bdf7932f8465d62e9083b19f9920eedeb65b3461f66e4f6a91c26b5162ca50624cecb7cf8be13a8f254b22720e1ea370050353dfb5e9d653742b9ff3c2128e6078c842092bfc28306e13c7dd001624ff552f779b37c6ad86fadaf4cfaec1c14e48a6acc86faff7f1183e99ef15c0b9141628d22925f95c6700efdd857add7d341cb6c08e658d9cf7753d2c8c61116623d9078019155841afbd04e8c07660fe5b230a89edc11ebc471bf58ffc850bcd0c58f34cc978c014c9df9e288561e1bab170d7d832fe5b288f25afc7a04eae45e9ead71aa08f8d18e0c2b8845a1302541e36b080090ffa52b44f011fc450ddd6e72abd70b6e9d4d1200d25b456fada2fa1b0e106931b42af3a66971ea40422652d72134bb0249477b1dc381b662944f5715d6c8edbefbdc1987bb514ff408f2b0955aad49d66c515d4945d48e41136b82be3a923ca9c313c3ed43f0c0f9c504c74d89b9c8a84149433e61724d142507fb70fc9d239ac80b7adc28751bd189c283265a98e5cf43bf2df7da7dd6329630e0013e360d0c6a7efa9ff309ee011a3621c36631a0e2a3831fa8b7a3e815233ab6e98e9c9dfde1303b49b46e8192e70bf55a28f12cf2cab6a5209064efdc3881134ceb89e2e442c52443e3f048bf8329a57dc0d1b0f48349fd57d5272171e4542a28f936e4869c94ed7cab818ed1a027f4f4d223a171a81f211ccbf16032d5b43eabcfe00e7cbad0eb99eb83c70210beaf900d72f6c70358aa1619cdc36c91ea9c6b60e7be9d00270b866135264ddbfb3c383c26687461aed8471fc6bfd12b4f3243863ae33915ee67929a1879b2abfb9a2a4a8b5bf3a2da0ef28a90d43d95fb31e7746391cd422729340ae1ebf73e7361d1d0495006b76f9b920f513efcc6e0324153e7f6e0cceccfe40e56a127bc6edc29c9b948bad2d9984929e9cbb810b5da96762098330dcf5af4c1b0df5f9d08dd5f1c0f49d276292ff314ffdb38858a164b3935ad9021803b5d214967c1768fc6a98f4ff5f7be30928871f81428295ed5e951367f93e3b37cc7d581065d46c58e22404ef20a284ae112807fd6638e588a845dd85c4428f766bf160a259ae6499660eb663e8753ad801aa88c89b84d26b0628cdfe5a99a1903128a2f3c2726395fa2241f88ab0d2cc8d442dca57e8723469b0898a9d92b7288e20dcfc750470a1788b6119d8751e2278458d850abb408abac7d9d625b90c76504ad01b4ffee367a9e6d2873ae3121897d1d449d43a4a1ab286b6ce0deab361e0e9df651e4c934dfd9847991167542fbd7c13e84bbaa5e18a5c1df101758ba7c4a14ad24e6e7f138c7dbfa76208086d419b0d0687247ac50c395247ede5f93c0903a8703f8e24805fc38660267a1e9dc829d6c2fd4ff480366912948c02f86b86a1242abf468afedd4089d12835ca7647ed6c418003038d5c955d7cb227c001c45909dab5e68ad95e32f2f3187b0a97202228ad23ee2d530a96e3ed5a301dd5b0a825fe228851d3662d6b1016120450174f1f3f59324a2c9d6844ad9d8ce681a6ac15fd3fb0dd82e4aeca04ba306a577ff8db66cfd0029cdb03dd92a9b7cc303f2e91cf8fe285a7fc26931e1c31ce808a79999753e4312bc8d31d1d24103e264c0ce03031297d691d2c6a5080483fac539a1b5b0a054a11e55bfb2ee90d3d3c7f2aa422577307074ff788c1ae71683440676f013a083fe0d1c87a211ebac3c649f0c3db452615e935e6c89d6240b6876b682ca68d840d72dc132ba2feac2370da66288f6f96d2670467cfa6f0e9203e681d3d09eca5dcb5d27c5ce990eeb434ef6fbdda95ebd5da47d452984871602cff3fee9480b8fef301581e710c98be160a4d6b341d6db74093105745b28e9c19165452a9a6171220716c9bc0c4749ceca2da025150c8dfe47e29ff075d312f9096935610b35cf4f1839282f82f0891df103001d552fdd3ee6496a8f043db62ac23cf3fc2f012786cb851b7abd306c041d4c03f6850c52929dc9e418e0371f784e2014cc5c7e0cf40c3c04044ff3562e524ef335556acec4bd08b97911996f032bcf397f050938decc6345fac6b2f4ce3e4db77defbbc512d0a29bcf91f6bc9bb869f09de5a3d99d13d1c5a7728ae4798bc9c91fb9b2acb7e61bfb8d1f4d19a7f52e90bcbbb8eec0c55941b39e3df7da8d57a74734a01d7bc51cc7aa2621ddb84ffa7e47557c415fcbde01b835702ec1c6035fe18d89cdf8bd749b203eeb63525c6ca16495324c065f7e919339e31074c57b8dad055e99795af5ebc96d934f2bdd1fda4d624f50b97dc521a643fa4c1a0c35faa35420480e7a9f4506e1732dd0ed763240edfd66b7469a59fa29fc353abf7636a1fd126cb8c0b7f0e73b4b06d8a8361272bd7db5140ddc02d6b5df5b478bda1800a8ccbbbe1a77d6bfe7d46f191359386cabc37240bfbbde2ec34136aa1170718042daebecea14834106af723b093d34c36161eaebc65f510f278cd5c481704d20c7213039be7335c082c19c97d4ef128546ee379185c51d52b9eff26f9db2d59917d7809d1b624017900ad953e7f62fa44ceb9e1842b4120c3727941baf9747fa5c87b551af876e24c5de07261cb7c1d0fdc8ab37e05e8e2a50de90b6b2e987508201afea35836768da2dd5de0f61bfa869c1f62fbc4534550cb61ab105291e6e29373f87f90b15836d75e04a2984514b190d16cdbc316d4b7a6ae099ba3d4d6eaa54f5b495dd22b1ed98243d37264f87e7fdc1c6d3a9b3cabac75a3fae93946f1af4415a8fe3b9b1386ee7a4089cbf522f4a79bdf8d3d3fd38a056ec331b22b80fa6a51b16c7b1f9a7da9e8c2bae84199928066f79c6c4ce1ee97a4c88f526430ee21735456e01cdda347046b5251a8d9bc3ec0903a784c99d7c92f36a6bb22ba1394ef3e4deaec1d4583679b2bbd08bde24d15a09b4ff33f4c1ebab46f3eb93e8ed9f5aa562e70e31cdc164d3d666d4c9a33b9be0355635de0c1ec76bddc3bb714f6eaee81ad4d7713a57dea5bcf8cf8a0ba83a32b163ba4fef15be2d66c39a043b1d98e626f7f5eba5f6ed008cf76a515b76f42040f11e871ea41e4d56914299e14fc58ede3957f8cc74aa7997019ac4c0c0e6bcfb47082ba41cd1f7209f483fe8bee559be59b00648fd8e39346c78525d39a0f556ba51e376693b7d3463247080d7bacfcea43bdada58cdd066716902fdb3eb7eec16e570a584374504d85266388f2499288aba32524c592168fc3112de25eb8a8ef9085992e2e3303d81ed7d8c276178442101f06d70d72ef894f64211051fae91f496a020a337e55fde5e66cdf372d5d99425a5ff1b6289067e18e5833eeec68748b9e4f59516864580b61f2bd41eeed0aed9fb6b1b80d2e3e28ae255a8a0aa7525d68a1317a2682dc2a90c9cf52bb58b4c5aa27f787b215a6052d6f834242291599ff2b34b4153063cbf458292ac2c2db51d62f65e939991da150d85de9e6073b34fece238b94d8e57b4c014568a93c5d35652abffe49e916b588e73cc2f29ac4aba8a330c31e43674583c295e52a7cd60828583fa516efadf72bfdc5c6c80f02df6ba459732d27c24860b658b7336ffa531e30427fc3d4111f3a7a14c1bfb98837fa2a2e5222ea36ecce41f31de23ace2ed4871521cdc53b511457acbd69fa15136542ed44c76326b4dd9118334910bcd0b1c9b01a9a0311ce8e3f59b0f993037f0e84982eb7521c815ee3b0325e58323aa8662efeaa1ffe764c2c09d638ee96287e203ed25c6ec425c2c6d3c432cf53021beb8701f00626d705a056e50cc9ae2b9295b5a658cadcb49b8432be640baff58d561f54701c1f1701ec82cd550ab446210d80345310bb34195c3e801a85406bd44ec82d9b50fb0af614a0cf4aa008d5b7f37215042c534c599c80b46bfd99cc12937d7cc5a866f79d5a076ae9b12b87263249ad815fa930487227c62740cc43e0e9fa9ef2dedd28e47427140af5fd82918e4450957a37644812d50a4fd5fde92f27fbb24a8bcd52be2f3138a3533fc14c0b4fe73473b7d3cc5048b51d34213545cee18f3916085f579937c53ae5cdd450de048833e2f7303a579da07b95392e0fb749c9e24b38687bf7106069b232c5234cef4c5b44bf55bc9fb2ba62024ea5410ca7a18c842201bc87ad167af50d12dec97dd308d2193b3ecaaf279967811efb893d1663fab395a9db436c3f4a95083250280761c1dd7d383b39589ec2f755fbf8819ce272676f3688bbaba01a605888e269cf307cb067fadc4d955c960ac7cf382318f86834ee8401dfc156fca7798cd1062af43680002d31f5f789eb1c4118954c2a9d539609e40f2935676586859dd73035ebcc3208b3022a1c7d116e94e1f615e3aba3147afba508a719db96400d4a7d3b3b3419e409873b3bd10dc0ec898f6f6846737a6d593fd3beb0523ba2dafc48d79b4f3e35ff09f05ed783382eeb4f6ce81b5f403c5bc198a4b359034ddb2b7c336673b6986fe1bcb0af7fe2bc82f9e7f0d0b448730da3583d82275a887664e61636175db2435be7e85e5fd9c45bdf9988b9645e062946068528f2a5e2631a6e7fb296c89812eb787ada673cbc504757b54e5f4da9f122c0e7342f889a8948aa689ec64f98a94f34f64aab590e90412e9554e3f8b32b40e4775513e333fd7bc77568473c3221eb2b3a09f37dc73d503ec151e42b7ee4199e2242c8828642210b48321f96ce35f1d0d1508ed195c4a45106a52712603725f8a6ed87afbaa0803c513bb305b95c4122e59e13a135ceb29e2aca88ca0c96b047a2dbe70966c417830c6ee1f9d13682db9a90e2fa30beb5f3e7d85baa014f5af18c761dfce0a3f96271f618867a88cbd63be01c87337821b36a2f419a48a05f0a789baa69683369d2aaac43fd27a725a6d7d44db382883b65387b668adda1e95451e5419e4a04af7373c905fc6098a89d041de748e62c72bb8d91f1a9953cc88c7cdb5413576162673ec2db8cc16bce79b8b74ceeadaa5330d0d7be8a4d3b3aac0db85a0d7be6ba47910b3c53a78d82a4dba9c9172ab73585ffb7868a9240863ec9cdbf57833203193417d32d7c2bfee2758198f448a6a670fea9a1bbe635ecf513ef4de2291de2de6750185a69bd0eed152c40d2589fd7cb34dffb497fd4296bbd8991a2167b12e97b3e01b9b4aa26b79df4347abd724e5379c15249012ca1229a38e7280ce54b804b5c20ed010c60172afec664344fccbc72a4012746ea7de315cd670cee599e137b9c96480039c51c5dba8e9a46067d9232ef3a18ae20c4250690cba1d4781dc7e75bb48fbe0e4b61e2e9e31ab3615ee3fc530afef1f488f8ff0302530710d61d51c46be811f7f92f3ee4e4ea43d8cf39ca256b461107d23b1e16803ece874566cc3506cbdbe440d017f88ed52df11b56b70145cad6b95854cc497be854840f975ac04524a48b868cb94ee4777325b0e3f4401080c949ef1625d1804d7c02435ff1ebb349c7fd1251ce76cba32689f29b6ac4415222c0d301f37b300ee3963468f8744063a427303e8d7f6874dd9bf35df80744f47fd40af7d0efa1d630595d966415bfdf73f93902bbe04e488921c53486eda7eecc0655b7eec6612d943552d83112d9d92ba24c8d984b5f0916d7a9b0842afad911b4df22b6c7c705cda803ec2d9554a6c534e87441e02c3cd126b89af3b4514e80f41f735f109003d292d9ad6fb837903efea0df49ee930fa2af2f310a5f0f8a3c9ba0eb6746dcee925efc928a83d210f4cfa5ec2c995a6f53cdb1c7ac34e53f979b410ab7b1b7072647415ff2256a7acbe59f0ac6d18bd2d1534897537d5e1cd6e4d84d3a0ac6aec2fd56e4c40c7b1d2b72ba49612f6ced37606bf1a9b8fe1050fc914595208f85e1367b40dfd6d0a0e81d38fdd028a3b717d0818d327700471dc0eee21d39f392b615391b8346911351a70d1041ef5ae01651a3d3a0aeafbfa2ad4ec56205475bcb91af379f8870dd0816af82568f2456b51a1cc1dadd56b3c0be882c058cb24dae8a4364c6df8fbe55d70d664090a715bf6b6995a368ae6190e4db6f2630a3867c4538b4c06efe67254a416defeba2ca0d0af1f3224cde2c3bb5da067fa88a006a9413f3ed48f4da3f9030bad7984b48cd51a9ec9bab400cdf7710591e82fcda13f97aa7a985b5dbca603c2c276e9147403596e701ff6ba2c384f878c9d8f68714bf83ad61a7e873990b98cb886d04155c57ec0608aca6da74034c95d97c24aeb98f4afa04ab893e816233b955b5c3dc7e0cd4e0a0e10c5457b867a0a97e69df78b8b7df07284c6fff4a7924bd76d93a170ff33597d91a7a181a347522104c38cc934fd7c7732baa9f3194331744fb1cd6091e4c8865a93fa27e902af01d271012d057b99a5431d4d76be54468b07e501472578de40da6acebaba9f54c15bd202366b90de036010b6fe76099e9c39604531bb8665d976d2adbdd75227424559dbac9ce89d35a19888479268e0f5bed2158ca4da9c6147730dcf70f44909f6fb203497bb7c80bc8c573dd094d08f75a42404d7949530fcf8ae46117c3e99cb324ebdc25c5f5255fc461f7b552e2b85547ad39f286acda8c87f8f0dcf7f144d7cdc1d9e622f58870ea8bd74fbc093d6104ca663a830dd391dbe10917d5266ba6cd396ced8f71795d69735e7893381c4b3749d6f9c84a455749adf78f57ae7b07f13e071eb35954a07b57c21cb7a08856a799f2eb23ccbb3ed10a7ab4bedd954096010f02c47895a10a6cfa15d0d3f69059422ef36697b5de26104e2fdbd1306afaf1628e90ef5a261b14d7abddb4cb2b0196af2fab60028ca9f95b0b3b22de6eed4825260482da170210433781e34a281d33cc3ac113bbf3a59ae2c9c40392d98a18dedce38e5993f8b218a2bf491b886076a3a992228708998149ab136dcb5ab52d0cc24d236a81065c7b3de1d54dfb248657d08b546716decb043c0f41824a1ff1323da6dbc994714ee5c4d14a937a547e5c59877552bcf143929219c41550f0224fd8c2b68ee6abccc68aa81bfcfab3982cd5aa66c79755e96064c7916c37b8a45c03b5955a894e4b0af9b6b6ca8638da260b49fa0313c1dd50374339869a2ef9d32642744a2d74a9175b9609d108e6bc3ecd658cbdb93e872c25cb7b087b8facf546ca3349020477623f34fad80f35a12416d27bdd99d45ba570a6805ebcaee05a50eb9f8a90d4d7dee8373c195515d2012e9e598847f4a31f9e0dc085167466ecab2e5e6fb968c96fa2596b279b269a36f10c2ebf7013f199cb074ca44faedce344fcb52c006f4eb7c7c025528641443c70d96f09209fe83fcd1827872f6a05d0a7e25274f34b93799c691750bbbda884773b9d15db47970df21488fd04a94d80b34628affc2bb08b7adc4df2ff7e7367959d231ce17a0ce8301795a8f780cbbfcb52ae807ee40ade08f01a35f13213d17c0bedc74029096e672f759680aaf4d7c2fa8e14d07187c9029927f747cc94fc6aedf60ba2d28a844c11b2c13a5d72a039a9da3821b306cab1cbd4cc3f5d542ffb1935d8bbfaa7af64ceb300dc7784f903b9ad470c43f9404070763e02be1311ce9822695cf22eb021e6f33006b65d5bb2fdec712c01f6d39bce03e66b24c19de71c245995bab9a0fb739449ddd9c88d08de9a81d458071848904f39af692242a3cf137130938697a7911b40ef641dc3d1c43fcffead31534e0d837e65a6ac869a32260ec124d1a2c92534e1621316bd431ef75d49810734f97071b54658e68565af65182d9eb20472c4a2b7a8283c82410de83990d6190d291636f4ad7365e83c1a58ebbcc975c296e8779135d6d057296dee849b7a23e1e9455acff97905ff3b7b8012ead482d4b8656ae4fdc82b4efc0d8c9c1c91146c5750f029d9506f58dc85501ec68bbbcc810f8fcb0a69012fd4f06b9b104fd75959fa0d08d22707fa9a49ad8dc1a5a15935bda9177a91128e3755f3fcde4ecb251d919e393577d05fcf5ecc07284be7f9ccd3bc41e070f731c0b11e8a52a50d17710747138fc5a2671a956b239488ab64266704486729b25706b1c72a913dc5dd15c787b454d2db7c898a834547a9b7b2d7536a88b2851a7ad8440822fc06f503a8a9a250e018ac520f796c5a2585239431514d97d2ba0145d52570ea9b35ebb3c84647cc6008f626047372fbb5e4196ef7668b281d869a364d69741bb8b208a7ea17b5ecb89947ba90def23e4ba50cf795353e79d0e197aa22fad64721f1e0eb64b5ff639b288ecdabc94a9eed30f309160695f75767193ed8cc0a64d8e8b8352b94b19346e7748514557cb97d97f15707d21bf437accb527dec5c39e916a9fa18550b646a2817bcbbe481b33d41a91f6b4c4a3de0b3d2a0f2ac0655040e34d0481c06d74c2c83b73d380665abf878149b7f70a5518f0132956b78bf15c91965d45bfe6c92a0be5d6ac6ae747e43ce9d6ffdbe1c085279160d688a57968bdfcce73e3b24835642b43b4fcd36afb3c5988a0c70568015419eb5111cc90b6fa3c81052ad618b5ce4087df09433ce57c5e2914dbd7204f24f8d7c299752019d76fa0a41d7a258e77f10fb01349039290af478844dac20525164d4853dd3692741a7ab08429c89e37386d31f8fead231bcb10ee7934337afc76eb63865d872b9579c6b1a9bfdabdf1a81274e41fa6259c897a15f113bed9cbed7335e93adb839ceb6e87158043f0b5dbf061d2d4510ea47663f71d6ac8c3d96910a24bff3f3c6cdb371c86ec5b2b9636b8f65e928669613ebf69711e78fadbf6f1184d0e46d35b92b78d770d8a07c2657bf4dcd0b1b6012e32a038b3efe2c0c6b6cf0b7973c83a866471ace0cb5cfce4516c0a997947a49c6e974ba1f15c7570eff68c99a5ce6e91af9271fee24ab9b390060c9113c43737b872ec9ca642cc0d30f06c868b0383cb380e4bc04d55d9c65704a63f48655ac98ce221865ac2cf87c5cd95b0f94b504d2855902a0086b7fc0656655f2c86ea838016ebade5672c773ec15124859764a341bc89286e04c260d0e59c3fe73b94ba12bf70f41ec66a4f2984f51dd73cd62707383b718ce77bbfd577a9cc7c4428ee8170dff4f6f42581c7f6a73353fa60bb6c4cd0e0d50d2f86aa6e669bc27f13c6bb92646f3a990bbf4f8e93747f471d4b7f1d8c2b2f277f19209b86e62f5442f387a781a65401e270b40effc43f4544cd85474825fcdd5e31c08390bf1a2c729e57520fa68d85b9889c530031fd1f7c423756c36d2a7c1557fed5b38c4191ca86fdf741f6826d2eeeba47a1e7d7e2a594fbc343cbe3f02d2a657c10d041ae0ca13306a50489cb40c922e92b87348d2975b3e8e45683fb9f4b36f2d11403a6bf949bc1daa04cfe72bf428cc340c6154b4f71779002a9901914828697a2dbf9146ec007f73aabd78ff80e4219da022e17e4255772fb4872c752a5aefa82efb348780ff8002b381f2ac9e17f547b3840c75274f8ba4408c0ca0d9d6f3edacbf10d5e0144f9b3830395b2b4a42f2ee786e31a291c381eb416d623ca684324cb0262d48bc6b6c8c4a31571a71c51f6681766067ccb0c7ab9e15e9e676cc576908d508b1b87b55603379e60fea58d2757bc8c780f40a5ec29feb4d2c740998e64dd6fd0c12c39b58266687478620594963d4ccab6ce32e9deeccbd42ecbf0bff7de332d60a4b0ade75fbedaaed1cca7a9f9ae0bc13a7c41e95a25dade74a620edc5c8e349863ef37bd8e5e0be4d799a4ef6ca4c796b605263d1e989c5c76dbf32bc8b3c4a9db8724fed1ce74c8188a2a8743959acd7c88c8bed387f3d54bf40f5da1cf8d1f0476777448751fc52830ee94dbb4eee1c096ef02b04c7899b32bfd9206d277bc661a212bb14b11a33168f1f1c6ed3410ca4da9b36a70ce0b803c993bf8938f05124330d0e30425e24825f16021380f2c496cdbe13170a057a4336a03cdda442e82b86804ed0f7b4d7bd269bc615a297dc34c80fea3c3c0a4437c512b004d8bb833c3975e2a8717e2ddca0ac7d26d52b3148bbf443c1a2c92a44d58b147a11c588fa56f01519561a204a0505255c147896bc3f49481a191e419c5fe8d7d90bcdc3d28f0f03f97392c7829552b655c1c5c90fe23658a437f6ee571e1d4caa920a6123d26e500487faebd9104362f41b6a2e835899a4d09be5d6cd461a1a23d5d1962515c7a27323872ce67072276e9d9067ef8e7578b108fdb16e87d5ec98b998f9b057c931fcc02d8e804ea08273a45d965a04add9d22f1be9e92996856a5c2fff0a83da1690031106d59b057947860feec3bd5e96ee8af641a8b4b577fccd45d879739b8f7d6e02d164e4b52e759c62f01b288b538c888ad0c11b8fbb74806f6853bd85f72e2fbff245e499cf3779d4a0a2fd8b7dafbf3fe494a2246a513da683b4307b1106e316ae77261e4d4e0a0e6bd961d33a5ddb5ec74923eaea3cbc5fc0d438527946350f3d2ea8200ca4b85461d64d5eff9185d1996e02c22e16b279c3d36b4effcc79d19e4afe8f432abe35df4645fe5803206a2e7d4b4762196acf6a91eb9a671f9331921ad791b4b5136e7046ea0dcfc105bab6bc55cae937468d6b28ba10569d30f5219ae45a7b054d14e512de1ed8baddafea1e02b9d0266ad613d1834225a51b4c3353f51aa66b402137bf5f28ea27ec603c62b46f249acd4016ef977019fe0bbad9ecd5b60b26a74879256a5821337d851bbfc944a15d17d5dfd2bc100c71a8f53a89e4e005facd3825f88753a11e27521bec8be315c065487051db1901b60ad581ccba2d4b2ac4f1e40b15876ecf119a2e10a908cecf7d3f5a78edef389db97181cd87eccf65f1adb8c39a9914f10b04a68a390ed477f2914e8d283d496bf197e75696a149cde9f6785e2fd5be8c55569ae3f3118ac274288af3380a139bc16890daf3173dc62e1486429ee3f8c0c01478a69eab0ae097132bdcfc2885cddab202187353a60d7a2f67365113b4f164fab6a5e52a28e72d2237e61999e6adb56539442692196ff7dcf5b8ee156f04b6890f1bc462ab234578b6c6b049822816be1cee9d456984619231749b19e522c93043039bdecebbc10acf3ca52f2bccf851e55a5bd5ae5fc8072fbfd3c3227fb8568c7310ba77c0dc2e3f65b9eec04652e4d0dc5a80773a0190ab9066d74fd6f227930c53bcb080dc1e5e03de2c6eeabd61f8130e47ee4a66ca15798cca70e20c2e30e2a877f32452078b54a2c13fae97a3b0a7c83b351bf983034637b5af3417d82e015fc45cd88ffaec24298ea64eb1f067a8e2a443519ecf8b340c885a6164244d572db2e5bde86144d149cac25583fad12a0df32256ba17a25d6f4cdc69bc18adaefc51b56b12586858d47e8458f6f3d55c209b822d60ae46ba4e60f2ee7f557109855b77517538a2a95c8d593df3ae400a79f87568f8acfdaba22edd471bd9d6c093928e754c5153742cab88f052004321acf9ac206a567290e693e3e2ef00b98ab87ef536c707dd253349f8b88fe00059cb93db7c4e8739b6b60fd4c3c61312e55a3c1a8635584727de28ba1d7649d005f56e652c07ab195fbe25b01a65e89388d5f1ec3c45ab3f586d86b5a82438c482d62db1be945390f5e82fe78ef8ced828d9443484a25b92de5cc4577782d19d35a8b30b4e2b622b55cd157eab5cc8512c9ced883737d47dc55a66331add463596ec78c594289dc3b23067699172a1ac75a9456755b1e458ce0adda8205abe2b96f8964eaade0988ada2e0e6c950480c1999d7098fe3e2227e0e7d4e1417c6c7ed793c5a0ced5c29d5ac703f6db0ea4b180f6d0fe38f55940702a332c3170d80c931045bc1840acb89c75003bef15631dbf584eb575ebab24d2eb3b9566835ff7a92f1d2e48e5e9ca2718adfe116b6905acf0dbc3d08d1f30dc761fba6275005ba755ae3f17611b82bda7556e0cc05382c07bab89bfb7b545a265a7c90076efed29f516995fe6c42bbbe68d74144ef70b104f69764ef844016dc51a061facb24efc7f83c8039da7139fd19677ad6fb7187cb0c8da8a419950b95640388d8653ea97b7f61650f208a0443c4b4d2b1d173eda24980e1c49a188f082fc078442317994180ab95e0b675a1cdc3a998517fc6572d0582836bcaaca222ce3a0e632159858c195ac7140b36d4ae5ef4d507269da3c22b39af7cd1f688602aec11a5d9f9b88c31739f4f323ad6d948a18d9a34d723c42b6d2410c9cd0f96efba0ab98b9e06705b59dd5de61b6c0f53b2b6d295d04aa89722b8e824a303d14eb65f40195ce8968a4d47308886608c93ca3bb898a7176f7f6d8ea706e2b050ab3629b729d54b6b9b37359a8b5afbef79db91eb51d0fe2b3bd136a859985c69cbe8cba65cf1c1157fd1356d6787a0cbaca4d1636d4b51c6cc7fef6c03cc4c8e71c57c9a33378a69fc270cfd25e1a81db8efa5dd89d6598a22d1a83ac79b5130da9ae1e2db5414132e43450068b06812610e428cfe2c47623ae18d685b993c49602639d0409002100a98eade2da1e2b6f8dcbda5c3a733ad162f2348c325fa2278710c8155bfd29ef37fe4b29079f73bd5eba8ccb01fb518bd1b26a11b43a5f4d299324565095486c015bacacec58588a7b5ee59d20c46fab4864462525c142625059bf574e7b5091bc97222b5d2833f5fd7073fa02152ff6740122985a4d2bbcf99815eba4dea3fabfb99d0c8f12999cfc3cb131b9f0885138f4692f73d5bfb36dae35ca651c609c03f04b76d551cfd37b5c2727f001010461046a19539e5a2056324e07f165cc5683b76c432f2587d16e3ece154649619e767972f18baa5f7b8cd09c283c4f5f0618998121ea26e24d2c0c4000001fdb92485da4eae66c094269f168b3d1fd22978c4d36d4c17e0bc14df6de726f29539229db09bf09ac0949b757b1dbaed877452723446576414873742b253333333333334766e60c0a308ca4bf2935be373bd06d8f63c8f86c798667131163f7b70ecee694ed38c44dca6ddb9866364e3e1ddd7832baf1b51d2a7fec78b272994f52878e6fbae6e91f962a6712b903f8eeeefebee5e57c399fdf530d7acd41a2e698a086348c2ccb34cb514a29fb0956e2127b7cc1389c840592965896232c0d5ab9fc272b6ae4a12084aa044d01f289309e264c1afc095667f14f25491a647a240233c8108391222e0869a14129a5d36489ed72661addb8cee4c59c2a4a668686460d1ba99a1b2a1b1c3974fc670170b30a800040962916d1ad124cecae01e0f0787e1d77112073a188916e752dd30c1d81239da45ba8e7e767d2ad99679a671acf359e6d3ca79e6b9e3fb2ead9e6f9f43c9febf3c7a26ee178cef1fcd1a85bff0c80e79be78f59bab57a0ec0b3009ec1e78f5874ebd3c1daf1fcf10bee61c27309f663ce09293c0a3bbec96009cffa2283253cef74091d00bd21f2b25e00de0b7d4db05c02cb863dd77e7c1e041080f7c30640c767c3a0b5df975ad94400fc686e524704f05500d02409c067b255c9eaa39f89c9cd27df3601807d1d9ffd6cc873757cfccfe10d91578795392ca534272e8c30589f6bd1e92ba2e262e54e176e2419a93e21355860b9f1b590423aaaf9766c68e9c992fa7c3058bf863764c7c6a743c3470b353e1e343a42687c39333c5ca0f97630585fe69473eb0419ac8fda6124852fc5acfa287cf5ab37448231e47c9459f54ff89859a77ae4ce67b07e8c37a4ded3736d82aaef9deac9863c03f8703ed38f22a914c8e0dc61e4fa73600c31df6f3732789f0dfd194c5f4ab389c0751a06271fb9fef1b9e90d99db949247d21e137aa60ad47b185fb42b224da422ae098c1ac6a599999f518a5f74b33f144ae6a5cbbca4f7f4cdc8d4f7efcfbfcb399ddebf25eef2b98282bdf8fb33edb8fd364dd4b0fff461876e93ecb83136269d6c440a02c9bffbd4335af12f1a4da96107c598d571c4d19d61d6adac4ab7b46e65dd0d8f8c1ad25b64a55d2957cdd77c3e57b6c7e15f57e8472ffb2ef6276fcde7a3fa1a99fda6faaec87ccd87c3bf6a6abe2b3331fd5dce0f1efd49d4a36cd8733be7e63458ff543f3af3d1d40665bca8a7d741a5ce74adcf5363555fad911b5ff33596e74655c9b467c3afaaafe755f3f5bc545f0bd10153a99a1b3a457c72581cb63aebf42aee247c3a9d7ec7e9c77c61126ac6e52d5b146dd922e8e2a00a1640381a1a3d4532a87f77a1fec6576dbcaac6e750d9a8615530d43c8e7780ea735827375ef538ac932b4e6cbee6f9558343f5ddf8aab3505ff3d97cf5431e3b7efa92b012ea847aee72519606fdfa79cf650f451b74ef87cccb2bf3a9fc65befecca7f29ff9c6f2a9fc558fe36b3e957fcde7789b4fe56ff33afec6a7f21d33a837febf8d3ac85d387e7e0bb92bc7cfefa159f3aa9fdf53ba35f3f31ba85b323fa7cdcf7f1d393e1ca83fd9dc50d57cec278f19e7d45fc8f38286b2d2fb917d7fa6a7a936e42eb7a25032af3abdea7b5e353f23638bf8d8fc8d579d5e6579aec83c8f8d559dbee71524635596e786559d6c119ff93daf1e72d6acb1d57724d51c8fe3ff9fe78a11d5db3ccf152335af7a9e2b46747ccdf35c3172e3dff21c71d6fc1b6f6379ae18b1f91b96a78955d5581e1df64356626730cfaf1b5665abb3eaf3ab6666c981a3e7d6477d4958a97e472dade9d4bdf14d822997b76c01ab97b72479b95d34d57c3daf1bf36d3e1e3ef5c6d7a8be9e57d7269bafe775e3eb79a9bef8aaa9b19dfde933c57496bee963d2cf1e675543b68fbfcdef201a9caf7d5de5eba006e7a73e19a51ac6a50e9ab363339dc38bcc09b340834fe8671a615263a4c4d0611d1974b8e5cf3d5062b932c0ac185a7193ef134fe832c034ccf2c9b2f761135396df9d32a39f0fac2403f15b88db8f824eca5d30302bfe162856601d9da9e305c541951fce8a592cc3171800deb00361cf9d364636d2be44e6496d582f337bf631993d69e43e7616922961d0f10dfdd046da7ead064db40fa442b4519742927c66660d08466071678a9a6c7ea02d81094283f27350e58753c8a6f044cdee049a42dca3bb0c06f7a871fb39214ac394e4c9d86da11adc30a7883037f431a550b71c084b97b9a11921b6fca0b4e587a4c8858a29870a2cf18b51aa4b7d33f53bed8d51517ffaede99b6c6ecbfbc83d625e66dc2f43b35465c228641a227ea1947f2302bdcc12f5521df64f956e3cca8cb2a24c2815548128b744bd44201a1a9aa7914383c6b3f3332b3e8d19d4c7ef44e30b9fe60b39d60536140b2390cce7cf9e0be92717f5d223e2498085b928948db0069ba7c93701c6e9d721821a3299377e016c7c4725dd6a5e9a00f708c2d7ff6d7caa0d0a9a5afd6d7c32342b861a43d4b0af67dbc653a92068c14284293c0dfae046fe9278c6cd9ec68cfa57db01529feb220043c58b94a50c4a971b623920f500c4938f02f270bd7fc8a05cee77fac9f5257e2dd04f2e674327616e927ee276dbb6144fb3fa6993067b53e26ee4d139b7dfc6876a0344cdbe8d4a8db65fa78baa08d4ad39e5f6c7a36e69f1015344bdddb14b98206eccd2a45b7de5f67f21d252eddc16906ed7a0c6fff865e3e397918d2a6436b549a794926a195b9796efccdc99bf3b9fe75f2493937c57bac5a28312b483a0970d2c64c144ec458bac349815c18c384ee9568a8a8a707811fa2216f54b97ee2e3597d3c6a525d1cbf56158152983c2182a2a320ab2423f9503b6a7bfd90e744fff2fa5b5364c36aa013fc0828a2016dcfed03bf914a9025143ff61972c626f49267cc8210a25a624c128b8fddf113574585fefdba3dc761e6efb0f31e616e6b086817156fb9541ee92300983d5e852b9dfdc3ee11e9286a6a16fd8b0278cd3448cd32f8b6491b4228da4920443629141528b449249f20b7914d4ad5012492198acd2af4922eed1d77d3aa60787b92b0eb5eccdf2c417db39a70f90519629b020868ab0045d58b7c21803f281c56451944541957bb0136a3b401f87f8a26f55fefca25d6f106a83378039ec6f8831b36c82915e3520af04f1e28b06e681105edc2883d0460446d7b9b8fe340828d7bf063183eb9f126209978d23da3b50110cdd1c58b0459c215c29b31d5ae0f406882ce814710609756bce2c736a993be01ed963a9566610edfa0250b9f1270fcc828f78427ffc3905bb786611831b670d6eb43fe67b37dd5b40f6d2aac4d8d15b68d085f61159b80c860e788002dcde619cfe1c70324a7d2726675246468c7ce6cf80220bd2d2a578420edc235afa03c6710abbfcdc5c7572288d5ebe859c15e4c55bc8ffdfddddbda452b5ba096ae8b09b01f9900626cc8060e817fd1b5ecc04e6baf7999062ee32257da54e83bca16702f349a97429b2e041f103eee149c138fe5e4ca64b0d3d2477b1a74c48d73fe46ef02b855d26664516229f00855b1ee09674985311bafe8a227ebf628c361574ee3e8378efeeceec835b0154621003002c43c818d1a58e6f4297974bbf5b59914fe7bcf45747eecae8b3b8d430ae9e308b3e6711ba3797554ba896a8d299544b54f7d50f33b6a69cc55567d16751516786bae50ae36760ee7221398b3ea516096906f68951435718977ee842baab954fb7e8bbe8bb90dce5a2b4562418f885da5c45ee92799af26e6a8ccddd5c4597b2dc8634f7a30d6e6f92f94ccddab655145ec1b8070b97fe0a88c6d35fd1151197ae7eb8f4573c5cba3a5a215dfaac1c5499a779ce0be25db72b18e3d04fcda0ce582757ead3b0918dcc5855f7fc92b12aafd6080dabeaec2bc759f469accaad03b497b14eae1891f9ec9dccbcf60ec89cc87cf6fcda695696ea82b96b88d2eab9603bcea23ff3d5e84cde0f150cdacbbc11cd48f645b6edc308f38800e06e7406e62caa5aa266aa25ea64a9a0863d97fb7006c6bdc3be6d6606d620eba872276f7bff549b5dad7c1887feaac61375c678355a5067c77d16a0b9dcbbf782642276398bc433d9213e0374e96f56e59133b279de8fcd16317d327c317841391b0193f783b33334483f3b01fdee9bf169905649d24796fc554a98344869d0a5602e652ed123925deee3ca875b0135487fb32b5883740676e9872bd8a53f03eb563f7d971799a3beb45b4892d0dc97de812c62d79f8958ac5b959ca797085d7f0dfecce506d1ae3fb37fbcfdb9d398a840799ba4f0b6e106f84df052e3b37f77fcfe6ccb19f6872c39d52d4d1da5636e713451f769e3831adfa537476e0ce6ee6e7e2d0872ce19a7cca6f4ccdd3deb418d3f3399691e397ea9f141c9a365399a0b726c3c547881eb1f65b6450f03336e1a8809b0e9316f18bdf8ee92ddcc833a339969aeb14d8a03a2c6b7e11e5ae683a669da3783da0d51dbe5e7b73dede5d75d08b02b6e1b0a5553f37d37e42ede2ea30e5a6857ea003b9185edfd5f299dc8c2667dd0945b669c4c6a9ae723b2c0a9dac5c7f5cc2e0112b5dfe91e2a25d53eaa71ddcb5767796c7871360a65fef38b45308ebffcb2222388e013fcfd093029b8fe57ae97e0fa7f34f0df864ac8a1841faa89c854848019d44b542eb1a7fd4e5f914b4b9bd7ee6cfaf6f54b2eb98b97424f2eb177db2d25da5ebe361a46fce1b527e79cb3bf29d4e010f58c1ad28f06734882519556b8fd32708f68234308aacdc7e0aeccd6d4771196961adad0cbde8dc14404472d26ec91618618946c2aac8a6efb6ee7fdd371d6f6f2cb71d6d6dd18a26a1fe6444d568063d011eeb1c2dd3e49fcb91b9f71375309eafced9374cbfbed9574cbf4db3369d22dfadbf3748b83d54dc7e634d8c4b757e22ef9dbc7edb7b86dda26f34ee4a3de89bfccc7ef3253a6518059dbf311c6d93e3583eae44acc3b41bd7c272aed7962ac119977abd22c513f8de599b129676def3496e78ae967ec15ee3f5a31bdf6cdeb1e11558c05d2b7a734b87d2c6a707bbedc6b9ff4ee5683ead0ddb6d73eac4177031bdc1ebc9b67ca6883dae59e72946544ddb8375deeda24f31d71d6e6250a31cef6dcd7ddc87d7e8fb82bc759db53baa552ff2018e6dc1918677b2e49839b9206b7e7ec9106b7edf966b348aa116dee28ebe6ade671f00ef758e1666fc33dfa662adc0ce766dee5cea8b5c1ecddc52c847bf0ad2cad8a3ebfe4bb55514bd4ef1f3f4c05d12e7d4a6d584335000841d8940eeafc307502eaba8eceee1dd9679c9eb167ed5c3aea1e594acdbda567ccce724a6f31bb6b3e78e44476652fadfbce9c314677778f31d2dc18bdd21863643e41e4ebed72bb998f1e770557eb7ad8dcddb4cbb73fca1db71e5c6a5141c933338d4eb945e73866329b393c743c27a7ab1229e5cff099cca616d9b4d1a24ad905a16bdf62cd42661a9d7493734e77f926ee56e8e3f2f3e89de9ddca7e73570ecdc9e19183028393c8f58f59f3b5f98dc20b37cbb2ff213f66669aadb26db298312d68658288635a42c6e232c1040aa6abb48415766d53a86881040cb6c42f11849432e84a8c4c2df1e4cef7286028f1812ba1b8522a9174a511962b4b28e30464d45831ba3144dd2e67b4a84d95f2609a2263ec22fd272ef6c9767fff53dbd9cd6a60df18a26a9787a85cbf89a8c68f6d84871a4311236af82f854cd9b30c6bae0ea559add3fa11265f6a1325a00e6aeca6d2f14db4417c1590be1c3f3ee156aa8ba83aed8b30c689af8ab1f10983f123ada9d4f6a5baad540731d17fe854fd7c59663f38410e2d3faa314e730fbe4374b2fda7f7ec96eeedde73b60f41894ecaf6f6381947cafed349ca67e9d22d964e156f989bf8391d61450e244c9003093350d1072828892950564490c327892e6e376f123ae820a1053c62e94a5980ebcf474c6931aeeca2a604954566e4f0e0448a1a200b95156437454277fe340196841b57bea452e670849452b650b8338b1cc82d443834813402a1986f0efd2004a3d7e9e357f7830727ae89365185be5cf9e2c66bc3493a3e9454b9fd4c581671d7579952aaf36318708a1ab29726483c4c3e173ca9d3e00e0e206a188b74765ce816cb30038a8a9dd7b9f35d27076c67a7416fbfa1218dc95d8aea1feaf8d8699088bf6a8894dfd3b96a48fce93e1af4e9993e264d224c4883e1d38fe6f2a0a8a85e5c8619b213dcfe24ee257a51126388bc34f1eadf1162634a41a78548ebcb53b3148bc85fca5fd459fe27266a18611d12516e8822c2fc3306c378a3fcf8d1dc183454c528045858a85b4250c515bb8db2b1a586ab188f1786166418117ba1227d9a58eb8d317db49dbcfd2b2fee9af9f6aa578356a919d4286d306b50c395122b2556409bed6c8d2b20776532d4b9e12a16a6c215d06acb6d9dd5d1b7c2b2d241440df2f225898b5183dd55bc7c49e2d260bb8c0da67f8876e9d32d4f045dfa040c54ca5652fe0ac85d2b23ba326a7075d445cd3e5c19dd1596d5d18dee5746bdc2d2adccfbd199ba1f2a18687ee61d40336379ae18997999e7e17e934fab26f3993ed37b9ee7b9d073332f634f05c3cccb7c0c3356c6c6c0cecab40f57316d65f46e6516a4cb5bb21cddd3e52d598eb8b1b5c2d260bf8c5399ef8a7c999f79f6dc06355cc1c0917b44bbc2c238fdd1ae8c9ea8d4c65f19dddebe78635052f4126494f43a528a60848e3a8c41415de2120c68a8288674bb0b6c26a88ad06aca8f22291ceaca8bb38238c85760ee2ab6025a01754b4ee92add12f2fed550b7e60b6effaa08ee116f5bba8ab91b71b745a20d574932c44069ada9556c9ba14b9218ed91a58b0273c31512bf506064ec2a166d6ca9ab18f760e1f6af90b84776fb5758744b259f5749dd8ad602345789642276e35389018fdb262bf8563122ab2e32673c3174c3556c35a5c1560df1974cac826e07897705e4b3e527164da88fab90a204b0d7cc29566766fcc399a0dbbf8aad806e10a08c2a0393815dbe610c5ac55450a350641dd5b0276805d4608338a8e10ac8061070007bad80ba65019aeb11914cb8e0ba45e243ba36a13e6f150b5a05b2724b93ba8b5fdc524b4e08ec9ad30cb7f3a8b3e966cc23c6692039eeb6c438f3a883cd22c8dfdcb315e896017149ee1f9e2297e43e83c718ab47daa423a54990b6372a9320a59ca954ad5a26df67149c6c662798405d54e1c6141884ad907131ee0afe3914855b1c5283dc977d80597d84d4ad0c88bb825b991406b9a32377713de084707b1e6d1f9e322e69e39236190bd44b81dcd5355c1fe2a60ca85bcde0fcce38403fc06967d02c46dba877969d3aebbac70d469e9a0d57b89d01015d1c3703f254cafd497f9f6049b767129dc25e2973e57357becff4973edee950e387e93aee967bd86dea2f04c0751d2a07922c0f357ef333737fd29f98b132cb19e5323fa59abbb7661406a5bbbbcfa099c54c29a57466e61974d94ea02e95a2344ea9f1278c71d81dc866c543c9a99f73c6e8524a2981ae9c4797fdba9492a594d22d87439665df8c534ad532a51c23ea20c770771da68d8c33bf6d9031c6b8c4185a30c718612ea5ebc0487a6acea221252945264a061d4ab9c7a2212529456e93f222dac559e18a62456418fd20c7ad2e3fc628614ec8073b9be8a5e217ff238d57bfb4b41ba54046396ecc12e3f4db2835b2cb18b7dc11e3f49cecda01461797853bb2823baa933be28e6e3f77c43df81493488091f305b08cbe94d4aa2451e59869355682248c6e4f302128c2a7eb4c9c476483e3779a86cfd390625b4db3ba4c23ccb94a3c59f333f077848344a0c1fe7895a0be511f521994c90b7b54b6165d2edbe0f2162d60b76b93ea930df6dff8f87e616a7c971e2bfcaed7405dff8d5d9de3fd29f748bd3f8f8b64863c762af7733e7b44e67339a0d478391bcad7fca5c72cfea671f969d4e0b7f1ecfc35c727ad8971383e8dafc6177697b097da4b19b75f26d1b96c8fcc108106dbeb241d6ac849fd9de601f1aff952cf9f8defbe58f369df75d11be2cf1f5fa6f135d806999f0a88c797bd8eb361b9e79049fbed28cd17c60f24d961f3f44f1f92181ccfd7fbc2243c4cdf0cee927c3ba21cbfd3ceccdc3dc77da1e9725c6799348bb34aaea0d9703cfd54fcf2f2db7c2a7e7ed9c8ce48bb9834cb54240677f14b02c14612e578ed2302fa578e6fa177727c4c9ad54ab084dde5f6cde37023df21a5cdc7a459fddc8547271d51c34eea309a71fbc34e126a25a5a42424a458ece8a85b4b7f631187fa1b4bbbf8e5aa53da155f1d447f5be958743b8b127771b7da8c2f60dc168a40ce608e62d6bf34d8ed368c309d065b47dac8028686076a9853695851c39cda2d77ddf47b0f4960f8697051c33874f9999999999999999999999999999999999999993932333733471b3ecb24742fc45711e1f7778ba49f6dea767508bff7c4d8a4e39b259bebe5ae701969084137fb41c4756bfbfebe3ca755d1cf3e5ef9d376d0abab342bcaf963ca4f49bf8a887b3fdade9063b407242e0dc6a07893f311048de61552353fdeb0eb73fc4943c307a4b1057bdcef382be685748b6adab6cd39e7a4a17fd26f8e86dd27d13ee627f58668dbb7444b427ffbe9693fb5d349fb16884424db6fefd647770a69b7b7b7b7b7b7b77f77efdd9fb68f393d7d2131f5f36c944ddd24eba4c9523468b7b5d3fc92d08f79cdfb715aa22d6972a910be9cedda24a45b426cb823e48ada2d6ccf1edd2c9224d96b2fb397bf232433d1c0a1168941faa0915441159197403e975ff2a3be3fdbc266d42512d51ded6aa15921c742f0829ed376a7c1d8e526e965a674b38a7b44dd4f25dcc7effe2c301f09fd96a6e9fd20eaa46c4e72f2055d6ecde52d2418bad19b5605a4efe5daa76dc3aea87fe5f4971e917e6a55d4e4114be62e3dd543d99698a6699a2663d46ce851a399d3d6af39f2399a4a247dbaec07301cc74d26fd724a1a9723c7d9693241ce871cf31e3620f439be9e64c79d4f3f24997c20e47cc8b1ceaafc8deadf30c7e8861ccb4965230002a88754401a8b191556696c523d445ffe508548d35863ad63993d7b9232692231be6655fef2deed0a0fc4a791440da3172fe28211c3d87157fcc8a55dfcaa561a8b96f8118b1883c15e212331e9aaa45bcdaf20627c55b9b1ad279520473ec7b2507a99d383c310aee03285183b64914196022a3b6c5c84d97105169d2bc2c0c20559b4e0ca9ca94314a839e79c31086daef442caa75b9094aedc72e54a2b7eaeb482065508e1cad77274721c06528aa099261a1b2a74b85252a1832bab78ae4205441883054708821098c8b0ece0058a670a4936373b56b8218f2b7d4471450fa460420a30aefc14962bff412d595cf93950aedc3245962b9fbfc0c10a2c3c4461842f8040410f31ef070f5510eee2296210030215502c010519df42b7e4cf2901a20f7491821f96ba78e2353326eea4a2833be79c7342a1b1b9e972c31d4ff480062d88c205425cf929172471e5833129393da0b0e89e4ff1a311757bbe165c126f0d8c93c96f2f01aaef41c37c2d014ded9269992cd1349b01e7fb35b8ca5fdaf8452eb059f15908f75882811e9ddb39ddfd93ca3525e5f57f52e7372bdad8745fff78308e8f606660fe7ce618ee58a2011ba4db70be330d95a3402aba600ea8e3a35b3444514596db4f73c3e3cecf6c0d7edd25e3c4975fc000e986f4b7f8e2ba9f9c526e7267ce0d0fee4187644fe90bd96f2fa9a673e7d790ddf935f89d9f971a739a081d3f6b1f84ade4c8ccdbfbf317c3dce8c567fa5d5167f46f1175460d6bf5548e527cc781a6691af7dd493524fef63448d5906891d0d0577bcd128996fa0389977e4598df5784fa15a1fa534ef31e482441cd96b899913f7d8d63666636317b1cc7b1adc1af67fa68fc2e26e6b998986de3b82c66cb521cf8d964bf75599665d9b66ddffc1a35cd7ace26d42e67a6d18deb4c5ecca9a264666868d4b091aab9a1b2c19143c77f160037ab000800649560c20903508107ebd35142b7709e779880420e0152c031e14b30a104134a6095f0e00e134c2841051ea000fe46069b003c8b0029a09073c20076340d8c7bb070fd8b18894106f992a92a93d244e90aaaf6d12059e934b6d42e9a544b54f909f8f116602fb1bb79517d077882ba55a9cf4ad7734e5e64195dbc323acb83482b2dd075dcbda3bbbb1becee9ca933dd6577bb7b3663dddded1efdd40473744d3a7f64a61a38a54fe9daf77f2bd5b8e72db5d54ae57f83cf2f9f3ee3c43731ffd430cc1973981ad97f503eb5419e5f68a2eef373dacd29bd054920830c32c820830c2dcc9753eea29e4d3946cc0521d1d4e08f315c908a39318489054198585014e33385054dcc68af3062b931de4c1f4ef4c0892468ee0a9498885d198ba56e8de00a90648c38a5002284c0e707e6030d76f0ca94b819971d847033ed665996652729fa15612055d085d2d109ae5c01ec4a1342c0c3d48419377b996d5101d2cd3229a5e42ba594326e71431a9b9b652980dd2c055bdcac09236e160518642469b20c98d4be644028a38b6b9c56c5143080d2832513644142c66860048e06411d1948fdda0c967c0ca1a889606ea1c150cb74b57fb04139044cd09c3bcd399b1701d8c013607861042e21b8e1064a5ce10410f15ac9218a1b5a504515439050f0c05980d102a6059016412f14f9fc60083e413e54a6103a6941147481299498c2840f928ed0032d5aa840c60a2db610414401769480280c2f39a87206182422f880083f68d9ccb29b655996c162db167df012fbc00b3aaa6533a3cf3d1849ca20072a78a0041551c620c12b6b2e6ec605194688415b04f48608548488a09a444b29f2201449d1924a70c5c70a33823ca00da16d190336a58b536ad3344ddb5ea08496ab695750e9c1dce1055308793b44215ea0458b27c587ca8ca13cc6108e18821620caf0c10d99145bf430865b3145131ed83609e0c008247832850a2313645158e1c3185ae8b0d9e782053a5c4d83b26d488848ca810a6640c58a1119145680a00519174e9c1194ddf0af69dae96a9aa6695e26025c0006361110039a7393a07ccd0a2d34f0404d559a9ad52c82008c0d40506b7db9834e96659996655986022ecde22f2818358cd49747410826008b4fb358d39933a8088e84333e4029a5946a4808a159a154842a5a14445b16511849f1818c54e3ef176e3034b78f7e375a16bb9a942138cba4a6695a0f9a16d3a588b90b2da424c92d5f8c76903aa89994cfcdafeee2ec3b4bbe949af613bb9ad645e96a6fa369d994525a6dcb0f193f643c7714971ea5048917882ec6da2de90db52be3748c67cc20a5337feedf21a05e0c71d481e824cfb8f2bf8a13327fa364746516d48719c416198009c3872c07daad25fc0538d99b6635189d25fdc3bf296243ca4520f13bff1c9be3db6f969a3ec6f427a293c9342925aadf8199c730c53d8a7296b3e10c97db3a2d7ca7fed9174e1ecd0ab98b0f35ac37edfa7834eb3ec849a921ea7bd970e87ea25024fb9d961f330a92dff93d5cddf8939b15ff47fecf0fb79c5202e11f676650f9679efb38ab664d0be057fdce64d242cffb189aa7799485827a9e9e172a8bdbfd921866490c73ddbfabdd77ddc97a9d5d323f8c41c52f82b22894fd91799a18bb647ef7d44434f3739399b15150ff23837af9853d46975a192831cceb4af628cd6271e3b72541ed9ff3511f575106857a99f83fa8d48fccffa0beba4bc65667b1f744c7ee8a36373b2acd8951b85c696eaa6616b9261b26c9b94896701f52f97c3728fe3c3d2f7ff971c0dfb5d7fcfd7f7a5e6e7fb2d72c5f6e239a9f4d1bc5ff47bedbc8ec3ffe3f3f6e7ba60db3a710cedf99be68136eb608941ed80b0a0ef1e5bdf73bfd4ad97cc7989ea7e765a23654723b8b8489bc4bb40fb9afc12f11074c9f79454cd6f43f3d2f93fd39bd67ed12ed2951cc6b5f664384c58682807c6e78f282c2615e4035af181bc5f46eb29604d55f7e94d4ebc7f4de7bf24d96bd7a4ade90937dfc721ec6428724fcbc6c9037f879ed645590604a0a5e364c293078cdcf2c0f2bfd98008a970d5304615ed372ab10eeb8f1adca01f3b59f57b22f88503980bef6d4ea7024c46bbe66b3b689a9aa3232a9f3b0145550c0c3cb06f981d7fc9e57ab007aa0465b2512ba23c6798f72ce8e3a246d77333a66a1ce89647a9c48e6d4a63691ccef213de5956dea762d9b31d3b2f98599966959f6dacf0f49f6fd31d36436b329352b3131313131313131679c50322694e9654c325eb5319e49668a3ff71ce97b0c724343338977ceeca7d5be9bfcccccdb9d282a9e08e3deb84cc51349dda2af69da4e914da3ffee92f92cc6337d3dd9acfbec33cf66a6ef76ba08cd6636777a4693534a298d48e8a4ddfaa4a651bf31f693a6261d35a85fa4b322918578b337926d947ad9da5b42fb2803a01b9fdb2203a1fbb77f3637a839e9b28f868c49bceedfd19734cce9eff69c7fea539fda869252cb7f277bcc12b731a36a1fafe923708402dc43eb9ff4431d946efff375ea676ad07bd4571b5c5dd44ed7f0d640b36fcf6888f744c3ed7ad6d42035756765ec8edf52fbd8adb6da2767648fc970745139721cbd1c3bf693d82e7d877bf8f5f86daf7ddaf717f67c4b4ed7eb4f45a491dcdeac44425ff04c8cf351a3ca3b918578e7b730a946a5e742cfad21a2900046fe4b29a59452dec82e8eba30bafe3b746ea896ebee21bd3c57fecf94f39d45c12aa368ff9369d994f267bce22f83a21bde445444991a74cba8068871d42d55fc7ebe59b2dc7e8e45d900318e1ae42b7bbc650dacf8b2c4189c0214263a822e621184da1f6fba4583fc25310cb8a35bdbbbfb7079c7d9f063be7813e05a421bf7528ce4947ef29a3ea2d373a797df121b60578bddd093eacdbe99fde55e4aceaab89fd6f426eb489ca5f474e97bef495f2cf917d814a1228cb22071e912860473fa7cae98a47c22f6763151a8dfc45bba5872d3e611712d0dd2c47c7c37af16a1861eeb207cb90f12fb6e7c42d81169224e6e677a7f930d9b48665d8b0d6b88378c37fbdb85d2edd74e1f9fbed056db82717cb3dae7480d3ac73963a8fcec732e0d3ab9525a4f621c7f256ae8b158b7b420758b83e8954ed332291d51d7df9d80c406c232ecb926cb0c02c99131763346d059f1c10883fbeff4bbb41e84bb0e838eb3e2ebcc4ca3b9a1ce852148f4dad9dddde795ff030341b83b6d10ee4a4b8144c6891f8bf8fcfc500ea3e60189577e77e2bb7940b6ef388e1d2325e7c9ef4e3fb6059c60d0aefcce63cff33c2f368d914f2de5d8b5cb9969948b990f645a2ede9e19b71a6c4137be94f93b0d5464a53cba4534e845d78718c7819ce5bd20aff4a0302b9a560b72d697430d3de8ba077915a16ec5cda88bc0494349dd4a4dc9719f06db8cee2fdd6134974ef2a13d4f2ecdeaff828251c3487d3123f3b99d4db9366eb43389003ac0322a3c707f66e36a5f0a506a987910fe33a84a3714832e052835ac578649a6d1a50d72208558edaf6e741fd0d4dd5de8b9fd32747fd331b3b889bffc9ff90440216415588526526fb4a1929fecfd7fa6747ff993d91f577243fef8d30e41dd282d330afc8a1e914884def836b052d1193f5cc0884112aebc78aec4ef8936c89e533e29dc9d7bf4a1e31baae9683e765c35622d748bb51c79914adc85c3d0b209eee0bee7453fd57c393f1a8cd0df2c0fb50b787e094951bbd32ac8e7978ecc01cb80b91872e83ac7cb387077ff6e18635d866211c65de47317d95646cb1ea550b432a881bae590f440c7190e14d450e7eae8e848d927dc237c427f8873638c66196b5acf9106fb3bd260c72349f8234019317696659de9c439e79c73ce199b1e79f6fc2f270775fe921a97c9dde92ea74b2502a2afad08f73bcda35b3bc0ff5a5fc747c75ff7013d9418e6b5596e56f48f05c56e844977295dee52ba4b194b50a34540cfe57762859f5f57d8f292bfde36d8c2c5c7015d17846f4c7d36548ec115415c8ec11541770c2e5dc4e0a283f9cc2c1217b1a4f97142c8b83262eee29492bac52d71c12d0e08314ec95df30553064af7e48f743b895bea0fa857a8144ed6743d0915cd8800000000c314002020100c078402814830209465d17614800c7c98467c58a04ab32888719842c818430000100010010181a16900005058d91dd36e3b8e13d108e51ec42bee22cdae14cd50b913ec1749ace92bc43c02228a8da08e97747213088ab01f20cb1d70574575fc97f5115c42ea4b0ea3cbc2550a3c690b7dc5d33cb1e7d0646dc26d05ce9f74244994d7c60d28be264d9218205e2d7b074fccde5d8d15a740216591d4e8f97274e313889aa8986e5b4ea25799a6be80b44be7792d84a3915f822ee6ae17d72ee97d88450972883fcc1534cb837b706471f4f75b517de6fd33464b3d79b9d670416f7b137a578413d97809452d7170238f4bf6057b9d71a11b06814797ec6545544393f855e3a378dd105729a6820760b6605faa45dc4e5e5ab518e4acad2e468a930cfa1458d051932248a571af3dbc92a7b41105d8b892cf76a04d844d9b19024e71822196c538a4fdc3bbaf96d5f083cee9f44f8c6a19cb181fa43002f213b7da5c2d3903079209889514e3ce9c98d854217e07cc1b605a178d4517ccaac3f19d26eea56a9c47ada942e0ef91959805bd354ffb8a43fe8aff63756ef30632e72250a6ba98bc6bf393c9f6eca47c7382373123ed95790c8a2389f93e99a913e9d6216c3eafc74bfaabf8cccb7be1c8129866aab073dc34714e05aaa1d83cd0a34e0ba04e21c43a7c81ce6d9e63f02600475cf3c39e2fc44d81a78eabe8349a6699601ec7015fd17fcff4fa9e35a34f893acd1263fc7b64c860dee7d5620416a16c8dd40bd4288e14b125778119441fbc16c816f4171df92e9983523abdc2a0855c68ef75cc837d7cdb9f59f3496d536ac5ef0ea7e6bff5bb09f5de802b5378611919a4093f0ec74a76f9db1f316fc9e26c1146dccae8149f96ad681593c7e75b12f982f69c203d6b0c1f9a3905daff88221d5294c8e4ceed15256822ad7eb5837f040d4ca6a66d87ec6e846669a643a386f274fbef5b4b5c059b85568d4127fb4a81159aa7d3ad4ca9491ba167500d81d6e4062cf09501811a8b8264929f04e8d802188d37173791d86e3b53e73a815be7d0629dd7bacc1b8e94bcacdba2d54dbc7a1906857421aaa3b539107f08e628ce191d84215a75b7aa0544d6da8eacf6b033bdbdefeb6733d33a02b6d7a3ca502869e1386d012800ec84ee6a64077b2664e7a6b6c3aa66156b2b0175b4718dec488e167bb48d9caeac31e111d773bd2c1c8d6b21965c1a1c51cb0133f1eab99caf82c978d1e93fd0907e429adb8b5e2ff5757cc7f160cdc03dc4fe6bfda340923976124af1e9eceb407785d1f5946f3db1995e2f996d74000cc4b01dc036ea39e573877542b9fd014b2f3a2a3468abb7d84ad97fa5a757e84f679670be8f23e8c7cf02c3a7fca669715b194e147f5f2ce5043ed79d86835e250e686f1efd3b5d77cf85d511359cc5a00d780874d910344928990083520681c352a4698e411335a0f7bd160f2d960b2ceb70e45e6b911fe0097627e21000fa500b2009c046900a840c05fba266f33ee81b6d7927c21c39eeaa295c30afc25da37a26b2685632d7f83bd68a2469245173e5824e2d6d418458646b343f1f5f7ade65d635d6630dd95a3793fab0351130399ddebb28db2177eeb8568b1f1c5781a9db4761bf7413e106ffa16d8756ad699a2767adcfbdfeaf18ef22b5720a53691bb4a94b5feb42e47542bc34fa86e77ed921bc2137d3bf0354aef74a15fea4b921fc0701a5aafac606e6da540c66093e8d0e27bbf3ae5dedcca492dd71d00cafafaa5503726951f42928060217e2ec055f9781c8e4ccb33074447695ac03138dd29569ac62a5331dab163ced1ede7d2ff9bc1f2fb122e50560f15f3bdb3a4d848c3a10538b4b3c39678b547309932106878f73d9149b166dc1632fda1478e3d7ac93f9b636c698a8e36e5fc3e250472abfdf438f05251f79c628b911ae589c277d6725cd0c14ab5db93b87908b74b8d7c27d95e71f203e82d1d8e440739de3d8ecd39358d10ddd92137c32275cec2f21937c09322f78529d06812d32048f961398dff2b959fa8627c5e71a056be18c5c4a7cb9c782ac1f1619c36a0c9543d898310920d4137701e0eec2fc10958b9e70453de9027b3897b2832472a0f22f164c8b5070026057ee8c2c30d63fb150a02a27407f0950624fb61b558d65828dd9592c0d28793d1fcdc7a23b9da55957c9da70bd1430a49fe2300a4c160c6f91b396fc9bc5ea582eff6e9431d6c04223c5c266f8ea9317a9f002921d1c78f62fab13944143f001cc2376b4e4c7cfcf104a65dd0406d22eaebd2a765a19b34c4356016fb683908f4db6ae3d419b0d033d19e38605d85427f7d9e586b41787e6a3bd4f3a8cc3e5716d90cd03992f0ad642468578bea150f4c0838663c976d830bb6aba4796fe21ff7c480d0f2b326e0ee844ebaa3eee9c5619f8840f44f6f951256081f4b1970b17a24e2fbc0ffb8c23be0d4055a3c6c1e42b7ef4d3e996bbcfba0111815f15c5fa92ec29c13d9978ab363fac5de8563fa4c1936192f12bc1ca1172e9523f8259c00f910c25066148e175a9a54e9748201b94cbfd57c49f5b52a106e8e9f8346579aae37d2c2881418df48f4f98971b8ffc99f668b0a8c1ac2a1f451e222a88f0437ed5c5062d281d67c14cdd02696914f09728e7a38d43d179c38871aeec56d44bb56c37771fabba95868f72650eb4f150ddcfe1b79a87dfec383ac6d91a7494f85e31f749d1f3d8a1a2d81993f020499dee3eb8fb8d5760acdb25d72e136ee9858b18b12ada2c46cdd6b37dfc722ec92d31342d8e2cb43ef3c77d5610bd4712cd6ab2a393b956a2cf20bb450bc044bc1a4b0be02c542ac6de68a9a669c44b96791c6e8ce0856d0a62feabfafdc408691ac68bb3c061fe121910bec72c03001793eda2871db6f5aad41bbf118084b80f0ce41195a1090f3136e9cd33defe7e0cb8f68ffbcaab965e8aa9eae6b59a0ca74c70e6de45cadfee87522c8bc6d1031a223a5390ec87c4be63ca1a65fa885412dbacbc8765e390ea00d4d3fe077798970e86cf77598b35080ce655a34d7b7f8043f562f21f0db971bf89b014d4d7878968489195289c014a2e57e5f59507e1b930a4db2892d51f0aa7bc7272720fdeee5254f4cd6dbc6bc88efb24e5f95c1c2b2e8942aace1032cc09d5a967a19023f7022b239cb1c11c0bc257a3bcd442092d6f2a8d28dd30a3462f0eab0c892e8cfa0288b0383dead23f0c21a08f85fbc3756630b931439d3a919c3f2c96015994a0f3aa4c63f40364786632fc9701b992345b52c882eaa5cd6a8076817b39b117a65e1f4ef9cb8ce04b8267efabfda8584d99d600678246b6a4642e8b4c91e4ed028ccab5391b9894a63f2f34d6c168372ba326e88fffd1906ce0fc2a7bbbec702e73f5a8d46c87730108bb5d3b8d3af37616727ecf635f3ec937b2eb7dc05d99fe97af370ab8ee57885fb8dc9378ef9b5f75dac2c1f38d425baf99976ba00d3445758d997937fa3a5303de2036fb7db1f1d773f278e5f0e2ad8e20abb6e80371cb7cedb0c5d20d8432a67d410087b493c2fd2b2c20e943c82a0b1448dad0bb0ea1e365d0789813488d10be7612a036072c15f81e12f04b65c52883682d9518dcfc5aad9f6b0649319eb71426ad8c1d02c5fedb27e6dfd3a2d6bb45d5c417496d919cb46464503d0d16dc325fe2f3593ce998100b170ce19be798c581c484364655b899be2cdcf314e51a029db48de26d16072f479000c4e21cbddaf7d4f9171d3a3d81d07675e427a0ca4d166737b7acd2f64faf154bf5a38334281adf38ea934c6d33b3e913bf404fbbc9efc7c4e82a0b2c83bd081540b2e931709d2de0fe1b8487f87dce42e7e859cfa9cddbec27bcdc481d86eed02db60640b12c4703080e1b0926b631e2c008fe030bd6239b9f6b6172a78a34de6896c64bd324dbb582b0fb6c8ab9c3193e24252a19ed1d7df26fafce47aa0eb35c55e889c38c5171bbbca0a1b9cb65f0a08ca070ebe13bd5f7fa4b9ef8c134593afdc02c3e4c1eb7ccce78d5936a3c347d25ccb02d31839b0df347bdfe53cb2c481561a53f4615a90167824f9ee4368c7e32be3ccc2c4651ca90199a32838ce8f1328399c0b3b8852d42b78ed8464c516223a8e5955d877aa1a28f655e5816d2a117415a6632c002b0b9578839eb1a9a1b70bdd5e1d30f1073533a5cf9ef9aabe943561962d7b38ec124c5cf5c9d9d17b90bc3568e5680cc82019200005e9e2034fbec8d86a862d60e0d7acf0a0de86308c97e5c408405427fe01fddea0548319120459abd4ddf830e601aa6a7367f4eeee7b99cb75d6fa2fad335d8014c7341e081d52ce4aebbbc82960da39dd5633aeb1590149fc009395e8e7101aca4248e7d11ad6c2eca88f39844a363ce50b52d597204535f5a92394e0c10a45c4655af8c0c5c686457ab9518a812cb68a641e4d027b730c547533faae97d3623c3dbfbd915b69220dea4039a1819a78a915349d9cbd27bd0a6fa3545ff0fec533f3d848faeeb0540f286467fe71a24a3996888df90729a5c0b3676279925571352b718157416e446ffd7dfd416b27630af515e697dcc0dd23f8c706ab325c084a8991b92e5e186f0f9494361a843f928d840191fadd5285192a203a0d79c3d965a5ca20b0a20720bc13de2dff3c1d5ab21c184922a5ee9649a86c8ad047cc2008c919846af6249fa023165bf14a065eba32970e3306c7cc0319eb91c343616707045544412acd500ee5a037ed1281a2f8b18c29af700f76cf6f60102bc770840cdfe5739e9bd09475ecead0f20d78cc05328f7726c840e28535d4593ac05f1795596e05fd92e73b09340fc71f06c0dd241a5a5298f3eab530a030e9972a8b9f2c7cb78f4819f72abfe057f020ef5c7f67acfd3164f667039d17b812af9b098037946d3fc5f0d83ce098520fe6b91105e70148a02b13f376dafe14c825f8c520b0d87643b0d3281b989dd1e9df99b0ecbbf886eb212031cddf5e073ebcd458e628ae628cbdc026265b95182d28ebdfa0a8df7736efc7e2316a6fd645fb066e552bb1bdf1b6b1fa8ade2f83ed6286d4671a5519e3b5c298ebec2a97da3e259e9afcfc15c9672f566317c13f28f0be82a3a89fa5f8a4fe4a6b0a2af342d0bd892323ba9c9d87114760e19802966d26b5fc80d0b074b691d29a98f0e24a2801254bb664a34e9addc42c8d4511f32380ccf138f302c3dac799df7e59c8480d9c690fbcfc3b678cad2286a2881b1dd29fa32f0eb9f072cdd9cde89be1521da7d5b17b6358ce6de6a0200131e4331c98779e1bd3fc6870001942d5d9e9af5525651af9eeba02dd2f2a808b866f9710d800fede2a073439f4c3a2baba9472999a690baf27e0e5193ad5007f799a69aa7ab4b689ba4ae687161ea0f0e5bd6bcd4d1200ed503fa032bf864ae6fda0d85d008095f1e36d6f01a86ac52693425d7d0769156efa0f75198a802ce958855d6865e5b123b50a4785bde98cd7ec1f3c733db8038ef437560fcc0fe023125862031c884867fbfecf5d00bae7f873e2a22cb94e2acf3198f330eaf8beac075499f76b3d67daa631426034286f16d0eb15601f551bf3156a1c13d4454ecd8a1137367760b00565920806e1301fe839c04122b777bcc08ae33026b535442bdf01e1bc16fe20a8145662c78e2cadfd5aa48982281f46565ac7f785e8e786f0575700299430b90bcbbab622a5c18670069bed3ef591fee3975ada79aec20f27732d02b5afd63db06eb7a951277203389a71c1a38ec9d8c5ca930e9bbbeb0bee4e5d2098e8418ab95b461bb04a412a590c5f0a446fd082837d58a49ac1ce1401185f5174d1332d5b32bf6afd4922e53d9444c07d9eca34632c7d9fe6b1063f9baa0515f449d03dc99cda75d902b3179cb516419c3d87b21bdc000344f3bd2afa59ddc1b6f7629723108564200179ae8f300c7b29ec145ab80b84619e7e47f67557780d3055042da8c4a1d7ac94b7fee28d9485b70b856a86c4c5911622f4be5f20e86b0240a42c22fe56e3718a5bbebde77bd02518dd9321fc55f8d0cab15356cd2a4e145d75ca95e620cd6017e57082e2da04a240a3d2bf70c17e4caaa3ea762b8f3995070df2671f19b85114e37fd6fa225d72165c445c6a47477560a5cbf101ee9660201b60d17683ae5146c892847b208ecc3975fea473ecbcd5f09a519204d6b506f90e11c73e296196d842f1b9cf622dd1202d5b894e58da826b51d42d13e026f01b203d59460a42a2bd09ac42eec1255a0c259e7b7dbae67000b50c77a22e53566a5a4f4d909035128df85bb3f3b7f6e450dafcbe1197d41e658cb58ecf97767a8d9cabf6cdf082531ab63fb38aaa22e9331a3a71ce2b65064ce3a2f20ce4c07a515d64c6c8d943618a95190f57b44814ce27a7a6a5392723e58622759dccb0c387f99e18fad48cd0ce816e86bac27c58060c432703a328bb4a649323930fbdc9bc83c8546e2e4747b66008fc522257cab8486de127e9cf38d63ff401c4d3cbec357fd5bc62d2034f20a3be9dd08b31c1387b7fb0d0c6f4482c0a5e9dc8caf9c0f3840d812d3f0868be70f1d113d3ea91f37bccdaa2289a906fc7f2d8637a5a2021f00849c2a8df60ba5088803f66fb644a125231fe3fba43eeb61336d7ed99c5baa145c7657818260ce8821ce80cbd49998f618400e0bd206fcb4247a590f8822986d601e70245dbcf93675a88ef41925c21f329373ea286023526d5b7c9fd752e0b1a1544c314392f697f086dbeb6c84834b270c25be694ba0599423931852a15b80944df45b79ddf00aeff7739ff560ea4a9eddf2d8c41f3936090b454fb7e8394ae6ea082b740f4f87d18d39d48b188fa78f64629a18ba0e0731767402ddb5aef6c16c5500461c8f58770ce8656cb51fadb1013a08f831db2d30a5822aaca664dfb39c8cd6f3c40304d489473320be9f719a92b0a312e943d95358f2a33d6c09e5c3b19b2682a8baff2190cb7b3aabcfc3d00ea8cb3f9a1e0f16d302f79064aed9d77e0f65ca74e636d3f820b08f91b2c1e81905c195f3961cf4773f3285e14b7f197524afdf1b684362faa8298800b5762085b2d60e563cc7022585843c25110bcfe069a68eac29763e14c7c2a644a1546d0f26d6730e57ec70d2be489d00630617c7859c31caa849a8d81ba42a882ea875e02c24cdb91722cf2cdfd208706fc622874e3a1c9d55b474ca5daf0c49c8c44082153e1878e8f70816d5703e4fc32b3537db57b7df1ae54f53274e1fc38966e28c855ee632bd995e94b907635397b106bf4391fd823db690edcc42d48e1b1b25c92706d67f67f3832be813b6b8bc9b63f75f0a17d3f1aef4602670b9d08886b1ed09b7390e6fa4dcab2e64f2b60b6e7669c3efa2e116aecf3dac2b22bad73126e939a60c041498576ac07466677ce35887d70598b44425e5f7e286199378edd525379c711a69c624f7090233a9677ba72d8f345c070737eae7006db51503b2c010022735feec4fc35c4167b94c3bbc3f5ff3faa2ab20a1967d1b2abb73e4ef580a6c2ab8d56492365f9cc7ac0abff3c6b3461d974a0a16248ad2d8b7999d4abd971b04f55a0f055980ca14decc82f962c23d2106a3ead277cad5758fc9691842c23b793315d75f54e3b125992cdf9bca3b308e7a353f5195b4bbd2f6c00b79a31aa435986bd3c64c431ede75f630805723a3f1503ac0950e2fef74455f0d5a678b89ad0cd0ad801c2b8a71594fd378dc30741127f64a61054c28227ee074489658886bb33a4ca476538152a2a336ded0b60b73c2cc3d70f844dc9a1cb44810df64c2c71933f420eaf50935685def4299f6c33dd3be4bd89d7cbc084410546877725d0ec89a9ab3b7363ed53ca11877da5c7e7c177e5d2602d3340c1f4da30d3189297f419ba3b7d4147ed60148e86f833662c15253cd488aec3bc04efb2b961b2390323575390fdf72d4fc576e6aea584afa128670af2a3ca7a65763f1e300b46aa30ce855c7d9275ed34f33160114a96fd228d914365280678dc66bca597be779d2fa5c5b095581c8da44a5312519f7c93723b156cf4e37fe99f9c18b840293a06c7a3f1d5c43120a475ad752ecad7ad7352de1374c8b81792f6e9b52a4bd71a219ee991a01758c3237b3a98c858c08d60b79c6194ba751133ed451aa6cfc6da7f7f5e0a8fd5543d052a6e5d387038a1aab51d8f2cd48a149c8559c560c43757089af8e6d9a177fb89d7172265f89b2706f54f819dbf31766e39312a5cb9084aae0f3546afae88dbb9cdb7a12588cc4b1e08d49287d333af4d8d480f3d7097bdc5bc0633a1a158b111ebf05bc626b99641c4f786c229094b0a67aa42e5bd065d8c6c12647cd479ce42f5054dcbf3bce687cafe816a817d7489787a4ddb512412f992d0c3f308ba6356d7e502717bff868b0ea24b521986195cd471e75ebf3a0a00cc1d1ac367332d03bf4ff429775f7ae7123d9500b3a81d1ae959515e5e392aaa3d87282e13748b80a83c7b83feaf99f760fd7f7a2040a4447483361b7dd6a4374b009569fafae5154ccb76bb9b745dc2e98e19c1e61a964a0cd4487ca0e5e49b47b348a4fcb191aaf215e8cda961b911e8c0d0c3f07fae86661e80fe7d2e008ec1756d08fdccd67418a0b30238329ed87a9385cdda4c86c73813de4e5065b352e4d68297e8b5d9581fd95d01b1713e1a34fab9e24b0cb02f7f36d269c53af5c10b83b8f8efcc5b37462b4a3bd0fd8318b753480318d489cc7dfec30b232a84aae6739345f2c2222ad1e87f48dae2ea828322295ab351dae890588b4217e5ec93d1b6a078969754866fdc17a8c71672feb944bd1a49a0589409af614cc51b08b17670a4890634eee86688c5fcc31130ec750abb7c80a96087516996a5b90b33fc57d2bdb2b27321f11bd0831809587041836e2e22d17440df69d7f4c8f746aa9d6b426768104ccb00bb4f0b27ea2f363541b00958fbe495338c227a0871d50c183814fdf68ba822d5f82234a09705c7065c772f6a3fe33fd164005fdc6f765cb1a45724d1da5e490fe2b962ba0ec2a93a2cf06ff86dbaf2116fa0795c90a029cf606d54ece91bbbde61f9c4611c01da723b8a1c80795636e0498c082ca9c5b41511f7d97a6911d9148cf1328d8c524417f34d872119b949e6336b11b25ac17d3a05277f40d7b66daec4948ad8e6f95a073c24f90989e2c60814b0867de2e5f6b8e1b986b6ad2e7d020cc1339d9e68045d7be567434de52f9ba9d2e8352c8968995283767b3e9b8ac3907eb83555a8d11efa418824f49dd8094820df139b35f9fa99927b0779a51448d09891d7ca680154599375137f2748dabbb03e236f9ef9bf826641fba221c217e29b78fefc32e892690354dcd16b5b89b309669c1d40dee0ea7a415b63a5061f6f69039df34d9336187e2b0ea6e87a11bcbe28ebf44b77fd263807f9ed5ad35878e82beca71f2328a886233bc9621c19306a15e90effda6f92cfa874cce691828b9cf29ef6e68e0df1b4f97864d4689c5bac8962743130b4bbc5a232128d6e0f9aebab07acae70bce9c39c0aa4f7df0b66688e0244009e1c01213dd99f9d86b0ca1eee17ca1bbdea8999f396698d177c351c7f7ee50fef5cfd0231a1adcbdcf0a661e4f61a70ac2f51ae5ac4e72f8a30d900c15ee85a0b21a490a42537feb222a887499e7fe42080ad731668ac868731af4ac264c8f3e8e9e094c3e5e5460f42189abf0c65c5334d8895e0778503ad8234903ee2996412c5c5f60a5bcb2e66bdd8992c841606b815ad09c805911580c08452122c641965ddcc6b3e58b595a100875db5ab6cc565bad49f3bc080869ed79f890d411173e847583de175f9fa6b48ffa21ea1dfb85c5ee8e7f41a277b13ee3d2a44eaf8a3a84462bfd1897c2e3b4150a82f618abd564c00be703e9390a4eb2c523cd275a3247fda0a0fe342edaf00bdb1292d6a44dcd8ca5f8afa9ba049fdb3e034afdd8bc514a257931c7fd4ae4836c4140f28a08ff18ee87c0221063391003196ea181000a2c36e328d858ce23ac50c3016f7e3e7d0ab03fbdab9d863b87eb4e9d4cdd0e16d00b3703036bcc13d5d1a30b67275b1582651bdced638f485d3d5a5ee42e946c8e81b4320206ae86e3539d586df5442ffaf16b6b8183b8b4498caecb1ec46d9496073a035074d12f7dc7d9f589046dd02d9c10b4b0b0a19c039d8d2ca4db0dd7f4fb610705c2a14622acfde17d18d34fa1a4fe53809a4105897a3974a0ac57c51c7cdb02336de360e02ae208a84582d562047feddcbdd7e2549cfe2606df1620e84ea521264e249a99127b4514e62a514e7e80b1888f2dcf37a9512f0ff53797438f6c8240f7e6f63b26d137758297cd750a13a674e029f5e06b70dec17d6e732f82dd1926a862efeac82f86309f02bc4e93d03c0613ce9c85bf6ac23ece47c9130c222acbcc2c1b56e6b20dd1f93d6d96b811fba8077e8884c7235ef30a43a67c4f90f9340386e6e0ab27b87570c804ccc1121b46be6638125f866b5d3a41200d6b413270bbaaf71bfcf6457a6333ab79fb2d1e6e5021481bd6d685b453567b282a847de3190fe02ded12f7c66f21ce9e41cb807bfb9b43a8d5c4ec2d1ff310b4137b3503c5aab02cbb378317ad5a693c568cccc212058cb9aa58d3b2c54e0c8bffd2dfcb839e9ed9853b44a9b85902318ef6ae03649d10eaf5ca5728303857d6a286deeb79557750792c7eaca52677ed4aaea821c052533176cc158436e6b1dda2ba223b63d0a5959a87026783daecc153b213e8bc0b01a3370192a6c5a5c6c687c50518435e80ba149e934df94fdcd419c3bd5b483aeb65d4934eafd226456e2ba6f66aecb1141cfd751b7c8759597862cf79fdc887ffac9f933662810087ccce553b8d32b3d363291e2effbda1405aa36ca84d3f91774106605d9b38ca8a30cedd81ca571c435d29ae54b5f844ec519f65838b3fd0258601d7e021f9d8835afbbdc53f943294cfe2f0ce3f00aeb5ee3b5c1a99ad066824d8e0b1200f6c8eb117ad3f4caf144dc0c8905b2a53c288bf4d34457e537f8d22a10fdc01e524ef24d716f06b60a40cec8d107faa6cdf63426b593196b23d863d7085276efa3bd7d7f8c27372096f12e7cf1ea3342d7572118fc8133de6fccf47dfa04957190090cc7d7be786cba8861c9dcef30be7ebc0b924c90ead271eba6e1c398b2316d9f1870a9e16e16356b3d065e8a5b693eaca17c5f944416a7ebc5af3a5231a7aba838172435a2115e6725dcdcb8d4e8f02c028d06be2eb0290a5d0c0bc194b6db6bd6c8c3de787db9568feff965351a4fc5383439dd2cd008ca55c800841034a49632ac4bdebff7e265f67ca66b49169ca7cdd47f6ee836bc9a41f5a4dbc5b93422e20c1a07fa414922bb08c29d12f7cdcf950e26cc9887443f38233a1c6de324924ba10be596f2804b27a1b4ac651eb7363238fa8178989c09515e1128262d2e2e087ccdf7b6f2af3cada769ac7e70354dffcbe41d2b1000d148e9d9525c9da164402be5e8d43e7bed259adc5d79765107204ac30169c630614df16353da1b92b6d38708310b93a62c6c0cae42f2f65f6612f04d1d382485e3d1bf19841941e70626c98545fa1985c479f571605f55f40d9a662a7b3d47e4fd815963ea970d72c9676e9d9a266f5a9555ec75de1c245a9ed4f44af02c616b517cff94c5139b4771a6f32d1136f6421a89ffcfba0742044afff5e0fe049af9942f1368998de3b9a22046e3800ca45098c886d8d88d78bb42c23ff8e371e836985f55f2dd4c5a97f9c54b82fec5a08191eef575ae83e040861f2a337218bda815ac085c2cf171788a56c4731bef1c82bb909be5e45be6615492b350a5cacd0ce1e2001153d8a203c5de2c6999933d839cd2b5f632776c6015ad90829b26f5035f925223ddb6ba77bc13fe5636baadf643036c03c194d884e75def9ee02267039f44a58c4fc108482e42df00dfdfd5fc9aabf2856d5b31e6b6cdc3b1d82a0087022c16bd7705683cfca89c7ebffd832b6f090ad560f6fe6e7b38300a133255265170d00965986ea38aed1647c630108ea9acb0832562bb22090d9911deb2802f87958d2a41585bf8142f787d4e725d77ce8ff56ad814654cdf966062d16fd188411021d58a0cae8dbd0245ce87749beb7431b56bdede22b664da10f894fc4da8366e8afc30644db4521a96dfe7b62813a1131296d4c5fb8e37452bc9b76328a2f2b7df394c0276e4778f4196ce22dbeaa38bff4a8dea00eb0f0ece86c52e11257138fd2069bbe2ab8de8aaa804902d39e846c2372304ae56ab73be63b4143e64977be0bb818bd4072dfb130d19d625ca4c240923c1e80e1d9ed2d85b7a95562503c878cbaea8d922dc732c798167110c28f065cc6ba202a3a4d180c6387e30ce8d47c8368af7575dc0a804148d0ccd89db83c8d71e1a05ed3bb4e44819795a85bde68c4318629fdd408b4db985a077fe24965c49dd30868b68d02e724d5de682663292057a11dcd688067b111c52fb256e512494f585652b4f4247d5614a311a87424a7e30ba255da4a176d89a97d2987d55df9be0d41176ecd8a5e21125329b8fda00c3cb398ab90f6531efd0d42405b9d4a09aaaac68908cc0ec1ca4df1b2ece475b6c5ac0ccb2921c3ec42087c7a5f8d3ac0737b221204b66fbeae34dacd9d4dee8f99c9878df6c6d233886deced66928361c59e5ca33b33e0535e2b4b336a90967466f78b2089f03305b916d572e7aa7ecaf1ac5496a6f4df898d439ad0c10c362a265e20e10c8389db3b03f4a3a973638a908e67bccdcf0129661db1c8540c1f1e2942bb09663f1ce614f529521c559b03ca7ec744cea4f5e4dcb60ceb6e1ff4bf04ac9c1081ced233f249582162cc0df7dd076c5e6e680c994f370be1917ddc9a79e6315ec6c1f8d599b2fc068230f1b9b09c81c92a02c3912df0b05116d74408bef8918b170436568d57ba24d3e72a23c1b956fa7edc55b49edbb6e017ca70b85250505aea8b3b9a4d3b00170f13b8b1bcde4eb3014eafc1106dfb6d0e6b299ae97f01d7d9fa5c806600ce3a173f57e8df5cc1881e9ba22084181e86ebd69656e1048b45e77bca2d37234f0ace3b7a9776c1aac3f9428c868f59f522537e667c1284548fb66cab6d3953b10c9569f9996f597aca34de9fabac04ca72eef2fcf55d2e0d5e0eb19cfb9e3882c970521e614638a6d0071dfcb91fda5aa1fe8a9604ecdb1d59c0b7f9c41bb98cb6e82b16dd5ce2baa436958ba690965bde70de37908959604b6c3aae532550a0b917424aec9cd82d133f685e100fee44a53c3916dccfef9c022da0b2c4d5548f727bfcf1027ab3f9cd8e715330039af6550ce755aa866fb75e7f83ae4ea05e23d9a370c8a5f06c99c1e77777b442a5eb4aaea99d562e5b6e97a7fa600b64fac3b607e2b92438ceaff6e828c5224a57bd4aedb0cb21c7c09a638d61c95582958ee50a4814391110fc15b9ce046187426050b0a8ab188362701cefb2227afcd6e7cc8cfa4b76485a1fa05014412e1a2d1672daab5fc380ac4f457ac698ad4b40e796e37b9456465c1b04dcf97e68e1a228ccbd3b403fb4c4f54bc8054370d309339a4511829c8261bccbf0053176a4881241146986557b00d1c9485f163a300ec55652e04f77a48d06874f5cb533528ed60e9854aad8a86a124ba3708bd0d65d003fae32222fd30a3e48229d9defd7278e10156116d0ac4269a9ef8fc075e012a57a2a973c6d050728304e94f7cbfaaf9d8fe72cff2a4a18ffbf8d80c67bfe9e44b38799bd2d127c02cbe4be4b5c655ebf790f294b78c24182c2676df1ab80338750a380243d87fe890aed71ec630ca93a6483951a8ab6770a0b8bd22b91c0234e26ff00b3c1e091b620adedbf0bc412af6f628d88b145ef658cea7c590c0703346fe742b11854cceb94574f6de9adbe38027b2e478391011ec9958f596265e72fd0e17744578b28ee6a5cabf361875f021925586ff712873220535086f2bb46db8697bcc99f85d23df24617fffd1a1f3b0970c52460dfb2aa5d1e8c13aa84bd4caa72a2ee838387f8138a90de3cc873393a56aa5149a3f57c49a686cec9484371a4aea0dd31202062fd995c17c04a370182c471b94d63fb3f56864e8e353b974f02d03c2cf6a9b9d3a9e8cfeb24e0bbccc2db23dbcd37b20005b7f3a9e5160c09052361524a6e88964b73c2d3cd9bb60cb53ce2bb252f1cfed138ddb4eda52a023551b1d3bb019c00162cd3f2402100dfeec7448968ecd51c8b6180099bae90023746df82e96c13dac82219c5f917a36945f62032701ea945ba94d88309c312c62ac497bd681fde8fbe414d02efc1ed8856f5a9099ca917ead5325e10f5a8e6497f37f27c33c7436a8752170ec85958fc3de01694216f251052fd6802fdf3d822fc8cae26c2ba707607651b4f933a6e7fc6e1ba488705c3a325166652a8891859e89b2df7fea58ffb7bb099799d4cc54a344ac52a5cda47d8269cf76142fc974b7e1c90a6bb598ade5ff62fc6509c8c41ff1680c8f0791096361d8a32c9a6e15ef475cc7054202af17e52c86f800d8edb581c704acbb86a168e0a5aaf62a334257968a771ffc5e35a0594a24ba7cd34f3071e41fc05883d0a0d6258e6acec198360f0fbccc2f9032a69b00ab9bac5258ec685ab64b75739ace2a6d4fd10b1af016878d1e8ac4ef581760b90b86e8cec1bf447834235e77d6fad21cbc1b10937494bcbde6e49f727b1eeb313b651f7f73f3a864784e2aa650f210ac59a5c953958f0c2c4aa4804388f2d73a4699b46d281f99134deb88ca782cf4501b9e2a78dd8308e0b1f4023021640c1b9fb260b35e3e79ecdddba3886fbc4cb441c4ca3a8f5d4f5c1056a2c9b27f7c70bfdf41998c6c3c454905f785a391aae76067f05575ecc3a4af8fb27fcffce7d00cbe307da7598d5476d55415fdc22860733f291014b502b3e837dea7fce6a6e51fbe3621bb4b82cc44d0385878686fb2d5cafa96271b63401eb914f417f052f782faaa0db9507df8d79d2080a232020d7280cd7f8eb9cf41df5ce0f3714ff98b6860d50204caebfef247e9cf51c48ecfe1b6f20da88ac374082b7ba995962bda7d41d350baffa9eba01a9fc0ff725685fa80b52afdf06c85eb7e764055f8e119c8aba5af53bd643aec7a9f382e4723e9990e0de699deccaf380dfab2bb82da151f6ae85ab546ccbeafac03765a7457462ce277a434f1931a5c68688420213204ae1efd2f0f45ab27b3687298080ee8e5c03d66fb9de62b7953c4b81eab29101ea5c768b819da455024c66bccf1473b1486b7b2144313dcdda1678665e1b7cf698988ba5176f7688a45ddc54e0f7d12e062d21d813c45cad9b523f5b05201b31d39a265b285e356b9c7c9b53627eaaa8167c0dab1218abd920a6cae33230808442f019db8190522b2fb8caba2785655571e976d72f68c474ba32197e1c2df56240a0adc336bdfbe109aa9ff5fb72d0a049db0e75cf8a9ec154a6d38509ddc3f4a71b68118057367a9a84d58770adebd5ffadebf0326211a7a642754b08f0254d6daadab22efc6efa4c3c77b6f9fe187742d7e97b0862856ca3ca3aab1ab119c1e5caf44e283d070d349014061f9e4db6851f9a054c509aa37458e467bf64894b2d9121018459e141b90813594d68200b199e6fd02e235f0e037fb38dfa953a87a9be2c36f08b6e1d0d72b6991382cc01124039366226e0e2ae0c01602919d846a99eb0feb3ba63debcf32ef28672b5ae3f9b2f0ce8390acefa0a363f76c1219cc74282e5c4770bdbc5992cccabaf7f475543c4ff3c2100fea1c43eba7c848a08068620eba108ae4101e9eb9c5c6c3733b06068ff3beae3c02b1755c03b068961363753e97225d8f65a34d77ff42747f25372f7e276d5977b80d071ea260ca674cf4ce622cbd8ee70bc31c2d2b7694082aa3405508a75a8b849162d84d7e82112e5a50418291744f6d9ef506103f7e3b0e6ec397a4f816bd5da0f2b1a8bc0a8a14b296ac204866d3267174de0ed2a2e2905c96d693f2a08cbd163696ad038e79e93c2859c9f79fda50d13410b7bea8963e6447f2258422f57e117eb62e33023b825518ccd654916a93168ae6cce5fdb80e8e6ddd68321fa285c24bfa242078b6f028477302c2aae4f17af612a53d1e7f345e4aaaad7d4a915a218b7538309edaaed6786c5c44fc2b14aa4409ad99cb70a48e492c8fc1ff698aab2d2a56e66958c8ec1cbcbaf1edf4b2148384604a2081c50ec4236032b456a0652f4291c5176d66ecab76ab9e65cad6e668467da8875ffe8145971cb6f05c554722dae5f686a95ba1b0f7f25fce89c0125a331b1888e8003e4f8a75a2275299732af1d2a18aaac1d4a18724be33a945637f62faa4b6ecebf3fcc8486dfd103f5164f74f8af5bba9ac56f9e5c797807831a645c61432e9f0e5bf1dde67340827c3cd1ec4bc70a4a7db857b22e87c01c781378bba81f99fe1ae0da4d9ef2ad33e32696fdfb40283392d94c9f3c82d23d6797913307786effd23214ff37b193d9a80b0ab889b34de79100d32a73930f500a0ff53e7e3df78f402a556a39d76e716b421b378e938e97af9286a8bccdd05e925404cc57df2ff127bb88bbd5f2aaefb75def67322b788d1a23061159d5f230de6316586a9b0d9129190bedfb900c1c338e819222ca7d1d59c257582c94831463457363810ea411ca00dcd04d9881d960a6551b7c33942bb1a2a049b567bd4e7dbe7b0da98265eb25f77979be4e3e87d7cfe7713ab95c5e2797cfe9e572b8ba9c3c57979be7e8f3735c5d5e8eaf5746b44e6688563106d164d3d2795afe36cafc92ca827ce9b48437e98b03a8cdd0a4b7348155afa42bb2297be7de7bad4674818ab40735c46654637dd2df2ec5db1fb6bf925d750992b201f51edd55bfd68be44fbcc43a2530010b42789a58b266f85ae8d6a1513eeba1f77a579435fb39e5e061e0dff283cc0eac9de7445de7369c7c1dc3f66f5e7fce73e242be6ae467c6aba3484eed12644a15fb70078b7ff8167b39adfb424ba04ba0d3bf62f40d8e79baba900e4e8648b6ddfc82f41ac3cad4f4d84ddf55892e805716f4effcc53002bc51adf4f4aad0bc5c8edb5bd2a5d0dedc3a10e27b3f581e8911f35b1561eb87428dddbd55865099981eeb601c1f1207d03980e99c17a2495efc447ef8f9bcacc4b36977812185175dde4d98cbc7f7288fd39ec503f71054756bb5219e3ffb4ca27a386e9ff5b385d500abc732701ce587794936d6f1662844fc1bcf4c114d7dbf404660b00f0449814409e387eedc59be9f7bc69743fd24d29d904b231f26598b7928303b15b40c30eae606f1f489d3f04c79cfe2ba7048031fb6d47aad9af4ab43a81e77b87107f5dbe91bc15a579e86a0f0403ca52d3bec48a60fe4d282fd7f55f058aa2ff9821c5eb82ffd918f2f2cadc28ef481a44ea8efadf8828ed1b5654c801c94e610aca1c272f7b87ca280a2a0f43a9e777820815e79c0b8f452b71312b53d576c9de824b4141ea51c0e720187e1f473aac5d26660907f148f5ca7662026a94beee8ab17f02f4756da98c902552e8a467f9ac3374b55792ec4ca726e16b95b1608ce46cc8d8e325f85a9a2dca3f0e343883a04cbab9bc86b99a0f4903789cb7879475620ff77588f6c11a534a0d29a095bc6e6ad58c7768f284b9a1542d99799f128c146097379833d8c1b91089566f23f6d2811420d4af043ad54fbd95822a205d938b0b78d4dd04fdea3e87fe0630043ee1b61bee0655a145135608aab1c3f1a60186980820007655677c13779097a3f18206693dad686e3f3d8e7aca6e0e85e23b2021547f89366d08b02a86bc3d2f3411f8d2916d50503c459769b08fd1b125ec6d2d5f714b7d584cd868705c40d18542361293e920e2c6bd8f7caa3cb7a76cffd17b99f1a4cbbcd26291afdd39fa1331c1b2be22395d71f0a3cc0e932fc69933b2e25b2c261785284ff03d863cc49c72678c3507e5d17dc21766706742fd301583188bdc335771a3ab8a330cb2f44c515a2c503905356efae6219712312b902e8b91a1a71d74f0504586ecbde69e2885da43fc3b46a75a09d4bf1479592384913c0376005259fb875a82f621dec808d127ac99f64537a2cb2ee4fdc5cd4147986786945aa89d0e94235a2ff7e168fa4a6de7568ea4581cbfc3709c9a8eb5a41b3ff8ad50da7f9f34901c99871f8b790921b67612991b63e15b1d9ffe0b29814f6d52ea1839031f0e3f3b82087c0e0868c650503317c61a5fb64cff42541473550f82c7a43137c576d750eae9b8722a90847df2f03da6f9c76131afef90da4efd21524349ce1eef24b90d9b9b89b9b52a4a612ef76b3fbd25ca70925e5855e039493306924efa39f54ae6996f0b0ff71cf21514b34412825bfb3338149f04c8c4408449a2a03308a08d863a1fa193f1fa0ca2c3e949f3e2da073966c2778f491be9730312263ccd2a4ada104641c4da7185dd0b71062b1d8a58e95d5de37622d6518865346f391e8d34e0c7266035acd2352fa5b9f0e4550adc5f57f7e12103d7668222333993bfd94b69f93f5a59ccae143b073e0bbab9d0177754bde25204cb9a00983880f8223c9bf74800093e8720946bff58cb844fadad01ea524840359c92893c658a83a11fee26880ae674b148884047378010ec5e7047bff49351ec7106793974fd5b6749c2e2044bd955b8db0b947fc4751c6eec0780f458619e69bf20e703dd67ed7e506f3729ce530df681fd48cd63e315d2a4fa3a43e6816de9ba1312bcc85594b85e75c696ff3d8769b396ef52fc38bdc8777aa02a803ac6a116d020919bf613ec16db3c59178c1427c26ab6ada02c2f060b11aeeb431eeea931b610324b5ab48b5e1b8b69f20142fc48cfb563e8c1b2b14b4577c6f304afe8a5b69f18f49550bf4a42b9d9856ae12ae9010d7cd7d796dc75a2a71b4924f3d5c9b452d3fa138b9972ceab3f1300559df9d713e9ad3956f8f8afd5a974e66953781bd02ba627837504f6277dcd17feea5b46f14a91226111d508e34f6e07320a98838b7ccb21c3bafe84466317cde00fbb7e04273c5e403c95b14735a0c2448a4a2d670b70af5789980de94fecb53ed4a724540d1f35c2f9a3a99530f4bb378507a42a292e9d0b08641cb4e5b1307a3d43405b3de3367bf9ff0766cdc473d9b910c068ee8acb1417411d946e86630a5e1e481f6dda12c6cb1686441dba94642f248c6d6b3b2e375f8999a7070c44e126015baad64b251f9125d6d78c353e56cca93583371ab27d9ae3bbbe36181c2061116822cb210d56921f8d7b420118c6b6d561dedfbb5caa63e29b8312bef502da4780b418975b99d997f22d6acee7d9aa1c4c4de7e0760ea794f9544a2e001b3ce18c49810544d9e27b5c13313c8858b82010fb93d595c342bf75676084647fece4e7a85d2bf14d765c8beef4326aa6ca715de25e3b150a1a462ce034d59508b5c84b6f11e260a5fcf694549b33ed946f1570e4b854508a339fbe7b3389c45e1b101383d7c485440eb4fdbcd4bb5d10967e11160122402fb7ff1b0cf1507abb7291aac95d22ab1b0e6380125792e39b4b03aa88e7c5d7e17cbf0d3be8177e8dba50a872c24aef3b6fd4df8451c05df8a93c0223a5ff31b501e6c53bb6840562ae3de93a642f800c2bda85d35d474e0616ade3867e2354e3d087df2af841a6109c380c466934941ed8e17c5d82bb55650f1d031d606d1f171634ec8d910054fbf15697628c794fccdde971b33dd3c36d48fe4e41fa2710673dda872d975f7317cc8d26ea7a0236f8cba53eca77445f4d82155892d6714e7b6311b473dfd2fd30886304a714fff16135b52e97446bc11bfb0b1c3444cee897189e5f46449ce4ccf4aca66750abb15b57086ef7bfc7d9be11f264f7257a84ad14574dd18f05f0deaa2c88b50a3d6ad7db87eb990c5ae67591c55d6ef73ed7d672ff1fb802b9376b9449ddec6342ce9e1fe523885b8a46046ca681901dee8120273affccabb82d7ec85994ce264e273c8bdee7f0b212ce02812783680ce6948fe5e8d203e4ae9ad6f0d4b40a4f76ce0c072cc581d5435ee1da1f34e19d8541da515047613bf5585d65d46209d94b51e70e3cfafc9dde4b19d7c9b89fc32fc354144b8f422411d6be29a44f72ccbb76a9a4a69645dd35c3948a54f8754c45a5bcd1c633f2211cdbed9f2ca182544f0a8cf7c974f286024c96bc2396c9249a609a0c0b8d60cc75b9cdca85945b65c14d0a12f8c0c6bf54d700c220a1b580fce61692d04f59a10b889100612c12e10b7a2fbbf2f2698930e26f1b674b2c10f31384c4d25d7148958915c41de39d9521b00e2e52caebe346cbe3978d552df3b335133f5fb1b023ffe23a7308ca47df940bdf3565048c21096d92b1c84fef34ac2358e8eac75b4b5dc035179d541dbfd06b43bd4d42e7223c93250c6102cfcc3b8b8427ce5e3feb1010edd49da6749985438978cf55ae2afc53070fbcda5fc602823fed73866e9c2e873367cc4988d1655d188ce03a3b1b8b92b8659096a939ca8150456b44af6ae7282b6082bee75c0898b2811ead615bb9f5502a0ce57aeff94f47352bff41f300c631880d01706c2f1814539a00ff8303f5d0b555497bc6575271dc3f82eff4f58086fe00843a57fd93e4ed1e6ff5d0ee8076dd0ea875d7a2f8ef8d3dce08e4d08a7d6b0be093e301150289e0424cc8ea23d8c112ef8741996300202c62ab79bdc4ca8d0cf87e6125bad2a23d6ff23122de2b1bde7953bedf6908fc06229dbf3e088394a2d8b2d32ca562dd1a55cc16850384713ba89afbe8220ec320eb243895fb55cc1ea4e42e134f10967365deae2c264f8290a821498908d2e0a1eb0514432a033a00098ca2a584e2d62c96dd89785b1cba1f826b764529049b9ac5c3f237680ee75df344665f8b195900d37ff00bf9602eb2baa0cb81715637f43b9b3eb0e7fe1ebb327d3f3bdd9c3955b798d0084068e7a62ef2ca03aba73073c99cace51440bfe9b3d31b53a1223815f48a88fa2a062b6bebc289fac03a9ff0116056adad7efad35f81bdfb72cfc16fbef80cb190129f7baa418af6dd43b2aebe034d5f105433d0c6afa647f01e72eefff6a8c0437f73735f16f6176f3e9d32c31258fb918458805b3e5b95b71d167f07e2c6d1704bcc137a6e65234c6bd0d6f78a6800cd1d38f2e96127974d3c230c3ac08a6d56c9760122d683ffe8dffa9a5b4ed1dcff1d6d5ad38d8a3328d0470102b7c49b7191aa7cd24d0d6718edcd2481750e36b674ea9e57cb25549dd9d06f896069f5992b16fb2b117b0b95726f7326e55ad88246d8d9e9060ca1c970c0337479de73e149161c70ea41645d159e7d58522da38d25d46ea4175d871e91f37a29f192b1b629fb075d0e37a12e1abd973771ca4b67b447c224fac59884ce1a2337a9598d2e649b77a3b79817215dd2e509ced74ea19ea1f0296501093f9c88e674c5404b4301ccf510514478fc27dddd738ea1742b25fdcf83e1c352650023b5b9c2d0a17ad7ee9ee51b2155586a23cf67b75339f21de4146123e1296792af4b54a47edb60151c3c4e5c3c03b1df863127dedcb7e3ec842914a9f1639d8adb78766c97118587c1638c3f396bf30445e30ec7f48a0c364fe5dd2dc75ff9df8edf47209560d7fab679234b98702638b737db50705f94f865f70d23b941b792355ed051ccc0f2e1f3e356d59f1db8661893c0061e8d2e5b347c14564de0b8abbf0cb0fd106e2d18e3f7ced3cdd7c17f995052a028af98eeaf148a409802c53daa8926b36720c4e32df1d6ec43b2e8b6360eeab78ab6ec2df221816b354aeb1005f8392055af855bb168dbf0770372b08884fd889da4ecff90f2f52950a7902df8245d16880a74b18efa94ec0df28bbaaefcec6cfa758d7980fad017c7dac095cd8a9023b4879a2f46537cc4a23e0e1cc7c068374f7cbc1c6d90cce30bc577a08e478517636437a9ec33100733f9216787722c064d9ccb44b153ccdd17f109b3da4d8a63250d779c7ff984c02ce074391ab762e00f0802a096027269363e8010db74880a333bb30438db0d17885308c40dc207cfc0575bfa72ed408b601d0fc511d4dd017ed0460f76c27b4927920c7a0e5d2a0fe52bf87ef1dfee71e479396add2ac7484f86601dad4719e8e8c9b479cf08c61aa190f4262db1206eb5d8aee65d88c6418a741666a8e0ab574288cf5e98677810b80ce5740e8cbd8543d097abed07d91363f230484bfeec4f45e525fb164487fa15bd1788bdc58d8d45d0f0b44fac94678a5727fb2be99a20164382325df66bca9f6a1db299bd80fac9dc3783f7bab7c9e44fafb867c75276c64c3d9239529f3192f2bec09fdb3b98ad594aa8c59906f16a9c23d4f6f640c562d363ff0c2cd357009e26ffca308fc7765942735666d8bc1d77c819756d68733f0a1de747c1a1eed5f840bc032d1b6eebe351ffdc3662b1808d1947aed296775efc3ff2336da4c8025a61e8aec08935ea58bc7c0b3ce251d0c30b5db5084201276abd34b398e588d923a0260b2d9503d4b60b876e01daf166b22e41ea1a850b7b83f974e608c09243ce9c4c78b429069f35e79ef777cd6934914e75b2ebb930f78dde458450363396dd7063aa72192fce0edd55ebfa986900dc92a372f0339809135bc8cb0559136cf04776a469cb106c8be23841050ae1e3ebdddb9405496f6bcfaed01ad7efa19b36b1ec645d7d06ef00b9a95c2a600e06c68a8bfbed01a24bb5250a763df61110be85d4d849a1d31a583e1a2e5feee402c912f234150345174f700244f30f35a6286e35b46b9cd407961bd273fc4d70876addfe80f11969c0d1b579cea3021b5a743dccf2853ab03dc7c103dc55a25e23019657fa617472ba5b796bc688316415d191a9a2298337e80b989f49171e2ed08736719b08f71f0503274c86638f32a6cbdbc9ec982667c2a6819891cf8601e78d25aa793366ffbc73d2350068ca5673b0298239f74c0bebe570df954b7a84b75a3ee2ac9764b542ceba5d4b086677622822b89886ac8abdbc33e93c7e7a8f93fb13a20cb224b319621d907a8e781c984def4f8b2c25ace66aa8cff9a4c760a4b67c35440ffdc0e2d93c320cb77556ee6c4d3e0339a72edfea80a262e33d28b9baeb95de41ba48198141a3e2151b0138242d47404d54b7d8194e12e4edde81a30be6e5944192e7ec268218609a68e6d6b747b54ae7fb4e7d67d4e21680405cc619e2f670a61c55f346ec5370c8569800d1ace5bf29771235e1ae807400f7a4e759ad6138325be5140af4ab7ed066ab8f6ea2a7ee959e76fdc808af019245db6462112cc29152ccd01ac9cbf82d5bdfa6a919d181f777626b5a7b4f76e3fb3fab2fe1f3651449e1a9314243db7185b8d717ac5404a26a27a6f326da123a620bd3883772146d75be0790e731a0399dbb2b675d15bcb49738f9c0e8bf70a00ff1262a28103f28cf2e34a8e44554364d97a24ba6c3cac276372c34d05fe92f3f058f7b42cd86d804d7186d188e300dbb1d488c479ad00058b4050ddbaeeda20eb84bc528def2d3be2328196956cc02433a31afed9209faaf6c3754c6c6773a5751dff7f2bfeb44cbb60b2641f55723722b9621b7323830004677e14ebcba76c0549d0e9725868940764ec0bffd7628b601315b0c4e98f65dccffe7b7035821594954b5161262d325e2b6d262e229ad8449ef897abcc1beabb82b09685ae2d3e0749f603d0ccc2deb25b70d70c477fc9ef4c0be417283fd798447c7dcb70306f451d6fc7a1546fe96edd4c4cf6720daf21ce8abe37c0c573d5b486df55023bf2d0e2541b50b61b5fb11ceac6c2a4c80c89abd91379d1fde485862a18e025cff715283e9c5617b145255bd67b0f98e05249ace0d3b74cddf00eeb48a8c221d6430fa312fbabe8b22a13a4bd5944815c9a5e29eecf2f61ed5d57faaa941c7d3ab700cb9ba4649e237fe00095ab4c9c7774b867f6f04025765b53722040db0b81316ba4b4f72d16ed4c8fb058b22af8b4f52fb2af00f5548230c75e440e85a5f744d143ad8138941d5c8610ad1d2aec590fea3d06530db8f5b810252bf800ca0241cd38231ca692359004288cf2cb25c396ef19c8e60e974b62c02d2dba8df7f1949f266bc8f93f10ebb8fa455328540475a93434668b70ce3662337f40c26017aa87074adbd97c7850580bef45b702802fe2ea5074899fbf2c7bf382d26dace5fcafab16ac429f930cb9d4f0de814d78ccb216adbb8bfe8375e5c56341036c446adaa71d8392c496fab96377c958f67d1ea3b0d195393deab235d3aa0c8834407ba14dbb41d13059eee6485e41b4034e5f1d2518316ed590a8ca69f34a95da7e5530b118002a83250e54ba8d2eae029d56333df2aeecc8e59c1e34ec9fa1d307838cd9e158d898a02c31d7191a37c892292e59625b872459ed3d5853b81e3c0c3b0219bbc98deabb19e92601195c648fe9b7076ecefdc097d2f8416505d7b0674453748a52f880cff251c550f057e968a8eda6d179d05270de1e3ee90892ce932d3d3d839e9b91dcd14ea93c2fcb83c5bc9e69a014e37c81e2b3369c5046da2b6fc1810c696579c1f3946015ea7ec656e46694be3897ce59925170dca049f4cda1f5d63588b7ecd9aab18b43907570240d23b3476cf5ab9dbd8289961d08968845b75c7dad8ebf0dd506eaf595652f952bc061b5f4bc09c14dca4d3c644218947ea0f9672ebf1dd4c76ecb258b1f8c31124cf6933adae02f70a78c02056e23b705c1359cd06d6c3a4ef811f4bc9536dac637c6f0162f61575c0ce82b8fb9791e03b6572647e39631ea5295c9a827938a77a01c7e906c7d2d092f1a6521e77c4c7558939f497a35a7e3028874aaa8211a96631523d90a8e21d10c6beeeee52a0b9d41734ef293061723d6ac83246582b81370c14c8312beb9ad69599577afa707f2de726fd6ed698debb6815c134ad2c72b2ae3d3d40d06149339242e7ed8ce0383feffd4cd34133d658612999be37089960a95339e62c3d5baed31217e3ffa0657165d3a6f7de715c140f01b859b8cc6b739538938745c577e50206b9708ce2aa50feae3fc1efd35cc7133fb7c7c16cb890c4ebd21ae344883c390a013a2564640cc7731022287caf2f128d6097ed28164b50a78087409522b2940b4e98abd233a07885d5cd64a7276653483da40b2453ccc8033cf1041d570a543a199dcd7dba2983666160bf1f35e44497810ac23bbc643e14b40e1759291cd1be10865af890af4dca6fac986983f21fb7d2a46ea4274e1baa19ff1f794f8c56083e9c09a071966150715afac06697f2a029d09759f01d8b56e99711e1d88562540f2d9d8434dbca9036d217ea0eaf1da33edc691c31c7651922e6db0893e84c346255717a5a31b9e013887f04b110b9038a390aaa641b70014760ca1c98174fe536c4673f9eeaa95a2303bb01cad29f639d81b7ba7079081b0917c79a605830e36ad00419a70d399cc715cfebe0129b3642e4fd96421287413b2cce07ea5e3a7293e4682c1de1a84d41fb15c35080196f2aefb40c987627d0cacd78c3af05f19d354866e4ecad91f500652c3b1f68629362a85782e0eac1e5bc62dbe4dac011cc0b83dbb42c25f5bdc6f2e58f935dbdbf593e68000d4808dba6b71eaf1c99ecbc846177216c2e305cc0ba91ca77b652c353197798ea1131a0234d5931880e4677b6996e6b8cb1629281b997a49507518177cc4da8aabf4ee373bf062ce0a233367b7a2d4ac53539645662f6b360212828cde263b464b33760d128a96298028c9ce41a600d7f0357274925b10bf9943d339161bf1964807d82d28ebffec28bfcc80a30bf9cdfec70ad9469606b56fdd4a42d33c9c25c8009c9521bcaaa4fa2e00ea6a52715301457460b5e05a620d6e3d1f06f59566d044073136c055c3d05513cd06c4dce7ca070b13ffa4e619832d0453f4251d49d00da337db42a8e00f384bc856cc81836717a17eb0a485243a492e1165cc524b09246487ad5c0cc47051b70dc16fa59ff5881f29df487827a9218f6be6584109fc1e5ab52590dbe472f7bbd77e3f80aca1fd6e3bef77d79de33df45d3e95bbbf45586795bb10ac38d81c0155dc5ebdd0cbcc8890f62955f9d4d7814cc726e0ee93408b3a2a0c87e9471fd29d4318534cafb3f18f84a2fc1045753f631eba66978ff38e1bdf32801ade58d1a95f19e29414d9b0b5a25af920bf9b60d467a0a9d3b96be0870fa2ef3285b0d164d21ff9d06b4b4c75f5fe1d0981f857c17744024bfa900cd6625b6b56c4806161108192998b6e89c07e8ae88f897bff515e1e328671b21fb4754e75aed370d615ed14b32143d13b07e75ac3cc7f6fe49b40bb3d9d69d11d48717cbfa5f24a44eb56671b45afdd8931af72aad916fd425df1ac400823534ca2f6776bf06707e30f8931d647733036eb257759d0849c302f62ba2721c6376859dd1fb4d53a6a7a53cd1924e36398fa090dbaa62875bed33b9a4f0bb07e2141fbd28e11949f1223443f53be66b47cdaad481b79273955beaeb12fdbeb74b14412e67df92c17c5cb8c773103d717f42ebcb081ddd2808e9af4e12c935b2d8db84e999aaca8a38493a1e99774a7ac078432f7a0c98cd6301ae98cccca8a2d6801196ef1684e661e9c18a84905c6d453316e0b7db000817b97dbb245cb87e6d70688041265adb7dbc36031f87b2a6dbff9fee200e7bdb9a1d8fa36cc837fe4110c5f94cc89ff3dafc1a281cfc923205707b04214cc38bd536de6cd8577470cfcf0288827371675ebb244abdd1858347adb52ca84cbe920288040884dcea6ae2e8f88c5f4c4308524744b0c2880cc09b3e410f48e2b2722d045e782e2b9ab02b53a9b71fd320c94a6ea9d10308d1a4ecfe48bbd67d45b3060f0227bfae11761e563b89e67c5883eb4d21ca37603645debec18505effc665c65f456af7689f879ca95bcb3f69e24e31b87c9ae27a43271fddda92c40c33c1fd15256db45061847e9605881c4052f620bf3212dafc2389fcf970cf7c333a58a9340309a6e3bd74acab17850309287581ba8cc628171ec98a5531840d2216a07c084856303807bba2a4bc8aa95849d7fc918c30454af3b8c10a2cf3d40b2675bb1d5e9893c3a2f8dcf80d5668d9017adb17fbed00d21d456c5e5732fb8aa0a0274df69904d90086ba58cbece3b652b1528c208a710fe4b1b62987c6aaee3937e33570fc7170e9584c77d127a538512f8760cb2c4b4a0f62db36a315c1ad318a447df64c418aa38f9dba463415bb4671515734c62c23265f1679a0581387a18ce82272733669eaeaeb4513202e02690d63f6afb2475ddbb2f108a36faf52fc9ac74f7119a7cba753e9136f1ef4d8466de8a0ec23eddaf9b240dce6cd3d86ade71cec4a3cd54ac57151696d10d9be1c3b9dad7d2140b274b69bb3a9ecda31da49881d742452e39e653f64022211235b7944f52cb96987ac32e4e20badb139de571acb831f2ec241e13e4d7a223087d871f88213792684b4bd64bbb02c30ff355fb5f2217d8491dcc8b70dc24ac39f6061680d1cf8b00a53b23c6fdd44dd013cfa07c2d4ea8b6ad9d705c007edb16511161d3edf233e562c12a101f8b00087c211afd1dfbf41f481738018a758cb1e14c46b08a4b7bf590792d2d427d2e02377a483b50e1c890d37f3c7e13020e80f7ae3b552457630364c2ca60dd90b487c04ba06e8786a1e3f6c1066492ff9cf0b8b2c8d8415a90f816079d7c21ad60f55ee16a419e22629d96c2ce0d6d848eb4b9c647a222e61588a4942749709a71bb2195a8392c17314ed06dfb5d38b851a5b0a8d7cd0f1098e049a9704f77c302b5c315a60dcf38118bccef35c02808383b7b290aafa2cf13098f96708bc0482b1cc27dc085e1fb6770da27926ec61912aaa210cf54b00fb5e90cc07fea7dad67f8b086419112600692f188dc203b208160633d9fddc3c25eec351ec098dae8b33d641112036a1bd47c9482ab18039b87416c8072905ea3d1eb8f1fe8c2ebfc2698b49a09a46b0b1c112bcef61f32212307194ce5557b02755d576475a7c151cddf399bf8aa11db0ac735cda52253041588eaba418a3b4b82852ad95c6e19c1bcda3fbff25fcc57db17fce418bfff7f95d7b18b00012f28365f95a916b26f049420b14dfa639fb83c01b68f39db6ea7f4750ce8570350601c1cb6a7f9d2876b9984863b82fd4c6216d43f13c5ce504f49a92b9012bba0d0f96c57d5e49d54389248579dfde21b1fabb3b4dcaa9962d24adb42c97926ce1c8b913125df06077d4b11cd0173aeb6585ac2b7af343d1793d7280e2ad397360436ef0ff4d0bf3ee7eb8660ce1c8b91184407ec8ee130889f8bbc3848a3cb1865b10a348fa9d19b3ce0ba95f7e2210dd393a7a30d39ed9090118f407712df35608bb2f92f4aa0fef3cebd1c8a9dbaa16501101a5c5b2240d862bed75ffb626791c265224e82f630414d4632e31b6a022928c88eca9107ef35a3962fba220008bc0a68ae1516ebcebc374c42850a849c2a7f8011e55e0ae9004062112c1734cd3c3b6e9df6043caf5ab17ac00b0119c5045e04d4050ce69660d4d8de8604d51880f3107aa620ae0b888a61c2b4e700a5084d994b20f26be13fca1c7561293eb41d7cbde89ef6580231b748dc5a9561f4b80a437cf0cb7df86a37aa0b0cca6ffe66f5d2da5124bfdb6f5d1fd95a51d3456e7975169a0b0a2670c0f996ee59b054a374cf74f4fbed362bfcffb3adc3eb15534551e325bc543b7e2c21a1201c0165d7944f42ff01cdaf2e3d16e76ac6830843d204dd509ea41b8d3e7edfba465d3f111156c7c6b855b74a4b87b9974e5d676810d99fc3ebf12837b88b6fcc63d8debce41faa85080179a810523dc9722599ed6b2ee4937afe6fb54c3ae88116a5a4db4865344c2c0816f715f2b9adb4a2b4a58b73a1bca4936f24c68a11fb6577160d12e8d6a71e0c6b7dccacacd4dad6c6e2aad2c61dd47222bb91be20a459705b9a436631967b429cf4de189e2d28ac35ca2e891b2d9720d2c0b80baa171f375bbb6296025ccddf20c5917c58d24358484ed3ce0995277b61273a315a81b5b91b913af1824e5bd794a3b13e4796807b7403f54888dcfdcd4f9fd6c59c872242d6dae942199e37dfd03f7e9f7f8fefd3ecfa7d7ebfbf4fa3dbf5e8fd7d7d3f7fa7afb1e7f7fcfebebebf9fd1abf70d8aabbaebc58446de512c838dc1e6ca326aa852d7590cde68fe63b8e016a5c744572b7c921f870ee9498f8a289910a3d8a433ee90d2a9ea773297d493179ccb9aa9033555e3d7769d57b7e23adb7cc51a39b944e0daa9bd2ace99f0b77da9f341589531dfcfd5661c029b7f1120974a4b7bc2cee706ad19129a76d278e9306aded3af4daa28b40f81b873af20d0acfdf459061798db72f702b57d3b51f6b9f9b5e90af2b075bf7b46b0a77109ba81c6cb99829fe8d46dc1d9d52ea548206c4fdfb839c01e19c1770afa0035704ff385b54c3d195216cca4d5d5ae3e5cc52b91511e61de458258294562c35d3dcca1d0573aad087283ca27eda542d244c6fb1d70a2a63429e7b3918e651aa29b6bf9ce7c789d15b9cbbbbdd53805d539535cc442a3a5361cbff0b6588b198dc961bca68c6615060775b9e8a409cb0768ddcbb49619e8e3a214f0d6267abad5baa86d7cee84269f67b1e24d5d7858902733360fe7359d88567ae2b2d78d1ef5231b108c0788b79448cb9fd652683af13f30e9216be508a9a22f0c1af6ed867710741ce38edabd91ff0cb1f6f6ceef6ff118da2af5d8cc780be236c04d0dac8397a7a296357dd70978b13e82f497509c905679d6186bd0b80bb8fad33e74fef72ce6332e035f7a7cc9180d5090d9408c3cdb85feac1e1e51e43e4fbab255fdcfe3d486b678c7b32a023d0d4d3dd5b7d0276be7ed4ed83a69663d0f75f3f56d59fca89155d3c8b46cd066e6aabc194ea9bbc94f2bae0c9a3da19a0e5a7807d1ad4fa940f3b74ac045eb16973e102dcedea62172da5a79039c6192bde46bd59bb9708e3df56ebe94b015ea14d64d6304ac191f0a5356c098e60f463454405493258df7d9ec792a0921445a18211d4be328535c0f82c8ec1a0172336ae822d136002009355f417bf44aa6e0a21ec9116fefd0a3980cbcbf665235aadd5e806fbc895690015eb2b27a1a1ebfd264e04863547bc7c0fc6663e4233253b7e1e374e53b480d3195655293aa86e51fddd2955aed903658d5a8ec25e0303806d8f699a2d1fc753c775d9011b668d1c9aa01abf330e8ab53f6b9bfb089bb35c4c9ad11df9f55c087ee3f13aff213c4b7b30ff14c96db89fa00a01772f243fe1516e9c71308ae9c849149a2cfc920f5b76ee52142cdfd30428e7cf9a2da209ac87cf28e8602e76ca856316a3e595164ad5d87206b241dd922d7da3245246d976368819796ad3068a640ca5b6dcadc9ce8628ed9453a8df30b667968a7c608967c1302c06c7ad05f760bb20f9d71469afedff5ad93af0e734cec9394dba740343ab86446b41e2e50496f8745727cdd9d2c7d90c4c847d8445b6afe7a6d756f9209d2e32dc4e6d668804766a93c3a8ce490a9f4e18bed7509787819a56785dff160cdf9ce0de2b24e1924f4a5495978de2e4cabd6458d91be1024992e064cb21bc8e2cdcf40bc02e87631708f6f7f34cec709375a57f45858cc4d8f5ecd7ba383ef567d7c095ffe8b51c6ef1b6231923c8bf902e084adae804ead66583f37db0bc11742322a48fdcada6b4f09a3279cce2117568900029a313f56acd12a830c4bbca3f59f508c35b1e16c198fdd21617de877a2b6c37a4c75729b6cef9d5d4ab93ff33f72b67501637692fe94ae9222602f6529f022d1e93bd63fc55e67a4f5a5da3b43bce76663faf8df42dcc287cbbfc31275cd89349df2f70d94e6c1d48da2f4a05a087f9466e327ac73582d38418af3511de35d1b7e8cd4a51b476059f8c759f451393369c7ac20285c7117c25e5988309e9ad0790bc2110a757f93af52e3a8b6e87fdf60bc6f18e493e32b730e8881bb01c454d3331784312be51019c44cca57080a5c9a2320313c30af34f7c96f14b6dd7c4dae712c2dd26dfda84836c3992425630c5ff0fe72195aa9212d76c519660cb13af1db56a69032057f31678b73019463fc70c0c7e98c4756f68f201d380673704be3ab7cfb2d63f6fd705127b1960df52e763b437522343c60f6cf8322b3f41dc028bb40a507a4cc528b781dcaf1ceca43c414cc4f37e5b0e43efa80144e640d4c99ee08fc147b6da51afb7b385c683edef08ce49503a91f27297af2249156e8fa47e1bf7a0f58e2c6bd1e574f9aa4b88f632c54305fda67154adb9c2807fa42ec7d0e46f4843ab96ca3885d6696ee5452ffff0f0bbadd4badb5bd045042a1e69f37c63a66146b8d7994d43e94f9e24f6dad3623610db699926f5e4358627093150c9aba8d6e2f52715f2d21a79a955899dca26d3e0d224dab0c7f8a9a49b47d235ecfc6c7fa7a00ead3e87e4f3a7a41cb403b1f28c390cb39ada7684eed12d0d130be7cdb1b797cdb5a2a0ac3722b0856ee8f2aca1a13c819d46656c0958ceb922e5ae4882c1857cd09b0d6a084d2d5358ea11712321467ff8b820215c64e7cf3b0a1255dbfc54f3ae908a4f86de5bb084798ba079e178ed56aea9455930d98ee07ca517d3a1dad0803514895b8540633d2d21804423654f7c476c5150902f4dfe0f0b5e1367526d90ec7e11f184025096b745cce1962490349ad4a8320f86433f8e0ca58134bd45395a666c953b4b3cd9cf226932fd065945278359512fbbbe349292a5b620b751b19b51a50edcb9946b59fc0d008f240c5a33985ad8ed9a93f8f3e355b62fbd7ab0877684f2d5a4fc4f5b3472189a45a2f806034fdea274518c0f38caad0a9f247701841e2ac13db504cbfa283adf83092621db4743e61d425d5d464621fe6133818044c9da2b0deb916783713a0dbb868cad64361a4a1dfa2fc4a935fa254af0b9af155de6d5b41e094af33109a958da5fa077e2f8af526f1906173a54cc0033e87a4487d2f5c3fd4741eb6a94f2d2ec6aa324f48617f754f09e9fb7e6a11db99d63672c6e235fa5ef8ed829372231bc5df3c0b0bba747e99d909347a2f786c59bda2975c24adf78a10acbc4ccaf622ff2bdf5c3b4b79caae1c334aad3dd4614868116998caf6165f3099278a2fe88c68124502de0000fc125fcf5ddc4e3b3614313787a5115faac0afa8264d13faade766813e5d7b9a88a4ef400dcb538cebddaa2800283c5a7a8580e3f8e75d7ab2bdac01d9ee4ad50f127db59a2916c08c048ed7f286f7dbd3a0d14ab011fe26dafd096b904848d80997136e8557e010e675bade62cfbc14371acae3cc9b03d9dc9ab473420532bd35cbd4146da258ede76309a3cfc0cd260e118805ac96a70f2d4a18b01fe1b9ec1c768893df9279b104df65ab4b23b1681f97585585ca5da442bf54aa88da97227d8187adae315893efb800fd553c844519fd3a37c1c551b86c971cd0591b23999a5c174c05c2687b49a79e3c1a70c09af19f46fec1cd838d372ee8c000a39498608c017d3478bec02bf4151f11bc6b17e11b979ab04dbc6b80b6b4abda3a8e511a9bf04ca684ffbe24084c0c55e4e140b322981aa34a4c02d4d73e570904358183c76361a752684101ea31af99911047d23d271108ecd3a30ea457b383892e0b73e46166fd1969bbb39e991a07b1b512eb210322882ea091d8d649bf2904c58e9b57195e834275eacccffc5768b1f64533af73c08956eaaf481326df3b738be3023986eb6639de0f48239b970006c3edad861a2fa3f5ed53b7b708b7dbf963983a71340a116cf43a7ad5ed04794ff08980e90df79e996e7389b048a13cc7769ed4005f9f77c473b986568c6808464694c1a3070c706064578e25e8df64a96b5e47f6b136c9a4f743f3bb624340d745e73090735a99d6f229148d1b37a847030c44857410cdbc2030561027979899bdd5b024378b504aac6ee99c737ef300f5cadfa7930e957a99030627d7aef8e7f6ef4b7409aec5beea275b1d9f2823477e4da7d2f31acdc51816ebea2e0cd97017321e01b304f47079bb4afab2173b65644d411a247c81a77e90940b19aba3c0be2ab131231ea6b44c90c7d56c58932be41fb583a14992c0bd7aa15278893bf3982392c14993669c6a5565c21c60d7fae1538ad21d0cb681325e3e16229071f7fe77699c1420ed20681f0cd522cf32a5a5c79026dd1ef81f2ce426e4a14489d43a6ba9c23a5878732b4b0f69a7852c60a46aaa38f0b9bd1d838ef1103577dc34e3bac0b5f2dea63a6a838064d9bb62a34fa581c373afd8dcee7b744f8d6450a1eba1af30e90ad20244e4a36ab6cda315812f7d014d7cf541fb1acd0e9fc534d413fdb16f0f3048f08a0d5e4fa4b5e4a4ac467bf782793d0a0b9af459c033f2f7880f20b3e860e722aba0437fd82a9058ce41dced3deea2d694b158893d59912fb9fa94f7f73ebc62f725b59e480df5b01a4c6b24b661972b6a3fceed1b2539873b665d022b02bb29ddecc05c267aff61701f62331d607ac78363a00d33a2d97da0f942049cd1d328c99d0efbf91f4f66fc8a4fa17bb8488c8d538d7848d342fdde978ab8b22a14e82346324edc8664076458018aeb6d143c043a1449dbbf35f073c9fc6b269cb0ffb460262211ae4033e7ed2b36d3bacd573561a45df984b0a027b91f84dc022ecb959c44a8f59606d3536427316ee6f61239e91729f151c0bb29e76f7a8e798c1837b2d5e5f1810d32d8f793db35395cf4076a7f5e077edda8f95c9d36addc8335de063014c19d3e06490890c71007e09d1a524e75f01726ca7ae5e7ada8e670fac5f54970a16ccb7919b43213801720b3857bf601c67c33b93a0d440289ba3aaf2449ae3ec8bd8c31c08e629d3d05b9ae00d85289529d7ef7c5e6f5dacc51fde0b1654ffe27cf3309e65b9602ac168e582f8bd8e0f1dc97a895aced11963aea299bb8fe234c75fcad5927dfec2a7a43c0cbe9d6dce4621c53a155d60100edf1315a2a3d16315f7593b784bb97f384ae0718c886c92e09070995cf04c94a9482bd4d72bc38f08a70a73ac5930ae4b3e3bc3dc161d12bb53f5f09c70b34dd680ff4901223258d90a55a4cecc43a5517226541c5e31b3b866c24967bffe1ac60bb59f4ee4de84acf7d3c9d9c24f1cba8115bb349fe069b38b4180c2ed986cfcf024369b5f31451c73883c86be3fb31c994ba7a8b673d9ed12d39c1b24da7b47f9e45e00d93437571a73cb1a5be5c6beff919d432a7348f6c47bb3f33e62e765bd84b4bbf903123900258673abbce5bbbe9c39a032c3a78ba55177ccd01d930323b69ed01f400b4cef0762224d63354a51867f58a96703fa4385fc2a419ade0768d2fe6de8052eabce096dd3f806f10873813a7b2a6f771b12ab32eafa44397b4c3175e800ad99d41747f4d15922d6c8795bcd76268aa2c8a4b7eeb72fa6fa43728f2e45f9a50eb3c9d4b196bb10c37b93ca3e8e9f92e6388fd0e958f6bfa75150bc62b74ee974504b8d845f953ef0568c807fc832bed7f7e576246065a7ff4a5a745990c8a815bf523d594f20fb34464f0e3e83e81b65eb915699b9acb53ddc839c37ffc064b750589ad79492760dd31cdb519ef652ef924784145741858b94bce1aeba50165d385c01b6a269233bb23a8cd6049e03372687c19c9660e3378b26cb56cf3804e72236b048a38b314bfba1a8648caafc8d2f63c47a184fbb2bec8009db5a5e9ce660e74f783965f44dbc13a6bd1ec9a298382c4d21beeffacc7c3c5f7927cb2b4b926d41616f5f8198c28270e27fbe82733389223433ff892cc25a35b903ef1db18e694d656333df81544ff51961800f244d630e49ea5efaec9bca4f47efedc4b5e30f69ab6bb714707a33dc460a8b1131f46ea72f56a4f708d66b9d01819f269f16647a620741849cf4498b41aec0e19d3e9470f6ca808a828ecb458bd16e57001e466abe15d12760689186b9e30687a615cd3b66860996b843d6db762c8598888b101ac0950cb6d4e682767b4db4ca77f0812a522597fe96ef691866513b420446671d57509dee64090f31780fb01c1f0c97ef8091afccf1ad673bf5d16dab79d0e8aa38feb8d843fcad3dff4f93fc7f5574f7531fe2636eb9b87339b64e425723f05bdaabe52a81360387f982a6fc4c52a3f22b1a39d2e5ced81414b58c70ea5ebf0b96c49be25bafc6cd27b60f9c4596465915f468bd30da3a407115ec7e3683b9bc81cd05c1e553c097e2f311b19636843115860deb16d9d8008c029cb72236e159af8c3469d9c3cb1a5820039a1c01c564da4b1b31ba7f1ad8f3ed269ca8494e3e17741a0d036898a6fefbb2e5b803965da6c6a30f15982c3c5e88ff2faee740f9820638ff95212055304e0a05a053e1bd1ad7941220181865b833632b3cd1bdaacd3b0dce532ba7db6675d1103226e831774a018817e56cd71445c10cccc359dbb679f5e3b98f6e9be709bafedad4e3f08e1e3fe9471dde5ebfef908752712f32d4f9841773beb470deddc947b41b89b4820775f970cdf265cc31ae116a4540f151c59cd0fd5c911afb319b5496618b6a6b54b82a49b5c949068c66d3e0922671229e65069aa9693899d1ec1a1b69241343f49ebda1b7ebb6d0bda801da0ed4f82d75a284090dad1aaeb580519cae9d30ca8157ec23877803c315df391f01744456adc30b14248e1962c4152d2bc8f65708a059430c22316ad5b5e04c69bed9592831c750e4bdf8757d6c806eebc2f5915c5d1449191d210c396147d9a7cc79b27808185b5a6098a969233a2e3b4d11dae8808c38200ee48aaefe1c1c69cb696bcf2a22a1187f1bde785045bd106762b6be2a2ec64694d69c2fd53b146ea72ba8a2befbabb29273d1ec221131222b2733f3b22ff9352b8552047efad76b033053544452dc2b092252d4cf9e951ca16621e5dbe6a8ede1732c036f6a0334ff1ddb42b2cb29863c1b7bf00ee504f1d577447a682ba73272660f66ad9f4ea633d9b68c20dfa93e5644ae4a2391f64ac8ea368b3a79b774e2c6ca2b917e5c88dcef21baae57df392b778adc47079a6acc7e91a52faff7993237b09957486bea66ace661b3a3572b2358dd76245d29bb5c3a026ae6a84cff3af94da78dba152f65b2447993565272dfff68361371912482615ed36a5e3ffa8ae06f89abcff0085627dc2e7f48b2855add9e0b0ccdc24bbd9d9ce82615819eeaf34b7a632f1a5801748a01da2215405c608c5c5607fb1ccc82ec6077167bff0d246ba7ce9db93579a8c31eb36196b062b1d7fc7f7efd7d8eff9c77d579e2a3d5d1814f63273e7a0d99f821498550ae08770bfc34b4747ac4bebcae53129a39d8aa41a3a47258b95364dbfe3bea03f003e203254630f9f8a2f2709464a6587179c7eeee3e55cc19a68cef891a9cef9cdcdd5bf470ee4277f71fd22dc20ea9795dce6fd34f56c38220ff21ec6d590f870a01873d9c1011c54c2773f5567d3846b168b4808c39963c4647b2640f942db243f6fe1642b80f00ee7739277da9fc40591a37349f406a7c1298ce0f5382b4feeeeeee1b360c7dfd80175ca09b2b1d0e373e2f1c95c5ec606a9b86fbffff1c636a439178428eb2f60386c58c7e1132f0cad015a75054f41889f8e99aa6692d4326f4598086a0d773eeee4ea165c9f9088bc9060d122788c88b86701378cb39e7bc575ace39671496d486128b46a45f4051badf768ec297ad6e2054ae29a0d22ddda8d812b6c49abc0d2f8aa8de17ed6cc8765aefd8dddd570c531b3a43932dac386ede8f02f86fa9816a6670ff2be601a512e063c93b2a99c8ba314c4548495dddf0ea0f6cdcc657f80a5f214c6da88b601260ed4b0b14154c8bbf25bfaeeb0ab4e2c3b9fbffa7f8811d3c9091a5fe5e748212eb4acf20d72d8b65d992185a443cc2fd47d8a538b219a1a3217122e3876ca4497114a9c465a56965848d201f32e6e8a2e36cf68f79c4115d553496822ea41619dd1257813f30320355f5c3d84362f2b6c80ed91b6881d0c5102f04562e2648b86f321a33d40b071616980d1dde540e1a298ffe744dd334aa7f7aab360720810243c9b9e4f0212356c50324a1ba7949e897731749ce4a374822d0622acc8848e8c38d60ba8259321363b9a5469665513ec6824383b6622c3bc489795b64876ce79163eef8b81bd330c61823cda43694663dea646d675b40d2b418d7ee3e632072bcf8622246b1c80c3cf6c479d36858e5724b6a531bea0e7186a499cde2c444c1f911f5e2e8e063a3c84707ca16d921ee44baa40a0344b8ec3d106e911db2b770c941bdd1ce38307494c3a2e4e4977420fcda78772a04d0c0c3e2ccc2b9e7520b4ae3572be301a03695930345e96524e83fc920c9fafe2917c62440d17c814e3da8145fe21029dd086e911db277ceb1aa37cbb1b616a068717542274ac84b754bfc64a396e333b7fbf63d9b01b8ffffaf01b304b4d10dbf72b197e6cdebbaa6695a7390fb9a7a4ad9905469f2692657b00b219fdeeacff6ada850b2c5fd463190ae07d0b4ff7fdeaf6bffffdf10aa36743d8ad06aff21ab65bbe31d3bd6e025aa36747567f28ce0dcdbedee7e4c6d687267035ecced3d29c535c5f802862d84098946787409061a10a3941d587800a648795aba527528b95e19c856963afb073d8afb99725e811697f31dfbef28b5a14c505699c24f4bc45b1aef79f25a918ddabca90d75ae4f4d55cb6093b5458a5eec5c50e4a2aceab106f59619fff920fbab7339b778ee2995404c26c34e990ca5302264e1adffff3b96d8472dfa234adc7f09f0015b206014e128c1384951d850f16a2980077235612f5c345b9df4a5c6112b56a4cc50b4ccc18e1479ad886af2e14fa2a41839894605bfec3aa8144e88eeee6dcabcc16235260c680d331ae1184307aa202fe6548d2ccbbeb8bb3b4a94d4e1dc9db8a8c4e6c4d857cf9f1a85a90d6521168dc8a76054fe671c5cff68a66c57976a03643146d41ce12371777777ffffff87c08a89ad1e2ac066ec7062516cd9371c41297479c517d06a4d314c65a5bfe1cd694216bfa50ca21525be59d3e9eeaebb4078029b1e2b184641121e3e6309616812260382189584c2a848974a7de554bd0cc04642abcc99a0031d0a76c34b8792a60e783e0ae040c44b4d081266cfa4e74c49a49efac382c9dd1212c054f2b9e81079b0b1a47ba022fcb9f891f9624bd586aebd5cf3ffffff238aaa0d5ddda7e69c73eec195da50b62764d1c0454ce6be9cae3aa80173c2ec9c86706436046054b8374c8cf0585272d11574777fd1a536b475873334c70a2f49f7c14a62f5b95e37218fafea087934c362ffff3791a90d55ae199a4b5d4b8281e3611166d88e0f95c9b64c2693c5daa752aa3674ddbd2e44a381d0f14b6826c36436633667becd2dd51674894385548e963e106c90fa82812c02facac03d09e74d221030439ca14baa453385cae9c699f4cf145dd334ad7b5e06b0830b47b3446fe843939e3c7158c59e06eeff97b30a0fb99cf1cd370dfd0351b5a1abca733a712851cbeb14be637777d761531bda5b27e808f5094cbc68786a4e7c6dc578785cdc1a313fa9d1809fa1241d4d15289ecb68be4b272e2a879e6a43d79dba9e58e5dc87542823b22ceb014d85389479a3139610772c46c4a1414ac51217bfffcbb26ccaffffffff3f1ae434c4fd1771cfa6eb66331cf4dc2999cd5cf71dbbbbfb10d713e7fec50253f5f105a36509064d650c431417483b9bbd524f90dfecb7f7eaf8ff7f0631b5a14563851948bc1da0e262a7c90351865206af86e15ef65343a7ba5a87d7f339370f478cc143522b7fffff3c60bb6f9e449334a90d3d26b385e44ece3e9464f27e608c310c546a43adb42ac07ce92a7468ff8689449fcc55665cce3967d72fb87e21c57da72a1795908865d8e9c940e8a0d52937d02d35de60d43505dce178a76cbefd20d54af9a0d5d0d493004245ce0a89c8a8c9639c306a92916920479025c1f54a25653a6fef1dbbbbbb6b1094b37b49ac0a2ab5a15618439556cd17b525747563668575241b312eb041e5a6281bbd50a469baa6695aef3c49dcddb370e84bd2c3b96741e0ed98a635793e127e39a7bbe523d1201d9192ba86b12c507222c1faf1b43c96d20d4d9f192f5cd6b037b5a14e0c61cfdaee64c734eda70b98754dd3b456e172aaf888404bcd6f5764ad50188dda52e0191f84ae7e7c1c9da4eecf4ccc8319262db905d2dd3d83513167df3d954f16abf2b1617e1d892dfc86cb0b094ec394aa0dfd116249bbf2501a233ac49ce018ca69d9786d74bc7803398c3f3da8f0fbffff07a93871ff31b3183e763880f1d02809f2aa154e4de5babbbbbf327775dddd51dad486bac399bc010a4dce38c613b4d7c873e231979c7339fb8a9c6b807b8a6ec68568863f240b3c22804b3fc25d8e9110120bd5cbb22cf051a1e74be5e260578b1a2e390f20353e1f6a5a0e3d31fd71a9e1f86a2572878b09990e421ca772aa7012be392315486a6edf308cccc28f5d7b11c24c04754dd3b456db8dfe4c69da9a73ed6d4a01870548c4ed2b4b81846e2c2817011293a1251e2a28c1291cdf69e9027979b1c002a6aabc843327a6863072b050a541484cee7bafffffbfc592da506231c396b1fdcf455c2c21d6f7c7ffff4bd586ae2c59d86226f4768bec90bdff77cef67df6ff3f91d30af78f23870b2c2813af131352319c4ccc3418d00f6ac3d153b11775cc49372d5efbff1faaa7dad0f53f258aca12ce662a8d148b7b2229ddcb960fb4a70713a90373f9a3c31217d6168a727499c9bf2db243f62ec19255cdc98f1b164d0e55839772efeeeece046282eeb2f0063b2efdb91839dfc5762ab10b2348a49294bd6111d4feff591cfaea96b87f16f7b6bcb9d76587fbdd16d9217b0379fbe629500b244e35f6c46bf250668d17ca84d5549007cf0c620da927664a45c5c498094db92eeab293da50a60697a35c937dd1403d30a2c95ab9429f3177777fe2d020de0ece5d07c7dbb10b2f554b720160cd71a5ca053b7ac1c35681a04dddb0c7682595a269cb8972254105528552c512638cb10c556a43b32ec870b13de1050f2cab019c333c983051e49ed49e12321e132dff257acb862ae0726f2184f812a113d18a70dff7028c159d158a4f9fae699ad6dfbabb6b38faca1a90743a3703022ff38046ca8f02105e17332e24c0709ed29b26560c1b062059aef09e90ca1a48a7412385b654e61cb3a90ded0959882e8257a2a71eeeeddbba938100b5d1ef02563186bc7c5d264e583b4ca798984a960ad70abbd25b11aeb09088acfffeff6f74531b3a9ca199603cbac8ef30c678c53cbb1501bfe1ffffff65403b4c9cbbfffffff39a688a71041fbac08e6cd0c8613ada2d8b766f30c68b51bd0dee9bc52ddfccddddfdffffbf8543e615b1059e51cb5ab51dde1050132117032497b30f8497339397736edfdea5a604ea9aa669edbf09f890a070eddc8c50fa13914e67bc00cde94006862b8651a725dd35e15ce10c52ec43e0e0d813d4c5b3343573e46a26b1582e00800103c63b76777777777726d68b73777763179e6f4ed7344d6b59f096f1ff3f18abdad0ffff3bea8dd6a8e5683684604415f6b4c23b7992256f2042ce1db24576c8deb8cd09187122e686ca84f3240d01b414f38edddd5d47e842d586ae3b04b7adebce96397bf3d86efcce582623fc66b37f6b04fd54920fffff2874a90d6ddd219e806246840794c19cdc54a60e57b84346b85efe8edd867377770d31b272765dce39e730a53614ca4aab42ce97ae75952e6eb1201bae7675510090a3dc314de3e5fcff2429d4a8e24b0030b0c90df560bc52e8b45684404ea2bb3b3a44a48ab9618189d776dd4c6a43698e147449bc7d3ea76b9aa6758bc291b91851d6ab69395dd334ad5ba6627adc206959693c577a8648b046a9a4ec0704c285804a0471f026f379551bbab668c9ef77c4edffbfd007c618e35d32b5a13bcc23a69fb083facf6b18ee7d3b8aabcad5490c9966b12cbb228b2171a8508e185258a20d662119ca1b5e10118715565ecb1e3632b629b3eeca16d9217bbb3bc4fe72f0b8df7843fca1c0f0d89989eabaaab9d1af02a4615166c8492474741d44309402705e155328195f903269703915538106fc5ca39f124b3b55e98b2c23959ac164b9538011959a535fb024b026251fc9a8e60eabe707301528501d7eb11e3d2bc40ff21f42d442957b1bb3b02bbeca818b948c871d10522f3c3c87cdccd06d4654d452fa16e56154e20d2183a4d19195ab9a11e576f866b3d47d79289d5878a76b9aa675ba5399485aafa6c5388e295d664e0153b6631908656a4397ef0410cefdffffefeeeebc181404dd1418ac1d3f2e321b93db053b4442cedd3d7b8e10063067dec8feffd779551bbab6de1aa9681d00e5f961ebd9f4d3c2b1586c662c4a5fccf9ffdfc65042548072046e3c6c531bea56180e6b9aa66b9aa6b5abb7cc047d7158b06696d70e0d20bf6221a000db58d1dda96df0f6ffcf8289591c61164c18e7f5dddddd8780efff0f2cc1c053740c9e70365f24b158ebfba7218ca90d452a9718438817e314d57d4bf41cd59195410717dbcbb043d8812e660d143835323332706c8273102e1c17aa96052d0b5b215c2f595320356cd1f543427610c311c385555a044663c47292ebe1c046c9e4050e1408a02ea64c4c5a41c4d3b7c595f6c02173775fc195916c46f66a464821ce7fa89009e490a76b9aa6352e518fceae594aa146516dffff4b8072ce1f5a41aea50be4654bf63284a24524849a168224a3ce4c521353cfad4ea85c5074a2186c512abcaeb977777757dbbdbeffffbf06452cc63a5dd334ad5be016638cf1d532b5a1aff34995a5e18a4b0316ab959bcdba9a807acb9cd67fb7008726b5a1c7e4ce041ca68ba4608c31c6ef40e7017964433b4caf6b9aa6f5530db70bfda1d16313c6e1c331448a2474d5f2b2697824e717230f825eb0230510e630a810139276a8642c9f37e7046a01d31904184104511ccb2341761a00148008118e9cc0846cd430140986e1a0380c0685c24000180006830181300c0931100b53590a5b580725011bf41843e75abbabb6c695f9c0bccf6c3a1b690310c82e6202a01bb28aa43c4accdf2aa4c6e5b0ed5d07533947bde54a837d3c8d83371082d0eef408bd1211553f202b7894468e5c6a53cf5c5fe98406346e9c90bc57cfa0831fd2892b8b4b2138d5dfbe1be17d56fb60d8bb438c3d14b2e3b1fca45a81225b54d15be458f2747867a949abe10e7ee1c900a0f22a6a0b066301f120b08d56f8a186d65aae239e30537e7de0377e34459e9ad5a9f4943cdceae3144b0dba67df4d5bdbf8d9d10e5dcb1fa60fdbc248733172a8bfb0545fab78169d0006d2440a26803809effbf1bd3fa77514ca62505460b40294724b6bf38884a236024db745f4ecce24126989fc407d22b6596ac89f3cd4e9e2b4ad7c1ab887ebdd0392780bc2d57f1cbe6a9d6bdd827336c0ed183e4a1e3c3949f26006399bb16fcc43f1c63568a1d35e145d0b447fc898d77397973f6c2a1341630775eba94bc2dc8a26841005ef28a43b0202a7b562526f5a2f27f0628d692dc5006f4191303e6bf4ad8506a5e0e9a6a89e3c5a7e2682dad48289f0bd8aa829edf5b2f42967394e0b89290872f7bea044d8056b6858cf4bb2250fea4128d0642276e7b20c6d66d57f1c5fb13b59ced22d70bd550f29413843916094249a5ef954361ce833d0d1faac68e5358ed95b5fab3dc7b9a2b62246bf04ed41b2e8aa186c053e7e20ff2b0039f82a066c531543d713e43d5b500988744cf82b2074f53fa00bdfec6a8cabfc0d5dbe5c743e46812dce9d51b8f67189e21a764d9e85078baea8b0383f6761e24a17873a7789cfa2f3cb29cdef874efd6df9a58b7027a53a8ef4db6e44bd2b4552977d88d666f37d3024ee5703ff4a423e2ec355e29b453527070314cd6de32749d9496654899d28c57df488b00b3d4b9bc15a043509ce826d9934fe6bda008b970c316aadc6d02ce079a8f1236d722e6302897162b4477e3f0979b9c38b5ead4ec3af11b347afd6dfa2032c08927acc51be3402634ad56650a3b8ac1db700eb3260ab8ee8275c4c08ffb1c4302f9f70a2841594f98607c0f3d2c27095285201123450047a214e9ffb016f00702c45bedeaef5323cc7a7218e3505d87c6197f49ae683c9aba20f81bef00f87f44cd69e934eee46b7f10a674c4151c347064643890f69c7c94c38bb9b47ea277801e1a0e5915f179dc722732498ec6fafa4058da423261a6db5c47f62363eddcdeb89ae0e18a38f1a6defdc0aaaf0a2bd050c1f6ea53021b7a9c003af56f3be4234ddfba33e90467c55041da65bdd701afe91d1f64b570f4fa2dbef767c2c8773c8014e0d014b23765064278af486db9d79c1d7685b42af499b9ed6c70b0e30aa07e18bc3e99fc76946d0c18b968186ee45c4a99557ecbc86c2e52bc48a15fd73fd571547d85eb47fbe6feb5cd04f5a8e6b7045523093d3e2d109a78ad7adaf909b41687d8b71da5d206d11d63dd3f08644d0a08e8d2d3c473040a882420fbc0472cb63a845f289e306af0147933e9f5bb3e36bd159e53e9e4ff12a1264a2ec7608fb546d2cc1b189a6c22b07a0d5d4aa9adec3665b1334721d41cc7bbecf0553cdfd7394bc95e73f18aa0957a6f70acf34424bf957e078d324cd47a70e0659ef532a367dfafb926a03bbd86570d3856352722de5b3b6afa5f9566f78164d316c1f8c4735d3845d8d648023b3a867bcc3a3a8c11c0f38e9be054197708dfc39685ebdcc174374fafa458c05e07bd3808cb692519744268e89297c7adc92702d6defee1e823620bce2d58d533b8028c353b8c29247822b88315415d7967c6fb7be49874b618149dc0893d742cc509018ace4aff1fd652d19659c7cc2417b68454f1552a24ade714641456139443054d40f7b7cbdf52c2d59befe9706e899b5124e4cc7edb0c4bc35a9c06874ce8fbd4ad826d7c3ef99f08eada6461187dbf8855cc1e644aeef660d38139749e537684b2c2c28512a1da1e9fb8e6621078b07b1e4da7fee1c6621db03a85156a6d6d95727def3964cd18abfc1ae58cd789cf9504a7212d275c1ae97d4d318fdc26fab43f2364a486d2db69d807e69d3ce3bbc1177d9f162ead3bf326a78a2d15f44868659f8342a6e2b87b681953a7db353d9cc4a7aa55a71e2fd31ffecde2ecc51339096798fff03bd23972235b73de210e8934d531ad36d3f7e2b060e50aa51c69574459f62c5bb142b9cc8a4641830588a639a9cc63848be9a30d7a1c27fe83c25238dc6d8b57e13082115d3bd408e4c9bcaefffd0a7c4fe09b34da543931b0470a5f297230a2794a60d998cdf9a1e10146de6eaeed531a6c71a459cb158e87d22cf721b10e8a084338e1163d241dd781bb4919fe9f658b8d55e24bc4dee11502948e0f5d063b38478eb8ec5c8a9ca7dc7e133c9ad139622fa31ed436678129a0fc5bcac1a6b57e215094f07cd0e0faae6553424308b90b9d3c90c4b154c733f49bf06e6be8329c87fcffd61bbaa79e5702e790876c1683c16c220360cb14ea5d1d2a3be7915529319d1ad0d245f0513b7908ed6c11422ddf84694a071b4439434cd92d3ad6c99173d445bcb84efc70081c22b0a41b18fd41d5a43ec2d669fca9605cf6a43b0b6d6bfe7343eb5a013083ee73175a91da640420404bc20ec91e3fac69ef452a7234c21c0b3e0e43130e5796f76545ea3aacba3a8f20561e80d1ea34f0bfbe62bbdd80c11269053e45be362dbec787e56877449b9b3f3694c8b06c47168ad346152941ca00b4bd8527460ebd564435fe7533c71b711451e6874b2e42a431e14a3bd7073b6b5b282a118e939705bf3f56ad5413cd9f0da4b442dc6fc5e81688295f25fc5bcb082f25582443965bc4cb2e7741fa3234d3d26a569f2cf2fa7fc0db411c526730d6ba76fb15f749dd274c820ce60ec9316ba198058f1c2352d9679f9c289268c208702d9a67d2d888bdaff517ec88561414d8ae9309e4124cc1b345a2bc88d5bfc63bd7200303d4c8ff877967cc1b0eb969b4912c953084485c4c42c84bb29a813310e0a128ae8c26f35db338dc49e5ed3388f2139c958df0a78109163e13fc6072b18324c6be387f4ae62f4b3b72d5363d82078c7c88f1bd769576bb4477472f0f44c51537edac54887193f014ddd3c78cbceabe1ca81af069b09dba06d434edbe3636d399d243123750ab9ed755243d3379be320352a9ea6c5a97e54da78c4309f4dd067f44615885622b84646402eca7010ef05ef0289874bd92bdf25b9a4f6273e3dc1fbb03cec26b8aabe2e42e6ee3392dc8fba25c9a429f2c77af059595bd1937a413f8f0c233601623762c275d904ac10aaa9e34cdb84a531d7c86e6820a51415351e005cc52fb84615ff7cefdbd77809ffbf1e944a3c434905dee7a6be8a44ba045edf4ea12e789ab5e7aea8437c51888ceb07c44d14a9c8a5b133c0ce3c883c313a1b57406d89d9bcf35112c4da0f0b73468be26ad098840a5501df927f19fd9dd226cae1290ce14d513eff74ef09f0a46c91d5a9780cc68676d06ca2cb699b17acdaf383803bbef79610cc4950fe7b8ea42b4b7f677146d31ec03221ab272f79d9a1721612621fca2515a2b9827a9a9790a58b152d8490a464183080844639072892d0f8b6a90a2d8a050e138e542014d7ccba5a8bfd7cde6aecd32f2e4aeb961228795375925698d3a048416bdba7f6a579f8995817e2670fa8a5b68e7512c5ee5f16d6fdab8757db719fb4228f1ba0ad5181965a6f26f88704cd3a0a8ebaa6f290a027868c2a3d6873dbdc710278143857718cea244176106791140b027a625da5b1dfaba02ee030f25b0722a95aa74ec1b46486f17a57dd6a6d2aa7117de1a3179ec4054091140a08cdc7c1bc709894f9d1ee24b5088c659eab6931e36ec47c39a4c78bdfe2642d759c19d2b78b2d00360ca37b7b37708fc64bd083e27423e5c529d728a9f5e294143e66d7471aa11d7d1cb6375c93e255021920da05dac2dac96fb593f1eada1265e45a9da02b388f7982ce215f8bf8ec778cceff7f82996c89767500cc9e91b02b428d41c627fdefd7b12733129d37e567de3e3eb5cf1f9f88181e1941023d0339b20c99ef09fbd712c622f0d9e30c8c6e36e5f55a3c72f2528558a1b987309cafb9a800d1ed6558caec2bf77c019f8997f3682605f7ef549873cc460a1cfd83689f613e2318dca362483c61506d937f133f4b80318d229e1435c3407d2696de752a58db87e929fd7c20a188f0122759bfb66b2a73446cc834285bb9dbb453bc4e012409bb79382e11814f179b8986c704c29990dc6d6afe19b3081f05039c24851d89af1ff04c5ed97eb187000cd622deda400d2f7edf6ccf3eeb7d0437f4559e9a6a4b8f47765f97cb1133f2d0bd16d209093ee11a42806e636f3ef239ff995ad949c6649b02d7d4d7abdf58ca529901cb9a8ec0c020d1b2134e4319d367c35353cc4a9c0590295a5a9af3049c34102c69ef0cba4900956fe372030a82a73c6370f3bff6896a686231edd88dd703ee24aae65a4f957140c5f8f831bd08d626c8a6d4e2bf4c094176384a2bb74b81702d01108bba6e1de127a4f5dd023511976820b706b751f56bc6ff2c848fc0611bcf8e09b9786c935040bbc0f2e71d1a0b37b32b10727a10db458018d22dd9b2cbd08599720407cf6d776e6a41f9b6ed6ba884f7eb13be089cbbb99219ca1730a18d88984c89e6f56ab269815a078a715a1b5c6393bc70991788dd60f38b6b8954b40f36c2ef0f1c086a8d14a8015f2e118c916de3cfa736a5eefcc5268f48290f6c28b341152744fca9413f1d7972b2b5f96c72440eef835ba491fedfa1729ba1b010aafb39846fe78993ed06413560db0c662da84c212877f48fa312e625380bac82c60195a61bb5565802449846f9a686869a788abc1f7f350744ac46b52ff2e62a2601d8793fce3541b4f696548eaf80d25accc646d53027d938ab8060deceef169e5bff163ed06a67e9f84a3667b5b8f78b2f5b6d56a043a4d2097e202e2ba5a9e1a9cb9341715ebfbb6ee904b64f7170b85067d14301bcc7e4a328216faf35d3584437cb0f9875da15d1e7e8be622783a4a40b2c4e2e8a6b103165f6487ea191b8a38653fca638303d88a319b7ceee718ee2de2ddfd355888015d392675bd90069c522967cea9d5bbd4fc3aa1729e6f1e944254c2a60cd161942c91dfc7ae984cb210f854f4059f10516ec40284738930aee63cbb3e34879b12994698a73b9b6c65f71b0069caf6d60e969c23003546df85d7beff32c3523c1df23efd9ce6a0544a74ad66b2bf701b85f964bffb3a67cc5a2bb430cee1e80489fef82c91dab8caa7a11823f3359a1bcb14e7b2c4bce7bd594bc6c1d2143f5c1ec8dbcceba50d39997b2a6206249a322b586879018b3d2df6c85cda3ad9d836d5514af30cdc4a667bb12773f74350156564a66c715377ad530dfefbd99b7aab8a8d339768187bb29bfab513bb528a34c41b035fc66c096aeb37bcca027958632ac112863ad56f809fb8a732c980042992b127c6a04e321ea5a05e1ce3e101bd75c5f877e49fec6b012d8367f28e51bda5f49e8b107e098007b87df4acbb3bcd59087091284798df4a5cf69d0d09564c6f7da5db39a25f7dc6dc45cd1add6980f4ac9dcdc326ef1ffa92ac9969e3e309a82d7912712f7d8ece23964007297ab85c283f8749b4683c90f37a440ca258738718217ad387846e0ff40b7ee71e7b6435e31f7e8d2e635c585b53f342b18c7f059e99599c3c46be53a0cc314012e96d67ffbc8adb1e10583128031f4e829f6645455345d898bb261a6a7fb2b5016928ad50ef4cca8e995173db0c19907f6873b15fa62e54e23763152f244cc36ef174983e58a45fd8470de1efe3351cd6523e366fc29da59ee90e03e84e7c80aba6b7505c7f55521e0fc1a61e4647a2fe424faf6b1f77c095bd7e7bb3f3002de380e1dc47ae846e1fbec84c3532bd698823cf717d20be6b9119b0009b4555ec593e38cfd27867f40b390cc9545f008afb316f2ae3ea79939860843835f324f5b83eeb3db7d52ae7447bdb607d1838e595a772b238c719ec229962144720ed4fb81e8dc1a3f3c38b5a05ba9be19eb2be938e5d705e7b1254e7ad17b4d29c78b0bcea71d8ce7e5ab00a589d1207c846ee6ad03c54934719acea9c4c30508dddea44155ef0ae175ee40a686faf766e2326e1d7583d9ff560c1d25e2c2a7a6704c439f4626bd98f56314e9a4837ac1363d89535af62f6827f477aa5c9bc8ee31fe3fdb23675bcda0f99e384afc05ef00035718660aa7b14ea05d4942ee1fd8453c1a7b28074cce28bf7d4dd4aed34ad0661203a23451611f6a10def3e26837ca13280dd16cc7be69cee57c88485362aa588c658be924698d453e8ff5263a7be2b5c373dff47881342ff713f76e8dc273394bdd64f5082b2034f8f9f88d9fef98274b9a36d408ba1d421724e169d2f937a13a310bb8054932f70711fe7c029eeab352f0d18b32104924eab6fb941d746c9049d3b6b9b34fdadd076e35056da2439a6b289667e1dbead1a0c41e1aec5cb714822ff93e169c3749d6eb458516a323508f5ded92cf5a7159e3585c361082ad0e32d1a5e6b9646fda2ef33a0a7af39692b01d838f93dd62b21e0a036f7488567c17628517d179e1c28a4acfc304f0169b0d649785ceec633ff797802cc956fc1931047657914337cf98f60dc2920904996989753ab1dbd02deb88abffe1ec2aaabf5e7772334b69610347380ec2c1f38a16e83622f6763047b7de1c78e85f78b46f16369fb09d57d60038cd633fe82045f80fd8a09949438d1813a0d162477b96ea79cdeaca2a3d21428f0410c082d11856fe7d43c422ed31c1913c3452411368aaaf5370a6d19408605487ad0b782a9ea5bfbb0b76a628ad3cdbf6005defd1a2fe41755efa84654e97e7a9614d11d2f1cc874b579df335ba8645473778c4f2b498a801287ac035cbbf20f0e3f063a0161d2a0197e6e0f09f42151bd7d665561b1924a3657f9a27ebaea480551ea1ec693c8a77f5921009c274c8db5e63e59635a26d2cf8073c78d6f1d2f86d41eb28f0a1c21291a049950d3923520d9e3bb71975295ec25ff097fe8a27ba461c7e7165b1ebb07c5aad5e90976fab066ce8537b3ac3301325ffc95e65695d219681df4e6f7a184685c20929d88178c18b4620b72e66ece90d0cb0d2266e809692a4b91aa1f7a689137f49b538e18d7fe36ac45fd17f63ed0c893452a7c8280e8f7857d8e4b3fa5c1d98738335419be7f632afe03ed3accf9a11c838d9c5081250a0b3c20a2c66e7169c1b8a4231e2b849f9a3b88f43da143193e5b43bb285239face11a4435c482166fa93684b57c5b3f2f0a5775b51514babf0001996ba3041c6d920e944d5ced3ee23a451c6647cb922a4726802147b974eb1d41b6deb22ba3d95474612661a5522de0ad02edcfe39ad6612e92482cb80f36426a18d1c7b8b83817626e6e5102182336c01a0a8fb9d669386c242bd0c1cd00c01395a0ba78b5e59c09e83daf91dcd16a28253a4dd10025215173b022a643b91018ed5f3fb597bd8139f708294713e06db14a73aa973bda689cc98233a2edc7fccb13011016f6f4e73eb0f31d035d8ae3b54535416641ad49dd1c6b82426ee70752577d014187189f36983be2a8b2bf7381ee6ef4ee33267dbc03a8dd15138d87d0fa588823fecfecfa835c094fbb7b265dbe0671faec6e70db963d75419f5467d51761509a30b978b64cff4b089686851fc451750884610ce45f86f32d61852febf9b3256676f4604cf9cfd21c4f221fd49bb416e9414bb28054d91f88e110c9330cc38515355431b0bbd20000a24938a0361b5c5902c168e9c8e26b603ab291025422406953c5ae828b4cee1ea6f21db6b243a13e2640e8d04cffe0ef838e27c155fbcc8f99e2671f7f10be83d62fcc02bb29dda51ca9173a100273ffaaf9b8c48e721a294218bba84932f305f0d70b45e606659a4d7ec269bd60530cc96af66a699843600caa28cbd6b9cdb444f376529ee9f2701fff96e7d0e5de1cf2f61c86f086a4f7b9328609f06426c1870e001b89012b4e0e2231f0a2d456d2d5eb9844dfc145c7d60248fbae54927b1106f0e28911664ac12e0eed7d2b1e8e52c958587e85ff7923c62499a8e260081a85e09f0c263387cb0c49918db6a0a2eef86fb4925b47ddd1e36a2992d107ea4589ae0861229949a28b7eaa19fa2f0cc1c723f17ca4e91d884c6434023a197f06316ae9e0d2a3cf7db43cc1a9f2b2c7bfe8b2db40d3d79c7afc987da7f5e4cb06173fded45150cb65bd38db071509884a5c969efafd4f5ca02684dc663b7e41ce37cbf8757c0f5edbbdc965d67f529252929debbd0c8b4848fb241b49689c0f17c31230fdfec3015b2ef86d46f8a214da64963d60ef04b3e4f134022d99ca1473ca24ecd3e89014ac84b66533d4b83996ccab15a000706e7beff30cb8a5e19123b1a70d3e1ad02f2bbf1562eef53001a0b608b4f605eef2673352594a16f050afddf2066df2a280e9faffb60aa65b76b1409890826b6d5f5162f7c98b520a4fe8afc458a79da2e82348a9f2c875393d05dd25046c5f8b4723159bc87231603c65f681d0bf7c534caabb1219111381e0e561a4a250bd9ebd27c95a3a2eae03ea82d02d2ff8493fb4d7320d27a2f6624dab3ce7ec33d75a19e652b8746f85cfb2a8eeb616895decadc7b5b4ade65d19900825ea1d7d8798520f20d504ee274385430c4e5d677d8167edc397d3d2c8019ff2c9c4124bc5dac42edfa4314be532db7f5a2f2b3fc5d95c299e4218dc7a609922f823022aa582b65de1bfcfca8ea1fcb381054c6feb3de1e005b27465e7524d565d377317beb99d5c36f5d8fadf0d4141737c49bf8d66255c65198568716e6817d6a3cd36235bd587296427dc98de67ade3e8bbe5f7a2814ab4077daa919be6d107c5dda2292fd57a55a590e8541cb22cd8370d381512a34d97d6e8cb35470cc0ad2b8985aca9d1410861c62861708b07fb524ff46891364e729e21084cd757eb4521a8e52b68515ae3ceed9f9fcf27152bc044817064bf3959c1863b60327e8c78281a7f380ee76ed3a6f78b5864b73645b94dfe62f3e73206b91e387dc0af96705eb61d641f09df2c93cc2d8d0307e46567c644c26b8192b0eb12473f75743a42a2bad6d7f87aaf9d0387575a94c9fd7e3a79636886e60c0d8430b4957ec5156d26c27619dd903d33b62cfbc0db81c67edcd15dfb847fc74a40de540296ad68b1bd66445dd6eb1a7ab449d8d3483609f1b4fe7faf6607b4d62661283b4684dc8450f5f141822ec15e3c40b65285c4a82f19f71be7547f2c6d0246abc36c33d0365cc2ae2735b7b540467c43e49203916da0f4bb0ea313256f1d8412fec6e8df3688147ed5002f20ab0863cbbb5f255014cffbb29e1108bea7cd588573abda17252e52a6de380fa8c5661c7a0391fcf2f187989623341898d50416d2ee94736c159d948e3732eb1be3af432aa6a6539560e23a8a93ee66f8c0f5064d2bf24ee1e8ebd5441a2986ecc21e93d48fef5e725e4de3e3474cd23d298b0208cb9b6035c4cc25403cbaa8d596ff4288d69c16456de5b3809016c51da0abb00923ba01f3ee3b15568d2ae645982cca5a2cf85c7bb0ad9f8c98b123ff526e49cb8a85ad6e7323198219e04d9a5f02a2fc17cc64dcd6bb15e2b47243a7b15c47880fda68a67524d414ea3579e05b1650347399b9079a8bc4f65d73854a2f68a687ed5af102545d5fedf217046df4eacd77b80463fbbf4d33cdda2197d754328771e97ab289fe22ed2057d2fe32db153dd52a51f393ba50478569159d39a9e87f457e737ac4b4f733ae9b5aeb8b83659cec8134580f44075c120b1d6856b8f89a1304c0b49a4ee4609284b9154d0821ee0a67fd25141791a99eb9427e3ca7d7372a49076e410afbb5639460a512e9fb3a61fe9aeb81bf013ecad08e904c8fd41891042ce0540529b119d20c1af5b71d8b8e934978cad61fff9abbcbfd959a5cb285426bb09768a8bedb3c7ac75382a7213621b68a32627d5c0793eb149656a50c9af1956c6fbb0ae6482686a2c3e8d480bc9295921a36496f30203db7a74c2ef91a5e95e8eec38e1a3841527322e88a519f1af8353418386b01574a522d4aa0978ed013cbd52143df005411a7c2a6bbbb14b60de0923a5705c818dd735a1fe3bb9d81b86c9831393a0fe100b68807e8ca5f2027d5cef953ee0f45834c18763b7d353382c6a973bc68de5279996b29204cc226de3ed14891e691cd20bdde9843939040ed944217c60c535142e25374730be0218495ab7d96208821302ee84002611045cb969b40d280e4432be9ee99ee4ca28a7c5f4d29ad022cf38c865d450274c52a48dd4b0a66410dd0f56e421d02bff8cbf979d54647e5f03aff10500a63e520c884429c8306f3c5bedf564acc1c34a9df391c958f44c94493aae1eeed0d677cf5a65dd730cd10055676613f52c5e247f2725da314e8d608f6e716cbfb20d682418a15a952dfe9643175375f47f694e7ba32652275c3dada63348ec91e1924186d133b51daa796b824670c459bbe2dde87944bd4490e0eacf2d9599083c26b68e35285140ebb9801f4494794b6a66ca58b39c64c167ebf1084b4507c1122c1563cd99a63adff988bcf4f672eff6339c107cf9c1da37e4b6684586a66c515b8cce572c29a0f66049e0f0d000bb8c918f8627d45a574135d8e5884dafb81f42ca387192d1fd24064f72977cbba604c34fefc5477260d8f6fa9436c90768d532570851c8387fe91b0e67265a2e2df1a3767700559c3412e9615613c322ee9ee0f18f39cf4ede2ac2cda7bfec43244dc05d87a1287093936b667992ca79b15bfce688e8d5d2c2765677eff841efd088cb8ffc6729a8a069430d60791b875ff38121db9f4ec558987d9ba704b83aedafdf86d1ba110bbbd3b720abde9cfe3c13b8e51b2033c691552b69d59b4af0d52eb627d15e553f39813a1eb26aa8f4070a670fbc31a2a519fa1075f26d7327774de8baab7f3fbc736851a36aeb95bd51319fbdf6e51a218261b9ba5dc3f1bfc19c0b5d062cd7bd28d7cbc646affd1efd35396de383b5062ac6ff92e243cb07d7eb7b8e91c83f1ac91662c1a2f25ec378dff01d56f5ab33eb4fb49df78f1763b2ccc417a5439b78539b2cb00f8b39e83c8346fcf264ca57dbc1ac44b238579661982b1802aca017ef507189bf0db484206a4f8253b2683756cb2aed559f6422eef23692f76a4e4185a825c99cd53067b09440d9fcffe9d1115adbe0579c910fab65b6aecf2d6549399a8601dfde11fe0090001eb6f86ff2f4c1a52ed8a5f35da14d9a6a11e4210c62e270af236865552e345906a2a312d2962039b8bde3c82a246065e32c6927d5df3678b9bf6ebecb1d007fd7f310c94af484cc6bbbc12db61d6a3a9931f28e022395b12b1982e03a55fb30b9c64444271d2448f259e3a9a06c6b788ab17bb1a8a24a70bc82acf4f2443c3ba4789a6f4bde5d045749f5c3f5d10988a830e7d742416d655358d634cde270057814375245a4f788460d86c916c922adc108a6656ae387149728f48b7f7bc5f3491fec8ce1983ee9198a12938bc47377b18b1c7722d665dbd961c4af4f304026b0205378a69e8bca8c6931cf82cc704e6b7c76f9b4c661dab52d99ccb3316551e2c27aca2023a42a6f4ed00a89aa9d3751afd085a6bd8bf6decee64dc40ad2999bc53ea1fcee3ce2b3ff8e0ba80fa63ce5e510ce6c7582eaf9c366959346a748d9c4bff50e14a73744eb44557ffe4136ba943595fdc3d529455906a9a6c5d52606b670b7f73e231be17f3b85d295b0b5d7d5be4452fb17f26fdf1aeb4b91fcefdc3c345200a92c560bff0530bd895bb29fc019f8907678b6740df3eb78432f0734922644e016ae408335970ce99cd01abf596b3b4dceb501c37c8d9437cd3527608bf4911cf39502badd3550d8d75f952238b9a4103f8b80cb66542e36276a17232a97531a37165fd68fb497eda574ad86376f99ca4e8b6db53f551c63950924c22e8931b0317032303fbc6bcce54da460708841bc419801d1c836130ec1b319a0e5b6497f209d4e25624214db5cbf50086058b159022738d96ece6801a66888881a5c2c60f9c222acf11151ff4de2d7b3b0bae6602221b0ad1ecb616290a9d32b94d1663fd33b225c3311806c33fa57cc52225d72b5b73d7a303c0bd88e377bbffff3d9d75a602114f7ac6b7897d99e2dc4018901cb252497144f393d573aaf458b2b8686ccdeabaa25db12c2e8965710cd4a921bcffff3d3806c360989ddb655414c88009c11245223920a75350790374775729b233f5c5b11e80530070efaebbbb83c0e3b8b7fb4c7bdf7fbbffff3e76a6be33bb024101e2eebe7be2d2cedac1311806c32d7d458444e68669c554c3d87c0ae2bcbbeeee7e543f4ddc57a8e8a13f24a78e3f3c6b2b46bbe5c24c0032842ff05c5cdbd46da3e2fceebabb3bf304d2c4dd1641d08fd76d19f9cdfcfff7dc01587c82304cf4844a0f7c65317125a89fa99998150ad7993a2cba1b84c738f77ad5c0b1afb82496c5f109471931c02144a39448ee4550f209b90d8ec130189e577545d03712a4857699c1bd7083b5630200a51d172e4ab509b77670fa1dedc8f8bc00deb849ba0a3e4f4d7bf55c672a95747bb8ca8add6faa88618ea4e55d4649db8aa287e7262b3a549c0a6094dc5122d6ccb9fc2ae99f2ffeffcff9d899fafe4c6b6b1c4477848e4b62591c1b33e87404487deb0ee78d755dd7759d96eb4c5d727a5249393865bd0636966eea66fee5bddb161e854cab1ea46e0fb860e0800706ba9b5ac1b888cca8a2fa1d9014f45b6ca4b58498459044286236043184310432c472c7bc206f51913774d66a35191f9aa8f58ce2d075b2766c454d313a2d1959521a1f72d41315c047e5f6f29636a6798bd6a849bbbbf75e23e7dc76604edd7b6bad6b77700c86c170ad73616fe26b736b2e3775343696e1c0c5ec2df3f4da718b4b62591cab4f3ae41e4fdd08dc950b91be3148e4e41117325a642aa8135a2d6ec56217c38ab01cbacfefaebbbb07d999aabb80c34a4c56d68daae68938e502a4fe35b548b2ed709bc34eddc2ce4116f8e0f7425013929c9c59719e20a4dae9c72b420e2b4318567c6775068932b38403f393d5db82edcdcc40081f290cb4049dc2e56523919eeb9b0a382948a2163c1d2faff21fe821ab64aafdff03ff69035c96e06856b58c4132f0e2925816c74a50b9fff516bfefeffefffb38ae3335e9c147cd6b7d801e1c905d8e16bd35954b1a6568043006d7992a1cba1b8cc5f8ff75ffbfebb95a2c4368b1440226cfb38ba1360909e9ded879efbd9f88eb4c3522974b4e1c9e9eee74004027e01348059402b382b6e0ec3263ecb0ac29b975a6fa4e527e2bedbe4cffff71be4f7804bf7edf4c0435b4d2d4f164f5e2683d921e55d5c4eeee4deb4c7542a3ca9f245486726944c4f62049214569add5a84827b9448007c760180cbb3cd58aea0a69808cc542c0beb5c8a5eb4a679da9402fca15118e79551bf51616440e1fa61f42104335b30d19aa0972aee68fd1021ee60816a38e1a42445a2011f23de51fc1f4e608a6de4a7347ac2bd4445de6a4abcbaa3d96568b521e5337800cf5094ab121e67c0a8c920622227d4699bed6ba9a54b916a86e3881b42c5e5aa2a9ec8260a336e7703422a77b420485a1783748129febb8b4ce54a74dc2f1b9b72b093d5f4a2e863055519d179843294b4a2f5c36924c4cdd38d3f15dd7758d9ceb4c854647309ad672be1196bf97ae69d8da4445eaa977536e262e896571ec2237e082db7befdd814aea1d6eb26cb377c0a1dd690864d4372562805835eb900709a82b841c34488eb1f093a5031ef1884929ba668c2ba9452d96f9d4fcdb3e67f1f2f97f7bfb23b7a5cec09bd593975f100d39066a1451f4dc829179989bdecd5d5675c80b2b15371f64c83c5d389456aa5ee6d1e70a7614d43c53ea1bc33aca66c2682988e6b7b73b86ddaa73df2f428bd1e274456d45ce7dffbfeffbbeef52e5f53570aef057636e1825ef85c20db1168563a9f66c794b797ebdfe8b2c26fff4f2dd757777a9a4893bed5448183bf3de5d77775f1e6b137777779b33deead2c40cc37cd858dafda613b74518c67bbdfe71300b2a68e4aba39a69d2cd56118a1e95483149bb3d0d2c8f5227659ccdbb41cd4b948b56ef66a5ea28c65d5ab5bb5ae792db21178f709da9c3ed81a7b837dd52b1f81025476364762ee8928dbd7724c82cc5dc6f2b0d2870ea9ba75722def7dfeeffff4951edbacf645ac19b5f284843e7315d4dcf2b9ac9e618ae33b5784cd64d4e10724035189af13cfaaa822fbc8e4712e6d104f3ff3fc3707177ef29ae33f598dc1e7aead87f782eaad0526849c80986f6ff5fd7d6995ae7deda07c76e2f04b4687248d02c259c5c4064f050b93aa1075b9d1c044b4199f6ffdfb4ce54270c280c231a8b552002d1949a117de1598bb4c8b9bbffffbffef5bb921942bf159d043de58a2768a8b8515b054969d081f503e339a328666d42bad1fc549332b7554344e5a28aa142c6755df769baced45acef70b8200257c0d60980cc760180cfbdc32b51878ae38c2d17ab11bc261e3c75542d9e0660801f67e803e5d0b979212ae98a43d2b3a5eb4e85162ed2490c3c4a900a928773f1c49aa77d7dddd956c26eeeef4af1dd66ab5103f13152944f417cb5eb75c0aa755d41695d10fac6ff16500e66c9944de2990829019e464821aa3343782318d26976955babda1b2707c5401cd6062f991e8f8f686465f8a29ba9594cf1107b82ac2d9fb2a6acbe068353319cb7071492c8b63778675aeebba46b575a6e67cbfa070b8c1a898e346dd67b6e598c40530c2cf8d5c8f94ac1043abace4443455730c5bdeca73c9a867f8f80db892a033ad0175849660627c92413c70570b26be13b3a3b52b18e8bd7b7bc3f4e27729b954c330193806c360d8bdb1b9552a7c657777a51839a6aa822750e444cd3d66682b93168169f3c678e712bd1f096d85c6329eeaab71a9a450b1a215e204ef71cd14f40c4d32ba03881ca40864c38545a4428806e909854e29e2f663e8c462b2aa590099c4ad1e740cdd77647677f7119dab6b9bbd9c0d83cd736cb41be3ee5e2cae33f5b847282663eeeeb81e2d94130a0a15859adaa87909d0755dd7755fdedddd9de73d6823c7e33159c3b1bf0da1dddddd91769f010b322a52ca5e8f560e1d8b1e513f9e7622817ebe2cace47e4c3e304b1b3657898dc2c54b0dd4b3d9b3834997b322e3a424e374b1b141a4eb4ccd8245b44b22748a7c54f365905d2eb95c7b634e25794edb8dc7909b09da49b37203a4c930e5bddbfdffb721ae33d58844b1598ec091c84be315909f662fcf1186790b1c836130ccce6c8d9f4c5b95d2612cebb1340d1c49fdffcf927b73efbabb7bd20e6de2eeee8e63cae0012904eb45511409d957ab1c35e8d874661ddafdffffdfd64a0da58a5247a9a4542dd5f4ca6a8d9a8bc6108913126fe404a2a51436c7173249df8b7917c47aeb1e70c129bb2f0b9dd7994adbe8001151a046ac94f77ddff77d71e4ff9bebd331d5a8df6310c42206b248d5937e588b4a544180bcefffff6f84b233f57579f3ebb533bf5e447b4ec0755b3041215b3f4bc3aa96181ff037d79110a808a20e1b90d3b4f63ce58a760b478fbb7b929da9ef4d56232aaf4924901ba7f25a079a6a59030c1f8ddb0c264704c1b0eb60637c9a39a11243a32d428247d22491b28b0bf0e143a29ec9e530d7104a23f075dfffd17a9da94d4e6814253a7d9aebbaaeeb12c170acdf5d7777674a194ddca78cec94100b53fcffefcb5a67aacd65865de8580c6fc9245bf2bec525b12cbe3dd1eb8c4b4d424778d4f33b1ea016cf1792b8ce54e3de8044c67039dcdd5dc6b6ced4f9448616a0ca868595140c5c9128664b8dbbeb0a580a5d2348259732cc700c86c130c9ac0145799499ea2fd8eca98194f4a1e867103d3806c360f8ff77ce96363aa4e7a1aa78a3bdefbfddffff1ba075a612dd931b630c8aa4c630eff0f109f1d1d4f32da6ed157f712915a7b18c753a2e8965716ccca0d3b95c40d999fac210c52c87e411868dccaece15426de88e7b77dddd3d775c676ab26eda1b72ce12999a0064805e76b4ffff1a3b53df58d6e2fe6f3ff35c51c996a736578e4597c755770865a4136a05e3ca852accad33d5e741f8a35d3fa2f2bcf7de1b06baced4e80698692db781f639adc6466536fd5cbcd959119522092bc88d464ce997f7ae616395584422d2dd8363300c86ff7136110cc070a2c080e2581d1ca7e6d1494ac4733d9135ce0a42ad95288c8a1d49a8ab1cab0b35161b76aaf4b6c425b12c8e75b42d7befbd7f4beb4c757a5249fde497e52733360d6eec4f0730c75e51cab4f173a30c520308005096110e5a90bca08d8a548e34c690206d0b63d992cf8d4b62591cdb1aa0919399ad0c729da9cb1d8fa9a844eddde7c6806901d31968040d046124cfd31a63001480050b6688b87c6c0c29168705e2a040140086c240001808060201614020280800c2c3c1c19aae0123b67dfe030157e8175db09e76febe1cc103203d542f555acb36ac63b837027b59fb96f902df068ff0615ba425596211291fb688198548ae5ae1450c0e664e936563eaf6aa252c5e379082fff2a11531005ccd0d4e6856b5e8d0b1f81f26a88893f9d399d29e4ddb4635eda05312a4a6289fecfbe00f808eed5841b6e782a17ffed64872af32ab00cd82b0e51fd3208bc6e290aad429aaad1c15a73dc605ca2ee3bd48ebc285da3566c3f683d0c655d164a3dccb75d08de0de7516edb8bb52a07c70a6fb615485218734a6753d86477ace12411c81bcd59b459e48baaa7708a942de54ece14a1341b2d494b0a22c75b909bba791986d521e01323f525e01e859fc726d6ba9195947eb87c3a23f33e4e48c1f1997a3271d22b8102a6c621c152378d129b745ce285bf5090f3b089b19a51e329893bd2b6ffc8a742a2fa5007818b5a5aa802bb412033a090212bd01d80db6a954a6c6e2676c4a07bb58205e5d33a3130836c55b4e8823db67941fd7bf3e583cfeed7de49f2b2b02096edbed7bf146646a48907ea9307d80f418a958939d2dc1e0ebec775a3a171b257f816811a52b0deaa3a178b0be6ef335dab53c41cc5b6fea9ea2b8d24ff80d68e3008258d7560b9760e3be2e408f7f700811e335d304b090de9fc028e44878110469b9fc2c750f02645074dd7f5b5899af8f1cb22345ab2f205b3fe1af3a19f49d5ddeda723fa58679ae59ef47129e49d5981e9d939ead65f356b1d9805d2074956f5ab4b74a3a09c30b0e3506541b4bb4d884e7605f37cbd5ff0ee0586157012074552b29f8d9272df1ce9e6f46617536accdb43b285e88a33547e2421929a1665b8d4fa2a9969910ef0051035cc15cceabad4192586ea7957f3f3e6dbb2402632919713f3c7921e510c9b87f2657e8e3c2d8a6a32452ad2db6a36205273ae736a24be2d1a5523d4e6d08446105739a9f359c09e5dc95264dd90cabf320eec572fb7c51c14f0033e06aab9a75471b56019cc8cb0509bc3fcbb704e35ea74ebf936b02c12c7b925b1d678c4c05d98b8d374b418c4cf93c4e4eedd2bc5921a19a6711069486661cdf7c8fbd59b107cc0c42ef393c5f0398d6c478feb233cd02019906b595cd70945ac6e2d82a5975a2df8edeff5c468fa817e3fd2de14a91379db9afbd468526620abf865f5cee6158d28531c663bd82d006ba2038521b74029ae1d43ca91258abba45528db2006a33227dddfc28e5ac5a3969c2fe66955ce2863a92fecf3b4a680ec84527c0a73449349b6392814f5a1492161f764f731ebe2634db89610cd85d3a78b04d382072f42f1809fe9825505328b59758023099ac2bcef255a046d1073044afccb2362c6250d08ef2439c78f3acd0912d4991705a0af86c40536e920959daa6e74eaf1435ba0619778ee8a5db16e70c8d8f3cd43e8bf32f76f23153aa3e42962b0b0662fe8f7de0a1c421781e27ec2dcdb1ffe13fb4fe5f39d0ee785101181f388f85468c7d637d13deb4db908d80fbe661e457d959a624b70a9bceca7c4e6414e32950ed38a5e59f58f1c1222753a7792cdda3bcc01ddabcc79c08762a9b03c6985fd171346f1f0a5be71d310b30de5bd14f495705bbe5923c7045fcf410dbb1c6f632b85d48be3c82a3220a6eca09437d00bd4373feba2cf43289b14a1125aca2419959ce97b7a3988d81cff7b5d16823113a6d1416b0c3fcb0103249758fa19dcf3a328884b0b0577219b451a08db02e5f412c229b1925e04175971072a7e0e43928a04426085bfc771a7144731fda477fa340955949579d206f68c28fe89cd833b90da15605c8994643a4fcbc7ff7d375108d5a7c5d0ac96d91265546200624164a08913a38055fc4f876dbf0285a0f4a4d7fa8f3b6e68f5e7dafdc0d8ceacbd74b2cb1dba51e6eaeb2bb99770829de17bae29e91c5e4b9bd00525718616d80d63de3186c9dc8d09bcd1d75504d827d3e2df5e5f840ba5547b079b633e1d0ecd5f05d9d7aec738cfd567ce6d9a20a3f01c6ab2e412a44d360ad41f16c8cd42580319e0ffee46bbe56cec141d88eb2f01b1a8abf16b154d4880ce7e3ae302bc088300a95f13b98096bc2a993d5ea9cd80346364943422546318204231af64738941158054ebc8e96b9bdd02f3980bfb02d64728c86ee4193a3417305aa0a90d22b4d31358af8dd7a2ff850473c2bdd09748ceb6ec6c1e70db76b449bf9d5d327495f814007b756b0c1f99496b8b7ab751d024ee9ff871af05d5735e188c950f826e1724e173a155019315ef7df578da4e06db1d5e0892739a68fb6ae6ef11f47632d3a5218885a5b1eb045d464b6136c014da7f94329115e7630c4087268e8014aa5506f7eb6cc74cd817ed0049b3e58fdc9b9d89f997c61bc3a4df95bdbbe561d22f0b63c2fa5cd62e05e6cfde81c24228e4733009ee67afa1a60b79f7856e6047687c85ec9cae867f8f81dbba3c9fa897a87b9d9bca1ae62043144b2a84409284e8173e900b0853c3598b70162c334882eb935808e60610dfa55486b987a2dc7b918773c07cf487b84fc816d1613a732aacb27d544c633103b46484f85e34050709447840c21e6cd67506c9b5869c31d4ea7496e3c138046c7b4ea86ddd3b8323c6ce099d806a2725662dfc16f1bf3550650952a3d3c2cb5648b6fd9b009594415a501ef09b5f21efc842a5e44705c4f7cc1f099e20129240e681a0679ac30994b4fe6807c63b89207bc7cf479b1bb8ed8d82580612920570a455f54040d3bfc2b60619fd3455f9d58a6b5b8dd6e51d1f026400498e0783a08022f16b588fda26bcf459f06b512f93e4267d5042de3b2ffeaf175bdf4e20820a4084e8412886047050715401f20b2308931cd169e082b7672b7a5f5eb4e1de00a54a0ffb626a80a9ff8636f119330710c98b7cab179c5b6821d11ccb257ce59c433e8c5445842606cfd3a9aea1601ea192efd61e8cfe07413d0960fc79a732b3761b6764e9f277b81262d8c0d43bba3bdbcf47ca7d4d6788f3a5427c2ea064827dcb6b47aef1cac7f870ea9c421e01dd1368e777e7a98f90a068799f0eb7071de8fa1832aaf8d2b748745f9c86843fa209dd6db580804db250a3e7c9b51b29f7ecb2bf2311f05656b47d622f5cfba6ad2b3e9d2454aa7e37c9e851eedd493b0ba92754a381b21ad12eee0dc6d4b155c1f8f9fb6f19c307aa482cec2a53e1ed5e04aa6756f26588684b50beebaaebd97425c6e2ed6d3b84a0b5586242bb003810415d251c10215dce16d007383181375f9546069813aad249b278c307b4fe5ab365769a86e972e1e7c7aedc76a493032be0bbe7fe51d6b545d031c6a94fb6a96e0c677d0e64588b47e298e26bc394d9e134725585d1e55f3972d46b8bd142ace0484a6852041a9232714c65eaface05b3325153a1ad108cae512dbef4c951475d1b4e172f8ffcc59c6d702efe4c1501a7d51434fdb8f928cf5505f3f581d9dd1bad17b6ce532a821a2124e125c3342a62b709d1a7b2bd5899adaece01677180eb2516c87a60483a68e9141ec824058642069c949ec6433e29d16a1f9dc63322ba7ec8c3c2415e4e94ca66e975b088df76d8a21279c0d875ec19310458400cde80cc7fb4e3cb90a429cf79ecd32679e9abd5a92cfc3b1616d2f9591d6293e368c700e9bd376785a9ae1e6c467cc0f2e3dea9c7693c29b9489ae8d1a446672069c7af7462eb90d96604789adc319635d53d33f41762ccd095d855acc129f94332e127c9b80578a2bb70c04851f811994b850a10211c41141421145db6efb53239a7a23671318744e0143d11648305c8fa45c03d3e4ec32bb771d9d936ea5dd42afcc8a6eeb574e040646002d0255f83031e0003fa5dbc3465064806ca0ba4288d5be2e2159632c5bfb2731679e4254e9265ad0820bed08d6d381a1505a66f78aa75caf5c882f26f6b1dd3c36e1a25c7141f8a5cbbfcfab32bd1c5d086d06b9be1d693cf56fb80af3febcc283ff09f26845c2983286349020f40240337cafb329ce164920cd8bd88ea3fdb17763794485e7542733a52af55beef81858d63c7514facd1c5936639a092268454a5bc2952594cac49a5df9cf31c7ba8588bca1dde222a101d815344c26b59675b55752c26aad569f9763d52d791447d5df5bacce9b995fb008c0d3a010dc785417b3ce0c042d94bf224b1e964cddb91b14d51864c0047b143c564fe2f5a119af9da18e41d9b1db5fdd69ecaa648bb39e60e2b16126090df633bc99509be28bb5c9833e5ada8cee707ccb6eb1935b8e2a6140c4b4ac76d29076dbed3365cc8b2eb74a20ee5720006b04885a910650a2e6371587572d686c8b509ae5ce97e26a8a4c3797292a4c3127d37a2ac2889f4257f5d54da0a3a5c7affed9a4a78c2cc67bcaeed300348ca5ce9411c7b5a83f30d7b4779d4e70a7d454b3578ba3989bfe9003de0bde3c272f379208990b3d1610702c6fe126dd39fcc282648d384b3b6ba2fea61a4409f1fc20d572b37b96baa8b4a81a8443149f94db8071c8a2d8adb482d2acc27042989d5081264b8cb40ab0457c53bc8ece54f12aa0d5a5eeea2fba6cde0844fa08ac371100c361b27916ace83c699bbc24a86d74466b141252bf22d3091f745701d12b3375cd779e8a017d61db8bf6b72c2c824cf2f37b9a86099ed4d6ecc8d60bce594ef9f7b572eb7af6b46cfea143097af1a419defe382e75a07d2338af80bda215112e763a3fac5a7a6a511624c0e196e67ab8f87078215bd929d32c2840d59acc32dc589d06980095fa944439cd9fd8bb74890a2f11fb215b105c6dada74a0b90b96b2e4cccabd63e596df19af33ef68a54e0e9dda1b31a4f377c8c02eb0cb56f0bd2d7584ecca117605cbae94b268af5de8143c8a59c2194856548f4df34ee2db914afed6b1dc4bb6ce8d031a22ec1b4a1d4a6e159a631de1575db3f1825bc3c977b70a3ea76497b451e71022824ff0f7ee80e05751a255455f0b1adc4375e526b8c8f2b20e79b8e0d43dae60b9e215d463fed4f4d8c957fcac8e46729d5857447da071a171d70ff1c33286b1e315daf43dbb6ce51403c44e8f92d2ffa4dc2cb1dda536a53047cffef7124213e5f92e1f3e99a6f7354f42070dbf8735ad904094e79da65a5afb1eee23b3c693e7c170f86b814d5d452b97f003d8e69978e4eaeb1842adff62c817aeeeb5bb17ca1e6629f3822a2939760a455687543f07acb403c335f41f4914c8628daff6da43dd7bfefc7acd12f7b5fae062178744c52258b9841d90520d5811f4e9a2bed95278ba63e82220162f04406dbbdbcc5837171a892d86fa51757380ae880082e78ade93551ad4fddfc3cd5106da013a78e55a0c3707a721b4090d68fe3fcc5123d7043dd1b38a6fe7692725af45eae564188826b60424230d3521bd9d96210d1890c337f500e7eb25759e180383ed2a2f55b7eab5b8c1bd307b5a33dd983f246b79623778388674b2cb53562dc1453b0a29d17fe90bf46971164c8af6bf3ff12f5bab6867f2297a6a93a317d1ab5666dfa612ad6464021932d0f054946b587429a55e6421042c4a9de63ab824bc55bd6f7508980204b945f05b3b652f66e7fd053bde4197a814964e0603c2253de620d6718d44a45ed1275957e0c5d0c46b8fdac2ebfe88c97264af97bcfd1e375ede3a6210c4cd1d0c84b04d4070549c89c36aa77cb91cc5590a1eb5ffb416625a002dbb9e5776ee5b150042e1dfaeeb67b81e6fcd13a984ab8eb31861c6987484d3a13372f8b3ab45bf90f4bd8a45e0a1a4461877b94a02a526106173bb9d064119d37b82e04682fa522a64bd5b9c32942a6ab807c41a56e4f60d3da35518cc5791ae19602570c886ec4c2f5950bdadc57aaa1c0c871b238100fba0733e6adf2492ccb5b1a811224ab2dff997b27561b64c8f643edbe54985cfb50d849750ad512df58ea00588ae3a1c2e2cf81984ba8d4c82f5bb302c3394df27a87299f43760ca52518bf63b0a001c44c062dc78bb52d46a41dc2154ace61da57215c15fe20b4a54aa88de434f27a402920b0c6ba202d09410a60419ae35351b932fd40221eeb372302da0b6a1652e5afc0d1126eba43df39884ff81260d2c6aabadcef7777704b9108acd626894001d039bcdc08def0bd271300e6fabd395ab67f79467247505490069325bef69fd049dd3bb5607575b6f403dc4c90fbb0718f320f0915e80f75db45a349b3a58d729f04442808f28cdce520cdf0e3935d9f3140d98c7c9d9f64438739afab17052e12148b974734b54e494fecb2a842e7a3a8dc7f749b99dc039199ba92c032a9a52c9ff09f5d3b3a50c3611457a982b8d37704c49a226853f6f6ecc85a8c6f3380769d80cc9ae39b473dd910fccf021849658dd88add9b70e7c2134e00dce5b3faa088109c5254b906b66cd7e8e54360cae6a9a670fc9bf20fd226f16e041b79a74ecc1b42fd7a46f2d9d5dd4cd1e2d912a8c67c29da3419563ecb33bbe6a82d68e12e5a1c368816260fb91c3c69ab2145950e9dbb61ff7edf3c419e1f5cf469a479611dcd67646b59cef52155c3fac91c55ded4cae1be0e9d606c409f705def241d98e4d0c74511822cb47c8209f2112830f07db3ddf4759410a0057a28a6c228477367fba9642044c317d433f5129411dea5b7bb5d212d1688e9a345865b36d5b7a4c835589855dd3e27963cbeb21f7d4b8b9ff78b886a27ffa33dcb04361e5a6822c45fb337bc4089f95991d2f6edff5954cddbb6d0f489ad9e7f6cff16d99f7d3080ae8fb41dd1fb56ebaa403a2085f7ae6079f4a95b922c36c16643fa2fa9ae0383d419d6645b7f9874e0bcb46b551661a461379a9ab82c92a101085cfaadff8cbc78e40d855da2707dbe4fde4a318efbee93db666bcc7ea715dedc3c85cd3812cca6918f0d9983dac062fc37077904f0d02a6a47b0f561b6a9a9cb1344bca608d6d47b90aac5f63c69d69ed384c1ca68e1d6ed3701bec48d35dda1417b6bee97a6cc7f6447bbe07eb1f22946a2109cab8f4923d54b196170796a1fbef564ba192ed42e74831d6a50c5b8950b4118e4318d8ed225ca923a0836b4be8024f98a821b663528233d02b11ee93baafa9521b63b3657daca84050c6a19f15816923a344e20127269e4a0deed5117f0c97bc46914d1e3d394719e36f301669f43eb77f69cb3c110cc086b151419a38c287170a7cf8905f434cc255a1f918be5df899ff7d50a8d9a1e84c09643a598b771f9bcabdf8d56952b909799e2fa20189755ebdd552c38f03028324a317662d2859e2734b00d604c2d218f83015d326fbe3217b105e612d9d48cc913d804d8749f5da40078cee4948f5eaa84aff9e0c126058166eb42f8f39e9cc7451cd621bfa96700ebb331843440ad7f5d4d651b9b9c89717d03ad9c59cab237e22a9b9ffb7f453fd7ca13c8e3306b303f54fca94917b23501945c4015040e12ec5b0520388aa689865b5e655474fb3f0e34d04046540ea2be48a8750f225c3d5c4e123abf4845d01fbe52efdd17347dfb0d49445063a896b8befd1121d11ae719c5e50edeb49baa59c2c6018fec4d6c0186ce9991466e411b7ab288a278317dd734986882aba3bb50f2fb5ed67b56a7a2925d51a1a019b91e1fa29737a682d76a43e222dabdcd41ccc056489d80e189969b055935adf8b03c1fdcc37fc8ac607849ef09b71f8dc8229875059b357e49178fa1516d28bfd0dd915f2e888722fe6863710511b5d3e670785e7808a3e6e0b275cb20b370e6482750042184d42db243c5456285300d67632ca5c4170877f07546a40b1ff313b3ebf9e8658dab987f21abc0f398e0ff3c876eaf1fd2a535cc8a4570fcd00bc6c1548e30400794d1e4137dc51b3969c9bdbe5f2019b0b4db80f18a6b2124684c257e3baf898b63596e52a26f286c4adf00bddd47caf4c60ff347c61f990f929b5bf580f1947d61452df19b9d329c870e2f984d35a26a097ddd805f7a82f97cd0fe0946225f180f7153a42c5f3e1fccae6213ab8bfbf9d03d4572c5cea5c88c236b9a95c3e12d64567946a681579aa001dfdac7fe3cdf9b3cd4b8d05cdff1a062ec6afb1d9aa2bb7d31078b8a90f4dad92c7f85717ad7ac4c361d68a5813ec6ac5d7123725ead0e46c2aa1abe29701569894058488bdfbffbd74a5426004bf0698ac921213400b3c9965f3bf6f17b491f5bd48d66db972c9ab05cd896a7a85c9060f32f15c7210f251ae7fa07d60a86def5e30a904e9ed64f40db4bf4832bc89aee837a29443363d37739f4b8e8a80b15072b057cfc5cb855f960e3e73b26673357b7f009e9a5ea3f251710d8f91b9bab13c6b28754f33a4e546fdca7478eb33eb619d836395bcb481fbae33da42a6b241effa37a61561b5f801e59dfdf8c178fc08672eca75d8b17f6194e45a8dbfd8197a97818ec9bd021fffc1d84e987e736e7ab14a2d9ab23a1f1f4365e1a2d8676ad079024047da0e2f40bee00c7a55e362c23d5f3e445ddc411cd3455638ace66b34ee565f3fc7bde2386c60f6a07c25ae7b9059fd7df0c6bdb44fd021f3d7712bc355dad8d342a147b60702e458250575898022c3d4a9a7309a94f2535873f1cbaba04b69080c644b7784909abe07f8031ddb2aeb0879c29a25e534b01c038d820f0d769f8562547eae887a9fcb4ff9f323aadf428245a7c5d27292a0f9b613979b8b739ad0730a5e48b13804eaaad0f83440b836c0c95852b377ea3126ea9ddc96fb959bea3ef85bcb3b044c23c146bf6100fac96493884cfa40572889d28a35ae91a4a777431290f038a14a58f9cb8a4f6fb8506b74067f649339be0080c497677cda17603cbb1e22336e04ea9173eb8dfd346246e57948265e0c7338213c588c63c54ab7bb200cd0b4d71ef73676b3474b803c9811300325fed6dbc7961956516bcdec8b4d611e9b35000f9458a9c37aef57b6d5420b12dec06a892c5e06fa1600392fa8332b328c73e0d9e7c5bfa0f481fc81e1c1d8cc7458608f3163242dc20d2b7917a84742556e859677901785333971a02608c69773b5aa2f4bdb19a5b3f23cc67c56162b5f6ba4cacf137fa91617b5524fb7edfd8a1eecff652989dee9dcc458d4d80201ad570f10d87d6c8e9dabf9c83b3eceda9bac7fec88a8968a956efcb477e65819d3ed84b427fe47a7042eb6e1c4c6dbca33ad28d7184a67268cede08bf670546c50008840c228404ff87c9e245cca242f2b7fc6de76b61368842c6a29061086de61b081226e1da959f597d09e538767d4d119597cfe264d92274ddb927d22b52e6362c5f4fcb7ac04b627526e6dc04f692304c723f3fbf1d2a75c2bf479bbdce1e6a415a306037c0fab30fbe48308e8d55279dbde830066b89c6287488a58caa40041fbeda5e263c1ceb33c4f0c134d100009d741fd2b574708bb0bd2e2289efd7e1367dc53bd1141da2bd53cbbfa5371e3c6b1d24b55841a069a6ca0401a80ac5a8b36a9d2cd782100d028fda84b1d947d76759448a38cc49289208820a7154909420ad2c958bb95ba6c264f6f7a3815e7e13ed22467215976b21cc3dd3a88a5aaf77842606831044d837303713a1468afea1cfd41135b6544b89aedb76c982c1747451592950b84850ba89c24c97511d458b9aaa84035c5b368ec5937f85e7db8606c9cf24e1011d18db16ea02df404b98067701f5453096efbce456addec3e2f9be5d1560ce9ffd925bd326b8a44466f08da6410d957233ec05d7ba19e2c539ff9b3b2347fcd70c915022bb5a2a9e2e7fce484ffe303df4d33c3201ed4b5221d7f22f66d2d8363b1be160d36f8f8cc27a22e829fc4ca84546f41b5ce222fea657d18f9b4fc5d4c808977e1db088fa855a373a2a7375cc7b06242abf0683a588a62d7880da4305cecd7485fa96cad911dc7c158aaa268e774ebc269b444f1d8e6ea1041639e19d4a293cba812d942d8cb6559324f40cbba0aad688495cb315b748b7178c8e2f77ee460921d8d7df395bf19f6239f1f1e1daa5f96eb960d35fe1e8e1852fd969f834e7601269f2298e332e34a9f8aad38d18cf271c8a1995e42702fa90321f34250392125d922c9900a4380d86cf9c3c99d76ca714d009f94be04bf7b9916cbba7da2af082e5145c59c6cdcb25df112f1006859a28e5b7a814dad04dcf20124df66a17e2745161f3a8afc4b56232868566cadd41d6756640c0b7ad50a6c6a7a8359f886f5464a802a2e58bdfcf680f941a78ed015d50347a58cddbce3430db18d487d71aa44147e717ea2d0b2398be2bb0ea9572ac35f26a62a6db7c0f9815ba0f619809786d3ac5656e54661a922bdb9a65c85dd35c27b6b2d54d5d24e6a144d6120e4eb0bbdfe824749d4db2085685a98672794afd00bc0adeac77f5e54e83c4edcadab2057d4d02cbc728dda48a6c040c03aa52f27c5e304c429b0e75cc69f62d8e45c71acad7aa95b8b01647ed73b11d03e27bb0fdc806ae6eb50e66bb174fc83ec375aae09ac389c15d15a6dba50a287d6a33e8ab71d165652a844ae7a276c6d54a5a98603918361112d2f6eeb6f7967b4b2965a80866075707e8fd4b45cda9b5f452516cf554f8ece9d893d9630fd3eec7ec516a8f539876ff4d0cce5ef25229f69c0aac9cea2cab9289281d0555c798b3e5d44cd29dd1c5f6187569f70160f6807cec9547945325552925325d5b59e5d2ee47457df9424575adac7a0a4a8dbd14941a7ba089414cff749ca52b5fb3c6dc2b36e64ad4ec111f35797c319de4a5d245efdbf041df4fcba97e9f44cd0c6ed847f0593bd72d2c27561b3ba3b33ac86e3fbd3d9dd151e23deec8fb1b408977d833d9cb5a775a68570b4653e3a600f8da57cdc60d1c38395ab474af5b810df4e8e08729bb8220465c9aaa4457da95323b017b7974c05a44fcb18812793278b2c85c9c81e7961c98b5288a680d672e621abeb7b30af1a907b6815b639a2da9e08d70c51b414a087c00a96802053df4e953cbb4a6c014d555d1112446ac8053ae4cc11282a275af3c13846a08913a7a512c5d942841855d5492ffa61924d43051a3241fd929675de20a07254808810f534c5805165e4c52b2008860e1862d54a28c92c214ae0c8144ee63a1441815c2dcc002ce036194f18a1124cc338104de1113ddd52bef288a88ef16daeffb6870320380161b5a9081447fbdf26c98d245b34eb0410992effbbeaf26ca0612986857af3c2c51748be5044a645f0c30ba34a206075d0a118306ad7be561c101001ad033bdf2b050e161b044e140603132830a5d52c1a4c95e794d554eb49944c96beaf50ff77ddff77d9f130deb95d7d483928ef5ca6b9a818340b3e895d7144506145aec95d7e424469296590100259e88a1c297222dd32baf0621aad031bdf26ac052b3026df6caaba18a58793540097be5d5c0a493bdf26a98d253bd85acd886efff541f38b065c94d84cf8a0f229712f076b71f11850f9c7085bb896077d8220586db7773cc6eb5b17f7d70a184dd6d27ca0f4a3bdc8dfcf0fd70ebbb4354383cddeeae3f15891856b0819b08a0104d6edfcd619fcc25de3320f8c7c2e0e584266e2294533ce084133711c22e23b8e1fff88fbd92c584146e228c59a6b8611ed66c91fc0004d1edee7a13e1b3f70938261947f2c811163a5ce12b846a6ea8f735521efd9a7f3d75f4b972513b38f181126e5812850dd3830a72a81f4802aa883eb54c6bf0035f98e8084a42821b5830526197a5e866e1f28309352e764525a8a1088a0b2bb032c5030aec0f255745a032dec12a013b84192a3a424a4a80962a4c089001257053a448222a49d5f5818b152c7c4b63ce391f6008378eb9c81a15e584647031328e29a03261ec3962829c0b47b25c212244c1291ce2861d8e8461182240cc45aef2c1308761188621171250f53094a24f2dd3550b5d2837893eb54c6b1f907cf1a14a49099ea40873619ae05e542f3c22e2ee70a48d7a5a06856b8413f4a9655a0f6d398242edf2d0f483879d1e4159d4ca48601056248d01e852d5e50a0a0745b4043f555c91ffb42c29893eb54cebf0c8375595735824cc60ce39e71114b1cbf50046c7c52aa1a50929b52948a12cb90aa35a05ea900443e9a093d49c735e0242133740e9724505a3295d82d89910e5ad972a2f571a6452da2c554b729420880d78d149d1035193add51c28e69c73ce4e94be255fcb4b39013c5cce4c3e294646a01008a20085131390e04b114f849820828b131804b94bab3aa5a5f107089ad022af6546a614893265842dbc231184277c450cd9293a054c51121fa06589172857985c8142a4444913ae18a07421024b0c530c7184adc20823a48802c2b00443130ca93e73cef908cc55c011a2d89247bfe69ff7b4e42b626af00129a11f505075a44f2dd33a1bb9539e8c581166ca4b0c2830e1e504a824a8f8410a20c0ec9aa8013432a51466a9080f74a08528b7103cd2c30f8826968c3c98c110044190f7746915aa2735a501af4acc5270028ea8ca3967a21b4255a438e2f4c211302f98a0030ae0104c8c72ce79898823c188893eb54c6b13904c4423962ead36ed9ea07a083042ea0806710ced135c2eadf2a2be50f978c24a044ba2228f7ecd7f5854f464f7200e87c329b176bd725181b7eb2d7ca8a105a4274f68f14078346a39c191f02843e5bc245f2c4f47285c21bc5ca5608950180ab193ea61d8a4fe48a19773ce4660d052121eaec4a0a4072b8cc2275060b4d41f4c4b62118be585a9498739e79c73d11272031d9e84c20ce69c73064208a89e33134cb45b828baa09762418c5b55b943af03109433049965a12da720401c0904001a584ab198a40828313bb2ab425e584852f3320e154e4c230841243401175c513609c4041820a3810a1e4059513400181c40121154640aa4c4a44e2186630e79c3317a52f3d67218488b09a4ad214285494aca043e8444b110a422071f4744493a38a2b5d8c5e58c2cb124d8ab4b01d3841154b1811049215ee095b76d040cd92cba2cba29465e9ca9784cb790987c6a3ef87144d2e8ce10ab94bab3aa5a5a60d56d8bdc0125f7cc22a8af219c18992441522a529519ad0402554859baa98e853cbb40ec396922872ceb94b0abc9e73ce391b11f1ed723bdd4e69b7b46bdaed764f3b289149c7a4c4b4c4d4c4b433411445511473188661180aa124e79c99a8c2b42a5a292165895e124518854dae585da84858024219e953cbb44e2105a0388657ca974bab545607901266e800baa2b056032211455114c52f1f7d0d3402d3f0846955cc61872d552ae878325c24687002a4c18aa82a3df9a1c991100a8f7ecdff14649873ce39a7708b1441c20a91426e8af5e8d7fc4b11eaf2f7c90a74e9296a783c21ac202249120b55809092c210294be45e68b25465370226242431cca10e56e00f1dc2e8302c0206214315f0280cc724df062a10e59cf357f5352193208a1efd9a0f432358ea4ba2bab46a951446b73074b650f468ce47562a6726610673ce39ffd084aee78c7b64127d6a99d639491442946650628ad50ab02c718b90c2491351b21461ae86ae8aae8e72ceb9487ee185175e7857979d14c8448b69348e3927197fb85ad2a546d15d5a555a027f44697aa3a25c94024dc30b5128d0203484069ee044e02505768319a672d1388ee36803d3a555272d5c7808b0212ad73e231f06d896635e03c97c2ce6f5fbc4bce6e929f34056629ff5c7de477f0cf64056ec03c5def5292ae3f961db1ac96c8b8bd915d35cef137b1707b2721fc8f5b09771203dfbe172c5fef5a9c5bddeec99fd707dec7d5c1fe397fbe897f10f300d7fd0edb5679787e013fbd76f506f1df09f18af981674fb7ad31fe3f7ebcdf56995f28169987573bdc697f7fbfdde5d314f85d4c85cdaf2ed8ee9a079809a44ad36a0ad34f04180ef13884df3b6cc169f19a0f5f679b4788df5d624ff92bc5e34b54e1d3fabd56b087689c92ed51d0cd531c6ac2df69b831eb955b2ba8ba236688bc5f255555e9aa523514994e000ae66df42daa9dfb74e1c84f7cf2957ee4b60e700d3eec7afdd0d1921f19638fd40e29d017edb630df0f7b8e8c338a2abbde1904aabc5b50edff6304293a74b7b709ff5f6b29ef5a9902349fd96575f14973fbb0ffba09b6bcf2eff7b61b10fba91ac6d9af835c0ef83c8cd19c2ef83753ac6613ac66fdaa88e7f87be287e175590b91457d0260fdb673f5aef7a9fd6bbf88f15fb31eea3f58801cb65a3b3eedb2fb707f7b1b94b93cf7ad46e3e8fda4d9e7b6021f72f607bf9e363d65f168bf35c725369bdecda5a3f6a706962c77ff6b828fe16b4c8458e7640db6731258118c4207e107fc7b15e794656442655667ae53129220394198e9ec4c0032e4a8b114878496890e18ac5414a0ae7d35a5b8d2d683f6bad0e189dc3846b351aea2be854ec52603e3c2ed127e61ab522811e888e3e1a1863fc551445f0bec839483f11639c7ee9778b82d169ddf1e05c70735231fd78294eaf3c2556f4f43cd2f73f285ff96d03e02f8421bacfaacd7d16f50677f0490c02be224ccfb89ef9056ecf9c4545ef83ff91165f8b5bf8ac3677960188f9dde806f43d824784e315b9eaa4eb7e8d3dcfadd6a6dfd19a8e7ed78be6577c5956b42efbb230fee2e9595de2d774d221b97f8fefb6a0ae96a7620f51b456bb798300e30e01677636daa0bfd65d2dfb10bbe1912253245802adac13680b1757496bafd9835229bf4f83b24cd61c963da2288ee3c862b148d2666b6d69f2f83a589a668ff964abf5b5cc1efda4cb65f6b49ed425cb149f7ce1afc2c01c8a230b465ab3e5d22f16ad6d3b2992db76d2dcb693db76122c6b277589baa0ed932f13043207a92bfa905a79dd2565a4a32f1aba6018d0aa57312b611bcd57f26b7dac846d77aa09db587c7dbcc3b6d8d7c7396c3bbfcefca5a2a2b73e6e52732eee525d1bc661a3dbbb39e2d7d6d7bf52f7cb9dba39e5d7212b60cccb4028ecfa5ab6769589719525092b611ddc5466a6ae024ac16a4f2c1ca65d8dbd518a64512b8b328f76b43d9725de178604cb8d34a5edb5e38d5930a4decd81256100a3df20620adb7459d56f79d565bb0682ae12efaf6b311cc77bf106fbb94ba81ea6d1fc93d1458f722552b925e9621dceb9aa10e91829502a144996c874efc5b747727149d7ed8b238cecad2da39255595d85311261bb1ca6352de9922e0d56458c895b2625fb22a39255c98e700eb6045382e560b9b257d954ec1cc916256bdb6ebbcb76bc4d91a9967199089402a7aa4ea96a536589a90909a7a87e519aab2aa92f542d9c5d0cc191647dbce42db3a7fc96c9e3ebe393680b248ccc4b5679a90595d893f763cc9ef03fdb6725deae7ef674494ae09fdfd87bf142ebdec3caf945131afcbc85b076bcc4fbd5c91287d1294bb4a7636f1cc5a9b137f6442951e9a25596989af0908844159d2eed3e28055e8155a014283543de377bc6fffcbb445bd02928c5e31c2ac170469759a2e6d7caaae42c5e2a89433d059940a56a032e8155c017c00dccacd0efcf68762e4689778c058d380a5574c45d3ce672333a2291a949741277b4d29a3c64bac8c5a51cb6895a3efd53fcf898cb44e055c681b30d4a8d53a31411b6815457acc2b6b10ad37037670c4115aa39635445ef8356fd128d3db14a6fdb4d19adda6966e6b05c00ca00983de0c380d2346a94e22e754955caa58b5ea6b36bc1465f3535f6a0b0ed4b4c0f6df8907fec8146ddb27277c538c8bbb6b34689f7ac933725de349db5a9c41edc546868b808750940f4b75a89378b0e6e2ab1ffb868a3c47ba69361987b6048e3f839ff0b2b9d5f485e82e960b98bc258baba3963063f8f3825deb24eb6ca96d9037e71953848d0cf734d9387d8473ee218d2292c97c3b6d7eb4ac469a213664475a9d26b35d432319011d2292c97334f459a0d3661d21683c5c808a0449334da42e6333af0c75edd295958cde8c6de8c6eeccde8664c0c627ae62caa40a99b13c6f2a88b52fab244d564b57bfa32428954333a906acc615b59a5641a75a5d3982bb58c4b259731c7dbf51bf5547e19a1c62fbab177519a52490cc7a899d913f2b1178a2758b2461247d9aa1d4dd22dcccc5d10c3b17773c6a8b2ac726d333a4cbb333a26fdf1b4743a314f4b2d2597a792d7ef0c542fa3667ae597f18b0edb64322b2559183dd45434a33b9a798a4182ea3149bd7e6149b05c6cc3905e642e9b62228fe44c8f6d18120cb367e4b05c6995c14c720d8e214b00e0a632fb6ff620efcef68c0ed3eed36c510ad37417bd3b2b1d500a943a99aae87afa9dc506ab3678eeb2b74b294cbba01478a74aa86a735fdc65ae442a7565d20def537b1bfcc74acdffccf85a0df7a9bd8db7c17fd0af05ddd488b16bbc8c5dfb19fbe6d16de369d8d8d8d07819fc077d1aff33e36d3e48c607c5781fdac778fc312c7819fc47c65bf03f319ef64137f2c6d8385ec6bef13336cea33bc7e7a87dd00da7c6fbdc7c8db75fc3c6d7f80ffa36fe67c6df7cd0edc69ed9bff141371cbbc6d7dea7c6d7de7eadf637f88f8caffd4f8caff141366a346e6ad894e0e7a24ebb8b36551bdcbb50a590b61ed040c78f9dfe718bc77f753a2c92b54fd806e3f1dbaad9631aa317e925ba395d12cd09f4edb277f11f147e548bcee0a3e09fa815f014c55e5dec1afb980d7bac9b59abab36989c79f5d4eace3d63bdec4fd99f3f637120b23f67405c3ccdbb789ab77bc66719b0debe9de9ec30a53afe6bf6b0380f0daa839e790c7bec22bd531db3be83993d63f1107c661ef67826ad53339fd65e0fd9bbb0dc62a9347097ba639baacd0cf5d6506d338fff2e591db78abd9101ffcda1da608fd319fc2e64269599a7d9f6c99e5464fe9a0cd03317eaf5e3c615cdff3bacb4fc16c9f5160adb621e37613bdaa65bc5eab048d6c56b9e8a1dc676555afe173bbf6daa3b30aa4dfe1d176fdd2a1db7e0f6e9ea6ed2c5611a7e9a7d8d4e19fe996d77d6a90ad3f0d3550feb2d11b6d91ea661ab033fc6b65ba21bc9e2b6a9daa49768cc418bdce288d87b5d41aeeb8a81ac7f77f0e87c29a475e4f4fb177f07d8160001541d38f6e6d2a8f1356cb3e0519dcdd3f28fe53d923141a7d7a8d75288cec5f10ffbaa5d302ecec5bf987d8baf95e66b8da931fe0078dd2a1c7b467e8eafb71b371ee781e0f81c381e07c703c5f81b5f6f8ff3f546d6f0d98f1c8ff340723c0ece03cdf81c1c08cee7f81c1c087d1c5e6f249fa5b60aa8b39ef3aadf5c48b5b9ffbb831b1beda94ebf2f787ad3edbbe0e94d0b3ee329fa7ff2199e9e97a75a7cb54627b4c9ed12b74a340de8d42ab1442330426a3d6fdb6b366cd8a8d56a36bede2cd8334cdb33cc673f68340b2cb0e081623cedebade6a761636343037d1ae8d378a0196ff3f55663cfece3f87abbd9377fe381d4781c1c48c6d7f81b1cc88a8f8caff14031fee6ebedc4b13a04506fee9fdd9e3a7076f00460778069f769ec1eb5fdc1cdb6b16dec7aabed7abbd9f55663d79bcdae371abbdec25d7b0ec0aeb7aa63c1b6b40dead419788b5dc68e21c22b0800b7f5547535b84717b546d5e6fe1d22ba57483fa93bb58b4875078ca1eee4266c73d90f32c4dedc1eecefad7600447f2b3fb51de8f7ad0c9600e52b69d7aeb772d75bae37b0deee5984d6f715fbf2d5c1cd9919207f06690e527dc8cd0f72139c8d33d7c366230752befef2b5cc684475b8b8968b6ced19f83ae69e813c041ff35bbf41bdd5f80f6a7ebdb94c5e6fa559be7949a83b2ae842f51aa93749bd52ea8ed531e432a936f39ed0efc76cd9d6db5ed99e9dc2b4ebdab6c9c6506d8eac4ea9a7e443ac0edba4dedc7f526dea2def9b19e4266e31ccdc1a8d39e88fe35b9f5841ac4bbac043158eb7a4043658108760ad07aa0d7e8ba53ae0daacd3a5e1eff582f00f4cd0a96d02a9901f601bc975300dbf28e2aa29bd2075c71c1f57282020f1c90762fdf8df97f0a517a057de901612887cf181c667fdf740c6673dcf159f7c20567cc81f1f08eb47fe63afb080a162e946f213d3ea54145ca66ef566c57ebdb1760f4cc33fee7ac32fa46ae976f36c9d2ddaf2ecb8b62197865bc8529db456d1e0e7e9816df586a142283af31abad3f6bf7d81850aa178886228f7ca73b24216fbe5dbfd755753eda297c645edfe3a0981a1fafa77fa7d0eea8e8d61dbebef799fe81705fde65d83d0f5a260906ad34f23b40cf6321ff37a1f18aff825c3455e65a6943bd5e925dad3ef56b663bb561a6c9bbcda6d6fe5a3b55afad8442d7ad19a94ae0fdbaf1d04db5af8d617a2d3534da6a5e62991aedf6ea56eade5c15abb4008bbe6d5f53abdf5f6c9d6aeb9488176bde981f9f53d30bffc6a1ec02c3795d79b4fe3da5eff123b8a6de2edd620e3174df23f7b9f9e9a44f24465f45484166cf18731c6d8eef8762861610b92c5574488541bfc248b256d7b5aaf582c692275c724bffc8b638adb47b0f3b070fe92dce207d506638c2b385ae98f3b690ba588ce620bdacf5a8b7b68c0d3710244c72928f172ba28be4dd506bfbebca65e5217c5423abd4d521d8b4d34a4a8a423afcbf5fa35ff7105ddcfe0c73e08e40f82dce7f531fef3fa1f6c73dd6bdaa56aa3ab3aabe312756cedddf9490c83c91e16f3aed8e7980cff81f1ea8ad9b52ddb159bb31f2e57ec5d7fb98fec5ffce7f5b2b7a64665fc473fac1623bff2ee5477d8cbce1fd9bbb8365f9fffeaf789bde63f56eeffc43e267bd8a95f86af0567b6e82cb8a9eec0e8f8efaeee90f8d45760083af6d2f1162710a050fba9e3b1da6e13a6612bf6cd17eb4ef9e6931edc27dffcb4d64d21b5eec2096d3bf9217c3db54b576775884afd7ea92b42db47d2d4ef97d876ef7deded2aadd34567f7f5bb3ef64064af63fa65f9635f6f7cf6e3f5b107f2fa188f3d50c5b4170712fbd7bf38500cb7bbdbe5e990aff7d88a97ba85b2d6325df472eb7451fce593227ec15e2f58352bb6c5defc0fbdf29ae0765f094bf6828b5e1a3d6cf6a0c7cdc95cb45914ebe6b9b6823c17f4b8165b6bed051a581c9c9b53cf4fb45f6bec0c38b22e5738200e8e1645dd8f70a80106298eaa929ee0a2848ad0ee68892eb5988a5d0acc919eb924052eb82b46704c4c80a4e5c91095bad33285520dbfdd557c31063f90c76405b523c0d205fde12bae002b3a6220cce0fb4410f7308310c41f2276b0dae0cf690640b327dc17b85d1c470e02ee22ffaa4d0962f0f5efab82ac35325d742a769006596bbef2b292e87447261f3fd9e212e0e703f2f19f3438a8d0a98feec1fd7acff3ac3662aff54be212ca2fc1fc5b0a21798b4b133b9939c8f5454ff16226ea8bb21a9d1d3c3a3a5d87b41b48ffeb5d9b03b99ea9b33ead40d05fb3c7c75009ae877d09fa5f5fb1edf5401c48ff8b575ecd04b0de7c7dd5ffe2305e6f24abd56ae9ece0e960c805355e4f8aaa5573c1b581622f7bbd815eaf61ef7a06bc5e3fcf956d20188f6d2b3e2faeff2ca25dfcf59acf2ef781e977fd4cbbbe07cdf1b5cb345b66abd5d2d131cdcd22f96cfcda59a77e5c794510f4e0c42e49133a0c718513e9c261922e894e6b2f888ea33a37a7e68c2f23737144a7fa7be633038850a4830f8aa2d6e7f9d70e7145955e87b802a9cfe875082b52d0bf55b250b462119f389ceae3ae5d6603c5bccccb3690159f18aed3d59d1b1dcb3e0b9618fa26653b88687532bbde64322f93619b0caf986683609ace3e480671bd05ab1d31b03f3eb641f47992a0d5b1be57f2f47bc53bea0ef9f807506d768a0ec9ad0ea541eb6e4e6a898e6c07d876cac4fca7f50a9f7b665773837a1b92bdccb3769591d1b939b67f3d842f9ceaac6d7b100eb04df6f88d90c04079e20628aa6ef8abcc3340c66538036278c5b4cb239ceab21f3715d9d3b836d9e347fbc55f1b2fb72c6891ffa91be2841a01140d29290ec6cbfa2b0ea4a4cab45e29bd5073742e4ac4eaa855389041d144b04d3c5bd0e3b3de2e897609db25915ba56a434447151d4ca4cbfcca5e3929d9edb0b88b12e12e6a7196c87eb0895cd47e2af2ee120fbe18ca3e5d14d79dfcf81b50773888c0cd191f2fa0ead861593c7e2296484bcdc932e124239b539187a7dae0274bcb5377ccb402415de6c74f6b7de6679e7cb15f3c6bcf0c6059ef62cf7ec0f8173f8be14060fc8b19907f17ffefe2ad59cd04583ecb20f6f66d983ee47610c21efba07e2ad176df6a036357a00704db6117d7738778d88b42e929d993768a7fbde1988711c3673ffe613c907f181cc88a0f8b87f14034ff30feff39108b875161fc7e20ff9c03cdfe7f73202b3eb37f0ed4e26184a936a20c149dd61ecf0d82b5786a34fd7e16a1cd8e5f4f84bb433787fc57eab8856d15aec76f83a861ea8ef9c4a5eec05c9fda2b66583d988ead09527b84b64ffdb652a07e4d1ef62c42cbc8fc2973f29901ce8f791e27af179d919179f1633ea88f2fb3c7bf1795f10e2ebabf2de4a2609a63ecc9385b67efb8a8cd458003075822222f768b8d7417506ff0e377c2f8d3137f03aa4d1659ec7a0b526df0835f6f49e66a23244e4a987a7a5e79421a85375deb8ef83524adb5f6da0ce4bacd8051b7008ec47d1f8661f8610882bd025f555d143f99815cbf6fed6b25da0a01a73eb0aaa8e3278b6e4e15b6d95b357f8437d65b12f454572cdafec837dccd99c2cfc24655f956cd0c46fc22afa190ce202a84068d2e7a49710ac63a3347fa7b8b633dc618638c3166b1a471f7d1efa73a250d36e8c07462308bdce230fe90a727883f8cf11069ff7bcb810f6c33ffab3ad5e6bb3dd5e95f4f7574ca1df77b5b74d1cf96562d33471a7cfbfaa2b8f7e10a02c404b2e2e3aab7ef8bfd57abfeac346cf6afd6b39ed608d33e1646daf6fbfd85f2816de7572dce07a67d5fc6ea50ffde8e50d1ef39f8be1779aabfd14a5b5e75e2cd23585aa2c5c909dd9228271cc65e35d13d6e0e36a9b89ee7d6d4f0931ad4ea8ef8f86d549b45c154add66bb7c9137546c761c77f9bb0add6fbc29d8242c7f88ed031eea13fe8861f6580ebf5fbb4fef5f65fae16af254b9cc236ace1b9764aacfa34ba44a28c0bda4af57ed097a768b74617db34b85450588bdc4e5dde63ca661b666acaa6ff589ff62a080d72748bb68f5f46e425774de4acf4ae634c2215d1699dea1ddc1c2ab01cb6c1780dbf8f992ddade506db5aa506fce1175e7a35177f049840ea2631eac159307f6310f148b79f071b00f1f3fa06c0e48f6b1078a79d8839fdadcecbe8fec63ef1333bb1c480c87c5b8c6c17202a65bbd5921754ee8f8d319dd7e8caac39a506ff08bb298b75f53773e9bcba1dd03b47685aee15c14d7eee3829d47d8ef016074f26d0ee7a672aeb7db83fbae272fe9da7af328dffeeb3378cb6baacdeb83ac4dbffee2a910b46bfbac0fea98343bb83925afd716d59def4f3b54c390e4aedd1cd65ba49acdd5caafd77478b0cd5d7494418b1c7d1ff4ddb54c10c5c7d9da594e745aabba0ecf05b787cdf5e6a72d7aaa93d6a4347aaad35d7fc507b76eed7a692017ef77d11b0b771db0a683343af8a3135ddf0e61fd65b1eab358fae6b058b5b22a6d7c2bd6ff6b47b1dfcb897c20d6303f697dd2b1f7330e09954163460c9b9b1a377b46d6d833f2e6e6c9bfe13f5648ee73f3b51b1b1f547b1b019a90a8544db695350b95aa9101000063150020281006060322d178380d4210a67e148009749a46724e1a0e834110c3300a621800100000010010001001842908517210001e7060ca8f234793e1e5884db2cb01a15b8871cc878736a820f7a1bc7aab9787a6cff8ac531887f0237aa1427cf6cc3fcefe0efdb3790d4c0719d26e6e5c31b191b72f2aac808de794e60dce17000339f2ce58a61bbb75e3d705c89c2844378afc81ca8c337e8fb01621b88eaa549f3b35bff60b1666aac12d2daa1490f7a12f92b89660689ad158e578ee041c9f0d26343afdbc96b2fa8f54753e2057066cd83a79d02ae5cccdb9a787ab7c5fe2e1309148d1be2ee317d8f6f9ae1ff082fe00ec5fa6ae886ac36002b79838ba64ec1814587f42713c128d0e05bb58107ff06a9770aa65720b541c69c00f5f2e300c133aa181bc466d0eac7e98db478e62a9657710cfa2cfdb4bcb4d436dcba521cb3d0d69149a567d7f4e5db6102f349213f8e2ce4981334c34157dbe929fd6e46c31d5f87ff2d0ad352953ddc4d5081d99d57f5c5ea395dbd85740a3805fbe0fbedc6ebaaba626c72536333975827543ec81e84641a185c253c6e812a0de06b656abe7e7405c3ee107d9dfd18fc528ce33ce19ba1526c37d8c0f343f80026f426622c7536e08d6ca501bddd46f05110b5bba184da04eee3c5c17050b69eb7e9aa9827d2ec8e4c63124b4f61b0eb1912cbfb3870a60c2ce70f3a1bb021734f8b8e980bbb1d2c9d818216ed378b942c1fbc672140b7d097107fc0a8d47e042dc3e8a0ef4715d19d2cd934ecb5f602ed32ee3cbcab08cfafba01b737369803849902197d4e33d14932c8ae0d8cf7e7a0c66adf10c77f2f5f4d2392fc9203dce45fd8f7baea2e98a73ac53c568ce16689aa6c622cf8c9479d5cb12394a46b40845c9ad65b5fc009c402267b0643190f01f59cec6aa12b9890dbbe4258f6123b744087e197a49284d9012bcb49debf9e3f25599c20a8e039150edb2f83fa0f3a58f1ee20fcc924063c9d5f2e528c18810849b1c9210fbe37d1b626040ea56a351772b291cee0ecac2dcff9b35b87450120334a801a87fa182d9c9e97d1a185160bc75351e9272b8bf03962b84177537c3efc2bcfab3a7be7a86e6efb0bdbad59cc54b9bf56866c11e719f588a7a4864373ad26435284fd4ebfee0242536e08881de7104e8621b0e28243ef0882d934b071a9c31e31b4095ecf7fc1d2dc1c817d090aa53d97fd2963c3027f3a6b5afd105309f2bbd92a094cffca10a0a9add1093868dfb9183cf2798cb3814bb2ad5baaf109c96154115465a888adcc143eb816c76ca0a14e373028f6aba6ee0bc0374e4e27bb4b7d71e3430ed62b03d27b43ca648fe73ff97dfee491442bffd40a073483282df81810fd22f99b13968ef706dd534aa7b1ef1ff4040b3565d6900e555c7123d28172c1d40f01058cf6fc6f972268904d3cc9c168689b737fccdc037db4813f5b109a2effb6c8a803bc210ce9aabaaf74cafd01f9b63201d20d007b0260b140cc00ef403081f2c21b5fa0e1c76f5d22b6bd5a5c003e18fedcfe728cb0113c7166b55c82da5ab4004361750ee870882ec77df6f9e874080d9e199168c560f75c66b6af9ec286107465e87e14214910a7a126d404629201d9ae0dbd167e030f06611cade9692edfd80ba201b407179bc8b9f64a0b93cc8ce13e54a72b2937f9124db4d1e4ccf9416da4c29fdbe5875d875367b8bea7f8a0c48bcc72b990b5c1ae86439bb9cb166df44ecf27548fbe98c2376c55ee0c69b42d8b956f5da6da6404acecba2e39168d8a9f0887595cc8ce47394c66582fcd516db2ec0a6da510afbd3e575c671b00f75f3b6dc82527623db658778ec0f489305f201934ab397322b03f03bba321cc09041785658b6f4707a55e83515535d41ab38687bc0842f1aa6be20615dbe6fd9914dcdaf0dc6e62b8249537bd30dca07c0afa30dfbce058ca051656c6fe878599ea844a395149b26fb442381e98f375e9cd7a4239e865c2fe3a9c13131cbc51f7505884e716ff2a055c5c00032087459d4aeaf45cef987e3a8c90057ee5b9e03b22735405324ff3112554596357fbbe1283f45a157719941b140b0e7e1bcfa8c42a8a660dc679ab75f6d58ffaec81103d64228a6f71bd0536e1d47cc063c42c883988e125af7efcedfbcb951dc22623fcd09ffc22ebf4eebf546daf489af873d189b9bb61688eae84bf545fd08f93f883e3b7d2820ef46e294e123a8be355ad6590a714d12b56c89d8fb73379c4cfe980f756003b028108d604984ad5a996116d01313fba007929a199ddcf55a645aea0e6852ef7e3abbe0699cdb758de3dacb29fc8dce559781f4d55336023c4695f621e3d2079b177ffda73a14f3f2ec2639e770afa3df08eaa0e25d85a6e0a562b0bbb194b05e76c9763ee368a844d1ae0b9afeee2b095df9ec19c8a5888369d9f592e6c3362048a57d4dc0531b6bdf7533e132701095b361417a23053db9c6266ceb3b82ba7fb5223f121f756b89e7392d0963da0b4e0f804f098d99bd1fb1504c786926508738d4237f2474e41f78c9e97ed06650093767ddb6d8b0ebc97bfa55e405b98b0a9ae0e605345bea3a5e0df083c4421d371316e240251c1e38cb7e137fb9012de912981bede9253ce7dd15bcd616350b9c9e60414371cc544a9321344852323930f1f6afed2995e520396e5af125b0d5958815299c284b33c7aa25de051361b1c40e0f76efe7a428742a2b38bcdfdd3c628b6aec71b863a0229a4e9b64b6a38221a814dd1c86994645b7710f85fd4932872c3fc939c35939e8ffa9eace901a36ae0565df0a8d345db2495e192808b33e5443f54524fcb38ab74cc4057c7fa5056fc11adccbfe6ee105764ab39fbd6deb94beb163ed01869cad2225e915c580cb6087bda4626906a107f8e27c955956a0b0fd8a0a36a6e3e113a3a5cce8cc65a44dfa0e912c14dd9b653f199cc9ab117bdac93bb6354c0c34e43b9220720b8330dbe110d9a4660ef80c5596a32538f83a969376fc81c042c53e5f5c51db07949f1dd9047953e0d96b568d557a630990e8e433ec25a4d09f933ef1f7a3572254ef168cc5caa4b053285b703eb717fcf85ced988866dc3ed1e0c477981604cfcb2a020c94f8df3b403e452fc750de0b2bf111edafaf0576f76286c014ce0be3d966f49c549960fb598edffb9d166d64acecb16efb364512ef1cf4363aeaa52bf8c83f251998f346126e4fc3b1ee456f0adc7e42e33250c40673aadcb4c743f2b8d2edc449f972d8aa86fcc3ed807d0732a55e50961b4af2c0287fe5c01ddffddc7709305f97559d58f2a7060166de53452064bb3279dd30dc4df83408784fccbdf6095b934d30755e2519d1feb93b659a2a04dfcfd965dcc40c3bc0743730345e5bdb9db425fe174280d530af7dd07f7dd91c005396c0b43cb2669b7ea9ea85cc4b0facbdceaccb00046e8986f706558f9ff9dcd3ff28a1d04aa4931850d501e0c811511f9f52f778b20c677361df131b04beec49d64433bbda342b9fbbc55eb61e5439c8567728964a5ad1fe18bda0e5a96795886dc4cab636adf232085705389ec05eb2f06f27078d96b5083d5fc061a9ae2f277dc0cb7b80ba5ec88880ad4f5ccf7f139a00a3791ad7af5b334614d45bb11d90c7f79482744d7f671b0809a35cc1819264c5990e59ec7f8e63e8695f52677cde66a9d031fc9733184611b62c63afd1f6ff248cecdc593256cf566fbec08cb8b390fef37b1fa742646b6ff32ea9d2372ea2ab9f10c560f4632775929262d016d894c081c869874df861c90a71f302880e1eb4f56970ebc99b9387b8ce2681f19fb49d1c368bf80357e0d39cfb0679566f77d0903e2e05aa8f21d46ebf4a1b0417fb7c6bcf5302ff1f13a7eb8a73a32325153a07bec5974222afb9a3d8c3a486da393e55364105fb256420ac7a23fce9ee9edaf78eac8dad2f601611ff4e1bbc840651bdb4df02a5cc28152ef48650005df7a438d31819981f7d94c9e3e330b0e59423618444bcb95350310802ac65a9c72af5a6b08ecd7228eacfa78b50cf7317ed868f56983b13042649b634542c131c01155584c62d86aae480def9f7104086c968ace04456494cf00bf0f4c4d85bf36efa23352f9720fa5d74ad7a73de56b6ae44d1b9a8fd59541eec1b23ee456db8c6cb5d8d4ae00537122388a4a9f502e0de28ec569fa32725c7077a19d6d65cb8cd768cb8976b9964286b0284794c63ae631bda2206287fdbc48d0f1657893df6ad21878c741314a09580a5cf558be15765df011ab0abc3b97a1df80235e80566bfab163c10f7548aa6f45725a43d29190f95562bc4518857c37ab0c61ed543bd541aee2c559ca7ab984a6cd4501250b166c041e801b3388ee5f76dfbff32876f635dc968b0fb0424666b453df63ea18d7aec17077886720abc2827f95b0e03a956391ff24c7179afd2d154df6fb9a6fd323a8a63977ed131817a2ae78f8074826ffb210469b0e0d28de338c15e57e446170f84fa24154c7d87a1e159ff2b3d22f1a903ca5be76adb983e2c945f3426d2176545d5afcea9e6576be437ed6e0d4b41419d42000fc21595dc124a805d0ea1229fad7dbb4ab00ab6c2f8cb007b3d12e57464e8413c293074cdccbcba1f710a9a1ee68e8483825f13e23083bc01c4e1eb46b40ebae5becb2d7c5d534562578d68259e1a62c8e53054ff3d670ee22964eab6aa7848bbea21e8c21b3ace85431b1c6047669ab40056b7453e14511c68627814d00c56d10d543e0862a06d4ba31bc10d4ae888b809aa4c84ba230392477a17035bfdd5fa4e8721c1d55daddba333c454db19226b3eb8a52ea5bef476a2922701f7170cfa8a95adb9a30ad2678e0ece49c2c21dc40af220ea7c3cb6970742778229db0efbe9510955aee0fcb88bdeaf9ecb4ecf401179179d060049d0019d86662420a1997ed49da7e2c5da17bfa02b1de52d5163f2aeaa250bd3116145d610e807bb8647a908f259ba7452859a780d683e3298b1c0c80347434317391df63bdd37dc51a69cf89788eb927ce9887f3c26c9283fb49682f9a046b5f7a87b1b3767478431a62ed33a04f2f7abf79892c4232ce5a0803d907168f5778c8cdbbffc1a86bb5f350a761d20cefa9ac78057e3dad80f301b8c9f5f1f86f5bf998cff09900004aafcb766e1ab7a8a0cf71523613e0e928f041ac04533fce7205f3d283c8bd1e3ab936d0836af18c0ead5f340f0561657867e26edcf5ecbd0339a905efacc4b35326e0939efb320574a8269174876d045547dac11cf23877046d2bdf7ec3dc014819fdac996dcd68a60c894035b2bff220c053511ed741dd5eb4c5b134267a15f5ca239f907c2b26a688213145bef922774eb3d6e82baa907f34bd6ffb4f4542d65ad622ae99af3eea433c0063bae3297087eb5587808bdeaef19f6ac024e2430d3b453233a4d05d9a74adc95ddcda7ab660f276bc36d924ff47f8fb6fd9246cba9361d2070755c28020b6a52b9ec5681d247b6a14622e88ba1be5ccb3d4025d51ea847e65d5cd90a79bc9b9b6ea1b23090f6ec84c24218e8cf5b8095a270ba67fbcba4fb2871ce1fb075c7db19d2918b9386319550d8fe45a3ce5707e8fd305b09c998f8c568719d66c0f4019147496c6dc32a8cdec4902078c7d13feb4823fa5c907f660e016f7df179fbccfc487e8907c6347e1a22dfd3aa930f335490e1e286bad4dfd257db854bc071576e3ae5bedc1a8ad995ee5fbe25d4c9e05c877e8e0c0d00d05745db08003c4e3fe9e419982130c0520060e9f5e4f4689e246a6df7a10e30c01d3ae7fc270d91c7f344afdbc40ba34302cb59ad33aec6d0ae2c8d8bdaa3244aa024bfb765293a9e1f7fab75e29c452b1eba2803ad9d5dd862ea5c50c52f6457321201c6dc323f74c4ee4750407dba2a24bf4c9f6dfbda3dd4a24b93df61118e5434056626415fd7055ac1c71903db1b2b08c66be1b22baf3b2f9b065d6a2ec45a53931c3c782c7eefcc61ecf93abfa51668f061bbf0f8ef096d1807c9080812b2daa9f680b34343c898ee635008cff4bf5e80a852c58b84dd5b4b6b0130b67739f12707a636be68923b4499876b1b662a35c00b05ac20f5dc5b16673c9b885f9c27231fb35e3e54dcdf996e864d820ed9197433a96c99c36430e017fa256137154b83831324c50d7720ce34e4fed618cd1a30609b8c8bc3ae4c9bb70e103dbd44cc03dbd641b343ba9f75992b0565b60e48a7753fe6bce30830b840f971327ca2ed53cd253fedea2fbcd95a5186b70f49da943d73fa0ca91f02b2e3b9f99387fc6baf7dc7fd46359624aebe6e97261036c2d43342b252ba042ebaec9292ab4bdfadd04e1f877ff2d021018e9fc376be3eeb5a17c88194e2d7aedae7e12121537b017e446360a2447aab3d44454f273c70206c89ab62f692918b196e40748d2dc61015375810692a7e25126396f05c16cfc3fcfb1870a2fb7668cbe4523b7a78652d8d19b45504784b7c060435dca378e692c110b6ad95ba35388df9b967279d32e3e56d48a66c8e8cee05514e6033027781da317c3a698d7b0b5dcea80334a232f342472c95a6685cff919133157a79a49c0a37c2f739bb8ce0992d7706c7e4c23be3ef70de563ca59f16c351c9a2e783c36f15fde2e1153574c3cd7ed3d233e69bfafbddbc0d77bb3a4357c82fa47715be43aff65588f4a015e2c4aa4178e79d08c0fb965777a8328993c2edf64dd0518dde233e8fbaf26e975c632e64c1090f32df4d46506e2360431beecb6fe41f282ce36a2be3549f11f38cfdef6cb79bbd8c17b5061c81fd47d69bb4795299df07cd97ad9bb263aede136386b1d9468f56e8a9fcce793a49fc33ebf84cac2513a690d07c5710d99bf2dc3c74aa1da1b9275aae89b4d72f2a736d5f0bad014ea2178b5256fbc716c4850b85326a5433b6908f41a762043fcd9743e6ca0e0002442a66d5df5470e8a8a36b26bc41b85ea6381ea37289dcf031d90911f679fa5e48c5c846337b87df389d1703ca0dfde116faf6d924b66e9138195f4a8b1df2acae6ef4fbfb47766edde5d924b872aa4ebc3888271142798fc138fa5d0143d9756ec444cd59c0578f69729786c80a362fa8c546e6f5a166b7118f254715cc264ddee5cde90d8985ebcee0020d21ac463cb12d65abb47955e45edee576207ea3b81dc4d801c01266d1ed24c391f36d07e5fd963910eeda9f4b3751439182cd6f54d3271d91a9375d1daacea59784553d675d0d0c53197bcae898b4b357bc287e1f3f83a5f6d2132d6ee5edd35c8f8871bc5521ae8d8b48777059257d48d604dbb9ba6a72f3ee5a9ce43fcf86c2bf2187b4a55cd2592d8cddd4c9b90d5a379b130c3509bed148e46b4aa220099c58a29ce67737b129e2f2deed7172ba9ad6927f87be1e293c9de6923415cff7d999d5345924e3d2a46b37e3f7e2a20342f4a675c2d1bdc842d30dc6f6dcdea6edec89a0497479ed5de13b3d59a149a00d2a4f365cc777f938dc96b80de399090c15c1ec0c39ec515622f04b4df70752c49907da47b3a1f0ab905849401a5e1fa96d8cdecad5c4292f153054816721b2eb18c492842b23f75e45de50534da8076c898eb9c34d6df7a7c6946b8e504fe3731416a3bd2b5bfea186a44446a5c30f0e0a556c28e4f060a88fa418db14bd1b938544e89369186a0943f47d4a325e266e135e4a978589316facf74f6cce93533b40704b5814a62e86b125d300cd81e24b1530e8edeb80c9faf4f711b694a1b1d3fddd06ebc7cedfd231ea671f7af2a9634498cf23be9abf57a6eef63dc405d52b2f6587eb1d59d1430d3e8c0be2d4da9768e969fe57cfd5b3775b31c3e2d3ee15509656fd9bba5d294200e817745614ad409e4fc995b677ff12cffd7e8fd64dd4ef78a8c192d09f7a035cbca4f21a67d0815b3f1d0c6a6148f404933ba7faed74f2ffda3f1d5f7effa08029897eef089587b6d680d18cd6aeb7f9690f8d6811917a4461ce7e304646d6975f77e31aac44bdfeee8b799dcafaa6e4f2d6b8394a27e082fb7ad434b0ec13c7b7f75ed781c195bb1eeab43e40931adbd19172aa5b631029494ff39dff97cabb8e4cc87c2c3d7d0fe550323f8064841659021c2c4271089e999877a2a2c222341cd08c0fcdc0ed8127e5adaba020ced669007216551f35d99c990294375756c6cde39edee66cb7cbcb2a48b3a36e483652b9e0718c587fbdace0caf1010d5c310faf47c19dbc55f1581a09ff17cc8145b480d381490f215442ea2e62d161e2460909daba79f045514ff1185751eb08485b78ef1233a00a870225bf3a5071dc54b6561b4a979d527ba74f27751730fe3e33e24267fb7dbe7cc00ee2903ef9c03dbbfd62e334b312ed70bb37fa148e8c3761dc515711a4a09ba437be4695a244002dfe4b9522cad5ffc080523d13ae1aec647d2cab7f778a1276fd0b274de63c82f51b80786f93091023b7aac56890902c15adf34b9a7774f945b3cc846a4e188f9eb88f28740bdcd2d339d52ea024474ad536763c32e3caa826203c781edfeeeda708dfdc98480855b38975500b294a421d2c3782a73023461c4a0a32ae0389b2e483b658e911190b4ce41c583c5dc0359e03c36971412c6684bbc7d803487a8f4af35d2cf1c68617e8f714cf9a2a60e4c9ecd1f61f36e2c406abb5a27ea2bd714d746b0977d73c9a9d83e7b0fb60b287870765ff941749eafc9d77e3e2250e07a1139f4adfc23ffe3de06fe0cb9706e880be64de4d6b1e701325cf82c0086979b0410cb87b01e067fe6e77e90148081d700172714830036b18ca49ea65fa4b3e1da8434706dccc32095e30b3c99a77bb1129c8ae85a9775571ad03cbbf1cf51ee6498d2b2441e8aec443051864e4d0f1fc0ecefc9bb3b6d20595c8bffeded20a70f2c7df87e5a619c1600769b4f2a3fb7e46c546c6a0ecef22ff8513e0e745c2322ec61b61176d2c03e53cd1565fccfb547095b3dbb779d1e701468806c34b763aeb52c661abdc26711f293b4f6083e8d61278c326be5a9c0350b08cc3c1c7654411d28305b3c4aa62e8a7a80fda9eee50cd467e5f5f19aa0becc24148c1fcdba456ee52fdd6b83320d89e33b42b0df65af9a8ada75aca80338a258ea10aa157bfcb0188c01bedaebbf1021ecfeb7909e7a913933912c275c2a0d33779db0bae25096a57d15ffe2e75294d1d4c39de013dfc8dd471256dce898929c0abe3cd91c86dbf0e5629ce84c88b1b1d3d12c78381a1c657188b7139d3d3e14cb90e980b6c44f38afae88546f1b5aa9b0bc699bf4b77bb9418effd69ff3c31ccf3dc20fb2098f5b8a1151d968e281f7c410e90523980649888bcce8bf0c6d62caa780eeadf9416b21d15da473d02356c4d083e6c00b7fdee13d2fb92508ecfae8029fa352bb80e609ccf2464f1cbf8389676a81c4489d3244f038e2f4056a2fb3691969d9802623e5134ddea92a567420aea4f2a22ca70fadad56b945aa4226bdd15b75e58885caaffeb5f7dadd217351a2c00fe89a08bdcf42a81b79295209cf73f8df43ba55dd809521d013c7e2958f13970c4c17e0dbd372a395a399a02b28c29cd5c38fafc4ab65be1f7c599ab1fbb373a2d316b74448c6274fc80b61c98b4ba34ca98c5ec88685f048b074f38278c1a6cd0f186b28a3f6190fb73738d0c74b7e368453a553cbc7c97b6eb08573ff28bfd8ed65a677e4e42f78896445d8cc7b5263e03ab08de252b287153b1c546cdd3c04897b7f60f246b1e9cacd82c8ecd4c56ed084740b2933e9efa3c194fb145b6b646e498a97ac9e2e9f82080c3692086bb3884005d19f19611674bef0977eeb09dcc29416a4319518693fb15b653e9b872787e41b308e0d93f3cb4f04c7b86e5fd4fddb1f919c1b18e7fb4d829af13e300f085c9c140c1d6aa2e441f6df00eb890a872590167f86e1b5aa1dc8da60141d8eab6e1f9818f4c92c5c81630686109896d2bba905eab04f2fd82413471273a72c3bf0b05c902e80a1d47bd62d328e77d142bdf15d83831bbe87f7ba96fa85a3b28126552490c4c7eb23c7b34f8f3c2d473c3a27ed28fb9f519732e9e456b0d661cb559b60e9c029ba68a7572c9894aa6e377d1c81dde4e5f8bc181c359bc1b67c15884b98b46fc881e6fe4156324c1b48a487ebafacd26a8b5131f15ab68646b7fff35dcb9fe6d7e766394e437a5443549a53b06826bc806277548113eb086d2e94c3467b9afb66c907850740916d8888b41bb21f9484f6b5c7d42828446d7f524f292fb26f914f3ac5904dfd3f736abbdd4b3fbc743647501593b8c4aeefa433fe51c681cc15fda62aac5a6ed53cebc71dfa5a861573d750c52a4325d14aafd03dafc209f823c72764707cd85acb8f8c56f5a154e24d8e5d01c0d6fd70d6d84180bfd273c0e859939e80b8f235f864bb46f6b4f5f4d705c86a6c933487a5c3becb8c9883c5b29cad156b176a4c49deba834836960c022d95ec055252350945d185cadeadf6ab5c315c380f4531f5d4ef6ba62001d0e6417c280ba5831b43394cff1d1d651400076743df608e89f096e31d4af6931e16ad35e451b5ac0870990f79c678ed0af682aa1a884276357d68c2b2628c5c5c0228fff6ab1d421787603a7cb3b6dc3bec17b51ce9531a37c7bc1d207804e35bdbbdb2e9d9073c41a3fa210678629047c0273093c84930f64bf9edb3644e910dc1b29e11b64b0edea28a6243ccf2019025835ef958c10c2a246b2f433812185ab9d30452c613941b8c6c0a371a8cf2fc1f6fa3afb88a898ac931189a840ea2df45cac378d62c9b0cc588803446f7171c93c174e1755963d3e44e39647be5f7bbf3b9ce421c6b28ba4a434f216cfe08b4673649ed09c607909c0e14f209d453a8c125b3de4f723aef0347b27741d78300f9b198aaa234d82c1c9c445a4c03c4a571761ad963ea080c1681e46086a2f55b8059c6ed96e791d9da67b77f9909c018683a993379948f39e7cb446866382f232cb65c91f73e7a1ac2c4da63a1dbf89b7a23b96381ee9253becac6a33afbcfd253c2103e2f87bc8fd4db7a8f72192b6e9c3b026bede141d00b80335cdb61cd5152b4b07ab24d68ff218648aed0a58852616d3d351c421337d35412be2418df8ed0c764a39d26c02f709fb6214b275f206d46c3d153260b13e6c9aef6068c7a1a27e6edeb83225bee5b1f9dcc462e17bbbfeb3e70712ffe2eb0b840581f617316452c8ae3f68eaa5bdac0d55f8abf789d83ced6281f04d42a7fda5f5e46801c3ad5318d0a276191d1e6be03f9ec9785a8d0b770f34923d4546bc51b3353988dfc3209f5d602cb8cf0156d0d24bd09c5014556fe8d74fe3c16d1b77c1b9bd8be2d1f6be388401f455fc01438e470e56a89ae6deec7f036524d74ca7f39e329281fa45f5b9bbb49172895c2a5d0839ada8d33a64c97996a63f3b60c8b19625dce81a613bad724a197fccf49af99ce963f79248c153c17b012199994a9b84ad6be6dd337caefa7993635e7113b953742aa3200a8cc7c6b78b8e8eb094bb62bd476cbd1237e4ad08e49cbafd6f2534bd4335f2043d651144710823d97295bdbe8d2fa04750c4a8826f2089437462f2313b34ca7c04b549a6a68030df1f68dc6f48c37817e0b5a772a1bdb9610478d96207dcac1f0ad826bdc903240fd550d770b03409e537b012c503d3d4cf38f7335c2d5f0519cd2df298599259f6b2ec04e2405eee1c5f992a8fe1ef237da856aa50c91979a6eb7b7729b406073496456037af5c4925e1635cce5cb0e228aa1ac85ba8b8dc058c38773ca23f88e61d3a8e71497c36ee8e40517047bbd8d6b3cea5ba5600f6617a342b542e8372e748366e2645cd250efaf1749144370043347929939db5c14e6526f2929799deb893acbcdf8116fbf940797d6bf2822fd516823dca62a2130b136fa8c140f067a5e4619962286a0331332aa304be5120e0a663bbdcc27b1681171f9772c7a22158e65a42cb21f9439abd2e0ef1c636b8bf45ce467e18ca260db2c9f6626116c7ab4b169d9fc6b27d70dc62c31eda6ddcc200e6af63620c3180f092d808108f0b127036d5ce43c608770996e8229425db9206a235eee85b3971e6f89520c7f2a2b2d211de25131090ed8af5d0d12f8dd6b37713af119cbde6a3693367071b534a05b776c677c5f591df38c9ebcdbbc640c5edcfbeccece7c62d0f983f9ae7a6365b4acc3fbea6bfd4006288e4821b9e06823f4642b955314d3e07f5f7df9ac0afeb95fb44efd621a74234aad99398738ec0b9b6d07dbf98bd2d264b43c91c824914361faa51e41266e6f4855c8e8bff63730693a396b624592c0e8828375af3445eac7475e87223585967ffd2f5eccff425f9b5c287cc0d7a6b20a849856eeeef1b211c948568397665bf42589a0699ea039a92c5aac9b6a33171ca8e38cb517e08a8d8252a4586d04bbaef5c96e525654f89e40135837cbcb8ea9c8511fd3aadaed392c6f0808706739cac8377a525ead2decd5e937558c82b30bbd25e802d743f3ceca5a34493750842611d31ed9f09b686d764891d5ff6c0d908f3c69b69514be1c8caa016bc81ab61a7e192b32c614a1c2ac079d1bc6f44909bfe6ac641c357fcbedc58da994ab5bdb8ca2545e4978fcb308cabd3562fdd4b2c0970d9184c17760fc1c1d09c74543a45221e1151bd28400f238e67b680efc078641509c472b0dcb229b9d578df6f11a95f94913725a1060f75c1d6c47fba2723dd033f7d80280900c07465d959678b601c2d82732205130d5f322feab01613a8f17bb418d3f4910797b7b1c11fb1d1413bf0af3a04616888455eb71db0d5d50faa2ae7e56eff9e23499bb7658b40ba973acda776315dd5813178ae35f0547c6ad5aa2936ceac2cce017043601d8eae99d52da7eac0823f2cb9098ed0d592f1d3c2db504be70ed17671ec483694c55dd6f8dcb50597ea74cf8a8f101eaf88f676f75afa0ea7f71887770df1788b446fbddbe09bd9a9d4e7d7e46ebe115f19bd9f4c17b15924472bcd1e8ba016a12b3e2a9ffc63e51a188381d4ada91f2890230ec37b07adb178392c3a22816d0171028b835fb52fa35164e383fab2806671fdb5269b6991a58dad99828c88966a2bccc65be6347b9773195f81a33064581afd1a7336464b23e4920349ba89155186c4030a74aaf5cd912a5eb6499d404a7647f73da0b5540876fae8a4fda4764c08de98430eebee85ba1df7387983eb1dd89edc98987b40b1233a4c0db32b20655e48a8b865a5072023a874d6f630d816a0d24796d926cbd2c81df28d76591f58b74e91fbd413bbf5356ad88fdeb8bdaa90e6f49a1e1431b8d6d35cc79a1d68af1032b1239379a40e4cec13e6d27238137472e4f8235d6a3257960d16d7fe4da35ee9adbd75426d1cd604fcd06075520e6a628da360a9918e55c742cda98b3e4226772dc8f7353bef44bca4f8fb735978f3b1a572ae877bf8a65a229d419c5ad20969a2a9f1e51b05c0ecb9b514326b8f38f075f02c2e7ddef582c1a1649f5c93d8cefa0c5c0b2c188da13908872eb1989ed1e193d680d250d5eff19a95e500628deaf5a4fca17932888114e9fc6796d3b351412a0bdc504f01ccb40a20af92c2168f77e224c5a188719393c3c8212b8e29ce7910cd3177d87a07cd40048ad47373bc2c435703306042ceb3a0636e896a868e79d30b81ff8511bca0c2cc4402008043a4b2761d0b392af12c143628dd07a2cc8ded8cae14cafe49e0d16fa9ba008011bb484654b1d8b6b9e5d1f20197b8faded5528c9fed8f565794b73d070c1a643c2893f2c7355f0f7a20dc650f7b97c55a3db03fe9e7ea300457b59c4e027ad8f4dc6b1e39569250715dea286d002cd0dd97d01d765a6233993ad6655f0b5bd1f1417f228e2bb4a283510ee0e541f0c900b5ed5263377abdc1ead1f74602ebdda58a870249c4725d96353bb2058dc01e0101af349ca27b3b9a0c1445a3505ef16e4bb242ec0e72cfd3a3b6b53116105b1896a1c3c7b94c403c45cb15e0702551c4f6bf9dcb39ad71387ab8c2886285647880bed5a44f8d1ac0ec0a37facfcf34c165bc2d933ebe377a84c89a421392d4c34c4f689b8fede04aa67c4f3fa87cb57ec12527f6b4021e7b989595152b224d61cf5b97e20b7ac692ec7ef4c7b63900a0ebd8e4c87a51918546753acf550be3b68b868e4760a84fa92e044c24d15f63cc4b192be3d1d62d7f35a8b561ff4db86b20bcf01d56a728d0a6260a201095fa6845afe759f60ba2328c68cf72d73cfb5208eb5edbb77a94ae8892a804828717e72c5c8c6d8f1bbcc018ac58cf3519205fde165c3d54b54d1a30ea41cacb7ea243f07bf14e274a9cc1c4902d020ca6347e07a82c7a9184a567f46ae51f54868a644e3355c99ddbe89867e53649020d4930fd7189359ee02f07d9c73a02c6f851759023068e4c341238de910625a3cb6a25f7f72db7afe3cfb8b7151d0e0388a76642716ee22e14b32229bc2303a9f1b75b702f5ba4d704f481caa245b58ded2491d4df7c81424c0cba42ff7d64575e3644a9dcd5da3edd9baf90bd16b13c387fc19841d3d150d79ebd08cd3a43a081a272d41bb2bdd586ebda907d85e6b529b5515093d27fd038eee8a4218bf940facc4722b909e4aedde27c8ce689aec395610fbe1d98800bd1c2f02945e19be1f6bd4ac16eb3e8c3c6bc3468f9332a65f36cc3e11f9cf1047fa6f2eba211397c8d9a92c6375641a9efa6c0591f4e0dd00f1e63422c671c1b6380022ef421ac6b3a90ae3ec06f4ca0ebce88d769a86e9929330e555960ab58a9d8585de41b77babadf9a879d853e86b5058c7519adc59f3ac8d416bab44ebeb5b85a962cd675ec19df96c895de8819be6231cd3350f32695cf97325aad4e75d2ed34a7fac81ad7d7d370f30c11a205ddceb0ff38f44a06138812c31de96fffc7a5de22c6048986ad9a3f9da4de0c843e96561be32af1a856a5f4391dc56e60f89e650ab25ea9123a69158d7206b6dfbcace640e7c416908a1dc8c10e18c6281ee0bd5d711d6bd783cbade3375266718b76e217acf8d731484c15ff35dfed800710b28cb4ffdcc087d0b92086f3ba2f1d88494750b1944eed946e6f7caa1323c235cf31a5c352de71d057ad40605f634c39476885f0980e17a9eab13a4c3dc6f5e065cc660be854b2d5eae4612a7fdeeced53bb170a7c4eb28ccb82c3e0897a9f3838e2538792f924cfaee444d5a67d52b7bc43e2e6a17dda4fc2a0d458942811bef34fc86688091fb2265304d59ee469cc5f691932ebffb7804553835d8b4c0842b615d4b47d81ae428b2fb07dad5bf4bd772a4fb726272af9a008fd981c6a19c83d0c5fb11a6e652893bb9b1cd14211616e79d2fc074453a340d0aa5d3b9abde37e95811a3c53d85260573266a69306d8b8dc050a82426380b721b81d93605149085c93871c65fe7cd2cf9dc58787bf1b673c3749473d4f75036a42c115f015c19436d894df4b90e600613a485ca7d6175e75899ff9411b7216105010874b021abf08f4fc79036bce490447dd39dddd696e8362853a7c63c801f082c82191397c26189353b411420b71fbafc5aeac950633d157b772adb8b2030d37928f921f02b405496918098888d574418d934a22e4cf3d5be303a6f80c2ab59f229a6b9a2f592640c93a7f18e316a8dc2a8731662a463563c1a7aa0dd5b817dec50b9e2430154c47bd539d73973f86d664505cf20dae4888a0e90e2af4477e0c4081760706382eb877d782e11e712b89bd7d98500069e8889476d542a2031df491c4d05052e2c62d0ceff9b22835bf4d2fcd74abf4451387f51ec787adf91f51cd92ed3658d9c3d6d180d270c7708db3f0dd2e1746569cc264b4ab4ac76fb612927e023cb0ca1a40f6505f3ee02b3860e59ebc54304b80c13e2f94d11d5377d7a1aa35ef2b5aa806a327a77847d8c6a0a2147e5174949480bdca4aec7c7d9bc95e1fb329ba448d6f26be721469993393e54c40d189b5935d7d1590b07ea686fcda3f41ca172719d6a036465b19216c6970e193888ca7c948fb490b2dc6f84f1e2b042a13a92ee0dab266494dd6491eeda79b73426262e8e9e7eff2128f855cb9b1423c92a2771be5bfd4c6682ed22cf00599ed9526d9c5c1a46a02212909c0bba436c0010fd96e3444014bca8afee3abbf9a8f877a420453fb5527d04dbabe6916a3e6bda01c648a61627e5e64f02d6df667bb55d0ce4dc5fea650fbced509e3592ada6134836542b569470133fad022b3e1e1a5ae36fe9acf203d76128924017989371a3b5282b4804f8acb1fac8881c9f53df0782450ee7f0161565900ef0c3b6c3b3038721afbee6091a7cc820189e77ae76658777ed6e6741e9ff350151f8cf36c9b8a9fd61b3de884ff5c72d10b0a3cba0edb6ca0d6890a9ea83b4e7662408ea6c986d84caf0938a253ff62eaacbbe6bb6b44738b268f8b15f559114ae460ec5e3c6fbfa76d3fa891e337c7d6c232f8eabd34b88486ce997cd842d74664de309b78420ed3b4623c1ca0ac28f3f8ac832b4fc9c08c6dbb9e2d50d8b102cd7ae24c64a44f1a4bb7f3fa3c59bad44ca8ab2fa497a645d9b9fb939d0e0187239cb211be1220f10b675ea8063af5001bfd33a460b018b63c23c93608034e11705ac2b56029418e8c20012360f825d718aa18f455e7aa3d2731fb25d2305db76bf131f9c4d494e4b00dabe32eec85e6d828ec8b6352c90a267829d4f6ea8ae09b02d639d63130c6d3d4b04b1a9a3efaaefdae842e14aeb01897af1c73bee0320e2fa0a36501078b21c13b3c5d4ba7856d9891505133247694d2e8617c4e8b2c38676b85c10172aea8ed3c58d333bce71c01ab358fceaadb515c1c540daad62eb05376b0db2c7d020715c945ae02f7a7fc9f8a70e5d2f18e5d118a29b603a637990e4a9dd94a5e8819a3230fb25292a2a68d758956be862295e4d3a3e5a8db6de52227447d944385d482a7f2a8395f0aeaefb85f7f5d400d604451a972d9138d976195e20dce6d9122613588b3bccd383bebfd509eef9fcb12db2ca0130188528c577b3f7354c8c58a5c1e35ab4b794e2746ea455a8a899dc3fc80c96b26e520cddc7b845b7b61ddc0cbc596831556703022792e640d54b668d6ca36d81ef8a5202c32fc148ecd2a376fb579c7245ae8effd66d47d98944229fa16b1ad0d9da85ee2fa2f5640950c8a1e66a0aba916c880af253b8b7d1f1b46288f4a4636ba77f91773fd22c46d544277ee68c800ac12538a30289fd0c583fff0c5299292ff1f5e540762213a582c04c8f75911c76d38d35122c99ba26105817e2e0cbd1666684d7edabe716aecc93be42b986d2caf60bb0be10fd1ac1e62f30d274d282d6469b09f9b2a4871e5ed53776c5dd9a999d3f6c1b2a9ba90f71ed1000829d3cb186c4b1bfa5cdb89965eb4650eac383f43ec27cafaa00563b1f3ff68b0e0647edd4250db31f7c04eb4e4659cc085ccaef13d4a4b3e0b078803975d893ce472a201a5312ff96577181d9e928022149d709d8b1596300055f178965c391a96157dfc2f24cd80d2a75559ebc34773fe9b77658df8645e4af0c6ca910f0cb3defcfe66c3c91ee55910fd11b4793de97505f69bc7faa42834113744345798b53499a2ccc3ae306bc45e55d8a8594833156655acbb0959171648c26e0dd6b2a74c0c3217e2b125818bd790d28eaa27f9e0647248d5f29b261d878e2ddac051c09584680e995a0ca934c947b6392e0589776094e109d70a7ea52bd3a5845cc9eaa707b6e3cbb3762b089e8d940a782d08c71b120a5169214f6e39822909aeb70d361e34765e1091f6961dc7021c14f0b8043bb9af788b60b8a7c586597e3917f6bd6dfb10eb0199b78f6f05578275fbdbcd2347b71cd0fc78a87a55a6493383da65303f02285a03ebd5fb4b325c457b95a67c0790cae508ca71f9d8375dad3dfc0ba158733a942163bd1b90104d89441b44d19d410b3dec1a184e168bb2f828806f2fac4800aacb4a847a1db56567f3866135a77a16112ce53bbe8a893081e5e41ee7fd2cb31b5b381d9fd3c6ca2d8e52ce7f61f3f4a62ea2dda7a584e6d958df4d0352ee9ec4ac8ea2c3a5743b0b133d804016815950e891766e9c65f814da51d8c6052389177327ad95b3643a57452f271b58081dda480a17353eb65bff7f071cfae9c42db1ad15cb8d7d5c0bbdc9f573d5e63fc74a6ed5bf4c24e70f678ddd444e9be1942ab81e53ad86c2188a62d3d37cd79553dc57fb3dacc1829b602d6ed0a5ff7be62cf1512fea6b02bb82e8bf3f8bfc461d0e713944606e6818b9aa50e1a4bbd856e2bb38262eaf4ca180b37b8a298e635cdb706bb8965850434bdf40ef11c008b9bfdf2b33d1df7688bb04e753876afc834a2f681fd688094b19f5542cee90cfffa1a7ba2b8084358feae65d37d34e8299cb14bfe78489f6da7a4d0d9b73e3300f4fef9edea1bb54efe3c36fabe2ec531b0dd0d5c650472a902a945027bd2912ce4459ade8471c18726a15691b739dd7c39492df270d2388822baa1784088228a499138b2f2222150d51401edd27361f11fa1b209f4991c3dae93402e36b3d623f9854f57e81e17f9cb581a8a455ce7b63cc710c37cee7cb718b2b5057f09642a25f51da288140bc6130e9c4ce8c1ba7b75f79d051116f5a172276efc3468840ecde441afd95a5cbb8d6db8de7a11f98853b710a7aa38450a002fad7061d3fd69ab8e30165c2d773f3d0831e7218dc5c9bdeffd2b002ceaabd30c648517c101155a7c044ebb1a85d2f00284a695e3809128bda847cfc2d86c67236334beef283cb4045c7444676b143a0ce41b260631ef4b02d393e44a2f2334148401f9ecfe1c1eb4a07445ca071279a76200b51424ce259b0b24422a92f14226e68afb2566ae20cf188d5d8d6468b76608a36e70ef6ce312c817eac09d0b6fa5228381cd39766c7f9a0dedb455eb26bc6e507283602eb0a451567ccea268fb48049d0f242b8cbbf72ad7661c2d719d0ce89d86f2e82bb6d41401bc1bbba25a1c31ed69ad319416f459c8ee2627c4d76e56d8343229132cdcdb8ca6c5359d2dace672e3bdedaec5d3a3ea7052a3f47aefce503faeccfb8837363b387e648282640b4d7d2affcc95ccd550144806b3ab8492d08d1b5ab7fe85a8c94aa9413e7b6a9b863165bb3ef241290c592a74d49765fcfda482475400739db3fca44073ef52807f4254669013fb9c7ba5fa4f89570c6741a5c4ab498262e48e6a18f053b01f957caba76ee1b4c059846780fa38f4e35abbe4dec0b859d983a9f0c26b37ec65c6de270e2266dc99743ea7152b12325c7bea1e47577b98b8047c200c6fcfc06f2eb9c583b1cb4bd6e9fe3342e22f44c9395163c66a0a65b60816cd0a4a6451c5681a43119b72a9c6a7444b7a75f7ed3ee72e00fe8e5f73e77d211e200ac83b8bb33097fa2f072e9de3b20c22b6c9a1ae51b8b76375f1c05d6771b8d25e3094cf95450a4ebc4e7500404906cf6939405b8559a7528e97b9bf54924dfa9e3cbfffc4249d034509da2295c3ae2046a5a4eb589695ba0f715756e0bb62a1ae5ed354bd8396127957e448d566e200574b4a91220151f800a213a4c0a338c1882810042a0b29be44e6da81e7ad3a7e6c2b9bab81dea57e243a1df381e804eefce3ed7487cf07a9a50dce6c8a8e218ff4afcd825b9c3ec5e989d149ecaa015712345ac52d00bcb449a2e32529b2e83481eda9e3e096dad3848902d38f4dfdbcee58c08f4db2bdd53e48b9c26c4d83616bf1c5393b167e46e3974b9ba6185fc3f7afa9058ef7f32d7b4a70b940c368a243f8fd46f3b4b50d97cfc031bf8f8c0890ceb20586233eebd041c8b037b903a3c72c28c325935211d9cd8c9f50f5a9f1dba3ce8464a158a5ba4fe1e99fada8437e8eea56b95283c9a9172fc2467e4cfb9cffad5b6ee5c45a925cc5a804cd462bd651773116f5bccc6706d4c3c511ddf9de2ae97aae409bed64d00508f4c16694d9fe3a3af9563003f0d748b1aae6385a685e3daf4352effbe42e17f48fec9f2b46cb753c80059b630c88caa81e4255bd29b35a7008c85dedc2fc5ca13dc1788d8560be76b78080e4d5cd06145368117373a95a09801f8ed0523d872f9fe8ea62ab804af08f90843ba6d22abb614635c3d7ec9747aa3c7383d040d45c64d8fd85b96d02ec61029b1d3618484a4e6fcebc11d36d113751591b052464179806ed7bafacfc8b85278c5e83e25145af13e94dc00d57f0a62dedfddd3e3aa884a2b3e5db8eae829cae38dec61d0c6cb9d133773d6f0e4b1beaacd15c560c6b510b53eb04a61260e0fff4171370861120146a76a08e7f24f3102b4fdcd071031bd58afa1aaa3f4fd179f835d27d23b2ea8c274a49bd2d76a43d5902a22e09397c5d101bf92f7d005f65a421760178742fc5bc8b011d8e78db75d3d57ff0fd94dd5ed44430ae9b05103dcb266798825c836a9c9434a2567b8357dc7d8c65fdce74d78968db88165be2e65010c089d899b01a8e9ff4d416a686e96628aedb0c17202974cecfbb2c5b1b51f01255fc38f18359fbeb179fb2014f2f280eda145a20a1ec16c0d3842c17f467958982c50c89b6510c7e67a5c1311cdcfa63c7557c92c47040850bf7ab188923f6561e60a52f80d7a2911b11f2888f58e32f8b3c0d7e3832171908088b9f59e069ee9bb9e4438b43fd197e6c035b6b95d66d3fa6e83abf9ce71ee69b3be2a420d5a9e949acfda3270a043fe78fd7c572c054a21265111e2aba19b5499246df21b3c6689e5bd7306aadccac04b002623319e9517ec0a4518a46e65fbebc773cdfd58789c825dc797cee9087eb564a2422c7c0c2c44cf298c514969cd106c3f104db9685ae500c4ee18b4512cad3f225426aaaccdeadfe063567edc0e91817c3e0e366b6bab3c3521b0aba7d71a4e5646f3f598a561a73ca8ccaa95d275d0180bfb1074e01d6bd8a601d9a93ae7ae334dc1549cd9aa645a07643fcb7be6fed82ea1c074dc87b6d12011d9e54ae4fe8a525227f5df9c83a2ab91e8a9f5ce84f189d4a5db73081b66995d3a15d7c66edee97b6727313e731ae78e20f35afd0e254742fae83e3d445759438970cf05d022a1d9dd52556487b2492a7ac1b22533a894c562e7e3dbfc6c76a8b221d0b1f00c2cf1fed714ce054ea185dea247325e54fef412a8d062549355b864c8f7a8d0a08ffd39d726ab482182b046c8587b9145cb53358703c8e7405a4c5453eec57c6231e8f7f4aa002d23bac42fc991eecd92ae51d255ef682fa32928548e93c5297ddae339d779019b22a99482ecfc604b6fc754fbb90a51005b1b254660197d9a21fae421f6082006ab24d2f65ff34ee73b057c53d9da5446f1648c6786a8e52b770d459a596e1d84352243aa46baeb6eb85625240ce40bd2d16f5e27753e527a1f922dd72c63df8ac3ad08e596486811cd900b2864eb7f1bc04056f3d496bd8ad2409c05b0ab60e432a07a6a8b0602cf45d987e367e27861583a241f80c920a69036cb1aef9cc7f2025c4494a888313db5792a6f8ac0c93fe3756dab91afd8703b6d814cce54e02ab0aa42bb138ddbcddea8d478a8e10b521cf41f234277bb6a497e56fb967e0195e13250eea5e397f3375f83d1be19dcad94a35d6049c29cfb097a5da092cd7eec11c6aa35153be76c5df8a4a4fde4cb42347b548244abca4e98e4297c7727eed6d5ac2f9dc801f43efaaf230806b546758a61c9c05c402a80d45a2e3733cce1204f8119d234f1ab948e2754e66c17e6c3836ef4cc8825dd355898805ceeb782892bae2301928b6e1b14eb2a2ba865806459e2d20a4ab8e5a3be91a8f43a745ff08031dcff407ab1c59236ea2614e3d1899b1e62fa70b9aa2d39948431e3eb99cf5e36e8ab4290bc36611ef22ad1058c878fb226ce932acc4aa6d3dfbe1d1d8338ab46bbc768d844a771b3c9399436d4d56730f8f3813ed13447ccd0ad78503c2f83ef68b8dbff7c8c4fcbcfaf11521333b30d233d4dad2cc39f9049ff1a65d17077f7d339b97871cd4905893b167e683e00ad8944c580caed665d90b8791f7960999a67515f5686dfc26d2b111d8a1efa569d02a0e5017b5352bbf885b83fc4568b2066fd37d751263eb2c66736743d369c6a6fb774a4e4fbe0571f5f6d0d2cacd9bb4fa817b6586ed417b9288232bbb301fa159773cb500a0cb0e6096ebcf837ef8e948618a65b2ad4527b7169c6bab5db5a6a51c96badbbabf52146aab685c9e44b12445fed0ed7ca88d978227fcc8360936170d148e20b14ef84fc66f5534388243bebd9934c53e0113f07e6466aaaaa675460122f69918d5d1f094a7502386c845ae85a13b4128661196c2a338051a73ad3a42b8daf5340701413d3bcc49ddc3680fc8ecbb47e63c5cb53dcd8f18a7c7511d01c19eb2ef2688bfb5d20a65a4e4bd8b102afc073fcd736990769d38614cce76b51c6128e6410bb7ee36bc517b2fd1b9508696a541f8b9b90f11f80a05574714824f0a75691c77008d25b08a60f0083940808003dc9c9ffa68d7652a65b94b44ffe961582121c5ae16803fe1a2e63be0a73e0a3d5579b3ac028cbadb2f41222ef4e93c10668d21150fb94b47baededdd19405431aa172a4350b510aafc838a510f4f9da7500df58023a830a29dcc50ba4015b7b0ccd8732d9037264bcef92a4628f7e207dd52947e663d7fb9b50a0740c0ff4f89799c6254f24222bd5d7720475168ad2f45b1c20025f83535df8174af0926c5d8400790ebc02c641142538a0d52645409af89f270231fe2246b4df627ac1e692f97fc98a53e8ce13a5400a70701fd91c49746685a959403088520146004d736e7e6a42480292742ff0201f69c500f9f8ec6d35baf357f4ba261527a3d0aab970049d3a561487925a376a5a37f85ded1dd0d950a439b84cb39b9fbfc2be65cc7290558fdbb35dc4b8e5e29cd7f17522b2ea38c988b7dec0a70127cc0401d4d2a379a6b6a203656e06cab124270ebf9744ed272d3ca0294976cfdb8a765f5fb9f120f91fcf1fcbfd764441374f93237466788a8eaaaf9f8c8eb9cf6fae134faab1588a24eab64619b1e2482e8c42d0ae0b838c91a8eb26610042ffddc627555dce74f166d32ee30d3e6148acce5d426ddb8caf493f8f330fae8eb02646cd08c1c7f34867d4ac088c38d146e9111b8c4f88cabffb81f0142b3ed209661676755a3caaf89cf90d802c1acbb2f8fd4e86709d3ece5f2bc60370b4909cb8358fdc8fe0d005b991bcd9b40b81ade1cf7bdbcc269387f7b596f41210d88e8bac3b70dca50c68324097f985984aaff48872c4845d59dbe2a0caa546e5c354c2e4bc30b77f06d8acae03ff0f556e4bbd7f41f1ef8243a41fd46c5ac02e36081d84bdcc08ed63f40fd2330180ae63c06f59013d5cd893a04a006733c872251fce8c3b53166554e90e5fc5313889020235d37ffe043620a991fcefea23b51e8152297a9783f677bd273e9965f94f47220a2068a5e30dc9726559f1a85906da883db02a0e54edd6804a311f8b6e01336be600d8ab8ae63be81c9e55afeb5be24895424c1cdead447879a09e7393ba076d0954b4fa8ce5e86eddd88db734939c2faca8966c2553515c497d7a6fd17dbfb2268980301b98fdf1db5ca0303e5af5228932833d57a870781837d9c5b3850efcd0ec346f843ae6464888060c03eb15ff171923b1f831338e99dd6c3f968a615ca3bb9daf0978fc4251085df154b3cbfddff0ef12a380521994efc27b2b43aa5805b527bc686d262a9fca7db0e2eb24f2dea1c9d837e8c62b8d21ab7edad8531f8dafd29548696920e286d7678e7e21952f72bc1c64528d955771c72526b7c56c7b59984d2e6d18984ca419e4d44178a365282a5bcc252d06a1a5c42a86b65d7aeb6bcee24b15e8d3b9032c26030a227e6c5a30d6556d0e79b82fbe1a45a6e3fcc81e5759e8c49b5825f40fca90eae83efcce8e50f7ba83fb21895d2c66c6d639007ef8f745448cd7e772d0273f18292beb0f20941e9eb8b604ea950496ec1a3c566d51dbddbdb27bcb94920c070783068c06351e70678bb286a3c608b8481cfcb7f0250e52145dfeb605727327bd406edc5de5622f9343c79056a62317638da98bb5a640d29ae206771cc0c5544b9edc7136f7bb1c0bae2010a494880c90d03384084527982c249841caaba37c53a28a2d366a0a6e10f8122710a9e045173d45dc11044ac26740440642e2a55c10c9972048690c3582c8508b081727284249114e98f822a8670a2023526881c895833fbfcca1699e23478b8d75cf780e4f42044bb4200855b6280541262620c202892e885ca10b1a94529a1245191919993094e84efe528a5f5459019fd6164b88000262b59c7dbabb3bc74852f9c7d425a207ae8330b0c8e2055e1ca1a70a404218c1833b824c5c3c451879addcbbbb7bbaa790a8232d62e48e3fdb9fba10300cc3304cdbb68d6e5ab6611bc5b40cc3fc9b092341bc8810820ed806cc48e34a17295f1aa1caa41ef5c35c0c2184440db0b063c409581085eb07224b56444c2d18b5dcc69c73ce5aebac734e2ab967f0d4d1bb4d8e60e28ecf2df70114954a941295ff002560b24a01921ea80d0f210e0c315405d617464728016212461743b87841123a434e00c6d1117704819260d213051b6032a48b76dab7a6f16baf3df633cd3c0da3d97e4dd3b2771ed6e1c93a0dc317c36c78c0ecf4bc70e072a7154180b1d9a0ba5c7ff92f9d521074b9b308d01dbfbd795087d4a1ea148b233a00a2558489098e68c5b8b2c9102198e0eea6db4629dd3aaf6d70b68e6efd34dcd1a2a3baed71bae7bcdf5e47f7dcf6deebd8deb3379dd752d572481da5914d6734d3a8c66d19c618512da2de77250b8085b300598b7004757ebf4a2be2fbc3e14396651388d7ce926ccac973ca262218ba28463cc4ca9b8ce0498b0877e4224fa789089a10042e2099edcd4dcaa81dbf079bd0478bacda1edc420a0ad15a44846eb9101da1886812a58a88b2dbaf4dcfa9d0b9a353a173b51f1886bdd6acc4ffb48e4eb5981da517d8e54f8779bbbfecb590eb235a08b604fd80b24526ea9fb63f9aa8899a687ba24efed6129dee771969d46f933dc6c504692ef411f6c0420c388671debb8df738dc7f46fc58b863028d72efbbc7f99e7b1cefbbefb9d7e1fdf7bdd7bdf77d96c6b044c5764c40ded8de9f0212860052f41f80ace1df7154b32951a6256256f02011c4d27994f81019d33eee3cf2c60df2c6bcbe3d8b054128f0f7d676c24e98c5498273c2e8ebe0fefbcfe274f62455df732f55231f6198169eb0d75eaa9c86d5e224a9e15e7b1c6a4fd8bf0eed3b8bc39d30dbbd54d153cd73afd9136669be4d89ea2be76911f5439d3f3a8f768481e13cbee239ea97f3b490f3bc9ca75f29e7699f19501c5c71fdf9c85f097a749bf0f8e1fac0e514d6eced06b3e79c73ce39bbcfe4aad8ef903798331dda833b648de9b6e7cc5c4c880200d73f0134352c5aa81a02589ed466ca79dfde7fb71b398ee338aee3e410d775dd776caaa2f6b364974ec256b2063fb64200878180c688b22fccc180cecbb81c9b15bf45cd9ab08912419574a80e81431c10dd8f8d2321f2eb6726705a3c85901b79638230e024ec04098a904792c3ed6d348c3708c6009bd40189f277d3c7a8317d8caf5979f0e57762abc3f4316e92d4c4789607eda95faa5862b41d73ae98f2ddaba0a0368802cf4bf90ef3c2945a554a2515149594cd2b851525f4615eaf8b513af98e108383bcc1bf0b65421bb286ff4a3893da523fb4099d74e929726254c445b2cb34cd63218f91aa8f5565b68f871d5ad4ef570f3f76d1b53cc4ab7dabd5fa7068c142feb1aa0db7b4e8362db696ee9e91b267225e314f8baea38d20011d0289f29dd6691d9ed6f1913766f6232fc9747ae542744e3a9edaede99f6a9eda9b2423100fabe8c340c58f8a5a1cd151fef4370b3aca7560a0e247c5fd1680279c95115fa30cbb665bf2248d3837b3ec4393836808fbc14fca954d5649a882081f2244708208ed1e1257aa50e56c15c68285f71ed33e3e1ed343f56a6e4fb40b4ff46504400b55fb99ceb81eccdaffd5e4c8b65b42bda46364ab8568be6be40b7bc851dd8f4f8b1e1a51c71e3a6a1879c50f4558344cbb7c7e0cc9c6ea37b8e40d6ea2ecfa7fac4a9da89d651d2266910b9ebcdc1d9ffa9ccd1989bfe34fcb5c6600ed1a6ad1c52775b2e51c333394dc143a177b2d26432d1ee2d6bcf20975761655db216f78f72ebdb82e9740b5d89efb9aed39fa9dd5b8df5e0767adf644cd6ca5a067e1c5931e1854e14ce45aa9426555f6271ee4f3db13ff287f50840ef77cec158a0a6651fb763cdedcccdac81afe7db7272a661fcc02f8820208971157304192101889e1ca264758d1c5e9ca26439edc117c41122e9fd60ac08801158a8a585204308a2862832da64084cf8e09282942094552c0c1cf0a0b2b222878e932d69e928a5c24c0084a88e8c0063e4e8c60410c8478b23d0105911ea3a21a1b3b76d0b876d45aeb0e9a1a174dcd0e9a9a1da916d945b383f975c7f72a65a28ef416d9c085c416485ad0d3013d4e19f8dee3bef0fe7c44de6027e40f969597b214f291907f423602fe8861c798153bf214d7556c0a27a115e4c6b7a3084595b652941255320b4f268e4966d6b4c7306ccaef0894df9a261faca6a19a651688beb494d6c005403c4eed47ec4ffccd5ea466ce55742b2975787808248db384018014fdbbef539ee6d993c24f02c08a298fe1218fe42be54a3d28dbab90dd3f5f56b145f1bb6e0c33f9c0b74a51a76ceda0084db05085c9d8cfe777de50846af6fe403cafa2f6c4f6c4bf65fe637dccd2eee94a3fb7b9542a955646d26358c51d246394e9ba9f5f0c464df75e67339aa3c29e850755c651fd5d5a15dd55a948c9a76132ef0781a8a8fece5e7a4c26692701ceca64db135513b350bda945fb4b1e8e6a5a2b08fe8b622a55c4c363c0fa20cbbc8e5cc7797cd53cdce2c0530bd415146b37814fe96f402485a10b357b2c956a98b6d1284fb5f8dfcf74b779d7a60e47203fee7cba7d27bbdecd8e3feeb43de823803e47bb1b192c46aa6ffdc9f8b463aa4599a1ca366414309f36aa3bc8b4d130cd1ca42595fd33fd2efda56c5c0145a4b66c512956ec739f57e189bf7befb9f0d480eebd3fb1e57efb930eeeb7e7ac901c8e2aba15d39efb53f6a4cf516df6847ddffd49c7f7dd7ff6a4d95cfeef4f19e96bb82751cdd67ccf3d676f3efbc3621996e5085dcca399a1e198a52e963a69effdf65c78d2ac0ecf9eb4ff3e47b57df7dc9f3a7ba296fe49b3a70678ff7d8da7fd8d663d7b93a3e23803a98bd991e6662e34d8c7c3494ecc9ef88f9a572b4cde90d75ba9db605d69bd1d91f22efb96569def5d169a5a6c9006e9db43be3635f9da6bcfb2eaa07db6853da473f475d8a82625fd3e0b81ba37754cf7fd75deea3113b3528a2abf25c311f0126696d10d653f8f1ef86d1a06857d583e5a9799e51308486149cf4ae65c69c4485a64398a5fb55551db563a044fb5d852aae4c004c30ebe8b482395851bc06e8f7003d865a14f0a290de9b3843db8efbc4f795298f25d178e7ffa4ec6c8f8b1767f0a65842f8452a24af2575e25ec217fe53b1943454525087663d851fe06f8aabc6925547919ca6b4a09c7bf245a51ecf7fd8c7721f7a490fb2f94cf75210786a08b48a3c5168bea4441a18e20d8a08cd134881a42509b498b5ba83d64bbd52215aa64cbdfae0fb487637245d47e9414dddddd30e872f8a1e6987955f93c0446102600ca341ed76edb6647f99a9426aac90c6328101134c49113a82dec108df81093502255a872012b4019a95f4ce07bb69c485032b30c6c10ac55d32a686a11b41375a4caefe74112a018415526b5040a9c2b41ed47f5c89b54adee034c4af953ce39e7c430ed352929c534d10755bec402183c4804010845c4d10a5cc41d343b7031a1453b5d0a1729bf01cf0e0b3e2d14c1ca29321e57a634d1851458978b3007b5c8cf3ffcc3410d23435ef9b0f888444d71814eba747f8c1630a1cae7f7808b73c8215b29991654ee1f9e4031f2c52c3885254e4c40a243a93c4d6e9a58a6d1edb9ce9b1f0905a5d69237974a95562e954a12eb6e53ad9ee7cdc9cc3c794eaff664e65929db2a3ad1d23263060c308831c4f08f1286e08723862c6adb1a4250658bd2d2d0a94f432747087e66f259ca2a5b2e3fe50277812b265f4a8985923ea1ca679e4a93a8d44ad42a031d7577a7947d9b4fe71c00b59112dd65ce39354d7307e74f9f9aa66931b0d4585380cfbef3a72744c3c8676666770e3b091bf7fdfdb339ffe79c73ce59a74f6f55536db1634451bd87e0da53c1ead1b48dcb9ff2841ae3a2929fe21433cb2aa7753b5636a5b89f7a1150466ca5c38cd695df894ed491fa9c2d2d8a97c796fb2e2d18c6184a8bff9cef1836678b4b8b528796cb727240a823e58e2869b13921568b5feaa923c7e258dc0f1784a4ca1fb99fdb9c0f2785121900a538216abf0eaaa474891bac88d4600a9739453be7f4e973ce6fa9a81430115efe43808b67ac822d365bb0c506354daae80daa3769aa5f9049c93252643a81dcdc7ece4256717bcf17474d8800bd9cac5a448c7064c80e5c5b60f556472561b66bbe729f5a6b651f5e15e1d5f3c5584708eff08a77deab74a4977fbe98190694596cba4d711122828aa0011418535a2b087eed7846d6687f4e808d0d8f229b5a6bb5e1d143118f1e6c78f460d334398a78b46c228b7c34ccd8b2494d0f66c3c8cc6b14f652c382a669cc188e21cc6020b8d5991c727833fdf18072b31f52abdf0e15c3b0a742d4666cfc0003a68ecef56779836358d6ef6d7de80f422fcb1a8e65ad691688bbc546213343d24997ce9b1db3c3bd7c30a31a4a8a012e5ee1788543d1ea8ae722d5520a0f0719b95c292a5acaabfc4efdd2934cf6c42bf6c4a6af4979934a4a4a452185acd2b6af9b21720d659582f4cbc95af3a2f3e4b794e19f19f74d69ad20f82f8aa9d4f5221a21434457300f4d6e9bff426e6cb821ef639ecbe0d050076a606bdffdcef7dea30c790cfffc0cfd0cfd0c4d4b93a3e2ec69665fd37da67df7d3d678df0facda1e2564559ffabdcf5175e1a9ed37cae7a83a86d1ae3f1fc568357172ddbde52b90dc775fc37d87626f48cf7ddb9aec339c2435247b6aefbf10877ada7ba71ada7dd77561ca5f46e847aaf8e78725b459906a52b55951c12ec7dbd3c26bae9eb0a7d3a7ac731dd6d1611d1af66957511612e5eacf321d8f29f1e6aa1e07b1d191ebe53292f9643eefb7af2c968be562b12bb3349d3d65df65ddd790befb9e646f92d4907efb9bee513e4bf9147bb33da954f981a0aa24d9779976f93bd1944ad4d6943ec5de90be644f5afd9aeeebf7dd6bb66693a5afa9f46f505eaa6aeadf90beda93e6bc2961c40fd7e5f24dd4f151bc166768781c1909316ba853a28c987567042395949f692977d460a4662b4d541a79838df888a1c0968db2cf9e3f1aefd4cf5f0a1b95bef7775552e5faa4df41f9ef4b3c3c14fc4e6d6954eca95f25c5aaa8785f0a59c53f822c52c8411cc402681e0fd27ee4a0ef449362bbe93189549ff4a1fc87ddf9a5fcfc70a4684c52423652d2422df210b7ba1f99e396136a933ee5757c342adf2a211b85bdb2a2721151f73b279a53db4fb137495ae53bc5de54476d6ffa1c9516ce4b3d46e5b7edbf10a78493843e4eca93be5b5149f995edb5d2ab9c1a90f2a4af49b1a4a7b6a664fd66a1e90b41314cf1b4a48a797c7ebcea286f6dfd51315598c8a8c148a5dd7b3fd33de4319e8b3d100a7294719dedbb9526eaf81fcd0f470df51512e53f6e05f89e7e277e07485545918e6a144fa54f719cf87f042965249457499144dd911aa3f585dfb3fc0e49aa3af67ac863f8a5e91031cff013c5908e0ac59ef8b3aecfdec4b05cc4aef00756716f0a59d5f298eea156165629650ff5b7dc56d17c590440d6f75e826c285c1f5d87f4335dc3fe09dba759611769b1ab218a91c72e72fdb5e73f02bb3c06ace08b35255d2a77ce5647f9dcaca8d8ac0149e577528ed69f93218c60b8b2494f0f58444d34eb40dddddddddd336c76a80485c43cd22dbba5ec96dd537e7373338b6016d5605332a5b2c3146047883b584d9943142911b011524a91a3cbd1b5dc0811a5d1bde9519f714caf829324e56372009131a28dbcf1e231a62cd08d6b17a255267ba24951c94a2529a5accff2ab2529bff4b54ac9a5147a293882dfa3388a9b28e426b379f00ab07626844e729ffc732e5bf9e44646e132a2147143eaa45a8fed330c87f4dfb35c512d20af7cb9fd33f2c646d242f6157555e5952a923dd1787faaf95e7eed38aeeb3adb230876b7aff972dc6f99ccb22f7b4f93a10fb3b99bbb99a646c651bdf5e08a2abfb9ce825c53a4616326871c3336642bc78c0db14e900a37b5682f6a15b4d1a26351a5a5d25d9d06f8f2ffc84b70643fe40dbf520a71311fa47c85bc444600b47047d066c584d477d83333bf1602712b320c61d06898f1ed6fa3e6c39bf1aada4b49431fded52c0d398e9337072825557ea7e60aa2f0226621568c286a3de26ad2623b91cb5d44ee9260c868b9e520ff6d893ab972e145fe830e6b6961df7561f61ac8b9f4c779b7df68531eb8d75e07ceca16376a47997339d33029be5b208412e9dc1a054f46d4510e25a0415aa4ca163bd06376704ff9cbc732eb9452cfa8539a43a25c52f7ac3ad8e23d7f65931e23779444ecfe5313a2a349d4ec4db68294524a6f3acfde78ff594abf93923bed309f7b1de6733ec02bedd892520af47d9a4ba358805a55f9eea5e6125eec106184f9ec415a74df411dc5eb310c51479155fc60101b1f3f84340cf63898998072d5f6bc70e4f7fcbdef31d35450a173b7e7ee3f2fc93fa1ec348ca9c5138a45405f141b1f47aeff8f86215d7fe6d9993f3ebe43574f34896120973779c2c8f51782c2495163e2fa7b46ea288d6c667de99c68238aa378dd46d65842e52c8f1d282ed451ba687c60921de9d3cfc6207e7987eeb7ef8f01dbb367eb5b15543934f4badb77dccb169f72320ce277dbec0f1f349b37488b2e048bfa2dd640822a59dc0f2936619448d5a2ca1b69c11a54a5e42d300cc3304c629f6158c6853b49b48cdbe416524a29178e41e6f61af65cb803c4ab92f067729399b441260f06c832db833f1b01f71d952dedb34cb340dcc703674d8d3ac99f57da6ae46a2f892abffd190b230d137cfde76d4bbbc043ba296f60179c21573039838c21d5d87ec4810057f6e04a898450d250ca6c0916ce1b05b8fbffbfadc0f5e779fd9bcf80bf73879f92e7cce6c4583649cbc91aebc911bab206a11997128b668244c9922359f7749136d23b5817603c7122515246269572774a291fa13db4c89546ae9c3bde05184f7a68f93930a58e51eaee9e6173baa308e132939a94dacca6cf39312cd3e8d4268d2b3f9ba639273b33337363453a29c797f2479939b339df7b667e9ab2867cbe7da584c9b0e9fa59e9f4b72e4bf9dd4b28556278c34104018a1fb0542fdfbd843720e0151155a800f0372008adb013840af535fcf74cf9d2974aa50e4bef3160904183e9677a4509555efb94dfd32875421d5da777787e5062787e67b0438da78b872e61a76c51ff1b736d51475fb58c4d74b9b1b8fcf6f99d5b9e6578fe266af9aea525f4975f10bf3b60618411461677860ce37fc94eff127eac8a62192f3c16bef002367f0c825d0dfb0dc341a7ed7ec64fe1e8433e526cd4e2ab6708f68c82d195a0b75454e96fef467c68b0bef2222d72490955e5579efef6b463d1b6ceceb0bd7f38b64c86cf66f88e5297e167dabe84277f1bfee567783a6df3c5f0b4d906d8f02f7f72abc306fbf2355eacf1e2d710c5903aaa1b7d80f7f34f86c73a203377bee9dd64fa961f10d9ba6ec7993b6d0fd3d3f033dd08303d0d3d5f5c2708d64d20da056200ec6576ee958085845730ac35718b1a06fb8ee42412c923bd874062c0308fbb10434d053d00420bca3c5f368264d8b4716787d3f6cadba708d13d5d965668b991245ccef255125fdcd185be1613ff7124977ffacfca757a15c3939f0e34bce93b347d0744a345fc1cd57cfaf2e2d7bcbc686f92f8df9cfa6bb8ad7979f1457b237e0d7b23638772bcd81c9576c38f72c82639bd54d9f0a3cce5eed18d61f33b6e86dc67e129ec917dbd2de11804bb8186b5d12b1f0ecfa648aff2e1e0def4e1f0de14929e06ef49df7121cb6aa85574f4d3aea0da22327a3508409f6110be5393c1fe0c9df5015e19e8959f0c2ce13883f591ba32bcfd1943d4175ec6772f84235f0dc46468d6853f1c324ee19f5c5e7e38c2cfe9977ea29de97de5312fffc2c93771a4b9e0cf70037cc37074b1282f23e43ba3893aa6085d7e19de866f437ac3f024037f1fba0ce1c8b7ed0e5aeb621fbebcd35d444546afa3a397511191ab7f3a8825d41a1a6a09b13ae875d43acdd32b9fa3576bc8455464645444e41a6af18a7df88783584242ac1769f4b2e1061ee6619da3574a46b66eb0217c91df0eed42f99cd4edae61c30da10d618d50740b44bb23df0ca46e67479a3bd3f6b73003a9eb1f0e6b7da4eebffc70fc87618fb7a71d546ebf4a0f94f7d37c218ee2697da879791bde070748d50f47f1fb00a47b074895f836d89b1b1b47f1efb0394e6df8b1de10da30caa397972a1a3f4aa31a2f55228bd6beaf1cf410e53b44f91ae18986c69f3aeb00a9a2a17af9930e56bd3cab5e2cf3388a73541b8a10cac710b692216aff8c8661c68c193366cc980143c8338c00bd7ca712c60871b0bcf0624ae6b7d79e6bacb5de1a3c590db32f846390ecb2bce9e587031c65eb9af857e44a1739d8d6f4d3f4a61f53265fb198bec3959fe108b27c7f385658be636f25e41b83c5da76d277a58b8edc9f9f6612f692b05b28b65961afc22e12be40676c56ffe8f84ec364fc0008bba771e0af21e457e3c08f0a3d2eaa91869930cdbf2273fb573e1e528e5c8144fbd08b85ecd33e2d8afff2dd32d7df578ee2ecf6fb68b1ba4e143aebe341fae088dbb67dd86714efe82b77b5b8838af9e0f2b793ee27f286f467efa261bc5ea798af7cd5ed48827ad53e3d7d74f9f9d4df3accda94b05830b75827e8e8c788574547a94f69cf2bef9e9ccd40ea6e76a4b9da7748d92887bc6d491f0f1f08238c305c57b3982786322c218b96ea25942a962baabdfcce99137ebd8fd4edf71f7d18cda0426d23db462df2f798965f5dc4f0aa6ee4e58b74015e5e9edf9134cc1824bb403caf12ff481740b4e2b34fc360f6d4fffed330410d33edc99f5eb75dd422f746032b862ce17a93e97a09db49d81b0ddc1e81c8a89d18f1ab8ba6a8cf6fc51144eee83f97b9a8457e2e4a69d1d015300203c241cb8fd7ebf57abdb4d798eb5eafd7ebf57afd78310fabe50296f6da8fcceae8cf34a93b21fcda4aef23fb5cf96a1ea397cc8bc8135144ef517e67fb12bf3c86a8755e1cd7d913a358e928cfe224c149a97fc37df7ac8d5b16a7da9bedbd47b1cc729493e87f5d92ee202e17c46d9e4b2f0de27658a66194a4dd2eac23b36cf6fe5ae8b13c26250a892c9125b24496c8326209b586888a8ca815ad1041ac3d213c1e60b369e53b9cf6a8e44d7745bd6434320200009314000020100805c341d1703420d176acef0114800a769c487a589a4a645192e3484c19430c2104100000000800cdc8087600182441b004c98da248b62d8aa5a8b148b49afb95321df070e5c15cf422f9c1be91cab235b29e438f13149f61c748c21bcc85b2acd24753d303ba35e43741d0a445d8f4c1a948cf2c122d624100db97f89486f31de948ccb87de1bac978a916c265383296dc7cae9af58bcc7b6ae59367a18e38a412c8733a17a5c635820366acdec1139fbf44dae262a8370882d70ddd6e0823a0540ff42b69c6c5b3e11b3f488470085a57343e344f868253ac582e8d0ffb5722f49ed9516c80c71e658d5322565998be3d2ecd7b0817b223846096bdac1062450334cb9a7241de62b34af70af1e49363b2916271f9779ebbcd3a986dddb7d511073b1990c508987896993c891d2da5240ac6f975b8b385fe56b6f9279cc46c0bad24e985418070324bf313955555fcdcf6440c576cd3c3b05d2780892a32e1011230e5ee5e92e7de30c6653a9dd503fa588591dfb6b624f2971e8ffe271766ac3db6d26d5bcf28481b3669b1403457e443d1aaac91ecfe42c692c309b08e57febf4b17840f575523654fd792cc7d10a375bfcccadd94946b8358381ff1fa747eed43563f399918b9eaac8230e8ea88f3d44ad2de264b85c22949686b98fc289e540a63b6e787830b41f0955aaaf98ba69827ca6211a72362698fec2838ada5f9bd248fd588f36956e5673a62a2dfb50dc1fac1a21c6879af4f6c78dfc590b90d87753080297297822543b1d1b146555b23a3d103f48c539ecc7b5e88532edc6250b935e5bc531b598e5041a486b0d75940094976847470daafca48231f80237d2b55df6621c5206a9862aa2add0a8711539ea8da464adbbdda875a7858efa3ef9bc72e98fe001e5b8f5a6ef0a153fed70437c017b650a6d851c42ee521b88ee2e5f595d5519cc5ca87a5f39385173229ccfc5cd21be6028c4cc8e444cd2e9faf0a2f774b06374530e0cf5737007b4b03b81f36f28101598c4cbfb6da421c4c265728462c2b08ff1a0d9f10a858c663e950d9a8e9af1fd9a72f72fbb3816451fc630d2a673f87f7e0ac9dffee5604e966f0c8e708c39b32aa9a87d7a1d431930ed06982ff82f200c10d53a1f368271dcd01552769d180363fb619058cb8fc97d0f47e077018d58f93120e71e03f73fdfa4611a0b5f8a073e70a4b49e4a57668f14a676774ef585a8e710915d0191aecba24e5687910e3aaa8618ccf63c3fd104a4f7030e1efc0ff885b494ff46f73dabfcb573810e967fe86dc7323283d53c91083c9cd1585034d93f498cf6f67621fe0eb992e8fc1871c039aeeedcc96a1099049b9b3d06a3ca027736a0b2972c3b2ef99be9b5b965119b04ec03ee9f4c5ee74a2883c05b8459e71856015914fb16b86a53cb83622d36808338732217a0121847426d6b37fc80e6b2a39c5b542c4169a6eb605cb6d6cfccf7006c2a4b3f9100c2d8c7968e06beaaae362c6c309e06ec310544e9124fc98720a4bf0176a80e2ea3fec87640c46d4855d5ee6547c5a5255c60558827182844f0cec7b4752e55e65b0385775aae5290ee4fef55faf655d96aa12f5eb64d0562c8fb315745d20d566fbd958637d98108f1954005db5785e302b980ab68be0210c929d85025cc690c88344b807ed5d21c9b786166011b0887f17cf159b8342b9002a839f7ee257e23771d4df9d01016881d5fc7884881ba35598017762ba99cb72979885fcee6e634a643205733abc18feb519f2bb519249fdadf0ed48d5949ce2f6b07811eb30d338ee53e62f42f547907d7b3b3ca8a5b2fe5205c03a1ccd50f1a60b903c56f1b08838cd24fc557620e2ea6f9cb2ecd59b05c6241f8d21ad4c7c0451c34bdccdb00e87532520578094d4e6e8863a1e0ae0cd9d2942de493a1fc4e6a864ff2a56c399f132e6035b86fba790082b1a27f9c9b854e828303550333e6629038ea0eee9b38e25a1a4ffef07aa350a63650f4fb993ee14a8aee5f3a79c84a53df839515d67700d0f2eb0b154d35b34af5815a0d42245e6f90ebdc23180a0fe3f8f19138044caba245260d25893285aa10599ca9a200d52f64474dfb639260a53fa1747cba7806c0c2e3734bafe470ddb864e7223e12703655333c09605788a0adeda2e56a9d0d87daf9216b299bc0588642249ca0e21c94a315382a855982e5a55c1b028cfd08d388e7dba17887accf62fa4ebaa6d65550d8bfe96449eda3e1ecac400fb9edd90c345b821ac4353e8396dd7e0ba61283e78b60fcf64062bd8355264bcc552eb4fa1d6530e676664c58eb0f6b3c05d2ce565579212a6da65c170de14982636a24d98bc476c0a695f93132a281464c73990aaa039f83b036869cf0224b0d6519475baafa99554db04b480af3d00090599336e31388b8e4428c5b94aa736065c53f8ac5a22b5fa5eb1e683dc3d518ef9b3cab9486120528c92895133b1e39589ae374d280720143f59bed48c59068408a99292fcd51c5f40d28f03948f9e72e95a807969b9d4d94621385845694e8dd90416163475b5de4644e01009b0e2ad1ee37e6ab4673b7bbf9959d0a7ed1ebe62518af508222d9d6a3fdb36381d442db14ce03e4dfc8fa78fb5f22b814812a928f3283d2837ad5c67d8495cedbab9c963d439ce0968438cf040931b88dba7e23405e5fd69d24e3113c98773bbee5b956e4eb621676214ec085158460c7512d87c64b0f2fa0696b8e381db15b05f996816d14cf11a14d39960ba3220aec5e8d99dd16e9560920143264c4e70d5ae0d0df80c5caa854959a3180b76d4fd152fc7f9fc2e411bb0b4919eb5d72578d94c454886c3abbab7697138f6a1adebc054396c003074bcf229418f736d50d75a9ca3424e33c35c9571076263c41c5c393b02e8afa98170ebccd1aaa37fbb17b653f6274836318d1f489300dbb494fa3a883b422e1b730207d5cbffe13175bf2d36d005222cb99d0d43a760e71d7de80ef7f0653aebe42d5bec2445f48f90d2f8822c15b0662d89406c8ad32fe047ef12a6841bd9f358a54b738d097fc998390624bac334437432f74417b19a84639a2fd2a48b186740397b7eb850277ed32339c4fe67f02083fcff500704d5d0ac931611f026404f6d9007b1e1332cba0a32bc3ea691c0c424d30764fa3e432b0b2042fc28c9c493e15a0698ee7c7684b0fa99bb1ef09ae1176a065e78be067f7f591f373ad9f29de83b1d2442846ccf8265ec7e9a3625786fa920a15967dbf0b16ad8dfbbd293447bd7b29ab960410229691c5120a4ac5bce9311aeba1df1980b28cd63ba3cad60d66b3ce01d300c9c4142065b8402b516a25e810c91300e112b49f069fd801b1b85a5c0d58a4748f0bb6673d485a28aa066bdc452427ad8b68fb243f742eda43485eeae73fb9b0cdac2517d0db53b6722d27a2fbba9fbf77e623437e7b72c37dce92429447ad724ac1f2a72ab52d6ad19b9b2b7c4509f9d6bd4189c3ebec03265550c7781179d67f452e11622f9165b3f9b508e54c0baabede6d20592e8ef3fe72768db5112dc77cff5bc608f4a7144646c32ad95ffc8259e171655692bdebeb734c1aac664d4638aa00aacc897578078d51cdbc9435436e23e7b6026b378a75cc0ef0285b7646b5226b2847f845bebf7e69089b2a77622eab50ac8f1f3de8bf4524c3dde1b4084511b1ed25b10485c3c96ffc4176d3459af6fa9999f372144b77c1aaf423e35bee1c38e673eaf3b51ddfe67ccf1d5e3682609e18f17a1ba06f6579efac242b31ebb9ef9f32b888393d050996481bbd94e9945d304d3888391b55b230db575ae67d71399b2c851d1cd3441612a741099ade38c17f0605f1783b0f831175c19723f18fc0519fe709262b2b01eed083d51fefc5989a0d0f634c7efc9b1d1d1640672fa84b10dededdbc7e1e3630bff5bbf042c3fff4a5983eb2290996da1c29a4e14d98e10852c71a9a90f516ff5c03c506a304d1ac1e123a9fd1a16d901b90180000bb2ad10d23dea10da0c584ba60af5dc83478523d020dbe0a974bb27780df295c0fd903b9bd633e657208608f4e2d2943d248a00c981e2644b697dd6b4b02f8cf11df7990cf23d659819358a7e55a79686c915b16b86283e940fedd584326fc54134401684f54374792a15f19c6ad9dfe841637bc3e24ee4744eedf0be26ca55f507dbd6ea7d156b41d8631ff87e2a8dbaea100b44db2ce605de43c5290c01e54a771678d92e1b85a106be42cdeb38e795d9a860b7c6d0b56476a959a36c8bcc30db08cd0f6001696ffbaeb1cabe0ac4853dd4cea7316d9ce98bcde2ca76c04731c44a241651d6c4a3a74d791784713f47f8a4b7f1ea4db078d58eecc37e3359fd8fc40714c425106954a3af27432d671c6fc3c6a33131040316ba17a91e2c66c87c5061f240fc88cc4fc08872e814381ee6c952592f2b4435f20dd5680ff35199669d74b092f53529541da42e5fdf952f040c5e2c3ccd11901ced00b28a01ecde61d5ca56163f07cd18c1ea013901079e5d13b5867ad5bd8164a219aed6bfb8f52ca5333a8091227753a0277c87ac9da6cb38025e0e301824a7908e9ad472d67cb338489a9960e5a9428d0df1441073783a6b5859170272080433590ff328f64b82f019fef736a4a9dc8825a7f7f7ce413f419c90c01e01562fd71f763dc22e23715c9c61db85b1f6b87251898dc413fa6d9d4af2534f57039225ace8184d7e9903733570f28d96c4c0da7ad81c81dfbc4ec13543764692d59243b419dc64ff68e8f142283c98c33727b37b2c20e3ff7617f8ed15d2b76c093e0234683d4fdd2c049ab8c8d339d52c4a6bbbca5926acbaaf7f6e268f649357d9a100871ff6042e6bb6c503a4c9ba4c08ff2f2af85d16a1a415753967f3728d6c4cd1964b5ac4f82143a45204fde9f2dc112b8569ea02e168f650610044790cb6fe276b1d2c0ad7039df40c3375bb79fa993f30e6d4a056853859ead928453d4849fce0a0bd4f28218b4437bd5e3a63ca4f32af9fa1d0333f64f2595382040873231c14bcca3cb3158755424910b09cd3a84129a1d6284c5b0b834d964882292d94391b1d2547e230fdc5d0043b70a65a61c5b58947f8804b25d0ccebec840cf2561ba01cb8e8789a0d1d3435571574dba56d2aedc943307e0eac61b99cea495cab8eecf0eb2457fc304bb81059532307c0a219641799387fa5751d9f77df1777649c989643e144627cb506c33b47a3427a11edb371b19346f754a1465843ae8457e2464483e0402fe34c62a7deaf78124dc7daf47fde3100311419304eaa82aa4dae7ba97c039c41241051cc3f3ec381937eb4ad5834b51d392b5ef67e9a6ea0a89b5c0ef7e3d25821b7794aa5c511d850a2c42474abfaee8539cd661c1e5f2caa4c5e12d932016267f2e32ec154298cb95c7000e4d4725b3c813e051d0e05ff53c080aac0e94205d5e44a2604b8d2baf7fe6c1a75b6cdb9df1c0579fdb14880fe9991253bb40d8d5e4929418666304aea96ded23c5143c98d681fcac2d3f7363652c75a59026e928bd6424ddef2d0f9ee0754cd1cfa7cf0ee1764574acd8da6726a9c62e4ac6247a587af136ca6059b5d038d71e584b742728c4252b7bee0e6e25ede342dabbc722aa48e99039cbd07cff46d44a7050a2462000d54793f0c0968b0742d632d87521180001ad53e3c32a41294e70cb42e808e6b864c4aaf973ccc26cb0323644e03ca1a759c163ffc8d903c2c3a1478b66a5c4499b4169d5b613b39d0b02eb274ecbbccabc3be01e2546ba04583bc74484b3e956dfa96579d2e37768ae7a1eb9702d495fa08251037257fbdc7c656e64a31f860064ece85866398e2a0a6bd98b7d0036d87a64481ae62e1910c588974b135244966d22c03cd4d6699c5e2a5821c2c291038878f0fe2dc7003e0f8181f14ab403b46d62092b408455ee8461531428b0d13fa192888658c1514349c7c984adf46d9c65cb1c3840339b9510c89e21301163724370ed0d31607c99a46a3ac31f72a265ff5845480d15d4c82d849a4db00fb8a4cb045824b60f36c13b3b0cb9047a53caead371a7c7fb2c8a86b1371356d4a5754e6dc46db1689469d5081faa054054f698b94e164fcc727a77258b4e217e612b490a26a42c28961a412e67ecce07135ecd2ea2da22c0de08fc1fb162a1671f5a442b90babea1dadfb7dee6300187b8ca4c56415c3a01245f54e2c6dc7da3c5e2e9c11f6fa87ddf5c3d49fcc6a04f6a580c4f52e56a49bd6f2332fbfe68720dd795300d9cd0d257272903c58bccf04a4a0aaa82a9e92927e8a53153d8ee15feaa354365925cfa557d0ed213ac51784ac042967dbe2852563b167fcb061cd81121a4de16bea383c3dc340e99a6df3746394c2fbcae8ec1b8da3fa37e3a640fcaff7f14e32236445ec9c89dbb8d10a354ba0443c55cc3f3729380a6570fd30680ea99c7b168a1c9160ee009366eefd1dee174a45dc3ca7ccc5f0d1d1907b585c0eb24fbfa3b1dec35f319df9c377f733dd736027252d52d2a4c0581bdff0abddcb13a7e2a3a8f181020c6d95263119dfeb59e14def650c1aa603c5fd0f5d1d5dd362131f42f4fd63b7417b1a6c7119757e822a5a1ad33dda18afa686e651544f2d0ad474e66626f54371caaecadcb469095bdddb204826f921f4185959d3fbdd7bcff658801ea612d8227be7ddb15b73788949e31e208a0379b8a94e11bb698bbb276e72d158ccffffce5ad35b36689127d1a0ed25aee1724c3487d3b73a13d5b642c90d2d43cf15c3ea55504aa0ed1482e2ffd4174c1b50535a3f6e85fcaaee16e162a448e5e083a343d10cac3bb868f358be7d5630c2a5b7598a06589b5bd148e7bba63415809070a54573d0d7b9a4ee8d468d58422d680c2408770b27a0224e9f0ea560dc9c3bbd5fc21f3bb354324eaca61ba48fbc7980e1f8fc8ec957ee873cf919e2c858434e7b3e4fe710daf07ab263f0fbc03bc711d0a560fa2d14a5dd82d1bf9830e4ff41724bae4849b2eb0c95326956422aab488a0835054b344de4fe5f92f99cbf98703be2f1230dc0ec535571a3f8d14db669656bfd01e2136acc3f095eedd4ce0b68560f3e9144fdc7e542abce59916804707241c2cf4300b2ed3c8ee07a84bb175e63541afc93600500626cdd3e70836ef5d7f68bbe80aba7020ad065fa42d3c7130a5bee7240a58340539abe45c1c2f6e087373f8c4b3dc282ba93274ef2bf10211f504a903e679100b494d5efb9acef81565d34085e4a32e311ad9614468880aad286cf092737191e5736931fa4a4da502c16470335f6c0ad4e6f6495d71c82ac3530d6c1b0091725a2134d3d04da4a4ec074c1f86a8afa57eb898469f104482e90cccfaf73feacd41fd1b9fa3ecbffb7ed77d1158c31942e46fb29d3c2bdbf4f6cf3c598146c84b07fb4ffd0e87fd33a82453d2ff8612a0ee0d55dcd0949525b151000e41362a93c4e94ebd712ca4df295d5567b5e6c6d60d246f355c6800be6480bea2911e6281d073377d893c7341d36c744fd37ccfe1c1787edddf18e76e342c3b24e0dc5f3e68f01786bb2312f225f7f96d294c5462a565fd3cae8c6645cd2dabfc246f98d9cc602565fe2ea48861e0c51b975fb71aba4da46dd98f9e448731350522c4abf7d90adad0c300306829670fdd60d63a82f6fedba8da18eb31d2f26551dde6817456adb6e9815ae4f3456c96c3e5a337711ad6ab64d7a4dcfbcf76b60949bb409a85539a7345dc6a57146bf1a1a74213100ee35c726cc310e194459c97ffb3842abc5fc0f41eb693acf5da5e3b89f7f27655406e9e51c6b0240cdaf175ab1f2f6afdf57a3f9e5649a3949ed1974e5da5872f293b3eeec930467e48ec4c56b8b69bd188aa30698067909d766a94b8bcf50c4dc84d3f6e711dce5eadf1b5bd837388d4e11242253490683754816ed0bb08beee67509b927b767751197d0a3cf0425666519c196e87b82e61bcb9e24463be009d0e64f5496c196d90477695705833b3185d4815e6e24e5ab326f9984af16c61769882d4bc464ce3ed359de668acb8f61b04bf449c9a81b4ec0cd36d549f82b36e363577906921ddc02459c937795d3d2a4670a4844c40d786e4b10cfa0425e1a457d42deba4cb454d8b192f1ceb01b9dadd752d49b72b64f55bd6c700aa58d090e817998ca2e180146372c3cdf1eb49bf0f99c11fa923b1def54d380d1b663c96df8a98189596840b17f7ab164b06f849285d9deae7f87b370d110b0eaa11ec19f8e969d53cd9d49703481086c462713160004b51a3c3bcaa7d745e288eea4bfc886c81296a1ab96d1acd7828f2e3df291491e4aa64d1811efe439ae7536602705ba93c63cbe24ddb59092216f7378e0033b8cac95f7ec1dc83abb91f92187ccce987e7fb18984d119548607afa39880fb4d4f80463e37f2476b803821e4df110e776aac31628f398d877ed7ada77865bf78ba29e2cb53b48ae11683296a92534c9ff79c29dc8e06df824831f028db41381c9c0157a36ed8c7b057815fc639cabe07ee4f7b07587d519c6bfb75df6c51dce18559198bcc5a342c29786aad8b6ddb3981bb6b9c993d78c3693b1c05496fe328d669c332b06a4eec74548cd6ea2ccb55fd734514722ba90248adce6882455c51b51dc140ad21ab2028ec816f368a0c7bf2b9a8f32035cebd682d028d3b2219add54007684473a49d523286656c80d7d1f0efd0567e83f325bed64cb666f17d96baddf5a4dd83b7bff7fa604792e65221db60a074dabfbe95057b0cff65e37ca019f9e93ce8e6dd088882699302ef700695d153cc57446c0eb64f6f6d61f5930337975e4c324ab457a8501b6a48ccfe445d22a2d6f15a046404ea5cb3b87450df3b2214b0f2ba0da881af61ae5b4011d30284c770a0d16dc05ab80ca64c244580595da477039e5f34d382e51687ebf45e47afce54e130dfa91b1dbab875a5b9e6819462d42ea92b25eb0074a5ddd03dcdd5d887962f4bcb37d66377d2e6a05243bb0342b73529f650591408b877bf493cdaa35aa9e9d215c2d5b51148602e6ef0cab799edfa790578b1d1a97983ab94b97217078a48251c7db1d091684d911e9b29c77c6dec80066c0c335fc856159fb0550eb28e89461088347ae9bbdf87107c83f07adb9f5142317a0910ac036e463e4b7b70fc20b3f6616de6d097187ac36789f2d4fc463517faa89c20ab53460f66f85700593798e429cea70dfe757cc2351be0bb62645bd1eff99bee492d00c1cbdaa9fa27fd897e59590ab9d7e99a353aa436b8e6b668bd8bd64070be78691d6e22c0d7159e431eb8ff1cbfbb69d332f151744d4419e96a501b8001f0c6258a8c157f8bd3614da86e41cbef0d5ec06993ee3b32d20ddff4fce557d1444b7f81fbbf7dda9e38e33ad8e5fbfbc59aa77863da368832fd68bf5abd9af2b8453cf59c17e5b16f9a6f9af50283cd1c4c0e0db15c33eaf26060a6ae0e1d228fd7a9e5af181178d2d0fec2aba475cba6b9398287bac80902094fc269e4fb5745a2a7e60e5c78630c5214679cd2e5ddf8fce8b40f041075a7a1561b5f6680aad4384aca803a921015c652150a5883b9c06fca220227711748235896d87e31d930cef51e51078885d20b37d49add42b47a8ce7ee77a9ccfd2c6acfee382a8d5f5edba4cb73111b1eca4aa853e2ef4ec6335b74f56467f2c0241101b1efbb1092e58db85e43370e5f3ec16eb7fa4abd2347276899c3058f3d8c55556766f122b334d415602c1cf63b0c713c90c581618c52620d9a6dc9a438c98bf8e301e9b093858dd7e4d13a83dd48aa24c0564131177a00129774a960e8a77f5b76f9a2bb8e6816cc53fb866bfadb45d3c4e8b7b8383889cdeae41479a6782aa127de0d79149fe8795a7d036394e0f0492e1119b7a4d219b7809630a9bae3d16499d75fa6552bf49a394d9cbdfe57dcd534c6fcfb1e6f982c2028c01d6732f5b84ea6372d5581bc1c80f8f22097cb6b18ad2015db4ac46796cb1eda4fc15794254f7b0d81ad94e0181a5ce1507d5865feeb1763f644b60e9a195576ae02f0b2bc6144f0cc3d927bba5bd65f48f85c467de209253d8e4607a15b6dde23ea026310abf3ed46ee5c71b079e7c3032009a6ce3ba22e59c00e99babc1f27494ba573e11ad94f99bc312e59ffdf247da66b67c025562b4fdec2b26a4c1bfdfe09f1a7158b8e749e054c6640fa656560d4d0752c40acab2cd6e9d8f7d848742b818367513ff5f2d7b5191f535896ac74189b61f4fc7407b0e972f77c48cc6fa4982d046e03cf5bdb7b3c4382282aa96190a4d58e2a38bca920402ac204c91c0592b06e14276b8afe26a09f24136949675a27bd534e822b4fe5a89cbc84ed2655a6a9c28c4197f391c39b450d51fb6587d6760c96c88ee0d9865e3111a0493b44c30b303b12c0d8bf3b9088217bd96d663eb637727bc188b0381d9aa25918b91fcb68b40cd2281ac5e82968bdfc9e8c6470b28a2dddd86ff5d0d4b83abc2ceb6576f3082dfe56872ce30693fb5914bbd000f22cad91dca535fe981d7aed33357d69b69edb96e7d237ad535f1f668e34c78f242e19155e373c58714c4e52c77bb9249762ab78ae7fe0d0a42476c45cff5ddf1244baa280c6d5c799a53b1fe48e6c40fcce07d644a41a86b751bc1333e0e42a29e3262e83cd79269cb432a038ced6bb2e088eb8f5f077344278c8c1b7825088e88ee0c1a6fdd90962b004df0139b6d5b1cbb5afc4b98a0392eefb0853ae6c8ce41a1c2878dd2dfbdd9689cbe489a592e4e2c0a1b2f8fb1e246a8d01e34391c35d9e398d2021686816038bab3885908077bd2d34fdd06226dd2f9b0b9ea515b64841f012f0fc954147b05b9ea7417ef0cfebb8b16233e16cdc2c74a8b3296440be54ac5c2b48cec5cd3e16ce4ff616c3994b44d02c7d95186585a15432b162856750639048785f777f14b4bb447bc50b646168c43d2fecbad35b921b4323845ae21f8c159d7c79641e8297183e05f0e2a0980d321630b317ce6511a15aea79281fb2421eb835f896f4ce3e7dbc92ea702678f676828a9bfb14ef42c934475c76f51d420cc5d749b638164fa0663dbfc11042555dcc494d7b91918fb5c7f9534df11e02fab3ba553e36b7c7821e0a46f4c5499400e6ecbc356e15c99b4ed04b3169a8bb91bf9ae11221a206be3564438a27f5e5420227a1e3e4048144ac4b3bdf3909f8ba4b23b1689e94dc94d38d5084ddbe5d50feda1f289a7d19d25e410070392a2deaa8685f9b6fcfc5a0612608829736725ee4c67953fe94506e35baea4e58a019603eed6b88d7e8c09099ea1fe11d2e859a47e99e95d10bad335214348073a3ebed91c22946c8b77e4c134954e863413c7007133eaa779488359afdacfdf8871974d653f910bd2f6f673811a590075d2826dbee34c304cddced43f3e1074cb0235bd704265384f8f002008209c6aeb7e911ef7206e284b18b012f3dd5c21126685a8e1970a33d0e36235005ebc55dbe717118d43687ae92bcde045a281e0c0e385ad7d52985333fe6f0b6046cb737cab739174e84ab6d448b1a829c5d1208fae256de776023c4712c82d1b28f24604602b6cf07767f1670f15acea0c70479787f92247bdf013770546626324c0d8714a5889c955acb54462d8da51953d7d61aa6417c7e0c94b7316c05f2479bdb09a4d722d860fbf1666a5068d161cc959bff61682a022f1122d97d1a54eeb3206fab77ba92224f64d260308731f4dbf58a1e5e3f9a0752b649924d060b725830495d6c1bf91a1a3bc068ad4b42a9777a43bce10a1817a3438d1e1e06f7c23601d09291a8b02e340ae7e14cd715134984d0736f7c1e04c83434a2ae672979f33792d7f2580741012a4192f3add55b442592c4fa2ddd4697cedd08f9e76fc0ed2edfe6e2139c2f87d02361308228faa113e4475e308f5a63da2b9f39ed315cc2d59fc417202973b678ffcb4854e40af663b0427b036a11f32ccca609586dc8593621255e5a85474cd7ddc519aad837b26eb2d9f79f9f2749d8510e4f4cf423d8c312159e4dd85331fb8b3f2c89272eb6154f7c8147707b3ca19bbaded6c51a5322f81535cb0094ea00cb1a25f7863e90f3ecc16fc4bbc500548342a2ed9b40c89c3104fd7e27c353a96ee6ab3e34eedb13750749b98e1aef7c9f6ae96a57e2a0f408125bb2b3db534aea7982a4e026950b6c5d60b3da3865728851bf89b911ad4fae15d9033c858cc29ba37ca5283fb580dc2e9b9791974d58be8a69ee59bc33a1b761bcda116b36111743eee43872fb3cd2c8dd1e7ec348142df1c61b75aec42ea7b6c354f2d940064961565bc349c82843f1749dac83fe6cb40ca40849ec786a4e2e7521fb3405833d9c51e56cad7f6b7d8782d359d2bf591e629e0faf0ad660f069175e0e4d1f905e28d3b9d9d2a2daed1e3c4a56ea02caaefc7c33c05c2c768d04ecd26ac9872c225335d37e26b9be66951c2468854f091ee4c569d129816edcbd38092d84599a1919b2a9c422e9432145c4d0fa9f3c402837ce757d2cce431d3f330aeed24e9c96ac3817e02a36b8bd787857eb8ac2add06f7ff5e458fc574c2242ad7dad2443e688ae1138281789a9d21d654c689caf4a6913d75b471af2348f2531c2fa4d6eac406b70559c48f6c3b2092157494c5e723e28834c28d0b9b14007640375d4453d65eca40e7f48868049973d3dc754a11913f14df421d3583feb5fa5eda620fb1cdc6aa89c2d1b58a688f054acdd00c5270b31da9e973bcf74e044198604c4a3753fcf8de11c92a2b42f9974cd8a4300d1a6ec47611f2238ed2ae407e48bec3d5fdb682479ab5595c52fbf646947d20a88f05707dba370b356b2edf6eda1d872ae6645fd25e10909e4675fde81503794bc219fddc619d9274cfc0bab8c612a9225c6f11394d7e095e56c04d386747a86db9009b7f2148e7a7152153875e5e3e399bca0341419448024ef46c8ad989501ce65f8559d7366734c621ee29e34cebda786e8e4e031bca51e21bad831425e5969d63d7c7f9c4973ee335653bfec7f6c4a98223bde8e750e306baca600916e157c2762ee389c13478f62f7880f893ec322013b1fdebd3fac6a3645fe90107f56b3b55b2689cd928702eb2cc2af7757cb5b259c672f4a2e7f1a1ec57420d068cdb2ad358b5137f0bc4e41cf6af5bb59340d08d6351c89bc90029c69d78ee1293fa0e3440e7bb82bd74002b710c9c8a35cb113ebd7ed85306664b087e9c8870c2ac5527b7ea68b75390b9ea002f138037c044798397585b455d994a640856b05da4da55609456fa932a6e2eb037b68c14a75985d4d4ea47aa7bdf6ae0aaca9e7513ecf38c77dce9b7a045c478a4857bc2cace99dd8234851994b3509bc534c0c208868056d4662b35233ccb4d1a26c25a71a68fc7fd21b0bc2ad0dcc44c8fc2f8bddcdceeda1ee25d483b28fe20740a59716bbafaf3125f766c68915bde0779eb3ca2e03828b85d857596f344f2b5b8566806c850d9f78c2328eaf93964751a08dc02950078b4e05750ca924fc35746117e88c14d1be9ac7c1628445bf6b515426427f494b9b82f72f74349ad1fd242672951c2b020a6702e83a1f715c3358a933213f534681526946d08ffc180268ff48a015f094c2cfbeb311d13cf7c8010bd3d61c66ee15897dc91743b2757d036bf2343fc8a64d014de1c2ded1187a75312bc2ccae01d2cb58e0aded867f6cb7e46e63f0b98fa80d2213181a76301742f04d7909f66b0528b904d57c486f4b2f826ade02d147dd5c5748de205b710fc0aa22c74d00dd327bac8a953f5fa76c380c43665c5e304488a1a91d64c4540f79f969427bec25afe7007b13a0991f0a3b76ed52ec59ce505d00faa8ae0db3d659c209087621dd1f0da8dd7c4ef5ea49667d2fb9f5bcbc6586f28221ad8f83e59b5c6e458fa9389c6d274429de404811c6d4810cfe0625fd3a245670c5faf2f16b69bd4014c35fbb368756e5397887e502c3ab7094fb90f5e2d364de5aa6c1461a9e0c2b9edf97c87437e61e652f4df38c6f6bd934d7a0f226ddda96c458e9e367f4c37145de7f3ef7716bd5527eff79da9ebf38c2a207af41c25e732e04748502d3dd0e95b43db8ae4011c85907bc0a357a388e7cfc5d7e3d21b452e02cf155dc8c9766fba76b77d16a101415eeb23166cee650fd2c8c20a4e57198dbfff47d0f9bd5ab4b78535944f828e8ddc47c15f7c8801355f4a2237b1a056571eaeaa32647f1d89ff5a73e414a5ec9f44247833f588501287174d2e12af0a6e6e4d16a4bf782585fb53d58885c08f8d562f5d760bb91e01f3ea095682cbb13f0b6b35bcff95da3170103728737b83e7ebbde36b7d3dd1597c5d03dce93e22f3d7ba31226f70778aa20d4d580026297947a2a60e4ae516d5543b2f3eba74c6d00c59dc392790c61129382b70a31f6489ee1074c742d1c72ead311d44b96187db790c82f31b5b59118bcd1533dded30deb6f22fa9bbe6c2feb07b43c9e20fb0d481c1e1e735529a39b8e18fdfd2aa86871fb60cdc2d7359034d46d95d00b6dd41bda9f62a9459dc8c3396ac21778a71fd94fc17f3ebd1a501b1b4979baa0fa57476895c774bb478b15e36876767229cb1c60165aba275f4241d3712a6709410710f79f98c723d31b41f569f1158fd5298a2881341a0895ec018b1ce11ee4a8cd54d4d8391923b3647f7662ca697cc5e4e7a338600369e38e8b164a434897005cd20d19c417f73cba8f034730586c09bd59793029e1fbe9ebbbc8c4d290d0bd5018702754ad23a4d94705e5182fe3f04c335e3bd2f2f7e5d3ef2fc7fc02f8adeb9e89687ec6aa45114a2782faafa69a932656d4c3877f81c79180df89b0cdd27a133d9f29634fa6bc743bcc0b0632d02ec29344269f3ca90587ccad0f95e173a7b08b47c16b289a086e8e5a267cf2edff3d574032cd2b18ba6814a30e840f2531662843d983fe5acfd46cf4f98052520b1ed4d4c3b993a4adf63e6377b1bdbfe9c33f6caa2ef61acffc5d3791492fabcab904954af7c9173951e3cbfe6e97c6c215d88cf85696d7d7a9a40416ab5b08a836d7127885f66b08bac5e7ebfe8e770d2c42403daf8981aa4630a9efbd01ee1508f507d852c36c98e3cceacbca59a273e50b355f906520ea5f88088f57f81c8f493ccadbc4b5d8e44961687e9db62a63a5fafab09aed113cf5b3f5b442aeb8db0defa25a9cdd39394da32816f9f866a7386b717a396cdaee3de84f3b6d99d155610c05cdca257c715c701169d99c8e9d55f641a6b9e7842ea75ae774ed20ad6eeb309cc3f00ca6ae3388061a24dd6e08f27fb08bb1f107b5f716e17f67a6f7e2079345ff7f26a9f94d6ad4155364bd6aee126aa80761e828f1a354a7b239328198a3e27c535077e9f174101cca8d8c93538859a478abce0d69aed2352427d347ff1002fc13478cd76285e3b627829fb42f72aba821122b4abafebbaf7b4cf5770c1ae6e9e6f48519493752dfb506c2372e2d25ed97b08805ce503fe36d1a61ad3157cf2ca5f8f1ca19e3f6e102b6c21319be3bd4ac8e089272af2b4546189f2386088957448812eb43ddcc860764fd1d27a60c2d2918ab81e3aae47c3bcb0675f4bd8944398e1cc52f650c535e282177a29cb57afaf68159de60a6f83f8be76e293f86d1024f875bb73f385abdbaccabbe293077e85732891b2727c50f5ab9c5b3dbff441b2c6096b6f210f9cd46d44e408d795b1f2439a2abd522123109e09da4bf94f3cfbc3d98e8afe28f5c00d0178060609f41f9e2f594000606ddc808428e16ee954c60b83dfcd3afc2ff671065be7a62998a5fbbe98c808f6f5f01c162eb73fbb94c95ab7292938e588336e3a76649b81b2c2c5e58620b8822d671d8444f8ed7856cdc0418190b48978f07c65198909790a49f7d132f4cb08493dd959bb54cf5c1abfcb010c19419f089a88b4975faa0fbe294c1a92486ae476ebf858b5bda46c7e2f3d2ec1b62cb8255e69b8c3c463f0e4b135ed0cebda85329b4af49c3d712b5041c5de25d97285041d3df2985007d2e7157222891f965816c40c913f8d9b89f61e919c34b007be7a725c673698060b88b81867b7fabd548b37214ec0b1aff308ad916be052be2e521f650d3ef5d265749ff43944a8369ab19b0f38b41c5f34e1cb7296f93e1868a7f780054f57950cdb26dc58b8ade63e453ab945569a2caebb7c942b463ac74a988c055d3a628b63dce0a89e2b08d1686f0e838769aa450c1f246870972d1b90109a0c34cbc82b86f9861900e278d3e96d6ac4060e2c6d81c8f665da69f12de84f13ff959e4b5dc59288e643fe3d0453d0e3e5358e61f0cffed3aa5b074e11f9382568d7f716fcea728fb00b2be971a25f3ed62548cafc655db2a764a1c4fbeec7e7de6941cbca786fd4ec6509f87e4f5544d1761558431d927fb53a4e670009948c017db101156037c6b2da8fa69a228d962509095222624e2ebfed11ac01dfd5e1391865e6e82d9af42e18144baae540d21fe6a7c821bea880c858adfa9efb0a950f7f63fcb18fc1850897e6fc6023aec9388b10443c4c4b8e660bd926397f0411f1dfe331af408e2d90a00f05186c57bba8c72ef13fe553ef7ba37e8a5223e4cde6ea900c73f9d3a68e8dbc8f29937c67253ec627f0c058eea125ab124479cec91e9676d3d4c2c3bf15e59964a59bf9f9e86e8ed884ff8a412020f84fb7af53a9558b52765538736e558635305deadd104dadb95b1eb312f5450992064979607fa9258a269b8f8652b73bd25ba039cb3bc680be7f17abe9bc4959bab859efa38ff14b8164093ac1a37788b6cbd9e085fea1f8f318d8916aee0c9f60e4f20c18ddaf8a52319b98c01356955a8a7c19123349e9e2c15126c47e04daa2b64ee39cf650a26cad22dfafab16c2ffd7cb29639d241d090ffd16327647a91a4e2b73ebf22522ce255e6500aadbff58ce5f24e555607a9d5d11da54d64350f0e71d7190f13c0964679f688faf5b8bc5f1af6de093c99afe3196255170dd8bf5bb1daf75f89d874a5a4b0eb177ebfb03d69622d33225d6ba29a6ad4f285b8f6b71bc9538266e5e6679d528b321a274d0d2cfb9be0858cdc4cad8938ff76e604fc30a636c80fec66e66c0a4e913d05c54d7f72bb6f7ae72edeae08770f512c2c3559d7c96a24059741c0a0ec815a615a5436c8b05adb8fd8b67283b7b65feaabe4c559a361c733990346850f250e04182be49eb187ba2edb4557ba998a0ebeb7652012678da78075065689315311c5ac9d06f9a259549f9f1a5c814f3b852116ad05bb531ecf5e034b6e3d9a383cbc0354cd72747d3d30732d62666df306195b2d632c06970d8592b07f1c8e575937ed6487bec77575644b75efde3177b20b06a8d4f3376f81e4dc810b58ce94e0c2d5010c24319ebfeabd2bbcf8d5418e7217f9b2ce9a9e0a04957410e6a6854c01d14e202d899ee7e7fbfbacfd0a0fbafe01ab0bd26f65b8e2e4f4bab6db086e30094f74dd2383da33dc96c5bf512a2431c7ebaa8e11b8342c1268009163b59f7a4293513122f7abf075b82ccb60dabdf175d6039b636ae729fa6b4b7ac7287cb6dff1254a95cbfe61e679ac86760747606f5cd53b44e27bcbb1e166247272a63a2df29f81f7435d9757d8efa25aec9cae9724e1e6f2ba3523228997fcfa89296f93890191b30221cbf682eec120a7e9355c8e452127134cecafa2c578925f17677f43d48b6b006ceb26b4f889df708f0cf195350372664d21a0029d31d4d109e076f8ef01cf9c903895f0c430f33508fb9bf9057bb036b9294cf928db6dd8a84ad03920da1a8836e91fed42187e7617c34f8dccb6ff1e58bb92fc810a92d4e09ef87b96a7129c0bdec425fb9ab5c9a00a7d298560fbedae4d5cb83f35eb140e1159ee0ceabc463bf17e2bab016c96364a00db39b61dfaaba0e7d21743da30401275270dc08d12109126625eab25974657475adb8ace9158480fb8244f95701e3a04ade39e4a8383286cf313c764af6e823cc3aac9751823ea13b714514e61920c8264a536a917854ba97fcef1d1c6c4ccd5e7b8b9bc6d6e069ec60d012fa83a4d31520bbbecb61d24b4b2577c1918d8b6a8f51e5466105f37f53929fd65aca14906e356f6561bd7b844681f30c642ca06ecd31d1c6f024f48c944cebb77aa6888b4e2d2738f8242c5bef938e6dcee5338b28f2f1b88f06736d86417a5953042ea9effd0f4eb963676368afac5f2eea25d1a91c98697a0f43a61b648aa14a7313943e5b024d110b57b6aea5331741b25918f9f8adf99e78d46f23c61dfcf0499e30859760410f8512d2eea384822f4183923c4e348ccf24764443c296a47a56e3a5f91d0c82568cf99a108f076b815ddc1f1eb0e438b3ecca681a104c4980e00f5e622fff9628732e26c84353c549d1d204e02fb6a3183e9609d1a3597c368643ec0c53d0f5dd3588bcc4e3b39d8be16a6016a1cc77245e4a251129a6e2bd7202dac2ca6822388d0f23c9378d3aa690245360dae3876b6715e65a0fa717f42200c2d37681b44703299ed987cf333cc02e3669cbdc93bf4e79f4519d5bf997b6fd682ef03e81e3cc3d188431f1a46a5c02f1accb60053e9ca7d828f0b99abdb16a012c8f76c8c2487b7cbda000dd4dd8c70244c5353b46e8759021de70aab1a750b078d11d9abf0dfc555f3d70e07d263a4b38ad89811a6360df6c5b8973311720143ad3b28f8facfad03a3c243f75f299cebb9a5c0a7499afd0371d8fbcc5743eac01afbd73593995bddad4771503214a925cfb80e28c83eb07ec76ad24d128c041d680acb27039ec485c42d28868c10cd3bccef43d19a817f2ba3107ca786fc2f299163e767312f9af907de09985fb2b01195994c87356921667c0f891d2caed5fb43211236188345c146fb7b50df3de87b7b6f4201d7919f4291110a223b97f04b221289caace058f7051aa946a2abbde6835e05ca6c1f46da3227c57d4c5d915124eb4a721e77ea8221210a79c66f68096e293d4ccb95a0368e96a63d66046d25c387c0a4bbe37903c2fe91d1d0ef14a57d539cecfb9a826c4a09d8dcaee3e6ffa4cafccb7fd43a60cfcbd8af0ec7054526f03f904c14ed4f50ca4cbce331ad456feb64c581d8859dc491bf01eb602a2a1589afdefbfd54c1df0ece9b63277ad0bec082f35d444d2fcfdd8c9f4a34a44870fd4252c42a0b44823fe212bf0cdc7289903ea776165775926c6b60d8b58c46664cec84ebeca4a2a92bcc82ac9946efb4094878bfa493cf7091c7d499abc9707db8aaa0a5b7391bcc5291af8f7155e29366eea938bd0c9f4a95449fb8207273bd28224a9a2ee032a9ffe8dee068cf5e4966c2e91d8e93c7722ec010e0a0677aea2750f91537de26cab85b95f09aac1471ccf8a67412fcf2e3aebf90eea5d60eb3002edd185883185dbbe450853b80a6106bad35704b5121056d5e9c09a6d66f688073e4ce60586af5243a28e99abd1a750312a641de29d128a9beea15514997cf89258e91c627adb607b2440109fb3655841de0ce38801686aac058852a89493a6e9d05887ca5f44052c8b55c4d388b3d4669f230bd8d4584395c853bcf2bb2be56db18e0a4f833f15b0406e3890d174e64a8a75e38e342b1a92a1693423c6a61e78c2ee8e9608682250a3eb0d1e1a32e0387db624817272b6164fb8daab66682ba160365df2e79f8068ea12eabac020b424ac3aa0f8c3e264048b7855e0c68dcc8dbb550010ab469c2762f072de1e74794ea27610432091528cb2e34fd42329061d717baeb4288dacf9809479d4dfb8d07dae00c0ac77e35bd3228c26ec5d623fec08d66e80fb4cb7680695f6b082cc95f4fecd7a1bb9792788c2d741f99fbc25a3ad07658ac69d27b15cd7e21c553eabd5b7c1711d0c6e0f2ce2b05c0d7bb38d72bfff6861855bc26431f52394e1b794e1090ba1b01b74233e0a3401632c383da107251ea1d791afcc09fa8403acc75193b6826a562081deb3df61528ebf79c99e0bc13efdb988289f4d2b8267a1b37068d00994ff1a6f037a610a03f89870c1e62600e491c6793380d28fb6920f37042624b4ab3b6ee02b780ec1d8f6f54564feb23add1238981ef53e0270460484c4c465731b6fb9d1856ce044288efee042b2205baedafc6921cf174c368a9a582a57df77253987a4cdf8002e12399ab6e4b3573f11b8cfee5bd5351c898ac9b7754c2ce7a96b47a09a99544ed7ab77f0840bd94dff59c9ee50315d6f27c7e297f623dca2bc16363eda769ce4e798f27026e4406e623a7fd32700dedc6bc4fe74e3cebda5a61f251aa2a97e8e2d958a412bbbdde8b64931f32036699cfed10033a3f404fc1ba7dc4e23b29ff76b46226c56e3641efa05c9e138cfaedd0c4922a8a17af340bdfd826e230b40da18e16e63ece07ed5aecef2d05340ab61ff240342013d007a4413e520c81ba0d130883aa831da9dd9a8c401a7703d689e08c2211e22d892fb1bfa341bc5817604bc7ae4850879376d01f43b702d30889100c628798e3700d94130af2821cf474105fb661c8055c591f8773524001e2f2e2a7ddc61fe30fd48af1a08436c9f9c69aa4c95534a918308455f6996483c96817f26f8b7f9c65dc8a4f7a7500b30cda774ba17f6e1c9f36e5ff8ad84aa3c6c3f6716c93e2592452ee11e337e217532e558a1a44b814fca519df5669b5c1fb0b38e746d083829c37536c7fb9c68ba9aa88a8a95e1a0a7fd94e13d37cbcc65dc5001cc5b56c3ee14f039e84e837ebbd365260616b6a92c529ef4a8d0c570584cdc3e5ec27af74454b0bdc710a42887bbac8b82d869c337733ff36d97f790540f3063d9824956820d20c010ddf4ec8215cfcc2db371788078ba0135f5b711a7034e35f4921665556f9e20f23489d83663d0068edfc026b34ddc2bb1a867870c37dd409fe6d77db4032c482c62b4e464a2c2e247104c5ac8b7b8d77eca7c70bf5fec396a5105170fa7d2b221ee080683024e0413274b60256833a749e082c0735d11c9ccb17cd71eccff104f01d9c0fd54311653551a025379bf6dc7b33970caa6693e82668a320d79eafbec5894b682e32a038c7cb4f5d17526e5a3d8e4344b7e8f4934269cee47ec8d577b9394cea0f909e1cbee48fccd2ead5c9a581e5b8a6e86f4b57d8fe98ee294f7fdd732d6b757398e8de40b3d4773a83ed7d2691281d4d3f714329ad42bedca425a79991eeeb8f61ff012b47723e586cf846c85ab079ea5946f6196e9af443989c7469e819849f31af1c2b641c309b5325c14772366b98cd2a82e1738f18f113ff08a067c21f1f07d15544ccbb98e6c52905a4b7e9051aa64fcf48a375b181230afe1aaab877ac9156628bced312dfa4c3a6c5285d2d4184f3cfdeac86842963c986e57029c6c8135ab6d2dc994679ca6fddea366c900786b4725d7cfe7c5e9a5594856c821d31b65d7bc1391a0c09df7fab113500dc080de686964aa170d3645a97cda7454fd298a5e769ef48a9b09e001b77003a38266981f938c954abc9b1183f8899e16c90cf5f6fee7f89aea92043ec1e1fbda17f776169f780b10bb41f05379c97b560b99f1444d5781b8ccf500e04c214b86d5cd6db28ba7bfa2599e8b6bf236f8cc05582999570b32966ce756f3cd1c1f5f5a99ffe4f89fa0cdf49bc9fe84a04ea9edd1985ac1603eeeeb04854b89d9701160f977bcd85afdc2dd5ab4116241a373b22104bf1b55f8f2cabcfb8d4ea49c6fae0d6485355f2e3d2dd77922bcc75472b9f7f1f5b8d4801a8087d87fc39a9fd164017a1094fe79377cfcada3204b9f488765ee8cd690656be1cf56d747a56d02e4817aa5ef7567e8dfbc4d224bcc3580f0d9e277f3a98f6013b5e39d536aead77ef79ee44f64e8d51aa07f5779a90edb457502ebd81e696bfd0eb0ab2f86d2366bbd3350f81fcf5a45e3bd436989467ba98aa7ede2ec704cbba7202963ccc8d393d65bff8772c7b91ea19bc21096c2e131ec2c23d00a76e58a310c4387726c12f9687b001fcf8cd9510edc85f64f018a40f6a1dc65bed19aa44a30e5cf2f190984b59d8dddab1d44beded859bd823639a8bb79e83c882e260ca30b5dee86950a1e8df32d9ea8b89c57a489572709711a429fe2c9533dd0d4e879de5a241e55a523df1b35ed2d8d5d4f12540c175ba07ca017bd3e5165806d02fe6af20ddaa5d53e51643d2daceb249d1f516386f2f3d231ed380eba71d664b3c832d015a3012fd15ab8db4a43370f1c2817fa996d19b2a780080f9627d0788a48e26bdd31f44968894cb94c8aa34fb6198bff8bcae73c70d7b7a1a1343e2379f6ee09f43ef3b228c037320c5f43199c8b2872f594a3ace929a85687cf1f7230c6e3c62e0b10cf8e9aa354afcedbe9b6f6fd91fe8b9788b5028fdeb6ff9b5188281f150c70c621c09304a72d6f454a2dc962728d6e2e8dbefe77856f0cfda5156b14cabdedd0630a0ade6c191a903764962dc953ae8be92c70812912e0cef254e833e16783cb7592f2f2e800f7f8276d888a86b3a87c247fde4ea2410fa151b611474125a0c985174a4589c156789369d473a5b1b8b8d003c771aab9c3d1dc7727074ac946c67a2289618424d63a1a741e4b265f5af3720789ad8529216fb90f95f4744bd6cc261cb895bf2d992c3cf1efef82f390fc593bdf43809b0ea92bcc97b17d8ccd820e6d3f441550b41742a7d27a5dcb58b2536e760e9b297d6378638d490adb3a6ca7d80854bb7b20225a416af286f1cc862f36566d3c4f5a7f061e29b42172c28ba99a5f626458c202b4f72a7d930ab584e35f17c4009ed6b3918085eaff456d1bbf6096519ef59fdc9df23a5d6b70ea026e022aec9dec93959aac81e223c5c003bc3731404f4376561e8bddc4f4d8985f98eed5b6744d19be13ae1cf69b078e6b893e407898710a037bf179b864fd1c91dfe6a42b12abdf5f928b10905abafca931d9a1248e8c8d078a8b44cce676471c6c3e19212015a09fd9c231e886b15f9a1c564d5223ea03a448fb71b8dd0797666ecc797b7f846c27a28a5733d8f5aba12ded66d134c092c9945a35732d68d56f60faa14c1464b1d3e6358791e65ccde82b2ba74b05393d8d722010090948d2f412e80d33354472e906f61cfd825f5f1cdc5c14845f91f2b1f4fa1d67ff2cf8212a240b77d238594be8896ea2e03c09c246e97b77a3b180c0c3c26373b3e354f12faeb72aabad4c88021b5ea84947ea31bcc895659501c6a39a3cb537fa7fedc0b3c38abafe63a307f10a192360375d953168470d67292a7a6563a42b2dbe913364487e462881f97392637ce4980dd5966a2b5a3ca3675d5665de672b8f68fac535b8ac6b10cc4531c039710476a9c306f10eb8fb7dd199b3057ff95e84ddc0122f02ec322ffdd3e4f77139afd3f01d18c6b8456a34c793f758a3a6ac3afd018ee9ba4877a69464ceb62b28f5ee17e321e6d70d99a92a2e33f06463a2fd0a8ebfba7ba7fc6cc80332c959b5a96bce7969eebcf46c20308b8fc38b77deb0da08176654bdf203ebe5c8b1aa862d7ec4593dff3d848a30d2d823ff2ca704eb4e0b1da82d07bd1edce160d72fda76e6f49ddf60ced1a69f232987667bdcbb0df4d92e7ca083b8c808da032208430cdd6bfa0f0ffc21989be8244ecec1d5cfd6c33a27fae1ead61bb1513aa47b416cbb75c7d54f75a724d87df9118cfe4882f6f0c7123fda9d831fee3ac73e2227940b5c4c2a5ef7b58969d08160c809f7f0a2049a8574f3a32dba72903c07452cd20b358ce9f6794316e294c8000e4de73688a4398e2134531e606009fd216e0524b9d861e7fb5639fab3a970833c0a7fe1a534a7bfcd75070ec06903fb88eb2fe4b2dcf06b288f4ab10fba74a3d7c8794fd17962d53719c21685274e47d3658feb7ff437b2400c156c97f1e8c7198f160e3524707186167bba2317b134b4cff1549b867e74d27141550f669dba8201bb498a6c0f82f31c8c906a1238f19c5002714550e7bc808482c41397e2791c7783f00041f022d2a7662737971efb3fdf94c30055b64122795935a31a04a9b8524f4a592217b45761fff09615413a5fa21c9164327b4ab331a9e303ec550e3220b54b98c5ce4544c566756bb0af560ee05b46b2131afa6c00d13e0d3922c7f6648350e8ce9587479db97226663e2d3421d2f2ce1f0dc7839d20d4b2a5e4445d2b1cbcc5212814060a0246f73e0afb21de616f9174e240549afac89ee484e634388267fe3bae8caf6f4c620eb28149acd42d1dcd5f35202715ab09904290b194f86c77145e8a3288290a76cfc09bf87929c34041c6ad96926e47233b5e3614580243beec89d1b4c7fbe1e2a261d4f3332583f8ab6964f933f8a0c3b41a3254d1c4cacb0504b66ad002b0b08fbff746859bf0f49c7141c1db15c30d1068289caf9848a20bbac1ee630ed12ccc337686f5d726ce3eab620844f429bfb0b01b7bc152693c2fcd74fa31d8fe1b6ed1dfb8816d83c6c310b4e732b7dffea46f4fa7caf7455fab292816daf5654fb64e4ccf25fd3d50a5760010f36441d25c6f39b95bdf0ba81b3b0920377ee9d8370a525c4e9d472dc6a3509c018a031672a7bf659fcde2f6d9e38625f6cb508a62881c5a5cbe6e6878493316cf1469fbe3faa202d4f0759f1bbaaaf3914f7b62c7c4855786d60c1021ac96957b10dd563c7610e3e867eb2716998d654dd382b33040a3185746a7d948d6bc587840817de71d71d88b366053728a3779475bdd80331dc30e1dc8bd5ead94a8411e755cd69409465a355a5be620620ae5e1f51a7075b88af88483970c6907bf41c14da1311b629b77660f21e2bb75e450115d22472889c52f77f82115fb03677732fa112355c7342a44122a1039f5b464b258af6523b56c8701d3dfac69a9a8842e551688ad653b3d512188e5ccdff9d635584447fdb045cb80b12c8fbaa566ffff901d4e05015213d270d2ab9c0e59c4dbc65829f41b849e1f0cbccacac69c04d5787a5a7528981fc4140ca5344b7d2b5f9675766d3a12407dc11daab3006bd38a78a65d60e9004dd3dd2c5d29a98641b2f32559270f71eab4a0e14b55efb016ae7d23a2aefa4ca2e6bea74b1449af1b80197b421c35f9918542bcb130b23062edfd431ead0a2beeedd100d09ed0a57e131a30d87b6c5b0b8949b59e6836b68772611b8d9132edbf1fd3c94e0235a3c444d93a36c60da6d5e2328ef1cdf384ff5578d50b1efa74292d0af5670f73c161025892c42e21d5d55ba456c8a9f43d7c4e68de8100f6616fc83ded160ceaae005e5e6e6544a3e1529de3b6a86f8ce2d169f9a914d2adc9623975263b1e7eed3534fb9bf9b455262beca5a10ff90f959a57950379f832fa57928d43479c16921ab6ec650f0661f1ee5fe701c40dc4260691dcaa2eea9785c74d707395aa469b4f8e6403af327459abcbdb0167ab7e70d843207eae85dae5e888e5fdaa8e2a8922323ba282ca031d14d6144b83f679f8376fab42f1176a53236cdb9c2b3d8c8df69e0432475517a783466f331c156c25a3fe75a88cfc07c7576e2d628093dfa78db36f1e39781dd14a4909b0cd72bc89ebcf1f783634256d5a80026109380ce757534108c7e324de663d73648eb167a8b1e249263c53c26282b39c73c943ba3dfff7a3011f348ac4b07d21e7394ff388a8d54e8c743c27372f0354470fce0f96fa15c800ff3da0a57ca852cc01b149286cf403c660334e2762866fe607bd81ebc05512c18751fda12ae4a5b65fd9aeb62122f18bb9ee1f8b66c9e7e35b21cd0aaa5aaf78f45e73ef7f5ac39bc1b0d54710e718c441f22449da29d54b0d3713729b8aaf2d62eb479644f543bff03f34a8c9ba0496721581a7d47e4d4a2a9661dcc41c5da35a47b945f5d69325ce4fac2b8118c8faf7f1d59ccfb762b408f99821cddf2b0bb43366b1afb4fc1683c6d7e48aa59afe33719b79751bf9cd5494576c29f567e5b93b7b332c2321d67b26ca5d8d1b0a13db2454926b97a06c453fce58a6bfb5908529acaeb289412c7df85d8d35e050b6785ba37a3bc0fdbcfd744973f9dc33f5559fab18165961a019a2fa42d16ba499a891bfc4ae8487f30011f3f776a83bb52afdde0dcf6ca72cb735c53efd3b60dc8f0e862aa12946e39773ff9bf79c02dd2c2274ed0a9177337be89431588bdef523e4a31a0b2cbdc4ad3940be8d933a5b6c3dd4d960b99907c04467adf6a7ce78f64cda4004f3f66d20d97e64c8d156d1b0bfa65ef6231fc18391bc166219940d13a3d97e6eff25c037ead2ebd9b676df09bae1e88ea6c42b434b6618b0896671aaa499e319e2da268fa7ea16880553d1c37db1d735f9502403f7b4d892fc90bbba5cee9de5f11af926740d8c4bf266659c96ab59cf3db33566915937f7a5d0a02da262944ed1e4ed84ad3c410af8a7053edc97d5c72c013853b36d88a5c20a68c93f573f0c583d9b6bb5619193ba452764ade7419ac00636314a66bc2d20d8d2674891c2be32f4659cda48149a9070fec1f82666821f38efdda66682863410cc0ef4d299e1e9f95ebc0a2adc622560281686afad4f42c478982cf99f2c83bb09796f4a62709fccd039ade4698551040cb6c3aa1504902331a6c39f5b25148104d36a2074406a77d2a8d1567d02443a3e6d86553f90729b77b4cb16a8bfc5384fbb228017f43cadeb7a2c5e3e3686b6fc4e4c297cc1d8f7f14b197b42de59652262903fa097b09f4085f6d6ed66cd6e4f19aabb92a93d99ccd793959cebb4d20201f9f30fc97c930f66eda3f48cfa7342b2b2b2b97cbe598989898eeeddeee4dfbc3f0364b26c3d866697f18bc2c1b1d7c6a9d73d639c46914f69276f6babcd707f3de7d5f61254cf930b00fdcf12a56645e06dc711eff2af746e9303106f1ded39e50d849e1d8cdc1569cdee10036336fd7755dece0837c4a2967fde6f5f87ee549aee44b4e8b334e4ea35a9e9cc6c1c7772e0ee5514ee57d74d5422f92567eb16492d7ee126ebad2126594cb21afc95b848d90e4c5c25ea0b6fc2aaa268768a21d2525a5982b4da259346f1e7ad224b2494c22a1e83e7edffc5b3689268fffffbe58b67ffbe80985a374a324a1666d424d4a2489668dee8b89e816cd02299617adca01587f809508ac45146af2f8579761258da49d5e2d5dc17ce47c055e7ddeb747de9847deb21d79bf4ede614ede3e9142e1e47d6fa05c194afbcf2b1d99c8b321aa21a24a97266f4ca1a03e0a259327cd5bf6417d0fe39e24022a1f82c95b045bd20a49cf2fe9cb7b04547268045bd10ac9ab5a2cad1c48590b7e4a474ae79c538bfcf9f7de59e752d2c44574918212f45d4fb0ec4144458214e017bc7296c0f2b7cf972103310bbd6dd8303d27b83d3db74b4fab5d35f51705f7fc5dc129b578fa763aefe9db4d4dc1aa2db69ebe16ecaaf6aaabaeeeee4c3acedf9d53fbd35a9bed6bef7ed7ffeebd13a49ff6bc69d03633f9f4fced57b4bffd2e4c682ea1a4fd2dec5fde57c1ed55b4cf5fd2b14a49ad628c732b06b78a31c69f5352cf365809f3e1b9c0f27be8802505a2849d8b8e392c60526b0cf28b022ed7872f677c81fa52692ec69ca65704453af2a0c24cdc8b8eafe8814d629cb4bbd69bbf0596461e7a4ce00f762d1c38268de491bcb581756e32365e93d657223bdbbd8ed37c76d7c2bc605e2f0ff62ffae938cd757418984c6390d70b9637083e70c2845c1f5fb3cb498249ff12675bb0fc7945ef7d496b77f19c73ce79fde9bf1cbc59e606f46cc39513890e8a2e37745ce4e4106b95545e0b886217518490e3890db6aeac7250b8610ba2d65aab0d4a338081d6962ba4ac234a9025089a2c5790b254c5e4b2c420ca14234685c7245d80428e2caab290030b95ed0245133707851447f5c3dff9ffc208334e80c69437ca20c28ae1c5afe1c5535195a9578c34eaeef53b29e72d4aedbaaeeb9ed0c14b61062638810ba6183a82b2516794e1c101e509203ea62b4366f0188ac3c995a6293686000307f9c41345dc2794e8a17e35a2e9ab7243b625c0a10987ffff1d1a297abf0fec0629e58cf16a3a7f9075b5ebea11633081054b1532100267c368bae1956b2a32bae9e2147336ff7ac1dc08b33ffd37461dd7e6a3cb7b794dc70c4dac06c7622823db1468018338c6a406fc700662e0fd68a001690c65f0479998973f23833fcae0bc43a06362b20e981c3405039380af1cd4230538c908f50bfe92388fc36a0e4a03e38fe1fd2993c59a691758078e987b4fc42f4653b038e3881eb068018618316e83cd8b2a3c4c39d1458cac2f8cb878dd14a32bba2e7230f50616606c51c9620616ca89986ad4e334461b5d6630061854582facdc4e0533ae882a9203eb8a14b68b1890aea6f8c1e98c2a52b003d2ab13c3488a574476d1e84975a36802176fdcb044953178b8c27261e4c473a3ca839436ae2cc30c1a1a9db2458a17788a4bb1e29346dd1c52acc4829046c82d529ec0ba29524a8aab934651b0646e4325892e529648e3a88ae512658d3a25268ac98cad2a8cb66ed822ca18319bf42103a321b0aeb66061458b2861504aa90cc7205f0eb1700e116f0046171fcac8dac18b2e5944b10263e9724a14251a8c748fc2c872258aad8b0aec539424ba2da06ce5d0681053046e5c599165ea091c54582ca0b441e99c780bcf453107134c494edca05960c0a4119018565a08614b220c352c142b3075ca955078b041728520c0520988d2704a228c2b5b86ea942b7230038c2b387ab022841628363aa5fb940900e1060a5ed0c4165c1056c4e149244e40656103ca17600c5571b3312c86961d6e68cc18753adca266289d530b1d432af8020928504051b25460a13192549278d52072a47ce1840d36dab8810ed6c9ba5101d658e28b195855ccc84d71f34147a557dc866c1744f51a0051031715f6ceaff83843d8e2e9e9c90d281e5860a5c872c96250b15a854f6122063c8421f5c40e57d8288068c16b4af72912882e7ad068104ea569e6a36f5da194d2188ee9a2b3a2e2507483274fa8308205442d6802c288afd65a6bad5d5c4182249694c2b0c205926ab3e85aeb03d55a2bcf096e2c32715bd8a0340503a422b8c0c189140bc5176f5281830555457461822d8a9426a0050caa9c968478e3064f3c510396461838090bb280228a0c68f0f402cbf484aab35d8a3119510daaa939d0b0d272461355e975040e681441cd400a24279e8421732bb612bb1d9e70b1479e8062102ff096e9ceaba22e40046e0b2d2a737429a389275aae5b91633c99a24e893e97aec04ce91ec4132a2e1aeda644173c91528bc8ce084f272e0083073592c0820b16396a605b386a5aa3488fc3d2e84f3bf483154d8fa14f62c70de9cb0e34888194dbd20aaa5b7113c0541b7ea0224513d1961690a16599f0c255271055c0b016383200cb0735709092038d2d24f8a1c9a795f903131e15291cf10489398894c0a1882b3f2871dda81383628164bb299e002836a86a30b5c45015a51f8cae91dbf004175a6841438e2a2ab862ad14bd011344bc420609892c5ab26ca19554a5680b365a22450a7008620a252bbe58a2288a8ba511454837ee799e97f7bd32d62a7cb0c18c4b231f0c24dd400e28a8b690208d242fb68a569f301e68fe20a20b568e07216e6128010334d09079151268d626952e5b9c10b9a185644b42531a03864ca448e66441340216a50b0ca2c0a8b20505160932ba22d2082b0a2756a8608e147479b2388f438c4be515b10c2b3034da492a415253a2487d7183e206547c00423625e6dea8abe927715c060f38b4d8e1ca961560810612bb83540f5a3a349338858636a251ce49a99637ce18239d14c9e39cb18b92d27ce3c7a71871d377a54f1be79cd3bd5cdf9a439e47b99453b9957d0904e4e3134e0178918e8fe565cb876c9414955567adcb262d31ca64316f6ba57b8c4f69b5361be988a4e34cd2b1288627587e0b3d1e4677f729b0fc283d8784dcc919aa68f3d5c4686664700c8cebf86c2e0cec7bb9bc2b659f0e180934823ee5527766281d5f89c9e9e95e4a9dc86f7e84b35731da749c9452aaa4e3e36ad6b5dd3be5bdf74e4a299d382098f143df1aaded2ab536d3fc63478d9e303dbfc69af73fbe9c5dd9cbd1ce9a8c3416c989dae7f4bc0a2a82d042ffd0f1e30ffd5728a5344819e2e3e1fd5debc459f07c2a3c7fceb75df552a594d2e5ca4b4d5a92baa17ab1575d4e39addee572d7bbcb25a71c9a585eb662f0ea72ca29a72b4ed05daefad473af9b33668798dd5dbabbbb94d2dddda5bbbbbb4b6a9371f162c41f94e622d1a76f4a29f5392fad9ad61a033ee4b5ae4271f15abd9a3cdd4b2aa9282e5a9a962492342ac2f212b73a2239e4b5ae7b189c06fb8e4aeac8901e9dd897d47d259a351ff2a28bc1dc49ab57eaa1c4a32ae9ee3b28f94b57be4ede5816713aa8a82e4bbe2cef4e4b7754d6a63b391479e4db40d540c572f7f56ad662e888e64c87751573f7b01d579a47b41cd2d564f19033404818980c96a18931c69aa7711a9aa7a9a1a9a9f922e8efe0fcbeeffb093699f20362025c9f765f9f9c16b94039cdf5d2e3e2b45b715ea896d3622f9f6e39cd56879c36f3f22b91d36a5e7e2dc2312fbf1ec1f6a73d2fba5eaf04f6cd1ad0ad62a04b399587555758a06779d1629a35df925ff6dc1ad8e70c4be5e2a1a45bd556872a512dba25e919a8de9f964f41cf51ad15e0992b547df250fef34c917f73b78d57dcd995a9fe741d996c4a4a698d612ceb7ebfa281d4b1a68ed9afbc9881fa1510a629e38471bff22b261fa8b4ee232a0bce471a598020228b4d5e28b2a4df308ac4e0e1dd2cb068fa964a09e0a0c11b666c612be24b1952dea041a3ab41a0b0697aadb56f9f622b91d0f60905505c65b16544d30d482c19da4289425bfb40d6567986a61f9fb072f7d5f2fe20c33da614a1139349f1e43c116a0529723c644cb79c78e96582cb0a4c44edc04b4f43e04461d3593a43ca4d16a59c25ac23d911ced0141d505cdd0c81b361c2c9b05041448d134e3ab08c0125d6f46483c5ea09cd95ac1a2c6f48998922177302458689a689208ad06ae20920568802d7c493d10a4e543521b5c292ad092b29474dc4f143961343b8154800e544929193134e472b6481722237c40a501c39c106d20a4fd8989cdcb298a64059a1891c53952953283159a1848d098d2a2b60817a62488915a6c8fa59185fbfc709bcf1f4404729275efcc95adb597b7f663ca777abb5b63ab556ca18adb5d6facb7e3fe39cae1748ef7c5a1ace9afde8f33e40160c9a3c8efd7fd24a6d377fd6229208959b721bbd08122186a1fd7bf8ce06c52051098f417ecf6e533d2307961f279ee34a192738c618638c31463c6767abc80c55ba6de49cb3ce3aadeee8d45eebac162654ddbeeeac1d15a2738f521983dcbf5e8e31c895924e710d47ad594a094775bdaaeb0695f2f0baf5edd2ed5c7a2c425f7e916e5b1d8158901ff8c78ff5ad6b9aa3a5e00b1ec6e03ceeef1fa55aa83e3e7ac69f608f87a1fd3e5e1abeb2fb020c1deca3c5ba9776b5eb2a076260191da5ae9040efdf19ba42c413f67494ba028503a32b4eb09296eeaa94524b29063cc4618b8368a7095b1da594ae42a5aadfb192a5f7fb745d7c28c38ff165f2822956b035c70f54bea06470b99288ca0f301c1530716bc8073c050c122cc04a40f12d9104eccae382a6b78ea6f9e884a60980a6a159c20d4df332283e76b9c9c8e8ada3657e47cb10d132328f958843cbbc4c8b96f9775a944aa2c115347ba5f1c7c084f0a763627ac7748c948e914ac20b1da3c4113a660631eb49f3d0302ee80b892268b87871efc5d6fed05b47db1fdadac758688b33a2428490ed8e88d2751e71d3f1c64821af4c1f216bad57a0ba2883e82a8a8c1520a952bad64ed75aab9433304032254130828a074688a1e97b30212aab3d60e98a54024ddfc284e8f5a9508090e2ea86f4a8b18aae654815b185c4a4eb7f58651ed6a794524abb809206a594d25a46ad44d8740575ad8f91d0558a883874fd2ccac0214a0549b4808c1cec183720accf100ff48e0d11c50efaf804322f608a68b04c08a728f805b71921c08012d306948c1029b8c128e117449912e2063ca4c0c4950e443ce1989a2852a10d5b15505488c1511852aed0f04105ac273680b8923ad2eac18683910a2f780aa2480518dc92d8410537aaa486b85294759b3c11cbac5c4da92a32b8b19ab5abb573c2311dc798238a080cd3718c39aa76b4e0191dc798c38d2730d6718c39e6e8a46c40745d4c568322e7894617096f590d969ca772e0025b117a3f0b2420aaf245f63ba08e523639ae5851b378c59d38bcd8e6276b8ab00364373212aa4a7e117926d484ca9a505031480122929a7f491b22cffc1db280985bf69367febd18cb64ffe1ace9fdbaa6c1c0148841a64c15a66fb58409a550f3378def5e8ce50cf2d7a534f4018a3d0d0cec93cd4c23936f4c86c9b04c43a7bbafe076282ba379632f0c7d7ceafb15b29d4d8e729e59abc04e7d5620f2cca7c19c2fa198a1674d8661f2c4c8c0bb478f58c4ff36e3304ae06e3556263e936ef9fc5e2bae7f5d3048cb2ee7dca7a1d337067ad1d9bccf8aab04f9f72d2883f43c6b6df5f296f63b99bb2a68aecba2fb1cfa1189bd2103c797ee3379e6cb9f5986797038fec63959c66d49d4f59f6cf70eeed741bace0f9a39fe3474fa7397d205b8faa260f793daefacfd2551db2c840679d3eeebbdde163a3d8b4843a72d189154e1858c456c56663ec8af2bf4017aef6f0c0cecab385798bc7f873eaefab4f3e9d73d979e9cd386e1a4d23dd35067728e4b29bf2be3d687ce0430347238aab5d65a431c253063054b344022cb9e208a2732515061230643383175b1a24a0fd60469784d6d244d1a833966004713eebb8287ae69a9de80c50c95a62760a888f1ad11078d91d218a5554a29e527a794726ef14a0188123e2260d2f3e9ac0a2c9f32f19ca66fd478a3bb74e965af9e276f76cfdd5d26bbd77b9a3dcff3269697ad185c26cbee3e671239e79c93d2e6b725715a4ae939dd71f19042794ed328b1a571c73a01473867f599021ab5b6db942e9374fafefb3e49743bc2b9a2cc0695f362787d361096e1628c9452fa5198b4535e74ca1454c919e3cd8f70324b6ab92dc87b40e54459256f3a242e66c55cda748c53331fa16011484777f2a7486fcefb82f9f396e9daec1177e4383fc4c9db6703e98993d974d86c319abc65fe1763bf30d9366b8ea3389c0de7a2366aa3b6a7a7a7a7f7798a4fa10f106ee2266ee2a66ddaaaaaaaaa9eee7d7a72dcac51dce4f1c7385cc5c9701e3ac5698aa3a0a4b97a7918e9c55f8c917e4de65ce343e0b9700c8ce7f2603039041ae6611f0393a39615fcf80bf6b4beb83e6aefbda74ea31e7a395ea22f4b7c81712bf58a3bdbcbd2fe2f204ee05d8db427f995d7e2a4a2994a6fcfca51c233f2bc9b1958fef6b2aa9117afd55c6e2b5787a894d76a5616a5b2cac2d2fed4c86bdded46916e34e9b6a49d3669a75a288dd2fed38bd7ba3bb7fca794d73a2b2ced3f9bbc66af16ccc52dd3e4f167ea611ae2ef5ebc6673f568d63c990e8e799677c3c594b47763f29ab4f73ce90ae5dd9ac0f2bd5cad59b666d5acdbac79b7dbcdbbddbcdbef0f43ef76f36edd2d376b372b2b9795cbca9ab59bcb7559b92e2bd765dd66ed3231dd986e4c4cb3766f93e7c6c4c4a43d44c0047c842d51c0bbf0416e75cffffc3c0c4ce8fe64ddf3ae9f7781f78b1c79017cd03c02464d048c5a01e06612b3d0097817be06ee1a8cfccf13015d2ecc3e0160f410e8efec8d804dac76e5fd939b587ddfb13c9cfd0c0bfc3ad2d469f25047801fc00d303579e8b380358f02fc96691e403dbf7d7678e4f7eb1e417a78d0e3831e15d703854fe155f8d71f4d1efaa009bfaf064f0009f05ba6c1ff48c803c825fcbe3a7ff4dae73479e8e7117ecb96fcc65ac9efab5d559387be8f8fbe65497e63bd23c2efab773eface5326700b797b929e7df82fa7d9d3d92320ef3bfb03e48d676f809793a6ff9a9a3d0b74f62bbca6349d7d015eb3d97f307b0f661f64f647f2fed9ffe41dcebe276f9fd9bbf206d25ab3d9ec51781d7d4eb39664f604c85b36fb13f2c6b33721ef3bfb12f2beb31f40de78f6247c4e9afe055d55ae357b3afb11f296cd7e49de78f64a5c559ace5e68f649b29ec1602584f0d143a0bcdd4acf1e065b1242feaa3ca45fc3d4b34702c6b4063faa15c420f43f15c40fe8f7800909207f531ed2076d80a38701c83b049af6fb9bfa174ca8f6453ec284887c840915f9081332f2416ec16bafb5d6ebf923f7c811ac8ff41cf90b36893d37040b7ad6b3d6ba7efe7ad7de9ffbdecf4798d0cf07f996873404f087fe11fa46c0da53840858b578481f08ac35b042ad81a72dbb9687332c785f230f1663f390d6240f6955ca469a7ab0bda367bf0da0699b054dfbf9dbb387e8fb2f0fb604a65dd982aecf0103c36ccf07f94fdef7631ec394dce77917683f68c63019a2bd1f327b20e0961ac85718094240a9abcc472de43b1809f867669ebeabca695848369ad1c09a487d412f06a16f13033c7b20ff4d5100e47d41c83e79cb2a6e7e809b1ee42079cb80f4e819087b0f8c9a07643244771f82db933a0067901c80db7f80dbb9ec8033501fe0dec9e08e5c407047ab07b71cea016e99c403dcd26a07b87d48079c81e6807b0707dc91cb0db8a3950cdc724807b86592b41a8a7d479a3e0d48c3d4f865f25e127513abf15b21f28144eaf0124b1dde8381e578e4b41cfa3b1f98635f6afb5207503af90e264491bc3695a4e9127dbf72ac98ae539e6b84a8bdccc473ba3e0c56c2d4a1e848579f9a357a9fbe9ec2d8dc88d26f2ac3b63cf4b63e35e8bbfe662f874dd80387803e67d0230ef44a61d6be33220ffd34a6d8d0f465a029a5f49b8a41685013d80958939c8752bab136e1f737a5e9081ed2d7b9c16988f26eba83e9c4f2762f3af638cf45cb2be729bdc9d1c39cbc9d49d3b731306a1cf0739e8217702f5a06fb398ff3364a1a98994f07a594e2dcd0ef6f6c70fee62978738373f3363836363637368f033699372f6570e8534af39d4444f2be0c4ee5326142f549cbab3251270fbb260fbbca9423f2f0afd6bef32e5da6db749d9cf67df757cb7dba5c9c36f3dd5fa81be53499effee6ae94d368bebb9a87d6e4e99ec78edf1d5185f21087e6e0e0dcbc47a92c5a7a4677df29754cb33644ab9a7ad0dd774e4ed3d27dc7c56b20e03aa321dd7d77d425758f73436127485d2f2d6be9ce86de2d0fbb0ec9c3ee6f4017d81575466077e461f733600776499d524703764c1e767faf64dfc91e2777ffba799b9becd9ae9687332c52871038e307328571fe86c96937df7d6d721ace773d66ed6b7e873a169b89c562ddc76cdea19c877eee4e61fa339946bf26efd095b40d48417f721efa3d4077721efa38a037794897e4dc6467eaa27b6829ec65e0ee9a74f73cc0edb93d67a03a06ee0a55b5ec2aa5bbc7e09681c9d4b1bff9d83b087b1d50c7c3ee73c09ddfc3aec3f908b338f2a5952f25d531f00253dfe497b5dfbf3efa65eb7a0a5e20e6b40cdfbba2b0d2327ff3b11ea628681fe771f2dec0d4346f1ddfc46a9ccff9083b41c7d730354e53c6790ae274301464fee65fdee7b025aeff6664331fe41d91875dece9cf1becb7fd4964c13c6f45ae2778763f73ba58def66fece7fcbeb9b17ff3371ffb20ef6e4ec3f9ee6feecd0d51e4c179fa2f1cb0bb811d9187ddc7c0aec83efd0b13a2ffc14cb041c7ba180c1e76600b6ee08ec869ddd5d25d11cc7757eb7ec784bbaff9d853d0daa7a0fd9bc7c1c989814dac8eed1aa68ee526728ea08973f3b8e69bc83996d83c9df91b306a990ed006dc354c6d7fe66bc0263637b19ae66b989a26530f6772fc3e687ea0f732e07bd83d06651e761f0376fb6ae5dccffb57cc699b6feebaee6df7ddf79801de9368de9cb63da2d9c9f76e37dea34a0f4b4c40e02a8d454c8841809481a5def1ea2d1069414e0126b1084d841856136290fa229c10e3e703a6efae1dafa628306bb55edde6b710ebd75a6bfd0da42b926ac11cfb31a77ba9bb778139dd4724393681ebdf7a651f478137d655de48805fd7b7b9d6fa32a66e8b57dcd91dd3f524cccbc6cc3badb59dfdd97578523ae7906064014c1203a600b6f08287315060c619165bff159bb2bc78a8e55bd19d2693873c532693eb46afc707ebca2ad6292c0ffdafacaa2ad5cc754ace39239387fe9b06d75158c6649d528783890377dfe1b0340583ead60c546375c1fbb5d31e1f6b46a474ce499fdcbd830962c99796ae8e354ae53cf5ad9cb09ebc40d1addcd05451d5ae46ba4ed9c000d7e94c34ba62b9965add4a577ff22829e90e363d1f7ff73d9ebe5eafd824ba5ca0573dcff362f4cfde44cfb2baa2f1d240e9c556116b8a8a52ea45fa519f6a32bfc0b5e665f6d532f356a76291217a7ea5a24c609b1def27f8f33dcbbd38adc74f1ebfe3a7cecfab1dcafe4bc2bcce05562c0f41b05281d50aac57350be40156adaa0376360f73bc5ca7d6986101efd0cd27d311fb0ad6a9786d791ebd8649d27b6edfd2f363e00c1456a7768fde3e05ee9ba4e76318590c1843c279388d3c9cd5eb5e89a4ae7f45e1d76bfe7c581486cd2c8b55e6fec5e54a05d62922f01681f7e6a191871ece3be461975a8d1c69e2e6b466e8f973a9d65a2fedea14adb94e5124353d248d171713b89a2cddbd7bfc88c0d1c2e8f8027b464ebb47481ece4b7ac9586488fdfb2f136cd02e97d4344bb226e7e9bed3a2bb7fd124e14fa70a03cda2e097f71fee9df6faeebb28a7c57cf75dce69f8bbbf2f3a3595cb41413d3d3939c9246db13cecba305243dfee619f5bf0b0fbcfa51e06c460cc9327b95e95c8b978ad2a79911b39129697adfebb52b1c1e050c4e5bdd0420c305431815120ce74805c16527801f9aed328cf179e2f3c5f7a74827438345d8f62102f3ea10ca684ea09840558feabe70b97c041be22bdeb91bb2dde1c92ae55221f64ee40d480c955a2e944390ffd3d80095d290ffde6b4ff073edf0e9f2df2f89743acdddce783f6c779dd7073473462bc3ef880a481f767d3f1e93ec6ff6c5ab67a84350e4c490f5d715558feae375a3e203808009000d01152a9d4a35a44ac7db6cfa684769b8762d87476e4e0dcc874d8d4c468666470a703c3343d4f01e20496ffcaa935e7523ea3fda7cd69b116a7b29cca69512a0a2977722ccfdaaeb5e710ae343a396d7b94f6777f8f92ba26a1b77339616a03b8f1a4c46a27cac2a1fc7f69d19f9afafff7dc3ffdfd39f3a3ae1d769f97d1ee06afb8b3af4d7b7525af8f2f96c9708e5cbaee8acb91965b13d192cdbd2265ad21bf8eda5b6fd6c96ab14f968b85f230ca43af376f05fe69bfb62ac78ea1e7e8eed2dfc38aa915e931acb31fc812aebfefadb5d65a6bad33cb15949c36974c26a41094a404494c48c19ea1e5bf10e5773dcb74099a312ca5ac99090c2f5477f74b03a517c71652f050babbbbbb9be0a150cd49a0f0fedff11e39a5e5749f59e6a19431c15079bdbc498b377918957cc9c328b32b79a863bbf7adb51f342de8fdad31c829b5d67a2ecf733ee5a22f2112d644875722b5907fb9473dd04a1d3ec8ab6a3e05c302be011f19c024a6ed7dd7b5765f9de43d90494c4992277281989621c91371c007390d11b88387f90e3e279c08fb3585dbdf777497344dc222a7757494c2a2494b5de1a4a3d4154a427494dae2455f24af0d611132f3d4c8ffdca38b7471b019bda9541445ba7bcf993cef635f0720cc77f0b48f3016b0cd66b321914e7cbc12a9691fe4f6de6e9187f412d96bf3906e79486d9f170fbf2cab2b0f29bdd82a625179483deffedcfc4d359948b3277c71f7e81eb9aae490cfad28c6f643e461cc90873f39c6f6f321d924e10ff793bfa3189bd3963cfd9821a73de0e9c710394d84a71f5314739bb521e944c8d38f3972da0b09e734a108c68f3c9c728f924ffa013de721fd1918093bfff393734a9891e1e785c8c096087921ff9ac230128cfc8e8f8109edc8bbc9cc1ba9b2d96c7a267fb6979687f48580afad37f0be475a3b3ece998f5746f636fff3354ffbfdc96a64329b1f598d0d289bc1c6c6e6776cb20c3f7ff58e8f0f721bf0e76b40d9d730b5ccc7efe41aa6f691ad4827496efdbd0f7df4e7a4ffc70ff910fe83f7e083fc8e9f79003c08eff33a9ff3387ff3b2dff99a8f07789b37f242dec73ff8ff3cdefbfbf6757c81939c2673505a8a61729a92a71fd3e434a1a72f874008fc47f551990328240efcf33287974372c8041bf4cfd04fb6591ed21c402b71c8fb0e797943de58cf427869cb5ba6636cc8fbea9811e48d758c08f296e99810e40da45d20c8db47bb3e9077a85d1ec8fbb5ab0379cbb48b037963edaac1755d1bc85ba6250d79632d352067c8fb36c940fe3090b74cc85f206fac8dbc05f2be9a878749de327d4486bcb13e92f7d5478e54206f99eea140de58f74c20efab7b7a9e3281fd07f0afa3222f81bcaf2ef23ff2be11c81beb223f246fac80bc65bac887905f4e48f20779df04640f5ac85ba6f107b947b316009d37de38286f99ae0f80bc653110f27e9fbc430eb24ede3e61be47405e00795f0dc485bcb106f23708c85ba681bcacf607c8fbeadadbe47d0d9037d6b5af61216f99aefdce0a795f2df346f2be05c842f2c62ae42dd332efe373eaf154c7a790c1bc6528e48d750f02641e9fd30979cbb40e13f22d21dbd70f8823a40658848f7ac9bfe4b70494da0646c24bc7276128003d0924003d7d1b98d0922cc24798900830a118807e72c5d92da7c99efeb539ed9ffe1d721aced3bf443c9ed63c7dcbc542396de7e9db28a709799a91a76fe9db29a7fd3c7d4be5b41d4fdf5639cde6e95b2b7b65b19c063ebd235c4d1efa23b8967dfb4aa413f03acf7d21107b783f07742e38a05bd9c0846ade06d64488876c87cd0e233e7ede881123467e8cfcfc783bd75aeb12f29e15e24d211f61424268997a783f09b8634940222f04f4a51fd09d768c80cee4a17d1fa037ed005d8b0de84f501eda07418ff2d0beccfe835e659f87fd1ad0b36cbe245e0ef20e6ceee02f98e4836607202c0610e81ddc9ed443a606a4e2220300b727c52469fa234000dcb7e7084f275d31b307003d092200c56042f593802f7c0720ec1d00d20610f99bb7c4e92b8b74eeefd8fdfd697befcb228f4e0f6452b5e7f5e40bc4b42b6f269a494c2fe085b7200cff8209c14083eb05fc2be76a01a5b45f5aae2ba7d14f8bd3624f257ddff29a2399459abab0346ddad23d74946aa2d23b5c7a53fdf33dffeaf1f540f2f9a5819c817772c0c09fdef4c747631157847d579a9e115d47a926264ddd2acb951c1dc04e98510681a3545394eedec322c955a524b5c56afbaeb89ae434e9b428b585c869514a0bd5ae4bfac3d2f45d8bfec45806f651639a0f0690ea068051cfc016f00c001d6b3389e905e417323541f7bc2b88e779aefbde057b40196e663264870bb604e687fc0c1cf212c04798d00cfa69b83ae883dcb33c8b767f7ffafe7dea34217f1f3bad277695e5c6155696cb1580f7aaa7f77dcaabd4c0f7b74f51d11f3f5ce03641d3e20cdc54cf5ef3eb71d89222ae3bfbd97d216fc4c8ff805bea9fb781a180fffe87f41d392d3a6d86f33086a0ef8fbe417eeca8d117a6ef54d5f73e8d458efccdfb75f4c25de1fbfb75f4427ae14400a387b39c434208fff351cffe08186310235f03432184fff96fcac85322dac80701411b790f8cfc07469e8891f731f220187900fc8429017a23477a401a9890ab276fa98fe4fb4173f6f303460df4f346be48ed7bdec84fada7a6a6a6c6c6c6c626880e0f747ca083880e1f1d20e800808e6f4a874c2693dddcdcdcf4e0e0e0e0e4e4e4e4e8e8e8e83c07ff7204f8017cf606f8170b2bccbe00ff4d0100041f2279fffd0ff20eef7b90b78fbeb30ff24da990c2ec5120c0c7593b61f6267c9c250c60f6247c8f8bfa084b5c5989d0c79984ead98bf02ffa2fa417ce691126f4d3d3f33342d43d994984d2f77dc04a8041729281be40a63012904647180a3924b80ee15d87f0443ec861b02544fef57ac54875912546fee71db6a4f6f789805b6a22ef820b7f04dc521f792cb50bff8a2ff9cdb4c0fb9bfab69cb6ef91a64fff9bba17e3d751071f63edd5810b8f9b35e9e4e90eff01d17bf07106794904ca1da493ef656028e02ff232b0138e7c08ffa25fa31fa854cdd6553949d1d800000000c315000030140c074422816096e5799ee23d14800e69904a725c341c09a320c76114840c32001002000106100040a6c88804a0f2c95545adcafa285730a021c406f1217bcea3eea8eb15b53560d6d821643e5daed7c6ab7fa5eac793b9883e9687545f53a40f41c6abb5940398b03a600fd653d79f559e8398738d1dd97154910c2a26a881defc2c11dd04a2ace7653b7bc15f7c57b022b4a93e62fa62db7f32036ac62f50a5bff16881251098285790ea034c8e20fc37247de82220a1ea0f139058a1ebb74ad5d69beab4aacb6085c9a1ca0b6a7e15c380f69b7acbb04967717962c23eba43635c8fc8cd3efad59787533233b0be1a7d0b159684831670ad4f4db8e303a8d251067f515891cc1e51c7cd271ee05f386792f56fa1b4bca58930f9efac8b1009bd4ba3764984450dcbb2263e1fece6c482c475818dbb5ca3eb5352717dce44db6b670b32eb0c92331022e23e7097a167591c7bf5c9f36cf52132fe37c3a0e6e76ebda51aa1e23508cf37c1ef830ae4ca7d50b516442fda58a9786bace03518ab0f75363d6ac571fecdbc5eb1b44300ad9d3a9fcd446dec15b0b02a82e31cdb2cb7367ca177fa10caf4c8ba04b11fa74ba21cc56054855597ef6dcfa2099352ae54a29bc87ce552aec40ac1701d55c5f144dc1164aeb619e95002b9aa334a9dafefcd1c276fbdd2b42b349ef66c8b0857b62ad1a56da03f4a564d0b0086d37aa2e9a2cb9648732303d030ee1ce57ee3283cace4d78f657f46a041974263856851bf5f397d8cc607f6a9424c01ca3767ca5d0cf2e1a52f7652adb938e792d94df35b42a183b3cf2483877ac0d7639772fa2c27a46065e3a760d571a860b5f155b08ae8ec0350848fe7cbe750c4bcbd58715d3e2b0f565538387eae64498241e63d091a39c48a76497daa85ca225e9506165821af1db6a0952cc9b999b1a5805525c12673097d2eccc2ff414d5f7778eab3c778f0541020d8faaf3d2d2cb77babae71ee46a7e2fcd9c9b4f03706db2dc51c86cac2be54a40a35463b30108bf5729fe0cd484bec693cd7a93a0f09f60ac6becdd72120e1bbb2542ed46d12d3155136251ee79e319cb51006982959d09c6c771e61903d1256061208d52fd188d5b7d533e1d715ef97467c04a0f29fd9221e44fb41c38a4613cd6797b280c30587edbaa6451d76df161f3163100245e5a48f8b6e7ddd0db92ea1be71eade1c270d07bba08d753b54145bbab8b5f7aa1d50fabf38ee413e527c1fbe7bd4939d47a60c83ac13e7ae76842dec8c7284000fc8e6560110571bf1a7f2ad898ea2b4aba7af5a5013973611a101e70f4abe956e6f9762093c2d5c6867aed695f8917c247356025cb04a4efaabaef48e8b4e5eb2b69b009198fe00dd36683e7fce1a7dadd57fa68d1ab194bab71c58fa787c9832b2b2fccf325f6c32ffe97bb8994addc1bf7ac1e1dfe3c43ff932af31fe9d02109e389ffad802388ecb844efb97323b684579a02e42e78128b79d45086666fd2ccd52d9866b6a7137e3baf2fa8168f890de71426fc7ac2d53b979686f64d351458eda28815b16d7c5485f5552e9e5092e98e38dc71d962ce9f14d9b83cc476da52b260e90231ddeaab6e930ae71f6c1f6fe550633a31833c4f700148463d89066510051ead24abb3c3ab7c9f828b471aee086b4dddad4112355d80de0b359a3661feab512003b83c8a6b3d8d57473d01484fc5a094e9d8bce7ba6442422a9e626cb8c14c04772fb03644b8b85499a5b374b023e7c8cd6c0a3c2e6c5349bf8734af465fdc667d9a8eae07143cdfe56be52c29627c174466c68c0d88b388cceeae28f02ba66340a5e936b46adde789897a15465c47ae40e356e6d2dcb7c4be2d58c5ae530fdfb85b3041e3e6a551246782ff4299905ff49c4aec646d175a125337669c88852423b0546e43615cfd406ab393875b479d950e3a783bda916d9c2233c160c0f6d16b1863b163987d84ed8773e803b72de26368773e4dbba44ade1c73ed3028d7befc30ea763987011948cc06532eed587add431dcde17167f6c65e901e55d1e1e706fd5b851a0674e4dcf369dbd4f1826057ad4f8391fba2fdae21f0ce48f79e9793e950133ed60149ecbbf8c5a1ff85ee2bac19fcc5599c2a22a223c18703c9428729968fed46431a6dd184c81784d7cf5f47bdbef3e817f69009e02fd82a17de89840c8ba0042f001931754c474f1bcc50bfa41f616de8c16d43eb4b0bf64b7b557dfbceb18afb172b9578f05efb56bb9966dd1fba14f6a5cea75f8b2e032b3fbe485997c13c4b4fb9cccc7f200bea65475f1c6d83a0138c20622bb741b16e3992398feee5473b5062a8577fc7aac03ac475fd9909f348f7c08f4b2a7326cc48bd09260480b3d3f4dbc9645eb202cb53b32e4c75204a706a45542d4d07c6ccc397a6d893551175d6ae736a96600386c650dddde81723d105f981e4505fde932904b6b55c5bec3a42912c122ea37decb22707c9e6a1db5917dfb0b214615d746b1a3c963324f889ad7096e59c755745ee41c7f82a759b9df55d58e7d015776232f83f4270da0f68ce49806206a2957e655e6ac123bdb0025314add7217700a71fa156fc35c0f80adc1b0d5163695ee9899b43cb9a28559ee236ae341695b99576e0cdad8f80aa82a0b8225ddaaa874f68e16185135b0f7b1a674b646ce071cc608aeed08277b8bb7965cd4ed4f8e394d70be190822378baa6ad716a0fc3fe8f8822774c8cb3d5c948dd2a8185a9907ede15788173f6fc078da67a800325686bcc94dbee522c49d50075ff33328940f66944c86c363151de21d3bb768a3d72f8897def2f3a1fc3465c25aabef4359af779329d1ee25ee147d487e2d86f65bc1e6fcf82194ba85b45b7aab2c727da7835931f731a29d2a1f1302b76da79441b8b1f5a36099fa239b035b302930f3c92fe19aa768323331b5820ae36e908e669eb7f7daf1cb9564d548bd460b6d149b1badbed13e1c41e4c834473ce9285f479f3b228547d93cfa5c8f10f808ab8f7cd18ff6ffe81190ea2790ba03c94c90b86290fc0ed21521b138213916d21143620936a40422d22645921c18697323e5f848f829927298a49a29a9474be284493a68d2e74dfa1f3b29d327d52194ba45e97b951c764ad619753d10a86e70cad470653a42131f62193e5c46f3cb18193335cd4c51d40c227a258f7cf3adb73dd55d1c1b68d0aca7f52da1b042f564d21721add4c7079bc55e938ff2002b00e734de4cbc3ae1f7eeb4df007b3efebfd6ba9eeb588f8ca551117ca7b7111d61cb708a0e30159c0d539b94c6294f8b0389481c76334f61a248edb88cceb4150b4af6645055e3a0de5d9f795b27dc1595618e51d814a256af91b699eeebaea4582b23400abfe40d2a713e9a9a285a97d1a5a0cabab46b0298bc8cd2234326c5783629c3ac930aa57449557e3764d3ffe8af36d30c86c44d0b4116e1b737fbbb804572e3b22da0d88baaf760605117853d890202dbfdb68f2d27550179024d3bdc4de3f7df160452a16d9a30ef1a8b638a2976f65caab8d67b1b9914554b72d44b61ee258faa4fe052e10698cdb0d4d1cbf2b27c7e5e0afaae2796916adeff1b8782aa93e5a14c503868c382909ff1ab44c283a2b6da01e2781dcfa9aafdb453546def40db0e832c6107ec7cf4ed25b6f69e42a2ef8190c2d92e95aa7b1fa1337df80714958e233c68f126bafcc03775a8d9cccf242b92f409648d89f1916e47edeb463a5070af1d40830980a6c0120899f7c4dd3b308ae5a025c633744850589a9d881964613d0e4528a05643021df5b8e40032c72bfee2d5d8687564c92443624d1a4017cb683d0ace2b8f13b0a5247937747437fd2c722103d4ec0b44e1ff78cfcd5756363f219719b60991cba0700d8fa5245188dee4c4b420315c80e680ba851acc51fa25d85fbc4a93ec2d8bcbf9d0156a24f11342e61f65fc32424270f9cd80b4f60a91d58c79cce89ab960a49e597f72fd2221d067f5667bbf80900c929ab279533b130dd473b1e826f7c31eae73c793837141b190fa38172300b4ac7a6be85dc5fef164274838acd58caa5795b54beb0286830384cc96ac053fd6aecad4e66b77020fdcf3b13f7fd29fb0d9ee644d3bc7a75d55b4a521b542d497a9327d4f3ebb5090fc3b8afc5427dc67b42947ff046f6e32efde7393ebf09dfcc9d453af0f3fd52c9f96dc1fffbf42a7e1074ff07d0fd345e5c9f59dcc116c118c4e6c7bafbc18348ebc8855335a46562a6255baac9034de5bc1f07bb398b529f08684970d27ebd3a1f444c353307625de40c2c0cefb4dcdb7909a14a0066787a01c50f6fb9369c22857b72b3087c5574a8fa1a3fd8c01612c2080f8e893298c09c48276dbb21d8b78abd91fe9476ceaca525e91c767730e2a81d655c109a858563b9bfda5ac88ca2cb614937979ffa64053d55e5d5b154ca9ab61861e1dffa5e4a425187605a273ad3499027196e124fe8d5315951314a873e2bae974c6add3cc76b2349714fa3c4b54637f87eb97571b5d86577c129e2fc3178c55a414350a4c8bd8c97bb90232098c1d3f94ff49591e7f2fd71aefc4fc00f33a4696fb4fcd32560f7905745702b7ed55fb5d45a83c664da8bcdd39ef6856a432c5896c27d11172f0e8664c617b81d68709fd7f81c4146e47388088223435110c6d09dc9f84a2c08921137137b5bd43ad0f869a24f8232293bb0f795ef07e987930c1c5e3e9fd8214c37088d15371442d5e7da04fa83e4c67e1d89571a0ab6f1a0e31f9451ffa67b22613427b4ab7e74a4f3bd387c013dbbab7e7e84512ed6ef9c46623729106c98ad05c06cd4a04bb390ceb624e97308926ee2429dcc423c1454934d4eba2e3b5c2290d8c533e8bef697adce5a44a91ed03a9329a61b229cb074548f602000776a13ca80bea8438a06ea82bc2dad515528363e5d35de697c0aed23c9aca088f0c73852610acd900e8a174b776c1234d86e604400e6ea75096399a893bc90d40e1cb9194567cb49d4a84e79f84aa89f0553c0c888f6368c7f20987b75f356e1f8d3d23f654de05b62922457ca86e181c261825761985f2468345ce913ffac38d3c790c2a6ac6dd64fdd7ca1a95ccdb9446b158e26c0e8c747d4e7202512c1208f0edb6ecc3fc1bf61edd1aa89d27baffec0358382b0dc8e05e8e9b010bb8fc8038e090a034d14b940c26144ad41615c6d06dd789920429c1423b032ea0cc7825dc80c66f993aaed20f3cc9d953d375de41f424d77aace160fcd8d010004e6434bcdafc9d2340dc247324f643dc9a215a2aa2bd3f0f2c91e92628e1a254b6016a68f0ca5e9e0073c899a30fe11059db901db29b3f6d301f079d2953a1c0171384e756a0a125ef16d4e0973723e40b7397a18216c1ed55c540ead13c65438db10fa953bf16b50841fcd9a321e1297da3918e8c6177b8e05429faec1c6341fea07ea001340a07afc0352e32b6b42d64880aa7db2f19287f32610d32856ffdd7d02912256bd64b2fe0bade78ebeca8cca72d51a011481d42a2377416589742d9535f560d88be5761556a4662f3e900d15d342ab78ca3b1a4209ade193501886e504ff05d88c4be94a2691b19ed3bd9d1c55fb3a341752a8e76a7daeeb2a7a6370fc8ae096d197d9a10b525aa9d8cde1c447d57ed0332baf391d385f3baad2495d22ba3bbef46468357e94c4c229b6a4d34327a2c546b8553342227a3b542f0e7298156b3b604e2c9e86aef2da3d7ca380396ee44a9d9e693d1e997e99b46c4a1bd87ba349aa1a2ea25e6cd01c35d2e38b12e3fe778d54046e8191ce0bbff57eb601de11e5b8946085284212042a0376dd9865e32e4f1f7ed639045401ffcca62423708fff9b898c06fd410899378013ab0d970cd0150db581b623c6716bdd382b92c4274030742a4f010e6e2657be9bd7354b57db75a6fefffbc594b897431d4c08ed5354e6341634589b296b2bbf3cda1411fbd6582766bfb8ab02e9fa2f6b246980552029b0e096377c6442e10598561b4e3fa8ea77fd90e6c42ea63b24ba77a520e5e018af8fb13d2c0b4f0f1bfde60fe18723131faf3c3211a9de91a287da7bc6fd54cb1eabe1e952ff7c0755f2beed2075fc1e50b43deef3e11c7cc7dad102fdba1b53233a0d725c98a3d3c11f48df86eaa76fc90581929db9d59d2033be3fb58def7fef0a3deed16ef8fe028e9fb0122e1f6a32cb565a620dbbe10a53197cff9c21f9f7dfcfbe519f251451084fc642c035a2a899e1223c565109017e974fe99ec7fef5df4a33554e26d561300a88a782041f1169e715bee77195df8957b5c89cf4de292da70984938e115046a69d0a56d6514ac791dbefc01c278d56a6e0d5c64ef9abdbd57a52a8da8e96e454a9a2751b10e48b93a0140d1ed0dad805726a1c278aecfb735f695bb5c6c8d9f872e22f8b707e8c790317422aba2ea540daa2bda0d1e847f0838638238dc1589ba10d05efe7e1254e209a4d9423c37f74c2508290603a8b4797478652c090a3dd33a2a932d3632e1a5983835f74c0457d79f19b5c8269202b3a2271c2ec77fc71f6c7cbd4c53505aff031a917839cd6142f91f90124a939c7f505daa31397c561c3dccc546f5f3fdb945184a7a4123c1b181b4b4a903f40b8e181f2b685c2dc88e1a421e20ba162170c5b4f075248d6c725a38d6983d7da07ce947a5e0718b66a2b507970fa3d68c7cc9384333ad01ec451aca0c8d1da56b8ebd342c41c559c2d01cfdaa330a30bab514c1cedf9f9245d45f482ea82f4a85fd5d78a4bdf847ec3a7deaf115bcc877ef8e876c6710fda43120420847a65c8278496e456298a94d5f9cad66a24e6f4f502dbba11c4b0f06150b122e85a942489186cce3cb8f026f1aa0be9a9f48071af7d6af75aea1a1bf51f6c0f310bfb0146c2789eeee90ca01308ac97976adb800ae6c73e5749ebe5addb6bf07e9840e3740a91ec8f0d05faadee92985135c0a5060f32e17a84f2e82190ab28862accb03f4615de6d59711557bf4e017e2a82c6977eb4f961e0c785caedbb70acea4c7b98ca242f18851102ef02e85644dcd82b792879b6ae9c3b2c1a91baaec4dde3204c8b6e745806c2d254fce09b914b4bbdbe6e093f258a6618b0716c28e4ec1c55d03439b70ddb03f2c7388432d36b0d46e02a1a1178a9a7a89e03e77b58ab0cbe63389ae24b51c2a3fc8a87d19bb166acfb3df15a3b9499ea11ec07ef0950f17eedf33ebed7b50c5fb0da7f23938786246581e556c108bad55d3f6bd707a123061bced4658ba1e8c0c760834e2b91655b571658e57378a7057d85ca22f6f759da233e63cccad9f0d82b02934a33da64628190a1111f4ac87c40eec42872dce2c2b0084e11108f025c660923160dbc2f0368700db6698f44e23f0cba2f5d0e0f3a5e5c585d2f2d92f08d95caa2275e476ac85beeb45e6904449a893c818d0b775baabeac45b4bf864098579efb3f90df1a2da39d838a660dc169d3c972392f6c3bfd02dd9799d61d165837199498b35b3510ffd7553d00b4ace278e962a12dadad7c6c81cb33f969ccbf00061339cc066f415ac3001986e9f86121175a62d5c9cda6723ddab1860aa57f2f97e943404c64d9fccf8fc778f66e7b629a3ef9d26bcf1763b7e94e372fbe9b26961b5cf2428ca6f81fa825850d037bee0f8c4713cb4d8e52b9d19cc2620454c950f57a6c761802b8b26cbc85090e90453fb6501c94ca94d69329961b782ee6accbafa71f3ca5c44e932c8f68780217d162c32002b3c8be4c2b500ebd76765450f2f2ca5525d8b24aef4e3f41edbaad5a3c1b738326f5a24f174db9e4754479fced67fc1059acbd39f2aff0ef2a22580c61bef9a846386bc28577b5ebca872d185c70e55ae586e45eeacd0f6db360b761400ab08ed41bfb8321a5a8e6a81af7ea3f91733b54308e04c44c6eea48008337ee551dc8f0667e4e19a20a971f7e3dbd1337a0985a5f609a72bcc7c6c8a9e36a34e253b941a3a407fa4d266d84bc66b3a25681f40a597ff0e88111301de0972a95f6ab955a038f062f4158c4d25ea647bddfaa9b2650cbaacd280779d7c55f910c28705a672021521470912b44efae412b23dee2987846db96930757db192d9851976c2c86d00352445388e6e6a4c9b295d4874c4b481f7b3c21b1953f7db922bed34936d2a863c078bd6d03fbdfc8d2e76f9feaccc16fda3abddc4e1805370a32deb420f1a35bf86a5a2b54f3e5550e79c1c6fa376207f3682f2ef25436b73d325b6b91e3a29fe6cda7ff51109893dec191845b3544fed305f724b00e1da152067680ea69d0b4d394aee151c8fc4adf0b5543b2605711577dd09814503512c5da030add5e05d5e524b2c227b57ad018446a84f7e2c54ae6fbe3efa87555eb2d4f191751ad9e1d747c1a53622af3d7172d46cd69098b8d51dc5af0a30dacd0e99e1b4c507b78da5f33ff27b0f997e22cf232bfa525cb046782dab2eafe0820a2c41477fa90a3ca4b5dc9a87ecbceea4d59be281d1c582a1ff6250270412a0ec26a6f908ef11100001988850a390c083430a48cbd2dc9c6121b623e139caa2e08c7931f2c915b8c0916c7a14245760d94f51dfac491fbf056ad70a7716e446d817a2496e4b536b547647556aa6adc0997f95a2ada9203fab345561f63151ed5a94976d05637bb08e8a8714fd0b445bed7d9611140193cdd32a710d37ddc394919982f0aec9c6170b9610a055344608d4d10e1426f74a3c88af770efe604a6e272c2fd8f57ba77176123efa2a79647a3618a1966699fa56ea7d7e0024ef41938e4726cc7ae7e3548e834f68a41668eb6ba109df86fe0aff85d9bed041810bb122cb3e5d2e05b22df1effeb43fd251aa7b91ca587174c8c18a70bcbd9265caf28177cb0bb5a19443fbae5bf9ac43ae258e138e5f28ed14c7630c21e7051698097d6ec01f4682d840b0b0551e67fd0fe9fdbbf7924d6efaa69c0c35f793e626927ba3e97604181b7311f32067b17ef35f5aa5b75ad9af259aee0eaeabc71856050f74120b32a3ab4b16e9f91c77fe7b7b95cb852670a8ac91f72344e902416cf1e106664f1bacfd27b2c38ff8bddfa82be2cb2476426ff308c7159db07125370f28c80f5dbe81be68069fd0bf714b357463e77ab71cc7751517591e5a50aecc24fba30687a62b10328fee58b47bb94d48cf799c5bd363a47bbfd5c3d0a07b981402b3b83614d1eee95c25dfc1b3ff1f2124824b31fb641ea6c7fa606380f8dc3e21a0e9a0c278c81fbbce5e4338c3ddaf0d06375b0fd624c09875350936c9ad08d21eaf7a9bab281a6c7d2094740303706203a001c392019c4f67122891048318617ccc4815777e122047343bfa1260c811fb8401ada354ea89a960b79b59a579c07e1c0fcfb7f381ceba0a521b32c534f9df71d3554b98902338ae7ccbd2c61a903aa2fd671eb4b2078f755a0641fe9c74348b717e1036501c6e61bc560295c06641e939ebccf4e9b6021aa39991f6a2193fc73b44739008cdb0760b81542a45b343280e2f1789661cdc282cd333b5a1915b452ff55c1f961796737d423454681c070df4b1677afafa83dcb0a64b5abdbba1088b5a32b851155ac66415cfa4dad193d3c4b8f436b14f1647f44abda664d69c7d17892c6bcd7759164f9a76ebb8059c3dcbca6bb9c07f55bda702befffcfdb885fb1241ec46a7cd58a6e9c09edc8b23fb111856433d4240bc843e1af5d303d03d98aa4192022ed6c0d40e15ffdbdae9925d3221b8c150e7b564eebef86d744924fc7a8c2e41b226d79025ead1c5e6d6ebc80a6a6960a1e2f146c0510c26137cff2b7c9da443f62901b1c1a6b0c4e5a72b8a415adbb21788e6881e1454d53de20310851efbe96e30ce40ac03432bd1494f9e004ce321a86288160bcc558007fc2e346715d8a02f68744dc97cea3b271e24189847b4aeb40233d860b887a0c938c9276b78b3b2def329b314594ed5a18d94cce2ec4241c7f7112fdb5429b85573c23af332712c8d86265c073ed730453ca33c90d2f5b50b95f9f1204c9ae2094333438ec51cb2810404dac3429c7ae0d58c3e87aa01f7dcb09e6b46f2e8ae484e03f241cb3e9d2dbbe62d7beea282572cad5bc21c649601098e92c7d5564fdfefc663f7edd8e4614f7d935f9f2859001d362cb974d9e20dc918e3ac7a83f50894dc887e039b8734d758203cd719ef8df58074d9645fe155ee4c97718879d4ca43a96bf39905af2b6d6fe0e990552e8db98e8e6e0a874708b3339a7a00d4f4584ee1dc8362fc44055fbd0d23e5fb5efd477dcdecf703f244ace93d503e6ef84d87e11c8f430202c811307dafa258b76d7f7be674d3dd336fc15362c39b16fe6c2cd71a8306fe9dc9bbe5949a2c40df1278802311b99ccae5740674f330121a029d6c63e9bd291be89e75ba17ea095d504f9ee3d66df174e9a51b673f8c832d0f0090b453a0fe8f941f92687a1e92284b5043042f86132270118bde1412475a69c68e75513b90601a0e018f43caa0500dd6692b5c2aef91fbd59402993797c69a871cc2762610be69b3a662ef1bcffaaeda2bcffa3e88a67227060c75016d3a918c54a704f72c415f400f9025211f0eea83cfb03764c703a58f353305a8fb3de9f1b6642314df27da84a2781998015516012b56a35d9329c102ac04f7a7b6ecd719ed2a246be0fc4d2d4274fb437b7f2ba986624b973a65c1a75b6b03f43bd2e1303f8862b4a4cf317887e9fed504a0fb878bd1f7bd9c638fac9fe90df0314b4a88b27d181667b64420301dcc1e81b9987a5a6a83627e782c98fd1f070a28d70e4446bfddc01d151ec014dababdc1752a0800da1c3542b5d1e1dfa1ce00449764f652d9f8a92ff1fef66e81c91c0922c7220122180b981c98cc79562f2f9945b4fcf29359be2583a4fbebb73a0b2e38927ff345cda9590c751a2c7ae8cd156e9ab16257dd5451a3432333a2d6100bab78f00a80a560059c8f60b1401106b0f8ab4aac685984c358d556e0fecb4ef7315bdf39e9a5a5d99cc18c0bee634b9179b0d6aadc2beec7b315f066bb0a87573a62ff6f8eb028dd1e47b46b27833cbf698bfec610c40384c5f2eaf3c9691f8fe7551831ffb8b2068fe7f349ac87e89be487b6a6ef1cdf6dd59d1b091fb227dd762ee8812bdb9c1b6dfe995e0e3fd59ddcd587ca36af494cefbd16ea429e674d757fe977fd5c7a381d34e5b8c9f5f6cfc8c7d267290c7ec088ea45971043d1814597c89371543d293a06c1967ab898b0cfec3a29732c4479bacf7b05b7d134ca743db6d559132bb2f3e2ed91a266de68f8aaae072e9a0cf1cd96777bf974a084f9d7a5ba9724d15f3053073aa1bedf00b158e544f1d59d9d81ce96f8ae59c99a8fdac989cff3cc67062029031bcfa670f6ce54a33868ab9407e3d41c115a9332dc2cc566510edb6f5d4fff064bc9e1b66f53e014d1e39e53ba04a39cc2ce886a8344b535f18f549e306e9928f4f73c7a944f49f281d0a72b39ffe3d8f3e42bee56b780fb85398e2d6c4d56cd739ca41ee8aefcc064b7cca4083baa7e5ea5ea5ae3a8e7ce7d479fdfde68ce3eef1918c491fbf03d3c85dbf23624e9d40c7877dcb49a92e35f783d6fbf7088deb6258b7c72686e877c3bc4765f3488b60cb26d6bc72127d18516e10934c015537ed3f2af831f9ec8f2d9d3c41786081a893da6b91cc3f604520b47b9aefa8b54e64916e4c0e6e8e94cbe80488b1ed8ba403105e416106cfa0c2d83f9e14ab2e68ed59887ae4dfdffb71ac191d9991171f41e6b5e8d1b983904868694d189e6bfb7e266ccce25d4b65a365fc2156f929ca78747b913b77971b1a0d3248fbebd58827f152cdc5316fab2042e2b5b30c3cb7078ad566b48f165d3fc6e25d5f1cd1af267902e502a0b62670e016c88fb5c1ff4b65506a69e20bd2668a4878e10c5e4d6d5cf29cecd888e180ed70e08e3e9a5f5394adcbeeb7d4a693d6fdb26e6c5d3ff593e8a5eca8f99e0bc85792df7ff4c2acce1efb1cac7d8931924013d8749d4a3314d99866319aab354c4f6ec03ee9512c01c563852431e3a9272234146f61795e966c9abe451c6a00686db55947300fdc65ec463dccc2be4d44de62ed52129c4ffc2e4b2bc312c860b6dc8fa3b58c9ed9acd42b897b2a7055f69ef2ee8852ac20c2587f87ef0308fe68a36b3a9218c7217ee12513c3575565092e27334b9f6958761d3d5fd2bd23b2adb3713624e638ac97d59bf02b3d5b3119f4cea19111349b0283be8f253fa9310c795423e66cfee2812cc09e1a2faf7973175f9d43d41a0386e4c77033b9a43baa9496828c0943ce03bc5af3dcce361d340a9cda319b4472bbb1df4e37ecc0c8aa05547447504725cf3cfa0ba421a52a9790dd7437531be2ad259efa5eb5d208b87da056ec608c15bf4755b19132131fefbbdfedf0a363f5d701f161554a1d998ae9af794a6aa26d47e5f3ead6c97bc8fc87b34fc9e636b0275c38aa79578126cc07cad65b9003868fd2c76d9a81eb081c375ad53180704de5515a02dcdd99dae4d51113e7526e50bed7285f283aed990eab23f23b8bb494b40127f4dfad432942f74db15ea07a2460daba88d1e08e85e125a54064f41faf64cb5d7a0e73ddc96596a449629110374389009c6fa92f8b69c4a6cc35823236ad870d84b0e8b5743f70d4e2831d695f437304686af9df5a0139786cb371823869b4d5ca84bee6b48440c9f39ea4537ee0cc7352ca2845bbbaa38604009b33f4fd10bb7c39f36ba3e0096210640f7c685bf1c4e5fe31bcba57d91bd512e6c17be9d040dda770fe5983abbe48166fa7ca375f05a2625095822c792602fb496152643ec9f5c83e98de83dc53a466cb4b7fea1858e8aa9d7a7e21e32f0c79eb3cc64ad4c18e039e008c5e7738b7b03268ca650f2b4ee3fc91ad94cfc6481aa2cd62557aded046e6d7de9f948652291e4e8acb24f820f72a747db858d2c2649a8a0974977aed4ec5d2129c8d8e015392bf52c94711c3429fe1ff23c7398546565adfcf74c2413e43bd21bab8e41be394c896d0f59df6d7b6d836457e56f6317d27957eee817ce6089a8eb77cdd5431506eca519906bc7aabf47acf646ba9d9d82de0feebab1c467d4c5d06a5db86de202c6c8aa1ac5fd53414bcfe9f80897cee60d2d368fd76bb48980a71350a6f19f472f110b4d55928402f2a7f1ae1e6b0d117ca108f385af64d6616eac0221e47638bc78f08540c85044f2f1380d44116056fbcad58a6f685b714ea29b6783314bfff72b65ceb5b72b444b6d84462c075a1682d806bd11ad9ebcacac0ac5231133dbb4937b081731b3d69d8b71dc9878cd483cba66d36f5fdd6763103031dbe8fb907267b5124f6b536dc87c5afced1a32f769e4530c57b3167052a45121ae2a2cb97ea5e3261e00459b7502d57dab7e199db4a0cef41112a20981769f4e2764fcff6011ee9c784c0e84054a17d50f7195eceba51ef2d3e1da7f4e0e2bdeccaf681c9f101e6980a59995dcaa31d140d99a0b4212e379780d36ae00c1b3cb9ef436259aa0882f139e904913c6bad986ed94e6443b6256160d2c1e408bd8ccc2c2f643b0bb9d5374433427c3cfd12b716a712a3dd666529cc838810b9bd115a5505a103b88adf6ed301a1e3150a4106aaa1d0369ae824678fa8b47446321f27e5ef7d83715a341e24128be0fcc8c63691d386f9bda05c64dce1d048f5dbd0fade0351706e3eef2a5e48897b7fe2acfd67655281d226b7f60cd09ef5863026c30e991abde5f387f5287eaf471f5413cd8586c9f82bcd70b37e062ec7c48a72f9447c50e768f230a4f6b6f5a4d1b41379afb5fc4e1a9fa9d0cb8735faa636fc1b9ca48766ea83024d87708ff830a3a40548feb7a9daf271706db03d9a9e17be4a4247ffef6cee34cc765627538dfaea567d1259592ac9058ee4bea132ab3800d9056854871790c529469fcb12ed0a946aa4ace71ddc406949c78840d5adbe6d517a04a509c74fac5c4898f40e6e4bea9bda102bb1968b04331c980dfd11bd03a355b446cabfa20ee4e522c3d8507d913c37fecd7439784611384001d0a2f762adcf3964b5b8e0fa5ab8bbf751a556a265e337be4545db7db260293305c6d913f4890df885e73faf3eb9d37fe6c749724ae673771f0c870d0a00ad98de906cdfbee768b146639216296bb9302aadf05bcd9abb28db9f0c2cfa7918c8f51c92ed18f2a3c0c1a6b5bb6bee6243682e7fd59df198b0b4c2199cf78ca5f0df921324d965eb0909e028970d1c091cb1e81fb26cf8a980e29a22fe7858f9dbdfb74439ac6e8fe08157bd683d1a5314ab5f253c8ff821134b604881a734e004b5f347fc52a6a6ca467f6188d494dbad537a9d12b985c5ff86140ce3c957996ad8b441132aa30b412f3fa16d181af4aaf9163fc3f9580a3880397f723088e51827d189c1511126a66c9909a03671c49e86089a04db1f43705882844c1dfb2053129da720108327a6422c5a25de237ae950ef18801682b9e09befca21e9591ab683a16dc3aab85993d8f3c03b77dca3d37755e376d4f0944eedc54c53fa7f6baf8d76b333ecc21fc515383c9b55b3728949c4cf6aa420083878cd6d0261c4b3d11f1393b930616a7ac2bcb6ce55c5736a70f12a32e5efe42c94128dc8a6f50caf99e5bd7859b8a736b817d392ea75316f6aa5aee8f38c9dbe0dfc490b11eacf15b29031685487dd65adb92417ed912aa98cfdc7e3932bba483ce3a2181a1e41a0f4a32fcd262a0722b941cc3fd0f8531124a2e07f22210e7591875958c297bf86d38c929ce8755f710af2c98b31751d5dcf396bda2482d2c8389d50ec2c3042239560cbe0bf978eb606987d26d83589df921f02c00f69dff23278d836912044172df73c91d2041724544c77b48aeb8488cdc99fc8ef4ae882a4c2a446eb140871027395c6adcafd5319c20e100e616013ba113940ce163aa5117cda63a3de2e8fa867e80fe6433a57bccf11f72492c48e40599b2fdade1da5e8acc97e4843cb65442b99eb511d4394966c83b4ac2586434a8e1e49e221c92d3481bea8ca8a50fa2d5b90c4fa5cb0b331abb8b6cd145cb0a3eee23bf403281f07783c9e2b84b113b96851a05383fb7c38aa1d09185065c8312f53b07ef1b33393809d80efeed8eefbcf8d1cab688a5e94f01ad61d35915ded55e93600e236f65be667aa757621e82c6ba62677b503bb32756d470206920157558aa6839d4b592fb98e8067643ae8c0f7c903eaa4c0ab2b9bfb27e15a054a4a5b4922561fd703487e59681f3d06859bbb0523262c5df18dea781cdd283f081f803ab3fe4a81270cb5fa931bd53ee30bfde82444a7a9f51839cbc15e3946ad046caa35ba368985a7b1cfb2c680099cf388712d3209bc7e5c4a72008f4577f92b723b940c9f5f680885ca2641e331ad5a0add6d3323ba3c2f4eb3c131d44985c79b8547c575534b518569dc97103ee4aa5d819902c5a273f1b27a2a764689ac85fd55b914f78e661cddf1b96070dedb9e97457542e017aef0d1b663129eb69945e0507cc91537eb7fa36a7d896e478675225449a78f652867ed489c37dfa387ce8008d2ef50055ef84ed4dc8547af2293c3891c9a1bc0754657a7e46fe80e4404f1fc384272229a9fa1cee3791a2e4f45bf8c20d34b4d0832a05dbf71bc3123b95dea2af70a2e440b1c4802a5f3c6aa09357e1a789114a543f84e74dce5412f221ec3c818aedb3d121a904c769dba29692b6104719ad313280e678e89b9b25a2df8f073247dc317660489e369844a18a08218be505e4423dea0c3b42a4839ea03be8f192294bb422f2d758f4c80ccbd87d4637797a34f8401a019e459fae2374a9a85752389012693af215487d4b457859189168e611c8326b02360aec4bf069d4a98d5d257008447b87d0f009be9e94815a7fa2ee94096a588feb1e7fba8c900180d0613ab26870ab24a4a8b67b43fec0576146e050685671031886597287534d0449af26a021972df1489c451884dd9593cb8db8dc1897ab38810558bac5622b3cdebf9d73c07714be69799df7a1833051a2d51a07548289d2f13f6562e9938855bf274e75409d204b63b6b812cfc1e21c8052ca0c76069c6f0ed0ec1d3296db0af8a5d6b09816462366266ab43af4bdaa25bb61d7206fe149bf82c46fc07399d19e8ec1e5fa9d72a7e0abc0dc93cf86acf5131545faec04d716d97590542de8ee47b1d3aa4c6b94847b8dde153cc8c12b218576fbbb7b9aff93ff2cfd9a4726e3652070244664b3747671dbb932c113de57f57ad83534b802e5d79bd5d2b2b7625abbd5b307f8ad4b86c2eaa991cca096b865660e297d92a60fae61937608130073d9b9c7ff555fd852083ba951a2a36b71d52db734fd5857220538c9d1582589c0fdfef827b25ba5ec5025689b40b53a7b185fa5263585112db56deac83fddaf5f1c4ad548a223efc560268d6c35b4762e607027bb8ed6031859b28f35d0723bea1f34d7cf32352db1a23ecbf5b73b641165ecbdf566ffd58c93a7291045d321770418ccdea547b0f6b7aa26346bb3a9a73f432a3a2b79388034f6eeba0b7da24196293d18b25f381682b371e74d50cdadd6ff7ecd1c21ed68848e783c1da9c3bde26d5106ba69cf566a6f5eaf2aeeb2941c0af5901b8d616501acacc12b55bc1502f01ce2b8d4acc1c0a7620e3907ab648431f6243c3787c17c8d0710cf17e586cf3225099d8979d0bfe44764b5bd088c66bbf07837fb2584fd7016471617fea13da696f11db22062317a77a4125764acbb99a4cab0d4947dc0e3c1de1beaafa758cafa5d435ef2bd7a4685ede7e80a4a1287fc3cc0548167734b8024282072ab76357cae431001614c841b7b1d1dd46ff8b6af63acccafe963b2a5168bd28f164927922c407006fe2c7d52bbe2a3a5ede839c2a7543a66813223a12e31b84009234c5583942da53aa3422ffbe6d5249941f0fad5ea995b8fa1b9abf9312fb9babf668c6ee14bbe522ba81eb71c92a8ade59568a13b78cdcb43473ad09d0a26dae4b22eab986669737d557b95a9a0f5fe989d026f6aa0efd8967b11de55f45fd1c84f0bc1ca9ac1cdfc8770cdd7a1c6a282bebbcc1b35024d5849c6443fd6ed92587b3307ffa0c138b7b1eaa1831b73ea182505d0462d274a9803acf0ca5ca66ee544223141469de5f3ecdd2e36a73124782157213fbbf33f24ea899a3b2f7e4ea4c29ca8707a027d593531d13b249b5030b9644afef0bc81f894d923f4d4a91237100c6279a5dd6b1279103a93752690ba40d17ab5f12d6a7b6e6b89aa81043dd6219edd257a5f140d3ad0d28378f1368d49763beb97540181abd9dd9cc5136c51da42f4fdd9210a6d4cc7828473b277342f86eeee1814a2ec072f773bda885ea06c2770014a28869414c721375e856805783cfd5dadd57253cc1c484a75bb72f8ddc545fa197a73c8fa79a45143ecf811e76efaa432efe8c9ca38b49691215adf6ace334474f7f7122280da6cd2880809520a693c933b86433b75fb51b7eb91c918895a3f843f643b87ddab5bb821edc38b4fd411ee25aa13ff73cc0f20770cff1b2a516b5a024d6455e0f00023633c1a9b2f08534e107c2afd5f044ac3b4c5471626c3708b237fcff98771d2cdf29fe4634d6093d8892624a6dfb7e9d5836b6597b8bd0ef849c4dea5a72fa87bf8f22eec8bfdb1bc4f133018dcc6eb98b2328e17eff85a2d9a25059f87abd41594e05b1c6d3419db6bcf1f04c53fef189dc93223da0c0fb06b1ab1dc85488c8b16b3f2d3474f246c8d7e72c3149da07a46aa4ddbe6d20d286e922f2299df5551538058dced82aa252f5aa2d0c52e4486c9451d2844e258462888ccfc0a8c5d700c6acfc5d6404c4c17d8e48c29f860419218556d1efd954a329c9c7bc5bc15e4f674bb9678ce389b3449c5e67bbb4da8fe99c11e95f18fcc91e3360b5491711ebf89f6c30a72c394b3abc64b41e237eb9372b624407cdca595853bcea81b4236b0ce594328e1022d15977877b2622a9dc52335fcfd0b04f20ff8d0291d9fc8aea613c21a0f498a78c00b2c5ada5d96294f63c8d5f0b35096ffcf9a38e6ec894619d59612aa1f01d5438fb566d3bceeaca3426dcdf30c69d3f8ad361c09b74e029c1bede64e1662f0a6c3102448a1e0446e52afe6e9359a5152f03bc904e9f389c6ee2967bbd8edaf1ba33267f29badd0987073a343afb8e36b1bc9e48e8655c558a34119f9ec8c2ddd21b3a542a144519a7a739190f15e0a9ec21b1042cac13b2d12ffdfd708fa684c4c5ed0cf1a9ce9807d8ac981d7d6f29a51b9b5a2f371244aaa675ebb5be3e5c53632db81b29166841dfbcc3d54d392838c0d1d44fe515856e81749f530c57d81ae8a6a055d27b6b5b36197c1d311a2f093f0050d20abb0db9090aaae8f43eb199341c8aaeb3056340f81bf97809416aa6e2fd3531668b7f84a4f6f6521b0dbccba3d88060c11d24c244cb9f07424a775b5ca24ad41648ecc9d0c08e26f29736f90d645d15752dce8935cf20ffabc4d6248e8da842c52b2aacc84843c49616b2510cfde6c8129494cdeee9c688e10ea50dbb7a6369d5aad2d6b0e70b7d6e34a5aad380f8f684e0f0157179514c3a5f70a4251f5543fd7a0938c0994c762461d07b85996b6fa521847a67eb8654efd620b279f2a334c245ec2ad33ee74f95af508bb452c3a870d2c33477714f0034db8283a6727b6a6ee1bb845fba02ed6963ede9ca608f3244aa29d04275b1a9907c6207b1680057ae4a200562e84e809c7dc8b3d463475c3b86a73090cc937dcc39ded51c3c5c21b207a6511a483e8f25f04e0ea753ffb8aed692acfeec3834219840f9fddf6e0dab35677cfe024910b4a820613d86ac03222e0769b73eda164b967b89cc9a630abf47b466bbea1b33f5e0cb85d0a48cc5d7ddb619845d4a46fab274849016391b05e341e3f6bdcf8d2d00235c5be94bf5de49926d1ddad708de20f98b5db7b210fb7a6bda1c0c11378af70e1f85f02866d4417c78f52eeba9371733fc27693139547a280ad8279f63038b1643038c7da66b538653c0427d2f0c8dbc93e883bd356b926c3f12aedfb1880bd92c24ae5b7876f347cefd928eee64d7e4ff106ab576cddcf99eadf7d85320392d9af1850ca0af41babaeca9081d9c14f2d42dca92e1d96d76a23fbaaf78f9ebabb0b7af78994e4b50147d18de246ebb5eae5b8f3c479771349e69077fa0fd610c396d8a1992890a4ec72177116d1febb7eedbe13b0d90b7d09885f9534944e705dd9819ebe3dad0adcdd0983f8a9b74047df62a0bf5bcd4550760a5675e09cf0c754f9e447a72f470020727ce2931409d67bb59ab0ca347fbd6a77cb364ddcfe56e95d73248b491ebcd266e5a8dc8beb3ea2e327e1d58477ba0ffbb3fff5cb1f7a65f4b808a3f05634d6f9d23eeae7f144603658d5476805ac9d51b3ecce218f276752224f64a547ac896b8cfd944489abb84f1bf2f93d47d88b1f218e4bdf34258ede7f3c64891321e71e37d5da815c4fbc5ff7412841578a0c09e38b5de6ffad87b14a2aba02c3e164a0fd985573d9b6c4da174fa0f60bec0540f6b9eea738ce5d8d226340613fc7e2061ce0a7a50387b745a573c76f74146624b17fe62c9b860ddaff0883132a2c9a20cdb02b090a76c7aa75836f07003cf4fae037510a6a245ddf5a0c70bd4604cf4d11006e49243738ccbf2b865ac9c862aec989879b446ecacfab8ae126abd2500bb8e5c5b0293a83cb557d968c05548ddb843655e7baa7ba8f3c5c9b486d52b83b29f263310652678b87b873e4d95eb4adcbe3e7b9352b8aef68e26e6e9b94962c8d0ae244c6da4fa2b2a55020ab7450cf398846b772280589114fdf2b04231883f861a1fdefcb477b8f49a00f492067e8df91852ca12b98f6d59dd97817ba5ffc9e51a0c3a779c56d594a963cf15755410d57a6d0c5eede795791482ba2b72c9c6b32cef613e4c1e072d485eb110cf5bfbfc84994677f673ef94cf17ea97924a442341863a94904aa0e086ad7f0f15c0bad35142181a7d6800a82463a5b5e361bb64e88a130f12090f72031bc3cf69d09031b1ee4c6e65444cbb958e6c4670c1e02005222f54e6812d1fc93bd81162c5388df424a5c109f3051d175f825205f02020cd738aeda6a87d5d87e49ae1545576b4634d878ec26d8e5a03f425436fba4f955cc94455087b0114612480de79a294cbd0397a6df71e01c4fdd487961cb336eae158301f60cebd748a0ff76fcaa28af45a980d6eba8b28b079521ef987cf545f40716fcf41c9ca10b572dcef09518ce1ada0578f044c64197cc01e74dc423f8f07644ffe2671ccd82ea193ef8d9423c9c10caa9457bfcccc5acb47017e180be6b24503809a9b3bfc3536e29fdbd9c2cf7044b70af0571a1973a09fc794057f1bf8a01fb20e322eb8ba2606e0cb49f65d3354abd7444bce1586849e1f598f09cf518f01ef69c1a5faf099164fa1da98570a72cb9026cf8443dc449c3fe8437a7c38dffe1cef971ef0ff839cd70172465a83f7b2342f3bb36b4b074de47f970b0ec1277186bdede4944d21f4875c3e086c0d4beaa6a04927649fc27e0b52aaceb1559de7c68177f985445ecd0b29c5279ae9845c043796cfe0e90af290a40afd473c0de2cd2cc8bf165d8cf7be73387f323514c98852a95cbcb4e254e1cdd2f2478bcef8e6e3d2d020266a31219519a7fc3818ae40b0c4293c8dd0df283df55039810ab64cbd2c93ae362ab439425a48082ebcc477cfd5a4e4887bb800ad37afb9d37ca07a82acff1e3b2e134bb57eba203b06c3b90fa9f8444467242ab4053846ec167973d4e80ef6b04097ef38ff6ec299f65f02a83cea38f895b99f55b00cdb82a4481fda7aad39b599655b74928b0b3ae9e04f746e40a4e9f6f529c8aa462d67c167130b5cfb701f0ad2c1d2227d45fe2582df3d55f99699d91823a8386196651f6a1a9960ccb2333a2e0a6a663cd5c9f9d846ead5ac59be5a374e8879232220fff3fe5fdd84dae653f02e2ec3d1701c52da0e4f33e9de0067d3e1eb4f3b06ce44380ca3703289c977f3a49f34083da0f9732635d644371c6ae0c60b124d616a5219bfcf49e44c064abee66959e542a8a28ab54b54c1302ac48416e38605226afa43a52d17845f320b9638cc512e771a39d9d2c94d76f02af050f71839d543143a35d96c81f26a66fc1731907d0fb875b73c37845dd541895cca8de2d260572a4a50917a3fe7795b2c2715db1c65c9c6685e4397252c02e4e3a0436340f11a4f8f0a45fc69b3fdbe572b5ae6cb31c1587b7f68bf206d5cecc7cafac9c9614a924f09030d165439b895b8dbdadbbda03e5d2681d9f94fafafa0551509111d643f0d059d259deb3ab299d19caf9ccb2755b769f72c7b8fc0026517986ee722696c7f959c201d8b7032293c5a1c2166f3fd7cd8adc846af05de93a1d990af00bdb369d0ef74cb535744aea5436703d59485a1bdd4bb4169eb8517a1561492a963af0aced6eeb7615d424bca7b715a4cfc23c3c9a4293ea9fbc28b43fbeaee29a1e22495b60cf8be7e3a98254553e4c93644fe436a2b6c49427583ff4761d38c4dec8b8209d14e4713c54070e56471c8431416891f85a7903d75a3ea1a331cc281fcd987edabfe8e445163382398fe8d6d6238322254a38a2947a7079a441b4973ddc7b60cb7aa7397436285175ee394713d38bb15b88776a1780504b32d9129031b50198d35ea01096a1be097275bfcded302718f9eb62900c00b321cbf644e1c892165900da1848a64719295aae4ebcf1319a6da7eaab6264afc44159a2507539abb379ddbec2dd96f9586a3ffd52e0dc5b132aff5f8529cebe2e99c883710e0147672aab48fd8a1588bf44f37386c2a5faf110e3fa69a1e69220c920cb2e36c88b2d6fd339b8f0d1ae5908fadc217faa1e05b3103c8c17fbaae37519613a3611aaaa4969133afaffec7b43eaaa5733aaa1a4e6aebf2eb2f131ba465eaf43af85e7696130565ae375421ab4e41da8b6d0b78ad80bf455f6d019027ace57095d714cdcbeda99e94012ecb153528d671fabcde51a71c646abe21cd9e71615155314e7461c1dda4555fe028d2060024e23c24809f8e7c289215b3ffc571f99196c8683ad9ee8eb291a1463496415bba7e4ec3ec188cbb5ea5c158dc6a9fdc99126bed2e9cce54db1c88e19552518c37aed1dc90e40a555d88e775908315203b23e7038297e4bc5c36da9e4b77de8a1f198590ee3d3b61faeadb9e21f0c6dc6b3f5b7e6ca780d8884d7499e24c678104643158b68b0fe1211c9ec80d9dc20268b8b3ec6039c4d3f18eeaba085191c2893319b3f74d19233418028332631463af3a681e972c64379df039c98f5612d892f04a65bfca4fff57f99982866884dd9d009685ebbc634c25f86b737e9a9fdccf5d8cf495bd4c3f8d4f25ed067a067327cd4ed67cd692b96c4632f0408dda114281cf45f3d3ccf6ac4532531593bcc4fc439fdac033b787c86dbb83c9d1e2bf4ad4ec01a9f9d949a7b8ce34c78c480caf9d4f5571804386d31abb7e71915d3abade73c7d037994aab009ed21e8aa48dea3d71ad0feae94b4ae7ea26d84848b5a7ac673dc0b392fb42ad7db34bbb45e7a64269b391d59b62b272242039bf132b0e3400eacf86e00f5501aacb4c655f9478a2adbb07fce1a6562aa7b404bf0ba16c227c6337e25ac2666b0f0e139b3714c2ab604d5e55196f861a37dc0fdcde863ab631ab60570fa6aa43481f2310e9b9c25334e2007008706c168607cc67080fc524d04f976bcc0f33b6a0e660171d94842553b41abe99b99fb1cc514bfcd7077b3cc11b7e481d8225cf8f78d6799df6daf5d0122093a60d9d061edf0c478498cf6bb96159af7398a91de6d9955313c79a699679c3cf73869045669f6f06f27d5b8c66a280f6a0263e7685f6a137d7c55d348e93ce6672a71f340f7d2c7e4f19a4a4ea562cffc9bc335a00e821a5473e7dc40ba28b147c75fc821f4b01968622a7b9454e44d03262979f32d1cd5ebfecc2bd34090b98024d92a4b0829deba2643c8e55f9cfd8eaaa8a5a0f474299e61a113c38d0254a22a92f8e74137a24e4e45cbba3e2d12d87c9e3e726d4350a39ff9f0cbd29ec4993aec3b491e6f6540578377c4a97d2cc885f2da417e669842c5e0dd96c5ddb12547667ba85098f97262abb11a1e3db75b6ac8d97923a51b58ffd53525d71125d569a9eb0edf962f2088a60cc8d4a66832c18bb58d98ad4f86a6dcaea3461c11695f1945a9b05a6de0b692ba557b2feaa5bf710dbe489f877410d4360f5c78d306c16e8e01f08fbe169a0e4330d9f0a2fc293b45e69882ea77cd29ce06c681d2675f3bf38c959a5644c051cfc9fb1d5f33bf50cf0a4630e906d75c03c17a9984360305b4a1826d6de4a6a057f570d497687102487ef4b1667682b49b4a4992c18d309fd4d2b2ae3539ec9563b7cf2ae5637652a981177600ca4bd4285ae5c3cf0c8bed4f4151c82d2ecc8330e0a661a548c797f3477ff1e08786252f6925874c1b21b1d0353dcb125ef90a0656a2b5662e114e997dd61c52dc4bec248809fc27dee1ce833b8b9c50b8e66f96e238054468459014239171db08bf9b4fec093e90081bbb48d1c0a4729b35d4042dc47c929d06f57a07fd2181b9461bc95917e9bf9217e30fccf5ab2891ef28496b71d83e3696784d9aa0c2343544ce8d250ecbe953dbd3e9a2c771b007d76c4700cdbfac6d0f975981f14e47706d7e37c0b6976dbb2e6c901751876de6246616443c5f638cb193c5ab578cc36645a983bcb42a348b5b7a177e6b97841b0e1247496c40fcbf4eadd38a76e560f1067b0da8838ad67b162c50875694edeb93aaca3e1b2a79eb748cd1efd357e8e1347b7eb9c5168af4b20ecb41e88721c602f133eff012b4a4e3f98873d552b680da11c4356a448c5f062c1248ee9b40e8bf35d4bde6243fb431354b30827993fb2d5e2e624fac6fe4cf732114b071eac3adb7a5b40051f985a3454ff0dbdc0b2423e9b1ffba4501010c0d95f508d8c5e529d8ebdba1a7022842f4dbd3d9135ab76e851f602757caf40c6601d6d0cfc70f8ff218721bac1f46c1fc6f1acdf297710b86a2120a726d0aa06a7557f5cccb90b35f88806ede0f6bc356c2215774b6bb4bde3753691ae700b06d6ccdc8c4591bf8786e51518b94ebec8f365fb38780ba67f18d40957562a797c758f704926a5619bba548cd0eefbe1ac6d8032bd94256c3939d2ee5f30bba845ecd0df1034d6f4864b772ab49cee3bd3c154eb2a0c3b50e6d942b4c50d86147380d183ad909faed51d886e58511320e6e120ef1db649b30afa8b37259f62ec4a94c2bffc2d82912d8816a34e28b182db11846f1a7d1ae6cab4a39a035d3fa7316b9cd56a73fa5c1fc790ee19bcac8a70ad2e543e6cf232420ec88d1053a4ba3e179f3f5a3a81b85a3f1b665d14e691248af3c4a32ad066c0b850dc0fadabe9f244132a8381c48f8097b7171a8fb878527064c65fc3f1702b2c690210efa3279801fb7d7ffdd4d8a1c2a94811fe45d6fedd102147528a0a133961731f13faca19f2d263978095b0bfdba8729c33e76e367d379983d79a77166c453e08487c1cdb5952019afb545e83d09de0a3fcba9222d42f4184a7268c92959fdf5f4dcd80150a6a056af541469a503e46673deae1249cb3e962abbd5fa40a4e13c2093ed574d9e3c6a7eb96ee40cb3699ca79c265363b15d4d663eb6db5b0a95178e6bc92089f2825192b5219cb4b2861afc375a7da75b5a4f55407ad4f9da4935556c5c9ca4f233b024131ffca0bbd657bc2e5792ba9c0b2e5e95f6996b350e16ad74dfcb959539888531942cd129388a2c63b49d8b53b908865eb7530f1fc50411a968d0e1388724559a4580ca0e3b0effcc4bd911c9701451019079ce48dc4f2f5ac1fb2ab0f3429f066a2dffc58d4ccd587b98d9b97000323bf1835b6343a65080461941fc2d44eec44f788e1da99cd345e1a1e3977fa39aba94b9c6be56dc93e2bc24a50253396e41bf1e87865b4d8da5052e9c3ec1248fb6308cd4913ea8a2e8771f9cd6cd2a8a66c528b15df19975445f2e55eec96cde46cb3d8670c8cd482b5040b804dca20be3bb4a21b9477d2b486769b58a51b735e8538f46555b08256b9f0042f7f5c0c810ddaa67694413bb93544ad5650d43adf657a26621a3c72a3be2fa90a209d4fc97a43fba44a720fa3faee552a5c06d40f19357e8320244915daed7b114ea90ad6e2c33375afc823c0a1e4ea27a3276c4269fb99686cb071c6f7c15a7bc455d797fc87ce02de1209262ab398709cb557535739ad340ed175668b86b3053fb952e0ed29e5eb3908926b8445c8ec8e33cf474907a5f7254728f90625fcc1c18ded2d1be2b5dbd305cae8b9213349f1b5a3116ac9679356b6d4bffdb8e961277c46a3abd12e7d4fbd2d0acb4c1e9cbcd6e239eabf45e7f2b8b367e5dc76612b8175e73fd61565661e42d3e24da58498fc3c6e4d6167931eca8da8077f32e02c6d7432a45d914102447ff540eab0aa6b9889dd514dd69cf4302290b0b8e4b733c0875fe23e6aa3dd4c0506c94286a08db913d0da85fd2e284b8d63f72c2103bcabb738461d20a844c3c98f10b220a9c0f0da9aa95568b58d08ce1bc9a28e8344aa5186600a99a4b91818ccd838c31a8ff9b2552dbd14848a578f71e951412a5acffd8d66c46c0480415529eb6c061a1d6865dc9f4412e023cb0bb8ed76d0724c0f1a09bc9a440962e2d834bf80257fe66bb28dde9dffe052bf70eaad2d6395a5e6a662d2632c298374f447e88888c05ac043194be49e270363a652390765c93073f3711e1937bc62319ea04c3796d1cc3ffe64d2c71c02b82c324a25ce3447337993565c4b9ffef66c885a8d15eeca521646de0e328bc9a8ad4b6abb25ebb7d6be666c0434c6665f10026d48936603b692ca74132634ff09162ecfbc841f1fa67eee4443b9e3ab30cb116459d2b8705a10c4a9f4fa83415f4247441526328123e8fe154bd1d48eaa4f465a46126935a81c261df3bef848f9fa6daf4a5b9128804951ae7d8158efd3a0723acbbb4e8fa9f34408369eb974dcc5f98d112ffb0b213ec9d954999381f2447eea89360823a60f476f94c16dd8f7d595a5ef15d7afd36848c2db5cc339e0c61e66f32ad319e8a18a1bf9d581277af43386f7de24b1a2c0b0604658a01b495acbb739cf11f4ef1e8f00e9830c222b06c3a9004573d65239a95f26e3890c9aaa065ce4c36818e083a9a66593dc9fc1de2e6fe7f1c1bd1aaff5966e9ffd7b9529c89ea14e6e6d4346618b224244d627e811391c3eab6a3113c67f8808537c507056b892f47fe4040f0886307d572efefa84a24383a7e90a709ebcbb1232c8fffd35f0fec0961013e89618f6b66d66370492cc8c7ae6bc4f08176c5e577f65d4f1c3759e3ea3bad7a039d054cfb76f5f57aedeb2fdfed910e750de98764237b0d791e1b5eed0d41aa240eba48dde66677ec3ccad544e4e7822f05031ad099ba0ad48ed86f35fdc4494fb32ec8d954ff4ad38492a964caa90e0ce7b9022dd10821e3756605222d3e440979a38a92a4e46c1aa99fa4e388e73d3a0e8af33dae060a0b9f54912f17d6df0e49a8c58966cea3bcc8d204cf62b020c5648fcbece2dc29c9ea3a5b4dce540083ab1fe95250cd0b7505d3bd3ac9522777cb33bd09cdc5a70bb1943869c4ca2143cf6db85d068eda7294b927185bd09cc116ebcf8ca424796cd39ea9369f99809fb75f024441271f62c92d211dce283acc15fb0b6ba9f28737600b7bd0d5b856b8b00049c59e4b2ee711ed586377c65a99836da74c99fd74f317ddb5c67a1e1252b4b2563120ba1f1d31fc3f68f56e2b28b3c103ffab08e916417bd2285835c73702f51a4169a03dbb17bd5981f49187241ace054401729079caf3f758c895bc152ded65504cec413bebd395832fe4ee0d9815227c7959b3355b1088d44e40fd6b3bef70233f3a26924ad373b879154b123839458b47699853fc300d94c2de97ce8fd5122859e90880a863651d76c66c7161477bc763def95eaa941fc3ea4171bbf36b6806c9816141a4d83ea445b5a404f5ac7dc043ac9ad54dd11662b9beba4b43a185ec0c4f1fee3d4e6a35131d57082affc75301165474cae43d7b16810d869f8cd11d9ce95b56cdafdf279e68bb7d31af1548485f9896ea8bc77ea08e5ce00e9c9eb888d1761de11f52d2ddc42b35c8d1e637d319f51f8ee56555ae8f81b914503d9bf6ea6ddce08d853d68d32338ca3dd43bf3b9ca4e70bc13f49c194258cddfbdce5361b5b813eba6b8235c17ec705124c05da6e6568b0355a769d2f4fedc7209639086a192b165bfbd20120735eb33bc18038a1b9522b97902312f8c474fb70284dbbb8735f9ecf0dcfda8e198c8e6d618f1f188d6521973b223dc342ba20c613ec35b25361506068d762b624427d1c8cf41f75a1950715ec27e59bab5d30f91976b735be38011259ba122fc8da81c0ee4d137d3ab0e4ddc1a3d2c2e98646b0213001c3a3b0f4ca5a2c851355fa12295b7b37d5a9b005e0c28570b04abfc86a4d98630347b4a39a18fc3c7c692f5cbcb9b346e429474b904895e212a0b285d157a7dee1334686a0c6622ce394f4e342ade1ad044f2aea2b60229129ea33fade07a43bef320bb53998cfe62a2cc90b93d26fe0079806222af3070aad7714f1c16155d151cbc4b199796169645f797e5fdf50c19293181d3f0d9fd111d17f192180fe87cc2530aa274935afad92f6991e85a09ec9179b595d136788f2de29670918b2d09a50247d751442512276d612617888fdb1a309a9992fe2ee408f1ed0840b5b89929659c3b82e399c3d6be7e349e69389b02e58e6a8ba117859710d7b33d3ee3b87e7c965126e201db7a324501db1a6bf3261b827f06dbba927e2a233bfbf158eb1f21ea517c8f4fc38d54132b063889627eaa11a10693792105095ee748d493f1ccb9dddb5c8ddb6ed94ec53927b069dc1c0b1dbda5c81c3805df5fc85c009ea4818d148329cd760f49dd93d9d18fec4b330ca262ce634c8707764b78df269f93d0a6365ba282e75cb8275d8f8675738b080fffb175e9b0b7ccb517718bcab4299072e6345b07291f93cfb43217c48786cd6bfe394ad7438a1337be8a6931959116440808b554bc09b9a367be61b0c54c3a39dc09657f7e312130eb190c99e08132593b099ffde507f2f810a993b9277e12ed7ef4a99783457ef1dc1661538ee319949473e3a77c5580d5617d74ee1eead36098da561b1c881aeb2eab793e9b4af4f8d94a42df911fa1d715a33639e728282d782ad24456e231c0411a89c6ddd0876f491a94d4b82c67acaab9ce8634739859b7227244294be72b8c8ad11fd5c1f470708d5b0a9b1f8b02c3fd7a5c1495b97b539b5b827b041127fc67a0a4de42ee1da217c4f696df32ee2527fb58a92dee957699d41092ae07e9d6b05e10d9bf7c63ac1739edb32c45e5bf41b232e6da2ae008f3579fc2c5078be3c76c755a40113fcf5a882c41d9d9b62b1afdf25420e18ac80e2826ebf40bf96128eaf5a1fb3cf85a49f1a576e24613254f7fac0826a6310ee6921f742598dc5ee84b2fb527ec47c52aa0cd6298363d66e8c05d1cd4a8d8083dfbfdbed231490d62e49a381d91f3d14e3877320b4a038d81830e201ddaec91e628d6d02040d9d3e47f276121a6926449cb915401adb8cb0dc96f9a2b3c814e901a9ab44142456bc1da4f8f833b8b10710cf647dfb95c78552c1fbfa222e3f9c0451264021dea65c68a41e87ce2027d8e773f76b26904710ce865ed216bc38622c14d18fc4a248ef3da49ce416b1549738a18c16a48c6c910667f511a550d02ba1d7e0339c3a8f8a116cfa93d60969c0fdb8fe663c1b26059ceefc892dbae83cca22a9e14f2a775b82f93cea321ecd5b440711ff18b22416cbc4181ad6202664969961f696a4cb0feed6ad2ef367218ca463e7c98be3fb87ba19f0c13a1c474b279c4e860937030be14de55e4520600d878b2bdc57b94793e88cb8efda84c7603e927d5fbe358d44edf39f2288c5143cbe7c7f1ba4d136935d2556dbee0156533f4704ba8091ffe7a0c9adc48659496b8a4ad02903870250a8e4a612feca82d151e907ee47d4a185e89b6f88565f3c71b987994b8562eb0049687823f76b48884543988981a83e2ef37a355414ade8c512991700a71d66506ce48d6800b0c03713c30d1d296a2baf7bbf0c34049dcae870a16e96718bd92a6f3cdd581ed5729c5ab04a48929155bdca349043cc902535e6a88b4cf9ba438cec2b154bd8e348d53b293902306841c40646f200f9547cbad4c0f81552fa09607f3632935965fc38c0506e8f231701fd76f90faa16213dbf02876b856febb5ca618f0805af0a8014758a6c505351a1bb2bf9b3c1b36a5e69bcd6ce97caedf40e98cab71bb73f10e105a31c70bd472cbe9e6349f1326b6243b29990527aa71e20d397bb482f89e98a4aaca251f3fd1230837e8469f5f0640d02fe8f26289897ef172303da6ed5350376ee95b3dd1a980c154b84aadabcbdcbd783ba0ce7b55221f6878bdd97e21386af5e8e9cb3d795f1f5499fc2761f015366a86db3af49b6849428f58924c9c190eeb61bae52e5c205387d1089b9097c0cd22929bfc2be427416307fba39381df510b6338ab4291a609849becd2008df748589e9a4b902e305dc58cbef567c2ef6696591a608044ef77a29959c20d9479c9c7c9ab4c2915ba1a5955a3bdde90979bab01b85e58808ae57f2b8a279d2ceb91baede0347cace8428f0e9c4e371d222f20ec5eeb8ccf88c9680e7ebb883be6dcedfe7bcb5df4ac79c130a7c7c87c382578587a6ca4870dda59d24dcfecc0e038d38c66f01220989b8cc1a64dc64983196a00f5151a9fa4cbef1cf243827c9ea2d5dd33417488c76332e18157d52971c812007c74634006699f428d9291da9627364ba2eb09900623812c36f4b5b133581ae18b56029cbbe89694d9c8ea8b5517dc0838bf2a5f75614e0e6262ce71cf71198604e9e42fbc5a7a8cf2da06b88e19f3add24f73062348b1332de96539f54a16c446d4c46c9655359bd6893108b81c71477ca04e9482414be44103ef1d99a2dc7689ec9d21f1b6c1224b8e21313a03518d46dc1595160fb26a6e75849a87b20b5c5b03da69ea7a59305656a503a51250d3fb0e262b8e3157307a94ae07cb07e572a41aa14711be13f5d66c925164d67c6655df969bf5901e9d07080cf269470444d17c2b7426a923b695804bfe532e97cb86f57cfb446eb2f7265b6e29654a4906d5071a075f07f5b23cc688fdc471b5ff86e0b8f5b99ebeda7fdba3bc0ed6f0d3ad87f63cd57e7c6d40b4abc140bee2468fc53d04c7c59eb39fcd9d5f4f5fec371bc9e01734ecb35fba260fca4ba7f43e1070f7e913c195f2ca78e98fec5e3692c12c4c2b952e04c04fc76f94c1ced8878a720e3e0e43088473b86eb978a385d0db0044eabda2450426784927c32f34d085d70415e6780c6cc04429e7879947a368ab56adcaae1d0b20e2fad7e0d3382e43dfc0d610827cf44d854a47dc0f42190214f79a38fae652badee47e09680fceb40a09b5b56e32518c68d590fb20832d043560072a6c052129084b42907261ab092957e9c2561326b83efa06b69838b9f165e81b947c3803e48f830e48fc7dd34905b93bb52d7d9a0ad26ebb5490f9a907c09c697d8e76e6d3bf9e73287d7e00cc09ea2f52845a95d3c4ef6e418d1c399c26ba9328478072fcdb9f5f0241821c227992ec72c21b0f6e00f4e6d7400a900bae89be29c36c2a06edb1efa13d667f6ef7c7426e7bdbc30d7a3f179adee465ac45a6943d9f8f855cfeece1f673e1ea62f2f9f2883fedd753223b11584bc295a9c3742f2e3f9836a22b711c57c2bafc4649edc39d5964587b52dfb80f330b78e347a0aabfe7bdd1a47e7ee4f2db10af1042bc80061d85b8ec9e5ff721ba0f3e5c27729ceb341f12dd69b32a7d63e3f64f9fd3681a1545399166139692244633a9c8288912d66c3291665291cb39a7943e251417a22654ac44434ab548c38c862ad19012ed9391ecbc27bfa49717c92bca4814aff83bfa92d14e7ef74e98d190660475b03f67f28bc699494ed350c7152fa1231790912a4b6a4ca599e438991a5ad054d28c4c28da91b9a4cd2a465c40470861463e74a3499dff61bd22811492362edc78b85c7933d6a452dfbcdcfe1b4cd4f99f0fbd5c99e4448e637acde43991d3b0c9e451a7a12bb16f62ab62e3c4d6b43a1f7ee7dffdcb26c3cf65f63aa7e1fa97def841fdea17bd683e34145724a85ff58825093a9a6f52390d3f6624734d9e0e9891e3f8d0d0507b8c0a777ab5553798a81f667433e7e6d4c53c0ad3311c1bc7876e6e3051bfa8f9cfd5048892ad76a85f23b57411cb0a8a876ee54e17fe6a87da487db3a53a70638b4609b2420c6cba224908d083ea0fa5a5adf29ccfdd3bcd3f3a141a8d261619fe911f5258734307d7e53232d8344e9c096c496dc2cd0bab8022e90abd10bb29600084a0345a5e04a144165008400e5e688104184421850eae2450b1c452117e618b0746bcdddd3d761a9123841046da1042e8300265304a2923c39663ac545354386ca6d8c87453ba999ff21a9d425bea940a618035fd30c0e0022a54a850a14285998abf278938d8c62601397270fb8cffaf542aef96286b95e924944a604cfbf209e10721843042389d36d562c4660f669841699065cfcf1a6cb188b83d7d63ec6e8feda91f57da2f03973f327b91c9793996b95657403057589a2b2c20889165d381103a6cd4113666a6b968d976d25eb853f5224669dd0a8a458351096ed1606cb4b848298dba18cd61abd89d4589ca2997494163156e4008b556f94729a9bb0a5af4528837b478438ba81cdad3eca603df03c094d2dddda574970e3f0b42e550b9576042e547e52000010c60002ad411953fba4a95322aa38c0e89bbbb3b0e2a3f6c870f5b344efdb86ebf0c780f3e0821844010c62ebe4038a774b9e6b4e17eb540880262675de84a587850f9230b0a48ce6be59ad388662694966951166d5acc4eefeeeed1e864d44d22961d547eb9b94714d074afd4330857b0ba86d358d790976c211410c39a195fa64b171fd6c84c07183d498c28a015c8400139843206a653319b0e7c97819fda74e0bbcbc8581a3c79420315283d3550599a50929292c0381a8b95040515224419653cc3731c872754826066fe828a1390cc66b1b021166b5e6dd4454a3ac9199d04a6897a28262625d3791b69a1164ac1a583ba815250c1066435aa70156c88c503962417438902851b5a82c59a170ba949124a4967242591740512b7c42d714b49a6282491c4c256800d6140409c46c258707b482625b14091441252121236e4a4098b098b0a8b1b4a82c54a6242091525492c6a9444126b562e22b2c1498cce304ac286b830adc1c2380808c888100f11406605ea73c30af2a2a1420315283d3550599a49496608098214835fb7dda613b1a1a42b90b0212754409c66b1b260b1582b88c10d35ab997053b8256e4963a2b134d66d52804d07c9e4968ac01202c4e196b42792a891290adc1237a571a6ed161236840d61477c013b58f392accb53fd19cf721c99d42f59492ca525549b336c6c0cd0325d67800370cb01645a80d811880d69acdbafb134268d239dc8a42faa9624bf02cd0475d14527572e7cf8cd389288e510cc38d0694cf793449a91265c1165e8c287d085645061237160e6c09ccea9552ac36ed6214bfd6068e10e8761548ddaf008b24c83d5bd219e04da1e3297722b5381a6ea910cceccbf6b14d2be495dd83737582e24a51129d4ae32c2883aaf8c62a64cdb4e5c45adb0b4c8d8d091eab40b7f2261a52a4b303231309c8484911829262625d3a55e52704941051b2b80a1a3e5c2159ed48f22b912160f5892b8e0f64f6999b5c21735890b8b920e66e54e3672245c34d4dd0b0a122e4a1c092749129302004a2605ed42288588720080a632a2ced02b281277e1532a204e03d12c6e0f35d08d063a723f49746a20a321a1db4044109d903c6d83cf7c64a8634142009a4a0610ead0ae13694037d420a4096d48188807a02ac1fd245106149efcb92bef1e8b1af7fa540cfed7c3fca5d3bdf4608b74f7c75e7a9f3f77fde74fa720e25e2fa73072b3f7eeddb3f1d23bc99f7ebd6f3dae6779eab13ccae3c9beecb95ff152ddc3ebf2f1eb472fd5fdcbc36b3279a918b287f9ec616caab33c7eeecbd77ff9fa3566ebe1bef22edecadbf0beede9b7783ca8ffb92cf6cb9e529ff178e857cb7998e6f1b89ea688f01a1dc01ca3182f5da7182b5d77f720aca11b037e96ace85f5b03e2f3887fbd7bd1469f533071f9e1c75fc987ef1eeb3c8cef363e0412ede793e211ef8eee8dc80d4123c801e842a882d1f2c0774bc4e77e7e61d7a6245a5a1a7bad25888ad59656ad8aa8f165b45680d0e7f4fbd35640b774d1f432eb4d674aa07ffb07f46ff6e76ade87bdbc3ef37eaec98349b7c7efe5537e97c1652cbfe3c95a80e4cb6226d392fafdabe62a07f5fbeb8c31cdae0a84bff9aef7f7b180bea1df109bf7216a9d7f4dbb3a52e1651b213d4188740165f085aaf96066b63b58506b701eda7b8eab41a4204e6bd7fd027c505a6bf7afb29132361f8135fdab263ab8f2416d6e6e9e5744ee874f3525ea0d3ef7aa6105957b5ad5da855c438f7b32adea6ea544fd3e86919232c8472a6c4941c4f59ef3afff0175f0e5f9570d2fe00475f077f15c3f63d4f887fcf9198b477f45a66fe6d095ffcd6f79b9f2dffcd3d3b7f1bc019949908a6ea6cd4d67e5a9575f86fbf90c61cd77bd53496db66933dbc6e3e7a25e26fbf9836e1fbdd4cab33cbca696b7e17d33b5f2a918587e7b96df7e7bb805d18173842034c047dfdf85c543fd8ac7e3e7a2ac8b473d1ece9e3c9ecdc2565dcccbd12ab69f36a3375f833a3a90fa11e3ad7d295fc903320102ba5412e1356c20029780806ecfca35bdf768d704a4864b6d2002c36d58737dcfbc980dd8f74c2016b894c88d0bc36558733db510ae361ef1e767d8e663c78570f5cd8f1a0e086bbe93ce0f588303ffb43405fa9869598c317e5a4fbc2d1fb2220c193713ee4f95dec8dc184df34fa7d73ece64f174e2e4499e7ea583fad1ebc12be90c4befe8df0e464b0a23f5b9f8a33dbddaf5966bbfeb25f7d8bbdc74b8eaf574e422b7692e7ba4ec1f8e5d0b4a29a5f4a2f4b12cd3918f7912c3306c7af3b16969ab2e29af992bff9a266f033397273e7dc99a5d05a1c25649cb269e3c741d11947633334431ceac84e06f4551745dd88a4208d485ad28846e17a34892821cf8e3a499e8dc2101f285cc2312aadcaf5e2f9000e5fab7344ee7f8aa07b53f421b6602094a2e6c1da1c93dc085ad2304712d8001a65167d5830a5bc57c79b155f2572aa83d563ba8f20bb223848ba87d61eb08476e9c22839da93c9e735e2ddd37e5f8598e8ef2f673c691080cb16364284f1dac812f87c89887ca10e270c32bda85a6a209bc5925a95fbdb5f3d50d3a3f42d01180580af919c59e2ec5cbeeeeee9fcd8df663fb5d0e2fc3cb1f97fa263e534f061fbe82355d7da83438a5b576ddbf2adac47e1bf76ad14c12ba7f618b085014a1cab5b9b05584225c2896ee0a17b69ef8e2f267543e757fe83198ae5f2f85c0eb3cf050dc7420f566bcaf31caa8563f547e68439b067e4378a37b2d5ea523401535b0a2cb215fdad8ac80d8c2d99bdddd3d5ee76e2eda598b1510cdce1c8d26f65f7692b9d071561e3ead5088776519db2fde28849fce8f89e0313d0e97bd2fa3ccf17dbe57ca93c5ec4ddbb36ff6eb6abf9ea61f47a696277bd3471929cb1f1f1ce66426e27ef27b9ac71f871bbdcf2f7f9c965f3ee5a71f1f993cf137205f73d97fd8cfb769d4ccf6f4bd6c4f7f989d73feb7fdfc4923c79fd68b36657afaf2871016e217e24febf1439d78e23b5fa611657bfaceaf74c6aa4d1b9f9a361d2ccb3c689a9917a3330bf1db5bf9cdd3380f9b5008b3895e4f999a2c4ffcece9675ecbe561be3c49f69b599ef8f3f91d673eb51ff3c7a7ded7e392be346db685277c3d7eb3978ffd4a8f7fd0c9953f33fbb1e4815f60faa6c7b08f9b0e363d28ef35638cf15ed3320fcc828c75074a57bbfc2c8b8c60745db8b0d564e936615dd585ad264437834c5461ab09d2cdaeb6745909ea405d5fe3c28509f813ecef17928ae93ccb340cc33013a418a66930cf18b5f4e5ef68766aedd7ceeebeb963a6cfff1b82c331cba37dd87f6ebf28e78f0f0e375cc95f91ebbfc3e537fff2785c1e878b4928e394fb4dc62c8fbc7efabbf0f7f4f577f9b874e7154a158bcb2c68841a6cd8ceebc217bfcb7b17ab06c7f99ad1cd64ddfb602c664d7ffd1c82f994fd5e62ec573b97d800f96ebf1ff21d08bfe0cf167bff6296eef575ebc1ef96c7dfe5b90dc865bf17ce6ef6a5b343cedff17f3196937fda7af0f360f6e38da5fccc520b63fdbb17cbb1ffa66d3a57d1cd34794d53737fcffde106445e7f1766e18b527ac8ef9f9ea3bec5bb58bcd3b337abf7bd7830c7d0cb8d35ce401df4c2f7d1372b0f519fc3716a709af894c2a5fb62a43d7f3617c318ab9647bef61819fcc2f7d9b4bf9d7c3dbff6195f8fc989f1cbc7e4a7e85f3fbf06237f79a901cfaba4fa33cd3d7c5a15501f42f89aefb07df63b9c5e7bde76369b59e8343b27bbc6cd5a739d2041db673beca0d96a2bd6548c6c0ba0eba5164b77be94f107c87c29b1ef1137cdfb7c14c0fdf57303321f7efedbcfe73ca1cfe17c14c0591fd82ec0f7e11e07d82ef4c376e10464be343df4b46f7fce83391d1fd3aeefe93b3fd36c018d2ae5253d1231bfb718ba9cc178a177cfe691cfdf1e81b0b18982521b9ed163f42628e8da4177628510cfc41863cbc916379a2027465f1dc189132e7761cb491852644a361c5f5cf75893eb398f3a0d6689f806ba3bed90ee6ad7f617db95111ebbae9b169e409f5ef4f2be5a899f50a88ada5941712ae580f8fe12e8fee553d7d3f7972f823ada417dcb17a9ef73b4c37d8bf55979ee7d58fef42f5e6afecbc31cf752d35f02a87fb1b6c8cbfbc31ca3bbfdf545561ef5ee1579f9940358befe0c2b8f7af65ebc23af08cb578f4257e1c256129270680ef4c0f659286597e673c4dc4f0ec723800b5b592c5d2744774b39c0bffe0c2f8f7aead07e3435c34ab53e47f45976561e657d3867056e41824ecfd57039c01ff533bcb0eca03e5a9f954759ea346cbf219d6f3168df7fa582d87878775cbe857a29d3efc447fd8e7ffd9513f5cbc1572bc21579f953f7e21d657ff28a9cdec6765dd7d55df49f3a13e1eb2fec790342c4ef6577b8a79de7a35d9ec5aa9c46bad8a37e1bb6c8d1cee9b9165be414246807169ba22b36753deae3ef70b229d3a7a8ddd9a9ef9c4d99ac03501f511fbfbe7f4a02f5fdabfd2ae7a1fee4558ec3b86aed09e65c3d9185350a07ac823082622e6c61f1c5c52e6c2561088c2f32961563e8b00410329cf925e0421c8d4373aca8e28a18a3ad31c69615516e8c3fd3be8262162509d14baeafcbfe4d19bc9efbf67c8e76b42cebcf1eb33ba777ebc37f7aedb7b6b5e2088a6fb2fe5fed9777b1f12f6fe37d8e765abe9f3ffe0e7f8c3bddbbf5f1ef6c10eb73b4e3f26c7d6c9ce67a977fb12ed66707dbb0f179a7b9dee4659ba7599f23ec7db4373d6677b83f591f1e729aebb9e767ab599f1a9c26b36d7d38b343fd6c7d7c8e76f8dbfaf0b3f5b180d35cafbdcf571bd4c31ca8d47f7d0b6a5498b3b2c33916cfe76827fb15ebc339d9738ff28a686ffaea1539dad12c1739cdf5a62fd2821a755e9f594ee234d7e308d26c119fa307c01cf9b6887c9d2041577c910474e5c32d1564728efc99cbf230cbfba2c1135b3c115b8b9938b37a82ba93d30655cf71524aeeb3dfe19f63e3393db7226788b1f2743a9d9ee338aea24e9fca7e06984ffd0c321ff35cad94a26c2ab329bb234325979db8d373dc89e352a8df3971deb771dfe9c47119f73b7ae3388ee3388ee3382e559f3a4eccd7cf74b89f21e6bb1b2d8c55fde5380e2605536bb51fadd5b4652ba8adc5db4959e83430cfb2e23960b3df906edb388e4b6d8ffad3a7bc9887f1649ef33ea6e1cacd73404cea4fde8e8c85a95d853196b3df902edbe1d22c57d070b318b9ab5eabfd6890a7b769557d196bacdd0572ea5a55edb6c1d8aaa2c58442aab1405a89f86b12b7bed6aac2881bdfc6ca47aefec97e43bad3b6a538fb036561ab4e9fd9d3c797dbaf9c7eb352561a640af5d9e9b4d98f861d7e5aa97648a77d1dd2dd7ab243ba215dad2f2e2d365a5a5a5a5648387204f5ee2b2b4f1d07a6b339d9d418182fda6e4837a46b551174b3afdd47c33d3d749c9867a931f5cad3730fe3d130a4abd5fb68f8b10de9867434c02a6a50c511b7bb1fe0cb3690418ba835442f6cb55a2da368e48822547e2de367af07bc9065848cdbf595e41b172d2aa4dcae55bee9b8c3e7161555e2852d2accf0fbe1f0fd5cb7ab56c18f42069b664fe1cf5cd50d75d875a5a7c871eeaeca32cdbbe6c5e4dd3c98ebdefc980bcbb29e8f615b0cbc469c89f7724fd3348f91a09a56bd1699eb1dacf14fa2c637cdcb69bf77843351eb590497e7becc7e3337a3327dc3bd6ce91b14a5365eb2bc665740a81f64b5602fdf876a65d3372c2f1f47df7c2c2f3fc74b1788b5b8bcbb68ef436cae66c36bf1e265f13494075b553dced3fee469d4fbb2f799abedf0acb6aabad556d8d1c8e0cc6529f320f38f59b5a01255ee5451ffd938bc46b051dfc8efedf9325dd7352f4b3d2230cc49bdc9cc7cd1d7344da3da4f3a4d3ca8dd549e4c9d56cbb4f9d2e7ae2edbef7a138e7b997ef3be9fed33cd9bd49a1e5e3d7d35136c95c92434b45252e1571fdee42f13cd6497873d0db16f32ed667b9ebf79ab25448eb352b4a269b6a555b3b6eaa2de90eececabcf9e8209f4a5bb54485b53725247cd3b30799994da6cfa067d6e4f15c4f9f5eefcf3dc4a9382815ca7baff3564b6a3ff69c5769067fd35a2ecc4ef6fa1dbe795f77b3d7acc98397abbda6dc3ade00ceb8746511fc095730a8735e734e29e58c4b530e65cf5e3314d22a8e91c977aa9f872eb3ee8ece600b91b25bcac6e1fbb97003f2c337c86ee63b3946c1899611945cd9d39f7fec18698cf171d0914bfe97ffb42d1f6e402219cc42ffec494593298070b3d61a8773bcbdb8e4f1272eb5aabf6fda462432f9531c71fdcca08f1d176e0db01d708ed223723d46a402d114245ae74197dc98fbe3822bb990d0afd73e7bf1e4bb0490098c02881fe60f1dc4c2003f9000082180f8013ac1041bf1132a900b180610430061f383143643d0099b1400810415233e8713c65803850a59dbe1715a9ac6658ceff26394dc4e649089babb61f76dcb5db0d090b2bafd4127b75f8666a101743ba799dc5ea2dace69fa75aacbf7afccf3d2c69b68aba751f99ba7dc74648cae04c5cfcf9899218422b84c7bd371f959dc6490970814b09e0f1dfbe77e08b8d0c6002a1aefc267e6cbcde3a76fecfe9f25cd13bfb93e452671889fcb9776b9d67f035e8ade4ccd52e56a3fe621e313e6e7c6e1f6f36519aaa408a20d533e4316643ffbc7e8c17bfd88d7cb5f12b9f8d9176bdfc418e40fff683fb7b523d4012fac81ffe3dc4148f97333b93580d76016fa636bfc427669d4fb40ff885a0d136a6c0975d06f4f25b718e6cb8b6af2037de9679846d923fb49bebce66f3fe6fb43ee81044dddb8d1d7a87cbf1bf4de803ae0e5cba6061d35843ec898b963a1c26756d54ca9fc39dc3d462f40ddd13b7a04590d4c21c61863fc9a34ead77532ff33fccc9257366b643cf8c2f76b05127c0e6d17e6f7e0fb84eacf3d643cf812a0c2ab63c718e3f7d57534b53f352ded6aaca8f2a31f25535518b301b402fa1b87db0aa03223200b408531833311d6605167aa7c19001061956a9f90f1e0eba1b2af30727dddd6d8a07ed5ffdd2d92a6f6460d3aba1e7b8a7910892bd401dda6fcf9cafbcdca54c852a841474c82cf81ed420278a072e4f2c35394d1cea85fad2d9dcc47813225083d8156f5efb4aa3f48ab6ad0d81132010bcc29fd9f64b01db60bce4ee5ec07d25fd384eade5cd304779749b9bb7b4d1a9dcccfa8622a1a194c57e1c399bd540dd41cd52cb9cc506a03474bd7b1ecac541cf6c216135670610a198414150131a43061e8f2ad2142fd9a21d4ef359bbef9725ca63e5cfe191c27687705b87b0e52fdb0c504a10b7f9c2730c475bd7c29ffe766dc05a1aa325f97dc6210c1957f5d1ef9fec5aff3877caf7d7f26b71019aac2586b922ad733b20533a45cd8620294fba96e7f012e6c316189ace688da37f0d69851bf678bc46ff81989d0e7b83d552a36eace2cbc0a478d13eaa752ad6c70e4d0581e84ebb0c6775ae52f43abfc7db4cabf868a0c4176a46703dfee66ee98d57e7e2530321e7c4d155e190fbe58751bb0a34d6494d60aaf1a74242d093ea76b17bce509758a8c7f4a1217b69a90e4e2b8b065861a176e3fe6b5b3421832b904659545af414751be6d29a9045dd89a32a5005767a655f2655a25bf6b95fc9a343a999f516541973d1bf8c68f16c97c1609865a54886ef4606b0a933b2dd7a0230f3a62d94119ac41471d74041f76dddd3f5e625183035885a6c5942dfb254b29db72d43c496d691aff8a84ca3a72c6e798fad1d16e40bb3cd5cdf09fac34bee06adfcce72d06ff113ff677773f4fb445b0b920f539adcc4195efee13b3745aa05d6e3a17a77ef4db0fc81b6db4f1235e6b1593fad1cbe3cc47b887d65212a70b5b4b33b8fcd5366c814b4c562e6c2db5a464b033f72123e23565f4e69f0a5b4b4131ee20839dc90b596750713b99acc6a8b256b4c30555c04068e9c88833a250c60f645401843290c8d8a248690d20cc58e2451269e0000a6528a5a0052d327e40060fc820bafdad127255dcbdbb0f51c140010612b47b072e28a208151441050a8e2892410d94a8b1548231988ca1c41835b830feace0891250e8f003922aa248638d172c6982134204d1851663383182c613c600628c1e964c1923680a1967482981942755a2401192528594286a7a78a26607e804b4a2074eace0074be8d08512d7136c58b25a6234b9fd332bed72c2859095c820e4a20cf6cde7198437fdd16fbc6de8eb6b74ecbeddddd64b1084f74210598c1e5c485c0d498d0e353a0059628423906086112c88e2a22205062b529238f24c86d8a1ca14159831744d9192824b4a1046a8444912034acd0f5713a43429414d901825108308b244f04b80024a16500063094e7448632ec18b2570a1061a68f097801a805b33730900801754cc42ffe7ddd8b4aab74fbe108459e87f805f786f0062a01c9ce3f65f0fe0aa22408d2c21dcd0379c05543511dccc055371bb9be016dc7eb6c1a2fe754b84df068bca83990ba8838bfa855e7f11e2380f69fcfdbf971b70e51f3d18e0ca770061412ca594466495524ac983058342198218506ac08230a0f45044185072301206eac256184b617cd147541df813195cf87d54fbb30b5b4f86b8f0db06355ed87a12c4850f75f00f114d409941144480a2648a194786e435afebba2e2b9420441150b688a24a1113b2d8a01801e312451103358ca050c5939c6be95e5f91eef585143c7c9346c191264e34998115579461c40a84f05518f08a256968c10314318e9ab8c8f0810a56604ca9dd44cb0d7cb0a9ddbf4a468f2b33ba80c1aa09f57461ab8b23f7ab2b2a5df420bb08badfdb2cc1dc10d26c1da8ce106e90f6f7671db59f4d0e1acef0713571580381cd939066bbb203d71faaa4c7ac4d4136ca8822a394416e87d8545965adb54509494bb0e9aa74f9fec40f515eb0831152300323ae31bed001fbc2885094525e325e52964c6898002e6087241d0cf1831f5a80861b41895282fe55315ecf0fa5174c2ed7f2820a150cb1f9ff192500e1de6022810246b3174974c124ca1753c068298148093f3c79f24409890b2ebcb8800cba287aa28c35b610e38aa2a4d483129430022535ba5052e282b585145bd43c09b2412b8c229030019b800ba41438a9ad2d76b045122db2c8c28baad424f597dfc3edcfede9f1c8ff78e466facce41a6ff34dec574f5fccfa673e30badcb62c7bf83ea369a7d3c36fc66287e3fc2aa9dae0389d34ed619e70a884ed765539ea949a1900000000a314000020100a888442b150381a88b21a7d14000c8c9c40724a998aa32488511463103286100300200400430c1999a9a11a00ef8310bde74b3e7a24ad1b7558a53ee2de80beea235d13dd21a01e0816f57c249d5b4b749f633b28fde803fd99d6f568a4121fdd6bad10510f10ea3d847a22d66b88d44b8816ea7d109d63219a0f8add2e5cc90f86bb39fbb515bd22ed80dc251b278aed6407bf7ec0d3cbe27bb53b7e7740a56edc5dc9d81b03e3b0db90aeb13b5ede9a78cbe3d5898c2972f1130a5e66116a89162576e6e48c63c671c0adf48f14a7b84b6ab5e8690836d0a1860c0ad0127b00e8b8b5bf37612c666eccaf2f2575b4550a032a627853fb2b2417c09e10222819990bc45ffa813ede3eb639bbf45eb37c3378c69b0ffbc654435b8d57f65cebc753cd6d859d98260dd61b22e045b18fcc8a29a04cbcf0aa09dd3fb581ca28339c1f7bf683fef502daad84b5962b403d7c32b4ae247c9f30d0d1e7af6cb9c1458cc2820ac0515981b62f866cc002b17a1ba074e80427a222edf5000319d33cdaa0f188b3c8ecd03f9c9ced4cd9e279ea2c7a696612fd93bd43e0d3f644da914cc4e186df20591d6bc658e80db832706df70fe790f6dd9317277ff39fa13d0ec8794d1c28bd2aad9dd2f90c76f0bccfe52d78eba6250171bcc67a322b4921ac80b9cfb0715f437c453e2ab3b96f5481806030d40be0af443973fb4598a1d4c4865509b060d8d9acaeed8254931d8d7e5281d3178f6db0dbf93362bdeba4b1f547be24e23dbde7895fa8e3848908c71f972e180f9aa9fe553601d1abd279e4e0f60985bd2b56b15a097683e648272e0a4a72007a2cb2140dfe290880f4ffbdae5b0c06e3780378528db598ce77a818dd5612975762e4c96e79ddbc929a3306a1792ff2fecde267268f6dd7abccc11ed4c3f029b4580893f0b3d5736005d2593252b93963ef7d436b6f75c071c24c1e14e02c921a9d690236768d5ec96e6a23a48260ea89b8451f086f95de8852350b9e0a8d2c1e28a565c7530c016c99bcd390113d6363df5d7f347a6ba15c411a5f87d4034f3bb43c194abf57e7d54e61288c0829eff79a4e9385e2938129790dc226a08f293b6c906a132f80a0035fe0058c223de15c20ab3ba1db4e64ff4822c4dccc1f0b6a5128f69de9808a04da5336e16338aba943715fb3b2c0184ca9da04ea4de5a04f86083eac2e871a48f3fdd65e6dcd8c1e4a5c6bba342e98775f34602841051a28b8f00dad0437e1c138252628004d55411827b85011c466a84ee705a5939d8c70a46b3386b9599cd1426e2911b0b3ada88ba2d13dbc2dc00fcf087b07638ac8e9120de114d14509b54318bacc5d94bc2245c868bbd62956522e506f368533e9b6eda8493c07f0f46f8d48e228135b0799cf1c3236118a8a886a384cdcdef119b07db1911782236d166ee3129f4e3823f1050c32023348dc876179d7b5c708dcabf58ad08a1ac1e187eff26a6d525140fc2ad96fa3b14071f935daca14e3e8cdbeb141b5dbb013c9764c710c21538169a105f6f5936938397d7c1c24c884e9455e38454e64690a991177070c34317b5a82784d65b2091c6532b499e47d959a07708f3a5bffa76b18867b99c58e9149aafd9694a63f85134622b80a477e7dc07ba3f165bc6389f4c22855717059dd462250359743a435fdd80cbc870dc8530e826ad26c1618b82b2c2c133b86ac32c001adbd96bb45f8fc2c9209c19b0450a7140ade17eb1a80589777d30155662c914f719556a56165be9ba894bc34b8bc5716374c84db14230e56aa274d1aae90d2018110f034af439502d530e88f709ae67e3604541fc37b4bc87e6b1b50a345ca60feef673720f6339d5b8c2900af3d9fd0041aad36f0891fa58d613cd9bd8a342f30b571eb0cb4acab4db9e22bd5baae98a294ad1babd4947abe235da9b2e72b49814273988d6423204e890f90bc9b9574f0e719843f218f8f18e85adb4ff73003b253ad2a111a4b047ef5d3142e372656019cfc4c37dce8e97cb86d9eae8c8f73cbc49ac8adaa76b483fbc2c9894eadf0f6ba043a998e94c8ed1638fc4a6df40d822c053ff72f4de1840a5223b6163b0928c09187d06da4e33e9d472f0069283f0bfeab64578a4a2a9c224f5000be1f11a52d763f33244c9851882963b159bad405722f90d1b7df3717e881c18ee31d8a3b5cb7ec81091ce5b244c693e32135e61e5eca525d78aa9adbae6542eab34cf446b4fd6cf5c6ec1b3f9348054f70801136834d43dd3711c88ed8a0dd92319c2b76127b47eada7936e6254b01ae53fd91059a5f720d0c196024ec48a8767493071cab80376b989b9fc6bfa96c41a9ccd1d2a7f1be8a85ccd92e3ded0e16f4a785657967c498b94e6568cabd11c01f88e54306fb18e4a5c5fa02bfbafaefdee7c51ba9f1ca69f7932b3c56d26b4ff7c01ad0082e48c51b391d2c71052c2635690c6ffc6fa6f8d1b692715bfa002b9b86b0204c0a054181730a8707a7367e8c4e71ec99b8ed3455a3b44b46668c3bebc562e4319b6242a3ada82f4643cc6c37f8211226d996213c7da75c5c47754ed6d82f8a20fbf50f04284c55778f1d623ccbcf4686aebd2e201afc232f6ce0f2631c1364e5c4075c97f9288ac222d4ca7e0467ab2510f7d6837335c87e6a3fbb3318068228c36ec90425848924ca1e4e3ee6d7210062d63d3dc13d5800fe2b102226a941cc076bcfd62a5ed3f6c8874f60b8383e38c6f7e1db194a1e80acb5927665c651d8bb9b79596a8193adab73a083c62bf7372ecd2b08355688fc2aba9cdc766aa38a8f1ea07fc4c0ec8553e3583e7a9b9edad8d63cf80af030d0c40e21c3882ffac2f532a54f478b23da12e757235e5d3f61ba164749bba03a08c66b28f024bd4615732236410f9483e0afe72d60e597a95bb68e83bde419871477f38009a47113c5af86dc4f5503ab288514522629b5c63d059cf94d09127a53bdec154ffa3bb828e4443ce5edfb67d62a03eb649fc527a028c50550f42e369c38543bf91929921ebc50cc07f30f45774046aa72367b8e05e6f812a03054239d6d68b0147ebe8cd4267a19f33ca36c7069e639e8134a24bb382c36285db6fc11bb57110f247d1ec8c171efbd1fa9fa14658f684256f82607d407680ca3cbb8a06fda13c60923389240cf98ad7f3a9536873c9f9760c23b2d7f80ed8f81eae598d849bcf8f7134ce30215c72ca0e415173fa94e2efd226f479657c0fe75cdf8769455a092ae08f3fb366eae8264f728aab856be76595d23362d8066e1a6a2a8a10c3d869eb2aba4369a22b84bd67cf44b9b415d4a9d645c449586f9ad1f53b07d8725a2837ab32e608f53b66007825ed2db35a4ddacd03b1e83c5899d49fac00e5b868f3ea1c901683afba7465932d8f2e7966005a5d02af4079da88746607771b2e1ae139d98f29ff4c5732f280840bce870d0d5ebc2be8602c049c82d04fbb4f796fd5e1464bae39df0d392ef0a6e6de7cd81d782852f9a1d8560eddec9c7a44c9453bee839c453bf262ef9d9b71fd4c3a4611c5b09734194d8662ab92b2f32539786942d558d97880ae4e75005f425b7ac58b921db1855fb8da34dad254a1b86c327033e1cc6886a3604e8c6c3f6f5764b666432d008d35143590c8a4a7c512ac32b4f50f12f581157fccb46fd267ce676ed35c10f69ba244bfc7be0114601ff6cb9710298a7625fe3974b64c2ba30371537d0a4331e91f9f5217a0b82001e66a599501a2be5862878b40a8281c3f5c3fe191882f34c5e4879eca48691f72e1f4b51095cf60c4dfade37c2b91ea63de6de7a244cab23006233d4dd97ee5da502197daf9ce2b4afd9e3beec2b12da39fa2224fdbc15d2500f37970409c9c4b91f68062b54bd10340560ea26e0795c7122c42978b29da796943f38330338a7e43e882f53797a27970a2ae7cdbff41c6ed98041d2515543e4cc31132a618a2f893d1dc8288ac457ee6d023a274c26346ad525f09bff76e963bee7043bbbb01ebed8bc3c5ce0d2a7b1b0ea9310208f470c814095467e060418f0b33bfa976a693066a3c7edc5327888858e4a6cdcbf597336612e3533f9879843d2c46196d86193d4c88e5816e16baaa8ef65dd80e8fbb9ed49b5903b0a06ed0ef4c814847d74358c5e22229801c99d1ec14ebd4245d07961545801e068f1c883c08c35de3d8c44a452974cbaafe3204d44dbd14be585419385ee723c5e6143db6abc91fc9889662a838f044b86ad128fc38b3070419c3c50e285b4cfe539d28f44a0b0fb2e81555196c5765d6d3ed8085b52a678a95c471e2f380dae0cfe169fc13074f70056c38fb23918d0c080c0f9aedc0f9b5c1355867c7c7cc20e210bf3bcc77fed2077d2fd2177da5ad5d3b49626880860d5baca6eea1b330b8a357b9f9e2c84e301e24bcf39962f76e8d4dcf3a3f44ff7721c4155d1b4e9874ffb360fd9ce24c37a151b4ecc249a8437b74e6d9523730cbb97c73766083a0d8dc2e61811eecb66786d33ae26ee500ac81cb3251049a0405c581de9a773fc74e4b36d3807295da1f8723e03ecccf780d5687053b669aca9b2ea71a0c31dd6e1e8b84df621e9983404299c9f4690314ac89b0df77cfc92522d3c349517bf419499d114b25f8a155d7ce83943d41f10b4d16abbc3791e23b2da64be746b2878f46e204ee435bac07154d2ec38d523c2776331dc42dfab145ef9678eab79dbeb297b22011ed6e281a9649b523fd3a90765a5f9bac5fa4df523fb3b77d92972f0ac9d88edeb07d22db0ad47aacbc8aed0ce758c19995f850a9d8550c5aee003427386d0442f023e244c71779d66953fc91dfa81e3667a7caa4479eb798d331b42b950098cd76b93606524420fc56b59088a748a47ff3c12a2a18532fe7f44c531f4932d8df51277a6937573815f206bbbac8982d02b891812e95206e798f8c124f268342e43e7a61e9c11c4f322986157c614d2a47f834b223526af9d5148dbedb101346244972be687beba04dbc186431c36746b6fa12ffe650d977de3bee555ca7c69808cafbeb51a89bed1fd938ff52632ee5f0a5e00e27b370f46c328ac59c71e7241e5aea5fd294185e4ea199da56ec1445560328db5390c1db5194cab44f3887783d9f609a76906481a239eca682e0d39661614d87a766cd86574eb4d3a947742b7c9754c6f0302d26d816cbe3461cc8d9a4edaa0e22c7ccf5a9f7a39f85a390730a68469c33048dc7e4bc4d8ba38bb5adc9a261e031e4e85622cd756a0ccecb5325ade31b00cb141d12b5c7ec5b766a7ef37767eac19078fe11f73788d0b0c00453f5f1b927dae58d5fa9f90d3524ad98ef730dcd4bd7647dc842657aae841cba987e65921e9e5728ddb2aa607f246a4c9dcb6c60a4489d00bdd2f45b3e3a177eb2f72b32e7dbdd45a3519ae25ef6397dca870c8e386e8cd3512e13062798eec37b84a1150b0e5697cc16bd735e867e38d0f5bbe07a334b48c63db9e3dc6cdbedfad9787fbbc1a4a1e3f41ee563562181d87aa9c55d55bc8da557c294f57eebf6e71fd06614c82a65b225ea8f88f8d760eb2b60d297e58e3a69c27a6b12340f668cccb28164ff180632b7479871a8ff8a8a4ea9000f798072ffca2b93f1350168a49b1eeb10ce7ef4f9608b05cd3735090966092d1c150552bd9d7da4b957e08519c2f138802ca853a588c2dea50ac255693b28a293b6046af985ac4dbe073c7d47947f11e62409eb7c5f527a830c314a3a58cfe359d3fd11881fa42a8fff8c8a12cf2ae1f1f731378b2b368719962dcce5f9ff3520f5f27c9952e1a1d9df10b383a378ca9f50ef54d2fbee00169271b07352cc78ac81fb3852b0e5561516bf3d6dbaa62b160dd13bd40e2b5f311cd7ddfa1ff9ed8edaa90902fc57f1b79b7496581b4fbbd3b4ce29b7092d7ab637ff83b14469913eb7b0b00dc2f6cc3993e10e666f11f60b64de7936cc95a7c08a138f9ee9da4e0bbcdc59c0605a25b1d008b457d7ef791f5d8c3f566ff96e2dadcd18801d44325a57588d748f6bc29a5db08721a7baaa4b0c382c05b446e060734dfbe5aa34a0111b02a7dbb82624a4466a83700f7c351ce045d90ae21ec6635adb35319c9168492b602ac63e4ae236db361e8546a818646c5acecae4262de16f48f56e3feabacc6c93c59866f364f3528e68796ebec45bac17538189612862b2338da27b54b93b9abda72da8e8080ce03b098704e6cea4638125300cbc6805b75146e6793cb45f7aa7f23691a4472b4704305be051076d447c12bdae68f880cb408f6bc59575cb76eed1048a81bb93410591a2ded7194c39f81ab2461a9dbfee8ff51d52fed46e9445c30de51f1d7f1bc1dba444d75bef6111f63e1c4cbb5c52786ad32da2c64738603d8336bcdac5183a3d2a802b8ac0ad7dd707845c513887c8e62d0320ae7b892bb0c282c57ae0bbc3fcc5770db665ab2b812739189d5289d6401271bc8944eb69f42630d28f9e9d2d0cceb553f60198a835da8ff8bfd07f6eb8a45b366cfc1c7a029253ec0a5243716908452ee19cbaf728936d5abfe43f3accbf79e01a6a40f67101575f8ec7cdaf328f11586dcda69885d22358936d4a1710b153b2500827cfd7960cf723f6ad30675d784286bda4cda05c5ba975c08b7aca448fa86c3c2bd1ce79a507c0d736c4178e91b17351ea53dd0683525e64417076e11a91f792aa17e6af5eea4f83a2f2b9472dc9aa9f36ca6f405d8e3c134f551ef4e0dbb1e066dcd420f6102ec96a5af82ccc65c9805f4de48c8f48e9ecc43ffeb1ae855a128b8d9e15b54112ce7a64745e1bad8b888203ac0da0f8924a95979793f3630d3ae84b012c9c747bbb0887a8ee4ad904ae1992ac907e0a70e35b4c6907c044b9fa56fe8a2ab7fa21dc18e9c326e0e560d3e81161c1a6f58d55ac3347a0ded787f15a3f5cd83840f6c7522e0fdc50c32b0d2f400b390811b74cc40805d30f691a632f0b8903354cd6f607acbe190959bc8e1775e8d6c4ea0092384c7c05a959b1c716f880e631fe31f090022a0d983a9434276b0ebdeaa9532915b4ab4da92f40cdebbbcc417aeb93f36bbd2c99d30d22c921b68054fccbd71c3fc95a3f53b4ef9c875e7c6581799e83f0ac519a19909eb2b1d5b5625657f9d6e020b8a5421010def8aa4805e0ec423fb31ebd4de9a787c5ba9da61a927aec5b970e7639dc056dc3a56225eb8d4aeb7fba91b7a28e8c78b1711fdca95dbcf5b5c7833d020bdef1f80e751b22dde4fbd313cfc8e95c999a6dddb77cca0f6622f04298b2fb4a001316fb31663f8d695ad15de2617152f9d33f782d240fb7890f98e4e91533dc919f13fdcbacb7bdad75d6a92504a0e18ee425adee1823788876630e550aab7bbf5b3e3882f7324ea909d6d2be80ffebbbb0671cb2a8473b398132a65f96c0044861f94dbd42fa7abb298a67ada59234960027c6411efcc14781dba6c7300ba395d621c1be9fc1bc462e7b90f25f8f7591aaa6a900bda24b1199647ccc5816e641c18a6990059d15d2d10df2844286b800dbfc9474df21f57ad689c4757c401c63a6b6f953cfd42cc3da00285ca3c56d9233c165b7e06ebd612ac723be6ea4c9eac710c4d190225f8ebda19f8f5dd5db01671ee741a0865d695051dd11ca62944039168052cb9d5e10f0240663c7a5b43ad24472921b0729fbb6e20d968aaccc65cd7ab6e99922151a3b8a1ef26eaa1c9bf27ebf687fadc36a69ca3ee6a3080804acb5c87535c8bf94646784677bd7264ba8ea3546140d5ba4014b3a503a044a71fe113c35220bd3f0e7b627f9a8475f9055297ab0f9284c85c704de714309203a107e5f55db234f701c15f5c3a127fb2ce858a139ca96e676da7e25f049d4370c9408ad6bba10d049c1a84590ec175e5aaf8b2883e8b3f70b2643ee278dd5b2b12624612766881e7228bbc7adc5803f49a4501d0dddfdc7590c741f3a0ce77db3be75738956f4a2ea9a80592aaaf5e3cd2995181003f1008a32157d76ace2550fdc334e03603d19f8cfef8952e3b4662bb93c7dcd24a0c1fd1894f66266ed1af013f213b428aba0cb350921f0620e92f2d10b92860a9623033b4164c1e7e9c19a6c3ad80baf4237c1e241d8463af988903443d3e1330f17ba8c70d00c52e36436429d3e6de254a8e1d11b194ae09f3b35ff0ecff487065d83fdcf9a9b01f737e3462c46cc6874f58b7a791f0692136bdcdffb2427385bacd77de2b157dceeee36a91c1bd7775ccba39852bd85db846461a4e80fe8340a0b185cb6a35b9ac407993da0594dcd087296cfaa34caa2d155588ebb5ede50e4a0e96cc92398d076a2134afd311fa3b1f55af54c8d420dae4cb407e3ed75868ad6a6f2650e53d82f03743a7318541c7c77846871075c1504a623fcc3b6b18dc368d8d043cf8799762b3770ce37ec36ac2eafdb495b6528692b90f15d78ebbefc8ab01a8c968440ae0218276d9a1bb03bfc0089f0e5b6f1a1169c4b9cf746b1cf183d03c549108e274b8053229395b63b53c92480400b356e424e315b24d068fade09b515cc2fc705ba5f0bcb989566f12881b05a73fe3e98f03802db2ee8481cd3a72e7209d0ddc6bc99ec77e4f4c280f90cfd2e0278bc02c0298ef810beab7bbeb97f31487c01df84573b1c6d1550c7870d5eee2df7f259ce0d12eb148b1ee29d17fcb55dde7a6250da28ed2a79c7d40f8943a048ee79b48a46b14546d08c5776dcb1da528c1d48e4fcd6953354b453d983ab02b1adc395f246caffed2382f8894593950f5ea1d67adc927c4423574a17cfd1cf0e5a2bb78a8d340ea87efb3b43a155c6e3e258e64e32904b5a0cd80737f757ee73025b72b7c0c009f61a6c3d812b4dc025d93e2e013d17f9a426756963749fa0eaa4ee7c8a70eae839d74fdb38ff1d670b275044a1de73b311486d9a0f20f215fc1833ef8833b92a6aa69052a9385be1bd1694a5af42746ce4ef72b897f6f5307153b1c3d52d43c4d8b828bb1a46f7cb48ac5feabc440c48b7dcd1829c6ad4b1b2cf130af9ff189253b0c443c3150b5b518571f40fcaad884c596d906008a7058990710a5f5ca04d8520cef88c5e4fd8b43e7abe29148ef794bd094919f3d15b7c5e5d86364db52ac4ed768746f2f2e663b252fd9fd3188f94e7f2e9faa4da32385606fdb6dadebdb5d0cb4f36462b51c7e0b1a8be2a33b9f04a3ced3341c3e5f19db82ec80ae15dcb095f4a33e8e8a7273532036c58b4c18321fc86898ee1aec7bbe692dad413341c81c4ced20cb3a40f90319a663436947ea1de88f1e6ee80b9866caa7bb0b5fcdd35fbd7d169cd83b15fdedb07e8f66613e930d6178d6b9216e925200f8bcd9648268880cba40776fb0b6cf0e34ccbdec970c9c9ab37f633f6846b3f422bd915eeccb9b4282a0e62d2a963dd2e0540f7aa2b71cf3c042126393a7561449c937249933343525c3de694d00a6ad6dd6854217fc85668626926006db1374dfd3b2712b1a0f8387c65646c41a5169a3f60da606f0e56c17294b8ac70031d67b86fa8846db52cbb81a1d87f6e426ac575e99aeab60197877fa862f365631188086ea45bc74c690408716d8fe54a267154b1f6214b42882daf04ff8f970ab157713f5496e76e208cf14c2e648fa9399005a7340ec22d75333545d4bd5d10195055a03d6294dc3927378ff9e09cec98f2245c7318194074cea961a72daed8aea19305286363ae76fbca77b8593b833e4a370c4584472a8ed36e323ff6f11f6a01e0b18d5ff760b72c827a10cbc835a5344ec50be97ee3869cc5bec3fc0c181035d566d973f9b77bf47a6236e54b0a66ba3a3b4e136efb78d717e61115bc853a23481f85b65e5a755aec171f33e33b00a138d1a6998fc363643f20269f84677dcd62f0737a3b1a650f3f306f59190dcd76d4148fe76363b56f5708f16d86cf6d15adb719206e242f8df6c6257c8a16e4b6b61fd70a841aea8a9f588cfea96f6ba084d1ab81073be9dc1746b9a2e2839a864065b5757c8b4cdbe7347183a89b7eb43aa6ef6dfa9191241d5df20d2366258a9917646e43454a2a6b014d0aacad05d0f9b3412e25fcbcc1f12268640163094c3a5fddde96e3649d6d7bc1372718060d0de4439ffb5454978c931bdca738b59c24d66644fd7296241104880ddd47b3f81772de78a3919386bcf87ce5481f71aabed0016b5e9caf8c0d6904867804605f122f901b0553b24c883a5bef2bff74b9e2c75cd65e1343c9deaa03971c087af69497ed4a939138a15e0b0d6dc647b491a5c34dc07b3de5763e31d09afadd6bac5ea8e0d3f44ecb16f8e7b1a3a05d93469f1fcce2470fe9b6ec4e697c34344169a6e9d1147bf400d67f9c23ee7d57a3c75bbd5124da08989386413074cfd16a22c48f7b42d1416066ab454a177c61faac7a3225f740ab01d2e7aa86e2aa1956ca25c2f041ab604f974c5ee4c664cfd251b3aa5fdedfd37d79a37b5f01143066d6cbcae520b5453c18928557c9491df5c792b00a32d2a66204ddc101959ae7610b52204d2949b2de0e07c52d8aabc176bd809138a0da2a3f4d5f58b9c53bf456ba2513b975829656acbd10c762ede3e15b39482895d2de9f2a357752acadf9bcedeafe62ea9cc4486d0c2b9c5936ff4d9025f0aa4c3d99b0919e7a55009570d6e8c787fdab48fce44f2c82f5b8240da7e9c151132d5a44d3231d74901a2fe5e90ac4caa47b3dc3841c601a464cb7eabd744a9fab38c9e98fe473c1a9ebb482c550842c6e48a9cdf2418f00e329deab36422d1049109889714e61c056187e7a660ad53b2dc9fe86610891d459b7b11f16862aa451535289144fa9db1f8547507287f470382af90279954bd3974ed83760ad35f47836090839f58731ce409450b57e4aecd39a7ccb24c9445c70db08a47ba8bd57a8e260f3f4ef11568a24e4c44d0b63f11c0998df0a6e640d877e4d428ebf0e763a02f5d78824516723499c141debdb83cde26276f6f87603573064e3e2d352f703071be8a3249a0834c64ed6e63cb50ce7bd7b9682050a92398dccf9442b51cec1d9c32758807b63decb1e1d5435abbd12a6b036513e5015c211100a156fa2ef1fb40470b2263e0c2fb7650883fd67021afbf9ddd974816800fba55d328fa7f97d4381c58340e185e1d45dc03cc9737c6504de2ac435a4ccfb98ccd13bd12d178c31a1d64f7f83f6712467c972a65c3899677d7a09836d43273e5b003d7e8b271ecb04a0acd94e25030a549d0012c6baf75f35e26c15441b3e0ed02bc3a48e065f69ff920934235e23829a3c32c0fddd6c4c100f6530862d494d9d77123fd047cc696bd49e63a7b939bc2ddc2dbb3a187485ab875322ad6863475c1f6e25bb01a7407d7aa3c1fa314c6591f25e1f10ceb7800667748fd7bb82259e1acf3bf2426c27fdea0f5329459c9c453e5cb9ef40307dbf297285c25cf0509cdffa1d69d14dd670e9993b3925c16aceef75789103c931cf6114d830711df90a63cd7ec242d9e098a5a51747f19236ee88f3acd41ca2e9f3da2f4ef55828dc613a62d1bf18860e2df25c0a6aadc53bfe106e02a7f5526420a4e811b4784e9a2548a44f06e91934d5d6fdbb931f387064e0e1a588d8bb995039c8123ea60ef14ed3cccf4d7a0a283364eb1baa466a54868800a5698789e64e056c1c3a29067a105bd87d49bb826117991f79525cc8184217ea450576175b3563685b1f0d63448d3aaa7ecdb2fd09a505ee42949f1655295b46a268ee0c1b9219db378d8d44172aa364aca9a9cdffde46ca1851cfda892424d278328c75d0bbbc2debd035a9936401af2cc16b2128a293800bc681497e55d9081e03a77a1faaea74135c6d2e5a42f234c67c507099dd8c1bfc9bc24b3490dce8d6e3b3213aeeea1b4f28a078a5eab9a889e67058923bd6fcea9c62573483f75800304026d6b561230e3ffb54db822d9965c622bb356bc924813b1584b821b0fe051e09c88bca23ab68710b8aa662aec06a4c1cc0a3f88873ebb2368e7d9367a9ec3ecc076761335b91406c4179328ad039a21fbb3757c7f93c080726318f688095b932af3e1cd8a37af93b0ed67541565054ff27d827100f5f8e343cc755e69b86f338995930fc83a6747245d286816b5319a1c2d277b6b862556171b2a1ee62d1d6ac73098e31e73a8811a7511f2047d64296d9fd3b703fba3669252d19dd84d08b0e3bec8e3df40d45b6df3caa9038d0ecc0d65750ad8897ca4345fd4927d3aedc849dc07881ea7f386fae60709a3d346411388389ed5d7111dee7fe5a0b0e6a9c11e9b2395d2e04b48f2093151d3ffc33d7608ee9aa3135a76b5bd50f6daf5fee51c7d60498b3800712c57c014b3f2cd83be271f99ba1ee74f574e34af1398c7b489b2cbcf5f12ca711eafa24eb55f8f7afb78d74a8343f8151984e1a05c8562dda3bfaddcf1ab56ecf362dd026011ea0ec6ca84c31efd58472604da551818b03d8ccc27e0c823cf1e3032f90c3ff38d40673927b1e2ca9fe3ca40962c9b8b9f31cc231cfc5f43eae2c218f44b21d23fe4f9e45af045fdcbbc3f1a45cb16071698d86de73be46dc451e03cf6c6cf459b1cc6ba358c9c1762c2e05ad064124cbbadbbbb2a6943aba2978f36fda3f99c59ce253093f063692e4b46d8f1a177366b64a808ebab40922a88d4467850c4c54d5f3bd08b1800506f4eb0d3b137e3a6fd669a309ae57b163cb80a4506f74a0784c34f41505e52c498a7834a7dfdc969f5fc73d5433d4277a061c4afddf3af9512f8bf314ed9e5d6bdf55ed8f522da49dd1f4874756142fd0478acb5e8a82c43b09d11b6d5431256957470708f3185f4928745ea693a211484d7a4482d3a69debeed477f2acdb6af77883c4328274fb775d187b1cf04fb572a394cc538f22044ecea8d7a882d0ce6a35ad6fa197d9d725a45a251848563f3b49b4a55da52835545d7ebbc27c0782d3e188808f9e592bbf1720a5809010f853e4404ce1e4a7787b02b8b6d8a297f343cb4a9c6307c8941880e0b9b969df2f14985a8274a9927862ea626e5cabf69244fdc984ac5b64ce396ddf06f0d997d6a81753fede92ef6778a4a876b908d08462b3711dfd85b5ca22323fff380490630a7c0a102c66c8ef898ac5ba6e195b21909a2e8afb1d36accc5893879400a51f64eb82100e5979fb78b3b7deaf58ca737fa5aa9a914a04d58d2e3ffbd1b32440d5dec28454cb8f803dda8e0840cc649fec3653709eab9491f5b9a9bd857bead474197cff840f69fda33520cce67889ce0105c410ae41f2456c2cde50f9e514c7331afef3bf1921b03e0bc1f2435d07663233364a7b6928dbacd8144b81a8aa50e064ee425ac103513ac853b38f3c77cfc106f74cafa106a0a832da6a589cc5754025585f03868c81e332b329fd9bfd3c320cdba4bfbf67bd73b36aa882b7ed35d0fbf54b424ff71ef04af32ceb01c2714244efc64d5d487f89f3c5fff09129022b76d7ed169a3c90aa742753c223c9bc6482589f456c4dee073a8c631ffd5a81d109c32e2afe0986670643d49a1571adf390f24adb2f8c2bf5667bffec8cfddb410b9fa0ee7ae71dc46dce4c6bba41596ca1214101362dca6da0831642902cdc9325c5844548d46497025942f908c8a09a7d6147e30a135450c16355fca4c0368bd5f5197300df99b807598bb27c62b38d407774122e0752b3296f74160c28bbd344e6703df4c87bb2202d443a394391f07b4ec0bcd489b96355d282ded153c707f4b93146f4e8143605de2a208780d4894530c70877eb251f9e816938a2564f7828f5774f2b31a1be1648b87ce8abd4d91fdd6b4b6f00ce0e25c26a3b57fe5991ede3fd821769922355ecf34762577be0228896ea779f0f9bdb8c4d9314c554186638f4bfe275cadde43391bcecfed7146fc5abec1d58ce1147eb1fd65db3538f9f82c1376d52f3bb9597a9a06af3441b076d9b75a6e4129607ac3352780a679706f7e3fe6a48dad2c324733f91600cf9fb980c92639dd71ab7678f4d9c98aa35f24313fbf07d974490a85daf7a00c616bcf318cebae092f495e6553a198f83fb2f2d9e3ef4390c55cde2345bdc903973f7e4a316a892824cd7a9376c036acfc812a99c2cbac3e1da08492fd013990bcbb4345ae7b51fe0b2afaf9208ec6caadb0dbc9df4d9bd5f67dab0b93e9e1ee5cb19b21053503a23fa2095cea3a62c6f392ca843f085786c4c887cb1cc7ecf9faca8a8ecac529a5ebf8a8c919f5a49ddb8852bd223f700b502d8ff5fbe0a3f6d7239b0014cd65f286500c379a384a474b053e07f4a8b6d9afa89e991eec53c26d4add7243f9bd5ff4158e2a1ca1bf3a1545c9b0636d7ed2a2c5760b20213d1ff6743a2b89506fa1cffcda46e3b977f5c354848d040cdbf0c495cd9d1f02f05300d26d4ac3539f5b6102fdb22f43e10ba6654fe53b10d7ccb3e0b309928f3ecb58e58d95cb0e5ea46c36a30993525da78595d804202c298587da25922e056998605a8f0d6c1fe73aa66dbd886068f417c9c5b20a7cb9693d9ce7cbca4e9aaf74f0d7ab5459879a2822bc257cf01f841f5f5e0f4c780ebd2e9a7db271ac4b8fedb00a9c47190778b0722d6eccc5f9a83048151dd80ec882ca883a788cbbc9b3f5188296e101f8a4dec0c71c4e63c553d64f3056efb1ae86967a72a35e3bc0550fd6c70cd2701a426de55fcc145414e1f5dab09de33f5e0b13ad047b129a7e6638ee5760f4d37f6df352a188b69cd996b11f2b72671109f7d0dba7df0d9914fe59ed2122f0e80832562d6122c21ec799ba6c67de4a146ac6e1f0d36d6cd1650fa04d65a35cfabd333a29501636241ee3eb2f6ae16968ae26189f141ff9fba84aafaa3f7be7cbccc8a538458c428f0a2a0b510bb73250d1657830463273534692fe8f4ad866e068c1269da0147ac7e64b846b58d1a161c3f0c00fc4cb64ba35cc29395eb4ee30a1fd156adab79f0796e37ef74dc8c59de0541ded5e4d5e8033c83a39c93d9fa2560fc14fe7455f862e5115abcbf3ddc7f5a42c9f38b0583bcf1fcb9706a0dc269c73c94005d4a0778d0087803fac04041fcd88a9bc008422a770b32069e35641dc54ff63adfc455c8884b5864710410320f7fb7bcf37779236a3a92ed7ed5317eac85c60acecf259fa2ac0a6c64cec57954768d874f359886307681ce251012bfc48d9521659105c1e30bbad84cfd603d57426d1cb14c0a21d5065bc1e9ee3ff0a2c202ffb1a20a754d043b5249e26c21945750d3c2d4f51d0c8eaa0515fe3a160b48caeb40f79d26e0594aa77db804fdbc6b807db46806d6b2d8ff36b157cbe23e7801e6b0e2ed10ab45cb45b1216b5d95cc32b7c3191fb96e112366362d87292d8b52b71f86a2dd6ffb4ba0e712704dfb507c9f0b091748c10a6e7ba20cb748a79c9a8fdb5795827b0857631ec4c791ea2f303b116bec9faf33af287b2afffe26a6899a99328a95ac52a75b3b7424b36966054ad55b443cb8c1299501af1e8f769a12c2854942c847f03428e1b06ba3ca310a234aa8f0456f636b683c0eb186f4e25f2579584174662c00721aa7d85a3f2302e9e2fa911d645d301e1a95f2a2881dad169723628fc75832cf74830029a1f9927dd3369d436a2ceec345d914078e7333474c2150fe1176157b659115dd1c70cfaad103063a89b624b09f017300430fe9e7ccce46060d7238619ec9c18ff3f7699c98f51ee70fde54809c149264a780ea500a247cfca5cdae2b01d62f9235cd50b958d215e0fd48edf9b19b8ae46dd8eb0ff6b5110212519e709ed076172e7a9c9f26c20830d400ce2a01cc79659b82cc875b8e4afed398200354260b9dacd547ce0db9a4836022f80a14c7a3e3d24506d5f9dea528300c10fd9fb9b209768a91dc34b2e20134185fa6281b3ed3a14059fbf63eb06b522b763fccecccd6c422b8065295813c8a3d35b20809ec25de00188a6987c373d98806cc7fef63ff687226d3264000918a95610a493a6734ed4aaa37a1c14ebc90700a62c4eebefe1e1331130b6525bee261bf657df48a0cfc1f5a873f7d60bb1d8306d5470939ea8bbbc07ed1160998528d2e16b5666f4dfb58c71f1e76eea323e03a2cb453c04c05807ddd15ecdfe2be54c507ed9160942f9012990c944ee5361a34ce3cc22b8c10021f2fc901915d7721055a5188ecd1ff3431a89e45fb63cb9bc2f5d21b603f43868b76113c96763b6fafae99124d48874730812caea9d72e5fe20cbd386a665ea193795f250a202e39832d5b3eb74daacb4af3a68fd6c21dee9cedf8cbdde8337e98bf0d7fd58624b8dd6f5596a87c1887bc5cbfb3158c4c025fd3404111e4ec6e03ae164fcb5b854413d365c1cb21922e275b13d5a0b1d7dabb13457cbc753c4b60522260a83403da48c309ffd8289ecb91e5a7904f9238597140d8dc77097706f03c532fe045cd52c4cd58bebfe6552639a3b07963128c7d973bd35f1f842dfc3fd3ee3aaa18e03bbd5025302c0fecdd23bd71f1e1a72f43f444a5e90ee6f022022aee4e0fd6d03643ae17286eadaa0b3d562f7760cad7968d74c3105b79922b4565ac3d2b994fc00c5793de346842141fce1370459af931acf46f11b2dc0a4f11f998df144e93399b8cbc8696b85c5ad3be38c38deeb364e03f6b37a1d03d50ace0ea4c91f3dfbffa375f78a22cbc8d0dc09e97d80c7588d13910e52dff1c79d857e565ce48323c9b750f151efa3a90f49687a8d89dbc3eb0fd954dfafbbba764f42e574caab47916b785e9f8278538da41d915487e330e0d4265b279528ddd3e0a8bc9fb3fdfcc2a5be2054eae7a9afb73688f4464c7f666dca09b06445dd0748d77cd608e5b15885fd33b7dfbbf4697aaf4f5502959e3d30cd2120b12e64e88a6854d00d9c324ad532d4386bd77cbeb8b1f3792d36c54798ebbe629d754410a0cf9997442bed4fe00de774f59d33c9457be0d1bf991ae83379632df45cb8479d79ed9863de0f25d2a618ad3fd2bdd67f493af5c995020d42c627f308b67f21fa8a9bfc12c3a06851aea7fac2f958d047e80bb24d4d35184e67db70f3073dc4b5e989e0bb1e740f953b383f169e4058dc7adae514ef16373df47e2b1eabe21fe49c7f80b3280d12dc44b1b595bb41cbe0089a169772741acf44417a56d725525dd3dd8815af8b35a9a691cd0ea0918dc369b09b68bfa828b7fa70064fa017e51b65a390828527c23bf4e5c750f0a5ac3000a07a5e5b4ea17ae4e61d7794d5e746e7067eff5bbbbd6b5a70d0c351276ec609f35146a1174cc6dfbb6e0f3503b774b9fc903d7e83dd7cdd56114e0d43de5275599d8feead4c20c33c44e0ae58fe9e49376fe2f4ec935540ec404cd5dcc10e239b256dec6a8e32207f5a4f8e68a10934eef3d2f899d19c6f282bf9c240ec3c8c4bd55bdbdfe6c4273818b9d2b399911e1a4f462a74f0663adf79760988f02caade9da1a42a1952a0c5e476626b06218197acecf9b1efbe57ba7eb82a42024b519d0c54d3187637c70bcfb5e98a0d0e57398b38e00b63244e33086da40458d37de9ca01e2fa4fa561a198e0b4631910c87a6cc483b054065b0d1407484fe1655fbf1bcc7d0e77429c067e6eb1324c96f2465d09e9941736c7963b895621065ba37748883b63e7d734c9b43061f043293140978481b802d78c71213160a0cc2cf6f39ac42547790dec9b2e6e62ba62a7ad1a6a642ca6f2830a630ec0e8d84184d47d22fced0823d3e6eb8ee24200552b94eb95622cf7567abdcfcd3d948e440acc0c6581c7ec5f383af7e8c095997ea7eb304f7f0de140816da8d06c8ad6a952c5c8974383f5811f03527330357eb28610e1cb8faa4854cd67a6baaa453ca4328dbe02fbc6b60295c46a8b0e50b6716bd49ea4aae3c858372193ebfa23c94c7f28fa2cc989b89952d9a6713be9da0a100f98b3a39910b5a6960d9e3916b9f04ae8509c8991bef8a93595f9c5c2cad569c170dcf2d0bf124964a8b4caf0dba34531b4e5917fd29a9732df7c089bdf905daff5adb4e886ffaba9561f64dfc1df8400d258fcc91ef187885ebf79606bae0a633b2026270d39b0753cf004394a7c628a5dccc6f944eecaec34f92de9f9b12c4054e881f4aecfae1d3c04789220113fdeb2fa0419cb2953a8be440365410ddc22b32a26bff3c9022a4737baa9f73327903e783cc5e482be47947f01eb9d632f6e81311143b3c8fa9431c170f861d4f612943ab19239a8e66a92894d8e900da8c1ef691527d8b502b43ddd49da9ef894d028197f93cd841f054a61a3deaadb0f7eba0df2216727b5e7ae862f8ed1e389e2728481112b3bc2ed5999d5862a601b190a2f8ccc5c91c5835ea87f26f083410fb49d5c9110b1a72fdcaae5ce170408b51cd43803b06848d9f1a15f3e82af1ad0d605e4b2a0f92de2c2aedc6e7b79d162170064b257d254f1f03d14cc7114ee616d8be874c734fff344ae529474ff95e0e311f788d656bca671c446b7c44308d50accaaf41e777ec4a89b8ec4c5f606b790d6cfdf12151b76b4e4c20631bd9537894a5b0d4106c3779440ca76e98b41376122494906dc914a0719e1eb4e9345d1271ab3c827b426323363b5191dd4b2bd5559c26b6ff831e21e75f0381a451d08102889695517a114ebdeb313f03d98a70e7188c0a7f84d0ec113d1a2ebc741538727c9311b071ae9ad04a3059685adfcc33194529a9a31ebd47e954459629d0e44dea045b8727c45cf86951202d418f112b87c1a5a367418f012692c677e7827aa7009ea36e94d338684ae69b1b4c3ff3a3771802338c0bc6d248b25f194e31eb1e4aa1048717513ccb39648a8cba37fd2672d2bd669f188978844523b0a21d0a57885bd42407db1757e748540c48d96407ee2e8bf638a795de24393ec37017a77080c7240868b6d4736c960851f88c040752d1c6dddaf125535cb4c2425cd6acf764f7e66fb637f83b45679836d5210ab125eb64b9efd9234e6268da22adf813805cf08dcb892ed402e8bd9eb17acc0380dedf0b460ca9da01fc48e1e3c4ca68a8fb63e3a7d9bea33bde011ea1dda5209db19be0ede8d08ceeef0b2b18e61e48107471d0828bb277a2579dcef974f104bd43ba03a8bf237be31171e8ba3ae13fc05fff9b406d715a38826e45675307c0d9d0b11e3a422c9e40b0346af853e46f0223e963f15c8835f161b9063b621bd25052a7764b3a854554362952c7f481a144b1d01bffc2a8cad409e12a3402b1ad03b6626b7211a5f6afb12c06594f0401d60502cdc2caa5600c2ee7d150b3ecf06f4e96cb342de12a29a41da5af3ca7beb5a81716b3c39c1900aed2b379de44cc109bca5e414c2b9f673969cb216b6d4a2664cf0dafb6474c39232a25e456f8db81af286ed46f3c6af28cc5b1bcf9fa05774733d03e0ba54e6d6facbecb24835347daebce8ca21b06364bcaf91bebfb1498166de8418b0820424f13d5a9e0793c9894ea16e5fadccb3604d93007515f1119b5d656384e8ebe6e2c2536658d00e73bd882fab109f3fe361f7deb4131b68c7524bdb496bbe2105c19f5c0e5bf2b01b66724bc250eb04fb3ec77e1d0a84bab9ce6e8993a58576af3db81ce6d0ea041c3bd15df0a18834d503afd0388e1a6a30ba64aef167c47c251d3b9b97e356451979aa8eb5f14ab5a035a96d352d20c42158cb0efd772b163439080da4c4322920d04082fb9d63d24fe1b697a8d2cfb15adbbdd4747ad7e288e0b4a244f5e5d3898cab71b1fa29648841b551ef545850b96dd094e127fa9b6dbb723f952b63d8344623d26d5a8441429d002a4b6e138146370e7c70c9cb6df0ac356ce2fd185e43085ccb2099318ae3952985320a5f52b0e3b00270753aca2ed5d915bc664efaf274ff5c2f3f1033d939bcb003269dbe1098fb00288dc8e34c34fd63260335aab93e508b95e0bed499df679a15b66be8f1abd2ba7d10f1a035eea5ed91a585953a48506af760d416f2390088e7f4b799ced9f610d57209a75d32b8c0d4c26cc606c292677c18d91a051827f21346269f135da6c475b57908eaa5e6d2965a6368ad481ee0206119d6ec51293ea0d1c4b88c7fbf8e5d0fb53d55916e2285074bd3fe0b1d416ab540c2049b6838136e953ee3a21184e9d8aff1cfcdf7cbac46b77d0fcf9297e3bbc1fb8679c97528eb667006ab1f81ce2a2a8c6ac622bef1a9b81bee56ab9bf050653424260ab7b175c94539accfd8e638e107d7bde13d1b10455214df9c221d3c001bcc00f896bdcf22d1e96d6d01841264ca215b0be53936b84780c6dfb6472cfa2513df01f9a0b47c3729654306148df6725840a6f32f399e17a89d8caf63be8b0f71aed7ed8fa6521d75ee24f58cdaafd3d49d1411b0ff6effdd2ae72174446b32921892716ab9b9e4612701ad956f2edb8188bd8b8a361ab91994b675a3619d85fc32bcde5387e2a6ee39ef0fad87a615ba361374e30d952a6cdc01e3805bb2d0cc115145768309a5df6f91cdba130ca0a0631d9b167ce697a3a7299e197e07235452afbb62f9f401fde604e688676d7b97072034b9471891295b804bffb2f78ef3105ec4b3ca768fc5b21b1234a014f12ce843af60c5b344e331406cd01df4d09491d92d2d2aff634dd2a53e59ae5f9bf9fc0bdbcc0fc92315d5b24e37659e7614316d2f873b365cb3fd98a18ed4907e5cfd9d0ae90d1a57885a7480a16dd903be5accf55bc37ea7dfb1fa167f395b168a596fd821b312448a1c8c05b2a1ca33facf843996fe182bf06bf0c12678546fe5abb362ab16d6fa9abaab74a5fc65557c583dde5162c40cd6380e7e8f608ca4f0ffa444f8bc3c7cee8a2211d67880b0a78090f0c88c6064cd0944262fdab97db026aa467a4b413aa249a3d2a4cee7760b93691599ecca4811ad687c81c2a11df88d44b4ff52211fd6fc9b1f0e8e8fee4ee5b663921fd64d94c3a322ee1d9aa3aafe2c35576f71a83ad8a2d8fe65bbc2e906b80d7bd549dd34478dfef3573ca44e86ec3f90d7fca6cdb3e47ac97fff6314280f9942741c72cef4f83caef47f15e9e9517dba9595286362469542f864cce17de1b2475f04752c3e09a2831dd9aca7af10eb91c9de2a49e70d5b5a55f99f603b3c656d6f56c42a9e42792418185f215724ba0127a1b9a0801c7d0d1e7d050ee7f32f24b658f08d8f85be460fe8ca7377a140b59f8d143a6ea33e4326c231b003219d0a4b111fabbc16e317ea3632f58746e9184ebf6c1adaa988128575c95d6dc2003271c0d95944134ce2c5e07100e6d7afd7a7a59bba02eca4fa4ac2022374be200839485aed9cd83a109aedbd18bda442858b4f80cd8b19ffd39d2828d31881ef67b872034377ff66639ad42abd6fa66a8a2979fbe83ed4acd036e1e4104c4f124ece7964b06c10f315441e3dea706d449e2175c28991398aa55952f59776dfffd50e9e72e1f8d4907ea756e6ab90ec94adb6d42249500d8749a6cf8606e6a47c3affd1a9e3122560b27166d781f72a2261744599c7b19acf8615c6179b417ae61cbcd5cea1cd52b6e8d76bb654981787756c609d4082dae7c8986f0495845424777a0bb70c2165a44616d1424b7e898a898018063002c0fb749e810f4c5f2088ad3147a4b227935cede5c2b78477afff7897d5c88635343c81aea6b1d1678f69d670a085bae9476af0242abe67fa71749026f458a034d8256b73dc9652b100a255d0e20e89629498891b861e2be165c5a7076da15ce90dafdef392cb30387754142b94192f3e4d2377b6cc75d820297c15698c9feaf4e4f75ade249d6ecd15cd6849e84d6a9d5841db45a0fe5730822ea3ed79718ab048121504a3a0a862105fc1096b31d9f42e23287a0aee4c637518c180f090c2041411aa6975586580d88e084b7fcfa8c993bd3537d62d8fa411b0be36a06a687388f4d79f056036dbe1a2d3ace3533e3e087ccef94e6cdd2f64f8802a5af41c8ceeb4afb2d5ea68e4890586bcc67c72b2ce50c259f8796e1854805143a84981e142d9e5310c47f455cdfb019db2f1decc02e8960f9d23bf98c044a3750476ced7265bb5a581b07e53a42959b88be744fa754283733f5ea93f6bc3387831d3a454b87bfcb71a365e39c1e5266bd1c89e25d663232fa6a77d2c0f6d774cd73262c75c690e7b8db516348a2f93f99b652f711eeea23e0118b2a3b20f165bdf7d29167f2be72eb1cd672b2fedf493d6d955f84603b6270206ff9b07dcd7d39ef29026401216e0514c34459cd2a1a77efad99f168bdc3caa02a0bf2c3365823e7f0fc89851d996218bf4ca41fb0bda70582d86ad539509fd52e65f33b5829a4f61945a01341130f96adf50ab801b982c23a369fdc2cbb9bd24119f40beb22711c7ac6b5297101e42d8a450e35e2c57541afa235ab30b170a26a648a2baa12dc294ddc425eb97029367350f22459d004daa1889adf409ece6d83d689561771076bf86f51922b4cfb59e0371d8a569ee861f3630ede028e18becae80307202cec9e53e357fac0607d7f20eac5766a9a7978170121d7a57b9d583f0f2dc9347e996818cb5a13e646d14b5408e2a52f2fcf3519971e6e2b67d1ccb8e15c8338422f6a26a17ba055bff7aae48a78e5feadea7de8d1fb039af5853d037e92d7052a46e2cb7eccf310758de3e7c2b98c016713305351ca59a1292ed220181f390657706f8f8368c27c0b1e6b5b4f5810bf4fe41013e59b833d093820c42b6631e0f84c9867e086081ea60d9c92da2259b9b2ce523b3f6e377589b0ecd150814d4687d8e7daccdb85f500726d8cf1fbb682253c4437b698e9119fef7b2fbb2fbf7afa729d41666c50251986c1ec998991728adf5c588ad07efafc97edab7adbd8ded9e86950aa951049176f8aee5dbd878e25810acdff94a55c28e6a4ad3fdee9aa94389c4c99ea99b46762208c9ab7129a873ad2b7a1603c588f23ec78bd05288f12158f4ec89a7bc5f2e95156c333d2084ea373594c1cd12a0ae333ed07265165fedbf2ffd4ba50daab76f047e44716d822b1b7ff411775fd65c363d839db507fdb8973bef8071c0cc9af804a2a88f2c6e38087c175635706b9a238f6a561f7f73c4519f8465076d7124ff3f4e3f9bdc3517fe2a499683fc78aa8be50e153ddbb8c03c2b004dbe2d15ed81b385ba1026cb2b9ebc576807a2aa9008cdcb800fb85864f6b59181d1ea5fa9f110e3b6b8b2fd0afc167ae360439dff37f5e4ebeeb6d6ac4c66c10c3c34ee0929d1fb13498f2cb83a1ff7f832b47744c090f401067505deead476f2caec0b8c3c1f2fca20aa25701f94ce81520dce03477cf4e77356ad2f7510d8318670b56215811d657638f41f8759104d1944a0fbb1b11c3594496f682b50a886dd80d738c6879bbfcb34800308b5802920939103d06faf67a48f377fffeeb44bed1858d73e8f4a3c9ea7fd792faf596d0f4cd25e69d66a39fb29edb88211b0caac62463f038e166e7d27163b3f1240f1940c42cc3c68084d50bd06102bbef6eacd2fddc6cebc49f018e08b2a627eeb501220498f9f9cc5b5acd22bbd66354f2cd6f4a37c2b0df7fddfb0db712ed26d8e1c622ccfcb14ed6b44927e0d8c5e31ac7ed34facf00953b61584b1838a999faf7e0bf4b20f0e80fcc7c85a8c5bf5f352dd1e5fd5ffe3b86382fe665b305887da786960662cfa7dde5df5d0311d9fd9897266f0c43e10f8996b7fb89a836f95f895fd4c91d2f4e49dacf31fd5c75010c9623e91a23b74fa8ad2678275f0da35a94f60b1513ae94bae51a3d3acbd81a451a9ffded6112d7551c3e2322e174eb955ecd12d0db3475325ee30afddada2b40c2abde081f44a4d4963e04af4c0501d7af82fdb5d3b0496d1daa51f2eed017f49ffc2b355f3b2bc05dc63e8b0b50384b37bc2eab388645df729cf0bd0aacfd46bb451e6f6ee47c123f5582a7a703991796312fa1ab4e7c25609f130777bf10e1e6ee2cdb02c5e6973f583e95060801df9bc40869ad8da1ab5cb52e440eb567a5e18e3366f687f8838082f7531614ea2bc194003164a1ffcb0200aadba9e86283ff7f34113b77cdaa212895bf5697596a687af49f758d8f391424505305a75aa03e5a0d90d95a5ebde5dd7075fd07471ed0e99bdf79d5c77b7970d2af62379179ccd2888ba9d29b1da7c6c556df26f1374861be6b1c09a257b4fe9723253733536a2214d536f0594af0c90ed632c304a04210491c8737bdfd84716c2cb6771541778c634301d91ad8bb1a80914761f003c200d032fdaafc64d304af54b97e1eda831ec2b9ad122d96cd2dc99c9c92520a28fa2b8e5df5d7dcbb5912b6e168e83b1b5d0ccf10a8b7469af4c0072aecf58f1ab18273cbee53db785dc149f7473792149ce59def6a21b1ac8b0c40ef9064f6bcd0d43e756b31c36f952e96b5af441d27461ed50273cc1eb689705a6513764919a213b41ebcf0582e671943d7b1f6dc94b00d6d766ee795417e9f75a297519e8015fe732830676f1ff13380b4b7c2a48b10c5aa6275643262d5eaca7632bcb34c6c186a96436b199e39ebaf25547eda98968fe94efea073d258473abf84126e15648034bf4dc6206e42e60ac5730b17907ba0c3ea4a88e297656e88b84ea612b35a4d0af8aba8cfcfbba6e7abd32e6c41d34ee03537bf4ac97fab64ba5785f059612eea6901f7a3ed2f16c7b9ca2b1b58215cbd7bf7c7705ae4d4498bd2af919a8d7b078f71e58f9c77f79e0d4807e4a67bf29000ef00e423d74dfe7987be10b4331720058e3d72b20cd3ebc32ec7af049e7be54b4c535b363c4df5b6f67a45e642b41bc99959b12fb1b58ff5109c8a04c02069c3e98afb27a043a66987c9d30671cca72472777f2bc6c5bd7ef87bbb649e7c33a5dfa76087127090056ae74bdcabddd7f74590b51acb014b2f6440654b0c41613b273081e063af8fbac96dad6a5fa0c2b7aec006e4200896a7e9b6fcc517245705d15f252834f11abe3b17415a0c78417a511d7db06f0264215fc920308c3d549c6163608686951e09ecfc57f7824fb1ff58c71cf4fc66ac12477ab920cd1910c209f08859cd45570f60921252d10cf6a6b3571614a25cb54566c543daee27055c089b43b63bd10ea82728c2c6040c82b78ef049a93912715f4adc53a2593105f89869fa341020666998f5f50d22aa1edda0688d0deadfede718d6ba4267790e88baca58d56318417b56741242d6446919fa129fc92731d2f5d0c305264096332d63e3a33a70e209162d6a0af5e5140dcd06d6deeff301d4129c364c0c87585a95dc327125046f0ca534695ed38e1638e738c1aa6393808fa6643a0b781807f757b3b9d884b0db577731d72b1513ba016b8b68afa661d11beb8d16cabc189ff18027ae45146836348856b6773f10159f513242a3205aa8edc96470ac4738467c917512f8bf787a137c6a72d0968a9aca6830f1f28e359e4fcc55020222aea39d38a1cf8d84ba9cdbfc40ae09b4ebac5b7548a066146f4f136ac60f0f405b0c132f9d14d74af270a2f0411c74ffda36229c198025789b36a1f0a15b9b35f54fc8fcf634d1b4232e1905f49f308c96c1b50e73d85136d3632eba0e5006decd1390f1ba0cc70e813f8dc0a8d5ec55e733ff359377fc69c3cee99b458994cc8e24fdb2aaafd67d3f868176e0008349c3b3f946e93aef7bdebe734e9550acd9492a769fc6a8e0c61af031436b735f8e6db67d365c0cb193a40316d490f2910cae0ae885759be82e252a4d33019541fcdd8a0044371a67ca64d3d72d92febe87b9d0ff146d591bd3427d3f01611cef7ca3533ca3aed14aed4dbd445c45e434ab5a3f1fb68c3409efbe182c2b1081ce897aef994949cf3aad3d875985f3b1b68575605b9b223eee7b024548117f0ee07eef5bcd3a77a206a5e31b89fbda7854410002ddca63812df489e17d5eb0f60454e6c61226b5f9325ee279f73c2f482533d833252ff3b10ae781b33eea7cec97666b3b7314ddcaf638730a2e4926606d3792fabb1cdee67c6b5626335f3c90983aee2c825da85e641ea8a2323ae9d15222cc963a76b5f56bf87d5f6697ae770cbfd3436609b791c47ac5a12c55b1dd6b1b91601641b948e288c029a82cd7fb27424f757ae8ac1fd5cfc5b837d146411cd7547e9cbc3a670b009ba2d409a20de585000b1081de9e41a6c5f6a29bf4c2630bdb31f81a792544deef91e78f01e0977e9ad5444c8b4727ea6c6cd57889b2407656e502ad836775052b21d8ad1e1b161bf0e4ad56ead150ebbf5f790a75ae5c76f18414f335fe44219da5af21308f15258259f98f6ae2adfda9493bbbd2dc980bbe57a3edacc8111358cb30eded8846da281b9dfe5e5b888e108d49ceefdfa2503a462da11658b0580e5898c288458c711e3a461e76991a1996767889e79599627ba54ca71ee9a2a8cafdc7088ef36631c543be866c457a82739f6f44f50900237e3a4caa36fa8da6cb2b6cb49717a3927998921beced4ad02bd610cec6f79b1917e355b6721ae7f722d5ec24605fefb310546e83cc4c4405d1fc89e2020c3c297bd48026d3375a9756837471dc37a31160130846b8e5d1179b2e1aac7391c1203c784adccbd22b41ec846e7b11efa8e582a16f48b313c334cb53f3cfef5ffed8f88cb52c28520800c7e1e34c3ece142d44459916e0a3db46271ab07717f8e25c22df3bd644e2f65971f4eb657d125e4fbb605a2bf2830a90a3c0a8569ea4a82b19344345d73f266aa09902310c21354a941d2f6a173b99b69f21e167832af24f648b1ab1b057e48c0691cda830e07daaaa15e67f68811816ed31b49f4894d0314b9e9104084e1a75deef27c100853c84c97c587883fc8de10185ce4e1a14373a86fa9f343b3e054f7f44ea252c38be0d3c71e5ec5d247761c4dceed0f9bc62538d8f61a18c4e0b276591c108383d7e04906b2c136ca46db543d2e6be2eb04a3f4af4011bbbcb37819bbcbb696b28b6c82676a7b36ecf5315c0e84e585918e0a0eaeabe30aace41fd527bd12255ec0dd01ed90b1da7261580ac991c2607c88a41aac06d2aea933d13336550ed91248ae38abd6fb86e90496e9a2c326c99f135147c6147ccd59279e51aa30ffca6d921f04ddf79b2a933d97946735c3be64ab29b5d17b08ef1c08565716913790f330474095c8255ec4856a8b843f20a73b0d59e201586d470c46fbc62786c14ab0337efb214bf7b54f5350874a32650913ca17ce6dd34cc9a6ad0a618c6593b66f2e3ff8b8529539a0b2672ab0983b8e08703ca50e5763ea58897d5c2ff54d79db897c453248e3bc7580d065ab8c525015e286fc7534da58f91c06863086dc407127ac4a48a9121fd259e4cac1c7035f121f5efa2b526850181e1d0bf59f4bc137d6a0422cd54140dbe8553a6845a425b68ad7b385683dc8e6c8c533482acf77a1e796f9f044152f9d60adc2c117a860227851f7c5d0320bb5c9dbf6de856d817b9d2f83e63f37e3ddbe0b2852744c67c286c9acc752d5d2794e50c4c59fb4055ffa4809c92462fc6e0fa00bf7ac5ff50223ce377a802da08d7c1850f65a62de76aea3a32247bb44cfbdc167f01d925af2524d6c593890d5fbced5e78c31b9cc7974ace2bd9467bb4633dfb8ff10845653c4761696dabe01479300c174a92db5eb8e5943b094f912ad7b7a67f702564b147a247d30f35b422a0d6fba2d64bdb281c2bbd5d61357439b542a7f0c31a80157387324d9a10c1ee649c85f15141e584d07bc7401ba0ffd3b5950cca4d50672ae15156659a65966d55ea999551db1e0b24b9f8d444599445411906d5a9d482c980a00004d934ab818f5844e3fb1870970b00dfde81e30e8f0c0c770eceb6d124b53246127b7a1ebc76e914b76ca24534a2905cd03f80347035f3bcace85facaaed5c22afd9942b59e903e54413a3f040d9d32827a3e2ff542e63ecfa36b406f1fa73867a0253f7b8d734e75051301547c88f61110f8d3a148ff8828ca3f288a7e5a08fd7405e9be5d7fc47a8dde14d1d8bbd220f65c0ce9a2ca94a8e495566512d29622025570d0275969de1e433e438a7c98fc6cf2db958789a8a4f7ed4d5df55ce49c3558467ef171efbd79ef2dd1a5e9c6300c439de8d3a35296491144a90922a868696969294bb1fd73097bf80c71717171912061f5795b7d9890220f6f7b59bee49da0b5175484a45d26f876eda92b5c14afd404080707c6598902e19c80706f3de9d115dbe9a3eb6b0add2aa1d0a5a593c4dae3d37dbbf6087d966f579e2958ecedf4826c0444d1671f751031a2587f5afc74fd174b444c51109576ed69fb7cadc7e7f5b26fd79edfff76ede1fae2b76bcf150e47903aa5be221b623eb6a4b8b35f27cb53beee8fede9057adfbd78200da1e5c8cc443434b317eb01ff31e9499f01e64fc0a1b7bed4c0fe183b83ef0e46c727c0e8cc9b09ffe6706747de07c69483bed919072e2be040c98b81f9d863b0438ad5c7ddf7b08f6188f75b2d5a2cda8f2fc636725bbfeb0c88f65b185e998660f6ddfda3a570f1ff7d9d4d92186edad71959f41fdb3e0eff3a1390238bcefe970286bbf3711ef0afc73be56e8568f10eb922687269189308921ae59c73ce77444b8d5c4017b4ae5e80a4264d4a584d5a9cf51f921a45b547c6dba2fbcad41d0b888001947a4105be281501bed3e73b0b014d1580cfc487ad8b65a798dd2196c91562873cf121dd301a9fed51c386eaa3aa611ed58901533e55bd6251e75451856a818f85daa47ae0b36b03ae929b448a1ae313d3a03ed9b5bb891c2dddb852a4bad0a18a50b5c2351f08354ec56c6c47b8cc6048698af185b4e45ba14af974a836cd4be53f3b724138fcd2e2903a0c200d4cabfde27083ae90afc825ba3cac13232a0a33d54a15ab8284bc4c643d17456767525703968fa94d555265f82e1138dded606dd8330ab6c806bb2e55007c96478c9e7ac788e470f15d3238158a0afa2c0e0be47ad811a71ea9540ce0db51bfd2487ca02ac077c4c792dba38dcc5ab9686faa65b34f2c953b5443d59cf3a00e07c661eb47cd527f3f54af1df7c468c9f495a9b6899c4a8104df08abc448cdc06783d49061363675438509161d04b83922a61e2030d4fbe2845b96a1ee381d4720083076d96ed2ce6793d82539d4140ef005511fe0eb5c706b90539515f58a6a67bc4951e5c07c9746085be5003e26eadc8e0be134e3735343204a78a440e1d1055661bbf87b879c8825272acc003cea9b717ffc541bc6a526c0076583da44e50538c012ec6750607d8522eba538247cbb86780aa164cbca521ae0dd400f5b0e26a1b828482ae4fee367215365fe767d4203018213190d1a2bbc7ab4f7301e1cf141ae75d618120b14715e45daba8fa70ffaa929e88968bc329ada8c2d02959ef69a889118087e54aaa62c4129d1e6030459086235127bcaf104c6d4ad19c6f87e60811b476d5561439cc4e031232c4c46c92b5fc6174ca34380df018f95c9695daa4abfecda526483f631313c8cf73d866e4691155f99b48ad218bb89e7b77cbb3241094a7f2b061830d29cd7a5a5a50dbfdf9bdc8f2b486a274805bd030eed6bb8b4bef7b7eb92d00c7defbdf7de7befd51e02d826992d5cc6978b318dcb843b8a7c93f9768ec3de6dccf5d7c6580db0cd112aa0446a557afba28eb4904352035df6e6764b5b9463bf58df6cf610fbe75ddb3198b5f6f7de7b41cfbbd6767b775859be649db3d2d952859c73ce39b3284133a252e7388528cd408bca185f83ab929412d3099fa618e40c5e4a97f48255a9e7e76fd70f57fea905576e31712a7246395b73a06633c47e2a3c4057a4b832950e3961a967081f349c1e3ef0a049e4502527238e240129b1e3641b3b7f5e345accb8423fa0429b9e4e261d4e200f45531e7a6953d0a4274cd69e0841d9cc3ea871d2003bc285c66539993897409d4a3e4475d88036e9f0534525edb9a12a94a03d43ce9d1e278f1bbf1088bc50db4277aa509f11a7d5d2092209094452d0112b285c14d4c392146a27941f3f706810438b8102b19881424cea146a3a977ce80b75280552774e2771369a9419c942439fe87041e304d2d5f601da43850e12a70b10285412fae4233a57f87ac2a4b8b50521190a72b6ad676428d6d79c8b330716ca55e24a88b3cac3170723161c7c502073e80d28674f9293280dfdc0038a0d2932388070c6d0f271a28608d484128a04e9080e09e8ec50e52c7b83c1864a1101f3710e2943a9c2d01230cea21567102b7448d40fd3d811872047426e57d0187048989c28721239a3ca813a9971f53b570fe252a0ead48f9311556a83062b1b784e35b9244e461c3103822ed901c25811af13478b1757a817d5d97b4a853a8828322ac36f57a35e08733d3754091b9a42cde7ecaca1e39c328646f9428fb8ce33ad73435591a8a02634844a56442457d44341983bb9dce6d8521f35df198aa4236d6cedab8beb1cd2caaa4265443135a51ad4138c88e854897ae8893914855b5ac4d6a4e6c1990d1d678bb1f3c6d71817ba41eb4755ba1385a2351951d31e0d44a8150dbd26734a6e466c278fdad3192a45c7d4d8a9e10b05d7142d13556151e75b13ea817a35442462a8877698ebe106832d84dae9757642e9a03226f795830bada2f556751e45a1424d24541d4244288f50efdc317772704b79d870a89d54ce501e3a98c6d2a06d2b1558da6ae29722a9125afbdae31372e0786d30861c1c9ebd0e0effa39db91e7b0dda805e6f7cf5d59e07769203ed718d36b1a84b3b737d36f5cd31b8df2dd7eb34adccdee21bd0ab95ba7badfbb5dd66df7cbfd5378e4a8a2ae95fbfa97cfef5fbeddb9fe1ea0fe0dbd504d2cfb9be7bb1df7defbd7c37fa7eb7ed3cbca1277d8efee38b38615b3b437abed3edbe83f95cf47bd73b79e1fabce381a18efed704499bedefbddc6bd266f3f6defce666d08b97acb97e9b3b7b6b41e69ae08e2723a669254ecbf7dd07f645bff5ed177748257dfbad0f89225ff4a11765300d8fc5f3ca30345d4251b71b7d28fa70378e16e6b3ec783b5e065dc8db2d5f47ffd1e7e80fbe8c135e40b025c31fcd90c593bbde42dae8bc688e38a6a5ef8d0127049ff43afa6f91657b96ab499bd0ebbc48ea48516b109aa267b1208ae4387a51b7e39e452477305fb7b39e85244dabf39ab4d1ed3a8ec131e1064d2be37bc0fef5535bdffe0c5f6cd918b470bdd822ca609a8b2d06bd0cc6bbedafbdc1fe7ade77dbeb1b1ee8b5e775c01b3fc63b1e68de5c8f714e3225f5297cbb4aadfdd5c44e89255f06c3f63cee37dfde5a0a397b23296f062dcc97b133d6efbc8a0831d6a4052c3adddd8d9e05677283edc76be637317b0b7321e77eee53b4124bf5f8dcebd2bef63adc405fb080b456e7fbe875f4b7d68b38d74667726f4d9dfb479377b379218b3b1bea7820f7bd669b3260ceb5e3cd46f24df6a3a580bdf5a4a500e2b4fc6de2ecb5cefd3803786f969877fe1641db07fd4dfbf97af8ad23aec496ee45dee5a40621cefdd6ebe87f3d4ecbbfa617b9a9737f68f2f23575eeb7262ffb161ee831d494bf03ec43cf438f6fb8b376067f9e773cd0e7dc1ffa1c9a37a1c79eef4af0ed8e17fa4cd6841e7b51ef78f7eb4ee2b4fc0eac9de185dece704072807d086a9dab73c96e5a50c37df639f7ef1bec73ee0771eed754da7324edfb3a02ea77bfb5ef3131208602fc6b5e5041eaa44cb3cf384af067d01e207b9aebb5cccf1564996e69b4df1bb41cdc10d4d8c4a502e24acf1bf504325cf366fbee2d8ed1be7b90acd9beebdccf4d1ed6b1c1fe06ccb9db8668310dcefd474a9efea6cefdd9ec2d76e6fa164bc17a094040d087868aa2a1d856282239d6105a2bd41ac22b35bba1eb0538ac6c7559fde09a9b838302da4a742f4c09102c6428ec062d610d3cf050e942e214452a4a928425bd706869efdd8be2fbed6f18bd282310770365b716416b347a7af3bd39e79c739f823e7c404c413be3d11545a56605c5880907f5174fca68300d69a2f5248b84ce3a2154be942e6599014595206255bc707c00d496050534836f09d9ad1223d692de1dc152941765476c4e3e4e76a07493ac9fd01292a3a0ebc374cf7e56a0cd244b2c08d710e29c0b69291122e4b4f7de7b6fce39e73c0a6e45571113ee4b9824b9fdb0b286a4adc5c0d1d97c6057822544288713d192105c0929333e983d0149d29364a119d5105a5ad35a0369f4d6b48c641abdcb9738e0b55ee79cf370efbdf7de9c73ce79c8f7de7b6fce39e7dca7baaabca6950662d1e87918ef2d68035276436b48881548f8de7befddb2a10a2dacc95aefea48909613513682e5040b8a904c99d414908629208214a9c1b1760c8571ce39e77befbdf7da5757971c10166c57716a596d9f1b1d952e651946f140ab0deec84bae0227f2b92f817c9c952408e49c73cef7de7befbdd19868ac293d4c7707e6e3885a8f0cc6af0fd1a2ca5b3c1bc09e8645c587c92beb86d15d61e528e59c73cef9de7bef1df2b0e4210ff916e23ce421973952640a0c1e332a16157817f239afc1bdd6601a1ae1ad75f69380123dc89a951594002aedb5a570e5a3e2ed5b1545bef5fc6aeb5f6fafa4fe043b633969c15e9b2a29bfc7343c17983e825ce779a10db7e1de5e7b7739477b30b4b1b17e9336a6d699b4607757837ca7613e4872707df63a7b174c63ed0b9dce873a9d0f39f79dac02ded8c3ce411d2737c835a1a903433f5ec07f63ee2f59d37967eae3fd619aee3917fb7c7f6e2a20aeb4dc6350f71a6e760b3e6981e30f823fd0f7ab9f52f63ced73df99b8ef3e7b3045d907fda660873b74a120a460025d4a182f19a6c9df0280bc707f9f77dd3d9e20c24df7a08f406e40d67453e398debbfd3a1c234220737137bec0a41948800218f800097c909c4adc2d4c1300901c7f63d85f46ec6fbae7e325c3349adce0ae29da7435dd736fc972acd9266866acafcd20cbfdb528956028b6be5dad7a585981597cfb5aa27879e2c7d6d4787741b498cac79e97e13b7dbc5a157d8cc3bfb533d9da19ec7370f8b738069bbceb77bcf0739fafcdf69867b836d65f0fda1e32653062135c30484beee237b8ffeef7452e330003d9e2d44889c1c719ec1d2fc500de6bca580c68a003d95f006a502381205abc9640fb76a50a8e97a8e42a1d4f4286684a020003180000180c0806055112e42086e95a7914000750ac3254321c5a320a440251300c06034110c03008000010000000c3200c0862145bfda534b080e51c6f210c4adedd17572b6c393c77f971146fb6fddb9d2796a5f618ccb46893278edf536c322c7826f928758c6c1fb80bafc895b37d95cf05fb5894d744cc5429be83b77b635ea4be3c584d2e6e11b6c04ae7b5069936c71629140a05e692c464913e094136233c72b6ad02b1e5a7dc277510ccb2141ca9165e4c7165e216678951d3e27f1085de6b15bce084d33e616be40862e0a958d4a4248fb9410809af7520ff7dc74c02c4a5d848ce61fdf90d95d6a70e6937f83eda9c7ef17ec6dd33e89140a6c189832bd03b7843fbc8c23cf05e19e1901b118d8e30b1bdba04ee9c912b66bea05892c9a6fdc89f19c8ebd56a8bc5b5a4a3910c04ba138310d8369f1b51cf3812637205e24492b843af768d6dde6912c038706ff347538158fd225236667384d364ec3cca6a84809d00c4168050fbe6ac3979648d6e85db0025e062f4695b720614ba8513088cb32b2e3401b77ae74340b1b457685763057cc713ba73b4aad5f890795258d6b91cc7e921e644d679d38a1620aec9f7ed5bcfbc0a1c1e1a881d4378557d5bac7063bdab0888d6fb77055eeca8a27c22a62a5ef598a82118359041d1c78c0a808699f55197652e02d184d4fcec18c864e3fdff3e9ccef93092b6582502b2e235919f4a23d5cfc2ea22a1bb1f0a16368470f0c7c1a1d4305495e2fdd6c9b232b5881fa1ea238b96327e1d58a7b15fd8d0c02fe876804152cad0ea27abb2ec913b40767b92adc77930ea43755908fbd7c1ee757d9c4c0d9710f4577206050597d9a87382284f9c1375694399048d66ce1e0eea43f4488245f93120ee4c4936037c8be9eb8d10826f9b03c22f693bd819bca44eecb8ca2a6749aab42d498789b24f4a5573ed0b1e8d7e93cc8c6a3f1815a59e162ac40a1010112b80ddcb0ae66ce44549f2583ae69272c4f51db74ec9c3c75f7fdb31ab7a6d51d5505779be2473ca9db801ec2f45fd8c4843f1de8bf1054d93e7e453494443456052b40fa4034a2181c2db8acbc09ae80b070403beb0a98b1cb88efcfc2e420d18126a7179db1b6c8ac2326d5dab9549efbd3ffff1cfaf20bc6609ec2dd44daf0adea2004175f44232f8153407a4dd9d46c80cdd70f014f3bdf3c41671481e1800aec6cbaf1ed4035de151e9cf8e7b110c6b3eaaea2c0e26e9df03ae7f560c7b4fa75c535dad59fb427d0ec9c36bceeb1a420ca49353ce1553f37b995525b0e7c8b2ef59551cd9f8bc1038cc2875dd9d61e03d79e21783ea0cab181df05b2b7e6c109da41c57db9ab351e974620e3e9ac7d50a41597e16688bdcb06a208fd40e4617714508a14cf9162f72878d1017ae455dcead7ab20917cd809b896557f8475c3cb678d7f2c6f93135de698eddf22bbcb5178b21bcf348620d5f61d8336a6d6828669cebcbbe9f15f70b3e02a5ad70790b6cc659ae8295e54a257f931a7f2911bbcb1c4c20e840ae63940761484cc8b60e775cb80ff2c95146327a0acac1abfa3ce30a09e7436ec83f7817777e2b50994dc4892f14e0205796e6c6993c323278025967961ca3b6691d524aadb3d087fae21bcead841a5bf26eff3b42a6cbe00b969e625420b94c0ff137f80f30a1d361fb5f0bf751ec4edebf4d20ce59acf8a9387755730fd595212911017216aa455711646c22e80fe36dfa04846732f3aa113a9e2eb691fb06874dd0791e159979d0e894074dc69d688a6ee205a5920ac76ad497a03c2040a3aa68bd91cbc6570a5e9a6f13d39c44cd1e28c80fc9fecbc534b62fa6006a478614855bdd54a93c9faa0faca3687101ddaa7c06264686ca37254659667699eac7ddc09316ad4fe037123e83c935db628e09bcfd19c941989e566faceae5e234ce661e599b4c9c6ae01f59267d2cbb6e691d6deb5d0f98d886c526463b2a55990d842f19e529956901580bb487c5c1ac0562f2f77c8ad5957f68c90d12615d86d36dad7f95649cc1c590ce4769abd0406b33646505ca856478a09d7bb6aadcc86ffba385e5d9ab734f05e2a8f05ae633873c232ea2507f7f235f3e8842da3a26b2c51d05f73c2ef238e2c3f42de262e4c494e196215811a0e12862763c8d92283857cbdd9ac681abba0899b9e8079446ee6ec7b5af9c09977e3b10ec6ea4de8a8de1d873bf7c680ee1d20b66c6911a981f04d34cc117d8821d919f051467c3be54ed41248248eac688eecbadfd098f6696d6490a8608ed458683dd4e21bcd75848ea6ac525082157839cb43f1ec04c7d034d377be718b06c4425753a80f4026995165d5d098f7d0ad9abd47f1ea825ec3f6bf38a133e036f07251ad5db9ea31e33675eb4c87e6588ee1a2ca389fead5816a4902f1b7fbc0bc95c4a0190854adf91a65aa625fdb766440411707e7c4945402491db18af03c2e7454badf09edb2e84be4d7d5213946c9e7e286b4abbad905a608e46f192d273e59d8747a04c1bc3c0d4c755ea091ff91c2ec03194bd5cf6a6b7f17f7458131758b82d333925eea4cc96036ada306e58676fbec40037ac1adbf7fb3bcccd04a3d646fa29e5a22680d2c285c7262e545affe84a8d1707c5149f5c08871b7603ed086d88ace5b1ec49b71713a0c9602c74b9ffc16d9a643aa2b8804b19809041ce5d767b6bb6b6d753e731d785c272c9f6d986a9a4f444f5b22d31033e17001d7defb4b72779f89668ea886be5b855aa22e472fbc1db3f73537acd07e17381022a88df9a14f18ddc306b88c3732a2c02f3610073d8ea01aa0fd8d826f6da6a0fb23b76ecc4ee7a70bf969a8ce3bf129df3c6033e3c99602ce37c98540023485408ed1572672eb355c6257068852cf0a29d93ebb16d5db7b0b7f5c8a35e3cd07b18b49a450bb45cf1c371b39acc103e505f6eb886d11406d183efa034059a0a5f4b0621cb28c442f9c78cbfeacd1c9847add4da1cd73c1b5300bc6559534fcf124f9b6409082fe7bfad6a2eadd79b2d41fde05108243e85ab27b2759f84eb28442f6e0887b83e93c0c90023671eae06cbef598d9f25d5902a813c76b0f99da43bb6b05e5a8504c4bc7279a7023d4b20b10896d7e50b9d82f14b81ad4e265a42150a2ed9d276763b107799cd99d904d2d3bbcdb2eda756ed68cd35aadf116fe0c0fd20e55866a88a8e063610ce5f3ea60db0c67d3373c3805b37d445a68c844c0b62b5e84799b650edd70d1caa25b1af68416d26cbba1d3023d82ab862074cee321676aaccc2825b196c15f423c70547ec27f07d04e06b49991da0fac37712ac76edb1a381c8a14899c22b787f69383bea5ab79526b9a9afd550fbdccdaaeadb86e832011e1a1a42f7e341d9b559e99f9cd862339423e6895b0817205bbe38e977406f9e98cd101b4e7b24c70e3b433a8454abba0ac57a56ab861a3985abacb1fcfb9980c7e57db0f81f7bc78e2568d8913a3f4fdb899c3d81a5177e748cc47310f5088f8480ad256c2407357e6f62400a3a2db000c92b24ee1a017e690025004504d7fd2126dd12ae6f162fbaa0b9dcd7756aa863cc6d970341a2fb13716006e673f5c79a3e2b92c60e423a9f9845ff9329393bf241cad6a98b6388e8ee5ee0bdbcc4b4ccaa887b82ce41587b0c1e7573aaef27ef2120afee6da54225563ee1a455c7746cebe4b8761e063a4a2a5064d87c686617d43a9387481e4319b414e3305b7a7ed891df191e960449b691cd2f136f1bbd1f6d81dd2e4738100ae0d2d20ea63a529ec6a9175a74d43b90d5acc2c3cad73858cf2a7335cfa1e0a2df20a82f199a2d41de5c613e529c1336c81bce95de5663b2a697e99032186f61955c820c4cd76a85029b2f4d7a3f8c0e5019536dc967eebc13ba8288e7d3062367cb0da1b1169bbaee80cadcc21c7c69b888cc210e7c62a9111ac1a13a72f541e5ac30b6f6327ae29b84384e9a959cf641518e62fdc9d51c160e320ce843014ac91787d2ca9e7bc4c03fb24dff5ff597cc915fb496f66b9acbdb5677ee312b6e98f408f000d8c0c042a42c8eb4d33a89852f482f2885880ca85a8e02c33088d6184d48a8f01c9b781f094ce8bad8a3a534a1abf696efffcf5698c37a7370c9bd4de216be70120d56987d6cb126ff25589fc334dfedd2fc550b9d8a712ccdfc18d29aec7954fce7dfafea5c20d283a5062b11cef388860e0f186658ecf14feabab44029b6bd6f0c47e075d53382c47a4b5f2c8a17481a2e917a261054dc6fb557569b68af35143fdba13f3f3ec49a6c5594bbff568cad844396c1e09413e77bac68b92d4d82f3c929c385d0f42825401f667c452d8e942931b368d28b7ecf3f530ec7baf66d1a6b6417aa5edf1500cbd0a997ac961942d467051df975650a2697bcddda2eb883e0cad1c70eda5b7dc209b28118df3a19b8131d2b509a926543bef4194b41e216f3451a25b9cf5b2dc330ecdb7a425a8a5fa143d7f421140df7fb8b0e895456b950cc9915fe9ab39e5efdca9fbedd77180203f4f65d15c704847443a8d19ee6543d59504af6b049a81f5ca643d45054f9744d8a0ac54186d37927e391309105816d1dc0eb79c5a8700d80aabb91b303e1e8320d59dbda662e9e9ccd793c929a3fe6e06ed3bb4755af1ab3f9438b3b07594e431734e2199be19447b406254e5ad2eedf41712ab18b2fe90eb83d0dec0028cc97d27632192ba16f377b6bea07f47c48535c714b4ce58ff290987058c37220187a0d099f180740079e3aec72778498a7c70693a1c29344343d0fe9198e2e71fcc489a10d8ce2d85861dc1135f2781f18f239bb06fafba6ad7a2e82215c2fda24fc9b9b40c8178822f2fe28fd266f82db0ae0d0f944b8395f9f290d920c50d91f1a3fb37ee90d01de621be0c2ceea80736aa417cf8f17b45f2c5dbe22f8073985d82a84c563f9691e70aab90ecf03175e6c0eefecfe0ce1062cca349eb7a4e2efc73ee78607c01fd38643bf039864fc4e485d3a84ccea59fb2a157859c619fe579289cb810114e0db09f556b7a193df543ea35b6a69b629c5533785e8b788920869ff59cf9491c98c19a198c73f5dd9e5cc1203e1acc132cf8c5b9b3754ee13bdda1f9a1d881af81128947ce0bf100fc999271448f484972de3291d95a27efa64b4ed93e350b5dc327e32aceaa12ba218c0a622311b9164abb161db713c63d7905c2b29be5bfd15cb874aa6cc9f35dfa9e3c5ff1dc5dff6776eb5f047af1730b572f6eaa631a817ee0e132dea5d904e3ef305296b4c75ab7912facea2987c3616e89ef3f12d1e0bba06468ec30a9a954d3fc3ed2b92bcf9e87f810a016afdae1ae273804cd9ce232768c21ac78bceb1aa12a64a73e523742dbf001457f123f84c53b36477e1ec680b441917b450728d2436d497a39515b7dcc055aa274b9f17e823cc1c0ace007f053b8720fa4f55793fe0187bef9418f50b837427cec5d22730f35a85fa5e7e0f432e97b8a3ea5835de7c56a250ced9f9c069b3439ff982debc7cb65276aa73dc1bb52d3c7b290f6807e1a51e3a2ef7cad369f59bfb7efa78db0002bf721fe8dde8e6a9d670218084fc8b68221af4314c44be9dd1170aaddf4913398e19f64a660b03664c3a00fcb266bb911ff8cb4617a20014f575fcfe980264747f91e4c399edc813f341c3964737f64c56feae628e313771302abf64278c71d028357c6761f34db48ac142887b052832786cfa43f050c59efab226f8e7c77d59ec380bd66d54dcc49d2d8e12eebb124f93903a80c2ab6edae1706c69eccd30f100b582b5c13a51ce1d572b04f0fa108f1d0f1cf00b9d5906a881621a6988cf083fdb282db6c1811e16b3c5d33abc8609f032f2defe46cc77e6a5d03e6fc4a3f0ba8b85323eacd6499b1b2c1dc2340d2ab447eb52a06b4d6799938b18194b4849b9745193e4fbbd31b520ef800483c02a8f28da2021a5f3d5410ce2a536a1a8942b067b8fd5fa92aaa0fe61f9f4ef0f2d452acbe11988858c85db9c53aed7b3db0c72a58db5263822ce03e5c104dc0d503e7742cfb86dbb57c330d5f5c5bc6f54f494cde8ebde1da2f83d8f544731819f39d5605ef3c4bdd6060710674966209c80292f96e4aafcd144c502ac35045f182aa3584400b679ecd35b2f37eee63337c4ca1a20e4741703fcc8664c521dc1197dfe37c6b274d0a5c742ad06c66f30e0c4b380c35176159a74aa29af31f903978ff8267615e9c0fad0bad802228fee39ac90ee4eae1b8e435d5f01d16e76b30b82e61b51b7b8e916984829ee0eae4466eb379a0891039af2d6ad1377e71e33d5df70fe3990811971ffd2897657e4d7121e1199adcd3e897136b7b9216a38e6644a4afd7ae28c2cc42d7a0af16a80bd429b073b88761b42530e35ba3986e729046698479bcb1540478df1ac18c8cb94d0e823f9df6d76dbd3f1bd67954183fca700d01e7c3cc1067c4eadce9435fd004405ca8a632612e192979ec2f9c861c1f5b0eb59a7ec5be69a4a28664164210a0bbb79de0fb4170a6977f9f300809c84678e45b22c464da10b83dc9d8381e4a7b838080d37c5442eb5bc3a7546b6394914994ea892ff129c293f8af12ef6a9752c3b1680612814968274c1a317170cd1784cfbaca66e730d6d51937b2cb6d4b332e09e855df4746860438e46ae438489338b49d2216ab54fdaa12f53ae6680b225a1e8e0b8a093cdf5a8706ee26dc18ae80c7d07039517d84ae285937fc77776ed13b674ccf034bf9e8787e27f57cda6734b79da2751dfc2a35c8e804f68b53fc218d54c32b9a7c854f47468c8c259fe4ffe9df0ce0a5a4e0c7bc4870686a9111f792fc72a319d710ff098d0922be84caa32249959efdbba3bb91d855d5e30b59abeb639659459c3b74dcefe4f65e92664a13da5f408798dada038a0da855b0fb8aa80586d7d63aa1af4f46f41fafa492660af8d8f9831ccd3a6000b656987fa5b9a8d49ec231a01c3401d57e920d3b25efaa13cd33dcaf2f50c5fa04375d79b44cc8c242628696f8a24f5a16b170fce0598da348002a75064994e6f62b17f58f1c6f45698b0bb8d11f69b21dcd789cf97c2bc5d869385462429d9d8148457489e128bbde18061807e284db2595f1cf93b1894f4b6001aa44a1bfeaad42a8b512d941f05f6a1532a66ffc97c1202653daa099dbfe60a5a5c97fb3a4518940328e752958c9aa3f3dc604e481ba90afe856db9c2066823e00f52ca6845a9c69589b819276c475d115d5fa17ae65027aca59bfbe372c29a016282c01bb0537b3b39a27646d83db57fe79c2725aa73284f762ab9670ce170222eb8bc82f17097616173611325448a7cf5cc312ce1187f45dfafe1dd40608b4e3e4b166611c0774768e52b42b7e6bbb10caffb4b1ef91bcafcfef02ae93109f9899fbf18f594594ba9c33b6ca80da1d192f223854e6844e35497d87b60e5164460a1e6326fa06a48be56c609a19fc28783163e0e7b377db80f4e25c38636d5db758d203f92a8b4c07db1887221a72b49aa64b820a01410a318021988ea081c0f4c7402640680288a411801b58ec04cabfa288fb2452c9d1108840a2214054003521d83229a62583e41188040251010a4e4460aa21316a35b0c2ba02540645041cb283020d6120d7b48d66048c575d0a00ce141e80c2ee9d8c9b46170ac220568123644a4ae910101c30b271a8ce65286b0294b3900919a5d86040c2b7c4ca53a82c414b33ea284a62683a1463338164380030c4ce9e344ac036a1c5468b90c49099470201d518a66471085c2127a9098a0466730083460d16320ac29becd205fe36a1bdd0774c25096e44354ea12d3d1908608051e3a0e4d385b20e74a03515dc4690feb234a686a32184e784475e0a2a7491cb1eda2aae57a82d0714c1282148885024208ece0aa8590d0bd9ebcd20bd969168ee2082e3a048e35c5377c14313a093ced6e3014a330023a80ea0918e934a318cd685cc320a80da4043419928014c9194af844654003573d01c55aaa215fd92865314ca51532a74206e35216c49fd202582c926038e111d5812bf1e4ba0815b3c97d60c9d51a099f5973ac714017e159c4c068f1322c63173b307a4eb00f52f1e76c582840410df33e13c8ed3e9c1e29157f5e40b41e65ab7109ed0cafaff71715d4424ca3d80da6d7d86d88c3283dac3740e1b329158ac0fbaec081d293ea7aba6962054c5a24ab32386e2ceacee8e4d194f3a1533e4d17db083dc137b7fc902553f4259f4e6bcaa40d7ba5c5f9b156a9ca4c7df43338c02e02dc97abc67d6cea9ec53bf27a66e0dc3ba0c20dc7096b1fb353918ec7880d87b312cc31f17885f3c67d9b18482798a109cf164e0ee074b217801eaf5a6f0574956505bca02a066995c3edd227318bb55f6b5ecc3b65ac5df1d91e8e3d9b7de6ac3e3bedc99b5621225c1719da023ea26741f6d16c6ed8e25c0160990185f14d739157415f4d3057f5291d6d27d7092ecd73a9e055505867c764e1dccfb598f67f77c6e5e1b07fd72b8c0afad799713838003d9505dcfdd6f3d798a481fba952a7a1579565083240cd6cfe9997eb1e0c7be113651703ad2b43df2a1cd69c748b80de8c65eda2e5008aa89b928df27a4bef0dea548ecc03dfbf16d02177419e6086319ecaf6fde9762ac3e1a3a7f877a7d13c39f69c734dc8d7f1c85a7530522e69a97a1cbea3cd6c61a2edd1eefb519f11decf0cef7e60c61192bb7da58d84f57258a3e02136e5aadee72c666660243b93a5b859853de73113b0600bea081f0b2b595add9b76752ffd55fbfb7cd2e29e00ab89b7ca055883760c9901007aa6bca2152b0cbe3f8f4cdb0164e819a36d820ccc3e114984b9e63f349c82ff1bfcd357f07bb3564a0b376c91e8e52f80f55371512c88a48b3cc5457a496978c78966e0140552f30121a6cea18fcc60b203d46daa5bc00aba065a4c576df1198e423fd559b97c19ebd2ecceae17a988be89c647425e47de6590208b6838be4139d63249f0e1000ab016e74d41089caeb185046caa6a97751c80c2ac5778c928e409c258643b31c607a22c59f08a453d0f733cea6582e040c6433038d296344d06ad716f65dd16cddda5bcdd8851a70fa5edb95a2261c536e266ebaac243ad9ddabf130f80f9d53cdb90b51a846204850866449bf472109c515f0fcca1415d90989bc8c306fce51b74804f7293c89039da96bd550200cb4105e007e2b610a3897f0da786d3b49b7786bbcfa6214db73970dfbf57f74b540207a051075ddbe96924d0580505b7b3c9f4ace69af22acb1246ead53231d5ad82adc0543ccd7790ddb12b17a342fc94e7bf5ca5031e4dc64cb6d29eb7e4c2e080fcb17d823cf3b52eced9540e0ea31f5d8d94264f81d9802454c7da343400c787619a1481d293e2af363fac3a2cfa5369553b75a6e7265df2a18de8bf870db12fb8cc3808d47bafba3cdcc4b61e4c32469d9a1f11c135669d488b12573ea6d849d3190232cac3c6566276ea1a58ca2b573bba376b57bfb7cb1ef934409b3dc655140bc3f39315e0e2357cb329918e293ed745052ec6c376cf879ee7ae7e8bfe7c728cfedc408dde3ae7e7981e0ba5d6892de387245b061ff4c2b88a0bd6732640b22dbe548b3c8cec580fb65daa060e43fef6190d762b1867633e74de7c8cd2bf774c3f55a343f6aed4a24108cc5e72a6285603cdfc961d8b00640e0afbb704d4a12f753ecc10239b8684f81ec02a54a5f1ef1ac3862997bbca96e20182f92ce38127db5ac07ee01b199760d76d073462b67eece5596c5d288781634db17d54296b77a241845eda1063985ee5ceb33ed68eabf5c6a8dfdcf8e58948753fc2723d87ada1d9828eb289ffe639c4f2d808d98a487fddcb2a71f310b904ff1826772380e2f6ca4444fce0e682563f7d9b15620384b62058fc9f1fbb1a583e22b78418415021948ea062f9e19b01e259a00b8871c1adc13e0470e6c33e0c6c3ff30fb061dc87b0a570d789bb62fd005d36e2bc0840479f3bdbc5c72771a08873840e080e104e04c4103421cc42e882e0406e0e11e17e044e0902d2040bc1e2fb8c6c8a888d2330281f99b8a0f28fea2610d389508bfbbc1d02e289b05020164eb94941303eb83b2b1e1fd37921de02a456aa4f387493cfee8e45f5c36bd81a0154f3715a0d4017e73a4e651c3efb3a8cc30f3f6e2de3c771c788b6101e8428088a21101561c5e2735dbb38ff21897e9461a146e06284d0fef37648215e08e8812be67bcd59e2c4b0492e671df1361142d90fcc153662e5df0723a796f233762ac438c252805838ea00ed23fb607518d28fdcb9a3d40fd7cad2509f42f025566900f8c7c2e251dce9285f3e3772db527f44ae56100b1e7378e75b3e6277cae526b7116a038e486afe6c8d5ae807068ffb92f8e2ec9621461114205041e0020850ea1db7fac7cfdb19806009f10921e28816954fe2781e2104391f60dc5ae6580d136cfadd16118e20428009482ebd512d6d01b002d5085867d600f4d0c81192c40ee3e1230c17d4fb415d41406a01ee80ca04f8a43659440ec40688664156c46f9921bc103f02096fd6ea1b4448d23a4c28f768cd10d28144a7054d6c57876001fa58b68788512330521fae668dd844781ba237be8fa8966ac49fe24f9d0ea8f7933600015d64eef84007fa20b77910f920b611c78e888aff63221754fd19395d2158883e7dba2b3c1fc485469c23501fb156ffb957bb483f2f878c78444086a04598227441708790138111f9a1694c210a419882d045f8fc6f521550b5aa8d20002575e7e11310d15c1666c78103e4b49c994652e2a979c4dd2544639a6ff44d4b7d45a5d2ef30fa1fbe9ca18e8fe9d62322aecb677134051de5f5eee77955b17d3f66053cdfd25c6ee1edb8a3a9b5fcdcd851ae7ec4b4ae11558c3f46832fc4055c5651f30ee28e407c5bc4e6de67d464055da8a83bbc7bfd8c69b08ae85c6c5cbcca5597e46c0cea0e116347607c1f914d8d188fa040782ac273e5a73a2c0d97579aa76064947286e123b690881310fa208c0b6185f319dc1440c417719c91cfe1e403c1c2fa19c57d11f345047e43d056c3f871b00a3216cb6eef3169ad280ee546300223ff69d6557efe743463c4b42200f53ea26e8dd831286819dcbbb1be1ff4168a38036db7a342b058f512638199be7b74ff4c1dd08194bab43a1fb4e8dff1caef582a979771bda111a078131bf1720764bb928449873859de918c9010e728d220d2581c3fff3ae11c3e78b4b7c081eef2850ffbf97fac5b3350923e333465a1b4b61a53e24cd3ae4fe1676d12885d08e8425cb89fa15300115e04c6e873a2a937a28acb676d3401bae8ee8cb8ae7c7a471611189b0fbfee14c68f43f658bf4c9c02eace5d5e605092596d0e55282749237368292435899857b8ee5a1774ef7a88eea7c3b74600de34544e02b615bdfd426c38f850db3563a822ed32b121010800100200880c57d95c6061740fb32de730f68d6d8490ec78dcde6ce9afedeeee2da5943249290303061806a3053a2c396cacb866987e00d150f971842d6d6badb53afc30c2c49931d24959c18832031a27e48cef488e08c810313c2065093a1836702820c1d6430dda8f0d990d68d046d4907f10420cfc0313365c52c60c4b9ae00627593ba48b06320827883c62df3d83c82254c04155c21c62524a29a594524a29a594524a29a594524a29a594524a29a594bed3ea8918d835acb07a7251290178c8d0efba75b7ab6fc686afc71823eff02df1899f928f874fc8477e27f8ae8f1f6c8f167c3323f860f089af828f870f323c0a1d2dbca3099c6c47131ada87066badb5d6ba8f0e8e0f0e327c6ec4f061c5b0d6da19d527537e3e49dcf4589f2446c06edd7508212373ab03890c9d82ef0606ceb9e30c76f4f935010c9fda77e48053dd6774be195fd00e24761125f01a9a1736a0b7fdf9d54c77ede7cb78cd66c1b9dd8237b8cfc01b38a615dc77a03e80feed7219981f8669450fd6c66e3aad7bf745b062cb32d29e1978837bcd850e7e7bd3b82bda1a68674ce7edaa7fab73d26a3daded0d1c5518976d597418cfce7af957a83afce68a0cd4b683ddde40cd755757ebe1e7c04f7c07b76d435b4fa2fc74e710657f59c547827c8c404f66d4e93e67d83c6e78e4f0de713e3c78e0d1021e3ee41d6c3336a816cf392d0f1e4074d643c583c9e691648b9a478cd37a8cee6ead7603c618e7cc62c1366559a6693d603d48cf078edff488897cece063679bea494ca13faf7b06f100428f1e497cc04024127d9f0f1d1cd827ac6da60694ee68c26b42838f8e0f0e377c5839e7acb50fe9c363e3344dd336ce07890face32818e493848c6d4688af42b80e24964e30083a7a7083714ecea3c626d89183e661471a8960c78e2d826f06e918da0183fd8d483b5aa0378dcbb22cd3b61dad1d403517d9665e17cfc860c91861065bfcfe07c7163f093ab6f8fd0d3e5bfc8f063d68f89989e1ab7b06e90012a483bcf9b9ed3f0a1dad2dbe8cd5a1df4c992d9bfac06aa18ec835d0e047d3a01523081ae41801ea860ed271021d34580c03aa359308a1244315c653350f1f0ed34f6dc91cd9f3eb6aa86acae4bb31cdd859abd6d0713c32028d448c422325a98ec681c441fee824df9089c9cd9e65c64fc40309a0c25c60a3ba517ae33abbbefb687176fd7b534fd507478bf4c191b3c69191da8683721bc7711cd7f9d0aeef792972173ab127275ee989462dcf4ab43b3adf77a26379767d14bb4ad9d9f5473a244b2279a5249ac144eb6acd14f9445ba68c5a1668d7275958c9ba6cab9eeaa6a9aeaa4ddb6beff54aef46e2485b49bc37bbbe8acac455d12ad9f557ec108b6561f14a594a5c695371d0db1556915425d45471ecfa2bac7af2ce86eedbc2e3725d5cbc5297706585524a291575c6b6ae6ea633b66e5b5ab8baaaabb22ccb126f6539549665595eac5f5eb4d65a6b527fae9138d365395496655992648b244992d4d9d699604296655996d55a6142bb8e592b87cab2d4ca3223c9164992e4e53ad1490a0896a4a6699aa64d407f1da7392f874aaef4b22cc916c9914e9224b8c56242b1582c163b4119954c2c2794a40c11bb8e76925d99c864ba2ccbb2245b244992d88e761c473bc66242b1582c1663b170b0582c166ba6c867627139f16185551a928c8c8c8ccc5d4d20368ee3389223499224299ecaf005bb458fd515f75a7f9fc9f4a70df37afa3799aa9fbca8bfec96a59ddcd57757a2bbf2eeaabb5a2c1b2acbb22c77fd9bf958dfb64496f42cd959d22da9e94adad1eabcc88923171402c8b414ea621ed362594c638e4557ac4ab3e160b1582cbab9ca6faa168a1c178aa3910e451717142804b0c50b135dd5ed1b5e948d4fc42a183e31e989cc6b69b12dfd6e7fb40233b639a7bdf5e9aea1188215501c9c841c3966e020a30efde02689010655a288ba838b7590a3068d9c334e8e1c44a801e3fc32790924288500c4832708425490041a2740410406126a608c31c638e79c73d6379e73ce39638c31c64572ce39e78c31c618bf4ca6535d33dca082040ccf39e79c31c618e321434962b8c1becc2d02262307216ae0d50d75e80737490c421928868b9d9f1d372091c4119650c11221328e22352a12395e2003074bd250a48922465004960225396e721851430149fcf030d2c40e866c348103a68d86cb0c5c280d38b66d83d9b88e821c8a099e5c3b307f72e99840a5992e1f7fbd5d091bea864a5b2591186618997010c92182830d2232204203223f1011824811448240a489222f8ae4145915c951c44891218a04a18812233318194f60e405358cf8300264248991252e18ae172b38c86aa0af5de810416389ca488c192f5020f399fe4fee7e6388903de415832140438c18a2840c93214a7a68ddf0b448d0caa11583adf70c6aede03537307e450ff97bd02f7efe26aff19aecb9af9b03572b2aa8e1150ada5d416e73e00dddc01eea6fd6cbe14c008e5eb1bda69d76f7660ec31b5bb842a51dae60b6393083373478630b41faaee1396988f3ce608a7ad2a0ef2ddbb2a9334f84613bde1c98c2612ae87bdb26573d11860adadf389dc2e5a00b30a8baa93d176893ddc2816dc38d71d89cb53176ebd6baf5b7486cedc1c1aa3c39e79c73ce39e77c3136408a7216cc6c9679a599f6b005c529a4bb94cd348db360a6eda4408ee32cd879222b1279a5226eeb3c8fb3a048c459f0fb5cdbff44b47d275d0ac53fc57f84c259701b75a951c5b1dd569eedbfa9742913673b1bba57eaca8a75bab2daf6950cd59baa1a1a2a5d2d2058ab45d21dca43575487ea0c9553482805ed6c3028ce560a14bb14c54ff70da70673a6691bd7695de795761db7759e27f2b84f139da0a0a4a070232d85542aa99438d38ab6b2e295aeac702a2b2c2c2d2c9ccb8bf6f2e295bebc702d9dcdcb8913269ce01ed440d02b05350a1450482105ce822a9cece9e4959e42ee3b1bba2d784297a29bbe055174a9133814ba14dd296c29a4e095a6a03d14b4d7d262e350d4c0c65f61db8622fdf9f3677a9039c28f2131a0f407ba1520e713bfcfdd5e8ca9cf89f1b4a0a5bf438f0c4a7b060dd94119697c9e3c3f9d48364d8d619efc457f3169aa8ac5a467689544a8e2388c6aaab8b0977d6ddc3146daf8af8db1de184ef5497365cc93ffcd6e2c86499365649c5a71bc266bfd7d9e2b8e67161c19f4fdc53c5177318f397bb7d361908bc9103b9d8c5369ba1adc69e8939834f7c819e38f62c1777222128944227d635e73225461fc89d0425f12d3d09fb67863db4599dcfef564c6c8278ac6edd6078f9c2af23bed6a08d59a593b7fce5d673b931f3225f984aaa88ddbb5318796055698ab40b1026dfa62a36e3efa9835559cd8b3a28c5f4e4e6b25848916ccbc2048880c2139ec6fcf202134a0725039a81c540e2a079583ca41e5a07250393efa5896744557e284c1726a388471bc24c902050305a32c491205e3a33fb5c6396c28140a8542a15028140a8542a15028140a8542a15028140a8542a15028140a45abee521387adfe56419bafb3fe001f8d5c5cbe8f8515d958166e64906113b1b0298e43cdf089a3ae004b3efb9676365a573ba7cebcfba2b96767d322dbf6e9b649668430e75b141273522ecf98faa82472fdd966ada9991383387a05c67605be3774413491f0d1f69c31415841f2e2024a29a52ee7619b51a2a6c6be9def9d03e88b3d7fdb2a473b162df86f70f40a8da357e49fa008430b55b5427f06c248b142ec80ddf75b5ad0d5bea187220c798516f1b7b4d0360e5d10ed1bded02bb86acf1716c836f383397f85ea417a583083a82075daba679b01c24c122df531407f7e0d0bb0e46b69417f3e0d5d6c1794ae48b15147dceb430b4690901ccfe19e414192d85ece16bf2782e343bc70199aefbd3c82b000df7b83a860df7b2d1282a4e05104d9d9e2cb78d09529c257035984205f12f29e414162f831e1c48b4b0bcb8a49a5441a612652504e8610791db76999cef85a6722a815abd347123e96fccc70776b7f7ab8149fce7b7939f8e9c10f114e7e94a0e011a478383f4a401aed19f4438752ca9e413f72a8fc70997e00adfc3862341a91483f94b470382e9ececbb7026aa2a67aa22090232f2f2f2f274e0019222ced1904a43c810403050a0a50e801050e45c702050a145d0a4401858e85b30089fda860e228f883113f080100a43d837e6022009c0c0170348834418c69cf2072001c054d04e02819a4420a28a0382104df84132f27efc4c636e30324413e5c7b06f970edba436d18e28591b6dffb48a2860a3e96d848e167c60c28f4f8b1b1a78f8d135e34c21ce4803d98f13f448861c28f929c132380f18243c3a504325a74089fb25fdfc5b62df7f1e35003374c693ba5edaa846dd649694c47102e202c2296d82ca6d46d0c0794525adda5c4555a6bedc5234ece39eb0c881e20569aa66ddbf5e98080654a6ca819747385d2206e805842291064103ad38dd89eca706d6ecfa0170f9bfea75746a617ec159b73fa9cb3c9fcd9912638a23e5be444fd52027c11a1de1936940c52d39d7ba9b66883601244925d8300c2c551c2b5f75a120b94a0413241021ae38a9bd9b0afcfe00832eeb5f4de7b6748d93308082482d8410ceeb43a8da17850c85c2f02c5c3ba976544a7da558573a333aa706eae8aded6252febfa5c1c9755b77147876735eee88cae162671e97fefc517bf654d1cf0604f6d87ad7fd22582ec9927761b3aecf974ce6761aad8beda1bc35728df52dfd8c5e38e0ee6c12b3ce21dac83c769375cae7a7870b0563d3c2b8ee3388ee3380e8649ddc240bb7e8661d8855bf55431996f54b8c44af010d65d8ab4eae1c1c15af5f0acb8ce6edb76b7ede9deaed62b8d07c7aebfb17a78eaa9669d0d27c4c53818878403e260d3daf9b3b3d66e769b5a86715968d7ef72cccb48767d11503dd5dcc3a37168d6aa87a78ad98dcada4d97ddcdaeefa9445a891ed2658ab4b3df66ad19d0aeef19cc3357d6aaa79a71d90bcd5c69a479767dd2aa9eea0b768bda38456d47d399a136d246871963548b69312da6c5b49816d3dccd48d3d6466d1cb5916a2bb565c225bd1999915ea3573a23c38cccc88d8e3be5aaec2959a54f0983c160301865e1e64ad62b5fad7499bfcf64fa3f9d36c597d377d39e29a57aa557abbc72b0a5246d9d61fa73cf59b359aff4ca6b38d8f7994cff27c779e52baaf1c525fe4c342335a5d46d86c160305849b775d06593a805e7a4a4ad514aaf56c1b4100683c168e9d9ad86dd622e5f4d3ba69be36b379d3f585ec5b88d357110db411be91219595ba50dd18fd875730ad2bd817303e9b634d45d8ab4dd5aafe39c628d8371300ee671b08e83711c2c14ebeab4450eb6eb6bda37967b5a879a481b6dce3abfd7e5e772a865e4aeef98fbe9359a0e453a6efab9d365be98d3b4de361c6e780bc5f005bab3909bb9c1276e2cf78d455ffcd3a97e5e798d7b5e795eb90dc5555df5b0caea5356b2c4a4d3a74ab4ea1bc9ba43ba34ec4362c2231ebd868eab18ed89b1623ef493d0e567523d8eca6b6434f9b94cb057954a9947da9d0a042adce4ebd1f1021f1e6496c4c007d68e0fc827c3e7f2711171fd4cd88a96951c458fb5b4206dcbdaa26579e004bed63df103266c5aa6ad2782e04f3e91d75d4f0c01883d510461f644184e083714f45d506a5d2eb4a5b2f88a3589a395a74f575305cbd3a7e554d13255b83c7d1fa78a97a7efb1a9e2c4a79d709d27caf40e5b7bf15b62fb9f003d7602b4ff028ebe255cb6174f5adbff05b4ef02924e5a2ddc8b2836b6bf0b68bf052cd960e95e443962fbdb57413962c5fb15d0f42c293e6cd1af6c2b950b9b3a6b0f56da26908519435f05a4ab1943bf04d272c6d02781959c31f447a08f338674f2e27da1c1668ca3bc4835d58cd95629795ba5581f4e4051b3c1f6ff40d1fa204e1b8854874d8bb0e973a05883780de7c1a6355fd8b612c1a60abdadf4dcdbea8e5ce826c455d5f7b192be9ab1925ab0b4e79d7886d379b0e97b6cc650d065832dbb822c7b659b36a8b2fdb7195355d90a4ad554715fefdbfda5e177e0e680cd8974fbbfecfbf9c5fbc263cd18d75430d216a950397ce268049b2ababf2ce545d9d98b2c25cb6ac638698542c127b29056db84157d3a52913607cebd8934965264d1e105bac591a8a944eb03e99ab0513bba786c3b6d897965715f716bf2abb20bd0c4672b6baa28ed19e6abda9345dad3b2306c9b759b5f6d37e79c3d32295658000b1138024484658d3e4e5b4a69ad2fb032295658000bad2340b1d1c7696bed05ecbd14b0806b92296460f8266963c6169f021798800578d09cf8a5586101280460809f47b68fa38fd3d9681ac5a0922ea69156838955ba04f4375a9dda149b7a283369f5eaf6decbd98b33a775d659b669dbc775369ee7719d27b239392975a91415539722712ba593ce064c49e96c461cc9be9748a592575a022f754fc4c0f6b0c2406be7f42dd49ab57ebdb351d939772cb496e59cb396b3cd39e79ce96c69aef88a197080f591668852b9ebd499a55345fe9fbfdd17178664674bee0bcde5e0cbce40af74798da7c461aa08c7e5955ee9959ea2c3925dbdd2616acaaadcf54bad5a222b0d2e25a925a15a22a296806a28968e88294cca4a73872a8d5552691c5fac021d2703b52315a6869aab9e5cda917aaab01953df2b5dbb8a17567a439e128f49a5116153c52cf18f12b9eb152d8f3ddffae8d8e2d4818f41767d711b29f8b2b5d16b3cd22347cff3488c5ff4488c52842c88476a234a99427ae4ae5fd2298d95c653c81432854c2153c81472d74f4969a5b82a0dd6da71664c697b5822636cf6fdeffd497f529feeb9b0bb0b85c347dd450f88ed7fef4fd1aa86eddad40601daa5a81ea53326256a79407efcf9bb5dea041504767da24dd946bed18e8ffea419add9d49a57ff862d2deed74f5d0ed4d0c5b63bb64d3443f1b2b6773678fbec8aeaf1d974b4fb5a3bd0dd3b6baded7ebb1c07de7befed30c618e30e25e4d33e67634c936525f3aa84d1d584a1847cf8ebd67df6a92e6c69b1b9edb3ecf5cef4bbd82d58bb7ef6b3e3c216eebb6fc9dec5ee420d70a1cdcbdec22cb6eb67a1cdcbd6a15be768268444abbda3d7a83cbd3126cdcfd8f4ef2aa494524d7b96c354b29eea1d324f357355ff3be709e3ed8a19b8acad5bf059ab5202a7c3b0c82131e6e9541f0224510e260c7e51875fd4b160e14686d2cb401a7fbbb4ba9d24d24fffadaa98dec58a52e955de5f45e54d6108565ee54360fad2bb58b10292c6e930a31fdf7d52e8026d42c2992a7cd24f791d367d9413b07b1192a922e6352a5fa7733f27cd09f354df83ed3a0245d28e091b3f0a78128aa418dbb72814453910891a4c048a2450fc006c67e0b22e6b67bfab0993bfc698a7fcf54fc8337f16e6174f779c30f94be09cf9bdb3c9f935688bf8fc7338fdb220b146751b82fa81fba08cf9ed779a9fec7a7bf6fcbb9a35decfbf33e61d670d8700fae10b1bf8c42b634f2fbcb12e7cc105dac47dfa6adb7eb3997e8e9ba1e3cc18872180e8316ad0a733741c9ca922ef793f832ffb4e98fa5a3f7e511bedffb63576f548d17822546b2a508589514a2b15459508165134eefaa251a45369ee57fb6185b90a65ccaaf6817af9ebe5f5f5f2577dbdfcf5aaaf97bf5eaffa7af9ebf57ad5d7cb5fafd7eb555f2f7fbd5eafd7ab7ab5b9d386362fbb865906db44218a2e0e0bea081969844fd476c43b8a99e79a2afcedb3c46e287a406cfb62b6ad879e6bc6d847e1f05551dbd9f647d16a0754a63aa56e4f27bf2d6461aada68dbb56cdbd005dac46699bb8c8cdb2e95efbcf7de5b5bdc705451407c2247b78b3d3b16b5b6b861fdfa75c6cc98945a6d973ac95edf4e6ba14e7d210de98cc15d4ad4929abb863aabdd02b4adab2d64ece9ae852c4c9122ebeca45d03e6b6a14cad1d04b2d712c8c2e9305d2a4f6badb5f61d603590d2b6fd94469b503d633a51aa050dc3ac4b6d5bcb58d353f3eed7fc370c69930d8375816b27836d5afd89c41b636fd7135d7caa85e55e86ed35ee5be8c2f92d6ca176c73d3f85b7fd940dc6174ccd5d27addaddb7b6d6da7dc17befdd1ac418639cbb14de3ae79c73ce5b5b9665c5626519a27c641d03463bffa63dc6617e1d6e22ba758b2cbcaac94203362f3bff0bce21aea063d0a6c9b6e1c59931f3e2e0bd31a959ad157cd92c78cdd55aa57aeace80df1eea13196bc6544da5f21ab6494d5a7baa3f53fb77dbece735a62cfbcc05185431d0262bb4dfb0573a2dc679128066a0fbcd363b0f4f27ea2d2de8cf0f011d6a87d9b54be56d5bd8af019b48a8e48d3706a9648846000020082317400020180e8984c228c891288b9af714000b5c76406256381ac9a4a16828085210475114638831c600600c300621438405024012b7410cabb72e38b2967b34fcf3751904975d9a7f39225a9ca1c42f682a38d361d92d1a7404c01d79825a3f0a265234eb8ee01ee7bd48e1504e7ae50d3ad591f01ff36d18464fad336be52af1880e41ee380ce8efafc0c8081d128dd4dca008334cbf50c6e420d42ffb6315067d9975ff9232c72bc5ee42179b710f8ffb7a6b8b47ec147570d7383d82a25a2f4995d6e399e4b0cfcfe08004f40004d54f9e6e8e4004aecdb71f215674b9e140555e926ff57576a461bdf19958878c7212bfd7f82792cd896a5018a0ed323ac1c66dd3d3d5ee633010e9dfb63957e1ff21cecb5103e0c932da076368788bfa4433ec824134bdf5368d7b7f9d8b4960743642637d358d7d9768720c0179800fb9d44597e4d13a76e74b6d51a6fd021aaff759763e4e82322ba743c14a2b36bc4f44715f01cf3c7dffa5ebafc80821e2a64e1a9bb294e655ae2023e6901258406f880a7fa847a285217a274c9896085dce04dd13b45ec0472b22f8ccb1890c97f0b115b19236a7b147d12ab75b1a52c2397a96d09b55eff43fa125f8cba668caedbee0d5b2b7f007ebae341b6ffc56e5732605165b50c5db357bb6840a5b418924aeababb975ce7cee2714acabb694df92fa9e4c433058d79bac2d4edfd0c73eb40c1eee6e588132d384d16fbd2ae4eb2d3aa8cc7b65b08c6412b1aa218d93161d1677700830c1c89527da83e9c3c2ea40a62a232aabcd9ad9e50aad69c670d39a7b536dadb9f0295b532951742529b0b3ad3dd502367ef66e9333d2a2e54f615bb1240b621ecb47515e36081f88e83e9b057868660259058870294e112c0e504c5471b4e86228092529ff946eae66e3b14a5232ece7760001ac21543aab0485269c6a17e982948d4b7878665c42e64d6ee876495eb9010083d0e08b8a766cf1012176fe859c8945efd3021f16681f02cefca2e0b18233bb59ed80dd66a4629ff29ab26ddf7ef2daa4456100ae5b0fa0c11e38f64adef66609670e08ac3de4fd4f6f432c7cc6355897c7bad6b1beebc1ebab5c405ca3db189212a8e57268dc4d7425c0c30ccc1d8f593b2bb5676b4cb61c01f2f03a4b51fb2c880fcf00888ecf4ae8502ab8435fa97f3619cf43837d1361bc425904ee4ce3551d0024b0a6ba330519119d6c795a7da6af4512f05522671cb807ee92c8b33c5a7faf8a4c3ca936c45c6cb06865b8e64189c29f788bef0228aa1ea15d4cb4338af508107d43c5233d5582416b98657b8c0dd786cbec5a371d6c5321f930a7022216e8b2fd220a91700a0cf3a2fb5903d58a9db53ec91dd3e23afcda411193cda4ef7a2b6cd3f4be050697a3603352c2396e1ae50e416b3e1d2a7510847707992652b94afef57048aee45b559a1c3fe62c8a02327e4dd69c0358f4bb236064931ee3be37d659842b447ee59a7552028668f86691712cf6613856d9b599c17ca9c39d10e3ee0e5f9eef8b41105f4858437b3c3a5a83a6c9e7de80a3ce3ead6fe4cad1d4d54c692b295fac1c6405d84b69870bb0dd4ad1385ffbb19346afaa41e48f843ed0d7923edb269e376e1d405f58286cb63d2304c8dad0d70e442ba6f60c802d9b30b28cbeb85525640a64599011d0177ca24ce439803001caf8c0576de88b3136930973b5a7d486d27dec81826e1cf57fbe7214672dfc1d2f289866ecb5865f147751baf81ed98c463babd81453c835ebf4ed900a398c988803e7328b84512bdaf3119bf96f7f1f5ae31c8e3dd3088aaf77988f0ff817388306bb971768cae3bcb87f5941e6d90e21811a6f0f0d9510689f46a60b576f7327c4af8fd2705c0c9be921de68bdd8e67e2d647f528628978d36e905338ae888f36d2272f98e624685b235076838ff3a67c8e8c97c3e966902b72b6cb64cf432aba88e78ba2a2d367f6d460be9374cd103fe7a6c33bb8b9896f5d891313dd7012c6b6a758f3b8f114f39c75ad4808e22cb0dc719de9b308d783b6e31b10133937285e1b35763592944470c281f9c8cade5ad24340b7e06f587b06acce5bf9fd2fe9c47360231dbddc27a7b43cb287d1d41f7b8fe1c4c1e74a3032b720d5063e89b70873846bee8c5c9c6fa7920aff465f5c4c6e53eb0c003a146252eaa00ff1acf6843d158e2e227d730a422d1ce9a302b233b283acaf2d1bb486f8a8864af9ca4994ac9049160459b5bbeda799929f696f16642f758d672c8819e5e3d199320cdb2b92906c75e6f83d258cce12416bb51306d5251071ad5d654d2eb70a533530c012e102195b360b5d1a2240250b84ca0c87952af62d164be5f08741c1474d7c37186c5625afb806fa055137a4ad4b3b8e0d000fa1343798362c8ec4461035da8135922610a4626c776dece0dc0a1139a96e37bf5053574a88731771c62c4a96721dbed4ee38230218c09ab9e8428fde51ae81028d6180430453068c0f8f4aabc2fef32a717a985ff64757ac11880533eaa23dacdaa3e839d31dbe01e267d468882523b35c506ca8ae9d20b2ec51b12a27d0629351672fcdb411ad1cdd587a406b5517c2c4108e9b1e747a4f92fdd96c827f18d22b64e83327a5203f773a899754e2353ef6960d3d7e203873eb8834d0988212c647fed9195c1c24ae64183af89b294c834589b5a148fbf470a3fb8129175dceed29a96b246a59519e5961a6da69434db512458ab36da440493e9cf6460d9cf8a2410beedd0182abb06dc2f8bda8bf3ef7b63a9da8658a9e949837d3e3ad12092bb41e11e6559ece220d3d6117aa8a25cba207648b3b316693fcaa59b5867c1ba6232381147ce8f7df520fecb29979b4631763161bd699321a3d0cb4b583343e85b9963e403fe287e71dbe934a34bb36baf8ea4f32577e56f50ea2285477c3a4e2b1449ca652f4c90a5b9fc3c89f8e441118b2bc695c3a0683ce5e2b22f285ed576a8ae591d01e266404e232beee547a8094c484990a9ab73a49b1e32bd6d03ce39ff76ad73f220c9f901b822db204903fc2af8430c9d8948b1e56d91b5a53a31441b6a9c99158cf07c49cc84c1d6904db0093806985702336dc4e07bd2ef4461002823c018217e09f42423431e0f78ecffb9969e803592a4a78911b0c19860d7776abdc79027662e5137afdd516f6d4696ce4937926be42313e3486c434bf903235a92b10448d1bad4091f0899273b8849a262c2b384a108b65e3159fd200e792756858e5fad70d691ee39662823acb51f33646bf0baf91b55f0464728699e1ea530e570ccd708d16366d52c3e562717f853e0f3b54605f34fff1eaf35dd9ea615fd002b8643c238c9db4d78879ebc5cfed852190a9081c069a6b3b83cca2c8741f3d41eda51e083b1676ed960faa4c1405000222234b1bccf1decbb47a12a82232742c3f10340eb6577c2ff4877cf10a0e35a527a503fc43fa155588488af353ea82b78ad1e325e92a07efc84c0c9262c10811bb8548257a81c2704c88516ab59b144b4856266bd788e5587bce44221bf5e21a7afb95e002fd64ece006fb339682d4fe6f9254d6c2d23acb620a9de6ebc5cc769a4d67e6f1e442d1e59d5158305f0ac9aa4a141728b2bddc34c1f83ca5cc8003f93e0fd3e0a83ca4a5f915c68b44fd35b695910e115a583b28b1f40f01d59a02be35700e0e007e84352e65789e888ecd9399ce6c12805cc5278a3418a6a8350d1ba220a602bf4518d2c0990e3a904fd9746825cfa2edb894028383290022ef6851f70a8ecd2a399b64cb83d90f15c7f74b93054169fc2e57fb9912fed1ed51d59b42f6ab144841f01e65626fbb84a0b7fd44e56932ba0246a3115ff19dcc91e7099df6071e2f113f980c5537c2f1453da8830201c75c7812f63b7da4dbbe32b45b5ba3706f9725c14ac441af4d0fc5a3ee04c605c913aa93cd87018f01f1020ee8c1c512eb4f13d1a2f9457ed324719e6b235bc1d842e606a9510f69708ef1ec4c92f93cd96cba094a8f8859ac9657c7cc837952c98d16abc6a96577c71f22a8dc8f850fa20b6d30d447dd193c13e75539d7d799f4dd1511353668100a9307e89fcd1b1f6eb3b7fa15f9395c2fe9c0ea51e0f25dbda44b4d92e71d3f126c7e6b19532679614e6dacec4007e70c507d0d2a01638377a501e6dacc82e2477e21e1e9f1b3ff4c8860d04ca107fb86d9903c6080c323789ed8dae97e09fe6ab0ad924217afec5beb503619b37016af7a73cfed4e331229dbf875752ae05cd66109f2d154951689244e87013ee517f3b61b5b57faadf6e3ba8c1ec847c9b66692c35f466c73aca46dc07fb2ed35844a4940adc0eeb9eb140d255b89d3c33f838da8dda8ded7b38bb91ac3b5957d8680833fa019287024c1e59c2843b5d9c5eb51785cf1211b036115f06852e492fb66da5f1ea05e2134435b392df1ba6dd55301a9dfb743adb09339b0d9468d545c968ff6707efb99e78eccda1fc09b94b65fa8f37f21563242d50541fa744814db6850cbd5ae521966a51055b7c9cea2eaf5c3e4cfc62e6e32f036a3bad416663b9229fedd5553ff8b30049d92bd6020867e5c8705a6f8fef3b7f4804e8d7c84fbb38898b5e992a8012d1e6ae123982a298eebbb0aa11b1ad73cd886bb84879eb412fc69bf28ac0a0924cd271578cb163122920922782fb66552215a009bfa439304844f5b79a6ed43dc6c18478b17e643e4e6025a4b92e3dc647b1e67cc2cd194b53ba4e2126d4cd2dece7851c024a463afdad074b5c410ad2c178eb8965d02bc26900934b42622f3f40d4ce02a2ca84e4418591a5eb75a931d61fd248e3a22dd341db44a5c3350f71d1cb41a77a3b3afbf2858981a526145235a638ea934b0c68dcf252ae78fd4702c98700cb559bf3a76c4e74a7ac557f200bf8a2f5fa73a375d90e7c204c17f13bc5cc02d8d020106601e039cb600b034c80ca5e0445d10191ada4f19f092d8822d57605aed8435d62a0e6e099f8158b3a889500eb1023a8d6d12955cadd1daf42b58a73e2ec80282435863de4850caa63acb52fa11fe67ddef2248af172be08d68d1c7f800a18832cd229136572e6b84f10949ad0208a3e893119e5c0ec248b920e887c0e2c4000feb939b0c6a114e1c236279eaa7a149cca17f12087ed19c103c007e85d8bbeed14a05d1e9aa8c82f46278fe34b663be6883be4c59e75a7a3b419a43318ecbca9af41375fec6acbff5a97e226d6b1140a02e8eefd92eb3a9cf9a75d82268e09336d198932641fb5aba8e9a24c77215e2cb7f732240e5a11b722520235114d10d2d9f0dab4f5b1addb369aa66a0e74189c6f7425421e6afd3813537cdf2b556706c50b5b8d2b680140270c2e7d77ead026254a6c2f85360c05cbd251c3c8f87d8f737e93579280267027c8448a6f4965ef8a5c70d3f629e1e7c8df01701f39eecf3496d21ac4aee72242855169a07113066abf48399c0b03e5da77c8a87bfd25712f47868ee986315350b94273ea99252906db79224cfd47bf0a20e50d9e5a9a53fcff6c919c3d752657b56b126a16a09861fff16347e47aad5e7f9b46d8d99c4af7d8dadd815eec5c6c24e537eb97320646d40209c11819f825b5f8b4cd8e0d8bef517b9ea10be01e7adb7a846baf38640929a1eaf0c53ca10291c5409c4742ff6ef1760ae007b64e5c70c6e2007525cf47254b4b01df3367d00f573e580537deedb0c514e06260bd898d63bff87e496e2162369b7f103e9a10a698a6fab2f1926404515e9508fdbac6a0254f0de78f5b841d291aba3bcf0195b8b889d72ca5c7b12252c949faabb14d78a94e4756b1a8557e8c18c62402f2f928b3540fdf5cac1a3782af2016ddb2c2455ea139258e40ddfd424eae0f36d65b1afc5f3324f2883bf7ad438e3d684cefc73ae1c686392d7b2d4b02f99d908142dfe5d947ee6116c009f3880675a2bd842e7f17e5c2da5e2bc86d594d224852889167e049f921d6f6eddaa3008ccbda49e57645cae8ce8d220721498474af993554fc8d4337a1327086a6ed65b1aab4d4643255dca31d2dafd7bd74cfa4efd5853f5cbe2078350146a9011c7ab288f2be844549963490ed370ab9f74542b28324a7946ef658c140c829c197c7852953bb3671748dd6750c5c04c3ffb3fe3cee64d5d74e6aae7123cb1648b518d22861a04f226831e931601bfca0891b530b4dcdfc5a30133bbb945dea1d11bc5702192320e3327d297f93d8668c50ed6c4647c43f593249053438c58af374edecffef8ebc7cda44238dcd789687825edf47430496951af2f81ebc8651ef322cf4081d73496b2e80ac9c89ce1b2d674c7edc57142e370af33167d2105a8b062688b09533d6e74ac1a3c9c56886d23b51cde1c56321641dfc39cb33505c03eea07e6de2c22b75efbce83e61bd78a535894dc2a27613f437b57e9e05d85a72f4d8ed764534243f7647223717b4e6085d3b7624e673890e85ae1b36675401aac28faaa6482d09e43910451e02033138186def3bdd863c09917f5b76e00ab27a92043f4545df11f11a517aaade7f00a677f4775c68cf089e2d8c5b0699906dc535357f87cd442f7a3ad9b0393c885651d91452961e217ae363a17f6491b629da0aef01cd078ef143bdad18530a99f7d144e0da642067d90ffb4e355811a228921a05e07a750d4b698f3f19db9a9cd25eb228a80d3f6c590a7d313c0817418c6273a7d536a60c45a4364d07367da3638d27284be27530dea3f5f0f7e66ef4831477deef75c2ce94a9a7b672a31ae0f9f91623574227391ec08ddb1d00a601edf510a05b11a8a9b7d6bb7d7160529061947d2fb37fb3de719721fab77a80a8549cf03eb42fd90aa8e97854516791ec07264608b08ace746665192126745a6e16048a5581ad8d1c10bb5d0e584a8b0e9d4dc2d3545e8191655d57a011841b28369d7fbcf741d20070e101f13003d449622090e2ef40d535da16667c730d4a11abb9897f25ef09476dc22e5f91abc22bfae2bb42eff070a77bbfcd87662cd9437c080c7b19221b3b5d5ebdc73e4611864017330c509c6e1afb4284675169deeaefe28754e0634165905a6f44c09f9ed2173081341d8c6da4df60e944483d3ed02114c606faa53b8ca741c2ff7e987da057a9c46bed500d211b5bf12fc88bdba668dc32cdf15b4f50f5c1c3ec12c2680dc33c309593d0a4466cd35860d9a46484fa14cd1dab9b27f454883902b4d2f8de9c96b4e17074f228a9aab5d20acf4af57415c97442d3c6d36660c22641668b0335c602e431940528b7c6c5385fea968735f132e82dfc0684a7ba26043c931f31d6e6b85e2eaef9a064ecd06241dcd2038b6e65683e202f023575cc0e4c6ac4125312ef9062748b889465dcb36d09300dd0cd9cafecb88836fc54a762cec87f18ed5a7a296daabae61d907c8b20c5fdb2ebda4b83708987c16b060e87be5a12f8d33365c390acf92d4af6266134147b8746840bf748ffc9034b002054bf94c9a28663e68ab2d263625b6c074f4626b27c91cb8c81b56d04c98f6500a28d29d9e2a3bce7c6e9fc7649c6d9ca558bc667a04a62449bacbb57a3a47c3939fd6dad9b9409638f4cca13a891c00e1e74060e78a1927732534c583418ea7c16abb2563ddb2ff3d25e311f23baf984130ff888325a30660698e499808b370b412f13fb26c58a0a066a8238c47a4218bd3ec24358b4861c622df20612c2e8a5d081fb0e9a1ac51cf235bc7c495cd5de1b9946d2b284bc5e43ff061106b5dfb6bf1fc313449f27e0734bd82bbee41406f7d6144ee1915ee0aa66c8cbb980b20afb6cea20c51867b033b0bea0e824bd6b9fa5552a827c98b1eaa19beae1767746b29ac2fc9e87a51adc24864cc7065beff63ac16742ce5f3afb656e1206de0c5673b802975130205c73fa982fd59a452292c95aa14572ca77330c479267daa75643c3b1d8466f164bdcec7d8bf2731a369f9626d230c1d863147bbecd32f6b06ec10acc634f8b93b9bd192f75f907f670e90e614379770651b18f351a3e5118890de92e0d8e1828420601371ffd6ce820ad6328cd770322445f2e294d1f41019aa1ae95dc8f2e5d5bb7037b64402b13d0ca085e1503e087cfea9b68fd83990392f11d5312156b1352ac4da080e6d81398c5c000de991d20f8ef0c6528ca6ef1e8070598555e1acf01666806d6b8d1e8fff008b0597687debe4b9cd643cbfa291be989855b022050382a616fe0d3fae97107fb3a038842bc533d92e5b9f7850a8014e53041c710c57700c87a1aadd933c251293c554f0a3e1a449dc0aa4bb11c794a3c2b06506424b35b43b3a87e6c0cb4b6b2f28baa8f517167c4e5e9059b7be6dad86dcd9a2c4954ff8dca1be96b49f0678acd2ffc2cf2610206b5fa646aa47a4949964e85517261b8365c2d3ea60448140dbb1c6d8a185003c7e0b1788a2a916ea1e2a633f41894c6f56e9fa38eda5fec0b0c063fa57b24e11ce895b4a0c6170eeb8ad1d05ee8dcdb8d49df8b2c090b7f8918b6303251559a09356ce21c28e94c984eae122a499c841f314858191b8244a110eb1bb5a46762c8c0ea2370ab8f0964428fb70e07b1ec081c781332125e360a6030f00336f1fc098fce3a50a5fe2dc95616e1465035ae71fd60d0a8614d6fe338aac785d05014195e973265bd69014f24373933969f3997734471c1941c3dc454b75821af0e84e8babed4fc051f2fef5a595083d46faca4acb6e05e9e4559c6cadfd008200a231ef74b8e0062183a92076323a498f9a97148cb1a20044744e67912b7303e2b18245b6dd13a6cf4653a6e2abd498091524cb840c33939b205408b2fb2909c179447550c6d0ab811c42dcf1a1abb0ebabdaaee8cb1c2c7df0dde1bc70ad266eb3efcee42a5db5b9674733c2914d6c8b85023793ef11239383a902009791265990f4f0a229eb0b9559ef42c4878c7eefe2691a684f418350af250625592efa9350fccabca15b04bc2929ea8961f4aa0b3a2229813a96f441ca2546ec0c21f12a203d8c848a314c39a0119e343cca2541d4c5d7d587e4f61969ef36fd5fc12e75ecd40b1fb9b24d0f598a9c20d3cad450cfe89fd7721ddc00e77b0fe20fa56fe0f7ba1c5844a22c90112d53e1bad26e6922c8d1f25c69af59370791fea42947d22c4447d6cacd3d6070cac4d3970a8db89582e8d9113222315218a3a4c0dda1351895ed1a6afd5494fff802235e1a9e6a93d4ee43bf748c8e1fc06bf832746ce9a8785e77f28f89d35a0a527c8c3fa38fd72e161cb3f843d296defe665d35674f06aae4886c54d81dce95be2cf93b1481cc013dce7afa0275f636ec5f3b1b55d9b1e8ac078a696c816ce551a18e6d49acf21533b270427e2cc1698c7aabf4a81fc678de07c9b3d30dbf7608d112eeda3936eae10572d8dbf0ed1421bc8740c51a37e6cb4147ce7fa9958885e9f501df302f57936cbe81c7b501356f7e66138cd85b902043a37fea0d311271b843871bff17054536a7f4b276bfd17434c59bd083e014d4e7013018f2d855aaf4167cf960fcd7512444863020b2b9f160653bac443f7a5ae910563dd2fb104a891e55b3b367178a67d4a756f907faa80bd7cdc20a29eb9744fc2e32341369158cad3c07fab10d89a5b7866cf54acd6d9d3ca54b8c1a02bbb30f9e67ef3ae332ebff659f67be8d063f73ed116d10178dfe360ed17c1d2a52b8e00d6e6565c51dfd0787525b7d79fcbbd5a42c26e3c23d3214f4d01554fb2f3b930a59381517b4c019d3c1524969c904a171ce7ca6e84580d084312e3914441c97b5d9f8c99488bdd969c7c60b91abf0b2958da00884c47dc58f60b150e5bbe7a78b9b5a42b5c6df47106ec72e8b1d10bfe6af91a22e6fe280818f829c2664820b362808687a3bcab6d00eb332a7dbbccf9048f558aaa00f1b1d910ba8ef1b79ae2e1f034f1dfe794e49f51d6a2973e8e6af5f1093f759a70ec10708db1f71ebfacd0a5ad87191f18fb4f85f1bee6933ee0ae880398ea9e4d3cd919124f3da09a61ec23897725ba77b79397bc4ff000cc11f4fdda4c97cdf8af8c23bf2d985e4fb8c49d00dc37c8741be3b5e7eeef3429c44d1faa67471821d87ad402393bdb13de85ef208b144788e4db914f59099902017331b34fa2b324ca927fff4ff35214661641a8996217907d3934cc49247d282bf6ebf088194f1c205c40ee018e9867d6497de4808d7ff268c0b30940168f2b904b13da62202b2d5770a6d55c7040c12df27d91be541933fcd8ffc9a4e0aabda31fa85f6e4c5d56e71a0b973c1102750e7973dde6d00ccd231b83cedc87f81e49317a580d2f742deede56a3534353252705e882696d2226a9305a364b2a96442b1529ca71fa84c1885a193a17fcb32ca56e500bed858c04e51a661ae5d20b15400d66b84ef9f4f5dbd0035c691ac0712df62f9ad7f7a2b1f84c4b96846b00550a9fe5d908106214beb5cdf82d4a4a64414f0691237f3616590e610c4aafe5ff162fadc7ff64024fb07452ff67da75aa09cc4d66d499e882f72ea2826e074ab10f21fc37233f81eb67f1f9855707b4bdd5406e0aa0afbe10b0ea038159b7cb060905baf34b71c16c9b83f8f04a710ca22b7b90e66df179f9f909bc2de0e75ef98bd806fcc7a3c61811cbeb55acd049a78fd8a5c97a9587b8eae69ff1c459a0e449c01008c52fdcb7f8012dd85a8807718d037742e6bf22fd7d5a40e2c8d8bf8ad4c52f0e908df3d0002d36c4009013b0d82284942a496ae8ddc151b2c5d183a451e6a4a7824483ff11ba42f09091c1c53e72015696963b0667ff97a3596f330670e2b251391cd74bd88c487de8c9394a205b7e2a0429456deb9b6e0fc2d8831cd311f90021c30efea16d69ff1b6198c4f2ef9fa1e5ef948f77df711caf462451103c14085c27b7de401556a7ac38e104ab70af2e3b4c92a8f769548f624b04e243e26878f59f025a12dfee721047ce1bd2075c7710dccf4910a5467d8bc27621387345847fd4574ec2d8794f7fa389cb5a6bd03d9bb8b32c8653edefc40951c2adcbf9468f782715570f4ab6942139b6229a3b414504653ffe1ed006343165528ef2b3eab1d64f52f8336af2d2d1ae35385e8b424efafff79c111b48a4fca302a2833bf5bdbce2c6cd8ffa122bd1831e40cb16d650457084351b85673c604193d9af532e336cc9771b7984f0e56ce09cc80920fcb6f5ca51b8ff8503740935c3fc2955b7ec6d1330b6e7ab42d18f25def3d24cb35c726c68ec1cceec6556fc55f841c96d535c4b45c16a02165f077550b103da8ae23abd4d9831306f4cb23b7fda7b88609b0e5c41767f7d76c19fd9d49ad6f23312308b0eaea25ad49a730e23f6e55e45f051b14d95865ee066ee09cd5f5953f24b77718f9b82a2f0c50ad06b6287b7661465b306825a1014655efbfd3c1b6b5e8f18e25bc891331bfd6e757cac54b623a2e11607b9a1b8e5db809668a05afbc5507ffd715795f8afac62fa3eaf5cfdcbaf567e31559fffaeaabada398ab374cd17bbeab380db5b120e34bab9a6ae7ea7d90f795985c779d7104ccc1513cf5cd3ec7edaa78180be462e084ffdedd66766ec3da8d8f52e9855922a0e2684bae91ae5e3ee348f334f30d7b6b746b8eff104acf38c3e7e3ef73ee37ea99129d1bcd625281a1f73dc0438d81e1047feaa83968010002b93330ce383428556ec0fde59c036b0b24ad947f43c5eb99ed35536ee4199ef04a7f83953d3d8b97970a8f779cb4d0c4fdf2003095bb1af4237a9241d5e9f465bd2a6bdb7d3c668453549101f08cef61e4e48f6939501a6234a34f4c30073327a494ca6af763bcfc8fd404c5abbfca94743888233bb7fea6caa2f956f374fd1150abd835e7886d3c3c5d75c5d1469f19ad8ffcb0c9736d65f821a940ccecb5097d57de81f977d86a1337b50f564857b2f425eceae54969afd65a444f2d8da35994ecdea1283723f0545c35621bf84ed2c09aaf5f101d5af78c4f4c19064109ac31cd2f5a16cb6fe754b40c60603b6e94e8fcae7d6a963539c1280c2a5d257c6456bf801a9be0b2c29fa7e9b7715e4175f112e6199db4d772e5cbd1f75b9500ec896e0234054657ceba6a881a71b68235a13490ae5e95160670c8f7f9a3f7d6f9243ffb5fc8f583dfdc33dc6a5bfc95d2badc877003d7c03a097ef01ebc15bfe43c33a691f5fdd301c0bbadf3f691538bb2268ffcc2b4977a505fc9f1c5f9eb9b9bf07e61a795b976454dc6f8c5552c28575438f8623db9b340a0a89e06aee0077c055b0d19f1d37e4967d1b78b2f360ee09c3c1a98f75d56f7023b3d36e980a64d52f10ecf1926473210a0e518bd1062bc3d9d77b08ea586a83602672ebeead332c79ac5473565cc6d90170a3ed113d4136b236029d79e0b9a3f1fc9c750405b9c0c35e965454e338b59f8ebd7c0bb8200f049c741c641ea4f10993e933972bb35164d3df8c14a941f66816b720e6841c077d013b778836485fb17420c262599ffedd9609b60a965eae08a74663e2426bd4221ae942d4890348cde36ab32e8d6e084d091ca3838c25a05e9b87e1237fe6923c1897e0a72e0295d119d0c075641bff1f4be5672e460493d9975c0d29af4bdeb81143b6f9aa3afec080f450453b56d258b64bbba8464a6f10f018bf54c240280ae5e17cc666ce299f00663fca0884be1341ca19e0acc43d3dd0cff2ff65edf444d3cd39636ab9919de3d63f6c84de8fb09fab234313bf1c61f3d00760dd624c2ef553bf3599c32b53637a4706b23b0608990ec903a91295e90e9a132c4e279c9724cf53ceac9c88c8730405341e71a81e09c062cc87cdf848f2e1afe87c1f92468646965118b4b0178c8bc8e9b208811fa020959bd72aec7c3a9b68e011d50598528796e11d4d8cf12df55e1ab8badca422503caec6605b401744d6728a28a058d07eb768ebadec0333e0defaad3990f101166d661bb89852437856b4867cef095f87710ae11f0516d64ba14eec962f43904256c622bb727ddb258c43b4b55998243a9f52901d27e72d328d10aa5c7f990b8cf87f41596bd7fc6f4a085470078d79a15200d42a7a922f1a87ead1cc6744ba4832ef9f72376d76f15ebe5118220fea9c9643ce9acd562f0477c2681ae420b1c048dcea7264cec6279205fd52df69ed8ee64392395def052343e2ff40e4c748790685edbe8806d484a86ec2c61c85a18f0ee15b4ccc26dbe9eb032b70c7a0b2a26cddc90c9d9e3f02775f5dbef993f2cadf676c1fd921878655613609defc0c834cf94de609611004fab03861503a58fd2f4f678b7012336de1254561de1b28a2d2e9129672a9294594adca5c6221336c295b2d544b2191e192785bb3b02ef56a2a191b231ff871a48b1a841764e8dbe8e162fc1f322a4a6e2fdd7bde7e7baa4609e19eca1450030c521d52f87c2652556ae9eb0b1a447cd78b36c6d4381f0eebf2a63a9974e2b3bd137386119e00a5cc9fcb6ef8cbbd436501cbf32127aae860d76d477aae22020f5f9085347f980602582257d90e1cb44c5d9a6a5ad9cc3a579426c78ec6c13de1683845a1645c52f93388bdbb632602ee3cc7250c44ddd1f1c8cb4d12417238cc2d65089dbc1f5988503c092317e5b45f8ffe22ceae679f7308022999de1f318d996218cc31d201755466173ced0fb76ccde28bad462431938ebb746d22546043c783f9ed083dc4752f28e50d1cc66e83fc46f01b6a1428300a4d9c1c35ade5013bf803bc96d45896265aa5069055e3f4709011b829581301d8da3523b200242deba892af796e523ac412731f1be480f54ca61be9000891793dedca383272871dd2d0faf78c9839319894a5318e213d717e5157746402552fe7b2bc61d413a3fd29e67f170ac3e78a07402d4bd9aefb474e324c9c20ff33392a6b7a0be3167ee603a1816518d08644ad92a852eeab4154f3f1c31c292d80c1d7f4574ebf672f39886f2815a509125867ac8eb28f0dc98214cd3657c621ded7937a616cbf504c5ba033e7e4cc8778dd011073cd717174d1b3f6081416ae150b8e1e8273e1a61a46d4fc3067921145f5cb19b7a635f69eb8c0fad0a85a30d29861021bd51799619f7120844ced40b34eda033c0590bcdb0236db33c72f8e70e20e2fa30b399e30e3f526008cef6e54f00e22da4050087215c8f624fde6f15d65091e249c89abc8df488a1168160fc75d40954e14587ea13cc7d79bf10eb4a99720081c8e5cf91faf5dc464e4a5a1ce3e82b02a3ca9e8a1aae28b2db3d1206e03b2592934dc17f8e27bc1382aa7b17195a17f1aa11d33028ff11e2f242bec62ca9d59653b5ab480ccfbcc66b29867c0b22ad4a8f14cc50740095cb58461419a68459a8174dccd672ba0323d087c0ba4467901ab4eb584bbfdf3ba103d9fe15ba8fedbf8edbf0441ccb75d30bd2e3f8fa3732d57f4df76cb2fa17634b9dd5ec25ca79283da8a65f651505bbe23b2143157f00bfb0fd21c082380937ab2b0396fa925b1af4d8202a3d41b7b2bd07347f2f8530f8ca85bc74f7f6fd6148677a6c6aa0b27d91520afc707c8610fb85be92fc02c6db7dfff1f4fde4de2570b5d2079a9fb679f016f5c32af3dbcb6e40bfbed0a020e7ee00f540f5fbbd583b7cf5ede8adba36303b87f7d04d137d853d82e2787b9066fa7c1cf8d70f0af3fba80d3a7bedd03b321fe5f0e93c1f66bbbb671baac12d4d7ed0950d91a3945e39888d6586ec45ebe2da94098e7d7449a88e4a00723068d0dad59c64c651b7b3ba11f10a2c777962ff0c26bbec834bd6fd00622d37fc00a80a0bf412fcdce4aecf64c30a441bc947ec5435074e4f457c4703748dde6dd42825325b26fc1f4e9a5523067ea68ed059b855c694e541cf91f01578c8a512b6b01e9bbf2564ac3ffd8abe673ccd40982fe12781cb197d101dc90510a6a3ffec9ea6f4f29fdbfc5f0c646011946ac01e98abe3250b344fa012d9def2e09cc784fd0278e3dde028ae37efc1ea49a458cd57c70e687d2fdf586cfe313e8b18ff484c27df09f836d9e5d2adb5f25ffbfcb23f4d228c029c1a6ffe8d5820afe5f8335ed958b75e80b959af5138c30dabbb3a9d1b73c4365cc7d127442940f4f05c3ed6e4e2f34daed8af96749b3bfae070730aaf54a64987d2a17f228e6cabce874f13992d10e1a4a01613d52fdec94f6389f234feb71ba4b08a4671575f15482ef2e84f0961053dfb3fd4c77b83bdb0e3cccb6b3a24b7a700d8873dffb39eb982add1400b64d4a6797a997a1ccf4c57caaf610f3b5f55633bcb09933025a1f42be5eb6667cde4a6cb8d75ef38d67ba42722ac95baa43147cd26f668a5cd68d8c0d6a9a5c584cc4d0cb20ffc97a3bdbfb5404181cb2a09ef43a506bc38159096bdf643f2cb88f3e24768d89230fcf7ba1f8b19a97f681407ba9623532f37e2552827803fbfa0cc6118f9651e273ab123809ead2524505290e3e076baba8d858501f1bde4a6fd1bedc58335847d994bca549253bce94483b3dd6e6c47d5a8b4dd82cec5ba9cbc725308e43038085def0167acc10c0c46e9f59dc242f7a475b97a489af42cff780fcd0ba97af82368f51842baa58e90a1556a828d27dc3dfdf2d7d2bba19d74cab5d95c21a563c9657f1823a183addd797e24d366fda78e34d366fb069a35d86bb9d9be95d583d07126d4d608117ca5704501c98b2ec46e886322bcc9cd0749cdecba2f9ea353bbaf4fdbbfa87f480ae9a4abdd2d00103d97575c3f9941f1d3f6a2fb974637a886786013f00ecd05414ca28c2f4dfb1a8f7bde9aca187dc382b3e9fbf8dc0a04be18a5c259a9862d543c360b2d3056ec5213f7019abdb64a2e3258a71b5d9b4aa852827af2a0a05b256d0e9785d3f26cc403a3384f4ff1d786e2a7a5fdea39b48082c54de7d04406340509642782a0bdf779e3f62a1fe807359650c7efc15f435e498a97ef079e5283f3848250e1863f4f835741152474b1b47e88295a160772105f672eb22e596b8d2f0d57dc2c125063424d7605f6e35587b5027a5eefa0e3c788e4167d6348b6c65cfb3a30d69057fe4f94554b83a61a4da56e8af1067683e651e6fec5e8df72366922a1d46a442dcad436732d2425d46ba5bee187dc2e177c0093414f95c0b53b9d625e6376581e5b523be7b66787f026abb4f4c3b0968dec8acdbea8a79eb47fb26bad3f46f9406adbb625c7253f0b5c3c968a716eac509fb9e7992a8d0d2f8bb2d3d5ac25254316d9df37e62c9a78926b1c1fb2391be4c112bd89b88f966244ea0978ef3654e7c483f8deec968aa43dce45b07e09000fe452d93d6767c7c65469b1192615a504ada380734a1406fe80d2741862d0c83e40264a096915c98352dd3b5bfcde75e71c6d380c659423d94315f86163bac6fc4f833323678df887b65324eb8d710f1cc645cc8f4bc008ded5881e2e6c2b8c725051bd55983dae6c23d741fb28d1ac02570c8676b7993a71c991af772cd740bed15bf19c8010596b49b4b62f9256acbc1929daadc23ebfa8900f31e92399898603d9e07ded79122bb7632a4469c830630332417b1694708e75f1ec0d38c5cb211cce66e8e3cc988c6d8344906a91127de68461ee91196a502b094674898b344eabdde3d72ccdc1e158c48186618a4487126d977bf72b279c9277cdf7db5a503ed9056cd68b82fa829ebc16f0e1688a0d7f1ae7920f65820e9b52664a636545b6004d34020d217864ce9eddd86c628c117d560b2fc28844ea798644170e86f26bfc41ba355bfd681e6a93b464e4f6dcdce7e256b6b0615bf5d59976485e04729fbef8404af5cb34d4242e8e4e59e420245d5c0220cf23926004ab77329490a026bee31b5a5f795a4e065a9787825b7a6ff9289766784ee5772d5a8a397b10af3d3637b74ab04aa7fbc53a0423c0316811d70c4ec9346aab6ea7ec5a64e0ba331f3241f2f0d1c07ccae0dce0dceee5b62e364e80d5528cb6e07ad536ebd0fffb48c4d5fe9ec20139ba9f377484d13992755b3a2feb9aeb96645fadfd57960c61b114437416767dac22f06036c05d748a77a7e575b79e44ebed122f5de53923707e3c95813ac9fcb095f61d9bf279753563cb33003e5c2500234d498e1e27dec881ccd8daed73b6f66a1181da293bbcadc19a6a042c64fcd20e3941318935b0d629a23264d2361e58937270643897884dbac881233078b1e1975104807d56ecc34214319ab12012b9faeb481850d85610713aa650889191f53b82026b3b8aa5b4d7cc5fae80531b4ebbf8a028d25f353a6c01a59ec8e2e32a6bd637586948a6a0ec30cdf934c44bc3221884e43842b8a88941247fa778d9e13895a7cc7d332aea6154ac15b60ebd67210f0ee6b9713f5710111b11797b2ccc20dd24a6e1078951980366ba2904217d56ace8645a88cb27c2082cce55859f2a2ff1586bb130e385c97bf2570a06cba5363495c9e4a8e28be3014b35fa80f6839011b262f5652bcb45130c6a31b4e0c45dc22326d0a46e953feac4f0d91846e8897cdce48bca2300518ed853b972b27c6c3a26bb5a932f722266250727dcce679443cd566621c335d994c4d1edafa629b5c294ca79c2c654571aaf79e05ade450af4f0136f8d6f35853efedcacdb63aa4bda18a8500c33e7b1bbdd36eb28af3313e0df1bb3403c990ea7eb97d026c3b478a8c49b86a618f64c9182cd5263299c8d3bbc0ba9e2f77e5012be6773248713ce80d6ed5d698fb4bd2c3cee0b7a7a89730a001ab2dabae30c4cb2205541204e8103880ecc88aefbdfdb3c09e4675051b5e3980afd323124083e0f07a487fdf32bbab0908e0e6f4207d163c58d202eea07a0542d92556b1d06b74893448f911ce51f69caf3ca89269e50268cf0ca5625fd095526a56ceb7bc5ea1deebcc2836f0f8f581548794085da2080eb6572608ef06e57a2beb61221bbd0cadc2e2c28604398c27fe575481ec44ba246e70773048f26b45bcfea8cdd5739ca94a60ae44d8e901a3fec48ce0308aa911bd8580fb16933a0f8b2efe2a8d71b081afe87537ba14b396c878b979b7ca59752bc923dbfe88aca3422279cc2901a148207bb2c74ef685747fcf0db463af0ccb5529e52fb126f1dfc658343800ed90bae57e9833dcef92106a01d6328443fd8aebd6156230081d2601d7049aca04b45a15982b77d859f3df3b611cce33d2889c616ccf884fbf4c8872a8a02e100a5045bccb5bfe8dd8f5a8ff9d6f27d091dea0be08b52de05b38804f38823bdf08d0b2aae0110e655c6ec4f2fdef91e62cf0441830d080631e23203e14d1a8bcc389b44976840740d791b8c050abd5353cdfc03cca502ccdcd99e97df6c4a1802d9e5b86f09026549d32de9ff0e4e8ced50be62bd00dfa997f9f6fc4651553f31f092e6984955345fc4e6d7672807c678c83e30bc585b584bd91b20e8246dd8d209977f890476330e394fa37f17a9225ef230a122db6d090cb4ce0b0f0cb7354434bf9db12573b8447b37f78e85de671298173ff92397a66508ec199a3e6da65a41c1fbe8281aab723e239013c6188b381ba9c97fcc3835c9c7ef2a0c1178c996b9606e3804b7712c65b7277f45f51ba0e089e48ba403bcb628c3160188edbefccc06388502431c8bd4a162a952cb9c2492169ef6b7fc833ac0972c6ede4424f45334d0e4d655d4cb94c7ef120805b0542ce38da843233e7c7f4b50a7fcdc10ea2d9c7dbfe67b293dc1ba6aa58ad78cc508fb8f9185f196b89d9f946f6af15a28f0dabdc8c2071574d93ace0026637b8dd69f2660b661cf011d163c919611478e25bce468598871e710e2d0943bf026cef3c162b1eea2dd09c1fa368dba2971949b94a6319b9d660d6c20cd511e6b1f6acc95fb4a40196badab8d5fb2644449ed3b9f3241e17083512a0ef0e8975313c99b9a3f901de5e068495255651ffb2a482c94f8ff9dadc7e1370c7b474d18d6fdb45499f51b92b6ea2d9c32a0806b5c85f866b8b161bd32fef25952a028e76d4065d319d4f79060635115c23175114967301f3c4223738a1d9eb76426830d1ce4017dd784c05fdaeb0a0a3c9aa2b59bb35463712c0a19b86f1c67b3be96b9ad2852d93c0ef01eb2d1e0b288e24b712ab05bf9590a18b19af8148972c9a7ffa5c84e281eba35fb669d1945db6c5fbb3e7ff1145ddf9b91b307d62aa06cee0b31c96431c72114d41d727f53e8c9ee14159e5237eeef9911b3cc6118cfa8dc247413ca7d7106c609fd1a4e8cd3f3d6d45b4f50ce54b2e2ad8eb8b0fa42e2be62d9c83fb528b85cf3ff85fe6acc8ce997bc05628439275bf453d25c965cea3d86ca15ea7b93ca53548e3a32f894c713c79485914498c78076c6a24de92349eee3cc195405d8f16b2891ca5634b12ff1290c30942a3c869bffd830a21ac3fad70122d9347a745313d98cf77e59a74e90b96316a169134c9c27726051a8bc212ce09a23bfcb3b7e1f29c50aca74aa9401b940f26190563b329c6b1210d31930598c4811b5ab5d01bf7aa9931dbcc10f6c2c95a402da59d69e5746efa5db42bf85039c3f128ce8cabb4c323a2a2b0cf652d93a237398bc7e9b9b836885b1eb28e44dc336408d13dca7ba3366d415183fab3cfd6f98b85ad218ce15874580df99aba9072b606171b63ff295bce6d1ae24b4e5ceb45d4c5b413bc182b11d7c3111863b40e29ee0f0c7cec30dd09d9048abbc28572e1ea55e025d958cec6a1f01755ac1acad15c8d99666b86acc28b5eb2e59fddfaee4c4bb997505bb8c50216eb0c2a0be1f2dc4e89681b57fc4f37afc0e546c9b108c06948562dc154cb2823a8bef68de5adfa1e9609916995b8239bb1c86a1d83535219c803df602ae705585d49689162e002b1063506264fb0eac21951d4a13a3516634911bba3c8169812a90b4e588c80b45059b1585a03766c2263ceddac93d61055288a55b56ed62a55a257b7112bc73d456cfb567457cedf503183a80b23dbfec94a937d4f12f794af344d19c1138f62faf1a28633e829043c604a0a16fa549121daec4516c8c48be1e777ca7e38c2b2c9246e0945f5912b84c9f261f99ae3407cf6c038ba1a08eaba62dd581e0d6ace98d9e7f91726bcea577ee67633220340281fd77712cbe4bf4bea43b95eacb21430efecba1c64fd5226a8e8f05ea9952a263df9f1d263dc182740c1a99fc45f2dc04dfda79be0a1b61594cc4242c23151285fa985fead31642eb2a1f135014ce2f5d5e1a99f6916229b31117cd2aca3302eebd06b44cfc915ec66d2083b15905fe1265475e80eddbf37c94491263566cf86534364210f21b14c98232e76c10316ad419dccbf0c743c56eae8ed96446fa9c083ce585a87b508beec83d8c88ee590e0e099ee96e692ece74adb23180faa1fcbe258fe4fb44e2f56d97e67f842a087a6addccb5d391ab192e568c6dc96a3b6ea6e950af8f5d4de38dc0d91a770c820e77a9ce021908a13ea2a37c25dc6a2c6e63f41974c88f41f1f819a42c31223994430f9c8963501bd261f0051083fa140fe7ba0292db1039009328c884c3d460c0e403b7e02945676cfb583943625aa65d9f0865f3ba470167a06aa16baf6d160584b40c092e4e02b7daa6e3f36c73624170c2de079db72e64fc03f4fbc0e69228f29ae0b6bd26950b1d36e2b066b0f0860679e72d3f933beb649199a74d2c63e4f0c5d36739205fa927620eb95c88c7bd10187d2d634aa015aecd49df36b27d700ece49930b0cb9f30a29a9aa6445acc9e6c4df0e5d7f7141cce7470c65ba95073f7d7bffdf4595694a44d1a6047f25a937a5279c3238a93a5454d33b96117945c2ff4b1675626bd95fac06d77fd786dae6e70c96a26598884cc9bcdd0ef873dd4e1c26846d55c36564c6997484f4f99c056e03bdb0b97fa36c37928ce9f8ab2d34a2a6ed9f12594a99ff836851ceca23b7fa52bddb27c55e625b4903e307b174483b584c534cb4fb6afc68ad5737489c2a40ca51046505a6dca6d7cac963e9f6325900e064bf10290a3a2a7d7777af09aed3aeef55de72da69bd30f5e8752a7a86cd0a9e6d1b8508978b8671d58ea1a34c7fb1ce8aac34b8a67cbd340d03352f7118ee9af107c49cdc142db5aa011d7cadebb6c46365be5e95250f89eb08185d2bdebe2320e366be5169aab1926fe1893c963ec5068f9f142974187a527bf82d42e4bf15d2b5ec5b1797705fe1ec18571f9a9554553ba832647c77b36c652d5bbfbcdc593d8be58b30f0e7d64844fc402c470a4d73f2cfe91756a63e2e69e4ecb567413f89af9fc92e49db40941dee2779bee02e4c5a18f8ea5b706455ab78bfd67fb83ea60b093f4af028630c1881247f9d2e931100ff858859dcdc76e5cbbc1f5a13c346ec7a4cd6648d9d9d0e054e56e3e1651902d2d78b6dea7925946912548568ff687594c242474eb26a6d3ab1ab04c65270f1bec7e88fa8973c9963f54be12014e5045803e243d57bd5717b92d15a0e211c1c755f076e32da260700fce8dfb2952d05bee36592ce32098a8bd849e5b98a3dc0e7ab7292d7ee2b175ab27f7d25e98d20df28a5da2a8c7e6b67eacf7599e93b2ad471a022a4f2b150a1d8edda0b4f8a0ea00217f3404f838489a981c1c664aea258f1a37bdbaa1bdbcacfaa0e12cd72bfdc99a9f8099b0bafad0d8cffaf095732f4c6c2a03aa4176725f50d219a70dea4cd4bbd6b46bdec4b74c9cc7ccf26f3da0dcb03a656cfcb17c6f7f8da8a12e143f602dbb9617f2496e53600da0572cb681011c4638409cc501dc8f4aaaadf7dddbd97e5c87b4d8482693c8613d30df3621442491c8eeeeee1d5907cb06fc06958984a1cf848990d093275028a5749766d0ddea8cbad579d9128fa98af17f4a32e88eb9fa93d65a5fafaa52596bedeb75efbd779b1fc6189752bacf9452b0631e8bbd5e51155530a89b304b290d6b601a749b349bcf9b148c91345660323289ec98638c31965bfe4c9516254b16b25451895a5b159549ed8431300673fb349016905ffb1b59cb4e70426bdc966ed0273891d1cad16c5acb7d821335308d18de5d8b9873ce39e79c734ed29cdbce39e7bdf75ed2fd1afbf2af9473524a6badd55a6bedbdf7defbf3235992158bbd5ea51ab60969acacd0d87be7dd7a686d6a215ff0b40161240c0a2990e4a3003d0fa6908234bd0d2823008f77c86333f85c5e7eadad8141d306da8f34b1f0790363cc027069ebcaae99ff3335066384e0c410a03c41042886a228821451a6a0a25671b3011966d041430d36a47670a003381e803172266ecb03c6c89f89f6865a63b0c6aa4f9216ff44468972d7588dc58e9879ad8006544091c41042843459628225401845ca83ee158b40091325493804526244898b4320253a404a765012021eab4e8e1f5ac90c4a70e2033d018aa2640616e00c287ba843465043adb5562837e02121a051871690c0033d60a01f4062a083e81d7a0a0da4d201e403270192c4c796e4956408ac15c98f243ff75e8c933849b204e826c9d006a46200c7f225891c2fef1a052420f00187899c25949460c8135aa5059a078d24c8061dcac48f1cfb840c5aab14d1e2349830000e7fd3259440e9bc9f8efbf66dfd6ca19451b27413ce2800872f3c7234233e9f7e959bd9228d1b9626180e25a7bb4360cad943862f360c1268ed86a3a1d9e7cab1f03261e0e558e0b8cad16ccf6d74f39e46e31c0a1386bebd17db9aef8623c7829c70ce3967f7db77b6db18c6d4ed723411c6dc194a1fdf2dc39ba6651a950d46a9d14dbed0dff6c6d140f8d2e10b7cb8691c0da5302667dc461fffc6b140ff33b7656e0130f0334773e1b66ddb1625eeb6c71a8c5af7deee36df76bf00e7f686c1d2359a84285015b410abd83fab3c818810e210e8c709d0cf900522efda8f47042b8a406f60850563dc57d1da06f8fcfb793f3066d69ae915561c916a54c1a30da982fcfb7743ee61fa799ad63298e1bba3fd08e50deff6492adcc78f770def24156aee432ea594313b458612c99118a39448842039024910d5a1085611ab22525c16b10122a0d41b0e7f70b42de24947a11f001a813cd0e7c523409a7a8b0cf8f05584f0ded2f282778ce407943424d181e4091304f00080329a00b119ea0f862c418fc84018b284db406b9da187ff17486c808408ef6f028e02f40383d1048c26603401a309184dc068024613309a80d104f7f27eaad6de779f3b183fe8c83d1bab9b0acf5efe4853fc6c771fb9996ebfb89149c382472331168fa51dba6b2c1d1823d6e7ea6ff5737dad7ea6c5eac2b3dfbefc695ff782f4ccc80592e18bcee286cbba298c0fe809cc16af897f024cf7fa5a899f65e1b2f3329d6959ceb2acf34147de752f4362ad3da9ed6c47decabeee106b0fccbd308eb9f0aeb31597f865488cb1d6d385c7ef2e1d6bd5f70a9d22baaff86171f92b7e380bc7aad97af1be22886671930de1f5c2e70b11e34f6dc108626f706f5c90122022a888263a4108a1ca76f89ce76877fa1c8df7f4cb94fedcbb6b9c1685cf4f79c2e777dd4a0acbf62a2b3a6e155f7b265c7b16a0217cf8fc94e9d9a0afd168cfe53db9046ceffda41ac77dfd859f15b89f9be4fd7cede947f23e3f25799b86f6f9f36baf3f4ffdf5ac6d2f435251cdf6deae61796ddb2c3558f64a8aca8a2ea5ebba2e6bcf791ae573ce394fa0e72442844fce86c6339d23fd596b1a7a771bcefd7c5d5b5af4de479f13e9e738ee35a7ad90f13c1f72136888218470ede7e49e7edc53fa32a6f761a07bfb79d7ccd73e722abcf0c3452fdafa399a9f5eedb37c176c38fd9c61fef9f5173e182fd0f37b6df1c965386a8bfb7a0c79f718b8f69002b10bb05ef89153c840058f0fa790610a1e57b8cd4af4929cb0021bf0233b84509222c2084aa03d13d4a0ed9017e828728407478420840c427040881e42e41ce17124e70890233f1c61c19122476e70e4e708d01123ac4f106a983e4fa424087ca63822c30c4768e05d3f55c287c80cd327063ba40f8fca0756830ef571e2b3032268d0943e8410c2ff70bc4c95990dc67b67d763e0f55d2e8d54485105cf413f721932c2ac70fa595a3b2dedea5b3865a07dccd118007719f1174eff7e107f54c2c869e7b4764648695737a9866500a71b93780860a05bda47888fcf4d8c514a9f1f3e3e208c31820a7da37be81c0461069b0327662bf3ae41102588246e4e8093439643c50d470cd5408ba0c885d59e283a1071e083aae0a087aa43af74e61008073f746cc7f1e2041bf407b40e3a47ab34edf9a1ff2f7a8c9830ea614cf7c49846d2f990d2ecc528254d8db837961288949426926a503a63c8f4b34729a595c482ada41af3e5d3ccc05e5aa73665926aef84314a3927a5b53a605e8a6b66b59ca78cb96656bb196f37e32de3b42ee3b42eebec6d9a13752933fe8c108ae2a77840e617254bbec487320425c66324c98f111e23afe823aa64fc3985aa03e44bfc3a38fdfc7281f1173b38fdac43629a7de41f4088d0afaf29236750fb6dbb62713a23fd17b16d0a4d398ee3a8673def7ad9735e1551ca51141051cae7ec79dc8bbc17b53053a8c8137157b7f4d76ad147e5a0725039a81c6aa578f1d88343201e08811df2ac725b7bdc7b9ee771ef79dc7bfaabe9f6f1c7c0b94e3977390e7bd6d6bb71cf795a7b5a73ffd5740f797c91e7719fe27d0aa7f5cb90229d92c2c9a43c9c322b545eb4aff6768f29af92f22b5244dc8f2ed59df79e97e23a4e85ccb5dded674f925f37f5e46562ce393b595fa256a8152aa793524301e9b66dd3bedbbe6b617ab243ad5ab3255bdcd76ac947e5a0725039a89cdab2aea0287c001c0205fd6476ce396b62e0b156ae3eb7e14e79a6cd8de336ae9f7ed4e4875bb76dda7bdb7bdae7903cb630391703afb1f1deee27958cd789bef33afde5a0b6bbb0fdd671e0f9f93bf188253cde9dab2e90cdce53ea8473c239a97a0e7a5329f9b94be5d868ce39ef9e838e4a52ececed73dc963d6de7a0f7c4a385c63879da99e79c734e8ca9bc57deae011953cefa9047f990ca1fbccfcf215b983cd2fbf0e1dd41120e8343a01db078f0e3f200670742f7da0fdb1fd5c82c6b7b779b7b51392d341182f845adeaaca855865ab55adacdb289ca41e5a07282a2c8f045d7543cd39988e526e72985bf1ac821576346b9fb09529e43f6b8e17c2458bcf464072a249cf03c39f948c0b800380442a2c5b3dc2c37233f729b8adcfd7e9677aae7f71ebffe7e7bd1de6a8a77ddde76af5ef695a0d077e7a0fc6ebbcbc0f2c65153fcdaef3635daa69f65f3e7ac3f774dfcfbf66fe6756e9555a5c4d3eba4e22a2c5eebaafe90a6fbd6e6b756e56d5559edcb5efb78eb8e89638cf84fa9134ec42f63e2af9f7e705fcdf631f088bd689fc3cff9e03cd18987c7fd86536c8876977cfb94dd25e7fea4e2f663dc31c628770df7db5bbbb56b1f5ffbf8f4a3467e0cdc7ef2be165fdbb09f7cf08b6d74c9e5c7abfde5bee3dd4f2a7e3f87c418ef9e83762c1f7fbff4f1c41863f94baa68b38ff7db4ddaea8e156ac43fa54e3811651f5b6bfb49c535cdd1a4bcdd35299a4dd1b0a6ed940e73f8bb8703c6767bf1cc6d1cf7d9a79cfbacdda43de1702c638abe2edecf3e8d7e2a0f4f29f972b51ebc06e55875a449bf0b0f871ebc3ae1b57e8cd9771919275ceece65dcf7138f88d25626885bede3a82405b76bb4b8027e0d47dca4cc42180ebc76cd09fe9b83f2c8bdf75d06c6b75d8242e3a8a99a7a95eded2e03e3f16bb8bd2de13a2ed5bd18af7fe2b17dfe532abfe566f249c5359b716bedf30cef138f58c2b52aac4eae0cbdf8fccc3dfddaaa43aa4b9aeed3af44287c1f7ce3f62d0f1326dc001c023101720414fec221d0113e9c890e9e797ed48a67cd7b88adad2dd25a948ffcb17e0ef975c95bded669a79d765a6b5b5a56a0dff232649ca11ba5ba7fdf7eb5a592a22547a3b6e4eed8eeaee3ee2d38adadacb90d0c12a542f9902820bc46832d52a2f2a37c64d40f2b5b5a503911254d23d2d316d2ee9267d48a5b4d53a80a65a15f77909e6eed21a78266f3f67076dfe24740a9503ea444ad72cb6b98c5ca082fa25f1f5b4963bf46ee1e6d6cdcbe568dd0a2dbe845f1b4a07c70fb95f4713ffa32fe11be16dff6a9502af952e7b3d81db368417ac59e7a77173e61396f35555fd284caa9b6d6e8bde4682cf75ad094d12a2d28a7b8575bbc867efcfb90b311bd4dba9fbfbe6a3e7ee12ef3b52b654b50e8ef5f3f7beeab291893bfc6dad878fe97295377c01be0a05d7c3e2a27a2b27dedb347a9266ac5b1b5d6a2726209a3c82208264001eb8106b01f602c2802ac072c0786c3922196e800264304a600c20e4140c941550405508460c9103ac84d4c88baf2e03201ca92d7e51068090f0f254f94c49440a1848a253a967060c90d3bfe5f2c593dd12c18638c914ea809694f34285a94ac23e3641ff2479a5870f85a907c919f575825f184333e0bd72c20f29c94054daaa8685de78c97866e4aeb678f7403ffd5b2faa4f8357bd657d1583b25b7d43e7d1a5be78c71ee976f632dcddcd6868c73aef6f1bd39df7baf8449134bc986120d1a93bcafe93ebfb74b51e86ee717ec454f4aeff3dcba6fcee9514aa9f7b96edd576badd5fb6cb7eeb3d65a6bbdcf77ebbe128ede3eabac58ecf58aaafb1d06dddbed128ec67fb9cf5aa6f136a906e6dd63deedee02e73e6f528dee02d7de86d7e83e3f4db75bf76d78e4f243aedba4eebd27e5b7e1de76a1db3456b8bde1f7f3a6b1d2678bbe8c693b0c3f1cc7cc397543f8a2e717a5252874b72b4e2d0f1367b2a48c55fddc014d96255fa894c92c10104218d594c9ad09c39226ab63798026fb037ca1f47365fdf0f4ad0efd03581dfa3ad2345340581d4eebecc0ee73a636fd790394c99eced4e555fe04927e7405fa4b50f4ffbffc1a24f422bf0274d0b0d1b07d554d98fc34207c79c9dc022084d11bb725578281de368986a570ce39eb6fbbfbedf3b66ddb961f76dbd7cff2ea92a65e5b7cb37ccbb605ce7bfbf2d7d6d4e0c4b7b6667e995fcb9fe5c7f9eff7cad1b09ccb5ba6413fefea922ff1730ac6b89fcb8e9a22c2e3cfcf4e915d88bc54a45444ce39592c4a69adb55a6bad2d15b9454a4562b1521129f107542dd8d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9f96da35157a3fe82934e7ffdb69aac6bad4ff7ee70fb20efa0467f459e5bf4565841b95f792c5fa697bfe6fcd99c9f05fd15a2a73ad3c42a3adae5177d7d4b00f7fa27973bba75a2afbfe06485eee926e9fa91f46f5f497ad310fd96e99639eef3aee15eef1a16cf6d2a5fe8b3c82c58567cfdbca2e2adf0bccddb72d6dd6f9fbd2debac6d581fa1e9774cf36bdad739127d1689441f391af4455abfdeba059f29afbffadd26faaea3e95eb47b5df16e456bd6362de7bae2b5b7a85ff77525f2687ec1094ff994dd71d4d5f6e9afabdb57fdc9bc7db9e777c186d7dfe8d75f70521aa229ede8d771d455476388deeaaa022e0e2ff0f3829e93034a2cc1e36a724009256a6bc9145209ddc47a10eb4190975d88799780f04a40948ef8e9c18fe751ca6d8efbbca77aa60484a6d4ebc1ab04042d015102a2a3a2e42ab9a0f4825210241a229512cb18358df1a9add53e0ddd76d7148f514e5a6ba5f69654a0e54f15d06089bf3e0d262172d993eadbf06cbb80370d1278e45a92d3d99a9c52daa29cd65a5b95536badb578a6d4a2b99c965a5afe0c0a8ac55a7af71a1a12b82581d34e5b1a89120a9a24e104e010280917cf1e94a6fa91525cefdc309660ed4cad58ee4819b38479dbd9d76b2b6f9fe8bba741931620faee6f88b4f6dee748a9ac785a4d03f9f6974b01f2edd6df6a701b967cd0f2a78c89a3b6a4cd7caf9bf363a0369a9c4d32f54a299894d65aabb5d6de7bef2da5a094022ae7d76ddf564a279573d3d68db556914aaa3d3da94e2afad9ee32419cde4b774ca552a913ce2975e2014487f5692a6dc5eb4ef5903af1e82195c251e15615426e450a33805ae58c5ac9977b6394a2ee58827cfaa17c70fa36a2726209740bf1aa05c9975a3a81963fa9cd8461d71666b5b674022dbf435e71c561f52376aa540e7904ba57166bca682ecdc5d25c2ccdc51281e6d288682fcd883459cd47fb91a60c833139a54e3c4e29213a5a4b4788d662b17458407484b486b8b4562987ac9e542c960e0b888e90d6109708582c203a425a435c271e271f9a4b87a5f1e8b080b484682e8d084b739d78b0768fa39d4aa558271e5ad066438bcfaf2d69a275088f71c318318b5b456b1d72fcb8b71209744ee1394b3f744df63567932afb9026fb23679dac9385e0aca9b2fd32a68d5b8b225f86be7ca30d4913fd7c234d37de48538f251db29a6d9bd20efa3ed4867ee888df641f56698abff11e7947e5c412e2fec1ed031da10de59534756da8f24813043ac267be16459a369f9f53d204817420241367c0ca9353d9c6362acf8cbb76177a8cbbf3a0726209b99589dcdbe3b649eeb76d9bd9fe94eafedeeeab086b3cbf7af83d7bc3e3fcdad9902183f06edf6ff298b3fbb8edde7b4acd93aade49b72da87e2ee5a06ba296268c2756c1b8ae7e70fbb53e167d9e6bc244171c7f170463664a30d0f1bbd65a1284c7960beef5f0b873f77ab8fdf945c8d15420bbb2ba20180397a4d090091e3fd3ad16b7397e9a8d2ddeeb4a72342a10f9625d387e176e1f5befa5b5260cbb7eb5e1d6d64f258893db13f67349075d73bf725bf9dbc7d26437942f716f2ad254696ec9175b87701b635651aafbf3e9cf6d83dad47b735635fbf9dd998b1fa5aa8f52414e1fb592a6faf78339471ae374f48af14869dd1a4f8988b6f6c5e3c3b0ed479fd6af9562293a8b5a795a94d242e5a488b417512a540e6ad5fdfd3a940a9513212a07b542a9503958de8e148b9b149b32199362dd0595835205e04707520c95d372431a6a49a1562428a4282d3a4831540e4c6f5f8269912a627945ae94cf415386e5d57577e13d07b13849719ab203a0c3f2ca442cafcc6379752caf1f8231f445aafc34ffdddd45eede028b5451a4e294147371faa51ae84e8a719a897c149cbed649b100042162c427099324bce3a020d40a95e37af1fcd00fc08f864169d2810e7f0e81604ce4db2f7e8c362d4c2e6724be8f45a2bb6ddcdd6d220f9534e18f32e6e466f4df4f639ca1349d529047c8ed9f54f88335f399ef06a7cc8a14ec3dde2529346d519b83447e8a2f629f840e1f8143a02470788e5b29075d83bff2d1cf88479af0ee363069b25b1a19f9485312698abbdb8c5e2523f4f62523b4a755204ac55f09220867d96e5e04b9e031fbbe12c48b148ca1da7716950bcf84a19ff2c109c3e5ef5a052e6230868e44294ebf7403dd472f4e5f38e92e3f3c0715902ff4c5f243a51cc9901ebe267d9b8419614ce10a6ca56e2c22d7ed7048e412b9442e914be4ca309615d80a6c85c94ad08a9395272bb19521c843eaa4178d2174cfdc8c056860867d1d471823238c91f68b40cb4a07b018e1948587d37fc066b9199d77cfa327b588a31f8d9ed442fa962a5554be4fbeb2425dde05c98834d127b948a4974e62142472b1b4a4697bfa2c43585c2c44a4497baa93e07488f43633e4e8497f63f424971fed1ba3273d69c3e0e247db6686dd5d063653beafc0567c87432cf363b11f8bf6b110912f7446ca294087cbbbf85c026ac0e849f80690be450328b8e1e25b5e032e9b6449780db8d8a4b91740c28f9e64f70d12f68874e349dfb2b3cc3ee4b63ae7b4d9731ae41a9739603e20eedc8231f4495f9e49b4e833253dbd2ac8c262ee5e5736673a2f37c369da4e957cd056caacfbede767c365976d199641d9f517b81c7ddeb3f8fae42cdb5a9dced26269759df2f551129cbe087f56c7676f6ee40bd5215fa80c02c2d0efd103071c769072c327f4a3bd9932946ea96da8469616c90563d88710ca64d884a12fdfea6418dd1bd476778105d1371e492e1fdde1500660b8c189aab892a6b9cd4f25669a12123d7ad2f708c817fa39e40b7d926bc2d01f7d70c2905e9cfe28a87444779616a79f61d224990449931369924fa429968726feae225f2694907616c2186967239c4149412cf29198af5ab1e048a63ee5137d19ce709f2b9d2da8e5157f4354bbbf91b2ab6ac274db739fe56638ad5f7e251fb4fcfaf1eb2f0cf1d8c5ede967c3a3b77df775191ebebd8c99b5aaabb67ed0f2ad0ac62a2bbeb8bb8c49e50b0eea6436a45b4fe8fcdbf79cc2d12a1f5eeb469a7448532ae3e4b799116f6c9ff36f30de0ffffc6c7c6d774f055e0bc6c86cf7acca3759474e651cf9228bd03f59836941b13da9c438fefceafd6c789d2f63d27cc3e557ddaa3eb904d31df2f018a13be489b14444e94747bbc997eb44e6fbdadbccc077db9a9598d0f4a72ce54077c8d392830644208504a4a000c8040699204d2f4d52f217ff224d333e11e456595d1410c6b89932d94b1cdeb358afabc76f3323c2bd6140017c18f0671bca04ddd03ed3369c01e3131a7ff63d1b9a3270867c4f47c7d26219946c288b124564eddeedc0e5771a45c78231328b653128d9501645bec8ace2cf63cdfa314a6fce4929a5b50a0909d97befbdf70a090909090909a9a0c2e9e76c3e8d9df5e7d3d4596bbc44949a949a949a949a949a949a949a949a949a949a949a28a1440f9258420928554a48b4fd2b47d70639a19dc01850acf0019fb35b6e851318333d179f71fec098f935355f4b64f8a28f583c7e1e958ad05d25a6b9bc97e6d25c9a4b73e11f6168cad4d48489af52a9c4e6a8253b2730263e0c27b40f4660bd46d8c1073caac45e3c8ec08231515389f148b52f1bb1a80bea2ad6600543a8ab920e4a3a40e2943aa54e2a3bed875245396d9d9f9c76feb57246596bad5bb52f43d669bf59e917e19c754efb906e2a23b4ae1f0c2f6723f318e31769ad914789cac91b7faf75d98f6a57b9cd71f56544be549e25f2512b1c235da251ab5999c89911b01537814320239c702654f5c403e31a6d78de279fcac0a00c8937c8d5e8d9771bd61f35cfdb9f3b0eacb1e7fdfdeccdc4ca922f13887ca93a9f5239f9f5eb32302a5ffbfa493573e2114b909f7d7ac327bc29d12755e4e25b1bcc8e43018d0b2de778b58fbaaa6ac25c7e3fca0867bca60e8fa6c6b88c1bb58a332e30463eac251ddd5d8236393fcb4b3f541e13aa1d9c312a3da1dd683ab4948693e9c018f23b84d1211aa5dee038034e1929b5ef3e1958b65ff6da975f72bb6741321d1853597cdbbda6aa0ef952ff7ed9976da743972656c173cedfe950d7e45b4d6a9f0d97d7d2214d35452682ee35082803a716a409694eb4279a0bc6882f612d88d07a3419bce8ca62b5f2fdb418fcf859ae45d1d1623f682d3665b420208c84b910d1a24793011ee25d57222cd9e2c1c2f836f28052a1722a5e226e70771c4ba0e9f71713a27df907a0d9ce11f94c7c498a9f65199e9148e42388f08f43a023563cc74d9f52549ab47db258a71444774f87dfe7f36b9e939b29f9a0b797290d7f66b7f623a1b49880fec0182e2e222f232b16e85e79b87c27eacfbcc9f8a5dca954a52d18c3c5297552f1d3eb943aa96219876764523973fde4e4e4434e63a058daa8b3ea88b2a256b352fa14b5e2281e2e43ce0fa5e266a89412ced9c2e5f26984b39bdc465b4408489781f19e83f213ce2905b4840f20a1a1938a475297bd77ae5c643c3046bac873b5ba46564774afacdb0aa2a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a767247b40fb3d70c061871d82f4daaa2a18e35ef9598691caae855845afad1b9952c9b3ac98664e9ea7d59467ba598c6be539bb4fe30cc8956ca0a5e6823173f69031e1f14b3eba57178f2cc819999c716555229fa00486307e6a10972f4b40aa0e8c71b98c2f6195498b0c9e18a8148e146739eb148d040000012315000030140c87c4428148308f352d8b0f14000b8b9846624e1909e35914c42808210a8031c00020006000046484b40201ea55c06543b0e0be64b0eaadaba9e8c9937bf8c8708c5746b3fe3e0523f8128960b950c0fe62d6a4b782225248879b80bf4b403e33e71442ff0b0f5c6099ff13724a5d186f1b0cafbcf7e8e052c6a7ecc4a02589b13d4347df46fe843e15ecbc0818c15a247497e944c85a9a7bbbea3cead0245253dd608b08e9577875d1826678a4f1fed46303a11620e56825c22052f142d250692ccadc3ac08c796edfda86977c1e0ce6549ee244657062761900fe8f0d478c03042f0903198136c117ee281137610ddab6e2c9acfb3c5b9ee40e34b2d50757c865baa096a727539e0205df4ca4f83c3b82e796f7cc45b1f0647f1be0949d4ed9019424e1c7c337dc30a07da5e3104cc661301b852d519d41b3c94a41c53fa52ce4ad84320d77fa6de301a87612d7eec68fcff220ad1d864baf807eec1478a96b9df16e6d52891401c7657c200488564e4b90bd2e51b69922017490df6d9aaa257c7aaae1431d55b3505e75f7c89f5fe08919fe961a41f87fd034f3f47116f79b487231c7bf0e967ca89cb9c686057544e84f858936940a78490ece0d13271bdfca4823c90626ce38f43f44f458118e1fd462764afa997fec2377284459ffd71f37208c4cfc39959fda3a69e0540f9b45c0df9650df8bc5b1d5f7b553459f1ac1d2442dadacefeb0afd35d17b54d5f82556c15d6297e6454da53fed5db4658554862c244d8766dc3e2bea6ed237c3d72087c532302a230890cb47fa59f0ed8c209e300272ab66cf92c93ede8197898dcf483a63b1c5c848c6484a51a51abe7b38c28ce025b84f3b32378ca7ed84e58de10b60d4a4c3d6b8d72691b9b3962ae3e592eeab9e2ec4343ddeddd18c92246b99889ba87b5edef8ad685570b68f0e14b805eabb7f9aa853e913c97e3e00d7b5d397d61bddd30cc76acd0622cc13648ad8a91c4098721019a8655f522391201114e06071e0d99232ed784d819142b11f2c32a54d79e158ebac64f6b9110579e5f80b97680beab8a685f9e35c02926a0087e94098df7c228a65b98d19fe9537111da90531649b7bb80044f45ef91ed97baa5c06a4056ae53ff3e65f6ac6014a84fd93e6125ae39c7fd6dc9a7432b6b0f557fd93d4650887ca1f2b35ace131655be593e2cafe53dda30da4e146d84c1a6a670404ccf90e090c5e666db29c4d1f0891d95f189ba3af6a77728d53f6f9a05d0805141e5633365cf30a86c9d9ccc6e86361af8aa69bfffcc35cb64b605ef88218dc9f35891a414f9936c8ac89062c8a2a5a408ab99d11b6aacedb23961c0f2d80617789ce976eb41ed1ecd6799df41a9782a3ff378faf5027051a3ff971fc0d3a35b85096e37f9167ffd87ae0f87dfcd988c89b843bd8fccfcd5a8812e6dd370417cfbb57d35885ae2a7eb38ac7497e13bd15ab5046f9ee4097faa03646753a090b8f1bfd85040b428cc221a3542697ca270a09ae40fa29094d0d712cb240694997be14b4993ba1574a5545d2d1b4ccf002b3e2a8b85e15f08b8d41639a997b33a3d361160b7b7c4b06dc7e4ef4845cef7dd02f7e1c493b4ad27030ac63117862f7fcdf0974527cad21a1160b3112608715284e98bb8e319715a7fd5a9c3956a2ce2e2cc4f04ba5e2cca0f85f1d19a37c68e0b14a2d54c0174370a93bd4b209ab8c2a227e63770584718529e243ace9b107f068d51c3a956a7c679fd4350849909c62d368426ce8d28f5fd8fc8db82e193708e6ccb5e9badc6478cba8ca342fade87666556c0abae05280e4d1bb3b961c12fae71775e7d7bcaca8fb7c57398065f80892c3ff2440a4b6c755bf2a2878772aab509845b1fdb4119df8c5e9f36fd28bd86fece1246c8674a012c0b04eceaba4404c5996f7fffa9b722279c7e268b2beb8f2f67837121d5e09ffa01f2fc5167a28a3ad2fe07777164f02b3e3cccbccc83a98a0edeffffec915a519468c17ec203233221b40d9399c1c3abbb4a593572fffb334a6da030c9dfb53a260e90540d4d836f38acb28fecad22c5faea6ebb2c541cbe3fd55aa75d19ccbe6f4f07e6ca6e2bfdbc5a0d14976ec695b4a00c66c3db28e6bf5ed89de112de7a79551797858e6de3b16318e1082b57f663c562c14fb7d552fa8120c2a571c94ef2596260df0f73075f2d4583210cf6557e8832bddb96332c68e8cb0be5eb6550a3ef3f4dda1101062f02c1f4409f874b038fd36f566de794a7d3a9006982e29536dbc20e29be4d705be497248b6f57335a6e8c8458ad32b42b2770d34b75801fde2afd328b46d78dfefaf4d2b80f776344632d007c6cb8c7240540f15992c8cd639d7badfba7ad955e5c4325ed12702b9c2a3ee9e042744e0a035a4a3804d0960243b7cafed2605d835baa61c909908f2806fe5b16641a016376b6d1115f74a138425f576fcc33a35bb6f3a1a58735799be5f3e9a6179230186fc2f7a4831c6c1b2ca522bb5ccad12893b219a604ef48001b9045e4b68f3ab9cc79a8babb3c31d2332a8b414e6f6cd9221b05d69b1d114f29a6cf6ba8c687289f03a9145c0b7196e5f9c6c1e0213183d440d30f5c543f92860c1be8477d440cf5ccb2989deb9dfbca926287ab12ac094ab26019f79ea8a107cd34305bc3e4f083ed1890b5fc53ac2ffcf1bc6627b92830883af561842be037adf3c22648555468fb44e53f6deb5931bbb2340b7083ea7542fc0a58e20116737273f70cc9342db04cf6ae1887255ce36712caa6732326de53d6bd507e654115ed3aad6dc635cd9446b930ef7d54e609dee9b0da19c32bcb1418e92e8136757e90afd60060e595207cbdf13c312bdeaef5d9d82ee7f8a70ca3d42b6ed11994d05c07def194a3aab0624e2b5bd490eb30da436a4b5ab447e600b2bf281b8e2ae04052108872dca98a9bf18030b66b073239da7614c3165cb014d0dc90bea1ce5d8a835370a0ea03d1a551b629318564bc44627b3779f7a8b8931a8f1f7a8f960b10cedebb83546df96ba1a04cdce8fa127035f0e083eecb923fd05e10a08b69cc50990e82bad324c2ea05e141bcc01614f9d09d21d59152624991d50c1e9e6f13119a83757c25a4f5f1974a316abbd734501366496c770c19ca5d8aa44c97202fae1caf980106d73573fcc04fae68a6f546a03d72e47a9dc332b8294c64d00c0d30b9c5a458f558a7e5c79e3720ea4fa7c70c971e303dc74e9cb0d0371f9f49a5e62d4c0ec11adb937c09976e3c92cb40450bd719ae60121939234d089548288547f80cd2c3233988919161003a9d0e242cd557d17703479c67934f024ba3d236766b8b7078b39cb3624825416386011dc46d31b49c8cdea33f540d750c35c02dc810aa2f1bdb15b510782e54b3c3e9c070c30246068af498016cc43423e835c6210ac5f1c6a791fddb0c9313a522ec400c55fc1f9d4668edc3dfcab1fa31f63eb962b5bfd4cb754408261b5262ea55360d7edcf90d05d16b8c8cda439a306e62f7351d9e02d1dc753cf5427b6d6a0a0b5992371767f79d1be356b93d9f42f74b0cb33fdf2f5253d4974ac27ce6af32380df4c24fe3ac9c05236dfa79770a9157fe3af106ba8dafc843929f2cb962af7f35dd33f845e036582bd3443afc415968af85937c3823b80f39c606c7c6233ce2f8a25f285df4d3bce031a733eb4a8f4337cce6640eb847815ae1b27bdc14a982fa57c60a1271a137cacab05ba53e2ebdccfdc6a6843abecfc6430808a8a33e097149330df10f056b1705a97ffc8d67f010e86f4976b0c003544d7d8e32955da570f77c36b546b7923578feb44e075afe9b87117e19bc54b882348c0c09ff0e827b1ff1ae52e1421c0b909a9c00d80647f9ef5f49b37eea43b81212db0f41a74bb6b90c9a9d4ea6d5f5c397aca8c5619a2810cada3c2dbf1ab79843962d8d2da3066563121ebe1941f1d69123ae3fa506419213ccd67d8690d4cad9c5431f20a79f8dc384459f93f02d682f5e70e10a625575f53adf4196307b37f268560c23cec9a294cb00518d998e2b505347805b7b35c4db8144f5ba95a3e2aec8854e9e64fc9e01d826b6ce20c84330590417bfe60a2c5806ea0b3211c4ff8de40c9a5875c442e3c6f290ce3a12dbeccc809e5b20e5552c34fd816be415c56d54bcebca2db31a1896a25db6bf9948758d2fa079c805d38a0268284a8cbe9120305776991976261d639e6237f7d1089e7f8a8e49d0922b1f715e05c7f5a5089709c1ba346896a5e15a5d06d1d076ed21c9f26c7b4e676fab72270a939b50f719a7d449bfcce4878ddd537c16cf5f0e82c3b80cf7a189744941e05ac02692b575aa7fdb12040cc5914691895d5cd36b0e2c5206c33d8f5b958827c0b7fd99a027b9c0c404ebee7f2608357ed24061ad7cb1911c55b4dd3c4f5a12ea0e6c2a70a013f9893cd5dec85370634574ec98418f317a7dd834e3340ae70aed3e8cec5b62556ece9898a10976a79ffb28539287e13f0c43e917a33063d3fed0c569698781224a4f3509f362518c9c0343a80863f2a46a926e416ac29998cafc9775c1e6c8db191640fd8169a54fc806b282d9f1434ec016a2b10e115dc4416cf86c82f41ff4e563a1431bf2e50ed0a19961f0b4709bc96d9313140f82d83ad507144caec3cf56b94f3fda60f2f41bd25d59b92eaa3b8de140407c82be6b36b6cf3169829d6ce61873913bbe166b90b7cdf207c4d743842b8ef411858049b2fee049c21a58c908afc9619d866e68c0f2a47de35afb585255f6698dc4447824517cca13e53d028c0df62a6166618b6e961fc4e41cfb9249d4c0b34401471e3376a0b480a3aec4152d921688d5d473efbc4c5c201d22679bc6a0366478a0f7b1f36405e35b2f4873a9b108a633309e23907f6648553f87f9945a33a0897d1a6f704764397bc5559d22a8224b2d334b0c31e6b4b0f713b5531db15c06b1bb4b88535099a52682012bdf81f18476db585acc2109f3f0edf1acf1af25be9e37fb340b7edf64bd1a183dadbb54c72d15d272a2aed017e3a69db3c5693f57f64b6233f9280a7914f18a9850ed9c840add41bc2b2f8faf68e89672729a18affaee5df94a0bda81997708a311576319a8dbdd1e89584f5272bd36625cf8b26c9a0fa5bfcc348f70b18bb2377a0d6d89676d7c5707e25470c9c3de0c13f4f730e1d35cb9307bb6bd4a6a6bda8f5152136aa1c41e2468b19d1033ca000f20ee9ab5f84a7d3853dd030185ddfb3b6e56d83ddb5869e0b95408a523bb7faa91325bbe86083a87b5b40c9c7b82ca82948f6d2a42f1cd555df05b3eeda583b48aa0e2ad3ea450184867334c7bd8c6c4d694fef079f7123a9567d6d25774d63b28a455f0cb5ce6049465cb4f3a5f6eedeaa5ef846634c708472fc25126f8dd4253117d6015170731ac1e3b8e4c1e79124b72259b17760566ba2025e69564192ee1ada111a04177b013f0c5381da8f8b31acc370c0ec0e129972db9416b2d09cc92881297c1ddc2ad925fcdd053ed87a58f8840d579c2cdd0f9c501382ba46236d2ed053635ca73b7c83c0a9267c2f249a7173c5b4811664a80be90bf71b17f49e75acb19daab4556a2060de4c91edb637a659a90200933dff7f194d619389c9e5fba90b798fe6d4935471eb3d2368153af2b4dcd5228046659a000f6b32978342f2171e3c97ec0a49a67fc95d770509418e3bbd8fd406883039836fa2cad72b378d84dbb15e616d83bdfb56eee15a6ca8529581ee0d1ebdcb1b5e4830c5eb95e92f6b428e81771e7d13fdf58fa42f86ee6d325589436836fde159cd541d0bb3536fd1140e7ed41ff3ac207005407ad8e8fec4efc28c19fd56e6170319e581c2e8b1166f3f12c0f7510dc560906d05ee9fdab1b6b7c76c8151e03d023f7170d4b1f03cc0b5637d76fb9d7dd9799efc280d9e8e5713c7fe69d658072ac5c60df03441ddf16ca7cacecc815045bcfc9e49f3fa2d2abe563f7c841c26192f6cfab812ebf35636a9080f2fabed5f28a562d048d10ffc70af00fc94c0397d1f8269c6a7bbf9e5804cee8f2204b43780e160561c27118909f376ba66feb7b6b5510ecb125875c831a5cb82664ba761ec8f36a953dd6ad22706dce3df57d4c2b3e56836c8226df8e673f39f0706f15274149d5c3e722a361d29e5bc7b58cd28375038955a10162264217ed4a621e5977dd1bf9561baeddebf56964536a61d67f1a2a64d372075267c9caae77e80f5a05b8ee8c4bff66e0096caf881af7232a8fe9b3c4aad3ee382fd804cf6dac8be692f6a2f5c06d6fbac5af52c30a7023bc79b16ba14cd131ffd20442b4a465b89b471862025f74b9d6e8b03f438bb86f802b031bb29cb6f064fb1a70c1374e5277206d62cfbcdcb832d5d8f916f46cba599b4831e3a80f5a31d582eedcb16b6ee7402638119cba5c4fe06cc9f99b0109946c9e69641640e6e8b0908d0ee6b8c388ffbc0c2a0868e51ef50a8f2719d1c456e813294863c9ad7c3ab9eb40db36c725b3e18367f93901f21f3212b1c624ed99c27b53c4c3b34b7c75def0da124ca7ff35ee526190d199b32e2c00ec6de001bb78ee14b00a3d5337a374ddcda46dea518ad2ecddb9423d4337bedf42bcf7353d7a20d1be1429c88bc5af16e0a0e90f7b3a4cabfc3e1655791d30b55cf9404eddde68ac541caded0a0f23434ffbf2ce8c9eae219412d038b54128358354cbf28173689d5734ce2e7ef71da650a66a09198e064f46ce6a526ca8b0df5a5b03700c8f258a63c9e24ba74f96b636b4319ebf56484b92582296df1abaa08256d1a41dcc586d2076677b1d28a1988c9245bb54a2cdfc8883bfc10874cc98ca1fa02b8aba8d5e8be8f357ed6da439737a18adb3227a50b8d1a7850f03ea224b3096b6c6d1279f70677788cc4f64d39a0b8a5eea4aa264f00b6a97116ac484ae94c3fdc16dd5430ab445f0e690f2ce9419e6ccee947398d4f364782dc59ea48014ec153b5ea63c9a794be79271d5afc2384eca12048d3b38f8c6cb17ed617fa414c16476e45196544d22b10631890944509f1025d1c5f878246ce2e3f33773d08233f7ee16fd0aa3d71bad30731f2eec445aa3ebadc04b5927f17abd2c9f8daa9b9e85ebaab07ee6c00294af572bcb703d307d9d01fa4c4b0e0683df6d913bfd1cece62296b6e82e38019e2c1f10ff3e7e5998c5ef094c6a5cc37618f0b173637ef64f361d23079224bd6349d868c0e823ee564c650fdfbbd0a367fee59eddfdeac38b244c8d0398ee1f18d1026d0a31a5169f6f9139493b3ec6427dff633270b11bcd28fb7ddd556471c0345ddb4a48c69d19aa21ce341b5e452b6686c05d68d8b8622c48c41241d5d509130122ac4250230ac2b8e54d105b33835dafe1253e752832ff7340bfb4bd3390f69221235ccce93a1a10cb7baae093731d0ad91dc882462345e620bc496f5255ffd015189f00e2d72b2182e4b20ad2cd82ff09f4a073696004c6a87ff6a7ef9864333f507cefb3a2060cce27f36815755818029816176825c552bd046145ccff9216d791a8df56655d730fa61f97452344181c3b05555fdd4d055f154d56f4155d72ddbfeacb13d554bd32860d954950f988994c11c37dcc5b33faa3e4e7081124655d9e15bf6923b562dae167d186442e8a90a5ba4bf5b43339cdca7aad9db3d5654f554c3cfc650c7e7aa50d11d6df27e508da6a7570f150d7722069bc43962d08c885720ef1867aa76988a387eb9b57db80900b15aad788a266fa37b84521da6be8a976afeb94192a933a50ceec7013dff47577be503dba4b5cc8a474a783bf9a9dbb1dfa0f965c6a9942fa4408c0cdfcdc898d471eaa2bd96ea588dd46fd21aabc9a051baa3eb987b912ad63aa6efd31855c3265bdc967f8517befa46c58bb065b21a55bd15e3cd7d902387b02e9510f87364d6030d0eb469682c95f9e000de083a8d31a69428f27bc2e45c04e436db7d83b85a4b4c6755b6e3b4bec7a005fd9e8e16f32cdce70a8f184ed33c248c0ff4e30306756488f6060001ba1cd098167ab9f47a1dd53afec73bb9b6580f9910f53abcf645768b079a88891e7900bc7d643ce9713a32a163ce4a9f3f724806435fb7acfd7b6ccee7f5e4359a67b55465d5101750e5375192db0779f60738fa278d5262ad3287bf25e459f4f272fae1f2e82dea80d54fa24608b74943fc07d1aff980d634f8630b2d59e7922dddebc63a77f0d7f4e2e33288702ec6badbe31454c7196d34b994f0a929e91e22934be93e30f20c755de4b7a12ac4eac63f45162e545e8c1eacdbc5140abbbb2db1e7c032d00875456bd344b6e7d15a41154a4ae15e5e28f90b96066f3fa1e196340c340f3091cfebbbfb74e3089f5860a710ec9681e435a6bec933012edc163ee8c4ccc251864e9f54b591d773d47c83583f63228b795b9f3c23c000a9a4967af194d94f92e50eff1b9816c6c4f097a8d2400b9e1f8b52b0597479982c9538747bf58e62a7fee7b176e9ce7ce0c01b971102a22baed72864f83674e8c82b40b98cb37538eba0ed3cf0f407c0739c0db564d23e3b4f2cee3f87f15b7414417e14f880cb51e4adb25eae67881b688b3c55ca1891fe8a7e1c024040c350f5939bd28f740d8315556e15ffffa85d98ed610c3430071b1675ed986df56121e365f422965863d7830c2e51b6dd1db36a83e3a54b09cac49271138b84522ba15a78af585e7956b4312365cc29459afec57257ed0911c03396b770ac599295785377f4a13f54dc582c40aa12f480f039e6d27fefc844a8aef55bc7726e6a1f0bcb278c77e3c4406b2464616e868c2cf562e383824b6511f954dd4bc4ae7fc73f1e7c76704337b64912e4877d2cc66eb8c6874e7b040e1f065b3cac1993c57849f0d0f94b9affe3d9de89695827797ec5ea53b80ff2ace5d48b71aadaa4ba7cdd952d0052308e57aaba85b1b3895c05a13ea0525d155dca09a68e001142cbfa104fc62b87d47a6ddaa76333442887a31c5ad8e4ed9a852cf8683c3ac3c64752bedd15327e5b4ab82952209306214033595c50d6e748b909eb4b8cb241fcc91a8d38f0bcd89ad216b5dff24a659d2904502a251e33865aea3a711343c9fa888ad9398e7daa524aa334843f08f650522f0801ba3a79761175d02262bcdcc6f8342eedafdf8b6a07d9941784ac2645a6fd5fd7da911bb2801988cb524b8383650c618ae3078180d4e88ee6c8c774032f5c46bb104133545a0ca32b488d98c6e741a7549670c8bc731aa144d3fc0d534cea046d4f77a6e11ebac404db1497189d60aa3091e7f461a8dcb9906999e3680b7f923c05cdc4c5436ca97413866c92855419c718e6af5f3b7d8715a28b1735a9e721c318df0170fb5ad49c60013cae3274fad8453618c216cf1416113dfeaf801c0e64ce3435395fa7ed89cc03f76c43b2f958906b62403e8658e7680967bd39a8cf4c6d6f601fe1fa3caf4eac4360ca521b30ff39a0fa52be916c98f8c878d9d02c5e060227227a35f7333372c83b85cd1d71bf17bafab193fbc70d8fedcfa97fecdba873475d977d946c71d57a639a1e98b11ee2a303ef9f4d5bb745e9cb088fe6ca10033f9ab01fba150e51720e59d71d4247c0e3c03349cc73b9c0fef5507f034014bc8c6c286fb600be9d0d28db62dbb91c59d77a1aa37f6ce5ea30cdaba0a997549fc77927b0336b1af18c1cc58b1ac04475830edf1ec3dd03f2573e3d815c9c9f50b6c88d0ce0684230ba817a251f8fab36238049a281a8fa574a1097e61f9d76cd97b8495a88ef48ac2a3748070f05746fb0c801d667d048006fedd20b6b0175b44cdb1e1667b615796e677b737c3b8a12935e5ce2a81a558f2943b2afab1e6925f26c11ab375ec0c6409d9056ef3a16519d3addc018a6e8a51ca5f774467d5dbd9b815693b2ef66e615e9d5bbae83909afd8710b7b93bbc449fa2dbdb99923769f4dbe80a86ca31d25d4272c53e550de8f1b0de2e961a39c0dfa67d588f895373ccf81bfbd58eeeade9588e3dcf88eb041c8d61204f5c6d93ae85464bc0cf48ede6b19e273cf0f5aa625991dd6685d6e38f57b412b4c046a4101a893d75599cb50f1925251f73bfadf37541d1f0e50f5a1f96651a47e3a65b5fb384c445a0c6d37b28d3488f500bd76cecd5021cafb490e5e750ca9afce6cd3255baf5e9385b2d546df878e2650718fffd9342a85b4839e5f4561028211818e21aa9d256b7a0d0c03805b7f5446325202c0a9da1d0c35c670a69c10263f92737998a4573788b3854ff33d018930ca18391b04b95acb64ee84e3dee4c683ceafcde699babc45644d31e6d65f064c0304abc3c72e057c86d045a32f6d7d6a88ab2bdc7537026b3213f351e4f5c087416ca35799c157fdff014b7739c98baf17086bfeba11343dae7821a4d35bac59e67901792f518edbbffc89f21fefdf8e25071921ea622dc71ffededefad9c0093a271baf23f7c22062012b29d44bced6018ae359f8b09c8c815f99067ba08a1600c851350633b5c30c90c9603e70818002b96c9f7808dc038f8a922da52e6a9312f89f260cc1372d728b3b4c76288d946797b7edddd4ea9dd0bf9c5e8f1214cef0e07c59605896a499a6ae7dc8449c43ae86c32aec7e4b5a7b0766f55343f62b4c4dfedb0c956bc6acb2fd66d8802bded133d356c7d1977349a8d6cb6c5d6fc62cb108617944c6ecdb0ba8a22a3246c0da1f9dec15987160d5d0d59e497d96f6153f41e3187d1f0b7b10e05798c90dfc4a76ede9d882b424835e9013b8363f92631e59021f7d1fa09c48719ce31737a45d88ca6d1345f68635cfdac7e6babadde16886c3ea0a1b97c8e589109cee1f445123b707ea972d53cdbc8928fb1b1298792f3fd08fbf71fd2dad47e45a65af25819700c3211be9fbb945206e50f2f64ccad1461a28b4599e7ec5de1468da67f08ef87e3b598447d7678869606eac57229f1c2a6486c9e6f63ed7cec14462f309ea66904ac823e22d1517d1d199ee2515ef0735348915cbb9d9653cbb6e82bab9f29d3834c92dfa967431e962a13118722673ff9d415bbb28546aae84369fd34de6b88fe906d583ad670257358cb3c57846d491e00cecffae442d5b2a292fd06693518aad04b09805982b564c75f22441a365203cc418869e10f3fcafb46a751b5b9be32820589af7be8ee0a035b074199848e6bd0765e60804e931b6b58cc29e7c9e8171c01067fd60aaae86484d173367907d373b7020f063e18a9435d515c62201ec9faab61b6608cb67429202206c60884060a057a918dac74804951d5db21e9c7a25b42ae6cea513024713ebba6600cd94d012dce839f201a4c018579e432add3a72f6c3daab743bad396039755284851100c67f175ab608d6bc52133a7aa70a4b0ecdec845499eb69c5ac0182584234861f90233c945e1d212a85f5102942e85af395f1b44c3f3fb4cdf8690b7a90ec050a7c3e832f3c9858214a07317a30e1ed3aed6452199909e39d4be7aaa362b46ed38253e07ec08462e2c4a8b580c4b7668c9bafcb38ef706f0049820fece89f6c5201eba6e15676348925dd1ca5d73cbb9e07d4b84b0a01ef352f1050c04d61171b93564d2e89ee0d23c308bc21c5868d1a4ea082d7122bbf2c89a10cd091647549cd07685249bf6aa75a9912106d703d686761da182e523e03351868220d829a059b1125976074bce44994beeb61360c64834be8e12bfa53c861969c88959d13c7e4ca96937859e8a3b61cd148c2dc591552c729b0331f871dbfaa0b3f18f11f2e40386b8cfefa58290070ffd8c4295cc83f34c902e309b6b7659832635bd8a1082281ae87ee13521adf007353b93a14f61c8464bc5eedae1820e4461dcffd861efed604d46af090182e854d6acd02995334c1a0062f9d353043e8a375eadb810b220d00fe688a78e7cfc14ffdc53de1b8913b7fc99ede285ddac229947174340ae7f1cbc7863f55e2bc5d0854e2b0c74ee770c44189488a9d4f6352d95f0d39b76e3cafacc16c1cf107a826d5172cc04d2c48503c04e04f0932721ffcc02ffbd317f5f18ae6fc6d881509a41c99c429482c195ab8c60a4dacdaec049c7591acc51cd5766aa54d056d5664274cc155b23120dd52c67c804d3dac995aa2465bdad527b65484785102ebc0533967b5cb6aa511885ab349802415c010ff0377f9af239518832da5526fd503513408b7aec94d38e5d4855010bf9dd897561c5fda6ae03e963e7830ba31188401b8ed021e52e2642ca1dade95109de359bcb90981893a8668c02a64f812f3422b961b94a237b4691331563e2886c28bb965d53b1d8ec9161ab30b89730c16f674157b0a8e6900efc74a1c2ffad5612dc609b37f6456aa804bf48ff7189ebc4e331ac8c507434086a19921ba880bdbae7cc0e1273d8594d51e2c56efaacb9a19ec405500bb997a9d0e54ad3ffe9ebf886beba220b6971a59aee4c3207e952928ff2f700465bd5871ec5be0b74b502bcdb9ae46d950a4ffb617c73bd683c77006f3ced31d2853b2976681244eb5b10ea6f267602260078de9c0c7faa549a1244752ff3500dec6b76db70e9a6101f37afd5d5a6e38cc851522fcacaf6bef5a5b91329151a53e6deb4ce0a04afdd57c57e80329622df6a0f1de1a30af5b1216960f1217133062c21c915d65818eb29b8a22d158e58a33c49150f0bbc0eab016941fe0a78bc2b42b66078e915f0c42d2848df4ba59b33be9cb01e080e5a18de6b8afa80d778347b5318ff1f5462f4d32300265482e977564c87df20a9d42da0c13cad8831ff79b83e1a9d824e6a54c6994d11232890d25364dd6dad8f8a84ab96ae4d39aee14217709bb34f53f15ac542daae9e7b420f1acc69deeb755e58c8423ccc7c864e6426f3868988d6ed6cc50173d0cb140823d2c7ecf539fda29a0ebea6efe9fc5a3365faee8fbf831e04312a95b82d1d6a736d25d5fcdb24efbcc453818d7cbd520137073319d4042731721d86c4afbc8be435709d42101ae140f31c2144c6f4f22b9c4c434c20f8dfa33059ec223fb5641c6487ac7b59c32fbb98d44e2fe947bf71d9eb77015e2fdf0159869f537cf48d27e2cfc29dfe91901520fd1d480eaa18d174aa94ed75e2a00e6d942ee3c7ad65ce7f720d0476667ea638446c14981b641855a4b37184457b295b8ff76f83c817086b9f4647213013991a092c114b8ac51b8cf423450f1a7feaaa6835e5812abb77d9e9992ad6ceecccc84f9629f0c8dbb43f9793650eb6661441b4583a50f72f335a41b8ca6d5a4205dfe25158f041ad43c55530230ff29f0bbb1971f25e77a22603a37e684a57c06f456a9f831c4a447d1a26751a8740ebbea243f205359b8321ed385b1b437ba6c96d07aee89e5b9b14eb065bd582ffcc3fc65497735393c1b8e5e74226e8f2efd665a24b5092ff0ddb2e9e6618d4c3abfa078544c1a5117443e67d75c0626908cc931cd2a9b1a64b01f8a9f32d645ccd6991309d9fb558fde828e08e609da8a2002fccd6c04e00e843e280c142398de66a578fd1510a2782764415009c5a010b005befeba1a01996083c606f1668808def002c8651df3e0d9ae2969fb76dae441a5403467bd2832d68478f984fec266c4fd644d054a84fb16ca0bfd8b3a8e7d938cfdb984bbd792889071b3931194588c5b1db856c3f24fab9f5c40ef770ddc936b8988c426ece2874b2ff244d61681acae53064115bf5f8e6183428482dc99d511c5a26db4231c462b95982b97402386d0c1825868c877f11fe48a21ec4418d4fef9499928597332102ef5ec61fcff87bfd9c880273146fbcce69e41fed6a99ebc9261043cb898c27687414cc6bf91b638429563478f6aac8d132b4c6dadf8eecf45a5a792dfdfcb1756ecd5c957acb02e9afcb477b5754ccd24cdcfb7b6ff57a10f433e26a367d25a7bf31adacb81ed2c65f1f56bbfe092414b128aafa1b0996a541681b371b2d2d9d287c15207089bb9643762c6ba92bd5af3c123bee18ba44f6247d28ff1de483f76166ce52b10f62c9ee1cddaaa415d313da251512c4346b3100e1c13e0774ec99285426b4fbb7a5274c3efa1c2b90abc1f0364d6c47c951a7bac5c9b02707595e063dfbc4b536db65a22f27591967d6cf11c6c2683e298dcecb2a48f789fa817a75fa621df97ef56ee1b09f1562ef588d54b8f76a24503c74fc74a8cfee83198233fae1ecc6e10e77b195c8b0478f84fe6555377a98c0e012c2eab142c33c08449eff484e9af84142b62e4901bb6348c55322370ace6c623742ee1ccfc8e246ba0119923fdcdc92088522efe08147a8be62ce0957d0f39446ce90ee902df3bbe32b6bc1846d2a1a747e1e9b5d41977dbf92f56c170dea3be2dd7199c629016d5cb0a8164c3ffbccd75200eb73ab1751a11316e99a5daaf7a787e79da81dd2c5627ca5f746d74139bbb810b0235e4c2a21d18ed97912653d354ed36afe8bf903eae3d46a01d47ac3193b2bb7c72d4755dd46c6253c804a38320714f0e7a48fba1d1dfc4f499679eb5d43c5be063065ea4442e0c112c8507c8c0027505d32ed37a20f31972dac2f78f927de2ab669447adec9e6d9813e86d0eab8c9add5d41bdc44a283702002b7c85473cd20afd52f34fde73265ec08a6bbcf0257c87f48e5a5e11f7429645aa558cd565842912011ce559561f1c700e2d7a84f803ca370681a52032eafaeb386151cfb5ab58f0939eba034844cb8975f09905109a799309e9bd9dbaec08efe8670ce563ecf8fa59107eb8f7fc313eed1f342b7f97e9fa361db571841356ef2a6edebcdc32d3d57f24fcf86f0d5e796e6dcb0c0b9da1520c48db93e2ef6ff431d44b852c54d9dac04ee8bb944451fd74764abd613d22e5c7f309f8fedf50ae0703f5a012adb75368829466d18ab21f4509bb1fac4b022c188db511ffcaf07bfb6f2a96918310d26637e9a07712732c7b9fd088f9d0943c40da5261fd4840c896d3f8a898864c8cfd4ccd4d8ee7ae463d9de3826f86dca99e35318e1d8e48fb9df4d975c298ff352bfbc7625477962b98c79a815f7a37edac7d573bc6f9c6cca765945acd90bdb7eb066c3f41bb1e52a7d985431c61c1c7ede224aa34044542413fa525fa67bc22210d3d57e6611ef9b7862351fafca23fce4652d2cce058cac58234132765fc3e870d70a49789302833345dee7d9fbe9af5ed22c676f295e98c8d06a1b69dd5821f5b58bf61c37e797591b0d170357997c226fa36eab137b98c5c65f5ab1ea18ea581ef48485a95aa44a6a91701d51403ab511ad949b7d4d2e88f76b078ea7c0e505a5dcb462786f50eda89b90b227da7ad09be98ed5d0bee920b972a8b0fb991dadc023dcb74e275ceaac99889f1984d601d6ab28174bee4f5b097be1808f45663ccb09e5e2cf1955902db34c9efe54e12342e956431481100a8dbdb2f89e341bcafa633f1bc3da4abe3969e1b74e0457b337e696e75921133fb0bd6ba45c4b7b32c30119ba6d0f67530654dc3d026296d403707721e95b8112c05263a03351ac69ff497062ea342533fa0085277409244eeb163db11a6e931b09ac6831421e2c76a76b8a60fb96c4dd2052e64406e06f30d69090f4fd85a3430666887d65a2afa8a03b888d0f6ca1f182881dbaf6062c90c9188c233665f8cd7c75e1904f71ff06560ddfea49447840eaab3bb952fe45660e05f78a559f9159ad5ea2aa1cabd0007ad8ad6973fe35a35d127518131ac9ce912933fad65545696724552d37bb4c35d55afb09585b3bc37c5d6e7960b0114cf1edf6d13d41b9b56741827978c6b980ae0370b1e4ed4821d84f2751da931cc05316a22507a8517806b9fadcaa31a11a1b982617a8137a4bd2441eb4c37a8ba9272e0ab7f31c426388af12d2ac3ffbcd5fd22d282eb5b100ecf7e1e8eb0ef8a257adf683fa2a7d3e38a8dacb931ac43e1953a70776adeeaca2e05825aa555d1381c3fe2312079ce93b09433ff7be9a107ec2a8dee6959e2cb006c83dd754b252e2ae23ad42e7f0df638db129cc91837b3047bb1ef3bba1436d64b25818fab7c00106b50f85b319e73283f60d6501e3e7cc9327e1114aff4ee3dc6789dd58e08390fa75cea1b81e7092f0b227d32a4a574e5f3da4a7c4bd41710f430a46a5c855d987dbb3d9f32b7bd30de8087422ae5b5486f6f318820bc530b10eb16cf01a06bb99c9a5abd6ef8840d787e9f046c5e6b5cd8b5fc4d7c10ffbd46cf838d8e415f891e8128afac16df381ed7173c422d97c0c698c58908de566b7554ab339391fbf31d26c71ec8f0bf147d0fa69b2c2834a8f366e46192817fa791384f56d6a543b9eaf671122591c6801cfa412c9247886c8481fc73732f9cd6f38f2e6565ba18d701c8b5630538e764030690a960436aba51b25eb77585fdb1a8d2e2af556efed32aeea82b1e0eaf0441a693bfc3c1735b9cd58aa53166b78e213f10e27c2674b7a63e47927b211b8f85b1688fd78fdce049afd323b42cd7570d280a82ea3e4ca18ba757890b6926286f4cc3aadfa29028734d93e4c930764d682f54f652ddcc770a3e70157af47cd21444b47b9647c8271079197377609d3f87e38b66cd99c25b403fb441077901db1e1862dcb0c4604715eefb4933a8a73d9e96a6250f807761bddc39a95d10c897404114b6f4f1372a12fb420f92542fd85aa087156d34e6013cc9042ec64ddd0d1ef6ab71c77525c1323397249363184a685b3c4dd43a14b3b1741ea40b474a4f5c78de31695703ca8329475a4759c7585f2c12cac73d72f5d276f07fba341b82cce633ca29608046ab18709ee36026ba4bd6b9359dc6100e487043dfeb4ab670cebac66853b3c99d4e1a8e00e196eb4056679150922d1093bee97bca4447087cfc63651e8c7c01d9e56554f2ec3a107879a9b2beb6ec97fe122a59efe457a4bbcedc1a1664eca2c23676d1bb7c8ed90e3821beb10ca0e3a34944d7141d8f9a922014808ff6d68d84f21467758113bfadce13eb8b013216879fab41f238ea473ec5e5d073c0e1b514a0d532445f9af43170253637e1d6aed3eb199273fae20c8ee7538baf680c85464b3f68707d27344d43c9a0a8ab53d6727ee96383c21e015481a516fc3ea6e0d7fdb97f0f5158aff07a95cd021ae8a63eb8288107438cc4b193e5c2a54d6b581d0e13c5dcd16b7e41cd6ad2386248d4b40bb0d660e0288aa4b6241466cde1c86e4f00068b2f1442a58e634d76b53137dee71534c570564944a71987bb806ea69179c9781ec32b72dddced05b607c4c0277396ca1a043e0150dc486059a68e5cb6ab8882d41e49d35b2766f7d46b601a103c34c1fbd601c8090f82f9e3d92aa73051e948ddb6b5eea89e7001e74e0a5a2a81a4788051e82968e0c106e4b2cf31613609e048be480f73a00415bcea6e1056ca3494c2dec63d802f54df7b1b1fb18117a37c9cde522c5717f121d62b850ec1e5849225ab127bdd452fb52bb9fe918f4093a76c17f3e1c913173f44dd53783984ca5eb320faa0ebe89e3197834038528b7a57c987b4fc5d9e699f06aaecbaa9bad6627f314adc52f488fdc702b44dea5ef7143d1de6af89561a2fd56d6e3968393c7207aad3144e97a7bb75389b166c65260652d217a1b0aed908ea2a2202deab17ad31fb70d5191845c4f64b24de304938c86b41413abe58bfd13a6831ef7a0a3df9166cd798be188757575fddd108f9e473cd1d72ae4215e6735f5fc1a9f1a024fd0b395ff07b9eeecd5c01860cbca7abb64b69f078cf054e8c8236d56e45e38efa609acd97d88517a98eb6b882b71cec6de9a06da5bfa03120fcf125533a3156cbbf00fbd4002becb15c590587dafd87555aca4752b450c52db88092a3829dc804c25cda8f0dbb992d4ec002042796625c431b0f5d4c8481b09dcd850664c22d67d7348fc457c9e244fa47418041646e2403cb60c663b8a14c0daed86383d363f814d3f3531bd21333b3f1630d5da90acc9876b15c5768631741c30b1f784fc5448db524217fba82a9040802d0085a5bdc25fc8cb89565995bd61ba20c2b7ebdca122349da1ca103b04f33f10b0c53cd21714e1db17a8c7f5552e1e569dc19f7f70b1f6ebf9e7388ca03baa153b02fda912ea475f6242b5f9d3d3f9c61c840d80b06a68572716e2e9b904a2ba7d998121ec87681b853ce68732c2abe8cfbad59ea8035659ab6838fc044605cead7df42d5f624cccc45f2b76ca9008f917afb266c4061b5d9510ea8ca5636d52d3cb26d293406b6989276bc89b41f077adc02d35343fd8c8143843da01b4beef44825a318fe4d60f1c58c77deb66ee33705cd6569ab6040fcc3b5ab4bff7fde79ba6dcbf963ed551a547bdc11cac272017963b75c32d8bca6e7a472fa060d9e6e7ce3ef24e6a3b4d5dd1391da6c26a9dd42153df853cb8e1048d41da06eeac333eb9d4be0d4a9dfe642cfa4bec47a973e5463b5c75eb36f5e888382fa586d541dd4dde63940f109c521b8cb9c1d774c6eba56bb641a56eb5dff596a9497dcf449754af2d143b94d7fdd311983c38172cd81956db31f7469b7a61d29d4abb69552e4c598e468ca74f2e777485e99408f25d5b42e8efa2bb7f53d32a63f64f01142c9585c794aa2112e3efca266712ac5deaea50e0c81c616719276aa817c841aba170c46f6524931dc5cafa9922daed2b0a8a29c78334e96bbad10a03f9df24c5759e67c34153cf9befd3f45466577a0b2f59554cec121fbee8253ce6e36b1373083e146542f9b05617417d1c86cc0d0ba8d67b9d79ab5d76f6c5a43d1846d1e5e98660a584de8f8c114a098e4696a34326bbc91f42ba17c502a45786b957fbf91efcf6458e7449f58c13e717b0298f7ae9047ac9925560e0ff5fb70ba802a9a443c53295aae28eda9b70d0c0ddf368051c4dfb0c36bac94d13fb78fdc823d5e035655447d4a8b6e390ab569ad6a34c16fe532bce01bcfd25dd7e18514196c3d35d1dd4e8d790afe853157c71c9a3e3fdd2bf1abfb24bf29dffbb14b129b125a467e0761203a2cbadf09fd5e7d8958af3f37d67e18b47cf3d4856c95c6961fbadfd8b1d5ab2526e0290ea9cb8532b6f5f4b14c50be94384d057b9a04093b297fac4150441a0dadc5fd869a1ef89d88b4ab9b1fc54b61ba4cecf7cf08c9093149cb3eb1fc3cf3243759c5291d1b0f9b4820ea8260d90d00ef83e9d64e3f36b4759b34a7eea00ab073cf87cc77a645ef57ce65084da4636a9d32374a489251df4c11cc03e576369479ddcd117593e11ef3179b40c2c99042a36b965873325cde102882c0bd35e3ddb99c1f637e0481c1614f4c2908acde551fccad4d9e321e506fd771b273740b898e2a7a31cf04f5dce4359a61576c470214524161015ac39ce0546794151d0ab7d4755bc0758edc9382803fecae112214597c51ef0cfb24ac5925bd7fce1949c414de281a59be0204949b134fe8da52b4ab2341c95a577c92cddf168d43d596e3e4d3e64afe7d72aa62021026f3b5b11974eb02f0ccd7aad2e9ebb75282012adc5c42312364ff26c35b56a723b6258d51413f83b51c17b5198a95aff8f656ff1f2adf99f1fcd68baa492ada967b7cb032e3302a70895ddd6ac93b8138ced9c6bdd73e814db971ce6b8d79a16e90ca439604985bbb527bbdd4a6ba252a6dce8ae30bf1b85c2cf62705ba24a04e1ac720d5cb96133b36e848553d19be80f3e247aaaabf1ee0003aeef4afd005c1123d325683f13edf31ad7baec44436c3220326214d58b81c1273e8b8195181f5f905fdf4214017bb12be02db08c817ce70a857e88283182bc0bac13600772e7409fc7c160eb474fcbe325e41cd1afa6b3ee2c633873722cbc6dfdb88e8f37fe991cf53b52ca908d3ff0405275e3e6e8204b1918d87dbe7c70c63891f58cf768a78db25bd252078825ad09a76d74e9f2d6e9ddc2981b6386ef311700221c77eefeb8b526b1f5824b95ea1a73c3d769d8980bc4355a8096431dcf84b48e25739f580f22dbb33b56b9839cbdaa785d9c1d324a6c661d0f2ed766553b6ebea54d899fc7e304cdacd2e55f0972a48d77fb8d1d47d13dde5bfa86b6c1b381b7ad9de41219bf3088cafba14a453e4ec45a9c07a939227a15d32939b9cd2dcee75b9552123d0b8081f3a9eb4e79cab1d2817b989ed6b43cedd8bb959ce951eec8c80d69ae024e0b88a773772d4777ce63e537c9635c7028fb2d9b80942012cd357a6aaaec87bc2f961a48ccf8273cab10bc5e276b08927fbb3b5130b74933a90d6f619b4b3487b01eacad2f118c5431fd4439de48090cdcb2a0bb9a72130dea7f3e73708c7aa92d6e76d994e820c39fe3dd736d87db7a746e52d85cc6c1556245d7cda4a11fad87a32a6b90d18c3aec289c27c156aa5d71bcaa5e0bb7828cae8408b4bfb66cbdbea920420a052ad53849accbe9be85daade041ea34f55a858fe4e9ea68071befd4d80657f227a8af0d7ca49ea46ecb849b4afa8e130acf026e7b7c8fa3fe47f764be7709c3bc55750cabfbb9742c2b551a069168566d8ace44371a885fdd54e4858d7958c045bc64c6889791b9e069dc1eede94dbd85d0565a04428de4f23538358c9a7602859930f68b9b4363cd7f8868bd5a916f1bf451bcba4c1d3786c876561af18621cd4dc053a3ce3d60e02ca6f45fde5951d51188fe8bec0e8003fcd506fc32e7853b2d1fb71e7070a3e3fa140e5844d9b3ad22a21ac2c547d358e7bb452d7c8e7555418ac0e3bdb9f3622bc63e57337a9e21af258420395202178703231593c1da7c8be49cb8e38a7ed459b94bb7a3d8f78308de22fd3394cd2862a277328888f932a4a725a95dcd6cb7ffa546dd4d548bd980bec97e9e934674971c0370534078d0b144194744aae16720e91a31324375385256801e6a48a0c9f59e5de52005185af83b25c5aa58f1d630175277fc5c41a1b294b3b972d701964fc66604d3437a5019183f0359b897ea459e72244ac705491a4d1ba114501e87af32ed2a3b8b3cb126de9df5d29358a437e5b4b0a85bdcc8b4734f5fc3126c87b2090a61de97dc148d40c0231998967730b42fe62f348e04a1d45ee1f1397e75a8a151d2331f61c204c6addbe0156a22858706b43c6c45cfc7716b46fae6759c4eeb14ddea99b629dcb26c04758bb57dc04da88d03d37b60e90fc5f3600b677a0bd41dba3514289015c1f12e3d02025a69edeb7790ea91323123ccf918ce0f908ada4aae631f7646bfd967ef4755a2d4195a1e55e5caa64a702dc97b991ebac2a32273215b368d109fe40cbc1b8dd7e5af8ede634a96dc7bfac22d6a6e92c971fd79819a74367c37259cdf607a78982edf1b4ce0f3b58b9b7e792c29fc6bf837e927a6432d75ba021b2248278cb774f663e2301b69318e6e05d043e023c4e0a1f5b1be0ccda622bdc531419ca48d76f0eda6f780e0c81894d21156e11ce19c4f36a42c5ad6581482458770a55fb2a1861380ae7db304a82ef53853edc284562a843b17d49da7eb48b3aa5b8e435a0b571d6b3ae6ec17a01a04945778bdc0be2f4a1345a5f89258f98ae21336a46034cf04dfbdea5aae17220d408a3a9319703827378830210a6bfe2f2b93ba3e0e1e6b5ed13a8559fd3696c7c5cdf02b2238975ceceb29c6b28233ce25d271198a4a70ee741da4b4630f24397c044a2e5f97a04c04df40a3c3847e8439ac1d2353b2c85abd3e7dc2d5090d58b2ddc5adfc0e481824f3a71db42c0d42ce597cf602478a59fd95c2200bc66507a092637f51cae5501d2b5f44d8b209881e74a3a69cdb4fac34e73ea22e788c8e54eaa90bb9646164d2721dbd315950aaac391cd383ea55714f64962a9d030cfba07641e72f6fe69d5d54ba59606e7a07f4623fb1ad0a95c3d25debc1cd2f41a82d85b1f9f98a66211a70d336ba9dc2340752e03e52be9515780bc8712e64f4fecf69b712869ce4468df67e01fb65937300f592a9bfeda4aaa208ed0141aeaedd072bf737c1a8f12396dc0cd040470f56e384c8262157f2811a68265881a916ee85a712f40b54864d54b4e055260a81b5bc4970078b26ee65603ce85492e70fa3e294cb1f0d6da95080922683689f2e84da028781f798fa1f5ec862a0097c27ef952c01f290ab21ebcb4b3a312ef967ee236cd20ec16dda767447ff7a94b7142f3261b78c0d84047092ae49bc1e95190fae8d519064ad987f621b8f3584531d4ad9727f275a255b597b8d1ff532121bdac9558468508386cd5200e89afb8140ed0cb65687f2e989a91451e37262d08337d2b2e39d37ba1c39a29d1665902d9407ad6132f9bdca2d5af6e81b4d95a47863e364f9127470bb2786b70d4b5f461510757371ef20d3b02baecd153421a86c66a359f0e72b76d74dc83c63e337f04708b44b4a733d575bfc41966af3406d71defe4a00907302f8280c9bd056105d346e16031f0c7cb0b443003eb015c469dcdb1d89cb4ee8d3279354b748754695986899e4fb45e587289f82bd956d63e5948692539e366c99544d13234dc32f26fdb475b5c595b14cc10d283ba694ba96a96b02c00b8445307267768d294f0f5a26dab364e0bc71d11a2c01e785029902b7aab47abbd5cd7dcd98d2155ecdbe063a762e2cb3a28c27b1503f47cc7ccf85e8ff0f695ebf68f8e0727350b24efc66975229d80cc59f0f69d173aa343d73942994afabd3433d77e05a8ccaee8e096ed5031ac3b1734279a0b6592859d41744bc6e21f9bcc0d39c267bd2e424d9cec1f03386ea38c499c5225c6289e5836085a2b7c6074373d5f35783fa8df9e7b0a5f4cf6059aac04d779193102f56c07a6a6eef15bef7b197ea7f6ddf3d6d2abdde15fc5ba12b443d1183b172bf01b8dafe3b8e6750fe66a145249f38459e01a790c784c3e5fd401fd08217450579ab1566615da05282824bb3c349d4f9c6d5697599366c5a9d1294d90bb541d5aa105b36cecb476f9528c9625e9ca402caada370f4ec1844ae59b0ae50db2e7ed3e376a10422e0dae185a23d53eab019dba9f5f02304b6c57809f2d0de56f18c05edd8d8b92bae628fff2f506afb29dded3b0a9bb74fb27ec30440fce7772ae0200a709850102087ac4d3461db2c4bcdc43a2cbee08306e8dfb82b54364de16da543a2df4129bd0b65dd31d4f0e620f4ad60f3433d1cfaf814a872f97ec941f569b911c9aa10f0f2c7b74b5e4dca2f87d2264055d34548f95a0d16e28e2c3a4693845f3e2f806940fb23c99a4d75c40f9641bb7f7df6b2c7690a71a8a1267d7202eb4b2245740dc0c79ddd7304df68c3d4149465e0436e3c8310e0cb09382a84aa46b0ff656a34038087224d31f37b661e1f68aaf0560d93740380ba871e2fc166320db3bb2e76150c487e0a923b722c13bda94a95dd0b3e682712feeab11f9162f2a612908c18ecd7d0117d4fcc567d3a2427767a61fe2d37ff123b789b8552ef850f8d0865ad02681613c20336b3e637f17a7e2dfe7aaae07bedce437fac3b86b89d9ecd21905fb691dd6d43574947fa7f4c3f1cb8d146805f55ed2dd651d478e748d2251548aac067b3d561a1ae6aa7168e50376cdadbc940905abc556c43566ad1cbcc12b88a3ef3740953c795ed283936e3374e9295bfcba37c56cd54c1b2f813af14cf5f359afb14b8a984fb5101b39111bbb362f2ad5e4f1f96a4ed03721b110903c8f101ea11705c526f07de0cf74a9b598021afe9f52809289243fd615c23a3899508558f838110a19f0a96699ba00df4929796ac7fd2b93e15296b0ce7198c7a4b2381fe88c9ce4c6420811905cbb7dfaa315604c7ba676394a32cf3f2016c696dc282cfa1899e6531c2ba657be04d6973f3289a9f1383223b993122e216a375f32a3e7d54c349819a506fc397f89e17e6c04d2f3b5ad6a0df09fdd78eae97d28b711e3836179212fedb36e8e07e513ac927c64a1bb95c0cbf2eb44e1f97f96a94232157efa31c5e39dccfb5c0b8e17ef121d31d5c0f68a14ee70a5054c28ca388068190bc1a5168a70b398263426c3b6119efdad032fe7b7e1f8cf16a39d177ffbafbd0584b956305655fa1c23fd6e6e539be0711c189a46c95cb95a4e84ffa8c25a94e4b254a297d686665662f0c76ab14a157dbe7cf99b7d54e106c67a6e4e9c7d7b126eda0b80a864ef01984fcd54c0c0278c421e5b12da00e6c5d8748a84d3e2a273c299836435123cbb21296015ff70ed3fba09561798dd1a9bbf3983d86ed9027f72bf698671395ab3b76275a4776a5956635d50b55241085c84e833b46dfe5237ef264dfd6b13363c64d1d712b32a14d6f024b24c666bcf12bd7ccf58398fc310da4a51ecb74e7af8524baa719f6c5aea1344617caa8da9614a0b2bc5990a108bb8d99884813c686bc40e40435fc3fcbe3bcbb1a4501e8ce3949c7bb35af658c6ba5342c88c6b85617abbc98c99a878b5503f8443b9fc035adde5ecf6e5d7e9954e41329aa840baa78cdde746447b2cbe3dcd029ae917874a792c836796f6bbbedc40196d7b0731e4fddb7cf3388c998391ed7c2e44192c3ca79b21aa47799cb4f7ca862d78af704a58eadf73bb757ddea7353d54dbf1b2a6ee3042f3a6469d4b31a2bc529559b70e75a09fe6f7c825d197d481258c3288757f32f590e5bf38de6540c1b37d750fb526f65956c4d4cc8c53aee76b7ee9e13bc803381a99633ba56d9f358befe913c341d9156292dcd25916dc02cfe301afc793a63b16a1fa39e4af620784657b2134bb7fdd2e6a0d963ef7af5ba986da1a1ce2219e9a7ba8d6050281aef47536d0fed725d6761b1d7fc92b1c051bc09226f2f2ad6a660e2bd5f280026199dae4e41212d53159441fa9ced434cf210743f49f79328753d639fc059aab807271910036b89153f3e3cac7fdb8c0eabe68ec7e54012e42e61a55b3b78b496684f6a32088fdbdc1319e1553580ad5816283114f13785ad73c5712547623540137b8cdbcc596071cea142aad8505c470f89e17c01e3117094f25d95c204348569d2a6f64edf76a0ecd8ffa75f7362f67cfd613847db4d254898f93a18f1aaaad00572dc7fe7ca9c8ab869c4de71e851a17daedeefcf9222522dfbf0174f5dba9173efe680b30cb197cb4ce16357ca76d72f51a4ca5727eea860ba3d3798719b34aa2a631e7d61560d098bc44d2280e8401ebb97d760cff970253ca954f8c373a04b991d4f3ab59b83731afea323e5242b912fe82051c2dbb669e84f6479555e29471f4c29c90d1284415f4fb7a0888133826d9c269c4134a1c41c5e04256c9e196d0bfb36403da7602e83639fc076de9246dfdb52c563a99cfd4f6f262aa524b7b589f9939a622bf94e36a12dba3179a09b2af8f35be3474fade0268204290cb37238218111149187a649d6354343016e036c60b176b018acfe3e916a6522f6f66440a00d4c581699a1097184a66b091dffef012b51d17989c9deb17ef854a35d4f6a10263c0699162a252a6ebe4fd1153ffd06020ddc17174cdc010f160af0050add8e06850d8290b7cb4f7397ae80ef13aaeac5c1b09f2c046985520d99566857e26a7878d2c0326aa50af36074cd6bae1b8c1d39fc4de89418c7150319c9053f7c80a09172d9716de30ba280a448784854cca01b863f11d5e616be4a9ca80972853f87cbf05ec841c1091f7dde0c2f68084b7557f2a2c67ba00b2e8047cc0e6358ee6c0d1912a1150e7d8f4f5b1c59d4acd28748988dca5ad40f67373322d1d597cbab4828e82ec4bd8ab6e9b408976f046f5ae0ea7fc270eb98352c77dd517cf4ad5d6c36a2a533b7d87cd0240dbc9c644f4d55357af072a8ec3b6baa1b526996eaa36b0c682159702395fef6f20d1e167cd282127c5cd6c1d038f078cca8304b651d1cbfd9b845c1a52f0dbf2ddc72340940e5d733f91a5db04d6919fbf30944707517d06585a8b6803d87ca4ff6f25021ef6ec40f18b5dd10b0261364e385a6c33533fd1d6498a7cdb2aab52946e97fb80f830a70fb38a715192bc748b3f7c6ecb450aac6b0bf3974b974a8ca15fa426a9c3891f667308dddfd6fe3b3cbd44eade08ec2fdab4b5cf6a4bcd317ed04520631c71a4f3426170efe77fa4207031d9378d87cb2e4fa1b73f8d3baab605ef704261070957c90d3727c748d1b8f483d6f7ea50eb69d11283b686a12dc45f151a6e6e84a9d36008528b6e97683a2536a1ec0a9ef58626216e08364553816f4f5f2bc12a1c1acefbf6c08407f3d977b54f6fa7a7bf023293ecf92822e539853b56da43718587d7b3d32f2dd62ddf4eaa53cd505fedd05251354106857361d00bec401bec401bec401bec4097c89e344af5e7100b4c6a3a5ea419482b42d25eb9672b32edd4892dd424817d609b9565c89ea245253976b18a61194c556b13794e4e42071e1350d2318d484ec9d02de150f12e811284520028617d4769a73c2ae4c6004406814303c111a8087638c4619638c31c618e30a9d9200027a8c402683e6dc03954e0004dd853f4620805b4ca724709a41ce0f3c3a4544153e5820f26e19141d08004248f7d20e72a0940526343783259c9440d5a4516e5861830d94c1a8512a3180c02b06b54679820b2749c63046ab84609141b818a31b4576590b24dd5921c83b12041fdd66a8a2c988215548b94e0f9c9082311ac5870dbe27405ad0a9297000c66d21d31c15313f6a5417f4892807001882498aee868418a8413846ab70026e30e466eb930f7cb6383521f5e9e8a8a643094c5a650108fc50822d0cd15d163841a832e8d028048880079a8632d0285a38e2022e6881750fa1036560800d0cb40a470e01cc7882054e9d51503e138af3686f722888150d3bdd6134c11a25446954a382708df2849b29170ea56970291bb8195c0a0eaa479f2080da01a54b4949a14e1cd737745e77cd09810a826b941fa9a6a1e29ae3b8546a47c7d235c771a72e88e350b88ee34e2a261dd771289d0d481ca7e250bae36478a74ea58a59710ed57528271c8ae3ba15ee0b1da7d2290ed59d9ee394741cd7a52875383aae53a13ace0a1dc7a93a4e08ee068e3b752933489d50667036701cc7753eba1a29270e035cc7a93a8eeb4e2fae43ada8ece85a3821295caa8753100ea5eb5037a795aee36468e8700340ddb0009d8eba4675d7010e758a41a53aeed4a908704ee0baebd56ad55c7328aee3b2c0a5743a38ae4b75dd89e372b81a2e856be9baae53f57039ba0ed57136278fe546ca0f9c0c1a70e826c0a5ba1b1c8a3b71dd1d75bec2a1baa3aa7618a78053bfcc80eb2136e84e9c8a43a17032b853145d97c23a713b27aeeb50deb5a8c470298e43b141ddf060c3752baa948ee3380e85e3585cd721e1a4e2543ad4a9c6c17423c79d683815968e4b41e1ba21dd0edd0e9d0ea73e35478353751d2703b53aa1ba1b5dd7712a0e25e3547ae058521d97e266f4e0388ee3707442282c2a1d174b6941e93821b8148e3b751c8a0be274e87c7439742c1d4a97e24e5cc7751c8bd3a163e95050dc2975e2b81edc898be154b8168ee37e703b742b27142e05c5751cc7e238950d5d0d1caae35228ce47c7c29dba1db8d3a9eb501d8af3d1751c0edd0aa7c2a5a03a8ee3589c0edd0aca8943a5a0388eebe19c0d1d29404e40a4b813a7c2a16c702a2a2c962270ecc00500c5759daa43796e55c3862588e33aaee3388ea6515a6c2296e0c218220bed436c008c2e867881c2158e48278840a9095fb4ebe5089db4811f7c92f441236d400b0c20bd58232136a0248c23b963c8d00676e84290ccc1c6c7066cd4f89033ace8d104193df47859e1749ac099410736460674fc0cedc1c8b0030d8c8a6ee60b0fd819b7d101c493192df000f3161efc061afa09008c6858aa01ed2827ba4fdddd37f5c197cd2f717cedc8b25277db7cb5451fda247c3d99e57ca99aacf8a0832614151415d48c141d1495930e2d2e268a605262542b293ba8161a1caa45f542d94e324e2e282f9ca840936a4687a2829a91a1c38e089a568cb44cd4cc0c26ba1d38524a284e0544064d41867c5c9ce8502ba82199303449a1091d5d30c1a5582e3c0c61a243e170a211b91721292086d0a452f170d4a4060d1e029c88305180a61b2a475a6a68a98109500d3105af80a1094856210273c00a45e52423b584324002984841cd50e9c0d1c861620a1c50d141842629624c6046c7921ae282e20355e48bc0a20900a4625680567e502541e940f1d1c40a3640a4892a1860c3caa6898c6fe8003468621965167042060e0dce480ea71f283774985841f1a15a499971ea2144e4a4c30a10189a5650846424a504e1f8015a51096a499a4056d074036a466745c502800cd50acb0fcc111e685a4909da218680a6d46995e25442a856523f543a84f0b08c2a395282542b283764f8a8f4802a52b9a1861c7ec0c1061d29401441fa818995140f2547464e0fa1239416140a0e29d64947a50595c387a0a8a0aca06a5245503b43b8148ed34bca061b9594efe4e3e7878d94151b547a30d153c4b2232506d503aa0755154d3a66a07c5240a47650e90195038d9b930e4d347935dc4976a2419d52038039e2012fb0750422e8620b2c4650c5140758220926bc24fb0f764412229018514a3a1a1240106b2727e6071f02e0281bd4600c2d5c610a4108f10106871b284f78b0830f7840889f20583ad4686151d1400b1684808a0f4c21c5069e60402926478d67810ab892c6288317624468210b30785917073080ca84fc5841a1a2014e7aa818c10b1050c1f2a173430d2c2b292839e050410a92fc342a128010d04f0616608002d0f0050f178c4004552c71c4480f1d1b35a07ed045178c0809a2a382a222c1132c28010724f000040c400319c800038c8a84fcc8d1c291e134864e0c54189e850e0cd414ba26a4bee08ed015a12382ca105a84d0fda0f341a7454782d308ba259412ae078e87141d5239c8b8d1ddd0d5e06a7001408a86ce855ba166742ca9954e2525a54341497528eec471aa9641e384e3f4822694029a50432a1dcea17c818995079a52a916941f8ec0046a0337a81b5aa6b042758026d4908a0d2b39d870a24965081411a71d58b2aa2505286547b572fa616325a583a6942c9a6a48c2844a8f1306b8d0c284a6d4184da9161c88d0d492615ed0a462634687f223559382001435586e4ca00954029a68bcd07839d1b8d4a4d87019a3891410293b28404e344e4052a6683a11ddd4a8565457349d585438a066586e4e1caa0535b3029402026508150eaa159592961a5a6a50b1a16203ca10273334a1c2e1844513292e9a7c50820afde5830e28560b0d950b8a3bd19c7a50472d37a83a94232838508a523566702a96530ad5723a9dba13ca29e5a4b29203ea84a28442038da3151714150a774241ed40d5a0b8941b271c4ca8f090b2a269c6154cb8a85038527c9a4031a1099897f71867988211bcf8411738e0629c2535c0c90f4f10417ad8aa852cd4e458d14841298208a3a2317a200420f0c0009b282630a4024c28820f6e0003158ce00335de0f12183303f0fdc216c248c210845003142ca1c4114988406254440488871d6eb0418b162c3102112891c44b871c6ce561061396b0246c1ae30c61004392226eb0c1a50837b0410c60a082149080010b30c0eb88218e181509f9a00736e0810ba20842c2117c70831ac0e0051e9802010470620b61146108307881162568d2f453e8c74546185180021370508316b0e004206880027ebe8e4852c411a19f1f2c1917193ee8010e3060810634f979840084807e7eb066c8407514a0e0831ee4c0062d60c109480002072ca0891102100af283d563c78d0c0d2ea81e230a5058420e7060831ab48005240081031ab000053471c2cb882441d4786520c350111a3394908393042000c9111b0e28000137a610a88c713a4367861419ba31a45881aaa20341f7010ea7bb39d9701e0bcd098893dbc043970387030587d30dce06ea06ce061500d040c36985a2d13263250387961b2c39acb8a8a0a4a8503a952a953a718d430e3ef4aa253f1893b9d22bd6fcb41fada30edd1c4a4b90aa572d38ac5a68e8ee1f7ac57205198f71ff4971a58ea967ea3f6e575e49fb5c526761014b0a562c5474c37c56e9d36c2ee34180784c10205ee9ec632c4c2b96b01be632eb987abec58cf03caf08a120150e36dda91f30a91cddcd43af56c0687cbd7a3f6729d6dcbc5ae9c08a934a33fee99e6d75fc76ba4ccc7f77b478b5725792f4ac9fa5e3d50a90591fa6572b2b2a6238e832eb7eadecca8cfd67555e9a0a17f87a97f6851fd6fc4741acd2c40edd2a03e87e0c4ad98f3777f74b4a4a8d0aac6b68b828f8b871217eeff8e9f0e163c7470f1f3a3e78f8d8e123c7078e8f1b1f363e7cecececf4d8d1d9e1b1b36327670767e766c766c7478f9d1e3d7ae8f4e0d163478f9c1e383d6e7ad8f4f0a1b3a3d34347478787ce0e9d1c1d1c9d1b1d1b1d1f3c7678f4e0a1c383078f1d3c7278e0f0b8e161c3c3c78e9d1d3d76e8ece0b163c78e9c1d383b6e76d8ecf091b393d32347278747ce8e9c9c1c9c9c9b1c9b1c1f383b383d70747078e0ecc0c9c1c1c1b9c1b1c1f171b373d3e346e786c7cd8e9b9c1b9c9b9b1b9b1b1f363b363d6c746c78d8ecb0c9b1c1b1b9b1b1b189d930d9fc2ac5077cbd70ac353994fdb59f11dd3d832a626526662526094fc207e03eb332b332007777ef6e20ba5b4777cb74372a074a17ceba02f6c40a85090a6d85620483396b6506067356963de8be0293c9b419bdee59f6600ccc59f3412a6558060912e4053fedcb328cc9b142b98162c36772e4f02c7dfed247ab14c3e866a978d0ddde2b5508da31cd63cc1dd3a7e53c12d9ecbd9667a582a2dbf36a77a3f44a35530169190702c46f62fcab2d8279b5348b4636ddedad5251a86aa850dd3231f7a98ce6fa53287faf2466f480ee2ea257a928babb73e8efcaefb66694c75ad7775b3b38378f254f77e3c0a11b9463fee4fcfcbdc8f493e98cfad0f2acfe10fe6e8b361b6dfdc9b6285b9f59a52095d735bb91d23d3fbc5606cad07d848c7ad4743790ee4ed22bd492eec6d7c3df95369e0fcf8666524b9371b5df2d8be14f35cad622e52792eb674c71b55f15ba3627cdcfe278afed999faf15c53129db22fcd316e1afc91f9a1494b52a742d90ccda7b549f4877dff0f3b3fb44b7bb8ff4ea64007cbd1805f3b531d9dd35ba01d0dd3d749fbe709a020d3f82b2e6b07b7f605ea557eb309918515e5b1d59ac0c8ef891603e1f04e5d7ddabeea6d1dd33baa5bb59b80b74f710bdeac455077638e86e67e159471b7399f53c5ab7f985af77e3e1783734f8f32d569383b3f3bd8fd8f4e10347e7fbfe8626b49f171b6999ce6e37633afb5b6367577e5e4da5a1043f94b806dfc74a351e048877f74aa7a4ecd4e855e79d292862876509a3a1579c17ba41d9811b7ac59da0bb6be815f7a483dcc79576b78cee14125cc6d79b36acf9beb6e290f074b70dbde266babb3ee840fc633ec1d1d2b0cb38a631cef4b352ff9a0dffbe4469c3ddadd2ddcdeeb6d12b0e85af974399aabbb9eeaeafbdf7bd4a9f5fef98ff7ab534cb5c3f7c500ca9672a6ff659a539cbf05a99cb4ed5dd39f4aa99badba5570d81eeb6595076bf66fd96e92745f9e1eb7d5f7bd9e4adf92eaef92c08ca9adb953746c1ee4e9d50dddd05d1640828400111951bb6b84246053840e248092f70c97cb0830a2de04fcc8b1476ba00802dc51b43145728020d3085ca0e8c8c066eba00c08d03782711fbf4108412280820454a106a5421012cbd455353ab4f35b0f0054b4a2fa51ce59d8c1f98254e5c11965e724a81294d9a60a243c12ca19ac5a1008542a152ce71dc12e72847f10e09259c0b600995a390a8759eca274fb9ca879c52a714120258a295e2a7160a0cea652905b30489960a4cca513027259d73282f4b2948a050a7d3097542a150a8d3c939194568b43aef1408585a49e7a7ee65c929d542a756ca6fae75aef214ea65898dd65207b302b3048920ae95e22a304a500eb30489160accd2527b2f91c2752e90f1d2390bc7f1c8484289ce53609a3ae75a525e9aa7a5c555505650be22e3a56b82f216e75e925071ae5391e14ba8bc3c1104cfc9575e9a40c1f19cfc892078502897e1ae93732c2fcdc3f2224386afb038141ccf4a931667e984681e95262d2ec3b99724569c5381492204ae15e73c0916ef56327000f516ad2514980fdc3a57c17ce076f2205aab149697262c0e85f3ac78ca4b13199c0c98a69373cec13449428993afc0349d9a40e13c32fc2483885553535313cfc965bc24a1c4c959609a4ede0971729d7ce5050a8e67c5555ea0e078549ce5a5c91341f0ac38141c0f8bb3742f324e327e70088172194ec4c95b3ce5a589ca91257864c024e149acbc24c1c2b2f2a2a2728e27e70cab253d464b05b3f4815be71fb8a11ce5271c429c8e381947286f1947273f75aa15f0742f4f704fa09a40c1f913a99494e78cb14279caa907124828d1f9c995e01ce5488400892650384fcaa5e2295722c557bc619078c27952304828a1f21518289ce7e42a304aa4c0a41c054609158ca7604edeae848aab2c3b98686287133cdc0b141d144da040c1846049104f84604910ada593776f71846547d3aa731627299dea9416e73f24805275fdc3c90f09a05234486dd19d38cf8962c53987059785173a5cfba975ea5e525ab4b3383971810a6500238c968a8a4ad7a756a9da533e12e063013e9ca850d1c57427142a8ba64961d1c59c3c8702abceb94e41d1c9b49f9c6c814ae9e1c5a907e7dd354c2a05812d68783144954249a5a454524ca9148d9d9c24ec00614a59a1b418aa16e3c90e5457a8b0c0828b194052aa14151629289e702a2c52b050350ae5291516adee8b275ea4742b3096b052e2e2c486289a75f25e69f1f622a80546494aca0a8c9215171c0f4ebc4819a033406743143b606a3940181df7040b139c5a291825b4d5a53ce5d483c553304ac456e74a68adce7150c2e48b5607a3e494938495ca555dd7a9542b2aaa2d9cc322c539e74cc0a1704f522a4820f1a28544b5054a094b172b5db4545e9474195870d062f9a2c571471c12293a46877bd2a5a068e1b26871aeea3a94379842a150a81e58b8e8a2eba18b61e9e224c3e2458b73244f3a1d161c342705cb0e5a9c732c60b4386e8b2c4e302c5c340dd7a5f4d0438bcb31c22a8ca6e13c87072b8e6b2e5a9c77ce12c64a14357c51e38baec74eef9c50507694b0e280a85a0581e6420581be424aca6a65c38692e66207c889f313f745eb8b568ba1d519610586c6174c58295971a18a828b56e7349ad0ea56b84889a2bb02185f80e10307630b1a5c8b9314951a3800b878e74734b892ee62b54a51b202400a0d356aa46aa46aa46abcb478b152b272b2c2e2a56b39e974ba56b760e66a8ad6898a16ad8b39ad9c3879b2c2826b29c2aaf3293c6151a1c8f8a901d3e2048b2e4583ea8a954b18a71e1c4f1952a91a30a9540d8ec50b5d0c8b1829ae4f3358c26871d2e99c7288b04275312e376cb0b070292f2bdc6a45038c8c1f4e49ca4a890d252931c2f8a9e12c327eba54aa4b75a90e66a5926184e24ac020a4767431279b2e26072b252c61b44e2c61743a9d9fbca589c50b2c62b4346981a2d371d2e9e0489d5c4584e24a3aaf01939272161b7ec306cec60db7e1ae1b6ec386dfb8e1376090b8b172d28aa259dda9c70d5792d2a2218386cbb071c36dd498a24614352e50e349a773839f541ba8618b6675ae1263e56405814ea7869f7c15c58a021b689d58c210a375ba61c36fb8cb86df804122042947e286db48c1b870701b6e0306091b8e030bca4b8dce95b050a0862d9ae6c4e24a58c25839a9f1b282c02a8a0b74315dcb0d270e47e7371c07b7f18243881b8ec30dc7c15d38dc86e3701b8e72e3c5c64b18505c5c6c784979cb70a951a34657e38506d512ad8e06242798245dcc292546d39cfcc68baaa9c35845b17262c54a4987a164e5e4a7731b4a56add5eab4721c2f38bcd87071711a6a2859a205004791f103006739c1409153c52ae52e28285ea3468d971a68f01a35d0e02800a0c1052645490a0a1a330cf0e4c5490d31689d5c25a54375d7a166a47c48a752d2d24ad2d5e87868c275ce104e0468711a4e00193ec3877429a71e498420c59368711aae92e1337008d1e234dcd5e23464f80cae85b9568aa3ba1a7284b04a5101a3049553c56ac59988a1f2a2846b192928577959a29582d2838b948c165417a830b0740f4a707ce14506bb18546ff3dfa133ba8cfa8faff67e95eed019699f15dfcb785432a5b7dc63cd2aad571e3931d910962d9804fbf998e4c1d7abd9a3a9b406949f0533f51a1d97bcd7d1679536012fd0dd4f91409b2209dd1deb95929fee796d9677fc5e75940550c2021bfdee86c11e8ff2fb58be52744cfd88666501e00c15650db802a2ba9de58f3fdbdaebf6d59fdd0f3fcce028653f5fbff4c99b5f194b19d3bf6cfe5a38cefaf7659fe5ecc19f75c4e2ebca07bff1b3ad7db6b5d77d5ab6195370e993600c94d88af68a768e18cbf9f9f15fda37da5a4825b6e077fbf9dfc764ec639286e6d0dd6eab13e0024e10f2a1ac3e02a189dd41badb252523c57120287b26b546ee83a0ecb1730c5f58da5e768ef893f8beb095557a69a3184efaa2f8b32f4cab48f30429ed132966b257acddaf06daef75cb9426734cda393ebdaefb335925d1fcfba228ef113b4799fca11b12dd64ff3ce187a44a0b4e9bbd3d18670b265d8964654a62e8731fcb2be59547b9fe7d5a15c223f855a12b6949585e7934cea8acda9e7ca5783fd7d1f6605a84691116a96b8294d6839fe63a5a9e9fc990fe3d9a517c8d3c9212bedd11cbbf2e91d2f0cfd187b687f6bd0becf1310a8588dc9008941fbd36631a84454ac3472e2c248632e398e4491ac76e2e777398bb4bba39d17673955b0abb39905beaa4b105fe5765cf7f55d6fb354be4be0c57795dd516dd6aebc59bebc664ef11eb938e847b8c90fc268ff0ed8bc8fe63748eb2ceb094578ad586f4633256e59dd1b082a5740f15e8ee7e81a1bbfb15062c033e94801c70848eeeeea8e000088e00d0022e7a74371784038a307262000c68d1dd1c02acc083cc4d01b1a2bb39199c9608820084c084d6dd5d01025083069ee0430e74d0dda72f60e188125c51030a60a1bb39243e000216369830840674378745cb015c38465005a1ee3e050985706002ddcc08babb1bfa09220a08c881803074f7a90603bac8c204a2d00208ddadaa4004c4e084c03ac390eee6a0f08506205186093ca14777a32c0043a1004d074a9860e3e1d468ec673f7b5b012f08f44b071d1e38414794a13dd0e484947e1d11c511517433d9349edd161179e5914c66546dd66756e9bcd2c6aad183dfed7b191d92571e197145b78d637acb62f84210f918d18411b3fd06d6d792707a10c7f34a5bb5d9f9ea6e1fbabb30ac8cb0d1f87a623826e92209029230f5fdd995a03bd3a49ec4c3cf34094a12547703f5aa8817c8b8106792a13f2d579bbd33311cfd69d948117b2d8bf57a11ad88a0404d4dcd77b1ccfab598d6e874797fbe187eceb2e7b7f26dcdcfb668ca0fb27d51d2941fa4f4d3f60c11ca2b4531bc34fce3924702bfbe6824863708c909ba3bc6677e8bf97df1da10c9ec6e5ac718c7488820e9a1bb85d030bd575b5dd6c78ea91fe9c1eac80962c231a44c32b4b3af476031ee7e44c8911f47568c80d1322ec463fc9bd9af367944841484513d281e1410d44ea36a502fdd2d805e1909d2f87af769cffcfb32d9c883ff6856298b3593ea0f12c6a3a431fdfc2801b922208623283f3b843f8f7895048455120fba1ba9574903e83622c94c11499e968d92682051010902445dac905ced3393c260fe604cc2eed7eceb3f5abb8f613710946395a1dfcf12f48f79959f7ba01c27add159a957f9317dfed91c6348334264a18d48e2cf84629ff11979a588f17ff68afeb159a3fffdfdd02675b70ebd1262052b2196f84bc7257f7d663e1e679534a7b98c843822448c11497ce643fbe5d11e51a15b66dd711da710d1910d564754741b91c427f5229278443d48dce79536518969d2d7acb4c85fcbf455881040be37921fcb647607d7c80346b1f63edb9acf2aa5f92bbecf772c6d463e1475019bf683b9f7d37e0e64e4c8658cde0fc746ecd7fafc4cfd3e2dd37779a5e85a1541d1b8bee89fc7ef99de6df6d6aae8c856db576fad8a56e0389ff6e1b1d545f7944f9b42f2e6f48ae800dd0d9b14e69ebcf2c8a59ce2382b2d52e9d24b5e297eaf1aa6f8ebcfe68f3f2e113285d0b00c9af269af6f49aea3fd5e331cbe9864f8fa99c4f8c317930c5f3f932fd0dad8fcf05259b59f2889feaf8b07df7e69ce4a8b18cd2aa5610926cd4a97f087341709558de252ba555d974aa15028d4e9743a9dba8e53a952aa148a2a854251a1a0a850249edf4f2b1cff3e2dff64994c42c2b3d2225782e3ecefad484796136b4d9d1f1f9aeb878878a4744489f65122ae12127d251cb1e8888f9c241dd7922190dc7c326098695e96495cb374ad2d7ff53c670d2129d5d1cafc637e93618c7b4c96be218a908828b13425adcc34be9127a2470f0a6484088a644909528e8bc991008268329a245afa41120ae198d20c8ea1ebf0c0a1690525f9634bb3390eefdbecff7726fd16fbfb34173282878e1136384490e8469a3febcf6dcabf60cb1665a62f9a5f6d18daef95afcc49478fe50f650b267d4c3feb88416b6359fcef931894f2357ffe579c2d885f364bc32f5b71c50f8aa1c42f0b8ed3862fd9ad5d5a9ed4f67ada7793e0cf172ddbfb4c7015e233e268efec25640a0999423eb7db2fbd6ef76bf6c3740a9942785a7a5f7c4d237072e63f7e8576567985fc4767a5afafd1fc492146807c6f44888ccfc400f9de08c64c3f69af8f8665d0cd7fbf29746d9620687ba690109b181e62b1eecf6b592c9fc994072767ec89c96a475666a4c8f746e68742f8736edd32fda4a7f58072feacf6fba459a54b9fe4c9f4a3a0c8f4332b2d924711539f7c6dac35e5d35a9648ae8fff1edd8c1fe9683e15c7ef33fa6b7b6e37d79f904ab067cabfb42caf3c12477b89fcb53d99f2c4244865ad855363b18c88a27ce5faa128cad7b559b2583835160bcf18e2857e2a1b6283212b1892c510127477b574f6d7338dd1b8f4d05e99ffb5194f69c1eeb60ae28a213bb85219daf93549737c9336503a08529be3299f368367f0fdfca1bc5204e5b8e4314da6b1d51095b37e5ada27ffd6d1e7dfcff59d05ca7a3f578aaff71f056f68beaf651acbf5a948bfbff7677d3c857072461a964141e83085c0af55d27ac4f0064d211a96413f6dcfa4a034c262552a699fbc529cf283843ce96efcfa6bbf57b6532e8156a4611944c33248488a03dd2deb551024ba67e7439055770311c30a8817dded4180b8b36030cf588afe5f95b559e5f7fdb43d0770e288159021d8de67e2b34a6f60b53ee5836eb3e34c634e65b211fbfc2ca334dcdddddc911f5be0ebe178393434b74caf14757af5638925fec326e7081caf92961de3076f553afef04a3c5a5afb7b2444c8ce08e47b23407072467c1f8ff7973e0b7e76886670249a7fbfdaec0ececd285931a80005a2e8c7d58af891c20f49a5337a8d2668346b0be79f5de9ba615bf43f9339c948f8315dfb3dd283313aab2350b6e123dd18b13132abddfbb364f4e3c2adf9e167a1f0b310cef448cfe72ab4c3845ba620cde3dd7182a5cd41507e3ebdda1942a4573dc2684973e995869fa93f38ab147b6bd5238beef6f0185bf550c2d6899333f6e059e960c103c1b761e933b34a33be54e632ebeedd407094f9a4d3f1bbcc3aedcb9207c748ae4fbfdaba3192eb873729be1ecb071f29fc4cbbbb014efa99503c64f3d89a5f6734297c3dbdf9f559e6510c6dcf8c12859f294ecef84c280f27d42a796695d2bed11a9934f648b3390a207fafe4913e9ac55f4abae5a79fc54c3fab100f9bd50e27b497f1cf6623f64c9bd1d05fbc65e9d59f96679e96c37176252dfbbbed8b9276c4da68c70f2fdeb2639c2d98342e91a2d1acb4c8ac7469951383554ece71cf8824d982786656ba5444120f3f0d4b10fb67f951501ce7fc9f8e29cde55eb620f60f6976998fcae8f722a699952ec5cc2a1df6aa9662fc18f6a228690e9b952ec1bc7e8dce64d6fffa7ff56532eb553aa6fef769aeee56400270c8e0acfb5926f1f56e18d2542a731d6d48f3e0d2fd90c5ba6178c3104700cefa6b651f7be125f9e24b14258bf59582d5bec23aa3492c968f1b1e3c702ebe71a2efe74c6dae9fc950e8feac52207176045219fe644b91627f0494b31fba4950c4d4c785671204ca9487c57ac92c7d7478e0fc5f9a6b497edf17d1e1812369493a3c70accdf54b12e4c1c9b149a49b1c9b44b2c9b149241f383689b4836393483d706c124907c7269178e0d824d20e1c9b44cac1b149241c1c9b44b2c1b149241f373689b4736393483d6e6c1249e7c6269178dcd824d28e1b9b44cab9b149249c1b9b44bab9b149241f3689b46393483d6c1249c7269178d824d20e9b44cab149241c9b44bab149241b9b44fa2a337b55e305be1e7ef19633adc935288f0add137c0a74cb1e8874849fdabe6845a30315159515ef1653515159999f330ddf656a300daec19f9d3495cab0c652cfc39f9d35352c2ce64c8b3122d7af7d11fe34978a8aca0a8b25c559e59de5fab59f154d537bf3c311ffa541f2e6e3518ab9febd634fc674a8951fbfba3b00bda251b5379f82a228bdfec71c4b9ae7c74ecba374db177d9693ce2a7b44a5fbb58e48f763e113d50f67f2d2c4177ef067957e75b4f5917072c6a48c2b95b3afd92b8aad5ba6d72a9144f7c53129bf3edbda042d0dffa5b93e5b23ac2c1d2767f4cf997478ecc8c161ba99bff4d9a1afb6e8a3b56a7b8040a23fdb1a8b75fbe4fd6cf8f3b3354273c3f07593fddf64ffb1950e0874f70bc67fe7941ee4fa719bfdf6453e0ac6c6231f02e8e787c7f3fd1a08b63e4c89fe8170ec25e26ab17ca40608e9950e1d3ae7a8f8edc494969df6519acd675cf3f108050a25d3019904b4dbec78264199cf9f5549fb44eb3f569aabfddc669f4f6ff6d10e8104ed75444c12ba1bc7b3f16e6a3f3c4648ae2418d71c151cbedec7eccdd8c6c3a1096dbc9b9a570ade27ea6ed84bb5d3dd467a15d3ddfd77ccf2650ec3757cd59660fe343cfa7c3026ebfbc73ce331f459a583f43acded97bac78db7c3b3a19959b0db881c5e14d194c2353531d1b4d2d4ddd4d45d539f9ada004d8d000474afb44a7743d17d80a656696a62a209014ddd4d4d07686ae207274470447437ac573eccd8e4cdf1706e3c1b9a6ab33746c392e6438a3b0dcba05ef53086ee0f6dd2575be4b2b22af453de99a894b11ca29956212614949502fddc40516c61493b7221bd44fca1acf99362687b58acefa7fd6a3839a390d77d9149864b9f05631794d9e617930c85006192e14771a53733fdebb18c09c1c91981dc3f6292a10d5d350034dc3fc22cd6d267411e21f34591de8c59219636205faf5ea0d0f9fb7bede7d956ec2ea3ee98fad35cfe03f6baf6059b4fc3b45299df9f201d79f0f570a62105c3cff8a6d4dd9c6b88c7a0bb8fba1b55d433999d2ae96e24bd7a89c1d7cb955a31c7b3a1b9f91e1b15e1eb81d271b4e77939f2833359fe9d79b645ee6107a504c70f949fd332b5f9acd25947ff2bfd8fb0c0af3df8aa96e64fe22a6f6635e70487c3dd7033b854772fe9150f3e2dff662c13531ff464e0630f02c4270df1f56858d26858d258ac1d90e8ced7d2b05b9b6958d29cf5f87eedafd7eee347fabf401fa6218b85eb2fd9cc62e131cb9cf45f95a0e43162c77fec8c45e09b3cfa97bdf04d8a184bf03b926933fa3617e88001908e311cefc6c3a1b1b24a691e941fae338a312dcba35677bf7053283f08caa36a29be6f24a9bb8986baf1f56a6a6ae4d7c3c6466653d3c3c687fc9c9bff707ce0ece0a113a3f92c6fc6b111d7e03cdaa5ef695f4da6b3f9342c697564b17e26afcd98c5fa90e63ade1c0890831339d86e98b3609ea57f9619bb9555a1dbb559ce2a8940795f340265786d11c612ecf1a17d598a984e160bbf3e9457866ff208ff10325cbdc29105bedeac9f99be8fe8158ea0fe8cbfbeee67fa0aed95bdbe1771cdf7b59ab7d189e1f0d0d9a123e361237dcc1c9b1e3c7676e4cc893363b11d3b623d7ae0f4903992878f9a2fe3f1d6e098e9e1e91e6a3f75774a77e3a0021c48c064133393aea2d6cf9091110fd20f911f579190100f912221245792bb7e5c3d4643434a45483f424042aea21f1f2177f5fc0880c768a8f583e4f3e36a21fd102915fdec00b9947e7a8a7e9484f84972fd247df47e38161df168097d485d3d2ea50fa96b3e130acafbf5893c18a3981a99557a73d21111cf8d247477115e6424e46af5080d1d1db56e60d15d84f7080109f5fc1c25d1b890fcb88a8c7a6e442001f3f337deafd14c437ac51be28d70756376b74c8c1b5184ffb85a4684908e3ea4aecfd207a83ef8aa0fbefef3836268bf2a04ca8f565be5576d11d1a446dd1d64523ba9d1acd2fbf31ae54f32ba5f33ba3fe523fdb44433e9fa583816cda4abbb817c77fff87c8b559bad4b5569265db34a2b95e1dfeee6317fdaefa7cc92b523cb4addbd6326f38fa034d2dd3eaaa599622b76f7ceac74e9062fba9b47b545ddbd23e7439bd4a7da037070218b1d8d328292012566141db207534e0401e240787df0f59aa03d5d2101949154b74a08194f0f12e4bb98c8c685a080e072eafe69abbb743be84640016e9c2688f7b3f94cbad5102ea19ed651abc78138d3a45d23082fba46105be81a43628608758d206c5d23880c748d20b2e8512387837104176ec7b475078e6743139b344f6feecfa569d03bbc1bef860694f6d25a7d97cea2db13eaee70987ee62b75603c618c2674e3b80e17e5f79aa0f520415c264694df8f4b7ebebeaf2d893461a591dd5a37078631c0187437dc17ba1b3a1c72747734705c681db40e9270927152e9d640136718cad7e29ace068cc93c86dd5d4d77cf978929402f519076d3ee2ed22b3314e1d46a706a2c162886f44545895363b1a8286958acdcab323cd15dffda4f1ced9d655b7bc8d0e4eda8d531890c4362f8d96766c890830c3990a1c56764f24167c5a68f410bddcec2e1836fa9876dc622a5320a8aa184c1c4708ce59fb94d720f26d27c9f3eed6d3018cc7fc800e13ffe815c8703e1ffb2578c077191e6577ef0878c4873cc07caef15c43e5853e37f6d9dd1998cc70b83c1dc931169765b639c09c53437f04a908614bbf43a5e9a5ced95c14019de6aa9d76a459a2f8e59b7d961ffb2170c1461b74c617e29b61646a4d94139e64b6b3030d85350cc141cc35600b80cdce8e6342004c7b43b93311913ad18d4dd4bbd02434d77df30e4e1d9d0d0c4963e9f2a3485c4f006e5d16885e5f346109dd7dda8ee869a8d499f8f6dd17c262afb7bf4c4b37906fb7c9abf47eef94c9674c9fd6363e8364b734cdd73e9e1688bb00c4a52caf60883f291a6b4e04d1e25297561a7bbbb7043176870218c196771d1dd5cc0820b176867599acd675e5cb8e19f9e47cb05212eece86e67cd7877bf2ce95e6a0dbca0041e9855797fdc380d96a0ffc0f16b7f36ff0546a07ba6bb0dd0ddb857614cd1f87ab34aa5f0d1b3551834d88ab5067734dddd0c103aba3b9998ee071f7ae8ee0200f3d2dd390f3b74773ae4d0e1e8ee70e8ee6e747736ba1bba7b080f961fbf5e3010941fed931f48657e1fa1ff9a05418b94eb1d796695626102dd2de4c9a83ff5a7652a6d9e8f90cf28769c29bd3f67eec873c798ccad4a97d198bf52c43399eb7ff78f3c3cbf468f64e8d7caaae5f1963e19f3c74fcbb5e55e2cc7058262debfcdafd97bfb6c76efa70cef4f5be437113bbe5616d2c79e73541aefc178b45fedbd3fa310363bf459fa4c6b89549bad451e8cc949e5d13f90126e314922cc2489aaa5d9caaa90908c02129ae08329fc1474da48a5441e0c2601cfc38c3f4bd0f6457ee5ec6fb645984912e596cd0ee1505e791405252888a1fbf1485de893600ffe7d9b63aa43873f2d531fa1d05beeb9cc3a4c7e0c23839f525ced47435bedf7e0ac3616e31804afccfb59b579327326c738cb733cda246b5daf198d618aafd7842e40109678821760784c8801139e74d778965e29912076d8c0071763b304a376852c16ae966216eb7a1e3042174a30c14a09573493dfaa742524e0092580345f6dd183efa3841f25ec284187125eda6db6fa8c4b9f558aafb7a3c662dd247c1272e8de51c78bb19cf5672d71acf2c19e249923ccb428a77cb158f75fe1c71444af9080a46fe06749e7872175d88f37c3609556f9c1ba9ba95747f002ff8831ada17d9fb374d17fccbff98e5fa3581e8106ddddceca95862f495363842a686ac28fc9083bfa06ded47a0143e84277e3904af0934580e95ba6a0ccd7127901e3450d2fbafdf64bee8eade8acfcd863d365323b842138a0918410c6cffae2ac5291084a1a7fedbe0cd770c6df1b11c22a085404610141103932dca7f7c7256310c397b10d5f59beba3931ae95f4a3b2af1f0365aed2f6353a0b03fe9775735ce45ffa68c6607831c9b09bfbc2a4afdbfd714937e7852e70e171a56196f7b36137b7850f65ede662c085a1852c841f533787856eee0af7f3fd6ab3b79bb342777355b0bd3255d2cd51018c29747352e0a2c0414126065faf26a7f63131bd7c108692a460eba3a2fda8685df9937e5a22fc0f943f497eb64560555afaec50be16944af58e3c5529490ca9047b98c456fea4a04f4a42ba8d3c414c3fef73e5833d3df54523db1789e10dca9f9c0fbecb07293fc62d9bbc9396e911a19c5af821e1c1aadb592eab893bd841bf644c87ea0dfbd35c3b80a2bb7730d4983e48693671f4d50e7ae8b6f799e0697b7430867679e5b5f48a3ab041fbb5321d24e9ceb6ced05ba64a1d0d0f5604ac089ff9697b28ced4abf4f36ed226bd26b1907b3847a6573aa659c9bd6a69967ea9143d7cf9e35e683f71b4d476b17ffe369789f1cf954aec6ff34a1f8f0e4a9aeb672b7a6db9f7978a4c3f416bbf4ca54ddeeb92d61cdb3c8329ce51adc58e5beed55146fb32b561fcd7caee8b7e7d3a8e49c7f48e53d2d8994baf63287358962f980711e23e428ea9bc52143ff04a7a41d1bdf949c7f745bf34d7f7a7cd464bcba0f419dafde9e315e97d507aa6f9431a4a7ce9d3b28bff4b6ffb6bc35b951f3b722f94dfc73c53c7d227fd666858d240391a01a3611974e3f9697b6045d4eeb53deec90bfa7c99e5a499f2693e422eaf3c024109ba6e323a6de8326b04ec699fecc1b022aeedf16013e6b7d8e71e4c9444b2dad19514a44c63cb3d893f5acb8ff318f38c29882993d338ab0ab98741b0956dd13f2873d2088465467934cad648928fede949d5c075f1846e14aa050c6841d6a20cdd58095a6021c4b5408016ae6e07e2312fceca5882550b67e1bff6f3cf082d502dc0420baee0415edc594614d102167437ce34f60af2e2b1d7fc3cb28828f1d0b4004877db2b2e7d16a4c134f31fd39c84b0000656d683ef2ff559faecd0b5f41e650a8a49f3ca59654e9a31b0c21578084aa07705479eb3fce5e9bd926705439cb5821b56d0e2ac1967cd74e0004b9c208c0a3cc0094cc470c2c62b59233e5568d25855b2796cf1a8a0460a22d029f8d142ae2599ab109324f2c4b7f578581279481ef61a3ceb8b499e485dd7c7bdfa5fa5f897e8cd494c92c8bb3d2dcbccc86b635c7ab5d4e7274df26ed2e6b36aafed43fbd9d6b0cbf9d371fed95fef633436a9e7c04fb925d2f3a6ccc76e9228c685d0f8fd6c8db8101a0ffdc1d8687dbe59a57656ed687d5229fac7246de647a57226637efd0662f7268df9cf193c696ce696b10d6570cca431c739661dedbda36db987fd43fb7decca3969cc7f6097ddc058953dee39a60fb6dc731d4dc9936dd1912d9ad91ecd2a9d9427db2226497481b22db2459d22626373e3423c865537a04cdfaa1bfcac3e084adaa7ca117ea6b28cafb5f98f20411c94f5c67b7b5fad9242ab663849240d418e10f5cca020c9c8b1d3c15c01a45f5e5eac08831560b022095608a15ff75f33352efb5b834750bc237ecdd097155878902041ba3925ac586245927696bdf77fbab9bab24255c518aaf88226fc986ac28fc9bec28f29d3f9f77b55fa0a3fa6d7b358e1c754050caab8a28a0d5481848cb34019e3ceca4c3fe3acfba0a5e5c758caebea40f043f7b45fae7fdff6f5f5d9d6d7ebbf6b6537bfe694f3f158c7d72f59f1f592d5c4d7cf23221f098ad6c8df2359ed48f6ea03998ad7a4b149637594fd14ebf89a3feb8b78c4af9fcd51c92b3fc661da10457777cd186770b252820b4c06a00520babb6d4c118612910b6c58823066a0bb4f39d050400e950c1820aea0b8820d3f5001880b60101101ad1fd0c56aa70931967a50c10204a0e8eebe81ba424c375703952c65fed5a67678c0d5588880a341b6168948c4f9933a008637ebe32bdfad75bda00353747bee79961d6862d501a65b77dbe8550790d0bcce28eec04ef7273bb0ea6eda975f360515ba3be9fbda6b3e8b25e2ef8d4c11d41951dd48b183951455482105adbb3116edd73f800107baf8bee6e200adc6c318638cc181220ed874b70b71677d8d26d318376e00068daf5723cab0e6ffe6580dae76033bdddc0cb818c880360577c3132dbadb1af9c7a3ecc9f5c3472a7a222c8fe495473fafb4b5e6cfd9f2329324f2e4c78896f05ee6feb570fc6e4efb24bd1fee71cf669759bf799e6dd12df6fd8b331a734cdd65d6ff99d02c3f96affc20fc77ce56a6211d9a553aed577fa6d0fd3f2a9a3f3f5b234a60b645f3319647f399249137df27a4394bc7de7f1406f37fecac198d55f9cd68cc6fe0fdda8cc560cbab4c66416b7b3c9aa54f5e57c612c80b479a8ca5ccfbfece2aad5539ab3453f71930d7af32bc2f4a9b7bf545b17eadcaa7d9b274222f1cb134e28154e6fa8ee992c777948d38fb8ccc7ef58fcd2a95d94a430fdbbe0e79538252066799fd64fdf1a4056ffff2c35f031f874fcb9e691dad5779bde679c4f5dde62599717d30670aba046742f207a08312c9bd4c65328d715c9359c7a2bd4730a7f16bfd070cf683e51157c67208e634ceca1fdab2cbecac12cfff8a337d9ac4a00472ef06fa8c8d78fe785d3e6770b5f4beed5e098e1f9520d8720fb41753a0c909f7973e99b3f42afd07a8158eb72afdbf6a3faf965621e9394785b9cd3feecd5f92b13a7acdf86d16947249fa8cff5fd9cb24befd92bf4c26499f966673b94795dc9332b7d87fcad06562aacd0ecd2ac59812cde7b145342c834079648be6dbfc48b34a339547bedaa2fbd91ac9b68886f78f6c119e7504f2c9b62863caf4833f5b23b9ca8cab50b545f745516956ed3d3291b024ba554964adcb66876695666b64d6fc928c390bc90809e9c77b8488180d4d06f860400f1e96b6623a9190e6630bf60821cd9e0598c0731d71cf75b8cb817059fea45b0ccaff2428bacd8fada57d3e65cce5fdfcf306d22b437a45cfbb49db0d1cedcdab74e998ce580c4acf238f7b485a442c96cecd28717dfc37539d9bd1f1e3310ce59dd92bba3fcde5b26bf32781bc59a5347fc54a61b3fe7df1b18fe730199f899159201ce7995050ce29c1a7c9af5d7bfbb08c0dc1cbd42dcd264a22f7b0cbaccd7e1f8f33f3636e337520f7b07b7e29be8f5bd916d9fb44e07c6d52b6450fc6e4d30b946dd14d82ef33bf058234274dc95329289359164d4899245118b81f14c0893b878302249147dc140ad043b74765f47ecd93ac9e00c39b34d611b17a820a7b3da9733d41f319228017ba46802cbabd99f1cfe82ceae205448040169d051a20618455d261048105b815229c388313656898b39cc0818be392b54342b74fce7e08cf9f75b43c471c1030fc93e602678026c4e89e3337f87a356238ded458ac2660ed53c5d5e820703a5ee0a0a9c0e5681a704b36f87a4d4a68124253164d53c88032db18f767c1381dbe5a1fdcb2734c9ab72f32e91c939a524b20a1bb1bcb979de3e3d7fc3ada39e29a77fb25b773c4b029d482d93926fda5e39247eaeeb0574a9c414545650517e1a1cd78ec515151597955098aaf57be5614ea9512b3bb3dd17395f4ca5a8f0b04650f7eca2489e6db2c084ac74f65964912f987d4e5c97c4cbaccfa2d8b7f1df6398ddfc0621cf6c11cd76c41ebf3b18cd9de6d7650d21abdf9a319c7ec151d53ec1ffbe169f1cce4fd9a741f6f2e7df4c62c763bddb6b0a4f9f459c556bc81194b90f6c99ff990fad35ca227f3587ef233aed46130b7311094b2d1de62e8ccc792dc9be0d35b66fa5ced376795deee8f42b857ad8ba3cfaff2c149e5ede65a3fd32ba9db6c907b581cfd2b053ddb8a679670a5b29fff559ae49e0cbe31eb36bb63e9bd47637c3e1395dd447b7305ad95d9d6ea95fa1f710f5604f31b9a2298df4011fff599f9b34aec8f25f8b44c6760ffaa16269347318fd681908cc89ca3da1953a90445bf5d394e7014ade81ff36b65d2b1a4dd175d461df6a14d8239a632b2db95d78ae1bbdcbbc925eb78f6b9525961493067fdb88c8a6890181d71c9accf2aad301b10949e1ffffd6a3d337df5b7f90ca6d2ffab46eec1825c448a7e865eaea21f22223f49af222321578f12922ba9c8a8e785f4e353a4248e2eb3e1ecb157ea341953d027c65eff6df9632e93599a9ff26697fe4b32f43fe25eb5d4918adc9bef9832b9876576361fb4d9ba4453a9fd68a4d3be113b7e6cc53b8a33b72bf1fdda945eeb634bfb3095b619a6f76b81dc93a1a9d61f83b47cbb5f7bff250ac638a67ffdab752c7d562de816fbccfddadb2ccd6730683f9bed15fda33451de99cde2ed7e7eab32f44a8768117916722fbc9ffda3a00c5d7ef547505669a68ea5cfcc2a0563a19cf9b5b28fb9cba8c85d494a44b74ceff87d9207c03d1d9f0e8cbf8234d7d16d1cd3f937f0b3f46c410f3f657af7602fb039a5b4e12a3fc4e34ba56e8baacde8f645907c6e31ff3ef5485a475a963f7d87ce11380e824b40cf67955e5b67425d06ba2c32751808d225985febb05f9219e6f76b5ffd6dfec32bf549fbacf8d379c0bbe597494cc3f27e01d92bf59f14c31c3f96c9ec4f793fe471186c8824dc85080122b3f4f19979c4f2192140582c19f84940424a4b1225511077f701388be5fe201543fbd90a83c17e3c00eed93c1d675a477ccb74d27109fd1a055be27f9159a5f27d3007866d971dd8b4f73289c7d8b5d5f3df7ce6c33157aa030c743796b4967b173458420d51e87ebd3c3c1f033236622e05394881c00d1c3837838b2bba3bf9e0cc20859c01a880064e7470f0f55c6cc083074a5c1f7603abf42c6795aaa8a8acc80f566d52c42a2a2a2bd8f6f5fe4d820e4ad7cb8c0186649b8c2d18862a103d132c16b8a8c00c2f350c20720412028098c10f96ae0c6d5f943403d80c80341395fd3ddae19194e4d54c471b93eedd87c932bc16688707c630bec32329c9e77b39f21389f978bf646b1f96594e9bf1a5e34fd0c6781ece3464e11fdc061e4df46a290df6d8ca6a96898179961306fb8c2de81fc3232dbbcda1c43098cc0c8be58a818d19ff95d910d32a69dfe3fc20053f9a4c9b51d0f147c51610191a96412c96cb6fb118ffa868b34b228709710181854fcb324b33b399c9f2b84753a9117b84a92d0bddf1dfbd19f782dc83c1fc16f3fc492e9329ce21ca3006bb8767f2288252a65277cf4708044799289fc6fa50167d2f0a59179effdf8b494c3fd615da9e6a8b4050f6a49a7407fda06149bbe38ccaa62d5a814a165d900214b2f8411634c8c2052e599c200b0d6481812c2ed0a275191f629ce5352ee383fb8c0fce12adcff8e031ee2c37a2889ff6cb629605518c64e1eb3df14cfeafac8e312878820e5460d3bd45770a8e6884b8cd82cefadaebc562dda41e2858e1eb85d7ca681d6b30a6738c29be2002170ef4d039e1095500030c2948e10953a842159ef0042a744d80c2143a29747750784214ba3b2874774d7842d784f996c59a55ba24337e893883a3024c90e4da24cd357fc458e8fa4cca33ff68529e1284a00436cf84de64f47bd9242de7f99a75944d1a9b34f62241029026e5f17c846c92e6f2f2e3bff36db149c1196871b59f77dff6b697b5dc1b3f4ae46511a43c951279544673ad2f8552c4331a13479f349645fa34c6e3552b8e1e1b99607b3fe95f6d185a1905f260305b8d8084805c62af3fc424893c7b9f09917b5efe1c1c984c8fb32833f860cd3d9918211bd83fb6b4b7d86fb1190c8379a518cbafc924f7503388ba2fba3ba563c2fc25eefd27456cb1156d93f26471521e7b5495c09ceda5b9321e7df02f8d6168b5e044b084664271feff29f280041a7f8d82f225fe2f81a07cd5919bb97460a9c79d299274cf0f65ad79610982f285e58bf66519a3656aa3758a1a7a0c2980a400428a1e383005070ad01ce861e9ca99145fa27cdab4388f9696a94d5cba32fccbad34c59cac80c10c5ea49081014d2e369e78d2dd42b87895611563851a366ccc20b7c0a10762f802474c0a826e20ae7a704318dddd583447842acca05d9e0ce95b95b76bc30f2de8c99857f975772ce8ee5620c5119d13bd347f89ffc879d2f0c862fd945fa7824e8a211a6829409155e97e70d6ea5f29586904589081a31474772890428af99af3e7881bc200783a0306562e10740131fa0244b8800d2e70006739aed6412a632e43141304731af7e657ca03739aea32ead73a8d058339cd0c4c46862826c867787ca6f6578c81396ba952b047082277ec3a5ea537105b8731fd0ce27930ff19b5d959a90db437c93d2b131f86619e63a39d5ea9d77f9ae3aba5b9c56864329ba3da2b66fa59d6e8153a6a39a63e846e214c200334271c24408109184d60c70452ed8923cd7de91fb38f5b3435d6357fce960d9f687ea6f32783946782606bfe0d0425cd571ed97efeed8b7c0d04e5f722befd12911379b007a9ccf73f504a19985947d957731361623a623e49afd882c14c70fd521abb56d2fc6b9206829702f16079548566fda942570259eb9af50704659864ad6b0a4951f6dcaf195da349793210b6453ed6759bd2864f548564d788951dddaf7dd1d0b47d91d12de6367bf86bd671cbcb9882209537cf1e04a9042bad4f536db575562bd264d983feb18a29d591ffa6c3e5fc7aff9332c7d265e6dfaf54e696c5981c1b6d16042d907b5e6bb72a0325ed63d58ed3656e3178566991bcf248c64419ce77518002bc249704f8a0bb9d4553930056b52e795e224662faa220a12348f7319548b6db9561382665f93e4f7b982491d2102dd323980ee54f9ad4e75aa0fb59d69aff5d4bc3f2e72fcd8f645d784866547f0883600be3fbd9debec8bc7d118c6d1e5b4938394aa212ce4c5f548526e539aa230dcb20a1bf3328337d517d26f60265a62f220247243c85f2ffb53d7866b3ff5539622c04ca6c5df367f3bf48f6480f8af4baac6bfe6c5917965d23980ee1c716c4b88ef728d7affde0db1749caf82978e50f9ef2832a95b49e6a84ffa3d9824918cf3a5a24fc34337dd1cb24ae4af8f645a88f05938ef087f41e61fcf5b31c0a3f242f9349b21b084a9791ac0af9241999429986a1fdfe1e1505ddf23d32f2479c6164628be62fd9da23c5c6249016e9698202dded554bb3c44c92c8c33eab74c69b79ef334c219324728f36a334bfe5fc571c63f88d6a848adcf311a2984912794fef8b34b1117bf466797d843cfcfc4919a6b1117b1fc592e763fa892948bf3ade40505e1a96365b59ed4ca6add8881de7c84c33385398d8886140e995e6be3846a0c9095ec488f631b799e6fb622b3626c9a26c8bfe816cd16de9a339a97e8d12a992283626559b51b6453ed702f500f188c10b54501179a5f33ddb3a290fe549edd0ddb25d982ce9f6686e37bb7726e8ee94ae04dd1d09ba3b2c9ededcdd8da0bb1341771782eeee8aeece8a76b93d71b941a0aba2bb03414a4745ee9800f48b0bd316ddbff402e567db0a0f2c80c91d6054830d2c80e5621b22045656696bfe9cadf9773caa8523164607ece8c060309fa9d293c137e22dc7f87c98cb4af321cd474c9248662913e3bd78cb2f201c270706bb367f12a8fe4873390ce6323b82a2e3db7dd1c3b16e4fe6f64b317e63b27766b3cf54a559958a5eafd7eb2682d3865a844f6a0fba7f96a89893c5c274663adf861f2e591104e5ebf318a33757cb83452a52577dd1e80582d2be5c429fce584af0af4f9750c625fc0114a31d535005a0140dcac4fcecca216b5d3f6d8fed8bbabb0fe0a3eece035d078e745348d1dd4b50f4bf5e1d521d5d81ee9f5d49ebc9a3a591dd5aa534b25b03423242c3320808c98851517631a25d9438e96e5a6933f0886ea08eaf9176eb39656c7c197de5c74a5eb111bfe694b11a1bf12bd371c9cca7bbbdf0b3d06be6d2cebacd296ff82993bde2df517c81205daa1f4ef9ba31b5ac74af04e576096a6a97200ab44b9014ed12448276096ac118633c135a6fb3de6677b784ea7a9ba8ee89166da659d77721875c42dd2d8a3094235ca616f87af8755ffc68fe10009496afe8f67e32f41f302619f6e0405c8649863dd42c8901e97f5ee34b605d91cbf7452f79ccc3dbf16c686695d7e56bd24d9a24718945015f4f0c3f2619869d11182ed20b4dcbf4ca1a2cda1c24cdd1271c2832b8481b3950318051009600180bba5b0c2f0d26448e178b9563fe772dd07c303cbf9f47ebdefdeacaf525ed88b3aaa5fe365ca5744c25114d7516a6710f9c5539eb8fcf1cfd783099239f118a8161f74a1d2604831dd1380bbb4c2cc63d5ca9cbc818f7de1372efc53babcd82e0d754a12a45fad17c1483298b856598668931ec08e634eec997f4b3184b5fba32bc9fa50d5b105325f75a79bc19069341e233af18180c090c26f3f2192431b050c230ec56e567ead7ca68fde4d717ad0cfc24ebeab1f78978263409ffdca48d09ad4ab9be68e4f2427b204833b6472eae2c3afff5199c1f7b917671cdbeefe2f2e15a75fbbb247dd13e36d525c902dd4dfbe4df204930492b242ff48cb3821871bf56fa2a422663787e0db4f8ef274579bf24f7eeac8f858e5a39689982d6c6602e6532213231406c18cf1e7c8df01117474e9cf5afd7112c63f7fecaa3212e4739b8c5e3354a02ebf64b2fa31678ac97d14cb4f9356334a4bd7729dac2c5075a77dfbe48c672c8ba8e96b0740115d9dcaf55c885e80ced2cb0fed0ed8b30492221359f786924add1d0d0cc2a0dede75126f4c664ae3649c39ecd66b3b26b81747cecd071568eb38c80d1380be78687632afdf1486b533aa621cdf869eed76c06657dd141f9d7415086d8ad95c1e6675006c1322869427076e8dcdcd4007116f5db2f55aba3e708490756f21b4865fd2c274d661abbd2ab742360a2242a62b1604578cbbd9f493cded1def2dfef87a88504e45e951f2843eacdd8fa78746cabc51fcd32b47994560ce9ed5a99cf2a6de836d7db2f591a1665c5ee984912cdaa1db2d675fb2278d6117fcdf4c8943cd6224dc9735f7ed20bdfa7f829aeb6073fc55509734124a9f114ba3fe507e1913300c70497808e07abb30142d23d7da8f0b0ccd29aa47dcc3fdb29824f7b4f2686ad0c7fb6466ee0953fd6baf091d0e62a69472f22219b44ea39824bcf153d14f064625c26c66d5fe4c16cb6c260370e8463180d287fbe6de99309c8b6fbb48cfd9368331a64adebc1af2a4dd068bef451748bf1bd2fa3234093a6656a7b5bced11c085c8640610817435c30240443ae689f116d769f2f81293410861b51c411e0d111035021063c20020c98a24b61cfbb8fdd4e8b6dae740a8139a6327bb3a0949f7f3e94f9fb1af525c7f3da0fb4b4a5cf0ec92c7db89b91309c2149118d178b3bf9d06628420d2a4076f804ad8d161e0e07252e3eccd0a5e82008dc177cba2e573174572b7b9f1b93adad6aab0b0b49b7b3be71da2bda3bafe02306977669dc0ababbb6cbce10ddb4d217ed630bd2e806dba5470e9ae6b3cca70b90c00727f4cbe651be5eb4f97b3dc6f8bb5ba65d74b2f4db2fb9e85cd1dd3233b75f8a41892e3a9e8b8e4bbbcf0f814b8c518e4b8e1bdade27a2da22515e9b0b8f17e5b5b9cd12537984ff81aa12d24d082a81f02f49d7e339edf74f6f53e6fa492d979cd105e70baff9e3ed157e4c38cffaf80608ddb7291f69019566e9d5beed6739329d7f1f869333c2dcb3d9e6e39ecc7af8d4dfe65866fd8e36db8a41b0e51e1eadcdd6a5214cd483c4c73d191094379ef1a824c6671e6560309f3fa3c303c7717e4982312cca9b1dd3948066fd2490023d189355e9c11815cab6e85ada57e523e1fc184b9e29796cd17c8c6d76082f7d762829dba2fc440f8495aa50f831bd667dec0284145c80f8a2bb6bb8c8b4b3ae9539a6443d48685ff831d5dcc4fcffd9d640fbc2f48b69c9e1856e677996b75f3a6dc125c7cde5872f0ee084065c7a68f2e0575d7c6872e9a105dddd2e3e04c0a5871f3de8e01280240460083098d71c06739a6ae49e8c0e1df84af0fbe9ce802cb4f0a402dd7d4a7da1095d82043ce9e67e000201785711824642143d43bae50a0cd880711854bf80d1ddf3f52f1342b795552dbafbbf6aebebc94b5377e3db2fb9bc80fd8284e9eb90ee7ee9a15f2f2dddede260d8d7ed975c1c8beef628ba277de5c7afec48b48b27e9c6f8c19707dd6cba6536bb8d6e997cf075c3d053b2b5f775c390873078f882071ad0b0a4f1304577ff155f5856135d7868eae681d65d2d0f417d8bbd78f06e1e5a70aeaf25e174d9410c2bdbe10b9cebd7de65872cba5faf1d9ef44ffb35f5eb5ad98be9e70e30ecb2c3102c5d76c8a1bb6596f3bee8b2437783815d74104237be568bbebf74adede5a2c393d743d15807b0f18c76d1c1e5a2039076d16146663965fed045871a5c72284377ab7eb8e47002971ca668971c98da6dcea3c883aff7611ad67c98862e38a60b8ea3ee6e677577479d5111b8181475441c18432e3850e1e1eb81348f348f2e38342dd3256b5d2e37b0e8ce588aa2286f24e9ee59a5f3ffb3f7c83dd0d65fb237e698dabebadcb0e1ac710669171b4ebafbc5796cf0e1edbb5ff36399907bb00963611ccfd8869ee537e3985239236bb62ff26618c6decbf76b31500b5450c210495c0ebafba75d66848148055654fbb766c5299ff655d9eb35657ebc642df89a556ab16592e12b632be6d1be6eb197fd5ef9f12b3f7ee5c74c327c89e1f87a31c9f0beea8bb6d2d733a118835fed4b7c8563bd34311c5ff9f10bccf9f592d5c4577e7cfb5e184bf1167be5c736f9f1a49e1fe7c736da85c602ba97d070a101a4bb8e373b7e8aaf0726cd17a94ba42edb17b9cc507291310417194980a0ec11a9cbcbd78a0f8445eaf2449aefbf9dd5ff44eaf2f07d51a499f649a72f5ac79f6f3cf78f64963ede2d5b91e6cfb76a1fa4323bf3d3f1d29521edabcf03c62e3862ec9e0374774ffee72aaf1c6732f071a64fcbe158dfbf52984cb558fe8d81ddbe887ba224c22275f98cf258eb12a9ebfeac1428dba2faa251f8f7a87b19800b8a4ddbe0e0e4b46c124988e9679518bf28845205171429b048337e9b7c8934bff2276ffe6bfbfa126916697e752b432a5b6739a335c9c5526c5f534a49d42433334282b80cd3a43159f6432ca46b94653fe4ee5e930cc099267d756106324899a049102101aadda874d02926c29e251d43684660041000002311003048281a8ec6c311c980526eb70d14000275ba78985099a94912c514428610620000000000000000236a04a00f4da19e635e841852b470772df4109218926ed8ea927039c168548507066047b82d7a747a600295edd01c7b55a7a53e0c735fe06c51c39ce7017fab1565ad040c8387d59dca5dd4a58a1ba8a6d800a6e911e1ef1149000978ae7775381016ab541ae667749d2b1bff14afb07f0aaadc8aa2ebf016c9917093b777d3aa99e69b9ac5279c43c7e37c1d6b50f281085716582abe678f68a408565fa2ffeb806d02fcff7a4deda7da15817c9d26e78f23a5c682565efa6b4556d923489c7133033eb7444b9b198f3b25c93d3edf1e2f415ac5903c7045a29a2e82a843f9bc32507fc17bdc0fbef093a4e5383274ee3853962199aeaae70497e3d59326a7e84cef52898bc3c8f950d9812a5bbbbe19139ccb54f5c9d7a8ca96d01a8dd2e4d9b0f94d8ccafc5d23abbaf832f8c9390f0562a808a6ce753962b27f74d40a0a5021dc845d9642fdfb1864e8b0fc6acb0425106fe48187fe1ca3b4751ebf8deb72706191849e4cdde49b7e96a3012526fa9e9cc1201b740034da6b99e9bf8ddff98ee4f2ffc23b99716aa067a62cc21d33313862d6f91533a036fe4ed3a3098f74f2533d25c49ad0c1b6adae8a426601f846addcf11a0059f6d050b4fbe7f621d33e2facc2a89023bc8dfa045df939799812ed2981677f03aa52e741608c5c3f003a8151d5dadae26d6443d41147077ff2ae19a43ac36d7a6f6b50ae5db32842ca80c28a5b61cc592af6a57f8949d20537b7ae2f1f4db3388652891b8bf1d9e3509f62a4376190d0a331f9235654d21142c62a87ebea2fd5f904bb4a679f751f5e8fd865e875f9afa031e89fce95b2c22e803c4bee782163a1432ce6fd6472059c943283549c63fe0c0361ae508cc62dab4b73ad0c1e9803a61977038953d9084e29723de60e8426aaeaaa8b07e0cb80c2c2cdf3a31864370b0d4d7e1df649068559eaa156537aed24c16b72f0a823c1d522476b3d0d6a37c611525ceae43ae10bc929dafd83efbcb6b5b08d2d1e80026c1c202e7b929c6cde3db7871e7cc303e08581512d0323848b304153fdea1b8e98f382a06869401c9eb0c52c6258b1e0077c9aa9c9fd30e7895c3945b4daa771906f7944a3cc0685dab85bff21b38d21b8fa000c79ba4bc67088e9d3987d2454f5e6eaa916a1d24caab8b3fe145b096671ccf8fb4a6a9071d87da8718949373c47a0f9acbe583a55993396374c4ddf4a21d677ebad358f0c97fb7d2616152433655003c152b74fe2acf0c6141655fbe16e0b66616a5ebc9564ddfed271ccc2a31516cb3210af2186e98022df979efd84febd9dae723374ab38c2d0cdf6c7da9e436f708a2584d5cc2af93dbfb625532c226eb80569f832402c0d52b811111710e1b1e47c7f264666386d4c81cdd8a4248221e93643e43fb4a26330e4d4c7120f367136cf69699a74d07d9d6f82d1d711cdc0d2b065f4939f611bce3d17cb27f233db2323a727c73a50b6e4ab83e8753a899f5c60047eae4773f3ccec0e963a63aa81c0e7098786592960fc8eda186f0c23e1edbb4c3855ecfdfce4b8a93cb7f26926c76df8f468c41aab388e83eb25cb3ef2b8ade4e0e79e11fc5bb3aca0ba4f12b49e1ba28247830024e9d6f6f2fb26163330848c14c3550efcdc07a6d3a40742becf7b1f6e2834bd96e1cafaf782c7aa6a21241d40aba0a090cab193a45d8a05560108bcd6956791294a3ef97b422e86f715aaa4716e84393583a0b508d7c180d48cd70fa1e6ee06de09a4c308068ae56b4f18cf34668ea1bacd423d7309f705a85ed0211ca253f341f7274185eca24328a8eabf0cc4955e4f5d1ba65c0edbd4e06798994af5fca5a5a74ac133fa22d831404f5a4635a3453cd4ee13a4a3d9e208216d99bcfa4ab81a0370dc3ae1a59fdb0b30b6f0f2a32465ad410bf7e8c8677edf7b7c5180ace3a39ad36dc5b670f386dc8d6f516186ec0ac2c6d719c17b7f5916a33e92d5efcae971f7edaba0355f52159c6d12d2cdb9dd59bc8ea131425b31b395b1da7d0703e9ad9ecc5789f3f4f29ed94e2f8d247f14a8548ef9c8b91e0de048411caab47d4e65b65078cced53087e33be196d3cdccd7345dd698c10c21b831f7f6263a43794635c236bf7491888884e88cd0a9794216d87fb69c724d2aae65f489353a1ed9cb13fdbbe960341264e636e0660d2c587c6698c35e33881a98b783e4f7c31432b26fbdb65d751a133ec34d79b8811c58ca1c4640a8fa0b78ade51c7158a12fb2479509070ee44ad86aab6325bafb74e9f3adeebfca8b9c4635a9136189e89e44007f670b70f338b9715bdc1ce32583b0c56dff33aae3a51fbfb0be8e1dc30bd6bd737a596af1bc2c2a2c384cfc97d178004fcfade223ecdddd99f7f2a8be8e8d62f6d240d63e137fff6aa311c1e46dff461d042b0e8be12ad7e7f5eca17dbcf51898c66a524d05b63bede70d092e430c9b9ad4b5967c21aa58a59c4457c897c65eefcec7d69c46f004cb9b1bfb3d5a7972f7794e98b36b6ca3803aabb7f73bc7f7f5ece74540a71159fb9fbd029418d34dceddcebd4a410418f559ff6f02379a38947c64cfe3b9c0cde037462e796d5a9aff7c1325d4f1dd8580fa6ef8cc3ef4da92a323734dcad180450710d2438b832b49c9593ad6870e090f31453eb53248ae865b1f01a3f746354df6aa94647d827aee8f41547d50e7d5b391f3e7b03819f711aa17c53eea91cb3c3aaf9315ce79f25ddfd0e4e86c423b787fc9b3f6f0d5308a501cfd45f3f412265648ab02e5c91434c71eff453e9f28575d3d9348354ea24f4196dd99c1221aaae52d65373457a2524158873e4f347266dbaaefeb6c2f806e30edb9481384f32048e88e0167e6189b120f98071723f0b8027667fdbacfe5655926db60bc188b3fd10286360663c85a6adede76f6300ab3ac656a2db3a5ed7071266a89d794838815078e0d32eddf99e550e98e7a0221cf2092d0a35336059bebe590c3ca7822ccb29469789886af3850bf61edf331562f5e06f1a558280e75e7d9d3743ce01b5d235ca2564f811757394da1feac9649bfe93420210d65230e554a3dec02a41758a02b33a13ba8486a8ce5f8ab70b916c42020ad49902b4b94396b7196078ba3b303ee8ab749e48cd34faae4142b8eceb9adfaa9e7b40300f6247caa7880fb6ed391ea013a8eda0a880769a48aa86917c9ca86ef90686d41bfabcd1a13343432726282223e33daa35ee11991dcab0160c85b8d7e87e27fe80befc67d39e6058cc0235aad35cd6e3185d840515d4d911057e6b7670e9853c5232956da7a2626452a3d8b85bc54fbe650fc6e7e085eadcf76751f23994894be700152270f84db5762595cb4b57e48294d72147bb47cb29eca0149f751f2d5aee6c0b8650428b6dc65df8af4a002dff048734c798cb82c54c5578b3fdd3074153caa7330d3b6283e593ebdef0710e26ad58844a79108119b3638b2556345fc43d2f98e725a37ee8f2f6a3177f887d39d271270a433ddeab90bf6748d20b6c1a752900e11c37ad430ec9f8b7da420ead833b5bb86316c5997d4f3e9975ee983ba60a5b6a9f9acc679945ea3a9fce9b5aa326a2683c9d71833a6b9cbca4e140c40e91cbbdcf032dd7d954beaa705afc5ebb0ff8c8aedbe067fd53d2fe43e59633eeb0c8b7a089f7023018b5b5f85e4a8593cba506759ad27b3223e670a4a0740c128223e34147e412037855168ea4e0e74c33bca351989b1b44771af565a74fbc2fe17077eeb1b2c3023f46476b933a9c885562e870d7d5aae793bbe6ef7b4a6421b92c4e0ba7b72e525b6dcf94b28d348cb207d1f2d9f787b545f854002161e7314bdcaf028fce63cde2991a2ec09337d4989bb9d2f92afc3e66bc217e008a8129876a01ae0dea43076c4f2f777e0af58d667104603271de53cac53cb6826500f81393ab8be9468ed881417d0060080bbf08003e2634f161a57b54058ec1d028acfc4153eda79ca0da8416eb44df0f478d16816887479538d74b07d9c8ec7528c4ce13451d66ab12811dbde8ed376ec536ee7812556b24fb6b773c784528a5c85283963a2dfec0c3e2fd7166c7c5b84bf93473ed7f14783e278c145519c035dabb29f8d1c32750abd33276adb5df4cc58179b3f0c0f978cfc4f936d009326222cb7de1a0e4c717d9f8b366e71e07a0ad17a4d2ec7a7c5ef39f405a2548d9e0a078a16a0c5b83b1e0c77350bc5c69c83442a7c105b2c215cbaad743ec193ea07951abfda48d7b190b28dae2abdb3f298b65f556958b63ffe21f7752f3be9bd7bbbd179dbcb8705c6884117654e4252e8fa5a8d62204bb2031b7a7290bd3825fc07bd35e86788623e5e7ce40fc82d2e299c20b51c157f14a6152c2c80860378232747f1cfdb300a5022720fa8b467897393a42f31fefa0ffe6c3832200949991253de1aaf13f92f093af4c213425e90025941359f8ffe1b7ae043508ced2b417e7114c2e986b21854a004bdc9c269481bbb682380ed663a1c1c8a3c4aab8266d72cc0b83c0a55652b2df6c03b41f36ed73f68fa9f4ebb193a9cafaa8527dacb77fb38cb307abe844ba2d34b1a0d732b80702da7975c6fce677c98e4d28c4bb7acfe65c08148195d556008f16def3bee4b3f2356ad8a019016b93c462a48be1bcb102887feb863b77b1e29d7538d40a82f2c444bc079ad200b4fdf91d9201c033782e6049b4a69dcbb65f40cab692b098945c533633164c7e96e0f19afbf1d953a07feb2e2f672e2ddb7177a0cc5990ecaa1a75318cf42899bd3e6142d54c739dc71cde449242da21c997b2c308e1be9ec9f2bcabefcfcc8866fd7938b9185a1b7c6afd1f7b1fb8517f01478e7835f9cceb7e8accc8116cec4987e168c7d678348d81257d506878ba9e9881b6e1f7e838f8416c878c7b74887d2ce1a168bedc94fd2ec6bf8e64391088937fc02fc4f275316d0bce834a880127cbe4f7dc8ca571dbc81096316a4b4596340637bc032da9050a8a9e4ad81f16d051d11bbe0c2f2eeb148c75be1b4f57ad5e213870b5803268b2f51f00b7b50336104a747effbc8453b9e94831191cc80e09e55050dee113daa37263a0cab76831f3d0329d5cf019b52269f4b11032b687ffaea150cdb150934242d3ec01a10da9b8594655b2482c1db6d00522c5501d458057a8456cc1b8746caf3600bec6ae74939fed979e04d0445716aab7dc064acefb973f4642ee724e7a9662243d0e08e0a147aa261e82c49032835d113ddab791cd6870dadf82b725857c05ea6d0b4143643d713fa4e788dac371f0c286d798bdb97b1e02ed9aa08e3f2c95d9f38cd8a5f3675c29b2ce81a5db38f8998ddbd88244cd13131eb647e2e3db0aca4e4405cf35c7ad87c5e34a045c6074e0fc02ec09f529a1a67ec89c8743783ef1930fa310485f7e12a730e5ba258eae367e9c8d50cf602e03b4d4ccc86e5eeecc5161226b0712b4514275ee5e44aec13fb027730b9e0e8c7ad2c4307920fcb831bb17df7698fdf65e58cfe3605dbe064e7f5c83e6e7adf44993891ca2b7d11cbee93e23828fe2e43798847fb5b2c3d0ffef74db161f9428c1ab8dc44b4703f9abaca2785e59511aa098f6dbfb9b8c8443ee5c0a1a6d1096a727ee1c87331930728770513f709a8c0a1ac98f0ec56f23f3920c6f220b54014aa2c6420c6ab13e0efa7ab875ec354d978ac0a02412007684f9ba4788a0408305c13af65ff192beccd30b5f68f9dbd66130a3cf949e5d1fd928465178eccc0ad4301492dc1d61f402e950346315d805c0f1a7f91047ddfe40bbaa3429540308b90733a60ea5266b6c320abe602f64c079a2e63794d41d29dc2f9b0ba2b2bb7c742730e3d13f2b52a601e3056707e21791873fc23fae8c4669359d393819e59b7c90f980b2d01f11c1766b34cfbecfd10f5ddffaf2476d29e286ef08d1d0d2ae6c56172386b8ddd2d32c74461cd69d4064ee0cf7cf5b8f8f7ef93927413dab0d19c8869654bd59b1ae699c26742ac97bb5c02e6acac75de558be6c6dca76934e3029f02dc4f7fc1c9f04c5084bf85aec69d018623231119dc2762ead1a71286872f5816ff21ee2265460953b3973e4ea91ad5590cbe7c25121273d03548cc63065b13ed17d774caec71c11271645530ba21431cefc0888787ad11200e24b6694cda6f8e3c813f323ab129304e08e75c452d4086409405fa29bf7e56e58347f82a9ae22cccf277f8cf06897d89da1cda383488f05ac201e6730dca48cd5fadfb7ac077e3b4962be684f46de59ad4a027da75a037138c27fbed9878dc1c70e3036e295a4712cd30b4cfac1163502e5bd443ee1df394b44a11c6bf3905c20492e2098846b4c5d636e09b8d43ad108a15c41aedbac27e1662ef24bc6b3abd32d3f61d6c5bd8ac90ba9a817a7b39444a3a4fac751fba3b0d5c05a9212e45f387f688205882ece68dabb2b45d41acd8a972ebb9ed098ce60136624f02776652326d944cf5a2ac8e658723258b4747f8b892424f96cb1f5a8f7ed51996f9827a24c03d12037f2e347f27f690e33ee13a6ca61e0ce4c321b3907ff91319b7132e64899cd4646c9cf005068cdcdff1506c41bbbfb8aa0b399069fbe9fec4e6938e81261680937af79a60bb8ccb136e7fe16e811c362bba603661390a0829f51e09b7c81fa7cf437d50db1482c84525286fce7d92ce4ae084eed355b24116138bb5948e744b2356b9b53f8db44d17784b2febc0770c3fc50fd2082415e061479ec5171f9207477146b3494945b7435ce8840d5739595652e25b7f8fcc909d5d3ec142a81cdb8262e4aa9ccaa50894670488082b705f0831bbc85f9c7a8195a29e2c2a685e26dba781cab2fbdf69467ef165fc1d6385dbef4a38614e6586d543502c809a7e537d6dbd148a41288d67efeaa482715d7c0facae80836864ce7ad74ff5f9bf7caf9fc65dc7f23b5dc77d0f3335d70fada0380da0172e58162ff1c02c0af277e6d41099a4d6126560a7606b26bc864d73d3591a80a1001ad92b38615c5cda0eb3b55be82231734a4ad0bdcbeefd8d37544b5d671e76e848c06eb6b8580e8f857d158c4ce1c13f69e8e78353a6afc046dd0beb4b5541765312bdfbec1fae8988e7597e68279a48359429fb41528ae70beac17bef97b8695025d808b8298be43bab5c5aa9ccd8c336379b3d0ee6520b781a8cba2745f0106d8886e0a21ffc7365f0d832d1e35bb6fd23fe7ecf2382fee204f8dd70cfbbb1e475e5d65cad12f32c4225e4b50b6f21760ae5386360a05ac110013bd0601da9c4774968dfa26186275399af309c7be3114e84a0228a1b0014ee5e19e13daab1356c00a5f5dab1c5daa6b94b707600969bb00d5368ce72d4283607959831f7b0a061e631ec3412a3e0b94e6ffe365ac7bb84014b856cc34ea96886521abd9a8a5b0e50255dc82b46aa0efb952e5445da6bbdb12d3d5bac6192df9f2dfd326883bfca74f6aba28f8c7d5ed6426127a880f2899f91e45f2c180fe0ce5ce2632cbe19249f680b8869a04d6eadcd50f3d2bae1de55a0bed029a493d8c520ed6e52a76884e4d0ceb2bbc063cdfa842325374a7d04c2f96f85a8796ee4b6e438b0c2b9a7e61583f476aee31bc04fe73512080297d1061be34edfbcf606a09dfd908333f6fe227fc3284532df6e4917c9b0a7ad74b414feca19872158587e010963c83de8ca72768de1e9ea19a053022d9e461a6e08e8008e95610e7b9577cc0e770b99a70255b6fb4bd196950be1a44ce0610e3f281ac54a15ff7e59f460a4ee9e8cd26db5e97ad7a19fe119f72da60fc5b6cb2c2f7a83aef94387fece4570590a1524fe165a88abc5176df97df2aa729c4ec7f6ef3c3fdf21979452d2181c3c491a0fd9eb0d9fe7b58ee4cafba2f5c7170303ccc51d842641e40939699cc64e30c4ea7bc3a9f12a9a770d0a028f3b2621d0d316e428aa530e7649c57dd3c5cd257815809293ddf9353e4fda338e04a6a972c34b182dd73255352db3b8f21c9e3ae27863e62f4b3598750f052891f4acd6a44b77eb0b03b3da7cb0da6c6380396b43742c9dc4e19d979762281ab125711345afe7fec2cd1e6482e353e7faa09b9c86a350b4e131d88f02f67452366a802e47326bb39c0a32473d33d91be8a463c456be5bfdbbc78a98799fb027bf156dc9b3e8bf11052d2314fa149e95fb8c49a598771361978c29bb8fec83637a6e3a096ba3950d6bf3761f5af4a239984ad445eec39c7dbddd67b859d2fc064607dbad525ef578f8fca440509523cb9c9c97103c8f1ab69d92ecfa82f80cdb58a97d040af5547d7fe23cd989b4a78702969217e2d0629aedfef07653b10394f316287db8b50e757e8477e7894be44b4bc0790e9b17d5b68439a57033a69eae897e50ec8de36ffcb4b4f13ab8cddea5f518ae1f3509f190851b34cd33f9aae051919765d42663eb10f3ec77f6ba3bb9127445950778bc124eef9a6384de4acde3cdedbf2a02e5084bb29762be69714a60638f6b57e9784fcef4c6690d174bfe13efc3f936a92a6626c9828c4005b10867b5b98df9df25d2711757fc98e4be99a7b85b439e9569e48bcc87a04c6f656444f3415ab35b8a10d702884b3a5ba9417b31717147f880a51c03d77843e7a3894c0f0b419c9a087088c3d774a34b83c541eb798dcbf46bbc604ac40cfc2446fb8ae6807fbc8f59e3f7ef776843ba847b2da9078893994101f217ae1cff9b4ccb91e6d4649e83398070fe89d5b687405e080d1467037623b27360233a72971cb408517c1a49f0345d3a109f8f83f410d707cc083e4dde94b48dc59f1094f1a52820880cc9f0bca1dcedaca341e07f12220fddd8c089277c54ba73a2b07ece40bf67062ea64221882796404d89f444d52133740e63e9f4f70bbb04087b99796ff8a4279c30c6d1e52210dedc2978c79b728881298511cefee399adacdefbd83872aa3231b0386fef145cd44f1dfa931d33132c6b5462f7e608a649741c23f976d9a271a72b207cfb4b99c457f960f4fa365e35efb6060db03a65b446f12a03a26597d179b87e763fbbe93f2464acb9293d10af9961c23a67a93803e0132d24211f67535d2977531fe21d77f8ed8e63c43869a9b3330e87fec20c37dce8f800b2e81619e645eeb66242db51f3ca7724b6d7f06fdd2bb4fc609c8a04c9cb172d0ba7156dcaab83716629530cebe9a432c5a7bd630f9d391d6ec13f5eb51d684b65d798b2d513748414a0d71a6a31796ece64e096fa2b4afa7ecf4f361917b1518aa4de789e62a36eace11338390505d0b35d56833559eb387ef1c6de8dfd771d2c4386306aaabb53afab9809b35f36f022f3813febe619631046d30214c965c3a348e27a94a19e57bf1b58f0278a4755705a5f2ca02fe657849310abfc7a76f330a285758df280ae3bfd62f520bc1dd8b3a0009ab06b1f454987fd8645e37a7bb28cbd0b04b3c87d20580bbcac5c096601c5c62f90981b1696b924c9109458063e1a19d7b03e303cd7ff343b813790db28f6fc60bd19b65cdca0143e60389279eb07750970528dd2cfba7bc64ce00943b04ed3afff85512cd9a337fa6883f1787b0265714302e127c48154fe448de3673142818f5e0a98e84af0929333a8811ddbd875ca8fc44b7b136e49b02c1b477fe372f5fdea0a7c3489ef117d0063719c3be330bee5a368495cf482482626004bd230cfcc5e4b3b63d5220483e6048538a80b02da1c2b60cf34daca121e12e85dedf73bdb1f6430c4499ffa7d3a6f195e5b18c2b7ed0d7a9eb3c8101647bede6b247891f8cf6548682584564354a5b0dabe09fa8571b01a33a8907b00fbdc03f0db5f389a751c7a60f41c33b57a08f7e61fab2a3cb920fa8eba2e7ed728fcc0ad93653b785c69fe20eb0dc15230793e48e1bc0c282453c47e39ff742c4069cb25c23b61bf8ebe0de119ca2277b4e281e18224647744c2f2698c40f48255e853f58dd849729e4e8ea2bdcb0748227620e9a434aa5684325a51671fcab271f7a3d050183f9bff51504e7b5f5dcc1b687673a0750f9170616a8f4b1f43a8264b303646770d1e603c100b95ed83fad83cc7c94da040ccd02f9f3d06f3a74745d977b5608d3734589b126675542e10d92f6c6e724d3fab5da880ed8df04f118f8fc3e43d8f274d9a08c8f810c5be505c77d263de089a052759c84a510e098e647c900a03896b6c9d0423b339d2f1e178e0778bab98f5f568b1c9611fa91f9d75cfdbc6636642371b29b788c0ae7660151c15ad1b809e5c07f498678739b6fea0fe7e89b5b1d279afc312b4013f19c148469e4f342e162fb4685be8484d653061de84ec91aa719692701a233993238463ccf9800aa8737e83d31f4dedbd90c3f3e03b026641c4272a00c135ab408891313d5421d12318959825bee75aeeb98ba2e0bb426ecf9eda6b1f8f30692f4d40b318f5dd41d8f5f112a54226432673afee1d06a468fe5c3b0146450aca654a2bcc31e72cc81de290569387da1b9ba07f65033227ffec94532e5b5900c11970ceb04e3c3a0563395e693ea4f94117dde8d118eba0a5b12b343339e7034843d91b0e784dd2b15f8a9d6db0c78b6e81cd5ae07ba0dd752859edfa2b30a1b3506867bcb5b0ac10b9e77bd3bdfe9b5cd9cad65b799d29e01bc5a2221fbc02512464f0196851a7c32c2cc56a4e194d7106259a64ee263ca04984e739bb9995a235bd0b2ca5cc0241dc5c2b2ec1ef6c36d43f522dd7f669c9c4b5dd2c8671dc4910e52f69069a5beb5ab47582cc328796a11589e336dd15e9d2b0a7ba44177fce448f390eb62d78bc8f7ed99027d4ce849e067f1e4c77c66a9ed3f890d776167a2d2b6e16a94b9f827e4c16430ee479ef964f749d6075d0a4e6f1e8ed9f378c991b67d3a43c2de288da17ae36ac404f31036254af920fb74714749ea2bb65f757f926325424269ef342c64110e646e9eeb680f9b47bdde73d078a9cf888be0b3d1579637ed7079b1bed09e32c9aa61b31224a4e296eefdf0b5c8de233f1be86d84da7fb9284d34e5c1473bc8e2757d9e1abf3cad8327ec9a4f03d34bf69649b7ab10d251581a6b7d0155d45c0953fed443fce6399767d9f41ffd3154b969abe374f6b1b2ce365547c22d0d5aff21fe8000e214e556c6283bcac64507033abf45f587cebe549524968577aab100e17bc0b2702b27585d40d08e183d67c2b8a37c76d13581d8e77d24d83c161e5f034d5e2cbc15e026963e2f64cf40e6391ffa293381f08216c3c5b5f114834021a27489ca8d0c9ffeccc4924a685b306a1814391b6a2a24b5d6425fdc34c79cd6f029cbde4cfb4c684c3b223640b46691a4a15337d4365ccff0c154a922dab4a1bcdf598553fa74767af2b545b24a9384cba5928f7268164c016be83b3ee90d02b62ab83332a29367262d83650020b295ce17a3ee9f71c2866f5c2877f7450a875d14fc95e03ca67c426c60993a28a24c157b976e9129cb05f3876f10aaef934cb7b9306f536fe5dc12e996227c05cac44173c53f5f01f03d0f57e038d656297c495eee333d120845b77c36a69c99cc436531dc4caa54725749d22573bec1c6a8c9b964040f6aa8d514ec48b8e8333800d76954a86174e31a20140b1c75de4bfdb7e70f49228e79757eb03ea263585446fabcdaff120b60163671a13f87d45a40a39c66f42f94c09ec8b3585e931108493502ec74d7909760a1f968ed415a93f9ecc5931a574f060ba945b48541e5f54c3e7909af6ca887f2e9b0a13208044af9e11bc0bed20a863e7efd45b73e4e94dc4772b60971c87c0505e2ac449c9f83df4ce1b3a6bf04c5b13909b0899b2d2b6ebdf858dd7e84c743c818f12e7cfd438389308e14a8f91e863878132b1ca2c70b90f25d71651c352dede2609daa7cd434d19d456a3abb4315e79fe9f81e6d96b28e15d4e8e6c49a93882a1229e4c0d2ac905cd3293d5dc0eb634810a812dbe50e4a921812ed1df6732201d2eb61b641bed765253f02b893cdbad58574a237c0fdf5c58ecacae679118a7856bc5b973baacd8ee6990e77f4ee3ba657363f8ce84c29a38930721d432220be7242ab988c45bc42f046a138bdab7880418f02d345813b81a6c7618ffb9e32e4685b6f8c105fc706dc5dcaf730ad8954b843c4f4b9118cfc7a4ed06adf2048c63290e23ba89c794f365f96194a48ba5a35226269d2f62ef4536d497b39db50a493c9ba270d42e2a19d2dcb71498a4aac84e1c7b20ecb60aa7ec244244b5a8e4fb9b8ff24f578b978c7192ca8f177342cf21509cd0674a28299b948f4f03ad7d2cc6230bda2e55ceca214c84481e5a03eb109945abd16e89c98b458a6df4f64e049527aee15e213bc275716a4418c8ec6b6d668f71d16ef874c2985cfcbc62f65190f87e0c2b8e7963e0355e44018bdc9d2df1afa3a7eb012ecf6be046833c2aa083a639afb76b8a62f41777403e2d41d0d67929f3105e94d9a36d099d8806f7969e3fb332b67ecd6530a35ba060d9e1d60e104cbe06ac13ef0816311d08d030140840252967ed8f3b710eb4de7df6cfcc06f4afb476213be562ff8d3dee98ef1f312c80bab244d935c1cdc73596ec1789a1f25afa9bcb7242c83e96120c1036a63624586b68d58402ddcbb6317c70445b94c10a4eca946f4e6f15fa359e21f1cdb62ffcc820eb15fa1f0ff580ceee42586fd078daa0962c81af8840b09b63656c05a788ee8f0ad70172784457f7a31b6e40dd4660cc89229c7101a797d9a8edcf5c0d41fe80824cf76246c8c03d00e6df3225c1cabd5e81432434529f13962abcfa926e0660e63ec1338d56126fca008d9ad28f9acb2fb9c795a389f47344d3db74ced0c6682df376afd04f2c2cd909ce73d1ccc9f9fabc1606800f3dbe1f86b7c827a3de138339e1970688525f9392df3dcaa542d92e339555457d30599832024e9934088998e6b044296fcfc4554c0cb1e708aa90284c1d65421327048d476218f5ec6e35bcbcdd130fcedc7dbef20e13d6004fd06127d9b431fd056eecd004cfd7e19a2d75a3f8597b2db34f5475a5d29fe2b5ffbe482562c25843cbd8269a64fe2ac1d1a5ade04786a5cb22fc4db34eda2edefb16f12834dcbe3093859be3ed03810ce263c77bf2d096ed2a0be22f32bc011e6d3b4aa6e2a28cc5b5a2e95fe351025b64977fc4ba7d82883ccc1f84a81e101acb7dc90f557dc45d944b8b5b0c01721bbd19087e242e34658d5e8061a896e0c9065ad2d5f98b17a53c1c61ea69761db62a28e2c895dc1af1a7d01c1ddf5e0006e0ac2853bfa80d6d9ec12cdbe3c638c8adfa92f4634e7cc24f9b28b0d7b71ff47ff2f478dbaaf05e6ef3cf3be375682908c73765231de573c615b668ff3452be06aeb2771bcf5fff3dbf489d7ebca2afffe8d286c85bf317503eff0056e80fa0cb56f91223ca1e1bce2d983c3f474327d5ac8aea4fed9e14247d775dfe2120aa893e5dcda2e7866e1a11b6a29b2dfd79345f96dbd898da9ff19eb5caf35c2791abaf9b89d19ce4c6dd336e03bf99be12ca7a78ef1aec3a11550a61400b1887168a1251e3dabf3256e9b35e948b6f12ad7c8073c83454452cfb1dff421987e359b4f875812ef1e5ecbf2b8d9b91bef34b55e2a22693d11bf89aec7c2fdbbc8f70daa22ef3f42a3f6ac3acd86734c00e40e4c6536ec0e74bfe806bf2d54ea4ab4599e38741e0cae01254830cb3175ac755bcc0b107e1177809b7a6bc95805fc2cea5bd6b833cbc765ab16d704bbb39871fef06f37a3e2e05d773fc2ad3d4e57310b8e524be6aaae51b03c09095a8f98cbb79b579716dffbe929676e1d94e23ba9b9547d1e19c0fa576bd0422199e7b5a26cb04e08671a07e5e94f4023ae8c4720429f617429b916402248ef9197de2d21bed871a6b2d82b473ffa11d9353c36af369481d968d21afcebf2edfd2004c4f4acc80a45b3f32a8c9857b1f0b9aef2b576d6a251c373e719d4d8e71f34a3126f0999c57338f8a3173ec7afb19847d9118313a658710f72d160cd60f8b3eceaf8d871fcea04e1a15c98156c6930d5f62885dd61e719009beb5b1b339470a841ce66e9855406d5f513d8d6ae02d4861bfbaa5f96e04954fb5c435e00513ad183f2b8eb9f372c5fb842c8ba99b38b30cf0b8f6fc8e815138fc26693fd6e58c6c8c1a86bf47de49143f1f657fc96e3b55bbe81656f874b90d103a2ef06e54f00316514ccd21d92223706485d8adb12ddcbd13c482900c3775603ff22c05d92844dd3498c48ed2fc4008fe26e33c9f51c611f6eaab4a3dbc5e18b8c1d088793bf4e93b1dd51f44292e060a49b2345a01b90986864a073a98e0d605458901947c61c65130905bef5e35ec8c78646644fe5af490f05d26f92d81e80f32eff6123cc08e27700bdabdcd5d4127fc4e35e11194ae763353e4da7fdd16d84d059f9a73f269c56e4416371a5a60f7d512d3f23bb40b548c0f750bfb5e4334d1eddeccb5ed6856e7283e1ff61edf7e0754f5dae62884f54db2f5e846fd35ec3c9316c79b4e71f5672fd6340829929d6c49d66d41f81c0b46b064716a7ff83cddf34889de3fc45ff66e7702582e58773f51889456b362b36a2d99456cba7955bacbff0f5097cfe38703acc4f15ba76d37983bcd7df5c4aab373f2f05beaaa1f5618289bf74b55f0e5b11acb19a2a094db801e103b49b0ef8cfa4cc30b1e93a61b7ffe5a71cb1eaf790ddbd97ae04cf1835d687133f6ec2f7c3cf465eae1c9d437e0c4db523332616c82a491827d29b05504ab5f85662ee0dfb8eea05adde9a005edec689e3fb8398820eba2a41ca64f3bde5fbbf162075035e80a8813c34cdee0b9a41c7e4af8a5f834ef1264efb3825b1997b8159b5d51cb998746f79cf8c5c929c9fda0e0010fc9f63153a6ba0536790e931be2dec86c1b49bf3a5830cfa168ceb6652da12d58b14ee87e758d13f5aecf32c78e9fd2a6323eed8e9ea7b1be9be3be08295737fc759e1ec5b8532d38be0cb70ffa816d5946afea601b6716f189e0d976be62531e7fa3ebdfc91614873e513f0b6845557902a0dedc51e83bc858a35a3c6cb8ed910f812b38a259df693219b73c8de9baa913a36078c1a0e4132fe034cc0dc3ce70f622c5b08cfd52ab148fb885ebda6a9d58fc0293d505b123f76ea6d700dfe33823e5dc45775571356085fbcb19e94f3de4730eecf9be1c92d9c5df687e3e4a5bb9077d8797e70c7e155379098ef654697976378cc8e73961a018a86afeecbfea3383efd1da39a5daad68d67ac847df7e3b28f4a599f7d86482671c5926fba47b5d7759390b9fa96b178e346e041a936e0b4f0d042421eb59a02d75048f2b40f3d117604840737795c96471a3f109a78528d2a394c8df8640c3f88dc2b5decf65e0df07d713a81373589ebe12a6026c23d362948d13296e43a037016bda69d02df0320f3f4f8bf9bf8c86b1e0395309fdeb860121bf7d1673ca31d35c3da18cb4dad3c973aafe557e39790988319c65da522c533a09bf60825b192e22cc9e7f96ceb87007323fcd5145cdbfa7971fcf47265087e31e4796bd0f3b5435e1adf361c74ca7392586b5ca10b510735251d842bcb06382237f60f93acd2e108c3752489f998dcbeed4ce4953bf5b009d8379e37a975c2e5175c9c75edd0383205d0574ce3ebc03141fe51c91c75478a02dbe42834c7907444a5aad9f459123593dc0898dd961bf84d770dd404677dccb18a05bf8df98c5e380392015735db77200bce7746e676e7e2741b998d7483b6ecd3adbf1e3d6cd3853e50976819f27ac794642299383506bcf24bb3baf4e0548e9e99a70dc233032bac0341f3fc3f94c9717599095b54083b2c572e8399e125654ea9596a2f174beac7cdd6fe9e5bee749946e53a81cfac36570a359ff0b8fee8550ca38bb34decc5b1daf40e16c388c3c5eef92c1f57f31fd16105e978c6fc4e60eaa15b00aff5487618611d0d0905957d183352e1345d647eb3d90c06a2080b9af910553bbe0860a3bf44185c40b0b3d45cb1f32b4c599a93a28b9a32b65f0c51857cca5d45388e7f31597cb16664f060c1609168487415188b2a0f01590d0b2739da4bcd403700e59d1c5ab79198562490f44bc829b9efbd1db5c1c3da2ad72fbd21b103705048e6094ab1c312f8a022c7f549d3670138a63ab0369041e0b779e34a01ae0711f44c165d757704cc36e29b9874f918f3043d9dc426c907a6e0f8bcb6a8970f0683ba3caf8e5b014d2b350aafd21fece09b2916154c475306b0268b01effd391010b2872cb11e9a1e28364daa63bbbf49bed9c436a05b000a38e77d2258e5f6a87976229b4fe533c274f57fd285883c7b6cbc78a7a0be0a8293d228d87b7549dd9dddbc86867e098c2aa7d5c955c116588b4466737fd630b0bad1a01684cbc0ab8b5a944f792ebafe16264f5e8f4f4d532b79c5c7a3c03dd7f06900c1b05132511787ff470ead0fdedca5f43d63ce27973a14e70fd1f9ec3288f3082106a29481dfa48cf08890cfd6d0c9605b28e38893473c28d5504c66f9a33bbbe7c7157be0b224560e2b707402b9d8d972871454d100fa43d71ce654757c2ecc7f36b51ad23e525e4a8f390e4b417c04ec3f26dc5091ec4a9fc2365ab8ddaa702812f74945f2571ce331dceb73f5a904096e1c70a885ebd093faf34495eee6fcf49014231b31af40cd7f791f2ad2115e3f194c0d3d7cafc4d8b7559152cb3151036f507b2514ef9dcf5ab1fdfcd79eb712cf3c38edc7f3aeb96588959eb67d4f981f33a1b0121f37f3fbd205f1566b89ba52befc317f327a2ffd5eb82a7b32eb96d9b1df7bb415640e6f99fc6137b396f2a63265ab3f106cb4ab0bacf1ee0e9635612e208088c559f77688df261551525fbffad1098f6f4fd181711a9df645f43d7e5065ee10989ec5ff1b7e5232cf8ebd523e233fcc3c99a9cfe7d8c16521bd4a16a67fbf845af30b8ec3616960362e9818d0561ff66fbcd35edf840a8ce5932b63ddb1b4efa0ff6fa6a96f538b375899bf363a3148cc9e3f9b7d6761d52f4c80d364cf35cd3ce638be46ad8d46c85bbf4ad19767707903fbb456bf4fa0f05b9e56be1e44210ff2118cf379bbdf8775d8d708d75f48185a728abd12cf2627b9e4251793cbdf1f299c7ce3817b8fcf847b80d539a16d1a2863bc6778b937f687699b70267fdeb9eb92dfbefcd97460f68c0047c93410dc2250fb1ff5b8ef175d2ad6bcb7755105108b5f99719377f7bd1683980793edb0be1e2e74673084381d2a9a37eaade860e1eeeebd8332af52e43087955c1a1538c7860a517947915f0ca60ed8fe2c24e969743241eeaeb569efed296dd296c026017dd76625334b434add133bcc08aecfd0bfbd4ac851a722735e8158c1f5c6ba05170f7d716cc3dafcb4bbd642bfb7baba3c3ef40068f00d26f3073f984aae918b3bb3a463b707a32e711d51a0827fe4a1ff787b437c66da01f0bebdff87ef6b207e15820fa36c8198824f4f8e5573b0c0342cce371318dc4364c05568b17bd8fc0c14de7f2bae85e9e839d0f97695adaa54ca2bc08150e8f2458fec08b5f64d9fdccd5a165df6b5f3f9a1ff63aa15b5b19b39fb86146524b3c0ce8776f8c38f20d384ada943af0b34cfe3ff3d10864a2a8fd683afa3a8eade8bf5b0551550b6877bc24ee1a58088c49aaabf1004c5ff41c0dfdd97eacdc1722f36cbd9a4892c6e76a5922435d8a5a7795219914dad7e1ca1c502019e1260c9015f18a1ead2ea30744785a624c6f65b08cc442f45d9fbf6a7747ebb72c4477e3b3740f9277559ae8d98a97bfc5d0e720fdff671526f6c5344cc2bf1603a3708bb85d7ef818eefc3e885ff21bfd1321c8228df096abccec203c69a2b7495857ff71a4aa82489b133f3741fe5930e6b250345ca93914a41578b19bcd0c49ed26b37dd8578163f1a88f68f327479496e3e36de8b6db52d3faf0722bc3b8badeb6e179a8ee9e7d74dc7df08df239b9f36d251fd7d8305e81cee6c0f2239dd1ab0208d11c6915ad1aabd20219ee1007063a64e5985ade73ca64c459e6148035eeab91473f6e7c57bad7f89c88655e5c16962071fe097c046e3db667bc9206516fcb524d63b53cd9e61cf3bf810ae20bd7390646ba8f61c0c107af0b92918052d7abf6f743a76343cc4db538e4a241b28722ea277a6348f202bbc228f60a16ba03cd1d96218f685de78c0e67dc89fcb2f4fde0b68f599f1398248f7ebf448611fbb7150b1bee6f88332e0321e2c9d53783ebba8e2e169d0607058d19f004cdba27a84b1b3c08fc87b9778fca281f71cd0336642bccdd7d8fc97da6146ecf9ac87af18bb9b74fb2d180c2fe5bf3e3ec2ff5b2db481f4732ca4023a9133bcf49a7807002365a701bb2e5427d9724939cfc088299e3ff5d84f9af0afc13ebd9d38bdfe56ece0f361bd39d09be05161af49769b8d7e83c3cf3cc40ea6ba8346304005602576c65233a3bd164bf8b270aa9f1e36cc39ba0cce762d3df1e678b5619bd81bd90cd2e275a315fb72a2030087e9a2da8f8c3c250f29ce0ae2e64be9ccce96dfaa9b7fee3d70b04d513cd6fbb46633990e70480cb20b6f3cfdb0490c28ef82c8bb16def28f8393a5b437633d1d34d2f1fcfca3dcd01f229299bfb792c3d001d6ed32ff8330a29e851ee62ca55024dccdb3044a02001eb4b486bea007455a0e006c04855b328e6d5eff6676ce475da04f3ba9fe776cfc6fb76c54d9d819e6b5de2ab23cc9702f3b08616f3e8aa50bdb09aecfdd95da32800a8e81c5883336dc415f21b30294747842719f1d38cb29780677e428f48a00d04185dd18d596dd60050f8e94ab8da62c089c9c544a98e7dcfc0768572c46254cd5b849836274302ee9dcd5e7d60b593307725beffb1830c6e41b27600bdacb26d74332b36bbdd6f70455bd570fee2480fdb0587fc7ad92eb328dd03bae3e45d9d016dfe0c0a21d143ed4654ef0214e175eaf17f08af65338c3b6f4b2f5ca16ab8fee8a3fe3f3e16e3d30c44babb56b93c38a1f532ef50b0ab912a6209e4cacfd41c6289d8e3db58b987277ef3365234f44a900b1f162e5ee988f6f4e641b28216096d414181cf2052b9a1d68ee4960ee962e31c73974132457104b0998a915988d7ca11a95de424de381330b539ab94ec6ee7d83b3576cc9b629288abb5da55df4f13a0fbef13a8f000fff2eb1940d57f118339b0beec98204e3d54ca5f3781a2c98dcda21b2356f945f3b84aed9a824b3f9a92b5856301452184f132816c04eb8cc907900ab9cb79f4e7431454185e6413170fba787898e53479aa9ac6360c1aa8716414dbf25203a35304173bcd9f7b0931e0d767443a60924045c8ebd738bc54e4340b851c32883f9a8a4bebe9a28878d396ab92933fc13abe2ead216fd6dbd524573374cab02ffcc66a2fbe3913dd4d42ccc970180803b7ade1c22786af2c108881ab058f5a201fbe2d08e402aa76ed8aad3a58dd87234ccfcc0672d4c9b0490f21fa5775d2118761882ee2b6f6f7c773399ec7157b206f6e92887616f930f986834586c15d37244fe05dd7bf2c0d9dab7f122d2d2b7563f81197577c1ba0d83a9c145f00670d4c78d4d81c0827722a8cd61b2ee39fa614d40d853ffc437c597c7e32f5855974d1e28ad94bbdff1d6c3ea68e9603ccab08f6f1ddf8d75e9a6f98ccfeb213dcce3a9d3dbb4cb077edaed2f733d88620f0e24d35dadbd4881dbfd37c38a787582977192ff73fdf720bd724f2637e068ae736ebd884e5da6b1c5a6be495b9c06fe18f4c6c55a010fdc146a8a3cfa46c0a45137ce8118154100e9a82b9a506f15948ff349dc480d7f18afb56f2fe9f66bacf69230bfb88a7c971042b5a9e6e8a3ea549e748966074bfb2205ed159385c987fe428a38f10bb655f60aa8ade6475ebaf5afd232535cbe0ab18932a8da9fd990eec04145c888602a30d77b642bba67b93f314d6b47dccf3c460e21fc300de745240327588ba2fba1a57a010f88599f7822d2ac4c4e324c57d74c078532bf96533c8124c1110cd1f9be0a8da8658406950395e39fd330b1369b3e733c96a416981622b554f77274fcae9b7cd3bd4e2026d67b25253d5184f2200b1b53c86470ff2aacc6cd934504ff5ce7d56b6fdd7f8ade0bfeedb239e4c511c404ddda11e6acb4dee3f2802b5f080572d1682a6f15357b2d691bcf1aeba762956f762b8d2593c312c25aeb4fc01d51e4efadbbbdd623ef58c99ffe18100898c18a7298fe27207e1533a11d5601ce8d68767e0c85d05eda97413311405dfa7f45624384ca9e2e69b07aa99c4c31f2985d03ec3bdea37686dfcf3c08ee7af3860526b24cdb06bdb02e7d25e4ebfa51b264ec43ef2bae0716956536881bffb730c61e58f3867799336debc15d7d1d5ccb657c183e796720abbf45b9744ec03cc07cd4e89141daab52cd4fc48e7a9865ceb17c5adcbd7713c4bbb027b5fe33ab7ebb90577cbaf46da3f855cc134b5c567799939d8a67c526cbffb8de7a18d8a1d84abf81a62bc3320dcc7c18d33ece83d5fd85b8af92310e412126735f7985ee420c3b18a413618869caa4578745abd8d370c1ba8079eadce564d443bc33bcfa67e297254f79755bd38e5c0e28324fb3ac2a01410cc96e37dd1accf447211883fa89def0e8bef5d92482d3d2b6c3d00081541a4f366da0ce3478d9126d0b1ec418e13c28f633c5f8879be53f63c4650988ff798e448e63cf5fd99937281394a121f8cd8c444a75222ed1b457942353a9e8e22d8fdcef23e8b78d94f319711b83b109142e6646b62c334d84a4da5bcb955b4b29ee5989b0e1d119e9b5d5ec88c7564f73ec0653dade4e84702798e2e1324b6ad2d2a9a2ee21c0eb6f885064f2422efe0f7673e7beff3e9ce00331e536a600b8a50a2820d46a85eba9b8a8cbb81f3fde61181db91636b41036dd075c9e82b9650b942c16e76812d9f38605901bfb1600337beb7ed6fed1798095f6bd992e5d936954971b8405fe1a63c4a61f9304599a46105c76a828f833740681efe7ce02471086d8f600fbe7799599834f892f5fc198a01f75f2ecb13325cae73d76580ba27f685be05d58d8e6b1238588d843282d12444d1af4038c6eeb21e7f44a748f33ca45e88f34326f1ecc513aad91fda6c5d5787ad247fe781082d3e8a61e7d4f5714ed81de6f8d4907b9f6ad272606d8f2f316e8d6a00359842a40951ceb432c1603ba01d5887010cd015e204fc7b003d3d055ad2938303770e25d41455d5112a7287b1a1be32f7923e0ef105532fee33c90224bedc6ee05820f9c1d203dc59feef5266706d7065699f63f0471fd72170e385923f43869a2ce382596c1c601d296fbf1436e751ab9a047cec41aebda5106d65486c2f6909ebb5ac18f9d76a51c80a2649f2be21754ccd8e52847b518e485b666acf77b18ea34f356618162e9a9628738b7539b2214f0b4a04ba6f75b6a93d44ef269f3374f8f70de4062adeced341202e18b0c47d46eb6179d8b052b0665804b0333412d87a577ce61e38312e7deca2693182dbe1ca0d30d5234dbf9cf96cb3dd2841977d4529b61742d95cd9c53983ef6c74956bfe9c4c4f243dad71396346307c754d2b2c2b6c2e29767eb07aaa1aaf81691fd26905de27103e90621e2eb0b8fedf849e35cad7784fa0ecd518de7209c341d8abe67b5dfbf93c562754db39b93bd3a2a3e28f667155ff6d8fd64c4aa1490f1863043eee9b6760840eaa5c3bafa5c2e49ab7267edcf609e114102e2a51d608ac7784b8f214833797f95b5d234d9491fc38c36cabc8c239da6edaf1e0359dbeb73a2e4e7bae0c4258564cbcc545354464daef3dcc44d13ae648ad360a5a83dff89372214c29eafde923bcbcf39a02f768a45b9c91eedeae4429f8d0d287545498e20a06bc9ab11f8b9a484856cad049d4d943caea4ae249187db0f9d89846c88022a3a65ed47dc70f84433846412a269e57fa8f855879d99fd8ec916f31e3db3d75921174aa341a558201f8d448b4c9711e653f371ea8165e20e245b4e9109c3c0acc704de6ac8efdda2ce14a2cb0fb9c290b1c97a1062362cd6be001e80c9b7834931d5ab99a0a18be892fe72f5999f064798467c6a3396c61285666950776e680023a5a54714bae3473ceb2a583d1a599941d7fb168026d475a2fbc1e5e1f0ee4c90f86caf522eb4e4f0acc82e8c0433e368a4c09699d782ca5c1be97d4209f6df0ca32e2b8cd6cc3301096eb3309ced64421ac9312fb34876e3c60e61181ca95d14ddc952269c7960aa13ff2b33f3f2ce6843e264633fad6b406a89ff3836b871af0e4989850bd65446493affe0a661f010277c378a2087ff889edacd052db886332ea22a38df2aac72117d755cab6cce1a911e64af4dc6e8c848133bbc4f5f015ada078fad7f7d9b2f907e0b56bc594716f4f7bf1b59a4b287b48d4d328d5e675d238d1952261999d7aeb0498ee7b370b6bceca5a39198113b2d6af63a10440eb0caeb2b3c62a821b27601f5845da21e7f9746000c17db6d54e5e89173885ee6be695aaa2d3db0bc5f042468104afe3258368726a24d2046934f42a291fda2f1f0cc10dbeca4f526bd7d835976229f27791bee000378c751becc86c72c2920d45eab89eae32a275cf2c4f5946cfa760be440bc22583c5e296fb5f337b983cf2fa5f33f9531641dfc56173a3a528c1e8c09b5201d92f20707c9b266dd0731facd3754695f5f11c72af7712ed39e41a9e3f4f1d7ccb621972b73c3e1d855fd0cb97770ef9c575187e7a006f8c5a8922fe0567eba692b644d53b92802b7038943894745e897aec2dea5c70e95cb5d575581c4994d087ad9ea1ed4768aaacfe78ced1150ac291ba842c88fba1bd787e6134418a5365a9ef601174700bd63b483c8f402164a4880bb878cb2b6d3502d6d65972301f9e62cdb8d630337edcb5c7c5cdf57b6176f9a0726818afcbaa7731ac724c0cbe513c23a5db451a7173b56f0861b214f85eb8ade25604133de29e75b353948254932d9076c79d8b036a7800258a32069b9324f6d7c27334d581901e404900b82c561d96fddadc40b0d040d88462972abac9611a69340a9edefe89cb1c3183ce030013a2e479bb86936ef83a9e68d68fbbecda97dcd9370180592384e81263c8433e36a6d29599213723eeb500d6eb09901a01a4eb92c265d5ccc2f01a304b2ce3de3f7e5f18481eb56a23ebe2d62a063e328b0f0f40df0bd29ef115eaa12153143e26fc4b467d31964b93e749e62a43a5dc3168298728b100b1b80ec6f8b218db07b6a6ed390bd8995f21525cee38962ac591ff9c36b94460e9a3cc488380238310435b5faf928e96d13349cf93d89d2520897ce80fcd194ae528ab782902297ae0f1b2ad16a220d7c6dc21a4d14a1c76e363c973e57ad9a0e60d548bd0206fb8c7b9039d13db8243ebdb00ee74439f7255bd1f4ec21d9cd0e0b6de57b464f1a7196425c1f18c5f541548494c41672b53671b950c252973d8e91b9e3cee09d9d7772270015423c13af1f5d5e26f3f405c842756b8cbc3d85dce19538290af85c553774188dbaf8131978094bef518610e9f7624fa8a84fd8a0278db74ccda9f7dafff5f9d9f237ea02dc5a29ab4b919f9528c393c3de9c164e7cb35ae32272beea0bef233962b32db0e0f16877e8ac823919351a400a1c24450013d0fb925b988fae829ae0e4970c10e9169ea475dfb2e5e6a64ddaa28f54e883ea317c13f57c468e05ecd4f4dff10815c7d3056a04b4b4fc73e0a0c9d1475cab1aca76f54a0e646f8b0735d7b4b6eb5ea0c0528940d31f22abea33e5062c858b8862aecd5bba846aaf1782c06f7738b365e70313ada02b18d54f1360c2263aec1406ab81ab5967e84297d973bc7e5c553bb0180c5ad7636405e370a1a47401cfa71ca718ce08cc01b7e37d55782ebb35bea97efdfcdf1aabdd8b5cc314668723014d488922e9b2c85acb294021740271d2d973b7e98022b973ebe6861c44512a6f7b9fe3ae4896267d0099d730c6074e37ad1c160b3ec77961ab073294e63a919cdc2f78bdba38f8aa6237e277a78007960b3e8996322c753481b8c822afd57a9d2c7663106a31161b80ebe55ce952927cd97c1f715e7da7089f78222323325d19772a3d96953f7eeea1d3a0b40e0fc13161cbb79c16a30951624a95ce5f1a52c2693a207f0bdf9ab9281db04a51b9d5c56b2fa0a29affd0d93d4899a33864d32465ea075d319df2ba953be59c4688fdda411f93da0f6d70ca2233827f906523a7bb9fc35e259d304b1935f45bbfdae89b04468fd7da7992ce611cd16a0a129cb1ecf2e30b6756600f00bb11ad9a333336c19b041282ce866dcdf33f97f01ce908ac3cae53ffab33411a6a87bc29ef3de3748c6c5e52492b9cef6e00997fb87bb3ae9b8e28aaf90b58eddfbcd2800e7084d529e64facf896379b75d5445002d0474673ca73af35f7b2337a999e0127711094fb97bf163cad4816e7297c8dce9f6f5058c45fd547366dd92def29cca68968f7986467d4b16d6f83862d4e4e7f5783aaa3db2aebb1e72d614caf8b4c4d315567f6979ba7e23ad9c0c52c04a4eacc14c78268962ae30eb1074702bfbe997d978f4e90e04e81a9346f17cd755bac0dfe3421bdcf3c76f496a6458f463310b9bd428251c83002b1a0e0a15132d5ce1045fdaa9f29e6a1acd705fad96f29b59a7c8793715d953533a24f38298e1fcb71dcff2c1cbd1efc1a68f7c40ebb1f1e59553d1bb37c89de78c9134a3c07decb4f195770e55b1bd580a124bb05791a403a47aab7affb2674791daa3b3118ba5dd460036470ac5b56d03b5e8d475b814e1328089fb0768c0dc5887d0e25afc63ca3be308d19aa07cd7029901dcc43b6cc0f951a2482032cf8c8df443fb896601360f6dcaa5bfb67576ce896199ba15b2dba4cb04d5aa7240a9ffb64b8380034436109cc791d688f0444d7b0c4b0388108f0e9cc88af3d6887ecfb3ad50702c895ab30c3c4a00d0d6b63b4710dc2ca2d9be693c1407c94adb52c9111661118200bc1f84df3dc80dc7f7fb356219543d3c4928665710d1c7799c9f527d19501addf47c29a60e876b845b70f9170ea13b4ade5283f6dbf02354397b17052eca2e57bd6c329be4ccebc7c5fcf13c1f61a7bdc2a88e20528565754e84ab1e0cd7ee0f5398b6844909f630271b887f9e30ec36f8a5eb4d00d7d2c39190e958b226c20d948e5504496943104b9fb99ef8a45d644ad15847c6a601977f66915b7142bd5310eb79321451fa669c6d017978b615ae7bcee1aafcb18fe6705f61575b8ca872a7bbe253bac4521454f29e2526c0d2c0ec74a23639ad83e0e4221065a5bb25f3d2ca3c9af50f825930cabdf2de45caa81cb12481b829ebfec8c6411a51467de95288f414abab9cf5522f181d3a81e7985029c337d29996d664e988b51d3c8a123ba42cac5dd4543cee78a73c289e2144f5382b7cf875079d3a98328c94e33394b37a46479702b4eb128732bc9956e6b8b243c5652632aa3f38a703308cd23f6103a0f96c9391c0f3ba3e5e9f5f47685455b4c15234e5a0e3cb260da68c47a1894330b7ec3d81273a40ea83aace035e68a9ee6f1cc4eac5c39084aaa8c8999a6a9e1fa57152d02eeaf8e10662233f71e8b90c782036d6ff777712a7b883583848093f716565686e6fe766a35e797f6070f0337f70d5be6e7d1d8c4171093310b636fd76130a6903c797eb0a005c9af212bacd1815daf0f9c777a0d388dcee719a289ecb1e2f5115b2954d01e2234f4c7928323f1d55e80d51b4297dd218f8293aab14c07515ad861f63d92ee8c970401030ffe6cbce41f34bb02cc72b9f1b4fb180147e2e62df55e8534f602f9621d239800ed35bf4ea1c92dfaf72d7d95adf0e64b91556e4e90df226a6e1e0093cd353ffe919910eb4e2a8a5c4029fbb29eaa1adaaeeff729f42ae45c922ad6d7c27e37904902ec0439853692811c6957ea5a61654438615aa6ae5070e114cacf170f0d5511bc3a52a214b6ee97505bad45db8d416e1efe0a1fd388aace07174163e1d67b78180555983b53aaa8b21cd8146647c58582e86327edaabeb101e8a2ce2a6793a35c0f062bf64a851b341905285cb2259c8efc19647a47c3c8f0f920af27f98a295ef08e10a233585c9f57d99c9e67d5fbb96f47310b8c429ddc4e94aa8e61b5f3a859e19f8cf92066b8e1724275d83a86573b39f707ec2ef5346c2f4c53873439abb14a5b524cf4f6c8cc6e6ad17435128a83c489b19dd4a062349addf582374e995e5b5692d783a4ed86953ec171bada22ca10c79e96c6ee5782e841274bf55138d3c725877b8f1379f235d0b13f2924f73741b96598b97b7d3e054d4d112197c08ccfc540ec5788c6f894cccf61dabb0cd92e220eb3f5ee3df26a8d42dccf6fe88b645a91e586cc0154a2c474d8aaf2596deae949efb8d5251ed424ead957107c6f440af1dfa49d6f72ca5b9494e49fff2bdb6f4b449f1c7e7b14a4165dcbc077f521214da4cfeca7ac8383c625bfd6d539f4fb3f6ab31acc7cc96a16a73f679460f99d827a806efb17d930a48fe54e9b18f3cfb94e64c4104bb42be94d7f5984d168a57789ca65c5dbc27acb948d11228231a71592a63c8107830413c4d67fbc05a729fa10749a106fed54b7435c0cfc626ce9f9263fd926e70402037ba325d5ce74940790f5472de23e6a50a30f299976fef0f58f0266f9b953f2ddb9ab75d2290ca18352da45b23767984f00c193d3ab4ec402ab87f2532b8955614cfdc9b01443e54ca2248a512e4e1a79e56983de5c209d6c377850641f1255913ca9b1e6fa146b66017b2fa514984e86cb098ee105b6b354282f3c2656c9fed7a0f0d5699d9a2f4b89e9091ecc9960cb49ed642d30f4d9b522950de4c09959b0a50e2c40404424c4d3e009c693edf3552b06b625b238ab862d600786bcdae727270902a97b5521b650665077fa14f3a4d9901fd4243bd7ca890ae82fc59061b8bde6a2e13a9806ea690b7cd0d5681e568f7203655f6824c0f2822a1c787acce99a6d40c42521c375853bafb7a384a59513a8f94398ae74e896607ed2b0748a9aab7cb14a25cd351b06fe1a55f1ea1187f5b299320b1e5b62350a7d3a81c3a47864bf997818ff41048ebc6687e830bf407df38c0715944acbfacfa1e59755e988547e1f835665c006ee417ee15e2e433ce65855e7d3e497ea73a01ec90033f559475d356f590ea00e003fe154253602cf41d59d2ea79fdb70d2bf89304af27deb740af81d61d0a9a25f3266ecac49fed5f3e36cefd6e9a9435a595e3a26261ebe863f791a2c7e82d3fbb51e39fdc70f78e7c618394befd5d3e810e399d5cfa2c0923937a8bf1e1bd274c356ff81c05d2ac6ef13ef72c12aa202384736c7c608f89c2df1b772c48ee4e84275e0cf54f81d4af1bc4685f2b4f350e59b64f12d93325c160a8af4693593f1c2efd0043c35ade79dcef95744d137a3eb556373f5831c838480ec40b80e77c486596bb834ed483e9951be30c6e081061bd927ced55479d5b74aef064eb13dc808947098e1fa9c9d3f06b6dabae209ca913b919944173214876f64e71fa17e669a17cfd6befde18c7c3a63466629256792adffcb7894059ae8960923e0903d75644ee6e5e89484c58c368dfaffd87725de2555b7615f78966594195a4c3dfbae0293b0401d7ce68b1b695c832b66f20d534c0cda89aebe589c8da148e7e067eb05d248113ac09c0944e42183e468af987407d5956972d7cc8369a3155f6eda986bcc8f00a5177b3dd79abe1d31f175e21c6a5ea4d068b697d938aa4a89f6cf93e1c023461834f755d407e3afe7941fca5693525bca8e5faab1789db73163da483b44fb3e6e3af547cbf35d9eedce34e1dda783ac6d98d2c9b2024f4a4c5a0683531939914a23de8a00b9575bc59c02cd0b32dc6da884f75d457bf7e3c56699e43326c545972c72bfeca24c6410dc924a83c07cbc0f4d2800e7df7d5354aaa0101e8019090710170aed0417b89576c595834d04967ef54822252341842f126a0dd0890ec50fa927837f2ddd9fbd57a0c69b08b846ad8f8b3db51409d15902e1a67b6ec310602e8c82cd30cf4c9ac1c4b19ccbc6049c189947a54abb99b074353255bee62586166a0bb8016a560300de158e702f2bddc2efca83444cb337e2e8b97412a7d8d014ce75981e1ef751028a3c8301a977512c82296d2c1b630d2b485fe00b175f9c3a73baaa4a15f22c3050dec52ee5c9a91a0217f6b406192044c1c549638fe3ead60ad0f4f54e13432a9053096776b8076021505990108e42ca92245577f510f4eef3d600356082310f88bedbc1c3715cdb4f7ffede90980428aaa0fc211cf19ca66f90d4150d85c07bdd87361b1776af9465e73e6b7032d3d17621b72534f204f75aed0300b9d18e99894b1808bc3f38a4c397f5485c6a1adb87074d26e9b5ea6fd7d1e9014bb8ecd15a24430483a6dde13c582536add2524488c428c7ee16b342ca9891676943c94b0a025df56eaf844849205a179bce66d2da0dfe655e238aea77d6a448e23a80ada3965de1b1111e1dd32a1711018e3271e37c5133f2dcb43cade221fdbbc164202100e7a3aff67defee61f53340d512fef460f8174aa30b451846e78a9ae1e7dcd1c7fbcd94039e5831ac6d2a2cddb65b0c8d3056d6305d786e4e3f536cc765e693ea66158bd4df5e9a9f583a8605e05e168a9e01f83e58866ac26f06a557c9b59deb88519d5ae63153b5006082e2c14e7159b65df18cfe63de51dcf16f1c8441b8310d92f2dec59c17fc053a98e61a96627e8e1ca90ccbf2419d88ecb5be58dc83f3ff3d926f40aceb605806cfe1f035a80f72115487a2e7d5f818bf3b7fb4054d4efcffc348bf876ddf9174cf933788be0bb327b2f57cb3ec2a76fec39b84ab693a03039c57fee53ec500703440a445a9333a062186c1ceb48fcff9000c9e5aaf5576f0798be29bc440eee2bb47648d3a2e208ada218e88ac5ba7caa360a73b20cbb729ba426d2f28d7e67871c689d15e81f52e4913c44dad76ce23680509c05261930ff21ce95ebf5b310a178435f7f3b2ea000d5f225a6bd64b6ab0fdbafa63186ff45a9945f1cf21e068e3f73dad12e858993851533670b9cbd15f98636be589cd65a0deeb9757e61f0a221d11eacfd78e9066d96a7f6f688f46c7d2ccca5996f39e74c453f2c8f9b8e4571d071f3803805b66868f84e7bb733c2e7819005539755029e411a07baee0ab4109ee1bc8bbf5cc896da9ebf1caf1497cf56fc2a00c8eedd91d5bd941b652211d7f02aa573001c68c45d5dcffe8334ade181f0699feac133ec8ccca1fafe5ab4f5d028ffa6bec49826a48727b98689fd463d9878c4b6c7ebc02b7ccb3112b21f3c8bfba7a73cffc50a357e018fe97b52197cc600ed3141861f1f9b5e5fc7d52723ca63830d2db2ef9daab53167839008a26f23c0ee2a7d302c14c98e1fc869089c91daeb3f49f280ce143f96d573b977cafa51553257f5d33d9849868019d66bf5b1cb1f58d59d08febad9d1284db9091f1b2b5325e1a15f7e1c56bb48d71bfa05b459a0a4be3061a260bc9b6308d073210bb5fa145fd7d1b331fd35450d41da8ee97bd1d84a4e563e8cc249b6dadf6c0260907d8816608c0820003b853df9500009ce7e33bd097c065a188c30f017cbf988384f1ca7217099fdcff1fb9a6d718b9b2af2091dff4e8206f4147697caf852e6a12187487d4e19f50982c3eeed9646cf7dfb49b1e969b37eea308c8ed016e858331115867370665060cb76d72c1ad1e9045d3000b3f2c65bbae9b3e8ff8c0d8d9a19fcf95ea2e314b6631ba1da094a0d3ba93c77de85f8fc02c64895ee1e1d467fdb9a9a5998f25c5ccbee4345b122b7222303ff5c0a0048654c2d92a09f1253098e736e43309893e6904ac654c5461da85a76035c9723283908b54d0cba76f5dfb7d140c32bab52028c4469c7dd051aa1c650ded18f40ffc974701212a3b362fc994472dddfbd1a0c00d9c43d6d58c32e7bafa535cdf5cc7b17309abb81eb8dcc4d6cdd29ba0492b751a918a63831342e5adb0a5787c10da56212c68ef0b170ead7f4394ad6d7f3fc7dafc8dbb3ef4134e914ec3efe792ab1960f0968db8bbb379c1369403ff85f8964c654a25d1228c420813220bbb395c0d5d77d7396af63f97cc0e0c4a766d34c34359f1885856c691a51020d40a7993aaa568c1363ba063dfc182f7e1401ce0e979da9bb299b8d9f95331c68644fe5124b078c52c1e02447e458b2bf8ebee8dfc8dbd8c997a2e18844fd06fb59dff127ac28e6f86da599f4ce2996f8774ad9588c6a45fc059906c8a8602a70961234186b6dcb4392620a9f6609c0645b64df6f2fb8c48a899543b44ed9f4d961f4a01089814f184b1e42b2de1a4076fd294de9360be77a5b373231faf40cdd38417cc3526fe6f09ed52fe2884f81981c985341209c1b2454888c3d95c97ed38bca11d482c5b0974c411c63aa5afce43d9eca93c1891c707c79c9c1935f1ad12276b48b3bc380f76afa377c1870c98a4380cb267304bd6bc4194a79f20b5cdd4676b3d366862f37286132b4fd0d6da8eb659a35249386413fb6e34fdd2a8ac147c19bee5349ff7fd8717781533d2a62b94cc555a4f585253e0c309e7c03a0b044d94507825d899f4e73de764716d614a8353c7a7c897dedfcc1d5c71feab455c9c230b002010a420412128e01fb19fa7cb54f545a2272125679c297fecab3319646a7a675681c83a14cce91d9cad30558cc9d5f84013448e0122db258f6f662f772d4fb9e53f91a7d7db282fcae9ae2766316d6b234b3b39a2ce728bb055453734e6101191eef7591ab54664d98c4d4a32fe4651f89391ff3fb48ee4860e5a6e803565b9514987f195424ad2c6fa8155a8b96f0b13cc204f49745081a25ea910d5255c6d6403dee7d4bc230eb54a6d8b7abab65c8708ab6e8479c4a7880b38c55af1a1a3b4cd98abffe8d9817e8aa58f0a7d72fadb52f7e2ef32099d78ee74daa4734c11c44ca865e91d678982d61838b57d33118bc877a1f200c5a7c4f65dfc95d9284004b03915ecd07ea7eb39282f354432eba8c2dc1b950fda42d5bc398988f98b9592997807e69b9719f6f31ee426ad1fb6246ae9b0c7ad065e5ca2ef9d38c470fe906d7af62c319a8df6824c6b62accc28a3231a6713cf0f4e9186145a5d3a7bf76b53ba132866dd79225229f46f10d7dd06a609138897d466b2cf938034abf2ccec01235438a87e953028460e91295e960809eb8d245b65ebabb4c7ca5ecaae42b371459606f4e9687ec11d9bf0aaaa736af4ddb77e026ead97500a684a018c16dd3d31e3cd4df0dc7f21c52e0873b6505e8960d1d2a096a96c44341e3e1781dfef35862f6aaaa4122643bd255ec63c648d78adb87f11e56c7223feb019b38203e79c3721c9cfc26d16aae3889542b34571fc34907a470ee7a561bf42a1937a19246669a026c28e0c186e0a54c5c6988aff6d00252d08baa1f0ff06f03149d3aa0c5a17412b825a0dcbc43202674ed4ef8e87d7a05a8d20339845d205a20389c5f46da31134a1a0f375916e9215655f6e2ec66dde2efe663b455bb3d6c5a4da896094d764c213a3bd1b7a49d770a9dd687e9edde89f1ab95e07dd0be03cb862061a1fcb9b8a9b7efcfe90ccec291c0d65d34302e9243ac9ba03dde2dfb5221bd9a0e103416047ec14d90feeb6f4fb65703a15b1831e193e747932b25e91945091e8f26a421e90325b5831ceadff1d21256ae48f67571b73606a7ea07472f9c9267173c1dc9bb428d162c437d3ea12fac1fd621d9844f7c56eac85182b6ef11f9deb94bfe708d2e591a5eef8a794cc3a71b0365d96bb5a5899db4c957e918abc9790d39ad7707bc0f96f3983dd3f4ceb196235f5cf82771f5bffc2878905e6633f0703ccd57715807e976e1d0ecb660b68a6e8e261d92057570b400fc76681974b4d5d89cb97c9c8f7042c4fe7095fe436357e11339cc469dcdc25d2707c87a79a17a6fe71fb4d1817f0f85edd1f2e203e84a7cd6c9a1bfef23b1af760775486446a2679ddcb73b86c293dddd8352468921018f7e3a33a4bae62f64cc3f4508445c2494f1f5110d0e7609b69f8105faf6f8df2fb92193f5a2fbc4b0eafff4b4f90ffb5f58db3959e33e267a032a4d9576d56003107e902e57cea7421636ac0fc305135ea74f3a340483b74adc6065eb23abcf7cbd129ff5ddcc030bf74b16a9491dc7757f9ca5b40dace3db5111f3bfee00f748044c3faee000b069b19c2854c8d8de9118dfe4f9bb2afc3dfd396b027580ee36dc3e83aa455f98974c0d203e3da04e7d725a729fa4da118da2f6298ff6a47a98af72e1fd5bb81dfc9df2fef27d8d35838aa5f2c83b6f2761afd269a92bff7ad3012699b7ede5585a65882d94812ed29f9c3a4e5c8696e386c4b1a8d75ae9bcad2d512dd3bb61fe35c959fa18b47a56f682d9ec114c3e37affe94d97ad2bd559dd8660dd37d301748d8d34841582410b6b26c1054f5ae8995c3b6fc570cbc2a3768090410ad790d9322e68a190db1c034838f55a7c91c1addb71a1185750ab57d2ca70a9122f1d58bed37313d499a3aa2f1785a5806cf11206a8ce91d7998fa9823d2ca773d603d2ebac83911c1fabeb736b01a793b88df8c45a053812d3b127b6528c4048d26c52bbe5d3eea6a3d5b52cd6aea55f1e3f0afeb4a62a7383c3d8630a00e773d3939a105e84c36677b757bba2244d0d88f04f410fa3f42395a027d4bdc1ef1c62cc44837245b443b1fcff599019a9fac0f18bcc7e3916e9b7b7b30cb65f9443babc5747bdcd77c2afa9f5a881a0f56794dfc95f0285ec8e7c1d9e74b77c3e46d24e10434a7e1767dc53e27b0cac542a1523ad656f280b327c9db4a9d7539af6fa71f4d480062f487c322a6298febdf7524b9bfdd9a5e1a55a44ba2b7350be4b9bf8e54b0f84d0b54c98aaae087b0a512a19ddef9fc591e158e4e4a11de1cc5af092744af4ff915aa5c5af9a9aa52374aac89032f32a7535a770e9de3047949cc9cd8c47b33a8e48c84c68340a1536d7b50423999e6a2fbe60e7b03b8d127dae89147b2dd0a48fbbe707dea9d12b52c22fdf2abf19a919da20cd2a4db4198228afcced980be3f3ff8d1cbf733d253b9e6ab450aa859ba73aaeb260c20292b40cb258189aac09dddbfb2dd834b33d40a59bea41cf9f3c225e398757748817e4b5fd9738b58537e08d6062944efbc726554ea1360f3228b1aff56b749ffe5090c080c529f03da0d2ac2d132db0b9ec88d8143c3f2055a07ccafc1bf4b76d13afeaeb61f91bf94b5b1f674364e914cfdf26823a479f3a410d84747650c84722fa4c340724d1869eafbfb6ab2d61db0bbf1a644a0023f7937124f2f077e42dcd7d8b7c7169bb1951fc63f36e174cfec89b89fcadc6e1e7a5176c0de38633bda0e8fbe34f667df518520bc2fb2b372b281f52cf53421fbd3ab4baa3cc6602fea3423cc8d77e9c625c7b97ff5b978fb67369ab1739cfd9e0d370ae41038f6e80278c77645f7d1c000b060b7a0ac1983db5d4f921187a270f916d9790befbb2150ebad671eb2cc9f70af69f50b8a7f11e9e08b84f631c2562490bd6309de4285f914b43a3b1574f6a7fe8fa6d3413ab51fcfa788c1a93037baaae484f05fd4b6260f6018880c634e894f26bcee031a28b415484dc834245424f5a4a3bd188ae6f58c6b941bad997f17d4d36576b7c9b9535eb879d906823615e59677c79d7e5587819b9afa89133ded77454fa4315557982b1bbef0f719f033bfb88774812d7bbe74f92f2005dece37023091d8ba727b76c512e7af4fb8d3110dc4ccc3b3c7d258fbc73bf1707d030d7cf71e1ae65dd2c26d738db7edc392a0690e15ec233dd06d799b4bab25946d78f069365a6388fd0cb0cbbc76e94f83eefd30ea0ff83ebce17f4ec1bcde300f0312ad7738c199cdd2110551181b71bc18408e4652c2e3171d470f327dd4a385a264857727fa93f7624508d2288bca8f5a66833f15137b9421c100564d9f0c02ccaff5074260dd1d98c9d0f9ddf4eb9c71243f5153b01a1abf3baf169d6306bb079cadfb97ec907248efa849f89ed7eb55ce3a06ead766e9a81d6ffec87fea3640ba8c2b96d1867d7188e5c9b50549716a3c31d581b15cc9c9e73bfa9821318a8474594072d33e4ff4c739afb89966ee5f7a4e07ee4976eefd032870e92981957fea353f991fb4359a9f3b50c9109502ff8d24b97c2d943307dbada7cdd8bb5fa5e669953e5a3a5bc25cadecf921d407a61c366c2dcfb834b15f2686c796d21254eb8292039df228fee9514793661da59b5894cb379c528835ebdeaadab1919a0f3970fee5be89bb0fd141d4c58a903ad05ca9dfb32d1c76b6dfd81cdfcf76fbbc8c513c0c93e625378e1f82fc647ca5518bdc26ac55fabc29fd0d26bdde0dd7730b6dea7495db3576974d3903014a7d0cee9f9516e24fe99e571e3a7acc97c59f50b41faea7302dd074b3b236ca7de219f377d7a718615eb9492636df78790671e9a30525964b3caefef7e72d41f08987cb00e816e183356016e22076efb8d8dd93d89e3569c990e639ea88bd591691e0f79cb2f61b39ecb03a4e508c7188d9dd36713ace720753c97c6db793b15f1833283f34e7242f8036a56db146a0d5e03323b6f6c6ee63d84b08932f0acbdb1a1453c1ffedc9bb66cbc78a1e835adb29c097d3ee47cfa2326cd1705f2f8baaf433e557cdf6a2b6771637a112aa23da5586142277f1a3468dcbbe6da19adf699787c2a368e1fa7c065ccf06b85e3d16eb0c8268dbd5e3804df5580b31193fbb2b9d9e2c4f3d0fb156481cdd8acfddbc86182358e398b90260183fc497e65d0a083979e58a80efeb373f79ca097fd0f264a31d2539ca0e3deb8c5936dae66ff66350bf90b8a4abdd19c327936b1bf2f4c7fab2cce688119e442ce637cee44213d757f0419d27faff9b129475b5817fff607237ede5fd2758539cb16ebe3ef1c49e26b5f656476c6ae8c45df2751fe5116f8643648b583e5ae4feb8366e94fdf0f07b6fe24cf2ed02ff514d9bdb3571d1c49c68cce974fbee7c5d88849dd985f0edcc6f9faffc8bd41deac4b757e8ffc11f17d652c549fdf5836c3ec1a69ff05f67f187e71e0dc010306905219419f3bd48625c4fd0a23ddd58dceb9e81673da2f4aff6cb32ae6f8ad2632054053f11662d629a8f40ed69cfb8b24a92fcbee4746243eed5230e4902dbc67a7792017aabdb67d944b8baa649885ab503f97dd88d7e80f76faf273ee57abc92325cf6d4e67abd03847028b4f2207016d1e5a076c570c5d272c33301ed51394b5ff2cef2d80e83a7efbc3cb5d1aa5d31b7562cf27ea317804fa8586528954434bb833744509f76867660dd1259f40165b88872c089028a717c566f649e034f28cf742afc52e0f818048705d026cd29527e4187fb5f01d4e02afade340062be18f4d46f3b0cc8f04aa274698164aac74014c4ca8ca4b6601dd22e9c74ce825dc2d53464f73a4d10943394f94b06c6035049e0fb8d2e9be4ed37479be108ff4e2cd02eb72170baba66f715384f1d23b92b4731c48ad76b3e717a7dd1c5b5ad328803eecf18babcb447160e8ca0d0c8d755feb07f3a1189ed9b8587d6dea8a5173bee46377e8b795649a15de8591fa79e1fc101271b3dd22439c481cf61bcab47e8450dbe9f897409f7b10b2fa180266726df67f404e3acfe5cfd8059bc0d83aebd289bf825944f8a1d285cdc7fd834d326f70d2147be5ed1da7ce1010bb154808504da27b7c3200bdb72deddaf5fed061f4cdfe2319eca6f17af5c0e40d7a25205ca324dd71a1b1dbefa5692ac73a6a978125dbad20608d502059528a7a4b079358b68c5e841d8b69cd0e74fb4b816ea378d18fa980ffbe84be16d85c34688bcb42976ed540494b40b6bfa79096365169b54899c07aa747890ad3cbc365147d4019bddeae79ed2af6ef475a06837cc1638579600f9896d36385c9ef814562c1a6f691e4596906508ce5a461ceaf901cba8c93b2ed92508b13526e5e690a5a99e467dcf575b7e11a31e99cff500df2ea3bb5a4eb439570e5a5e04c7963f1139c32e627977cc290fabdb59675d8b62aeb98ab990a930cba68168e67074720e1e9a4ca68a64258659cf5c5e9bd97c42179e668e11fa8c153f8c43d017fcbd9d82784107d389feea4e31a677b2ce802da90c060f7b9337424094902b7a380a6cb5b0888b815913715b846dcfe143fff18b31a916615d07180d8a63fdfd3c94b3f68b1a4b0354eb6eb5c3f279999e9899c0df4460c80c51307667935b77839e9d6404074a5a6fdc2d88b90a620c64e26bbc25d16ed4538309f3f97fe29aa4f4688bb4fb0f9a8fc7db4c0a74791486f61e53dc7246102eb4fd07117b0f80290ab2ae210bce6c48242e252f964834bb12216436e552a5c9400ec0580951234af6421e021c1911991ac8ec4ef5d9526f950fd8334813b0aa37c12744a3c40d4f0d5451d40f1a46eb810450a5d1dc1df0502994c56b446ec14d27d0340d4c972e373af4cff177f4bb2827b063ebfe66c0b3d413669d94b21345b3c1cb9787cc4c8262cb8369a9f808eee1506825ed0249d48d1b31f57955739326a92b4042c114cc2c1df67c67c093e80ca48fe56a3552d4a376f7cb9ee6ae17d092b651aadccdd95891cb6708cecdce18f7e09ccf04a3fbe60c1513bb6fc1faed5fb035fe8002d06be43cd358e66b6f9926bca7c087a8bdc934388c2e97719958ccd9cc2924ab7dc03484aee702fb9a8a86861f238e2f26ab8e3f6a82d64623d381106b7a1c0ed82e53b49829bbe915b7a725bee9b5d5c332d01b726e0a7ac4e91b01d5c5aaa944bdcac0dc7c908ddd274b1cdbc1be816776923e799f4723d00fccd28b9a9c927fa7a78e260bcdde496215b2ed16f4eaf0379885e5ec62a52781e7c3c924902b5a0cc2edba44ae305a678468d63c89947b3546d37d2392970baf87386dc4d7d6e4e99508d0cdeb2daa3e6e445955d6655579dbecec433aa69f3b96362a569402e948d2a014526465fe0d26798aa3ef91cf58af33a5b9ed718ca9ecf46a593cdbba724e0cad3c98eb1f4ee5b44abcc532c9c13a132ce1bbd05262bd145797eab56616fc35b707702d9eb4852f13ec8eec7294768b6d3eae87c96c3a4cb8d1ab1b3bb93730adfe6410c2e6cd970c6cb23e0e9c26a6d20f1949ed4b6011bd963d5caa2d4346e04d25610542c971e642e9ea1a9d6b148395cc4a55a0e0a314d22d1281ded2aa523da797045c547a9fd1f34cc805c574c5288ba61b297a51b3b7212926358adbb480a10cd8a1a462e4aaa35744707245035054556aa9754d5d04ce884bc0435c2184acb1035f66a9543040c5d63c1a42949c1a60e1ddd97f122388936517ca6e43c3d818291f9c5aeb70236dc420619de5ca371911f1a8b3ea52a8a92a930320ca65a37df21a16b0d01bec6402fbd0353ad43749da614a2f9dd9dd7650ecbe39090f2cd11b4da6a6ad25bcad8cb15aa5b542c8458b36d7edc66d4f7d16bd401ef8203122130915692af66e8b19f9d708a4ec6f66e3f3ad1ba171ae9395b6bec4a60b25e0255dc379d4bb81bc78e8ef12e2cf8ea349aa2ba9815af2c8d8b9693a0c85cb72d016f7a1e1b6631e5775ab720c54c90da8201719091a802bb68f3b3456924e81010f3e39b24be2615bb4a47862e4c1c33c1f5afd9af6ba6b986a277b18457164547a729f502680e4130761eb5a0353496480e1c839dd6a21ab581afd5a455953f9c4c396e684bfe14082d5141b3485ccada344aefc2b484dae3d7b5e8174e02b8d2dd10c30b2a57a8b57dd8e11d0a2787054604c1a714cca36414433874a730955dadcc0aec7707372a1b6d26b7524a297bec87cfd0b8cca71e059f7013f176efd00b1c005f80979c5079d1af02aab6f622bdde7d49af03ed58968f19f47742bee14efc6a2ca440e7fa7553fce5c5a2316012fdca284b55ebaa1216ffbe329684a8bfbe79c77f75c8b91ccd4d983d58c0275a2dd54068865c2fc59eb66c3b90f395858067c3d084b7c6bcf4580fedc1bd4efe3c1579fcc2dccb756d2cdc587e2c8fd895e46ba588c930aae7b8129808303f54f3fb2df2584c1f07e2427e3633883101ccbb579bdeba0f423f7977515a2f07f86c4138b53e89c011fcd2880a75224975138c3a7e039ed05befbee02d586e360ea111df69feb978c1b32f6a84b868914e1d9a2028009b624956ac3ff442838e5b4aa637dea375e00e7283d1d84ef2141b5a1757772486a15ec38c2d1f77362a00eb58ac1240e4bce83057eeebd23154d8f6a9d532bce7b66a4de8ab9171af8e6756e7e0a276d459cf0e79e134084e09cac64c6bbf7d54f89f543e8cc9674247df7b3f1a79862b0bd3297d11139f89d9da6165459fce4dc8961f8e098b681d0ae61d8f6a4f6ad1c5d4f44ff83bd33d5326efcd4abe6ab001d044d38e50e97ce6c0a187710fa4acab08de56c262d07cf50064053307b2600be869c099c5012161c9727419061759f8a1a6f4ad791a2f772b6b1a8e42b3591a32e1ea2fad2400326cd7c5b2cb485bcd635a9a5db6ec0392e6840a0c9ae66e1d04a4480c2bfc458b71992409dc121fe69e1a9f3af6d0af0148e346620dcdade953d30bd912c5e52463e6e06bc510ef2bf88b126e0ce581fa9e91c2104c4e0049f529eec4f36d08b876ba7099b13512c9efc5f390ee040ea57eee30f4b9b855fc3879f30a27185a39cfb6aaeda3bfa0a0713f2256ffd417de71b375ccd3739b7a7b175c4c3c06b6c23e108e20c68c75a7e6762b6b347255f31e461cdca7a9af0a8209fe9888ea6e3654cd432af4dc4441c28c50f43a20bf16113746426680c0ccc1b23aa19819e995e736de9c2a3b240fbb51732825280736c137e47160c3be5a9fd6ba5d054c16e50f25005300f1f58132df1d60606405bac72aa03851316f8b2ec4882c5d50c404f1cf1af62ca0a10c4b7f2227975da9fbef65b79120f21c1cd190c790c7f0113ab9f864ad835996950efa0a5b266b8a2434cbccab179fc1e5149af42269004503bc3aa850f5e8e9d6d9ded50e08ed27711a57c15ba55437fcbe55da8db910ea9d685ceb71668b4e3c12d4e55b87c148aba563354b4b3f12333c02509e864e99c18caaf5348a07251733166949299d853f115ef4052d5f1c9ebd3415f6c3b38af8878ecb3c2278a83132bc48a0161c27a1810df62102400c33a8246d05389a064012b6d90ba46122984f2dbdb38f9917770cf62564f271a019e3e7961799f350286ba1ec364322ff270a887641e7f78ca6fcc7c61d1791cb6b8864d3194e960f8aae0040dc42e35c6b2d671774a50f011a59c24bced70529c1f433a6faad3ccb02112f8b3d55ccdde22516424f175cbaf07599f3c80554f92c93c5eca3a4161b76b87132e8e5c762035afca214a54ac7dccd4b6eb5d2cd2693e26e3eb99471926e3e4ed245e0616937195485b8c3824bf0be30d842c2d55eb8de789b85087efedc4d2b92786d1335a5ba59b1321accdb3a67a31ef7125ab41fa0ecea5c42f6f2cfbba925e4c0a6ee20befd142f9aff1956e1d81b2c5c9c02f8d9225cbe9c47aa9f187bc074484ded9f8cce30ab552bb3626fd480febbf52f0f309fd220e85455901b858d744e86ad541b4c753d8b98a9858a6e4006b408c833468845b9aef7e6192e8e6141e837260c8c33055a158baa5110186c913ae3019497f97ac39af3473f5ff3fe05ae0d3f84e7b1a589f09ad5897b1bd76e24716ff710d93c4a8c10594244353a024dec0d2c775060010d38ae2074d9639d863b6203e4ec9d440c4d309102c70a390aa00a348e4621506f15e4ceaeef1f0d340bc9b95dabfad4e6530342630d32607c1183e5faeea1db01a132a6d47812819001ff42356e40a53c4db536b9dad70afe8584fe8568d86085f81cd4522e582dd4f630daa35bbbe2628b11c8d6cf00a30bfd8cac7dff34ca182335cd1c04881d810001f2e369b65452f7d29150194463034d64fcff108d31c6186306d6c8400bdfd38b24eb26657bc231494da92067558bda39245547aa8cc61f71d61fdf1d651906631763dbb32ea7dacc3cd5d993061266e2dba139d5f59860690dc4b667dbebbf9cfead4bdcd8b9c22cb6fddc6ac7188de5340361bc272bb3aaeee534eb2cfbd6ad8a33d63caeee721e9e27f7f1dde659b9ab99f353ab96abb36cd1dc815635d1dd095c559c4f4d85fbcd5e74dfde7d62ef6ef7f869bbedb85467d96a086b04c71d6d72b76b5eb6e9badb713bccbf9e775cc5d9c9d6eceda1fc4cb94edd6bef1a2bff561eca771ab43fed53750ffb54aeb33806c33198aa3bee3acbfe6d159842d9a9aaa2f9a76f261775b736d52455a3a26074952161741519fda73f2670c2efb736a9ba6baae0ad17b928dfe9aa304f9434ba4f1ecfa67ffc66724ec179d6461d638c3a341875d857eaaa50f3b892dbcd274c534aa96075ad61cbe3d962bdcb3a2cd4525803cf9d797998e6def54ea3362d6dd6e63e4d73ffec79669e6f976b168bdb6e64fed330c0d099ab7188cb50d63854350e49d959ccce60d6ceec153b136a13dd568cc88c2459c2a435de40ef78a382f14692f1468d1f6dfc196d08f17666cbe1aa9bcdfa1421526c6821359911e5755fa1a4cc16c2b4d1cd723929dbd38dea4955ee0905352a1bee96cbcd7c630d3d28f4f4a6b251e80f6eac91646ae186c2e447a11aff3dbda64eb3aff7f4ce66bf9d70149a60a481c28f33fe1c71354919807ea8b1568e322983086ba77d4c97c7b999d3a1c6caed7e3b058eafeb95c1bfa7575d7f3a918c3d8f6409cc111a40ea940b70f9f1a78b931c1d0019da51030920c8ee6cfdbf016213655e6ce285179bd0e1c526f0bcd84412b5170dcbbf685bffa221f1ff3dfe9940d0438297929b7f2915f1af26e2bf9a40fdab09d6bf9a98f0af263efcabc913ff6ad2c5bf6845ffa24971bd7c8809b874ec50c0f582e0c5e3f52f1e47ffe2e1e45f3caafc8bc7f92f1e5efec523857ff180f32f1e4afc8b8715ffe2e1c5bf7a18f0af1e3cfed503e95f3d9cfcab07ee5f3dcc7ff508feab87977ff538f3af1e6ffed543cfbf7a00fa579101ff2a7afdab08827f1531f957d105ff2af2f263011f0a14f5280234c28b80cebc0828ce8b80907811d0152f021a34ba7af8315ff493f5a21fad17fda8f0a21f1a5ef413c48b7e9e28ea21e7ea5d727eef92a3c1bbe48879971c19de2547cebbe4f079979c30de3527c7bbe6f878d71ca377cd51f2ae394b401cf8051af80104022140a6942f4e497a710a9517a76079714a9817a7b479714a9e17a7fc79b1cac68b55462f5631bd58957bb16a8317ab5478b1aace8b557c5ea432e3452a3f5ea4c264141118c929412f4e91f1a214212f4a51f2a214a917a5641f4407dc78e578f3af1c78fe95038a7fe5c8e25f39c6f817918d7f11d97f11dd7f11cdfe4514e55f4417fc8b68ff8b48f82fa20efe4574c2bf8860f817919a04fe5f87a823c7509102619a5e0c23e5c530bb17c3a82f86d9f26298ad17c3c0f06298362f8691f36218235e0cb3e7c53056bc18a68b17c5dc7851ccf8a218202f8a41f2a218262f8a817a518c9517c5f417c590f0a21834639500fc5865881fab20f16315287eac12e8c72a63fc6801022ed71765def5c59a777d41e75d5f14f1ae2fa078d71759fc7f022f2a4755b8fc5805cc8f55cefc780b0e8d55837ea442e3472a397ea4c2e3c7db152a96cad18f54947ea40245c5ea472a5b07510e05c604748c547f7ebccdf8f1e6e3c75bf9e38dc98f37a91f6f577ebc61f0e32d3874430116ac78170b83ded5c28880103f2290c48f0840f1ffa44b6c527ab1c9f66293eec5a6f4c5a62c2f367d79b12985179b6278b12987179b8218bab1c3b5a4e4c5a5262f2e497971e9ca8b4bfbc5a5ac17973eb821ea20127390098011c0bbc030f12e3051bc0b4c16ef02a380776dd178d716f9ae2d06deb545e45d5b4cdeb505f5ae2dab776de1776d61bd6b4bcbbbb64278d79698776db5f0aead35efda02e25d5b4abc6b8b8a776d75f1ffa4cb050800ef02c4c2bb00e9f02e4041bc0bd00088708c07e8d0eaefd2cae05d5a20bc4b2bccbbb4567897969a7769b97997969c7769d979971613efd2c2e25d5a61bc4b8b8c778530f4ae108ade15c203445db6bcd825f862972f2f7619f36297175eec72c3ffeb1013189d9a7e7492f2a313fed1a9ffe8c4c5e9cb8f4e637e7442f3a3539c1f9d8ef8d1698a1f9d04fde854060336c403b438f0a296085ed4827b51cbd58b5a742f6a01bea885cb8b5a487851cb0a2f6a41f3a2161e5ed432c48b5a9678510b9f17b5fc79518b175a14e04a60878e71898a1f97b8f89149e84726a21f9914f89149c88f4c467e646af22353d48f4c557e64d238866efc7f023dc6579e372fe6b1f3629e245ecc03e8c53c5ebc68448d178de8f1a21165d1cb75859e775d71c5bbae18e35d7e6cbccbcf027f80ebc6e718d2e1c2418c77ad117ad71a1def5ad3e35d6b84bc6b0d9277ad69f2ae354def5ae3f4ae35b777add1bd6b0d9677ade1e05d6b4078d71a31ef5a53e65d6bd4bc6b4d0e367a8c13d0f0e3043afc38019c1f2710c08f134861c0d864cb8f4d42f8b1c9981f9ba4f06393176e50c1c1bba830e15d54dcf02e2a8678171579de458513efa2e28affcf41946388eb799143f122f7f322f7e245be801781365e0422f02290c7ff13913ee0e879114e142fc2c9e2453864bcd8c3022ff6a0e4ff71e0807a11c79417715cf0228ede8b38b0bc884383ffdf51e44a63ef4a9bbc2bbdbd2bc5fa7f030ef8272242e00fd061c098a3145f2c79bc580679b12c5f2c2778b18cf26239e5c532bf58a62f965b5e2c4578b134e1c5128617cb352f96725e2c8178b17ce2c532d08b25182f966590a3e84a20011c43070ce140208d7d31cd7d314d9317d34079318dedc534572fa6315f4c83e5c53419bc98c68317d38cf0629a155e4c73e6c53439bc98a6ce100e3d84766a6c297a2a8095911206dc292aa2a5c80e6d434339dc701a63a3ced41456a295541d1c3a2ad8c2518021829eac2242f5746328e620c42684395c8458918bdee77ae84e7b7a8d6c21678b14fe9ada6a20df758b6eacac8358b90b415c6c216a1147d402276a3113b5f811a88e1634024df1811828823469cd020031d83b91c5d11b40b885f50ddb9417f1eb3bca7c4a3930d5599a4a5d6da6fe6d5c0da8ceead9a1ceaabaab9b67831a2da964e1a689e66d4dada267ef674ddf5454ef1d9af27435f70d9d02c6157b1e8a7885972b92442b02fd0e1a387442235a5145147626ac62cb4ef3784d54a1c3cc3a1c5460f9a902fcf8d1e7ceb7d0474b4fafd8e7e85f8429fafcff9d426b6b8a24dfd33bc389cf1e7bf6191af001001f2dffcfa78a4fd2ffabd99a30885258b18214e77e12c50a3a2ba76e5d13a5d5f65c068a41504401c500a01873e635cbc660d76a28a2a0000205d1cfa0917962489c249cb0e1bf9f79d394f43891b4678cffe7273a459b7b5448f5d4feadbf3d44b30c3b49d62fe53cd992d5e9f04c926569328b24eb62f5ace60c652fca9f2c97d254a2151c343134830a26c6d49131e19a51a48c064bc07e50c2cd0c3933684cf1b319ae6fab5b7b1123fafca024b0fe5fcd404d35c5bc7128b5af4da60e72137df284a2dc9ac3d3deb117cda5eea71da2357b7bc6d8e6ae7d0157ae52cdcdb55bb9b261cfff5bb9b2178bf39a0d6c5ec897ce33efcc27b486323500ff3fca8f353c40c39ebfb23b4ccdf5a67d4195732a1aa46888800623354bfc3d3a3a2a8f906c117c9e79872d152bbb3198d5ea4e833f9ef230561354d3536353e3a486a626c7a8e6461a36ff34252b64a94976adecc69060362ba329592137971b6aaca08ee1a04631cc9adaa7ae69ac6a6986fe1f0d9bffcf680d8d97bf29a7cd66382525215f9acd7033fc3003d60c3d64a833cc3e7dcd1cb65c45519dcfa95106550623670c80e6cc0a67accef4888189ffbfdbb75b7b0ceb0cb3eaf04479eed60e3596c97daaeefb6764484bb5d9a476dddb665757a0af67a72b479008b5898e3034f1db59cd664b941c71a225ad3010195f18c4c30b645e485f70fa177698b9f357aeca0cb456ae6e0cff765626aa6f98f3605a433163d5815c1dcdb8feaf0b0470810617707fe5ca363da52bff71d5b690450b28b4e0e4ca952d29f891852658d8f2ffb5ab6e94fbcc9e7d65ac2883662cb3f5a58aea5a99a51502ad40e62f8ed9d27cc299093ecfcc845790b282022ae84153ae835975aba8ee2a9051c1e9ca9595abdbfb6a7ba6928217291020850e5228ffaf5c955c2dcb4c060b3261c8287dca6d99ad9a7f19052350188342d30981feca9515e65fa99eebf03c41eb042e2714d9638296094afa7c69e5ea0ecf287b877de5a9eea1d954573ee4aa35b34e6177989ac3730c0b639c3eeb740c29e60b316538dab7980bc4dc307dfeffca5569e52adb945b344c993069981f426de65dcf3e6b4bf853c29bff2b57a5952b34dfc61284a9e6e14a38fa8df1d69e21bab5e53fd57d35b50fb705fbffab653a1dc1ecb9a656750a3c75180726cd5f3040bd035374516ecd1db4c3f3cc308b06b915949290a646c2966be347127a24b8fe3f072d476d2ecd11debcfe8de05b4738ba9cab5f061915fdf845cf972d3766eaf6ed5d0db35facfe6fca79b62f3f4410e2ffea761988b5cba7cd1d987da99eb2b7876e75e5298d769e9989d68737dbb3c52929fd76563425218da6766dd2683198d26f6725e44b21c809010de1821088feea74776d9a514c567688662d1b20c800821004fbc1023e48d3b52e4dad79378ac92af33ef0e1019dd1031a3cc08d5e12e0850b2f65bcf8feff12d13fde8958353341f956f53924a2729488b5bcb6d33e15e57a63a93b3c4f6b9ebdfec33d14adddf2cc68b65db8e8024497f3ff6f149315b6b21b538159cd3e182ff75b0708e8e0870e72e800ffedd8ca2e57854ffe5fca8f5c3ce0b2c1c8a508971ce316335b40d8f2000703e0e0e42008073e3610628373dca0488325feafeed9b74b57601493954c6b9eb5c30c94dda10afce9287bb5e60d77e8112456eb6ccdce30b6b20b43b22a712c762fac841db1c256eba8d83bc36ad726b6b21bc564657b289a2d8f03f30eabefd4aab97714e3610696f8a7d5ad350f5b1ec71d6b536b2897abf6c46970a501939630fe6fe79c4add96ab4334ddab1d62f59aba72fddb6a4ac392f3edd4fca3c592565b26ad4335ebacbe472d45ff57a7197cf13f9ef232609381d6676085f77472aecba2806b6a75ebf450c7d52c66facef2e5ff9a4fb8310bedffa7fc38d4f3ffb7cc651e87646240185a1b02bfe7e0d0e9ff0a0799c2377f63305b136ef97fb426b4bac2a3312868e543adb37daf3df8e6511e14be6a83d9179cfaffab4a8dc12c41c37403c72c3659c257b76ecc82ad68de6d1edadbdda7a63c38ae83feff66a0e52a901fd73c2b997175d229ba3957bb91b9752b8dbfdddcba2348561a4e8967a3e5b46e987fa30a7c13cda30aeb815628b8f7d0fda4fbba95b1ff18533c290a69142c626011f43726ccbf2b56ba6cd6f566ba187314697806356a75c7a511deeee6d6a13bdb2f589460198171aed6cd30cab195dd219a6dcf16c8034e8d7c109f826bfdcfb09d616c6577e52abad332e59a6ae4477fbbba773c1b35a244a02da05d46b41cd112c521bbe6d6cd6417636c79dcdc3a2bcbd62cb78e669edc9743790e28d4a68aee154baaa74c1de439ee0be25877ef1263630f0349eeb8b2702253e5f4ff547424f02a82214191c0a0187cbd49928fbbd59e723b62b1a93123071359b0b010c588013962fdf8bb9312ca00d5a76d420b6a74c6510d16c1bfd004396d7274a7eab8c9ecdfc63bb7ad465fa0d1d7c4e87bb34488d6448989d0cc47438bb1b7f5cf04c60c2c8212fc0b25fd7f0da108ca18799aaa656bead9aa93e9e1192c79bbafea2ec36ce7aaeda1db44d18c2fb644acb5b3de6559a77ca7753ed568786e9da937f054f9137bedd19112dbc41e29b144ecc65c45b9fdd5ecc53a42d2cd3a57d18cee1f378f8e8e9064474748b61c0afbccbc7b0af7ac53be436df676b573271a20d0e8626a2c48b688c5005b26785b258b01a6b1010d5268c96d6a0aca2ad98d5f092ae65eea4ca99eea2a3f6f9dc7ad9026161bb118dbcbd5cb5355a779ea62242bb3d8f6cde4c8f6ad7bd6c98e8c8059cdb61f21f1741a93e9d60e4377d01c9eb60c62a2daf2201de5b6af7ced6d15e528e73ae552ea6a4bf35457d1ab4d34f39de5ea951bbb25cc5e531ba1bca6270bccc1de6472a6a10afc3d01e6e08dc68eaa1caacefc7fd597aa9d9df5d0b396eaa9fb83ba56bdb19b6e5d769bd33c2575de8439eaff21a0e280ea0ad5d4e7782355122ad87f69673d338d52c078a8bcab46297180eb4dca97293b3dccb0f55ca6c8fcb3f0ffea8f5306d8c0804afafff4f7cb01bb8d00b626ecec8a959ededc6883bd54af1d416202115b5b3a5ae674ad9dba9db1521ed49d57b1b7af6ab64488e4a05eb2b70b27e8fa97a592f8618e0e23d4191c76f0200b54d3ff5baaa8a8f4f783b26f6a5f5f87186578a22ca1d555dd5472a813459ba096eaea46d78b249624a7bcb73b906b2e15d45038c7a5369e4d5d6d1c7de252410e9572533f19aabfbcd34b4fe8b6c29c5e8cee1c85ad69a2dcf6ecd33c9b81f9f670873addabd63d3b993a383ddc59322ea9ff7fdea1c62a62b1f9a48143dc5047c1583d8772ecdba559773b4c33ba752a506319e9eeb3352e35d451fa5047e15213a4df43519d85eb140a4d0ada15dae3542ec5a59ad094441895bc3c52b9de9494a4ae9984c90749aa384e8fb32f667bdece4c7463d972e7caa92a7c729e99698651d238b3df4709aaf8e7a8954950226559ae0e6046394301a207e3ef8e9bf6b1f8fffd630480300ef37e6bd7289712e3858c4bc4c4708387718913dfd3bb3bc243e345c307114aee4c9d3a4b4301396e6a4c826506c9025ac801d7df4e98e3e6eaebfbd465b5eb9ede273c54a8e2727a976a1398831d6bc7cf9c69e6f116fd2fd540e04fab231202fe2d946e448f483a7e667bcf418d9a5b0785a7da029e6a0b82dc77e3523cd5166893330973943047a5d9298b4f0973140ecd3e5cef1aaaffcff8c1d4c05fea24cc517392bea7b7eb46597094ed5156659439b1a59d755b32e152f8d18889f7f5ec349bed76aa77583b2dc4ad77a9c966b54fa58a8aa28a8a32391a8359aaa8285fe754962a2a2afdfd6eca6df69d2304148c311be3034b4ce5863035afea9e8494cbf59cf323c6f800d492ff3f0266b5ffb6dad315a853def840d10c1a49c618876cd1a74eb7d1bf71c43864c828e48e90030116892d3b126caaba97662430fcd366339c92902ff5bcd3554758208ff8821d63740a89148744da483b8eee1cf523dc5f8ced79f6126b9fbad16c4bdf4ecd387bfb6fdda57b67cf3363d9b0258dac218d6c195122af15570c79cd9b806ccfc53ae31c3c8244640a631b0302bb69573e54d5ddca87bc279baf4ea1dc21cacd5577a035352983955a9464c8b282225f9045ec14e1a048d365c2bae7a5d94c67bbdebca71bb31b66f14ce5a8ee3c813c9efeb44ffd7135ebf48d080d4484b09e73b3192e93441420637f9eea669a996a9567699567993b17f3fdd76249afea7ee54a987f56ae626a874d01d3fa7f0b9bfaff0c8319f519ea48a333465448a374fb5435cd401e8f9b683632b70e823eff0f419caf41300204ab916fa7d61ef813833d50a7f600997fc02ad5c1075c43fe64ed2387dcb943cc0c113e39c409480eb1578820744b09b92324cd5f5288d63585f8feafca512149ffff428afe8304d1f3ff5382b0f9970a32c2df54ab1cfd712070ab0ec871e00ce9000b0e38592fac9effbb72285da3dc6ead3b5714ad911689f54102f102c80e249031312bbb3cb2015f033b4806e8900c7821198880811ab65b97f227fc0369812dfe3fc8930be419432e70452eb0c3c711a48f383e84a40f2b3e76903e88e2900a9c53b71b219db1a9295b467575db8ce3eaed66cab72dc2802cb2f5280308b2c79b1e3cb2478cec3183e471048f218f289207022f39e44b04f2b56447a08f2d2d01d78ec4cc51dd7699c53a2bfbca1ebacbdc43cb4eee80da0123b7206f20c914481b49da18a918c9fcc76c483ad6b74d4fac9407453e221b91274a21c51ca44b0ad2758774055d4a48d78e8f31d92236ca343313cc66e628988d2986310ca675c3dcb33e392f49046e20110083c09044e0898e03903a00e97041c72675582175e020e24312f140128940125111fd2073ec21731091830c99e34a0e07c803ba380008f2804e1e60c3910012c70e240e1d8903ca902072e8cc7fccaac74fdee6ea92957135b5321e54550eb43e35036d6fb77b1cca5ad9c6d8a65c6631b6b26b725ff0c67bf6879a5b97755607b17659677b3f1db425d6d8f64dde1044de3053e4c91b48481b5b903670b001246d4cd9104903a238b315cc86722b8bc1ac95b975e8ca7d41732fd919ee1cc83337baa6dc660d9752ce4b775aa346d61022850291425590426548a12c52a8caff1f3d291423694c41d26043d25081861592c614394301e48c37e40c34e40c2c728612f2c9205f08f2bb904f45fe12f94265d029032da3aa0c21329020a304326863001a4385319ac410248699ff8f59d9227629ca16b15157aba8ce7a6265dd0a66b3b2bb754bd916b14cb6885d82d9ac0cc7edb128dbe3278c4be1a4a6d898724d4f4b39ab5a140f47cc48d05a6b67b6261b0e66634b30db6682d9ec5d82d96c2c0a66b3b7e3b0b2588fb265ac33d93286ea136697ec6ca8a35c357774dbbeceb06ce543155bd95df99063d0f7d69d79eb506e6e1d57397a873acb31b0bc14a3c602f22ce0840560b080212fcc3f9ccd469543b2c21c85ee5401aa0292143023014324804b0294061d60509b415983ccff1812cc86e3a6992d572f36b376c256d59d077156a6cf35c55626b338d5fa96ea9cd53b94fb54949b50684a26bab10615692c8b8041d7e84704dcf9cb9342c016974280d277a3ac7dea280760e100eb016607d811869e30ca8431258c1fff6f79bcf78bfb5063ddc0c8008c1b18455f70f1050a5fa45f34e0851d2f522f96bc70e154a341dbcc1cea2825e6d9cc275837776ea8b166b30e1cc690626a6f7ab239769e3ccd2aac1b353d59bed3ba9b76d85063a15dfce982cddf184c77e1fb6f7aaa7561c4d43ae599681624e85fd01d415aff67de09aaf2ff6f7350a84d948b2b2e807031638b365b686d41650b06b4b8f39f96338cad2c26d3292ca7724ed5d355f7dbe8a97d81b608b443201a02951068964517590491c5f9315839eb326b356a0372d9ccca643ac5a801de18603580054404a033ffaf751aad053970b57f0ef067893f6afe90f027e9cf11167dfeef949d85a73c19cad1ac7f6bdf1c08058b2258146141e4078c23fc0ce1e7053fdacff533f4b16e8d98595359243b5b6ab2b28bda90d61fbad5bea2d95ea1e7791faf30e10adcff8de9ac7d5ef1c38a3d3706d3bfb5ebd48a137c2a8d56c508555c5581830a3754602a701480875c016ef479f377a8436d57d5fd3c7daa19d468ce54bbd6e1a0463baab14e3b54b7093b3a3a42e2325eeebedef6a9bbdcb3daa7f6f1d2074a1f1c53d8f97fed536d96144d499b5bcd3929549f1add27fa64ea734d57604ef389e2ffbfc6070d1fe05f9f3ad4f199faffe773f4ff3f4a31e8eff05477696e0e76a3bca5b092e2280a4151dc3199a2d02acf338aa49e3e77d64e815acd67de757d9e99290a5fcf4e4b9056210e0a099e08e38933f7f70414270439b1c4ffd53e27a89c78edc9b347dde3f4ff57766318c37aba6dcc84592a02d021401601a0fe769cea5d132434f18489329890c3c49089a3259c58824c0e9f59a75df7bc846bd8f278c6c0edeb281fe6739bb2754a89028c51828224c6480208350908929881440d48b4800414124374ba02538d73aa50f78cad4cc755aea6d8ca32ba8742be02edf0d4c3829e283df68910a91121622f6f5bacd31588ed5067f98c02a92729aa1a958b4e1940d5008e8e88c2801f8f20c0115e8e508f608008236a30c2ca881a7900e5a121cfd5f772433952fb8ac1ca8716ebd468e5c329f6c630d6bfdcad99d7ded6fd6a427df274969067aa8b2d8feb53b77d5da73c9b2d1accc05b116cbe1721044f1178b4f06880e786870222c0f82bbb269a6f7686791ce5bf7316eb308cf799757a9e79c779e8131156ffffa88d0818117fa70f3007eb7ced8e198cef3859d99dffbbebd967eedd5e6f7662b0836dca9970de3d116a3b3b785c00820460e6ea6e0a003f4d4751dae9aa244bd6a18e421bea2862fcdf21f00cc1e61fc79086d0faff21ae104e08b1831040cb4d2186fc03b3f6d96ea4fbe9de6b3a4d25081382580a222908581037805000106a80b80244d35f9daac3545d751729c604b3e11d9295dd98ceda1de53b07ec186671ec866465d8e21bd626df31dd6c11cb74fb21891fbcfce0e4ff6fbaaaa96eedab1d52b1448810217235568ff2430e75ff74fa44f7ec03d2703dede993d90c07dc6a1d5e2789cea0ff4be70e1d32c0add27142c7ce116404b8d5396486464c3dc7d7db3adbf79c1eff17b8d58ef3f5eca33dd9528e03720c8883449638427cd8e3431e1f541f7a3eb87ab0e29164387d376f636c4fbb53538d71d836f540c281020e1e381cc081bd59627ce3c21ba837473c44c18399ff125361cbe354d65a3bc3311ccc86adcc96b688a5d2366f5367ed9e066e3507dcaad5bf8c6aacac72d432096a946f0a7630c00e7576d8da4129005604c0850068a51ab8556ccb8b71d8e2baba9570c3831b316eb29b263707e800860e2ce880eae02307218c8c2ccf44b3ccdacbe3980ae3181570abdc17c45676a1a8a65859920c0a6e8acd960970ab29e7c92eba31c653dd08d559bf9dcf6cea1fef6dc470a24d0c6dc0b439dbbcd8c86143031b0bd8dc58a3678d96c7764645d76465b8c47dd6cdaca9744d5676316eb2326b710c0966c37636b4b2a6278c2d70abd6d4bf3dc32a47d1deee18b8d5a7bbc332e0c6010a1ccae090010e341c76dcc0c55f8ce3f17ee6d55e8ced50b7c3616b2f6f5b8c9fa47dcf66381c856a20979954be9e9d525a8701b74acb9927bf61a86f3b0c53bb7dead629dbc4023179849b233e38027744f93c2aeb5337cab1d20d342205238646c0be296f9d4ca6b3d03c74f2a49087823c444584518499ffc7312453a65320476d2f71dfc98a6842e249001e3878befc2dfb89a7868788882888b8f32fe412818980808805eee0df6ada3b4b76bcb0f3c70e0a76aad869c04e0d3602b81240d41062fcdf98b532346798c531a0d6a1353b3b71e7e9149b2837f5f01c028621ae0c011b624888208428f3179b318c61420c050127081982d80a62822086806803c406ffd7f6ecd39dea62b38762ed781c7781b6eb61eec38caa2b47d3551d9e67564d549f59ddc0bca3699557952acfa2d13aca373accb19b2dab60e693532ecda57584ba8e53baea78bc8efd5b478ace9da743e62f1d27e756b3786ad5ec634267a8d6e7ef9c373fe7cb9c3da7e8f6fd64ee9c9c0de450c9a1c5f1224e1a7de66df31aa7880f837cf0e3439a37b50f13f8f0c3071c3df0e941ebff6725eeb3190ef7a004270b386de0643808bce973b536b5c692712818f37836d137230f7378e0f190e3a1090f3676e0b3030e3becee3eb3d5bff2eabb4bdccf1cd4355959afe11acc26d3e59bebfc0cc0a00090f91fea023005e566d0a79ce7e68d1b374edecdd0671deafcbfd541f8a40e3afc0bf32f873a396ce56035ec391cfddf3682de447b9b3a3cd559da6c6993a47f6cb0f8ff61e7271b12d844b026d09a19d65cadb177e5436b873a946f9c83b6ecdad43335c8b9f2320e5e7078c281e886216eb0e106dfdfadee5bd66cc8c2063729930db11a9ca8c1861acc1a1aa0c18a1bb35aa7f5cdeab44fc5ea130d9a0606483556a831a3462893e1d20891064b9a5e9a114d1c3461d0384133cef0c30c593358adc3329091014b86990c0d9cd9f37f7390204170361bd519a7334331e489014d0cb9181a80e10918bcdc58ace7783c27c412b118db221663d81d2eedccc318cbda94f360f0f142122f6879c1e985b20a3378cc70f9bf5df7e37addf575d7d5ece3670f12c4666b26e9cdb85017fefc5f17b6384aba30f5a40b437f555c0b7b742fcd2d98f99f6a414aae35c1021716ccbf250b36ca08a00c0865a62e8feb1303b3f6edf2892def69852c5688f37f31b65235279cbd3d897ac2d92754b6282b65b34d4fa0a06a4cf6c9d2edc96905281510a0029affdbd3cd77063ea1d9ccfc04d28e2059613d74f7d0adc2910a6b2f053d9f422d05272990b9f364c8fced319df21fcc0ed14cc6c97f8d8ceb6635a3b007052d9d558d5026240a4efe395a4361e8839a77429fbf29b74770276cfd1de6a0e552274c9920c65f75f776a78dd9608c933143c60889b9420c0962ae8819fa7f2a5bf2e12943b92dc9127e28414c09584af095b0c0d69fd816952d114c156062008323c1bc46b9149335d16c01cc7675aa654fe4085d46b88d30640403bed0f9727e91f28514818f086b44e889c0030076003006005b00f014021821b410825508a216175a3d68f1b45c208401820c204c9120307d00c6076a3ed0e083093c30c0fff7f59cb2322b9688e6ed13b5a65e2f8edd6e36234f567663370cb337549f32a16a8105301be67108acc640e0b56589dad2f3cc4cb688b5c016b1378cee7263d96cf66224accf9cb5572c375577a9fb7a6614669f54351783d96e5a59ca71c77d3d81b6dc1863242bc3bc9d51ed0ba69c86eefcf3c0eadf03d8bf973e9f815ec8fc7735f5e2f45e8a1eabd7baecf92e6f6a5db2ba1c5d74e75f078276b50ed2fc0fd16c6f075b3a70d201ecafa935940e86fe72e973e35287e4b275e302dc53ff5c922e97a2ffa12a35688b9e7fbb85cd96ad2d4eff77cb111a8da624e44b34986eedbab573c0630330362082dc40b8c18cdcc0febfad6970a5c14c8b175ae86859436a09418b94168cf233731ebab33e9932b0197c963b59b864016691ca52244b8f211043e18dc976a50c53c9b0959195aa6fbca046d53403b7108c90470a774225c2587089e008c161b024831064219165c33f952d62ada830c65af3ee8dc154ddbb31589fc9b8ba62a0350fc7db362bc77a80958d044a9090e8d501758faa831a825a815a3e55cce4bb145399660d5b598dec6b9fd29b3a90b400e90f29302dc272e7ffef115bc4def06d36c3615c652ff6f57cde30a622b13c00a402f8e695245992e446e0537730cda9da730aecc113c005f125380a9c73271febbb0fcf9c572cdda2fb07b33d0040d82348ee912562a96c118be448d24db23394efdbf474d39c32a181fea235d40baa0435fa89f117f3b8d5adfddeae5b7bedd7fbf1f8dd20cf27ce2e27fe53ab379672986ec52ae1c48a824523b114b083c18a81150642db870d66cf36d16b245be21815cc8691ec4c26b3cada14701efa6485c7673de77a3ac5d927eb8dd13ba28702d90bd3c3d253ea09f110c02b8207040f03920744e3d168f05063e566339e0dc36cbfe1d894b5b18e979aacecf69a95597cc33153cb64669a7d3059d7ad5d669edce229999d8a05350ab3dd48b7e2ae5b3bb6e8c628c63a9df67a9966cb18cd965430a59daea229711efac479e8ee3c53a783aaca777ae69e3e69bc1cb077eefcd3345bc6b29a9b9a604a269089e9f4af9abb41ff77b727a8a57669747defcebc5b60f7ff25eeead86c52a745ea7cafe352baa2cf838699ccff9319f87fbb516642e235d8eaff6fee8b9c9a9c97bf2b0fe52bafc6d35c02174871010d175cfd5fdef6732508f20a99ffbf33acb3b67af5e60a5fe1b012c78ab6a2c3821f2c48490b8a5840f47f4d9deef9c95eacdd06ee50dddbe736d31d248845f910cdc333a6cb7dc3ecd56be73e55a87790ff80ab3d7be8d6710c4c1dec3ba353c82a69aa78f97fd2aa0aab1facb458a15645ff9fa97c40a5099521557eaa8ca81a5699ff9a576acdd33cddcbe88ffb82165bd92d9fec9da280296da664dd1936770e5b1993d63c9a89725daabb5ecd9c9a735aa7bc1c8ecde37c5cc54570eb9d9fb6b44175d5ddeee89bf06fac6b7d4bba31aec2ecedff49aa3d35aa2f4fc5244510700825789352e79f7355ca96af49312205f67fa7044dd5599a12564d29fdff99b54e79b9a04667335c2ea8519b10586c3ddb8ebfc39caaabcecaaed63d917223f58154506ac81532d3bfad3e208104f70ab6926f5182a284f88bb3d9a8ec50c774f54e67a3a8441541290105029413a81f7fb1ca798a6ddf58ef5098d569a9d33386f179a32050811615ec90ab60e8898927119e929e20782a72cae384c6c9e67400057c285081822a140cf9bfbfa526cb51cb3bba2dd63007735686ae6756fbda349be130cea17c36436ddde21c9a77b919d5b5c2e129bbe7cd963bddf59b728c8d529d42c156fb4828244071020581374ff493049ab068e2816c42d354c55406131a26292493eb5f88b557ede9364a755f75aaf6b5021bd36baac2ace5aa2d7daa2e7bf6d9f3cc39accaeebd3b55db32d5433403750a5cf9b0dc5836a7a5cee9539773166bc7a13aaab3689ed6292fb7ebfbb797ae96864c8de55357abf2f4a9deda9ebf57aeac5c59b4564ba372b466551bfa9d933cb7f71c74e27302e49a7df5a94813fca0f1a1fd40c380a6f4478e34a9d20408a94484121725ae1444e906932d989cc0040a93a1d918b3196653122c40823347742fd548f848111b83a9397767f848ec88595e2498552d0adb1956b38d32d1bc437be8eea5fa07e4328eda7c0489f7a437ba96da0635aae6acbc63a27d2aaa831aedbd544725d949ca20e982241f11f489e0ce2d49125d04e41202904b62580280254b960c5d8c4dad2ab949fa240922891732c98f4c8284840c12c915ff7fc58a2d6dd903af1ba80414d7eba064684400000000000083100000201c140b876452b9683ae2d70014800159b6a868c54696e789cc2985902106810080800004802409009b28617614c99a6ad16a96b749b2388955cfbe407b2bbced21b0db669e7996ea27fb4b91597d29f7cba606efa1b4f5bd08e905bb3c9b4f7c76d9d5e46ce0f7cdf2da92d67791a0fc0365f3a9fba1e990c2929b6355f56bd3fc23e33f88fbfbc1b32710a197948ff4fcfb990d48e5073e1744a38ef0ef21a543162db4b8140ff6c5845f4ff94b8fa2cb83b28473e7696d31ae91cbc9db1b052484e8e5689343ba01435c603271e94b1a0398ea8bc7a6b3127f34eec8798005dbf849896714d431799f3712977efe81b926b886ffaf36a670488796cbde4f2ee5dd3b143ccd8f7f6d9946f6c11f6536c97abecaaa7bd76f721219a2d74ace888ae12df178be43bd68950f2806687e46ee1beaf06cedc9ea7a6f49efc72b69674b0a0e12fd59992431237f3cddc73db49ddfe158df6537a30a3b090685e0be64bd0c3078a80fb71a668edaf9df0016ef7cac2cdd61ef8b481684cf9ac21fbaaa9e375a82730a22c12f82b6196cd49cbcb76d04d25c02deb82eb7df1fffba4a9138f71ec6a10c643c46e7edee71e009c331af6499fa234eb0430c5d9309a5af645339e7a3a7caa19679dec7cb769f4cb2a9427f5ae9f2d83e4e044a5bd79646f6bcf1be36dc56b0110f45b88e791e1874b9ea44803f3c4c4aed700b1c1817f633a81e97bb8fc7095ea5ff9b06c3f603a748734a9b3e10f134c94c2435d53cdc5a6931701704c129285522333496b90059234969158ca6eba2fe427953c6c675f2107a5825f2fe0ae0306d79bb9089d4c15667c6b389cf041a63bcdaa00b775808347ec30fbbd564abddb56599dc627a4a6dd0f8add0490de1f2b9f3cf25d286f4f30cbba3fc5bf7b981500560c254594a6b7f840b078d8a5b85ebc9119744705ae7de4c37b47f9393aa3028df317e9fb448871114c67feab0efab33304a3e36ee594882c6c4aefb3b11ce6f7340cfec569dec3779ad271327a73d386dd097d787e41d0600cbb35ebe0abe96897dce02fcd4c9a689b46fd675cfd8cf4ed99b202d97aa1e62d75afc8831ff3870d1ddaa56479431b875aaaf2e79095290ed2755d918cebe85162612f621d7d4bed9ed314bb1793fd5bd13b60adcd07f8f7e53b9b9e5fedcf44d5ad788709c055f449953a4a564cb1a4904ea3c6c629075ad78b256c36467247a051cde2b77c7f31acd1e3b813243946dcb35180f2d68e1a7a482e55224af1c15e04153e2885b871448bf64c3f2e8611e71252121364e1c606ff780a283027592022c5044397ad07feffe93d8ac89f974b57a6422ded351f728884fb1ac74ef7e54e7b43ef7e47cc4b7cd85eda8e65a0ef2dc12dafc37364c724e0a8178ed955c9a6adeb8ff2518ee68b47838bcc7ed91e452037581e9ed3d011d660484edf24e5dd9821cf739347d041176d60edbd5461b12bc24afe58bc8111ee1854331775be9ae511d9271c4dd3302807658386ad6707fb6ad784a0f3b6bd51041dfc6ec7f9704e59c3a8fe64a7c3ae68b24e7fab466e314a784c762792f5a6753e788520304e606492dbf0dc558fd5eccacb27d18eabc1798cbb400de96f6a95342c2a9e9ce1cf27fff3e79c00e40b57bfd97c36b2d4a6b3d39005a3ede4fc0f13a40de672058bc8e6615ad09fcbd5fca52d16e29728b27ecc0c7dea2fe92e0601224338770444b465305a8d04ac20a1738b85ffa24073b25db38a4b14cd8b72d38e00c81b0620e0d004bbb5fd359eb7ca0edfb52ba6f0016cb97936ff40dcc1e89c749757d4e9647c738bb94d677ffe793bb61a75a5c553a21ecbd78b8232cea78adb35ffd03f71df7f05ba4625bdac2f1a463b42dd0abb020bf26d8abd1be97fd790ff826feb4a91d944fe66c33b13c8f0f09d77d11a8a0234031803c6868ec1a9bdd35f134f998c7c6b7fb4d2741a830160d4ca93fa3b93fa481ad45961e9cc96fd9cdc378ccc40f16921b42d9d352d72c276db2574d346b367eabe73e498aab7382b1c8041a85ed6d14f2a0a7b176d5191b60c3d71adf1e7c2aa5b5f9597763a5f328ab15691ac53117ef530ac058eb81b13e4412fb30cd4862cd0242eb79e565c64c9a06b1f8275ebf8e630d89d9d8e5c796a62b3a0ff9fea1416935736f88f379d3ab84fdfe260d8ef04846648b8f83198cdf034d24bdcde0ef1423b7abe8b1065097df0014dc59da7c2389fea800001ba939e9bfd6d91432484975086a33ea84d497d3be77707f9d63899542894dbe7f9f2ade4c5f438c1ece46a7c60d002ec14f0545ea76dec26cc6206c098103b2c6cf7719660ec19aa783b3b7e90dfb81c2be736f81a1feaa1e799a9028388caa1aed3d1dd1441908f5537a2e73c76c047afacc1de50a0e364ebe8cfd25da07d81d4b7a94c72790e0426eb833d00dd2dd2318c3a28e44d8057abc7bf4fc945a9aeac52fb670e8ec26756b2e4582216939aa12e87f973d4a29eb81fb754d177c1238b1e1fcb8b398d1bb32769027ea165f1584b33969619085623b7ee130810543e088d1b09f62f796ee6d01422289138174c7703bb481ec3bdef8c6fd1df2b3296bdaf16ef20c953b5e48ef33acdbec6e229a3d5dcd78efe5a7c63795d6f3a09ad2ab7de07a2e130f2e571d86e23ce215abf769c8d33066cf5bcf3c0c6e2719544f46f06860bd93e9ddcc6006f93d0ce9ff62f23660e4faacabd16bb02bc9a8148530164ecd3a9c8cc766d5d4d4dd866b33110fa6387c42711602d380b87145f1a163e0660a9fe45ad67d98f60c2db749b7dcf0c7c488728dbc97fd2408e576d5495e9243b375e2b4c6c63eb63152dfd5618b12ab5784c265754d10afffefd6f396dc2e7407f139c44d3f55e682ef65277648e9c20709058c268551e87fda5b0a46ad61609d67f079895f9446070379741f4803626c8007efc091860ca9d8f851a2b91f5f365fac7874d515f0790bef6f74a36c061d76a992b11309a02954c189f2640d1da1c163b19b11d95efdf816f0a64ef9e74565520ee91192bc5090f458b90115efa00a7c4eb79c5c3f2908c4a409782c9d0203082dfa4569ab00a7254fa1e8a05fe59c9c3ceca4c998aa855e1b9f726ecbdb2e507a8b2bad0bc0522800ce1e3d5deba32efc7fb23334ae092173fc6e05361f6ebe5171a818444f9e18125ff59214748ff7b28682febbcf1bbe10b8f0ecfe77fdeba3a4af0cde27c2ef12f81eee8d35a0f4c9fb07129981eadb5add17fd3e62797c37a4ae39e4e0efcbf4326e70f1b24e6e98acb50d86f1e1010f39fced0f57b9f47c0c708d83c231b918246b03ebf68933f9c1240b4f1e71fb5c3b6a739f1d8db49a2bee070c57fa72f2bc28bb6c623725084ffcad1fbde900715a6c1f148dcba77ca366d1d7f12166eefccebe8d1ea751f5b2ae11b073e0c2faf9ca583cf54ea78e883c089338de494e511a18df4e69f6dcd11de5e28736ede42e53e8630e6c4126c4f85027ccf4cc141df81cea5ad43f2b81bf3dec3bcd35d115cdec423d5dbd771cf88e7c31559a5a7281ac7d91a31eec9c0be0019fd526f42946096d46989094db5245a6c68f0286692bc0884172f1e3e09025c2253ac644ab00b3f40ba834706c5c408c47e9fbb2d96e875856f5cd00d2929b3d8998ec1307425b90bd68070b33b55f5fbfbaafd7768cc788e846d17cbccdfeea4903ced1d22fae8008024022137152868d22789b2fb22d7d49456a6a1f3256c737f15af01a451e117d3e0df0de8d26792997eca3854ffd7077ea7ce4b76db31d9f723b5bcfc4c84e3bea481dd050a02c129b8db770429dcb03c8073efb260eba9b6f75b5d968134645533f54846bc6c7488d0e298a419ced7397c8754430e9193030aee765f46eff7f5aa4dc4725eec697bbf57dec5fbe21f6ff4eeba7a5b41f5c481c8c3d394ac07a512eeebe17e5e865dea6ebf317375b5f8077f17bac1b8cbe8ba7a3deae06f15e6d890752270e54dce4cc65b774901475d9cce2eb21b7eea42b07fe2e4b48301f65f5a0724472c6d713922f9710f13836499c6748c25a99a8e9881d13ea277b78ea44cfe8c0cfdbcb36983740f100557930f8713e62d922ffaf17db1c34c77124575bc1232555ab0dca3645cb223c003a4c6382bde02fbb9fc9794f3d74de4b8b0ac085e47570940aa9dabd78adcf7aaa8311895ccca05a52a39cc7c752fb0a921496ff228a71167ad62ff1ae6e3a8d14383e2ac2f9ae00e421d65e0e240c0c4347d5384d5403227b455447e69eb60258c9712bf3c547f953c9f3e756a4228ae4dc0423ea52f946e5dad31f13db2b9dd1ab762b3a1e694411d2693ab5398a03f638b2aa22d6265ebd3023f374a23e5876b1ea9ea792e74a0d3f58d3b130499d49978f31ea85ab1445d3932826ae78dba2de39efe2365d23f42aa7b4b7a555c961ddebfdd5cd923587594ab2a086c6bedf6ef71b34912fa87ab59f6964ca5d261f11f21286d77b5d385ae3c077fe53b8e6399be4774f030c3a574172c90cba40303f6c84d43f925da0ba17fea9e122970f61cfc38248bb38b3cbbe83b5954eebb6483f9bdcbfaa0a0f7914120df87db7f7264e1ff396efe7f77cfb2dd114624c3bb9f70a197371cc47acb9c4fa8bc3e3b31b36c6b2beae38e80d2a117ac144a85ad4a3e7b188955b2b7e6a8d969e0cbbab16046ec67a0a58f23c39c2f58525f47266f8f2efaeb3fd064a39b6eb9e0c8419e6ac22b800672addc90f75e2281d6bbe2ca0472338193b70fa0c123a7671c13137d3e81586db97ff38de9a608e1689f01b0640908ed2f1cc2406739f724807505a777389d53b4eadb8c571d3a6a7847fea871a1b36d3456c7b8f719cfff03a3fb60ff69c4d53b1e970a74ce80ce7ebaac53da2bc30f69611ed2c22b13be44fdc208e4f80dd0a7c23e760a66e956f5830810301d365640b5b6044e886c5bb0b931e1874653036513388562573902eb897125a787dc678e39280a0a9f3a2131823c03cef8fb3714b22cf0182a61190251f0ca7fcd7403455ff205d95168b1489bab52ad8182f174b1810210e988119fe84aab4c2cbe065f8d8bdd3d327756df3acf0742d4e1142cb14123f1fbfa22e09a8c9747d4df30c9973cb4e1a7198c89449e49bfba00f1e2a26bc39bcb994ae3424824c2a80d806df9be859645d4d87bd98f4a3d929af57580101cfe6103d0329e7366d2b242ff7f37b56711069158eb9525673546844cabd6ce17a9ac02648d91f1f1f4419d001d8923ae2c84cefb71d491cfe86600105dd17509c7a978428af9a7db80494d914b965109e1de7e5afb83e1b543baea4aa5f6185470e58173d578aa61deda245c3c2e34852467dd66d3afaaa3f863fe6c720f2bef31dc35a83eae69db6ec426a1c58433f6c79d2f76da03bb60e2f14fa61bb8bd5eed35f7e64caf92be379b238ccee00a5d16092ff704ec1ee9a4ae6f5fa584671cf5896d50040a2baf13d5bcad64f328dcab7d4125122d98f624c7a159b9d83cd579a078ec06c2fd10ebc042c130c681bd8ca089fdbe43a5dab2b55c7def9f3622ff1fa2d820fcafb58ad6b0fc25c39ae8b6f845e570afe8377a8e3ff033e01b7ad6a92b5586f8005eed285ddfac3050891fdf829e35927bfed01f470e75be09f4da06e3f5e47d811a134c283aad0c5d71a813e88c9ba95c6212ed6b1b11271248f50de768d354061a8afbe4811ac7902d347a85a2ffaa6e1ba1031d7b24b92e2ecad38c882f71e96f1dadbbc76f9386a1155d5fb119c55ed0fd1ab1b0081e59a099d5e8e504d201cfb7376f7a3b06121598b8d25f76713c65fcee01df0a91d1debe0ddf67df3f431223d04fcfeec1d1379cf49b32b006cc6e2faa64c26caec4cb1b2a935258e3f9a83390a1d1d155d6c073c79b37f8d084f73f1d2005d73e6f3a3602dc329798e8475cc0a42593ee53d054128a7f2592c8d339580b038b6581ee3ac8ec99631e2eba99966632e413b4285c2b1fcf86d4fe8eaac7f127ce801312f71c1e2c873e06a50e9102c2993d8bd337e81a05e44592b5c9f5df00f0f4d4929136a228d0d9a1de971d82c59bdc6807fa40d1468e37d82d152bd5b6df304cb8d304a4aea25706b6142fe27b1ef414e6f5e7ce8eb2ad732ee6c7e0734836c37e099ac079a503c5935302b967255cec3adf453213887d5907a4e98f24d84e95f93ba60951dfa3eb2a9b51668ed22b4920e4ae3ff0712df5efb96ed39e18aafa51563ef48de8bba5b2acece7d9a9780b89cbab2c9d743c60913640950ab901f60e5f888ff2e6b24278fc686f1cb6b4ea85fc37e384c0d713cc0d6162d2328560ab080957cfeb44e63702adf7ec873afa55ff0c5e941a9e5fd9253501dd9841a8e3bcb222119a81aa54d78fd21f9c0ff22b25da2dc3e7d23d5ffc9e505afd7b6ad2bad9e19985b20459204a40123ba411a19951cce4fac6cbf50c3c1b57f88b162513bd140103343046a0b573b16bfce1db70ccfbbbe435010fde51a902c4399140da94779281c171a8ae34831a4694331c2c5a5413a8526d121a47512556b456cdb8d33aeaffd2f9e1372a8122fb5113a51940d1e3f3b8399eecbb24f3b33361b1f7c823517194fea8a18c9ad2c5066312d6aff9e4440de0e3dd0541fe0e4402ca30630bbdae276d0eac608085652a4eaa1ac93ba3398f2c31a9cda01f9691170f8068148b6fc31a4c8d60e88706971c6c544901671fdb3b64eb498dd0f7480993d10e14b77f18c8af4ecdb76ee5cc73c7d3ebe5db473699f0bc66997a6ad124bc3d2d764ac9a3067a22c0966e8004e2cddcd9ece0d6d8f6bf231f982e1da5809b3b08f4ef6fc637042c3eaecfbbb5d8736fcf4b16403016069bfae06bbb3d25650b2c202e2d4ff7c83166ba33443754bab1324155ab0272910f866f72738b96cb4dc913e02a0983f33878fb4f8263be474c4ba642dbd2598a2bbc25cf884544a77dacecd46e0934e60145155a6c5bafe656c4f9b52e6a3598c4180dd28f1baefd7ecad2f4ae4a5e97e8ed4fc375a6326654dda41ff5e208da402981d9df48bff045f03d69df5079f0cef17d64d1ac278422c900feaa3d6d08bd97c0f20e43a37be1b6578c881d6fdadb502b6a277128ab7fabc09f0c00fb8ea63ef01e6bde2f2b2795de5d45c9394305fed40d8f31bfedc7d40e09576050aa9c54deb0af2cdab3c3563cb6de8fa7e95f467a1a63aae2e2a0f38d4abe22f76e9af9c50def84c4a7a96120c018f496ddc138684bfd7d325661e6bc2aa418b32cfc45a827d25c419733c4ce5a3b8c497ec3f3cd783842ec7ba11fe549b23c179e7234bf0e5be166e55db548e1b16bcaa3588fcfa36209984db2799998ef8c2c5e974eedc4d85a4a39d632b830bff773618d325bc58f3aa186e921ffe08df7efdd0940d268c2745f9b26d2eee212c1d6ee9705288833eefe1d1f608e80e3ad9320a20017f94dce6c9fcc76ba127241fb54ce8a0965b585efe1dd053d4ff70cb8f2e48da08f24db47cf4c933fbc80069f7c3e891675e8fe01ef14dc4fd5e4ec1cb460b8d8753684baf23cc072b1c85983c00b82f2a9ed9ecd3901e4ff3934bc7b6e5b8ef79cb4323262d34671f2c2d91561899060120af50b346ff25a0653816918ce0ae1b88529e9959180f53598025a93c32f076a014f56af4fe379a6b98ae86db417982345f21d719de7193eb2484c1b3c9f8809518d33216a8b30146d081125bf5271fe864492e05bb2404583e35f7e7e1e13afacb2f76a6f8462821574938612e47867d3dd8afb5377afbd433d235a923c4b3dbde6881b9cda72fe08123edc9fafedf55072a6b738b201c532bf9c7b858fac9f6046040dbad5b01bb16f108a86673a94bb3eaa7e0a29aa6ee768faadca7b4dfaf5801d1968fe16f5e88d031c081c7760b582b9f48fe50ac19af6e13dc28ac2886768372909a708f6ac2894a1f28d376a426f2dc1a38fc96f8f3c4fa96da8580b99a79e9e0be48d5605f94bf7e7d2b386756d659e4b4f19a7f3a8568a743149d6a07900e36f55eb541a2b0d70eb62d0b610f68b95d57f6491c32fe268b196a7cb171a46391e90534f0f534b3abf2e4d4d3ca010d58c9fb53352cf9ba0fadde1defaa888db193b6bb0dc0905f1e297e9d09ac4dd8298a91f592dbfc4bde95451e9818a5e6e131c4fb14f98b9c78378d6f2a0ed8c0ce53e245c9ae9fdaf94377219b2be4c3e5be8311f573694ee97beee7db5a05fd5903de4802f63fc103810c8ea8c4ba69a39eb57c0c3d1acb540577a396dec342bdf5fd8a2faaaf085a24e4005d99a25719eb2cd1b7a5d33ac387aea1903734ae106871f67a0239f4d2800c39f35b8299364a526256acb57383ed50e68b6c79c102b8228d7a67f71743182058d7fc9ca55085892dfd0796b3126d47e1db885411b022c24630aeded9ef62eff16893812869bd0a4ae1078d17cf790e528c7b0bba3bad64e2dc0ff0b286972e439f610ca3f5476f12f1264f40ee05478662f2c8f49fc024070e80854d74c750e7c0b2786bf3c3154d184fb6b3de48d1df153cde41149c480e920588dfc9d792e52de917ddcf1fc159a8c4bcd3b1b8d0e190ed3c262a826bdddc3eed21f61c162dc7f20960de643a4f33853f5a1e0dc16d7b9b6ce8dd4728c99ef9e0e672dec38460e7d6f580f2ffec38efcca576e42f7dcd388ffb52372b910570644eb68a502ce9e86de1f333a68f1e40a8c495d2e9af0e301cfc286ee2b7981859b47af9f1c3c8a96407be5f459c2d709734385be7afb04a46d4ecde8b4ae2812d64e2614d6c63cc7375ff6c974fcf83d1e1c6bda5dbf4daa050af02e9e8e25ecbfdb32c5fdcead9f81ff7efeab9e7e35cea33610135629c3799be49e36b4d1db33dff464e14e0d3e1adcece50a8268986a202e1cb11ad1348ef2d00d9a9bad68004384cf6d9bc24b07f56bdda771e90e2c6722adb8cf40fde22c5c7efda7bbea4861a21de2f95b0e9d3ff00da322034c1355e57e7f0833d1520b1aeb900e37a9ada8a3fb2f2de8e0c2aca526c128123221529b1a9273bc34d07741024e68bd08aeef13a107a4560e9c33b49aba004cdc3f23809c93adcafa67db7e48fac874379ab04a6b95c0e2d6855d6fd9ffd7398781d13ac7355ef18f3d39cf35ed79ac91c8e86e10ec1ddd48ff3eb22e4276b2e09b8531ed4b60a8585fc95f0108af0a18021397644eae7f1c234fda439a48f208e86e8362135285f7a0602b81f373c0db04b03387c59f188728979a28f80a527755463257e229e12701e414b06ce63b00d0adcfc98e7611f2eec7d49846427e9c0840c672f5e1814a6b6d69db26f39791aca298a06d042ea4a1b471609ce2e0126118f00734cceb98344bfbaa8945458c559644ca9f62f4184278eb1fe0e3a2df73c0f021ed1c81277e411392692fecf473f5bd60a19e84ad4d9413fe35c808f60e84f3b1ac7b21071b0eecfec034557adf09948609dd90351f00f850dce221202ece4cc0677760231978d4f1b5519a45176991b34c45b2ebca4fdc164d7867e592b690f443ff0e0085f5c872c110f1a1debe433f90ae18b59d18d561a2744a5813a6a61a75bc81eebd894f2e8f124ad55de04aff91dac28e12c3e30a547ebf143e7c00796c67e6b47a93200d003af6fc2db066ba8e0284a0155d3d4e20e998cf3247ca4d612c181a7a521ba811f85c0326f27f39ecee17fc01aa0b6089716a42a33d85dbcda9cbafdc36aedae7395fa8b767f25867422e2ced9be077e982f0da3f009f1be8adfaa03ecb1d3ae248ffa21ab6fc6145931d18a75d6956184fdb229d4c0442f864e1ed9a8fe5400c8485d16f0183978e0e6974e804cc2efe7a69a417938db611d8ee6d7a665b88449ea27de5d3f9c87f337e3a809a541e2254ea0052418d5fe2add59320bb0913ac944fe2de53567af711ae78ac8e6601e9220a9f7f9cf8f2f5d797938f68e8aad44219de40b47a842f3f8a9b0db8d410a4a57edd66e927674029cb21d2a505cc3651521ec9f7afcca31b6a8f92c19f5ff38e469f118e93269208a5bb12712b930e4d45e87931b5681939caf46d8348737d24e28d11c6770f905dbbbf92ffb5fc48033ba72b8b54422708c9dd70f737c4b82da661dbc4c4b0401f2329b7de04bc0206f58bea699ff96cda02cd4c1d50343477ea039df2adee031726fbf262d4feceedbf85fafe42b1a9d0618be1c56a671faf3beade8ce4a1429e55d0e2a918663cd325d1d8ca3f8b75e3676bee259042433829a0674606333e53207d16699993ab0d6528b89e5d9c6814beb0f3182a7dd3fed8a3f74c1ff7da98726223add132b6d5819c9d1630e4286075f622d38b22fa0bfa8cb75d95c5658ad631f59b2b77c5b8ee6a2940ac0b45d525a43f10ba44a8793b8f7c875b3646930321518d2ea1194d31ef877fb213b981187a12b1796748e38ea502c4dae20bc1f6c6f373940c0ec72cda1681601cf09ee64997d21d943ded142ae2436cd7a2150de3f2617d3a948a8097723e33938f49c6a78f985d3f8fc9fb03ce5a25a761b33ae30fbb9bd81c1ef68c3c5c60ad44a5693fbda671201bc3345ca720543bde60c5daea432ab7a159639fd87e586bbd091bbd60f4a801b2735dc98182c9ded8890270ac164a72150e388857053046355a39a1494fde4a3aacad96dda93bf042d2762c39ed094cd19a7eff56f93138533a957a45c40e838c88ddff8dd653d61a8eeb0e24e81cb2277d700341b2c6e00d2f15412a49625a985048c565412120141e3fa2f9fa400e9c8df238422db06e67c830462838fdcb865c9628ce555af6e85acb1ac88bed97678aa70bca53c6e99fabe6914cb166c1ff0a1b5dd0987112636615146910ec929db9d75da72bf63f4a0660343784303096cf83a8e3f59440c7175c579e847a27f23e9e722d750a6421374af1f002211118a36b4bebea32464c78624b41d605b21c84e08e35f31304188f2cf61ec65978806cd356afb084627e2071565b7ada34ac63742fe638a7d52b867f42d954293439d1d84e7eb7aebf4415b62899afab8c75fcfa4df386acc99fb7a032dd1097325df8768049843cd21a1297259f0426e1d7b3911051e29f0e95e4f1e0caae61eb0478cf710da2f4218462adb7ac755374d078cda908ac25b9555ab217ab1096045d54b33eb966ae086817331171546cae8b2808fcfc066a86d2782c68bd45b51f234473668ddf3e6425154402e5c7e6b55f4482820e7e2f6e6102d39923afc1c0f0b816d8a350e62275ec827ed3e5df2800bf71c74b12f06bef0d2d743746689cc484bbd8959bd6b9c29c3ca2b21914eb796644e216da5e9aae3470f19a98b8c9d707f76e312f3ff1b38cf921486f8f1ae9f3131af4e49f54a9bbff9678104139fd86bab173807e1cb51f3e10f629c3f83bce8e10f2a30e9afe46faecdcffaf002cc3803c548cdf2d25f2c428b7e9468dd822c4e724dc54c275d0d4740fb927e2b26b1246a8b5fc7cc108c8eff357f57f080dcd8edde46cdc9fdd5176dc12df885762f5b6e1a4809a815f008c861da23864b88077d80762f31fd8c229d1b897697b7dc1d9c39dba42e142bb6f4c6f66eb4de49dea3833aa57244b6288125fa2691376e93ec0c8a7cf4cf9dfde7be8c89f4494d56282351053dc4c308392e84a2c73dc2e75d96636ba7b17d534df2a6767c81fbaeb354c508d2ffa9faf81146882e3ab47de12a3e03f9e36dea17a1aa0a864646746c794f79ef1f868cd4fef1778c251b393f8a46a031cf644c885cdcc840a64fa5e7cf06cdce03922c06fb60f378b3a3d2d13290b2c8b26aa1bf2fde79784a846e1869e370e7b3c5b5a5597b4a93d9d12db7216afbf94219924419b629f079edf2291e09d5e2bcafce3cd05b67d595864c67517c3decb648eb28e28d429e6034d53ccca4ca91418d321cb6d9f1c93b0cd8efafb83322f86f1d907536f533834cbf61f21929bb8c70d7172a603dbc92e1b1399beaef86405c76b2990584f3f62cd563f1b9a78f30c66799625b353658d3a2245f30792fa5036cc2247cf1279fca8352bef86a6f6e796569c3e6e258002f1a5456d4c17c4a4a51cdec0230612f5584ec2f331741aa82f7fd723c6992c90809c650dd01f248c5675a27a685162c72601c0da77c1c18add790a3e159d7ddbcd947bbbd8156154d009af984a0a15acf29bdff080879ec88bc402a01f650486a0522d184d2f3fbef84ae22e52821320c403f6771e7950012c24a3d5b853135053f567ec848f0b56d55bf531c9d50c50cf135d1f83b6642001f56aed04e4c1b03a5bbac5c4d74cf13e26cb544be6ce99f0f1fa83c9af9c51fe8800dfd085a1a1c131d237a2a93bc2d384e4816f61905ffd3ceb720ed536842996ff5b91fabe77c8993151b6fa1143e644ceca6d39fcaa3ed3c0114bc60fb7f34de4990b2c1e83f3b3e4fb68bec37a3b993177bbf7914ce5abea9cf8c63d128cec0e55740dc15a823353de033a188ba64f1cda66ea2b4b921b6cf0966090249df73cc6aebee309eea4009eba0158b878048334bd0ef0c967e8559c19ed947a2692047263f6a6446b31867fadd53d83170a157d67e8b07e1de1fa3aee95e0adb2b353de23a04edf4dd7493a7c78d74dc93feb39c35056503570accc568b8fb157fc7033dbc6845321c91d34620c8c24508046786773a902c4e4fc1c7900590396a08cd395c2bab42918da02dd93ba62625c243d6bdf2089c8decf56f1572821b54ce897734936a573dcb2953428cebfd813d733244dbb5f13993eb76d55466c36cd9de00685a4eb02df855d753f53da0441ac25d3444ae03527ab2dc14fff0dd7fe5667e25e163b000f59fa69c2a0013fb4f888f00b01828ba148b887ba5d24c8176a6f4d548f63de9e7c96e8ff35b13f85af725d7dc4bec9cb863ffdd1679d632bd2cf8ec9b3e775dc2f6d247ece1aa3406422bf5f20df614cf4bd8c4cb08d12852a2cfeef1459e8212b7eba3dffe3b2435c9589f8f688026e3e9b9452c67913a17c078d172ee46bd5a27c9116fbe7719803912562a53a2053a5ef5cc3e3b920c4c1d0bd3ed681ee1bd74862b111968f9a3a9150777015f05a021362d11e3dad7fa213d57aaf9a380205057c00c649b6a8b26077eda154cace8665c0a7712c4c8b20d3c07c647f16f6a97144184aa58fb3710d2b4ed241fa99eb828b60bb82da98cb71c9190f7fc58570ab3d8ff4d0cff9507dc8a208d8ccfd2cb4a0f4c33c3ebc0b1ca815193ba7e288df75af9e7005523dc20c6217cd887eee32311e612363f6b986374ba41ea3b53aeddba9c85cf366b3d0ae25358575bcaeeee3d8d9f03c00cbe826b0210553a43ff8b502e8d3e3636937e8bc2538789074be028be52d66b703f79831baf108f0b8a9c5890f4dde0fd26906ff043ad572626c58ee4c46d5b36c5e29512e8f4e19fadd9d2c2de8bb439d7f0ce74f0a69d495b770b826688e7194fabbb4d145008a0bd997db48afce432cf8b142a1818e3cd62a5456de8c8077bb7cd16715011df4211ee1eaec11fd51e01ceb5677f9671401735b7a95b614a5a28c9356bbc00e5e6046a36826e7e37d538e6dc9e07cccd93837d22c4c5411b6084248458e26daa001b26351fdc44b2696ce59ba1d42b4bfc226dcf57d1626ba8b2aa5e89775b7db9b332c85aeffac9cb0f91d7a9b9cabec50796c5a3a715c0fbf985530e5fd2921fb1f5f0e21be21f3232c6598abea8c220ca610ba8ff3c9381012673484f2d53f397ede0bc9723016eeb4abda3b6561566b50e8c591e1f50420d8bfffbc0827b3c3c9e3bb141dbd7e4693f4e6bcc3c11abd0536f47ff69792786875db10b3d0c4838a5710aa0eb3cedca31dd0e94356ee04abbbef1200f71a8687e0b1510009ab83d3bc6aec04271e0bcaa559ed01a08cb0ce358415ffad716203c4ff9aac437d09c0fbd46de31193515543801b5b19aa3b878efc430a8a58808f125d2c1e67a93c12674b3835e5e0f7269265687cdd324c10bb4b8b0529609628166f31bf8f70bc826b224a0adfc7f5d2748735566e4b2e2330b96ce386e5260c4ea8f64a3516acd543b812697ff88c273da1dc425da0e678267add9f3dcdb90094cd201a816f4cc844eec16e34e8504a9cc7ed8228683722ae560008a62e442a5d31945e1d9625766e4e2f0c752dd06ef07ed37cdb51d65aee4d63f5c18e1a01b98f88f20c5a51747749553764b21d0cecfc419d7f83551cfb19d39ea73b991d694b81bae8ffc0eb313d4185cefe9f31a13cf42f8b4d30036d0c9304ee6448ac1c53c7d369c83947e859c39e9988c814a18a049993b761493e5e4bdb4c8f7447bd2b8f51eb54bb57ca57938259cc7d6419c4b2c2c6be54d3fdc8fb38b084e11d2ec014aba4b7e2fd5c17958eaf67d7b36cf89064643d0060241f3e490b314f5c7981cc60ebdbeeb935ec94bd762f5ff787581b221db61dbbfc170eea0ed7434ea47c744182afb62669085c34fe83db0dd7cc070239dd42154c5b549ea49634bf45e21d228d8cc91b8151708963032be124bc1813ad317876456e1127f364c2f51ac7867e4deaf3b52ba6954ab7c881c83174652c662164daa8b086801c6a5be9ed6b0eda510ed38a86119e02c279536e3a4149a348180c62c1d8989eb3a9b5a1d9e76f8436194fb6a5c196e07cecb06d0978c5c478c4432ce7e0860c01c93d2a34b00f7e567be42c98b7ff8d7d2cf5f3b4679eba381f10d50b300f573f502d0aeaa1b93e88e577b928adb756494b931739a9bff7b8d6376e9721a0594753bb823f76d7404e281920d242184b66ecc11ebb2bc349a728bed7d911a403a2c7bc08b240c5aad9007304f86ad97e0551d2581f0c70102a45686317802b8b4c1c4da19edcf45d56f2c135988a85a2982b7b1716b5077041f9f94c52d529cd5e4b7177f06275b9cf8814d9334ae45e5266458649038ee9c3b213d4861a7b9913cf3ea6622fa92f9d461f4aa3ee046b8b7deaefde8d6029285740e12ba90f394045af21153061bb679a224f9023cce33f0769c3222007ea2fbd57231a2f007fd35fccb501aaebeb7e3dddc82c47f364eade88496b864df6ac7e3d7ccdd87e33bf694423f7c670b47abc0704e7419c019c9c08f5499a1fb94d8bafc0ae037f972d7b34df856a908b803ce3fccfc0a367ff871646d33f2e54f46fc5770871f2081eb5fc6b6f88aad427be33a9aebb5f3f2741ddd9b1cd2b84a2b930f1f793f42f448f54df94a3a26a79069f6759d9bc5af7ea63a7a4e204f0e9a537b26feff41b8ce402e9753e7642f550919579a09c51a3345e1f66a4a3483873124a0da065d59d23793e10b075d3bbcd6e8266b745e8b95092cb1d66240296edd13f9b930889e4a778af98ce05dbe17c5c4382775e83ab04513d26098344afd7889e8904d0040262f57e7524d492444d95a55764078e45f443d26684cb57d0b18183aa8e2c36036cd270ca819ac5a24b444daf9401d74cd6573e69e2da3d11f0b1d2d1d25fa24baea36dbe80c4c34ecf50ada13b15430ff5bb3c9c6c4c9e6687c23684aaefd74bca3bd5989b995f39726f20e91d5fa0aed88f19aad6efd7a4a31ca0715434a358f621075e58a785dd1e4281d8d3dea7196578b4a965c8dc85725717f5ec95a19ac940020de034188db86165bc4e185360f46cb7af065fb0c2d8c36b33f81a42a512ef4fe83e9a053d7de219f693afa34bd1630f9a334ebaef8b08a093ee84d17ee4f285d2fb8086381fee9fc68fa45c8a52b8ba13f3a2b561371f796d30824d5e085462147628f7fd4d86c7843827a0468bf27ee11f70e62886032f3bdf842623f72e07aab07beb030fe47992b8b65338d99f6dff9c8ec67df992398909b8ec309860ca647ad4fb8521b4b0be89ea8f555c9c4bb918c586b1e3ac911516872a8dc841f33bfe6bc980d725940dfe77bf23e47a1800bc278d54beb88ecf85a72842f02bf98b9c688b988589bb2fcf46f798d02debf51457e8995462f13f469d442f7338428739830f85c52e68c8dfae6f45bbbf9f40ce77639dff99c4fc3f93b9d33e36798f497e79c91d8be45d2bab5187850b6f3313095fc652332c675620a00f4c4087a0d43f142e110db4f3918fe671d9ebc5492e16f9ddad0086d20b15f7f32ea194703175d2ab4c4ad4effb00c78ad77009923065e9d42baca429b17d7b015178f35e05165cb697305f981c773df58f5221351b4b421b0776641f65d3e762e9eed144d7ba4c7e43c009f5f88c12e9a4d43e7cd6fabdd398d273688351a98824f70583d05ef83d2453afd7ef135d1c58e2517f2b08a47ca7705b574a65bf26fc08583101ce875828e08ee680e57c54e85fb212ef9290d713fd831bdafc122c73028f975cf3eb33d0966b97d14c1fb34d5f98ca09f9c15c7900fcd668901eba62222806c185408cd856c485ee44fd3836270ebc38393fe6e912e63c9f40975e845628d0baefc3a42be249605ee0279030751857e4dcab73eff8e0b30056f0cc4c7eeec1efe1861eaa1957c017514e7d792d0c5f314485ba9b90bca6bbb7d1b9f59cbb783e666fe438e7bebdd7142682960180d859e24d11d1a9e737644ee7cd0d8feb647c3a93e807dcae1163073928660bcca3bf6944fc608677596c06526019b92c0aea6d68c75d07f498c2a00e666ba24751c7383cc03062e13f9dbc45f079274f65683f03c06bd70f85703373eb0c70d3f0aad049cb29041efb77cc8ece411f0ec26cb1a680b937d71b01f617ac77dedefd8c4bcc67e19958ec41536802817a0c95924c3eb8908ac07a31532e23051349e115d09cf650a65aeb5ae78c6f528ed1ffcbb0a6962fe9f3584ed24b21345396b51f107dd23d6448ce6ae298a19be72dd941e293c5317e54c8cfcae0efbb09c7abbe2c856c47c93efe57a117f898f32d654114a1e724b99cae2ffa70ded8bb8e122d9d90726411a9148b901e8e4c97f890b1fcf2bc54694c631e4832ce850868cfc00c26b21e1552dfe69579cb99bd834a328f11690ed33a235b2f97c28e940c2ce8508b5c91ec12413d35196449b7db1f13e6b3c427fbac675e65e0bf28fd37f3783671761b61f60dd063d572507732b068e6cdfe303c42c45604c886a45b48c759bf45eefdf197f86c39a7dd05c661f11f06cec744842cf8a2d699e407efc9da301686c638fd72e9c0933289f8c2afb6f411efc9e7d46f92307fa413b975fd436a27afc06a080e624bd1f05e18d664935427a39478dcdcc817e6930583c08cba966110df6c0ffe8c3c6182f06f4cf33ea8e7859f61edfd34ddf2a6a677c3e99182ec9545bc1897884f98de443a7f4f6d0bec25cfe8dff9b92888b0c1bc722e15b2ad8d182d6111df67d214bbded72d2e792ed17374efe78e073a6edfe90f3f2b1e6767d6031dc85a76ddaed64a3bee95f760bcc4b353cd09c5cdc07e5dac7cb01f093582989def186dbeaeb40a8e5b2a28c70b099e0bcdcdf06b76f2103a89d73fe573bb654d6fae133cb6fa05eff14eb63f3bdec30d6e8506e4d5f8077f13f334c924b903ce9566c506eac922684468ef168e8099610f3a2376a84763061798d367c09c91b66c4f26bfc26f8c610aee7294b4ec5cd7860e573a6567b89001d27df9085ad167eb081ec39aecec4551e1ed11b939586db452160989336cde411b1619e38112c664c00b966dd0b6094c2806bf15d705bb5f6cc837ca6020064bf216f822a4229d4956ff4c468d13dcc8ba1450143e72277a6af5ab9ed9215eee565a36649bb8bde85e7851481c72ff1bf863f558ca73993d1a1a6e259226eb02143145e0ed45330c3aa360221f7f2c3dae8116f38072e43c60f71d3f4da453047b6e974abb481f2baca2379b1755a16c32574bc0ae6d4dbf071b1a2aebfbdb1c1f2d98bb4393817f5fa43985867cea8994096c861efa045a159ebfdfa27d4fd80790e4be291453b346a31b60c2f225bc3c1dc3ea7cd4e329baeb263b279737617f96bd75fecbadc8f19be53e2e24821314fbbdce27f080120398ed273735f8cd7fed7651a3d17d6f1f539a0a62fcd987922cbb208f58365eaf1aeae08273109d95974c53932323c3583e02ec3ad41499e29dd09c99b90ff8f070f5a7355b9f8ee033e55cc34ad054f334314824f165067501869a16d3b8aeeb30c836a4a176523db32ab089336255bfc6454a35d097fb00d54b458f15b47a7df7f23ff9d27bd37aaee035affd3d0eacab2d27b67a5d18135ff856ba9ef3f9fb65faf2e0f4bedbe23bc787238b42580f9dfd3f0db3cd2e195eb5084e41215df6f27dd258a6b66f37cd8812ddf81ff542589b7f3cefa097d1ef01edbefbb472a3c4aedff4703f1921d3a78e06b62432691830bb4fa2acdba25903222c731ea81efa9b841c5789c1aee74f85a091187dca30ba740187c301541b1de4e22063cc3797b5906571e3b1251489e15367a512d13647051200aa4b46a307cbe0b5d9635d2ba22d87b1f29ba679bb2dc3b51be0cf4a953dc184252ff008a5e2e0abda644c6df90667bff3ec0bbd619575ae1504700d18f37c32c5180bc18cb2de2fd881f5406148e83df03c22be1be1b4c170f9a7777a441f6d06cbdb54299cd1762fea8b3276674b0cd6cd61e3adfd39ce4a52098986c2d93360275768cc8d104f89505a4b1ae331ea2e84b9b641e920129583947e4bff9523956a81504b422aad27a3da551210da634005f21c26672d0ef2f1f28045d0f18bcc61f972b7c0942b5aea982060adb85029f02f3c12b28b6ec4ac4051b0c7ee08843aa12e779469e24ea6c4ca6926f9a4934e85828c5ced6900866193f9d1d5a3acaca0a3e5171422ea34b90cd3435783235c5b46e8a1d2793f10d3342c796719a5c976a9ab99a321c4ae1f669628e5449868deb6bd308ea9bdd67184cd0ae0fc845c0642beaf4ae995ad232aa15ddcade22036d7824c40c337a19f9334ce0ea2be7efcd6016af6222be48c2918bd559fd4c7511a4478b1eb4cb0eee48840a05f1c4fead265f6727dfe63898d30132c55ba54c989b0294424fe83a577497a4b1fca1ad0a4763a198f80abca1433f3c6dab3f6937c3fb70a5e3a0e712735473836bf95660d85fd357c40345cacd1c796e2821e03dcca508a4e4a4b5e5468d4e56cecbb10480f1b181e61f6ecd8ddb2a3cfade2da4679179b67476c148360e728fce6b60e3dce56cff7ffcd764f4bd9b652e04e3333ad8763650ba4c0d3ef23c627097c4cedb5fe93fcbd6564aeb27b881313637b2b609d20e91064e3d8fde9aec39b0995ace3f5946fa4968e000da43a4fc15441b278b543fae468cb8e81a85e0501d4e186722a1cc1759806ce524a8d60a71c247b76e4590018b6c49cc7eba90319ef0dbb8aaae14631dd80f06efb8ef8a1ab3e6283a3c5109e152a47c955fd12a6d203010b4e1ad1fbe8bf2286e14e3c5a64e1f1aa67678805681f6913e2afc4f6b20a616ee9390d79d87bbceb60595ae3bd9f57be92f9abbe47a18843de3bdcd7df63280e7d8061b51cfc7a23648d2b9dd3b3014cfce5fb5bb70f2e6d7a395de0a6a87b594c823c332a99dd00b5b3898d43e017601c19615722c0f8ecf9ee7db181f78fe240cd8271ad6b02c5c48b848b86fe625373ae2bbbecaa6eb0dec53ef5f2f1c69a7d17b8989cda3637fec969c6e126eaadd4411348e1f44680d8e9abee0d2a2c2db09ce4ea7a8b563787824e6da06df7c38de3de02500d2f5643b310e8ebbf7f3bc0f4cee33f048635a09a568d624e94fb2f983d9ff6c161dace32f2da1da44a63d297b1fd5570b09d6d5d102dbf4c2d1ccc0c3c3f0227633809a130e4b6190970c00f6dc0080621bebfa096fc753665f09810155952916967f4a42968d009400a8de387009ae61230bf09865cda762dc0a09ad0c503cc7f593737ac33add9af5d70fd7c166a0c3b0c95a5af6ef17d349abc196025bdecef249e086e1f6c06633b6f3bd9f3ef4a65ce498fac2c76a33b87b0ff9e2579ddabb7710e17685c418cf2005b755ef0e75b9a31a923b8ed722cf03b7484cb9bd9dd4d77e4080218ebaf224bcaa04314a8279fd354a1ead24d44cf886acfb6876f2961010e2ba6b585307df369ddc4e5b403a594edad8565700fdfd96a9bed2006ff4492d6a73fe97ab5707eac69d5d58622200c73b5e502f28db2b2c1b30a1c777f3f08e401bfce3171f15f89daaff6cfff2fefda6ff681432198003c56922686fccf9cee66316a8efa0d7dea58541e404cbf8229c63e2c845c135d484a641a5b00c403f42b28c70caa59905dc7f3a7826e88a851d077d8e502e85ea6523b699a875c2d6803702372d839b96137ca142be72ddfd61c7c17841305350b59ec5d136be695fd7f39c27abe05cde8e6edeccb91dae4d37b07926bf3fd049f34c6f68da6bee76c5569060d73f3aee5893dfe4025dfd499871825d8616621cb3c3a3fe6289941fa2783fbcf127350fecabd39eeeea9f5a751a5e4d8569cce7f8c720a722b23758e34c642d99d1c19880ffcc11e9f1bab94665557eb6fd5c13f7199bd8111c7a16a9e8e3ddc8f47e9365dc44bbc423c7d04c63462ead73bc8070cffd4638767f7e7133ce08f0e3e705ce710b9045b8c3728e73cc5bea3db94558db5fb4b09c0b8edb01a435079a25ed5cf6643cabdb566bc3003e413ee74eb9f2463baeaf47ea739bf4ac15ffc74c5d76327f9c177f0d67d84cbcb027473481efd4c6d058bd4b852669a2a28ba27a4c1f99ead11a2749c0706c61b82f48d0653864985fc48a0058dc5a47b521792795a199755d4af17d24faa9682b30d379c8f300fb567fbeeae3207a45e3c17c404d89d25df37fc1f3a7f6a4f531e2a43ed6972e686a86dc09d5b58e734097f339751401c28531daeeec26d0e7a1fc29f01d0b644d3eb75450cf64e5ad13b914bc1b9333255e496114869833db619412fa2d32fd6453a4690b2683a9c9e541895d4c5b3951a0cf36befb5c400f84dbbefa9a46efc716bb3f9c63e0418e28dea15052de5dd6bbd87fa6204d7a019fd5f913365bed47711374721aa30d145f5d47c55a4f62265c8111ea2d6f35230336cba2f0b2db41302d5c379f7fe63171894860c6b50fe4316f4206c35094a5e230250b0fe9532addf9f7e8dba62bf996dbc152ee60fc241fb98165672e723d1fad13e0f3d9e1391b11231980f36ff72fc530421a85dcf44f263653de288200ff2f842d0a2c80b5e8a4cc52add027061d00541176d79260628802fc0f64712b4352a3ed94c4868ea4f90a99ded04a47ba2674455a7a6dd5c3a6800ca1fc2ea97058cf7aa9b7b5ff26c233c235136b5db74203575d81c81fa084c90c832846a0a7fc13ffc426012fe7aa2a56a7b95275acb17c8fdff55c57fdb24b135159368d1e3386a427ddb00c523110cc328347bbe0275eb6d03949586955bde7a2d9d48bc5637ad23760469403458d61c737fc35f4fa0ec8686960949b9903dbb457ae7f5fa69806d31141874a24bde759dee36652dd444f6183f3adfb12de10c7fad6cd1fb39a6afd9e09e2a14ffc2eeef80e146a8174fd5edb4a52717c0c32cb25268b7f0c56b8c72cf482ebc5628d63a9a1d177d55fb1bd422dbdeb39743fc4159096f6476199378dfb28476b73f48638706c9708121de46149f9a30cf5eb41984d0d9c110ef3b3108bbcb6c2fa167085594ce182b3d5ede1ad367e7619f3d398e55664ab8f1a7b49efbd4d2d10efe14bc88bc6c40761143d77dafb22b6dd83b6c3b24ea9a2d057c046298bc1a64f9a9676b1a5b7662e64fec9d0fc03601a0a81de43e6b1d566001e0b63ecf419d0f78c862d001e3935c4634b2b91081239113f04b94fb2b0f28057ef64b41e66f6aef94f02d808b434c53f57306e0f3d0ac839bd2bb926da58979e57a2ab04c69b43b1eab0046d1914a7618d79a18cf52d5a35dc7874d8f33e2ea175850ff1e35942e16bc69d11a5259ab3d6b68f577404118121300347aa61e2e5219c2053a7d0d483ef947d5fde169ff1c44b13251663cbcef695f0bf6a5c042be554ca8c69b8c06d0b3cf5fe862d7ec80af00c0702389f4eda0ab606ffed604cf7f1f02d2792290be02af616949f315cdb271d1f652688f320dab800c7fda952e385be0cbf25e48b0a639136ab80287b88dd77be3ac54006c788482b9535da22cec367a25c39fe1e3e302e596cb49b0a8c9395ced01fd53eb61dee84c354b027b6d6f262fff7eb9f57368fcc44d970134580941b07c0636a1274de2fbab904a3756cc02e88f397cdbac861e12881ab1e69f91e3cc0cdf18bac1f0db6c59d06e819cfbe0c2446dd03b5954bbe23d967c443a2eaab131c0d779539eef464e45ffef000ac713a596b3fe83a36b9381f6dd308fef690870b4f153c4555ec6f3fc3d5e4d610d9e5a5dcc6b670609965f3be9af719b0833a83111a02892a7561245fc00ceaa62bde751444dd871824566f21cda608722adacbb2c6eca40906362c86b91d843a40fd326e02ad859d280c62dd41bd314fae5778420bcd740b17125a3a3b033f522e438c0edee517b72ea7ee7e130fb95ebcb73896274610e4823edb5ca5a1a138ffe87d25d273b67c0b0d5a33680c32613267cb28fc4be97bd21dda23f01852e42658b81180a9fa9af14d9ccf69407f2f05c31186c6ea93e09f0f568c11bfe2a0e81d2bb1cbdb4145aa701374348ac05fb6171793e36bf92acc9a829651b0e04ca3e3dfb762838140c00d018dfade9ca09ce10308a4f956d4bffe0b1e849c46eaf0ac11a3b5335eb0c3701e70059760414905e75dc17e72e5a80c8f198caafafc9070f0915eede9a6e76d4f0b20f651ca25e15350bfec8171343039014b582a8a9b71ed70f424c55c89b6f42456096ed713784940cf5d84c60bacf2266d1c56a0ad13eba92df7c2c4266492c3dcf57f78cc13b4adddd927f92bf9575fb4e059508df0a8d72f70416b99724f54e3636edb5185daa4c1a5dfec2a187fba480803c6383b8aab044626624425dd95c74db9bfff113c18f405b544237765c915fd7c9b3f041f6cdfd410dadfd1ee44486f1030cfdb60bf5aaadfe3d11d6a989a585dfdb98afd9d4efadede5f944bb2e9d2061788b1481700dff080906100f7c4d9eb8301b0da9aa4b719c83c086d7643be7149a46a534eef801642713c060c72207e02d83b693902208d326574eecf9a3e02352049b3cb2e0c3127b4039ad860e5f236c0305a252162fe8781e8d119ac64e769514f8dd7ec1bc12e0080c3fd34e128028b0fb30a531988595784323bfd4effc890cb2763bb3be26c976dd7ba1a1fbf2e722804d8acd0aa388de0d2cca325d15914878950bc17c435a97458630626d9778e3f6ab9ea1a30ff39c686a7f406cce422896929ce6f54f6e0b2aa845bf8a837748db57514cf1cd8053e7e5eefeffb883fd494ab8435938ebcd6f6dd3eaf5e9bbc8f5f09133dbbf0a605d3e7335c4d51c08e78ce9e4bd74f8f79dac1beb466ad5ed03b44e1f0b41412203f5c2b581d51affb00f0d77c5c08d90373f632d5ab5d3672ed685293c383bdf0b9851b41c38575c981d740697564b9bb7db4287a3e2bae70589589c126a0974539440310690c2533139080e0467f96f0118a3642c2f1cf8e58a5bfdc08e6c3d9c7527a152e365710ab6a05ab17e3ad2585d448d245c99b336926619fe1f01fa9a4bef4fa3990578284940424f360dec0d20cc22d42e9abf9a7620bfa9219cd629a9bb8b23c4492e6ca96f76a934339b945901a40b3c5ab0879b2db980d6703447af63899cdb84443d202826f9e513c7a2235cd49be5a9c843f86f02393c0f1f51a42c8df08c065ec3e0e77087160d54d9d2c05d6b386d934261c08c0850477acdbd6a58495cd1037488aab38583d39873426dc312cf9948d88969a12e8b51bfd06234ae024bae132ee2666694da33a7dff55a57e4e7bc56773847696267d45615ae843d9ed7f41e89e6de90a0ba9cc166ebac68e67d1b970b64cd204cad53a4649416f2693e32dca5ced0862094ced9cd07a2cddfa26f91f3ff242e6f290040501e88b818ac88c06489b387e603824d8d0d9065c1d7f7bf98f87c5fb62c8a10237aec55ac65eac597580744bf8fd1cee1be3186fb8ae65f52f3f16900f6dcfe09da6932aea103d6ad60d2ccfb944d35072a41c9f4f583c861e23543362e60b64cfabbbbccb3826337e8979c7d781b08c039f503da815c66f3312b81e573695a41971978e9cc57f50c78f81f327ae3386ce339369eddf677998f701f0cbc30612773044c4018a55984bd2075a6d794a45bb77929e090d909e707a641d280e666debb1e26e127a9521416b44685f356c7aa15e8903ff77a05a7c6b11904ce4e2c34a285dd761489e3b41561b9d8f5a80043ac7adb71320eebe019c8edc415cb1f52b8e6e02eac95b8e23e7060ffca6b6e3646e8bb7771ab48d987f18672eda2c9824c6e49625412ab7aa90316f6c783e0e905e5408713f5b20f8ccb95d0117a94cf0fabfb6f2ce95fcc54ce5d897e4593024cd6db1923a648dccf01bf2b73d95b46fe529c93509e658fd6e41a7bfa8d2f364e8119c950d39f3aef1de0c08c630d5ec0ab92144a3e7ba015041669a051aaf094793853569c4282d83c67217e89046ed0376e7dc900d39b4f705ae166073b08e3afcf095a308ae827db008af2265649ce6e96d6d18a3ef702ac060929a7e461c40673a18fb88284929ea9cbc4dbd39e1128a4d71d791b0fa65b6a2349fe4cd71184bd24adef0bfdba13733df10acc5a2b94b8a28d0e06c70bafd9c44340e857dd2bcb77a81e1e20f88d4ed522c25c90f118e4eb371c61c683c6a634558d872074c983408001f327ce24e141f7cf9a489468892297e85861a9a148b158952d466571a3d4d97264b39bc5f6b30bab4f10762fd47820f28da313339f094ef8d87efc12e0f1cb7ab206a218ac23ca5743d0d0092cc50de70f0187a3a41a9f1e535f40932aebb9ac5749d78d0aeed211cfb61a4e8cbed09f22fdc65e28b91e1c03f8e770e47f956ea7ae96db69e4e7fbbea681466fbb8e0a123a2951f81c2deb455dd81edfd2a282a86f920be16686f5856c91784e0853f56d0db2f040efdc3f97f3e51280f1ae14bd5d3e8af58fe2fded15fda51057cbb2813e4a3241c15ff449723a2eaae001937e1f74ed0fa5919f92e5cadd607b125b75558d6f52115e72b1b532b19658764605bcb616dce8da0c751290e168855468efd4263f53fbc60d967d663dbdc13eabc7d17e3c54b1d829edd0dd19451ceb37570e0e547e9c8eab1f5203af4a98240d574774954461c5f6260bed0c9aa908693c6e121bb2a08fdbeaad04f090ef6a1dd8b6e1921092bed370f88b2cba760bd7683f9ef8cf982adfff1630df48c70c2799e33dfef6fde5d9a21ba57aa42ce3e31f15482c1165df1fe2e2019d8d1a03e3488ca0c14718aa8fbdf313d77e27966cf378fb18d6ae30b0456a928df00826c011a760f1639787c5148dd859cd1eb9385c7d24e21b29a9b3960757f613b4ed57afdc75cd1fcfee21526879797793c263e5b6df7d1d17cf8c67e4818bde56add7366ceb95e4f647a83b105ff176dc3d7ab69c3953072dbecf749cc1484f02aee68514af98e0775bf6a53c3d26d6d63b596331866ef578e380362a7f6f77fa5f19c0cc832563fc86fc7fa3a5d5b3a4df9e2eff05e21eb41f6748a8dc4216313a3e8ca704afc7629a49a0a777dc3404815b78f864b23ceb0ee6adb19c1b493041bd3387214a158c604f10a8524285b1c224273b3baf4e2c5d0c8ab60e9391a8551ebe861d67cabdca479dcd951ef46fa97c3e7f3fa7b9ee4acff948771b4ef8bc548062bdb6e1c3e1bf9145af22ecbeb6fb35a81705c3ad4246c023d994855eeda8be51c7fbe3dc1263f3ce8a906aab32f430c1661e676b22f93285652d4e4d9b11a0c71b508eedd020dfa166cc1fca8661b5c4a4e6c3f6dee357d4771f2e14244b383d4d43c48c2c49cb17852b40e0f4661ffc319a0e0164d0c1fcff64918c9bfc1ca4b3b7b6e41807f7fe3ee5272c55b0ac676b5a72d9259a2c2a7fe003b1f75f0f328e9b540d4eaa03857ba4f8f96a9b05d40f8caebdfa1b6b90341d2e9fcf9e8f50a4cffb582db530144258ad672308b2bd5aef9fff946c38563fc06676330137504191595970c535ad27fcb99d6d2095b43e7d272d3b4051c28e667b6859788baeee79125dc8af2e98a08d325c6df6be592166f6cf60ccd937930559a1a5f38bb5795590f1aaf8e315df4e06190603e05fce832d2863234689764abec91b9ff1840875d4dfe7c7fca304e639d820df38264a64286005c3a7a0a8eed7722db57a5c2135d514d5b200e85585b3a56892ae7b49bdbd8af283561e28c32043726ffd644760fb87959e4b4e866119300fc072977461bea403db503c8c93b3ca98a22189dad9ba197169b43de34776983e1e5b66e8f800a4743e85bdbce3ba46e84dd764eadd632ccbc9b4636010d09206e93e877da4210de9d406e129fac9ad8f6ab9cf2a5fc2d3c521496e496d82d0168a99682b45007df3732e17d73adffbfda04ee8b43e5eabfabdb5dc106fb405fd06b6c50d3898d751c98899498a1216c6e2d3a7955bc558716eaacce87964f7efc00785d3f54b7491c977f47e3fb80fd2f94ad5d1f15d6e7d53e2b97c2f63ca4a6cc236c07c20d6c381f4fbd4e74da929b863c58c83b8ca77befd727b4ebcb561ea511f3e495f622ebdaf36daa65c9a43824996afc77d46dcb87ccf8ae4642ce9fc780858e9aa62e8d27a655954da64d12ea6b935b6cfbb4c4c480ae69a4402382538beaebed0d6dde6585bd1ddd4a8755a283128b4b2a823b128705e10318d05a5a53b0d2a8f8adc208de129d7418758a90477cc9133ea9183a047b1bd680c689ec6ad6eba6aed1028c5911fbdd0aacedc58f8d65f17f78c85da85bf1b00a20072958cbdf066730aecb7c3fcd8f2820280767395bf8a88220d9bcfbd5ac4e48607f9709c7a8d2c8aa01709f72d92d3476050dc1c01e48c68bdd12e35d30f445517bbba319cafcdec7bc6faa1c486fabd8a31fd1f0d279c14d1eea936a8c1eae30117d07dd8a1274caf841fa48e4dc6b1aa40e0c4e4706380c64dedbde9330a7190f5e48adc3df61cd83caedadd13cbd040591f6eb158d6eec453e5abd1c0bd64116cbac56cb865e1ab2ec48fdf329c295eb29adaa2bf3e4210598ab41273b3ffbbcebb108d229b7c6b1bcd7e10ec6697511c3a519e1f5f0751231254a8a1c8dbb4d5ea6952aada584e1ef83fe76ab737c5d3f33d018ef29bcc29aaa2d9f86a94f3608510576e7fc331ec6d9163931eaee14e26665f25433de21673f81c5cc57a952a664a278cbb736416189025ae60c761431ea4539375a104d2022f81180bd8efe109c3c8b82dd7ec521913b375a139c609ad96560cad43a01a228763ddc1c1f368dc94537f2d8e305d5db2636769dad01857a70c6992e4e06e075185e19d90e100c967a014ee51a55718c859536a95fb89eb909b0cce0f8faaf14852de6b3408e88e2dd59c49ba7f804b7b121d13288b535e1fc8f7dee0e609ade8565077c42c32df3b83160febd12eff44405607c647fbac70a9e81e686061631391430d0ac83ae27953d10988b5d4c45261040af13529cf6e1c2632512179a7f3bf860c8e32183ff297a307c660533a1fed1d2313b7ec8e5581f6962bb08aaa4d88cd157b5b2c6fd459e7b91066e66b37e369aaa06d5b6938524e9228b30b4fbe5b33b10aff3119a4d27d6c9ca203147e818ac04aab26d20ba979a363532c0435b4e22ee32ef2efae27b22edceb370e5a30d678f1a605d44e935085904fbb3b9f62f6238e531fe5016da5fce77dbcb2dc5d60eec0b75c93ea9e7344f409b69a43e34adb7207578e089b1e83b83f346b3b8f7755b683ad0ecd4f32febbc7fdd1f2daf0fbaada1be30d281bbb3f69f8087871d9b34bf68e2af03aac151ae3c1bb44cfeb50c8c0bbc10a7a1fc0188cf57ded7619f12c8a71dff043c1c1831406504c94146000dfec3cd01c3f8c353770fe89abd69210bed06bef645468dac2e82e98f0cf3d854219900db365eeca16b4e32757592ad8bd6b11d9b3a3820ce80957206830080ff4299ede8f325e1cef515806e8d3bf87908c7b38376f60449768ccce62bfa089ef52a86b856e3b3202244026ddb2a130a2c6649df04ed03f688957f7c23494e88d318fe1c7336a13180c1b65101ff2162d37f4a651a844e293fb9058db192e7f5c02d5bfe4cfa253b789f8f69b2a5ad031b9e1b7355d535b027b47f77f322f58d4c8904cb84eea59bbb6bd563c1e0ed7f70afe934add49ffa3f39994c0f69970726fe62bd1a16de4baee59c74eb223471191a2fca7acb7a0fcf21950c15515a67e91d8e04a3ea555c841645a4c2de21a4f793c62a176d55c2ee3e77f8906c23269aa39e7125515accd3197e5d93e32b9c64b504baacdefe40ab4412f5b44229653072448d90d546053d0102cc32731f07b417aebde4232379288a6fbc100095fbfd71a4042d7adf32d6d98f29b610d301ff9ba7baa91ef9a5cb613005e211cf2574ab7202300de64537e2557c9751ed3b65e4ddcc2f5bccc376095107fc55c304db59ce381a8b2de19fc1ab54117291080f605c538c0cada4a1801f12691f3c55bd02e326933509670ed53222c88b2eab397949804488429b9a783f6054d34f96db06ec354336c1724a17bd39c89e310dd1883f592812bd62005ad737a639903edd5b5d2ba38282bfd5d9a1dc14d1199e09fcc37eb991d83b47a4021520fe48d5dfd8c2eb2fd6bb0eff0247f814b8f482f8d50312d3041d64a966113b1d4fbff10a3be7579c7d23384e843bad5d452fef3022256f706aa36d4a6ca1b264feb5b6f56376a733368ad18f1cbd63c49268900d23b42c5694c17eeb6e3eae45ce6eb3c5f0ccf1bf9f2ea7a366fca61e91c998f3cf450a0b746015d3a4fe4d55b488f2bb38c3168a548300bc0e58e7491b027ca2627c058e1d8cb5dacb7b56e9bf8a0251c2550412ec17d86bbb93b56c07afd8db77fcd2e8d2cf4219839842415b99efef811aa0e75be7013fae42f607d341029052574d315f84d853b95ae4e24cb8478567989c99cc25a3f7f98159e4c861afe6ab11ae1362cc9ee6918e4cc0d87926556ed675ff183becca3f691cd3603980d336934c6e09b437fb0f32c47a3a16f28198839b598413ae3094faf2e38660cb00f15bb9ac29c1d2d3995d2f89d4e151a942518e166adad10fddfb6159a2843441a2f76100b33147d98a62850be611620044dc9c19d31f6d09f2f81882a093aa87a146b3356835df19d9d631f597ec01b52f4306c75e37793937ea1dc54d0538cfab89eb24bc3c69ca1ac3a9b0f82b910303826fa4523eb060d67e628417cbd751defccc333184152694a265e189c08c0d5a370d193ff361ccd4bcaee20810a89c7a38eba6b24c8ece48c22bd7ddea86f08701f7572af8a933e44d4033e164af06b68a5fb2e153cbc159598ea3bac67683ca29c4f5dccdc02e9a1bc832355fcb7e85617fa9814aacdf994e6576014dc0597ae9c1c78f8b0f60652dc17b39b0656d289c191c61d8ef365daf2a0e8226ed57b36a54073773f047805e4cad4c51057b7272b3c967ccf84310b77c9eb31710d6b42e1354c55b7de5eea3f7d7f97e9c381aef4f1896f88f787ffffb992353e5f88ff36e5d96bf5ba737e809c4bdfb183c88184198f2afa7b5f8dba4d4058b028036e35d6be8f549de00733963d653f0d96b37235b6089f97767ccf82f86d0790b4e2a1e1dd23db7ea7b1773c6c911d79a824e63b65059b806e1967a7dde880dfffcaf6b8c43e83e10b6bd65a607cf0666c179ba3d0e9ca27bc6fa0c45a0f4905c93a7e3b45fea0d4c062fe7cae0ae8acbdfd8da13f1dc559d43a84553c3ab68de997b6f06f20cb1ef30a32e3c25085b4ee2c9334d95ae45095f8fd017e0ef7a4a80192a5967eb6456fa5a11fbb490028be9cfab90bb312a9e51f4116730f1f715bd354e1455b19206d4a58a4e85829e5f56174e0f086a3e1f4128625cc7fa94d510092a8fdf7e95d00357375793464c100681b2c3a0d2ef8120082c2ae32aaa1d3c600083862eea48a5f98128a9c23041d5631717f15f3139053e663435ad80705a0828507524d5534ae2ed1e191f0e9a4c5ade8baba3bd4ba1aba4ce52e3c7830c8cef5374686f3b231431ce14e38f98241768a9cbede864e5096b258ad39eee971d900be5e23e7bc1a80164a318fd3fe29da3d217bf61f76dc47ccc86e672aeee88957ac360f1cb79111faa5d6fdec4a2e86cf5bf80f35384bb040d3e8147b7367c5ffa5d8de5a986232730dc70cb5d41356d9a6e5d56c1ca7df9e28a1d7bc8231cb9fbcb504e8a46c32baabe8463011e70c5452690833a7559468cab549668069074aa6438eb44b07f8dbaf5346c4ca4126239641eb74bf116f44664ee6f6c00d7ffae82412e8d5a4c8bbd4c81fddb9ed837abdac9ec8107bc66eb008d808dcec46f022a1339b8f6f6b346bc8bea91f36bb744956c8d2123f5367610365f4f9d061873f5944b47406e8820b325dd638973b30471450e03c3279156fcd1685c0f33a072677514d1096867717cee2f4d5d92f786e455285cf53b60b1808e0d21664013180e0cec97fb08aed8f88a41570e04ff8c89dbd62566742cb4605a7317b99c21ada6db72927a1299c3f4a4f470177c07ddb5bae4f301cd7c58fb0ad8de38f5e11b845ef3c7b2b034e12b83334abd174b94157e969f3086cb30f4083ab4318d530a063cd395b8a57941918a604f389b83d291647a171229d6ccc0b3205269f4d153b787afec31a36735d30fcf4a8b10482084e450aa717c204b890f138cdef849eb2ada92c5d1d3b70c967e54b430d588037d4ffd53f2b398c2599eeefebfab4a391cda2c557a7cdcc2ad52191fbe1173c4ffa2d9b482d6131884ff6b1f0cccd92fc9f2b4b21675a10a590a9f3920ec2c3a313f87d5bbe2f45e00a0d5dff9f23e76bda3a49d97cc0ef388455348261bc65c8645f1cacb773cb4a0a2b627ee406ca219654dcb77760772bcb2bc384b254b62589815563df52624ac8c672946cb16e95b15fea4b00874858e3475b56f8c2c7ceb38f401737ce851208060a524a5b414cf9093e911bc447bd564d2c4c674a4f345999567f7a4093dc0b07782425bfb5d025103335910636582ae74cc5f9f1b870f7584105cb2926b63ffcc96a0ffe9d50e1da6465c7fae087839bbb4188cf87e8c7d040365fd7dfa0aba98b46a2fd5a4487b3757e8ae3bae9d8ff53209eb9b6e815a4073f42acc263b04d106296104e15de77af67e641509c6ed136cf3a162b1e6f34c355409b74de38bc995a6eec0c0d25f85d040952dce0774e80599326d8a6724eeb7314dae9505a2ab13ba89ce76905cfc386fddc4b2b49330d6771a668dfcbfba20010dce22adbae4cd9864bfc0e5bca8e7141b7935c1dbacffb68481c6e14c3d0d7f0141769cc661ea726dd501040a778ef5b7122ce9b9d892a4160b13a39a6692c9fa9c573e2ce8f954d5176ed0bc58641e4bcae5b42a35487bfca418c56aaf42b617ecfe15b5f8a493610dc76ec74ed16ffde8d0d26fa972036752d61e8960d5cfdc3ca89c9b22a58b368f986eba7d4a0df357898c2d5d9e9a380bd53f8a4828df011c106954790d2e660a30941cd76feae3c0e5da7ff7fc1e538d860d509c19d8a6f7d8ceb2bac12b13eefe1212d433a04cddd38e71381154967e6f30398ea0e59fe6c447cf06837102fc405bf82ae87700b9798b401f80a49a3460fed47d78fb3c8e9c20e6f6d41253d92a1c1945f8d45518bbf80b63d66b354672228b4b0d9ec6cff9a204d0f7433c25f3ab431b599d75c2c7f3aeca84ec2749c80819d45b47e48a9fb03956401f8e14af45e121f2ae65d6f39c335dac837b685f80efa6ae282779779fc32df549ed243ff413e9eef6320b5defc28c4a20db89f2c77989402e3181e2b215f39a3dcfebaee16879f199207482cc61cb3910c7c40568c94bbaf6ac5118e561b0a7c3b015c49ffcdea878a7eb75593baa9135643076e4799e4c0beeac139bcd6ffab44a7d7ac6a1b58230d8816986b136942a2042fb68de5ce6980101552626a343e2d7c1fbc54c4da291d338e6e4b8aa96a5e96b64186c14f9a0a2fe95c9e9f130800c468f2449fea54beffa29c1639b8d0cfb57e346343efd5a15a4dac39d3637521faa05ec176915d5e48a85ea632436e4b4babc9d978705e76c716f270679194978b09c826fd29de79f7a7e104f11030d1d60295a0916688ab4b8547b23709ddd468cc38ea516dfbccf8a359f76e1dd04ac94bc597c12d833cfb0ebb5ec74b553f9d684db3e66561eb1d5860c31c602f206ccd2a10ac60f4c98b41b7da3ee91a68cd1f9d8ad7596bd4a4ccc44a54d69167a0a30a3a4ecfef0de9a7137e8d4723926ac26b98b8906e95473fd3973f8857af054c9976e106a25a8a54ee197c892c5e209817bd8c6b192736e4a941309b331ede61db297ac951070a888ccbfd395d78da4c98adb00960af2e4570e8b49d41ab8d3e3434c07ce50e6078d72369e82b19b7a69373f6d5590ee21231e0ab4910332d436fd125513dec4f1ed77922e8e8b1b35483627943ace90ebc760738c04223b53733524a2270b7b0441f3825f4effc211f45567f4473845519efd6bf91f34a9f367ee39cd741555147a75baf6614cff7a234a87b30203f277f673af6e187065c74d817b2e137d9c5ad6d304912a09021478c8e601c6ea401acac2bb024403437d16d495c0972ef191ebdbb06b13cc5907d0549c17e216d0f3854252970a1bb56e089c03815cee97aa5a93c19c970d52edf25d06e4f5536785a5097da7cf768534a5b753bf535b884e3e3008fc384506cde1d430f55ea9f9ad844ca246996b2f9c959a6548fcb14376f2af86d5a356f9323948ca51c1ca5fe02f3018ad2b791b17b2b4bdd0e480ce6b11a9c92cd26fa7f2e66bf3a392f37896fc6d39bb52b01a6ec5d4259c97eb1a2bb69233ac0db8addfe0df077d54582dc1ed503dbf967249384cea332133124e1eb9f5443ed9498cdc8b2b739e39cf9b6be75e60f72be8da20825a81c304362f1e6f00ba06da22c1ce1df952a353663a2b9f67c7160cec3e4b226f029b2fe84e0d966bec06340754b081790a86cc01e3fa29cf7c8a93e9aa691a8c90695539beeb704cae100bd80d97b5f0b8314d52f62ff85298c2c126f2e60aa5954ac43e8664fb7737274f7c94f3c41c0fd8c1c6066a846e11fde01d78adcc2badfcb3e5e6e5ab31709317dee71ac03a6dfb982351abb4085f5b655369e0fae48e40613c43b761b62774163e9cab7bd52799104fc53298bbdca518156f1e0c8a50172d5a11228d5d98d474069afc09a9088e79e0c973006335faa069490062435e5ccfaf1f34ac491da2a4e0cc1f23392ff89eb2f8c2df2a9f89f8476220086ca93d742a592140270c35323e132d24d048e063758917bc69a31d7e5ebdacbee73f42f00b2fb676e69ddc0f7b9644fb22d51a9f407aa8f73b77a42c27405819d094fdb7403e21b3be60406e806278f3db20398b55a09cab381e7d12c6a811648dde6008d0c924d0ec375e293a7f89a3390ab1658d3c0d934aa3b8a7b023536035a2c931dff0f8fa2ffc2506e8a50170fa62041c51b70f1c6bb328a10d7dc481b6ef7cd41438f43d75ab3121635edadf02a97c2989ef72d4195918f6fdd67126b81ca695199483f7f5589d26e50fa05c17e05c6aa458d32fb09ef596d74601e54dc8de4ced1a9550c54fa2fc8f60d40985d33d4ef1867b17d9b376b85781e4376a0ae390355d2f0cd82801bf9d1cfb5a084876bd21c2fefa2a7baafbe7371e2fdce223255d2469bc96b3fafe286bf7cb06d0d9ffa863b8e4a6131fc09667fd99a8ddf0f0638c36e566da7db750d96f6dc8cbe8af81cc427498df010c284d486c5e15c88df3b589caa86e30a252b5564136ab724c4b23b65bd42a104d991b7c1a22d1f6542d98364bd281f779640f399a1ade7e18f9709bf842bfcba6022c10f8aac90798a1ac9c9ec72351a7e15c1244708c7b57afcc46f50b0a04ea7ed0279dbfb85142fa0ae5b3d401d2fc01def6860e0d39dd629ce2d0b1db2533b14ae2f7187c7c024703a8a5cf4e36dbcbd18cf75f2800b281acf58b2325464faa3a935060d483b330270b8453a076804e69d6b77f9044e41ccc94a43a2001e6c0b7998996c0e2c441045683d9343fe368bb9c17dbde3cc56311f840ed2a71132b20f52cf1170c6b8825f7b386ed888a9005c6c947496843dd29733e8236dfee3001c882adf1c577fb2ef49ed739c24db0714f23438d74e972c649d1671ba8b7338197443db4b18ad588e0b46fb8c882587a3fee461d320b3594b06142ed40576fb549d8621c2db68aca86b4aba49c016d39df6a6cc9f6ddb5f7f1b299093443253321be9adb014e71abf96722a7e8d0d922a62b455297c2b78abe680a14f90ffc88977f663e73f4df83d73f4a12c908a4e19cd04b648ee6e61f1434f9023cb35de2e0488acf1cbc1e15c52f00ab9a9ac280d4bb037ea564037bff94681a9fe5114ed66de22cc04b868984386e3248312988f733e189996d071de53ac4fd983530f9b8ee00f00ce3df4b379216a5f0ef64df66d840d747986256f8bc915d9da3486815adb66f8f9f15e0dfa506f2df507996ae142fdbd3fa3908794c7203f1fedb0d9331d646f1049c7a79cbd32e65f7fa55d133440acc6d3675da56692d8dee1d894b36ea9f7de6a63918554695d6c4e8d12992653c36bd2b03e10a483d3a39cc28ae503e2c799264aaa026e978d9c1591cd471a2e4fb058a419727e76269ddc73557bafc80040a2c9164e61be9af1206f6ae831c87e60e1787102297a066153db94adc8d03b09d824b9eec878634b09d26feb3a083b9d30a74cde331d3974f1932083f65e44233d7c15048bb91b1548e389b087d62f50e86565f2c9cddf4819ce24e37365b1030f4c0a21e8bb3d8d24054e465e7a40fce56860f9c3dbc30cea383ceadabfabbb0d1e764a673605803266aa5f3d11408a7ba9c82d083a6c06175f9a9e5118a299a9cd1c6d96bb5a95473768e0de2a8071d5ecd2019004c358cbb031cc730f9daa1884fe140e011eef0e2e6d33075c0902f3c0da514a695311b0b3b227a3091bec2b5c4cf5b9c7af1b77a6ccdfcfe41409fc1467608149c6044e45c3547d1ead0e2e7ba9cd80ca0401225b45e6a0bf4686e6fde104cde7a315c2cbf8b5e59dea0c27109aab6ece456fc60886b9b17214a1b108316683940b1b4415e12d011c646fdb3f9a01cbd0eca1acd08230e3e3d9ee2f43a49ff96523b2ce98b1da7d2794d75be6616ca69c1ce12e0f0195367c0537be3af06e5cf814cba278c7b97db5716c602a5fa3650227fc40e9bf543335fe33534efa13536f0fde8236b3b09e813bcc732a518c7ccfeafb0b4ba06dacdebaa7349053c9b8b229f23660c54564eb14cd013791fa94a403c67c26fddf0f0bbbb1116961fae39a275505086e43735e2016eea894964dcef06ced73fdb009f79b7c3703d3ae7c1e6d72340b032b07c492deed5a2ee9b76ba6fc240006bd2b9f6e9c13ac07d955df3137b5b01e1c5cc17491134abab5097ea3de0726539c835f1d86dca5afbef3b16ed4313ea44031ceed69368962a50922daffbb8da4562801ae695c61220c5f183dffe1f589cf50d0167a6491dfb039456bf6280bffabbdb472d0b8be2c4555d9c99d0e080df68b55bd59fa6f63c4368e132a0ece5785dbb2a40bc63234c9532b3cef67aa2b2976faa867be200407213f24252cda132533fd46ad3ad1c08d4b2b15a13616aa8a611848105afbc9c46f07f33d6dbdbceb99053b4dac569dae4796ffea19c17c81595a2bb04cc6f8ff01c8d9d25f806505eb9a3695b85c70a9fc38989128244f9512b05e16890a09d3752e923e62eacb1b5aa42b5bd127609f36323cf51416255ae0351244b0c3e68545868cfc3045caf0172ed827071a5bc63966228aa52ee94a1be243a6f1786b8d970c3c4fbba62977dac226f86178159f49705c340042c35c04029fb18da5056586016fe91f593c56227cc8fc2992b6766c591d920828d794ee7142b66f7d24320f44b4ac3b963d53239857b59c051736895591e1be58eb1ec41bf830e07f94c0c0c36df5ec0ed592f66e3b24981441705b8ecfc783b62e9ff73a312e4bee32fdd4681adc32b85472d3aaf0971a60e58582f4ce494b8260c6c376b6ad89ef9352d4ccd424d0b612974d0d312e41b6d088b8c35a1a14486e2c4acb3d149aa8e73a8ea954909e1a52ea6fe1aeffbf100eb1e62c85cc27a4a2c7deba2039e1815764ec17586ec668542179c58254fa675417fc49bd48893a1a9028f61c6ee2899a95097e8cd24d91016b43002c0e630bcbb12a7c5240b32ace439afc6ba1a80a819d9b8767a8cbbf7af494a81ebbc05c1437828165fd0a178226423d57666bd6dcf163048a613ec76c1e0444662e0a9f6f31ad29d075a0e868613c5db73fd0208afa64467e8908899d2ef067d3d0ed57550b64b0049da1bca285922a1dddbb0dfb4271680f349d62d33140d2914b37f17156618e1c470abb149be3cd5b830aabadecedd10841f810bebd6ae0c4674ecdf6bdfa06da6a303d273da63417c1099cef36081ab6659959b32834c02cb34d384611c5af819da8783e1a5613710a490f189af34b9693a880cf0cb1ef1171ece54bec4d6de9464c9e3aa8ea2fbcd1fc02b1a867e880c283d816d381b37b51c322f56915cc2559b7f392f3fd5c1553e4c68e77e1f6a83c23dc6d4a2ce2019d035725a2974bbb37124269b95fbd027b998e0b9401e285b0d1686a994eb77633f618536bfacc940d55c3a377c77c1a20a2c79603d054f99088d997f0696a55defa37bacfc037e69e6f8a62eda1d86858833b5820706d32664e61f5cec1f2db30c7faf45ff3614e3ea6363700098c54c719f84035676a18d49cd81a07257b76a539891df14e068b57e670f32d20b13cc5485fa646135f7df2a4bae5869a48f89ac8d1695982e12bd9f3a382ce75bb38909fd98a998894e64b931bdd3fffcb80773de772a0c7e68ddb8e0ec4a9d593414e1cc4a434f1a0a95e5641d5714b94d326c4127000fc391c76d009af8387e8fd252c1d356bebf096f3b32c7ae2d77afcdeacb68d44bf9cce455fa7bc8b1212f50a165320efeb47fd40ed638decd30fc598e77e8dee9eff590287fd8f0c8b6ed4405ae05b052f96692546c41335d850887f1cb8a59b969b5a304b112fa3d17fc4c9dbb528ca31f6418b240a34612af31f32ce29ea23d3246e913308024f0a86c1b0b3bdf9e2b14eb59b2286b03cf1b01ad89b5af2ba9be1199f49d24ce2a029f22dd6a4a928af97d0260a7757295b3b46ac000af4362a0092a62d795216604036f331282ccb922ff3e422aa562e3154c4debb020acbf275b9f1a38c55bbbaf3d829e824a2a102c16949b60d23c1ba213d1d1a40d14ae1e2c25cc19a0a1006fb1254fa3e38ed7618e6638ee325c2dc0f638fd94e7ae43f5551072f6ad635a66d4ef596ba1188b37c117b1dbe2d8af17a35e4d96a77a21538e473a3dc8da30976a6e5066d8b34db921c934696ac379541bf428394b553a0a637363ffe5b9716aaaa10fffb10d2ba5eec13dabdadb4abe8c958dbc15907153197668446b79d06e325c213946e8922b2649dc51a4ebf85eef7b8b8dfe8a38270403827129ec18d2b18dd0299a3c17e1947e36356e207e46f534238b185e0f10745b2d293b02656b96d962a326291f6074d7911ac124a5fe7d142f3c64bf1fa78fd1cd7f11ada52b03f5133aba5be87208f2981e45642f68dfbb388af1068b305847b937272c0a94a10c0fed03f41c2071ce041c21ee0bbeca8edd7a25a7bf20782b7375fafd1ce3be6718a9bcd82ad12a3ebab6a24e4ee2b7f81bb81a6f9555a61efafbd4c8ab5bd5cdc5f7b2e12674c3aa51719a3d53e4ac2d1ff08fd82e6c3ff666150009179a2524fc4efe5269496348cb2880714734f18d23560f2e5883fb894c3f612c0671360d6f5d36a22c631690265641424e7e3d1b78b917c2f3c0ebef75a73d7df40a1740d71b617153c8222a7940103744151bac641910a2b791c519be0b9c4b59f57d978cde25524213e68a1fad7cf7bb150d08fc5b6a3e6c381bd65c14c72cf5508880f1f32f92cb449064303748bd99436a43a1e61312572c85f2127a378312521e7eac1cdc4d5d586e701301bf697ba53f2454dc2706a10fed4f3472b19c66bcffffd1aa5906320c4d75e04cdffeaddada4574d7ca55af3c897e7921a579d58c11400bf23adce37d7b5275f085809815bbfe76d028832de7efd9665d67fabfbac2da2d47b997891a64847e35892b8cdff3b908fa03fd56bf178c2366f1fa1a3289d664ad065853621c39f5a2e8ce0f360dc8bd857954ef86e4617bfd9b03e7e322f6e981a9ad0165e16ac828acca93fd5f0921b7e70365e049298587db6561ac9700744bfb9aacbe991a54105aeb73ceac485d4b4eb402f6119fac27d95aeadbf8b3900aa6cad18d94cc1fbb8660778c9967164457981dfc010dfd1d92d0ab6faa817d1ff794df1d1affa546a972159f9f7fe4942af44d0fbb1f1e2d883ec8fc57ee401e240df8f5480647037e7837c3673c15fbb92a39189beb0e53aa147d3565cab75af5d3dc18bfe45d79d0de61187a90f671d0da20d2fb00199e67b5638586287d68c37eabdd4c6601f8722072812c3002cbbc01975f33bb1b9a879b547e6fe0ff6dd104c28936fb32ccfc1f26034eed2e01b80d81c8abb7881ddcd7074c64a066e72d039080ff1fd714dd4e04d7114caa4fa72e2bfc7fc9b69edb4e7ebc2a8fca81327e963b92418b667ead97782c10283ec9496503e8c11c5302801723c60f5a406ee586d4f2614c9fe4bfd9a5cb0cf7f67fef71010b9f7e18fa113e4ed614a28f080f875717ab2be1290669d87a7a0c782100a1dad9069466425c2c791ebda8ef09771cc264bca3c22eeb99ac6650bdf652cae8d343d3ff142c48471bb370e11b47c88b4c241c27240602c7a36d0217f4a237198bbdf971f4431929dc3a40f7b81976c1f1eaf402501204123e486f23fdd7fdd0ed009c16ae9da36ae0f12f23e19d743b9a963429f20fd84ac771a6c0dd476df209993f5ccb5888cafb296c09a5264e84c09f32f6890636cd9775eca825c7fab0596a6145ed753f662ea8440e01b53989827e2263906d2ec31a18278f696d6cea0a37263de197d282a0f8183e267cc5f68395a002f1c5b977d8dc98b1fa11819790cabc51eb712d980f898265860ac504e5895584635d37605c903497705fb7e840e19f51da9fba9c979e8688564622989adf1ea2f5e1c24a4f108d27a1d0c16e2dfbef3487016a06afafe19ee2206c8e6ffed1258e5d50034139390ae73425aec2cd457e82fcd9250f56c2ae9e19d26c6e2c50619861365dac9e6c00d9a776c83979c851e5c6bd8533f52705aa397264bd02d99638bc57d9185871634358c5db58529735a78169f1398c425479e85849903bb1bb6ed4484bcc75d5095947b8492fd8b53372a21335a43cda790006acb59df2de06926e44590f549b5a5cffadd8e96680304914346ace3d71c59fd76752b5722246c0b4bf42f4a34c55167eb9c12dbb0b5b354a6cf1e33b10eee4cacb862e2fd84ae5c18eee43e840c6b8e7a48c3e2b77c7d5bb437a5b15a838da044ce01edb37d409aeddf8945d779807a5efd96f8dae7b3ab122459d43d041cf8b64bee09576bec35f9c09926bf997cd5e55c422bd6cbbef7d888311cf2b6e4a0cf172f36748d0449848cc90d11c3a6c35ff7ac61bd7ba2d2ff6ecfe1b6a348afa9b0427ef196a503e84558f8947b9fc2d95196a2a6baa00a59f044738bbb2a2e1791e2f9862137b7276bfe36be68d96de1fd079aee5e2457e5e7cdca0f80599f13ab23a4efcbcc52beb2db5c04bcd6ea30b6b00cb2e62d0ddb3a1e839f3adefaa9555bc9ac0168e050f28a52f64cc1145d9e5f013abea1c0a918af97d654ed0e9bbfe00f90c9fec4d0de3ee9d74ea037e92a45d9f354e771bd3f3e09222c314dc23b89b4780bae617159751359366eea79adb6f8a770bc77370ab0284dbd53f86ffdc49877702c8391075a826408a3712ffb8f46b39d97a0e4bc3f0409301ecdc3189c28c48d24531b107c6b4cebd3ce5955df7a13ecf83aa1b7a506ebf0b5cdbc1dd8716a530f4556dbae16c6ea6bf631b90f9f1482ee03fc29ed18b280bfa6cc3a3466367766d2d598631e8b048a4cf664994b73befb1a2e4cda827288daddde68617001becdadd2ffcbeae6f603bf47ca9d017d1ebedfbd595f76395f1c95efc849b9073ae8b669c385b42ef9848d3cf7af202fa410545252c7555738312e81a89102cf4c109e267f48c59c53899e635c52d6bbcb2cb8ae95a02d031f4db00d4dd0fccfe770a2512e238851ac61f23cdffa0221983e912ac9186b0b469fa0ec6b7bf4823f2942de158009d2db78141389ff424f1f697e0ad555757d4ba87b688f0ad112c77e8a1533e6967e5b8492990fbb0d8b1810e3e25fc726ddf3bcdba455152a5669b824fef0df050a37a716d6528f96a52a5880496cb5d54af41eaa2c3ced12092375b94cb9c18d6ac2a103ac42fb79a0f1ea36ec0abb361a81f206cb210ab96ded7f1c379857d83f3e61864c26f9b441112b91ef0a602d7cf0a8764aae93eef642f4f6354e9a3319d3db13248b90c37d8596539f0fe03956b8e39ec11e40ee8f7926c110a26c0ce315d2c53b15b5351a18b427a4e089da37f32da6a1d60d18ba463dbd17a63380c0b28918cf537490849b745d01469bb3bfd3d7ed31a7deb1a607b23d44b6804beab67d46b1bb19beafc124ab91fcef570943764de62b8de48cc1450e82bc881dd6aad05e7ad5a0440261d3ba6c6813d2489b1c1a3d744be78ed07e01e7fbc167123127cf5df007eb85f1f1d8b1cf405834d3a6c47f23df068f0b6982a3b3cb0cd087b2fe695804e44af25eb53125c0749cb38404df3e0e8c96b70311865eea5190c7d6d08e3c4914e07d83bb8a300df7eab3a3fb1b7e89220e79e99a26997fb82431a1b98a9d5a8ed6b0cf57585c46f3ef732b072022319cf096cd5a5fb66e845fe4d6b6bd673dbf5949fbe5430bed11ec40ee5bbc4c4f23791b26507e869b87240f4153540a1d1e2c8462310ee8bb72215844a2eb4275f6e6d0a3e21a5033d1886e593a2b85bd1ec559a0615bc73c6ee4fcb1a552bca86bbdc077bddb1363957745a0043b72670be7fd753367b6f9d030ee01d5cb3d1e5c8763c7679254eda22e6242aff184216d45237728fae096f20bcc704e5475778f2d15bd707f5e61e423c7314ba4edf1946baacca1eba0b7676d5ef260c7707fae2668af70947d46c0127d53af3a61de03a9686b053648a35c90efbaf49915fd103dd6da04f5dbdfa1906c40f11f0b1a787613cf313c569ecf4831b8b21880c11e87a493e2dbb6694ad4eaf9833134733307c702d664f12fa73904aecc79ae5ea43f99262cd2c3230205181b97f00ddd42da6609f8fb30570031f203975502e5abcbfc852fb735bf6f3ec587c899eb4d8969c99be53943908c5743f31d16cedf7ebfcfae3c596765e202796e3ab5b9e107cff0f8d9d6fdf312eb2f7ab079572973f3cb8a6beedcd0ffe71cf2e459f2a163ec6d6f110cdcc88879d27970bc757fe292b071f4526015b5d674acd317de6391e909a399e05b5f19cfeb450f48deb88691484722b481691ca05fdf78ce96bde9ce97b3c9d8d5208bd1caf33f651f071d7ffb139f7ace7ae5b1b26d3ad5d73e0bf597560a739f05766eb2a132e1fd0df08b11c15ec5cfa1b9fac69a725d049a08652060756fb22ce53c7f44d9f67e767ac3caeb80534f48ba9ad7ff878e1edb6d67d06f7afd60e8fa2ff657845be159cb8dd355c5efe40b6d384c39bf57696fc3fb770fbe037c0657cfb04b10369c86b4732bf6767ca2f0b504bae189b97bbe367ef3a3f55f3a763bde7b5d6b44ee88b17a69141eed3edf590acfdf996bf391dc0f1e1dd4b9e8c96a7f666f32193cc43dedf00759ca9a09c31964b78dd57ae22c1e9c38bb75a7a607e22ea6f4498f255fa9ab3389ac71f4ca8fd7ddc2c4d7c17b751070579b4e46477eec41190df3ffdfad9c28ffb7e6ebcadbd25e6cfc301d79cbb377f6f90251ad78a650f3ae2ebbfa65ece2b398785257bf0bd4cc3fb46220b9c3c92b89f7c3b20d9fe9288d43db095d6eaa3bca24fe4a3e69fbf1ed572e7c99b7cfb56513cf64971b9e3ada6d5cbe27c61506e61fe6abd6d4fbe5f715edd17d6f880bf1a9dbf14b5929df4ea0823526ee5e862ddc56a1b0af2284376928fa09c00b99cbe60fe7977cf01be26eec983f4699087e727387caf6f38d3f992ca7903568788d3c6afea90f172ee1435e73ce679505952b8e1f397fe9da9d353f1900dc6ccb904c000c07e00d20004c695dc60833f00660036038b03336cdb3cca1fb9e99803802507d2343c75c7b5b11eaa06f2155b4f7ce79c46d41315fcee8a2b040100a71b8f8546eda0a8bc05c844cf8ada62e475d39263ad2b5bf7fb682270a55dffa80db349b21343d412b926a9df76e277d24e06055fd462efa997e29101f4d55fc1d87ecdd00e643f094399cc39b3eec1c42b60a3fb9fb18742de9e204595dbf50a1b5cc98bc89199b66b66f42c0fa8e5e3f484ffbf4c68662674978c8a90e29913a8b83e7ef5f0ab237d15e7cce0a9d47d7906992e9fc8b60c974cf8182e84361791f9bd0d96652e5cd5080a46f6123278e4fe1560f311172e6a1a315481d2c3d0364d8ae46a6c2ced239145ff2700d43bfd5b1f323baeabeab4efd53b648ea132a739a4068be81717ee2f1fb9b09e8d2d00d934187d0f262432bf86517e7090ba5771d2b49b29dc8a3efc54869105658c2a838ccd6a6cd9a8b5f02c74d0ba12caf57d9fb03c6cc80ba9232a9db9cd5dcec96bc6a0ec00743b7c27b365e0751986f35961b13ac4a19e88b777135d3c6d1f77f64df657929e56c2010a1f39ae0dd7bdf2465ace4e6c8ddb6063d192d7efe7a3fa20148fe99403e866dfcccc2be08bf5b65f21273aab6c2048a42d5fc140946401608cf857d5a36b6ef41b6a49c4b17cebff64d14677d85f797e834b33601340e92f50392338cc640b808cb1d59641c29078863519208350267889b4686c7e8992ceb463ba8592cb2e6d68f45bc6d5e3a7213dea8c6253f6193d30317d410c6f69a146bbff8cc9f9a7a1ad209da756aae2c0cb44e3e899020dfdfceef5cb5a6f7521dc653717dcfefbaf0f758e0aed7e0f191f06ff9b59bd40d67f7519bcfb811700c508731494275b1f385ba922e28d6ca5e6aa0df0fe35627672b2eb48fa0f8dfb26716eb2eb22c9ff6f9dfcf9ae405c056db86b7c032b372967ed61e6a0ff12c8f745e4308a1ca1413973a97310eeb7f1731e1fd16154cba9c89d29b2839116b524340d89982580d3c7e7b8e67b9ce75a55f51d252714a26f733446d93a9e8bbdf0345854722f9bc25653d73adb1ecc1a86f1e003bad622d02a5a1b334008f88f24577f9a1576e86dd9ddf0b78bc1ab4776e0813aee2917cfc7e6f825912253bff29fd9f703ee67cf21c71c6a10e46d826c8e556fc2f42ea0aa8ee69333a389b65cfa7828f510110e199f4bb18caac1f6f69eeb34e907c9dda05b5c74f6a3ff779820157a596262380b9589cfec547ee47eb94a41f3c1d899829e1509b0f6d93c7c177a080b26850bafb19fdcedf2727608322a612d15ff60974be0c31bbf953fbef8ec6bf53af29dd17673a35d4053639a47446a43e33a7ab444093cf67c2e2cbe15eccf17df6fc2d8d80c707cd09997fbcfb16cd69fa6ada10702b866a8e15540bd36ee2e302e44ce07bb0b6f3271bbcfa51db178dfc2b73327ff39db71355c0b757c387eaf7d783b3c7060bdb1abcfc59e9b728ae1246e12602ee1de79100d9b853a91165b32f99fe21a630895a30ec6e699081d625356e70039fc0f79b3c4258193936971a5265d84a725a2d2e1084b0462a2a3335f37b4a9f84436f7156e963b520a7c6bb4be58e4eaceb83c27b16c8123bdd35f23bd40e343ef0e33ef20896ad667819c82e330b48b97024694927226fddb9a3d05dc1372a3570d58c0c67df65da05349afac05fdd563c84a6d7eeb5ad242832768677b3851d0ee8219d8f76f1164312638e1a0784921e661307be5ac66053aaf852de4fae3c10f3c94a7c678cdd7afa9570cf7820f16a22dac341a6442327236bb983c381fd4f6846512e8dfb72862c0d87ce7fce4b1ba421cbc1b091fbfb15df8430b987200dff129d09a48d5a0feac8e869e0deb2415681119257c8bee33cdbc0e16dcbc254b43fa07e699283d9af1e22da6629f9f83435217f5e54da15cd69630ca3a38f4c45b0c3766895348ab820a379a92b92c035fa7abe76e880108f43b1a719ee946e88add2e2b376902c431a9cd1a9145c0c959aade7b44e542ce1cce94a08dbf303ec031e1081352f81d61204e261f3a4cb19138343420721d0d5d733bbc094c6bb30e1af34dfde80e138ebcf36bc7f7497e1fc8fa11320b50b08504b18625194d289f084c04e5f5d6307835919ccd015a00a36c46e02308a0cc6d064c5d14f949e220007f84a90cea729715a95d6395818011369b4e7d35e5f2ce079bff66cece5f39ec71f49ba9b1c900574bda9065217a2a5649b499f2291cb4f204ca997bbe51107049d406701c6764c8f903914857bccc6356431a2ee3c6e9c3745bbc2a8474d58f4d916d42f56e1b293329d1e0ea64a37e80d727adb00aacc2efbd29b92929346a35682556378910cad421e2b76a9301f00cbf0c1c0b365715043465028131e7bc809ccc096403845d248a8e0a15659e2a94163af322bb2775503ce6d5759b2cdbe03fbbf4f9a67273a5e84723ee8146a35e7eeef4cb26a5cdbc4a1e73ee31fc53643e18f322c7ef808f5dbffcf627a7d4905ccc392ff244f2f83ad6d5f71271ccab5ae2c9124f5cddfbd4124696e0710263daeaa4c59ca721b61aa7cc395d4a9faac62ca635ea88221d734ed157e29339e755894de69c228b0f68a2e322999e4c975d994e734edf4d3a735ea2090be998f302c31f4c111c4dde14132e11eaf033c69cdd035dc6d007dc27d3e6968f08563f441a008606f460ceaedb2617227b946900aa01492e9eaef33fa34e059601fe80d89c17cf68f2a6d20e4b395c3edcdfaa7c8870817dfbc2f0e9a0fa6cf071d557f939bc142f856780b7aa2e03293a92798d65697d2057d77d5d177d370467f952e9e3037adffac697217c76f80511c12024488a23398a2328a2bed3e63124e9c1ee3fb8497e3a6d13d721cabcba0f4f28b2ef12d4a93c12783ae5e8f508da52e6bcac3094b164761473764c5c9674bd86c9ac3a3ae6056e9e0ecafc60d56931af2673569dce9c1d4bc7634e4e0d5213df390670435e44d0121960050386a8984481490a9820c1840825a0a084119448554a045982c612212c69322fcf97ca5da2c2f17bdb97ca720c3fd9a1c0965417378b95f24ea691bb10b979f150ffa57770c6ba5a3c50138f3aed90f440a30702cbed4d7b9721ca04fed4189e58947841c9174a9828b1b9ba2751e3d77596f74051498f298e55125392186326f124099d6d8475a1462049e49064ca9c4966302fae87e3298625a68b60910a0900a4d103450f4f0f0d159232b852f426725b63c9d275a435485048265226ddc0f3041e322a1e283c63c513c3b34307347adbb22ccbe24c28df592f57d7c2d2e2238264f92d162b2666f48ddf74715e1c71b89d9e302c608c6a01400bf01640830e11e6bc3a4b1cad174f9efe58962f9db5490f6e4b66248ee0d58923f83da9d391a89bd14546e7081d19727a9083831c26728cc8b101070a57f71b892b06e6f2df879443c404eed084da483944ac31c88be0118edb64d9c4e33481f372248e39aff203d964798941d511284c9674479ea88ef45c24d248132a2355cc7995e058a6c45458a246ae2bb9172b233e1811159941115f6487392f4ffa92b8f94791aa23a0ccebff9b303ca234ab2360688ef8e126ca044b51e6c68b39634c3cc96834c23419674cbcc98d655386cd07e69c3649d8888ce8c19c57d78d467b5b463831e74c6256460461c4e59900bf274f3550ca9a2c6a74660d4b0d8f393729f3ea37d607ab0dca9cb3da4edbde783001fe387c8944a4c99cd7478923088adb64994692880d0d1d73ce6b2c4f3be80bb14e150d142237150d052e6e93fb54cd40602663c0ac64d6a86482647218e283215c5cfe13b9212264c6f290585d901777aa212d454cb95caa22bc282200316188014215e3c5ec5431341011848a882688c0a98898214234afcdfaf1e322c78fefef7d8d90ffe38710cbeaac97abf3a55208911b19ebc78fab5b305ec070303bcccbb2866863082dae6d7de31e4201a31f54a391556942d0c84aab95060318e4d2620149f952397e22e8c387156e713491be7cf111c7d0e2dff2a6cd5d4edb647def952ee506fde974da411f8a4a13a10990a5cc39af4f7e223716866174df585b8959e59e8db8bc4b398e99072e634e199cc59c1397f0104c8e5616473646f6800b860cdc9acad631e7d575610976a351677da05582df8631e72cc7f06f722463b81d6665ed9cb34699b3aa4f64eaa9aa2cbdef8aba31e7d57d2a002c0a3605066241844841489439a72744884b0ad70aae29aa6ba6ba8090a37a4941f5529ad30ac2933e3338968b08baa02a9705b8a80861861031102248885008ac12a2873782cc204819049b73de5cddf3b1c60ac2fa2edd07bb8e1cadabe5012d392d37b00c81c5094b372f7104bf10f559960802b14005c457400c00a486208450055182209808225741ec00441b406c01845701f1a302420057d9c4f7f8f0319616c8a4eb966c1008890b1984950a4befe3a35ae92b3e7ec051fd68e3c7067e24f9817d7cc10715e69c44cccac717958f287cc8f810652c5f2a7df8a0d1b9fc777df00723aa1f74a87e208045466559c0cab10450f930870f5df8e0553e902a1f7a18a1872a7a2852f540d3c3e4410c1e9c543cf4f050ed8046b5c306aa1db81d7850401d735ea9ce7ab95eacb1042feb02fff6c1ebb4531ff4a58b04bbb891b0ae1f720c1a4b17d0c5aa71499535b8582e3138968b0d8c4ecc0e111b981918ee7b7688d890be6fffc9f1e37eb9399a1f13d36f6060b8efe1c25d8a2313203996627c1f6982bc587a9e981a5a625a58c80e7237bc1c4772f77040e3e997a237c5d8c090634caa04636c60ca13e9c7f0cf3915302b04e8ea00d501a0cc7905fd31887480ae3a0036e7b480e4a8d0718da5a06f0d51a94899731660562a5af4bec94ac5664e95192a2915165585aaacabfb5d17370e49a87018a37719990a0707e09064ce692afdefc6529001a250198007950132d0fb6907f18c46a4de77278e06f8510027540578c12e9bf8b1d4b97697f23f289e51fc3e55002227b02a808f1e65b4b0543db4a87ac8cc396566d5e36f9f62b1aced238240db879ed5c2428031087022408f398710c75fdd10655ebffbdfb8ab1b6e78e2877e43e90616abba81c79c1d01b31ac094590de0493580276635803a2729cc898989b981114090ca863154368451d950031b7c65030e550d745435c4e0c8b678ac4bdca46b142d72b47c6a5b624503131a0450f138028f1ff0202b1e46785433bc3143946a061154331c51cdb043007e500500075500ca2a005615001b2a0070010023a800005600c8a112d5e1c5d10af262d77d3a9d8e65f9122459723acba56b39d2e90479d1ea70ba2338961096ce119f2d6e131753bf0422faff7972f394287331e996581cf419439f2d762fd68f0bfc2e5d8784733dec1e3c89969f39812520406625ea2a114e2522221a4025c30f2a194a50c91002196ce697f38304f94db64947872527c8757da38b4bb543573b4255680b55888b2ac4a40add2ab4a39a7354538b6a0ea9668603873138190326062768400c9f18aa3088814318c26f5f5a3aaad3b1585d08fe176bc65a2f9de5d2b51cb146dd67b17eb55e48547747a36fe4c64f8e46dd068168ac4b2c953e425c42803bc87fa5120cf2a82f8ea0b7ff188e2e1d0c130043123000f105297c61065f70f2859a2fece08538bc00032f945ec85e084017c8e80207ba107601892ecc504713ea78328fccd0aaf389d8c9d9d96c4837dbc8d3ee835db58888a954e7c5b28ef8efa554fa74335d6da19610d64c4b572d188be55f3b621d357514a00e0070010a1750c005087041667633442c21ac96aee588e523823a5d77a4d3b184b08ebcfcb83a2e805b2863ceb90530aebf852c906ca1b4059b39e7b5851ede0b3917e4452da831e71773643422058da21666e042164490059e2cf490851bb090032c5081858b051faeaef49f237dd8e27f76391a75d637b258578b98d359dfc8627596f7529ee595fe2e9d462011fcf99bf4f37719738532ae00655e21c99ce4e8f9d25fa18715c0985790173d69fdfc5d5a418bd9ada0e34d2068851ce6dc273ae89857ff70a003ca9c2fe228d261c59c31deb4717efe26d1c132451caa40842a3c6161d255c149158ea882352f265db7c4a2421da694388a325430c29c73f69898d18883deb4c130dc341de4764c0c09c68727140986fb9e2944998293398a3253d0b9ba7ed34d019b73f629dc8013c34f27991b29dc48c146618e28d8200a5a44c18b420d2e2e5df737215b912296d55ddbc5627545364b08ab084b4ef7b9981a642c9718cb45a3361763b968144c0739d2fb53e89f10c7139e709a73ce27e85cddfb584fc8618a9439e509f7534e53660a3665ce399d10c5094f4c712ce9c8380173c217fadf8428be89c769c2936d6a829326d8ccab0939e030c79429ce01c61c4d38aa8b232fe7d03304e7e821c71439c090838b39a71ca7392797430e1ef3eae4f87d9bc4843098509a970bf853211398c03299c063ced9b3043afe2e2d21ca9c313161b869941086129c5082cb9c938341a5154716e29032afae857e72fb90260e1b38b4000719703001879024bcf10d016e97ee497f838421200108091a1210f0860fdea8e20dec461c6e7ce106136e14e1864a1b6368e3491b1368a30d1cd8a842196cb4808d15b051c59cd32299501d1c838204f140e108246ed2038d2f2fa32eeeefe61a4d5db7c3ebda7e144172b45c5e46df0d1b3ba46041ca131ca4905288cc39bb4f763d2d3d2c3d63e97b4a6b2c7d4fd77dcf1a2f58238a35303598a0860ed468801a2f6974210d31d2f049a39af3ea3639d6d070d1309656b72e72fc7c443004f7e7c571145f52612a448343a39ed1c61914382333430e33c4300334c3c811b470041e1c413c82d53f101f1114c1eee5fa404a11c59db6273bcb12f241162b5582a3f86279403cf981947fb3f8327c50c61565746554735e6339a29628cb21587c6a731fecc61e3248408648c645c60eb3f37d348a21c18c46ff349201b5d65a6bad94524a29a514a39ace38bbb6d27097e478c47433e79c539c2a3366cc3937e9858c381e24d243d48844d018fa19d13331923522923945357b664e11cf8ece88f3453b738a1630a74827dc9b3882a96d64c499539433a70867ce79c4f36c7b86e69338ff972794df017bff20cab37ef9c1269fd892126f40ab5492a0b72df15f6288fadb7b3b9419a28b305ecc292a32a7e8883945375305260a9b3945355e1c7144db141199534433a768466632d994dcf0704436223934381bb793b3b3b3719b112444728e7049648e9023497a8d8a31f9f2c6670c63346aa3199d51430bcb9c73daccd0136d8c4f5e298ffb7f9f44422e718ba00934a1446f4d32e69ce454d175ccf06402f9fe5e6c442fb3fb25ac214c7f0759a3cde8c95857f7e547ed12a99d8444f3cf2992614ed10e518848f7e12e77cd9ca2398639671ee7c445a8b67b3246a398dc0c5b7babcd523ba6a592c5ccd9c1b1e788272f46dd707a6fcfd4ecf47451e69763186402cba01d74b1a9ee40c836233383ca116f6a767abcb7675a2e46592e17a358f8378e1f0954b3d3f391404d7c17497f427d8a84f6d4ecf4d4ecf488e00e7552e4fe9ed4d1399d361f8df6efdcd331a710ef74daa3d1e9879230513001a00b0a940fe8c98ca457929a51790112654814e7a30c080412d19522e1018239e71253c5c5c89c2e617061381a71a7af33735484003d5d29f7ab456994ae1475312a881682e8396580c213e60c4972e3324c71c29c54fc3263794a9134a5088e3a1a68017f902c5e8876506119f2c304801600a842058818f3cbd00439e64ca900b151092203f393b24f4252e51c72fcf2a376ac52391acd3931ef1b510982002a40a0a6ca0a13a6ca8f70cab0041994a0e2030a1f1198735653c58749e58707c0918439a78ae564ce794300f4903977b0e6bca1c79c33f098538628e60ced40c5079b998439432d900109b3eb547aa842a50752a5079201944c151e9ea0c283115545872ccc22be0b17539f861a467fabe80004151d3e30e79c3b9ce87307cb0e04a8e850c39cd30053250175a824008d047c31e7b42c223d3a96ef337071f11cf43ca5e84d9e09906724bd923094f1221232874744e23d59b3c9add379ca11a7f4b74dc9c59bffc1237d7b9b4d6e1d4f8e34dd7bb2e6ef8c462a2a0f98738a44100215951ef366aa546274cfc1229b0a0e5a50c12188f449d0fae006c1521c2fcb32919e74f9ff47d1721949cf8417c1cf832724ffe4fd0ff7895c63d9c571e66a61e9e238e303faa42c9ee21fc83fd1e0f23f3d2e1feca09721b570d6d5527eef9163108bf5236ef2847ae9a00c69c4e9e23893da3a23090939537ed49113925d6e2248f87254b1a10473ce1ca68a0d55cc79315962a9d8c0c39c178afce518f298f689678788cd2e37119c1c72b4a940a3d1ff7facf9630dcff7a08e11a5bf6dfe97f3e58c9f78e36b68444ffe3fd2fccf04c8031649cd7c713ceda02f67e7a7fcf6e510f95fcef7503ce208d27c39a43fa178fe6993a4ffbf9c5d6e223cfff7ed6dfee777c21d7104534028206489ba1071a122eac10c3998610b15d19039855cc00a09a4766c31e75491c147e8032a3ba098d334f2f8800df0a43504f651a71da2a912e2c1dcbeab8478cc89ead6688c4a0c5e702af3085f8e40a4b87dc86b865463c8418637aeee97b0c210457aa097b1a3687c78481b2444409c134802c91e1e24ff4848c323e3bd3d13e302438e3561b8696846a31a3a38f68c461cc789be77b074fa6347713115144f6049c650ee571a03030343dec0c0787b06c67bdb1b492bd6df30710c000e2ac071051ca739e7552d21ac9114e1a0e93770cc208f437ad316fb4d17c11f4edc41478c9f0872312d964bb5a8708f9f78b34d3c09e9c13ed27820d0e77bff7590fb4db6a9f43f1c2cc9b1048bf853aae4c8118c114750b44030269e6434aa409df4c6e90dcc8d3a66c7c472e9accb8d5fb991c48dcb8dd9869439af3dfadfc693395fc45164b1da70d2864d1bd69c3da38e25fab0017636a0b07162c39ad7969152c79cd71896142728292c931c53de1a53e6bcd618639e68d678628d2497b88635a7a5861a655c5f0d276ae8392f92c59a5183c7bcc434d09873daa4318339e737ab3474e6bcf6e8d128c1131a32982d172fbde5e2e2b18820d7b94f969b3b838e39cf9072c619a53358408b1ccf30838c798d6319f38d23a963a4f4b78d194accb066c7440971044d60790434e664a2c41225aceb08e4116a195528034a49ce94f1cb18d2592e1d5ca244377ea532784c32a490a1c59ce01f2d3292a04e64f4984698322f2394fe5b46e8a611b07915a18e7097bf0851e607bdaa084e7a11868c5f11e69c93084498f322420b889064ceab2282350429353d3a43e062564358624e12559aca3f042b842d5c17298ee32f4b20e20682d2114238854043106230e7bcca10f5bbb82d977d1304278220240a1b51b2b04ad1f78efabe8fdcc5fb6cefed44b101421df30242911f7021043fd87c70051f74c007353eb8a10760f4200b31247d8276f795fbff6c1ffed2fba43e296265e87131155aa42ed30398d40e63cacd755ffa6c70a6dc5cb9b998181c181e9076f0851d943167c7c4258b393b262e4b3a6b073ad6d577e0430752e6ec9874907349794bba0b4846074fe860880e78cc6b0c2863e8cc943706cbbc3e588951c785591f14630c9218dd9cf312c5e09103293980928327ac1c0c010afd378d39c8615e551851e6f5c308a3140610f3f71b90c341c701cbbec1931b7c3780993660820db0b041111bcc1aa8a00622a881916922432ffeff62751f8c2f809106184fcccbfbf87083220a8c206860060dc0e868c0e31a471fcb7ff0a3ae9fdaa1efba50c6ea3a6b77a79c19dc60067e06a4305432a0810cba96aeebfe837fb448df45cf63a08418b42006a61810f9fe8ffbc3400530d8000c7a6070c30ba258246a4c7d0fc7ba4ea8179ce60b8a985fb0e08b137cb1e48b15284880d205940fc5e6cab146ddcbe8faa8ce7ab946ddcf2e3938969df5ff3eb9a08e59eeca0560b8e089f95d90c40544b460ca05b4ff6fc117f36a81b6c4ad8e8a055ccc12756241c7821e5e40f12289b8821540e12b6882f256908338d25817398a9b0aa2cc39bf0aaa50c1a7021a9482282938cd29a6a0c7f4a7f1c993399fe8cc79fd6ffc4f7acc79a1800428b00205fa0237597ef142c109c698733c59be449de004d8bcbe09a4589609529e096ce6dc259832e7258224efc610d5c723353b3d632f819359021bab04395896d5c51873ceeb7761bd7431648a604f8e8ed5457591000b24e002b53f92eb93be2cfdb738595a3c24d011371f011d2390328227748eecd858e2f6a7f1e439e719810e1775cc7995a853c94514cbe2c2c9bcc6928b245f936de26286936702fc1e20c3030ef0c0cbbcbaf77e186e0fe4e4f8813ea2b77c62624830e44892de9fc6b2034ee67cf91fec40929fbf51bbea40cc16745c9def7c50d7e2721a4b966e0b3078b6d0e29ad9a2546e3164668b1caeee9bec235af460ce79f9cfa345490b0470800c0e60c181221ce8e162d28d461bf43b17936e34f2e52679b764774bca709782ca71244f63c9fd1812cccfdf658c6702fc315f0317d0401119b04206589001243280812f30d06160880b3ce10218b800cd057858e00b0b0059c0c697254876beebb6f53f93eee76f128a8f7d261c4b9b047da92cff0e0abdf72d974d8ea7d097ac5d721dc979b2eb7efe266dd2ffef2df1c6fbcf7a39759f0a595c4ad07ba18c75f16c3d37249c8d06e7c64a624786b4e1e41cb17270acbf4b5d4993051a596421834515b0f80116221609b86207576431270ae422489e4e28ebfb88e0cdd5fd47a5422b458e4ad03a813fff6402bf0b582ac120d06be2ffe6e215242bb0604508ac5062cecb07e5592971b730e9ba252c165986db1b431f938f588518aa48c29cf362d2e58c55a8a00ad29cf34a792ede7f2e9dcc274d289133a144aeaa805651600a05dca080141478a1420a155050d151c1c309119c30e1e4c7490e734e1f8ea4e581466fb7744b76089a401ecbbac26e7d7064bd08a49a00cf1463a8a67041350517531c3185106a481101293c290430afa0511c7dbab8f7cde5e27fb85928b28ba3c7fdd20ffd075d3811457ab22b51df687571f47c145e14178a2c545004018a2673ceb1dca5b87d286e1217519fff1268402581215188c01611401281f944159e78e3092a9ea84e78c18912cc90f3e5c871a36fad30346d9204830421e5e00409628da545de5c63906559a36f7409c71392cb97e3583601852632d004114dd4267654102003024d2a08dc2bc8fafb0ac53d9ebe11261d371a2d39a1becdfaf1e3c705e422c49748273048e692b11e50840788e0015170e5f63fa6850586fb1e078cf17925190764218e95038c38e01b79accb34925fcb8803c60d134a30b1c384e8847af9e1486eff535e6a4a4a8b8b1cad2ed55304c84113b0490eb333919e942a4fa6adb3ca1f7ad28b24e8c34489254ab098484f92b1aeddc48ba3dfa40f8ae31ac5202e824e735ebd0a0a12c0f7661ff6518d33ed7aad94a9ae14c595a64f1b118ac0d5ee8765aa6196f38d3311e42e4671fe93fb74a909255a9cd013fd568c7bde5cb317b3be9469467a51bc41e2c486d5fd557aadd775a7d67f5813dbe77d36eb19c75aff3496f150aa4bd3676120b06998d74f637dadbf56e35e29d3eeb94b71a63d60d33c7fb5befebb1cabdbc364fad6b9ae4f7a8d7194703e0ed8b4ae776fcd539b2dd5347ada649088b2147b72e495894d639ebbd733caebc6346ab50c47099724e5510c7f156b18addb7a7b37d9764633f5be5dbda7b5e63f6d88a0eafdce6af61deb9f476fcf01dab0ac3f8e659ad52cf6698e9532fd7a84dab02ff3bafaddf397719edaa1a559b969fe6a1e9669d6b4537d7329d3cce56f9e638bebded75fcf2df5c8afd38d6d4d3da719c63c5f62c334a6a94777dddab3ded3271368bdd3e6554f69d7a887bf2f5b8d8d1bffacc55f96316f7fbefbec46dc68cd5acf357bedddad8d9f78c34171eb5c57c651c27da60deb1ff51eb31ece99bf9fe723823f1a166ef9f3996adebdb852aeb7b514d79f2dcbbb66acd2ccdf8febaf5a8ca38453a2015bfd74d632ac6bcf6698fb7c5d61e8f9757912dc6cb6358f29c7346f6f766f29d30e72fe942ab328735d29715b1c25dc56dab8b6b57a9a5b4e79f6795a29d3ac347d41f86c1b63faf1ccc3d9877956a3d5624a7c5bc63fbfbd8de14eb5a75837e9373ee2deb92eeff34f2347338e12aefb7db3a761f4d33e7f71ce7a2953929115d29737d7e5499aebea1e3c8dfcbafe55b3b352314a96a75017bd5e0ccb3867add58cf3ad14d35a63cccb9fc616db195f5fcad47371e4c27073cd733147acc1fa9f4612dfbc7bb3cc53af61d6ea8b2bc6384a38cecb1a46335da9a5b46218bb34c3746b8ca9cedb67defbbabd174709c7f7f6598dafd679c5dba3fdeb1847099744b7e9cfeb1efe6af7facbb4d7b86d6354f328bed56abde38d95324d91a5fe9c94b99f93fb6a384ab8cb008c625a5671ad37dfac73be956a566feb39ae58bd1bf3be832377af0f930dbbd7cb9ac534ae7d3867afc49635daadad9e5bae6fd6f292cd5eaeddefc359ce30fb6596542f8e12ce0825dbf5dddaec7d1ee6712dcbb452a6ff67fb13577a1f0d671547094793c4b66b86e9ef769d6946926cdac69df29bb58a77f52a86c4b6338f639c526c37f7a896afebba388ef37e38ce384a38b047cb1ad5b2d6d9d5955a9b31cebe4b77bf7b67f5f338a697e7ba566a7656f005916c38bb98a6e5ad334bada75e29d31fa4ede28c6f9b798c7adc7a9767c328d5faddfef26c31c76a29d39dedb35ea669dd63597fb6daac52ba008ab3fdf2cd346feb77b94617a0936dcfe3ea6fcdf7fa9d7929d33ef2e46874d79ab3fceddec71d1c2c630ccb3eef6699c71b6bacee1cd934cfd332efe2ec55cfdf6e4b996a9a8d78fbc358f3b86259f37cbeb5928a6cdce6dafbcebede358d63adf433c547f8afe3dcafe518df7c3dd3489e68e5b9d9a8b6fbc731ccc374a79cee52a6a791ec14b3d974b57be3ee7dde7bdac57c298fa5a5466c997b967e9f876199f55aef52a65e1c43cef14a69cd56f7d55ea55ecb6886bfcf2b653a967a66f399d7be76ad7b8c617a67a57c5dd76533b23c9d88e48a3586b3b599a6596318cdf4320185e1b5f18d659f59af3bde59f3ec0ac9881572fc7c509e27129e4c60cd4c28d196a62f8866e35ff69a62f7eb757b2fdbef1b39cdc8cc46b37db1ead10f6bccd33993d9f6ae9afd30cc67def5326de39b211bc6be9cb9f769ca31ed555dcaf4e32ca598720f9453c4a6756db5acdb9b51af525c9a3e8b634ce3c8f9901cc783882d6778675cbdca77d7302f2b493d0466fb76d7baceb6e67d18e7af9732e5b21e62fb34d718cb68df58c56ca6a54c35cda34dd3cf7a8fdb6a73e657db52a64123e943abb679fdf9ec71ee71efb1f5bd9429597e247ad374e32fbb7a736ebd5a9a3e0d49de3c9b7dae3bebd563ad7b5cca94ebe2e6c64e6b4e026f3dcb76d634e6332cd3fcfd4a99963eeac491e3c76199159a15d20ac9c80af73d417b47a339c351c219c9369d69a6f6d32acff277372e654aee12e7b0eb2a4ddf85448932715886a38443e26e1a6f0ddbf4db1463f57eb994356aa566676585646485ebb992e5c97a72e41747094784dd72c5b2fb695ae5b9f28b712953d28b75d31fe6519c3f4cdbec3dcb4b99feee9bf864748564c4df2b5845ad5cd75e211959e1ae86a3840b39a12d18f59ff32164e5fa2c2f2c2e5ddcdc1562fc3f827038ab2d9403c2920020751c491d820802840e2b3dfc48808fbfc30f2c56053fefc30705f4d077e0c1d4c30ed4931f478ee55600f5a1c357a27848400e94f3256e07045cccc3019a8c41650f2a3f9b73ff53e1ac5a38e84ab9ea7f76e87125cb0025b94b2005a83f7a883ee0ff810094e50612880198469e0550e90fceea89fbef6203c752c30f1a80e0c1713f66e09a6c930f01a09c8fcf1826000096e8039121e57f5c7694de0748887224c7954d7ccbbc520851c11c216fdaa248c80a3c20001b661a530043a6053ae3ecda4a31172182b4b000090288951f3e7eb07ce881871d14a043027240c001542a1c0cd08300370c400036d440038f1902008039e7ec01448ed98325890c5ed830d380421532b3f4800c421550f9634c1f11e4c2fdc9ebc700ca9c2218847ae8c2bf739b464076217a81e80b1770505c30e712e58aca89092aa650c5a455c2074c9adf6fead5987a633833a76805734e51132a30f124738a2830a70802a22bc64fbc9953c4c54f81e8c9f889371f05a2136ca4f13381c889ce2951017354c0222a60cd9cd3028d46a212cc2992a28b7f5229a5608aba280960aaf86c24dd87210ae78b23981265aa081601cbcd63e249b8f02528829f084210893094f9729c98531482ee734420f8738a3e20a2be39451ee8e015e24853729939451d10479c1ec513778ba9b5c034b5c926383067b5a94d92327f4e51063030e7aca74d9244525c608a2c90c5fc312afb88597b4cbc49bfb13d738aae6822025364451533680cbf930914918421aac687de2e479c1e8e3644e61455a024c7d3488a484ce00e69fc48faded7f888e088b341e0b44992376d9c265bb83d9111e7878f46badfdd5360a24ea61fbe4b9e3fa7888a2972c2c9bc7802a229b09af2454452cc298a82f4454231674e111425b94f738a2440a2429d39451130c27370ec29657689e4c9f148bf019f20fd0f288e47e61439b17dd0c71b0937c8c18e3ac27fd183320d188d6c6a664e511373fe90634d6a46679bf64715e9a22fbf4762078939451078c0f4e458fa9b4604475e8233df93de8626a9496c929b244b8293e4243ac96854814623136ff2ab051a8daa051a8d2ad0686481b8ef89193f1186fb1e72144193376d31e6efd28d69147d378de2ffbf8720123130dcf788a8af63aa4b72eba4fa3853a6fa381313532d4cb54874a5288d4af99f8b5160b5a8189524488298994d38198013483c314353a042a88d100e4261a8f4a0216a4344454f694e312562e24311135041a24517c2400a03e9098c459a731621522274830842f0810fcc59c50426404514524841c60c002c62886a0161893ec42c227eb0441f662a0ba023540022a60b5ae69c2cf01182992db29858cca9337b8a983be84431fbf6e4c5a89c0ac471a79fe3844ace12395d8b35fa466bf479928514347e8de2bee78327990f9eb68f189e4c200e9369c48c5139b2831cce836469040773f6707b1e4fea6cd26f72cbb22ccbb2ecde7befbdf75e6badb5d65a6b6badb5d65a6ba594524a29a514ab58c52a56b18a55ac6215ab58d5344dd3344dd334adb5d65a6bad73ce39e79c73c618638c31c638cbb22ccbb22ccbeebdf7de7befb5d65a6badb5b6d65a6badb5564a29a594520cc3300cc3300ca39aa6699aa6699aa6b5d65a6bad75ce39e79c73ce18638c31c61867599665599665d9bdf7de7befbdd65a6badb5d6d61a17f73d49b6c3025bdd9eb7f6e31fd72ace3ecb62f39963ecfdf7d5cfbb99de2e7660b1ed9c71cc3f9ae1ef525be98e2b360ccbb48e655ecbecc678feacd87caffe6e8f69c7d8bd1797f2d7a31d556c166f9cd59d2dd65faf1986350deca8c06633ac2bee94e79a7d56d319163b28b07dded7acb5d53ade557b98bec00e2a369d59ee39f659d634efcb7096719470a51d4eb6aa61bd5eff65daabd6629ee6764c60bb3dfb4dafd638dffd665dca349bd18cd831c5c63dcf668f61d5b33abb5b9732d5bf525c298e128e668714b5d27cadb516cb19a6b166f1b5956a9b720ff74eb756caf4baae4bcbc8f2b4238aedd28c6d4e717669bdb7fa247640b17d56b33e7bcfda8e695df324b0595a7dd6db6af67accf3700434ed5e4a2dbed8b51986613467f4eafa716b2b563d8d5bdf773cb1714f77c63bc65aee5ca3b59469a9f4dc58deb2c926c3438466bbaeebd2384a38264263a035d3300d6b4d5bacde5b356c69e7d873dff3a7b3ac5f2e860dfbb8bd39730df32c7f5cf3e45d2119715dd715869cb5aaaf9633d6ba529fb3debc6b5fcdba0fe8595aa24ee24da5949221306c9763ea35aa358bb3ebfdbd2efe41d3756194a3fc83a68bf11736ec3756b1c6f9c328debbf61b8e7a61dbbe6b98a6f54f679ee7b5dc73358e126e895017b68b315fe9a5b4db8d5d4d31ad63c3bce7b46a19f599679ef65cd87476fbcdfab3bc772fdbba85cd57ecc3dc7bee554f6718d3c25633de5d671977ea2da694fb9fd1ac908caca47c114d31ca71b03c8161e86f16b6abb16b3f0d53cdbf0fd31a8e6773d644080b9bef99ddd8f3de679d67ec9b59a15991017789e622312a4257d8b0de3bb6be7e9fbe159323577a9f4b75b6c246b16633cdda8bf3f7659ad71a08d1b1edda73adfefb76b61de39fb681501536dab7ef59ef59db7963b697321d3ff1a7b6ce755d973fa5489aa3da522b4254d8acb5147b7567ebd9ebb5ec466b53d8bce6d4cb2eae976bed69a691ace1fec4c3652b850dc35453ce7dcd95734ffba2b071eaf92ccb70ff76a5987693084161a31fa59af3edf9def1b6f9095bf7b5e79ce9ba6dd758c742532cae5a4669ad58b317d3ec6acc6b5bab18fbefc37ade4ed836f6dacdaaf5de775d1a470907146ac2566ff61ed62eb59eceb4ee736c1de3dcd3b4ae3d86693ecb726cbefa8af12f6f5ab1a6bdca844dfbba96b34f6b18eb8fe370fc6eb96b5668566e564846564efbc8759db6a94a115ac266bbe5d9d634ff3c6a77f65daf43b1082961bbd8b658d53e2ddb1e96598da31608c5b1615fa7dedbf87a2cbb38f3fe9422792004c7a65dea658feeac734a3ded29e558104ac2967d35ebcf6a6bafe6f67a161b4108099bf7a8e716bb36f334c33d2b657ab2e4a8735d9804426f6c58c772f6798c729c797adb4b7bdcd8b2fce9ecf96c774aafc530a62d08b5b165b76b1bd78efdc5ba6236c36c6c5aee9ad714676fad47359a224b71bbd48b90946ddf7c79f57cf518d32afe8e5cd7a540d7a531cad14b812c77d7d8b45a29cdbc5fad79aebb3696e2cd758da508962135368fdaea617a5fae2bc6ec97c666bdfeb4d799d5d9cdf00ac98895d34812b9aed348f6ebe21e080ba1b165b47a5c5b8cf1873f4d578c72f4631284ced82aef94e6ddb1cf95f28cf75cd775a5caebca30cad19c2aebf8892066c6e63dec66795f7b7dcd377b6d8ad011367c73c5acc7bacf78a6699bd3ae8bfb4e32b2f2f99d92efebe25caa04c97dc2aa089541961f45729c0e2132b60f6f7b7bef58c51adfd733c2e6e99a312ccb1fd56aee1a2b65aa8bb0d98d39adf6cb32562fc79e089bde99d719ae5d7b98663dce7094700b080d61a37a671df33d5baadd5d33216c9a5a8b59debfbbb37ef3f5d9a49c5010b68b310d635fcdb8c676fd7694cd67eb599c61da2d6637a62f4f0808b752fd652cfbeb75ffb26f40e8075bbfd766375bbeb7c735fc75112ca27d9055add56a2f96310c534da3d57aadb55af5bd5e636e7deec1d6354c6bb453ac77cd38e5211e6c9863d8676bc770f79ad7ed0e360df75a77ef967a8f5baddf9b900e368cf2bd2ff630f5b08f677c8ced669e57ec35cbbbc7b34cc5d8327b337bb9b598a7b5a5be947d36e9ba7c76795da4ef2b353b2bdada8472b069597f588669d87e98c6aa0f63c31a736ab14fc334ac720c071bd556b318e639d62db6ab2d65ba84e74a9ead908c585962dbd7e5c3d243fdebba2e8da38443856e60312cdf2cd358a3f866965a0cb35fa558f32ec576e69123d00e3fce070c438f6b2a64838df36d33edd7b35757ae597d8d846ab06136ab99873f5db1e5f66aa54c7dc77668343a9625a99142606cf6d36e96b3a77dff387671e8411c0f34923ad7457fe8fb68e22a0d4388061bb6da53cf568e698ef7c54a99f6be7b9711c15167bbaedfc91dd4fd094233d838d73edb9a663dca35ee5a065badb5621fa6f99c75ed5697320d51261ba28e5c9736231483cd779de5fd75ec616d2deda54c7f6ad078ca60b06535eb9ad7cab9ffb09bdd52a620c795e412bf5e57be22f4824dc374d69eb631addaf3978fa5a6d9769784bed83e7f316a3d9cb557bf5a7b29538cd64c5f8cb238270941d92cbd36c3eede14eb5ed66c29d31fbe4f37bbaeebba18755dd7d5c5ebba391481900bb69a61def5acdf15a3fad25bca94e4c1e40e37fff8c787bb7b2012c531c551c2c5845ab06dcfebda57b9a63df6ae8759b069765ffd699ff7c76bb6bd179b56b10c7beb33eed5f36e26cb7f318e128e4968055b9661af658cd3fcdded331b5201feb4cc79f79ffdbc4ceb350598e5fbee8ff28f673cb3f409f6bcc69df3fc693ddb0c0ba160cbaed598ef977ed567d8864eb0797b631a53bc7bc5bcaeb18b4326d868df9ff62acd59bd996b9c663b54829c7346bde5b4534ff38f9632bd389f4ca0ed62c3fa57f9c5349db1cf5e2f6be26d481f341aa90c089160d3dee59eeaeabffd5ded650dce8446b0e5af568c5ead7dcd1657ed99003f924b1cc5eb32a1448ca384f3425c6c57eb1ef5e8a61ac7f0e779764322d838ef34fb3eafbd2fd33efe69a1106cdb569ee1da2ff61c0779d1929e872c7928cd64f9ad1602c196694ce39db1ffbeecab9a89137d9829671ac98f4b9d469ef50cb5425af132d48a567de8031bad9fcfb9e7af56cd7aef339a9007360da35ec61edf9b537c6fad43421dd836ef16a3fbd3d8bbd8cd59de62b35d7b58b759fbb887697f67425a6c9856f1d670c79e7b949724a77160d39e57b9ddb76259d57663a20fb99a11096d60b3347b6d7b96697c9734b0ddcf7ed8ebf8cbd47afdfb4a99624a963f031bc53acd1ece5dcb1af39f2f65ee8395fad0db5a08039bc6bd7cefb733cdb7ddd49632c59c37f9d269933e19dde5ee5ca5f988d00536ad52bcbdaaddebed6779f92db0e9ec699ab6d4e3ccd37ca6b32c36ce75c6b3ed3aabd7722d5f2cb68b6537d3cce66cedbd7bdb2bb6caf3e7b9d737b631fff15bb32d64c5a6f9aed5cdbdedbad2baf7af62cbd85f8cd9ed334fb54fc3a54c2dc7f9a03cdf71adc04677aedb736eb1ae65b6ef52a67d9fec15a2c0a6b1be5fd5d473acf12cd752a65cad0951b1658cb39de19b39f7daf7f952a67fec976664f971c8c996352db3db7a5aeefaf3b49fc086bbd6b847f9d555a335dbd0149bb5d9ab3863af6b1fa6f786a4d8f0de9d67ef55cde358e71c8a62c35bc36ec61896b3dd3a772442506cfcf29b6998e71ad77cf35bca34dca48f2f4590ebfb5429e9cb1a4d8702a9c7a8a473c8a63dca9019000080a96900231100202820188bc6232291542ed8853f140002539850b86648174a14298721648c21068c01000010000091915000e5ecb0ff4626970e83086812d5cc55631510672c97e748d960312fde45f95a6384c0ac0088dd687bcf47079012ce4d4f6665dcb16cc35d9334888da27cb7a16ba7c404d77c9a3acf1991f959e8baf19717880d2c03fd098a86f334573789d85e00c4a7dd01351d402ca34a11814e521a1184d8f6f2475302ae3a5120ffe3d299b767b2148e0229eead4ce7ab25e86a9cdd29fc09fffa8a8ba5688067d80471f2e1e3456f93c962dc3123ebb34cfdf18b527358a985130f95fd2fcada79c18749e33e9da47353c6a7fa9492213d26e2d5eab848e5df822339254f629d62b2473806d59350d231bbe9637835636036a7f4aa7b53820b4208026950b9d4ea0e9fde8268e7228c24249a0770727cd47861bbb574394fee7f2d2c000f2e4afc6d055a49531e3a157a5e895af6e0de6735ce4c4328e0d11cf7fcde0c10e9525126cac0f13292edbedab9c6ef17643fe03150c9408d0c4f8b9379280529187214e428b8966197c811a6430b9683bfe0238430e88e74b575c4c39bba9d1652ddaf74a0afb411f495351b4121e83bf7f72b3f306de94056ff4971874ece7f954d3b47652d8bb533ab524b9522175018174ae0fbc33bc087fee32f7b171420ecda3a95c44babf6d64003c0fafe4227ff15df141fe69b09db8c237db3f1421b97607b49fdb111c45e070a9a33b5b7d55d5518bb41cacd6a14510d81bee98511ab3e6950c00b019560f16336c7553b22c8948234616446061d7c9d12db0c58688d39dafbc7b4d03a6218b6f97f960b2f1a0588e103bebcc0c779269a6af5fa6424b565d7eccaedbe8ccde1f9215e753f4612b84197143ac62e828150f80bffba08d46c03cc8b8bbdb35557c30665b9a35815ede81624dc0b3dcab715ea6f2b29830ba6191ab78df43571a81827af758e6975da6db286331dc65a116e90b3d50a85bdc47d75a664ba268928616473c768137aad3fff0e6b6f0afb39c96fd8622821402e85112879723f62de646260d41d7de77c623ce88f250173df3ea71f9a2c3e56ad1fa4ca93ddd6b96fc61a18bcba24ccea1c62a7c4e4e52d8bbf55d2d61bc562b1f46c40806da0b3b72adde8f32c24276d07120f929325d64e50808642ace6d9cd71c370e4010d7a62261b48bf764a78d677d73e0e8a8f96edf076e8ec571122d7ca7d2ca31665961783b54bd6ee53a93ccb2a64a4124ce821c428221e5c98068a86273fa8a9b999f4fd82d9666759cdc1c9f4446d92f33dae1b5a422cfacfcfaa342ac6d0a3f3a799296b8afc99e214ebb6963c188baed1331315aabdad10d860809b4f5ac5212b075b5256a52b50a9defb8e375bdffb9f380e22858f4f06cbc6f6e7211ad3618d31a6488b643753bf9d682a66a3d0523b81b326b531d41b3873a08483b2fad705c9faaabd45d61fda12b35b6254a207c305792098b0a0c71b6abd550e9cf587c29163c8cbba28e16e9568b6a6b1109c86bad23bc6847ef9a8bd82a9b8258a290c478ff1eccbc4f64394c408497b92ad83a6e23695d6e1db91340b866b2e8379320a8311044be961c4471b1734a24cd6a5aee878bc1bffd921abc6d69765f30550ff6ecdecaa76352efa51b60d63dac80aba621ab18f0386c8808016a09861ec36b52236d6c200c42674446344793b0b23d4c083c3b0e958b769955e10e3c3ff39e43b090bafc3764aa81569b85f18d0a0b6563b5d0724258cf80ca0e1557b3ac2300f2a10a09e6151cb898952db4f38e8a3dd9b10f8fe06c1385c513f9201a3a7df0e46e087fb4b60348383e0368df893215976d1475397712ed209a2e5289d8214723e9a3cfc93328aa293b19e14245d2d3ea9f243c727c4d6f7ae408faafea1c22d0d0ecbce8798ce9db0b757c26fa702ca7068b2d2021554aa14709ef499543a41827438918f900aff2384f4263883bd9906e0af8607d6c2dc5dbd47f9f408048733c9651d846172d04e3991714fee580c56053200d5ed50dc75a0b965539aeef74a698f7912311508924c99c8ec973d0301c6360101cbb23f16b460f309548e2949797ebf22e132df47471099ef79e8082ef383b43df42a9f283f213884cd69a0342b795e85e423aea08bc00e4c427bd191272cf4b89ba5d9a12963327b61a727ddc89a687a7e304aad8a1fade59cb5deed1266f77e9d70e29f150e261a419b489ef65a47666845b0e2c64ec20d6d56807d01949259fa32db11e28ff87ebe268e3bab6404ebc11823c5ea914aa784fca39fe9d790aa961ac61e8cef6e0d0cb203a701a4374c902c3666c82043daf577b3367013920125386e6b774533a9939f8b642b3021f811ca6433cb9dbc4212c0ded21ec426c840cb489427db4076b3b194757863ee84657abed4aa09576cd1474640601a4a0e81617be60c8268e6917be744da41ecb61f49b7b669ab0ffeb39e9c4f57a4784b5ed1622f79c5c2e25d8af6019dd077cc2fca54af7b0c0895c0b8d35931410f4cadea0174afcc78222203bb69d5e9ae5fc105389c504785933dd7e0977e64785319406be36695c04f62afca8b2d7631da6361cd6b7ef66d88d0fd19154fc84139b77b35a31e8ad9c6309fa680125c7c62bda8f8165937f2407d435328d7a6c2d303ab03466e538bbd0858184c68d4961c8e7e54f82dbaf4e5db0712144f457c7e5dcc9b0cac6217cd8c016b4ac13871cb095ac021eae0c3c5e1319c731511a55e271a56f727c5140d01dc9a65c560a10e1cf0d4d3317fc638a44f7fc19075108c4a08a54486145096f1054203988fbe0fbe5c1849a943a95a17e233b45d35e242b68e10c91315a80b74c8e333fc3441186bc5bc6c43fa8dbebbe0bc275d4bd80ea688b5efb55327dc0358b1532bf347a24f26406e2c13f719508ee51f4de7a2503cc229dccf5747cb38b3e1af2bae76ed836e3a009dc8ae5407c2ebb188ad1f4fd30150955a1e6188ddfbdfd44a7eaad10d8664211361ffaf4b93cdd17cf47606e1ab7525c33c0fbd023c8ef9c1561f06fce878d37059a794f263bc913594a2b52d58fd19aa6fcaeac5727bb02d7fca45d6bb132f62b4c10d36f6f107ac7bb11ea4f4e7ba240f056698179c0efd5e3d02d19737c1639ab9b0ef2d954820ddb15ec0dcfadff19dcb4d9788a237f5c87e91891eae3cc001155c23917b6dc3ba2b24a2610961a584cca1af093747951411dd1d2d11b5e6b1a4b59869a6882ff49f996e1ba06f35dad6c4a4171751ede0578a0915dc5d5f09f60e85d7a3570608da68a0cb68c6510d64a3ba3c36208495b08b9ba7176d9611aaf4eba9b43dc2b7c1b84ffffb2cd21fcad55c876f9a459a0dbde3a249ea0f19c9823895dcce576523b310206a5a3f08892aaa52929611710fb9330f9c4e790b8759eb7fe003b28824a4103a2429c7a4d9c75460c7654ea5756c3c021d0af29103abb40933adc2981101dba2e0802acbb6a03aa1c575a94c874e1f19e7c30d3add3f44f52c14e7c6dc967bf64cb2dfc30edd7b192213e3076e8d1e87d314ca26b9c83e04abb9409703823a530ab58446b28ba84c3576f6d9516d7da689fcce392999f90c08f5fba6508bbe44ff22b026357eb68edbc514f2e62d74191bbc14436d5c0f93fc03a3f670033d3c15852228f83f4679155f079c8ca6c0246876dcb6402ffd447db43a58294d0d5cc1752b9f0962804b8224058105befbd8459ecb3654093e7894cbae0c167d012290bf16a283c2cdc8a3435ea613489e701a3f9ea47871cf74937b79a1ff8bfde88de3ace2432d875ac208e320ed9c194e139305bd4177f45263a54d46916f4afd5f9d60a5eefcb42ea59c45ff929c0df6720d1d1ca807b5e687af689e744380e7b28a25c5199cd28b4d4a9700df2220bb921c1cbb5cc8505c07d157921f21cd7402e2c1d53606d553add280b9cee292d5d9edce1e691e8e95d6e6f0360a962a308cb9b2347740c1e3940488508cd37e4d74e1d21f5be31a48b2624adad1800295ea14a4b98de56ab80309efc28b12e59d45c46d1c40c4eaa5f7c16b34840027750b52452a4f020b7a0c8130166b077458c9d90d2a429af2a69f9fa06cf57ad0661e1ec631988fdbf529d4e6e068ea40523ae10de8300319e606627abd4f6332c5bb195a607a098122e4cc3fff96222300406211451618f819db3f43939f94926378456582918712425211189bcf72cb7fb09334634163785aea9f503740e9f1d9362c0546d43fbdf1345494813d8f1b9760bc0ce50d71f5821d0a15dd7f8181f77082621f4cd85b26af8afe72a66834b7d616e7e267146cba80220a9b9f8d6b155c62240ee54bde046386add6d1c96c1f38745014514f65fe972102559ceae99d91ad77644765865d0c6c7423cef196fbf101f8784094bd7d5ae43c70628a6956f7eda97be14039faf9afbc797740843354f2da593bfd052976f1a674b9edf01ce618f537fd0efd96f302f0e88823fe7ef985e3998df20bb422d80349a44ddfdd82db679b1d3a9995c42311fbc595982bc9a1d8438b3f30022f90102777f304ae3fa0c3ea862ab293c4fa79fa4e686dd689d41c3f9f5317865b209b0f875f797b3dd915757a905160b891e9ada3dafeeb3a14625eb50f995d44883c1c5787eacdd58279d727905a373d407c8013fd1cea57d85c8b058d3f8126a7068148ba4fbf4cf14b38694e9843e6d8fca16f3cb5efb0d7c376b0c16e7cbdefb0d7c2b428588589bbc77eb2fda67cd75fcf6564775ba3fe8f07f3870dfd94a83735c26d2692de1c214627d5ac111347a30a05e7f8540d534015f35f6fb34b2760a6f264b39c6dee29ca156a91184c585882912de0b7919a1fe4389fcd81a3a912792b4808974d2709d68492c2f0f9c9ca6f6ee6de525c0c2eb8761bc564099b9c8d00af593c447038b3e2c12fc1481d71144b243b7717d5a8df22fbf84758bc511cdd49b7bda67b8b59b79d0aab44dd59b8a0169a9ed19a3fde0293fc7f8a177b937bb9b8328bcb5b3d6eac1677efe7e8ce52331ce4e74b3ab44ff075d4be1bbee573b3a9a37d58ea38e4b0343d374a61cb509483a28b99ad35dc703c98bf77ecc28193882807e0878b463940fc9bb42a675d38eb37d2cac6ae0112a938a6128526d71f4ee61f69ea435775933f5eb56dc15ba1e0402c5519323c2855c310388a525904f87f0e8d1fb14fb5704f0bdd895dd0e7631e9eeb96ebda8f3a76b0e6a7e6a4c43ddd24d3e70f346edd4ba8d7c1b7a3164c1f11dcbd98cb26115e17a8a073c51de777eccf373baacef00337d4ce7f5592bb01ae003c59b0e9773643105167ec6719f55db8d85d36d0a4304871c9d2a0633e378e7dd0ae973b927972baa33b8be82ae4b1fc41673c1f926ba37fc6d5a9c73fdb32ff247ec3578b5c4b625e7c146a1c10096f205c5cbac925addca6bedcb29c23058569dea5a54b8b938f99b19393d6eb0bfb3a49a95f87aee9610eb5391a47a11fb717de3588f4e1c38bf4ad935b23153163a3e61f7e61794e222ee524f515db1a277df7e29a1d0155fcfa2279c0fde1def62fec0a4528b7035d7e80ac0fce00b927710bf82f5bbae29f66062a71e4d93bc6ec43cdb8f2567e7fdf308e4c96c6edd98e585f7aede30a5a5acf6041fd82e1fa7ccfb8dd94958b9f967d5d68aac795877b7122edb66c054797a3b6e80b582db8517b1671cf689ee944c633af54d013276b9445ee32d01020ce8340357e5330b4605b7ebd4607fc0184a4b7cc34b6d631b8cf92a19936b13f63453ac559030563a8c73a37629cb9a02bcd3bf8e0347dcba7b44a4e6d308de92f29d573da71bd1cfc09842e1ce7a42bb25b1ebe1da4fd2c3190a4084e2861b8d25ceb16c0cbe6a526270fab228a12ee3dc19bf8a07f87bc7a3e7ed2f8cc1c2a5ee3809e400ab2073d54ffde57a0fc1c317b600f06af149e16ff78e159c6e654bfe3d035ecb9ed6f55d456e385557a5827a4a866e77904d7cb72ff274b690ebe9a4e9d7b5edc757f2e225ae4e1a700e978762ef910d8cefeed09d6d19b851229824d326531c413b30c78b84c889cf4b9810fd5c348c32f4002269eeaa7c71dfbd573890e11f9dc706c3401444159b4306ff4d539e0babc90186c7845377953fb11807016a570a3d6e679ea5daa71ef085fabc6e399920f937bcb8a5288aff16c4c7d90f1e166e09c18d484779f1460aa3e37259908d20a08c2416eaf85f9bcf324685f7e58303a2f390440dc1d01db261b8242a4c0668b7b874da5870f7abdd60fd198112f1af5cc7c4070e3e8b4bc4fb7cbc79f4f47e2a3a013397b2974d165de6e316af0b223a79f393d2ba99c035dc42cd46e8c83cb65b702465847c95fc5c6f43508bcbbc3f8ca76df4885b1d7084f3bf1335a0531a529eb2623830b9e175f8cf83528d585930c9e9ff1f8719998cacb05dce4f00cabb595bf79ba39285c898330c58fe1708c9850b72ddc5b7358d40cd41c9f3ed7e9e41b7d3bb17a52579aeeac3607b3ead4e769bab4b161a5c5bc92a15b125b6978ecab502924aa11f772763e0f653718d3bb3f99bd454b552bf6bcee127af9c98995665768ed46bf6b12bebb2987eb674dbe5c7b554ba343d3dcf7a9ec9063df87c739a03b6fbbb57f727c33338cc80e028fed249779968369d6d0ea05e82d24fc36d7b29bf1b7c8ececa35f56ac8bcfe5c753ceb4b0de210721a5d97afee6e2ce78a1e3953a68da00a3077470f636a25b1723937998f447ee9c0ec3d3db23823931f4ddccc6039635dfc3f43abda6a8570cc01b21280d23f4b2d210d2f54663f88b17bc7020db1fa87d0cd36b111d0bd9abfe19e43e9eee4dd6021260959e180abcbda852e0d1dd9a193c22ef908f4e2d7d0a718254a8bfa8fa1084ade667951e911bbda934d3d37be51ca7127d9f4aebee68d55ae34cf561828cd9a39363f7e24a911de707c4bc449f827f14c5bab8d60522fcfa5146ff52dbdc6dc15397bd4a310880a643619768ab09bfda6eb82724c344315b7bdf5b7a2a716fad2995214cf8c70135dd6881b3990027da5dad830d02eab9c2c889327b8610a2b35728b5b6705b71d75c401cf9a837fb851e3f98a4b635e9146ed4b833efddd86fd0688364b0de8723d0d020e5b6b057bff0a2059b7589e6fe83c71f9dc7a2fedc80850c61da7d6ac805c046676439d9727f7d02067a740e8b7af303173a9059976dea2f587c11f25fdebf7bf00810a5dba7916b20b1624dba6b5f7f41208f9efcf2fe2ee0c28627d17e2ddd058a296cbe4b5b700f1d77f0dc3bfa72070c267009f76deb2f547c41f358dfbe73c8d171245aad8d27d810624defe05d0adf320c6ed66c73a5adba6c13b1097a2d686b6657734cadd278429aec7577ec6328e38d71baf76e8937e0a300acf46dd223afc1895378f35d6977fd0501f2e1cf7ce75dfb0123f4e149d1f6fa742970d18b34a75bedc3e7e0c71ff2ecf76891f3c083116659dcb7a7ee8517a5e8e6b1f2e6bb1f729c51c86b67edf10b64d8c49ba413e04ae38d6e0acdf4b90567fee6ce99f12ff70f7312d8bd79f78063c690aeb2a634c4641c7516f7d403f021ded0ee238b852705dcba861362028a142db40aa5fd27e933e840e3860fe0d6275b638801b1fa74955e547dab085115612e007c05b2813ec0e13cef5b05dabbf93d35f35e5e5acab37917023ae5d5ed279d26701a1e46efc9467b561734453b5d8dc59d43c6d23eacdef842a0b527589cf7609e3b7fdc4e5c740f4da14e9b85922b34a88313f77ba6cad0204e420f2a670024ed6f6e5ef9409957a89081ffd1078c6e1e7f3fc0685fa6c98ae6673f9117fd0625087bf6a085df8b7585bc218931b4cf615ced7b52988fba908da53e614afd79ae97a4f203e9f047c63491bfe705afe935a4faf74f119b2e2ecaa21ef33bb90aeb33a90ca739ed534cae919eb21aee60fa030fbe3e5ecb01ff7a1e2001b329fe8b1c69e1abf9e04c604000c68b6eb0ecd08a4aa4417d19626a6fb587462e615ed39d1272359ca66e094ccfbce51b3c93deace0b2aee840507260de6aa8c1c1abbf6da2bb008f0a9b2d9f2eeaf7289e26d5e1a551e657a5598c3246505aa9f098bc8ed29d71777c69b6dff1e14a8144891414496a9f64e837dd9ab5c91cd668564a9b23d6a3cd698639aebcd91637f061c0ad8b13d8a8227c80f69d7a6adb8b29f260e3838af68b34a3afdf212a2ad468399243adad16407bd7a7e766865a7b4e418f6a37af664974c207fcbcf19a1d9ef372e09906fca14e66b1a722143fdb443e000683ebe746c418eac78b72e60a20a595dac7ee61a8b4591c092803f56c1b96eeab6bc7c6b30cbb5ed1ccc26848e37f95417889adf1cb7500d43f069ffebaef2cd3cbf3fd773cf744f943d2a9ff1e7587e37f4d1d7ea78ce94ed85a7e4695b428d00822da2007c8e7ec8d00eb3167ac6fb6902c1e7b891c12f4435cac19e82e1dbad7c7b17e085a0c32c89ee072b04e08a099d41fc862c44322bb0529055c624be98466f152103869507d84c6d23fbfee3fe4d245d63a4387a01b68e0806e7e199cd1d847ba5f0d1c7f2f74cbc8c42abc98d9e5739f125b3ea298eb0919a30a2c2b83d1d7867ef4198f984c00d22bab11fd58199e2eb5fb6ea39ce10b8750477f1a82362670fcadec831181238784f852f3787f4aeeb4fea560bf78376d3405ffed1cdda13be0439135087147ea2c3ed99d2a5b987f0af60709582221fccfb010b511f8622e9c1f209b2811679c85ed6b233a5b1bf1e6d2689a0f8d6394addaca3d330701c31ed5f467ddb3554da77fa93a78229c5171613ca6a2802999e94e92a24dec471b6b886617afdd8485b1d50923cd480943c9f9b058d00c6d161c2fa6104b3b1a42208ae2c5b5fede28460792ba5e5f87cbe6006df1714a8a2667f44b8349cff2ffebf82e024f8c0a92983417173b467d20c4bbd691e1044bb9a891cef589ccd9f18c033220f7719086566f04273237f8ffb54852bc333849916fb5b2484b778961d43616678acdf8586ec301ccc4c1042019acc98f8dea5b74c09fd61ab721ba12d97e2627974514b3484dfbf1a9ef81d0c4e0388d6cb4189909ada453ee10323674916199dc3b767e98efc2da8c8d7000164dab94a3cfb03589f75387569e8243e6d9eac299ec533d8a9d65d563bda15f80ac67cdcd8b3461a6ba9d93a57f4a0decf2834c82badb28918116d9f531a423246fed06c2a6c1e2eed07b31d0422c288edd09d38206d92d46138b31a614422bc984d007274faccde7e65dfb82a4b7b6854f159409579868789f582964a790d8f26883a512f85d780c9edc6f1cfbfdc285f0f791b0ca129da6e47d0c6ccd3be18be9f575e49ec231073385f8546c59f8b39f0d297049bbddc2bda36c22e409ef2a7932c330c6ccdeb16adebbc1cf1fc152640d5fa824788b32e71ec10442f2938fc6be398dff7c7743ca49b69b153adadfb0cedc7bb06ce08d20ed0cc2fdf581a8377dc9260dad86e5d3195665283f8eb6fad3ac369390017870b949fac4692e9f84dc07f280fa44fe5747d985ed1ceecbb70cf95d7de5c23c3bc354f2e934f2019922c409f84bae1915344e262a680fe7e465de3c305b1ab6fef46410339b141b64b9027b7e049a7cd08e37774168228a636f6c3f85b08b5d701cdd2904e7e71b93f90a2137b817f056edf67f41da976c4064c5292a7578c4e2c96a6c3214ed18f20f3efd6d560618a45dd042447436a961de8959a613a4baebd969b1d2be078cdb9b6196b08179839a467c7ee86363ba8f0bca2b512cafaab96c007ce6a6d8c84797bc108679e5d3e1efce12f75f881943df59fe654b32b798db1bea1296d7bf337b3621b5424989457d32713797883a2528c4d4a7b003150f6f272626dcccf6cea01b096eb4b705df46715d57d7a264a03b526e99ad1b7ffb9fd682e559235ba96e2d128b594e50ecf46c5b55b49c20d9644ffee444131c6e2750880e3ad082fe8c1056440c136989b530ef7ec0ff3be1ef196267f25b001c96578010f4c6b184007700ef9b800f2c1ccc898386f47d0d487a162bfca293c7a5ec2477399de68cc49b84ae4c639e2d0fe7411f1707130f9f9e065b8f1fa44b81c016d6e74d04dfb4357d8ba3d73b1f161f3b53d7b8864b6a66a0986c81a9cb84b892055d7c22a943dbec0c6e50c125c28909f03bc4faf8682c05f947f7983a7416ce61da209cf82f1f6b80232a4858d0d914b7d2f8fdd19f8556ebbd548cafe71ee0b93b1dab81fd6c4c9794410bcc6c6bece4a48ee3aebe9d79393ea770503d5dc4b046ba2e704f776b92d83e143a7504d70ca6c4dc881d7bf93dca4aa07675dcb56aa260b973106680a1c795a9f4e059e9bece5a58a50220568dd3fb47421557a967f787af298042845a46ef4a4f851a7f87c3e2be4db9bcc216bce559effc798aa5e4e9376b7856d8e48b7a3acde919a45d3defad441006bcc162057ec01b4d45932f347d30970eca5cd531aa927e882601c9fd24e996c2a634c06afe4576f3324045e09bbfaa1e8655a7860ee7ad41c6f3f1184006e77b3b210650888d0fe3af93f0869b8a1edc029d32c49c7c4d23f479f56130218aacab1ca804bde2983c1b187bccc43d1db9514dd2e9f828d962a66ad5e051632ae087f768705b9d7a3149a433bfd37066c0db86efc741c9ca790ec98350dede3ccd1f7a53f4f1331740689e293337aff105b9a0e65a97732f68e50e0b25d37c92281f60121af889edb3c978a6b82ab2622483b14186169d06b2fb2c0536c0b19a86e1de43f144a801d63e0b61b6af6c07744b2bb747a0f968d518519b8c350b1078324c7387f1711e95133bcac7ec4900e9f13d2e1d048f4dd0522e8ea24f923db7946922578d2aa29272a127cc19db3eeb24b6b45555f58f6279a8963673ba2f899f1aa97578a6cc1124c0d154900890b4afc76eb566533151d5a1eff51ed36a68530eb8eecbcb7bb91afe8a83ed2e17c3cbc4bc884764ccb25c257fb34ed6a3ffdc7289d18745cc202c1e21875e1edea6600e2ce87de09bdc0d2de198cfd148a5bbe9c0ae3cde6e2c9b5852aff75bac69baa52289db2846886cec0ec9d6406f041eb94aef7d9299406973491bd77c05364b0779d891a5e281e1c5d8003d37630fd57c91e1c5b81a4419c34f8264b886d7853055f9ad289f4c3f115f29c88dc9c89eed842fbe72c93364d374bc05ffd23a0f90072ae3c20882a60fa2e70c4eb71174a1531b1a0b56b42b53b86546f2921f54ea6164fb758b375af9240e27314f38082242869bde693c98cdc92548db90ab6d7611775278f55b94a7c18038a8108df4e4970eb86a7728bd02e2b073c9802a808c07ab48eff7b6337b2ca9e8c1f0857cee9ec6f4822b063e29840e19093744837cd0b835fdf1f8b4bf5c7bec287527aa1c18f036cf89bc8d58d21218c5b38f64853e34a8287c228c75f70e271bd0a6b9892b7358e4c79ee37d8bef4cc6ecae855d647a7d644995628228cdd615e917419622db01c1473e8d583242f722389ca7783bb48187118bab698cd985498d908adc96d559543ab2830484e448c6b124e5d3442b28e3540a958385d82635066ef98e148f5994772315492bd01b5479df44d18346f52f14d0ae06c4915bc11eefa20d66ba6c73351ca70017b145c6c01375a3ac09ebd1782798dd90b29f4eaf2d5e6d56d9894d48967f66098b3d3c09fa0974f022722f98114abce1a314df98dd312fca9c81a3c9548b29086eb97c5774ca416f304c430716930e3f9531d9589d1e05680f2d6fe442f717a78faa4d667a5cb26a12bff80655be31e58455ca0d38e7ac42ae5a1fc6873aa4961e99f0587ec7a862e4288c6d3141e138234bed218c4e4d66ac44de66b8b2599a164a6a6fbd11164c5231fffd50fc46d509bce90a6a817bd2eb3fd42eef28dca05b4596643ff74a63ef3835970ae61f1cfd9cd033f31e0a426c4f5ea0f8b71c763c52ecbbdc4ef8ede831a135376c9b1140cc302ea410e4267a8c66f870ae5c89e98a0e23eec0e840cb5e222a14d83c9c3058372776fb9bb75856e5a1902394e64eee011db2227beebe0e02ee464027f0a0246f0d25ed6ae02ecb32e86e015f4f842e72e2085d13e04f4d485d6f5b0915d1e25123e451d35ee5af2cbd365253b094e8331ae32ee31f3d289b072ef3fbda9960087efc8011e0c3e4fbd8381987f3ffd31a7fe2d65ffae59c13b4309a6635e4278dc51be01f8bc909dffbfc49e243e2ae02b3ddb6bcf01b66e319afaebb540222144391031fd58d155645acd45c7da3d4937024b53e85033cc21c6b47a02630474f8be41ffdd5a3c84eb6c486766b50f23f1104b27fcb09b4cfe05323416081b10d6255d632f8f5b977be46aefac8a7839d20d633d2f02d1ab32df53705a4d77596e8769c1e104e77dbbdc85086154e3dce5899413e547e66cd08b846c5c5f57ffd00d26b15c303fd59329a120b30300377a6122e2026b25e7a9cbdcd749ed0cbf9ef2c148df79b53ab0638ac2a2b618de3ab544ec42fe3afd60e895fc71067937a0b2dbc721bdb565e54ea79d6580d5df6dc33e97481b33431933b3ed781a82f4d92c98a17b8ee7f31f12811d80c13078ad8c481b27002d6e3bcc423456b4c42e0b388edf9f5800951b728e27daba796378225cd3161d9ed64855b09aadf8de8f2d4dbf48c564d67e8af9ca3aaa8b6eb3898d9ccbdf925892d41daf8c1e02318f5842489ef346bea69b095bed469316c004614424529892202ff51b1080187d5b3c844b4189c85624bc4451aeb26c4ab4b11d11b014b238c189c787300f16e026e41550878f1763c24bd3708574a1bde56c0d9f075afb1f7fb331f98d69bf40c17f1e878e2ac63ddf3af88e648bc2a7c70241271fa2b4528b38097c5ad53908a1c6d06afea7f7f3b85ac557586f88f806dbfb510116f11abfefc1631dfac7e4c4db0ac57d10553c2cf8360c15adb5640a3ee61d4d683758dec17a7528791e3f85d5d1addac8f998887bc32c4ca0d63976dd4864164b82228408f614f258343ffa9b2fb09380ed99ca8b4741d34f74ce97280e5f58a1b7f08156ccf89882b74ac520d46cf36590c7b5bf2e9bfdf414baf1804353418e30428100af507c534b55e4dd4c0f1715927da687d8ddb9c3eccadfeafda531c179534fe4149f19dd45f75483cb923696b25774293b50c8d6a429ea110917f9f47b11e328c5108c956c988e24d276c27248e901043d4009f3e2da6112e5a978c5ce17ddcefd0c66bc926d16a1662e61c27165c2864c23f0a7a033aa50a9703c60a5d2040d8c4ad06a6a8a471786f1b3590a7d02b5856caaa6f0bafa23cdd5d86947ce3225f06d4a7a158305655c296aef478fd783a6cc749a85bbb4b3d9b62585a912d71ab088748bc701c20adcaa4d76c296d763ea1840cd3a631ad846cb519949e23a892f284931a6346946f2508b6b9f594c38a1beee3f2c3a12f98a88b29a592c0475e525d7025c5d744838d281cbbabc918479dab263fe77dbbc23915d5def1af4329aef9a4f03dc5289305bb8f0f33c3340f3a4856003467fe491f6107f798e597cc42f604e8fb41dc160a5bef0f409a416ccce9332380cee59f52e9086fa36c8f10e0354aa4f5ff1f91782299c7a451999cc1c638abffa42e96863f4162adbafe8c03f1fc100989de499e80151ab8d424974b86106a8ce63e5833d03ffe06e84ddbc00ac90c6876b4ba7835fe12b30c6da48c2da3b5fe23f2911ab2e685e551f1df8e2404ab3345752ed430808dad707b99010f8c1423b6fbec9ae421e72dd037f7203382affbbacc3abe74f65e57f13ab2a4e55afe5cae9114288e21aaa2848450b495ac43786df47a890e2cb1ec32e1de385298dd973a77c6ce11857f881ae781f0f43b145ddf9559d6a5e0ec7d711f1667be6dfcf75e2e5571a9b658cceb406d7cfc40d4323bd6df875e7b91ef531aed2dda26114256dbfe35d4ae44e427db9923417d484767c572524b189e16b7c6e6edca07e86532c2a135b6254b88970c48a11daa2d1ec325aca3ac5367b6755cf213f7a4e70f43db04e944c0c700ce6a7dfb0c98c2c3b736e036baf4ed3cc0092c3c0ca1cc286ec8d843f2d06566326b50d10a142dfb44735b744dbaa8b9c7b0d46334c9ad8d343710392506bcb274a21b2d5bd054a8108c8abf4184e093faa4615c885a37bce5108d4cae5d980d984c8ce553e5799a9eb2e8d602b6d04606f5f708aed26afd746399511876897565bf2f83258dbfd1c03c74872801c9adc682a9af64a2765bca207614503e9180513ef74193b5a93352da858888dd8ef1c110ecce223620e9d8bfceb88488c38328700c6ede7edd0afaa7eb85c8d342010794441ded542724ea3225d24c4905f351a0bb717dce770c302e085896c7743e19e700d2e3af2c5fac8d55316263163c07df14490e281df0bb55c889f12cd04dc43e98b0f6643c71a4bf92e7dea9192b8f5ba6f8b03568df8967f60671f5d21b30e94e535635987cce663fc98b6461f98cb62914eeeb8dc73c4ff3a72351f259c1f6cefca1178f523ecfffe88f15a7cf26a4d67fcfad4def8b5b65858a5f080c688f9b236642f6cb52815ac172430aca3e693a53a2d0189a0605bcacf49e4bf36a0d0c8217456de46888a38578c4a1aad4056dc3f4eb04331e79a9d84b665038a4559a0d98ef4c2d58a87ee482e9215260e854893758241ad9496ff4d4300b421608a38df6205dd7b027dd118c772e18eb05c0cdeaf8036ad3576020cbe26021f3d1d53633a6f97879fb61785d27d9f82776dcef93477806de5d7b99671f5e7f92c48fd9e962039759ae5881eb037627858ce7da693a4fd6b36a42faed74b61b922c4e5c926d71b7cf0656888962755612134f6d70e2adb837ce990611cf1d01dcd4e991f4daa389ebb30459b974aeee0c52e89f2d40b42037af6cf10f9e746445573c8ccd19f1a2d61c123f580a27dcbc997e92ffd5fc686da08ec66cbed780169d32e7914a7dc51477bf5d6f4756b89f150c7b154efead1e5a232558c8b23d472bc72931d5a69f89995f81be1528279e87df63934460018ffe190a6d23d91d9fbb5e2f434c38471d7199eafb61159695200a3983d6bb46a8c04225e4c13f61685c411eea1c8602e812845be9345da621c12ec985ee40f060a4aba585122282417540c4bb0e435d1fe25c6073ca21a08d697cf51c145827b8e89f960373542c65c9fe082e28e9c55c2fc4b81de6720a75c6080db6171b76f060470d78cc4c7929ad59738315fa8264e6a3e52bad5d5476409b4a6ccf9c501898e69a6e70156f05397a4aee7aa3e4144606facf42d912d6b1c9c68eb7f35ed5a2695041c610a0fe520a7defcc0700d136c88032aebbf24de1a27a6aabc155dd77e04d861e35af16493bf1afa0018a2e1ce0aebd2d260fe060972c5041a74b89ceb8b974642be5c561eb8fe07910ab83f2ba6fa3211fe904b288e1f967c5cda1b371b681264938db63b50f528bd6a86cdba87351735489ff47b102794552bb1e349f7e19893498e96738f758f57ba36d1086f07a271576855c9459e7b60a29f3b5146564a2289abd2a1e7cba02519b58c4b626e1cc2623f4b7a5d4fe9bf67799cb19a50a257855de1cbf856f82a99bbfc3ba08829f6775324bb4c242f32681e356d2e20f06d95a974c9587c0dedd809dfaa64b4c8dfdad0f9639e178683d8780ffa9dcb431fca8ab8d2e66c9de4c379bf86e6a5f1e60be2073dc8d2bae5c15fd79c240e5040768ee55b41549a246fc649d1d0db36bddd9cf3e44cfce1eff8bdf4eef1216cde531d01d57f980e55b3d786071587c4bea80812a77966108dcb482a0fe230b53a641f2c84f8efe15491ca1ed956e20efd5d009162f9e79a3b69382549d4fec821640cb7fa91cdf489526d445a0003d5d7688ddffbfb4f3b3ae453b0c09081f9953d9ea15d4dca4e5654b4006556da620dafaea3329e7c195d9eccbeefb37493c776f8f348471c2fe4f8ae276a7910db0b224b0bff6646b428cd0bfc43c04868a04d07a7bfbafa121303b8b7d28c345a8e75339a4e9f8ba56d06252684106abdc37c304ba0075b1ae565bf473f44d5a7440343983628a28a28dd37ab2a5a8a1f3940b72e6faaf20a2337097aa29affda329ff4dec97d7aeb2714e7c646d9319b15bb1fe6332feff78aa56288416c16745f56cdcf1a6460857d417a93cadf1ca0792302a664ef54374d06e2af1d51db77492887a44f61b0a88993f4e2bb10f6ce46e44ff8b154d44f4515feccde6434d642d4a18e772c6e03bf744286525adbad9147dc5756884068cb265d36cf6adcebfbd0918367395e58be7a128ee128a18b336b38c2517ac03a253942bf7bd3354f9b6d3a77fb6748e70fb628007c21369d63aa1feb56d6df32970ff236a13acf2a96115f1db5bb143e8a640c258acf66b2a32205440ce282338a73fd859043a80ef436eb331ddc38b79059f07a6730cf313dd7c17b14e82473579b364d7c6100a49ebd365621c7e9880c841708af7a73f8830e8e222cc451bde49bc89742caeec0493ce37a70610d3b5f020532368eaba8eb9fa454fa319a8a6cdea58321dc3a6a9a45287d528b47ca7570e237a2bd741cd031f58dfb36a220d0cedb0a6c947282072b69ccf5361f39a265d0cc5297c2bca9e1f67f4b1e5b397a18d75e577887bfaa736ba1a71196d88dbe178feb0c72ec8159eb9ff7cf7946eabcdd244488613162de1a3eb9819df8e8470a249bb73291301bc25a723511cdab0f05dece2b888d40c26623efab0e193e5dafb6f216206121ae45ef304ba38d7684154dc9f9a31173b51b311e17e91d1a38ca650a94560ccdb5108c807b4f35d87bb8ab35ce26bb6e036ec5ee7ca99f37274c1c0321b895ea26d35d18d9201012f3670eb24f3001dd8537977e25fc6c2a78de0f8cb2d5ba637610eb459e4b8f2d02327978267ff8de3e0fef788418c1643d6fb7bdbede972676d6d767a0bf80539d96ef84732c22a543d2d137aec519c0d48b7f87673eb4b7a96088863ed3c90390c57b061bb0dc001866a8bf5abb4110d42c601ffe0fbbf724db00353102983bd0affc7f83a79b1d57458ec481e1bf021b6a0e8774cf662afe5125b088aa03a9f542e9b52ecf7158ac2b7651db0bc075ac59e908493b85736a3f49b995039c8efdc6dc2dae1bea05d4433bf5c334e90f53f9c3d5040937b7c0fb62a2c7af868d42b2a861767018873b747290499d6a2e6dbce76d17e383004f23b7b8130e2c70a5ef3b49140417301db780457f136e4b828d888ccdd9d84aa47936df099e3860533948d65d2dab0c5892ad4d81981285871383712c4e9d2e59bd74e23dffe4841399b73453c457a707c86fdb3a3b3016b32e6bc7e22ce00ca77353df96f61ef1a615e5b774d4477d5c0c96374e3d85c34731496382dc3a9774f13f6ca72259d9ae884ab873ef3b34180950adada4a617474a2dfdce7cc534db7c479857c8cf0c4356bbe5fb4b518743e3fcd26002113df39f496e7d7bb44660f59c04fbf32431aeeed8b809f6d1f85cf217f789d0dd910f6f08320ea3bae507acb06c3cd82e27367699bddf6006cbd616b5ff97e112bdcf56433b90cdefaad3851fccb3e434d54a18c6e1658bb7152fb7b4ed3bedb5d1727a720cacf2b456fadeef777e573bbcc167b637048e650a03c73f70e7ac86416c9d22fd4ac92eb0abc76c1fee35789ca42ce6aae6473e638833885dbec99bdbb14bde9f1008532c3715cfe4920e558257af77798ac3eb63133d575633c69b7301b6c6cdbe5a71d580aab42e687492013a5b882a05a98872c07922777632a44e403dacb452cf7c1e3e5df0a5104c9c896a4406a020b0ad5cb49966c75628fe7aa59689adbf2f2514c54532a4d5c7a99ac6d9425c61a0a61ab1a58068976e0d0348055a3361fa3c82b3de9c7d28131ca06e25d94da13230dd497ac163b1dbd47a8b96d8080d5ee87d81972d74f8b3ff84f72bff227c756b32faa94754154e6c67a94d3558b0507e4a8a4242002c66ef2c9cdc7a747e280f71bde2d519dbeea393f8261a1cc73e35071039e1055a6bfb89ebd823bfbdb7bc1550f4d854e61a0c47acfb95370eb4f217e0e77281f9a47e1ca73809b5df74e1f9a78f47de8232ee814726978aa7cfa58c693a75aa851596af55411a76a30a2c45754390f5bbced7ed4ff26a157e486d8e47751301b82288d64dbb8cadf25e6680b6e69cab1ff498b979deaa62616769b0e014bcadc61c2ed07040cb7a3725b3a9c34fdaa1be85336e82afa96d28b0230f513253d0b894bf5264bc424f32c2f476c1730e6100ed8a3fd3ce479c3f1a2fb9de963708fdcff0491887aedac2c6334e606f02b10f0db5d12c66d9dd0c573fafbc395bfadef854bef441ef358ca0a8d99a2c8795a5a3c899dd30ad62de4893d8587da89db991c47a224bbdaa42549bf81d5ee249a0e33296ec78bd6cf7dd5e0d0b820cdf3c9faa8620694a32ca1a510830b3a341ba89f1e77f5dcac97df12186d5bc720f8c2d449c34b85aeb7d7772f0946f5032d4173b6ee5e524b6e8517c00c274d00b84db74891c988fe297a01383be495034eb600fa863604b45b663317722b3ec2abc5711b104899754a99fc0284b9dbb3cc0d761188aca02e58350eb458268925b14f0de31ade245b677816ee9bfd735e5de036b770c0a45934aa95086748593de4038ad4efde35b8eff5574499f9bda99e2d1b66bbe8993b265e67957795432f0627a6bb4edee14d109a52610c2b369242ec93e22f999a052955fc15da06cb56db800b3cac4c66766451ea9c7079509f18dc1ff8d9cc9c179b74626b9e16ffd8b58e6856a895a0441244f73bf741b379489aa812dc6db60406b1f4235771b3c5c5f7207f8aaf034e0a57acbaec7cf408aa5b082a27daab61dd39ad1718693e26ebde76dd9b68172e9c9a6e6dd2e3dfbe365190392d05d8289cc10af273a5a18a637dba7417cfb192fd2fba2bb5a7228d1df833c3c063c86c9de58312e2ca241856c1571986ff6109ca1ccc636074d152e202f3c5229a9d83afd48a66a2a50e129bc3694079c210e5b096f1c532bc4208767ab86fa3d41ef20a05152c81b3667673d790f5a688d7128d8976b551fa74293681626e91046693e0cc2ff8a94ff04479ed1f2471e7288d804b8c4c97524d9661eecc524d9052b02c6aa33bfea6c6399784b30ff1e248adf11d9444ebbbb7132060bff57064a4611bda40650ffe86b9b431df0a326ccf1e385edfbd30395298187650263e657027d9c33c5cd52dc09956302ea1e017fa1daf46f1eee1d9456c14ffa9fe9c9b9ecb5f7ade2f621d6abbd0bc1d6b2695d51181be85c59134a001fc3a4ede63d31ab60dd430b62465df21cd977344b7fa74daa244906f86e3854c3b63fb44796bc4f5bbf8afd37f732b0d20014ba21e312f4d6bf80eaec9816abb3521733767d771400a60d8e30297fd30dbd71af17cde74ec33b64af7905acc1c9eeb6cd1676cfa4e95fa275ea49afe04cb31f905707c96931a197947d751b115e8e5856f36de18dcdf39a20799bc8a2e3b1f0964301a6bf2abe566d77bec303b5f34ba3f0447886304be8c39976cf77a92694d9afd372c687f8c9c772d3112ed0590071eaa288e01366ae32a44fdc5e9b20cded56c447b8b45e1da9121f0e6370e7f2c32ad05c44c5d9796b58e856d9ceca9a02d9a36f67494271eb70ace23e501080a518fef3d26b5e9d4714e3f3e09d2ef357ceec0ea992d318743e632327cff166e3bfd9ef1dd298485725f41ae59fb0850745167addc4e94c62a209180087e7eecb826d9b10e48a889772ded053edca3c7ffbb752c9495fdb05c9305fb3f141ce81ffcc6450f5130d59da43d3b6602eac534d3c56de4b143dafaf79f672f9e85ef20be8a964687c57aff86b4b0919ceb3e3ea74745acc65c1d3f0e013c24dc3ed4cd6e983318fb49862a521e28f5350ba112f79ad4fb4eb78199ad18604b9c67c8ab4dec11e7b395d88d681b8c3c67fc7d48c63fd6e01634e612c6f8c049b1bb4c62c195487eeb12b3ac7a45f3ea75b8f332c85877f438e78b5db9e4a1875bbd87eb3714c162c467ea2ac696a4ca3c7267275683a9e2ee6a05b4380e2db138f2c4bbc344a8b876281aa025362becc02289f60d8575ffebc9933d08fc04601edf0c69a197c8e9db3dd4dba6355bbff9d5ee50c20dfd6ed52187db492e6193f1ad02b7e6000b02d31f58f619c59fe3a6a55e61d1ae650fc334a7f3da628543a631c7d723cca65a82e3d05ef7b77370dbbb4305b8c6556f17ec2b56646a851ed8467c6ea82e7e225e7e32237307713b77f78364fbaf294ad48cfcd119913e2184225232664bd38b380fe6f1ae9052eab751bc7d15f122647ef891d9ec257a1c03d6877f1739363d5bf48badbe44c0a6ad52b1ca94c0caaf7a731077cde3ec6d7d220638142d1f433decee47a08c7829ce51278ebeef69b563499d3fced02cf4efd905e0f15ef3ef68614f564af2f19c6d939987867a7a1e3b2653b241537c9e94aff7c95004481c09333a929bf2a7c6dc028b04e441bf6061312ad78e4150af37e0c42c779d7da33d662cfefc14c95f5e4e5a9867dcd86f8b5223f2e923f0c3f74563fede20c80f0a2f9e0135e8da4e91af4bc42bc5805ec69c81b1dbc4fe9992dd81f1474f9fb7f34082854fe187ab75c22193799e259fb1ae3dc3ed840bef0122806f2ba6d1ca3727d457905a8de3e4850945f1befc3ddc7a5cac6ed7224e9aff26f2e9aa9d656948fb700b14be271cef24ba0783149bfd5738bc607f735e42a6f38c68cf78bef79391e34cc986a33f2b428e7b4ffeaca5cb110f2a665800f80ac1edc3b25d1ca8dec026df088288084de2cb48b4f16ab074e6fc6609ccfd5f8a3ef67d90baab5ae1fd9d312b0a2177b7b13f9dc9dc8241893e8710fbbb2b83881026cc1e652c4f0a108cfd19d969391d5883088c2d9efbabb30f7b877d266bf604ccefee00ef8c0b5f5d60f577d613bf516bdee9e2809beac314a8acc324bef60a08639f2dc7b296c658ad7ccdea5da02f64b6cf0c49a23692481b44b05ca5430089aab2f1967f81a72282a79144b947986b5169c9e780d2d10e8f04a959d4abb1f3705495fded1d3647a82f9807343fdf73abcf5ef39dfcf3d3c267eb276a3e438bd32b4c9b62132468716f1320829e672eca697a20a15ecdac2d612bd1d32de9ca4523637630c416a58b6875c3f07ebb8d610832f3b18683935265da1be80a7d35e24a4a5fb03d0f2b2e340ca495d4471e7f5354a0b267d0ea5e528e9d3c34e1cccba102f1db0c6311884f762fd3164723726136a5a4f5059573ee938ee737770f6ea8afb82d6c7f5ec9f4076fbfb63e5dba2da92943e77765d05d47b8694b6a83d36c48d224fe55374bc5679e49974455862477b50e4f6a4635d782b14e70219e544a5b3771507009661ac00fa0c1c9d883ccae6e5c8a2787f541ea22ca1c3942fbc86180eac020fc613c81b603a0419047bf42a3f74f2d5d1a7ccbe9eada3cbc0ef8aa1f8145712ad3cbfe394680491fd6d055ab44b0115d489f2ffd9ccb7a0552eb7d364a9ed58172d2f7da8dedf4c72f169d0a35f2f5aeaf91e06b93d3f96ac73b4153a1ea040d5a5e714162750486f2ef4623c16fb82c57c2e0338f1681f4d62f63f585669bf726ba2aec48c9342314af5c52d106195355b8a296a938aab37144145a9e2f53ede480b4ec60aca8a1097a9aa1d51a2869c0253d081db2135578f689213a0ed46ed8228c57670c83c06b67ea62f9baa8144600fa242fcb379c6649b16f092b615dceb0701d9d2a712dd2353e14c7adb31afdf117794558a99f3648ee579c4106271c3aad1cf05f2344641e0079484abfc7c8b687527708f2db8c7f89030f89f1507869036e309d3b0fd5c0c00aa0f64738047573ff1a6e551fe4929db1fdecec79cbf66e7230c710d4fbabf6bf2455ad7d3e7c7cd6d847adfba72e579b4f59bb91b65c139a43ddd3084d83fb56a2361b052280e4888f28a0928f719843df413af21a032cefe93b9c27413601d75020bb4c24e7bf6be3068a7f9b7e0cea601c7dddbb45de5430e284e6e8747735703ca118010401fb8734fa8f06c568c39ad01a99aa03e5bb4596fa06451f796c7c62979877e4cc976581821ee49b97f844e1f57583da5531b087a9cf221c4b8f951f35bbbbb3ba30b4878f0436711cd4b427d766bdd775be7198708b9611c36eb25152ec9454249721292be0775871994a6762099f350f2adec64391911298ee20f12918c7b6ddd5ea8524b38c7aecd1ab06cce3c646f759dd3bd6f431f323c6821b0829ae141cc0572bfafb4a014f2753e732c90c88a2331d22931017a797547cff825e6ad8fbb4e8adc85e6d7148ef371a68f1dab52e4694aa091b22d4d92ec647ff11fcef1539272f0d13a3c89d8ed55b719690ccb752b46b8986a689514ffc0395ca2c389718d81e4af2cad44e6b29ab181428482f33aed4e54824b6ca359b8cf3b11fc6d82ddded52c696a75d5b7c83f72c4af3d38a45c86616c8b2a265cdded299041af473e662404a8de5135b995fdd75eef6b3809015c0ae7766d0ee7d2318e1a575bf5c7f363e241585ccb919a0aa6a245e29bbfa1c89f53e37cbc91940df806babf7b3a78eddd843faf9145408377276bd7abc89f8e4a247ae97c6b913bfefec2ce6fa4883aad56ab7ef2be4ec026f34f23e4aad8603024d91a4eeaa10c6b4758d66c7f9be53dafbf6305dc063a20f6ba426b792017395fd33cf6e601182db79203b487d740b9f2ecadc599d3078e71df6dc1f430dcf7993e5f9a110d9fb7364258ce965ca9b2e405caecca5482cb2a2cc7585fe1df297f81967b544c87d07c8dc08e306c6fe074946cd2eb9ad87c91c01e44e26f0f8fcbf9b36b0ed86708da114b58501218d49ad969b33f70e092916f88955594b862b57358c79ec637cf6f464122268386c9cbb3883b1eec0cc59c3ac43011182686aaec9125689d83651a6d97d504b63e77fe301d36d99f5508942ebcf50e291d3f18d29784186975321c8b6e70ac903fd66e4f3f45a6f60fc97a3f582e8fe86e0e906c026b0007eb3ff372a52f274c601f9b332b4c92e1230988f1e66eeb7c7cd37d0f6b4b54e739a0a624be0be017dafe1b4ec26f7a68669eb8c1b45f69f731e286edcd83ee91e516a909c4e03d7f0d55b144e6bf9f54e73a4d94183719a79ac10743f830ee73ec5cde2544c37e83794b758ef764df0fa161ddec63dd05a02b7e5fe4415a5bb84937a827e9d91e85d9b117f73f91c9f7059160b897a360e63c9cc567776fe180c1126b5098f9e15b5242c43ae8736748e291b7fd3266c9ef2154da55d2a8f0f5c1a78e826db49cc54a6a552ab472562e3d1c176403619b7c3bd028181f09f669128ede0793b6bb199745300ee4f88412c749c0f03630c0ef76c826b269f846647c8ef357fbeba445b282b096f888e2521185db250322dd503c0db28d9a8cac23eac36f795d5024e109d3f67b766d777ec56ac4ca471522eef3d78809938ecb6bc0261033450daa9692aa941ed5d84de86666daf90db2266ebd30117bf00438b519fc41f3fb189b10001c39c34e3045f01b8ec646cb704ff230ca1283225bcf6624410d84194867b0bcb6bbd1d6cf30d588d00d02f76588ae1075f54703620d42f9b06839c8872e4ff303ee027d52990ca8aa49b10c02abb27704b2f861a13361780b66cf3c3f832dc455c83321f8e75d206483535249801ab8e424ee1cb3f701afbb289a5708464c440272533df34ebe63f815a9e05580d5ca12528b6ebdce63dcb1f443f8850157d79150c38eb250f4dcdf0b4da2f27d69cbd5565e94c0adbab227f2fba2427e9967d37fb1087f837ee2745ce67f11dab633bdb9131c1e23a034d186e171031ea2da850cbc7a65f4ef3281b989878b434ab0f6e22b61cc7112b0a8af36217650aa123bd5b0c7ca36ff2658c5e4fe14aa77db1f2b3a932d6aadacea9433c3b106545cfa530bc8b2a3bfc7fa9ced9ae0c3257325e02c5854fcb334b08e54a90cb8898666b3a4e20ce5b14203d15da92fc5dacb5bc37e07b187fec4d41aed975f92801e4497bf235d9f2db645ede70986f0693c5e705e8783c75a39bf01f149b51e355731ca928121a12ab216cd59bbb35f061b73b84c4018b07184fa13cf354226a9766a4779d2dcb3b3e844466ac6813af2b6ddead5127545e6a4a9c7052f72177a737d8f34417f4ce4bc2f00fd291367642facf17700bced831d5d8713580b0f4460e15d86cf6e961b7e0132a722366d74bb81b0312cd5b8d451651399214a71c478d7ffee71ec1307dad1373cf5523ac28e795ca5a2d97375039e008d10b2e17b803b89ca2da02a02c70dd570c90917676e6fe65a2c81eb350b4e8849ab71314c4f3a7b3d3d9af4fe23d6685ef1e787413e1bd44e145f30ffd4731debe3ae6dce1ef3c0ffcc587718bb11316b1778c344b31a5c0a24f5545c7cc7ea3b578dfa289c9f895a2f60c1d5642309bc30d46b7054e4619895a84896939b681ef8ccb3361a930a57f405b0997fc496f6ee4ee735de936338d76e4c149f766b3554c4bbcdbf64872e97d4e09d7e0dfda146e62c6f1d95e89b1632413fbd13e6dce8fd3391233369f3dc112c469f13e0b43f092d663debbc68df4b69c722af3323105aba15cb4dbb834d82b1db12c19705adfde5cdbba787fe9cf77dc93d5d4d4cebabda3de25986318c875faa1caeb3435a576c620021b325bf58a772cf6d6ae748516c7406afe7713732751289e51d240660f381355efb84c2f8c07bf9be8f254cd8f0e6ca913c754725cb52bc219bbe64aed804bbf4676f981e4018f248ac7949f1ee0eee70a8aec5a1242e520673bc06308453c6f9f726390399b57560bb6d8d84dade40968d417ed0e4bbe50b6eee04ec0709b4c1c662316eb2a6ed1b3898865d8cae6a6e0e3e23c31183e74005d5de5ce55025165d2f2d73a8e3dd3ba5080c541e6dd0b175f86c149bc19a87ebdbd61f9d929bac5ec03910cd2ab201455e2c29441e1f52d15a85ce349d5603daa3b72a7f42a5e35d43c423a596b7bdc22730db429f6d4f880b717fd33f4e2e81fd01e6ab9f5723fe406fc652eab2621aac41ec1ca94cdb520b386eb4c684eafab62eb9bf6d43c79af3351a8a610ede5a3b11aca82428d4a92f8cd90a013edf3fd4ad80f27a04f89e4a93adc40eebbd4a5c83e5af0f389627c2d1b28c778592e783eeda85720e5b534165f3be570ab7d734837df14a3a76f76cee46782c32c8d4d18556bdd2ee737eab731edc34144dc49e5b7a8287ea49a44998092379d4c15320d131d3a2f3525b94ef360b38dde117ef2c350671ebb289e853c1d50eca81aaa870ba91400c22dc3c46cd8435c29e3f7108ee721ef190b1ad755ff77e20dbf0831178d5243edda9c0627ad6067a47dc50de1f1696c7702a32f13e25a357556f968538330d1f76084b5e78c8236f6df06b8b0862d1ab7ed6e1aa6b6385b04e0ba46b6f187f72525fe1999ec0fd0ce63c80cfadc4b39f07bbee5bb072f154bd0b1244248304c85b58ce7832242cdd087bd5239e6e19621e3ccf4a84295d03ccbbd233be80fee1fe546679889bc8a4713cc7dbc97c8489ad9ef002ab384c61813f23289bf4a563bbbcde42e8d723e25fb9404e40212c1e56c92832b18e09c0cecbeb64a142c3103b101e7b385e8c150c79b8026338ad27aee64bc222c1abd9c59dc78225411857b9e0e65b994de491238a6271268a76d0b317189f2d407ec709fe2ecd1fbab00519c5d3a77b740d42b503a915539c17676367c8d938ec5972c0d53a192f39ac1d2c93659cb1f0967d9bac417498b779d794a92386f7bf5146167a91e51e89f807d9b0c9677ee5f5baf4a3b443709326c9ffa5cb5c8b5000a497108792c657b73e4e44c1514d875df22e80ee701370c33cc82d546dfea75a02652339158103f6ab434b1860e3f002e93dd74cf00a767e3faac113b550c0580189c46f16ad47ae6f88b1bfec7319ceca02704494d04b76dc026d8a62ff92369400489337cf139c3c4914b64c6d718cced5ed38978702ae980964ef5c25af0f63180c4206f5857909e1f24e54c447619bd26f9730354aec2b6bcd5a5364bc1c45678cfa76d27e2eca15d707519b7ec12d97c5731143a86fcdc5acbc94d5d0f5b4f63132313d7bfc157856a8825e0468a24b203fa9c2360ad2daf0a2fdc274de0279d94b1a1cf82110d6782392ff067c5bbc9c9d9a651dbc485b8cb3ded13f8274b45754a61ae571685d7322aca7b40d20cb3abf1bccfbc24d3d1db8a0cac4a983cda9032d30e63242fd5b8bfb5d3eafca0a87f4ee668743642ad389ac462dcf24d54ec27f3ab47d958ed55c8948f4e6bbabe4d85fe2796e984e6cc50eaedd35289b8a5eafe64471db29f91e6bcbad866d5a2b7cf5bc2d8d4dd97e32acb7cc84dac0929362357d15522dfee7118cf82befb9ecaf28246112c1da39d65c0e29af2ec4267b12753a115e97e14d2cce25cd0aa7b8ca337f4662003f2ebb5e14ae98b18ea9829a0d59284f62b5ed41ea4e1607e7dee5ff693d4e4180f9bf6cfa34ce3d31c5c998a205296495919d6bb2a54ea133c0d55246c41a24eb1223703fdd05adf90ae14fdf559154254a2f344724b62bc308f396eda02d7ae8257fbdacc93ab33a2ecf4277fb9867b0bda68d4daea52b8e517052400cbfc81461a178028ff9a3145acd23cd00abbe6d2a4cb0d61ab9d22c59036e346479284f964c2ba5e3028df743bb9524ce8c9fe05c00570c7c53967ce9e45b53ccb45139e8380c3f49c1ad150c5180b8d28cea6c3d8f6ef80c78313c0a792dcac0397f0a248510217519b739b4920cdd2da5480f2b9b25f7526f40290bf5bb3bf833cea72e9ef3bb4e617716ac16c85363b492e459b717475307a7734aadea6ca98ab0522c58b1ecd1d9eed81eab75e6a1adedcdde6cdcce195caa1a5a23d293c8126a627eb70c272d654c47b0b5cd74328d89a06c2afee8e93dfbf8f1e75985b38729fa3b05663a06508946ce786dd997aa2587e685a5faf601376ccd9323c35c58110c84112122ac004d03df576a06bf2c30a890740bec4cd506fc79c1183833e96b67d694a834206ce59d0c626bd878949c6e92c869dda08b271c19d9f99621fa8ff47a777835c339485efe0e5196c96c6b9a1702fb2a0b5166c9e8fe1f6cbbed7a45a63dda424e7047a60f584ce1a81631f90d4d6f226eaf93778a4c0c710a24db833651a16d913121438f175db0b632723f14e3fa845806874bd7011b8b935116773903982725ffb537e795914fca03c38efa7e2a2449259d2fc31b06d15fffe900f40c935724320a1ca5d4300a1e1ee689d97af6c14f64ec25b315acf780b43456fdabc3958168c2ead4c1db85ea4317e25a83945c9f7283ca6397bd66c8d18440fbc3987dd63d031901bf9d51f899cf0aa637861e6c738558193a8ddb7ff0187f07d519a4360bf3a3b22f07bfa2f06d406febf128063c0afde37e6b241e032a6f4453b366674cd7aec3401b7857c0c63f7502d08158f25013ca28670560d3ef51806e05739b2705c65b1575e396e22ec23fb506fc79848bc4a526b44c500b4dad7a93cd7cf000e685b486f9ceaaeaeb71f423c38d235879d7ac2f9c695578718000f678165bd5df8715b196af383278f6f122bbbf0bc513e91167aa3e4156599bd219205762fbcbe1674c31a6d05fc073fee9b594c489373671b8c0fe9a901d77cb7a72c76dd7c2c6bd10570f7cba7a6dec7357567b1bccc280388b84ee078217ee862a30e81217913d2aad475398a7516f20a188484d27cd7b6b6e8d0ae5b1f5e195cfa5a07a86a05e8c71d408b289fdd15b77510d8d6c691ba161d7e8743c1b0fd30074c8004481f9985c1eb38d667b90048f526230c4af9894c8f9a65ac907a947051664caf106c8adb69aa3e406952f7c313051e7a1a9912b93d28463f20f166043d65b786e370aaf54b77177168d56019191bba8a037617d7d27782bdfdc8ae9ee23607ada495e866eddb7e04210b066cf7321fad543f0440335f75eb7fdc0d913c8af2c846a12a4bb60c1bc640a6c630d100a83a12746f1171ea8697798ae89fc117dc2af1c09cc58b8caab6a5f99cc89e11017377b6cfd131c706e43a4784d4419b67c1f1390186bee3b6ce1eae9ed8aef23492448b9083e47eb31f3ce6ff8f70c0a3d07053cb2a1e196438393320cf5ce2bdebb81cb053d619b761e7b344454999d2ae30b24a294f0dc736ac0d07698badf5091d620ad6b127cb28e92982f8998116bde8f5b3695addddf3cbd7f08b3fad945361626536c3bf98f0030a82303a2feccd1a9f7ef0b02d4b8c0a0e565394170222504f37c4807b405357a8e02f2247b4b5f24f5bce4cf75a2e18499ac13c0db8285d1a325d696230ebb4e76003ab9a694d16f557149fd42c43a638533236c6e3e41b166a9734ea777431ff873ed86363de6b591156ad1b6e7e85bf3ba2edb39e94c2d633e89cb98b10ac53be5a7c0a34da8fca02950eef4337c6fa9fb3a33c15a7b845ac80022e379d5d9713b4cb4e530dd41fdfa8fcce43d84d3b224983e01b9e911849dd337df8b7f357f155a507d3085ecdd708ac6aee6046c6351d158b7d8c830f1a697a291e1f9dabd58dd1f48dd4b80774016fdc3952c21d42713a0c5e16483b5a897c2a9db1159fa3d3e0d167e53124402608b40be6df1f78b8a0bffead469ad992734fb33f3ac9bbd17d2324157c8925e23c9011642e8a4ab7146141b5e090a40272badc9eb39a817ad46e29f34e8b5bec04f9aff40ce4412a25886e635abef808f336c664946c2f71dc7f0cdd1c1263916ee75a354294ea2ca7acc86e132c57c82ae420d2a5becf3958876df8c1cce6b3f76800ab2563fda866f46e9beb4154754ae64188c815e5cf820151677d35620a1cd0d9cc260ca2c1a099e7550655194c4c3cbabffeb256cd6ce517d4ee439f3e972dc674b0e7287eb3e335e7063dc19aac5b9b4764377eafd5bfecb6cc1009c6e697905e94daf7baecfb0405369d0e4066eb9847f9b41d476a96466d217fea59e61a4241797135042f0034f76bf0e0c55df4e3ca2dff639803415084f997c02e05b11c11bec1c0442eb817c10851e87d231a3477f62d7b5c3cddc6ddb217ad53e338656649fae796dfd7a57c954d855edfd484fd8a655ed9e7823bc9fed3866737f1bbec4321063815b5a5e25195384fcdc433bf545d8068fa4e635d7d34dd36bc764af6485ad3f52650e5e83217df9d6224b7ee8f275e105e29df2f792475d5ed24b9934a34c61881155ce113db35b890743241c763a076254a7ba562893a8e7353e89e60d4698c7f8429dea68fe1626c951a8c3f21f1ab907f6db5f4bf143bace01a1ea7d8d203dac51e9dc3c945944590b9bf42020f457a92d9b3106d8c7d12afa4af0433f2a91bf3891430716f817b58c263c95de7cd3a0160a9a5db9e1bf4748b7db34636dd2a6b47ba5646eeb4a4cff9b079e2e87a0e626e44899df30f2fd0e2de80b9b32132836738f7eb5b800b75e3ba6f6dee2d5a7d2f0c501aa902e8104e8e05f361112076329e234a813de0d85fc85033b97d225538bcf721793f931297d06415b6343a11d3684e00222315bc21161330106bc7a181f2615aea81b222dfde8acb7897f48864f2d426a841989ac9fdfbfe84a335c35a4c720fe1172ce39ab022c055baf68a7ff70c2aaa985d3d760612389bdcd213285f0c11083f75baf1d597b94d9640bdeefab5763230b2a5d10fac3360e3443fad63515d8d5ce9263ee43aedd7dd1a2bb8778a29a1a633a7e9d002aac3d70ab111a3ab608a1d85e263c43ae288c66eb67bd27d4f911f36ddb5c9b5afd7343326c1f435d5d6e2bdf789ab7b271d8c0c2a7903848fd69aef90b29e76ae58baeb1aa6d3575fb3511cc52f66a2fc7b28da7643108759339f9d5bd5d6754b300de5dff8d0785a13c535058c2bc1c19f883a6cc080b33aa507490d514d9819954bcb590287df17294f8a2203876789c5a707ee0c88b1b8ca3c7f6a14238e6533fd64f6b1ed2385351a9bdd90743be0364c6e3399c51a764ca123d38b07fd8f4078a500b637912412db9da72c7b0ef795980c3124660e88abeab135036f38b25d964666a7857156d0b8f24336d38c552c7a2820713230950966c671b1bf8e0a79cd009e36c3a549cac551fa469b7a0723665c314c75cc004427775cad594a11815ce7e783e2fe1df09476b2e2420522f68a48d9405e8f7332435f18ad47ab7cf48916ba9d77af24e726b0d2ede50f2e2ae23960dc8879270020d49985039b5523120a180368ccdd1fcc96f1e7ed3c43ac34b934e52e1d0c23964a2e255b9c2f05abe9cb9b0738b4f55d5288d6475c993891f53839b828e110679b0a5e7ed1bd84773f2e616d89fcb11720f52262342813632264873a1da53ae864c476b488aaec9e3a16def5417d0b460c7dc74e952508ecfaba984e3dee422b60642763e95d7fc4263f70e658e8f9406786b2e953a62fbdad6d1b70a8fd76b3b02b381a8ae4e546a660a5391c7fb24cf3960720cacee9f9eae3fe7024a0cc0367eee2cd3b9f0e02afaadecc12dacd236f69d5e51e8dd246c2441c977a82ba3445993ada419c1462c276d61e37887baba6deaee8552bb71f448881ce6b09d447ebf746fe83d8dd5746904ca787440596480300f23d3fe4136b2a9fa8e36e8c3ead86aa55c2b998e1e76a0821299e2f8d616e6a926e6b30429da796f5bff62ab1a67d828d843da1ff0ec57f203fb94ece1d94b595344fc00663930b34c61ee908db4970f75786c8e3e46959835d2e51221f183ed383073f0f7cc4714d3949de9426eac65a46aeeb8d3dc4f57507033716e4d601fd5fb444334fea08f918db76b935bda3d12d174d322976c0f1d28bda1ce175eb32aa7647970acfd9de213e29c848dcd9b496def9a3fd37a74d8948778a661a0fc3a85a87010087bd9eac05549f2889b6e676ee151c24a56346925ff1c0eaaa5e5e7993345d38baf0b32e6190831efc4244c5af6854582d8d7d190d0999bf672bf36493a159e45268e578771559e00225efe6d0861f480b601fd6c6e01b23979299eac5aa8513be55eb09a552ba3fede808b161de738c019e0afa7a6d2ce91f2b936aa7b971f051a9dca8c078804bdffe95af0b45b9feeaf92f1561a2d131d3f7b35134510f2d64128788e64b417ca73b3b047198d68a5729f94fef799c36b8ce8461ee4a9ac4109fa4dab9c422173316123a186fb09cf6480d2177f2a7a5ba22a72a867e61e436d1cfbfcc71de2388b9d38951d65f6a7c35ae29f5520579edc23eddbbe0a1c0222e0d11f687f9b1439810e68a4850afb41260aeeb7d9c801afb032df5afecd7525401428621c2cf0760fae1332837d48a120706a1a46d7679af979988cbb3a0277eecf393805c6917b408db175d7e7a97a179cf2ae58609e41bb32e4763b436522b71a60175fc6d4dbe2bebfcb0490dc215b1e609ba207873925039d9cc4d33e2a8a9a238953483601ea51bf71fe6838a56829ffd4c9dc7a3fe76118fb41b58cc5ced971f5c87e55b2a928f11929b62631e577b115d773c577e98ca9d901fd56ceeb26e501ba39303146be2dcc0ca8b83c1e117c44fe890ac97b1b0355e76848cee07b21d4676e505d2fc96669675f1189d6a91e83c6356e4702fcd7c4972554cfb195e889d773ef018599794dc42b41d380c35cb75411196133cc5fb908817078220297ec55bb64005b2107d3d6d6c01d29141d0a9d8e0ab83eca420bf1aa2adaf2502123724303f95dd05edd35bbb51f26984d9fb5047e7cc3cd06382bdbdce40c8f367cc581719f888d73dcb472961df54a30d2bf235c3ec000c5bd0e1a212309c5aebdfbf6b4233f1b22b3eae72ed60710a9cae2eeb96cb572bdec31ee035227fa9e0999fec0e225bde4e5b5e2da88da61d54e478d3d9e1bee65b6c5b046164f4a1521606819808acb603c42e47f9ace1e6b4f8aae176c467414f6b2f26af6698cb3f69e53622ce44cd050442cafa370aa581e1f9cf3595337efccc9243d81da38b2e6493095621bfc72138aab9fd6d234f0d4aecdb36fd25ede19dbf15647968488e62b177ea4e24306fe97ea109df6e35a4850151ce498c74402186bee6bd2ad57076cabe180df541442ab757a662073673bb0d002872257584ed18228d617d517772e6a921bca7519cdc2bf5b660d6cf2b1c1e4219e022c8c35a5bb716c2f1b09f08d4ff603bdb1da690eeb0f3354fe228f69bcde131d94189b1bae7bc9b02832c87ee8076932caa42bb8633628db7c09abbe21a96502615b7ae215ff032db8ebf6d0d3fc4590a41357c469a26a6864bef77fa7ada772235841901e2c6514da7616bd0f71e34345aa4511a631c9be07c2c34b427494422c635c38cf9d8cb197c804c72c6301b99015763f8219ad5e0782e9f3f9f18270aac7374db076ee80e8b6cfc2f080c193a5a24686289114ad7552b4fd45580d5d1b7535e8af4a17baae24d799122c38263ed89d00025a85f1bfcfb7dc774e915b7e74cc262b71037086819b23527d30268df8a2f09be07a7bd347a5b49cd73467b9c0f65c1855eb8cd4cc3c5de66d1973b408ac479fee5d2aa1944ca8d813dd2aeb5a7449eebb06647be93e4d9a22a21d479c4a239df0330f60033bdb93a34b947cb0741eb138e156dc7026aa6c155a883f19707f9dff9128f31d2d776a3fb69c5329e475a8d125d1fcb402fc76184e97a6e62ebc3e4cd2bfd03380f3ab7c93bcca2914aeb9176dfac7728d5fdabcd9897d3f750a925281661d128ddacbdea3f2ac9655a191e5d35fcffd8377217ac4f6886cc721501364cdffeb2c28edc5c4e0108d1b0b21edd17534c59d578b85ac282ba2bb2256349276db17abe2fd737d273617b8b7c405e6da6a08fbedd52531301bdcc11d3f16b58bb79b522cbb8272960462ad6c301b7b5d7a69eca2adf2d54dc9aa723313c5d279c3d02b958cb6829edb610d569135c5f8f20a0414b9026b71b60aa192de2c696cc69e745297b4f8d76fdabcfef04640b9429e52101445a035c7e2f1ad4539acc45f85bbfaafcb41b9efe6101303235d1bc8853ab641838f02668b225682c3e09c41f152f5d75e9eb49dd7e8779eaba4e37bf15f1a8802427a6bd8e39e1de89a197b86ccd014443320e4a3d9727910c78fb134cd9ec3ceea72dce210f4ad76188d162e0c5c3c96c85c7b2d6b3821f5047ee28e1f6f69f7b45fc6545573b7e2a5fca957c56206a63cbdf0603fb82041f5cee477923c564ea9af07286ed86e3e943cee5a2d698b2a4333dab1c7229c7491d66feee2e0848eb1120636e62120b2afe077f69d7b263cfd04ff9c4d4b4b4ebf3cb183c709b87de9ff3343b000fc37221fe657cc98e3ce9485356a1e8418609192f7d90983835d4979c9bd0d7a523df3cde629365b0d7759b136bf2ee9b7d062446738d6cfbc3592916fa6eb116055931cd03e37f01945829a34e9071ac774e9662ef637aaa4cb58d56fb1463c542c980b28409c446b7a54552f36deb2de0cdadcb569c21eaab54c4a12b626664fc7b7c15c33dda4e2ab5257bf3f4103d1c70bae78a72c1189ade4a82d6445ea3aee090279f86dfa5f95900eb578e3ecc7f8bedf183306404b0383a0c8de14e97a73c2e57e9bde4fe49ab9a2ee61c3899a92243bcbe433049188b79d56099f6e4517dc35021e1b89ec125167bfabdab78f248f624df6db61d592fbe98c881c301f3bcc3adf31567b5348c481d743905ea0b387f2b401a74d59291760434725db3fd4fc873ee50825da35d539437ab38c5a431cedb06635c9e79d5f9b74e61aec5959fdf01690fbaa7a7d5d45cfb1a9aca0925764b82c8bb0dbc12b1c01b56b16ce10667e52b42b3a5a2600713f7222c85808171a0cb23da9badbb8063fe18a17c3441c5f9c5fba8ed43dbe80007fe2940859f828a943d501105f59765294bcace4a9e30fba35dc9df7284ee6836187c3939027b4e4a142bf9ea49ea8991f80bac89f82121e9972b74ee91e4d6c6fac5f09e0ea48e1496b7e25f8c997f72db4fccdeb838e6acf5c4229e52d7778f8726d37c716b642c125d44b6b1a6b80030e9305a6d855e5fbfc522e7e84baa6180f0e1ab4320fdd5cc51fb3f42594489ebc886056040c449b94a87f875098bb34eba2b8c5220898e10386d6d109b0a3e6a4b7c00e7041130dfec6c0c3bb35aec83c87ed647d0edcafd3529672ff5427dbb4ddb04e4e626b309f7603fd8ccc12d18d9f36badcf107e98b4e42cd0d7e7a88de530c8f96eef6ffc0ee1eaa949f9677fbebcf354b719a0f64f6e06730f54fe30aecf06cbae992e431b52232cd450f7e2b8493ea3176cf508e6a444576332a81306b372f39e3aa2bfcb52ce21194a2027470661d1d034fe5952427df6368177d1a0c14c905fdf3d1ba8ec41c4d8a81cd843d937965284df5883880cba5dcc557090cd532081f34a545cd6454410ac6c49f76605f6b23ca11404896fa8f962b47d831d155201e7ab9a467423edbf3c7fd525d26906ae60ad49055c0eef4af769d5aa8da881810905c7c2738e04ab9ea8a46a743611543bd33c5fe85fb2f7716dbe2f0f14e58260ec6c191aafb5646d43463b69b13d710bafa7371790ec2b02b4895a56fbd0ba63938dc354b32b14a0b44a158d497c7de57f4e735943d7862fafec0cec211e6179132306f4dfef887db77ecdd2434a2c1bfffa211ff4af7913880545f8603d86035d3de414bf8608c447ca742a174d0e40ff708c7c6c067b5600ee58426645b03748d0edbacbe8b5792e1b3d91dea71a9f47a875bb8b37b9868af6f89450e4b5ea9827ec3a9d9817fcbbcfd4304dc86501e223349513e44a7bbd6c70303174f9a7c58049bb91663d7c951bb34b7ade53a3572f4820a9eb7dd6f3b8ef99d302ced5f20cbcd0e8a59c775983fef74f78dc97e883f7ca055dfa40a04e52f5598a292e034743833f68da7ba5d01d2638d1f8d5cdcd1728dffee93c74067eebe5c41db3d5f1a8b3a944dff4b9a6cb7a5c3b4061d7e923f07494d11f8d239839e460c6a605c3e781cd2e4d6422ead9316fc0b025d7c17ca8efd99ff1fd22673d5c9c7c281ece263ed09155db867b515fe840b0b2da3baf735c30d630fd02c12c5774bb6abec974cfc82bbf0f30d40076d310930ea8ab77934d353498d030ca8335ced0349dda6095501be53895e4444db71d774721a61e647471f2959a8bbb3dec2fd68e437d3af57021ca1c12febd5a551abf0d780c38c286ee6c0179a859a1b05ac0b1af7faf0055a9666543fb86da2a0baf954277fd91638d477d9a4d9f464bde6ee4715a07b2a14ebe5994fc8fc398c1655d1ca0a3aadf17a9361d71bab626ffaf204e0c9e909ad5cc989ed901115cb1ad7383d9744290fab5eb8bd22554be226bf6196728d24442fd2b1685d07581c26355c870ea550c1956b6ddbb0d357c3a2647660d751da5aba8ee5400a4e85cb39753213d9272289a3d47a7630f913818a6ddcbdf97ea4fa269999432109aaf249e1f4561b8bfdb2d313791753aacf0c300f1f951e8d21be5180ecf14ec5a668692d82f3274c49e7c9388eff9ec02bb3705845f044387afc1239b3a964ed5bd6f51631ae1fcd512c196c908d8b7e13461dc099e628e7cf72a877f93cb7a6023879cf08a86d154102416080efbf37b4f48da15121ac3ce2e9a13df55067b02954b61dc8cbe2fb0ea118ac1995e7558ffc0c44aa84f749120ed2d5b20130ffbe44baeaa6fa0ddd025b404c2808d77fd6daf0e4017e48e6fac1754f102c86b3b6acbf208c3f0008461f2d1b214ba7bc78bd1cb39780c2d747487759ce8cb1238c6fcbf09475f489b7f3b6e8d9b9ccefcd79618df33ebc2879b035412da9093098358218cfe015e7f81e2669c8b481d6474063a64283d92bcbaba7c2d75c4d567aff9d7896b55ca969c0ca6a70103041d2a2a15bffd1190ef98373c3f07f4c5ea74139df5b2a0301010fb7b2451a80321f0ddad0876b41303e9023b009b13843cc965561820b977b11a69d08a34169065fa06a9eecc6427fde7f36a8dc3e58080a4602bc146a05caef416d3e613b8ef5866bdd9a332bbad95ced5ec6031767ae6d78614ad093fb49a7903952e6efcac5d38029ac9d1c759015c834d292f3c882f0e7bf282753f289e952f53785e8552974837278f1944c18c0d3a8f4f92529d10ef8a7f05d98d602d53a480c3650c788eed4e96415075da71611619b4af653831965502c5ef6e6658df81b56da9d1b1557f63c3d37d36152b19e295e43e24e8aba40db5699360555fa8f85530f0d35019349114047d7b15d84803668848c76029e34bf56fc46db3be11625eb442c3f8c9dc66c6d028797233a6a911755e02265563d15931eed375c7574d833a212219b51d076b31502a105000cbb03805ba204f5228e9e019d2071acb382c8dd0db22402d992a1a4e1b4dc2c88af3d6d80c58a7b1d123286c8dd37122b1ce1984d2c21c38cdfea082479943493f9f73d87813e016d42d5e256fbb5eae0f9ec925ed3d508a0aa1ea889bbbe952b785c4e48876b706e9a2a19b84f8e95006eb8bba52129b02b8aec730b55060960ca38a99f2100e54f64d994a9e88d17710b654db4d3e47d937a66bc99b3a68d0a51d0806c822dff74a515d89a0c32b253670af42cd0dc94e39160b1c4f753a1fe1897da88146f94aafbcbd19212d0305ff09c86a80eb3da9445a6418c7714102f34ad62e1251f285b87f182deb75763913d6f0bb4291312914a7960287f4c54711a4267e2d0c6b3bc822feddb41c21be1c56bb54b439e72afc312ba848368f1ee4510f605d9f66aa28d99b7eec5a568af5cfe17aed2d802789ab1676be11c1c1a11bfbdfc92fd35e0bf80cfb41a36f801a638ab43fb1196db9cd405f38d4422e5a902f403d1d50f7473936be0b2fd96523621393372ad477d699241ed016bb11886c372e726d22048080cd4b9b89e138b5ad0efd103f571de7124f8a5d3cd93dcaaac8696d0c1268ec0ab0651ffefcf8b2141def7936c4bcf68576c9d0c1d3d52839542c9e7a58f76924bd2b0d44c8c78823fe1bc3a51b4e648ebe71aa63b96cdc748308131605133ffcea9247bee13c7c7aac23b8fea6fc2dbf6e7939c3409e948c2afdf8d05f210c4dbc9d61352e6e286f21a4c4ad23ed29764bbe670405bee4b747e2b9e0cd2a8d78e942f82019021552424ae6669abbefb8e1d85e339404626ccb227b038844b483a43dad591d13bcf394f72c85422b99765d18624e062aa0141ee168d137a265848c3293bcee3bbb2cd2b0ffe2c403dc0fbe050b40ecc5203e4f9ea2dcf7c6056f7760a446ef1531af978b53916947c4cb8cb0a40f02c47cb3f3aa86080eaeba42c48e069e4d9f441aee03c4c279d5aea619f7a55c4b6bca9776bbcfde66c336ea41ece31c2138819bfd4e2c97ab85c54d8f7854ae4a3a9cb0f11760c5db7cf796d7505e6ac3e857301fd72142b22e44254a30003ad5f54f2d73d6b7bc1c4852ac1055ad31370f35901385d9b39f614adc3de81ca6dcf2894034b71a9e1889f7a7a151cbde4a53ba7ded688aeecc64018c059c295f0fb89536bd04cd9459644c7b2cd7ce95109682348651895ea2ad0c09f68a4b9a49ed45f5cff54edb88998c5ced3439606684f92f3a21b0807dd280f55de8c8bb1d0a30162557b799512e34f7eab80cca92d2251e7b8d1ee1a91845dfc00ac48354460f7bb858764ff0c10fd9d1c5048fdfb06ef6fa2220cf4fe69ed8f89e726402bef7bb487a9b807dcf63e149ed1e4183274aa2c9a736fa89f6922dad52e4ba00be95cbf403908f9d11b4635c5d16bcd1cfb2daaeba233e8c29c3e436302963193f59fd70289fda14dda8851ac8b2212cf1f6383f2917870a97fd63e0f774d5ab8897b3ed235a16f033242af05fbfffc28de55f027e610aeb3689d6158a203e3fe99296115f866d95c67773e2880b9771a241f1bce386a04dbc90473dca89825f5fc21cf04f22dd18fa8e24fc17a6d05eef23a1500415215809593d7aca03879c4a2792541cfa5796be98ba94a9d4034561d39bd7a9c3bd9c34e4759bee21911bf3b2472d2c572c2602dd067d1a70108f306f8e904ec6482749cb0711e49bdd361a1afd9ab286ea4c701952ead521034f06ed900e583743782ed438ad9b56f8cb99565d2842ee803b1d40819175857799688758bd085a0b82bda3c77f2d04fa422afcb479f692ed302a4568046c2c8cc0590cfd54d264eb45556753d48ed19a2bbde806021810df590a2305a9fc06ed999d3eb316c5f3633737b09390229dd2864d11bef9af74c4b3bcb5d9fc22ed8d3bdd3275318657488f2f55fd374fe0d6c12739a0d763f694b8c1e3b452f32281945cd8ed0756d11285826feb466e7c32a8a996470d1f4092e22e6035a293c45afecb5622d919c95180e4b8b20e03d160e0b6d054fa7691478045d127f54f35ec2521aef050355ca271f2c631b75233860ee6f1806ef6fa39c98553cc6740abedd91037cf7646593bb3cf4aec303e3a18945b30ff2b1e9f52f12fa571143f99a5b4e7dd0d46fc1b9abf9398d87fc0dfd601b6d2c11917414050cc46bcd9b59b369022fa32b98d78fb2127733552f2eef05eec636385d013c6196f2edffb4beb5ec666cbb50369d6d0c4ecb8c8aca77e54f9bf4e2b888bce7cc43de80dd21d4f2ac35de84005636b52804dbbdcecb10d859100916f31e46930ee6d5751575fe6a05c6a1e4a2835afc432a26df3c518a2870e35515a8e42655570a3c471472e2576330b6bc7f2e18e8cd0ca6ba9d7776674b45fcbe42cc44cc89ffdac9092d2377f6549255d0c17493fe1b342061e3e6e644a155b1a8764303d2dc8940a194bd70044dc7c7dbacb8a5ac7412bfa485f86a0e81af03075d41517b2c790a54e015e48b179b2878b05f7b2ef5d6f0317cd56e391a41d5b8b850323d4d8a79a77d68b8dd880c58ffdfc2a8f4569460e9f1aaa062824f23fc53284dd272519e052e01df617c1c878f150481fe006c0e3e33f97cb75118d398b04e2a12b4ec2ca10d8a78c87f1e3a591507b9460231e2b35ee652a3d22b13edb820ca5124bcffe901fdf2fa0582cfc1968eacf30ed3ed6e5d4d81f43d75884ab5f9ef6f4fe5c16572e8fb2c6163e244b595f5ed6c3ef79c8e5ad7db3e74156f586e7e4190c7229e9a0ca02eab062a049fed51bcc355e73ecfec2cf79786ab48158cb0135f7c47d45e868d053c8b9d0567701e802bb1522029584bae9700c5c256ccfcf31e8450efb1f9b7865a232588509ef004494c4fe068cda667f9f4d759d449739cab5c5153697c0f3af8c817d75fb47aa6e08e144d80503830951938fa401175121a5d81142bac58d0a0004fb939e6f787f99b361777036c1f406e27c7fd63d78d41bd5e55d1eb9e05c2e18edc5d8bc7a74bff17f95a2efd99ba6a07d1e63b83d8f9d5bfd6e377bd2766067aeb3c32f00ded9bb6cbb92b59fed31acdb387a964024cc58945366c88c4f940b93a930945c7ec7928422c407890c1da9efd3765ac97e18d7ee5d8325a14abfa88f25880f5c4fffdc6454f12f2c4075151c280dee27f995845c544d9d739eb9b8950ce467862199a18bd9a988c0459f5e70ac31837d74782018fbd5f82f57430e15cfaf7976cb80bc2dc4bdbe09af0ff0a8a7ec21be815bebdc585cd5fbdc10ec412cc87ffd99e7ac2cebdd742875506efd67bf0333cc1311e577c2526e99d509c1b565be149a9af54a25e4c808bae7725ef140805d37f925da885c2ebb1682a9e2c437346a0d3f1d477b7e87b79c5fe2c183297d3fbc9571d09148056ce50884585b9e25292df5114c76522435461fe67ceb68a8ecf70e1f5ff2ce4d3dd05916f6dcdd605aec1cc75925da12410296a20b5946cf8d02ccba3a06ee301c6af6f8b037081c0bcc97c0a4b3782dffd4cb020e6cc5de0d3960ee24850300c3300cc3300cc3300cc330cc0c62f2f80a6565e7cea921084644ae5a725352524a7b3a33f33b7807efe01dbc036ceb993d7501960d150ea40d564c66b895f058be4284182d3c9a554978b429bb673cdf9853a34878ec5615ee667b726c7e844731946afc86c4c85a8c708a64b750d58e2421c533d687b0bbd49a669f223c88cfda317b8e73579d666106111eebe60cae6ee12a4a4f9c3063088f925dd548b672ddcf1f3043080f6ab5ebda42f36f8c7c6146101ec69c2e8f884a0e1f24ab85194078d09e6637a31371ff52112accf8c1c330162eb9dc569c18e9e898e183c7a12fe4fbf83939d2f7e071ff77da488b7cad98193c78f07be1b536f51d3c524f56e735a365e199a103e6543452b624594faf2adfc9697d53764c4566e4e0f1453cb71cf14eb276191d370aad093370d08fae75fae56ac60d1e7bb69f2c1dde3da5ec0766d8e051ed5cb62c6d7d99cf8c1a1013613a233224648fcf8c48f1235b4a7911fb0c1a3ca89826a3844a15579f8c1c29e8822900821b2dd86216c67495885b6849900ac958b0852c1ed6fbb778bb44876fb788c5e3099772c27bda5ce9b680c503fff5cf17f25262555bbce24148bb34616bb5354f5cf1f8e35c0e3984d120a16ac583b6efd9107a2b39c4acb0dc22c7a8878c584bb465554f8bab57f130453658450f975f2b466ea8e2a14996f8887153468eb6400cb648c5032f97ccd59d96732f375eb0052a1e8fef6c98cfb673ae9241c691c147d8e2148f3ba2c414bb9bef41bbaac216a678ecd94387a9ea4921c6b628c56397f655cb48215619842d48f1a8dba7fbc37898b0e3281e6f5beea8d1efa3b76f218a07dba97621f87a9c5f56842d42f128ad84f03987f8fb39dd81e29156cea8125fbdadfc271ea5fab4d7ee6984683df1a87427bfe4a810c3443bf12085a8ee12d593e5e471e25104d74e99420e57fd89b1c5261e788a15fcc25b67b657138f3b67b5465b6c4fe9cb2d32416ccac45b857bc65bb5c51cd33031e6d818130f6223a43ba64cbbbbb9c423cdbfdb0fbe251efe7fd7258bb2939256e2716cf024d6173dcfb808d882128fc4c2a65524939a0fc1b1753589877ab1551d27f37ce91d1d1d1da602622a30309c0547842d24f1e85c52887def6efdec6e0eb688c4438f285b21939ae3d286842d20f138523796a5f0ce212f5b3ce2c185fe988cfd0beb9b32c8f8325a023bd8c2118f27a64ae91f3776421ec7160e325230066b92a200086e28608b463cd25f0b9373fec4d58e110f4cff72f6a486f1202ee2715b9ff8c7e9a5c95d110f3f65980f393f294f9d8887d16b79d1217cca6a41c403cf3ccd48414acc3ac4e9e1d69145ba5244be5c52c85031255a8cc133c463bd0b6bb7163f84cb16e2f14bd0898bf611e218cf8c4d09d92d72cb9a6530ad982ed7ade3413c48f3d46d11726a9bf0d1d1832d04f1d82fdc63d47ee55149201e56a730293e53b7d20b8847b9f1f99376d43a2dfff0382a9f679eddce67a21f1e65f5c6b4f1d1dd89f5e1719abc8f49bee2c3230939ba9bc489e377efe1d179d7dd66a81019737ad8bbccb2aa3245b554c5435c92979f4e1e1e66efdfd45b8f0871f160a49a4ad492ec8a90b4f5542ba7f61c5b2b6deef0289bfec69311bdab68478731610b3b3cca8fe616ed2c639584b7a8c343dd0b29bf4416bf3e8f0e0f3f5cae943b6c48b9b866d8620e8f3dfcfb255a2f25cfb790c3c35ccd2d9553bdacc5e3f03868ce50e79dbbbc3d7078b0996e99dd34b4e4cd1b1e2791d87c65163c2774c3a17215c1345a53228beacb78fb870c612c6bc3633f9fa87b1ba2e4ccb3e1e198da59ae7cf9d2e6890eb658c3a394fa357ffdf33f3c8a5ba8e1415ed8d3f0922c64d37ba360b0451a1e87dc0db1edfc334986068247ae788f1899356dc9779f95b3de3de5d0191e9accaec7b419e5c2648687fe9fab1d3d63fbe86400618b323c9a1c424c2695a9c54c86c761ed77bbd3ed92c6c6a086cc9bb848799776d2f64a97d26aab181ec546c6786af0c8f59710b608c3c39c5b9fb090e91bd22dc0f0f8a2c47f8b133de4a87ce1d15b87ec41d53dc9d95b78e1d1c856656f9d68b1fd2e3cf2381fc92c35170816deb19d25dfa5e2ae69f79ac63c844a6eb105c4653b3422b7b89c64568a41928f498cb40ac716f1c0165a7850a1391f52f53d3734822db2f0e8c6db7e737ccda6e01658787cb24927799b26e90cc7961865dc40cb01061897038c076c7185473bc9efe5e2988c87a9cab085151e546788d92b569427b9a3a3a3836f54d556e1410e12cec3fe3f6f8e5b50e18145e65ab989d08b932da6f0a034f2bb7a474a4b670b29546d31d1d169da55297d0ed2ef9b39bf5b44e1f1b5a71d4d6d31a7f840e1d16cd60ce2d9273cbafc3f6e27793abbe38487e979573f67e98b936fc2838ecbd9f5dcc12e263c8eb1c526a4ed944367090fe2c59c729a18322689121e4444934fae1a423a9384872ef173f7d5e3690a121e862056192e4b2ccbfc088f6316d3ec695761a6628487b13a246ef98e27b9088f3366688ba1ed296f447838ff597b4e2d85aa7a088f4b5d2634a51c2a7b2c8487d59751c75cc6624282f038e36cb4ae20c1520f8407b9659225a325d3fa078f3f6222443f063b6b7df06844639be689def47af020c5d91053a8e8799bf2e0818f58db7acd5508e70e1ef7488c55e6beee16d4c1a3c8909ed3b577799f8307133e55bca49aa63878984d735d2feea8a93778241fbaffab4adaaeb3c1c3dd10a94de921cc5d8347a9fb4e26799d4eb5050d1efde5d4f12d6ce508d92c1ea4f3d4a331248cc665f150afa47436456d4b158b47b9ffcda62579f98564a0052c1e65aedd18d7a35bbe9648d0e2150f439e3c7182e4f3d5cebae2515d788efa1ad2cf4bad7868aeb13a6587a5f30dc7967674182b1e96a73193ebf60d49d762158fa3e4f909b1d4f3e4a9e2c19b6c9efd7a11bb3d158f3af3dc563ac69cb2848a47eeabb2e1dfd3a5774ff1206eb2b3666e27e43405b21122248d94557309315653e76acf15a9ab29c583900cede8d450973ea4785019aa576fe234877e140fae72dbc844cfb92ea2789831e1a52d265a8a43f1f85d2d4cceec152a6740f130eb273a628cb497ffc423ad10955af51efb754f3cea1791d0152c65dc3bf1c02297fdf745ed9039f1702f85490fa33ada6ee2d1f666f6dcfeda9c9a781873687a5ef29b0c33f1b0f37a9265a84bf9154c3cbe8b9eb8ddb256f94b3c08493f75ac8576642df1784bb39d5ccc1d31ec4a3cfef056d9b6d3c6e650e271a649d25663ded9328947492e67049f0b99839278d49e2684d84c9f458bc4e399cdceb1cccb27241e9d9c5ab21861f72af28887bebb65b3392c7c7c1df140cd765e7f2c5579b4110fdb2b3c7f4e15ee6632e2e1d879d6c81f97abb388072b9965b655621b453c4c9f562e5e3f79d824e251d4dbd9e51436f342443cd454e539789857eb1ce2e1f64d4acf512bec37c46397a0bbbe9e9ff2778578f8a15bbc62ce611e1b211ec686cca57997b3c683789c53debb143ba1bf15c4c34a5ad731669970410ac443094b73f7b49f7d22403c7ef9d02793f387cf94053060010970a129d0e20f0f7b54420c9b3666274947470702410b3f3cce161d93a5d7d851a93e3cc83d17c5c3f6857c90065af0e1815ba9f9445dbe9de81e1e79f577081716d619d2431224678c5489ac04f9b20c15835bd64fb2de3e0f8fc7567aef3b58b0533b3a00c0042df0f0288b4b58479d7c6fd61d1e65b8ccf8aba53945b20359434656254a08990962b5413f5f8ec5e7ebf0e0d2ebee2bdf48a80e1d1e9de57389743f933ecee171bca09bd284fec465f9466117b490c38309d31e2ed66437fb3b3af84651a914b488c3e3cfd1fa91d270d314c7d61bf5373ad0020e8f5293248b8c216925cf1b1e574be8c4288d8d1f71c3a3b09426ce8384a8b85f86181ce8e8e8d0363cfa8fa9acb071c343920d8fccb3c376ca7e9d4c5ac383f0dc948a57099f1c353c2e49b7becce9dcd36920645cb76b453295915cb5319ed152a85c6616343cbe300d7d9b7316b94f47c7dea8d4e20c0f2759140b294b8e9498412dab128dcd98334b8f1cea2d3158dc448924025a9481880fc921b26e61729191e2d4e610212a4e9e6f10323c38d794bafe24a60d95586580f5b418c3835839474eaaea74766789e161f2103ee98d67b5c49002b408c3a38db2ccb2993da60de3d8c26280166078a4f12c8714c7c62afd1aa0a2d22f3cbccf216cb25488bc5e0b2ff0a62996f2e99911b22c79b2cbb1a0115b2dbaf030c36c9c8ed118aba8165c7898b3a7f0a12b738a12fe18376e500004373ab4d8c2c34feab1adc6a23c5c5f9c8480165a78609e2b346b0e963c2510e38b7380165978e8396edebd6c3fdb2c8ead15430288852c44dc4ba4535e24c6899a5a6e557e5954c997a0046248600c3128d0d1510231bec81b5a5ce1d16769cb5a485d3391d649a500086e70a18515989cd26d2621c3b422d36b939fc4f9c5f3088ebd1c658c71ae45151eed85687b2925defa440119c8004b8016547824ae21c6f78dfda7508c32540c0d941653789c41acde2bff89a88b638b1830c4c8c1808e8ef227230b5a48e1914c6eddfcb53ee9d90cfc023a3a3a12d0d1f16178714e7345418b283cce9ce73c53acc87410c7d60d2719381d1d9a76026a82165078ac39524a21b1662c261c5bba012d9ef028f8754f885ec9415330a085131e6aec9cff21ba737785634b8c326e9041aa68d184071f73a6fc95e3434bc3b1f52ef0823da005131e796dde943dd5265e65090fb62f56c688641829b8615b6a2ca0ba718a4ad34e801400c10da385121ec58e8f2945bf88b1cd8116497894425d8ebcdcaccac9121f68818487ffeda51fea312bdfbd512dd0e2080f32ec734467c9339f43812fbef0a2e4780b74747474500004377268618407ad7a7bae6bf44beb85876b799ecba2edc2a39f4db9399ba67246b9f05052f6cc793a6a4c31ddc2e3fa0e8f617e412f522d3cf0f89967323d2c77b2f0e083a7b64d21e48b9dc4c243b1689dbe7426d692577818cba2bda79419ce925678f8d1bbd36ec6f9bfb30a8ff3f55bbcca1d82a4930a0f254d8a12cb523ae7710a0f32c5d7ed8f5d9736288587532f129377a75310a3f03082afc7d869443f43283cb44ba67739854f78249e619ddb9bcb73ce090f2b4ce70b8f56d5fd9af058c5ed72b62459c2e498f07082ba6c36dbf534de12c833e17be3fd4a789cee2fc6c8a13e69121e7da79435fcc6889c22e171c6b8f1ef3ac6fcc98ef068632a74b8a6f9b218e181a7c894fa315ba6b18af0e02ef3e9955b7dfe88f0502dbf7c9cb199a081d161200b02308447f1c53455b5a4d0f011c2438ffa9466cdb2dd27088fd45e93494c962dae40789cc2560ac172de10b5ffc183d9afdc1729dda78c0f1efbced54ace10de951e3caa2e0fcdfa1d9b230f1e64d90b12655e3a7f66070f5d36623cafd0493b3a78ac51fb5323847ed7397830a39735ed8ec5cf3878bce974f3db764e29e4068fdd5388613dea01b0c1038bedbf63b1fe52d003508387a36dee61d9cf2ae701a0c1034951d27c0a9114e9328b476b5d1f6a559f1a17593ccec8641bbe3ee9c54a2c1e58949c147a762a4f05168f529890ff1afbc978bfe2f1c6cf7feb38aa166e573cca71bd1fdb9a1892dd8ac757d936f665fdb45e973f2419eb8ead57f1b0f65b2ceac2aa78fc9561af7c3dd72b9c8a87fa1d35c5b3dd549951f14864a62e322a9cb47c8ac751c2761eeb138d934df128b5372d77dabd9d90523ccc9b5cd69b35e6104248f1a8824d0c972a69fe8d8ce261d48e915136c775cf8ae2c18d7fb4e8ec4f63d9503c347d8f08c1726fa717148fe3a6a989dfb296a3fdc4c3cd55671177f5c4831d99499577fbcab4138ff35e5f12f3cf9a3e39f12857659c95ce946be5261e5f8ae97952b07c1aa5261e68548a31724f4276ccc4c3cb9725264ddae71862e261ac9b68bf59beef5ce25184bec9494b65fbb7c4839b88d4514d3a84f855e2e18c485f2ebfc8c91d251eaaa85bfc46fb9cab9bc423f1dfaca2be9daa3a493c0ccbfe8cbaa5bdd145e251b889f98c6369276b90781cd462d48c8d17535f8f787c419288667b9e982e473c38cf21f556e4bc1656231e44d5dc5c214a42be8a110f33aa653efdbd8807d17bad2cc498b3f88a781872cc286f9ba95226118fe47dd32f82c4543b221ee669f609addbb3ec100fdd353cae974b5988706c71a18106b48086211e470f65fe41e386f544a3100f4b2d858e654bc93727847834b32147346ccec1231bc44311b5c84a9f90d1c569c1031a82f0452264e78aba2c391d6804e2914488581e7cb632ef38b6c01023c7e9e800438c1c0c20e3040d40281ab6abaa5ef532e40fa6bebf4c127fb224e687d5d35884a788dc08c7d60d626fa0d187872975ba9a7df3e181687d48b27599f247f6f0c083c673f708652515ebe1e14dec0ccf1bef5d749387c791b367e490daa654a335a0818707a1dc563b5cb61096dee1a105b33c33fe196262767850fb59f67e936a57a80e0f3f723f3a3cda3c9d52e2a61cc94238b656d0396e94f125d88f408e8e0e42630e8f32a43c15c278e6e8df5841e72093c383d99075439857c8d0e0d8225507a0118787c95b2cacdecf4b8c83910230bc60414fc0ac0b1a7078942cae5628db94a4d712dc8d06d078c3c374f37a33911fd257702c7519bd808e8e1c6080d1d14146e7680bd070c383fc0d3fcfeab5081b1c5b37c600c3ef8b2fc600a30b0b581b1ef7654e31672d49e816c71619ef45757488713a3a6640830d0fa64e63d01ccb6fe342630d0f2bc56ab4e85c282fcd021d1d6380e124a0a186c7391297713ae52c250781461a1e574841fe72d77f751a0d0f354ff2ad689269ebdea0718647f97d9fb3b4246574cdf0284a49eefe0fd7efb1400c0574749867811865739431c60968948199b1d87c41828839ca18e30b1a64203b5cd44b563a3ac4301d1d1d1de78631ddd1e145e7d0005b8e32c6d0a21234c650fe49bf41e2a59cb50ac38b2ea3838c5640268286181ed954949863b4e0d8522e34d0002e3a6c0a34c240c54ba15399c907cb8381d728cb9bd32fd429458e70ae1e29e88523e727dbf8701e5238b6b8309b022ec0f00207191d2ae0a26c0ab8202c83461776515997f44857099b66113c59e46c48192900839491820984c180c4000d2e3c944c29e5b9e23c6647041a5b7828ddaee97a271a5a78b899aea2249dcfb1a92fbee82ef646e10d6864e1c1c75bf828cf98ff452c3cb819cf629242b2147108d0b8c2e31f75fd8e689737476858e1d1df77f07091535b2d1a5578105e536affe54bc3a4410565724b54319369991593f459f434d4439ac6141e9fb7e4949f472fb7dd1b95258587a124f54dde09bfd9a611854729588871ce36b8fcad690ee8e820830614081e662edfe6e26191dd5fc35b358639bf0d8d273cb698aa3df3e212e448808d8186131ec6d4699739f1bd53da84479d3597924f9c10bded1c6d0116d060c2c376dd93d8595a19a2b184c793cc2bc7542a9d2a053494f0a8cb52ed65d67e88ae4978107286c759afac9e5c1a4878f0913379da8677f53f07348ef03843e7d10a734f9d27ff39ca281d1d52a0618407eb7f2934b7691acf4cd740a3088f2e99eac75f18bd3c13e1c188a6b06931c6499eac82038d213c887d1ddfa3c87bedfcc5172960404707193484f028c448a2e163e5c66ffc09ba8c2d321a41781c1f63de94cc9cbe34094835d000c216de662d12422458b65984d69c473a6dce9740e3078fac2ac7ffc520394caca3e346e56036d0f0c1a39c37afeddca75dbfb3078f2ada7d68f9f7f10a7381060f1eae7ec4bb883d06183970201a68ece0d1e8a46d8baa461d3dc723011d1d6380910347470705407043063474f030e24c46fcb4a99e42326e501180460e1e4f59fcfee819061a3878786f9662a690d27fea1b3cf2f4b79ddfe7f7cda36183c79b7c53b72fd5d1e145951d68d4e0a1467ef11cab1843c65fe01e68d0e0519b65b656bdf74bdbe661c62c1e4a487e91ab5358e5080362862c1e8644e457db0be9c38c583ca8b71c2576536bf7670c3052d0d141c6002305078b8711f565154436784add1966bce2519f568892adc156f40e00a461862b1eff4afe599f10de7307c7566e2b1ecb66094f22da1b52c69371832c03a408192598c18a477b236da1e6a7c27356f138fe44d0efc9965a7254f15837c386bfe8a4e271d0a095553e75bedda0e2917567edb39cfdd5f4291e87cd15ed3683a6c56c8a87f392a731a75c96d35a8a07b61273a47b39733b49f1f0d46afcb5cb513c3489981d334f5c9e45f13075b3ea4cf86c9060281e86c9af21720e0b3187a078742b2691ec2a5f46ef138f3786cc14591126a4cc138fd2e6deb44e1a154975e271da931462670aa163c589c73ab92742ce59737fdac4c39314356f6f73469134f12832744a3f87348f31138f439d56bc13d39cb2c7c4c32cf997363df3fdd29778d4f96563fc349de5434b3cf29c767aba1aae5d251e5df7b68b07f7ca314a14e1228410dd1561e3c3a3f244b0d0de241ea4b8ee5739766ab77310982189079baec66afe3beec68b1ee30619bd7ca30c31be20838a023322f1e824a7d39c25fe4774c9166640e261dc9bac2fc94e007361c6231e7a841091e33637a5d6d1e18887e131e428335331c982c771c30b2f9c8cbe21461956fa98d188876e652529e5d41893ce8847a63164cc1533fe935ec4838b09af8fa9b41ac38a78e4f113295e1f054070038c1989781c66164daff32df3d9d15175a3cee63003110f53bededb88a72ab93bc443ab8fb3cb1b437b57433c8891e73c2a8ddf5438a3108fd723af646c959d8710ac589c7b956aa65edc2897434ffd7b3988d7376744bc94abc7c4b1250873c892631708d2f4488a775f13c3b1d56390417a0620504fcfa2d1a9433982197fa02cb66ececbf08311f2e221136526b64b464d88be501f7b738763cbaa025d7031012e3420012e16701686170d861846950220b87166f4e151c538791f5623e64cb31866f0e1b1ef48ea97478adea51aefe1c19559d8989ea9e1e233f4f0c054f35acc5b694d7e1c5b61fc1737c408e3463160461e1e49f6989db4f62ce5e3e171a81731c9cb8efb913b3cd00c3ff219113b3c94c821a58cb13c225287475127568c59737de7960e0f6572dd4aba5f8eca1c1ec496ded8c93e49e66e861c1edc6fde0bf2f329a4d754601c8787c1bbf4bbc3cfb62c4898018787f596aec3c3adb7e40d0f2ec5c9c8bcb17337e700175d7011012e3420012ed80d0f525ab6b6d8d0b618d38687b17a25598b7986c829e333c05098c186c765294be6483b1663f6d6f0383df276c434ff9442ae30430d0f2647879c494fed3ad98f23016234200d8f37a7756fbc9efefce11366a0e191e75aa428cb9d5a2e499871860733c97cd2b2c7f69c69418e32c27898e141b0b815914290ecb4c1f0a2bfe8820933caf0587e454d731abb68891e6106191e869463b4710fbb75d1cf21461746983186c7b1e3e2738cdbf9c4d628cc10c34371fb9ccd36fece3f1c5b37b2140333c2f0a072b386cb4aca559e1960789c82c72a3f55ed304d03667ce1e164fe65eddde6cf94171ea69c6347339f57f6ae0b2ebad016cce8c283ca1b627a0c9ba122c554b084195c789c49c2e54bf1cc10276598b18587d27a1635fa3b671621c20c2d3c8ec125cb87f3934f37c131ccc8c263f988a93ec6947afbc718a3af4c05c65878987174e2dd855817c61957786c3168fa4f1ab7c2c3d7a910ddeafbd66a151e26df508b97b3c778e9195478b4d9528ed8f790459f3185c7215dd659cb758d9d33a4f0384944ceb8591e2b3a33a2f0d8d6b355b8a457e0dd8b2f325086170a5800606106141ea4581e269ac783559ef02852d6424cc5ff701a273cd6184d74c3ebc708e1263c982cf136e4bc61a35e263cc81e7ef2678f4b789ce3bcdf13c73c22b460f124863bf9efb9e8c2ea46a57bb154881a8778545e6176d2799bfd5c4da86188479a82548708259bc95a428d423c92adce314cc848a74e884761a66edfa26b984d837894d7e1663a9f201ee8ec5728cf14e13e4ac0faa146201e6a06b3885ec13eead38004b8b04022256a00e2c1774da447e5db4ea1cf400e30c038c2841a7f7814266888de467e860a175d70c145175c70a1010970a175a3f41135fcf0b0c2438ae6e634b12a7d785cb617454a439289910f469acf3985c8df1e1e64fe9f87d4bca1d943c4302920a3861e1e6b9568699a983365c545175c28808b2e4ae0051937ea0d35f2f028c94d0aeb5936556af1f0282a7fd618bbd25cd2eef058e277e45436ed8c8fcbae50c30e0f92fd7886f8f1575b52878797f39bbebe8abd5574789cbff9f543ec18b6b1393c901c914dbed52786550e8fc33a23e4e6260e0f32774a5f39e1db2c85c323d78f1abcdc32dc85def030546fcf7256cdbb9a1b1e75b6b7dd74fe270fb5e161f9c77b8a1939eecf860741d3660fdb0cbda1b386477e534125c75f0d0fac2f22a7d7fc2b95a6e191e6ace953cc9432278f86c71f3be43c1b62ae8afb0c8f3bc795fc13c1abf254b55bc30c0f36652cefab2dc3c394839978a8d5387591c1fa851a64785cf213af2e8364996c8d313cfa18b91834252fc618171a90001774a82186071b2e9b85942e0f86171aa836d408c3e31c42744a2cb71c7ad500c3c30ee6c12b5bcabdfcc2a35a990cf79766a0a3c35f0537cc9320d4f0c243d7dcaf0e9ad3a985886152b05d789ce543e9b5468c2919629c047c592e3ccafce99c1472e7bedb0b25d4d8c2922a3662764b76a4f6eef493162aeb59a8487b3146777468400b35b4f060cc5c762dc20f08438c2f7e50230b0f2b5373ee24f9bd7952030b8fc6e27272cea5af51ac7185879edd19d324b39bb0c410a31010d4b0c2e3d68bd27359fce23755789c3b1397c9dc5cb7b64b4152000437ba06151e8686c8cddea19bc62629d0a400086e78a0c6141ea658af0fe6e19de7ee400d293cd6bcd9dd193e3f3f51781cc5aa6247f15c4183507890e1eb97ea2e89ba77a3c6138e8e8d146ba98cd808d9d3c25b4354d9d3108ef522471937c620a3d606359cf0d8e38ea5dc1d39ad669af030849c8fe79573e57d0aa8c1840721d2ecdb7d4ae1795fc2c32db176d19c63ca9495f0c8e52247e7298f31ac49787065172fd7ccc65b8784076127ecc708b106d438c2231b93bd8c715debb8111e4ce896cfe35162d95f8407d93aa78484cf97b310e18105cbee71e2437854a3617a1d43213cae7c9db63abd75ee9c1a41787856162b6eb0f9ba4f0d203c0e8b20396a56cb293d357ef0d0c52a6a8a4b15f57c0d1f3cd8aecd293a2ee13b5fa3078f7f4663f4ce9f256ebe060f1e646aecbd55eefc97afb18347fa29e213f4d2a8e56be8e0c148a83ca2725e6d7f8d1c3cf498d24af86ce9ec7e0d1c3c90ce5031f5bcdaeed7b8c1e389dcb1ee972d0b7e0d1b3cdc4e49eb7d2235685fa3068f425807cf715248d94d0d1a3cc8bc9a22e4680cabcd2c1e549c858c27b6e963238b0719f24ef486b19847138b0729bad934a47ceba381c5a3e0ee36ff9942becfbce2e1cfb56b45df6ac5dd158fa2458ce5d2d05bb1b7e24169465c8a1267c583b5fbd40aeb70ad7c150f25fc5eaed4fad32945150fb236673a33de854b49c5c39ce262b48a1f378614543cd4506ffb8c6162c895533cda98fd35d7b95ff48a291e4f674966fe1fb3ed5d8a07f329859e4489f4dba47898ae21754ea31deaed513c0cfb1d36c4f5b41a5b140fc653f8c8143625b53a140f3d9a5669a8e9785383e251869af45b492d67a93ff120c374f09464f3c483cb887ae5b1dd3d853bf160d6b28614c2a5fc2e73e251cfc6c8c1423c4f296fe271c5ba7871dd344a644d3cc895e12eab52c8e671261e6a5584f5183e764e08261eb5bd49ca609954477289c772933f986e7e478b58e271250f2d39778a3b7f2bf1208592bcca2b57cd2c251ec59075ca3f7d26bb77120ff7753526ad3adb6a25f1d8ef3d26e5c60c9347e2f18c26abafb442e2a16fcd89e690d222ad8f7814b5345d4ae66f3156473cb28a952f7859bed46a231e04ebc9a9d75e4c4765c483f4cb2f153e9e82a88b78186a697736869a6ca9221e07fd997dcb49c4037591ed28a97daf47c4e39a2cf2112fcdb2928778b0a3f39a69bef28f6988c7494c2ced6de3442f0bf1602b4d3ec9f4398e9484786cc9ba6562a43a6306f1b8b34786be89088911c423f174f277bb39e51d88471f33449a9c45520a01c4a39053ce2859a3d6b47f789c96329f5844f0bca21f1ec7d86f179a4e62c73e3c34a99dccd0ff20413e3cac8d1fa3314c90c9ede18166cd31215762585df4f058275c4eb91ee6e1d1c4f927ff4f2ae5211e1ea51044248ed74a4ce11d1e6d2e3b897423e93c7678b492f4429e7578d8ea712f788c389dd3e1610e234933560a9d95393cec609d2f5f7d7278182a73c2c21c87876fe9a93b6ed68d091c1ee7781e67e53ff784dc1b1ec4546989f36b2147cf0d0f37bf460babe35fe3b5e161ca21c4b5bd0ee9bd63c363bb5497fec89b7eb386c77efad159d2588a460d8f6f93c4aad3cc8b7b1a1ea47e8df6bed1f0e8ccf5574ed2fb6e3bc3234f317c95570c1566333c8cdad831c4c927b596e1619f557866d664789c3e426a9bc929d38de1d167f30cb962a92513c3e34aa1342f2a0bc3f2af99af9619303c528b75995c77c3f55f78b031632fe7168fbf292f3c704fb59727a6d2d34f171ec859d54de427f74a71e1e1eab8554ef95bb35a5b78789e9b2921450e374b0b8f5d763b37de2c3cd8faf4f15635967a58782415329cfc5e67577585479f7aa925b676fb5678543183ecbfe4f5b70a0ff37f481926a9afe65478a81754fba436549f5378ec3947ddef9f8a05a5f0e0f2e6be986ced49237f15dc1040141e06c9a5297c7c79df8d632bf1100280c243b9fcf1cae37d7792706c9d71e04b2be04b17267606013ce1c179c5bdc6deb41d0dc7963142004e787c62dbb691d52b4c0a8e2d1384009af060def4bf2dae052b1dc7d60d2c2e34d0802eba280e747478314602728031811c608071841000131ee474ae7293d2667f1d1d2b780f438c305a5086171d1d1d1d1d1d647c175c74711ed0d131810d7474dce822c77774b817ca0105dcc821c6b9f185bfe9e8c8f16c36e42080253ce8c82337d3614aee52411080121e85aa7c129ab9262b9a84c76127e729dd0e121e5558a6ce933dd867ee088f4374fa82e9c59c2e6e8487712dc36e3091d66415e17104b5ce93ac4ba715223c92ff30b16f6c22aa16820086f0203c63feb6e86a4b910084f0e84ca38c45feb4951cc7d68d85810082f0506ac424498e4e7412c7d68dcf3186ad4000407890ef9df3bc3357697e0602f8c18310d278684edbc1edc7b1459608c0078fcc7223f4e7682b6e9985b1818e0ed30401f4e061f86abeb4418263730880070f2cdb4cf64ccce5135719df00820301ece0f126b3d050a6d3513f02d0c1a3681ea285eb98d52c470039789cc27c78d96d4d678f0070f0e02cb247e97ded101e01dce0415448b6ab416b52fb02b0c1e3fcd65d0ff13e79f602a8c1835871b3cdc592d38b11000d1e5576ddc9d693a98b99c543ad0ed61237a48aa891c543cb96d6193abfa699583cdea07ed155ec3e870c2c1e8ed4e7c40b593579fc150f6b7e6b2e45f8f9b0bbe271c54f1d53b548f6c45bf170df46a34b9c150fe24253a87eabbebd8a87966343d2bff55d54f130a6ec9823732f2624150f32546fe7667d9f51f1e0a292073dd91c72778a47126354e63ec57a544cf120de68b0fc8beb952fc5a36839c2db27ab8c4e8a871a35d5cd52235aae47f1d0d2a79a4d9dd91d16c5232d3d0f3ff1d14cc2a178e8967b4363728afc80e2817d7ce84e8b9552987ce241d6c5f364c12da4ac271e6866dba8874b16d776e2514469b60e69957ee1c4835c2ed3a975e3c478130f66c3332ea4876789261e249b1cd534ebc4dd4c3cc8a2763a952cc50a15130fb36c76ea8def417289472ab162ae98f15fbe251ee7129d387fb3120f3d5c9c5775498907599d9da991f3223e89472daf9155a993792c89c7539772eefc18f5a31889077a71395dea6ff20f241e88a55c99a1d7372c8f7810f7442ea2f5854e1cf17883c70e1bbbf2a6d835e2518ef4ee786a1b55463c4efba79933a4b23b8b789c1bfb53369256f615f12867aa9c634ac74f4c221e56957be4601b221e26d5ac93f71ee261a9977b6a328b9533c4c393ce292f07dbcc5315e2c16825f3e8ffce3715211ec4b9ec97c2cbffb98378983e6bb4201b413c9abc537629fc2ec2403cfe98d692438c7dd7118ead2a1a0400108f3e5d9e60d16bbcfbf387877541234468fa1bf9f8e151903b8baeccdd269d3e3cfe147231826f88673d1f1ec7a8f2d76f9e9a3b660f8fcab23cca5588a5a7d1c3e3586d1d37b64e4a9bc9c3a398e4227db6b6b1327878e0929129f6ae2f95b9c3433d99982cf36e87471d5fc1d6bca72de275786c9197fb93e6dbd43a1d1e06b1b8a99b51f2a5cfe1914c76a898b60c17b91c1e6ac520e9ce2b63e84b1c1ecb9646f009f313ba0287073675f693b7e32555def030e84f844d9cd18a8a1b1e44698e6c8fd09026dd86879abfd63bbf171f69363cccc146cc624aecd45ec383af98a135eff4a286d5f028d2848eceaaf9d4701a1ef74f86d6287aae1546c3c3e4b212727eb3a48ecff0a85fd6d593a8a6e9c40c0fb3dc26a4cf61b2c2a40c8fe35bdab0f59b3ec7840c8fd3c4a0ad396da633328687351a73cc1572849c2262787057b17b11b5247d360c0fb4ac3d86baaf5379c1f070a53c750c49cf3bb45f7894e21e267ab4a8785491251d2f54447e738a07561e5ea927c39ee7f44b803f60c3140fd3ce58f525c8f113c88c808d523cf01dd9cd13632e830d523cf2942c35d7b025b9b1186c8ce2a185cb933af24c082913c583d2f0dd31a49e4a5964b0118ac76973acf8939bb33a04c5a3cb9df54da2b9852885c1c6271e68da08691e327b7eb46d78e2c17d77ee7411c7b1d50202021b9d782421dfa2b735cf69ee011b9c78f4ee31eea7c872af171b9b7898f273a285dc2fe9269a789c25238d5b8af3ba6fe4480119613c59261e4aee781a76ff1f4305c7560bd806264a12ea29697aacb438b6caf0a2902ac361e3128fe2eea5dc4aeef0735be241a69012dfbc5c4d71251ec7a6e0f3192fd3174a3cb654a2f92f9d265d9dc4a3da149aae7553292c493c8e49d2a7a4dc9faa7b241e9a74e8ba0c43e251daa84e95a65b2dcf2de04c808d473c0e27ae62593c4cc7700f6c38e241570c21ca3a94494a49c146231e8da7e0fe97bdd3810d463c1eff7f95d7107bc55ec4e334f792677372c5fe2ef0041b8a78146fe67246a2663d8c63eb4618625c71a181066800176123110fcea27d86dc4163543c477fab7f8b2b8ead16fc096ee410e3dcb8b186838c76000e321a8704de8b1c1a90400eff1c1d1dc5dc782f729471091b87781855ecf376aed968258e2d2ae424d830c483fdebd1509316529e0bf168d37c27dbb99471c2847818bdfa5b4d3759d675108f26a7c858a14a73745482789ce6c522e4835bb011884731fc9c878aca0d05c4831093bc763ffe87c713534e216ee48d9d2e5ab0e187479e42ee67a61c530a7a1f1e584ac59c88bf946b3e3c3ccf39edbdae6bfba322b0b1870735f29ee24d5488b068066ce8e1814c4e4fe46aca15421b7978689e9221b9698b851026d8c0c3c318526629b377fa7c1962a8400c1b7778943112428c1d298e64a4c00e0f2f6ece89bd1c3be64619fe2608c38b6d818d3a3c48573165595275d11bc756aec0061d1ee9a6902e425666cfc4b17529b03187c73d9dc57f836b9f375a90a38c2cc3861caa836cc4e1414b778e71d4ac3ca6e0d8fa2f8c1737c21063bf300fc8830d383cb69429dfbef8a44ee7def0c0c73dac578e1ab73c373cba378ffbd1c2e7ff4c1b1ea667bd0a912ce6c4b0e181b57e5f6af8d7f0f8332b84cb12472b2259051b6a78b8ff51f67dc6263721b091864717917f15fb215e8c25066ca0e1c16469d0ac3c4deb2a9760e30c0f572fff5d08e53e1bb1191e07b3cf1ec23292840c2f980b0d3420c3b05186c719ff453e5bcc7ac990e15125d590b276fd9195313c08b96eccca73c448b2181ea54e44b99869973d68011b6178505ad9d22d43af4b05c3e3e025761e72aac7cc171ec693c939a5d01041f6c2e352fb51cd369a26aa8226a30b0f3e6467c5d81d65f3c385c7963e4be4bfbfd0b1ddc2838dd12f1bb3a2bae35d12e30bac401d056c64e1e1c7cbcad93c3b79593a3a9460030b0fccb5d6525f7f929f706c5571a1810630400561e30a0f3aa6a51ce3caa2ca88638bac0b36acf0c0f6a3ca250f4f77368ead2a3cae60d3f3a962c5bc07eb0a36a8f06827d5abbc77c81e4d1b5328264d7c3bdb7851716c9d400c3170dcf82f8c176678b02185076fd9743e48bc7898e0d8ca283cb4fe20ea7f792382af59b00185472a5f9e3744d6d049c6b1f5d7058e32bce800195f7c91002ebae0828b2eb8e0a20b2ebae022035c6840025c3c90ead30a369ef078afd2dd34b26a4c97369cf030fa7ec7a5c839c5e069c2a31c51b2a6ea79b9ed045d061ac006131edcfdf44994bf8447fa3e7a9529a58d3941800d253c0e9aa43494d567863c098f35c562e6f35c881a23e1419410ad14d772f28a8ff0d02bb3d23f7abcac88111e7fec75cb3ba551d35b8447e9c7a622867d79bf6d10e1d105b98ff14eccb52b17081b43783c23a92c7dccc69a8a0d213c9e14837a8ada9f5837088f7b638ed95944c2e64078f4bfa51595af6d427ef030d2ce9acec478a7a90f1efba46499bb57542dd98307295b49cca521f4f4e3c18348a9c13e7bd6bdcf0e1ee96e4eeb93c23ebfa683472b9a5162cc9d522e95823172f0208ea494b25e556ec9dac0c1c3f89d1f379ba685f8060fe6b34f738cdab0c1c3fab9ceb8b093498f8d1a3cc82de7a9d2621a92c7060d1eee88aff5e7891ea9338b07d152d494e236d35b47160f2d841f99d32079ec583c0e319747fbca782179583cb49c23cc275c4f76ff150fb46ea6d6934632f55df1f827bea73e754f7e7d2b1e58ccdd7489dd937e563c1c4d1ea1dc72c7ed553c8a27395f86b6943aac8a079b5e6bb3480cf9d6a4e2d1ec25cf9c4a1d326a50f1702d78e590c375e7694ef1209bfeedc7ca934a19533c0a49362d91f27879bc148f7332f3e59be698b093e2419bb6e6d0f8d1f1f5513c4e3134455465bb0db9281edde5da74bd79c97c281e4da49f363169330d281e691eab5c56b1aee29f78609e27a2e53abf654f3cbeee301fa1e35a943bf158edf33564d3b89fe5c483103fd7273e476dba89871a7b6b26cf5d8d5734f178b53cc9665bcbcd4a261e76a484a65afd985205138fff7622237bd88caa5ce2c1a7d866956136ab6b8987ea194bc353d4cf66251ee5d8c78e5126850d9b128f53d9da9654aeffae27f150d37a6d4baa4c682d89472131588568329d431d89471ded62883edb2571483cca202393ff5defec473c085b412569d8142eec8807af5359be248d86cb8d7814db3c42fe38ad1d65463cd69453eab0e936529417f138bffce7c51039ca64453c8e39784edb79b4d824e271e49c462c5f08221efaa6f1d490337774c9211e9648e88e1df4630a89211e7f0c6aa366551d355288875bd7713f354288c71b7c3767b2f1888c0ce2b1977ce6b0fd39eab38278147290dd142b7c4d6503f1a025aaa6e59ca12c6401f1b0fb72674df53f35d93f3cfc190f1529fd2d84eb870731132287af9bd8b47d7814a2a710d54279bd46f9f0c026a44a17838767ad7b7874e14b6f6422d265d5c3639df8b28f59cdc3c396adb412354ffc55f1f02805f7ca7f77b535ea1d1efb854b39a5fa42dad40e8f53acf3cd9f429aac691d1ea4785448394554494a87875d2195c856ccfc660e8f35e68a30bab9f19594c3c3e89ebeffe251ecce38e4ae3e2164ab130e8fe35b47bad9bd4c38dff0289f5e38170f633e49373cc8b51fcbf66d3eba6cc38314fb3e7bce0d153ec886075983cb4d9c4d1e39b88647972c96664f51c3838f9f42bed385930ba6e17148bdb190ce22ea8d68783c95fac252e6f1b0e2191e9f7cced51735d48d6886472ed952ac8e17f673caf0e855b7a4a62ee6f893e1419ad4d1fa756b2f3e86c79352cf4577db6417c3834fdf6ad51c413e0ec3c354d9d40e2a1b933d303c0a53d176fdda6dcdfbc2a398ac7f17935b5ef1bcf03057be78ebf19713af0b8fe23d67aa4f9a2ce470e171ea9fec125b264ace161e574a7f133a2dcae45a789899dfdd7183c7d066e1e14bfc91cc325b31685878e81e172f6693fc79b32b3c6e518908f1d3df9459e1e16c6c85fcbfe75859151ea5cbb81027f58cc78530c045175cd005b8e8820bb20017169000175f8c0186174a8587d11a2ebfc5decace141e4c9ace15d19743cc4be171674c76f270315b1f85c71b52460dfdd0b80c141ef5e6f057979ff04833c76ffa62a2cde58407c1bbf37b7fae635c4d789c3574ad4dc896ae2d263cda48de651139a7946a090f733c89581f722d44a584079f2d37f2ea497810aa114f3faa5a2791f020a514215ae7a760e3111e7786ab893944ea8c111e4916e990b44ff37e457838a251b672c831b2a20110e171879adf1ccffe462d43789ce29b3f225e38b6b8020310c2a3d7b89844a3367ef3bb3280203c4a31b9a393e4cd5a1a203c887495a8eb512dd1d930801f3c8871e1d4732ad5181b1f3ccc1ba3125e73ce167b1a06d083c71521caff674d1163a70103e0c1e3c9316a899da7e5618841c2a8404707192710430c1c6268e04b051d1d60a861003b789c3c83c749b89c2e85706c1961b43707888dd160dc7f8e324a56dd18800e1e4cd0e9283d2145b44ec1184c06d918643c069083c7935ad11b27736fd0607f8e323290e3c3f0a2bf681f000e1e464e656c45440d99bc30801b3c8cc9d264e5e5babc181b3cd43933c9647ac9c4528347216fb68b9f429a861b0a03a0c1430916c3670e199143b68c27c366f168ff62446fd1d2df0d0a3564f1b8db463bd436cd7d8763f140a62a6ae445af0981c5c31c6334d2ac92c98aaf78d075b19e53da2b493957d468c5c30a9ab376e2c70929c68a87deff533e169ff29aab7814f4433a79597be98e2a1ea485ccc1e28c86114d2a1ecee85cea665fce92838ac79b45cb36af869b9e9f50e3140fca25ac6af2dca9bc31c5a334cf72570db7e461291e784e9f68a73a17196584d1a478ac2329c6b0ac4a512d8e2dada4408d513c8e139fca73af468ab91c62e4c8f150513caced14c3836cfcbcb1106a84e27134ed97b8da4da910c79659193540f170227fd56a5779875150e3138fca2c568fe6dc9bafe0d8c2e1628cf177821a9e78dcbeedd1e5323289a346271e9bc64faa8678dbbee1c4a38b9dd53246be18a56ee25112ed60fe31a75b734d3c8836b9c43fb26a748363ebc65d116a64e2f1076f9fed9877538738b66eb4d9834b0b1dd4c0c4c330bb696db977ffcd251e74cc64131d4b4b3c9a6bb14a137ab34bac120fea67f6dc3d45d72bf8306e8421067e1815e8e830450d4a3c8adcab49d998facd16a0c624f056978e1bbe35c4b14535a82189c73615324fc8b5390fe36f90412810c623031d1d8a891a91782817626bc4bc13ed765a7de912831a907878be22ff5da59de5df24d478c4838e515f9df528d195cc420d473c2a8d131aeda6e2978d58a8d18807e1d9de555bb27c638a083518f13085c8d7e9f9d7cb582de2f1745009f1a6d3dd948a781436fbece68e5c21ff5554a8918807559a528750729f8c9ba804eea5e2a138180a85426140100c00a2ee7703a3140000000c1c90c6a2d1781ecaba79148004443a304a3030121c1a10141822128983814018100886c1804018100605c2a0704a3c8c62d45e0084bffbc369257a23f999bddb7fd32b21b8fdba2d4880301b99d0b95fa21d49b69c8805bcd0dad6b1085b751399793f2f3e3dc4b466ba7720140fe7df9d8506336420245c729dca8547887bd994cfed1d11e0ef6c0c30189d097068a387b0f838d86ceb5f1fc09d0c2386149bfed580b88266b4c16f4421f8fe091d836d0d922af0dec84ada40c4d08a28297ceae059c005576b40f547b7e9bbdf1ebe9d1ad62af1742e3fb2c78dd726f2b433ed1943239334da0985626ae690e52350436e83a213a414178176776e4d71b65b946aefc6ca1d0e679923c57a891d89bd0d9f10b758ba2d39cf352c03cf055b85c14ab430b86d026a212ace8e862fe1f6267bbf0e4296c785c4800aa28c30122ec74b5c66608de1d39ecad92d204b25326cb0c1a0653788c7c483d7983d092e11e9eddd1b80c43669cc23109514a22ce9ff2125bd799ece94d0fbff04b7674709bd66c95c391db78df6b314d9a87fd228480bfe0b5b930ed49f81397425e29ba576024ff475e825a5d6b78cfad60e391cd3ce2409d551788b73338c9a996b14813c35e2be6307778ee01a5d50de389a6798be7b36b0230d275d6ec7c34560bebbc210b5b2fda213290efef1dff8670a4594d80bb4c987f599ec7d85d60ebfef19be57a2166296f795669f0867d6cb88a071ba3124aaf455c7e428692439b66322b1fad4413dddc423f1f5b8e4d770d4e85db9250fe00366fffbf3e06ad89a9a22c9d4f67632b5a5360cb3617d3b326eeba77f2e1e070e752467ab2faed20a4560ed6a3ec9c104ac44f5749fdfcf7fb8dd4df5197f57002c9d311bd8c6715c675a65aec41d7b742ef815989076b4c52f4873f0b93a9d26546debbed8f8e89e4bd362710229a82b70aa84c3e01a500cb1bc985df1fecfe8558de64f4a589c4e61fea001522436a6cab9e5855e6df63efa0b2e087b6c252be42e8463cd1ee887db54558d72133b987a97548d995e6fead59e8c7345818a84859385f0344aa135af019a5b1338f53170476ec89765c36f913dc7a66806670813a737395ad077688a2ae50bcb389077cabbedc9f3087aa83acd1864eb2be51ac5c9aad7055496680a19eda0c6451f5682439c4d5b43ece66447140e6ed602828a1a4d199e6f581a1405955abf7d3fddf2675e59ce01f0b06128722647d8c348c74e08c050e3e05a381725dfb94541a44d85c1ebde3fae98a5733b4a90b72e9bc4690a153831643de096afa0cadac9b926acb77dfbf5409716bbc0e9b296b325b4f9582ab52c8b719d2885b0f6e1eac6a3d7aba8e21429a35186f2482a9289d4ef5d1f8788a5e026b606bcc4aeac2a45a0e9b53e4b4ddee62fc389e5499d59435c04e717640a6abd34a5427a5336951c738ebd229902d600daee8bed5237aca2c2cdeca2eb021a6f2ad5a230e16196c60f4959fd4114725fa19e7868177d27b8620129bbf6f9bc7ee4e90358453842998f0d7c998579ec462d242d2ab0b7f8379bab7e5f5d68750bc565a318f817d630fffb5fa84f85f05af5871c9a4a15818801faf88a5d21f2c5b40e402df20db2c155d15cf4ff84be0577ef0f288260c80b9050ff8e46bf5ed514da71b7b8fd11a96eb062331df454982b13300cce0aeacc4c1542daf375e308afe9c4cf2e8ed17e62d1adbe29826cd36e9692b3300904d164134342c1671d0135ec4dba01ed6042f54b28c1ae9858dd69431f2abe4c7a5741f4c0735161b268d80a8a184815d9f4c9e8e39ea3dcdb5d3e642e57ddb6ae3b5777dad7a78672916d7daa549766433dec81deac9d7ad223b668539e32bc77ba492f19eb5535ee558dd59db7f594b1dcd8f4ebbe0fc4850950ad68d22daa95ce93cd03c8a8b8fa48408a9aae9e8ce5aad1a818e28bc90282559184eceb53c596a35e29aebb691c6d79d09d3c69965b99d6ed8bfd3a5a70ae1445f77a3f6395affb37fc0e942b3f8dabec24a89e3d69acb8b7d5ab4e324b7d469ffb414b49887dfd7382345ab70bfac5f12214973531fd1244c937fc0a7431ce3b3cab845896f55a757a91cfa89cb0bc58def5abc158ee9e6670fe3495a5a2ee59e4d1333c25ad27d19e56b8c39936db730c035bca14740ad250bea59b0e59b165b41ac92c7ac4eaf48b77ec02e3abe804e8330989f78ddb974e8a06fb078877f6ce1c11c428a23de9e4c1aeb7db0d125ad8d2931547ca71437ff3b8b2e128a99ba05a1718422d4a6228d4c9c607f1b732456b226e4b21c14263a0f0a34054a22b7a5fb8fe58d5dbbef695f7e9390c63932dfefe5981ec9af2179417fb79a24e9c97f803b1107dbf0cf82c40852577ec668f12c31aa3d58dac70c9679e3a5ed6833db7ca2857dd217634ed648fa4b4ec99a5128fb350d72268849135fb74d202c756380073839b7af6dd1457545de570aa18a6d5aa4c7b0059d6083e98115a7d1f9451bd8d250262f166200efc9985c8942708d41d922b27d32c44bbf9d03eb9a67a68be258643437553b5c414733ffb7cdb0301098e315697d2545769da55eedac49c77a5d2b8a9fda799662de09284b8a11019953edf17c03a312a10ece3f0917a0408328773e872f2bf82e8db334f3b7045efd32555b59f86e1836cde924ec0ff7e4024889a7033b71ebf10842af8d7dd1500277a83c502c07915990b9f9535f47fd83c180be24424273ae9f5f924d218da7e3f9442cb4ee1774ebf5075bf837a0bdbdd7c164386b1f8c743bd3bb72ac3e89bf878dd888e6cec38654542c4bc82f93530195883d6870def883f15dcb8c1a335a8b10dadc27e9ac0c08134fa6914117c45626f75e5d8ea068d6cd5dccc92ebbca285ed08a6828259537f8c02d6ea6616873492b28bcc05aea72854a30cdf4cf862c46ababfac98b32608a7bb30b04dc4a1653e714a8b5dd7d2ce181e1ede42151ddaaeb4a5ed45cf511fd58ea6c4bddf8414eaabb757dceb6744fee1b09aaf241d4248879ac14db4cfc7a3367051188dadf154b9edf7c2de4c9a2c9a5bd54c2db644317c396e80f9d75c2b6009b80885d7104e361e1ee07c84dfcdde92ea28c05c72773dc8d340ee254d2b8b6bdfe14e1a70b927d46c50c45818fd19bfda4633e93ba97ccd702ee32e861c153fcc89666f3f380ca758ad0b9e0f9c4a714196dc5381754eca04e172bef91f94d9f3c8d596c6cc2498e6f74df28365b423a4153b5a7765dd063a28d0b9d7931cabcacbdc01b370b5694c3f2ac0af9303dacbe01feb4cb653d48d998567a07c4dab6df5831fd51794edfae43d511523c3118b295660a25fcb2a3bb5be02340c606331dcccbe543a012c660389f6e269210576f2fd568b94606f1aa1699335c06e434ae18613ed3dd023cf732a0f5568594f04a08e278b242dd249ae6d800260275a1fe054d2c789d4b02aa8db56e2231ab2fcb9f760a9852ad6b6f47964975132e29af3dab9fba07ad458b8b52d4f880d005bf42209816e3528df51eb287c7c92dbc9cd7310d92cd437725f4a93c654b1977a560ff164405b6a2dbf473422f4ed9773c962cf38349a50e6e58be6e59890861659845653ad1830b75a958ccc5892416b89a93e4c9b2637761fe66736ec62a37651e299e4279301ed6c2cfe544ae71e43d180166f066d0b165f0c6cf4daecd2c65c7e332cd0597db8cfa6359bfbd884bbcdccddbfd9b028b2f7dac7683b9f1cb28ccf6f335aadb143db58014dd04e0815022dd8c985694a238f5ce4058bb1ab8b96ec18e951fff8df5059d0f576faa7dff26ac8d47c38e87bdc9f0086938158118cece82bbc9f5b70c476230bbb4e7d67de142045600be01d707dbb59cd91e98c1bde80709cbb0e944981e2df18d13a3156c9ff3d9a8c6523c60700c8ec14f9134946db1941d39806d06a176b8a0b187d02ad686fe8420ba6f48304c79c257d152b33ae93fcff972bdd03d73f4bad89f59b6843a340c30ecd68e6c06cddfcc26f723d0c192e116e436bc24e3e43f4aa47f6de5b52342d8638a1145e10151d9a68e062833e0efe19b8737a9fdce80ff7b841e8dd0c440ad713197b4073990431c9a592fe94d6338463f5d9137d219c4569a0d8dc66a2302089713eb731364697f29586730c6d883ff6e39ab4aea47a8533415358e0b3a51afdb2c496c06ceeba9029b6fcafb198a0547bce9cb558c5c0fe3403b819c249ec4afb8a6bb875ce8c5d8806301a97eb4f6a971518a678671b264ef19c86eab20cb21bb342ac9552d4bc7602f6f0cc529cfe628f5993eeca71d2050290c1088cf76595c2d0273a5a6c133991088c9f487fc0ac621578944466769aef36198d935486dcccf2e153cd5dba7001a7f9a85eeab99c823bbcf0d33aab6ff25a5cf90ca3106ec175948e6e38a266009d361e4b0f4fa013b5a3359c8c575480c63818b3700d4aa3ee3f0650b2502ec56334c327d4466b7112db62090da2306ec45553115a013f4b8adc1d19a1019a402e6c425f179c64d8d41bddfb4a59b0100f51e0dc66abb4a9d6ad55d4c332e86aba56ead0e2c99e1c86259ef0d0d4f4d54bafbab676b587558e2b63d3279e13a4f40cc3346e59a8ea8aca910083a4766bfd3d7af7a477342d176530c5ec27b15e3d53ae4657f6bfe4509916a85ce68c14f08cb543de9b50d50595232106a3370e97a40721a5de68f5156cc345da901566cfa8ccd47046316301078389cd45fbe08cf7ac3a52b12f488757867927151dd269f7211b382a76483a4ee0361eca010cfef4520da0505b005c72ae154c29fbab618fad4778831654a9aaf78f12f32e4d76a5abe0310d3bcee4714d410615c74820346e4474ba1f61b85128d2f83f3f364a08676e05f10d8b9728bd28d3f11982bc4b18c66314feae8a22a7d880992a785420bb8e5a737d88ddebbd48724916349bf588357d41868ef40918981dd07bf2255da9c34d7b79c34b5d23a274cd444d82853efb57584a33910d7f0f33a68d3faadcb1ccdc787253b94de79c89daab354daee8253fd370ba46bcb7e3f9f8d5cb53132242816b66ee31fa97d039386851506ec535599c6b8b90cf71ca76f143d3db19df02f5d7d195661e227cc7dac2c9ecb0cdc685119b99d0109922b334acbb114f80d4cece1ba0481befde0116d40cf15159b0a419b8bdeada56f2defe9926d36273d4f3aacba7aac6eed788ae78b8433f373402686fa2c3c1c800de6fafdc003f7c510ca3bf129b33e20b52d705bbb829e161360bb642a0f76b78420ab9a2e19da3edfc70158e20beb286c79c964d2bb75a18eb953e9eea328e080100e6121b5a2215866cdeffcf1c115080e7ae863f6f220d6564d8d003f4232ad323e7db819731405aea1d171acf5594d42831e56a4af3563db3786d6547ca3b7905cce99f6e24372a158cc64be870e71c3cb79c0ed2942ccce83730562ae3ac779dab0d700fa0884c32b203ac03de772ed4c967044c6e8b48cd6a2ebb887aa20ad8dc4bb4c65a06fdc520833c5cd420173c089dc115133d9d42f9a92cebf6fea1586020865c2a81f1b25b8e07085d4ba12d734b3c7d782e71c5ee003c57f0ac9da60a1ebae8eebfcbebb49dea6ed6f5f6329eaea7e6cd7b7f4ff1f77d8f369dbb69bf00c115c68ae080d1067af1ad16eea0619f15f8cd9702ee7f0641bbdf0761cdd02634045ef5ba1f475f7848755e48291b6f464a5c50f4f25d0bc1e08c9f9ff0a130178ce43930ea0cd78469717800a0b9641ede252cb5b4bd85c0600beff3f319830b69f688d4a16085879e75775d21cab736e9fa31cc981306cafc312f8c2e73cac432f3a931e02c0ed58663764c1a46cef067728c16a3cecc982f469ed165569958e6c7c864f4cc4a26657c3232cc3693ca6419ffa4e975b4d401d9cc1693c26c6ca28e6346c3ac65b24c2ce3c46832eb4c9a64d41442693778cc9af164d432a33460152bd8925c1c3b51492765e3734c68aefef8031fdceba2b0e8c76264024dfdf48e66477648b467d6a82952393264a1ff77bd4f5d9bc64da6a971748e78e7d9693b6a8e8e333e599c601a81e34c27e71a030b67d6c975541c08e7ebc87774ce6a27757c388677e726742f9e4467ddc973469d6347e7a8f66c8a42424747df5173b69da8e3c0d13bab9d9c3398f0bcf1a10d807e7e8fec47fa234d887ea12a9c7fc3b45f25d48a6a24ed2d06e213a8accc1cf502848478bf6f30bb23c2ff40466d3b7d345d2694da4b0859f5126d59601d1b28f456eba1c2f06b94d442da153f74c0568b48384d8181fdd316a331e498751b45867dab9100aa3cbbcc569b91356fdcc698c98787210bb6c33d7b676b4bb9810655ffc2c97271c4ae7e246ea1d682a72739b451f4511e68cf6fa079781cfac058dcabbad213647c8e9db0a2ca83a1b08e03d828ba6220281524ba180f1061dec23b757b92700820bbf216716fd57eaee4f1930af117021ad660738303770f21ef58d0d1dba91ab993d69c10e48c1648547f535eae910d1eec99ebe755c571d85f4731554d18f3064b392f38456bdd17983dd03ac403a0ea2f4c5458141abb065ae87e10293d2af5e06859ca435a46d2ac9b85154901e6cbc486822ad3544cd750723783b1b3ccf6b22d890a44228dc389ed9324897b750aca5f0a6e98c335986f14bc9f3e221117c9f57f9f405dd6c9ee771a4eb88fe47fca9e476b380c80f3b573da24203c774d500ac26df0ce79e1c9be44c1d086ef60be9ba27f027de8ab507686d35d3c2e44016eadeec71b69400573c6dba1957262f8321223809c1f5dbac1650b65a1327bec3dfe639f0952fd0f7f6a4d41b2a9b08787580733382dce8351b3a581993377305305a44751a7d66abfd6166fb125164f516967c754e3ee59e3b28616de230ee90305048904962fc8fd9e53a4321e64799d9585590ecc324faa09e16074ad7c2963fa01d6020946482bcacf1d62fdee77fdb828879a48d2555f90436db4c32b0b1bd7646a3ede4a673816214036c3504602bb54e4d419059afac899d7a5a66117b80a5e11a6cd63f28e1833b9fb5f944ecf6aec0d3d60d82dd8647aea7b0ecaf917d27d6e08e874fe97e69a417bfd7d7ee036addda7ccdb69260be239d2e6a61df83166926a87b59d9601f2c159fe562ff7c6d50131d196dbac6c446bad8429bbf2191197e86e45ec379f6621d6689b002a3b34f7f2320b297a40abe853efaf52ae1b70df4606dccda45c83c778d4a3a3ed35540897f3518872c3bb9bc2f195c203da8d0dbb55ce13f632a3c99fe01543c1d38da4160a0fd09486210f04966bc33e0345cd5ad89f3f13112bf852a5583d585084657417b7e03a3b104734790b8719aa983972e87ae29b5b3d4fe85dda954384f50c6dbd880c45afddf50d6ac3f9bb05a8fd045a8d232fdf76ccd52cad4508b65f98d6e4fdb69655859582a5fe8ad50ccb3a74d893ebda8e800c40b6c65226e8b62457ad518cceb695424f683321e8972a70835b3381b44e28376dd04d8047e056f76e1416af07f84f228b7106decb181e6d4bd2f481d2871e734caa6774c08039c61e204d0c15099e29b949a1e5d3913b7bfae4c812f3def92f9b1e0557df0fd541bac641cc32154f0c370938bcd0f99c886b9aceff6716f5e3d37f616b83b425c3940969944e0a994cd477d266140e82157a978c009c8567cdd0a5d0f830e7f311920c75a77eb69686e816162d32ac1eca8d7402c7abbef1ec81a095dd344c8e85dc8bb5a470f110e8719d227b5c2556266b526eb5fc079304c14da7528431e7095f684cc766ef42d42a1312d909012e1a3c77cc2ecdd443c36a4c850805a10fc61617a7b1bb80fd4199ad2b3a9a33ef5f24f5cdd8d59d8b2709fd9f297bee2e72ca77d0ee646c0d8cb9a746712ddf5dc0ddf4d565768817fd5ee8ea6fd522ce0d75a6da81897378e2eb72e8ba7765f1a76b6cb911bb195a7653588c0d65ac88ad624197778033393757f9a8465ac91b11dc1212e713e85ea28b73b607281dfa28bb381f2c449d52fb5f0fd508a9529c98ef0c6f527e404351c104afc1c93cf30fc8e04a62bb6aa31f27940ea1e1c241a2f5ccd07b57a56c2a4dbd8844d64b8150916a894b7c627304521fcbd63574620f330cbf496a90308e0ac989baeff03ce9d3a2316f049558f937a497cd309723a34db980ce4a3578c05874bc584dd4a360cb999068b79f703716b74552cdc3e5718b6eba33f37fc79e94d53874d97b949fbcfed0f04f1e8c13e133855b20e274b19c0c420cc848c32e4c5cac677de424eab911674c98037d8c4724f4b0803fce0ca19c01a8228827785e652c0739479b7185d49d8b169ef034da738b3dafd16dadfe54b3f8d3f23c697f5c18b1795c4a9606ae648b2480089d2af4b2800f2b390be21c1e938013ee574287b4d6cec82ad4dfa2a9dae5e9a4272589ae52c428d831c35657a134301af3b14bf7a2033a24c1e967ad6204fe625d090b9a37afcd9e925e08e4356c649a8087089c12f15416ce3416f88c2c42a4933e58573c46c40c133f776486834913ddb974b46dd6fa6275eab00b249f485274329409c8a86324bb901a2f61c72ae6e3986783b8f805ce937b5300803420e4e09f5000ca098a075af9ccc42412b4c967bc6b7e89ad9d3592eed86adf901809762503fc2cbc5856472f24a8bb7945456aa160ece4882b94dd7cdf21dc1bda739093c73695f9e0c7234a1d0460ce3499322caee02d94b1f566c9cc85fd79dfd148b8c6ed30c3585b6446d2cff75161e92391ed88d1fe610be3fe6d5942560111753e55c035de525d1d7ac62c88f32b8b8e9e5b2aa0edcba4f84113b2f82561002892fa11b136b4f620a7b8dae6ba51e536289b81e3af1ed9631811489ea50c919cd1f0c811f2498d919af15f547803f0610518aacf5c498717f62c54d513c9511dcc8be4e6fb43d7d34de08e96ba514c4f0f6c1875acad8508517a0c8cbda23286c339f97081b102fd8bd336677ba38977fc9fa1c4f5a25174808c77055a98d31d5ee82a047a19695768be461d8f873b89a4db42687516af955378b772400ef44c0efd9dc93cd04b1c6f99f47f486fc13d2179bcae0dd0d1687c90811c57d0ab50fcafbfd03cc2b41826909910a9c05935e092718178db9823a776d95ec4e23e9c557db2f60e1c88d30c5c9e98e663e6af00c9ec2aac44e7fefa1f3eefb242981d921cc11104961792470bcd17d1cbbcc505962d81bb44d61635048e7a4508da5d9ce50ba721f713f75b6fbcbac5be1fb880a8f984756b20791e2f903540da105889f7469e222a2a264f252b677de6f3125a00f3e979b932cc03bb982ba7e17081dab2a46e348b774dd9ad50fa3d27f0f70a900f778d44cf3ec017f439d036d2e9e004db7378bdb977d04bdf5a30bc031d7a28731ec85c042652ad41dc8b7451255fac50b679bdd46b70c176732e852188fc3ccc9e171d365014d3cc627683274f5acb223b3e85b9aefc5aeaa887ca1bc76c0df536be70491fa7649c3ac846835092c3423d6876aa7da75e2e9035648eca10c543fb28e6b56cd54eaa4a40a88e1c84259f1a04318ff43ec7de21fe98d03d358e33ffccdd9b105f5e393c4e49d24d3e1fb049766371a821d62478be203d722af4b4904d4677f0481e45f939553b77c572aee1818ad0716390f4d63136e6b8093cf1c07dcf8e7eb4a56db23c5921c80dff573ca63e04ec2266c6364caf9ef2651821c5acaad7b4d2e199567ffc0d8e6b76fae555abb1279a267b2a4fc5979ea97b9072217749766e60fe68501d8e2999ae770d062ec3a899aedfbeddfd1796c214ec20454dc17c70586120063c7c8e5307bb20db86de8005e696cb243b23406092292dba34a9eb0043e043bee8451d1fd436de1e98b6c36eb40d2bbcc103c86cc4b4e80c949d66b8dce3b2ced0a192ed9e44be6fab6f2f7349cb6bcfab757d134e71ad242a32e34459149f6cba26a6fd30a88ba08fd25c03eee2fd05e0d5531c26900216e70b0b129c8e3f22a22d4fc20a73e4667f165d814602c76dd3379149444c0fc1c08120c561e2fc31de2e645c81f0708c70829b6e68a3813d6dd8d5dd58479da4bbefad20aca59c25d109b06b512a531a09e5546a26b1f2da9cd19f9b09b2b806e05fb95cbb0b1726a37745ce74c3c16a70a3397d93a79820d204ca54adf4c78dbc789812adbc1566de0104fb7d13af43b25a95d493d969de6d242325831a337d57ab897613ae1ab396ac6e0846a785ccfd0ae784b9f4b8e277b8efeb9c53d490f2227d76292a27baec838e80f0a21dbd3d8dda8a6ae3349f988f2e9ea4e915139ed23ed2e12e1948df47347e3b41b92f4ea88a7330f43541a5c2f266df5a670e9d5c3103053ae01b01642c65c127e0a339699ed6d17748f88a8e29416b49847cdf58315a73f5846bbb5b218a67c310817a10c521b310148c08932b4c468229898d2d70cbe426c7ace3d1c4a878717174ba1848294c6ff339c9531f9b3dc93e0c2fc4c5b5c1bb123b4d08cb3c2f227dd58e4ecc97b1ab9bad005d463cdee36bc5aca3a8e1815b60ee4fe7d016656238be25551c0965df609529edaed323b816b8205ebee408088468607e8539a65fec22b66aaa48fc5e8e2bf0de41d7614bae44b2a100076cf1a4709ce935d739dd520696631d7ee4221541acbcc9a5cb7935b442c60c2487980805db854426d1c4d42e0a2652c822cd27d0076074b12bf5d661155e9092826d5e6883b04ac29ff4e14642271e1f537bc38036ae0a904ee95ee3fef99e0e1191209530c80dfcf7358913a3e50372b3282421e2869ce881517d739584601b8f77ac60a09dad4ef029670d5809e9960169763190567ebf753a7e2e9f99898e479a0128c3267f1d53e7ffe846dbec23549b4c9bd01afd26134bbbdd680948857f3949274b77e0847d621fe6c3a3faa4bdc1be30333a0bdb989623d36aaab189596f5b5ed3c054b0e9d9e74da6a6375bd1e2b11f266ba65d5bbfcb35df3299b6dd2ca52cd1fc8f11347705c824a8ff85d7c1f370d2d4e5c4abc02cefb134d3a17e9138fcc04c7458cef4c0d9ea9792a9fc30ceaf2487798c282b9e0d8b9b3460385d989a43f04d14458b3073ee3e17aaccdfd7957f414ce1215738ec7c95ecc1b11045eb3ef8e8ac25a064257589d245a2be4830d14f47d3712b7bf2e54a7665b6cc9b0ee4e26ce4754eafeded9bf732f33576f00a33795135f42513716df77a8691b8b76904843b0a89a8ed209d19926495cc83ff499463059a6c102f74a569199a9e5becc37d61a3ad4e03a37a6879c01606fc29f08964a03e4a2762195eca113fff9ce2a2412587b7f652c7b075337a903b95301e271016431f9d984270ea067bce179a0949522810754369260b9c302202141b8258b9034b93fe85c9aa85aff5e214b0b3f5a2b922d3a66852d21728bae96d50e26dc34e7a89a512954480d00084242b116e1f50d7a6f2a5f458db5deddd29f71305a5ee34d73c1b944fa6c4f52d0e0d4ae1500439b33c062577ae9ff35dfdb9fb7d3d9f4e76237760eb340a400d2273df4b7190d4638a4e376d31e08b12abb7acfd2e24d2e805ad251150014aecb219c32dca3e468760fa6d745044cb4cc6e69f7cca0ea3cc99db66ac4baa08e2ea3936c7438e8d886b84e7772ec1a22cb3704204b596822d9507c898a4ac3150c1e2830c054ca43394b7dde7244158d5ea3ac25ed8ae02a4aa02adbf5527714ede2ee3911008d2b6dd2bab4f10189dfb4423600a34f8c4d87369b17729e26fec91e4b0afbe239f69d22d424208713d93d5ee0af24580b43bd1028a9f1363c4b1cc300c5c370f79092c5787d535811ea5b3ad3cf1eaebb928ad0d09505b07b241da8d7dca39c451bd1a290e6126ab2463a199a6e375f5ada45677b393fa7950149a53dc19522e919c5c919474cf4f8c8f3e4dd3e4b8dcb3d4bae4d44bf0d64225153d26536dc933ce73e374415a935e46ae32c08f57375228ac0ef26161548ae450b8f4edf0feebd01993039ef42f4724c8b904eb9468288f194ec784628bf07834e8ddc1c4d9ffeaf3bd17a2c7653254efeea8dc4e532d3bcc4490e2636987530cea53891bdb582716d74c14ec9359c745f32e7d20c3a45aa8dd919b215c38787be056e8d65e64cdf3622d2a95c40073520443b3edc35a04fc481c03e0485059309c4d2e4407cb984ffbd5e86f85fe99ca1ed93318cad5a17e390beb977428a8d5c63ba27b4b011cc102ee5244710b3b30eeb4d0013cc3333cc33311882c3aa6bf12ea54f3b6056bcd7e37f265da5246cfe9a4ca24df8d292599644ac9e9eeab4d0462a48d9a080e42be1b6c0b490b1e0ba7053f1e0460841802993bd7eec5b4e0310c414821fcfb7cdad7cbe494680218a0ac841002dd1f55757049b72c4e4fd9dba17470b743b9e02d6410e8d16c17f5497f4d2e8b20d042b52cc7cce8cab3a409043afee3ebf51f0181daf8ceaad163d6edff807c31e8bdfcf1b2ab674709217e40fad60b7d7d262f27973e204d6b41fca557eacc4d7c406bd72ebb8e27b4e5cb8d08217b40ab9616a53295f3ac4b3d2057a696f4e6fc924613f380ac8d69639a17e53ec76384e001714ade79fc51f572c877406f6c31f1b28e754fb2036ab7646edc462deeae03faa59e5799fcc427edd001b52e8b5ae775774a35b21042e6809695a6e7a657b3e9b58c1cd0ea99a734cbfa38a0477ef4c52ea15e1b38a0b53e765d6a72e9a39a37a0b478bde0f1e5ac36f56e40876ffda4336b17f5ee362067e483f9795c173c9c3d086103faed74c6a99641f5e942d670d62f677b26a90b51034af5bbf2779d4b033af6465772b51453b7a20119ae758c4283aaf5287506644e27730eb9dd2cea6606a4be4f9b375e0c2ff55306a44ea67bb5e0725eec6b83104206947c613a6939b5dccee41d848c012d5b87d79f255f7c8c8a01f999749e7e9cb9d6823b940b72101206b4e819dbafa3fa98f14cd9430d84800125f4b396f46d797831cbf20b215f40e878bad2357721c40b68b1a47faed064ca5e1750b2a6d44e4b794175b6e8e0e16ab910c2856e7dc3b3ed8b977356215b408da994b2a553b9246e14952d84b481faac52ab5add324a9d336c84b08196df3e7a4bf9e52a8a0aaa11b2063a73dd95d4f2d6ce0a53f6d440a67c3f97e55beb8571a885102dd89932b331d6dc6b4c2e2ef55f7813e77a5e54ca1eca5a3d50be503abee0902c20c7e5a756e2b5b4ab65ca1e1690be59d631b769415c69a5ec29e7f17c85902ba05eaf7f874fa37e3298b2b75e0565d3084903696fb2ddf28ba96ed52beec39c116205c42a759aeedbe59d6c52f6d0409af43b17c5c5f62466ca1eca8a8e3423e40cf466bc7e472dea69198355083103a9579f768d173c534e5540a6af98d4a2ab9d4efa1f42a880da36d328fec27e7fd214106eea9d7a75f0900f2165e0daedc5bc8f3177089102eae5b813332fcb253dd321840c64cb6e3acbb252fa252f4b4814909d95b4952e97162f79cf21040ae8275f539fc46339843c012d67945a88bcb67859b9fc1027a0b518ff1ed53b4de0a44e9971e76252f6d643c640d9e8bbbc6131563c7106214cc0131a842c01252eb4377daa8ccd6af538c81025205e8d998fcaacb1fa09429280cc59629f5ce7b05af0fc878e747874e0878e14460812d0b79d940e3b1a5ed6ef40c70f1d3c7ce50808937ab6ec4d3dbc1a53f6f8428c80962593c1a3ebcfa85bc7514e8f10214540272da617f3c971b1ea4504b4d85adaa805cf2fe6f4870c01255c8f8eaf54997a932142409d99d2a252aa0f09024a4cb8784aa9cef2a57c0c905aa045992a66327a76d7295a20a3f61566ebb26c9693406681723156abcd7c32c73f1059a0ce45fb2cdeb37b54060b20b1407fe9e8327dfb9f7aee3c0204164871f194bff5b2cda87d05525c8b5fbd2d7c949a3ce60802c415284ffbd452634c34e715931c39589078006905ca3777e9f97c19405881ccb2d851efa4d29cfdb50ab4b43985976c7bbb7a54810cdf6caea4566bea41930af4c86dee0cafb3f39f796400410552e7d61d4bdfe699ef4f4eb19c36ede66a2a5320bc77938ee3e7a5aa3ea540bc9678e13be6785599d3060829d0e1a269cbdef868ba4681de9734aaa8d42d893f7101441448a94a76a6cb194fa95628902eaa879795929fe7954081962b75c64a355ad2952501c82790bbf15607ff9cf77f0f1fe909a4fe14ef32e6b871bda1014827d0a76549fbcbf4362790ae36e7fd18a37906c826d07267d768068826d0e5edf26b1d33799d09f47ece0ba7be4a283fc2f0b19840b9cee2379a947956c653f61c450cf7817809b4e0528bd3cc60b39d329640ecaccb92c7cf39575f16942f540f30b212c8dc4c953f36339e43097438ddc9c51693d249bc5276053c4e80d7360099045a7ba697b3294fbce8d206104920eef469497dbed4a9ed8c0442ed34ea541a73c87f297b394ccc848b2d4cbc0081047af58b99f57cea6b17bb007904423cf89734579dc3d7208eb8136ec49d80306211a8d3d9c58c99a3b90c2a021d37cb2d9feabfb8787262adf2c3470f401281cca2d6626bfdf0dd9a0d0108225032b3f692dd219adf49d95b78fc8a41208740e72c0639edb72fc79852f615175b98e4305959f9f1263972982c2238393115c0192086409bccf8e2baa8b4db0d5208e4bb9472f6d4c935f192b2a7a357004208e44bdff951994ef7d58e305652182b6610083b9ddf0593e9d964021041a0b5bf653e8bea2cb89fb2a7f23a547e04021d3ed766f1b28dcb5fc56e8772812282000229344bcf62107f51a9900fe40f08d3d95c6a19a55d00f103f254fa9abe29fffdfdba0f68393c9e166396add785cf81f00169735aeb347d321dcd1ed033e72b937cd0f8da15d7036295cbe95ba8adc65806207940278dea3c54a6964f9b182a5d5001040f686dd3e12b3aaa3ce70ee40eac27b957dff65903c40e88cdeab4c3cb6a3b36ae035ae7f0d55ad789666a41e8807a71ba33ab95bc2c7c2897734089edd77851cefb262d881c90f6ab39cb3289e38096bd4aca8b515ed4f872e08078bdfdad222fb37a654f4e7600f206f4af4ced52376ed03a9f00e206efc63375d3ccaf56bee011464a0e3440da803ea553ce66fe2c87171b5022fef65a166ee3723865efe4e4e4640b931c262130e9620b13c0000508206b40aadc96b4a069275f675a0de8fcb254e5bd2a3dcb2b0d48ffa4c5d29b7fa7cb931313c000c50720684069e1b3e89ec469f460fb0fff80e730c991206740667ba985e78fabffb4470c1033a03f5d77c7d1531d26fda587094e4e70005206a46fca67de8caaa8201032a04d6c7636abd87e57e7a0478e93931cf45051b901c818d0a65667e987e9fbbf031d2b772977af43e5478388011d33bd7acd914f9f65c280d49fe53d1d5efb632318d05a5b49f53425733a198a182a3fec12bf80d896d23dc6a4e405b47e0a934f3975666217501fb3946a6ebcced5817001a93ecb5cd49e83e887c243c72901c816505aea1d0fa7deb5b8cbabf4f8b1c23c40da38ca6eaf741565f11e602c60bc8e05c206b2652dfbc668bf2d45f1d1e3878e84e263457f00b2066237c978953777212f0a8a8f15544b2b6018733c0051037d6eb7de42cd938b262d2063b5798cb2d2943d1430c0f045932e408092f2c3c72f3a00c902d205d3fc82b6389b838f0564a999bd4fea6975bd02ea656d9afd355c4ddb34101f9569f55a68b6af06c40a686132455e279dd387a2d2c31c26103450732f690fb67175e6150620672c7998d32d7b72b553d4078819c88c9aa378ec0852853bd901420594c69341fb47f334e652f6b80099023a4fb3b3f4724bcd596520c74c6a496ffcfce3ec17804801194573aa7549eb5e7521039df751e78967eaf05514902ecaace694514999c35040d6ea6cb772a3d8d015e409282d2ecbccd1c5cb70f1e8a1b2505256c2f061d71b007102caa5d759b80f266fb2d50494c960328fc640c6408b2f2b4595cf0494ac36a565107b7d9a65092851adb533aaf605938228019daeeb63d67399f39b297b7c029204848b26d34be92d7b1663020812d0327f576f16953809204740cb8b2fab9b9596ad5fca1e881110be26a56a5727d6b34540acc6985ebf646b5f2e0d1022a0749f34ade5e4a2f0b40219025aaa6bcf3a4a8580d4f0ed49ebb8315fcb204140d74b532a744bc9d3a511d402a529274e4b5f93711b2d50af5ce5c57a9cb277ae04039805625d7cd4df4ac664cb8aa7b02c96d33188eb4c75bae7d103c56a30805820c35579149fe193a9c350e911c60dce8e01c0c2175eefd87bcba28a53f67ef8fb7895d32d18c02b7a93b15cb9340dd3ca8f1e6080e109e5550cd10cc015e896d574cefff87ad4a66c2bd0ab5d4c5bf9b9cc5acea728cfb1629015c8f03f532fe7fca14a95c30056810e9e1e3e69d09819d524e97519118cac012ddff4b4d65ade93f352c3a5e29fa783bcd28014a7db5ad671ea3e7634203bac765632bb5e56ea33a0c3e3ea072dcf987bcd8096e3e26c77d5ee5ea70ccbbb39bee49b53831132a0f4c4a6de13ee2d9e740c88d382cb2cfb793c1d356240a6add2822b6ff1e30ac380f4701d5cca9c3c77be6040cb9dd483468f25ed4f288c7c0129bb9e566c0c2eab157b01b99adea32b17d305747df09747b55c1346b880cc32e6d3bba9520b1e2583912da063d4db2e2ffa2e7b0290869136105e9b6a2e47f98d75c561840de469a7476f5572c3c81a48bdaa63668b8b9fb58a0c236aa0b390d7ea5cef799a78d6881690aff695a6d6a2d497be198c6461040b695252d8f867492dffaf1d3d94b6317205b4fcd6ab5363bcfc9e9134d0a7de59ff05ad0f6f5b01995a6adaf575653e2934902a3c8c968a793ed9198897b4ca20bf32f7a53365b9488139619870b185c9c9c9c909df2446cc40bde862a94e952e6a29a5ec1d932e40605a305205a47c7135cb6c5a3c4205e46769f59a5b964fe7d874208c1bfc07d4b3e0b0b91899023a3e97c7e0fa8a4a18ea55f6874a8f1583819132d0b16316e475b5964fa63cde8b66c18814d072af8a6b96566b7c4e064acb82684b5a1a7ba8ac60240a68619a4fc5546c9653e9c3a060040a489d4a86bad8b8498b9e951415142f3ce5952005252881a1ca8e1d19839127a0a3e628b5fcf2caead8b51a469c804c9d77e445732e7f65ca5e9231d20494ec792dcfa27ef517eb61640cc4abf818beabee3b8c30019d2775ff85a77a0b9a3c8c2c012d5cc7ff4e7559aa7425a05fb3e7e4afd5ed5b6c879124a0b4ce9c646a9dc7ac0c129069c5e5a4bcf838a7f59123a063ec4ceb7b2d353375da3062046467599452ea7cd9305204f4ec96cc8b9fcdf5e928e78cc1c10811102f9df0b4a249c6b039313204b4c796a5896af935571f110262bf956f4bba653dc69b180902f2d3cb3957bcdc98a54e8f5aa0fc05cda37a4b2aa5a552f6101422b440665399cd51c5cb667f16e898d3c76729f35e5e8f0322b240c9523abeb70bfff27462814eaa0553edad030b747cd231b5d9f2719b57a0545ee6f5c9b4882bd05a54e23dbea597ff6f057a645daed49d175467a5ecf6ca4a0f1f3c507cacac082b96b57bf6d8f2a31d386a126f1222ab40ae16548feabc0b091155204c6f16efdb37d545d3214452817a5f51cfd1f49d74d64105325f77b4d1ec28c37d22a740bb9299a53fe5e2b31f5581882950b6a9a48ebaec154331d67f0ede043c4e70ae1322a540460d3b7361abc4b37cf983d1cb7f0b3544488196a33c61c2568acb7f397e101905e2555d9d7a8e597eaf28109e635ad952e4545ffe059150a093d4797bda360b0aa43e9d5c49a51fff217f02a9dfe3e2dfba9e409d7c7f0e2ffb7131d50974b9cad8a7731a9759750b229c409c6971536f47f92d4f4511d9043ab94cf254efc5d39db1404413c8682e64eb36cbae33355610c9047a538a3771794c203689779d5929f5f4a54938885c0299fb5eb679fdfb1ddd12085766e2fade59bbfa4c728871722246259059904df7afdd5ab68d0e5674e025307f10a10432bc201e435583cd7e700e229340680b2ed8bdbd1c1fb3229240be0acfbc3ad77f4a5724d0f963ae55e26b1a44208194ff1cfa41957ba6fd112821ab540b9b73da2cb53802211b9bf5c9f52a228d40c7cf1ba5ccb2b9a96718b15a7b7b51b31c3f2b3113441681165f6c0b0d6df3d09015812ca539f75ceaec132e35834822905a6a83c6d9f48fab1c83082290b1e937cabc2536ebf510c8acfb362a4f2d97aecd1068b7afdb7159c38a577341a4102861f3ed1b5698bcd4130225372baf99977f47641419045af7de8e69fe92da1e1404ea5c661db4d3849e5a0502e9e26fce9c5a52caf603044ac7f818553df9f7fa7f40c6987ac34e4e7e40867bbd97a70b2fb5180c44fa806ef5724e93b8ecb3151f90991f4f69ec7b4088e7797973ac17135d0fe85c159e957692d1dd95b2b779408b5acaed6e3195147b2c2c8207f466ada949d747fbad53f678f4e8217207b42ad51ef114db1a4f4e4e4e7e6000c610b103520b2f2ae9397ad2abfa19227540b7ded662f7e598e5ba5410a10332d5c4f53eae78b9e780ced7d266c9d6b386881cd0d29d9ed3bbb5a94d8d03bac4f3a7bad7c001f16269de60be5acc67a340e40d28e52bfbdcf5c5ecb36a37a03bfc0b31fda7eabf665386481b503a6b1736a7d669b6f71d88b0015d52067d73a117ba22b206a4d4729ddfd2c9d8f1b58608226a40cb9945adbf97b530ed77b17c8ee5d28096b6ef722ef7fc4a251a90e2df320a33173e4aa97e40e40c8819973633e27dea84226640f8cbfe6647939f59be2c03da5edef98ada8746a915578308195076e3e11f3309d5662844c680d4fad7f23b6dcc1f667372b2bc490e931c2a9fa27e9874b185182ac7c909cac9892844c480141395fae725434c9bb22abff24c0c44c280d2f0abf4c9274d32b62c820145be807ccfe6a27e7965eb1c15f10232e3c7e96cbb2fec679d9c1815fc824817902db7d256adc6b52c4b6888700125f36937b32c6332695a7cd10a9ec816907eaa7cb350d90b226da065469963cc769eb6512988b0813ca969d23c0bd15b9d8e1494df818e95ae82c81a28f1dc4a8cd9c74ef2a3065a9619c59972a5b75eaa05d409d390975d536338b3801e73b15bef8e5840ce8b2a664d98ac5b5d01e9da4aac9e334faf5f1aa871399dcea673324951c810b1025a7ca93d6f95462dc6ab051134904ad33cd76a55a1597efc19a8d5f76d15377ab2313390496eee98498b930d912a205e56d8dfad679e14a1204205a4ac97cb35ab964a6ac129a0b39cb47ae95a7282481948d9964aca132e7f5e951450f2c574ebda855b7b193344c8406997e9379c7851c6144601bd9b451daac2d36e0b14d019f3c49bf29884cbb993935e9982c81390ad5c4757c2b532b18f21e204d4c7a7df54b9d12c6935019dbd320bb6c9bb849e4e4e44c640bfca18f32f34cbda73224c40bed8a2d0bc1defa57f4620b204b4ed67d5fe9eef36eb51ce8e0f224a408b3268cb6f4fea650b4592809626bb2fbc78b3395f24a077d377abcf59f2c23f822c881c0179aff73eed4ad728af490e132e50eeec41c40868553adf53bd655fec1401592f1ed56b8e8a10019956eb6c7c63eade8e4183c81050aa2e4915af5bc646d9c909ca191121a05cae7f8b3a770b184482d0ba7756e5afbe568ab540dbccbf34bf6eaa64450b94df78942ae3e65a579a0542d5dfbe4b62cbc234a2f1624971c9b4a4eca19dca0f1f6d84c402a12dcdf44bf681053aa65461e2d4a6c9d72bd0b95916dfbecfcf7c75057273dea4e329fda0b669054abe976b9757ec9b9d52f6763c188ff2e3bd60932e40e0050f1d5d6c7102ffe11f50e9f14305292841094e4e50547688204700d810c20a74549b63966592615b6715cb2ea63e77c1fd7498b2ca5008510532b7b4a7ccd174c796a940675fed4a9b2ae9528b8a9053a04b0b72ebaf9de5e439299b8313fcd283875953a085eaa9f9552d8d6b580af4eafad5b2634ca72d2705c2d5accaf71c35cfaa4761f4b81b3115196dcd8c5912aa52ea1df59cc48738c073658488021dfa517c3e5b61b2251448d5aa3f5e9f7cf5a705054aa82797fc7335be539f40e8ef77fdc6a82750ba346fce7f5cce974ea0ce5e65dd05d1b06d09e104bad75cf8b049a9b633433681b0dbd352d4633369414da0b5244665ae4d2f956702f9f572eb9823afc57d238460029d5f6d85a9bbdcafe52f815ee952c7e95de5bbf20ab14448259061c655291f55fac564082550de519b96f2cf0ac450e9a20521934078d2139f4f87d352658824d4474824300412e8ce32894df3bf37774f4ec0f0b143c723d0da65f196753c6f68ef08d447a593bd26bd95a56a043a79676d2d2b46a0f47f1a93d2b3c8997c11486537afeb34d907531581f6f2185f548f19dd930884eab85aca252dcfcd2002d961b3a83c4997adb70c39045a94274454b8924acb75ca5e775e7501a56bb5c99aff865d1317d076fb2a337f0773316d01f52dcb26a3c9fdca2cb58158f595e6822aedf2cad940b98ad98ff1954ce5af91867f1d4676a5065a8c52662defcab4be6b01fd3aacd6c24b4a672d9b05b492329debe710575e63012d86ebb9fc827c05f49afecd5dd9a6819e7bf5be52865b7dab1550272a9e45d7fecaf544031d755cf1ad59b629ed19c856a6a7f2859d79ce0cc4794ad93b5d9e29c32a2056f3c95c2eccfeed5440e6975bacbb141ee373534029754a47a5afa5b8be0cb48c255fda51e88bc648a4805ad32f8f49cec7a84b642046b3fca7e95fcc4ff228a0b3a4ada56b33d3d3231490aa59e5ebf6fcd26b8fe409480f6fd551ada6727b499c80da209e1bfc95347f2d491350de1b2b75669c640c1f244c40b68766cd37fd0d799780d4f295cce25deeee7494809665ce4c25af21490252ffb568a639e7c9d5902001a964784d3aca93878eff7130203902ba65392d7c8df25ff80e4b3074fc08c3bc80c408a8d57a6a5e6ab0514052847d4c674f9a743b1f3bc2c811901001f5d95f6b7055dbda539221a0445cb4fe252d21204bc6969eb4e8930401bdbeafa4ccebddbb5f0bb4d83b2a63e7bbcda88516c82863348f7d5451d3320bc486c946b9fb220ba454f5cc980597b3b88a055a2b179a33c74b7d9382056acb57a68eb17a054a76dc0cf73ac7cb47b9026de39dbfb94e2b2d46b502b5cad4ea534275f84fb1022da36cdd58b7dbb24b5a0532a86a19543daa40bb98748e39ab974ba940b8a4b72e2af1d2bb202a50ba1f334bdbf878964e81d2dedaaf79e3acd24d81dadccff8794dd3cabc14286d0d931a46c56e27055a290d1e5eccb217728f0269625f3499759ae6952890ea25d5283da5d62ddc50a065c7b493595577cb0e28d059f64d5e52aad252fd0994cca8ba7f6ba6a57a02fdeab4244e69ad85db74026d71b384e69c9c400b5faacfeb7552fa4da094e7998b97e5780f5513c8171f378ef68bd5ac4ca075698bbf2bedac57830994767b6fad54a745312f81dc6c8d49664137ca165ac2526d25a5f6b212887bf3b029251033f65279e7a4f9c449207e5fce5fd47e9e752789565dfe482cffeb8c2fc4870432c7e8feb62e4bd9cf235022763aba9d9f5a63297b285ee8583c6e3802f95a96a129a26a047a6bb7b54ea9ee9343e2062350eb613334acce2250a7946affca2cb753a90884ebd12c8bd9745831f1ca8d44206338d562729751e6cf1a710311489fbd1f51532fca27dd38043addbf92f164f3b31673c310287725c58b75ea12e24621d02dcbebf35aec6795e1206e100219f2faaf65ceacadff4120fee4e77a69599ab34a10e8954ac7d2320502d9e2d657dc080864cfba8fbbebca6ce93f204c5c6b27173b9b9aed07649457ab547db8b4527d406e677b512669b62fad7c404bbe6ff7d92d2995750fa8f7d75996992dab6a193da063358e4bad3379404be95273f4de5993423c2036dbba6c9b193fabdd0171afb57eaef3a8b14e764099f612cdf1bb0e68496a69d2b53495fa311d50f30cd32463eba561ce5376e774ad9d03f2b43fbf369d3e856ae5803cf9b52feda655c6270e08dbacc2455e7040bc8ea24a7773cbe95637de80d8d6a2f7c6b7aa5d0d0437dc80d4b25dc9f6942d2d5e6eb4e14e6eb00119e6659db3766bc52487490e13931c26623c094c7298e840c77a152e4cc0836fac01e9a29fc7a658ada55476ece85b0143c78f3014dd5003ba857f5ddded59879bef0c37d28094a73f8b3d69aa6cfcdf4f9e968d1b68409db6ccc24bb2bf6e3be70c48d36d6a538bbf2e6768ea70c30cc8fcaec5d2d6c2b62c190c37ca8096eeaa26fda3d271f327b84106a4d45ae27236b1eeb83106846ee60fdb4a3eefca4e1537c480f2b4721ee3fc94878268d205087cec58410e1e3a54b043b9e0e4c4c78e30cc70230c68e5329a693c5d186e8001e1526a52a765aff2f4be803039eaba25bcf57b9e6adcf002528b5f194fca39b170a30b6825e53626cfa4c4639e0b08cd3b1a376a510b37b6801a97bdebaba57831e9db40fd6bf52e95f41733c52bdc6003a5b33fb3ace5f6e9978ac18d35ded6b59fb570d11b6a2083c6d7a79e678a8b49c10d2d20bbfb653636e7e4a597c28d2c20957f166f5a7652731f5ef1a1e3071937b0805e9976e5b510dfb4ca943d14c61fdcb8024a4ba3e7b6ea347b1f3a7ea0f858f1a1e3071837d2409fd47baf95bcdbb86105a4abbcdd602e5fded5b2e243c78f1b68a0a38b557a2f2e794e3a67204bfd88cb599d958d9ab2b77aa0a4ac78caa6ac7808ccde3003b9b2e3d3a6998c4ab9f0e14615d0517dacbb2c6d2aa04cfe0693ef2ceafaf370630a28295f966d498aafd222de1b6e9481cceae33f5bcb920232e952935ac94dffd245067a4e7ea7cef3d955b6a280d4ab71cf47dbef4c0f056486377b17544ef65f9e80f0d0910fffd3dca872023acba89ff4deaa09e8e4b269a68646695ac640cfb92c85beccb5792626a0b43f76c697956eda7a0928d5e0a3baa48feb2c2b01bda75bea55ba64eb9c4d0242f625a933f4830484c63be52aa5f408e896c5bceea66c579e6a0474960fdf78b14cf6638a8072af3d79cae5d1d82711d03ac7e4b224c5330494d09634b958f631bd13027a47b5ee53da8d20207f33c998b3d4a9c7b816685fadcfc533135b971fa105dab4bc63eee6feac6366815aed24e6a4bbde52bb2c909d356da56b799b518d053ae718b7979f1e81055a5495daa63c7db9cb8fbc021d4fbbe98c6a4cd943d9b14304c80148c4882b909fa5df73e999f45d6f055a6c1dffd2cbb2de9acd0ac4e8e71caba39ceb8e57813c2d4bbb87f778f5f22a3f50de87185d78c0dcca59c4882a102f2955dad266a5551c7cc1271223a9409f5c37139953a7b4ac943d1c7c81b2fccd9140711023a840697e71390552c6e0e2fdbccd6755320552e4e45b78ce4b81ce2ec59ddfb7cb2b5b52a053cb2e5b5c0b1bbd4781785d52c60f9319f79c563901005831220ac4067da97ad3a84bfa2e8fa23d464281d6ccb6a66a1b1b7aa7eca11c82026d5a587bcd36ab9c4f20b63369590ba6f560a080e1ff6305e50b30c2487a265d80c003fd239e407f2b1764bb35a99a964ea03cdb09cd7ab5b0d9559c40cb21b342e6445c297d13c8562a93cb72ba3581d4ea39567cb88d466502a95d704957de07e5de8b05b1e0471825383951b1c35f7af0300148630413687f19d36dc6189b5d96b2c7cb55707282b243e920472e8130f760ebf6fe5ade5a02b9d957bd58db2d0bbeb5096080d283914a2075b7980597adead1c50825d0f6e161fe45994e2393407874d93a9b6639aaec92404aa54ec6737f52bb7524126ef274a9bda37fcce91881045a8e864be1e9d15ccb23d0b977ccb5c7b453978a32e208a454266fdd75bf5697a5116869326efacf276ef65e81490e13169870b185c9082350a62db9283dd35c6ecb22101a6b3655aad3f9988e2802fdfa5dd4328bd99bb4d39144a077e33367d7473d8e8858ca2cb8a8baf466b3974320735f92be7273364f1e439c25d5d5eee10cc14821d05abe5467fab4985cba7df8a7f0082190df5267f95777068172593475d7e97edf5641a03ee7b537c5ead462881c180904e2f73329532e0f0864c97619c5abe68b52fd03d2bc5d14f2e29e9c0de50b7f95646e47fc80f2a8fea9e5d8dbd15c7d40ebd0a4749edc17fd94f8809632ee7ff43b2db98ef7807433f90ded24569b540f682963c79ca5b87b25e601612ed57f876f593acde00135f22aa69f33667dfde0911b18b903cad7bffbdfb42c653ed90119ef1d7396a6257b3dd701193daecb61d2430774ccfd8b7a5dbd1c770e486ff9c25b8c715e472307e49bca7dd194dcb42e180764bcd62e6939cba5ec899150ec98ff870e330207d46b17be259db9df4e30565aa503788a87182b2603236fc8931d236ec85f6ecb743136d6ccd8066450571ab7c5dc62fd363ac206f4471d652bdb7a096ce078033aefc7f23ffdc27bbdb801b9f331b54eef2c894bba028e36a02597ef659751734bfab301f982a80717ee355d76770b38d6b0cbb83a692dc9ac0b1c6a40699525ee65394795d2839b06b498fecbde2d8a060e34a0f5b59ebee9dcf4096387c105c010709c01b95b9fc973e8297bc7a40b10d8e981c30cc896d6e5358fe6e1b35347e0280362bd6bf5cf98d9de461138c880d22dca3037e93206b46eb79227574aa9ad8b011daf93d2d52f4a9dfce543e00803623fc826b5fe41a5698e1e708001392eb6957add52258538be802eb13967ed2acdc0e105b490174e9a0ce7b2eb2e0538ba808e626b5566d6a29fce05b4ec691b64b3f439cbf5169025339fe6dc511e39e8c1e30b94151d070e38da40d74bb951988b0de4e95c32b6d4c26fb2d740da7d8c4de9f2af7a8b1a68f94c7a522e7b5c54ba943d9382939393132f78e8f8c231006ec0a105d498da24758cfa32706401614a26dd3e2dba28568505747ec9f46dcca8f3f1ae81e30a48b52d27313f9db5b6121038d2409c87dff09973fd5fa6878a0f45050e2ba03798b655ed9539b5c6c5ead143858b9393b357e04003f1a5a67586befb061c67a034a6741d34665f6d310319ff46e73769fce07d1590abc5cfa73f5b55b8a880f8f49725265c36737c0a68e1639d8bbb16eeb5d9c516262826394c4480a30ca44673d7b294d2b3ddbce0a123a50b95e7824780430a689352c7f4ef5a302d283b7aa8acbc15010e32109f656195b8cedb2e6d14305cf550f1a143bd0a8ae29d5de288024a5f5ee5bea3a9d2300338a080b693fa664e57b60504c8061c4f40fcaabc476dff4f26c7e10474d42fe6d454cb9cbc34011de3e55c9ab9f236268d816e8f519d4be261de75ca1e13902f5e360a9dd51290c1ec45bdbaaf12d04acbf31ff52af5e2799280d6927ad8962dc7d6a941024253c596d8301e35e038022ea8fcac1db3a7d608c7d2fcc95dc6f2d51c8e222033a9be8c41030e22204d292d8bba3c038e21586ebff992c7955a140e21a45adc8e9ffe9fb7c51104b4d8ec69f58aa7ff70d7022f7d3ff7ceeca205c253b52b5d7ab7f30567817457fa4dc7c7bcc83394c8229532ca8f9b5447712c9059cefffb9f594dd77a871258a0a56aa593eb9cb77e5f8152c26373de4925b532b902a5e5bb320b6ea799de56205e0e77f1c15b375456203f7d309939b78b3aa8ab408fa6275d7d97b4b6540523eb2fc5e6659e7c5281cc9974bde8b91d5e1431547eac1d4a508176939fba64bccdc1950fe3d4a1e414c8a83b7d0eaa54c7545a4c81cef679498ba7cd37794a814cad656f920f9a25654881709d546fcc9a749bee72144b72dea63eb731e52c0abf84e6a8a3693f1333148bd53a279de37a5ef58002bd7fff9234e592b2878778a7f2292b1e028b43c927b4956275f23df5274fa0eba47659f09c6bdc559d40cbaeba46d3be61b32827501b57eba4649d0b5fcd2610e2a9d5cb6e8a170f6a022d36798967cf2da6f3101eaba0241328d7a2ca2c56e8d6df9840b8a0a5d13f3d66f19d1fbfc2e782924b2047f5a61397a50e4dba00c1ed104a2c81fcd6d9537a32d7d2b1a02c6625905ac8dac64f2b473c9f9440994e2d9d7e1dfe556736944c0225cb5eca5ddbecc96427e5502209649694cba6edf41c0974942d9eca54e54fcae3078f2f81045ad897732a31616bf692b2779ec70f1ebf258f40ba695107cf2cb32c2b61ca9efea203072d861247a04fb57b16fcb35bceea56a3a411e8a4c39f8caee57f49bbc70c258c40d6ce9e4bf265542b2b2b942c02392e7ffe122a7b32c74a14811ed772a7d5616237df44204793523275cd6a1d23184a1081ee2cc678bae674dbcb1f02e5f2abe75f2d6a36fd0d81cea2ebe6e9ec0b819663945987b7934f5a0b21d06ab3f253eedf415dd220d0e2f94b32ef6afd8bba20d0b2ac56a6976707022dbf98a95f6c71b33a0604c265b1bfef54cfbf96fd034ace2b2da5e1fa0199a5fb55b7aa37e29b3e207ed5b99d7e41309cc7094c72301f90c2a5b70ff3fc5ac6670f0873b5596796759693eb01397ae2793d67a3965d2579406738bda7a547979ea9d7a1d2c502868e941c4a46091e902df8cba7748beb3f2d7e5128b90372e3e494fcf8e559b3d228b103327e70531d5c8b5ada53520764b9727ba5524f07d4c68fdaa7a7340774964947318f7d9ac5960352bb5fa96ffe2c4b33c701293695e9e0727af817030774d78ba3f1a57d79269b42c91bd02de7e0e3d279fe7161943b444694b801a126d793bf2cda6d682130c9610202931cc82487c90772b4012d46a54a87d75a73c35dc206e47ede678cb36ad23d932eb62859035a563dd7a7bac4ab7abf503db658b9324ad480fa2c834761ee39e5c7d1cca1240da8cfb259c7974ffb337972a22568e0ce7b33f98688652839035ad6f35e5d5d8ec2c327275d28310332eb6607d3194ce6a00f576981114aca80ec7c9e35361a6dcc44a3840c88efcef9a4cc4ddd7e780cc88e2f3dbfc48b79e7c50eab502206d49e4b1b4d6f38f15b8501bd19734b5b7cdf9bb5040cc81977157bab74d6b5be80562e8cea10532edba15cd04528f1025268d22dd7ee942de9025a4ef19b9e33b3c7b55c40d9b9f0723c665c95e927946c01996173dccc358691bf0d84ff8fed86edd93bbd174ad840777ecd1693daeeec15164ad6406c0c2f271536a73ec3256a20dee56717836e52f26595a0440b88795397f5aadf9379d42c20b330f24a5cd4f7feb258404b55dd1eeef38cb9ab4aae801abbf7e42e755eaf3c65efe0a0240d74eb66113f2dcb28c434680594cf6779b85861e7da1f2568203f884be1d2b5fa8607a24ac919c8702d6937293d3d9932654f77281d188f1233502a5c50194fb6d67da55c28a9c279d38b9ee9af36a7023a47fdb6f5963a4dbd52f67cf4f8b16274e0164aa680ccb16aa3a88bab3d355c69a3a40ca4e91685bdbfcba21d93b2e7050f1d6c5f28910232bf276576e6a729e5a3f2c3470919779223288942091490a1aa9594cdad16943ce14e6050e2843ba77a50d31c357c67782fb13f73f31c1b17c6733e7c879d4a8f2e6902d2e5a4e15f8e4d4afc65c25032069630012d6fabd65a6e7155ef4ad943e1d16309c87579fb4b7b97d2f9e8a1f281354a94802ea92f54c96c592849024ae7bc39785e554ab8b0184f8246027263dd53c46fe3c6a825941c019d376ab8f4ce1b01d9f3497d6c61b36d8b292902529d9ce6957a4504b4d4d2aacce129d6644ca9503204649693cea7149f5cb99210503266593653eab5b9b019a32408c8ce2acf736f4cf659670924b5406631d3b294f63a5b7e5a20b58c4a632cbbfbf977166871ae4d86a77dcd9843220b74b9ce9fca35ab4661228905b2568ebada5cd1d00f9641020b94bc1df9a8b576342fbd0279e667b341547eccda15679ab62c33beb415c88e32b9a09d95543e3f2b50fa73fbb2a3291d345e05daa5ed8d27d73fed8e2a904aeaece49f35beb6970af498696d415dcbfc9e91a0c284e4140e20314505484a81a2c34707b8780009295ef1e8c1009251388044142b62fc17102009850e1f1d8000092894e41326249ec041d2094e28806413280520d144054832c124985874a0fcf81504905c62e575e8f0d181069058820124952000092526f18347183d54014824f1a3470f951b2491f8f12b283a7c74c00024903000c92352563c2502248e900049234818b10092458891501481b2920844f458092039c4ca0f1e8f8337040aca05480ac10012420c82022482980049202a4002880790fc6105a501247e5851e9f163a547080e40d207141d3e3aa0f25fa8f468010448f8e08517de850548f6b0a287950790e441012478405900c91d4a48ec5000923a7ca17a80917090d02184640ec8ff684253292d5bbc9f440ec813e79d76ce1507747e496aa70b0e681dc6c52d4d9936b9a437207579eb9865932fef9edc80cc7c52f39a49f958f236a05bcbf82b3dc971a5673620734fbe86c6790d88d3f8549fea339bfd6a40c6cb82e620a73420b378f2c9f379d2f41c34a0a5cdbe4c612e933ecf80ec7139de7756275ba866402a975b5c25bf4c976dca804cab762b6596aee53c3220c46597fd74ac7097ae31244bde7e6240696eed2f9707cf59e7c380d68da5b6fcf4a8582d6040af0cd35ef2ee3bc62c5f408b3d573ab6109332b3ac3a88f9298eb0a894f1a52251200c0682a1208a6118989a4700f3120000101416140663d1703832d4a67b1480044f30305636381e2a221a0cc7e2d040100a8502c170200c088401a11808c34090e768ccd60700c72069b044958751ab0ceb036d79b23f65ab1410d6178834c5f91b0a8b39d1f55aca458ea39813257e8d3726ec45999c7cfb589971d1bc029208337f73c06021c464424153ab40822d5fd25d0c58e397c6b7646849b77f407a2fa963c15362e336a05664126c5f5b28876beaaa16d7d3e4d24a80f550941d69aece43753cb624324b203a838ae074b196a6e0b231624cdfca9913058fe6a8ae6759d190b5597d4a4acbc8043ae0b462a0f281fec1d20a390001810d33639c1ca0897fc965237f7f443916b4adbede06226cd368f9534bca7b48ef44e9d2e44aa25b9fc5a54c2231e4c94c4e8a63d4d00ae589345718c867b4255a62925d43ea9b75335e1f40b93729a1570266d1a4ac309a549ade3225e89234e4fba27ac2273c719bb5ea74fb5ea2bc5750a0579efcf02dc245b2533472082e94e803fa07c3e5cf592be58ee7b851895b7743825ca29301d6dd67c45b9e4d8f2cfab14a5bb61490e2c8a600a968b74375adf888f98611b7c4139ca58326f91531caab04daefd008663ab55eb5f11ae7a9d2b71850888dca54ad3520ac08218e3a0a9d85c15330535ecd928da5a186e918aabfc0a1548886f282eb068148b2024c21bd4577eb279411741c46083e885662a8a8e68a7581beb057e4190853257c983d8d539632b07f7f2d40c7d161839ca04dcb48e09384dfbbc3d691995d4facd8098d8c070039b6077b94b816c97393f900551b4f80800a47a79f7af9a69d5a86f9ae7771406fbaf7fec16cfdd7ef7f02a3ef8fe30ab717ae70e3b081c05e5ea0a1e815e5a3bc82be622c6aebf69cd9f51ea32be6860840f04674267b6140305af441a01f33441f4258527cee0f31ee28dc9a7184a1bdae4b5c20580bc461812d7bde3715b22ee6780fbbd9976943778029261b7c3876d42aca527abc2b32223c34212f19ed303ef6165ccdee09c2a083d1ec9cc483a9ab3f5a11a7a716061891cce81f1fedde945c4d5d191ee717fd6291e73f1537aab07054f96a19a1e9a2137fe31a70a3e1f0aabbdc68928589fd30e7cb04ffc289ae067c75a1429c6850f75dc84c509296efb10e4e934162a70e81704af22dc5accf1386797976266bada5d5015469b56e569542cccb9839311c8261d7ab135f2b062ba7d771677d61517a02e0066b99013e449311281c9192d117188371de66a38ba164254c14aa8039a4d54aad72b21ade152d40888ef7f8e875c869fd6dd96dd436f22bb07d50fe31d07e8341dedd903c66294d0716bdc24400bca8a426c597c4ba4b960c4258ee6b55c0b55ea1497aea13a1f03d78615e128563ea8a57e0c5f5a910744b5829a825f27944864bbea9c81992640dc2d6029de6c539a3082bc574089193893df70476b536ac0f4a5f9c0049f130e4b422b54d2b39dc624cd7469e0d5ff1e90dbd44763a7c4644cc8974e2b715f23ca358bb1c200516021632ea91324b125a8f35a37e4c01d58b5175262bfe1904c3e22a2c2f1870e27800ee5af760c424db5b3043748d436a29aeadcdfa81f0d18f06d293cec9b03fd8b951752b25efa400bc07ecd5757f30c81d14ac4e93c4ca8040c3d6c3dc122d8519cbf8f3ccdc7c9f8d4284813fcd4caddc252b21216644752c08205610b0c0504ab94fcef3bb25d46cce6fd47921ac101ae2957023a4f6efc729411045486edeb283bdef16142474c7c95634f21c7435d1814e82ea58da4e5039a0293d60d82c60f2a84e42a82c238238debe85169943300e08282aaf708218a8f87f93c2d4f895706404d1ca7fbcb90571cc64fcbbdc0c68e59919021d68d6703388c30a3c13e36f892a0f6aed6f41e22a5ef141a23deeb0bf72e71882113e6f0867a25250450ec2d6103421900009ce2eab6874b2115e457853106a205c193e4384bd1381439a03bd37eb23f711e4b7e682ddcbbf8f6abcc6f77394778b12ff68de318e1c5312ca7234f8ba28bfac62f30d5b1a31e158e03c058ef993613978e2c32e0e2aef5517affd0034b4e8850ea10b14d72baf7126b1803d6d52eb793c332083474998c38030ecc152c62f717f1a109e203649e49f0d5b156220f0f5707f800a8dbc09d527eadb1a590e20e165983a5e0b239cf96ae5182a84fd10ce45a81204ce4e7c16132656bb0a04a73e3c3652381013e9055199da1d9ec941ad0b240cc10d06119905685302a3b4824a005e2210243bd1e2301bf6bd1953b8658851e5839284dffdf03ebd25d3d73e38750ea4f2d8a59e0b02ade1bbb939e98d4d45a88766e7c0cca08862f1b33a7e75c16d5b2a0cca9c4b0f0732d4fc10c76c1f727fa30d636ee4d1c7c6bbd8ceaf8f9389aef38c308481cfc86672d226fb9677c6c44d1317f702e60646db4c00f17b54ba42bcaef4d680f192fcd3d2a0621ec68dc0925cbc23e3cee036ebd448e64deae3fa87b1be6d439fa4aedbd8bb89d381f09cbd9361ca15443772430ff00c12dbf27d96cadab6e11cbecb1529d3e52df73f0e06824cd55520741fb4e13b166065d460c635aa962dd0f5319586b2dbd2691ba4cc495e0f5005985623ba161b18cd8c01a8719e0e40aedc39f9369894ade21e6b1c552f94cc8e9542a164b0360810a11f0f5457d880ccf39caf973ed4d410408548a34281640412c794e24a165423b704cca728883883f1bd8a9728a106bdfefb3e83f2b1329276c6de85517c3b10633b44eb233a2c98c7f452e0214485ee93d20fdab2d68fd978d3f2957d82460181080dd679705e38fbdc84905146108b1292351f4bc913b7c37bb09b6febc13effb7d9cb2608c9ade754e865ca30c6194cb03f8a4e39c82909964c8e4b43b33646d14ecc51cfe0b5e47e807f629e354ae77f41e0778a6feb83df822c0bf0ccc9cc423768b63e8e09e8c7de47fc27a5c8228969ce750eb676e8eb7244c5241e33e861a82d839f814af07a2b478fb923492388f1ca8d7daa413f351a8ba0eb50285895cff9606dd88d3138c95fa454f4c433074e9a7871d18106962ccade1a8d3013ba8c544f0c7ab248559c058c25963c56ad598d32ad71c57a2b5e450d2e715ba277c94be72daf32738dbfb9574714abeb9d4d50347b67c54c7c9c53fc5b6433573eb067618be070c4189224ce9c56597e703c6b4139329999503c176e9fae247fccf742932303ecad573d565612cc15c5098e5b59a45df1bf91d9609119b5062e3aa66eb99afaa89f023db2b3dc486942367d4848edccfe6b9f44ebb7486d1f26ac80a185dc0c069a30eb56b2a3cb1f1b5cb8a0a58f4fc29f10ff19c13decf510f1a5aee17be6e7c1d39e20c5764e3db0f94406150d01aa6942dc3a16785cc3453e06061f2bb2a8d653da8629c72e2b0bc04293167422b3be70eba8eb4c7734d33d836da05467454220d604923b5bacd9213db0cd09b0a84e983766742c59405f19555f777d4d8c02db285a85f0e04c0300e09bc2294aa2ed6ad394e04b4352a1f312a95dd73a431cd03adc29af0daf8bc1cd9eec64d7bd1247d8137e54da156a77545368aa97775445c51e05b4217cb727438a68bfe0ab7bc0d0f29bc513ebd07ad108e9f08f29f75de452097f5c9b51e46ab525b9beb2130708700ae963248146f45341492bf32def0a6f014bedc290671fe3d5f97163acb15612245f73809ce2c0ec1ee7a766af82ad264e6da8436a76b2e2d40c9d10bab4278518688434b3700c1d7c06820c62d0059481854d3d17ba3cc6c0ffdab6e930d011e7a088d887d162b28ca606f499103b8e463be1ec39362153c3e662369740fbc6f40d659d372437a1a849fa67e355d800b166cb17e8ba0ad10dd3af52273cc233528452c560d0d18eaac59a8784fc9472eb4804f9ab90b67c044bec090d212a4acc202e2826239c3c919698523b379150c12b547b12390b7bc51457319a65b7a8c4708b7408051563794548a9b403374dbd2791959b9d508280e58181beb15946d4c0a0bd44942cfb2cfabbc040ffddb27427f4dab86f3441495b7f9c32edaf50268785061ab5df02061df0008e4d93fb0452693bcad1e6edcdd620da3a0da211c34e1344a0ee10fc5cd6befd059afecda791422990bf40af6e599db85fa0a7bdd905131d8960d6a508389820f68a7a47349ce38a01a60d4bf8d4836250bdd068ff10ecb42e50c8f4439398355d80660c70e9e9d61c8bc1da90d254dbb205c314a1aa2588913ba73e68d72a97a70d930ca1ace857ef8dc8a706548f5df8ec12152d96d0acca4cbb233fd2172e24ce24a0410898df0129b84e21038135520d7985a4dedb7143ba23f74e048cf6d4503856ce51b24af90aa9ed082f53a4db1c2444f99c52d4ec4156068137827d02a7426040652a2b06127e115828ac1676c7905d627b56f1f406f0c525157c267e9143deadc344711a52f8ecadcf6085d784413a646f011e51d4c3ce44990ca24ee4ee325034776a27d1594f97a85fdb2817e06662418681ceec03c106c36cc5abfbb863a316e3e3158cf282f38f99d9d49f666c5e0dcfcf63558d66503f739b7feea1445ff2308130f5396fa3e1a3239b47dc63f0173600aaf5d88ed656d53faef5478beba30194196fa342245c25e3b8a21a725bb7a205698c22eb171e209c5d407a15875a391e62964ed030eb1c5e3c8b1fa446be1bf5bd8f052a7ebf664142b9b3482eaa0d628e90e585c8314325beafd223e1878e46f4a40a458e0d0d23b117629fd09042e314ca4f84e28d350627592c1aea247223faebd02688f273082a4439307416518b843c77883b15756c111488721fff22aa80917d0e1186280e42780a65329453e378cfa4e5452548559e64bd1dc999a89ea1dc26ddd4595a5e774788de3e9d0a4e998b04bd28a718ba4389d4f1cdadb165407279268708df5431f4265d58a65645c5d76003729e2f9de93a19e6ec8581164cec1a5d21a8404f8f9be1029dc748e5a39cfaff662b41b9a0db4104749efe9081395d06dc6872d5d4753be7322db868ae0a3f477b29c8522479c27302182556ce28a35903c0f24035976d49e3608995cd0d756ffba19ae5a6837bf9256711e05555b073856f9d8cea206a08b40ef5e8b614e968b2c9da1a77e732b5940a1e3adceb49267a16e2a502bdd43fb056f7026c85d069d435a32ae73643341f959d437dfdd221b433b8536ca436c861df5c76d918a5077b32d65b3bdb219c29f13a4a0745a1bb7e184490abc522bb94f78a436b6caad074a87740f8317a217792d3833a5d4f70a611e87f18809fb2a49968da37c6202005f34a18529774beb177434ab60e9861f00897b1ad12ef8dd1ebfc946a9f2773064444d0cc02992f5322be1bb12c7b62ed35bd4b5421be24f93a4eb650d583cf85226ba02eba2fb7f2315d18afe335a0e807da35928d6fb01b6fe1636c785fd440af8f969783fe179b941a43e8239a4e18c5ba85a61bccceff2f769683d7e0db02e7de0938dd02247d5b024e0ed53b0ba001730fcc76f753bb5bf95cea6ed21b59b00599039a76c4a8c2aa5ed6489532ea51911aa4806e92e56bf37573d7f3af3e8f39407920998c19ee8c800cbd444c08cd1d51a0a79e0de5bfbb6f353ade79e95cc17600882f2d2713dc4b4f0d0118624b1cbcc60002f41e74b946b24f7bb1d6848d4d522c66eee7e1c53194c101b076e4ee4fa5fb1d18df93500f56edf28ea23ea1d2fee2a136aac02a6c1f8dc7a912fdc068a99acab6280b19639d18a441ec0dbe33d8d569545ae35fb24f7a993dd2bd54110ea02f6964169d10f608ae45f6b45c5c1f4877808c7d8dca71cecc3f7ae128a1d0f38c890ee3ee61730372516df1b439895420070f04d6f08670bc57fb807183bc3bb8148c7d55f42ca52c623c1437d5cc7581053f49b1e057aaf659fa2b8d0689b17f44e3c219416829e197e78f165cc01cc4c1a30112616a2b94fda14969f8142f6d4946216aefff6ed0666076cac5811dd68e7888452a5b02e516669429cbf1c6016993b95cc363022b0eac45b3bc1c2c498b18d3b2b8dba8d56774912afd263d924dff6333047e26411fdd587f83d1730c9f5c046351c6a278d0f2a12bd1712934e7130fcc1031bda6ae427b03b58dd20c9431402c40b293d21347a6168b01fa1d7a07ad63492b0c97afe245831d655cf181f1043ec72bf4c38bd7ff9aa8d0efa3df2dcae8fef5d8804f47382058506e068ad70f713f70a90c9a1af0028847f17a14e05f60a78236dc72ae9b38ea6ee23bea6552d7e00cbd5ada5455c6087b0d3754e6218853458cab44eea51e3efbe698f077b12be0784a0e8a80d4217d04be595c01efa54189a027152e1c247eeb757c84d84c472f96c3fda9675d9c233580878a8fd752953bbc90a0760c7412bf9355fa419b9b0ae8b382d778b86201c80938a1bc61598ec75ad29365955dd6725998fb1b701dcf64f2732259de0a17cb241f16710faa133d24c7f882df183299f9ddb13d3f2f4f66062aa7939b1dd315d9a6bef867e1f306acc2e26cb7c4161513e0c85601f48d3dd174a6afc250390471fd744399400875d427f0b27e71057a66ac6ee0f8822184dd032d488f16504fbd3044650786beeb0ba7776418710d8d32a299f67424ea16c718097476a8bab366ef956a4365b634857ce2e3e1ee157e45d75258e49e1153a45c7075648df889e0ceeae19b9b16055a65ccdd605390c7e3419a58be873419f9a6ce9ccbc19beba5acadf12ae14a4a805567d0f3b77d211e3692617e0cc964802a00f9c478abf71ca3f7841c95eeb5dc99f71493f9e54519cfed0c2ad65cbf18735dd394793f69a236a4c3ee42d5132d8a987f04428fa2dc701694f8c84b4cf4d3f73967be0b0d828010d9ea5a27da00c75e17dd9b42d24b566a941be506ece3fc69299331cc4a324e4e181738e9e2a077cf5e21c21dc6daa537ba4bef48be15306da9e864b2f57657414dd992109a32fb729ed30be71dc40274fec1231f773062eeda30d693d4d811f20816d88364c3e94a7197bc3c842bce1f1f5cc361c2134fe6d826ca7e951e691ba1701719f7d9d36fdac8f35acb1aece78b74b4f77fdc5196523a5d810682b1e9f13623ea72f1c0493e2ec96e39b4b953fa676e8565416161632517ddf7795b4de8fe71170874d59af2d90fea252662db8a9d7b66407c1b48a461a56ccca49dba9c82432f9aa612abfe42c848626e4d4c91dbe7fa1b6a533cba7232ef5f7a00cf3c0defb76dce859ca2ee8d6b96344e8958fa3a59a7a3861a6bc40e42693a0514bb2db68ce20e7c03dc1cdc97aad7231a5f32fc7acce59d6f40848466c7725a451a19c1324b8299fbdf961ffcd42da5dca93c320451e9c70f6b9c97d5dab5f3a5a53324ac45d8626527d6d623eb6bb707c649783291a482ae2720ec03b79dc78eb7da60ea399b69e5879484061c231b6f11d2688f92d8149c63d8137b2e0d89368e39554bfe34754fa2b7fbf40aca09b437b4518df6db0a91f0c0e3e864106720b84a25f9860d73ef8602b10797077c7cb292d2d99c31ac17ba2233709dd9a9566bfb90b1eeaae3cb725c958558c2b640d40d3d64e1fdeee279e83e5e2e419ee684ace273d49831a51a4ea334525f605a83a16b2b25916cd52a8e23babed4b12023b361545ea6b12cc282c08cd895a2998e1ec10ab6505273674094e1edcfe4506fc9746d851bee497c4d1f7de43d1b15cbac9756089435a14325f49227f3d6f2780d37ea587096d0dab20b0320fed5fd578334cabec77af5582d9a68047917a8052bb7ddd8bdd2ec4405365641a20a391e31f3c8ae95211b014c7217fbf9aefd1c2a9adc70fcaa60d8be887141562664afe366a19dba49d99475b2d4113d53f6816a1808301284c807f24c84073dbf6c5f0a7c64b90b4e157a5e44a054958b5e73f9d92d9dc91650742185cfc9ad15230a055c094f4d7075e19d774f0b4726ba6078aa652187f63dc20dfa385902b4112375db6e30ca2ddc28881ebf8cca84c855df62f7448e0b51a1af82ab5d60509255a317499d31c3523fafdb549cb5948a4d0c57504070ab7fe07052fad0da47409ef0db87d6765a21ef47e9e45f69c0f617806ff3931b4071c7721c8d42fa9dc4b53d8ea3945301f8f0c1655eef80d50347bd594f3ea39e159cdb111622bfb8400d17ef1216e7dc49dfe641f0967feeaf742408aade765092e8d694c3530f9b07bd8b331fa8516431d01c091bbc8e97f5a2458d1c83892bf1d6bb0495f002dd73c4ac21efa2ea4d76b10f4005bf6fc446951049d98e6faa43452e86cbcfc80d7f8ab1128874f8a348eb40fc38bd244dd85ea0e574c0c7bc1d6a4ed2c8785e1fce6bf225217c5cf14987e2a37d27dc1423b355ab796a0726706b9e4ee81c82501a98c5fb53952f8bc893d798c401558852c51c3629b0454ac142718c0caf21721330261920e4958f0df414ba158839772d2056d52773c5b20a2e9010bf01cb69de302250455ad82097973e61a0026d103fd39c4450ca5ac9467b88c2b24aaa9b4890a1c5a8800131ce156302816c335033b2c795c0e4f5845be2c82a4c8d5e8850bb8bce3b198f9554e242b337f218df563de9926d7242f45da5c2383c6625861a64aa4a2cbb10320338c42654c006c4de83099e516df9be5ea2e000f7cded438068407f0006ad08b9b1a5fb09c8ab1ff4a2f1c6b42427efa4fb21664b3a7a43782a2d6c12cb4e987e13659c82f2e31eb4728497d36de9a95a27dc70ec023dcd14dd71dd8aa41eb1aa77c88f69b603d110c035f0197bfa2129d201f52274990fb42d13a21f01b1ba8154f187a5a13388951fc88b4ccdc7485c894a16f6bba50b7e9c2d1e05379a57278786f3bda79230615546bbf6e28738992bd5cc00a513b78b41ec35638722b77fdcd506ecd85056686bc1c6c126b4795e99802472aaedaa514e9d84712c13535050254761a9d7b94aada965d302a31209fae0fc2230ed76995f05e21ed26e47d77c2a49db611afcfe236c522a3bf8388ac4ca293ea319452019815346fa559f4e3c52e87c5fe6f220ccc4b4e1828f5bbe4a710844e630d7cc642229b8cc334c29781db8f3dc61422e416d054f79cb4e05a88db1e68eff863e00868b0b056d86afc83dfb640ac311e94016b7996eb17dcf103d2724ae92736fc1fbea9faf685cf3474fc2e142bef35347b74a3ea126e8c4c82eef7333abed61f1fe3aa35a61ec14bc8ac55dc79531c13076bc81a24638f1bb4ab4863d0fba58d4ce27fe0f09c0fa22520a408b5c4badf9780df47d1ad7cba3cfe12b7611839adfc3d6f055987b6bbac009221e741ed1294d8b8c9a9a618d24c16b7b27819fd81ecf7d61498a17a7140745853d5b910955253336394cd3ef00c139e55b580a0df924f61f8d709d2f581fbcf1ea818c3eb7009f997291dd90902e6173b1924e6a7a82a0c13871667e4baa67da373ad05a4469861332a7388888db1c0748afeb46da6b9cede72f0168cbde88120acfa542823744d889ba1cca4ac5b38728d432ddf04b3c19976503a0528969385128fc8ae906cfa09a3fffa9f8c3bda653bbce9447fb7928e33a876b0659836b68e297e28f59413909c93f41814f010cf0fdc9f7e4346bc805be9f7845c0fac0f65c30d4aa094f3479ac34e1605bba38fceb0564a34828ee49a03c9a506878ef802784a39cb9b1cf16e0de9e15e9792bf3c0c5c4d8431f3ff75f9d87c6137ae5a29247aae03aec834511a492344d34778b562282384dd96cfcc22afafc7dc8085aeed046a0d1be11a60c76c4064135614681de18686073f6fbfefc6f0b59682922856b7af11aed7ad6cdb0c4ba0751e698969ffced0e5c39cff4dc8a9a3a3d7021debfc95fcfc29e03bb2f242e6c31e550c4b6f1b3ad4e52c6052e96fd60310e9b8f04139f2bb9967e9c6ce30bc6f0461360a22fddd631895d662cf9ef70e14b24902b9f09308b68ed4f15dc52264d227b6a2fd418105e76af698981faca2c4cbb8f295c744519f8b0e87be400d67860f8f7c147055dda045828d0ad0d145b0c5e66ee00c704a4c84066e6d72d8374dcca3b1c3d06249bfef47b94be0ff0a8633b15e2ade46b2378ccc3d5feb4e1faafaf02830c08743b22956fb7f5bb01a1423ff8b8f2236348e8af35d51564b7bb11791caeb99fba9714fee122bbeb4b1385b8d4d4c37101674dcb87f7a9c4be5e4568b8b3c6c4b62285c8a2f02ea86a2281c9d91a9447890e9f0da9a93a00a2c934ea410959a0c09147ee4b22357f62e5ae3045c7ebf9a7c232134e26ae8896733fd94c5049e3194d8920296762337464183293edb87fd648e469bea976f464b838347444fcb404dd50f59cc5fa284cba1780d0f84f011ad7e00eabb990c3a65898d986c9459cdedc56c4cd08d4ddd829777d0cd0b1a27f30ca8a0b66c637f1e8e56b1d1a0b8f0fb3e55d32ba92277d81956dba34a6659c4f76451403cb981e6133dd6b20ed5404680c78cf70633c1954486639aeb3413bd06317ba90f95a1b1b087e6c5feb69fd06939d440ad08416f118e5aee7c072930aa6bb6327b222dbbb0bb73370cfc9430988d5da33cb877b75bf1689a3420feb711511e4c98893006145406a943d042052e3014aecae4be270715f87ef82a136a47b59bb0d4828ce7aedbd45d3ac8e2314c4f2001193f6116ab83ac0a18cf85b16fb0c070bd3c514676031317b01647368cd18f64f427a40a2fef4c76892201f0a55bc921c150cb9d775b0b25dffb162df25a1e3abc389255bc49f5cb300dab2275a234bf4453d1316aafe7fc2d8a2ee811c0e53820fd808f7f4194da13fea7aa5bafa560b503d123446fa0a546d98498c5f41c65bd69a9edcface6161a5fd45f212d12eb42d741dc95cf95180c91643ae2baf9155252a866c7b63dbe325460beb116da970f180b05e184807e74786ebe580928c72d3203e60ccecf053bda8ec446d7c567e1afe8868fdf630c08a5567e2fcf6b4fcf60149abea0e9d1c5271479b0bcaa018956a0c7dcad09c8aadadd6a13ec7294aff8d844dc02469ba26b0d7a90c16274922242e0e3cb3929c6e30267176042e0dc797b27c748fc2d2dd4d3c9f269cf823dbf51e4bc06913398256fa25a2c34e0020240210dc166e2d4ab34ea2f9ddc85ad5cd67280f44077fd581dd14e42418a4ab5a846981ccb58da5a52dea69556b773ee111f8a4b6049c25d2f2999b9d434ed42c582c2c36bc3a25fd351c03de12c1ad1c9a917e311e057a72a0873137cec9dc1a1c55deb8d3274a5e63d815c595e74d1d2a11aa75bc04a2b1293c9f727ebb100f286de65df16394e5a3a845511fbd098c107c3632775ae1202218046def984bf297574e33683a3559ef4b5669b8a4188a22721296245b4aa7fadf3cf9ed6730f8f558b7591c05bba4c11d37fc759ee4981b3244f2f4d0c4ee24afa8dbdf649948c566aecccf2a9aa465a295159defdbdfb427cd580c392a3d3ad4c748be187510716fc59fe5e1f811bc4285c8615c84d34bc87706b7a28006ef0609da2740bf80810d54b1d68929556363e27807a4cb8cca284a702e8ec60ac724692c5b639660335239ce73794ef9003e9eeded4b10205046198e618b90c80c8df65726dba2deaade5410575eef86083cb25bea4819e30e04ce9f71874d28fbff6146eece46230f026e5a9a9f6b09a9f4057269b91c5d3315d54297c23d71619bcff975eab6fa7bb0111577a8b8a0efae34b099f24ed7f4d19c2f75568246b02d904c432c0b81b61815998721a6f7c56fcc9fb8ad4d04ede0e526f38a3dfa6502877a6d3a53482d9d7d045554c70d959e32000d236ca93a33360015b1223aab6a271342c173174515bf280f8ddd37722fd2697a2a61b19b8b3f0a0605386da62836aefd7bc527763cd2958237bd9607d7bf3dbb514cb4d6ad2be59376d1c1452ebc87351f2071960d99e9708357593d05fad2a154f65e8d169dcfb1894351d38f2a3bf596adf7b3f1527993d41ec25424a9a7b05c482b39e9e66197d68920d97cc76d3d80a3c13fe0a0e492890ff1e412dd320ea8d63467124204c972fe9b831258ab2280dbe9ab58896699d029caa188c7b6ab1dffafa8cbba0299f031bbb41145c305468468165e5db7ebf110803081935bf7d0d4c48b08db29b0bd1e320a8732e7f346cf78ec69932f5bf02d0ad8cca922562962642a8855dbd5b2ee478161d56065b28e4e46d8464a107f92e457b710efdbc44f82a5374db02f6c098e7bd6355028a56eb04b1f65e30aaef2ad811e46150b6c935d5afa5592ec5cfe4aa9037716b0c7781e3636e01c151152b74ee5285f2ab9e122179b5904fb7db5caf09ec1a09cf5d398b90d1eeb31f0cbccde3b1ffc53a282fefb4dbcc76341aaf30a3b4ad46b6d1c9e5d5bf582c69993c795cc11583220b8cc148355a4eaf5557479c09c0461943d0ecf522bc45c83909f9829272ce279d4a5f49abb2a88070c915e58906069cf5673ae7d80812c0ea44c71bc7d05be66d46460abf5fe5ccfaebe01936d026d129a394938a81af4a964b3732ac4d02199309dce0e50482788e9883610a25fc8d25755bc471eccd95cb414598e51b562997262ad1bb3ee651807f0501f62992c962318806dae1e72e9aaf8d3c91032a3694e11959ead24b2742cbc69acb3d0806ca7c0bd450f61ff4a13b20eda0cd266a6b87cd7659e1a20ac3395de9a76c9f9519c2ed5808b3b102c756abfd2c8bac99a6c1a6575285205a80e955e6d6527861cc3909112691957f5f18c521e7fbb75c97688b207a962bbff8eca19f30e0f20732b00e25fcd5cf84dfa06349802baa6dbb076c0706f5c2892a1d2ba02d33fdbd417f8d6cc1e90a8aeaa3836fe82955747e5255c956fc654ba1faaea07c4335c10eca438b2986972c7abaec2db089a7c2928fe51d803206723841564c4e1408c12f47977b82e39d1e6c468b835e5224184055e0ea0c30a7e863b548638666f911c70de839d841d63c640afb9be7f7b76ecd6607f5389c885e30aa029d349d39b382d418059d7b3c38b090138e607b819ab970c33bd6099edbe047a07b7d6e6a88607a625c796ccf29c194f4180422f73c8ef641084d7ce3551e71bd0bad56b3bd26b6c08ed704adf196a51ff60fe361f2eeebbe1e2af0644cd29e399103dfa12d844aad238754f4a7221a354ca73443a49e02003aacd8cc0f4a3345256235e8b667e5f0cca3463e29f6a483a561f94adb071dfe0ff8ada8829a91618643629845f0b2a3e68780db7a3db023965362690b5458fc250cf2ea2b908c806423ce87a269aebf172348f4ce8492a54656f56cd13440e3d4006ea95bd1ac19350f03894c60eb898c68450e37c667a2088966a50004e19a8764e5da1b4fd19badc29041e58a736c106b5144018139dbccb17ff486167605ea12615c682b0fb59a6f3bf1f49f1352d35fa0b66ab3d760ae61b306d7bac221cbf30b41ddd1347da8bb9e6d692f598bafb65e7ea3147510f2a3d42d6cee2ba54ad36ef60a0d502873ec4497209f19c050d921caa46dc4b13845b490036cc41d314915867bd8651f5017c37817fbd749c197b628e9e7f334256221eb72c6aa0cc6f9558f93de858195d0058e25a0e50f9b952fe538aa3fd96442a9a08534b9bc6435ca2e3a5246c87d8292edffc1683329068b7499ed34db82d059e1772b794ae016f5848325012f676a10d1165475d16f9c28b2822c41dee1111c4eb4907a32b66050b150675f56830041335d75a0e23217d8ad138317838c0e8c4a392176d618b906f6ee681a2c1f51044c143c44ac6e943ffe6cca8a187685cca9c039743ce962f6826a6b6dd409405d1506664eb50571193cb248d022fa001182a67094af3635f2ced60d93c4bfa3959fe621bd42cf07a0d15a557895c6ef61f43254eb060109dffbb2bf0619f016f76e3e42b377b4ae0d19af53d317bf25a5f93858c0a2c669a16f91b4bed0505fad6807eba36d7d4587cb3f901d3bf4fea3a7648fc824196a385eaa4bf3246a83f3a35895f95f1ed1fc2ee0b2543feb24baa3fde0196a7afc6a8c4fa72bc5a3b9748ab28e4b400a5a31f4dd95fe576b8a33d7c594acf48f171181a1503200a7b5e1fbe0ab10a1f5f0cf20995a67c13d8b0871293adf4303a8e380c136c2e997578b67605c9227d5f2b2ad29fc6c46fb3aa64784e7e0b5e6f9709f049c0e8dcc9ae08c73674bddea5406004d146c215eb5265bb180d44351a2bd0fd8cbe6b802951f5cb27a0426a816af4fd6375414ccfe8fb25c887ad7a2a58a5d094e78a1009c43f3295bdc35d340b3eb4d69c01027e7a9754362fb51ce3a6afde2e90119f1489e493b84c513ab28e035a974993b0f7c8aa575c0db9ee3bf4973a7a6b8d319d0c16dd79f0de42be4d5c4fc3342cd59b00967ab5903be0d4c3514bd219009e44346e25fc1c8be3e9038d4f44e72fc5d99acbe7dc87a648f4e5e87493ca9e1115b2ce0c5e9d4cf23614ce66b6a534390cdcbccb29e23fcf634db937d9cffbf86353362a5d6758df47d429515687b61d30623f73aec9555c8e5f9edd1f3431000a8bb57696c6e60a757b922f68e246311760f92c03a11880e10c97b92cc7298e231cca7892a5316204dc18beabbe303960c43fc0a446c41e64fcecdc3b3222c506ad5f35254dc8491a9dcb63690ffd8647c145bf54c0a4dd8a80dd3fc6ffa82e8ba97c9a9657178eeb9526d6bf97272e4f7a70114a870534c27adc4ba043849645aa5353ce3e9f082d51cf8b420413c203bfdc021bad4e974d9ec79fd1576c3cd2b5507de6a55e29f1be9005731557e6603480a824063fb7b5fb809dfb69e381474d987e486dea87dfd4ead1f31c2bef9f788001428106b6179f354281fa2c85e437f71500fefee58e5bdc8accaefaac8bac328c52ddecc770b5bc46ee3ea18b61caa189d87c14faac1e0b00a5c6a34474983f135cc6b7f519f756dbaa1657ba9508c6e80522d71382686e21047a248a2b3d90fb828237c051622a94c50857d113fa6785716ba07b4373a7bfaea6956d9092d6962bedcebe25dd23d6fb70d957b1d8dce448b3ca65aa261d80e21b7e4be9b3dc38fa3af2400f53ebae3f93b69cd199732d8aa4da7259c2805571ab025dd5e484bbfb17ca0c9dcd766c6410a7fb13b8bde97de15e2db22c03c58807204695e33550fb51e90b4f20134c1b08863139cbc31cf7fcbc2d11ea64c278dc40c73cd687c1bf1484bf312cf242e57e34e3c3bb8b4706cfd0b6fbe8208745b93782225967347f3c4a42bcfb01ec92024e3b44d40a3960b46439330f0f0f0f0f0f0f8fdc30d0d692d0c8539320934c12c0d8426a27f022539229a514494f67e6f4746602d7c8de840c139f46b00140060b9c0a040b8a89c41231210612f8f39c337f8658debb1d813bcfc153236abab01023b0ffbe559fe465ae0bc110a308fcc40cf9db73d2c144cc0a3188c05af92549317607fde913620c81d192ac934b4c93447a332f053184c0ef7b92e79f29640d1d22c408029f4f738ae393ce34eb4a88010476625a0b7a672d4aff4988f18384eeb3feb4fb20d9773a419b961074ac07e8cd17cb2bf95e1a3d0ff0602ae91c8274d57770488e9431725bd41829bdf23d644f9a64e7a84110dcd0e20b442a6d8b1ec1791143079c727f1bfd59f935213c88910326a60aa674633ee5295f420c1cb07944a6a082f43c7ff1068c5f36917a17028518366063acd5b49b57c4521fc4a8c14176050d9d55eca2ea0a0b24a08b1c3f841834604ba2a5ba5cfbf9d53521c60cd89839f7e753adca9c0cb851d371ed72a64d3177102306acd6c4d7a4ed3d5a1f0b7821060cd8a87e312c5eea8824d3320788f102eed48d6e92634a26356b0710c3059cb4d13f512ccc62364ebf0d1b3d021a294709b6528e121c89d102ce42a5cbbe7da29bfd182c603782c8db947456c157ca6cca2a348a8eb72ad84cc246d5eae51034930ace3f55040bf1ac54b3a860378f1625dbd5631af7147ccedcf5a4793405e3debf1abfdb5476ae147c4ca1c63c7ffbc70f29d8d0e81da9a4ea48b146c108612771d5b295ca8ac6165c1851f01644f05422328afa2414ac77c60b952f07059725e9e32619479e7b3ec1e9cab4f50b2aa5d5f78b0e4ff01554e4f7d7a0bc4bdf0936ad4285548d1442e4bbc051021e7470826fdd6aadfc4c9745b409eeb3e267b7c535c1584949b244ce3da96320800516a523137c4abe2a51acc504bf7154e416895e82cbd60aeac5a396e05c72fee7ba08e2315a09fedcb2839e5a28c1788a7a3b1acc5f2d9b04234a77e50f4adf7892e03d0829217b48d2dcb4916052bade1591f4e61da485013a20c1f5c69c757479edc65c3d82cb39fd9b6b56c994b48ee0d7d35f5b7ea7114cb60afe19acb4a5b95e7430828949b3630ce95b217b16c1888712dd5a118d92bf418722d80d566ad2ffec4bde828e44f0295af5eafe38e8400493da54b4547d9a41c721f8cef19410a6dad1456808be4cfa6648661e82ba0cd05108de3ec9bc2ea5e287b884e0aec24a2591e2fb0451a005179f83468e2db06e2cc01ed0310836e6e4efa223a9147444104cfe11557224895496cca223108ccc22728ea754d7f81ce8800e4070fac4f6aee27afabec8d1c58db7b280099a026526e81c6720c0011a0ce8f8036f3abd6dac2d15e086169de30026e81c5860e1074ec790628a9655fd2964838e3ef041a47e504ba372fb5e014c41071f18a91b4bc913b98379b0c0c2c68b20470e1c376a381758609172948086ef81771f1529b52c24793a1d7a6053f77f0e49f579e043e4cf55d2441d78e054b57deec0efa9b86b9aa2dee57ce9a2c30eacc7d2f1a0377d68f7d481eff4d9f4057553bf668e2cbae0c28b03608105093ae8601d73e0bddab3738bc6a433a7430e9cae203a4f66875039260edc4916797dc13243db0e3870b965e717635de914b1c01bf85cc94d8d57eaf0e0a9a1d5458edec21ca0c30d277b4d95b3a3e94a0f3adae0c8346eb14f9a10338f0d68909e72be8f961c5d6cb1828e3560871a343d75a1d28baadb3c47175c74a481df745d253c823e4d22b5830e3470ea73a385dad75fd7d4a0e30c559834db0cbc8699ee32adde493c65e0f23af33d93f0582a04081d64e0be72b698f669081d63604d86c62094aed7ee62e0bd26ee662ab9123ac2c0e5f54db7b62996903960e07aa404a13bbbc4a46447e8f8021b555c53948687984a62a1c30bfcb779d473c9757481cd92eb397b8c5f6addf82d70e05da1830b9c590a2995daa94c1fe9d80237fed7ee77d617a44123cd091d5a6062473399773fc33253438b58123ab2c07bd29f6424192b69cb792fde0b12608109ea3405a5f984f6db6a685d818f5b93837ccb0e392b7095b194d5e52bed0ba9a16590d05185da3fffa42c15d8db2f194a62eaf735d031052659bed1f964f80509d6d052237448818931e7896399de27af35b44e081d51e0ae4a7475538cfcdff022c716e4071d5040d4f4da598778d1a1e3097cb44d6af3e91f8f215971e87002af9e82a5d3bd8d269a434713d8cb95fc3e3be74fa632810f313c4d0eb1355ea9c0a163095c887124e8c83963a85c098cada6afe476bb172def48021f534fd231c6c8228173b11c2357daa4ab24396ae01170fdfcb134d6d0935e5ce1820e23f03197b64e89beb152ae088cba64eac97d5246525d213a88c096957ecfa942359bee46c710d8f174267a217612aae5438710d8e09f49498db7aabdd71e3a82c0f605192255f2f76dde01043e65d71c3cb5c955fb74fc80d19372291949774ab9d3e1032e8dc9d227a2c94a16567da0a307fcdfe868ca9a549d9369e8e001eba584d21e3a9629e6d20c1d3be0438fb457edade425d7011f345447fa8c2721a4d0d09103c62e48d16984fad2278203466eecac0f69a49ffd37e0625604d7984365d48b1b3a6cc095857df0b6e8a6820e96a1a306dce820bb5427e8e41003860e1a304988d090bcf63f63f00c1d33e09204954f4d4be3291519bc913d990c219645b83ae8880196bbcbf4b45b40d001032ed47d5b9023c94b241d2fe04ac64f974d9b2853590f74b880af24b3b79d9812f629332e74b480d3fb1ec32a5d07c9626da183058c14bd26427f7375b2e4580517627eca633792020c55f0aa2159ed63aaccdae00041016e44600438722000004a80910a2e26914f431c1f157cbefdfbf7bc2f21fb5370b79de65e6fb9248b4cc18eb2ce78ae9ed43d5b0a4ecf27a6684dd55b2b29184b3b41995c4f72ef51709d257a84ac8882516557fa534eea1cc45030692f6b4a13a327d313d3010c5070134ca9acd291d1048c4f70a91b2989e8399ee0b2ad68cc18a3b605189d602b788a1c2547458f162cb0584eb02fb124ab8ebe09bef76c4f8b88a263d46882f18f95ac444c9e69a33032c188fd0495d348f60003137cf668d9458e21c6f25c821f15e59d83101e72d658c22012433fc898febd29024625d8381eab82460dfed969030c4a707bca326635c198049b3af173e47b0d9e3a1892e0cdfdc2b3e7ef49ccb2b88244e08a2cae2010b8228b2bc803aec8e20ae2802bb2b88234e00a0938e08a34c088049f1b6215f485cc5dc91a5a90e02ad9a8f8e5743a088b11301ec14ef4f3fa9abca5d3a886c270049ffb46865eaab5a8b611ac08d3c1d2fe766c432c018311fc7b8b9ab49d52ab5ce0d8e2240163117cefa73a9d90e25fced18d040c456422b8144fd4b64d6c740d9c000c44f022a48788164d045cb4051e603602188760c3f4071949a2b9df641d01c3108c067d95c6bf4e847ebac08101b30dc028043bbab3e8550e3dbae2c51637b4a0b185175d3c17560b83108c5225ab2ba99cabd369107c4a27f43ed32508c64608cf0482bdb5cc6c417d882c9901049f3f7288d24174d357fec07eba28aeee1af4f5c2020c3ff01b4feb3efd4ffc54fac0e76c7742b98bda1bb30a30f8c0299d33952895b3074e45cd29b77bf4ffd86a00861e98a45297f0bddb14eb539600230fecd58e5ae84bc2031ff15b42d0ef775262a9041877608497f8574826bc84ecc086b4cdfad1fa2b0671a0f502461dd84ffa99762b96936be8c0a889a221afe510844cce811521edb655b4ee04a91c583bf556cd9c315e48c919c088031749ad678aa6799f2638f0653d2e22f5047da284018c3770ea6ea983494fa3b3ef06468bd039a7b906cfedc068035b7969959ab27b8e393630326a056daa4cdfc87f0d9cce2f4d53f9e3251d6b686dd1347020d302186ae04363e8aace395f824c1af86f3f1b4da362d7850530d0c09d52ba7fdd6be399c9028c33b09949f73dc6d20a30ccc09f597bd6d30dfd59e902070602e591764a6705953c780481ed0e2d519a1e49568a65070f20b0f144f66b66e50b1b36da0249f0f8015bea572505659e1b3c7cc0f96bbe49c147792ef51559b0c1a307fc26f7b64eadd73b225c78f080718d79da012b4a64d139d4ed8f7630608ce0a103b64764c7942d1a6e9283470eb858d15ad3a25669ac78e0800b26fbfa8455da69d3e3067cda18ae95b6dfbf760f1bf0fe1724e4b6a41af0174da704952a5ae6102878d08089c9b5fb9468dccba719b0e112f37496b8870cd84b31d3eec493470c58936aa663b9ea0103b65277d29073f29d2ed5d0a281b6028f1730318b56d2bd13628ef80d2f4ee0e102ce72a720eb2de947d215173c5ac0a85ad0494b4610428895050f163022f9c63bac264e140b2cf2093256c1b7a789c1b5b65a748c2a18254fff42a9a8b952f6320a3252c1f7248b21aafa6995a81364a0821fcdadcb25d696659f82778b69dcccff3d9f70024a90610a46520efbd0c92e25c5c82805971942a924adad82ccca2005274c6ee9268fb1e44e648c828f9d937b7dba33b5970c51b0ad57a6bb3d2f9bac50404628389db13c7abc9259336e72083240c14e7ef124719446c9b14d21c8f804a353fa9c9737a8af46730c323cc1a6c959bf73505b3a0875e25c373dd9312983136cdd473a2f11faa28bd242c626f84afa53c42443bc810c4df0a5f54f05534a6ee450063232c1e9555271afac24581a0a3230d1c7a046a9a0f2a42f6b6881e006053e070e1c5910eb1a59748d2cb0c0a26b78d7701ae846e7c04b70429ea920ff7c5429650d2d4bf07749568e41ec35866c046454a26450824da624d5a72c39a9104a565ae4b000086e10cb808c49185a6db3fb595c81800618e0000ff822078e11fc08644882cfbf92213abd1a5a39cc202312bc5b5291fc4b7a92ecd6501b363a0235bad0220308061990e02bb228b3a4b954eb7f04f7faa631fcea810c473079fd5583d4d121a97c0d2db302198de03304bb8c51dbce4c8ce07cef645dca2b22428b607474bfd2bae4f9b622f8334f3293c72482fd12fa354b9075254d88e064d2f93786e810ec5bd274a9a26f083e6fc5493e6249c7e417825b73eda015a2a6bf9e10fc765e9295fd20d80e566a9266bd98d448106c87c86c3e3e26db8202c1576ab69c3be5ca9e4480e02ce2e794d24e501dd11fd8a4e993aa538e78defdc0259da47452dffbc0eee7a712b24e09353a1f784b5ff1438699b87bf6c07e6558d0a3c6ebd5a307eee2fae53051e781dd32591ff349cad2693c701d52b8ae598ea76fdf810d22f78b4c56db816fcdf9348d77444baa03a7b2ba5bd42bf4fb74e04ff7df653fdfed9199039be485286213840cb6910327d4fb8a7d480a939a38f0667b213d279714a4060eac9f3a1533f86eeca879033b21894e96d4971b356ee0f265fcb3b2d5b7ccb6810b253a923eaf0b895936a45348c1920a77d7c076dc4ac2478dc8995a35f0ff1a52998ed212529b064e64cb35297549c926450357757a72aaacf94246cfc085c9f4d553db5b57cdc09a10ed9a7d19d838c1cd2a5a88f172c8c09e30cd959244b3db6360445222b9dfb6c7560c4c52932a725493ada48481137fd1ea6697b246ca6be9a544734cfa0227b388902ac5eee4592ff0b9ae64aecdd4d45d768189228299ceadffbf2517f8b8db413753b9c57d0b8cb99e0595d2a2d6470b8c08b18ca03a59e0bff7dc6d64a7a06b2c704a82df7f8ac12bb0a9e9dd5743bc0332acc0ef471ab3cbb00a5ce8a5a5e7cd0bd11e153865caf5b4655a977553e02fc9b4d5efa24a8ba4c0699341458b97a2a28e021baf26683c615e120305b652bd594a7b9d92f6097c88b7e556d7ba56cd097c3edd9fe2675df6a4358191122d9950f7fa90342630f174d0dcc15f82ee2c8149e129c898369a6d5502779164c9378ba56c4d02a7b12d53540509bc67ce1a7235732b750446079dbb16222458a48cc0a7ded688489222b01bd533c5d29aac324b0446b78586105bef744a1982c910021f713bf4c79c6bb30983c009759e93a8ce9f395335522003087c8e272a560e1d42f7f4035e74870e651dcd44e3036e94e5ea5d111294567ac059fa1ddf71cbd1390f1821f49312ad417fd3b50356644e6aa7191b5a8800bf90a103267a8e1ff4353cd59203c624e6ca7797b48d2ce18077f5787e32e7b01ad10d782dad1f53860475db06acc6e8255a444e0d98e4fa290d3811d28e1e13490961d2197049fb285d794732e037ffae5730b73c4bc68015fd94efb34afe908101779743f53488cfc50bf8bc3515964ac4059c6b4a9a2adb022ed3b7e25ff82790c1023606f78da9dd2fa6ef57c1e66870db787255b01d2a29f4c416efdd53c189498f41b7ba674413157c0abd087ad92aba3da76082e86c49778494333ba660844a557b7f3997fa5b0a4eed890c99a2c8c9fb92825bcff8f7e36daab551f0e75d393acdba34c4100513f7ab130a2e4ad093a2272928b837ed903dbe8564e6354a4ff026fd5e43c87cd38d7482f72ced7e4158cace2027d8482a54c6a467b52fc6d8041b3172beece59ec73b4db0a2b2f366881e93885c2678ffa023683d61820d29dcf4ed4910eeb904f7de66c1366e96e0a42795629f054922b34a706229c6ccb30d25b82423fba710d4fc359360abf225b51121c5519104f7e6a959b762d0212491e0f55c45bd3d5da694040946e5684893fa215b0e7a0417d2275bf04b1de2e8388211fa734a513fe586b43682539f2d8d927146b079b35f87169936b365115c98fef39443dfca2b8ae0e3a5f017959ca4263311dc7dec8862724404576e22654e232259c81d827f0b7579c753278861082668d315457c4748092a04a7a35657969c105c4eb5b4171293eaf53106c149d3196f44ae9ab28d203899772e964ae9ce5e0682b1decae239adbd630808568255903149ee0f7c252b8d29fa3bd72b3f30964554e7f9a7254bea035f97548e0e0bf181bfcef99a83ce983fa7f1458e2ef6c08ed674a9eb4b7a60725411092904f1353f0f4c8e989bf5273da8bde081abd3494d64e55a931d0b62dc81bd8a7adb813713fa977db33a703ef2842ab9eb3bb2dbca62b76a0b31e8c06abec73f0fa1b4e714b2458c39b03926e51a438e22c23c07c49003932c9979aa4dd67111fc6f1107ce3e6b4ab5be51346f5fc480039bb2879c4d922acf0fd5d0a28103bd8113bf92a2bd2a2ba3fa458ef76202d780186ee0549e9eb0584a6de03bf37477da94624a0d1bf8ec2106d31a455b76bb06ee83aaf7c53c6bdf8b1ab875d57055350d84bc31af88ba2a061a18d9492cdaa6d3487173065693e8e8bbd529f6db598861064e661b291aa2e99ad06b68758c327026a29bec2ea25588410646c8b7c8223d8a7be963e0f52beffcfc5448dcc4c0755f4f1212e3a8742218b8228b2bca61214618d8ff37554992f36dc7c710030cfc77a9ffb652e954b03821c6176278c1627481bf54224482c5bc0e0b17b8f497638863ea7a9d696102b4808d761c0ed0fae24560c3d8e857408c2df0a5458750c126dd6855530c2d709a17643e59326530531638f9273404252a2cf0a9952737d6e60a6cdaa01b72e9ef53ed5881bf524169da8abeee688c2a3066e5db9d1323c4a002d7b14582bcdc2a3a79a6c0b98b4c93649048814f4a4c69a94f13b2269110230a8c123906ff536a200614d8acbdd096423f5469623c81d3c95e7ebf5da2fad31ec470022fea2a9ffd26f79cd22670933e555a1eb37041108309dceba4a0966fb4cbcfe1c5166623c612f8a44db7de44520d2d74438b942188a104b682fca06267f60b3192c056a403d69e608375d23194faf191f64727f8a8c1f6befe46fb22e0a2bba041727c70a23e36c17ee54ff24f928e39080900061f9ae0f48da72cdad78ee223136c1cb198219fdab8f89cf8c004fb5d5f265659744d870c1f97e05584a6077551f3326d68d15dfc0122a057f8b0041fd9d3f595ba7896d34a301e3d84aa46ab0c4a4909ce73dba98e212d4ad056671ff89844294f6e52a5b981430b6288f89004276b34284d9f544cdae7f0a28bbec147244edd25fc4f977b0c143e20610e42f6d80889a3454df87804abdac9f77a27d9048f061f8ee0f3346868539531af683f1a610c6e79a4688e78f0c108ce36a8a82e7e9afaff8f457099b27490134b648e8a193e14c144d7b8923d7a12c15ba67cb9c3d46709e61ae103116cbd55ea8954495a6e3b848f43b096b464b34a664aa6e9c310dce5aff64b7253e5977c1482ffa41b229b8e13824f7eb2b27aae84f031083689525252104b107cf8bd889e8614632995f011084eaa4735b55521c505042751f463d829bd60152b1a440c1f7f6082e5f7eb7a8931bec90a1f7ee0227b85eec91d6ef1fee8033f49d8c6ceb9d72ffe1f7c60f732eadae7d2223487e4e0630f9cf6a7cd13e4e8ec273db0fb5e166447cf1b4a7e238717c774d16fe36801821b5e24f2898f3c7029f259fce482e2030fece9b20cc93e4bc5c71d58edb11c96eff9795b2d6ed098c2871d2c9d5ffaee3f754e2aab03a34fa37aa55811b72c5c6871e3830e5c0e994f554ef0d23721c5ac96c4b3ac2469564be219161234ab25f1eceac899d592786665c4cc6a49bcaa2265d604c0141f7360437b298ba8594b592f074e65d19f3469d7f4410a848f3830b1ee4b8aec5b912453012cb090c1071cae0831a2580aae21ab55f9f10626e66d53968397e3c30d7cc86e5b22bbe4c8687061021a83f86803f7df77aa91563b85c706c6425353ccba7694fdb10646e975ff4832a4064efd5be37877da485b1a98a0f38e9dc8213470ea32e7e474bdd37a9f810d96b348b6d790983166e044d988e8df9cde6796814da732554517c9c0de9b78d6d0ef630c9cc897c5a39fd0b668137041e3060e6d1354e046045cf02106ceff45f88f8c1bfc4e1f6160cc7c72854afa7d2729f80003ef96367f27593c8d200ba4a780f9029b16e61f7a6232458f1f5ee03d64f0cec973143da11a5a07d1e0a249715100157c7481c9f95d1ee37692a7834ef0c105b64d74a467afce19f38f2d98c27292289a73ca906c1b5b8ce0f5430b7c54bded564f77593b1f59e0a3c760bed63b21288b0f2c9c738f4c275d92f60a9cbe5215926448305589e0c30a6cd4bf208409350e1ba51ef051053ea8ec3189680753e5a0c1452f1a053ea8c06bb40a6271bf34be680a4cd690fa11f2a5d7a02405fe5b3fdfe367149542386e5c3dc20101dc8f28309637f2b677c8916afb1b26c04103471759a4001f5048a7a4cd644ace9da418827e42795b534a22e9a4bf72c2e5b55173699b8dfdd1845454481b35a7ec63b20f2614c574aa9c7582289f2cc1edfc934f54b0145df3a104f6944ae93f2388c6b4a1001658780e2cb0f0c04712f8902a78ef57881a2c0909dc8494baed92d0f61784818f23709e7593b4c4ce63ef31025ba9ba4e787a0d4d3245e025e9661fad5019aff241043ee57a77fba91c9ffc1018d593325f529b4c3c17c29d2d967f50eb471078d3a29e2e4bce3d3a42e303085cf88a14dfcb5816493fd82b29cb075c86084a834c9b74e7b307ac04dd2773dc3b33a678c066d4b439a60d3a72867cec8009b124880a2a59b84a74c075b609b7933f4266cc7ce4807593496db23cfdf55e0d2d1a5fe4e81b5a9cfbc001137d8236ddcb59e08bce91a3f30624f8b0417ed48011bb4cb77ef7be96c7400d2e5a0159941d3e685058dcf89801a7922cf19195ed92954a918bc2870cf8a42f25199ee2a5ec120c38a0ea071f3160533219b9543b8d3297c6165ed010010e1c3674021670c0150e3025f8800117f425b9d71a7f019b7531ba9f24ff4b7db88009f67fe7b97d34892860eb20087080c6013e5ac07a2715f58410f693a235f860015f5a536fb2bf79966cb4e30d045879ac824d0d93646d2a8ad25ca281a38bab47000e0b64202fe0a10a36c4fc3cc63b956f7b2a383dae7741d5860aeea2a7abcb0aba3535a7e0ae7fe3ee04ddd1d514acbd644f22544474ae94824fdf5e11e487789082cf262baee85ec424b4329b80c728d894a145f6a877059d7888824da766eaff9f992e29148c7c8d61917407148cbd77a890e7415bd44f70969fb266ce57196a79821349df4fd60a9dee11ac11f809ae13dc5fee52d183d29b22a88616728273519ff2e8aaaee96c0dad337226f0d8049feda56468f09052e40fe1a1092e64d478917457b34a20904526b874198209dd1f3ca698b9830726b86caaabdcb2b2599cb4c0e312ec6532112fdc735bde070f4bb4a243963409b9d2e286175bd0c081cc0172e04000178578548213211ec56308f315eb0b1e94e0fdabbb2de54b3134ccb618013a8f497042c7e4e7d65c4bb13d24c1ababe5e8916975a954d091c123125ce7a4ead2548578a35348701e4be654d95dbfb3c686c72358cd41bd77f4ea9538312b0068c1c3116c5095546a3d1173b4de084e7f0cf9726a16dd66a9a1754516578ce06d700defa20d4081073c60cd3082bb1892121d7352754ff0e8060da4c5221839499a2ad35839828722523977a604214203073a22782482d39f333c9adafc9d5b430493de2405cb1b72866b73f038041f1a63922055546be418825d5149e4944eae5b5eeae051085e949698e2af4e084e7592a7b28d926d423a08265a3e5116bd3206dd0b82cfd9f2c5e8162b929f23f00804274fafc6ed6225530d10bc0489717b4bf4e7e91e7fe03fa995f776a84b8f993478f8810d2a34c60a2ac5b5df1c1a3cfa40cc5189316e928bf3e003a33592fa7ce5494b92ec81f374b5e62252ee49d94578e881bb90847e911483e413f3f2c069108d6d19c32a473cf0c0c50dd2344d145bfb60c0e30e5c05d39ba236ca850d1bad40f0b003bf125d4bd4efaa07e1d6814b926ba25ed64f4a4d1e746075fff326fbd4419ad6068f39f06a59f485de9cad6dca81770df65617b48995a7068f38706ddd7d418f0e0e6cf0facafbd74a9e375a78bc81af366529349bb8eff6010f37309ebe2b3305112ffbcd3078b4811565e51df26e25cd0b183cd8c0df989c1094aabe0b560d2d23038f35f01749fdb3685878ca45bf0d1a88030f3570d1ca829955b50429aaa115f04803a3ef4175eeffb14c5b2a3cd0e07106d6e4fe6bd0e75d6181045c41812bb2b8c2101e789881cb69da16ba4248a21a44804719eacc493e82331a1e64f83d77b2cf4b3f3971f01803a3e3c7370dcd55c2430caca40942d677b5a66ac2c0c89c96fc53fbfa9b140c7cd06d9f34678df8f90546d86516cfcf5da93b2ff061ca32c51ccdd839f1e80237667263ccde49aa4808e0c1054e9a722dfbcccc3721e8861708c0020b83098f2df01d3477a8e89fe5f0b5c0555bc88a499a055e3c49931d39a53b49b205840716f853cd2cd6797367105d81ef94ae4c58ccb102a31d3f6bcd3a55604df3998ec15390f43715389d258a4c23ee14f8ac29a287a0d6d2ed9402e3a9245d30bf14b4a6a2c05fff98de502aa798443ca0c0c70f93982db94c5348024ff078021b427decb59b14ff6f0f27f0392ce7c97bd16b94bc0617fd0ea804800d3c9ac07f9296ae9eee2d395f0f26703974d8fe5eacdeab40d037fa010be802070e0a7c173820e0b1044e92dc5049b8293729391e4ae0456b788be55393738f07f04802275d72a7b0faf69445677ffa30c003096c862c4d3a9850bd913f02a78334ad29ea87591232029746ff7d537b4ecfbd086ca85a9224b22455192502df2d21a5f57c9bf22c83f018025ba254deb38e1b646f8839c043086c5a0d06a5e0bceb94903985b44d49c179f6cc7b9b96a25d46c15b0621dada1405a744fee4a6fa50f01135c90a522365ff40c1e64f4f51426c0dfe9d4f70b741e63c9e3e4bc81d4f70325f1aef3b4d9dd8e90417d436977d8913ec760e6116692c07f926f850d2f22fd6890c724d2027c7dd94ad6782af31614ae428f2d48d09eef35bf6bfbd2cb1be04ebbe29e99d8c2538d36317cffbb7b2a6127cd0929b52ee4a522f257889f1c37290aa9bd749f01664e7345e694f4525c195752891423412ac86186348a73e6f8e90e03ea614cdfd477ee91ec1259d630a9a3a82cb1aadb26e643c6123384d2e9242e45c6a152378d19226eea417c19669e8584e5a114c1edfbac876f254d289e02c8fd958dceacd2044b04987a4ea3685ba051d8209aa69edf476103a3704637aaf3c936d50a253083e681a4dd58c2104f7a2da379ea4047fcd20181bb9396f9fb4b6d7582108d6bb325fc6131adf9355c406560482bf11aac5c54b407052fdd497ba0d42af7f60342de3a6fba0d49f7e6052cad85bbf294e0cfbc026115d545f5a0b593ef05731dda6e655d3dd1eb8d7ee8f9e15627c4d0f4cce214a72f1dcd2e781491b9210195478e0f39576ae2062eec09bac1c6f6c62ecc07e2ea5230813bf50aa0327315e3e3d1dd878d629fb2ed5a53ccdd01bbbe4c0c83725f404ed15c913076e45a9e1c0954acc0de9b26fe0749970d758f1cc94eb06ee56cf4a5ffe3bfbcf8a367095651673348fa3ca6503237f5c37a556661e770d5cde539d6d62c6da70d5c0e4e45b59279b68fe360d9c5d9a328de6a5ec5b343021087d3245b667e0821ceb0a32ac4d9accc0fea9ec75bac1733095810dc1c5cf45755ff0c9c0a62ff1d40d49abde63e0530c3a5a432e3f252306de538fe508a5daff8681b31054ca985e30703e4aba8fc8cc21f405468a149574de125e412f3039246d5e3ae5a025532bbac0875b2ced0c41bdc9a0da82155c608469d07143740b5ce806f3b0b42d5dd2029bd4fd7f74569be4b3c0660f1d342bbd958f05366cb5a367a858710546650d2295d235ff8cb1c20a8c1c39ea4f761a15761578532d16b2a6ae090d15b8b4493a2fa353e02da5d3f0929b3952e0d2c7dfd16e89023bb6d921ffe4202457ac8002fbaa1625a9afb96dc58a27306a92080b35feb6bb59e104be72774b4c42574e59690213d4872413783761caf49f96a7a025701b649fce7fda397225b0219965a63fbb4d3d098c488ea179cc737eb00209dce998beb4531b847e04f645088b315ce4a61881d7d4a232e5e449534c11387d9f6ce344cbb40c11d8fed2b1efde1c026b5994553aedd9bd9242602b59a8913a9a27951904de244bcc1259753a4c207022f2cfa2a994f6a9fc01df9d47737dca6fa6f701275ea72d899a88fbf7800fb6b1fdbaba1a5a344ca110ace00117636fca7ef91df0415fbe5239a5bd1ce9803b4fd6bd1a5aa4c673c08f674b9a43fd76ece0808b712b9a08218d48ba01af167cb286166dc0a6f6f7a034eb82b0a20655ba7439bd5c1a3032ef4e0ea582d088ce8031999a4404a55739ca80fdbd570b31c638d1c31870324d1659c1cd5e7f187021825f3eb59f9205bd80b5a47c535392152e60f337c34478ac68019f93b0ccb86f7521c70a16b0295390a4377f37d4abe034f4cc6408870d071019cc5005afe96377105dbf6b2ad87c196216f35348362ad84f314b5b226e329d828f94d27608269ea9291875c293ea782918f13849aba990820949338a4adcd041a36074df2bb3c4e8399ba2e04cc815116f73102b43c18b509b8450fe7b2650f0318212a21d84d63c7e824d516477775e8e2b7a8293492bc8dc9b5b31d709eea347f2681a27d8245f44fc0e3a54436e136c56cd90da4a9ae0ab3a6f0aa64c70f69b63eea531df8f09366c5333d7a4dee79760afd2356b825097216f09f65aa45dc4742598689fe9cba25ab018a304bbe9e3498c1227fe6b936043507513e48848355b125ccca4aad4dd48f017c352abc7a8396421c17528a1c646277b7c98f108ce4c82f96d2e1983c511dc89949dd63ae94b6a049b55f4fafb6404ebf7bba55ae7bd61d7d02264063316c1e43831f585c7ce2645f0ad9eb3e913c1c5a0761bb4b8bf88e0f7cbda43a4ded4db21f8f813926a68d5608621b8aaf449ba8e6ecdaa108cd07de579b3c746cc200467a13da7e717bf11b141303a8e5fb264972b82605412ff11f12b104c4e93a46ed7a22b2a80604d8fbaf49fe36dc5ffc0e8244205d97715fff60363bba64f4fe8250c33fac07d72157733cb273da2c50c3e3049585012e2a6f6c0e88ba3520a9eca324f7ae0b24dc5bfd2c4cf6ee5810f32e5ff7417ffca2d3cb09d25f59d091147a675072e5433c7b074ef2eba38ccb0032bb2edab4e439d5d07468425dbaa5ad7aad0818d173f5da8b4bb53ce81ab243c5d3d72604b96e8eee4e2c087e4e993b449cd2738b0e93d8dae51db8c37303a24a43bcded24720357aa57377a169ddfaa36cc60036b4927e61027846c4a6be0d52575eec898bf2735709f6aa23de952aa4769e04bfae6a556d5a4ecc40c34f041d4fec8989372cc19b8a4af3a26292954c4cdc0dbe896e44dfd2b9d3294af2be7b6fc2103a3f535a4a06fc4e3660cec6f922155452f778c18d8947ff1477a5b079375614618f8b03e1dfa73585e060c8c0c754244d017b8d5a0556376bdc0eec5a477a36756624617b84af5f89fe55a9ec20526ed790eef52c233dc02d7bfe279529756cb30430b5c64d537bd4a799e2cf031da49fcf62471c3f3851958e0c223c75cd18bb9bd2b7057b933a6d46e1abb4641ccb002173dd287a054053ef4a3d7c50b69b1a202b749ef77af765b690abc8fe8ca9425e5ff5260946a45bb5a6b70d136b8c002400f664481bb53224a749ab609215fb40d1a65a3af2630030a7cf0922be2b9ebb17b0213b3937a4bfa36c30c27709da3986ccd23e9b37485194de06e54fadc19bb42c821263042ad3e96dcbed2bf49c28c25b015b42a24ed29640fbe121819f7f4055d229ad2d3083392c07d4a13fd1fea5e620609bc66d7a4d12571cc224b987104d6648f79995750a53c24cc30029b332befe5dc4a217e3430a3087c36334b49ae1d811944e04753ce963575fedd8af660c61078ef4c2225f7cdace0f3608610d8fd087eaeb9450917043382c0de272f8bd934a5d2da096600e13c30e3078ccc9e2a783667f880dd979c63141fb5b0b1c5166d5682193d38b299664732d50dcee001577aeabf235c3c179fc36cccd801a3f7472d57babde64c0d2d522198a103ee447afb4efc2d9b580ef80df1636d8eb9713c5f430b3d8def0247098c093370c04851d23c68edb82b4159987103362c95e67e48e955846cc09adc5442d3e50489755561460d1853f77c32c7a073706b060db808e621654cff0cd8be8a9c629fd5376635b40c05da6e304306dc79a84ca2f44f0ca5a5c28c18b0a1c3b34dff88ed8660c0c94c62964707fb11fa0bd8b8d94ee8eb522723c5058c7ef7c82b612644c41670f6e92cf60667b0807deb2b1b25b4498ddd2af8eb4cf5795db4bca40a2eb2564e1194aae75da960844e2a479560a3c29cb3a90b19299b3f82be41434fc12525bd536bc6943a1a680a4e599669889b24960caaa155a5605b4fd4450f3952b0117256f718ad521ce528b88ca9f1830e95e3e7d0133e44f1e4cf514f631c3e42c1a7952022c7d06e25391fa0e05427af6c69648e102cd2828f4ff05ea22d9a028db4a8647145e25028100683c1601483305c68bb00c31308001034220e06c2d1804013b5f5011400044b2a204c2a301a222414162c160906c25028140a06038160200c0884c1e060501c0fa73cb317c52854e37011a6fea8c000700a21990039b006bce78d770cfc7ff7fecf8a1c83eb83b3e04f7cfbe9a34f1026187dc1293211a42921a730e0a04e307de1af1c60d36a22f4277848f8e78ca422104cc818654db818b95d7db180dfdf177995407cbe78b7a13e0194f0d1c1ff63111b3ac403733b685bba013d389bdb05631bbeccc86bf3d31df73a44c36729a247e7e797d01a1c96340b1d08eb00f50da9c132c09d22ae4248e9a7d0802ba7ebfc91837c15d9005d90846f60c32a5506c84139f08080968a2965c538822b29783f8bc69ee81d42fe1c77f487f840fe0da49be85bd2460d9e52eaceb97f1e3c62f25ccc1f1d8bc7ba2be9c673e9c03ff11b60c968f70b0b17047d82ff82a1c1d7c03f30ebe189a06fe322e04a5ebf6f4ff2390c00908771e6d5b42af5c00be1a3ce0914be598393a04a8d8b7673db70b8e3b7d7c0378c126315a9a0990f1b01ac621ced048538342272d5d0472c640b2e351b73fdb8b1e1b3219146b1efa9bd6b8037fa148806a9c7e1d76deed31a8c26882820852ff6a044d32f43805d95afae29a92e235966c92aed6faca48a432efe7d00655c3df845580528e3b946f031c14f1b75c27c1fbc9360bb43b087d4b5c9b0b2172de4440f39c70045641714785ee333f2cfc0b86025e81d388871559e167594480f940f70a6c0f6f259c0dca3f402ab9cd02aa716d791ca4368e0bc600572e3e3265cd32f20e29700dc3eae4ccab0a3e514c89758c4b8c8a2a7de59db33f10bad295694ad4438efbd3fa6a14bbcd62b7739ea35d86b200e83415efbee53e491d3e2f26cc1a30e9e810308bb635cc4b310c45430aa8024472c03cc1d70c375802743e8418de0d4c08a19bf6ca31e14e0fbd517df949de112c8ac6013e5c6d533414c1e50f76ee1f5744371276372e5342562e205c0e014a7367fdef420340c0e7d887a19eab0d04e9117ac6cf823fbffe9c40d7c4f76821969abf122b72f30799982e46410a9c5255a554d11ec205652489279030b28f5345fa764938793756ffee5610ab5172b3adffe9112ab5394ee6f380ad7966b0e0319c398140295e49e963e65b9c9752e0685804707cf9543717980c8b486545579b1b3c04c4a49f2df3a5ca16d9432fbe7c8268dc9d93c0be72c815d0097a09ae04e7f70bb48505c76774b0369b8e16d0d9f271a25d6badd18220efa061c95481b0850b5e4607fd903ca627fd2fa7ce29a3b2ec6a00ee28c6aa8667b1c2043fc2bb688b5e9a590e904b2423862b1c1b77d52f43d6035e944cf973fe27b504ef8daaa71fa724aa2dd69ab719c4167f04fc1d51075b7d7c47101bd005c31045ce4235e1a0e50f5adcdf8db4a6241fbce706239cb147c3cd5ecd6e7e6342998b8a8ce8d96523ffcc51024c5d95719a75d6816349c34ddb05243484a00a0206b10e22a943e805b8b3fa7002a58711a011b2ea907084204881ad070bdf06930c0b454057218caa7a5bf931474270b1d5c9c9efe01e48aab5ee7c807352042c8083503c28f6af39b059506e1633ba2e6c4acae90ddd5ed0f12aa9224c420ca05b912d6a51e2e8078a048c2f7fa0445b178b4931a420bf708226836157e905d0987bc0b3b645058efdcba543261f0993cfac9b9c27340f67a1d40a450b686bdfb1b144c5ee605b675e18eb06a6d9c45171f91fdeb2e3a31cb002f805871c91e832d808c7599b4fb0c2b8cd0675e26d9a3a1f581a3f43c8cb3708b48a397c63b25732bd10247e1c1b365608baee72150312a79070ec48f9cab0023b6ae148dedd129bfc25ed2d8c70baae42a12076ed8060c5276eaac00273b3632995922e43fdb125069b31eed8bafde4649bee9e7fd1188aebe57296e995d7db31196449e5ff8d502305eb29dc717afac4c25833d17c527d5a7c9695f95ca55393b2112d4f44b3b8b0bcc30307a3f8112fd625d28f0546c2d3a8552e8ea9789070b6063add9bb022097816cfe95c44b3f9f04b854328a0fe5d8b90abff44e7006c0150eab9939676b23263ad3279d0edd07ae65766221cda2ed5f4e50fac98b7dea89c98e4c04af968d814bf53bd1c3167548ffac079d4292b215f77704636d1d225c4fc703de2eae1131e98f2c6179449430440e3970fe438290e7cdacd1fb799b630f11a8e7d8a406629cfebd6bf2607705a456a759fda9b1408a33ae47642fca3e0aa81957c965bee1624299f0d62987bf30ee2f2934ec6696d033867e0b19ac24d4edac5e651704a177d1730ee141d389277c20bbe697cc954831c86c60c1461d27340cc0b55c6676a44e1bffbf0a803f48019e289e7974085df1042fbedcd9fddb7c8647f7bdf6dfc3c82c2afdb1e37b11fbde792eb25696820f51c1e07d91fed226a3fa75639ac0252b5fc1e814ec5128d4163ad7102421f0827a593807864eebbc0de62eb91435b30635660959fbf2cc0c2c482070f6d585f2e14db31898565425b63cb7d5bda0d6ba8846c5439ef6dbb27cc5795ce775b61c53eb1558d225e9f4bfc9e3dae7b644c1b16009f6e7073c4c22e7b2ca2f0183ec551c57865f38e0d581304bf95d5ae58d1b7d71d4c92775d515b6aa0e6131dc8f211e38fc525bbaf5282be9824ff08763acdb97500eab36ce541b9c42e9089a1abd23e7a8fa7f97493141d5ad0c2a971a81686761fce6df0049b6c68af1bce3a1c5d1ecd3059ba0e0095f6567de2e7e6b07837fb7dea1f32c6f2d7ca9a2d434d8f16e0380c3fda3f0be120f4d0c1dc5ca86003e330064aedd727da5032d9a4345c8145bea77f89110a2200ff81b304426ddc0b6f287a5271fe91b2a5877cf81c4c4476ff2ce4e6941ffea8e6c96e8d01d14f678111ac64f17e64ffdf2cfb0e090b2b7551bc09a2c51328840b70f3c5a8a49a9e82e6b3b680309582d09e279528c2812c899284fea98ff44ebde8fb1078361393cc44d0ea89d067c60d99ad0c5d2b13417d1c1c263d92efe04c77942c3da10455dc98dbab9945fda1053431e0bf47dd85c3649ce5396cb570e31e362e2664d211cd94902e3a67ede1fc6bd2a3974bc720c15b4610e30348d8bdacdbbfbc27e8088473d245c17bec6fa5afc8681af075186121616004a46e4b73289312a7d029ecc9eccb989943a8ec9b776cf7eca82f9bbe406a01bab3cdb48609007dd6ff481d6f7b132c8344248903aad53f47e369b7f52ff78dea5f44aabd05aaee88bb72fdffbaa678f04ec43f08e98b707192c8f84a5592f1a2fe712dcc3f588a7352859ef9002a0d1c0aeac68fed96a1548f48df8e5a2a962390a27fb42679ee8e9e3f45385eb2d1c1f6663d7590407a0767c4aa2bac953765980fa3cf1ed10d061dae4a4aedc655b41ef220672cc2364dde328c94b0ac37ef3eca80f37a0caf6fe62b5272fe3bdfbc0315d4c542f8888104d5dbc84bca5e5e421c435a631ddae4b95b1dcd8c663420d46cd3d162cfb4d42149f05172d67b3484bcd852a03fc6f5acf54d8964dfdbdf8759234d0fa5f70a89e37ada321bf8ea3714e7f0e2a8ae2d17b6f63a3b641b1e7c16ae17f68628806949141ab0466a3a50c400c6c883fd6c69d2306368961e035e044b92e186b4780660342c6d6ecc520b6af02999c255e9fed4c1c84178965d4938ce72e4fab11d8c2306abb17dd04240e855f1a3f99b3ff841819e421b6f1f8f0d37754571e1a1a2454d08efdb0c79dc4f0d9702727383e7588fe740879b0551233dec1fcb016adbe5600294dc362ff596c8ba3ecbbee9fed7ea8e92691251f7424b0d12a5a105ed6ff5498ad1138ea4bc54cf9fdc46d55097d6e348ec91df150799b986b565f6f31b0f37d55b454bc24a2ba6aed0e8de3d49f241345ef8ab58e41dbf0d052e2c7594a430b2431b97b8194a8176fea2585d227b70910838dfa87c6260d977d16b7c3ba7b543a996a0c8658505ce7f6acc4b4aa67afe8867343a73004fe39bb3c4f8632a8234aee7f218452909f811706cedd1b903e57e517fd0d4e0c41541775a4f337d08cbf3100306c929fca530bbd08f829259af85c1aabb3a40f7821b1b37eec33ce6c58d4832162f06713809743042b200bb943a26c1c9950a829c4b67671675d61741e049e708f7de602af96e0852f715b0609d01ba83f68ce41844a8fc3a4154384c7bbdad29dfbb0c13452b2720070ba2bbf1c694a70551e745c6a06ee102eaddc84d150d70e0ff2753e865284bb5470a0eb4b8b98df4e9189d931fcdb1e2c7f6785c701b9907659a01eff2f60f41cd73d080aed2fc9de3272ea9f0d86e3a07aaffefddfe4984cba9d450404f9cc2251427788e7abf3e263832785f6c4ccaa5aca6d5629abdf7133d5eeb1a9144fb65a5cf3bd1403de55dddc6a3e9f86ed5c4a451cfc051924a0626aa62e310d8ecd93af1830f0dc355f338ed40626d898727470a5b275c5e6d10dc27e3319370adedd594e5a84ce1707e005ecde7080a103680fc79c445cd1086b6771140cb0fe11a084cb931df36438c7e58898334c4a2425e7e5cd51cd0034ff6b483206503167a8fc3a9b716b32a7c49c8112c7d2557e745b3723e60cc8c9b0a7e1c91638b67aa2f612bddb37577da92de22c0191555c7c141a814a245d33e8d42168e563ea09a5bdac4bb89630cbd3a64de1146eeae074621654114063138c1555c2a6550acab0aa6b2d25f7f49103cb7ada78d2b771a5d3575a2b32060a358310a3e31531a2154329179bce0a03799bebe0acad71ab763ac170b129375c5867b15ce5a91b3782cde96f95ba9c1493aea11c8ed7607589fde1d1ff67f80d82a65e3a0e09394a81c8a93960a9bdc8a992a42ba7aab2393a256215db4140829cdb010ffecb90954c0c30f4571ee4f0cf26f83b26dd8b4c795951c445079adca832c739c8444474024b9234ba818cf6bb70220771ec067832343014a3dcc596b4fed2b5e5d20d629ac71c055e7b7ed0ced3b116f5aa337fc776c0628dc2e50c00a7059cd8db864d1b9d42ec52eccb649ee79f456ac74ffd16fb49632f3312023f9fa90be3471048d55e12f585641b23cb6cf7b1af5c3eb9c61b8cb8f362f12f38428f1dadaa5249f1de649d22c0354f8216cbbccfca069086f907284b6484c482e06fb25802abd9bdb54f4abb62da6596bc2e768fcdfe7b1b70f1a6b0c0c158ee5b04457326bea568b73211690854a271bedf76eb4c33b34e425441d6b340ee63a748fd4e4e85a1aa08c522804e24657d744bf573abf63ffd307c2646b2d5978cf87b28df2202358ea5df3ce9b5d1d6e4b189600ee24920c041838ad41d371ca12da86ba943071b1660e10f2cb7474b0331e1f69636873f1528c83010ff97c2338d2d660d2d89007cd773845a12d7217d68c3a2995fdb7c11e31a1aad5e0c643b3a911a2995579de57a34d26c0e18f8c9849523839fbc1dcef97603b39cce36df835ca94e9a19ef144e20e1e1d8b34009fed719a5c64464192f4f178d62258099a2edb1181901059c3c73163e805f2d1136de65931b56b75905dac14d90b33d1ff439ca25a217fba08a3580c8559b9ffd8260e510adbdb0058cbc5317d4829de6e3f4be0becaafd68f8a9d65458e0b92193ea4a3336443b2f0c8f846d1e7c1f1329a4b8caf746aa2650277b5492659a4856c8642da72caae924b4123f50993adf80f23329b6a5c650c65a87b9467c832a277d1c749f860432b0baf0b3923810e09cc3d6a68c7d9d152384922d0cac6326c7cb72201486cd0f87d248fe39c2ebb3624fa6133feeb7ae2601c4d9db9f257a6d634485c8e60806401d6ab4231d9a9c24b13d61310ce692e61bce7e13cdf6607855f77a9526b39176b838633a1a86e30b0107551aa8f6999c3a85063e9bc5fa822224a4d6dc0b2c16ed719b48ff0a9b12979d4480356975cb983f8280458e00714f60ca68eaed351e73b99366974e8c2805b6a340270f2c35916eda76f4a205497fdd5cfe62fe0c1f400f9a5c172e4371a78a1ede8c2c226a559e7454f451f497f4f309ba5c59fb8abc6e7aa96c3e69df9fe609b6d328613e78a8001596e7dbf5e5309aca29253131616553d172899b549409345243e4eb0f522c6eb3547663a0852423b8a04dcedb5a940d0da90b5b4fd2f36e82d4114fc4381f9424d93a7caf8a4692c46a890a8d0e13a8ba088d51a3687c8ea04d707d8ce646b5e54d9fb94213a3ef8dedc322f2a1f73b0c812f9bfc90a2ad371325490649b61af9fc7a70a25e3d46b146a9e23155ce6915177d8b314ef893a936f6b64c553c86c525cfd9dbb296574bce1ac3e2ddac2a21ab9bb34c6ea9d3b598d95de8db6dc64193df7d54d1102d72c6ce26b5c777c3a2cb29c48685f8236896bff0fb8b30cc9c8046007564374f8c6f170ad6c138bd6d60cec56d3a439a99ab93a2e711faf8b6b6dd9ec3a42787053ab445ec73c61ef3418761dc98d55a6f1344295aa5ba17e7cc5d1cb64c66aefb0ac6dc3d2bb0a8f12d5900de6cd8326bae040c1b77133eaaf822cdcc70396a64a57e29568a79c040cab082f241e85bb215bcff834b333eb58b2b0ed8533f626cac790510a947e370e0428e408b4a614b1e42eb3849168584c0835e47bc149869aacb0aa163e9d8ec9a2e93b2fe4755a7a2bb73ac2fd94127e7d8eb5388d28e8cf39231de7606a14d499a440b14ee8ff626cf4eb4cf34235a2bfca38b196649b0872cda69aba385a582f6076a3408fd6acf0f2128be381f4e6cd18c13fb6c1e5762cadb9adf38965dac710adf0edc4f286c2443b7f1395eef42c225791b9cb28de8e136910f1759f3099f74f6e39aed9c30f54900fbd6a33ac9c8cd13114275e236f406e953756fbdf465b6365c51fb53c3eb0dd83fbe6aa5c79f366f31f3d8d7f65b3b6d785ba2867e90b70068f88c6b553184a498a9d43c1fab5c0547f3e98f741c0c645c309394db886cc6c97b08511f3547da72e06dce8bf58126b163ad5a5dab1d1acc75296ce068a3a80e7e2b63babb79091be91088f6ac5d6e78e006d94632f3dde5aa915815a51320a5699e0d4aa10351d0d93801b54109a48a65c474a61406a67fff86944215a00224b5b7a42eec1a381754eb6d50a5fc99da4a6e514c07609d36def897337ac7f81a46bbc6e8dd959ba141b54dbee903551a0e60e4228457a5705540a8120db8758d942e0af0a36c531835449e09448e2b129d18bfb8baba5f9862a20b698783bba11bf7af873f7e186e025448f0d005ea6004173ba471aaf80d4e8062fdfc4f96a5b8a5082c1980851116b1188fdc1bb4c85bf8d666d536f0e4a0065554bd6b915be62029bef47438df2aea97c3decbb075d3d88268d1d1a3baf1d12743371a116ce08dbc2705893aaec0c5af831f5dcb80ae5922843d9ee6b44a42f468a869f77abccf0a869f10fd26b97fa3ae3b2173002738c064f987aab659b9a925f92ba9c211f39e56f3373fa01631e64461a7fcc564f551132226b9b57a9dc3c585a054cad5913ff2b49aa1554201ba73e4bff5ec15050cb63150a9fd32b46f683bbd9b11b3efcb63a3bacbd06c0788e7fd3b8ca533669aa41993fe4e077454caacfdd3547f1e6c368baac8374dfc890e80fb4fe25c2249a2ee6f96934ef8eed39950305d09f4fba17b42da50f4181d639c8982aa0326e38e71716bd06a6586b87b597f8e94c196c46fba2ecde71ce241ac9aa6debc42359ea7c788395f2ce6dfa4e9ea7fc05f0f1aca9edbd9f887fc541152c3c38bdf9bef350a278e4218b75e68044e194546c4f8af514a9d58eec9fe29e7e98b13d1075ac6ade5d4760869007ce7def5a26579baf3881ac9365edb9d3bfff264ff2843338f71ee9c5e8d8ac77b3aba6b8b7d8909d9d7aed874b114212e2275346b0cd66ba4e439276a157dd8a1e59eb86a67f3c449c7138b48aa422893a53ec6a9e48dd897d9a7fe3ac25acebb1f1bc8f3f7680a723ad773ba4b074c00feb607e068b3ac85dae66a3c42bb764dbabb4fa77762f9b1516eb93c95ce0269f47f71740d09ebfc406b90cfd155d0b0309a95af663f40f7a79ab51a0a174111f08c64a6dfb4064fe0c952176a060a52c7a1f82f711f02491793b4c52808b932c962e8190a640b57207cf35b309a2f4838bf60ee8a543cc0db740665b5cab901e007d7b21c0bfee2212bc5c4565661a8f5d0a05e39831ebacf3de7580549e50039a1bc1fbe3bf53ef158b22f15495bca32cf4cc3260d46b1c9c77505fa70cd41e2ba070b3f05c77ce3e48075ced9cae069ea204cdfdb51aea78412c96a1eaa19fb95bc0181c86c17c19952edb4d680e40ca99c2692afd4d85098c3358930dbfaf2520b024b53c8c1645c9ec705ed5f7810178269994fa7a678b23484bb8134c1c5fd2167c3fb8d1e1a5a21ca3436d832caf7000c76a790c72a06bbec03289141093550c19e90d79678fc792e84774eb97cf6b7affc282210645c9f3e68da72179adec35663ab2c83eadf10e30a105226550a4cc6e469c19cea83f5634dfed21de9c94ef79ae3995bc829fa259ad22dc90ec99a4bfbd37648721d69b7b45372cf53df3a690da7b5549ee40293da12885b904a4da9564651e6244392f3248152380900e947c96ed2bdb506728c8d644a124a12270991ccbbe91e2e2136ab7f554a9581297396639239159d388c10af94502a4a064fe6ad3c76f58f18d5733b57a4a90aa8f08b59f9e1742cb34d453ee32131451aff915e0a41126af2ddcab7957eaa5c140e697749a749f795ae957b4df5a96156b1a53243391020c6807f0d0769e9b50f3e00612605ca4bc256f181a7a8b02970b4337754eb2c7cba40f87d7641e6a8f3a758b9b5d954fed13dbb5393318d46781c9ff964bec3d79a3cd50fba1ede66c6045e1bba430e66dbcc719b4fc5f13561048c82af30033fa1c2e2e932fe4943827a847c7c33867245bafaeed69764dc9e4a16bf8b9232d7e43dea4e33a0c458658c9dfa12c0c465a631c6c1d6dd269f9f941ef7c5311c42fe5ba6fca5aa18acce311a0082efa1b014a70a443961c8aa1a5f7aa1e8be18c6bf9f4b8adccc9061fde17a20731566063965601a992de8b2051215985866f2a7f39f9bbd3eccf29377c6ee70c768756688655af471c8f601a63ed9f84909a801a7f6ad49a022a38db18171cdcc3bf4ccc3d3727432bb18f3a8c94f1ea8d11d13f9303ef17c6703425d59dea309679eef802d47237f742f5b0d26a3e7a477cf6b42bc43f2c4a181e290c3cc42deaf2e8989f97d87524b407df31d9e08a66acac4237ffea8c8e595e779d03b64a6021ea775d8f093527c9c1b897a14e86e43e2117b2052b1ee0f7395723d96d888259c5e4ccf08b49556b1355f5923559e7fadc86999d6ac34ff8ddc53945e0266f0bb495f15d6a6e3438a69d0c83d150fcef98b0419e74005d2241358e196c9d3e5054ae0e0298b095f49bf4e024a3eb444c5efb8b2aca9ee80b0be61ececefb476b0afaafc5dc473821ca289beccb9866d79b47b554be122cb2b0a1c232f16bc859e35d45d6412e309174c641e35c4a610c9928edfbf3a41e0d9a0f8505b9e11f3981db17b1e616cc2ba9fa00392c6d95efae4e810b97f08a1cbe5073ed3a811846e42ca3b7bd1d69a0842493de9e95c6eec9b591ef4767b9b9147512cef9970239237b9c818dc13d63568833adaccec00dc6d6cc88799a22b74f0f9d3b7eb6ddae6abee6ae3ee2911b6cd588317490719154ab2f498c0ae053fdfba981a5c22eacba5027e410b3b9bddd8d4e8a2be342f9a64284b91d5f2cf2a42d96f799f01d829f6ca9b36df0472c149e70db26035b4447dd7b06ce433f2062720a0a3ca88d355b54fff3048ceacc407a72c9566547ecf3cb9f195ab5ea909636e9829c0a9a9466d89bd7db21ecb8235908198ec83341d383ea70735b417e81b405689908e5ab646fb2c452e1181a82f72c77e6f8ef3b9f11cbfa8117ecef3acccf8661d190a38e0ea1c0c6c5673f8199a542d3e0215b55faad7c1ce61ec0d1e5348d2d882ca532b0d16d62d3a8084fbc3850ffad63f2357d05b404707e9acf09878f4d8154c63e5dfad892c1aeb5c72b25016ab06d225f0e98bb0b5be7b50b2a98cc8539273fa90dceb37a2ed3161b25468a02fe1532d8103e849ea9fd03dc9de78f55936b8dcc93944898be6f133052f78001ffdf74f0f911cc9ed7a715048284f89843136a50d382a7e03432c5fd81ff248405afcd80a464c8bbe1672bbbe81c2530c003db44a34594e78ca018890df7f0b5e1d8a59311f234e6ba1f43dd12b6569d5349da81b0332e9d5f4b59a98c4fccca5c09fa595f8a9171a6d44f993088492248887dca0256141b3b5ba6a249b74ce1a366d74bd811cda4089c550269095f265e1996ef2f87878d99537eff62bc039952e51e9699298eaee577347c6bccc7dc627ad645ee2849968cdf2e676c5e6dc4c00c1f5ba1d8d91f2c0504b6fbc1b7a3a76cdb9dc1fa9e1986662119c068e8c2638b307ea145e8e2be8fc3d920a499958cf669fa128af7a05130f6254c7b891fdcff7ee54c8b67c6753b5e3f63c7e07ff94e831e922a1858f1402d17d88884cebf794fa93cb1bf9184081398c40b66586187d35f4a3777a360c91600ccf8314118a0ac50fa6b34f9a65f65f6408e5f5f2b71ed9876f19d14d98a10b244ce36a620363468f9851cc32c7909a50e5e3460266d4e5e7f239e731ef53d4721394ce87a2967c897078a188170920d81e36033a3b0092a0d03ba77c1d98100c3342ec888444334483a24bd15809d88c155d4c76346d32a1a2220aa653f4da5444f2c48ea8488848269f649af81a899320c4e65607c29e9fe911fc99e078cde487cb2487e042d7fe22519d443ff4d8d33e051c851b11ee6a340a1fc809bf7403173a303a041d7cce8609f245f8de01f26e8fe6fd90346e2fc04882a5ffb76b8e1ab78164d540db26e4ef256440e826b0ba5fd828561e6b685fc2c2e106170c7029bbf4783c09476f9e4e563ea1cae70ed96c0a058a3acb2e587366addc617f885135aea95c5ad74a23d761ef74270195b3af855698913eb7080fba69e765f6fa8cebdb1d9304638734b4fcbdf97718af1a3a5e385207a5660c23d2541a3b7d68390c5699366e28142cd78f92ab9ca277674cc014d820d0c779aa434b26386035141090ff773f60ad25d382bfebc0958bb95b446173d8805a438087033b14906821efd23502f73ceb8de98780e18f05e387f6b29f5f8d6a8cf2a66811fe64d31554cd85e1dbe5c141bd4daa6922383a3c83253a021a027b0e7bc2f1eba0e5406d038c7b4b985e1005e4544b9a926e88e97056d8b81a714b200148e252c947e4f8bd77c456a034cbcfb134251ded438309c25c3459cc10fa1095825aeba9f80c0655e002ebef9e481375833433e5412b46f4ab3b05a4a07323ad016587efaae93a78fae39b08f813123fca840f673912706755d388d801b943c433b80b4a65763abcb66191dc6c9bde093fd42b6f630d6b65d4ac7b08bc6516f3d489d5a543d1661827fe205151f2c49e5a6f67844e326e731c8c502dbb6cb081633210a43963feae9f0b3c0a2871108d1282b2f75e93f2212ff6a8d95c12f24bb41f5b45a72fcf4646a9cb74f915e6c66194160ef85dd9e9d12c9185163557a19af7530b2373b6b463df47aebdf0748641fb9b594da4b001462f76847c31a70539fa3e22f0933edb98b80bb49ba4ef7e8ea146d6ac13fc1bbab7de5dde04b19f03855d264d9b1c4c2d3c91885d1681210a1f035a8ea98d7be9dea0d9221796120e5e3195d6e21d692d09680baf6b6103bf602872461e8b446e19d497c16669ef9a90ca38701578ec7909d44df940e5c282d5e56c5b1c2596237cf03d1b0a02a3f63192d8294476c7a846659cf2c975cb7797b01ba0c38d58b734da32bc001941495209b26bac1cbaeffa91f89c6540a10e596e3f0ae4078f9db79b0ce9d920fb323ff7c43eac5984d2e298f5f48120f39be6ce170c4d60427999466dc55a78da410e9da79108e18f5ed1b353ba3ac49c5861cf711df535c4844fa6db627604c5c25a53c8c3a18aeb28a69c8e2e3aef4050c2779738cc3d1cb5e6cbd5e36d3e125216cf8b2d110e9dcd4a80877ceb626fc32cf2e3dd91289d7425ec82bbd6a7653a4adf0aba80acb2838d8aded011b22a08acc153e617ff6902881c0309147cbcb314e8d82da5c51bc200a260418aa41473a74c55ef92200b287efba57d1c388764fdb5f493d0ce80debd8e4230a7cd96a2604416f95732ecd839c388c618a07c0c94b81413e4fb3369b2bf9528a495e76218cf839cc1b9f067fae51e52757f5cad08d32c61ed355f1d18f2cd67eae540bc68806c68b7861edd6d8e3d01cb616e9f3d6567b43b36b710040a4c2a9216b3901148308ef8de028a9dd8cd88e4e422db20736be12a70da0b1d9a6d73adb8fa0518343f2321176b4bbae80768045c0dd890ce6b2e004c855684b2802982002a2f9a5e9f6dc578dcaec601c2de1c390c888a18103ba3ee296d56a56cb13bd70d31619aaf5817351d228f9e59c87ac743c9f05021ae08ced6ffbb8a62bd5084b1c2135b59c760b26f99ff0f80a84fb71ab2b0d5f561d41a4a40a659b14303ca703aa94e720566279c480ce0467ce2c79047db4d463cf648e986c837c55008346b57fced17da727df1cb2340f875394550ea9f950a10bb50a65ad5b11a25171edc7a602422f44f005a8881a5299c3b4e0c3cfc455ebd41fb19b0c66438736891e0d9589667956477ab38c8e5accf56f5d112a9b72f79d5435a10ad7db28992efd3e3008660ae0db44179a0a0a86362e182f175c677e5408596fd6f2fa11897de6e085e5a53ac5d52575f357670458ba198da5cd95ea0c38be02ede1132e229c31c82ef69d1022bab63799c278f2d03d2744fce19f637292cee204d100adf5f026848adb5d6906553163d2c8c3f2cde5ae096fa4e396c2d215fc496d29d30957497f2317ed9b40d186c9d419824af0727fa8b7219fdddf4d3411f47fdf5b16f6ef49f58d55c6af8e3b75ffa15441babed8e47309d9305888bd220ef7f9077d3e600428f21a5316fafefd43c3d27d001e675ef8862d6fa75296bcf9ab51d5e28a0cccf6383c6c6e540bcf869726a688b1679e10e60d2182c3fd21a77ad4c9ff4039334dcef4912dba8735b22298c818b77e962ec6975c6375f70883730f3ae6abf8a57392361c29ec451e54c9a0b2bcc7634a4a277bc70e50f0edab91c55e1346c0dde86a28d4597fefe22928d23f5b983f907a4b8d5eb2e3abfcfb6c8c4e462870e24301f55ed23135cd29f79541fca60d8886ddd91f9a484f90a3189067434d570d8a18d0505722a11cfbd78f1612d16ec42b6ad05c55340da9556277f6e62613cf0682e7d25bf9188af37081b3e50c5b8f6f0debd9135932764f44e68824d2ecc9941dc9efc3df6e2bea1300c3ebd6eea16638ffe9dd4307f4483aa6f440ee2fb0fff5739ce331f86212a968b102ca19532ee00264589707554d24062770b6f55a24ca9d97c5dc142804eebf72cb06d4a2ebca15218899ae911ece7b21803565c4d9c8bf7c792b1c86c05d09ff4a4a53502c6caf6d201522a2b14479abd235b95f5a48f34481324520d0499acb8d7630e13ed393e0a082e15b381d535266d755bb1f36709e11b7bc9113238eedfac112feccb1b124c1a0bfb986b5ec1df1cdec3467c6d36b389141cc4b4e7de2c95b91206b6fa56e6c3d5eb46ea1377782f1971717c366d9a336f206089eda64af486c48e20ef7c39b04a9671116b8dd12891eb9642556e35d016589efa36ab4e65434e253b1590809145c26d4f3126a1bb491e4034be9a2c1d4b8422e0c76280917504b748e266e26e66284357adb16e72e6c2543254d645173ceb3af230044fd2fdb2be9ad9dc56f60f0322932b7cab869110515e57f8d1f364f97a3a1df70eb9e02caaa3059512a8078da7582579a7930a2843aa2b0f4e4ec253110470d2dfe5cb12b0f30395d7fa67949888fcad3815c1e158f91e112bf617b165c9715ea0bea09dd7122352e892ea2c1ab71bbca3027e5504060b3660b46439330f0f0f0f0f0f0f0f8f314942fbc42d4899a4ccae780659ca4c292599924cc5c4edb20edc8b909d119fce4c7c3a33f10501d70a380b8f0a8c14f35ffd08d983083157b47a3aa5d423b52cc4a4158dc62a954f65b1a2b16c49a98e68216636ada239a5b9b52fc4a8a26f9117fde25ee7d7492a5a9341c8eb2c2974c451d19fea8d994a9fe7683ac729fa9364cad33a584cd10793a7d9ba2f443121257094a2d91271193dec58c8195234d2b2bba6d89f775fc3318ae632b54798ab1ca2e8b7e2e53f968e5c1dbcc1118a2625139f2726332c7940d187204d53d03ef294fa893ecf98d24a22ea31b227faca2ce51abc3c5e839d6844c38794c2bb4a7e8b83138d4c0f2228576f137d25d92e4288753834d178ab6cc6cfbf8c3f13fc57c91c7935167060a2f3d714be45236f0e618e4bf41b44456a77b5a859b244b3a99378d21827e712aa44236a3a5f7d2c88b82b259a103427a94a133af78563128d8b103bff93327abb65010e49b42149fa8a8ed6ba39b4800438227144d9142afa25897240a251c1532fcbe6eea50b34021e411718b8117461e3be0b6383e3111c8e60bd745e8be59bda42ad0a472392831124e05844a3fcbf426f926f295c4574f13a6a8a66e1532725a2dfccec93644a7220a237ef6ad322f276d6f021dae093fb73fce849a92345e030441f598209d10b675953882e7305f15a3aca76ac8c081c84685de299c8260da2159d95a6dd313b6117446322e692b47892829802d19bec0866a67f3963d291130207201addec9fe449b314747bc7f187462d5b4ff2d8b992c51c7ee843afc4bba7143970f4a1dfd3d27eb984578a48d3c0c18736284d4944d65f1fc9eea1f78a5bad3172d86acb2438f4d05c09ed271b612f38f2d06789fe2e191ae1c0432be17de4b28513c17187ce3386d5f81c2504871dfa3f5d318d19a54db81c75e8b56784c89453c27a4887c69390c1dcf3278f1372cca153cfa462c724377ff81039f4e9a527e98e881d38e2d056e61391720cc1378570c0a14ba9b924c83849f8cef1864ec927592ab5c8a4fce2b9e8c2a8009900d92084c30d5d7638e9251ea4ce65b650a3c1d1067f24a7544f3125896ea1d6020e36b4494de75f6a390be158439f4f0819e73d5fb36fb6505343fb51ad628a9bd7d5f22dd4f2031c69e8522cbdbcded72ba6e540437be2f26413e3f32638ced0e7142d4b493e99632ac97398a1b1f0b794c36716111c656872a969acdc9e83ac97070e32f4573af937708ca151ca2c74caee6be0104397948610cb3aa82a5911121c61685efff3b964cfc8a2a58007684c80030cfdc7af143f687c830b2f15a000c717bcd0cbc811b153501abd3296054717fa6c7acd53ccc8fc5cb650a3a1b0e0e0c2271b2d26d9402a403638b6d0b768cca7f2b382430bfdcff78ae74b3947b24c81230b55a95bcef13f163af11153a87291ab1f8602c715baf41c72fcb32aa5cd47a8017ae0b0422372984f984d264c8baad0cf8ace532a4f85e682dcd7d1a69942a772d613b9d219951829f4994d87d39ee528b41bb2beb8cf899c440b8546c51839b75805a5553ea19913277ae47a4e6893cabb3aa644389ad086f8729592a560e2241c4ce8b3930e95b3e924b5328e2574197276c38506fffc001c4ae84b89c629fffcb6fc93d0767b2c61dafd44bd4742a7bc3c9ee5d918938a5b3063060de303c711bad21c1733e7d808cdef49f052d244074d119a89964987b79012524b84b6b743cc224b66b576089de5ebee6bb6ef97288466de930af158f5f792efc011842e49b518177b5692ca01a18b9d8294517233fc44387ed0be7a8c560b9b93930a870f5a1d4d51917bdbc23f3d68b3acc5939ea492fab24103b9800b13a0630e1e74221f1f3ba3a972eca091a292c5cdfd8d9b646e02870efa8c296e65c6f60ff2dc02470e5a0d6e2acd62501d53e5c041274ef5a26a980fc182100b1c3768334bbc2c6d6a4ae6880dbaa4997de9be9f635e5ae0a881214be4757f9072d0a0fd14f495c8b3c298451354fc3ac6d80b295660c8a2dd10a6fa6e152f7f60c4a29528dae1311318b0e8936a4cdea49167e2984c80f18a4e7b3be5bcada32d27686880e18a3e261dfdfe0b956d0d462b3afd2b6bee712b030c56f429f173bec82a5df1b38a3645cf1939e9fcc57755d144d13cf92c99240d2aa50b3052d1e5ff1c594d55888fa96a01062a5a9dff149d92084966fc146d87e56626dd710186293a9d74624c788f2d49578ae6a275eccc180283149d7b47f2526241c49c1c459ff4a98c31c6674e5768c010451b3692e6e9183a336842d14cfc9c4274fec69c1518a0e84bc5e83d51c3fbe4824f80f1894e894de2f3918206d53dd1ece41893c8fe79af044627fa98e1ada3440e21aa47a3880c6070c22434639021e886792f52408c083036d1ba78b6182db17182f66168a2cbdd27b7945251b73418996862f42e251e83ae4ad241366cd43815d062015a943fc0c044afbd92bd84660d7fc126c0b844a7c23a5ebe24153391126058a27fbde89e2178cc13bd12cd28e15bdab48241892e2ea3484f534ea25359b5ac4db6e709db146048a2d79875ad3cb699fc104e028c48f4d9a489b87f5532e25d24c080443341ae5f5e5455caff11cde9079544122e27d483e188e6fd83ce22a4360a188d68e3e69821f5357810111e6030a209ca4ce6ebaf4180b188267ec90979654cd201188a683b54f485384a441bee59dbab62340621a2b3e0573a572c9535e810fdc5a05573c57039830cd155dcbc90532d447b216acedc2bb2728710bd25cbddd09d611e1f442f595bd67a43458e11449f4418ad27f42419e140b49e66f2324f40343234a6a4f0a5e3967f68749e4859b3f443af723232470f2953d9872ec824a36d6a4986910fcd75873c735a44266f0fad48cf498e7adccf123df49d4b76cc260b2642f2d029bd553adb273c34b2319a72f269cfb174872ec9b8b9c428d9a1d914ba4cd63cc5af43331a3f968a2dc93c4487c64da5dee0ea162e3487b645e4f25d3573e8e5d09568f89afa716882509a67638fe792c3a16d9d93922ffe864ee650f22d4becdfddd08508d918544d98dad0692dd1dea9393f61363441268f9167b237b4064dab245fd2514393ca3be575d2d0550e1ff162661775d1d02695a4e41c646758a3a5d0a749896098a1bfd28e6439289d35896094a1491dfea71d93280b22186468fb74a6656c12ef0fc118437f1ab183279dfbe24330c4d097e787c80eaf973204230ccdc68b4af23cb173856080a19710b3e48f3927991482f1857e649f5885242f74da9b444e122e3dfb2e74ad31a6c95536ff870b8d57680e9db42d74d273d894dbc2fe470b5de66c268457c59cf12c34f244a490920c163acf9774c7a8b942232b8518239b8bff56e8847ecd1a77ae42a72ca63032bf5468ce5487f4acad9d5551bc048c2974ea33739173d53d2a85fe339b4e525946ac1985f385cc4aaa978701853e97a88888a99874ee613ca1d1a4f3891f21dfa5b29806184ee83292d6a484f80acf35a1f71847e5a304613a4ce8573eeb5998f7cb9225341277d3e299ce652aa135912765c8ae9b92d0a4a87e7da552e3558f8446a5ece8d73ee13f47e8d537454e5e32c279a2fc53d27e119a9cb44e8436a8a859a9639365cd109a1d0f1a926cc62e59089d88216772c8244b8583d0c9201b1ae20919740c843657588d31c1c4a99861fca0330b2e2aa852a9211f74319e2166b810dbdd1e349b41b2e859d22985078d8e961b972ca9c8eda0d314f2e57bcc60aad441a7a2f23d29b1b99e1cb43a1bcd37c583833e441eed90d4b9417b398bdcff581f9d6483369ca448217905793e8c1ab4262c79aace3817e477000c1a342beb9621ec678d8f0360167df6d1e369dd3959fe0040169ddefd501ada62e63d165df8072df194679306168d9c5ade9591417f7e45a7fa1753533637775dd1bf68c5ab9456498b025afb09d32621451bde3293f8ac3a106314bd69488cd518e6e348146d86af9f90d93cf37e28da0ae37ef263653c088afee7f74db8040d2a399fe84dfae49da4fd2af89e6847e7dfddee37193bef443b7bfa1da3674e34d6a5ddd14fde44274d44ef27cbd9174db4fef29d93ea33d14f121322f989897e35690e498e97e827454929f3b796689487389b93aa9568a478274b9a7d738a2a259af15e27d1e80e23eb164b844eaa24da902764ce195358fd22d19ae6e7c43831c223098946e5e4a4b5b3fc049d47742a1f5b934bf0a41a47f49683997bca85d8b8119d6e131e613506955c46f4b1bee1347606d7b42ca2b1ca93d5948ce7c628a24b0fd94d44a3746c92b15d4444a3937e4cffa49fa28587e83be5893815e179644374792282687caf10fd76c6cc8e1de27972846884bef4dc991d44bfa93b6cf611427552104d70d14148c89674ca9140b491dbc3347c5c05150144a337c77275ec943ff4875e466bcc24c3a5e7df0f8dbc5c31f16296f2a60f5dc735655d412795b3c687469bb8876acf1492b53df4f143baa9c8eba19113b2a4542aa5889b872e79598829393c349f1725e910b9436fe26da52478c8a155daa19120e29c3e65964c8aead0755a4b904d21c6b0704103dd30460736829c498ae61dda194273c510316c17630e6d9011849e5429250bdaef2201378821873e87cc8990e4a4b896cd20461cfa9c3ae715a51ac4850d0d600c3810e2e64f393cd7458c37347943fc36abec9244c5865a20861b0e2d9f3aa518332c82186de84ff20915c2cf6496ee202fbee8828b0ac460c3a3c4476356d31ddd426d0dedeef855d03e7ba144b688a106940a22a696f3aec84e8c34b46a7d313a57100dfd9bf42ad31cb4208871863ee48b6147fb67c8e8ca0cbd5a126a72266acb46cbd0a5885c31c49c820e8841862e2d07694a54b80805628ca179b9ecf5127d8d2e0a046288a17dc93e5b395bf2592a0c7d902044cc24ac433efe31c0d007398f1674d42b75d3460d2ef00bfdc79c772eac660b3562d780185ee8fa749f2691cb7343880b1b1a4001c4e8423fa3bb31cc58ecd4202e346afd418af08c62f92e6ca4e006b241a38b44e3045f9815d0403752f0058d1a37ee1410630b4d96510df9f3b788cba18007688c208616fa922a5a31448f16d940df05b291c68b0cdce0420148ba305e7cf18018593846072b5de183486b58200616fa3599296c882c317c17e30a8a06955622e794df3841035cd08215ac2086153a21b20835511f49aa71a30b082ce06254a1eba025c34e90416a08a2421b2b787ca5d44fa10f29eec90f0f17e774a4d06528d38ded399b4d8f42134b9f66e5a0317ee550e8c4faeec91cb34a04f113da284aa6dcf59dd0784513b16f12f2e59ad086c61c5bf534c88d24139ae01aa31a4c281d8396d0fe69487942648d41a88426e44c42bca850e9b19284dee2a8d44134c8982712ba369152ced15b820ac12374b221426e76a91056ab184668ab3d06c993724568cb629293fb27421776ab947bf76b8887d029518d5319e3a62344086d49f889ddd13c8c2808bde65569b41015fc03842e6be81c4c89680af9079ddc710f2942add3f441db7a252ac60af244aa0610a3079d882da1b1cbe34513f2a0edc9ef97aabf183bb0190688a1038d9183d554453f5326e33c5ba8650c1cf4feba99a45888c4fc8521c60dba6832a55f83023366701121860d488c1a341aba54f89fe4166a0b405cd8d0401a62d0a0d99867b62fa714ccea98451b2956260bf1c5bbd2218bdc94d412934d5db425166ad0994b34853072621250000310173634b0c6b0e8ddbbba639fe7158d909d3764f93615f4ee8a2e36c6131a5fb6a28997fa2bd6d52f5f58d148d3b369c1eb58456bde164faee7e8997b55f46e4af27f692715ad7ca538d597f9a5cd53012aba10c453b0d2b6d84d323b08749ca2cd089b622d85e0a0c3144d124153c91e6525944e29fa985825fde43f3dee2045a327b4c38e06b10d3a46d1f98b0acf51914f26a9289a7909aa438c7952c643d188afa4626913174d8a1da0d8c36aa8f490f94f74319783c5e50c891f4f7491e365267ea9136d9c581df9cd5392b30e4e34416999a6ce29945bbc893e4365d589b2492f474df459829e1441980c5ab44c347a9358d11443ea56eb071d98e843c6ce4168d6583997a8e3125dcf5be68bf58fd1d394438725da20db651a29ab6548ed529082eba8449f62ff23ac29bd51e4450a68201570810eb27129a044575a7525450e1b2ba21d93e82c48d9caba1b49f4273537fbe5488f5871249acf97a36737c4cd6fe3d001897e5492450eb11b3a1ed19599523abf520ab27bef7044db65ea1e317eccbc25ed68449ffc94f94b081b3a18d16c5ece5e8e29d39845f469c1c2ae78bbe8ca1ca243115d1c8bc163a665a71827a2d19c7d534c2265a9753a10d1e59b85324d210143c72122d061883ec9b5a073bbbce46649143a0a61e7106d9d644692b5c0045e78613a08d1fe6891f1a94fd931883eaba7ec86ee82e8939c6e89a8f1927f0c3b02d1875a9c98a93d790801a28b2062cb857d4f79fc3fb4792dbb55d0ae2972f5431f563aa8591c9dbfec431f7cbb5c6265f9d0c844ed24de67e753b787265bb82c2d26f47a04e9a10fd99c4f4c2e954be279686367520bb264f0d0a90a417eae083a40c71dba70bda43a9c858a6dedd04597d51033af25a4a50efdeb075dd34187247d3af425a6cc7362d6e0fa1c7affd1d10b1a4264433934a64a4711b25172cc89439bc1d363356270e85f763e8e10157a2fd5f1864e871141cb8ee61456baa1d1397fe562e5dc54ec68031b1adda362580d9dcd202a4fe85843f3f139f563d051d7b380dd17c646d0a186563efcbd7fd64a6ffe06173d63c68c19643bd2d0e718f13321c28bb8301a9a20c4448596ceb79271c7199ad911ddb31e53ccd70c6d0ae2a374ce499e9b0f868e32b479469fa718e3e4530e197ad13f79f295d0142c1d43a3f7cabd7464f48f498718ba9470959c424718ba9ec961a3e99042c694143ac0d089247394b518d92139022e48806c9869a10107b4a0e30b9d0c5756b139fec538bd68c18d2e52400399c08b1370f1058d1174c185175e1813d8402aa8d1458d2e68786156f0057678218f20b63c365c1cd1d185664b5c366dc1ad246c3ab8d0c74d42886c3104cd0a756ca155df92f1902a62a1430bed093d5d592d47cb58b2d008fda65d93e83ab0d05b98dd111d254232a18e2b34b1a375a5e78bd1b3cd408715faa02ca514420c8b89b18e2a347fa69f2a7598091d54202be8984263d591426695cc7645081d52c0435cc4c8fbf259ee414714dad4e2c157dd82c61734be0bf48591187440a12d93aa273231469505293034bee0a2e3095dd0b9e6922ce5996990ec704263d6f92a9cf5b0e86842273a8c441da9593f7430a113b27294a45f39d5d21b44c7127acb89339ad9bb6daa2dd46c6800101d4ae8772c4c2e4d8b3cd5b051e3c617dc450dfd8e24f4e9a2c9e2bfb540e84042df23a762c41823a658b458c011facd5fe17c949bf6d53a8cd0a589dcf1355258e769015a68b1002d3420012dbca308bd26d31de4c4707153244213ab640a7ff24397e8d7d03184368e4c122f58940b1d42e882d2297b47d2a729fd2b7404a10308ed558eeb1d7d3455c4b650536202736a4820037b35f68b8e1f7491936e93f99292e5a7f541339b61729299f79c320b9831830a1d3d68dd4336ca6e47fe4f9a3103bbd0c1833668a4244fe8d2ca1f7aa1630755161d74c8411d90636cfcce49938830d13842838e1cac1f2ee67d5d6d025a2c6003df450a6a28e0ce051d3868b3d2b38ab21ed74ed12474dca090f924cf76c44e8db71774d8a0cd4f9e4c4b5b6cc970143a6a40d00eb92c26295b4b8a943dc6905237cc84f073b12233e8a0412745e45bd0a099e2e592058e5974b234c4caa4332e2ac7218b2ec83c3992ec921bc172ba48818d1b348e30073862d1853ea967d963e68f1f166da5a47fd37f2b9bc6385ed101c46e8f070d3a4b1992e7e4a5452d67166d8b0a72723283eae091c5e96dfd3185d763d16fee6a8a95a6ab840c2cdacb722574894a4a7ccc2b5af9cf49269932c94cec8a26c9aca4613777ec0db7a293d6f159f4e57b8999156d9c31512d1f82759057d16e859cff7f5bcc3456451b23aa5290f225a3bea9e893ee98f466d00961b3a868cf82d86b114ba2c73d45af9ae2e1724842b2aaa6685284abccd9bb84ce6529ba4e52438a4ed34cbe7b4cb6c89551b49f4488d6de29e73389a2330f3997ff75ce178ade7d2b4591abd9a90445739ae468e506571ff1135d8acdcc3ca2f3442bfb2932998874a2d9f01f84080be1447fc1c3e25f75ce21b24db41ea3c3449a50e23fa689e65487afd63113ed78fa5f509d12c26598e844b4825ce81c31a74b74adafeda63c4fff966852cc9c8e3aca43c59b830054a2cda2474fbae63031534a74a9744637a8088d9f9b4417cdf22789fe620e5571a5e20044a2092a75b3800bb8308139818d1a14b0800500124d1e1143e4ff1fd15634b1a794521df4e78e6847db3c26a50e91b86944e76625fe620c233a0bc2472b77e96c3ab38826a5fc3fd934e6ae2715d1869cdd42eef6979613d17cffe95ca5f7a35588883e255319cd43087a21db001ca2d11cfa5407693244d7b9fff2f59bfe8ff942b49fa4863ed1c92c5a9c105dd06d72d6972cbbc90ca21d55c99242b482e83ce58a1b9f4074417549f41ce2f1530a882657cc5dc9cb4de6947fe8a35ee4edadd8ea6205c00f6d59c9346199f1ff7f1f9a7829678911bd840ee2436322fb547f6ff6d0eccc5e92244449efb81e5abf8cfc9672cf43a39410b5704289d8d9f1d0a8d88e1e4cb8c68f9b3bf4a2a22f2d0551412e6387e683ce8ddff46871db3a34592e2f63f8920efd6952193931a358509943bf495f62e9a7c8a10badce6d7ac3bc9318874ef9761ced51e7330c87f65255c87b26bb4b86bca18fd139b45c3b557ea649010fd0f000b881a083bb6802d08646071de244137fe13fce862e84a6184dfd644100d6d008d3d0d42372ce9d2235b49735e8114146e306a5a177d1190b7f19b3f2188200a0a1dd2043e88eed0d594a67683b37e9987354fb84c90ced96f20e7f9a452796cad0e5f90ac2aa82c8d02691ad2a9cba84b01943eb1f52b7787ee8a962e8ccf562e7ff9c688887a171131535a517181abd9f2d97e1fd421b52e8a4bfbf173a31b24f73501e23cb5de8f4877d89f1e3429be474731ed32b7d0bad6cd0fd884999a7546aa1b91c334b7ebf64a10d39061d4659b0d0c95c7afe543b4e3ecb15dad00defd2a61fdb3d2bf4992a8278ce27e4e4ae0a5d5b58afd896a3ab42a890124aa8c814daa857497e6e8ce7500aed7ed248397f4c149a3072c48589dcd0cfa0d05c1217f5741e0c017842a39ea3e9f4d0412fc59dd009193f527cbe099d12c94c5d4b57489909fd571ea1d9922e59262f21f398a39e4fe738a120004ae83556640e32f248086f12daed6c5224f426e3e88eba1da1cffa1e2dc94d12b4458cd0e495ef5c77ab08ed04b5321da1a4490c2601024084bee24a1042456f8c091a427fa1f32d73318c752f8446279d5fd24c74f4f6416842f6ceffa5b273df0384b69490393f68fbe4ff8b754cb654f141a756d95269baf7bc3d68c4ca3d66df2ae909f2a0f5a8955993bf3b68247e5221c82473ca4bd1600f0440076db8780d1dd3279afc396877467be69494f3c7240e1a11b2ef05f3cb5fba41632159a788de6d200036685d4e8f0c1743f2f65f83b6e43c4c4fb00240834e5f47164d25747bce2cdab8529d2723358698caa2112682a934af64c4a2dfa4d42568e865c0a2f7f18b173a4119aff882c8a932c2f2292f7507325c613364b4a2f5189344cd17835c32586133742063155d0991d5caa7a63fcbaa0a9b910ae473251321a8d813c838850c5370fd29c5f45fc4543a8e404629fa3dad61a5bb9a31a3c828649082a08c51304a958e9ed172438628faea0fe5c99484284a2914fd8f129f33276512b3078a6637a9363d49aac42022e313edba8cc6909783695001323cd16588698d9f5349d2934ef42147881617d65ae37500199c6883289daae2dd2cb4895e4563d03849a892d4cad0449f9364052dc1cd44a7faa2548ca5e23c2531d1e79398f36e129d5d2c529071892e94760fb11da29a8b2cd167913aaeb14792d0984a7496654d5baeb41845fa04199468553f2451e155e73c49c6241a8b116dfa3789fcfcd338c88b2fc6204312fd96529d475f946f0d8a0433c2c257fbc79de41669e386173220d18ef4df30d9938fe83b8c7b0e56169ff2666e60e091c970442752577f84526a441373bc2cc133f2793e31a25321355b92d80bdea74574b2536911b3a8a6e349117de57cbf20533e659a94883eaebb44b312a9274e88e833c42d25e53d442349a595774992f21aa237efd5d3d1839752a64274217cfc50a2d2455e12211aa9d1df73e56cfd4a1a44133bef9f88a144142d1244e3166793d0e49eaba240f429650e1fcd67b78200d195c9d09d2a5d537cfe0f6de924a621f27297f87e6844b69652aaad71beef4373f23de69df9b890c48776ddb2969bf016a5b3873e08d5aea6924c6a8d1e1a8f99cd52489c13f2c943276764bcac664b423c7868633bf2e7abce1dfaadb0b174e5e7d98f1ddaeddcaa55d92f72f73a34f2e1528edce9d07fc795bf5e9de8253387369be6302375238736678b72264c45d7b089439bb182ccdda7f2879ee1d0bbc53391c286ded0f96565a8889df31676437b96b2e3be48b77c711b3acdd29b82f7e80d77d9d05e4b52423ee7ec11b38636cb7366cfb363b86a6833c790f59269519ed43434eaa6d71f328b9215454317444b4511c9516350cfe0a538bebafe31431f4353e991fa5d7a53862e271573b97c7ef44c863648acb220971c432b1ea2c9af4b317441868958527cad426168936e6a469fbc39ca60e832d4533fc79cd6b57ca16f2b15641ed3a1bc2c5e684ef3cba41c74c4e574a1f3523e29a6a44c79b9d07a2e55219c6bf08d6ea1b59077de3f84064bb1def1fc51f62fcc42974336dfb2de1cd53c2c342f292ca894cdb2abbb422b627734864cacd0fce989de5e323a4248153abda4c4442f19151ae1e6f12b47f4dd189b421b7325fd4dcdcdf19a14bab01a4ef495a2d04eaa60165b82e51c824257de91b2898ea944ff845e736a5bc8a613ba14544a1e63a926f4a77b79b437c2847edf63f4489a25f422ab272571ed318594d0770e4dd57c2ddd949791842ee81262345fb2b8a0c94082cd9071044b66e6ba4c2b7779a72537e5252c54d09b475d54c006ba01011946e84d7a773cd19b17f25484265772cb58d94484b63c3ec7ca7f51bc8286d0c58a2653e6e664f55e08fd85e738def359c9fb20b4114cbe67111d20b422dfcd4235339eee3f685743d85811333ee8c4c5ea13cf29c4bdb807bd9b871445fcd483cb83b6f449f9287262e2da1db42743b4c8313ae8a389d2b144a43272d0256f9390e443ee0fab0c1c745d22a8a5387a535954c60dba3439b94cff4cd4a494618346e95805c99e27722665d4a03f91536ff85f1166491934684d45a69894a423c665165d9414e6c265c7af1665d196f0bd9c3386b16893fb25fd39b6839560d1672b19b2349384bcde2bfa0bfd1bafccf7fb3c57b41b52aa9cdd57ab625ad167b4f4183ec6108498b0a24bd9ddb2cebbe61425ab68e7f4948a6bd0a07354d1ffe8a886144b4527e227469054d53a1a2a50594fa768640a4a08d3cc8d41a668fbb5279812c9644a4bd15a85375f70f1aba9e872e8fe92b2afa545360c8d47b2810f547c9cc26654e0c31436a314eda40e9a7f42102a6c5f981a295a1397e9b3117e135460c60c54c18c1946c350058465f1310aae82c7aa7c8dc7257c88a253a9bb2fc5207b9a310bf808456b61b4e366724fee21c6870f50f423c35384c8793fcfb23c7c7ca2f37c32d752598720623cd18c7ef7d4966d3d65ede1a3138db24c394a588ea5c1e7441fe2df573f76e6e0211f9be88390394263e79a68ad5c3e3493b6a718fbc8449f47291582d2fa97952a3dc20752c6e5e487571e29e1e312cd490ca933a9acb80cda405c9c59e0c3128dc65875e987b897afc439e5cc8ef59883c407253a1329fe58c8d6ea3b4fa295cddfe5f351464f761bf12189fef4c9e69c6aded7868d1a348c0de3452165f88844bbb31ebe2366ff6233351e0924d4f24c26f5c230f878441bf3f87b4c0be141366ad0b851a3860dfec287235a39bdbc3366229468d4f86b4413b78488a4cf67534b5f703102634457492bf3b454ced1750bb545f4a32a7a2c378bb14365111f8a68c36e0a3f49cb7cc59c88de5254f8b8fc1161d494d1fcb9d18f43f4a1c945cf07a59bc96388be7733563215f25188462f5e4485f4dcf8204493f5b53285b2247b928368f4c8f0123f59d4eb101b5bdc282788b6543849390925f11188ae2cb353237ce8cb1840743a7f9fd211b1cc111f7f68552e5c5b7835114da285061c40860f3f7442a8aeb89684e94b99213efa50a9595f3e9d59447cf0a1d9dc416c0842c9f812df433316af59434eedcb29c4871e7a0ff9f9286ad2a0a129f8c843e327848f251d96b9ac2f3ef0d028b1b8dd2174548a31093eeed059e9aa12b952c65225517cd8a117594954b85baaee9dc69fa0868d0674c1450318141f75684fa8e8999ededb2dda071dbab07192c62caf272d9f43bf9194cb09319b5d3372e8f4668a62399cdc0a390e7de69c1343deeace1de1d0a82a4b164344ded0c628a133e49651d1bba1fff512a9d42b2e78a80d6dfef4b0d9a3cf867e62969964534f32cf357431377cf2fea47c62a886f6258f48b122b545917ca4819054d0e1323baff8404333d27c541042452b7a1f67e8e4e9249eba295b280d14a02f886d023eccd095e549d194ac2d7c94a1919a4a45d18ea3f041864edb63c68f65321b949cf03186de4d66ad36a96b3a571f62e8ba53e9e64e4e930b73612ca0888f30f4124e84c66eac887a880f30607d7ca133ef73b324c25ee8458e6cc938fae842af25246913fb3d49c735111f5c68769452ed183b1724ffb1854e881c726f14911e34e6430b6dea1c540cbfa5b4c9fc47169afdf93f096349625c3fb0d0ce494a2268c81b0dfbb842db41b29a6b8aa4d5d2c387159a58953b4be4a435e8977cf8a842a3628a6cc1e573e5873fa8d0a98e3933e2b807c9291f5368aedda4566a5031841429b4dec13bc99072767cf811854e87387a92525fbe7c3ea0d0891c52b499186d619a8f27f41f3794f6efb0134fe5c3094d503a5a4a56f227bcc11f4d68837e1125773d86be7851434df0c184d65323afcabce5359d47376cd4281f4b687fcf623fbf77d264fa50429354e7f309b21d7a32aa858f24f4794b67ee12393ca412099dfc98a2beea294d910b1f47e86312793c53d21783788cd0c453315897b61f45e8b4770cfd8ce59aa2e483089dafaca61ce6fa1842934aa5e095ff7d08a119cf21b4629548a2c72dd45a80ce56f01184aeac336653493c9361207cfca059dfcb3985f07bd92a1f3e683fbb95d0d6a0123e7ad026995ac2e8a9dca66256f8e0413fdb1e4da28a9b28918f1db47a2966db75f53aa73e74d0c4f0bfab32a63f96f391833647517e2ab98b4660e350f08183467b5f5e7b5e3e6ed0ee883d7d115d4c495b804a50e3b1c6870d3addc9d7796619b30699c0bfe0c2046ebee08201c40c1f356884ec8a96533037f95172850f1ab441c7f39c621df164840a1eb368546cf1d8303aa2cc45165d8a8ceef175f488451b5736c48aeb15f27c0f58b4b9e33485dc1d337a660a1eafe87a444a1e235664f4de53f085122d34e00008c4c0c3158d05e14148aed8b3242ec131363450430313f068459739c2c9ce938498ace8f433683f0d19cd25c21bb78a362e64c26c9e184687e8a18a7e5358cf8cd09027a93778a4a2d7f55c6da94a5b87b43c50d156c89ceca0292157a8789ca21921b144c38798f0155374bd1bfac34af6e4ef4ad1784ea1df5bd1b2b8e6418a369bc57eab782afcaaa3e83fddf4cacfb6e54e8aa25322a648ee7c09451bce73eed121e9ecc1f200451bcf7470f9b8179295fc058f4f3449e719c931db21abec8926c4157d27da4e42098bb371c94d3f4e349e3d1a77b5bc33896f136d8c5b1673e45e8c61849a684c08a553ea6c3a622b5ba8b5c0c60d33b5cd4417d3ff3c01ba010163c346021260021398136460c68cd3820726da24443cab7947cc3cf1b8c4175fbcc0c3129dee8a074ba5ad93ea49013c2ad1f98628398f22f46f06081e94388f4934418cc8716a311a908016926874343dffdf3af488441f6337a3e824c52a5520d1e698887539d55934d885118f47f4b11e43661125f170441be3e91f279edb7cdd420d4d0b0d38400be2d188de22a5a0829ccb83114d121f446cf03725522d34e0002d3c16d1bbae67ca99740ca1816ea4c0901b5f0f45b4d982c8b62083580eba47221ab3d81583ba75bc8e37ba8000229a1054c94f396448cf9cc721fa2d93be1e460f4334214e8c14d6743c0ad1c4fd28395f5e66ae2c091e84e8a3682dbf5c0f92ab1a44934a8b4821a9283ac14310fde9b0bc2eab8a989a40f411773333bbbc2b7800a2b5ea10a9c2c9260f138f3ff417fd5aa405d5ba27b72178f8a1cf1f7a49741c1115e53eb4a34b4dc7d8cb830fcde8121b759492b124b8875e4ce7acf4f0a93a82f4d0997f571c9dab7c27de068f3cf4f12f7321c572c8d1e3a151e2bd4f92dccb41546af0b843bbde7a31c888650b310f3b34af29866fcdd5d117e251877b3ba81897ed84071dd4ec187954d6f06a0e4c502a3e6438913c8c481c3ce4508ea3c9b315072455b2a0944a1a3e2170488c10167aaeaf7d2b5bc6e0f18634879ad088397707c986c1c30de5539dee7b1de27b8df068039f5ab2ef0911bc3378b0c17e9f5df594121e6b20096149ae83fc450d9c864db22f04e5a1346ce26445b28ce79c3b7cbaa8d185a1e1b6d81cb9ee225c743d84c7198a78b9112c3465531e35c31fc5f572c9ea892796e1f0b927a2e9a0aa27433a25a1931a43795ec7e3c4f5ce3a3a4125c2430c98feef8aad34f122203cc290eaa096295c317880a178a931db3748b7d08b253cbe50c89510496abda61f273cbc502879319a29d1a754068f2e1897bf23a720a76744447870e11c4b7f25ddd94d786ce1129293d0e0a23475888716ccbfda2682ae485a1a97f0c88256f92946fc0adb3904070f2ca0da4dbeb9cbe6b0160b40273019983103121e5738fc9e0c32a322838715ca3ccf92495585ca523d5ca681060f2a202ec976140dcaf5ac84c714164f1274470ae7eb5130ecaa05218256b040c128a7154e9a9e0ca7113c9e70691f2d39756898283c9c80c8b3a629869b409ef95391425091094f8e9429358acc124e5152688d89516396e0a1049306f98ba3c93c7824e1491d41339784e0818463cc2456902f0bc152f9a898db4a6368887dd181c711ba2cf9ac547c7c26cdb9808711da0d310999498589200b108d1a37681c598147119a4b9dacb3494a2106dd83086ddcdc1b21e5e4d6da09ca093c86d05cfc7f5c8b39e93caa2f900a0c32019b8d139ce010e021842e27ed329d7313fa241e4168749e6769a920ba3af30042a743458bf4b936f9952dd490081e3fe8cd54f9ff785411ba0fbad6aaac494f452bb5076d94a04bccec8b96c983469be766c7df3c229576d096fc2443a5b21cacd341ef39b96628f14f328272d0abe9fca4df73cc31f6386862576ef9a0757216dda04d195376ccf8c58bdba0ed9493f809f978d4a00bda17945bcc038e2aa854f1241251281288c3c16014430164b66e01e31308001038200cc6a2b1609ae7daf80114000450281a423230161e281a14161a168d84a1502018120602e14028200a8443e18020cdf32ded014d4c28059208bdc5c19429d50a97effe23cd1f04452d2b7f00b7bacefb753b8d80ed8d0fb0a9989d231eeee4a6f7fde7ae7356f756c930ce4781763302e899078290fc0a09e95d4e4afe8d709cfd74bf2ed1c03ee68192544be6c069321038992262250eaab6a277a832184e2e722b4c29f6156a900af1a300ea6ec684c61418215ff072e4789b55b5d5425bdde6e6e931a3403627772f54d3bb85489b219b345b9e1efe0b7e62abcf296b7a255a639e859bd2a836e1cd01c03fa7a565293011111c00a8d2783b19a8f926b3681ac14111a128c2357bfe8683bc872384e930231d8ac6e66e31b61642688b30cbf1b934446d753f9fe4a44ec493097b319395c9b8061dc7d81664ec43c3bea25708fdd88a60d1dec6983190491164a9b5b8bbb039638e5959eaca0455269d4f8cf22846650909464763b1b600f84f1b8258d0bba67c76a81452c3a68ec52f738cf7a8b3949fc21dd178c4572b4da66655b19d22a9ba14e4959331178033c8aa1a48247177e0b7b2f38a22ccc8e7be638fe6a399696f91b2a0731f96bc89728b29596b02acf72a47417a2bc15ce9aac71437024497d48a05f4148eeae528310c72c02877dd0f7cb4aeca46d461545316288674baa63c5a962d682c4cae92a26eb3a833ebaee7c72d75bfc7a0459dd03fe6ff8add3ab57e49b17be0dd6da507d48071051ecace84da3ae0b8536cee00d18c69a30f659aebcbd9ee4a77fcf9034ec9b503dec624cfea604754d5d7eec11e73834c1c1078a44176f1940971114abfeb9329bc5dac7cb17ddac1406b51324b4a7660ac9a81147b7261e20a7fa901d89b0ce485d5931a305bf79d88a5ec40274e08ebb083571f3650607edf48f80b9c947315c094a0eaf1321240c00c9d77474c37417c95dfbec3d8b1d5b021248ccca78f19a67f49b23e8386d65f75d8defb314d510b1f4cfb461e97215a2323c5519123bfce2bf6bf2a10eb18229955c8f9c859ef95604d883404d111374e52b237be4d97243454aaec6a27eeb7ca3a7997eeffab2c07923b030c0e8780fb8bb6c831f2d01b3b0c8575569e60c953947dc39aab81ef28c39ffaccdcc9f6d3da6854c11a7c985225a3347145c6c57616c23b0b178640563fa55c7a210d62d3a1a5c71b667739a182dc25570191190b46b74462f87ad84a62e64708fef97e3530961dcd0325548a2c15dbd6de778faea87fe487db7ac331ee56e48d95e12aa0da2476b160b0087f42fd12678a57bbea824f8ff02d73890858640015b32fa83a806b080453947a023e0b1c3e6102c6e5bfb7833e4631429f30fc31f2c2949c378295d68bbafa35f343b79fdbd49598a79b2b63ed0687499a9c4f6f98b112721243ed249ec6e3cdb0359a7808c7e046bff4c0380520e4b9d15be945f71abf02b7b766868dc336341bcd987fb153c3f340fe6935ba0ce709837a00d15cff0785c0e97c0c64a601024595a4f0c3b056e8839e2198efadcc8af6075ad55d53a8035ff6958407cc20c67d21a3f8b947223d2a51077b7da99d19a0150ccbd96656f2481b0260db42fa7e506a3c4cd8dccc8084fb7d80b0b58880a33c41477af664281da5318538a8760058d322ca2aa7727f90c27d201d7d9d602169e64b8d0b689e448c8ade63293dfec39b5a640e0db52e76b72c3bb24ba3499d96d7e155e11244ffabf41a92de23553b51b37d01ee7921d72a91c044aee5438207adb60fc9260b475155773e976900d2224c497223a572dc621a65a6311b2e26ab4bb3d150bc285a6d26e268670c3a4a24dc08687262bd08db41034af769e66ae79510373cd17b7885ec7cdeea31d1e2369741c8f7827175decd368ddf05c1987167d96bcd2d73611585421be7a01e8bde8b398e578d30d1d5f4ae0e49fb1dc1008c554daf87efbafb897a32f2e8e5853a205d45923b62e65c4c1456b5ea73bfdacbe39f45625375578774902c71443f53e4f84a6cd1ee2a9bc601cfd2c8ffef63527b60253ab0a6d06da6ca70c1547ed91e4cbe171ddd0cd54f6200456943398a889161fc15ca010d3eb3227181403f6535c9c073345967492c2a98b47fa76b846b1e81f763bd614035f8629b414469484c84e7a0cc9f7bb349df14b88b5480eda425626a89358e7957d22d2b22d7b0a417d9b223cf07e253ae272bc60e047528781cfe68d2590aa7da8171e175023c4a8cbdf65d8e884399480ce9b3b3083cfb5d5666691b55f446b01b56cf4302d001a8c5e853909231a5e54bf762041e4e0fea498741c2f93130d2293704ce636d11c860b31b3bea9684774a4a5671243590c6c939e15c7ace2cac7a5c51a6c02c35b598bc6819856aeaa97aa4d9231185dbbe38d2deac25633ecc18a655ac15274a67ced2064eeccd0544c1bba7ead86312589541223107c3e99d2dce30fc6b9498bc26fb49786640c90b70a4c7344a5c9292bd3bc26956918a5f72d4cd86a282d6e1449cecf5dec49922d5b9a3db5d26c1d5a658dc65c0557bf583e9da67f63966b226006e16a8a5ec2da3cff31cd1f7490af92a71aa41b0d79e8830134ea167d80ff42b41bf8df502d41cf411b46fb1dc15d7ed30f00922ad75e1d19459ddb6ac098d9f67e9c45f7469b6c5ae80218c37818a23a1cf1f598cd5c0dca5245723f2d139cefc3a291f3d05db9bdb1dbe38b291bd4e824829225b820536442c328f072f8aaabf19d2e19416c536c9a5421593c336dec00b7e5e923aea1855fbc17bbc64d1fd8647b0c2009fa0a85e9b46fd5af78093cf886908788ba225eec5bb5c45368165882c1a82abb94744a67d2af8b61259c310ba3969b27e0a00e8e7822cac3a4db19a5a84877cffe613bb549d46ba7c8579b3d66534d5ea60e2c9a7719201b860e9e352fb53bd88ef399f5ac2986d8cb79d8af08120eebf99cded9a2be0e49d59df2f02917da4644981f86af84bfe02ea293da2e8996bd7c0a0b2cb9e867e6307f47bfdf9318cde8302e8160df78367b20a32131b37094ad43da354b5c2dca86fa9b7fd51c1e616f97dd86d731968ecb5a30e904fe7947fe6eb5ff9d940eba70de61c529c9ae0942286512aa97d679ac6b640880a205ec633cf7296c61028f36c103e8ada2c518b9d2a0b8d6e25fa3ee824bd1894e6696760048d6c1893e1020808b682eed6c01b4865a948d4bdb976c5b31b84c33a41fb453fb8b02e8c05b0604730473e72b292051fc251c1f4b30171a53880089efd4243d7c006c0974b42263d6ffeb88976691617ba169b7f9ecf6b717c1bf58a81c08100904321950f7211239b3e8a3b712be9faa8c6e3874f1b011bf94f269135df43806b965185ac21dd1f1a48ec763a0d7a6634e82e59231dfe440daec826a0f70574accf01caeeabc30dc74973a7d2e0d923fe8b5fe7d57c9c44ac7c4620a201ee1659a169a8ad0b0cb6052ccddc60aa9f7d677f0f2c729b960935791eec22aee741d8960099ff5880a4ff304f2b1e95912140a8d9aacc7a255cd02f662f7c08c976700cce44aa027fe5dc42f0708c73930b93563e8f699e56cfbcd2e38d2d8b4870058fe49ec59cd3a88246b27b272e18ed17b01262ec99f9bbb828baa1140f38790c663f904f2036601a0a28c41bb5273f70b2ae81c29a52ef7523b9139427201505ab893af07c01f627327dbb2b11e3b52af9218b227ef80b3fcb4340e1057e779b9d34d27c5554374cb3729bbd051eb445978043f157e76412cb192b54654e8708f8e837d6ff6f332bc62ef83df63489d89144995e4c6d3b43c91422e2bb6a2224075910f7805d4303a7f55fa98196f4fd6ca2550cc6b06cec1dd241fa47321ff161bb42bd0a89fe708986cc0e084276fec543617c9545927c539ecd2c012e31f63c360d644aa5ea2c50fe723e01863fbfc04b205593c800f77ba7e59b7081c08b87caf55191d010cc4272db1583b57ffc34f088d4ba677cd4d92284498967a18ed3efcc03817626cbbcc75129812be18782c005de39df04c23f5cf9d938109498d1b76df16451024efbd3dbf6666495fd20b1eb36f62ef8c13aec207009c2166db63611e29fcde02214ecfdd6b115ea68cadcb85c9ebd0258e8693cd3783a519579349a00acd880a307d00c7fc2789d3d94b12f4726978411ac1612a10b9a5d1c3ccb07fe9902ab7e6cdff6f953865cf777f589b9141305c2d75cce2d7b2efd88e36dbbe2303216d0a2eaebd6b01943d4e82b05a05f00f71b0a0be33874e06d2c071e5faa78525f8e9162cab89d4d3f68a6129ac0078757eef3820d8c0dc585c0828a9cdf6c8a7595e837190d12c3dd52d797eb0260758d7155f6cd5e2a26ece366139f277a315ce956a6fbc91341e3ee0ae822311e1b17efa3d1191d9d4b57d59587dfd0822342fa4640fa20b9eae77445ad54e048ce06197ff154c8ca1caa8e6749770ba2ab211ae5795e37796fd3f544cf942bdf236fe9f436adc56950145b736cf44a00a000a03e0980d10757216055d8ac92b2f9956a3cc9077f5db1e61dfb6dec39c7d368b5f199d45602fde49873b7759af28e020684679a79c077457d2816cc4d792e3f35573263bbc35d78ea1d338749420eb1651d10156ad2de63184f905e7a05cc396fefa74d7f619462ef33fabc1f734f4d3dd7154d3057ffee5289f68a981b1bb44922f1301e708b730c1734918c0fe8e7d9831e8c5df3adf416119e5066a73ef05d0c122dac8ce8a67bc41d2aea61bb3f848cda0ab2fe75a1d0cd7d9bcb3c16979fac4bdc5f7e287778fb101c3a6808274adb9303813bba0fe7517d2810a84710c1909a20bc1524dd2b3ca2cb53efb242dd5981d8247ff31ca17a92640f911a776c17071328ff985909c1a886726413bd707883516fd3da0301647d04c4322f37e4508e09ca4716519eeb057548abc2878873105600eb6ee28f75e02049ba41688e80155c182f137453f459e2a89ea0a53557958a015c8efeba9c49f257d85d6a3ef270763c758af7c014791dee7d428ff77e77f2c6668a8199715fdeef3006dd285c794f33849a95d3f8fb559e6f37f3b423db5d60b50a00225c5e5478b204b905f73ceb07e615b98b96e3ae05c96f5ceb25daf0175313478eb2927a3cd969d36a38037d9805b4bc9b64e9ad420a51186fc7626a00591ac81c9912713fd6c099b067617f60884e99cf1a61c6fd8ea1f814a4d58f07f1ff54627c15a874c1e858ed5734429232ac41bab9b364ec6b48433082d8e15806712c61bb3897843d5d07e81a23be4d056093d972298d115909b3f0f057a005f4a7a01ebe045e82419ef3697d691d46a540ba9cfa0995729ac82b585019a02eeba4f27cec0c171d2d145f6c01acc21fd4322887e844f428740374327a16ba057d1efd0dbd878e3a694e970981e725a9ef57c920c5546d60fba37acd2923d41f50decf29a372734ac4e1d493826e12d740c343a7117a82c6c2e3e1878ad4a947aa50b20c0eb5d72c8cd90d617c4be44f8c66e3c585dcf5b1c62bb43c651f65abcecee5ad23141ed4208f6a73c23a7665518831d6e814865c8872e9055dd0ee8fb0f5c79c489434c7c7c34b20ca6484d4b335111da8517a4393dc0b10b8f9a77d2050bec687efd477b073f138957178de8d430dad758fcf3bcfa3d73e4cb360ae10287d4439bd13c4ad3e376f746f587e9d20d096076709fc89f68808bba849931c8847151c6729c79a65191d89cc41d4e63e16493685122ea219cc6bd94300e476e00f13bd4807c0b9403c60fbc1092b34832033e903e073195c060fd08c0f027214e013610fa02f40038d2407a4de61cc89342b2ea36226c163905cb0cb95c1e9a8552d368475d840cc89f1cbbb65d897ea9a89b0fb559e9d266be3e38e6edf95a1cad00b7ddca4d9dcdd26ebe466987e00755ed90dcee7b80e47bfee6646552581396d66e740c35824b1195372c2f11c9e03d69133411b1574661b875b3aca99cd8c994d31aebf6fe6024527042eb1f1d2465c36c46033ce9bb11ebc08c20f494c19d70dec6cce1864ad82536583f17b331b639e3796704245e7c263e30b0289e44172685f5b8b6881d66a7f9598421a16e74c70c206c21bd2d660ca1c81d04bbf64b73609c79c0a011e22b4871515744ec2fba6634703bc38030095711a7e5e13cf163d32c947c052b41220c7bc3a86d470af1b12a8b3b1b3c3e73bd12f3b354529c4075e0f8756bc6b1c266fa36eec03f437f62d87a141d0a1618f7c108423cb2dff619418a28c5282c1ebf2e1b38293b3d2519cf4ba94f6c720096b8c4fd5bb54c4af95d59107c439510e5414500334de00c805e72f25b322ee758c2037afcb80f55133156c3d00ed941ce144ebc4cd80f21307424ba07090d60f0891f31cfa7a2386ad0acf6b2f0ca1b577b55cb85c58fb10b1821a767433c2ca0d3bdfa6b39b1a89774eb4fbb23215c383e8d604acb487f9357ecc429a13c697b14e648f18f22294f567c1ecc6072429d1d06fbbb8bf3f21da1407e4b4c9bf88d661b05f81cace3a10e451f436bb3a856e4e3957efbb077645556c99c19ab6e14fa4d991a3ec4f68113130d22b2f1bcbdc3a893b307b407a30845206dd9a3c2599e9d845f72df3ff8453284028450a54703e6d240f1060f55856680fde378132c9b59e19d45cd306a4e1dfd76efeb44302fb564563c2fe6ceb08bdc14ea306df4fdc11e6d6b05b8d12e47040d20f1081b586fda350ee2944b740e79e4fa9945136e9c6124e9293e29429bce803e84ce58a49fd02f5dd4574b980797c6c3403cbed40b263f5addb5a139d59d6fe024bfaf0c8ab6c751e22504a32b0d520639c170bac3b5b37b01547f7813cf7601bafd2d6d2a129f538fd6a24307889ed0e46f3dea9ed83e5800d929f9c12997d02cbc110fa67d868e8d4cbe951768f9657ac892550ef3d7378247bfbbc47de60f38690b06846d33eb4084ad2e3e24de81de96df24d059ee96df21ef8fd36bc215c35b8d51b52bfc78ecadadef68501ca3ebd054f8b6e209d9722f63d5ac9b36eab9e4e4fceec3b058186a29ad78577b9b7a4efbbe144f0486f8bb784ef911135f1664328b6e1f4040fb8c7dd676fbe53a4cb0f0ffe1fb187d8c068de197ddb840c0c7f046f4fe474dbcec323a527bcbe856c5f5fff8487a3798ffab2fe8853afa3b734bf47cac52d95f5b0c0e158000f1dad3dfadfc3c38ab63a01b9faf635640266b67cfc4b98c6a6383fbc43feaf75d15b06898896dd0718d2484559c244b32e9f2b59ed5b21f3fc6f1855886f8d4dbcf9c420753fe5b66206860d35f8d15023872831b730ca5ebd980dc69bcb4d62b26739d4ce98d3d7dc8e87e6337e3a9fd1cd1da2a1a4a1bab39f0998e0779f9ffe9aa87bf949b6045017ad655bd24e6843dbb7b6a79b52dd38020a39199e07587927f39300a5736e3d151c77945eacbfd42ee56f8e227f0932261c23d180124d29635a3f7e1664612910b836d3628a48e7f61916aac9ec39b56a1bdc25f55e7ac1a259a104b140063e508423a5bc64d13b17994464196a5f65933e599f8febcca45470569f1f857a34a672ced48851c61b2be3884626939f0c7feb66f6d642da3bccfde069d142b860be49d5ac34b4bdc6a11b13dc75cfd2ef4d1f5851ef0b2dd860eee674f528650b2ded76e3576d36213da756f6c6731fd8f5d310a650f7e4cf4bd897b63cc98271a235374c92e58e7e723069c89194cbe2c15332d0c5cc9cb6018374c5144f04ae7f30c998a6a70876bca7f6578e72611e286b34d8452c2533d0fd9f0198eff3f84ba8dcb54ec5186da290bb63a4fbbb0f38e1ee13fae7b34766a8f5675cdc18a18e650506281deb70a9e401424ccb6c657d64ba3bfb2b476aa25eea7426768d16b70652b4e268e8d08d072d794d8cc73da45d9827e2a68dc33e6efb7cbbe3059a2fa750c16dff88ba259eca90fa023750826712d01aeae1ac07780daf02664db79e3113b4602982a9a266bb973645af40a658455ba4416e96cab75e8e81369062e1a457e37cfbb6c340c4234c16d5fca57e31d8b8db1b1eff5d866545deea1ffc43336ed01f0491a081076f33f993709b961a7b69525ad1483217aae28d8b8648592ad15a9cb48d597f8341a1630c16af1f1f6c8dd227eacefb4bedcba58cd31672594e4ce7c1cb99d261ebc26d0f1ba9492797a46c418366a98bdd7cd69c7cb6a2ddf176b44c08c466e2ecf9508ace6efbf1c4156e68a26135e2b0c0c8247a49c7d9524535eeeb45319d93c9a1296607471600d9c5bf010ff1fd20cd8bf97079e944b2111022237c545c4ecbe34720dd27a38d9041f7c002c5dc317d3882cd5f507600cabc6999cdccd5390f8da68e42a4472cbec64439325ddafbc521e67f50812818880ee3d3c7b87f5ba9503223058c801488117887bd78f4f12f37116534413b241fc4019feab572b4bef6c8e0339866e220d48b2ad5b1d9348c232c1df8452772263ce043f1a31fb0a65e73a845e625e4e8324d5eba0fe56c9fcd07b17c0c1c65d44a1789ffb83087e52f82ab2e010801f4da8df7d725610bc21edf2072b59786c27e1f223c7e93fe4623f9e25ff3805c315a66f663bfef04b62a62c3422c5d30be0a2ae3bfa1f2b574db0bc5af809ecfbaf545bca074025a7df05b7835c77d7b5c8ad80043c89506491a10f4a5ef21992e6b2da97be36705c30e39fc5c01b305e298803c684445fd01588867e0c5f77a41539b5189e4e3faf8a8cccf50424eb4dd63922a8d6adbdbf8ed0f5f2609a92edaf772aff922108bd470b3f104a9c318d2fd1a206b9414c02c14bbd028dd8786844e4c38de398181de1649a7002196d63109c7b216275a913d123f6c5c1497d50fceec07db5d9ac3dbad5ab93967270588d67088203f604dd417a05a0812307168a9cfa0e89ba21ce49f41a48e8e2203d0c6490b5a9a97a4011e3603e30ad4d9dbfb2a2f9b4b83213e060102e215486383ab32f21d1e4640c6550c88881bfb008ecd2f4cfe04e17aa58c4719f80d5a519b45e24f08d15be8a0a7259ce5964edcb3f2b167b1053b4fcdaa682f9004dd2d1e59850c4d2eed4044de36c984080aaa87ca33ae729321f244d94b6841084b0b74cbe69438a050fdd711f43ed8524516c8481cc9838e1e41a33ee74c4efb888345872804c54f7ecc45a3b719cf289920b758126a4573b435570d049823ac429c00a2358ca2193a4a2a3bf276b06832bb7a40a85115c5ace2c1bdfb18fb45bf1c948b365fd6a547461c3c56fa871aa93d669fb51b271bb8bfee97cbfa5f0f81c3334120db24c8b716cda8c24b3616fff79f24429de5651a6aa9734a40077db8b106529de7a9b573e1c81c67da8c5452a402f02c976705345e1a929d684b9384e992c3876d0dd54f917256ee6b87f3b254537c903cae341e800db55831122a19872b2bb4d308245be8bd2141aeb7f3b97b49ef90987c6cfa07f8f0073ec9bf0b10d1212f47eb64deef0a245ab31c523e3cc8b2b110bcc97e9a8444ec9355582efc2375890e9be81045309ce44ae542925fb3a1ba397d864b1d09e45eb85074c74bf47a034c1077249ee811e611684e046474d899949446f622d875680a39043624724514b2e7c20a8ffe061d285c44e21324de580185d00b24dbe26dc0057b53317e6824dbb516d9a6d954012b451be060a24262eaf4a2418eae39b30edb82b1ecacc6a69bf54ddfa80168c394f29293881a25111d232ef2fb92d1cf9bbd8c7533486b711ce4a47056052183473d7a556b1283c7e465a46466b969546b6c88f8fb4095fe8d08676429e1c460cc8e4aae7a8526b4750b5f7a3c5b6c797c08fc76240241ec97a9dcfda1c567d2fae486097343ae0811084b03f67d4917fec99635565607248be373932ec09915ce3a4d870831ed2c59b530b0d05b46e91cd20322c50fe9f2f7ff99e16c1a8ea63f1b6e135f74763d348456ce68373af0794c75c2e580674b9be55c56529b3e587148b57312346f8316078773f91c7d0db01e1ac6e04e7cb2bc6878a58759c1fc9763142a5f5116fb42556fe89702f8a39fb4c68708c4991731b560acdea7b0d1632ccefc78c0119ac295b0234ee37bd1c07a9d966ef9c07283f386a1fa452e570132d84060ca38ca077e9af325aa6adfa1470049df2c6275a4ede753b32243f931a0b537d7ed11bd9149f27049c1a1e6cd6c55d8839da9de6799314b78479988d9aff3fb803ec87a6354c73f44c8f8fb760887fd4dce6b55aae20d466761230205edd3f4af0ae687e1de5cb1952d2905ae556c69bc5335881df67245c853bfe03bb1ec287e17854f2fa3a0f348e2e93ced8c3742352dcdba42d035b77a1dffa984c1bcfe57a56a8beb05344bda1664b17af205004672a00f3587f8ceb46241998098abdec53112db581f9752041ce10a29ed60fcf6a023a64b6eaa534a894c01f0c3e0d2e624de11a847b5b88624535bebbcdafc583f53a086a6030f4acb292908075079564dbe1bf7ae36935f062d2703381aa8b42e526b61c8d665d15a394f3373e460c8efb3e12641ad22258a88648679232741ae7d52e3682ed1adbe47e2a83910625957a49397297aa6d8a4f4d84cb097e27dba1bd3302745a765d937a4da111b729516d7089f5650f20a43a0d0f4de0d8a64e811ef5df72f158ff25c79358bbb1f99b6b00b2d876a8e21285dfaa232ce4515de0db49ec83d0282e224f830850a61f64644b69e833f4de51bde2742fa168ee37acf62cc3ab0285d3fe45ec0cd30b75b820fd2ea51fbb3db17b766f574b4e5c1e82ecedc7eb87c9c592368043e1e582916c9177ad37b806ca20ac36143526b888a9753889327a62384f9dad3628a4f27bacd3268917b5642229d462a05cc1c254ed71c2a83caa9063882d8428e6a6ea929a6ff07d07b372f00c9e63079ff1211218d537896948c08b04c070d81fc4a3b20f1b66ab9e800eaa1fb36e7123a38b50d2ed68e61e42c9df70cf61f5b1a28c6522c40e5f6a0cd3364d2b50dffb721dca0590fa13e57c5420532b2a6230e810d58be0e740324fb3938ca981e7dfd7b08f2fd169056853e1c8473a001e8ee79b3a988467d9eaf470f30ee073d6cbe78c648b15b832072d1d86e3d1b8e4b7793f651f68b579d262d86c94a69ef40036f452d6d4c6e1be66acef5fa5d4a7027a353d5eadaea9ceeda0dac2e091533284d71ce09dc4bb582259a3c39aeb0539c1fff5e114daed2e7ef0344a0d36f2d56ef4a09d3de3ca2ac850d0f46eab747daf772dbbd278fd266ef2cf948b1f8e2481344beb07d08dbd764df52c55f758f4f55f46aa30aa8b3d33efb75eb9d920cc10eda40110e26682fb9a9a1365ebd141f735ea688a5da50a5c61afd22eb4077c34bc7d0905d5117d608c8720c5369f5267d6dc0bee2fcae1b2d8f675a871835e6108edcee7a1dd8640b23d68d12814cd5141313638ce1400f6f28803e21b221d1f94fa0db278d8d3c2b04da8418c9ed3e129cc2a8b564b71c0326ef0e4098162d1f4e4545252aa9545c2a787a8112d17b9724875574a43dae6910d84ac07d2ca945c63179bab7f3003f14dff149d7336d054bb816fcb5b983592d14b6e05ceeb05a7f06a9ff963d8ce93174be7509bffce571838e429410637bb20a7385022f8cd4e281c8eb2d29ef9265c0d31c9ad74af3bb55cd898a9e071475704c0822dfdca383588ddc62c83ef2001b66b9be8928d0b278d33f9172d764652a7cb3f8034ae10709f04eaadda8ac239ea4292190c7a81bc01b70a98c0b29a6d2ca08e072d4fddaadbf2e274866077c42beafc77b95aa781d295d5ce126499f1a715bb3cdcc8f1fee9c7dcc5f79d26ae43d386dcc818a8909f334030799302a1656c44994042a4ef18b682c73f73a7764817af24891aa2fb2303cff148ba447e6ae57008984089470463b3a0c383b4e73a9e055141b1e95eb6a67c918062a851cfe2d1d954a56bfcf45263283062623974b41b9f8c17607e03accae7c2d4331316268ef094963f4c7ecd7d81f7a18ecdb3047b274acf88decc0c05dc02025dc089993aba36689b636483cc2075c915e9333923ca9ce17d3e78b8bc21fd8bcaf81ca033b52c602887154149ae650b98d3e298bdee8b656c0b2094f9bbd2d482a9154140a6cbb58afd3827d43a69762adbcaf792761981f938e59a44878b06fb42996b15e6b1a05d8a221a07860c29ee50c2ca225b525d08d1b9c915f0c4ad6030e0614bcb2030e982f2ef37fab8fda2577ec0480c5de7c85d36e0a66aee7c13559f6309ef05900450b6cbccc1307c80ee10a416bba058e7e96a5023f7e3043279eb4845dc07d1a5e74006c670d017840fbe2d6783631cafe190f258b4469e47db0310794d58ce22c97217ee0bb8a6a137f8d4ae847d028ae3ea38c7c674f5ee77e3693e988c717a9bb792aab668651e54cce75dfa7e551b480b8884c8a1b243264be9c6382acf8e6be702f7e74253c13af4a139dfdd5d6e0836c3ac273b3d56ed040927c68ac04c76f3a92a61791b27bdc23407a314e425305c5f44803f822d2b23dcffd77008198cbae71d86b5dd2224cf86c834d164bc13a9df48687020cc192188d205fe2054a2bf3f015e52d230a30365f0270d6b412ade95e4f90035993ca0403854fe95da9038a3dea7cdb7174d45fffcee568cee5140d48fd445045b86cf44cee28a82135f424a192f2270214aa50ae3e9544f16c367e24a4bb8ff2f7a080b03c544370861f8bd341613ffba13ca77ac4ba070648dd880e2d0cc76a01d6b507638c38dd534cd8e91fdcf651bfa3be684f24c42bdad2b96e01ea3c60af29221dd80cbf60047cdbcf774cd997929e6221bc9016740d9415cea7328c5043074ad77d57034bf3b6e40393bde00299948d2adcd0f5806376c5fb183a4f6fc2df600b51b483c9cb6cb5aea7730781531efc0b52d39fee679d09fb31b2602516b2d4ef05ac53def9be53b892744430ac14d8f83799e2c6879482c0d561143d7e264405c16737b367afca3cec61e65fc81a8318a3ad3646250bbce25d219728629a9b7174533f021baefbadfb7b0cf35e6de9c043ef655289a140fa607834c43bbf23a080014cd4ac2662b801ea814053e679d24a54f9aa6bfbdcf1c98638fe2da9483fe8388e024ff563752d0abd2cd43c6a9b51b64a0b7bae4da95ae2667eb0b5449ca4a34113e87a84397dbb306b0971405c0a0e83b47cab9ccd80a81e534c03bd323db32385b23556142aa1eddf361a0c29fcc6cb3c2adc73470a3e8d9b36455c684061d12318ea7b557348136e9a1e6353664605e034d7a8d158a86327ec07c85e57c25225997f2b7546a9c4228a73163e2d237f40b5a81b46b29aca51a633a6346be0a29b32f5474ad6d1a8370a51e8e60f7d80019461c906feb045802ba06ac6e5b2c0b2d2ce94edeab65db484d783a00166e3e393f2671b5080926f42e3f2c2a60812d30f88e1001e40e89c3b0a4b6b83ffc75c3e6d93b0d692b89e911eda09045d72688f01b8f549c421727d4a4fee547b03a98cd4a7919cf2459d5d22834428570b99b919e655daff69e79ad6eee5cb7d1c140baeafc5e4fd40d573c04c6cd60cb7220c7e1d7060763168bc1c94da67411cbe3c271b1f87f0dbd9fedea1dcafd3af6d1768dcad4ebfffefc83ee9bec6dc9becc77ea48bf5ae4bde1b9cb4a049472962de2da468db7fa96cc401456b8036d4310f4f26bf060d7f958ffdeb968edbf16008e0c0c31504bd557466d8cb4a3d721658b7496c3494527194e509c35b4652c3b2940f4f35fe4c9ba48100ecbd3ae0e81e1b384c736c7392b8a6c5c0cb23d9974a50d6d5ed82b32f9a73b67bd05044619003faba31e5390d05d1059ea20910ed37ee405e279554a3f9b285e5cca3416ccce812f458d84656d8dddb0eebf0042131ed58e3f330c4a11bf42512919b5412a0e65168721aa701b68c535a3ca5a307134228ea2656faef3bc5b6448f94f127133c8cd59d8740bba45f8dc568064d1a7b3bd59a189edbc99c6a861d275b13fc796f2a04bd3db424f01a34306811e0542346ab30ec23543d481394205871eb0990b7822706fbe70e363cf121a620ca00f9f06e1801c30ac9fd43633b06fa537d856d092e4072874941c820e787157dd47473233824706ad74c61c903aae5207ef915fcbfb8cc42eca37f18ab46208d3107671056229b50c072ae16dc483641cd83c67243d4cc34ea35434960ac115c08214df86f14751f2b48766c8270316f494c812eac402f45cfe2e0b819176c603f74ed60ce94e582c0077956c72e6b6de865f9c1dd1d11aeb338fc7184f19310e37055eb56619ae9655a06be2c53f93a9858871387b31e3268693088fd901684c005fb64593eff8aab07b89d9585ab72c21c11c086d35b77a19a59ab571438182c14e40c4a0e906d8accd1964b496306f26fd8a30aa33d4ea1b691b6688737c0024598069460c81f57079d7e77d3aff22d182ac4dbde706dc2574d10d2b2f164cec19281bab9630632a335508150b075be20c41a5e185e02cb1c335023044c029ee184e00b2f80b4940ef030c30c33cc30c30c33ccc06cb7579495128451152e0312015352a6dd125c245754fd27a154ff49281425f00b950bc20b34ee7c61913589cafb7731f7c27a31ccc1a6d88565a44e32e45c58ee5374a764681d735b582fcfae84445d0c4f0b6bef25fb8839437a9785a5ea53c8e83e641a87856557a2575843c63132526e9c636685b5fe3253a82c69945561ab8cd820ef4e6359a8b0c747e3b029ac1a2a657c5629e4ae4861e9e839e6a8f19ba3b0ddc73cace90a01a0b087a8e7a7127d4d2785004f584472689ade0c31430a019cb08898245d8fdbd1914280262c9d53ce251117212185004c58c2b233786cd0e82285004bd863d2bc29f24a58721e480c2149fc38095ba3ffcd2712d6fec760f3378e907d35bc98792a46584eb6cebc3243d4a914614fdda1d13344d8d4c7fad7eaa19743d8fb5264f28b091f85b05ab41875c3444993206c35bf11723b26b1a80061ed9bcb3e499d92ffc18e3a998afd379cb80fd624c95175be49b17bb0a54721797aee28270ff628996156fd0ef6b9b49a8ed7c1162d432635cbd09c1cecf72027bdbd9c1fe260bf18ab4ff3da87ee066bce5849890e016c60680aab71bcd762d5b4996366171ac769b1af75cc1b34e420293e8bed628afa84ef9c435c164b0ce1f5f3f058ec19a49fa49d69d786c516aa327a101b0db27ec566f951ce9b3a58feaed8b6bce681a54f9a5bb18a6518374164cb32acd8e6427752e3556cd760f2814555b148d294d365998acd1afc5e4e65323ea26253f3b5e8f9d13f8da7d8d3c678f7bd8f52064db16679e5b0f152ec0d2d37aa7f756e48b1f7ee8794b4e162f046b1a3c929a530d9daa828160939458a8f9042ca42b1f8d759aa7a460f03c5da20a5507339d2fd8945bb437268103723c513eb754a9fa5fd08e14eec30f6b266423da4e2c43e950ef4b33e34bf89ade185d43f67febb26d6e935136ba86ac8f01a9858aeb222ce7e89c55104d18a2db10499587ff93f460b914aacf1cc1a672a9f129bc487aa506a12f9492cd270c3aa28893dcba4e73abf3e8cc4d6319286f790d82fe4896097aa62fd2316499ffb1be638627f14bdb39e22ae7a1ab19edc4fccf9a39b1e462cba1226690699c65fc4965639428a22168978f4dd592b7d22b6b30a0da253a483882588ce349075349f436c1f72b206315c8edb104b4e6b9091e6ad8585d84263a88ba39d738a13624b195dc71cd383d852ba0679b720f64eda37957655431d88f557463353aed4a401c45ab9e5a75ec99265feb0c599258fbe212eef8735e5904fdd93cec3dc873d478b631e974358980f7b48c9df9df3b318ddc36a36dd208aa3fba8ea61fd34b98ad166cecfc35ae9ee573b63321d0f9bd704d5bdee90e33becc82f439cb4633da61d969ecf78c3f7442e598755e5632d787f2615e9b0e69fc78b328df18673d8fff6827cf88fc92387a57245eb60bb32f1386c579ef13ef9850fc361f910f37dfadeb09a8feae7a98e879c1b7614e33a1e8fb561b1f58ad9a4b161cf1cc3fa3a7c246159c336913244e96ccaa5a861d5307b0f1c250d6b9ca87955e3374d081af6f4b0ecd279e6869f61877d294d7327b39819f6924ab95f9f2eabcab06588b1953ea6f893618f667fb9e518c3f1ee16c37ae23075e7af8b7f18d6d03531a71a0c6b6ad8d48d527d613f9bf1ad3069df5179618dc9ee269c84c61855177618152665c79daba8b8b0c40e12bb31b88525358c4c9afedcdc6b619f1c73ee45f67ef65958c26c2cf53b1af6070b4bd49a448fd593972b6c1a6f2ef66185a5c74a3cdc36ce5761df8fc6f9b6f306091516f5245f69a229acaba97b12b614d690a931ec694631d75158ba92758c56e5183514b6fb90248314ead2cd4fd83ad766387a9fb5b213d695fc93379d4ddab8097b909c9212d5e3673013b670b8e1c42ae5145dc2be9f362773a4d45309ab4c88e88cd4242c0e5356d49d11f51409ebdc656810f6738ee9119664a271423ef5a0a91196cf60f22b2dc2f29fb6fea2335a4389b0a6e8f57be193c73c8425650ed14f2339e852085b4dec5c2995535e32086b5768e3918d2155202c13324c5c929ca1037fb06a7f486eb08fe4401f6ce171e7e7c369d07ab0c74f9a94373956c68325641c5a3f9dc1566e078b9fa49a902a22a64e07abd7e97dfc2d075b9dd5f7e66e9ad20680833d2c7ce876dc9861ca006eb0c9aa4ce4143a645819800dd6f239df894a2d165d8f8d6326b4583686ccc9633266b1c5fbb160510d592c9e43a50f31331e5d2316fb799a5cb4062c76589aca53f414a7d578c5963bf6178e57ff1cc3156b086962baffbe7cd168c50e2c6d8c9a9311e267c56ad213bf3b7cbeea57b1660c1723e29add7d54b18e45a42499f7613da9d81ff9fa7aa894b27250b18d68fda4cfbcdf38a7582c4b233490109677536cb33926ae3e8275bc144b5a7d06b939b6344e8afda3aac3eeb164e91ec53ad23026c57d28668b62a9e48f23444c89b909c592e591e976cb51cc80624f6311b52b74b0cc7c624f72f126f2cadcce9e5882d8cf568ec989dc891d389c0861232c82cc892d74ed6aae0a7f5d6e62c71191423fce983ea889352f87ef1c25754dccc48e92c58c3cc39ff59858533fd77adc28b6b9c49a3211f385c409de5962bbd3b4a039c6abc95562c997ce3b58d4f1c851623d0f4b1a376199ba496c31431c4958cfe44b629dd4ba4c4562fb7e743d69fa2787c422a13c74e6fc31a61fb146bd2c5feb384975c476396f98031bb15e0abb9bcd18b176bacd9b54cb3cb1456c8e2bda8a4711abd6d6df89c6675a12b1c7c7e12f45828865f5ccd4d18758266da428c9434ad0104b0841ab22a6a4b25521b68dab9ba2e6343b1521f60a1e257a4ed91007b16ec70e6fe829ef13c4b1d285ff4a20b614d7642c84cffd1880d8eb6a73f034918b3fac562973d6c43d188918e0c20f8b84db5331e910f7d387b52f7e08ab111927933db8e0c3a219544ad0f01135c65cec61471fa79ecf631e5d7c70a1871de8c7e025f7512d997f7091873572e65ffd44925013778187b5f45369af7d5cdc61b9897c141a3d044810002bb8b0c3be717ed36158f0dc74012eeab0c6895e556eae022ee8b084ff9fc6f8b0392c5f391f83f4d1b51d59960af80414702187e52eb482c7182a828b386cd3c8e36f44f7e4c75cc0619bb4493fe49cbc610719578a5be9dff80d372c7962c5a60ea3ba5eb7611d5dad7c9681aca40c1b96d988df39aec3f4399a12a02004ea031785740c3488cd986ad853f490f318ff7f3c4ac9818b342cd6b1236f326858268c7ac65831d2aaa736707186358711b9dc591391a10112b08027806986654b7e26c3ac2e6778199614e22ec5314a5d9923c3b2b1c6735dda8f929b8b31ac198544d565a5df3ce9e32980c0f11458406934c08518f68cabc369bedd45188802d2b800c3ea7132467135a6cea4b8f8c25e6be65931784a19243d602170e185f56f33928d24cd18f32eac1d255aaaadd9bd54920eb8e0c2aa0fc47365878cf7825bd8631c45de1472faa4980b2d6ce621c2aa2468dd45cd14e0220be4cca99286f419982420010b98043448c002264121010b9804a5062eb0a02eae80c4de8a1fc92f480a5080145c5881727c198564450609b0880b24900102d470838b2aa46b67b1117d16b8a0c21617f2511b1c835b0909501f708120b898c276397e672e7c296c19fd3932cb65e9d7f303175150248518b7c6c22e37257001853d7cf091903c3de1ecd3cd702f76c2d611677384ac09450c93ea1cc5c62c2270c1841dad2479e8977e3c1e2e96b0a79c3154b48d95b04acab8bf903e797a92b0fec5489f92679063a628c10512168777f1b71d4cfa4147d8634b2df5ac678455eb9257ea9c9f23f9e6a2084bca289b3ccfe6a14858c00226174458c3ad8784e93f84ad574f7eef2e6584bc10d6d31444522e0ac21e6b7a494d62fc6d18109691ab4e261d234770f183356236d776868f1e8710e2c2076b74908e51f8a85170d183bd26ff983a7868a13d0fb64719c32dcd0e96ac4e21c54cab32ce91004742c1850e96289d55d13ef85c485ce4403fcfc1244ee7689e708183356a8e6d90fc3925c79300c759810a42d00217a4e09ca0042d2072061737583b323a4d2ca433fa63706183d53f48c9cee65f4d0a5a5002a8c572d1761be5f0328d8a167b9f5ec8c818f7045343a00217cc6293f960255a8f52c89d8215a80064b184280db9f303ebda42a00217a4600523388cc516524c49f6c1a466947356f00280c5621dbf4f4ea39a7d4e0201bc620fc9b721018e12b86239aba84953f45535c909a0159ba7cc9b83940247810b8a0058b16378f1ff22af588ae5a1809238cad4997254ec3858665db20b299e62ab3cc7e1fc633a889b628f982cc4e6af7c0e2fc536c92e3dacc8733c2996dcef591fcf57fb28b69c4be5a79671cc45b184fc8612d2a1d8462aff6ede550941b1e4cce49dad3fb1c34e0de3133aa44a7b62c92921333adc893d2722e4e306ba29cc89d553561e2fbba8066f623991b44b3712724635b1e7ff358e13d2624433b175e694f61bf5a410c5c42665969116b17de625d6b98cd42497d51869893d644489c3989629566295f9b83719ee841129b196696c64df8d2c8793582d5de84f158ffb25b16546ce7c5717b647629b3ed97f1483c48eea2fc98a75d8658f58ad4a32dedf8c1e64a948ca30a79c2e8dd8614c1afb415fca97c2887d1ae6fd141ca54e9545ec1d19abe520e5bc13456cb5791b36ce29224312b15ee6df6e79a6e80822b6ff0c534638afa89143ec1f1e7e3436764a8821f6db7850f3407e2d5288fd63fa09dd4e41bb22c4f213ac4225bffcf031887562a7e5cf11e582c30862471fbda2e395c3354c20b634e1be37c5ccf3c900020f632924e490f9c39a4954c5ef320c32193f2c9e974f33eaf20a92e9c37a9126d433f80d15193eacb519cea2d457467d0f8b86f8a871a3d80d5d0f9b43c7c0e1fd597d9d87fd5277a42f1b0f3b48b9ae0c4fa25c7d871de8c544ed3471bb1d5607a142f80bfb7f9a3aac93e1a610267aecd3d0616b1c63648ea6984a338735d9c5a025a91c05590efb7648893f575e13c7619f7ab42395f3f446e1b0c5ba5cb3b5248fa26fd8337ae029d3acf9c70d6be50d8f3ddbb0a6cbc7f87250c975b2614996213af0b814d25cc31afde32447a31a96af304fdb99b9f397866d63d5e31083a6c40f0deb3fd89e1462ecc4cfb0979e86e7dbccb04fadcd496d9ca9ad0c46c889f969636458c33b226cd467e86c0cfbe40d1a272696268918b6f0e49f24ddc478240c7b8ab1be42a4e4d702c3be9ee773e3d7ebd51756297fb017f6cac9fc739a883938b80b7bc820327ac76b540de6c2521ba1c7dec29653ca9228a21a72b4b0af7c4e1b72cb73b2b0c4be502184df491a622c2cd7a0e1e752d194bfc27ac1d6cb22d3a3e05b61bd8c0fab18dd0e5661bbff99309afebf4285fd6364d3a138c8299fc23a3be161067ea91496463196a7f2e4688fc2728d337ca3f41002054239f4096be6ab8fdc8d13b69c62cab4fd2183946ec2127e928258cd843d8768214e928d8fb3842d75b4d0879f7186212579f8debb8c1a20093bcaed94b77398ccac06404212ad1ee585590d70842d8698c16495e6f5580d60842d34ecc7c44c4abdaa018ab023873134e5a4488eaa0188b0c5e73cf11f1fe65635c0108c88e13cc5a64258f5a224d9afb89dd220ecfb304cecbc68e549202cf62144c4e8ce9be70fc8d334e328f5c1ba39a5920c2c25d37ab067c74c6921a7c9c283d5f1578a118bd7a81d6c973b495fa54949a88325676d78e4b03a9c832dcab34266cf43fb70b05884d98db0016eb0f9ed59929463b20d60833d43680c571e634cd762d38994ae0e92ca365a6ce59579e26599876c16ebcaa6e4392d8ba56347326f701ba7120b4254585f7e082cb6890b3a9f24afd861e38c924c167a21ae587df36a4a6386dd542bf6524b29793566c619acd84ef4411ecd90f265ac62cb8892a531ca619e54156b8aba0d0d254dc5fa9dec33c61d31464851b18a5485b4611fa3fc2996865f9fb136c596418819220e6ce3538abd3603efa9f8197787147b4a8795cba8c46167145ccdc614c317c55227911c8552cb34144be48ee8f0bee35140a1e97c8ecce84face938c664ce78628f099330fed1f6d289553bc6ad1beb3c937262d308df08b12982a49b587208d1e8e2d4c49a8375f8ba485d6666625b75d8a3298989c51efd68a8d450c297d86ef5fb6c3b33382db17cee0fa9aa5436042bb1677aea483f25b69d1bbfd46f124b8c8f249608b183587d524b466295ce9a114df922e520b145c8a8543b95327dc41a21bf3ba9e57a9823d6b8fbf9444b571ba4116bd478e2386730624b79e3ab8d456cd5d1951eadc62f15b14de4470712652296cc172a55a5c1469488d8f14e0811f2432c0e7b67ce3ca59436c4a23a9b3af1d126b1105b0a676612cd43389e106b9e0693d2245fa906b137d0ccff1947108b6dc8d0f7e381d8bc37dcd56845e80d88bdcc32b4cfdf14eafec39ac14c7ed80f64663facfdd53d292d5a877dd8937d848fe9d3318e0f8b66a7682964f6b0a4e432558baccf8c1eb491cbe4614da1d632aec4491d0f5b4e8b14997285b9dc61cd2ba3214cd80efb8e66d8d761d3d068ef3287473d1db6aebd89701d9ed17358632c7d4621c6fe891c961da9e3b0448f3c9f3b16295238ec937faaf1966fd83cfb1ba8d7633049376ce61976694e1b36d1b08c2c579449b36189136262cccfcd415cc31aa25ff6afeeac04d5b0a38791cbf197862532564cca9d72900f0d4ec59d74ffd919969481afd984bc1033332cb142a70f21ef37cacab0c4b36a301b635856c8b0a694223e0a0bde371943718264dc618a6135fdf03c69ad1f858461898866a912d24c1c0c3b8ca222f131f95cbeb0c3f8c917292f0c63929f4f9d2e2c3dde17e5e3c2be3166f23fd354d916969c41260d39c646450b9b4ad09c9b9b668f2c6c1ef179f77258586a3f3ae3fb1443685c618b8f2e427c2b2c1599f32298c5b8abb087cc948bb5b4cd105261c9b974a4d164a783700acbe44717c57ff21a845258a3928f79a37cd4208cc2962726ff0e857d2648d0dc483ae34f58d55154e6749f24f74e58fdfca61fa627d99bb0e390c93871262c37292f65bc84ed7fc2f243543a54c2be8da18fa586d52409fb57cae89920610b3965f3dc5adec711965f89b90c1d236c6932fe8cbd1761cfd51f428e3b11969c435ce834f1d0f4216c237513736c3c945b087bea184b527ec8116382b06ca474c9bc338c9901829d91c5fc609dd018554829790a7db00713cf0cedf2f1b8077b69c5d97a1adb0bf340fb9061083f77b0448ad1a8526764a10ef6ccccdd73d11cecc1d2a74ebae260f59417fcd23d1af5069b68d97fe9868ab12c800db64a31595207d662138d8f1fad9ea58ed16235796821a76c16cb07d1dc9b7c37844c167b862aa5a9714c7d97582c8dec415a0e6b8c23b0a0e3c15ac6c82b9668de40f357f81042ce157bd2e825b7d5396675ad581a6e0e99a37de3781c2bf699d5f5cf8d55eca131fa4f7e5f5155ac3351638f65879ca662e94ea91e8d57be0d15fb68e5cb79256286d09d62eb8a9e4f1a434737c59aa193a33a8e61ea522c21a61aa768196b52ec17133fa5e419c59a329974c78862079b9529d453e77028b6d5c9b1dfb929920e8a25ba534e131f3d87fe893d48f4f0cfdc13ebd45a0a391d7d8a9d583c79d4cef913cee3c428ecd183bdf42636b9b8e239454d2c36d9bffbc9c4d6296d454729858bc1c496636288e972ec10bcc412f1a6d1fd47873963892daea18665b0f820a6124ba79e904eabe44286123bdaf81ffaa387d8f024facab14b29228925e434163b49065571243691885595ea72c881c45e296a8e681eb185f898320e3a62d5cf99b1316dc41e836418674e466cd53973d137d3d745ec1fb2be1e74a33215b1e7f8b1297a4a111113b18747919d6188271a44ec3b1e1c4594075a1e62df320f1663f633c3107be660dd783fa30c5d21368b93a2e58446b127c45f11b341ec397a6454c304b16887a9a4db29846481d8eed38760e653271640ac5fd231e5287b18ffc3e65b199c6fd845da0f7be8adbf86b19932e9c39e5149c5ea638c49f8b0a3bf0c0d6afb3f5e7bd866cc815e945e0a4b0f7ba418e2ff68a726f3b09f8d478ce77952888755bac3879043a7cdeeb0543eecc8976176d84c728a1baea3a264581df68c34adfce9b005fd7c3639849ce1cf61b34d4d1fd323873de59ea41d3c71d8663a6e2429d5d10e1cb69c4226b3c98a957cc39e36f5a4676ed8d26668e2b037e64b1bf691af4e0f1bd69831136fb66343d6b0cce30a793f58f84b0d7b8786a761cb182f4ce41b0debaa5a4ef1332cf11764e233525e6d8635376ce01b19e7545386ad7187ece64d957b32ac9e77f93a935458790cfb74ac880f736edf6258b31ade3e7450936918560de14953504f2a2618f6b20c3beb3f4ddacddba0c60d291c4ca3061a369c53a315ac3a3fbc8641cee07963faf0861a0e27296d54a434330d8b65ac4d954a46c3921ee4ba7c55f93e83cf90a4fccad0347277ccb07e88ceabaa6a19dc8dc9221faa850c3d8a762be36d3106c32fc3ddf1dd88c5b00739bff028a68bba64184cd65b551f18ba4b7d9e2dbe40085baa8f26cd636e0b2f94d673a7e64ba1f1648b2e64f125df202b565b708198a972904d773bea165b70e52fe3dc7b90e35ab6d00231d7a306975e6b626f9105265599390efe116e81857167f0c053780cecdce20af7af64ed4e56d8417e8aca971954f058159a94c6d46472c3b105158af21f7b2cc314f32da6a05f2e9fd248e1f8b2f4d57f1c6514d87a90ab2a28181b723a5e4912299fb0cc84901bd7cee25d8a13b0896a19393761f59443e679d4b852086102f1c258d8e9de8d6b2ea19378b18e1fe77a5c5182fb69ae27322f9f684930ca878bc142dcd48f04c246a9cd2166f807cf11ea4bcb540deea6ff63844d9335f0cd31c38cd145d8a208fb4cddc4f2be9ca1812ae013902d88c089845892a39d9443e83c642c0f9d777521943966fc98a2240cc2d215c7724fd41063f84038c709923a5db07fb0578afe485ba1ce82c6077b67d49d3f3492ae997bb086c7bb69bdaf3fd43cf827adeaf94ef53bd834c3ad9c399de588ea60e98f5ba7be16d342748b1c1cb5f1924e78f0a12d70b06a0789b7973a91e17983a5ea1a7d384fa91fba2d6cb06a0aaafb19c72bd5a516cba4dc6e181ba48c41082dca88150ee56294cb2c88fd18e1eb3c2e8b25a793a419c272e532166ba7208d3cf467e49082c595d12186f02b96adf031c8dde5fb10a9800057e8115917d919ba6a051f7a5219c38b21ca8a6f3fa4b829fc5ccc2ad2927c3975aea4a02a6a74a6c294a33fb0f3a83d39820a233cea587b39c548bec2f53688914c617857a3cca1521031d4a62e5f9d9214cb9a7ceda4cb9f1d8fe20e315546f7668c8ac214338c9c799aa160cdc2a1c68e910f50ac6b3915435889f0557fc2c8d1a672de134fb8be0cae4e94eac31e23d190724ed45b9d111a9bd8532b4b1c6e4613a677dde718bda3f16522af549fe23208198d89ad4c6c63487f0d2fa824a84b7497a342ce6c091f487a6851520963daf87f3c0e4a146516d3f924ca308caa7e92b82e6598a48ec4294fe7102f8ae419126703bf0dd5a33b7e3f8214f13d12710421544deabb11de7c0c35592280119b87dc0d523c9ddcd459c41ad724d5e3e9c779374411d738cac939f82511cbc646d3b03626fb0c47c492316ee7cda83ec452bf3d293ee89f8aa021f6b0f1472a836d18f35a88519e9826248aa4602321b6ac4b21c41ae7d506b1df787eb81237ee4453103bbe1c6237db71bdcc40943fdde83a0c0826e451cbad3021f7873d7459fcee0efaa1bb92fbb067456864b7231f76f0c032a5897b58bbd2e2a3348d793ad2c3f2e761aaa36485ef97876df3224e2ea6b58d142420000f7b4418b3bc31a21a7977582e43d539d3701332cc0e3bcedcf16127779aba3a68daa3bd693767381df6bc117732a6183fa5d81cc8d191d9f9e5fc4fe4b046b5f4739bccefe171307e7c982125f72c70d8f1e449e9386afa0c9737a036b73ae369c173c39a651b73de20f63ad28625e4f3a01e532e040860c31ef2a44ba426a4ce1ab694ee4da0068365506b19591af67073f1a53a1acc10d988a9caaba27f867d2fc620f10dd71a64cc50c6e39ba33fca259561c9a8e3eb61a4d01d93c11c69fae0b452f73a8635ac727949cce49b9e18ac6cd48da265493d8a860af80404060808c3729a1e2f4ac69ef88d54019f8034010160d82cc614b6cb2c76b4ad0208f8c296633a355e29047861052d500102ba801f400017324b7114322ba41720600b85002d6cd3f863cc7a04062bd8801610908522daac0669f0974200169610c36720296659e9e50908b8c21a39d9512468694f0a02acb03e90add4b9af0adb9d7786d854deb71a1536cb29c944c5b06821ee02044c61a990e3e3bd1d2aefc70202a4b0efdffd2507f171ce5e3c404014b6a9cc557e663b111a00800202a0b0d6c45863214499e59fb045c74175b72c3fe49db078066992e7b8c839a709fb6c547fa6de8fde61c2122d5423ad54f1bcb3847526a36eac57beca51c2b2e919a58816a33c4e12965092267210097ba673b0b72651e311d6e04973d0f4b8ba7223ac633ba23169d132bc08abdd67fc950b517288b0a7789a39c57d8c9243586cec6a1de5fe241a21ac2a6937839de8e64c1096799c71fae4f99001c2d63177e8fcfd2106f5075ba6b4982ca73ed8f34f3d62d80cc3cf1e6cf31d4bf2e6c196ca81e7fa928ff10e160b99dbb8e359a6e860f33c76b7f3b163ca1cec203ce25138f04e1f0e96aff98b1ae672c36fb027c7d77396610835026cb0e4b0b2741967726ab1c7f1dca92ae3a4f0f28a9ab4592c17aec43668b258a63365638314692eb1d87ef284181a65eca4c0627b54315127381ccd2bb64cff69713bcf86892bf68e7fd429ef649c9056ac9ab2328244f748082bb69849e9fd4af90859c5e6bfd1196f279b0651c516cd61aa89b1423e2b159bec26ad0ed251ce42c59e32aadc8d758ab553f587aebc5dab4cb1767aca91f37c6c74299609931ea7c8d111a627c5e2911cc36f0c7310e947b1fa972f8afdd31fa4f37836df876249adfc205e1e143bbe8af9945babf927d6b08dc631ce209e399ed872fe4892b3d3d49d4eec1f7af7d166f4ed39b15d6acadbbbc731dec4ded051a7dc3d4a514d2cb1a1a6ddbd50f16562ab7079f25c98581a3c28c94f3f69f24b7ca97565d13796d834a37ca17c53893d3eed84c75d99364c892574ac867ea2521a9ec41ec3ffa7e53899332c8935a96ade509aeb668dc422197d4ad126eb4e85c41647f441846aca481fb14fc69f6728d7a8928ef8433c34c9343662c9c124724bf3658d8cd86177dc06da9552e616b177baccd59453c4965d9aee3baac8e412b199693c10558f2107119ba4b01bfaea3fa387582a86d0602e37c46686d8a2f4674612531f5921b650cd380709b1afa7c88f56ad265306b1ec6ad09a1411c4e22806b98a5720d69b4a76e927a7370588cdb7e452567fd8d2e41ec9ed87f52698e398696f33461fd6101fbf95310e1ff6bc9291bb2b2f5874f6b0a59fffa30c3a7ad824e74e1fe367d4cee761d528fb1904bfd3fcf1b07c944a1331e6a896bfc31a5151d2bc7248ebedb0c790738819fa3a6c357661b2427fa60f1d3687394ff7672b87670edb9aa965e83161abcb612bf3523bebc738f3382c9627eca7bde1b0e7a4ddf5111e62b2dfb0860f71c31ef453ceb00fe96bc396d144138df24751b361cd8f6c1c33e66c6ed6b0ec95cc38dad849aa1a5647173f44f754f4342c979927f8458a1b346c7219f54cb33ce4ceb0248906318566865542f4838d29c3629e2753a4a9f8294886f5e3e4cec01c07916f0c3bfe14672ef7e6fa62d843947bf465b6410fc392973f43aa0d0cebdcc4b554d917b61852bc512f99f8bdb05d4ea317c32ce6dd85451d793f0ef9bd1b2e6c395338af8876312e5b58f2830f1e42a4d0b568614d6932c71cad42fe2cac5d5e271e828525a95ffe360a1934728535a654fbe12056d834a3dc1c371e37af2aec791a1b3a6c709a2b2aac62a37177f7ac3fc3a7b07772d097f3e452583afa2e4d5fa5c67d14767ce3c0cef250d82e44ac52ad10397a9eb0f83abee87b6877394ed8ae4642f3f6262c9e338c6339a645cb99b0e6a5daaacb0b1ad34bd87f73c61999ec5edc4a581fe6f3e42984afd424617f0ca5e1a9c64c6690b0a38a90c26f0c8fa147d8ebf1e49e3429e5c946d8628c1cbad17a5e938bb06718d343f71a598489b0d6c5d39fcb341a1fc2962639a6447a838d10f68e9e73a99985d16410d6ce7198728f369813089ba846d49e44ba287fb044883432f5370e823ed863ae444edb9f235f0ff63fcfdf7bf2605b4f49f2f63d8ecbed60b9c990d915733da983cd3ac6470cb11c2c571a3e761e073b4e21c5bfbec17e3ad6c0414cb92ce5003658338fc6c50fa9c5fab5b67ad6152d2d5a6ce30f34eef13f4acf62f3d9d048351d6658165bc7da903a54cec08bc5fa403578d4e9cf28b0d83c8364142b798cbf62f38a922bd954c972c5aa167c321ee93a07752bcef1b124e7b362914b353bf52a7620b1347483349b8f2a9659eb1abde811d1938ab5826402a6d82b4d320ebef3413c5d8a8155f9cac73948b1c4cbb07329f562147bc59c3c7ce2edfef8a2582c25dc698e7ccaef8462bf739897e6626be2088a2bcf97c7da147d6295181e2235f973c8399e28c7f0d02924dd3bb14dd88ca5b90c27d6f828de9de41c78b189b56ed524a3460c9aeb923378a18965cc4b53ae94552f32b188c5ca39d97e4ad2680528a0ea0526f6c92ba28dd6fb3bf8f5e212fb4dc8133345dabe9cab18bcb0c47adf716573455e5462eb8a69191b471f255001af20051f022a94d82b2ec43cd363c4189100c78b496cdaeb510ffcce3bcc92586c22874ed76d90f888c412a4f15a90f5b30f1f2496ff8e31a77c3f622880022f1cb1563a938d899d532cc8178dd833c3cd7035060b1e5e3062cbe8e9394d4ab5f062115bde7b14198414954347021cfe42114b4444988efa2d4fed4522caab17ff5248db0b44103e37865c37aa123439bc38c41272f464e17b42cc7224c0d18266149c109c5e410a7e0c436c128e42da98611de7b5102f0ab1c94c68c94395308908b17879d8dc6d90e0c52096d8f7794e1b2599b5c81e5e08629bc91f9988113dbc08c49631beb8320e3e631c092016bfbae8d968457ccc0d1036bcf8c35619d3828688fa617b1c53e6d89f565f921b5ef461fb9442c4fa7cd882464afa4d68497ed6f0620f6be65ab15b7320b9173dec919df23493aa244fcf8b3cac96d26ff0cf14f7d402c10b3c2ca51d2d49ca502a897c87256efe381e33230b1aaa1df67c3c3944ee4d081c055649785187e5c26af2909347021c2c28c101e1051d964c8d29b62aa3d2f6831773702e45a554751a12e050810b42b082830214b8600572d8afcba1671c0b4a503c781187355edad4c4102b1d1f36780187fdc437ea2ae35bed9c00f4e0c51bb6ad7cb45799aa155eb861cd2719ae266da8f0a20d4bc70b92b3b7e10006ace2f0820dfb68f28bc8b95188a3d6b0d44507d91429d3ae230d2fd4b0fd68a464c34d1a769416e1e043f4c394816678818645d3e64e8ae22b9321768625522aa20489b1e9c4f2c20c740c9b49be6f423e1abc28c3e657599662a44fa99a0c7b4e513442723d061e84bcf4331293677821863dcf6f37762761d8c2aaa7fdcac47fb0bfe105188c59697e61a94b873963b0b317e6175e581c57f851471a2b661032bce8c296414a1e1a636383fa7061935bcff321c764200213a830bcd8c292f77b6762936288ff0b2fb4b0df861f5bcf19e48f2bc1f0220b8bc5c5d98ec63f3a8ef3c20b2cec781e5814d93804ac0b2fae509e2032493f4aacb043cb0bb241ad3603130355d8629c9c6617d4c2851754d8632505d1ccaff9bcc9c28b29ac5b3b9a9d2168c44eb5a0042738410a2040627821854dfffe364af5e6cd79155e4461b58fdfa1b687c292e3ab529e077d21ff844da3ef5590af1b0bbf13b6bdcf0f9d51ccbde0376195cd8fbb7e1c8f5a9e09ab5928cb13952186d02f61910c2ea71c16493be72861b393b8a91ba883879f24ac3e7a49aa3348d8aa1e5c2a8dfbe4d939c21229c5b0173aeec146d8829c5de6f2e968781136b313e9f1a413617da0ffb04cf421ec38c50b36297ea93b4258ac4cb673bc83b0a3dc94d25977881005c232b2db912f4a7a247fb07a08c9f038d83ed8c461865bd6289f4cba077bba1c2aab661e6ce331e73b2c7e0eb91dac528e3e2a3eca9ec4e860cb39524685d6c9fd39582292a3d57c29192b0ef6edb862e3971becd529922f7e6183c53b44d2a43dbe97d7628b0c53ca8de930874c8b7d83850c0faf42f867b1e4eb8f5155c7a7cb62eda095516faab1d83444becb3214164bc80ade61fab126455fb14709e9a7275f0ceabb62870d92ad58e2a798ffe88f7d352bd68bf13841e3556c5121443285dee75315eb35d00c82467c9cc7542c293fac68aab3217da85864abd4638c7afa254fb184069e766e4a53eca59ac3e5092a21674ab1864f48dea591628fde8a99cf736e221cc5969b42080d6a516c19c2d7314809c5be29fef3079b249271a0582f53de4495ee137b88a0693288e9b28f27b6dc68f3b191e38d7827160f51ba5337f3610c2756bdffb0331bdbc48e3e6620a3fba0a2c634b1e3f8b973fe78e8155a26f6901ca6f0b486d2996162dd4c12c25a46c3906297d8bb726cd4a1b7c452d52987b8b121525e891d83ed4e7ea21532a6c47e658df3a6929ca84e6251bbfc5ad91c2d7845123b5af3d47539550ead4462b95499aed2d4c9570a24d6c6b9cb6388f1f2e18fd826e7bdbc9876c45ee217f3f2a7c52f1bb1af35d4b01e2e98a43062bfe8d49891832c62b9358d7be9a3886d74a2c7d86022741c47bca32a44ec3395ba2be487d8343a7a089a1a3e850db169c6e321a4c40c211662f98f20bb16579b1b21f63dcdd3b38c416c31435f10ebf9e5f05907629bc9f3d0fa2b233901b14d0a310f24c76420fe61cf193c0c62b9cbbaf3837b399d61a646a4484049d3867e464f397cd86f42587e6c04bb59f7b09cccc846a5f75fc69d15a400026348801ef64b1e76b13f278c4c13186448401e16d91c24e55c0a416388031280872d49de1c292eb3f3ee77c0f143d3d8618f7a7e97e294803a2cc14e82c6cc44c81425800edb07db103f447a7bd42c24600e6b06c9ff915806329d2287c5e7cb1a6c6c8c655602e2b0ed6d374c27ea1b360e873d73bb3baf826fd872de67dce931a8900037ec305e70589981752a4d0afc76908036ec132583d093197863582212c086bd435a6c48f5d1c4336b586cb427bd63a395058f9000356c3a799e9ab557e9b934ac19279eef780c11d3868635f49637dcf50cab370e0b0f43c40cab838b3c16559661f9fa183455c75648001938cdf55dfbb25cbdc7509e4e4e35958a9592003160b1bec385f9cd5b02c2b055744cfd97e9325f1e0c6b978e56dce67c61394ff3f18edc0b4bda953faaf18ff8bb0bdb54a5182b111fa66ab8b059f66e64edf55590b7b0c6cbe599ea206758392dec6725bd1f5e16360bb77bf1308447a3b0708e7cfcafb0839888cf906f633e8f15b6d29826a5709c2aac7266e128edc6e89f0a9b848f168d7b9fc29651a5538c649edb5c0ae60c614b6b8cc20ee2498fcc9d46896928ac725ddd3f214fd8b461ce90133b619f0c1be4a4b3366195becf509b244c1887d95c692e613fdd585ac92f4645aa84bdf26474929c3d219f0432f47590b0579de470910efad379846dc5227f0aba9ae49146d81be4987b152cc2667b129f728879233f220c35799fc6186d08a6b5d030ca877498040861bd86bf21197663f841d8614ec928131016ef6994914894798cf2832dcb63e5e750f1c11ee35427ed189aba931eecc8ecfbe3f6e241d3779bb50fac1dac52316c8879658e9ba183b5a3cb2fd41c6c199c64e8289d370a290138b842026eb0c510c16264a7cbcef904d860bb0e92eb91ce3ce6be16abaf7abaf415c75b3d2ddab5a0c961b3586d43eec9fb1dc1638e2c2e9fbc1a83240f21b1582ce7eec0628f2ae351ff7255795eb1c3dc611753c6903edd15ae83ce35eb5ab1647a7a8d679a158b54aa885d8d5ec51631380a2af153f8b851c5baa172cad214638ca949851e9346780e15c7c63df1692fd456fe14f883c9c042baa9cc147b67d0f9ecb314eb78ef9743d5580d23c5ea29634793141a85a358e7338d6dc5a2c871e646dc782896f814ed413c791cb68282fd49c7e84facd17427831a8d0d42ea891d670ea229bae2cc979db056e4625d9cb061e6e8912b2437b18ec65cf8bf142a2bd4c416d3c6984cc153e3106662f595dc40cbc7c462961ac3d87e67b42fb174889a46735f6c9c9c25081e33e7ff93e8b2129bc6cdf1e92846896d2336c838c6244cb08524d6928e7a933572a647629b90f267a68a39c31a126bc4cf2925e547ec1de3c54ef3b3f941c2c2168e18c510d3a6ae4f8e6bc4dea9d25a8558e9a764c412bfc44f6bd3791c17b1480aa12ea7fdecdd4a11cbec7e4a9fc29108196c81887574b3447d23de5ec621548f69fd732f8ac3106bec0a4f9f772188f4a01da2e434898c10e394bf97121c3488b5523585a3dd9b18fa2d04e176e847895c862f10868cf291089b620204b9a295c7fe7ff8e2536c1863cc3c3fec311d3bac560ce9f33eac12d2754d5a091f8e7ffc191f3bba876d323f24fec77cc39011b6d04391737bd65673cee581da94915069edb1051e8a39c95148ca8da19a2dee50a3fe18a5a31b73daed60cc213c586f8c145307a37ee79bb1e9f09664dfe59573d83bc3ca713e230379bc1cde580de9138ac336527e164f523a79070e7fc4358dfeee0df887cabce1e1862db7f264a49d89d5a8b488e64202a2c161a1b158281284c5e14d66082316188023f2602046611cca54e107148002541c0e182a1e0c10120c060a0a0a140e06000404040a10100c06080806080404040e3a0963d80ee707d446fbc186d2c22a53cc062bf8c675c9484bba79d89fda906f5baafa7940e8ff6115c038b46ab4de51014210b3b51962b936b89828585684ca282300a345b20f862400e87c7940010d8c7b1e920703145e57fea1a6c1edcfc41cd918549bfdb0bc487e1a612234980aa407d46a0da9d998cdc5cfb2fe444ed8c985574b18748b46d63c7b0bbc5f04b3de0063303e01bc95846305d35e040ae9e5da5cfb94fc4534117c4381adae2fa6c860b27338c1edd91c93020ebda2e76508de783b7f0e675c62fe8efbc6163551ab6d36eebcd32689789d7fb39e0b55225c77ac0018015d6ecea2e47fbe1122ded46fdec65c4335abe27fa2d297e434f3e5b41ceb35f0002e3e3c8589db7a0e6f618d9edad2ff13dd1e5a6d28ba9b001582d037a14005a5e1d18ae4f2dd465e50bd89e6b667e7d87d02f2305fee458cdd4577bf7beaeca13243ae370a80d96181e759cdd21647c9ec95812f8acfab39d3a57a26565b1de12a21358a0f1c73e25ec73c9895844fea90dba984bb3638769619a750f25f9da5a80a09d68d321bbb348eedae89565c263b33d75479ae8f6d66c84b571154f26f8a687d0283fefac40eac8b45b4e999ef54ed3e370822f21d079be3e0840b9ef28db2dc0c764c57721579585e184000d8fef07ccc4b405496086fc24dfcce4f50d1ab090207b59c9e1dc88b958a53855d2b78030eebf0d16936a45006ebe795626836a456cfd25a0d29e9dd168966251377fdf0e12c18e86b576755fcff543b4ec0793afdfe03f079c36e9e931682e08989d79c9f44e2a959f674187354f606cc1dbf5db8b5848dcc2c96092a195ed78b10f2673335d1c696899e5a6d106d09afbf0977dddb413d50a21298583fe044c1531dbb4ad2da5e6e75a06f2c035d41205cdbd614b9748751a46ec70f136ebea79eebfa3352d330fa0ac0b7d917a821e14ed2a9da5156abe8210e8af6b4a424258ed5fa757a657f662ed7504251ad4f0db3a7eb193b040b2a0aa6941f124d8e11ee0214e7aa8485e867400ac30e8b968f1eff7b752e97bf67be01ecf15985259bee5bec0d24322d74acab7898ce4685fbfcef2d08e08274dc9c0fe11d6008aee3be81f4efe9ea8a5d7b51395c3a7330024c683f1083a351cdfe59de916c6ae4d7ceabbdeae4254cc478de1c1a83d57b586f52123625f9785a19fcdc12a6aa43e1eb6172af49026163de8dd02496ff37790c5427d4db6dd9ba6d8f768034dd9083d16d444b7cd1ae3e821cb4a5c46b9742fcb04b7fea2cd224f02eb6099ecee5b410bc1b3ff6a0952dd71e6b144bf7bfa59edf8c4f0c02ff87af906ee445f017101a125a328bc10d9a64d16f4b7fdce225e965eecda143c09898690a7bd66a6cb8db122aaa2101c5ab8fc623fb9493528f31165a11451b9663d544f9514492920cb89b074da0ccb52f98f58b985cf66a4e6c02a3ca17e9ef7aac586e502ab6069350b160dc829846f6cbba7e05599cf6884b391924c2de1f4ca2bc38cc31d7610a965a03d88bb908c03b21e598efe22056a4d0a4ca2fd89ed5a0177184f00e3401aec5192aad2a01ae748ad605d7a3d377f1a885fe6151283a4180ae7e935d45ff962e7295fcbba4920601d955eaba5665f717f2b696a85617db4aaa6845810323cff3ae91ba02033cfb02adec65b3d4ff0de536e84bc1532114ac9eede75ea2ae0dd8750939f1ecb358f9577ddd79163c1d75a35e0d2f35043d148d4fabd09edb282ee49e49216d200f492a22d33952e85e2c5ea2ba29ba46753174077513a1ee722666873a9317a8abfddda3defa543be0b171dd730e81d2f0772b216fb6abc67dd2ebb5f7a2aaf75c47fa3221ab6ec0deedc51f1becbebd3ebcf0bb5feff2e0ade331129575f2d6e776e00016e1027a775e6fbed8faadefa3b38385be9b8d270161bd75b55d13ee3d7f716b4435d818bd5ef2cddb4bd4c8f442f53af532bdcff08ad9eeb966ddc1a7edf20aeff91ade820df04a79b78eaa3d96fed87b9e7f4b27375d92487739933dd7eb77d7bd28bdb8d7db4b5190eaf7eafad4b5d58da11b4bbb9323c0d12bf8eff57ae17bff7965ebbae86677d3b7371b334184d87b69bd73c55b67551b3beaaa5b870abab337e8ade73020cb34ce5b8f67eee30615ed2e6fe03e05e8dea717ae778e7bebca19d7573c76eb839298c4eac5c170c1bbfc8fa9653cbf6a6fb957abde7acbf43eaf787708432e105aa9cfcb3afcf91b0f8e7424001f4734a36ee96d643c0c1b1c69466ed3c44c0a7da01aab20da102a5f40937d6b31bc2727bcb1c943b246cd41ff9c1be4c6fb5362407390c12ace837703bee2927b54af1af7d4a9205758ea2f619be0fec5373ac4378a0ddb98e43eb45e2521e5acf48c519bbdd6a96382010c408f13793ad47d64358d52f45a3dbebc4629d7c0c62853488a13329c5cf7af796afd32643dbf4d180ed8e9235f2fbd29b3af54252689a6d145512fd2bb37e6cba1d569ee5856959864eec8a7ca968126dba8b2716a008c526ecb32c165eb21603d4ea99b3df42ae444bb7c49e4ebc72972a055c0278f13649a6dd4d6e662fb388aa556ac16ac58e8459a7bffbebf883006f2b8da2308dcff301d510299c10e3a9d011a88674753bd5f815a0102023b022b17c8ccd925cc750932aa16c208f7f8c569cdf4a989aa522990df8117668514760f907e82975cc8ae5528d066e0e543e8da32356044818cf5194d9c32412646afdd97ac0964869b9759a6068270213f291b4813ffd230de7afc1dfd1235001941315637c153e316c424d022d0e2032f335283e00204f80e64c606ae848c818aa1c9473f028bcddd6f0b5eb253693e8b80cc032fde90e4d29404685120837c3ca4360dbc84c6371a1e81a40732fcb764d5d448908119e87236af0ea15b3f17b1b163093cc2427203d2023e0470f9890546d172b0154ad6d215e5407d1cd7cc33044e07218e0610dd5b06b7031c22c8583f50d1e13efb7144e92acdada7da3589c3715f8197ed8095d421c05d81e7f5039f35bcb0048f89d8daef15b6ba5d88d27fc81bc8908482dcd72c7befebba8023c034079977fbf0c4220215d2a4ff8e89aec34d5557f439b0ca5618c109d3e193f8ac57c511f83f1024db97130096996893df1e00f173e9d116f021805a032ffa57065a59c03682cc660315dcc7e7da6b729f1664858b8eea9a4046bba7afc22ce0e9a9da8694371a28577b6b0a542e41e62ddc1dd78a204a9676e9f82d152c82dd5ac42434255a7892303073a9c7f242f990efbab02e9637e2c18b8b7b3dabe0ea04199e24f06b6a61989005c69214cd2d53d26652542706ea4b47671e2e725774768320f70415dd18acf673f84e38212010300fe08c93fe96b4e75fcf8320d303ad0f5dac209c76c469f093076fd37ed5d5bfae0ca5382073d9a73b0e70c9c7deeee3fd096a2620622366d794806b20f6a06ae90595f443a54bf38060e712deb9e3e4e8352d5e7c755febe68cd6380a6b4ee581d5fb39df4c8c9d540355df690a175a13d601a912ddaf5fd54a8eaef7ac29b85ce2d3675fa1c57ccd90de50e68d1cc7ea4ea1445f34d0bcdf75bf32bd8978ff11f2ecb233507097bad0d2e1a9f2a5eef4c3cfe09aced3b925a2c54a4ff3f10a3a51dab1b6c8b77fe2d8e13596ca812b67ae762dfdd6c502af5eb5ae830a3997227679f4c8587f309a7d7682b7a8928e3c61c7d821d50891f0d4030b4e4574c460e550a0c991dec80e95302e240b6371a0f26bd563bd6a42e9fd1e3bbcf3935b10a45049dec9da0ef16297913188a876683d1e75bcc2fd9f8485dae020685cf59c48df8e803e4f45a3a29778c3ad44329db6594907dfbcdf95225a4850761a231a040ee6debf035683a6a87b04290e42e51914cc66727dbd13c3d04cf63fb8f939748dab6ad52a2fe454feb56ca73982717c7762880e34f9c005c4d61fa28fc97440fb87e6ef8c84e20d99a79e45a314b2139021d728418a4619ebc69ce386a015545132641f7e778e523d46ddd201f82e2cf11c26540dcc0c3c6a949ed9e87cc71ecdadee1f47062221e31f7b18051ca54b36427a4386216e541c06944b4d61275091c53b850e084e12b7788d7d3a66681482ad12e2a457761cedde3e6e476d9393325e3edabd717eb71d58241b8593930e1dba76fa1dc8287911c57a847547e3ae2d99f0a2b08945a450b3cd14fcde0fecd49d0bdd794950b88aa3f195266847136669f4d87a033002be30249d6704a459b94fec1c800da1a815f68eefba5788338f6c7abfa2c98847e581fe5b4cd91ff114a83e97c00ada98860e423901084c62b0d0262f6db741d3b019325afa4698c20ab0cda2915408f2c159bf4b23e84edee52dc09ed8797cd9985c674130bbbd19f69e8a5cb6991eff56cb160a514d47f60897c28b0728e52c86fed87dc3433bb764f82a791148b5968ab561246ff67dd09d20ffd19d52e36deb7e9d546b597c7bbf40514637c67f8ec648948bd3b136cf79dfc5dfd1a2dd0615a9982283277db44e69fe0f9263a5ca1d0bddf35932b95585a28105aa06cf9c0c95ef976109419d415174d85856434bbaa4a12409c27379189092a3ef9ee47ef61e0474815ebf3a2a81bef4ff9e03d7bc11026b0db21989b0c2b0dd29ea47948e430b621689df42cf7d7c61fe94e179bfe722ba62f8bc008dec32343a59f70a7e3ed4fb5418005173959f41292e4692ba8e8aacb0dd7d0ff6e9707a446e76d5806b8d4777c17366966423b81d532d4bcf36006063025e32b3b531d7b525718cd1e341d6c70baf41338378ad7ec027094c025e8f676d8649e3715d717f51968672100666c0d4c0867743dec70e7e4209bd218306f850a381d0d28a07444fa57da3d562a410b41bf8138f3bcb398f8831fc514614b5cd0a79749316965ae628021a80c6f789fd46b22329b78d114202e5a01596ef8ccf3e90dcee377673a3d9a375294e1499123dd52b42a1e124b6f8106d1fd2db084f4b58ca92f8e330c9c7aa6dc1347a1183a24aaedda2fe70abdeb913894006f48613b139a46d93da93064d0acaf19e9371651cf842854de01f9b77d4ca93ee790b479d93c7e1b554eb10af58c5b610ba8c075f82c29e82cb1ff11516a4659db2285afd72ea5a7c2e99e993df63351cc34b17cf6c807c3b9584ca02e6996d982da5cf9e6f918e9f1862b327dee1370accb6baca503185469826befaf5a42a7c9fbabfd9011666f98c43c2cf00897c984e9cae004905d0c94fbd9f713f05d94fe0711b567fc918022724c51c58c73dc74b778a50b9a4b904319443d302d151c7c2da3d5ba95e99f5b4a1a5cdb377650eeb6988045d995b29c40d8bc55a29f533f734b467ea5c35221a5c10e25e9b26c4acd43e90f95bf3f1c72b346e922899c737766e8c89341bb59f3fb3bd3446e3c8762d86a1886c03417a0b177761b2cdf9636beb9f5d3a050b2adca947c880f3d95f5da4695ca1025cdce3bf65b52e84011c6ad5eef4b4b9eba54ad73a979da2cccd25c5597c48bd3d411c4fd996aebe48eb343e9303520bb35b20d62738bce7bc24a71b3e98ef2d92d177ab9fea997e765b112c0e8d81c4cac3c12bf387ee683615ac8cce374cced1ea37881007ee48dc3a1687dc47e7383ba2ba1ebb54a03cde35812a8f46c468ea317502dc685091cb2480426375fdcb751c68a6225622e7ed32a590da0bfd6cefecfdb9bb1862f39c9d55252cf42fd5374b0548e9529b6d8e38375b1504612d872456cc0f369ed32d5b9c50c6da647c77c8e2972e3b53f1c526212b90326004ed0c98386b3dc1b02712e44228b0018e603c34dd93cc9b85c9ed4e131d80477e65108a5746251020d4d5821245c92d710eba9efdb6ea3d9f8470fba799dbeea2c7719dd6d4ebbd21971bcb4796876d4e497265ea20f6d025dddc121a9d70425607a61706af4d1c5aae591c6450832b1183bf33228c1e6ef4aa4d6ba2842de3d32ac5929da3cb8b76d684627583c60da8716355eefefb9c893b3a2ad6b007effea53806c52dc5f13c33b779667682964ed284cd36f75874ec9035df66573e7b960c1b6cd5ca199a51a182cc3a06a63ded3b1d9fda3e3afb580fdf72ef934e232cc8ac025b047635abda57bc5ba8f8e04ed37e0ceff1e36f4fc79211b24f4c1a64ae21880daacb4b9ab4d3a31ead009f943daba5bb3f75a94f751a2a41ed1fb0651570dd7471b691e548e377b307503d7488b6b3379ef0d0ce3b4476d3a67b46db8874d2f5de26b2a7b980a339b45b95771f000cb0ad62c982572fe07eccc97eb9bba063274bb518abc28030ef61907101cccc36f77671b376881b9d8e6d41aeaecba28812603efa894ff523138b9624cbb07fc11f6da0a0e4d08c8f8d6ce4a32e2c1f08ec9a9fb2f21507f9a1fda6b1010aa9284ef65ff39bbdc94d871cfb53b179e98fb83ce954206c0e07d1b1bb788c2d9878d310caf63ed9b7cd2544f008627d6a10446958df9d7b197848513866a8c7413f95d117381a467913ead92dcf9975f7ec74b79ab60a27a2050cdb66a8ca065c1ecd85f6791749e20f42a6c5b3b0f7078cb0f395e22ab8d179a49c33fc90a22cdc51447c5b722914e60b18ddf0a8bc3ad1287038e5b1a9ecabbb3a78f1930492da2ff174c073974338229a04f83d886b6960e1f0749f8b8431434281d8542a776abdeff4631c385681191aac2acee97e186f224d3d24c027f1afdcc9a83bb2623082eb09bbdd3de1947e1baa19546084f52de8a05443d28e6f02140cd685066a7620db4fbaa3ba558a8fa5749948d70c598340103a11b0cb5c792a1df064981732721d7ff172e3a5293461b615e94001230d162a6c099c7d802bec0a844eca9ba12290a1b877e11c0a757b57a48961432a25bf248514f038c27359838860d1b7275b6034261912f229bf1cb22c87987bb4af7e2c9e51f03bfd8a99d57e8557c03b1c4066339df8326ee803a9d7bec25262c02303d54d81ca83f12344023263c93243101e1c7b803d591240c6caa812e286da3f40d85948f7bc14772250f0dfacf23b1af9eda4616d77cee7a7ee560ff81c6b26795a9f6980a68b3e5e01410c8699ce00d5066cf3bbb8efc5c65c0f1ef354dfb97ab30a81affe53c8740296b79f5ae3faf7baabc187294071fa3647502af4687943e79261f4045cee10a80aeebed04f0b8e4d8a6317f8d34a7a2e00ce01bc2bdcf5c9e5b1383f7e15b284edb2495aca80c18c9c7546802cccc4c1e9745f1b224ea075f3b663dfde225ed84eaf52b0837c6c8e28ea8ae64e04ea9a6cbd5674185981ca7fb6a4352010760ae4d8635245d84a262b7db5155a87aaf6a6ba36ae9278f6099d46226ec9ed3e79ec98c025c33a6e5d9f4a76150696e0c993d2700d109261ed5f294590192e143635775cb37461bc853c2a5ed3f32ba3aa29505cfb07b2b2c10b4580f33671d889747a458e5eacacafe2a0e7820ab95a4cd23786dc8005109950bdfea473ac80cdae4daa3f2d90d0d2791bbda3e337e50e2464705568e0bca1e1f383efe44eea4cd23dc72064c91678ec37ff54280e39eb0e31b53c69b636b49a3ef66e2a0daf7723a7b6cfbe3dbf24c5ac3332951b4b9a87aba8acd92aebabafefa71c1a28d6001d846088a53fc00cffbfab5f3ab1ccec48c9631688063563360d9511b8c3045e8c0883dbe1ab26e656d69c6d8fd8ce35b5be3ab168448946c1d5ea1155cf3b168a7aa68328115fc08b06b0d0af3d366564844bbabee401d506ca65c0aee35be26671fd40d47a1015579462b5fdf0272103af85067ceb354d701dba4df6826ef7ddb5e75163e685b980756599fcba9e982e0fc871bdc0284c931d7019c0bdd03046502ff61ddeadb125f43256ab15900b00875266d6582f375e96ec45f24fae25b771a3e4fba0bb4c057cf5eec032c48fb51909c71ba6f381bb8df0943aedc3521f179b438bc7876cfa5edd392be788c437c11438242c29d97843501ba1c12f45bf893589286c2342869efb9a26fc1f4e168456ca7abd7e19788533cf499db1c3e98f8f5828be326b25b1be7be1d4624fcd54b4d009adfa6e13f4c77a6e726c066632b8c9fbae3aa6ed6b8f35b8aa5ea8978597e27af2fe18625aea427bf78166c288aaf7330c955c119f70633213a4629e3b8c791a091aa31f9496c9e651bc7768f2a0c91c96524f3f37138230f67f0a494cccd8feb0550299ec71a8c320434a2b4c5fa4af46eb9ae150d38009b0723f21a3d8911802e101431f540aa73356ecbd5f86eb7b4a371a4e82f060848fdd4945166304bf42bc09a6fe7ac1b878d08962296faca75393d8aab405a7f9a180d449107c408748e572983d7976e624905e5af4301dcc9e7d61360c3e559e396249173cebc93b3bebef4bdce15f3d4ee4a85e63a8ba87783cf889c968a661b3152fdf22d7b05b7955c5480027c7a37ca42990460011a154a298d0c798afc0f294b5af53d14278aa6912f1438b239508ddb6b42cbcf3bc9cb56bbb137b62e6c28304c4aeefbf52887adcff925981448a7ede8f9bb31bee0d060c7e64f3d434f789288c17e179219a2d212522d0dc5bb24a1be3542f1057d24c06eed023e8e90b3050cf133de54d2cbbac46a3540522db2f184614ce261abeb210c2dd6fe0a2fa021eb0dcf259c8035adbb414c190edd21a9a21b107f0698ff512bfad260048d0095cb03612a71e8545ee2698d5f642aa8551933088584b64b8710e2c12f5f71e769df6415911365919b2e3231f45daf58a173f04950b682b198078d6ffe45703688a45a6068a492fe37a44dbb19ab3cfa56c243ed7b9d84cd2aef0804d0b763d23ce74ca20cc00a088071263298009a2b8d1490ab93e00ae2b6e5e2d33aced3ba3be8a4c48d6ad5e23f78509b1af35997da81cfd3889a8874dccebba91cdbd5d0bd6c18f6262a9c3da599708cdda88b34f8892986aea349d3e144316cd8d086c2bbee4cbb4f6286924f04d6d563c19265b49c157c56adc9c4b6e0b6aff215e5910852462bb352c13359900e1ce30de1a3ab022e163f1aa1d70183b3e15755b9706ba5744f055537d35a40455b2f5c8f5ea0d38f49630f8364af62556f728dfe93fd14653fcd6c8f3e4cec3c6d2e18529abc602cf29a5128ab7e9496749d678191b7454c78aba6f9b73f7659883df797fb29d019a2f995b503446bd579015cb14bd172423816b5e3f67c15f3996d9ffafa4b64222b31faeb5c11a3ade8beb2898baeedcff087b55cf0396d1185af2e753c97ee3e4df1e2d38321f016510f120dc317ffd8b037d7a02ce7444340b2f40b46439f003fc003fc00f20db08898db4184994494a91f0b90a9e754a29a59452c26467bdb01f60dfdad713654a038c0bbd0ae40a3ff0000f1e65052fa0418306196678c2733b557d375117f752d5ded4e035cee80449bf6ab40f61a6f7b23752aaa1a3c7183792042108018fd2031a34fe94543338413ea53b67d9748656d0065b8edd04c9743dbf23a56b82385f75bf31bde26f90aa6046264861f4af2fe6e095bc6483ad538f32ca3041dc6435c2e47dac8ec1312e414a7fa35266a7758ca71e63dcd841861f1e3772e4086658823042fcda7b9e332a41cafb323a36c8bc9cd6b7308312649751413f93aaae923209664c422b15cc43875b12e4243687973dd12ea5d24139e7751009625041574b5365afd5830441c6d349ef869c259db5c15636f8113974e840c00c47a0316ef4608c321830a311c79c513a7ac9ce290f1c5f63878e1a64941c666a3b831156b5577b877e8bebdb68e5cdbc1bebc1a3068fb23c7a8cf139cac0c18e0ef82288991bcdd3ada39850c181e3860968d050044185d6ca49663426a56283ad2d11a4a4675d41253522c8b7b7275353cae3d91d82b4bfe1d2a6343204a94de5d68fb210a4ae68f25fe4829493d54844330841ce5935261dbaaf92d0d960c31b04b137c738aacfb4c1e68220e758f7ad1d46e8e47d8d409064122df7a6591b6c0b0892f8d24ccac4f4c9b56db0a5ad60c61fc8baa275b4e7b80d36f743651f530e32f665830d073a703099d107625e8f9f8682197c20ba09255e29657cff188f3d905289ec7bce1f6b3d10d46952f6d99e910752d2b65b5df2ebf3c343878d1a7b763a6ed42083470c66e081609ffe267392725dfd1d08331fee6290ae1d72510b37af1b0d9bcb10cd4b2feba6779b5107a29d9c924b212c7508d181687953e5e867b292d139f81534d8b558e82198210792f6bf1853ee50d9abf303c3068219712067db2f4f17e7e26688071cc8194de60da62d7eb6bb8c08182d23021108410b22d082196f2048d319425db84a9e9433dca0b8c55b5bb77507f973b59f1d84120633da4016ff0fe77a3aa77c311b08e795a53ebbcf2935ad81f023d368aeccba69bc196a20272164f6c9d229f3fe6a61461ac81975e6ac35fdfae3788519682079e5dcf7619ad31178810874bc200533ce400acacb3377a96620292fb72bf39836bf5f06b20531f9982227c31d77966f1aef19b397b39ae5c6402ab50eaad7e4e26c8e8f30430ce4fdab581e67ce62d6781808d23e4d7d6fd21f4d9c0106828aba0555526ef3e65b84195f209faa5055d14ec74fa9612a84195e20576a8cb7bb632934ee02416dbaaad2f2b12a337a2e94de3df49d84195b20fb7fb0a4533ed47fd702395c56f4f8d99f910582baedb0a3838556c7ccc002b133687abd9baf403c6dc13f69aa6658811c5485cddb51c3944e7df023a041c3076f63461508f3bfb39e436dfafa675081941d544c98310552b814fd2b3b07b7f7a540ca7321140572c93abd0bb38102e9d2cf9d99b49241974f208ee7b3cba03eb64d4784194e20e94ffbf9b529f369cc0d1d31c831a309a4cef254db941e35f465cc600231a48653b26368c612c8d9cee28d6ecc0c2520a6ee5a632297669b6ee1edbe84349537cf4802c935e584abbec90ba5a6c20c24906256ae7c585a918da3200a338e401032ecb5fea58b59cd0c2310dbe282ca7513a6afec5106193dca50018f8f62904236497533fdf96fd381c3053468b4123e88414e9e1ed4f3ba69d1f1611073f65b966bd8cfa685c1af76b2743193c1a844c4aadbf2bbbb92be0ee6df6e3a25f8000631df4adf8785cb14471fbf20a7584a2799bae572a8b4f0e10b524c7e6db943f7743ebb8641e1a317a44ed1e2ac4c67bd7c0f5e107b3d6f776b7641b8ce31cc088fae1b46ba2048d31aae6d16e3aecc05d13c8a8f8e5e297aa53e70418a5f9d844cb79aae53fc16245d31e7d3bdafb37ebcf0610b62857ae96827bac48896868f5a10745d8a5715ada2671c8216c4600d1fb4206554f7cd156ec3c72c48e2f45f6de3c7bc8a3e6441306529b5d45d6241fc30e2ed475b1fb0206965fa9c4d8f30b1d6de14c353f8780529a911e1a9524c4aefc615249dbedab957564d3ead20cc6bc67d688c7a1f67c56ab16d73e5a55eb9a774fc4463874b49ab20bcf608b53a4a6b840f55902a85578af14985b9b564358a87a820dde91c2a9f5d0939df292c0dcb6f0bdf1744aaeba99c2948e69ba39743ac548ec920a3e0dd472908d2935dd568bc1069210531587888fa65cc18ee2848a374690c9576ebf3290abfba6bddf56eabbb366d4507a12a7f5ec772434190966a7337e936d8c8c87170c7e9b316d0a0f151fe399d2b9acafe021f9f20bde97aaab3ec8e1e3c706c8f316ec00007373cc0ec095245b3ac49be5e28173b41d4d0e469c9923a95d49c20e7f70d9e4628a16483ea6313c4a44aaa9a1eb9fa948281698218c4564c4a5a3ecf73fd0b1f9920bc88785d5b8db14fbd91031364ed7571d52d314d42a74600b6f07109521cdd4ba5e5c10d8420f02e4307f234b404f1f39a4a9e5e55829c4e5bc796d13335352548ed2dd641e9e02408a6ae9e63312589b63373ed44663f776c2ec694b999748334234138b5281b2c5ff87bfe0109c2cd574a5fbae2e5893f1e41ce59ab4a29f1031f8e20885a5396ce939255b20d6e046974f6c638f24c58bc8c208ed2fc246d45a6b77d114451bde39dce7dc187224872fb4c6afc1c634e99cb449074de92d7fb9e0f44903735866937bf77f73f0e4190f3a65312519d4bea862057c9dda45dfc8307ed07dd20f828043969ad07f57e4158b03e0841ced9ca3308524cba5d54ced218edfb100441c65f8e9723fb08045954f7e5a66ff0b8d11af80004296a506d6f960db61e8f831a3b74d44012b0edf84ec1c71fc89e1fb273d85eba343d089e8c1fbc80071f7e2068dd0c42ef89b7ca9c3e1054475129cf274d3bea071fb46b9dd3f014f75caa267fad0007192ed8d183c7153ef6402a2db77ad3bf1ec85d37dfada971e3eb3c90730cbfafb05057be7ee0811864b808edfea2d13a397cdc819ce1a5739350b51f153b104c45d19863ca516ecb3a9044d97c1ae57934998873f8a003b1f3c5331d6b693fa4e5630e04b9a0f4281dced7537339103344d96fefaac68e9d95110792f6f41acfd9ad538de040de9b939e3ff53d76fa06e2a6b60baaad33e9e7d7ca481d7cb881e8da6a29a6ef0e72d31c7cb401f598735c4a31d4a1c3288e0f36104e69ad289d53068edf4106f7c71a4841895dffabd97bf063a08d1e650569a34721237fd0e3f2430d97a7aee899e57965cae509add82cb2c166a34759010d1a367a143268d0f8410f1a34ee230de4d9e09a5d53afefbc03d55883c19b1f1414d4f5b831c68d31caa8f1e60725c7598ecf8106bfaddd92d0743903e1b47d127336f673a519484946f9e9acf09dbe29c3e3043468ec78b443471948b2d5fd6fbf94d2dc9381143edc92527f19035173c6ce1eda4c06a18b819c32a95590e6313cb76120494bb9d963fd4df960208ccdcb8ef4ef8ec9fc0241cdb49d6bce05e1c10f2f107b7bbde76b3d47641f5d20a5fbb421c4cf5c20272b75da9e944ef0b10572765c3ecfb539e73c7e68c1ae1d7935d77553ab4aeaef4aca66544df09105e3dd5c4c7399f9c002f1fbca73ca395a4c130520868f2be8f9b2f5d55d1d7bdaf1a5a3c425254e26bde1fbb002296ce4ae0271e3c71c5fbed69407a94010f931d409f33ea640ce1bd33fcc3536d8c8b89143c7183fc0a16305ff89068d257c4881f85177733d0761e0230ac89696b6975a796530b519747996755020787acad19a1784b013078e1be6e30904cf94939a4b95647eca033ceec3092479d574b95f671b32393e9a40d0f5941e4bbe82658e5350831a38f86082d1381f4b20adc7567c153da5a3ab04727ebc06fd64418b4ecd406b7c248118de39326ff6f2cff80712f0e30865637c18c168b4a002c5207de57c56b6fc5731152006d9e4e8ce142d67d1af1906c9f2933e19633705918541fab936bbf899f12cc120fe6856bc2496b2c517182469f9371a754de918adc02fc8ee9b2717a3e40bf25a898d2e4b3959a67b412add16532a335ba7245e90e7e5e3a5e5fc2e882edab7aae6a29632754190d9c227352763a53e41a8402ec822bf825413a23e861d17c420d44385aeed16e4948468cc6af94f267e20ae66ca525a1a0649e9187b4b85c8e99330ea0ebf9729fac1208fba8bb5d55b7947c020988b5dade875fe9c5f102bc7fdd3ddf8821c677f43781259d3f482144fa7247ba547e60b2f08d2b282f81cfc432ebb208d07ef18555d90b27edcd5644146577241feb1703ff6a5fc2ab820a8d4f6b8a35667f15b903caca5132364cad16d410e6f4a5da894b94d5d0bb2f888cdbb973435a6055983e77ed031488bef2cc875dd5956d3a73ca62c88b21743470dc68294e2bac590396cd0e2c382609a29e792d1bf82b4767d71e3989b65ef0a62f01df1eb657ae4a915e6b8dddc31775841eeab2084bc8a56cb2a885ffa6da54f45af0a927eb8d86276eb692ac85bffb95df6f734830a62a9523aa96f8b6f3a05496eee9e6b1aa91e3745165c54654ebb14e4bb70b9b24849418ab1ed63f76d565c47f1e8cddd4b2744a220fedba6c8ed949b46140a62125da5d245040aa2dc8ae9af3c665ffa0441ff73d2d6ce66f1f704419fda6d72379d64d409a297aaaf341127c85ef5e271e2bf499b20c9399d72708f268871aaa1a2693241fecfef8bb1a4b7a5608268d29369fde612244fff2b7ac4358ad612578e5f2b41d070e2c9d4dbbf554a903257cc761745afa693209e52bd5b29290952596c26cbf94c5b4682b42ebee1c3538a122141f4d6950ffaf5c2898f2007f7cd1c22479053a98bb92e8dc7d708926590592a668c20a6b8c9fd62761641d057aa674b74ca29751441501f679eb2e631619d4490ad846d58372182244406af1c3c999c7f0882ea2539ae63b9df1b8218844e73f771566d5408728e1bb36a8a0841503673293c6ade6710e4aba44bfc7b0441f8d2346a9e0904f1d369e98e49944a2f2008227aa136ad7f20c6ea8ab7a4740535fd4098ef4c9e3a55c4977d20d8f867cc3932c93cf28124e6c63d10f54c2525ae999ba20782c786171fb3b2dcf240d09c7fd793cae0e1b424bb35d5327720ad2633a161f79a4b76207a52f93a103655f4a01ea20361ff5a5310262f9b660e04213769fa50aa84cac881e849ed79a870512d1d07724ed9ea3b6556668603417bfae58b68d68ebe819416c54bab53a657dd40da515199e63db6d336104ebddba8796c209689ba6c2df649b33590ec42b95d279dd455450d84ef9afd98511a08e2327dfaeea08164328cbcd79c81f8e69b945015339092c658418fd0cdb29781b06a4154edd65752938118f7320682fa6c6d95b66bf71603b963c8d8b9864b7b87e1528fa361530c863c55d0544ae70ba478fffda03b96797a811446d80552d49071dde102497ef8b4397f0abfb92d909452bb5a0f26c23a2d905b54fabcf1fce435cf0249ae3267b8946381144793f6a045d6ff2b10e3c924e305252ba4c964ccede12a90436ac69a081dafa502b9d3ee894a27bbd94f812c2794ec59d3a474480a24d9a5d29dbc97fe4481b8f79a49e9b3b5190a0415e254aa78d33b9e2790c2e737ed7025e45b9c40da24dc538c9b40f0f39c0904a5737a0944fbb395403e4fd633a63497469340f69015e599b4001248725487abd8102e3a0b1c817c31f4d977ea4cf759c008a49e4b2ddabe47bdd7c5209d8db824be2606d1528de7a841d492ac8741ce33bddcdfbc49ae160639c617b9ee7b1efa0783b849c8e4310706a93275d6b1786ae2ff05c9c2fce7dc97195f104dfc5eaeef9899d20b62101973ce5d39e7215e90cce2c3e44befc6cf2ec81d9314ffcd9a6ed20539fdf5680de782a0e26c4e42797041f6a0c662e6bd1c53f016444f4a6573d5b598b5057953b4de9ac514d76a41b8f05acabb8294d398160493994bc9799a96c6b320a83393751ec36da558160429db31e937c58264737fdb9eefd29b6041f40d152ac3636aff5f410ea394cc267d5790aaf469fcda7e8d39ad20c8183b3b7baa4c7e58410a7a1fe3a918aec26715a5cf1f6ba9e4aa20774cdeae9e77dd7b2a08771d2eeb7dea5e1c15c4d3316550bd23ecc3a720c7dcb53fdb62e3495390bdf279b0123adace2d0549d9a557f7d431a7e09282b829c809edfc32157714e4e4e71b7497fb25d58a82d4258390f7a750902ec99853e53521420914041da383106fcf1ca24f907a33266d17be82fe7882ac2e72bac5d20972d229b74d4d7888137da5dd0915f74d104f084f7229af09a2a74ca6c334e9759e0982cc25ba6b3d78ba8c09f2768ee94ac59720e8d8f184e81b4ffd5a82a06f6464ca926569d34a906398678e9b920625889b53de182a9320dba713a3672409e2dd28d9fb9c4890da2bf59c6aa5fb1c4890f64d78da8cd5a59a4790477610ba2c7e8cce3882981f63ba5c55cf551a51bc8faa1db92723085f16836b2e174fe95c04315f52195d3bf5514e45106d35252582a4a7ef439bce393f4d44907ceef637597892661e821cdc4ec85625733f1982a839c372ba8b6bf2540882a7ab6869e1aa749e10e424eb2d3c752ead3f08e27c86502af53dd52308727e8cdf1b33aca72610a45c4a3fbe7f976c0610e4ec7c2a6b903189acfc81b8fd27b2837f98d1fa8194d274f584189599ed033128b1a1a26bf2ed960fa4b81557a407d9f4ea1e48994b574596e79b530fa46c31daf44a762e887920069db4f3cb6d8ae6211e486997a12ca5c9581dde816c6af232cec5965b680752cc93f1156cdced5407342555a2032977d2a596ddb6633f07f2eace26b19e3966480ec4167dad76d9234f7120e78a31959f060e6433f1fe2c9a3710acca54bcacfa717137103fe4271d197bb9f536103c68985ecd4c7173361053ce1723b3876855d740de9864e74ab25255aa06920ea24c03b972982e99bde12a79682098101a4c7a16bb78de19885697bde4986620cca813b35e9d43c43290d4b80519e7eff37a6420be5f8af1ca829cb36e0ce4d23fead7f2664f4962208aaad8dc48d1ce7d1808fa3a6ac7940306b227a562ce99f205825232e4ffc8244fea5e20c66031cab53e4cda5d20a798ca4184980bc577906e8124533c9490f57e49a905e25a4adae4629b05b29c0869296f4f3b6858205f10c2362bed4747bb023975f8b7ed921508dbf1726d6cfe5481943c8d2cbd29c62b4f055287b8b4a0d3eff4680aa4d23336ae2b3aca470a24bdb1d154c71cf654a2409613e7d9f269dbe250209fd42cf7e93d9f8c3e816429f773cf6d5f3c9d400a3edba7c27f4e494d20659015bef2d64e894c2045f91b1d11eaa3e59640ac4b5f715be6fba204d26a90ae49567a492d09441da163088bbbd02381a484b251395445e308c4d8dcfdaea782ec55348c40ccd2417e8ba714839c738d4a61ef62381dabc10c629083c86691f91f0661ddeaa48ccc0a8314d3a5cd6b5030486169f38a68f10d160606d973534c365e31c6f2bf207e88e634cb754fc284337c418e9f53eee8eabf239bd10b52d26a97fdf2e20531d87de54d2ded825cbf29e5f4df67e88298746c3d2157e6823877bd2da22de50ea319b820c6a0e1db53498fbea319b7206ae7c8784159877dc716c417e59d3c836e9219da60eb5a90375cbcc9ca79e9131a2d486631a724f2748fd865830d59306316c4b879d39d96cf5173cc4316844db183bbaaffc6eed86241d21b948ca91f3c3c58103bfa481f254f89f90a62cdea9cce783776f4485710840eb954dd5859d95a41fc4bdf94b7e229cde3c10af2fa777f0a8fa543ae5510f535ddef83d5bc75aac83cbe7e6cb150a682983aea59d296330b5254906e2dc71ff53a9e82e023f4c5f86ea9deaf29c8f9829e5a56abcf72762948eac3323c9385140495d15042d9b5f55f464130e959dd6fffd9414914a757119b9a730afb85829b4f3bddb7d2b9b1fc668082985f4ba72c42a8b7357d8298ed2c6e3f3553897190918304014a2027d794b45de454dc7c4920e65e4e9b357a1b6c87ee8243024176ae2cdbd01108a733b909b1f6f95d7446207d95b8985c648a41320d9a33e3e231e78941f49cf272a4360c92d6ccdd7557110649850b13b63507832465b582fafb769f161824f927527e37e694bdbf20c73ed9ed2a4d71e5f505297c873219937a41d277eb8f99d3fbb7f282ecdb419c85902d7fef822897eb3c48d3ca365317c439254bae96980b724adad29c8a31a75bb386d96801daa18284e35dc00ac3c57a971eb4e24fa9b9d73461b7b07254ecc8922d4ae234e8f7871f6bc1bcbcba8b99b6d95cd676d21ccdc5aa32182d88714f5c4c9f0d136c1664cf5a29eb79a63ee6d56441d2e199eaa3a658902a05fd4ddba72e270f2c086a33758ce625daa97e054996be75d8cdae20c7a87d213ce4887e3287b58218be4ccc749e8c15a411babda317da2a485f2f2a895ccfa9f2a60a524a271f36a92a1584b3bc262316b5aa7f5490cd3aaca720678cbed97e2f7e2ed34c41ae9c4669b7a60ca2530a6206db3319e39382a4e37a713ff5a320c8b318a63e89a598240a52aa3ea5297d65a120a89495368d6c8ecf1a2808ba4285934b514e5bdc3ed19cd86557ccbbdb6b7c054b4167913b6977b527082f3b6652d4e77471ea04b93ea61483ca1aaf5ad449304e10bfde3d454dbac9d35bdb04b965f7837f90124c1384f70f7af52aa76d19a560996034a8f11fdd9c32a36182a462856aedfddd8cb8a3ace0126ff08c212bff567adf12e4d26b69a9a3296f6095209dcde5cf4c9fae4e8512e4b158ea39ffa74f9a6493b8f63c5e5fc3364ee34ff6986771d124410c7a9747afd21609728bcc23533365902065bcfc2b164c55b04790c2a7d8e2d9a5329fcc1c41b8305a5246b7d60882f08a1e4425a931829ca59bef34b4088214d1e4171634868b22487efa3df69ff4ca7822887964eacdee1cdf694490821272656b3e0471662bde66fea4c88620e9b38aa954868dda168294f2c77c979f10e4d4207645fe8e28330d82d8e5b663671204492859952c0805822063834ae57e4a34e70141de9fd7b023c37cecfe0fc44f419c7cfcfd40f020bf748b95ff77fa40f8af9c838518191f125a433e9a760fa44ff283fa9c437a207e9b6a8afd4f1ec8b9b3a52aab3bb71f3c10e49cbbb78bc853fa3b10eb72675f77ccd36f07c29b898dbeef4be1a90329546e2d6d59b9394c07e28576cf95e439906c5f4e888a166bd5c881a08456d513af2517347120c81a4b52e752e040904df13e4a2f68bfcb1b08227a6773cc6e20ac97a99727759d59690369c4695f0b992b596203c1e4bf9fa77dbae8af81e85541fbaa3d86935103e946df529dc5d340b03c35e641763410d4964c2675b6f3537e0692106541c55b54dfe566206a65cb31dde9c52b2f03393cbe3ddd65d6759a0c24ade2a972928f811c3df6ea2521ff312b0672fae7a9a0b39e2dd56120f9987ec67c637b3d1888a2576497d8ac76cf17c82969caaca6f102a9cc4bd6c7d605c28b12a739ee3e8c8ab940181de3879fcf16483fda3fe6d70251e7e546069993d2952c102f05eff2a09bc4c4582068101aa47997958557c8345bd9f856209f6aadcb94ad5501d9bed398c65a2a105ccd329808a5941a4d815c992be307219f63a652202559cb3f1ed6c2ff28903447cf3188d1d71d820231e8ce9c8cb0d1314f20a9bf1353a9ea7e7102793c654b49b4b4bcdd0492901b64ce6b9f3e844c205e94919d378fa3b35c0261e582e7942fb86c4909a4d938a541b4654e7e12c865723286fe46af1c09a494d174fcbcedf1b447205fcb8e0e21443302419e95ae5db08a41ac20dfced3fda8d01731083a74c9a80a5254af6190be449eaacd4918e4127a7f2d74c1206787be112aa83aa10183fc19c5d7ca5ed5affb0531e724c7e4c50d4a4dbe20fc9bba28523c4f887b41eea0bf6cf4958fd2f18260df5fbb1aad2c59b60b928cba23db743c7c5d10be2f6e52c14edffeb920697d56699c11964c5c943c84aa3bf96e418e21bdeab4b2052968d9da9b8fe3a384e9860d1ece830c1d35aa6a41d2216c93521fe64b461b6c63141c2bc0a20529afcd9d85d117e21fb59b05713d53deec2e972c3cadd57ab177ad5913d10eaf0ff1d9572c483a96754c679c5213c2a123f1e05b4083060f7e87c382b4b142cb73baf881159c2002216841043051af70ec54c6d3e464ebd3f4bf3d647312a24a1d942b48a9d236fe87ef591eab15044dafd92445672e9311d950ac20d6c8344ba192a84abde0041118230463241a349a50ab2099e6524a9a8ee1339636d86ae02887aa20e7af17b5db738c4a056183d2b9c4da86aab4a382dc1d7f2ca9143aa5fbf028382c07750a6226a5e37b0c53b963cacb14a4917e2a6e2a7dba837f3e0670a852102df32561396e3c48419697f7534a95aa96f4c68eb25110467aabf67989caa7823b4a1424a137068fabbc4d4145ad478582ec7a62466cee75b82005346898152848fbbea1838d2e99f3810e534307a7e030fe387a9832786c0a6a506302f509f26d8d98b89ce38994eff68b70a8e007d50982f5c5caa4b947d43f4e105fb4d3b5e86c8dda047954a3cb6bac6ca5ece3418d1e44a134419cd73fb53bfb162a1304fd3973a88d274c9033a98b1784ab97e85b4fb44a930a9f4b869620d97797b097177152ab4a9077f53c3e8627f97592519420b697fe3b312653f79c04d1329ba9a7fe4b12c4d6585d29e662544c8a0471c52cd6d4251122870441b39c55ecfa1e41cc0a5ab34c7ae5d2bd23fa2e8d2f71716b1b5bf1944caf95faa4e56d04415fafefc46939a15646705ae3592f664a6d5e04295b7e4fbe3b7284488b508a209e5bf8d0359d312a291124a1ab2be3ba8908f265f60aef983a04796d94676c4e3204c13a794c17acd4659f85602bacbc4e4d4df55bbf93c85b8e1621487632e6933a5a28d420482363b5d76b65698a9620486a6525641cc5ac94b103a283f3363e508120baa6cebdbe1a0704f1e33a09a129a905fe0752ce1f2e5d5cadda587e20e7b05c4bab6ed94168d0283bfe46f581d85f1d664e6ed0b5311f489942add2d3625a7287507b20758d79eb8dfc94c4675350831a36283d10fe82e8d01efa34b3c3512a0fa4f538b5a9772667e3811c2c785cf9ac19f4ca20d41d48266fd73974b78306aa0e243d0fbbbbf4d2819c6f945c51b249410d6acca0e6400eba4cb749d5d6b8540e24d735edd3d0791ec23810ebb3e5ae913964f40907c2fcfb650ef506e2e9527596224ce6927103c1a4851e0f9f94a5fbaa0da4f194479a4c393b47a8d8408ea9e5d97378a798d5326a0de4ca92317f9e75f6a349825203e1ebd38c92993d89524a0361b57ebd53f28d5153d0408eadcdb19a6ed74b7706524a9a94e758101aca2c339084d08c99d425479581184d4e5eae74b1103a1988de3ea69d84b7a90e7f8c1b26878e733606a2a692b2c132f8c9d19418c849e59c4a64c45f6120bb25fbf1af4c818158495a85fcf777cbe2a0be7065675577a7bdd55d6a7c2e4d72637080031d386e81505ee82da5983a752111a549a6cfa4937414171035239f4d9741eda0b6d05dcaa556ded8ab5dc7965d8d8ca79cb9b440b84e9a99d6439505925cacef9cc7427dbd5820bd85940f623f74345a5720858b90d9f25b81947c4c63d01677aeb4aa0239d7a88d3bb6a3c7ada2423633da329b7672a3991f2bb3d49b521dbe5335059236dfe0ae2629903a77537f970765fa281035c77ef414f492fe408130aa828c699e40b69c4b393d7399d03881a434377598f0f7aa34811cab1f975267025964533d09dd6dcf1208ca5ff5aa5d251054da54a3b24920b68f78a84c425fa94820c7798dbd94d9b4258f40ce0aaa4209b18c4092cf207be3c73cf18a41ce175f9be6aaeabb440ce20114309c5136e3ae0e02ccc7058bfa0420f0031c3d6ce0e0c618338a062f0d93c0e9c1a38c1d0508c00fcc0c0500a0078f325a4080003c0e4a193818a3e040800078ecf85306d2b1838c04c000000100000000d080192378c00232c0e3061945010138040078f03034082080d2a3201a050840e951908e1d340e0080013820013b5e07a7f4e051a3c602001080061c006ff4e0c10d54468d1a09482590df3594aa919f538d9b0492ee941139f7f3400271bec48b4ecbf9f1311b6cbc790472dcd4ae9c7f1feacdf139348d40bcb3cb31c83a6d709f957196e377d4e0c10d54033d106ee02837ce93c1c3adc7183790c718377ae0b85186a9b1e371dc2023878ec3560cbcd103870d1ea5468d042031f0460fa4234719356a24008781356a200085f13cd09123c7e7380006a3c7f3000619397e81377aecb0c103478d1a09405ffc808c93e37318007b4152792bc868dbb593332f481d3cec54ed671704d51b366c2b6546fdba20c9d9a4d2ad99a6ef1d7341ee12dbb5a636c9eb8eb820c64adb4d31e7bbaa87b72055771a192593574a41680bb2ba9990f134c955ade440c65a10b59456a5eef68c9b327818079016dc27a14267b2d4d9d92c08d71f2a630d029405395bc72a95670c602c4871336f83aa2d99dfe3b11f405810d3d4a56a9ced15c9a44fe80bb71764744510b015c70aa3b18a53c5a5a25171a758dec4aad4f6446e5db7459c8b3235d9607b1d9417d0a0c1e3d014a4b0cdd7d5bdacaf9a5290ce3428b968a531de4f40521094ef7bcc201e1c05e14ba58f19f3c8c5f56880a22008eda0e15f63673b63287c6b7bdd761b9393dbfaff948d9a4587a020dea58e9c698fc973ee1304f5a6ef2c9a08f15df223a027f235ad0eea65d4a613975bbc868c86887f7e76ff4a9e2b9e0db63278d4c03620270823f3e870ee29362eda04a954a85caa746bb4629a20d798858ca6646a3d7d26487b49db54faddec3d6382743a75dad29e5f82dc7da74f26a5537eacd1126493c1fe1a679520c6c8eb511b22f3f5dda3a01c9012e4fad8399ef4bb54ab9904e9dec4f6cb863c39ea5a165012a4cff021323ac235d6a30c14ecf81e248804415b54507f69a3b4831012f8087404314c5ae9204fdf083755b4edbdaec4cd544690f2c8111393bda145e7831f4349b0e37b90e071b0e35180f738d8f139ca7011e4bca9f3a6cd0e69352b821ca3e8dce23da7c41a7b820e7840052710c12226a2ccaaf5aadb38af4fe2d247d3a64ec81a11418abde262eac243904adb4fa357d810c470a6f4b685f2605515820941b0f38b0d1e84a8c5100741504d213caa673ee00232ca400f021a34767c8f1b6e4041e065f67ae1b96d1ba775a149c818953cd7f736d87e8cdb017132721c0c84d11803014150b329f95bced1a4a5f807a3e107a3b17d383e1c8d3da01e1aa59b9e37e794077250f93da55fad56dc110f462307de61d10ea4d37361a3c894c63a180d3a188d1be01c4819964ee83e1379e9154026500ee44a613405d3793735df04c661d31bb3da50de61a2e6daf23c403890bacee4fab9e60d24bda197960d05ba81a4b477c6b4397fca92b681ec498fd88fea8a1d93029804b2817c2294853715b6324d6b20e8df0abf62f900f002d5404a7369d1b3e8e8387f1ac8bfba3986f00a5affec71238f0988065234edcd0b73a56383ce40d0b216cdcfbaaafda23ad00c44dfbd582ad23c9976ca40d2cab14a3c8489340b928178a51ac326cb3ee2f6319042c524aff2eb6deeb3c1b609c540fc8a71f3183605a19e30904aa8cc0ed234e9be0ac180aa271536f99af00be4346d2916d7c1f52ce805a285a98ca557bbc32e102f77cca97ab23be4023166dc9431f73c9dd01f5f15700bc41c5a4a63a7a0c1fad702295955cc31fb5f5221bcc32c902ae8bdd84f5d7e15be6b026281a4e641052d15c4557e77780562b2a4b11953e814d52968055225cb41b705391d948d55301a33402a90da94587f3d792d6ee3e11448a53387d099b1cd52f4500a040f3775e7f2398c02c1c4a8c6169badf8593c840241a6b77cc183873e75119f60340e9d40fe14fba4673e9315546cb0d51843c7183578dc50116013c81eebe1f74cbffbb277364026104e792cd9ec9d62da1d974010a64133a8b978a80492b0603a772e0f0f9360cc778578c8bc786c9c8a7a6abfb50c4402413b7c34cf9e7b77ef0e8f40501b4ad8a58c262a8dd4804620294d222f426fb018c46cb13f58fd88c42078f8e859958e510be930b818d66289555118a493ae2ae22cdc559022068370a33e6d86c93c79b60283307fe2b531cfb5e72cfe829c2dba9ec63706dd0d0fce17e44ad324648ea96f3958db0b62d0224f8926b1cb3944ccc2f1821cdac5c4532aa996f65d90f3f768f6541684d09f435d10f7aee484d0732a7be12023c70d1e4d2e1764139b25c5a4c8346afe1d645c090e1732b85be09a34a7f6539d33c916e47f4bf313997bf4c66b4110be6be93d8f08fd8f16ac967d8ecddca56bcb6755cfa88db0cd67cd82e827e3a8868b51a569445990621242da696c0bf258202c483208a53dca05a51fe27b05416abb8608bdbba2555790846d876e4d2b1e375e2b5a7715b1bd2c6f8d152499d237ca07bd297e661524313d4aa89b85eccbaa20d65f8ed07cb154104d96c760a5ab9e7d3d54902c445bb898a55310f353aa95517a5390dc63ee121d6e6e735d0af22775316612e19182944ac38f5555370aa2b66690e3b1a3efe7308f1305c963c658ca34e8ed0f4341da3dad0b1aefb62dae010a720a4ae7ff51cb17a1ed18f70992f064c9b46fb577e63c413ed341e54b19ef7c8f07d709826c4ed1f25b7ed5d51c270837db39778c579a1cf526483a73ec0b3e62c3f66c2b9c2608fa739a6e964dd750e14c90c3c2835d7fb492165c4c905cb32825323e5ea5ce25c8a6ecaac336e62c418ed6b656bf16936bdb84ab04b9e36264f5564d06211f25889dd9e3e650e128dc2408faef3f6d3c39bda7a427098d0431c82454a8cfae0b3a2408426fd099495b8eb99d47905b53bceb950fea457ee31c41fc531fa95d22e45bc3718d206ff9f9dea7dc2fea0a5af081a3c331a22a657ac382f9b708a259beea8fbf11c32982fc312dc7dd92ca722a1b6ccd814b04793c88558c5b74708820a9d820b4fea5533af8a88f871d82d4a73bd2934c162f8ef00c41d41cadf2831d3dba10642f33b15c6aaf7e3784f0cc5d6c73dceacf07413cdd99d3a758d1b3725979e00441d2d3f17ff9bc409063ce5d959348d3321510a4acae1684cf78e61c52e1fe40f24fabf4963629691a2e9c1f08c2cdddbffbd49bb4735c1f18e59e27361663a86d303a3e90833ebdec81ec71c3bc2ed5099db71e88a7eb4494a57bfcba7920c89cfa7eef984613d1e181209bae7288f4ee93c93b68d22bc6caa2313c3b10738a5be1ea5f1e4a5c07b4baec6dbc3254e4f4b5fb2a55a94eb2baa303d972d2bba352d017bde640f69c3dc5af94a8da1816144e0ee4d9d4da9549e8e2400eb5267e32f79492cdc1815c99d5926e46ad0c3b0dee0dc45c395fe7e78f1bc8e756213ea7ba0d24794a76e48589722fd9402a1d458718fd1a5bab5b4319b6e3557af6fda7b69d1a48c2334ca98c9a95e64b03513fce796800c29d8198e4d74d86bbd860eb514ecf0ca5a0b45359caf0d87123d906ae0cc4a4c3b5c964164dd9c6e8c081831a64a82e6fcce4cd4557546c3bb3a5bc3bd1dbe05106193c06f2c50ab1ae1bb4a3f4a871033b706220a628f129ba3d6ee02083875f18881ed7313b5ed4feaed8603b30102f85254f2bdd170877ed6db6b72f96432fe4725976e2969719e3c2e0ba401619b36767f7d335b2bbe302c9e4fc6d6ad76e0b0461a93288d218ee74f0fa92705a209eceebcbb7a9738f89775930d3c36a3364b556f7eed7a30839dd0f0e0be4281663df06f5967157208dfa14a32995e13aff9f1548afa354c4df2e9d7c7d5520ba07f10e9dcc4fe7141c1c1588a5f73a7f4a673df1e28e9b023163fdc8ece979669242102e0a896d0e0abec7fb9016e19e1000239c13c825473da6289ef366afaf096db873cb223d78c784bb259455b719eb313b8d56bf830b8bc6a8444de68202592c120b44028128180693ed1200931308001048200bc662e16898a6c12e0f14000367301c32342a2422181612148dc5c250281c0a03426130181c088341c13028009129356b1e939ea9056c921dfaf7d50efdabe187dc5f658517b756f198a760b4b183ec8f1dba16b9e2b0dc7f8aebe699c33bb6a4368609fed3c50a34b2222dd55755ccdbe84a3331a2f1ddee65de233e57f740c267bf1c957d04ceb3f83f3b1c7df55d2266b7cf49ac1e1dba46fb6730c3d288324673fa52a78716669c0d185dc794664852b6164e246350c3a1d532e0cbdb8880cb98d4036e89ddcb7d5a38d4b8eeb3c262c5e6aae5c1e82dbdf6237ed3a98aea33f03aebd713a646b0ef9d5bad0bcf253978114c96db21f3b991df261f8822ff2d05f6434c45e20bdc8a0456a89f0ab126b0def65e8796cc3faea66f13e6807792b28c87eaa898b916704560b96c380b50cbdb47329b292863b9f3ef067c84bb28efd5a0d8a18c51b02e9242ac44da189b75862f866f2ff412de44ffc3eb03c0011f4b010c1eb24ef88381a90e41afca47da0bbd118f0e6463cec712388cb40ce54007401ecb48216232baecf3adc4983cdc2bef109750b99d5f15465e4225eb1892dc0cf243dcba5217fe51a6438e88a04cda80963fa7f356b45d0df9ad89e87f5996aea0237dee7fc239a75f4f1444c09ed1079139d63617235fa99eb6bbaba4882c6abb18154c9feaebbae577099d07644198db8a89878355496e5d5badc44e814d3146429c77b1349218c6adb85c98e21127ac9246d6471e1b4680cd8690ae0e8d01275ae39217e97c354408865bc524bcdafaaee56eb48dcbaf48305b6832e313db5aa9be558734e4914a3282a6680426ee875b754d36c156975b55aef7eb78c7febd2f7a78c858a1b08cb4ff914ac6f1377f79256eb8ccb446af76814f6d2126c1a3a67b855b86f3955e9fdaef329ee74e2a91f37816910776f9b87ecff735fdabdacd6d2d7871b7276ef6ea6a89790b47e87a03e660aab9654ea5ac2ef3dab978ab8d62fa3e15a32b35fbc0f8cd12c732f37737e1cf11d00ad68c760afdb483e5386180d7924b906bd9ef0a7c3919c4f933e1ffe6e820fd353009d35b2123d75b02a91c6ece1e97baf6121f2d17de23ca3b5d53ccc900196248d05cf88316de2e447773414696a4c00dcb19d3981e74d8f46f55518dd5463ee0b4d4a0c853cd3f9e7cff699c3e47c02120e0a21a15e1ecc6397b582fb86907ced48edb7cd31f1edefd3dada273915e4e2e60e550ee9863b5556a94451f3558ffbf634c170caf25d6c83c12d21b4591e4b704e8d6d67ef098e36704c27ad6d50537cfbdddaa963340e4eab0eb8c60459a04753c9692181a7df180544c9340fed92c70e04bb4b8eb9e3fe687c2738ec510ca9af150412f1c5548b0778d8b28f72de65049690f1376ff2a7745bdc162f1c789f9cc71a6ab7baa788a12f6fb25b8ccd95a65053fb242f2fec15921ada1ae83709b840923f9887bb3612d2ae30a282625e1883fb136e5fd24a7c15584592150828784051198437db502ebb514267aa24ed0d219d0bf7826789c482f4eac781f61e64d7d05be0551148164c851a232e12144381fe7120fd038618d95ef2b9e44f4f6fca921ac8945a42abc387cfbefba4abc85e613975ec145957f93b9533fc0fba8bc785b6657e3438c54033d2b34cbfe423883b84629a5fe29e40c00d59424ffc5444e91c81e9d033b94415b0856fb7ec57cad3e1dce3a6ab0c40a2a7a197ea7b844c19f363bb1be65946c96b2677c2d46d5cdc35da65b8f8d2c02762f8297d4450e127a7218d6b890df37d871cc8b05786879f60a4ef8fc6c37a5e730e2ba17c670484ba4a772494d39eb940eb2566ae688ec8112305ae8cc96c786797e0613d6c3e742dbe5432ecc554272140c5e80817031ca4306633d4cdd65b80159bdd4d9515e3296f40eb473d76ea37e10e9242666d346ef5a34847300e063308220b55338c6e41d6863f74af02eda277029bded4c11eec56524a273afd49be877fe985d4913f225135da306bdd933c5ea256c2fceb636cade9c5ea4385c27d774a872ecbceb504357e68e2db605994e50771be112d2f04bac58875d2851ecd343c17c7a38d549422ab910840ef77c4c6d30117da965585a070fdffaba4f9dbacd5b47b232ff22ef7071893365151861525b58fa876e271e6bc796c75c3ac5a98208e4cbdb7d298c03d16646744ac386213f92f7cae77b28bfe1f914292a99b2546d0ca94e030854c98e546df46e2e2ee15e4ef31628deb891831e28dd3bd89fece76d2127ab3e02f1508f4bca84182daeba379be6436c927821c29632bc85da2bfba5cf97b1dfd9d1619deeeea3333e0d67510fd218ec8275adbb7509845b9b3e419e074f7e3602af9fe2386d786619a222fde5488bc48f1923341f7b227fbb9517fc63f98879512000eeab34515e2d3217f3ed93807e2f5c98352d12bf8e6764f26cc817bc04dd8ff0d52760eab957763f18f7a82ac1854ada511ca769df3885185d504c60371e2ec9255dc944b8687236390d7cd98f4a9d68bb2ac19c4ee58f0d3ba4714d064b7bb966e50ce791d117cc42ed741045aa25409ca4fda26dc6a0a9abcc681d98fb9fcfc6ef3e78937d0983818281b5d85ea11bd7f87bbfe5c397c2441a18085b91f5b672025d98cc0b5a49a000fd616b8fefd08b7aa9cad38c9719503eb8da9d2f51a0eeec59dcde4b9eb0e1a3733c518704bdfbd814f031dfbbaf02b5e0a487f77ac9e467e4a5d4926fa7a2216a3df4a826001df6ce939f445a6533197006b34f971ae3d8dc7e39d2f4667f01497604ae162f2c7542e65df16935fd486ffab362e2a9ebae55bff3ab7415a93da3219b1d1ac86486403136cacb4d6be63901fa9cc6123a10beb2db7490a26631c9f43c0ce575032bddf888bdfa5fcbd446cfa75393bc3cd257672c000f491feeb04804f0ade19552a03a5f2e706ebfe4fc9088deabf07c09520d469d04e67956b14720a3cf92ae50d3738477d7438d3c210598f97e9634c610e2373fcc4bd0f63b3c726fb144e40ad63b1b5410910e2aaf85137a600d5482060e11238b75d2b1d15fed822c03fcc4764273459c683ef1bd828e8ac42dc573c046fd373956a9bfa5f060cd62973fcf2054bc7deec6bcc0650fff0e9a36ee212c36d3016ef85c0f0c1755b2d0528b0a41da907ca5195f1781b81c4e17041889eae464f0ac51d83d8739cb25a81b96477a7c0d9a1240e17cf37f116fb1fec9703e841891ba28ce6ac4fb15efc96a09b8758b127aefe72438723ad0dd0adfb6d6d6621349ec7b9a1b6ea5d1d4853c863bf892841d76cb50a9d0091e36fda0119c24207471b9ba6648204b7aa745a0e0507ac704f8cbe10402248e4c2dcf1d0b7366ce0114510bb22b91694ec104b2c20e9a0c62b23b5775a17ddfb1d040463bd492b63cc6d287166224b2fd48c710858e2485374cdd34a21bc516f841c97b35e15bb18ceb93b9db34412f2e4ab0036cf5fd254d3968fa60caaf88722bca94560d5e726d7190bd3954d23d2c708818f3023195d1b3306bf7b723e8ce4dc8c1e8b1365c383395e66de0facb7e344854e8f69aa178146d0ec31b3f46fab6e1c0949f07858919180fb49cc3670996606b342d4857e460d5efac917516ff56170a9465b479cebb28d05aaa52b771986049ab6e726577059dc2a98ae3aef76f05b62bfaabb9afc8cfb2c8697c6b8f709c5b639769721889ce1ff1a022f86dbcba4b749ef270bfc5cb1354bf6ef6a18f9c2ddfe10971d46a8663b8a720e48776097e47e514c4fa9fa8ea547c26b8f4700f01c29b194574235040b58df1b7db5435059a82636b3e67abd91e32ed6073dfa1a585ce6eafb1bd79eebde40683ff578b4a70d46a58f1169b40890af1e343c3db285e078dec7cf6d83f892748050b13da805202dd8d8d6db1a2ede81376f521750bb48d293c0ca8c7add2803bb80748df85f9371f92e19d729ca5fcf8a33906e733f11e5843e1a81522ff628b940fc37ebdb002d2ade1b570a601d364e46f221ec74f403890f02fb9dab318254c13c82670acbd428b1376535c6037aed8dcf830cbbd2c6e575edaca71820e5753d2dd72578666202686ec9e8d8dbba436f2a4353b56e8f3a5b8757501cb9750b02aca3b6d5e12aa6e42124f3e687049e379d2a8df8a51cec8b15702c1ef0d914652161904bf73d066ce25963f0d80cd738adc7cb0b7fb102a29896a26f2fa4654c9a365340964803bb3d5a42627d9d887f0c33dc5a7a86093ce3a35b3d1e6a0280c4088edd39ecdd6b5cd1c5e79a13bc06ef623dc23575456195ce028f051117240af5a0eb4bd773bdf52402424613bc7435c1cb61d3c915b5773ec6bee98a98dc96929a30828824490b699b22c35b2e740ffd086508ac86db92e296688c0e1281bedd4571ad1370287dd18f0361bc38df084bfd0120f59c15d327341944d466804c8fed587cb3a09febb9187a40d0874ff56812f80e6ee506f73fd2151a1d396439b5245b602afc8e939d1d46b87e214b40d773e45feb822e6c5100a58e2a9f028ca29d44ce111181fa97a0708f84b79e80a39381645ae0b07eabdb52e6b1342c78804084e0a28dfce552c89046888fc1dc988465c16d9613e4c4d81f74d41f9b0fb208b13db987035cdcd5b45ca4b8f0123b28f3fd76d18cb9efbbdc49034d6319f042cc499510df5ad1912593c0cc7d5f1d043b11c69df8502d1da41ca9657de747e3ef546e9c5fff589e8dc18b961047f6e531334f4834ee0994e0be2ae03162c5384f1d29acea9bb8fd03ca69c1ddc3c15eeb1443036ee6cfd38422855d64b6489e5c6756435a0c7a1a2af51137e45387b30e9fc0c5fd322b4f6662903ade5058a55ac0f64a79ca09a2a5c5046dedba9e8b23401e5ab61099e5de1f62ff810d77c949f2e24ba18b46b58d750ebcfc1457651ce06182a50f925a44306267077ed810be8afe3f513d8502260dc3bd3a7fdbbb6da8d2a01e2bc378b294edc23b467b963ced4d8de244debd2b5e3ef3a6e4d42e7a5f7e210fd01e47ba1b98310c087da98d49b37591a401d6cebd7048d85c926e30525362103d5020d0ce43b834cb282e7f8444800296c50584dbd6cfebc5728d805a0d066abbceb2efb6046195a6f0dd7548094836128de2ed099b99d5edcb9134ce11ad46a4d6353279134aae715136f1a9bbf999c5c08a0d012d732cd696ce1d49289c595614e42a164492883dbbb533522298dc819adb308a15f4d4d0f014e18f25b8802c680438bdf90b2e6bcc405a5c4acba3389725eaa37af55d1a5b2191373ee610b7247e3b85ba5719c2deff13f076259e8aafd6b0c96dc823e718db1e9368ea4d2cde6a2a08e92a992e38a823b0c3748de7e6693ebd1621383a6b70bb24d514cbc6128b65f4da9c97622245e64e8f08a3717e6207b699b92d618a911b09ae5ebb8d986bc59ad168cc6dbe0c5fc4ef9043006939f18b103cea8520d364bd1f1edc06cf0522dc79a7b5a277e3297bcffc062012ecfd603ca07c1ac8b91c51a625490dfc48fcbea01eddbd6d738a5b91ec0606e7c4f397ca3b0d3dc7ad5765be2e80e40e051ff5efc2b113d119fa59a95950ebb55e236b279b53ebf4dd528f95a7bd414bb3e6a14792eb5f425bfbc142649179aecb7a8b27e5604266447ff0f12b6d5ae464ff70e6df144bfbe18c662f9ebf0ce564d889e8fadfd5b6d21f8f56aa4f397e998d9529c0a9e7d75206c8350c9292304de115f6d35032886ddb30136983e10e5ce15ad2b836746ada77d109e5d2d25da8c7de18ccf50f9e8a997fbbd7da865c452eacca1f0acee2ab2fb28acabefe8bb17dfdcb91b73bf0bc288140a6cf6699f9fa0fa07cc00c1f3c6470ad4e0074a4b121df31607eb746c8c54dcacbee4b8263b387dd9917f2497b693f66948568a840c2ba5bd227429497fb0f689e817bdb51c651ee82c8628e423e1c46af9e86c61b00093ac06763fe4609a10670bfd7e3de9590567d751fd346ac95822413100d5cf5c521ef75413b2b21587f2b290c01005140ab2d01f247ec373661adff6566140b55f3baaf937f1bd3f4b314bef023aa3fa70935a7ac45de5d9f61fad9abfa3c043147a165835abe23ad5b90fb3326bb602203d2cfa5476b23d1cb681bd8eea47e1bdb802d3b91f5ad78c5331299a51113344a395b7f4d86e8baf501dee94b9f30a9b8f7678831e817e2ab957ccc2619a1394cd3fe76eb15ad2bf67bd4386f6c3f063bd79918a289c291d8c9242a7a6507d9fcc8499e26bfb45a8c18168b9d2f7a2afbe6ab68ca692916613f6a18fc002ea8803f924bed9fd04270154e3a066e304034c6010ff242d2f429b651f29dc0a6625561f7033a2fe7435a12307cd03ff4bbda6110ca434e491873d71a519c980ef6e3e5dd2661753d1aaa20245864435ea3b7af8c0b176692398afb84a52707b5743eb6b8a0653f65bcc39bd5528110dd784697f81d9b7e4d615006403b0a3999b2bb4013f201013a29e33e81466326eea68189462e6aa13e86f9bf9056b41a606bfdca4b1c21820502f939b78228a48de48d63dc5616a34400f709562c09a7686d6c4e003213415f5d1cc78b94743e9aa4b200f971b474cbe6b640627cb69818b86443da1cd3063e5d9afedd0d5cbac09f59c689e43cd19be6c4dc76841bb8647459e612e0bee3ef6121b3b8e94a91084b0c133ef60ffbd804c7286411fff0ca1ba5383faf1ab04237f37557d0886246b1460fbc17302ec6477ca99ec91ddf9ff2469e4a1520f2b10ed576d6498fab84c16210d20cf596e2b0166fe3ee4564d8ae6ddfb11c96470e3f409b66fbad3c81a9ec2a209b4571a16dfb4d81a7724758108a7bf8768418e45bf7bddbe9bdd2276b992550ed12bab2bac0d3287e17bb823cabb7381a31eab7aa1f6d66c558cf10da82affe2640e29a38144dfb7a0e37630c443cec076978179495d3b0324881923915d4ac164ef42d504f95d4547760a0d4c35c4a510c431913b04896f76eb937edd710598d466801ea0f24d432ff701559021a261725ff7d4826115a302ad196ed28e26274d8e3446ada9e3ae0742cfb24d8ad3d9117f6a34794da751f5e51886d146859f0091059fa64977da7d69a21d374a1a00dbfb5648d05473a1d7de292d0008ebd2cdda862900d7b772a13b27d2da13377f4d57a5a10857c7b7a0cb65cdd66bc7e66346d739b25f1f317f337502a6e82c95d4e60b53a4805cb77a4c1e27ca665672fe96a03a5d33c0ccc66292b8fa2d6a581f7ef9d59b20bad52b504bee8cc52b4d4102cdf8eaa87e2ab84fc351b40b9097cf69ce51bf1f77df4b2cf0d6d3d70f99df1aa73bc18b2748649381ad6fe2dadd4d1db85fbbe917753badb717848bba399102717ad72a67d37da5ac0a23126a1e77cc42fe83f761f54c25f5ee2aa18f692185c0063439eea3f57870cd44e2c87f77c8bbe9a67a644bb59a4d07ad5fa441bb578a846256360268a86bd624f492228400b3a4a380ea1ffe38447675d73a6dd1b3ce3caad35cf4d15fa7939a9697cecb3ace0f3649420ce0f987357779c07a10e0203e40b4a8836ab4a6637d852b99633665e85e116fec0dd97b27956b99ab69ebf5a7651fa8e26640c0ccdf43303fda234975a7ffe5dca0da375d2a98f463dc4a162bc416013253b74ed9faa4795fc242ddadb79c2ac5cadd36211e4035dc36af08ac2a1e8136f8ca0f0ae0cdfbce9b081e0353df5baeed320ffd1c87ca038a6307671bb26199bac09d4d7b03230936184815caf56072d0d9d96cce0a51af90d6b92444c099644b266bcbd544e299b9f78ad03a314299905574a8e4bcb8760457d7eed1293309e65958ce752e14d83fa62ccb57726a0b3562550e5198400e737746b4da3b1b6575dbd5f526b9a216dc2be9034e2f84b97d9c8e2f3d32ce459c4ca7b3ba87ddf55bacde0ee00a1d1c7617b2443d0753016f4fa69466a3b9ac5cccc2c45ec53d9d50e9ac0945d11004a2424150ebb74bc4ddb20b411b94c6e5cc966accd6c4944e70c6e77f45c7b586e72de3f0850e0284fcee010729cf8a08b5ef3b941353a50acc2a6d060a8fe2c047f83362d2cfc1cc4c710a3f5d7b49d0234784ae090d8d0971fe3198dd797c3b24df315cdd074cb399078a305d4f73b0c00ff9164880b30db280ad9f878547642dbd130fa34dc74b7a2a0a39503a2cefde7a1083121a266d81d6f83aeee83ca75de18b7585a4b9d6240f04688b97ec14be987a3beb00789ee433e960604ff91d80792636a4baff41709e05a7b6bd4211726b8d43d621140b680f89210a5c24e43773e39f73774b7288a859f2db37dc3ab169b1cff1db7870272cbd1e3694105496deb2e5268f5042dc423d1d0264fe2a8341e5b3286e88cc7210c90d3e9386f43bc76b61e0296ac54f1079247f385bf543c308473a9e1a97a88d9de21b99494e75e5b55573d0a5348572554d25baeab9073ae5967ef492ae403fb89bbd6ed2279a42367096c0bf4e0c6b5f3109ce552b0bc1461f781d7b59cdc90f5661287684ca5544b8b3a79bdd0f9b2ec7e10baa21536e5bd709694d65b9f2d5f4d555a8eaa75b113a5e986fbbc9d55a8f664cec5d0989f054a6f00b822631df992cc8afb8ea7b40c885bcde8ead63e693e327ce42a9be3092b7f13eacbbc9dc6f521b297bbf931f4c1c21dd04d0782ab2449c1222ba8d768e6212d30ba1c753659c72ebca2eb0a7eea6698ec4cc862ec931d1c23a9ca4e42a540bf38da56802c4f5a63aa8fd19368dbeb468e821dbd56410bf8e22acd3aeb354ac88e4370128ccdf28711dc6c578984bcada35b70506dd1cf986081b08a2a0d8cbd95e68773a128f5194b69dc11c21d4b10d452285e22fd4522ea316c82f14ab889d7cdd11216dadf96a6c44e3933cb169c8f5292e2f60abe3c9a8d4ed2565c658404cd759dc097bdb0a51bf54ec9add06b4020add7374b9b33a2c6db36491bbc7fc69903150efaff1d5190f76a1466a2dcc0038d3a240ea1469eb66d3a369b8448ce18f5e426e9b2c4c1edda198d76bd27f7bb709d21c332636dc12b7b0052f9ea81905461ea1e8c1121aeaeff866e0b14a38736d9c9919199c1c4f144fc6de69cfaf62d5de22e263e4f971dcf629d89f6b934fd2a79c9e74136a9ed779c344ab78323f06f508df444e7b99ec7d3e2825d51b6efd1869ce3436324693c8fc0989a708598c05387b71189e3629fcae7c4ad00681d83fb3dd1014bbf6ab8cb00bb579a7e4ac514f493ee5c6de9b33878750a5ade49d4388711750318a730aa0518e49be6dcec13c53855caa13eca6328eef713243574ab14db0d8c76c8de9aaf636a0e17d774996863e2c4c57ada5d50c6b2d81fa74e308c331ec5dd145942032e071d539b74e21c14bad6c230eae1ac9184e63699e3daa2130731382b76a205e069c2e511d653fdfe3d2a52e2e5b75fbaaacd3e5ed909801c3a7c6fc3551073bb452c08843a3dc08daf0503e4640c5edee7c526035c9fce789d383c2d90e67862d37639bf756708012b4a811b84e3316284c1616e32281d6bfee56965502a360f692c8c1b7b9c210a8e5fbac96de5bb5859c6158c878741a7bd733b51015328952aa67b897ce87be4c91666ad68dd4d5355556064f988b6382b92c29251947ee71529e01013bd7e245babeea06cf708d8d130bc5b34172bd7643c2162474fc53e5c350b9855b8c12fe1d8cea13b591c48924584b26e4b4791f308833de053eeeae4e4cd4b98a9464de54ac18184b1aad4fddcd397a65fa0c1c240049d584701c448ff707876dba0687d1e228c743ccc66f91028c375e89b28a4d73ae006d1331ea707907de43ed431d44897a6392bfe12b6cc0fdf7a470d082bf1435d3b0ee659263edc8f106e5deebfb0a29a3c8d4b428998109104443a0a0e94880233a88c1e9b0ea03c58e929f8c52a00b7e96fa20739ee1bca1a75d1c3998445aade80197b114ae72c66102f514dc016ec6d8de89103a72a8d5d44893517aca077f171ccb92f40006632653bac6a3c13762abce941af1f9de619eb1a1226277d9b26628035e9296308326d5a9f351f5310699cb95cbbbb00eeacc16305cf35a0e2fd21729c03a85823834e00ef339fa06622927d302ff53202765d126650484e9616259bcad6205f7e0e9732bb650628497d6943318afb39c305d008fb370f9d4dc0cf5db9bae408df9da9a4842149060260670c33b03cd516db7cfe6983d37efa44d388ae51a5c1b0a841e3217772f3ed4c1ee73352c4402e72d58539c639242ae037d855a05ee44edc824850ae7baa7c186f32382ab2d280e62a9e973788aaba142e4c5f39598931948318bdd3f05e2b6cf12c019d21e42900d91cf7d085351b0d9865a17870c4bf5da7217141a267ed5965ed34f75fcd46412927da81da2b1a058e70eb8ba30a05a77986ce485d25a4b127ca2f675c1e6888d15dd9d598bce046ac8a878c0927cf117651c710aa868d0138fb81d3517e326fcd81680f9751dd8d1f2b4abab3f70e4faf06cf8f8dc62264610711e51a8ea86a0cab45416d8d56cb7546c2eb0817fde6e8b61353c725d282cb06a17a1a5ce899574cf25d1412e0af1a34874c5a5afc9d322af4e5c38eb23114ce698f37494aa99966e67010f6d30d81e4d57fef3feeb0206a75e5334c0fa0ece07152b277100c867949d0558563416a85ed687993900060299077fe8c15cef003d5b928a0ac520f40129f069ef8ec98803676927fd18b7d050e530b397e12ebdbf4e67085a8756a06bee2b97e59d24911f5d2726eb92942c3c5793cea5a6a6f0f41eb235230ac5219e7dff7a280054b7fb05d2859b0221dba8394df9f1fb59fee6e6944b7022c57da72035a385d0270ed552116123eb9839e63124630271b838087dd3a064e40f12f5d2ba4462886faf695274e7c6605ede79817ebe05ab966bb35ccda357d488b1c7590be3000a150aa6376fae4a3d4b9b46a125d08b92384442ae7a8806ec6ae00cde88d3945063022df334200c090e72329b45a0007115788ec5638e1295f78b5384fbf6a5383c4e8b7dc020a58d968b4b28447f238ec94731f52bd83c0cb944538c4c4ba894da9380358d72c451efd333bba49263324b133c9c362b44c2c55901895f2764580f491ba97e4f6148929de6e81db189cb1e7265fdf75dea4da87f9c1dd03a9fa8f4436e38ce7c8ff50866cd1e0f2f52f693fade836b9f4d92ce8e93a5b7f3a0134d7472c26c0598b089da508fab09e10a88464d6b0e2f0b96b01df275f25701cf6cb00878feb3358945dba982c73b0c62fe6d404a5f26ced7263aa59de64489eef6d5c0056b5270f18c0c262f957175e613e915875fe894393efa06114257ce349a8b2c5b61a6b396334456e16d248edc126f92c39779a7cfe5fda325a3d6ddcda51a86af5c673b40aaaea232d2a7da99527fcf2e58d570e4e21844d250c30550be06567a8a329ac9cc81581bcacd1fdbc92c02fe3b5b045893dd7d764e7f7f811b3899980ecc94067e21a742dde7ad8d51210ac0378072f3433fb3f7042e3ad01ed7f5dd0286a3fac3a1d9ad14d625e9fda5a82672e7264c69e79e259926b110803ccd33dc7c05e9ed71c3639bf0e7c74af985ab39060180c7fa627379e38e4a31be87b446bfc5a857b103c01906a08e6187ebba2fd528623a0360c2f7352a3aa501aa880ce53c16e8524fb59c100531a087e6ef2ceb8e47e17ef661b9ac7ce125d148b3c380f28c14ead0d67508582b7a0b07752c82634b92ea35297f75137efdf4f2624ad24c2e75f34f68da16f8f5db5b25fe09426963e9a0b4030a35fbccd12c11dfff20c344cd0955435d5ec9d8d60613c8eca874f999a7989d45d6e046d078a3c44dcfb94178ad804ddf7dee6e95f986e81194349a25c7241935473fa93749bb212a397f1372fbb9922d09b266c123064cf984108cd8d428bc15b4171bfde1bd0acbe0eccda7ada25e24f85860bce4b29061dd09fb81379a4fea9f5199a4367e41057c17caec94c6d086e1ccb867292485d61532755e8ea441865450150c539bf65a07ff38f668929fedec0d21e0c17906b36623020244cc7620494f9fb6ad8872a50200f40ccd6d6135d580626926e34c628a0c38a8c5a4c237eddc28d0c17055f7786127d69887a0c78af9d3c9ed2c57c457c26cbd4c512e3843d42072d3f0bd3617795a2744c7894616166a4ac9430b67764ce5e01525b57f105d92e6393b272190e4a4e41d2e9ebe324e41ed1934edad3a30ee2fcde0d01cc3a85d986a7a72bd012271b9541f5178f07e6ace39dfa2804495ad17aabc94dcff0d9997703e26298167521dd45b344210b327e91964e7ca7e76053ddf4548e0ac2cd5c8a70cbf746d0d2aa4c87e08442406010c499842ee1402a8f8551993ff7414434d8894ed0025fe40f9071b16c4ac75c0b1669954ed6fb2", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a6772616e6470615f617574686f726974696573": "0x010c88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee0100000000000000d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae690100000000000000439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f0100000000000000", - "0x3d9cad2baf702e20b136f4c8900cd8024e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3fba98689ebed1138735e0e7a5a790ab4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3fba98689ebed1138735e0e7a5a790abee99a84ccbfb4b82e714617e5e06f6f7": "0xd0070000", - "0x426e15054d267946093858132eb537f14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x42b50b77ef717947e7043bb52127d6654e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4da2c41eaffa8e1a791c5d65beeefd1f028685274e698e781f7f2766cba0cc8300000000": "0x0c020000000000000001000000abc3f086f5ac20eaab792c75933b2e196307835a61a955be82aa63bc0ff9617a060000000c90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000000000000000000000000000000000000000100000000000000", - "0x4da2c41eaffa8e1a791c5d65beeefd1f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x4da2c41eaffa8e1a791c5d65beeefd1f5762b52ec4f696c1235b20491a567f8500000000": "0x00", - "0x4da2c41eaffa8e1a791c5d65beeefd1fff4a51b74593c3708682038efe5323b5": "0x00000000", - "0x50e709b04947c0cd2f04727ef76e88f64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x5f27b51b5ec208ee9cb25b55d8728243308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x5f27b51b5ec208ee9cb25b55d87282434e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", - "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", - "0x63f78c98723ddc9073523ef3beefda0c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6786c4cec8d628b6598d7a70ace7acd44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6a0da05ca59913bc38a8630590f2627c2a351b6a99a5b21324516e668bb86a57": "0x00", - "0x6a0da05ca59913bc38a8630590f2627c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6ac983d82528bf1595ab26438ae5b2cf4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6cf4040bbce30824850f1a4823d8c65f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x89d139e01a5eb2256f222e5fc5dbe6b34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x928fa8b8d92aa31f47ed74f188a43f704e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x94eadf0156a8ad5156507773d0471e4a16973e1142f5bd30d9464076794007db": "0x00", - "0x94eadf0156a8ad5156507773d0471e4a1e8de4295679f32032acb318db364135": "0x00", - "0x94eadf0156a8ad5156507773d0471e4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x94eadf0156a8ad5156507773d0471e4a64fb6e378f53d72f7859ad0e6b6d8810": "0x0000000000", - "0x94eadf0156a8ad5156507773d0471e4a9ce0310edffce7a01a96c2039f92dd10": "0x01000000", - "0x94eadf0156a8ad5156507773d0471e4ab8ebad86f546c7e0b135a4212aace339": "0x00", - "0x9c5d795d0297be56027a4b2464e333974e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x9c5d795d0297be56027a4b2464e33397f43d6436dec51f09c3b71287a8fc9d48": "0x00000000000000000000000000000000", - "0xa2ce73642c549ae79c14f0a671cf45f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xaebd463ed9925c488c112434d61debc04e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xb341e3a63e58a188839b242d17f8c9f82586833f834350b4d435d5fd269ecc8b": "0x0c020000000000000001000000", - "0xb341e3a63e58a188839b242d17f8c9f84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xb341e3a63e58a188839b242d17f8c9f87a50c904b368210021127f9238883a6e": "0x0c90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0xb341e3a63e58a188839b242d17f8c9f8b5cab3380174032968897a4c3ce57c0a": "0x00000000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x55a0acda6b9088a60000000000000000", - "0xca32a41f4b3ed515863dc0a38697f84e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcd710b30bd2eab0352ddcc26417aa1944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcd710b30bd2eab0352ddcc26417aa1949f4993f016e2d2f8e5f43be7bb259486": "0x00", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xd17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ce4f6702f7c0a2951e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500b42ace3b5fab73c6265656684020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500e3a507571a62417696d6f6e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500e9b1341d066bc7162656566840389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195021cd04f63ad37128626162658090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950246b6699fb8b8db670617261808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19504a8e42157609c6c86173676e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505905fe216cc5924c6772616e80d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195062190f64559b55c9696d6f6e8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195066b8d48da86b869b6261626580d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950721887aafd517d296173676e8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195079b38849014a07307061726180d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508b6d3621e5bd57f16772616e80439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509d4a4cfe1c2ef0b961756469808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bcb9c3677bfe9155706172618090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c0cadce9c18510226173676e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c7e637254b9ea61962656566840390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c9b0c13125732d276175646980d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ce1dd85a539ac289617564698090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d62c40514b41f31962616265808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed43a85541921049696d6f6e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5537bdb2a1f626b6772616e8088dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x0cbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25ffe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x0cbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ed17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f271e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd8bbe27baf3aa64bb483afabc240f68e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd8f314b7f4e6b095f0f8ee4656a448254e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xda7d4185f8093e80caceb64da45219e30c98535b82c72faf3c64974094af4643": "0x0100000000000000030000000dbfa19dafecc6c6c04586ce02ad17e404dd9aa1ddde5521f3169b192ca4a699", - "0xda7d4185f8093e80caceb64da45219e34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xda7d4185f8093e80caceb64da45219e3c52aa943bf0908860a3eea0fad707cdc": "0x0000000000000000030000000dbfa19dafecc6c6c04586ce02ad17e404dd9aa1ddde5521f3169b192ca4a699", - "0xe2e62dd81c48a88f73b6f6463555fd8e4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xed25f63942de25ac5253ba64b5eb64d14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xedfb05b766f199ce00df85317e33050e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf2794c22e353e9a839f12faab03a911b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xf2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13": "0x00000000", - "0xf5207f03cfdce586301014700e2c25934e7b9012096b41c4eb3aaf947f6ea429": "0x0100" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/cumulus/zombienet/tests/migrate_solo_to_para.js b/cumulus/zombienet/tests/migrate_solo_to_para.js deleted file mode 100644 index c43e36e837dd..000000000000 --- a/cumulus/zombienet/tests/migrate_solo_to_para.js +++ /dev/null @@ -1,57 +0,0 @@ -const assert = require("assert"); -const polkadotApi = require("@polkadot/api"); -const utilCrypto = require("@polkadot/util-crypto"); -const fs = require("fs").promises; - -async function connect(apiUrl, types) { - const provider = new polkadotApi.WsProvider(apiUrl); - const api = new polkadotApi.ApiPromise({ provider, types }); - await api.isReady; - return api; -} - -async function run(nodeName, networkInfo, args) { - const [paraNode, partialPath, soloNode ] = args; - const {wsUri, userDefinedTypes} = networkInfo.nodesByName[paraNode]; - const {wsUri: wsUri_solo, userDefinedTypes: userDefinedTypes_solo } = networkInfo.nodesByName[soloNode]; - const para = await connect(wsUri, userDefinedTypes); - const solo = await connect(wsUri_solo, userDefinedTypes_solo); - - await utilCrypto.cryptoWaitReady(); - - // account to submit tx - const keyring = new polkadotApi.Keyring({ type: "sr25519" }); - const alice = keyring.addFromUri("//Alice"); - - // get genesis to update - const filePath = `${networkInfo.tmpDir}/${partialPath}/genesis-state`; - const customHeader = await fs.readFile(filePath); - - // get current header - await para.tx.testPallet.setCustomValidationHeadData(customHeader.toString()).signAndSend(alice); - - let parachain_best; - let count = 0; - - assertParachainBest = async (parachain_best) => { - const current = await para.rpc.chain.getHeader(); - assert.equal(parachain_best.toHuman().number, current.toHuman().number, "parachain should not produce more blocks"); - } - - - await new Promise( async (resolve, reject) => { - const unsubscribe = await solo.rpc.chain.subscribeNewHeads(async (header) => { - console.log(`Solo chain is at block: #${header.number}`); - count++; - if(count === 2) parachain_best = await para.rpc.chain.getHeader(); - - if(count > 4) { - unsubscribe(); - await assertParachainBest(parachain_best); - resolve(); - } - }); - }); -} - -module.exports = { run } \ No newline at end of file diff --git a/cumulus/zombienet/tests/register-para.js b/cumulus/zombienet/tests/register-para.js deleted file mode 100644 index a8fbab946731..000000000000 --- a/cumulus/zombienet/tests/register-para.js +++ /dev/null @@ -1,20 +0,0 @@ -async function run(nodeName, networkInfo, args) { - const paraIdStr = args[0]; - const para = networkInfo.paras[paraIdStr]; - const relayNode = networkInfo.relay[0]; - - const registerParachainOptions = { - id: parseInt(paraIdStr,10), - wasmPath: para.wasmPath, - statePath: para.statePath, - apiUrl: relayNode.wsUri, - onboardAsParachain: true, - seed: "//Alice", - finalization: true - }; - - - await zombie.registerParachain(registerParachainOptions); -} - -module.exports = { run } diff --git a/cumulus/zombienet/tests/runtime_upgrade.js b/cumulus/zombienet/tests/runtime_upgrade.js deleted file mode 100644 index 7692d3cef34b..000000000000 --- a/cumulus/zombienet/tests/runtime_upgrade.js +++ /dev/null @@ -1,24 +0,0 @@ -const assert = require("assert"); - -async function run(nodeName, networkInfo, args) { - const {wsUri, userDefinedTypes} = networkInfo.nodesByName[nodeName]; - const api = await zombie.connect(wsUri, userDefinedTypes); - - // get blockhash/runtimeVersion at block 1 - const hashAtBlock1 = await api.rpc.chain.getBlockHash(1); - const versionAtBlock1 = await api.rpc.state.getRuntimeVersion(hashAtBlock1.toHuman()); - - // get blockhash/runtimeVersion at current head - const currentHeader = await api.rpc.chain.getHeader(); - const hashAtCurrent = await api.rpc.chain.getBlockHash(currentHeader.number.toHuman()); - const versionAtCurrent = await api.rpc.state.getRuntimeVersion(hashAtCurrent.toHuman()); - - const oldVersionIncremented = parseInt(versionAtBlock1.specVersion.toHuman(),10) + 1; - console.log("current", versionAtCurrent.specVersion.toHuman()); - console.log("oldVersionIncremented", oldVersionIncremented); - - // 2 == 2 - assert.equal( oldVersionIncremented, versionAtCurrent.specVersion.toHuman(), "Running version should be the incremented version"); -} - -module.exports = { run } \ No newline at end of file diff --git a/deny.toml b/deny.toml new file mode 100644 index 000000000000..264a37bd9893 --- /dev/null +++ b/deny.toml @@ -0,0 +1,202 @@ +# This template contains all of the possible sections and their default values + +# Note that all fields that take a lint level have these possible values: +# * deny - An error will be produced and the check will fail +# * warn - A warning will be produced, but the check will not fail +# * allow - No warning or error will be produced, though in some cases a note +# will be + +# The values provided in this template are the default values that will be used +# when any section or field is not specified in your own configuration + +# If 1 or more target triples (and optionally, target_features) are specified, +# only the specified targets will be checked when running `cargo deny check`. +# This means, if a particular package is only ever used as a target specific +# dependency, such as, for example, the `nix` crate only being used via the +# `target_family = "unix"` configuration, that only having windows targets in +# this list would mean the nix crate, as well as any of its exclusive +# dependencies not shared by any other crates, would be ignored, as the target +# list here is effectively saying which targets you are building for. +targets = [ + # The triple can be any string, but only the target triples built in to + # rustc (as of 1.40) can be checked against actual config expressions + #{ triple = "x86_64-unknown-linux-musl" }, + # You can also specify which target_features you promise are enabled for a + # particular target. target_features are currently not validated against + # the actual valid features supported by the target architecture. + #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, +] + +# This section is considered when running `cargo deny check advisories` +# More documentation for the advisories section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html +[advisories] +# The path where the advisory database is cloned/fetched into +db-path = "~/.cargo/advisory-db" +# The url of the advisory database to use +db-urls = ["https://github.com/rustsec/advisory-db"] +# The lint level for security vulnerabilities +vulnerability = "deny" +# The lint level for unmaintained crates +unmaintained = "warn" +# The lint level for crates that have been yanked from their source registry +yanked = "warn" +# The lint level for crates with security notices. Note that as of +# 2019-12-17 there are no security notice advisories in +# https://github.com/rustsec/advisory-db +notice = "warn" +# A list of advisory IDs to ignore. Note that ignored advisories will still +# output a note when they are encountered. +ignore = [ + # time (origin: Substrate RPC + benchmarking crates) + "RUSTSEC-2020-0071", + # ansi_term (The maintainer has adviced that this crate is deprecated and will not receive any maintenance. + # Once other crates will move to some alternative, we'll do that too) + "RUSTSEC-2021-0139", + # deprecated parity-wasm (origin: Substrate) + "RUSTSEC-2022-0061", + # atty (origin: Substrate, clap) + "RUSTSEC-2021-0145", + # wasmtime (origin: Substrate) + "RUSTSEC-2022-0076", +] +# Threshold for security vulnerabilities, any vulnerability with a CVSS score +# lower than the range specified will be ignored. Note that ignored advisories +# will still output a note when they are encountered. +# * None - CVSS Score 0.0 +# * Low - CVSS Score 0.1 - 3.9 +# * Medium - CVSS Score 4.0 - 6.9 +# * High - CVSS Score 7.0 - 8.9 +# * Critical - CVSS Score 9.0 - 10.0 +#severity-threshold = + +# This section is considered when running `cargo deny check licenses` +# More documentation for the licenses section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html +[licenses] +# The lint level for crates which do not have a detectable license +unlicensed = "allow" +# List of explictly allowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.7 short identifier (+ optional exception)]. +allow = [ + "BlueOak-1.0.0" +] +# List of explictly disallowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.7 short identifier (+ optional exception)]. +deny = [ + #"Nokia", +] +# Lint level for licenses considered copyleft +copyleft = "allow" +# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses +# * both - The license will be approved if it is both OSI-approved *AND* FSF +# * either - The license will be approved if it is either OSI-approved *OR* FSF +# * osi-only - The license will be approved if is OSI-approved *AND NOT* FSF +# * fsf-only - The license will be approved if is FSF *AND NOT* OSI-approved +# * neither - This predicate is ignored and the default lint level is used +allow-osi-fsf-free = "either" +# Lint level used when no other predicates are matched +# 1. License isn't in the allow or deny lists +# 2. License isn't copyleft +# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" +default = "deny" +# The confidence threshold for detecting a license from license text. +# The higher the value, the more closely the license text must be to the +# canonical license text of a valid SPDX license file. +# [possible values: any between 0.0 and 1.0]. +confidence-threshold = 0.9 +# Allow 1 or more licenses on a per-crate basis, so that particular licenses +# aren't accepted for every possible crate as with the normal allow list +exceptions = [ + # Each entry is the crate and version constraint, and its specific allow + # list + #{ allow = ["Zlib"], name = "adler32", version = "*" }, +] + +# Some crates don't have (easily) machine readable licensing information, +# adding a clarification entry for it allows you to manually specify the +# licensing information +[[licenses.clarify]] +# The name of the crate the clarification applies to +name = "ring" +# THe optional version constraint for the crate +#version = "*" +# The SPDX expression for the license requirements of the crate +expression = "OpenSSL" +# One or more files in the crate's source used as the "source of truth" for +# the license expression. If the contents match, the clarification will be used +# when running the license check, otherwise the clarification will be ignored +# and the crate will be checked normally, which may produce warnings or errors +# depending on the rest of your configuration +license-files = [ + # Each entry is a crate relative path, and the (opaque) hash of its contents + { path = "LICENSE", hash = 0xbd0eed23 } +] + +[[licenses.clarify]] +name = "webpki" +expression = "ISC" +license-files = [{ path = "LICENSE", hash = 0x001c7e6c }] + +[licenses.private] +# If true, ignores workspace crates that aren't published, or are only +# published to private registries +ignore = false +# One or more private registries that you might publish crates to, if a crate +# is only published to private registries, and ignore is true, the crate will +# not have its license(s) checked +registries = [ + #"https://sekretz.com/registry +] + +# This section is considered when running `cargo deny check bans`. +# More documentation about the 'bans' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html +[bans] +# Lint level for when multiple versions of the same crate are detected +multiple-versions = "warn" +# The graph highlighting used when creating dotgraphs for crates +# with multiple versions +# * lowest-version - The path to the lowest versioned duplicate is highlighted +# * simplest-path - The path to the version with the fewest edges is highlighted +# * all - Both lowest-version and simplest-path are used +highlight = "lowest-version" +# List of crates that are allowed. Use with care! +allow = [ + #{ name = "ansi_term", version = "=0.11.0" }, +] +# List of crates to deny +deny = [ + { name = "parity-util-mem", version = "<0.6" } + # Each entry the name of a crate and a version range. If version is + # not specified, all versions will be matched. +] +# Certain crates/versions that will be skipped when doing duplicate detection. +skip = [ + #{ name = "ansi_term", version = "=0.11.0" }, +] +# Similarly to `skip` allows you to skip certain crates during duplicate +# detection. Unlike skip, it also includes the entire tree of transitive +# dependencies starting at the specified crate, up to a certain depth, which is +# by default infinite +skip-tree = [ + #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, +] + +# This section is considered when running `cargo deny check sources`. +# More documentation about the 'sources' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html +[sources] +# Lint level for what to happen when a crate from a crate registry that is not +# in the allow list is encountered +unknown-registry = "deny" +# Lint level for what to happen when a crate from a git repository that is not +# in the allow list is encountered +unknown-git = "allow" +# List of URLs for allowed crate registries. Defaults to the crates.io index +# if not specified. If it is specified but empty, no registries are allowed. +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +# List of URLs for allowed Git repositories +allow-git = [] diff --git a/deployments/bridges/rococo-westend/README.md b/deployments/bridges/rococo-westend/README.md new file mode 100644 index 000000000000..c7b28853223c --- /dev/null +++ b/deployments/bridges/rococo-westend/README.md @@ -0,0 +1,22 @@ +# Rococo Bridge Hub <> Westend Bridge Hub deployments + +This folder contains some information and useful stuff from our other test deployment - between Rococo and Westend +bridge hubs. The bridge overview and other helpful information can be found in +[this readme](https://github.com/paritytech/polkadot-sdk/tree/master/cumulus/parachains/runtimes/bridge-hubs). + +## Grafana Alerts and Dashboards + +JSON model for Grafana alerts and dashobards that we use, may be found in the [dasboard/grafana](./dashboard/grafana/) +folder. + +**Dashboards:** +- rococo-westend-maintenance-dashboard.json +- relay-rococo-to-westend-messages-dashboard.json +- relay-westend-to-rococo-messages-dashboard.json + +(exported JSON directly from https://grafana.teleport.parity.io/dashboards/f/eblDiw17z/Bridges) + +**Alerts:** +- bridge-rococo-westend-alerts.json https://grafana.teleport.parity.io/api/ruler/grafana/api/v1/rules/Bridges/Bridge%20Rococo%20%3C%3E%20Westend + +_Note: All json files are formatted with `jq . file.json`._ diff --git a/deployments/bridges/rococo-westend/dashboard/grafana/bridge-rococo-westend-alerts.json b/deployments/bridges/rococo-westend/dashboard/grafana/bridge-rococo-westend-alerts.json new file mode 100644 index 000000000000..2dfa9316e249 --- /dev/null +++ b/deployments/bridges/rococo-westend/dashboard/grafana/bridge-rococo-westend-alerts.json @@ -0,0 +1,1974 @@ +{ + "name": "Bridge Rococo <> Westend", + "interval": "1m", + "rules": [ + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "tkgc6_bnk", + "__panelId__": "12", + "summary": "Messages from RococoBridgeHub to WestendBridgeHub (00000002) are either not delivered, or are delivered with lags" + }, + "grafana_alert": { + "id": 51, + "orgId": 1, + "title": "RococoBridgeHub -> WestendBridgeHub delivery lags (00000002)", + "condition": "A", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "((vector(0) and ((BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(1)) + on () increase(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[10m]) * on () ((vector(1) and ((BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(0))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Undelivered messages", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 1 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "max" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 130, + "uid": "r41otJp4k", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "zqjpgXxnk", + "__panelId__": "14", + "summary": "Messages from WestendBridgeHub to RococoBridgeHub (00000002) are either not delivered, or are delivered with lags" + }, + "grafana_alert": { + "id": 55, + "orgId": 1, + "title": "WestendBridgeHub -> RococoBridgeHub delivery lags (00000002)", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "((vector(0) and ((BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(1)) + on () increase(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[10m]) * on () ((vector(1) and ((BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(0))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Undelivered messages", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 1 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "max" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 128, + "uid": "wqmPtJpVz", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "tkgc6_bnk", + "__panelId__": "14", + "summary": "Messages from RococoBridgeHub to WestendBridgeHub (00000002) are either not confirmed, or are confirmed with lags" + }, + "grafana_alert": { + "id": 56, + "orgId": 1, + "title": "RococoBridgeHub -> WestendBridgeHub confirmation lags (00000002)", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(RococoBridgeHub_to_WestendBridgeHub_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0)) - scalar(max_over_time(RococoBridgeHub_to_WestendBridgeHub_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Unconfirmed messages", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 50 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "min" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 124, + "uid": "z4h3pJtVz", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "zqjpgXxnk", + "__panelId__": "16", + "summary": "Messages from WestendBridgeHub to RococoBridgeHub (00000002) are either not confirmed, or are confirmed with lags" + }, + "grafana_alert": { + "id": 57, + "orgId": 1, + "title": "WestendBridgeHub -> RococoBridgeHub confirmation lags (00000002)", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Unconfirmed messages", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 50 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "min" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 123, + "uid": "Kj_z21t4k", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "zqjpgXxnk", + "__panelId__": "18", + "summary": "Rewards for messages from WestendBridgeHub to RococoBridgeHub (00000002) are either not confirmed, or are confirmed with lags" + }, + "grafana_alert": { + "id": 58, + "orgId": 1, + "title": "WestendBridgeHub -> RococoBridgeHub reward lags (00000002)", + "condition": "C", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_confirmed\"}[2m]) OR on() vector(0))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Unconfirmed rewards", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 10 + ], + "type": "gt" + }, + "operator": { + "type": "when" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "min" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "C", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 118, + "uid": "hw_a21pVk", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "tkgc6_bnk", + "__panelId__": "15", + "summary": "Rewards for messages from RococoBridgeHub to WestendBridgeHub (00000002) are either not confirmed, or are confirmed with lags" + }, + "grafana_alert": { + "id": 59, + "orgId": 1, + "title": "RococoBridgeHub -> WestendBridgeHub reward lags (00000002)", + "condition": "C", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_confirmed\"}[2m]) OR on() vector(0))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Unconfirmed rewards", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 10 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "min" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "C", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 117, + "uid": "daN62Jt4z", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "2", + "summary": "Best BridgeHubRococo header at BridgeHubWestend (00000002) doesn't match the same header at BridgeHubRococo" + }, + "grafana_alert": { + "id": 60, + "orgId": 1, + "title": "BridgeHubRococo header mismatch (00000002)", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 0 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "max" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 114, + "uid": "BzBDb1pVz", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "3", + "summary": "Best BridgeHubWestend header at BridgeHubRococo (00000002) doesn't match the same header at BridgeHubWestend" + }, + "grafana_alert": { + "id": 61, + "orgId": 1, + "title": "BridgeHubWestend header mismatch (00000002)", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 0 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "max" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 113, + "uid": "1W6lb1p4z", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "5", + "summary": "With-WestendBridgeHub messages relay balance at RococoBridgeHub (00000002) is too low" + }, + "grafana_alert": { + "id": 62, + "orgId": 1, + "title": "With-WestendBridgeHub messages relay balance at RococoBridgeHub (00000002) is too low", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "last_over_time(at_BridgeHubRococo_relay_BridgeHubWestendMessages_balance{domain=\"parity-testnet\"}[1h])", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Messages Relay Balance", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 10 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 112, + "uid": "Y5Dm-1tVz", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "6", + "summary": "With-RococoBridgeHub messages relay balance at WestendBridgeHub (00000002) is too low" + }, + "grafana_alert": { + "id": 63, + "orgId": 1, + "title": "With-RococoBridgeHub messages relay balance at WestendBridgeHub (00000002) is too low", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "last_over_time(at_BridgeHubWestend_relay_BridgeHubRococoMessages_balance{domain=\"parity-testnet\"}[1h])", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Messages Relay Balance", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 300, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 10 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 111, + "uid": "yUl4a1tVz", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "5m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "tkgc6_bnk", + "__panelId__": "6", + "summary": "Less than 500 Rococo headers have been synced to WestendBridgeHub in last 120 minutes. Relay is not running?" + }, + "grafana_alert": { + "id": 65, + "orgId": 1, + "title": "Rococo -> WestendBridgeHub finality sync lags (00000002)", + "condition": "D", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "max(increase(Rococo_to_BridgeHubWestend_Sync_best_source_at_target_block_number{domain=\"parity-testnet\"}[120m]))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "At Rococo", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "C" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "reducer": "last", + "refId": "C", + "type": "reduce" + } + }, + { + "refId": "D", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 500 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "D" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "C", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "D", + "type": "threshold" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 80, + "uid": "R6GKwNA4z", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "5m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "zqjpgXxnk", + "__panelId__": "2", + "summary": "Less than 500 Westend headers have been synced to RococoBridgeHub in last 390 minutes. Relay is not running?" + }, + "grafana_alert": { + "id": 66, + "orgId": 1, + "title": "Westend -> RococoBridgeHub finality sync lags (00000002)", + "condition": "D", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "max(increase(Westend_to_BridgeHubRococo_Sync_best_source_at_target_block_number{domain=\"parity-testnet\"}[390m]))", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "At Westend", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "C" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "reducer": "last", + "refId": "C", + "type": "reduce" + } + }, + { + "refId": "D", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 500 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "D" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "C", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "D", + "type": "threshold" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 78, + "uid": "rAM1QHAVk", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "0s", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "11", + "summary": "The RococoBridgeHub <> WestendBridgeHub relay (00000002) has been aborted by version guard - i.e. one of chains has been upgraded and relay wasn't redeployed" + }, + "grafana_alert": { + "id": 67, + "orgId": 1, + "title": "Version guard has aborted RococoBridgeHub <> WestendBridgeHub relay (00000002)", + "condition": "B", + "data": [ + { + "refId": "B", + "queryType": "instant", + "relativeTimeRange": { + "from": 600, + "to": 0 + }, + "datasourceUid": "P3572579027B246FE", + "model": { + "datasource": { + "type": "loki", + "uid": "P3572579027B246FE" + }, + "editorMode": "code", + "expr": "count_over_time({container=\"bridges-common-relay\"} |= `Aborting relay` [1m])", + "hide": false, + "intervalMs": 1000, + "legendFormat": "Aborts per minute", + "maxDataPoints": 43200, + "queryType": "instant", + "refId": "B" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "C" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "B", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "reducer": "max", + "refId": "C", + "type": "reduce" + } + }, + { + "refId": "D", + "queryType": "", + "relativeTimeRange": { + "from": 600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 0 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "D" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "C", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "D", + "type": "threshold" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 77, + "uid": "TwWPeN04z", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "12", + "summary": "Best Rococo header at BridgeHubWestend (00000002) doesn't match the same header at Rococo" + }, + "grafana_alert": { + "id": 69, + "orgId": 1, + "title": "Rococo headers mismatch", + "condition": "C", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Rococo_to_BridgeHubWestend_Sync_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "B" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "reducer": "last", + "refId": "B", + "type": "reduce" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 0 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "C" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "B", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "C", + "type": "threshold" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 72, + "uid": "08-5gv04k", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "10m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "13", + "summary": "Best Westend header at BridgeHubRococo (00000002) doesn't match the same header at Westend" + }, + "grafana_alert": { + "id": 70, + "orgId": 1, + "title": "Westend headers mismatch", + "condition": "C", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Westend_to_BridgeHubRococo_Sync_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "B" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "reducer": "last", + "refId": "B", + "type": "reduce" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 0 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "C" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "B", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "C", + "type": "threshold" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 71, + "uid": "Esj2gD0Vk", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "5m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "tkgc6_bnk", + "__panelId__": "9", + "summary": "Test messages from RococoBridgeHub to WestendBridgeHub are not generated. Our cronjob has died?" + }, + "grafana_alert": { + "id": 73, + "orgId": 1, + "title": "Test messages from RococoBridgeHub to WestendBridgeHub are not generated.", + "condition": "D", + "data": [ + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 21600, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "max by(container) (increase(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\", type=~\"source_latest_generated\"}[24h]))", + "hide": true, + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Messages generated in last 24h", + "maxDataPoints": 43200, + "range": true, + "refId": "B" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "C" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "B", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "reducer": "max", + "refId": "C", + "type": "reduce" + } + }, + { + "refId": "D", + "queryType": "", + "relativeTimeRange": { + "from": 600, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 1 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "D" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "C", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "D", + "type": "threshold" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 43, + "uid": "ry1K5SB4k", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + }, + { + "expr": "", + "for": "5m", + "labels": { + "matrix_room": "XyVkmRJgIkjcvIBPsP" + }, + "annotations": { + "__dashboardUid__": "UFsgbJtVz", + "__panelId__": "16", + "summary": "RococoBridgeHub <> WestendBridgeHub relay (00000002) node is down" + }, + "grafana_alert": { + "id": 74, + "orgId": 1, + "title": "RococoBridgeHub <> WestendBridgeHub relay (00000002) node is down", + "condition": "C", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 900, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": false, + "expr": "up{domain=\"parity-testnet\",container=\"bridges-common-relay\"}", + "instant": false, + "interval": "", + "intervalMs": 30000, + "legendFormat": "Is relay running", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "B" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "A", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "reducer": "max", + "refId": "B", + "type": "reduce" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 1 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "C" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "__expr__", + "uid": "-100" + }, + "expression": "B", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "C", + "type": "threshold" + } + } + ], + "updated": "2023-12-08T06:04:42Z", + "intervalSeconds": 60, + "version": 41, + "uid": "9YAdEUB4z", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Bridge Rococo <> Westend", + "no_data_state": "OK", + "exec_err_state": "OK", + "is_paused": false + } + } + ] +} diff --git a/deployments/bridges/rococo-westend/dashboard/grafana/relay-rococo-to-westend-messages-dashboard.json b/deployments/bridges/rococo-westend/dashboard/grafana/relay-rococo-to-westend-messages-dashboard.json new file mode 100644 index 000000000000..4ba0737923a0 --- /dev/null +++ b/deployments/bridges/rococo-westend/dashboard/grafana/relay-rococo-to-westend-messages-dashboard.json @@ -0,0 +1,965 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 141, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Rococo_to_BridgeHubWestend_Sync_best_source_block_number{domain=\"parity-testnet\"}", + "legendFormat": "At Rococo", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Rococo_to_BridgeHubWestend_Sync_best_source_at_target_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At BridgeHubWestend", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized Rococo headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Westend_to_BridgeHubRococo_Sync_best_source_block_number{domain=\"parity-testnet\"}", + "legendFormat": "At Westend", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Westend_to_BridgeHubRococo_Sync_best_source_at_target_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At BridgeHubRococo", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized Westend headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": true, + "expr": "BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_best_source_block_number{domain=\"parity-testnet\"}", + "interval": "", + "legendFormat": "At RococoBridgeHub", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_best_source_at_target_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At WestendBridgeHub", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized RococoBridgeHub headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": true, + "expr": "BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_best_target_block_number{domain=\"parity-testnet\"}", + "interval": "", + "legendFormat": "At WestendBridgeHub", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_best_target_at_source_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At RococoBridgeHub", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized WestendBridgeHub headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "label_replace(label_replace(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\", type=~\"source_latest_generated|target_latest_received\"}, \"type\", \"Latest message sent from BridgeHubRococo\", \"type\", \"source_latest_generated\"), \"type\", \"Latest BridgeHubRococo message received by BridgeHubWestend\", \"type\", \"target_latest_received\")", + "legendFormat": "{{type}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "increase(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\", type=~\"source_latest_generated\"}[24h])", + "hide": true, + "legendFormat": "Messages generated in last 24h", + "range": true, + "refId": "B" + } + ], + "title": "Delivery race (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "label_replace(label_replace(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=~\"source_latest_confirmed|target_latest_received\"}, \"type\", \"Latest delivery confirmation from BridgeHubWestend to BridgeHubRococo\", \"type\", \"source_latest_confirmed\"), \"type\", \"Latest BridgeHubRococo message received by BridgeHubWestend\", \"type\", \"target_latest_received\")", + "legendFormat": "{{type}}", + "range": true, + "refId": "A" + } + ], + "title": "Confirmations race (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 16 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0))", + "legendFormat": "Undelivered messages", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "((vector(0) and ((BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(1)) + on () increase(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[10m]) * on () ((vector(1) and ((BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(0))", + "hide": true, + "legendFormat": "1 if all messages are delivered. Otherwise - number of delivered messages in last 10m", + "range": true, + "refId": "B" + } + ], + "title": "Delivery race lags (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 16 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(RococoBridgeHub_to_WestendBridgeHub_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0)) - scalar(max_over_time(RococoBridgeHub_to_WestendBridgeHub_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0))", + "legendFormat": "Unconfirmed messages", + "range": true, + "refId": "A" + } + ], + "title": "Confirmations race lags (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 16 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_confirmed\"}[2m]) OR on() vector(0))", + "legendFormat": "Unconfirmed rewards", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "(scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_confirmed\"}[2m]) OR on() vector(0))) * (max_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0) > bool min_over_time(BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0))", + "hide": true, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Reward lags (00000002)", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "BridgeHubRococo to BridgeHubWestend (00000002)", + "uid": "tkgc6_bnk", + "version": 45, + "weekStart": "" +} \ No newline at end of file diff --git a/deployments/bridges/rococo-westend/dashboard/grafana/relay-westend-to-rococo-messages-dashboard.json b/deployments/bridges/rococo-westend/dashboard/grafana/relay-westend-to-rococo-messages-dashboard.json new file mode 100644 index 000000000000..aa246d3827c0 --- /dev/null +++ b/deployments/bridges/rococo-westend/dashboard/grafana/relay-westend-to-rococo-messages-dashboard.json @@ -0,0 +1,953 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 142, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Westend_to_BridgeHubRococo_Sync_best_source_block_number{domain=\"parity-testnet\"}", + "legendFormat": "At Westend", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Westend_to_BridgeHubRococo_Sync_best_source_at_target_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At BridgeHubRococo", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized Westend headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Rococo_to_BridgeHubWestend_Sync_best_source_block_number{domain=\"parity-testnet\"}", + "legendFormat": "At Rococo", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Rococo_to_BridgeHubWestend_Sync_best_source_at_target_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At WestendBridgeHub", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized Rococo headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 0 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": true, + "expr": "BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_best_source_block_number{domain=\"parity-testnet\"}", + "interval": "", + "legendFormat": "At WestendBridgeHub", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_best_source_at_target_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At RococoBridgeHub", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized WestendBridgeHub headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 0 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": true, + "expr": "BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_best_target_block_number{domain=\"parity-testnet\"}", + "interval": "", + "legendFormat": "At RococoBridgeHub", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_best_target_at_source_block_number{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "At WestendBridgeHub", + "range": true, + "refId": "B" + } + ], + "title": "Best finalized RococoBridgeHub headers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "label_replace(label_replace(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=~\"source_latest_generated|target_latest_received\"}, \"type\", \"Latest message sent from BridgeHubWestend\", \"type\", \"source_latest_generated\"), \"type\", \"Latest BridgeHubWestend message received by BridgeHubRococo\", \"type\", \"target_latest_received\")", + "legendFormat": "{{type}}", + "range": true, + "refId": "A" + } + ], + "title": "Delivery race (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "label_replace(label_replace(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=~\"source_latest_confirmed|target_latest_received\"}, \"type\", \"Latest delivery confirmation from BridgeHubRococo to BridgeHubWestend\", \"type\", \"source_latest_confirmed\"), \"type\", \"Latest BridgeHubWestend message received by BridgeHubRococo\", \"type\", \"target_latest_received\")", + "legendFormat": "{{type}}", + "range": true, + "refId": "A" + } + ], + "title": "Confirmations race (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 16 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0))", + "legendFormat": "Undelivered messages", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "((vector(0) and ((BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(1)) + on () increase(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[10m]) * on () ((vector(1) and ((BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_generated\"} > on () BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}))) or vector(0))", + "hide": true, + "legendFormat": "1 if all messages are delivered. Otherwise - number of delivered messages in last 10m", + "range": true, + "refId": "B" + } + ], + "title": "Delivery race lags (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 16 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0))", + "legendFormat": "Unconfirmed messages", + "range": true, + "refId": "A" + } + ], + "title": "Confirmations race lags (00000002)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 16 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_confirmed\"}[2m]) OR on() vector(0))", + "legendFormat": "Unconfirmed rewards", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "(scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"source_latest_confirmed\"}[2m]) OR on() vector(0)) - scalar(max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_confirmed\"}[2m]) OR on() vector(0))) * (max_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0) > bool min_over_time(BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_lane_state_nonces{domain=\"parity-testnet\",type=\"target_latest_received\"}[2m]) OR on() vector(0))", + "hide": true, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Reward lags (00000002)", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "BridgeHubWestend to BridgeHubRococo (00000002)", + "uid": "zqjpgXxnk", + "version": 35, + "weekStart": "" +} \ No newline at end of file diff --git a/deployments/bridges/rococo-westend/dashboard/grafana/rococo-westend-maintenance-dashboard.json b/deployments/bridges/rococo-westend/dashboard/grafana/rococo-westend-maintenance-dashboard.json new file mode 100644 index 000000000000..c9eae23f0114 --- /dev/null +++ b/deployments/bridges/rococo-westend/dashboard/grafana/rococo-westend-maintenance-dashboard.json @@ -0,0 +1,1029 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 284, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 5, + "x": 0, + "y": 0 + }, + "id": 8, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "name" + }, + "pluginVersion": "10.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": false, + "expr": "substrate_relay_build_info{domain=\"parity-testnet\"}", + "instant": true, + "legendFormat": "{{commit}}", + "range": false, + "refId": "A" + } + ], + "title": "Relay build commit", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 5, + "y": 0 + }, + "id": 9, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "/^1\\.0\\.1$/", + "values": false + }, + "text": {}, + "textMode": "name" + }, + "pluginVersion": "10.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": false, + "expr": "substrate_relay_build_info{domain=\"parity-testnet\"}", + "instant": true, + "legendFormat": "{{version}}", + "range": false, + "refId": "A" + } + ], + "title": "Relay build version", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 1, + "text": "No" + }, + "1": { + "color": "green", + "index": 0, + "text": "Yes" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 9, + "y": 0 + }, + "id": 15, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": false, + "expr": "up{domain=\"parity-testnet\",container=\"bridges-common-relay\"}", + "instant": false, + "legendFormat": "Is relay running", + "range": true, + "refId": "A" + } + ], + "title": "Is relay running?", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 5, + "x": 13, + "y": 0 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": false, + "expr": "up{domain=\"parity-testnet\",container=\"bridges-common-relay\"}", + "instant": false, + "legendFormat": "Is relay running", + "range": true, + "refId": "A" + } + ], + "title": "Is relay running? (for alert)", + "type": "timeseries" + }, + { + "datasource": { + "type": "loki", + "uid": "P03E52D76DFE188C3" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 18, + "x": 0, + "y": 5 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "P03E52D76DFE188C3" + }, + "editorMode": "code", + "expr": "count_over_time({container=\"bridges-common-relay\"} |~ `(?i)(warn|error|fail)` [1m])", + "legendFormat": "Errors per minute", + "queryType": "range", + "refId": "A" + } + ], + "title": "Relay errors/warnings per minute", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 9, + "x": 0, + "y": 14 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Rococo_to_BridgeHubWestend_Sync_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "range": true, + "refId": "A" + } + ], + "title": "Rococo headers mismatch", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 9, + "x": 9, + "y": 14 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "Westend_to_BridgeHubRococo_Sync_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "range": true, + "refId": "A" + } + ], + "title": "Westend headers mismatch", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 9, + "x": 0, + "y": 21 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubRococo_to_BridgeHubWestend_MessageLane_00000002_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "range": true, + "refId": "A" + } + ], + "title": "BridgeHubRococo headers mismatch", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 9, + "x": 9, + "y": 21 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "BridgeHubWestend_to_BridgeHubRococo_MessageLane_00000002_is_source_and_source_at_target_using_different_forks{domain=\"parity-testnet\"}", + "legendFormat": "Best BridgeHubRococo header at BridgeHubWestend doesn't match the same header of BridgeHubRococo", + "range": true, + "refId": "A" + } + ], + "title": "BridgeHubWestend headers mismatch", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 0, + "y": 28 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "at_BridgeHubRococo_relay_BridgeHubWestendMessages_balance{domain=\"parity-testnet\"}", + "legendFormat": "Messages Relay Balance", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "at_BridgeHubRococo_relay_WestendHeaders_reward_for_msgs_to_BridgeHubWestend_on_lane_00000002{domain=\"parity-testnet\"} + at_BridgeHubRococo_relay_BridgeHubWestendMessages_reward_for_msgs_to_BridgeHubWestend_on_lane_00000002{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "Pending reward", + "range": true, + "refId": "B" + } + ], + "title": "Relay balances at RococoBridgeHub", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 9, + "y": 28 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "at_BridgeHubWestend_relay_BridgeHubRococoMessages_balance{domain=\"parity-testnet\"}", + "legendFormat": "Messages Relay Balance", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "expr": "at_BridgeHubRococo_relay_BridgeHubWestendMessages_reward_for_msgs_from_BridgeHubWestend_on_lane_00000002{domain=\"parity-testnet\"} + at_BridgeHubRococo_relay_BridgeHubWestendMessages_reward_for_msgs_to_BridgeHubWestend_on_lane_00000002{domain=\"parity-testnet\"}", + "hide": false, + "legendFormat": "Pending reward", + "range": true, + "refId": "B" + } + ], + "title": "Relay balances at WestendBridgeHub", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "BridgeHubRococo <> BridgeHubWestend maintenance (00000002)", + "uid": "UFsgbJtVz", + "version": 27, + "weekStart": "" +} \ No newline at end of file diff --git a/deployments/bridges/rococo/README.md b/deployments/bridges/rococo/README.md new file mode 100644 index 000000000000..ee4ab77301f3 --- /dev/null +++ b/deployments/bridges/rococo/README.md @@ -0,0 +1,16 @@ +# Rococo deployments + +This folder contains some information and useful stuff from our other test deployment on Rococo. + +## Grafana Alerts and Dashboards + +JSON model for Grafana alerts and dashobards that we use, may be found in the [dasboard/grafana](./dashboard/grafana/) +folder. + +**Dashboards:** +- rococo-beefy-dashboard.json (exported JSON directly from https://grafana.teleport.parity.io/dashboards/f/eblDiw17z/Bridges) + +**Alerts:** +- rococo-beefy-alerts.json https://grafana.teleport.parity.io/api/ruler/grafana/api/v1/rules/Bridges/Rococo%20BEEFY + +_Note: All json files are formatted with `jq . file.json`._ \ No newline at end of file diff --git a/deployments/bridges/rococo/dashboard/grafana/rococo-beefy-alerts.json b/deployments/bridges/rococo/dashboard/grafana/rococo-beefy-alerts.json new file mode 100644 index 000000000000..c684584b0f87 --- /dev/null +++ b/deployments/bridges/rococo/dashboard/grafana/rococo-beefy-alerts.json @@ -0,0 +1,190 @@ +{ + "name": "Rococo BEEFY", + "interval": "20m", + "rules": [ + { + "expr": "", + "for": "20m", + "labels": { + "matrix_room": "lMunCqbBqxEqfRuUDF" + }, + "annotations": { + "__dashboardUid__": "3sEDRyl7z", + "__panelId__": "6", + "summary": "Some Rococo BEEFY validators experienced lagging sessions" + }, + "grafana_alert": { + "id": 42, + "orgId": 1, + "title": "Rococo BEEFY Lagging Sessions", + "condition": "B", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 10800, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "editorMode": "code", + "exemplar": true, + "expr": "increase(substrate_beefy_lagging_sessions{chain=\"rococo_v2_2\", node=~\"rococo.*(3-validator|3-rpc).*\"}[60m])", + "interval": "", + "intervalMs": 30000, + "legendFormat": "", + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "B", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 0 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "grafana-expression", + "uid": "-100" + }, + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "B", + "type": "classic_conditions" + } + } + ], + "updated": "2023-11-21T08:44:25Z", + "intervalSeconds": 1200, + "version": 14, + "uid": "eYY8ks_7z", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Rococo BEEFY", + "no_data_state": "NoData", + "exec_err_state": "Alerting", + "is_paused": false + } + }, + { + "expr": "", + "for": "1h", + "labels": { + "matrix_room": "lMunCqbBqxEqfRuUDF" + }, + "annotations": { + "__dashboardUid__": "3sEDRyl7z", + "__panelId__": "2", + "summary": "Rococo BEEFY best blocks have not advanced for at least 60 mins" + }, + "grafana_alert": { + "id": 41, + "orgId": 1, + "title": "Rococo BEEFY best blocks not advancing", + "condition": "C", + "data": [ + { + "refId": "A", + "queryType": "", + "relativeTimeRange": { + "from": 10800, + "to": 0 + }, + "datasourceUid": "PC96415006F908B67", + "model": { + "editorMode": "code", + "expr": "increase(substrate_beefy_best_block{chain=\"rococo_v2_2\", node=~\"rococo.*(validator|rpc).*\"}[1h])", + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "range": true, + "refId": "A" + } + }, + { + "refId": "C", + "queryType": "", + "relativeTimeRange": { + "from": 0, + "to": 0 + }, + "datasourceUid": "-100", + "model": { + "conditions": [ + { + "evaluator": { + "params": [ + 100 + ], + "type": "lt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A" + ] + }, + "reducer": { + "params": [], + "type": "last" + }, + "type": "query" + } + ], + "datasource": { + "type": "grafana-expression", + "uid": "-100" + }, + "hide": false, + "intervalMs": 1000, + "maxDataPoints": 43200, + "refId": "C", + "type": "classic_conditions" + } + } + ], + "updated": "2023-11-21T08:44:25Z", + "intervalSeconds": 1200, + "version": 15, + "uid": "CBuugs_7k", + "namespace_uid": "eblDiw17z", + "namespace_id": 140, + "rule_group": "Rococo BEEFY", + "no_data_state": "Alerting", + "exec_err_state": "Alerting", + "is_paused": false + } + } + ] +} diff --git a/deployments/bridges/rococo/dashboard/grafana/rococo-beefy-dashboard.json b/deployments/bridges/rococo/dashboard/grafana/rococo-beefy-dashboard.json new file mode 100644 index 000000000000..006b2f0621c9 --- /dev/null +++ b/deployments/bridges/rococo/dashboard/grafana/rococo-beefy-dashboard.json @@ -0,0 +1,330 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 189, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "editorMode": "code", + "exemplar": true, + "expr": "substrate_beefy_best_block{chain=\"rococo_v2_2\", node=~\"rococo.*(validator|rpc).*\"}", + "hide": false, + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Rococo Beefy Best block", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 1, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "exemplar": true, + "expr": "substrate_beefy_lagging_sessions{chain=\"rococo_v2_2\", node=~\"rococo.*(validator|3-rpc).*\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Rococo BEEFY Lagging Sessions", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PC96415006F908B67" + }, + "exemplar": true, + "expr": "substrate_beefy_validator_set_id{chain=\"rococo_v2_2\", node=~\"rococo.*(validator|3-rpc).*\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Rococo BEEFY Validator Set ID", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Rococo BEEFY", + "uid": "3sEDRyl7z", + "version": 16, + "weekStart": "" +} diff --git a/deployments/local-scripts/bridge-entrypoint.sh b/deployments/local-scripts/bridge-entrypoint.sh new file mode 100755 index 000000000000..da099222bac2 --- /dev/null +++ b/deployments/local-scripts/bridge-entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -xeu + +# This will allow us to run whichever binary the user wanted +# with arguments passed through `docker run` +# e.g `docker run -it substrate-relay --dev --tmp` +/home/user/$PROJECT $@ diff --git a/cumulus/bridges/docs/complex-relay.html b/docs/complex-relay.html similarity index 100% rename from cumulus/bridges/docs/complex-relay.html rename to docs/complex-relay.html diff --git a/docs/dockerhub-bridges-common-relay.README.md b/docs/dockerhub-bridges-common-relay.README.md new file mode 100644 index 000000000000..d199227c9c61 --- /dev/null +++ b/docs/dockerhub-bridges-common-relay.README.md @@ -0,0 +1 @@ +# bridges-common-relay diff --git a/docs/dockerhub-substrate-relay.README.md b/docs/dockerhub-substrate-relay.README.md new file mode 100644 index 000000000000..1a9f22c425c2 --- /dev/null +++ b/docs/dockerhub-substrate-relay.README.md @@ -0,0 +1 @@ +# substrate-relay diff --git a/cumulus/bridges/docs/grandpa-finality-relay.html b/docs/grandpa-finality-relay.html similarity index 100% rename from cumulus/bridges/docs/grandpa-finality-relay.html rename to docs/grandpa-finality-relay.html diff --git a/docs/high-level-overview.md b/docs/high-level-overview.md new file mode 100644 index 000000000000..d6d6fb3f0996 --- /dev/null +++ b/docs/high-level-overview.md @@ -0,0 +1,184 @@ +# High-Level Bridge Documentation + +This document gives a brief, abstract description of main components that may be found in this repository. If you want +to see how we're using them to build Rococo <> Westend (Kusama <> Polkadot) bridge, please refer to the [Polkadot <> +Kusama Bridge](./polkadot-kusama-bridge-overview.md). + +## Purpose + +This repo contains all components required to build a trustless connection between standalone Substrate chains, that are +using GRANDPA finality, their parachains or any combination of those. On top of this connection, we offer a messaging +pallet that provides means to organize messages exchange. + +On top of that layered infrastructure, anyone may build their own bridge applications - e.g. [XCM +messaging](./polkadot-kusama-bridge-overview.md), [encoded calls +messaging](https://github.com/paritytech/parity-bridges-common/releases/tag/encoded-calls-messaging) and so on. + +## Terminology + +Even though we support (and require) two-way bridging, the documentation will generally talk about a one-sided +interaction. That's to say, we will only talk about syncing finality proofs and messages from a _source_ chain to a +_target_ chain. This is because the two-sided interaction is really just the one-sided interaction with the source and +target chains switched. + +The bridge has both on-chain (pallets) and offchain (relayers) components. + +## On-chain components + +On-chain bridge components are pallets that are deployed at the chain runtime. Finality pallets require deployment at +the target chain, while messages pallet needs to be deployed at both, source and target chains. + +### Bridge GRANDPA Finality Pallet + +A GRANDPA light client of the source chain built into the target chain's runtime. It provides a "source of truth" about +the source chain headers which have been finalized. This is useful for higher level applications. + +The pallet tracks current GRANDPA authorities set and only accepts finality proofs (GRANDPA justifications), generated +by the current authorities set. The GRANDPA protocol itself requires current authorities set to generate explicit +justification for the header that enacts next authorities set. Such headers and their finality proofs are called +mandatory in the pallet and relayer pays no fee for such headers submission. + +The pallet does not require all headers to be imported or provided. The relayer itself chooses which headers he wants to +submit (with the exception of mandatory headers). + +More: [pallet level documentation and code](../modules/grandpa/). + +### Bridge Parachains Finality Pallet + +Parachains are not supposed to have their own finality, so we can't use bridge GRANDPA pallet to verify their finality +proofs. Instead, they rely on their relay chain finality. The parachain header is considered final, when it is accepted +by the [`paras` +pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras) +at its relay chain. Obviously, the relay chain block, where it is accepted, must also be finalized by the relay chain +GRANDPA gadget. + +That said, the bridge parachains pallet accepts storage proof of one or several parachain heads, inserted to the +[`Heads`](https://github.com/paritytech/polkadot/blob/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras/mod.rs#L642) +map of the [`paras` +pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras). +To verify this storage proof, the pallet uses relay chain header, imported earlier by the bridge GRANDPA pallet. + +The pallet may track multiple parachains at once and those parachains may use different primitives. So the parachain +header decoding never happens at the pallet level. For maintaining the headers order, the pallet uses relay chain header +number. + +More: [pallet level documentation and code](../modules/parachains/). + +### Bridge Messages Pallet + +The pallet is responsible for queuing messages at the source chain and receiving the messages proofs at the target +chain. The messages are sent to the particular _lane_, where they are guaranteed to be received in the same order they +are sent. The pallet supports many lanes. + +The lane has two ends. Outbound lane end is storing number of messages that have been sent and the number of messages +that have been received. Inbound lane end stores the number of messages that have been received and also a map that maps +messages to relayers that have delivered those messages to the target chain. + +The pallet has three main entrypoints: +- the `send_message` may be used by the other runtime pallets to send the messages; +- the `receive_messages_proof` is responsible for parsing the messages proof and handing messages over to the dispatch +code; +- the `receive_messages_delivery_proof` is responsible for parsing the messages delivery proof and rewarding relayers +that have delivered the message. + +Many things are abstracted by the pallet: +- the message itself may mean anything, the pallet doesn't care about its content; +- the message dispatch happens during delivery, but it is decoupled from the pallet code; +- the messages proof and messages delivery proof are verified outside of the pallet; +- the relayers incentivization scheme is defined outside of the pallet. + +Outside of the messaging pallet, we have a set of adapters, where messages and delivery proofs are regular storage +proofs. The proofs are generated at the bridged chain and require bridged chain finality. So messages pallet, in this +case, depends on one of the finality pallets. The messages are XCM messages and we are using XCM executor to dispatch +them on receival. You may find more info in [Polkadot <> Kusama Bridge](./polkadot-kusama-bridge-overview.md) document. + +More: [pallet level documentation and code](../modules/messages/). + +### Bridge Relayers Pallet + +The pallet is quite simple. It just registers relayer rewards and has an entrypoint to collect them. When the rewards +are registered and the reward amount is configured outside of the pallet. + +More: [pallet level documentation and code](../modules/relayers/). + +## Offchain Components + +Offchain bridge components are separate processes, called relayers. Relayers are connected both to the source chain and +target chain nodes. Relayers are reading state of the source chain, compare it to the state of the target chain and, if +state at target chain needs to be updated, submits target chain transaction. + +### GRANDPA Finality Relay + +The task of relay is to submit source chain GRANDPA justifications and their corresponding headers to the Bridge GRANDPA +Finality Pallet, deployed at the target chain. For that, the relay subscribes to the source chain GRANDPA justifications +stream and submits every new justification it sees to the target chain GRANDPA light client. In addition, relay is +searching for mandatory headers and submits their justifications - without that the pallet will be unable to move +forward. + +More: [GRANDPA Finality Relay Sequence Diagram](./grandpa-finality-relay.html), [pallet level documentation and +code](../relays/finality/). + +### Parachains Finality Relay + +The relay connects to the source _relay_ chain and the target chain nodes. It doesn't need to connect to the tracked +parachain nodes. The relay looks at the +[`Heads`](https://github.com/paritytech/polkadot/blob/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras/mod.rs#L642) +map of the [`paras` +pallet](https://github.com/paritytech/polkadot/tree/1a034bd6de0e76721d19aed02a538bcef0787260/runtime/parachains/src/paras) +in source chain, and compares the value with the best parachain head, stored in the bridge parachains pallet at the +target chain. If new parachain head appears at the relay chain block `B`, the relay process **waits** until header `B` +or one of its ancestors appears at the target chain. Once it is available, the storage proof of the map entry is +generated and is submitted to the target chain. + +As its on-chain component (which requires bridge GRANDPA pallet to be deployed nearby), the parachains finality relay +requires GRANDPA finality relay to be running in parallel. Without it, the header `B` or any of its children's finality +at source won't be relayed at target, and target chain won't be able to verify generated storage proof. + +More: [Parachains Finality Relay Sequence Diagram](./parachains-finality-relay.html), [code](../relays/parachains/). + +### Messages Relay + +Messages relay is actually two relays that are running in a single process: messages delivery relay and delivery +confirmation relay. Even though they are more complex and have many caveats, the overall algorithm is the same as in +other relays. + +Message delivery relay connects to the source chain and looks at the outbound lane end, waiting until new messages are +queued there. Once they appear at the source block `B`, the relay start waiting for the block `B` or its descendant +appear at the target chain. Then the messages storage proof is generated and submitted to the bridge messages pallet at +the target chain. In addition, the transaction may include the storage proof of the outbound lane state - that proves +that relayer rewards have been paid and this data (map of relay accounts to the delivered messages) may be pruned from +the inbound lane state at the target chain. + +Delivery confirmation relay connects to the target chain and starts watching the inbound lane end. When new messages are +delivered to the target chain, the corresponding _source chain account_ is inserted to the map in the inbound lane data. +Relay detects that, say, at the target chain block `B` and waits until that block or its descendant appears at the +source chain. Once that happens, the relay crafts a storage proof of that data and sends it to the messages pallet, +deployed at the source chain. + +As you can see, the messages relay also requires finality relay to be operating in parallel. Since messages relay +submits transactions to both source and target chains, it requires both _source-to-target_ and _target-to-source_ +finality relays. They can be GRANDPA finality relays or GRANDPA+parachains finality relays, depending on the type of +connected chain. + +More: [Messages Relay Sequence Diagram](./messages-relay.html), [pallet level documentation and +code](../relays/messages/). + +### Complex Relay + +Every relay transaction has its cost. The only transaction, that is "free" to relayer is when the mandatory GRANDPA +header is submitted. The relay that feeds the bridge with every relay chain and/or parachain head it sees, will have to +pay a (quite large) cost. And if no messages are sent through the bridge, that is just waste of money. + +We have a special relay mode, called _complex relay_, where relay mostly sleeps and only submits transactions that are +required for the messages/confirmations delivery. This mode starts two message relays (in both directions). All required +finality relays are also started in a special _on-demand_ mode. In this mode they do not submit any headers without +special request. As always, the only exception is when GRANDPA finality relay sees the mandatory header - it is +submitted without such request. + +The message relays are watching their lanes and when, at some block `B`, they see new messages/confirmations to be +delivered, they are asking on-demand relays to relay this block `B`. On-demand relays does that and then message relay +may perform its job. If on-demand relay is a parachain finality relay, it also runs its own on-demand GRANDPA relay, +which is used to relay required relay chain headers. + +More: [Complex Relay Sequence Diagram](./complex-relay.html), +[code](../relays/bin-substrate/src/cli/relay_headers_and_messages/). diff --git a/cumulus/bridges/docs/messages-relay.html b/docs/messages-relay.html similarity index 100% rename from cumulus/bridges/docs/messages-relay.html rename to docs/messages-relay.html diff --git a/cumulus/bridges/docs/parachains-finality-relay.html b/docs/parachains-finality-relay.html similarity index 100% rename from cumulus/bridges/docs/parachains-finality-relay.html rename to docs/parachains-finality-relay.html diff --git a/docs/polkadot-kusama-bridge-overview.md b/docs/polkadot-kusama-bridge-overview.md new file mode 100644 index 000000000000..08036f0b0722 --- /dev/null +++ b/docs/polkadot-kusama-bridge-overview.md @@ -0,0 +1,129 @@ +# Polkadot <> Kusama Bridge Overview + +This document describes how we use all components, described in the [High-Level Bridge +Documentation](./high-level-overview.md), to build the XCM bridge between Kusama and Polkadot. In this case, our +components merely work as a XCM transport (like XCMP/UMP/HRMP), between chains that are not a part of the same consensus +system. + +The overall architecture may be seen in [this diagram](./polkadot-kusama-bridge.html). + +## Bridge Hubs + +All operations at relay chain are expensive. Ideally all non-mandatory transactions must happen on parachains. That's +why we are planning to have two parachains - Polkadot Bridge Hub under Polkadot consensus and Kusama Bridge Hub under +Kusama consensus. + +The Bridge Hub will have all required bridge pallets in its runtime. We hope that later, other teams will be able to use +our bridge hubs too and have their pallets there. + +The Bridge Hub will use the base token of the ecosystem - KSM at Kusama Bridge Hub and DOT at Polkadot Bridge Hub. The +runtime will have minimal set of non-bridge pallets, so there's not much you can do directly on bridge hubs. + +## Connecting Parachains + +You won't be able to directly use bridge hub transactions to send XCM messages over the bridge. Instead, you'll need to +use other parachains transactions, which will use HRMP to deliver messages to the Bridge Hub. The Bridge Hub will just +queue these messages in its outbound lane, which is dedicated to deliver messages between two parachains. + +Our first planned bridge will connect the Polkadot and Kusama Asset Hubs. A bridge between those two parachains would +allow Asset Hub Polkadot accounts to hold wrapped KSM tokens and Asset Hub Kusama accounts to hold wrapped DOT tokens. + +For that bridge (pair of parachains under different consensus systems) we'll be using the lane 00000000. Later, when +other parachains will join the bridge, they will be using other lanes for their messages. + +## Running Relayers + +We are planning to run our own complex relayer for the lane 00000000. The relayer will relay Kusama/Polkadot GRANDPA +justifications to the bridge hubs at the other side. It'll also relay finalized Kusama Bridge Hub and Polkadot Bridge +Hub heads. This will only happen when messages will be queued at hubs. So most of time relayer will be idle. + +There's no any active relayer sets, or something like that. Anyone may start its own relayer and relay queued messages. +We are not against that and, as always, appreciate any community efforts. Of course, running relayer has the cost. Apart +from paying for the CPU and network, the relayer pays for transactions at both sides of the bridge. We have a mechanism +for rewarding relayers. + +### Compensating the Cost of Message Delivery Transactions + +One part of our rewarding scheme is that the cost of message delivery, for honest relayer, is zero. The honest relayer +is the relayer, which is following our rules: + +- we do not reward relayers for submitting GRANDPA finality transactions. The only exception is submitting mandatory + headers (headers which are changing the GRANDPA authorities set) - the cost of such transaction is zero. The relayer + will pay the full cost for submitting all other headers; + +- we do not reward relayers for submitting parachain finality transactions. The relayer will pay the full cost for + submitting parachain finality transactions; + +- we compensate the cost of message delivery transactions that have actually delivered the messages. So if your + transaction has claimed to deliver messages `[42, 43, 44]`, but, because of some reasons, has actually delivered + messages `[42, 43]`, the transaction will be free for relayer. If it has not delivered any messages, then the relayer + pays the full cost of the transaction; + +- we compensate the cost of message delivery and all required finality calls, if they are part of the same + [`frame_utility::batch_all`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326) + transaction. Of course, the calls inside the batch must be linked - e.g. the submitted parachain head must be used to + prove messages. Relay header must be used to prove parachain head finality. If one of calls fails, or if they are not + linked together, the relayer pays the full transaction cost. + +Please keep in mind that the fee of "zero-cost" transactions is still withdrawn from the relayer account. But the +compensation is registered in the `pallet_bridge_relayers::RelayerRewards` map at the target bridge hub. The relayer may +later claim all its rewards later, using the `pallet_bridge_relayers::claim_rewards` call. + +*A side note*: why we don't simply set the cost of useful transactions to zero? That's because the bridge has its cost. +If we won't take any fees, it would mean that the sender is not obliged to pay for its messages. And Bridge Hub +collators (and, maybe, "treasury") are not receiving any payment for including transactions. More about this later, in +the [Who is Rewarding Relayers](#who-is-rewarding-relayers) section. + +### Message Delivery Confirmation Rewards + +In addition to the "zero-cost" message delivery transactions, the relayer is also rewarded for: + +- delivering every message. The reward is registered during delivery confirmation transaction at the Source Bridge Hub.; + +- submitting delivery confirmation transaction. The relayer may submit delivery confirmation that e.g. confirms delivery + of four messages, of which the only one (or zero) messages is actually delivered by this relayer. It receives some fee + for confirming messages, delivered by other relayers. + +Both rewards may be claimed using the `pallet_bridge_relayers::claim_rewards` call at the Source Bridge Hub. + +### Who is Rewarding Relayers + +Obviously, there should be someone who is paying relayer rewards. We want bridge transactions to have a cost, so we +can't use fees for rewards. Instead, the parachains using the bridge, use sovereign accounts on both sides of the bridge +to cover relayer rewards. + +Bridged Parachains will have sovereign accounts at bridge hubs. For example, the Kusama Asset Hub will have an account +at the Polkadot Bridge Hub. The Polkadot Asset Hub will have an account at the Kusama Bridge Hub. The sovereign accounts +are used as a source of funds when the relayer is calling the `pallet_bridge_relayers::claim_rewards`. + +Since messages lane is only used by the pair of parachains, there's no collision between different bridges. E.g. Kusama +Asset Hub will only reward relayers that are delivering messages from Kusama Asset Hub. The Kusama Asset Hub sovereign +account is not used to cover rewards of bridging with some other Polkadot Parachain. + +### Multiple Relayers and Rewards + +Our goal is to incentivize running honest relayers. But we have no relayers sets, so at any time anyone may submit +message delivery transaction, hoping that the cost of this transaction will be compensated. So what if some message is +currently queued and two relayers are submitting two identical message delivery transactions at once? Without any +special means, the cost of first included transaction will be compensated and the cost of the other one won't. A honest, +but unlucky relayer will lose some money. In addition, we'll waste some portion of block size and weight, which may be +used by other useful transactions. + +To solve the problem, we have two signed extensions ([generate_bridge_reject_obsolete_headers_and_messages! +{}](../bin/runtime-common/src/lib.rs) and +[RefundRelayerForMessagesFromParachain](../bin/runtime-common/src/refund_relayer_extension.rs)), that are preventing +bridge transactions with obsolete data from including into the block. We are rejecting following transactions: + +- transactions, that are submitting the GRANDPA justification for the best finalized header, or one of its ancestors; + +- transactions, that are submitting the proof of the current best parachain head, or one of its ancestors; + +- transactions, that are delivering already delivered messages. If at least one of messages is not yet delivered, the + transaction is not rejected; + +- transactions, that are confirming delivery of already confirmed messages. If at least one of confirmations is new, the + transaction is not rejected; + +- [`frame_utility::batch_all`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326) + transactions, that have both finality and message delivery calls. All restrictions from the [Compensating the Cost of + Message Delivery Transactions](#compensating-the-cost-of-message-delivery-transactions) are applied. diff --git a/cumulus/bridges/docs/polkadot-kusama-bridge.html b/docs/polkadot-kusama-bridge.html similarity index 100% rename from cumulus/bridges/docs/polkadot-kusama-bridge.html rename to docs/polkadot-kusama-bridge.html diff --git a/local.Dockerfile b/local.Dockerfile new file mode 100644 index 000000000000..32679e0532f8 --- /dev/null +++ b/local.Dockerfile @@ -0,0 +1,50 @@ +# Builds images used by the bridge using locally built binaries. +# +# In particular, it can be used to build Substrate nodes and bridge relayers. The binary that gets +# built can be specified with the `PROJECT` build-arg. For example, to build the `substrate-relay` +# you would do the following: +# +# `docker build . -f local.Dockerfile -t local/substrate-relay --build-arg=PROJECT=substrate-relay` +# +# See the `deployments/README.md` for all the available `PROJECT` values. +# +# You may use `scripts/build-containers.sh` to build all binaries and images at once. + +# This image needs to be binary compatible with the host machine (where images are built). +ARG UBUNTU_RELEASE=20.04 +FROM docker.io/library/ubuntu:${UBUNTU_RELEASE} as runtime + +USER root +WORKDIR /home/root + +# show backtraces +ENV RUST_BACKTRACE 1 +ENV DEBIAN_FRONTEND=noninteractive + +RUN set -eux; \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + curl ca-certificates libssl-dev && \ + update-ca-certificates && \ + groupadd -g 1001 user && \ + useradd -u 1001 -g user -s /bin/sh -m user && \ + # apt clean up + apt-get autoremove -y && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# switch to non-root user +USER user + +WORKDIR /home/user + +ARG PROFILE=release +ARG PROJECT=substrate-relay + +COPY --chown=user:user ./target/${PROFILE}/${PROJECT}* ./ + +# check if executable works in this container +RUN ./${PROJECT} --version + +ENV PROJECT=$PROJECT +ENTRYPOINT ["/bin/sh"] \ No newline at end of file diff --git a/local.Dockerfile.dockerignore b/local.Dockerfile.dockerignore new file mode 100644 index 000000000000..2b771e7ef634 --- /dev/null +++ b/local.Dockerfile.dockerignore @@ -0,0 +1,3 @@ +# This file only works for `local.Dockerfile` when docker buildkit is used (see ./scripts/build-containers.sh for details) +* +!target/release/substrate-relay diff --git a/modules/beefy/Cargo.toml b/modules/beefy/Cargo.toml new file mode 100644 index 000000000000..5d699019e63e --- /dev/null +++ b/modules/beefy/Cargo.toml @@ -0,0 +1,52 @@ +[package] +name = "pallet-bridge-beefy" +version = "0.1.0" +description = "Module implementing BEEFY on-chain light client used for bridging consensus of substrate-based chains." +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true } + +# Bridge Dependencies + +bp-beefy = { path = "../../primitives/beefy", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +sp-consensus-beefy = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +mmr-lib = { package = "ckb-merkle-mountain-range", version = "0.3.2" } +pallet-beefy-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +pallet-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +rand = "0.8" +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +bp-test-utils = { path = "../../primitives/test-utils" } + +[features] +default = [ "std" ] +std = [ + "bp-beefy/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "serde", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] +try-runtime = [ "frame-support/try-runtime", "frame-system/try-runtime" ] diff --git a/modules/beefy/src/lib.rs b/modules/beefy/src/lib.rs new file mode 100644 index 000000000000..686115a7b0ed --- /dev/null +++ b/modules/beefy/src/lib.rs @@ -0,0 +1,650 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BEEFY bridge pallet. +//! +//! This pallet is an on-chain BEEFY light client for Substrate-based chains that are using the +//! following pallets bundle: `pallet-mmr`, `pallet-beefy` and `pallet-beefy-mmr`. +//! +//! The pallet is able to verify MMR leaf proofs and BEEFY commitments, so it has access +//! to the following data of the bridged chain: +//! +//! - header hashes +//! - changes of BEEFY authorities +//! - extra data of MMR leafs +//! +//! Given the header hash, other pallets are able to verify header-based proofs +//! (e.g. storage proofs, transaction inclusion proofs, etc.). + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_beefy::{ChainWithBeefy, InitializationData}; +use sp_std::{boxed::Box, prelude::*}; + +// Re-export in crate namespace for `construct_runtime!` +pub use pallet::*; + +mod utils; + +#[cfg(test)] +mod mock; +#[cfg(test)] +mod mock_chain; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-beefy"; + +/// Configured bridged chain. +pub type BridgedChain = >::BridgedChain; +/// Block number, used by configured bridged chain. +pub type BridgedBlockNumber = bp_runtime::BlockNumberOf>; +/// Block hash, used by configured bridged chain. +pub type BridgedBlockHash = bp_runtime::HashOf>; + +/// Pallet initialization data. +pub type InitializationDataOf = + InitializationData, bp_beefy::MmrHashOf>>; +/// BEEFY commitment hasher, used by configured bridged chain. +pub type BridgedBeefyCommitmentHasher = bp_beefy::BeefyCommitmentHasher>; +/// BEEFY validator id, used by configured bridged chain. +pub type BridgedBeefyAuthorityId = bp_beefy::BeefyAuthorityIdOf>; +/// BEEFY validator set, used by configured bridged chain. +pub type BridgedBeefyAuthoritySet = bp_beefy::BeefyAuthoritySetOf>; +/// BEEFY authority set, used by configured bridged chain. +pub type BridgedBeefyAuthoritySetInfo = bp_beefy::BeefyAuthoritySetInfoOf>; +/// BEEFY signed commitment, used by configured bridged chain. +pub type BridgedBeefySignedCommitment = bp_beefy::BeefySignedCommitmentOf>; +/// MMR hashing algorithm, used by configured bridged chain. +pub type BridgedMmrHashing = bp_beefy::MmrHashingOf>; +/// MMR hashing output type of `BridgedMmrHashing`. +pub type BridgedMmrHash = bp_beefy::MmrHashOf>; +/// The type of the MMR leaf extra data used by the configured bridged chain. +pub type BridgedBeefyMmrLeafExtra = bp_beefy::BeefyMmrLeafExtraOf>; +/// BEEFY MMR proof type used by the pallet +pub type BridgedMmrProof = bp_beefy::MmrProofOf>; +/// MMR leaf type, used by configured bridged chain. +pub type BridgedBeefyMmrLeaf = bp_beefy::BeefyMmrLeafOf>; +/// Imported commitment data, stored by the pallet. +pub type ImportedCommitment = bp_beefy::ImportedCommitment< + BridgedBlockNumber, + BridgedBlockHash, + BridgedMmrHash, +>; + +/// Some high level info about the imported commitments. +#[derive(codec::Encode, codec::Decode, scale_info::TypeInfo)] +pub struct ImportedCommitmentsInfoData { + /// Best known block number, provided in a BEEFY commitment. However this is not + /// the best proven block. The best proven block is this block's parent. + best_block_number: BlockNumber, + /// The head of the `ImportedBlockNumbers` ring buffer. + next_block_number_index: u32, +} + +#[frame_support::pallet(dev_mode)] +pub mod pallet { + use super::*; + use bp_runtime::{BasicOperatingMode, OwnedBridgeModule}; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The upper bound on the number of requests allowed by the pallet. + /// + /// A request refers to an action which writes a header to storage. + /// + /// Once this bound is reached the pallet will reject all commitments + /// until the request count has decreased. + #[pallet::constant] + type MaxRequests: Get; + + /// Maximal number of imported commitments to keep in the storage. + /// + /// The setting is there to prevent growing the on-chain state indefinitely. Note + /// the setting does not relate to block numbers - we will simply keep as much items + /// in the storage, so it doesn't guarantee any fixed timeframe for imported commitments. + #[pallet::constant] + type CommitmentsToKeep: Get; + + /// The chain we are bridging to here. + type BridgedChain: ChainWithBeefy; + } + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(PhantomData<(T, I)>); + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> frame_support::weights::Weight { + >::mutate(|count| *count = count.saturating_sub(1)); + + Weight::from_parts(0, 0) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + } + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = BasicOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::call] + impl, I: 'static> Pallet + where + BridgedMmrHashing: 'static + Send + Sync, + { + /// Initialize pallet with BEEFY authority set and best known finalized block number. + #[pallet::call_index(0)] + #[pallet::weight((T::DbWeight::get().reads_writes(2, 3), DispatchClass::Operational))] + pub fn initialize( + origin: OriginFor, + init_data: InitializationDataOf, + ) -> DispatchResult { + Self::ensure_owner_or_root(origin)?; + + let is_initialized = >::exists(); + ensure!(!is_initialized, >::AlreadyInitialized); + + log::info!(target: LOG_TARGET, "Initializing bridge BEEFY pallet: {:?}", init_data); + Ok(initialize::(init_data)?) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + + /// Submit a commitment generated by BEEFY authority set. + /// + /// It will use the underlying storage pallet to fetch information about the current + /// authority set and best finalized block number in order to verify that the commitment + /// is valid. + /// + /// If successful in verification, it will update the underlying storage with the data + /// provided in the newly submitted commitment. + #[pallet::call_index(3)] + #[pallet::weight(0)] + pub fn submit_commitment( + origin: OriginFor, + commitment: BridgedBeefySignedCommitment, + validator_set: BridgedBeefyAuthoritySet, + mmr_leaf: Box>, + mmr_proof: BridgedMmrProof, + ) -> DispatchResult + where + BridgedBeefySignedCommitment: Clone, + { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + ensure_signed(origin)?; + + ensure!(Self::request_count() < T::MaxRequests::get(), >::TooManyRequests); + + // Ensure that the commitment is for a better block. + let commitments_info = + ImportedCommitmentsInfo::::get().ok_or(Error::::NotInitialized)?; + ensure!( + commitment.commitment.block_number > commitments_info.best_block_number, + Error::::OldCommitment + ); + + // Verify commitment and mmr leaf. + let current_authority_set_info = CurrentAuthoritySetInfo::::get(); + let mmr_root = utils::verify_commitment::( + &commitment, + ¤t_authority_set_info, + &validator_set, + )?; + utils::verify_beefy_mmr_leaf::(&mmr_leaf, mmr_proof, mmr_root)?; + + // Update request count. + RequestCount::::mutate(|count| *count += 1); + // Update authority set if needed. + if mmr_leaf.beefy_next_authority_set.id > current_authority_set_info.id { + CurrentAuthoritySetInfo::::put(mmr_leaf.beefy_next_authority_set); + } + + // Import commitment. + let block_number_index = commitments_info.next_block_number_index; + let to_prune = ImportedBlockNumbers::::try_get(block_number_index); + ImportedCommitments::::insert( + commitment.commitment.block_number, + ImportedCommitment:: { + parent_number_and_hash: mmr_leaf.parent_number_and_hash, + mmr_root, + }, + ); + ImportedBlockNumbers::::insert( + block_number_index, + commitment.commitment.block_number, + ); + ImportedCommitmentsInfo::::put(ImportedCommitmentsInfoData { + best_block_number: commitment.commitment.block_number, + next_block_number_index: (block_number_index + 1) % T::CommitmentsToKeep::get(), + }); + if let Ok(old_block_number) = to_prune { + log::debug!( + target: LOG_TARGET, + "Pruning commitment for old block: {:?}.", + old_block_number + ); + ImportedCommitments::::remove(old_block_number); + } + + log::info!( + target: LOG_TARGET, + "Successfully imported commitment for block {:?}", + commitment.commitment.block_number, + ); + + Ok(()) + } + } + + /// The current number of requests which have written to storage. + /// + /// If the `RequestCount` hits `MaxRequests`, no more calls will be allowed to the pallet until + /// the request capacity is increased. + /// + /// The `RequestCount` is decreased by one at the beginning of every block. This is to ensure + /// that the pallet can always make progress. + #[pallet::storage] + #[pallet::getter(fn request_count)] + pub type RequestCount, I: 'static = ()> = StorageValue<_, u32, ValueQuery>; + + /// High level info about the imported commitments. + /// + /// Contains the following info: + /// - best known block number of the bridged chain, finalized by BEEFY + /// - the head of the `ImportedBlockNumbers` ring buffer + #[pallet::storage] + pub type ImportedCommitmentsInfo, I: 'static = ()> = + StorageValue<_, ImportedCommitmentsInfoData>>; + + /// A ring buffer containing the block numbers of the commitments that we have imported, + /// ordered by the insertion time. + #[pallet::storage] + pub(super) type ImportedBlockNumbers, I: 'static = ()> = + StorageMap<_, Identity, u32, BridgedBlockNumber>; + + /// All the commitments that we have imported and haven't been pruned yet. + #[pallet::storage] + pub type ImportedCommitments, I: 'static = ()> = + StorageMap<_, Blake2_128Concat, BridgedBlockNumber, ImportedCommitment>; + + /// The current BEEFY authority set at the bridged chain. + #[pallet::storage] + pub type CurrentAuthoritySetInfo, I: 'static = ()> = + StorageValue<_, BridgedBeefyAuthoritySetInfo, ValueQuery>; + + /// Optional pallet owner. + /// + /// Pallet owner has the right to halt all pallet operations and then resume it. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. `democracy::referendum` to update halt + /// flag directly or calling `halt_operations`). + #[pallet::storage] + pub type PalletOwner, I: 'static = ()> = + StorageValue<_, T::AccountId, OptionQuery>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, or no transactions will be allowed. + #[pallet::storage] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, BasicOperatingMode, ValueQuery>; + + #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig, I: 'static = ()> { + /// Optional module owner account. + pub owner: Option, + /// Optional module initialization data. + pub init_data: Option>, + } + + #[pallet::genesis_build] + impl, I: 'static> BuildGenesisConfig for GenesisConfig { + fn build(&self) { + if let Some(ref owner) = self.owner { + >::put(owner); + } + + if let Some(init_data) = self.init_data.clone() { + initialize::(init_data) + .expect("invalid initialization data of BEEFY bridge pallet"); + } else { + // Since the bridge hasn't been initialized we shouldn't allow anyone to perform + // transactions. + >::put(BasicOperatingMode::Halted); + } + } + } + + #[pallet::error] + pub enum Error { + /// The pallet has not been initialized yet. + NotInitialized, + /// The pallet has already been initialized. + AlreadyInitialized, + /// Invalid initial authority set. + InvalidInitialAuthoritySet, + /// There are too many requests for the current window to handle. + TooManyRequests, + /// The imported commitment is older than the best commitment known to the pallet. + OldCommitment, + /// The commitment is signed by unknown validator set. + InvalidCommitmentValidatorSetId, + /// The id of the provided validator set is invalid. + InvalidValidatorSetId, + /// The number of signatures in the commitment is invalid. + InvalidCommitmentSignaturesLen, + /// The number of validator ids provided is invalid. + InvalidValidatorSetLen, + /// There aren't enough correct signatures in the commitment to finalize the block. + NotEnoughCorrectSignatures, + /// MMR root is missing from the commitment. + MmrRootMissingFromCommitment, + /// MMR proof verification has failed. + MmrProofVerificationFailed, + /// The validators are not matching the merkle tree root of the authority set. + InvalidValidatorSetRoot, + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Initialize pallet with given parameters. + pub(super) fn initialize, I: 'static>( + init_data: InitializationDataOf, + ) -> Result<(), Error> { + if init_data.authority_set.len == 0 { + return Err(Error::::InvalidInitialAuthoritySet) + } + CurrentAuthoritySetInfo::::put(init_data.authority_set); + + >::put(init_data.operating_mode); + ImportedCommitmentsInfo::::put(ImportedCommitmentsInfoData { + best_block_number: init_data.best_block_number, + next_block_number_index: 0, + }); + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use bp_runtime::{BasicOperatingMode, OwnedBridgeModuleError}; + use bp_test_utils::generate_owned_bridge_module_tests; + use frame_support::{assert_noop, assert_ok, traits::Get}; + use mock::*; + use mock_chain::*; + use sp_consensus_beefy::mmr::BeefyAuthoritySet; + use sp_runtime::DispatchError; + + fn next_block() { + use frame_support::traits::OnInitialize; + + let current_number = frame_system::Pallet::::block_number(); + frame_system::Pallet::::set_block_number(current_number + 1); + let _ = Pallet::::on_initialize(current_number); + } + + fn import_header_chain(headers: Vec) { + for header in headers { + if header.commitment.is_some() { + assert_ok!(import_commitment(header)); + } + } + } + + #[test] + fn fails_to_initialize_if_already_initialized() { + run_test_with_initialize(32, || { + assert_noop!( + Pallet::::initialize( + RuntimeOrigin::root(), + InitializationData { + operating_mode: BasicOperatingMode::Normal, + best_block_number: 0, + authority_set: BeefyAuthoritySet { + id: 0, + len: 1, + keyset_commitment: [0u8; 32].into() + } + } + ), + Error::::AlreadyInitialized, + ); + }); + } + + #[test] + fn fails_to_initialize_if_authority_set_is_empty() { + run_test(|| { + assert_noop!( + Pallet::::initialize( + RuntimeOrigin::root(), + InitializationData { + operating_mode: BasicOperatingMode::Normal, + best_block_number: 0, + authority_set: BeefyAuthoritySet { + id: 0, + len: 0, + keyset_commitment: [0u8; 32].into() + } + } + ), + Error::::InvalidInitialAuthoritySet, + ); + }); + } + + #[test] + fn fails_to_import_commitment_if_halted() { + run_test_with_initialize(1, || { + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Halted + )); + assert_noop!( + import_commitment(ChainBuilder::new(1).append_finalized_header().to_header()), + Error::::BridgeModule(OwnedBridgeModuleError::Halted), + ); + }) + } + + #[test] + fn fails_to_import_commitment_if_too_many_requests() { + run_test_with_initialize(1, || { + let max_requests = <::MaxRequests as Get>::get() as u64; + let mut chain = ChainBuilder::new(1); + for _ in 0..max_requests + 2 { + chain = chain.append_finalized_header(); + } + + // import `max_request` headers + for i in 0..max_requests { + assert_ok!(import_commitment(chain.header(i + 1))); + } + + // try to import next header: it fails because we are no longer accepting commitments + assert_noop!( + import_commitment(chain.header(max_requests + 1)), + Error::::TooManyRequests, + ); + + // when next block is "started", we allow import of next header + next_block(); + assert_ok!(import_commitment(chain.header(max_requests + 1))); + + // but we can't import two headers until next block and so on + assert_noop!( + import_commitment(chain.header(max_requests + 2)), + Error::::TooManyRequests, + ); + }) + } + + #[test] + fn fails_to_import_commitment_if_not_initialized() { + run_test(|| { + assert_noop!( + import_commitment(ChainBuilder::new(1).append_finalized_header().to_header()), + Error::::NotInitialized, + ); + }) + } + + #[test] + fn submit_commitment_works_with_long_chain_with_handoffs() { + run_test_with_initialize(3, || { + let chain = ChainBuilder::new(3) + .append_finalized_header() + .append_default_headers(16) // 2..17 + .append_finalized_header() // 18 + .append_default_headers(16) // 19..34 + .append_handoff_header(9) // 35 + .append_default_headers(8) // 36..43 + .append_finalized_header() // 44 + .append_default_headers(8) // 45..52 + .append_handoff_header(17) // 53 + .append_default_headers(4) // 54..57 + .append_finalized_header() // 58 + .append_default_headers(4); // 59..63 + import_header_chain(chain.to_chain()); + + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().best_block_number, + 58 + ); + assert_eq!(CurrentAuthoritySetInfo::::get().id, 2); + assert_eq!(CurrentAuthoritySetInfo::::get().len, 17); + + let imported_commitment = ImportedCommitments::::get(58).unwrap(); + assert_eq!( + imported_commitment, + bp_beefy::ImportedCommitment { + parent_number_and_hash: (57, chain.header(57).header.hash()), + mmr_root: chain.header(58).mmr_root, + }, + ); + }) + } + + #[test] + fn commitment_pruning_works() { + run_test_with_initialize(3, || { + let commitments_to_keep = >::CommitmentsToKeep::get(); + let commitments_to_import: Vec = ChainBuilder::new(3) + .append_finalized_headers(commitments_to_keep as usize + 2) + .to_chain(); + + // import exactly `CommitmentsToKeep` commitments + for index in 0..commitments_to_keep { + next_block(); + import_commitment(commitments_to_import[index as usize].clone()) + .expect("must succeed"); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + (index + 1) % commitments_to_keep + ); + } + + // ensure that all commitments are in the storage + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().best_block_number, + commitments_to_keep as TestBridgedBlockNumber + ); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + 0 + ); + for index in 0..commitments_to_keep { + assert!(ImportedCommitments::::get( + index as TestBridgedBlockNumber + 1 + ) + .is_some()); + assert_eq!( + ImportedBlockNumbers::::get(index), + Some(Into::into(index + 1)), + ); + } + + // import next commitment + next_block(); + import_commitment(commitments_to_import[commitments_to_keep as usize].clone()) + .expect("must succeed"); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + 1 + ); + assert!(ImportedCommitments::::get( + commitments_to_keep as TestBridgedBlockNumber + 1 + ) + .is_some()); + assert_eq!( + ImportedBlockNumbers::::get(0), + Some(Into::into(commitments_to_keep + 1)), + ); + // the side effect of the import is that the commitment#1 is pruned + assert!(ImportedCommitments::::get(1).is_none()); + + // import next commitment + next_block(); + import_commitment(commitments_to_import[commitments_to_keep as usize + 1].clone()) + .expect("must succeed"); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + 2 + ); + assert!(ImportedCommitments::::get( + commitments_to_keep as TestBridgedBlockNumber + 2 + ) + .is_some()); + assert_eq!( + ImportedBlockNumbers::::get(1), + Some(Into::into(commitments_to_keep + 2)), + ); + // the side effect of the import is that the commitment#2 is pruned + assert!(ImportedCommitments::::get(1).is_none()); + assert!(ImportedCommitments::::get(2).is_none()); + }); + } + + generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); +} diff --git a/modules/beefy/src/mock.rs b/modules/beefy/src/mock.rs new file mode 100644 index 000000000000..f89fd1e63480 --- /dev/null +++ b/modules/beefy/src/mock.rs @@ -0,0 +1,191 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate as beefy; +use crate::{ + utils::get_authorities_mmr_root, BridgedBeefyAuthoritySet, BridgedBeefyAuthoritySetInfo, + BridgedBeefyCommitmentHasher, BridgedBeefyMmrLeafExtra, BridgedBeefySignedCommitment, + BridgedMmrHash, BridgedMmrHashing, BridgedMmrProof, +}; + +use bp_beefy::{BeefyValidatorSignatureOf, ChainWithBeefy, Commitment, MmrDataOrHash}; +use bp_runtime::{BasicOperatingMode, Chain}; +use codec::Encode; +use frame_support::{construct_runtime, derive_impl, weights::Weight}; +use sp_core::{sr25519::Signature, Pair}; +use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, Hash}, +}; + +pub use sp_consensus_beefy::ecdsa_crypto::{AuthorityId as BeefyId, Pair as BeefyPair}; +use sp_core::crypto::Wraps; +use sp_runtime::traits::Keccak256; + +pub type TestAccountId = u64; +pub type TestBridgedBlockNumber = u64; +pub type TestBridgedBlockHash = H256; +pub type TestBridgedHeader = Header; +pub type TestBridgedAuthoritySetInfo = BridgedBeefyAuthoritySetInfo; +pub type TestBridgedValidatorSet = BridgedBeefyAuthoritySet; +pub type TestBridgedCommitment = BridgedBeefySignedCommitment; +pub type TestBridgedValidatorSignature = BeefyValidatorSignatureOf; +pub type TestBridgedCommitmentHasher = BridgedBeefyCommitmentHasher; +pub type TestBridgedMmrHashing = BridgedMmrHashing; +pub type TestBridgedMmrHash = BridgedMmrHash; +pub type TestBridgedBeefyMmrLeafExtra = BridgedBeefyMmrLeafExtra; +pub type TestBridgedMmrProof = BridgedMmrProof; +pub type TestBridgedRawMmrLeaf = sp_consensus_beefy::mmr::MmrLeaf< + TestBridgedBlockNumber, + TestBridgedBlockHash, + TestBridgedMmrHash, + TestBridgedBeefyMmrLeafExtra, +>; +pub type TestBridgedMmrNode = MmrDataOrHash; + +type Block = frame_system::mocking::MockBlock; + +construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Beefy: beefy::{Pallet}, + } +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; +} + +impl beefy::Config for TestRuntime { + type MaxRequests = frame_support::traits::ConstU32<16>; + type BridgedChain = TestBridgedChain; + type CommitmentsToKeep = frame_support::traits::ConstU32<16>; +} + +#[derive(Debug)] +pub struct TestBridgedChain; + +impl Chain for TestBridgedChain { + type BlockNumber = TestBridgedBlockNumber; + type Hash = H256; + type Hasher = BlakeTwo256; + type Header = sp_runtime::testing::Header; + + type AccountId = TestAccountId; + type Balance = u64; + type Nonce = u64; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithBeefy for TestBridgedChain { + type CommitmentHasher = Keccak256; + type MmrHashing = Keccak256; + type MmrHash = ::Output; + type BeefyMmrLeafExtra = (); + type AuthorityId = BeefyId; + type AuthorityIdToMerkleLeaf = pallet_beefy_mmr::BeefyEcdsaToEthereum; +} + +/// Run test within test runtime. +pub fn run_test(test: impl FnOnce() -> T) -> T { + sp_io::TestExternalities::new(Default::default()).execute_with(test) +} + +/// Initialize pallet and run test. +pub fn run_test_with_initialize(initial_validators_count: u32, test: impl FnOnce() -> T) -> T { + run_test(|| { + let validators = validator_ids(0, initial_validators_count); + let authority_set = authority_set_info(0, &validators); + + crate::Pallet::::initialize( + RuntimeOrigin::root(), + bp_beefy::InitializationData { + operating_mode: BasicOperatingMode::Normal, + best_block_number: 0, + authority_set, + }, + ) + .expect("initialization data is correct"); + + test() + }) +} + +/// Import given commitment. +pub fn import_commitment( + header: crate::mock_chain::HeaderAndCommitment, +) -> sp_runtime::DispatchResult { + crate::Pallet::::submit_commitment( + RuntimeOrigin::signed(1), + header + .commitment + .expect("thou shall not call import_commitment on header without commitment"), + header.validator_set, + Box::new(header.leaf), + header.leaf_proof, + ) +} + +pub fn validator_pairs(index: u32, count: u32) -> Vec { + (index..index + count) + .map(|index| { + let mut seed = [1u8; 32]; + seed[0..8].copy_from_slice(&(index as u64).encode()); + BeefyPair::from_seed(&seed) + }) + .collect() +} + +/// Return identifiers of validators, starting at given index. +pub fn validator_ids(index: u32, count: u32) -> Vec { + validator_pairs(index, count).into_iter().map(|pair| pair.public()).collect() +} + +pub fn authority_set_info(id: u64, validators: &[BeefyId]) -> TestBridgedAuthoritySetInfo { + let merkle_root = get_authorities_mmr_root::(validators.iter()); + + TestBridgedAuthoritySetInfo { id, len: validators.len() as u32, keyset_commitment: merkle_root } +} + +/// Sign BEEFY commitment. +pub fn sign_commitment( + commitment: Commitment, + validator_pairs: &[BeefyPair], + signature_count: usize, +) -> TestBridgedCommitment { + let total_validators = validator_pairs.len(); + let random_validators = + rand::seq::index::sample(&mut rand::thread_rng(), total_validators, signature_count); + + let commitment_hash = TestBridgedCommitmentHasher::hash(&commitment.encode()); + let mut signatures = vec![None; total_validators]; + for validator_idx in random_validators.iter() { + let validator = &validator_pairs[validator_idx]; + signatures[validator_idx] = + Some(validator.as_inner_ref().sign_prehashed(commitment_hash.as_fixed_bytes()).into()); + } + + TestBridgedCommitment { commitment, signatures } +} diff --git a/modules/beefy/src/mock_chain.rs b/modules/beefy/src/mock_chain.rs new file mode 100644 index 000000000000..c4fa74915bfe --- /dev/null +++ b/modules/beefy/src/mock_chain.rs @@ -0,0 +1,299 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Utilities to build bridged chain and BEEFY+MMR structures. + +use crate::{ + mock::{ + sign_commitment, validator_pairs, BeefyPair, TestBridgedBlockNumber, TestBridgedCommitment, + TestBridgedHeader, TestBridgedMmrHash, TestBridgedMmrHashing, TestBridgedMmrNode, + TestBridgedMmrProof, TestBridgedRawMmrLeaf, TestBridgedValidatorSet, + TestBridgedValidatorSignature, TestRuntime, + }, + utils::get_authorities_mmr_root, +}; + +use bp_beefy::{BeefyPayload, Commitment, ValidatorSetId, MMR_ROOT_PAYLOAD_ID}; +use codec::Encode; +use pallet_mmr::NodeIndex; +use rand::Rng; +use sp_consensus_beefy::mmr::{BeefyNextAuthoritySet, MmrLeafVersion}; +use sp_core::Pair; +use sp_runtime::traits::{Hash, Header as HeaderT}; +use std::collections::HashMap; + +#[derive(Debug, Clone)] +pub struct HeaderAndCommitment { + pub header: TestBridgedHeader, + pub commitment: Option, + pub validator_set: TestBridgedValidatorSet, + pub leaf: TestBridgedRawMmrLeaf, + pub leaf_proof: TestBridgedMmrProof, + pub mmr_root: TestBridgedMmrHash, +} + +impl HeaderAndCommitment { + pub fn customize_signatures( + &mut self, + f: impl FnOnce(&mut Vec>), + ) { + if let Some(commitment) = &mut self.commitment { + f(&mut commitment.signatures); + } + } + + pub fn customize_commitment( + &mut self, + f: impl FnOnce(&mut Commitment), + validator_pairs: &[BeefyPair], + signature_count: usize, + ) { + if let Some(mut commitment) = self.commitment.take() { + f(&mut commitment.commitment); + self.commitment = + Some(sign_commitment(commitment.commitment, validator_pairs, signature_count)); + } + } +} + +pub struct ChainBuilder { + headers: Vec, + validator_set_id: ValidatorSetId, + validator_keys: Vec, + mmr: mmr_lib::MMR, +} + +struct BridgedMmrStorage { + nodes: HashMap, +} + +impl mmr_lib::MMRStore for BridgedMmrStorage { + fn get_elem(&self, pos: NodeIndex) -> mmr_lib::Result> { + Ok(self.nodes.get(&pos).cloned()) + } + + fn append(&mut self, pos: NodeIndex, elems: Vec) -> mmr_lib::Result<()> { + for (i, elem) in elems.into_iter().enumerate() { + self.nodes.insert(pos + i as NodeIndex, elem); + } + Ok(()) + } +} + +impl ChainBuilder { + /// Creates new chain builder with given validator set size. + pub fn new(initial_validators_count: u32) -> Self { + ChainBuilder { + headers: Vec::new(), + validator_set_id: 0, + validator_keys: validator_pairs(0, initial_validators_count), + mmr: mmr_lib::MMR::new(0, BridgedMmrStorage { nodes: HashMap::new() }), + } + } + + /// Get header with given number. + pub fn header(&self, number: TestBridgedBlockNumber) -> HeaderAndCommitment { + self.headers[number as usize - 1].clone() + } + + /// Returns single built header. + pub fn to_header(&self) -> HeaderAndCommitment { + assert_eq!(self.headers.len(), 1); + self.headers[0].clone() + } + + /// Returns built chain. + pub fn to_chain(&self) -> Vec { + self.headers.clone() + } + + /// Appends header, that has been finalized by BEEFY (so it has a linked signed commitment). + pub fn append_finalized_header(self) -> Self { + let next_validator_set_id = self.validator_set_id; + let next_validator_keys = self.validator_keys.clone(); + HeaderBuilder::with_chain(self, next_validator_set_id, next_validator_keys).finalize() + } + + /// Append multiple finalized headers at once. + pub fn append_finalized_headers(mut self, count: usize) -> Self { + for _ in 0..count { + self = self.append_finalized_header(); + } + self + } + + /// Appends header, that enacts new validator set. + /// + /// Such headers are explicitly finalized by BEEFY. + pub fn append_handoff_header(self, next_validators_len: u32) -> Self { + let new_validator_set_id = self.validator_set_id + 1; + let new_validator_pairs = + validator_pairs(rand::thread_rng().gen::() % (u32::MAX / 2), next_validators_len); + + HeaderBuilder::with_chain(self, new_validator_set_id, new_validator_pairs).finalize() + } + + /// Append several default header without commitment. + pub fn append_default_headers(mut self, count: usize) -> Self { + for _ in 0..count { + let next_validator_set_id = self.validator_set_id; + let next_validator_keys = self.validator_keys.clone(); + self = + HeaderBuilder::with_chain(self, next_validator_set_id, next_validator_keys).build() + } + self + } +} + +/// Custom header builder. +pub struct HeaderBuilder { + chain: ChainBuilder, + header: TestBridgedHeader, + leaf: TestBridgedRawMmrLeaf, + leaf_proof: Option, + next_validator_set_id: ValidatorSetId, + next_validator_keys: Vec, +} + +impl HeaderBuilder { + fn with_chain( + chain: ChainBuilder, + next_validator_set_id: ValidatorSetId, + next_validator_keys: Vec, + ) -> Self { + // we're starting with header#1, since header#0 is always finalized + let header_number = chain.headers.len() as TestBridgedBlockNumber + 1; + let header = TestBridgedHeader::new( + header_number, + Default::default(), + Default::default(), + chain.headers.last().map(|h| h.header.hash()).unwrap_or_default(), + Default::default(), + ); + + let next_validators = + next_validator_keys.iter().map(|pair| pair.public()).collect::>(); + let next_validators_mmr_root = + get_authorities_mmr_root::(next_validators.iter()); + let leaf = sp_consensus_beefy::mmr::MmrLeaf { + version: MmrLeafVersion::new(1, 0), + parent_number_and_hash: (header.number().saturating_sub(1), *header.parent_hash()), + beefy_next_authority_set: BeefyNextAuthoritySet { + id: next_validator_set_id, + len: next_validators.len() as u32, + keyset_commitment: next_validators_mmr_root, + }, + leaf_extra: (), + }; + + HeaderBuilder { + chain, + header, + leaf, + leaf_proof: None, + next_validator_keys, + next_validator_set_id, + } + } + + /// Customize generated proof of header MMR leaf. + /// + /// Can only be called once. + pub fn customize_proof( + mut self, + f: impl FnOnce(TestBridgedMmrProof) -> TestBridgedMmrProof, + ) -> Self { + assert!(self.leaf_proof.is_none()); + + let leaf_hash = TestBridgedMmrHashing::hash(&self.leaf.encode()); + let node = TestBridgedMmrNode::Hash(leaf_hash); + let leaf_position = self.chain.mmr.push(node).unwrap(); + + let proof = self.chain.mmr.gen_proof(vec![leaf_position]).unwrap(); + // genesis has no leaf => leaf index is header number minus 1 + let leaf_index = *self.header.number() - 1; + let leaf_count = *self.header.number(); + self.leaf_proof = Some(f(TestBridgedMmrProof { + leaf_indices: vec![leaf_index], + leaf_count, + items: proof.proof_items().iter().map(|i| i.hash()).collect(), + })); + + self + } + + /// Build header without commitment. + pub fn build(mut self) -> ChainBuilder { + if self.leaf_proof.is_none() { + self = self.customize_proof(|proof| proof); + } + + let validators = + self.chain.validator_keys.iter().map(|pair| pair.public()).collect::>(); + self.chain.headers.push(HeaderAndCommitment { + header: self.header, + commitment: None, + validator_set: TestBridgedValidatorSet::new(validators, self.chain.validator_set_id) + .unwrap(), + leaf: self.leaf, + leaf_proof: self.leaf_proof.expect("guaranteed by the customize_proof call above; qed"), + mmr_root: self.chain.mmr.get_root().unwrap().hash(), + }); + + self.chain.validator_set_id = self.next_validator_set_id; + self.chain.validator_keys = self.next_validator_keys; + + self.chain + } + + /// Build header with commitment. + pub fn finalize(self) -> ChainBuilder { + let validator_count = self.chain.validator_keys.len(); + let current_validator_set_id = self.chain.validator_set_id; + let current_validator_set_keys = self.chain.validator_keys.clone(); + let mut chain = self.build(); + + let last_header = chain.headers.last_mut().expect("added by append_header; qed"); + last_header.commitment = Some(sign_commitment( + Commitment { + payload: BeefyPayload::from_single_entry( + MMR_ROOT_PAYLOAD_ID, + chain.mmr.get_root().unwrap().hash().encode(), + ), + block_number: *last_header.header.number(), + validator_set_id: current_validator_set_id, + }, + ¤t_validator_set_keys, + validator_count * 2 / 3 + 1, + )); + + chain + } +} + +/// Default Merging & Hashing behavior for MMR. +pub struct BridgedMmrHashMerge; + +impl mmr_lib::Merge for BridgedMmrHashMerge { + type Item = TestBridgedMmrNode; + + fn merge(left: &Self::Item, right: &Self::Item) -> Self::Item { + let mut concat = left.hash().as_ref().to_vec(); + concat.extend_from_slice(right.hash().as_ref()); + + TestBridgedMmrNode::Hash(TestBridgedMmrHashing::hash(&concat)) + } +} diff --git a/modules/beefy/src/utils.rs b/modules/beefy/src/utils.rs new file mode 100644 index 000000000000..ce7a116308d1 --- /dev/null +++ b/modules/beefy/src/utils.rs @@ -0,0 +1,361 @@ +use crate::{ + BridgedBeefyAuthorityId, BridgedBeefyAuthoritySet, BridgedBeefyAuthoritySetInfo, + BridgedBeefyMmrLeaf, BridgedBeefySignedCommitment, BridgedChain, BridgedMmrHash, + BridgedMmrHashing, BridgedMmrProof, Config, Error, LOG_TARGET, +}; +use bp_beefy::{merkle_root, verify_mmr_leaves_proof, BeefyAuthorityId, MmrDataOrHash}; +use codec::Encode; +use frame_support::ensure; +use sp_runtime::traits::{Convert, Hash}; +use sp_std::{vec, vec::Vec}; + +type BridgedMmrDataOrHash = MmrDataOrHash, BridgedBeefyMmrLeaf>; +/// A way to encode validator id to the BEEFY merkle tree leaf. +type BridgedBeefyAuthorityIdToMerkleLeaf = + bp_beefy::BeefyAuthorityIdToMerkleLeafOf>; + +/// Get the MMR root for a collection of validators. +pub(crate) fn get_authorities_mmr_root< + 'a, + T: Config, + I: 'static, + V: Iterator>, +>( + authorities: V, +) -> BridgedMmrHash { + let merkle_leafs = authorities + .cloned() + .map(BridgedBeefyAuthorityIdToMerkleLeaf::::convert) + .collect::>(); + merkle_root::, _>(merkle_leafs) +} + +fn verify_authority_set, I: 'static>( + authority_set_info: &BridgedBeefyAuthoritySetInfo, + authority_set: &BridgedBeefyAuthoritySet, +) -> Result<(), Error> { + ensure!(authority_set.id() == authority_set_info.id, Error::::InvalidValidatorSetId); + ensure!( + authority_set.len() == authority_set_info.len as usize, + Error::::InvalidValidatorSetLen + ); + + // Ensure that the authority set that signed the commitment is the expected one. + let root = get_authorities_mmr_root::(authority_set.validators().iter()); + ensure!(root == authority_set_info.keyset_commitment, Error::::InvalidValidatorSetRoot); + + Ok(()) +} + +/// Number of correct signatures, required from given validators set to accept signed +/// commitment. +/// +/// We're using 'conservative' approach here, where signatures of `2/3+1` validators are +/// required.. +pub(crate) fn signatures_required(validators_len: usize) -> usize { + validators_len - validators_len.saturating_sub(1) / 3 +} + +fn verify_signatures, I: 'static>( + commitment: &BridgedBeefySignedCommitment, + authority_set: &BridgedBeefyAuthoritySet, +) -> Result<(), Error> { + ensure!( + commitment.signatures.len() == authority_set.len(), + Error::::InvalidCommitmentSignaturesLen + ); + + // Ensure that the commitment was signed by enough authorities. + let msg = commitment.commitment.encode(); + let mut missing_signatures = signatures_required(authority_set.len()); + for (idx, (authority, maybe_sig)) in + authority_set.validators().iter().zip(commitment.signatures.iter()).enumerate() + { + if let Some(sig) = maybe_sig { + if authority.verify(sig, &msg) { + missing_signatures = missing_signatures.saturating_sub(1); + if missing_signatures == 0 { + break + } + } else { + log::debug!( + target: LOG_TARGET, + "Signed commitment contains incorrect signature of validator {} ({:?}): {:?}", + idx, + authority, + sig, + ); + } + } + } + ensure!(missing_signatures == 0, Error::::NotEnoughCorrectSignatures); + + Ok(()) +} + +/// Extract MMR root from commitment payload. +fn extract_mmr_root, I: 'static>( + commitment: &BridgedBeefySignedCommitment, +) -> Result, Error> { + commitment + .commitment + .payload + .get_decoded(&bp_beefy::MMR_ROOT_PAYLOAD_ID) + .ok_or(Error::MmrRootMissingFromCommitment) +} + +pub(crate) fn verify_commitment, I: 'static>( + commitment: &BridgedBeefySignedCommitment, + authority_set_info: &BridgedBeefyAuthoritySetInfo, + authority_set: &BridgedBeefyAuthoritySet, +) -> Result, Error> { + // Ensure that the commitment is signed by the best known BEEFY validator set. + ensure!( + commitment.commitment.validator_set_id == authority_set_info.id, + Error::::InvalidCommitmentValidatorSetId + ); + ensure!( + commitment.signatures.len() == authority_set_info.len as usize, + Error::::InvalidCommitmentSignaturesLen + ); + + verify_authority_set(authority_set_info, authority_set)?; + verify_signatures(commitment, authority_set)?; + + extract_mmr_root(commitment) +} + +/// Verify MMR proof of given leaf. +pub(crate) fn verify_beefy_mmr_leaf, I: 'static>( + mmr_leaf: &BridgedBeefyMmrLeaf, + mmr_proof: BridgedMmrProof, + mmr_root: BridgedMmrHash, +) -> Result<(), Error> { + let mmr_proof_leaf_count = mmr_proof.leaf_count; + let mmr_proof_length = mmr_proof.items.len(); + + // Verify the mmr proof for the provided leaf. + let mmr_leaf_hash = BridgedMmrHashing::::hash(&mmr_leaf.encode()); + verify_mmr_leaves_proof( + mmr_root, + vec![BridgedMmrDataOrHash::::Hash(mmr_leaf_hash)], + mmr_proof, + ) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "MMR proof of leaf {:?} (root: {:?}, leaf count: {}, len: {}) \ + verification has failed with error: {:?}", + mmr_leaf_hash, + mmr_root, + mmr_proof_leaf_count, + mmr_proof_length, + e, + ); + + Error::::MmrProofVerificationFailed + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{mock::*, mock_chain::*, *}; + use bp_beefy::{BeefyPayload, MMR_ROOT_PAYLOAD_ID}; + use frame_support::{assert_noop, assert_ok}; + use sp_consensus_beefy::ValidatorSet; + + #[test] + fn submit_commitment_checks_metadata() { + run_test_with_initialize(8, || { + // Fails if `commitment.commitment.validator_set_id` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.customize_commitment( + |commitment| { + commitment.validator_set_id += 1; + }, + &validator_pairs(0, 8), + 6, + ); + assert_noop!( + import_commitment(header), + Error::::InvalidCommitmentValidatorSetId, + ); + + // Fails if `commitment.signatures.len()` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + signatures.pop(); + }); + assert_noop!( + import_commitment(header), + Error::::InvalidCommitmentSignaturesLen, + ); + }); + } + + #[test] + fn submit_commitment_checks_validator_set() { + run_test_with_initialize(8, || { + // Fails if `ValidatorSet::id` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.validator_set = ValidatorSet::new(validator_ids(0, 8), 1).unwrap(); + assert_noop!( + import_commitment(header), + Error::::InvalidValidatorSetId, + ); + + // Fails if `ValidatorSet::len()` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.validator_set = ValidatorSet::new(validator_ids(0, 5), 0).unwrap(); + assert_noop!( + import_commitment(header), + Error::::InvalidValidatorSetLen, + ); + + // Fails if the validators differ. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.validator_set = ValidatorSet::new(validator_ids(3, 8), 0).unwrap(); + assert_noop!( + import_commitment(header), + Error::::InvalidValidatorSetRoot, + ); + }); + } + + #[test] + fn submit_commitment_checks_signatures() { + run_test_with_initialize(20, || { + // Fails when there aren't enough signatures. + let mut header = ChainBuilder::new(20).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + let first_signature_idx = signatures.iter().position(Option::is_some).unwrap(); + signatures[first_signature_idx] = None; + }); + assert_noop!( + import_commitment(header), + Error::::NotEnoughCorrectSignatures, + ); + + // Fails when there aren't enough correct signatures. + let mut header = ChainBuilder::new(20).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + let first_signature_idx = signatures.iter().position(Option::is_some).unwrap(); + let last_signature_idx = signatures.len() - + signatures.iter().rev().position(Option::is_some).unwrap() - + 1; + signatures[first_signature_idx] = signatures[last_signature_idx].clone(); + }); + assert_noop!( + import_commitment(header), + Error::::NotEnoughCorrectSignatures, + ); + + // Returns Ok(()) when there are enough signatures, even if some are incorrect. + let mut header = ChainBuilder::new(20).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + let first_signature_idx = signatures.iter().position(Option::is_some).unwrap(); + let first_missing_signature_idx = + signatures.iter().position(Option::is_none).unwrap(); + signatures[first_missing_signature_idx] = signatures[first_signature_idx].clone(); + }); + assert_ok!(import_commitment(header)); + }); + } + + #[test] + fn submit_commitment_checks_mmr_proof() { + run_test_with_initialize(1, || { + let validators = validator_pairs(0, 1); + + // Fails if leaf is not for parent. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + header.leaf.parent_number_and_hash.0 += 1; + assert_noop!( + import_commitment(header), + Error::::MmrProofVerificationFailed, + ); + + // Fails if mmr proof is incorrect. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + header.leaf_proof.leaf_indices[0] += 1; + assert_noop!( + import_commitment(header), + Error::::MmrProofVerificationFailed, + ); + + // Fails if mmr root is incorrect. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + // Replace MMR root with zeroes. + header.customize_commitment( + |commitment| { + commitment.payload = + BeefyPayload::from_single_entry(MMR_ROOT_PAYLOAD_ID, [0u8; 32].encode()); + }, + &validators, + 1, + ); + assert_noop!( + import_commitment(header), + Error::::MmrProofVerificationFailed, + ); + }); + } + + #[test] + fn submit_commitment_extracts_mmr_root() { + run_test_with_initialize(1, || { + let validators = validator_pairs(0, 1); + + // Fails if there is no mmr root in the payload. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + // Remove MMR root from the payload. + header.customize_commitment( + |commitment| { + commitment.payload = BeefyPayload::from_single_entry(*b"xy", vec![]); + }, + &validators, + 1, + ); + assert_noop!( + import_commitment(header), + Error::::MmrRootMissingFromCommitment, + ); + + // Fails if mmr root can't be decoded. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + // MMR root is a 32-byte array and we have replaced it with single byte + header.customize_commitment( + |commitment| { + commitment.payload = + BeefyPayload::from_single_entry(MMR_ROOT_PAYLOAD_ID, vec![42]); + }, + &validators, + 1, + ); + assert_noop!( + import_commitment(header), + Error::::MmrRootMissingFromCommitment, + ); + }); + } + + #[test] + fn submit_commitment_stores_valid_data() { + run_test_with_initialize(20, || { + let header = ChainBuilder::new(20).append_handoff_header(30).to_header(); + assert_ok!(import_commitment(header.clone())); + + assert_eq!(ImportedCommitmentsInfo::::get().unwrap().best_block_number, 1); + assert_eq!(CurrentAuthoritySetInfo::::get().id, 1); + assert_eq!(CurrentAuthoritySetInfo::::get().len, 30); + assert_eq!( + ImportedCommitments::::get(1).unwrap(), + bp_beefy::ImportedCommitment { + parent_number_and_hash: (0, [0; 32].into()), + mmr_root: header.mmr_root, + }, + ); + }); + } +} diff --git a/modules/grandpa/Cargo.toml b/modules/grandpa/Cargo.toml new file mode 100644 index 000000000000..4d8a5c074461 --- /dev/null +++ b/modules/grandpa/Cargo.toml @@ -0,0 +1,68 @@ +[package] +name = "pallet-bridge-grandpa" +version = "0.1.0" +description = "Module implementing GRANDPA on-chain light client used for bridging consensus of substrate-based chains." +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +finality-grandpa = { version = "0.16.2", default-features = false } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Bridge Dependencies + +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["serde"] } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["serde"] } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +# Optional Benchmarking Dependencies +bp-test-utils = { path = "../../primitives/test-utils", default-features = false, optional = true } +frame-benchmarking = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, optional = true } + +[dev-dependencies] +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-runtime/std", + "bp-test-utils/std", + "codec/std", + "finality-grandpa/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "sp-consensus-grandpa/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", +] +runtime-benchmarks = [ + "bp-test-utils", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/cumulus/bridges/modules/grandpa/README.md b/modules/grandpa/README.md similarity index 100% rename from cumulus/bridges/modules/grandpa/README.md rename to modules/grandpa/README.md diff --git a/modules/grandpa/src/benchmarking.rs b/modules/grandpa/src/benchmarking.rs new file mode 100644 index 000000000000..182b2f56eb1c --- /dev/null +++ b/modules/grandpa/src/benchmarking.rs @@ -0,0 +1,141 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Benchmarks for the GRANDPA Pallet. +//! +//! The main dispatchable for the GRANDPA pallet is `submit_finality_proof`, so these benchmarks are +//! based around that. There are to main factors which affect finality proof verification: +//! +//! 1. The number of `votes-ancestries` in the justification +//! 2. The number of `pre-commits` in the justification +//! +//! Vote ancestries are the headers between (`finality_target`, `head_of_chain`], where +//! `header_of_chain` is a descendant of `finality_target`. +//! +//! Pre-commits are messages which are signed by validators at the head of the chain they think is +//! the best. +//! +//! Consider the following: +//! +//! / B <- C' +//! A <- B <- C +//! +//! The common ancestor of both forks is block A, so this is what GRANDPA will finalize. In order to +//! verify this we will have vote ancestries of `[B, C, B', C']` and pre-commits `[C, C']`. +//! +//! Note that the worst case scenario here would be a justification where each validator has it's +//! own fork which is `SESSION_LENGTH` blocks long. + +use crate::*; + +use bp_header_chain::justification::required_justification_precommits; +use bp_runtime::BasicOperatingMode; +use bp_test_utils::{ + accounts, make_justification_for_header, JustificationGeneratorParams, TEST_GRANDPA_ROUND, + TEST_GRANDPA_SET_ID, +}; +use frame_benchmarking::{benchmarks_instance_pallet, whitelisted_caller}; +use frame_system::RawOrigin; +use sp_consensus_grandpa::AuthorityId; +use sp_runtime::traits::{One, Zero}; +use sp_std::vec::Vec; + +/// The maximum number of vote ancestries to include in a justification. +/// +/// In practice this would be limited by the session length (number of blocks a single authority set +/// can produce) of a given chain. +const MAX_VOTE_ANCESTRIES: u32 = 1000; + +// `1..MAX_VOTE_ANCESTRIES` is too large && benchmarks are running for almost 40m (steps=50, +// repeat=20) on a decent laptop, which is too much. Since we're building linear function here, +// let's just select some limited subrange for benchmarking. +const MAX_VOTE_ANCESTRIES_RANGE_BEGIN: u32 = MAX_VOTE_ANCESTRIES / 20; +const MAX_VOTE_ANCESTRIES_RANGE_END: u32 = + MAX_VOTE_ANCESTRIES_RANGE_BEGIN + MAX_VOTE_ANCESTRIES_RANGE_BEGIN; + +// the same with validators - if there are too much validators, let's run benchmarks on subrange +fn precommits_range_end, I: 'static>() -> u32 { + let max_bridged_authorities = T::BridgedChain::MAX_AUTHORITIES_COUNT; + if max_bridged_authorities > 128 { + sp_std::cmp::max(128, max_bridged_authorities / 5) + } else { + max_bridged_authorities + }; + required_justification_precommits(max_bridged_authorities) +} + +/// Prepare header and its justification to submit using `submit_finality_proof`. +fn prepare_benchmark_data, I: 'static>( + precommits: u32, + ancestors: u32, +) -> (BridgedHeader, GrandpaJustification>) { + // going from precommits to total authorities count + let total_authorities_count = (3 * precommits - 1) / 2; + + let authority_list = accounts(total_authorities_count as u16) + .iter() + .map(|id| (AuthorityId::from(*id), 1)) + .collect::>(); + + let genesis_header: BridgedHeader = bp_test_utils::test_header(Zero::zero()); + let genesis_hash = genesis_header.hash(); + let init_data = InitializationData { + header: Box::new(genesis_header), + authority_list, + set_id: TEST_GRANDPA_SET_ID, + operating_mode: BasicOperatingMode::Normal, + }; + + bootstrap_bridge::(init_data); + assert!(>::contains_key(genesis_hash)); + + let header: BridgedHeader = bp_test_utils::test_header(One::one()); + let params = JustificationGeneratorParams { + header: header.clone(), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: accounts(precommits as u16).iter().map(|k| (*k, 1)).collect::>(), + ancestors, + forks: 1, + }; + let justification = make_justification_for_header(params); + (header, justification) +} + +benchmarks_instance_pallet! { + // This is the "gold standard" benchmark for this extrinsic, and it's what should be used to + // annotate the weight in the pallet. + submit_finality_proof { + let p in 1 .. precommits_range_end::(); + let v in MAX_VOTE_ANCESTRIES_RANGE_BEGIN..MAX_VOTE_ANCESTRIES_RANGE_END; + let caller: T::AccountId = whitelisted_caller(); + let (header, justification) = prepare_benchmark_data::(p, v); + }: submit_finality_proof(RawOrigin::Signed(caller), Box::new(header), justification) + verify { + let genesis_header: BridgedHeader = bp_test_utils::test_header(Zero::zero()); + let header: BridgedHeader = bp_test_utils::test_header(One::one()); + let expected_hash = header.hash(); + + // check that the header#1 has been inserted + assert_eq!(>::get().unwrap().1, expected_hash); + assert!(>::contains_key(expected_hash)); + + // check that the header#0 has been pruned + assert!(!>::contains_key(genesis_header.hash())); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} diff --git a/modules/grandpa/src/call_ext.rs b/modules/grandpa/src/call_ext.rs new file mode 100644 index 000000000000..c1585020be13 --- /dev/null +++ b/modules/grandpa/src/call_ext.rs @@ -0,0 +1,331 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{weights::WeightInfo, BridgedBlockNumber, BridgedHeader, Config, Error, Pallet}; +use bp_header_chain::{ + justification::GrandpaJustification, max_expected_submit_finality_proof_arguments_size, + ChainWithGrandpa, GrandpaConsensusLogReader, +}; +use bp_runtime::{BlockNumberOf, OwnedBridgeModule}; +use codec::Encode; +use frame_support::{dispatch::CallableCallFor, traits::IsSubType, weights::Weight}; +use sp_runtime::{ + traits::{Header, Zero}, + transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + RuntimeDebug, SaturatedConversion, +}; + +/// Info about a `SubmitParachainHeads` call which tries to update a single parachain. +#[derive(Copy, Clone, PartialEq, RuntimeDebug)] +pub struct SubmitFinalityProofInfo { + /// Number of the finality target. + pub block_number: N, + /// Extra weight that we assume is included in the call. + /// + /// We have some assumptions about headers and justifications of the bridged chain. + /// We know that if our assumptions are correct, then the call must not have the + /// weight above some limit. The fee paid for weight above that limit, is never refunded. + pub extra_weight: Weight, + /// Extra size (in bytes) that we assume are included in the call. + /// + /// We have some assumptions about headers and justifications of the bridged chain. + /// We know that if our assumptions are correct, then the call must not have the + /// weight above some limit. The fee paid for bytes above that limit, is never refunded. + pub extra_size: u32, +} + +impl SubmitFinalityProofInfo { + /// Returns `true` if call size/weight is below our estimations for regular calls. + pub fn fits_limits(&self) -> bool { + self.extra_weight.is_zero() && self.extra_size.is_zero() + } +} + +/// Helper struct that provides methods for working with the `SubmitFinalityProof` call. +pub struct SubmitFinalityProofHelper, I: 'static> { + _phantom_data: sp_std::marker::PhantomData<(T, I)>, +} + +impl, I: 'static> SubmitFinalityProofHelper { + /// Check that the GRANDPA head provided by the `SubmitFinalityProof` is better than the best + /// one we know. + pub fn check_obsolete( + finality_target: BlockNumberOf, + ) -> Result<(), Error> { + let best_finalized = crate::BestFinalized::::get().ok_or_else(|| { + log::trace!( + target: crate::LOG_TARGET, + "Cannot finalize header {:?} because pallet is not yet initialized", + finality_target, + ); + >::NotInitialized + })?; + + if best_finalized.number() >= finality_target { + log::trace!( + target: crate::LOG_TARGET, + "Cannot finalize obsolete header: bundled {:?}, best {:?}", + finality_target, + best_finalized, + ); + + return Err(Error::::OldHeader) + } + + Ok(()) + } + + /// Check if the `SubmitFinalityProof` was successfully executed. + pub fn was_successful(finality_target: BlockNumberOf) -> bool { + match crate::BestFinalized::::get() { + Some(best_finalized) => best_finalized.number() == finality_target, + None => false, + } + } +} + +/// Trait representing a call that is a sub type of this pallet's call. +pub trait CallSubType, I: 'static>: + IsSubType, T>> +{ + /// Extract finality proof info from a runtime call. + fn submit_finality_proof_info( + &self, + ) -> Option>> { + if let Some(crate::Call::::submit_finality_proof { finality_target, justification }) = + self.is_sub_type() + { + return Some(submit_finality_proof_info_from_args::( + finality_target, + justification, + )) + } + + None + } + + /// Validate Grandpa headers in order to avoid "mining" transactions that provide outdated + /// bridged chain headers. Without this validation, even honest relayers may lose their funds + /// if there are multiple relays running and submitting the same information. + fn check_obsolete_submit_finality_proof(&self) -> TransactionValidity + where + Self: Sized, + { + let finality_target = match self.submit_finality_proof_info() { + Some(finality_proof) => finality_proof, + _ => return Ok(ValidTransaction::default()), + }; + + if Pallet::::ensure_not_halted().is_err() { + return InvalidTransaction::Call.into() + } + + match SubmitFinalityProofHelper::::check_obsolete(finality_target.block_number) { + Ok(_) => Ok(ValidTransaction::default()), + Err(Error::::OldHeader) => InvalidTransaction::Stale.into(), + Err(_) => InvalidTransaction::Call.into(), + } + } +} + +impl, I: 'static> CallSubType for T::RuntimeCall where + T::RuntimeCall: IsSubType, T>> +{ +} + +/// Extract finality proof info from the submitted header and justification. +pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( + finality_target: &BridgedHeader, + justification: &GrandpaJustification>, +) -> SubmitFinalityProofInfo> { + let block_number = *finality_target.number(); + + // the `submit_finality_proof` call will reject justifications with invalid, duplicate, + // unknown and extra signatures. It'll also reject justifications with less than necessary + // signatures. So we do not care about extra weight because of additional signatures here. + let precommits_len = justification.commit.precommits.len().saturated_into(); + let required_precommits = precommits_len; + + // We do care about extra weight because of more-than-expected headers in the votes + // ancestries. But we have problems computing extra weight for additional headers (weight of + // additional header is too small, so that our benchmarks aren't detecting that). So if there + // are more than expected headers in votes ancestries, we will treat the whole call weight + // as an extra weight. + let votes_ancestries_len = justification.votes_ancestries.len().saturated_into(); + let extra_weight = + if votes_ancestries_len > T::BridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY { + T::WeightInfo::submit_finality_proof(precommits_len, votes_ancestries_len) + } else { + Weight::zero() + }; + + // check if the `finality_target` is a mandatory header. If so, we are ready to refund larger + // size + let is_mandatory_finality_target = + GrandpaConsensusLogReader::>::find_scheduled_change( + finality_target.digest(), + ) + .is_some(); + + // we can estimate extra call size easily, without any additional significant overhead + let actual_call_size: u32 = finality_target + .encoded_size() + .saturating_add(justification.encoded_size()) + .saturated_into(); + let max_expected_call_size = max_expected_submit_finality_proof_arguments_size::( + is_mandatory_finality_target, + required_precommits, + ); + let extra_size = actual_call_size.saturating_sub(max_expected_call_size); + + SubmitFinalityProofInfo { block_number, extra_weight, extra_size } +} + +#[cfg(test)] +mod tests { + use crate::{ + call_ext::CallSubType, + mock::{run_test, test_header, RuntimeCall, TestBridgedChain, TestNumber, TestRuntime}, + BestFinalized, Config, PalletOperatingMode, WeightInfo, + }; + use bp_header_chain::ChainWithGrandpa; + use bp_runtime::{BasicOperatingMode, HeaderId}; + use bp_test_utils::{ + make_default_justification, make_justification_for_header, JustificationGeneratorParams, + }; + use frame_support::weights::Weight; + use sp_runtime::{testing::DigestItem, traits::Header as _, SaturatedConversion}; + + fn validate_block_submit(num: TestNumber) -> bool { + let bridge_grandpa_call = crate::Call::::submit_finality_proof { + finality_target: Box::new(test_header(num)), + justification: make_default_justification(&test_header(num)), + }; + RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( + bridge_grandpa_call, + )) + .is_ok() + } + + fn sync_to_header_10() { + let header10_hash = sp_core::H256::default(); + BestFinalized::::put(HeaderId(10, header10_hash)); + } + + #[test] + fn extension_rejects_obsolete_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#5 => tx is + // rejected + sync_to_header_10(); + assert!(!validate_block_submit(5)); + }); + } + + #[test] + fn extension_rejects_same_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#10 => tx is + // rejected + sync_to_header_10(); + assert!(!validate_block_submit(10)); + }); + } + + #[test] + fn extension_rejects_new_header_if_pallet_is_halted() { + run_test(|| { + // when pallet is halted => tx is rejected + sync_to_header_10(); + PalletOperatingMode::::put(BasicOperatingMode::Halted); + + assert!(!validate_block_submit(15)); + }); + } + + #[test] + fn extension_accepts_new_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#15 => tx is + // accepted + sync_to_header_10(); + assert!(validate_block_submit(15)); + }); + } + + #[test] + fn extension_returns_correct_extra_size_if_call_arguments_are_too_large() { + // when call arguments are below our limit => no refund + let small_finality_target = test_header(1); + let justification_params = JustificationGeneratorParams { + header: small_finality_target.clone(), + ..Default::default() + }; + let small_justification = make_justification_for_header(justification_params); + let small_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(small_finality_target), + justification: small_justification, + }); + assert_eq!(small_call.submit_finality_proof_info().unwrap().extra_size, 0); + + // when call arguments are too large => partial refund + let mut large_finality_target = test_header(1); + large_finality_target + .digest_mut() + .push(DigestItem::Other(vec![42u8; 1024 * 1024])); + let justification_params = JustificationGeneratorParams { + header: large_finality_target.clone(), + ..Default::default() + }; + let large_justification = make_justification_for_header(justification_params); + let large_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(large_finality_target), + justification: large_justification, + }); + assert_ne!(large_call.submit_finality_proof_info().unwrap().extra_size, 0); + } + + #[test] + fn extension_returns_correct_extra_weight_if_there_are_too_many_headers_in_votes_ancestry() { + let finality_target = test_header(1); + let mut justification_params = JustificationGeneratorParams { + header: finality_target.clone(), + ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY, + ..Default::default() + }; + + // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY` headers => no refund + let justification = make_justification_for_header(justification_params.clone()); + let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(finality_target.clone()), + justification, + }); + assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, Weight::zero()); + + // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1` headers => full refund + justification_params.ancestors += 1; + let justification = make_justification_for_header(justification_params); + let call_weight = ::WeightInfo::submit_finality_proof( + justification.commit.precommits.len().saturated_into(), + justification.votes_ancestries.len().saturated_into(), + ); + let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + finality_target: Box::new(finality_target), + justification, + }); + assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, call_weight); + } +} diff --git a/modules/grandpa/src/lib.rs b/modules/grandpa/src/lib.rs new file mode 100644 index 000000000000..22df604bf189 --- /dev/null +++ b/modules/grandpa/src/lib.rs @@ -0,0 +1,1462 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate GRANDPA Pallet +//! +//! This pallet is an on-chain GRANDPA light client for Substrate based chains. +//! +//! This pallet achieves this by trustlessly verifying GRANDPA finality proofs on-chain. Once +//! verified, finalized headers are stored in the pallet, thereby creating a sparse header chain. +//! This sparse header chain can be used as a source of truth for other higher-level applications. +//! +//! The pallet is responsible for tracking GRANDPA validator set hand-offs. We only import headers +//! with justifications signed by the current validator set we know of. The header is inspected for +//! a `ScheduledChanges` digest item, which is then used to update to next validator set. +//! +//! Since this pallet only tracks finalized headers it does not deal with forks. Forks can only +//! occur if the GRANDPA validator set on the bridged chain is either colluding or there is a severe +//! bug causing resulting in an equivocation. Such events are outside the scope of this pallet. +//! Shall the fork occur on the bridged chain governance intervention will be required to +//! re-initialize the bridge and track the right fork. + +#![cfg_attr(not(feature = "std"), no_std)] +// Runtime-generated enums +#![allow(clippy::large_enum_variant)] + +pub use storage_types::StoredAuthoritySet; + +use bp_header_chain::{ + justification::GrandpaJustification, AuthoritySet, ChainWithGrandpa, GrandpaConsensusLogReader, + HeaderChain, InitializationData, StoredHeaderData, StoredHeaderDataBuilder, + StoredHeaderGrandpaInfo, +}; +use bp_runtime::{BlockNumberOf, HashOf, HasherOf, HeaderId, HeaderOf, OwnedBridgeModule}; +use frame_support::{dispatch::PostDispatchInfo, ensure, DefaultNoBound}; +use sp_runtime::{ + traits::{Header as HeaderT, Zero}, + SaturatedConversion, +}; +use sp_std::{boxed::Box, convert::TryInto, prelude::*}; + +mod call_ext; +#[cfg(test)] +mod mock; +mod storage_types; + +/// Module, containing weights for this pallet. +pub mod weights; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + +// Re-export in crate namespace for `construct_runtime!` +pub use call_ext::*; +pub use pallet::*; +pub use weights::WeightInfo; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-grandpa"; + +/// Bridged chain from the pallet configuration. +pub type BridgedChain = >::BridgedChain; +/// Block number of the bridged chain. +pub type BridgedBlockNumber = BlockNumberOf<>::BridgedChain>; +/// Block hash of the bridged chain. +pub type BridgedBlockHash = HashOf<>::BridgedChain>; +/// Block id of the bridged chain. +pub type BridgedBlockId = HeaderId, BridgedBlockNumber>; +/// Hasher of the bridged chain. +pub type BridgedBlockHasher = HasherOf<>::BridgedChain>; +/// Header of the bridged chain. +pub type BridgedHeader = HeaderOf<>::BridgedChain>; +/// Header data of the bridged chain that is stored at this chain by this pallet. +pub type BridgedStoredHeaderData = + StoredHeaderData, BridgedBlockHash>; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use bp_runtime::BasicOperatingMode; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The overarching event type. + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + + /// The chain we are bridging to here. + type BridgedChain: ChainWithGrandpa; + + /// Maximal number of "free" mandatory header transactions per block. + /// + /// To be able to track the bridged chain, the pallet requires all headers that are + /// changing GRANDPA authorities set at the bridged chain (we call them mandatory). + /// So it is a common good deed to submit mandatory headers to the pallet. However, if the + /// bridged chain gets compromised, its validators may generate as many mandatory headers + /// as they want. And they may fill the whole block (at this chain) for free. This constants + /// limits number of calls that we may refund in a single block. All calls above this + /// limit are accepted, but are not refunded. + #[pallet::constant] + type MaxFreeMandatoryHeadersPerBlock: Get; + + /// Maximal number of finalized headers to keep in the storage. + /// + /// The setting is there to prevent growing the on-chain state indefinitely. Note + /// the setting does not relate to block numbers - we will simply keep as much items + /// in the storage, so it doesn't guarantee any fixed timeframe for finality headers. + /// + /// Incautious change of this constant may lead to orphan entries in the runtime storage. + #[pallet::constant] + type HeadersToKeep: Get; + + /// Weights gathered through benchmarking. + type WeightInfo: WeightInfo; + } + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> Weight { + FreeMandatoryHeadersRemaining::::put(T::MaxFreeMandatoryHeadersPerBlock::get()); + Weight::zero() + } + + fn on_finalize(_n: BlockNumberFor) { + FreeMandatoryHeadersRemaining::::kill(); + } + } + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = BasicOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::call] + impl, I: 'static> Pallet { + /// Verify a target header is finalized according to the given finality proof. + /// + /// It will use the underlying storage pallet to fetch information about the current + /// authorities and best finalized header in order to verify that the header is finalized. + /// + /// If successful in verification, it will write the target header to the underlying storage + /// pallet. + /// + /// The call fails if: + /// + /// - the pallet is halted; + /// + /// - the pallet knows better header than the `finality_target`; + /// + /// - verification is not optimized or invalid; + /// + /// - header contains forced authorities set change or change with non-zero delay. + #[pallet::call_index(0)] + #[pallet::weight(::submit_finality_proof( + justification.commit.precommits.len().saturated_into(), + justification.votes_ancestries.len().saturated_into(), + ))] + pub fn submit_finality_proof( + origin: OriginFor, + finality_target: Box>, + justification: GrandpaJustification>, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + ensure_signed(origin)?; + + let (hash, number) = (finality_target.hash(), *finality_target.number()); + log::trace!( + target: LOG_TARGET, + "Going to try and finalize header {:?}", + finality_target + ); + + SubmitFinalityProofHelper::::check_obsolete(number)?; + + let authority_set = >::get(); + let unused_proof_size = authority_set.unused_proof_size(); + let set_id = authority_set.set_id; + let authority_set: AuthoritySet = authority_set.into(); + verify_justification::(&justification, hash, number, authority_set)?; + + let maybe_new_authority_set = + try_enact_authority_change::(&finality_target, set_id)?; + let may_refund_call_fee = maybe_new_authority_set.is_some() && + // if we have seen too many mandatory headers in this block, we don't want to refund + Self::free_mandatory_headers_remaining() > 0 && + // if arguments out of expected bounds, we don't want to refund + submit_finality_proof_info_from_args::(&finality_target, &justification) + .fits_limits(); + if may_refund_call_fee { + FreeMandatoryHeadersRemaining::::mutate(|count| { + *count = count.saturating_sub(1) + }); + } + insert_header::(*finality_target, hash); + log::info!( + target: LOG_TARGET, + "Successfully imported finalized header with hash {:?}!", + hash + ); + + // mandatory header is a header that changes authorities set. The pallet can't go + // further without importing this header. So every bridge MUST import mandatory headers. + // + // We don't want to charge extra costs for mandatory operations. So relayer is not + // paying fee for mandatory headers import transactions. + // + // If size/weight of the call is exceeds our estimated limits, the relayer still needs + // to pay for the transaction. + let pays_fee = if may_refund_call_fee { Pays::No } else { Pays::Yes }; + + // the proof size component of the call weight assumes that there are + // `MaxBridgedAuthorities` in the `CurrentAuthoritySet` (we use `MaxEncodedLen` + // estimation). But if their number is lower, then we may "refund" some `proof_size`, + // making proof smaller and leaving block space to other useful transactions + let pre_dispatch_weight = T::WeightInfo::submit_finality_proof( + justification.commit.precommits.len().saturated_into(), + justification.votes_ancestries.len().saturated_into(), + ); + let actual_weight = pre_dispatch_weight + .set_proof_size(pre_dispatch_weight.proof_size().saturating_sub(unused_proof_size)); + + Self::deposit_event(Event::UpdatedBestFinalizedHeader { + number, + hash, + grandpa_info: StoredHeaderGrandpaInfo { + finality_proof: justification, + new_verification_context: maybe_new_authority_set, + }, + }); + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee }) + } + + /// Bootstrap the bridge pallet with an initial header and authority set from which to sync. + /// + /// The initial configuration provided does not need to be the genesis header of the bridged + /// chain, it can be any arbitrary header. You can also provide the next scheduled set + /// change if it is already know. + /// + /// This function is only allowed to be called from a trusted origin and writes to storage + /// with practically no checks in terms of the validity of the data. It is important that + /// you ensure that valid data is being passed in. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(2, 5), DispatchClass::Operational))] + pub fn initialize( + origin: OriginFor, + init_data: super::InitializationData>, + ) -> DispatchResultWithPostInfo { + Self::ensure_owner_or_root(origin)?; + + let init_allowed = !>::exists(); + ensure!(init_allowed, >::AlreadyInitialized); + initialize_bridge::(init_data.clone())?; + + log::info!( + target: LOG_TARGET, + "Pallet has been initialized with the following parameters: {:?}", + init_data + ); + + Ok(().into()) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(3)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + } + + /// Number mandatory headers that we may accept in the current block for free (returning + /// `Pays::No`). + /// + /// If the `FreeMandatoryHeadersRemaining` hits zero, all following mandatory headers in the + /// current block are accepted with fee (`Pays::Yes` is returned). + /// + /// The `FreeMandatoryHeadersRemaining` is an ephemeral value that is set to + /// `MaxFreeMandatoryHeadersPerBlock` at each block initialization and is killed on block + /// finalization. So it never ends up in the storage trie. + #[pallet::storage] + #[pallet::whitelist_storage] + #[pallet::getter(fn free_mandatory_headers_remaining)] + pub(super) type FreeMandatoryHeadersRemaining, I: 'static = ()> = + StorageValue<_, u32, ValueQuery>; + + /// Hash of the header used to bootstrap the pallet. + #[pallet::storage] + pub(super) type InitialHash, I: 'static = ()> = + StorageValue<_, BridgedBlockHash, ValueQuery>; + + /// Hash of the best finalized header. + #[pallet::storage] + #[pallet::getter(fn best_finalized)] + pub type BestFinalized, I: 'static = ()> = + StorageValue<_, BridgedBlockId, OptionQuery>; + + /// A ring buffer of imported hashes. Ordered by the insertion time. + #[pallet::storage] + pub(super) type ImportedHashes, I: 'static = ()> = StorageMap< + Hasher = Identity, + Key = u32, + Value = BridgedBlockHash, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeHeadersToKeep, + >; + + /// Current ring buffer position. + #[pallet::storage] + pub(super) type ImportedHashesPointer, I: 'static = ()> = + StorageValue<_, u32, ValueQuery>; + + /// Relevant fields of imported headers. + #[pallet::storage] + pub type ImportedHeaders, I: 'static = ()> = StorageMap< + Hasher = Identity, + Key = BridgedBlockHash, + Value = BridgedStoredHeaderData, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeHeadersToKeep, + >; + + /// The current GRANDPA Authority set. + #[pallet::storage] + pub type CurrentAuthoritySet, I: 'static = ()> = + StorageValue<_, StoredAuthoritySet, ValueQuery>; + + /// Optional pallet owner. + /// + /// Pallet owner has a right to halt all pallet operations and then resume it. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt + /// flag directly or call the `halt_operations`). + #[pallet::storage] + pub type PalletOwner, I: 'static = ()> = + StorageValue<_, T::AccountId, OptionQuery>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, or no transactions will be allowed. + #[pallet::storage] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, BasicOperatingMode, ValueQuery>; + + #[pallet::genesis_config] + #[derive(DefaultNoBound)] + pub struct GenesisConfig, I: 'static = ()> { + /// Optional module owner account. + pub owner: Option, + /// Optional module initialization data. + pub init_data: Option>>, + } + + #[pallet::genesis_build] + impl, I: 'static> BuildGenesisConfig for GenesisConfig { + fn build(&self) { + if let Some(ref owner) = self.owner { + >::put(owner); + } + + if let Some(init_data) = self.init_data.clone() { + initialize_bridge::(init_data).expect("genesis config is correct; qed"); + } else { + // Since the bridge hasn't been initialized we shouldn't allow anyone to perform + // transactions. + >::put(BasicOperatingMode::Halted); + } + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event, I: 'static = ()> { + /// Best finalized chain header has been updated to the header with given number and hash. + UpdatedBestFinalizedHeader { + number: BridgedBlockNumber, + hash: BridgedBlockHash, + /// The Grandpa info associated to the new best finalized header. + grandpa_info: StoredHeaderGrandpaInfo>, + }, + } + + #[pallet::error] + pub enum Error { + /// The given justification is invalid for the given header. + InvalidJustification, + /// The authority set from the underlying header chain is invalid. + InvalidAuthoritySet, + /// The header being imported is older than the best finalized header known to the pallet. + OldHeader, + /// The scheduled authority set change found in the header is unsupported by the pallet. + /// + /// This is the case for non-standard (e.g forced) authority set changes. + UnsupportedScheduledChange, + /// The pallet is not yet initialized. + NotInitialized, + /// The pallet has already been initialized. + AlreadyInitialized, + /// Too many authorities in the set. + TooManyAuthoritiesInSet, + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Check the given header for a GRANDPA scheduled authority set change. If a change + /// is found it will be enacted immediately. + /// + /// This function does not support forced changes, or scheduled changes with delays + /// since these types of changes are indicative of abnormal behavior from GRANDPA. + /// + /// Returned value will indicate if a change was enacted or not. + pub(crate) fn try_enact_authority_change, I: 'static>( + header: &BridgedHeader, + current_set_id: sp_consensus_grandpa::SetId, + ) -> Result, DispatchError> { + // We don't support forced changes - at that point governance intervention is required. + ensure!( + GrandpaConsensusLogReader::>::find_forced_change( + header.digest() + ) + .is_none(), + >::UnsupportedScheduledChange + ); + + if let Some(change) = + GrandpaConsensusLogReader::>::find_scheduled_change( + header.digest(), + ) { + // GRANDPA only includes a `delay` for forced changes, so this isn't valid. + ensure!(change.delay == Zero::zero(), >::UnsupportedScheduledChange); + + // TODO [#788]: Stop manually increasing the `set_id` here. + let next_authorities = StoredAuthoritySet:: { + authorities: change + .next_authorities + .try_into() + .map_err(|_| Error::::TooManyAuthoritiesInSet)?, + set_id: current_set_id + 1, + }; + + // Since our header schedules a change and we know the delay is 0, it must also enact + // the change. + >::put(&next_authorities); + + log::info!( + target: LOG_TARGET, + "Transitioned from authority set {} to {}! New authorities are: {:?}", + current_set_id, + current_set_id + 1, + next_authorities, + ); + + return Ok(Some(next_authorities.into())) + }; + + Ok(None) + } + + /// Verify a GRANDPA justification (finality proof) for a given header. + /// + /// Will use the GRANDPA current authorities known to the pallet. + /// + /// If successful it returns the decoded GRANDPA justification so we can refund any weight which + /// was overcharged in the initial call. + pub(crate) fn verify_justification, I: 'static>( + justification: &GrandpaJustification>, + hash: BridgedBlockHash, + number: BridgedBlockNumber, + authority_set: bp_header_chain::AuthoritySet, + ) -> Result<(), sp_runtime::DispatchError> { + use bp_header_chain::justification::verify_justification; + + Ok(verify_justification::>( + (hash, number), + &authority_set.try_into().map_err(|_| >::InvalidAuthoritySet)?, + justification, + ) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "Received invalid justification for {:?}: {:?}", + hash, + e, + ); + >::InvalidJustification + })?) + } + + /// Import a previously verified header to the storage. + /// + /// Note this function solely takes care of updating the storage and pruning old entries, + /// but does not verify the validity of such import. + pub(crate) fn insert_header, I: 'static>( + header: BridgedHeader, + hash: BridgedBlockHash, + ) { + let index = >::get(); + let pruning = >::try_get(index); + >::put(HeaderId(*header.number(), hash)); + >::insert(hash, header.build()); + >::insert(index, hash); + + // Update ring buffer pointer and remove old header. + >::put((index + 1) % T::HeadersToKeep::get()); + if let Ok(hash) = pruning { + log::debug!(target: LOG_TARGET, "Pruning old header: {:?}.", hash); + >::remove(hash); + } + } + + /// Since this writes to storage with no real checks this should only be used in functions that + /// were called by a trusted origin. + pub(crate) fn initialize_bridge, I: 'static>( + init_params: super::InitializationData>, + ) -> Result<(), Error> { + let super::InitializationData { header, authority_list, set_id, operating_mode } = + init_params; + let authority_set_length = authority_list.len(); + let authority_set = StoredAuthoritySet::::try_new(authority_list, set_id) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "Failed to initialize bridge. Number of authorities in the set {} is larger than the configured value {}", + authority_set_length, + T::BridgedChain::MAX_AUTHORITIES_COUNT, + ); + + e + })?; + let initial_hash = header.hash(); + + >::put(initial_hash); + >::put(0); + insert_header::(*header, initial_hash); + + >::put(authority_set); + + >::put(operating_mode); + + Ok(()) + } + + /// Adapter for using `Config::HeadersToKeep` as `MaxValues` bound in our storage maps. + pub struct MaybeHeadersToKeep(PhantomData<(T, I)>); + + // this implementation is required to use the struct as `MaxValues` + impl, I: 'static> Get> for MaybeHeadersToKeep { + fn get() -> Option { + Some(T::HeadersToKeep::get()) + } + } + + /// Initialize pallet so that it is ready for inserting new header. + /// + /// The function makes sure that the new insertion will cause the pruning of some old header. + /// + /// Returns parent header for the new header. + #[cfg(feature = "runtime-benchmarks")] + pub(crate) fn bootstrap_bridge, I: 'static>( + init_params: super::InitializationData>, + ) -> BridgedHeader { + let start_header = init_params.header.clone(); + initialize_bridge::(init_params).expect("benchmarks are correct"); + + // the most obvious way to cause pruning during next insertion would be to insert + // `HeadersToKeep` headers. But it'll make our benchmarks slow. So we will just play with + // our pruning ring-buffer. + assert_eq!(ImportedHashesPointer::::get(), 1); + ImportedHashesPointer::::put(0); + + *start_header + } +} + +impl, I: 'static> Pallet +where + ::RuntimeEvent: TryInto>, +{ + /// Get the GRANDPA justifications accepted in the current block. + pub fn synced_headers_grandpa_info() -> Vec>> { + frame_system::Pallet::::read_events_no_consensus() + .filter_map(|event| { + if let Event::::UpdatedBestFinalizedHeader { grandpa_info, .. } = + event.event.try_into().ok()? + { + return Some(grandpa_info) + } + None + }) + .collect() + } +} + +/// Bridge GRANDPA pallet as header chain. +pub type GrandpaChainHeaders = Pallet; + +impl, I: 'static> HeaderChain> for GrandpaChainHeaders { + fn finalized_header_state_root( + header_hash: HashOf>, + ) -> Option>> { + ImportedHeaders::::get(header_hash).map(|h| h.state_root) + } +} + +/// (Re)initialize bridge with given header for using it in `pallet-bridge-messages` benchmarks. +#[cfg(feature = "runtime-benchmarks")] +pub fn initialize_for_benchmarks, I: 'static>(header: BridgedHeader) { + initialize_bridge::(InitializationData { + header: Box::new(header), + authority_list: sp_std::vec::Vec::new(), /* we don't verify any proofs in external + * benchmarks */ + set_id: 0, + operating_mode: bp_runtime::BasicOperatingMode::Normal, + }) + .expect("only used from benchmarks; benchmarks are correct; qed"); +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::{ + run_test, test_header, RuntimeEvent as TestEvent, RuntimeOrigin, System, TestBridgedChain, + TestHeader, TestNumber, TestRuntime, MAX_BRIDGED_AUTHORITIES, + }; + use bp_header_chain::BridgeGrandpaCall; + use bp_runtime::BasicOperatingMode; + use bp_test_utils::{ + authority_list, generate_owned_bridge_module_tests, make_default_justification, + make_justification_for_header, JustificationGeneratorParams, ALICE, BOB, + }; + use codec::Encode; + use frame_support::{ + assert_err, assert_noop, assert_ok, + dispatch::{Pays, PostDispatchInfo}, + storage::generator::StorageValue, + }; + use frame_system::{EventRecord, Phase}; + use sp_consensus_grandpa::{ConsensusLog, GRANDPA_ENGINE_ID}; + use sp_core::Get; + use sp_runtime::{Digest, DigestItem, DispatchError}; + + fn initialize_substrate_bridge() { + System::set_block_number(1); + System::reset_events(); + + assert_ok!(init_with_origin(RuntimeOrigin::root())); + } + + fn init_with_origin( + origin: RuntimeOrigin, + ) -> Result< + InitializationData, + sp_runtime::DispatchErrorWithPostInfo, + > { + let genesis = test_header(0); + + let init_data = InitializationData { + header: Box::new(genesis), + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + + Pallet::::initialize(origin, init_data.clone()).map(|_| init_data) + } + + fn submit_finality_proof(header: u8) -> frame_support::dispatch::DispatchResultWithPostInfo { + let header = test_header(header.into()); + let justification = make_default_justification(&header); + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ) + } + + fn submit_finality_proof_with_set_id( + header: u8, + set_id: u64, + ) -> frame_support::dispatch::DispatchResultWithPostInfo { + let header = test_header(header.into()); + let justification = make_justification_for_header(JustificationGeneratorParams { + header: header.clone(), + set_id, + ..Default::default() + }); + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ) + } + + fn submit_mandatory_finality_proof( + number: u8, + set_id: u64, + ) -> frame_support::dispatch::DispatchResultWithPostInfo { + let mut header = test_header(number.into()); + // to ease tests that are using `submit_mandatory_finality_proof`, we'll be using the + // same set for all sessions + let consensus_log = + ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { + next_authorities: authority_list(), + delay: 0, + }); + header.digest = + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] }; + let justification = make_justification_for_header(JustificationGeneratorParams { + header: header.clone(), + set_id, + ..Default::default() + }); + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ) + } + + fn next_block() { + use frame_support::traits::OnInitialize; + + let current_number = frame_system::Pallet::::block_number(); + frame_system::Pallet::::set_block_number(current_number + 1); + let _ = Pallet::::on_initialize(current_number); + } + + fn change_log(delay: u64) -> Digest { + let consensus_log = + ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { + next_authorities: vec![(ALICE.into(), 1), (BOB.into(), 1)], + delay, + }); + + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } + } + + fn forced_change_log(delay: u64) -> Digest { + let consensus_log = ConsensusLog::::ForcedChange( + delay, + sp_consensus_grandpa::ScheduledChange { + next_authorities: vec![(ALICE.into(), 1), (BOB.into(), 1)], + delay, + }, + ); + + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } + } + + fn many_authorities_log() -> Digest { + let consensus_log = + ConsensusLog::::ScheduledChange(sp_consensus_grandpa::ScheduledChange { + next_authorities: std::iter::repeat((ALICE.into(), 1)) + .take(MAX_BRIDGED_AUTHORITIES as usize + 1) + .collect(), + delay: 0, + }); + + Digest { logs: vec![DigestItem::Consensus(GRANDPA_ENGINE_ID, consensus_log.encode())] } + } + + #[test] + fn init_root_or_owner_origin_can_initialize_pallet() { + run_test(|| { + assert_noop!(init_with_origin(RuntimeOrigin::signed(1)), DispatchError::BadOrigin); + assert_ok!(init_with_origin(RuntimeOrigin::root())); + + // Reset storage so we can initialize the pallet again + BestFinalized::::kill(); + PalletOwner::::put(2); + assert_ok!(init_with_origin(RuntimeOrigin::signed(2))); + }) + } + + #[test] + fn init_storage_entries_are_correctly_initialized() { + run_test(|| { + assert_eq!(BestFinalized::::get(), None,); + assert_eq!(Pallet::::best_finalized(), None); + assert_eq!(PalletOperatingMode::::try_get(), Err(())); + + let init_data = init_with_origin(RuntimeOrigin::root()).unwrap(); + + assert!(>::contains_key(init_data.header.hash())); + assert_eq!(BestFinalized::::get().unwrap().1, init_data.header.hash()); + assert_eq!( + CurrentAuthoritySet::::get().authorities, + init_data.authority_list + ); + assert_eq!( + PalletOperatingMode::::try_get(), + Ok(BasicOperatingMode::Normal) + ); + }) + } + + #[test] + fn init_can_only_initialize_pallet_once() { + run_test(|| { + initialize_substrate_bridge(); + assert_noop!( + init_with_origin(RuntimeOrigin::root()), + >::AlreadyInitialized + ); + }) + } + + #[test] + fn init_fails_if_there_are_too_many_authorities_in_the_set() { + run_test(|| { + let genesis = test_header(0); + let init_data = InitializationData { + header: Box::new(genesis), + authority_list: std::iter::repeat(authority_list().remove(0)) + .take(MAX_BRIDGED_AUTHORITIES as usize + 1) + .collect(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + + assert_noop!( + Pallet::::initialize(RuntimeOrigin::root(), init_data), + Error::::TooManyAuthoritiesInSet, + ); + }); + } + + #[test] + fn pallet_rejects_transactions_if_halted() { + run_test(|| { + initialize_substrate_bridge(); + + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Halted + )); + assert_noop!( + submit_finality_proof(1), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted) + ); + + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Normal + )); + assert_ok!(submit_finality_proof(1)); + }) + } + + #[test] + fn pallet_rejects_header_if_not_initialized_yet() { + run_test(|| { + assert_noop!(submit_finality_proof(1), Error::::NotInitialized); + }); + } + + #[test] + fn succesfully_imports_header_with_valid_finality() { + run_test(|| { + initialize_substrate_bridge(); + + let header_number = 1; + let header = test_header(header_number.into()); + let justification = make_default_justification(&header); + + let pre_dispatch_weight = ::WeightInfo::submit_finality_proof( + justification.commit.precommits.len().try_into().unwrap_or(u32::MAX), + justification.votes_ancestries.len().try_into().unwrap_or(u32::MAX), + ); + + let result = submit_finality_proof(header_number); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + // our test config assumes 2048 max authorities and we are just using couple + let pre_dispatch_proof_size = pre_dispatch_weight.proof_size(); + let actual_proof_size = result.unwrap().actual_weight.unwrap().proof_size(); + assert!(actual_proof_size > 0); + assert!( + actual_proof_size < pre_dispatch_proof_size, + "Actual proof size {actual_proof_size} must be less than the pre-dispatch {pre_dispatch_proof_size}", + ); + + let header = test_header(1); + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + + assert_eq!( + System::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa(Event::UpdatedBestFinalizedHeader { + number: *header.number(), + hash: header.hash(), + grandpa_info: StoredHeaderGrandpaInfo { + finality_proof: justification.clone(), + new_verification_context: None, + }, + }), + topics: vec![], + }], + ); + assert_eq!( + Pallet::::synced_headers_grandpa_info(), + vec![StoredHeaderGrandpaInfo { + finality_proof: justification, + new_verification_context: None + }] + ); + }) + } + + #[test] + fn rejects_justification_that_skips_authority_set_transition() { + run_test(|| { + initialize_substrate_bridge(); + + let header = test_header(1); + + let params = + JustificationGeneratorParams:: { set_id: 2, ..Default::default() }; + let justification = make_justification_for_header(params); + + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ), + >::InvalidJustification + ); + }) + } + + #[test] + fn does_not_import_header_with_invalid_finality_proof() { + run_test(|| { + initialize_substrate_bridge(); + + let header = test_header(1); + let mut justification = make_default_justification(&header); + justification.round = 42; + + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ), + >::InvalidJustification + ); + }) + } + + #[test] + fn disallows_invalid_authority_set() { + run_test(|| { + let genesis = test_header(0); + + let invalid_authority_list = vec![(ALICE.into(), u64::MAX), (BOB.into(), u64::MAX)]; + let init_data = InitializationData { + header: Box::new(genesis), + authority_list: invalid_authority_list, + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + + assert_ok!(Pallet::::initialize(RuntimeOrigin::root(), init_data)); + + let header = test_header(1); + let justification = make_default_justification(&header); + + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification, + ), + >::InvalidAuthoritySet + ); + }) + } + + #[test] + fn importing_header_ensures_that_chain_is_extended() { + run_test(|| { + initialize_substrate_bridge(); + + assert_ok!(submit_finality_proof(4)); + assert_err!(submit_finality_proof(3), Error::::OldHeader); + assert_ok!(submit_finality_proof(5)); + }) + } + + #[test] + fn importing_header_enacts_new_authority_set() { + run_test(|| { + initialize_substrate_bridge(); + + let next_set_id = 2; + let next_authorities = vec![(ALICE.into(), 1), (BOB.into(), 1)]; + + // Need to update the header digest to indicate that our header signals an authority set + // change. The change will be enacted when we import our header. + let mut header = test_header(2); + header.digest = change_log(0); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Let's import our test header + let result = Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header.clone()), + justification.clone(), + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::No); + + // Make sure that our header is the best finalized + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + + // Make sure that the authority set actually changed upon importing our header + assert_eq!( + >::get(), + StoredAuthoritySet::::try_new(next_authorities, next_set_id) + .unwrap(), + ); + + // Here + assert_eq!( + System::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa(Event::UpdatedBestFinalizedHeader { + number: *header.number(), + hash: header.hash(), + grandpa_info: StoredHeaderGrandpaInfo { + finality_proof: justification.clone(), + new_verification_context: Some( + >::get().into() + ), + }, + }), + topics: vec![], + }], + ); + assert_eq!( + Pallet::::synced_headers_grandpa_info(), + vec![StoredHeaderGrandpaInfo { + finality_proof: justification, + new_verification_context: Some( + >::get().into() + ), + }] + ); + }) + } + + #[test] + fn relayer_pays_tx_fee_when_submitting_huge_mandatory_header() { + run_test(|| { + initialize_substrate_bridge(); + + // let's prepare a huge authorities change header, which is definitely above size limits + let mut header = test_header(2); + header.digest = change_log(0); + header.digest.push(DigestItem::Other(vec![42u8; 1024 * 1024])); + let justification = make_default_justification(&header); + + // without large digest item ^^^ the relayer would have paid zero transaction fee + // (`Pays::No`) + let result = Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header.clone()), + justification, + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + + // Make sure that our header is the best finalized + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + }) + } + + #[test] + fn relayer_pays_tx_fee_when_submitting_justification_with_long_ancestry_votes() { + run_test(|| { + initialize_substrate_bridge(); + + // let's prepare a huge authorities change header, which is definitely above weight + // limits + let mut header = test_header(2); + header.digest = change_log(0); + let justification = make_justification_for_header(JustificationGeneratorParams { + header: header.clone(), + ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1, + ..Default::default() + }); + + // without many headers in votes ancestries ^^^ the relayer would have paid zero + // transaction fee (`Pays::No`) + let result = Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header.clone()), + justification, + ); + assert_ok!(result); + assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); + + // Make sure that our header is the best finalized + assert_eq!(>::get().unwrap().1, header.hash()); + assert!(>::contains_key(header.hash())); + }) + } + + #[test] + fn importing_header_rejects_header_with_scheduled_change_delay() { + run_test(|| { + initialize_substrate_bridge(); + + // Need to update the header digest to indicate that our header signals an authority set + // change. However, the change doesn't happen until the next block. + let mut header = test_header(2); + header.digest = change_log(1); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Should not be allowed to import this header + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification + ), + >::UnsupportedScheduledChange + ); + }) + } + + #[test] + fn importing_header_rejects_header_with_forced_changes() { + run_test(|| { + initialize_substrate_bridge(); + + // Need to update the header digest to indicate that it signals a forced authority set + // change. + let mut header = test_header(2); + header.digest = forced_change_log(0); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Should not be allowed to import this header + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification + ), + >::UnsupportedScheduledChange + ); + }) + } + + #[test] + fn importing_header_rejects_header_with_too_many_authorities() { + run_test(|| { + initialize_substrate_bridge(); + + // Need to update the header digest to indicate that our header signals an authority set + // change. However, the change doesn't happen until the next block. + let mut header = test_header(2); + header.digest = many_authorities_log(); + + // Create a valid justification for the header + let justification = make_default_justification(&header); + + // Should not be allowed to import this header + assert_err!( + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification + ), + >::TooManyAuthoritiesInSet + ); + }); + } + + #[test] + fn parse_finalized_storage_proof_rejects_proof_on_unknown_header() { + run_test(|| { + assert_noop!( + Pallet::::storage_proof_checker(Default::default(), vec![],) + .map(|_| ()), + bp_header_chain::HeaderChainError::UnknownHeader, + ); + }); + } + + #[test] + fn parse_finalized_storage_accepts_valid_proof() { + run_test(|| { + let (state_root, storage_proof) = bp_runtime::craft_valid_storage_proof(); + + let mut header = test_header(2); + header.set_state_root(state_root); + + let hash = header.hash(); + >::put(HeaderId(2, hash)); + >::insert(hash, header.build()); + + assert_ok!( + Pallet::::storage_proof_checker(hash, storage_proof).map(|_| ()) + ); + }); + } + + #[test] + fn rate_limiter_disallows_free_imports_once_limit_is_hit_in_single_block() { + run_test(|| { + initialize_substrate_bridge(); + + let result = submit_mandatory_finality_proof(1, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(2, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(3, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn rate_limiter_invalid_requests_do_not_count_towards_request_count() { + run_test(|| { + let submit_invalid_request = || { + let mut header = test_header(1); + header.digest = change_log(0); + let mut invalid_justification = make_default_justification(&header); + invalid_justification.round = 42; + + Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + invalid_justification, + ) + }; + + initialize_substrate_bridge(); + + for _ in 0..::MaxFreeMandatoryHeadersPerBlock::get() + 1 { + assert_err!(submit_invalid_request(), >::InvalidJustification); + } + + // Can still submit free mandatory headers afterwards + let result = submit_mandatory_finality_proof(1, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(2, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(3, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn rate_limiter_allows_request_after_new_block_has_started() { + run_test(|| { + initialize_substrate_bridge(); + + let result = submit_mandatory_finality_proof(1, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(2, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(3, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + next_block(); + + let result = submit_mandatory_finality_proof(4, 4); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(5, 5); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_mandatory_finality_proof(6, 6); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn rate_limiter_ignores_non_mandatory_headers() { + run_test(|| { + initialize_substrate_bridge(); + + let result = submit_finality_proof(1); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + let result = submit_mandatory_finality_proof(2, 1); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_finality_proof_with_set_id(3, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + let result = submit_mandatory_finality_proof(4, 2); + assert_eq!(result.expect("call failed").pays_fee, Pays::No); + + let result = submit_finality_proof_with_set_id(5, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + + let result = submit_mandatory_finality_proof(6, 3); + assert_eq!(result.expect("call failed").pays_fee, Pays::Yes); + }) + } + + #[test] + fn should_prune_headers_over_headers_to_keep_parameter() { + run_test(|| { + initialize_substrate_bridge(); + assert_ok!(submit_finality_proof(1)); + let first_header_hash = Pallet::::best_finalized().unwrap().hash(); + next_block(); + + assert_ok!(submit_finality_proof(2)); + next_block(); + assert_ok!(submit_finality_proof(3)); + next_block(); + assert_ok!(submit_finality_proof(4)); + next_block(); + assert_ok!(submit_finality_proof(5)); + next_block(); + + assert_ok!(submit_finality_proof(6)); + + assert!( + !ImportedHeaders::::contains_key(first_header_hash), + "First header should be pruned.", + ); + }) + } + + #[test] + fn storage_keys_computed_properly() { + assert_eq!( + PalletOperatingMode::::storage_value_final_key().to_vec(), + bp_header_chain::storage_keys::pallet_operating_mode_key("Grandpa").0, + ); + + assert_eq!( + CurrentAuthoritySet::::storage_value_final_key().to_vec(), + bp_header_chain::storage_keys::current_authority_set_key("Grandpa").0, + ); + + assert_eq!( + BestFinalized::::storage_value_final_key().to_vec(), + bp_header_chain::storage_keys::best_finalized_key("Grandpa").0, + ); + } + + #[test] + fn test_bridge_grandpa_call_is_correctly_defined() { + let header = test_header(0); + let init_data = InitializationData { + header: Box::new(header.clone()), + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }; + let justification = make_default_justification(&header); + + let direct_initialize_call = + Call::::initialize { init_data: init_data.clone() }; + let indirect_initialize_call = BridgeGrandpaCall::::initialize { init_data }; + assert_eq!(direct_initialize_call.encode(), indirect_initialize_call.encode()); + + let direct_submit_finality_proof_call = Call::::submit_finality_proof { + finality_target: Box::new(header.clone()), + justification: justification.clone(), + }; + let indirect_submit_finality_proof_call = + BridgeGrandpaCall::::submit_finality_proof { + finality_target: Box::new(header), + justification, + }; + assert_eq!( + direct_submit_finality_proof_call.encode(), + indirect_submit_finality_proof_call.encode() + ); + } + + generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); + + #[test] + fn maybe_headers_to_keep_returns_correct_value() { + assert_eq!(MaybeHeadersToKeep::::get(), Some(mock::HeadersToKeep::get())); + } + + #[test] + fn submit_finality_proof_requires_signed_origin() { + run_test(|| { + initialize_substrate_bridge(); + + let header = test_header(1); + let justification = make_default_justification(&header); + + assert_noop!( + Pallet::::submit_finality_proof( + RuntimeOrigin::root(), + Box::new(header), + justification, + ), + DispatchError::BadOrigin, + ); + }) + } +} diff --git a/modules/grandpa/src/mock.rs b/modules/grandpa/src/mock.rs new file mode 100644 index 000000000000..a54f56c4a624 --- /dev/null +++ b/modules/grandpa/src/mock.rs @@ -0,0 +1,110 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +// From construct_runtime macro +#![allow(clippy::from_over_into)] + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::Chain; +use frame_support::{ + construct_runtime, derive_impl, parameter_types, traits::Hooks, weights::Weight, +}; +use sp_core::sr25519::Signature; + +pub type AccountId = u64; +pub type TestHeader = sp_runtime::testing::Header; +pub type TestNumber = u64; + +type Block = frame_system::mocking::MockBlock; + +pub const MAX_BRIDGED_AUTHORITIES: u32 = 5; + +use crate as grandpa; + +construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Grandpa: grandpa::{Pallet, Call, Event}, + } +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; +} + +parameter_types! { + pub const MaxFreeMandatoryHeadersPerBlock: u32 = 2; + pub const HeadersToKeep: u32 = 5; +} + +impl grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = TestBridgedChain; + type MaxFreeMandatoryHeadersPerBlock = MaxFreeMandatoryHeadersPerBlock; + type HeadersToKeep = HeadersToKeep; + type WeightInfo = (); +} + +#[derive(Debug)] +pub struct TestBridgedChain; + +impl Chain for TestBridgedChain { + type BlockNumber = TestNumber; + type Hash = ::Hash; + type Hasher = ::Hashing; + type Header = TestHeader; + + type AccountId = AccountId; + type Balance = u64; + type Nonce = u64; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithGrandpa for TestBridgedChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = MAX_BRIDGED_AUTHORITIES; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_MANDATORY_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE: u32 = 64; +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + sp_io::TestExternalities::new(Default::default()) +} + +/// Return test within default test externalities context. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(|| { + let _ = Grandpa::on_initialize(0); + test() + }) +} + +/// Return test header with given number. +pub fn test_header(num: TestNumber) -> TestHeader { + // We wrap the call to avoid explicit type annotations in our tests + bp_test_utils::test_header(num) +} diff --git a/modules/grandpa/src/storage_types.rs b/modules/grandpa/src/storage_types.rs new file mode 100644 index 000000000000..6d1a7882dd49 --- /dev/null +++ b/modules/grandpa/src/storage_types.rs @@ -0,0 +1,136 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Wrappers for public types that are implementing `MaxEncodedLen` + +use crate::{Config, Error}; + +use bp_header_chain::{AuthoritySet, ChainWithGrandpa}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{traits::Get, BoundedVec, CloneNoBound, RuntimeDebugNoBound}; +use scale_info::TypeInfo; +use sp_consensus_grandpa::{AuthorityId, AuthorityList, AuthorityWeight, SetId}; +use sp_std::marker::PhantomData; + +/// A bounded list of Grandpa authorities with associated weights. +pub type StoredAuthorityList = + BoundedVec<(AuthorityId, AuthorityWeight), MaxBridgedAuthorities>; + +/// Adapter for using `T::BridgedChain::MAX_BRIDGED_AUTHORITIES` in `BoundedVec`. +pub struct StoredAuthorityListLimit(PhantomData<(T, I)>); + +impl, I: 'static> Get for StoredAuthorityListLimit { + fn get() -> u32 { + T::BridgedChain::MAX_AUTHORITIES_COUNT + } +} + +/// A bounded GRANDPA Authority List and ID. +#[derive(CloneNoBound, Decode, Encode, Eq, TypeInfo, MaxEncodedLen, RuntimeDebugNoBound)] +#[scale_info(skip_type_params(T, I))] +pub struct StoredAuthoritySet, I: 'static> { + /// List of GRANDPA authorities for the current round. + pub authorities: StoredAuthorityList>, + /// Monotonic identifier of the current GRANDPA authority set. + pub set_id: SetId, +} + +impl, I: 'static> StoredAuthoritySet { + /// Try to create a new bounded GRANDPA Authority Set from unbounded list. + /// + /// Returns error if number of authorities in the provided list is too large. + pub fn try_new(authorities: AuthorityList, set_id: SetId) -> Result> { + Ok(Self { + authorities: TryFrom::try_from(authorities) + .map_err(|_| Error::TooManyAuthoritiesInSet)?, + set_id, + }) + } + + /// Returns number of bytes that may be subtracted from the PoV component of + /// `submit_finality_proof` call, because the actual authorities set is smaller than the maximal + /// configured. + /// + /// Maximal authorities set size is configured by the `MaxBridgedAuthorities` constant from + /// the pallet configuration. The PoV of the call includes the size of maximal authorities + /// count. If the actual size is smaller, we may subtract extra bytes from this component. + pub fn unused_proof_size(&self) -> u64 { + // we can only safely estimate bytes that are occupied by the authority data itself. We have + // no means here to compute PoV bytes, occupied by extra trie nodes or extra bytes in the + // whole set encoding + let single_authority_max_encoded_len = + <(AuthorityId, AuthorityWeight)>::max_encoded_len() as u64; + let extra_authorities = + T::BridgedChain::MAX_AUTHORITIES_COUNT.saturating_sub(self.authorities.len() as _); + single_authority_max_encoded_len.saturating_mul(extra_authorities as u64) + } +} + +impl, I: 'static> PartialEq for StoredAuthoritySet { + fn eq(&self, other: &Self) -> bool { + self.set_id == other.set_id && self.authorities == other.authorities + } +} + +impl, I: 'static> Default for StoredAuthoritySet { + fn default() -> Self { + StoredAuthoritySet { authorities: BoundedVec::default(), set_id: 0 } + } +} + +impl, I: 'static> From> for AuthoritySet { + fn from(t: StoredAuthoritySet) -> Self { + AuthoritySet { authorities: t.authorities.into(), set_id: t.set_id } + } +} + +#[cfg(test)] +mod tests { + use crate::mock::{TestRuntime, MAX_BRIDGED_AUTHORITIES}; + use bp_test_utils::authority_list; + + type StoredAuthoritySet = super::StoredAuthoritySet; + + #[test] + fn unused_proof_size_works() { + let authority_entry = authority_list().pop().unwrap(); + + // when we have exactly `MaxBridgedAuthorities` authorities + assert_eq!( + StoredAuthoritySet::try_new( + vec![authority_entry.clone(); MAX_BRIDGED_AUTHORITIES as usize], + 0, + ) + .unwrap() + .unused_proof_size(), + 0, + ); + + // when we have less than `MaxBridgedAuthorities` authorities + assert_eq!( + StoredAuthoritySet::try_new( + vec![authority_entry; MAX_BRIDGED_AUTHORITIES as usize - 1], + 0, + ) + .unwrap() + .unused_proof_size(), + 40, + ); + + // and we can't have more than `MaxBridgedAuthorities` authorities in the bounded vec, so + // no test for this case + } +} diff --git a/modules/grandpa/src/weights.rs b/modules/grandpa/src/weights.rs new file mode 100644 index 000000000000..a75e7b5a8e4a --- /dev/null +++ b/modules/grandpa/src/weights.rs @@ -0,0 +1,167 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_bridge_grandpa +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/unknown-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bridge_grandpa +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/grandpa/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_grandpa. +pub trait WeightInfo { + fn submit_finality_proof(p: u32, v: u32) -> Weight; +} + +/// Weights for `pallet_bridge_grandpa` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeUnknownGrandpa PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa RequestCount (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa RequestCount (max_values: Some(1), max_size: Some(4), added: + /// 499, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa BestFinalized (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: + /// 531, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa CurrentAuthoritySet (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(209), + /// added: 704, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHashesPointer (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), + /// added: 499, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa ImportedHashes (max_values: Some(14400), max_size: Some(36), + /// added: 2016, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:0 w:2) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 4]`. + /// + /// The range of component `v` is `[50, 100]`. + fn submit_finality_proof(p: u32, v: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `394 + p * (60 ±0)` + // Estimated: `4745` + // Minimum execution time: 228_072 nanoseconds. + Weight::from_parts(57_853_228, 4745) + // Standard Error: 149_421 + .saturating_add(Weight::from_parts(36_708_702, 0).saturating_mul(p.into())) + // Standard Error: 10_625 + .saturating_add(Weight::from_parts(1_469_032, 0).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeUnknownGrandpa PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa RequestCount (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa RequestCount (max_values: Some(1), max_size: Some(4), added: + /// 499, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa BestFinalized (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa BestFinalized (max_values: Some(1), max_size: Some(36), added: + /// 531, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa CurrentAuthoritySet (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa CurrentAuthoritySet (max_values: Some(1), max_size: Some(209), + /// added: 704, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHashesPointer (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa ImportedHashesPointer (max_values: Some(1), max_size: Some(4), + /// added: 499, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownGrandpa ImportedHashes (max_values: Some(14400), max_size: Some(36), + /// added: 2016, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:0 w:2) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 4]`. + /// + /// The range of component `v` is `[50, 100]`. + fn submit_finality_proof(p: u32, v: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `394 + p * (60 ±0)` + // Estimated: `4745` + // Minimum execution time: 228_072 nanoseconds. + Weight::from_parts(57_853_228, 4745) + // Standard Error: 149_421 + .saturating_add(Weight::from_parts(36_708_702, 0).saturating_mul(p.into())) + // Standard Error: 10_625 + .saturating_add(Weight::from_parts(1_469_032, 0).saturating_mul(v.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } +} diff --git a/modules/messages/Cargo.toml b/modules/messages/Cargo.toml new file mode 100644 index 000000000000..0c8c0f7b8242 --- /dev/null +++ b/modules/messages/Cargo.toml @@ -0,0 +1,60 @@ +[package] +name = "pallet-bridge-messages" +description = "Module that allows bridged chains to exchange messages using lane concept." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.20", default-features = false } +num-traits = { version = "0.2", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Bridge dependencies + +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } + +# Substrate Dependencies + +frame-benchmarking = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +bp-test-utils = { path = "../../primitives/test-utils" } +pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-runtime/std", + "codec/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "log/std", + "num-traits/std", + "scale-info/std", + "sp-runtime/std", + "sp-std/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-balances/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/modules/messages/README.md b/modules/messages/README.md new file mode 100644 index 000000000000..457d5f5facfa --- /dev/null +++ b/modules/messages/README.md @@ -0,0 +1,215 @@ +# Bridge Messages Pallet + +The messages pallet is used to deliver messages from source chain to target chain. Message is (almost) opaque to the +module and the final goal is to hand message to the message dispatch mechanism. + +## Contents + +- [Overview](#overview) +- [Message Workflow](#message-workflow) +- [Integrating Message Lane Module into Runtime](#integrating-messages-module-into-runtime) +- [Non-Essential Functionality](#non-essential-functionality) +- [Weights of Module Extrinsics](#weights-of-module-extrinsics) + +## Overview + +Message lane is an unidirectional channel, where messages are sent from source chain to the target chain. At the same +time, a single instance of messages module supports both outbound lanes and inbound lanes. So the chain where the module +is deployed (this chain), may act as a source chain for outbound messages (heading to a bridged chain) and as a target +chain for inbound messages (coming from a bridged chain). + +Messages module supports multiple message lanes. Every message lane is identified with a 4-byte identifier. Messages +sent through the lane are assigned unique (for this lane) increasing integer value that is known as nonce ("number that +can only be used once"). Messages that are sent over the same lane are guaranteed to be delivered to the target chain in +the same order they're sent from the source chain. In other words, message with nonce `N` will be delivered right before +delivering a message with nonce `N+1`. + +Single message lane may be seen as a transport channel for single application (onchain, offchain or mixed). At the same +time the module itself never dictates any lane or message rules. In the end, it is the runtime developer who defines +what message lane and message mean for this runtime. + +In our [Kusama<>Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md) we are using lane as a channel of +communication between two parachains of different relay chains. For example, lane `[0, 0, 0, 0]` is used for Polkadot <> +Kusama Asset Hub communications. Other lanes may be used to bridge other parachains. + +## Message Workflow + +The pallet is not intended to be used by end users and provides no public calls to send the message. Instead, it +provides runtime-internal method that allows other pallets (or other runtime code) to queue outbound messages. + +The message "appears" when some runtime code calls the `send_message()` method of the pallet. The submitter specifies +the lane that they're willing to use and the message itself. If some fee must be paid for sending the message, it must +be paid outside of the pallet. If a message passes all checks (that include, for example, message size check, disabled +lane check, ...), the nonce is assigned and the message is stored in the module storage. The message is in an +"undelivered" state now. + +We assume that there are external, offchain actors, called relayers, that are submitting module related transactions to +both target and source chains. The pallet itself has no assumptions about relayers incentivization scheme, but it has +some callbacks for paying rewards. See [Integrating Messages Module into +runtime](#Integrating-Messages-Module-into-runtime) for details. + +Eventually, some relayer would notice this message in the "undelivered" state and it would decide to deliver this +message. Relayer then crafts `receive_messages_proof()` transaction (aka delivery transaction) for the messages module +instance, deployed at the target chain. Relayer provides its account id at the source chain, the proof of message (or +several messages), the number of messages in the transaction and their cumulative dispatch weight. Once a transaction is +mined, the message is considered "delivered". + +Once a message is delivered, the relayer may want to confirm delivery back to the source chain. There are two reasons +why it would want to do that. The first is that we intentionally limit number of "delivered", but not yet "confirmed" +messages at inbound lanes (see [What about other Constants in the Messages Module Configuration +Trait](#What-about-other-Constants-in-the-Messages-Module-Configuration-Trait) for explanation). So at some point, the +target chain may stop accepting new messages until relayers confirm some of these. The second is that if the relayer +wants to be rewarded for delivery, it must prove the fact that it has actually delivered the message. And this proof may +only be generated after the delivery transaction is mined. So relayer crafts the `receive_messages_delivery_proof()` +transaction (aka confirmation transaction) for the messages module instance, deployed at the source chain. Once this +transaction is mined, the message is considered "confirmed". + +The "confirmed" state is the final state of the message. But there's one last thing related to the message - the fact +that it is now "confirmed" and reward has been paid to the relayer (or at least callback for this has been called), must +be confirmed to the target chain. Otherwise, we may reach the limit of "unconfirmed" messages at the target chain and it +will stop accepting new messages. So relayer sometimes includes a nonce of the latest "confirmed" message in the next +`receive_messages_proof()` transaction, proving that some messages have been confirmed. + +## Integrating Messages Module into Runtime + +As it has been said above, the messages module supports both outbound and inbound message lanes. So if we will integrate +a module in some runtime, it may act as the source chain runtime for outbound messages and as the target chain runtime +for inbound messages. In this section, we'll sometimes refer to the chain we're currently integrating with, as "this +chain" and the other chain as "bridged chain". + +Messages module doesn't simply accept transactions that are claiming that the bridged chain has some updated data for +us. Instead of this, the module assumes that the bridged chain is able to prove that updated data in some way. The proof +is abstracted from the module and may be of any kind. In our Substrate-to-Substrate bridge we're using runtime storage +proofs. Other bridges may use transaction proofs, Substrate header digests or anything else that may be proved. + +**IMPORTANT NOTE**: everything below in this chapter describes details of the messages module configuration. But if +you're interested in well-probed and relatively easy integration of two Substrate-based chains, you may want to look at +the [bridge-runtime-common](../../bin/runtime-common/) crate. This crate is providing a lot of helpers for integration, +which may be directly used from within your runtime. Then if you'll decide to change something in this scheme, get back +here for detailed information. + +### General Information + +The messages module supports instances. Every module instance is supposed to bridge this chain and some bridged chain. +To bridge with another chain, using another instance is suggested (this isn't forced anywhere in the code, though). Keep +in mind, that the pallet may be used to build virtual channels between multiple chains, as we do in our [Polkadot <> +Kusama bridge](../../docs/polkadot-kusama-bridge-overview.md). There, the pallet actually bridges only two parachains - +Kusama Bridge Hub and Polkadot Bridge Hub. However, other Kusama and Polkadot parachains are able to send (XCM) messages +to their Bridge Hubs. The messages will be delivered to the other side of the bridge and routed to the proper +destination parachain within the bridged chain consensus. + +Message submitters may track message progress by inspecting module events. When Message is accepted, the +`MessageAccepted` event is emitted. The event contains both message lane identifier and nonce that has been assigned to +the message. When a message is delivered to the target chain, the `MessagesDelivered` event is emitted from the +`receive_messages_delivery_proof()` transaction. The `MessagesDelivered` contains the message lane identifier and +inclusive range of delivered message nonces. + +The pallet provides no means to get the result of message dispatch at the target chain. If that is required, it must be +done outside of the pallet. For example, XCM messages, when dispatched, have special instructions to send some data back +to the sender. Other dispatchers may use similar mechanism for that. +### How to plug-in Messages Module to Send Messages to the Bridged Chain? + +The `pallet_bridge_messages::Config` trait has 3 main associated types that are used to work with outbound messages. The +`pallet_bridge_messages::Config::TargetHeaderChain` defines how we see the bridged chain as the target for our outbound +messages. It must be able to check that the bridged chain may accept our message - like that the message has size below +maximal possible transaction size of the chain and so on. And when the relayer sends us a confirmation transaction, this +implementation must be able to parse and verify the proof of messages delivery. Normally, you would reuse the same +(configurable) type on all chains that are sending messages to the same bridged chain. + +The `pallet_bridge_messages::Config::LaneMessageVerifier` defines a single callback to verify outbound messages. The +simplest callback may just accept all messages. But in this case you'll need to answer many questions first. Who will +pay for the delivery and confirmation transaction? Are we sure that someone will ever deliver this message to the +bridged chain? Are we sure that we don't bloat our runtime storage by accepting this message? What if the message is +improperly encoded or has some fields set to invalid values? Answering all those (and similar) questions would lead to +correct implementation. + +There's another thing to consider when implementing type for use in +`pallet_bridge_messages::Config::LaneMessageVerifier`. It is whether we treat all message lanes identically, or they'll +have different sets of verification rules? For example, you may reserve lane#1 for messages coming from some +'wrapped-token' pallet - then you may verify in your implementation that the origin is associated with this pallet. +Lane#2 may be reserved for 'system' messages and you may charge zero fee for such messages. You may have some rate +limiting for messages sent over the lane#3. Or you may just verify the same rules set for all outbound messages - it is +all up to the `pallet_bridge_messages::Config::LaneMessageVerifier` implementation. + +The last type is the `pallet_bridge_messages::Config::DeliveryConfirmationPayments`. When confirmation transaction is +received, we call the `pay_reward()` method, passing the range of delivered messages. You may use the +[`pallet-bridge-relayers`](../relayers/) pallet and its +[`DeliveryConfirmationPaymentsAdapter`](../relayers/src/payment_adapter.rs) adapter as a possible implementation. It +allows you to pay fixed reward for relaying the message and some of its portion for confirming delivery. + +### I have a Messages Module in my Runtime, but I Want to Reject all Outbound Messages. What shall I do? + +You should be looking at the `bp_messages::source_chain::ForbidOutboundMessages` structure +[`bp_messages::source_chain`](../../primitives/messages/src/source_chain.rs). It implements all required traits and will +simply reject all transactions, related to outbound messages. + +### How to plug-in Messages Module to Receive Messages from the Bridged Chain? + +The `pallet_bridge_messages::Config` trait has 2 main associated types that are used to work with inbound messages. The +`pallet_bridge_messages::Config::SourceHeaderChain` defines how we see the bridged chain as the source of our inbound +messages. When relayer sends us a delivery transaction, this implementation must be able to parse and verify the proof +of messages wrapped in this transaction. Normally, you would reuse the same (configurable) type on all chains that are +sending messages to the same bridged chain. + +The `pallet_bridge_messages::Config::MessageDispatch` defines a way on how to dispatch delivered messages. Apart from +actually dispatching the message, the implementation must return the correct dispatch weight of the message before +dispatch is called. + +### I have a Messages Module in my Runtime, but I Want to Reject all Inbound Messages. What shall I do? + +You should be looking at the `bp_messages::target_chain::ForbidInboundMessages` structure from the +[`bp_messages::target_chain`](../../primitives/messages/src/target_chain.rs) module. It implements all required traits +and will simply reject all transactions, related to inbound messages. + +### What about other Constants in the Messages Module Configuration Trait? + +Two settings that are used to check messages in the `send_message()` function. The +`pallet_bridge_messages::Config::ActiveOutboundLanes` is an array of all message lanes, that may be used to send +messages. All messages sent using other lanes are rejected. All messages that have size above +`pallet_bridge_messages::Config::MaximalOutboundPayloadSize` will also be rejected. + +To be able to reward the relayer for delivering messages, we store a map of message nonces range => identifier of the +relayer that has delivered this range at the target chain runtime storage. If a relayer delivers multiple consequent +ranges, they're merged into single entry. So there may be more than one entry for the same relayer. Eventually, this +whole map must be delivered back to the source chain to confirm delivery and pay rewards. So to make sure we are able to +craft this confirmation transaction, we need to: (1) keep the size of this map below a certain limit and (2) make sure +that the weight of processing this map is below a certain limit. Both size and processing weight mostly depend on the +number of entries. The number of entries is limited with the +`pallet_bridge_messages::ConfigMaxUnrewardedRelayerEntriesAtInboundLane` parameter. Processing weight also depends on +the total number of messages that are being confirmed, because every confirmed message needs to be read. So there's +another `pallet_bridge_messages::Config::MaxUnconfirmedMessagesAtInboundLane` parameter for that. + +When choosing values for these parameters, you must also keep in mind that if proof in your scheme is based on finality +of headers (and it is the most obvious option for Substrate-based chains with finality notion), then choosing too small +values for these parameters may cause significant delays in message delivery. That's because there are too many actors +involved in this scheme: 1) authorities that are finalizing headers of the target chain need to finalize header with +non-empty map; 2) the headers relayer then needs to submit this header and its finality proof to the source chain; 3) +the messages relayer must then send confirmation transaction (storage proof of this map) to the source chain; 4) when +the confirmation transaction will be mined at some header, source chain authorities must finalize this header; 5) the +headers relay then needs to submit this header and its finality proof to the target chain; 6) only now the messages +relayer may submit new messages from the source to target chain and prune the entry from the map. + +Delivery transaction requires the relayer to provide both number of entries and total number of messages in the map. +This means that the module never charges an extra cost for delivering a map - the relayer would need to pay exactly for +the number of entries+messages it has delivered. So the best guess for values of these parameters would be the pair that +would occupy `N` percent of the maximal transaction size and weight of the source chain. The `N` should be large enough +to process large maps, at the same time keeping reserve for future source chain upgrades. + +## Non-Essential Functionality + +There may be a special account in every runtime where the messages module is deployed. This account, named 'module +owner', is like a module-level sudo account - he's able to halt and resume all module operations without requiring +runtime upgrade. Calls that are related to this account are: +- `fn set_owner()`: current module owner may call it to transfer "ownership" to another account; +- `fn halt_operations()`: the module owner (or sudo account) may call this function to stop all module operations. After + this call, all message-related transactions will be rejected until further `resume_operations` call'. This call may be + used when something extraordinary happens with the bridge; +- `fn resume_operations()`: module owner may call this function to resume bridge operations. The module will resume its + regular operations after this call. + +If pallet owner is not defined, the governance may be used to make those calls. + +## Messages Relay + +We have an offchain actor, who is watching for new messages and submits them to the bridged chain. It is the messages +relay - you may look at the [crate level documentation and the code](../../relays/messages/). diff --git a/modules/messages/src/benchmarking.rs b/modules/messages/src/benchmarking.rs new file mode 100644 index 000000000000..8c4e6fbf00ca --- /dev/null +++ b/modules/messages/src/benchmarking.rs @@ -0,0 +1,461 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Messages pallet benchmarking. + +use crate::{ + inbound_lane::InboundLaneStorage, outbound_lane, weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH, + Call, OutboundLanes, RuntimeInboundLaneStorage, +}; + +use bp_messages::{ + source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, DeliveredMessages, + InboundLaneData, LaneId, MessageNonce, OutboundLaneData, UnrewardedRelayer, + UnrewardedRelayersState, +}; +use bp_runtime::StorageProofSize; +use codec::Decode; +use frame_benchmarking::{account, benchmarks_instance_pallet}; +use frame_support::weights::Weight; +use frame_system::RawOrigin; +use sp_runtime::traits::TrailingZeroInput; +use sp_std::{ops::RangeInclusive, prelude::*}; + +const SEED: u32 = 0; + +/// Pallet we're benchmarking here. +pub struct Pallet, I: 'static = ()>(crate::Pallet); + +/// Benchmark-specific message proof parameters. +#[derive(Debug)] +pub struct MessageProofParams { + /// Id of the lane. + pub lane: LaneId, + /// Range of messages to include in the proof. + pub message_nonces: RangeInclusive, + /// If `Some`, the proof needs to include this outbound lane data. + pub outbound_lane_data: Option, + /// If `true`, the caller expects that the proof will contain correct messages that will + /// be successfully dispatched. This is only called from the "optional" + /// `receive_single_message_proof_with_dispatch` benchmark. If you don't need it, just + /// return `true` from the `is_message_successfully_dispatched`. + pub is_successful_dispatch_expected: bool, + /// Proof size requirements. + pub size: StorageProofSize, +} + +/// Benchmark-specific message delivery proof parameters. +#[derive(Debug)] +pub struct MessageDeliveryProofParams { + /// Id of the lane. + pub lane: LaneId, + /// The proof needs to include this inbound lane data. + pub inbound_lane_data: InboundLaneData, + /// Proof size requirements. + pub size: StorageProofSize, +} + +/// Trait that must be implemented by runtime. +pub trait Config: crate::Config { + /// Lane id to use in benchmarks. + /// + /// By default, lane 00000000 is used. + fn bench_lane_id() -> LaneId { + LaneId([0, 0, 0, 0]) + } + + /// Return id of relayer account at the bridged chain. + /// + /// By default, zero account is returned. + fn bridged_relayer_id() -> Self::InboundRelayer { + Self::InboundRelayer::decode(&mut TrailingZeroInput::zeroes()).unwrap() + } + + /// Create given account and give it enough balance for test purposes. Used to create + /// relayer account at the target chain. Is strictly necessary when your rewards scheme + /// assumes that the relayer account must exist. + /// + /// Does nothing by default. + fn endow_account(_account: &Self::AccountId) {} + + /// Prepare messages proof to receive by the module. + fn prepare_message_proof( + params: MessageProofParams, + ) -> (::MessagesProof, Weight); + /// Prepare messages delivery proof to receive by the module. + fn prepare_message_delivery_proof( + params: MessageDeliveryProofParams, + ) -> >::MessagesDeliveryProof; + + /// Returns true if message has been successfully dispatched or not. + fn is_message_successfully_dispatched(_nonce: MessageNonce) -> bool { + true + } + + /// Returns true if given relayer has been rewarded for some of its actions. + fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool; +} + +benchmarks_instance_pallet! { + // + // Benchmarks that are used directly by the runtime calls weight formulae. + // + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // This is base benchmark for all other message delivery benchmarks. + receive_single_message_proof { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + } + + // Benchmark `receive_messages_proof` extrinsic with two minimal-weight messages and following conditions: + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // The weight of single message delivery could be approximated as + // `weight(receive_two_messages_proof) - weight(receive_single_message_proof)`. + // This won't be super-accurate if message has non-zero dispatch weight, but estimation should + // be close enough to real weight. + receive_two_messages_proof { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=22, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 2, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 22, + ); + } + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * proof includes outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is successfully dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // The weight of outbound lane state delivery would be + // `weight(receive_single_message_proof_with_outbound_lane_state) - weight(receive_single_message_proof)`. + // This won't be super-accurate if message has non-zero dispatch weight, but estimation should + // be close enough to real weight. + receive_single_message_proof_with_outbound_lane_state { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: Some(OutboundLaneData { + oldest_unpruned_nonce: 21, + latest_received_nonce: 20, + latest_generated_nonce: 21, + }), + is_successful_dispatch_expected: false, + size: StorageProofSize::Minimal(EXPECTED_DEFAULT_MESSAGE_LENGTH), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + let lane_state = crate::InboundLanes::::get(&T::bench_lane_id()); + assert_eq!(lane_state.last_delivered_nonce(), 21); + assert_eq!(lane_state.last_confirmed_nonce, 20); + } + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * the proof has large leaf with total size of approximately 1KB; + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // With single KB of messages proof, the weight of the call is increased (roughly) by + // `(receive_single_message_proof_16KB - receive_single_message_proof_1_kb) / 15`. + receive_single_message_proof_1_kb { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::HasLargeLeaf(1024), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + } + + // Benchmark `receive_messages_proof` extrinsic with single minimal-weight message and following conditions: + // * the proof has large leaf with total size of approximately 16KB; + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is dispatched (reminder: dispatch weight should be minimal); + // * message requires all heavy checks done by dispatcher. + // + // Size of proof grows because it contains extra trie nodes in it. + // + // With single KB of messages proof, the weight of the call is increased (roughly) by + // `(receive_single_message_proof_16KB - receive_single_message_proof) / 15`. + receive_single_message_proof_16_kb { + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: false, + size: StorageProofSize::HasLargeLeaf(16 * 1024), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + } + + // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: + // * single relayer is rewarded for relaying single message; + // * relayer account does not exist (in practice it needs to exist in production environment). + // + // This is base benchmark for all other confirmations delivery benchmarks. + receive_delivery_proof_for_single_message { + let relayer_id: T::AccountId = account("relayer", 0, SEED); + + // send message that we're going to confirm + send_regular_message::(); + + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }; + let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { + lane: T::bench_lane_id(), + inbound_lane_data: InboundLaneData { + relayers: vec![UnrewardedRelayer { + relayer: relayer_id.clone(), + messages: DeliveredMessages::new(1), + }].into_iter().collect(), + last_confirmed_nonce: 0, + }, + size: StorageProofSize::Minimal(0), + }); + }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) + verify { + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 1); + assert!(T::is_relayer_rewarded(&relayer_id)); + } + + // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: + // * single relayer is rewarded for relaying two messages; + // * relayer account does not exist (in practice it needs to exist in production environment). + // + // Additional weight for paying single-message reward to the same relayer could be computed + // as `weight(receive_delivery_proof_for_two_messages_by_single_relayer) + // - weight(receive_delivery_proof_for_single_message)`. + receive_delivery_proof_for_two_messages_by_single_relayer { + let relayer_id: T::AccountId = account("relayer", 0, SEED); + + // send message that we're going to confirm + send_regular_message::(); + send_regular_message::(); + + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 2, + total_messages: 2, + last_delivered_nonce: 2, + }; + let mut delivered_messages = DeliveredMessages::new(1); + delivered_messages.note_dispatched_message(); + let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { + lane: T::bench_lane_id(), + inbound_lane_data: InboundLaneData { + relayers: vec![UnrewardedRelayer { + relayer: relayer_id.clone(), + messages: delivered_messages, + }].into_iter().collect(), + last_confirmed_nonce: 0, + }, + size: StorageProofSize::Minimal(0), + }); + }: receive_messages_delivery_proof(RawOrigin::Signed(relayer_id.clone()), proof, relayers_state) + verify { + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); + assert!(T::is_relayer_rewarded(&relayer_id)); + } + + // Benchmark `receive_messages_delivery_proof` extrinsic with following conditions: + // * two relayers are rewarded for relaying single message each; + // * relayer account does not exist (in practice it needs to exist in production environment). + // + // Additional weight for paying reward to the next relayer could be computed + // as `weight(receive_delivery_proof_for_two_messages_by_two_relayers) + // - weight(receive_delivery_proof_for_two_messages_by_single_relayer)`. + receive_delivery_proof_for_two_messages_by_two_relayers { + let relayer1_id: T::AccountId = account("relayer1", 1, SEED); + let relayer2_id: T::AccountId = account("relayer2", 2, SEED); + + // send message that we're going to confirm + send_regular_message::(); + send_regular_message::(); + + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 2, + }; + let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams { + lane: T::bench_lane_id(), + inbound_lane_data: InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: relayer1_id.clone(), + messages: DeliveredMessages::new(1), + }, + UnrewardedRelayer { + relayer: relayer2_id.clone(), + messages: DeliveredMessages::new(2), + }, + ].into_iter().collect(), + last_confirmed_nonce: 0, + }, + size: StorageProofSize::Minimal(0), + }); + }: receive_messages_delivery_proof(RawOrigin::Signed(relayer1_id.clone()), proof, relayers_state) + verify { + assert_eq!(OutboundLanes::::get(T::bench_lane_id()).latest_received_nonce, 2); + assert!(T::is_relayer_rewarded(&relayer1_id)); + assert!(T::is_relayer_rewarded(&relayer2_id)); + } + + // + // Benchmarks that the runtime developers may use for proper pallet configuration. + // + + // This benchmark is optional and may be used when runtime developer need a way to compute + // message dispatch weight. In this case, he needs to provide messages that can go the whole + // dispatch + // + // Benchmark `receive_messages_proof` extrinsic with single message and following conditions: + // + // * proof does not include outbound lane state proof; + // * inbound lane already has state, so it needs to be read and decoded; + // * message is **SUCCESSFULLY** dispatched; + // * message requires all heavy checks done by dispatcher. + receive_single_message_proof_with_dispatch { + // maybe dispatch weight relies on the message size too? + let i in EXPECTED_DEFAULT_MESSAGE_LENGTH .. EXPECTED_DEFAULT_MESSAGE_LENGTH * 16; + + let relayer_id_on_source = T::bridged_relayer_id(); + let relayer_id_on_target = account("relayer", 0, SEED); + T::endow_account(&relayer_id_on_target); + + // mark messages 1..=20 as delivered + receive_messages::(20); + + let (proof, dispatch_weight) = T::prepare_message_proof(MessageProofParams { + lane: T::bench_lane_id(), + message_nonces: 21..=21, + outbound_lane_data: None, + is_successful_dispatch_expected: true, + size: StorageProofSize::Minimal(i), + }); + }: receive_messages_proof(RawOrigin::Signed(relayer_id_on_target), relayer_id_on_source, proof, 1, dispatch_weight) + verify { + assert_eq!( + crate::InboundLanes::::get(&T::bench_lane_id()).last_delivered_nonce(), + 21, + ); + assert!(T::is_message_successfully_dispatched(21)); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} + +fn send_regular_message, I: 'static>() { + let mut outbound_lane = outbound_lane::(T::bench_lane_id()); + outbound_lane.send_message(vec![]).expect("We craft valid messages"); +} + +fn receive_messages, I: 'static>(nonce: MessageNonce) { + let mut inbound_lane_storage = + RuntimeInboundLaneStorage::::from_lane_id(T::bench_lane_id()); + inbound_lane_storage.set_data(InboundLaneData { + relayers: vec![UnrewardedRelayer { + relayer: T::bridged_relayer_id(), + messages: DeliveredMessages::new(nonce), + }] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }); +} diff --git a/cumulus/bridges/modules/messages/src/inbound_lane.rs b/modules/messages/src/inbound_lane.rs similarity index 99% rename from cumulus/bridges/modules/messages/src/inbound_lane.rs rename to modules/messages/src/inbound_lane.rs index b665b5516fc4..966ec939e70e 100644 --- a/cumulus/bridges/modules/messages/src/inbound_lane.rs +++ b/modules/messages/src/inbound_lane.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -24,8 +24,9 @@ use bp_messages::{ ReceivalResult, UnrewardedRelayer, }; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; -use frame_support::{traits::Get, RuntimeDebug}; +use frame_support::traits::Get; use scale_info::{Type, TypeInfo}; +use sp_runtime::RuntimeDebug; use sp_std::prelude::PartialEq; /// Inbound lane storage. diff --git a/modules/messages/src/lib.rs b/modules/messages/src/lib.rs new file mode 100644 index 000000000000..b87c64d16075 --- /dev/null +++ b/modules/messages/src/lib.rs @@ -0,0 +1,2128 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Runtime module that allows sending and receiving messages using lane concept: +//! +//! 1) the message is sent using `send_message()` call; +//! 2) every outbound message is assigned nonce; +//! 3) the messages are stored in the storage; +//! 4) external component (relay) delivers messages to bridged chain; +//! 5) messages are processed in order (ordered by assigned nonce); +//! 6) relay may send proof-of-delivery back to this chain. +//! +//! Once message is sent, its progress can be tracked by looking at module events. +//! The assigned nonce is reported using `MessageAccepted` event. When message is +//! delivered to the the bridged chain, it is reported using `MessagesDelivered` event. +//! +//! **IMPORTANT NOTE**: after generating weights (custom `WeighInfo` implementation) for +//! your runtime (where this module is plugged to), please add test for these weights. +//! The test should call the `ensure_weights_are_correct` function from this module. +//! If this test fails with your weights, then either weights are computed incorrectly, +//! or some benchmarks assumptions are broken for your runtime. + +#![cfg_attr(not(feature = "std"), no_std)] +// Generated by `decl_event!` +#![allow(clippy::unused_unit)] + +pub use inbound_lane::StoredInboundLaneData; +pub use outbound_lane::StoredMessagePayload; +pub use weights::WeightInfo; +pub use weights_ext::{ + ensure_able_to_receive_confirmation, ensure_able_to_receive_message, + ensure_weights_are_correct, WeightInfoExt, EXPECTED_DEFAULT_MESSAGE_LENGTH, + EXTRA_STORAGE_PROOF_SIZE, +}; + +use crate::{ + inbound_lane::{InboundLane, InboundLaneStorage}, + outbound_lane::{OutboundLane, OutboundLaneStorage, ReceivalConfirmationError}, +}; + +use bp_messages::{ + source_chain::{ + DeliveryConfirmationPayments, LaneMessageVerifier, OnMessagesDelivered, + SendMessageArtifacts, TargetHeaderChain, + }, + target_chain::{ + DeliveryPayments, DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages, + SourceHeaderChain, + }, + DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, MessageKey, MessageNonce, + MessagePayload, MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails, + UnrewardedRelayersState, VerificationError, +}; +use bp_runtime::{ + BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize, RangeInclusiveExt, Size, +}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get, DefaultNoBound}; +use sp_runtime::traits::UniqueSaturatedFrom; +use sp_std::{marker::PhantomData, prelude::*}; + +mod inbound_lane; +mod outbound_lane; +mod weights_ext; + +pub mod weights; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + +#[cfg(test)] +mod mock; + +pub use pallet::*; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-messages"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use bp_messages::{ReceivalResult, ReceivedMessages}; + use bp_runtime::RangeInclusiveExt; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + // General types + + /// The overarching event type. + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + /// Benchmarks results from runtime we're plugged into. + type WeightInfo: WeightInfoExt; + + /// Gets the chain id value from the instance. + #[pallet::constant] + type BridgedChainId: Get; + + /// Get all active outbound lanes that the message pallet is serving. + type ActiveOutboundLanes: Get<&'static [LaneId]>; + /// Maximal number of unrewarded relayer entries at inbound lane. Unrewarded means that the + /// relayer has delivered messages, but either confirmations haven't been delivered back to + /// the source chain, or we haven't received reward confirmations yet. + /// + /// This constant limits maximal number of entries in the `InboundLaneData::relayers`. Keep + /// in mind that the same relayer account may take several (non-consecutive) entries in this + /// set. + type MaxUnrewardedRelayerEntriesAtInboundLane: Get; + /// Maximal number of unconfirmed messages at inbound lane. Unconfirmed means that the + /// message has been delivered, but either confirmations haven't been delivered back to the + /// source chain, or we haven't received reward confirmations for these messages yet. + /// + /// This constant limits difference between last message from last entry of the + /// `InboundLaneData::relayers` and first message at the first entry. + /// + /// There is no point of making this parameter lesser than + /// MaxUnrewardedRelayerEntriesAtInboundLane, because then maximal number of relayer entries + /// will be limited by maximal number of messages. + /// + /// This value also represents maximal number of messages in single delivery transaction. + /// Transaction that is declaring more messages than this value, will be rejected. Even if + /// these messages are from different lanes. + type MaxUnconfirmedMessagesAtInboundLane: Get; + + /// Maximal encoded size of the outbound payload. + #[pallet::constant] + type MaximalOutboundPayloadSize: Get; + /// Payload type of outbound messages. This payload is dispatched on the bridged chain. + type OutboundPayload: Parameter + Size; + + /// Payload type of inbound messages. This payload is dispatched on this chain. + type InboundPayload: Decode; + /// Identifier of relayer that deliver messages to this chain. Relayer reward is paid on the + /// bridged chain. + type InboundRelayer: Parameter + MaxEncodedLen; + /// Delivery payments. + type DeliveryPayments: DeliveryPayments; + + // Types that are used by outbound_lane (on source chain). + + /// Target header chain. + type TargetHeaderChain: TargetHeaderChain; + /// Message payload verifier. + type LaneMessageVerifier: LaneMessageVerifier; + /// Delivery confirmation payments. + type DeliveryConfirmationPayments: DeliveryConfirmationPayments; + /// Delivery confirmation callback. + type OnMessagesDelivered: OnMessagesDelivered; + + // Types that are used by inbound_lane (on target chain). + + /// Source header chain, as it is represented on target chain. + type SourceHeaderChain: SourceHeaderChain; + /// Message dispatch. + type MessageDispatch: MessageDispatch; + } + + /// Shortcut to messages proof type for Config. + pub type MessagesProofOf = + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof; + /// Shortcut to messages delivery proof type for Config. + pub type MessagesDeliveryProofOf = + <>::TargetHeaderChain as TargetHeaderChain< + >::OutboundPayload, + ::AccountId, + >>::MessagesDeliveryProof; + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = MessagesOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet + where + u32: TryFrom>, + { + fn on_idle(_block: BlockNumberFor, remaining_weight: Weight) -> Weight { + // we'll need at least to read outbound lane state, kill a message and update lane state + let db_weight = T::DbWeight::get(); + if !remaining_weight.all_gte(db_weight.reads_writes(1, 2)) { + return Weight::zero() + } + + // messages from lane with index `i` in `ActiveOutboundLanes` are pruned when + // `System::block_number() % lanes.len() == i`. Otherwise we need to read lane states on + // every block, wasting the whole `remaining_weight` for nothing and causing starvation + // of the last lane pruning + let active_lanes = T::ActiveOutboundLanes::get(); + let active_lanes_len = (active_lanes.len() as u32).into(); + let active_lane_index = u32::unique_saturated_from( + frame_system::Pallet::::block_number() % active_lanes_len, + ); + let active_lane_id = active_lanes[active_lane_index as usize]; + + // first db read - outbound lane state + let mut active_lane = outbound_lane::(active_lane_id); + let mut used_weight = db_weight.reads(1); + // and here we'll have writes + used_weight += active_lane.prune_messages(db_weight, remaining_weight - used_weight); + + // we already checked we have enough `remaining_weight` to cover this `used_weight` + used_weight + } + } + + #[pallet::call] + impl, I: 'static> Pallet { + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(0)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all/some pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: MessagesOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + + /// Receive messages proof from bridged chain. + /// + /// The weight of the call assumes that the transaction always brings outbound lane + /// state update. Because of that, the submitter (relayer) has no benefit of not including + /// this data in the transaction, so reward confirmations lags should be minimal. + /// + /// The call fails if: + /// + /// - the pallet is halted; + /// + /// - the call origin is not `Signed(_)`; + /// + /// - there are too many messages in the proof; + /// + /// - the proof verification procedure returns an error - e.g. because header used to craft + /// proof is not imported by the associated finality pallet; + /// + /// - the `dispatch_weight` argument is not sufficient to dispatch all bundled messages. + /// + /// The call may succeed, but some messages may not be delivered e.g. if they are not fit + /// into the unrewarded relayers vector. + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::receive_messages_proof_weight(proof, *messages_count, *dispatch_weight))] + pub fn receive_messages_proof( + origin: OriginFor, + relayer_id_at_bridged_chain: T::InboundRelayer, + proof: MessagesProofOf, + messages_count: u32, + dispatch_weight: Weight, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + let relayer_id_at_this_chain = ensure_signed(origin)?; + + // reject transactions that are declaring too many messages + ensure!( + MessageNonce::from(messages_count) <= T::MaxUnconfirmedMessagesAtInboundLane::get(), + Error::::TooManyMessagesInTheProof + ); + + // if message dispatcher is currently inactive, we won't accept any messages + ensure!(T::MessageDispatch::is_active(), Error::::MessageDispatchInactive); + + // why do we need to know the weight of this (`receive_messages_proof`) call? Because + // we may want to return some funds for not-dispatching (or partially dispatching) some + // messages to the call origin (relayer). And this is done by returning actual weight + // from the call. But we only know dispatch weight of every messages. So to refund + // relayer because we have not dispatched Message, we need to: + // + // ActualWeight = DeclaredWeight - Message.DispatchWeight + // + // The DeclaredWeight is exactly what's computed here. Unfortunately it is impossible + // to get pre-computed value (and it has been already computed by the executive). + let declared_weight = T::WeightInfo::receive_messages_proof_weight( + &proof, + messages_count, + dispatch_weight, + ); + let mut actual_weight = declared_weight; + + // verify messages proof && convert proof into messages + let messages = verify_and_decode_messages_proof::< + T::SourceHeaderChain, + T::InboundPayload, + >(proof, messages_count) + .map_err(|err| { + log::trace!(target: LOG_TARGET, "Rejecting invalid messages proof: {:?}", err,); + + Error::::InvalidMessagesProof + })?; + + // dispatch messages and (optionally) update lane(s) state(s) + let mut total_messages = 0; + let mut valid_messages = 0; + let mut messages_received_status = Vec::with_capacity(messages.len()); + let mut dispatch_weight_left = dispatch_weight; + for (lane_id, lane_data) in messages { + let mut lane = inbound_lane::(lane_id); + + // subtract extra storage proof bytes from the actual PoV size - there may be + // less unrewarded relayers than the maximal configured value + let lane_extra_proof_size_bytes = lane.storage_mut().extra_proof_size_bytes(); + actual_weight = actual_weight.set_proof_size( + actual_weight.proof_size().saturating_sub(lane_extra_proof_size_bytes), + ); + + if let Some(lane_state) = lane_data.lane_state { + let updated_latest_confirmed_nonce = lane.receive_state_update(lane_state); + if let Some(updated_latest_confirmed_nonce) = updated_latest_confirmed_nonce { + log::trace!( + target: LOG_TARGET, + "Received lane {:?} state update: latest_confirmed_nonce={}. Unrewarded relayers: {:?}", + lane_id, + updated_latest_confirmed_nonce, + UnrewardedRelayersState::from(&lane.storage_mut().get_or_init_data()), + ); + } + } + + let mut lane_messages_received_status = + ReceivedMessages::new(lane_id, Vec::with_capacity(lane_data.messages.len())); + for mut message in lane_data.messages { + debug_assert_eq!(message.key.lane_id, lane_id); + total_messages += 1; + + // ensure that relayer has declared enough weight for dispatching next message + // on this lane. We can't dispatch lane messages out-of-order, so if declared + // weight is not enough, let's move to next lane + let message_dispatch_weight = T::MessageDispatch::dispatch_weight(&mut message); + if message_dispatch_weight.any_gt(dispatch_weight_left) { + log::trace!( + target: LOG_TARGET, + "Cannot dispatch any more messages on lane {:?}. Weight: declared={}, left={}", + lane_id, + message_dispatch_weight, + dispatch_weight_left, + ); + + fail!(Error::::InsufficientDispatchWeight); + } + + let receival_result = lane.receive_message::( + &relayer_id_at_bridged_chain, + message.key.nonce, + message.data, + ); + + // note that we're returning unspent weight to relayer even if message has been + // rejected by the lane. This allows relayers to submit spam transactions with + // e.g. the same set of already delivered messages over and over again, without + // losing funds for messages dispatch. But keep in mind that relayer pays base + // delivery transaction cost anyway. And base cost covers everything except + // dispatch, so we have a balance here. + let unspent_weight = match &receival_result { + ReceivalResult::Dispatched(dispatch_result) => { + valid_messages += 1; + dispatch_result.unspent_weight + }, + ReceivalResult::InvalidNonce | + ReceivalResult::TooManyUnrewardedRelayers | + ReceivalResult::TooManyUnconfirmedMessages => message_dispatch_weight, + }; + lane_messages_received_status.push(message.key.nonce, receival_result); + + let unspent_weight = unspent_weight.min(message_dispatch_weight); + dispatch_weight_left -= message_dispatch_weight - unspent_weight; + actual_weight = actual_weight.saturating_sub(unspent_weight); + } + + messages_received_status.push(lane_messages_received_status); + } + + // let's now deal with relayer payments + T::DeliveryPayments::pay_reward( + relayer_id_at_this_chain, + total_messages, + valid_messages, + actual_weight, + ); + + log::debug!( + target: LOG_TARGET, + "Received messages: total={}, valid={}. Weight used: {}/{}.", + total_messages, + valid_messages, + actual_weight, + declared_weight, + ); + + Self::deposit_event(Event::MessagesReceived(messages_received_status)); + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) + } + + /// Receive messages delivery proof from bridged chain. + #[pallet::call_index(3)] + #[pallet::weight(T::WeightInfo::receive_messages_delivery_proof_weight( + proof, + relayers_state, + ))] + pub fn receive_messages_delivery_proof( + origin: OriginFor, + proof: MessagesDeliveryProofOf, + mut relayers_state: UnrewardedRelayersState, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + + let proof_size = proof.size(); + let confirmation_relayer = ensure_signed(origin)?; + let (lane_id, lane_data) = T::TargetHeaderChain::verify_messages_delivery_proof(proof) + .map_err(|err| { + log::trace!( + target: LOG_TARGET, + "Rejecting invalid messages delivery proof: {:?}", + err, + ); + + Error::::InvalidMessagesDeliveryProof + })?; + ensure!( + relayers_state.is_valid(&lane_data), + Error::::InvalidUnrewardedRelayersState + ); + + // mark messages as delivered + let mut lane = outbound_lane::(lane_id); + let last_delivered_nonce = lane_data.last_delivered_nonce(); + let confirmed_messages = lane + .confirm_delivery( + relayers_state.total_messages, + last_delivered_nonce, + &lane_data.relayers, + ) + .map_err(Error::::ReceivalConfirmation)?; + + if let Some(confirmed_messages) = confirmed_messages { + // emit 'delivered' event + let received_range = confirmed_messages.begin..=confirmed_messages.end; + Self::deposit_event(Event::MessagesDelivered { + lane_id, + messages: confirmed_messages, + }); + + // if some new messages have been confirmed, reward relayers + let actually_rewarded_relayers = T::DeliveryConfirmationPayments::pay_reward( + lane_id, + lane_data.relayers, + &confirmation_relayer, + &received_range, + ); + + // update relayers state with actual numbers to compute actual weight below + relayers_state.unrewarded_relayer_entries = sp_std::cmp::min( + relayers_state.unrewarded_relayer_entries, + actually_rewarded_relayers, + ); + relayers_state.total_messages = sp_std::cmp::min( + relayers_state.total_messages, + received_range.checked_len().unwrap_or(MessageNonce::MAX), + ); + }; + + log::trace!( + target: LOG_TARGET, + "Received messages delivery proof up to (and including) {} at lane {:?}", + last_delivered_nonce, + lane_id, + ); + + // notify others about messages delivery + T::OnMessagesDelivered::on_messages_delivered( + lane_id, + lane.data().queued_messages().saturating_len(), + ); + + // because of lags, the inbound lane state (`lane_data`) may have entries for + // already rewarded relayers and messages (if all entries are duplicated, then + // this transaction must be filtered out by our signed extension) + let actual_weight = T::WeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(proof_size as usize), + &relayers_state, + ); + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event, I: 'static = ()> { + /// Message has been accepted and is waiting to be delivered. + MessageAccepted { lane_id: LaneId, nonce: MessageNonce }, + /// Messages have been received from the bridged chain. + MessagesReceived( + Vec::DispatchLevelResult>>, + ), + /// Messages in the inclusive range have been delivered to the bridged chain. + MessagesDelivered { lane_id: LaneId, messages: DeliveredMessages }, + } + + #[pallet::error] + pub enum Error { + /// Pallet is not in Normal operating mode. + NotOperatingNormally, + /// The outbound lane is inactive. + InactiveOutboundLane, + /// The inbound message dispatcher is inactive. + MessageDispatchInactive, + /// Message has been treated as invalid by chain verifier. + MessageRejectedByChainVerifier(VerificationError), + /// Message has been treated as invalid by lane verifier. + MessageRejectedByLaneVerifier(VerificationError), + /// Message has been treated as invalid by the pallet logic. + MessageRejectedByPallet(VerificationError), + /// Submitter has failed to pay fee for delivering and dispatching messages. + FailedToWithdrawMessageFee, + /// The transaction brings too many messages. + TooManyMessagesInTheProof, + /// Invalid messages has been submitted. + InvalidMessagesProof, + /// Invalid messages delivery proof has been submitted. + InvalidMessagesDeliveryProof, + /// The relayer has declared invalid unrewarded relayers state in the + /// `receive_messages_delivery_proof` call. + InvalidUnrewardedRelayersState, + /// The cumulative dispatch weight, passed by relayer is not enough to cover dispatch + /// of all bundled messages. + InsufficientDispatchWeight, + /// The message someone is trying to work with (i.e. increase fee) is not yet sent. + MessageIsNotYetSent, + /// Error confirming messages receival. + ReceivalConfirmation(ReceivalConfirmationError), + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Optional pallet owner. + /// + /// Pallet owner has a right to halt all pallet operations and then resume it. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt + /// flag directly or call the `halt_operations`). + #[pallet::storage] + #[pallet::getter(fn module_owner)] + pub type PalletOwner, I: 'static = ()> = StorageValue<_, T::AccountId>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, some, or no transactions will be allowed. + #[pallet::storage] + #[pallet::getter(fn operating_mode)] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, MessagesOperatingMode, ValueQuery>; + + /// Map of lane id => inbound lane data. + #[pallet::storage] + pub type InboundLanes, I: 'static = ()> = + StorageMap<_, Blake2_128Concat, LaneId, StoredInboundLaneData, ValueQuery>; + + /// Map of lane id => outbound lane data. + #[pallet::storage] + pub type OutboundLanes, I: 'static = ()> = StorageMap< + Hasher = Blake2_128Concat, + Key = LaneId, + Value = OutboundLaneData, + QueryKind = ValueQuery, + OnEmpty = GetDefault, + MaxValues = MaybeOutboundLanesCount, + >; + + /// Map of lane id => is congested signal sent. It is managed by the + /// `bridge_runtime_common::LocalXcmQueueManager`. + /// + /// **bridges-v1**: this map is a temporary hack and will be dropped in the `v2`. We can emulate + /// a storage map using `sp_io::unhashed` storage functions, but then benchmarks are not + /// accounting its `proof_size`, so it is missing from the final weights. So we need to make it + /// a map inside some pallet. We could use a simply value instead of map here, because + /// in `v1` we'll only have a single lane. But in the case of adding another lane before `v2`, + /// it'll be easier to deal with the isolated storage map instead. + #[pallet::storage] + pub type OutboundLanesCongestedSignals, I: 'static = ()> = StorageMap< + Hasher = Blake2_128Concat, + Key = LaneId, + Value = bool, + QueryKind = ValueQuery, + OnEmpty = GetDefault, + MaxValues = MaybeOutboundLanesCount, + >; + + /// All queued outbound messages. + #[pallet::storage] + pub type OutboundMessages, I: 'static = ()> = + StorageMap<_, Blake2_128Concat, MessageKey, StoredMessagePayload>; + + #[pallet::genesis_config] + #[derive(DefaultNoBound)] + pub struct GenesisConfig, I: 'static = ()> { + /// Initial pallet operating mode. + pub operating_mode: MessagesOperatingMode, + /// Initial pallet owner. + pub owner: Option, + /// Dummy marker. + pub phantom: sp_std::marker::PhantomData, + } + + #[pallet::genesis_build] + impl, I: 'static> BuildGenesisConfig for GenesisConfig { + fn build(&self) { + PalletOperatingMode::::put(self.operating_mode); + if let Some(ref owner) = self.owner { + PalletOwner::::put(owner); + } + } + } + + impl, I: 'static> Pallet { + /// Get stored data of the outbound message with given nonce. + pub fn outbound_message_data(lane: LaneId, nonce: MessageNonce) -> Option { + OutboundMessages::::get(MessageKey { lane_id: lane, nonce }).map(Into::into) + } + + /// Prepare data, related to given inbound message. + pub fn inbound_message_data( + lane: LaneId, + payload: MessagePayload, + outbound_details: OutboundMessageDetails, + ) -> InboundMessageDetails { + let mut dispatch_message = DispatchMessage { + key: MessageKey { lane_id: lane, nonce: outbound_details.nonce }, + data: payload.into(), + }; + InboundMessageDetails { + dispatch_weight: T::MessageDispatch::dispatch_weight(&mut dispatch_message), + } + } + + /// Return outbound lane data. + pub fn outbound_lane_data(lane: LaneId) -> OutboundLaneData { + OutboundLanes::::get(lane) + } + + /// Return inbound lane data. + pub fn inbound_lane_data(lane: LaneId) -> InboundLaneData { + InboundLanes::::get(lane).0 + } + } + + /// Get-parameter that returns number of active outbound lanes that the pallet maintains. + pub struct MaybeOutboundLanesCount(PhantomData<(T, I)>); + + impl, I: 'static> Get> for MaybeOutboundLanesCount { + fn get() -> Option { + Some(T::ActiveOutboundLanes::get().len() as u32) + } + } +} + +impl bp_messages::source_chain::MessagesBridge for Pallet +where + T: Config, + I: 'static, +{ + type Error = sp_runtime::DispatchErrorWithPostInfo; + + fn send_message( + lane: LaneId, + message: T::OutboundPayload, + ) -> Result { + crate::send_message::(lane, message) + } +} + +/// Function that actually sends message. +fn send_message, I: 'static>( + lane_id: LaneId, + payload: T::OutboundPayload, +) -> sp_std::result::Result< + SendMessageArtifacts, + sp_runtime::DispatchErrorWithPostInfo, +> { + ensure_normal_operating_mode::()?; + + // let's check if outbound lane is active + ensure!(T::ActiveOutboundLanes::get().contains(&lane_id), Error::::InactiveOutboundLane,); + + // let's first check if message can be delivered to target chain + T::TargetHeaderChain::verify_message(&payload).map_err(|err| { + log::trace!( + target: LOG_TARGET, + "Message to lane {:?} is rejected by target chain: {:?}", + lane_id, + err, + ); + + Error::::MessageRejectedByChainVerifier(err) + })?; + + // now let's enforce any additional lane rules + let mut lane = outbound_lane::(lane_id); + T::LaneMessageVerifier::verify_message(&lane_id, &lane.data(), &payload).map_err(|err| { + log::trace!( + target: LOG_TARGET, + "Message to lane {:?} is rejected by lane verifier: {:?}", + lane_id, + err, + ); + + Error::::MessageRejectedByLaneVerifier(err) + })?; + + // finally, save message in outbound storage and emit event + let encoded_payload = payload.encode(); + let encoded_payload_len = encoded_payload.len(); + let nonce = lane + .send_message(encoded_payload) + .map_err(Error::::MessageRejectedByPallet)?; + + // return number of messages in the queue to let sender know about its state + let enqueued_messages = lane.data().queued_messages().saturating_len(); + + log::trace!( + target: LOG_TARGET, + "Accepted message {} to lane {:?}. Message size: {:?}", + nonce, + lane_id, + encoded_payload_len, + ); + + Pallet::::deposit_event(Event::MessageAccepted { lane_id, nonce }); + + Ok(SendMessageArtifacts { nonce, enqueued_messages }) +} + +/// Ensure that the pallet is in normal operational mode. +fn ensure_normal_operating_mode, I: 'static>() -> Result<(), Error> { + if PalletOperatingMode::::get() == + MessagesOperatingMode::Basic(BasicOperatingMode::Normal) + { + return Ok(()) + } + + Err(Error::::NotOperatingNormally) +} + +/// Creates new inbound lane object, backed by runtime storage. +fn inbound_lane, I: 'static>( + lane_id: LaneId, +) -> InboundLane> { + InboundLane::new(RuntimeInboundLaneStorage::from_lane_id(lane_id)) +} + +/// Creates new outbound lane object, backed by runtime storage. +fn outbound_lane, I: 'static>( + lane_id: LaneId, +) -> OutboundLane> { + OutboundLane::new(RuntimeOutboundLaneStorage { lane_id, _phantom: Default::default() }) +} + +/// Runtime inbound lane storage. +struct RuntimeInboundLaneStorage, I: 'static = ()> { + lane_id: LaneId, + cached_data: Option>, + _phantom: PhantomData, +} + +impl, I: 'static> RuntimeInboundLaneStorage { + /// Creates new runtime inbound lane storage. + fn from_lane_id(lane_id: LaneId) -> RuntimeInboundLaneStorage { + RuntimeInboundLaneStorage { lane_id, cached_data: None, _phantom: Default::default() } + } +} + +impl, I: 'static> RuntimeInboundLaneStorage { + /// Returns number of bytes that may be subtracted from the PoV component of + /// `receive_messages_proof` call, because the actual inbound lane state is smaller than the + /// maximal configured. + /// + /// Maximal inbound lane state set size is configured by the + /// `MaxUnrewardedRelayerEntriesAtInboundLane` constant from the pallet configuration. The PoV + /// of the call includes the maximal size of inbound lane state. If the actual size is smaller, + /// we may subtract extra bytes from this component. + pub fn extra_proof_size_bytes(&mut self) -> u64 { + let max_encoded_len = StoredInboundLaneData::::max_encoded_len(); + let relayers_count = self.get_or_init_data().relayers.len(); + let actual_encoded_len = + InboundLaneData::::encoded_size_hint(relayers_count) + .unwrap_or(usize::MAX); + max_encoded_len.saturating_sub(actual_encoded_len) as _ + } +} + +impl, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage { + type Relayer = T::InboundRelayer; + + fn id(&self) -> LaneId { + self.lane_id + } + + fn max_unrewarded_relayer_entries(&self) -> MessageNonce { + T::MaxUnrewardedRelayerEntriesAtInboundLane::get() + } + + fn max_unconfirmed_messages(&self) -> MessageNonce { + T::MaxUnconfirmedMessagesAtInboundLane::get() + } + + fn get_or_init_data(&mut self) -> InboundLaneData { + match self.cached_data { + Some(ref data) => data.clone(), + None => { + let data: InboundLaneData = + InboundLanes::::get(self.lane_id).into(); + self.cached_data = Some(data.clone()); + data + }, + } + } + + fn set_data(&mut self, data: InboundLaneData) { + self.cached_data = Some(data.clone()); + InboundLanes::::insert(self.lane_id, StoredInboundLaneData::(data)) + } +} + +/// Runtime outbound lane storage. +struct RuntimeOutboundLaneStorage { + lane_id: LaneId, + _phantom: PhantomData<(T, I)>, +} + +impl, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorage { + fn id(&self) -> LaneId { + self.lane_id + } + + fn data(&self) -> OutboundLaneData { + OutboundLanes::::get(self.lane_id) + } + + fn set_data(&mut self, data: OutboundLaneData) { + OutboundLanes::::insert(self.lane_id, data) + } + + #[cfg(test)] + fn message(&self, nonce: &MessageNonce) -> Option { + OutboundMessages::::get(MessageKey { lane_id: self.lane_id, nonce: *nonce }) + .map(Into::into) + } + + fn save_message( + &mut self, + nonce: MessageNonce, + message_payload: MessagePayload, + ) -> Result<(), VerificationError> { + OutboundMessages::::insert( + MessageKey { lane_id: self.lane_id, nonce }, + StoredMessagePayload::::try_from(message_payload) + .map_err(|_| VerificationError::MessageTooLarge)?, + ); + Ok(()) + } + + fn remove_message(&mut self, nonce: &MessageNonce) { + OutboundMessages::::remove(MessageKey { lane_id: self.lane_id, nonce: *nonce }); + } +} + +/// Verify messages proof and return proved messages with decoded payload. +fn verify_and_decode_messages_proof( + proof: Chain::MessagesProof, + messages_count: u32, +) -> Result>, VerificationError> { + // `receive_messages_proof` weight formula and `MaxUnconfirmedMessagesAtInboundLane` check + // guarantees that the `message_count` is sane and Vec may be allocated. + // (tx with too many messages will either be rejected from the pool, or will fail earlier) + Chain::verify_messages_proof(proof, messages_count).map(|messages_by_lane| { + messages_by_lane + .into_iter() + .map(|(lane, lane_data)| { + ( + lane, + ProvedLaneMessages { + lane_state: lane_data.lane_state, + messages: lane_data.messages.into_iter().map(Into::into).collect(), + }, + ) + }) + .collect() + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + mock::{ + inbound_unrewarded_relayers_state, message, message_payload, run_test, + unrewarded_relayer, AccountId, DbWeight, RuntimeEvent as TestEvent, RuntimeOrigin, + TestDeliveryConfirmationPayments, TestDeliveryPayments, TestMessageDispatch, + TestMessagesDeliveryProof, TestMessagesProof, TestOnMessagesDelivered, TestRelayer, + TestRuntime, TestWeightInfo, MAX_OUTBOUND_PAYLOAD_SIZE, + PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_LANE_ID_2, + TEST_LANE_ID_3, TEST_RELAYER_A, TEST_RELAYER_B, + }, + outbound_lane::ReceivalConfirmationError, + }; + use bp_messages::{BridgeMessagesCall, UnrewardedRelayer, UnrewardedRelayersState}; + use bp_test_utils::generate_owned_bridge_module_tests; + use frame_support::{ + assert_noop, assert_ok, + dispatch::Pays, + storage::generator::{StorageMap, StorageValue}, + traits::Hooks, + weights::Weight, + }; + use frame_system::{EventRecord, Pallet as System, Phase}; + use sp_runtime::DispatchError; + + fn get_ready_for_events() { + System::::set_block_number(1); + System::::reset_events(); + } + + fn send_regular_message() { + get_ready_for_events(); + + let outbound_lane = outbound_lane::(TEST_LANE_ID); + let message_nonce = outbound_lane.data().latest_generated_nonce + 1; + let prev_enqueud_messages = outbound_lane.data().queued_messages().saturating_len(); + let artifacts = send_message::(TEST_LANE_ID, REGULAR_PAYLOAD) + .expect("send_message has failed"); + assert_eq!(artifacts.enqueued_messages, prev_enqueud_messages + 1); + + // check event with assigned nonce + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Messages(Event::MessageAccepted { + lane_id: TEST_LANE_ID, + nonce: message_nonce + }), + topics: vec![], + }], + ); + } + + fn receive_messages_delivery_proof() { + System::::set_block_number(1); + System::::reset_events(); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: DeliveredMessages::new(1), + }] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Messages(Event::MessagesDelivered { + lane_id: TEST_LANE_ID, + messages: DeliveredMessages::new(1), + }), + topics: vec![], + }], + ); + } + + #[test] + fn pallet_rejects_transactions_if_halted() { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(); + + PalletOperatingMode::::put(MessagesOperatingMode::Basic( + BasicOperatingMode::Halted, + )); + + assert_noop!( + send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,), + Error::::NotOperatingNormally, + ); + + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(2, REGULAR_PAYLOAD)]).into(), + 1, + REGULAR_PAYLOAD.declared_weight, + ), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), + ); + + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + ), + Error::::BridgeModule(bp_runtime::OwnedBridgeModuleError::Halted), + ); + }); + } + + #[test] + fn pallet_rejects_new_messages_in_rejecting_outbound_messages_operating_mode() { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(); + + PalletOperatingMode::::put( + MessagesOperatingMode::RejectingOutboundMessages, + ); + + assert_noop!( + send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,), + Error::::NotOperatingNormally, + ); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + 1, + REGULAR_PAYLOAD.declared_weight, + ),); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + }); + } + + #[test] + fn send_message_works() { + run_test(|| { + send_regular_message(); + }); + } + + #[test] + fn send_message_rejects_too_large_message() { + run_test(|| { + let mut message_payload = message_payload(1, 0); + // the payload isn't simply extra, so it'll definitely overflow + // `MAX_OUTBOUND_PAYLOAD_SIZE` if we add `MAX_OUTBOUND_PAYLOAD_SIZE` bytes to extra + message_payload + .extra + .extend_from_slice(&[0u8; MAX_OUTBOUND_PAYLOAD_SIZE as usize]); + assert_noop!( + send_message::(TEST_LANE_ID, message_payload.clone(),), + Error::::MessageRejectedByPallet( + VerificationError::MessageTooLarge + ), + ); + + // let's check that we're able to send `MAX_OUTBOUND_PAYLOAD_SIZE` messages + while message_payload.encoded_size() as u32 > MAX_OUTBOUND_PAYLOAD_SIZE { + message_payload.extra.pop(); + } + assert_eq!(message_payload.encoded_size() as u32, MAX_OUTBOUND_PAYLOAD_SIZE); + assert_ok!(send_message::(TEST_LANE_ID, message_payload,),); + }) + } + + #[test] + fn chain_verifier_rejects_invalid_message_in_send_message() { + run_test(|| { + // messages with this payload are rejected by target chain verifier + assert_noop!( + send_message::(TEST_LANE_ID, PAYLOAD_REJECTED_BY_TARGET_CHAIN,), + Error::::MessageRejectedByChainVerifier(VerificationError::Other( + mock::TEST_ERROR + )), + ); + }); + } + + #[test] + fn lane_verifier_rejects_invalid_message_in_send_message() { + run_test(|| { + // messages with zero fee are rejected by lane verifier + let mut message = REGULAR_PAYLOAD; + message.reject_by_lane_verifier = true; + assert_noop!( + send_message::(TEST_LANE_ID, message,), + Error::::MessageRejectedByLaneVerifier(VerificationError::Other( + mock::TEST_ERROR + )), + ); + }); + } + + #[test] + fn receive_messages_proof_works() { + run_test(|| { + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + 1, + REGULAR_PAYLOAD.declared_weight, + )); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).0.last_delivered_nonce(), 1); + + assert!(TestDeliveryPayments::is_reward_paid(1)); + }); + } + + #[test] + fn receive_messages_proof_updates_confirmed_message_nonce() { + run_test(|| { + // say we have received 10 messages && last confirmed message is 8 + InboundLanes::::insert( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 8, + relayers: vec![ + unrewarded_relayer(9, 9, TEST_RELAYER_A), + unrewarded_relayer(10, 10, TEST_RELAYER_B), + ] + .into_iter() + .collect(), + }, + ); + assert_eq!( + inbound_unrewarded_relayers_state(TEST_LANE_ID), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 10, + }, + ); + + // message proof includes outbound lane state with latest confirmed message updated to 9 + let mut message_proof: TestMessagesProof = + Ok(vec![message(11, REGULAR_PAYLOAD)]).into(); + message_proof.result.as_mut().unwrap()[0].1.lane_state = + Some(OutboundLaneData { latest_received_nonce: 9, ..Default::default() }); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + message_proof, + 1, + REGULAR_PAYLOAD.declared_weight, + )); + + assert_eq!( + InboundLanes::::get(TEST_LANE_ID).0, + InboundLaneData { + last_confirmed_nonce: 9, + relayers: vec![ + unrewarded_relayer(10, 10, TEST_RELAYER_B), + unrewarded_relayer(11, 11, TEST_RELAYER_A) + ] + .into_iter() + .collect(), + }, + ); + assert_eq!( + inbound_unrewarded_relayers_state(TEST_LANE_ID), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 11, + }, + ); + }); + } + + #[test] + fn receive_messages_fails_if_dispatcher_is_inactive() { + run_test(|| { + TestMessageDispatch::deactivate(); + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + 1, + REGULAR_PAYLOAD.declared_weight, + ), + Error::::MessageDispatchInactive, + ); + }); + } + + #[test] + fn receive_messages_proof_does_not_accept_message_if_dispatch_weight_is_not_enough() { + run_test(|| { + let mut declared_weight = REGULAR_PAYLOAD.declared_weight; + *declared_weight.ref_time_mut() -= 1; + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + 1, + declared_weight, + ), + Error::::InsufficientDispatchWeight + ); + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); + }); + } + + #[test] + fn receive_messages_proof_rejects_invalid_proof() { + run_test(|| { + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Err(()).into(), + 1, + Weight::zero(), + ), + Error::::InvalidMessagesProof, + ); + }); + } + + #[test] + fn receive_messages_proof_rejects_proof_with_too_many_messages() { + run_test(|| { + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![message(1, REGULAR_PAYLOAD)]).into(), + u32::MAX, + Weight::zero(), + ), + Error::::TooManyMessagesInTheProof, + ); + }); + } + + #[test] + fn receive_messages_delivery_proof_works() { + run_test(|| { + send_regular_message(); + receive_messages_delivery_proof(); + + assert_eq!( + OutboundLanes::::get(TEST_LANE_ID).latest_received_nonce, + 1, + ); + }); + } + + #[test] + fn receive_messages_delivery_proof_rewards_relayers() { + run_test(|| { + assert_ok!(send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,)); + assert_ok!(send_message::(TEST_LANE_ID, REGULAR_PAYLOAD,)); + + // this reports delivery of message 1 => reward is paid to TEST_RELAYER_A + let single_message_delivery_proof = TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)].into_iter().collect(), + ..Default::default() + }, + ))); + let single_message_delivery_proof_size = single_message_delivery_proof.size(); + let result = Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + single_message_delivery_proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + ); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + TestWeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(single_message_delivery_proof_size as _), + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }, + ) + ); + assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); + assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); + assert_eq!(TestOnMessagesDelivered::call_arguments(), Some((TEST_LANE_ID, 1))); + + // this reports delivery of both message 1 and message 2 => reward is paid only to + // TEST_RELAYER_B + let two_messages_delivery_proof = TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B), + ] + .into_iter() + .collect(), + ..Default::default() + }, + ))); + let two_messages_delivery_proof_size = two_messages_delivery_proof.size(); + let result = Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + two_messages_delivery_proof, + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + messages_in_oldest_entry: 1, + total_messages: 2, + last_delivered_nonce: 2, + }, + ); + assert_ok!(result); + // even though the pre-dispatch weight was for two messages, the actual weight is + // for single message only + assert_eq!( + result.unwrap().actual_weight.unwrap(), + TestWeightInfo::receive_messages_delivery_proof_weight( + &PreComputedSize(two_messages_delivery_proof_size as _), + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }, + ) + ); + assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1)); + assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1)); + assert_eq!(TestOnMessagesDelivered::call_arguments(), Some((TEST_LANE_ID, 0))); + }); + } + + #[test] + fn receive_messages_delivery_proof_rejects_invalid_proof() { + run_test(|| { + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Err(())), + Default::default(), + ), + Error::::InvalidMessagesDeliveryProof, + ); + }); + } + + #[test] + fn receive_messages_delivery_proof_rejects_proof_if_declared_relayers_state_is_invalid() { + run_test(|| { + // when number of relayers entries is invalid + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B) + ] + .into_iter() + .collect(), + ..Default::default() + } + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 2, + last_delivered_nonce: 2, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + + // when number of messages is invalid + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B) + ] + .into_iter() + .collect(), + ..Default::default() + } + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + total_messages: 1, + last_delivered_nonce: 2, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + + // when last delivered nonce is invalid + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + relayers: vec![ + unrewarded_relayer(1, 1, TEST_RELAYER_A), + unrewarded_relayer(2, 2, TEST_RELAYER_B) + ] + .into_iter() + .collect(), + ..Default::default() + } + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 2, + total_messages: 2, + last_delivered_nonce: 8, + ..Default::default() + }, + ), + Error::::InvalidUnrewardedRelayersState, + ); + }); + } + + #[test] + fn receive_messages_accepts_single_message_with_invalid_payload() { + run_test(|| { + let mut invalid_message = message(1, REGULAR_PAYLOAD); + invalid_message.payload = Vec::new(); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok(vec![invalid_message]).into(), + 1, + Weight::zero(), /* weight may be zero in this case (all messages are + * improperly encoded) */ + ),); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 1,); + }); + } + + #[test] + fn receive_messages_accepts_batch_with_message_with_invalid_payload() { + run_test(|| { + let mut invalid_message = message(2, REGULAR_PAYLOAD); + invalid_message.payload = Vec::new(); + + assert_ok!(Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + Ok( + vec![message(1, REGULAR_PAYLOAD), invalid_message, message(3, REGULAR_PAYLOAD),] + ) + .into(), + 3, + REGULAR_PAYLOAD.declared_weight + REGULAR_PAYLOAD.declared_weight, + ),); + + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 3,); + }); + } + + #[test] + fn actual_dispatch_weight_does_not_overlow() { + run_test(|| { + let message1 = message(1, message_payload(0, u64::MAX / 2)); + let message2 = message(2, message_payload(0, u64::MAX / 2)); + let message3 = message(3, message_payload(0, u64::MAX / 2)); + + assert_noop!( + Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + // this may cause overflow if source chain storage is invalid + Ok(vec![message1, message2, message3]).into(), + 3, + Weight::MAX, + ), + Error::::InsufficientDispatchWeight + ); + assert_eq!(InboundLanes::::get(TEST_LANE_ID).last_delivered_nonce(), 0); + }); + } + + #[test] + fn ref_time_refund_from_receive_messages_proof_works() { + run_test(|| { + fn submit_with_unspent_weight( + nonce: MessageNonce, + unspent_weight: u64, + ) -> (Weight, Weight) { + let mut payload = REGULAR_PAYLOAD; + *payload.dispatch_result.unspent_weight.ref_time_mut() = unspent_weight; + let proof = Ok(vec![message(nonce, payload)]).into(); + let messages_count = 1; + let pre_dispatch_weight = + ::WeightInfo::receive_messages_proof_weight( + &proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ); + let result = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .expect("delivery has failed"); + let post_dispatch_weight = + result.actual_weight.expect("receive_messages_proof always returns Some"); + + // message delivery transactions are never free + assert_eq!(result.pays_fee, Pays::Yes); + + (pre_dispatch_weight, post_dispatch_weight) + } + + // when dispatch is returning `unspent_weight < declared_weight` + let (pre, post) = submit_with_unspent_weight(1, 1); + assert_eq!(post.ref_time(), pre.ref_time() - 1); + + // when dispatch is returning `unspent_weight = declared_weight` + let (pre, post) = + submit_with_unspent_weight(2, REGULAR_PAYLOAD.declared_weight.ref_time()); + assert_eq!( + post.ref_time(), + pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() + ); + + // when dispatch is returning `unspent_weight > declared_weight` + let (pre, post) = + submit_with_unspent_weight(3, REGULAR_PAYLOAD.declared_weight.ref_time() + 1); + assert_eq!( + post.ref_time(), + pre.ref_time() - REGULAR_PAYLOAD.declared_weight.ref_time() + ); + + // when there's no unspent weight + let (pre, post) = submit_with_unspent_weight(4, 0); + assert_eq!(post.ref_time(), pre.ref_time()); + + // when dispatch is returning `unspent_weight < declared_weight` + let (pre, post) = submit_with_unspent_weight(5, 1); + assert_eq!(post.ref_time(), pre.ref_time() - 1); + }); + } + + #[test] + fn proof_size_refund_from_receive_messages_proof_works() { + run_test(|| { + let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; + + // if there's maximal number of unrewarded relayer entries at the inbound lane, then + // `proof_size` is unchanged in post-dispatch weight + let proof: TestMessagesProof = Ok(vec![message(101, REGULAR_PAYLOAD)]).into(); + let messages_count = 1; + let pre_dispatch_weight = + ::WeightInfo::receive_messages_proof_weight( + &proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ); + InboundLanes::::insert( + TEST_LANE_ID, + StoredInboundLaneData(InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: 42, + messages: DeliveredMessages { begin: 0, end: 100 } + }; + max_entries + ] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }), + ); + let post_dispatch_weight = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof.clone(), + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .unwrap() + .actual_weight + .unwrap(); + assert_eq!(post_dispatch_weight.proof_size(), pre_dispatch_weight.proof_size()); + + // if count of unrewarded relayer entries is less than maximal, then some `proof_size` + // must be refunded + InboundLanes::::insert( + TEST_LANE_ID, + StoredInboundLaneData(InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: 42, + messages: DeliveredMessages { begin: 0, end: 100 } + }; + max_entries - 1 + ] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }), + ); + let post_dispatch_weight = Pallet::::receive_messages_proof( + RuntimeOrigin::signed(1), + TEST_RELAYER_A, + proof, + messages_count, + REGULAR_PAYLOAD.declared_weight, + ) + .unwrap() + .actual_weight + .unwrap(); + assert!( + post_dispatch_weight.proof_size() < pre_dispatch_weight.proof_size(), + "Expected post-dispatch PoV {} to be less than pre-dispatch PoV {}", + post_dispatch_weight.proof_size(), + pre_dispatch_weight.proof_size(), + ); + }); + } + + #[test] + fn messages_delivered_callbacks_are_called() { + run_test(|| { + send_regular_message(); + send_regular_message(); + send_regular_message(); + + // messages 1+2 are confirmed in 1 tx, message 3 in a separate tx + // dispatch of message 2 has failed + let mut delivered_messages_1_and_2 = DeliveredMessages::new(1); + delivered_messages_1_and_2.note_dispatched_message(); + let messages_1_and_2_proof = Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 0, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: delivered_messages_1_and_2.clone(), + }] + .into_iter() + .collect(), + }, + )); + let delivered_message_3 = DeliveredMessages::new(3); + let messages_3_proof = Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 0, + relayers: vec![UnrewardedRelayer { relayer: 0, messages: delivered_message_3 }] + .into_iter() + .collect(), + }, + )); + + // first tx with messages 1+2 + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(messages_1_and_2_proof), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 2, + total_messages: 2, + last_delivered_nonce: 2, + }, + )); + // second tx with message 3 + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(messages_3_proof), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 3, + }, + )); + }); + } + + #[test] + fn receive_messages_delivery_proof_rejects_proof_if_trying_to_confirm_more_messages_than_expected( + ) { + run_test(|| { + // send message first to be able to check that delivery_proof fails later + send_regular_message(); + + // 1) InboundLaneData declares that the `last_confirmed_nonce` is 1; + // 2) InboundLaneData has no entries => `InboundLaneData::last_delivered_nonce()` + // returns `last_confirmed_nonce`; + // 3) it means that we're going to confirm delivery of messages 1..=1; + // 4) so the number of declared messages (see `UnrewardedRelayersState`) is `0` and + // numer of actually confirmed messages is `1`. + assert_noop!( + Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { last_confirmed_nonce: 1, relayers: Default::default() }, + ))), + UnrewardedRelayersState { last_delivered_nonce: 1, ..Default::default() }, + ), + Error::::ReceivalConfirmation( + ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected + ), + ); + }); + } + + #[test] + fn storage_keys_computed_properly() { + assert_eq!( + PalletOperatingMode::::storage_value_final_key().to_vec(), + bp_messages::storage_keys::operating_mode_key("Messages").0, + ); + + assert_eq!( + OutboundMessages::::storage_map_final_key(MessageKey { + lane_id: TEST_LANE_ID, + nonce: 42 + }), + bp_messages::storage_keys::message_key("Messages", &TEST_LANE_ID, 42).0, + ); + + assert_eq!( + OutboundLanes::::storage_map_final_key(TEST_LANE_ID), + bp_messages::storage_keys::outbound_lane_data_key("Messages", &TEST_LANE_ID).0, + ); + + assert_eq!( + InboundLanes::::storage_map_final_key(TEST_LANE_ID), + bp_messages::storage_keys::inbound_lane_data_key("Messages", &TEST_LANE_ID).0, + ); + } + + #[test] + fn inbound_message_details_works() { + run_test(|| { + assert_eq!( + Pallet::::inbound_message_data( + TEST_LANE_ID, + REGULAR_PAYLOAD.encode(), + OutboundMessageDetails { nonce: 0, dispatch_weight: Weight::zero(), size: 0 }, + ), + InboundMessageDetails { dispatch_weight: REGULAR_PAYLOAD.declared_weight }, + ); + }); + } + + #[test] + fn on_idle_callback_respects_remaining_weight() { + run_test(|| { + send_regular_message(); + send_regular_message(); + send_regular_message(); + send_regular_message(); + + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 4, + relayers: vec![unrewarded_relayer(1, 4, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 4, + total_messages: 4, + last_delivered_nonce: 4, + }, + )); + + // all 4 messages may be pruned now + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, + 4 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 1 + ); + System::::set_block_number(2); + + // if passed wight is too low to do anything + let dbw = DbWeight::get(); + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 1)), + Weight::zero(), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 1 + ); + + // if passed wight is enough to prune single message + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 2)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 2 + ); + + // if passed wight is enough to prune two more messages + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(1, 3)), + dbw.reads_writes(1, 3), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 4 + ); + + // if passed wight is enough to prune many messages + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 5 + ); + }); + } + + #[test] + fn on_idle_callback_is_rotating_lanes_to_prune() { + run_test(|| { + // send + receive confirmation for lane 1 + send_regular_message(); + receive_messages_delivery_proof(); + // send + receive confirmation for lane 2 + assert_ok!(send_message::(TEST_LANE_ID_2, REGULAR_PAYLOAD,)); + assert_ok!(Pallet::::receive_messages_delivery_proof( + RuntimeOrigin::signed(1), + TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID_2, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![unrewarded_relayer(1, 1, TEST_RELAYER_A)] + .into_iter() + .collect(), + }, + ))), + UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }, + )); + + // nothing is pruned yet + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().latest_received_nonce, + 1 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 1 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().latest_received_nonce, + 1 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 1 + ); + + // in block#2.on_idle lane messages of lane 1 are pruned + let dbw = DbWeight::get(); + System::::set_block_number(2); + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 2 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 1 + ); + + // in block#3.on_idle lane messages of lane 2 are pruned + System::::set_block_number(3); + + assert_eq!( + Pallet::::on_idle(0, dbw.reads_writes(100, 100)), + dbw.reads_writes(1, 2), + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID).data().oldest_unpruned_nonce, + 2 + ); + assert_eq!( + outbound_lane::(TEST_LANE_ID_2).data().oldest_unpruned_nonce, + 2 + ); + }); + } + + #[test] + fn outbound_message_from_unconfigured_lane_is_rejected() { + run_test(|| { + assert_noop!( + send_message::(TEST_LANE_ID_3, REGULAR_PAYLOAD,), + Error::::InactiveOutboundLane, + ); + }); + } + + #[test] + fn test_bridge_messages_call_is_correctly_defined() { + let account_id = 1; + let message_proof: TestMessagesProof = Ok(vec![message(1, REGULAR_PAYLOAD)]).into(); + let message_delivery_proof = TestMessagesDeliveryProof(Ok(( + TEST_LANE_ID, + InboundLaneData { + last_confirmed_nonce: 1, + relayers: vec![UnrewardedRelayer { + relayer: 0, + messages: DeliveredMessages::new(1), + }] + .into_iter() + .collect(), + }, + ))); + let unrewarded_relayer_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + last_delivered_nonce: 1, + ..Default::default() + }; + + let direct_receive_messages_proof_call = Call::::receive_messages_proof { + relayer_id_at_bridged_chain: account_id, + proof: message_proof.clone(), + messages_count: 1, + dispatch_weight: REGULAR_PAYLOAD.declared_weight, + }; + let indirect_receive_messages_proof_call = BridgeMessagesCall::< + AccountId, + TestMessagesProof, + TestMessagesDeliveryProof, + >::receive_messages_proof { + relayer_id_at_bridged_chain: account_id, + proof: message_proof, + messages_count: 1, + dispatch_weight: REGULAR_PAYLOAD.declared_weight, + }; + assert_eq!( + direct_receive_messages_proof_call.encode(), + indirect_receive_messages_proof_call.encode() + ); + + let direct_receive_messages_delivery_proof_call = + Call::::receive_messages_delivery_proof { + proof: message_delivery_proof.clone(), + relayers_state: unrewarded_relayer_state.clone(), + }; + let indirect_receive_messages_delivery_proof_call = BridgeMessagesCall::< + AccountId, + TestMessagesProof, + TestMessagesDeliveryProof, + >::receive_messages_delivery_proof { + proof: message_delivery_proof, + relayers_state: unrewarded_relayer_state, + }; + assert_eq!( + direct_receive_messages_delivery_proof_call.encode(), + indirect_receive_messages_delivery_proof_call.encode() + ); + } + + generate_owned_bridge_module_tests!( + MessagesOperatingMode::Basic(BasicOperatingMode::Normal), + MessagesOperatingMode::Basic(BasicOperatingMode::Halted) + ); + + #[test] + fn inbound_storage_extra_proof_size_bytes_works() { + fn relayer_entry() -> UnrewardedRelayer { + UnrewardedRelayer { relayer: 42u64, messages: DeliveredMessages { begin: 0, end: 100 } } + } + + fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage { + RuntimeInboundLaneStorage { + lane_id: Default::default(), + cached_data: Some(InboundLaneData { + relayers: vec![relayer_entry(); relayer_entries].into_iter().collect(), + last_confirmed_nonce: 0, + }), + _phantom: Default::default(), + } + } + + let max_entries = crate::mock::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize; + + // when we have exactly `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers + assert_eq!(storage(max_entries).extra_proof_size_bytes(), 0); + + // when we have less than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers + assert_eq!( + storage(max_entries - 1).extra_proof_size_bytes(), + relayer_entry().encode().len() as u64 + ); + assert_eq!( + storage(max_entries - 2).extra_proof_size_bytes(), + 2 * relayer_entry().encode().len() as u64 + ); + + // when we have more than `MaxUnrewardedRelayerEntriesAtInboundLane` unrewarded relayers + // (shall not happen in practice) + assert_eq!(storage(max_entries + 1).extra_proof_size_bytes(), 0); + } + + #[test] + fn maybe_outbound_lanes_count_returns_correct_value() { + assert_eq!( + MaybeOutboundLanesCount::::get(), + Some(mock::ActiveOutboundLanes::get().len() as u32) + ); + } +} diff --git a/modules/messages/src/mock.rs b/modules/messages/src/mock.rs new file mode 100644 index 000000000000..648acad772d7 --- /dev/null +++ b/modules/messages/src/mock.rs @@ -0,0 +1,485 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +// From construct_runtime macro +#![allow(clippy::from_over_into)] + +use crate::Config; + +use bp_messages::{ + calc_relayers_rewards, + source_chain::{ + DeliveryConfirmationPayments, LaneMessageVerifier, OnMessagesDelivered, TargetHeaderChain, + }, + target_chain::{ + DeliveryPayments, DispatchMessage, DispatchMessageData, MessageDispatch, + ProvedLaneMessages, ProvedMessages, SourceHeaderChain, + }, + DeliveredMessages, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload, + OutboundLaneData, UnrewardedRelayer, UnrewardedRelayersState, VerificationError, +}; +use bp_runtime::{messages::MessageDispatchResult, Size}; +use codec::{Decode, Encode}; +use frame_support::{ + derive_impl, parameter_types, + weights::{constants::RocksDbWeight, Weight}, +}; +use scale_info::TypeInfo; +use sp_runtime::BuildStorage; +use std::{ + collections::{BTreeMap, VecDeque}, + ops::RangeInclusive, +}; + +pub type AccountId = u64; +pub type Balance = u64; +#[derive(Decode, Encode, Clone, Debug, PartialEq, Eq, TypeInfo)] +pub struct TestPayload { + /// Field that may be used to identify messages. + pub id: u64, + /// Reject this message by lane verifier? + pub reject_by_lane_verifier: bool, + /// Dispatch weight that is declared by the message sender. + pub declared_weight: Weight, + /// Message dispatch result. + /// + /// Note: in correct code `dispatch_result.unspent_weight` will always be <= `declared_weight`, + /// but for test purposes we'll be making it larger than `declared_weight` sometimes. + pub dispatch_result: MessageDispatchResult, + /// Extra bytes that affect payload size. + pub extra: Vec, +} +pub type TestMessageFee = u64; +pub type TestRelayer = u64; +pub type TestDispatchLevelResult = (); + +type Block = frame_system::mocking::MockBlock; + +use crate as pallet_bridge_messages; + +frame_support::construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Event}, + Messages: pallet_bridge_messages::{Pallet, Call, Event}, + } +} + +pub type DbWeight = RocksDbWeight; + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; + type AccountData = pallet_balances::AccountData; + type DbWeight = DbWeight; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +impl pallet_balances::Config for TestRuntime { + type ReserveIdentifier = [u8; 8]; + type AccountStore = System; +} + +parameter_types! { + pub const MaxMessagesToPruneAtOnce: u64 = 10; + pub const MaxUnrewardedRelayerEntriesAtInboundLane: u64 = 16; + pub const MaxUnconfirmedMessagesAtInboundLane: u64 = 128; + pub const TestBridgedChainId: bp_runtime::ChainId = *b"test"; + pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID, TEST_LANE_ID_2]; +} + +/// weights of messages pallet calls we use in tests. +pub type TestWeightInfo = (); + +impl Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = TestWeightInfo; + type ActiveOutboundLanes = ActiveOutboundLanes; + type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; + + type MaximalOutboundPayloadSize = frame_support::traits::ConstU32; + type OutboundPayload = TestPayload; + + type InboundPayload = TestPayload; + type InboundRelayer = TestRelayer; + type DeliveryPayments = TestDeliveryPayments; + + type TargetHeaderChain = TestTargetHeaderChain; + type LaneMessageVerifier = TestLaneMessageVerifier; + type DeliveryConfirmationPayments = TestDeliveryConfirmationPayments; + type OnMessagesDelivered = TestOnMessagesDelivered; + + type SourceHeaderChain = TestSourceHeaderChain; + type MessageDispatch = TestMessageDispatch; + type BridgedChainId = TestBridgedChainId; +} + +#[cfg(feature = "runtime-benchmarks")] +impl crate::benchmarking::Config<()> for TestRuntime { + fn bench_lane_id() -> LaneId { + TEST_LANE_ID + } + + fn prepare_message_proof( + params: crate::benchmarking::MessageProofParams, + ) -> (TestMessagesProof, Weight) { + // in mock run we only care about benchmarks correctness, not the benchmark results + // => ignore size related arguments + let (messages, total_dispatch_weight) = + params.message_nonces.into_iter().map(|n| message(n, REGULAR_PAYLOAD)).fold( + (Vec::new(), Weight::zero()), + |(mut messages, total_dispatch_weight), message| { + let weight = REGULAR_PAYLOAD.declared_weight; + messages.push(message); + (messages, total_dispatch_weight.saturating_add(weight)) + }, + ); + let mut proof: TestMessagesProof = Ok(messages).into(); + proof.result.as_mut().unwrap().get_mut(0).unwrap().1.lane_state = params.outbound_lane_data; + (proof, total_dispatch_weight) + } + + fn prepare_message_delivery_proof( + params: crate::benchmarking::MessageDeliveryProofParams, + ) -> TestMessagesDeliveryProof { + // in mock run we only care about benchmarks correctness, not the benchmark results + // => ignore size related arguments + TestMessagesDeliveryProof(Ok((params.lane, params.inbound_lane_data))) + } + + fn is_relayer_rewarded(_relayer: &AccountId) -> bool { + true + } +} + +impl Size for TestPayload { + fn size(&self) -> u32 { + 16 + self.extra.len() as u32 + } +} + +/// Maximal outbound payload size. +pub const MAX_OUTBOUND_PAYLOAD_SIZE: u32 = 4096; + +/// Account that has balance to use in tests. +pub const ENDOWED_ACCOUNT: AccountId = 0xDEAD; + +/// Account id of test relayer. +pub const TEST_RELAYER_A: AccountId = 100; + +/// Account id of additional test relayer - B. +pub const TEST_RELAYER_B: AccountId = 101; + +/// Account id of additional test relayer - C. +pub const TEST_RELAYER_C: AccountId = 102; + +/// Error that is returned by all test implementations. +pub const TEST_ERROR: &str = "Test error"; + +/// Lane that we're using in tests. +pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 1]); + +/// Secondary lane that we're using in tests. +pub const TEST_LANE_ID_2: LaneId = LaneId([0, 0, 0, 2]); + +/// Inactive outbound lane. +pub const TEST_LANE_ID_3: LaneId = LaneId([0, 0, 0, 3]); + +/// Regular message payload. +pub const REGULAR_PAYLOAD: TestPayload = message_payload(0, 50); + +/// Payload that is rejected by `TestTargetHeaderChain`. +pub const PAYLOAD_REJECTED_BY_TARGET_CHAIN: TestPayload = message_payload(1, 50); + +/// Vec of proved messages, grouped by lane. +pub type MessagesByLaneVec = Vec<(LaneId, ProvedLaneMessages)>; + +/// Test messages proof. +#[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] +pub struct TestMessagesProof { + pub result: Result, +} + +impl Size for TestMessagesProof { + fn size(&self) -> u32 { + 0 + } +} + +impl From, ()>> for TestMessagesProof { + fn from(result: Result, ()>) -> Self { + Self { + result: result.map(|messages| { + let mut messages_by_lane: BTreeMap> = + BTreeMap::new(); + for message in messages { + messages_by_lane.entry(message.key.lane_id).or_default().messages.push(message); + } + messages_by_lane.into_iter().collect() + }), + } + } +} + +/// Messages delivery proof used in tests. +#[derive(Debug, Encode, Decode, Eq, Clone, PartialEq, TypeInfo)] +pub struct TestMessagesDeliveryProof(pub Result<(LaneId, InboundLaneData), ()>); + +impl Size for TestMessagesDeliveryProof { + fn size(&self) -> u32 { + 0 + } +} + +/// Target header chain that is used in tests. +#[derive(Debug, Default)] +pub struct TestTargetHeaderChain; + +impl TargetHeaderChain for TestTargetHeaderChain { + type MessagesDeliveryProof = TestMessagesDeliveryProof; + + fn verify_message(payload: &TestPayload) -> Result<(), VerificationError> { + if *payload == PAYLOAD_REJECTED_BY_TARGET_CHAIN { + Err(VerificationError::Other(TEST_ERROR)) + } else { + Ok(()) + } + } + + fn verify_messages_delivery_proof( + proof: Self::MessagesDeliveryProof, + ) -> Result<(LaneId, InboundLaneData), VerificationError> { + proof.0.map_err(|_| VerificationError::Other(TEST_ERROR)) + } +} + +/// Lane message verifier that is used in tests. +#[derive(Debug, Default)] +pub struct TestLaneMessageVerifier; + +impl LaneMessageVerifier for TestLaneMessageVerifier { + fn verify_message( + _lane: &LaneId, + _lane_outbound_data: &OutboundLaneData, + payload: &TestPayload, + ) -> Result<(), VerificationError> { + if !payload.reject_by_lane_verifier { + Ok(()) + } else { + Err(VerificationError::Other(TEST_ERROR)) + } + } +} + +/// Reward payments at the target chain during delivery transaction. +#[derive(Debug, Default)] +pub struct TestDeliveryPayments; + +impl TestDeliveryPayments { + /// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is + /// cleared after the call. + pub fn is_reward_paid(relayer: AccountId) -> bool { + let key = (b":delivery-relayer-reward:", relayer).encode(); + frame_support::storage::unhashed::take::(&key).is_some() + } +} + +impl DeliveryPayments for TestDeliveryPayments { + type Error = &'static str; + + fn pay_reward( + relayer: AccountId, + _total_messages: MessageNonce, + _valid_messages: MessageNonce, + _actual_weight: Weight, + ) { + let key = (b":delivery-relayer-reward:", relayer).encode(); + frame_support::storage::unhashed::put(&key, &true); + } +} + +/// Reward payments at the source chain during delivery confirmation transaction. +#[derive(Debug, Default)] +pub struct TestDeliveryConfirmationPayments; + +impl TestDeliveryConfirmationPayments { + /// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is + /// cleared after the call. + pub fn is_reward_paid(relayer: AccountId, fee: TestMessageFee) -> bool { + let key = (b":relayer-reward:", relayer, fee).encode(); + frame_support::storage::unhashed::take::(&key).is_some() + } +} + +impl DeliveryConfirmationPayments for TestDeliveryConfirmationPayments { + type Error = &'static str; + + fn pay_reward( + _lane_id: LaneId, + messages_relayers: VecDeque>, + _confirmation_relayer: &AccountId, + received_range: &RangeInclusive, + ) -> MessageNonce { + let relayers_rewards = calc_relayers_rewards(messages_relayers, received_range); + let rewarded_relayers = relayers_rewards.len(); + for (relayer, reward) in &relayers_rewards { + let key = (b":relayer-reward:", relayer, reward).encode(); + frame_support::storage::unhashed::put(&key, &true); + } + + rewarded_relayers as _ + } +} + +/// Source header chain that is used in tests. +#[derive(Debug)] +pub struct TestSourceHeaderChain; + +impl SourceHeaderChain for TestSourceHeaderChain { + type MessagesProof = TestMessagesProof; + + fn verify_messages_proof( + proof: Self::MessagesProof, + _messages_count: u32, + ) -> Result, VerificationError> { + proof + .result + .map(|proof| proof.into_iter().collect()) + .map_err(|_| VerificationError::Other(TEST_ERROR)) + } +} + +/// Test message dispatcher. +#[derive(Debug)] +pub struct TestMessageDispatch; + +impl TestMessageDispatch { + pub fn deactivate() { + frame_support::storage::unhashed::put(b"TestMessageDispatch.IsCongested", &true) + } +} + +impl MessageDispatch for TestMessageDispatch { + type DispatchPayload = TestPayload; + type DispatchLevelResult = TestDispatchLevelResult; + + fn is_active() -> bool { + !frame_support::storage::unhashed::get_or_default::( + b"TestMessageDispatch.IsCongested", + ) + } + + fn dispatch_weight(message: &mut DispatchMessage) -> Weight { + match message.data.payload.as_ref() { + Ok(payload) => payload.declared_weight, + Err(_) => Weight::zero(), + } + } + + fn dispatch( + message: DispatchMessage, + ) -> MessageDispatchResult { + match message.data.payload.as_ref() { + Ok(payload) => payload.dispatch_result.clone(), + Err(_) => dispatch_result(0), + } + } +} + +/// Test callback, called during message delivery confirmation transaction. +pub struct TestOnMessagesDelivered; + +impl TestOnMessagesDelivered { + pub fn call_arguments() -> Option<(LaneId, MessageNonce)> { + frame_support::storage::unhashed::get(b"TestOnMessagesDelivered.OnMessagesDelivered") + } +} + +impl OnMessagesDelivered for TestOnMessagesDelivered { + fn on_messages_delivered(lane: LaneId, enqueued_messages: MessageNonce) { + frame_support::storage::unhashed::put( + b"TestOnMessagesDelivered.OnMessagesDelivered", + &(lane, enqueued_messages), + ); + } +} + +/// Return test lane message with given nonce and payload. +pub fn message(nonce: MessageNonce, payload: TestPayload) -> Message { + Message { key: MessageKey { lane_id: TEST_LANE_ID, nonce }, payload: payload.encode() } +} + +/// Return valid outbound message data, constructed from given payload. +pub fn outbound_message_data(payload: TestPayload) -> MessagePayload { + payload.encode() +} + +/// Return valid inbound (dispatch) message data, constructed from given payload. +pub fn inbound_message_data(payload: TestPayload) -> DispatchMessageData { + DispatchMessageData { payload: Ok(payload) } +} + +/// Constructs message payload using given arguments and zero unspent weight. +pub const fn message_payload(id: u64, declared_weight: u64) -> TestPayload { + TestPayload { + id, + reject_by_lane_verifier: false, + declared_weight: Weight::from_parts(declared_weight, 0), + dispatch_result: dispatch_result(0), + extra: Vec::new(), + } +} + +/// Returns message dispatch result with given unspent weight. +pub const fn dispatch_result( + unspent_weight: u64, +) -> MessageDispatchResult { + MessageDispatchResult { + unspent_weight: Weight::from_parts(unspent_weight, 0), + dispatch_level_result: (), + } +} + +/// Constructs unrewarded relayer entry from nonces range and relayer id. +pub fn unrewarded_relayer( + begin: MessageNonce, + end: MessageNonce, + relayer: TestRelayer, +) -> UnrewardedRelayer { + UnrewardedRelayer { relayer, messages: DeliveredMessages { begin, end } } +} + +/// Returns unrewarded relayers state at given lane. +pub fn inbound_unrewarded_relayers_state(lane: bp_messages::LaneId) -> UnrewardedRelayersState { + let inbound_lane_data = crate::InboundLanes::::get(lane).0; + UnrewardedRelayersState::from(&inbound_lane_data) +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + pallet_balances::GenesisConfig:: { balances: vec![(ENDOWED_ACCOUNT, 1_000_000)] } + .assimilate_storage(&mut t) + .unwrap(); + sp_io::TestExternalities::new(t) +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(test) +} diff --git a/cumulus/bridges/modules/messages/src/outbound_lane.rs b/modules/messages/src/outbound_lane.rs similarity index 99% rename from cumulus/bridges/modules/messages/src/outbound_lane.rs rename to modules/messages/src/outbound_lane.rs index 0cf0c4ccb425..f92e9ccfd95c 100644 --- a/cumulus/bridges/modules/messages/src/outbound_lane.rs +++ b/modules/messages/src/outbound_lane.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -25,10 +25,11 @@ use bp_messages::{ use codec::{Decode, Encode}; use frame_support::{ weights::{RuntimeDbWeight, Weight}, - BoundedVec, PalletError, RuntimeDebug, + BoundedVec, PalletError, }; use num_traits::Zero; use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; use sp_std::collections::vec_deque::VecDeque; /// Outbound lane storage. diff --git a/modules/messages/src/weights.rs b/modules/messages/src/weights.rs new file mode 100644 index 000000000000..5bf7d5675607 --- /dev/null +++ b/modules/messages/src/weights.rs @@ -0,0 +1,525 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_bridge_messages +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/unknown-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bridge_messages +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/messages/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_messages. +pub trait WeightInfo { + fn receive_single_message_proof() -> Weight; + fn receive_two_messages_proof() -> Weight; + fn receive_single_message_proof_with_outbound_lane_state() -> Weight; + fn receive_single_message_proof_1_kb() -> Weight; + fn receive_single_message_proof_16_kb() -> Weight; + fn receive_delivery_proof_for_single_message() -> Weight; + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight; + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight; + fn receive_single_message_proof_with_dispatch(i: u32) -> Weight; +} + +/// Weights for `pallet_bridge_messages` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_321 nanoseconds. + Weight::from_parts(54_478_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_597 nanoseconds. + Weight::from_parts(69_267_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_079 nanoseconds. + Weight::from_parts(65_905_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 50_588 nanoseconds. + Weight::from_parts(53_544_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 78_269 nanoseconds. + Weight::from_parts(81_748_000, 57170) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `579` + // Estimated: `9584` + // Minimum execution time: 45_786 nanoseconds. + Weight::from_parts(47_382_000, 9584) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `9584` + // Minimum execution time: 44_544 nanoseconds. + Weight::from_parts(45_451_000, 9584) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `12124` + // Minimum execution time: 47_344 nanoseconds. + Weight::from_parts(48_311_000, 12124) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + /// + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_385 nanoseconds. + Weight::from_parts(54_919_468, 57170) + // Standard Error: 108 + .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_321 nanoseconds. + Weight::from_parts(54_478_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_597 nanoseconds. + Weight::from_parts(69_267_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 64_079 nanoseconds. + Weight::from_parts(65_905_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 50_588 nanoseconds. + Weight::from_parts(53_544_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 78_269 nanoseconds. + Weight::from_parts(81_748_000, 57170) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `579` + // Estimated: `9584` + // Minimum execution time: 45_786 nanoseconds. + Weight::from_parts(47_382_000, 9584) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `9584` + // Minimum execution time: 44_544 nanoseconds. + Weight::from_parts(45_451_000, 9584) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages OutboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages OutboundLanes (max_values: Some(1), max_size: Some(44), added: + /// 539, mode: MaxEncodedLen) + /// + /// Storage: BridgeRelayers RelayerRewards (r:2 w:2) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `596` + // Estimated: `12124` + // Minimum execution time: 47_344 nanoseconds. + Weight::from_parts(48_311_000, 12124) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeUnknownMessages PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownMessages PalletOperatingMode (max_values: Some(1), max_size: Some(2), + /// added: 497, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownMessages InboundLanes (r:1 w:1) + /// + /// Proof: BridgeUnknownMessages InboundLanes (max_values: None, max_size: Some(49180), added: + /// 51655, mode: MaxEncodedLen) + /// + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `618` + // Estimated: `57170` + // Minimum execution time: 52_385 nanoseconds. + Weight::from_parts(54_919_468, 57170) + // Standard Error: 108 + .saturating_add(Weight::from_parts(3_286, 0).saturating_mul(i.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/modules/messages/src/weights_ext.rs b/modules/messages/src/weights_ext.rs new file mode 100644 index 000000000000..c12e04f692bf --- /dev/null +++ b/modules/messages/src/weights_ext.rs @@ -0,0 +1,488 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Weight-related utilities. + +use crate::weights::WeightInfo; + +use bp_messages::{MessageNonce, UnrewardedRelayersState}; +use bp_runtime::{PreComputedSize, Size}; +use frame_support::weights::Weight; + +/// Size of the message being delivered in benchmarks. +pub const EXPECTED_DEFAULT_MESSAGE_LENGTH: u32 = 128; + +/// We assume that size of signed extensions on all our chains and size of all 'small' arguments of +/// calls we're checking here would fit 1KB. +const SIGNED_EXTENSIONS_SIZE: u32 = 1024; + +/// Number of extra bytes (excluding size of storage value itself) of storage proof. +/// This mostly depends on number of entries (and their density) in the storage trie. +/// Some reserve is reserved to account future chain growth. +pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; + +/// Ensure that weights from `WeightInfoExt` implementation are looking correct. +pub fn ensure_weights_are_correct() { + // all components of weight formulae must have zero `proof_size`, because the `proof_size` is + // benchmarked using `MaxEncodedLen` approach and there are no components that cause additional + // db reads + + // verify `receive_messages_proof` weight components + assert_ne!(W::receive_messages_proof_overhead().ref_time(), 0); + assert_ne!(W::receive_messages_proof_overhead().proof_size(), 0); + // W::receive_messages_proof_messages_overhead(1).ref_time() may be zero because: + // the message processing code (`InboundLane::receive_message`) is minimal and may not be + // accounted by our benchmarks + assert_eq!(W::receive_messages_proof_messages_overhead(1).proof_size(), 0); + // W::receive_messages_proof_outbound_lane_state_overhead().ref_time() may be zero because: + // the outbound lane state processing code (`InboundLane::receive_state_update`) is minimal and + // may not be accounted by our benchmarks + assert_eq!(W::receive_messages_proof_outbound_lane_state_overhead().proof_size(), 0); + assert_ne!(W::storage_proof_size_overhead(1).ref_time(), 0); + assert_eq!(W::storage_proof_size_overhead(1).proof_size(), 0); + + // verify `receive_messages_delivery_proof` weight components + assert_ne!(W::receive_messages_delivery_proof_overhead().ref_time(), 0); + assert_ne!(W::receive_messages_delivery_proof_overhead().proof_size(), 0); + // W::receive_messages_delivery_proof_messages_overhead(1).ref_time() may be zero because: + // there's no code that iterates over confirmed messages in confirmation transaction + assert_eq!(W::receive_messages_delivery_proof_messages_overhead(1).proof_size(), 0); + // W::receive_messages_delivery_proof_relayers_overhead(1).ref_time() may be zero because: + // runtime **can** choose not to pay any rewards to relayers + // W::receive_messages_delivery_proof_relayers_overhead(1).proof_size() is an exception + // it may or may not cause additional db reads, so proof size may vary + assert_ne!(W::storage_proof_size_overhead(1).ref_time(), 0); + assert_eq!(W::storage_proof_size_overhead(1).proof_size(), 0); + + // verify `receive_message_proof` weight + let receive_messages_proof_weight = + W::receive_messages_proof_weight(&PreComputedSize(1), 10, Weight::zero()); + assert_ne!(receive_messages_proof_weight.ref_time(), 0); + assert_ne!(receive_messages_proof_weight.proof_size(), 0); + messages_proof_size_does_not_affect_proof_size::(); + messages_count_does_not_affect_proof_size::(); + + // verify `receive_message_proof` weight + let receive_messages_delivery_proof_weight = W::receive_messages_delivery_proof_weight( + &PreComputedSize(1), + &UnrewardedRelayersState::default(), + ); + assert_ne!(receive_messages_delivery_proof_weight.ref_time(), 0); + assert_ne!(receive_messages_delivery_proof_weight.proof_size(), 0); + messages_delivery_proof_size_does_not_affect_proof_size::(); + total_messages_in_delivery_proof_does_not_affect_proof_size::(); +} + +/// Ensure that we're able to receive maximal (by-size and by-weight) message from other chain. +pub fn ensure_able_to_receive_message( + max_extrinsic_size: u32, + max_extrinsic_weight: Weight, + max_incoming_message_proof_size: u32, + max_incoming_message_dispatch_weight: Weight, +) { + // verify that we're able to receive proof of maximal-size message + let max_delivery_transaction_size = + max_incoming_message_proof_size.saturating_add(SIGNED_EXTENSIONS_SIZE); + assert!( + max_delivery_transaction_size <= max_extrinsic_size, + "Size of maximal message delivery transaction {max_incoming_message_proof_size} + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", + ); + + // verify that we're able to receive proof of maximal-size message with maximal dispatch weight + let max_delivery_transaction_dispatch_weight = W::receive_messages_proof_weight( + &PreComputedSize( + (max_incoming_message_proof_size + W::expected_extra_storage_proof_size()) as usize, + ), + 1, + max_incoming_message_dispatch_weight, + ); + assert!( + max_delivery_transaction_dispatch_weight.all_lte(max_extrinsic_weight), + "Weight of maximal message delivery transaction + {max_delivery_transaction_dispatch_weight} is larger than maximal possible transaction weight {max_extrinsic_weight}", + ); +} + +/// Ensure that we're able to receive maximal confirmation from other chain. +pub fn ensure_able_to_receive_confirmation( + max_extrinsic_size: u32, + max_extrinsic_weight: Weight, + max_inbound_lane_data_proof_size_from_peer_chain: u32, + max_unrewarded_relayer_entries_at_peer_inbound_lane: MessageNonce, + max_unconfirmed_messages_at_inbound_lane: MessageNonce, +) { + // verify that we're able to receive confirmation of maximal-size + let max_confirmation_transaction_size = + max_inbound_lane_data_proof_size_from_peer_chain.saturating_add(SIGNED_EXTENSIONS_SIZE); + assert!( + max_confirmation_transaction_size <= max_extrinsic_size, + "Size of maximal message delivery confirmation transaction {max_inbound_lane_data_proof_size_from_peer_chain} + {SIGNED_EXTENSIONS_SIZE} is larger than maximal possible transaction size {max_extrinsic_size}", + ); + + // verify that we're able to reward maximal number of relayers that have delivered maximal + // number of messages + let max_confirmation_transaction_dispatch_weight = W::receive_messages_delivery_proof_weight( + &PreComputedSize(max_inbound_lane_data_proof_size_from_peer_chain as usize), + &UnrewardedRelayersState { + unrewarded_relayer_entries: max_unrewarded_relayer_entries_at_peer_inbound_lane, + total_messages: max_unconfirmed_messages_at_inbound_lane, + ..Default::default() + }, + ); + assert!( + max_confirmation_transaction_dispatch_weight.all_lte(max_extrinsic_weight), + "Weight of maximal confirmation transaction {max_confirmation_transaction_dispatch_weight} is larger than maximal possible transaction weight {max_extrinsic_weight}", + ); +} + +/// Panics if `proof_size` of message delivery call depends on the message proof size. +fn messages_proof_size_does_not_affect_proof_size() { + let dispatch_weight = Weight::zero(); + let weight_when_proof_size_is_8k = + W::receive_messages_proof_weight(&PreComputedSize(8 * 1024), 1, dispatch_weight); + let weight_when_proof_size_is_16k = + W::receive_messages_proof_weight(&PreComputedSize(16 * 1024), 1, dispatch_weight); + + ensure_weight_components_are_not_zero(weight_when_proof_size_is_8k); + ensure_weight_components_are_not_zero(weight_when_proof_size_is_16k); + ensure_proof_size_is_the_same( + weight_when_proof_size_is_8k, + weight_when_proof_size_is_16k, + "Messages proof size does not affect values that we read from our storage", + ); +} + +/// Panics if `proof_size` of message delivery call depends on the messages count. +/// +/// In practice, it will depend on the messages count, because most probably every +/// message will read something from db during dispatch. But this must be accounted +/// by the `dispatch_weight`. +fn messages_count_does_not_affect_proof_size() { + let messages_proof_size = PreComputedSize(8 * 1024); + let dispatch_weight = Weight::zero(); + let weight_of_one_incoming_message = + W::receive_messages_proof_weight(&messages_proof_size, 1, dispatch_weight); + let weight_of_two_incoming_messages = + W::receive_messages_proof_weight(&messages_proof_size, 2, dispatch_weight); + + ensure_weight_components_are_not_zero(weight_of_one_incoming_message); + ensure_weight_components_are_not_zero(weight_of_two_incoming_messages); + ensure_proof_size_is_the_same( + weight_of_one_incoming_message, + weight_of_two_incoming_messages, + "Number of same-lane incoming messages does not affect values that we read from our storage", + ); +} + +/// Panics if `proof_size` of delivery confirmation call depends on the delivery proof size. +fn messages_delivery_proof_size_does_not_affect_proof_size() { + let relayers_state = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1, + last_delivered_nonce: 1, + }; + let weight_when_proof_size_is_8k = + W::receive_messages_delivery_proof_weight(&PreComputedSize(8 * 1024), &relayers_state); + let weight_when_proof_size_is_16k = + W::receive_messages_delivery_proof_weight(&PreComputedSize(16 * 1024), &relayers_state); + + ensure_weight_components_are_not_zero(weight_when_proof_size_is_8k); + ensure_weight_components_are_not_zero(weight_when_proof_size_is_16k); + ensure_proof_size_is_the_same( + weight_when_proof_size_is_8k, + weight_when_proof_size_is_16k, + "Messages delivery proof size does not affect values that we read from our storage", + ); +} + +/// Panics if `proof_size` of delivery confirmation call depends on the number of confirmed +/// messages. +fn total_messages_in_delivery_proof_does_not_affect_proof_size() { + let proof_size = PreComputedSize(8 * 1024); + let weight_when_1k_messages_confirmed = W::receive_messages_delivery_proof_weight( + &proof_size, + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 1024, + last_delivered_nonce: 1, + }, + ); + let weight_when_2k_messages_confirmed = W::receive_messages_delivery_proof_weight( + &proof_size, + &UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 1, + total_messages: 2048, + last_delivered_nonce: 1, + }, + ); + + ensure_weight_components_are_not_zero(weight_when_1k_messages_confirmed); + ensure_weight_components_are_not_zero(weight_when_2k_messages_confirmed); + ensure_proof_size_is_the_same( + weight_when_1k_messages_confirmed, + weight_when_2k_messages_confirmed, + "More messages in delivery proof does not affect values that we read from our storage", + ); +} + +/// Panics if either Weight' `proof_size` or `ref_time` are zero. +fn ensure_weight_components_are_not_zero(weight: Weight) { + assert_ne!(weight.ref_time(), 0); + assert_ne!(weight.proof_size(), 0); +} + +/// Panics if `proof_size` of `weight1` is not equal to `proof_size` of `weight2`. +fn ensure_proof_size_is_the_same(weight1: Weight, weight2: Weight, msg: &str) { + assert_eq!( + weight1.proof_size(), + weight2.proof_size(), + "{msg}: {} must be equal to {}", + weight1.proof_size(), + weight2.proof_size(), + ); +} + +/// Extended weight info. +pub trait WeightInfoExt: WeightInfo { + /// Size of proof that is already included in the single message delivery weight. + /// + /// The message submitter (at source chain) has already covered this cost. But there are two + /// factors that may increase proof size: (1) the message size may be larger than predefined + /// and (2) relayer may add extra trie nodes to the proof. So if proof size is larger than + /// this value, we're going to charge relayer for that. + fn expected_extra_storage_proof_size() -> u32; + + // Our configuration assumes that the runtime has special signed extensions used to: + // + // 1) reject obsolete delivery and confirmation transactions; + // + // 2) refund transaction cost to relayer and register his rewards. + // + // The checks in (1) are trivial, so its computation weight may be ignored. And we only touch + // storage values that are read during the call. So we may ignore the weight of this check. + // + // However, during (2) we read and update storage values of other pallets + // (`pallet-bridge-relayers` and balances/assets pallet). So we need to add this weight to the + // weight of our call. Hence two following methods. + + /// Extra weight that is added to the `receive_messages_proof` call weight by signed extensions + /// that are declared at runtime level. + fn receive_messages_proof_overhead_from_runtime() -> Weight; + + /// Extra weight that is added to the `receive_messages_delivery_proof` call weight by signed + /// extensions that are declared at runtime level. + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight; + + // Functions that are directly mapped to extrinsics weights. + + /// Weight of message delivery extrinsic. + fn receive_messages_proof_weight( + proof: &impl Size, + messages_count: u32, + dispatch_weight: Weight, + ) -> Weight { + // basic components of extrinsic weight + let transaction_overhead = Self::receive_messages_proof_overhead(); + let transaction_overhead_from_runtime = + Self::receive_messages_proof_overhead_from_runtime(); + let outbound_state_delivery_weight = + Self::receive_messages_proof_outbound_lane_state_overhead(); + let messages_delivery_weight = + Self::receive_messages_proof_messages_overhead(MessageNonce::from(messages_count)); + let messages_dispatch_weight = dispatch_weight; + + // proof size overhead weight + let expected_proof_size = EXPECTED_DEFAULT_MESSAGE_LENGTH + .saturating_mul(messages_count.saturating_sub(1)) + .saturating_add(Self::expected_extra_storage_proof_size()); + let actual_proof_size = proof.size(); + let proof_size_overhead = Self::storage_proof_size_overhead( + actual_proof_size.saturating_sub(expected_proof_size), + ); + + transaction_overhead + .saturating_add(transaction_overhead_from_runtime) + .saturating_add(outbound_state_delivery_weight) + .saturating_add(messages_delivery_weight) + .saturating_add(messages_dispatch_weight) + .saturating_add(proof_size_overhead) + } + + /// Weight of confirmation delivery extrinsic. + fn receive_messages_delivery_proof_weight( + proof: &impl Size, + relayers_state: &UnrewardedRelayersState, + ) -> Weight { + // basic components of extrinsic weight + let transaction_overhead = Self::receive_messages_delivery_proof_overhead(); + let transaction_overhead_from_runtime = + Self::receive_messages_delivery_proof_overhead_from_runtime(); + let messages_overhead = + Self::receive_messages_delivery_proof_messages_overhead(relayers_state.total_messages); + let relayers_overhead = Self::receive_messages_delivery_proof_relayers_overhead( + relayers_state.unrewarded_relayer_entries, + ); + + // proof size overhead weight + let expected_proof_size = Self::expected_extra_storage_proof_size(); + let actual_proof_size = proof.size(); + let proof_size_overhead = Self::storage_proof_size_overhead( + actual_proof_size.saturating_sub(expected_proof_size), + ); + + transaction_overhead + .saturating_add(transaction_overhead_from_runtime) + .saturating_add(messages_overhead) + .saturating_add(relayers_overhead) + .saturating_add(proof_size_overhead) + } + + // Functions that are used by extrinsics weights formulas. + + /// Returns weight overhead of message delivery transaction (`receive_messages_proof`). + fn receive_messages_proof_overhead() -> Weight { + let weight_of_two_messages_and_two_tx_overheads = + Self::receive_single_message_proof().saturating_mul(2); + let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); + weight_of_two_messages_and_two_tx_overheads + .saturating_sub(weight_of_two_messages_and_single_tx_overhead) + } + + /// Returns weight that needs to be accounted when receiving given a number of messages with + /// message delivery transaction (`receive_messages_proof`). + fn receive_messages_proof_messages_overhead(messages: MessageNonce) -> Weight { + let weight_of_two_messages_and_single_tx_overhead = Self::receive_two_messages_proof(); + let weight_of_single_message_and_single_tx_overhead = Self::receive_single_message_proof(); + weight_of_two_messages_and_single_tx_overhead + .saturating_sub(weight_of_single_message_and_single_tx_overhead) + .saturating_mul(messages as _) + } + + /// Returns weight that needs to be accounted when message delivery transaction + /// (`receive_messages_proof`) is carrying outbound lane state proof. + fn receive_messages_proof_outbound_lane_state_overhead() -> Weight { + let weight_of_single_message_and_lane_state = + Self::receive_single_message_proof_with_outbound_lane_state(); + let weight_of_single_message = Self::receive_single_message_proof(); + weight_of_single_message_and_lane_state.saturating_sub(weight_of_single_message) + } + + /// Returns weight overhead of delivery confirmation transaction + /// (`receive_messages_delivery_proof`). + fn receive_messages_delivery_proof_overhead() -> Weight { + let weight_of_two_messages_and_two_tx_overheads = + Self::receive_delivery_proof_for_single_message().saturating_mul(2); + let weight_of_two_messages_and_single_tx_overhead = + Self::receive_delivery_proof_for_two_messages_by_single_relayer(); + weight_of_two_messages_and_two_tx_overheads + .saturating_sub(weight_of_two_messages_and_single_tx_overhead) + } + + /// Returns weight that needs to be accounted when receiving confirmations for given a number of + /// messages with delivery confirmation transaction (`receive_messages_delivery_proof`). + fn receive_messages_delivery_proof_messages_overhead(messages: MessageNonce) -> Weight { + let weight_of_two_messages = + Self::receive_delivery_proof_for_two_messages_by_single_relayer(); + let weight_of_single_message = Self::receive_delivery_proof_for_single_message(); + weight_of_two_messages + .saturating_sub(weight_of_single_message) + .saturating_mul(messages as _) + } + + /// Returns weight that needs to be accounted when receiving confirmations for given a number of + /// relayers entries with delivery confirmation transaction (`receive_messages_delivery_proof`). + fn receive_messages_delivery_proof_relayers_overhead(relayers: MessageNonce) -> Weight { + let weight_of_two_messages_by_two_relayers = + Self::receive_delivery_proof_for_two_messages_by_two_relayers(); + let weight_of_two_messages_by_single_relayer = + Self::receive_delivery_proof_for_two_messages_by_single_relayer(); + weight_of_two_messages_by_two_relayers + .saturating_sub(weight_of_two_messages_by_single_relayer) + .saturating_mul(relayers as _) + } + + /// Returns weight that needs to be accounted when storage proof of given size is received + /// (either in `receive_messages_proof` or `receive_messages_delivery_proof`). + /// + /// **IMPORTANT**: this overhead is already included in the 'base' transaction cost - e.g. proof + /// size depends on messages count or number of entries in the unrewarded relayers set. So this + /// shouldn't be added to cost of transaction, but instead should act as a minimal cost that the + /// relayer must pay when it relays proof of given size (even if cost based on other parameters + /// is less than that cost). + fn storage_proof_size_overhead(proof_size: u32) -> Weight { + let proof_size_in_bytes = proof_size; + let byte_weight = (Self::receive_single_message_proof_16_kb() - + Self::receive_single_message_proof_1_kb()) / + (15 * 1024); + proof_size_in_bytes * byte_weight + } + + // Functions that may be used by runtime developers. + + /// Returns dispatch weight of message of given size. + /// + /// This function would return correct value only if your runtime is configured to run + /// `receive_single_message_proof_with_dispatch` benchmark. See its requirements for + /// details. + fn message_dispatch_weight(message_size: u32) -> Weight { + // There may be a tiny overweight/underweight here, because we don't account how message + // size affects all steps before dispatch. But the effect should be small enough and we + // may ignore it. + Self::receive_single_message_proof_with_dispatch(message_size) + .saturating_sub(Self::receive_single_message_proof()) + } +} + +impl WeightInfoExt for () { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } +} + +impl WeightInfoExt for crate::weights::BridgeWeight { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{mock::TestRuntime, weights::BridgeWeight}; + + #[test] + fn ensure_default_weights_are_correct() { + ensure_weights_are_correct::>(); + } +} diff --git a/modules/parachains/Cargo.toml b/modules/parachains/Cargo.toml new file mode 100644 index 000000000000..f8160e3c6c89 --- /dev/null +++ b/modules/parachains/Cargo.toml @@ -0,0 +1,67 @@ +[package] +name = "pallet-bridge-parachains" +version = "0.1.0" +description = "Module that allows bridged relay chains to exchange information on their parachains' heads." +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Bridge Dependencies + +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-parachains = { path = "../../primitives/parachains", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +pallet-bridge-grandpa = { path = "../grandpa", default-features = false } + +# Substrate Dependencies + +frame-benchmarking = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +bp-header-chain = { path = "../../primitives/header-chain" } +bp-test-utils = { path = "../../primitives/test-utils" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-parachains/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "codec/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "log/std", + "pallet-bridge-grandpa/std", + "scale-info/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-bridge-grandpa/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-bridge-grandpa/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/modules/parachains/README.md b/modules/parachains/README.md new file mode 100644 index 000000000000..9ca608038344 --- /dev/null +++ b/modules/parachains/README.md @@ -0,0 +1,90 @@ +# Bridge Parachains Pallet + +The bridge parachains pallet is a light client for one or several parachains of the bridged relay chain. +It serves as a source of finalized parachain headers and is used when you need to build a bridge with +a parachain. + +The pallet requires [bridge GRANDPA pallet](../grandpa/) to be deployed at the same chain - it is used +to verify storage proofs, generated at the bridged relay chain. + +## A Brief Introduction into Parachains Finality + +You can find detailed information on parachains finality in the +[Polkadot-SDK](https://github.com/paritytech/polkadot-sdk) repository. This section gives a brief overview of how the +parachain finality works and how to build a light client for a parachain. + +The main thing there is that the parachain generates blocks on its own, but it can't achieve finality without +help of its relay chain. Instead, the parachain collators create a block and hand it over to the relay chain +validators. Validators validate the block and register the new parachain head in the +[`Heads` map](https://github.com/paritytech/polkadot-sdk/blob/bc5005217a8c2e7c95b9011c96d7e619879b1200/polkadot/runtime/parachains/src/paras/mod.rs#L683-L686) +of the [`paras`](https://github.com/paritytech/polkadot-sdk/tree/master/polkadot/runtime/parachains/src/paras) pallet, +deployed at the relay chain. Keep in mind that this pallet, deployed at a relay chain, is **NOT** a bridge pallet, +even though the names are similar. + +And what the bridge parachains pallet does, is simply verifying storage proofs of parachain heads within that +`Heads` map. It does that using relay chain header, that has been previously imported by the +[bridge GRANDPA pallet](../grandpa/). Once the proof is verified, the pallet knows that the given parachain +header has been finalized by the relay chain. The parachain header fields may then be used to verify storage +proofs, coming from the parachain. This allows the pallet to be used e.g. as a source of finality for the messages +pallet. + +## Pallet Operations + +The main entrypoint of the pallet is the `submit_parachain_heads` call. It has three arguments: + +- storage proof of parachain heads from the `Heads` map; + +- parachain identifiers and hashes of their heads from the storage proof; + +- the relay block, at which the storage proof has been generated. + +The pallet may track multiple parachains. And the parachains may use different primitives - one may use 128-bit block +numbers, other - 32-bit. To avoid extra decode operations, the pallet is using relay chain block number to order +parachain headers. Any finalized descendant of finalized relay block `RB`, which has parachain block `PB` in +its `Heads` map, is guaranteed to have either `PB`, or its descendant. So parachain block number grows with relay +block number. + +The pallet may reject parachain head if it already knows better (or the same) head. In addition, pallet rejects +heads of untracked parachains. + +The pallet doesn't track anything behind parachain heads. So it requires no initialization - it is ready to accept +headers right after deployment. + +## Non-Essential Functionality + +There may be a special account in every runtime where the bridge parachains module is deployed. This +account, named 'module owner', is like a module-level sudo account - he's able to halt and +resume all module operations without requiring runtime upgrade. Calls that are related to this +account are: + +- `fn set_owner()`: current module owner may call it to transfer "ownership" to another account; + +- `fn set_operating_mode()`: the module owner (or sudo account) may call this function to stop all + module operations. After this call, all finality proofs will be rejected until further `set_operating_mode` call'. + This call may be used when something extraordinary happens with the bridge. + +If pallet owner is not defined, the governance may be used to make those calls. + +## Signed Extension to Reject Obsolete Headers + +It'd be better for anyone (for chain and for submitters) to reject all transactions that are submitting +already known parachain heads to the pallet. This way, we leave block space to other useful transactions and +we don't charge concurrent submitters for their honest actions. + +To deal with that, we have a [signed extension](./src/call_ext) that may be added to the runtime. +It does exactly what is required - rejects all transactions with already known heads. The submitter +pays nothing for such transactions - they're simply removed from the transaction pool, when the block +is built. + +The signed extension, however, is a bit limited - it only works with transactions that provide single +parachain head. So it won't work with multiple parachain heads transactions. This fits our needs +for [Kusama <> Polkadot bridge](../../docs/polkadot-kusama-bridge-overview.md). If you need to deal +with other transaction formats, you may implement similar extension for your runtime. + +You may also take a look at the [`generate_bridge_reject_obsolete_headers_and_messages`](../../bin/runtime-common/src/lib.rs) +macro that bundles several similar signed extensions in a single one. + +## Parachains Finality Relay + +We have an offchain actor, who is watching for new parachain heads and submits them to the bridged chain. +It is the parachains relay - you may look at the [crate level documentation and the code](../../relays/parachains/). diff --git a/modules/parachains/src/benchmarking.rs b/modules/parachains/src/benchmarking.rs new file mode 100644 index 000000000000..27e06a12a1d9 --- /dev/null +++ b/modules/parachains/src/benchmarking.rs @@ -0,0 +1,116 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Parachains finality pallet benchmarking. + +use crate::{ + weights_ext::DEFAULT_PARACHAIN_HEAD_SIZE, Call, RelayBlockHash, RelayBlockHasher, + RelayBlockNumber, +}; + +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use bp_runtime::StorageProofSize; +use frame_benchmarking::{account, benchmarks_instance_pallet}; +use frame_system::RawOrigin; +use sp_std::prelude::*; + +/// Pallet we're benchmarking here. +pub struct Pallet, I: 'static = ()>(crate::Pallet); + +/// Trait that must be implemented by runtime to benchmark the parachains finality pallet. +pub trait Config: crate::Config { + /// Returns vector of supported parachains. + fn parachains() -> Vec; + /// Generate parachain heads proof and prepare environment for verifying this proof. + fn prepare_parachain_heads_proof( + parachains: &[ParaId], + parachain_head_size: u32, + proof_size: StorageProofSize, + ) -> (RelayBlockNumber, RelayBlockHash, ParaHeadsProof, Vec<(ParaId, ParaHash)>); +} + +benchmarks_instance_pallet! { + where_clause { + where + >::BridgedChain: + bp_runtime::Chain< + BlockNumber = RelayBlockNumber, + Hash = RelayBlockHash, + Hasher = RelayBlockHasher, + >, + } + + // Benchmark `submit_parachain_heads` extrinsic with different number of parachains. + submit_parachain_heads_with_n_parachains { + let p in 1..(T::parachains().len() + 1) as u32; + + let sender = account("sender", 0, 0); + let mut parachains = T::parachains(); + let _ = if p <= parachains.len() as u32 { + parachains.split_off(p as usize) + } else { + Default::default() + }; + log::trace!(target: crate::LOG_TARGET, "=== {:?}", parachains.len()); + let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( + ¶chains, + DEFAULT_PARACHAIN_HEAD_SIZE, + StorageProofSize::Minimal(0), + ); + let at_relay_block = (relay_block_number, relay_block_hash); + }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) + verify { + for parachain in parachains { + assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); + } + } + + // Benchmark `submit_parachain_heads` extrinsic with 1kb proof size. + submit_parachain_heads_with_1kb_proof { + let sender = account("sender", 0, 0); + let parachains = vec![T::parachains()[0]]; + let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( + ¶chains, + DEFAULT_PARACHAIN_HEAD_SIZE, + StorageProofSize::HasLargeLeaf(1024), + ); + let at_relay_block = (relay_block_number, relay_block_hash); + }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) + verify { + for parachain in parachains { + assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); + } + } + + // Benchmark `submit_parachain_heads` extrinsic with 16kb proof size. + submit_parachain_heads_with_16kb_proof { + let sender = account("sender", 0, 0); + let parachains = vec![T::parachains()[0]]; + let (relay_block_number, relay_block_hash, parachain_heads_proof, parachains_heads) = T::prepare_parachain_heads_proof( + ¶chains, + DEFAULT_PARACHAIN_HEAD_SIZE, + StorageProofSize::HasLargeLeaf(16 * 1024), + ); + let at_relay_block = (relay_block_number, relay_block_hash); + }: submit_parachain_heads(RawOrigin::Signed(sender), at_relay_block, parachains_heads, parachain_heads_proof) + verify { + for parachain in parachains { + assert!(crate::Pallet::::best_parachain_head(parachain).is_some()); + } + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} diff --git a/modules/parachains/src/call_ext.rs b/modules/parachains/src/call_ext.rs new file mode 100644 index 000000000000..198ff11be495 --- /dev/null +++ b/modules/parachains/src/call_ext.rs @@ -0,0 +1,263 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{Config, Pallet, RelayBlockNumber}; +use bp_parachains::BestParaHeadHash; +use bp_polkadot_core::parachains::{ParaHash, ParaId}; +use bp_runtime::OwnedBridgeModule; +use frame_support::{dispatch::CallableCallFor, traits::IsSubType}; +use sp_runtime::{ + transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, + RuntimeDebug, +}; + +/// Info about a `SubmitParachainHeads` call which tries to update a single parachain. +#[derive(PartialEq, RuntimeDebug)] +pub struct SubmitParachainHeadsInfo { + /// Number of the finalized relay block that has been used to prove parachain finality. + pub at_relay_block_number: RelayBlockNumber, + /// Parachain identifier. + pub para_id: ParaId, + /// Hash of the bundled parachain head. + pub para_head_hash: ParaHash, +} + +/// Helper struct that provides methods for working with the `SubmitParachainHeads` call. +pub struct SubmitParachainHeadsHelper, I: 'static> { + _phantom_data: sp_std::marker::PhantomData<(T, I)>, +} + +impl, I: 'static> SubmitParachainHeadsHelper { + /// Check if the para head provided by the `SubmitParachainHeads` is better than the best one + /// we know. + pub fn is_obsolete(update: &SubmitParachainHeadsInfo) -> bool { + let stored_best_head = match crate::ParasInfo::::get(update.para_id) { + Some(stored_best_head) => stored_best_head, + None => return false, + }; + + if stored_best_head.best_head_hash.at_relay_block_number >= update.at_relay_block_number { + log::trace!( + target: crate::LOG_TARGET, + "The parachain head can't be updated. The parachain head for {:?} \ + was already updated at better relay chain block {} >= {}.", + update.para_id, + stored_best_head.best_head_hash.at_relay_block_number, + update.at_relay_block_number + ); + return true + } + + if stored_best_head.best_head_hash.head_hash == update.para_head_hash { + log::trace!( + target: crate::LOG_TARGET, + "The parachain head can't be updated. The parachain head hash for {:?} \ + was already updated to {} at block {} < {}.", + update.para_id, + update.para_head_hash, + stored_best_head.best_head_hash.at_relay_block_number, + update.at_relay_block_number + ); + return true + } + + false + } + + /// Check if the `SubmitParachainHeads` was successfully executed. + pub fn was_successful(update: &SubmitParachainHeadsInfo) -> bool { + match crate::ParasInfo::::get(update.para_id) { + Some(stored_best_head) => + stored_best_head.best_head_hash == + BestParaHeadHash { + at_relay_block_number: update.at_relay_block_number, + head_hash: update.para_head_hash, + }, + None => false, + } + } +} + +/// Trait representing a call that is a sub type of this pallet's call. +pub trait CallSubType, I: 'static>: + IsSubType, T>> +{ + /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with + /// one single parachain entry. + fn one_entry_submit_parachain_heads_info(&self) -> Option { + if let Some(crate::Call::::submit_parachain_heads { + ref at_relay_block, + ref parachains, + .. + }) = self.is_sub_type() + { + if let &[(para_id, para_head_hash)] = parachains.as_slice() { + return Some(SubmitParachainHeadsInfo { + at_relay_block_number: at_relay_block.0, + para_id, + para_head_hash, + }) + } + } + + None + } + + /// Create a new instance of `SubmitParachainHeadsInfo` from a `SubmitParachainHeads` call with + /// one single parachain entry, if the entry is for the provided parachain id. + fn submit_parachain_heads_info_for(&self, para_id: u32) -> Option { + self.one_entry_submit_parachain_heads_info() + .filter(|update| update.para_id.0 == para_id) + } + + /// Validate parachain heads in order to avoid "mining" transactions that provide + /// outdated bridged parachain heads. Without this validation, even honest relayers + /// may lose their funds if there are multiple relays running and submitting the + /// same information. + /// + /// This validation only works with transactions that are updating single parachain + /// head. We can't use unbounded validation - it may take too long and either break + /// block production, or "eat" significant portion of block production time literally + /// for nothing. In addition, the single-parachain-head-per-transaction is how the + /// pallet will be used in our environment. + fn check_obsolete_submit_parachain_heads(&self) -> TransactionValidity + where + Self: Sized, + { + let update = match self.one_entry_submit_parachain_heads_info() { + Some(update) => update, + None => return Ok(ValidTransaction::default()), + }; + + if Pallet::::ensure_not_halted().is_err() { + return InvalidTransaction::Call.into() + } + + if SubmitParachainHeadsHelper::::is_obsolete(&update) { + return InvalidTransaction::Stale.into() + } + + Ok(ValidTransaction::default()) + } +} + +impl CallSubType for T::RuntimeCall +where + T: Config, + T::RuntimeCall: IsSubType, T>>, +{ +} + +#[cfg(test)] +mod tests { + use crate::{ + mock::{run_test, RuntimeCall, TestRuntime}, + CallSubType, PalletOperatingMode, ParaInfo, ParasInfo, RelayBlockNumber, + }; + use bp_parachains::BestParaHeadHash; + use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; + use bp_runtime::BasicOperatingMode; + + fn validate_submit_parachain_heads( + num: RelayBlockNumber, + parachains: Vec<(ParaId, ParaHash)>, + ) -> bool { + RuntimeCall::Parachains(crate::Call::::submit_parachain_heads { + at_relay_block: (num, Default::default()), + parachains, + parachain_heads_proof: ParaHeadsProof(Vec::new()), + }) + .check_obsolete_submit_parachain_heads() + .is_ok() + } + + fn sync_to_relay_header_10() { + ParasInfo::::insert( + ParaId(1), + ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 10, + head_hash: [1u8; 32].into(), + }, + next_imported_hash_position: 0, + }, + ); + } + + #[test] + fn extension_rejects_header_from_the_obsolete_relay_block() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#5 => tx is + // rejected + sync_to_relay_header_10(); + assert!(!validate_submit_parachain_heads(5, vec![(ParaId(1), [1u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_header_from_the_same_relay_block() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#10 => tx is + // rejected + sync_to_relay_header_10(); + assert!(!validate_submit_parachain_heads(10, vec![(ParaId(1), [1u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_header_from_new_relay_block_with_same_hash() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#10 => tx is + // rejected + sync_to_relay_header_10(); + assert!(!validate_submit_parachain_heads(20, vec![(ParaId(1), [1u8; 32].into())])); + }); + } + + #[test] + fn extension_rejects_header_if_pallet_is_halted() { + run_test(|| { + // when pallet is halted => tx is rejected + sync_to_relay_header_10(); + PalletOperatingMode::::put(BasicOperatingMode::Halted); + + assert!(!validate_submit_parachain_heads(15, vec![(ParaId(1), [2u8; 32].into())])); + }); + } + + #[test] + fn extension_accepts_new_header() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#15 => tx is + // accepted + sync_to_relay_header_10(); + assert!(validate_submit_parachain_heads(15, vec![(ParaId(1), [2u8; 32].into())])); + }); + } + + #[test] + fn extension_accepts_if_more_than_one_parachain_is_submitted() { + run_test(|| { + // when current best finalized is #10 and we're trying to import header#5, but another + // parachain head is also supplied => tx is accepted + sync_to_relay_header_10(); + assert!(validate_submit_parachain_heads( + 5, + vec![(ParaId(1), [1u8; 32].into()), (ParaId(2), [1u8; 32].into())] + )); + }); + } +} diff --git a/modules/parachains/src/lib.rs b/modules/parachains/src/lib.rs new file mode 100644 index 000000000000..b2ef0bf52bd3 --- /dev/null +++ b/modules/parachains/src/lib.rs @@ -0,0 +1,1624 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Parachains finality module. +//! +//! This module needs to be deployed with GRANDPA module, which is syncing relay +//! chain blocks. The main entry point of this module is `submit_parachain_heads`, which +//! accepts storage proof of some parachain `Heads` entries from bridged relay chain. +//! It requires corresponding relay headers to be already synced. + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use weights::WeightInfo; +pub use weights_ext::WeightInfoExt; + +use bp_header_chain::{HeaderChain, HeaderChainError}; +use bp_parachains::{parachain_head_storage_key_at_source, ParaInfo, ParaStoredHeaderData}; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain, StorageProofError}; +use frame_support::{dispatch::PostDispatchInfo, DefaultNoBound}; +use sp_std::{marker::PhantomData, vec::Vec}; + +#[cfg(feature = "runtime-benchmarks")] +use bp_parachains::ParaStoredHeaderDataBuilder; +#[cfg(feature = "runtime-benchmarks")] +use bp_runtime::HeaderOf; +#[cfg(feature = "runtime-benchmarks")] +use codec::Encode; + +// Re-export in crate namespace for `construct_runtime!`. +pub use call_ext::*; +pub use pallet::*; + +pub mod weights; +pub mod weights_ext; + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarking; + +mod call_ext; +#[cfg(test)] +mod mock; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-parachains"; + +/// Block hash of the bridged relay chain. +pub type RelayBlockHash = bp_polkadot_core::Hash; +/// Block number of the bridged relay chain. +pub type RelayBlockNumber = bp_polkadot_core::BlockNumber; +/// Hasher of the bridged relay chain. +pub type RelayBlockHasher = bp_polkadot_core::Hasher; + +/// Artifacts of the parachains head update. +struct UpdateParachainHeadArtifacts { + /// New best head of the parachain. + pub best_head: ParaInfo, + /// If `true`, some old parachain head has been pruned during update. + pub prune_happened: bool, +} + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use bp_parachains::{ + BestParaHeadHash, ImportedParaHeadsKeyProvider, ParaStoredHeaderDataBuilder, + ParasInfoKeyProvider, + }; + use bp_runtime::{ + BasicOperatingMode, BoundedStorageValue, OwnedBridgeModule, StorageDoubleMapKeyProvider, + StorageMapKeyProvider, + }; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + /// Stored parachain head data of given parachains pallet. + pub type StoredParaHeadDataOf = + BoundedStorageValue<>::MaxParaHeadDataSize, ParaStoredHeaderData>; + /// Weight info of the given parachains pallet. + pub type WeightInfoOf = >::WeightInfo; + type GrandpaPalletOf = + pallet_bridge_grandpa::Pallet>::BridgesGrandpaPalletInstance>; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event, I: 'static = ()> { + /// The caller has provided head of parachain that the pallet is not configured to track. + UntrackedParachainRejected { parachain: ParaId }, + /// The caller has declared that he has provided given parachain head, but it is missing + /// from the storage proof. + MissingParachainHead { parachain: ParaId }, + /// The caller has provided parachain head hash that is not matching the hash read from the + /// storage proof. + IncorrectParachainHeadHash { + parachain: ParaId, + parachain_head_hash: ParaHash, + actual_parachain_head_hash: ParaHash, + }, + /// The caller has provided obsolete parachain head, which is already known to the pallet. + RejectedObsoleteParachainHead { parachain: ParaId, parachain_head_hash: ParaHash }, + /// The caller has provided parachain head that exceeds the maximal configured head size. + RejectedLargeParachainHead { + parachain: ParaId, + parachain_head_hash: ParaHash, + parachain_head_size: u32, + }, + /// Parachain head has been updated. + UpdatedParachainHead { parachain: ParaId, parachain_head_hash: ParaHash }, + } + + #[pallet::error] + pub enum Error { + /// Relay chain block hash is unknown to us. + UnknownRelayChainBlock, + /// The number of stored relay block is different from what the relayer has provided. + InvalidRelayChainBlockNumber, + /// Parachain heads storage proof is invalid. + HeaderChainStorageProof(HeaderChainError), + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Convenience trait for defining `BridgedChain` bounds. + pub trait BoundedBridgeGrandpaConfig: + pallet_bridge_grandpa::Config + { + type BridgedRelayChain: Chain< + BlockNumber = RelayBlockNumber, + Hash = RelayBlockHash, + Hasher = RelayBlockHasher, + >; + } + + impl BoundedBridgeGrandpaConfig for T + where + T: pallet_bridge_grandpa::Config, + T::BridgedChain: + Chain, + { + type BridgedRelayChain = T::BridgedChain; + } + + #[pallet::config] + #[pallet::disable_frame_system_supertrait_check] + pub trait Config: + BoundedBridgeGrandpaConfig + { + /// The overarching event type. + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + /// Benchmarks results from runtime we're plugged into. + type WeightInfo: WeightInfoExt; + + /// Instance of bridges GRANDPA pallet (within this runtime) that this pallet is linked to. + /// + /// The GRANDPA pallet instance must be configured to import headers of relay chain that + /// we're interested in. + type BridgesGrandpaPalletInstance: 'static; + + /// Name of the original `paras` pallet in the `construct_runtime!()` call at the bridged + /// chain. + /// + /// Please keep in mind that this should be the name of the `runtime_parachains::paras` + /// pallet from polkadot repository, not the `pallet-bridge-parachains`. + #[pallet::constant] + type ParasPalletName: Get<&'static str>; + + /// Parachain head data builder. + /// + /// We never store parachain heads here, since they may be too big (e.g. because of large + /// digest items). Instead we're using the same approach as `pallet-bridge-grandpa` + /// pallet - we are only storing `bp_messages::StoredHeaderData` (number and state root), + /// which is enough for our applications. However, we work with different parachains here + /// and they can use different primitives (for block numbers and hash). So we can't store + /// it directly. Instead, we're storing `bp_messages::StoredHeaderData` in SCALE-encoded + /// form, wrapping it into `bp_parachains::ParaStoredHeaderData`. + /// + /// This builder helps to convert from `HeadData` to `bp_parachains::ParaStoredHeaderData`. + type ParaStoredHeaderDataBuilder: ParaStoredHeaderDataBuilder; + + /// Maximal number of single parachain heads to keep in the storage. + /// + /// The setting is there to prevent growing the on-chain state indefinitely. Note + /// the setting does not relate to parachain block numbers - we will simply keep as much + /// items in the storage, so it doesn't guarantee any fixed timeframe for heads. + /// + /// Incautious change of this constant may lead to orphan entries in the runtime storage. + #[pallet::constant] + type HeadsToKeep: Get; + + /// Maximal size (in bytes) of the SCALE-encoded parachain head data + /// (`bp_parachains::ParaStoredHeaderData`). + /// + /// Keep in mind that the size of any tracked parachain header data must not exceed this + /// value. So if you're going to track multiple parachains, one of which is using large + /// hashes, you shall choose this maximal value. + /// + /// There's no mandatory headers in this pallet, so it can't stall if there's some header + /// that exceeds this bound. + #[pallet::constant] + type MaxParaHeadDataSize: Get; + } + + /// Optional pallet owner. + /// + /// Pallet owner has a right to halt all pallet operations and then resume them. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. democracy::referendum to update halt + /// flag directly or call the `halt_operations`). + #[pallet::storage] + pub type PalletOwner, I: 'static = ()> = + StorageValue<_, T::AccountId, OptionQuery>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, or no transactions will be allowed. + #[pallet::storage] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, BasicOperatingMode, ValueQuery>; + + /// Parachains info. + /// + /// Contains the following info: + /// - best parachain head hash + /// - the head of the `ImportedParaHashes` ring buffer + #[pallet::storage] + pub type ParasInfo, I: 'static = ()> = StorageMap< + Hasher = ::Hasher, + Key = ::Key, + Value = ::Value, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeMaxParachains, + >; + + /// State roots of parachain heads which have been imported into the pallet. + #[pallet::storage] + pub type ImportedParaHeads, I: 'static = ()> = StorageDoubleMap< + Hasher1 = ::Hasher1, + Key1 = ::Key1, + Hasher2 = ::Hasher2, + Key2 = ::Key2, + Value = StoredParaHeadDataOf, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeMaxTotalParachainHashes, + >; + + /// A ring buffer of imported parachain head hashes. Ordered by the insertion time. + #[pallet::storage] + pub(super) type ImportedParaHashes, I: 'static = ()> = StorageDoubleMap< + Hasher1 = Blake2_128Concat, + Key1 = ParaId, + Hasher2 = Twox64Concat, + Key2 = u32, + Value = ParaHash, + QueryKind = OptionQuery, + OnEmpty = GetDefault, + MaxValues = MaybeMaxTotalParachainHashes, + >; + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = BasicOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::call] + impl, I: 'static> Pallet { + /// Submit proof of one or several parachain heads. + /// + /// The proof is supposed to be proof of some `Heads` entries from the + /// `polkadot-runtime-parachains::paras` pallet instance, deployed at the bridged chain. + /// The proof is supposed to be crafted at the `relay_header_hash` that must already be + /// imported by corresponding GRANDPA pallet at this chain. + /// + /// The call fails if: + /// + /// - the pallet is halted; + /// + /// - the relay chain block `at_relay_block` is not imported by the associated bridge + /// GRANDPA pallet. + /// + /// The call may succeed, but some heads may not be updated e.g. because pallet knows + /// better head or it isn't tracked by the pallet. + #[pallet::call_index(0)] + #[pallet::weight(WeightInfoOf::::submit_parachain_heads_weight( + T::DbWeight::get(), + parachain_heads_proof, + parachains.len() as _, + ))] + pub fn submit_parachain_heads( + origin: OriginFor, + at_relay_block: (RelayBlockNumber, RelayBlockHash), + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> DispatchResultWithPostInfo { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + ensure_signed(origin)?; + + // we'll need relay chain header to verify that parachains heads are always increasing. + let (relay_block_number, relay_block_hash) = at_relay_block; + let relay_block = pallet_bridge_grandpa::ImportedHeaders::< + T, + T::BridgesGrandpaPalletInstance, + >::get(relay_block_hash) + .ok_or(Error::::UnknownRelayChainBlock)?; + ensure!( + relay_block.number == relay_block_number, + Error::::InvalidRelayChainBlockNumber, + ); + + // now parse storage proof and read parachain heads + let mut actual_weight = WeightInfoOf::::submit_parachain_heads_weight( + T::DbWeight::get(), + ¶chain_heads_proof, + parachains.len() as _, + ); + + let mut storage = GrandpaPalletOf::::storage_proof_checker( + relay_block_hash, + parachain_heads_proof.0, + ) + .map_err(Error::::HeaderChainStorageProof)?; + + for (parachain, parachain_head_hash) in parachains { + let parachain_head = match Self::read_parachain_head(&mut storage, parachain) { + Ok(Some(parachain_head)) => parachain_head, + Ok(None) => { + log::trace!( + target: LOG_TARGET, + "The head of parachain {:?} is None. {}", + parachain, + if ParasInfo::::contains_key(parachain) { + "Looks like it is not yet registered at the source relay chain" + } else { + "Looks like it has been deregistered from the source relay chain" + }, + ); + Self::deposit_event(Event::MissingParachainHead { parachain }); + continue + }, + Err(e) => { + log::trace!( + target: LOG_TARGET, + "The read of head of parachain {:?} has failed: {:?}", + parachain, + e, + ); + Self::deposit_event(Event::MissingParachainHead { parachain }); + continue + }, + }; + + // if relayer has specified invalid parachain head hash, ignore the head + // (this isn't strictly necessary, but better safe than sorry) + let actual_parachain_head_hash = parachain_head.hash(); + if parachain_head_hash != actual_parachain_head_hash { + log::trace!( + target: LOG_TARGET, + "The submitter has specified invalid parachain {:?} head hash: \ + {:?} vs {:?}", + parachain, + parachain_head_hash, + actual_parachain_head_hash, + ); + Self::deposit_event(Event::IncorrectParachainHeadHash { + parachain, + parachain_head_hash, + actual_parachain_head_hash, + }); + continue + } + + // convert from parachain head into stored parachain head data + let parachain_head_data = + match T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) { + Some(parachain_head_data) => parachain_head_data, + None => { + log::trace!( + target: LOG_TARGET, + "The head of parachain {:?} has been provided, but it is not tracked by the pallet", + parachain, + ); + Self::deposit_event(Event::UntrackedParachainRejected { parachain }); + continue + }, + }; + + let update_result: Result<_, ()> = + ParasInfo::::try_mutate(parachain, |stored_best_head| { + let artifacts = Pallet::::update_parachain_head( + parachain, + stored_best_head.take(), + relay_block_number, + parachain_head_data, + parachain_head_hash, + )?; + *stored_best_head = Some(artifacts.best_head); + Ok(artifacts.prune_happened) + }); + + // we're refunding weight if update has not happened and if pruning has not happened + let is_update_happened = update_result.is_ok(); + if !is_update_happened { + actual_weight = actual_weight.saturating_sub( + WeightInfoOf::::parachain_head_storage_write_weight( + T::DbWeight::get(), + ), + ); + } + let is_prune_happened = matches!(update_result, Ok(true)); + if !is_prune_happened { + actual_weight = actual_weight.saturating_sub( + WeightInfoOf::::parachain_head_pruning_weight(T::DbWeight::get()), + ); + } + } + + // even though we may have accepted some parachain heads, we can't allow relayers to + // submit proof with unused trie nodes + // => treat this as an error + // + // (we can throw error here, because now all our calls are transactional) + storage.ensure_no_unused_nodes().map_err(|e| { + Error::::HeaderChainStorageProof(HeaderChainError::StorageProof(e)) + })?; + + Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes }) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + } + + impl, I: 'static> Pallet { + /// Get stored parachain info. + pub fn best_parachain_info(parachain: ParaId) -> Option { + ParasInfo::::get(parachain) + } + + /// Get best finalized head data of the given parachain. + pub fn best_parachain_head(parachain: ParaId) -> Option { + let best_para_head_hash = ParasInfo::::get(parachain)?.best_head_hash.head_hash; + ImportedParaHeads::::get(parachain, best_para_head_hash).map(|h| h.into_inner()) + } + + /// Get best finalized head hash of the given parachain. + pub fn best_parachain_head_hash(parachain: ParaId) -> Option { + Some(ParasInfo::::get(parachain)?.best_head_hash.head_hash) + } + + /// Get best finalized head id of the given parachain. + pub fn best_parachain_head_id + Parachain>( + ) -> Result>, codec::Error> { + let parachain = ParaId(C::PARACHAIN_ID); + let best_head_hash = match Self::best_parachain_head_hash(parachain) { + Some(best_head_hash) => best_head_hash, + None => return Ok(None), + }; + let encoded_head = match Self::parachain_head(parachain, best_head_hash) { + Some(encoded_head) => encoded_head, + None => return Ok(None), + }; + encoded_head + .decode_parachain_head_data::() + .map(|data| Some(HeaderId(data.number, best_head_hash))) + } + + /// Get parachain head data with given hash. + pub fn parachain_head(parachain: ParaId, hash: ParaHash) -> Option { + ImportedParaHeads::::get(parachain, hash).map(|h| h.into_inner()) + } + + /// Read parachain head from storage proof. + fn read_parachain_head( + storage: &mut bp_runtime::StorageProofChecker, + parachain: ParaId, + ) -> Result, StorageProofError> { + let parachain_head_key = + parachain_head_storage_key_at_source(T::ParasPalletName::get(), parachain); + storage.read_and_decode_value(parachain_head_key.0.as_ref()) + } + + /// Try to update parachain head. + pub(super) fn update_parachain_head( + parachain: ParaId, + stored_best_head: Option, + new_at_relay_block_number: RelayBlockNumber, + new_head_data: ParaStoredHeaderData, + new_head_hash: ParaHash, + ) -> Result { + // check if head has been already updated at better relay chain block. Without this + // check, we may import heads in random order + let update = SubmitParachainHeadsInfo { + at_relay_block_number: new_at_relay_block_number, + para_id: parachain, + para_head_hash: new_head_hash, + }; + if SubmitParachainHeadsHelper::::is_obsolete(&update) { + Self::deposit_event(Event::RejectedObsoleteParachainHead { + parachain, + parachain_head_hash: new_head_hash, + }); + return Err(()) + } + + // verify that the parachain head data size is <= `MaxParaHeadDataSize` + let updated_head_data = + match StoredParaHeadDataOf::::try_from_inner(new_head_data) { + Ok(updated_head_data) => updated_head_data, + Err(e) => { + log::trace!( + target: LOG_TARGET, + "The parachain head can't be updated. The parachain head data size \ + for {:?} is {}. It exceeds maximal configured size {}.", + parachain, + e.value_size, + e.maximal_size, + ); + + Self::deposit_event(Event::RejectedLargeParachainHead { + parachain, + parachain_head_hash: new_head_hash, + parachain_head_size: e.value_size as _, + }); + + return Err(()) + }, + }; + + let next_imported_hash_position = stored_best_head + .map_or(0, |stored_best_head| stored_best_head.next_imported_hash_position); + + // insert updated best parachain head + let head_hash_to_prune = + ImportedParaHashes::::try_get(parachain, next_imported_hash_position); + let updated_best_para_head = ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: new_at_relay_block_number, + head_hash: new_head_hash, + }, + next_imported_hash_position: (next_imported_hash_position + 1) % + T::HeadsToKeep::get(), + }; + ImportedParaHashes::::insert( + parachain, + next_imported_hash_position, + new_head_hash, + ); + ImportedParaHeads::::insert(parachain, new_head_hash, updated_head_data); + log::trace!( + target: LOG_TARGET, + "Updated head of parachain {:?} to {}", + parachain, + new_head_hash, + ); + + // remove old head + let prune_happened = head_hash_to_prune.is_ok(); + if let Ok(head_hash_to_prune) = head_hash_to_prune { + log::trace!( + target: LOG_TARGET, + "Pruning old head of parachain {:?}: {}", + parachain, + head_hash_to_prune, + ); + ImportedParaHeads::::remove(parachain, head_hash_to_prune); + } + Self::deposit_event(Event::UpdatedParachainHead { + parachain, + parachain_head_hash: new_head_hash, + }); + + Ok(UpdateParachainHeadArtifacts { best_head: updated_best_para_head, prune_happened }) + } + } + + #[pallet::genesis_config] + #[derive(DefaultNoBound)] + pub struct GenesisConfig, I: 'static = ()> { + /// Initial pallet operating mode. + pub operating_mode: BasicOperatingMode, + /// Initial pallet owner. + pub owner: Option, + /// Dummy marker. + pub phantom: sp_std::marker::PhantomData, + } + + #[pallet::genesis_build] + impl, I: 'static> BuildGenesisConfig for GenesisConfig { + fn build(&self) { + PalletOperatingMode::::put(self.operating_mode); + if let Some(ref owner) = self.owner { + PalletOwner::::put(owner); + } + } + } + + /// Returns maximal number of parachains, supported by the pallet. + pub struct MaybeMaxParachains(PhantomData<(T, I)>); + + impl, I: 'static> Get> for MaybeMaxParachains { + fn get() -> Option { + Some(T::ParaStoredHeaderDataBuilder::supported_parachains()) + } + } + + /// Returns total number of all parachains hashes/heads, stored by the pallet. + pub struct MaybeMaxTotalParachainHashes(PhantomData<(T, I)>); + + impl, I: 'static> Get> for MaybeMaxTotalParachainHashes { + fn get() -> Option { + Some( + T::ParaStoredHeaderDataBuilder::supported_parachains() + .saturating_mul(T::HeadsToKeep::get()), + ) + } + } +} + +/// Single parachain header chain adapter. +pub struct ParachainHeaders(PhantomData<(T, I, C)>); + +impl, I: 'static, C: Parachain> HeaderChain + for ParachainHeaders +{ + fn finalized_header_state_root(hash: HashOf) -> Option> { + Pallet::::parachain_head(ParaId(C::PARACHAIN_ID), hash) + .and_then(|head| head.decode_parachain_head_data::().ok()) + .map(|h| h.state_root) + } +} + +/// (Re)initialize pallet with given header for using it in `pallet-bridge-messages` benchmarks. +#[cfg(feature = "runtime-benchmarks")] +pub fn initialize_for_benchmarks, I: 'static, PC: Parachain>( + header: HeaderOf, +) { + let parachain = ParaId(PC::PARACHAIN_ID); + let parachain_head = ParaHead(header.encode()); + let updated_head_data = T::ParaStoredHeaderDataBuilder::try_build(parachain, ¶chain_head) + .expect("failed to build stored parachain head in benchmarks"); + Pallet::::update_parachain_head( + parachain, + None, + 0, + updated_head_data, + parachain_head.hash(), + ) + .expect("failed to insert parachain head in benchmarks"); +} + +#[cfg(test)] +pub(crate) mod tests { + use super::*; + use crate::mock::{ + run_test, test_relay_header, BigParachainHeader, RegularParachainHasher, + RegularParachainHeader, RelayBlockHeader, RuntimeEvent as TestEvent, RuntimeOrigin, + TestRuntime, UNTRACKED_PARACHAIN_ID, + }; + use bp_test_utils::prepare_parachain_heads_proof; + use codec::Encode; + + use bp_header_chain::{justification::GrandpaJustification, StoredHeaderGrandpaInfo}; + use bp_parachains::{ + BestParaHeadHash, BridgeParachainCall, ImportedParaHeadsKeyProvider, ParasInfoKeyProvider, + }; + use bp_runtime::{ + BasicOperatingMode, OwnedBridgeModuleError, StorageDoubleMapKeyProvider, + StorageMapKeyProvider, + }; + use bp_test_utils::{ + authority_list, generate_owned_bridge_module_tests, make_default_justification, + }; + use frame_support::{ + assert_noop, assert_ok, + dispatch::DispatchResultWithPostInfo, + storage::generator::{StorageDoubleMap, StorageMap}, + traits::{Get, OnInitialize}, + weights::Weight, + }; + use frame_system::{EventRecord, Pallet as System, Phase}; + use sp_core::Hasher; + use sp_runtime::{traits::Header as HeaderT, DispatchError}; + + type BridgesGrandpaPalletInstance = pallet_bridge_grandpa::Instance1; + type WeightInfo = ::WeightInfo; + type DbWeight = ::DbWeight; + + pub(crate) fn initialize(state_root: RelayBlockHash) -> RelayBlockHash { + pallet_bridge_grandpa::Pallet::::initialize( + RuntimeOrigin::root(), + bp_header_chain::InitializationData { + header: Box::new(test_relay_header(0, state_root)), + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + }, + ) + .unwrap(); + + System::::set_block_number(1); + System::::reset_events(); + + test_relay_header(0, state_root).hash() + } + + fn proceed( + num: RelayBlockNumber, + state_root: RelayBlockHash, + ) -> (ParaHash, GrandpaJustification) { + pallet_bridge_grandpa::Pallet::::on_initialize( + 0, + ); + + let header = test_relay_header(num, state_root); + let hash = header.hash(); + let justification = make_default_justification(&header); + assert_ok!( + pallet_bridge_grandpa::Pallet::::submit_finality_proof( + RuntimeOrigin::signed(1), + Box::new(header), + justification.clone(), + ) + ); + + (hash, justification) + } + + fn initial_best_head(parachain: u32) -> ParaInfo { + ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(parachain, 0).hash(), + }, + next_imported_hash_position: 1, + } + } + + pub(crate) fn head_data(parachain: u32, head_number: u32) -> ParaHead { + ParaHead( + RegularParachainHeader::new( + head_number as _, + Default::default(), + RegularParachainHasher::hash(&(parachain, head_number).encode()), + Default::default(), + Default::default(), + ) + .encode(), + ) + } + + fn stored_head_data(parachain: u32, head_number: u32) -> ParaStoredHeaderData { + ParaStoredHeaderData( + (head_number as u64, RegularParachainHasher::hash(&(parachain, head_number).encode())) + .encode(), + ) + } + + fn big_head_data(parachain: u32, head_number: u32) -> ParaHead { + ParaHead( + BigParachainHeader::new( + head_number as _, + Default::default(), + RegularParachainHasher::hash(&(parachain, head_number).encode()), + Default::default(), + Default::default(), + ) + .encode(), + ) + } + + fn big_stored_head_data(parachain: u32, head_number: u32) -> ParaStoredHeaderData { + ParaStoredHeaderData( + (head_number as u128, RegularParachainHasher::hash(&(parachain, head_number).encode())) + .encode(), + ) + } + + fn head_hash(parachain: u32, head_number: u32) -> ParaHash { + head_data(parachain, head_number).hash() + } + + fn import_parachain_1_head( + relay_chain_block: RelayBlockNumber, + relay_state_root: RelayBlockHash, + parachains: Vec<(ParaId, ParaHash)>, + proof: ParaHeadsProof, + ) -> DispatchResultWithPostInfo { + Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (relay_chain_block, test_relay_header(relay_chain_block, relay_state_root).hash()), + parachains, + proof, + ) + } + + fn weight_of_import_parachain_1_head(proof: &ParaHeadsProof, prune_expected: bool) -> Weight { + let db_weight = ::DbWeight::get(); + WeightInfoOf::::submit_parachain_heads_weight(db_weight, proof, 1) + .saturating_sub(if prune_expected { + Weight::zero() + } else { + WeightInfoOf::::parachain_head_pruning_weight(db_weight) + }) + } + + #[test] + fn submit_parachain_heads_checks_operating_mode() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); + + run_test(|| { + initialize(state_root); + + // `submit_parachain_heads()` should fail when the pallet is halted. + PalletOperatingMode::::put(BasicOperatingMode::Halted); + assert_noop!( + Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains.clone(), + proof.clone(), + ), + Error::::BridgeModule(OwnedBridgeModuleError::Halted) + ); + + // `submit_parachain_heads()` should succeed now that the pallet is resumed. + PalletOperatingMode::::put(BasicOperatingMode::Normal); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ),); + }); + } + + #[test] + fn imports_initial_parachain_heads() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![ + (1, head_data(1, 0)), + (3, head_data(3, 10)), + ]); + run_test(|| { + initialize(state_root); + + // we're trying to update heads of parachains 1, 2 and 3 + let expected_weight = + WeightInfo::submit_parachain_heads_weight(DbWeight::get(), &proof, 2); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + + // but only 1 and 2 are updated, because proof is missing head of parachain#2 + assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); + assert_eq!(ParasInfo::::get(ParaId(2)), None); + assert_eq!( + ParasInfo::::get(ParaId(3)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(3, 10).hash() + }, + next_imported_hash_position: 1, + }) + ); + + assert_eq!( + ImportedParaHeads::::get( + ParaId(1), + initial_best_head(1).best_head_hash.head_hash + ) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 0)) + ); + assert_eq!( + ImportedParaHeads::::get( + ParaId(2), + initial_best_head(2).best_head_hash.head_hash + ) + .map(|h| h.into_inner()), + None + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(3), head_hash(3, 10)) + .map(|h| h.into_inner()), + Some(stored_head_data(3, 10)) + ); + + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(3), + parachain_head_hash: head_data(3, 10).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn imports_parachain_heads_is_able_to_progress() { + let (state_root_5, proof_5, parachains_5) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); + let (state_root_10, proof_10, parachains_10) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); + run_test(|| { + // start with relay block #0 and import head#5 of parachain#1 + initialize(state_root_5); + assert_ok!(import_parachain_1_head(0, state_root_5, parachains_5, proof_5)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 5).hash()) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 5)) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 10).hash()) + .map(|h| h.into_inner()), + None + ); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }], + ); + + // import head#10 of parachain#1 at relay block #1 + let (relay_1_hash, justification) = proceed(1, state_root_10); + assert_ok!(import_parachain_1_head(1, state_root_10, parachains_10, proof_10)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 1, + head_hash: head_data(1, 10).hash() + }, + next_imported_hash_position: 2, + }) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 5).hash()) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 5)) + ); + assert_eq!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 10).hash()) + .map(|h| h.into_inner()), + Some(stored_head_data(1, 10)) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + grandpa_info: StoredHeaderGrandpaInfo { + finality_proof: justification, + new_verification_context: None, + }, + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn ignores_untracked_parachain() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![ + (1, head_data(1, 5)), + (UNTRACKED_PARACHAIN_ID, head_data(1, 5)), + (2, head_data(1, 5)), + ]); + run_test(|| { + // start with relay block #0 and try to import head#5 of parachain#1 and untracked + // parachain + let expected_weight = + WeightInfo::submit_parachain_heads_weight(DbWeight::get(), &proof, 3) + .saturating_sub(WeightInfo::parachain_head_storage_write_weight( + DbWeight::get(), + )); + initialize(state_root); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!(ParasInfo::::get(ParaId(UNTRACKED_PARACHAIN_ID)), None,); + assert_eq!( + ParasInfo::::get(ParaId(2)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UntrackedParachainRejected { + parachain: ParaId(UNTRACKED_PARACHAIN_ID), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(2), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn does_nothing_when_already_imported_this_head_at_previous_relay_header() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); + run_test(|| { + // import head#0 of parachain#1 at relay block#0 + initialize(state_root); + assert_ok!(import_parachain_1_head(0, state_root, parachains.clone(), proof.clone())); + assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + }], + ); + + // try to import head#0 of parachain#1 at relay block#1 + // => call succeeds, but nothing is changed + let (relay_1_hash, justification) = proceed(1, state_root); + assert_ok!(import_parachain_1_head(1, state_root, parachains, proof)); + assert_eq!(ParasInfo::::get(ParaId(1)), Some(initial_best_head(1))); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + grandpa_info: StoredHeaderGrandpaInfo { + finality_proof: justification, + new_verification_context: None, + } + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::RejectedObsoleteParachainHead { + parachain: ParaId(1), + parachain_head_hash: initial_best_head(1).best_head_hash.head_hash, + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn does_nothing_when_already_imported_head_at_better_relay_header() { + let (state_root_5, proof_5, parachains_5) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); + let (state_root_10, proof_10, parachains_10) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); + run_test(|| { + // start with relay block #0 + initialize(state_root_5); + + // head#10 of parachain#1 at relay block#1 + let (relay_1_hash, justification) = proceed(1, state_root_10); + assert_ok!(import_parachain_1_head(1, state_root_10, parachains_10, proof_10)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 1, + head_hash: head_data(1, 10).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + grandpa_info: StoredHeaderGrandpaInfo { + finality_proof: justification.clone(), + new_verification_context: None, + } + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + }), + topics: vec![], + } + ], + ); + + // now try to import head#5 at relay block#0 + // => nothing is changed, because better head has already been imported + assert_ok!(import_parachain_1_head(0, state_root_5, parachains_5, proof_5)); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 1, + head_hash: head_data(1, 10).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Grandpa1( + pallet_bridge_grandpa::Event::UpdatedBestFinalizedHeader { + number: 1, + hash: relay_1_hash, + grandpa_info: StoredHeaderGrandpaInfo { + finality_proof: justification, + new_verification_context: None, + } + } + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::RejectedObsoleteParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + } + ], + ); + }); + } + + #[test] + fn does_nothing_when_parachain_head_is_too_large() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![ + (1, head_data(1, 5)), + (4, big_head_data(1, 5)), + ]); + run_test(|| { + // start with relay block #0 and try to import head#5 of parachain#1 and big parachain + initialize(state_root); + let result = Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ); + assert_ok!(result); + assert_eq!( + ParasInfo::::get(ParaId(1)), + Some(ParaInfo { + best_head_hash: BestParaHeadHash { + at_relay_block_number: 0, + head_hash: head_data(1, 5).hash() + }, + next_imported_hash_position: 1, + }) + ); + assert_eq!(ParasInfo::::get(ParaId(4)), None); + assert_eq!( + System::::events(), + vec![ + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::UpdatedParachainHead { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 5).hash(), + }), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::RejectedLargeParachainHead { + parachain: ParaId(4), + parachain_head_hash: big_head_data(1, 5).hash(), + parachain_head_size: big_stored_head_data(1, 5).encoded_size() as u32, + }), + topics: vec![], + }, + ], + ); + }); + } + + #[test] + fn prunes_old_heads() { + run_test(|| { + let heads_to_keep = crate::mock::HeadsToKeep::get(); + + // import exactly `HeadsToKeep` headers + for i in 0..heads_to_keep { + let (state_root, proof, parachains) = prepare_parachain_heads_proof::< + RegularParachainHeader, + >(vec![(1, head_data(1, i))]); + if i == 0 { + initialize(state_root); + } else { + proceed(i, state_root); + } + + let expected_weight = weight_of_import_parachain_1_head(&proof, false); + let result = import_parachain_1_head(i, state_root, parachains, proof); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + } + + // nothing is pruned yet + for i in 0..heads_to_keep { + assert!(ImportedParaHeads::::get(ParaId(1), head_data(1, i).hash()) + .is_some()); + } + + // import next relay chain header and next parachain head + let (state_root, proof, parachains) = prepare_parachain_heads_proof::< + RegularParachainHeader, + >(vec![(1, head_data(1, heads_to_keep))]); + proceed(heads_to_keep, state_root); + let expected_weight = weight_of_import_parachain_1_head(&proof, true); + let result = import_parachain_1_head(heads_to_keep, state_root, parachains, proof); + assert_ok!(result); + assert_eq!(result.expect("checked above").actual_weight, Some(expected_weight)); + + // and the head#0 is pruned + assert!( + ImportedParaHeads::::get(ParaId(1), head_data(1, 0).hash()).is_none() + ); + for i in 1..=heads_to_keep { + assert!(ImportedParaHeads::::get(ParaId(1), head_data(1, i).hash()) + .is_some()); + } + }); + } + + #[test] + fn fails_on_unknown_relay_chain_block() { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); + run_test(|| { + // start with relay block #0 + initialize(state_root); + + // try to import head#5 of parachain#1 at unknown relay chain block #1 + assert_noop!( + import_parachain_1_head(1, state_root, parachains, proof), + Error::::UnknownRelayChainBlock + ); + }); + } + + #[test] + fn fails_on_invalid_storage_proof() { + let (_state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); + run_test(|| { + // start with relay block #0 + initialize(Default::default()); + + // try to import head#5 of parachain#1 at relay chain block #0 + assert_noop!( + import_parachain_1_head(0, Default::default(), parachains, proof), + Error::::HeaderChainStorageProof(HeaderChainError::StorageProof( + StorageProofError::StorageRootMismatch + )) + ); + }); + } + + #[test] + fn is_not_rewriting_existing_head_if_failed_to_read_updated_head() { + let (state_root_5, proof_5, parachains_5) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 5))]); + let (state_root_10_at_20, proof_10_at_20, parachains_10_at_20) = + prepare_parachain_heads_proof::(vec![(2, head_data(2, 10))]); + let (state_root_10_at_30, proof_10_at_30, parachains_10_at_30) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 10))]); + run_test(|| { + // we've already imported head#5 of parachain#1 at relay block#10 + initialize(state_root_5); + import_parachain_1_head(0, state_root_5, parachains_5, proof_5).expect("ok"); + assert_eq!( + Pallet::::best_parachain_head(ParaId(1)), + Some(stored_head_data(1, 5)) + ); + + // then if someone is pretending to provide updated head#10 of parachain#1 at relay + // block#20, but fails to do that + // + // => we'll leave previous value + proceed(20, state_root_10_at_20); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (20, test_relay_header(20, state_root_10_at_20).hash()), + parachains_10_at_20, + proof_10_at_20, + ),); + assert_eq!( + Pallet::::best_parachain_head(ParaId(1)), + Some(stored_head_data(1, 5)) + ); + + // then if someone is pretending to provide updated head#10 of parachain#1 at relay + // block#30, and actualy provides it + // + // => we'll update value + proceed(30, state_root_10_at_30); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (30, test_relay_header(30, state_root_10_at_30).hash()), + parachains_10_at_30, + proof_10_at_30, + ),); + assert_eq!( + Pallet::::best_parachain_head(ParaId(1)), + Some(stored_head_data(1, 10)) + ); + }); + } + + #[test] + fn storage_keys_computed_properly() { + assert_eq!( + ParasInfo::::storage_map_final_key(ParaId(42)).to_vec(), + ParasInfoKeyProvider::final_key("Parachains", &ParaId(42)).0 + ); + + assert_eq!( + ImportedParaHeads::::storage_double_map_final_key( + ParaId(42), + ParaHash::from([21u8; 32]) + ) + .to_vec(), + ImportedParaHeadsKeyProvider::final_key( + "Parachains", + &ParaId(42), + &ParaHash::from([21u8; 32]) + ) + .0, + ); + } + + #[test] + fn ignores_parachain_head_if_it_is_missing_from_storage_proof() { + let (state_root, proof, _) = + prepare_parachain_heads_proof::(vec![]); + let parachains = vec![(ParaId(2), Default::default())]; + run_test(|| { + initialize(state_root); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + )); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::MissingParachainHead { + parachain: ParaId(2), + }), + topics: vec![], + }], + ); + }); + } + + #[test] + fn ignores_parachain_head_if_parachain_head_hash_is_wrong() { + let (state_root, proof, _) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); + let parachains = vec![(ParaId(1), head_data(1, 10).hash())]; + run_test(|| { + initialize(state_root); + assert_ok!(Pallet::::submit_parachain_heads( + RuntimeOrigin::signed(1), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + )); + assert_eq!( + System::::events(), + vec![EventRecord { + phase: Phase::Initialization, + event: TestEvent::Parachains(Event::IncorrectParachainHeadHash { + parachain: ParaId(1), + parachain_head_hash: head_data(1, 10).hash(), + actual_parachain_head_hash: head_data(1, 0).hash(), + }), + topics: vec![], + }], + ); + }); + } + + #[test] + fn test_bridge_parachain_call_is_correctly_defined() { + let (state_root, proof, _) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); + let parachains = vec![(ParaId(2), Default::default())]; + let relay_header_id = (0, test_relay_header(0, state_root).hash()); + + let direct_submit_parachain_heads_call = Call::::submit_parachain_heads { + at_relay_block: relay_header_id, + parachains: parachains.clone(), + parachain_heads_proof: proof.clone(), + }; + let indirect_submit_parachain_heads_call = BridgeParachainCall::submit_parachain_heads { + at_relay_block: relay_header_id, + parachains, + parachain_heads_proof: proof, + }; + assert_eq!( + direct_submit_parachain_heads_call.encode(), + indirect_submit_parachain_heads_call.encode() + ); + } + + generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); + + #[test] + fn maybe_max_parachains_returns_correct_value() { + assert_eq!(MaybeMaxParachains::::get(), Some(mock::TOTAL_PARACHAINS)); + } + + #[test] + fn maybe_max_total_parachain_hashes_returns_correct_value() { + assert_eq!( + MaybeMaxTotalParachainHashes::::get(), + Some(mock::TOTAL_PARACHAINS * mock::HeadsToKeep::get()), + ); + } + + #[test] + fn submit_finality_proof_requires_signed_origin() { + run_test(|| { + let (state_root, proof, parachains) = + prepare_parachain_heads_proof::(vec![(1, head_data(1, 0))]); + + initialize(state_root); + + // `submit_parachain_heads()` should fail when the pallet is halted. + assert_noop!( + Pallet::::submit_parachain_heads( + RuntimeOrigin::root(), + (0, test_relay_header(0, state_root).hash()), + parachains, + proof, + ), + DispatchError::BadOrigin + ); + }) + } +} diff --git a/modules/parachains/src/mock.rs b/modules/parachains/src/mock.rs new file mode 100644 index 000000000000..1c7851364d1c --- /dev/null +++ b/modules/parachains/src/mock.rs @@ -0,0 +1,316 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use bp_header_chain::ChainWithGrandpa; +use bp_polkadot_core::parachains::ParaId; +use bp_runtime::{Chain, Parachain}; +use frame_support::{ + construct_runtime, derive_impl, parameter_types, traits::ConstU32, weights::Weight, +}; +use sp_runtime::{ + testing::H256, + traits::{BlakeTwo256, Header as HeaderT}, + MultiSignature, +}; + +use crate as pallet_bridge_parachains; + +pub type AccountId = u64; + +pub type RelayBlockHeader = + sp_runtime::generic::Header; + +type Block = frame_system::mocking::MockBlock; + +pub const PARAS_PALLET_NAME: &str = "Paras"; +pub const UNTRACKED_PARACHAIN_ID: u32 = 10; +// use exact expected encoded size: `vec_len_size + header_number_size + state_root_hash_size` +pub const MAXIMAL_PARACHAIN_HEAD_DATA_SIZE: u32 = 1 + 8 + 32; +// total parachains that we use in tests +pub const TOTAL_PARACHAINS: u32 = 4; + +pub type RegularParachainHeader = sp_runtime::testing::Header; +pub type RegularParachainHasher = BlakeTwo256; +pub type BigParachainHeader = sp_runtime::generic::Header; + +pub struct Parachain1; + +impl Chain for Parachain1 { + type BlockNumber = u64; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = RegularParachainHeader; + type AccountId = u64; + type Balance = u64; + type Nonce = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for Parachain1 { + const PARACHAIN_ID: u32 = 1; +} + +pub struct Parachain2; + +impl Chain for Parachain2 { + type BlockNumber = u64; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = RegularParachainHeader; + type AccountId = u64; + type Balance = u64; + type Nonce = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for Parachain2 { + const PARACHAIN_ID: u32 = 2; +} + +pub struct Parachain3; + +impl Chain for Parachain3 { + type BlockNumber = u64; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = RegularParachainHeader; + type AccountId = u64; + type Balance = u64; + type Nonce = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for Parachain3 { + const PARACHAIN_ID: u32 = 3; +} + +// this parachain is using u128 as block number and stored head data size exceeds limit +pub struct BigParachain; + +impl Chain for BigParachain { + type BlockNumber = u128; + type Hash = H256; + type Hasher = RegularParachainHasher; + type Header = BigParachainHeader; + type AccountId = u64; + type Balance = u64; + type Nonce = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } +} + +impl Parachain for BigParachain { + const PARACHAIN_ID: u32 = 4; +} + +construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Grandpa1: pallet_bridge_grandpa::::{Pallet, Event}, + Grandpa2: pallet_bridge_grandpa::::{Pallet, Event}, + Parachains: pallet_bridge_parachains::{Call, Pallet, Event}, + } +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; +} + +parameter_types! { + pub const HeadersToKeep: u32 = 5; +} + +impl pallet_bridge_grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = TestBridgedChain; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; + type HeadersToKeep = HeadersToKeep; + type WeightInfo = (); +} + +impl pallet_bridge_grandpa::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = TestBridgedChain; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<2>; + type HeadersToKeep = HeadersToKeep; + type WeightInfo = (); +} + +parameter_types! { + pub const HeadsToKeep: u32 = 4; + pub const ParasPalletName: &'static str = PARAS_PALLET_NAME; + pub GetTenFirstParachains: Vec = (0..10).map(ParaId).collect(); +} + +impl pallet_bridge_parachains::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + type BridgesGrandpaPalletInstance = pallet_bridge_grandpa::Instance1; + type ParasPalletName = ParasPalletName; + type ParaStoredHeaderDataBuilder = (Parachain1, Parachain2, Parachain3, BigParachain); + type HeadsToKeep = HeadsToKeep; + type MaxParaHeadDataSize = ConstU32; +} + +#[cfg(feature = "runtime-benchmarks")] +impl pallet_bridge_parachains::benchmarking::Config<()> for TestRuntime { + fn parachains() -> Vec { + vec![ + ParaId(Parachain1::PARACHAIN_ID), + ParaId(Parachain2::PARACHAIN_ID), + ParaId(Parachain3::PARACHAIN_ID), + ] + } + + fn prepare_parachain_heads_proof( + parachains: &[ParaId], + _parachain_head_size: u32, + _proof_size: bp_runtime::StorageProofSize, + ) -> ( + crate::RelayBlockNumber, + crate::RelayBlockHash, + bp_polkadot_core::parachains::ParaHeadsProof, + Vec<(ParaId, bp_polkadot_core::parachains::ParaHash)>, + ) { + // in mock run we only care about benchmarks correctness, not the benchmark results + // => ignore size related arguments + let (state_root, proof, parachains) = + bp_test_utils::prepare_parachain_heads_proof::( + parachains.iter().map(|p| (p.0, crate::tests::head_data(p.0, 1))).collect(), + ); + let relay_genesis_hash = crate::tests::initialize(state_root); + (0, relay_genesis_hash, proof, parachains) + } +} + +#[derive(Debug)] +pub struct TestBridgedChain; + +impl Chain for TestBridgedChain { + type BlockNumber = crate::RelayBlockNumber; + type Hash = crate::RelayBlockHash; + type Hasher = crate::RelayBlockHasher; + type Header = RelayBlockHeader; + + type AccountId = AccountId; + type Balance = u32; + type Nonce = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithGrandpa for TestBridgedChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = 16; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_MANDATORY_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE: u32 = 64; +} + +#[derive(Debug)] +pub struct OtherBridgedChain; + +impl Chain for OtherBridgedChain { + type BlockNumber = u64; + type Hash = crate::RelayBlockHash; + type Hasher = crate::RelayBlockHasher; + type Header = sp_runtime::generic::Header; + + type AccountId = AccountId; + type Balance = u32; + type Nonce = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithGrandpa for OtherBridgedChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; + const MAX_AUTHORITIES_COUNT: u32 = 16; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const MAX_MANDATORY_HEADER_SIZE: u32 = 256; + const AVERAGE_HEADER_SIZE: u32 = 64; +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + sp_io::TestExternalities::new(Default::default()) +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(|| { + System::set_block_number(1); + System::reset_events(); + test() + }) +} + +/// Return test relay chain header with given number. +pub fn test_relay_header( + num: crate::RelayBlockNumber, + state_root: crate::RelayBlockHash, +) -> RelayBlockHeader { + RelayBlockHeader::new( + num, + Default::default(), + state_root, + Default::default(), + Default::default(), + ) +} diff --git a/modules/parachains/src/weights.rs b/modules/parachains/src/weights.rs new file mode 100644 index 000000000000..abddc8768947 --- /dev/null +++ b/modules/parachains/src/weights.rs @@ -0,0 +1,273 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_bridge_parachains +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-03-02, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/unknown-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bridge_parachains +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/parachains/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_parachains. +pub trait WeightInfo { + fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight; + fn submit_parachain_heads_with_1kb_proof() -> Weight; + fn submit_parachain_heads_with_16kb_proof() -> Weight; +} + +/// Weights for `pallet_bridge_parachains` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeUnknownParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 2]`. + fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 36_701 nanoseconds. + Weight::from_parts(38_597_828, 4648) + // Standard Error: 190_859 + .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeUnknownParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_1kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 38_189 nanoseconds. + Weight::from_parts(39_252_000, 4648) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeUnknownParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_16kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 62_868 nanoseconds. + Weight::from_parts(63_581_000, 4648) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeUnknownParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + /// + /// The range of component `p` is `[1, 2]`. + fn submit_parachain_heads_with_n_parachains(p: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 36_701 nanoseconds. + Weight::from_parts(38_597_828, 4648) + // Standard Error: 190_859 + .saturating_add(Weight::from_parts(60_685, 0).saturating_mul(p.into())) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeUnknownParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_1kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 38_189 nanoseconds. + Weight::from_parts(39_252_000, 4648) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeUnknownParachains PalletOperatingMode (r:1 w:0) + /// + /// Proof: BridgeUnknownParachains PalletOperatingMode (max_values: Some(1), max_size: Some(1), + /// added: 496, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownGrandpa ImportedHeaders (r:1 w:0) + /// + /// Proof: BridgeUnknownGrandpa ImportedHeaders (max_values: Some(14400), max_size: Some(68), + /// added: 2048, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ParasInfo (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ParasInfo (max_values: Some(1), max_size: Some(60), added: + /// 555, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHashes (r:1 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHashes (max_values: Some(1024), max_size: + /// Some(64), added: 1549, mode: MaxEncodedLen) + /// + /// Storage: BridgeUnknownParachains ImportedParaHeads (r:0 w:1) + /// + /// Proof: BridgeUnknownParachains ImportedParaHeads (max_values: Some(1024), max_size: + /// Some(196), added: 1681, mode: MaxEncodedLen) + fn submit_parachain_heads_with_16kb_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `366` + // Estimated: `4648` + // Minimum execution time: 62_868 nanoseconds. + Weight::from_parts(63_581_000, 4648) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } +} diff --git a/modules/parachains/src/weights_ext.rs b/modules/parachains/src/weights_ext.rs new file mode 100644 index 000000000000..393086a85690 --- /dev/null +++ b/modules/parachains/src/weights_ext.rs @@ -0,0 +1,107 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Weight-related utilities. + +use crate::weights::{BridgeWeight, WeightInfo}; + +use bp_runtime::Size; +use frame_support::weights::{RuntimeDbWeight, Weight}; + +/// Size of the regular parachain head. +/// +/// It's not that we are expecting all parachain heads to share the same size or that we would +/// reject all heads that have larger/lesser size. It is about head size that we use in benchmarks. +/// Relayer would need to pay additional fee for extra bytes. +/// +/// 384 is a bit larger (1.3 times) than the size of the randomly chosen Polkadot block. +pub const DEFAULT_PARACHAIN_HEAD_SIZE: u32 = 384; + +/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at +/// some generic chain. +pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; + +/// Extended weight info. +pub trait WeightInfoExt: WeightInfo { + /// Storage proof overhead, that is included in every storage proof. + /// + /// The relayer would pay some extra fee for additional proof bytes, since they mean + /// more hashing operations. + fn expected_extra_storage_proof_size() -> u32; + + /// Weight of the parachain heads delivery extrinsic. + fn submit_parachain_heads_weight( + db_weight: RuntimeDbWeight, + proof: &impl Size, + parachains_count: u32, + ) -> Weight { + // weight of the `submit_parachain_heads` with exactly `parachains_count` parachain + // heads of the default size (`DEFAULT_PARACHAIN_HEAD_SIZE`) + let base_weight = Self::submit_parachain_heads_with_n_parachains(parachains_count); + + // overhead because of extra storage proof bytes + let expected_proof_size = parachains_count + .saturating_mul(DEFAULT_PARACHAIN_HEAD_SIZE) + .saturating_add(Self::expected_extra_storage_proof_size()); + let actual_proof_size = proof.size(); + let proof_size_overhead = Self::storage_proof_size_overhead( + actual_proof_size.saturating_sub(expected_proof_size), + ); + + // potential pruning weight (refunded if hasn't happened) + let pruning_weight = + Self::parachain_head_pruning_weight(db_weight).saturating_mul(parachains_count as u64); + + base_weight.saturating_add(proof_size_overhead).saturating_add(pruning_weight) + } + + /// Returns weight of single parachain head storage update. + /// + /// This weight only includes db write operations that happens if parachain head is actually + /// updated. All extra weights (weight of storage proof validation, additional checks, ...) is + /// not included. + fn parachain_head_storage_write_weight(db_weight: RuntimeDbWeight) -> Weight { + // it's just a couple of operations - we need to write the hash (`ImportedParaHashes`) and + // the head itself (`ImportedParaHeads`. Pruning is not included here + db_weight.writes(2) + } + + /// Returns weight of single parachain head pruning. + fn parachain_head_pruning_weight(db_weight: RuntimeDbWeight) -> Weight { + // it's just one write operation, we don't want any benchmarks for that + db_weight.writes(1) + } + + /// Returns weight that needs to be accounted when storage proof of given size is received. + fn storage_proof_size_overhead(extra_proof_bytes: u32) -> Weight { + let extra_byte_weight = (Self::submit_parachain_heads_with_16kb_proof() - + Self::submit_parachain_heads_with_1kb_proof()) / + (15 * 1024); + extra_byte_weight.saturating_mul(extra_proof_bytes as u64) + } +} + +impl WeightInfoExt for () { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } +} + +impl WeightInfoExt for BridgeWeight { + fn expected_extra_storage_proof_size() -> u32 { + EXTRA_STORAGE_PROOF_SIZE + } +} diff --git a/modules/relayers/Cargo.toml b/modules/relayers/Cargo.toml new file mode 100644 index 000000000000..cbaedd4c73ee --- /dev/null +++ b/modules/relayers/Cargo.toml @@ -0,0 +1,67 @@ +[package] +name = "pallet-bridge-relayers" +description = "Module used to store relayer rewards and coordinate relayers set." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Bridge dependencies + +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-relayers = { path = "../../primitives/relayers", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +pallet-bridge-messages = { path = "../messages", default-features = false } + +# Substrate Dependencies + +frame-benchmarking = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-arithmetic = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +bp-runtime = { path = "../../primitives/runtime" } +pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-relayers/std", + "bp-runtime/std", + "codec/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "log/std", + "pallet-bridge-messages/std", + "scale-info/std", + "sp-arithmetic/std", + "sp-runtime/std", + "sp-std/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-bridge-messages/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-balances/try-runtime", + "pallet-bridge-messages/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/cumulus/bridges/modules/relayers/README.md b/modules/relayers/README.md similarity index 100% rename from cumulus/bridges/modules/relayers/README.md rename to modules/relayers/README.md diff --git a/modules/relayers/src/benchmarking.rs b/modules/relayers/src/benchmarking.rs new file mode 100644 index 000000000000..2d74ab38f9db --- /dev/null +++ b/modules/relayers/src/benchmarking.rs @@ -0,0 +1,131 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Benchmarks for the relayers Pallet. + +#![cfg(feature = "runtime-benchmarks")] + +use crate::*; + +use bp_messages::LaneId; +use bp_relayers::RewardsAccountOwner; +use frame_benchmarking::{benchmarks, whitelisted_caller}; +use frame_system::RawOrigin; +use sp_runtime::traits::One; + +/// Reward amount that is (hopefully) is larger than existential deposit across all chains. +const REWARD_AMOUNT: u32 = u32::MAX; + +/// Pallet we're benchmarking here. +pub struct Pallet(crate::Pallet); + +/// Trait that must be implemented by runtime. +pub trait Config: crate::Config { + /// Prepare environment for paying given reward for serving given lane. + fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Self::Reward); + /// Give enough balance to given account. + fn deposit_account(account: Self::AccountId, balance: Self::Reward); +} + +benchmarks! { + // Benchmark `claim_rewards` call. + claim_rewards { + let lane = LaneId([0, 0, 0, 0]); + let account_params = + RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); + let relayer: T::AccountId = whitelisted_caller(); + let reward = T::Reward::from(REWARD_AMOUNT); + + T::prepare_rewards_account(account_params, reward); + RelayerRewards::::insert(&relayer, account_params, reward); + }: _(RawOrigin::Signed(relayer), account_params) + verify { + // we can't check anything here, because `PaymentProcedure` is responsible for + // payment logic, so we assume that if call has succeeded, the procedure has + // also completed successfully + } + + // Benchmark `register` call. + register { + let relayer: T::AccountId = whitelisted_caller(); + let valid_till = frame_system::Pallet::::block_number() + .saturating_add(crate::Pallet::::required_registration_lease()) + .saturating_add(One::one()) + .saturating_add(One::one()); + + T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); + }: _(RawOrigin::Signed(relayer.clone()), valid_till) + verify { + assert!(crate::Pallet::::is_registration_active(&relayer)); + } + + // Benchmark `deregister` call. + deregister { + let relayer: T::AccountId = whitelisted_caller(); + let valid_till = frame_system::Pallet::::block_number() + .saturating_add(crate::Pallet::::required_registration_lease()) + .saturating_add(One::one()) + .saturating_add(One::one()); + T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); + crate::Pallet::::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap(); + + frame_system::Pallet::::set_block_number(valid_till.saturating_add(One::one())); + }: _(RawOrigin::Signed(relayer.clone())) + verify { + assert!(!crate::Pallet::::is_registration_active(&relayer)); + } + + // Benchmark `slash_and_deregister` method of the pallet. We are adding this weight to + // the weight of message delivery call if `RefundBridgedParachainMessages` signed extension + // is deployed at runtime level. + slash_and_deregister { + // prepare and register relayer account + let relayer: T::AccountId = whitelisted_caller(); + let valid_till = frame_system::Pallet::::block_number() + .saturating_add(crate::Pallet::::required_registration_lease()) + .saturating_add(One::one()) + .saturating_add(One::one()); + T::deposit_account(relayer.clone(), crate::Pallet::::required_stake()); + crate::Pallet::::register(RawOrigin::Signed(relayer.clone()).into(), valid_till).unwrap(); + + // create slash destination account + let lane = LaneId([0, 0, 0, 0]); + let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); + T::prepare_rewards_account(slash_destination.clone(), Zero::zero()); + }: { + crate::Pallet::::slash_and_deregister(&relayer, slash_destination) + } + verify { + assert!(!crate::Pallet::::is_registration_active(&relayer)); + } + + // Benchmark `register_relayer_reward` method of the pallet. We are adding this weight to + // the weight of message delivery call if `RefundBridgedParachainMessages` signed extension + // is deployed at runtime level. + register_relayer_reward { + let lane = LaneId([0, 0, 0, 0]); + let relayer: T::AccountId = whitelisted_caller(); + let account_params = + RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); + }: { + crate::Pallet::::register_relayer_reward(account_params.clone(), &relayer, One::one()); + } + verify { + assert_eq!(RelayerRewards::::get(relayer, &account_params), Some(One::one())); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::TestRuntime) +} diff --git a/modules/relayers/src/lib.rs b/modules/relayers/src/lib.rs new file mode 100644 index 000000000000..ce66c9df48e0 --- /dev/null +++ b/modules/relayers/src/lib.rs @@ -0,0 +1,922 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Runtime module that is used to store relayer rewards and (in the future) to +//! coordinate relations between relayers. + +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + +use bp_relayers::{ + PaymentProcedure, Registration, RelayerRewardsKeyProvider, RewardsAccountParams, StakeAndSlash, +}; +use bp_runtime::StorageDoubleMapKeyProvider; +use frame_support::fail; +use sp_arithmetic::traits::{AtLeast32BitUnsigned, Zero}; +use sp_runtime::{traits::CheckedSub, Saturating}; +use sp_std::marker::PhantomData; + +pub use pallet::*; +pub use payment_adapter::DeliveryConfirmationPaymentsAdapter; +pub use stake_adapter::StakeAndSlashNamed; +pub use weights::WeightInfo; +pub use weights_ext::WeightInfoExt; + +pub mod benchmarking; + +mod mock; +mod payment_adapter; +mod stake_adapter; +mod weights_ext; + +pub mod weights; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-relayers"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + /// `RelayerRewardsKeyProvider` for given configuration. + type RelayerRewardsKeyProviderOf = + RelayerRewardsKeyProvider<::AccountId, ::Reward>; + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The overarching event type. + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// Type of relayer reward. + type Reward: AtLeast32BitUnsigned + Copy + Parameter + MaxEncodedLen; + /// Pay rewards scheme. + type PaymentProcedure: PaymentProcedure; + /// Stake and slash scheme. + type StakeAndSlash: StakeAndSlash, Self::Reward>; + /// Pallet call weights. + type WeightInfo: WeightInfoExt; + } + + #[pallet::pallet] + pub struct Pallet(PhantomData); + + #[pallet::call] + impl Pallet { + /// Claim accumulated rewards. + #[pallet::call_index(0)] + #[pallet::weight(T::WeightInfo::claim_rewards())] + pub fn claim_rewards( + origin: OriginFor, + rewards_account_params: RewardsAccountParams, + ) -> DispatchResult { + let relayer = ensure_signed(origin)?; + + RelayerRewards::::try_mutate_exists( + &relayer, + rewards_account_params, + |maybe_reward| -> DispatchResult { + let reward = maybe_reward.take().ok_or(Error::::NoRewardForRelayer)?; + T::PaymentProcedure::pay_reward(&relayer, rewards_account_params, reward) + .map_err(|e| { + log::trace!( + target: LOG_TARGET, + "Failed to pay {:?} rewards to {:?}: {:?}", + rewards_account_params, + relayer, + e, + ); + Error::::FailedToPayReward + })?; + + Self::deposit_event(Event::::RewardPaid { + relayer: relayer.clone(), + rewards_account_params, + reward, + }); + Ok(()) + }, + ) + } + + /// Register relayer or update its registration. + /// + /// Registration allows relayer to get priority boost for its message delivery transactions. + #[pallet::call_index(1)] + #[pallet::weight(T::WeightInfo::register())] + pub fn register(origin: OriginFor, valid_till: BlockNumberFor) -> DispatchResult { + let relayer = ensure_signed(origin)?; + + // valid till must be larger than the current block number and the lease must be larger + // than the `RequiredRegistrationLease` + let lease = valid_till.saturating_sub(frame_system::Pallet::::block_number()); + ensure!( + lease > Pallet::::required_registration_lease(), + Error::::InvalidRegistrationLease + ); + + RegisteredRelayers::::try_mutate(&relayer, |maybe_registration| -> DispatchResult { + let mut registration = maybe_registration + .unwrap_or_else(|| Registration { valid_till, stake: Zero::zero() }); + + // new `valid_till` must be larger (or equal) than the old one + ensure!( + valid_till >= registration.valid_till, + Error::::CannotReduceRegistrationLease, + ); + registration.valid_till = valid_till; + + // regarding stake, there are three options: + // - if relayer stake is larger than required stake, we may do unreserve + // - if relayer stake equals to required stake, we do nothing + // - if relayer stake is smaller than required stake, we do additional reserve + let required_stake = Pallet::::required_stake(); + if let Some(to_unreserve) = registration.stake.checked_sub(&required_stake) { + Self::do_unreserve(&relayer, to_unreserve)?; + } else if let Some(to_reserve) = required_stake.checked_sub(®istration.stake) { + T::StakeAndSlash::reserve(&relayer, to_reserve).map_err(|e| { + log::trace!( + target: LOG_TARGET, + "Failed to reserve {:?} on relayer {:?} account: {:?}", + to_reserve, + relayer, + e, + ); + + Error::::FailedToReserve + })?; + } + registration.stake = required_stake; + + log::trace!(target: LOG_TARGET, "Successfully registered relayer: {:?}", relayer); + Self::deposit_event(Event::::RegistrationUpdated { + relayer: relayer.clone(), + registration, + }); + + *maybe_registration = Some(registration); + + Ok(()) + }) + } + + /// `Deregister` relayer. + /// + /// After this call, message delivery transactions of the relayer won't get any priority + /// boost. + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::deregister())] + pub fn deregister(origin: OriginFor) -> DispatchResult { + let relayer = ensure_signed(origin)?; + + RegisteredRelayers::::try_mutate(&relayer, |maybe_registration| -> DispatchResult { + let registration = match maybe_registration.take() { + Some(registration) => registration, + None => fail!(Error::::NotRegistered), + }; + + // we can't deregister until `valid_till + 1` + ensure!( + registration.valid_till < frame_system::Pallet::::block_number(), + Error::::RegistrationIsStillActive, + ); + + // if stake is non-zero, we should do unreserve + if !registration.stake.is_zero() { + Self::do_unreserve(&relayer, registration.stake)?; + } + + log::trace!(target: LOG_TARGET, "Successfully deregistered relayer: {:?}", relayer); + Self::deposit_event(Event::::Deregistered { relayer: relayer.clone() }); + + *maybe_registration = None; + + Ok(()) + }) + } + } + + impl Pallet { + /// Returns true if given relayer registration is active at current block. + /// + /// This call respects both `RequiredStake` and `RequiredRegistrationLease`, meaning that + /// it'll return false if registered stake is lower than required or if remaining lease + /// is less than `RequiredRegistrationLease`. + pub fn is_registration_active(relayer: &T::AccountId) -> bool { + let registration = match Self::registered_relayer(relayer) { + Some(registration) => registration, + None => return false, + }; + + // registration is inactive if relayer stake is less than required + if registration.stake < Self::required_stake() { + return false + } + + // registration is inactive if it ends soon + let remaining_lease = registration + .valid_till + .saturating_sub(frame_system::Pallet::::block_number()); + if remaining_lease <= Self::required_registration_lease() { + return false + } + + true + } + + /// Slash and `deregister` relayer. This function slashes all staked balance. + /// + /// It may fail inside, but error is swallowed and we only log it. + pub fn slash_and_deregister( + relayer: &T::AccountId, + slash_destination: RewardsAccountParams, + ) { + let registration = match RegisteredRelayers::::take(relayer) { + Some(registration) => registration, + None => { + log::trace!( + target: crate::LOG_TARGET, + "Cannot slash unregistered relayer {:?}", + relayer, + ); + + return + }, + }; + + match T::StakeAndSlash::repatriate_reserved( + relayer, + slash_destination, + registration.stake, + ) { + Ok(failed_to_slash) if failed_to_slash.is_zero() => { + log::trace!( + target: crate::LOG_TARGET, + "Relayer account {:?} has been slashed for {:?}. Funds were deposited to {:?}", + relayer, + registration.stake, + slash_destination, + ); + }, + Ok(failed_to_slash) => { + log::trace!( + target: crate::LOG_TARGET, + "Relayer account {:?} has been partially slashed for {:?}. Funds were deposited to {:?}. \ + Failed to slash: {:?}", + relayer, + registration.stake, + slash_destination, + failed_to_slash, + ); + }, + Err(e) => { + // TODO: document this. Where? + + // it may fail if there's no beneficiary account. For us it means that this + // account must exists before we'll deploy the bridge + log::debug!( + target: crate::LOG_TARGET, + "Failed to slash relayer account {:?}: {:?}. Maybe beneficiary account doesn't exist? \ + Beneficiary: {:?}, amount: {:?}, failed to slash: {:?}", + relayer, + e, + slash_destination, + registration.stake, + registration.stake, + ); + }, + } + } + + /// Register reward for given relayer. + pub fn register_relayer_reward( + rewards_account_params: RewardsAccountParams, + relayer: &T::AccountId, + reward: T::Reward, + ) { + if reward.is_zero() { + return + } + + RelayerRewards::::mutate( + relayer, + rewards_account_params, + |old_reward: &mut Option| { + let new_reward = old_reward.unwrap_or_else(Zero::zero).saturating_add(reward); + *old_reward = Some(new_reward); + + log::trace!( + target: crate::LOG_TARGET, + "Relayer {:?} can now claim reward for serving payer {:?}: {:?}", + relayer, + rewards_account_params, + new_reward, + ); + + Self::deposit_event(Event::::RewardRegistered { + relayer: relayer.clone(), + rewards_account_params, + reward, + }); + }, + ); + } + + /// Return required registration lease. + pub(crate) fn required_registration_lease() -> BlockNumberFor { + , + T::Reward, + >>::RequiredRegistrationLease::get() + } + + /// Return required stake. + pub(crate) fn required_stake() -> T::Reward { + , + T::Reward, + >>::RequiredStake::get() + } + + /// `Unreserve` given amount on relayer account. + fn do_unreserve(relayer: &T::AccountId, amount: T::Reward) -> DispatchResult { + let failed_to_unreserve = T::StakeAndSlash::unreserve(relayer, amount); + if !failed_to_unreserve.is_zero() { + log::trace!( + target: LOG_TARGET, + "Failed to unreserve {:?}/{:?} on relayer {:?} account", + failed_to_unreserve, + amount, + relayer, + ); + + fail!(Error::::FailedToUnreserve) + } + + Ok(()) + } + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// Relayer reward has been registered and may be claimed later. + RewardRegistered { + /// Relayer account that can claim reward. + relayer: T::AccountId, + /// Relayer can claim reward from this account. + rewards_account_params: RewardsAccountParams, + /// Reward amount. + reward: T::Reward, + }, + /// Reward has been paid to the relayer. + RewardPaid { + /// Relayer account that has been rewarded. + relayer: T::AccountId, + /// Relayer has received reward from this account. + rewards_account_params: RewardsAccountParams, + /// Reward amount. + reward: T::Reward, + }, + /// Relayer registration has been added or updated. + RegistrationUpdated { + /// Relayer account that has been registered. + relayer: T::AccountId, + /// Relayer registration. + registration: Registration, T::Reward>, + }, + /// Relayer has been `deregistered`. + Deregistered { + /// Relayer account that has been `deregistered`. + relayer: T::AccountId, + }, + /// Relayer has been slashed and `deregistered`. + SlashedAndDeregistered { + /// Relayer account that has been `deregistered`. + relayer: T::AccountId, + /// Registration that was removed. + registration: Registration, T::Reward>, + }, + } + + #[pallet::error] + pub enum Error { + /// No reward can be claimed by given relayer. + NoRewardForRelayer, + /// Reward payment procedure has failed. + FailedToPayReward, + /// The relayer has tried to register for past block or registration lease + /// is too short. + InvalidRegistrationLease, + /// New registration lease is less than the previous one. + CannotReduceRegistrationLease, + /// Failed to reserve enough funds on relayer account. + FailedToReserve, + /// Failed to `unreserve` enough funds on relayer account. + FailedToUnreserve, + /// Cannot `deregister` if not registered. + NotRegistered, + /// Failed to `deregister` relayer, because lease is still active. + RegistrationIsStillActive, + } + + /// Map of the relayer => accumulated reward. + #[pallet::storage] + #[pallet::getter(fn relayer_reward)] + pub type RelayerRewards = StorageDoubleMap< + _, + as StorageDoubleMapKeyProvider>::Hasher1, + as StorageDoubleMapKeyProvider>::Key1, + as StorageDoubleMapKeyProvider>::Hasher2, + as StorageDoubleMapKeyProvider>::Key2, + as StorageDoubleMapKeyProvider>::Value, + OptionQuery, + >; + + /// Relayers that have reserved some of their balance to get free priority boost + /// for their message delivery transactions. + /// + /// Other relayers may submit transactions as well, but they will have default + /// priority and will be rejected (without significant tip) in case if registered + /// relayer is present. + #[pallet::storage] + #[pallet::getter(fn registered_relayer)] + pub type RegisteredRelayers = StorageMap< + _, + Blake2_128Concat, + T::AccountId, + Registration, T::Reward>, + OptionQuery, + >; +} + +#[cfg(test)] +mod tests { + use super::*; + use mock::{RuntimeEvent as TestEvent, *}; + + use crate::Event::{RewardPaid, RewardRegistered}; + use bp_messages::LaneId; + use bp_relayers::RewardsAccountOwner; + use frame_support::{ + assert_noop, assert_ok, + traits::fungible::{Inspect, Mutate}, + }; + use frame_system::{EventRecord, Pallet as System, Phase}; + use sp_runtime::DispatchError; + + fn get_ready_for_events() { + System::::set_block_number(1); + System::::reset_events(); + } + + #[test] + fn register_relayer_reward_emit_event() { + run_test(|| { + get_ready_for_events(); + + Pallet::::register_relayer_reward( + TEST_REWARDS_ACCOUNT_PARAMS, + ®ULAR_RELAYER, + 100, + ); + + // Check if the `RewardRegistered` event was emitted. + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(RewardRegistered { + relayer: REGULAR_RELAYER, + rewards_account_params: TEST_REWARDS_ACCOUNT_PARAMS, + reward: 100 + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn root_cant_claim_anything() { + run_test(|| { + assert_noop!( + Pallet::::claim_rewards( + RuntimeOrigin::root(), + TEST_REWARDS_ACCOUNT_PARAMS + ), + DispatchError::BadOrigin, + ); + }); + } + + #[test] + fn relayer_cant_claim_if_no_reward_exists() { + run_test(|| { + assert_noop!( + Pallet::::claim_rewards( + RuntimeOrigin::signed(REGULAR_RELAYER), + TEST_REWARDS_ACCOUNT_PARAMS + ), + Error::::NoRewardForRelayer, + ); + }); + } + + #[test] + fn relayer_cant_claim_if_payment_procedure_fails() { + run_test(|| { + RelayerRewards::::insert( + FAILING_RELAYER, + TEST_REWARDS_ACCOUNT_PARAMS, + 100, + ); + assert_noop!( + Pallet::::claim_rewards( + RuntimeOrigin::signed(FAILING_RELAYER), + TEST_REWARDS_ACCOUNT_PARAMS + ), + Error::::FailedToPayReward, + ); + }); + } + + #[test] + fn relayer_can_claim_reward() { + run_test(|| { + get_ready_for_events(); + + RelayerRewards::::insert( + REGULAR_RELAYER, + TEST_REWARDS_ACCOUNT_PARAMS, + 100, + ); + assert_ok!(Pallet::::claim_rewards( + RuntimeOrigin::signed(REGULAR_RELAYER), + TEST_REWARDS_ACCOUNT_PARAMS + )); + assert_eq!( + RelayerRewards::::get(REGULAR_RELAYER, TEST_REWARDS_ACCOUNT_PARAMS), + None + ); + + // Check if the `RewardPaid` event was emitted. + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(RewardPaid { + relayer: REGULAR_RELAYER, + rewards_account_params: TEST_REWARDS_ACCOUNT_PARAMS, + reward: 100 + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn pay_reward_from_account_actually_pays_reward() { + type Balances = pallet_balances::Pallet; + type PayLaneRewardFromAccount = bp_relayers::PayRewardFromAccount; + + run_test(|| { + let in_lane_0 = RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::ThisChain, + ); + let out_lane_1 = RewardsAccountParams::new( + LaneId([0, 0, 0, 1]), + *b"test", + RewardsAccountOwner::BridgedChain, + ); + + let in_lane0_rewards_account = PayLaneRewardFromAccount::rewards_account(in_lane_0); + let out_lane1_rewards_account = PayLaneRewardFromAccount::rewards_account(out_lane_1); + + Balances::mint_into(&in_lane0_rewards_account, 100).unwrap(); + Balances::mint_into(&out_lane1_rewards_account, 100).unwrap(); + assert_eq!(Balances::balance(&in_lane0_rewards_account), 100); + assert_eq!(Balances::balance(&out_lane1_rewards_account), 100); + assert_eq!(Balances::balance(&1), 0); + + PayLaneRewardFromAccount::pay_reward(&1, in_lane_0, 100).unwrap(); + assert_eq!(Balances::balance(&in_lane0_rewards_account), 0); + assert_eq!(Balances::balance(&out_lane1_rewards_account), 100); + assert_eq!(Balances::balance(&1), 100); + + PayLaneRewardFromAccount::pay_reward(&1, out_lane_1, 100).unwrap(); + assert_eq!(Balances::balance(&in_lane0_rewards_account), 0); + assert_eq!(Balances::balance(&out_lane1_rewards_account), 0); + assert_eq!(Balances::balance(&1), 200); + }); + } + + #[test] + fn register_fails_if_valid_till_is_a_past_block() { + run_test(|| { + System::::set_block_number(100); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 50), + Error::::InvalidRegistrationLease, + ); + }); + } + + #[test] + fn register_fails_if_valid_till_lease_is_less_than_required() { + run_test(|| { + System::::set_block_number(100); + + assert_noop!( + Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 99 + Lease::get() + ), + Error::::InvalidRegistrationLease, + ); + }); + } + + #[test] + fn register_works() { + run_test(|| { + get_ready_for_events(); + + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); + assert_eq!( + Pallet::::registered_relayer(REGISTER_RELAYER), + Some(Registration { valid_till: 150, stake: Stake::get() }), + ); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::RegistrationUpdated { + relayer: REGISTER_RELAYER, + registration: Registration { valid_till: 150, stake: Stake::get() }, + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn register_fails_if_new_valid_till_is_lesser_than_previous() { + run_test(|| { + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 125), + Error::::CannotReduceRegistrationLease, + ); + }); + } + + #[test] + fn register_fails_if_it_cant_unreserve_some_balance_if_required_stake_decreases() { + run_test(|| { + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() + 1 }, + ); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), + Error::::FailedToUnreserve, + ); + }); + } + + #[test] + fn register_unreserves_some_balance_if_required_stake_decreases() { + run_test(|| { + get_ready_for_events(); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() + 1 }, + ); + TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() + 1).unwrap(); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get() + 1); + let free_balance = Balances::free_balance(REGISTER_RELAYER); + + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); + assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + 1); + assert_eq!( + Pallet::::registered_relayer(REGISTER_RELAYER), + Some(Registration { valid_till: 150, stake: Stake::get() }), + ); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::RegistrationUpdated { + relayer: REGISTER_RELAYER, + registration: Registration { valid_till: 150, stake: Stake::get() } + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn register_fails_if_it_cant_reserve_some_balance() { + run_test(|| { + Balances::set_balance(®ISTER_RELAYER, 0); + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), + Error::::FailedToReserve, + ); + }); + } + + #[test] + fn register_fails_if_it_cant_reserve_some_balance_if_required_stake_increases() { + run_test(|| { + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() - 1 }, + ); + Balances::set_balance(®ISTER_RELAYER, 0); + + assert_noop!( + Pallet::::register(RuntimeOrigin::signed(REGISTER_RELAYER), 150), + Error::::FailedToReserve, + ); + }); + } + + #[test] + fn register_reserves_some_balance_if_required_stake_increases() { + run_test(|| { + get_ready_for_events(); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() - 1 }, + ); + TestStakeAndSlash::reserve(®ISTER_RELAYER, Stake::get() - 1).unwrap(); + + let free_balance = Balances::free_balance(REGISTER_RELAYER); + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + assert_eq!(Balances::reserved_balance(REGISTER_RELAYER), Stake::get()); + assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance - 1); + assert_eq!( + Pallet::::registered_relayer(REGISTER_RELAYER), + Some(Registration { valid_till: 150, stake: Stake::get() }), + ); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::RegistrationUpdated { + relayer: REGISTER_RELAYER, + registration: Registration { valid_till: 150, stake: Stake::get() } + }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn deregister_fails_if_not_registered() { + run_test(|| { + assert_noop!( + Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)), + Error::::NotRegistered, + ); + }); + } + + #[test] + fn deregister_fails_if_registration_is_still_active() { + run_test(|| { + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + + System::::set_block_number(100); + + assert_noop!( + Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER)), + Error::::RegistrationIsStillActive, + ); + }); + } + + #[test] + fn deregister_works() { + run_test(|| { + get_ready_for_events(); + + assert_ok!(Pallet::::register( + RuntimeOrigin::signed(REGISTER_RELAYER), + 150 + )); + + System::::set_block_number(151); + + let reserved_balance = Balances::reserved_balance(REGISTER_RELAYER); + let free_balance = Balances::free_balance(REGISTER_RELAYER); + assert_ok!(Pallet::::deregister(RuntimeOrigin::signed(REGISTER_RELAYER))); + assert_eq!( + Balances::reserved_balance(REGISTER_RELAYER), + reserved_balance - Stake::get() + ); + assert_eq!(Balances::free_balance(REGISTER_RELAYER), free_balance + Stake::get()); + + assert_eq!( + System::::events().last(), + Some(&EventRecord { + phase: Phase::Initialization, + event: TestEvent::Relayers(Event::Deregistered { relayer: REGISTER_RELAYER }), + topics: vec![], + }), + ); + }); + } + + #[test] + fn is_registration_active_is_false_for_unregistered_relayer() { + run_test(|| { + assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } + + #[test] + fn is_registration_active_is_false_when_stake_is_too_low() { + run_test(|| { + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() - 1 }, + ); + assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } + + #[test] + fn is_registration_active_is_false_when_remaining_lease_is_too_low() { + run_test(|| { + System::::set_block_number(150 - Lease::get()); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 150, stake: Stake::get() }, + ); + assert!(!Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } + + #[test] + fn is_registration_active_is_true_when_relayer_is_properly_registeered() { + run_test(|| { + System::::set_block_number(150 - Lease::get()); + + RegisteredRelayers::::insert( + REGISTER_RELAYER, + Registration { valid_till: 151, stake: Stake::get() }, + ); + assert!(Pallet::::is_registration_active(®ISTER_RELAYER)); + }); + } +} diff --git a/modules/relayers/src/mock.rs b/modules/relayers/src/mock.rs new file mode 100644 index 000000000000..667b10e5c125 --- /dev/null +++ b/modules/relayers/src/mock.rs @@ -0,0 +1,149 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg(test)] + +use crate as pallet_bridge_relayers; + +use bp_messages::LaneId; +use bp_relayers::{ + PayRewardFromAccount, PaymentProcedure, RewardsAccountOwner, RewardsAccountParams, +}; +use frame_support::{ + derive_impl, parameter_types, traits::fungible::Mutate, weights::RuntimeDbWeight, +}; +use sp_runtime::BuildStorage; + +pub type AccountId = u64; +pub type Balance = u64; +pub type BlockNumber = u64; + +pub type TestStakeAndSlash = pallet_bridge_relayers::StakeAndSlashNamed< + AccountId, + BlockNumber, + Balances, + ReserveId, + Stake, + Lease, +>; + +type Block = frame_system::mocking::MockBlock; + +frame_support::construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Event}, + Relayers: pallet_bridge_relayers::{Pallet, Call, Event}, + } +} + +parameter_types! { + pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; + pub const ExistentialDeposit: Balance = 1; + pub const ReserveId: [u8; 8] = *b"brdgrlrs"; + pub const Stake: Balance = 1_000; + pub const Lease: BlockNumber = 8; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; + type AccountData = pallet_balances::AccountData; + type DbWeight = DbWeight; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +impl pallet_balances::Config for TestRuntime { + type ReserveIdentifier = [u8; 8]; + type AccountStore = System; +} + +impl pallet_bridge_relayers::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type Reward = Balance; + type PaymentProcedure = TestPaymentProcedure; + type StakeAndSlash = TestStakeAndSlash; + type WeightInfo = (); +} + +#[cfg(feature = "runtime-benchmarks")] +impl pallet_bridge_relayers::benchmarking::Config for TestRuntime { + fn prepare_rewards_account(account_params: RewardsAccountParams, reward: Balance) { + let rewards_account = + bp_relayers::PayRewardFromAccount::::rewards_account( + account_params, + ); + Self::deposit_account(rewards_account, reward); + } + + fn deposit_account(account: Self::AccountId, balance: Self::Reward) { + Balances::mint_into(&account, balance.saturating_add(ExistentialDeposit::get())).unwrap(); + } +} + +/// Message lane that we're using in tests. +pub const TEST_REWARDS_ACCOUNT_PARAMS: RewardsAccountParams = + RewardsAccountParams::new(LaneId([0, 0, 0, 0]), *b"test", RewardsAccountOwner::ThisChain); + +/// Regular relayer that may receive rewards. +pub const REGULAR_RELAYER: AccountId = 1; + +/// Relayer that can't receive rewards. +pub const FAILING_RELAYER: AccountId = 2; + +/// Relayer that is able to register. +pub const REGISTER_RELAYER: AccountId = 42; + +/// Payment procedure that rejects payments to the `FAILING_RELAYER`. +pub struct TestPaymentProcedure; + +impl TestPaymentProcedure { + pub fn rewards_account(params: RewardsAccountParams) -> AccountId { + PayRewardFromAccount::<(), AccountId>::rewards_account(params) + } +} + +impl PaymentProcedure for TestPaymentProcedure { + type Error = (); + + fn pay_reward( + relayer: &AccountId, + _lane_id: RewardsAccountParams, + _reward: Balance, + ) -> Result<(), Self::Error> { + match *relayer { + FAILING_RELAYER => Err(()), + _ => Ok(()), + } + } +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + sp_io::TestExternalities::new(t) +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(|| { + Balances::mint_into(®ISTER_RELAYER, ExistentialDeposit::get() + 10 * Stake::get()) + .unwrap(); + + test() + }) +} diff --git a/cumulus/bridges/modules/relayers/src/payment_adapter.rs b/modules/relayers/src/payment_adapter.rs similarity index 98% rename from cumulus/bridges/modules/relayers/src/payment_adapter.rs rename to modules/relayers/src/payment_adapter.rs index a9536cfc0275..b2d9c676bddc 100644 --- a/cumulus/bridges/modules/relayers/src/payment_adapter.rs +++ b/modules/relayers/src/payment_adapter.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify diff --git a/cumulus/bridges/modules/relayers/src/stake_adapter.rs b/modules/relayers/src/stake_adapter.rs similarity index 99% rename from cumulus/bridges/modules/relayers/src/stake_adapter.rs rename to modules/relayers/src/stake_adapter.rs index 055b6a111ec7..88af9b1877bf 100644 --- a/cumulus/bridges/modules/relayers/src/stake_adapter.rs +++ b/modules/relayers/src/stake_adapter.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify diff --git a/modules/relayers/src/weights.rs b/modules/relayers/src/weights.rs new file mode 100644 index 000000000000..c2c065b0c0a2 --- /dev/null +++ b/modules/relayers/src/weights.rs @@ -0,0 +1,259 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_bridge_relayers +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-04-28, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/rip-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_bridge_relayers +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/relayers/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_bridge_relayers. +pub trait WeightInfo { + fn claim_rewards() -> Weight; + fn register() -> Weight; + fn deregister() -> Weight; + fn slash_and_deregister() -> Weight; + fn register_relayer_reward() -> Weight; +} + +/// Weights for `pallet_bridge_relayers` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances TotalIssuance (r:1 w:0) + /// + /// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn claim_rewards() -> Weight { + // Proof Size summary in bytes: + // Measured: `294` + // Estimated: `8592` + // Minimum execution time: 77_614 nanoseconds. + Weight::from_parts(79_987_000, 8592) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn register() -> Weight { + // Proof Size summary in bytes: + // Measured: `87` + // Estimated: `7843` + // Minimum execution time: 39_590 nanoseconds. + Weight::from_parts(40_546_000, 7843) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `264` + // Estimated: `7843` + // Minimum execution time: 43_332 nanoseconds. + Weight::from_parts(45_087_000, 7843) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn slash_and_deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `380` + // Estimated: `11412` + // Minimum execution time: 42_358 nanoseconds. + Weight::from_parts(43_539_000, 11412) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn register_relayer_reward() -> Weight { + // Proof Size summary in bytes: + // Measured: `12` + // Estimated: `3530` + // Minimum execution time: 6_338 nanoseconds. + Weight::from_parts(6_526_000, 3530) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances TotalIssuance (r:1 w:0) + /// + /// Proof: Balances TotalIssuance (max_values: Some(1), max_size: Some(8), added: 503, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn claim_rewards() -> Weight { + // Proof Size summary in bytes: + // Measured: `294` + // Estimated: `8592` + // Minimum execution time: 77_614 nanoseconds. + Weight::from_parts(79_987_000, 8592) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn register() -> Weight { + // Proof Size summary in bytes: + // Measured: `87` + // Estimated: `7843` + // Minimum execution time: 39_590 nanoseconds. + Weight::from_parts(40_546_000, 7843) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + fn deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `264` + // Estimated: `7843` + // Minimum execution time: 43_332 nanoseconds. + Weight::from_parts(45_087_000, 7843) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: BridgeRelayers RegisteredRelayers (r:1 w:1) + /// + /// Proof: BridgeRelayers RegisteredRelayers (max_values: None, max_size: Some(64), added: 2539, + /// mode: MaxEncodedLen) + /// + /// Storage: Balances Reserves (r:1 w:1) + /// + /// Proof: Balances Reserves (max_values: None, max_size: Some(849), added: 3324, mode: + /// MaxEncodedLen) + /// + /// Storage: System Account (r:1 w:1) + /// + /// Proof: System Account (max_values: None, max_size: Some(104), added: 2579, mode: + /// MaxEncodedLen) + fn slash_and_deregister() -> Weight { + // Proof Size summary in bytes: + // Measured: `380` + // Estimated: `11412` + // Minimum execution time: 42_358 nanoseconds. + Weight::from_parts(43_539_000, 11412) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: BridgeRelayers RelayerRewards (r:1 w:1) + /// + /// Proof: BridgeRelayers RelayerRewards (max_values: None, max_size: Some(65), added: 2540, + /// mode: MaxEncodedLen) + fn register_relayer_reward() -> Weight { + // Proof Size summary in bytes: + // Measured: `12` + // Estimated: `3530` + // Minimum execution time: 6_338 nanoseconds. + Weight::from_parts(6_526_000, 3530) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/modules/relayers/src/weights_ext.rs b/modules/relayers/src/weights_ext.rs new file mode 100644 index 000000000000..9cd25c47c378 --- /dev/null +++ b/modules/relayers/src/weights_ext.rs @@ -0,0 +1,49 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Weight-related utilities. + +use crate::weights::WeightInfo; + +use frame_support::pallet_prelude::Weight; + +/// Extended weight info. +pub trait WeightInfoExt: WeightInfo { + /// Returns weight, that needs to be added to the pre-dispatch weight of message delivery call, + /// if `RefundBridgedParachainMessages` signed extension is deployed at runtime level. + fn receive_messages_proof_overhead_from_runtime() -> Weight { + Self::slash_and_deregister().max(Self::register_relayer_reward()) + } + + /// Returns weight, that needs to be added to the pre-dispatch weight of message delivery + /// confirmation call, if `RefundBridgedParachainMessages` signed extension is deployed at + /// runtime level. + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + Self::register_relayer_reward() + } + + /// Returns weight that we need to deduct from the message delivery call weight that has + /// completed successfully. + /// + /// Usually, the weight of `slash_and_deregister` is larger than the weight of the + /// `register_relayer_reward`. So if relayer has been rewarded, we want to deduct the difference + /// to get the actual post-dispatch weight. + fn extra_weight_of_successful_receive_messages_proof_call() -> Weight { + Self::slash_and_deregister().saturating_sub(Self::register_relayer_reward()) + } +} + +impl WeightInfoExt for T {} diff --git a/modules/xcm-bridge-hub-router/Cargo.toml b/modules/xcm-bridge-hub-router/Cargo.toml new file mode 100644 index 000000000000..e3a559cdc00a --- /dev/null +++ b/modules/xcm-bridge-hub-router/Cargo.toml @@ -0,0 +1,63 @@ +[package] +name = "pallet-xcm-bridge-hub-router" +description = "Bridge hub interface for sibling/parent chains with dynamic fees support." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive", "serde"] } + +# Bridge dependencies + +bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } + +# Substrate Dependencies + +frame-benchmarking = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, optional = true } +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +# Polkadot Dependencies + +xcm = { package = "staging-xcm", git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +xcm-builder = { package = "staging-xcm-builder", git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-xcm-bridge-hub-router/std", + "codec/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", + "xcm-builder/std", + "xcm/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/modules/xcm-bridge-hub-router/src/benchmarking.rs b/modules/xcm-bridge-hub-router/src/benchmarking.rs new file mode 100644 index 000000000000..c4d1e3971e74 --- /dev/null +++ b/modules/xcm-bridge-hub-router/src/benchmarking.rs @@ -0,0 +1,95 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! XCM bridge hub router pallet benchmarks. + +#![cfg(feature = "runtime-benchmarks")] + +use crate::{Bridge, Call}; + +use bp_xcm_bridge_hub_router::{BridgeState, MINIMAL_DELIVERY_FEE_FACTOR}; +use frame_benchmarking::benchmarks_instance_pallet; +use frame_support::traits::{EnsureOrigin, Get, Hooks, UnfilteredDispatchable}; +use sp_runtime::traits::Zero; +use xcm::prelude::*; + +/// Pallet we're benchmarking here. +pub struct Pallet, I: 'static = ()>(crate::Pallet); + +/// Trait that must be implemented by runtime to be able to benchmark pallet properly. +pub trait Config: crate::Config { + /// Fill up queue so it becomes congested. + fn make_congested(); + + /// Returns destination which is valid for this router instance. + /// (Needs to pass `T::Bridges`) + /// Make sure that `SendXcm` will pass. + fn ensure_bridged_target_destination() -> MultiLocation { + MultiLocation::new( + Self::UniversalLocation::get().len() as u8, + X1(GlobalConsensus(Self::BridgedNetworkId::get().unwrap())), + ) + } +} + +benchmarks_instance_pallet! { + on_initialize_when_non_congested { + Bridge::::put(BridgeState { + is_congested: false, + delivery_fee_factor: MINIMAL_DELIVERY_FEE_FACTOR + MINIMAL_DELIVERY_FEE_FACTOR, + }); + }: { + crate::Pallet::::on_initialize(Zero::zero()) + } + + on_initialize_when_congested { + Bridge::::put(BridgeState { + is_congested: false, + delivery_fee_factor: MINIMAL_DELIVERY_FEE_FACTOR + MINIMAL_DELIVERY_FEE_FACTOR, + }); + + let _ = T::ensure_bridged_target_destination(); + T::make_congested(); + }: { + crate::Pallet::::on_initialize(Zero::zero()) + } + + report_bridge_status { + Bridge::::put(BridgeState::default()); + + let origin: T::RuntimeOrigin = T::BridgeHubOrigin::try_successful_origin().expect("expected valid BridgeHubOrigin"); + let bridge_id = Default::default(); + let is_congested = true; + + let call = Call::::report_bridge_status { bridge_id, is_congested }; + }: { call.dispatch_bypass_filter(origin)? } + verify { + assert!(Bridge::::get().is_congested); + } + + send_message { + let dest = T::ensure_bridged_target_destination(); + let xcm = sp_std::vec![].into(); + + // make local queue congested, because it means additional db write + T::make_congested(); + }: { + send_xcm::>(dest, xcm).expect("message is sent") + } + verify { + assert!(Bridge::::get().delivery_fee_factor > MINIMAL_DELIVERY_FEE_FACTOR); + } +} diff --git a/modules/xcm-bridge-hub-router/src/lib.rs b/modules/xcm-bridge-hub-router/src/lib.rs new file mode 100644 index 000000000000..cf51ef82412f --- /dev/null +++ b/modules/xcm-bridge-hub-router/src/lib.rs @@ -0,0 +1,557 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Pallet that may be used instead of `SovereignPaidRemoteExporter` in the XCM router +//! configuration. The main thing that the pallet offers is the dynamic message fee, +//! that is computed based on the bridge queues state. It starts exponentially increasing +//! if the queue between this chain and the sibling/child bridge hub is congested. +//! +//! All other bridge hub queues offer some backpressure mechanisms. So if at least one +//! of all queues is congested, it will eventually lead to the growth of the queue at +//! this chain. +//! +//! **A note on terminology**: when we mention the bridge hub here, we mean the chain that +//! has the messages pallet deployed (`pallet-bridge-grandpa`, `pallet-bridge-messages`, +//! `pallet-xcm-bridge-hub`, ...). It may be the system bridge hub parachain or any other +//! chain. + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_xcm_bridge_hub_router::{ + BridgeState, XcmChannelStatusProvider, MINIMAL_DELIVERY_FEE_FACTOR, +}; +use codec::Encode; +use frame_support::traits::Get; +use sp_core::H256; +use sp_runtime::{FixedPointNumber, FixedU128, Saturating}; +use xcm::prelude::*; +use xcm_builder::{ExporterFor, SovereignPaidRemoteExporter}; + +pub use pallet::*; +pub use weights::WeightInfo; + +pub mod benchmarking; +pub mod weights; + +mod mock; + +/// The factor that is used to increase current message fee factor when bridge experiencing +/// some lags. +const EXPONENTIAL_FEE_BASE: FixedU128 = FixedU128::from_rational(105, 100); // 1.05 +/// The factor that is used to increase current message fee factor for every sent kilobyte. +const MESSAGE_SIZE_FEE_BASE: FixedU128 = FixedU128::from_rational(1, 1000); // 0.001 + +/// Maximal size of the XCM message that may be sent over bridge. +/// +/// This should be less than the maximal size, allowed by the messages pallet, because +/// the message itself is wrapped in other structs and is double encoded. +pub const HARD_MESSAGE_SIZE_LIMIT: u32 = 32 * 1024; + +/// The target that will be used when publishing logs related to this pallet. +/// +/// This doesn't match the pattern used by other bridge pallets (`runtime::bridge-*`). But this +/// pallet has significant differences with those pallets. The main one is that is intended to +/// be deployed at sending chains. Other bridge pallets are likely to be deployed at the separate +/// bridge hub parachain. +pub const LOG_TARGET: &str = "xcm::bridge-hub-router"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + /// Benchmarks results from runtime we're plugged into. + type WeightInfo: WeightInfo; + + /// Universal location of this runtime. + type UniversalLocation: Get; + /// The bridged network that this config is for if specified. + /// Also used for filtering `Bridges` by `BridgedNetworkId`. + /// If not specified, allows all networks pass through. + type BridgedNetworkId: Get>; + /// Configuration for supported **bridged networks/locations** with **bridge location** and + /// **possible fee**. Allows to externalize better control over allowed **bridged + /// networks/locations**. + type Bridges: ExporterFor; + + /// Origin of the sibling bridge hub that is allowed to report bridge status. + type BridgeHubOrigin: EnsureOrigin; + /// Actual message sender (`HRMP` or `DMP`) to the sibling bridge hub location. + type ToBridgeHubSender: SendXcm; + /// Underlying channel with the sibling bridge hub. It must match the channel, used + /// by the `Self::ToBridgeHubSender`. + type WithBridgeHubChannel: XcmChannelStatusProvider; + + /// Additional fee that is paid for every byte of the outbound message. + type ByteFee: Get; + /// Asset that is used to paid bridge fee. + type FeeAsset: Get; + } + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> Weight { + // TODO: make sure that `WithBridgeHubChannel::is_congested` returns true if either + // of XCM channels (outbound/inbound) is suspended. Because if outbound is suspended + // that is definitely congestion. If inbound is suspended, then we are not able to + // receive the "report_bridge_status" signal (that maybe sent by the bridge hub). + + // if the channel with sibling/child bridge hub is suspended, we don't change + // anything + if T::WithBridgeHubChannel::is_congested() { + return T::WeightInfo::on_initialize_when_congested() + } + + // if bridge has reported congestion, we don't change anything + let mut bridge = Self::bridge(); + if bridge.is_congested { + return T::WeightInfo::on_initialize_when_congested() + } + + // if fee factor is already minimal, we don't change anything + if bridge.delivery_fee_factor == MINIMAL_DELIVERY_FEE_FACTOR { + return T::WeightInfo::on_initialize_when_congested() + } + + let previous_factor = bridge.delivery_fee_factor; + bridge.delivery_fee_factor = + MINIMAL_DELIVERY_FEE_FACTOR.max(bridge.delivery_fee_factor / EXPONENTIAL_FEE_BASE); + log::info!( + target: LOG_TARGET, + "Bridge queue is uncongested. Decreased fee factor from {} to {}", + previous_factor, + bridge.delivery_fee_factor, + ); + + Bridge::::put(bridge); + T::WeightInfo::on_initialize_when_non_congested() + } + } + + #[pallet::call] + impl, I: 'static> Pallet { + /// Notification about congested bridge queue. + #[pallet::call_index(0)] + #[pallet::weight(T::WeightInfo::report_bridge_status())] + pub fn report_bridge_status( + origin: OriginFor, + // this argument is not currently used, but to ease future migration, we'll keep it + // here + bridge_id: H256, + is_congested: bool, + ) -> DispatchResult { + let _ = T::BridgeHubOrigin::ensure_origin(origin)?; + + log::info!( + target: LOG_TARGET, + "Received bridge status from {:?}: congested = {}", + bridge_id, + is_congested, + ); + + Bridge::::mutate(|bridge| { + bridge.is_congested = is_congested; + }); + Ok(()) + } + } + + /// Bridge that we are using. + /// + /// **bridges-v1** assumptions: all outbound messages through this router are using single lane + /// and to single remote consensus. If there is some other remote consensus that uses the same + /// bridge hub, the separate pallet instance shall be used, In `v2` we'll have all required + /// primitives (lane-id aka bridge-id, derived from XCM locations) to support multiple bridges + /// by the same pallet instance. + #[pallet::storage] + #[pallet::getter(fn bridge)] + pub type Bridge, I: 'static = ()> = StorageValue<_, BridgeState, ValueQuery>; + + impl, I: 'static> Pallet { + /// Called when new message is sent (queued to local outbound XCM queue) over the bridge. + pub(crate) fn on_message_sent_to_bridge(message_size: u32) { + let _ = Bridge::::try_mutate(|bridge| { + let is_channel_with_bridge_hub_congested = T::WithBridgeHubChannel::is_congested(); + let is_bridge_congested = bridge.is_congested; + + // if outbound queue is not congested AND bridge has not reported congestion, do + // nothing + if !is_channel_with_bridge_hub_congested && !is_bridge_congested { + return Err(()) + } + + // ok - we need to increase the fee factor, let's do that + let message_size_factor = FixedU128::from_u32(message_size.saturating_div(1024)) + .saturating_mul(MESSAGE_SIZE_FEE_BASE); + let total_factor = EXPONENTIAL_FEE_BASE.saturating_add(message_size_factor); + let previous_factor = bridge.delivery_fee_factor; + bridge.delivery_fee_factor = + bridge.delivery_fee_factor.saturating_mul(total_factor); + + log::info!( + target: LOG_TARGET, + "Bridge channel is congested. Increased fee factor from {} to {}", + previous_factor, + bridge.delivery_fee_factor, + ); + + Ok(()) + }); + } + } +} + +/// We'll be using `SovereignPaidRemoteExporter` to send remote messages over the sibling/child +/// bridge hub. +type ViaBridgeHubExporter = SovereignPaidRemoteExporter< + Pallet, + >::ToBridgeHubSender, + >::UniversalLocation, +>; + +// This pallet acts as the `ExporterFor` for the `SovereignPaidRemoteExporter` to compute +// message fee using fee factor. +impl, I: 'static> ExporterFor for Pallet { + fn exporter_for( + network: &NetworkId, + remote_location: &InteriorMultiLocation, + message: &Xcm<()>, + ) -> Option<(MultiLocation, Option)> { + // ensure that the message is sent to the expected bridged network (if specified). + if let Some(bridged_network) = T::BridgedNetworkId::get() { + if *network != bridged_network { + log::trace!( + target: LOG_TARGET, + "Router with bridged_network_id {:?} does not support bridging to network {:?}!", + bridged_network, + network, + ); + return None + } + } + + // ensure that the message is sent to the expected bridged network and location. + let Some((bridge_hub_location, maybe_payment)) = + T::Bridges::exporter_for(network, remote_location, message) + else { + log::trace!( + target: LOG_TARGET, + "Router with bridged_network_id {:?} does not support bridging to network {:?} and remote_location {:?}!", + T::BridgedNetworkId::get(), + network, + remote_location, + ); + return None + }; + + // take `base_fee` from `T::Brides`, but it has to be the same `T::FeeAsset` + let base_fee = match maybe_payment { + Some(payment) => match payment { + MultiAsset { fun: Fungible(amount), id } if id.eq(&T::FeeAsset::get()) => amount, + invalid_asset => { + log::error!( + target: LOG_TARGET, + "Router with bridged_network_id {:?} is configured for `T::FeeAsset` {:?} which is not \ + compatible with {:?} for bridge_hub_location: {:?} for bridging to {:?}/{:?}!", + T::BridgedNetworkId::get(), + T::FeeAsset::get(), + invalid_asset, + bridge_hub_location, + network, + remote_location, + ); + return None + }, + }, + None => 0, + }; + + // compute fee amount. Keep in mind that this is only the bridge fee. The fee for sending + // message from this chain to child/sibling bridge hub is determined by the + // `Config::ToBridgeHubSender` + let message_size = message.encoded_size(); + let message_fee = (message_size as u128).saturating_mul(T::ByteFee::get()); + let fee_sum = base_fee.saturating_add(message_fee); + let fee_factor = Self::bridge().delivery_fee_factor; + let fee = fee_factor.saturating_mul_int(fee_sum); + + let fee = if fee > 0 { Some((T::FeeAsset::get(), fee).into()) } else { None }; + + log::info!( + target: LOG_TARGET, + "Going to send message to {:?} ({} bytes) over bridge. Computed bridge fee {:?} using fee factor {}", + (network, remote_location), + message_size, + fee, + fee_factor + ); + + Some((bridge_hub_location, fee)) + } +} + +// This pallet acts as the `SendXcm` to the sibling/child bridge hub instead of regular +// XCMP/DMP transport. This allows injecting dynamic message fees into XCM programs that +// are going to the bridged network. +impl, I: 'static> SendXcm for Pallet { + type Ticket = (u32, ::Ticket); + + fn validate( + dest: &mut Option, + xcm: &mut Option>, + ) -> SendResult { + // we won't have an access to `dest` and `xcm` in the `delvier` method, so precompute + // everything required here + let message_size = xcm + .as_ref() + .map(|xcm| xcm.encoded_size() as _) + .ok_or(SendError::MissingArgument)?; + + // bridge doesn't support oversized/overweight messages now. So it is better to drop such + // messages here than at the bridge hub. Let's check the message size. + if message_size > HARD_MESSAGE_SIZE_LIMIT { + return Err(SendError::ExceedsMaxMessageSize) + } + + // just use exporter to validate destination and insert instructions to pay message fee + // at the sibling/child bridge hub + // + // the cost will include both cost of: (1) to-sibling bridge hub delivery (returned by + // the `Config::ToBridgeHubSender`) and (2) to-bridged bridge hub delivery (returned by + // `Self::exporter_for`) + ViaBridgeHubExporter::::validate(dest, xcm) + .map(|(ticket, cost)| ((message_size, ticket), cost)) + } + + fn deliver(ticket: Self::Ticket) -> Result { + // use router to enqueue message to the sibling/child bridge hub. This also should handle + // payment for passing through this queue. + let (message_size, ticket) = ticket; + let xcm_hash = ViaBridgeHubExporter::::deliver(ticket)?; + + // increase delivery fee factor if required + Self::on_message_sent_to_bridge(message_size); + + Ok(xcm_hash) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use mock::*; + + use frame_support::traits::Hooks; + use sp_runtime::traits::One; + + fn congested_bridge(delivery_fee_factor: FixedU128) -> BridgeState { + BridgeState { is_congested: true, delivery_fee_factor } + } + + fn uncongested_bridge(delivery_fee_factor: FixedU128) -> BridgeState { + BridgeState { is_congested: false, delivery_fee_factor } + } + + #[test] + fn initial_fee_factor_is_one() { + run_test(|| { + assert_eq!( + Bridge::::get(), + uncongested_bridge(MINIMAL_DELIVERY_FEE_FACTOR), + ); + }) + } + + #[test] + fn fee_factor_is_not_decreased_from_on_initialize_when_xcm_channel_is_congested() { + run_test(|| { + Bridge::::put(uncongested_bridge(FixedU128::from_rational(125, 100))); + TestWithBridgeHubChannel::make_congested(); + + // it should not decrease, because xcm channel is congested + let old_bridge = XcmBridgeHubRouter::bridge(); + XcmBridgeHubRouter::on_initialize(One::one()); + assert_eq!(XcmBridgeHubRouter::bridge(), old_bridge); + }) + } + + #[test] + fn fee_factor_is_not_decreased_from_on_initialize_when_bridge_has_reported_congestion() { + run_test(|| { + Bridge::::put(congested_bridge(FixedU128::from_rational(125, 100))); + + // it should not decrease, because bridge congested + let old_bridge = XcmBridgeHubRouter::bridge(); + XcmBridgeHubRouter::on_initialize(One::one()); + assert_eq!(XcmBridgeHubRouter::bridge(), old_bridge); + }) + } + + #[test] + fn fee_factor_is_decreased_from_on_initialize_when_xcm_channel_is_uncongested() { + run_test(|| { + Bridge::::put(uncongested_bridge(FixedU128::from_rational(125, 100))); + + // it shold eventually decreased to one + while XcmBridgeHubRouter::bridge().delivery_fee_factor > MINIMAL_DELIVERY_FEE_FACTOR { + XcmBridgeHubRouter::on_initialize(One::one()); + } + + // verify that it doesn't decreases anymore + XcmBridgeHubRouter::on_initialize(One::one()); + assert_eq!( + XcmBridgeHubRouter::bridge(), + uncongested_bridge(MINIMAL_DELIVERY_FEE_FACTOR) + ); + }) + } + + #[test] + fn not_applicable_if_destination_is_within_other_network() { + run_test(|| { + assert_eq!( + send_xcm::( + MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))), + vec![].into(), + ), + Err(SendError::NotApplicable), + ); + }); + } + + #[test] + fn exceeds_max_message_size_if_size_is_above_hard_limit() { + run_test(|| { + assert_eq!( + send_xcm::( + MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))), + vec![ClearOrigin; HARD_MESSAGE_SIZE_LIMIT as usize].into(), + ), + Err(SendError::ExceedsMaxMessageSize), + ); + }); + } + + #[test] + fn returns_proper_delivery_price() { + run_test(|| { + let dest = MultiLocation::new(2, X1(GlobalConsensus(BridgedNetworkId::get()))); + let xcm: Xcm<()> = vec![ClearOrigin].into(); + let msg_size = xcm.encoded_size(); + + // initially the base fee is used: `BASE_FEE + BYTE_FEE * msg_size + HRMP_FEE` + let expected_fee = BASE_FEE + BYTE_FEE * (msg_size as u128) + HRMP_FEE; + assert_eq!( + XcmBridgeHubRouter::validate(&mut Some(dest), &mut Some(xcm.clone())) + .unwrap() + .1 + .get(0), + Some(&(BridgeFeeAsset::get(), expected_fee).into()), + ); + + // but when factor is larger than one, it increases the fee, so it becomes: + // `(BASE_FEE + BYTE_FEE * msg_size) * F + HRMP_FEE` + let factor = FixedU128::from_rational(125, 100); + Bridge::::put(uncongested_bridge(factor)); + let expected_fee = + (FixedU128::saturating_from_integer(BASE_FEE + BYTE_FEE * (msg_size as u128)) * + factor) + .into_inner() / FixedU128::DIV + + HRMP_FEE; + assert_eq!( + XcmBridgeHubRouter::validate(&mut Some(dest), &mut Some(xcm)).unwrap().1.get(0), + Some(&(BridgeFeeAsset::get(), expected_fee).into()), + ); + }); + } + + #[test] + fn sent_message_doesnt_increase_factor_if_xcm_channel_is_uncongested() { + run_test(|| { + let old_bridge = XcmBridgeHubRouter::bridge(); + assert_eq!( + send_xcm::( + MultiLocation::new( + 2, + X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) + ), + vec![ClearOrigin].into(), + ) + .map(drop), + Ok(()), + ); + + assert!(TestToBridgeHubSender::is_message_sent()); + assert_eq!(old_bridge, XcmBridgeHubRouter::bridge()); + }); + } + + #[test] + fn sent_message_increases_factor_if_xcm_channel_is_congested() { + run_test(|| { + TestWithBridgeHubChannel::make_congested(); + + let old_bridge = XcmBridgeHubRouter::bridge(); + assert_eq!( + send_xcm::( + MultiLocation::new( + 2, + X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) + ), + vec![ClearOrigin].into(), + ) + .map(drop), + Ok(()), + ); + + assert!(TestToBridgeHubSender::is_message_sent()); + assert!( + old_bridge.delivery_fee_factor < XcmBridgeHubRouter::bridge().delivery_fee_factor + ); + }); + } + + #[test] + fn sent_message_increases_factor_if_bridge_has_reported_congestion() { + run_test(|| { + Bridge::::put(congested_bridge(MINIMAL_DELIVERY_FEE_FACTOR)); + + let old_bridge = XcmBridgeHubRouter::bridge(); + assert_eq!( + send_xcm::( + MultiLocation::new( + 2, + X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) + ), + vec![ClearOrigin].into(), + ) + .map(drop), + Ok(()), + ); + + assert!(TestToBridgeHubSender::is_message_sent()); + assert!( + old_bridge.delivery_fee_factor < XcmBridgeHubRouter::bridge().delivery_fee_factor + ); + }); + } +} diff --git a/modules/xcm-bridge-hub-router/src/mock.rs b/modules/xcm-bridge-hub-router/src/mock.rs new file mode 100644 index 000000000000..2d173ebc0457 --- /dev/null +++ b/modules/xcm-bridge-hub-router/src/mock.rs @@ -0,0 +1,130 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg(test)] + +use crate as pallet_xcm_bridge_hub_router; + +use bp_xcm_bridge_hub_router::XcmChannelStatusProvider; +use frame_support::{construct_runtime, derive_impl, parameter_types}; +use frame_system::EnsureRoot; +use sp_runtime::{traits::ConstU128, BuildStorage}; +use xcm::prelude::*; +use xcm_builder::{NetworkExportTable, NetworkExportTableItem}; + +pub type AccountId = u64; +type Block = frame_system::mocking::MockBlock; + +/// HRMP fee. +pub const HRMP_FEE: u128 = 500; +/// Base bridge fee. +pub const BASE_FEE: u128 = 1_000_000; +/// Byte bridge fee. +pub const BYTE_FEE: u128 = 1_000; + +construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + XcmBridgeHubRouter: pallet_xcm_bridge_hub_router::{Pallet, Storage}, + } +} + +parameter_types! { + pub ThisNetworkId: NetworkId = Polkadot; + pub BridgedNetworkId: NetworkId = Kusama; + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(ThisNetworkId::get()), Parachain(1000)); + pub SiblingBridgeHubLocation: MultiLocation = ParentThen(X1(Parachain(1002))).into(); + pub BridgeFeeAsset: AssetId = MultiLocation::parent().into(); + pub BridgeTable: Vec + = vec![ + NetworkExportTableItem::new( + BridgedNetworkId::get(), + None, + SiblingBridgeHubLocation::get(), + Some((BridgeFeeAsset::get(), BASE_FEE).into()) + ) + ]; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; +} + +impl pallet_xcm_bridge_hub_router::Config<()> for TestRuntime { + type WeightInfo = (); + + type UniversalLocation = UniversalLocation; + type BridgedNetworkId = BridgedNetworkId; + type Bridges = NetworkExportTable; + + type BridgeHubOrigin = EnsureRoot; + type ToBridgeHubSender = TestToBridgeHubSender; + type WithBridgeHubChannel = TestWithBridgeHubChannel; + + type ByteFee = ConstU128; + type FeeAsset = BridgeFeeAsset; +} + +pub struct TestToBridgeHubSender; + +impl TestToBridgeHubSender { + pub fn is_message_sent() -> bool { + frame_support::storage::unhashed::get_or_default(b"TestToBridgeHubSender.Sent") + } +} + +impl SendXcm for TestToBridgeHubSender { + type Ticket = (); + + fn validate( + _destination: &mut Option, + _message: &mut Option>, + ) -> SendResult { + Ok(((), (BridgeFeeAsset::get(), HRMP_FEE).into())) + } + + fn deliver(_ticket: Self::Ticket) -> Result { + frame_support::storage::unhashed::put(b"TestToBridgeHubSender.Sent", &true); + Ok([0u8; 32]) + } +} + +pub struct TestWithBridgeHubChannel; + +impl TestWithBridgeHubChannel { + pub fn make_congested() { + frame_support::storage::unhashed::put(b"TestWithBridgeHubChannel.Congested", &true); + } +} + +impl XcmChannelStatusProvider for TestWithBridgeHubChannel { + fn is_congested() -> bool { + frame_support::storage::unhashed::get_or_default(b"TestWithBridgeHubChannel.Congested") + } +} + +/// Return test externalities to use in tests. +pub fn new_test_ext() -> sp_io::TestExternalities { + let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + sp_io::TestExternalities::new(t) +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + new_test_ext().execute_with(test) +} diff --git a/modules/xcm-bridge-hub-router/src/weights.rs b/modules/xcm-bridge-hub-router/src/weights.rs new file mode 100644 index 000000000000..b0c8fc6252cd --- /dev/null +++ b/modules/xcm-bridge-hub-router/src/weights.rs @@ -0,0 +1,208 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated weights for pallet_xcm_bridge_hub_router +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-08-03, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `covid`, CPU: `11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz` +//! EXECUTION: , WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/rip-bridge-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_xcm_bridge_hub_router +// --extrinsic=* +// --execution=wasm +// --wasm-execution=Compiled +// --heap-pages=4096 +// --output=./modules/xcm-bridge-hub-router/src/weights.rs +// --template=./.maintain/bridge-weight-template.hbs + +#![allow(clippy::all)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{ + traits::Get, + weights::{constants::RocksDbWeight, Weight}, +}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for pallet_xcm_bridge_hub_router. +pub trait WeightInfo { + fn on_initialize_when_non_congested() -> Weight; + fn on_initialize_when_congested() -> Weight; + fn report_bridge_status() -> Weight; + fn send_message() -> Weight; +} + +/// Weights for `pallet_xcm_bridge_hub_router` that are generated using one of the Bridge testnets. +/// +/// Those weights are test only and must never be used in production. +pub struct BridgeWeight(PhantomData); +impl WeightInfo for BridgeWeight { + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + /// + /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` + /// (r:1 w:0) + /// + /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 + /// w:0) + fn on_initialize_when_non_congested() -> Weight { + // Proof Size summary in bytes: + // Measured: `53` + // Estimated: `3518` + // Minimum execution time: 11_934 nanoseconds. + Weight::from_parts(12_201_000, 3518) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + /// + /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` + /// (r:1 w:0) + /// + /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 + /// w:0) + fn on_initialize_when_congested() -> Weight { + // Proof Size summary in bytes: + // Measured: `94` + // Estimated: `3559` + // Minimum execution time: 9_010 nanoseconds. + Weight::from_parts(9_594_000, 3559) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + fn report_bridge_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `53` + // Estimated: `1502` + // Minimum execution time: 10_427 nanoseconds. + Weight::from_parts(10_682_000, 1502) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + /// + /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` + /// (r:1 w:0) + /// + /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 + /// w:0) + fn send_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `52` + // Estimated: `3517` + // Minimum execution time: 19_709 nanoseconds. + Weight::from_parts(20_110_000, 3517) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + /// + /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` + /// (r:1 w:0) + /// + /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 + /// w:0) + fn on_initialize_when_non_congested() -> Weight { + // Proof Size summary in bytes: + // Measured: `53` + // Estimated: `3518` + // Minimum execution time: 11_934 nanoseconds. + Weight::from_parts(12_201_000, 3518) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + /// + /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` + /// (r:1 w:0) + /// + /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 + /// w:0) + fn on_initialize_when_congested() -> Weight { + // Proof Size summary in bytes: + // Measured: `94` + // Estimated: `3559` + // Minimum execution time: 9_010 nanoseconds. + Weight::from_parts(9_594_000, 3559) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + fn report_bridge_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `53` + // Estimated: `1502` + // Minimum execution time: 10_427 nanoseconds. + Weight::from_parts(10_682_000, 1502) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `XcmBridgeHubRouter::Bridge` (r:1 w:1) + /// + /// Proof: `XcmBridgeHubRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: + /// 512, mode: `MaxEncodedLen`) + /// + /// Storage: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` + /// (r:1 w:0) + /// + /// Proof: UNKNOWN KEY `0x456d756c617465645369626c696e6758636d704368616e6e656c2e436f6e6765` (r:1 + /// w:0) + fn send_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `52` + // Estimated: `3517` + // Minimum execution time: 19_709 nanoseconds. + Weight::from_parts(20_110_000, 3517) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/modules/xcm-bridge-hub/Cargo.toml b/modules/xcm-bridge-hub/Cargo.toml new file mode 100644 index 000000000000..151b19a52718 --- /dev/null +++ b/modules/xcm-bridge-hub/Cargo.toml @@ -0,0 +1,74 @@ +[package] +name = "pallet-xcm-bridge-hub" +description = "Module that adds dynamic bridges/lanes support to XCM infrastucture at the bridge hub." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Bridge Dependencies +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-xcm-bridge-hub = { path = "../../primitives/xcm-bridge-hub", default-features = false } +pallet-bridge-messages = { path = "../messages", default-features = false } +bridge-runtime-common = { path = "../../bin/runtime-common", default-features = false } + +# Substrate Dependencies +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +# Polkadot Dependencies +xcm = { package = "staging-xcm", git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +xcm-builder = { package = "staging-xcm-builder", git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +xcm-executor = { package = "staging-xcm-executor", git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +bp-header-chain = { path = "../../primitives/header-chain" } +pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-runtime/std", + "bp-xcm-bridge-hub/std", + "bridge-runtime-common/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "log/std", + "pallet-bridge-messages/std", + "scale-info/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] +runtime-benchmarks = [ + "bridge-runtime-common/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-bridge-messages/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-balances/try-runtime", + "pallet-bridge-messages/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/modules/xcm-bridge-hub/src/exporter.rs b/modules/xcm-bridge-hub/src/exporter.rs new file mode 100644 index 000000000000..445551d69343 --- /dev/null +++ b/modules/xcm-bridge-hub/src/exporter.rs @@ -0,0 +1,208 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! The code that allows to use the pallet (`pallet-xcm-bridge-hub`) as XCM message +//! exporter at the sending bridge hub. Internally, it just enqueues outbound blob +//! in the messages pallet queue. +//! +//! This code is executed at the source bridge hub. + +use crate::{Config, Pallet, LOG_TARGET}; + +use bp_messages::source_chain::MessagesBridge; +use bp_xcm_bridge_hub::XcmAsPlainPayload; +use bridge_runtime_common::messages_xcm_extension::{LocalXcmQueueManager, SenderAndLane}; +use pallet_bridge_messages::{Config as BridgeMessagesConfig, Pallet as BridgeMessagesPallet}; +use xcm::prelude::*; +use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter}; +use xcm_executor::traits::ExportXcm; + +/// An easy way to access `HaulBlobExporter`. +pub type PalletAsHaulBlobExporter = HaulBlobExporter< + DummyHaulBlob, + >::BridgedNetworkId, + >::MessageExportPrice, +>; +/// An easy way to access associated messages pallet. +type MessagesPallet = BridgeMessagesPallet>::BridgeMessagesPalletInstance>; + +impl, I: 'static> ExportXcm for Pallet +where + T: BridgeMessagesConfig< + >::BridgeMessagesPalletInstance, + OutboundPayload = XcmAsPlainPayload, + >, +{ + type Ticket = (SenderAndLane, XcmAsPlainPayload, XcmHash); + + fn validate( + network: NetworkId, + channel: u32, + universal_source: &mut Option, + destination: &mut Option, + message: &mut Option>, + ) -> Result<(Self::Ticket, MultiAssets), SendError> { + // Find supported lane_id. + let sender_and_lane = Self::lane_for( + universal_source.as_ref().ok_or(SendError::MissingArgument)?, + (&network, destination.as_ref().ok_or(SendError::MissingArgument)?), + ) + .ok_or(SendError::NotApplicable)?; + + // check if we are able to route the message. We use existing `HaulBlobExporter` for that. + // It will make all required changes and will encode message properly, so that the + // `DispatchBlob` at the bridged bridge hub will be able to decode it + let ((blob, id), price) = PalletAsHaulBlobExporter::::validate( + network, + channel, + universal_source, + destination, + message, + )?; + + Ok(((sender_and_lane, blob, id), price)) + } + + fn deliver( + (sender_and_lane, blob, id): (SenderAndLane, XcmAsPlainPayload, XcmHash), + ) -> Result { + let lane_id = sender_and_lane.lane; + let send_result = MessagesPallet::::send_message(lane_id, blob); + + match send_result { + Ok(artifacts) => { + log::info!( + target: LOG_TARGET, + "XCM message {:?} has been enqueued at bridge {:?} with nonce {}", + id, + lane_id, + artifacts.nonce, + ); + + // notify XCM queue manager about updated lane state + LocalXcmQueueManager::::on_bridge_message_enqueued( + &sender_and_lane, + artifacts.enqueued_messages, + ); + }, + Err(error) => { + log::debug!( + target: LOG_TARGET, + "XCM message {:?} has been dropped because of bridge error {:?} on bridge {:?}", + id, + error, + lane_id, + ); + return Err(SendError::Transport("BridgeSendError")) + }, + } + + Ok(id) + } +} + +/// Dummy implementation of the `HaulBlob` trait that is never called. +/// +/// We are using `HaulBlobExporter`, which requires `HaulBlob` implementation. It assumes that +/// there's a single channel between two bridge hubs - `HaulBlob` only accepts the blob and nothing +/// else. But bridge messages pallet may have a dedicated channel (lane) for every pair of bridged +/// chains. So we are using our own `ExportXcm` implementation, but to utilize `HaulBlobExporter` we +/// still need this `DummyHaulBlob`. +pub struct DummyHaulBlob; + +impl HaulBlob for DummyHaulBlob { + fn haul_blob(_blob: XcmAsPlainPayload) -> Result<(), HaulBlobError> { + Err(HaulBlobError::Transport("DummyHaulBlob")) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use frame_support::assert_ok; + use xcm_executor::traits::export_xcm; + + fn universal_source() -> InteriorMultiLocation { + X2(GlobalConsensus(RelayNetwork::get()), Parachain(SIBLING_ASSET_HUB_ID)) + } + + fn universal_destination() -> InteriorMultiLocation { + BridgedDestination::get() + } + + #[test] + fn export_works() { + run_test(|| { + assert_ok!(export_xcm::( + BridgedRelayNetwork::get(), + 0, + universal_source(), + universal_destination(), + vec![Instruction::ClearOrigin].into(), + )); + }) + } + + #[test] + fn export_fails_if_argument_is_missing() { + run_test(|| { + assert_eq!( + XcmOverBridge::validate( + BridgedRelayNetwork::get(), + 0, + &mut None, + &mut Some(universal_destination()), + &mut Some(Vec::new().into()), + ), + Err(SendError::MissingArgument), + ); + + assert_eq!( + XcmOverBridge::validate( + BridgedRelayNetwork::get(), + 0, + &mut Some(universal_source()), + &mut None, + &mut Some(Vec::new().into()), + ), + Err(SendError::MissingArgument), + ); + }) + } + + #[test] + fn exporter_computes_correct_lane_id() { + run_test(|| { + let expected_lane_id = TEST_LANE_ID; + + assert_eq!( + XcmOverBridge::validate( + BridgedRelayNetwork::get(), + 0, + &mut Some(universal_source()), + &mut Some(universal_destination()), + &mut Some(Vec::new().into()), + ) + .unwrap() + .0 + .0 + .lane, + expected_lane_id, + ); + }) + } +} diff --git a/modules/xcm-bridge-hub/src/lib.rs b/modules/xcm-bridge-hub/src/lib.rs new file mode 100644 index 000000000000..14439a4d8ffe --- /dev/null +++ b/modules/xcm-bridge-hub/src/lib.rs @@ -0,0 +1,96 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Module that adds XCM support to bridge pallets. + +#![warn(missing_docs)] +#![cfg_attr(not(feature = "std"), no_std)] + +use bridge_runtime_common::messages_xcm_extension::XcmBlobHauler; +use pallet_bridge_messages::Config as BridgeMessagesConfig; +use xcm::prelude::*; + +pub use exporter::PalletAsHaulBlobExporter; +pub use pallet::*; + +mod exporter; +mod mock; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-xcm"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use bridge_runtime_common::messages_xcm_extension::SenderAndLane; + use frame_support::pallet_prelude::*; + + #[pallet::config] + #[pallet::disable_frame_system_supertrait_check] + pub trait Config: + BridgeMessagesConfig + { + /// Runtime's universal location. + type UniversalLocation: Get; + // TODO: https://github.com/paritytech/parity-bridges-common/issues/1666 remove `ChainId` and + // replace it with the `NetworkId` - then we'll be able to use + // `T as pallet_bridge_messages::Config::BridgedChain::NetworkId` + /// Bridged network id. + #[pallet::constant] + type BridgedNetworkId: Get; + /// Associated messages pallet instance that bridges us with the + /// `BridgedNetworkId` consensus. + type BridgeMessagesPalletInstance: 'static; + + /// Price of single message export to the bridged consensus (`Self::BridgedNetworkId`). + type MessageExportPrice: Get; + + /// Get point-to-point links with bridged consensus (`Self::BridgedNetworkId`). + /// (this will be replaced with dynamic on-chain bridges - `Bridges V2`) + type Lanes: Get>; + /// Support for point-to-point links + /// (this will be replaced with dynamic on-chain bridges - `Bridges V2`) + type LanesSupport: XcmBlobHauler; + } + + #[pallet::pallet] + pub struct Pallet(PhantomData<(T, I)>); + + impl, I: 'static> Pallet { + /// Returns dedicated/configured lane identifier. + pub(crate) fn lane_for( + source: &InteriorMultiLocation, + dest: (&NetworkId, &InteriorMultiLocation), + ) -> Option { + let source = source.relative_to(&T::UniversalLocation::get()); + + // Check that we have configured a point-to-point lane for 'source' and `dest`. + T::Lanes::get() + .into_iter() + .find_map(|(lane_source, (lane_dest_network, lane_dest))| { + if lane_source.location == source && + &lane_dest_network == dest.0 && + &T::BridgedNetworkId::get() == dest.0 && + &lane_dest == dest.1 + { + Some(lane_source) + } else { + None + } + }) + } + } +} diff --git a/modules/xcm-bridge-hub/src/mock.rs b/modules/xcm-bridge-hub/src/mock.rs new file mode 100644 index 000000000000..7766aac1fb73 --- /dev/null +++ b/modules/xcm-bridge-hub/src/mock.rs @@ -0,0 +1,328 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg(test)] + +use crate as pallet_xcm_bridge_hub; + +use bp_messages::{ + source_chain::LaneMessageVerifier, + target_chain::{DispatchMessage, MessageDispatch}, + LaneId, OutboundLaneData, VerificationError, +}; +use bp_runtime::{messages::MessageDispatchResult, Chain, UnderlyingChainProvider}; +use bridge_runtime_common::{ + messages::{ + source::TargetHeaderChainAdapter, target::SourceHeaderChainAdapter, + BridgedChainWithMessages, HashOf, MessageBridge, ThisChainWithMessages, + }, + messages_xcm_extension::{SenderAndLane, XcmBlobHauler}, +}; +use codec::Encode; +use frame_support::{derive_impl, parameter_types, traits::ConstU32, weights::RuntimeDbWeight}; +use sp_core::H256; +use sp_runtime::{ + testing::Header as SubstrateHeader, + traits::{BlakeTwo256, IdentityLookup}, + AccountId32, BuildStorage, +}; +use xcm::prelude::*; + +pub type AccountId = AccountId32; +pub type Balance = u64; + +type Block = frame_system::mocking::MockBlock; + +pub const SIBLING_ASSET_HUB_ID: u32 = 2001; +pub const THIS_BRIDGE_HUB_ID: u32 = 2002; +pub const BRIDGED_ASSET_HUB_ID: u32 = 1001; +pub const TEST_LANE_ID: LaneId = LaneId([0, 0, 0, 1]); + +frame_support::construct_runtime! { + pub enum TestRuntime { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Event}, + Messages: pallet_bridge_messages::{Pallet, Call, Event}, + XcmOverBridge: pallet_xcm_bridge_hub::{Pallet}, + } +} + +parameter_types! { + pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { read: 1, write: 2 }; + pub const ExistentialDeposit: Balance = 1; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type AccountId = AccountId; + type AccountData = pallet_balances::AccountData; + type Block = Block; + type Lookup = IdentityLookup; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +impl pallet_balances::Config for TestRuntime { + type AccountStore = System; +} + +/// Lane message verifier that is used in tests. +#[derive(Debug, Default)] +pub struct TestLaneMessageVerifier; + +impl LaneMessageVerifier> for TestLaneMessageVerifier { + fn verify_message( + _lane: &LaneId, + _lane_outbound_data: &OutboundLaneData, + _payload: &Vec, + ) -> Result<(), VerificationError> { + Ok(()) + } +} + +parameter_types! { + pub const ActiveOutboundLanes: &'static [LaneId] = &[TEST_LANE_ID]; +} + +impl pallet_bridge_messages::Config for TestRuntime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = TestMessagesWeights; + + type BridgedChainId = (); + type ActiveOutboundLanes = ActiveOutboundLanes; + type MaxUnrewardedRelayerEntriesAtInboundLane = (); + type MaxUnconfirmedMessagesAtInboundLane = (); + type MaximalOutboundPayloadSize = ConstU32<2048>; + type OutboundPayload = Vec; + type InboundPayload = Vec; + type InboundRelayer = (); + type DeliveryPayments = (); + type TargetHeaderChain = TargetHeaderChainAdapter; + type LaneMessageVerifier = TestLaneMessageVerifier; + type DeliveryConfirmationPayments = (); + type OnMessagesDelivered = (); + type SourceHeaderChain = SourceHeaderChainAdapter; + type MessageDispatch = TestMessageDispatch; +} + +pub struct TestMessagesWeights; + +impl pallet_bridge_messages::WeightInfo for TestMessagesWeights { + fn receive_single_message_proof() -> Weight { + Weight::zero() + } + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + Weight::zero() + } + fn receive_delivery_proof_for_single_message() -> Weight { + Weight::zero() + } + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + Weight::zero() + } + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + Weight::zero() + } + + fn receive_two_messages_proof() -> Weight { + Weight::zero() + } + + fn receive_single_message_proof_1_kb() -> Weight { + Weight::zero() + } + + fn receive_single_message_proof_16_kb() -> Weight { + Weight::zero() + } + + fn receive_single_message_proof_with_dispatch(_: u32) -> Weight { + Weight::from_parts(1, 0) + } +} + +impl pallet_bridge_messages::WeightInfoExt for TestMessagesWeights { + fn expected_extra_storage_proof_size() -> u32 { + 0 + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + Weight::zero() + } +} + +parameter_types! { + pub const RelayNetwork: NetworkId = NetworkId::Kusama; + pub const BridgedRelayNetwork: NetworkId = NetworkId::Polkadot; + pub const NonBridgedRelayNetwork: NetworkId = NetworkId::Rococo; + pub const BridgeReserve: Balance = 100_000; + pub UniversalLocation: InteriorMultiLocation = X2( + GlobalConsensus(RelayNetwork::get()), + Parachain(THIS_BRIDGE_HUB_ID), + ); + pub const Penalty: Balance = 1_000; +} + +impl pallet_xcm_bridge_hub::Config for TestRuntime { + type UniversalLocation = UniversalLocation; + type BridgedNetworkId = BridgedRelayNetwork; + type BridgeMessagesPalletInstance = (); + + type MessageExportPrice = (); + type Lanes = TestLanes; + type LanesSupport = TestXcmBlobHauler; +} + +parameter_types! { + pub TestSenderAndLane: SenderAndLane = SenderAndLane { + location: MultiLocation::new(1, X1(Parachain(SIBLING_ASSET_HUB_ID))), + lane: TEST_LANE_ID, + }; + pub const BridgedDestination: InteriorMultiLocation = X1( + Parachain(BRIDGED_ASSET_HUB_ID) + ); + pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ + (TestSenderAndLane::get(), (BridgedRelayNetwork::get(), BridgedDestination::get())) + ]; +} + +pub struct TestXcmBlobHauler; +impl XcmBlobHauler for TestXcmBlobHauler { + type Runtime = TestRuntime; + type MessagesInstance = (); + type ToSourceChainSender = (); + type CongestedMessage = (); + type UncongestedMessage = (); +} + +pub struct ThisChain; + +impl Chain for ThisChain { + type BlockNumber = u64; + type Hash = H256; + type Hasher = BlakeTwo256; + type Header = SubstrateHeader; + type AccountId = AccountId; + type Balance = Balance; + type Nonce = u64; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + u32::MAX + } + + fn max_extrinsic_weight() -> Weight { + Weight::MAX + } +} + +pub struct BridgedChain; +pub type BridgedHeaderHash = H256; +pub type BridgedChainHeader = SubstrateHeader; + +impl Chain for BridgedChain { + type BlockNumber = u64; + type Hash = BridgedHeaderHash; + type Hasher = BlakeTwo256; + type Header = BridgedChainHeader; + type AccountId = AccountId; + type Balance = Balance; + type Nonce = u64; + type Signature = sp_runtime::MultiSignature; + + fn max_extrinsic_size() -> u32 { + 4096 + } + + fn max_extrinsic_weight() -> Weight { + Weight::MAX + } +} + +/// Test message dispatcher. +pub struct TestMessageDispatch; + +impl TestMessageDispatch { + pub fn deactivate(lane: LaneId) { + frame_support::storage::unhashed::put(&(b"inactive", lane).encode()[..], &false); + } +} + +impl MessageDispatch for TestMessageDispatch { + type DispatchPayload = Vec; + type DispatchLevelResult = (); + + fn is_active() -> bool { + frame_support::storage::unhashed::take::(&(b"inactive").encode()[..]) != Some(false) + } + + fn dispatch_weight(_message: &mut DispatchMessage) -> Weight { + Weight::zero() + } + + fn dispatch( + _: DispatchMessage, + ) -> MessageDispatchResult { + MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result: () } + } +} + +pub struct WrappedThisChain; +impl UnderlyingChainProvider for WrappedThisChain { + type Chain = ThisChain; +} +impl ThisChainWithMessages for WrappedThisChain { + type RuntimeOrigin = RuntimeOrigin; +} + +pub struct WrappedBridgedChain; +impl UnderlyingChainProvider for WrappedBridgedChain { + type Chain = BridgedChain; +} +impl BridgedChainWithMessages for WrappedBridgedChain {} + +pub struct BridgedHeaderChain; +impl bp_header_chain::HeaderChain for BridgedHeaderChain { + fn finalized_header_state_root( + _hash: HashOf, + ) -> Option> { + unreachable!() + } +} + +/// Bridge that is deployed on `ThisChain` and allows sending/receiving messages to/from +/// `BridgedChain`. +#[derive(Debug, PartialEq, Eq)] +pub struct OnThisChainBridge; + +impl MessageBridge for OnThisChainBridge { + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = ""; + + type ThisChain = WrappedThisChain; + type BridgedChain = WrappedBridgedChain; + type BridgedHeaderChain = BridgedHeaderChain; +} + +/// Run pallet test. +pub fn run_test(test: impl FnOnce() -> T) -> T { + sp_io::TestExternalities::new( + frame_system::GenesisConfig::::default().build_storage().unwrap(), + ) + .execute_with(test) +} diff --git a/primitives/beefy/Cargo.toml b/primitives/beefy/Cargo.toml new file mode 100644 index 000000000000..09ff1fdb1fbc --- /dev/null +++ b/primitives/beefy/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "bp-beefy" +description = "Primitives of pallet-bridge-beefy module." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive", "bit-vec"] } +scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } +serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } + +# Bridge Dependencies + +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Dependencies + +binary-merkle-tree = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-consensus-beefy = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +pallet-beefy-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +pallet-mmr = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = [ "std" ] +std = [ + "bp-runtime/std", + "codec/std", + "frame-support/std", + "pallet-beefy-mmr/std", + "pallet-mmr/std", + "scale-info/std", + "serde/std", + "sp-consensus-beefy/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/beefy/src/lib.rs b/primitives/beefy/src/lib.rs new file mode 100644 index 000000000000..0441781e79a6 --- /dev/null +++ b/primitives/beefy/src/lib.rs @@ -0,0 +1,151 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives that are used to interact with BEEFY bridge pallet. + +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + +pub use binary_merkle_tree::merkle_root; +pub use pallet_beefy_mmr::BeefyEcdsaToEthereum; +pub use pallet_mmr::{ + primitives::{DataOrHash as MmrDataOrHash, Proof as MmrProof}, + verify_leaves_proof as verify_mmr_leaves_proof, +}; +pub use sp_consensus_beefy::{ + ecdsa_crypto::{ + AuthorityId as EcdsaValidatorId, AuthoritySignature as EcdsaValidatorSignature, + }, + known_payloads::MMR_ROOT_ID as MMR_ROOT_PAYLOAD_ID, + mmr::{BeefyAuthoritySet, MmrLeafVersion}, + BeefyAuthorityId, Commitment, Payload as BeefyPayload, SignedCommitment, ValidatorSet, + ValidatorSetId, BEEFY_ENGINE_ID, +}; + +use bp_runtime::{BasicOperatingMode, BlockNumberOf, Chain, HashOf}; +use codec::{Decode, Encode}; +use frame_support::Parameter; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_runtime::{ + traits::{Convert, MaybeSerializeDeserialize}, + RuntimeAppPublic, RuntimeDebug, +}; +use sp_std::prelude::*; + +/// Substrate-based chain with BEEFY && MMR pallets deployed. +/// +/// Both BEEFY and MMR pallets and their clients may be configured to use different +/// primitives. Some of types can be configured in low-level pallets, but are constrained +/// when BEEFY+MMR bundle is used. +pub trait ChainWithBeefy: Chain { + /// The hashing algorithm used to compute the digest of the BEEFY commitment. + /// + /// Corresponds to the hashing algorithm, used by `sc_consensus_beefy::BeefyKeystore`. + type CommitmentHasher: sp_runtime::traits::Hash; + + /// The hashing algorithm used to build the MMR. + /// + /// The same algorithm is also used to compute merkle roots in BEEFY + /// (e.g. validator addresses root in leaf data). + /// + /// Corresponds to the `Hashing` field of the `pallet-mmr` configuration. + type MmrHashing: sp_runtime::traits::Hash; + + /// The output type of the hashing algorithm used to build the MMR. + /// + /// This type is actually stored in the MMR. + + /// Corresponds to the `Hash` field of the `pallet-mmr` configuration. + type MmrHash: sp_std::hash::Hash + + Parameter + + Copy + + AsRef<[u8]> + + Default + + MaybeSerializeDeserialize + + PartialOrd; + + /// The type expected for the MMR leaf extra data. + type BeefyMmrLeafExtra: Parameter; + + /// A way to identify a BEEFY validator. + /// + /// Corresponds to the `BeefyId` field of the `pallet-beefy` configuration. + type AuthorityId: BeefyAuthorityId + Parameter; + + /// A way to convert validator id to its raw representation in the BEEFY merkle tree. + /// + /// Corresponds to the `BeefyAuthorityToMerkleLeaf` field of the `pallet-beefy-mmr` + /// configuration. + type AuthorityIdToMerkleLeaf: Convert>; +} + +/// BEEFY validator id used by given Substrate chain. +pub type BeefyAuthorityIdOf = ::AuthorityId; +/// BEEFY validator set, containing both validator identifiers and the numeric set id. +pub type BeefyAuthoritySetOf = ValidatorSet>; +/// BEEFY authority set, containing both validator identifiers and the numeric set id. +pub type BeefyAuthoritySetInfoOf = sp_consensus_beefy::mmr::BeefyAuthoritySet>; +/// BEEFY validator signature used by given Substrate chain. +pub type BeefyValidatorSignatureOf = + <::AuthorityId as RuntimeAppPublic>::Signature; +/// Signed BEEFY commitment used by given Substrate chain. +pub type BeefySignedCommitmentOf = + SignedCommitment, BeefyValidatorSignatureOf>; +/// Hash algorithm, used to compute the digest of the BEEFY commitment before signing it. +pub type BeefyCommitmentHasher = ::CommitmentHasher; +/// Hash algorithm used in Beefy MMR construction by given Substrate chain. +pub type MmrHashingOf = ::MmrHashing; +/// Hash type, used in MMR construction by given Substrate chain. +pub type MmrHashOf = ::MmrHash; +/// BEEFY MMR proof type used by the given Substrate chain. +pub type MmrProofOf = MmrProof>; +/// The type of the MMR leaf extra data used by the given Substrate chain. +pub type BeefyMmrLeafExtraOf = ::BeefyMmrLeafExtra; +/// A way to convert a validator id to its raw representation in the BEEFY merkle tree, used by +/// the given Substrate chain. +pub type BeefyAuthorityIdToMerkleLeafOf = ::AuthorityIdToMerkleLeaf; +/// Actual type of leafs in the BEEFY MMR. +pub type BeefyMmrLeafOf = sp_consensus_beefy::mmr::MmrLeaf< + BlockNumberOf, + HashOf, + MmrHashOf, + BeefyMmrLeafExtraOf, +>; + +/// Data required for initializing the BEEFY pallet. +/// +/// Provides the initial context that the bridge needs in order to know +/// where to start the sync process from. +#[derive(Encode, Decode, RuntimeDebug, PartialEq, Clone, TypeInfo, Serialize, Deserialize)] +pub struct InitializationData { + /// Pallet operating mode. + pub operating_mode: BasicOperatingMode, + /// Number of the best block, finalized by BEEFY. + pub best_block_number: BlockNumber, + /// BEEFY authority set that will be finalizing descendants of the `best_beefy_block_number` + /// block. + pub authority_set: BeefyAuthoritySet, +} + +/// Basic data, stored by the pallet for every imported commitment. +#[derive(Encode, Decode, RuntimeDebug, PartialEq, TypeInfo)] +pub struct ImportedCommitment { + /// Block number and hash of the finalized block parent. + pub parent_number_and_hash: (BlockNumber, BlockHash), + /// MMR root at the imported block. + pub mmr_root: MmrHash, +} diff --git a/primitives/chain-asset-hub-rococo/Cargo.toml b/primitives/chain-asset-hub-rococo/Cargo.toml new file mode 100644 index 000000000000..5d86c7ebc6e6 --- /dev/null +++ b/primitives/chain-asset-hub-rococo/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "bp-asset-hub-rococo" +description = "Primitives of AssetHubRococo parachain runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Substrate Dependencies +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +# Bridge Dependencies +bp-xcm-bridge-hub-router = { path = "../xcm-bridge-hub-router", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-xcm-bridge-hub-router/std", + "codec/std", + "frame-support/std", + "scale-info/std", +] diff --git a/primitives/chain-asset-hub-rococo/src/lib.rs b/primitives/chain-asset-hub-rococo/src/lib.rs new file mode 100644 index 000000000000..de2e9ae856d1 --- /dev/null +++ b/primitives/chain-asset-hub-rococo/src/lib.rs @@ -0,0 +1,48 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Module with configuration which reflects AssetHubRococo runtime setup. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; + +pub use bp_xcm_bridge_hub_router::XcmBridgeHubRouterCall; + +/// `AssetHubRococo` Runtime `Call` enum. +/// +/// The enum represents a subset of possible `Call`s we can send to `AssetHubRococo` chain. +/// Ideally this code would be auto-generated from metadata, because we want to +/// avoid depending directly on the ENTIRE runtime just to get the encoding of `Dispatchable`s. +/// +/// All entries here (like pretty much in the entire file) must be kept in sync with +/// `AssetHubRococo` `construct_runtime`, so that we maintain SCALE-compatibility. +#[allow(clippy::large_enum_variant)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub enum Call { + /// `ToWestendXcmRouter` bridge pallet. + #[codec(index = 45)] + ToWestendXcmRouter(XcmBridgeHubRouterCall), +} + +frame_support::parameter_types! { + /// Some sane weight to execute `xcm::Transact(pallet-xcm-bridge-hub-router::Call::report_bridge_status)`. + pub const XcmBridgeHubRouterTransactCallMaxWeight: frame_support::weights::Weight = frame_support::weights::Weight::from_parts(200_000_000, 6144); +} + +/// Identifier of AssetHubRococo in the Rococo relay chain. +pub const ASSET_HUB_ROCOCO_PARACHAIN_ID: u32 = 1000; diff --git a/primitives/chain-asset-hub-westend/Cargo.toml b/primitives/chain-asset-hub-westend/Cargo.toml new file mode 100644 index 000000000000..59629309e6f9 --- /dev/null +++ b/primitives/chain-asset-hub-westend/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "bp-asset-hub-westend" +description = "Primitives of AssetHubWestend parachain runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Substrate Dependencies +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +# Bridge Dependencies +bp-xcm-bridge-hub-router = { path = "../xcm-bridge-hub-router", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-xcm-bridge-hub-router/std", + "codec/std", + "frame-support/std", + "scale-info/std", +] diff --git a/primitives/chain-asset-hub-westend/src/lib.rs b/primitives/chain-asset-hub-westend/src/lib.rs new file mode 100644 index 000000000000..9de1c8809894 --- /dev/null +++ b/primitives/chain-asset-hub-westend/src/lib.rs @@ -0,0 +1,48 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Module with configuration which reflects AssetHubWestend runtime setup. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; + +pub use bp_xcm_bridge_hub_router::XcmBridgeHubRouterCall; + +/// `AssetHubWestend` Runtime `Call` enum. +/// +/// The enum represents a subset of possible `Call`s we can send to `AssetHubWestend` chain. +/// Ideally this code would be auto-generated from metadata, because we want to +/// avoid depending directly on the ENTIRE runtime just to get the encoding of `Dispatchable`s. +/// +/// All entries here (like pretty much in the entire file) must be kept in sync with +/// `AssetHubWestend` `construct_runtime`, so that we maintain SCALE-compatibility. +#[allow(clippy::large_enum_variant)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub enum Call { + /// `ToRococoXcmRouter` bridge pallet. + #[codec(index = 34)] + ToRococoXcmRouter(XcmBridgeHubRouterCall), +} + +frame_support::parameter_types! { + /// Some sane weight to execute `xcm::Transact(pallet-xcm-bridge-hub-router::Call::report_bridge_status)`. + pub const XcmBridgeHubRouterTransactCallMaxWeight: frame_support::weights::Weight = frame_support::weights::Weight::from_parts(200_000_000, 6144); +} + +/// Identifier of AssetHubWestend in the Westend relay chain. +pub const ASSET_HUB_WESTEND_PARACHAIN_ID: u32 = 1000; diff --git a/primitives/chain-bridge-hub-cumulus/Cargo.toml b/primitives/chain-bridge-hub-cumulus/Cargo.toml new file mode 100644 index 000000000000..f0c2b5c2a142 --- /dev/null +++ b/primitives/chain-bridge-hub-cumulus/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "bp-bridge-hub-cumulus" +description = "Primitives for BridgeHub parachain runtimes." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +# Bridge Dependencies + +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } + +# Substrate Based Dependencies + +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +# Polkadot Dependencies +polkadot-primitives = { git = "https://github.com/paritytech/polkadot-sdk", default-features = false , branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "frame-system/std", + "polkadot-primitives/std", + "sp-api/std", + "sp-std/std", +] diff --git a/primitives/chain-bridge-hub-cumulus/src/lib.rs b/primitives/chain-bridge-hub-cumulus/src/lib.rs new file mode 100644 index 000000000000..cd281324ee55 --- /dev/null +++ b/primitives/chain-bridge-hub-cumulus/src/lib.rs @@ -0,0 +1,139 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_polkadot_core::{ + AccountId, AccountInfoStorageMapKeyProvider, AccountPublic, Balance, BlockNumber, Hash, Hasher, + Hashing, Header, Nonce, Perbill, Signature, SignedBlock, UncheckedExtrinsic, + EXTRA_STORAGE_PROOF_SIZE, TX_EXTRA_BYTES, +}; + +use bp_messages::*; +use bp_polkadot_core::SuffixedCommonSignedExtension; +use bp_runtime::extensions::{ + BridgeRejectObsoleteHeadersAndMessages, RefundBridgedParachainMessagesSchema, +}; +use frame_support::{ + dispatch::DispatchClass, + parameter_types, + sp_runtime::{MultiAddress, MultiSigner}, + weights::constants, +}; +use frame_system::limits; +use sp_std::time::Duration; + +/// Average block interval in Cumulus-based parachains. +/// +/// Corresponds to the `MILLISECS_PER_BLOCK` from `parachains_common` crate. +pub const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(12); + +/// All cumulus bridge hubs allow normal extrinsics to fill block up to 75 percent. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); + +/// All cumulus bridge hubs chains allow for 0.5 seconds of compute with a 6-second average block +/// time. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_SECOND, 0) + .saturating_div(2) + .set_proof_size(polkadot_primitives::MAX_POV_SIZE as u64); + +/// All cumulus bridge hubs assume that about 5 percent of the block weight is consumed by +/// `on_initialize` handlers. This is used to limit the maximal weight of a single extrinsic. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); + +parameter_types! { + pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( + 5 * 1024 * 1024, + NORMAL_DISPATCH_RATIO, + ); + + /// Importing a block with 0 Extrinsics. + pub const BlockExecutionWeight: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS, 0) + .saturating_mul(5_000_000); + /// Executing a NO-OP `System::remarks` Extrinsic. + pub const ExtrinsicBaseWeight: Weight = Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS, 0) + .saturating_mul(125_000); + + pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have an extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT, + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); +} + +/// Public key of the chain account that may be used to verify signatures. +pub type AccountSigner = MultiSigner; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +// Note about selecting values of two following constants: +// +// Normal transactions have limit of 75% of 1/2 second weight for Cumulus parachains. Let's keep +// some reserve for the rest of stuff there => let's select values that fit in 50% of maximal limit. +// +// Using current constants, the limit would be: +// +// `75% * WEIGHT_REF_TIME_PER_SECOND * 1 / 2 * 50% = 0.75 * 1_000_000_000_000 / 2 * 0.5 = +// 187_500_000_000` +// +// According to (preliminary) weights of messages pallet, cost of additional message is zero and the +// cost of additional relayer is `8_000_000 + db read + db write`. Let's say we want no more than +// 4096 unconfirmed messages (no any scientific justification for that - it just looks large +// enough). And then we can't have more than 4096 relayers. E.g. for 1024 relayers is (using +// `RocksDbWeight`): +// +// `1024 * (8_000_000 + db read + db write) = 1024 * (8_000_000 + 25_000_000 + 100_000_000) = +// 136_192_000_000` +// +// So 1024 looks like good approximation for the number of relayers. If something is wrong in those +// assumptions, or something will change, it shall be caught by the +// `ensure_able_to_receive_confirmation` test. + +/// Maximal number of unrewarded relayer entries at inbound lane for Cumulus-based parachains. +/// Note: this value is security-relevant, decreasing it should not be done without careful +/// analysis (like the one above). +pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024; + +/// Maximal number of unconfirmed messages at inbound lane for Cumulus-based parachains. +/// Note: this value is security-relevant, decreasing it should not be done without careful +/// analysis (like the one above). +pub const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 4096; + +/// Signed extension that is used by all bridge hubs. +pub type SignedExtension = SuffixedCommonSignedExtension<( + BridgeRejectObsoleteHeadersAndMessages, + RefundBridgedParachainMessagesSchema, +)>; diff --git a/primitives/chain-bridge-hub-kusama/Cargo.toml b/primitives/chain-bridge-hub-kusama/Cargo.toml new file mode 100644 index 000000000000..1ed02b9b2d52 --- /dev/null +++ b/primitives/chain-bridge-hub-kusama/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "bp-bridge-hub-kusama" +description = "Primitives of BridgeHubKusama parachain runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/chain-bridge-hub-kusama/src/lib.rs b/primitives/chain-bridge-hub-kusama/src/lib.rs new file mode 100644 index 000000000000..66e0dad05895 --- /dev/null +++ b/primitives/chain-bridge-hub-kusama/src/lib.rs @@ -0,0 +1,81 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubKusama runtime setup (AccountId, Headers, +//! Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::{ + dispatch::DispatchClass, + sp_runtime::{MultiAddress, MultiSigner}, +}; +use sp_runtime::RuntimeDebug; + +/// BridgeHubKusama parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubKusama; + +impl Chain for BridgeHubKusama { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Nonce = Nonce; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubKusama { + const PARACHAIN_ID: u32 = BRIDGE_HUB_KUSAMA_PARACHAIN_ID; +} + +/// Public key of the chain account that may be used to verify signatures. +pub type AccountSigner = MultiSigner; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Identifier of BridgeHubKusama in the Kusama relay chain. +pub const BRIDGE_HUB_KUSAMA_PARACHAIN_ID: u32 = 1002; + +/// Name of the With-BridgeHubKusama messages pallet instance that is deployed at bridged chains. +pub const WITH_BRIDGE_HUB_KUSAMA_MESSAGES_PALLET_NAME: &str = "BridgeKusamaMessages"; + +/// Name of the With-BridgeHubKusama bridge-relayers pallet instance that is deployed at bridged +/// chains. +pub const WITH_BRIDGE_HUB_KUSAMA_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +decl_bridge_finality_runtime_apis!(bridge_hub_kusama); +decl_bridge_messages_runtime_apis!(bridge_hub_kusama); diff --git a/primitives/chain-bridge-hub-polkadot/Cargo.toml b/primitives/chain-bridge-hub-polkadot/Cargo.toml new file mode 100644 index 000000000000..eebc4dfffd13 --- /dev/null +++ b/primitives/chain-bridge-hub-polkadot/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "bp-bridge-hub-polkadot" +description = "Primitives of BridgeHubPolkadot parachain runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/chain-bridge-hub-polkadot/src/lib.rs b/primitives/chain-bridge-hub-polkadot/src/lib.rs new file mode 100644 index 000000000000..c3661c1adcad --- /dev/null +++ b/primitives/chain-bridge-hub-polkadot/src/lib.rs @@ -0,0 +1,72 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubPolkadot runtime setup +//! (AccountId, Headers, Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::dispatch::DispatchClass; +use sp_runtime::RuntimeDebug; + +/// BridgeHubPolkadot parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubPolkadot; + +impl Chain for BridgeHubPolkadot { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Nonce = Nonce; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubPolkadot { + const PARACHAIN_ID: u32 = BRIDGE_HUB_POLKADOT_PARACHAIN_ID; +} + +/// Identifier of BridgeHubPolkadot in the Polkadot relay chain. +pub const BRIDGE_HUB_POLKADOT_PARACHAIN_ID: u32 = 1002; + +/// Name of the With-BridgeHubPolkadot messages pallet instance that is deployed at bridged chains. +pub const WITH_BRIDGE_HUB_POLKADOT_MESSAGES_PALLET_NAME: &str = "BridgePolkadotMessages"; + +/// Name of the With-BridgeHubPolkadot bridge-relayers pallet instance that is deployed at bridged +/// chains. +pub const WITH_BRIDGE_HUB_POLKADOT_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +decl_bridge_finality_runtime_apis!(bridge_hub_polkadot); +decl_bridge_messages_runtime_apis!(bridge_hub_polkadot); diff --git a/primitives/chain-bridge-hub-rococo/Cargo.toml b/primitives/chain-bridge-hub-rococo/Cargo.toml new file mode 100644 index 000000000000..a3f2b9c28c93 --- /dev/null +++ b/primitives/chain-bridge-hub-rococo/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "bp-bridge-hub-rococo" +description = "Primitives of BridgeHubRococo parachain runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/chain-bridge-hub-rococo/src/lib.rs b/primitives/chain-bridge-hub-rococo/src/lib.rs new file mode 100644 index 000000000000..1fe44597c3d4 --- /dev/null +++ b/primitives/chain-bridge-hub-rococo/src/lib.rs @@ -0,0 +1,98 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubRococo runtime setup (AccountId, Headers, +//! Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::dispatch::DispatchClass; +use sp_runtime::{MultiAddress, MultiSigner, RuntimeDebug}; + +/// BridgeHubRococo parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubRococo; + +impl Chain for BridgeHubRococo { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Nonce = Nonce; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubRococo { + const PARACHAIN_ID: u32 = BRIDGE_HUB_ROCOCO_PARACHAIN_ID; +} + +/// Public key of the chain account that may be used to verify signatures. +pub type AccountSigner = MultiSigner; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Identifier of BridgeHubRococo in the Rococo relay chain. +pub const BRIDGE_HUB_ROCOCO_PARACHAIN_ID: u32 = 1013; + +/// Name of the With-BridgeHubRococo messages pallet instance that is deployed at bridged chains. +pub const WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME: &str = "BridgeRococoMessages"; + +/// Name of the With-BridgeHubRococo bridge-relayers pallet instance that is deployed at bridged +/// chains. +pub const WITH_BRIDGE_HUB_ROCOCO_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +/// Pallet index of `BridgeWestendMessages: pallet_bridge_messages::`. +pub const WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX: u8 = 51; +/// Pallet index of `BridgePolkadotBulletinMessages: pallet_bridge_messages::`. +pub const WITH_BRIDGE_ROCOCO_TO_BULLETIN_MESSAGES_PALLET_INDEX: u8 = 61; + +decl_bridge_finality_runtime_apis!(bridge_hub_rococo); +decl_bridge_messages_runtime_apis!(bridge_hub_rococo); + +frame_support::parameter_types! { + /// The XCM fee that is paid for executing XCM program (with `ExportMessage` instruction) at the Rococo + /// BridgeHub. + /// (initially was calculated by test `BridgeHubRococo::can_calculate_weight_for_paid_export_message_with_reserve_transfer` + `33%`) + pub const BridgeHubRococoBaseXcmFeeInRocs: u128 = 1628875538; + + /// Transaction fee that is paid at the Rococo BridgeHub for delivering single inbound message. + /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_delivery_transaction` + `33%`) + pub const BridgeHubRococoBaseDeliveryFeeInRocs: u128 = 6417262881; + + /// Transaction fee that is paid at the Rococo BridgeHub for delivering single outbound message confirmation. + /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) + pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 6159996668; +} diff --git a/primitives/chain-bridge-hub-westend/Cargo.toml b/primitives/chain-bridge-hub-westend/Cargo.toml new file mode 100644 index 000000000000..eea808ea2b56 --- /dev/null +++ b/primitives/chain-bridge-hub-westend/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "bp-bridge-hub-westend" +description = "Primitives of BridgeHubWestend parachain runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-bridge-hub-cumulus/std", + "bp-messages/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/chain-bridge-hub-westend/src/lib.rs b/primitives/chain-bridge-hub-westend/src/lib.rs new file mode 100644 index 000000000000..0124e05bf887 --- /dev/null +++ b/primitives/chain-bridge-hub-westend/src/lib.rs @@ -0,0 +1,90 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Module with configuration which reflects BridgeHubWestend runtime setup +//! (AccountId, Headers, Hashes...) + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_bridge_hub_cumulus::*; +use bp_messages::*; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, +}; +use frame_support::dispatch::DispatchClass; +use sp_runtime::RuntimeDebug; + +/// BridgeHubWestend parachain. +#[derive(RuntimeDebug)] +pub struct BridgeHubWestend; + +impl Chain for BridgeHubWestend { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Nonce = Nonce; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl Parachain for BridgeHubWestend { + const PARACHAIN_ID: u32 = BRIDGE_HUB_WESTEND_PARACHAIN_ID; +} + +/// Identifier of BridgeHubWestend in the Westend relay chain. +pub const BRIDGE_HUB_WESTEND_PARACHAIN_ID: u32 = 1002; + +/// Name of the With-BridgeHubWestend messages pallet instance that is deployed at bridged chains. +pub const WITH_BRIDGE_HUB_WESTEND_MESSAGES_PALLET_NAME: &str = "BridgeWestendMessages"; + +/// Name of the With-BridgeHubWestend bridge-relayers pallet instance that is deployed at bridged +/// chains. +pub const WITH_BRIDGE_HUB_WESTEND_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; + +/// Pallet index of `BridgeRococoMessages: pallet_bridge_messages::`. +pub const WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX: u8 = 44; + +decl_bridge_finality_runtime_apis!(bridge_hub_westend); +decl_bridge_messages_runtime_apis!(bridge_hub_westend); + +frame_support::parameter_types! { + /// The XCM fee that is paid for executing XCM program (with `ExportMessage` instruction) at the Westend + /// BridgeHub. + /// (initially was calculated by test `BridgeHubWestend::can_calculate_weight_for_paid_export_message_with_reserve_transfer` + `33%`) + pub const BridgeHubWestendBaseXcmFeeInWnds: u128 = 488662666666; + + /// Transaction fee that is paid at the Westend BridgeHub for delivering single inbound message. + /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_complex_message_delivery_transaction` + `33%`) + pub const BridgeHubWestendBaseDeliveryFeeInWnds: u128 = 1925196628010; + + /// Transaction fee that is paid at the Westend BridgeHub for delivering single outbound message confirmation. + /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) + pub const BridgeHubWestendBaseConfirmationFeeInWnds: u128 = 1848016628010; +} diff --git a/primitives/chain-kusama/Cargo.toml b/primitives/chain-kusama/Cargo.toml new file mode 100644 index 000000000000..b08489aea82d --- /dev/null +++ b/primitives/chain-kusama/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "bp-kusama" +description = "Primitives of Kusama runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/primitives/chain-kusama/src/lib.rs b/primitives/chain-kusama/src/lib.rs new file mode 100644 index 000000000000..5f089fbc589f --- /dev/null +++ b/primitives/chain-kusama/src/lib.rs @@ -0,0 +1,75 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; +use frame_support::weights::Weight; + +/// Kusama Chain +pub struct Kusama; + +impl Chain for Kusama { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Nonce = ::Nonce; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Kusama { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_KUSAMA_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; + const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; +} + +// The SignedExtension used by Kusama. +pub use bp_polkadot_core::CommonSignedExtension as SignedExtension; + +/// Name of the parachains pallet in the Kusama runtime. +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Name of the With-Kusama GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_KUSAMA_GRANDPA_PALLET_NAME: &str = "BridgeKusamaGrandpa"; + +/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot +/// parachains. +/// +/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some +/// reserve. +pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; + +decl_bridge_finality_runtime_apis!(kusama, grandpa); diff --git a/primitives/chain-polkadot-bulletin/Cargo.toml b/primitives/chain-polkadot-bulletin/Cargo.toml new file mode 100644 index 000000000000..b610b268d9a4 --- /dev/null +++ b/primitives/chain-polkadot-bulletin/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "bp-polkadot-bulletin" +description = "Primitives of Polkadot Bulletin chain runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-messages = { path = "../messages", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-messages/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", + "sp-api/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/chain-polkadot-bulletin/src/lib.rs b/primitives/chain-polkadot-bulletin/src/lib.rs new file mode 100644 index 000000000000..fe82c9644b67 --- /dev/null +++ b/primitives/chain-polkadot-bulletin/src/lib.rs @@ -0,0 +1,215 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Polkadot Bulletin Chain primitives. + +#![warn(missing_docs)] +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_header_chain::ChainWithGrandpa; +use bp_messages::MessageNonce; +use bp_runtime::{ + decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, + extensions::{ + CheckEra, CheckGenesis, CheckNonZeroSender, CheckNonce, CheckSpecVersion, CheckTxVersion, + CheckWeight, GenericSignedExtension, GenericSignedExtensionSchema, + }, + Chain, TransactionEra, +}; +use codec::{Decode, Encode}; +use frame_support::{ + dispatch::DispatchClass, + parameter_types, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, +}; +use frame_system::limits; +use scale_info::TypeInfo; +use sp_runtime::{traits::DispatchInfoOf, transaction_validity::TransactionValidityError, Perbill}; + +// This chain reuses most of Polkadot primitives. +pub use bp_polkadot_core::{ + AccountAddress, AccountId, Balance, Block, BlockNumber, Hash, Hasher, Header, Nonce, Signature, + SignedBlock, UncheckedExtrinsic, AVERAGE_HEADER_SIZE, EXTRA_STORAGE_PROOF_SIZE, + MAX_MANDATORY_HEADER_SIZE, REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY, +}; + +/// Maximal number of GRANDPA authorities at Polkadot Bulletin chain. +pub const MAX_AUTHORITIES_COUNT: u32 = 100; + +/// Name of the With-Polkadot Bulletin chain GRANDPA pallet instance that is deployed at bridged +/// chains. +pub const WITH_POLKADOT_BULLETIN_GRANDPA_PALLET_NAME: &str = "BridgePolkadotBulletinGrandpa"; +/// Name of the With-Polkadot Bulletin chain messages pallet instance that is deployed at bridged +/// chains. +pub const WITH_POLKADOT_BULLETIN_MESSAGES_PALLET_NAME: &str = "BridgePolkadotBulletinMessages"; + +// There are fewer system operations on this chain (e.g. staking, governance, etc.). Use a higher +// percentage of the block for data storage. +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(90); + +// Re following constants - we are using the same values at Cumulus parachains. They are limited +// by the maximal transaction weight/size. Since block limits at Bulletin Chain are larger than +// at the Cumulus Bridgeg Hubs, we could reuse the same values. + +/// Maximal number of unrewarded relayer entries at inbound lane for Cumulus-based parachains. +pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024; + +/// Maximal number of unconfirmed messages at inbound lane for Cumulus-based parachains. +pub const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 4096; + +/// This signed extension is used to ensure that the chain transactions are signed by proper +pub type ValidateSigned = GenericSignedExtensionSchema<(), ()>; + +/// Signed extension schema, used by Polkadot Bulletin. +pub type SignedExtensionSchema = GenericSignedExtension<( + ( + CheckNonZeroSender, + CheckSpecVersion, + CheckTxVersion, + CheckGenesis, + CheckEra, + CheckNonce, + CheckWeight, + ), + ValidateSigned, +)>; + +/// Signed extension, used by Polkadot Bulletin. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub struct SignedExtension(SignedExtensionSchema); + +impl sp_runtime::traits::SignedExtension for SignedExtension { + const IDENTIFIER: &'static str = "Not needed."; + type AccountId = (); + type Call = (); + type AdditionalSigned = + ::AdditionalSigned; + type Pre = (); + + fn additional_signed(&self) -> Result { + self.0.additional_signed() + } + + fn pre_dispatch( + self, + _who: &Self::AccountId, + _call: &Self::Call, + _info: &DispatchInfoOf, + _len: usize, + ) -> Result { + Ok(()) + } +} + +impl SignedExtension { + /// Create signed extension from its components. + pub fn from_params( + spec_version: u32, + transaction_version: u32, + era: TransactionEra, + genesis_hash: Hash, + nonce: Nonce, + ) -> Self { + Self(GenericSignedExtension::new( + ( + ( + (), // non-zero sender + (), // spec version + (), // tx version + (), // genesis + era.frame_era(), // era + nonce.into(), // nonce (compact encoding) + (), // Check weight + ), + (), + ), + Some(( + ( + (), + spec_version, + transaction_version, + genesis_hash, + era.signed_payload(genesis_hash), + (), + (), + ), + (), + )), + )) + } + + /// Return transaction nonce. + pub fn nonce(&self) -> Nonce { + let common_payload = self.0.payload.0; + common_payload.5 .0 + } +} + +parameter_types! { + /// We allow for 2 seconds of compute with a 6 second average block time. + pub BlockWeights: limits::BlockWeights = limits::BlockWeights::with_sensible_defaults( + Weight::from_parts(2u64 * WEIGHT_REF_TIME_PER_SECOND, u64::MAX), + NORMAL_DISPATCH_RATIO, + ); + // Note: Max transaction size is 8 MB. Set max block size to 10 MB to facilitate data storage. + // This is double the "normal" Relay Chain block length limit. + /// Maximal block length at Polkadot Bulletin chain. + pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( + 10 * 1024 * 1024, + NORMAL_DISPATCH_RATIO, + ); +} + +/// Polkadot Bulletin Chain declaration. +pub struct PolkadotBulletin; + +impl Chain for PolkadotBulletin { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + // The Bulletin Chain is a permissioned blockchain without any balances. Our `Chain` trait + // requires balance type, which is then used by various bridge infrastructure code. However + // this code is optional and we are not planning to use it in our bridge. + type Balance = Balance; + type Nonce = Nonce; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +impl ChainWithGrandpa for PolkadotBulletin { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_POLKADOT_BULLETIN_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; + const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; +} + +decl_bridge_finality_runtime_apis!(polkadot_bulletin, grandpa); +decl_bridge_messages_runtime_apis!(polkadot_bulletin); diff --git a/primitives/chain-polkadot/Cargo.toml b/primitives/chain-polkadot/Cargo.toml new file mode 100644 index 000000000000..7ea28bd24b08 --- /dev/null +++ b/primitives/chain-polkadot/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "bp-polkadot" +description = "Primitives of Polkadot runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/primitives/chain-polkadot/src/lib.rs b/primitives/chain-polkadot/src/lib.rs new file mode 100644 index 000000000000..9a5b8970accb --- /dev/null +++ b/primitives/chain-polkadot/src/lib.rs @@ -0,0 +1,75 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, extensions::PrevalidateAttests, Chain}; +use frame_support::weights::Weight; + +/// Polkadot Chain +pub struct Polkadot; + +impl Chain for Polkadot { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Nonce = ::Nonce; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Polkadot { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_POLKADOT_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; + const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; +} + +/// The SignedExtension used by Polkadot. +pub type SignedExtension = SuffixedCommonSignedExtension; + +/// Name of the parachains pallet in the Polkadot runtime. +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Name of the With-Polkadot GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_POLKADOT_GRANDPA_PALLET_NAME: &str = "BridgePolkadotGrandpa"; + +/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Polkadot +/// parachains. +/// +/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some +/// reserve. +pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; + +decl_bridge_finality_runtime_apis!(polkadot, grandpa); diff --git a/primitives/chain-rococo/Cargo.toml b/primitives/chain-rococo/Cargo.toml new file mode 100644 index 000000000000..5e6e9bb73d26 --- /dev/null +++ b/primitives/chain-rococo/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "bp-rococo" +description = "Primitives of Rococo runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/primitives/chain-rococo/src/lib.rs b/primitives/chain-rococo/src/lib.rs new file mode 100644 index 000000000000..7f3e762715f3 --- /dev/null +++ b/primitives/chain-rococo/src/lib.rs @@ -0,0 +1,79 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; +use frame_support::{parameter_types, weights::Weight}; + +/// Rococo Chain +pub struct Rococo; + +impl Chain for Rococo { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Nonce = ::Nonce; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Rococo { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_ROCOCO_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; + const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; +} + +parameter_types! { + pub const SS58Prefix: u8 = 42; +} + +// The SignedExtension used by Rococo. +pub use bp_polkadot_core::CommonSignedExtension as SignedExtension; + +/// Name of the parachains pallet in the Rococo runtime. +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Name of the With-Rococo GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_ROCOCO_GRANDPA_PALLET_NAME: &str = "BridgeRococoGrandpa"; + +/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Rococo +/// parachains. +/// +/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some +/// reserve. +pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; + +decl_bridge_finality_runtime_apis!(rococo, grandpa); diff --git a/primitives/chain-westend/Cargo.toml b/primitives/chain-westend/Cargo.toml new file mode 100644 index 000000000000..b28e250554e4 --- /dev/null +++ b/primitives/chain-westend/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "bp-westend" +description = "Primitives of Westend runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Bridge Dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", +] diff --git a/primitives/chain-westend/src/lib.rs b/primitives/chain-westend/src/lib.rs new file mode 100644 index 000000000000..7fa5e140d570 --- /dev/null +++ b/primitives/chain-westend/src/lib.rs @@ -0,0 +1,79 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +pub use bp_polkadot_core::*; + +use bp_header_chain::ChainWithGrandpa; +use bp_runtime::{decl_bridge_finality_runtime_apis, Chain}; +use frame_support::{parameter_types, weights::Weight}; + +/// Westend Chain +pub struct Westend; + +impl Chain for Westend { + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + + type AccountId = ::AccountId; + type Balance = ::Balance; + type Nonce = ::Nonce; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + PolkadotLike::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + PolkadotLike::max_extrinsic_weight() + } +} + +impl ChainWithGrandpa for Westend { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_WESTEND_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; + const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; +} + +parameter_types! { + pub const SS58Prefix: u8 = 42; +} + +// The SignedExtension used by Westend. +pub use bp_polkadot_core::CommonSignedExtension as SignedExtension; + +/// Name of the parachains pallet in the Rococo runtime. +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Name of the With-Westend GRANDPA pallet instance that is deployed at bridged chains. +pub const WITH_WESTEND_GRANDPA_PALLET_NAME: &str = "BridgeWestendGrandpa"; + +/// Maximal size of encoded `bp_parachains::ParaStoredHeaderData` structure among all Westend +/// parachains. +/// +/// It includes the block number and state root, so it shall be near 40 bytes, but let's have some +/// reserve. +pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128; + +decl_bridge_finality_runtime_apis!(westend, grandpa); diff --git a/primitives/header-chain/Cargo.toml b/primitives/header-chain/Cargo.toml new file mode 100644 index 000000000000..51d9b2f30f59 --- /dev/null +++ b/primitives/header-chain/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "bp-header-chain" +description = "A common interface for describing what a bridge pallet should be able to do." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +finality-grandpa = { version = "0.16.2", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } + +# Bridge dependencies + +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["serde"] } +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["serde"] } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["serde"] } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +bp-test-utils = { path = "../test-utils" } +hex = "0.4" +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "bp-runtime/std", + "codec/std", + "finality-grandpa/std", + "frame-support/std", + "scale-info/std", + "serde/std", + "sp-consensus-grandpa/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/header-chain/src/justification/mod.rs b/primitives/header-chain/src/justification/mod.rs new file mode 100644 index 000000000000..b32d8bdb5f1d --- /dev/null +++ b/primitives/header-chain/src/justification/mod.rs @@ -0,0 +1,132 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Logic for checking GRANDPA Finality Proofs. +//! +//! Adapted copy of substrate/client/finality-grandpa/src/justification.rs. If origin +//! will ever be moved to the sp_consensus_grandpa, we should reuse that implementation. + +mod verification; + +use crate::ChainWithGrandpa; +pub use verification::{ + equivocation::{EquivocationsCollector, GrandpaEquivocationsFinder}, + optimizer::verify_and_optimize_justification, + strict::verify_justification, + AncestryChain, Error as JustificationVerificationError, JustificationVerificationContext, + PrecommitError, +}; + +use bp_runtime::{BlockNumberOf, Chain, HashOf, HeaderId}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::RuntimeDebugNoBound; +use scale_info::TypeInfo; +use sp_consensus_grandpa::{AuthorityId, AuthoritySignature}; +use sp_runtime::{traits::Header as HeaderT, RuntimeDebug, SaturatedConversion}; +use sp_std::prelude::*; + +/// A GRANDPA Justification is a proof that a given header was finalized +/// at a certain height and with a certain set of authorities. +/// +/// This particular proof is used to prove that headers on a bridged chain +/// (so not our chain) have been finalized correctly. +#[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo, RuntimeDebugNoBound)] +pub struct GrandpaJustification { + /// The round (voting period) this justification is valid for. + pub round: u64, + /// The set of votes for the chain which is to be finalized. + pub commit: + finality_grandpa::Commit, + /// A proof that the chain of blocks in the commit are related to each other. + pub votes_ancestries: Vec
, +} + +impl GrandpaJustification { + /// Returns reasonable size of justification using constants from the provided chain. + /// + /// An imprecise analogue of `MaxEncodedLen` implementation. We don't use it for + /// any precise calculations - that's just an estimation. + pub fn max_reasonable_size(required_precommits: u32) -> u32 + where + C: Chain + ChainWithGrandpa, + { + // we don't need precise results here - just estimations, so some details + // are removed from computations (e.g. bytes required to encode vector length) + + // structures in `finality_grandpa` crate are not implementing `MaxEncodedLength`, so + // here's our estimation for the `finality_grandpa::Commit` struct size + // + // precommit is: hash + number + // signed precommit is: precommit + signature (64b) + authority id + // commit is: hash + number + vec of signed precommits + let signed_precommit_size: u32 = BlockNumberOf::::max_encoded_len() + .saturating_add(HashOf::::max_encoded_len().saturated_into()) + .saturating_add(64) + .saturating_add(AuthorityId::max_encoded_len().saturated_into()) + .saturated_into(); + let max_expected_signed_commit_size = signed_precommit_size + .saturating_mul(required_precommits) + .saturating_add(BlockNumberOf::::max_encoded_len().saturated_into()) + .saturating_add(HashOf::::max_encoded_len().saturated_into()); + + let max_expected_votes_ancestries_size = + C::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY.saturating_mul(C::AVERAGE_HEADER_SIZE); + + // justification is round number (u64=8b), a signed GRANDPA commit and the + // `votes_ancestries` vector + 8u32.saturating_add(max_expected_signed_commit_size) + .saturating_add(max_expected_votes_ancestries_size) + } + + /// Return identifier of header that this justification claims to finalize. + pub fn commit_target_id(&self) -> HeaderId { + HeaderId(self.commit.target_number, self.commit.target_hash) + } +} + +impl crate::FinalityProof for GrandpaJustification { + fn target_header_hash(&self) -> H::Hash { + self.commit.target_hash + } + + fn target_header_number(&self) -> H::Number { + self.commit.target_number + } +} + +/// Justification verification error. +#[derive(Eq, RuntimeDebug, PartialEq)] +pub enum Error { + /// Failed to decode justification. + JustificationDecode, +} + +/// Given GRANDPA authorities set size, return number of valid authorities votes that the +/// justification must have to be valid. +/// +/// This function assumes that all authorities have the same vote weight. +pub fn required_justification_precommits(authorities_set_length: u32) -> u32 { + authorities_set_length - authorities_set_length.saturating_sub(1) / 3 +} + +/// Decode justification target. +pub fn decode_justification_target( + raw_justification: &[u8], +) -> Result<(Header::Hash, Header::Number), Error> { + GrandpaJustification::
::decode(&mut &*raw_justification) + .map(|justification| (justification.commit.target_hash, justification.commit.target_number)) + .map_err(|_| Error::JustificationDecode) +} diff --git a/primitives/header-chain/src/justification/verification/equivocation.rs b/primitives/header-chain/src/justification/verification/equivocation.rs new file mode 100644 index 000000000000..fbad30128199 --- /dev/null +++ b/primitives/header-chain/src/justification/verification/equivocation.rs @@ -0,0 +1,200 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Logic for extracting equivocations from multiple GRANDPA Finality Proofs. + +use crate::{ + justification::{ + verification::{ + Error as JustificationVerificationError, IterationFlow, + JustificationVerificationContext, JustificationVerifier, PrecommitError, + SignedPrecommit, + }, + GrandpaJustification, + }, + ChainWithGrandpa, FindEquivocations, +}; + +use bp_runtime::{BlockNumberOf, HashOf, HeaderOf}; +use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, EquivocationProof, Precommit}; +use sp_runtime::traits::Header as HeaderT; +use sp_std::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + prelude::*, +}; + +enum AuthorityVotes { + SingleVote(SignedPrecommit
), + Equivocation( + finality_grandpa::Equivocation, AuthoritySignature>, + ), +} + +/// Structure that can extract equivocations from multiple GRANDPA justifications. +pub struct EquivocationsCollector<'a, Header: HeaderT> { + round: u64, + context: &'a JustificationVerificationContext, + + votes: BTreeMap>, +} + +impl<'a, Header: HeaderT> EquivocationsCollector<'a, Header> { + /// Create a new instance of `EquivocationsCollector`. + pub fn new( + context: &'a JustificationVerificationContext, + base_justification: &GrandpaJustification
, + ) -> Result { + let mut checker = Self { round: base_justification.round, context, votes: BTreeMap::new() }; + + checker.verify_justification( + (base_justification.commit.target_hash, base_justification.commit.target_number), + checker.context, + base_justification, + )?; + + Ok(checker) + } + + /// Parse additional justifications for equivocations. + pub fn parse_justifications(&mut self, justifications: &[GrandpaJustification
]) { + let round = self.round; + for justification in + justifications.iter().filter(|justification| round == justification.round) + { + // We ignore the Errors received here since we don't care if the proofs are valid. + // We only care about collecting equivocations. + let _ = self.verify_justification( + (justification.commit.target_hash, justification.commit.target_number), + self.context, + justification, + ); + } + } + + /// Extract the equivocation proofs that have been collected. + pub fn into_equivocation_proofs(self) -> Vec> { + let mut equivocations = vec![]; + for (_authority, vote) in self.votes { + if let AuthorityVotes::Equivocation(equivocation) = vote { + equivocations.push(EquivocationProof::new( + self.context.authority_set_id, + sp_consensus_grandpa::Equivocation::Precommit(equivocation), + )); + } + } + + equivocations + } +} + +impl<'a, Header: HeaderT> JustificationVerifier
for EquivocationsCollector<'a, Header> { + fn process_duplicate_votes_ancestries( + &mut self, + _duplicate_votes_ancestries: Vec, + ) -> Result<(), JustificationVerificationError> { + Ok(()) + } + + fn process_redundant_vote( + &mut self, + _precommit_idx: usize, + ) -> Result { + Ok(IterationFlow::Run) + } + + fn process_known_authority_vote( + &mut self, + _precommit_idx: usize, + _signed: &SignedPrecommit
, + ) -> Result { + Ok(IterationFlow::Run) + } + + fn process_unknown_authority_vote( + &mut self, + _precommit_idx: usize, + ) -> Result<(), PrecommitError> { + Ok(()) + } + + fn process_unrelated_ancestry_vote( + &mut self, + _precommit_idx: usize, + ) -> Result { + Ok(IterationFlow::Run) + } + + fn process_invalid_signature_vote( + &mut self, + _precommit_idx: usize, + ) -> Result<(), PrecommitError> { + Ok(()) + } + + fn process_valid_vote(&mut self, signed: &SignedPrecommit
) { + match self.votes.get_mut(&signed.id) { + Some(vote) => match vote { + AuthorityVotes::SingleVote(first_vote) => { + if first_vote.precommit != signed.precommit { + *vote = AuthorityVotes::Equivocation(finality_grandpa::Equivocation { + round_number: self.round, + identity: signed.id.clone(), + first: (first_vote.precommit.clone(), first_vote.signature.clone()), + second: (signed.precommit.clone(), signed.signature.clone()), + }); + } + }, + AuthorityVotes::Equivocation(_) => {}, + }, + None => { + self.votes.insert(signed.id.clone(), AuthorityVotes::SingleVote(signed.clone())); + }, + } + } + + fn process_redundant_votes_ancestries( + &mut self, + _redundant_votes_ancestries: BTreeSet, + ) -> Result<(), JustificationVerificationError> { + Ok(()) + } +} + +/// Helper struct for finding equivocations in GRANDPA proofs. +pub struct GrandpaEquivocationsFinder(sp_std::marker::PhantomData); + +impl + FindEquivocations< + GrandpaJustification>, + JustificationVerificationContext, + EquivocationProof, BlockNumberOf>, + > for GrandpaEquivocationsFinder +{ + type Error = JustificationVerificationError; + + fn find_equivocations( + verification_context: &JustificationVerificationContext, + synced_proof: &GrandpaJustification>, + source_proofs: &[GrandpaJustification>], + ) -> Result, BlockNumberOf>>, Self::Error> { + let mut equivocations_collector = + EquivocationsCollector::new(verification_context, synced_proof)?; + + equivocations_collector.parse_justifications(source_proofs); + + Ok(equivocations_collector.into_equivocation_proofs()) + } +} diff --git a/primitives/header-chain/src/justification/verification/mod.rs b/primitives/header-chain/src/justification/verification/mod.rs new file mode 100644 index 000000000000..c71149bf9c28 --- /dev/null +++ b/primitives/header-chain/src/justification/verification/mod.rs @@ -0,0 +1,333 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Logic for checking GRANDPA Finality Proofs. + +pub mod equivocation; +pub mod optimizer; +pub mod strict; + +use crate::{justification::GrandpaJustification, AuthoritySet}; + +use bp_runtime::HeaderId; +use finality_grandpa::voter_set::VoterSet; +use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, SetId}; +use sp_runtime::{traits::Header as HeaderT, RuntimeDebug}; +use sp_std::{ + collections::{ + btree_map::{ + BTreeMap, + Entry::{Occupied, Vacant}, + }, + btree_set::BTreeSet, + }, + prelude::*, +}; + +type SignedPrecommit
= finality_grandpa::SignedPrecommit< +
::Hash, +
::Number, + AuthoritySignature, + AuthorityId, +>; + +/// Votes ancestries with useful methods. +#[derive(RuntimeDebug)] +pub struct AncestryChain { + /// We expect all forks in the ancestry chain to be descendants of base. + base: HeaderId, + /// Header hash => parent header hash mapping. + parents: BTreeMap, + /// Hashes of headers that were not visited by `ancestry()`. + unvisited: BTreeSet, +} + +impl AncestryChain
{ + /// Creates a new instance of `AncestryChain` starting from a `GrandpaJustification`. + /// + /// Returns the `AncestryChain` and a `Vec` containing the `votes_ancestries` entries + /// that were ignored when creating it, because they are duplicates. + pub fn new( + justification: &GrandpaJustification
, + ) -> (AncestryChain
, Vec) { + let mut parents = BTreeMap::new(); + let mut unvisited = BTreeSet::new(); + let mut ignored_idxs = Vec::new(); + for (idx, ancestor) in justification.votes_ancestries.iter().enumerate() { + let hash = ancestor.hash(); + match parents.entry(hash) { + Occupied(_) => { + ignored_idxs.push(idx); + }, + Vacant(entry) => { + entry.insert(*ancestor.parent_hash()); + unvisited.insert(hash); + }, + } + } + (AncestryChain { base: justification.commit_target_id(), parents, unvisited }, ignored_idxs) + } + + /// Returns the hash of a block's parent if the block is present in the ancestry. + pub fn parent_hash_of(&self, hash: &Header::Hash) -> Option<&Header::Hash> { + self.parents.get(hash) + } + + /// Returns a route if the precommit target block is a descendant of the `base` block. + pub fn ancestry( + &self, + precommit_target_hash: &Header::Hash, + precommit_target_number: &Header::Number, + ) -> Option> { + if precommit_target_number < &self.base.number() { + return None + } + + let mut route = vec![]; + let mut current_hash = *precommit_target_hash; + loop { + if current_hash == self.base.hash() { + break + } + + current_hash = match self.parent_hash_of(¤t_hash) { + Some(parent_hash) => { + let is_visited_before = self.unvisited.get(¤t_hash).is_none(); + if is_visited_before { + // If the current header has been visited in a previous call, it is a + // descendent of `base` (we assume that the previous call was successful). + return Some(route) + } + route.push(current_hash); + + *parent_hash + }, + None => return None, + }; + } + + Some(route) + } + + fn mark_route_as_visited(&mut self, route: Vec) { + for hash in route { + self.unvisited.remove(&hash); + } + } + + fn is_fully_visited(&self) -> bool { + self.unvisited.is_empty() + } +} + +/// Justification verification error. +#[derive(Eq, RuntimeDebug, PartialEq)] +pub enum Error { + /// Could not convert `AuthorityList` to `VoterSet`. + InvalidAuthorityList, + /// Justification is finalizing unexpected header. + InvalidJustificationTarget, + /// The justification contains duplicate headers in its `votes_ancestries` field. + DuplicateVotesAncestries, + /// Error validating a precommit + Precommit(PrecommitError), + /// The cumulative weight of all votes in the justification is not enough to justify commit + /// header finalization. + TooLowCumulativeWeight, + /// The justification contains extra (unused) headers in its `votes_ancestries` field. + RedundantVotesAncestries, +} + +/// Justification verification error. +#[derive(Eq, RuntimeDebug, PartialEq)] +pub enum PrecommitError { + /// Justification contains redundant votes. + RedundantAuthorityVote, + /// Justification contains unknown authority precommit. + UnknownAuthorityVote, + /// Justification contains duplicate authority precommit. + DuplicateAuthorityVote, + /// The authority has provided an invalid signature. + InvalidAuthoritySignature, + /// The justification contains precommit for header that is not a descendant of the commit + /// header. + UnrelatedAncestryVote, +} + +/// The context needed for validating GRANDPA finality proofs. +#[derive(RuntimeDebug)] +pub struct JustificationVerificationContext { + /// The authority set used to verify the justification. + pub voter_set: VoterSet, + /// The ID of the authority set used to verify the justification. + pub authority_set_id: SetId, +} + +impl TryFrom for JustificationVerificationContext { + type Error = Error; + + fn try_from(authority_set: AuthoritySet) -> Result { + let voter_set = + VoterSet::new(authority_set.authorities).ok_or(Error::InvalidAuthorityList)?; + Ok(JustificationVerificationContext { voter_set, authority_set_id: authority_set.set_id }) + } +} + +enum IterationFlow { + Run, + Skip, +} + +/// Verification callbacks. +trait JustificationVerifier { + /// Called when there are duplicate headers in the votes ancestries. + fn process_duplicate_votes_ancestries( + &mut self, + duplicate_votes_ancestries: Vec, + ) -> Result<(), Error>; + + fn process_redundant_vote( + &mut self, + precommit_idx: usize, + ) -> Result; + + fn process_known_authority_vote( + &mut self, + precommit_idx: usize, + signed: &SignedPrecommit
, + ) -> Result; + + fn process_unknown_authority_vote( + &mut self, + precommit_idx: usize, + ) -> Result<(), PrecommitError>; + + fn process_unrelated_ancestry_vote( + &mut self, + precommit_idx: usize, + ) -> Result; + + fn process_invalid_signature_vote( + &mut self, + precommit_idx: usize, + ) -> Result<(), PrecommitError>; + + fn process_valid_vote(&mut self, signed: &SignedPrecommit
); + + /// Called when there are redundant headers in the votes ancestries. + fn process_redundant_votes_ancestries( + &mut self, + redundant_votes_ancestries: BTreeSet, + ) -> Result<(), Error>; + + fn verify_justification( + &mut self, + finalized_target: (Header::Hash, Header::Number), + context: &JustificationVerificationContext, + justification: &GrandpaJustification
, + ) -> Result<(), Error> { + // ensure that it is justification for the expected header + if (justification.commit.target_hash, justification.commit.target_number) != + finalized_target + { + return Err(Error::InvalidJustificationTarget) + } + + let threshold = context.voter_set.threshold().get(); + let (mut chain, ignored_idxs) = AncestryChain::new(justification); + let mut signature_buffer = Vec::new(); + let mut cumulative_weight = 0u64; + + if !ignored_idxs.is_empty() { + self.process_duplicate_votes_ancestries(ignored_idxs)?; + } + + for (precommit_idx, signed) in justification.commit.precommits.iter().enumerate() { + if cumulative_weight >= threshold { + let action = + self.process_redundant_vote(precommit_idx).map_err(Error::Precommit)?; + if matches!(action, IterationFlow::Skip) { + continue + } + } + + // authority must be in the set + let authority_info = match context.voter_set.get(&signed.id) { + Some(authority_info) => { + // The implementer may want to do extra checks here. + // For example to see if the authority has already voted in the same round. + let action = self + .process_known_authority_vote(precommit_idx, signed) + .map_err(Error::Precommit)?; + if matches!(action, IterationFlow::Skip) { + continue + } + + authority_info + }, + None => { + self.process_unknown_authority_vote(precommit_idx).map_err(Error::Precommit)?; + continue + }, + }; + + // all precommits must be descendants of the target block + let maybe_route = + chain.ancestry(&signed.precommit.target_hash, &signed.precommit.target_number); + if maybe_route.is_none() { + let action = self + .process_unrelated_ancestry_vote(precommit_idx) + .map_err(Error::Precommit)?; + if matches!(action, IterationFlow::Skip) { + continue + } + } + + // verify authority signature + if !sp_consensus_grandpa::check_message_signature_with_buffer( + &finality_grandpa::Message::Precommit(signed.precommit.clone()), + &signed.id, + &signed.signature, + justification.round, + context.authority_set_id, + &mut signature_buffer, + ) { + self.process_invalid_signature_vote(precommit_idx).map_err(Error::Precommit)?; + continue + } + + // now we can count the vote since we know that it is valid + self.process_valid_vote(signed); + if let Some(route) = maybe_route { + chain.mark_route_as_visited(route); + cumulative_weight = cumulative_weight.saturating_add(authority_info.weight().get()); + } + } + + // check that the cumulative weight of validators that voted for the justification target + // (or one of its descendents) is larger than the required threshold. + if cumulative_weight < threshold { + return Err(Error::TooLowCumulativeWeight) + } + + // check that there are no extra headers in the justification + if !chain.is_fully_visited() { + self.process_redundant_votes_ancestries(chain.unvisited)?; + } + + Ok(()) + } +} diff --git a/primitives/header-chain/src/justification/verification/optimizer.rs b/primitives/header-chain/src/justification/verification/optimizer.rs new file mode 100644 index 000000000000..3f1e6ab670ca --- /dev/null +++ b/primitives/header-chain/src/justification/verification/optimizer.rs @@ -0,0 +1,142 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Logic for optimizing GRANDPA Finality Proofs. + +use crate::justification::{ + verification::{Error, JustificationVerifier, PrecommitError}, + GrandpaJustification, +}; + +use crate::justification::verification::{ + IterationFlow, JustificationVerificationContext, SignedPrecommit, +}; +use sp_consensus_grandpa::AuthorityId; +use sp_runtime::traits::Header as HeaderT; +use sp_std::{collections::btree_set::BTreeSet, prelude::*}; + +// Verification callbacks for justification optimization. +struct JustificationOptimizer { + votes: BTreeSet, + + extra_precommits: Vec, + duplicate_votes_ancestries_idxs: Vec, + redundant_votes_ancestries: BTreeSet, +} + +impl JustificationOptimizer
{ + fn optimize(self, justification: &mut GrandpaJustification
) { + for invalid_precommit_idx in self.extra_precommits.into_iter().rev() { + justification.commit.precommits.remove(invalid_precommit_idx); + } + if !self.duplicate_votes_ancestries_idxs.is_empty() { + for idx in self.duplicate_votes_ancestries_idxs.iter().rev() { + justification.votes_ancestries.swap_remove(*idx); + } + } + if !self.redundant_votes_ancestries.is_empty() { + justification + .votes_ancestries + .retain(|header| !self.redundant_votes_ancestries.contains(&header.hash())) + } + } +} + +impl JustificationVerifier
for JustificationOptimizer
{ + fn process_duplicate_votes_ancestries( + &mut self, + duplicate_votes_ancestries: Vec, + ) -> Result<(), Error> { + self.duplicate_votes_ancestries_idxs = duplicate_votes_ancestries.to_vec(); + Ok(()) + } + + fn process_redundant_vote( + &mut self, + precommit_idx: usize, + ) -> Result { + self.extra_precommits.push(precommit_idx); + Ok(IterationFlow::Skip) + } + + fn process_known_authority_vote( + &mut self, + precommit_idx: usize, + signed: &SignedPrecommit
, + ) -> Result { + // Skip duplicate votes + if self.votes.contains(&signed.id) { + self.extra_precommits.push(precommit_idx); + return Ok(IterationFlow::Skip) + } + + Ok(IterationFlow::Run) + } + + fn process_unknown_authority_vote( + &mut self, + precommit_idx: usize, + ) -> Result<(), PrecommitError> { + self.extra_precommits.push(precommit_idx); + Ok(()) + } + + fn process_unrelated_ancestry_vote( + &mut self, + precommit_idx: usize, + ) -> Result { + self.extra_precommits.push(precommit_idx); + Ok(IterationFlow::Skip) + } + + fn process_invalid_signature_vote( + &mut self, + precommit_idx: usize, + ) -> Result<(), PrecommitError> { + self.extra_precommits.push(precommit_idx); + Ok(()) + } + + fn process_valid_vote(&mut self, signed: &SignedPrecommit
) { + self.votes.insert(signed.id.clone()); + } + + fn process_redundant_votes_ancestries( + &mut self, + redundant_votes_ancestries: BTreeSet, + ) -> Result<(), Error> { + self.redundant_votes_ancestries = redundant_votes_ancestries; + Ok(()) + } +} + +/// Verify and optimize given justification by removing unknown and duplicate votes. +pub fn verify_and_optimize_justification( + finalized_target: (Header::Hash, Header::Number), + context: &JustificationVerificationContext, + justification: &mut GrandpaJustification
, +) -> Result<(), Error> { + let mut optimizer = JustificationOptimizer { + votes: BTreeSet::new(), + extra_precommits: vec![], + duplicate_votes_ancestries_idxs: vec![], + redundant_votes_ancestries: Default::default(), + }; + optimizer.verify_justification(finalized_target, context, justification)?; + optimizer.optimize(justification); + + Ok(()) +} diff --git a/primitives/header-chain/src/justification/verification/strict.rs b/primitives/header-chain/src/justification/verification/strict.rs new file mode 100644 index 000000000000..858cf517a431 --- /dev/null +++ b/primitives/header-chain/src/justification/verification/strict.rs @@ -0,0 +1,108 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Logic for checking if GRANDPA Finality Proofs are valid and optimal. + +use crate::justification::{ + verification::{Error, JustificationVerifier, PrecommitError}, + GrandpaJustification, +}; + +use crate::justification::verification::{ + IterationFlow, JustificationVerificationContext, SignedPrecommit, +}; +use sp_consensus_grandpa::AuthorityId; +use sp_runtime::traits::Header as HeaderT; +use sp_std::{collections::btree_set::BTreeSet, vec::Vec}; + +/// Verification callbacks that reject all unknown, duplicate or redundant votes. +struct StrictJustificationVerifier { + votes: BTreeSet, +} + +impl JustificationVerifier
for StrictJustificationVerifier { + fn process_duplicate_votes_ancestries( + &mut self, + _duplicate_votes_ancestries: Vec, + ) -> Result<(), Error> { + Err(Error::DuplicateVotesAncestries) + } + + fn process_redundant_vote( + &mut self, + _precommit_idx: usize, + ) -> Result { + Err(PrecommitError::RedundantAuthorityVote) + } + + fn process_known_authority_vote( + &mut self, + _precommit_idx: usize, + signed: &SignedPrecommit
, + ) -> Result { + if self.votes.contains(&signed.id) { + // There's a lot of code in `validate_commit` and `import_precommit` functions + // inside `finality-grandpa` crate (mostly related to reporting equivocations). + // But the only thing that we care about is that only first vote from the + // authority is accepted + return Err(PrecommitError::DuplicateAuthorityVote) + } + + Ok(IterationFlow::Run) + } + + fn process_unknown_authority_vote( + &mut self, + _precommit_idx: usize, + ) -> Result<(), PrecommitError> { + Err(PrecommitError::UnknownAuthorityVote) + } + + fn process_unrelated_ancestry_vote( + &mut self, + _precommit_idx: usize, + ) -> Result { + Err(PrecommitError::UnrelatedAncestryVote) + } + + fn process_invalid_signature_vote( + &mut self, + _precommit_idx: usize, + ) -> Result<(), PrecommitError> { + Err(PrecommitError::InvalidAuthoritySignature) + } + + fn process_valid_vote(&mut self, signed: &SignedPrecommit
) { + self.votes.insert(signed.id.clone()); + } + + fn process_redundant_votes_ancestries( + &mut self, + _redundant_votes_ancestries: BTreeSet, + ) -> Result<(), Error> { + Err(Error::RedundantVotesAncestries) + } +} + +/// Verify that justification, that is generated by given authority set, finalizes given header. +pub fn verify_justification( + finalized_target: (Header::Hash, Header::Number), + context: &JustificationVerificationContext, + justification: &GrandpaJustification
, +) -> Result<(), Error> { + let mut verifier = StrictJustificationVerifier { votes: BTreeSet::new() }; + verifier.verify_justification(finalized_target, context, justification) +} diff --git a/primitives/header-chain/src/lib.rs b/primitives/header-chain/src/lib.rs new file mode 100644 index 000000000000..1459b1c1994b --- /dev/null +++ b/primitives/header-chain/src/lib.rs @@ -0,0 +1,366 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Defines traits which represent a common interface for Substrate pallets which want to +//! incorporate bridge functionality. + +#![cfg_attr(not(feature = "std"), no_std)] + +use crate::justification::{ + GrandpaJustification, JustificationVerificationContext, JustificationVerificationError, +}; +use bp_runtime::{ + BasicOperatingMode, Chain, HashOf, HasherOf, HeaderOf, RawStorageProof, StorageProofChecker, + StorageProofError, UnderlyingChainProvider, +}; +use codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}; +use core::{clone::Clone, cmp::Eq, default::Default, fmt::Debug}; +use frame_support::PalletError; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_consensus_grandpa::{AuthorityList, ConsensusLog, SetId, GRANDPA_ENGINE_ID}; +use sp_runtime::{traits::Header as HeaderT, Digest, RuntimeDebug}; +use sp_std::{boxed::Box, vec::Vec}; + +pub mod justification; +pub mod storage_keys; + +/// Header chain error. +#[derive(Clone, Decode, Encode, Eq, PartialEq, PalletError, Debug, TypeInfo)] +pub enum HeaderChainError { + /// Header with given hash is missing from the chain. + UnknownHeader, + /// Storage proof related error. + StorageProof(StorageProofError), +} + +/// Header data that we're storing on-chain. +/// +/// Even though we may store full header, our applications (XCM) only use couple of header +/// fields. Extracting those values makes on-chain storage and PoV smaller, which is good. +#[derive(Clone, Decode, Encode, Eq, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] +pub struct StoredHeaderData { + /// Header number. + pub number: Number, + /// Header state root. + pub state_root: Hash, +} + +/// Stored header data builder. +pub trait StoredHeaderDataBuilder { + /// Build header data from self. + fn build(&self) -> StoredHeaderData; +} + +impl StoredHeaderDataBuilder for H { + fn build(&self) -> StoredHeaderData { + StoredHeaderData { number: *self.number(), state_root: *self.state_root() } + } +} + +/// Substrate header chain, abstracted from the way it is stored. +pub trait HeaderChain { + /// Returns state (storage) root of given finalized header. + fn finalized_header_state_root(header_hash: HashOf) -> Option>; + /// Get storage proof checker using finalized header. + fn storage_proof_checker( + header_hash: HashOf, + storage_proof: RawStorageProof, + ) -> Result>, HeaderChainError> { + let state_root = Self::finalized_header_state_root(header_hash) + .ok_or(HeaderChainError::UnknownHeader)?; + StorageProofChecker::new(state_root, storage_proof).map_err(HeaderChainError::StorageProof) + } +} + +/// A type that can be used as a parameter in a dispatchable function. +/// +/// When using `decl_module` all arguments for call functions must implement this trait. +pub trait Parameter: Codec + EncodeLike + Clone + Eq + Debug + TypeInfo {} +impl Parameter for T where T: Codec + EncodeLike + Clone + Eq + Debug + TypeInfo {} + +/// A GRANDPA Authority List and ID. +#[derive(Default, Encode, Eq, Decode, RuntimeDebug, PartialEq, Clone, TypeInfo)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct AuthoritySet { + /// List of GRANDPA authorities for the current round. + pub authorities: AuthorityList, + /// Monotonic identifier of the current GRANDPA authority set. + pub set_id: SetId, +} + +impl AuthoritySet { + /// Create a new GRANDPA Authority Set. + pub fn new(authorities: AuthorityList, set_id: SetId) -> Self { + Self { authorities, set_id } + } +} + +/// Data required for initializing the GRANDPA bridge pallet. +/// +/// The bridge needs to know where to start its sync from, and this provides that initial context. +#[derive( + Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, Clone, TypeInfo, Serialize, Deserialize, +)] +pub struct InitializationData { + /// The header from which we should start syncing. + pub header: Box, + /// The initial authorities of the pallet. + pub authority_list: AuthorityList, + /// The ID of the initial authority set. + pub set_id: SetId, + /// Pallet operating mode. + pub operating_mode: BasicOperatingMode, +} + +/// Abstract finality proof that is justifying block finality. +pub trait FinalityProof: Clone + Send + Sync + Debug { + /// Return hash of header that this proof is generated for. + fn target_header_hash(&self) -> Hash; + + /// Return number of header that this proof is generated for. + fn target_header_number(&self) -> Number; +} + +/// A trait that provides helper methods for querying the consensus log. +pub trait ConsensusLogReader { + /// Returns true if digest contains item that schedules authorities set change. + fn schedules_authorities_change(digest: &Digest) -> bool; +} + +/// A struct that provides helper methods for querying the GRANDPA consensus log. +pub struct GrandpaConsensusLogReader(sp_std::marker::PhantomData); + +impl GrandpaConsensusLogReader { + pub fn find_scheduled_change( + digest: &Digest, + ) -> Option> { + // find the first consensus digest with the right ID which converts to + // the right kind of consensus log. + digest + .convert_first(|log| log.consensus_try_to(&GRANDPA_ENGINE_ID)) + .and_then(|log| match log { + ConsensusLog::ScheduledChange(change) => Some(change), + _ => None, + }) + } + + pub fn find_forced_change( + digest: &Digest, + ) -> Option<(Number, sp_consensus_grandpa::ScheduledChange)> { + // find the first consensus digest with the right ID which converts to + // the right kind of consensus log. + digest + .convert_first(|log| log.consensus_try_to(&GRANDPA_ENGINE_ID)) + .and_then(|log| match log { + ConsensusLog::ForcedChange(delay, change) => Some((delay, change)), + _ => None, + }) + } +} + +impl ConsensusLogReader for GrandpaConsensusLogReader { + fn schedules_authorities_change(digest: &Digest) -> bool { + GrandpaConsensusLogReader::::find_scheduled_change(digest).is_some() + } +} + +/// The finality-related info associated to a header. +#[derive(Encode, Decode, Debug, PartialEq, Clone, TypeInfo)] +pub struct HeaderFinalityInfo { + /// The header finality proof. + pub finality_proof: FinalityProof, + /// The new verification context introduced by the header. + pub new_verification_context: Option, +} + +/// Grandpa-related info associated to a header. This info can be saved to events. +pub type StoredHeaderGrandpaInfo
= + HeaderFinalityInfo, AuthoritySet>; + +/// Processed Grandpa-related info associated to a header. +pub type HeaderGrandpaInfo
= + HeaderFinalityInfo, JustificationVerificationContext>; + +impl TryFrom> for HeaderGrandpaInfo
{ + type Error = JustificationVerificationError; + + fn try_from(grandpa_info: StoredHeaderGrandpaInfo
) -> Result { + Ok(Self { + finality_proof: grandpa_info.finality_proof, + new_verification_context: match grandpa_info.new_verification_context { + Some(authority_set) => Some(authority_set.try_into()?), + None => None, + }, + }) + } +} + +/// Helper trait for finding equivocations in finality proofs. +pub trait FindEquivocations { + /// The type returned when encountering an error while looking for equivocations. + type Error: Debug; + + /// Find equivocations. + fn find_equivocations( + verification_context: &FinalityVerificationContext, + synced_proof: &FinalityProof, + source_proofs: &[FinalityProof], + ) -> Result, Self::Error>; +} + +/// A minimized version of `pallet-bridge-grandpa::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum BridgeGrandpaCall { + /// `pallet-bridge-grandpa::Call::submit_finality_proof` + #[codec(index = 0)] + submit_finality_proof { + finality_target: Box
, + justification: justification::GrandpaJustification
, + }, + /// `pallet-bridge-grandpa::Call::initialize` + #[codec(index = 1)] + initialize { init_data: InitializationData
}, +} + +/// The `BridgeGrandpaCall` used by a chain. +pub type BridgeGrandpaCallOf = BridgeGrandpaCall>; + +/// Substrate-based chain that is using direct GRANDPA finality. +/// +/// Keep in mind that parachains are relying on relay chain GRANDPA, so they should not implement +/// this trait. +pub trait ChainWithGrandpa: Chain { + /// Name of the bridge GRANDPA pallet (used in `construct_runtime` macro call) that is deployed + /// at some other chain to bridge with this `ChainWithGrandpa`. + /// + /// We assume that all chains that are bridging with this `ChainWithGrandpa` are using + /// the same name. + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str; + + /// Max number of GRANDPA authorities at the chain. + /// + /// This is a strict constant. If bridged chain will have more authorities than that, + /// the GRANDPA bridge pallet may halt. + const MAX_AUTHORITIES_COUNT: u32; + + /// Max reasonable number of headers in `votes_ancestries` vector of the GRANDPA justification. + /// + /// This isn't a strict limit. The relay may submit justifications with more headers in its + /// ancestry and the pallet will accept such justification. The limit is only used to compute + /// maximal refund amount and submitting justifications which exceed the limit, may be costly + /// to submitter. + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32; + + /// Maximal size of the mandatory chain header. Mandatory header is the header that enacts new + /// GRANDPA authorities set (so it has large digest inside). + /// + /// This isn't a strict limit. The relay may submit larger headers and the pallet will accept + /// the call. The limit is only used to compute maximal refund amount and doing calls which + /// exceed the limit, may be costly to submitter. + const MAX_MANDATORY_HEADER_SIZE: u32; + + /// Average size of the chain header. We don't expect to see there headers that change GRANDPA + /// authorities set (GRANDPA will probably be able to finalize at least one additional header + /// per session on non test chains), so this is average size of headers that aren't changing the + /// set. + /// + /// This isn't a strict limit. The relay may submit justifications with larger headers and the + /// pallet will accept the call. However, if the total size of all `submit_finality_proof` + /// arguments exceeds the maximal size, computed using this average size, relayer will only get + /// partial refund. + /// + /// We expect some headers on production chains that are above this size. But they are rare and + /// if rellayer cares about its profitability, we expect it'll select other headers for + /// submission. + const AVERAGE_HEADER_SIZE: u32; +} + +impl ChainWithGrandpa for T +where + T: Chain + UnderlyingChainProvider, + T::Chain: ChainWithGrandpa, +{ + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = + ::WITH_CHAIN_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = ::MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + ::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_MANDATORY_HEADER_SIZE: u32 = + ::MAX_MANDATORY_HEADER_SIZE; + const AVERAGE_HEADER_SIZE: u32 = ::AVERAGE_HEADER_SIZE; +} + +/// Returns maximal expected size of `submit_finality_proof` call arguments. +pub fn max_expected_submit_finality_proof_arguments_size( + is_mandatory_finality_target: bool, + precommits: u32, +) -> u32 { + let max_expected_justification_size = + GrandpaJustification::>::max_reasonable_size::(precommits); + + // call arguments are header and justification + let max_expected_finality_target_size = if is_mandatory_finality_target { + C::MAX_MANDATORY_HEADER_SIZE + } else { + C::AVERAGE_HEADER_SIZE + }; + max_expected_finality_target_size.saturating_add(max_expected_justification_size) +} + +#[cfg(test)] +mod tests { + use super::*; + use frame_support::weights::Weight; + use sp_runtime::{testing::H256, traits::BlakeTwo256, MultiSignature}; + + struct TestChain; + + impl Chain for TestChain { + type BlockNumber = u32; + type Hash = H256; + type Hasher = BlakeTwo256; + type Header = sp_runtime::generic::Header; + type AccountId = u64; + type Balance = u64; + type Nonce = u64; + type Signature = MultiSignature; + + fn max_extrinsic_size() -> u32 { + 0 + } + fn max_extrinsic_weight() -> Weight { + Weight::zero() + } + } + + impl ChainWithGrandpa for TestChain { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = "Test"; + const MAX_AUTHORITIES_COUNT: u32 = 128; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 2; + const MAX_MANDATORY_HEADER_SIZE: u32 = 100_000; + const AVERAGE_HEADER_SIZE: u32 = 1_024; + } + + #[test] + fn max_expected_submit_finality_proof_arguments_size_respects_mandatory_argument() { + assert!( + max_expected_submit_finality_proof_arguments_size::(true, 100) > + max_expected_submit_finality_proof_arguments_size::(false, 100), + ); + } +} diff --git a/primitives/header-chain/src/storage_keys.rs b/primitives/header-chain/src/storage_keys.rs new file mode 100644 index 000000000000..55d095afbf2a --- /dev/null +++ b/primitives/header-chain/src/storage_keys.rs @@ -0,0 +1,104 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Storage keys of bridge GRANDPA pallet. + +/// Name of the `IsHalted` storage value. +pub const PALLET_OPERATING_MODE_VALUE_NAME: &str = "PalletOperatingMode"; +/// Name of the `BestFinalized` storage value. +pub const BEST_FINALIZED_VALUE_NAME: &str = "BestFinalized"; +/// Name of the `CurrentAuthoritySet` storage value. +pub const CURRENT_AUTHORITY_SET_VALUE_NAME: &str = "CurrentAuthoritySet"; + +use sp_core::storage::StorageKey; + +/// Storage key of the `PalletOperatingMode` variable in the runtime storage. +pub fn pallet_operating_mode_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + PALLET_OPERATING_MODE_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +/// Storage key of the `CurrentAuthoritySet` variable in the runtime storage. +pub fn current_authority_set_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + CURRENT_AUTHORITY_SET_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +/// Storage key of the best finalized header number and hash value in the runtime storage. +pub fn best_finalized_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + BEST_FINALIZED_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + + #[test] + fn pallet_operating_mode_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // compatibility with previous pallet. + let storage_key = pallet_operating_mode_key("BridgeGrandpa").0; + assert_eq!( + storage_key, + hex!("0b06f475eddb98cf933a12262e0388de0f4cf0917788d791142ff6c1f216e7b3").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn current_authority_set_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // compatibility with previous pallet. + let storage_key = current_authority_set_key("BridgeGrandpa").0; + assert_eq!( + storage_key, + hex!("0b06f475eddb98cf933a12262e0388de24a7b8b5717ea33346fa595a66ccbcb0").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn best_finalized_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // compatibility with previous pallet. + let storage_key = best_finalized_key("BridgeGrandpa").0; + assert_eq!( + storage_key, + hex!("0b06f475eddb98cf933a12262e0388dea4ebafdd473c549fdb24c5c991c5591c").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } +} diff --git a/cumulus/bridges/primitives/header-chain/tests/implementation_match.rs b/primitives/header-chain/tests/implementation_match.rs similarity index 99% rename from cumulus/bridges/primitives/header-chain/tests/implementation_match.rs rename to primitives/header-chain/tests/implementation_match.rs index db96961832d4..1f61f91ff4bb 100644 --- a/cumulus/bridges/primitives/header-chain/tests/implementation_match.rs +++ b/primitives/header-chain/tests/implementation_match.rs @@ -1,4 +1,4 @@ -// Copyright 2020-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -42,7 +42,7 @@ struct AncestryChain(bp_header_chain::justification::AncestryChain); impl AncestryChain { fn new(justification: &GrandpaJustification) -> Self { - Self(bp_header_chain::justification::AncestryChain::new(justification)) + Self(bp_header_chain::justification::AncestryChain::new(justification).0) } } @@ -58,7 +58,7 @@ impl finality_grandpa::Chain for AncestryChain { if current_hash == base { break } - match self.0.parents.get(¤t_hash) { + match self.0.parent_hash_of(¤t_hash) { Some(parent_hash) => { current_hash = *parent_hash; route.push(current_hash); diff --git a/primitives/header-chain/tests/justification/equivocation.rs b/primitives/header-chain/tests/justification/equivocation.rs new file mode 100644 index 000000000000..0bc084cc1a97 --- /dev/null +++ b/primitives/header-chain/tests/justification/equivocation.rs @@ -0,0 +1,124 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tests for Grandpa equivocations collector code. + +use bp_header_chain::justification::EquivocationsCollector; +use bp_test_utils::*; +use finality_grandpa::Precommit; +use sp_consensus_grandpa::EquivocationProof; + +type TestHeader = sp_runtime::testing::Header; + +#[test] +fn duplicate_votes_are_not_considered_equivocations() { + let verification_context = verification_context(TEST_GRANDPA_SET_ID); + let base_justification = make_default_justification::(&test_header(1)); + + let mut collector = + EquivocationsCollector::new(&verification_context, &base_justification).unwrap(); + collector.parse_justifications(&[base_justification.clone()]); + + assert_eq!(collector.into_equivocation_proofs().len(), 0); +} + +#[test] +fn equivocations_are_detected_in_base_justification_redundant_votes() { + let mut base_justification = make_default_justification::(&test_header(1)); + + let first_vote = base_justification.commit.precommits[0].clone(); + let equivocation = signed_precommit::( + &ALICE, + header_id::(1), + base_justification.round, + TEST_GRANDPA_SET_ID, + ); + base_justification.commit.precommits.push(equivocation.clone()); + + let verification_context = verification_context(TEST_GRANDPA_SET_ID); + let collector = + EquivocationsCollector::new(&verification_context, &base_justification).unwrap(); + + assert_eq!( + collector.into_equivocation_proofs(), + vec![EquivocationProof::new( + 1, + sp_consensus_grandpa::Equivocation::Precommit(finality_grandpa::Equivocation { + round_number: 1, + identity: ALICE.into(), + first: ( + Precommit { + target_hash: first_vote.precommit.target_hash, + target_number: first_vote.precommit.target_number + }, + first_vote.signature + ), + second: ( + Precommit { + target_hash: equivocation.precommit.target_hash, + target_number: equivocation.precommit.target_number + }, + equivocation.signature + ) + }) + )] + ); +} + +#[test] +fn equivocations_are_detected_in_extra_justification_redundant_votes() { + let base_justification = make_default_justification::(&test_header(1)); + let first_vote = base_justification.commit.precommits[0].clone(); + + let mut extra_justification = base_justification.clone(); + let equivocation = signed_precommit::( + &ALICE, + header_id::(1), + base_justification.round, + TEST_GRANDPA_SET_ID, + ); + extra_justification.commit.precommits.push(equivocation.clone()); + + let verification_context = verification_context(TEST_GRANDPA_SET_ID); + let mut collector = + EquivocationsCollector::new(&verification_context, &base_justification).unwrap(); + collector.parse_justifications(&[extra_justification]); + + assert_eq!( + collector.into_equivocation_proofs(), + vec![EquivocationProof::new( + 1, + sp_consensus_grandpa::Equivocation::Precommit(finality_grandpa::Equivocation { + round_number: 1, + identity: ALICE.into(), + first: ( + Precommit { + target_hash: first_vote.precommit.target_hash, + target_number: first_vote.precommit.target_number + }, + first_vote.signature + ), + second: ( + Precommit { + target_hash: equivocation.precommit.target_hash, + target_number: equivocation.precommit.target_number + }, + equivocation.signature + ) + }) + )] + ); +} diff --git a/primitives/header-chain/tests/justification/optimizer.rs b/primitives/header-chain/tests/justification/optimizer.rs new file mode 100644 index 000000000000..8d7e2d650256 --- /dev/null +++ b/primitives/header-chain/tests/justification/optimizer.rs @@ -0,0 +1,196 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tests for Grandpa Justification optimizer code. + +use bp_header_chain::justification::verify_and_optimize_justification; +use bp_test_utils::*; +use finality_grandpa::SignedPrecommit; +use sp_consensus_grandpa::AuthoritySignature; + +type TestHeader = sp_runtime::testing::Header; + +#[test] +fn optimizer_does_noting_with_minimal_justification() { + let mut justification = make_default_justification::(&test_header(1)); + + let num_precommits_before = justification.commit.precommits.len(); + verify_and_optimize_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before, num_precommits_after); +} + +#[test] +fn unknown_authority_votes_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits.push(signed_precommit::( + &bp_test_utils::Account(42), + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + + let num_precommits_before = justification.commit.precommits.len(); + verify_and_optimize_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} + +#[test] +fn duplicate_authority_votes_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + justification + .commit + .precommits + .push(justification.commit.precommits.first().cloned().unwrap()); + + let num_precommits_before = justification.commit.precommits.len(); + verify_and_optimize_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} + +#[test] +fn invalid_authority_signatures_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + + let target = header_id::(1); + let invalid_raw_signature: Vec = ALICE.sign(b"").to_bytes().into(); + justification.commit.precommits.insert( + 0, + SignedPrecommit { + precommit: finality_grandpa::Precommit { + target_hash: target.0, + target_number: target.1, + }, + signature: AuthoritySignature::try_from(invalid_raw_signature).unwrap(), + id: ALICE.into(), + }, + ); + + let num_precommits_before = justification.commit.precommits.len(); + verify_and_optimize_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} + +#[test] +fn redundant_authority_votes_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits.push(signed_precommit::( + &EVE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + )); + + let num_precommits_before = justification.commit.precommits.len(); + verify_and_optimize_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} + +#[test] +fn unrelated_ancestry_votes_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(2)); + justification.commit.precommits.insert( + 0, + signed_precommit::( + &ALICE, + header_id::(1), + justification.round, + TEST_GRANDPA_SET_ID, + ), + ); + + let num_precommits_before = justification.commit.precommits.len(); + verify_and_optimize_justification::( + header_id::(2), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + let num_precommits_after = justification.commit.precommits.len(); + + assert_eq!(num_precommits_before - 1, num_precommits_after); +} + +#[test] +fn duplicate_votes_ancestries_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + let optimized_votes_ancestries = justification.votes_ancestries.clone(); + justification.votes_ancestries = justification + .votes_ancestries + .into_iter() + .flat_map(|item| std::iter::repeat(item).take(3)) + .collect(); + + verify_and_optimize_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + + assert_eq!(justification.votes_ancestries, optimized_votes_ancestries); +} + +#[test] +fn redundant_votes_ancestries_are_removed_by_optimizer() { + let mut justification = make_default_justification::(&test_header(1)); + justification.votes_ancestries.push(test_header(100)); + + let num_votes_ancestries_before = justification.votes_ancestries.len(); + verify_and_optimize_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &mut justification, + ) + .unwrap(); + let num_votes_ancestries_after = justification.votes_ancestries.len(); + + assert_eq!(num_votes_ancestries_before - 1, num_votes_ancestries_after); +} diff --git a/primitives/header-chain/tests/justification/strict.rs b/primitives/header-chain/tests/justification/strict.rs new file mode 100644 index 000000000000..639a669572b2 --- /dev/null +++ b/primitives/header-chain/tests/justification/strict.rs @@ -0,0 +1,202 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tests for Grandpa strict justification verifier code. + +use bp_header_chain::justification::{ + required_justification_precommits, verify_justification, JustificationVerificationContext, + JustificationVerificationError, PrecommitError, +}; +use bp_test_utils::*; + +type TestHeader = sp_runtime::testing::Header; + +#[test] +fn valid_justification_accepted() { + let authorities = vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1)]; + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: authorities.clone(), + ancestors: 7, + forks: 3, + }; + + let justification = make_justification_for_header::(params.clone()); + assert_eq!( + verify_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &justification, + ), + Ok(()), + ); + + assert_eq!(justification.commit.precommits.len(), authorities.len()); + assert_eq!(justification.votes_ancestries.len(), params.ancestors as usize); +} + +#[test] +fn valid_justification_accepted_with_single_fork() { + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: vec![(ALICE, 1), (BOB, 1), (CHARLIE, 1)], + ancestors: 5, + forks: 1, + }; + + assert_eq!( + verify_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &make_justification_for_header::(params) + ), + Ok(()), + ); +} + +#[test] +fn valid_justification_accepted_with_arbitrary_number_of_authorities() { + use finality_grandpa::voter_set::VoterSet; + use sp_consensus_grandpa::AuthorityId; + + let n = 15; + let required_signatures = required_justification_precommits(n as _); + let authorities = accounts(n).iter().map(|k| (*k, 1)).collect::>(); + + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: authorities.clone().into_iter().take(required_signatures as _).collect(), + ancestors: n.into(), + forks: required_signatures, + }; + + let authorities = authorities + .iter() + .map(|(id, w)| (AuthorityId::from(*id), *w)) + .collect::>(); + let voter_set = VoterSet::new(authorities).unwrap(); + + assert_eq!( + verify_justification::( + header_id::(1), + &JustificationVerificationContext { voter_set, authority_set_id: TEST_GRANDPA_SET_ID }, + &make_justification_for_header::(params) + ), + Ok(()), + ); +} + +#[test] +fn justification_with_invalid_target_rejected() { + assert_eq!( + verify_justification::( + header_id::(2), + &verification_context(TEST_GRANDPA_SET_ID), + &make_default_justification::(&test_header(1)), + ), + Err(JustificationVerificationError::InvalidJustificationTarget), + ); +} + +#[test] +fn justification_with_invalid_commit_rejected() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits.clear(); + + assert_eq!( + verify_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &justification, + ), + Err(JustificationVerificationError::TooLowCumulativeWeight), + ); +} + +#[test] +fn justification_with_invalid_authority_signature_rejected() { + let mut justification = make_default_justification::(&test_header(1)); + justification.commit.precommits[0].signature = + sp_core::crypto::UncheckedFrom::unchecked_from([1u8; 64]); + + assert_eq!( + verify_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &justification, + ), + Err(JustificationVerificationError::Precommit(PrecommitError::InvalidAuthoritySignature)), + ); +} + +#[test] +fn justification_with_duplicate_votes_ancestry() { + let mut justification = make_default_justification::(&test_header(1)); + justification.votes_ancestries.push(justification.votes_ancestries[0].clone()); + + assert_eq!( + verify_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &justification, + ), + Err(JustificationVerificationError::DuplicateVotesAncestries), + ); +} +#[test] +fn justification_with_redundant_votes_ancestry() { + let mut justification = make_default_justification::(&test_header(1)); + justification.votes_ancestries.push(test_header(10)); + + assert_eq!( + verify_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &justification, + ), + Err(JustificationVerificationError::RedundantVotesAncestries), + ); +} + +#[test] +fn justification_is_invalid_if_we_dont_meet_threshold() { + // Need at least three authorities to sign off or else the voter set threshold can't be reached + let authorities = vec![(ALICE, 1), (BOB, 1)]; + + let params = JustificationGeneratorParams { + header: test_header(1), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: authorities.clone(), + ancestors: 2 * authorities.len() as u32, + forks: 2, + }; + + assert_eq!( + verify_justification::( + header_id::(1), + &verification_context(TEST_GRANDPA_SET_ID), + &make_justification_for_header::(params) + ), + Err(JustificationVerificationError::TooLowCumulativeWeight), + ); +} diff --git a/primitives/header-chain/tests/tests.rs b/primitives/header-chain/tests/tests.rs new file mode 100644 index 000000000000..269fde09bb71 --- /dev/null +++ b/primitives/header-chain/tests/tests.rs @@ -0,0 +1,23 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +mod justification { + mod equivocation; + mod optimizer; + mod strict; +} + +mod implementation_match; diff --git a/primitives/messages/Cargo.toml b/primitives/messages/Cargo.toml new file mode 100644 index 000000000000..10369e8c9225 --- /dev/null +++ b/primitives/messages/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "bp-messages" +description = "Primitives of messages module." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } +serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } + +# Bridge dependencies + +bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { path = "../header-chain", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +hex = "0.4" +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "scale-info/std", + "serde/std", + "sp-core/std", + "sp-std/std", +] diff --git a/primitives/messages/src/lib.rs b/primitives/messages/src/lib.rs new file mode 100644 index 000000000000..e48914f75918 --- /dev/null +++ b/primitives/messages/src/lib.rs @@ -0,0 +1,530 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives of messages module. + +#![cfg_attr(not(feature = "std"), no_std)] +// RuntimeApi generated functions +#![allow(clippy::too_many_arguments)] + +use bp_header_chain::HeaderChainError; +use bp_runtime::{ + messages::MessageDispatchResult, BasicOperatingMode, OperatingMode, RangeInclusiveExt, + StorageProofError, +}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::PalletError; +// Weight is reexported to avoid additional frame-support dependencies in related crates. +pub use frame_support::weights::Weight; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use source_chain::RelayersRewards; +use sp_core::{RuntimeDebug, TypeId}; +use sp_std::{collections::vec_deque::VecDeque, ops::RangeInclusive, prelude::*}; + +pub mod source_chain; +pub mod storage_keys; +pub mod target_chain; + +/// Messages pallet operating mode. +#[derive( + Encode, + Decode, + Clone, + Copy, + PartialEq, + Eq, + RuntimeDebug, + TypeInfo, + MaxEncodedLen, + Serialize, + Deserialize, +)] +pub enum MessagesOperatingMode { + /// Basic operating mode (Normal/Halted) + Basic(BasicOperatingMode), + /// The pallet is not accepting outbound messages. Inbound messages and receiving proofs + /// are still accepted. + /// + /// This mode may be used e.g. when bridged chain expects upgrade. Then to avoid dispatch + /// failures, the pallet owner may stop accepting new messages, while continuing to deliver + /// queued messages to the bridged chain. Once upgrade is completed, the mode may be switched + /// back to `Normal`. + RejectingOutboundMessages, +} + +impl Default for MessagesOperatingMode { + fn default() -> Self { + MessagesOperatingMode::Basic(BasicOperatingMode::Normal) + } +} + +impl OperatingMode for MessagesOperatingMode { + fn is_halted(&self) -> bool { + match self { + Self::Basic(operating_mode) => operating_mode.is_halted(), + _ => false, + } + } +} + +/// Lane id which implements `TypeId`. +#[derive( + Clone, Copy, Decode, Default, Encode, Eq, Ord, PartialOrd, PartialEq, TypeInfo, MaxEncodedLen, +)] +pub struct LaneId(pub [u8; 4]); + +impl core::fmt::Debug for LaneId { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { + self.0.fmt(fmt) + } +} + +impl AsRef<[u8]> for LaneId { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl TypeId for LaneId { + const TYPE_ID: [u8; 4] = *b"blan"; +} + +/// Message nonce. Valid messages will never have 0 nonce. +pub type MessageNonce = u64; + +/// Message id as a tuple. +pub type BridgeMessageId = (LaneId, MessageNonce); + +/// Opaque message payload. We only decode this payload when it is dispatched. +pub type MessagePayload = Vec; + +/// Message key (unique message identifier) as it is stored in the storage. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +pub struct MessageKey { + /// ID of the message lane. + pub lane_id: LaneId, + /// Message nonce. + pub nonce: MessageNonce, +} + +/// Message as it is stored in the storage. +#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] +pub struct Message { + /// Message key. + pub key: MessageKey, + /// Message payload. + pub payload: MessagePayload, +} + +/// Inbound lane data. +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct InboundLaneData { + /// Identifiers of relayers and messages that they have delivered to this lane (ordered by + /// message nonce). + /// + /// This serves as a helper storage item, to allow the source chain to easily pay rewards + /// to the relayers who successfully delivered messages to the target chain (inbound lane). + /// + /// It is guaranteed to have at most N entries, where N is configured at the module level. + /// If there are N entries in this vec, then: + /// 1) all incoming messages are rejected if they're missing corresponding + /// `proof-of(outbound-lane.state)`; 2) all incoming messages are rejected if + /// `proof-of(outbound-lane.state).last_delivered_nonce` is equal to + /// `self.last_confirmed_nonce`. Given what is said above, all nonces in this queue are in + /// range: `(self.last_confirmed_nonce; self.last_delivered_nonce()]`. + /// + /// When a relayer sends a single message, both of MessageNonces are the same. + /// When relayer sends messages in a batch, the first arg is the lowest nonce, second arg the + /// highest nonce. Multiple dispatches from the same relayer are allowed. + pub relayers: VecDeque>, + + /// Nonce of the last message that + /// a) has been delivered to the target (this) chain and + /// b) the delivery has been confirmed on the source chain + /// + /// that the target chain knows of. + /// + /// This value is updated indirectly when an `OutboundLane` state of the source + /// chain is received alongside with new messages delivery. + pub last_confirmed_nonce: MessageNonce, +} + +impl Default for InboundLaneData { + fn default() -> Self { + InboundLaneData { relayers: VecDeque::new(), last_confirmed_nonce: 0 } + } +} + +impl InboundLaneData { + /// Returns approximate size of the struct, given a number of entries in the `relayers` set and + /// size of each entry. + /// + /// Returns `None` if size overflows `usize` limits. + pub fn encoded_size_hint(relayers_entries: usize) -> Option + where + RelayerId: MaxEncodedLen, + { + relayers_entries + .checked_mul(UnrewardedRelayer::::max_encoded_len())? + .checked_add(MessageNonce::max_encoded_len()) + } + + /// Returns the approximate size of the struct as u32, given a number of entries in the + /// `relayers` set and the size of each entry. + /// + /// Returns `u32::MAX` if size overflows `u32` limits. + pub fn encoded_size_hint_u32(relayers_entries: usize) -> u32 + where + RelayerId: MaxEncodedLen, + { + Self::encoded_size_hint(relayers_entries) + .and_then(|x| u32::try_from(x).ok()) + .unwrap_or(u32::MAX) + } + + /// Nonce of the last message that has been delivered to this (target) chain. + pub fn last_delivered_nonce(&self) -> MessageNonce { + self.relayers + .back() + .map(|entry| entry.messages.end) + .unwrap_or(self.last_confirmed_nonce) + } + + /// Returns the total number of messages in the `relayers` vector, + /// saturating in case of underflow or overflow. + pub fn total_unrewarded_messages(&self) -> MessageNonce { + let relayers = &self.relayers; + match (relayers.front(), relayers.back()) { + (Some(front), Some(back)) => + (front.messages.begin..=back.messages.end).saturating_len(), + _ => 0, + } + } +} + +/// Outbound message details, returned by runtime APIs. +#[derive(Clone, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct OutboundMessageDetails { + /// Nonce assigned to the message. + pub nonce: MessageNonce, + /// Message dispatch weight. + /// + /// Depending on messages pallet configuration, it may be declared by the message submitter, + /// computed automatically or just be zero if dispatch fee is paid at the target chain. + pub dispatch_weight: Weight, + /// Size of the encoded message. + pub size: u32, +} + +/// Inbound message details, returned by runtime APIs. +#[derive(Clone, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct InboundMessageDetails { + /// Computed message dispatch weight. + /// + /// Runtime API guarantees that it will match the value, returned by + /// `target_chain::MessageDispatch::dispatch_weight`. This means that if the runtime + /// has failed to decode the message, it will be zero - that's because `undecodable` + /// message cannot be dispatched. + pub dispatch_weight: Weight, +} + +/// Unrewarded relayer entry stored in the inbound lane data. +/// +/// This struct represents a continuous range of messages that have been delivered by the same +/// relayer and whose confirmations are still pending. +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] +pub struct UnrewardedRelayer { + /// Identifier of the relayer. + pub relayer: RelayerId, + /// Messages range, delivered by this relayer. + pub messages: DeliveredMessages, +} + +/// Received messages with their dispatch result. +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct ReceivedMessages { + /// Id of the lane which is receiving messages. + pub lane: LaneId, + /// Result of messages which we tried to dispatch + pub receive_results: Vec<(MessageNonce, ReceivalResult)>, +} + +impl ReceivedMessages { + pub fn new( + lane: LaneId, + receive_results: Vec<(MessageNonce, ReceivalResult)>, + ) -> Self { + ReceivedMessages { lane, receive_results } + } + + pub fn push(&mut self, message: MessageNonce, result: ReceivalResult) { + self.receive_results.push((message, result)); + } +} + +/// Result of single message receival. +#[derive(RuntimeDebug, Encode, Decode, PartialEq, Eq, Clone, TypeInfo)] +pub enum ReceivalResult { + /// Message has been received and dispatched. Note that we don't care whether dispatch has + /// been successful or not - in both case message falls into this category. + /// + /// The message dispatch result is also returned. + Dispatched(MessageDispatchResult), + /// Message has invalid nonce and lane has rejected to accept this message. + InvalidNonce, + /// There are too many unrewarded relayer entries at the lane. + TooManyUnrewardedRelayers, + /// There are too many unconfirmed messages at the lane. + TooManyUnconfirmedMessages, +} + +/// Delivered messages with their dispatch result. +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] +pub struct DeliveredMessages { + /// Nonce of the first message that has been delivered (inclusive). + pub begin: MessageNonce, + /// Nonce of the last message that has been delivered (inclusive). + pub end: MessageNonce, +} + +impl DeliveredMessages { + /// Create new `DeliveredMessages` struct that confirms delivery of single nonce with given + /// dispatch result. + pub fn new(nonce: MessageNonce) -> Self { + DeliveredMessages { begin: nonce, end: nonce } + } + + /// Return total count of delivered messages. + pub fn total_messages(&self) -> MessageNonce { + (self.begin..=self.end).saturating_len() + } + + /// Note new dispatched message. + pub fn note_dispatched_message(&mut self) { + self.end += 1; + } + + /// Returns true if delivered messages contain message with given nonce. + pub fn contains_message(&self, nonce: MessageNonce) -> bool { + (self.begin..=self.end).contains(&nonce) + } +} + +/// Gist of `InboundLaneData::relayers` field used by runtime APIs. +#[derive(Clone, Default, Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct UnrewardedRelayersState { + /// Number of entries in the `InboundLaneData::relayers` set. + pub unrewarded_relayer_entries: MessageNonce, + /// Number of messages in the oldest entry of `InboundLaneData::relayers`. This is the + /// minimal number of reward proofs required to push out this entry from the set. + pub messages_in_oldest_entry: MessageNonce, + /// Total number of messages in the relayers vector. + pub total_messages: MessageNonce, + /// Nonce of the latest message that has been delivered to the target chain. + /// + /// This corresponds to the result of the `InboundLaneData::last_delivered_nonce` call + /// at the bridged chain. + pub last_delivered_nonce: MessageNonce, +} + +impl UnrewardedRelayersState { + // Verify that the relayers state corresponds with the `InboundLaneData`. + pub fn is_valid(&self, lane_data: &InboundLaneData) -> bool { + self == &lane_data.into() + } +} + +impl From<&InboundLaneData> for UnrewardedRelayersState { + fn from(lane: &InboundLaneData) -> UnrewardedRelayersState { + UnrewardedRelayersState { + unrewarded_relayer_entries: lane.relayers.len() as _, + messages_in_oldest_entry: lane + .relayers + .front() + .map(|entry| entry.messages.total_messages()) + .unwrap_or(0), + total_messages: lane.total_unrewarded_messages(), + last_delivered_nonce: lane.last_delivered_nonce(), + } + } +} + +/// Outbound lane data. +#[derive(Encode, Decode, Clone, RuntimeDebug, PartialEq, Eq, TypeInfo, MaxEncodedLen)] +pub struct OutboundLaneData { + /// Nonce of the oldest message that we haven't yet pruned. May point to not-yet-generated + /// message if all sent messages are already pruned. + pub oldest_unpruned_nonce: MessageNonce, + /// Nonce of the latest message, received by bridged chain. + pub latest_received_nonce: MessageNonce, + /// Nonce of the latest message, generated by us. + pub latest_generated_nonce: MessageNonce, +} + +impl Default for OutboundLaneData { + fn default() -> Self { + OutboundLaneData { + // it is 1 because we're pruning everything in [oldest_unpruned_nonce; + // latest_received_nonce] + oldest_unpruned_nonce: 1, + latest_received_nonce: 0, + latest_generated_nonce: 0, + } + } +} + +impl OutboundLaneData { + /// Return nonces of all currently queued messages (i.e. messages that we believe + /// are not delivered yet). + pub fn queued_messages(&self) -> RangeInclusive { + (self.latest_received_nonce + 1)..=self.latest_generated_nonce + } +} + +/// Calculate the number of messages that the relayers have delivered. +pub fn calc_relayers_rewards( + messages_relayers: VecDeque>, + received_range: &RangeInclusive, +) -> RelayersRewards +where + AccountId: sp_std::cmp::Ord, +{ + // remember to reward relayers that have delivered messages + // this loop is bounded by `T::MaxUnrewardedRelayerEntriesAtInboundLane` on the bridged chain + let mut relayers_rewards = RelayersRewards::new(); + for entry in messages_relayers { + let nonce_begin = sp_std::cmp::max(entry.messages.begin, *received_range.start()); + let nonce_end = sp_std::cmp::min(entry.messages.end, *received_range.end()); + if nonce_end >= nonce_begin { + *relayers_rewards.entry(entry.relayer).or_default() += nonce_end - nonce_begin + 1; + } + } + relayers_rewards +} + +/// A minimized version of `pallet-bridge-messages::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum BridgeMessagesCall { + /// `pallet-bridge-messages::Call::receive_messages_proof` + #[codec(index = 2)] + receive_messages_proof { + relayer_id_at_bridged_chain: AccountId, + proof: MessagesProof, + messages_count: u32, + dispatch_weight: Weight, + }, + /// `pallet-bridge-messages::Call::receive_messages_delivery_proof` + #[codec(index = 3)] + receive_messages_delivery_proof { + proof: MessagesDeliveryProof, + relayers_state: UnrewardedRelayersState, + }, +} + +/// Error that happens during message verification. +#[derive(Encode, Decode, RuntimeDebug, PartialEq, Eq, PalletError, TypeInfo)] +pub enum VerificationError { + /// The message proof is empty. + EmptyMessageProof, + /// Error returned by the bridged header chain. + HeaderChain(HeaderChainError), + /// Error returned while reading/decoding inbound lane data from the storage proof. + InboundLaneStorage(StorageProofError), + /// The declared message weight is incorrect. + InvalidMessageWeight, + /// Declared messages count doesn't match actual value. + MessagesCountMismatch, + /// Error returned while reading/decoding message data from the storage proof. + MessageStorage(StorageProofError), + /// The message is too large. + MessageTooLarge, + /// Error returned while reading/decoding outbound lane data from the storage proof. + OutboundLaneStorage(StorageProofError), + /// Storage proof related error. + StorageProof(StorageProofError), + /// Custom error + Other(#[codec(skip)] &'static str), +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn total_unrewarded_messages_does_not_overflow() { + let lane_data = InboundLaneData { + relayers: vec![ + UnrewardedRelayer { relayer: 1, messages: DeliveredMessages::new(0) }, + UnrewardedRelayer { + relayer: 2, + messages: DeliveredMessages::new(MessageNonce::MAX), + }, + ] + .into_iter() + .collect(), + last_confirmed_nonce: 0, + }; + assert_eq!(lane_data.total_unrewarded_messages(), MessageNonce::MAX); + } + + #[test] + fn inbound_lane_data_returns_correct_hint() { + let test_cases = vec![ + // single relayer, multiple messages + (1, 128u8), + // multiple relayers, single message per relayer + (128u8, 128u8), + // several messages per relayer + (13u8, 128u8), + ]; + for (relayer_entries, messages_count) in test_cases { + let expected_size = InboundLaneData::::encoded_size_hint(relayer_entries as _); + let actual_size = InboundLaneData { + relayers: (1u8..=relayer_entries) + .map(|i| UnrewardedRelayer { + relayer: i, + messages: DeliveredMessages::new(i as _), + }) + .collect(), + last_confirmed_nonce: messages_count as _, + } + .encode() + .len(); + let difference = (expected_size.unwrap() as f64 - actual_size as f64).abs(); + assert!( + difference / (std::cmp::min(actual_size, expected_size.unwrap()) as f64) < 0.1, + "Too large difference between actual ({actual_size}) and expected ({expected_size:?}) inbound lane data size. Test case: {relayer_entries}+{messages_count}", + ); + } + } + + #[test] + fn contains_result_works() { + let delivered_messages = DeliveredMessages { begin: 100, end: 150 }; + + assert!(!delivered_messages.contains_message(99)); + assert!(delivered_messages.contains_message(100)); + assert!(delivered_messages.contains_message(150)); + assert!(!delivered_messages.contains_message(151)); + } + + #[test] + fn lane_id_debug_format_matches_inner_array_format() { + assert_eq!(format!("{:?}", LaneId([0, 0, 0, 0])), format!("{:?}", [0, 0, 0, 0]),); + } +} diff --git a/cumulus/bridges/primitives/messages/src/source_chain.rs b/primitives/messages/src/source_chain.rs similarity index 98% rename from cumulus/bridges/primitives/messages/src/source_chain.rs rename to primitives/messages/src/source_chain.rs index 3cc78522baf1..73092c3cce0a 100644 --- a/cumulus/bridges/primitives/messages/src/source_chain.rs +++ b/primitives/messages/src/source_chain.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -20,7 +20,8 @@ use crate::{InboundLaneData, LaneId, MessageNonce, OutboundLaneData, Verificatio use crate::UnrewardedRelayer; use bp_runtime::Size; -use frame_support::{Parameter, RuntimeDebug}; +use frame_support::Parameter; +use sp_core::RuntimeDebug; use sp_std::{ collections::{btree_map::BTreeMap, vec_deque::VecDeque}, fmt::Debug, diff --git a/primitives/messages/src/storage_keys.rs b/primitives/messages/src/storage_keys.rs new file mode 100644 index 000000000000..8eedf8fcc7ac --- /dev/null +++ b/primitives/messages/src/storage_keys.rs @@ -0,0 +1,128 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Storage keys of bridge messages pallet. + +/// Name of the `OPERATING_MODE_VALUE_NAME` storage value. +pub const OPERATING_MODE_VALUE_NAME: &str = "PalletOperatingMode"; +/// Name of the `OutboundMessages` storage map. +pub const OUTBOUND_MESSAGES_MAP_NAME: &str = "OutboundMessages"; +/// Name of the `OutboundLanes` storage map. +pub const OUTBOUND_LANES_MAP_NAME: &str = "OutboundLanes"; +/// Name of the `InboundLanes` storage map. +pub const INBOUND_LANES_MAP_NAME: &str = "InboundLanes"; + +use crate::{LaneId, MessageKey, MessageNonce}; + +use codec::Encode; +use frame_support::Blake2_128Concat; +use sp_core::storage::StorageKey; + +/// Storage key of the `PalletOperatingMode` value in the runtime storage. +pub fn operating_mode_key(pallet_prefix: &str) -> StorageKey { + StorageKey( + bp_runtime::storage_value_final_key( + pallet_prefix.as_bytes(), + OPERATING_MODE_VALUE_NAME.as_bytes(), + ) + .to_vec(), + ) +} + +/// Storage key of the outbound message in the runtime storage. +pub fn message_key(pallet_prefix: &str, lane: &LaneId, nonce: MessageNonce) -> StorageKey { + bp_runtime::storage_map_final_key::( + pallet_prefix, + OUTBOUND_MESSAGES_MAP_NAME, + &MessageKey { lane_id: *lane, nonce }.encode(), + ) +} + +/// Storage key of the outbound message lane state in the runtime storage. +pub fn outbound_lane_data_key(pallet_prefix: &str, lane: &LaneId) -> StorageKey { + bp_runtime::storage_map_final_key::( + pallet_prefix, + OUTBOUND_LANES_MAP_NAME, + &lane.encode(), + ) +} + +/// Storage key of the inbound message lane state in the runtime storage. +pub fn inbound_lane_data_key(pallet_prefix: &str, lane: &LaneId) -> StorageKey { + bp_runtime::storage_map_final_key::( + pallet_prefix, + INBOUND_LANES_MAP_NAME, + &lane.encode(), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + + #[test] + fn operating_mode_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is possibly + // breaking all existing message relays. + let storage_key = operating_mode_key("BridgeMessages").0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed010f4cf0917788d791142ff6c1f216e7b3").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn storage_message_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // all previously crafted messages proofs. + let storage_key = message_key("BridgeMessages", &LaneId(*b"test"), 42).0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed018a395e6242c6813b196ca31ed0547ea79446af0e09063bd4a7874aef8a997cec746573742a00000000000000").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn outbound_lane_data_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // all previously crafted outbound lane state proofs. + let storage_key = outbound_lane_data_key("BridgeMessages", &LaneId(*b"test")).0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed0196c246acb9b55077390e3ca723a0ca1f44a8995dd50b6657a037a7839304535b74657374").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } + + #[test] + fn inbound_lane_data_key_computed_properly() { + // If this test fails, then something has been changed in module storage that is breaking + // all previously crafted inbound lane state proofs. + let storage_key = inbound_lane_data_key("BridgeMessages", &LaneId(*b"test")).0; + assert_eq!( + storage_key, + hex!("dd16c784ebd3390a9bc0357c7511ed01e5f83cf83f2127eb47afdc35d6e43fab44a8995dd50b6657a037a7839304535b74657374").to_vec(), + "Unexpected storage key: {}", + hex::encode(&storage_key), + ); + } +} diff --git a/cumulus/bridges/primitives/messages/src/target_chain.rs b/primitives/messages/src/target_chain.rs similarity index 98% rename from cumulus/bridges/primitives/messages/src/target_chain.rs rename to primitives/messages/src/target_chain.rs index 60f5c1b3c1c5..388ce16ccdc0 100644 --- a/cumulus/bridges/primitives/messages/src/target_chain.rs +++ b/primitives/messages/src/target_chain.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -22,8 +22,9 @@ use crate::{ use bp_runtime::{messages::MessageDispatchResult, Size}; use codec::{Decode, Encode, Error as CodecError}; -use frame_support::{weights::Weight, Parameter, RuntimeDebug}; +use frame_support::{weights::Weight, Parameter}; use scale_info::TypeInfo; +use sp_core::RuntimeDebug; use sp_std::{collections::btree_map::BTreeMap, fmt::Debug, marker::PhantomData, prelude::*}; /// Proved messages from the source chain. diff --git a/primitives/parachains/Cargo.toml b/primitives/parachains/Cargo.toml new file mode 100644 index 000000000000..569fa535a281 --- /dev/null +++ b/primitives/parachains/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "bp-parachains" +description = "Primitives of parachains module." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +impl-trait-for-tuples = "0.2" +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + +# Bridge dependencies + +bp-header-chain = { path = "../header-chain", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "scale-info/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/parachains/src/lib.rs b/primitives/parachains/src/lib.rs new file mode 100644 index 000000000000..262b9c6f9775 --- /dev/null +++ b/primitives/parachains/src/lib.rs @@ -0,0 +1,180 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives of parachains module. + +#![cfg_attr(not(feature = "std"), no_std)] + +pub use bp_header_chain::StoredHeaderData; + +use bp_polkadot_core::{ + parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}, + BlockNumber as RelayBlockNumber, Hash as RelayBlockHash, +}; +use bp_runtime::{ + BlockNumberOf, Chain, HashOf, HeaderOf, Parachain, StorageDoubleMapKeyProvider, + StorageMapKeyProvider, +}; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{Blake2_128Concat, Twox64Concat}; +use scale_info::TypeInfo; +use sp_core::storage::StorageKey; +use sp_runtime::{traits::Header as HeaderT, RuntimeDebug}; +use sp_std::{marker::PhantomData, prelude::*}; + +/// Best known parachain head hash. +#[derive(Clone, Decode, Encode, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] +pub struct BestParaHeadHash { + /// Number of relay block where this head has been read. + /// + /// Parachain head is opaque to relay chain. So we can't simply decode it as a header of + /// parachains and call `block_number()` on it. Instead, we're using the fact that parachain + /// head is always built on top of previous head (because it is blockchain) and relay chain + /// always imports parachain heads in order. What it means for us is that at any given + /// **finalized** relay block `B`, head of parachain will be ancestor (or the same) of all + /// parachain heads available at descendants of `B`. + pub at_relay_block_number: RelayBlockNumber, + /// Hash of parachain head. + pub head_hash: ParaHash, +} + +/// Best known parachain head as it is stored in the runtime storage. +#[derive(Decode, Encode, MaxEncodedLen, PartialEq, RuntimeDebug, TypeInfo)] +pub struct ParaInfo { + /// Best known parachain head hash. + pub best_head_hash: BestParaHeadHash, + /// Current ring buffer position for this parachain. + pub next_imported_hash_position: u32, +} + +/// Returns runtime storage key of given parachain head at the source chain. +/// +/// The head is stored by the `paras` pallet in the `Heads` map. +pub fn parachain_head_storage_key_at_source( + paras_pallet_name: &str, + para_id: ParaId, +) -> StorageKey { + bp_runtime::storage_map_final_key::(paras_pallet_name, "Heads", ¶_id.encode()) +} + +/// Can be use to access the runtime storage key of the parachains info at the target chain. +/// +/// The info is stored by the `pallet-bridge-parachains` pallet in the `ParasInfo` map. +pub struct ParasInfoKeyProvider; +impl StorageMapKeyProvider for ParasInfoKeyProvider { + const MAP_NAME: &'static str = "ParasInfo"; + + type Hasher = Blake2_128Concat; + type Key = ParaId; + type Value = ParaInfo; +} + +/// Can be use to access the runtime storage key of the parachain head at the target chain. +/// +/// The head is stored by the `pallet-bridge-parachains` pallet in the `ImportedParaHeads` map. +pub struct ImportedParaHeadsKeyProvider; +impl StorageDoubleMapKeyProvider for ImportedParaHeadsKeyProvider { + const MAP_NAME: &'static str = "ImportedParaHeads"; + + type Hasher1 = Blake2_128Concat; + type Key1 = ParaId; + type Hasher2 = Blake2_128Concat; + type Key2 = ParaHash; + type Value = ParaStoredHeaderData; +} + +/// Stored data of the parachain head. It is encoded version of the +/// `bp_runtime::StoredHeaderData` structure. +/// +/// We do not know exact structure of the parachain head, so we always store encoded version +/// of the `bp_runtime::StoredHeaderData`. It is only decoded when we talk about specific parachain. +#[derive(Clone, Decode, Encode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct ParaStoredHeaderData(pub Vec); + +impl ParaStoredHeaderData { + /// Decode stored parachain head data. + pub fn decode_parachain_head_data( + &self, + ) -> Result, HashOf>, codec::Error> { + StoredHeaderData::, HashOf>::decode(&mut &self.0[..]) + } +} + +/// Stored parachain head data builder. +pub trait ParaStoredHeaderDataBuilder { + /// Return number of parachains that are supported by this builder. + fn supported_parachains() -> u32; + + /// Try to build head data from encoded head of parachain with given id. + fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option; +} + +/// Helper for using single parachain as `ParaStoredHeaderDataBuilder`. +pub struct SingleParaStoredHeaderDataBuilder(PhantomData); + +impl ParaStoredHeaderDataBuilder for SingleParaStoredHeaderDataBuilder { + fn supported_parachains() -> u32 { + 1 + } + + fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option { + if para_id == ParaId(C::PARACHAIN_ID) { + let header = HeaderOf::::decode(&mut ¶_head.0[..]).ok()?; + return Some(ParaStoredHeaderData( + StoredHeaderData { number: *header.number(), state_root: *header.state_root() } + .encode(), + )) + } + None + } +} + +// Tries to build header data from each tuple member, short-circuiting on first successful one. +#[impl_trait_for_tuples::impl_for_tuples(1, 30)] +#[tuple_types_custom_trait_bound(Parachain)] +impl ParaStoredHeaderDataBuilder for C { + fn supported_parachains() -> u32 { + let mut result = 0; + for_tuples!( #( + result += SingleParaStoredHeaderDataBuilder::::supported_parachains(); + )* ); + result + } + + fn try_build(para_id: ParaId, para_head: &ParaHead) -> Option { + for_tuples!( #( + let maybe_para_head = SingleParaStoredHeaderDataBuilder::::try_build(para_id, para_head); + if let Some(maybe_para_head) = maybe_para_head { + return Some(maybe_para_head); + } + )* ); + + None + } +} + +/// A minimized version of `pallet-bridge-parachains::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum BridgeParachainCall { + /// `pallet-bridge-parachains::Call::submit_parachain_heads` + #[codec(index = 0)] + submit_parachain_heads { + at_relay_block: (RelayBlockNumber, RelayBlockHash), + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + }, +} diff --git a/primitives/polkadot-core/Cargo.toml b/primitives/polkadot-core/Cargo.toml new file mode 100644 index 000000000000..e9542f6f5b34 --- /dev/null +++ b/primitives/polkadot-core/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "bp-polkadot-core" +description = "Primitives of Polkadot-like runtime." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +parity-util-mem = { version = "0.12.0", optional = true } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } + +# Bridge Dependencies + +bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Based Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +hex = "0.4" + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "parity-util-mem", + "scale-info/std", + "serde", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/polkadot-core/src/lib.rs b/primitives/polkadot-core/src/lib.rs new file mode 100644 index 000000000000..586cbf8cb9b4 --- /dev/null +++ b/primitives/polkadot-core/src/lib.rs @@ -0,0 +1,388 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_messages::MessageNonce; +use bp_runtime::{ + self, + extensions::{ + ChargeTransactionPayment, CheckEra, CheckGenesis, CheckNonZeroSender, CheckNonce, + CheckSpecVersion, CheckTxVersion, CheckWeight, GenericSignedExtension, + SignedExtensionSchema, + }, + Chain, EncodedOrDecodedCall, StorageMapKeyProvider, TransactionEra, +}; +use frame_support::{ + dispatch::DispatchClass, + parameter_types, + weights::{ + constants::{BlockExecutionWeight, WEIGHT_REF_TIME_PER_SECOND}, + Weight, + }, + Blake2_128Concat, +}; +use frame_system::limits; +use sp_core::{storage::StorageKey, Hasher as HasherT}; +use sp_runtime::{ + generic, + traits::{BlakeTwo256, IdentifyAccount, Verify}, + MultiAddress, MultiSignature, OpaqueExtrinsic, RuntimeDebug, +}; +use sp_std::prelude::Vec; + +// Re-export's to avoid extra substrate dependencies in chain-specific crates. +pub use frame_support::{weights::constants::ExtrinsicBaseWeight, Parameter}; +pub use sp_runtime::{traits::Convert, Perbill}; + +pub mod parachains; + +/// Maximal number of GRANDPA authorities at Polkadot-like chains. +/// +/// Ideally, we would set it to the value of `MaxAuthorities` constant from bridged runtime +/// configurations. But right now it is set to the `100_000`, which makes PoV size for +/// our bridge hub parachains huge. So let's stick to the real-world value here. +/// +/// Right now both Kusama and Polkadot aim to have around 1000 validators. Let's be safe here and +/// take a bit more here. +pub const MAX_AUTHORITIES_COUNT: u32 = 1_256; + +/// Reasonable number of headers in the `votes_ancestries` on Polkadot-like chains. +/// +/// See [`bp-header-chain::ChainWithGrandpa`] for more details. +/// +/// This value comes from recent (December, 2023) Kusama and Polkadot headers. There are no +/// justifications with any additional headers in votes ancestry, so reasonable headers may +/// be set to zero. But we assume that there may be small GRANDPA lags, so we're leaving some +/// reserve here. +pub const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 2; + +/// Average header size in `votes_ancestries` field of justification on Polkadot-like +/// chains. +/// +/// See [`bp-header-chain::ChainWithGrandpa`] for more details. +/// +/// This value comes from recent (December, 2023) Kusama headers. Most of headers are `327` bytes +/// there, but let's have some reserve and make it 1024. +pub const AVERAGE_HEADER_SIZE: u32 = 1024; + +/// Approximate maximal header size on Polkadot-like chains. +/// +/// See [`bp-header-chain::ChainWithGrandpa`] for more details. +/// +/// This value comes from recent (December, 2023) Kusama headers. Maximal header is a mandatory +/// header. In its SCALE-encoded form it is `113407` bytes. Let's have some reserve here. +pub const MAX_MANDATORY_HEADER_SIZE: u32 = 120 * 1024; + +/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at +/// Polkadot-like chain. This mostly depends on number of entries in the storage trie. +/// Some reserve is reserved to account future chain growth. +/// +/// To compute this value, we've synced Kusama chain blocks [0; 6545733] to see if there were +/// any significant changes of the storage proof size (NO): +/// +/// - at block 3072 the storage proof size overhead was 579 bytes; +/// - at block 2479616 it was 578 bytes; +/// - at block 4118528 it was 711 bytes; +/// - at block 6540800 it was 779 bytes. +/// +/// The number of storage entries at the block 6546170 was 351207 and number of trie nodes in +/// the storage proof was 5 (log(16, 351207) ~ 4.6). +/// +/// So the assumption is that the storage proof size overhead won't be larger than 1024 in the +/// nearest future. If it'll ever break this barrier, then we'll need to update this constant +/// at next runtime upgrade. +pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024; + +/// All Polkadot-like chains allow normal extrinsics to fill block up to 75 percent. +/// +/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); + +/// All Polkadot-like chains allow 2 seconds of compute with a 6-second average block time. +/// +/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. +pub const MAXIMUM_BLOCK_WEIGHT: Weight = + Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2), u64::MAX); + +/// All Polkadot-like chains assume that an on-initialize consumes 1 percent of the weight on +/// average, hence a single extrinsic will not be allowed to consume more than +/// `AvailableBlockRatio - 1 percent`. +/// +/// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. +pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(1); + +parameter_types! { + /// All Polkadot-like chains have maximal block size set to 5MB. + /// + /// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. + pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( + 5 * 1024 * 1024, + NORMAL_DISPATCH_RATIO, + ); + /// All Polkadot-like chains have the same block weights. + /// + /// This is a copy-paste from the Polkadot repo's `polkadot-runtime-common` crate. + pub BlockWeights: limits::BlockWeights = limits::BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have an extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT, + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); +} + +// TODO [#78] may need to be updated after https://github.com/paritytech/parity-bridges-common/issues/78 +/// Maximal number of messages in single delivery transaction. +pub const MAX_MESSAGES_IN_DELIVERY_TRANSACTION: MessageNonce = 128; + +/// Maximal number of bytes, included in the signed Polkadot-like transaction apart from the encoded +/// call itself. +/// +/// Can be computed by subtracting encoded call size from raw transaction size. +pub const TX_EXTRA_BYTES: u32 = 256; + +/// Re-export `time_units` to make usage easier. +pub use time_units::*; + +/// Human readable time units defined in terms of number of blocks. +pub mod time_units { + use super::BlockNumber; + + pub const MILLISECS_PER_BLOCK: u64 = 6000; + pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; + + pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); + pub const HOURS: BlockNumber = MINUTES * 60; + pub const DAYS: BlockNumber = HOURS * 24; +} + +/// Block number type used in Polkadot-like chains. +pub type BlockNumber = u32; + +/// Hash type used in Polkadot-like chains. +pub type Hash = ::Out; + +/// Hashing type. +pub type Hashing = BlakeTwo256; + +/// The type of object that can produce hashes on Polkadot-like chains. +pub type Hasher = BlakeTwo256; + +/// The header type used by Polkadot-like chains. +pub type Header = generic::Header; + +/// Signature type used by Polkadot-like chains. +pub type Signature = MultiSignature; + +/// Public key of account on Polkadot-like chains. +pub type AccountPublic = ::Signer; + +/// Id of account on Polkadot-like chains. +pub type AccountId = ::AccountId; + +/// Address of account on Polkadot-like chains. +pub type AccountAddress = MultiAddress; + +/// Nonce of a transaction on the Polkadot-like chains. +pub type Nonce = u32; + +/// Block type of Polkadot-like chains. +pub type Block = generic::Block; + +/// Polkadot-like block signed with a Justification. +pub type SignedBlock = generic::SignedBlock; + +/// The balance of an account on Polkadot-like chain. +pub type Balance = u128; + +/// Unchecked Extrinsic type. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic, Signature, SignedExt>; + +/// Account address, used by the Polkadot-like chain. +pub type Address = MultiAddress; + +/// Polkadot-like chain. +#[derive(RuntimeDebug)] +pub struct PolkadotLike; + +impl Chain for PolkadotLike { + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hasher = Hasher; + type Header = Header; + + type AccountId = AccountId; + type Balance = Balance; + type Nonce = Nonce; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + *BlockLength::get().max.get(DispatchClass::Normal) + } + + fn max_extrinsic_weight() -> Weight { + BlockWeights::get() + .get(DispatchClass::Normal) + .max_extrinsic + .unwrap_or(Weight::MAX) + } +} + +/// Provides a storage key for account data. +/// +/// We need to use this approach when we don't have access to the runtime. +/// The equivalent command to invoke in case full `Runtime` is known is this: +/// `let key = frame_system::Account::::storage_map_final_key(&account_id);` +pub struct AccountInfoStorageMapKeyProvider; + +impl StorageMapKeyProvider for AccountInfoStorageMapKeyProvider { + const MAP_NAME: &'static str = "Account"; + type Hasher = Blake2_128Concat; + type Key = AccountId; + // This should actually be `AccountInfo`, but we don't use this property in order to decode the + // data. So we use `Vec` as if we would work with encoded data. + type Value = Vec; +} + +impl AccountInfoStorageMapKeyProvider { + const PALLET_NAME: &'static str = "System"; + + pub fn final_key(id: &AccountId) -> StorageKey { + ::final_key(Self::PALLET_NAME, id) + } +} + +/// Extra signed extension data that is used by most chains. +pub type CommonSignedExtra = ( + CheckNonZeroSender, + CheckSpecVersion, + CheckTxVersion, + CheckGenesis, + CheckEra, + CheckNonce, + CheckWeight, + ChargeTransactionPayment, +); + +/// Extra signed extension data that starts with `CommonSignedExtra`. +pub type SuffixedCommonSignedExtension = + GenericSignedExtension<(CommonSignedExtra, Suffix)>; + +/// Helper trait to define some extra methods on `SuffixedCommonSignedExtension`. +pub trait SuffixedCommonSignedExtensionExt { + /// Create signed extension from its components. + fn from_params( + spec_version: u32, + transaction_version: u32, + era: TransactionEra, + genesis_hash: Hash, + nonce: Nonce, + tip: Balance, + extra: (Suffix::Payload, Suffix::AdditionalSigned), + ) -> Self; + + /// Return transaction nonce. + fn nonce(&self) -> Nonce; + + /// Return transaction tip. + fn tip(&self) -> Balance; +} + +impl SuffixedCommonSignedExtensionExt for SuffixedCommonSignedExtension +where + Suffix: SignedExtensionSchema, +{ + fn from_params( + spec_version: u32, + transaction_version: u32, + era: TransactionEra, + genesis_hash: Hash, + nonce: Nonce, + tip: Balance, + extra: (Suffix::Payload, Suffix::AdditionalSigned), + ) -> Self { + GenericSignedExtension::new( + ( + ( + (), // non-zero sender + (), // spec version + (), // tx version + (), // genesis + era.frame_era(), // era + nonce.into(), // nonce (compact encoding) + (), // Check weight + tip.into(), // transaction payment / tip (compact encoding) + ), + extra.0, + ), + Some(( + ( + (), + spec_version, + transaction_version, + genesis_hash, + era.signed_payload(genesis_hash), + (), + (), + (), + ), + extra.1, + )), + ) + } + + fn nonce(&self) -> Nonce { + let common_payload = self.payload.0; + common_payload.5 .0 + } + + fn tip(&self) -> Balance { + let common_payload = self.payload.0; + common_payload.7 .0 + } +} + +/// Signed extension that is used by most chains. +pub type CommonSignedExtension = SuffixedCommonSignedExtension<()>; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_generate_storage_key() { + let acc = [ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, + ] + .into(); + let key = AccountInfoStorageMapKeyProvider::final_key(&acc); + assert_eq!(hex::encode(key), "26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92dccd599abfe1920a1cff8a7358231430102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20"); + } +} diff --git a/primitives/polkadot-core/src/parachains.rs b/primitives/polkadot-core/src/parachains.rs new file mode 100644 index 000000000000..223956171f86 --- /dev/null +++ b/primitives/polkadot-core/src/parachains.rs @@ -0,0 +1,99 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives of polkadot-like chains, that are related to parachains functionality. +//! +//! Even though this (bridges) repository references polkadot repository, we can't +//! reference polkadot crates from pallets. That's because bridges repository is +//! included in the Cumulus repository and included pallets are used by Cumulus +//! parachains. Having pallets that are referencing polkadot, would mean that there may +//! be two versions of polkadot crates included in the runtime. Which is bad. + +use bp_runtime::{RawStorageProof, Size}; +use codec::{CompactAs, Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_core::Hasher; +use sp_runtime::RuntimeDebug; +use sp_std::vec::Vec; + +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "std")] +use parity_util_mem::MallocSizeOf; + +/// Parachain id. +/// +/// This is an equivalent of the `polkadot_parachain_primitives::Id`, which is a compact-encoded +/// `u32`. +#[derive( + Clone, + CompactAs, + Copy, + Decode, + Default, + Encode, + Eq, + Hash, + MaxEncodedLen, + Ord, + PartialEq, + PartialOrd, + RuntimeDebug, + TypeInfo, +)] +pub struct ParaId(pub u32); + +impl From for ParaId { + fn from(id: u32) -> Self { + ParaId(id) + } +} + +/// Parachain head. +/// +/// This is an equivalent of the `polkadot_parachain_primitives::HeadData`. +/// +/// The parachain head means (at least in Cumulus) a SCALE-encoded parachain header. +#[derive( + PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo, Default, +)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash, MallocSizeOf))] +pub struct ParaHead(pub Vec); + +impl ParaHead { + /// Returns the hash of this head data. + pub fn hash(&self) -> crate::Hash { + sp_runtime::traits::BlakeTwo256::hash(&self.0) + } +} + +/// Parachain head hash. +pub type ParaHash = crate::Hash; + +/// Parachain head hasher. +pub type ParaHasher = crate::Hasher; + +/// Raw storage proof of parachain heads, stored in polkadot-like chain runtime. +#[derive(Clone, Decode, Encode, Eq, PartialEq, RuntimeDebug, TypeInfo)] +pub struct ParaHeadsProof(pub RawStorageProof); + +impl Size for ParaHeadsProof { + fn size(&self) -> u32 { + u32::try_from(self.0.iter().fold(0usize, |sum, node| sum.saturating_add(node.len()))) + .unwrap_or(u32::MAX) + } +} diff --git a/primitives/relayers/Cargo.toml b/primitives/relayers/Cargo.toml new file mode 100644 index 000000000000..060e36a5f002 --- /dev/null +++ b/primitives/relayers/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "bp-relayers" +description = "Primitives of relayers module." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } + +# Bridge Dependencies + +bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[dev-dependencies] +hex = "0.4" +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "bp-messages/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "scale-info/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/primitives/relayers/src/lib.rs b/primitives/relayers/src/lib.rs new file mode 100644 index 000000000000..c808c437b54c --- /dev/null +++ b/primitives/relayers/src/lib.rs @@ -0,0 +1,206 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives of messages module. + +#![warn(missing_docs)] +#![cfg_attr(not(feature = "std"), no_std)] + +pub use registration::{Registration, StakeAndSlash}; + +use bp_messages::LaneId; +use bp_runtime::{ChainId, StorageDoubleMapKeyProvider}; +use frame_support::{traits::tokens::Preservation, Blake2_128Concat, Identity}; +use scale_info::TypeInfo; +use sp_runtime::{ + codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen}, + traits::AccountIdConversion, + TypeId, +}; +use sp_std::{fmt::Debug, marker::PhantomData}; + +mod registration; + +/// The owner of the sovereign account that should pay the rewards. +/// +/// Each of the 2 final points connected by a bridge owns a sovereign account at each end of the +/// bridge. So here, at this end of the bridge there can be 2 sovereign accounts that pay rewards. +#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] +pub enum RewardsAccountOwner { + /// The sovereign account of the final chain on this end of the bridge. + ThisChain, + /// The sovereign account of the final chain on the other end of the bridge. + BridgedChain, +} + +/// Structure used to identify the account that pays a reward to the relayer. +/// +/// A bridge connects 2 bridge ends. Each one is located on a separate relay chain. The bridge ends +/// can be the final destinations of the bridge, or they can be intermediary points +/// (e.g. a bridge hub) used to forward messages between pairs of parachains on the bridged relay +/// chains. A pair of such parachains is connected using a bridge lane. Each of the 2 final +/// destinations of a bridge lane must have a sovereign account at each end of the bridge and each +/// of the sovereign accounts will pay rewards for different operations. So we need multiple +/// parameters to identify the account that pays a reward to the relayer. +#[derive(Copy, Clone, Debug, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] +pub struct RewardsAccountParams { + lane_id: LaneId, + bridged_chain_id: ChainId, + owner: RewardsAccountOwner, +} + +impl RewardsAccountParams { + /// Create a new instance of `RewardsAccountParams`. + pub const fn new( + lane_id: LaneId, + bridged_chain_id: ChainId, + owner: RewardsAccountOwner, + ) -> Self { + Self { lane_id, bridged_chain_id, owner } + } +} + +impl TypeId for RewardsAccountParams { + const TYPE_ID: [u8; 4] = *b"brap"; +} + +/// Reward payment procedure. +pub trait PaymentProcedure { + /// Error that may be returned by the procedure. + type Error: Debug; + + /// Pay reward to the relayer from the account with provided params. + fn pay_reward( + relayer: &Relayer, + rewards_account_params: RewardsAccountParams, + reward: Reward, + ) -> Result<(), Self::Error>; +} + +impl PaymentProcedure for () { + type Error = &'static str; + + fn pay_reward(_: &Relayer, _: RewardsAccountParams, _: Reward) -> Result<(), Self::Error> { + Ok(()) + } +} + +/// Reward payment procedure that does `balances::transfer` call from the account, derived from +/// given params. +pub struct PayRewardFromAccount(PhantomData<(T, Relayer)>); + +impl PayRewardFromAccount +where + Relayer: Decode + Encode, +{ + /// Return account that pays rewards based on the provided parameters. + pub fn rewards_account(params: RewardsAccountParams) -> Relayer { + params.into_sub_account_truncating(b"rewards-account") + } +} + +impl PaymentProcedure for PayRewardFromAccount +where + T: frame_support::traits::fungible::Mutate, + Relayer: Decode + Encode + Eq, +{ + type Error = sp_runtime::DispatchError; + + fn pay_reward( + relayer: &Relayer, + rewards_account_params: RewardsAccountParams, + reward: T::Balance, + ) -> Result<(), Self::Error> { + T::transfer( + &Self::rewards_account(rewards_account_params), + relayer, + reward, + Preservation::Expendable, + ) + .map(drop) + } +} + +/// Can be use to access the runtime storage key within the `RelayerRewards` map of the relayers +/// pallet. +pub struct RelayerRewardsKeyProvider(PhantomData<(AccountId, Reward)>); + +impl StorageDoubleMapKeyProvider for RelayerRewardsKeyProvider +where + AccountId: Codec + EncodeLike, + Reward: Codec + EncodeLike, +{ + const MAP_NAME: &'static str = "RelayerRewards"; + + type Hasher1 = Blake2_128Concat; + type Key1 = AccountId; + type Hasher2 = Identity; + type Key2 = RewardsAccountParams; + type Value = Reward; +} + +#[cfg(test)] +mod tests { + use super::*; + use bp_messages::LaneId; + use sp_runtime::testing::H256; + + #[test] + fn different_lanes_are_using_different_accounts() { + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::ThisChain + )), + hex_literal::hex!("62726170000000007465737400726577617264732d6163636f756e7400000000") + .into(), + ); + + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 1]), + *b"test", + RewardsAccountOwner::ThisChain + )), + hex_literal::hex!("62726170000000017465737400726577617264732d6163636f756e7400000000") + .into(), + ); + } + + #[test] + fn different_directions_are_using_different_accounts() { + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::ThisChain + )), + hex_literal::hex!("62726170000000007465737400726577617264732d6163636f756e7400000000") + .into(), + ); + + assert_eq!( + PayRewardFromAccount::<(), H256>::rewards_account(RewardsAccountParams::new( + LaneId([0, 0, 0, 0]), + *b"test", + RewardsAccountOwner::BridgedChain + )), + hex_literal::hex!("62726170000000007465737401726577617264732d6163636f756e7400000000") + .into(), + ); + } +} diff --git a/cumulus/bridges/primitives/relayers/src/registration.rs b/primitives/relayers/src/registration.rs similarity index 99% rename from cumulus/bridges/primitives/relayers/src/registration.rs rename to primitives/relayers/src/registration.rs index 7ab20844bdf9..bc2d0d127aef 100644 --- a/cumulus/bridges/primitives/relayers/src/registration.rs +++ b/primitives/relayers/src/registration.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml new file mode 100644 index 000000000000..b52d20d69160 --- /dev/null +++ b/primitives/runtime/Cargo.toml @@ -0,0 +1,51 @@ +[package] +name = "bp-runtime" +description = "Primitives that may be used at (bridges) runtime level." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +hash-db = { version = "0.16.0", default-features = false } +impl-trait-for-tuples = "0.2.2" +log = { version = "0.4.19", default-features = false } +num-traits = { version = "0.2", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-io = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false, features = ["serde"] } +sp-state-machine = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +trie-db = { version = "0.28.0", default-features = false } + +[dev-dependencies] +hex-literal = "0.4" + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "frame-system/std", + "hash-db/std", + "log/std", + "num-traits/std", + "scale-info/std", + "serde/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-state-machine/std", + "sp-std/std", + "sp-trie/std", + "trie-db/std", +] diff --git a/primitives/runtime/src/chain.rs b/primitives/runtime/src/chain.rs new file mode 100644 index 000000000000..469c839ba151 --- /dev/null +++ b/primitives/runtime/src/chain.rs @@ -0,0 +1,408 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::HeaderIdProvider; +use codec::{Codec, Decode, Encode, MaxEncodedLen}; +use frame_support::{weights::Weight, Parameter}; +use num_traits::{AsPrimitive, Bounded, CheckedSub, Saturating, SaturatingAdd, Zero}; +use sp_runtime::{ + traits::{ + AtLeast32Bit, AtLeast32BitUnsigned, Hash as HashT, Header as HeaderT, MaybeDisplay, + MaybeSerialize, MaybeSerializeDeserialize, Member, SimpleBitOps, Verify, + }, + FixedPointOperand, +}; +use sp_std::{convert::TryFrom, fmt::Debug, hash::Hash, str::FromStr, vec, vec::Vec}; + +/// Chain call, that is either SCALE-encoded, or decoded. +#[derive(Debug, Clone, PartialEq)] +pub enum EncodedOrDecodedCall { + /// The call that is SCALE-encoded. + /// + /// This variant is used when we the chain runtime is not bundled with the relay, but + /// we still need the represent call in some RPC calls or transactions. + Encoded(Vec), + /// The decoded call. + Decoded(ChainCall), +} + +impl EncodedOrDecodedCall { + /// Returns decoded call. + pub fn to_decoded(&self) -> Result { + match self { + Self::Encoded(ref encoded_call) => + ChainCall::decode(&mut &encoded_call[..]).map_err(Into::into), + Self::Decoded(ref decoded_call) => Ok(decoded_call.clone()), + } + } + + /// Converts self to decoded call. + pub fn into_decoded(self) -> Result { + match self { + Self::Encoded(encoded_call) => + ChainCall::decode(&mut &encoded_call[..]).map_err(Into::into), + Self::Decoded(decoded_call) => Ok(decoded_call), + } + } + + /// Converts self to encoded call. + pub fn into_encoded(self) -> Vec { + match self { + Self::Encoded(encoded_call) => encoded_call, + Self::Decoded(decoded_call) => decoded_call.encode(), + } + } +} + +impl From for EncodedOrDecodedCall { + fn from(call: ChainCall) -> EncodedOrDecodedCall { + EncodedOrDecodedCall::Decoded(call) + } +} + +impl Decode for EncodedOrDecodedCall { + fn decode(input: &mut I) -> Result { + // having encoded version is better than decoded, because decoding isn't required + // everywhere and for mocked calls it may lead to **unneeded** errors + match input.remaining_len()? { + Some(remaining_len) => { + let mut encoded_call = vec![0u8; remaining_len]; + input.read(&mut encoded_call)?; + Ok(EncodedOrDecodedCall::Encoded(encoded_call)) + }, + None => Ok(EncodedOrDecodedCall::Decoded(ChainCall::decode(input)?)), + } + } +} + +impl Encode for EncodedOrDecodedCall { + fn encode(&self) -> Vec { + match *self { + Self::Encoded(ref encoded_call) => encoded_call.clone(), + Self::Decoded(ref decoded_call) => decoded_call.encode(), + } + } +} + +/// Minimal Substrate-based chain representation that may be used from no_std environment. +pub trait Chain: Send + Sync + 'static { + /// A type that fulfills the abstract idea of what a Substrate block number is. + // Constraits come from the associated Number type of `sp_runtime::traits::Header` + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Number + // + // Note that the `AsPrimitive` trait is required by the GRANDPA justification + // verifier, and is not usually part of a Substrate Header's Number type. + type BlockNumber: Parameter + + Member + + MaybeSerializeDeserialize + + Hash + + Copy + + Default + + MaybeDisplay + + AtLeast32BitUnsigned + + FromStr + + AsPrimitive + + Default + + Saturating + + MaxEncodedLen; + + /// A type that fulfills the abstract idea of what a Substrate hash is. + // Constraits come from the associated Hash type of `sp_runtime::traits::Header` + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hash + type Hash: Parameter + + Member + + MaybeSerializeDeserialize + + Hash + + Ord + + Copy + + MaybeDisplay + + Default + + SimpleBitOps + + AsRef<[u8]> + + AsMut<[u8]> + + MaxEncodedLen; + + /// A type that fulfills the abstract idea of what a Substrate hasher (a type + /// that produces hashes) is. + // Constraits come from the associated Hashing type of `sp_runtime::traits::Header` + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hashing + type Hasher: HashT; + + /// A type that fulfills the abstract idea of what a Substrate header is. + // See here for more info: + // https://crates.parity.io/sp_runtime/traits/trait.Header.html + type Header: Parameter + + HeaderT + + HeaderIdProvider + + MaybeSerializeDeserialize; + + /// The user account identifier type for the runtime. + type AccountId: Parameter + + Member + + MaybeSerializeDeserialize + + Debug + + MaybeDisplay + + Ord + + MaxEncodedLen; + /// Balance of an account in native tokens. + /// + /// The chain may support multiple tokens, but this particular type is for token that is used + /// to pay for transaction dispatch, to reward different relayers (headers, messages), etc. + type Balance: AtLeast32BitUnsigned + + FixedPointOperand + + Parameter + + Member + + MaybeSerializeDeserialize + + Clone + + Copy + + Bounded + + CheckedSub + + PartialOrd + + SaturatingAdd + + Zero + + TryFrom + + MaxEncodedLen; + /// Nonce of a transaction used by the chain. + type Nonce: Parameter + + Member + + MaybeSerialize + + Debug + + Default + + MaybeDisplay + + MaybeSerializeDeserialize + + AtLeast32Bit + + Copy + + MaxEncodedLen; + /// Signature type, used on this chain. + type Signature: Parameter + Verify; + + /// Get the maximum size (in bytes) of a Normal extrinsic at this chain. + fn max_extrinsic_size() -> u32; + /// Get the maximum weight (compute time) that a Normal extrinsic at this chain can use. + fn max_extrinsic_weight() -> Weight; +} + +/// A trait that provides the type of the underlying chain. +pub trait UnderlyingChainProvider { + /// Underlying chain type. + type Chain: Chain; +} + +impl Chain for T +where + T: Send + Sync + 'static + UnderlyingChainProvider, +{ + type BlockNumber = ::BlockNumber; + type Hash = ::Hash; + type Hasher = ::Hasher; + type Header = ::Header; + type AccountId = ::AccountId; + type Balance = ::Balance; + type Nonce = ::Nonce; + type Signature = ::Signature; + + fn max_extrinsic_size() -> u32 { + ::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + ::max_extrinsic_weight() + } +} + +/// Minimal parachain representation that may be used from no_std environment. +pub trait Parachain: Chain { + /// Parachain identifier. + const PARACHAIN_ID: u32; +} + +impl Parachain for T +where + T: Chain + UnderlyingChainProvider, + ::Chain: Parachain, +{ + const PARACHAIN_ID: u32 = <::Chain as Parachain>::PARACHAIN_ID; +} + +/// Adapter for `Get` to access `PARACHAIN_ID` from `trait Parachain` +pub struct ParachainIdOf(sp_std::marker::PhantomData); +impl frame_support::traits::Get for ParachainIdOf { + fn get() -> u32 { + Para::PARACHAIN_ID + } +} + +/// Underlying chain type. +pub type UnderlyingChainOf = ::Chain; + +/// Block number used by the chain. +pub type BlockNumberOf = ::BlockNumber; + +/// Hash type used by the chain. +pub type HashOf = ::Hash; + +/// Hasher type used by the chain. +pub type HasherOf = ::Hasher; + +/// Header type used by the chain. +pub type HeaderOf = ::Header; + +/// Account id type used by the chain. +pub type AccountIdOf = ::AccountId; + +/// Balance type used by the chain. +pub type BalanceOf = ::Balance; + +/// Transaction nonce type used by the chain. +pub type NonceOf = ::Nonce; + +/// Signature type used by the chain. +pub type SignatureOf = ::Signature; + +/// Account public type used by the chain. +pub type AccountPublicOf = as Verify>::Signer; + +/// Transaction era used by the chain. +pub type TransactionEraOf = crate::TransactionEra, HashOf>; + +/// Convenience macro that declares bridge finality runtime apis and related constants for a chain. +/// This includes: +/// - chain-specific bridge runtime APIs: +/// - `FinalityApi` +/// - constants that are stringified names of runtime API methods: +/// - `BEST_FINALIZED__HEADER_METHOD` +/// - `_ACCEPTED__FINALITY_PROOFS_METHOD` +/// The name of the chain has to be specified in snake case (e.g. `bridge_hub_polkadot`). +#[macro_export] +macro_rules! decl_bridge_finality_runtime_apis { + ($chain: ident $(, $consensus: ident => $justification_type: ty)?) => { + bp_runtime::paste::item! { + mod [<$chain _finality_api>] { + use super::*; + + /// Name of the `FinalityApi::best_finalized` runtime method. + pub const []: &str = + stringify!([<$chain:camel FinalityApi_best_finalized>]); + + $( + /// Name of the `FinalityApi::accepted__finality_proofs` + /// runtime method. + pub const [<$chain:upper _SYNCED_HEADERS_ $consensus:upper _INFO_METHOD>]: &str = + stringify!([<$chain:camel FinalityApi_synced_headers_ $consensus:lower _info>]); + )? + + sp_api::decl_runtime_apis! { + /// API for querying information about the finalized chain headers. + /// + /// This API is implemented by runtimes that are receiving messages from this chain, not by this + /// chain's runtime itself. + pub trait [<$chain:camel FinalityApi>] { + /// Returns number and hash of the best finalized header known to the bridge module. + fn best_finalized() -> Option>; + + $( + /// Returns the justifications accepted in the current block. + fn []( + ) -> sp_std::vec::Vec<$justification_type>; + )? + } + } + } + + pub use [<$chain _finality_api>]::*; + } + }; + ($chain: ident, grandpa) => { + decl_bridge_finality_runtime_apis!($chain, grandpa => bp_header_chain::StoredHeaderGrandpaInfo
); + }; +} + +/// Convenience macro that declares bridge messages runtime apis and related constants for a chain. +/// This includes: +/// - chain-specific bridge runtime APIs: +/// - `ToOutboundLaneApi` +/// - `FromInboundLaneApi` +/// - constants that are stringified names of runtime API methods: +/// - `FROM__MESSAGE_DETAILS_METHOD`, +/// The name of the chain has to be specified in snake case (e.g. `bridge_hub_polkadot`). +#[macro_export] +macro_rules! decl_bridge_messages_runtime_apis { + ($chain: ident) => { + bp_runtime::paste::item! { + mod [<$chain _messages_api>] { + use super::*; + + /// Name of the `ToOutboundLaneApi::message_details` runtime method. + pub const []: &str = + stringify!([]); + + /// Name of the `FromInboundLaneApi::message_details` runtime method. + pub const []: &str = + stringify!([]); + + sp_api::decl_runtime_apis! { + /// Outbound message lane API for messages that are sent to this chain. + /// + /// This API is implemented by runtimes that are receiving messages from this chain, not by this + /// chain's runtime itself. + pub trait [] { + /// Returns dispatch weight, encoded payload size and delivery+dispatch fee of all + /// messages in given inclusive range. + /// + /// If some (or all) messages are missing from the storage, they'll also will + /// be missing from the resulting vector. The vector is ordered by the nonce. + fn message_details( + lane: bp_messages::LaneId, + begin: bp_messages::MessageNonce, + end: bp_messages::MessageNonce, + ) -> sp_std::vec::Vec; + } + + /// Inbound message lane API for messages sent by this chain. + /// + /// This API is implemented by runtimes that are receiving messages from this chain, not by this + /// chain's runtime itself. + /// + /// Entries of the resulting vector are matching entries of the `messages` vector. Entries of the + /// `messages` vector may (and need to) be read using `ToOutboundLaneApi::message_details`. + pub trait [] { + /// Return details of given inbound messages. + fn message_details( + lane: bp_messages::LaneId, + messages: sp_std::vec::Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails)>, + ) -> sp_std::vec::Vec; + } + } + } + + pub use [<$chain _messages_api>]::*; + } + }; +} + +/// Convenience macro that declares bridge finality runtime apis, bridge messages runtime apis +/// and related constants for a chain. +/// The name of the chain has to be specified in snake case (e.g. `bridge_hub_polkadot`). +#[macro_export] +macro_rules! decl_bridge_runtime_apis { + ($chain: ident $(, $consensus: ident)?) => { + bp_runtime::decl_bridge_finality_runtime_apis!($chain $(, $consensus)?); + bp_runtime::decl_bridge_messages_runtime_apis!($chain); + }; +} diff --git a/cumulus/bridges/primitives/runtime/src/extensions.rs b/primitives/runtime/src/extensions.rs similarity index 93% rename from cumulus/bridges/primitives/runtime/src/extensions.rs rename to primitives/runtime/src/extensions.rs index 96ee9d1e6ec9..8a618721b23a 100644 --- a/cumulus/bridges/primitives/runtime/src/extensions.rs +++ b/primitives/runtime/src/extensions.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -35,7 +35,12 @@ pub trait SignedExtensionSchema: Encode + Decode + Debug + Eq + Clone + StaticTy type AdditionalSigned: Encode + Debug + Eq + Clone + StaticTypeInfo; } -// An implementation of `SignedExtensionSchema` using generic params. +impl SignedExtensionSchema for () { + type Payload = (); + type AdditionalSigned = (); +} + +/// An implementation of `SignedExtensionSchema` using generic params. #[derive(Encode, Decode, Clone, Debug, PartialEq, Eq, TypeInfo)] pub struct GenericSignedExtensionSchema(PhantomData<(P, S)>); @@ -72,6 +77,9 @@ pub type CheckWeight = GenericSignedExtensionSchema<(), ()>; /// The `SignedExtensionSchema` for `pallet_transaction_payment::ChargeTransactionPayment`. pub type ChargeTransactionPayment = GenericSignedExtensionSchema, ()>; +/// The `SignedExtensionSchema` for `polkadot-runtime-common::PrevalidateAttests`. +pub type PrevalidateAttests = GenericSignedExtensionSchema<(), ()>; + /// The `SignedExtensionSchema` for `BridgeRejectObsoleteHeadersAndMessages`. pub type BridgeRejectObsoleteHeadersAndMessages = GenericSignedExtensionSchema<(), ()>; @@ -80,7 +88,7 @@ pub type BridgeRejectObsoleteHeadersAndMessages = GenericSignedExtensionSchema<( /// wildcard/placeholder, which relies on the scale encoding for `()` or `((), ())`, or `((), (), /// ())` is the same. So runtime can contains any kind of tuple: /// `(BridgeRefundBridgeHubRococoMessages)` -/// `(BridgeRefundBridgeHubRococoMessages, BridgeRefundBridgeHubWococoMessages)` +/// `(BridgeRefundBridgeHubRococoMessages, BridgeRefundBridgeHubWestendMessages)` /// `(BridgeRefundParachainMessages1, ..., BridgeRefundParachainMessagesN)` pub type RefundBridgedParachainMessagesSchema = GenericSignedExtensionSchema<(), ()>; @@ -99,7 +107,7 @@ pub struct GenericSignedExtension { // It may be set to `None` if extensions are decoded. We are never reconstructing transactions // (and it makes no sense to do that) => decoded version of `SignedExtensions` is only used to // read fields of the `payload`. And when resigning transaction, we're reconstructing - // `SignedExtensions` from the scratch. + // `SignedExtensions` from scratch. additional_signed: Option, } diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs new file mode 100644 index 000000000000..0513cfa2a6c7 --- /dev/null +++ b/primitives/runtime/src/lib.rs @@ -0,0 +1,568 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives that may be used at (bridges) runtime level. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode, FullCodec, MaxEncodedLen}; +use frame_support::{ + pallet_prelude::DispatchResult, weights::Weight, PalletError, StorageHasher, StorageValue, +}; +use frame_system::RawOrigin; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_core::storage::StorageKey; +use sp_runtime::{ + traits::{BadOrigin, Header as HeaderT, UniqueSaturatedInto}, + RuntimeDebug, +}; +use sp_std::{convert::TryFrom, fmt::Debug, ops::RangeInclusive, vec, vec::Vec}; + +pub use chain::{ + AccountIdOf, AccountPublicOf, BalanceOf, BlockNumberOf, Chain, EncodedOrDecodedCall, HashOf, + HasherOf, HeaderOf, NonceOf, Parachain, ParachainIdOf, SignatureOf, TransactionEraOf, + UnderlyingChainOf, UnderlyingChainProvider, +}; +pub use frame_support::storage::storage_prefix as storage_value_final_key; +use num_traits::{CheckedAdd, CheckedSub, One, SaturatingAdd, Zero}; +pub use storage_proof::{ + record_all_keys as record_all_trie_keys, Error as StorageProofError, + ProofSize as StorageProofSize, RawStorageProof, StorageProofChecker, +}; +pub use storage_types::BoundedStorageValue; + +#[cfg(feature = "std")] +pub use storage_proof::craft_valid_storage_proof; + +pub mod extensions; +pub mod messages; + +mod chain; +mod storage_proof; +mod storage_types; + +// Re-export macro to aviod include paste dependency everywhere +pub use sp_runtime::paste; + +/// Use this when something must be shared among all instances. +pub const NO_INSTANCE_ID: ChainId = [0, 0, 0, 0]; + +/// Polkadot chain id. +pub const POLKADOT_CHAIN_ID: ChainId = *b"pdot"; + +/// Polkadot Bulletin chain id. +pub const POLKADOT_BULLETIN_CHAIN_ID: ChainId = *b"pdbc"; + +/// Kusama chain id. +pub const KUSAMA_CHAIN_ID: ChainId = *b"ksma"; + +/// Westend chain id. +pub const WESTEND_CHAIN_ID: ChainId = *b"wend"; + +/// `AssetHubWestmint` chain id. +pub const ASSET_HUB_WESTEND_CHAIN_ID: ChainId = *b"ahwe"; + +/// Rococo chain id. +pub const ROCOCO_CHAIN_ID: ChainId = *b"roco"; + +/// BridgeHubRococo chain id. +pub const BRIDGE_HUB_ROCOCO_CHAIN_ID: ChainId = *b"bhro"; + +/// BridgeHubWestend chain id. +pub const BRIDGE_HUB_WESTEND_CHAIN_ID: ChainId = *b"bhwd"; + +/// BridgeHubKusama chain id. +pub const BRIDGE_HUB_KUSAMA_CHAIN_ID: ChainId = *b"bhks"; + +/// BridgeHubPolkadot chain id. +pub const BRIDGE_HUB_POLKADOT_CHAIN_ID: ChainId = *b"bhpd"; + +/// Generic header Id. +#[derive( + RuntimeDebug, + Default, + Clone, + Encode, + Decode, + Copy, + Eq, + Hash, + MaxEncodedLen, + PartialEq, + PartialOrd, + Ord, + TypeInfo, +)] +pub struct HeaderId(pub Number, pub Hash); + +impl HeaderId { + /// Return header number. + pub fn number(&self) -> Number { + self.0 + } + + /// Return header hash. + pub fn hash(&self) -> Hash { + self.1 + } +} + +/// Header id used by the chain. +pub type HeaderIdOf = HeaderId, BlockNumberOf>; + +/// Generic header id provider. +pub trait HeaderIdProvider { + // Get the header id. + fn id(&self) -> HeaderId; + + // Get the header id for the parent block. + fn parent_id(&self) -> Option>; +} + +impl HeaderIdProvider
for Header { + fn id(&self) -> HeaderId { + HeaderId(*self.number(), self.hash()) + } + + fn parent_id(&self) -> Option> { + self.number() + .checked_sub(&One::one()) + .map(|parent_number| HeaderId(parent_number, *self.parent_hash())) + } +} + +/// Unique identifier of the chain. +/// +/// In addition to its main function (identifying the chain), this type may also be used to +/// identify module instance. We have a bunch of pallets that may be used in different bridges. E.g. +/// messages pallet may be deployed twice in the same runtime to bridge ThisChain with Chain1 and +/// Chain2. Sometimes we need to be able to identify deployed instance dynamically. This type may be +/// used for that. +pub type ChainId = [u8; 4]; + +/// Anything that has size. +pub trait Size { + /// Return size of this object (in bytes). + fn size(&self) -> u32; +} + +impl Size for () { + fn size(&self) -> u32 { + 0 + } +} + +impl Size for Vec { + fn size(&self) -> u32 { + self.len() as _ + } +} + +/// Pre-computed size. +pub struct PreComputedSize(pub usize); + +impl Size for PreComputedSize { + fn size(&self) -> u32 { + u32::try_from(self.0).unwrap_or(u32::MAX) + } +} + +/// Era of specific transaction. +#[derive(RuntimeDebug, Clone, Copy, PartialEq)] +pub enum TransactionEra { + /// Transaction is immortal. + Immortal, + /// Transaction is valid for a given number of blocks, starting from given block. + Mortal(HeaderId, u32), +} + +impl, BlockHash: Copy> + TransactionEra +{ + /// Prepare transaction era, based on mortality period and current best block number. + pub fn new( + best_block_id: HeaderId, + mortality_period: Option, + ) -> Self { + mortality_period + .map(|mortality_period| TransactionEra::Mortal(best_block_id, mortality_period)) + .unwrap_or(TransactionEra::Immortal) + } + + /// Create new immortal transaction era. + pub fn immortal() -> Self { + TransactionEra::Immortal + } + + /// Returns mortality period if transaction is mortal. + pub fn mortality_period(&self) -> Option { + match *self { + TransactionEra::Immortal => None, + TransactionEra::Mortal(_, period) => Some(period), + } + } + + /// Returns era that is used by FRAME-based runtimes. + pub fn frame_era(&self) -> sp_runtime::generic::Era { + match *self { + TransactionEra::Immortal => sp_runtime::generic::Era::immortal(), + // `unique_saturated_into` is fine here - mortality `u64::MAX` is not something we + // expect to see on any chain + TransactionEra::Mortal(header_id, period) => + sp_runtime::generic::Era::mortal(period as _, header_id.0.unique_saturated_into()), + } + } + + /// Returns header hash that needs to be included in the signature payload. + pub fn signed_payload(&self, genesis_hash: BlockHash) -> BlockHash { + match *self { + TransactionEra::Immortal => genesis_hash, + TransactionEra::Mortal(header_id, _) => header_id.1, + } + } +} + +/// This is a copy of the +/// `frame_support::storage::generator::StorageMap::storage_map_final_key` for maps based +/// on selected hasher. +/// +/// We're using it because to call `storage_map_final_key` directly, we need access to the runtime +/// and pallet instance, which (sometimes) is impossible. +pub fn storage_map_final_key( + pallet_prefix: &str, + map_name: &str, + key: &[u8], +) -> StorageKey { + let key_hashed = H::hash(key); + let pallet_prefix_hashed = frame_support::Twox128::hash(pallet_prefix.as_bytes()); + let storage_prefix_hashed = frame_support::Twox128::hash(map_name.as_bytes()); + + let mut final_key = Vec::with_capacity( + pallet_prefix_hashed.len() + storage_prefix_hashed.len() + key_hashed.as_ref().len(), + ); + + final_key.extend_from_slice(&pallet_prefix_hashed[..]); + final_key.extend_from_slice(&storage_prefix_hashed[..]); + final_key.extend_from_slice(key_hashed.as_ref()); + + StorageKey(final_key) +} + +/// This is how a storage key of storage value is computed. +/// +/// Copied from `frame_support::storage::storage_prefix`. +pub fn storage_value_key(pallet_prefix: &str, value_name: &str) -> StorageKey { + let pallet_hash = sp_io::hashing::twox_128(pallet_prefix.as_bytes()); + let storage_hash = sp_io::hashing::twox_128(value_name.as_bytes()); + + let mut final_key = vec![0u8; 32]; + final_key[..16].copy_from_slice(&pallet_hash); + final_key[16..].copy_from_slice(&storage_hash); + + StorageKey(final_key) +} + +/// Can be use to access the runtime storage key of a `StorageMap`. +pub trait StorageMapKeyProvider { + /// The name of the variable that holds the `StorageMap`. + const MAP_NAME: &'static str; + + /// The same as `StorageMap::Hasher1`. + type Hasher: StorageHasher; + /// The same as `StorageMap::Key1`. + type Key: FullCodec; + /// The same as `StorageMap::Value`. + type Value: FullCodec; + + /// This is a copy of the + /// `frame_support::storage::generator::StorageMap::storage_map_final_key`. + /// + /// We're using it because to call `storage_map_final_key` directly, we need access + /// to the runtime and pallet instance, which (sometimes) is impossible. + fn final_key(pallet_prefix: &str, key: &Self::Key) -> StorageKey { + storage_map_final_key::(pallet_prefix, Self::MAP_NAME, &key.encode()) + } +} + +/// Can be use to access the runtime storage key of a `StorageDoubleMap`. +pub trait StorageDoubleMapKeyProvider { + /// The name of the variable that holds the `StorageDoubleMap`. + const MAP_NAME: &'static str; + + /// The same as `StorageDoubleMap::Hasher1`. + type Hasher1: StorageHasher; + /// The same as `StorageDoubleMap::Key1`. + type Key1: FullCodec; + /// The same as `StorageDoubleMap::Hasher2`. + type Hasher2: StorageHasher; + /// The same as `StorageDoubleMap::Key2`. + type Key2: FullCodec; + /// The same as `StorageDoubleMap::Value`. + type Value: FullCodec; + + /// This is a copy of the + /// `frame_support::storage::generator::StorageDoubleMap::storage_double_map_final_key`. + /// + /// We're using it because to call `storage_double_map_final_key` directly, we need access + /// to the runtime and pallet instance, which (sometimes) is impossible. + fn final_key(pallet_prefix: &str, key1: &Self::Key1, key2: &Self::Key2) -> StorageKey { + let key1_hashed = Self::Hasher1::hash(&key1.encode()); + let key2_hashed = Self::Hasher2::hash(&key2.encode()); + let pallet_prefix_hashed = frame_support::Twox128::hash(pallet_prefix.as_bytes()); + let storage_prefix_hashed = frame_support::Twox128::hash(Self::MAP_NAME.as_bytes()); + + let mut final_key = Vec::with_capacity( + pallet_prefix_hashed.len() + + storage_prefix_hashed.len() + + key1_hashed.as_ref().len() + + key2_hashed.as_ref().len(), + ); + + final_key.extend_from_slice(&pallet_prefix_hashed[..]); + final_key.extend_from_slice(&storage_prefix_hashed[..]); + final_key.extend_from_slice(key1_hashed.as_ref()); + final_key.extend_from_slice(key2_hashed.as_ref()); + + StorageKey(final_key) + } +} + +/// Error generated by the `OwnedBridgeModule` trait. +#[derive(Encode, Decode, TypeInfo, PalletError)] +pub enum OwnedBridgeModuleError { + /// All pallet operations are halted. + Halted, +} + +/// Operating mode for a bridge module. +pub trait OperatingMode: Send + Copy + Debug + FullCodec { + // Returns true if the bridge module is halted. + fn is_halted(&self) -> bool; +} + +/// Basic operating modes for a bridges module (Normal/Halted). +#[derive( + Encode, + Decode, + Clone, + Copy, + PartialEq, + Eq, + RuntimeDebug, + TypeInfo, + MaxEncodedLen, + Serialize, + Deserialize, +)] +pub enum BasicOperatingMode { + /// Normal mode, when all operations are allowed. + Normal, + /// The pallet is halted. All operations (except operating mode change) are prohibited. + Halted, +} + +impl Default for BasicOperatingMode { + fn default() -> Self { + Self::Normal + } +} + +impl OperatingMode for BasicOperatingMode { + fn is_halted(&self) -> bool { + *self == BasicOperatingMode::Halted + } +} + +/// Bridge module that has owner and operating mode +pub trait OwnedBridgeModule { + /// The target that will be used when publishing logs related to this module. + const LOG_TARGET: &'static str; + + type OwnerStorage: StorageValue>; + type OperatingMode: OperatingMode; + type OperatingModeStorage: StorageValue; + + /// Check if the module is halted. + fn is_halted() -> bool { + Self::OperatingModeStorage::get().is_halted() + } + + /// Ensure that the origin is either root, or `PalletOwner`. + fn ensure_owner_or_root(origin: T::RuntimeOrigin) -> Result<(), BadOrigin> { + match origin.into() { + Ok(RawOrigin::Root) => Ok(()), + Ok(RawOrigin::Signed(ref signer)) + if Self::OwnerStorage::get().as_ref() == Some(signer) => + Ok(()), + _ => Err(BadOrigin), + } + } + + /// Ensure that the module is not halted. + fn ensure_not_halted() -> Result<(), OwnedBridgeModuleError> { + match Self::is_halted() { + true => Err(OwnedBridgeModuleError::Halted), + false => Ok(()), + } + } + + /// Change the owner of the module. + fn set_owner(origin: T::RuntimeOrigin, maybe_owner: Option) -> DispatchResult { + Self::ensure_owner_or_root(origin)?; + match maybe_owner { + Some(owner) => { + Self::OwnerStorage::put(&owner); + log::info!(target: Self::LOG_TARGET, "Setting pallet Owner to: {:?}", owner); + }, + None => { + Self::OwnerStorage::kill(); + log::info!(target: Self::LOG_TARGET, "Removed Owner of pallet."); + }, + } + + Ok(()) + } + + /// Halt or resume all/some module operations. + fn set_operating_mode( + origin: T::RuntimeOrigin, + operating_mode: Self::OperatingMode, + ) -> DispatchResult { + Self::ensure_owner_or_root(origin)?; + Self::OperatingModeStorage::put(operating_mode); + log::info!(target: Self::LOG_TARGET, "Setting operating mode to {:?}.", operating_mode); + Ok(()) + } +} + +/// All extra operations with weights that we need in bridges. +pub trait WeightExtraOps { + /// Checked division of individual components of two weights. + /// + /// Divides components and returns minimal division result. Returns `None` if one + /// of `other` weight components is zero. + fn min_components_checked_div(&self, other: Weight) -> Option; +} + +impl WeightExtraOps for Weight { + fn min_components_checked_div(&self, other: Weight) -> Option { + Some(sp_std::cmp::min( + self.ref_time().checked_div(other.ref_time())?, + self.proof_size().checked_div(other.proof_size())?, + )) + } +} + +/// Trait that provides a static `str`. +pub trait StaticStrProvider { + const STR: &'static str; +} + +#[macro_export] +macro_rules! generate_static_str_provider { + ($str:expr) => { + $crate::paste::item! { + pub struct []; + + impl $crate::StaticStrProvider for [] { + const STR: &'static str = stringify!($str); + } + } + }; +} + +#[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, TypeInfo)] +#[scale_info(skip_type_params(T))] +pub struct StrippableError { + _phantom_data: sp_std::marker::PhantomData, + #[codec(skip)] + #[cfg(feature = "std")] + message: String, +} + +impl From for StrippableError { + fn from(_err: T) -> Self { + Self { + _phantom_data: Default::default(), + #[cfg(feature = "std")] + message: format!("{:?}", _err), + } + } +} + +impl Debug for StrippableError { + #[cfg(feature = "std")] + fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + f.write_str(&self.message) + } + + #[cfg(not(feature = "std"))] + fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + f.write_str("Stripped error") + } +} + +/// A trait defining helper methods for `RangeInclusive` (start..=end) +pub trait RangeInclusiveExt { + /// Computes the length of the `RangeInclusive`, checking for underflow and overflow. + fn checked_len(&self) -> Option; + /// Computes the length of the `RangeInclusive`, saturating in case of underflow or overflow. + fn saturating_len(&self) -> Idx; +} + +impl RangeInclusiveExt for RangeInclusive +where + Idx: CheckedSub + CheckedAdd + SaturatingAdd + One + Zero, +{ + fn checked_len(&self) -> Option { + self.end() + .checked_sub(self.start()) + .and_then(|len| len.checked_add(&Idx::one())) + } + + fn saturating_len(&self) -> Idx { + let len = match self.end().checked_sub(self.start()) { + Some(len) => len, + None => return Idx::zero(), + }; + len.saturating_add(&Idx::one()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn storage_value_key_works() { + assert_eq!( + storage_value_key("PalletTransactionPayment", "NextFeeMultiplier"), + StorageKey( + hex_literal::hex!( + "f0e954dfcca51a255ab12c60c789256a3f2edf3bdf381debe331ab7446addfdc" + ) + .to_vec() + ), + ); + } + + #[test] + fn generate_static_str_provider_works() { + generate_static_str_provider!(Test); + assert_eq!(StrTest::STR, "Test"); + } +} diff --git a/primitives/runtime/src/messages.rs b/primitives/runtime/src/messages.rs new file mode 100644 index 000000000000..0f219e984f72 --- /dev/null +++ b/primitives/runtime/src/messages.rs @@ -0,0 +1,36 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives that may be used by different message delivery and dispatch mechanisms. + +use codec::{Decode, Encode}; +use frame_support::weights::Weight; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; + +/// Message dispatch result. +#[derive(Encode, Decode, RuntimeDebug, Clone, PartialEq, Eq, TypeInfo)] +pub struct MessageDispatchResult { + /// Unspent dispatch weight. This weight that will be deducted from total delivery transaction + /// weight, thus reducing the transaction cost. This shall not be zero in (at least) two cases: + /// + /// 1) if message has been dispatched successfully, but post-dispatch weight is less than the + /// weight, declared by the message sender; + /// 2) if message has not been dispatched at all. + pub unspent_weight: Weight, + /// Fine-grained result of single message dispatch (for better diagnostic purposes) + pub dispatch_level_result: DispatchLevelResult, +} diff --git a/cumulus/bridges/primitives/runtime/src/storage_proof.rs b/primitives/runtime/src/storage_proof.rs similarity index 99% rename from cumulus/bridges/primitives/runtime/src/storage_proof.rs rename to primitives/runtime/src/storage_proof.rs index 09641376666a..1b706aa66c16 100644 --- a/cumulus/bridges/primitives/runtime/src/storage_proof.rs +++ b/primitives/runtime/src/storage_proof.rs @@ -1,4 +1,4 @@ -// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify diff --git a/primitives/runtime/src/storage_types.rs b/primitives/runtime/src/storage_types.rs new file mode 100644 index 000000000000..91c5451805a9 --- /dev/null +++ b/primitives/runtime/src/storage_types.rs @@ -0,0 +1,91 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Wrapper for a runtime storage value that checks if value exceeds given maximum +//! during conversion. + +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::traits::Get; +use scale_info::{Type, TypeInfo}; +use sp_runtime::RuntimeDebug; +use sp_std::{marker::PhantomData, ops::Deref}; + +/// Error that is returned when the value size exceeds maximal configured size. +#[derive(RuntimeDebug)] +pub struct MaximalSizeExceededError { + /// Size of the value. + pub value_size: usize, + /// Maximal configured size. + pub maximal_size: usize, +} + +/// A bounded runtime storage value. +#[derive(Clone, Decode, Encode, Eq, PartialEq)] +pub struct BoundedStorageValue { + value: V, + _phantom: PhantomData, +} + +impl sp_std::fmt::Debug for BoundedStorageValue { + fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + self.value.fmt(fmt) + } +} + +impl, V: Encode> BoundedStorageValue { + /// Construct `BoundedStorageValue` from the underlying `value` with all required checks. + /// + /// Returns error if value size exceeds given bounds. + pub fn try_from_inner(value: V) -> Result { + // this conversion is heavy (since we do encoding here), so we may want to optimize it later + // (e.g. by introducing custom Encode implementation, and turning `BoundedStorageValue` into + // `enum BoundedStorageValue { Decoded(V), Encoded(Vec) }`) + let value_size = value.encoded_size(); + let maximal_size = B::get() as usize; + if value_size > maximal_size { + Err(MaximalSizeExceededError { value_size, maximal_size }) + } else { + Ok(BoundedStorageValue { value, _phantom: Default::default() }) + } + } + + /// Convert into the inner type + pub fn into_inner(self) -> V { + self.value + } +} + +impl Deref for BoundedStorageValue { + type Target = V; + + fn deref(&self) -> &Self::Target { + &self.value + } +} + +impl TypeInfo for BoundedStorageValue { + type Identity = Self; + + fn type_info() -> Type { + V::type_info() + } +} + +impl, V: Encode> MaxEncodedLen for BoundedStorageValue { + fn max_encoded_len() -> usize { + B::get() as usize + } +} diff --git a/primitives/test-utils/Cargo.toml b/primitives/test-utils/Cargo.toml new file mode 100644 index 000000000000..743284176063 --- /dev/null +++ b/primitives/test-utils/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "bp-test-utils" +version = "0.1.0" +description = "Utilities for testing substrate-based runtime bridge code" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +bp-header-chain = { path = "../header-chain", default-features = false } +bp-parachains = { path = "../parachains", default-features = false } +bp-polkadot-core = { path = "../polkadot-core", default-features = false } +bp-runtime = { path = "../runtime", default-features = false } +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +ed25519-dalek = { version = "2.1", default-features = false } +finality-grandpa = { version = "0.16.2", default-features = false } +sp-application-crypto = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-trie = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = [ + "bp-header-chain/std", + "bp-parachains/std", + "bp-polkadot-core/std", + "bp-runtime/std", + "codec/std", + "ed25519-dalek/std", + "finality-grandpa/std", + "sp-application-crypto/std", + "sp-consensus-grandpa/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", +] diff --git a/cumulus/bridges/primitives/test-utils/src/keyring.rs b/primitives/test-utils/src/keyring.rs similarity index 80% rename from cumulus/bridges/primitives/test-utils/src/keyring.rs rename to primitives/test-utils/src/keyring.rs index a4e818a3b888..eabf9c784eb8 100644 --- a/cumulus/bridges/primitives/test-utils/src/keyring.rs +++ b/primitives/test-utils/src/keyring.rs @@ -1,4 +1,4 @@ -// Copyright 2021 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Parity Bridges Common. // Parity Bridges Common is free software: you can redistribute it and/or modify @@ -18,7 +18,7 @@ use bp_header_chain::{justification::JustificationVerificationContext, AuthoritySet}; use codec::Encode; -use ed25519_dalek::{Keypair, PublicKey, SecretKey, Signature}; +use ed25519_dalek::{Signature, SigningKey, VerifyingKey}; use finality_grandpa::voter_set::VoterSet; use sp_consensus_grandpa::{AuthorityId, AuthorityList, AuthorityWeight, SetId}; use sp_runtime::RuntimeDebug; @@ -37,29 +37,15 @@ pub const FERDIE: Account = Account(5); pub struct Account(pub u16); impl Account { - pub fn public(&self) -> PublicKey { - (&self.secret()).into() + pub fn public(&self) -> VerifyingKey { + self.pair().verifying_key() } - pub fn secret(&self) -> SecretKey { + pub fn pair(&self) -> SigningKey { let data = self.0.encode(); let mut bytes = [0_u8; 32]; bytes[0..data.len()].copy_from_slice(&data); - SecretKey::from_bytes(&bytes) - .expect("A static array of the correct length is a known good.") - } - - pub fn pair(&self) -> Keypair { - let mut pair: [u8; 64] = [0; 64]; - - let secret = self.secret(); - pair[..32].copy_from_slice(&secret.to_bytes()); - - let public = self.public(); - pair[32..].copy_from_slice(&public.to_bytes()); - - Keypair::from_bytes(&pair) - .expect("We expect the SecretKey to be good, so this must also be good.") + SigningKey::from_bytes(&bytes) } pub fn sign(&self, msg: &[u8]) -> Signature { diff --git a/primitives/test-utils/src/lib.rs b/primitives/test-utils/src/lib.rs new file mode 100644 index 000000000000..4d3b84759938 --- /dev/null +++ b/primitives/test-utils/src/lib.rs @@ -0,0 +1,343 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Utilities for testing runtime code. + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_header_chain::justification::{required_justification_precommits, GrandpaJustification}; +use bp_parachains::parachain_head_storage_key_at_source; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use bp_runtime::record_all_trie_keys; +use codec::Encode; +use sp_consensus_grandpa::{AuthorityId, AuthoritySignature, AuthorityWeight, SetId}; +use sp_runtime::traits::{Header as HeaderT, One, Zero}; +use sp_std::prelude::*; +use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut}; + +// Re-export all our test account utilities +pub use keyring::*; + +mod keyring; + +pub const TEST_GRANDPA_ROUND: u64 = 1; +pub const TEST_GRANDPA_SET_ID: SetId = 1; +pub const PARAS_PALLET_NAME: &str = "Paras"; + +/// Configuration parameters when generating test GRANDPA justifications. +#[derive(Clone)] +pub struct JustificationGeneratorParams { + /// The header which we want to finalize. + pub header: H, + /// The GRANDPA round number for the current authority set. + pub round: u64, + /// The current authority set ID. + pub set_id: SetId, + /// The current GRANDPA authority set. + /// + /// The size of the set will determine the number of pre-commits in our justification. + pub authorities: Vec<(Account, AuthorityWeight)>, + /// The total number of precommit ancestors in the `votes_ancestries` field our justification. + /// + /// These may be distributed among many forks. + pub ancestors: u32, + /// The number of forks. + /// + /// Useful for creating a "worst-case" scenario in which each authority is on its own fork. + pub forks: u32, +} + +impl Default for JustificationGeneratorParams { + fn default() -> Self { + let required_signatures = required_justification_precommits(test_keyring().len() as _); + Self { + header: test_header(One::one()), + round: TEST_GRANDPA_ROUND, + set_id: TEST_GRANDPA_SET_ID, + authorities: test_keyring().into_iter().take(required_signatures as _).collect(), + ancestors: 2, + forks: 1, + } + } +} + +/// Make a valid GRANDPA justification with sensible defaults +pub fn make_default_justification(header: &H) -> GrandpaJustification { + let params = JustificationGeneratorParams:: { header: header.clone(), ..Default::default() }; + + make_justification_for_header(params) +} + +/// Generate justifications in a way where we are able to tune the number of pre-commits +/// and vote ancestries which are included in the justification. +/// +/// This is useful for benchmarkings where we want to generate valid justifications with +/// a specific number of pre-commits (tuned with the number of "authorities") and/or a specific +/// number of vote ancestries (tuned with the "votes" parameter). +/// +/// Note: This needs at least three authorities or else the verifier will complain about +/// being given an invalid commit. +pub fn make_justification_for_header( + params: JustificationGeneratorParams, +) -> GrandpaJustification { + let JustificationGeneratorParams { header, round, set_id, authorities, mut ancestors, forks } = + params; + let (target_hash, target_number) = (header.hash(), *header.number()); + let mut votes_ancestries = vec![]; + let mut precommits = vec![]; + + assert!(forks != 0, "Need at least one fork to have a chain.."); + assert!( + forks as usize <= authorities.len(), + "If we have more forks than authorities we can't create valid pre-commits for all the forks." + ); + + // Roughly, how many vote ancestries do we want per fork + let target_depth = (ancestors + forks - 1) / forks; + + let mut unsigned_precommits = vec![]; + for i in 0..forks { + let depth = if ancestors >= target_depth { + ancestors -= target_depth; + target_depth + } else { + ancestors + }; + + // Note: Adding 1 to account for the target header + let chain = generate_chain(i, depth + 1, &header); + + // We don't include our finality target header in the vote ancestries + for child in &chain[1..] { + votes_ancestries.push(child.clone()); + } + + // The header we need to use when pre-commiting is the one at the highest height + // on our chain. + let precommit_candidate = chain.last().map(|h| (h.hash(), *h.number())).unwrap(); + unsigned_precommits.push(precommit_candidate); + } + + for (i, (id, _weight)) in authorities.iter().enumerate() { + // Assign authorities to sign pre-commits in a round-robin fashion + let target = unsigned_precommits[i % forks as usize]; + let precommit = signed_precommit::(id, target, round, set_id); + + precommits.push(precommit); + } + + GrandpaJustification { + round, + commit: finality_grandpa::Commit { target_hash, target_number, precommits }, + votes_ancestries, + } +} + +fn generate_chain(fork_id: u32, depth: u32, ancestor: &H) -> Vec { + let mut headers = vec![ancestor.clone()]; + + for i in 1..depth { + let parent = &headers[(i - 1) as usize]; + let (hash, num) = (parent.hash(), *parent.number()); + + let mut header = test_header::(num + One::one()); + header.set_parent_hash(hash); + + // Modifying the digest so headers at the same height but in different forks have different + // hashes + header.digest_mut().logs.push(sp_runtime::DigestItem::Other(fork_id.encode())); + + headers.push(header); + } + + headers +} + +/// Make valid proof for parachain `heads` +pub fn prepare_parachain_heads_proof( + heads: Vec<(u32, ParaHead)>, +) -> (H::Hash, ParaHeadsProof, Vec<(ParaId, ParaHash)>) { + let mut parachains = Vec::with_capacity(heads.len()); + let mut root = Default::default(); + let mut mdb = MemoryDB::default(); + { + let mut trie = TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); + for (parachain, head) in heads { + let storage_key = + parachain_head_storage_key_at_source(PARAS_PALLET_NAME, ParaId(parachain)); + trie.insert(&storage_key.0, &head.encode()) + .map_err(|_| "TrieMut::insert has failed") + .expect("TrieMut::insert should not fail in tests"); + parachains.push((ParaId(parachain), head.hash())); + } + } + + // generate storage proof to be delivered to This chain + let storage_proof = record_all_trie_keys::, _>(&mdb, &root) + .map_err(|_| "record_all_trie_keys has failed") + .expect("record_all_trie_keys should not fail in benchmarks"); + + (root, ParaHeadsProof(storage_proof), parachains) +} + +/// Create signed precommit with given target. +pub fn signed_precommit( + signer: &Account, + target: (H::Hash, H::Number), + round: u64, + set_id: SetId, +) -> finality_grandpa::SignedPrecommit { + let precommit = finality_grandpa::Precommit { target_hash: target.0, target_number: target.1 }; + + let encoded = sp_consensus_grandpa::localized_payload( + round, + set_id, + &finality_grandpa::Message::Precommit(precommit.clone()), + ); + + let signature = signer.sign(&encoded); + let raw_signature: Vec = signature.to_bytes().into(); + + // Need to wrap our signature and id types that they match what our `SignedPrecommit` is + // expecting + let signature = AuthoritySignature::try_from(raw_signature).expect( + "We know our Keypair is good, + so our signature must also be good.", + ); + let id = (*signer).into(); + + finality_grandpa::SignedPrecommit { precommit, signature, id } +} + +/// Get a header for testing. +/// +/// The correct parent hash will be used if given a non-zero header. +pub fn test_header(number: H::Number) -> H { + let default = |num| { + H::new(num, Default::default(), Default::default(), Default::default(), Default::default()) + }; + + let mut header = default(number); + if number != Zero::zero() { + let parent_hash = default(number - One::one()).hash(); + header.set_parent_hash(parent_hash); + } + + header +} + +/// Get a header for testing with given `state_root`. +/// +/// The correct parent hash will be used if given a non-zero header. +pub fn test_header_with_root(number: H::Number, state_root: H::Hash) -> H { + let mut header: H = test_header(number); + header.set_state_root(state_root); + header +} + +/// Convenience function for generating a Header ID at a given block number. +pub fn header_id(index: u8) -> (H::Hash, H::Number) { + (test_header::(index.into()).hash(), index.into()) +} + +#[macro_export] +/// Adds methods for testing the `set_owner()` and `set_operating_mode()` for a pallet. +/// Some values are hardcoded like: +/// - `run_test()` +/// - `Pallet::` +/// - `PalletOwner::` +/// - `PalletOperatingMode::` +/// While this is not ideal, all the pallets use the same names, so it works for the moment. +/// We can revisit this in the future if anything changes. +macro_rules! generate_owned_bridge_module_tests { + ($normal_operating_mode: expr, $halted_operating_mode: expr) => { + #[test] + fn test_set_owner() { + run_test(|| { + PalletOwner::::put(1); + + // The root should be able to change the owner. + assert_ok!(Pallet::::set_owner(RuntimeOrigin::root(), Some(2))); + assert_eq!(PalletOwner::::get(), Some(2)); + + // The owner should be able to change the owner. + assert_ok!(Pallet::::set_owner(RuntimeOrigin::signed(2), Some(3))); + assert_eq!(PalletOwner::::get(), Some(3)); + + // Other users shouldn't be able to change the owner. + assert_noop!( + Pallet::::set_owner(RuntimeOrigin::signed(1), Some(4)), + DispatchError::BadOrigin + ); + assert_eq!(PalletOwner::::get(), Some(3)); + }); + } + + #[test] + fn test_set_operating_mode() { + run_test(|| { + PalletOwner::::put(1); + PalletOperatingMode::::put($normal_operating_mode); + + // The root should be able to halt the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + $halted_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); + // The root should be able to resume the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + $normal_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); + + // The owner should be able to halt the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::signed(1), + $halted_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); + // The owner should be able to resume the pallet. + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::signed(1), + $normal_operating_mode + )); + assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); + + // Other users shouldn't be able to halt the pallet. + assert_noop!( + Pallet::::set_operating_mode( + RuntimeOrigin::signed(2), + $halted_operating_mode + ), + DispatchError::BadOrigin + ); + assert_eq!(PalletOperatingMode::::get(), $normal_operating_mode); + // Other users shouldn't be able to resume the pallet. + PalletOperatingMode::::put($halted_operating_mode); + assert_noop!( + Pallet::::set_operating_mode( + RuntimeOrigin::signed(2), + $normal_operating_mode + ), + DispatchError::BadOrigin + ); + assert_eq!(PalletOperatingMode::::get(), $halted_operating_mode); + }); + } + }; +} diff --git a/primitives/xcm-bridge-hub-router/Cargo.toml b/primitives/xcm-bridge-hub-router/Cargo.toml new file mode 100644 index 000000000000..6cf260ce5e9b --- /dev/null +++ b/primitives/xcm-bridge-hub-router/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "bp-xcm-bridge-hub-router" +description = "Primitives of the xcm-bridge-hub fee pallet." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } + +# Substrate Dependencies +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = ["codec/std", "scale-info/std", "sp-core/std", "sp-runtime/std"] diff --git a/primitives/xcm-bridge-hub-router/src/lib.rs b/primitives/xcm-bridge-hub-router/src/lib.rs new file mode 100644 index 000000000000..dbedb7a52c7f --- /dev/null +++ b/primitives/xcm-bridge-hub-router/src/lib.rs @@ -0,0 +1,66 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives of the `xcm-bridge-hub-router` pallet. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_core::H256; +use sp_runtime::{FixedU128, RuntimeDebug}; + +/// Minimal delivery fee factor. +pub const MINIMAL_DELIVERY_FEE_FACTOR: FixedU128 = FixedU128::from_u32(1); + +/// XCM channel status provider that may report whether it is congested or not. +/// +/// By channel we mean the physical channel that is used to deliver messages of one +/// of the bridge queues. +pub trait XcmChannelStatusProvider { + /// Returns true if the channel is currently congested. + fn is_congested() -> bool; +} + +impl XcmChannelStatusProvider for () { + fn is_congested() -> bool { + false + } +} + +/// Current status of the bridge. +#[derive(Clone, Decode, Encode, Eq, PartialEq, TypeInfo, MaxEncodedLen, RuntimeDebug)] +pub struct BridgeState { + /// Current delivery fee factor. + pub delivery_fee_factor: FixedU128, + /// Bridge congestion flag. + pub is_congested: bool, +} + +impl Default for BridgeState { + fn default() -> BridgeState { + BridgeState { delivery_fee_factor: MINIMAL_DELIVERY_FEE_FACTOR, is_congested: false } + } +} + +/// A minimized version of `pallet-xcm-bridge-hub-router::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum XcmBridgeHubRouterCall { + /// `pallet-xcm-bridge-hub-router::Call::report_bridge_status` + #[codec(index = 0)] + report_bridge_status { bridge_id: H256, is_congested: bool }, +} diff --git a/primitives/xcm-bridge-hub/Cargo.toml b/primitives/xcm-bridge-hub/Cargo.toml new file mode 100644 index 000000000000..761fbef46e22 --- /dev/null +++ b/primitives/xcm-bridge-hub/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "bp-xcm-bridge-hub" +description = "Primitives of the xcm-bridge-hub pallet." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] + +# Substrate Dependencies +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = ["std"] +std = ["sp-std/std"] diff --git a/primitives/xcm-bridge-hub/src/lib.rs b/primitives/xcm-bridge-hub/src/lib.rs new file mode 100644 index 000000000000..9745011c902d --- /dev/null +++ b/primitives/xcm-bridge-hub/src/lib.rs @@ -0,0 +1,24 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives of the xcm-bridge-hub pallet. + +#![warn(missing_docs)] +#![cfg_attr(not(feature = "std"), no_std)] + +/// Encoded XCM blob. We expect the bridge messages pallet to use this blob type for both inbound +/// and outbound payloads. +pub type XcmAsPlainPayload = sp_std::vec::Vec; diff --git a/relays/bin-substrate/Cargo.toml b/relays/bin-substrate/Cargo.toml new file mode 100644 index 000000000000..6b9114e3d7e5 --- /dev/null +++ b/relays/bin-substrate/Cargo.toml @@ -0,0 +1,63 @@ +[package] +name = "substrate-relay" +version = "1.0.1" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +anyhow = "1.0" +async-std = "1.9.0" +async-trait = "0.1" +codec = { package = "parity-scale-codec", version = "3.1.5" } +env_logger = "0.10" +futures = "0.3.29" +hex = "0.4" +log = "0.4.20" +num-format = "0.4" +num-traits = "0.2" +rbtag = "0.3" +structopt = "0.3" +signal-hook = "0.3.15" +signal-hook-async-std = "0.2.2" +strum = { version = "0.25.0", features = ["derive"] } + +# Bridge dependencies +bp-bridge-hub-polkadot = { path = "../../primitives/chain-bridge-hub-polkadot" } +bp-bridge-hub-rococo = { path = "../../primitives/chain-bridge-hub-rococo" } +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-parachains = { path = "../../primitives/parachains" } +bp-polkadot-bulletin = { path = "../../primitives/chain-polkadot-bulletin" } +bp-polkadot = { path = "../../primitives/chain-polkadot" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-rococo = { path = "../../primitives/chain-rococo" } +bp-runtime = { path = "../../primitives/runtime" } +bridge-runtime-common = { path = "../../bin/runtime-common" } +pallet-bridge-parachains = { path = "../../modules/parachains" } +parachains-relay = { path = "../parachains" } +relay-bridge-hub-kusama-client = { path = "../client-bridge-hub-kusama" } +relay-bridge-hub-polkadot-client = { path = "../client-bridge-hub-polkadot" } +relay-bridge-hub-rococo-client = { path = "../client-bridge-hub-rococo" } +relay-bridge-hub-westend-client = { path = "../client-bridge-hub-westend" } +relay-kusama-client = { path = "../client-kusama" } +relay-polkadot-client = { path = "../client-polkadot" } +relay-polkadot-bulletin-client = { path = "../client-polkadot-bulletin" } +relay-rococo-client = { path = "../client-rococo" } +relay-substrate-client = { path = "../client-substrate" } +relay-utils = { path = "../utils" } +relay-westend-client = { path = "../client-westend" } +substrate-relay-helper = { path = "../lib-substrate-relay" } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[dev-dependencies] +bp-test-utils = { path = "../../primitives/test-utils" } +hex-literal = "0.4" +sp-keyring = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +tempfile = "3.8" +finality-grandpa = { version = "0.16.2" } diff --git a/relays/bin-substrate/src/bridges/kusama_polkadot/bridge_hub_kusama_messages_to_bridge_hub_polkadot.rs b/relays/bin-substrate/src/bridges/kusama_polkadot/bridge_hub_kusama_messages_to_bridge_hub_polkadot.rs new file mode 100644 index 000000000000..9abec22b9810 --- /dev/null +++ b/relays/bin-substrate/src/bridges/kusama_polkadot/bridge_hub_kusama_messages_to_bridge_hub_polkadot.rs @@ -0,0 +1,65 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BridgeHubKusama-to-BridgeHubPolkadot messages sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_bridge_hub_kusama_client::BridgeHubKusama; +use relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +/// BridgeHubKusama-to-BridgeHubPolkadot messages bridge. +pub struct BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge {} + +impl CliBridgeBase for BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge { + type Source = BridgeHubKusama; + type Target = BridgeHubPolkadot; +} + +impl MessagesCliBridge for BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge { + type MessagesLane = BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLane, + BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesProofCallBuilder, + relay_bridge_hub_polkadot_client::runtime::Call::BridgeKusamaMessages, + relay_bridge_hub_polkadot_client::runtime::BridgeKusamaMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLane, + BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_bridge_hub_kusama_client::runtime::Call::BridgePolkadotMessages, + relay_bridge_hub_kusama_client::runtime::BridgePolkadotMessagesCall::receive_messages_delivery_proof +); + +/// BridgeHubKusama-to-BridgeHubPolkadot messages lane. +#[derive(Clone, Debug)] +pub struct BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLane; + +impl SubstrateMessageLane for BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLane { + type SourceChain = BridgeHubKusama; + type TargetChain = BridgeHubPolkadot; + + type ReceiveMessagesProofCallBuilder = + BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder; + type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder; +} diff --git a/relays/bin-substrate/src/bridges/kusama_polkadot/bridge_hub_polkadot_messages_to_bridge_hub_kusama.rs b/relays/bin-substrate/src/bridges/kusama_polkadot/bridge_hub_polkadot_messages_to_bridge_hub_kusama.rs new file mode 100644 index 000000000000..191a84b27c27 --- /dev/null +++ b/relays/bin-substrate/src/bridges/kusama_polkadot/bridge_hub_polkadot_messages_to_bridge_hub_kusama.rs @@ -0,0 +1,65 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BridgeHubPolkadot-to-BridgeHubKusama messages sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_bridge_hub_kusama_client::BridgeHubKusama; +use relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +/// BridgeHubPolkadot-to-BridgeHubKusama messages bridge. +pub struct BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge {} + +impl CliBridgeBase for BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge { + type Source = BridgeHubPolkadot; + type Target = BridgeHubKusama; +} + +impl MessagesCliBridge for BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge { + type MessagesLane = BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLane, + BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLaneReceiveMessagesProofCallBuilder, + relay_bridge_hub_kusama_client::runtime::Call::BridgePolkadotMessages, + relay_bridge_hub_kusama_client::runtime::BridgePolkadotMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLane, + BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_bridge_hub_polkadot_client::runtime::Call::BridgeKusamaMessages, + relay_bridge_hub_polkadot_client::runtime::BridgeKusamaMessagesCall::receive_messages_delivery_proof +); + +/// BridgeHubPolkadot-to-BridgeHubKusama messages lane. +#[derive(Clone, Debug)] +pub struct BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLane; + +impl SubstrateMessageLane for BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLane { + type SourceChain = BridgeHubPolkadot; + type TargetChain = BridgeHubKusama; + + type ReceiveMessagesProofCallBuilder = + BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder; + type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder; +} diff --git a/relays/bin-substrate/src/bridges/kusama_polkadot/kusama_headers_to_bridge_hub_polkadot.rs b/relays/bin-substrate/src/bridges/kusama_polkadot/kusama_headers_to_bridge_hub_polkadot.rs new file mode 100644 index 000000000000..2dc9c131305a --- /dev/null +++ b/relays/bin-substrate/src/bridges/kusama_polkadot/kusama_headers_to_bridge_hub_polkadot.rs @@ -0,0 +1,80 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Kusama-to-BridgeHubPolkadot headers sync entrypoint. + +use crate::cli::bridge::{ + CliBridgeBase, RelayToRelayEquivocationDetectionCliBridge, RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of Kusama -> PolkadotBridgeHub finalized headers bridge. +#[derive(Clone, Debug)] +pub struct KusamaFinalityToBridgeHubPolkadot; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + KusamaFinalityToBridgeHubPolkadot, + SubmitFinalityProofCallBuilder, + relay_bridge_hub_polkadot_client::runtime::Call::BridgeKusamaGrandpa, + relay_bridge_hub_polkadot_client::runtime::BridgeKusamaGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + KusamaFinalityToBridgeHubPolkadot, + ReportEquivocationCallBuilder, + relay_kusama_client::RuntimeCall::Grandpa, + relay_kusama_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for KusamaFinalityToBridgeHubPolkadot { + type SourceChain = relay_kusama_client::Kusama; + type TargetChain = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for KusamaFinalityToBridgeHubPolkadot { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for KusamaFinalityToBridgeHubPolkadot { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `Kusama` to BridgeHub `Polkadot` bridge definition. +pub struct KusamaToBridgeHubPolkadotCliBridge {} + +impl CliBridgeBase for KusamaToBridgeHubPolkadotCliBridge { + type Source = relay_kusama_client::Kusama; + type Target = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +} + +impl RelayToRelayHeadersCliBridge for KusamaToBridgeHubPolkadotCliBridge { + type Finality = KusamaFinalityToBridgeHubPolkadot; +} + +impl RelayToRelayEquivocationDetectionCliBridge for KusamaToBridgeHubPolkadotCliBridge { + type Equivocation = KusamaFinalityToBridgeHubPolkadot; +} diff --git a/relays/bin-substrate/src/bridges/kusama_polkadot/kusama_parachains_to_bridge_hub_polkadot.rs b/relays/bin-substrate/src/bridges/kusama_polkadot/kusama_parachains_to_bridge_hub_polkadot.rs new file mode 100644 index 000000000000..e5936640cb3b --- /dev/null +++ b/relays/bin-substrate/src/bridges/kusama_polkadot/kusama_parachains_to_bridge_hub_polkadot.rs @@ -0,0 +1,75 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Kusama-to-BridgeHubPolkadot parachains sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use relay_substrate_client::{CallOf, HeaderIdOf}; +use substrate_relay_helper::parachains::{ + SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, +}; + +/// Kusama-to-BridgeHubPolkadot parachain sync description. +#[derive(Clone, Debug)] +pub struct BridgeHubKusamaToBridgeHubPolkadot; + +impl SubstrateParachainsPipeline for BridgeHubKusamaToBridgeHubPolkadot { + type SourceParachain = relay_bridge_hub_kusama_client::BridgeHubKusama; + type SourceRelayChain = relay_kusama_client::Kusama; + type TargetChain = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + + type SubmitParachainHeadsCallBuilder = BridgeHubKusamaToBridgeHubPolkadotCallBuilder; +} + +pub struct BridgeHubKusamaToBridgeHubPolkadotCallBuilder; +impl SubmitParachainHeadsCallBuilder + for BridgeHubKusamaToBridgeHubPolkadotCallBuilder +{ + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + relay_bridge_hub_polkadot_client::runtime::Call::BridgeKusamaParachain( + relay_bridge_hub_polkadot_client::runtime::BridgeParachainCall::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + }, + ) + } +} + +/// Kusama-to-BridgeHubPolkadot parachain sync description for the CLI. +pub struct BridgeHubKusamaToBridgeHubPolkadotCliBridge {} + +impl ParachainToRelayHeadersCliBridge for BridgeHubKusamaToBridgeHubPolkadotCliBridge { + type SourceRelay = relay_kusama_client::Kusama; + type ParachainFinality = BridgeHubKusamaToBridgeHubPolkadot; + type RelayFinality = + crate::bridges::kusama_polkadot::kusama_headers_to_bridge_hub_polkadot::KusamaFinalityToBridgeHubPolkadot; +} + +impl CliBridgeBase for BridgeHubKusamaToBridgeHubPolkadotCliBridge { + type Source = relay_bridge_hub_kusama_client::BridgeHubKusama; + type Target = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +} + +impl MessagesCliBridge for BridgeHubKusamaToBridgeHubPolkadotCliBridge { + type MessagesLane = + crate::bridges::kusama_polkadot::bridge_hub_kusama_messages_to_bridge_hub_polkadot::BridgeHubKusamaMessagesToBridgeHubPolkadotMessageLane; +} diff --git a/relays/bin-substrate/src/bridges/kusama_polkadot/mod.rs b/relays/bin-substrate/src/bridges/kusama_polkadot/mod.rs new file mode 100644 index 000000000000..65cd8d9ded6c --- /dev/null +++ b/relays/bin-substrate/src/bridges/kusama_polkadot/mod.rs @@ -0,0 +1,24 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Declaration of all bridges between Kusama Bridge Hub and Polkadot Bridge Hub. + +pub mod bridge_hub_kusama_messages_to_bridge_hub_polkadot; +pub mod bridge_hub_polkadot_messages_to_bridge_hub_kusama; +pub mod kusama_headers_to_bridge_hub_polkadot; +pub mod kusama_parachains_to_bridge_hub_polkadot; +pub mod polkadot_headers_to_bridge_hub_kusama; +pub mod polkadot_parachains_to_bridge_hub_kusama; diff --git a/relays/bin-substrate/src/bridges/kusama_polkadot/polkadot_headers_to_bridge_hub_kusama.rs b/relays/bin-substrate/src/bridges/kusama_polkadot/polkadot_headers_to_bridge_hub_kusama.rs new file mode 100644 index 000000000000..589bf2546e8c --- /dev/null +++ b/relays/bin-substrate/src/bridges/kusama_polkadot/polkadot_headers_to_bridge_hub_kusama.rs @@ -0,0 +1,80 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Polkadot-to-KusamaBridgeHub headers sync entrypoint. + +use crate::cli::bridge::{ + CliBridgeBase, RelayToRelayEquivocationDetectionCliBridge, RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of Polkadot -> KusamaBridgeHub finalized headers bridge. +#[derive(Clone, Debug)] +pub struct PolkadotFinalityToBridgeHubKusama; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + PolkadotFinalityToBridgeHubKusama, + SubmitFinalityProofCallBuilder, + relay_bridge_hub_kusama_client::runtime::Call::BridgePolkadotGrandpa, + relay_bridge_hub_kusama_client::runtime::BridgePolkadotGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + PolkadotFinalityToBridgeHubKusama, + ReportEquivocationCallBuilder, + relay_polkadot_client::RuntimeCall::Grandpa, + relay_polkadot_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for PolkadotFinalityToBridgeHubKusama { + type SourceChain = relay_polkadot_client::Polkadot; + type TargetChain = relay_bridge_hub_kusama_client::BridgeHubKusama; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for PolkadotFinalityToBridgeHubKusama { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for PolkadotFinalityToBridgeHubKusama { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `Polkadot` to BridgeHub `Kusama` bridge definition. +pub struct PolkadotToBridgeHubKusamaCliBridge {} + +impl CliBridgeBase for PolkadotToBridgeHubKusamaCliBridge { + type Source = relay_polkadot_client::Polkadot; + type Target = relay_bridge_hub_kusama_client::BridgeHubKusama; +} + +impl RelayToRelayHeadersCliBridge for PolkadotToBridgeHubKusamaCliBridge { + type Finality = PolkadotFinalityToBridgeHubKusama; +} + +impl RelayToRelayEquivocationDetectionCliBridge for PolkadotToBridgeHubKusamaCliBridge { + type Equivocation = PolkadotFinalityToBridgeHubKusama; +} diff --git a/relays/bin-substrate/src/bridges/kusama_polkadot/polkadot_parachains_to_bridge_hub_kusama.rs b/relays/bin-substrate/src/bridges/kusama_polkadot/polkadot_parachains_to_bridge_hub_kusama.rs new file mode 100644 index 000000000000..f2a7f7309cf1 --- /dev/null +++ b/relays/bin-substrate/src/bridges/kusama_polkadot/polkadot_parachains_to_bridge_hub_kusama.rs @@ -0,0 +1,75 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Polkadot-to-BridgeHubKusama parachains sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use relay_substrate_client::{CallOf, HeaderIdOf}; +use substrate_relay_helper::parachains::{ + SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, +}; + +/// Polkadot-to-BridgeHubKusama parachain sync description. +#[derive(Clone, Debug)] +pub struct BridgeHubPolkadotToBridgeHubKusama; + +impl SubstrateParachainsPipeline for BridgeHubPolkadotToBridgeHubKusama { + type SourceParachain = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + type SourceRelayChain = relay_polkadot_client::Polkadot; + type TargetChain = relay_bridge_hub_kusama_client::BridgeHubKusama; + + type SubmitParachainHeadsCallBuilder = BridgeHubPolkadotToBridgeHubKusamaCallBuilder; +} + +pub struct BridgeHubPolkadotToBridgeHubKusamaCallBuilder; +impl SubmitParachainHeadsCallBuilder + for BridgeHubPolkadotToBridgeHubKusamaCallBuilder +{ + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + relay_bridge_hub_kusama_client::runtime::Call::BridgePolkadotParachain( + bp_parachains::BridgeParachainCall::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + }, + ) + } +} + +/// Polkadot-to-BridgeHubKusama parachain sync description for the CLI. +pub struct BridgeHubPolkadotToBridgeHubKusamaCliBridge {} + +impl ParachainToRelayHeadersCliBridge for BridgeHubPolkadotToBridgeHubKusamaCliBridge { + type SourceRelay = relay_polkadot_client::Polkadot; + type ParachainFinality = BridgeHubPolkadotToBridgeHubKusama; + type RelayFinality = + crate::bridges::kusama_polkadot::polkadot_headers_to_bridge_hub_kusama::PolkadotFinalityToBridgeHubKusama; +} + +impl CliBridgeBase for BridgeHubPolkadotToBridgeHubKusamaCliBridge { + type Source = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + type Target = relay_bridge_hub_kusama_client::BridgeHubKusama; +} + +impl MessagesCliBridge for BridgeHubPolkadotToBridgeHubKusamaCliBridge { + type MessagesLane = + crate::bridges::kusama_polkadot::bridge_hub_polkadot_messages_to_bridge_hub_kusama::BridgeHubPolkadotMessagesToBridgeHubKusamaMessageLane; +} diff --git a/relays/bin-substrate/src/bridges/mod.rs b/relays/bin-substrate/src/bridges/mod.rs new file mode 100644 index 000000000000..cfe59c87567d --- /dev/null +++ b/relays/bin-substrate/src/bridges/mod.rs @@ -0,0 +1,22 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Declaration of all bridges that the relay is able to serve. + +pub mod kusama_polkadot; +pub mod polkadot_bulletin; +pub mod rococo_bulletin; +pub mod rococo_westend; diff --git a/relays/bin-substrate/src/bridges/polkadot_bulletin/bridge_hub_polkadot_messages_to_polkadot_bulletin.rs b/relays/bin-substrate/src/bridges/polkadot_bulletin/bridge_hub_polkadot_messages_to_polkadot_bulletin.rs new file mode 100644 index 000000000000..ba80d96a93cc --- /dev/null +++ b/relays/bin-substrate/src/bridges/polkadot_bulletin/bridge_hub_polkadot_messages_to_polkadot_bulletin.rs @@ -0,0 +1,65 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BridgeHubPolkadot-to-PolkadotBulletin messages sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +use relay_polkadot_bulletin_client::PolkadotBulletin; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +/// BridgeHubPolkadot-to-PolkadotBulletin messages bridge. +pub struct BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge {} + +impl CliBridgeBase for BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge { + type Source = BridgeHubPolkadot; + type Target = PolkadotBulletin; +} + +impl MessagesCliBridge for BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge { + type MessagesLane = BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane, + BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesProofCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotMessages, + relay_polkadot_bulletin_client::BridgePolkadotMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane, + BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinMessages, + relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinMessagesCall::receive_messages_delivery_proof +); + +/// BridgeHubPolkadot-to-PolkadotBulletin messages lane. +#[derive(Clone, Debug)] +pub struct BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane; + +impl SubstrateMessageLane for BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane { + type SourceChain = BridgeHubPolkadot; + type TargetChain = PolkadotBulletin; + + type ReceiveMessagesProofCallBuilder = + BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + BridgeHubPolkadotMessagesToPolkadotBulletinMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder; + type TargetBatchCallBuilder = (); +} diff --git a/relays/bin-substrate/src/bridges/polkadot_bulletin/mod.rs b/relays/bin-substrate/src/bridges/polkadot_bulletin/mod.rs new file mode 100644 index 000000000000..d7c740f601ab --- /dev/null +++ b/relays/bin-substrate/src/bridges/polkadot_bulletin/mod.rs @@ -0,0 +1,23 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Declaration of all bridges between Polkadot Bulletin Chain and Polkadot Bridge Hub. + +pub mod bridge_hub_polkadot_messages_to_polkadot_bulletin; +pub mod polkadot_bulletin_headers_to_bridge_hub_polkadot; +pub mod polkadot_bulletin_messages_to_bridge_hub_polkadot; +pub mod polkadot_headers_to_polkadot_bulletin; +pub mod polkadot_parachains_to_polkadot_bulletin; diff --git a/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_bulletin_headers_to_bridge_hub_polkadot.rs b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_bulletin_headers_to_bridge_hub_polkadot.rs new file mode 100644 index 000000000000..dbf89ddeec39 --- /dev/null +++ b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_bulletin_headers_to_bridge_hub_polkadot.rs @@ -0,0 +1,85 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! PolkadotBulletin-to-BridgeHubPolkadot headers sync entrypoint. + +use crate::cli::bridge::{ + CliBridgeBase, MessagesCliBridge, RelayToRelayEquivocationDetectionCliBridge, + RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of `PolkadotBulletin` -> `PolkadotBridgeHub` finalized headers bridge. +#[derive(Clone, Debug)] +pub struct PolkadotBulletinFinalityToBridgeHubPolkadot; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + PolkadotBulletinFinalityToBridgeHubPolkadot, + SubmitFinalityProofCallBuilder, + relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinGrandpa, + relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + PolkadotBulletinFinalityToBridgeHubPolkadot, + ReportEquivocationCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::Grandpa, + relay_polkadot_bulletin_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for PolkadotBulletinFinalityToBridgeHubPolkadot { + type SourceChain = relay_polkadot_bulletin_client::PolkadotBulletin; + type TargetChain = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for PolkadotBulletinFinalityToBridgeHubPolkadot { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for PolkadotBulletinFinalityToBridgeHubPolkadot { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `PolkadotBulletin` to BridgeHub `Polkadot` bridge definition. +pub struct PolkadotBulletinToBridgeHubPolkadotCliBridge {} + +impl CliBridgeBase for PolkadotBulletinToBridgeHubPolkadotCliBridge { + type Source = relay_polkadot_bulletin_client::PolkadotBulletin; + type Target = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +} + +impl RelayToRelayHeadersCliBridge for PolkadotBulletinToBridgeHubPolkadotCliBridge { + type Finality = PolkadotBulletinFinalityToBridgeHubPolkadot; +} + +impl RelayToRelayEquivocationDetectionCliBridge for PolkadotBulletinToBridgeHubPolkadotCliBridge { + type Equivocation = PolkadotBulletinFinalityToBridgeHubPolkadot; +} + +impl MessagesCliBridge for PolkadotBulletinToBridgeHubPolkadotCliBridge { + type MessagesLane = crate::bridges::polkadot_bulletin::polkadot_bulletin_messages_to_bridge_hub_polkadot::PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane; +} diff --git a/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_bulletin_messages_to_bridge_hub_polkadot.rs b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_bulletin_messages_to_bridge_hub_polkadot.rs new file mode 100644 index 000000000000..1db77b6ed47b --- /dev/null +++ b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_bulletin_messages_to_bridge_hub_polkadot.rs @@ -0,0 +1,65 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! PolkadotBulletin-to-BridgeHubPolkadot messages sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +use relay_polkadot_bulletin_client::PolkadotBulletin; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +/// PolkadotBulletin-to-BridgeHubPolkadot messages bridge. +pub struct PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge {} + +impl CliBridgeBase for PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge { + type Source = PolkadotBulletin; + type Target = BridgeHubPolkadot; +} + +impl MessagesCliBridge for PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge { + type MessagesLane = PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane, + PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesProofCallBuilder, + relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinMessages, + relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane, + PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotMessages, + relay_polkadot_bulletin_client::BridgePolkadotMessagesCall::receive_messages_delivery_proof +); + +/// PolkadotBulletin-to-BridgeHubPolkadot messages lane. +#[derive(Clone, Debug)] +pub struct PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane; + +impl SubstrateMessageLane for PolkadotBulletinMessagesToBridgeHubPolkadotMessageLane { + type SourceChain = PolkadotBulletin; + type TargetChain = BridgeHubPolkadot; + + type ReceiveMessagesProofCallBuilder = + PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + PolkadotBulletinMessagesToBridgeHubPolkadotMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = (); + type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder; +} diff --git a/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_headers_to_polkadot_bulletin.rs b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_headers_to_polkadot_bulletin.rs new file mode 100644 index 000000000000..897c2ac884f9 --- /dev/null +++ b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_headers_to_polkadot_bulletin.rs @@ -0,0 +1,80 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Polkadot-to-PolkadotBulletin headers sync entrypoint. + +use crate::cli::bridge::{ + CliBridgeBase, RelayToRelayEquivocationDetectionCliBridge, RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of Polkadot -> `PolkadotBulletin` finalized headers bridge. +#[derive(Clone, Debug)] +pub struct PolkadotFinalityToPolkadotBulletin; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + PolkadotFinalityToPolkadotBulletin, + SubmitFinalityProofCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotGrandpa, + relay_polkadot_bulletin_client::BridgePolkadotGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + PolkadotFinalityToPolkadotBulletin, + ReportEquivocationCallBuilder, + relay_polkadot_client::RuntimeCall::Grandpa, + relay_polkadot_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for PolkadotFinalityToPolkadotBulletin { + type SourceChain = relay_polkadot_client::Polkadot; + type TargetChain = relay_polkadot_bulletin_client::PolkadotBulletin; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for PolkadotFinalityToPolkadotBulletin { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for PolkadotFinalityToPolkadotBulletin { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `Polkadot` to BridgeHub `PolkadotBulletin` bridge definition. +pub struct PolkadotToPolkadotBulletinCliBridge {} + +impl CliBridgeBase for PolkadotToPolkadotBulletinCliBridge { + type Source = relay_polkadot_client::Polkadot; + type Target = relay_polkadot_bulletin_client::PolkadotBulletin; +} + +impl RelayToRelayHeadersCliBridge for PolkadotToPolkadotBulletinCliBridge { + type Finality = PolkadotFinalityToPolkadotBulletin; +} + +impl RelayToRelayEquivocationDetectionCliBridge for PolkadotToPolkadotBulletinCliBridge { + type Equivocation = PolkadotFinalityToPolkadotBulletin; +} diff --git a/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_parachains_to_polkadot_bulletin.rs b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_parachains_to_polkadot_bulletin.rs new file mode 100644 index 000000000000..674c84adb39c --- /dev/null +++ b/relays/bin-substrate/src/bridges/polkadot_bulletin/polkadot_parachains_to_polkadot_bulletin.rs @@ -0,0 +1,92 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Polkadot-to-PolkadotBulletin parachains sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}; + +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use bp_runtime::Chain; +use relay_substrate_client::{CallOf, HeaderIdOf}; +use substrate_relay_helper::{ + messages_lane::MessagesRelayLimits, + parachains::{SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline}, +}; + +/// Polkadot-to-PolkadotBulletin parachain sync description. +#[derive(Clone, Debug)] +pub struct PolkadotToPolkadotBulletin; + +impl SubstrateParachainsPipeline for PolkadotToPolkadotBulletin { + type SourceParachain = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + type SourceRelayChain = relay_polkadot_client::Polkadot; + type TargetChain = relay_polkadot_bulletin_client::PolkadotBulletin; + + type SubmitParachainHeadsCallBuilder = PolkadotToPolkadotBulletinCallBuilder; +} + +pub struct PolkadotToPolkadotBulletinCallBuilder; +impl SubmitParachainHeadsCallBuilder + for PolkadotToPolkadotBulletinCallBuilder +{ + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotParachains( + relay_polkadot_bulletin_client::BridgePolkadotParachainsCall::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + }, + ) + } +} + +/// Polkadot-to-PolkadotBulletin parachain sync description for the CLI. +pub struct PolkadotToPolkadotBulletinCliBridge {} + +impl ParachainToRelayHeadersCliBridge for PolkadotToPolkadotBulletinCliBridge { + type SourceRelay = relay_polkadot_client::Polkadot; + type ParachainFinality = PolkadotToPolkadotBulletin; + type RelayFinality = + crate::bridges::polkadot_bulletin::polkadot_headers_to_polkadot_bulletin::PolkadotFinalityToPolkadotBulletin; +} + +impl CliBridgeBase for PolkadotToPolkadotBulletinCliBridge { + type Source = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + type Target = relay_polkadot_bulletin_client::PolkadotBulletin; +} + +impl MessagesCliBridge for PolkadotToPolkadotBulletinCliBridge { + type MessagesLane = + crate::bridges::polkadot_bulletin::bridge_hub_polkadot_messages_to_polkadot_bulletin::BridgeHubPolkadotMessagesToPolkadotBulletinMessageLane; + + fn maybe_messages_limits() -> Option { + // Polkadot Bulletin chain is missing the `TransactionPayment` runtime API (as well as the + // transaction payment pallet itself), so we can't estimate limits using runtime calls. + // Let's do it here. + // + // Folloiung constants are just safe **underestimations**. Normally, we are able to deliver + // and dispatch thousands of messages in the same transaction. + Some(MessagesRelayLimits { + max_messages_in_single_batch: 128, + max_messages_weight_in_single_batch: + bp_polkadot_bulletin::PolkadotBulletin::max_extrinsic_weight() / 20, + }) + } +} diff --git a/relays/bin-substrate/src/bridges/rococo_bulletin/bridge_hub_rococo_messages_to_rococo_bulletin.rs b/relays/bin-substrate/src/bridges/rococo_bulletin/bridge_hub_rococo_messages_to_rococo_bulletin.rs new file mode 100644 index 000000000000..a2de83831c9b --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_bulletin/bridge_hub_rococo_messages_to_rococo_bulletin.rs @@ -0,0 +1,65 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BridgeHubRococo-to-RococoBulletin messages sync entrypoint. + +use super::BridgeHubRococoAsBridgeHubPolkadot; +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_polkadot_bulletin_client::PolkadotBulletin as RococoBulletin; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +/// BridgeHubRococo-to-RococoBulletin messages bridge. +pub struct BridgeHubRococoToRococoBulletinMessagesCliBridge {} + +impl CliBridgeBase for BridgeHubRococoToRococoBulletinMessagesCliBridge { + type Source = BridgeHubRococoAsBridgeHubPolkadot; + type Target = RococoBulletin; +} + +impl MessagesCliBridge for BridgeHubRococoToRococoBulletinMessagesCliBridge { + type MessagesLane = BridgeHubRococoMessagesToRococoBulletinMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + BridgeHubRococoMessagesToRococoBulletinMessageLane, + BridgeHubRococoMessagesToRococoBulletinMessageLaneReceiveMessagesProofCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotMessages, + relay_polkadot_bulletin_client::BridgePolkadotMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + BridgeHubRococoMessagesToRococoBulletinMessageLane, + BridgeHubRococoMessagesToRococoBulletinMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_bridge_hub_rococo_client::RuntimeCall::BridgePolkadotBulletinMessages, + relay_bridge_hub_rococo_client::BridgeBulletinMessagesCall::receive_messages_delivery_proof +); + +/// BridgeHubRococo-to-RococoBulletin messages lane. +#[derive(Clone, Debug)] +pub struct BridgeHubRococoMessagesToRococoBulletinMessageLane; + +impl SubstrateMessageLane for BridgeHubRococoMessagesToRococoBulletinMessageLane { + type SourceChain = BridgeHubRococoAsBridgeHubPolkadot; + type TargetChain = RococoBulletin; + + type ReceiveMessagesProofCallBuilder = + BridgeHubRococoMessagesToRococoBulletinMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + BridgeHubRococoMessagesToRococoBulletinMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder; + type TargetBatchCallBuilder = (); +} diff --git a/relays/bin-substrate/src/bridges/rococo_bulletin/mod.rs b/relays/bin-substrate/src/bridges/rococo_bulletin/mod.rs new file mode 100644 index 000000000000..7e37b62b6859 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_bulletin/mod.rs @@ -0,0 +1,258 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Declaration of all bridges between Rococo Bulletin Chain and Rococo Bridge Hub. + +use crate::cli::CliChain; + +use bp_messages::MessageNonce; +use bp_runtime::{ + AccountIdOf, BalanceOf, BlockNumberOf, ChainId, HashOf, HasherOf, HeaderOf, NonceOf, + SignatureOf, +}; +use frame_support::pallet_prelude::Weight; +use relay_substrate_client::{ + Error as SubstrateError, SignParam, SimpleRuntimeVersion, UnsignedTransaction, +}; +use sp_core::storage::StorageKey; +use std::time::Duration; + +pub mod bridge_hub_rococo_messages_to_rococo_bulletin; +pub mod rococo_bulletin_headers_to_bridge_hub_rococo; +pub mod rococo_bulletin_messages_to_bridge_hub_rococo; +pub mod rococo_headers_to_rococo_bulletin; +pub mod rococo_parachains_to_rococo_bulletin; + +/// Base `Chain` implementation of Rococo, pretending to be Polkadot. +pub struct RococoBaseAsPolkadot; + +impl bp_runtime::Chain for RococoBaseAsPolkadot { + type BlockNumber = BlockNumberOf; + type Hash = HashOf; + type Hasher = HasherOf; + type Header = HeaderOf; + + type AccountId = AccountIdOf; + type Balance = BalanceOf; + type Nonce = NonceOf; + type Signature = SignatureOf; + + fn max_extrinsic_size() -> u32 { + bp_rococo::Rococo::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + bp_rococo::Rococo::max_extrinsic_weight() + } +} + +impl bp_header_chain::ChainWithGrandpa for RococoBaseAsPolkadot { + const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = + bp_polkadot::Polkadot::WITH_CHAIN_GRANDPA_PALLET_NAME; + const MAX_AUTHORITIES_COUNT: u32 = bp_rococo::Rococo::MAX_AUTHORITIES_COUNT; + const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = + bp_rococo::Rococo::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const MAX_MANDATORY_HEADER_SIZE: u32 = bp_rococo::Rococo::MAX_MANDATORY_HEADER_SIZE; + const AVERAGE_HEADER_SIZE: u32 = bp_rococo::Rococo::AVERAGE_HEADER_SIZE; +} + +/// Relay `Chain` implementation of Rococo, pretending to be Polkadot. +#[derive(Debug, Clone, Copy)] +pub struct RococoAsPolkadot; + +impl bp_runtime::UnderlyingChainProvider for RococoAsPolkadot { + type Chain = RococoBaseAsPolkadot; +} + +impl relay_substrate_client::Chain for RococoAsPolkadot { + const ID: ChainId = relay_rococo_client::Rococo::ID; + const NAME: &'static str = relay_rococo_client::Rococo::NAME; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + relay_polkadot_client::Polkadot::BEST_FINALIZED_HEADER_ID_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = relay_rococo_client::Rococo::AVERAGE_BLOCK_INTERVAL; + + type SignedBlock = ::SignedBlock; + type Call = ::Call; +} + +impl relay_substrate_client::ChainWithGrandpa for RococoAsPolkadot { + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str = + relay_polkadot_client::Polkadot::SYNCED_HEADERS_GRANDPA_INFO_METHOD; + + type KeyOwnerProof = + ::KeyOwnerProof; +} + +impl relay_substrate_client::ChainWithBalances for RococoAsPolkadot { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + relay_rococo_client::Rococo::account_info_storage_key(account_id) + } +} + +impl relay_substrate_client::RelayChain for RococoAsPolkadot { + const PARAS_PALLET_NAME: &'static str = relay_rococo_client::Rococo::PARAS_PALLET_NAME; +} + +impl relay_substrate_client::ChainWithTransactions for RococoAsPolkadot { + type AccountKeyPair = ::AccountKeyPair; + type SignedTransaction = ::SignedTransaction; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + relay_rococo_client::Rococo::sign_transaction( + SignParam { + spec_version: param.spec_version, + transaction_version: param.transaction_version, + genesis_hash: param.genesis_hash, + signer: param.signer, + }, + unsigned.switch_chain(), + ) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + relay_rococo_client::Rococo::is_signed(tx) + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + relay_rococo_client::Rococo::is_signed_by(signer, tx) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + relay_rococo_client::Rococo::parse_transaction(tx).map(|tx| tx.switch_chain()) + } +} + +impl CliChain for RococoAsPolkadot { + const RUNTIME_VERSION: Option = None; +} + +/// Base `Chain` implementation of Rococo Bridge Hub, pretending to be a Polkadot Bridge Hub. +pub struct BaseBridgeHubRococoAsBridgeHubPolkadot; + +impl bp_runtime::Chain for BaseBridgeHubRococoAsBridgeHubPolkadot { + type BlockNumber = BlockNumberOf; + type Hash = HashOf; + type Hasher = HasherOf; + type Header = HeaderOf; + + type AccountId = AccountIdOf; + type Balance = BalanceOf; + type Nonce = NonceOf; + type Signature = SignatureOf; + + fn max_extrinsic_size() -> u32 { + bp_bridge_hub_rococo::BridgeHubRococo::max_extrinsic_size() + } + + fn max_extrinsic_weight() -> Weight { + bp_bridge_hub_rococo::BridgeHubRococo::max_extrinsic_weight() + } +} + +impl bp_runtime::Parachain for BaseBridgeHubRococoAsBridgeHubPolkadot { + const PARACHAIN_ID: u32 = bp_bridge_hub_rococo::BridgeHubRococo::PARACHAIN_ID; +} + +/// Relay `Chain` implementation of Rococo Bridge Hub, pretending to be a Polkadot Bridge Hub. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BridgeHubRococoAsBridgeHubPolkadot; + +impl bp_runtime::UnderlyingChainProvider for BridgeHubRococoAsBridgeHubPolkadot { + type Chain = BaseBridgeHubRococoAsBridgeHubPolkadot; +} + +impl relay_substrate_client::Chain for BridgeHubRococoAsBridgeHubPolkadot { + const ID: ChainId = relay_bridge_hub_rococo_client::BridgeHubRococo::ID; + const NAME: &'static str = relay_bridge_hub_rococo_client::BridgeHubRococo::NAME; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + relay_bridge_hub_polkadot_client::BridgeHubPolkadot::BEST_FINALIZED_HEADER_ID_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = + relay_bridge_hub_rococo_client::BridgeHubRococo::AVERAGE_BLOCK_INTERVAL; + + type SignedBlock = ::SignedBlock; + type Call = + ::Call; +} + +impl relay_substrate_client::ChainWithBalances for BridgeHubRococoAsBridgeHubPolkadot { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + relay_bridge_hub_rococo_client::BridgeHubRococo::account_info_storage_key(account_id) + } +} + +impl relay_substrate_client::ChainWithUtilityPallet for BridgeHubRococoAsBridgeHubPolkadot { + type UtilityPallet = relay_substrate_client::MockedRuntimeUtilityPallet< + relay_bridge_hub_rococo_client::RuntimeCall, + >; +} + +impl relay_substrate_client::ChainWithTransactions for BridgeHubRococoAsBridgeHubPolkadot { + type AccountKeyPair = ::AccountKeyPair; + type SignedTransaction = ::SignedTransaction; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + relay_bridge_hub_rococo_client::BridgeHubRococo::sign_transaction( + SignParam { + spec_version: param.spec_version, + transaction_version: param.transaction_version, + genesis_hash: param.genesis_hash, + signer: param.signer, + }, + unsigned.switch_chain(), + ) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + relay_bridge_hub_rococo_client::BridgeHubRococo::is_signed(tx) + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + relay_bridge_hub_rococo_client::BridgeHubRococo::is_signed_by(signer, tx) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + relay_bridge_hub_rococo_client::BridgeHubRococo::parse_transaction(tx) + .map(|tx| tx.switch_chain()) + } +} + +impl relay_substrate_client::ChainWithMessages for BridgeHubRococoAsBridgeHubPolkadot { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = + relay_bridge_hub_polkadot_client::BridgeHubPolkadot::WITH_CHAIN_MESSAGES_PALLET_NAME; + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = + relay_bridge_hub_polkadot_client::BridgeHubPolkadot::WITH_CHAIN_RELAYERS_PALLET_NAME; + + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + relay_bridge_hub_polkadot_client::BridgeHubPolkadot::TO_CHAIN_MESSAGE_DETAILS_METHOD; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + relay_bridge_hub_polkadot_client::BridgeHubPolkadot::FROM_CHAIN_MESSAGE_DETAILS_METHOD; + + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = + relay_bridge_hub_rococo_client::BridgeHubRococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = + relay_bridge_hub_rococo_client::BridgeHubRococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; +} + +impl CliChain for BridgeHubRococoAsBridgeHubPolkadot { + const RUNTIME_VERSION: Option = + Some(SimpleRuntimeVersion { spec_version: 1_003_000, transaction_version: 3 }); +} diff --git a/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_bulletin_headers_to_bridge_hub_rococo.rs b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_bulletin_headers_to_bridge_hub_rococo.rs new file mode 100644 index 000000000000..e897cd85967d --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_bulletin_headers_to_bridge_hub_rococo.rs @@ -0,0 +1,86 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! RococoBulletin-to-BridgeHubRococo headers sync entrypoint. + +use super::BridgeHubRococoAsBridgeHubPolkadot; +use crate::cli::bridge::{ + CliBridgeBase, MessagesCliBridge, RelayToRelayEquivocationDetectionCliBridge, + RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of `RococoBulletin` -> `RococoBridgeHub` finalized headers bridge. +#[derive(Clone, Debug)] +pub struct RococoBulletinFinalityToBridgeHubRococo; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + RococoBulletinFinalityToBridgeHubRococo, + SubmitFinalityProofCallBuilder, + relay_bridge_hub_rococo_client::RuntimeCall::BridgePolkadotBulletinGrandpa, + relay_bridge_hub_rococo_client::BridgeBulletinGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + RococoBulletinFinalityToBridgeHubRococo, + ReportEquivocationCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::Grandpa, + relay_polkadot_bulletin_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for RococoBulletinFinalityToBridgeHubRococo { + type SourceChain = relay_polkadot_bulletin_client::PolkadotBulletin; + type TargetChain = BridgeHubRococoAsBridgeHubPolkadot; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for RococoBulletinFinalityToBridgeHubRococo { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for RococoBulletinFinalityToBridgeHubRococo { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `RococoBulletin` to BridgeHub `Rococo` bridge definition. +pub struct RococoBulletinToBridgeHubRococoCliBridge {} + +impl CliBridgeBase for RococoBulletinToBridgeHubRococoCliBridge { + type Source = relay_polkadot_bulletin_client::PolkadotBulletin; + type Target = BridgeHubRococoAsBridgeHubPolkadot; +} + +impl RelayToRelayHeadersCliBridge for RococoBulletinToBridgeHubRococoCliBridge { + type Finality = RococoBulletinFinalityToBridgeHubRococo; +} + +impl RelayToRelayEquivocationDetectionCliBridge for RococoBulletinToBridgeHubRococoCliBridge { + type Equivocation = RococoBulletinFinalityToBridgeHubRococo; +} + +impl MessagesCliBridge for RococoBulletinToBridgeHubRococoCliBridge { + type MessagesLane = crate::bridges::rococo_bulletin::rococo_bulletin_messages_to_bridge_hub_rococo::RococoBulletinMessagesToBridgeHubRococoMessageLane; +} diff --git a/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_bulletin_messages_to_bridge_hub_rococo.rs b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_bulletin_messages_to_bridge_hub_rococo.rs new file mode 100644 index 000000000000..856be9cf6f2a --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_bulletin_messages_to_bridge_hub_rococo.rs @@ -0,0 +1,65 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! RococoBulletin-to-BridgeHubRococo messages sync entrypoint. + +use super::BridgeHubRococoAsBridgeHubPolkadot; +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_polkadot_bulletin_client::PolkadotBulletin as RococoBulletin; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +/// RococoBulletin-to-BridgeHubRococo messages bridge. +pub struct RococoBulletinToBridgeHubRococoMessagesCliBridge {} + +impl CliBridgeBase for RococoBulletinToBridgeHubRococoMessagesCliBridge { + type Source = RococoBulletin; + type Target = BridgeHubRococoAsBridgeHubPolkadot; +} + +impl MessagesCliBridge for RococoBulletinToBridgeHubRococoMessagesCliBridge { + type MessagesLane = RococoBulletinMessagesToBridgeHubRococoMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + RococoBulletinMessagesToBridgeHubRococoMessageLane, + RococoBulletinMessagesToBridgeHubRococoMessageLaneReceiveMessagesProofCallBuilder, + relay_bridge_hub_rococo_client::RuntimeCall::BridgePolkadotBulletinMessages, + relay_bridge_hub_rococo_client::BridgeBulletinMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + RococoBulletinMessagesToBridgeHubRococoMessageLane, + RococoBulletinMessagesToBridgeHubRococoMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotMessages, + relay_polkadot_bulletin_client::BridgePolkadotMessagesCall::receive_messages_delivery_proof +); + +/// RococoBulletin-to-BridgeHubRococo messages lane. +#[derive(Clone, Debug)] +pub struct RococoBulletinMessagesToBridgeHubRococoMessageLane; + +impl SubstrateMessageLane for RococoBulletinMessagesToBridgeHubRococoMessageLane { + type SourceChain = RococoBulletin; + type TargetChain = BridgeHubRococoAsBridgeHubPolkadot; + + type ReceiveMessagesProofCallBuilder = + RococoBulletinMessagesToBridgeHubRococoMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + RococoBulletinMessagesToBridgeHubRococoMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = (); + type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder; +} diff --git a/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_headers_to_rococo_bulletin.rs b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_headers_to_rococo_bulletin.rs new file mode 100644 index 000000000000..8a4b44eec27b --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_headers_to_rococo_bulletin.rs @@ -0,0 +1,81 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Rococo-to-RococoBulletin headers sync entrypoint. + +use super::RococoAsPolkadot; +use crate::cli::bridge::{ + CliBridgeBase, RelayToRelayEquivocationDetectionCliBridge, RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of Rococo -> `RococoBulletin` finalized headers bridge. +#[derive(Clone, Debug)] +pub struct RococoFinalityToRococoBulletin; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + RococoFinalityToRococoBulletin, + SubmitFinalityProofCallBuilder, + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotGrandpa, + relay_polkadot_bulletin_client::BridgePolkadotGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + RococoFinalityToRococoBulletin, + ReportEquivocationCallBuilder, + relay_rococo_client::RuntimeCall::Grandpa, + relay_rococo_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for RococoFinalityToRococoBulletin { + type SourceChain = RococoAsPolkadot; + type TargetChain = relay_polkadot_bulletin_client::PolkadotBulletin; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for RococoFinalityToRococoBulletin { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for RococoFinalityToRococoBulletin { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `Rococo` to BridgeHub `RococoBulletin` bridge definition. +pub struct RococoToRococoBulletinCliBridge {} + +impl CliBridgeBase for RococoToRococoBulletinCliBridge { + type Source = RococoAsPolkadot; + type Target = relay_polkadot_bulletin_client::PolkadotBulletin; +} + +impl RelayToRelayHeadersCliBridge for RococoToRococoBulletinCliBridge { + type Finality = RococoFinalityToRococoBulletin; +} + +impl RelayToRelayEquivocationDetectionCliBridge for RococoToRococoBulletinCliBridge { + type Equivocation = RococoFinalityToRococoBulletin; +} diff --git a/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_parachains_to_rococo_bulletin.rs b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_parachains_to_rococo_bulletin.rs new file mode 100644 index 000000000000..ee44bad523b4 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_bulletin/rococo_parachains_to_rococo_bulletin.rs @@ -0,0 +1,91 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Rococo-to-RococoBulletin parachains sync entrypoint. + +use super::{BridgeHubRococoAsBridgeHubPolkadot, RococoAsPolkadot}; +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}; + +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use bp_runtime::Chain; +use relay_substrate_client::{CallOf, HeaderIdOf}; +use substrate_relay_helper::{ + messages_lane::MessagesRelayLimits, + parachains::{SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline}, +}; + +/// Rococo-to-RococoBulletin parachain sync description. +#[derive(Clone, Debug)] +pub struct RococoToRococoBulletin; + +impl SubstrateParachainsPipeline for RococoToRococoBulletin { + type SourceParachain = BridgeHubRococoAsBridgeHubPolkadot; + type SourceRelayChain = RococoAsPolkadot; + type TargetChain = relay_polkadot_bulletin_client::PolkadotBulletin; + + type SubmitParachainHeadsCallBuilder = RococoToRococoBulletinCallBuilder; +} + +pub struct RococoToRococoBulletinCallBuilder; +impl SubmitParachainHeadsCallBuilder for RococoToRococoBulletinCallBuilder { + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + relay_polkadot_bulletin_client::RuntimeCall::BridgePolkadotParachains( + relay_polkadot_bulletin_client::BridgePolkadotParachainsCall::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + }, + ) + } +} + +/// Rococo-to-RococoBulletin parachain sync description for the CLI. +pub struct RococoToRococoBulletinCliBridge {} + +impl ParachainToRelayHeadersCliBridge for RococoToRococoBulletinCliBridge { + type SourceRelay = RococoAsPolkadot; + type ParachainFinality = RococoToRococoBulletin; + type RelayFinality = + crate::bridges::rococo_bulletin::rococo_headers_to_rococo_bulletin::RococoFinalityToRococoBulletin; +} + +impl CliBridgeBase for RococoToRococoBulletinCliBridge { + type Source = BridgeHubRococoAsBridgeHubPolkadot; + type Target = relay_polkadot_bulletin_client::PolkadotBulletin; +} + +impl MessagesCliBridge for RococoToRococoBulletinCliBridge { + type MessagesLane = + crate::bridges::rococo_bulletin::bridge_hub_rococo_messages_to_rococo_bulletin::BridgeHubRococoMessagesToRococoBulletinMessageLane; + + fn maybe_messages_limits() -> Option { + // Rococo Bulletin chain is missing the `TransactionPayment` runtime API (as well as the + // transaction payment pallet itself), so we can't estimate limits using runtime calls. + // Let's do it here. + // + // Folloiung constants are just safe **underestimations**. Normally, we are able to deliver + // and dispatch thousands of messages in the same transaction. + Some(MessagesRelayLimits { + max_messages_in_single_batch: 128, + max_messages_weight_in_single_batch: + bp_polkadot_bulletin::PolkadotBulletin::max_extrinsic_weight() / 20, + }) + } +} diff --git a/relays/bin-substrate/src/bridges/rococo_westend/bridge_hub_rococo_messages_to_bridge_hub_westend.rs b/relays/bin-substrate/src/bridges/rococo_westend/bridge_hub_rococo_messages_to_bridge_hub_westend.rs new file mode 100644 index 000000000000..353fa7df32a4 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_westend/bridge_hub_rococo_messages_to_bridge_hub_westend.rs @@ -0,0 +1,64 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BridgeHubRococo-to-BridgeHubWestend messages sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_bridge_hub_rococo_client::BridgeHubRococo; +use relay_bridge_hub_westend_client::BridgeHubWestend; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +pub struct BridgeHubRococoToBridgeHubWestendMessagesCliBridge {} + +impl CliBridgeBase for BridgeHubRococoToBridgeHubWestendMessagesCliBridge { + type Source = BridgeHubRococo; + type Target = BridgeHubWestend; +} + +impl MessagesCliBridge for BridgeHubRococoToBridgeHubWestendMessagesCliBridge { + type MessagesLane = BridgeHubRococoMessagesToBridgeHubWestendMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + BridgeHubRococoMessagesToBridgeHubWestendMessageLane, + BridgeHubRococoMessagesToBridgeHubWestendMessageLaneReceiveMessagesProofCallBuilder, + relay_bridge_hub_westend_client::runtime::Call::BridgeRococoMessages, + relay_bridge_hub_westend_client::runtime::BridgeRococoMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + BridgeHubRococoMessagesToBridgeHubWestendMessageLane, + BridgeHubRococoMessagesToBridgeHubWestendMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_bridge_hub_rococo_client::RuntimeCall::BridgeWestendMessages, + relay_bridge_hub_rococo_client::BridgeMessagesCall::receive_messages_delivery_proof +); + +/// Description of BridgeHubRococo -> BridgeHubWestendWestend messages bridge. +#[derive(Clone, Debug)] +pub struct BridgeHubRococoMessagesToBridgeHubWestendMessageLane; + +impl SubstrateMessageLane for BridgeHubRococoMessagesToBridgeHubWestendMessageLane { + type SourceChain = BridgeHubRococo; + type TargetChain = BridgeHubWestend; + + type ReceiveMessagesProofCallBuilder = + BridgeHubRococoMessagesToBridgeHubWestendMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + BridgeHubRococoMessagesToBridgeHubWestendMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder; + type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder; +} diff --git a/relays/bin-substrate/src/bridges/rococo_westend/bridge_hub_westend_messages_to_bridge_hub_rococo.rs b/relays/bin-substrate/src/bridges/rococo_westend/bridge_hub_westend_messages_to_bridge_hub_rococo.rs new file mode 100644 index 000000000000..ceea252db421 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_westend/bridge_hub_westend_messages_to_bridge_hub_rococo.rs @@ -0,0 +1,64 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BridgeHubWestend-to-BridgeHubRococo messages sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge}; +use relay_bridge_hub_rococo_client::BridgeHubRococo; +use relay_bridge_hub_westend_client::BridgeHubWestend; +use substrate_relay_helper::{messages_lane::SubstrateMessageLane, UtilityPalletBatchCallBuilder}; + +pub struct BridgeHubWestendToBridgeHubRococoMessagesCliBridge {} + +impl CliBridgeBase for BridgeHubWestendToBridgeHubRococoMessagesCliBridge { + type Source = BridgeHubWestend; + type Target = BridgeHubRococo; +} + +impl MessagesCliBridge for BridgeHubWestendToBridgeHubRococoMessagesCliBridge { + type MessagesLane = BridgeHubWestendMessagesToBridgeHubRococoMessageLane; +} + +substrate_relay_helper::generate_receive_message_proof_call_builder!( + BridgeHubWestendMessagesToBridgeHubRococoMessageLane, + BridgeHubWestendMessagesToBridgeHubRococoMessageLaneReceiveMessagesProofCallBuilder, + relay_bridge_hub_rococo_client::RuntimeCall::BridgeWestendMessages, + relay_bridge_hub_rococo_client::BridgeMessagesCall::receive_messages_proof +); + +substrate_relay_helper::generate_receive_message_delivery_proof_call_builder!( + BridgeHubWestendMessagesToBridgeHubRococoMessageLane, + BridgeHubWestendMessagesToBridgeHubRococoMessageLaneReceiveMessagesDeliveryProofCallBuilder, + relay_bridge_hub_westend_client::runtime::Call::BridgeRococoMessages, + relay_bridge_hub_westend_client::runtime::BridgeRococoMessagesCall::receive_messages_delivery_proof +); + +/// Description of BridgeHubWestend -> BridgeHubRococo messages bridge. +#[derive(Clone, Debug)] +pub struct BridgeHubWestendMessagesToBridgeHubRococoMessageLane; + +impl SubstrateMessageLane for BridgeHubWestendMessagesToBridgeHubRococoMessageLane { + type SourceChain = BridgeHubWestend; + type TargetChain = BridgeHubRococo; + + type ReceiveMessagesProofCallBuilder = + BridgeHubWestendMessagesToBridgeHubRococoMessageLaneReceiveMessagesProofCallBuilder; + type ReceiveMessagesDeliveryProofCallBuilder = + BridgeHubWestendMessagesToBridgeHubRococoMessageLaneReceiveMessagesDeliveryProofCallBuilder; + + type SourceBatchCallBuilder = UtilityPalletBatchCallBuilder; + type TargetBatchCallBuilder = UtilityPalletBatchCallBuilder; +} diff --git a/relays/bin-substrate/src/bridges/rococo_westend/mod.rs b/relays/bin-substrate/src/bridges/rococo_westend/mod.rs new file mode 100644 index 000000000000..965d3e0561f9 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_westend/mod.rs @@ -0,0 +1,24 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Declaration of all bridges between Rococo Bridge Hub and Westend Bridge Hub. + +pub mod bridge_hub_rococo_messages_to_bridge_hub_westend; +pub mod bridge_hub_westend_messages_to_bridge_hub_rococo; +pub mod rococo_headers_to_bridge_hub_westend; +pub mod rococo_parachains_to_bridge_hub_westend; +pub mod westend_headers_to_bridge_hub_rococo; +pub mod westend_parachains_to_bridge_hub_rococo; diff --git a/relays/bin-substrate/src/bridges/rococo_westend/rococo_headers_to_bridge_hub_westend.rs b/relays/bin-substrate/src/bridges/rococo_westend/rococo_headers_to_bridge_hub_westend.rs new file mode 100644 index 000000000000..24d0b6603157 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_westend/rococo_headers_to_bridge_hub_westend.rs @@ -0,0 +1,80 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Rococo-to-Westend bridge hubs headers sync entrypoint. + +use crate::cli::bridge::{ + CliBridgeBase, RelayToRelayEquivocationDetectionCliBridge, RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of Rococo -> Westend finalized headers bridge. +#[derive(Clone, Debug)] +pub struct RococoFinalityToBridgeHubWestend; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + RococoFinalityToBridgeHubWestend, + SubmitFinalityProofCallBuilder, + relay_bridge_hub_westend_client::runtime::Call::BridgeRococoGrandpa, + relay_bridge_hub_westend_client::runtime::BridgeRococoGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + RococoFinalityToBridgeHubWestend, + ReportEquivocationCallBuilder, + relay_rococo_client::RuntimeCall::Grandpa, + relay_rococo_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for RococoFinalityToBridgeHubWestend { + type SourceChain = relay_rococo_client::Rococo; + type TargetChain = relay_bridge_hub_westend_client::BridgeHubWestend; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for RococoFinalityToBridgeHubWestend { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for RococoFinalityToBridgeHubWestend { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `Rococo` to BridgeHub `Westend` bridge definition. +pub struct RococoToBridgeHubWestendCliBridge {} + +impl CliBridgeBase for RococoToBridgeHubWestendCliBridge { + type Source = relay_rococo_client::Rococo; + type Target = relay_bridge_hub_westend_client::BridgeHubWestend; +} + +impl RelayToRelayHeadersCliBridge for RococoToBridgeHubWestendCliBridge { + type Finality = RococoFinalityToBridgeHubWestend; +} + +impl RelayToRelayEquivocationDetectionCliBridge for RococoToBridgeHubWestendCliBridge { + type Equivocation = RococoFinalityToBridgeHubWestend; +} diff --git a/relays/bin-substrate/src/bridges/rococo_westend/rococo_parachains_to_bridge_hub_westend.rs b/relays/bin-substrate/src/bridges/rococo_westend/rococo_parachains_to_bridge_hub_westend.rs new file mode 100644 index 000000000000..edd600acc4d5 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_westend/rococo_parachains_to_bridge_hub_westend.rs @@ -0,0 +1,75 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Westend-to-Rococo parachains sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use relay_substrate_client::{CallOf, HeaderIdOf}; +use substrate_relay_helper::parachains::{ + SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, +}; + +/// BridgeHub-to-BridgeHub parachain sync description. +#[derive(Clone, Debug)] +pub struct BridgeHubRococoToBridgeHubWestend; + +impl SubstrateParachainsPipeline for BridgeHubRococoToBridgeHubWestend { + type SourceParachain = relay_bridge_hub_rococo_client::BridgeHubRococo; + type SourceRelayChain = relay_rococo_client::Rococo; + type TargetChain = relay_bridge_hub_westend_client::BridgeHubWestend; + + type SubmitParachainHeadsCallBuilder = BridgeHubRococoToBridgeHubWestendCallBuilder; +} + +pub struct BridgeHubRococoToBridgeHubWestendCallBuilder; +impl SubmitParachainHeadsCallBuilder + for BridgeHubRococoToBridgeHubWestendCallBuilder +{ + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + relay_bridge_hub_westend_client::runtime::Call::BridgeRococoParachains( + relay_bridge_hub_westend_client::runtime::BridgeParachainCall::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + }, + ) + } +} + +/// `BridgeHubParachain` to `BridgeHubParachain` bridge definition. +pub struct BridgeHubRococoToBridgeHubWestendCliBridge {} + +impl ParachainToRelayHeadersCliBridge for BridgeHubRococoToBridgeHubWestendCliBridge { + type SourceRelay = relay_rococo_client::Rococo; + type ParachainFinality = BridgeHubRococoToBridgeHubWestend; + type RelayFinality = + crate::bridges::rococo_westend::rococo_headers_to_bridge_hub_westend::RococoFinalityToBridgeHubWestend; +} + +impl CliBridgeBase for BridgeHubRococoToBridgeHubWestendCliBridge { + type Source = relay_bridge_hub_rococo_client::BridgeHubRococo; + type Target = relay_bridge_hub_westend_client::BridgeHubWestend; +} + +impl MessagesCliBridge for BridgeHubRococoToBridgeHubWestendCliBridge { + type MessagesLane = + crate::bridges::rococo_westend::bridge_hub_rococo_messages_to_bridge_hub_westend::BridgeHubRococoMessagesToBridgeHubWestendMessageLane; +} diff --git a/relays/bin-substrate/src/bridges/rococo_westend/westend_headers_to_bridge_hub_rococo.rs b/relays/bin-substrate/src/bridges/rococo_westend/westend_headers_to_bridge_hub_rococo.rs new file mode 100644 index 000000000000..451089b2ce00 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_westend/westend_headers_to_bridge_hub_rococo.rs @@ -0,0 +1,80 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Westend-to-Rococo bridge hubs headers sync entrypoint. + +use crate::cli::bridge::{ + CliBridgeBase, RelayToRelayEquivocationDetectionCliBridge, RelayToRelayHeadersCliBridge, +}; + +use async_trait::async_trait; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + finality_base::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalityPipeline}, +}; + +/// Description of Westend -> Rococo finalized headers bridge. +#[derive(Clone, Debug)] +pub struct WestendFinalityToBridgeHubRococo; + +substrate_relay_helper::generate_submit_finality_proof_call_builder!( + WestendFinalityToBridgeHubRococo, + SubmitFinalityProofCallBuilder, + relay_bridge_hub_rococo_client::RuntimeCall::BridgeWestendGrandpa, + relay_bridge_hub_rococo_client::BridgeGrandpaCall::submit_finality_proof +); + +substrate_relay_helper::generate_report_equivocation_call_builder!( + WestendFinalityToBridgeHubRococo, + ReportEquivocationCallBuilder, + relay_westend_client::RuntimeCall::Grandpa, + relay_westend_client::GrandpaCall::report_equivocation +); + +#[async_trait] +impl SubstrateFinalityPipeline for WestendFinalityToBridgeHubRococo { + type SourceChain = relay_westend_client::Westend; + type TargetChain = relay_bridge_hub_rococo_client::BridgeHubRococo; + + type FinalityEngine = GrandpaFinalityEngine; +} + +#[async_trait] +impl SubstrateFinalitySyncPipeline for WestendFinalityToBridgeHubRococo { + type SubmitFinalityProofCallBuilder = SubmitFinalityProofCallBuilder; +} + +#[async_trait] +impl SubstrateEquivocationDetectionPipeline for WestendFinalityToBridgeHubRococo { + type ReportEquivocationCallBuilder = ReportEquivocationCallBuilder; +} + +/// `Westend` to BridgeHub `Rococo` bridge definition. +pub struct WestendToBridgeHubRococoCliBridge {} + +impl CliBridgeBase for WestendToBridgeHubRococoCliBridge { + type Source = relay_westend_client::Westend; + type Target = relay_bridge_hub_rococo_client::BridgeHubRococo; +} + +impl RelayToRelayHeadersCliBridge for WestendToBridgeHubRococoCliBridge { + type Finality = WestendFinalityToBridgeHubRococo; +} + +impl RelayToRelayEquivocationDetectionCliBridge for WestendToBridgeHubRococoCliBridge { + type Equivocation = WestendFinalityToBridgeHubRococo; +} diff --git a/relays/bin-substrate/src/bridges/rococo_westend/westend_parachains_to_bridge_hub_rococo.rs b/relays/bin-substrate/src/bridges/rococo_westend/westend_parachains_to_bridge_hub_rococo.rs new file mode 100644 index 000000000000..dac915dc3ba9 --- /dev/null +++ b/relays/bin-substrate/src/bridges/rococo_westend/westend_parachains_to_bridge_hub_rococo.rs @@ -0,0 +1,75 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Rococo-to-Westend parachains sync entrypoint. + +use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use relay_substrate_client::{CallOf, HeaderIdOf}; +use substrate_relay_helper::parachains::{ + SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, +}; + +/// BridgeHub-to-BridgeHub parachain sync description. +#[derive(Clone, Debug)] +pub struct BridgeHubWestendToBridgeHubRococo; + +impl SubstrateParachainsPipeline for BridgeHubWestendToBridgeHubRococo { + type SourceParachain = relay_bridge_hub_westend_client::BridgeHubWestend; + type SourceRelayChain = relay_westend_client::Westend; + type TargetChain = relay_bridge_hub_rococo_client::BridgeHubRococo; + + type SubmitParachainHeadsCallBuilder = BridgeHubWestendToBridgeHubRococoCallBuilder; +} + +pub struct BridgeHubWestendToBridgeHubRococoCallBuilder; +impl SubmitParachainHeadsCallBuilder + for BridgeHubWestendToBridgeHubRococoCallBuilder +{ + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + relay_bridge_hub_rococo_client::RuntimeCall::BridgeWestendParachains( + relay_bridge_hub_rococo_client::BridgeParachainCall::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + }, + ) + } +} + +/// `BridgeHubParachain` to `BridgeHubParachain` bridge definition. +pub struct BridgeHubWestendToBridgeHubRococoCliBridge {} + +impl ParachainToRelayHeadersCliBridge for BridgeHubWestendToBridgeHubRococoCliBridge { + type SourceRelay = relay_westend_client::Westend; + type ParachainFinality = BridgeHubWestendToBridgeHubRococo; + type RelayFinality = + crate::bridges::rococo_westend::westend_headers_to_bridge_hub_rococo::WestendFinalityToBridgeHubRococo; +} + +impl CliBridgeBase for BridgeHubWestendToBridgeHubRococoCliBridge { + type Source = relay_bridge_hub_westend_client::BridgeHubWestend; + type Target = relay_bridge_hub_rococo_client::BridgeHubRococo; +} + +impl MessagesCliBridge for BridgeHubWestendToBridgeHubRococoCliBridge { + type MessagesLane = + crate::bridges::rococo_westend::bridge_hub_westend_messages_to_bridge_hub_rococo::BridgeHubWestendMessagesToBridgeHubRococoMessageLane; +} diff --git a/relays/bin-substrate/src/chains/kusama.rs b/relays/bin-substrate/src/chains/kusama.rs new file mode 100644 index 000000000000..0a30a0c07a09 --- /dev/null +++ b/relays/bin-substrate/src/chains/kusama.rs @@ -0,0 +1,31 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Kusama + Kusama parachains specification for CLI. + +use crate::cli::CliChain; +use relay_bridge_hub_kusama_client::BridgeHubKusama; +use relay_kusama_client::Kusama; +use relay_substrate_client::SimpleRuntimeVersion; + +impl CliChain for Kusama { + const RUNTIME_VERSION: Option = None; +} + +impl CliChain for BridgeHubKusama { + const RUNTIME_VERSION: Option = + Some(SimpleRuntimeVersion { spec_version: 9410, transaction_version: 21 }); +} diff --git a/relays/bin-substrate/src/chains/mod.rs b/relays/bin-substrate/src/chains/mod.rs new file mode 100644 index 000000000000..ab15a9e679cd --- /dev/null +++ b/relays/bin-substrate/src/chains/mod.rs @@ -0,0 +1,23 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Chain-specific relayer configuration. + +mod kusama; +mod polkadot; +mod polkadot_bulletin; +mod rococo; +mod westend; diff --git a/relays/bin-substrate/src/chains/polkadot.rs b/relays/bin-substrate/src/chains/polkadot.rs new file mode 100644 index 000000000000..b2585dbb3050 --- /dev/null +++ b/relays/bin-substrate/src/chains/polkadot.rs @@ -0,0 +1,31 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Polkadot + Polkadot parachains specification for CLI. + +use crate::cli::CliChain; +use relay_bridge_hub_polkadot_client::BridgeHubPolkadot; +use relay_polkadot_client::Polkadot; +use relay_substrate_client::SimpleRuntimeVersion; + +impl CliChain for Polkadot { + const RUNTIME_VERSION: Option = None; +} + +impl CliChain for BridgeHubPolkadot { + const RUNTIME_VERSION: Option = + Some(SimpleRuntimeVersion { spec_version: 9410, transaction_version: 22 }); +} diff --git a/relays/bin-substrate/src/chains/polkadot_bulletin.rs b/relays/bin-substrate/src/chains/polkadot_bulletin.rs new file mode 100644 index 000000000000..ee7edbd9f423 --- /dev/null +++ b/relays/bin-substrate/src/chains/polkadot_bulletin.rs @@ -0,0 +1,26 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Polkadot + Polkadot parachains specification for CLI. + +use crate::cli::CliChain; +use relay_polkadot_bulletin_client::PolkadotBulletin; +use relay_substrate_client::SimpleRuntimeVersion; + +impl CliChain for PolkadotBulletin { + const RUNTIME_VERSION: Option = + Some(SimpleRuntimeVersion { spec_version: 100, transaction_version: 1 }); +} diff --git a/relays/bin-substrate/src/chains/rococo.rs b/relays/bin-substrate/src/chains/rococo.rs new file mode 100644 index 000000000000..fa376f096747 --- /dev/null +++ b/relays/bin-substrate/src/chains/rococo.rs @@ -0,0 +1,31 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Rococo + Rococo parachains specification for CLI. + +use crate::cli::CliChain; +use relay_bridge_hub_rococo_client::BridgeHubRococo; +use relay_rococo_client::Rococo; +use relay_substrate_client::SimpleRuntimeVersion; + +impl CliChain for Rococo { + const RUNTIME_VERSION: Option = None; +} + +impl CliChain for BridgeHubRococo { + const RUNTIME_VERSION: Option = + Some(SimpleRuntimeVersion { spec_version: 1_003_000, transaction_version: 3 }); +} diff --git a/relays/bin-substrate/src/chains/westend.rs b/relays/bin-substrate/src/chains/westend.rs new file mode 100644 index 000000000000..be26a36627ad --- /dev/null +++ b/relays/bin-substrate/src/chains/westend.rs @@ -0,0 +1,31 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Westend chain specification for CLI. + +use crate::cli::CliChain; +use relay_bridge_hub_westend_client::BridgeHubWestend; +use relay_substrate_client::SimpleRuntimeVersion; +use relay_westend_client::Westend; + +impl CliChain for Westend { + const RUNTIME_VERSION: Option = None; +} + +impl CliChain for BridgeHubWestend { + const RUNTIME_VERSION: Option = + Some(SimpleRuntimeVersion { spec_version: 1_003_000, transaction_version: 3 }); +} diff --git a/relays/bin-substrate/src/cli/bridge.rs b/relays/bin-substrate/src/cli/bridge.rs new file mode 100644 index 000000000000..6073d9e3155b --- /dev/null +++ b/relays/bin-substrate/src/cli/bridge.rs @@ -0,0 +1,121 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::cli::CliChain; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use relay_substrate_client::{Chain, ChainWithTransactions, Parachain, RelayChain}; +use strum::{EnumString, EnumVariantNames}; +use substrate_relay_helper::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + messages_lane::{MessagesRelayLimits, SubstrateMessageLane}, + parachains::SubstrateParachainsPipeline, +}; + +#[derive(Debug, PartialEq, Eq, EnumString, EnumVariantNames)] +#[strum(serialize_all = "kebab_case")] +/// Supported full bridges (headers + messages). +pub enum FullBridge { + BridgeHubRococoToBridgeHubWestend, + BridgeHubWestendToBridgeHubRococo, + BridgeHubKusamaToBridgeHubPolkadot, + BridgeHubPolkadotToBridgeHubKusama, + PolkadotBulletinToBridgeHubPolkadot, + BridgeHubPolkadotToPolkadotBulletin, + RococoBulletinToBridgeHubRococo, + BridgeHubRococoToRococoBulletin, +} + +/// Minimal bridge representation that can be used from the CLI. +/// It connects a source chain to a target chain. +pub trait CliBridgeBase: Sized { + /// The source chain. + type Source: Chain + CliChain; + /// The target chain. + type Target: ChainWithTransactions + CliChain; +} + +/// Bridge representation that can be used from the CLI for relaying headers +/// from a relay chain to a relay chain. +pub trait RelayToRelayHeadersCliBridge: CliBridgeBase { + /// Finality proofs synchronization pipeline. + type Finality: SubstrateFinalitySyncPipeline< + SourceChain = Self::Source, + TargetChain = Self::Target, + >; +} + +/// Convenience trait that adds bounds to `CliBridgeBase`. +pub trait RelayToRelayEquivocationDetectionCliBridgeBase: CliBridgeBase { + type BoundedSource: ChainWithTransactions; +} + +impl RelayToRelayEquivocationDetectionCliBridgeBase for T +where + T: CliBridgeBase, + T::Source: ChainWithTransactions, +{ + type BoundedSource = T::Source; +} + +/// Bridge representation that can be used from the CLI for detecting equivocations +/// in the headers synchronized from a relay chain to a relay chain. +pub trait RelayToRelayEquivocationDetectionCliBridge: + RelayToRelayEquivocationDetectionCliBridgeBase +{ + /// Equivocation detection pipeline. + type Equivocation: SubstrateEquivocationDetectionPipeline< + SourceChain = Self::Source, + TargetChain = Self::Target, + >; +} + +/// Bridge representation that can be used from the CLI for relaying headers +/// from a parachain to a relay chain. +pub trait ParachainToRelayHeadersCliBridge: CliBridgeBase +where + Self::Source: Parachain, +{ + // The `CliBridgeBase` type represents the parachain in this situation. + // We need to add an extra type for the relay chain. + type SourceRelay: Chain + + CliChain + + RelayChain; + /// Finality proofs synchronization pipeline (source parachain -> target). + type ParachainFinality: SubstrateParachainsPipeline< + SourceRelayChain = Self::SourceRelay, + SourceParachain = Self::Source, + TargetChain = Self::Target, + >; + /// Finality proofs synchronization pipeline (source relay chain -> target). + type RelayFinality: SubstrateFinalitySyncPipeline< + SourceChain = Self::SourceRelay, + TargetChain = Self::Target, + >; +} + +/// Bridge representation that can be used from the CLI for relaying messages. +pub trait MessagesCliBridge: CliBridgeBase { + /// The Source -> Destination messages synchronization pipeline. + type MessagesLane: SubstrateMessageLane; + + /// Optional messages delivery transaction limits that the messages relay is going + /// to use. If it returns `None`, limits are estimated using `TransactionPayment` API + /// at the target chain. + fn maybe_messages_limits() -> Option { + None + } +} diff --git a/relays/bin-substrate/src/cli/chain_schema.rs b/relays/bin-substrate/src/cli/chain_schema.rs new file mode 100644 index 000000000000..5c2161acdbd7 --- /dev/null +++ b/relays/bin-substrate/src/cli/chain_schema.rs @@ -0,0 +1,344 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License + +// along with Parity Bridges Common. If not, see . + +use relay_substrate_client::{AccountKeyPairOf, ChainWithTransactions}; +use structopt::StructOpt; +use strum::{EnumString, EnumVariantNames}; + +use crate::cli::CliChain; +pub use relay_substrate_client::{ChainRuntimeVersion, SimpleRuntimeVersion}; +use substrate_relay_helper::TransactionParams; + +#[doc = "Runtime version params."] +#[derive(StructOpt, Debug, PartialEq, Eq, Clone, Copy, EnumString, EnumVariantNames)] +pub enum RuntimeVersionType { + /// Auto query version from chain + Auto, + /// Custom `spec_version` and `transaction_version` + Custom, + /// Read version from bundle dependencies directly. + Bundle, +} + +/// Create chain-specific set of runtime version parameters. +#[macro_export] +macro_rules! declare_chain_runtime_version_params_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + bp_runtime::paste::item! { + #[doc = $chain " runtime version params."] + #[derive(StructOpt, Debug, PartialEq, Eq, Clone, Copy)] + pub struct [<$chain RuntimeVersionParams>] { + #[doc = "The type of runtime version for chain " $chain] + #[structopt(long, default_value = "Bundle")] + pub [<$chain_prefix _version_mode>]: RuntimeVersionType, + #[doc = "The custom sepc_version for chain " $chain] + #[structopt(long)] + pub [<$chain_prefix _spec_version>]: Option, + #[doc = "The custom transaction_version for chain " $chain] + #[structopt(long)] + pub [<$chain_prefix _transaction_version>]: Option, + } + + impl [<$chain RuntimeVersionParams>] { + /// Converts self into `ChainRuntimeVersion`. + pub fn into_runtime_version( + self, + bundle_runtime_version: Option, + ) -> anyhow::Result { + Ok(match self.[<$chain_prefix _version_mode>] { + RuntimeVersionType::Auto => ChainRuntimeVersion::Auto, + RuntimeVersionType::Custom => { + let custom_spec_version = self.[<$chain_prefix _spec_version>] + .ok_or_else(|| anyhow::Error::msg(format!("The {}-spec-version is required when choose custom mode", stringify!($chain_prefix))))?; + let custom_transaction_version = self.[<$chain_prefix _transaction_version>] + .ok_or_else(|| anyhow::Error::msg(format!("The {}-transaction-version is required when choose custom mode", stringify!($chain_prefix))))?; + ChainRuntimeVersion::Custom( + SimpleRuntimeVersion { + spec_version: custom_spec_version, + transaction_version: custom_transaction_version + } + ) + }, + RuntimeVersionType::Bundle => match bundle_runtime_version { + Some(runtime_version) => ChainRuntimeVersion::Custom(runtime_version), + None => ChainRuntimeVersion::Auto + }, + }) + } + } + } + }; +} + +/// Create chain-specific set of runtime version parameters. +#[macro_export] +macro_rules! declare_chain_connection_params_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + bp_runtime::paste::item! { + #[doc = $chain " connection params."] + #[derive(StructOpt, Debug, PartialEq, Eq, Clone)] + pub struct [<$chain ConnectionParams>] { + #[doc = "Connect to " $chain " node at given host."] + #[structopt(long, default_value = "127.0.0.1")] + pub [<$chain_prefix _host>]: String, + #[doc = "Connect to " $chain " node websocket server at given port."] + #[structopt(long, default_value = "9944")] + pub [<$chain_prefix _port>]: u16, + #[doc = "Use secure websocket connection."] + #[structopt(long)] + pub [<$chain_prefix _secure>]: bool, + #[doc = "Custom runtime version"] + #[structopt(flatten)] + pub [<$chain_prefix _runtime_version>]: [<$chain RuntimeVersionParams>], + } + + impl [<$chain ConnectionParams>] { + /// Convert connection params into Substrate client. + #[allow(dead_code)] + pub async fn into_client( + self, + ) -> anyhow::Result> { + let chain_runtime_version = self + .[<$chain_prefix _runtime_version>] + .into_runtime_version(Chain::RUNTIME_VERSION)?; + Ok(relay_substrate_client::Client::new(relay_substrate_client::ConnectionParams { + host: self.[<$chain_prefix _host>], + port: self.[<$chain_prefix _port>], + secure: self.[<$chain_prefix _secure>], + chain_runtime_version, + }) + .await + ) + } + } + } + }; +} + +/// Create chain-specific set of signing parameters. +#[macro_export] +macro_rules! declare_chain_signing_params_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + bp_runtime::paste::item! { + #[doc = $chain " signing params."] + #[derive(StructOpt, Debug, PartialEq, Eq, Clone)] + pub struct [<$chain SigningParams>] { + #[doc = "The SURI of secret key to use when transactions are submitted to the " $chain " node."] + #[structopt(long)] + pub [<$chain_prefix _signer>]: Option, + #[doc = "The password for the SURI of secret key to use when transactions are submitted to the " $chain " node."] + #[structopt(long)] + pub [<$chain_prefix _signer_password>]: Option, + + #[doc = "Path to the file, that contains SURI of secret key to use when transactions are submitted to the " $chain " node. Can be overridden with " $chain_prefix "_signer option."] + #[structopt(long)] + pub [<$chain_prefix _signer_file>]: Option, + #[doc = "Path to the file, that password for the SURI of secret key to use when transactions are submitted to the " $chain " node. Can be overridden with " $chain_prefix "_signer_password option."] + #[structopt(long)] + pub [<$chain_prefix _signer_password_file>]: Option, + + #[doc = "Transactions mortality period, in blocks. MUST be a power of two in [4; 65536] range. MAY NOT be larger than `BlockHashCount` parameter of the chain system module."] + #[structopt(long)] + pub [<$chain_prefix _transactions_mortality>]: Option, + } + + impl [<$chain SigningParams>] { + /// Return transactions mortality. + #[allow(dead_code)] + pub fn transactions_mortality(&self) -> anyhow::Result> { + self.[<$chain_prefix _transactions_mortality>] + .map(|transactions_mortality| { + if !(4..=65536).contains(&transactions_mortality) + || !transactions_mortality.is_power_of_two() + { + Err(anyhow::format_err!( + "Transactions mortality {} is not a power of two in a [4; 65536] range", + transactions_mortality, + )) + } else { + Ok(transactions_mortality) + } + }) + .transpose() + } + + /// Parse signing params into chain-specific KeyPair. + #[allow(dead_code)] + pub fn to_keypair(&self) -> anyhow::Result> { + let suri = match (self.[<$chain_prefix _signer>].as_ref(), self.[<$chain_prefix _signer_file>].as_ref()) { + (Some(suri), _) => suri.to_owned(), + (None, Some(suri_file)) => std::fs::read_to_string(suri_file) + .map_err(|err| anyhow::format_err!( + "Failed to read SURI from file {:?}: {}", + suri_file, + err, + ))?, + (None, None) => return Err(anyhow::format_err!( + "One of options must be specified: '{}' or '{}'", + stringify!([<$chain_prefix _signer>]), + stringify!([<$chain_prefix _signer_file>]), + )), + }; + + let suri_password = match ( + self.[<$chain_prefix _signer_password>].as_ref(), + self.[<$chain_prefix _signer_password_file>].as_ref(), + ) { + (Some(suri_password), _) => Some(suri_password.to_owned()), + (None, Some(suri_password_file)) => std::fs::read_to_string(suri_password_file) + .map(Some) + .map_err(|err| anyhow::format_err!( + "Failed to read SURI password from file {:?}: {}", + suri_password_file, + err, + ))?, + _ => None, + }; + + use sp_core::crypto::Pair; + + AccountKeyPairOf::::from_string( + &suri, + suri_password.as_deref() + ).map_err(|e| anyhow::format_err!("{:?}", e)) + } + + /// Return transaction parameters. + #[allow(dead_code)] + pub fn transaction_params( + &self, + ) -> anyhow::Result>> { + Ok(TransactionParams { + mortality: self.transactions_mortality()?, + signer: self.to_keypair::()?, + }) + } + } + } + }; +} + +/// Create chain-specific set of configuration objects: connection parameters, +/// signing parameters and bridge initialization parameters. +#[macro_export] +macro_rules! declare_chain_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + $crate::declare_chain_runtime_version_params_cli_schema!($chain, $chain_prefix); + $crate::declare_chain_connection_params_cli_schema!($chain, $chain_prefix); + $crate::declare_chain_signing_params_cli_schema!($chain, $chain_prefix); + }; +} + +declare_chain_cli_schema!(Source, source); +declare_chain_cli_schema!(Target, target); +declare_chain_cli_schema!(Relaychain, relaychain); +declare_chain_cli_schema!(Parachain, parachain); + +#[cfg(test)] +mod tests { + use super::*; + use sp_core::Pair; + + #[test] + fn reads_suri_from_file() { + const ALICE: &str = "//Alice"; + const BOB: &str = "//Bob"; + const ALICE_PASSWORD: &str = "alice_password"; + const BOB_PASSWORD: &str = "bob_password"; + + let alice: sp_core::sr25519::Pair = Pair::from_string(ALICE, Some(ALICE_PASSWORD)).unwrap(); + let bob: sp_core::sr25519::Pair = Pair::from_string(BOB, Some(BOB_PASSWORD)).unwrap(); + let bob_with_alice_password = + sp_core::sr25519::Pair::from_string(BOB, Some(ALICE_PASSWORD)).unwrap(); + + let temp_dir = tempfile::tempdir().unwrap(); + let mut suri_file_path = temp_dir.path().to_path_buf(); + let mut password_file_path = temp_dir.path().to_path_buf(); + suri_file_path.push("suri"); + password_file_path.push("password"); + std::fs::write(&suri_file_path, BOB.as_bytes()).unwrap(); + std::fs::write(&password_file_path, BOB_PASSWORD.as_bytes()).unwrap(); + + // when both seed and password are read from file + assert_eq!( + TargetSigningParams { + target_signer: Some(ALICE.into()), + target_signer_password: Some(ALICE_PASSWORD.into()), + + target_signer_file: None, + target_signer_password_file: None, + + target_transactions_mortality: None, + } + .to_keypair::() + .map(|p| p.public()) + .map_err(drop), + Ok(alice.public()), + ); + + // when both seed and password are read from file + assert_eq!( + TargetSigningParams { + target_signer: None, + target_signer_password: None, + + target_signer_file: Some(suri_file_path.clone()), + target_signer_password_file: Some(password_file_path.clone()), + + target_transactions_mortality: None, + } + .to_keypair::() + .map(|p| p.public()) + .map_err(drop), + Ok(bob.public()), + ); + + // when password are is overriden by cli option + assert_eq!( + TargetSigningParams { + target_signer: None, + target_signer_password: Some(ALICE_PASSWORD.into()), + + target_signer_file: Some(suri_file_path.clone()), + target_signer_password_file: Some(password_file_path.clone()), + + target_transactions_mortality: None, + } + .to_keypair::() + .map(|p| p.public()) + .map_err(drop), + Ok(bob_with_alice_password.public()), + ); + + // when both seed and password are overriden by cli options + assert_eq!( + TargetSigningParams { + target_signer: Some(ALICE.into()), + target_signer_password: Some(ALICE_PASSWORD.into()), + + target_signer_file: Some(suri_file_path), + target_signer_password_file: Some(password_file_path), + + target_transactions_mortality: None, + } + .to_keypair::() + .map(|p| p.public()) + .map_err(drop), + Ok(alice.public()), + ); + } +} diff --git a/relays/bin-substrate/src/cli/detect_equivocations.rs b/relays/bin-substrate/src/cli/detect_equivocations.rs new file mode 100644 index 000000000000..970089453bd5 --- /dev/null +++ b/relays/bin-substrate/src/cli/detect_equivocations.rs @@ -0,0 +1,105 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + bridges::{ + kusama_polkadot::{ + kusama_headers_to_bridge_hub_polkadot::KusamaToBridgeHubPolkadotCliBridge, + polkadot_headers_to_bridge_hub_kusama::PolkadotToBridgeHubKusamaCliBridge, + }, + rococo_westend::{ + rococo_headers_to_bridge_hub_westend::RococoToBridgeHubWestendCliBridge, + westend_headers_to_bridge_hub_rococo::WestendToBridgeHubRococoCliBridge, + }, + }, + cli::{bridge::*, chain_schema::*, PrometheusParams}, +}; + +use async_trait::async_trait; +use relay_substrate_client::ChainWithTransactions; +use structopt::StructOpt; +use strum::{EnumString, EnumVariantNames, VariantNames}; +use substrate_relay_helper::{equivocation, equivocation::SubstrateEquivocationDetectionPipeline}; + +/// Start equivocation detection loop. +#[derive(StructOpt)] +pub struct DetectEquivocations { + #[structopt(possible_values = DetectEquivocationsBridge::VARIANTS, case_insensitive = true)] + bridge: DetectEquivocationsBridge, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + source_sign: SourceSigningParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +#[derive(Debug, EnumString, EnumVariantNames)] +#[strum(serialize_all = "kebab_case")] +/// Equivocations detection bridge. +pub enum DetectEquivocationsBridge { + KusamaToBridgeHubPolkadot, + PolkadotToBridgeHubKusama, + RococoToBridgeHubWestend, + WestendToBridgeHubRococo, +} + +#[async_trait] +trait EquivocationsDetector: RelayToRelayEquivocationDetectionCliBridge +where + Self::Source: ChainWithTransactions, +{ + async fn start(data: DetectEquivocations) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + Self::Equivocation::start_relay_guards( + &source_client, + source_client.can_start_version_guard(), + ) + .await?; + + equivocation::run::( + source_client, + data.target.into_client::().await?, + data.source_sign.transaction_params::()?, + data.prometheus_params.into_metrics_params()?, + ) + .await + } +} + +impl EquivocationsDetector for KusamaToBridgeHubPolkadotCliBridge {} +impl EquivocationsDetector for PolkadotToBridgeHubKusamaCliBridge {} +impl EquivocationsDetector for RococoToBridgeHubWestendCliBridge {} +impl EquivocationsDetector for WestendToBridgeHubRococoCliBridge {} + +impl DetectEquivocations { + /// Run the command. + pub async fn run(self) -> anyhow::Result<()> { + match self.bridge { + DetectEquivocationsBridge::KusamaToBridgeHubPolkadot => + KusamaToBridgeHubPolkadotCliBridge::start(self), + DetectEquivocationsBridge::PolkadotToBridgeHubKusama => + PolkadotToBridgeHubKusamaCliBridge::start(self), + DetectEquivocationsBridge::RococoToBridgeHubWestend => + RococoToBridgeHubWestendCliBridge::start(self), + DetectEquivocationsBridge::WestendToBridgeHubRococo => + WestendToBridgeHubRococoCliBridge::start(self), + } + .await + } +} diff --git a/relays/bin-substrate/src/cli/init_bridge.rs b/relays/bin-substrate/src/cli/init_bridge.rs new file mode 100644 index 000000000000..8be74e5f9b53 --- /dev/null +++ b/relays/bin-substrate/src/cli/init_bridge.rs @@ -0,0 +1,256 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use async_trait::async_trait; +use codec::Encode; + +use crate::{ + bridges::{ + kusama_polkadot::{ + kusama_headers_to_bridge_hub_polkadot::KusamaToBridgeHubPolkadotCliBridge, + polkadot_headers_to_bridge_hub_kusama::PolkadotToBridgeHubKusamaCliBridge, + }, + polkadot_bulletin::{ + polkadot_bulletin_headers_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotCliBridge, + polkadot_headers_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge, + }, + rococo_bulletin::{ + rococo_bulletin_headers_to_bridge_hub_rococo::RococoBulletinToBridgeHubRococoCliBridge, + rococo_headers_to_rococo_bulletin::RococoToRococoBulletinCliBridge, + }, + rococo_westend::{ + rococo_headers_to_bridge_hub_westend::RococoToBridgeHubWestendCliBridge, + westend_headers_to_bridge_hub_rococo::WestendToBridgeHubRococoCliBridge, + }, + }, + cli::{bridge::CliBridgeBase, chain_schema::*}, +}; +use bp_runtime::Chain as ChainBase; +use relay_substrate_client::{AccountKeyPairOf, Chain, UnsignedTransaction}; +use sp_core::Pair; +use structopt::StructOpt; +use strum::{EnumString, EnumVariantNames, VariantNames}; +use substrate_relay_helper::finality_base::engine::{Engine, Grandpa as GrandpaFinalityEngine}; + +/// Initialize bridge pallet. +#[derive(StructOpt)] +pub struct InitBridge { + /// A bridge instance to initialize. + #[structopt(possible_values = InitBridgeName::VARIANTS, case_insensitive = true)] + bridge: InitBridgeName, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + /// Generates all required data, but does not submit extrinsic + #[structopt(long)] + dry_run: bool, +} + +#[derive(Debug, EnumString, EnumVariantNames)] +#[strum(serialize_all = "kebab_case")] +/// Bridge to initialize. +pub enum InitBridgeName { + KusamaToBridgeHubPolkadot, + PolkadotToBridgeHubKusama, + PolkadotToPolkadotBulletin, + PolkadotBulletinToBridgeHubPolkadot, + RococoToRococoBulletin, + RococoBulletinToBridgeHubRococo, + RococoToBridgeHubWestend, + WestendToBridgeHubRococo, +} + +#[async_trait] +trait BridgeInitializer: CliBridgeBase +where + ::AccountId: From< as Pair>::Public>, +{ + type Engine: Engine; + + /// Get the encoded call to init the bridge. + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call; + + /// Initialize the bridge. + async fn init_bridge(data: InitBridge) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let target_client = data.target.into_client::().await?; + let target_sign = data.target_sign.to_keypair::()?; + let dry_run = data.dry_run; + + substrate_relay_helper::finality::initialize::initialize::( + source_client, + target_client.clone(), + target_sign, + move |transaction_nonce, initialization_data| { + let call = Self::encode_init_bridge(initialization_data); + log::info!( + target: "bridge", + "Initialize bridge call encoded as hex string: {:?}", + format!("0x{}", hex::encode(call.encode())) + ); + Ok(UnsignedTransaction::new(call.into(), transaction_nonce)) + }, + dry_run, + ) + .await; + + Ok(()) + } +} + +impl BridgeInitializer for RococoToBridgeHubWestendCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + relay_bridge_hub_westend_client::runtime::Call::BridgeRococoGrandpa( + relay_bridge_hub_westend_client::runtime::BridgeRococoGrandpaCall::initialize { + init_data, + }, + ) + } +} + +impl BridgeInitializer for WestendToBridgeHubRococoCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + relay_bridge_hub_rococo_client::RuntimeCall::BridgeWestendGrandpa( + relay_bridge_hub_rococo_client::BridgeGrandpaCall::initialize { init_data }, + ) + } +} + +impl BridgeInitializer for KusamaToBridgeHubPolkadotCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + relay_bridge_hub_polkadot_client::runtime::Call::BridgeKusamaGrandpa( + relay_bridge_hub_polkadot_client::runtime::BridgeKusamaGrandpaCall::initialize { + init_data, + }, + ) + } +} + +impl BridgeInitializer for PolkadotToBridgeHubKusamaCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + relay_bridge_hub_kusama_client::runtime::Call::BridgePolkadotGrandpa( + relay_bridge_hub_kusama_client::runtime::BridgePolkadotGrandpaCall::initialize { + init_data, + }, + ) + } +} + +impl BridgeInitializer for PolkadotToPolkadotBulletinCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + type RuntimeCall = relay_polkadot_bulletin_client::RuntimeCall; + type BridgePolkadotGrandpaCall = relay_polkadot_bulletin_client::BridgePolkadotGrandpaCall; + type SudoCall = relay_polkadot_bulletin_client::SudoCall; + + let initialize_call = + RuntimeCall::BridgePolkadotGrandpa(BridgePolkadotGrandpaCall::initialize { init_data }); + + RuntimeCall::Sudo(SudoCall::sudo { call: Box::new(initialize_call) }) + } +} + +impl BridgeInitializer for PolkadotBulletinToBridgeHubPolkadotCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + relay_bridge_hub_polkadot_client::runtime::Call::BridgePolkadotBulletinGrandpa( + relay_bridge_hub_polkadot_client::runtime::BridgePolkadotBulletinGrandpaCall::initialize { + init_data, + }, + ) + } +} + +impl BridgeInitializer for RococoToRococoBulletinCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + type RuntimeCall = relay_polkadot_bulletin_client::RuntimeCall; + type BridgePolkadotGrandpaCall = relay_polkadot_bulletin_client::BridgePolkadotGrandpaCall; + type SudoCall = relay_polkadot_bulletin_client::SudoCall; + + let initialize_call = + RuntimeCall::BridgePolkadotGrandpa(BridgePolkadotGrandpaCall::initialize { init_data }); + + RuntimeCall::Sudo(SudoCall::sudo { call: Box::new(initialize_call) }) + } +} + +impl BridgeInitializer for RococoBulletinToBridgeHubRococoCliBridge { + type Engine = GrandpaFinalityEngine; + + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call { + relay_bridge_hub_rococo_client::RuntimeCall::BridgePolkadotBulletinGrandpa( + relay_bridge_hub_rococo_client::BridgeBulletinGrandpaCall::initialize { init_data }, + ) + } +} + +impl InitBridge { + /// Run the command. + pub async fn run(self) -> anyhow::Result<()> { + match self.bridge { + InitBridgeName::KusamaToBridgeHubPolkadot => + KusamaToBridgeHubPolkadotCliBridge::init_bridge(self), + InitBridgeName::PolkadotToBridgeHubKusama => + PolkadotToBridgeHubKusamaCliBridge::init_bridge(self), + InitBridgeName::PolkadotToPolkadotBulletin => + PolkadotToPolkadotBulletinCliBridge::init_bridge(self), + InitBridgeName::PolkadotBulletinToBridgeHubPolkadot => + PolkadotBulletinToBridgeHubPolkadotCliBridge::init_bridge(self), + InitBridgeName::RococoToRococoBulletin => + RococoToRococoBulletinCliBridge::init_bridge(self), + InitBridgeName::RococoBulletinToBridgeHubRococo => + RococoBulletinToBridgeHubRococoCliBridge::init_bridge(self), + InitBridgeName::RococoToBridgeHubWestend => + RococoToBridgeHubWestendCliBridge::init_bridge(self), + InitBridgeName::WestendToBridgeHubRococo => + WestendToBridgeHubRococoCliBridge::init_bridge(self), + } + .await + } +} diff --git a/relays/bin-substrate/src/cli/mod.rs b/relays/bin-substrate/src/cli/mod.rs new file mode 100644 index 000000000000..580463ef9f9e --- /dev/null +++ b/relays/bin-substrate/src/cli/mod.rs @@ -0,0 +1,317 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Deal with CLI args of substrate-to-substrate relay. + +use async_std::prelude::*; +use codec::{Decode, Encode}; +use futures::{select, FutureExt}; +use rbtag::BuildInfo; +use signal_hook::consts::*; +use signal_hook_async_std::Signals; +use structopt::{clap::arg_enum, StructOpt}; +use strum::{EnumString, EnumVariantNames}; + +use bp_messages::LaneId; +use relay_substrate_client::SimpleRuntimeVersion; + +pub(crate) mod bridge; + +mod chain_schema; +mod detect_equivocations; +mod init_bridge; +mod relay_headers; +mod relay_headers_and_messages; +mod relay_messages; +mod relay_parachains; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "bridge"; + +/// Parse relay CLI args. +pub fn parse_args() -> Command { + Command::from_args() +} + +/// Substrate-to-Substrate bridge utilities. +#[derive(StructOpt)] +#[structopt(about = "Substrate-to-Substrate relay")] +pub enum Command { + /// Start headers relay between two chains. + /// + /// The on-chain bridge component should have been already initialized with + /// `init-bridge` sub-command. + RelayHeaders(relay_headers::RelayHeaders), + /// Start messages relay between two chains. + /// + /// Ties up to `Messages` pallets on both chains and starts relaying messages. + /// Requires the header relay to be already running. + RelayMessages(relay_messages::RelayMessages), + /// Start headers and messages relay between two Substrate chains. + /// + /// This high-level relay internally starts four low-level relays: two `RelayHeaders` + /// and two `RelayMessages` relays. Headers are only relayed when they are required by + /// the message relays - i.e. when there are messages or confirmations that needs to be + /// relayed between chains. + RelayHeadersAndMessages(Box), + /// Initialize on-chain bridge pallet with current header data. + /// + /// Sends initialization transaction to bootstrap the bridge with current finalized block data. + InitBridge(init_bridge::InitBridge), + /// Relay parachain heads. + RelayParachains(relay_parachains::RelayParachains), + /// Detect and report equivocations. + /// + /// Parses the source chain headers that were synchronized with the target chain looking for + /// equivocations. If any equivocation is found, it is reported to the source chain. + DetectEquivocations(detect_equivocations::DetectEquivocations), +} + +impl Command { + // Initialize logger depending on the command. + fn init_logger(&self) { + use relay_utils::initialize::{initialize_logger, initialize_relay}; + + match self { + Self::RelayHeaders(_) | + Self::RelayMessages(_) | + Self::RelayHeadersAndMessages(_) | + Self::InitBridge(_) => { + initialize_relay(); + }, + _ => { + initialize_logger(false); + }, + } + } + + /// Run the command. + async fn do_run(self) -> anyhow::Result<()> { + match self { + Self::RelayHeaders(arg) => arg.run().await?, + Self::RelayMessages(arg) => arg.run().await?, + Self::RelayHeadersAndMessages(arg) => arg.run().await?, + Self::InitBridge(arg) => arg.run().await?, + Self::RelayParachains(arg) => arg.run().await?, + Self::DetectEquivocations(arg) => arg.run().await?, + } + Ok(()) + } + + /// Run the command. + pub async fn run(self) { + self.init_logger(); + + let exit_signals = match Signals::new([SIGINT, SIGTERM]) { + Ok(signals) => signals, + Err(e) => { + log::error!(target: LOG_TARGET, "Could not register exit signals: {}", e); + return + }, + }; + let run = self.do_run().fuse(); + futures::pin_mut!(exit_signals, run); + + select! { + signal = exit_signals.next().fuse() => { + log::info!(target: LOG_TARGET, "Received exit signal {:?}", signal); + }, + result = run => { + if let Err(e) = result { + log::error!(target: LOG_TARGET, "substrate-relay: {}", e); + } + }, + } + } +} + +arg_enum! { + #[derive(Debug)] + /// The origin to use when dispatching the message on the target chain. + /// + /// - `Target` uses account existing on the target chain (requires target private key). + /// - `Origin` uses account derived from the source-chain account. + pub enum Origins { + Target, + Source, + } +} + +/// Bridge-supported network definition. +/// +/// Used to abstract away CLI commands. +pub trait CliChain: relay_substrate_client::Chain { + /// Current version of the chain runtime, known to relay. + /// + /// can be `None` if relay is not going to submit transactions to that chain. + const RUNTIME_VERSION: Option; +} + +/// Lane id. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct HexLaneId(pub [u8; 4]); + +impl From for LaneId { + fn from(lane_id: HexLaneId) -> LaneId { + LaneId(lane_id.0) + } +} + +impl std::str::FromStr for HexLaneId { + type Err = hex::FromHexError; + + fn from_str(s: &str) -> Result { + let mut lane_id = [0u8; 4]; + hex::decode_to_slice(s, &mut lane_id)?; + Ok(HexLaneId(lane_id)) + } +} + +/// Nicer formatting for raw bytes vectors. +#[derive(Default, Encode, Decode, PartialEq, Eq)] +pub struct HexBytes(pub Vec); + +impl std::str::FromStr for HexBytes { + type Err = hex::FromHexError; + + fn from_str(s: &str) -> Result { + Ok(Self(hex::decode(s)?)) + } +} + +impl std::fmt::Debug for HexBytes { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(fmt, "0x{self}") + } +} + +impl std::fmt::Display for HexBytes { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(fmt, "{}", hex::encode(&self.0)) + } +} + +/// Prometheus metrics params. +#[derive(Clone, Debug, PartialEq, StructOpt)] +pub struct PrometheusParams { + /// Do not expose a Prometheus metric endpoint. + #[structopt(long)] + pub no_prometheus: bool, + /// Expose Prometheus endpoint at given interface. + #[structopt(long, default_value = "127.0.0.1")] + pub prometheus_host: String, + /// Expose Prometheus endpoint at given port. + #[structopt(long, default_value = "9616")] + pub prometheus_port: u16, +} + +/// Struct to get git commit info and build time. +#[derive(BuildInfo)] +struct SubstrateRelayBuildInfo; + +impl SubstrateRelayBuildInfo { + /// Get git commit in form ``. + pub fn get_git_commit() -> String { + // on gitlab we use images without git installed, so we can't use `rbtag` there + // locally we don't have `CI_*` env variables, so we can't rely on them + // => we are using `CI_*` env variables or else `rbtag` + let maybe_sha_from_ci = option_env!("CI_COMMIT_SHORT_SHA"); + maybe_sha_from_ci + .map(|short_sha| { + // we assume that on CI the copy is always clean + format!("{short_sha}-clean") + }) + .unwrap_or_else(|| SubstrateRelayBuildInfo.get_build_commit().into()) + } +} + +impl PrometheusParams { + /// Tries to convert CLI metrics params into metrics params, used by the relay. + pub fn into_metrics_params(self) -> anyhow::Result { + let metrics_address = if !self.no_prometheus { + Some(relay_utils::metrics::MetricsAddress { + host: self.prometheus_host, + port: self.prometheus_port, + }) + } else { + None + }; + + let relay_version = option_env!("CARGO_PKG_VERSION").unwrap_or("unknown"); + let relay_commit = SubstrateRelayBuildInfo::get_git_commit(); + relay_utils::metrics::MetricsParams::new( + metrics_address, + relay_version.into(), + relay_commit, + ) + .map_err(|e| anyhow::format_err!("{:?}", e)) + } +} + +/// Either explicit or maximal allowed value. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ExplicitOrMaximal { + /// User has explicitly specified argument value. + Explicit(V), + /// Maximal allowed value for this argument. + Maximal, +} + +impl std::str::FromStr for ExplicitOrMaximal +where + V::Err: std::fmt::Debug, +{ + type Err = String; + + fn from_str(s: &str) -> Result { + if s.to_lowercase() == "max" { + return Ok(ExplicitOrMaximal::Maximal) + } + + V::from_str(s) + .map(ExplicitOrMaximal::Explicit) + .map_err(|e| format!("Failed to parse '{e:?}'. Expected 'max' or explicit value")) + } +} + +#[doc = "Runtime version params."] +#[derive(StructOpt, Debug, PartialEq, Eq, Clone, Copy, EnumString, EnumVariantNames)] +pub enum RuntimeVersionType { + /// Auto query version from chain + Auto, + /// Custom `spec_version` and `transaction_version` + Custom, + /// Read version from bundle dependencies directly. + Bundle, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hex_bytes_display_matches_from_str_for_clap() { + // given + let hex = HexBytes(vec![1, 2, 3, 4]); + let display = format!("{hex}"); + + // when + let hex2: HexBytes = display.parse().unwrap(); + + // then + assert_eq!(hex.0, hex2.0); + } +} diff --git a/relays/bin-substrate/src/cli/relay_headers.rs b/relays/bin-substrate/src/cli/relay_headers.rs new file mode 100644 index 000000000000..5e43c9877007 --- /dev/null +++ b/relays/bin-substrate/src/cli/relay_headers.rs @@ -0,0 +1,129 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use async_trait::async_trait; +use structopt::StructOpt; +use strum::{EnumString, EnumVariantNames, VariantNames}; + +use crate::bridges::{ + kusama_polkadot::{ + kusama_headers_to_bridge_hub_polkadot::KusamaToBridgeHubPolkadotCliBridge, + polkadot_headers_to_bridge_hub_kusama::PolkadotToBridgeHubKusamaCliBridge, + }, + polkadot_bulletin::{ + polkadot_bulletin_headers_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotCliBridge, + polkadot_headers_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge, + }, + rococo_bulletin::{ + rococo_bulletin_headers_to_bridge_hub_rococo::RococoBulletinToBridgeHubRococoCliBridge, + rococo_headers_to_rococo_bulletin::RococoToRococoBulletinCliBridge, + }, +}; +use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; +use substrate_relay_helper::finality::SubstrateFinalitySyncPipeline; + +use crate::cli::{bridge::*, chain_schema::*, PrometheusParams}; + +/// Start headers relayer process. +#[derive(StructOpt)] +pub struct RelayHeaders { + /// A bridge instance to relay headers for. + #[structopt(possible_values = RelayHeadersBridge::VARIANTS, case_insensitive = true)] + bridge: RelayHeadersBridge, + /// If passed, only mandatory headers (headers that are changing the GRANDPA authorities set) + /// are relayed. + #[structopt(long)] + only_mandatory_headers: bool, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +#[derive(Debug, EnumString, EnumVariantNames)] +#[strum(serialize_all = "kebab_case")] +/// Headers relay bridge. +pub enum RelayHeadersBridge { + KusamaToBridgeHubPolkadot, + PolkadotToBridgeHubKusama, + PolkadotToPolkadotBulletin, + PolkadotBulletinToBridgeHubPolkadot, + RococoToRococoBulletin, + RococoBulletinToBridgeHubRococo, +} + +#[async_trait] +trait HeadersRelayer: RelayToRelayHeadersCliBridge { + /// Relay headers. + async fn relay_headers(data: RelayHeaders) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let target_client = data.target.into_client::().await?; + let target_transactions_mortality = data.target_sign.target_transactions_mortality; + let target_sign = data.target_sign.to_keypair::()?; + + let metrics_params: relay_utils::metrics::MetricsParams = + data.prometheus_params.into_metrics_params()?; + GlobalMetrics::new()?.register_and_spawn(&metrics_params.registry)?; + + let target_transactions_params = substrate_relay_helper::TransactionParams { + signer: target_sign, + mortality: target_transactions_mortality, + }; + Self::Finality::start_relay_guards(&target_client, target_client.can_start_version_guard()) + .await?; + + substrate_relay_helper::finality::run::( + source_client, + target_client, + data.only_mandatory_headers, + target_transactions_params, + metrics_params, + ) + .await + } +} + +impl HeadersRelayer for KusamaToBridgeHubPolkadotCliBridge {} +impl HeadersRelayer for PolkadotToBridgeHubKusamaCliBridge {} +impl HeadersRelayer for PolkadotToPolkadotBulletinCliBridge {} +impl HeadersRelayer for PolkadotBulletinToBridgeHubPolkadotCliBridge {} +impl HeadersRelayer for RococoToRococoBulletinCliBridge {} +impl HeadersRelayer for RococoBulletinToBridgeHubRococoCliBridge {} + +impl RelayHeaders { + /// Run the command. + pub async fn run(self) -> anyhow::Result<()> { + match self.bridge { + RelayHeadersBridge::KusamaToBridgeHubPolkadot => + KusamaToBridgeHubPolkadotCliBridge::relay_headers(self), + RelayHeadersBridge::PolkadotToBridgeHubKusama => + PolkadotToBridgeHubKusamaCliBridge::relay_headers(self), + RelayHeadersBridge::PolkadotToPolkadotBulletin => + PolkadotToPolkadotBulletinCliBridge::relay_headers(self), + RelayHeadersBridge::PolkadotBulletinToBridgeHubPolkadot => + PolkadotBulletinToBridgeHubPolkadotCliBridge::relay_headers(self), + RelayHeadersBridge::RococoToRococoBulletin => + RococoToRococoBulletinCliBridge::relay_headers(self), + RelayHeadersBridge::RococoBulletinToBridgeHubRococo => + RococoBulletinToBridgeHubRococoCliBridge::relay_headers(self), + } + .await + } +} diff --git a/relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs b/relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs new file mode 100644 index 000000000000..c445bdddcc93 --- /dev/null +++ b/relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs @@ -0,0 +1,669 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Complex 2-ways headers+messages relays support. +//! +//! To add new complex relay between `ChainA` and `ChainB`, you must: +//! +//! 1) ensure that there's a `declare_chain_cli_schema!(...)` for both chains. +//! 2) add `declare_chain_to_chain_bridge_schema!(...)` or +//! `declare_chain_to_parachain_bridge_schema` for the bridge. +//! 3) declare a new struct for the added bridge and implement the `Full2WayBridge` trait for it. + +#[macro_use] +mod parachain_to_parachain; +#[macro_use] +mod relay_to_relay; +#[macro_use] +mod relay_to_parachain; + +use async_trait::async_trait; +use std::{marker::PhantomData, sync::Arc}; +use structopt::StructOpt; + +use futures::{FutureExt, TryFutureExt}; +use relay_to_parachain::*; + +use crate::{ + bridges::{ + kusama_polkadot::{ + kusama_parachains_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotCliBridge, + polkadot_parachains_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaCliBridge, + }, + polkadot_bulletin::{ + polkadot_bulletin_headers_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotCliBridge, + polkadot_parachains_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge, + }, + rococo_bulletin::{ + rococo_bulletin_headers_to_bridge_hub_rococo::RococoBulletinToBridgeHubRococoCliBridge, + rococo_parachains_to_rococo_bulletin::RococoToRococoBulletinCliBridge, + BridgeHubRococoAsBridgeHubPolkadot, + }, + rococo_westend::{ + rococo_parachains_to_bridge_hub_westend::BridgeHubRococoToBridgeHubWestendCliBridge, + westend_parachains_to_bridge_hub_rococo::BridgeHubWestendToBridgeHubRococoCliBridge, + }, + }, + cli::{ + bridge::{ + CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge, + RelayToRelayHeadersCliBridge, + }, + chain_schema::*, + relay_headers_and_messages::parachain_to_parachain::ParachainToParachainBridge, + CliChain, HexLaneId, PrometheusParams, + }, + declare_chain_cli_schema, +}; +use bp_messages::LaneId; +use bp_runtime::BalanceOf; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, ChainWithBalances, ChainWithMessages, + ChainWithTransactions, Client, Parachain, +}; +use relay_utils::metrics::MetricsParams; +use sp_core::Pair; +use substrate_relay_helper::{ + messages_lane::{MessagesRelayLimits, MessagesRelayParams}, + on_demand::OnDemandRelay, + TaggedAccount, TransactionParams, +}; + +/// Parameters that have the same names across all bridges. +#[derive(Debug, PartialEq, StructOpt)] +pub struct HeadersAndMessagesSharedParams { + /// Hex-encoded lane identifiers that should be served by the complex relay. + #[structopt(long, default_value = "00000000")] + pub lane: Vec, + /// If passed, only mandatory headers (headers that are changing the GRANDPA authorities set) + /// are relayed. + #[structopt(long)] + pub only_mandatory_headers: bool, + #[structopt(flatten)] + pub prometheus_params: PrometheusParams, +} + +/// Bridge parameters, shared by all bridge types. +pub struct Full2WayBridgeCommonParams< + Left: ChainWithTransactions + CliChain, + Right: ChainWithTransactions + CliChain, +> { + /// Shared parameters. + pub shared: HeadersAndMessagesSharedParams, + /// Parameters of the left chain. + pub left: BridgeEndCommonParams, + /// Parameters of the right chain. + pub right: BridgeEndCommonParams, + + /// Common metric parameters. + pub metrics_params: MetricsParams, +} + +impl + Full2WayBridgeCommonParams +{ + /// Creates new bridge parameters from its components. + pub fn new>( + shared: HeadersAndMessagesSharedParams, + left: BridgeEndCommonParams, + right: BridgeEndCommonParams, + ) -> anyhow::Result { + // Create metrics registry. + let metrics_params = shared.prometheus_params.clone().into_metrics_params()?; + let metrics_params = relay_utils::relay_metrics(metrics_params).into_params(); + + Ok(Self { shared, left, right, metrics_params }) + } +} + +/// Parameters that are associated with one side of the bridge. +pub struct BridgeEndCommonParams { + /// Chain client. + pub client: Client, + /// Params used for sending transactions to the chain. + pub tx_params: TransactionParams>, + /// Accounts, which balances are exposed as metrics by the relay process. + pub accounts: Vec>>, +} + +/// All data of the bidirectional complex relay. +struct FullBridge< + 'a, + Source: ChainWithTransactions + CliChain, + Target: ChainWithTransactions + CliChain, + Bridge: MessagesCliBridge, +> { + source: &'a mut BridgeEndCommonParams, + target: &'a mut BridgeEndCommonParams, + metrics_params: &'a MetricsParams, + _phantom_data: PhantomData, +} + +impl< + 'a, + Source: ChainWithTransactions + CliChain, + Target: ChainWithTransactions + CliChain, + Bridge: MessagesCliBridge, + > FullBridge<'a, Source, Target, Bridge> +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom> + Into, +{ + /// Construct complex relay given it components. + fn new( + source: &'a mut BridgeEndCommonParams, + target: &'a mut BridgeEndCommonParams, + metrics_params: &'a MetricsParams, + ) -> Self { + Self { source, target, metrics_params, _phantom_data: Default::default() } + } + + /// Returns message relay parameters. + fn messages_relay_params( + &self, + source_to_target_headers_relay: Arc>, + target_to_source_headers_relay: Arc>, + lane_id: LaneId, + maybe_limits: Option, + ) -> MessagesRelayParams { + MessagesRelayParams { + source_client: self.source.client.clone(), + source_transaction_params: self.source.tx_params.clone(), + target_client: self.target.client.clone(), + target_transaction_params: self.target.tx_params.clone(), + source_to_target_headers_relay: Some(source_to_target_headers_relay), + target_to_source_headers_relay: Some(target_to_source_headers_relay), + lane_id, + limits: maybe_limits, + metrics_params: self.metrics_params.clone().disable(), + } + } +} + +// All supported chains. +declare_chain_cli_schema!(Rococo, rococo); +declare_chain_cli_schema!(BridgeHubRococo, bridge_hub_rococo); +declare_chain_cli_schema!(Westend, westend); +declare_chain_cli_schema!(BridgeHubWestend, bridge_hub_westend); +declare_chain_cli_schema!(Kusama, kusama); +declare_chain_cli_schema!(BridgeHubKusama, bridge_hub_kusama); +declare_chain_cli_schema!(Polkadot, polkadot); +declare_chain_cli_schema!(BridgeHubPolkadot, bridge_hub_polkadot); +declare_chain_cli_schema!(PolkadotBulletin, polkadot_bulletin); +declare_chain_cli_schema!(RococoBulletin, rococo_bulletin); +// Means to override signers of different layer transactions. +declare_chain_cli_schema!(RococoHeadersToBridgeHubWestend, rococo_headers_to_bridge_hub_westend); +declare_chain_cli_schema!( + RococoParachainsToBridgeHubWestend, + rococo_parachains_to_bridge_hub_westend +); +declare_chain_cli_schema!(WestendHeadersToBridgeHubRococo, westend_headers_to_bridge_hub_rococo); +declare_chain_cli_schema!( + WestendParachainsToBridgeHubRococo, + westend_parachains_to_bridge_hub_rococo +); +declare_chain_cli_schema!(KusamaHeadersToBridgeHubPolkadot, kusama_headers_to_bridge_hub_polkadot); +declare_chain_cli_schema!( + KusamaParachainsToBridgeHubPolkadot, + kusama_parachains_to_bridge_hub_polkadot +); +declare_chain_cli_schema!(PolkadotHeadersToBridgeHubKusama, polkadot_headers_to_bridge_hub_kusama); +declare_chain_cli_schema!( + PolkadotParachainsToBridgeHubKusama, + polkadot_parachains_to_bridge_hub_kusama +); +declare_chain_cli_schema!( + PolkadotBulletinHeadersToBridgeHubPolkadot, + polkadot_bulletin_headers_to_bridge_hub_polkadot +); +declare_chain_cli_schema!( + RococoBulletinHeadersToBridgeHubRococo, + rococo_bulletin_headers_to_bridge_hub_rococo +); +declare_chain_cli_schema!(PolkadotHeadersToPolkadotBulletin, polkadot_headers_to_polkadot_bulletin); +declare_chain_cli_schema!(RococoHeadersToRococoBulletin, rococo_headers_to_rococo_bulletin); +declare_chain_cli_schema!( + PolkadotParachainsToPolkadotBulletin, + polkadot_parachains_to_polkadot_bulletin +); +declare_chain_cli_schema!(RococoParachainsToRococoBulletin, rococo_parachains_to_rococo_bulletin); +// All supported bridges. +declare_parachain_to_parachain_bridge_schema!(BridgeHubRococo, Rococo, BridgeHubWestend, Westend); +declare_parachain_to_parachain_bridge_schema!(BridgeHubKusama, Kusama, BridgeHubPolkadot, Polkadot); +declare_relay_to_parachain_bridge_schema!(PolkadotBulletin, BridgeHubPolkadot, Polkadot); +declare_relay_to_parachain_bridge_schema!(RococoBulletin, BridgeHubRococo, Rococo); + +/// Base portion of the bidirectional complex relay. +/// +/// This main purpose of extracting this trait is that in different relays the implementation +/// of `start_on_demand_headers_relayers` method will be different. But the number of +/// implementations is limited to relay <> relay, parachain <> relay and parachain <> parachain. +/// This trait allows us to reuse these implementations in different bridges. +#[async_trait] +trait Full2WayBridgeBase: Sized + Send + Sync { + /// The CLI params for the bridge. + type Params; + /// The left relay chain. + type Left: ChainWithTransactions + CliChain; + /// The right destination chain (it can be a relay or a parachain). + type Right: ChainWithTransactions + CliChain; + + /// Reference to common relay parameters. + fn common(&self) -> &Full2WayBridgeCommonParams; + + /// Mutable reference to common relay parameters. + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams; + + /// Start on-demand headers relays. + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )>; +} + +/// Bidirectional complex relay. +#[async_trait] +trait Full2WayBridge: Sized + Sync +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom> + Into, + BalanceOf: TryFrom> + Into, +{ + /// Base portion of the bidirectional complex relay. + type Base: Full2WayBridgeBase; + + /// The left relay chain. + type Left: ChainWithTransactions + ChainWithBalances + ChainWithMessages + CliChain; + /// The right relay chain. + type Right: ChainWithTransactions + ChainWithBalances + ChainWithMessages + CliChain; + + /// Left to Right bridge. + type L2R: MessagesCliBridge; + /// Right to Left bridge + type R2L: MessagesCliBridge; + + /// Construct new bridge. + fn new(params: ::Params) -> anyhow::Result; + + /// Reference to the base relay portion. + fn base(&self) -> &Self::Base; + + /// Mutable reference to the base relay portion. + fn mut_base(&mut self) -> &mut Self::Base; + + /// Creates and returns Left to Right complex relay. + fn left_to_right(&mut self) -> FullBridge { + let common = self.mut_base().mut_common(); + FullBridge::<_, _, Self::L2R>::new( + &mut common.left, + &mut common.right, + &common.metrics_params, + ) + } + + /// Creates and returns Right to Left complex relay. + fn right_to_left(&mut self) -> FullBridge { + let common = self.mut_base().mut_common(); + FullBridge::<_, _, Self::R2L>::new( + &mut common.right, + &mut common.left, + &common.metrics_params, + ) + } + + /// Start complex relay. + async fn run(&mut self) -> anyhow::Result<()> { + // Register standalone metrics. + { + let common = self.mut_base().mut_common(); + common.left.accounts.push(TaggedAccount::Messages { + id: common.left.tx_params.signer.public().into(), + bridged_chain: Self::Right::NAME.to_string(), + }); + common.right.accounts.push(TaggedAccount::Messages { + id: common.right.tx_params.signer.public().into(), + bridged_chain: Self::Left::NAME.to_string(), + }); + } + + // start on-demand header relays + let (left_to_right_on_demand_headers, right_to_left_on_demand_headers) = + self.mut_base().start_on_demand_headers_relayers().await?; + + // add balance-related metrics + let lanes = self + .base() + .common() + .shared + .lane + .iter() + .cloned() + .map(Into::into) + .collect::>(); + { + let common = self.mut_base().mut_common(); + substrate_relay_helper::messages_metrics::add_relay_balances_metrics::<_, Self::Right>( + common.left.client.clone(), + &common.metrics_params, + &common.left.accounts, + &lanes, + ) + .await?; + substrate_relay_helper::messages_metrics::add_relay_balances_metrics::<_, Self::Left>( + common.right.client.clone(), + &common.metrics_params, + &common.right.accounts, + &lanes, + ) + .await?; + } + + // Need 2x capacity since we consider both directions for each lane + let mut message_relays = Vec::with_capacity(lanes.len() * 2); + for lane in lanes { + let left_to_right_messages = substrate_relay_helper::messages_lane::run::< + ::MessagesLane, + >(self.left_to_right().messages_relay_params( + left_to_right_on_demand_headers.clone(), + right_to_left_on_demand_headers.clone(), + lane, + Self::L2R::maybe_messages_limits(), + )) + .map_err(|e| anyhow::format_err!("{}", e)) + .boxed(); + message_relays.push(left_to_right_messages); + + let right_to_left_messages = substrate_relay_helper::messages_lane::run::< + ::MessagesLane, + >(self.right_to_left().messages_relay_params( + right_to_left_on_demand_headers.clone(), + left_to_right_on_demand_headers.clone(), + lane, + Self::R2L::maybe_messages_limits(), + )) + .map_err(|e| anyhow::format_err!("{}", e)) + .boxed(); + message_relays.push(right_to_left_messages); + } + + relay_utils::relay_metrics(self.base().common().metrics_params.clone()) + .expose() + .await + .map_err(|e| anyhow::format_err!("{}", e))?; + + futures::future::select_all(message_relays).await.0 + } +} + +/// BridgeHubRococo <> BridgeHubWestend complex relay. +pub struct BridgeHubRococoBridgeHubWestendFull2WayBridge { + base: ::Base, +} + +#[async_trait] +impl Full2WayBridge for BridgeHubRococoBridgeHubWestendFull2WayBridge { + type Base = ParachainToParachainBridge; + type Left = relay_bridge_hub_rococo_client::BridgeHubRococo; + type Right = relay_bridge_hub_westend_client::BridgeHubWestend; + type L2R = BridgeHubRococoToBridgeHubWestendCliBridge; + type R2L = BridgeHubWestendToBridgeHubRococoCliBridge; + + fn new(base: Self::Base) -> anyhow::Result { + Ok(Self { base }) + } + + fn base(&self) -> &Self::Base { + &self.base + } + + fn mut_base(&mut self) -> &mut Self::Base { + &mut self.base + } +} + +/// BridgeHubKusama <> BridgeHubPolkadot complex relay. +pub struct BridgeHubKusamaBridgeHubPolkadotFull2WayBridge { + base: ::Base, +} + +#[async_trait] +impl Full2WayBridge for BridgeHubKusamaBridgeHubPolkadotFull2WayBridge { + type Base = ParachainToParachainBridge; + type Left = relay_bridge_hub_kusama_client::BridgeHubKusama; + type Right = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + type L2R = BridgeHubKusamaToBridgeHubPolkadotCliBridge; + type R2L = BridgeHubPolkadotToBridgeHubKusamaCliBridge; + + fn new(base: Self::Base) -> anyhow::Result { + Ok(Self { base }) + } + + fn base(&self) -> &Self::Base { + &self.base + } + + fn mut_base(&mut self) -> &mut Self::Base { + &mut self.base + } +} + +/// `PolkadotBulletin` <> `BridgeHubPolkadot` complex relay. +pub struct PolkadotBulletinBridgeHubPolkadotFull2WayBridge { + base: ::Base, +} + +#[async_trait] +impl Full2WayBridge for PolkadotBulletinBridgeHubPolkadotFull2WayBridge { + type Base = RelayToParachainBridge; + type Left = relay_polkadot_bulletin_client::PolkadotBulletin; + type Right = relay_bridge_hub_polkadot_client::BridgeHubPolkadot; + type L2R = PolkadotBulletinToBridgeHubPolkadotCliBridge; + type R2L = PolkadotToPolkadotBulletinCliBridge; + + fn new(base: Self::Base) -> anyhow::Result { + Ok(Self { base }) + } + + fn base(&self) -> &Self::Base { + &self.base + } + + fn mut_base(&mut self) -> &mut Self::Base { + &mut self.base + } +} + +/// `RococoBulletin` <> `BridgeHubRococo` complex relay. +pub struct RococoBulletinBridgeHubRococoFull2WayBridge { + base: ::Base, +} + +#[async_trait] +impl Full2WayBridge for RococoBulletinBridgeHubRococoFull2WayBridge { + type Base = RelayToParachainBridge; + type Left = relay_polkadot_bulletin_client::PolkadotBulletin; + type Right = BridgeHubRococoAsBridgeHubPolkadot; + type L2R = RococoBulletinToBridgeHubRococoCliBridge; + type R2L = RococoToRococoBulletinCliBridge; + + fn new(base: Self::Base) -> anyhow::Result { + Ok(Self { base }) + } + + fn base(&self) -> &Self::Base { + &self.base + } + + fn mut_base(&mut self) -> &mut Self::Base { + &mut self.base + } +} + +/// Complex headers+messages relay. +#[derive(Debug, PartialEq, StructOpt)] +pub enum RelayHeadersAndMessages { + /// BridgeHubKusama <> BridgeHubPolkadot relay. + BridgeHubKusamaBridgeHubPolkadot(BridgeHubKusamaBridgeHubPolkadotHeadersAndMessages), + /// `PolkadotBulletin` <> `BridgeHubPolkadot` relay. + PolkadotBulletinBridgeHubPolkadot(PolkadotBulletinBridgeHubPolkadotHeadersAndMessages), + /// `RococoBulletin` <> `BridgeHubRococo` relay. + RococoBulletinBridgeHubRococo(RococoBulletinBridgeHubRococoHeadersAndMessages), + /// BridgeHubRococo <> BridgeHubWestend relay. + BridgeHubRococoBridgeHubWestend(BridgeHubRococoBridgeHubWestendHeadersAndMessages), +} + +impl RelayHeadersAndMessages { + /// Run the command. + pub async fn run(self) -> anyhow::Result<()> { + match self { + RelayHeadersAndMessages::BridgeHubRococoBridgeHubWestend(params) => + BridgeHubRococoBridgeHubWestendFull2WayBridge::new(params.into_bridge().await?)? + .run() + .await, + RelayHeadersAndMessages::BridgeHubKusamaBridgeHubPolkadot(params) => + BridgeHubKusamaBridgeHubPolkadotFull2WayBridge::new(params.into_bridge().await?)? + .run() + .await, + RelayHeadersAndMessages::PolkadotBulletinBridgeHubPolkadot(params) => + PolkadotBulletinBridgeHubPolkadotFull2WayBridge::new(params.into_bridge().await?)? + .run() + .await, + RelayHeadersAndMessages::RococoBulletinBridgeHubRococo(params) => + RococoBulletinBridgeHubRococoFull2WayBridge::new(params.into_bridge().await?)? + .run() + .await, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_parse_parachain_to_parachain_options() { + // when + let res = RelayHeadersAndMessages::from_iter(vec![ + "relay-headers-and-messages", + "bridge-hub-kusama-bridge-hub-polkadot", + "--bridge-hub-kusama-host", + "bridge-hub-kusama-node-collator1", + "--bridge-hub-kusama-port", + "9944", + "--bridge-hub-kusama-signer", + "//Iden", + "--bridge-hub-kusama-transactions-mortality", + "64", + "--kusama-host", + "kusama-alice", + "--kusama-port", + "9944", + "--bridge-hub-polkadot-host", + "bridge-hub-polkadot-collator1", + "--bridge-hub-polkadot-port", + "9944", + "--bridge-hub-polkadot-signer", + "//George", + "--bridge-hub-polkadot-transactions-mortality", + "64", + "--polkadot-host", + "polkadot-alice", + "--polkadot-port", + "9944", + "--lane", + "00000000", + "--prometheus-host", + "0.0.0.0", + ]); + + // then + assert_eq!( + res, + RelayHeadersAndMessages::BridgeHubKusamaBridgeHubPolkadot( + BridgeHubKusamaBridgeHubPolkadotHeadersAndMessages { + shared: HeadersAndMessagesSharedParams { + lane: vec![HexLaneId([0x00, 0x00, 0x00, 0x00])], + only_mandatory_headers: false, + prometheus_params: PrometheusParams { + no_prometheus: false, + prometheus_host: "0.0.0.0".into(), + prometheus_port: 9616, + }, + }, + left_relay: KusamaConnectionParams { + kusama_host: "kusama-alice".into(), + kusama_port: 9944, + kusama_secure: false, + kusama_runtime_version: KusamaRuntimeVersionParams { + kusama_version_mode: RuntimeVersionType::Bundle, + kusama_spec_version: None, + kusama_transaction_version: None, + }, + }, + left: BridgeHubKusamaConnectionParams { + bridge_hub_kusama_host: "bridge-hub-kusama-node-collator1".into(), + bridge_hub_kusama_port: 9944, + bridge_hub_kusama_secure: false, + bridge_hub_kusama_runtime_version: BridgeHubKusamaRuntimeVersionParams { + bridge_hub_kusama_version_mode: RuntimeVersionType::Bundle, + bridge_hub_kusama_spec_version: None, + bridge_hub_kusama_transaction_version: None, + }, + }, + left_sign: BridgeHubKusamaSigningParams { + bridge_hub_kusama_signer: Some("//Iden".into()), + bridge_hub_kusama_signer_password: None, + bridge_hub_kusama_signer_file: None, + bridge_hub_kusama_signer_password_file: None, + bridge_hub_kusama_transactions_mortality: Some(64), + }, + right: BridgeHubPolkadotConnectionParams { + bridge_hub_polkadot_host: "bridge-hub-polkadot-collator1".into(), + bridge_hub_polkadot_port: 9944, + bridge_hub_polkadot_secure: false, + bridge_hub_polkadot_runtime_version: + BridgeHubPolkadotRuntimeVersionParams { + bridge_hub_polkadot_version_mode: RuntimeVersionType::Bundle, + bridge_hub_polkadot_spec_version: None, + bridge_hub_polkadot_transaction_version: None, + }, + }, + right_sign: BridgeHubPolkadotSigningParams { + bridge_hub_polkadot_signer: Some("//George".into()), + bridge_hub_polkadot_signer_password: None, + bridge_hub_polkadot_signer_file: None, + bridge_hub_polkadot_signer_password_file: None, + bridge_hub_polkadot_transactions_mortality: Some(64), + }, + right_relay: PolkadotConnectionParams { + polkadot_host: "polkadot-alice".into(), + polkadot_port: 9944, + polkadot_secure: false, + polkadot_runtime_version: PolkadotRuntimeVersionParams { + polkadot_version_mode: RuntimeVersionType::Bundle, + polkadot_spec_version: None, + polkadot_transaction_version: None, + }, + }, + } + ), + ); + } +} diff --git a/relays/bin-substrate/src/cli/relay_headers_and_messages/parachain_to_parachain.rs b/relays/bin-substrate/src/cli/relay_headers_and_messages/parachain_to_parachain.rs new file mode 100644 index 000000000000..32ba6b3ddadc --- /dev/null +++ b/relays/bin-substrate/src/cli/relay_headers_and_messages/parachain_to_parachain.rs @@ -0,0 +1,213 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use async_trait::async_trait; +use std::sync::Arc; + +use crate::cli::{ + bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}, + relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + CliChain, +}; +use bp_polkadot_core::parachains::ParaHash; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, ChainWithTransactions, Client, Parachain, +}; +use sp_core::Pair; +use substrate_relay_helper::{ + finality::SubstrateFinalitySyncPipeline, + on_demand::{ + headers::OnDemandHeadersRelay, parachains::OnDemandParachainsRelay, OnDemandRelay, + }, +}; + +/// A base relay between two parachain from different consensus systems. +/// +/// Such relay starts 2 messages relay. It also starts 2 on-demand header relays and 2 on-demand +/// parachain heads relay. +pub struct ParachainToParachainBridge< + L2R: MessagesCliBridge + ParachainToRelayHeadersCliBridge, + R2L: MessagesCliBridge + ParachainToRelayHeadersCliBridge, +> where + ::Source: Parachain, + ::Source: Parachain, +{ + /// Parameters that are shared by all bridge types. + pub common: + Full2WayBridgeCommonParams<::Target, ::Target>, + /// Client of the left relay chain. + pub left_relay: Client<::SourceRelay>, + /// Client of the right relay chain. + pub right_relay: Client<::SourceRelay>, +} + +macro_rules! declare_parachain_to_parachain_bridge_schema { + // left-parachain, relay-chain-of-left-parachain, right-parachain, relay-chain-of-right-parachain + ($left_parachain:ident, $left_chain:ident, $right_parachain:ident, $right_chain:ident) => { + bp_runtime::paste::item! { + #[doc = $left_parachain ", " $left_chain ", " $right_parachain " and " $right_chain " headers+parachains+messages relay params."] + #[derive(Debug, PartialEq, StructOpt)] + pub struct [<$left_parachain $right_parachain HeadersAndMessages>] { + // shared parameters + #[structopt(flatten)] + shared: HeadersAndMessagesSharedParams, + + #[structopt(flatten)] + left: [<$left_parachain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the left chain + #[structopt(flatten)] + left_sign: [<$left_parachain SigningParams>], + + #[structopt(flatten)] + left_relay: [<$left_chain ConnectionParams>], + + #[structopt(flatten)] + right: [<$right_parachain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the right chain + #[structopt(flatten)] + right_sign: [<$right_parachain SigningParams>], + + #[structopt(flatten)] + right_relay: [<$right_chain ConnectionParams>], + } + + impl [<$left_parachain $right_parachain HeadersAndMessages>] { + async fn into_bridge< + Left: ChainWithTransactions + CliChain + Parachain, + LeftRelay: CliChain, + Right: ChainWithTransactions + CliChain + Parachain, + RightRelay: CliChain, + L2R: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + >( + self, + ) -> anyhow::Result> { + Ok(ParachainToParachainBridge { + common: Full2WayBridgeCommonParams::new::( + self.shared, + BridgeEndCommonParams { + client: self.left.into_client::().await?, + tx_params: self.left_sign.transaction_params::()?, + accounts: vec![], + }, + BridgeEndCommonParams { + client: self.right.into_client::().await?, + tx_params: self.right_sign.transaction_params::()?, + accounts: vec![], + }, + )?, + left_relay: self.left_relay.into_client::().await?, + right_relay: self.right_relay.into_client::().await?, + }) + } + } + } + }; +} + +#[async_trait] +impl< + Left: Chain + ChainWithTransactions + CliChain + Parachain, + Right: Chain + ChainWithTransactions + CliChain + Parachain, + LeftRelay: Chain + + CliChain, + RightRelay: Chain + + CliChain, + L2R: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + > Full2WayBridgeBase for ParachainToParachainBridge +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, +{ + type Params = ParachainToParachainBridge; + type Left = Left; + type Right = Right; + + fn common(&self) -> &Full2WayBridgeCommonParams { + &self.common + } + + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams { + &mut self.common + } + + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )> { + ::RelayFinality::start_relay_guards( + &self.common.right.client, + self.common.right.client.can_start_version_guard(), + ) + .await?; + ::RelayFinality::start_relay_guards( + &self.common.left.client, + self.common.left.client.can_start_version_guard(), + ) + .await?; + + let left_relay_to_right_on_demand_headers = + OnDemandHeadersRelay::<::RelayFinality>::new( + self.left_relay.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + self.common.shared.only_mandatory_headers, + Some(self.common.metrics_params.clone()), + ); + let right_relay_to_left_on_demand_headers = + OnDemandHeadersRelay::<::RelayFinality>::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.only_mandatory_headers, + Some(self.common.metrics_params.clone()), + ); + + let left_to_right_on_demand_parachains = OnDemandParachainsRelay::< + ::ParachainFinality, + >::new( + self.left_relay.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + Arc::new(left_relay_to_right_on_demand_headers), + ); + let right_to_left_on_demand_parachains = OnDemandParachainsRelay::< + ::ParachainFinality, + >::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + Arc::new(right_relay_to_left_on_demand_headers), + ); + + Ok(( + Arc::new(left_to_right_on_demand_parachains), + Arc::new(right_to_left_on_demand_parachains), + )) + } +} diff --git a/relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_parachain.rs b/relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_parachain.rs new file mode 100644 index 000000000000..fd885b6ea6c6 --- /dev/null +++ b/relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_parachain.rs @@ -0,0 +1,195 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use async_trait::async_trait; +use std::sync::Arc; + +use crate::cli::{ + bridge::{ + CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge, + RelayToRelayHeadersCliBridge, + }, + relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + CliChain, +}; +use bp_polkadot_core::parachains::ParaHash; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, ChainWithTransactions, Client, Parachain, +}; +use sp_core::Pair; +use substrate_relay_helper::{ + finality::SubstrateFinalitySyncPipeline, + on_demand::{ + headers::OnDemandHeadersRelay, parachains::OnDemandParachainsRelay, OnDemandRelay, + }, +}; + +/// A base relay between standalone (relay) chain and a parachain from another consensus system. +/// +/// Such relay starts 2 messages relay. It also starts 2 on-demand header relays and 1 on-demand +/// parachain heads relay. +pub struct RelayToParachainBridge< + L2R: MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: MessagesCliBridge + ParachainToRelayHeadersCliBridge, +> where + ::Source: Parachain, +{ + /// Parameters that are shared by all bridge types. + pub common: + Full2WayBridgeCommonParams<::Target, ::Target>, + /// Client of the right relay chain. + pub right_relay: Client<::SourceRelay>, +} + +macro_rules! declare_relay_to_parachain_bridge_schema { + // chain, parachain, relay-chain-of-parachain + ($left_chain:ident, $right_parachain:ident, $right_chain:ident) => { + bp_runtime::paste::item! { + #[doc = $left_chain ", " $right_parachain " and " $right_chain " headers+parachains+messages relay params."] + #[derive(Debug, PartialEq, StructOpt)] + pub struct [<$left_chain $right_parachain HeadersAndMessages>] { + // shared parameters + #[structopt(flatten)] + shared: HeadersAndMessagesSharedParams, + + #[structopt(flatten)] + left: [<$left_chain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the left chain + #[structopt(flatten)] + left_sign: [<$left_chain SigningParams>], + + #[structopt(flatten)] + right: [<$right_parachain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the right chain + #[structopt(flatten)] + right_sign: [<$right_parachain SigningParams>], + + #[structopt(flatten)] + right_relay: [<$right_chain ConnectionParams>], + } + + impl [<$left_chain $right_parachain HeadersAndMessages>] { + async fn into_bridge< + Left: ChainWithTransactions + CliChain, + Right: ChainWithTransactions + CliChain + Parachain, + RightRelay: CliChain, + L2R: CliBridgeBase + MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + >( + self, + ) -> anyhow::Result> { + Ok(RelayToParachainBridge { + common: Full2WayBridgeCommonParams::new::( + self.shared, + BridgeEndCommonParams { + client: self.left.into_client::().await?, + tx_params: self.left_sign.transaction_params::()?, + accounts: vec![], + }, + BridgeEndCommonParams { + client: self.right.into_client::().await?, + tx_params: self.right_sign.transaction_params::()?, + accounts: vec![], + }, + )?, + right_relay: self.right_relay.into_client::().await?, + }) + } + } + } + }; +} + +#[async_trait] +impl< + Left: ChainWithTransactions + CliChain, + Right: Chain + ChainWithTransactions + CliChain + Parachain, + RightRelay: Chain + + CliChain, + L2R: CliBridgeBase + + MessagesCliBridge + + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + > Full2WayBridgeBase for RelayToParachainBridge +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, +{ + type Params = RelayToParachainBridge; + type Left = Left; + type Right = Right; + + fn common(&self) -> &Full2WayBridgeCommonParams { + &self.common + } + + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams { + &mut self.common + } + + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )> { + ::Finality::start_relay_guards( + &self.common.right.client, + self.common.right.client.can_start_version_guard(), + ) + .await?; + ::RelayFinality::start_relay_guards( + &self.common.left.client, + self.common.left.client.can_start_version_guard(), + ) + .await?; + + let left_to_right_on_demand_headers = + OnDemandHeadersRelay::<::Finality>::new( + self.common.left.client.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + self.common.shared.only_mandatory_headers, + None, + ); + let right_relay_to_left_on_demand_headers = + OnDemandHeadersRelay::<::RelayFinality>::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.only_mandatory_headers, + Some(self.common.metrics_params.clone()), + ); + let right_to_left_on_demand_parachains = OnDemandParachainsRelay::< + ::ParachainFinality, + >::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + Arc::new(right_relay_to_left_on_demand_headers), + ); + + Ok(( + Arc::new(left_to_right_on_demand_headers), + Arc::new(right_to_left_on_demand_parachains), + )) + } +} diff --git a/relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_relay.rs b/relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_relay.rs new file mode 100644 index 000000000000..11425035de28 --- /dev/null +++ b/relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_relay.rs @@ -0,0 +1,165 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +// we don't have any relay/standalone <> relay/standalone chain bridges, but we may need it in a +// future +#![allow(unused_macros)] + +use async_trait::async_trait; +use std::sync::Arc; + +use crate::cli::{ + bridge::{CliBridgeBase, MessagesCliBridge, RelayToRelayHeadersCliBridge}, + relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + CliChain, +}; +use relay_substrate_client::{AccountIdOf, AccountKeyPairOf, ChainWithTransactions}; +use sp_core::Pair; +use substrate_relay_helper::{ + finality::SubstrateFinalitySyncPipeline, + on_demand::{headers::OnDemandHeadersRelay, OnDemandRelay}, +}; + +/// A base relay between two standalone (relay) chains. +/// +/// Such relay starts 2 messages relay and 2 on-demand header relays. +pub struct RelayToRelayBridge< + L2R: MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: MessagesCliBridge + RelayToRelayHeadersCliBridge, +> { + /// Parameters that are shared by all bridge types. + pub common: + Full2WayBridgeCommonParams<::Target, ::Target>, +} + +macro_rules! declare_relay_to_relay_bridge_schema { + ($left_chain:ident, $right_chain:ident) => { + bp_runtime::paste::item! { + #[doc = $left_chain " and " $right_chain " headers+messages relay params."] + #[derive(Debug, PartialEq, StructOpt)] + pub struct [<$left_chain $right_chain HeadersAndMessages>] { + #[structopt(flatten)] + shared: HeadersAndMessagesSharedParams, + + #[structopt(flatten)] + left: [<$left_chain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the left chain + #[structopt(flatten)] + left_sign: [<$left_chain SigningParams>], + + #[structopt(flatten)] + right: [<$right_chain ConnectionParams>], + #[structopt(flatten)] + // default signer, which is always used to sign messages relay transactions on the right chain + right_sign: [<$right_chain SigningParams>], + } + + impl [<$left_chain $right_chain HeadersAndMessages>] { + async fn into_bridge< + Left: ChainWithTransactions + CliChain, + Right: ChainWithTransactions + CliChain, + L2R: CliBridgeBase + MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + MessagesCliBridge + RelayToRelayHeadersCliBridge, + >( + self, + ) -> anyhow::Result> { + Ok(RelayToRelayBridge { + common: Full2WayBridgeCommonParams::new::( + self.shared, + BridgeEndCommonParams { + client: self.left.into_client::().await?, + tx_params: self.left_sign.transaction_params::()?, + accounts: vec![], + }, + BridgeEndCommonParams { + client: self.right.into_client::().await?, + tx_params: self.right_sign.transaction_params::()?, + accounts: vec![], + }, + )?, + right_to_left_transaction_params: self.left_sign.transaction_params::(), + left_to_right_transaction_params: self.right_sign.transaction_params::(), + }) + } + } + } + }; +} + +#[async_trait] +impl< + Left: ChainWithTransactions + CliChain, + Right: ChainWithTransactions + CliChain, + L2R: CliBridgeBase + + MessagesCliBridge + + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + RelayToRelayHeadersCliBridge, + > Full2WayBridgeBase for RelayToRelayBridge +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, +{ + type Params = RelayToRelayBridge; + type Left = Left; + type Right = Right; + + fn common(&self) -> &Full2WayBridgeCommonParams { + &self.common + } + + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams { + &mut self.common + } + + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )> { + ::Finality::start_relay_guards( + &self.common.right.client, + self.common.right.client.can_start_version_guard(), + ) + .await?; + ::Finality::start_relay_guards( + &self.common.left.client, + self.common.left.client.can_start_version_guard(), + ) + .await?; + + let left_to_right_on_demand_headers = + OnDemandHeadersRelay::<::Finality>::new( + self.common.left.client.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + self.common.shared.only_mandatory_headers, + None, + ); + let right_to_left_on_demand_headers = + OnDemandHeadersRelay::<::Finality>::new( + self.common.right.client.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.only_mandatory_headers, + None, + ); + + Ok((Arc::new(left_to_right_on_demand_headers), Arc::new(right_to_left_on_demand_headers))) + } +} diff --git a/relays/bin-substrate/src/cli/relay_messages.rs b/relays/bin-substrate/src/cli/relay_messages.rs new file mode 100644 index 000000000000..b20725b53c74 --- /dev/null +++ b/relays/bin-substrate/src/cli/relay_messages.rs @@ -0,0 +1,136 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use async_trait::async_trait; +use sp_core::Pair; +use structopt::StructOpt; +use strum::VariantNames; + +use crate::bridges::{ + kusama_polkadot::{ + bridge_hub_kusama_messages_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge, + bridge_hub_polkadot_messages_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge, + }, + polkadot_bulletin::{ + bridge_hub_polkadot_messages_to_polkadot_bulletin::BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge, + polkadot_bulletin_messages_to_bridge_hub_polkadot::PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge, + }, + rococo_bulletin::{ + bridge_hub_rococo_messages_to_rococo_bulletin::BridgeHubRococoToRococoBulletinMessagesCliBridge, + rococo_bulletin_messages_to_bridge_hub_rococo::RococoBulletinToBridgeHubRococoMessagesCliBridge, + }, + rococo_westend::{ + bridge_hub_rococo_messages_to_bridge_hub_westend::BridgeHubRococoToBridgeHubWestendMessagesCliBridge, + bridge_hub_westend_messages_to_bridge_hub_rococo::BridgeHubWestendToBridgeHubRococoMessagesCliBridge, + }, +}; +use relay_substrate_client::{AccountIdOf, AccountKeyPairOf, BalanceOf, ChainWithTransactions}; +use substrate_relay_helper::{messages_lane::MessagesRelayParams, TransactionParams}; + +use crate::cli::{bridge::*, chain_schema::*, CliChain, HexLaneId, PrometheusParams}; + +/// Start messages relayer process. +#[derive(StructOpt)] +pub struct RelayMessages { + /// A bridge instance to relay messages for. + #[structopt(possible_values = FullBridge::VARIANTS, case_insensitive = true)] + bridge: FullBridge, + /// Hex-encoded lane id that should be served by the relay. Defaults to `00000000`. + #[structopt(long, default_value = "00000000")] + lane: HexLaneId, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + source_sign: SourceSigningParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +#[async_trait] +trait MessagesRelayer: MessagesCliBridge +where + Self::Source: ChainWithTransactions + CliChain, + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom>, +{ + async fn relay_messages(data: RelayMessages) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let source_sign = data.source_sign.to_keypair::()?; + let source_transactions_mortality = data.source_sign.transactions_mortality()?; + let target_client = data.target.into_client::().await?; + let target_sign = data.target_sign.to_keypair::()?; + let target_transactions_mortality = data.target_sign.transactions_mortality()?; + + substrate_relay_helper::messages_lane::run::(MessagesRelayParams { + source_client, + source_transaction_params: TransactionParams { + signer: source_sign, + mortality: source_transactions_mortality, + }, + target_client, + target_transaction_params: TransactionParams { + signer: target_sign, + mortality: target_transactions_mortality, + }, + source_to_target_headers_relay: None, + target_to_source_headers_relay: None, + lane_id: data.lane.into(), + limits: Self::maybe_messages_limits(), + metrics_params: data.prometheus_params.into_metrics_params()?, + }) + .await + .map_err(|e| anyhow::format_err!("{}", e)) + } +} + +impl MessagesRelayer for BridgeHubRococoToBridgeHubWestendMessagesCliBridge {} +impl MessagesRelayer for BridgeHubWestendToBridgeHubRococoMessagesCliBridge {} +impl MessagesRelayer for BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge {} +impl MessagesRelayer for BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge {} +impl MessagesRelayer for PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge {} +impl MessagesRelayer for BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge {} +impl MessagesRelayer for RococoBulletinToBridgeHubRococoMessagesCliBridge {} +impl MessagesRelayer for BridgeHubRococoToRococoBulletinMessagesCliBridge {} + +impl RelayMessages { + /// Run the command. + pub async fn run(self) -> anyhow::Result<()> { + match self.bridge { + FullBridge::BridgeHubRococoToBridgeHubWestend => + BridgeHubRococoToBridgeHubWestendMessagesCliBridge::relay_messages(self), + FullBridge::BridgeHubWestendToBridgeHubRococo => + BridgeHubWestendToBridgeHubRococoMessagesCliBridge::relay_messages(self), + FullBridge::BridgeHubKusamaToBridgeHubPolkadot => + BridgeHubKusamaToBridgeHubPolkadotMessagesCliBridge::relay_messages(self), + FullBridge::BridgeHubPolkadotToBridgeHubKusama => + BridgeHubPolkadotToBridgeHubKusamaMessagesCliBridge::relay_messages(self), + FullBridge::PolkadotBulletinToBridgeHubPolkadot => + PolkadotBulletinToBridgeHubPolkadotMessagesCliBridge::relay_messages(self), + FullBridge::BridgeHubPolkadotToPolkadotBulletin => + BridgeHubPolkadotToPolkadotBulletinMessagesCliBridge::relay_messages(self), + FullBridge::RococoBulletinToBridgeHubRococo => + RococoBulletinToBridgeHubRococoMessagesCliBridge::relay_messages(self), + FullBridge::BridgeHubRococoToRococoBulletin => + BridgeHubRococoToRococoBulletinMessagesCliBridge::relay_messages(self), + } + .await + } +} diff --git a/relays/bin-substrate/src/cli/relay_parachains.rs b/relays/bin-substrate/src/cli/relay_parachains.rs new file mode 100644 index 000000000000..1456dddf11e2 --- /dev/null +++ b/relays/bin-substrate/src/cli/relay_parachains.rs @@ -0,0 +1,143 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::bridges::{ + kusama_polkadot::{ + kusama_parachains_to_bridge_hub_polkadot::BridgeHubKusamaToBridgeHubPolkadotCliBridge, + polkadot_parachains_to_bridge_hub_kusama::BridgeHubPolkadotToBridgeHubKusamaCliBridge, + }, + polkadot_bulletin::polkadot_parachains_to_polkadot_bulletin::PolkadotToPolkadotBulletinCliBridge, + rococo_bulletin::rococo_parachains_to_rococo_bulletin::RococoToRococoBulletinCliBridge, + rococo_westend::{ + rococo_parachains_to_bridge_hub_westend::BridgeHubRococoToBridgeHubWestendCliBridge, + westend_parachains_to_bridge_hub_rococo::BridgeHubWestendToBridgeHubRococoCliBridge, + }, +}; +use async_std::sync::Mutex; +use async_trait::async_trait; +use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient}; +use relay_substrate_client::Parachain; +use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; +use std::sync::Arc; +use structopt::StructOpt; +use strum::{EnumString, EnumVariantNames, VariantNames}; +use substrate_relay_helper::{ + parachains::{source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter}, + TransactionParams, +}; + +use crate::cli::{ + bridge::{CliBridgeBase, ParachainToRelayHeadersCliBridge}, + chain_schema::*, + PrometheusParams, +}; + +/// Start parachain heads relayer process. +#[derive(StructOpt)] +pub struct RelayParachains { + /// A bridge instance to relay parachains heads for. + #[structopt(possible_values = RelayParachainsBridge::VARIANTS, case_insensitive = true)] + bridge: RelayParachainsBridge, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +/// Parachain heads relay bridge. +#[derive(Debug, EnumString, EnumVariantNames)] +#[strum(serialize_all = "kebab_case")] +pub enum RelayParachainsBridge { + KusamaToBridgeHubPolkadot, + PolkadotToBridgeHubKusama, + PolkadotToPolkadotBulletin, + RococoToRococoBulletin, + RococoToBridgeHubWestend, + WestendToBridgeHubRococo, +} + +#[async_trait] +trait ParachainsRelayer: ParachainToRelayHeadersCliBridge +where + ParachainsSource: + SourceClient>, + ParachainsTarget: + TargetClient>, + ::Source: Parachain, +{ + async fn relay_parachains(data: RelayParachains) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let source_client = ParachainsSource::::new( + source_client, + Arc::new(Mutex::new(AvailableHeader::Missing)), + ); + + let target_transaction_params = TransactionParams { + signer: data.target_sign.to_keypair::()?, + mortality: data.target_sign.target_transactions_mortality, + }; + let target_client = data.target.into_client::().await?; + let target_client = ParachainsTarget::::new( + target_client.clone(), + target_transaction_params, + ); + + let metrics_params: relay_utils::metrics::MetricsParams = + data.prometheus_params.into_metrics_params()?; + GlobalMetrics::new()?.register_and_spawn(&metrics_params.registry)?; + + parachains_relay::parachains_loop::run( + source_client, + target_client, + metrics_params, + futures::future::pending(), + ) + .await + .map_err(|e| anyhow::format_err!("{}", e)) + } +} + +impl ParachainsRelayer for BridgeHubRococoToBridgeHubWestendCliBridge {} +impl ParachainsRelayer for BridgeHubWestendToBridgeHubRococoCliBridge {} +impl ParachainsRelayer for BridgeHubKusamaToBridgeHubPolkadotCliBridge {} +impl ParachainsRelayer for BridgeHubPolkadotToBridgeHubKusamaCliBridge {} +impl ParachainsRelayer for PolkadotToPolkadotBulletinCliBridge {} +impl ParachainsRelayer for RococoToRococoBulletinCliBridge {} + +impl RelayParachains { + /// Run the command. + pub async fn run(self) -> anyhow::Result<()> { + match self.bridge { + RelayParachainsBridge::RococoToBridgeHubWestend => + BridgeHubRococoToBridgeHubWestendCliBridge::relay_parachains(self), + RelayParachainsBridge::WestendToBridgeHubRococo => + BridgeHubWestendToBridgeHubRococoCliBridge::relay_parachains(self), + RelayParachainsBridge::KusamaToBridgeHubPolkadot => + BridgeHubKusamaToBridgeHubPolkadotCliBridge::relay_parachains(self), + RelayParachainsBridge::PolkadotToBridgeHubKusama => + BridgeHubPolkadotToBridgeHubKusamaCliBridge::relay_parachains(self), + RelayParachainsBridge::PolkadotToPolkadotBulletin => + PolkadotToPolkadotBulletinCliBridge::relay_parachains(self), + RelayParachainsBridge::RococoToRococoBulletin => + RococoToRococoBulletinCliBridge::relay_parachains(self), + } + .await + } +} diff --git a/relays/bin-substrate/src/main.rs b/relays/bin-substrate/src/main.rs new file mode 100644 index 000000000000..33a423b07662 --- /dev/null +++ b/relays/bin-substrate/src/main.rs @@ -0,0 +1,29 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate-to-substrate relay entrypoint. + +#![warn(missing_docs)] + +mod bridges; +mod chains; +mod cli; + +fn main() { + let command = cli::parse_args(); + let run = command.run(); + async_std::task::block_on(run); +} diff --git a/relays/client-bridge-hub-kusama/Cargo.toml b/relays/client-bridge-hub-kusama/Cargo.toml new file mode 100644 index 000000000000..2eb175a2a8b0 --- /dev/null +++ b/relays/client-bridge-hub-kusama/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "relay-bridge-hub-kusama-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +relay-substrate-client = { path = "../client-substrate" } + +# Bridge dependencies + +bp-bridge-hub-kusama = { path = "../../primitives/chain-bridge-hub-kusama" } +bp-bridge-hub-polkadot = { path = "../../primitives/chain-bridge-hub-polkadot" } +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-parachains = { path = "../../primitives/parachains" } +bp-runtime = { path = "../../primitives/runtime" } +bp-polkadot = { path = "../../primitives/chain-polkadot" } + +bridge-runtime-common = { path = "../../bin/runtime-common" } + +# Substrate Dependencies + +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-bridge-hub-kusama/src/lib.rs b/relays/client-bridge-hub-kusama/src/lib.rs new file mode 100644 index 000000000000..f54f32f9bfeb --- /dev/null +++ b/relays/client-bridge-hub-kusama/src/lib.rs @@ -0,0 +1,164 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the BridgeHub-Kusama-Substrate parachain. + +use bp_bridge_hub_kusama::AVERAGE_BLOCK_INTERVAL; +use bp_messages::MessageNonce; +use bp_polkadot::SuffixedCommonSignedExtensionExt; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithMessages, ChainWithTransactions, ChainWithUtilityPallet, + Error as SubstrateError, MockedRuntimeUtilityPallet, SignParam, UnderlyingChainProvider, + UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount}; +use std::time::Duration; + +/// Re-export runtime wrapper +pub mod runtime_wrapper; +pub use runtime_wrapper as runtime; + +/// Kusama chain definition +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BridgeHubKusama; + +impl UnderlyingChainProvider for BridgeHubKusama { + type Chain = bp_bridge_hub_kusama::BridgeHubKusama; +} + +impl Chain for BridgeHubKusama { + const ID: ChainId = bp_runtime::BRIDGE_HUB_KUSAMA_CHAIN_ID; + const NAME: &'static str = "BridgeHubKusama"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_bridge_hub_kusama::BEST_FINALIZED_BRIDGE_HUB_KUSAMA_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = AVERAGE_BLOCK_INTERVAL; + + type SignedBlock = bp_bridge_hub_kusama::SignedBlock; + type Call = runtime::Call; +} + +impl ChainWithBalances for BridgeHubKusama { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + bp_bridge_hub_kusama::AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl ChainWithUtilityPallet for BridgeHubKusama { + type UtilityPallet = MockedRuntimeUtilityPallet; +} + +impl ChainWithTransactions for BridgeHubKusama { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = runtime::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + runtime::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + (((), ()), ((), ())), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(runtime::UncheckedExtrinsic::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| { + *address == bp_bridge_hub_kusama::Address::Id(signer.public().into()) + }) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} + +impl ChainWithMessages for BridgeHubKusama { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = + bp_bridge_hub_kusama::WITH_BRIDGE_HUB_KUSAMA_MESSAGES_PALLET_NAME; + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = + Some(bp_bridge_hub_kusama::WITH_BRIDGE_HUB_KUSAMA_RELAYERS_PALLET_NAME); + + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_kusama::TO_BRIDGE_HUB_KUSAMA_MESSAGE_DETAILS_METHOD; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_kusama::FROM_BRIDGE_HUB_KUSAMA_MESSAGE_DETAILS_METHOD; + + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_kusama::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_kusama::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; +} + +#[cfg(test)] +mod tests { + use super::*; + use relay_substrate_client::TransactionEra; + + #[test] + fn parse_transaction_works() { + let unsigned = UnsignedTransaction { + call: runtime::Call::System(relay_substrate_client::calls::SystemCall::remark( + b"Hello world!".to_vec(), + )) + .into(), + nonce: 777, + tip: 888, + era: TransactionEra::immortal(), + }; + let signed_transaction = BridgeHubKusama::sign_transaction( + SignParam { + spec_version: 42, + transaction_version: 50000, + genesis_hash: [42u8; 32].into(), + signer: sp_core::sr25519::Pair::from_seed_slice(&[1u8; 32]).unwrap(), + }, + unsigned.clone(), + ) + .unwrap(); + let parsed_transaction = BridgeHubKusama::parse_transaction(signed_transaction).unwrap(); + assert_eq!(parsed_transaction, unsigned); + } +} diff --git a/relays/client-bridge-hub-kusama/src/runtime_wrapper.rs b/relays/client-bridge-hub-kusama/src/runtime_wrapper.rs new file mode 100644 index 000000000000..96a5b4fe033c --- /dev/null +++ b/relays/client-bridge-hub-kusama/src/runtime_wrapper.rs @@ -0,0 +1,71 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types that are specific to the BridgeHubKusama runtime. +// TODO: regenerate me using `runtime-codegen` tool? (https://github.com/paritytech/parity-bridges-common/issues/1945) + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; + +pub use bp_bridge_hub_kusama::SignedExtension; +pub use bp_header_chain::BridgeGrandpaCallOf; +pub use bp_parachains::BridgeParachainCall; +pub use bridge_runtime_common::messages::BridgeMessagesCallOf; +pub use relay_substrate_client::calls::{SystemCall, UtilityCall}; + +/// Unchecked BridgeHubKusama extrinsic. +pub type UncheckedExtrinsic = bp_bridge_hub_kusama::UncheckedExtrinsic; + +// The indirect pallet call used to sync `Polkadot` GRANDPA finality to `BHKusama`. +pub type BridgePolkadotGrandpaCall = BridgeGrandpaCallOf; +// The indirect pallet call used to sync `BridgeHubPolkadot` messages to `BHKusama`. +pub type BridgePolkadotMessagesCall = + BridgeMessagesCallOf; + +/// `BridgeHubKusama` Runtime `Call` enum. +/// +/// The enum represents a subset of possible `Call`s we can send to `BridgeHubKusama` chain. +/// Ideally this code would be auto-generated from metadata, because we want to +/// avoid depending directly on the ENTIRE runtime just to get the encoding of `Dispatchable`s. +/// +/// All entries here (like pretty much in the entire file) must be kept in sync with +/// `BridgeHubKusama` `construct_runtime`, so that we maintain SCALE-compatibility. +#[allow(clippy::large_enum_variant)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub enum Call { + #[cfg(test)] + #[codec(index = 0)] + System(SystemCall), + /// Utility pallet. + #[codec(index = 40)] + Utility(UtilityCall), + + /// Polkadot bridge pallet. + #[codec(index = 51)] + BridgePolkadotGrandpa(BridgePolkadotGrandpaCall), + /// Polkadot parachain bridge pallet. + #[codec(index = 52)] + BridgePolkadotParachain(BridgeParachainCall), + /// Polkadot messages bridge pallet. + #[codec(index = 53)] + BridgePolkadotMessages(BridgePolkadotMessagesCall), +} + +impl From> for Call { + fn from(call: UtilityCall) -> Call { + Call::Utility(call) + } +} diff --git a/relays/client-bridge-hub-polkadot/Cargo.toml b/relays/client-bridge-hub-polkadot/Cargo.toml new file mode 100644 index 000000000000..3976652215a4 --- /dev/null +++ b/relays/client-bridge-hub-polkadot/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "relay-bridge-hub-polkadot-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +relay-substrate-client = { path = "../client-substrate" } + +# Bridge dependencies + +bp-bridge-hub-kusama = { path = "../../primitives/chain-bridge-hub-kusama" } +bp-bridge-hub-polkadot = { path = "../../primitives/chain-bridge-hub-polkadot" } +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-parachains = { path = "../../primitives/parachains" } +bp-polkadot-bulletin = { path = "../../primitives/chain-polkadot-bulletin" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-kusama = { path = "../../primitives/chain-kusama" } +bp-runtime = { path = "../../primitives/runtime" } + +bridge-runtime-common = { path = "../../bin/runtime-common" } + +# Substrate Dependencies + +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[dev-dependencies] +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-bridge-hub-polkadot/src/lib.rs b/relays/client-bridge-hub-polkadot/src/lib.rs new file mode 100644 index 000000000000..299bc4d736ae --- /dev/null +++ b/relays/client-bridge-hub-polkadot/src/lib.rs @@ -0,0 +1,162 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the BridgeHub-Polkadot-Substrate parachain. + +use bp_bridge_hub_polkadot::AVERAGE_BLOCK_INTERVAL; +use bp_messages::MessageNonce; +use bp_polkadot_core::SuffixedCommonSignedExtensionExt; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithMessages, ChainWithTransactions, ChainWithUtilityPallet, + Error as SubstrateError, MockedRuntimeUtilityPallet, SignParam, UnderlyingChainProvider, + UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount}; +use std::time::Duration; + +/// Re-export runtime wrapper +pub mod runtime_wrapper; +pub use runtime_wrapper as runtime; + +/// Polkadot chain definition +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BridgeHubPolkadot; + +impl UnderlyingChainProvider for BridgeHubPolkadot { + type Chain = bp_bridge_hub_polkadot::BridgeHubPolkadot; +} + +impl Chain for BridgeHubPolkadot { + const ID: ChainId = bp_runtime::BRIDGE_HUB_POLKADOT_CHAIN_ID; + const NAME: &'static str = "BridgeHubPolkadot"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_bridge_hub_polkadot::BEST_FINALIZED_BRIDGE_HUB_POLKADOT_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = AVERAGE_BLOCK_INTERVAL; + + type SignedBlock = bp_bridge_hub_polkadot::SignedBlock; + type Call = runtime::Call; +} + +impl ChainWithBalances for BridgeHubPolkadot { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + bp_bridge_hub_polkadot::AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl ChainWithUtilityPallet for BridgeHubPolkadot { + type UtilityPallet = MockedRuntimeUtilityPallet; +} + +impl ChainWithTransactions for BridgeHubPolkadot { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = runtime::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + runtime::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + (((), ()), ((), ())), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(runtime::UncheckedExtrinsic::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| { + *address == bp_bridge_hub_polkadot::Address::Id(signer.public().into()) + }) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} + +impl ChainWithMessages for BridgeHubPolkadot { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = + bp_bridge_hub_polkadot::WITH_BRIDGE_HUB_POLKADOT_MESSAGES_PALLET_NAME; + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = + Some(bp_bridge_hub_polkadot::WITH_BRIDGE_HUB_POLKADOT_RELAYERS_PALLET_NAME); + + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_polkadot::TO_BRIDGE_HUB_POLKADOT_MESSAGE_DETAILS_METHOD; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_polkadot::FROM_BRIDGE_HUB_POLKADOT_MESSAGE_DETAILS_METHOD; + + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_polkadot::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_polkadot::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; +} + +#[cfg(test)] +mod tests { + use super::*; + use relay_substrate_client::TransactionEra; + + #[test] + fn parse_transaction_works() { + let unsigned = UnsignedTransaction { + call: runtime::Call::System(runtime::SystemCall::remark(b"Hello world!".to_vec())) + .into(), + nonce: 777, + tip: 888, + era: TransactionEra::immortal(), + }; + let signed_transaction = BridgeHubPolkadot::sign_transaction( + SignParam { + spec_version: 42, + transaction_version: 50000, + genesis_hash: [42u8; 32].into(), + signer: sp_core::sr25519::Pair::from_seed_slice(&[1u8; 32]).unwrap(), + }, + unsigned.clone(), + ) + .unwrap(); + let parsed_transaction = BridgeHubPolkadot::parse_transaction(signed_transaction).unwrap(); + assert_eq!(parsed_transaction, unsigned); + } +} diff --git a/relays/client-bridge-hub-polkadot/src/runtime_wrapper.rs b/relays/client-bridge-hub-polkadot/src/runtime_wrapper.rs new file mode 100644 index 000000000000..ded177996df9 --- /dev/null +++ b/relays/client-bridge-hub-polkadot/src/runtime_wrapper.rs @@ -0,0 +1,130 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types that are specific to the BridgeHubPolkadot runtime. +// TODO: regenerate me using `runtime-codegen` tool? (https://github.com/paritytech/parity-bridges-common/issues/1945) + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; + +pub use bp_bridge_hub_polkadot::SignedExtension; +pub use bp_header_chain::BridgeGrandpaCallOf; +pub use bp_parachains::BridgeParachainCall; +pub use bridge_runtime_common::messages::BridgeMessagesCallOf; +pub use relay_substrate_client::calls::{SystemCall, UtilityCall}; + +/// Unchecked BridgeHubPolkadot extrinsic. +pub type UncheckedExtrinsic = bp_bridge_hub_polkadot::UncheckedExtrinsic; + +/// The indirect pallet call used to sync `Kusama` GRANDPA finality to `BHPolkadot`. +pub type BridgeKusamaGrandpaCall = BridgeGrandpaCallOf; +/// The indirect pallet call used to sync `BridgeHubKusama` messages to `BridgeHubPolkadot`. +pub type BridgeKusamaMessagesCall = BridgeMessagesCallOf; + +/// The indirect pallet call used to sync `PolkadotBulletin` GRANDPA finality to `BHPolkadot`. +pub type BridgePolkadotBulletinGrandpaCall = + BridgeGrandpaCallOf; +/// The indirect pallet call used to sync `PolkadotBulletin` messages to `BridgeHubPolkadot`. +pub type BridgePolkadotBulletinMessagesCall = + BridgeMessagesCallOf; + +/// `BridgeHubPolkadot` Runtime `Call` enum. +/// +/// The enum represents a subset of possible `Call`s we can send to `BridgeHubPolkadot` chain. +/// Ideally this code would be auto-generated from metadata, because we want to +/// avoid depending directly on the ENTIRE runtime just to get the encoding of `Dispatchable`s. +/// +/// All entries here (like pretty much in the entire file) must be kept in sync with +/// `BridgeHubPolkadot` `construct_runtime`, so that we maintain SCALE-compatibility. +#[allow(clippy::large_enum_variant)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub enum Call { + #[cfg(test)] + #[codec(index = 0)] + System(SystemCall), + /// Utility pallet. + #[codec(index = 40)] + Utility(UtilityCall), + + /// Kusama grandpa bridge pallet. + #[codec(index = 51)] + BridgeKusamaGrandpa(BridgeKusamaGrandpaCall), + /// Kusama parachains bridge pallet. + #[codec(index = 52)] + BridgeKusamaParachain(BridgeParachainCall), + /// Kusama messages bridge pallet. + #[codec(index = 53)] + BridgeKusamaMessages(BridgeKusamaMessagesCall), + + /// Polkadot Bulletin grandpa bridge pallet. + #[codec(index = 55)] + BridgePolkadotBulletinGrandpa(BridgePolkadotBulletinGrandpaCall), + /// Polkadot Bulletin messages bridge pallet. + #[codec(index = 56)] + BridgePolkadotBulletinMessages(BridgePolkadotBulletinMessagesCall), +} + +impl From> for Call { + fn from(call: UtilityCall) -> Call { + Call::Utility(call) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use bp_runtime::BasicOperatingMode; + use sp_consensus_grandpa::AuthorityList; + use sp_core::hexdisplay::HexDisplay; + use sp_runtime::traits::Header; + use std::str::FromStr; + + pub type RelayBlockNumber = bp_polkadot_core::BlockNumber; + pub type RelayBlockHasher = bp_polkadot_core::Hasher; + pub type RelayBlockHeader = sp_runtime::generic::Header; + + #[test] + fn encode_decode_calls() { + let header = RelayBlockHeader::new( + 75, + bp_polkadot_core::Hash::from_str( + "0xd2c0afaab32de0cb8f7f0d89217e37c5ea302c1ffb5a7a83e10d20f12c32874d", + ) + .expect("invalid value"), + bp_polkadot_core::Hash::from_str( + "0x92b965f0656a4e0e5fc0167da2d4b5ee72b3be2c1583c4c1e5236c8c12aa141b", + ) + .expect("invalid value"), + bp_polkadot_core::Hash::from_str( + "0xae4a25acf250d72ed02c149ecc7dd3c9ee976d41a2888fc551de8064521dc01d", + ) + .expect("invalid value"), + Default::default(), + ); + let init_data = bp_header_chain::InitializationData { + header: Box::new(header), + authority_list: AuthorityList::default(), + set_id: 6, + operating_mode: BasicOperatingMode::Normal, + }; + let call = BridgeKusamaGrandpaCall::initialize { init_data }; + let tx = Call::BridgeKusamaGrandpa(call); + + // encode call as hex string + let hex_encoded_call = format!("0x{:?}", HexDisplay::from(&Encode::encode(&tx))); + assert_eq!(hex_encoded_call, "0x3301ae4a25acf250d72ed02c149ecc7dd3c9ee976d41a2888fc551de8064521dc01d2d0192b965f0656a4e0e5fc0167da2d4b5ee72b3be2c1583c4c1e5236c8c12aa141bd2c0afaab32de0cb8f7f0d89217e37c5ea302c1ffb5a7a83e10d20f12c32874d0000060000000000000000"); + } +} diff --git a/relays/client-bridge-hub-rococo/Cargo.toml b/relays/client-bridge-hub-rococo/Cargo.toml new file mode 100644 index 000000000000..894965ababc7 --- /dev/null +++ b/relays/client-bridge-hub-rococo/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "relay-bridge-hub-rococo-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +subxt = { version = "0.32.1", default-features = false, features = [] } + +# Bridge dependencies + +bp-bridge-hub-rococo = { path = "../../primitives/chain-bridge-hub-rococo" } +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-parachains = { path = "../../primitives/parachains" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-runtime = { path = "../../primitives/runtime" } + +bridge-runtime-common = { path = "../../bin/runtime-common" } +relay-substrate-client = { path = "../client-substrate" } + +# Substrate Dependencies + +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-bridge-hub-rococo/src/codegen_runtime.rs b/relays/client-bridge-hub-rococo/src/codegen_runtime.rs new file mode 100644 index 000000000000..2afdeb248936 --- /dev/null +++ b/relays/client-bridge-hub-rococo/src/codegen_runtime.rs @@ -0,0 +1,4056 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated runtime API +//! THIS FILE WAS AUTOGENERATED USING parity-bridges-common::runtime-codegen +//! EXECUTED COMMAND: target/debug/runtime-codegen --from-wasm-file +//! /home/svyatonik/dev/polkadot-sdk/target/debug/wbuild/bridge-hub-rococo-runtime/ +//! bridge_hub_rococo_runtime.wasm + +#[allow(dead_code, unused_imports, non_camel_case_types)] +#[allow(clippy::all)] +#[allow(rustdoc::broken_intra_doc_links)] +pub mod api { + #[allow(unused_imports)] + mod root_mod { + pub use super::*; + } + pub mod runtime_types { + use super::runtime_types; + pub mod bounded_collections { + use super::runtime_types; + pub mod bounded_btree_set { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedBTreeSet<_0>(pub ::std::vec::Vec<_0>); + } + pub mod bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + pub mod weak_bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeakBoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + } + pub mod bp_header_chain { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AuthoritySet { + pub authorities: ::std::vec::Vec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub set_id: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum HeaderChainError { + #[codec(index = 0)] + UnknownHeader, + #[codec(index = 1)] + StorageProof(runtime_types::bp_runtime::storage_proof::Error), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeaderFinalityInfo<_0, _1> { + pub finality_proof: _0, + pub new_verification_context: ::core::option::Option<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredHeaderData<_0, _1> { + pub number: _0, + pub state_root: _1, + } + } + pub mod bp_messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DeliveredMessages { + pub begin: ::core::primitive::u64, + pub end: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundLaneData<_0> { + pub relayers: ::std::vec::Vec>, + pub last_confirmed_nonce: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LaneId(pub [::core::primitive::u8; 4usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MessageKey { + pub lane_id: runtime_types::bp_messages::LaneId, + pub nonce: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MessagesOperatingMode { + #[codec(index = 0)] + Basic(runtime_types::bp_runtime::BasicOperatingMode), + #[codec(index = 1)] + RejectingOutboundMessages, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundLaneData { + pub oldest_unpruned_nonce: ::core::primitive::u64, + pub latest_received_nonce: ::core::primitive::u64, + pub latest_generated_nonce: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReceivalResult<_0> { + #[codec(index = 0)] + Dispatched(runtime_types::bp_runtime::messages::MessageDispatchResult<_0>), + #[codec(index = 1)] + InvalidNonce, + #[codec(index = 2)] + TooManyUnrewardedRelayers, + #[codec(index = 3)] + TooManyUnconfirmedMessages, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReceivedMessages<_0> { + pub lane: runtime_types::bp_messages::LaneId, + pub receive_results: ::std::vec::Vec<( + ::core::primitive::u64, + runtime_types::bp_messages::ReceivalResult<_0>, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnrewardedRelayer<_0> { + pub relayer: _0, + pub messages: runtime_types::bp_messages::DeliveredMessages, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VerificationError { + #[codec(index = 0)] + EmptyMessageProof, + #[codec(index = 1)] + HeaderChain(runtime_types::bp_header_chain::HeaderChainError), + #[codec(index = 2)] + InboundLaneStorage(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 3)] + InvalidMessageWeight, + #[codec(index = 4)] + MessagesCountMismatch, + #[codec(index = 5)] + MessageStorage(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 6)] + MessageTooLarge, + #[codec(index = 7)] + OutboundLaneStorage(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 8)] + StorageProof(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 9)] + Other, + } + } + pub mod bp_parachains { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BestParaHeadHash { + pub at_relay_block_number: ::core::primitive::u32, + pub head_hash: ::subxt::utils::H256, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaInfo { + pub best_head_hash: runtime_types::bp_parachains::BestParaHeadHash, + pub next_imported_hash_position: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaStoredHeaderData(pub ::std::vec::Vec<::core::primitive::u8>); + } + pub mod bp_relayers { + use super::runtime_types; + pub mod registration { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Registration<_0, _1> { + pub valid_till: _0, + pub stake: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RewardsAccountOwner { + #[codec(index = 0)] + ThisChain, + #[codec(index = 1)] + BridgedChain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RewardsAccountParams { + pub lane_id: runtime_types::bp_messages::LaneId, + pub bridged_chain_id: [::core::primitive::u8; 4usize], + pub owner: runtime_types::bp_relayers::RewardsAccountOwner, + } + } + pub mod bp_runtime { + use super::runtime_types; + pub mod messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MessageDispatchResult<_0> { + pub unspent_weight: ::sp_weights::Weight, + pub dispatch_level_result: _0, + } + } + pub mod storage_proof { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DuplicateNodesInProof, + #[codec(index = 1)] + UnusedNodesInTheProof, + #[codec(index = 2)] + StorageRootMismatch, + #[codec(index = 3)] + StorageValueUnavailable, + #[codec(index = 4)] + StorageValueEmpty, + #[codec(index = 5)] + StorageValueDecodeFailed(runtime_types::bp_runtime::StrippableError), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BasicOperatingMode { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Halted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeaderId<_0, _1>(pub _1, pub _0); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OwnedBridgeModuleError { + #[codec(index = 0)] + Halted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StrippableError; + } + pub mod bridge_hub_rococo_runtime { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BridgeRejectObsoleteHeadersAndMessages; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginCaller { + #[codec(index = 0)] + system( + runtime_types::frame_support::dispatch::RawOrigin< + ::sp_core::crypto::AccountId32, + >, + ), + #[codec(index = 31)] + PolkadotXcm(runtime_types::pallet_xcm::pallet::Origin), + #[codec(index = 32)] + CumulusXcm(runtime_types::cumulus_pallet_xcm::pallet::Origin), + #[codec(index = 3)] + Void(runtime_types::sp_core::Void), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Runtime; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeCall { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Call), + #[codec(index = 1)] + ParachainSystem(runtime_types::cumulus_pallet_parachain_system::pallet::Call), + #[codec(index = 2)] + Timestamp(runtime_types::pallet_timestamp::pallet::Call), + #[codec(index = 10)] + Balances(runtime_types::pallet_balances::pallet::Call), + #[codec(index = 21)] + CollatorSelection(runtime_types::pallet_collator_selection::pallet::Call), + #[codec(index = 22)] + Session(runtime_types::pallet_session::pallet::Call), + #[codec(index = 30)] + XcmpQueue(runtime_types::cumulus_pallet_xcmp_queue::pallet::Call), + #[codec(index = 31)] + PolkadotXcm(runtime_types::pallet_xcm::pallet::Call), + #[codec(index = 40)] + Utility(runtime_types::pallet_utility::pallet::Call), + #[codec(index = 36)] + Multisig(runtime_types::pallet_multisig::pallet::Call), + #[codec(index = 48)] + BridgeWestendGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Call), + #[codec(index = 60)] + BridgePolkadotBulletinGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Call2), + #[codec(index = 49)] + BridgeWestendParachains(runtime_types::pallet_bridge_parachains::pallet::Call), + #[codec(index = 51)] + BridgeWestendMessages(runtime_types::pallet_bridge_messages::pallet::Call), + #[codec(index = 61)] + BridgePolkadotBulletinMessages( + runtime_types::pallet_bridge_messages::pallet::Call2, + ), + #[codec(index = 47)] + BridgeRelayers(runtime_types::pallet_bridge_relayers::pallet::Call), + #[codec(index = 250)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Call), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeError { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Error), + #[codec(index = 1)] + ParachainSystem(runtime_types::cumulus_pallet_parachain_system::pallet::Error), + #[codec(index = 10)] + Balances(runtime_types::pallet_balances::pallet::Error), + #[codec(index = 21)] + CollatorSelection(runtime_types::pallet_collator_selection::pallet::Error), + #[codec(index = 22)] + Session(runtime_types::pallet_session::pallet::Error), + #[codec(index = 30)] + XcmpQueue(runtime_types::cumulus_pallet_xcmp_queue::pallet::Error), + #[codec(index = 31)] + PolkadotXcm(runtime_types::pallet_xcm::pallet::Error), + #[codec(index = 40)] + Utility(runtime_types::pallet_utility::pallet::Error), + #[codec(index = 36)] + Multisig(runtime_types::pallet_multisig::pallet::Error), + #[codec(index = 48)] + BridgeWestendGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Error), + #[codec(index = 52)] + BridgePolkadotBulletinGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Error2), + #[codec(index = 49)] + BridgeWestendParachains(runtime_types::pallet_bridge_parachains::pallet::Error), + #[codec(index = 51)] + BridgeWestendMessages(runtime_types::pallet_bridge_messages::pallet::Error), + #[codec(index = 53)] + BridgePolkadotBulletinMessages( + runtime_types::pallet_bridge_messages::pallet::Error2, + ), + #[codec(index = 47)] + BridgeRelayers(runtime_types::pallet_bridge_relayers::pallet::Error), + #[codec(index = 250)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Error), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeEvent { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Event), + #[codec(index = 1)] + ParachainSystem(runtime_types::cumulus_pallet_parachain_system::pallet::Event), + #[codec(index = 10)] + Balances(runtime_types::pallet_balances::pallet::Event), + #[codec(index = 11)] + TransactionPayment(runtime_types::pallet_transaction_payment::pallet::Event), + #[codec(index = 21)] + CollatorSelection(runtime_types::pallet_collator_selection::pallet::Event), + #[codec(index = 22)] + Session(runtime_types::pallet_session::pallet::Event), + #[codec(index = 30)] + XcmpQueue(runtime_types::cumulus_pallet_xcmp_queue::pallet::Event), + #[codec(index = 31)] + PolkadotXcm(runtime_types::pallet_xcm::pallet::Event), + #[codec(index = 32)] + CumulusXcm(runtime_types::cumulus_pallet_xcm::pallet::Event), + #[codec(index = 40)] + Utility(runtime_types::pallet_utility::pallet::Event), + #[codec(index = 36)] + Multisig(runtime_types::pallet_multisig::pallet::Event), + #[codec(index = 48)] + BridgeWestendGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Event), + #[codec(index = 52)] + BridgePolkadotBulletinGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Event2), + #[codec(index = 49)] + BridgeWestendParachains(runtime_types::pallet_bridge_parachains::pallet::Event), + #[codec(index = 51)] + BridgeWestendMessages(runtime_types::pallet_bridge_messages::pallet::Event), + #[codec(index = 53)] + BridgePolkadotBulletinMessages( + runtime_types::pallet_bridge_messages::pallet::Event2, + ), + #[codec(index = 47)] + BridgeRelayers(runtime_types::pallet_bridge_relayers::pallet::Event), + #[codec(index = 250)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Event), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeHoldReason {} + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionKeys { + pub aura: runtime_types::sp_consensus_aura::sr25519::app_sr25519::Public, + } + } + pub mod bridge_runtime_common { + use super::runtime_types; + pub mod messages_xcm_extension { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum XcmBlobMessageDispatchResult { + #[codec(index = 0)] + InvalidPayload, + #[codec(index = 1)] + Dispatched, + #[codec(index = 2)] + NotDispatched, + } + } + pub mod refund_relayer_extension { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RefundBridgedGrandpaMessages; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RefundBridgedParachainMessages; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RefundSignedExtensionAdapter<_0>(pub _0); + } + } + pub mod cumulus_pallet_parachain_system { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] set_validation_data { data : runtime_types :: cumulus_primitives_parachain_inherent :: ParachainInherentData , } , # [codec (index = 1)] sudo_send_upward_message { message : :: std :: vec :: Vec < :: core :: primitive :: u8 > , } , # [codec (index = 2)] authorize_upgrade { code_hash : :: subxt :: utils :: H256 , check_version : :: core :: primitive :: bool , } , # [codec (index = 3)] enact_authorized_upgrade { code : :: std :: vec :: Vec < :: core :: primitive :: u8 > , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + OverlappingUpgrades, + #[codec(index = 1)] + ProhibitedByPolkadot, + #[codec(index = 2)] + TooBig, + #[codec(index = 3)] + ValidationDataNotAvailable, + #[codec(index = 4)] + HostConfigurationNotAvailable, + #[codec(index = 5)] + NotScheduled, + #[codec(index = 6)] + NothingAuthorized, + #[codec(index = 7)] + Unauthorized, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ValidationFunctionStored, + #[codec(index = 1)] + ValidationFunctionApplied { relay_chain_block_num: ::core::primitive::u32 }, + #[codec(index = 2)] + ValidationFunctionDiscarded, + #[codec(index = 3)] + UpgradeAuthorized { code_hash: ::subxt::utils::H256 }, + #[codec(index = 4)] + DownwardMessagesReceived { count: ::core::primitive::u32 }, + #[codec(index = 5)] + DownwardMessagesProcessed { + weight_used: ::sp_weights::Weight, + dmq_head: ::subxt::utils::H256, + }, + #[codec(index = 6)] + UpwardMessageSent { + message_hash: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + } + } + pub mod relay_state_snapshot { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MessagingStateSnapshot { pub dmq_mqc_head : :: subxt :: utils :: H256 , pub relay_dispatch_queue_remaining_capacity : runtime_types :: cumulus_pallet_parachain_system :: relay_state_snapshot :: RelayDispatchQueueRemainingCapacity , pub ingress_channels : :: std :: vec :: Vec < (runtime_types :: polkadot_parachain_primitives :: primitives :: Id , runtime_types :: polkadot_primitives :: v6 :: AbridgedHrmpChannel ,) > , pub egress_channels : :: std :: vec :: Vec < (runtime_types :: polkadot_parachain_primitives :: primitives :: Id , runtime_types :: polkadot_primitives :: v6 :: AbridgedHrmpChannel ,) > , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RelayDispatchQueueRemainingCapacity { + pub remaining_count: ::core::primitive::u32, + pub remaining_size: ::core::primitive::u32, + } + } + pub mod unincluded_segment { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Ancestor < _0 > { pub used_bandwidth : runtime_types :: cumulus_pallet_parachain_system :: unincluded_segment :: UsedBandwidth , pub para_head_hash : :: core :: option :: Option < _0 > , pub consumed_go_ahead_signal : :: core :: option :: Option < runtime_types :: polkadot_primitives :: v6 :: UpgradeGoAhead > , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannelUpdate { + pub msg_count: ::core::primitive::u32, + pub total_bytes: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SegmentTracker < _0 > { pub used_bandwidth : runtime_types :: cumulus_pallet_parachain_system :: unincluded_segment :: UsedBandwidth , pub hrmp_watermark : :: core :: option :: Option < :: core :: primitive :: u32 > , pub consumed_go_ahead_signal : :: core :: option :: Option < runtime_types :: polkadot_primitives :: v6 :: UpgradeGoAhead > , # [codec (skip)] pub __subxt_unused_type_params : :: core :: marker :: PhantomData < _0 > } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UsedBandwidth { pub ump_msg_count : :: core :: primitive :: u32 , pub ump_total_bytes : :: core :: primitive :: u32 , pub hrmp_outgoing : :: subxt :: utils :: KeyedVec < runtime_types :: polkadot_parachain_primitives :: primitives :: Id , runtime_types :: cumulus_pallet_parachain_system :: unincluded_segment :: HrmpChannelUpdate > , } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CodeUpgradeAuthorization { + pub code_hash: ::subxt::utils::H256, + pub check_version: ::core::primitive::bool, + } + } + pub mod cumulus_pallet_xcm { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + InvalidFormat([::core::primitive::u8; 32usize]), + #[codec(index = 1)] + UnsupportedVersion([::core::primitive::u8; 32usize]), + #[codec(index = 2)] + ExecutedDownward( + [::core::primitive::u8; 32usize], + runtime_types::xcm::v3::traits::Outcome, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Relay, + #[codec(index = 1)] + SiblingParachain(runtime_types::polkadot_parachain_primitives::primitives::Id), + } + } + } + pub mod cumulus_pallet_xcmp_queue { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 1)] + suspend_xcm_execution, + #[codec(index = 2)] + resume_xcm_execution, + #[codec(index = 3)] + update_suspend_threshold { new: ::core::primitive::u32 }, + #[codec(index = 4)] + update_drop_threshold { new: ::core::primitive::u32 }, + #[codec(index = 5)] + update_resume_threshold { new: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + BadQueueConfig, + #[codec(index = 1)] + AlreadySuspended, + #[codec(index = 2)] + AlreadyResumed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + XcmpMessageSent { message_hash: [::core::primitive::u8; 32usize] }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundChannelDetails { + pub recipient: runtime_types::polkadot_parachain_primitives::primitives::Id, + pub state: runtime_types::cumulus_pallet_xcmp_queue::OutboundState, + pub signals_exist: ::core::primitive::bool, + pub first_index: ::core::primitive::u16, + pub last_index: ::core::primitive::u16, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OutboundState { + #[codec(index = 0)] + Ok, + #[codec(index = 1)] + Suspended, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueueConfigData { + pub suspend_threshold: ::core::primitive::u32, + pub drop_threshold: ::core::primitive::u32, + pub resume_threshold: ::core::primitive::u32, + pub threshold_weight: ::sp_weights::Weight, + pub weight_restrict_decay: ::sp_weights::Weight, + pub xcmp_max_individual_weight: ::sp_weights::Weight, + } + } + pub mod cumulus_primitives_core { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AggregateMessageOrigin { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + Parent, + #[codec(index = 2)] + Sibling(runtime_types::polkadot_parachain_primitives::primitives::Id), + } + } + pub mod cumulus_primitives_parachain_inherent { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MessageQueueChain(pub ::subxt::utils::H256); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParachainInherentData { + pub validation_data: + runtime_types::polkadot_primitives::v6::PersistedValidationData< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + pub relay_chain_state: runtime_types::sp_trie::storage_proof::StorageProof, + pub downward_messages: ::std::vec::Vec< + runtime_types::polkadot_core_primitives::InboundDownwardMessage< + ::core::primitive::u32, + >, + >, + pub horizontal_messages: ::subxt::utils::KeyedVec< + runtime_types::polkadot_parachain_primitives::primitives::Id, + ::std::vec::Vec< + runtime_types::polkadot_core_primitives::InboundHrmpMessage< + ::core::primitive::u32, + >, + >, + >, + } + } + pub mod finality_grandpa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Commit<_0, _1, _2, _3> { + pub target_hash: _0, + pub target_number: _1, + pub precommits: ::std::vec::Vec< + runtime_types::finality_grandpa::SignedPrecommit<_0, _1, _2, _3>, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Precommit<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SignedPrecommit<_0, _1, _2, _3> { + pub precommit: runtime_types::finality_grandpa::Precommit<_0, _1>, + pub signature: _2, + pub id: _3, + } + } + pub mod frame_support { + use super::runtime_types; + pub mod dispatch { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchClass { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Operational, + #[codec(index = 2)] + Mandatory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchInfo { + pub weight: ::sp_weights::Weight, + pub class: runtime_types::frame_support::dispatch::DispatchClass, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Pays { + #[codec(index = 0)] + Yes, + #[codec(index = 1)] + No, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PerDispatchClass<_0> { + pub normal: _0, + pub operational: _0, + pub mandatory: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RawOrigin<_0> { + #[codec(index = 0)] + Root, + #[codec(index = 1)] + Signed(_0), + #[codec(index = 2)] + None, + } + } + pub mod traits { + use super::runtime_types; + pub mod messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProcessMessageError { + #[codec(index = 0)] + BadFormat, + #[codec(index = 1)] + Corrupt, + #[codec(index = 2)] + Unsupported, + #[codec(index = 3)] + Overweight(::sp_weights::Weight), + #[codec(index = 4)] + Yield, + } + } + pub mod tokens { + use super::runtime_types; + pub mod misc { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum BalanceStatus { + #[codec(index = 0)] + Free, + #[codec(index = 1)] + Reserved, + } + } + } + } + } + pub mod frame_system { + use super::runtime_types; + pub mod extensions { + use super::runtime_types; + pub mod check_genesis { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckGenesis; + } + pub mod check_mortality { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckMortality(pub ::sp_runtime::generic::Era); + } + pub mod check_non_zero_sender { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonZeroSender; + } + pub mod check_nonce { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonce(#[codec(compact)] pub ::core::primitive::u32); + } + pub mod check_spec_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckSpecVersion; + } + pub mod check_tx_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckTxVersion; + } + pub mod check_weight { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckWeight; + } + } + pub mod limits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockLength { + pub max: runtime_types::frame_support::dispatch::PerDispatchClass< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockWeights { + pub base_block: ::sp_weights::Weight, + pub max_block: ::sp_weights::Weight, + pub per_class: runtime_types::frame_support::dispatch::PerDispatchClass< + runtime_types::frame_system::limits::WeightsPerClass, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeightsPerClass { + pub base_extrinsic: ::sp_weights::Weight, + pub max_extrinsic: ::core::option::Option<::sp_weights::Weight>, + pub max_total: ::core::option::Option<::sp_weights::Weight>, + pub reserved: ::core::option::Option<::sp_weights::Weight>, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + remark { remark: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + set_heap_pages { pages: ::core::primitive::u64 }, + #[codec(index = 2)] + set_code { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 3)] + set_code_without_checks { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + set_storage { + items: ::std::vec::Vec<( + ::std::vec::Vec<::core::primitive::u8>, + ::std::vec::Vec<::core::primitive::u8>, + )>, + }, + #[codec(index = 5)] + kill_storage { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>> }, + #[codec(index = 6)] + kill_prefix { + prefix: ::std::vec::Vec<::core::primitive::u8>, + subkeys: ::core::primitive::u32, + }, + #[codec(index = 7)] + remark_with_event { remark: ::std::vec::Vec<::core::primitive::u8> }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidSpecName, + #[codec(index = 1)] + SpecVersionNeedsToIncrease, + #[codec(index = 2)] + FailedToExtractRuntimeVersion, + #[codec(index = 3)] + NonDefaultComposite, + #[codec(index = 4)] + NonZeroRefCount, + #[codec(index = 5)] + CallFiltered, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ExtrinsicSuccess { + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 1)] + ExtrinsicFailed { + dispatch_error: runtime_types::sp_runtime::DispatchError, + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 2)] + CodeUpdated, + #[codec(index = 3)] + NewAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + KilledAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Remarked { sender: ::sp_core::crypto::AccountId32, hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountInfo<_0, _1> { + pub nonce: _0, + pub consumers: ::core::primitive::u32, + pub providers: ::core::primitive::u32, + pub sufficients: ::core::primitive::u32, + pub data: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EventRecord<_0, _1> { + pub phase: runtime_types::frame_system::Phase, + pub event: _0, + pub topics: ::std::vec::Vec<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LastRuntimeUpgradeInfo { + #[codec(compact)] + pub spec_version: ::core::primitive::u32, + pub spec_name: ::std::string::String, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase { + #[codec(index = 0)] + ApplyExtrinsic(::core::primitive::u32), + #[codec(index = 1)] + Finalization, + #[codec(index = 2)] + Initialization, + } + } + pub mod pallet_balances { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + transfer_allow_death { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 2)] + force_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + transfer_keep_alive { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + transfer_all { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + keep_alive: ::core::primitive::bool, + }, + #[codec(index = 5)] + force_unreserve { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + upgrade_accounts { who: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 8)] + force_set_balance { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + VestingBalance, + #[codec(index = 1)] + LiquidityRestrictions, + #[codec(index = 2)] + InsufficientBalance, + #[codec(index = 3)] + ExistentialDeposit, + #[codec(index = 4)] + Expendability, + #[codec(index = 5)] + ExistingVestingSchedule, + #[codec(index = 6)] + DeadAccount, + #[codec(index = 7)] + TooManyReserves, + #[codec(index = 8)] + TooManyHolds, + #[codec(index = 9)] + TooManyFreezes, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Endowed { + account: ::sp_core::crypto::AccountId32, + free_balance: ::core::primitive::u128, + }, + #[codec(index = 1)] + DustLost { + account: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Transfer { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + BalanceSet { + who: ::sp_core::crypto::AccountId32, + free: ::core::primitive::u128, + }, + #[codec(index = 4)] + Reserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + Unreserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + ReserveRepatriated { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + destination_status: + runtime_types::frame_support::traits::tokens::misc::BalanceStatus, + }, + #[codec(index = 7)] + Deposit { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 8)] + Withdraw { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Slashed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 10)] + Minted { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 11)] + Burned { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 12)] + Suspended { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 13)] + Restored { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 14)] + Upgraded { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 15)] + Issued { amount: ::core::primitive::u128 }, + #[codec(index = 16)] + Rescinded { amount: ::core::primitive::u128 }, + #[codec(index = 17)] + Locked { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 18)] + Unlocked { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 19)] + Frozen { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 20)] + Thawed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountData<_0> { + pub free: _0, + pub reserved: _0, + pub frozen: _0, + pub flags: runtime_types::pallet_balances::types::ExtraFlags, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BalanceLock<_0> { + pub id: [::core::primitive::u8; 8usize], + pub amount: _0, + pub reasons: runtime_types::pallet_balances::types::Reasons, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ExtraFlags(pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdAmount<_0, _1> { + pub id: _0, + pub amount: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Reasons { + #[codec(index = 0)] + Fee, + #[codec(index = 1)] + Misc, + #[codec(index = 2)] + All, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReserveData<_0, _1> { + pub id: _0, + pub amount: _1, + } + } + } + pub mod pallet_bridge_grandpa { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + submit_finality_proof { + finality_target: ::std::boxed::Box< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + justification: ::bp_header_chain::justification::GrandpaJustification< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + #[codec(index = 1)] + initialize { + init_data: ::bp_header_chain::InitializationData< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + #[codec(index = 2)] + set_owner { new_owner: ::core::option::Option<::sp_core::crypto::AccountId32> }, + #[codec(index = 3)] + set_operating_mode { + operating_mode: runtime_types::bp_runtime::BasicOperatingMode, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call2 { + #[codec(index = 0)] + submit_finality_proof { + finality_target: ::std::boxed::Box< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + justification: ::bp_header_chain::justification::GrandpaJustification< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + #[codec(index = 1)] + initialize { + init_data: ::bp_header_chain::InitializationData< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + #[codec(index = 2)] + set_owner { new_owner: ::core::option::Option<::sp_core::crypto::AccountId32> }, + #[codec(index = 3)] + set_operating_mode { + operating_mode: runtime_types::bp_runtime::BasicOperatingMode, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidJustification, + #[codec(index = 1)] + InvalidAuthoritySet, + #[codec(index = 2)] + OldHeader, + #[codec(index = 3)] + UnsupportedScheduledChange, + #[codec(index = 4)] + NotInitialized, + #[codec(index = 5)] + AlreadyInitialized, + #[codec(index = 6)] + TooManyAuthoritiesInSet, + #[codec(index = 7)] + BridgeModule(runtime_types::bp_runtime::OwnedBridgeModuleError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error2 { + #[codec(index = 0)] + InvalidJustification, + #[codec(index = 1)] + InvalidAuthoritySet, + #[codec(index = 2)] + OldHeader, + #[codec(index = 3)] + UnsupportedScheduledChange, + #[codec(index = 4)] + NotInitialized, + #[codec(index = 5)] + AlreadyInitialized, + #[codec(index = 6)] + TooManyAuthoritiesInSet, + #[codec(index = 7)] + BridgeModule(runtime_types::bp_runtime::OwnedBridgeModuleError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + UpdatedBestFinalizedHeader { + number: ::core::primitive::u32, + hash: ::subxt::utils::H256, + grandpa_info: runtime_types::bp_header_chain::HeaderFinalityInfo< + ::bp_header_chain::justification::GrandpaJustification< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + runtime_types::bp_header_chain::AuthoritySet, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event2 { + #[codec(index = 0)] + UpdatedBestFinalizedHeader { + number: ::core::primitive::u32, + hash: ::subxt::utils::H256, + grandpa_info: runtime_types::bp_header_chain::HeaderFinalityInfo< + ::bp_header_chain::justification::GrandpaJustification< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + runtime_types::bp_header_chain::AuthoritySet, + >, + }, + } + } + pub mod storage_types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredAuthoritySet { + pub authorities: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub set_id: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredAuthoritySet2 { + pub authorities: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub set_id: ::core::primitive::u64, + } + } + } + pub mod pallet_bridge_messages { + use super::runtime_types; + pub mod outbound_lane { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReceivalConfirmationError { + #[codec(index = 0)] + FailedToConfirmFutureMessages, + #[codec(index = 1)] + EmptyUnrewardedRelayerEntry, + #[codec(index = 2)] + NonConsecutiveUnrewardedRelayerEntries, + #[codec(index = 3)] + TryingToConfirmMoreMessagesThanExpected, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] set_owner { new_owner : :: core :: option :: Option < :: sp_core :: crypto :: AccountId32 > , } , # [codec (index = 1)] set_operating_mode { operating_mode : runtime_types :: bp_messages :: MessagesOperatingMode , } , # [codec (index = 2)] receive_messages_proof { relayer_id_at_bridged_chain : :: sp_core :: crypto :: AccountId32 , proof : :: bridge_runtime_common :: messages :: target :: FromBridgedChainMessagesProof < :: subxt :: utils :: H256 > , messages_count : :: core :: primitive :: u32 , dispatch_weight : :: sp_weights :: Weight , } , # [codec (index = 3)] receive_messages_delivery_proof { proof : :: bridge_runtime_common :: messages :: source :: FromBridgedChainMessagesDeliveryProof < :: subxt :: utils :: H256 > , relayers_state : :: bp_messages :: UnrewardedRelayersState , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call2 { + # [codec (index = 0)] set_owner { new_owner : :: core :: option :: Option < :: sp_core :: crypto :: AccountId32 > , } , # [codec (index = 1)] set_operating_mode { operating_mode : runtime_types :: bp_messages :: MessagesOperatingMode , } , # [codec (index = 2)] receive_messages_proof { relayer_id_at_bridged_chain : :: sp_core :: crypto :: AccountId32 , proof : :: bridge_runtime_common :: messages :: target :: FromBridgedChainMessagesProof < :: subxt :: utils :: H256 > , messages_count : :: core :: primitive :: u32 , dispatch_weight : :: sp_weights :: Weight , } , # [codec (index = 3)] receive_messages_delivery_proof { proof : :: bridge_runtime_common :: messages :: source :: FromBridgedChainMessagesDeliveryProof < :: subxt :: utils :: H256 > , relayers_state : :: bp_messages :: UnrewardedRelayersState , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + # [codec (index = 0)] NotOperatingNormally , # [codec (index = 1)] InactiveOutboundLane , # [codec (index = 2)] MessageDispatchInactive , # [codec (index = 3)] MessageRejectedByChainVerifier (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 4)] MessageRejectedByLaneVerifier (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 5)] MessageRejectedByPallet (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 6)] FailedToWithdrawMessageFee , # [codec (index = 7)] TooManyMessagesInTheProof , # [codec (index = 8)] InvalidMessagesProof , # [codec (index = 9)] InvalidMessagesDeliveryProof , # [codec (index = 10)] InvalidUnrewardedRelayersState , # [codec (index = 11)] InsufficientDispatchWeight , # [codec (index = 12)] MessageIsNotYetSent , # [codec (index = 13)] ReceivalConfirmation (runtime_types :: pallet_bridge_messages :: outbound_lane :: ReceivalConfirmationError ,) , # [codec (index = 14)] BridgeModule (runtime_types :: bp_runtime :: OwnedBridgeModuleError ,) , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error2 { + # [codec (index = 0)] NotOperatingNormally , # [codec (index = 1)] InactiveOutboundLane , # [codec (index = 2)] MessageDispatchInactive , # [codec (index = 3)] MessageRejectedByChainVerifier (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 4)] MessageRejectedByLaneVerifier (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 5)] MessageRejectedByPallet (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 6)] FailedToWithdrawMessageFee , # [codec (index = 7)] TooManyMessagesInTheProof , # [codec (index = 8)] InvalidMessagesProof , # [codec (index = 9)] InvalidMessagesDeliveryProof , # [codec (index = 10)] InvalidUnrewardedRelayersState , # [codec (index = 11)] InsufficientDispatchWeight , # [codec (index = 12)] MessageIsNotYetSent , # [codec (index = 13)] ReceivalConfirmation (runtime_types :: pallet_bridge_messages :: outbound_lane :: ReceivalConfirmationError ,) , # [codec (index = 14)] BridgeModule (runtime_types :: bp_runtime :: OwnedBridgeModuleError ,) , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + # [codec (index = 0)] MessageAccepted { lane_id : runtime_types :: bp_messages :: LaneId , nonce : :: core :: primitive :: u64 , } , # [codec (index = 1)] MessagesReceived (:: std :: vec :: Vec < runtime_types :: bp_messages :: ReceivedMessages < runtime_types :: bridge_runtime_common :: messages_xcm_extension :: XcmBlobMessageDispatchResult > > ,) , # [codec (index = 2)] MessagesDelivered { lane_id : runtime_types :: bp_messages :: LaneId , messages : runtime_types :: bp_messages :: DeliveredMessages , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event2 { + # [codec (index = 0)] MessageAccepted { lane_id : runtime_types :: bp_messages :: LaneId , nonce : :: core :: primitive :: u64 , } , # [codec (index = 1)] MessagesReceived (:: std :: vec :: Vec < runtime_types :: bp_messages :: ReceivedMessages < runtime_types :: bridge_runtime_common :: messages_xcm_extension :: XcmBlobMessageDispatchResult > > ,) , # [codec (index = 2)] MessagesDelivered { lane_id : runtime_types :: bp_messages :: LaneId , messages : runtime_types :: bp_messages :: DeliveredMessages , } , } + } + } + pub mod pallet_bridge_parachains { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + submit_parachain_heads { + at_relay_block: (::core::primitive::u32, ::subxt::utils::H256), + parachains: ::std::vec::Vec<( + ::bp_polkadot_core::parachains::ParaId, + ::subxt::utils::H256, + )>, + parachain_heads_proof: ::bp_polkadot_core::parachains::ParaHeadsProof, + }, + #[codec(index = 1)] + set_owner { new_owner: ::core::option::Option<::sp_core::crypto::AccountId32> }, + #[codec(index = 2)] + set_operating_mode { + operating_mode: runtime_types::bp_runtime::BasicOperatingMode, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnknownRelayChainBlock, + #[codec(index = 1)] + InvalidRelayChainBlockNumber, + #[codec(index = 2)] + HeaderChainStorageProof(runtime_types::bp_header_chain::HeaderChainError), + #[codec(index = 3)] + BridgeModule(runtime_types::bp_runtime::OwnedBridgeModuleError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + UntrackedParachainRejected { parachain: ::bp_polkadot_core::parachains::ParaId }, + #[codec(index = 1)] + MissingParachainHead { parachain: ::bp_polkadot_core::parachains::ParaId }, + #[codec(index = 2)] + IncorrectParachainHeadHash { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + actual_parachain_head_hash: ::subxt::utils::H256, + }, + #[codec(index = 3)] + RejectedObsoleteParachainHead { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + }, + #[codec(index = 4)] + RejectedLargeParachainHead { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + parachain_head_size: ::core::primitive::u32, + }, + #[codec(index = 5)] + UpdatedParachainHead { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + }, + } + } + } + pub mod pallet_bridge_relayers { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim_rewards { + rewards_account_params: runtime_types::bp_relayers::RewardsAccountParams, + }, + #[codec(index = 1)] + register { valid_till: ::core::primitive::u32 }, + #[codec(index = 2)] + deregister, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NoRewardForRelayer, + #[codec(index = 1)] + FailedToPayReward, + #[codec(index = 2)] + InvalidRegistrationLease, + #[codec(index = 3)] + CannotReduceRegistrationLease, + #[codec(index = 4)] + FailedToReserve, + #[codec(index = 5)] + FailedToUnreserve, + #[codec(index = 6)] + NotRegistered, + #[codec(index = 7)] + RegistrationIsStillActive, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + RewardRegistered { + relayer: ::sp_core::crypto::AccountId32, + rewards_account_params: runtime_types::bp_relayers::RewardsAccountParams, + reward: ::core::primitive::u128, + }, + #[codec(index = 1)] + RewardPaid { + relayer: ::sp_core::crypto::AccountId32, + rewards_account_params: runtime_types::bp_relayers::RewardsAccountParams, + reward: ::core::primitive::u128, + }, + #[codec(index = 2)] + RegistrationUpdated { + relayer: ::sp_core::crypto::AccountId32, + registration: runtime_types::bp_relayers::registration::Registration< + ::core::primitive::u32, + ::core::primitive::u128, + >, + }, + #[codec(index = 3)] + Deregistered { relayer: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + SlashedAndDeregistered { + relayer: ::sp_core::crypto::AccountId32, + registration: runtime_types::bp_relayers::registration::Registration< + ::core::primitive::u32, + ::core::primitive::u128, + >, + }, + } + } + } + pub mod pallet_collator_selection { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_invulnerables { new: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 1)] + set_desired_candidates { max: ::core::primitive::u32 }, + #[codec(index = 2)] + set_candidacy_bond { bond: ::core::primitive::u128 }, + #[codec(index = 3)] + register_as_candidate, + #[codec(index = 4)] + leave_intent, + #[codec(index = 5)] + add_invulnerable { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 6)] + remove_invulnerable { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 7)] + update_bond { new_deposit: ::core::primitive::u128 }, + #[codec(index = 8)] + take_candidate_slot { + deposit: ::core::primitive::u128, + target: ::sp_core::crypto::AccountId32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateInfo<_0, _1> { + pub who: _0, + pub deposit: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyCandidates, + #[codec(index = 1)] + TooFewEligibleCollators, + #[codec(index = 2)] + AlreadyCandidate, + #[codec(index = 3)] + NotCandidate, + #[codec(index = 4)] + TooManyInvulnerables, + #[codec(index = 5)] + AlreadyInvulnerable, + #[codec(index = 6)] + NotInvulnerable, + #[codec(index = 7)] + NoAssociatedValidatorId, + #[codec(index = 8)] + ValidatorNotRegistered, + #[codec(index = 9)] + InsertToCandidateListFailed, + #[codec(index = 10)] + RemoveFromCandidateListFailed, + #[codec(index = 11)] + DepositTooLow, + #[codec(index = 12)] + UpdateCandidateListFailed, + #[codec(index = 13)] + InsufficientBond, + #[codec(index = 14)] + TargetIsNotCandidate, + #[codec(index = 15)] + IdenticalDeposit, + #[codec(index = 16)] + InvalidUnreserve, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewInvulnerables { + invulnerables: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 1)] + InvulnerableAdded { account_id: ::sp_core::crypto::AccountId32 }, + #[codec(index = 2)] + InvulnerableRemoved { account_id: ::sp_core::crypto::AccountId32 }, + #[codec(index = 3)] + NewDesiredCandidates { desired_candidates: ::core::primitive::u32 }, + #[codec(index = 4)] + NewCandidacyBond { bond_amount: ::core::primitive::u128 }, + #[codec(index = 5)] + CandidateAdded { + account_id: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 6)] + CandidateBondUpdated { + account_id: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 7)] + CandidateRemoved { account_id: ::sp_core::crypto::AccountId32 }, + #[codec(index = 8)] + CandidateReplaced { + old: ::sp_core::crypto::AccountId32, + new: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 9)] + InvalidInvulnerableSkipped { account_id: ::sp_core::crypto::AccountId32 }, + } + } + } + pub mod pallet_message_queue { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + reap_page { + message_origin: + runtime_types::cumulus_primitives_core::AggregateMessageOrigin, + page_index: ::core::primitive::u32, + }, + #[codec(index = 1)] + execute_overweight { + message_origin: + runtime_types::cumulus_primitives_core::AggregateMessageOrigin, + page: ::core::primitive::u32, + index: ::core::primitive::u32, + weight_limit: ::sp_weights::Weight, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotReapable, + #[codec(index = 1)] + NoPage, + #[codec(index = 2)] + NoMessage, + #[codec(index = 3)] + AlreadyProcessed, + #[codec(index = 4)] + Queued, + #[codec(index = 5)] + InsufficientWeight, + #[codec(index = 6)] + TemporarilyUnprocessable, + #[codec(index = 7)] + QueuePaused, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ProcessingFailed { + id: [::core::primitive::u8; 32usize], + origin: runtime_types::cumulus_primitives_core::AggregateMessageOrigin, + error: runtime_types::frame_support::traits::messages::ProcessMessageError, + }, + #[codec(index = 1)] + Processed { + id: [::core::primitive::u8; 32usize], + origin: runtime_types::cumulus_primitives_core::AggregateMessageOrigin, + weight_used: ::sp_weights::Weight, + success: ::core::primitive::bool, + }, + #[codec(index = 2)] + OverweightEnqueued { + id: [::core::primitive::u8; 32usize], + origin: runtime_types::cumulus_primitives_core::AggregateMessageOrigin, + page_index: ::core::primitive::u32, + message_index: ::core::primitive::u32, + }, + #[codec(index = 3)] + PageReaped { + origin: runtime_types::cumulus_primitives_core::AggregateMessageOrigin, + index: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BookState<_0> { + pub begin: ::core::primitive::u32, + pub end: ::core::primitive::u32, + pub count: ::core::primitive::u32, + pub ready_neighbours: + ::core::option::Option>, + pub message_count: ::core::primitive::u64, + pub size: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Neighbours<_0> { + pub prev: _0, + pub next: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Page<_0> { + pub remaining: _0, + pub remaining_size: _0, + pub first_index: _0, + pub first: _0, + pub last: _0, + pub heap: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + } + } + pub mod pallet_multisig { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_multi_threshold_1 { + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + call: ::std::boxed::Box< + runtime_types::bridge_hub_rococo_runtime::RuntimeCall, + >, + }, + #[codec(index = 1)] + as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call: ::std::boxed::Box< + runtime_types::bridge_hub_rococo_runtime::RuntimeCall, + >, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + approve_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call_hash: [::core::primitive::u8; 32usize], + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 3)] + cancel_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + call_hash: [::core::primitive::u8; 32usize], + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + MinimumThreshold, + #[codec(index = 1)] + AlreadyApproved, + #[codec(index = 2)] + NoApprovalsNeeded, + #[codec(index = 3)] + TooFewSignatories, + #[codec(index = 4)] + TooManySignatories, + #[codec(index = 5)] + SignatoriesOutOfOrder, + #[codec(index = 6)] + SenderInSignatories, + #[codec(index = 7)] + NotFound, + #[codec(index = 8)] + NotOwner, + #[codec(index = 9)] + NoTimepoint, + #[codec(index = 10)] + WrongTimepoint, + #[codec(index = 11)] + UnexpectedTimepoint, + #[codec(index = 12)] + MaxWeightTooLow, + #[codec(index = 13)] + AlreadyStored, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewMultisig { + approving: ::sp_core::crypto::AccountId32, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 1)] + MultisigApproval { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + MultisigExecuted { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + MultisigCancelled { + cancelling: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Multisig<_0, _1, _2> { + pub when: runtime_types::pallet_multisig::Timepoint<_0>, + pub deposit: _1, + pub depositor: _2, + pub approvals: runtime_types::bounded_collections::bounded_vec::BoundedVec<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Timepoint<_0> { + pub height: _0, + pub index: ::core::primitive::u32, + } + } + pub mod pallet_session { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_keys { + keys: runtime_types::bridge_hub_rococo_runtime::SessionKeys, + proof: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + purge_keys, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidProof, + #[codec(index = 1)] + NoAssociatedValidatorId, + #[codec(index = 2)] + DuplicatedKey, + #[codec(index = 3)] + NoKeys, + #[codec(index = 4)] + NoAccount, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewSession { session_index: ::core::primitive::u32 }, + } + } + } + pub mod pallet_timestamp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set { + #[codec(compact)] + now: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_transaction_payment { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + TransactionFeePaid { + who: ::sp_core::crypto::AccountId32, + actual_fee: ::core::primitive::u128, + tip: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChargeTransactionPayment(#[codec(compact)] pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V1Ancient, + #[codec(index = 1)] + V2, + } + } + pub mod pallet_utility { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + batch { + calls: + ::std::vec::Vec, + }, + #[codec(index = 1)] + as_derivative { + index: ::core::primitive::u16, + call: ::std::boxed::Box< + runtime_types::bridge_hub_rococo_runtime::RuntimeCall, + >, + }, + #[codec(index = 2)] + batch_all { + calls: + ::std::vec::Vec, + }, + #[codec(index = 3)] + dispatch_as { + as_origin: ::std::boxed::Box< + runtime_types::bridge_hub_rococo_runtime::OriginCaller, + >, + call: ::std::boxed::Box< + runtime_types::bridge_hub_rococo_runtime::RuntimeCall, + >, + }, + #[codec(index = 4)] + force_batch { + calls: + ::std::vec::Vec, + }, + #[codec(index = 5)] + with_weight { + call: ::std::boxed::Box< + runtime_types::bridge_hub_rococo_runtime::RuntimeCall, + >, + weight: ::sp_weights::Weight, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyCalls, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BatchInterrupted { + index: ::core::primitive::u32, + error: runtime_types::sp_runtime::DispatchError, + }, + #[codec(index = 1)] + BatchCompleted, + #[codec(index = 2)] + BatchCompletedWithErrors, + #[codec(index = 3)] + ItemCompleted, + #[codec(index = 4)] + ItemFailed { error: runtime_types::sp_runtime::DispatchError }, + #[codec(index = 5)] + DispatchedAs { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_xcm { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + send { + dest: ::std::boxed::Box, + message: ::std::boxed::Box, + }, + #[codec(index = 1)] + teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 2)] + reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 3)] + execute { + message: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 4)] + force_xcm_version { + location: ::std::boxed::Box< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + version: ::core::primitive::u32, + }, + #[codec(index = 5)] + force_default_xcm_version { + maybe_xcm_version: ::core::option::Option<::core::primitive::u32>, + }, + #[codec(index = 6)] + force_subscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 7)] + force_unsubscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 8)] + limited_reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 9)] + limited_teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 10)] + force_suspension { suspended: ::core::primitive::bool }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Unreachable, + #[codec(index = 1)] + SendFailure, + #[codec(index = 2)] + Filtered, + #[codec(index = 3)] + UnweighableMessage, + #[codec(index = 4)] + DestinationNotInvertible, + #[codec(index = 5)] + Empty, + #[codec(index = 6)] + CannotReanchor, + #[codec(index = 7)] + TooManyAssets, + #[codec(index = 8)] + InvalidOrigin, + #[codec(index = 9)] + BadVersion, + #[codec(index = 10)] + BadLocation, + #[codec(index = 11)] + NoSubscription, + #[codec(index = 12)] + AlreadySubscribed, + #[codec(index = 13)] + CannotCheckOutTeleport, + #[codec(index = 14)] + LowBalance, + #[codec(index = 15)] + TooManyLocks, + #[codec(index = 16)] + AccountNotSovereign, + #[codec(index = 17)] + FeesNotMet, + #[codec(index = 18)] + LockNotFound, + #[codec(index = 19)] + InUse, + #[codec(index = 20)] + InvalidAssetNotConcrete, + #[codec(index = 21)] + InvalidAssetUnknownReserve, + #[codec(index = 22)] + InvalidAssetUnsupportedReserve, + #[codec(index = 23)] + TooManyReserves, + #[codec(index = 24)] + LocalExecutionIncomplete, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Attempted { outcome: runtime_types::xcm::v3::traits::Outcome }, + #[codec(index = 1)] + Sent { + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + destination: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + message: runtime_types::xcm::v3::Xcm, + message_id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + UnexpectedResponse { + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + query_id: ::core::primitive::u64, + }, + #[codec(index = 3)] + ResponseReady { + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v3::Response, + }, + #[codec(index = 4)] + Notified { + query_id: ::core::primitive::u64, + pallet_index: ::core::primitive::u8, + call_index: ::core::primitive::u8, + }, + #[codec(index = 5)] + NotifyOverweight { + query_id: ::core::primitive::u64, + pallet_index: ::core::primitive::u8, + call_index: ::core::primitive::u8, + actual_weight: ::sp_weights::Weight, + max_budgeted_weight: ::sp_weights::Weight, + }, + #[codec(index = 6)] + NotifyDispatchError { + query_id: ::core::primitive::u64, + pallet_index: ::core::primitive::u8, + call_index: ::core::primitive::u8, + }, + #[codec(index = 7)] + NotifyDecodeFailed { + query_id: ::core::primitive::u64, + pallet_index: ::core::primitive::u8, + call_index: ::core::primitive::u8, + }, + #[codec(index = 8)] + InvalidResponder { + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + query_id: ::core::primitive::u64, + expected_location: ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 9)] + InvalidResponderVersion { + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + query_id: ::core::primitive::u64, + }, + #[codec(index = 10)] + ResponseTaken { query_id: ::core::primitive::u64 }, + #[codec(index = 11)] + AssetsTrapped { + hash: ::subxt::utils::H256, + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + assets: runtime_types::xcm::VersionedMultiAssets, + }, + #[codec(index = 12)] + VersionChangeNotified { + destination: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + result: ::core::primitive::u32, + cost: runtime_types::xcm::v3::multiasset::MultiAssets, + message_id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 13)] + SupportedVersionChanged { + location: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + version: ::core::primitive::u32, + }, + #[codec(index = 14)] + NotifyTargetSendFail { + location: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + query_id: ::core::primitive::u64, + error: runtime_types::xcm::v3::traits::Error, + }, + #[codec(index = 15)] + NotifyTargetMigrationFail { + location: runtime_types::xcm::VersionedMultiLocation, + query_id: ::core::primitive::u64, + }, + #[codec(index = 16)] + InvalidQuerierVersion { + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + query_id: ::core::primitive::u64, + }, + #[codec(index = 17)] + InvalidQuerier { + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + query_id: ::core::primitive::u64, + expected_querier: + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + maybe_actual_querier: ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 18)] + VersionNotifyStarted { + destination: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + cost: runtime_types::xcm::v3::multiasset::MultiAssets, + message_id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 19)] + VersionNotifyRequested { + destination: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + cost: runtime_types::xcm::v3::multiasset::MultiAssets, + message_id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 20)] + VersionNotifyUnrequested { + destination: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + cost: runtime_types::xcm::v3::multiasset::MultiAssets, + message_id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 21)] + FeesPaid { + paying: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + fees: runtime_types::xcm::v3::multiasset::MultiAssets, + }, + #[codec(index = 22)] + AssetsClaimed { + hash: ::subxt::utils::H256, + origin: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + assets: runtime_types::xcm::VersionedMultiAssets, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Xcm(runtime_types::staging_xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Response(runtime_types::staging_xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum QueryStatus<_0> { + #[codec(index = 0)] + Pending { + responder: runtime_types::xcm::VersionedMultiLocation, + maybe_match_querier: + ::core::option::Option, + maybe_notify: + ::core::option::Option<(::core::primitive::u8, ::core::primitive::u8)>, + timeout: _0, + }, + #[codec(index = 1)] + VersionNotifier { + origin: runtime_types::xcm::VersionedMultiLocation, + is_active: ::core::primitive::bool, + }, + #[codec(index = 2)] + Ready { response: runtime_types::xcm::VersionedResponse, at: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RemoteLockedFungibleRecord<_0> { + pub amount: ::core::primitive::u128, + pub owner: runtime_types::xcm::VersionedMultiLocation, + pub locker: runtime_types::xcm::VersionedMultiLocation, + pub consumers: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _0, + ::core::primitive::u128, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionMigrationStage { + #[codec(index = 0)] + MigrateSupportedVersion, + #[codec(index = 1)] + MigrateVersionNotifiers, + #[codec(index = 2)] + NotifyCurrentTargets( + ::core::option::Option<::std::vec::Vec<::core::primitive::u8>>, + ), + #[codec(index = 3)] + MigrateAndNotifyOldTargets, + } + } + } + pub mod polkadot_core_primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundDownwardMessage<_0> { + pub sent_at: _0, + pub msg: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundHrmpMessage<_0> { + pub sent_at: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundHrmpMessage<_0> { + pub recipient: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod polkadot_parachain_primitives { + use super::runtime_types; + pub mod primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeadData(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Id(pub ::core::primitive::u32); + } + } + pub mod polkadot_primitives { + use super::runtime_types; + pub mod v6 { + use super::runtime_types; + pub mod async_backing { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AsyncBackingParams { + pub max_candidate_depth: ::core::primitive::u32, + pub allowed_ancestry_len: ::core::primitive::u32, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AbridgedHostConfiguration { + pub max_code_size: ::core::primitive::u32, + pub max_head_data_size: ::core::primitive::u32, + pub max_upward_queue_count: ::core::primitive::u32, + pub max_upward_queue_size: ::core::primitive::u32, + pub max_upward_message_size: ::core::primitive::u32, + pub max_upward_message_num_per_candidate: ::core::primitive::u32, + pub hrmp_max_message_num_per_candidate: ::core::primitive::u32, + pub validation_upgrade_cooldown: ::core::primitive::u32, + pub validation_upgrade_delay: ::core::primitive::u32, + pub async_backing_params: + runtime_types::polkadot_primitives::v6::async_backing::AsyncBackingParams, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AbridgedHrmpChannel { + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + pub max_message_size: ::core::primitive::u32, + pub msg_count: ::core::primitive::u32, + pub total_size: ::core::primitive::u32, + pub mqc_head: ::core::option::Option<::subxt::utils::H256>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PersistedValidationData<_0, _1> { + pub parent_head: + runtime_types::polkadot_parachain_primitives::primitives::HeadData, + pub relay_parent_number: _1, + pub relay_parent_storage_root: _0, + pub max_pov_size: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeGoAhead { + #[codec(index = 0)] + Abort, + #[codec(index = 1)] + GoAhead, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeRestriction { + #[codec(index = 0)] + Present, + } + } + } + pub mod sp_arithmetic { + use super::runtime_types; + pub mod fixed_point { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct FixedU128(pub ::core::primitive::u128); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ArithmeticError { + #[codec(index = 0)] + Underflow, + #[codec(index = 1)] + Overflow, + #[codec(index = 2)] + DivisionByZero, + } + } + pub mod sp_consensus_aura { + use super::runtime_types; + pub mod sr25519 { + use super::runtime_types; + pub mod app_sr25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + } + } + pub mod sp_consensus_grandpa { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::ed25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::ed25519::Signature); + } + } + pub mod sp_consensus_slots { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Slot(pub ::core::primitive::u64); + } + pub mod sp_core { + use super::runtime_types; + pub mod crypto { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct KeyTypeId(pub [::core::primitive::u8; 4usize]); + } + pub mod ecdsa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 65usize]); + } + pub mod ed25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + pub mod sr25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Void {} + } + pub mod sp_runtime { + use super::runtime_types; + pub mod generic { + use super::runtime_types; + pub mod digest { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DigestItem { + #[codec(index = 6)] + PreRuntime( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 4)] + Consensus( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 5)] + Seal( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 0)] + Other(::std::vec::Vec<::core::primitive::u8>), + #[codec(index = 8)] + RuntimeEnvironmentUpdated, + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchError { + #[codec(index = 0)] + Other, + #[codec(index = 1)] + CannotLookup, + #[codec(index = 2)] + BadOrigin, + #[codec(index = 3)] + Module(runtime_types::sp_runtime::ModuleError), + #[codec(index = 4)] + ConsumerRemaining, + #[codec(index = 5)] + NoProviders, + #[codec(index = 6)] + TooManyConsumers, + #[codec(index = 7)] + Token(runtime_types::sp_runtime::TokenError), + #[codec(index = 8)] + Arithmetic(runtime_types::sp_arithmetic::ArithmeticError), + #[codec(index = 9)] + Transactional(runtime_types::sp_runtime::TransactionalError), + #[codec(index = 10)] + Exhausted, + #[codec(index = 11)] + Corruption, + #[codec(index = 12)] + Unavailable, + #[codec(index = 13)] + RootNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ModuleError { + pub index: ::core::primitive::u8, + pub error: [::core::primitive::u8; 4usize], + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSignature { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Signature), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Signature), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Signature), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TokenError { + #[codec(index = 0)] + FundsUnavailable, + #[codec(index = 1)] + OnlyProvider, + #[codec(index = 2)] + BelowMinimum, + #[codec(index = 3)] + CannotCreate, + #[codec(index = 4)] + UnknownAsset, + #[codec(index = 5)] + Frozen, + #[codec(index = 6)] + Unsupported, + #[codec(index = 7)] + CannotCreateHold, + #[codec(index = 8)] + NotExpendable, + #[codec(index = 9)] + Blocked, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionalError { + #[codec(index = 0)] + LimitReached, + #[codec(index = 1)] + NoLayer, + } + } + pub mod sp_trie { + use super::runtime_types; + pub mod storage_proof { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StorageProof { + pub trie_nodes: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, + } + } + } + pub mod sp_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeVersion { + pub spec_name: ::std::string::String, + pub impl_name: ::std::string::String, + pub authoring_version: ::core::primitive::u32, + pub spec_version: ::core::primitive::u32, + pub impl_version: ::core::primitive::u32, + pub apis: + ::std::vec::Vec<([::core::primitive::u8; 8usize], ::core::primitive::u32)>, + pub transaction_version: ::core::primitive::u32, + pub state_version: ::core::primitive::u8, + } + } + pub mod sp_weights { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeDbWeight { + pub read: ::core::primitive::u64, + pub write: ::core::primitive::u64, + } + } + pub mod staging_xcm { + use super::runtime_types; + pub mod v3 { + use super::runtime_types; + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v3::junctions::Junctions, + } + } + } + } + pub mod xcm { + use super::runtime_types; + pub mod double_encoded { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DoubleEncoded { + pub encoded: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DoubleEncoded2 { + pub encoded: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod v2 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: runtime_types::xcm::v2::NetworkId, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: runtime_types::xcm::v2::NetworkId, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: runtime_types::xcm::v2::NetworkId, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v2::BodyId, + part: runtime_types::xcm::v2::BodyPart, + }, + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + #[codec(index = 6)] + Blob(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v2::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v2::multiasset::AssetId, + pub fun: runtime_types::xcm::v2::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v2::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v2::multiasset::AssetId, + fun: runtime_types::xcm::v2::multiasset::WildFungibility, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v2::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v2::multilocation::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + MultiLocationFull, + #[codec(index = 5)] + MultiLocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + UnhandledXcmVersion, + #[codec(index = 23)] + WeightLimitReached(::core::primitive::u64), + #[codec(index = 24)] + Barrier, + #[codec(index = 25)] + WeightNotComputable, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v2::Response, + #[codec(compact)] + max_weight: ::core::primitive::u64, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_type: runtime_types::xcm::v2::OriginKind, + #[codec(compact)] + require_weight_at_most: ::core::primitive::u64, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v2::multilocation::Junctions), + #[codec(index = 12)] + ReportError { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + receive: runtime_types::xcm::v2::multiasset::MultiAssets, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 18)] + QueryHolding { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v2::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v2::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v2::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v2::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + ticket: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 27)] + UnsubscribeVersion, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction2 { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v2::Response, + #[codec(compact)] + max_weight: ::core::primitive::u64, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_type: runtime_types::xcm::v2::OriginKind, + #[codec(compact)] + require_weight_at_most: ::core::primitive::u64, + call: runtime_types::xcm::double_encoded::DoubleEncoded2, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v2::multilocation::Junctions), + #[codec(index = 12)] + ReportError { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + receive: runtime_types::xcm::v2::multiasset::MultiAssets, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 18)] + QueryHolding { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v2::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v2::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v2::Xcm2), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v2::Xcm2), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + ticket: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 27)] + UnsubscribeVersion, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginKind { + #[codec(index = 0)] + Native, + #[codec(index = 1)] + SovereignAccount, + #[codec(index = 2)] + Superuser, + #[codec(index = 3)] + Xcm, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v2::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(#[codec(compact)] ::core::primitive::u64), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm2(pub ::std::vec::Vec); + } + pub mod v3 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Moniker([::core::primitive::u8; 4usize]), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: + ::core::option::Option, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: + ::core::option::Option, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: + ::core::option::Option, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey { + length: ::core::primitive::u8, + data: [::core::primitive::u8; 32usize], + }, + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v3::junction::BodyId, + part: runtime_types::xcm::v3::junction::BodyPart, + }, + #[codec(index = 9)] + GlobalConsensus(runtime_types::xcm::v3::junction::NetworkId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + ByGenesis([::core::primitive::u8; 32usize]), + #[codec(index = 1)] + ByFork { + block_number: ::core::primitive::u64, + block_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + #[codec(index = 4)] + Westend, + #[codec(index = 5)] + Rococo, + #[codec(index = 6)] + Wococo, + #[codec(index = 7)] + Ethereum { + #[codec(compact)] + chain_id: ::core::primitive::u64, + }, + #[codec(index = 8)] + BitcoinCore, + #[codec(index = 9)] + BitcoinCash, + } + } + pub mod junctions { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::staging_xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v3::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v3::multiasset::AssetId, + pub fun: runtime_types::xcm::v3::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v3::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + }, + #[codec(index = 2)] + AllCounted(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + AllOfCounted { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + #[codec(compact)] + count: ::core::primitive::u32, + }, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + LocationFull, + #[codec(index = 5)] + LocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + ExpectationFalse, + #[codec(index = 23)] + PalletNotFound, + #[codec(index = 24)] + NameMismatch, + #[codec(index = 25)] + VersionIncompatible, + #[codec(index = 26)] + HoldingWouldOverflow, + #[codec(index = 27)] + ExportError, + #[codec(index = 28)] + ReanchorFailed, + #[codec(index = 29)] + NoDeal, + #[codec(index = 30)] + FeesNotMet, + #[codec(index = 31)] + LockError, + #[codec(index = 32)] + NoPermission, + #[codec(index = 33)] + Unanchored, + #[codec(index = 34)] + NotDepositable, + #[codec(index = 35)] + UnhandledXcmVersion, + #[codec(index = 36)] + WeightLimitReached(::sp_weights::Weight), + #[codec(index = 37)] + Barrier, + #[codec(index = 38)] + WeightNotComputable, + #[codec(index = 39)] + ExceedsStackLimit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Outcome { + #[codec(index = 0)] + Complete(::sp_weights::Weight), + #[codec(index = 1)] + Incomplete(::sp_weights::Weight, runtime_types::xcm::v3::traits::Error), + #[codec(index = 2)] + Error(runtime_types::xcm::v3::traits::Error), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v3::Response, + max_weight: ::sp_weights::Weight, + querier: ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + beneficiary: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + dest: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_kind: runtime_types::xcm::v2::OriginKind, + require_weight_at_most: ::sp_weights::Weight, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v3::junctions::Junctions), + #[codec(index = 12)] + ReportError(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + beneficiary: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + want: runtime_types::xcm::v3::multiasset::MultiAssets, + maximal: ::core::primitive::bool, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + reserve: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 18)] + ReportHolding { + response_info: runtime_types::xcm::v3::QueryResponseInfo, + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v3::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v3::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v3::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + ticket: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + max_response_weight: ::sp_weights::Weight, + }, + #[codec(index = 27)] + UnsubscribeVersion, + #[codec(index = 28)] + BurnAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 29)] + ExpectAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 30)] + ExpectOrigin( + ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 31)] + ExpectError( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 32)] + ExpectTransactStatus(runtime_types::xcm::v3::MaybeErrorCode), + #[codec(index = 33)] + QueryPallet { + module_name: ::std::vec::Vec<::core::primitive::u8>, + response_info: runtime_types::xcm::v3::QueryResponseInfo, + }, + #[codec(index = 34)] + ExpectPallet { + #[codec(compact)] + index: ::core::primitive::u32, + name: ::std::vec::Vec<::core::primitive::u8>, + module_name: ::std::vec::Vec<::core::primitive::u8>, + #[codec(compact)] + crate_major: ::core::primitive::u32, + #[codec(compact)] + min_crate_minor: ::core::primitive::u32, + }, + #[codec(index = 35)] + ReportTransactStatus(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 36)] + ClearTransactStatus, + #[codec(index = 37)] + UniversalOrigin(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 38)] + ExportMessage { + network: runtime_types::xcm::v3::junction::NetworkId, + destination: runtime_types::xcm::v3::junctions::Junctions, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 39)] + LockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + unlocker: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 40)] + UnlockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + target: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 41)] + NoteUnlockable { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + owner: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 42)] + RequestUnlock { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + locker: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 43)] + SetFeesMode { jit_withdraw: ::core::primitive::bool }, + #[codec(index = 44)] + SetTopic([::core::primitive::u8; 32usize]), + #[codec(index = 45)] + ClearTopic, + #[codec(index = 46)] + AliasOrigin(runtime_types::staging_xcm::v3::multilocation::MultiLocation), + #[codec(index = 47)] + UnpaidExecution { + weight_limit: runtime_types::xcm::v3::WeightLimit, + check_origin: ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction2 { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v3::Response, + max_weight: ::sp_weights::Weight, + querier: ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + beneficiary: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + dest: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_kind: runtime_types::xcm::v2::OriginKind, + require_weight_at_most: ::sp_weights::Weight, + call: runtime_types::xcm::double_encoded::DoubleEncoded2, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v3::junctions::Junctions), + #[codec(index = 12)] + ReportError(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + beneficiary: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + want: runtime_types::xcm::v3::multiasset::MultiAssets, + maximal: ::core::primitive::bool, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + reserve: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 18)] + ReportHolding { + response_info: runtime_types::xcm::v3::QueryResponseInfo, + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v3::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v3::Xcm2), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v3::Xcm2), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + ticket: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + max_response_weight: ::sp_weights::Weight, + }, + #[codec(index = 27)] + UnsubscribeVersion, + #[codec(index = 28)] + BurnAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 29)] + ExpectAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 30)] + ExpectOrigin( + ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 31)] + ExpectError( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 32)] + ExpectTransactStatus(runtime_types::xcm::v3::MaybeErrorCode), + #[codec(index = 33)] + QueryPallet { + module_name: ::std::vec::Vec<::core::primitive::u8>, + response_info: runtime_types::xcm::v3::QueryResponseInfo, + }, + #[codec(index = 34)] + ExpectPallet { + #[codec(compact)] + index: ::core::primitive::u32, + name: ::std::vec::Vec<::core::primitive::u8>, + module_name: ::std::vec::Vec<::core::primitive::u8>, + #[codec(compact)] + crate_major: ::core::primitive::u32, + #[codec(compact)] + min_crate_minor: ::core::primitive::u32, + }, + #[codec(index = 35)] + ReportTransactStatus(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 36)] + ClearTransactStatus, + #[codec(index = 37)] + UniversalOrigin(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 38)] + ExportMessage { + network: runtime_types::xcm::v3::junction::NetworkId, + destination: runtime_types::xcm::v3::junctions::Junctions, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 39)] + LockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + unlocker: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 40)] + UnlockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + target: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 41)] + NoteUnlockable { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + owner: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 42)] + RequestUnlock { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + locker: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 43)] + SetFeesMode { jit_withdraw: ::core::primitive::bool }, + #[codec(index = 44)] + SetTopic([::core::primitive::u8; 32usize]), + #[codec(index = 45)] + ClearTopic, + #[codec(index = 46)] + AliasOrigin(runtime_types::staging_xcm::v3::multilocation::MultiLocation), + #[codec(index = 47)] + UnpaidExecution { + weight_limit: runtime_types::xcm::v3::WeightLimit, + check_origin: ::core::option::Option< + runtime_types::staging_xcm::v3::multilocation::MultiLocation, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MaybeErrorCode { + #[codec(index = 0)] + Success, + #[codec(index = 1)] + Error( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + TruncatedError( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletInfo { + #[codec(compact)] + pub index: ::core::primitive::u32, + pub name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + pub module_name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + #[codec(compact)] + pub major: ::core::primitive::u32, + #[codec(compact)] + pub minor: ::core::primitive::u32, + #[codec(compact)] + pub patch: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueryResponseInfo { + pub destination: runtime_types::staging_xcm::v3::multilocation::MultiLocation, + #[codec(compact)] + pub query_id: ::core::primitive::u64, + pub max_weight: ::sp_weights::Weight, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + #[codec(index = 4)] + PalletsInfo( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::xcm::v3::PalletInfo, + >, + ), + #[codec(index = 5)] + DispatchResult(runtime_types::xcm::v3::MaybeErrorCode), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(::sp_weights::Weight), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm2(pub ::std::vec::Vec); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedAssetId { + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::AssetId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiAssets { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::MultiAssets), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiLocation { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 3)] + V3(runtime_types::staging_xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedResponse { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Response), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Response), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedXcm { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Xcm), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Xcm), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedXcm2 { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Xcm2), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Xcm2), + } + } + } +} diff --git a/relays/client-bridge-hub-rococo/src/lib.rs b/relays/client-bridge-hub-rococo/src/lib.rs new file mode 100644 index 000000000000..b92e0009f5b8 --- /dev/null +++ b/relays/client-bridge-hub-rococo/src/lib.rs @@ -0,0 +1,182 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the BridgeHub-Rococo-Substrate parachain. + +pub mod codegen_runtime; + +use bp_bridge_hub_rococo::{SignedExtension, AVERAGE_BLOCK_INTERVAL}; +use bp_messages::MessageNonce; +use bp_polkadot_core::SuffixedCommonSignedExtensionExt; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + calls::UtilityCall as MockUtilityCall, Chain, ChainWithBalances, ChainWithMessages, + ChainWithTransactions, ChainWithUtilityPallet, Error as SubstrateError, + MockedRuntimeUtilityPallet, SignParam, UnderlyingChainProvider, UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount}; +use std::time::Duration; + +pub use codegen_runtime::api::runtime_types; + +pub type RuntimeCall = runtime_types::bridge_hub_rococo_runtime::RuntimeCall; +pub type BridgeMessagesCall = runtime_types::pallet_bridge_messages::pallet::Call; +pub type BridgeBulletinMessagesCall = runtime_types::pallet_bridge_messages::pallet::Call2; +pub type BridgeGrandpaCall = runtime_types::pallet_bridge_grandpa::pallet::Call; +pub type BridgeBulletinGrandpaCall = runtime_types::pallet_bridge_grandpa::pallet::Call2; +pub type BridgeParachainCall = runtime_types::pallet_bridge_parachains::pallet::Call; +type UncheckedExtrinsic = bp_bridge_hub_rococo::UncheckedExtrinsic; +type UtilityCall = runtime_types::pallet_utility::pallet::Call; + +/// Rococo chain definition +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BridgeHubRococo; + +impl UnderlyingChainProvider for BridgeHubRococo { + type Chain = bp_bridge_hub_rococo::BridgeHubRococo; +} + +impl Chain for BridgeHubRococo { + const ID: ChainId = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID; + const NAME: &'static str = "BridgeHubRococo"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_bridge_hub_rococo::BEST_FINALIZED_BRIDGE_HUB_ROCOCO_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = AVERAGE_BLOCK_INTERVAL; + + type SignedBlock = bp_bridge_hub_rococo::SignedBlock; + type Call = RuntimeCall; +} + +impl ChainWithBalances for BridgeHubRococo { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + bp_bridge_hub_rococo::AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl From> for RuntimeCall { + fn from(value: MockUtilityCall) -> RuntimeCall { + match value { + MockUtilityCall::batch_all(calls) => + RuntimeCall::Utility(UtilityCall::batch_all { calls }), + } + } +} + +impl ChainWithUtilityPallet for BridgeHubRococo { + type UtilityPallet = MockedRuntimeUtilityPallet; +} + +impl ChainWithTransactions for BridgeHubRococo { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + (((), ()), ((), ())), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(UncheckedExtrinsic::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| { + *address == bp_bridge_hub_rococo::Address::Id(signer.public().into()) + }) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} + +impl ChainWithMessages for BridgeHubRococo { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = + bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME; + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = + Some(bp_bridge_hub_rococo::WITH_BRIDGE_HUB_ROCOCO_RELAYERS_PALLET_NAME); + + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_rococo::TO_BRIDGE_HUB_ROCOCO_MESSAGE_DETAILS_METHOD; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_rococo::FROM_BRIDGE_HUB_ROCOCO_MESSAGE_DETAILS_METHOD; + + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; +} + +#[cfg(test)] +mod tests { + use super::*; + use relay_substrate_client::TransactionEra; + + type SystemCall = runtime_types::frame_system::pallet::Call; + + #[test] + fn parse_transaction_works() { + let unsigned = UnsignedTransaction { + call: RuntimeCall::System(SystemCall::remark { remark: b"Hello world!".to_vec() }) + .into(), + nonce: 777, + tip: 888, + era: TransactionEra::immortal(), + }; + let signed_transaction = BridgeHubRococo::sign_transaction( + SignParam { + spec_version: 42, + transaction_version: 50000, + genesis_hash: [42u8; 32].into(), + signer: sp_core::sr25519::Pair::from_seed_slice(&[1u8; 32]).unwrap(), + }, + unsigned.clone(), + ) + .unwrap(); + let parsed_transaction = BridgeHubRococo::parse_transaction(signed_transaction).unwrap(); + assert_eq!(parsed_transaction, unsigned); + } +} diff --git a/relays/client-bridge-hub-westend/Cargo.toml b/relays/client-bridge-hub-westend/Cargo.toml new file mode 100644 index 000000000000..a147aaee4391 --- /dev/null +++ b/relays/client-bridge-hub-westend/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "relay-bridge-hub-westend-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +subxt = { version = "0.32.1", default-features = false, features = [] } + +# Bridge dependencies + +bp-bridge-hub-rococo = { path = "../../primitives/chain-bridge-hub-rococo" } +bp-bridge-hub-westend = { path = "../../primitives/chain-bridge-hub-westend" } +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-parachains = { path = "../../primitives/parachains" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-rococo = { path = "../../primitives/chain-rococo" } +bp-runtime = { path = "../../primitives/runtime" } + +bridge-runtime-common = { path = "../../bin/runtime-common" } +relay-substrate-client = { path = "../client-substrate" } + +# Substrate Dependencies + +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[dev-dependencies] +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-bridge-hub-westend/src/lib.rs b/relays/client-bridge-hub-westend/src/lib.rs new file mode 100644 index 000000000000..addbbe041478 --- /dev/null +++ b/relays/client-bridge-hub-westend/src/lib.rs @@ -0,0 +1,162 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the BridgeHub-Westend-Substrate parachain. + +use bp_bridge_hub_westend::AVERAGE_BLOCK_INTERVAL; +use bp_messages::MessageNonce; +use bp_polkadot_core::SuffixedCommonSignedExtensionExt; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithMessages, ChainWithTransactions, ChainWithUtilityPallet, + Error as SubstrateError, MockedRuntimeUtilityPallet, SignParam, UnderlyingChainProvider, + UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount}; +use std::time::Duration; + +/// Re-export runtime wrapper +pub mod runtime_wrapper; +pub use runtime_wrapper as runtime; + +/// Westend chain definition +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct BridgeHubWestend; + +impl UnderlyingChainProvider for BridgeHubWestend { + type Chain = bp_bridge_hub_westend::BridgeHubWestend; +} + +impl Chain for BridgeHubWestend { + const ID: ChainId = bp_runtime::BRIDGE_HUB_WESTEND_CHAIN_ID; + const NAME: &'static str = "BridgeHubWestend"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_bridge_hub_westend::BEST_FINALIZED_BRIDGE_HUB_WESTEND_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = AVERAGE_BLOCK_INTERVAL; + + type SignedBlock = bp_bridge_hub_westend::SignedBlock; + type Call = runtime::Call; +} + +impl ChainWithBalances for BridgeHubWestend { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + bp_bridge_hub_westend::AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl ChainWithUtilityPallet for BridgeHubWestend { + type UtilityPallet = MockedRuntimeUtilityPallet; +} + +impl ChainWithTransactions for BridgeHubWestend { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = runtime::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + runtime::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + (((), ()), ((), ())), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(runtime::UncheckedExtrinsic::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| { + *address == bp_bridge_hub_westend::Address::Id(signer.public().into()) + }) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} + +impl ChainWithMessages for BridgeHubWestend { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = + bp_bridge_hub_westend::WITH_BRIDGE_HUB_WESTEND_MESSAGES_PALLET_NAME; + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = + Some(bp_bridge_hub_westend::WITH_BRIDGE_HUB_WESTEND_RELAYERS_PALLET_NAME); + + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_westend::TO_BRIDGE_HUB_WESTEND_MESSAGE_DETAILS_METHOD; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_bridge_hub_westend::FROM_BRIDGE_HUB_WESTEND_MESSAGE_DETAILS_METHOD; + + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_westend::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = + bp_bridge_hub_westend::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; +} + +#[cfg(test)] +mod tests { + use super::*; + use relay_substrate_client::TransactionEra; + + #[test] + fn parse_transaction_works() { + let unsigned = UnsignedTransaction { + call: runtime::Call::System(runtime::SystemCall::remark(b"Hello world!".to_vec())) + .into(), + nonce: 777, + tip: 888, + era: TransactionEra::immortal(), + }; + let signed_transaction = BridgeHubWestend::sign_transaction( + SignParam { + spec_version: 42, + transaction_version: 50000, + genesis_hash: [42u8; 32].into(), + signer: sp_core::sr25519::Pair::from_seed_slice(&[1u8; 32]).unwrap(), + }, + unsigned.clone(), + ) + .unwrap(); + let parsed_transaction = BridgeHubWestend::parse_transaction(signed_transaction).unwrap(); + assert_eq!(parsed_transaction, unsigned); + } +} diff --git a/relays/client-bridge-hub-westend/src/runtime_wrapper.rs b/relays/client-bridge-hub-westend/src/runtime_wrapper.rs new file mode 100644 index 000000000000..b4ff36cde7a3 --- /dev/null +++ b/relays/client-bridge-hub-westend/src/runtime_wrapper.rs @@ -0,0 +1,116 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types that are specific to the BridgeHubWestend runtime. +// TODO: regenerate me using `runtime-codegen` tool? (https://github.com/paritytech/parity-bridges-common/issues/1945) + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; + +pub use bp_bridge_hub_westend::SignedExtension; +pub use bp_header_chain::BridgeGrandpaCallOf; +pub use bp_parachains::BridgeParachainCall; +pub use bridge_runtime_common::messages::BridgeMessagesCallOf; +pub use relay_substrate_client::calls::{SystemCall, UtilityCall}; + +/// Unchecked BridgeHubWestend extrinsic. +pub type UncheckedExtrinsic = bp_bridge_hub_westend::UncheckedExtrinsic; + +/// The indirect pallet call used to sync `Rococo` GRANDPA finality to `BHWestend`. +pub type BridgeRococoGrandpaCall = BridgeGrandpaCallOf; +/// The indirect pallet call used to sync `BridgeHubRococo` messages to `BridgeHubWestend`. +pub type BridgeRococoMessagesCall = BridgeMessagesCallOf; + +/// `BridgeHubWestend` Runtime `Call` enum. +/// +/// The enum represents a subset of possible `Call`s we can send to `BridgeHubWestend` chain. +/// Ideally this code would be auto-generated from metadata, because we want to +/// avoid depending directly on the ENTIRE runtime just to get the encoding of `Dispatchable`s. +/// +/// All entries here (like pretty much in the entire file) must be kept in sync with +/// `BridgeHubWestend` `construct_runtime`, so that we maintain SCALE-compatibility. +#[allow(clippy::large_enum_variant)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub enum Call { + #[cfg(test)] + #[codec(index = 0)] + System(SystemCall), + /// Utility pallet. + #[codec(index = 40)] + Utility(UtilityCall), + + /// Rococo grandpa bridge pallet. + #[codec(index = 42)] + BridgeRococoGrandpa(BridgeRococoGrandpaCall), + /// Rococo parachains bridge pallet. + #[codec(index = 43)] + BridgeRococoParachains(BridgeParachainCall), + /// Rococo messages bridge pallet. + #[codec(index = 44)] + BridgeRococoMessages(BridgeRococoMessagesCall), +} + +impl From> for Call { + fn from(call: UtilityCall) -> Call { + Call::Utility(call) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use bp_runtime::BasicOperatingMode; + use sp_consensus_grandpa::AuthorityList; + use sp_core::hexdisplay::HexDisplay; + use sp_runtime::traits::Header; + use std::str::FromStr; + + pub type RelayBlockNumber = bp_polkadot_core::BlockNumber; + pub type RelayBlockHasher = bp_polkadot_core::Hasher; + pub type RelayBlockHeader = sp_runtime::generic::Header; + + #[test] + fn encode_decode_calls() { + let header = RelayBlockHeader::new( + 75, + bp_polkadot_core::Hash::from_str( + "0xd2c0afaab32de0cb8f7f0d89217e37c5ea302c1ffb5a7a83e10d20f12c32874d", + ) + .expect("invalid value"), + bp_polkadot_core::Hash::from_str( + "0x92b965f0656a4e0e5fc0167da2d4b5ee72b3be2c1583c4c1e5236c8c12aa141b", + ) + .expect("invalid value"), + bp_polkadot_core::Hash::from_str( + "0xae4a25acf250d72ed02c149ecc7dd3c9ee976d41a2888fc551de8064521dc01d", + ) + .expect("invalid value"), + Default::default(), + ); + let init_data = bp_header_chain::InitializationData { + header: Box::new(header), + authority_list: AuthorityList::default(), + set_id: 6, + operating_mode: BasicOperatingMode::Normal, + }; + let call = BridgeRococoGrandpaCall::initialize { init_data }; + let tx = Call::BridgeRococoGrandpa(call); + + // encode call as hex string + let hex_encoded_call = format!("0x{:?}", HexDisplay::from(&Encode::encode(&tx))); + assert_eq!(hex_encoded_call, "0x2a01ae4a25acf250d72ed02c149ecc7dd3c9ee976d41a2888fc551de8064521dc01d2d0192b965f0656a4e0e5fc0167da2d4b5ee72b3be2c1583c4c1e5236c8c12aa141bd2c0afaab32de0cb8f7f0d89217e37c5ea302c1ffb5a7a83e10d20f12c32874d0000060000000000000000"); + } +} diff --git a/relays/client-kusama/Cargo.toml b/relays/client-kusama/Cargo.toml new file mode 100644 index 000000000000..fee0db14a511 --- /dev/null +++ b/relays/client-kusama/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "relay-kusama-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +subxt = { version = "0.32.1", default-features = false, features = ["native"] } + +# Bridge dependencies + +bp-kusama = { path = "../../primitives/chain-kusama" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-runtime = { path = "../../primitives/runtime" } + +relay-substrate-client = { path = "../client-substrate" } +relay-utils = { path = "../utils" } + +# Substrate Dependencies + +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-kusama/src/codegen_runtime.rs b/relays/client-kusama/src/codegen_runtime.rs new file mode 100644 index 000000000000..3c37d61f4cf1 --- /dev/null +++ b/relays/client-kusama/src/codegen_runtime.rs @@ -0,0 +1,8338 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated runtime API +//! THIS FILE WAS AUTOGENERATED USING parity-bridges-common::runtime-codegen +//! EXECUTED COMMAND: target/debug/runtime-codegen --from-node-url wss://kusama-rpc.polkadot.io:443 + +#[allow(dead_code, unused_imports, non_camel_case_types)] +#[allow(clippy::all)] +pub mod api { + use super::api as root_mod; + pub mod runtime_types { + use super::runtime_types; + pub mod bounded_collections { + use super::runtime_types; + pub mod bounded_btree_map { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedBTreeMap<_0, _1>(pub ::subxt::utils::KeyedVec<_0, _1>); + } + pub mod bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + pub mod weak_bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeakBoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + } + pub mod finality_grandpa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Equivocation<_0, _1, _2> { + pub round_number: ::core::primitive::u64, + pub identity: _0, + pub first: (_1, _2), + pub second: (_1, _2), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Precommit<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Prevote<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + } + pub mod frame_support { + use super::runtime_types; + pub mod dispatch { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchClass { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Operational, + #[codec(index = 2)] + Mandatory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchInfo { + pub weight: ::sp_weights::Weight, + pub class: runtime_types::frame_support::dispatch::DispatchClass, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Pays { + #[codec(index = 0)] + Yes, + #[codec(index = 1)] + No, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PerDispatchClass<_0> { + pub normal: _0, + pub operational: _0, + pub mandatory: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PostDispatchInfo { + pub actual_weight: ::core::option::Option<::sp_weights::Weight>, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RawOrigin<_0> { + #[codec(index = 0)] + Root, + #[codec(index = 1)] + Signed(_0), + #[codec(index = 2)] + None, + } + } + pub mod traits { + use super::runtime_types; + pub mod messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProcessMessageError { + #[codec(index = 0)] + BadFormat, + #[codec(index = 1)] + Corrupt, + #[codec(index = 2)] + Unsupported, + #[codec(index = 3)] + Overweight(::sp_weights::Weight), + #[codec(index = 4)] + Yield, + } + } + pub mod misc { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WrapperOpaque<_0>( + #[codec(compact)] pub ::core::primitive::u32, + pub _0, + ); + } + pub mod preimages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Bounded<_0> { + #[codec(index = 0)] + Legacy { + hash: ::subxt::utils::H256, + }, + #[codec(index = 1)] + Inline( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Lookup { + hash: ::subxt::utils::H256, + len: ::core::primitive::u32, + }, + __Ignore(::core::marker::PhantomData<_0>), + } + } + pub mod schedule { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchTime<_0> { + #[codec(index = 0)] + At(_0), + #[codec(index = 1)] + After(_0), + } + } + pub mod tokens { + use super::runtime_types; + pub mod misc { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum BalanceStatus { + #[codec(index = 0)] + Free, + #[codec(index = 1)] + Reserved, + } + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletId(pub [::core::primitive::u8; 8usize]); + } + pub mod frame_system { + use super::runtime_types; + pub mod extensions { + use super::runtime_types; + pub mod check_genesis { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckGenesis; + } + pub mod check_mortality { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckMortality(pub ::sp_runtime::generic::Era); + } + pub mod check_non_zero_sender { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonZeroSender; + } + pub mod check_nonce { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonce(#[codec(compact)] pub ::core::primitive::u32); + } + pub mod check_spec_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckSpecVersion; + } + pub mod check_tx_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckTxVersion; + } + pub mod check_weight { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckWeight; + } + } + pub mod limits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockLength { + pub max: runtime_types::frame_support::dispatch::PerDispatchClass< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockWeights { + pub base_block: ::sp_weights::Weight, + pub max_block: ::sp_weights::Weight, + pub per_class: runtime_types::frame_support::dispatch::PerDispatchClass< + runtime_types::frame_system::limits::WeightsPerClass, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeightsPerClass { + pub base_extrinsic: ::sp_weights::Weight, + pub max_extrinsic: ::core::option::Option<::sp_weights::Weight>, + pub max_total: ::core::option::Option<::sp_weights::Weight>, + pub reserved: ::core::option::Option<::sp_weights::Weight>, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + remark { remark: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + set_heap_pages { pages: ::core::primitive::u64 }, + #[codec(index = 2)] + set_code { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 3)] + set_code_without_checks { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + set_storage { + items: ::std::vec::Vec<( + ::std::vec::Vec<::core::primitive::u8>, + ::std::vec::Vec<::core::primitive::u8>, + )>, + }, + #[codec(index = 5)] + kill_storage { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>> }, + #[codec(index = 6)] + kill_prefix { + prefix: ::std::vec::Vec<::core::primitive::u8>, + subkeys: ::core::primitive::u32, + }, + #[codec(index = 7)] + remark_with_event { remark: ::std::vec::Vec<::core::primitive::u8> }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidSpecName, + #[codec(index = 1)] + SpecVersionNeedsToIncrease, + #[codec(index = 2)] + FailedToExtractRuntimeVersion, + #[codec(index = 3)] + NonDefaultComposite, + #[codec(index = 4)] + NonZeroRefCount, + #[codec(index = 5)] + CallFiltered, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ExtrinsicSuccess { + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 1)] + ExtrinsicFailed { + dispatch_error: runtime_types::sp_runtime::DispatchError, + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 2)] + CodeUpdated, + #[codec(index = 3)] + NewAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + KilledAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Remarked { sender: ::sp_core::crypto::AccountId32, hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountInfo<_0, _1> { + pub nonce: _0, + pub consumers: _0, + pub providers: _0, + pub sufficients: _0, + pub data: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EventRecord<_0, _1> { + pub phase: runtime_types::frame_system::Phase, + pub event: _0, + pub topics: ::std::vec::Vec<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LastRuntimeUpgradeInfo { + #[codec(compact)] + pub spec_version: ::core::primitive::u32, + pub spec_name: ::std::string::String, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase { + #[codec(index = 0)] + ApplyExtrinsic(::core::primitive::u32), + #[codec(index = 1)] + Finalization, + #[codec(index = 2)] + Initialization, + } + } + pub mod kusama_runtime { + use super::runtime_types; + pub mod governance { + use super::runtime_types; + pub mod origins { + use super::runtime_types; + pub mod pallet_custom_origins { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Origin { + #[codec(index = 0)] + StakingAdmin, + #[codec(index = 1)] + Treasurer, + #[codec(index = 2)] + FellowshipAdmin, + #[codec(index = 3)] + GeneralAdmin, + #[codec(index = 4)] + AuctionAdmin, + #[codec(index = 5)] + LeaseAdmin, + #[codec(index = 6)] + ReferendumCanceller, + #[codec(index = 7)] + ReferendumKiller, + #[codec(index = 8)] + SmallTipper, + #[codec(index = 9)] + BigTipper, + #[codec(index = 10)] + SmallSpender, + #[codec(index = 11)] + MediumSpender, + #[codec(index = 12)] + BigSpender, + #[codec(index = 13)] + WhitelistedCaller, + #[codec(index = 14)] + FellowshipInitiates, + #[codec(index = 15)] + Fellows, + #[codec(index = 16)] + FellowshipExperts, + #[codec(index = 17)] + FellowshipMasters, + #[codec(index = 18)] + Fellowship1Dan, + #[codec(index = 19)] + Fellowship2Dan, + #[codec(index = 20)] + Fellowship3Dan, + #[codec(index = 21)] + Fellowship4Dan, + #[codec(index = 22)] + Fellowship5Dan, + #[codec(index = 23)] + Fellowship6Dan, + #[codec(index = 24)] + Fellowship7Dan, + #[codec(index = 25)] + Fellowship8Dan, + #[codec(index = 26)] + Fellowship9Dan, + } + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct NposCompactSolution24 { + pub votes1: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes2: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + ( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ), + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes3: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 2usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes4: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 3usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes5: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 4usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes6: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 5usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes7: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 6usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes8: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 7usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes9: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 8usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes10: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 9usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes11: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 10usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes12: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 11usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes13: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 12usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes14: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 13usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes15: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 14usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes16: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 15usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes17: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 16usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes18: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 17usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes19: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 18usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes20: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 19usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes21: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 20usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes22: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 21usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes23: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 22usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes24: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 23usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginCaller { + # [codec (index = 0)] system (runtime_types :: frame_support :: dispatch :: RawOrigin < :: sp_core :: crypto :: AccountId32 > ,) , # [codec (index = 43)] Origins (runtime_types :: kusama_runtime :: governance :: origins :: pallet_custom_origins :: Origin ,) , # [codec (index = 50)] ParachainsOrigin (runtime_types :: polkadot_runtime_parachains :: origin :: pallet :: Origin ,) , # [codec (index = 99)] XcmPallet (runtime_types :: pallet_xcm :: pallet :: Origin ,) , # [codec (index = 4)] Void (runtime_types :: sp_core :: Void ,) , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProxyType { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + NonTransfer, + #[codec(index = 2)] + Governance, + #[codec(index = 3)] + Staking, + #[codec(index = 4)] + IdentityJudgement, + #[codec(index = 5)] + CancelProxy, + #[codec(index = 6)] + Auction, + #[codec(index = 7)] + Society, + #[codec(index = 8)] + NominationPools, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Runtime; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeCall { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Call), + #[codec(index = 1)] + Babe(runtime_types::pallet_babe::pallet::Call), + #[codec(index = 2)] + Timestamp(runtime_types::pallet_timestamp::pallet::Call), + #[codec(index = 3)] + Indices(runtime_types::pallet_indices::pallet::Call), + #[codec(index = 4)] + Balances(runtime_types::pallet_balances::pallet::Call), + #[codec(index = 6)] + Staking(runtime_types::pallet_staking::pallet::pallet::Call), + #[codec(index = 8)] + Session(runtime_types::pallet_session::pallet::Call), + #[codec(index = 10)] + Grandpa(runtime_types::pallet_grandpa::pallet::Call), + #[codec(index = 11)] + ImOnline(runtime_types::pallet_im_online::pallet::Call), + #[codec(index = 18)] + Treasury(runtime_types::pallet_treasury::pallet::Call), + #[codec(index = 20)] + ConvictionVoting(runtime_types::pallet_conviction_voting::pallet::Call), + #[codec(index = 21)] + Referenda(runtime_types::pallet_referenda::pallet::Call), + #[codec(index = 22)] + FellowshipCollective(runtime_types::pallet_ranked_collective::pallet::Call), + #[codec(index = 23)] + FellowshipReferenda(runtime_types::pallet_referenda::pallet::Call), + #[codec(index = 44)] + Whitelist(runtime_types::pallet_whitelist::pallet::Call), + #[codec(index = 19)] + Claims(runtime_types::polkadot_runtime_common::claims::pallet::Call), + #[codec(index = 24)] + Utility(runtime_types::pallet_utility::pallet::Call), + #[codec(index = 25)] + Identity(runtime_types::pallet_identity::pallet::Call), + #[codec(index = 26)] + Society(runtime_types::pallet_society::pallet::Call), + #[codec(index = 27)] + Recovery(runtime_types::pallet_recovery::pallet::Call), + #[codec(index = 28)] + Vesting(runtime_types::pallet_vesting::pallet::Call), + #[codec(index = 29)] + Scheduler(runtime_types::pallet_scheduler::pallet::Call), + #[codec(index = 30)] + Proxy(runtime_types::pallet_proxy::pallet::Call), + #[codec(index = 31)] + Multisig(runtime_types::pallet_multisig::pallet::Call), + #[codec(index = 32)] + Preimage(runtime_types::pallet_preimage::pallet::Call), + #[codec(index = 35)] + Bounties(runtime_types::pallet_bounties::pallet::Call), + #[codec(index = 40)] + ChildBounties(runtime_types::pallet_child_bounties::pallet::Call), + #[codec(index = 37)] + ElectionProviderMultiPhase( + runtime_types::pallet_election_provider_multi_phase::pallet::Call, + ), + #[codec(index = 38)] + Nis(runtime_types::pallet_nis::pallet::Call), + #[codec(index = 45)] + NisCounterpartBalances(runtime_types::pallet_balances::pallet::Call), + #[codec(index = 39)] + VoterList(runtime_types::pallet_bags_list::pallet::Call), + #[codec(index = 41)] + NominationPools(runtime_types::pallet_nomination_pools::pallet::Call), + #[codec(index = 42)] + FastUnstake(runtime_types::pallet_fast_unstake::pallet::Call), + #[codec(index = 51)] + Configuration( + runtime_types::polkadot_runtime_parachains::configuration::pallet::Call, + ), + #[codec(index = 52)] + ParasShared(runtime_types::polkadot_runtime_parachains::shared::pallet::Call), + #[codec(index = 53)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Call), + #[codec(index = 54)] + ParaInherent( + runtime_types::polkadot_runtime_parachains::paras_inherent::pallet::Call, + ), + #[codec(index = 56)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Call), + #[codec(index = 57)] + Initializer(runtime_types::polkadot_runtime_parachains::initializer::pallet::Call), + #[codec(index = 60)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Call), + #[codec(index = 62)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Call), + #[codec(index = 63)] + ParasSlashing( + runtime_types::polkadot_runtime_parachains::disputes::slashing::pallet::Call, + ), + #[codec(index = 70)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Call), + #[codec(index = 71)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Call), + #[codec(index = 72)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Call), + #[codec(index = 73)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Call), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Call), + #[codec(index = 100)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Call), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeEvent { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Event), + #[codec(index = 3)] + Indices(runtime_types::pallet_indices::pallet::Event), + #[codec(index = 4)] + Balances(runtime_types::pallet_balances::pallet::Event), + #[codec(index = 33)] + TransactionPayment(runtime_types::pallet_transaction_payment::pallet::Event), + #[codec(index = 6)] + Staking(runtime_types::pallet_staking::pallet::pallet::Event), + #[codec(index = 7)] + Offences(runtime_types::pallet_offences::pallet::Event), + #[codec(index = 8)] + Session(runtime_types::pallet_session::pallet::Event), + #[codec(index = 10)] + Grandpa(runtime_types::pallet_grandpa::pallet::Event), + #[codec(index = 11)] + ImOnline(runtime_types::pallet_im_online::pallet::Event), + #[codec(index = 18)] + Treasury(runtime_types::pallet_treasury::pallet::Event), + #[codec(index = 20)] + ConvictionVoting(runtime_types::pallet_conviction_voting::pallet::Event), + #[codec(index = 21)] + Referenda(runtime_types::pallet_referenda::pallet::Event), + #[codec(index = 22)] + FellowshipCollective(runtime_types::pallet_ranked_collective::pallet::Event), + #[codec(index = 23)] + FellowshipReferenda(runtime_types::pallet_referenda::pallet::Event), + #[codec(index = 44)] + Whitelist(runtime_types::pallet_whitelist::pallet::Event), + #[codec(index = 19)] + Claims(runtime_types::polkadot_runtime_common::claims::pallet::Event), + #[codec(index = 24)] + Utility(runtime_types::pallet_utility::pallet::Event), + #[codec(index = 25)] + Identity(runtime_types::pallet_identity::pallet::Event), + #[codec(index = 26)] + Society(runtime_types::pallet_society::pallet::Event), + #[codec(index = 27)] + Recovery(runtime_types::pallet_recovery::pallet::Event), + #[codec(index = 28)] + Vesting(runtime_types::pallet_vesting::pallet::Event), + #[codec(index = 29)] + Scheduler(runtime_types::pallet_scheduler::pallet::Event), + #[codec(index = 30)] + Proxy(runtime_types::pallet_proxy::pallet::Event), + #[codec(index = 31)] + Multisig(runtime_types::pallet_multisig::pallet::Event), + #[codec(index = 32)] + Preimage(runtime_types::pallet_preimage::pallet::Event), + #[codec(index = 35)] + Bounties(runtime_types::pallet_bounties::pallet::Event), + #[codec(index = 40)] + ChildBounties(runtime_types::pallet_child_bounties::pallet::Event), + #[codec(index = 37)] + ElectionProviderMultiPhase( + runtime_types::pallet_election_provider_multi_phase::pallet::Event, + ), + #[codec(index = 38)] + Nis(runtime_types::pallet_nis::pallet::Event), + #[codec(index = 45)] + NisCounterpartBalances(runtime_types::pallet_balances::pallet::Event), + #[codec(index = 39)] + VoterList(runtime_types::pallet_bags_list::pallet::Event), + #[codec(index = 41)] + NominationPools(runtime_types::pallet_nomination_pools::pallet::Event), + #[codec(index = 42)] + FastUnstake(runtime_types::pallet_fast_unstake::pallet::Event), + #[codec(index = 53)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Event), + #[codec(index = 56)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Event), + #[codec(index = 60)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Event), + #[codec(index = 62)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Event), + #[codec(index = 70)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Event), + #[codec(index = 71)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Event), + #[codec(index = 72)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Event), + #[codec(index = 73)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Event), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Event), + #[codec(index = 100)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Event), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeHoldReason { + #[codec(index = 38)] + Nis(runtime_types::pallet_nis::pallet::HoldReason), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionKeys { + pub grandpa: runtime_types::sp_consensus_grandpa::app::Public, + pub babe: runtime_types::sp_consensus_babe::app::Public, + pub im_online: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + pub para_validator: runtime_types::polkadot_primitives::v4::validator_app::Public, + pub para_assignment: runtime_types::polkadot_primitives::v4::assignment_app::Public, + pub authority_discovery: runtime_types::sp_authority_discovery::app::Public, + } + } + pub mod pallet_babe { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + plan_config_change { + config: runtime_types::sp_consensus_babe::digests::NextConfigDescriptor, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEquivocationProof, + #[codec(index = 1)] + InvalidKeyOwnershipProof, + #[codec(index = 2)] + DuplicateOffenceReport, + #[codec(index = 3)] + InvalidConfiguration, + } + } + } + pub mod pallet_bags_list { + use super::runtime_types; + pub mod list { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bag { + pub head: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub tail: ::core::option::Option<::sp_core::crypto::AccountId32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ListError { + #[codec(index = 0)] + Duplicate, + #[codec(index = 1)] + NotHeavier, + #[codec(index = 2)] + NotInSameBag, + #[codec(index = 3)] + NodeNotFound, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Node { + pub id: ::sp_core::crypto::AccountId32, + pub prev: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub next: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub bag_upper: ::core::primitive::u64, + pub score: ::core::primitive::u64, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + rebag { + dislocated: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + put_in_front_of { + lighter: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + List(runtime_types::pallet_bags_list::list::ListError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Rebagged { + who: ::sp_core::crypto::AccountId32, + from: ::core::primitive::u64, + to: ::core::primitive::u64, + }, + #[codec(index = 1)] + ScoreUpdated { + who: ::sp_core::crypto::AccountId32, + new_score: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_balances { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + transfer_allow_death { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + set_balance_deprecated { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + #[codec(compact)] + old_reserved: ::core::primitive::u128, + }, + #[codec(index = 2)] + force_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + transfer_keep_alive { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + transfer_all { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + keep_alive: ::core::primitive::bool, + }, + #[codec(index = 5)] + force_unreserve { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + upgrade_accounts { who: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 7)] + transfer { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 8)] + force_set_balance { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + VestingBalance, + #[codec(index = 1)] + LiquidityRestrictions, + #[codec(index = 2)] + InsufficientBalance, + #[codec(index = 3)] + ExistentialDeposit, + #[codec(index = 4)] + Expendability, + #[codec(index = 5)] + ExistingVestingSchedule, + #[codec(index = 6)] + DeadAccount, + #[codec(index = 7)] + TooManyReserves, + #[codec(index = 8)] + TooManyHolds, + #[codec(index = 9)] + TooManyFreezes, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Endowed { + account: ::sp_core::crypto::AccountId32, + free_balance: ::core::primitive::u128, + }, + #[codec(index = 1)] + DustLost { + account: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Transfer { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + BalanceSet { + who: ::sp_core::crypto::AccountId32, + free: ::core::primitive::u128, + }, + #[codec(index = 4)] + Reserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + Unreserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + ReserveRepatriated { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + destination_status: + runtime_types::frame_support::traits::tokens::misc::BalanceStatus, + }, + #[codec(index = 7)] + Deposit { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 8)] + Withdraw { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Slashed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 10)] + Minted { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 11)] + Burned { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 12)] + Suspended { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 13)] + Restored { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 14)] + Upgraded { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 15)] + Issued { amount: ::core::primitive::u128 }, + #[codec(index = 16)] + Rescinded { amount: ::core::primitive::u128 }, + #[codec(index = 17)] + Locked { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 18)] + Unlocked { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 19)] + Frozen { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 20)] + Thawed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountData<_0> { + pub free: _0, + pub reserved: _0, + pub frozen: _0, + pub flags: runtime_types::pallet_balances::types::ExtraFlags, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BalanceLock<_0> { + pub id: [::core::primitive::u8; 8usize], + pub amount: _0, + pub reasons: runtime_types::pallet_balances::types::Reasons, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ExtraFlags(pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdAmount<_0, _1> { + pub id: _0, + pub amount: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Reasons { + #[codec(index = 0)] + Fee, + #[codec(index = 1)] + Misc, + #[codec(index = 2)] + All, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReserveData<_0, _1> { + pub id: _0, + pub amount: _1, + } + } + } + pub mod pallet_bounties { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose_bounty { + #[codec(compact)] + value: ::core::primitive::u128, + description: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + approve_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 2)] + propose_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + curator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 3)] + unassign_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 4)] + accept_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 5)] + award_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + claim_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 7)] + close_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 8)] + extend_bounty_expiry { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + remark: ::std::vec::Vec<::core::primitive::u8>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InsufficientProposersBalance, + #[codec(index = 1)] + InvalidIndex, + #[codec(index = 2)] + ReasonTooBig, + #[codec(index = 3)] + UnexpectedStatus, + #[codec(index = 4)] + RequireCurator, + #[codec(index = 5)] + InvalidValue, + #[codec(index = 6)] + InvalidFee, + #[codec(index = 7)] + PendingPayout, + #[codec(index = 8)] + Premature, + #[codec(index = 9)] + HasActiveChildBounty, + #[codec(index = 10)] + TooManyQueued, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BountyProposed { index: ::core::primitive::u32 }, + #[codec(index = 1)] + BountyRejected { index: ::core::primitive::u32, bond: ::core::primitive::u128 }, + #[codec(index = 2)] + BountyBecameActive { index: ::core::primitive::u32 }, + #[codec(index = 3)] + BountyAwarded { + index: ::core::primitive::u32, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 4)] + BountyClaimed { + index: ::core::primitive::u32, + payout: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 5)] + BountyCanceled { index: ::core::primitive::u32 }, + #[codec(index = 6)] + BountyExtended { index: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bounty<_0, _1, _2> { + pub proposer: _0, + pub value: _1, + pub fee: _1, + pub curator_deposit: _1, + pub bond: _1, + pub status: runtime_types::pallet_bounties::BountyStatus<_0, _2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BountyStatus<_0, _1> { + #[codec(index = 0)] + Proposed, + #[codec(index = 1)] + Approved, + #[codec(index = 2)] + Funded, + #[codec(index = 3)] + CuratorProposed { curator: _0 }, + #[codec(index = 4)] + Active { curator: _0, update_due: _1 }, + #[codec(index = 5)] + PendingPayout { curator: _0, beneficiary: _0, unlock_at: _1 }, + } + } + pub mod pallet_child_bounties { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + value: ::core::primitive::u128, + description: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + propose_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + curator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 2)] + accept_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 3)] + unassign_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 4)] + award_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + claim_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 6)] + close_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParentBountyNotActive, + #[codec(index = 1)] + InsufficientBountyBalance, + #[codec(index = 2)] + TooManyChildBounties, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Added { index: ::core::primitive::u32, child_index: ::core::primitive::u32 }, + #[codec(index = 1)] + Awarded { + index: ::core::primitive::u32, + child_index: ::core::primitive::u32, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 2)] + Claimed { + index: ::core::primitive::u32, + child_index: ::core::primitive::u32, + payout: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Canceled { index: ::core::primitive::u32, child_index: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChildBounty<_0, _1, _2> { + pub parent_bounty: _2, + pub value: _1, + pub fee: _1, + pub curator_deposit: _1, + pub status: runtime_types::pallet_child_bounties::ChildBountyStatus<_0, _2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ChildBountyStatus<_0, _1> { + #[codec(index = 0)] + Added, + #[codec(index = 1)] + CuratorProposed { curator: _0 }, + #[codec(index = 2)] + Active { curator: _0 }, + #[codec(index = 3)] + PendingPayout { curator: _0, beneficiary: _0, unlock_at: _1 }, + } + } + pub mod pallet_conviction_voting { + use super::runtime_types; + pub mod conviction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Conviction { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Locked1x, + #[codec(index = 2)] + Locked2x, + #[codec(index = 3)] + Locked3x, + #[codec(index = 4)] + Locked4x, + #[codec(index = 5)] + Locked5x, + #[codec(index = 6)] + Locked6x, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vote { + #[codec(compact)] + poll_index: ::core::primitive::u32, + vote: runtime_types::pallet_conviction_voting::vote::AccountVote< + ::core::primitive::u128, + >, + }, + #[codec(index = 1)] + delegate { + class: ::core::primitive::u16, + to: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + conviction: runtime_types::pallet_conviction_voting::conviction::Conviction, + balance: ::core::primitive::u128, + }, + #[codec(index = 2)] + undelegate { class: ::core::primitive::u16 }, + #[codec(index = 3)] + unlock { + class: ::core::primitive::u16, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + remove_vote { + class: ::core::option::Option<::core::primitive::u16>, + index: ::core::primitive::u32, + }, + #[codec(index = 5)] + remove_other_vote { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + class: ::core::primitive::u16, + index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotOngoing, + #[codec(index = 1)] + NotVoter, + #[codec(index = 2)] + NoPermission, + #[codec(index = 3)] + NoPermissionYet, + #[codec(index = 4)] + AlreadyDelegating, + #[codec(index = 5)] + AlreadyVoting, + #[codec(index = 6)] + InsufficientFunds, + #[codec(index = 7)] + NotDelegating, + #[codec(index = 8)] + Nonsense, + #[codec(index = 9)] + MaxVotesReached, + #[codec(index = 10)] + ClassNeeded, + #[codec(index = 11)] + BadClass, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Delegated(::sp_core::crypto::AccountId32, ::sp_core::crypto::AccountId32), + #[codec(index = 1)] + Undelegated(::sp_core::crypto::AccountId32), + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Delegations<_0> { + pub votes: _0, + pub capital: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Tally<_0> { + pub ayes: _0, + pub nays: _0, + pub support: _0, + } + } + pub mod vote { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AccountVote<_0> { + #[codec(index = 0)] + Standard { + vote: runtime_types::pallet_conviction_voting::vote::Vote, + balance: _0, + }, + #[codec(index = 1)] + Split { aye: _0, nay: _0 }, + #[codec(index = 2)] + SplitAbstain { aye: _0, nay: _0, abstain: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Casting<_0, _1, _2> { + pub votes: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _1, + runtime_types::pallet_conviction_voting::vote::AccountVote<_0>, + )>, + pub delegations: + runtime_types::pallet_conviction_voting::types::Delegations<_0>, + pub prior: runtime_types::pallet_conviction_voting::vote::PriorLock<_1, _0>, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Delegating<_0, _1, _2> { + pub balance: _0, + pub target: _1, + pub conviction: runtime_types::pallet_conviction_voting::conviction::Conviction, + pub delegations: + runtime_types::pallet_conviction_voting::types::Delegations<_0>, + pub prior: runtime_types::pallet_conviction_voting::vote::PriorLock<_2, _0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PriorLock<_0, _1>(pub _0, pub _1); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Vote(pub ::core::primitive::u8); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Voting<_0, _1, _2, _3> { + #[codec(index = 0)] + Casting(runtime_types::pallet_conviction_voting::vote::Casting<_0, _2, _2>), + #[codec(index = 1)] + Delegating( + runtime_types::pallet_conviction_voting::vote::Delegating<_0, _1, _2>, + ), + __Ignore(::core::marker::PhantomData<_3>), + } + } + } + pub mod pallet_election_provider_multi_phase { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] submit_unsigned { raw_solution : :: std :: boxed :: Box < runtime_types :: pallet_election_provider_multi_phase :: RawSolution < runtime_types :: kusama_runtime :: NposCompactSolution24 > > , witness : runtime_types :: pallet_election_provider_multi_phase :: SolutionOrSnapshotSize , } , # [codec (index = 1)] set_minimum_untrusted_score { maybe_next_score : :: core :: option :: Option < runtime_types :: sp_npos_elections :: ElectionScore > , } , # [codec (index = 2)] set_emergency_election_result { supports : :: std :: vec :: Vec < (:: sp_core :: crypto :: AccountId32 , runtime_types :: sp_npos_elections :: Support < :: sp_core :: crypto :: AccountId32 > ,) > , } , # [codec (index = 3)] submit { raw_solution : :: std :: boxed :: Box < runtime_types :: pallet_election_provider_multi_phase :: RawSolution < runtime_types :: kusama_runtime :: NposCompactSolution24 > > , } , # [codec (index = 4)] governance_fallback { maybe_max_voters : :: core :: option :: Option < :: core :: primitive :: u32 > , maybe_max_targets : :: core :: option :: Option < :: core :: primitive :: u32 > , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PreDispatchEarlySubmission, + #[codec(index = 1)] + PreDispatchWrongWinnerCount, + #[codec(index = 2)] + PreDispatchWeakSubmission, + #[codec(index = 3)] + SignedQueueFull, + #[codec(index = 4)] + SignedCannotPayDeposit, + #[codec(index = 5)] + SignedInvalidWitness, + #[codec(index = 6)] + SignedTooMuchWeight, + #[codec(index = 7)] + OcwCallWrongEra, + #[codec(index = 8)] + MissingSnapshotMetadata, + #[codec(index = 9)] + InvalidSubmissionIndex, + #[codec(index = 10)] + CallNotAllowed, + #[codec(index = 11)] + FallbackFailed, + #[codec(index = 12)] + BoundNotMet, + #[codec(index = 13)] + TooManyWinners, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + SolutionStored { + compute: + runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + origin: ::core::option::Option<::sp_core::crypto::AccountId32>, + prev_ejected: ::core::primitive::bool, + }, + #[codec(index = 1)] + ElectionFinalized { + compute: + runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + score: runtime_types::sp_npos_elections::ElectionScore, + }, + #[codec(index = 2)] + ElectionFailed, + #[codec(index = 3)] + Rewarded { + account: ::sp_core::crypto::AccountId32, + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + Slashed { + account: ::sp_core::crypto::AccountId32, + value: ::core::primitive::u128, + }, + #[codec(index = 5)] + PhaseTransitioned { + from: runtime_types::pallet_election_provider_multi_phase::Phase< + ::core::primitive::u32, + >, + to: runtime_types::pallet_election_provider_multi_phase::Phase< + ::core::primitive::u32, + >, + round: ::core::primitive::u32, + }, + } + } + pub mod signed { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SignedSubmission<_0, _1, _2> { + pub who: _0, + pub deposit: _1, + pub raw_solution: + runtime_types::pallet_election_provider_multi_phase::RawSolution<_2>, + pub call_fee: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ElectionCompute { + #[codec(index = 0)] + OnChain, + #[codec(index = 1)] + Signed, + #[codec(index = 2)] + Unsigned, + #[codec(index = 3)] + Fallback, + #[codec(index = 4)] + Emergency, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase<_0> { + #[codec(index = 0)] + Off, + #[codec(index = 1)] + Signed, + #[codec(index = 2)] + Unsigned((::core::primitive::bool, _0)), + #[codec(index = 3)] + Emergency, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RawSolution<_0> { + pub solution: _0, + pub score: runtime_types::sp_npos_elections::ElectionScore, + pub round: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReadySolution { + pub supports: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::sp_core::crypto::AccountId32, + runtime_types::sp_npos_elections::Support<::sp_core::crypto::AccountId32>, + )>, + pub score: runtime_types::sp_npos_elections::ElectionScore, + pub compute: runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RoundSnapshot<_0, _1> { + pub voters: ::std::vec::Vec<_1>, + pub targets: ::std::vec::Vec<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SolutionOrSnapshotSize { + #[codec(compact)] + pub voters: ::core::primitive::u32, + #[codec(compact)] + pub targets: ::core::primitive::u32, + } + } + pub mod pallet_fast_unstake { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register_fast_unstake, + #[codec(index = 1)] + deregister, + #[codec(index = 2)] + control { eras_to_check: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotController, + #[codec(index = 1)] + AlreadyQueued, + #[codec(index = 2)] + NotFullyBonded, + #[codec(index = 3)] + NotQueued, + #[codec(index = 4)] + AlreadyHead, + #[codec(index = 5)] + CallNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Unstaked { + stash: ::sp_core::crypto::AccountId32, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + Slashed { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + InternalError, + #[codec(index = 3)] + BatchChecked { eras: ::std::vec::Vec<::core::primitive::u32> }, + #[codec(index = 4)] + BatchFinished { size: ::core::primitive::u32 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnstakeRequest { + pub stashes: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + )>, + pub checked: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u32, + >, + } + } + } + pub mod pallet_grandpa { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + note_stalled { + delay: ::core::primitive::u32, + best_finalized_block_number: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PauseFailed, + #[codec(index = 1)] + ResumeFailed, + #[codec(index = 2)] + ChangePending, + #[codec(index = 3)] + TooSoon, + #[codec(index = 4)] + InvalidKeyOwnershipProof, + #[codec(index = 5)] + InvalidEquivocationProof, + #[codec(index = 6)] + DuplicateOffenceReport, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewAuthorities { + authority_set: ::std::vec::Vec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + }, + #[codec(index = 1)] + Paused, + #[codec(index = 2)] + Resumed, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredPendingChange<_0> { + pub scheduled_at: _0, + pub delay: _0, + pub next_authorities: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub forced: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StoredState<_0> { + #[codec(index = 0)] + Live, + #[codec(index = 1)] + PendingPause { scheduled_at: _0, delay: _0 }, + #[codec(index = 2)] + Paused, + #[codec(index = 3)] + PendingResume { scheduled_at: _0, delay: _0 }, + } + } + pub mod pallet_identity { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_registrar { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + set_identity { + info: + ::std::boxed::Box, + }, + #[codec(index = 2)] + set_subs { + subs: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + runtime_types::pallet_identity::types::Data, + )>, + }, + #[codec(index = 3)] + clear_identity, + #[codec(index = 4)] + request_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + #[codec(compact)] + max_fee: ::core::primitive::u128, + }, + #[codec(index = 5)] + cancel_request { reg_index: ::core::primitive::u32 }, + #[codec(index = 6)] + set_fee { + #[codec(compact)] + index: ::core::primitive::u32, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 7)] + set_account_id { + #[codec(compact)] + index: ::core::primitive::u32, + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 8)] + set_fields { + #[codec(compact)] + index: ::core::primitive::u32, + fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + }, + #[codec(index = 9)] + provide_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + judgement: runtime_types::pallet_identity::types::Judgement< + ::core::primitive::u128, + >, + identity: ::subxt::utils::H256, + }, + #[codec(index = 10)] + kill_identity { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 11)] + add_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 12)] + rename_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 13)] + remove_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 14)] + quit_sub, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManySubAccounts, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotNamed, + #[codec(index = 3)] + EmptyIndex, + #[codec(index = 4)] + FeeChanged, + #[codec(index = 5)] + NoIdentity, + #[codec(index = 6)] + StickyJudgement, + #[codec(index = 7)] + JudgementGiven, + #[codec(index = 8)] + InvalidJudgement, + #[codec(index = 9)] + InvalidIndex, + #[codec(index = 10)] + InvalidTarget, + #[codec(index = 11)] + TooManyFields, + #[codec(index = 12)] + TooManyRegistrars, + #[codec(index = 13)] + AlreadyClaimed, + #[codec(index = 14)] + NotSub, + #[codec(index = 15)] + NotOwned, + #[codec(index = 16)] + JudgementForDifferentIdentity, + #[codec(index = 17)] + JudgementPaymentFailed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IdentitySet { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + IdentityCleared { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 2)] + IdentityKilled { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 3)] + JudgementRequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 4)] + JudgementUnrequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 5)] + JudgementGiven { + target: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + RegistrarAdded { registrar_index: ::core::primitive::u32 }, + #[codec(index = 7)] + SubIdentityAdded { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 8)] + SubIdentityRemoved { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 9)] + SubIdentityRevoked { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + } + } + pub mod types { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct BitFlags<_0>( + pub ::core::primitive::u64, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Data { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Raw0([::core::primitive::u8; 0usize]), + #[codec(index = 2)] + Raw1([::core::primitive::u8; 1usize]), + #[codec(index = 3)] + Raw2([::core::primitive::u8; 2usize]), + #[codec(index = 4)] + Raw3([::core::primitive::u8; 3usize]), + #[codec(index = 5)] + Raw4([::core::primitive::u8; 4usize]), + #[codec(index = 6)] + Raw5([::core::primitive::u8; 5usize]), + #[codec(index = 7)] + Raw6([::core::primitive::u8; 6usize]), + #[codec(index = 8)] + Raw7([::core::primitive::u8; 7usize]), + #[codec(index = 9)] + Raw8([::core::primitive::u8; 8usize]), + #[codec(index = 10)] + Raw9([::core::primitive::u8; 9usize]), + #[codec(index = 11)] + Raw10([::core::primitive::u8; 10usize]), + #[codec(index = 12)] + Raw11([::core::primitive::u8; 11usize]), + #[codec(index = 13)] + Raw12([::core::primitive::u8; 12usize]), + #[codec(index = 14)] + Raw13([::core::primitive::u8; 13usize]), + #[codec(index = 15)] + Raw14([::core::primitive::u8; 14usize]), + #[codec(index = 16)] + Raw15([::core::primitive::u8; 15usize]), + #[codec(index = 17)] + Raw16([::core::primitive::u8; 16usize]), + #[codec(index = 18)] + Raw17([::core::primitive::u8; 17usize]), + #[codec(index = 19)] + Raw18([::core::primitive::u8; 18usize]), + #[codec(index = 20)] + Raw19([::core::primitive::u8; 19usize]), + #[codec(index = 21)] + Raw20([::core::primitive::u8; 20usize]), + #[codec(index = 22)] + Raw21([::core::primitive::u8; 21usize]), + #[codec(index = 23)] + Raw22([::core::primitive::u8; 22usize]), + #[codec(index = 24)] + Raw23([::core::primitive::u8; 23usize]), + #[codec(index = 25)] + Raw24([::core::primitive::u8; 24usize]), + #[codec(index = 26)] + Raw25([::core::primitive::u8; 25usize]), + #[codec(index = 27)] + Raw26([::core::primitive::u8; 26usize]), + #[codec(index = 28)] + Raw27([::core::primitive::u8; 27usize]), + #[codec(index = 29)] + Raw28([::core::primitive::u8; 28usize]), + #[codec(index = 30)] + Raw29([::core::primitive::u8; 29usize]), + #[codec(index = 31)] + Raw30([::core::primitive::u8; 30usize]), + #[codec(index = 32)] + Raw31([::core::primitive::u8; 31usize]), + #[codec(index = 33)] + Raw32([::core::primitive::u8; 32usize]), + #[codec(index = 34)] + BlakeTwo256([::core::primitive::u8; 32usize]), + #[codec(index = 35)] + Sha256([::core::primitive::u8; 32usize]), + #[codec(index = 36)] + Keccak256([::core::primitive::u8; 32usize]), + #[codec(index = 37)] + ShaThree256([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum IdentityField { + #[codec(index = 1)] + Display, + #[codec(index = 2)] + Legal, + #[codec(index = 4)] + Web, + #[codec(index = 8)] + Riot, + #[codec(index = 16)] + Email, + #[codec(index = 32)] + PgpFingerprint, + #[codec(index = 64)] + Image, + #[codec(index = 128)] + Twitter, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdentityInfo { + pub additional: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + runtime_types::pallet_identity::types::Data, + runtime_types::pallet_identity::types::Data, + )>, + pub display: runtime_types::pallet_identity::types::Data, + pub legal: runtime_types::pallet_identity::types::Data, + pub web: runtime_types::pallet_identity::types::Data, + pub riot: runtime_types::pallet_identity::types::Data, + pub email: runtime_types::pallet_identity::types::Data, + pub pgp_fingerprint: ::core::option::Option<[::core::primitive::u8; 20usize]>, + pub image: runtime_types::pallet_identity::types::Data, + pub twitter: runtime_types::pallet_identity::types::Data, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Judgement<_0> { + #[codec(index = 0)] + Unknown, + #[codec(index = 1)] + FeePaid(_0), + #[codec(index = 2)] + Reasonable, + #[codec(index = 3)] + KnownGood, + #[codec(index = 4)] + OutOfDate, + #[codec(index = 5)] + LowQuality, + #[codec(index = 6)] + Erroneous, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RegistrarInfo<_0, _1> { + pub account: _1, + pub fee: _0, + pub fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Registration<_0> { + pub judgements: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::core::primitive::u32, + runtime_types::pallet_identity::types::Judgement<_0>, + )>, + pub deposit: _0, + pub info: runtime_types::pallet_identity::types::IdentityInfo, + } + } + } + pub mod pallet_im_online { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + heartbeat { + heartbeat: + runtime_types::pallet_im_online::Heartbeat<::core::primitive::u32>, + signature: runtime_types::pallet_im_online::sr25519::app_sr25519::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidKey, + #[codec(index = 1)] + DuplicatedHeartbeat, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + HeartbeatReceived { + authority_id: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + }, + #[codec(index = 1)] + AllGood, + #[codec(index = 2)] + SomeOffline { + offline: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + runtime_types::pallet_staking::Exposure< + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + >, + )>, + }, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod app_sr25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedOpaqueNetworkState { + pub peer_id: runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + pub external_addresses: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Heartbeat<_0> { + pub block_number: _0, + pub network_state: runtime_types::sp_core::offchain::OpaqueNetworkState, + pub session_index: _0, + pub authority_index: _0, + pub validators_len: _0, + } + } + pub mod pallet_indices { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim { index: ::core::primitive::u32 }, + #[codec(index = 1)] + transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + }, + #[codec(index = 2)] + free { index: ::core::primitive::u32 }, + #[codec(index = 3)] + force_transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + freeze: ::core::primitive::bool, + }, + #[codec(index = 4)] + freeze { index: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotAssigned, + #[codec(index = 1)] + NotOwner, + #[codec(index = 2)] + InUse, + #[codec(index = 3)] + NotTransfer, + #[codec(index = 4)] + Permanent, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IndexAssigned { + who: ::sp_core::crypto::AccountId32, + index: ::core::primitive::u32, + }, + #[codec(index = 1)] + IndexFreed { index: ::core::primitive::u32 }, + #[codec(index = 2)] + IndexFrozen { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + }, + } + } + } + pub mod pallet_message_queue { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] reap_page { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , } , # [codec (index = 1)] execute_overweight { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page : :: core :: primitive :: u32 , index : :: core :: primitive :: u32 , weight_limit : :: sp_weights :: Weight , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotReapable, + #[codec(index = 1)] + NoPage, + #[codec(index = 2)] + NoMessage, + #[codec(index = 3)] + AlreadyProcessed, + #[codec(index = 4)] + Queued, + #[codec(index = 5)] + InsufficientWeight, + #[codec(index = 6)] + TemporarilyUnprocessable, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + # [codec (index = 0)] ProcessingFailed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , error : runtime_types :: frame_support :: traits :: messages :: ProcessMessageError , } , # [codec (index = 1)] Processed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , weight_used : :: sp_weights :: Weight , success : :: core :: primitive :: bool , } , # [codec (index = 2)] OverweightEnqueued { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , message_index : :: core :: primitive :: u32 , } , # [codec (index = 3)] PageReaped { origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , index : :: core :: primitive :: u32 , } , } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BookState<_0> { + pub begin: ::core::primitive::u32, + pub end: ::core::primitive::u32, + pub count: ::core::primitive::u32, + pub ready_neighbours: + ::core::option::Option>, + pub message_count: ::core::primitive::u64, + pub size: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Neighbours<_0> { + pub prev: _0, + pub next: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Page<_0> { + pub remaining: _0, + pub remaining_size: _0, + pub first_index: _0, + pub first: _0, + pub last: _0, + pub heap: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + } + } + pub mod pallet_multisig { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_multi_threshold_1 { + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + approve_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call_hash: [::core::primitive::u8; 32usize], + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 3)] + cancel_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + call_hash: [::core::primitive::u8; 32usize], + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + MinimumThreshold, + #[codec(index = 1)] + AlreadyApproved, + #[codec(index = 2)] + NoApprovalsNeeded, + #[codec(index = 3)] + TooFewSignatories, + #[codec(index = 4)] + TooManySignatories, + #[codec(index = 5)] + SignatoriesOutOfOrder, + #[codec(index = 6)] + SenderInSignatories, + #[codec(index = 7)] + NotFound, + #[codec(index = 8)] + NotOwner, + #[codec(index = 9)] + NoTimepoint, + #[codec(index = 10)] + WrongTimepoint, + #[codec(index = 11)] + UnexpectedTimepoint, + #[codec(index = 12)] + MaxWeightTooLow, + #[codec(index = 13)] + AlreadyStored, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewMultisig { + approving: ::sp_core::crypto::AccountId32, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 1)] + MultisigApproval { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + MultisigExecuted { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + MultisigCancelled { + cancelling: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Multisig<_0, _1, _2> { + pub when: runtime_types::pallet_multisig::Timepoint<_0>, + pub deposit: _1, + pub depositor: _2, + pub approvals: runtime_types::bounded_collections::bounded_vec::BoundedVec<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Timepoint<_0> { + pub height: _0, + pub index: _0, + } + } + pub mod pallet_nis { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bid<_0, _1> { + pub amount: _0, + pub who: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + place_bid { + #[codec(compact)] + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 1)] + retract_bid { + #[codec(compact)] + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 2)] + fund_deficit, + #[codec(index = 3)] + thaw_private { + #[codec(compact)] + index: ::core::primitive::u32, + maybe_proportion: ::core::option::Option< + runtime_types::sp_arithmetic::per_things::Perquintill, + >, + }, + #[codec(index = 4)] + thaw_communal { + #[codec(compact)] + index: ::core::primitive::u32, + }, + #[codec(index = 5)] + communify { + #[codec(compact)] + index: ::core::primitive::u32, + }, + #[codec(index = 6)] + privatize { + #[codec(compact)] + index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DurationTooSmall, + #[codec(index = 1)] + DurationTooBig, + #[codec(index = 2)] + AmountTooSmall, + #[codec(index = 3)] + BidTooLow, + #[codec(index = 4)] + UnknownReceipt, + #[codec(index = 5)] + NotOwner, + #[codec(index = 6)] + NotExpired, + #[codec(index = 7)] + UnknownBid, + #[codec(index = 8)] + PortionTooBig, + #[codec(index = 9)] + Unfunded, + #[codec(index = 10)] + AlreadyFunded, + #[codec(index = 11)] + Throttled, + #[codec(index = 12)] + MakesDust, + #[codec(index = 13)] + AlreadyCommunal, + #[codec(index = 14)] + AlreadyPrivate, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BidPlaced { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 1)] + BidRetracted { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 2)] + BidDropped { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 3)] + Issued { + index: ::core::primitive::u32, + expiry: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + proportion: runtime_types::sp_arithmetic::per_things::Perquintill, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + Thawed { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + proportion: runtime_types::sp_arithmetic::per_things::Perquintill, + amount: ::core::primitive::u128, + dropped: ::core::primitive::bool, + }, + #[codec(index = 5)] + Funded { deficit: ::core::primitive::u128 }, + #[codec(index = 6)] + Transferred { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum HoldReason { + #[codec(index = 0)] + NftReceipt, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReceiptRecord<_0, _1, _2> { + pub proportion: runtime_types::sp_arithmetic::per_things::Perquintill, + pub owner: ::core::option::Option<(_0, _2)>, + pub expiry: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SummaryRecord<_0, _1> { + pub proportion_owed: runtime_types::sp_arithmetic::per_things::Perquintill, + pub index: _0, + pub thawed: runtime_types::sp_arithmetic::per_things::Perquintill, + pub last_period: _0, + pub receipts_on_hold: _1, + } + } + } + pub mod pallet_nomination_pools { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + join { + #[codec(compact)] + amount: ::core::primitive::u128, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 1)] + bond_extra { + extra: runtime_types::pallet_nomination_pools::BondExtra< + ::core::primitive::u128, + >, + }, + #[codec(index = 2)] + claim_payout, + #[codec(index = 3)] + unbond { + member_account: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + unbonding_points: ::core::primitive::u128, + }, + #[codec(index = 4)] + pool_withdraw_unbonded { + pool_id: ::core::primitive::u32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 5)] + withdraw_unbonded { + member_account: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 6)] + create { + #[codec(compact)] + amount: ::core::primitive::u128, + root: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + nominator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + bouncer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 7)] + create_with_pool_id { + #[codec(compact)] + amount: ::core::primitive::u128, + root: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + nominator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + bouncer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 8)] + nominate { + pool_id: ::core::primitive::u32, + validators: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 9)] + set_state { + pool_id: ::core::primitive::u32, + state: runtime_types::pallet_nomination_pools::PoolState, + }, + #[codec(index = 10)] + set_metadata { + pool_id: ::core::primitive::u32, + metadata: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 11)] + set_configs { + min_join_bond: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u128, + >, + min_create_bond: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u128, + >, + max_pools: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + max_members: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + max_members_per_pool: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + global_max_commission: runtime_types::pallet_nomination_pools::ConfigOp< + runtime_types::sp_arithmetic::per_things::Perbill, + >, + }, + #[codec(index = 12)] + update_roles { + pool_id: ::core::primitive::u32, + new_root: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + new_nominator: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + new_bouncer: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 13)] + chill { pool_id: ::core::primitive::u32 }, + #[codec(index = 14)] + bond_extra_other { + member: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + extra: runtime_types::pallet_nomination_pools::BondExtra< + ::core::primitive::u128, + >, + }, + #[codec(index = 15)] + set_claim_permission { + permission: runtime_types::pallet_nomination_pools::ClaimPermission, + }, + #[codec(index = 16)] + claim_payout_other { other: ::sp_core::crypto::AccountId32 }, + #[codec(index = 17)] + set_commission { + pool_id: ::core::primitive::u32, + new_commission: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + }, + #[codec(index = 18)] + set_commission_max { + pool_id: ::core::primitive::u32, + max_commission: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 19)] + set_commission_change_rate { + pool_id: ::core::primitive::u32, + change_rate: runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + }, + #[codec(index = 20)] + claim_commission { pool_id: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DefensiveError { + #[codec(index = 0)] + NotEnoughSpaceInUnbondPool, + #[codec(index = 1)] + PoolNotFound, + #[codec(index = 2)] + RewardPoolNotFound, + #[codec(index = 3)] + SubPoolsNotFound, + #[codec(index = 4)] + BondedStashKilledPrematurely, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PoolNotFound, + #[codec(index = 1)] + PoolMemberNotFound, + #[codec(index = 2)] + RewardPoolNotFound, + #[codec(index = 3)] + SubPoolsNotFound, + #[codec(index = 4)] + AccountBelongsToOtherPool, + #[codec(index = 5)] + FullyUnbonding, + #[codec(index = 6)] + MaxUnbondingLimit, + #[codec(index = 7)] + CannotWithdrawAny, + #[codec(index = 8)] + MinimumBondNotMet, + #[codec(index = 9)] + OverflowRisk, + #[codec(index = 10)] + NotDestroying, + #[codec(index = 11)] + NotNominator, + #[codec(index = 12)] + NotKickerOrDestroying, + #[codec(index = 13)] + NotOpen, + #[codec(index = 14)] + MaxPools, + #[codec(index = 15)] + MaxPoolMembers, + #[codec(index = 16)] + CanNotChangeState, + #[codec(index = 17)] + DoesNotHavePermission, + #[codec(index = 18)] + MetadataExceedsMaxLen, + #[codec(index = 19)] + Defensive(runtime_types::pallet_nomination_pools::pallet::DefensiveError), + #[codec(index = 20)] + PartialUnbondNotAllowedPermissionlessly, + #[codec(index = 21)] + MaxCommissionRestricted, + #[codec(index = 22)] + CommissionExceedsMaximum, + #[codec(index = 23)] + CommissionChangeThrottled, + #[codec(index = 24)] + CommissionChangeRateNotAllowed, + #[codec(index = 25)] + NoPendingCommission, + #[codec(index = 26)] + NoCommissionCurrentSet, + #[codec(index = 27)] + PoolIdInUse, + #[codec(index = 28)] + InvalidPoolId, + #[codec(index = 29)] + BondExtraRestricted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Created { + depositor: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 1)] + Bonded { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + bonded: ::core::primitive::u128, + joined: ::core::primitive::bool, + }, + #[codec(index = 2)] + PaidOut { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + payout: ::core::primitive::u128, + }, + #[codec(index = 3)] + Unbonded { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + points: ::core::primitive::u128, + era: ::core::primitive::u32, + }, + #[codec(index = 4)] + Withdrawn { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + points: ::core::primitive::u128, + }, + #[codec(index = 5)] + Destroyed { pool_id: ::core::primitive::u32 }, + #[codec(index = 6)] + StateChanged { + pool_id: ::core::primitive::u32, + new_state: runtime_types::pallet_nomination_pools::PoolState, + }, + #[codec(index = 7)] + MemberRemoved { + pool_id: ::core::primitive::u32, + member: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + RolesUpdated { + root: ::core::option::Option<::sp_core::crypto::AccountId32>, + bouncer: ::core::option::Option<::sp_core::crypto::AccountId32>, + nominator: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 9)] + PoolSlashed { + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + }, + #[codec(index = 10)] + UnbondingPoolSlashed { + pool_id: ::core::primitive::u32, + era: ::core::primitive::u32, + balance: ::core::primitive::u128, + }, + #[codec(index = 11)] + PoolCommissionUpdated { + pool_id: ::core::primitive::u32, + current: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + }, + #[codec(index = 12)] + PoolMaxCommissionUpdated { + pool_id: ::core::primitive::u32, + max_commission: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 13)] + PoolCommissionChangeRateUpdated { + pool_id: ::core::primitive::u32, + change_rate: runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + }, + #[codec(index = 14)] + PoolCommissionClaimed { + pool_id: ::core::primitive::u32, + commission: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BondExtra<_0> { + #[codec(index = 0)] + FreeBalance(_0), + #[codec(index = 1)] + Rewards, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BondedPoolInner { + pub commission: runtime_types::pallet_nomination_pools::Commission, + pub member_counter: ::core::primitive::u32, + pub points: ::core::primitive::u128, + pub roles: runtime_types::pallet_nomination_pools::PoolRoles< + ::sp_core::crypto::AccountId32, + >, + pub state: runtime_types::pallet_nomination_pools::PoolState, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ClaimPermission { + #[codec(index = 0)] + Permissioned, + #[codec(index = 1)] + PermissionlessCompound, + #[codec(index = 2)] + PermissionlessWithdraw, + #[codec(index = 3)] + PermissionlessAll, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Commission { + pub current: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + pub max: ::core::option::Option, + pub change_rate: ::core::option::Option< + runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + >, + pub throttle_from: ::core::option::Option<::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CommissionChangeRate<_0> { + pub max_increase: runtime_types::sp_arithmetic::per_things::Perbill, + pub min_delay: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ConfigOp<_0> { + #[codec(index = 0)] + Noop, + #[codec(index = 1)] + Set(_0), + #[codec(index = 2)] + Remove, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PoolMember { + pub pool_id: ::core::primitive::u32, + pub points: ::core::primitive::u128, + pub last_recorded_reward_counter: + runtime_types::sp_arithmetic::fixed_point::FixedU128, + pub unbonding_eras: + runtime_types::bounded_collections::bounded_btree_map::BoundedBTreeMap< + ::core::primitive::u32, + ::core::primitive::u128, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PoolRoles<_0> { + pub depositor: _0, + pub root: ::core::option::Option<_0>, + pub nominator: ::core::option::Option<_0>, + pub bouncer: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PoolState { + #[codec(index = 0)] + Open, + #[codec(index = 1)] + Blocked, + #[codec(index = 2)] + Destroying, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RewardPool { + pub last_recorded_reward_counter: + runtime_types::sp_arithmetic::fixed_point::FixedU128, + pub last_recorded_total_payouts: ::core::primitive::u128, + pub total_rewards_claimed: ::core::primitive::u128, + pub total_commission_pending: ::core::primitive::u128, + pub total_commission_claimed: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SubPools { + pub no_era: runtime_types::pallet_nomination_pools::UnbondPool, + pub with_era: + runtime_types::bounded_collections::bounded_btree_map::BoundedBTreeMap< + ::core::primitive::u32, + runtime_types::pallet_nomination_pools::UnbondPool, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnbondPool { + pub points: ::core::primitive::u128, + pub balance: ::core::primitive::u128, + } + } + pub mod pallet_offences { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Offence { + kind: [::core::primitive::u8; 16usize], + timeslot: ::std::vec::Vec<::core::primitive::u8>, + }, + } + } + } + pub mod pallet_preimage { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + note_preimage { bytes: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + unnote_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + request_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 3)] + unrequest_preimage { hash: ::subxt::utils::H256 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooBig, + #[codec(index = 1)] + AlreadyNoted, + #[codec(index = 2)] + NotAuthorized, + #[codec(index = 3)] + NotNoted, + #[codec(index = 4)] + Requested, + #[codec(index = 5)] + NotRequested, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Noted { hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + Requested { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + Cleared { hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RequestStatus<_0, _1> { + #[codec(index = 0)] + Unrequested { deposit: (_0, _1), len: ::core::primitive::u32 }, + #[codec(index = 1)] + Requested { + deposit: ::core::option::Option<(_0, _1)>, + count: ::core::primitive::u32, + len: ::core::option::Option<::core::primitive::u32>, + }, + } + } + pub mod pallet_proxy { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + proxy { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + add_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::kusama_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 2)] + remove_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::kusama_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 3)] + remove_proxies, + #[codec(index = 4)] + create_pure { + proxy_type: runtime_types::kusama_runtime::ProxyType, + delay: ::core::primitive::u32, + index: ::core::primitive::u16, + }, + #[codec(index = 5)] + kill_pure { + spawner: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::kusama_runtime::ProxyType, + index: ::core::primitive::u16, + #[codec(compact)] + height: ::core::primitive::u32, + #[codec(compact)] + ext_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + announce { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 7)] + remove_announcement { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 8)] + reject_announcement { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 9)] + proxy_announced { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooMany, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotProxy, + #[codec(index = 3)] + Unproxyable, + #[codec(index = 4)] + Duplicate, + #[codec(index = 5)] + NoPermission, + #[codec(index = 6)] + Unannounced, + #[codec(index = 7)] + NoSelfProxy, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ProxyExecuted { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + PureCreated { + pure: ::sp_core::crypto::AccountId32, + who: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::kusama_runtime::ProxyType, + disambiguation_index: ::core::primitive::u16, + }, + #[codec(index = 2)] + Announced { + real: ::sp_core::crypto::AccountId32, + proxy: ::sp_core::crypto::AccountId32, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 3)] + ProxyAdded { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::kusama_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 4)] + ProxyRemoved { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::kusama_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Announcement<_0, _1, _2> { + pub real: _0, + pub call_hash: _1, + pub height: _2, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ProxyDefinition<_0, _1, _2> { + pub delegate: _0, + pub proxy_type: _1, + pub delay: _2, + } + } + pub mod pallet_ranked_collective { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + promote_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + demote_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 3)] + remove_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + min_rank: ::core::primitive::u16, + }, + #[codec(index = 4)] + vote { poll: ::core::primitive::u32, aye: ::core::primitive::bool }, + #[codec(index = 5)] + cleanup_poll { poll_index: ::core::primitive::u32, max: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + AlreadyMember, + #[codec(index = 1)] + NotMember, + #[codec(index = 2)] + NotPolling, + #[codec(index = 3)] + Ongoing, + #[codec(index = 4)] + NoneRemaining, + #[codec(index = 5)] + Corruption, + #[codec(index = 6)] + RankTooLow, + #[codec(index = 7)] + InvalidWitness, + #[codec(index = 8)] + NoPermission, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + MemberAdded { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + RankChanged { + who: ::sp_core::crypto::AccountId32, + rank: ::core::primitive::u16, + }, + #[codec(index = 2)] + MemberRemoved { + who: ::sp_core::crypto::AccountId32, + rank: ::core::primitive::u16, + }, + #[codec(index = 3)] + Voted { + who: ::sp_core::crypto::AccountId32, + poll: ::core::primitive::u32, + vote: runtime_types::pallet_ranked_collective::VoteRecord, + tally: runtime_types::pallet_ranked_collective::Tally, + }, + } + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct MemberRecord { + pub rank: ::core::primitive::u16, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Tally { + pub bare_ayes: ::core::primitive::u32, + pub ayes: ::core::primitive::u32, + pub nays: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VoteRecord { + #[codec(index = 0)] + Aye(::core::primitive::u32), + #[codec(index = 1)] + Nay(::core::primitive::u32), + } + } + pub mod pallet_recovery { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_recovered { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + set_recovered { + lost: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + create_recovery { + friends: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + threshold: ::core::primitive::u16, + delay_period: ::core::primitive::u32, + }, + #[codec(index = 3)] + initiate_recovery { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + vouch_recovery { + lost: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + claim_recovery { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + close_recovery { + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 7)] + remove_recovery, + #[codec(index = 8)] + cancel_recovered { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotAllowed, + #[codec(index = 1)] + ZeroThreshold, + #[codec(index = 2)] + NotEnoughFriends, + #[codec(index = 3)] + MaxFriends, + #[codec(index = 4)] + NotSorted, + #[codec(index = 5)] + NotRecoverable, + #[codec(index = 6)] + AlreadyRecoverable, + #[codec(index = 7)] + AlreadyStarted, + #[codec(index = 8)] + NotStarted, + #[codec(index = 9)] + NotFriend, + #[codec(index = 10)] + DelayPeriod, + #[codec(index = 11)] + AlreadyVouched, + #[codec(index = 12)] + Threshold, + #[codec(index = 13)] + StillActive, + #[codec(index = 14)] + AlreadyProxy, + #[codec(index = 15)] + BadState, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + RecoveryCreated { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + RecoveryInitiated { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 2)] + RecoveryVouched { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + sender: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + RecoveryClosed { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 4)] + AccountRecovered { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 5)] + RecoveryRemoved { lost_account: ::sp_core::crypto::AccountId32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ActiveRecovery<_0, _1, _2> { + pub created: _0, + pub deposit: _1, + pub friends: _2, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RecoveryConfig<_0, _1, _2> { + pub delay_period: _0, + pub deposit: _1, + pub friends: _2, + pub threshold: ::core::primitive::u16, + } + } + pub mod pallet_referenda { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + submit { + proposal_origin: + ::std::boxed::Box, + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::kusama_runtime::RuntimeCall, + >, + enactment_moment: + runtime_types::frame_support::traits::schedule::DispatchTime< + ::core::primitive::u32, + >, + }, + #[codec(index = 1)] + place_decision_deposit { index: ::core::primitive::u32 }, + #[codec(index = 2)] + refund_decision_deposit { index: ::core::primitive::u32 }, + #[codec(index = 3)] + cancel { index: ::core::primitive::u32 }, + #[codec(index = 4)] + kill { index: ::core::primitive::u32 }, + #[codec(index = 5)] + nudge_referendum { index: ::core::primitive::u32 }, + #[codec(index = 6)] + one_fewer_deciding { track: ::core::primitive::u16 }, + #[codec(index = 7)] + refund_submission_deposit { index: ::core::primitive::u32 }, + #[codec(index = 8)] + set_metadata { + index: ::core::primitive::u32, + maybe_hash: ::core::option::Option<::subxt::utils::H256>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotOngoing, + #[codec(index = 1)] + HasDeposit, + #[codec(index = 2)] + BadTrack, + #[codec(index = 3)] + Full, + #[codec(index = 4)] + QueueEmpty, + #[codec(index = 5)] + BadReferendum, + #[codec(index = 6)] + NothingToDo, + #[codec(index = 7)] + NoTrack, + #[codec(index = 8)] + Unfinished, + #[codec(index = 9)] + NoPermission, + #[codec(index = 10)] + NoDeposit, + #[codec(index = 11)] + BadStatus, + #[codec(index = 12)] + PreimageNotExist, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Submitted { + index: ::core::primitive::u32, + track: ::core::primitive::u16, + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::kusama_runtime::RuntimeCall, + >, + }, + #[codec(index = 1)] + DecisionDepositPlaced { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + DecisionDepositRefunded { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + DepositSlashed { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + DecisionStarted { + index: ::core::primitive::u32, + track: ::core::primitive::u16, + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::kusama_runtime::RuntimeCall, + >, + tally: runtime_types::pallet_ranked_collective::Tally, + }, + #[codec(index = 5)] + ConfirmStarted { index: ::core::primitive::u32 }, + #[codec(index = 6)] + ConfirmAborted { index: ::core::primitive::u32 }, + #[codec(index = 7)] + Confirmed { + index: ::core::primitive::u32, + tally: runtime_types::pallet_ranked_collective::Tally, + }, + #[codec(index = 8)] + Approved { index: ::core::primitive::u32 }, + #[codec(index = 9)] + Rejected { + index: ::core::primitive::u32, + tally: runtime_types::pallet_ranked_collective::Tally, + }, + #[codec(index = 10)] + TimedOut { + index: ::core::primitive::u32, + tally: runtime_types::pallet_ranked_collective::Tally, + }, + #[codec(index = 11)] + Cancelled { + index: ::core::primitive::u32, + tally: runtime_types::pallet_ranked_collective::Tally, + }, + #[codec(index = 12)] + Killed { + index: ::core::primitive::u32, + tally: runtime_types::pallet_ranked_collective::Tally, + }, + #[codec(index = 13)] + SubmissionDepositRefunded { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 14)] + MetadataSet { index: ::core::primitive::u32, hash: ::subxt::utils::H256 }, + #[codec(index = 15)] + MetadataCleared { index: ::core::primitive::u32, hash: ::subxt::utils::H256 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Curve { + #[codec(index = 0)] + LinearDecreasing { + length: runtime_types::sp_arithmetic::per_things::Perbill, + floor: runtime_types::sp_arithmetic::per_things::Perbill, + ceil: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 1)] + SteppedDecreasing { + begin: runtime_types::sp_arithmetic::per_things::Perbill, + end: runtime_types::sp_arithmetic::per_things::Perbill, + step: runtime_types::sp_arithmetic::per_things::Perbill, + period: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 2)] + Reciprocal { + factor: runtime_types::sp_arithmetic::fixed_point::FixedI64, + x_offset: runtime_types::sp_arithmetic::fixed_point::FixedI64, + y_offset: runtime_types::sp_arithmetic::fixed_point::FixedI64, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DecidingStatus<_0> { + pub since: _0, + pub confirming: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Deposit<_0, _1> { + pub who: _0, + pub amount: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReferendumInfo<_0, _1, _2, _3, _4, _5, _6, _7> { + #[codec(index = 0)] + Ongoing( + runtime_types::pallet_referenda::types::ReferendumStatus< + _0, + _1, + _2, + _3, + _4, + _5, + _6, + _7, + >, + ), + #[codec(index = 1)] + Approved( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 2)] + Rejected( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 3)] + Cancelled( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 4)] + TimedOut( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 5)] + Killed(_2), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReferendumStatus<_0, _1, _2, _3, _4, _5, _6, _7> { + pub track: _0, + pub origin: _1, + pub proposal: _3, + pub enactment: runtime_types::frame_support::traits::schedule::DispatchTime<_2>, + pub submitted: _2, + pub submission_deposit: runtime_types::pallet_referenda::types::Deposit<_6, _4>, + pub decision_deposit: ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + pub deciding: ::core::option::Option< + runtime_types::pallet_referenda::types::DecidingStatus<_2>, + >, + pub tally: _5, + pub in_queue: ::core::primitive::bool, + pub alarm: ::core::option::Option<(_2, _7)>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct TrackInfo<_0, _1> { + pub name: ::std::string::String, + pub max_deciding: _1, + pub decision_deposit: _0, + pub prepare_period: _1, + pub decision_period: _1, + pub confirm_period: _1, + pub min_enactment_period: _1, + pub min_approval: runtime_types::pallet_referenda::types::Curve, + pub min_support: runtime_types::pallet_referenda::types::Curve, + } + } + } + pub mod pallet_scheduler { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + schedule { + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + cancel { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + schedule_named { + id: [::core::primitive::u8; 32usize], + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 3)] + cancel_named { id: [::core::primitive::u8; 32usize] }, + #[codec(index = 4)] + schedule_after { + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 5)] + schedule_named_after { + id: [::core::primitive::u8; 32usize], + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FailedToSchedule, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + TargetBlockNumberInPast, + #[codec(index = 3)] + RescheduleNoChange, + #[codec(index = 4)] + Named, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Scheduled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 1)] + Canceled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + Dispatched { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + CallUnavailable { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 4)] + PeriodicFailed { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 5)] + PermanentlyOverweight { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Scheduled<_0, _1, _2, _3, _4> { + pub maybe_id: ::core::option::Option<_0>, + pub priority: ::core::primitive::u8, + pub call: _1, + pub maybe_periodic: ::core::option::Option<(_2, _2)>, + pub origin: _3, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_4>, + } + } + pub mod pallet_session { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_keys { + keys: runtime_types::kusama_runtime::SessionKeys, + proof: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + purge_keys, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidProof, + #[codec(index = 1)] + NoAssociatedValidatorId, + #[codec(index = 2)] + DuplicatedKey, + #[codec(index = 3)] + NoKeys, + #[codec(index = 4)] + NoAccount, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewSession { session_index: ::core::primitive::u32 }, + } + } + } + pub mod pallet_society { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + bid { value: ::core::primitive::u128 }, + #[codec(index = 1)] + unbid { pos: ::core::primitive::u32 }, + #[codec(index = 2)] + vouch { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + value: ::core::primitive::u128, + tip: ::core::primitive::u128, + }, + #[codec(index = 3)] + unvouch { pos: ::core::primitive::u32 }, + #[codec(index = 4)] + vote { + candidate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + approve: ::core::primitive::bool, + }, + #[codec(index = 5)] + defender_vote { approve: ::core::primitive::bool }, + #[codec(index = 6)] + payout, + #[codec(index = 7)] + found { + founder: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + max_members: ::core::primitive::u32, + rules: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 8)] + unfound, + #[codec(index = 9)] + judge_suspended_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + forgive: ::core::primitive::bool, + }, + #[codec(index = 10)] + judge_suspended_candidate { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + judgement: runtime_types::pallet_society::Judgement, + }, + #[codec(index = 11)] + set_max_members { max: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + BadPosition, + #[codec(index = 1)] + NotMember, + #[codec(index = 2)] + AlreadyMember, + #[codec(index = 3)] + Suspended, + #[codec(index = 4)] + NotSuspended, + #[codec(index = 5)] + NoPayout, + #[codec(index = 6)] + AlreadyFounded, + #[codec(index = 7)] + InsufficientPot, + #[codec(index = 8)] + AlreadyVouching, + #[codec(index = 9)] + NotVouching, + #[codec(index = 10)] + Head, + #[codec(index = 11)] + Founder, + #[codec(index = 12)] + AlreadyBid, + #[codec(index = 13)] + AlreadyCandidate, + #[codec(index = 14)] + NotCandidate, + #[codec(index = 15)] + MaxMembers, + #[codec(index = 16)] + NotFounder, + #[codec(index = 17)] + NotHead, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Founded { founder: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + Bid { + candidate_id: ::sp_core::crypto::AccountId32, + offer: ::core::primitive::u128, + }, + #[codec(index = 2)] + Vouch { + candidate_id: ::sp_core::crypto::AccountId32, + offer: ::core::primitive::u128, + vouching: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + AutoUnbid { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + Unbid { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Unvouch { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 6)] + Inducted { + primary: ::sp_core::crypto::AccountId32, + candidates: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 7)] + SuspendedMemberJudgement { + who: ::sp_core::crypto::AccountId32, + judged: ::core::primitive::bool, + }, + #[codec(index = 8)] + CandidateSuspended { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 9)] + MemberSuspended { member: ::sp_core::crypto::AccountId32 }, + #[codec(index = 10)] + Challenged { member: ::sp_core::crypto::AccountId32 }, + #[codec(index = 11)] + Vote { + candidate: ::sp_core::crypto::AccountId32, + voter: ::sp_core::crypto::AccountId32, + vote: ::core::primitive::bool, + }, + #[codec(index = 12)] + DefenderVote { + voter: ::sp_core::crypto::AccountId32, + vote: ::core::primitive::bool, + }, + #[codec(index = 13)] + NewMaxMembers { max: ::core::primitive::u32 }, + #[codec(index = 14)] + Unfounded { founder: ::sp_core::crypto::AccountId32 }, + #[codec(index = 15)] + Deposit { value: ::core::primitive::u128 }, + #[codec(index = 16)] + SkepticsChosen { skeptics: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bid<_0, _1> { + pub who: _0, + pub kind: runtime_types::pallet_society::BidKind<_0, _1>, + pub value: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BidKind<_0, _1> { + #[codec(index = 0)] + Deposit(_1), + #[codec(index = 1)] + Vouch(_0, _1), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Judgement { + #[codec(index = 0)] + Rebid, + #[codec(index = 1)] + Reject, + #[codec(index = 2)] + Approve, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Vote { + #[codec(index = 0)] + Skeptic, + #[codec(index = 1)] + Reject, + #[codec(index = 2)] + Approve, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VouchingStatus { + #[codec(index = 0)] + Vouching, + #[codec(index = 1)] + Banned, + } + } + pub mod pallet_staking { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + bond { + #[codec(compact)] + value: ::core::primitive::u128, + payee: runtime_types::pallet_staking::RewardDestination< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 1)] + bond_extra { + #[codec(compact)] + max_additional: ::core::primitive::u128, + }, + #[codec(index = 2)] + unbond { + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + withdraw_unbonded { num_slashing_spans: ::core::primitive::u32 }, + #[codec(index = 4)] + validate { prefs: runtime_types::pallet_staking::ValidatorPrefs }, + #[codec(index = 5)] + nominate { + targets: ::std::vec::Vec< + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + >, + }, + #[codec(index = 6)] + chill, + #[codec(index = 7)] + set_payee { + payee: runtime_types::pallet_staking::RewardDestination< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 8)] + set_controller, + #[codec(index = 9)] + set_validator_count { + #[codec(compact)] + new: ::core::primitive::u32, + }, + #[codec(index = 10)] + increase_validator_count { + #[codec(compact)] + additional: ::core::primitive::u32, + }, + #[codec(index = 11)] + scale_validator_count { + factor: runtime_types::sp_arithmetic::per_things::Percent, + }, + #[codec(index = 12)] + force_no_eras, + #[codec(index = 13)] + force_new_era, + #[codec(index = 14)] + set_invulnerables { + invulnerables: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 15)] + force_unstake { + stash: ::sp_core::crypto::AccountId32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 16)] + force_new_era_always, + #[codec(index = 17)] + cancel_deferred_slash { + era: ::core::primitive::u32, + slash_indices: ::std::vec::Vec<::core::primitive::u32>, + }, + #[codec(index = 18)] + payout_stakers { + validator_stash: ::sp_core::crypto::AccountId32, + era: ::core::primitive::u32, + }, + #[codec(index = 19)] + rebond { + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 20)] + reap_stash { + stash: ::sp_core::crypto::AccountId32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 21)] + kick { + who: ::std::vec::Vec< + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + >, + }, + #[codec(index = 22)] + set_staking_configs { + min_nominator_bond: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u128, + >, + min_validator_bond: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u128, + >, + max_nominator_count: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u32, + >, + max_validator_count: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u32, + >, + chill_threshold: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + runtime_types::sp_arithmetic::per_things::Percent, + >, + min_commission: runtime_types::pallet_staking::pallet::pallet::ConfigOp< + runtime_types::sp_arithmetic::per_things::Perbill, + >, + }, + #[codec(index = 23)] + chill_other { controller: ::sp_core::crypto::AccountId32 }, + #[codec(index = 24)] + force_apply_min_commission { + validator_stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 25)] + set_min_commission { + new: runtime_types::sp_arithmetic::per_things::Perbill, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ConfigOp<_0> { + #[codec(index = 0)] + Noop, + #[codec(index = 1)] + Set(_0), + #[codec(index = 2)] + Remove, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotController, + #[codec(index = 1)] + NotStash, + #[codec(index = 2)] + AlreadyBonded, + #[codec(index = 3)] + AlreadyPaired, + #[codec(index = 4)] + EmptyTargets, + #[codec(index = 5)] + DuplicateIndex, + #[codec(index = 6)] + InvalidSlashIndex, + #[codec(index = 7)] + InsufficientBond, + #[codec(index = 8)] + NoMoreChunks, + #[codec(index = 9)] + NoUnlockChunk, + #[codec(index = 10)] + FundedTarget, + #[codec(index = 11)] + InvalidEraToReward, + #[codec(index = 12)] + InvalidNumberOfNominations, + #[codec(index = 13)] + NotSortedAndUnique, + #[codec(index = 14)] + AlreadyClaimed, + #[codec(index = 15)] + IncorrectHistoryDepth, + #[codec(index = 16)] + IncorrectSlashingSpans, + #[codec(index = 17)] + BadState, + #[codec(index = 18)] + TooManyTargets, + #[codec(index = 19)] + BadTarget, + #[codec(index = 20)] + CannotChillOther, + #[codec(index = 21)] + TooManyNominators, + #[codec(index = 22)] + TooManyValidators, + #[codec(index = 23)] + CommissionTooLow, + #[codec(index = 24)] + BoundNotMet, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + EraPaid { + era_index: ::core::primitive::u32, + validator_payout: ::core::primitive::u128, + remainder: ::core::primitive::u128, + }, + #[codec(index = 1)] + Rewarded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Slashed { + staker: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + SlashReported { + validator: ::sp_core::crypto::AccountId32, + fraction: runtime_types::sp_arithmetic::per_things::Perbill, + slash_era: ::core::primitive::u32, + }, + #[codec(index = 4)] + OldSlashingReportDiscarded { session_index: ::core::primitive::u32 }, + #[codec(index = 5)] + StakersElected, + #[codec(index = 6)] + Bonded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 7)] + Unbonded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 8)] + Withdrawn { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Kicked { + nominator: ::sp_core::crypto::AccountId32, + stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 10)] + StakingElectionFailed, + #[codec(index = 11)] + Chilled { stash: ::sp_core::crypto::AccountId32 }, + #[codec(index = 12)] + PayoutStarted { + era_index: ::core::primitive::u32, + validator_stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 13)] + ValidatorPrefsSet { + stash: ::sp_core::crypto::AccountId32, + prefs: runtime_types::pallet_staking::ValidatorPrefs, + }, + #[codec(index = 14)] + ForceEra { mode: runtime_types::pallet_staking::Forcing }, + } + } + } + pub mod slashing { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SlashingSpans { + pub span_index: ::core::primitive::u32, + pub last_start: ::core::primitive::u32, + pub last_nonzero_slash: ::core::primitive::u32, + pub prior: ::std::vec::Vec<::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SpanRecord<_0> { + pub slashed: _0, + pub paid_out: _0, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ActiveEraInfo { + pub index: ::core::primitive::u32, + pub start: ::core::option::Option<::core::primitive::u64>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EraRewardPoints<_0> { + pub total: ::core::primitive::u32, + pub individual: ::subxt::utils::KeyedVec<_0, ::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Exposure<_0, _1> { + #[codec(compact)] + pub total: _1, + #[codec(compact)] + pub own: _1, + pub others: + ::std::vec::Vec>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Forcing { + #[codec(index = 0)] + NotForcing, + #[codec(index = 1)] + ForceNew, + #[codec(index = 2)] + ForceNone, + #[codec(index = 3)] + ForceAlways, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IndividualExposure<_0, _1> { + pub who: _0, + #[codec(compact)] + pub value: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Nominations { + pub targets: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::sp_core::crypto::AccountId32, + >, + pub submitted_in: ::core::primitive::u32, + pub suppressed: ::core::primitive::bool, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RewardDestination<_0> { + #[codec(index = 0)] + Staked, + #[codec(index = 1)] + Stash, + #[codec(index = 2)] + Controller, + #[codec(index = 3)] + Account(_0), + #[codec(index = 4)] + None, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StakingLedger { + pub stash: ::sp_core::crypto::AccountId32, + #[codec(compact)] + pub total: ::core::primitive::u128, + #[codec(compact)] + pub active: ::core::primitive::u128, + pub unlocking: runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::pallet_staking::UnlockChunk<::core::primitive::u128>, + >, + pub claimed_rewards: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnappliedSlash<_0, _1> { + pub validator: _0, + pub own: _1, + pub others: ::std::vec::Vec<(_0, _1)>, + pub reporters: ::std::vec::Vec<_0>, + pub payout: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnlockChunk<_0> { + #[codec(compact)] + pub value: _0, + #[codec(compact)] + pub era: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidatorPrefs { + #[codec(compact)] + pub commission: runtime_types::sp_arithmetic::per_things::Perbill, + pub blocked: ::core::primitive::bool, + } + } + pub mod pallet_timestamp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set { + #[codec(compact)] + now: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_transaction_payment { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + TransactionFeePaid { + who: ::sp_core::crypto::AccountId32, + actual_fee: ::core::primitive::u128, + tip: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChargeTransactionPayment(#[codec(compact)] pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V1Ancient, + #[codec(index = 1)] + V2, + } + } + pub mod pallet_treasury { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose_spend { + #[codec(compact)] + value: ::core::primitive::u128, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + reject_proposal { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + #[codec(index = 2)] + approve_proposal { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + #[codec(index = 3)] + spend { + #[codec(compact)] + amount: ::core::primitive::u128, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + remove_approval { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InsufficientProposersBalance, + #[codec(index = 1)] + InvalidIndex, + #[codec(index = 2)] + TooManyApprovals, + #[codec(index = 3)] + InsufficientPermission, + #[codec(index = 4)] + ProposalNotApproved, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Proposed { proposal_index: ::core::primitive::u32 }, + #[codec(index = 1)] + Spending { budget_remaining: ::core::primitive::u128 }, + #[codec(index = 2)] + Awarded { + proposal_index: ::core::primitive::u32, + award: ::core::primitive::u128, + account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Rejected { + proposal_index: ::core::primitive::u32, + slashed: ::core::primitive::u128, + }, + #[codec(index = 4)] + Burnt { burnt_funds: ::core::primitive::u128 }, + #[codec(index = 5)] + Rollover { rollover_balance: ::core::primitive::u128 }, + #[codec(index = 6)] + Deposit { value: ::core::primitive::u128 }, + #[codec(index = 7)] + SpendApproved { + proposal_index: ::core::primitive::u32, + amount: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + UpdatedInactive { + reactivated: ::core::primitive::u128, + deactivated: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Proposal<_0, _1> { + pub proposer: _0, + pub value: _1, + pub beneficiary: _0, + pub bond: _1, + } + } + pub mod pallet_utility { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + batch { calls: ::std::vec::Vec }, + #[codec(index = 1)] + as_derivative { + index: ::core::primitive::u16, + call: ::std::boxed::Box, + }, + #[codec(index = 2)] + batch_all { calls: ::std::vec::Vec }, + #[codec(index = 3)] + dispatch_as { + as_origin: ::std::boxed::Box, + call: ::std::boxed::Box, + }, + #[codec(index = 4)] + force_batch { + calls: ::std::vec::Vec, + }, + #[codec(index = 5)] + with_weight { + call: ::std::boxed::Box, + weight: ::sp_weights::Weight, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyCalls, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BatchInterrupted { + index: ::core::primitive::u32, + error: runtime_types::sp_runtime::DispatchError, + }, + #[codec(index = 1)] + BatchCompleted, + #[codec(index = 2)] + BatchCompletedWithErrors, + #[codec(index = 3)] + ItemCompleted, + #[codec(index = 4)] + ItemFailed { error: runtime_types::sp_runtime::DispatchError }, + #[codec(index = 5)] + DispatchedAs { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_vesting { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vest, + #[codec(index = 1)] + vest_other { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + vested_transfer { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 3)] + force_vested_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 4)] + merge_schedules { + schedule1_index: ::core::primitive::u32, + schedule2_index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotVesting, + #[codec(index = 1)] + AtMaxVestingSchedules, + #[codec(index = 2)] + AmountLow, + #[codec(index = 3)] + ScheduleIndexOutOfBounds, + #[codec(index = 4)] + InvalidScheduleParams, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + VestingUpdated { + account: ::sp_core::crypto::AccountId32, + unvested: ::core::primitive::u128, + }, + #[codec(index = 1)] + VestingCompleted { account: ::sp_core::crypto::AccountId32 }, + } + } + pub mod vesting_info { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VestingInfo<_0, _1> { + pub locked: _0, + pub per_block: _0, + pub starting_block: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V0, + #[codec(index = 1)] + V1, + } + } + pub mod pallet_whitelist { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + whitelist_call { call_hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + remove_whitelisted_call { call_hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + dispatch_whitelisted_call { + call_hash: ::subxt::utils::H256, + call_encoded_len: ::core::primitive::u32, + call_weight_witness: ::sp_weights::Weight, + }, + #[codec(index = 3)] + dispatch_whitelisted_call_with_preimage { + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnavailablePreImage, + #[codec(index = 1)] + UndecodableCall, + #[codec(index = 2)] + InvalidCallWeightWitness, + #[codec(index = 3)] + CallIsNotWhitelisted, + #[codec(index = 4)] + CallAlreadyWhitelisted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CallWhitelisted { call_hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + WhitelistedCallRemoved { call_hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + WhitelistedCallDispatched { + call_hash: ::subxt::utils::H256, + result: ::core::result::Result< + runtime_types::frame_support::dispatch::PostDispatchInfo, + runtime_types::sp_runtime::DispatchErrorWithPostInfo< + runtime_types::frame_support::dispatch::PostDispatchInfo, + >, + >, + }, + } + } + } + pub mod pallet_xcm { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + send { + dest: ::std::boxed::Box, + message: ::std::boxed::Box, + }, + #[codec(index = 1)] + teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 2)] + reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 3)] + execute { + message: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 4)] + force_xcm_version { + location: + ::std::boxed::Box, + xcm_version: ::core::primitive::u32, + }, + #[codec(index = 5)] + force_default_xcm_version { + maybe_xcm_version: ::core::option::Option<::core::primitive::u32>, + }, + #[codec(index = 6)] + force_subscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 7)] + force_unsubscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 8)] + limited_reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 9)] + limited_teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 10)] + force_suspension { suspended: ::core::primitive::bool }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Unreachable, + #[codec(index = 1)] + SendFailure, + #[codec(index = 2)] + Filtered, + #[codec(index = 3)] + UnweighableMessage, + #[codec(index = 4)] + DestinationNotInvertible, + #[codec(index = 5)] + Empty, + #[codec(index = 6)] + CannotReanchor, + #[codec(index = 7)] + TooManyAssets, + #[codec(index = 8)] + InvalidOrigin, + #[codec(index = 9)] + BadVersion, + #[codec(index = 10)] + BadLocation, + #[codec(index = 11)] + NoSubscription, + #[codec(index = 12)] + AlreadySubscribed, + #[codec(index = 13)] + InvalidAsset, + #[codec(index = 14)] + LowBalance, + #[codec(index = 15)] + TooManyLocks, + #[codec(index = 16)] + AccountNotSovereign, + #[codec(index = 17)] + FeesNotMet, + #[codec(index = 18)] + LockNotFound, + #[codec(index = 19)] + InUse, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Attempted(runtime_types::xcm::v3::traits::Outcome), + #[codec(index = 1)] + Sent( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::Xcm, + ), + #[codec(index = 2)] + UnexpectedResponse( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 3)] + ResponseReady(::core::primitive::u64, runtime_types::xcm::v3::Response), + #[codec(index = 4)] + Notified(::core::primitive::u64, ::core::primitive::u8, ::core::primitive::u8), + #[codec(index = 5)] + NotifyOverweight( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ::sp_weights::Weight, + ::sp_weights::Weight, + ), + #[codec(index = 6)] + NotifyDispatchError( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 7)] + NotifyDecodeFailed( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 8)] + InvalidResponder( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 9)] + InvalidResponderVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 10)] + ResponseTaken(::core::primitive::u64), + #[codec(index = 11)] + AssetsTrapped( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + #[codec(index = 12)] + VersionChangeNotified( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 13)] + SupportedVersionChanged( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + ), + #[codec(index = 14)] + NotifyTargetSendFail( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::traits::Error, + ), + #[codec(index = 15)] + NotifyTargetMigrationFail( + runtime_types::xcm::VersionedMultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 16)] + InvalidQuerierVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 17)] + InvalidQuerier( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 18)] + VersionNotifyStarted( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 19)] + VersionNotifyRequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 20)] + VersionNotifyUnrequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 21)] + FeesPaid( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 22)] + AssetsClaimed( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Xcm(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Response(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum QueryStatus<_0> { + #[codec(index = 0)] + Pending { + responder: runtime_types::xcm::VersionedMultiLocation, + maybe_match_querier: + ::core::option::Option, + maybe_notify: + ::core::option::Option<(::core::primitive::u8, ::core::primitive::u8)>, + timeout: _0, + }, + #[codec(index = 1)] + VersionNotifier { + origin: runtime_types::xcm::VersionedMultiLocation, + is_active: ::core::primitive::bool, + }, + #[codec(index = 2)] + Ready { response: runtime_types::xcm::VersionedResponse, at: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RemoteLockedFungibleRecord<_0> { + pub amount: ::core::primitive::u128, + pub owner: runtime_types::xcm::VersionedMultiLocation, + pub locker: runtime_types::xcm::VersionedMultiLocation, + pub consumers: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _0, + ::core::primitive::u128, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionMigrationStage { + #[codec(index = 0)] + MigrateSupportedVersion, + #[codec(index = 1)] + MigrateVersionNotifiers, + #[codec(index = 2)] + NotifyCurrentTargets( + ::core::option::Option<::std::vec::Vec<::core::primitive::u8>>, + ), + #[codec(index = 3)] + MigrateAndNotifyOldTargets, + } + } + } + pub mod polkadot_core_primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateHash(pub ::subxt::utils::H256); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundDownwardMessage<_0> { + pub sent_at: _0, + pub msg: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundHrmpMessage<_0> { + pub sent_at: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundHrmpMessage<_0> { + pub recipient: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod polkadot_parachain { + use super::runtime_types; + pub mod primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeadData(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannelId { + pub sender: runtime_types::polkadot_parachain::primitives::Id, + pub recipient: runtime_types::polkadot_parachain::primitives::Id, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Id(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCode(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCodeHash(pub ::subxt::utils::H256); + } + } + pub mod polkadot_primitives { + use super::runtime_types; + pub mod v4 { + use super::runtime_types; + pub mod assignment_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod collator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + pub mod executor_params { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ExecutorParam { + #[codec(index = 1)] + MaxMemoryPages(::core::primitive::u32), + #[codec(index = 2)] + StackLogicalMax(::core::primitive::u32), + #[codec(index = 3)] + StackNativeMax(::core::primitive::u32), + #[codec(index = 4)] + PrecheckingMaxMemory(::core::primitive::u64), + #[codec(index = 5)] + PvfPrepTimeout( + runtime_types::polkadot_primitives::v4::PvfPrepTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 6)] + PvfExecTimeout( + runtime_types::polkadot_primitives::v4::PvfExecTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 7)] + WasmExtBulkMemory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ExecutorParams( + pub ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParam, + >, + ); + } + pub mod signed { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedSigned<_0, _1> { + pub payload: _0, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + pub signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_1>, + } + } + pub mod validator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfield( + pub ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BackedCandidate<_0> { + pub candidate: + runtime_types::polkadot_primitives::v4::CommittedCandidateReceipt<_0>, + pub validity_votes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::ValidityAttestation, + >, + pub validator_indices: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateCommitments<_0> { + pub upward_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::std::vec::Vec<::core::primitive::u8>, + >, + pub horizontal_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::polkadot_core_primitives::OutboundHrmpMessage< + runtime_types::polkadot_parachain::primitives::Id, + >, + >, + pub new_validation_code: ::core::option::Option< + runtime_types::polkadot_parachain::primitives::ValidationCode, + >, + pub head_data: runtime_types::polkadot_parachain::primitives::HeadData, + pub processed_downward_messages: _0, + pub hrmp_watermark: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateDescriptor<_0> { + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub relay_parent: _0, + pub collator: runtime_types::polkadot_primitives::v4::collator_app::Public, + pub persisted_validation_data_hash: _0, + pub pov_hash: _0, + pub erasure_root: _0, + pub signature: runtime_types::polkadot_primitives::v4::collator_app::Signature, + pub para_head: _0, + pub validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments_hash: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CommittedCandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments: runtime_types::polkadot_primitives::v4::CandidateCommitments< + ::core::primitive::u32, + >, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct CoreIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum CoreOccupied { + #[codec(index = 0)] + Parathread(runtime_types::polkadot_primitives::v4::ParathreadEntry), + #[codec(index = 1)] + Parachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeState<_0> { + pub validators_for: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub validators_against: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub start: _0, + pub concluded_at: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeStatement { + #[codec(index = 0)] + Valid(runtime_types::polkadot_primitives::v4::ValidDisputeStatementKind), + #[codec(index = 1)] + Invalid(runtime_types::polkadot_primitives::v4::InvalidDisputeStatementKind), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeStatementSet { + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub session: ::core::primitive::u32, + pub statements: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::DisputeStatement, + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Signature, + )>, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct GroupIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IndexedVec<_0, _1>( + pub ::std::vec::Vec<_1>, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InherentData<_0> { + pub bitfields: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::signed::UncheckedSigned< + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + >, + >, + pub backed_candidates: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::BackedCandidate< + ::subxt::utils::H256, + >, + >, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + pub parent_header: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum InvalidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaim( + pub runtime_types::polkadot_parachain::primitives::Id, + pub runtime_types::polkadot_primitives::v4::collator_app::Public, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadEntry { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadClaim, + pub retries: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckStatement { + pub accept: ::core::primitive::bool, + pub subject: runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + pub session_index: ::core::primitive::u32, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfExecTimeoutKind { + #[codec(index = 0)] + Backing, + #[codec(index = 1)] + Approval, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfPrepTimeoutKind { + #[codec(index = 0)] + Precheck, + #[codec(index = 1)] + Lenient, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ScrapedOnChainVotes<_0> { + pub session: ::core::primitive::u32, + pub backing_validators_per_candidate: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::CandidateReceipt<_0>, + ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::ValidityAttestation, + )>, + )>, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionInfo { + pub active_validator_indices: + ::std::vec::Vec, + pub random_seed: [::core::primitive::u8; 32usize], + pub dispute_period: ::core::primitive::u32, + pub validators: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub discovery_keys: + ::std::vec::Vec, + pub assignment_keys: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::assignment_app::Public, + >, + pub validator_groups: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::GroupIndex, + ::std::vec::Vec, + >, + pub n_cores: ::core::primitive::u32, + pub zeroth_delay_tranche_width: ::core::primitive::u32, + pub relay_vrf_modulo_samples: ::core::primitive::u32, + pub n_delay_tranches: ::core::primitive::u32, + pub no_show_slots: ::core::primitive::u32, + pub needed_approvals: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeGoAhead { + #[codec(index = 0)] + Abort, + #[codec(index = 1)] + GoAhead, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeRestriction { + #[codec(index = 0)] + Present, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + #[codec(index = 1)] + BackingSeconded(::subxt::utils::H256), + #[codec(index = 2)] + BackingValid(::subxt::utils::H256), + #[codec(index = 3)] + ApprovalChecking, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ValidatorIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidityAttestation { + #[codec(index = 1)] + Implicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + #[codec(index = 2)] + Explicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + } + } + pub mod vstaging { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AsyncBackingParams { + pub max_candidate_depth: ::core::primitive::u32, + pub allowed_ancestry_len: ::core::primitive::u32, + } + } + } + pub mod polkadot_runtime_common { + use super::runtime_types; + pub mod auctions { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + new_auction { + #[codec(compact)] + duration: ::core::primitive::u32, + #[codec(compact)] + lease_period_index: ::core::primitive::u32, + }, + #[codec(index = 1)] + bid { + #[codec(compact)] + para: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + auction_index: ::core::primitive::u32, + #[codec(compact)] + first_slot: ::core::primitive::u32, + #[codec(compact)] + last_slot: ::core::primitive::u32, + #[codec(compact)] + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + cancel_auction, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + AuctionInProgress, + #[codec(index = 1)] + LeasePeriodInPast, + #[codec(index = 2)] + ParaNotRegistered, + #[codec(index = 3)] + NotCurrentAuction, + #[codec(index = 4)] + NotAuction, + #[codec(index = 5)] + AuctionEnded, + #[codec(index = 6)] + AlreadyLeasedOut, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + AuctionStarted { + auction_index: ::core::primitive::u32, + lease_period: ::core::primitive::u32, + ending: ::core::primitive::u32, + }, + #[codec(index = 1)] + AuctionClosed { auction_index: ::core::primitive::u32 }, + #[codec(index = 2)] + Reserved { + bidder: ::sp_core::crypto::AccountId32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + Unreserved { + bidder: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + ReserveConfiscated { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + BidAccepted { + bidder: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + first_slot: ::core::primitive::u32, + last_slot: ::core::primitive::u32, + }, + #[codec(index = 6)] + WinningOffset { + auction_index: ::core::primitive::u32, + block_number: ::core::primitive::u32, + }, + } + } + } + pub mod claims { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim { + dest: ::sp_core::crypto::AccountId32, + ethereum_signature: + runtime_types::polkadot_runtime_common::claims::EcdsaSignature, + }, + #[codec(index = 1)] + mint_claim { + who: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + value: ::core::primitive::u128, + vesting_schedule: ::core::option::Option<( + ::core::primitive::u128, + ::core::primitive::u128, + ::core::primitive::u32, + )>, + statement: ::core::option::Option< + runtime_types::polkadot_runtime_common::claims::StatementKind, + >, + }, + #[codec(index = 2)] + claim_attest { + dest: ::sp_core::crypto::AccountId32, + ethereum_signature: + runtime_types::polkadot_runtime_common::claims::EcdsaSignature, + statement: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 3)] + attest { statement: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + move_claim { + old: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + new: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + maybe_preclaim: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEthereumSignature, + #[codec(index = 1)] + SignerHasNoClaim, + #[codec(index = 2)] + SenderHasNoClaim, + #[codec(index = 3)] + PotUnderflow, + #[codec(index = 4)] + InvalidStatement, + #[codec(index = 5)] + VestedBalanceExists, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Claimed { + who: ::sp_core::crypto::AccountId32, + ethereum_address: + runtime_types::polkadot_runtime_common::claims::EthereumAddress, + amount: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EcdsaSignature(pub [::core::primitive::u8; 65usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EthereumAddress(pub [::core::primitive::u8; 20usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StatementKind { + #[codec(index = 0)] + Regular, + #[codec(index = 1)] + Saft, + } + } + pub mod crowdloan { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + create { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 1)] + contribute { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + value: ::core::primitive::u128, + signature: + ::core::option::Option, + }, + #[codec(index = 2)] + withdraw { + who: ::sp_core::crypto::AccountId32, + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 3)] + refund { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + dissolve { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + edit { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 6)] + add_memo { + index: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 7)] + poke { index: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + contribute_all { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + signature: + ::core::option::Option, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FirstPeriodInPast, + #[codec(index = 1)] + FirstPeriodTooFarInFuture, + #[codec(index = 2)] + LastPeriodBeforeFirstPeriod, + #[codec(index = 3)] + LastPeriodTooFarInFuture, + #[codec(index = 4)] + CannotEndInPast, + #[codec(index = 5)] + EndTooFarInFuture, + #[codec(index = 6)] + Overflow, + #[codec(index = 7)] + ContributionTooSmall, + #[codec(index = 8)] + InvalidParaId, + #[codec(index = 9)] + CapExceeded, + #[codec(index = 10)] + ContributionPeriodOver, + #[codec(index = 11)] + InvalidOrigin, + #[codec(index = 12)] + NotParachain, + #[codec(index = 13)] + LeaseActive, + #[codec(index = 14)] + BidOrLeaseActive, + #[codec(index = 15)] + FundNotEnded, + #[codec(index = 16)] + NoContributions, + #[codec(index = 17)] + NotReadyToDissolve, + #[codec(index = 18)] + InvalidSignature, + #[codec(index = 19)] + MemoTooLarge, + #[codec(index = 20)] + AlreadyInNewRaise, + #[codec(index = 21)] + VrfDelayInProgress, + #[codec(index = 22)] + NoLeasePeriod, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Created { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 1)] + Contributed { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Withdrew { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + PartiallyRefunded { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + AllRefunded { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + Dissolved { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 6)] + HandleBidResult { + para_id: runtime_types::polkadot_parachain::primitives::Id, + result: ::core::result::Result< + (), + runtime_types::sp_runtime::DispatchError, + >, + }, + #[codec(index = 7)] + Edited { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + MemoUpdated { + who: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 9)] + AddedToNewRaise { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct FundInfo<_0, _1, _2, _3> { + pub depositor: _0, + pub verifier: ::core::option::Option, + pub deposit: _1, + pub raised: _1, + pub end: _2, + pub cap: _1, + pub last_contribution: + runtime_types::polkadot_runtime_common::crowdloan::LastContribution<_2>, + pub first_period: _2, + pub last_period: _2, + pub fund_index: _2, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_3>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum LastContribution<_0> { + #[codec(index = 0)] + Never, + #[codec(index = 1)] + PreEnding(_0), + #[codec(index = 2)] + Ending(_0), + } + } + pub mod paras_registrar { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register { + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_register { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 2)] + deregister { id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 3)] + swap { + id: runtime_types::polkadot_parachain::primitives::Id, + other: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + remove_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + reserve, + #[codec(index = 6)] + add_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 7)] + schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 8)] + set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + AlreadyRegistered, + #[codec(index = 2)] + NotOwner, + #[codec(index = 3)] + CodeTooLarge, + #[codec(index = 4)] + HeadDataTooLarge, + #[codec(index = 5)] + NotParachain, + #[codec(index = 6)] + NotParathread, + #[codec(index = 7)] + CannotDeregister, + #[codec(index = 8)] + CannotDowngrade, + #[codec(index = 9)] + CannotUpgrade, + #[codec(index = 10)] + ParaLocked, + #[codec(index = 11)] + NotReserved, + #[codec(index = 12)] + EmptyCode, + #[codec(index = 13)] + CannotSwap, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Registered { + para_id: runtime_types::polkadot_parachain::primitives::Id, + manager: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 1)] + Deregistered { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + Reserved { + para_id: runtime_types::polkadot_parachain::primitives::Id, + who: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Swapped { + para_id: runtime_types::polkadot_parachain::primitives::Id, + other_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaInfo<_0, _1> { + pub manager: _0, + pub deposit: _1, + pub locked: ::core::primitive::bool, + } + } + pub mod slots { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_lease { + para: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + }, + #[codec(index = 1)] + clear_all_leases { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + trigger_onboard { para: runtime_types::polkadot_parachain::primitives::Id }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaNotOnboarding, + #[codec(index = 1)] + LeaseError, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewLeasePeriod { lease_period: ::core::primitive::u32 }, + #[codec(index = 1)] + Leased { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + } + } + } + } + pub mod polkadot_runtime_parachains { + use super::runtime_types; + pub mod configuration { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] set_validation_upgrade_cooldown { new : :: core :: primitive :: u32 , } , # [codec (index = 1)] set_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 2)] set_code_retention_period { new : :: core :: primitive :: u32 , } , # [codec (index = 3)] set_max_code_size { new : :: core :: primitive :: u32 , } , # [codec (index = 4)] set_max_pov_size { new : :: core :: primitive :: u32 , } , # [codec (index = 5)] set_max_head_data_size { new : :: core :: primitive :: u32 , } , # [codec (index = 6)] set_parathread_cores { new : :: core :: primitive :: u32 , } , # [codec (index = 7)] set_parathread_retries { new : :: core :: primitive :: u32 , } , # [codec (index = 8)] set_group_rotation_frequency { new : :: core :: primitive :: u32 , } , # [codec (index = 9)] set_chain_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 10)] set_thread_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 11)] set_scheduling_lookahead { new : :: core :: primitive :: u32 , } , # [codec (index = 12)] set_max_validators_per_core { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 13)] set_max_validators { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 14)] set_dispute_period { new : :: core :: primitive :: u32 , } , # [codec (index = 15)] set_dispute_post_conclusion_acceptance_period { new : :: core :: primitive :: u32 , } , # [codec (index = 18)] set_no_show_slots { new : :: core :: primitive :: u32 , } , # [codec (index = 19)] set_n_delay_tranches { new : :: core :: primitive :: u32 , } , # [codec (index = 20)] set_zeroth_delay_tranche_width { new : :: core :: primitive :: u32 , } , # [codec (index = 21)] set_needed_approvals { new : :: core :: primitive :: u32 , } , # [codec (index = 22)] set_relay_vrf_modulo_samples { new : :: core :: primitive :: u32 , } , # [codec (index = 23)] set_max_upward_queue_count { new : :: core :: primitive :: u32 , } , # [codec (index = 24)] set_max_upward_queue_size { new : :: core :: primitive :: u32 , } , # [codec (index = 25)] set_max_downward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 27)] set_max_upward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 28)] set_max_upward_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 29)] set_hrmp_open_request_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 30)] set_hrmp_sender_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 31)] set_hrmp_recipient_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 32)] set_hrmp_channel_max_capacity { new : :: core :: primitive :: u32 , } , # [codec (index = 33)] set_hrmp_channel_max_total_size { new : :: core :: primitive :: u32 , } , # [codec (index = 34)] set_hrmp_max_parachain_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 35)] set_hrmp_max_parathread_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 36)] set_hrmp_channel_max_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 37)] set_hrmp_max_parachain_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 38)] set_hrmp_max_parathread_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 39)] set_hrmp_max_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 41)] set_pvf_checking_enabled { new : :: core :: primitive :: bool , } , # [codec (index = 42)] set_pvf_voting_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 43)] set_minimum_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 44)] set_bypass_consistency_check { new : :: core :: primitive :: bool , } , # [codec (index = 45)] set_async_backing_params { new : runtime_types :: polkadot_primitives :: vstaging :: AsyncBackingParams , } , # [codec (index = 46)] set_executor_params { new : runtime_types :: polkadot_primitives :: v4 :: executor_params :: ExecutorParams , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidNewValue, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HostConfiguration<_0> { + pub max_code_size: _0, + pub max_head_data_size: _0, + pub max_upward_queue_count: _0, + pub max_upward_queue_size: _0, + pub max_upward_message_size: _0, + pub max_upward_message_num_per_candidate: _0, + pub hrmp_max_message_num_per_candidate: _0, + pub validation_upgrade_cooldown: _0, + pub validation_upgrade_delay: _0, + pub async_backing_params: + runtime_types::polkadot_primitives::vstaging::AsyncBackingParams, + pub max_pov_size: _0, + pub max_downward_message_size: _0, + pub hrmp_max_parachain_outbound_channels: _0, + pub hrmp_max_parathread_outbound_channels: _0, + pub hrmp_sender_deposit: ::core::primitive::u128, + pub hrmp_recipient_deposit: ::core::primitive::u128, + pub hrmp_channel_max_capacity: _0, + pub hrmp_channel_max_total_size: _0, + pub hrmp_max_parachain_inbound_channels: _0, + pub hrmp_max_parathread_inbound_channels: _0, + pub hrmp_channel_max_message_size: _0, + pub executor_params: + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParams, + pub code_retention_period: _0, + pub parathread_cores: _0, + pub parathread_retries: _0, + pub group_rotation_frequency: _0, + pub chain_availability_period: _0, + pub thread_availability_period: _0, + pub scheduling_lookahead: _0, + pub max_validators_per_core: ::core::option::Option<_0>, + pub max_validators: ::core::option::Option<_0>, + pub dispute_period: _0, + pub dispute_post_conclusion_acceptance_period: _0, + pub no_show_slots: _0, + pub n_delay_tranches: _0, + pub zeroth_delay_tranche_width: _0, + pub needed_approvals: _0, + pub relay_vrf_modulo_samples: _0, + pub pvf_checking_enabled: ::core::primitive::bool, + pub pvf_voting_ttl: _0, + pub minimum_validation_upgrade_delay: _0, + } + } + pub mod disputes { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_unfreeze, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DuplicateDisputeStatementSets, + #[codec(index = 1)] + AncientDisputeStatement, + #[codec(index = 2)] + ValidatorIndexOutOfBounds, + #[codec(index = 3)] + InvalidSignature, + #[codec(index = 4)] + DuplicateStatement, + #[codec(index = 5)] + SingleSidedDispute, + #[codec(index = 6)] + MaliciousBacker, + #[codec(index = 7)] + MissingBackingVotes, + #[codec(index = 8)] + UnconfirmedDispute, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + DisputeInitiated( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeLocation, + ), + #[codec(index = 1)] + DisputeConcluded( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeResult, + ), + #[codec(index = 2)] + Revert(::core::primitive::u32), + } + } + pub mod slashing { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Call { + # [codec (index = 0)] report_dispute_lost_unsigned { dispute_proof : :: std :: boxed :: Box < runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputeProof > , key_owner_proof : :: sp_session :: MembershipProof , } , } + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Error { + #[codec(index = 0)] + InvalidKeyOwnershipProof, + #[codec(index = 1)] + InvalidSessionIndex, + #[codec(index = 2)] + InvalidCandidateHash, + #[codec(index = 3)] + InvalidValidatorIndex, + #[codec(index = 4)] + ValidatorIndexIdMismatch, + #[codec(index = 5)] + DuplicateSlashingReport, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeProof { pub time_slot : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputesTimeSlot , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , pub validator_index : runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , pub validator_id : runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputesTimeSlot { + pub session_index: ::core::primitive::u32, + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PendingSlashes { pub keys : :: subxt :: utils :: KeyedVec < runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public > , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum SlashingOffenceKind { + #[codec(index = 0)] + ForInvalid, + #[codec(index = 1)] + AgainstValid, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeLocation { + #[codec(index = 0)] + Local, + #[codec(index = 1)] + Remote, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeResult { + #[codec(index = 0)] + Valid, + #[codec(index = 1)] + Invalid, + } + } + pub mod hrmp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + hrmp_init_open_channel { + recipient: runtime_types::polkadot_parachain::primitives::Id, + proposed_max_capacity: ::core::primitive::u32, + proposed_max_message_size: ::core::primitive::u32, + }, + #[codec(index = 1)] + hrmp_accept_open_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 2)] + hrmp_close_channel { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + }, + #[codec(index = 3)] + force_clean_hrmp { + para: runtime_types::polkadot_parachain::primitives::Id, + inbound: ::core::primitive::u32, + outbound: ::core::primitive::u32, + }, + #[codec(index = 4)] + force_process_hrmp_open { channels: ::core::primitive::u32 }, + #[codec(index = 5)] + force_process_hrmp_close { channels: ::core::primitive::u32 }, + #[codec(index = 6)] + hrmp_cancel_open_request { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + open_requests: ::core::primitive::u32, + }, + #[codec(index = 7)] + force_open_hrmp_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + recipient: runtime_types::polkadot_parachain::primitives::Id, + max_capacity: ::core::primitive::u32, + max_message_size: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + OpenHrmpChannelToSelf, + #[codec(index = 1)] + OpenHrmpChannelInvalidRecipient, + #[codec(index = 2)] + OpenHrmpChannelZeroCapacity, + #[codec(index = 3)] + OpenHrmpChannelCapacityExceedsLimit, + #[codec(index = 4)] + OpenHrmpChannelZeroMessageSize, + #[codec(index = 5)] + OpenHrmpChannelMessageSizeExceedsLimit, + #[codec(index = 6)] + OpenHrmpChannelAlreadyExists, + #[codec(index = 7)] + OpenHrmpChannelAlreadyRequested, + #[codec(index = 8)] + OpenHrmpChannelLimitExceeded, + #[codec(index = 9)] + AcceptHrmpChannelDoesntExist, + #[codec(index = 10)] + AcceptHrmpChannelAlreadyConfirmed, + #[codec(index = 11)] + AcceptHrmpChannelLimitExceeded, + #[codec(index = 12)] + CloseHrmpChannelUnauthorized, + #[codec(index = 13)] + CloseHrmpChannelDoesntExist, + #[codec(index = 14)] + CloseHrmpChannelAlreadyUnderway, + #[codec(index = 15)] + CancelHrmpOpenChannelUnauthorized, + #[codec(index = 16)] + OpenHrmpChannelDoesntExist, + #[codec(index = 17)] + OpenHrmpChannelAlreadyConfirmed, + #[codec(index = 18)] + WrongWitness, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + OpenChannelRequested( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + #[codec(index = 1)] + OpenChannelCanceled( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 2)] + OpenChannelAccepted( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 3)] + ChannelClosed( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 4)] + HrmpChannelForceOpened( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannel { + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + pub max_message_size: ::core::primitive::u32, + pub msg_count: ::core::primitive::u32, + pub total_size: ::core::primitive::u32, + pub mqc_head: ::core::option::Option<::subxt::utils::H256>, + pub sender_deposit: ::core::primitive::u128, + pub recipient_deposit: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpOpenChannelRequest { + pub confirmed: ::core::primitive::bool, + pub _age: ::core::primitive::u32, + pub sender_deposit: ::core::primitive::u128, + pub max_message_size: ::core::primitive::u32, + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + } + } + pub mod inclusion { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnsortedOrDuplicateValidatorIndices, + #[codec(index = 1)] + UnsortedOrDuplicateDisputeStatementSet, + #[codec(index = 2)] + UnsortedOrDuplicateBackedCandidates, + #[codec(index = 3)] + UnexpectedRelayParent, + #[codec(index = 4)] + WrongBitfieldSize, + #[codec(index = 5)] + BitfieldAllZeros, + #[codec(index = 6)] + BitfieldDuplicateOrUnordered, + #[codec(index = 7)] + ValidatorIndexOutOfBounds, + #[codec(index = 8)] + InvalidBitfieldSignature, + #[codec(index = 9)] + UnscheduledCandidate, + #[codec(index = 10)] + CandidateScheduledBeforeParaFree, + #[codec(index = 11)] + WrongCollator, + #[codec(index = 12)] + ScheduledOutOfOrder, + #[codec(index = 13)] + HeadDataTooLarge, + #[codec(index = 14)] + PrematureCodeUpgrade, + #[codec(index = 15)] + NewCodeTooLarge, + #[codec(index = 16)] + CandidateNotInParentContext, + #[codec(index = 17)] + InvalidGroupIndex, + #[codec(index = 18)] + InsufficientBacking, + #[codec(index = 19)] + InvalidBacking, + #[codec(index = 20)] + NotCollatorSigned, + #[codec(index = 21)] + ValidationDataHashMismatch, + #[codec(index = 22)] + IncorrectDownwardMessageHandling, + #[codec(index = 23)] + InvalidUpwardMessages, + #[codec(index = 24)] + HrmpWatermarkMishandling, + #[codec(index = 25)] + InvalidOutboundHrmp, + #[codec(index = 26)] + InvalidValidationCodeHash, + #[codec(index = 27)] + ParaHeadMismatch, + #[codec(index = 28)] + BitfieldReferencesFreedCore, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CandidateBacked( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 1)] + CandidateIncluded( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 2)] + CandidateTimedOut( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + ), + #[codec(index = 3)] + UpwardMessagesReceived { + from: runtime_types::polkadot_parachain::primitives::Id, + count: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AggregateMessageOrigin { + #[codec(index = 0)] + Ump(runtime_types::polkadot_runtime_parachains::inclusion::UmpQueueId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfieldRecord<_0> { + pub bitfield: runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + pub submitted_at: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidatePendingAvailability<_0, _1> { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub availability_votes: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub backers: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub relay_parent_number: _1, + pub backed_in_number: _1, + pub backing_group: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UmpQueueId { + #[codec(index = 0)] + Para(runtime_types::polkadot_parachain::primitives::Id), + } + } + pub mod initializer { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_approve { up_to: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BufferedSessionChange { + pub validators: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub queued: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub session_index: ::core::primitive::u32, + } + } + pub mod origin { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Parachain(runtime_types::polkadot_parachain::primitives::Id), + } + } + } + pub mod paras { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_set_current_code { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 2)] + force_schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + relay_parent_number: ::core::primitive::u32, + }, + #[codec(index = 3)] + force_note_new_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 4)] + force_queue_action { + para: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + add_trusted_validation_code { + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 6)] + poke_unused_validation_code { + validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + }, + #[codec(index = 7)] + include_pvf_check_statement { + stmt: runtime_types::polkadot_primitives::v4::PvfCheckStatement, + signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + CannotOnboard, + #[codec(index = 2)] + CannotOffboard, + #[codec(index = 3)] + CannotUpgrade, + #[codec(index = 4)] + CannotDowngrade, + #[codec(index = 5)] + PvfCheckStatementStale, + #[codec(index = 6)] + PvfCheckStatementFuture, + #[codec(index = 7)] + PvfCheckValidatorIndexOutOfBounds, + #[codec(index = 8)] + PvfCheckInvalidSignature, + #[codec(index = 9)] + PvfCheckDoubleVote, + #[codec(index = 10)] + PvfCheckSubjectInvalid, + #[codec(index = 11)] + CannotUpgradeCode, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CurrentCodeUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + CurrentHeadUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 2)] + CodeUpgradeScheduled(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 3)] + NewHeadNoted(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 4)] + ActionQueued( + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ), + #[codec(index = 5)] + PvfCheckStarted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 6)] + PvfCheckAccepted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 7)] + PvfCheckRejected( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaGenesisArgs { + pub genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + pub validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + pub para_kind: ::core::primitive::bool, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ParaLifecycle { + #[codec(index = 0)] + Onboarding, + #[codec(index = 1)] + Parathread, + #[codec(index = 2)] + Parachain, + #[codec(index = 3)] + UpgradingParathread, + #[codec(index = 4)] + DowngradingParachain, + #[codec(index = 5)] + OffboardingParathread, + #[codec(index = 6)] + OffboardingParachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaPastCodeMeta<_0> { + pub upgrade_times: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::ReplacementTimes<_0>, + >, + pub last_pruned: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckActiveVoteState<_0> { + pub votes_accept: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub votes_reject: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub age: _0, + pub created_at: _0, + pub causes: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::PvfCheckCause<_0>, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfCheckCause<_0> { + #[codec(index = 0)] + Onboarding(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + Upgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + relay_parent_number: _0, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReplacementTimes<_0> { + pub expected_at: _0, + pub activated_at: _0, + } + } + pub mod paras_inherent { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + enter { + data: runtime_types::polkadot_primitives::v4::InherentData< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyInclusionInherents, + #[codec(index = 1)] + InvalidParentHeader, + #[codec(index = 2)] + CandidateConcludedInvalid, + #[codec(index = 3)] + InherentOverweight, + #[codec(index = 4)] + DisputeStatementsUnsortedOrDuplicates, + #[codec(index = 5)] + DisputeInvalid, + } + } + } + pub mod scheduler { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssignmentKind { + #[codec(index = 0)] + Parachain, + #[codec(index = 1)] + Parathread( + runtime_types::polkadot_primitives::v4::collator_app::Public, + ::core::primitive::u32, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CoreAssignment { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub kind: runtime_types::polkadot_runtime_parachains::scheduler::AssignmentKind, + pub group_idx: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaimQueue { + pub queue: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::scheduler::QueuedParathread, + >, + pub next_core_offset: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueuedParathread { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadEntry, + pub core_offset: ::core::primitive::u32, + } + } + pub mod shared { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + } + } + } + pub mod sp_arithmetic { + use super::runtime_types; + pub mod fixed_point { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct FixedI64(pub ::core::primitive::i64); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct FixedU128(pub ::core::primitive::u128); + } + pub mod per_things { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct PerU16(pub ::core::primitive::u16); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Perbill(pub ::core::primitive::u32); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Percent(pub ::core::primitive::u8); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Permill(pub ::core::primitive::u32); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Perquintill(pub ::core::primitive::u64); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ArithmeticError { + #[codec(index = 0)] + Underflow, + #[codec(index = 1)] + Overflow, + #[codec(index = 2)] + DivisionByZero, + } + } + pub mod sp_authority_discovery { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + } + pub mod sp_consensus_babe { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod digests { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NextConfigDescriptor { + #[codec(index = 1)] + V1 { + c: (::core::primitive::u64, ::core::primitive::u64), + allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PreDigest { + #[codec(index = 1)] + Primary(runtime_types::sp_consensus_babe::digests::PrimaryPreDigest), + #[codec(index = 2)] + SecondaryPlain( + runtime_types::sp_consensus_babe::digests::SecondaryPlainPreDigest, + ), + #[codec(index = 3)] + SecondaryVRF(runtime_types::sp_consensus_babe::digests::SecondaryVRFPreDigest), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PrimaryPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryPlainPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryVRFPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AllowedSlots { + #[codec(index = 0)] + PrimarySlots, + #[codec(index = 1)] + PrimaryAndSecondaryPlainSlots, + #[codec(index = 2)] + PrimaryAndSecondaryVRFSlots, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BabeEpochConfiguration { + pub c: (::core::primitive::u64, ::core::primitive::u64), + pub allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + } + } + pub mod sp_consensus_grandpa { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::ed25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::ed25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Equivocation<_0, _1> { + #[codec(index = 0)] + Prevote( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Prevote<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + #[codec(index = 1)] + Precommit( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Precommit<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + } + } + pub mod sp_consensus_slots { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EquivocationProof<_0, _1> { + pub offender: _1, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub first_header: _0, + pub second_header: _0, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Slot(pub ::core::primitive::u64); + } + pub mod sp_core { + use super::runtime_types; + pub mod crypto { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct KeyTypeId(pub [::core::primitive::u8; 4usize]); + } + pub mod ecdsa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 33usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 65usize]); + } + pub mod ed25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + pub mod offchain { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueMultiaddr(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueNetworkState { + pub peer_id: runtime_types::sp_core::OpaquePeerId, + pub external_addresses: + ::std::vec::Vec, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod vrf { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VrfSignature { + pub output: [::core::primitive::u8; 32usize], + pub proof: [::core::primitive::u8; 64usize], + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaquePeerId(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Void {} + } + pub mod sp_npos_elections { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ElectionScore { + pub minimal_stake: ::core::primitive::u128, + pub sum_stake: ::core::primitive::u128, + pub sum_stake_squared: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Support<_0> { + pub total: ::core::primitive::u128, + pub voters: ::std::vec::Vec<(_0, ::core::primitive::u128)>, + } + } + pub mod sp_runtime { + use super::runtime_types; + pub mod generic { + use super::runtime_types; + pub mod digest { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DigestItem { + #[codec(index = 6)] + PreRuntime( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 4)] + Consensus( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 5)] + Seal( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 0)] + Other(::std::vec::Vec<::core::primitive::u8>), + #[codec(index = 8)] + RuntimeEnvironmentUpdated, + } + } + pub mod unchecked_extrinsic { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedExtrinsic<_0, _1, _2, _3>( + pub ::std::vec::Vec<::core::primitive::u8>, + #[codec(skip)] pub ::core::marker::PhantomData<(_1, _0, _2, _3)>, + ); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchError { + #[codec(index = 0)] + Other, + #[codec(index = 1)] + CannotLookup, + #[codec(index = 2)] + BadOrigin, + #[codec(index = 3)] + Module(runtime_types::sp_runtime::ModuleError), + #[codec(index = 4)] + ConsumerRemaining, + #[codec(index = 5)] + NoProviders, + #[codec(index = 6)] + TooManyConsumers, + #[codec(index = 7)] + Token(runtime_types::sp_runtime::TokenError), + #[codec(index = 8)] + Arithmetic(runtime_types::sp_arithmetic::ArithmeticError), + #[codec(index = 9)] + Transactional(runtime_types::sp_runtime::TransactionalError), + #[codec(index = 10)] + Exhausted, + #[codec(index = 11)] + Corruption, + #[codec(index = 12)] + Unavailable, + #[codec(index = 13)] + RootNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchErrorWithPostInfo<_0> { + pub post_info: _0, + pub error: runtime_types::sp_runtime::DispatchError, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ModuleError { + pub index: ::core::primitive::u8, + pub error: [::core::primitive::u8; 4usize], + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSignature { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Signature), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Signature), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Signature), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSigner { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Public), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Public), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Public), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TokenError { + #[codec(index = 0)] + FundsUnavailable, + #[codec(index = 1)] + OnlyProvider, + #[codec(index = 2)] + BelowMinimum, + #[codec(index = 3)] + CannotCreate, + #[codec(index = 4)] + UnknownAsset, + #[codec(index = 5)] + Frozen, + #[codec(index = 6)] + Unsupported, + #[codec(index = 7)] + CannotCreateHold, + #[codec(index = 8)] + NotExpendable, + #[codec(index = 9)] + Blocked, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionalError { + #[codec(index = 0)] + LimitReached, + #[codec(index = 1)] + NoLayer, + } + } + pub mod sp_staking { + use super::runtime_types; + pub mod offence { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OffenceDetails<_0, _1> { + pub offender: _1, + pub reporters: ::std::vec::Vec<_0>, + } + } + } + pub mod sp_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeVersion { + pub spec_name: ::std::string::String, + pub impl_name: ::std::string::String, + pub authoring_version: ::core::primitive::u32, + pub spec_version: ::core::primitive::u32, + pub impl_version: ::core::primitive::u32, + pub apis: + ::std::vec::Vec<([::core::primitive::u8; 8usize], ::core::primitive::u32)>, + pub transaction_version: ::core::primitive::u32, + pub state_version: ::core::primitive::u8, + } + } + pub mod sp_weights { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeDbWeight { + pub read: ::core::primitive::u64, + pub write: ::core::primitive::u64, + } + } + pub mod xcm { + use super::runtime_types; + pub mod double_encoded { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DoubleEncoded { + pub encoded: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod v2 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: runtime_types::xcm::v2::NetworkId, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: runtime_types::xcm::v2::NetworkId, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: runtime_types::xcm::v2::NetworkId, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v2::BodyId, + part: runtime_types::xcm::v2::BodyPart, + }, + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + #[codec(index = 6)] + Blob(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v2::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v2::multiasset::AssetId, + pub fun: runtime_types::xcm::v2::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v2::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v2::multiasset::AssetId, + fun: runtime_types::xcm::v2::multiasset::WildFungibility, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v2::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v2::multilocation::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + MultiLocationFull, + #[codec(index = 5)] + MultiLocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + UnhandledXcmVersion, + #[codec(index = 23)] + WeightLimitReached(::core::primitive::u64), + #[codec(index = 24)] + Barrier, + #[codec(index = 25)] + WeightNotComputable, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v2::Response, + #[codec(compact)] + max_weight: ::core::primitive::u64, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_type: runtime_types::xcm::v2::OriginKind, + #[codec(compact)] + require_weight_at_most: ::core::primitive::u64, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v2::multilocation::Junctions), + #[codec(index = 12)] + ReportError { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + receive: runtime_types::xcm::v2::multiasset::MultiAssets, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 18)] + QueryHolding { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v2::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v2::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v2::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v2::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + ticket: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 27)] + UnsubscribeVersion, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginKind { + #[codec(index = 0)] + Native, + #[codec(index = 1)] + SovereignAccount, + #[codec(index = 2)] + Superuser, + #[codec(index = 3)] + Xcm, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v2::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(#[codec(compact)] ::core::primitive::u64), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + pub mod v3 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Moniker([::core::primitive::u8; 4usize]), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: + ::core::option::Option, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: + ::core::option::Option, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: + ::core::option::Option, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey { + length: ::core::primitive::u8, + data: [::core::primitive::u8; 32usize], + }, + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v3::junction::BodyId, + part: runtime_types::xcm::v3::junction::BodyPart, + }, + #[codec(index = 9)] + GlobalConsensus(runtime_types::xcm::v3::junction::NetworkId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + ByGenesis([::core::primitive::u8; 32usize]), + #[codec(index = 1)] + ByFork { + block_number: ::core::primitive::u64, + block_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + #[codec(index = 4)] + Westend, + #[codec(index = 5)] + Rococo, + #[codec(index = 6)] + Wococo, + #[codec(index = 7)] + Ethereum { + #[codec(compact)] + chain_id: ::core::primitive::u64, + }, + #[codec(index = 8)] + BitcoinCore, + #[codec(index = 9)] + BitcoinCash, + } + } + pub mod junctions { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v3::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v3::multiasset::AssetId, + pub fun: runtime_types::xcm::v3::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v3::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + }, + #[codec(index = 2)] + AllCounted(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + AllOfCounted { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + #[codec(compact)] + count: ::core::primitive::u32, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v3::junctions::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + LocationFull, + #[codec(index = 5)] + LocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + ExpectationFalse, + #[codec(index = 23)] + PalletNotFound, + #[codec(index = 24)] + NameMismatch, + #[codec(index = 25)] + VersionIncompatible, + #[codec(index = 26)] + HoldingWouldOverflow, + #[codec(index = 27)] + ExportError, + #[codec(index = 28)] + ReanchorFailed, + #[codec(index = 29)] + NoDeal, + #[codec(index = 30)] + FeesNotMet, + #[codec(index = 31)] + LockError, + #[codec(index = 32)] + NoPermission, + #[codec(index = 33)] + Unanchored, + #[codec(index = 34)] + NotDepositable, + #[codec(index = 35)] + UnhandledXcmVersion, + #[codec(index = 36)] + WeightLimitReached(::sp_weights::Weight), + #[codec(index = 37)] + Barrier, + #[codec(index = 38)] + WeightNotComputable, + #[codec(index = 39)] + ExceedsStackLimit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Outcome { + #[codec(index = 0)] + Complete(::sp_weights::Weight), + #[codec(index = 1)] + Incomplete(::sp_weights::Weight, runtime_types::xcm::v3::traits::Error), + #[codec(index = 2)] + Error(runtime_types::xcm::v3::traits::Error), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v3::Response, + max_weight: ::sp_weights::Weight, + querier: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_kind: runtime_types::xcm::v2::OriginKind, + require_weight_at_most: ::sp_weights::Weight, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v3::junctions::Junctions), + #[codec(index = 12)] + ReportError(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + want: runtime_types::xcm::v3::multiasset::MultiAssets, + maximal: ::core::primitive::bool, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 18)] + ReportHolding { + response_info: runtime_types::xcm::v3::QueryResponseInfo, + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v3::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v3::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v3::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + ticket: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + max_response_weight: ::sp_weights::Weight, + }, + #[codec(index = 27)] + UnsubscribeVersion, + #[codec(index = 28)] + BurnAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 29)] + ExpectAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 30)] + ExpectOrigin( + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 31)] + ExpectError( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 32)] + ExpectTransactStatus(runtime_types::xcm::v3::MaybeErrorCode), + #[codec(index = 33)] + QueryPallet { + module_name: ::std::vec::Vec<::core::primitive::u8>, + response_info: runtime_types::xcm::v3::QueryResponseInfo, + }, + #[codec(index = 34)] + ExpectPallet { + #[codec(compact)] + index: ::core::primitive::u32, + name: ::std::vec::Vec<::core::primitive::u8>, + module_name: ::std::vec::Vec<::core::primitive::u8>, + #[codec(compact)] + crate_major: ::core::primitive::u32, + #[codec(compact)] + min_crate_minor: ::core::primitive::u32, + }, + #[codec(index = 35)] + ReportTransactStatus(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 36)] + ClearTransactStatus, + #[codec(index = 37)] + UniversalOrigin(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 38)] + ExportMessage { + network: runtime_types::xcm::v3::junction::NetworkId, + destination: runtime_types::xcm::v3::junctions::Junctions, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 39)] + LockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + unlocker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 40)] + UnlockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + target: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 41)] + NoteUnlockable { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + owner: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 42)] + RequestUnlock { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + locker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 43)] + SetFeesMode { jit_withdraw: ::core::primitive::bool }, + #[codec(index = 44)] + SetTopic([::core::primitive::u8; 32usize]), + #[codec(index = 45)] + ClearTopic, + #[codec(index = 46)] + AliasOrigin(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 47)] + UnpaidExecution { + weight_limit: runtime_types::xcm::v3::WeightLimit, + check_origin: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MaybeErrorCode { + #[codec(index = 0)] + Success, + #[codec(index = 1)] + Error( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + TruncatedError( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletInfo { + #[codec(compact)] + pub index: ::core::primitive::u32, + pub name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + pub module_name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + #[codec(compact)] + pub major: ::core::primitive::u32, + #[codec(compact)] + pub minor: ::core::primitive::u32, + #[codec(compact)] + pub patch: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueryResponseInfo { + pub destination: runtime_types::xcm::v3::multilocation::MultiLocation, + #[codec(compact)] + pub query_id: ::core::primitive::u64, + pub max_weight: ::sp_weights::Weight, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + #[codec(index = 4)] + PalletsInfo( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::xcm::v3::PalletInfo, + >, + ), + #[codec(index = 5)] + DispatchResult(runtime_types::xcm::v3::MaybeErrorCode), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(::sp_weights::Weight), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedAssetId { + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::AssetId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiAssets { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::MultiAssets), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiLocation { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedResponse { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Response), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Response), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedXcm { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Xcm), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Xcm), + } + } + } +} diff --git a/relays/client-kusama/src/lib.rs b/relays/client-kusama/src/lib.rs new file mode 100644 index 000000000000..7fa88959a3c5 --- /dev/null +++ b/relays/client-kusama/src/lib.rs @@ -0,0 +1,134 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the Kusama chain. + +pub mod codegen_runtime; + +use bp_kusama::{AccountInfoStorageMapKeyProvider, KUSAMA_SYNCED_HEADERS_GRANDPA_INFO_METHOD}; +use bp_polkadot_core::SuffixedCommonSignedExtensionExt; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithGrandpa, ChainWithTransactions, Error as SubstrateError, + RelayChain, SignParam, UnderlyingChainProvider, UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount, MultiAddress}; +use sp_session::MembershipProof; +use std::time::Duration; + +pub use codegen_runtime::api::runtime_types; + +pub type RuntimeCall = runtime_types::kusama_runtime::RuntimeCall; + +pub type GrandpaCall = runtime_types::pallet_grandpa::pallet::Call; + +/// Kusama header id. +pub type HeaderId = relay_utils::HeaderId; + +/// Kusama header type used in headers sync. +pub type SyncHeader = relay_substrate_client::SyncHeader; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Kusama chain definition +#[derive(Debug, Clone, Copy)] +pub struct Kusama; + +impl UnderlyingChainProvider for Kusama { + type Chain = bp_kusama::Kusama; +} + +impl Chain for Kusama { + const ID: ChainId = bp_runtime::KUSAMA_CHAIN_ID; + const NAME: &'static str = "Kusama"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_kusama::BEST_FINALIZED_KUSAMA_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(6); + + type SignedBlock = bp_kusama::SignedBlock; + type Call = RuntimeCall; +} + +impl ChainWithGrandpa for Kusama { + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str = + KUSAMA_SYNCED_HEADERS_GRANDPA_INFO_METHOD; + + type KeyOwnerProof = MembershipProof; +} + +impl ChainWithBalances for Kusama { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl RelayChain for Kusama { + const PARAS_PALLET_NAME: &'static str = bp_kusama::PARAS_PALLET_NAME; +} + +impl ChainWithTransactions for Kusama { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = + bp_polkadot_core::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + bp_kusama::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + ((), ()), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(Self::SignedTransaction::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| *address == Address::Id(signer.public().into())) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} diff --git a/relays/client-polkadot-bulletin/Cargo.toml b/relays/client-polkadot-bulletin/Cargo.toml new file mode 100644 index 000000000000..29118d41364c --- /dev/null +++ b/relays/client-polkadot-bulletin/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "relay-polkadot-bulletin-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +subxt = { version = "0.32.1", default-features = false, features = ["native"] } + +# Bridge dependencies + +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-polkadot-bulletin = { path = "../../primitives/chain-polkadot-bulletin" } +bp-runtime = { path = "../../primitives/runtime" } +bridge-runtime-common = { path = "../../bin/runtime-common" } +relay-substrate-client = { path = "../client-substrate" } +relay-utils = { path = "../utils" } + +# Substrate Dependencies + +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-polkadot-bulletin/src/codegen_runtime.rs b/relays/client-polkadot-bulletin/src/codegen_runtime.rs new file mode 100644 index 000000000000..601a2dd973cd --- /dev/null +++ b/relays/client-polkadot-bulletin/src/codegen_runtime.rs @@ -0,0 +1,1622 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated runtime API +//! THIS FILE WAS AUTOGENERATED USING parity-bridges-common::runtime-codegen +//! EXECUTED COMMAND: target/debug/runtime-codegen --from-node-url ws://127.0.0.1:10000 + +#[allow(dead_code, unused_imports, non_camel_case_types)] +#[allow(clippy::all)] +#[allow(rustdoc::broken_intra_doc_links)] +pub mod api { + #[allow(unused_imports)] + mod root_mod { + pub use super::*; + } + pub mod runtime_types { + use super::runtime_types; + pub mod bounded_collections { + use super::runtime_types; + pub mod bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + pub mod weak_bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeakBoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + } + pub mod bp_header_chain { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AuthoritySet { + pub authorities: ::std::vec::Vec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub set_id: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum HeaderChainError { + #[codec(index = 0)] + UnknownHeader, + #[codec(index = 1)] + StorageProof(runtime_types::bp_runtime::storage_proof::Error), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeaderFinalityInfo<_0, _1> { + pub finality_proof: _0, + pub new_verification_context: ::core::option::Option<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredHeaderData<_0, _1> { + pub number: _0, + pub state_root: _1, + } + } + pub mod bp_messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DeliveredMessages { + pub begin: ::core::primitive::u64, + pub end: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundLaneData<_0> { + pub relayers: ::std::vec::Vec>, + pub last_confirmed_nonce: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundMessageDetails { + pub dispatch_weight: ::sp_weights::Weight, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LaneId(pub [::core::primitive::u8; 4usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MessageKey { + pub lane_id: runtime_types::bp_messages::LaneId, + pub nonce: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MessagesOperatingMode { + #[codec(index = 0)] + Basic(runtime_types::bp_runtime::BasicOperatingMode), + #[codec(index = 1)] + RejectingOutboundMessages, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundLaneData { + pub oldest_unpruned_nonce: ::core::primitive::u64, + pub latest_received_nonce: ::core::primitive::u64, + pub latest_generated_nonce: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundMessageDetails { + pub nonce: ::core::primitive::u64, + pub dispatch_weight: ::sp_weights::Weight, + pub size: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReceivalResult<_0> { + #[codec(index = 0)] + Dispatched(runtime_types::bp_runtime::messages::MessageDispatchResult<_0>), + #[codec(index = 1)] + InvalidNonce, + #[codec(index = 2)] + TooManyUnrewardedRelayers, + #[codec(index = 3)] + TooManyUnconfirmedMessages, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReceivedMessages<_0> { + pub lane: runtime_types::bp_messages::LaneId, + pub receive_results: ::std::vec::Vec<( + ::core::primitive::u64, + runtime_types::bp_messages::ReceivalResult<_0>, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnrewardedRelayer<_0> { + pub relayer: _0, + pub messages: runtime_types::bp_messages::DeliveredMessages, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VerificationError { + #[codec(index = 0)] + EmptyMessageProof, + #[codec(index = 1)] + HeaderChain(runtime_types::bp_header_chain::HeaderChainError), + #[codec(index = 2)] + InboundLaneStorage(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 3)] + InvalidMessageWeight, + #[codec(index = 4)] + MessagesCountMismatch, + #[codec(index = 5)] + MessageStorage(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 6)] + MessageTooLarge, + #[codec(index = 7)] + OutboundLaneStorage(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 8)] + StorageProof(runtime_types::bp_runtime::storage_proof::Error), + #[codec(index = 9)] + Other, + } + } + pub mod bp_parachains { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BestParaHeadHash { + pub at_relay_block_number: ::core::primitive::u32, + pub head_hash: ::subxt::utils::H256, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaInfo { + pub best_head_hash: runtime_types::bp_parachains::BestParaHeadHash, + pub next_imported_hash_position: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaStoredHeaderData(pub ::std::vec::Vec<::core::primitive::u8>); + } + pub mod bp_runtime { + use super::runtime_types; + pub mod messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MessageDispatchResult<_0> { + pub unspent_weight: ::sp_weights::Weight, + pub dispatch_level_result: _0, + } + } + pub mod storage_proof { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DuplicateNodesInProof, + #[codec(index = 1)] + UnusedNodesInTheProof, + #[codec(index = 2)] + StorageRootMismatch, + #[codec(index = 3)] + StorageValueUnavailable, + #[codec(index = 4)] + StorageValueEmpty, + #[codec(index = 5)] + StorageValueDecodeFailed(runtime_types::bp_runtime::StrippableError), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BasicOperatingMode { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Halted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeaderId<_0, _1>(pub _1, pub _0); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OwnedBridgeModuleError { + #[codec(index = 0)] + Halted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StrippableError; + } + pub mod bridge_runtime_common { + use super::runtime_types; + pub mod messages_xcm_extension { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum XcmBlobMessageDispatchResult { + #[codec(index = 0)] + InvalidPayload, + #[codec(index = 1)] + Dispatched, + #[codec(index = 2)] + NotDispatched, + } + } + } + pub mod finality_grandpa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Commit<_0, _1, _2, _3> { + pub target_hash: _0, + pub target_number: _1, + pub precommits: ::std::vec::Vec< + runtime_types::finality_grandpa::SignedPrecommit<_0, _1, _2, _3>, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Equivocation<_0, _1, _2> { + pub round_number: ::core::primitive::u64, + pub identity: _0, + pub first: (_1, _2), + pub second: (_1, _2), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Precommit<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Prevote<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SignedPrecommit<_0, _1, _2, _3> { + pub precommit: runtime_types::finality_grandpa::Precommit<_0, _1>, + pub signature: _2, + pub id: _3, + } + } + pub mod frame_support { + use super::runtime_types; + pub mod dispatch { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchClass { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Operational, + #[codec(index = 2)] + Mandatory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchInfo { + pub weight: ::sp_weights::Weight, + pub class: runtime_types::frame_support::dispatch::DispatchClass, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Pays { + #[codec(index = 0)] + Yes, + #[codec(index = 1)] + No, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PerDispatchClass<_0> { + pub normal: _0, + pub operational: _0, + pub mandatory: _0, + } + } + } + pub mod frame_system { + use super::runtime_types; + pub mod extensions { + use super::runtime_types; + pub mod check_genesis { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckGenesis; + } + pub mod check_mortality { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckMortality(pub ::sp_runtime::generic::Era); + } + pub mod check_non_zero_sender { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonZeroSender; + } + pub mod check_nonce { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonce(#[codec(compact)] pub ::core::primitive::u32); + } + pub mod check_spec_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckSpecVersion; + } + pub mod check_tx_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckTxVersion; + } + pub mod check_weight { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckWeight; + } + } + pub mod limits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockLength { + pub max: runtime_types::frame_support::dispatch::PerDispatchClass< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockWeights { + pub base_block: ::sp_weights::Weight, + pub max_block: ::sp_weights::Weight, + pub per_class: runtime_types::frame_support::dispatch::PerDispatchClass< + runtime_types::frame_system::limits::WeightsPerClass, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeightsPerClass { + pub base_extrinsic: ::sp_weights::Weight, + pub max_extrinsic: ::core::option::Option<::sp_weights::Weight>, + pub max_total: ::core::option::Option<::sp_weights::Weight>, + pub reserved: ::core::option::Option<::sp_weights::Weight>, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + remark { remark: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + set_heap_pages { pages: ::core::primitive::u64 }, + #[codec(index = 2)] + set_code { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 3)] + set_code_without_checks { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + set_storage { + items: ::std::vec::Vec<( + ::std::vec::Vec<::core::primitive::u8>, + ::std::vec::Vec<::core::primitive::u8>, + )>, + }, + #[codec(index = 5)] + kill_storage { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>> }, + #[codec(index = 6)] + kill_prefix { + prefix: ::std::vec::Vec<::core::primitive::u8>, + subkeys: ::core::primitive::u32, + }, + #[codec(index = 7)] + remark_with_event { remark: ::std::vec::Vec<::core::primitive::u8> }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidSpecName, + #[codec(index = 1)] + SpecVersionNeedsToIncrease, + #[codec(index = 2)] + FailedToExtractRuntimeVersion, + #[codec(index = 3)] + NonDefaultComposite, + #[codec(index = 4)] + NonZeroRefCount, + #[codec(index = 5)] + CallFiltered, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ExtrinsicSuccess { + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 1)] + ExtrinsicFailed { + dispatch_error: runtime_types::sp_runtime::DispatchError, + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 2)] + CodeUpdated, + #[codec(index = 3)] + NewAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + KilledAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Remarked { sender: ::sp_core::crypto::AccountId32, hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountInfo<_0, _1> { + pub nonce: _0, + pub consumers: ::core::primitive::u32, + pub providers: ::core::primitive::u32, + pub sufficients: ::core::primitive::u32, + pub data: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EventRecord<_0, _1> { + pub phase: runtime_types::frame_system::Phase, + pub event: _0, + pub topics: ::std::vec::Vec<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LastRuntimeUpgradeInfo { + #[codec(compact)] + pub spec_version: ::core::primitive::u32, + pub spec_name: ::std::string::String, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase { + #[codec(index = 0)] + ApplyExtrinsic(::core::primitive::u32), + #[codec(index = 1)] + Finalization, + #[codec(index = 2)] + Initialization, + } + } + pub mod pallet_babe { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + plan_config_change { + config: runtime_types::sp_consensus_babe::digests::NextConfigDescriptor, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEquivocationProof, + #[codec(index = 1)] + InvalidKeyOwnershipProof, + #[codec(index = 2)] + DuplicateOffenceReport, + #[codec(index = 3)] + InvalidConfiguration, + } + } + } + pub mod pallet_bridge_grandpa { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + submit_finality_proof { + finality_target: ::std::boxed::Box< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + justification: ::bp_header_chain::justification::GrandpaJustification< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + #[codec(index = 1)] + initialize { + init_data: ::bp_header_chain::InitializationData< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + #[codec(index = 2)] + set_owner { new_owner: ::core::option::Option<::sp_core::crypto::AccountId32> }, + #[codec(index = 3)] + set_operating_mode { + operating_mode: runtime_types::bp_runtime::BasicOperatingMode, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidJustification, + #[codec(index = 1)] + InvalidAuthoritySet, + #[codec(index = 2)] + OldHeader, + #[codec(index = 3)] + UnsupportedScheduledChange, + #[codec(index = 4)] + NotInitialized, + #[codec(index = 5)] + AlreadyInitialized, + #[codec(index = 6)] + TooManyAuthoritiesInSet, + #[codec(index = 7)] + BridgeModule(runtime_types::bp_runtime::OwnedBridgeModuleError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + UpdatedBestFinalizedHeader { + number: ::core::primitive::u32, + hash: ::subxt::utils::H256, + grandpa_info: runtime_types::bp_header_chain::HeaderFinalityInfo< + ::bp_header_chain::justification::GrandpaJustification< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + runtime_types::bp_header_chain::AuthoritySet, + >, + }, + } + } + pub mod storage_types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredAuthoritySet { + pub authorities: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub set_id: ::core::primitive::u64, + } + } + } + pub mod pallet_bridge_messages { + use super::runtime_types; + pub mod outbound_lane { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReceivalConfirmationError { + #[codec(index = 0)] + FailedToConfirmFutureMessages, + #[codec(index = 1)] + EmptyUnrewardedRelayerEntry, + #[codec(index = 2)] + NonConsecutiveUnrewardedRelayerEntries, + #[codec(index = 3)] + TryingToConfirmMoreMessagesThanExpected, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] set_owner { new_owner : :: core :: option :: Option < :: sp_core :: crypto :: AccountId32 > , } , # [codec (index = 1)] set_operating_mode { operating_mode : runtime_types :: bp_messages :: MessagesOperatingMode , } , # [codec (index = 2)] receive_messages_proof { relayer_id_at_bridged_chain : :: sp_core :: crypto :: AccountId32 , proof : :: bridge_runtime_common :: messages :: target :: FromBridgedChainMessagesProof < :: subxt :: utils :: H256 > , messages_count : :: core :: primitive :: u32 , dispatch_weight : :: sp_weights :: Weight , } , # [codec (index = 3)] receive_messages_delivery_proof { proof : :: bridge_runtime_common :: messages :: source :: FromBridgedChainMessagesDeliveryProof < :: subxt :: utils :: H256 > , relayers_state : :: bp_messages :: UnrewardedRelayersState , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + # [codec (index = 0)] NotOperatingNormally , # [codec (index = 1)] InactiveOutboundLane , # [codec (index = 2)] MessageDispatchInactive , # [codec (index = 3)] MessageRejectedByChainVerifier (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 4)] MessageRejectedByLaneVerifier (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 5)] MessageRejectedByPallet (runtime_types :: bp_messages :: VerificationError ,) , # [codec (index = 6)] FailedToWithdrawMessageFee , # [codec (index = 7)] TooManyMessagesInTheProof , # [codec (index = 8)] InvalidMessagesProof , # [codec (index = 9)] InvalidMessagesDeliveryProof , # [codec (index = 10)] InvalidUnrewardedRelayersState , # [codec (index = 11)] InsufficientDispatchWeight , # [codec (index = 12)] MessageIsNotYetSent , # [codec (index = 13)] ReceivalConfirmation (runtime_types :: pallet_bridge_messages :: outbound_lane :: ReceivalConfirmationError ,) , # [codec (index = 14)] BridgeModule (runtime_types :: bp_runtime :: OwnedBridgeModuleError ,) , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + # [codec (index = 0)] MessageAccepted { lane_id : runtime_types :: bp_messages :: LaneId , nonce : :: core :: primitive :: u64 , } , # [codec (index = 1)] MessagesReceived (:: std :: vec :: Vec < runtime_types :: bp_messages :: ReceivedMessages < runtime_types :: bridge_runtime_common :: messages_xcm_extension :: XcmBlobMessageDispatchResult > > ,) , # [codec (index = 2)] MessagesDelivered { lane_id : runtime_types :: bp_messages :: LaneId , messages : runtime_types :: bp_messages :: DeliveredMessages , } , } + } + } + pub mod pallet_bridge_parachains { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + submit_parachain_heads { + at_relay_block: (::core::primitive::u32, ::subxt::utils::H256), + parachains: ::std::vec::Vec<( + ::bp_polkadot_core::parachains::ParaId, + ::subxt::utils::H256, + )>, + parachain_heads_proof: ::bp_polkadot_core::parachains::ParaHeadsProof, + }, + #[codec(index = 1)] + set_owner { new_owner: ::core::option::Option<::sp_core::crypto::AccountId32> }, + #[codec(index = 2)] + set_operating_mode { + operating_mode: runtime_types::bp_runtime::BasicOperatingMode, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnknownRelayChainBlock, + #[codec(index = 1)] + InvalidRelayChainBlockNumber, + #[codec(index = 2)] + HeaderChainStorageProof(runtime_types::bp_header_chain::HeaderChainError), + #[codec(index = 3)] + BridgeModule(runtime_types::bp_runtime::OwnedBridgeModuleError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + UntrackedParachainRejected { parachain: ::bp_polkadot_core::parachains::ParaId }, + #[codec(index = 1)] + MissingParachainHead { parachain: ::bp_polkadot_core::parachains::ParaId }, + #[codec(index = 2)] + IncorrectParachainHeadHash { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + actual_parachain_head_hash: ::subxt::utils::H256, + }, + #[codec(index = 3)] + RejectedObsoleteParachainHead { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + }, + #[codec(index = 4)] + RejectedLargeParachainHead { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + parachain_head_size: ::core::primitive::u32, + }, + #[codec(index = 5)] + UpdatedParachainHead { + parachain: ::bp_polkadot_core::parachains::ParaId, + parachain_head_hash: ::subxt::utils::H256, + }, + } + } + } + pub mod pallet_grandpa { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + note_stalled { + delay: ::core::primitive::u32, + best_finalized_block_number: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PauseFailed, + #[codec(index = 1)] + ResumeFailed, + #[codec(index = 2)] + ChangePending, + #[codec(index = 3)] + TooSoon, + #[codec(index = 4)] + InvalidKeyOwnershipProof, + #[codec(index = 5)] + InvalidEquivocationProof, + #[codec(index = 6)] + DuplicateOffenceReport, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewAuthorities { + authority_set: ::std::vec::Vec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + }, + #[codec(index = 1)] + Paused, + #[codec(index = 2)] + Resumed, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredPendingChange<_0> { + pub scheduled_at: _0, + pub delay: _0, + pub next_authorities: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub forced: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StoredState<_0> { + #[codec(index = 0)] + Live, + #[codec(index = 1)] + PendingPause { scheduled_at: _0, delay: _0 }, + #[codec(index = 2)] + Paused, + #[codec(index = 3)] + PendingResume { scheduled_at: _0, delay: _0 }, + } + } + pub mod pallet_im_online { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + heartbeat { + heartbeat: + runtime_types::pallet_im_online::Heartbeat<::core::primitive::u32>, + signature: runtime_types::pallet_im_online::sr25519::app_sr25519::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidKey, + #[codec(index = 1)] + DuplicatedHeartbeat, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + HeartbeatReceived { + authority_id: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + }, + #[codec(index = 1)] + AllGood, + #[codec(index = 2)] + SomeOffline { + offline: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + ::sp_core::crypto::AccountId32, + )>, + }, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod app_sr25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Heartbeat<_0> { + pub block_number: _0, + pub session_index: ::core::primitive::u32, + pub authority_index: ::core::primitive::u32, + pub validators_len: ::core::primitive::u32, + } + } + pub mod pallet_offences { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Offence { + kind: [::core::primitive::u8; 16usize], + timeslot: ::std::vec::Vec<::core::primitive::u8>, + }, + } + } + } + pub mod pallet_relayer_set { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Duplicate, + #[codec(index = 1)] + NotARelayer, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + RelayerAdded(::sp_core::crypto::AccountId32), + #[codec(index = 1)] + RelayerRemoved(::sp_core::crypto::AccountId32), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Relayer<_0> { + pub min_bridge_tx_block: _0, + } + } + pub mod pallet_session { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_keys { + keys: runtime_types::polkadot_bulletin_chain_runtime::opaque::SessionKeys, + proof: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + purge_keys, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidProof, + #[codec(index = 1)] + NoAssociatedValidatorId, + #[codec(index = 2)] + DuplicatedKey, + #[codec(index = 3)] + NoKeys, + #[codec(index = 4)] + NoAccount, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewSession { session_index: ::core::primitive::u32 }, + } + } + } + pub mod pallet_sudo { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + sudo { + call: ::std::boxed::Box< + runtime_types::polkadot_bulletin_chain_runtime::RuntimeCall, + >, + }, + #[codec(index = 1)] + sudo_unchecked_weight { + call: ::std::boxed::Box< + runtime_types::polkadot_bulletin_chain_runtime::RuntimeCall, + >, + weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + set_key { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 3)] + sudo_as { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call: ::std::boxed::Box< + runtime_types::polkadot_bulletin_chain_runtime::RuntimeCall, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + RequireSudo, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Sudid { + sudo_result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + KeyChanged { + old_sudoer: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 2)] + SudoAsDone { + sudo_result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_timestamp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set { + #[codec(compact)] + now: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_transaction_storage { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + store { data: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + renew { block: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + check_proof { + proof: runtime_types::sp_transaction_storage_proof::TransactionStorageProof, + }, + #[codec(index = 3)] + authorize_account { + who: ::sp_core::crypto::AccountId32, + transactions: ::core::primitive::u32, + bytes: ::core::primitive::u64, + }, + #[codec(index = 4)] + authorize_preimage { + hash: [::core::primitive::u8; 32usize], + max_size: ::core::primitive::u64, + }, + #[codec(index = 5)] + remove_expired_account_authorization { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 6)] + remove_expired_preimage_authorization { hash: [::core::primitive::u8; 32usize] }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + BadContext, + #[codec(index = 1)] + BadDataSize, + #[codec(index = 2)] + TooManyTransactions, + #[codec(index = 3)] + RenewedNotFound, + #[codec(index = 4)] + UnexpectedProof, + #[codec(index = 5)] + InvalidProof, + #[codec(index = 6)] + MissingStateData, + #[codec(index = 7)] + DoubleCheck, + #[codec(index = 8)] + AuthorizationNotFound, + #[codec(index = 9)] + AuthorizationNotExpired, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Stored { index: ::core::primitive::u32 }, + #[codec(index = 1)] + Renewed { index: ::core::primitive::u32 }, + #[codec(index = 2)] + ProofChecked, + #[codec(index = 3)] + AccountAuthorized { + who: ::sp_core::crypto::AccountId32, + transactions: ::core::primitive::u32, + bytes: ::core::primitive::u64, + }, + #[codec(index = 4)] + PreimageAuthorized { + hash: [::core::primitive::u8; 32usize], + max_size: ::core::primitive::u64, + }, + #[codec(index = 5)] + ExpiredAccountAuthorizationRemoved { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 6)] + ExpiredPreimageAuthorizationRemoved { hash: [::core::primitive::u8; 32usize] }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Authorization<_0> { + pub extent: runtime_types::pallet_transaction_storage::AuthorizationExtent, + pub expiration: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AuthorizationExtent { + pub transactions: ::core::primitive::u32, + pub bytes: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AuthorizationScope<_0> { + #[codec(index = 0)] + Account(_0), + #[codec(index = 1)] + Preimage([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct TransactionInfo { + pub chunk_root: ::subxt::utils::H256, + pub content_hash: ::subxt::utils::H256, + pub size: ::core::primitive::u32, + pub block_chunks: ::core::primitive::u32, + } + } + pub mod pallet_validator_set { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Duplicate, + #[codec(index = 1)] + NotAValidator, + #[codec(index = 2)] + TooManyValidators, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ValidatorAdded(::sp_core::crypto::AccountId32), + #[codec(index = 1)] + ValidatorRemoved(::sp_core::crypto::AccountId32), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Validator<_0> { + pub min_set_keys_block: _0, + } + } + pub mod polkadot_bulletin_chain_runtime { + use super::runtime_types; + pub mod opaque { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionKeys { + pub babe: runtime_types::sp_consensus_babe::app::Public, + pub grandpa: runtime_types::sp_consensus_grandpa::app::Public, + pub im_online: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BridgeRejectObsoleteHeadersAndMessages; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Runtime; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeCall { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Call), + #[codec(index = 1)] + Babe(runtime_types::pallet_babe::pallet::Call), + #[codec(index = 2)] + Timestamp(runtime_types::pallet_timestamp::pallet::Call), + #[codec(index = 14)] + Session(runtime_types::pallet_session::pallet::Call), + #[codec(index = 15)] + ImOnline(runtime_types::pallet_im_online::pallet::Call), + #[codec(index = 16)] + Grandpa(runtime_types::pallet_grandpa::pallet::Call), + #[codec(index = 40)] + TransactionStorage(runtime_types::pallet_transaction_storage::pallet::Call), + #[codec(index = 51)] + BridgePolkadotGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Call), + #[codec(index = 52)] + BridgePolkadotParachains(runtime_types::pallet_bridge_parachains::pallet::Call), + #[codec(index = 53)] + BridgePolkadotMessages(runtime_types::pallet_bridge_messages::pallet::Call), + #[codec(index = 255)] + Sudo(runtime_types::pallet_sudo::pallet::Call), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeError { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Error), + #[codec(index = 1)] + Babe(runtime_types::pallet_babe::pallet::Error), + #[codec(index = 13)] + ValidatorSet(runtime_types::pallet_validator_set::pallet::Error), + #[codec(index = 14)] + Session(runtime_types::pallet_session::pallet::Error), + #[codec(index = 15)] + ImOnline(runtime_types::pallet_im_online::pallet::Error), + #[codec(index = 16)] + Grandpa(runtime_types::pallet_grandpa::pallet::Error), + #[codec(index = 40)] + TransactionStorage(runtime_types::pallet_transaction_storage::pallet::Error), + #[codec(index = 50)] + RelayerSet(runtime_types::pallet_relayer_set::pallet::Error), + #[codec(index = 51)] + BridgePolkadotGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Error), + #[codec(index = 52)] + BridgePolkadotParachains(runtime_types::pallet_bridge_parachains::pallet::Error), + #[codec(index = 53)] + BridgePolkadotMessages(runtime_types::pallet_bridge_messages::pallet::Error), + #[codec(index = 255)] + Sudo(runtime_types::pallet_sudo::pallet::Error), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeEvent { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Event), + #[codec(index = 11)] + Offences(runtime_types::pallet_offences::pallet::Event), + #[codec(index = 13)] + ValidatorSet(runtime_types::pallet_validator_set::pallet::Event), + #[codec(index = 14)] + Session(runtime_types::pallet_session::pallet::Event), + #[codec(index = 15)] + ImOnline(runtime_types::pallet_im_online::pallet::Event), + #[codec(index = 16)] + Grandpa(runtime_types::pallet_grandpa::pallet::Event), + #[codec(index = 40)] + TransactionStorage(runtime_types::pallet_transaction_storage::pallet::Event), + #[codec(index = 50)] + RelayerSet(runtime_types::pallet_relayer_set::pallet::Event), + #[codec(index = 51)] + BridgePolkadotGrandpa(runtime_types::pallet_bridge_grandpa::pallet::Event), + #[codec(index = 52)] + BridgePolkadotParachains(runtime_types::pallet_bridge_parachains::pallet::Event), + #[codec(index = 53)] + BridgePolkadotMessages(runtime_types::pallet_bridge_messages::pallet::Event), + #[codec(index = 255)] + Sudo(runtime_types::pallet_sudo::pallet::Event), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidateSigned; + } + pub mod sp_arithmetic { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ArithmeticError { + #[codec(index = 0)] + Underflow, + #[codec(index = 1)] + Overflow, + #[codec(index = 2)] + DivisionByZero, + } + } + pub mod sp_consensus_babe { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod digests { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NextConfigDescriptor { + #[codec(index = 1)] + V1 { + c: (::core::primitive::u64, ::core::primitive::u64), + allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PreDigest { + #[codec(index = 1)] + Primary(runtime_types::sp_consensus_babe::digests::PrimaryPreDigest), + #[codec(index = 2)] + SecondaryPlain( + runtime_types::sp_consensus_babe::digests::SecondaryPlainPreDigest, + ), + #[codec(index = 3)] + SecondaryVRF(runtime_types::sp_consensus_babe::digests::SecondaryVRFPreDigest), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PrimaryPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryPlainPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryVRFPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AllowedSlots { + #[codec(index = 0)] + PrimarySlots, + #[codec(index = 1)] + PrimaryAndSecondaryPlainSlots, + #[codec(index = 2)] + PrimaryAndSecondaryVRFSlots, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BabeConfiguration { + pub slot_duration: ::core::primitive::u64, + pub epoch_length: ::core::primitive::u64, + pub c: (::core::primitive::u64, ::core::primitive::u64), + pub authorities: ::std::vec::Vec<( + runtime_types::sp_consensus_babe::app::Public, + ::core::primitive::u64, + )>, + pub randomness: [::core::primitive::u8; 32usize], + pub allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BabeEpochConfiguration { + pub c: (::core::primitive::u64, ::core::primitive::u64), + pub allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Epoch { + pub epoch_index: ::core::primitive::u64, + pub start_slot: runtime_types::sp_consensus_slots::Slot, + pub duration: ::core::primitive::u64, + pub authorities: ::std::vec::Vec<( + runtime_types::sp_consensus_babe::app::Public, + ::core::primitive::u64, + )>, + pub randomness: [::core::primitive::u8; 32usize], + pub config: runtime_types::sp_consensus_babe::BabeEpochConfiguration, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueKeyOwnershipProof(pub ::std::vec::Vec<::core::primitive::u8>); + } + pub mod sp_consensus_grandpa { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::ed25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::ed25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Equivocation<_0, _1> { + #[codec(index = 0)] + Prevote( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Prevote<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + #[codec(index = 1)] + Precommit( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Precommit<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueKeyOwnershipProof(pub ::std::vec::Vec<::core::primitive::u8>); + } + pub mod sp_consensus_slots { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EquivocationProof<_0, _1> { + pub offender: _1, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub first_header: _0, + pub second_header: _0, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Slot(pub ::core::primitive::u64); + } + pub mod sp_core { + use super::runtime_types; + pub mod crypto { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct KeyTypeId(pub [::core::primitive::u8; 4usize]); + } + pub mod ecdsa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 65usize]); + } + pub mod ed25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + pub mod sr25519 { + use super::runtime_types; + pub mod vrf { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VrfSignature { + pub output: [::core::primitive::u8; 32usize], + pub proof: [::core::primitive::u8; 64usize], + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueMetadata(pub ::std::vec::Vec<::core::primitive::u8>); + } + pub mod sp_inherents { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckInherentsResult { + pub okay: ::core::primitive::bool, + pub fatal_error: ::core::primitive::bool, + pub errors: runtime_types::sp_inherents::InherentData, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InherentData { + pub data: ::subxt::utils::KeyedVec< + [::core::primitive::u8; 8usize], + ::std::vec::Vec<::core::primitive::u8>, + >, + } + } + pub mod sp_runtime { + use super::runtime_types; + pub mod generic { + use super::runtime_types; + pub mod block { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Block<_0, _1> { + pub header: _0, + pub extrinsics: ::std::vec::Vec<_1>, + } + } + pub mod digest { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DigestItem { + #[codec(index = 6)] + PreRuntime( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 4)] + Consensus( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 5)] + Seal( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 0)] + Other(::std::vec::Vec<::core::primitive::u8>), + #[codec(index = 8)] + RuntimeEnvironmentUpdated, + } + } + } + pub mod transaction_validity { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum InvalidTransaction { + #[codec(index = 0)] + Call, + #[codec(index = 1)] + Payment, + #[codec(index = 2)] + Future, + #[codec(index = 3)] + Stale, + #[codec(index = 4)] + BadProof, + #[codec(index = 5)] + AncientBirthBlock, + #[codec(index = 6)] + ExhaustsResources, + #[codec(index = 7)] + Custom(::core::primitive::u8), + #[codec(index = 8)] + BadMandatory, + #[codec(index = 9)] + MandatoryValidation, + #[codec(index = 10)] + BadSigner, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionSource { + #[codec(index = 0)] + InBlock, + #[codec(index = 1)] + Local, + #[codec(index = 2)] + External, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionValidityError { + #[codec(index = 0)] + Invalid(runtime_types::sp_runtime::transaction_validity::InvalidTransaction), + #[codec(index = 1)] + Unknown(runtime_types::sp_runtime::transaction_validity::UnknownTransaction), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UnknownTransaction { + #[codec(index = 0)] + CannotLookup, + #[codec(index = 1)] + NoUnsignedValidator, + #[codec(index = 2)] + Custom(::core::primitive::u8), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidTransaction { + pub priority: ::core::primitive::u64, + pub requires: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, + pub provides: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, + pub longevity: ::core::primitive::u64, + pub propagate: ::core::primitive::bool, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchError { + #[codec(index = 0)] + Other, + #[codec(index = 1)] + CannotLookup, + #[codec(index = 2)] + BadOrigin, + #[codec(index = 3)] + Module(runtime_types::sp_runtime::ModuleError), + #[codec(index = 4)] + ConsumerRemaining, + #[codec(index = 5)] + NoProviders, + #[codec(index = 6)] + TooManyConsumers, + #[codec(index = 7)] + Token(runtime_types::sp_runtime::TokenError), + #[codec(index = 8)] + Arithmetic(runtime_types::sp_arithmetic::ArithmeticError), + #[codec(index = 9)] + Transactional(runtime_types::sp_runtime::TransactionalError), + #[codec(index = 10)] + Exhausted, + #[codec(index = 11)] + Corruption, + #[codec(index = 12)] + Unavailable, + #[codec(index = 13)] + RootNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ModuleError { + pub index: ::core::primitive::u8, + pub error: [::core::primitive::u8; 4usize], + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSignature { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Signature), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Signature), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Signature), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TokenError { + #[codec(index = 0)] + FundsUnavailable, + #[codec(index = 1)] + OnlyProvider, + #[codec(index = 2)] + BelowMinimum, + #[codec(index = 3)] + CannotCreate, + #[codec(index = 4)] + UnknownAsset, + #[codec(index = 5)] + Frozen, + #[codec(index = 6)] + Unsupported, + #[codec(index = 7)] + CannotCreateHold, + #[codec(index = 8)] + NotExpendable, + #[codec(index = 9)] + Blocked, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionalError { + #[codec(index = 0)] + LimitReached, + #[codec(index = 1)] + NoLayer, + } + } + pub mod sp_staking { + use super::runtime_types; + pub mod offence { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OffenceDetails<_0, _1> { + pub offender: _1, + pub reporters: ::std::vec::Vec<_0>, + } + } + } + pub mod sp_transaction_storage_proof { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct TransactionStorageProof { + pub chunk: ::std::vec::Vec<::core::primitive::u8>, + pub proof: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, + } + } + pub mod sp_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeVersion { + pub spec_name: ::std::string::String, + pub impl_name: ::std::string::String, + pub authoring_version: ::core::primitive::u32, + pub spec_version: ::core::primitive::u32, + pub impl_version: ::core::primitive::u32, + pub apis: + ::std::vec::Vec<([::core::primitive::u8; 8usize], ::core::primitive::u32)>, + pub transaction_version: ::core::primitive::u32, + pub state_version: ::core::primitive::u8, + } + } + pub mod sp_weights { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeDbWeight { + pub read: ::core::primitive::u64, + pub write: ::core::primitive::u64, + } + } + } +} diff --git a/relays/client-polkadot-bulletin/src/lib.rs b/relays/client-polkadot-bulletin/src/lib.rs new file mode 100644 index 000000000000..56dd7b487f55 --- /dev/null +++ b/relays/client-polkadot-bulletin/src/lib.rs @@ -0,0 +1,158 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the Polkadot Bulletin chain. + +mod codegen_runtime; + +use bp_messages::MessageNonce; +use bp_polkadot_bulletin::POLKADOT_BULLETIN_SYNCED_HEADERS_GRANDPA_INFO_METHOD; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithGrandpa, ChainWithMessages, ChainWithTransactions, + Error as SubstrateError, SignParam, UnderlyingChainProvider, UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount, MultiAddress}; +use sp_session::MembershipProof; +use std::time::Duration; + +pub use codegen_runtime::api::runtime_types; + +/// Call of the Polkadot Bulletin Chain runtime. +pub type RuntimeCall = runtime_types::polkadot_bulletin_chain_runtime::RuntimeCall; +/// Call of the `Sudo` pallet. +pub type SudoCall = runtime_types::pallet_sudo::pallet::Call; +/// Call of the GRANDPA pallet. +pub type GrandpaCall = runtime_types::pallet_grandpa::pallet::Call; +/// Call of the with-PolkadotBridgeHub bridge GRANDPA pallet. +pub type BridgePolkadotGrandpaCall = runtime_types::pallet_bridge_grandpa::pallet::Call; +/// Call of the with-PolkadotBridgeHub bridge parachains pallet. +pub type BridgePolkadotParachainsCall = runtime_types::pallet_bridge_parachains::pallet::Call; +/// Call of the with-PolkadotBridgeHub bridge messages pallet. +pub type BridgePolkadotMessagesCall = runtime_types::pallet_bridge_messages::pallet::Call; + +/// Polkadot header id. +pub type HeaderId = + relay_utils::HeaderId; + +/// Polkadot header type used in headers sync. +pub type SyncHeader = relay_substrate_client::SyncHeader; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Polkadot chain definition +#[derive(Debug, Clone, Copy)] +pub struct PolkadotBulletin; + +impl UnderlyingChainProvider for PolkadotBulletin { + type Chain = bp_polkadot_bulletin::PolkadotBulletin; +} + +impl Chain for PolkadotBulletin { + const ID: ChainId = *b"pbch"; + + const NAME: &'static str = "PolkadotBulletin"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_polkadot_bulletin::BEST_FINALIZED_POLKADOT_BULLETIN_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(6); + + type SignedBlock = bp_polkadot_bulletin::SignedBlock; + type Call = RuntimeCall; +} + +impl ChainWithGrandpa for PolkadotBulletin { + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str = + POLKADOT_BULLETIN_SYNCED_HEADERS_GRANDPA_INFO_METHOD; + + type KeyOwnerProof = MembershipProof; +} + +impl ChainWithMessages for PolkadotBulletin { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = + bp_polkadot_bulletin::WITH_POLKADOT_BULLETIN_MESSAGES_PALLET_NAME; + // this is not critical (some metrics will be missing from the storage), but probably it needs + // to be changed when we'll polish the bridge configuration + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = None; + + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_polkadot_bulletin::TO_POLKADOT_BULLETIN_MESSAGE_DETAILS_METHOD; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = + bp_polkadot_bulletin::FROM_POLKADOT_BULLETIN_MESSAGE_DETAILS_METHOD; + + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = + bp_polkadot_bulletin::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = + bp_polkadot_bulletin::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; +} + +impl ChainWithBalances for PolkadotBulletin { + fn account_info_storage_key(_account_id: &Self::AccountId) -> StorageKey { + // no balances at this chain + StorageKey(vec![]) + } +} + +impl ChainWithTransactions for PolkadotBulletin { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = + bp_polkadot_bulletin::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + bp_polkadot_bulletin::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(Self::SignedTransaction::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| *address == Address::Id(signer.public().into())) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce())) + } +} diff --git a/relays/client-polkadot/Cargo.toml b/relays/client-polkadot/Cargo.toml new file mode 100644 index 000000000000..58a7b058f0ec --- /dev/null +++ b/relays/client-polkadot/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "relay-polkadot-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +subxt = { version = "0.32.1", default-features = false, features = ["native"] } + +# Bridge dependencies + +bp-polkadot = { path = "../../primitives/chain-polkadot" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-runtime = { path = "../../primitives/runtime" } + +relay-substrate-client = { path = "../client-substrate" } +relay-utils = { path = "../utils" } + +# Substrate Dependencies + +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-polkadot/src/codegen_runtime.rs b/relays/client-polkadot/src/codegen_runtime.rs new file mode 100644 index 000000000000..aa4b37cec502 --- /dev/null +++ b/relays/client-polkadot/src/codegen_runtime.rs @@ -0,0 +1,8399 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated runtime API +//! THIS FILE WAS AUTOGENERATED USING parity-bridges-common::runtime-codegen +//! EXECUTED COMMAND: target/debug/runtime-codegen --from-node-url wss://rpc.polkadot.io:443 + +#[allow(dead_code, unused_imports, non_camel_case_types)] +#[allow(clippy::all)] +pub mod api { + use super::api as root_mod; + pub mod runtime_types { + use super::runtime_types; + pub mod bounded_collections { + use super::runtime_types; + pub mod bounded_btree_map { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedBTreeMap<_0, _1>(pub ::subxt::utils::KeyedVec<_0, _1>); + } + pub mod bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + pub mod weak_bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeakBoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + } + pub mod finality_grandpa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Equivocation<_0, _1, _2> { + pub round_number: ::core::primitive::u64, + pub identity: _0, + pub first: (_1, _2), + pub second: (_1, _2), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Precommit<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Prevote<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + } + pub mod frame_support { + use super::runtime_types; + pub mod dispatch { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchClass { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Operational, + #[codec(index = 2)] + Mandatory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchInfo { + pub weight: ::sp_weights::Weight, + pub class: runtime_types::frame_support::dispatch::DispatchClass, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Pays { + #[codec(index = 0)] + Yes, + #[codec(index = 1)] + No, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PerDispatchClass<_0> { + pub normal: _0, + pub operational: _0, + pub mandatory: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PostDispatchInfo { + pub actual_weight: ::core::option::Option<::sp_weights::Weight>, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RawOrigin<_0> { + #[codec(index = 0)] + Root, + #[codec(index = 1)] + Signed(_0), + #[codec(index = 2)] + None, + } + } + pub mod traits { + use super::runtime_types; + pub mod messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProcessMessageError { + #[codec(index = 0)] + BadFormat, + #[codec(index = 1)] + Corrupt, + #[codec(index = 2)] + Unsupported, + #[codec(index = 3)] + Overweight(::sp_weights::Weight), + #[codec(index = 4)] + Yield, + } + } + pub mod misc { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WrapperOpaque<_0>( + #[codec(compact)] pub ::core::primitive::u32, + pub _0, + ); + } + pub mod preimages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Bounded<_0> { + #[codec(index = 0)] + Legacy { + hash: ::subxt::utils::H256, + }, + #[codec(index = 1)] + Inline( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Lookup { + hash: ::subxt::utils::H256, + len: ::core::primitive::u32, + }, + __Ignore(::core::marker::PhantomData<_0>), + } + } + pub mod schedule { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchTime<_0> { + #[codec(index = 0)] + At(_0), + #[codec(index = 1)] + After(_0), + } + } + pub mod tokens { + use super::runtime_types; + pub mod misc { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum BalanceStatus { + #[codec(index = 0)] + Free, + #[codec(index = 1)] + Reserved, + } + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletId(pub [::core::primitive::u8; 8usize]); + } + pub mod frame_system { + use super::runtime_types; + pub mod extensions { + use super::runtime_types; + pub mod check_genesis { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckGenesis; + } + pub mod check_mortality { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckMortality(pub ::sp_runtime::generic::Era); + } + pub mod check_non_zero_sender { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonZeroSender; + } + pub mod check_nonce { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonce(#[codec(compact)] pub ::core::primitive::u32); + } + pub mod check_spec_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckSpecVersion; + } + pub mod check_tx_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckTxVersion; + } + pub mod check_weight { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckWeight; + } + } + pub mod limits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockLength { + pub max: runtime_types::frame_support::dispatch::PerDispatchClass< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockWeights { + pub base_block: ::sp_weights::Weight, + pub max_block: ::sp_weights::Weight, + pub per_class: runtime_types::frame_support::dispatch::PerDispatchClass< + runtime_types::frame_system::limits::WeightsPerClass, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeightsPerClass { + pub base_extrinsic: ::sp_weights::Weight, + pub max_extrinsic: ::core::option::Option<::sp_weights::Weight>, + pub max_total: ::core::option::Option<::sp_weights::Weight>, + pub reserved: ::core::option::Option<::sp_weights::Weight>, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + remark { remark: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + set_heap_pages { pages: ::core::primitive::u64 }, + #[codec(index = 2)] + set_code { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 3)] + set_code_without_checks { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + set_storage { + items: ::std::vec::Vec<( + ::std::vec::Vec<::core::primitive::u8>, + ::std::vec::Vec<::core::primitive::u8>, + )>, + }, + #[codec(index = 5)] + kill_storage { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>> }, + #[codec(index = 6)] + kill_prefix { + prefix: ::std::vec::Vec<::core::primitive::u8>, + subkeys: ::core::primitive::u32, + }, + #[codec(index = 7)] + remark_with_event { remark: ::std::vec::Vec<::core::primitive::u8> }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidSpecName, + #[codec(index = 1)] + SpecVersionNeedsToIncrease, + #[codec(index = 2)] + FailedToExtractRuntimeVersion, + #[codec(index = 3)] + NonDefaultComposite, + #[codec(index = 4)] + NonZeroRefCount, + #[codec(index = 5)] + CallFiltered, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ExtrinsicSuccess { + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 1)] + ExtrinsicFailed { + dispatch_error: runtime_types::sp_runtime::DispatchError, + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 2)] + CodeUpdated, + #[codec(index = 3)] + NewAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + KilledAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Remarked { sender: ::sp_core::crypto::AccountId32, hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountInfo<_0, _1> { + pub nonce: _0, + pub consumers: _0, + pub providers: _0, + pub sufficients: _0, + pub data: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EventRecord<_0, _1> { + pub phase: runtime_types::frame_system::Phase, + pub event: _0, + pub topics: ::std::vec::Vec<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LastRuntimeUpgradeInfo { + #[codec(compact)] + pub spec_version: ::core::primitive::u32, + pub spec_name: ::std::string::String, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase { + #[codec(index = 0)] + ApplyExtrinsic(::core::primitive::u32), + #[codec(index = 1)] + Finalization, + #[codec(index = 2)] + Initialization, + } + } + pub mod pallet_babe { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + plan_config_change { + config: runtime_types::sp_consensus_babe::digests::NextConfigDescriptor, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEquivocationProof, + #[codec(index = 1)] + InvalidKeyOwnershipProof, + #[codec(index = 2)] + DuplicateOffenceReport, + #[codec(index = 3)] + InvalidConfiguration, + } + } + } + pub mod pallet_bags_list { + use super::runtime_types; + pub mod list { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bag { + pub head: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub tail: ::core::option::Option<::sp_core::crypto::AccountId32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ListError { + #[codec(index = 0)] + Duplicate, + #[codec(index = 1)] + NotHeavier, + #[codec(index = 2)] + NotInSameBag, + #[codec(index = 3)] + NodeNotFound, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Node { + pub id: ::sp_core::crypto::AccountId32, + pub prev: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub next: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub bag_upper: ::core::primitive::u64, + pub score: ::core::primitive::u64, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + rebag { + dislocated: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + put_in_front_of { + lighter: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + List(runtime_types::pallet_bags_list::list::ListError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Rebagged { + who: ::sp_core::crypto::AccountId32, + from: ::core::primitive::u64, + to: ::core::primitive::u64, + }, + #[codec(index = 1)] + ScoreUpdated { + who: ::sp_core::crypto::AccountId32, + new_score: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_balances { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + transfer_allow_death { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + set_balance_deprecated { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + #[codec(compact)] + old_reserved: ::core::primitive::u128, + }, + #[codec(index = 2)] + force_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + transfer_keep_alive { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + transfer_all { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + keep_alive: ::core::primitive::bool, + }, + #[codec(index = 5)] + force_unreserve { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + upgrade_accounts { who: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 7)] + transfer { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 8)] + force_set_balance { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + VestingBalance, + #[codec(index = 1)] + LiquidityRestrictions, + #[codec(index = 2)] + InsufficientBalance, + #[codec(index = 3)] + ExistentialDeposit, + #[codec(index = 4)] + Expendability, + #[codec(index = 5)] + ExistingVestingSchedule, + #[codec(index = 6)] + DeadAccount, + #[codec(index = 7)] + TooManyReserves, + #[codec(index = 8)] + TooManyHolds, + #[codec(index = 9)] + TooManyFreezes, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Endowed { + account: ::sp_core::crypto::AccountId32, + free_balance: ::core::primitive::u128, + }, + #[codec(index = 1)] + DustLost { + account: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Transfer { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + BalanceSet { + who: ::sp_core::crypto::AccountId32, + free: ::core::primitive::u128, + }, + #[codec(index = 4)] + Reserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + Unreserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + ReserveRepatriated { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + destination_status: + runtime_types::frame_support::traits::tokens::misc::BalanceStatus, + }, + #[codec(index = 7)] + Deposit { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 8)] + Withdraw { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Slashed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 10)] + Minted { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 11)] + Burned { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 12)] + Suspended { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 13)] + Restored { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 14)] + Upgraded { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 15)] + Issued { amount: ::core::primitive::u128 }, + #[codec(index = 16)] + Rescinded { amount: ::core::primitive::u128 }, + #[codec(index = 17)] + Locked { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 18)] + Unlocked { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 19)] + Frozen { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 20)] + Thawed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountData<_0> { + pub free: _0, + pub reserved: _0, + pub frozen: _0, + pub flags: runtime_types::pallet_balances::types::ExtraFlags, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BalanceLock<_0> { + pub id: [::core::primitive::u8; 8usize], + pub amount: _0, + pub reasons: runtime_types::pallet_balances::types::Reasons, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ExtraFlags(pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdAmount<_0, _1> { + pub id: _0, + pub amount: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Reasons { + #[codec(index = 0)] + Fee, + #[codec(index = 1)] + Misc, + #[codec(index = 2)] + All, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReserveData<_0, _1> { + pub id: _0, + pub amount: _1, + } + } + } + pub mod pallet_bounties { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose_bounty { + #[codec(compact)] + value: ::core::primitive::u128, + description: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + approve_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 2)] + propose_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + curator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 3)] + unassign_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 4)] + accept_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 5)] + award_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + claim_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 7)] + close_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 8)] + extend_bounty_expiry { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + remark: ::std::vec::Vec<::core::primitive::u8>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InsufficientProposersBalance, + #[codec(index = 1)] + InvalidIndex, + #[codec(index = 2)] + ReasonTooBig, + #[codec(index = 3)] + UnexpectedStatus, + #[codec(index = 4)] + RequireCurator, + #[codec(index = 5)] + InvalidValue, + #[codec(index = 6)] + InvalidFee, + #[codec(index = 7)] + PendingPayout, + #[codec(index = 8)] + Premature, + #[codec(index = 9)] + HasActiveChildBounty, + #[codec(index = 10)] + TooManyQueued, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BountyProposed { index: ::core::primitive::u32 }, + #[codec(index = 1)] + BountyRejected { index: ::core::primitive::u32, bond: ::core::primitive::u128 }, + #[codec(index = 2)] + BountyBecameActive { index: ::core::primitive::u32 }, + #[codec(index = 3)] + BountyAwarded { + index: ::core::primitive::u32, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 4)] + BountyClaimed { + index: ::core::primitive::u32, + payout: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 5)] + BountyCanceled { index: ::core::primitive::u32 }, + #[codec(index = 6)] + BountyExtended { index: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bounty<_0, _1, _2> { + pub proposer: _0, + pub value: _1, + pub fee: _1, + pub curator_deposit: _1, + pub bond: _1, + pub status: runtime_types::pallet_bounties::BountyStatus<_0, _2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BountyStatus<_0, _1> { + #[codec(index = 0)] + Proposed, + #[codec(index = 1)] + Approved, + #[codec(index = 2)] + Funded, + #[codec(index = 3)] + CuratorProposed { curator: _0 }, + #[codec(index = 4)] + Active { curator: _0, update_due: _1 }, + #[codec(index = 5)] + PendingPayout { curator: _0, beneficiary: _0, unlock_at: _1 }, + } + } + pub mod pallet_child_bounties { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + value: ::core::primitive::u128, + description: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + propose_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + curator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 2)] + accept_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 3)] + unassign_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 4)] + award_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + claim_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 6)] + close_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParentBountyNotActive, + #[codec(index = 1)] + InsufficientBountyBalance, + #[codec(index = 2)] + TooManyChildBounties, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Added { index: ::core::primitive::u32, child_index: ::core::primitive::u32 }, + #[codec(index = 1)] + Awarded { + index: ::core::primitive::u32, + child_index: ::core::primitive::u32, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 2)] + Claimed { + index: ::core::primitive::u32, + child_index: ::core::primitive::u32, + payout: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Canceled { index: ::core::primitive::u32, child_index: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChildBounty<_0, _1, _2> { + pub parent_bounty: _2, + pub value: _1, + pub fee: _1, + pub curator_deposit: _1, + pub status: runtime_types::pallet_child_bounties::ChildBountyStatus<_0, _2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ChildBountyStatus<_0, _1> { + #[codec(index = 0)] + Added, + #[codec(index = 1)] + CuratorProposed { curator: _0 }, + #[codec(index = 2)] + Active { curator: _0 }, + #[codec(index = 3)] + PendingPayout { curator: _0, beneficiary: _0, unlock_at: _1 }, + } + } + pub mod pallet_collective { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_members { + new_members: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + prime: ::core::option::Option<::sp_core::crypto::AccountId32>, + old_count: ::core::primitive::u32, + }, + #[codec(index = 1)] + execute { + proposal: ::std::boxed::Box, + #[codec(compact)] + length_bound: ::core::primitive::u32, + }, + #[codec(index = 2)] + propose { + #[codec(compact)] + threshold: ::core::primitive::u32, + proposal: ::std::boxed::Box, + #[codec(compact)] + length_bound: ::core::primitive::u32, + }, + #[codec(index = 3)] + vote { + proposal: ::subxt::utils::H256, + #[codec(compact)] + index: ::core::primitive::u32, + approve: ::core::primitive::bool, + }, + #[codec(index = 5)] + disapprove_proposal { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 6)] + close { + proposal_hash: ::subxt::utils::H256, + #[codec(compact)] + index: ::core::primitive::u32, + proposal_weight_bound: ::sp_weights::Weight, + #[codec(compact)] + length_bound: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotMember, + #[codec(index = 1)] + DuplicateProposal, + #[codec(index = 2)] + ProposalMissing, + #[codec(index = 3)] + WrongIndex, + #[codec(index = 4)] + DuplicateVote, + #[codec(index = 5)] + AlreadyInitialized, + #[codec(index = 6)] + TooEarly, + #[codec(index = 7)] + TooManyProposals, + #[codec(index = 8)] + WrongProposalWeight, + #[codec(index = 9)] + WrongProposalLength, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Proposed { + account: ::sp_core::crypto::AccountId32, + proposal_index: ::core::primitive::u32, + proposal_hash: ::subxt::utils::H256, + threshold: ::core::primitive::u32, + }, + #[codec(index = 1)] + Voted { + account: ::sp_core::crypto::AccountId32, + proposal_hash: ::subxt::utils::H256, + voted: ::core::primitive::bool, + yes: ::core::primitive::u32, + no: ::core::primitive::u32, + }, + #[codec(index = 2)] + Approved { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 3)] + Disapproved { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 4)] + Executed { + proposal_hash: ::subxt::utils::H256, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 5)] + MemberExecuted { + proposal_hash: ::subxt::utils::H256, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 6)] + Closed { + proposal_hash: ::subxt::utils::H256, + yes: ::core::primitive::u32, + no: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RawOrigin<_0> { + #[codec(index = 0)] + Members(::core::primitive::u32, ::core::primitive::u32), + #[codec(index = 1)] + Member(_0), + #[codec(index = 2)] + _Phantom, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Votes<_0, _1> { + pub index: _1, + pub threshold: _1, + pub ayes: ::std::vec::Vec<_0>, + pub nays: ::std::vec::Vec<_0>, + pub end: _1, + } + } + pub mod pallet_conviction_voting { + use super::runtime_types; + pub mod conviction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Conviction { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Locked1x, + #[codec(index = 2)] + Locked2x, + #[codec(index = 3)] + Locked3x, + #[codec(index = 4)] + Locked4x, + #[codec(index = 5)] + Locked5x, + #[codec(index = 6)] + Locked6x, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vote { + #[codec(compact)] + poll_index: ::core::primitive::u32, + vote: runtime_types::pallet_conviction_voting::vote::AccountVote< + ::core::primitive::u128, + >, + }, + #[codec(index = 1)] + delegate { + class: ::core::primitive::u16, + to: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + conviction: runtime_types::pallet_conviction_voting::conviction::Conviction, + balance: ::core::primitive::u128, + }, + #[codec(index = 2)] + undelegate { class: ::core::primitive::u16 }, + #[codec(index = 3)] + unlock { + class: ::core::primitive::u16, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + remove_vote { + class: ::core::option::Option<::core::primitive::u16>, + index: ::core::primitive::u32, + }, + #[codec(index = 5)] + remove_other_vote { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + class: ::core::primitive::u16, + index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotOngoing, + #[codec(index = 1)] + NotVoter, + #[codec(index = 2)] + NoPermission, + #[codec(index = 3)] + NoPermissionYet, + #[codec(index = 4)] + AlreadyDelegating, + #[codec(index = 5)] + AlreadyVoting, + #[codec(index = 6)] + InsufficientFunds, + #[codec(index = 7)] + NotDelegating, + #[codec(index = 8)] + Nonsense, + #[codec(index = 9)] + MaxVotesReached, + #[codec(index = 10)] + ClassNeeded, + #[codec(index = 11)] + BadClass, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Delegated(::sp_core::crypto::AccountId32, ::sp_core::crypto::AccountId32), + #[codec(index = 1)] + Undelegated(::sp_core::crypto::AccountId32), + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Delegations<_0> { + pub votes: _0, + pub capital: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Tally<_0> { + pub ayes: _0, + pub nays: _0, + pub support: _0, + } + } + pub mod vote { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AccountVote<_0> { + #[codec(index = 0)] + Standard { + vote: runtime_types::pallet_conviction_voting::vote::Vote, + balance: _0, + }, + #[codec(index = 1)] + Split { aye: _0, nay: _0 }, + #[codec(index = 2)] + SplitAbstain { aye: _0, nay: _0, abstain: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Casting<_0, _1, _2> { + pub votes: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _1, + runtime_types::pallet_conviction_voting::vote::AccountVote<_0>, + )>, + pub delegations: + runtime_types::pallet_conviction_voting::types::Delegations<_0>, + pub prior: runtime_types::pallet_conviction_voting::vote::PriorLock<_1, _0>, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Delegating<_0, _1, _2> { + pub balance: _0, + pub target: _1, + pub conviction: runtime_types::pallet_conviction_voting::conviction::Conviction, + pub delegations: + runtime_types::pallet_conviction_voting::types::Delegations<_0>, + pub prior: runtime_types::pallet_conviction_voting::vote::PriorLock<_2, _0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PriorLock<_0, _1>(pub _0, pub _1); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Vote(pub ::core::primitive::u8); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Voting<_0, _1, _2, _3> { + #[codec(index = 0)] + Casting(runtime_types::pallet_conviction_voting::vote::Casting<_0, _2, _2>), + #[codec(index = 1)] + Delegating( + runtime_types::pallet_conviction_voting::vote::Delegating<_0, _1, _2>, + ), + __Ignore(::core::marker::PhantomData<_3>), + } + } + } + pub mod pallet_democracy { + use super::runtime_types; + pub mod conviction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Conviction { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Locked1x, + #[codec(index = 2)] + Locked2x, + #[codec(index = 3)] + Locked3x, + #[codec(index = 4)] + Locked4x, + #[codec(index = 5)] + Locked5x, + #[codec(index = 6)] + Locked6x, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::polkadot_runtime::RuntimeCall, + >, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + second { + #[codec(compact)] + proposal: ::core::primitive::u32, + }, + #[codec(index = 2)] + vote { + #[codec(compact)] + ref_index: ::core::primitive::u32, + vote: runtime_types::pallet_democracy::vote::AccountVote< + ::core::primitive::u128, + >, + }, + #[codec(index = 3)] + emergency_cancel { ref_index: ::core::primitive::u32 }, + #[codec(index = 4)] + external_propose { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::polkadot_runtime::RuntimeCall, + >, + }, + #[codec(index = 5)] + external_propose_majority { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::polkadot_runtime::RuntimeCall, + >, + }, + #[codec(index = 6)] + external_propose_default { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::polkadot_runtime::RuntimeCall, + >, + }, + #[codec(index = 7)] + fast_track { + proposal_hash: ::subxt::utils::H256, + voting_period: ::core::primitive::u32, + delay: ::core::primitive::u32, + }, + #[codec(index = 8)] + veto_external { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 9)] + cancel_referendum { + #[codec(compact)] + ref_index: ::core::primitive::u32, + }, + #[codec(index = 10)] + delegate { + to: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + conviction: runtime_types::pallet_democracy::conviction::Conviction, + balance: ::core::primitive::u128, + }, + #[codec(index = 11)] + undelegate, + #[codec(index = 12)] + clear_public_proposals, + #[codec(index = 13)] + unlock { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 14)] + remove_vote { index: ::core::primitive::u32 }, + #[codec(index = 15)] + remove_other_vote { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + }, + #[codec(index = 16)] + blacklist { + proposal_hash: ::subxt::utils::H256, + maybe_ref_index: ::core::option::Option<::core::primitive::u32>, + }, + #[codec(index = 17)] + cancel_proposal { + #[codec(compact)] + prop_index: ::core::primitive::u32, + }, + #[codec(index = 18)] + set_metadata { + owner: runtime_types::pallet_democracy::types::MetadataOwner, + maybe_hash: ::core::option::Option<::subxt::utils::H256>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ValueLow, + #[codec(index = 1)] + ProposalMissing, + #[codec(index = 2)] + AlreadyCanceled, + #[codec(index = 3)] + DuplicateProposal, + #[codec(index = 4)] + ProposalBlacklisted, + #[codec(index = 5)] + NotSimpleMajority, + #[codec(index = 6)] + InvalidHash, + #[codec(index = 7)] + NoProposal, + #[codec(index = 8)] + AlreadyVetoed, + #[codec(index = 9)] + ReferendumInvalid, + #[codec(index = 10)] + NoneWaiting, + #[codec(index = 11)] + NotVoter, + #[codec(index = 12)] + NoPermission, + #[codec(index = 13)] + AlreadyDelegating, + #[codec(index = 14)] + InsufficientFunds, + #[codec(index = 15)] + NotDelegating, + #[codec(index = 16)] + VotesExist, + #[codec(index = 17)] + InstantNotAllowed, + #[codec(index = 18)] + Nonsense, + #[codec(index = 19)] + WrongUpperBound, + #[codec(index = 20)] + MaxVotesReached, + #[codec(index = 21)] + TooMany, + #[codec(index = 22)] + VotingPeriodLow, + #[codec(index = 23)] + PreimageNotExist, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Proposed { + proposal_index: ::core::primitive::u32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 1)] + Tabled { + proposal_index: ::core::primitive::u32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 2)] + ExternalTabled, + #[codec(index = 3)] + Started { + ref_index: ::core::primitive::u32, + threshold: runtime_types::pallet_democracy::vote_threshold::VoteThreshold, + }, + #[codec(index = 4)] + Passed { ref_index: ::core::primitive::u32 }, + #[codec(index = 5)] + NotPassed { ref_index: ::core::primitive::u32 }, + #[codec(index = 6)] + Cancelled { ref_index: ::core::primitive::u32 }, + #[codec(index = 7)] + Delegated { + who: ::sp_core::crypto::AccountId32, + target: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + Undelegated { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 9)] + Vetoed { + who: ::sp_core::crypto::AccountId32, + proposal_hash: ::subxt::utils::H256, + until: ::core::primitive::u32, + }, + #[codec(index = 10)] + Blacklisted { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 11)] + Voted { + voter: ::sp_core::crypto::AccountId32, + ref_index: ::core::primitive::u32, + vote: runtime_types::pallet_democracy::vote::AccountVote< + ::core::primitive::u128, + >, + }, + #[codec(index = 12)] + Seconded { + seconder: ::sp_core::crypto::AccountId32, + prop_index: ::core::primitive::u32, + }, + #[codec(index = 13)] + ProposalCanceled { prop_index: ::core::primitive::u32 }, + #[codec(index = 14)] + MetadataSet { + owner: runtime_types::pallet_democracy::types::MetadataOwner, + hash: ::subxt::utils::H256, + }, + #[codec(index = 15)] + MetadataCleared { + owner: runtime_types::pallet_democracy::types::MetadataOwner, + hash: ::subxt::utils::H256, + }, + #[codec(index = 16)] + MetadataTransferred { + prev_owner: runtime_types::pallet_democracy::types::MetadataOwner, + owner: runtime_types::pallet_democracy::types::MetadataOwner, + hash: ::subxt::utils::H256, + }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Delegations<_0> { + pub votes: _0, + pub capital: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MetadataOwner { + #[codec(index = 0)] + External, + #[codec(index = 1)] + Proposal(::core::primitive::u32), + #[codec(index = 2)] + Referendum(::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReferendumInfo<_0, _1, _2> { + #[codec(index = 0)] + Ongoing(runtime_types::pallet_democracy::types::ReferendumStatus<_0, _1, _2>), + #[codec(index = 1)] + Finished { approved: ::core::primitive::bool, end: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReferendumStatus<_0, _1, _2> { + pub end: _0, + pub proposal: _1, + pub threshold: runtime_types::pallet_democracy::vote_threshold::VoteThreshold, + pub delay: _0, + pub tally: runtime_types::pallet_democracy::types::Tally<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Tally<_0> { + pub ayes: _0, + pub nays: _0, + pub turnout: _0, + } + } + pub mod vote { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AccountVote<_0> { + #[codec(index = 0)] + Standard { vote: runtime_types::pallet_democracy::vote::Vote, balance: _0 }, + #[codec(index = 1)] + Split { aye: _0, nay: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PriorLock<_0, _1>(pub _0, pub _1); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Vote(pub ::core::primitive::u8); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Voting<_0, _1, _2> { + #[codec(index = 0)] + Direct { + votes: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _2, + runtime_types::pallet_democracy::vote::AccountVote<_0>, + )>, + delegations: runtime_types::pallet_democracy::types::Delegations<_0>, + prior: runtime_types::pallet_democracy::vote::PriorLock<_2, _0>, + }, + #[codec(index = 1)] + Delegating { + balance: _0, + target: _1, + conviction: runtime_types::pallet_democracy::conviction::Conviction, + delegations: runtime_types::pallet_democracy::types::Delegations<_0>, + prior: runtime_types::pallet_democracy::vote::PriorLock<_2, _0>, + }, + } + } + pub mod vote_threshold { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VoteThreshold { + #[codec(index = 0)] + SuperMajorityApprove, + #[codec(index = 1)] + SuperMajorityAgainst, + #[codec(index = 2)] + SimpleMajority, + } + } + } + pub mod pallet_election_provider_multi_phase { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] submit_unsigned { raw_solution : :: std :: boxed :: Box < runtime_types :: pallet_election_provider_multi_phase :: RawSolution < runtime_types :: polkadot_runtime :: NposCompactSolution16 > > , witness : runtime_types :: pallet_election_provider_multi_phase :: SolutionOrSnapshotSize , } , # [codec (index = 1)] set_minimum_untrusted_score { maybe_next_score : :: core :: option :: Option < runtime_types :: sp_npos_elections :: ElectionScore > , } , # [codec (index = 2)] set_emergency_election_result { supports : :: std :: vec :: Vec < (:: sp_core :: crypto :: AccountId32 , runtime_types :: sp_npos_elections :: Support < :: sp_core :: crypto :: AccountId32 > ,) > , } , # [codec (index = 3)] submit { raw_solution : :: std :: boxed :: Box < runtime_types :: pallet_election_provider_multi_phase :: RawSolution < runtime_types :: polkadot_runtime :: NposCompactSolution16 > > , } , # [codec (index = 4)] governance_fallback { maybe_max_voters : :: core :: option :: Option < :: core :: primitive :: u32 > , maybe_max_targets : :: core :: option :: Option < :: core :: primitive :: u32 > , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PreDispatchEarlySubmission, + #[codec(index = 1)] + PreDispatchWrongWinnerCount, + #[codec(index = 2)] + PreDispatchWeakSubmission, + #[codec(index = 3)] + SignedQueueFull, + #[codec(index = 4)] + SignedCannotPayDeposit, + #[codec(index = 5)] + SignedInvalidWitness, + #[codec(index = 6)] + SignedTooMuchWeight, + #[codec(index = 7)] + OcwCallWrongEra, + #[codec(index = 8)] + MissingSnapshotMetadata, + #[codec(index = 9)] + InvalidSubmissionIndex, + #[codec(index = 10)] + CallNotAllowed, + #[codec(index = 11)] + FallbackFailed, + #[codec(index = 12)] + BoundNotMet, + #[codec(index = 13)] + TooManyWinners, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + SolutionStored { + compute: + runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + origin: ::core::option::Option<::sp_core::crypto::AccountId32>, + prev_ejected: ::core::primitive::bool, + }, + #[codec(index = 1)] + ElectionFinalized { + compute: + runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + score: runtime_types::sp_npos_elections::ElectionScore, + }, + #[codec(index = 2)] + ElectionFailed, + #[codec(index = 3)] + Rewarded { + account: ::sp_core::crypto::AccountId32, + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + Slashed { + account: ::sp_core::crypto::AccountId32, + value: ::core::primitive::u128, + }, + #[codec(index = 5)] + PhaseTransitioned { + from: runtime_types::pallet_election_provider_multi_phase::Phase< + ::core::primitive::u32, + >, + to: runtime_types::pallet_election_provider_multi_phase::Phase< + ::core::primitive::u32, + >, + round: ::core::primitive::u32, + }, + } + } + pub mod signed { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SignedSubmission<_0, _1, _2> { + pub who: _0, + pub deposit: _1, + pub raw_solution: + runtime_types::pallet_election_provider_multi_phase::RawSolution<_2>, + pub call_fee: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ElectionCompute { + #[codec(index = 0)] + OnChain, + #[codec(index = 1)] + Signed, + #[codec(index = 2)] + Unsigned, + #[codec(index = 3)] + Fallback, + #[codec(index = 4)] + Emergency, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase<_0> { + #[codec(index = 0)] + Off, + #[codec(index = 1)] + Signed, + #[codec(index = 2)] + Unsigned((::core::primitive::bool, _0)), + #[codec(index = 3)] + Emergency, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RawSolution<_0> { + pub solution: _0, + pub score: runtime_types::sp_npos_elections::ElectionScore, + pub round: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReadySolution { + pub supports: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::sp_core::crypto::AccountId32, + runtime_types::sp_npos_elections::Support<::sp_core::crypto::AccountId32>, + )>, + pub score: runtime_types::sp_npos_elections::ElectionScore, + pub compute: runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RoundSnapshot<_0, _1> { + pub voters: ::std::vec::Vec<_1>, + pub targets: ::std::vec::Vec<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SolutionOrSnapshotSize { + #[codec(compact)] + pub voters: ::core::primitive::u32, + #[codec(compact)] + pub targets: ::core::primitive::u32, + } + } + pub mod pallet_elections_phragmen { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vote { + votes: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + remove_voter, + #[codec(index = 2)] + submit_candidacy { + #[codec(compact)] + candidate_count: ::core::primitive::u32, + }, + #[codec(index = 3)] + renounce_candidacy { + renouncing: runtime_types::pallet_elections_phragmen::Renouncing, + }, + #[codec(index = 4)] + remove_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + slash_bond: ::core::primitive::bool, + rerun_election: ::core::primitive::bool, + }, + #[codec(index = 5)] + clean_defunct_voters { + num_voters: ::core::primitive::u32, + num_defunct: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnableToVote, + #[codec(index = 1)] + NoVotes, + #[codec(index = 2)] + TooManyVotes, + #[codec(index = 3)] + MaximumVotesExceeded, + #[codec(index = 4)] + LowBalance, + #[codec(index = 5)] + UnableToPayBond, + #[codec(index = 6)] + MustBeVoter, + #[codec(index = 7)] + DuplicatedCandidate, + #[codec(index = 8)] + TooManyCandidates, + #[codec(index = 9)] + MemberSubmit, + #[codec(index = 10)] + RunnerUpSubmit, + #[codec(index = 11)] + InsufficientCandidateFunds, + #[codec(index = 12)] + NotMember, + #[codec(index = 13)] + InvalidWitnessData, + #[codec(index = 14)] + InvalidVoteCount, + #[codec(index = 15)] + InvalidRenouncing, + #[codec(index = 16)] + InvalidReplacement, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewTerm { + new_members: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + )>, + }, + #[codec(index = 1)] + EmptyTerm, + #[codec(index = 2)] + ElectionError, + #[codec(index = 3)] + MemberKicked { member: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + Renounced { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + CandidateSlashed { + candidate: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + SeatHolderSlashed { + seat_holder: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Renouncing { + #[codec(index = 0)] + Member, + #[codec(index = 1)] + RunnerUp, + #[codec(index = 2)] + Candidate(#[codec(compact)] ::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SeatHolder<_0, _1> { + pub who: _0, + pub stake: _1, + pub deposit: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Voter<_0, _1> { + pub votes: ::std::vec::Vec<_0>, + pub stake: _1, + pub deposit: _1, + } + } + pub mod pallet_fast_unstake { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register_fast_unstake, + #[codec(index = 1)] + deregister, + #[codec(index = 2)] + control { eras_to_check: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotController, + #[codec(index = 1)] + AlreadyQueued, + #[codec(index = 2)] + NotFullyBonded, + #[codec(index = 3)] + NotQueued, + #[codec(index = 4)] + AlreadyHead, + #[codec(index = 5)] + CallNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Unstaked { + stash: ::sp_core::crypto::AccountId32, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + Slashed { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + InternalError, + #[codec(index = 3)] + BatchChecked { eras: ::std::vec::Vec<::core::primitive::u32> }, + #[codec(index = 4)] + BatchFinished { size: ::core::primitive::u32 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnstakeRequest { + pub stashes: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + )>, + pub checked: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u32, + >, + } + } + } + pub mod pallet_grandpa { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + note_stalled { + delay: ::core::primitive::u32, + best_finalized_block_number: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PauseFailed, + #[codec(index = 1)] + ResumeFailed, + #[codec(index = 2)] + ChangePending, + #[codec(index = 3)] + TooSoon, + #[codec(index = 4)] + InvalidKeyOwnershipProof, + #[codec(index = 5)] + InvalidEquivocationProof, + #[codec(index = 6)] + DuplicateOffenceReport, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewAuthorities { + authority_set: ::std::vec::Vec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + }, + #[codec(index = 1)] + Paused, + #[codec(index = 2)] + Resumed, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredPendingChange<_0> { + pub scheduled_at: _0, + pub delay: _0, + pub next_authorities: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub forced: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StoredState<_0> { + #[codec(index = 0)] + Live, + #[codec(index = 1)] + PendingPause { scheduled_at: _0, delay: _0 }, + #[codec(index = 2)] + Paused, + #[codec(index = 3)] + PendingResume { scheduled_at: _0, delay: _0 }, + } + } + pub mod pallet_identity { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_registrar { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + set_identity { + info: + ::std::boxed::Box, + }, + #[codec(index = 2)] + set_subs { + subs: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + runtime_types::pallet_identity::types::Data, + )>, + }, + #[codec(index = 3)] + clear_identity, + #[codec(index = 4)] + request_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + #[codec(compact)] + max_fee: ::core::primitive::u128, + }, + #[codec(index = 5)] + cancel_request { reg_index: ::core::primitive::u32 }, + #[codec(index = 6)] + set_fee { + #[codec(compact)] + index: ::core::primitive::u32, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 7)] + set_account_id { + #[codec(compact)] + index: ::core::primitive::u32, + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 8)] + set_fields { + #[codec(compact)] + index: ::core::primitive::u32, + fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + }, + #[codec(index = 9)] + provide_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + judgement: runtime_types::pallet_identity::types::Judgement< + ::core::primitive::u128, + >, + identity: ::subxt::utils::H256, + }, + #[codec(index = 10)] + kill_identity { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 11)] + add_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 12)] + rename_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 13)] + remove_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 14)] + quit_sub, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManySubAccounts, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotNamed, + #[codec(index = 3)] + EmptyIndex, + #[codec(index = 4)] + FeeChanged, + #[codec(index = 5)] + NoIdentity, + #[codec(index = 6)] + StickyJudgement, + #[codec(index = 7)] + JudgementGiven, + #[codec(index = 8)] + InvalidJudgement, + #[codec(index = 9)] + InvalidIndex, + #[codec(index = 10)] + InvalidTarget, + #[codec(index = 11)] + TooManyFields, + #[codec(index = 12)] + TooManyRegistrars, + #[codec(index = 13)] + AlreadyClaimed, + #[codec(index = 14)] + NotSub, + #[codec(index = 15)] + NotOwned, + #[codec(index = 16)] + JudgementForDifferentIdentity, + #[codec(index = 17)] + JudgementPaymentFailed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IdentitySet { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + IdentityCleared { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 2)] + IdentityKilled { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 3)] + JudgementRequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 4)] + JudgementUnrequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 5)] + JudgementGiven { + target: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + RegistrarAdded { registrar_index: ::core::primitive::u32 }, + #[codec(index = 7)] + SubIdentityAdded { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 8)] + SubIdentityRemoved { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 9)] + SubIdentityRevoked { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + } + } + pub mod types { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct BitFlags<_0>( + pub ::core::primitive::u64, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Data { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Raw0([::core::primitive::u8; 0usize]), + #[codec(index = 2)] + Raw1([::core::primitive::u8; 1usize]), + #[codec(index = 3)] + Raw2([::core::primitive::u8; 2usize]), + #[codec(index = 4)] + Raw3([::core::primitive::u8; 3usize]), + #[codec(index = 5)] + Raw4([::core::primitive::u8; 4usize]), + #[codec(index = 6)] + Raw5([::core::primitive::u8; 5usize]), + #[codec(index = 7)] + Raw6([::core::primitive::u8; 6usize]), + #[codec(index = 8)] + Raw7([::core::primitive::u8; 7usize]), + #[codec(index = 9)] + Raw8([::core::primitive::u8; 8usize]), + #[codec(index = 10)] + Raw9([::core::primitive::u8; 9usize]), + #[codec(index = 11)] + Raw10([::core::primitive::u8; 10usize]), + #[codec(index = 12)] + Raw11([::core::primitive::u8; 11usize]), + #[codec(index = 13)] + Raw12([::core::primitive::u8; 12usize]), + #[codec(index = 14)] + Raw13([::core::primitive::u8; 13usize]), + #[codec(index = 15)] + Raw14([::core::primitive::u8; 14usize]), + #[codec(index = 16)] + Raw15([::core::primitive::u8; 15usize]), + #[codec(index = 17)] + Raw16([::core::primitive::u8; 16usize]), + #[codec(index = 18)] + Raw17([::core::primitive::u8; 17usize]), + #[codec(index = 19)] + Raw18([::core::primitive::u8; 18usize]), + #[codec(index = 20)] + Raw19([::core::primitive::u8; 19usize]), + #[codec(index = 21)] + Raw20([::core::primitive::u8; 20usize]), + #[codec(index = 22)] + Raw21([::core::primitive::u8; 21usize]), + #[codec(index = 23)] + Raw22([::core::primitive::u8; 22usize]), + #[codec(index = 24)] + Raw23([::core::primitive::u8; 23usize]), + #[codec(index = 25)] + Raw24([::core::primitive::u8; 24usize]), + #[codec(index = 26)] + Raw25([::core::primitive::u8; 25usize]), + #[codec(index = 27)] + Raw26([::core::primitive::u8; 26usize]), + #[codec(index = 28)] + Raw27([::core::primitive::u8; 27usize]), + #[codec(index = 29)] + Raw28([::core::primitive::u8; 28usize]), + #[codec(index = 30)] + Raw29([::core::primitive::u8; 29usize]), + #[codec(index = 31)] + Raw30([::core::primitive::u8; 30usize]), + #[codec(index = 32)] + Raw31([::core::primitive::u8; 31usize]), + #[codec(index = 33)] + Raw32([::core::primitive::u8; 32usize]), + #[codec(index = 34)] + BlakeTwo256([::core::primitive::u8; 32usize]), + #[codec(index = 35)] + Sha256([::core::primitive::u8; 32usize]), + #[codec(index = 36)] + Keccak256([::core::primitive::u8; 32usize]), + #[codec(index = 37)] + ShaThree256([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum IdentityField { + #[codec(index = 1)] + Display, + #[codec(index = 2)] + Legal, + #[codec(index = 4)] + Web, + #[codec(index = 8)] + Riot, + #[codec(index = 16)] + Email, + #[codec(index = 32)] + PgpFingerprint, + #[codec(index = 64)] + Image, + #[codec(index = 128)] + Twitter, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdentityInfo { + pub additional: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + runtime_types::pallet_identity::types::Data, + runtime_types::pallet_identity::types::Data, + )>, + pub display: runtime_types::pallet_identity::types::Data, + pub legal: runtime_types::pallet_identity::types::Data, + pub web: runtime_types::pallet_identity::types::Data, + pub riot: runtime_types::pallet_identity::types::Data, + pub email: runtime_types::pallet_identity::types::Data, + pub pgp_fingerprint: ::core::option::Option<[::core::primitive::u8; 20usize]>, + pub image: runtime_types::pallet_identity::types::Data, + pub twitter: runtime_types::pallet_identity::types::Data, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Judgement<_0> { + #[codec(index = 0)] + Unknown, + #[codec(index = 1)] + FeePaid(_0), + #[codec(index = 2)] + Reasonable, + #[codec(index = 3)] + KnownGood, + #[codec(index = 4)] + OutOfDate, + #[codec(index = 5)] + LowQuality, + #[codec(index = 6)] + Erroneous, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RegistrarInfo<_0, _1> { + pub account: _1, + pub fee: _0, + pub fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Registration<_0> { + pub judgements: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::core::primitive::u32, + runtime_types::pallet_identity::types::Judgement<_0>, + )>, + pub deposit: _0, + pub info: runtime_types::pallet_identity::types::IdentityInfo, + } + } + } + pub mod pallet_im_online { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + heartbeat { + heartbeat: + runtime_types::pallet_im_online::Heartbeat<::core::primitive::u32>, + signature: runtime_types::pallet_im_online::sr25519::app_sr25519::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidKey, + #[codec(index = 1)] + DuplicatedHeartbeat, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + HeartbeatReceived { + authority_id: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + }, + #[codec(index = 1)] + AllGood, + #[codec(index = 2)] + SomeOffline { + offline: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + runtime_types::pallet_staking::Exposure< + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + >, + )>, + }, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod app_sr25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedOpaqueNetworkState { + pub peer_id: runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + pub external_addresses: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Heartbeat<_0> { + pub block_number: _0, + pub network_state: runtime_types::sp_core::offchain::OpaqueNetworkState, + pub session_index: _0, + pub authority_index: _0, + pub validators_len: _0, + } + } + pub mod pallet_indices { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim { index: ::core::primitive::u32 }, + #[codec(index = 1)] + transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + }, + #[codec(index = 2)] + free { index: ::core::primitive::u32 }, + #[codec(index = 3)] + force_transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + freeze: ::core::primitive::bool, + }, + #[codec(index = 4)] + freeze { index: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotAssigned, + #[codec(index = 1)] + NotOwner, + #[codec(index = 2)] + InUse, + #[codec(index = 3)] + NotTransfer, + #[codec(index = 4)] + Permanent, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IndexAssigned { + who: ::sp_core::crypto::AccountId32, + index: ::core::primitive::u32, + }, + #[codec(index = 1)] + IndexFreed { index: ::core::primitive::u32 }, + #[codec(index = 2)] + IndexFrozen { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + }, + } + } + } + pub mod pallet_membership { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + remove_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + swap_member { + remove: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + add: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 3)] + reset_members { members: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 4)] + change_key { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + set_prime { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + clear_prime, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + AlreadyMember, + #[codec(index = 1)] + NotMember, + #[codec(index = 2)] + TooManyMembers, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + MemberAdded, + #[codec(index = 1)] + MemberRemoved, + #[codec(index = 2)] + MembersSwapped, + #[codec(index = 3)] + MembersReset, + #[codec(index = 4)] + KeyChanged, + #[codec(index = 5)] + Dummy, + } + } + } + pub mod pallet_message_queue { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] reap_page { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , } , # [codec (index = 1)] execute_overweight { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page : :: core :: primitive :: u32 , index : :: core :: primitive :: u32 , weight_limit : :: sp_weights :: Weight , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotReapable, + #[codec(index = 1)] + NoPage, + #[codec(index = 2)] + NoMessage, + #[codec(index = 3)] + AlreadyProcessed, + #[codec(index = 4)] + Queued, + #[codec(index = 5)] + InsufficientWeight, + #[codec(index = 6)] + TemporarilyUnprocessable, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + # [codec (index = 0)] ProcessingFailed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , error : runtime_types :: frame_support :: traits :: messages :: ProcessMessageError , } , # [codec (index = 1)] Processed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , weight_used : :: sp_weights :: Weight , success : :: core :: primitive :: bool , } , # [codec (index = 2)] OverweightEnqueued { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , message_index : :: core :: primitive :: u32 , } , # [codec (index = 3)] PageReaped { origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , index : :: core :: primitive :: u32 , } , } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BookState<_0> { + pub begin: ::core::primitive::u32, + pub end: ::core::primitive::u32, + pub count: ::core::primitive::u32, + pub ready_neighbours: + ::core::option::Option>, + pub message_count: ::core::primitive::u64, + pub size: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Neighbours<_0> { + pub prev: _0, + pub next: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Page<_0> { + pub remaining: _0, + pub remaining_size: _0, + pub first_index: _0, + pub first: _0, + pub last: _0, + pub heap: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + } + } + pub mod pallet_multisig { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_multi_threshold_1 { + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + approve_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call_hash: [::core::primitive::u8; 32usize], + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 3)] + cancel_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + call_hash: [::core::primitive::u8; 32usize], + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + MinimumThreshold, + #[codec(index = 1)] + AlreadyApproved, + #[codec(index = 2)] + NoApprovalsNeeded, + #[codec(index = 3)] + TooFewSignatories, + #[codec(index = 4)] + TooManySignatories, + #[codec(index = 5)] + SignatoriesOutOfOrder, + #[codec(index = 6)] + SenderInSignatories, + #[codec(index = 7)] + NotFound, + #[codec(index = 8)] + NotOwner, + #[codec(index = 9)] + NoTimepoint, + #[codec(index = 10)] + WrongTimepoint, + #[codec(index = 11)] + UnexpectedTimepoint, + #[codec(index = 12)] + MaxWeightTooLow, + #[codec(index = 13)] + AlreadyStored, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewMultisig { + approving: ::sp_core::crypto::AccountId32, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 1)] + MultisigApproval { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + MultisigExecuted { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + MultisigCancelled { + cancelling: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Multisig<_0, _1, _2> { + pub when: runtime_types::pallet_multisig::Timepoint<_0>, + pub deposit: _1, + pub depositor: _2, + pub approvals: runtime_types::bounded_collections::bounded_vec::BoundedVec<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Timepoint<_0> { + pub height: _0, + pub index: _0, + } + } + pub mod pallet_nomination_pools { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + join { + #[codec(compact)] + amount: ::core::primitive::u128, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 1)] + bond_extra { + extra: runtime_types::pallet_nomination_pools::BondExtra< + ::core::primitive::u128, + >, + }, + #[codec(index = 2)] + claim_payout, + #[codec(index = 3)] + unbond { + member_account: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + unbonding_points: ::core::primitive::u128, + }, + #[codec(index = 4)] + pool_withdraw_unbonded { + pool_id: ::core::primitive::u32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 5)] + withdraw_unbonded { + member_account: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 6)] + create { + #[codec(compact)] + amount: ::core::primitive::u128, + root: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + nominator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + bouncer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 7)] + create_with_pool_id { + #[codec(compact)] + amount: ::core::primitive::u128, + root: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + nominator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + bouncer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 8)] + nominate { + pool_id: ::core::primitive::u32, + validators: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 9)] + set_state { + pool_id: ::core::primitive::u32, + state: runtime_types::pallet_nomination_pools::PoolState, + }, + #[codec(index = 10)] + set_metadata { + pool_id: ::core::primitive::u32, + metadata: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 11)] + set_configs { + min_join_bond: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u128, + >, + min_create_bond: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u128, + >, + max_pools: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + max_members: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + max_members_per_pool: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + global_max_commission: runtime_types::pallet_nomination_pools::ConfigOp< + runtime_types::sp_arithmetic::per_things::Perbill, + >, + }, + #[codec(index = 12)] + update_roles { + pool_id: ::core::primitive::u32, + new_root: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + new_nominator: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + new_bouncer: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 13)] + chill { pool_id: ::core::primitive::u32 }, + #[codec(index = 14)] + bond_extra_other { + member: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + extra: runtime_types::pallet_nomination_pools::BondExtra< + ::core::primitive::u128, + >, + }, + #[codec(index = 15)] + set_claim_permission { + permission: runtime_types::pallet_nomination_pools::ClaimPermission, + }, + #[codec(index = 16)] + claim_payout_other { other: ::sp_core::crypto::AccountId32 }, + #[codec(index = 17)] + set_commission { + pool_id: ::core::primitive::u32, + new_commission: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + }, + #[codec(index = 18)] + set_commission_max { + pool_id: ::core::primitive::u32, + max_commission: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 19)] + set_commission_change_rate { + pool_id: ::core::primitive::u32, + change_rate: runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + }, + #[codec(index = 20)] + claim_commission { pool_id: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DefensiveError { + #[codec(index = 0)] + NotEnoughSpaceInUnbondPool, + #[codec(index = 1)] + PoolNotFound, + #[codec(index = 2)] + RewardPoolNotFound, + #[codec(index = 3)] + SubPoolsNotFound, + #[codec(index = 4)] + BondedStashKilledPrematurely, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PoolNotFound, + #[codec(index = 1)] + PoolMemberNotFound, + #[codec(index = 2)] + RewardPoolNotFound, + #[codec(index = 3)] + SubPoolsNotFound, + #[codec(index = 4)] + AccountBelongsToOtherPool, + #[codec(index = 5)] + FullyUnbonding, + #[codec(index = 6)] + MaxUnbondingLimit, + #[codec(index = 7)] + CannotWithdrawAny, + #[codec(index = 8)] + MinimumBondNotMet, + #[codec(index = 9)] + OverflowRisk, + #[codec(index = 10)] + NotDestroying, + #[codec(index = 11)] + NotNominator, + #[codec(index = 12)] + NotKickerOrDestroying, + #[codec(index = 13)] + NotOpen, + #[codec(index = 14)] + MaxPools, + #[codec(index = 15)] + MaxPoolMembers, + #[codec(index = 16)] + CanNotChangeState, + #[codec(index = 17)] + DoesNotHavePermission, + #[codec(index = 18)] + MetadataExceedsMaxLen, + #[codec(index = 19)] + Defensive(runtime_types::pallet_nomination_pools::pallet::DefensiveError), + #[codec(index = 20)] + PartialUnbondNotAllowedPermissionlessly, + #[codec(index = 21)] + MaxCommissionRestricted, + #[codec(index = 22)] + CommissionExceedsMaximum, + #[codec(index = 23)] + CommissionChangeThrottled, + #[codec(index = 24)] + CommissionChangeRateNotAllowed, + #[codec(index = 25)] + NoPendingCommission, + #[codec(index = 26)] + NoCommissionCurrentSet, + #[codec(index = 27)] + PoolIdInUse, + #[codec(index = 28)] + InvalidPoolId, + #[codec(index = 29)] + BondExtraRestricted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Created { + depositor: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 1)] + Bonded { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + bonded: ::core::primitive::u128, + joined: ::core::primitive::bool, + }, + #[codec(index = 2)] + PaidOut { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + payout: ::core::primitive::u128, + }, + #[codec(index = 3)] + Unbonded { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + points: ::core::primitive::u128, + era: ::core::primitive::u32, + }, + #[codec(index = 4)] + Withdrawn { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + points: ::core::primitive::u128, + }, + #[codec(index = 5)] + Destroyed { pool_id: ::core::primitive::u32 }, + #[codec(index = 6)] + StateChanged { + pool_id: ::core::primitive::u32, + new_state: runtime_types::pallet_nomination_pools::PoolState, + }, + #[codec(index = 7)] + MemberRemoved { + pool_id: ::core::primitive::u32, + member: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + RolesUpdated { + root: ::core::option::Option<::sp_core::crypto::AccountId32>, + bouncer: ::core::option::Option<::sp_core::crypto::AccountId32>, + nominator: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 9)] + PoolSlashed { + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + }, + #[codec(index = 10)] + UnbondingPoolSlashed { + pool_id: ::core::primitive::u32, + era: ::core::primitive::u32, + balance: ::core::primitive::u128, + }, + #[codec(index = 11)] + PoolCommissionUpdated { + pool_id: ::core::primitive::u32, + current: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + }, + #[codec(index = 12)] + PoolMaxCommissionUpdated { + pool_id: ::core::primitive::u32, + max_commission: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 13)] + PoolCommissionChangeRateUpdated { + pool_id: ::core::primitive::u32, + change_rate: runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + }, + #[codec(index = 14)] + PoolCommissionClaimed { + pool_id: ::core::primitive::u32, + commission: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BondExtra<_0> { + #[codec(index = 0)] + FreeBalance(_0), + #[codec(index = 1)] + Rewards, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BondedPoolInner { + pub commission: runtime_types::pallet_nomination_pools::Commission, + pub member_counter: ::core::primitive::u32, + pub points: ::core::primitive::u128, + pub roles: runtime_types::pallet_nomination_pools::PoolRoles< + ::sp_core::crypto::AccountId32, + >, + pub state: runtime_types::pallet_nomination_pools::PoolState, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ClaimPermission { + #[codec(index = 0)] + Permissioned, + #[codec(index = 1)] + PermissionlessCompound, + #[codec(index = 2)] + PermissionlessWithdraw, + #[codec(index = 3)] + PermissionlessAll, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Commission { + pub current: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + pub max: ::core::option::Option, + pub change_rate: ::core::option::Option< + runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + >, + pub throttle_from: ::core::option::Option<::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CommissionChangeRate<_0> { + pub max_increase: runtime_types::sp_arithmetic::per_things::Perbill, + pub min_delay: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ConfigOp<_0> { + #[codec(index = 0)] + Noop, + #[codec(index = 1)] + Set(_0), + #[codec(index = 2)] + Remove, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PoolMember { + pub pool_id: ::core::primitive::u32, + pub points: ::core::primitive::u128, + pub last_recorded_reward_counter: + runtime_types::sp_arithmetic::fixed_point::FixedU128, + pub unbonding_eras: + runtime_types::bounded_collections::bounded_btree_map::BoundedBTreeMap< + ::core::primitive::u32, + ::core::primitive::u128, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PoolRoles<_0> { + pub depositor: _0, + pub root: ::core::option::Option<_0>, + pub nominator: ::core::option::Option<_0>, + pub bouncer: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PoolState { + #[codec(index = 0)] + Open, + #[codec(index = 1)] + Blocked, + #[codec(index = 2)] + Destroying, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RewardPool { + pub last_recorded_reward_counter: + runtime_types::sp_arithmetic::fixed_point::FixedU128, + pub last_recorded_total_payouts: ::core::primitive::u128, + pub total_rewards_claimed: ::core::primitive::u128, + pub total_commission_pending: ::core::primitive::u128, + pub total_commission_claimed: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SubPools { + pub no_era: runtime_types::pallet_nomination_pools::UnbondPool, + pub with_era: + runtime_types::bounded_collections::bounded_btree_map::BoundedBTreeMap< + ::core::primitive::u32, + runtime_types::pallet_nomination_pools::UnbondPool, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnbondPool { + pub points: ::core::primitive::u128, + pub balance: ::core::primitive::u128, + } + } + pub mod pallet_offences { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Offence { + kind: [::core::primitive::u8; 16usize], + timeslot: ::std::vec::Vec<::core::primitive::u8>, + }, + } + } + } + pub mod pallet_preimage { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + note_preimage { bytes: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + unnote_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + request_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 3)] + unrequest_preimage { hash: ::subxt::utils::H256 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooBig, + #[codec(index = 1)] + AlreadyNoted, + #[codec(index = 2)] + NotAuthorized, + #[codec(index = 3)] + NotNoted, + #[codec(index = 4)] + Requested, + #[codec(index = 5)] + NotRequested, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Noted { hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + Requested { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + Cleared { hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RequestStatus<_0, _1> { + #[codec(index = 0)] + Unrequested { deposit: (_0, _1), len: ::core::primitive::u32 }, + #[codec(index = 1)] + Requested { + deposit: ::core::option::Option<(_0, _1)>, + count: ::core::primitive::u32, + len: ::core::option::Option<::core::primitive::u32>, + }, + } + } + pub mod pallet_proxy { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + proxy { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + add_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::polkadot_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 2)] + remove_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::polkadot_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 3)] + remove_proxies, + #[codec(index = 4)] + create_pure { + proxy_type: runtime_types::polkadot_runtime::ProxyType, + delay: ::core::primitive::u32, + index: ::core::primitive::u16, + }, + #[codec(index = 5)] + kill_pure { + spawner: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::polkadot_runtime::ProxyType, + index: ::core::primitive::u16, + #[codec(compact)] + height: ::core::primitive::u32, + #[codec(compact)] + ext_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + announce { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 7)] + remove_announcement { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 8)] + reject_announcement { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 9)] + proxy_announced { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooMany, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotProxy, + #[codec(index = 3)] + Unproxyable, + #[codec(index = 4)] + Duplicate, + #[codec(index = 5)] + NoPermission, + #[codec(index = 6)] + Unannounced, + #[codec(index = 7)] + NoSelfProxy, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ProxyExecuted { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + PureCreated { + pure: ::sp_core::crypto::AccountId32, + who: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::polkadot_runtime::ProxyType, + disambiguation_index: ::core::primitive::u16, + }, + #[codec(index = 2)] + Announced { + real: ::sp_core::crypto::AccountId32, + proxy: ::sp_core::crypto::AccountId32, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 3)] + ProxyAdded { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::polkadot_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 4)] + ProxyRemoved { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::polkadot_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Announcement<_0, _1, _2> { + pub real: _0, + pub call_hash: _1, + pub height: _2, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ProxyDefinition<_0, _1, _2> { + pub delegate: _0, + pub proxy_type: _1, + pub delay: _2, + } + } + pub mod pallet_referenda { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + submit { + proposal_origin: + ::std::boxed::Box, + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::polkadot_runtime::RuntimeCall, + >, + enactment_moment: + runtime_types::frame_support::traits::schedule::DispatchTime< + ::core::primitive::u32, + >, + }, + #[codec(index = 1)] + place_decision_deposit { index: ::core::primitive::u32 }, + #[codec(index = 2)] + refund_decision_deposit { index: ::core::primitive::u32 }, + #[codec(index = 3)] + cancel { index: ::core::primitive::u32 }, + #[codec(index = 4)] + kill { index: ::core::primitive::u32 }, + #[codec(index = 5)] + nudge_referendum { index: ::core::primitive::u32 }, + #[codec(index = 6)] + one_fewer_deciding { track: ::core::primitive::u16 }, + #[codec(index = 7)] + refund_submission_deposit { index: ::core::primitive::u32 }, + #[codec(index = 8)] + set_metadata { + index: ::core::primitive::u32, + maybe_hash: ::core::option::Option<::subxt::utils::H256>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotOngoing, + #[codec(index = 1)] + HasDeposit, + #[codec(index = 2)] + BadTrack, + #[codec(index = 3)] + Full, + #[codec(index = 4)] + QueueEmpty, + #[codec(index = 5)] + BadReferendum, + #[codec(index = 6)] + NothingToDo, + #[codec(index = 7)] + NoTrack, + #[codec(index = 8)] + Unfinished, + #[codec(index = 9)] + NoPermission, + #[codec(index = 10)] + NoDeposit, + #[codec(index = 11)] + BadStatus, + #[codec(index = 12)] + PreimageNotExist, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Submitted { + index: ::core::primitive::u32, + track: ::core::primitive::u16, + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::polkadot_runtime::RuntimeCall, + >, + }, + #[codec(index = 1)] + DecisionDepositPlaced { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + DecisionDepositRefunded { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + DepositSlashed { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + DecisionStarted { + index: ::core::primitive::u32, + track: ::core::primitive::u16, + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::polkadot_runtime::RuntimeCall, + >, + tally: runtime_types::pallet_conviction_voting::types::Tally< + ::core::primitive::u128, + >, + }, + #[codec(index = 5)] + ConfirmStarted { index: ::core::primitive::u32 }, + #[codec(index = 6)] + ConfirmAborted { index: ::core::primitive::u32 }, + #[codec(index = 7)] + Confirmed { + index: ::core::primitive::u32, + tally: runtime_types::pallet_conviction_voting::types::Tally< + ::core::primitive::u128, + >, + }, + #[codec(index = 8)] + Approved { index: ::core::primitive::u32 }, + #[codec(index = 9)] + Rejected { + index: ::core::primitive::u32, + tally: runtime_types::pallet_conviction_voting::types::Tally< + ::core::primitive::u128, + >, + }, + #[codec(index = 10)] + TimedOut { + index: ::core::primitive::u32, + tally: runtime_types::pallet_conviction_voting::types::Tally< + ::core::primitive::u128, + >, + }, + #[codec(index = 11)] + Cancelled { + index: ::core::primitive::u32, + tally: runtime_types::pallet_conviction_voting::types::Tally< + ::core::primitive::u128, + >, + }, + #[codec(index = 12)] + Killed { + index: ::core::primitive::u32, + tally: runtime_types::pallet_conviction_voting::types::Tally< + ::core::primitive::u128, + >, + }, + #[codec(index = 13)] + SubmissionDepositRefunded { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 14)] + MetadataSet { index: ::core::primitive::u32, hash: ::subxt::utils::H256 }, + #[codec(index = 15)] + MetadataCleared { index: ::core::primitive::u32, hash: ::subxt::utils::H256 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Curve { + #[codec(index = 0)] + LinearDecreasing { + length: runtime_types::sp_arithmetic::per_things::Perbill, + floor: runtime_types::sp_arithmetic::per_things::Perbill, + ceil: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 1)] + SteppedDecreasing { + begin: runtime_types::sp_arithmetic::per_things::Perbill, + end: runtime_types::sp_arithmetic::per_things::Perbill, + step: runtime_types::sp_arithmetic::per_things::Perbill, + period: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 2)] + Reciprocal { + factor: runtime_types::sp_arithmetic::fixed_point::FixedI64, + x_offset: runtime_types::sp_arithmetic::fixed_point::FixedI64, + y_offset: runtime_types::sp_arithmetic::fixed_point::FixedI64, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DecidingStatus<_0> { + pub since: _0, + pub confirming: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Deposit<_0, _1> { + pub who: _0, + pub amount: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReferendumInfo<_0, _1, _2, _3, _4, _5, _6, _7> { + #[codec(index = 0)] + Ongoing( + runtime_types::pallet_referenda::types::ReferendumStatus< + _0, + _1, + _2, + _3, + _4, + _5, + _6, + _7, + >, + ), + #[codec(index = 1)] + Approved( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 2)] + Rejected( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 3)] + Cancelled( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 4)] + TimedOut( + _2, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + ), + #[codec(index = 5)] + Killed(_2), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReferendumStatus<_0, _1, _2, _3, _4, _5, _6, _7> { + pub track: _0, + pub origin: _1, + pub proposal: _3, + pub enactment: runtime_types::frame_support::traits::schedule::DispatchTime<_2>, + pub submitted: _2, + pub submission_deposit: runtime_types::pallet_referenda::types::Deposit<_6, _4>, + pub decision_deposit: ::core::option::Option< + runtime_types::pallet_referenda::types::Deposit<_6, _4>, + >, + pub deciding: ::core::option::Option< + runtime_types::pallet_referenda::types::DecidingStatus<_2>, + >, + pub tally: _5, + pub in_queue: ::core::primitive::bool, + pub alarm: ::core::option::Option<(_2, _7)>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct TrackInfo<_0, _1> { + pub name: ::std::string::String, + pub max_deciding: _1, + pub decision_deposit: _0, + pub prepare_period: _1, + pub decision_period: _1, + pub confirm_period: _1, + pub min_enactment_period: _1, + pub min_approval: runtime_types::pallet_referenda::types::Curve, + pub min_support: runtime_types::pallet_referenda::types::Curve, + } + } + } + pub mod pallet_scheduler { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + schedule { + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + cancel { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + schedule_named { + id: [::core::primitive::u8; 32usize], + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 3)] + cancel_named { id: [::core::primitive::u8; 32usize] }, + #[codec(index = 4)] + schedule_after { + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 5)] + schedule_named_after { + id: [::core::primitive::u8; 32usize], + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FailedToSchedule, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + TargetBlockNumberInPast, + #[codec(index = 3)] + RescheduleNoChange, + #[codec(index = 4)] + Named, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Scheduled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 1)] + Canceled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + Dispatched { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + CallUnavailable { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 4)] + PeriodicFailed { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 5)] + PermanentlyOverweight { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Scheduled<_0, _1, _2, _3, _4> { + pub maybe_id: ::core::option::Option<_0>, + pub priority: ::core::primitive::u8, + pub call: _1, + pub maybe_periodic: ::core::option::Option<(_2, _2)>, + pub origin: _3, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_4>, + } + } + pub mod pallet_session { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_keys { + keys: runtime_types::polkadot_runtime::SessionKeys, + proof: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + purge_keys, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidProof, + #[codec(index = 1)] + NoAssociatedValidatorId, + #[codec(index = 2)] + DuplicatedKey, + #[codec(index = 3)] + NoKeys, + #[codec(index = 4)] + NoAccount, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewSession { session_index: ::core::primitive::u32 }, + } + } + } + pub mod pallet_staking { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + bond { + #[codec(compact)] + value: ::core::primitive::u128, + payee: runtime_types::pallet_staking::RewardDestination< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 1)] + bond_extra { + #[codec(compact)] + max_additional: ::core::primitive::u128, + }, + #[codec(index = 2)] + unbond { + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + withdraw_unbonded { num_slashing_spans: ::core::primitive::u32 }, + #[codec(index = 4)] + validate { prefs: runtime_types::pallet_staking::ValidatorPrefs }, + #[codec(index = 5)] + nominate { + targets: ::std::vec::Vec< + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + >, + }, + #[codec(index = 6)] + chill, + #[codec(index = 7)] + set_payee { + payee: runtime_types::pallet_staking::RewardDestination< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 8)] + set_controller, + #[codec(index = 9)] + set_validator_count { + #[codec(compact)] + new: ::core::primitive::u32, + }, + #[codec(index = 10)] + increase_validator_count { + #[codec(compact)] + additional: ::core::primitive::u32, + }, + #[codec(index = 11)] + scale_validator_count { + factor: runtime_types::sp_arithmetic::per_things::Percent, + }, + #[codec(index = 12)] + force_no_eras, + #[codec(index = 13)] + force_new_era, + #[codec(index = 14)] + set_invulnerables { + invulnerables: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 15)] + force_unstake { + stash: ::sp_core::crypto::AccountId32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 16)] + force_new_era_always, + #[codec(index = 17)] + cancel_deferred_slash { + era: ::core::primitive::u32, + slash_indices: ::std::vec::Vec<::core::primitive::u32>, + }, + #[codec(index = 18)] + payout_stakers { + validator_stash: ::sp_core::crypto::AccountId32, + era: ::core::primitive::u32, + }, + #[codec(index = 19)] + rebond { + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 20)] + reap_stash { + stash: ::sp_core::crypto::AccountId32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 21)] + kick { + who: ::std::vec::Vec< + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + >, + }, + #[codec(index = 22)] + set_staking_configs { + min_nominator_bond: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u128, + >, + min_validator_bond: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u128, + >, + max_nominator_count: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u32, + >, + max_validator_count: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u32, + >, + chill_threshold: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + runtime_types::sp_arithmetic::per_things::Percent, + >, + min_commission: runtime_types::pallet_staking::pallet::pallet::ConfigOp< + runtime_types::sp_arithmetic::per_things::Perbill, + >, + }, + #[codec(index = 23)] + chill_other { controller: ::sp_core::crypto::AccountId32 }, + #[codec(index = 24)] + force_apply_min_commission { + validator_stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 25)] + set_min_commission { + new: runtime_types::sp_arithmetic::per_things::Perbill, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ConfigOp<_0> { + #[codec(index = 0)] + Noop, + #[codec(index = 1)] + Set(_0), + #[codec(index = 2)] + Remove, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotController, + #[codec(index = 1)] + NotStash, + #[codec(index = 2)] + AlreadyBonded, + #[codec(index = 3)] + AlreadyPaired, + #[codec(index = 4)] + EmptyTargets, + #[codec(index = 5)] + DuplicateIndex, + #[codec(index = 6)] + InvalidSlashIndex, + #[codec(index = 7)] + InsufficientBond, + #[codec(index = 8)] + NoMoreChunks, + #[codec(index = 9)] + NoUnlockChunk, + #[codec(index = 10)] + FundedTarget, + #[codec(index = 11)] + InvalidEraToReward, + #[codec(index = 12)] + InvalidNumberOfNominations, + #[codec(index = 13)] + NotSortedAndUnique, + #[codec(index = 14)] + AlreadyClaimed, + #[codec(index = 15)] + IncorrectHistoryDepth, + #[codec(index = 16)] + IncorrectSlashingSpans, + #[codec(index = 17)] + BadState, + #[codec(index = 18)] + TooManyTargets, + #[codec(index = 19)] + BadTarget, + #[codec(index = 20)] + CannotChillOther, + #[codec(index = 21)] + TooManyNominators, + #[codec(index = 22)] + TooManyValidators, + #[codec(index = 23)] + CommissionTooLow, + #[codec(index = 24)] + BoundNotMet, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + EraPaid { + era_index: ::core::primitive::u32, + validator_payout: ::core::primitive::u128, + remainder: ::core::primitive::u128, + }, + #[codec(index = 1)] + Rewarded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Slashed { + staker: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + SlashReported { + validator: ::sp_core::crypto::AccountId32, + fraction: runtime_types::sp_arithmetic::per_things::Perbill, + slash_era: ::core::primitive::u32, + }, + #[codec(index = 4)] + OldSlashingReportDiscarded { session_index: ::core::primitive::u32 }, + #[codec(index = 5)] + StakersElected, + #[codec(index = 6)] + Bonded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 7)] + Unbonded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 8)] + Withdrawn { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Kicked { + nominator: ::sp_core::crypto::AccountId32, + stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 10)] + StakingElectionFailed, + #[codec(index = 11)] + Chilled { stash: ::sp_core::crypto::AccountId32 }, + #[codec(index = 12)] + PayoutStarted { + era_index: ::core::primitive::u32, + validator_stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 13)] + ValidatorPrefsSet { + stash: ::sp_core::crypto::AccountId32, + prefs: runtime_types::pallet_staking::ValidatorPrefs, + }, + #[codec(index = 14)] + ForceEra { mode: runtime_types::pallet_staking::Forcing }, + } + } + } + pub mod slashing { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SlashingSpans { + pub span_index: ::core::primitive::u32, + pub last_start: ::core::primitive::u32, + pub last_nonzero_slash: ::core::primitive::u32, + pub prior: ::std::vec::Vec<::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SpanRecord<_0> { + pub slashed: _0, + pub paid_out: _0, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ActiveEraInfo { + pub index: ::core::primitive::u32, + pub start: ::core::option::Option<::core::primitive::u64>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EraRewardPoints<_0> { + pub total: ::core::primitive::u32, + pub individual: ::subxt::utils::KeyedVec<_0, ::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Exposure<_0, _1> { + #[codec(compact)] + pub total: _1, + #[codec(compact)] + pub own: _1, + pub others: + ::std::vec::Vec>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Forcing { + #[codec(index = 0)] + NotForcing, + #[codec(index = 1)] + ForceNew, + #[codec(index = 2)] + ForceNone, + #[codec(index = 3)] + ForceAlways, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IndividualExposure<_0, _1> { + pub who: _0, + #[codec(compact)] + pub value: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Nominations { + pub targets: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::sp_core::crypto::AccountId32, + >, + pub submitted_in: ::core::primitive::u32, + pub suppressed: ::core::primitive::bool, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RewardDestination<_0> { + #[codec(index = 0)] + Staked, + #[codec(index = 1)] + Stash, + #[codec(index = 2)] + Controller, + #[codec(index = 3)] + Account(_0), + #[codec(index = 4)] + None, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StakingLedger { + pub stash: ::sp_core::crypto::AccountId32, + #[codec(compact)] + pub total: ::core::primitive::u128, + #[codec(compact)] + pub active: ::core::primitive::u128, + pub unlocking: runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::pallet_staking::UnlockChunk<::core::primitive::u128>, + >, + pub claimed_rewards: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnappliedSlash<_0, _1> { + pub validator: _0, + pub own: _1, + pub others: ::std::vec::Vec<(_0, _1)>, + pub reporters: ::std::vec::Vec<_0>, + pub payout: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnlockChunk<_0> { + #[codec(compact)] + pub value: _0, + #[codec(compact)] + pub era: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidatorPrefs { + #[codec(compact)] + pub commission: runtime_types::sp_arithmetic::per_things::Perbill, + pub blocked: ::core::primitive::bool, + } + } + pub mod pallet_timestamp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set { + #[codec(compact)] + now: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_tips { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_awesome { + reason: ::std::vec::Vec<::core::primitive::u8>, + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + retract_tip { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + tip_new { + reason: ::std::vec::Vec<::core::primitive::u8>, + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + tip_value: ::core::primitive::u128, + }, + #[codec(index = 3)] + tip { + hash: ::subxt::utils::H256, + #[codec(compact)] + tip_value: ::core::primitive::u128, + }, + #[codec(index = 4)] + close_tip { hash: ::subxt::utils::H256 }, + #[codec(index = 5)] + slash_tip { hash: ::subxt::utils::H256 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ReasonTooBig, + #[codec(index = 1)] + AlreadyKnown, + #[codec(index = 2)] + UnknownTip, + #[codec(index = 3)] + NotFinder, + #[codec(index = 4)] + StillOpen, + #[codec(index = 5)] + Premature, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewTip { tip_hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + TipClosing { tip_hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + TipClosed { + tip_hash: ::subxt::utils::H256, + who: ::sp_core::crypto::AccountId32, + payout: ::core::primitive::u128, + }, + #[codec(index = 3)] + TipRetracted { tip_hash: ::subxt::utils::H256 }, + #[codec(index = 4)] + TipSlashed { + tip_hash: ::subxt::utils::H256, + finder: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpenTip<_0, _1, _2, _3> { + pub reason: _3, + pub who: _0, + pub finder: _0, + pub deposit: _1, + pub closes: ::core::option::Option<_2>, + pub tips: ::std::vec::Vec<(_0, _1)>, + pub finders_fee: ::core::primitive::bool, + } + } + pub mod pallet_transaction_payment { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + TransactionFeePaid { + who: ::sp_core::crypto::AccountId32, + actual_fee: ::core::primitive::u128, + tip: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChargeTransactionPayment(#[codec(compact)] pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V1Ancient, + #[codec(index = 1)] + V2, + } + } + pub mod pallet_treasury { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose_spend { + #[codec(compact)] + value: ::core::primitive::u128, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + reject_proposal { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + #[codec(index = 2)] + approve_proposal { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + #[codec(index = 3)] + spend { + #[codec(compact)] + amount: ::core::primitive::u128, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + remove_approval { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InsufficientProposersBalance, + #[codec(index = 1)] + InvalidIndex, + #[codec(index = 2)] + TooManyApprovals, + #[codec(index = 3)] + InsufficientPermission, + #[codec(index = 4)] + ProposalNotApproved, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Proposed { proposal_index: ::core::primitive::u32 }, + #[codec(index = 1)] + Spending { budget_remaining: ::core::primitive::u128 }, + #[codec(index = 2)] + Awarded { + proposal_index: ::core::primitive::u32, + award: ::core::primitive::u128, + account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Rejected { + proposal_index: ::core::primitive::u32, + slashed: ::core::primitive::u128, + }, + #[codec(index = 4)] + Burnt { burnt_funds: ::core::primitive::u128 }, + #[codec(index = 5)] + Rollover { rollover_balance: ::core::primitive::u128 }, + #[codec(index = 6)] + Deposit { value: ::core::primitive::u128 }, + #[codec(index = 7)] + SpendApproved { + proposal_index: ::core::primitive::u32, + amount: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + UpdatedInactive { + reactivated: ::core::primitive::u128, + deactivated: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Proposal<_0, _1> { + pub proposer: _0, + pub value: _1, + pub beneficiary: _0, + pub bond: _1, + } + } + pub mod pallet_utility { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + batch { calls: ::std::vec::Vec }, + #[codec(index = 1)] + as_derivative { + index: ::core::primitive::u16, + call: ::std::boxed::Box, + }, + #[codec(index = 2)] + batch_all { + calls: ::std::vec::Vec, + }, + #[codec(index = 3)] + dispatch_as { + as_origin: ::std::boxed::Box, + call: ::std::boxed::Box, + }, + #[codec(index = 4)] + force_batch { + calls: ::std::vec::Vec, + }, + #[codec(index = 5)] + with_weight { + call: ::std::boxed::Box, + weight: ::sp_weights::Weight, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyCalls, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BatchInterrupted { + index: ::core::primitive::u32, + error: runtime_types::sp_runtime::DispatchError, + }, + #[codec(index = 1)] + BatchCompleted, + #[codec(index = 2)] + BatchCompletedWithErrors, + #[codec(index = 3)] + ItemCompleted, + #[codec(index = 4)] + ItemFailed { error: runtime_types::sp_runtime::DispatchError }, + #[codec(index = 5)] + DispatchedAs { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_vesting { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vest, + #[codec(index = 1)] + vest_other { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + vested_transfer { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 3)] + force_vested_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 4)] + merge_schedules { + schedule1_index: ::core::primitive::u32, + schedule2_index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotVesting, + #[codec(index = 1)] + AtMaxVestingSchedules, + #[codec(index = 2)] + AmountLow, + #[codec(index = 3)] + ScheduleIndexOutOfBounds, + #[codec(index = 4)] + InvalidScheduleParams, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + VestingUpdated { + account: ::sp_core::crypto::AccountId32, + unvested: ::core::primitive::u128, + }, + #[codec(index = 1)] + VestingCompleted { account: ::sp_core::crypto::AccountId32 }, + } + } + pub mod vesting_info { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VestingInfo<_0, _1> { + pub locked: _0, + pub per_block: _0, + pub starting_block: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V0, + #[codec(index = 1)] + V1, + } + } + pub mod pallet_whitelist { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + whitelist_call { call_hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + remove_whitelisted_call { call_hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + dispatch_whitelisted_call { + call_hash: ::subxt::utils::H256, + call_encoded_len: ::core::primitive::u32, + call_weight_witness: ::sp_weights::Weight, + }, + #[codec(index = 3)] + dispatch_whitelisted_call_with_preimage { + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnavailablePreImage, + #[codec(index = 1)] + UndecodableCall, + #[codec(index = 2)] + InvalidCallWeightWitness, + #[codec(index = 3)] + CallIsNotWhitelisted, + #[codec(index = 4)] + CallAlreadyWhitelisted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CallWhitelisted { call_hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + WhitelistedCallRemoved { call_hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + WhitelistedCallDispatched { + call_hash: ::subxt::utils::H256, + result: ::core::result::Result< + runtime_types::frame_support::dispatch::PostDispatchInfo, + runtime_types::sp_runtime::DispatchErrorWithPostInfo< + runtime_types::frame_support::dispatch::PostDispatchInfo, + >, + >, + }, + } + } + } + pub mod pallet_xcm { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + send { + dest: ::std::boxed::Box, + message: ::std::boxed::Box, + }, + #[codec(index = 1)] + teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 2)] + reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 3)] + execute { + message: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 4)] + force_xcm_version { + location: + ::std::boxed::Box, + xcm_version: ::core::primitive::u32, + }, + #[codec(index = 5)] + force_default_xcm_version { + maybe_xcm_version: ::core::option::Option<::core::primitive::u32>, + }, + #[codec(index = 6)] + force_subscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 7)] + force_unsubscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 8)] + limited_reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 9)] + limited_teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 10)] + force_suspension { suspended: ::core::primitive::bool }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Unreachable, + #[codec(index = 1)] + SendFailure, + #[codec(index = 2)] + Filtered, + #[codec(index = 3)] + UnweighableMessage, + #[codec(index = 4)] + DestinationNotInvertible, + #[codec(index = 5)] + Empty, + #[codec(index = 6)] + CannotReanchor, + #[codec(index = 7)] + TooManyAssets, + #[codec(index = 8)] + InvalidOrigin, + #[codec(index = 9)] + BadVersion, + #[codec(index = 10)] + BadLocation, + #[codec(index = 11)] + NoSubscription, + #[codec(index = 12)] + AlreadySubscribed, + #[codec(index = 13)] + InvalidAsset, + #[codec(index = 14)] + LowBalance, + #[codec(index = 15)] + TooManyLocks, + #[codec(index = 16)] + AccountNotSovereign, + #[codec(index = 17)] + FeesNotMet, + #[codec(index = 18)] + LockNotFound, + #[codec(index = 19)] + InUse, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Attempted(runtime_types::xcm::v3::traits::Outcome), + #[codec(index = 1)] + Sent( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::Xcm, + ), + #[codec(index = 2)] + UnexpectedResponse( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 3)] + ResponseReady(::core::primitive::u64, runtime_types::xcm::v3::Response), + #[codec(index = 4)] + Notified(::core::primitive::u64, ::core::primitive::u8, ::core::primitive::u8), + #[codec(index = 5)] + NotifyOverweight( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ::sp_weights::Weight, + ::sp_weights::Weight, + ), + #[codec(index = 6)] + NotifyDispatchError( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 7)] + NotifyDecodeFailed( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 8)] + InvalidResponder( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 9)] + InvalidResponderVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 10)] + ResponseTaken(::core::primitive::u64), + #[codec(index = 11)] + AssetsTrapped( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + #[codec(index = 12)] + VersionChangeNotified( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 13)] + SupportedVersionChanged( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + ), + #[codec(index = 14)] + NotifyTargetSendFail( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::traits::Error, + ), + #[codec(index = 15)] + NotifyTargetMigrationFail( + runtime_types::xcm::VersionedMultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 16)] + InvalidQuerierVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 17)] + InvalidQuerier( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 18)] + VersionNotifyStarted( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 19)] + VersionNotifyRequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 20)] + VersionNotifyUnrequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 21)] + FeesPaid( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 22)] + AssetsClaimed( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Xcm(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Response(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum QueryStatus<_0> { + #[codec(index = 0)] + Pending { + responder: runtime_types::xcm::VersionedMultiLocation, + maybe_match_querier: + ::core::option::Option, + maybe_notify: + ::core::option::Option<(::core::primitive::u8, ::core::primitive::u8)>, + timeout: _0, + }, + #[codec(index = 1)] + VersionNotifier { + origin: runtime_types::xcm::VersionedMultiLocation, + is_active: ::core::primitive::bool, + }, + #[codec(index = 2)] + Ready { response: runtime_types::xcm::VersionedResponse, at: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RemoteLockedFungibleRecord<_0> { + pub amount: ::core::primitive::u128, + pub owner: runtime_types::xcm::VersionedMultiLocation, + pub locker: runtime_types::xcm::VersionedMultiLocation, + pub consumers: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _0, + ::core::primitive::u128, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionMigrationStage { + #[codec(index = 0)] + MigrateSupportedVersion, + #[codec(index = 1)] + MigrateVersionNotifiers, + #[codec(index = 2)] + NotifyCurrentTargets( + ::core::option::Option<::std::vec::Vec<::core::primitive::u8>>, + ), + #[codec(index = 3)] + MigrateAndNotifyOldTargets, + } + } + } + pub mod polkadot_core_primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateHash(pub ::subxt::utils::H256); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundDownwardMessage<_0> { + pub sent_at: _0, + pub msg: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundHrmpMessage<_0> { + pub sent_at: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundHrmpMessage<_0> { + pub recipient: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod polkadot_parachain { + use super::runtime_types; + pub mod primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeadData(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannelId { + pub sender: runtime_types::polkadot_parachain::primitives::Id, + pub recipient: runtime_types::polkadot_parachain::primitives::Id, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Id(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCode(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCodeHash(pub ::subxt::utils::H256); + } + } + pub mod polkadot_primitives { + use super::runtime_types; + pub mod v4 { + use super::runtime_types; + pub mod assignment_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod collator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + pub mod executor_params { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ExecutorParam { + #[codec(index = 1)] + MaxMemoryPages(::core::primitive::u32), + #[codec(index = 2)] + StackLogicalMax(::core::primitive::u32), + #[codec(index = 3)] + StackNativeMax(::core::primitive::u32), + #[codec(index = 4)] + PrecheckingMaxMemory(::core::primitive::u64), + #[codec(index = 5)] + PvfPrepTimeout( + runtime_types::polkadot_primitives::v4::PvfPrepTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 6)] + PvfExecTimeout( + runtime_types::polkadot_primitives::v4::PvfExecTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 7)] + WasmExtBulkMemory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ExecutorParams( + pub ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParam, + >, + ); + } + pub mod signed { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedSigned<_0, _1> { + pub payload: _0, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + pub signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_1>, + } + } + pub mod validator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfield( + pub ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BackedCandidate<_0> { + pub candidate: + runtime_types::polkadot_primitives::v4::CommittedCandidateReceipt<_0>, + pub validity_votes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::ValidityAttestation, + >, + pub validator_indices: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateCommitments<_0> { + pub upward_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::std::vec::Vec<::core::primitive::u8>, + >, + pub horizontal_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::polkadot_core_primitives::OutboundHrmpMessage< + runtime_types::polkadot_parachain::primitives::Id, + >, + >, + pub new_validation_code: ::core::option::Option< + runtime_types::polkadot_parachain::primitives::ValidationCode, + >, + pub head_data: runtime_types::polkadot_parachain::primitives::HeadData, + pub processed_downward_messages: _0, + pub hrmp_watermark: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateDescriptor<_0> { + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub relay_parent: _0, + pub collator: runtime_types::polkadot_primitives::v4::collator_app::Public, + pub persisted_validation_data_hash: _0, + pub pov_hash: _0, + pub erasure_root: _0, + pub signature: runtime_types::polkadot_primitives::v4::collator_app::Signature, + pub para_head: _0, + pub validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments_hash: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CommittedCandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments: runtime_types::polkadot_primitives::v4::CandidateCommitments< + ::core::primitive::u32, + >, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct CoreIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum CoreOccupied { + #[codec(index = 0)] + Parathread(runtime_types::polkadot_primitives::v4::ParathreadEntry), + #[codec(index = 1)] + Parachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeState<_0> { + pub validators_for: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub validators_against: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub start: _0, + pub concluded_at: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeStatement { + #[codec(index = 0)] + Valid(runtime_types::polkadot_primitives::v4::ValidDisputeStatementKind), + #[codec(index = 1)] + Invalid(runtime_types::polkadot_primitives::v4::InvalidDisputeStatementKind), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeStatementSet { + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub session: ::core::primitive::u32, + pub statements: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::DisputeStatement, + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Signature, + )>, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct GroupIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IndexedVec<_0, _1>( + pub ::std::vec::Vec<_1>, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InherentData<_0> { + pub bitfields: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::signed::UncheckedSigned< + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + >, + >, + pub backed_candidates: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::BackedCandidate< + ::subxt::utils::H256, + >, + >, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + pub parent_header: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum InvalidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaim( + pub runtime_types::polkadot_parachain::primitives::Id, + pub runtime_types::polkadot_primitives::v4::collator_app::Public, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadEntry { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadClaim, + pub retries: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckStatement { + pub accept: ::core::primitive::bool, + pub subject: runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + pub session_index: ::core::primitive::u32, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfExecTimeoutKind { + #[codec(index = 0)] + Backing, + #[codec(index = 1)] + Approval, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfPrepTimeoutKind { + #[codec(index = 0)] + Precheck, + #[codec(index = 1)] + Lenient, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ScrapedOnChainVotes<_0> { + pub session: ::core::primitive::u32, + pub backing_validators_per_candidate: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::CandidateReceipt<_0>, + ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::ValidityAttestation, + )>, + )>, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionInfo { + pub active_validator_indices: + ::std::vec::Vec, + pub random_seed: [::core::primitive::u8; 32usize], + pub dispute_period: ::core::primitive::u32, + pub validators: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub discovery_keys: + ::std::vec::Vec, + pub assignment_keys: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::assignment_app::Public, + >, + pub validator_groups: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::GroupIndex, + ::std::vec::Vec, + >, + pub n_cores: ::core::primitive::u32, + pub zeroth_delay_tranche_width: ::core::primitive::u32, + pub relay_vrf_modulo_samples: ::core::primitive::u32, + pub n_delay_tranches: ::core::primitive::u32, + pub no_show_slots: ::core::primitive::u32, + pub needed_approvals: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeGoAhead { + #[codec(index = 0)] + Abort, + #[codec(index = 1)] + GoAhead, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeRestriction { + #[codec(index = 0)] + Present, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + #[codec(index = 1)] + BackingSeconded(::subxt::utils::H256), + #[codec(index = 2)] + BackingValid(::subxt::utils::H256), + #[codec(index = 3)] + ApprovalChecking, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ValidatorIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidityAttestation { + #[codec(index = 1)] + Implicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + #[codec(index = 2)] + Explicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + } + } + pub mod vstaging { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AsyncBackingParams { + pub max_candidate_depth: ::core::primitive::u32, + pub allowed_ancestry_len: ::core::primitive::u32, + } + } + } + pub mod polkadot_runtime { + use super::runtime_types; + pub mod governance { + use super::runtime_types; + pub mod origins { + use super::runtime_types; + pub mod pallet_custom_origins { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Origin { + #[codec(index = 0)] + StakingAdmin, + #[codec(index = 1)] + Treasurer, + #[codec(index = 2)] + FellowshipAdmin, + #[codec(index = 3)] + GeneralAdmin, + #[codec(index = 4)] + AuctionAdmin, + #[codec(index = 5)] + LeaseAdmin, + #[codec(index = 6)] + ReferendumCanceller, + #[codec(index = 7)] + ReferendumKiller, + #[codec(index = 8)] + SmallTipper, + #[codec(index = 9)] + BigTipper, + #[codec(index = 10)] + SmallSpender, + #[codec(index = 11)] + MediumSpender, + #[codec(index = 12)] + BigSpender, + #[codec(index = 13)] + WhitelistedCaller, + } + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct NposCompactSolution16 { + pub votes1: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes2: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + ( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ), + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes3: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 2usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes4: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 3usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes5: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 4usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes6: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 5usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes7: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 6usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes8: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 7usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes9: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 8usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes10: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 9usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes11: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 10usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes12: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 11usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes13: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 12usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes14: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 13usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes15: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 14usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes16: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 15usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginCaller { + # [codec (index = 0)] system (runtime_types :: frame_support :: dispatch :: RawOrigin < :: sp_core :: crypto :: AccountId32 > ,) , # [codec (index = 15)] Council (runtime_types :: pallet_collective :: RawOrigin < :: sp_core :: crypto :: AccountId32 > ,) , # [codec (index = 16)] TechnicalCommittee (runtime_types :: pallet_collective :: RawOrigin < :: sp_core :: crypto :: AccountId32 > ,) , # [codec (index = 22)] Origins (runtime_types :: polkadot_runtime :: governance :: origins :: pallet_custom_origins :: Origin ,) , # [codec (index = 50)] ParachainsOrigin (runtime_types :: polkadot_runtime_parachains :: origin :: pallet :: Origin ,) , # [codec (index = 99)] XcmPallet (runtime_types :: pallet_xcm :: pallet :: Origin ,) , # [codec (index = 6)] Void (runtime_types :: sp_core :: Void ,) , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProxyType { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + NonTransfer, + #[codec(index = 2)] + Governance, + #[codec(index = 3)] + Staking, + #[codec(index = 5)] + IdentityJudgement, + #[codec(index = 6)] + CancelProxy, + #[codec(index = 7)] + Auction, + #[codec(index = 8)] + NominationPools, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Runtime; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeCall { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Call), + #[codec(index = 1)] + Scheduler(runtime_types::pallet_scheduler::pallet::Call), + #[codec(index = 10)] + Preimage(runtime_types::pallet_preimage::pallet::Call), + #[codec(index = 2)] + Babe(runtime_types::pallet_babe::pallet::Call), + #[codec(index = 3)] + Timestamp(runtime_types::pallet_timestamp::pallet::Call), + #[codec(index = 4)] + Indices(runtime_types::pallet_indices::pallet::Call), + #[codec(index = 5)] + Balances(runtime_types::pallet_balances::pallet::Call), + #[codec(index = 7)] + Staking(runtime_types::pallet_staking::pallet::pallet::Call), + #[codec(index = 9)] + Session(runtime_types::pallet_session::pallet::Call), + #[codec(index = 11)] + Grandpa(runtime_types::pallet_grandpa::pallet::Call), + #[codec(index = 12)] + ImOnline(runtime_types::pallet_im_online::pallet::Call), + #[codec(index = 14)] + Democracy(runtime_types::pallet_democracy::pallet::Call), + #[codec(index = 15)] + Council(runtime_types::pallet_collective::pallet::Call), + #[codec(index = 16)] + TechnicalCommittee(runtime_types::pallet_collective::pallet::Call), + #[codec(index = 17)] + PhragmenElection(runtime_types::pallet_elections_phragmen::pallet::Call), + #[codec(index = 18)] + TechnicalMembership(runtime_types::pallet_membership::pallet::Call), + #[codec(index = 19)] + Treasury(runtime_types::pallet_treasury::pallet::Call), + #[codec(index = 20)] + ConvictionVoting(runtime_types::pallet_conviction_voting::pallet::Call), + #[codec(index = 21)] + Referenda(runtime_types::pallet_referenda::pallet::Call), + #[codec(index = 23)] + Whitelist(runtime_types::pallet_whitelist::pallet::Call), + #[codec(index = 24)] + Claims(runtime_types::polkadot_runtime_common::claims::pallet::Call), + #[codec(index = 25)] + Vesting(runtime_types::pallet_vesting::pallet::Call), + #[codec(index = 26)] + Utility(runtime_types::pallet_utility::pallet::Call), + #[codec(index = 28)] + Identity(runtime_types::pallet_identity::pallet::Call), + #[codec(index = 29)] + Proxy(runtime_types::pallet_proxy::pallet::Call), + #[codec(index = 30)] + Multisig(runtime_types::pallet_multisig::pallet::Call), + #[codec(index = 34)] + Bounties(runtime_types::pallet_bounties::pallet::Call), + #[codec(index = 38)] + ChildBounties(runtime_types::pallet_child_bounties::pallet::Call), + #[codec(index = 35)] + Tips(runtime_types::pallet_tips::pallet::Call), + #[codec(index = 36)] + ElectionProviderMultiPhase( + runtime_types::pallet_election_provider_multi_phase::pallet::Call, + ), + #[codec(index = 37)] + VoterList(runtime_types::pallet_bags_list::pallet::Call), + #[codec(index = 39)] + NominationPools(runtime_types::pallet_nomination_pools::pallet::Call), + #[codec(index = 40)] + FastUnstake(runtime_types::pallet_fast_unstake::pallet::Call), + #[codec(index = 51)] + Configuration( + runtime_types::polkadot_runtime_parachains::configuration::pallet::Call, + ), + #[codec(index = 52)] + ParasShared(runtime_types::polkadot_runtime_parachains::shared::pallet::Call), + #[codec(index = 53)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Call), + #[codec(index = 54)] + ParaInherent( + runtime_types::polkadot_runtime_parachains::paras_inherent::pallet::Call, + ), + #[codec(index = 56)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Call), + #[codec(index = 57)] + Initializer(runtime_types::polkadot_runtime_parachains::initializer::pallet::Call), + #[codec(index = 60)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Call), + #[codec(index = 62)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Call), + #[codec(index = 63)] + ParasSlashing( + runtime_types::polkadot_runtime_parachains::disputes::slashing::pallet::Call, + ), + #[codec(index = 70)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Call), + #[codec(index = 71)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Call), + #[codec(index = 72)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Call), + #[codec(index = 73)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Call), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Call), + #[codec(index = 100)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Call), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeEvent { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Event), + #[codec(index = 1)] + Scheduler(runtime_types::pallet_scheduler::pallet::Event), + #[codec(index = 10)] + Preimage(runtime_types::pallet_preimage::pallet::Event), + #[codec(index = 4)] + Indices(runtime_types::pallet_indices::pallet::Event), + #[codec(index = 5)] + Balances(runtime_types::pallet_balances::pallet::Event), + #[codec(index = 32)] + TransactionPayment(runtime_types::pallet_transaction_payment::pallet::Event), + #[codec(index = 7)] + Staking(runtime_types::pallet_staking::pallet::pallet::Event), + #[codec(index = 8)] + Offences(runtime_types::pallet_offences::pallet::Event), + #[codec(index = 9)] + Session(runtime_types::pallet_session::pallet::Event), + #[codec(index = 11)] + Grandpa(runtime_types::pallet_grandpa::pallet::Event), + #[codec(index = 12)] + ImOnline(runtime_types::pallet_im_online::pallet::Event), + #[codec(index = 14)] + Democracy(runtime_types::pallet_democracy::pallet::Event), + #[codec(index = 15)] + Council(runtime_types::pallet_collective::pallet::Event), + #[codec(index = 16)] + TechnicalCommittee(runtime_types::pallet_collective::pallet::Event), + #[codec(index = 17)] + PhragmenElection(runtime_types::pallet_elections_phragmen::pallet::Event), + #[codec(index = 18)] + TechnicalMembership(runtime_types::pallet_membership::pallet::Event), + #[codec(index = 19)] + Treasury(runtime_types::pallet_treasury::pallet::Event), + #[codec(index = 20)] + ConvictionVoting(runtime_types::pallet_conviction_voting::pallet::Event), + #[codec(index = 21)] + Referenda(runtime_types::pallet_referenda::pallet::Event), + #[codec(index = 23)] + Whitelist(runtime_types::pallet_whitelist::pallet::Event), + #[codec(index = 24)] + Claims(runtime_types::polkadot_runtime_common::claims::pallet::Event), + #[codec(index = 25)] + Vesting(runtime_types::pallet_vesting::pallet::Event), + #[codec(index = 26)] + Utility(runtime_types::pallet_utility::pallet::Event), + #[codec(index = 28)] + Identity(runtime_types::pallet_identity::pallet::Event), + #[codec(index = 29)] + Proxy(runtime_types::pallet_proxy::pallet::Event), + #[codec(index = 30)] + Multisig(runtime_types::pallet_multisig::pallet::Event), + #[codec(index = 34)] + Bounties(runtime_types::pallet_bounties::pallet::Event), + #[codec(index = 38)] + ChildBounties(runtime_types::pallet_child_bounties::pallet::Event), + #[codec(index = 35)] + Tips(runtime_types::pallet_tips::pallet::Event), + #[codec(index = 36)] + ElectionProviderMultiPhase( + runtime_types::pallet_election_provider_multi_phase::pallet::Event, + ), + #[codec(index = 37)] + VoterList(runtime_types::pallet_bags_list::pallet::Event), + #[codec(index = 39)] + NominationPools(runtime_types::pallet_nomination_pools::pallet::Event), + #[codec(index = 40)] + FastUnstake(runtime_types::pallet_fast_unstake::pallet::Event), + #[codec(index = 53)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Event), + #[codec(index = 56)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Event), + #[codec(index = 60)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Event), + #[codec(index = 62)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Event), + #[codec(index = 70)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Event), + #[codec(index = 71)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Event), + #[codec(index = 72)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Event), + #[codec(index = 73)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Event), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Event), + #[codec(index = 100)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Event), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionKeys { + pub grandpa: runtime_types::sp_consensus_grandpa::app::Public, + pub babe: runtime_types::sp_consensus_babe::app::Public, + pub im_online: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + pub para_validator: runtime_types::polkadot_primitives::v4::validator_app::Public, + pub para_assignment: runtime_types::polkadot_primitives::v4::assignment_app::Public, + pub authority_discovery: runtime_types::sp_authority_discovery::app::Public, + } + } + pub mod polkadot_runtime_common { + use super::runtime_types; + pub mod auctions { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + new_auction { + #[codec(compact)] + duration: ::core::primitive::u32, + #[codec(compact)] + lease_period_index: ::core::primitive::u32, + }, + #[codec(index = 1)] + bid { + #[codec(compact)] + para: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + auction_index: ::core::primitive::u32, + #[codec(compact)] + first_slot: ::core::primitive::u32, + #[codec(compact)] + last_slot: ::core::primitive::u32, + #[codec(compact)] + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + cancel_auction, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + AuctionInProgress, + #[codec(index = 1)] + LeasePeriodInPast, + #[codec(index = 2)] + ParaNotRegistered, + #[codec(index = 3)] + NotCurrentAuction, + #[codec(index = 4)] + NotAuction, + #[codec(index = 5)] + AuctionEnded, + #[codec(index = 6)] + AlreadyLeasedOut, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + AuctionStarted { + auction_index: ::core::primitive::u32, + lease_period: ::core::primitive::u32, + ending: ::core::primitive::u32, + }, + #[codec(index = 1)] + AuctionClosed { auction_index: ::core::primitive::u32 }, + #[codec(index = 2)] + Reserved { + bidder: ::sp_core::crypto::AccountId32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + Unreserved { + bidder: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + ReserveConfiscated { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + BidAccepted { + bidder: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + first_slot: ::core::primitive::u32, + last_slot: ::core::primitive::u32, + }, + #[codec(index = 6)] + WinningOffset { + auction_index: ::core::primitive::u32, + block_number: ::core::primitive::u32, + }, + } + } + } + pub mod claims { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim { + dest: ::sp_core::crypto::AccountId32, + ethereum_signature: + runtime_types::polkadot_runtime_common::claims::EcdsaSignature, + }, + #[codec(index = 1)] + mint_claim { + who: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + value: ::core::primitive::u128, + vesting_schedule: ::core::option::Option<( + ::core::primitive::u128, + ::core::primitive::u128, + ::core::primitive::u32, + )>, + statement: ::core::option::Option< + runtime_types::polkadot_runtime_common::claims::StatementKind, + >, + }, + #[codec(index = 2)] + claim_attest { + dest: ::sp_core::crypto::AccountId32, + ethereum_signature: + runtime_types::polkadot_runtime_common::claims::EcdsaSignature, + statement: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 3)] + attest { statement: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + move_claim { + old: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + new: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + maybe_preclaim: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEthereumSignature, + #[codec(index = 1)] + SignerHasNoClaim, + #[codec(index = 2)] + SenderHasNoClaim, + #[codec(index = 3)] + PotUnderflow, + #[codec(index = 4)] + InvalidStatement, + #[codec(index = 5)] + VestedBalanceExists, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Claimed { + who: ::sp_core::crypto::AccountId32, + ethereum_address: + runtime_types::polkadot_runtime_common::claims::EthereumAddress, + amount: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EcdsaSignature(pub [::core::primitive::u8; 65usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EthereumAddress(pub [::core::primitive::u8; 20usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PrevalidateAttests; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StatementKind { + #[codec(index = 0)] + Regular, + #[codec(index = 1)] + Saft, + } + } + pub mod crowdloan { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + create { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 1)] + contribute { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + value: ::core::primitive::u128, + signature: + ::core::option::Option, + }, + #[codec(index = 2)] + withdraw { + who: ::sp_core::crypto::AccountId32, + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 3)] + refund { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + dissolve { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + edit { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 6)] + add_memo { + index: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 7)] + poke { index: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + contribute_all { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + signature: + ::core::option::Option, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FirstPeriodInPast, + #[codec(index = 1)] + FirstPeriodTooFarInFuture, + #[codec(index = 2)] + LastPeriodBeforeFirstPeriod, + #[codec(index = 3)] + LastPeriodTooFarInFuture, + #[codec(index = 4)] + CannotEndInPast, + #[codec(index = 5)] + EndTooFarInFuture, + #[codec(index = 6)] + Overflow, + #[codec(index = 7)] + ContributionTooSmall, + #[codec(index = 8)] + InvalidParaId, + #[codec(index = 9)] + CapExceeded, + #[codec(index = 10)] + ContributionPeriodOver, + #[codec(index = 11)] + InvalidOrigin, + #[codec(index = 12)] + NotParachain, + #[codec(index = 13)] + LeaseActive, + #[codec(index = 14)] + BidOrLeaseActive, + #[codec(index = 15)] + FundNotEnded, + #[codec(index = 16)] + NoContributions, + #[codec(index = 17)] + NotReadyToDissolve, + #[codec(index = 18)] + InvalidSignature, + #[codec(index = 19)] + MemoTooLarge, + #[codec(index = 20)] + AlreadyInNewRaise, + #[codec(index = 21)] + VrfDelayInProgress, + #[codec(index = 22)] + NoLeasePeriod, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Created { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 1)] + Contributed { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Withdrew { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + PartiallyRefunded { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + AllRefunded { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + Dissolved { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 6)] + HandleBidResult { + para_id: runtime_types::polkadot_parachain::primitives::Id, + result: ::core::result::Result< + (), + runtime_types::sp_runtime::DispatchError, + >, + }, + #[codec(index = 7)] + Edited { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + MemoUpdated { + who: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 9)] + AddedToNewRaise { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct FundInfo<_0, _1, _2, _3> { + pub depositor: _0, + pub verifier: ::core::option::Option, + pub deposit: _1, + pub raised: _1, + pub end: _2, + pub cap: _1, + pub last_contribution: + runtime_types::polkadot_runtime_common::crowdloan::LastContribution<_2>, + pub first_period: _2, + pub last_period: _2, + pub fund_index: _2, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_3>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum LastContribution<_0> { + #[codec(index = 0)] + Never, + #[codec(index = 1)] + PreEnding(_0), + #[codec(index = 2)] + Ending(_0), + } + } + pub mod paras_registrar { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register { + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_register { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 2)] + deregister { id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 3)] + swap { + id: runtime_types::polkadot_parachain::primitives::Id, + other: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + remove_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + reserve, + #[codec(index = 6)] + add_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 7)] + schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 8)] + set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + AlreadyRegistered, + #[codec(index = 2)] + NotOwner, + #[codec(index = 3)] + CodeTooLarge, + #[codec(index = 4)] + HeadDataTooLarge, + #[codec(index = 5)] + NotParachain, + #[codec(index = 6)] + NotParathread, + #[codec(index = 7)] + CannotDeregister, + #[codec(index = 8)] + CannotDowngrade, + #[codec(index = 9)] + CannotUpgrade, + #[codec(index = 10)] + ParaLocked, + #[codec(index = 11)] + NotReserved, + #[codec(index = 12)] + EmptyCode, + #[codec(index = 13)] + CannotSwap, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Registered { + para_id: runtime_types::polkadot_parachain::primitives::Id, + manager: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 1)] + Deregistered { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + Reserved { + para_id: runtime_types::polkadot_parachain::primitives::Id, + who: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Swapped { + para_id: runtime_types::polkadot_parachain::primitives::Id, + other_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaInfo<_0, _1> { + pub manager: _0, + pub deposit: _1, + pub locked: ::core::primitive::bool, + } + } + pub mod slots { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_lease { + para: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + }, + #[codec(index = 1)] + clear_all_leases { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + trigger_onboard { para: runtime_types::polkadot_parachain::primitives::Id }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaNotOnboarding, + #[codec(index = 1)] + LeaseError, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewLeasePeriod { lease_period: ::core::primitive::u32 }, + #[codec(index = 1)] + Leased { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + } + } + } + } + pub mod polkadot_runtime_parachains { + use super::runtime_types; + pub mod configuration { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] set_validation_upgrade_cooldown { new : :: core :: primitive :: u32 , } , # [codec (index = 1)] set_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 2)] set_code_retention_period { new : :: core :: primitive :: u32 , } , # [codec (index = 3)] set_max_code_size { new : :: core :: primitive :: u32 , } , # [codec (index = 4)] set_max_pov_size { new : :: core :: primitive :: u32 , } , # [codec (index = 5)] set_max_head_data_size { new : :: core :: primitive :: u32 , } , # [codec (index = 6)] set_parathread_cores { new : :: core :: primitive :: u32 , } , # [codec (index = 7)] set_parathread_retries { new : :: core :: primitive :: u32 , } , # [codec (index = 8)] set_group_rotation_frequency { new : :: core :: primitive :: u32 , } , # [codec (index = 9)] set_chain_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 10)] set_thread_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 11)] set_scheduling_lookahead { new : :: core :: primitive :: u32 , } , # [codec (index = 12)] set_max_validators_per_core { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 13)] set_max_validators { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 14)] set_dispute_period { new : :: core :: primitive :: u32 , } , # [codec (index = 15)] set_dispute_post_conclusion_acceptance_period { new : :: core :: primitive :: u32 , } , # [codec (index = 18)] set_no_show_slots { new : :: core :: primitive :: u32 , } , # [codec (index = 19)] set_n_delay_tranches { new : :: core :: primitive :: u32 , } , # [codec (index = 20)] set_zeroth_delay_tranche_width { new : :: core :: primitive :: u32 , } , # [codec (index = 21)] set_needed_approvals { new : :: core :: primitive :: u32 , } , # [codec (index = 22)] set_relay_vrf_modulo_samples { new : :: core :: primitive :: u32 , } , # [codec (index = 23)] set_max_upward_queue_count { new : :: core :: primitive :: u32 , } , # [codec (index = 24)] set_max_upward_queue_size { new : :: core :: primitive :: u32 , } , # [codec (index = 25)] set_max_downward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 27)] set_max_upward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 28)] set_max_upward_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 29)] set_hrmp_open_request_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 30)] set_hrmp_sender_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 31)] set_hrmp_recipient_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 32)] set_hrmp_channel_max_capacity { new : :: core :: primitive :: u32 , } , # [codec (index = 33)] set_hrmp_channel_max_total_size { new : :: core :: primitive :: u32 , } , # [codec (index = 34)] set_hrmp_max_parachain_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 35)] set_hrmp_max_parathread_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 36)] set_hrmp_channel_max_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 37)] set_hrmp_max_parachain_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 38)] set_hrmp_max_parathread_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 39)] set_hrmp_max_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 41)] set_pvf_checking_enabled { new : :: core :: primitive :: bool , } , # [codec (index = 42)] set_pvf_voting_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 43)] set_minimum_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 44)] set_bypass_consistency_check { new : :: core :: primitive :: bool , } , # [codec (index = 45)] set_async_backing_params { new : runtime_types :: polkadot_primitives :: vstaging :: AsyncBackingParams , } , # [codec (index = 46)] set_executor_params { new : runtime_types :: polkadot_primitives :: v4 :: executor_params :: ExecutorParams , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidNewValue, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HostConfiguration<_0> { + pub max_code_size: _0, + pub max_head_data_size: _0, + pub max_upward_queue_count: _0, + pub max_upward_queue_size: _0, + pub max_upward_message_size: _0, + pub max_upward_message_num_per_candidate: _0, + pub hrmp_max_message_num_per_candidate: _0, + pub validation_upgrade_cooldown: _0, + pub validation_upgrade_delay: _0, + pub async_backing_params: + runtime_types::polkadot_primitives::vstaging::AsyncBackingParams, + pub max_pov_size: _0, + pub max_downward_message_size: _0, + pub hrmp_max_parachain_outbound_channels: _0, + pub hrmp_max_parathread_outbound_channels: _0, + pub hrmp_sender_deposit: ::core::primitive::u128, + pub hrmp_recipient_deposit: ::core::primitive::u128, + pub hrmp_channel_max_capacity: _0, + pub hrmp_channel_max_total_size: _0, + pub hrmp_max_parachain_inbound_channels: _0, + pub hrmp_max_parathread_inbound_channels: _0, + pub hrmp_channel_max_message_size: _0, + pub executor_params: + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParams, + pub code_retention_period: _0, + pub parathread_cores: _0, + pub parathread_retries: _0, + pub group_rotation_frequency: _0, + pub chain_availability_period: _0, + pub thread_availability_period: _0, + pub scheduling_lookahead: _0, + pub max_validators_per_core: ::core::option::Option<_0>, + pub max_validators: ::core::option::Option<_0>, + pub dispute_period: _0, + pub dispute_post_conclusion_acceptance_period: _0, + pub no_show_slots: _0, + pub n_delay_tranches: _0, + pub zeroth_delay_tranche_width: _0, + pub needed_approvals: _0, + pub relay_vrf_modulo_samples: _0, + pub pvf_checking_enabled: ::core::primitive::bool, + pub pvf_voting_ttl: _0, + pub minimum_validation_upgrade_delay: _0, + } + } + pub mod disputes { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_unfreeze, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DuplicateDisputeStatementSets, + #[codec(index = 1)] + AncientDisputeStatement, + #[codec(index = 2)] + ValidatorIndexOutOfBounds, + #[codec(index = 3)] + InvalidSignature, + #[codec(index = 4)] + DuplicateStatement, + #[codec(index = 5)] + SingleSidedDispute, + #[codec(index = 6)] + MaliciousBacker, + #[codec(index = 7)] + MissingBackingVotes, + #[codec(index = 8)] + UnconfirmedDispute, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + DisputeInitiated( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeLocation, + ), + #[codec(index = 1)] + DisputeConcluded( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeResult, + ), + #[codec(index = 2)] + Revert(::core::primitive::u32), + } + } + pub mod slashing { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Call { + # [codec (index = 0)] report_dispute_lost_unsigned { dispute_proof : :: std :: boxed :: Box < runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputeProof > , key_owner_proof : :: sp_session :: MembershipProof , } , } + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Error { + #[codec(index = 0)] + InvalidKeyOwnershipProof, + #[codec(index = 1)] + InvalidSessionIndex, + #[codec(index = 2)] + InvalidCandidateHash, + #[codec(index = 3)] + InvalidValidatorIndex, + #[codec(index = 4)] + ValidatorIndexIdMismatch, + #[codec(index = 5)] + DuplicateSlashingReport, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeProof { pub time_slot : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputesTimeSlot , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , pub validator_index : runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , pub validator_id : runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputesTimeSlot { + pub session_index: ::core::primitive::u32, + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PendingSlashes { pub keys : :: subxt :: utils :: KeyedVec < runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public > , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum SlashingOffenceKind { + #[codec(index = 0)] + ForInvalid, + #[codec(index = 1)] + AgainstValid, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeLocation { + #[codec(index = 0)] + Local, + #[codec(index = 1)] + Remote, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeResult { + #[codec(index = 0)] + Valid, + #[codec(index = 1)] + Invalid, + } + } + pub mod hrmp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + hrmp_init_open_channel { + recipient: runtime_types::polkadot_parachain::primitives::Id, + proposed_max_capacity: ::core::primitive::u32, + proposed_max_message_size: ::core::primitive::u32, + }, + #[codec(index = 1)] + hrmp_accept_open_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 2)] + hrmp_close_channel { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + }, + #[codec(index = 3)] + force_clean_hrmp { + para: runtime_types::polkadot_parachain::primitives::Id, + inbound: ::core::primitive::u32, + outbound: ::core::primitive::u32, + }, + #[codec(index = 4)] + force_process_hrmp_open { channels: ::core::primitive::u32 }, + #[codec(index = 5)] + force_process_hrmp_close { channels: ::core::primitive::u32 }, + #[codec(index = 6)] + hrmp_cancel_open_request { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + open_requests: ::core::primitive::u32, + }, + #[codec(index = 7)] + force_open_hrmp_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + recipient: runtime_types::polkadot_parachain::primitives::Id, + max_capacity: ::core::primitive::u32, + max_message_size: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + OpenHrmpChannelToSelf, + #[codec(index = 1)] + OpenHrmpChannelInvalidRecipient, + #[codec(index = 2)] + OpenHrmpChannelZeroCapacity, + #[codec(index = 3)] + OpenHrmpChannelCapacityExceedsLimit, + #[codec(index = 4)] + OpenHrmpChannelZeroMessageSize, + #[codec(index = 5)] + OpenHrmpChannelMessageSizeExceedsLimit, + #[codec(index = 6)] + OpenHrmpChannelAlreadyExists, + #[codec(index = 7)] + OpenHrmpChannelAlreadyRequested, + #[codec(index = 8)] + OpenHrmpChannelLimitExceeded, + #[codec(index = 9)] + AcceptHrmpChannelDoesntExist, + #[codec(index = 10)] + AcceptHrmpChannelAlreadyConfirmed, + #[codec(index = 11)] + AcceptHrmpChannelLimitExceeded, + #[codec(index = 12)] + CloseHrmpChannelUnauthorized, + #[codec(index = 13)] + CloseHrmpChannelDoesntExist, + #[codec(index = 14)] + CloseHrmpChannelAlreadyUnderway, + #[codec(index = 15)] + CancelHrmpOpenChannelUnauthorized, + #[codec(index = 16)] + OpenHrmpChannelDoesntExist, + #[codec(index = 17)] + OpenHrmpChannelAlreadyConfirmed, + #[codec(index = 18)] + WrongWitness, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + OpenChannelRequested( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + #[codec(index = 1)] + OpenChannelCanceled( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 2)] + OpenChannelAccepted( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 3)] + ChannelClosed( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 4)] + HrmpChannelForceOpened( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannel { + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + pub max_message_size: ::core::primitive::u32, + pub msg_count: ::core::primitive::u32, + pub total_size: ::core::primitive::u32, + pub mqc_head: ::core::option::Option<::subxt::utils::H256>, + pub sender_deposit: ::core::primitive::u128, + pub recipient_deposit: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpOpenChannelRequest { + pub confirmed: ::core::primitive::bool, + pub _age: ::core::primitive::u32, + pub sender_deposit: ::core::primitive::u128, + pub max_message_size: ::core::primitive::u32, + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + } + } + pub mod inclusion { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnsortedOrDuplicateValidatorIndices, + #[codec(index = 1)] + UnsortedOrDuplicateDisputeStatementSet, + #[codec(index = 2)] + UnsortedOrDuplicateBackedCandidates, + #[codec(index = 3)] + UnexpectedRelayParent, + #[codec(index = 4)] + WrongBitfieldSize, + #[codec(index = 5)] + BitfieldAllZeros, + #[codec(index = 6)] + BitfieldDuplicateOrUnordered, + #[codec(index = 7)] + ValidatorIndexOutOfBounds, + #[codec(index = 8)] + InvalidBitfieldSignature, + #[codec(index = 9)] + UnscheduledCandidate, + #[codec(index = 10)] + CandidateScheduledBeforeParaFree, + #[codec(index = 11)] + WrongCollator, + #[codec(index = 12)] + ScheduledOutOfOrder, + #[codec(index = 13)] + HeadDataTooLarge, + #[codec(index = 14)] + PrematureCodeUpgrade, + #[codec(index = 15)] + NewCodeTooLarge, + #[codec(index = 16)] + CandidateNotInParentContext, + #[codec(index = 17)] + InvalidGroupIndex, + #[codec(index = 18)] + InsufficientBacking, + #[codec(index = 19)] + InvalidBacking, + #[codec(index = 20)] + NotCollatorSigned, + #[codec(index = 21)] + ValidationDataHashMismatch, + #[codec(index = 22)] + IncorrectDownwardMessageHandling, + #[codec(index = 23)] + InvalidUpwardMessages, + #[codec(index = 24)] + HrmpWatermarkMishandling, + #[codec(index = 25)] + InvalidOutboundHrmp, + #[codec(index = 26)] + InvalidValidationCodeHash, + #[codec(index = 27)] + ParaHeadMismatch, + #[codec(index = 28)] + BitfieldReferencesFreedCore, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CandidateBacked( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 1)] + CandidateIncluded( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 2)] + CandidateTimedOut( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + ), + #[codec(index = 3)] + UpwardMessagesReceived { + from: runtime_types::polkadot_parachain::primitives::Id, + count: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AggregateMessageOrigin { + #[codec(index = 0)] + Ump(runtime_types::polkadot_runtime_parachains::inclusion::UmpQueueId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfieldRecord<_0> { + pub bitfield: runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + pub submitted_at: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidatePendingAvailability<_0, _1> { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub availability_votes: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub backers: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub relay_parent_number: _1, + pub backed_in_number: _1, + pub backing_group: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UmpQueueId { + #[codec(index = 0)] + Para(runtime_types::polkadot_parachain::primitives::Id), + } + } + pub mod initializer { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_approve { up_to: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BufferedSessionChange { + pub validators: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub queued: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub session_index: ::core::primitive::u32, + } + } + pub mod origin { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Parachain(runtime_types::polkadot_parachain::primitives::Id), + } + } + } + pub mod paras { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_set_current_code { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 2)] + force_schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + relay_parent_number: ::core::primitive::u32, + }, + #[codec(index = 3)] + force_note_new_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 4)] + force_queue_action { + para: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + add_trusted_validation_code { + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 6)] + poke_unused_validation_code { + validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + }, + #[codec(index = 7)] + include_pvf_check_statement { + stmt: runtime_types::polkadot_primitives::v4::PvfCheckStatement, + signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + CannotOnboard, + #[codec(index = 2)] + CannotOffboard, + #[codec(index = 3)] + CannotUpgrade, + #[codec(index = 4)] + CannotDowngrade, + #[codec(index = 5)] + PvfCheckStatementStale, + #[codec(index = 6)] + PvfCheckStatementFuture, + #[codec(index = 7)] + PvfCheckValidatorIndexOutOfBounds, + #[codec(index = 8)] + PvfCheckInvalidSignature, + #[codec(index = 9)] + PvfCheckDoubleVote, + #[codec(index = 10)] + PvfCheckSubjectInvalid, + #[codec(index = 11)] + CannotUpgradeCode, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CurrentCodeUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + CurrentHeadUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 2)] + CodeUpgradeScheduled(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 3)] + NewHeadNoted(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 4)] + ActionQueued( + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ), + #[codec(index = 5)] + PvfCheckStarted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 6)] + PvfCheckAccepted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 7)] + PvfCheckRejected( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaGenesisArgs { + pub genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + pub validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + pub para_kind: ::core::primitive::bool, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ParaLifecycle { + #[codec(index = 0)] + Onboarding, + #[codec(index = 1)] + Parathread, + #[codec(index = 2)] + Parachain, + #[codec(index = 3)] + UpgradingParathread, + #[codec(index = 4)] + DowngradingParachain, + #[codec(index = 5)] + OffboardingParathread, + #[codec(index = 6)] + OffboardingParachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaPastCodeMeta<_0> { + pub upgrade_times: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::ReplacementTimes<_0>, + >, + pub last_pruned: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckActiveVoteState<_0> { + pub votes_accept: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub votes_reject: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub age: _0, + pub created_at: _0, + pub causes: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::PvfCheckCause<_0>, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfCheckCause<_0> { + #[codec(index = 0)] + Onboarding(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + Upgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + relay_parent_number: _0, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReplacementTimes<_0> { + pub expected_at: _0, + pub activated_at: _0, + } + } + pub mod paras_inherent { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + enter { + data: runtime_types::polkadot_primitives::v4::InherentData< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyInclusionInherents, + #[codec(index = 1)] + InvalidParentHeader, + #[codec(index = 2)] + CandidateConcludedInvalid, + #[codec(index = 3)] + InherentOverweight, + #[codec(index = 4)] + DisputeStatementsUnsortedOrDuplicates, + #[codec(index = 5)] + DisputeInvalid, + } + } + } + pub mod scheduler { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssignmentKind { + #[codec(index = 0)] + Parachain, + #[codec(index = 1)] + Parathread( + runtime_types::polkadot_primitives::v4::collator_app::Public, + ::core::primitive::u32, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CoreAssignment { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub kind: runtime_types::polkadot_runtime_parachains::scheduler::AssignmentKind, + pub group_idx: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaimQueue { + pub queue: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::scheduler::QueuedParathread, + >, + pub next_core_offset: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueuedParathread { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadEntry, + pub core_offset: ::core::primitive::u32, + } + } + pub mod shared { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + } + } + } + pub mod sp_arithmetic { + use super::runtime_types; + pub mod fixed_point { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct FixedI64(pub ::core::primitive::i64); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct FixedU128(pub ::core::primitive::u128); + } + pub mod per_things { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct PerU16(pub ::core::primitive::u16); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Perbill(pub ::core::primitive::u32); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Percent(pub ::core::primitive::u8); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Permill(pub ::core::primitive::u32); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ArithmeticError { + #[codec(index = 0)] + Underflow, + #[codec(index = 1)] + Overflow, + #[codec(index = 2)] + DivisionByZero, + } + } + pub mod sp_authority_discovery { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + } + pub mod sp_consensus_babe { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod digests { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NextConfigDescriptor { + #[codec(index = 1)] + V1 { + c: (::core::primitive::u64, ::core::primitive::u64), + allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PreDigest { + #[codec(index = 1)] + Primary(runtime_types::sp_consensus_babe::digests::PrimaryPreDigest), + #[codec(index = 2)] + SecondaryPlain( + runtime_types::sp_consensus_babe::digests::SecondaryPlainPreDigest, + ), + #[codec(index = 3)] + SecondaryVRF(runtime_types::sp_consensus_babe::digests::SecondaryVRFPreDigest), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PrimaryPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryPlainPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryVRFPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AllowedSlots { + #[codec(index = 0)] + PrimarySlots, + #[codec(index = 1)] + PrimaryAndSecondaryPlainSlots, + #[codec(index = 2)] + PrimaryAndSecondaryVRFSlots, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BabeEpochConfiguration { + pub c: (::core::primitive::u64, ::core::primitive::u64), + pub allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + } + } + pub mod sp_consensus_grandpa { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::ed25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::ed25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Equivocation<_0, _1> { + #[codec(index = 0)] + Prevote( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Prevote<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + #[codec(index = 1)] + Precommit( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Precommit<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + } + } + pub mod sp_consensus_slots { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EquivocationProof<_0, _1> { + pub offender: _1, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub first_header: _0, + pub second_header: _0, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Slot(pub ::core::primitive::u64); + } + pub mod sp_core { + use super::runtime_types; + pub mod crypto { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct KeyTypeId(pub [::core::primitive::u8; 4usize]); + } + pub mod ecdsa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 33usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 65usize]); + } + pub mod ed25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + pub mod offchain { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueMultiaddr(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueNetworkState { + pub peer_id: runtime_types::sp_core::OpaquePeerId, + pub external_addresses: + ::std::vec::Vec, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod vrf { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VrfSignature { + pub output: [::core::primitive::u8; 32usize], + pub proof: [::core::primitive::u8; 64usize], + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaquePeerId(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Void {} + } + pub mod sp_npos_elections { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ElectionScore { + pub minimal_stake: ::core::primitive::u128, + pub sum_stake: ::core::primitive::u128, + pub sum_stake_squared: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Support<_0> { + pub total: ::core::primitive::u128, + pub voters: ::std::vec::Vec<(_0, ::core::primitive::u128)>, + } + } + pub mod sp_runtime { + use super::runtime_types; + pub mod generic { + use super::runtime_types; + pub mod digest { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DigestItem { + #[codec(index = 6)] + PreRuntime( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 4)] + Consensus( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 5)] + Seal( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 0)] + Other(::std::vec::Vec<::core::primitive::u8>), + #[codec(index = 8)] + RuntimeEnvironmentUpdated, + } + } + pub mod unchecked_extrinsic { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedExtrinsic<_0, _1, _2, _3>( + pub ::std::vec::Vec<::core::primitive::u8>, + #[codec(skip)] pub ::core::marker::PhantomData<(_1, _0, _2, _3)>, + ); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchError { + #[codec(index = 0)] + Other, + #[codec(index = 1)] + CannotLookup, + #[codec(index = 2)] + BadOrigin, + #[codec(index = 3)] + Module(runtime_types::sp_runtime::ModuleError), + #[codec(index = 4)] + ConsumerRemaining, + #[codec(index = 5)] + NoProviders, + #[codec(index = 6)] + TooManyConsumers, + #[codec(index = 7)] + Token(runtime_types::sp_runtime::TokenError), + #[codec(index = 8)] + Arithmetic(runtime_types::sp_arithmetic::ArithmeticError), + #[codec(index = 9)] + Transactional(runtime_types::sp_runtime::TransactionalError), + #[codec(index = 10)] + Exhausted, + #[codec(index = 11)] + Corruption, + #[codec(index = 12)] + Unavailable, + #[codec(index = 13)] + RootNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchErrorWithPostInfo<_0> { + pub post_info: _0, + pub error: runtime_types::sp_runtime::DispatchError, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ModuleError { + pub index: ::core::primitive::u8, + pub error: [::core::primitive::u8; 4usize], + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSignature { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Signature), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Signature), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Signature), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSigner { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Public), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Public), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Public), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TokenError { + #[codec(index = 0)] + FundsUnavailable, + #[codec(index = 1)] + OnlyProvider, + #[codec(index = 2)] + BelowMinimum, + #[codec(index = 3)] + CannotCreate, + #[codec(index = 4)] + UnknownAsset, + #[codec(index = 5)] + Frozen, + #[codec(index = 6)] + Unsupported, + #[codec(index = 7)] + CannotCreateHold, + #[codec(index = 8)] + NotExpendable, + #[codec(index = 9)] + Blocked, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionalError { + #[codec(index = 0)] + LimitReached, + #[codec(index = 1)] + NoLayer, + } + } + pub mod sp_staking { + use super::runtime_types; + pub mod offence { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OffenceDetails<_0, _1> { + pub offender: _1, + pub reporters: ::std::vec::Vec<_0>, + } + } + } + pub mod sp_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeVersion { + pub spec_name: ::std::string::String, + pub impl_name: ::std::string::String, + pub authoring_version: ::core::primitive::u32, + pub spec_version: ::core::primitive::u32, + pub impl_version: ::core::primitive::u32, + pub apis: + ::std::vec::Vec<([::core::primitive::u8; 8usize], ::core::primitive::u32)>, + pub transaction_version: ::core::primitive::u32, + pub state_version: ::core::primitive::u8, + } + } + pub mod sp_weights { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeDbWeight { + pub read: ::core::primitive::u64, + pub write: ::core::primitive::u64, + } + } + pub mod xcm { + use super::runtime_types; + pub mod double_encoded { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DoubleEncoded { + pub encoded: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod v2 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: runtime_types::xcm::v2::NetworkId, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: runtime_types::xcm::v2::NetworkId, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: runtime_types::xcm::v2::NetworkId, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v2::BodyId, + part: runtime_types::xcm::v2::BodyPart, + }, + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + #[codec(index = 6)] + Blob(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v2::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v2::multiasset::AssetId, + pub fun: runtime_types::xcm::v2::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v2::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v2::multiasset::AssetId, + fun: runtime_types::xcm::v2::multiasset::WildFungibility, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v2::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v2::multilocation::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + MultiLocationFull, + #[codec(index = 5)] + MultiLocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + UnhandledXcmVersion, + #[codec(index = 23)] + WeightLimitReached(::core::primitive::u64), + #[codec(index = 24)] + Barrier, + #[codec(index = 25)] + WeightNotComputable, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v2::Response, + #[codec(compact)] + max_weight: ::core::primitive::u64, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_type: runtime_types::xcm::v2::OriginKind, + #[codec(compact)] + require_weight_at_most: ::core::primitive::u64, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v2::multilocation::Junctions), + #[codec(index = 12)] + ReportError { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + receive: runtime_types::xcm::v2::multiasset::MultiAssets, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 18)] + QueryHolding { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v2::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v2::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v2::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v2::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + ticket: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 27)] + UnsubscribeVersion, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginKind { + #[codec(index = 0)] + Native, + #[codec(index = 1)] + SovereignAccount, + #[codec(index = 2)] + Superuser, + #[codec(index = 3)] + Xcm, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v2::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(#[codec(compact)] ::core::primitive::u64), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + pub mod v3 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Moniker([::core::primitive::u8; 4usize]), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: + ::core::option::Option, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: + ::core::option::Option, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: + ::core::option::Option, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey { + length: ::core::primitive::u8, + data: [::core::primitive::u8; 32usize], + }, + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v3::junction::BodyId, + part: runtime_types::xcm::v3::junction::BodyPart, + }, + #[codec(index = 9)] + GlobalConsensus(runtime_types::xcm::v3::junction::NetworkId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + ByGenesis([::core::primitive::u8; 32usize]), + #[codec(index = 1)] + ByFork { + block_number: ::core::primitive::u64, + block_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + #[codec(index = 4)] + Westend, + #[codec(index = 5)] + Rococo, + #[codec(index = 6)] + Wococo, + #[codec(index = 7)] + Ethereum { + #[codec(compact)] + chain_id: ::core::primitive::u64, + }, + #[codec(index = 8)] + BitcoinCore, + #[codec(index = 9)] + BitcoinCash, + } + } + pub mod junctions { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v3::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v3::multiasset::AssetId, + pub fun: runtime_types::xcm::v3::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v3::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + }, + #[codec(index = 2)] + AllCounted(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + AllOfCounted { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + #[codec(compact)] + count: ::core::primitive::u32, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v3::junctions::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + LocationFull, + #[codec(index = 5)] + LocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + ExpectationFalse, + #[codec(index = 23)] + PalletNotFound, + #[codec(index = 24)] + NameMismatch, + #[codec(index = 25)] + VersionIncompatible, + #[codec(index = 26)] + HoldingWouldOverflow, + #[codec(index = 27)] + ExportError, + #[codec(index = 28)] + ReanchorFailed, + #[codec(index = 29)] + NoDeal, + #[codec(index = 30)] + FeesNotMet, + #[codec(index = 31)] + LockError, + #[codec(index = 32)] + NoPermission, + #[codec(index = 33)] + Unanchored, + #[codec(index = 34)] + NotDepositable, + #[codec(index = 35)] + UnhandledXcmVersion, + #[codec(index = 36)] + WeightLimitReached(::sp_weights::Weight), + #[codec(index = 37)] + Barrier, + #[codec(index = 38)] + WeightNotComputable, + #[codec(index = 39)] + ExceedsStackLimit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Outcome { + #[codec(index = 0)] + Complete(::sp_weights::Weight), + #[codec(index = 1)] + Incomplete(::sp_weights::Weight, runtime_types::xcm::v3::traits::Error), + #[codec(index = 2)] + Error(runtime_types::xcm::v3::traits::Error), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v3::Response, + max_weight: ::sp_weights::Weight, + querier: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_kind: runtime_types::xcm::v2::OriginKind, + require_weight_at_most: ::sp_weights::Weight, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v3::junctions::Junctions), + #[codec(index = 12)] + ReportError(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + want: runtime_types::xcm::v3::multiasset::MultiAssets, + maximal: ::core::primitive::bool, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 18)] + ReportHolding { + response_info: runtime_types::xcm::v3::QueryResponseInfo, + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v3::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v3::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v3::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + ticket: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + max_response_weight: ::sp_weights::Weight, + }, + #[codec(index = 27)] + UnsubscribeVersion, + #[codec(index = 28)] + BurnAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 29)] + ExpectAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 30)] + ExpectOrigin( + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 31)] + ExpectError( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 32)] + ExpectTransactStatus(runtime_types::xcm::v3::MaybeErrorCode), + #[codec(index = 33)] + QueryPallet { + module_name: ::std::vec::Vec<::core::primitive::u8>, + response_info: runtime_types::xcm::v3::QueryResponseInfo, + }, + #[codec(index = 34)] + ExpectPallet { + #[codec(compact)] + index: ::core::primitive::u32, + name: ::std::vec::Vec<::core::primitive::u8>, + module_name: ::std::vec::Vec<::core::primitive::u8>, + #[codec(compact)] + crate_major: ::core::primitive::u32, + #[codec(compact)] + min_crate_minor: ::core::primitive::u32, + }, + #[codec(index = 35)] + ReportTransactStatus(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 36)] + ClearTransactStatus, + #[codec(index = 37)] + UniversalOrigin(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 38)] + ExportMessage { + network: runtime_types::xcm::v3::junction::NetworkId, + destination: runtime_types::xcm::v3::junctions::Junctions, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 39)] + LockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + unlocker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 40)] + UnlockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + target: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 41)] + NoteUnlockable { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + owner: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 42)] + RequestUnlock { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + locker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 43)] + SetFeesMode { jit_withdraw: ::core::primitive::bool }, + #[codec(index = 44)] + SetTopic([::core::primitive::u8; 32usize]), + #[codec(index = 45)] + ClearTopic, + #[codec(index = 46)] + AliasOrigin(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 47)] + UnpaidExecution { + weight_limit: runtime_types::xcm::v3::WeightLimit, + check_origin: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MaybeErrorCode { + #[codec(index = 0)] + Success, + #[codec(index = 1)] + Error( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + TruncatedError( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletInfo { + #[codec(compact)] + pub index: ::core::primitive::u32, + pub name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + pub module_name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + #[codec(compact)] + pub major: ::core::primitive::u32, + #[codec(compact)] + pub minor: ::core::primitive::u32, + #[codec(compact)] + pub patch: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueryResponseInfo { + pub destination: runtime_types::xcm::v3::multilocation::MultiLocation, + #[codec(compact)] + pub query_id: ::core::primitive::u64, + pub max_weight: ::sp_weights::Weight, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + #[codec(index = 4)] + PalletsInfo( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::xcm::v3::PalletInfo, + >, + ), + #[codec(index = 5)] + DispatchResult(runtime_types::xcm::v3::MaybeErrorCode), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(::sp_weights::Weight), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedAssetId { + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::AssetId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiAssets { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::MultiAssets), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiLocation { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedResponse { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Response), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Response), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedXcm { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Xcm), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Xcm), + } + } + } +} diff --git a/relays/client-polkadot/src/lib.rs b/relays/client-polkadot/src/lib.rs new file mode 100644 index 000000000000..d0f7a7cb686d --- /dev/null +++ b/relays/client-polkadot/src/lib.rs @@ -0,0 +1,134 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the Polkadot chain. + +mod codegen_runtime; + +use bp_polkadot::{AccountInfoStorageMapKeyProvider, POLKADOT_SYNCED_HEADERS_GRANDPA_INFO_METHOD}; +use bp_polkadot_core::SuffixedCommonSignedExtensionExt; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithGrandpa, ChainWithTransactions, Error as SubstrateError, + RelayChain, SignParam, UnderlyingChainProvider, UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount, MultiAddress}; +use sp_session::MembershipProof; +use std::time::Duration; + +pub use codegen_runtime::api::runtime_types; + +pub type RuntimeCall = runtime_types::polkadot_runtime::RuntimeCall; + +pub type GrandpaCall = runtime_types::pallet_grandpa::pallet::Call; + +/// Polkadot header id. +pub type HeaderId = relay_utils::HeaderId; + +/// Polkadot header type used in headers sync. +pub type SyncHeader = relay_substrate_client::SyncHeader; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Polkadot chain definition +#[derive(Debug, Clone, Copy)] +pub struct Polkadot; + +impl UnderlyingChainProvider for Polkadot { + type Chain = bp_polkadot::Polkadot; +} + +impl Chain for Polkadot { + const ID: ChainId = bp_runtime::POLKADOT_CHAIN_ID; + const NAME: &'static str = "Polkadot"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_polkadot::BEST_FINALIZED_POLKADOT_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(6); + + type SignedBlock = bp_polkadot::SignedBlock; + type Call = RuntimeCall; +} + +impl ChainWithGrandpa for Polkadot { + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str = + POLKADOT_SYNCED_HEADERS_GRANDPA_INFO_METHOD; + + type KeyOwnerProof = MembershipProof; +} + +impl ChainWithBalances for Polkadot { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl RelayChain for Polkadot { + const PARAS_PALLET_NAME: &'static str = bp_polkadot::PARAS_PALLET_NAME; +} + +impl ChainWithTransactions for Polkadot { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = + bp_polkadot_core::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + bp_polkadot::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + ((), ()), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(Self::SignedTransaction::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| *address == Address::Id(signer.public().into())) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} diff --git a/relays/client-rococo/Cargo.toml b/relays/client-rococo/Cargo.toml new file mode 100644 index 000000000000..b6d603d43648 --- /dev/null +++ b/relays/client-rococo/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "relay-rococo-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +subxt = { version = "0.32.1", default-features = false, features = ["native"] } + +# Bridge dependencies + +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-rococo = { path = "../../primitives/chain-rococo" } +bp-runtime = { path = "../../primitives/runtime" } + +relay-substrate-client = { path = "../client-substrate" } +relay-utils = { path = "../utils" } + +# Substrate Dependencies + +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-rococo/src/codegen_runtime.rs b/relays/client-rococo/src/codegen_runtime.rs new file mode 100644 index 000000000000..959812b11ba0 --- /dev/null +++ b/relays/client-rococo/src/codegen_runtime.rs @@ -0,0 +1,7441 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated runtime API +//! THIS FILE WAS AUTOGENERATED USING parity-bridges-common::runtime-codegen +//! EXECUTED COMMAND: target/debug/runtime-codegen --from-node-url wss://rococo-rpc.polkadot.io:443 + +#[allow(dead_code, unused_imports, non_camel_case_types)] +#[allow(clippy::all)] +pub mod api { + use super::api as root_mod; + pub mod runtime_types { + use super::runtime_types; + pub mod bounded_collections { + use super::runtime_types; + pub mod bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + pub mod weak_bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeakBoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + } + pub mod finality_grandpa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Equivocation<_0, _1, _2> { + pub round_number: ::core::primitive::u64, + pub identity: _0, + pub first: (_1, _2), + pub second: (_1, _2), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Precommit<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Prevote<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + } + pub mod frame_support { + use super::runtime_types; + pub mod dispatch { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchClass { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Operational, + #[codec(index = 2)] + Mandatory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchInfo { + pub weight: ::sp_weights::Weight, + pub class: runtime_types::frame_support::dispatch::DispatchClass, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Pays { + #[codec(index = 0)] + Yes, + #[codec(index = 1)] + No, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PerDispatchClass<_0> { + pub normal: _0, + pub operational: _0, + pub mandatory: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RawOrigin<_0> { + #[codec(index = 0)] + Root, + #[codec(index = 1)] + Signed(_0), + #[codec(index = 2)] + None, + } + } + pub mod traits { + use super::runtime_types; + pub mod messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProcessMessageError { + #[codec(index = 0)] + BadFormat, + #[codec(index = 1)] + Corrupt, + #[codec(index = 2)] + Unsupported, + #[codec(index = 3)] + Overweight(::sp_weights::Weight), + #[codec(index = 4)] + Yield, + } + } + pub mod misc { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WrapperOpaque<_0>( + #[codec(compact)] pub ::core::primitive::u32, + pub _0, + ); + } + pub mod preimages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Bounded<_0> { + #[codec(index = 0)] + Legacy { + hash: ::subxt::utils::H256, + }, + #[codec(index = 1)] + Inline( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Lookup { + hash: ::subxt::utils::H256, + len: ::core::primitive::u32, + }, + __Ignore(::core::marker::PhantomData<_0>), + } + } + pub mod tokens { + use super::runtime_types; + pub mod misc { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum BalanceStatus { + #[codec(index = 0)] + Free, + #[codec(index = 1)] + Reserved, + } + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletId(pub [::core::primitive::u8; 8usize]); + } + pub mod frame_system { + use super::runtime_types; + pub mod extensions { + use super::runtime_types; + pub mod check_genesis { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckGenesis; + } + pub mod check_mortality { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckMortality(pub ::sp_runtime::generic::Era); + } + pub mod check_non_zero_sender { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonZeroSender; + } + pub mod check_nonce { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonce(#[codec(compact)] pub ::core::primitive::u32); + } + pub mod check_spec_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckSpecVersion; + } + pub mod check_tx_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckTxVersion; + } + pub mod check_weight { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckWeight; + } + } + pub mod limits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockLength { + pub max: runtime_types::frame_support::dispatch::PerDispatchClass< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockWeights { + pub base_block: ::sp_weights::Weight, + pub max_block: ::sp_weights::Weight, + pub per_class: runtime_types::frame_support::dispatch::PerDispatchClass< + runtime_types::frame_system::limits::WeightsPerClass, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeightsPerClass { + pub base_extrinsic: ::sp_weights::Weight, + pub max_extrinsic: ::core::option::Option<::sp_weights::Weight>, + pub max_total: ::core::option::Option<::sp_weights::Weight>, + pub reserved: ::core::option::Option<::sp_weights::Weight>, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + remark { remark: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + set_heap_pages { pages: ::core::primitive::u64 }, + #[codec(index = 2)] + set_code { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 3)] + set_code_without_checks { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + set_storage { + items: ::std::vec::Vec<( + ::std::vec::Vec<::core::primitive::u8>, + ::std::vec::Vec<::core::primitive::u8>, + )>, + }, + #[codec(index = 5)] + kill_storage { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>> }, + #[codec(index = 6)] + kill_prefix { + prefix: ::std::vec::Vec<::core::primitive::u8>, + subkeys: ::core::primitive::u32, + }, + #[codec(index = 7)] + remark_with_event { remark: ::std::vec::Vec<::core::primitive::u8> }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidSpecName, + #[codec(index = 1)] + SpecVersionNeedsToIncrease, + #[codec(index = 2)] + FailedToExtractRuntimeVersion, + #[codec(index = 3)] + NonDefaultComposite, + #[codec(index = 4)] + NonZeroRefCount, + #[codec(index = 5)] + CallFiltered, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ExtrinsicSuccess { + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 1)] + ExtrinsicFailed { + dispatch_error: runtime_types::sp_runtime::DispatchError, + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 2)] + CodeUpdated, + #[codec(index = 3)] + NewAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + KilledAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Remarked { sender: ::sp_core::crypto::AccountId32, hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountInfo<_0, _1> { + pub nonce: _0, + pub consumers: _0, + pub providers: _0, + pub sufficients: _0, + pub data: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EventRecord<_0, _1> { + pub phase: runtime_types::frame_system::Phase, + pub event: _0, + pub topics: ::std::vec::Vec<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LastRuntimeUpgradeInfo { + #[codec(compact)] + pub spec_version: ::core::primitive::u32, + pub spec_name: ::std::string::String, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase { + #[codec(index = 0)] + ApplyExtrinsic(::core::primitive::u32), + #[codec(index = 1)] + Finalization, + #[codec(index = 2)] + Initialization, + } + } + pub mod pallet_babe { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + plan_config_change { + config: runtime_types::sp_consensus_babe::digests::NextConfigDescriptor, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEquivocationProof, + #[codec(index = 1)] + InvalidKeyOwnershipProof, + #[codec(index = 2)] + DuplicateOffenceReport, + #[codec(index = 3)] + InvalidConfiguration, + } + } + } + pub mod pallet_balances { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + transfer_allow_death { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + set_balance_deprecated { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + #[codec(compact)] + old_reserved: ::core::primitive::u128, + }, + #[codec(index = 2)] + force_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + transfer_keep_alive { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + transfer_all { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + keep_alive: ::core::primitive::bool, + }, + #[codec(index = 5)] + force_unreserve { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + upgrade_accounts { who: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 7)] + transfer { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 8)] + force_set_balance { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + VestingBalance, + #[codec(index = 1)] + LiquidityRestrictions, + #[codec(index = 2)] + InsufficientBalance, + #[codec(index = 3)] + ExistentialDeposit, + #[codec(index = 4)] + Expendability, + #[codec(index = 5)] + ExistingVestingSchedule, + #[codec(index = 6)] + DeadAccount, + #[codec(index = 7)] + TooManyReserves, + #[codec(index = 8)] + TooManyHolds, + #[codec(index = 9)] + TooManyFreezes, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Endowed { + account: ::sp_core::crypto::AccountId32, + free_balance: ::core::primitive::u128, + }, + #[codec(index = 1)] + DustLost { + account: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Transfer { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + BalanceSet { + who: ::sp_core::crypto::AccountId32, + free: ::core::primitive::u128, + }, + #[codec(index = 4)] + Reserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + Unreserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + ReserveRepatriated { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + destination_status: + runtime_types::frame_support::traits::tokens::misc::BalanceStatus, + }, + #[codec(index = 7)] + Deposit { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 8)] + Withdraw { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Slashed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 10)] + Minted { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 11)] + Burned { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 12)] + Suspended { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 13)] + Restored { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 14)] + Upgraded { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 15)] + Issued { amount: ::core::primitive::u128 }, + #[codec(index = 16)] + Rescinded { amount: ::core::primitive::u128 }, + #[codec(index = 17)] + Locked { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 18)] + Unlocked { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 19)] + Frozen { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 20)] + Thawed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountData<_0> { + pub free: _0, + pub reserved: _0, + pub frozen: _0, + pub flags: runtime_types::pallet_balances::types::ExtraFlags, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BalanceLock<_0> { + pub id: [::core::primitive::u8; 8usize], + pub amount: _0, + pub reasons: runtime_types::pallet_balances::types::Reasons, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ExtraFlags(pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdAmount<_0, _1> { + pub id: _0, + pub amount: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Reasons { + #[codec(index = 0)] + Fee, + #[codec(index = 1)] + Misc, + #[codec(index = 2)] + All, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReserveData<_0, _1> { + pub id: _0, + pub amount: _1, + } + } + } + pub mod pallet_beefy { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_beefy::EquivocationProof< + ::core::primitive::u32, + runtime_types::sp_consensus_beefy::crypto::Public, + runtime_types::sp_consensus_beefy::crypto::Signature, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_beefy::EquivocationProof< + ::core::primitive::u32, + runtime_types::sp_consensus_beefy::crypto::Public, + runtime_types::sp_consensus_beefy::crypto::Signature, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidKeyOwnershipProof, + #[codec(index = 1)] + InvalidEquivocationProof, + #[codec(index = 2)] + DuplicateOffenceReport, + } + } + } + pub mod pallet_bounties { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose_bounty { + #[codec(compact)] + value: ::core::primitive::u128, + description: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + approve_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 2)] + propose_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + curator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 3)] + unassign_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 4)] + accept_curator { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 5)] + award_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + claim_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 7)] + close_bounty { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + }, + #[codec(index = 8)] + extend_bounty_expiry { + #[codec(compact)] + bounty_id: ::core::primitive::u32, + remark: ::std::vec::Vec<::core::primitive::u8>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InsufficientProposersBalance, + #[codec(index = 1)] + InvalidIndex, + #[codec(index = 2)] + ReasonTooBig, + #[codec(index = 3)] + UnexpectedStatus, + #[codec(index = 4)] + RequireCurator, + #[codec(index = 5)] + InvalidValue, + #[codec(index = 6)] + InvalidFee, + #[codec(index = 7)] + PendingPayout, + #[codec(index = 8)] + Premature, + #[codec(index = 9)] + HasActiveChildBounty, + #[codec(index = 10)] + TooManyQueued, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BountyProposed { index: ::core::primitive::u32 }, + #[codec(index = 1)] + BountyRejected { index: ::core::primitive::u32, bond: ::core::primitive::u128 }, + #[codec(index = 2)] + BountyBecameActive { index: ::core::primitive::u32 }, + #[codec(index = 3)] + BountyAwarded { + index: ::core::primitive::u32, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 4)] + BountyClaimed { + index: ::core::primitive::u32, + payout: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 5)] + BountyCanceled { index: ::core::primitive::u32 }, + #[codec(index = 6)] + BountyExtended { index: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bounty<_0, _1, _2> { + pub proposer: _0, + pub value: _1, + pub fee: _1, + pub curator_deposit: _1, + pub bond: _1, + pub status: runtime_types::pallet_bounties::BountyStatus<_0, _2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BountyStatus<_0, _1> { + #[codec(index = 0)] + Proposed, + #[codec(index = 1)] + Approved, + #[codec(index = 2)] + Funded, + #[codec(index = 3)] + CuratorProposed { curator: _0 }, + #[codec(index = 4)] + Active { curator: _0, update_due: _1 }, + #[codec(index = 5)] + PendingPayout { curator: _0, beneficiary: _0, unlock_at: _1 }, + } + } + pub mod pallet_child_bounties { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + value: ::core::primitive::u128, + description: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + propose_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + curator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 2)] + accept_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 3)] + unassign_curator { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 4)] + award_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + claim_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + #[codec(index = 6)] + close_child_bounty { + #[codec(compact)] + parent_bounty_id: ::core::primitive::u32, + #[codec(compact)] + child_bounty_id: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParentBountyNotActive, + #[codec(index = 1)] + InsufficientBountyBalance, + #[codec(index = 2)] + TooManyChildBounties, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Added { index: ::core::primitive::u32, child_index: ::core::primitive::u32 }, + #[codec(index = 1)] + Awarded { + index: ::core::primitive::u32, + child_index: ::core::primitive::u32, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 2)] + Claimed { + index: ::core::primitive::u32, + child_index: ::core::primitive::u32, + payout: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Canceled { index: ::core::primitive::u32, child_index: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChildBounty<_0, _1, _2> { + pub parent_bounty: _2, + pub value: _1, + pub fee: _1, + pub curator_deposit: _1, + pub status: runtime_types::pallet_child_bounties::ChildBountyStatus<_0, _2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ChildBountyStatus<_0, _1> { + #[codec(index = 0)] + Added, + #[codec(index = 1)] + CuratorProposed { curator: _0 }, + #[codec(index = 2)] + Active { curator: _0 }, + #[codec(index = 3)] + PendingPayout { curator: _0, beneficiary: _0, unlock_at: _1 }, + } + } + pub mod pallet_collective { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_members { + new_members: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + prime: ::core::option::Option<::sp_core::crypto::AccountId32>, + old_count: ::core::primitive::u32, + }, + #[codec(index = 1)] + execute { + proposal: ::std::boxed::Box, + #[codec(compact)] + length_bound: ::core::primitive::u32, + }, + #[codec(index = 2)] + propose { + #[codec(compact)] + threshold: ::core::primitive::u32, + proposal: ::std::boxed::Box, + #[codec(compact)] + length_bound: ::core::primitive::u32, + }, + #[codec(index = 3)] + vote { + proposal: ::subxt::utils::H256, + #[codec(compact)] + index: ::core::primitive::u32, + approve: ::core::primitive::bool, + }, + #[codec(index = 5)] + disapprove_proposal { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 6)] + close { + proposal_hash: ::subxt::utils::H256, + #[codec(compact)] + index: ::core::primitive::u32, + proposal_weight_bound: ::sp_weights::Weight, + #[codec(compact)] + length_bound: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotMember, + #[codec(index = 1)] + DuplicateProposal, + #[codec(index = 2)] + ProposalMissing, + #[codec(index = 3)] + WrongIndex, + #[codec(index = 4)] + DuplicateVote, + #[codec(index = 5)] + AlreadyInitialized, + #[codec(index = 6)] + TooEarly, + #[codec(index = 7)] + TooManyProposals, + #[codec(index = 8)] + WrongProposalWeight, + #[codec(index = 9)] + WrongProposalLength, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Proposed { + account: ::sp_core::crypto::AccountId32, + proposal_index: ::core::primitive::u32, + proposal_hash: ::subxt::utils::H256, + threshold: ::core::primitive::u32, + }, + #[codec(index = 1)] + Voted { + account: ::sp_core::crypto::AccountId32, + proposal_hash: ::subxt::utils::H256, + voted: ::core::primitive::bool, + yes: ::core::primitive::u32, + no: ::core::primitive::u32, + }, + #[codec(index = 2)] + Approved { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 3)] + Disapproved { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 4)] + Executed { + proposal_hash: ::subxt::utils::H256, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 5)] + MemberExecuted { + proposal_hash: ::subxt::utils::H256, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 6)] + Closed { + proposal_hash: ::subxt::utils::H256, + yes: ::core::primitive::u32, + no: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RawOrigin<_0> { + #[codec(index = 0)] + Members(::core::primitive::u32, ::core::primitive::u32), + #[codec(index = 1)] + Member(_0), + #[codec(index = 2)] + _Phantom, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Votes<_0, _1> { + pub index: _1, + pub threshold: _1, + pub ayes: ::std::vec::Vec<_0>, + pub nays: ::std::vec::Vec<_0>, + pub end: _1, + } + } + pub mod pallet_democracy { + use super::runtime_types; + pub mod conviction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Conviction { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Locked1x, + #[codec(index = 2)] + Locked2x, + #[codec(index = 3)] + Locked3x, + #[codec(index = 4)] + Locked4x, + #[codec(index = 5)] + Locked5x, + #[codec(index = 6)] + Locked6x, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::rococo_runtime::RuntimeCall, + >, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + second { + #[codec(compact)] + proposal: ::core::primitive::u32, + }, + #[codec(index = 2)] + vote { + #[codec(compact)] + ref_index: ::core::primitive::u32, + vote: runtime_types::pallet_democracy::vote::AccountVote< + ::core::primitive::u128, + >, + }, + #[codec(index = 3)] + emergency_cancel { ref_index: ::core::primitive::u32 }, + #[codec(index = 4)] + external_propose { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::rococo_runtime::RuntimeCall, + >, + }, + #[codec(index = 5)] + external_propose_majority { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::rococo_runtime::RuntimeCall, + >, + }, + #[codec(index = 6)] + external_propose_default { + proposal: runtime_types::frame_support::traits::preimages::Bounded< + runtime_types::rococo_runtime::RuntimeCall, + >, + }, + #[codec(index = 7)] + fast_track { + proposal_hash: ::subxt::utils::H256, + voting_period: ::core::primitive::u32, + delay: ::core::primitive::u32, + }, + #[codec(index = 8)] + veto_external { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 9)] + cancel_referendum { + #[codec(compact)] + ref_index: ::core::primitive::u32, + }, + #[codec(index = 10)] + delegate { + to: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + conviction: runtime_types::pallet_democracy::conviction::Conviction, + balance: ::core::primitive::u128, + }, + #[codec(index = 11)] + undelegate, + #[codec(index = 12)] + clear_public_proposals, + #[codec(index = 13)] + unlock { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 14)] + remove_vote { index: ::core::primitive::u32 }, + #[codec(index = 15)] + remove_other_vote { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + }, + #[codec(index = 16)] + blacklist { + proposal_hash: ::subxt::utils::H256, + maybe_ref_index: ::core::option::Option<::core::primitive::u32>, + }, + #[codec(index = 17)] + cancel_proposal { + #[codec(compact)] + prop_index: ::core::primitive::u32, + }, + #[codec(index = 18)] + set_metadata { + owner: runtime_types::pallet_democracy::types::MetadataOwner, + maybe_hash: ::core::option::Option<::subxt::utils::H256>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ValueLow, + #[codec(index = 1)] + ProposalMissing, + #[codec(index = 2)] + AlreadyCanceled, + #[codec(index = 3)] + DuplicateProposal, + #[codec(index = 4)] + ProposalBlacklisted, + #[codec(index = 5)] + NotSimpleMajority, + #[codec(index = 6)] + InvalidHash, + #[codec(index = 7)] + NoProposal, + #[codec(index = 8)] + AlreadyVetoed, + #[codec(index = 9)] + ReferendumInvalid, + #[codec(index = 10)] + NoneWaiting, + #[codec(index = 11)] + NotVoter, + #[codec(index = 12)] + NoPermission, + #[codec(index = 13)] + AlreadyDelegating, + #[codec(index = 14)] + InsufficientFunds, + #[codec(index = 15)] + NotDelegating, + #[codec(index = 16)] + VotesExist, + #[codec(index = 17)] + InstantNotAllowed, + #[codec(index = 18)] + Nonsense, + #[codec(index = 19)] + WrongUpperBound, + #[codec(index = 20)] + MaxVotesReached, + #[codec(index = 21)] + TooMany, + #[codec(index = 22)] + VotingPeriodLow, + #[codec(index = 23)] + PreimageNotExist, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Proposed { + proposal_index: ::core::primitive::u32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 1)] + Tabled { + proposal_index: ::core::primitive::u32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 2)] + ExternalTabled, + #[codec(index = 3)] + Started { + ref_index: ::core::primitive::u32, + threshold: runtime_types::pallet_democracy::vote_threshold::VoteThreshold, + }, + #[codec(index = 4)] + Passed { ref_index: ::core::primitive::u32 }, + #[codec(index = 5)] + NotPassed { ref_index: ::core::primitive::u32 }, + #[codec(index = 6)] + Cancelled { ref_index: ::core::primitive::u32 }, + #[codec(index = 7)] + Delegated { + who: ::sp_core::crypto::AccountId32, + target: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + Undelegated { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 9)] + Vetoed { + who: ::sp_core::crypto::AccountId32, + proposal_hash: ::subxt::utils::H256, + until: ::core::primitive::u32, + }, + #[codec(index = 10)] + Blacklisted { proposal_hash: ::subxt::utils::H256 }, + #[codec(index = 11)] + Voted { + voter: ::sp_core::crypto::AccountId32, + ref_index: ::core::primitive::u32, + vote: runtime_types::pallet_democracy::vote::AccountVote< + ::core::primitive::u128, + >, + }, + #[codec(index = 12)] + Seconded { + seconder: ::sp_core::crypto::AccountId32, + prop_index: ::core::primitive::u32, + }, + #[codec(index = 13)] + ProposalCanceled { prop_index: ::core::primitive::u32 }, + #[codec(index = 14)] + MetadataSet { + owner: runtime_types::pallet_democracy::types::MetadataOwner, + hash: ::subxt::utils::H256, + }, + #[codec(index = 15)] + MetadataCleared { + owner: runtime_types::pallet_democracy::types::MetadataOwner, + hash: ::subxt::utils::H256, + }, + #[codec(index = 16)] + MetadataTransferred { + prev_owner: runtime_types::pallet_democracy::types::MetadataOwner, + owner: runtime_types::pallet_democracy::types::MetadataOwner, + hash: ::subxt::utils::H256, + }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Delegations<_0> { + pub votes: _0, + pub capital: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MetadataOwner { + #[codec(index = 0)] + External, + #[codec(index = 1)] + Proposal(::core::primitive::u32), + #[codec(index = 2)] + Referendum(::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ReferendumInfo<_0, _1, _2> { + #[codec(index = 0)] + Ongoing(runtime_types::pallet_democracy::types::ReferendumStatus<_0, _1, _2>), + #[codec(index = 1)] + Finished { approved: ::core::primitive::bool, end: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReferendumStatus<_0, _1, _2> { + pub end: _0, + pub proposal: _1, + pub threshold: runtime_types::pallet_democracy::vote_threshold::VoteThreshold, + pub delay: _0, + pub tally: runtime_types::pallet_democracy::types::Tally<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Tally<_0> { + pub ayes: _0, + pub nays: _0, + pub turnout: _0, + } + } + pub mod vote { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AccountVote<_0> { + #[codec(index = 0)] + Standard { vote: runtime_types::pallet_democracy::vote::Vote, balance: _0 }, + #[codec(index = 1)] + Split { aye: _0, nay: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PriorLock<_0, _1>(pub _0, pub _1); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Vote(pub ::core::primitive::u8); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Voting<_0, _1, _2> { + #[codec(index = 0)] + Direct { + votes: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _2, + runtime_types::pallet_democracy::vote::AccountVote<_0>, + )>, + delegations: runtime_types::pallet_democracy::types::Delegations<_0>, + prior: runtime_types::pallet_democracy::vote::PriorLock<_2, _0>, + }, + #[codec(index = 1)] + Delegating { + balance: _0, + target: _1, + conviction: runtime_types::pallet_democracy::conviction::Conviction, + delegations: runtime_types::pallet_democracy::types::Delegations<_0>, + prior: runtime_types::pallet_democracy::vote::PriorLock<_2, _0>, + }, + } + } + pub mod vote_threshold { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VoteThreshold { + #[codec(index = 0)] + SuperMajorityApprove, + #[codec(index = 1)] + SuperMajorityAgainst, + #[codec(index = 2)] + SimpleMajority, + } + } + } + pub mod pallet_elections_phragmen { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vote { + votes: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + remove_voter, + #[codec(index = 2)] + submit_candidacy { + #[codec(compact)] + candidate_count: ::core::primitive::u32, + }, + #[codec(index = 3)] + renounce_candidacy { + renouncing: runtime_types::pallet_elections_phragmen::Renouncing, + }, + #[codec(index = 4)] + remove_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + slash_bond: ::core::primitive::bool, + rerun_election: ::core::primitive::bool, + }, + #[codec(index = 5)] + clean_defunct_voters { + num_voters: ::core::primitive::u32, + num_defunct: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnableToVote, + #[codec(index = 1)] + NoVotes, + #[codec(index = 2)] + TooManyVotes, + #[codec(index = 3)] + MaximumVotesExceeded, + #[codec(index = 4)] + LowBalance, + #[codec(index = 5)] + UnableToPayBond, + #[codec(index = 6)] + MustBeVoter, + #[codec(index = 7)] + DuplicatedCandidate, + #[codec(index = 8)] + TooManyCandidates, + #[codec(index = 9)] + MemberSubmit, + #[codec(index = 10)] + RunnerUpSubmit, + #[codec(index = 11)] + InsufficientCandidateFunds, + #[codec(index = 12)] + NotMember, + #[codec(index = 13)] + InvalidWitnessData, + #[codec(index = 14)] + InvalidVoteCount, + #[codec(index = 15)] + InvalidRenouncing, + #[codec(index = 16)] + InvalidReplacement, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewTerm { + new_members: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + )>, + }, + #[codec(index = 1)] + EmptyTerm, + #[codec(index = 2)] + ElectionError, + #[codec(index = 3)] + MemberKicked { member: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + Renounced { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + CandidateSlashed { + candidate: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + SeatHolderSlashed { + seat_holder: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Renouncing { + #[codec(index = 0)] + Member, + #[codec(index = 1)] + RunnerUp, + #[codec(index = 2)] + Candidate(#[codec(compact)] ::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SeatHolder<_0, _1> { + pub who: _0, + pub stake: _1, + pub deposit: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Voter<_0, _1> { + pub votes: ::std::vec::Vec<_0>, + pub stake: _1, + pub deposit: _1, + } + } + pub mod pallet_grandpa { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + note_stalled { + delay: ::core::primitive::u32, + best_finalized_block_number: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PauseFailed, + #[codec(index = 1)] + ResumeFailed, + #[codec(index = 2)] + ChangePending, + #[codec(index = 3)] + TooSoon, + #[codec(index = 4)] + InvalidKeyOwnershipProof, + #[codec(index = 5)] + InvalidEquivocationProof, + #[codec(index = 6)] + DuplicateOffenceReport, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewAuthorities { + authority_set: ::std::vec::Vec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + }, + #[codec(index = 1)] + Paused, + #[codec(index = 2)] + Resumed, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredPendingChange<_0> { + pub scheduled_at: _0, + pub delay: _0, + pub next_authorities: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub forced: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StoredState<_0> { + #[codec(index = 0)] + Live, + #[codec(index = 1)] + PendingPause { scheduled_at: _0, delay: _0 }, + #[codec(index = 2)] + Paused, + #[codec(index = 3)] + PendingResume { scheduled_at: _0, delay: _0 }, + } + } + pub mod pallet_identity { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_registrar { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + set_identity { + info: + ::std::boxed::Box, + }, + #[codec(index = 2)] + set_subs { + subs: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + runtime_types::pallet_identity::types::Data, + )>, + }, + #[codec(index = 3)] + clear_identity, + #[codec(index = 4)] + request_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + #[codec(compact)] + max_fee: ::core::primitive::u128, + }, + #[codec(index = 5)] + cancel_request { reg_index: ::core::primitive::u32 }, + #[codec(index = 6)] + set_fee { + #[codec(compact)] + index: ::core::primitive::u32, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 7)] + set_account_id { + #[codec(compact)] + index: ::core::primitive::u32, + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 8)] + set_fields { + #[codec(compact)] + index: ::core::primitive::u32, + fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + }, + #[codec(index = 9)] + provide_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + judgement: runtime_types::pallet_identity::types::Judgement< + ::core::primitive::u128, + >, + identity: ::subxt::utils::H256, + }, + #[codec(index = 10)] + kill_identity { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 11)] + add_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 12)] + rename_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 13)] + remove_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 14)] + quit_sub, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManySubAccounts, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotNamed, + #[codec(index = 3)] + EmptyIndex, + #[codec(index = 4)] + FeeChanged, + #[codec(index = 5)] + NoIdentity, + #[codec(index = 6)] + StickyJudgement, + #[codec(index = 7)] + JudgementGiven, + #[codec(index = 8)] + InvalidJudgement, + #[codec(index = 9)] + InvalidIndex, + #[codec(index = 10)] + InvalidTarget, + #[codec(index = 11)] + TooManyFields, + #[codec(index = 12)] + TooManyRegistrars, + #[codec(index = 13)] + AlreadyClaimed, + #[codec(index = 14)] + NotSub, + #[codec(index = 15)] + NotOwned, + #[codec(index = 16)] + JudgementForDifferentIdentity, + #[codec(index = 17)] + JudgementPaymentFailed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IdentitySet { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + IdentityCleared { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 2)] + IdentityKilled { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 3)] + JudgementRequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 4)] + JudgementUnrequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 5)] + JudgementGiven { + target: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + RegistrarAdded { registrar_index: ::core::primitive::u32 }, + #[codec(index = 7)] + SubIdentityAdded { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 8)] + SubIdentityRemoved { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 9)] + SubIdentityRevoked { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + } + } + pub mod types { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct BitFlags<_0>( + pub ::core::primitive::u64, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Data { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Raw0([::core::primitive::u8; 0usize]), + #[codec(index = 2)] + Raw1([::core::primitive::u8; 1usize]), + #[codec(index = 3)] + Raw2([::core::primitive::u8; 2usize]), + #[codec(index = 4)] + Raw3([::core::primitive::u8; 3usize]), + #[codec(index = 5)] + Raw4([::core::primitive::u8; 4usize]), + #[codec(index = 6)] + Raw5([::core::primitive::u8; 5usize]), + #[codec(index = 7)] + Raw6([::core::primitive::u8; 6usize]), + #[codec(index = 8)] + Raw7([::core::primitive::u8; 7usize]), + #[codec(index = 9)] + Raw8([::core::primitive::u8; 8usize]), + #[codec(index = 10)] + Raw9([::core::primitive::u8; 9usize]), + #[codec(index = 11)] + Raw10([::core::primitive::u8; 10usize]), + #[codec(index = 12)] + Raw11([::core::primitive::u8; 11usize]), + #[codec(index = 13)] + Raw12([::core::primitive::u8; 12usize]), + #[codec(index = 14)] + Raw13([::core::primitive::u8; 13usize]), + #[codec(index = 15)] + Raw14([::core::primitive::u8; 14usize]), + #[codec(index = 16)] + Raw15([::core::primitive::u8; 15usize]), + #[codec(index = 17)] + Raw16([::core::primitive::u8; 16usize]), + #[codec(index = 18)] + Raw17([::core::primitive::u8; 17usize]), + #[codec(index = 19)] + Raw18([::core::primitive::u8; 18usize]), + #[codec(index = 20)] + Raw19([::core::primitive::u8; 19usize]), + #[codec(index = 21)] + Raw20([::core::primitive::u8; 20usize]), + #[codec(index = 22)] + Raw21([::core::primitive::u8; 21usize]), + #[codec(index = 23)] + Raw22([::core::primitive::u8; 22usize]), + #[codec(index = 24)] + Raw23([::core::primitive::u8; 23usize]), + #[codec(index = 25)] + Raw24([::core::primitive::u8; 24usize]), + #[codec(index = 26)] + Raw25([::core::primitive::u8; 25usize]), + #[codec(index = 27)] + Raw26([::core::primitive::u8; 26usize]), + #[codec(index = 28)] + Raw27([::core::primitive::u8; 27usize]), + #[codec(index = 29)] + Raw28([::core::primitive::u8; 28usize]), + #[codec(index = 30)] + Raw29([::core::primitive::u8; 29usize]), + #[codec(index = 31)] + Raw30([::core::primitive::u8; 30usize]), + #[codec(index = 32)] + Raw31([::core::primitive::u8; 31usize]), + #[codec(index = 33)] + Raw32([::core::primitive::u8; 32usize]), + #[codec(index = 34)] + BlakeTwo256([::core::primitive::u8; 32usize]), + #[codec(index = 35)] + Sha256([::core::primitive::u8; 32usize]), + #[codec(index = 36)] + Keccak256([::core::primitive::u8; 32usize]), + #[codec(index = 37)] + ShaThree256([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum IdentityField { + #[codec(index = 1)] + Display, + #[codec(index = 2)] + Legal, + #[codec(index = 4)] + Web, + #[codec(index = 8)] + Riot, + #[codec(index = 16)] + Email, + #[codec(index = 32)] + PgpFingerprint, + #[codec(index = 64)] + Image, + #[codec(index = 128)] + Twitter, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdentityInfo { + pub additional: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + runtime_types::pallet_identity::types::Data, + runtime_types::pallet_identity::types::Data, + )>, + pub display: runtime_types::pallet_identity::types::Data, + pub legal: runtime_types::pallet_identity::types::Data, + pub web: runtime_types::pallet_identity::types::Data, + pub riot: runtime_types::pallet_identity::types::Data, + pub email: runtime_types::pallet_identity::types::Data, + pub pgp_fingerprint: ::core::option::Option<[::core::primitive::u8; 20usize]>, + pub image: runtime_types::pallet_identity::types::Data, + pub twitter: runtime_types::pallet_identity::types::Data, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Judgement<_0> { + #[codec(index = 0)] + Unknown, + #[codec(index = 1)] + FeePaid(_0), + #[codec(index = 2)] + Reasonable, + #[codec(index = 3)] + KnownGood, + #[codec(index = 4)] + OutOfDate, + #[codec(index = 5)] + LowQuality, + #[codec(index = 6)] + Erroneous, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RegistrarInfo<_0, _1> { + pub account: _1, + pub fee: _0, + pub fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Registration<_0> { + pub judgements: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::core::primitive::u32, + runtime_types::pallet_identity::types::Judgement<_0>, + )>, + pub deposit: _0, + pub info: runtime_types::pallet_identity::types::IdentityInfo, + } + } + } + pub mod pallet_im_online { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + heartbeat { + heartbeat: + runtime_types::pallet_im_online::Heartbeat<::core::primitive::u32>, + signature: runtime_types::pallet_im_online::sr25519::app_sr25519::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidKey, + #[codec(index = 1)] + DuplicatedHeartbeat, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + HeartbeatReceived { + authority_id: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + }, + #[codec(index = 1)] + AllGood, + #[codec(index = 2)] + SomeOffline { offline: ::std::vec::Vec<(::sp_core::crypto::AccountId32, ())> }, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod app_sr25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedOpaqueNetworkState { + pub peer_id: runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + pub external_addresses: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Heartbeat<_0> { + pub block_number: _0, + pub network_state: runtime_types::sp_core::offchain::OpaqueNetworkState, + pub session_index: _0, + pub authority_index: _0, + pub validators_len: _0, + } + } + pub mod pallet_indices { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim { index: ::core::primitive::u32 }, + #[codec(index = 1)] + transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + }, + #[codec(index = 2)] + free { index: ::core::primitive::u32 }, + #[codec(index = 3)] + force_transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + freeze: ::core::primitive::bool, + }, + #[codec(index = 4)] + freeze { index: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotAssigned, + #[codec(index = 1)] + NotOwner, + #[codec(index = 2)] + InUse, + #[codec(index = 3)] + NotTransfer, + #[codec(index = 4)] + Permanent, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IndexAssigned { + who: ::sp_core::crypto::AccountId32, + index: ::core::primitive::u32, + }, + #[codec(index = 1)] + IndexFreed { index: ::core::primitive::u32 }, + #[codec(index = 2)] + IndexFrozen { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + }, + } + } + } + pub mod pallet_membership { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + remove_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + swap_member { + remove: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + add: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 3)] + reset_members { members: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 4)] + change_key { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + set_prime { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + clear_prime, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + AlreadyMember, + #[codec(index = 1)] + NotMember, + #[codec(index = 2)] + TooManyMembers, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + MemberAdded, + #[codec(index = 1)] + MemberRemoved, + #[codec(index = 2)] + MembersSwapped, + #[codec(index = 3)] + MembersReset, + #[codec(index = 4)] + KeyChanged, + #[codec(index = 5)] + Dummy, + } + } + } + pub mod pallet_message_queue { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] reap_page { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , } , # [codec (index = 1)] execute_overweight { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page : :: core :: primitive :: u32 , index : :: core :: primitive :: u32 , weight_limit : :: sp_weights :: Weight , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotReapable, + #[codec(index = 1)] + NoPage, + #[codec(index = 2)] + NoMessage, + #[codec(index = 3)] + AlreadyProcessed, + #[codec(index = 4)] + Queued, + #[codec(index = 5)] + InsufficientWeight, + #[codec(index = 6)] + TemporarilyUnprocessable, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + # [codec (index = 0)] ProcessingFailed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , error : runtime_types :: frame_support :: traits :: messages :: ProcessMessageError , } , # [codec (index = 1)] Processed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , weight_used : :: sp_weights :: Weight , success : :: core :: primitive :: bool , } , # [codec (index = 2)] OverweightEnqueued { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , message_index : :: core :: primitive :: u32 , } , # [codec (index = 3)] PageReaped { origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , index : :: core :: primitive :: u32 , } , } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BookState<_0> { + pub begin: ::core::primitive::u32, + pub end: ::core::primitive::u32, + pub count: ::core::primitive::u32, + pub ready_neighbours: + ::core::option::Option>, + pub message_count: ::core::primitive::u64, + pub size: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Neighbours<_0> { + pub prev: _0, + pub next: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Page<_0> { + pub remaining: _0, + pub remaining_size: _0, + pub first_index: _0, + pub first: _0, + pub last: _0, + pub heap: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + } + } + pub mod pallet_multisig { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_multi_threshold_1 { + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + approve_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call_hash: [::core::primitive::u8; 32usize], + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 3)] + cancel_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + call_hash: [::core::primitive::u8; 32usize], + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + MinimumThreshold, + #[codec(index = 1)] + AlreadyApproved, + #[codec(index = 2)] + NoApprovalsNeeded, + #[codec(index = 3)] + TooFewSignatories, + #[codec(index = 4)] + TooManySignatories, + #[codec(index = 5)] + SignatoriesOutOfOrder, + #[codec(index = 6)] + SenderInSignatories, + #[codec(index = 7)] + NotFound, + #[codec(index = 8)] + NotOwner, + #[codec(index = 9)] + NoTimepoint, + #[codec(index = 10)] + WrongTimepoint, + #[codec(index = 11)] + UnexpectedTimepoint, + #[codec(index = 12)] + MaxWeightTooLow, + #[codec(index = 13)] + AlreadyStored, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewMultisig { + approving: ::sp_core::crypto::AccountId32, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 1)] + MultisigApproval { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + MultisigExecuted { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + MultisigCancelled { + cancelling: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Multisig<_0, _1, _2> { + pub when: runtime_types::pallet_multisig::Timepoint<_0>, + pub deposit: _1, + pub depositor: _2, + pub approvals: runtime_types::bounded_collections::bounded_vec::BoundedVec<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Timepoint<_0> { + pub height: _0, + pub index: _0, + } + } + pub mod pallet_nis { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bid<_0, _1> { + pub amount: _0, + pub who: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + place_bid { + #[codec(compact)] + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 1)] + retract_bid { + #[codec(compact)] + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 2)] + fund_deficit, + #[codec(index = 3)] + thaw_private { + #[codec(compact)] + index: ::core::primitive::u32, + maybe_proportion: ::core::option::Option< + runtime_types::sp_arithmetic::per_things::Perquintill, + >, + }, + #[codec(index = 4)] + thaw_communal { + #[codec(compact)] + index: ::core::primitive::u32, + }, + #[codec(index = 5)] + communify { + #[codec(compact)] + index: ::core::primitive::u32, + }, + #[codec(index = 6)] + privatize { + #[codec(compact)] + index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DurationTooSmall, + #[codec(index = 1)] + DurationTooBig, + #[codec(index = 2)] + AmountTooSmall, + #[codec(index = 3)] + BidTooLow, + #[codec(index = 4)] + UnknownReceipt, + #[codec(index = 5)] + NotOwner, + #[codec(index = 6)] + NotExpired, + #[codec(index = 7)] + UnknownBid, + #[codec(index = 8)] + PortionTooBig, + #[codec(index = 9)] + Unfunded, + #[codec(index = 10)] + AlreadyFunded, + #[codec(index = 11)] + Throttled, + #[codec(index = 12)] + MakesDust, + #[codec(index = 13)] + AlreadyCommunal, + #[codec(index = 14)] + AlreadyPrivate, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BidPlaced { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 1)] + BidRetracted { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 2)] + BidDropped { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + duration: ::core::primitive::u32, + }, + #[codec(index = 3)] + Issued { + index: ::core::primitive::u32, + expiry: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + proportion: runtime_types::sp_arithmetic::per_things::Perquintill, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + Thawed { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + proportion: runtime_types::sp_arithmetic::per_things::Perquintill, + amount: ::core::primitive::u128, + dropped: ::core::primitive::bool, + }, + #[codec(index = 5)] + Funded { deficit: ::core::primitive::u128 }, + #[codec(index = 6)] + Transferred { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum HoldReason { + #[codec(index = 0)] + NftReceipt, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReceiptRecord<_0, _1, _2> { + pub proportion: runtime_types::sp_arithmetic::per_things::Perquintill, + pub owner: ::core::option::Option<(_0, _2)>, + pub expiry: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SummaryRecord<_0, _1> { + pub proportion_owed: runtime_types::sp_arithmetic::per_things::Perquintill, + pub index: _0, + pub thawed: runtime_types::sp_arithmetic::per_things::Perquintill, + pub last_period: _0, + pub receipts_on_hold: _1, + } + } + } + pub mod pallet_offences { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Offence { + kind: [::core::primitive::u8; 16usize], + timeslot: ::std::vec::Vec<::core::primitive::u8>, + }, + } + } + } + pub mod pallet_preimage { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + note_preimage { bytes: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + unnote_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + request_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 3)] + unrequest_preimage { hash: ::subxt::utils::H256 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooBig, + #[codec(index = 1)] + AlreadyNoted, + #[codec(index = 2)] + NotAuthorized, + #[codec(index = 3)] + NotNoted, + #[codec(index = 4)] + Requested, + #[codec(index = 5)] + NotRequested, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Noted { hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + Requested { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + Cleared { hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RequestStatus<_0, _1> { + #[codec(index = 0)] + Unrequested { deposit: (_0, _1), len: ::core::primitive::u32 }, + #[codec(index = 1)] + Requested { + deposit: ::core::option::Option<(_0, _1)>, + count: ::core::primitive::u32, + len: ::core::option::Option<::core::primitive::u32>, + }, + } + } + pub mod pallet_proxy { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + proxy { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + add_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::rococo_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 2)] + remove_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::rococo_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 3)] + remove_proxies, + #[codec(index = 4)] + create_pure { + proxy_type: runtime_types::rococo_runtime::ProxyType, + delay: ::core::primitive::u32, + index: ::core::primitive::u16, + }, + #[codec(index = 5)] + kill_pure { + spawner: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::rococo_runtime::ProxyType, + index: ::core::primitive::u16, + #[codec(compact)] + height: ::core::primitive::u32, + #[codec(compact)] + ext_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + announce { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 7)] + remove_announcement { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 8)] + reject_announcement { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 9)] + proxy_announced { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooMany, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotProxy, + #[codec(index = 3)] + Unproxyable, + #[codec(index = 4)] + Duplicate, + #[codec(index = 5)] + NoPermission, + #[codec(index = 6)] + Unannounced, + #[codec(index = 7)] + NoSelfProxy, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ProxyExecuted { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + PureCreated { + pure: ::sp_core::crypto::AccountId32, + who: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::rococo_runtime::ProxyType, + disambiguation_index: ::core::primitive::u16, + }, + #[codec(index = 2)] + Announced { + real: ::sp_core::crypto::AccountId32, + proxy: ::sp_core::crypto::AccountId32, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 3)] + ProxyAdded { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::rococo_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 4)] + ProxyRemoved { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::rococo_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Announcement<_0, _1, _2> { + pub real: _0, + pub call_hash: _1, + pub height: _2, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ProxyDefinition<_0, _1, _2> { + pub delegate: _0, + pub proxy_type: _1, + pub delay: _2, + } + } + pub mod pallet_recovery { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_recovered { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + set_recovered { + lost: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + create_recovery { + friends: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + threshold: ::core::primitive::u16, + delay_period: ::core::primitive::u32, + }, + #[codec(index = 3)] + initiate_recovery { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + vouch_recovery { + lost: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + claim_recovery { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + close_recovery { + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 7)] + remove_recovery, + #[codec(index = 8)] + cancel_recovered { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotAllowed, + #[codec(index = 1)] + ZeroThreshold, + #[codec(index = 2)] + NotEnoughFriends, + #[codec(index = 3)] + MaxFriends, + #[codec(index = 4)] + NotSorted, + #[codec(index = 5)] + NotRecoverable, + #[codec(index = 6)] + AlreadyRecoverable, + #[codec(index = 7)] + AlreadyStarted, + #[codec(index = 8)] + NotStarted, + #[codec(index = 9)] + NotFriend, + #[codec(index = 10)] + DelayPeriod, + #[codec(index = 11)] + AlreadyVouched, + #[codec(index = 12)] + Threshold, + #[codec(index = 13)] + StillActive, + #[codec(index = 14)] + AlreadyProxy, + #[codec(index = 15)] + BadState, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + RecoveryCreated { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + RecoveryInitiated { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 2)] + RecoveryVouched { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + sender: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + RecoveryClosed { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 4)] + AccountRecovered { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 5)] + RecoveryRemoved { lost_account: ::sp_core::crypto::AccountId32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ActiveRecovery<_0, _1, _2> { + pub created: _0, + pub deposit: _1, + pub friends: _2, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RecoveryConfig<_0, _1, _2> { + pub delay_period: _0, + pub deposit: _1, + pub friends: _2, + pub threshold: ::core::primitive::u16, + } + } + pub mod pallet_scheduler { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + schedule { + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + cancel { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + schedule_named { + id: [::core::primitive::u8; 32usize], + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 3)] + cancel_named { id: [::core::primitive::u8; 32usize] }, + #[codec(index = 4)] + schedule_after { + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 5)] + schedule_named_after { + id: [::core::primitive::u8; 32usize], + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FailedToSchedule, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + TargetBlockNumberInPast, + #[codec(index = 3)] + RescheduleNoChange, + #[codec(index = 4)] + Named, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Scheduled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 1)] + Canceled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + Dispatched { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + CallUnavailable { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 4)] + PeriodicFailed { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 5)] + PermanentlyOverweight { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Scheduled<_0, _1, _2, _3, _4> { + pub maybe_id: ::core::option::Option<_0>, + pub priority: ::core::primitive::u8, + pub call: _1, + pub maybe_periodic: ::core::option::Option<(_2, _2)>, + pub origin: _3, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_4>, + } + } + pub mod pallet_session { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_keys { + keys: runtime_types::rococo_runtime::SessionKeys, + proof: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + purge_keys, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidProof, + #[codec(index = 1)] + NoAssociatedValidatorId, + #[codec(index = 2)] + DuplicatedKey, + #[codec(index = 3)] + NoKeys, + #[codec(index = 4)] + NoAccount, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewSession { session_index: ::core::primitive::u32 }, + } + } + } + pub mod pallet_society { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + bid { value: ::core::primitive::u128 }, + #[codec(index = 1)] + unbid { pos: ::core::primitive::u32 }, + #[codec(index = 2)] + vouch { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + value: ::core::primitive::u128, + tip: ::core::primitive::u128, + }, + #[codec(index = 3)] + unvouch { pos: ::core::primitive::u32 }, + #[codec(index = 4)] + vote { + candidate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + approve: ::core::primitive::bool, + }, + #[codec(index = 5)] + defender_vote { approve: ::core::primitive::bool }, + #[codec(index = 6)] + payout, + #[codec(index = 7)] + found { + founder: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + max_members: ::core::primitive::u32, + rules: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 8)] + unfound, + #[codec(index = 9)] + judge_suspended_member { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + forgive: ::core::primitive::bool, + }, + #[codec(index = 10)] + judge_suspended_candidate { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + judgement: runtime_types::pallet_society::Judgement, + }, + #[codec(index = 11)] + set_max_members { max: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + BadPosition, + #[codec(index = 1)] + NotMember, + #[codec(index = 2)] + AlreadyMember, + #[codec(index = 3)] + Suspended, + #[codec(index = 4)] + NotSuspended, + #[codec(index = 5)] + NoPayout, + #[codec(index = 6)] + AlreadyFounded, + #[codec(index = 7)] + InsufficientPot, + #[codec(index = 8)] + AlreadyVouching, + #[codec(index = 9)] + NotVouching, + #[codec(index = 10)] + Head, + #[codec(index = 11)] + Founder, + #[codec(index = 12)] + AlreadyBid, + #[codec(index = 13)] + AlreadyCandidate, + #[codec(index = 14)] + NotCandidate, + #[codec(index = 15)] + MaxMembers, + #[codec(index = 16)] + NotFounder, + #[codec(index = 17)] + NotHead, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Founded { founder: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + Bid { + candidate_id: ::sp_core::crypto::AccountId32, + offer: ::core::primitive::u128, + }, + #[codec(index = 2)] + Vouch { + candidate_id: ::sp_core::crypto::AccountId32, + offer: ::core::primitive::u128, + vouching: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + AutoUnbid { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + Unbid { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Unvouch { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 6)] + Inducted { + primary: ::sp_core::crypto::AccountId32, + candidates: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 7)] + SuspendedMemberJudgement { + who: ::sp_core::crypto::AccountId32, + judged: ::core::primitive::bool, + }, + #[codec(index = 8)] + CandidateSuspended { candidate: ::sp_core::crypto::AccountId32 }, + #[codec(index = 9)] + MemberSuspended { member: ::sp_core::crypto::AccountId32 }, + #[codec(index = 10)] + Challenged { member: ::sp_core::crypto::AccountId32 }, + #[codec(index = 11)] + Vote { + candidate: ::sp_core::crypto::AccountId32, + voter: ::sp_core::crypto::AccountId32, + vote: ::core::primitive::bool, + }, + #[codec(index = 12)] + DefenderVote { + voter: ::sp_core::crypto::AccountId32, + vote: ::core::primitive::bool, + }, + #[codec(index = 13)] + NewMaxMembers { max: ::core::primitive::u32 }, + #[codec(index = 14)] + Unfounded { founder: ::sp_core::crypto::AccountId32 }, + #[codec(index = 15)] + Deposit { value: ::core::primitive::u128 }, + #[codec(index = 16)] + SkepticsChosen { skeptics: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bid<_0, _1> { + pub who: _0, + pub kind: runtime_types::pallet_society::BidKind<_0, _1>, + pub value: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BidKind<_0, _1> { + #[codec(index = 0)] + Deposit(_1), + #[codec(index = 1)] + Vouch(_0, _1), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Judgement { + #[codec(index = 0)] + Rebid, + #[codec(index = 1)] + Reject, + #[codec(index = 2)] + Approve, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Vote { + #[codec(index = 0)] + Skeptic, + #[codec(index = 1)] + Reject, + #[codec(index = 2)] + Approve, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VouchingStatus { + #[codec(index = 0)] + Vouching, + #[codec(index = 1)] + Banned, + } + } + pub mod pallet_state_trie_migration { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + control_auto_migration { + maybe_config: ::core::option::Option< + runtime_types::pallet_state_trie_migration::pallet::MigrationLimits, + >, + }, + #[codec(index = 1)] + continue_migrate { + limits: runtime_types::pallet_state_trie_migration::pallet::MigrationLimits, + real_size_upper: ::core::primitive::u32, + witness_task: + runtime_types::pallet_state_trie_migration::pallet::MigrationTask, + }, + #[codec(index = 2)] + migrate_custom_top { + keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, + witness_size: ::core::primitive::u32, + }, + #[codec(index = 3)] + migrate_custom_child { + root: ::std::vec::Vec<::core::primitive::u8>, + child_keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>>, + total_size: ::core::primitive::u32, + }, + #[codec(index = 4)] + set_signed_max_limits { + limits: runtime_types::pallet_state_trie_migration::pallet::MigrationLimits, + }, + #[codec(index = 5)] + force_set_progress { + progress_top: runtime_types::pallet_state_trie_migration::pallet::Progress, + progress_child: + runtime_types::pallet_state_trie_migration::pallet::Progress, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + MaxSignedLimits, + #[codec(index = 1)] + KeyTooLong, + #[codec(index = 2)] + NotEnoughFunds, + #[codec(index = 3)] + BadWitness, + #[codec(index = 4)] + SignedMigrationNotAllowed, + #[codec(index = 5)] + BadChildRoot, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Migrated { + top: ::core::primitive::u32, + child: ::core::primitive::u32, + compute: + runtime_types::pallet_state_trie_migration::pallet::MigrationCompute, + }, + #[codec(index = 1)] + Slashed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 2)] + AutoMigrationFinished, + #[codec(index = 3)] + Halted { error: runtime_types::pallet_state_trie_migration::pallet::Error }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MigrationCompute { + #[codec(index = 0)] + Signed, + #[codec(index = 1)] + Auto, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MigrationLimits { + pub size: ::core::primitive::u32, + pub item: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MigrationTask { + pub progress_top: runtime_types::pallet_state_trie_migration::pallet::Progress, + pub progress_child: + runtime_types::pallet_state_trie_migration::pallet::Progress, + pub size: ::core::primitive::u32, + pub top_items: ::core::primitive::u32, + pub child_items: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Progress { + #[codec(index = 0)] + ToStart, + #[codec(index = 1)] + LastKey( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Complete, + } + } + } + pub mod pallet_sudo { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + sudo { call: ::std::boxed::Box }, + #[codec(index = 1)] + sudo_unchecked_weight { + call: ::std::boxed::Box, + weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + set_key { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 3)] + sudo_as { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + RequireSudo, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Sudid { + sudo_result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + KeyChanged { + old_sudoer: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 2)] + SudoAsDone { + sudo_result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_timestamp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set { + #[codec(compact)] + now: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_tips { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_awesome { + reason: ::std::vec::Vec<::core::primitive::u8>, + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + retract_tip { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + tip_new { + reason: ::std::vec::Vec<::core::primitive::u8>, + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + tip_value: ::core::primitive::u128, + }, + #[codec(index = 3)] + tip { + hash: ::subxt::utils::H256, + #[codec(compact)] + tip_value: ::core::primitive::u128, + }, + #[codec(index = 4)] + close_tip { hash: ::subxt::utils::H256 }, + #[codec(index = 5)] + slash_tip { hash: ::subxt::utils::H256 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ReasonTooBig, + #[codec(index = 1)] + AlreadyKnown, + #[codec(index = 2)] + UnknownTip, + #[codec(index = 3)] + NotFinder, + #[codec(index = 4)] + StillOpen, + #[codec(index = 5)] + Premature, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewTip { tip_hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + TipClosing { tip_hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + TipClosed { + tip_hash: ::subxt::utils::H256, + who: ::sp_core::crypto::AccountId32, + payout: ::core::primitive::u128, + }, + #[codec(index = 3)] + TipRetracted { tip_hash: ::subxt::utils::H256 }, + #[codec(index = 4)] + TipSlashed { + tip_hash: ::subxt::utils::H256, + finder: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpenTip<_0, _1, _2, _3> { + pub reason: _3, + pub who: _0, + pub finder: _0, + pub deposit: _1, + pub closes: ::core::option::Option<_2>, + pub tips: ::std::vec::Vec<(_0, _1)>, + pub finders_fee: ::core::primitive::bool, + } + } + pub mod pallet_transaction_payment { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + TransactionFeePaid { + who: ::sp_core::crypto::AccountId32, + actual_fee: ::core::primitive::u128, + tip: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChargeTransactionPayment(#[codec(compact)] pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V1Ancient, + #[codec(index = 1)] + V2, + } + } + pub mod pallet_treasury { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + propose_spend { + #[codec(compact)] + value: ::core::primitive::u128, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + reject_proposal { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + #[codec(index = 2)] + approve_proposal { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + #[codec(index = 3)] + spend { + #[codec(compact)] + amount: ::core::primitive::u128, + beneficiary: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + remove_approval { + #[codec(compact)] + proposal_id: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InsufficientProposersBalance, + #[codec(index = 1)] + InvalidIndex, + #[codec(index = 2)] + TooManyApprovals, + #[codec(index = 3)] + InsufficientPermission, + #[codec(index = 4)] + ProposalNotApproved, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Proposed { proposal_index: ::core::primitive::u32 }, + #[codec(index = 1)] + Spending { budget_remaining: ::core::primitive::u128 }, + #[codec(index = 2)] + Awarded { + proposal_index: ::core::primitive::u32, + award: ::core::primitive::u128, + account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Rejected { + proposal_index: ::core::primitive::u32, + slashed: ::core::primitive::u128, + }, + #[codec(index = 4)] + Burnt { burnt_funds: ::core::primitive::u128 }, + #[codec(index = 5)] + Rollover { rollover_balance: ::core::primitive::u128 }, + #[codec(index = 6)] + Deposit { value: ::core::primitive::u128 }, + #[codec(index = 7)] + SpendApproved { + proposal_index: ::core::primitive::u32, + amount: ::core::primitive::u128, + beneficiary: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + UpdatedInactive { + reactivated: ::core::primitive::u128, + deactivated: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Proposal<_0, _1> { + pub proposer: _0, + pub value: _1, + pub beneficiary: _0, + pub bond: _1, + } + } + pub mod pallet_utility { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + batch { calls: ::std::vec::Vec }, + #[codec(index = 1)] + as_derivative { + index: ::core::primitive::u16, + call: ::std::boxed::Box, + }, + #[codec(index = 2)] + batch_all { calls: ::std::vec::Vec }, + #[codec(index = 3)] + dispatch_as { + as_origin: ::std::boxed::Box, + call: ::std::boxed::Box, + }, + #[codec(index = 4)] + force_batch { + calls: ::std::vec::Vec, + }, + #[codec(index = 5)] + with_weight { + call: ::std::boxed::Box, + weight: ::sp_weights::Weight, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyCalls, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BatchInterrupted { + index: ::core::primitive::u32, + error: runtime_types::sp_runtime::DispatchError, + }, + #[codec(index = 1)] + BatchCompleted, + #[codec(index = 2)] + BatchCompletedWithErrors, + #[codec(index = 3)] + ItemCompleted, + #[codec(index = 4)] + ItemFailed { error: runtime_types::sp_runtime::DispatchError }, + #[codec(index = 5)] + DispatchedAs { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_vesting { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vest, + #[codec(index = 1)] + vest_other { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + vested_transfer { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 3)] + force_vested_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 4)] + merge_schedules { + schedule1_index: ::core::primitive::u32, + schedule2_index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotVesting, + #[codec(index = 1)] + AtMaxVestingSchedules, + #[codec(index = 2)] + AmountLow, + #[codec(index = 3)] + ScheduleIndexOutOfBounds, + #[codec(index = 4)] + InvalidScheduleParams, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + VestingUpdated { + account: ::sp_core::crypto::AccountId32, + unvested: ::core::primitive::u128, + }, + #[codec(index = 1)] + VestingCompleted { account: ::sp_core::crypto::AccountId32 }, + } + } + pub mod vesting_info { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VestingInfo<_0, _1> { + pub locked: _0, + pub per_block: _0, + pub starting_block: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V0, + #[codec(index = 1)] + V1, + } + } + pub mod pallet_xcm { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + send { + dest: ::std::boxed::Box, + message: ::std::boxed::Box, + }, + #[codec(index = 1)] + teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 2)] + reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 3)] + execute { + message: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 4)] + force_xcm_version { + location: + ::std::boxed::Box, + xcm_version: ::core::primitive::u32, + }, + #[codec(index = 5)] + force_default_xcm_version { + maybe_xcm_version: ::core::option::Option<::core::primitive::u32>, + }, + #[codec(index = 6)] + force_subscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 7)] + force_unsubscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 8)] + limited_reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 9)] + limited_teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 10)] + force_suspension { suspended: ::core::primitive::bool }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Unreachable, + #[codec(index = 1)] + SendFailure, + #[codec(index = 2)] + Filtered, + #[codec(index = 3)] + UnweighableMessage, + #[codec(index = 4)] + DestinationNotInvertible, + #[codec(index = 5)] + Empty, + #[codec(index = 6)] + CannotReanchor, + #[codec(index = 7)] + TooManyAssets, + #[codec(index = 8)] + InvalidOrigin, + #[codec(index = 9)] + BadVersion, + #[codec(index = 10)] + BadLocation, + #[codec(index = 11)] + NoSubscription, + #[codec(index = 12)] + AlreadySubscribed, + #[codec(index = 13)] + InvalidAsset, + #[codec(index = 14)] + LowBalance, + #[codec(index = 15)] + TooManyLocks, + #[codec(index = 16)] + AccountNotSovereign, + #[codec(index = 17)] + FeesNotMet, + #[codec(index = 18)] + LockNotFound, + #[codec(index = 19)] + InUse, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Attempted(runtime_types::xcm::v3::traits::Outcome), + #[codec(index = 1)] + Sent( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::Xcm, + ), + #[codec(index = 2)] + UnexpectedResponse( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 3)] + ResponseReady(::core::primitive::u64, runtime_types::xcm::v3::Response), + #[codec(index = 4)] + Notified(::core::primitive::u64, ::core::primitive::u8, ::core::primitive::u8), + #[codec(index = 5)] + NotifyOverweight( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ::sp_weights::Weight, + ::sp_weights::Weight, + ), + #[codec(index = 6)] + NotifyDispatchError( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 7)] + NotifyDecodeFailed( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 8)] + InvalidResponder( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 9)] + InvalidResponderVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 10)] + ResponseTaken(::core::primitive::u64), + #[codec(index = 11)] + AssetsTrapped( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + #[codec(index = 12)] + VersionChangeNotified( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 13)] + SupportedVersionChanged( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + ), + #[codec(index = 14)] + NotifyTargetSendFail( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::traits::Error, + ), + #[codec(index = 15)] + NotifyTargetMigrationFail( + runtime_types::xcm::VersionedMultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 16)] + InvalidQuerierVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 17)] + InvalidQuerier( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 18)] + VersionNotifyStarted( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 19)] + VersionNotifyRequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 20)] + VersionNotifyUnrequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 21)] + FeesPaid( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 22)] + AssetsClaimed( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Xcm(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Response(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum QueryStatus<_0> { + #[codec(index = 0)] + Pending { + responder: runtime_types::xcm::VersionedMultiLocation, + maybe_match_querier: + ::core::option::Option, + maybe_notify: + ::core::option::Option<(::core::primitive::u8, ::core::primitive::u8)>, + timeout: _0, + }, + #[codec(index = 1)] + VersionNotifier { + origin: runtime_types::xcm::VersionedMultiLocation, + is_active: ::core::primitive::bool, + }, + #[codec(index = 2)] + Ready { response: runtime_types::xcm::VersionedResponse, at: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RemoteLockedFungibleRecord<_0> { + pub amount: ::core::primitive::u128, + pub owner: runtime_types::xcm::VersionedMultiLocation, + pub locker: runtime_types::xcm::VersionedMultiLocation, + pub consumers: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _0, + ::core::primitive::u128, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionMigrationStage { + #[codec(index = 0)] + MigrateSupportedVersion, + #[codec(index = 1)] + MigrateVersionNotifiers, + #[codec(index = 2)] + NotifyCurrentTargets( + ::core::option::Option<::std::vec::Vec<::core::primitive::u8>>, + ), + #[codec(index = 3)] + MigrateAndNotifyOldTargets, + } + } + } + pub mod polkadot_core_primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateHash(pub ::subxt::utils::H256); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundDownwardMessage<_0> { + pub sent_at: _0, + pub msg: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundHrmpMessage<_0> { + pub sent_at: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundHrmpMessage<_0> { + pub recipient: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod polkadot_parachain { + use super::runtime_types; + pub mod primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeadData(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannelId { + pub sender: runtime_types::polkadot_parachain::primitives::Id, + pub recipient: runtime_types::polkadot_parachain::primitives::Id, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Id(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCode(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCodeHash(pub ::subxt::utils::H256); + } + } + pub mod polkadot_primitives { + use super::runtime_types; + pub mod v4 { + use super::runtime_types; + pub mod assignment_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod collator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + pub mod executor_params { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ExecutorParam { + #[codec(index = 1)] + MaxMemoryPages(::core::primitive::u32), + #[codec(index = 2)] + StackLogicalMax(::core::primitive::u32), + #[codec(index = 3)] + StackNativeMax(::core::primitive::u32), + #[codec(index = 4)] + PrecheckingMaxMemory(::core::primitive::u64), + #[codec(index = 5)] + PvfPrepTimeout( + runtime_types::polkadot_primitives::v4::PvfPrepTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 6)] + PvfExecTimeout( + runtime_types::polkadot_primitives::v4::PvfExecTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 7)] + WasmExtBulkMemory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ExecutorParams( + pub ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParam, + >, + ); + } + pub mod signed { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedSigned<_0, _1> { + pub payload: _0, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + pub signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_1>, + } + } + pub mod validator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfield( + pub ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BackedCandidate<_0> { + pub candidate: + runtime_types::polkadot_primitives::v4::CommittedCandidateReceipt<_0>, + pub validity_votes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::ValidityAttestation, + >, + pub validator_indices: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateCommitments<_0> { + pub upward_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::std::vec::Vec<::core::primitive::u8>, + >, + pub horizontal_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::polkadot_core_primitives::OutboundHrmpMessage< + runtime_types::polkadot_parachain::primitives::Id, + >, + >, + pub new_validation_code: ::core::option::Option< + runtime_types::polkadot_parachain::primitives::ValidationCode, + >, + pub head_data: runtime_types::polkadot_parachain::primitives::HeadData, + pub processed_downward_messages: _0, + pub hrmp_watermark: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateDescriptor<_0> { + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub relay_parent: _0, + pub collator: runtime_types::polkadot_primitives::v4::collator_app::Public, + pub persisted_validation_data_hash: _0, + pub pov_hash: _0, + pub erasure_root: _0, + pub signature: runtime_types::polkadot_primitives::v4::collator_app::Signature, + pub para_head: _0, + pub validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments_hash: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CommittedCandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments: runtime_types::polkadot_primitives::v4::CandidateCommitments< + ::core::primitive::u32, + >, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct CoreIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum CoreOccupied { + #[codec(index = 0)] + Parathread(runtime_types::polkadot_primitives::v4::ParathreadEntry), + #[codec(index = 1)] + Parachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeState<_0> { + pub validators_for: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub validators_against: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub start: _0, + pub concluded_at: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeStatement { + #[codec(index = 0)] + Valid(runtime_types::polkadot_primitives::v4::ValidDisputeStatementKind), + #[codec(index = 1)] + Invalid(runtime_types::polkadot_primitives::v4::InvalidDisputeStatementKind), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeStatementSet { + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub session: ::core::primitive::u32, + pub statements: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::DisputeStatement, + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Signature, + )>, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct GroupIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IndexedVec<_0, _1>( + pub ::std::vec::Vec<_1>, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InherentData<_0> { + pub bitfields: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::signed::UncheckedSigned< + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + >, + >, + pub backed_candidates: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::BackedCandidate< + ::subxt::utils::H256, + >, + >, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + pub parent_header: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum InvalidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaim( + pub runtime_types::polkadot_parachain::primitives::Id, + pub runtime_types::polkadot_primitives::v4::collator_app::Public, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadEntry { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadClaim, + pub retries: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckStatement { + pub accept: ::core::primitive::bool, + pub subject: runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + pub session_index: ::core::primitive::u32, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfExecTimeoutKind { + #[codec(index = 0)] + Backing, + #[codec(index = 1)] + Approval, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfPrepTimeoutKind { + #[codec(index = 0)] + Precheck, + #[codec(index = 1)] + Lenient, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ScrapedOnChainVotes<_0> { + pub session: ::core::primitive::u32, + pub backing_validators_per_candidate: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::CandidateReceipt<_0>, + ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::ValidityAttestation, + )>, + )>, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionInfo { + pub active_validator_indices: + ::std::vec::Vec, + pub random_seed: [::core::primitive::u8; 32usize], + pub dispute_period: ::core::primitive::u32, + pub validators: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub discovery_keys: + ::std::vec::Vec, + pub assignment_keys: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::assignment_app::Public, + >, + pub validator_groups: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::GroupIndex, + ::std::vec::Vec, + >, + pub n_cores: ::core::primitive::u32, + pub zeroth_delay_tranche_width: ::core::primitive::u32, + pub relay_vrf_modulo_samples: ::core::primitive::u32, + pub n_delay_tranches: ::core::primitive::u32, + pub no_show_slots: ::core::primitive::u32, + pub needed_approvals: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeGoAhead { + #[codec(index = 0)] + Abort, + #[codec(index = 1)] + GoAhead, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeRestriction { + #[codec(index = 0)] + Present, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + #[codec(index = 1)] + BackingSeconded(::subxt::utils::H256), + #[codec(index = 2)] + BackingValid(::subxt::utils::H256), + #[codec(index = 3)] + ApprovalChecking, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ValidatorIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidityAttestation { + #[codec(index = 1)] + Implicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + #[codec(index = 2)] + Explicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + } + } + pub mod vstaging { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AsyncBackingParams { + pub max_candidate_depth: ::core::primitive::u32, + pub allowed_ancestry_len: ::core::primitive::u32, + } + } + } + pub mod polkadot_runtime_common { + use super::runtime_types; + pub mod assigned_slots { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] assign_perm_parachain_slot { id : runtime_types :: polkadot_parachain :: primitives :: Id , } , # [codec (index = 1)] assign_temp_parachain_slot { id : runtime_types :: polkadot_parachain :: primitives :: Id , lease_period_start : runtime_types :: polkadot_runtime_common :: assigned_slots :: SlotLeasePeriodStart , } , # [codec (index = 2)] unassign_parachain_slot { id : runtime_types :: polkadot_parachain :: primitives :: Id , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaDoesntExist, + #[codec(index = 1)] + NotParathread, + #[codec(index = 2)] + CannotUpgrade, + #[codec(index = 3)] + CannotDowngrade, + #[codec(index = 4)] + SlotAlreadyAssigned, + #[codec(index = 5)] + SlotNotAssigned, + #[codec(index = 6)] + OngoingLeaseExists, + #[codec(index = 7)] + MaxPermanentSlotsExceeded, + #[codec(index = 8)] + MaxTemporarySlotsExceeded, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + PermanentSlotAssigned(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + TemporarySlotAssigned(runtime_types::polkadot_parachain::primitives::Id), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParachainTemporarySlot<_0, _1> { + pub manager: _0, + pub period_begin: _1, + pub period_count: _1, + pub last_lease: ::core::option::Option<_1>, + pub lease_count: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum SlotLeasePeriodStart { + #[codec(index = 0)] + Current, + #[codec(index = 1)] + Next, + } + } + pub mod auctions { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + new_auction { + #[codec(compact)] + duration: ::core::primitive::u32, + #[codec(compact)] + lease_period_index: ::core::primitive::u32, + }, + #[codec(index = 1)] + bid { + #[codec(compact)] + para: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + auction_index: ::core::primitive::u32, + #[codec(compact)] + first_slot: ::core::primitive::u32, + #[codec(compact)] + last_slot: ::core::primitive::u32, + #[codec(compact)] + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + cancel_auction, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + AuctionInProgress, + #[codec(index = 1)] + LeasePeriodInPast, + #[codec(index = 2)] + ParaNotRegistered, + #[codec(index = 3)] + NotCurrentAuction, + #[codec(index = 4)] + NotAuction, + #[codec(index = 5)] + AuctionEnded, + #[codec(index = 6)] + AlreadyLeasedOut, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + AuctionStarted { + auction_index: ::core::primitive::u32, + lease_period: ::core::primitive::u32, + ending: ::core::primitive::u32, + }, + #[codec(index = 1)] + AuctionClosed { auction_index: ::core::primitive::u32 }, + #[codec(index = 2)] + Reserved { + bidder: ::sp_core::crypto::AccountId32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + Unreserved { + bidder: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + ReserveConfiscated { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + BidAccepted { + bidder: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + first_slot: ::core::primitive::u32, + last_slot: ::core::primitive::u32, + }, + #[codec(index = 6)] + WinningOffset { + auction_index: ::core::primitive::u32, + block_number: ::core::primitive::u32, + }, + } + } + } + pub mod claims { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim { + dest: ::sp_core::crypto::AccountId32, + ethereum_signature: + runtime_types::polkadot_runtime_common::claims::EcdsaSignature, + }, + #[codec(index = 1)] + mint_claim { + who: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + value: ::core::primitive::u128, + vesting_schedule: ::core::option::Option<( + ::core::primitive::u128, + ::core::primitive::u128, + ::core::primitive::u32, + )>, + statement: ::core::option::Option< + runtime_types::polkadot_runtime_common::claims::StatementKind, + >, + }, + #[codec(index = 2)] + claim_attest { + dest: ::sp_core::crypto::AccountId32, + ethereum_signature: + runtime_types::polkadot_runtime_common::claims::EcdsaSignature, + statement: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 3)] + attest { statement: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + move_claim { + old: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + new: runtime_types::polkadot_runtime_common::claims::EthereumAddress, + maybe_preclaim: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEthereumSignature, + #[codec(index = 1)] + SignerHasNoClaim, + #[codec(index = 2)] + SenderHasNoClaim, + #[codec(index = 3)] + PotUnderflow, + #[codec(index = 4)] + InvalidStatement, + #[codec(index = 5)] + VestedBalanceExists, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Claimed { + who: ::sp_core::crypto::AccountId32, + ethereum_address: + runtime_types::polkadot_runtime_common::claims::EthereumAddress, + amount: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EcdsaSignature(pub [::core::primitive::u8; 65usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EthereumAddress(pub [::core::primitive::u8; 20usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StatementKind { + #[codec(index = 0)] + Regular, + #[codec(index = 1)] + Saft, + } + } + pub mod crowdloan { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + create { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 1)] + contribute { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + value: ::core::primitive::u128, + signature: + ::core::option::Option, + }, + #[codec(index = 2)] + withdraw { + who: ::sp_core::crypto::AccountId32, + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 3)] + refund { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + dissolve { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + edit { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 6)] + add_memo { + index: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 7)] + poke { index: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + contribute_all { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + signature: + ::core::option::Option, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FirstPeriodInPast, + #[codec(index = 1)] + FirstPeriodTooFarInFuture, + #[codec(index = 2)] + LastPeriodBeforeFirstPeriod, + #[codec(index = 3)] + LastPeriodTooFarInFuture, + #[codec(index = 4)] + CannotEndInPast, + #[codec(index = 5)] + EndTooFarInFuture, + #[codec(index = 6)] + Overflow, + #[codec(index = 7)] + ContributionTooSmall, + #[codec(index = 8)] + InvalidParaId, + #[codec(index = 9)] + CapExceeded, + #[codec(index = 10)] + ContributionPeriodOver, + #[codec(index = 11)] + InvalidOrigin, + #[codec(index = 12)] + NotParachain, + #[codec(index = 13)] + LeaseActive, + #[codec(index = 14)] + BidOrLeaseActive, + #[codec(index = 15)] + FundNotEnded, + #[codec(index = 16)] + NoContributions, + #[codec(index = 17)] + NotReadyToDissolve, + #[codec(index = 18)] + InvalidSignature, + #[codec(index = 19)] + MemoTooLarge, + #[codec(index = 20)] + AlreadyInNewRaise, + #[codec(index = 21)] + VrfDelayInProgress, + #[codec(index = 22)] + NoLeasePeriod, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Created { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 1)] + Contributed { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Withdrew { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + PartiallyRefunded { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + AllRefunded { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + Dissolved { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 6)] + HandleBidResult { + para_id: runtime_types::polkadot_parachain::primitives::Id, + result: ::core::result::Result< + (), + runtime_types::sp_runtime::DispatchError, + >, + }, + #[codec(index = 7)] + Edited { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + MemoUpdated { + who: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 9)] + AddedToNewRaise { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct FundInfo<_0, _1, _2, _3> { + pub depositor: _0, + pub verifier: ::core::option::Option, + pub deposit: _1, + pub raised: _1, + pub end: _2, + pub cap: _1, + pub last_contribution: + runtime_types::polkadot_runtime_common::crowdloan::LastContribution<_2>, + pub first_period: _2, + pub last_period: _2, + pub fund_index: _2, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_3>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum LastContribution<_0> { + #[codec(index = 0)] + Never, + #[codec(index = 1)] + PreEnding(_0), + #[codec(index = 2)] + Ending(_0), + } + } + pub mod paras_registrar { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register { + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_register { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 2)] + deregister { id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 3)] + swap { + id: runtime_types::polkadot_parachain::primitives::Id, + other: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + remove_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + reserve, + #[codec(index = 6)] + add_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 7)] + schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 8)] + set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + AlreadyRegistered, + #[codec(index = 2)] + NotOwner, + #[codec(index = 3)] + CodeTooLarge, + #[codec(index = 4)] + HeadDataTooLarge, + #[codec(index = 5)] + NotParachain, + #[codec(index = 6)] + NotParathread, + #[codec(index = 7)] + CannotDeregister, + #[codec(index = 8)] + CannotDowngrade, + #[codec(index = 9)] + CannotUpgrade, + #[codec(index = 10)] + ParaLocked, + #[codec(index = 11)] + NotReserved, + #[codec(index = 12)] + EmptyCode, + #[codec(index = 13)] + CannotSwap, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Registered { + para_id: runtime_types::polkadot_parachain::primitives::Id, + manager: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 1)] + Deregistered { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + Reserved { + para_id: runtime_types::polkadot_parachain::primitives::Id, + who: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Swapped { + para_id: runtime_types::polkadot_parachain::primitives::Id, + other_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaInfo<_0, _1> { + pub manager: _0, + pub deposit: _1, + pub locked: ::core::primitive::bool, + } + } + pub mod paras_sudo_wrapper { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + sudo_schedule_para_initialize { + id: runtime_types::polkadot_parachain::primitives::Id, + genesis: + runtime_types::polkadot_runtime_parachains::paras::ParaGenesisArgs, + }, + #[codec(index = 1)] + sudo_schedule_para_cleanup { + id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 2)] + sudo_schedule_parathread_upgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 3)] + sudo_schedule_parachain_downgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + sudo_queue_downward_xcm { + id: runtime_types::polkadot_parachain::primitives::Id, + xcm: ::std::boxed::Box, + }, + #[codec(index = 5)] + sudo_establish_hrmp_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + recipient: runtime_types::polkadot_parachain::primitives::Id, + max_capacity: ::core::primitive::u32, + max_message_size: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaDoesntExist, + #[codec(index = 1)] + ParaAlreadyExists, + #[codec(index = 2)] + ExceedsMaxMessageSize, + #[codec(index = 3)] + CouldntCleanup, + #[codec(index = 4)] + NotParathread, + #[codec(index = 5)] + NotParachain, + #[codec(index = 6)] + CannotUpgrade, + #[codec(index = 7)] + CannotDowngrade, + } + } + } + pub mod slots { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_lease { + para: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + }, + #[codec(index = 1)] + clear_all_leases { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + trigger_onboard { para: runtime_types::polkadot_parachain::primitives::Id }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaNotOnboarding, + #[codec(index = 1)] + LeaseError, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewLeasePeriod { lease_period: ::core::primitive::u32 }, + #[codec(index = 1)] + Leased { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + } + } + } + } + pub mod polkadot_runtime_parachains { + use super::runtime_types; + pub mod configuration { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] set_validation_upgrade_cooldown { new : :: core :: primitive :: u32 , } , # [codec (index = 1)] set_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 2)] set_code_retention_period { new : :: core :: primitive :: u32 , } , # [codec (index = 3)] set_max_code_size { new : :: core :: primitive :: u32 , } , # [codec (index = 4)] set_max_pov_size { new : :: core :: primitive :: u32 , } , # [codec (index = 5)] set_max_head_data_size { new : :: core :: primitive :: u32 , } , # [codec (index = 6)] set_parathread_cores { new : :: core :: primitive :: u32 , } , # [codec (index = 7)] set_parathread_retries { new : :: core :: primitive :: u32 , } , # [codec (index = 8)] set_group_rotation_frequency { new : :: core :: primitive :: u32 , } , # [codec (index = 9)] set_chain_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 10)] set_thread_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 11)] set_scheduling_lookahead { new : :: core :: primitive :: u32 , } , # [codec (index = 12)] set_max_validators_per_core { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 13)] set_max_validators { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 14)] set_dispute_period { new : :: core :: primitive :: u32 , } , # [codec (index = 15)] set_dispute_post_conclusion_acceptance_period { new : :: core :: primitive :: u32 , } , # [codec (index = 18)] set_no_show_slots { new : :: core :: primitive :: u32 , } , # [codec (index = 19)] set_n_delay_tranches { new : :: core :: primitive :: u32 , } , # [codec (index = 20)] set_zeroth_delay_tranche_width { new : :: core :: primitive :: u32 , } , # [codec (index = 21)] set_needed_approvals { new : :: core :: primitive :: u32 , } , # [codec (index = 22)] set_relay_vrf_modulo_samples { new : :: core :: primitive :: u32 , } , # [codec (index = 23)] set_max_upward_queue_count { new : :: core :: primitive :: u32 , } , # [codec (index = 24)] set_max_upward_queue_size { new : :: core :: primitive :: u32 , } , # [codec (index = 25)] set_max_downward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 27)] set_max_upward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 28)] set_max_upward_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 29)] set_hrmp_open_request_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 30)] set_hrmp_sender_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 31)] set_hrmp_recipient_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 32)] set_hrmp_channel_max_capacity { new : :: core :: primitive :: u32 , } , # [codec (index = 33)] set_hrmp_channel_max_total_size { new : :: core :: primitive :: u32 , } , # [codec (index = 34)] set_hrmp_max_parachain_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 35)] set_hrmp_max_parathread_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 36)] set_hrmp_channel_max_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 37)] set_hrmp_max_parachain_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 38)] set_hrmp_max_parathread_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 39)] set_hrmp_max_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 41)] set_pvf_checking_enabled { new : :: core :: primitive :: bool , } , # [codec (index = 42)] set_pvf_voting_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 43)] set_minimum_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 44)] set_bypass_consistency_check { new : :: core :: primitive :: bool , } , # [codec (index = 45)] set_async_backing_params { new : runtime_types :: polkadot_primitives :: vstaging :: AsyncBackingParams , } , # [codec (index = 46)] set_executor_params { new : runtime_types :: polkadot_primitives :: v4 :: executor_params :: ExecutorParams , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidNewValue, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HostConfiguration<_0> { + pub max_code_size: _0, + pub max_head_data_size: _0, + pub max_upward_queue_count: _0, + pub max_upward_queue_size: _0, + pub max_upward_message_size: _0, + pub max_upward_message_num_per_candidate: _0, + pub hrmp_max_message_num_per_candidate: _0, + pub validation_upgrade_cooldown: _0, + pub validation_upgrade_delay: _0, + pub async_backing_params: + runtime_types::polkadot_primitives::vstaging::AsyncBackingParams, + pub max_pov_size: _0, + pub max_downward_message_size: _0, + pub hrmp_max_parachain_outbound_channels: _0, + pub hrmp_max_parathread_outbound_channels: _0, + pub hrmp_sender_deposit: ::core::primitive::u128, + pub hrmp_recipient_deposit: ::core::primitive::u128, + pub hrmp_channel_max_capacity: _0, + pub hrmp_channel_max_total_size: _0, + pub hrmp_max_parachain_inbound_channels: _0, + pub hrmp_max_parathread_inbound_channels: _0, + pub hrmp_channel_max_message_size: _0, + pub executor_params: + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParams, + pub code_retention_period: _0, + pub parathread_cores: _0, + pub parathread_retries: _0, + pub group_rotation_frequency: _0, + pub chain_availability_period: _0, + pub thread_availability_period: _0, + pub scheduling_lookahead: _0, + pub max_validators_per_core: ::core::option::Option<_0>, + pub max_validators: ::core::option::Option<_0>, + pub dispute_period: _0, + pub dispute_post_conclusion_acceptance_period: _0, + pub no_show_slots: _0, + pub n_delay_tranches: _0, + pub zeroth_delay_tranche_width: _0, + pub needed_approvals: _0, + pub relay_vrf_modulo_samples: _0, + pub pvf_checking_enabled: ::core::primitive::bool, + pub pvf_voting_ttl: _0, + pub minimum_validation_upgrade_delay: _0, + } + } + pub mod disputes { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_unfreeze, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DuplicateDisputeStatementSets, + #[codec(index = 1)] + AncientDisputeStatement, + #[codec(index = 2)] + ValidatorIndexOutOfBounds, + #[codec(index = 3)] + InvalidSignature, + #[codec(index = 4)] + DuplicateStatement, + #[codec(index = 5)] + SingleSidedDispute, + #[codec(index = 6)] + MaliciousBacker, + #[codec(index = 7)] + MissingBackingVotes, + #[codec(index = 8)] + UnconfirmedDispute, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + DisputeInitiated( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeLocation, + ), + #[codec(index = 1)] + DisputeConcluded( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeResult, + ), + #[codec(index = 2)] + Revert(::core::primitive::u32), + } + } + pub mod slashing { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Call { + # [codec (index = 0)] report_dispute_lost_unsigned { dispute_proof : :: std :: boxed :: Box < runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputeProof > , key_owner_proof : :: sp_session :: MembershipProof , } , } + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Error { + #[codec(index = 0)] + InvalidKeyOwnershipProof, + #[codec(index = 1)] + InvalidSessionIndex, + #[codec(index = 2)] + InvalidCandidateHash, + #[codec(index = 3)] + InvalidValidatorIndex, + #[codec(index = 4)] + ValidatorIndexIdMismatch, + #[codec(index = 5)] + DuplicateSlashingReport, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeProof { pub time_slot : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputesTimeSlot , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , pub validator_index : runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , pub validator_id : runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputesTimeSlot { + pub session_index: ::core::primitive::u32, + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PendingSlashes { pub keys : :: subxt :: utils :: KeyedVec < runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public > , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum SlashingOffenceKind { + #[codec(index = 0)] + ForInvalid, + #[codec(index = 1)] + AgainstValid, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeLocation { + #[codec(index = 0)] + Local, + #[codec(index = 1)] + Remote, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeResult { + #[codec(index = 0)] + Valid, + #[codec(index = 1)] + Invalid, + } + } + pub mod hrmp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + hrmp_init_open_channel { + recipient: runtime_types::polkadot_parachain::primitives::Id, + proposed_max_capacity: ::core::primitive::u32, + proposed_max_message_size: ::core::primitive::u32, + }, + #[codec(index = 1)] + hrmp_accept_open_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 2)] + hrmp_close_channel { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + }, + #[codec(index = 3)] + force_clean_hrmp { + para: runtime_types::polkadot_parachain::primitives::Id, + inbound: ::core::primitive::u32, + outbound: ::core::primitive::u32, + }, + #[codec(index = 4)] + force_process_hrmp_open { channels: ::core::primitive::u32 }, + #[codec(index = 5)] + force_process_hrmp_close { channels: ::core::primitive::u32 }, + #[codec(index = 6)] + hrmp_cancel_open_request { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + open_requests: ::core::primitive::u32, + }, + #[codec(index = 7)] + force_open_hrmp_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + recipient: runtime_types::polkadot_parachain::primitives::Id, + max_capacity: ::core::primitive::u32, + max_message_size: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + OpenHrmpChannelToSelf, + #[codec(index = 1)] + OpenHrmpChannelInvalidRecipient, + #[codec(index = 2)] + OpenHrmpChannelZeroCapacity, + #[codec(index = 3)] + OpenHrmpChannelCapacityExceedsLimit, + #[codec(index = 4)] + OpenHrmpChannelZeroMessageSize, + #[codec(index = 5)] + OpenHrmpChannelMessageSizeExceedsLimit, + #[codec(index = 6)] + OpenHrmpChannelAlreadyExists, + #[codec(index = 7)] + OpenHrmpChannelAlreadyRequested, + #[codec(index = 8)] + OpenHrmpChannelLimitExceeded, + #[codec(index = 9)] + AcceptHrmpChannelDoesntExist, + #[codec(index = 10)] + AcceptHrmpChannelAlreadyConfirmed, + #[codec(index = 11)] + AcceptHrmpChannelLimitExceeded, + #[codec(index = 12)] + CloseHrmpChannelUnauthorized, + #[codec(index = 13)] + CloseHrmpChannelDoesntExist, + #[codec(index = 14)] + CloseHrmpChannelAlreadyUnderway, + #[codec(index = 15)] + CancelHrmpOpenChannelUnauthorized, + #[codec(index = 16)] + OpenHrmpChannelDoesntExist, + #[codec(index = 17)] + OpenHrmpChannelAlreadyConfirmed, + #[codec(index = 18)] + WrongWitness, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + OpenChannelRequested( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + #[codec(index = 1)] + OpenChannelCanceled( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 2)] + OpenChannelAccepted( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 3)] + ChannelClosed( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 4)] + HrmpChannelForceOpened( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannel { + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + pub max_message_size: ::core::primitive::u32, + pub msg_count: ::core::primitive::u32, + pub total_size: ::core::primitive::u32, + pub mqc_head: ::core::option::Option<::subxt::utils::H256>, + pub sender_deposit: ::core::primitive::u128, + pub recipient_deposit: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpOpenChannelRequest { + pub confirmed: ::core::primitive::bool, + pub _age: ::core::primitive::u32, + pub sender_deposit: ::core::primitive::u128, + pub max_message_size: ::core::primitive::u32, + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + } + } + pub mod inclusion { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnsortedOrDuplicateValidatorIndices, + #[codec(index = 1)] + UnsortedOrDuplicateDisputeStatementSet, + #[codec(index = 2)] + UnsortedOrDuplicateBackedCandidates, + #[codec(index = 3)] + UnexpectedRelayParent, + #[codec(index = 4)] + WrongBitfieldSize, + #[codec(index = 5)] + BitfieldAllZeros, + #[codec(index = 6)] + BitfieldDuplicateOrUnordered, + #[codec(index = 7)] + ValidatorIndexOutOfBounds, + #[codec(index = 8)] + InvalidBitfieldSignature, + #[codec(index = 9)] + UnscheduledCandidate, + #[codec(index = 10)] + CandidateScheduledBeforeParaFree, + #[codec(index = 11)] + WrongCollator, + #[codec(index = 12)] + ScheduledOutOfOrder, + #[codec(index = 13)] + HeadDataTooLarge, + #[codec(index = 14)] + PrematureCodeUpgrade, + #[codec(index = 15)] + NewCodeTooLarge, + #[codec(index = 16)] + CandidateNotInParentContext, + #[codec(index = 17)] + InvalidGroupIndex, + #[codec(index = 18)] + InsufficientBacking, + #[codec(index = 19)] + InvalidBacking, + #[codec(index = 20)] + NotCollatorSigned, + #[codec(index = 21)] + ValidationDataHashMismatch, + #[codec(index = 22)] + IncorrectDownwardMessageHandling, + #[codec(index = 23)] + InvalidUpwardMessages, + #[codec(index = 24)] + HrmpWatermarkMishandling, + #[codec(index = 25)] + InvalidOutboundHrmp, + #[codec(index = 26)] + InvalidValidationCodeHash, + #[codec(index = 27)] + ParaHeadMismatch, + #[codec(index = 28)] + BitfieldReferencesFreedCore, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CandidateBacked( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 1)] + CandidateIncluded( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 2)] + CandidateTimedOut( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + ), + #[codec(index = 3)] + UpwardMessagesReceived { + from: runtime_types::polkadot_parachain::primitives::Id, + count: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AggregateMessageOrigin { + #[codec(index = 0)] + Ump(runtime_types::polkadot_runtime_parachains::inclusion::UmpQueueId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfieldRecord<_0> { + pub bitfield: runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + pub submitted_at: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidatePendingAvailability<_0, _1> { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub availability_votes: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub backers: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub relay_parent_number: _1, + pub backed_in_number: _1, + pub backing_group: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UmpQueueId { + #[codec(index = 0)] + Para(runtime_types::polkadot_parachain::primitives::Id), + } + } + pub mod initializer { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_approve { up_to: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BufferedSessionChange { + pub validators: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub queued: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub session_index: ::core::primitive::u32, + } + } + pub mod origin { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Parachain(runtime_types::polkadot_parachain::primitives::Id), + } + } + } + pub mod paras { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_set_current_code { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 2)] + force_schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + relay_parent_number: ::core::primitive::u32, + }, + #[codec(index = 3)] + force_note_new_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 4)] + force_queue_action { + para: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + add_trusted_validation_code { + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 6)] + poke_unused_validation_code { + validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + }, + #[codec(index = 7)] + include_pvf_check_statement { + stmt: runtime_types::polkadot_primitives::v4::PvfCheckStatement, + signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + CannotOnboard, + #[codec(index = 2)] + CannotOffboard, + #[codec(index = 3)] + CannotUpgrade, + #[codec(index = 4)] + CannotDowngrade, + #[codec(index = 5)] + PvfCheckStatementStale, + #[codec(index = 6)] + PvfCheckStatementFuture, + #[codec(index = 7)] + PvfCheckValidatorIndexOutOfBounds, + #[codec(index = 8)] + PvfCheckInvalidSignature, + #[codec(index = 9)] + PvfCheckDoubleVote, + #[codec(index = 10)] + PvfCheckSubjectInvalid, + #[codec(index = 11)] + CannotUpgradeCode, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CurrentCodeUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + CurrentHeadUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 2)] + CodeUpgradeScheduled(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 3)] + NewHeadNoted(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 4)] + ActionQueued( + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ), + #[codec(index = 5)] + PvfCheckStarted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 6)] + PvfCheckAccepted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 7)] + PvfCheckRejected( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaGenesisArgs { + pub genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + pub validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + pub para_kind: ::core::primitive::bool, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ParaLifecycle { + #[codec(index = 0)] + Onboarding, + #[codec(index = 1)] + Parathread, + #[codec(index = 2)] + Parachain, + #[codec(index = 3)] + UpgradingParathread, + #[codec(index = 4)] + DowngradingParachain, + #[codec(index = 5)] + OffboardingParathread, + #[codec(index = 6)] + OffboardingParachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaPastCodeMeta<_0> { + pub upgrade_times: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::ReplacementTimes<_0>, + >, + pub last_pruned: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckActiveVoteState<_0> { + pub votes_accept: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub votes_reject: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub age: _0, + pub created_at: _0, + pub causes: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::PvfCheckCause<_0>, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfCheckCause<_0> { + #[codec(index = 0)] + Onboarding(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + Upgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + relay_parent_number: _0, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReplacementTimes<_0> { + pub expected_at: _0, + pub activated_at: _0, + } + } + pub mod paras_inherent { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + enter { + data: runtime_types::polkadot_primitives::v4::InherentData< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyInclusionInherents, + #[codec(index = 1)] + InvalidParentHeader, + #[codec(index = 2)] + CandidateConcludedInvalid, + #[codec(index = 3)] + InherentOverweight, + #[codec(index = 4)] + DisputeStatementsUnsortedOrDuplicates, + #[codec(index = 5)] + DisputeInvalid, + } + } + } + pub mod scheduler { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssignmentKind { + #[codec(index = 0)] + Parachain, + #[codec(index = 1)] + Parathread( + runtime_types::polkadot_primitives::v4::collator_app::Public, + ::core::primitive::u32, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CoreAssignment { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub kind: runtime_types::polkadot_runtime_parachains::scheduler::AssignmentKind, + pub group_idx: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaimQueue { + pub queue: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::scheduler::QueuedParathread, + >, + pub next_core_offset: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueuedParathread { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadEntry, + pub core_offset: ::core::primitive::u32, + } + } + pub mod shared { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + } + } + } + pub mod rococo_runtime { + use super::runtime_types; + pub mod validator_manager { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register_validators { + validators: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 1)] + deregister_validators { + validators: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ValidatorsRegistered(::std::vec::Vec<::sp_core::crypto::AccountId32>), + #[codec(index = 1)] + ValidatorsDeregistered(::std::vec::Vec<::sp_core::crypto::AccountId32>), + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginCaller { + #[codec(index = 0)] + system( + runtime_types::frame_support::dispatch::RawOrigin< + ::sp_core::crypto::AccountId32, + >, + ), + #[codec(index = 14)] + Council( + runtime_types::pallet_collective::RawOrigin<::sp_core::crypto::AccountId32>, + ), + #[codec(index = 15)] + TechnicalCommittee( + runtime_types::pallet_collective::RawOrigin<::sp_core::crypto::AccountId32>, + ), + #[codec(index = 50)] + ParachainsOrigin( + runtime_types::polkadot_runtime_parachains::origin::pallet::Origin, + ), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Origin), + #[codec(index = 5)] + Void(runtime_types::sp_core::Void), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProxyType { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + NonTransfer, + #[codec(index = 2)] + Governance, + #[codec(index = 3)] + IdentityJudgement, + #[codec(index = 4)] + CancelProxy, + #[codec(index = 5)] + Auction, + #[codec(index = 6)] + Society, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Runtime; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeCall { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Call), + #[codec(index = 1)] + Babe(runtime_types::pallet_babe::pallet::Call), + #[codec(index = 2)] + Timestamp(runtime_types::pallet_timestamp::pallet::Call), + #[codec(index = 3)] + Indices(runtime_types::pallet_indices::pallet::Call), + #[codec(index = 4)] + Balances(runtime_types::pallet_balances::pallet::Call), + #[codec(index = 8)] + Session(runtime_types::pallet_session::pallet::Call), + #[codec(index = 10)] + Grandpa(runtime_types::pallet_grandpa::pallet::Call), + #[codec(index = 11)] + ImOnline(runtime_types::pallet_im_online::pallet::Call), + #[codec(index = 13)] + Democracy(runtime_types::pallet_democracy::pallet::Call), + #[codec(index = 14)] + Council(runtime_types::pallet_collective::pallet::Call), + #[codec(index = 15)] + TechnicalCommittee(runtime_types::pallet_collective::pallet::Call), + #[codec(index = 16)] + PhragmenElection(runtime_types::pallet_elections_phragmen::pallet::Call), + #[codec(index = 17)] + TechnicalMembership(runtime_types::pallet_membership::pallet::Call), + #[codec(index = 18)] + Treasury(runtime_types::pallet_treasury::pallet::Call), + #[codec(index = 19)] + Claims(runtime_types::polkadot_runtime_common::claims::pallet::Call), + #[codec(index = 24)] + Utility(runtime_types::pallet_utility::pallet::Call), + #[codec(index = 25)] + Identity(runtime_types::pallet_identity::pallet::Call), + #[codec(index = 26)] + Society(runtime_types::pallet_society::pallet::Call), + #[codec(index = 27)] + Recovery(runtime_types::pallet_recovery::pallet::Call), + #[codec(index = 28)] + Vesting(runtime_types::pallet_vesting::pallet::Call), + #[codec(index = 29)] + Scheduler(runtime_types::pallet_scheduler::pallet::Call), + #[codec(index = 30)] + Proxy(runtime_types::pallet_proxy::pallet::Call), + #[codec(index = 31)] + Multisig(runtime_types::pallet_multisig::pallet::Call), + #[codec(index = 32)] + Preimage(runtime_types::pallet_preimage::pallet::Call), + #[codec(index = 35)] + Bounties(runtime_types::pallet_bounties::pallet::Call), + #[codec(index = 40)] + ChildBounties(runtime_types::pallet_child_bounties::pallet::Call), + #[codec(index = 36)] + Tips(runtime_types::pallet_tips::pallet::Call), + #[codec(index = 38)] + Nis(runtime_types::pallet_nis::pallet::Call), + #[codec(index = 45)] + NisCounterpartBalances(runtime_types::pallet_balances::pallet::Call), + #[codec(index = 51)] + Configuration( + runtime_types::polkadot_runtime_parachains::configuration::pallet::Call, + ), + #[codec(index = 52)] + ParasShared(runtime_types::polkadot_runtime_parachains::shared::pallet::Call), + #[codec(index = 53)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Call), + #[codec(index = 54)] + ParaInherent( + runtime_types::polkadot_runtime_parachains::paras_inherent::pallet::Call, + ), + #[codec(index = 56)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Call), + #[codec(index = 57)] + Initializer(runtime_types::polkadot_runtime_parachains::initializer::pallet::Call), + #[codec(index = 60)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Call), + #[codec(index = 62)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Call), + #[codec(index = 63)] + ParasSlashing( + runtime_types::polkadot_runtime_parachains::disputes::slashing::pallet::Call, + ), + #[codec(index = 64)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Call), + #[codec(index = 70)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Call), + #[codec(index = 71)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Call), + #[codec(index = 72)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Call), + #[codec(index = 73)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Call), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Call), + #[codec(index = 240)] + Beefy(runtime_types::pallet_beefy::pallet::Call), + #[codec(index = 250)] + ParasSudoWrapper( + runtime_types::polkadot_runtime_common::paras_sudo_wrapper::pallet::Call, + ), + #[codec(index = 251)] + AssignedSlots(runtime_types::polkadot_runtime_common::assigned_slots::pallet::Call), + #[codec(index = 252)] + ValidatorManager(runtime_types::rococo_runtime::validator_manager::pallet::Call), + #[codec(index = 254)] + StateTrieMigration(runtime_types::pallet_state_trie_migration::pallet::Call), + #[codec(index = 255)] + Sudo(runtime_types::pallet_sudo::pallet::Call), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeEvent { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Event), + #[codec(index = 3)] + Indices(runtime_types::pallet_indices::pallet::Event), + #[codec(index = 4)] + Balances(runtime_types::pallet_balances::pallet::Event), + #[codec(index = 33)] + TransactionPayment(runtime_types::pallet_transaction_payment::pallet::Event), + #[codec(index = 7)] + Offences(runtime_types::pallet_offences::pallet::Event), + #[codec(index = 8)] + Session(runtime_types::pallet_session::pallet::Event), + #[codec(index = 10)] + Grandpa(runtime_types::pallet_grandpa::pallet::Event), + #[codec(index = 11)] + ImOnline(runtime_types::pallet_im_online::pallet::Event), + #[codec(index = 13)] + Democracy(runtime_types::pallet_democracy::pallet::Event), + #[codec(index = 14)] + Council(runtime_types::pallet_collective::pallet::Event), + #[codec(index = 15)] + TechnicalCommittee(runtime_types::pallet_collective::pallet::Event), + #[codec(index = 16)] + PhragmenElection(runtime_types::pallet_elections_phragmen::pallet::Event), + #[codec(index = 17)] + TechnicalMembership(runtime_types::pallet_membership::pallet::Event), + #[codec(index = 18)] + Treasury(runtime_types::pallet_treasury::pallet::Event), + #[codec(index = 19)] + Claims(runtime_types::polkadot_runtime_common::claims::pallet::Event), + #[codec(index = 24)] + Utility(runtime_types::pallet_utility::pallet::Event), + #[codec(index = 25)] + Identity(runtime_types::pallet_identity::pallet::Event), + #[codec(index = 26)] + Society(runtime_types::pallet_society::pallet::Event), + #[codec(index = 27)] + Recovery(runtime_types::pallet_recovery::pallet::Event), + #[codec(index = 28)] + Vesting(runtime_types::pallet_vesting::pallet::Event), + #[codec(index = 29)] + Scheduler(runtime_types::pallet_scheduler::pallet::Event), + #[codec(index = 30)] + Proxy(runtime_types::pallet_proxy::pallet::Event), + #[codec(index = 31)] + Multisig(runtime_types::pallet_multisig::pallet::Event), + #[codec(index = 32)] + Preimage(runtime_types::pallet_preimage::pallet::Event), + #[codec(index = 35)] + Bounties(runtime_types::pallet_bounties::pallet::Event), + #[codec(index = 40)] + ChildBounties(runtime_types::pallet_child_bounties::pallet::Event), + #[codec(index = 36)] + Tips(runtime_types::pallet_tips::pallet::Event), + #[codec(index = 38)] + Nis(runtime_types::pallet_nis::pallet::Event), + #[codec(index = 45)] + NisCounterpartBalances(runtime_types::pallet_balances::pallet::Event), + #[codec(index = 53)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Event), + #[codec(index = 56)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Event), + #[codec(index = 60)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Event), + #[codec(index = 62)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Event), + #[codec(index = 64)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Event), + #[codec(index = 70)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Event), + #[codec(index = 71)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Event), + #[codec(index = 72)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Event), + #[codec(index = 73)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Event), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Event), + #[codec(index = 251)] + AssignedSlots( + runtime_types::polkadot_runtime_common::assigned_slots::pallet::Event, + ), + #[codec(index = 252)] + ValidatorManager(runtime_types::rococo_runtime::validator_manager::pallet::Event), + #[codec(index = 254)] + StateTrieMigration(runtime_types::pallet_state_trie_migration::pallet::Event), + #[codec(index = 255)] + Sudo(runtime_types::pallet_sudo::pallet::Event), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeHoldReason { + #[codec(index = 38)] + Nis(runtime_types::pallet_nis::pallet::HoldReason), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionKeys { + pub grandpa: runtime_types::sp_consensus_grandpa::app::Public, + pub babe: runtime_types::sp_consensus_babe::app::Public, + pub im_online: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + pub para_validator: runtime_types::polkadot_primitives::v4::validator_app::Public, + pub para_assignment: runtime_types::polkadot_primitives::v4::assignment_app::Public, + pub authority_discovery: runtime_types::sp_authority_discovery::app::Public, + pub beefy: runtime_types::sp_consensus_beefy::crypto::Public, + } + } + pub mod sp_arithmetic { + use super::runtime_types; + pub mod fixed_point { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct FixedU128(pub ::core::primitive::u128); + } + pub mod per_things { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Percent(pub ::core::primitive::u8); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Permill(pub ::core::primitive::u32); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Perquintill(pub ::core::primitive::u64); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ArithmeticError { + #[codec(index = 0)] + Underflow, + #[codec(index = 1)] + Overflow, + #[codec(index = 2)] + DivisionByZero, + } + } + pub mod sp_authority_discovery { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + } + pub mod sp_consensus_babe { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod digests { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NextConfigDescriptor { + #[codec(index = 1)] + V1 { + c: (::core::primitive::u64, ::core::primitive::u64), + allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PreDigest { + #[codec(index = 1)] + Primary(runtime_types::sp_consensus_babe::digests::PrimaryPreDigest), + #[codec(index = 2)] + SecondaryPlain( + runtime_types::sp_consensus_babe::digests::SecondaryPlainPreDigest, + ), + #[codec(index = 3)] + SecondaryVRF(runtime_types::sp_consensus_babe::digests::SecondaryVRFPreDigest), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PrimaryPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryPlainPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryVRFPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AllowedSlots { + #[codec(index = 0)] + PrimarySlots, + #[codec(index = 1)] + PrimaryAndSecondaryPlainSlots, + #[codec(index = 2)] + PrimaryAndSecondaryVRFSlots, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BabeEpochConfiguration { + pub c: (::core::primitive::u64, ::core::primitive::u64), + pub allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + } + } + pub mod sp_consensus_beefy { + use super::runtime_types; + pub mod commitment { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Commitment<_0> { + pub payload: runtime_types::sp_consensus_beefy::payload::Payload, + pub block_number: _0, + pub validator_set_id: ::core::primitive::u64, + } + } + pub mod crypto { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::ecdsa::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::ecdsa::Signature); + } + pub mod mmr { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BeefyAuthoritySet<_0> { + pub id: ::core::primitive::u64, + pub len: ::core::primitive::u32, + pub root: _0, + } + } + pub mod payload { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Payload( + pub ::std::vec::Vec<( + [::core::primitive::u8; 2usize], + ::std::vec::Vec<::core::primitive::u8>, + )>, + ); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EquivocationProof<_0, _1, _2> { + pub first: runtime_types::sp_consensus_beefy::VoteMessage<_0, _1, _2>, + pub second: runtime_types::sp_consensus_beefy::VoteMessage<_0, _1, _2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VoteMessage<_0, _1, _2> { + pub commitment: runtime_types::sp_consensus_beefy::commitment::Commitment<_0>, + pub id: _1, + pub signature: _2, + } + } + pub mod sp_consensus_grandpa { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::ed25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::ed25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Equivocation<_0, _1> { + #[codec(index = 0)] + Prevote( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Prevote<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + #[codec(index = 1)] + Precommit( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Precommit<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + } + } + pub mod sp_consensus_slots { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EquivocationProof<_0, _1> { + pub offender: _1, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub first_header: _0, + pub second_header: _0, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Slot(pub ::core::primitive::u64); + } + pub mod sp_core { + use super::runtime_types; + pub mod crypto { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct KeyTypeId(pub [::core::primitive::u8; 4usize]); + } + pub mod ecdsa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 33usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 65usize]); + } + pub mod ed25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + pub mod offchain { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueMultiaddr(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueNetworkState { + pub peer_id: runtime_types::sp_core::OpaquePeerId, + pub external_addresses: + ::std::vec::Vec, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod vrf { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VrfSignature { + pub output: [::core::primitive::u8; 32usize], + pub proof: [::core::primitive::u8; 64usize], + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaquePeerId(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Void {} + } + pub mod sp_runtime { + use super::runtime_types; + pub mod generic { + use super::runtime_types; + pub mod digest { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DigestItem { + #[codec(index = 6)] + PreRuntime( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 4)] + Consensus( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 5)] + Seal( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 0)] + Other(::std::vec::Vec<::core::primitive::u8>), + #[codec(index = 8)] + RuntimeEnvironmentUpdated, + } + } + pub mod unchecked_extrinsic { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedExtrinsic<_0, _1, _2, _3>( + pub ::std::vec::Vec<::core::primitive::u8>, + #[codec(skip)] pub ::core::marker::PhantomData<(_0, _1, _2, _3)>, + ); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchError { + #[codec(index = 0)] + Other, + #[codec(index = 1)] + CannotLookup, + #[codec(index = 2)] + BadOrigin, + #[codec(index = 3)] + Module(runtime_types::sp_runtime::ModuleError), + #[codec(index = 4)] + ConsumerRemaining, + #[codec(index = 5)] + NoProviders, + #[codec(index = 6)] + TooManyConsumers, + #[codec(index = 7)] + Token(runtime_types::sp_runtime::TokenError), + #[codec(index = 8)] + Arithmetic(runtime_types::sp_arithmetic::ArithmeticError), + #[codec(index = 9)] + Transactional(runtime_types::sp_runtime::TransactionalError), + #[codec(index = 10)] + Exhausted, + #[codec(index = 11)] + Corruption, + #[codec(index = 12)] + Unavailable, + #[codec(index = 13)] + RootNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ModuleError { + pub index: ::core::primitive::u8, + pub error: [::core::primitive::u8; 4usize], + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSignature { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Signature), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Signature), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Signature), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSigner { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Public), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Public), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Public), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TokenError { + #[codec(index = 0)] + FundsUnavailable, + #[codec(index = 1)] + OnlyProvider, + #[codec(index = 2)] + BelowMinimum, + #[codec(index = 3)] + CannotCreate, + #[codec(index = 4)] + UnknownAsset, + #[codec(index = 5)] + Frozen, + #[codec(index = 6)] + Unsupported, + #[codec(index = 7)] + CannotCreateHold, + #[codec(index = 8)] + NotExpendable, + #[codec(index = 9)] + Blocked, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionalError { + #[codec(index = 0)] + LimitReached, + #[codec(index = 1)] + NoLayer, + } + } + pub mod sp_staking { + use super::runtime_types; + pub mod offence { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OffenceDetails<_0, _1> { + pub offender: _1, + pub reporters: ::std::vec::Vec<_0>, + } + } + } + pub mod sp_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeVersion { + pub spec_name: ::std::string::String, + pub impl_name: ::std::string::String, + pub authoring_version: ::core::primitive::u32, + pub spec_version: ::core::primitive::u32, + pub impl_version: ::core::primitive::u32, + pub apis: + ::std::vec::Vec<([::core::primitive::u8; 8usize], ::core::primitive::u32)>, + pub transaction_version: ::core::primitive::u32, + pub state_version: ::core::primitive::u8, + } + } + pub mod sp_weights { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeDbWeight { + pub read: ::core::primitive::u64, + pub write: ::core::primitive::u64, + } + } + pub mod xcm { + use super::runtime_types; + pub mod double_encoded { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DoubleEncoded { + pub encoded: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod v2 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: runtime_types::xcm::v2::NetworkId, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: runtime_types::xcm::v2::NetworkId, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: runtime_types::xcm::v2::NetworkId, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v2::BodyId, + part: runtime_types::xcm::v2::BodyPart, + }, + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + #[codec(index = 6)] + Blob(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v2::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v2::multiasset::AssetId, + pub fun: runtime_types::xcm::v2::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v2::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v2::multiasset::AssetId, + fun: runtime_types::xcm::v2::multiasset::WildFungibility, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v2::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v2::multilocation::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + MultiLocationFull, + #[codec(index = 5)] + MultiLocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + UnhandledXcmVersion, + #[codec(index = 23)] + WeightLimitReached(::core::primitive::u64), + #[codec(index = 24)] + Barrier, + #[codec(index = 25)] + WeightNotComputable, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v2::Response, + #[codec(compact)] + max_weight: ::core::primitive::u64, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_type: runtime_types::xcm::v2::OriginKind, + #[codec(compact)] + require_weight_at_most: ::core::primitive::u64, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v2::multilocation::Junctions), + #[codec(index = 12)] + ReportError { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + receive: runtime_types::xcm::v2::multiasset::MultiAssets, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 18)] + QueryHolding { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v2::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v2::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v2::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v2::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + ticket: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 27)] + UnsubscribeVersion, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginKind { + #[codec(index = 0)] + Native, + #[codec(index = 1)] + SovereignAccount, + #[codec(index = 2)] + Superuser, + #[codec(index = 3)] + Xcm, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v2::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(#[codec(compact)] ::core::primitive::u64), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + pub mod v3 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Moniker([::core::primitive::u8; 4usize]), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: + ::core::option::Option, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: + ::core::option::Option, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: + ::core::option::Option, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey { + length: ::core::primitive::u8, + data: [::core::primitive::u8; 32usize], + }, + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v3::junction::BodyId, + part: runtime_types::xcm::v3::junction::BodyPart, + }, + #[codec(index = 9)] + GlobalConsensus(runtime_types::xcm::v3::junction::NetworkId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + ByGenesis([::core::primitive::u8; 32usize]), + #[codec(index = 1)] + ByFork { + block_number: ::core::primitive::u64, + block_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + #[codec(index = 4)] + Westend, + #[codec(index = 5)] + Rococo, + #[codec(index = 6)] + Wococo, + #[codec(index = 7)] + Ethereum { + #[codec(compact)] + chain_id: ::core::primitive::u64, + }, + #[codec(index = 8)] + BitcoinCore, + #[codec(index = 9)] + BitcoinCash, + } + } + pub mod junctions { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v3::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v3::multiasset::AssetId, + pub fun: runtime_types::xcm::v3::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v3::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + }, + #[codec(index = 2)] + AllCounted(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + AllOfCounted { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + #[codec(compact)] + count: ::core::primitive::u32, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v3::junctions::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + LocationFull, + #[codec(index = 5)] + LocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + ExpectationFalse, + #[codec(index = 23)] + PalletNotFound, + #[codec(index = 24)] + NameMismatch, + #[codec(index = 25)] + VersionIncompatible, + #[codec(index = 26)] + HoldingWouldOverflow, + #[codec(index = 27)] + ExportError, + #[codec(index = 28)] + ReanchorFailed, + #[codec(index = 29)] + NoDeal, + #[codec(index = 30)] + FeesNotMet, + #[codec(index = 31)] + LockError, + #[codec(index = 32)] + NoPermission, + #[codec(index = 33)] + Unanchored, + #[codec(index = 34)] + NotDepositable, + #[codec(index = 35)] + UnhandledXcmVersion, + #[codec(index = 36)] + WeightLimitReached(::sp_weights::Weight), + #[codec(index = 37)] + Barrier, + #[codec(index = 38)] + WeightNotComputable, + #[codec(index = 39)] + ExceedsStackLimit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Outcome { + #[codec(index = 0)] + Complete(::sp_weights::Weight), + #[codec(index = 1)] + Incomplete(::sp_weights::Weight, runtime_types::xcm::v3::traits::Error), + #[codec(index = 2)] + Error(runtime_types::xcm::v3::traits::Error), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v3::Response, + max_weight: ::sp_weights::Weight, + querier: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_kind: runtime_types::xcm::v2::OriginKind, + require_weight_at_most: ::sp_weights::Weight, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v3::junctions::Junctions), + #[codec(index = 12)] + ReportError(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + want: runtime_types::xcm::v3::multiasset::MultiAssets, + maximal: ::core::primitive::bool, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 18)] + ReportHolding { + response_info: runtime_types::xcm::v3::QueryResponseInfo, + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v3::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v3::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v3::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + ticket: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + max_response_weight: ::sp_weights::Weight, + }, + #[codec(index = 27)] + UnsubscribeVersion, + #[codec(index = 28)] + BurnAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 29)] + ExpectAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 30)] + ExpectOrigin( + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 31)] + ExpectError( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 32)] + ExpectTransactStatus(runtime_types::xcm::v3::MaybeErrorCode), + #[codec(index = 33)] + QueryPallet { + module_name: ::std::vec::Vec<::core::primitive::u8>, + response_info: runtime_types::xcm::v3::QueryResponseInfo, + }, + #[codec(index = 34)] + ExpectPallet { + #[codec(compact)] + index: ::core::primitive::u32, + name: ::std::vec::Vec<::core::primitive::u8>, + module_name: ::std::vec::Vec<::core::primitive::u8>, + #[codec(compact)] + crate_major: ::core::primitive::u32, + #[codec(compact)] + min_crate_minor: ::core::primitive::u32, + }, + #[codec(index = 35)] + ReportTransactStatus(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 36)] + ClearTransactStatus, + #[codec(index = 37)] + UniversalOrigin(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 38)] + ExportMessage { + network: runtime_types::xcm::v3::junction::NetworkId, + destination: runtime_types::xcm::v3::junctions::Junctions, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 39)] + LockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + unlocker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 40)] + UnlockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + target: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 41)] + NoteUnlockable { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + owner: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 42)] + RequestUnlock { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + locker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 43)] + SetFeesMode { jit_withdraw: ::core::primitive::bool }, + #[codec(index = 44)] + SetTopic([::core::primitive::u8; 32usize]), + #[codec(index = 45)] + ClearTopic, + #[codec(index = 46)] + AliasOrigin(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 47)] + UnpaidExecution { + weight_limit: runtime_types::xcm::v3::WeightLimit, + check_origin: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MaybeErrorCode { + #[codec(index = 0)] + Success, + #[codec(index = 1)] + Error( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + TruncatedError( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletInfo { + #[codec(compact)] + pub index: ::core::primitive::u32, + pub name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + pub module_name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + #[codec(compact)] + pub major: ::core::primitive::u32, + #[codec(compact)] + pub minor: ::core::primitive::u32, + #[codec(compact)] + pub patch: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueryResponseInfo { + pub destination: runtime_types::xcm::v3::multilocation::MultiLocation, + #[codec(compact)] + pub query_id: ::core::primitive::u64, + pub max_weight: ::sp_weights::Weight, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + #[codec(index = 4)] + PalletsInfo( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::xcm::v3::PalletInfo, + >, + ), + #[codec(index = 5)] + DispatchResult(runtime_types::xcm::v3::MaybeErrorCode), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(::sp_weights::Weight), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedAssetId { + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::AssetId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiAssets { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::MultiAssets), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiLocation { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedResponse { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Response), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Response), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedXcm { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Xcm), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Xcm), + } + } + } +} diff --git a/relays/client-rococo/src/lib.rs b/relays/client-rococo/src/lib.rs new file mode 100644 index 000000000000..5ac11f1ef723 --- /dev/null +++ b/relays/client-rococo/src/lib.rs @@ -0,0 +1,134 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the Rococo-Substrate chain. + +pub mod codegen_runtime; + +use bp_polkadot_core::SuffixedCommonSignedExtensionExt; +use bp_rococo::ROCOCO_SYNCED_HEADERS_GRANDPA_INFO_METHOD; +use bp_runtime::ChainId; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithGrandpa, ChainWithTransactions, Error as SubstrateError, + RelayChain, SignParam, UnderlyingChainProvider, UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount, MultiAddress}; +use sp_session::MembershipProof; +use std::time::Duration; + +pub use codegen_runtime::api::runtime_types; + +pub type RuntimeCall = runtime_types::rococo_runtime::RuntimeCall; + +pub type GrandpaCall = runtime_types::pallet_grandpa::pallet::Call; + +/// Rococo header id. +pub type HeaderId = relay_utils::HeaderId; + +/// Rococo header type used in headers sync. +pub type SyncHeader = relay_substrate_client::SyncHeader; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Rococo chain definition +#[derive(Debug, Clone, Copy)] +pub struct Rococo; + +impl UnderlyingChainProvider for Rococo { + type Chain = bp_rococo::Rococo; +} + +impl Chain for Rococo { + const ID: ChainId = bp_runtime::ROCOCO_CHAIN_ID; + const NAME: &'static str = "Rococo"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_rococo::BEST_FINALIZED_ROCOCO_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(6); + + type SignedBlock = bp_rococo::SignedBlock; + type Call = RuntimeCall; +} + +impl ChainWithGrandpa for Rococo { + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str = + ROCOCO_SYNCED_HEADERS_GRANDPA_INFO_METHOD; + + type KeyOwnerProof = MembershipProof; +} + +impl ChainWithBalances for Rococo { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + bp_rococo::AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl RelayChain for Rococo { + const PARAS_PALLET_NAME: &'static str = bp_rococo::PARAS_PALLET_NAME; +} + +impl ChainWithTransactions for Rococo { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = + bp_polkadot_core::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + bp_rococo::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + ((), ()), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(Self::SignedTransaction::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| *address == Address::Id(signer.public().into())) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} diff --git a/relays/client-substrate/Cargo.toml b/relays/client-substrate/Cargo.toml new file mode 100644 index 000000000000..fff118bd28a4 --- /dev/null +++ b/relays/client-substrate/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "relay-substrate-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +async-std = { version = "1.6.5", features = ["attributes"] } +async-trait = "0.1" +codec = { package = "parity-scale-codec", version = "3.1.5" } +futures = "0.3.29" +jsonrpsee = { version = "0.17", features = ["macros", "ws-client"] } +log = "0.4.20" +num-traits = "0.2" +rand = "0.8" +scale-info = { version = "2.10.0", features = ["derive"] } +tokio = { version = "1.35", features = ["rt-multi-thread"] } +thiserror = "1.0.51" + +# Bridge dependencies + +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-runtime = { path = "../../primitives/runtime" } +pallet-bridge-messages = { path = "../../modules/messages" } +finality-relay = { path = "../finality" } +relay-utils = { path = "../utils" } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +pallet-transaction-payment = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +pallet-utility = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sc-chain-spec = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sc-rpc-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sc-transaction-pool-api = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-rpc = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-std = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-trie = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-version = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +# Polkadot Dependencies + +xcm = { package = "staging-xcm", git = "https://github.com/paritytech/polkadot-sdk", branch = "master", default-features = false } + +[features] +default = [] +test-helpers = [] diff --git a/relays/client-substrate/src/calls.rs b/relays/client-substrate/src/calls.rs new file mode 100644 index 000000000000..4e0ae9d99d2e --- /dev/null +++ b/relays/client-substrate/src/calls.rs @@ -0,0 +1,59 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Basic runtime calls. + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +use sp_std::{boxed::Box, vec::Vec}; + +use xcm::{VersionedMultiLocation, VersionedXcm}; + +/// A minimized version of `frame-system::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum SystemCall { + /// `frame-system::Call::remark` + #[codec(index = 1)] + remark(Vec), +} + +/// A minimized version of `pallet-utility::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum UtilityCall { + /// `pallet-utility::Call::batch_all` + #[codec(index = 2)] + batch_all(Vec), +} + +/// A minimized version of `pallet-sudo::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum SudoCall { + /// `pallet-sudo::Call::sudo` + #[codec(index = 0)] + sudo(Box), +} + +/// A minimized version of `pallet-xcm::Call`, that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum XcmCall { + /// `pallet-xcm::Call::send` + #[codec(index = 0)] + send(Box, Box>), +} diff --git a/relays/client-substrate/src/chain.rs b/relays/client-substrate/src/chain.rs new file mode 100644 index 000000000000..ced25fe8ddb2 --- /dev/null +++ b/relays/client-substrate/src/chain.rs @@ -0,0 +1,302 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::calls::UtilityCall; + +use bp_header_chain::ChainWithGrandpa as ChainWithGrandpaBase; +use bp_messages::MessageNonce; +use bp_runtime::{ + Chain as ChainBase, ChainId, EncodedOrDecodedCall, HashOf, Parachain as ParachainBase, + TransactionEra, TransactionEraOf, UnderlyingChainProvider, +}; +use codec::{Codec, Decode, Encode}; +use jsonrpsee::core::{DeserializeOwned, Serialize}; +use num_traits::Zero; +use sc_transaction_pool_api::TransactionStatus; +use scale_info::TypeInfo; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{ + generic::SignedBlock, + traits::{Block as BlockT, Member}, + ConsensusEngineId, EncodedJustification, +}; +use std::{fmt::Debug, time::Duration}; + +/// Substrate-based chain from minimal relay-client point of view. +pub trait Chain: ChainBase + Clone { + /// Chain id. + const ID: ChainId; + /// Chain name. + const NAME: &'static str; + /// Name of the runtime API method that is returning best known finalized header number + /// and hash (as tuple). + /// + /// Keep in mind that this method is normally provided by the other chain, which is + /// bridged with this chain. + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str; + + /// Average block interval. + /// + /// How often blocks are produced on that chain. It's suggested to set this value + /// to match the block time of the chain. + const AVERAGE_BLOCK_INTERVAL: Duration; + + /// Block type. + type SignedBlock: Member + Serialize + DeserializeOwned + BlockWithJustification; + /// The aggregated `Call` type. + type Call: Clone + Codec + Debug + Send + Sync; +} + +/// Substrate-based relay chain that supports parachains. +/// +/// We assume that the parachains are supported using `runtime_parachains::paras` pallet. +pub trait RelayChain: Chain { + /// Name of the `runtime_parachains::paras` pallet in the runtime of this chain. + const PARAS_PALLET_NAME: &'static str; +} + +/// Substrate-based chain that is using direct GRANDPA finality from minimal relay-client point of +/// view. +/// +/// Keep in mind that parachains are relying on relay chain GRANDPA, so they should not implement +/// this trait. +pub trait ChainWithGrandpa: Chain + ChainWithGrandpaBase { + /// Name of the runtime API method that is returning the GRANDPA info associated with the + /// headers accepted by the `submit_finality_proofs` extrinsic in the queried block. + /// + /// Keep in mind that this method is normally provided by the other chain, which is + /// bridged with this chain. + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str; + + /// The type of the key owner proof used by the grandpa engine. + type KeyOwnerProof: Decode + TypeInfo + Send; +} + +/// Substrate-based parachain from minimal relay-client point of view. +pub trait Parachain: Chain + ParachainBase {} + +impl Parachain for T where T: UnderlyingChainProvider + Chain + ParachainBase {} + +/// Substrate-based chain with messaging support from minimal relay-client point of view. +pub trait ChainWithMessages: Chain { + /// Name of the bridge messages pallet (used in `construct_runtime` macro call) that is deployed + /// at some other chain to bridge with this `ChainWithMessages`. + /// + /// We assume that all chains that are bridging with this `ChainWithMessages` are using + /// the same name. + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str; + + // TODO (https://github.com/paritytech/parity-bridges-common/issues/1692): check all the names + // after the issue is fixed - all names must be changed + + /// Name of the bridge relayers pallet (used in `construct_runtime` macro call) that is deployed + /// at some other chain to bridge with this `ChainWithMessages`. + /// + /// We assume that all chains that are bridging with this `ChainWithMessages` are using + /// the same name. + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str>; + + /// Name of the `ToOutboundLaneApi::message_details` runtime API method. + /// The method is provided by the runtime that is bridged with this `ChainWithMessages`. + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str; + + /// Name of the `FromInboundLaneApi::message_details` runtime API method. + /// The method is provided by the runtime that is bridged with this `ChainWithMessages`. + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str; + + /// Maximal number of unrewarded relayers in a single confirmation transaction at this + /// `ChainWithMessages`. + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce; + /// Maximal number of unconfirmed messages in a single confirmation transaction at this + /// `ChainWithMessages`. + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce; +} + +/// Call type used by the chain. +pub type CallOf = ::Call; +/// Transaction status of the chain. +pub type TransactionStatusOf = TransactionStatus, HashOf>; + +/// Substrate-based chain with `AccountData` generic argument of `frame_system::AccountInfo` set to +/// the `pallet_balances::AccountData`. +pub trait ChainWithBalances: Chain { + /// Return runtime storage key for getting `frame_system::AccountInfo` of given account. + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey; +} + +/// SCALE-encoded extrinsic. +pub type EncodedExtrinsic = Vec; + +/// Block with justification. +pub trait BlockWithJustification
{ + /// Return block header. + fn header(&self) -> Header; + /// Return encoded block extrinsics. + fn extrinsics(&self) -> Vec; + /// Return block justification, if known. + fn justification(&self, engine_id: ConsensusEngineId) -> Option<&EncodedJustification>; +} + +/// Transaction before it is signed. +#[derive(Clone, Debug, PartialEq)] +pub struct UnsignedTransaction { + /// Runtime call of this transaction. + pub call: EncodedOrDecodedCall, + /// Transaction nonce. + pub nonce: C::Nonce, + /// Tip included into transaction. + pub tip: C::Balance, + /// Transaction era used by the chain. + pub era: TransactionEraOf, +} + +impl UnsignedTransaction { + /// Create new unsigned transaction with given call, nonce, era and zero tip. + pub fn new(call: EncodedOrDecodedCall, nonce: C::Nonce) -> Self { + Self { call, nonce, era: TransactionEra::Immortal, tip: Zero::zero() } + } + + /// Convert to the transaction of the other compatible chain. + pub fn switch_chain(self) -> UnsignedTransaction + where + Other: Chain< + Nonce = C::Nonce, + Balance = C::Balance, + BlockNumber = C::BlockNumber, + Hash = C::Hash, + >, + { + UnsignedTransaction { + call: EncodedOrDecodedCall::Encoded(self.call.into_encoded()), + nonce: self.nonce, + tip: self.tip, + era: self.era, + } + } + + /// Set transaction tip. + #[must_use] + pub fn tip(mut self, tip: C::Balance) -> Self { + self.tip = tip; + self + } + + /// Set transaction era. + #[must_use] + pub fn era(mut self, era: TransactionEraOf) -> Self { + self.era = era; + self + } +} + +/// Account key pair used by transactions signing scheme. +pub type AccountKeyPairOf = ::AccountKeyPair; + +/// Substrate-based chain transactions signing scheme. +pub trait ChainWithTransactions: Chain { + /// Type of key pairs used to sign transactions. + type AccountKeyPair: Pair + Clone + Send + Sync; + /// Signed transaction. + type SignedTransaction: Clone + Debug + Codec + Send + 'static; + + /// Create transaction for given runtime call, signed by given account. + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result + where + Self: Sized; + + /// Returns true if transaction is signed. + fn is_signed(tx: &Self::SignedTransaction) -> bool; + + /// Returns true if transaction is signed by given signer. + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool; + + /// Parse signed transaction into its unsigned part. + /// + /// Returns `None` if signed transaction has unsupported format. + fn parse_transaction(tx: Self::SignedTransaction) -> Option>; +} + +/// Sign transaction parameters +pub struct SignParam { + /// Version of the runtime specification. + pub spec_version: u32, + /// Transaction version + pub transaction_version: u32, + /// Hash of the genesis block. + pub genesis_hash: HashOf, + /// Signer account + pub signer: AccountKeyPairOf, +} + +impl BlockWithJustification for SignedBlock { + fn header(&self) -> Block::Header { + self.block.header().clone() + } + + fn extrinsics(&self) -> Vec { + self.block.extrinsics().iter().map(Encode::encode).collect() + } + + fn justification(&self, engine_id: ConsensusEngineId) -> Option<&EncodedJustification> { + self.justifications.as_ref().and_then(|j| j.get(engine_id)) + } +} + +/// Trait that provides functionality defined inside `pallet-utility` +pub trait UtilityPallet { + /// Create batch call from given calls vector. + fn build_batch_call(calls: Vec) -> C::Call; +} + +/// Structure that implements `UtilityPalletProvider` based on a full runtime. +pub struct FullRuntimeUtilityPallet { + _phantom: std::marker::PhantomData, +} + +impl UtilityPallet for FullRuntimeUtilityPallet +where + C: Chain, + R: pallet_utility::Config, + ::RuntimeCall: From>, +{ + fn build_batch_call(calls: Vec) -> C::Call { + pallet_utility::Call::batch_all { calls }.into() + } +} + +/// Structure that implements `UtilityPalletProvider` based on a call conversion. +pub struct MockedRuntimeUtilityPallet { + _phantom: std::marker::PhantomData, +} + +impl UtilityPallet for MockedRuntimeUtilityPallet +where + C: Chain, + C::Call: From>, +{ + fn build_batch_call(calls: Vec) -> C::Call { + UtilityCall::batch_all(calls).into() + } +} + +/// Substrate-based chain that uses `pallet-utility`. +pub trait ChainWithUtilityPallet: Chain { + /// The utility pallet provider. + type UtilityPallet: UtilityPallet; +} diff --git a/relays/client-substrate/src/client.rs b/relays/client-substrate/src/client.rs new file mode 100644 index 000000000000..8328e1ce8bec --- /dev/null +++ b/relays/client-substrate/src/client.rs @@ -0,0 +1,851 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate node client. + +use crate::{ + chain::{Chain, ChainWithTransactions}, + rpc::{ + SubstrateAuthorClient, SubstrateChainClient, SubstrateFinalityClient, + SubstrateFrameSystemClient, SubstrateStateClient, SubstrateSystemClient, + }, + transaction_stall_timeout, AccountKeyPairOf, ChainWithGrandpa, ConnectionParams, Error, HashOf, + HeaderIdOf, Result, SignParam, TransactionTracker, UnsignedTransaction, +}; + +use async_std::sync::{Arc, Mutex, RwLock}; +use async_trait::async_trait; +use bp_runtime::{HeaderIdProvider, StorageDoubleMapKeyProvider, StorageMapKeyProvider}; +use codec::{Decode, Encode}; +use frame_support::weights::Weight; +use futures::{SinkExt, StreamExt}; +use jsonrpsee::{ + core::DeserializeOwned, + ws_client::{WsClient as RpcClient, WsClientBuilder as RpcClientBuilder}, +}; +use num_traits::{Saturating, Zero}; +use pallet_transaction_payment::RuntimeDispatchInfo; +use relay_utils::{relay_loop::RECONNECT_DELAY, STALL_TIMEOUT}; +use sp_core::{ + storage::{StorageData, StorageKey}, + Bytes, Hasher, Pair, +}; +use sp_runtime::{ + traits::Header as HeaderT, + transaction_validity::{TransactionSource, TransactionValidity}, +}; +use sp_trie::StorageProof; +use sp_version::RuntimeVersion; +use std::future::Future; + +const SUB_API_GRANDPA_AUTHORITIES: &str = "GrandpaApi_grandpa_authorities"; +const SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF: &str = + "GrandpaApi_generate_key_ownership_proof"; +const SUB_API_TXPOOL_VALIDATE_TRANSACTION: &str = "TaggedTransactionQueue_validate_transaction"; +const SUB_API_TX_PAYMENT_QUERY_INFO: &str = "TransactionPaymentApi_query_info"; +const MAX_SUBSCRIPTION_CAPACITY: usize = 4096; + +/// The difference between best block number and number of its ancestor, that is enough +/// for us to consider that ancestor an "ancient" block with dropped state. +/// +/// The relay does not assume that it is connected to the archive node, so it always tries +/// to use the best available chain state. But sometimes it still may use state of some +/// old block. If the state of that block is already dropped, relay will see errors when +/// e.g. it tries to prove something. +/// +/// By default Substrate-based nodes are storing state for last 256 blocks. We'll use +/// half of this value. +pub const ANCIENT_BLOCK_THRESHOLD: u32 = 128; + +/// Returns `true` if we think that the state is already discarded for given block. +pub fn is_ancient_block + PartialOrd + Saturating>(block: N, best: N) -> bool { + best.saturating_sub(block) >= N::from(ANCIENT_BLOCK_THRESHOLD) +} + +/// Opaque justifications subscription type. +pub struct Subscription(pub(crate) Mutex>>); + +/// Opaque GRANDPA authorities set. +pub type OpaqueGrandpaAuthoritiesSet = Vec; + +/// A simple runtime version. It only includes the `spec_version` and `transaction_version`. +#[derive(Copy, Clone, Debug)] +pub struct SimpleRuntimeVersion { + /// Version of the runtime specification. + pub spec_version: u32, + /// All existing dispatches are fully compatible when this number doesn't change. + pub transaction_version: u32, +} + +impl SimpleRuntimeVersion { + /// Create a new instance of `SimpleRuntimeVersion` from a `RuntimeVersion`. + pub const fn from_runtime_version(runtime_version: &RuntimeVersion) -> Self { + Self { + spec_version: runtime_version.spec_version, + transaction_version: runtime_version.transaction_version, + } + } +} + +/// Chain runtime version in client +#[derive(Clone, Debug)] +pub enum ChainRuntimeVersion { + /// Auto query from chain. + Auto, + /// Custom runtime version, defined by user. + Custom(SimpleRuntimeVersion), +} + +/// Substrate client type. +/// +/// Cloning `Client` is a cheap operation that only clones internal references. Different +/// clones of the same client are guaranteed to use the same references. +pub struct Client { + // Lock order: `submit_signed_extrinsic_lock`, `data` + /// Client connection params. + params: Arc, + /// Saved chain runtime version. + chain_runtime_version: ChainRuntimeVersion, + /// If several tasks are submitting their transactions simultaneously using + /// `submit_signed_extrinsic` method, they may get the same transaction nonce. So one of + /// transactions will be rejected from the pool. This lock is here to prevent situations like + /// that. + submit_signed_extrinsic_lock: Arc>, + /// Genesis block hash. + genesis_hash: HashOf, + /// Shared dynamic data. + data: Arc>, +} + +/// Client data, shared by all `Client` clones. +struct ClientData { + /// Tokio runtime handle. + tokio: Arc, + /// Substrate RPC client. + client: Arc, +} + +/// Already encoded value. +struct PreEncoded(Vec); + +impl Encode for PreEncoded { + fn encode(&self) -> Vec { + self.0.clone() + } +} + +#[async_trait] +impl relay_utils::relay_loop::Client for Client { + type Error = Error; + + async fn reconnect(&mut self) -> Result<()> { + let mut data = self.data.write().await; + let (tokio, client) = Self::build_client(&self.params).await?; + data.tokio = tokio; + data.client = client; + Ok(()) + } +} + +impl Clone for Client { + fn clone(&self) -> Self { + Client { + params: self.params.clone(), + chain_runtime_version: self.chain_runtime_version.clone(), + submit_signed_extrinsic_lock: self.submit_signed_extrinsic_lock.clone(), + genesis_hash: self.genesis_hash, + data: self.data.clone(), + } + } +} + +impl std::fmt::Debug for Client { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("Client").field("genesis_hash", &self.genesis_hash).finish() + } +} + +impl Client { + /// Returns client that is able to call RPCs on Substrate node over websocket connection. + /// + /// This function will keep connecting to given Substrate node until connection is established + /// and is functional. If attempt fail, it will wait for `RECONNECT_DELAY` and retry again. + pub async fn new(params: ConnectionParams) -> Self { + let params = Arc::new(params); + loop { + match Self::try_connect(params.clone()).await { + Ok(client) => return client, + Err(error) => log::error!( + target: "bridge", + "Failed to connect to {} node: {:?}. Going to retry in {}s", + C::NAME, + error, + RECONNECT_DELAY.as_secs(), + ), + } + + async_std::task::sleep(RECONNECT_DELAY).await; + } + } + + /// Try to connect to Substrate node over websocket. Returns Substrate RPC client if connection + /// has been established or error otherwise. + pub async fn try_connect(params: Arc) -> Result { + let (tokio, client) = Self::build_client(¶ms).await?; + + let number: C::BlockNumber = Zero::zero(); + let genesis_hash_client = client.clone(); + let genesis_hash = tokio + .spawn(async move { + SubstrateChainClient::::block_hash(&*genesis_hash_client, Some(number)).await + }) + .await??; + + let chain_runtime_version = params.chain_runtime_version.clone(); + Ok(Self { + params, + chain_runtime_version, + submit_signed_extrinsic_lock: Arc::new(Mutex::new(())), + genesis_hash, + data: Arc::new(RwLock::new(ClientData { tokio, client })), + }) + } + + /// Build client to use in connection. + async fn build_client( + params: &ConnectionParams, + ) -> Result<(Arc, Arc)> { + let tokio = tokio::runtime::Runtime::new()?; + let uri = format!( + "{}://{}:{}", + if params.secure { "wss" } else { "ws" }, + params.host, + params.port, + ); + log::info!(target: "bridge", "Connecting to {} node at {}", C::NAME, uri); + + let client = tokio + .spawn(async move { + RpcClientBuilder::default() + .max_buffer_capacity_per_subscription(MAX_SUBSCRIPTION_CAPACITY) + .build(&uri) + .await + }) + .await??; + + Ok((Arc::new(tokio), Arc::new(client))) + } +} + +impl Client { + /// Return simple runtime version, only include `spec_version` and `transaction_version`. + pub async fn simple_runtime_version(&self) -> Result { + Ok(match &self.chain_runtime_version { + ChainRuntimeVersion::Auto => { + let runtime_version = self.runtime_version().await?; + SimpleRuntimeVersion::from_runtime_version(&runtime_version) + }, + ChainRuntimeVersion::Custom(version) => *version, + }) + } + + /// Returns true if client is connected to at least one peer and is in synced state. + pub async fn ensure_synced(&self) -> Result<()> { + self.jsonrpsee_execute(|client| async move { + let health = SubstrateSystemClient::::health(&*client).await?; + let is_synced = !health.is_syncing && (!health.should_have_peers || health.peers > 0); + if is_synced { + Ok(()) + } else { + Err(Error::ClientNotSynced(health)) + } + }) + .await + } + + /// Return hash of the genesis block. + pub fn genesis_hash(&self) -> &C::Hash { + &self.genesis_hash + } + + /// Return hash of the best finalized block. + pub async fn best_finalized_header_hash(&self) -> Result { + self.jsonrpsee_execute(|client| async move { + Ok(SubstrateChainClient::::finalized_head(&*client).await?) + }) + .await + .map_err(|e| Error::FailedToReadBestFinalizedHeaderHash { + chain: C::NAME.into(), + error: e.boxed(), + }) + } + + /// Return number of the best finalized block. + pub async fn best_finalized_header_number(&self) -> Result { + Ok(*self.best_finalized_header().await?.number()) + } + + /// Return header of the best finalized block. + pub async fn best_finalized_header(&self) -> Result { + self.header_by_hash(self.best_finalized_header_hash().await?).await + } + + /// Returns the best Substrate header. + pub async fn best_header(&self) -> Result + where + C::Header: DeserializeOwned, + { + self.jsonrpsee_execute(|client| async move { + Ok(SubstrateChainClient::::header(&*client, None).await?) + }) + .await + .map_err(|e| Error::FailedToReadBestHeader { chain: C::NAME.into(), error: e.boxed() }) + } + + /// Get a Substrate block from its hash. + pub async fn get_block(&self, block_hash: Option) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::block(&*client, block_hash).await?) + }) + .await + } + + /// Get a Substrate header by its hash. + pub async fn header_by_hash(&self, block_hash: C::Hash) -> Result + where + C::Header: DeserializeOwned, + { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::header(&*client, Some(block_hash)).await?) + }) + .await + .map_err(|e| Error::FailedToReadHeaderByHash { + chain: C::NAME.into(), + hash: format!("{block_hash}"), + error: e.boxed(), + }) + } + + /// Get a Substrate block hash by its number. + pub async fn block_hash_by_number(&self, number: C::BlockNumber) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::block_hash(&*client, Some(number)).await?) + }) + .await + } + + /// Get a Substrate header by its number. + pub async fn header_by_number(&self, block_number: C::BlockNumber) -> Result + where + C::Header: DeserializeOwned, + { + let block_hash = Self::block_hash_by_number(self, block_number).await?; + let header_by_hash = Self::header_by_hash(self, block_hash).await?; + Ok(header_by_hash) + } + + /// Return runtime version. + pub async fn runtime_version(&self) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateStateClient::::runtime_version(&*client).await?) + }) + .await + } + + /// Read value from runtime storage. + pub async fn storage_value( + &self, + storage_key: StorageKey, + block_hash: Option, + ) -> Result> { + self.raw_storage_value(storage_key, block_hash) + .await? + .map(|encoded_value| { + T::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) + }) + .transpose() + } + + /// Read `MapStorage` value from runtime storage. + pub async fn storage_map_value( + &self, + pallet_prefix: &str, + key: &T::Key, + block_hash: Option, + ) -> Result> { + let storage_key = T::final_key(pallet_prefix, key); + + self.raw_storage_value(storage_key, block_hash) + .await? + .map(|encoded_value| { + T::Value::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) + }) + .transpose() + } + + /// Read `DoubleMapStorage` value from runtime storage. + pub async fn storage_double_map_value( + &self, + pallet_prefix: &str, + key1: &T::Key1, + key2: &T::Key2, + block_hash: Option, + ) -> Result> { + let storage_key = T::final_key(pallet_prefix, key1, key2); + + self.raw_storage_value(storage_key, block_hash) + .await? + .map(|encoded_value| { + T::Value::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) + }) + .transpose() + } + + /// Read raw value from runtime storage. + pub async fn raw_storage_value( + &self, + storage_key: StorageKey, + block_hash: Option, + ) -> Result> { + let cloned_storage_key = storage_key.clone(); + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateStateClient::::storage(&*client, storage_key.clone(), block_hash) + .await?) + }) + .await + .map_err(|e| Error::FailedToReadRuntimeStorageValue { + chain: C::NAME.into(), + key: cloned_storage_key, + error: e.boxed(), + }) + } + + /// Get the nonce of the given Substrate account. + /// + /// Note: It's the caller's responsibility to make sure `account` is a valid SS58 address. + pub async fn next_account_index(&self, account: C::AccountId) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateFrameSystemClient::::account_next_index(&*client, account).await?) + }) + .await + } + + /// Submit unsigned extrinsic for inclusion in a block. + /// + /// Note: The given transaction needs to be SCALE encoded beforehand. + pub async fn submit_unsigned_extrinsic(&self, transaction: Bytes) -> Result { + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + let best_header_hash = self.best_header().await?.hash(); + self.validate_transaction(best_header_hash, PreEncoded(transaction.0.clone())) + .await + .map_err(|e| { + log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); + e + })??; + + self.jsonrpsee_execute(move |client| async move { + let tx_hash = SubstrateAuthorClient::::submit_extrinsic(&*client, transaction) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + Ok(tx_hash) + }) + .await + } + + async fn build_sign_params(&self, signer: AccountKeyPairOf) -> Result> + where + C: ChainWithTransactions, + { + let runtime_version = self.simple_runtime_version().await?; + Ok(SignParam:: { + spec_version: runtime_version.spec_version, + transaction_version: runtime_version.transaction_version, + genesis_hash: self.genesis_hash, + signer, + }) + } + + /// Submit an extrinsic signed by given account. + /// + /// All calls of this method are synchronized, so there can't be more than one active + /// `submit_signed_extrinsic()` call. This guarantees that no nonces collision may happen + /// if all client instances are clones of the same initial `Client`. + /// + /// Note: The given transaction needs to be SCALE encoded beforehand. + pub async fn submit_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, C::Nonce) -> Result> + + Send + + 'static, + ) -> Result + where + C: ChainWithTransactions, + C::AccountId: From<::Public>, + { + let _guard = self.submit_signed_extrinsic_lock.lock().await; + let transaction_nonce = self.next_account_index(signer.public().into()).await?; + let best_header = self.best_header().await?; + let signing_data = self.build_sign_params(signer.clone()).await?; + + // By using parent of best block here, we are protecing again best-block reorganizations. + // E.g. transaction may have been submitted when the best block was `A[num=100]`. Then it + // has been changed to `B[num=100]`. Hash of `A` has been included into transaction + // signature payload. So when signature will be checked, the check will fail and transaction + // will be dropped from the pool. + let best_header_id = best_header.parent_id().unwrap_or_else(|| best_header.id()); + + let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; + let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); + + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + self.validate_transaction(best_header_id.1, PreEncoded(signed_extrinsic.clone())) + .await + .map_err(|e| { + log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); + e + })??; + + self.jsonrpsee_execute(move |client| async move { + let tx_hash = + SubstrateAuthorClient::::submit_extrinsic(&*client, Bytes(signed_extrinsic)) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + Ok(tx_hash) + }) + .await + } + + /// Does exactly the same as `submit_signed_extrinsic`, but keeps watching for extrinsic status + /// after submission. + pub async fn submit_and_watch_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, C::Nonce) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + C::AccountId: From<::Public>, + { + let self_clone = self.clone(); + let signing_data = self.build_sign_params(signer.clone()).await?; + let _guard = self.submit_signed_extrinsic_lock.lock().await; + let transaction_nonce = self.next_account_index(signer.public().into()).await?; + let best_header = self.best_header().await?; + let best_header_id = best_header.id(); + + let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; + let stall_timeout = transaction_stall_timeout( + extrinsic.era.mortality_period(), + C::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ); + let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); + + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + self.validate_transaction(best_header_id.1, PreEncoded(signed_extrinsic.clone())) + .await + .map_err(|e| { + log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); + e + })??; + + let (sender, receiver) = futures::channel::mpsc::channel(MAX_SUBSCRIPTION_CAPACITY); + let (tracker, subscription) = self + .jsonrpsee_execute(move |client| async move { + let tx_hash = C::Hasher::hash(&signed_extrinsic); + let subscription = SubstrateAuthorClient::::submit_and_watch_extrinsic( + &*client, + Bytes(signed_extrinsic), + ) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + let tracker = TransactionTracker::new( + self_clone, + stall_timeout, + tx_hash, + Subscription(Mutex::new(receiver)), + ); + Ok((tracker, subscription)) + }) + .await?; + self.data.read().await.tokio.spawn(Subscription::background_worker( + C::NAME.into(), + "extrinsic".into(), + subscription, + sender, + )); + Ok(tracker) + } + + /// Returns pending extrinsics from transaction pool. + pub async fn pending_extrinsics(&self) -> Result> { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateAuthorClient::::pending_extrinsics(&*client).await?) + }) + .await + } + + /// Validate transaction at given block state. + pub async fn validate_transaction( + &self, + at_block: C::Hash, + transaction: SignedTransaction, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + let call = SUB_API_TXPOOL_VALIDATE_TRANSACTION.to_string(); + let data = Bytes((TransactionSource::External, transaction, at_block).encode()); + + let encoded_response = + SubstrateStateClient::::call(&*client, call, data, Some(at_block)).await?; + let validity = TransactionValidity::decode(&mut &encoded_response.0[..]) + .map_err(Error::ResponseParseFailed)?; + + Ok(validity) + }) + .await + } + + /// Returns weight of the given transaction. + pub async fn extimate_extrinsic_weight( + &self, + transaction: SignedTransaction, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + let transaction_len = transaction.encoded_size() as u32; + + let call = SUB_API_TX_PAYMENT_QUERY_INFO.to_string(); + let data = Bytes((transaction, transaction_len).encode()); + + let encoded_response = + SubstrateStateClient::::call(&*client, call, data, None).await?; + let dispatch_info = + RuntimeDispatchInfo::::decode(&mut &encoded_response.0[..]) + .map_err(Error::ResponseParseFailed)?; + + Ok(dispatch_info.weight) + }) + .await + } + + /// Get the GRANDPA authority set at given block. + pub async fn grandpa_authorities_set( + &self, + block: C::Hash, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + let call = SUB_API_GRANDPA_AUTHORITIES.to_string(); + let data = Bytes(Vec::new()); + + let encoded_response = + SubstrateStateClient::::call(&*client, call, data, Some(block)).await?; + let authority_list = encoded_response.0; + + Ok(authority_list) + }) + .await + } + + /// Execute runtime call at given block, provided the input and output types. + /// It also performs the input encode and output decode. + pub async fn typed_state_call( + &self, + method_name: String, + input: Input, + at_block: Option, + ) -> Result { + let encoded_output = self + .state_call(method_name.clone(), Bytes(input.encode()), at_block) + .await + .map_err(|e| Error::ErrorExecutingRuntimeCall { + chain: C::NAME.into(), + method: method_name, + error: e.boxed(), + })?; + Output::decode(&mut &encoded_output.0[..]).map_err(Error::ResponseParseFailed) + } + + /// Execute runtime call at given block. + pub async fn state_call( + &self, + method: String, + data: Bytes, + at_block: Option, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + SubstrateStateClient::::call(&*client, method, data, at_block) + .await + .map_err(Into::into) + }) + .await + } + + /// Returns storage proof of given storage keys. + pub async fn prove_storage( + &self, + keys: Vec, + at_block: C::Hash, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + SubstrateStateClient::::prove_storage(&*client, keys, Some(at_block)) + .await + .map(|proof| { + StorageProof::new(proof.proof.into_iter().map(|b| b.0).collect::>()) + }) + .map_err(Into::into) + }) + .await + } + + /// Return `tokenDecimals` property from the set of chain properties. + pub async fn token_decimals(&self) -> Result> { + self.jsonrpsee_execute(move |client| async move { + let system_properties = SubstrateSystemClient::::properties(&*client).await?; + Ok(system_properties.get("tokenDecimals").and_then(|v| v.as_u64())) + }) + .await + } + + /// Return new finality justifications stream. + pub async fn subscribe_finality_justifications>( + &self, + ) -> Result> { + let subscription = self + .jsonrpsee_execute(move |client| async move { + Ok(FC::subscribe_justifications(&client).await?) + }) + .await?; + let (sender, receiver) = futures::channel::mpsc::channel(MAX_SUBSCRIPTION_CAPACITY); + self.data.read().await.tokio.spawn(Subscription::background_worker( + C::NAME.into(), + "justification".into(), + subscription, + sender, + )); + Ok(Subscription(Mutex::new(receiver))) + } + + /// Generates a proof of key ownership for the given authority in the given set. + pub async fn generate_grandpa_key_ownership_proof( + &self, + at: HashOf, + set_id: sp_consensus_grandpa::SetId, + authority_id: sp_consensus_grandpa::AuthorityId, + ) -> Result> + where + C: ChainWithGrandpa, + { + self.typed_state_call( + SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF.into(), + (set_id, authority_id), + Some(at), + ) + .await + } + + /// Execute jsonrpsee future in tokio context. + async fn jsonrpsee_execute(&self, make_jsonrpsee_future: MF) -> Result + where + MF: FnOnce(Arc) -> F + Send + 'static, + F: Future> + Send + 'static, + T: Send + 'static, + { + let data = self.data.read().await; + let client = data.client.clone(); + data.tokio.spawn(make_jsonrpsee_future(client)).await? + } + + /// Returns `true` if version guard can be started. + /// + /// There's no reason to run version guard when version mode is set to `Auto`. It can + /// lead to relay shutdown when chain is upgraded, even though we have explicitly + /// said that we don't want to shutdown. + pub fn can_start_version_guard(&self) -> bool { + !matches!(self.chain_runtime_version, ChainRuntimeVersion::Auto) + } +} + +impl Subscription { + /// Consumes subscription and returns future statuses stream. + pub fn into_stream(self) -> impl futures::Stream { + futures::stream::unfold(self, |this| async { + let item = this.0.lock().await.next().await.unwrap_or(None); + item.map(|i| (i, this)) + }) + } + + /// Return next item from the subscription. + pub async fn next(&self) -> Result> { + let mut receiver = self.0.lock().await; + let item = receiver.next().await; + Ok(item.unwrap_or(None)) + } + + /// Background worker that is executed in tokio context as `jsonrpsee` requires. + async fn background_worker( + chain_name: String, + item_type: String, + mut subscription: jsonrpsee::core::client::Subscription, + mut sender: futures::channel::mpsc::Sender>, + ) { + loop { + match subscription.next().await { + Some(Ok(item)) => + if sender.send(Some(item)).await.is_err() { + break + }, + Some(Err(e)) => { + log::trace!( + target: "bridge", + "{} {} subscription stream has returned '{:?}'. Stream needs to be restarted.", + chain_name, + item_type, + e, + ); + let _ = sender.send(None).await; + break + }, + None => { + log::trace!( + target: "bridge", + "{} {} subscription stream has returned None. Stream needs to be restarted.", + chain_name, + item_type, + ); + let _ = sender.send(None).await; + break + }, + } + } + } +} diff --git a/relays/client-substrate/src/error.rs b/relays/client-substrate/src/error.rs new file mode 100644 index 000000000000..40015c122bbe --- /dev/null +++ b/relays/client-substrate/src/error.rs @@ -0,0 +1,153 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate node RPC errors. + +use bp_polkadot_core::parachains::ParaId; +use jsonrpsee::core::Error as RpcError; +use relay_utils::MaybeConnectionError; +use sc_rpc_api::system::Health; +use sp_core::storage::StorageKey; +use sp_runtime::transaction_validity::TransactionValidityError; +use thiserror::Error; + +/// Result type used by Substrate client. +pub type Result = std::result::Result; + +/// Errors that can occur only when interacting with +/// a Substrate node through RPC. +#[derive(Error, Debug)] +pub enum Error { + /// IO error. + #[error("IO error: {0}")] + Io(#[from] std::io::Error), + /// An error that can occur when making a request to + /// an JSON-RPC server. + #[error("RPC error: {0}")] + RpcError(#[from] RpcError), + /// The response from the server could not be SCALE decoded. + #[error("Response parse failed: {0}")] + ResponseParseFailed(#[from] codec::Error), + /// Account does not exist on the chain. + #[error("Account does not exist on the chain.")] + AccountDoesNotExist, + /// Runtime storage is missing some mandatory value. + #[error("Mandatory storage value is missing from the runtime storage.")] + MissingMandatoryStorageValue, + /// Required parachain head is not present at the relay chain. + #[error("Parachain {0:?} head {1} is missing from the relay chain storage.")] + MissingRequiredParachainHead(ParaId, u64), + /// Failed to find finality proof for the given header. + #[error("Failed to find finality proof for header {0}.")] + FinalityProofNotFound(u64), + /// The client we're connected to is not synced, so we can't rely on its state. + #[error("Substrate client is not synced {0}.")] + ClientNotSynced(Health), + /// Failed to read best finalized header hash from given chain. + #[error("Failed to read best finalized header hash of {chain}: {error:?}.")] + FailedToReadBestFinalizedHeaderHash { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to read best finalized header from given chain. + #[error("Failed to read best header of {chain}: {error:?}.")] + FailedToReadBestHeader { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to read header by hash from given chain. + #[error("Failed to read header {hash} of {chain}: {error:?}.")] + FailedToReadHeaderByHash { + /// Name of the chain where the error has happened. + chain: String, + /// Hash of the header we've tried to read. + hash: String, + /// Underlying error. + error: Box, + }, + /// Failed to execute runtime call at given chain. + #[error("Failed to execute runtime call {method} at {chain}: {error:?}.")] + ErrorExecutingRuntimeCall { + /// Name of the chain where the error has happened. + chain: String, + /// Runtime method name. + method: String, + /// Underlying error. + error: Box, + }, + /// Failed to read sotrage value at given chain. + #[error("Failed to read storage value {key:?} at {chain}: {error:?}.")] + FailedToReadRuntimeStorageValue { + /// Name of the chain where the error has happened. + chain: String, + /// Runtime storage key + key: StorageKey, + /// Underlying error. + error: Box, + }, + /// The bridge pallet is halted and all transactions will be rejected. + #[error("Bridge pallet is halted.")] + BridgePalletIsHalted, + /// The bridge pallet is not yet initialized and all transactions will be rejected. + #[error("Bridge pallet is not initialized.")] + BridgePalletIsNotInitialized, + /// There's no best head of the parachain at the `pallet-bridge-parachains` at the target side. + #[error("No head of the ParaId({0}) at the bridge parachains pallet at {1}.")] + NoParachainHeadAtTarget(u32, String), + /// An error has happened when we have tried to parse storage proof. + #[error("Error when parsing storage proof: {0:?}.")] + StorageProofError(bp_runtime::StorageProofError), + /// The Substrate transaction is invalid. + #[error("Substrate transaction is invalid: {0:?}")] + TransactionInvalid(#[from] TransactionValidityError), + /// Custom logic error. + #[error("{0}")] + Custom(String), +} + +impl From for Error { + fn from(error: tokio::task::JoinError) -> Self { + Error::Custom(format!("Failed to wait tokio task: {error}")) + } +} + +impl Error { + /// Box the error. + pub fn boxed(self) -> Box { + Box::new(self) + } +} + +impl MaybeConnectionError for Error { + fn is_connection_error(&self) -> bool { + match *self { + Error::RpcError(RpcError::Transport(_)) | + Error::RpcError(RpcError::RestartNeeded(_)) | + Error::ClientNotSynced(_) => true, + Error::FailedToReadBestFinalizedHeaderHash { ref error, .. } => + error.is_connection_error(), + Error::FailedToReadBestHeader { ref error, .. } => error.is_connection_error(), + Error::FailedToReadHeaderByHash { ref error, .. } => error.is_connection_error(), + Error::ErrorExecutingRuntimeCall { ref error, .. } => error.is_connection_error(), + Error::FailedToReadRuntimeStorageValue { ref error, .. } => error.is_connection_error(), + _ => false, + } + } +} diff --git a/relays/client-substrate/src/guard.rs b/relays/client-substrate/src/guard.rs new file mode 100644 index 000000000000..545396b30b85 --- /dev/null +++ b/relays/client-substrate/src/guard.rs @@ -0,0 +1,196 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Pallet provides a set of guard functions that are running in background threads +//! and are aborting process if some condition fails. + +use crate::{error::Error, Chain, Client}; + +use async_trait::async_trait; +use sp_version::RuntimeVersion; +use std::{ + fmt::Display, + time::{Duration, Instant}, +}; + +/// Guards environment. +#[async_trait] +pub trait Environment: Send + Sync + 'static { + /// Error type. + type Error: Display + Send + Sync + 'static; + + /// Return current runtime version. + async fn runtime_version(&mut self) -> Result; + + /// Return current time. + fn now(&self) -> Instant { + Instant::now() + } + + /// Sleep given amount of time. + async fn sleep(&mut self, duration: Duration) { + async_std::task::sleep(duration).await + } + + /// Abort current process. Called when guard condition check fails. + async fn abort(&mut self) { + std::process::abort(); + } +} + +/// Abort when runtime spec version is different from specified. +pub fn abort_on_spec_version_change( + mut env: impl Environment, + expected_spec_version: u32, +) { + async_std::task::spawn(async move { + log::info!( + target: "bridge-guard", + "Starting spec_version guard for {}. Expected spec_version: {}", + C::NAME, + expected_spec_version, + ); + + loop { + let actual_spec_version = env.runtime_version().await; + match actual_spec_version { + Ok(version) if version.spec_version == expected_spec_version => (), + Ok(version) => { + log::error!( + target: "bridge-guard", + "{} runtime spec version has changed from {} to {}. Aborting relay", + C::NAME, + expected_spec_version, + version.spec_version, + ); + + env.abort().await; + }, + Err(error) => log::warn!( + target: "bridge-guard", + "Failed to read {} runtime version: {}. Relay may need to be stopped manually", + C::NAME, + error, + ), + } + + env.sleep(conditions_check_delay::()).await; + } + }); +} + +/// Delay between conditions check. +fn conditions_check_delay() -> Duration { + C::AVERAGE_BLOCK_INTERVAL * (10 + rand::random::() % 10) +} + +#[async_trait] +impl Environment for Client { + type Error = Error; + + async fn runtime_version(&mut self) -> Result { + Client::::runtime_version(self).await + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_chain::TestChain; + use futures::{ + channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}, + future::FutureExt, + stream::StreamExt, + SinkExt, + }; + + struct TestEnvironment { + runtime_version_rx: UnboundedReceiver, + slept_tx: UnboundedSender<()>, + aborted_tx: UnboundedSender<()>, + } + + #[async_trait] + impl Environment for TestEnvironment { + type Error = Error; + + async fn runtime_version(&mut self) -> Result { + Ok(self.runtime_version_rx.next().await.unwrap_or_default()) + } + + async fn sleep(&mut self, _duration: Duration) { + let _ = self.slept_tx.send(()).await; + } + + async fn abort(&mut self) { + let _ = self.aborted_tx.send(()).await; + // simulate process abort :) + async_std::task::sleep(Duration::from_secs(60)).await; + } + } + + #[test] + fn aborts_when_spec_version_is_changed() { + async_std::task::block_on(async { + let ( + (mut runtime_version_tx, runtime_version_rx), + (slept_tx, mut slept_rx), + (aborted_tx, mut aborted_rx), + ) = (unbounded(), unbounded(), unbounded()); + abort_on_spec_version_change( + TestEnvironment { runtime_version_rx, slept_tx, aborted_tx }, + 0, + ); + + // client responds with wrong version + runtime_version_tx + .send(RuntimeVersion { spec_version: 42, ..Default::default() }) + .await + .unwrap(); + + // then the `abort` function is called + aborted_rx.next().await; + // and we do not reach the `sleep` function call + assert!(slept_rx.next().now_or_never().is_none()); + }); + } + + #[test] + fn does_not_aborts_when_spec_version_is_unchanged() { + async_std::task::block_on(async { + let ( + (mut runtime_version_tx, runtime_version_rx), + (slept_tx, mut slept_rx), + (aborted_tx, mut aborted_rx), + ) = (unbounded(), unbounded(), unbounded()); + abort_on_spec_version_change( + TestEnvironment { runtime_version_rx, slept_tx, aborted_tx }, + 42, + ); + + // client responds with the same version + runtime_version_tx + .send(RuntimeVersion { spec_version: 42, ..Default::default() }) + .await + .unwrap(); + + // then the `sleep` function is called + slept_rx.next().await; + // and the `abort` function is not called + assert!(aborted_rx.next().now_or_never().is_none()); + }); + } +} diff --git a/relays/client-substrate/src/lib.rs b/relays/client-substrate/src/lib.rs new file mode 100644 index 000000000000..84c2ad10cf8f --- /dev/null +++ b/relays/client-substrate/src/lib.rs @@ -0,0 +1,94 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools to interact with Substrate node using RPC methods. + +#![warn(missing_docs)] + +mod chain; +mod client; +mod error; +mod rpc; +mod sync_header; +mod transaction_tracker; + +pub mod calls; +pub mod guard; +pub mod metrics; +pub mod test_chain; + +use std::time::Duration; + +pub use crate::{ + chain::{ + AccountKeyPairOf, BlockWithJustification, CallOf, Chain, ChainWithBalances, + ChainWithGrandpa, ChainWithMessages, ChainWithTransactions, ChainWithUtilityPallet, + FullRuntimeUtilityPallet, MockedRuntimeUtilityPallet, Parachain, RelayChain, SignParam, + TransactionStatusOf, UnsignedTransaction, UtilityPallet, + }, + client::{ + is_ancient_block, ChainRuntimeVersion, Client, OpaqueGrandpaAuthoritiesSet, + SimpleRuntimeVersion, Subscription, ANCIENT_BLOCK_THRESHOLD, + }, + error::{Error, Result}, + rpc::{SubstrateBeefyFinalityClient, SubstrateFinalityClient, SubstrateGrandpaFinalityClient}, + sync_header::SyncHeader, + transaction_tracker::TransactionTracker, +}; +pub use bp_runtime::{ + AccountIdOf, AccountPublicOf, BalanceOf, BlockNumberOf, Chain as ChainBase, HashOf, HeaderIdOf, + HeaderOf, NonceOf, Parachain as ParachainBase, SignatureOf, TransactionEra, TransactionEraOf, + UnderlyingChainProvider, +}; + +/// Substrate-over-websocket connection params. +#[derive(Debug, Clone)] +pub struct ConnectionParams { + /// Websocket server host name. + pub host: String, + /// Websocket server TCP port. + pub port: u16, + /// Use secure websocket connection. + pub secure: bool, + /// Defined chain runtime version + pub chain_runtime_version: ChainRuntimeVersion, +} + +impl Default for ConnectionParams { + fn default() -> Self { + ConnectionParams { + host: "localhost".into(), + port: 9944, + secure: false, + chain_runtime_version: ChainRuntimeVersion::Auto, + } + } +} + +/// Returns stall timeout for relay loop. +/// +/// Relay considers himself stalled if he has submitted transaction to the node, but it has not +/// been mined for this period. +pub fn transaction_stall_timeout( + mortality_period: Option, + average_block_interval: Duration, + default_stall_timeout: Duration, +) -> Duration { + // 1 extra block for transaction to reach the pool && 1 for relayer to awake after it is mined + mortality_period + .map(|mortality_period| average_block_interval.saturating_mul(mortality_period + 1 + 1)) + .unwrap_or(default_stall_timeout) +} diff --git a/relays/client-substrate/src/metrics/float_storage_value.rs b/relays/client-substrate/src/metrics/float_storage_value.rs new file mode 100644 index 000000000000..7bb92693b38d --- /dev/null +++ b/relays/client-substrate/src/metrics/float_storage_value.rs @@ -0,0 +1,133 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{chain::Chain, client::Client, Error as SubstrateError}; + +use async_std::sync::{Arc, RwLock}; +use async_trait::async_trait; +use codec::Decode; +use num_traits::One; +use relay_utils::metrics::{ + metric_name, register, F64SharedRef, Gauge, Metric, PrometheusError, Registry, + StandaloneMetric, F64, +}; +use sp_core::storage::{StorageData, StorageKey}; +use sp_runtime::{traits::UniqueSaturatedInto, FixedPointNumber, FixedU128}; +use std::{marker::PhantomData, time::Duration}; + +/// Storage value update interval (in blocks). +const UPDATE_INTERVAL_IN_BLOCKS: u32 = 5; + +/// Fied-point storage value and the way it is decoded from the raw storage value. +pub trait FloatStorageValue: 'static + Clone + Send + Sync { + /// Type of the value. + type Value: FixedPointNumber; + /// Try to decode value from the raw storage value. + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError>; +} + +/// Implementation of `FloatStorageValue` that expects encoded `FixedU128` value and returns `1` if +/// value is missing from the storage. +#[derive(Clone, Debug, Default)] +pub struct FixedU128OrOne; + +impl FloatStorageValue for FixedU128OrOne { + type Value = FixedU128; + + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError> { + maybe_raw_value + .map(|raw_value| { + FixedU128::decode(&mut &raw_value.0[..]) + .map_err(SubstrateError::ResponseParseFailed) + .map(Some) + }) + .unwrap_or_else(|| Ok(Some(FixedU128::one()))) + } +} + +/// Metric that represents fixed-point runtime storage value as float gauge. +#[derive(Clone, Debug)] +pub struct FloatStorageValueMetric { + value_converter: V, + client: Client, + storage_key: StorageKey, + metric: Gauge, + shared_value_ref: F64SharedRef, + _phantom: PhantomData, +} + +impl FloatStorageValueMetric { + /// Create new metric. + pub fn new( + value_converter: V, + client: Client, + storage_key: StorageKey, + name: String, + help: String, + ) -> Result { + let shared_value_ref = Arc::new(RwLock::new(None)); + Ok(FloatStorageValueMetric { + value_converter, + client, + storage_key, + metric: Gauge::new(metric_name(None, &name), help)?, + shared_value_ref, + _phantom: Default::default(), + }) + } + + /// Get shared reference to metric value. + pub fn shared_value_ref(&self) -> F64SharedRef { + self.shared_value_ref.clone() + } +} + +impl Metric for FloatStorageValueMetric { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.metric.clone(), registry).map(drop) + } +} + +#[async_trait] +impl StandaloneMetric for FloatStorageValueMetric { + fn update_interval(&self) -> Duration { + C::AVERAGE_BLOCK_INTERVAL * UPDATE_INTERVAL_IN_BLOCKS + } + + async fn update(&self) { + let value = self + .client + .raw_storage_value(self.storage_key.clone(), None) + .await + .and_then(|maybe_storage_value| { + self.value_converter.decode(maybe_storage_value).map(|maybe_fixed_point_value| { + maybe_fixed_point_value.map(|fixed_point_value| { + fixed_point_value.into_inner().unique_saturated_into() as f64 / + V::Value::DIV.unique_saturated_into() as f64 + }) + }) + }) + .map_err(|e| e.to_string()); + relay_utils::metrics::set_gauge_value(&self.metric, value.clone()); + *self.shared_value_ref.write().await = value.ok().and_then(|x| x); + } +} diff --git a/relays/client-substrate/src/metrics/mod.rs b/relays/client-substrate/src/metrics/mod.rs new file mode 100644 index 000000000000..fe200e2d3dca --- /dev/null +++ b/relays/client-substrate/src/metrics/mod.rs @@ -0,0 +1,21 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Contains several Substrate-specific metrics that may be exposed by relay. + +pub use float_storage_value::{FixedU128OrOne, FloatStorageValue, FloatStorageValueMetric}; + +mod float_storage_value; diff --git a/relays/client-substrate/src/rpc.rs b/relays/client-substrate/src/rpc.rs new file mode 100644 index 000000000000..35ab08c0f415 --- /dev/null +++ b/relays/client-substrate/src/rpc.rs @@ -0,0 +1,170 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! The most generic Substrate node RPC interface. + +use async_trait::async_trait; + +use crate::{Chain, ChainWithGrandpa, TransactionStatusOf}; + +use jsonrpsee::{ + core::{client::Subscription, RpcResult}, + proc_macros::rpc, + ws_client::WsClient, +}; +use pallet_transaction_payment_rpc_runtime_api::FeeDetails; +use sc_rpc_api::{state::ReadProof, system::Health}; +use sp_core::{ + storage::{StorageData, StorageKey}, + Bytes, +}; +use sp_rpc::number::NumberOrHex; +use sp_version::RuntimeVersion; + +/// RPC methods of Substrate `system` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "system")] +pub(crate) trait SubstrateSystem { + /// Return node health. + #[method(name = "health")] + async fn health(&self) -> RpcResult; + /// Return system properties. + #[method(name = "properties")] + async fn properties(&self) -> RpcResult; +} + +/// RPC methods of Substrate `chain` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "chain")] +pub(crate) trait SubstrateChain { + /// Get block hash by its number. + #[method(name = "getBlockHash")] + async fn block_hash(&self, block_number: Option) -> RpcResult; + /// Return block header by its hash. + #[method(name = "getHeader")] + async fn header(&self, block_hash: Option) -> RpcResult; + /// Return best finalized block hash. + #[method(name = "getFinalizedHead")] + async fn finalized_head(&self) -> RpcResult; + /// Return signed block (with justifications) by its hash. + #[method(name = "getBlock")] + async fn block(&self, block_hash: Option) -> RpcResult; +} + +/// RPC methods of Substrate `author` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "author")] +pub(crate) trait SubstrateAuthor { + /// Submit extrinsic to the transaction pool. + #[method(name = "submitExtrinsic")] + async fn submit_extrinsic(&self, extrinsic: Bytes) -> RpcResult; + /// Return vector of pending extrinsics from the transaction pool. + #[method(name = "pendingExtrinsics")] + async fn pending_extrinsics(&self) -> RpcResult>; + /// Submit and watch for extrinsic state. + #[subscription(name = "submitAndWatchExtrinsic", unsubscribe = "unwatchExtrinsic", item = TransactionStatusOf)] + async fn submit_and_watch_extrinsic(&self, extrinsic: Bytes); +} + +/// RPC methods of Substrate `state` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "state")] +pub(crate) trait SubstrateState { + /// Get current runtime version. + #[method(name = "getRuntimeVersion")] + async fn runtime_version(&self) -> RpcResult; + /// Call given runtime method. + #[method(name = "call")] + async fn call( + &self, + method: String, + data: Bytes, + at_block: Option, + ) -> RpcResult; + /// Get value of the runtime storage. + #[method(name = "getStorage")] + async fn storage( + &self, + key: StorageKey, + at_block: Option, + ) -> RpcResult>; + /// Get proof of the runtime storage value. + #[method(name = "getReadProof")] + async fn prove_storage( + &self, + keys: Vec, + hash: Option, + ) -> RpcResult>; +} + +/// RPC methods that we are using for a certain finality gadget. +#[async_trait] +pub trait SubstrateFinalityClient { + /// Subscribe to finality justifications. + async fn subscribe_justifications(client: &WsClient) -> RpcResult>; +} + +/// RPC methods of Substrate `grandpa` namespace, that we are using. +#[rpc(client, client_bounds(C: ChainWithGrandpa), namespace = "grandpa")] +pub(crate) trait SubstrateGrandpa { + /// Subscribe to GRANDPA justifications. + #[subscription(name = "subscribeJustifications", unsubscribe = "unsubscribeJustifications", item = Bytes)] + async fn subscribe_justifications(&self); +} + +/// RPC finality methods of Substrate `grandpa` namespace, that we are using. +pub struct SubstrateGrandpaFinalityClient; +#[async_trait] +impl SubstrateFinalityClient for SubstrateGrandpaFinalityClient { + async fn subscribe_justifications(client: &WsClient) -> RpcResult> { + SubstrateGrandpaClient::::subscribe_justifications(client).await + } +} + +// TODO: Use `ChainWithBeefy` instead of `Chain` after #1606 is merged +/// RPC methods of Substrate `beefy` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "beefy")] +pub(crate) trait SubstrateBeefy { + /// Subscribe to BEEFY justifications. + #[subscription(name = "subscribeJustifications", unsubscribe = "unsubscribeJustifications", item = Bytes)] + async fn subscribe_justifications(&self); +} + +/// RPC finality methods of Substrate `beefy` namespace, that we are using. +pub struct SubstrateBeefyFinalityClient; +// TODO: Use `ChainWithBeefy` instead of `Chain` after #1606 is merged +#[async_trait] +impl SubstrateFinalityClient for SubstrateBeefyFinalityClient { + async fn subscribe_justifications(client: &WsClient) -> RpcResult> { + SubstrateBeefyClient::::subscribe_justifications(client).await + } +} + +/// RPC methods of Substrate `system` frame pallet, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "system")] +pub(crate) trait SubstrateFrameSystem { + /// Return index of next account transaction. + #[method(name = "accountNextIndex")] + async fn account_next_index(&self, account_id: C::AccountId) -> RpcResult; +} + +/// RPC methods of Substrate `pallet_transaction_payment` frame pallet, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "payment")] +pub(crate) trait SubstrateTransactionPayment { + /// Query transaction fee details. + #[method(name = "queryFeeDetails")] + async fn fee_details( + &self, + extrinsic: Bytes, + at_block: Option, + ) -> RpcResult>; +} diff --git a/relays/client-substrate/src/sync_header.rs b/relays/client-substrate/src/sync_header.rs new file mode 100644 index 000000000000..fdfd1f22ce9e --- /dev/null +++ b/relays/client-substrate/src/sync_header.rs @@ -0,0 +1,61 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use bp_header_chain::ConsensusLogReader; +use finality_relay::SourceHeader as FinalitySourceHeader; +use sp_runtime::traits::Header as HeaderT; + +/// Generic wrapper for `sp_runtime::traits::Header` based headers, that +/// implements `finality_relay::SourceHeader` and may be used in headers sync directly. +#[derive(Clone, Debug, PartialEq)] +pub struct SyncHeader
(Header); + +impl
SyncHeader
{ + /// Extracts wrapped header from self. + pub fn into_inner(self) -> Header { + self.0 + } +} + +impl
std::ops::Deref for SyncHeader
{ + type Target = Header; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl
From
for SyncHeader
{ + fn from(header: Header) -> Self { + Self(header) + } +} + +impl FinalitySourceHeader + for SyncHeader
+{ + fn hash(&self) -> Header::Hash { + self.0.hash() + } + + fn number(&self) -> Header::Number { + *self.0.number() + } + + fn is_mandatory(&self) -> bool { + R::schedules_authorities_change(self.digest()) + } +} diff --git a/relays/client-substrate/src/test_chain.rs b/relays/client-substrate/src/test_chain.rs new file mode 100644 index 000000000000..923092b1bcb7 --- /dev/null +++ b/relays/client-substrate/src/test_chain.rs @@ -0,0 +1,117 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Pallet provides a set of guard functions that are running in background threads +//! and are aborting process if some condition fails. + +//! Test chain implementation to use in tests. + +#![cfg(any(feature = "test-helpers", test))] + +use crate::{Chain, ChainWithBalances}; +use bp_runtime::ChainId; +use frame_support::weights::Weight; +use std::time::Duration; + +/// Chain that may be used in tests. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TestChain; + +impl bp_runtime::Chain for TestChain { + type BlockNumber = u32; + type Hash = sp_core::H256; + type Hasher = sp_runtime::traits::BlakeTwo256; + type Header = sp_runtime::generic::Header; + + type AccountId = u32; + type Balance = u32; + type Nonce = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl Chain for TestChain { + const ID: ChainId = *b"test"; + const NAME: &'static str = "Test"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = "TestMethod"; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); + + type SignedBlock = sp_runtime::generic::SignedBlock< + sp_runtime::generic::Block, + >; + type Call = (); +} + +impl ChainWithBalances for TestChain { + fn account_info_storage_key(_account_id: &u32) -> sp_core::storage::StorageKey { + unreachable!() + } +} + +/// Primitives-level parachain that may be used in tests. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TestParachainBase; + +impl bp_runtime::Chain for TestParachainBase { + type BlockNumber = u32; + type Hash = sp_core::H256; + type Hasher = sp_runtime::traits::BlakeTwo256; + type Header = sp_runtime::generic::Header; + + type AccountId = u32; + type Balance = u32; + type Nonce = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl bp_runtime::Parachain for TestParachainBase { + const PARACHAIN_ID: u32 = 1000; +} + +/// Parachain that may be used in tests. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TestParachain; + +impl bp_runtime::UnderlyingChainProvider for TestParachain { + type Chain = TestParachainBase; +} + +impl Chain for TestParachain { + const ID: ChainId = *b"test"; + const NAME: &'static str = "TestParachain"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = "TestParachainMethod"; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); + + type SignedBlock = sp_runtime::generic::SignedBlock< + sp_runtime::generic::Block, + >; + type Call = (); +} diff --git a/relays/client-substrate/src/transaction_tracker.rs b/relays/client-substrate/src/transaction_tracker.rs new file mode 100644 index 000000000000..00375768c45c --- /dev/null +++ b/relays/client-substrate/src/transaction_tracker.rs @@ -0,0 +1,447 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Helper for tracking transaction invalidation events. + +use crate::{Chain, Client, Error, HashOf, HeaderIdOf, Subscription, TransactionStatusOf}; + +use async_trait::async_trait; +use futures::{future::Either, Future, FutureExt, Stream, StreamExt}; +use relay_utils::{HeaderId, TrackedTransactionStatus}; +use sp_runtime::traits::Header as _; +use std::time::Duration; + +/// Transaction tracker environment. +#[async_trait] +pub trait Environment: Send + Sync { + /// Returns header id by its hash. + async fn header_id_by_hash(&self, hash: HashOf) -> Result, Error>; +} + +#[async_trait] +impl Environment for Client { + async fn header_id_by_hash(&self, hash: HashOf) -> Result, Error> { + self.header_by_hash(hash).await.map(|h| HeaderId(*h.number(), hash)) + } +} + +/// Substrate transaction tracker implementation. +/// +/// Substrate node provides RPC API to submit and watch for transaction events. This way +/// we may know when transaction is included into block, finalized or rejected. There are +/// some edge cases, when we can't fully trust this mechanism - e.g. transaction may broadcasted +/// and then dropped out of node transaction pool (some other cases are also possible - node +/// restarts, connection lost, ...). Then we can't know for sure - what is currently happening +/// with our transaction. Is the transaction really lost? Is it still alive on the chain network? +/// +/// We have several options to handle such cases: +/// +/// 1) hope that the transaction is still alive and wait for its mining until it is spoiled; +/// +/// 2) assume that the transaction is lost and resubmit another transaction instantly; +/// +/// 3) wait for some time (if transaction is mortal - then until block where it dies; if it is +/// immortal - then for some time that we assume is long enough to mine it) and assume that it is +/// lost. +/// +/// This struct implements third option as it seems to be the most optimal. +pub struct TransactionTracker { + environment: E, + transaction_hash: HashOf, + stall_timeout: Duration, + subscription: Subscription>, +} + +impl> TransactionTracker { + /// Create transaction tracker. + pub fn new( + environment: E, + stall_timeout: Duration, + transaction_hash: HashOf, + subscription: Subscription>, + ) -> Self { + Self { environment, stall_timeout, transaction_hash, subscription } + } + + /// Wait for final transaction status and return it along with last known internal invalidation + /// status. + async fn do_wait( + self, + wait_for_stall_timeout: impl Future, + wait_for_stall_timeout_rest: impl Future, + ) -> (TrackedTransactionStatus>, Option>>) { + // sometimes we want to wait for the rest of the stall timeout even if + // `wait_for_invalidation` has been "select"ed first => it is shared + let wait_for_invalidation = watch_transaction_status::<_, C, _>( + self.environment, + self.transaction_hash, + self.subscription.into_stream(), + ); + futures::pin_mut!(wait_for_stall_timeout, wait_for_invalidation); + + match futures::future::select(wait_for_stall_timeout, wait_for_invalidation).await { + Either::Left((_, _)) => { + log::trace!( + target: "bridge", + "{} transaction {:?} is considered lost after timeout (no status response from the node)", + C::NAME, + self.transaction_hash, + ); + + (TrackedTransactionStatus::Lost, None) + }, + Either::Right((invalidation_status, _)) => match invalidation_status { + InvalidationStatus::Finalized(at_block) => + (TrackedTransactionStatus::Finalized(at_block), Some(invalidation_status)), + InvalidationStatus::Invalid => + (TrackedTransactionStatus::Lost, Some(invalidation_status)), + InvalidationStatus::Lost => { + // wait for the rest of stall timeout - this way we'll be sure that the + // transaction is actually dead if it has been crafted properly + wait_for_stall_timeout_rest.await; + // if someone is still watching for our transaction, then we're reporting + // an error here (which is treated as "transaction lost") + log::trace!( + target: "bridge", + "{} transaction {:?} is considered lost after timeout", + C::NAME, + self.transaction_hash, + ); + + (TrackedTransactionStatus::Lost, Some(invalidation_status)) + }, + }, + } + } +} + +#[async_trait] +impl> relay_utils::TransactionTracker for TransactionTracker { + type HeaderId = HeaderIdOf; + + async fn wait(self) -> TrackedTransactionStatus> { + let wait_for_stall_timeout = async_std::task::sleep(self.stall_timeout).shared(); + let wait_for_stall_timeout_rest = wait_for_stall_timeout.clone(); + self.do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest).await.0 + } +} + +/// Transaction invalidation status. +/// +/// Note that in places where the `TransactionTracker` is used, the finalization event will be +/// ignored - relay loops are detecting the mining/finalization using their own +/// techniques. That's why we're using `InvalidationStatus` here. +#[derive(Debug, PartialEq)] +enum InvalidationStatus { + /// Transaction has been included into block and finalized at given block. + Finalized(BlockId), + /// Transaction has been invalidated. + Invalid, + /// We have lost track of transaction status. + Lost, +} + +/// Watch for transaction status until transaction is finalized or we lose track of its status. +async fn watch_transaction_status< + E: Environment, + C: Chain, + S: Stream>, +>( + environment: E, + transaction_hash: HashOf, + subscription: S, +) -> InvalidationStatus> { + futures::pin_mut!(subscription); + + loop { + match subscription.next().await { + Some(TransactionStatusOf::::Finalized((block_hash, _))) => { + // the only "successful" outcome of this method is when the block with transaction + // has been finalized + log::trace!( + target: "bridge", + "{} transaction {:?} has been finalized at block: {:?}", + C::NAME, + transaction_hash, + block_hash, + ); + + let header_id = match environment.header_id_by_hash(block_hash).await { + Ok(header_id) => header_id, + Err(e) => { + log::error!( + target: "bridge", + "Failed to read header {:?} when watching for {} transaction {:?}: {:?}", + block_hash, + C::NAME, + transaction_hash, + e, + ); + // that's the best option we have here + return InvalidationStatus::Lost + }, + }; + return InvalidationStatus::Finalized(header_id) + }, + Some(TransactionStatusOf::::Invalid) => { + // if node says that the transaction is invalid, there are still chances that + // it is not actually invalid - e.g. if the block where transaction has been + // revalidated is retracted and transaction (at some other node pool) becomes + // valid again on other fork. But let's assume that the chances of this event + // are almost zero - there's a lot of things that must happen for this to be the + // case. + log::trace!( + target: "bridge", + "{} transaction {:?} has been invalidated", + C::NAME, + transaction_hash, + ); + return InvalidationStatus::Invalid + }, + Some(TransactionStatusOf::::Future) | + Some(TransactionStatusOf::::Ready) | + Some(TransactionStatusOf::::Broadcast(_)) => { + // nothing important (for us) has happened + }, + Some(TransactionStatusOf::::InBlock(block_hash)) => { + // TODO: read matching system event (ExtrinsicSuccess or ExtrinsicFailed), log it + // here and use it later (on finality) for reporting invalid transaction + // https://github.com/paritytech/parity-bridges-common/issues/1464 + log::trace!( + target: "bridge", + "{} transaction {:?} has been included in block: {:?}", + C::NAME, + transaction_hash, + block_hash, + ); + }, + Some(TransactionStatusOf::::Retracted(block_hash)) => { + log::trace!( + target: "bridge", + "{} transaction {:?} at block {:?} has been retracted", + C::NAME, + transaction_hash, + block_hash, + ); + }, + Some(TransactionStatusOf::::FinalityTimeout(block_hash)) => { + // finality is lagging? let's wait a bit more and report a stall + log::trace!( + target: "bridge", + "{} transaction {:?} block {:?} has not been finalized for too long", + C::NAME, + transaction_hash, + block_hash, + ); + return InvalidationStatus::Lost + }, + Some(TransactionStatusOf::::Usurped(new_transaction_hash)) => { + // this may be result of our transaction resubmitter work or some manual + // intervention. In both cases - let's start stall timeout, because the meaning + // of transaction may have changed + log::trace!( + target: "bridge", + "{} transaction {:?} has been usurped by new transaction: {:?}", + C::NAME, + transaction_hash, + new_transaction_hash, + ); + return InvalidationStatus::Lost + }, + Some(TransactionStatusOf::::Dropped) => { + // the transaction has been removed from the pool because of its limits. Let's wait + // a bit and report a stall + log::trace!( + target: "bridge", + "{} transaction {:?} has been dropped from the pool", + C::NAME, + transaction_hash, + ); + return InvalidationStatus::Lost + }, + None => { + // the status of transaction is unknown to us (the subscription has been closed?). + // Let's wait a bit and report a stall + return InvalidationStatus::Lost + }, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_chain::TestChain; + use futures::{FutureExt, SinkExt}; + use sc_transaction_pool_api::TransactionStatus; + + struct TestEnvironment(Result, Error>); + + #[async_trait] + impl Environment for TestEnvironment { + async fn header_id_by_hash( + &self, + _hash: HashOf, + ) -> Result, Error> { + self.0.as_ref().map_err(|_| Error::BridgePalletIsNotInitialized).cloned() + } + } + + async fn on_transaction_status( + status: TransactionStatus, HashOf>, + ) -> Option<( + TrackedTransactionStatus>, + InvalidationStatus>, + )> { + let (mut sender, receiver) = futures::channel::mpsc::channel(1); + let tx_tracker = TransactionTracker::::new( + TestEnvironment(Ok(HeaderId(0, Default::default()))), + Duration::from_secs(0), + Default::default(), + Subscription(async_std::sync::Mutex::new(receiver)), + ); + + let wait_for_stall_timeout = futures::future::pending(); + let wait_for_stall_timeout_rest = futures::future::ready(()); + sender.send(Some(status)).await.unwrap(); + tx_tracker + .do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest) + .now_or_never() + .map(|(ts, is)| (ts, is.unwrap())) + } + + #[async_std::test] + async fn returns_finalized_on_finalized() { + assert_eq!( + on_transaction_status(TransactionStatus::Finalized(Default::default())).await, + Some(( + TrackedTransactionStatus::Finalized(Default::default()), + InvalidationStatus::Finalized(Default::default()) + )), + ); + } + + #[async_std::test] + async fn returns_lost_on_finalized_and_environment_error() { + assert_eq!( + watch_transaction_status::<_, TestChain, _>( + TestEnvironment(Err(Error::BridgePalletIsNotInitialized)), + Default::default(), + futures::stream::iter([TransactionStatus::Finalized(Default::default())]) + ) + .now_or_never(), + Some(InvalidationStatus::Lost), + ); + } + + #[async_std::test] + async fn returns_invalid_on_invalid() { + assert_eq!( + on_transaction_status(TransactionStatus::Invalid).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Invalid)), + ); + } + + #[async_std::test] + async fn waits_on_future() { + assert_eq!(on_transaction_status(TransactionStatus::Future).await, None,); + } + + #[async_std::test] + async fn waits_on_ready() { + assert_eq!(on_transaction_status(TransactionStatus::Ready).await, None,); + } + + #[async_std::test] + async fn waits_on_broadcast() { + assert_eq!( + on_transaction_status(TransactionStatus::Broadcast(Default::default())).await, + None, + ); + } + + #[async_std::test] + async fn waits_on_in_block() { + assert_eq!( + on_transaction_status(TransactionStatus::InBlock(Default::default())).await, + None, + ); + } + + #[async_std::test] + async fn waits_on_retracted() { + assert_eq!( + on_transaction_status(TransactionStatus::Retracted(Default::default())).await, + None, + ); + } + + #[async_std::test] + async fn lost_on_finality_timeout() { + assert_eq!( + on_transaction_status(TransactionStatus::FinalityTimeout(Default::default())).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Lost)), + ); + } + + #[async_std::test] + async fn lost_on_usurped() { + assert_eq!( + on_transaction_status(TransactionStatus::Usurped(Default::default())).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Lost)), + ); + } + + #[async_std::test] + async fn lost_on_dropped() { + assert_eq!( + on_transaction_status(TransactionStatus::Dropped).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Lost)), + ); + } + + #[async_std::test] + async fn lost_on_subscription_error() { + assert_eq!( + watch_transaction_status::<_, TestChain, _>( + TestEnvironment(Ok(HeaderId(0, Default::default()))), + Default::default(), + futures::stream::iter([]) + ) + .now_or_never(), + Some(InvalidationStatus::Lost), + ); + } + + #[async_std::test] + async fn lost_on_timeout_when_waiting_for_invalidation_status() { + let (_sender, receiver) = futures::channel::mpsc::channel(1); + let tx_tracker = TransactionTracker::::new( + TestEnvironment(Ok(HeaderId(0, Default::default()))), + Duration::from_secs(0), + Default::default(), + Subscription(async_std::sync::Mutex::new(receiver)), + ); + + let wait_for_stall_timeout = futures::future::ready(()).shared(); + let wait_for_stall_timeout_rest = wait_for_stall_timeout.clone(); + let wait_result = tx_tracker + .do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest) + .now_or_never(); + + assert_eq!(wait_result, Some((TrackedTransactionStatus::Lost, None))); + } +} diff --git a/relays/client-westend/Cargo.toml b/relays/client-westend/Cargo.toml new file mode 100644 index 000000000000..0c6083f8f8c8 --- /dev/null +++ b/relays/client-westend/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "relay-westend-client" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5", features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +subxt = { version = "0.32.1", default-features = false, features = ["native"] } + +# Bridge dependencies + +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-runtime = { path = "../../primitives/runtime" } +bp-westend = { path = "../../primitives/chain-westend" } + +relay-substrate-client = { path = "../client-substrate" } +relay-utils = { path = "../utils" } + +# Substrate Dependencies + +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-session = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-weights = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/client-westend/src/codegen_runtime.rs b/relays/client-westend/src/codegen_runtime.rs new file mode 100644 index 000000000000..9422622e48c5 --- /dev/null +++ b/relays/client-westend/src/codegen_runtime.rs @@ -0,0 +1,6945 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Autogenerated runtime API +//! THIS FILE WAS AUTOGENERATED USING parity-bridges-common::runtime-codegen +//! EXECUTED COMMAND: target/debug/runtime-codegen --from-node-url wss://westend-rpc.polkadot.io:443 + +#[allow(dead_code, unused_imports, non_camel_case_types)] +#[allow(clippy::all)] +pub mod api { + use super::api as root_mod; + pub mod runtime_types { + use super::runtime_types; + pub mod bounded_collections { + use super::runtime_types; + pub mod bounded_btree_map { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedBTreeMap<_0, _1>(pub ::subxt::utils::KeyedVec<_0, _1>); + } + pub mod bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + pub mod weak_bounded_vec { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeakBoundedVec<_0>(pub ::std::vec::Vec<_0>); + } + } + pub mod finality_grandpa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Equivocation<_0, _1, _2> { + pub round_number: ::core::primitive::u64, + pub identity: _0, + pub first: (_1, _2), + pub second: (_1, _2), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Precommit<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Prevote<_0, _1> { + pub target_hash: _0, + pub target_number: _1, + } + } + pub mod frame_support { + use super::runtime_types; + pub mod dispatch { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchClass { + #[codec(index = 0)] + Normal, + #[codec(index = 1)] + Operational, + #[codec(index = 2)] + Mandatory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DispatchInfo { + pub weight: ::sp_weights::Weight, + pub class: runtime_types::frame_support::dispatch::DispatchClass, + pub pays_fee: runtime_types::frame_support::dispatch::Pays, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Pays { + #[codec(index = 0)] + Yes, + #[codec(index = 1)] + No, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PerDispatchClass<_0> { + pub normal: _0, + pub operational: _0, + pub mandatory: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RawOrigin<_0> { + #[codec(index = 0)] + Root, + #[codec(index = 1)] + Signed(_0), + #[codec(index = 2)] + None, + } + } + pub mod traits { + use super::runtime_types; + pub mod messages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProcessMessageError { + #[codec(index = 0)] + BadFormat, + #[codec(index = 1)] + Corrupt, + #[codec(index = 2)] + Unsupported, + #[codec(index = 3)] + Overweight(::sp_weights::Weight), + #[codec(index = 4)] + Yield, + } + } + pub mod misc { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WrapperOpaque<_0>( + #[codec(compact)] pub ::core::primitive::u32, + pub _0, + ); + } + pub mod preimages { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Bounded<_0> { + #[codec(index = 0)] + Legacy { + hash: ::subxt::utils::H256, + }, + #[codec(index = 1)] + Inline( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Lookup { + hash: ::subxt::utils::H256, + len: ::core::primitive::u32, + }, + __Ignore(::core::marker::PhantomData<_0>), + } + } + pub mod tokens { + use super::runtime_types; + pub mod misc { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum BalanceStatus { + #[codec(index = 0)] + Free, + #[codec(index = 1)] + Reserved, + } + } + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletId(pub [::core::primitive::u8; 8usize]); + } + pub mod frame_system { + use super::runtime_types; + pub mod extensions { + use super::runtime_types; + pub mod check_genesis { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckGenesis; + } + pub mod check_mortality { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckMortality(pub ::sp_runtime::generic::Era); + } + pub mod check_non_zero_sender { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonZeroSender; + } + pub mod check_nonce { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckNonce(#[codec(compact)] pub ::core::primitive::u32); + } + pub mod check_spec_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckSpecVersion; + } + pub mod check_tx_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckTxVersion; + } + pub mod check_weight { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CheckWeight; + } + } + pub mod limits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockLength { + pub max: runtime_types::frame_support::dispatch::PerDispatchClass< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BlockWeights { + pub base_block: ::sp_weights::Weight, + pub max_block: ::sp_weights::Weight, + pub per_class: runtime_types::frame_support::dispatch::PerDispatchClass< + runtime_types::frame_system::limits::WeightsPerClass, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct WeightsPerClass { + pub base_extrinsic: ::sp_weights::Weight, + pub max_extrinsic: ::core::option::Option<::sp_weights::Weight>, + pub max_total: ::core::option::Option<::sp_weights::Weight>, + pub reserved: ::core::option::Option<::sp_weights::Weight>, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + remark { remark: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + set_heap_pages { pages: ::core::primitive::u64 }, + #[codec(index = 2)] + set_code { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 3)] + set_code_without_checks { code: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 4)] + set_storage { + items: ::std::vec::Vec<( + ::std::vec::Vec<::core::primitive::u8>, + ::std::vec::Vec<::core::primitive::u8>, + )>, + }, + #[codec(index = 5)] + kill_storage { keys: ::std::vec::Vec<::std::vec::Vec<::core::primitive::u8>> }, + #[codec(index = 6)] + kill_prefix { + prefix: ::std::vec::Vec<::core::primitive::u8>, + subkeys: ::core::primitive::u32, + }, + #[codec(index = 7)] + remark_with_event { remark: ::std::vec::Vec<::core::primitive::u8> }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidSpecName, + #[codec(index = 1)] + SpecVersionNeedsToIncrease, + #[codec(index = 2)] + FailedToExtractRuntimeVersion, + #[codec(index = 3)] + NonDefaultComposite, + #[codec(index = 4)] + NonZeroRefCount, + #[codec(index = 5)] + CallFiltered, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ExtrinsicSuccess { + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 1)] + ExtrinsicFailed { + dispatch_error: runtime_types::sp_runtime::DispatchError, + dispatch_info: runtime_types::frame_support::dispatch::DispatchInfo, + }, + #[codec(index = 2)] + CodeUpdated, + #[codec(index = 3)] + NewAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 4)] + KilledAccount { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 5)] + Remarked { sender: ::sp_core::crypto::AccountId32, hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountInfo<_0, _1> { + pub nonce: _0, + pub consumers: _0, + pub providers: _0, + pub sufficients: _0, + pub data: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EventRecord<_0, _1> { + pub phase: runtime_types::frame_system::Phase, + pub event: _0, + pub topics: ::std::vec::Vec<_1>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct LastRuntimeUpgradeInfo { + #[codec(compact)] + pub spec_version: ::core::primitive::u32, + pub spec_name: ::std::string::String, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase { + #[codec(index = 0)] + ApplyExtrinsic(::core::primitive::u32), + #[codec(index = 1)] + Finalization, + #[codec(index = 2)] + Initialization, + } + } + pub mod pallet_babe { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + runtime_types::sp_consensus_slots::EquivocationProof< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + runtime_types::sp_consensus_babe::app::Public, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + plan_config_change { + config: runtime_types::sp_consensus_babe::digests::NextConfigDescriptor, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidEquivocationProof, + #[codec(index = 1)] + InvalidKeyOwnershipProof, + #[codec(index = 2)] + DuplicateOffenceReport, + #[codec(index = 3)] + InvalidConfiguration, + } + } + } + pub mod pallet_bags_list { + use super::runtime_types; + pub mod list { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Bag { + pub head: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub tail: ::core::option::Option<::sp_core::crypto::AccountId32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ListError { + #[codec(index = 0)] + Duplicate, + #[codec(index = 1)] + NotHeavier, + #[codec(index = 2)] + NotInSameBag, + #[codec(index = 3)] + NodeNotFound, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Node { + pub id: ::sp_core::crypto::AccountId32, + pub prev: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub next: ::core::option::Option<::sp_core::crypto::AccountId32>, + pub bag_upper: ::core::primitive::u64, + pub score: ::core::primitive::u64, + } + } + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + rebag { + dislocated: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + put_in_front_of { + lighter: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + List(runtime_types::pallet_bags_list::list::ListError), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Rebagged { + who: ::sp_core::crypto::AccountId32, + from: ::core::primitive::u64, + to: ::core::primitive::u64, + }, + #[codec(index = 1)] + ScoreUpdated { + who: ::sp_core::crypto::AccountId32, + new_score: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_balances { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + transfer_allow_death { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 1)] + set_balance_deprecated { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + #[codec(compact)] + old_reserved: ::core::primitive::u128, + }, + #[codec(index = 2)] + force_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + transfer_keep_alive { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + transfer_all { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + keep_alive: ::core::primitive::bool, + }, + #[codec(index = 5)] + force_unreserve { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + upgrade_accounts { who: ::std::vec::Vec<::sp_core::crypto::AccountId32> }, + #[codec(index = 7)] + transfer { + dest: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 8)] + force_set_balance { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + new_free: ::core::primitive::u128, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + VestingBalance, + #[codec(index = 1)] + LiquidityRestrictions, + #[codec(index = 2)] + InsufficientBalance, + #[codec(index = 3)] + ExistentialDeposit, + #[codec(index = 4)] + Expendability, + #[codec(index = 5)] + ExistingVestingSchedule, + #[codec(index = 6)] + DeadAccount, + #[codec(index = 7)] + TooManyReserves, + #[codec(index = 8)] + TooManyHolds, + #[codec(index = 9)] + TooManyFreezes, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Endowed { + account: ::sp_core::crypto::AccountId32, + free_balance: ::core::primitive::u128, + }, + #[codec(index = 1)] + DustLost { + account: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Transfer { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + BalanceSet { + who: ::sp_core::crypto::AccountId32, + free: ::core::primitive::u128, + }, + #[codec(index = 4)] + Reserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + Unreserved { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 6)] + ReserveRepatriated { + from: ::sp_core::crypto::AccountId32, + to: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + destination_status: + runtime_types::frame_support::traits::tokens::misc::BalanceStatus, + }, + #[codec(index = 7)] + Deposit { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 8)] + Withdraw { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Slashed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 10)] + Minted { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 11)] + Burned { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 12)] + Suspended { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 13)] + Restored { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 14)] + Upgraded { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 15)] + Issued { amount: ::core::primitive::u128 }, + #[codec(index = 16)] + Rescinded { amount: ::core::primitive::u128 }, + #[codec(index = 17)] + Locked { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 18)] + Unlocked { + who: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 19)] + Frozen { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + #[codec(index = 20)] + Thawed { who: ::sp_core::crypto::AccountId32, amount: ::core::primitive::u128 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AccountData<_0> { + pub free: _0, + pub reserved: _0, + pub frozen: _0, + pub flags: runtime_types::pallet_balances::types::ExtraFlags, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BalanceLock<_0> { + pub id: [::core::primitive::u8; 8usize], + pub amount: _0, + pub reasons: runtime_types::pallet_balances::types::Reasons, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ExtraFlags(pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdAmount<_0, _1> { + pub id: _0, + pub amount: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Reasons { + #[codec(index = 0)] + Fee, + #[codec(index = 1)] + Misc, + #[codec(index = 2)] + All, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReserveData<_0, _1> { + pub id: _0, + pub amount: _1, + } + } + } + pub mod pallet_election_provider_multi_phase { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] submit_unsigned { raw_solution : :: std :: boxed :: Box < runtime_types :: pallet_election_provider_multi_phase :: RawSolution < runtime_types :: westend_runtime :: NposCompactSolution16 > > , witness : runtime_types :: pallet_election_provider_multi_phase :: SolutionOrSnapshotSize , } , # [codec (index = 1)] set_minimum_untrusted_score { maybe_next_score : :: core :: option :: Option < runtime_types :: sp_npos_elections :: ElectionScore > , } , # [codec (index = 2)] set_emergency_election_result { supports : :: std :: vec :: Vec < (:: sp_core :: crypto :: AccountId32 , runtime_types :: sp_npos_elections :: Support < :: sp_core :: crypto :: AccountId32 > ,) > , } , # [codec (index = 3)] submit { raw_solution : :: std :: boxed :: Box < runtime_types :: pallet_election_provider_multi_phase :: RawSolution < runtime_types :: westend_runtime :: NposCompactSolution16 > > , } , # [codec (index = 4)] governance_fallback { maybe_max_voters : :: core :: option :: Option < :: core :: primitive :: u32 > , maybe_max_targets : :: core :: option :: Option < :: core :: primitive :: u32 > , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PreDispatchEarlySubmission, + #[codec(index = 1)] + PreDispatchWrongWinnerCount, + #[codec(index = 2)] + PreDispatchWeakSubmission, + #[codec(index = 3)] + SignedQueueFull, + #[codec(index = 4)] + SignedCannotPayDeposit, + #[codec(index = 5)] + SignedInvalidWitness, + #[codec(index = 6)] + SignedTooMuchWeight, + #[codec(index = 7)] + OcwCallWrongEra, + #[codec(index = 8)] + MissingSnapshotMetadata, + #[codec(index = 9)] + InvalidSubmissionIndex, + #[codec(index = 10)] + CallNotAllowed, + #[codec(index = 11)] + FallbackFailed, + #[codec(index = 12)] + BoundNotMet, + #[codec(index = 13)] + TooManyWinners, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + SolutionStored { + compute: + runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + origin: ::core::option::Option<::sp_core::crypto::AccountId32>, + prev_ejected: ::core::primitive::bool, + }, + #[codec(index = 1)] + ElectionFinalized { + compute: + runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + score: runtime_types::sp_npos_elections::ElectionScore, + }, + #[codec(index = 2)] + ElectionFailed, + #[codec(index = 3)] + Rewarded { + account: ::sp_core::crypto::AccountId32, + value: ::core::primitive::u128, + }, + #[codec(index = 4)] + Slashed { + account: ::sp_core::crypto::AccountId32, + value: ::core::primitive::u128, + }, + #[codec(index = 5)] + PhaseTransitioned { + from: runtime_types::pallet_election_provider_multi_phase::Phase< + ::core::primitive::u32, + >, + to: runtime_types::pallet_election_provider_multi_phase::Phase< + ::core::primitive::u32, + >, + round: ::core::primitive::u32, + }, + } + } + pub mod signed { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SignedSubmission<_0, _1, _2> { + pub who: _0, + pub deposit: _1, + pub raw_solution: + runtime_types::pallet_election_provider_multi_phase::RawSolution<_2>, + pub call_fee: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ElectionCompute { + #[codec(index = 0)] + OnChain, + #[codec(index = 1)] + Signed, + #[codec(index = 2)] + Unsigned, + #[codec(index = 3)] + Fallback, + #[codec(index = 4)] + Emergency, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Phase<_0> { + #[codec(index = 0)] + Off, + #[codec(index = 1)] + Signed, + #[codec(index = 2)] + Unsigned((::core::primitive::bool, _0)), + #[codec(index = 3)] + Emergency, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RawSolution<_0> { + pub solution: _0, + pub score: runtime_types::sp_npos_elections::ElectionScore, + pub round: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReadySolution { + pub supports: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::sp_core::crypto::AccountId32, + runtime_types::sp_npos_elections::Support<::sp_core::crypto::AccountId32>, + )>, + pub score: runtime_types::sp_npos_elections::ElectionScore, + pub compute: runtime_types::pallet_election_provider_multi_phase::ElectionCompute, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RoundSnapshot<_0, _1> { + pub voters: ::std::vec::Vec<_1>, + pub targets: ::std::vec::Vec<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SolutionOrSnapshotSize { + #[codec(compact)] + pub voters: ::core::primitive::u32, + #[codec(compact)] + pub targets: ::core::primitive::u32, + } + } + pub mod pallet_fast_unstake { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register_fast_unstake, + #[codec(index = 1)] + deregister, + #[codec(index = 2)] + control { eras_to_check: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotController, + #[codec(index = 1)] + AlreadyQueued, + #[codec(index = 2)] + NotFullyBonded, + #[codec(index = 3)] + NotQueued, + #[codec(index = 4)] + AlreadyHead, + #[codec(index = 5)] + CallNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Unstaked { + stash: ::sp_core::crypto::AccountId32, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + Slashed { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + InternalError, + #[codec(index = 3)] + BatchChecked { eras: ::std::vec::Vec<::core::primitive::u32> }, + #[codec(index = 4)] + BatchFinished { size: ::core::primitive::u32 }, + } + } + pub mod types { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnstakeRequest { + pub stashes: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + )>, + pub checked: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u32, + >, + } + } + } + pub mod pallet_grandpa { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + report_equivocation { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 1)] + report_equivocation_unsigned { + equivocation_proof: ::std::boxed::Box< + ::sp_consensus_grandpa::EquivocationProof< + ::subxt::utils::H256, + ::core::primitive::u32, + >, + >, + key_owner_proof: ::sp_session::MembershipProof, + }, + #[codec(index = 2)] + note_stalled { + delay: ::core::primitive::u32, + best_finalized_block_number: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PauseFailed, + #[codec(index = 1)] + ResumeFailed, + #[codec(index = 2)] + ChangePending, + #[codec(index = 3)] + TooSoon, + #[codec(index = 4)] + InvalidKeyOwnershipProof, + #[codec(index = 5)] + InvalidEquivocationProof, + #[codec(index = 6)] + DuplicateOffenceReport, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewAuthorities { + authority_set: ::std::vec::Vec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + }, + #[codec(index = 1)] + Paused, + #[codec(index = 2)] + Resumed, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StoredPendingChange<_0> { + pub scheduled_at: _0, + pub delay: _0, + pub next_authorities: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec<( + runtime_types::sp_consensus_grandpa::app::Public, + ::core::primitive::u64, + )>, + pub forced: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum StoredState<_0> { + #[codec(index = 0)] + Live, + #[codec(index = 1)] + PendingPause { scheduled_at: _0, delay: _0 }, + #[codec(index = 2)] + Paused, + #[codec(index = 3)] + PendingResume { scheduled_at: _0, delay: _0 }, + } + } + pub mod pallet_identity { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + add_registrar { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 1)] + set_identity { + info: + ::std::boxed::Box, + }, + #[codec(index = 2)] + set_subs { + subs: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + runtime_types::pallet_identity::types::Data, + )>, + }, + #[codec(index = 3)] + clear_identity, + #[codec(index = 4)] + request_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + #[codec(compact)] + max_fee: ::core::primitive::u128, + }, + #[codec(index = 5)] + cancel_request { reg_index: ::core::primitive::u32 }, + #[codec(index = 6)] + set_fee { + #[codec(compact)] + index: ::core::primitive::u32, + #[codec(compact)] + fee: ::core::primitive::u128, + }, + #[codec(index = 7)] + set_account_id { + #[codec(compact)] + index: ::core::primitive::u32, + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 8)] + set_fields { + #[codec(compact)] + index: ::core::primitive::u32, + fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + }, + #[codec(index = 9)] + provide_judgement { + #[codec(compact)] + reg_index: ::core::primitive::u32, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + judgement: runtime_types::pallet_identity::types::Judgement< + ::core::primitive::u128, + >, + identity: ::subxt::utils::H256, + }, + #[codec(index = 10)] + kill_identity { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 11)] + add_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 12)] + rename_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + data: runtime_types::pallet_identity::types::Data, + }, + #[codec(index = 13)] + remove_sub { + sub: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 14)] + quit_sub, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManySubAccounts, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotNamed, + #[codec(index = 3)] + EmptyIndex, + #[codec(index = 4)] + FeeChanged, + #[codec(index = 5)] + NoIdentity, + #[codec(index = 6)] + StickyJudgement, + #[codec(index = 7)] + JudgementGiven, + #[codec(index = 8)] + InvalidJudgement, + #[codec(index = 9)] + InvalidIndex, + #[codec(index = 10)] + InvalidTarget, + #[codec(index = 11)] + TooManyFields, + #[codec(index = 12)] + TooManyRegistrars, + #[codec(index = 13)] + AlreadyClaimed, + #[codec(index = 14)] + NotSub, + #[codec(index = 15)] + NotOwned, + #[codec(index = 16)] + JudgementForDifferentIdentity, + #[codec(index = 17)] + JudgementPaymentFailed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IdentitySet { who: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + IdentityCleared { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 2)] + IdentityKilled { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 3)] + JudgementRequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 4)] + JudgementUnrequested { + who: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 5)] + JudgementGiven { + target: ::sp_core::crypto::AccountId32, + registrar_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + RegistrarAdded { registrar_index: ::core::primitive::u32 }, + #[codec(index = 7)] + SubIdentityAdded { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 8)] + SubIdentityRemoved { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + #[codec(index = 9)] + SubIdentityRevoked { + sub: ::sp_core::crypto::AccountId32, + main: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + }, + } + } + pub mod types { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct BitFlags<_0>( + pub ::core::primitive::u64, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Data { + #[codec(index = 0)] + None, + #[codec(index = 1)] + Raw0([::core::primitive::u8; 0usize]), + #[codec(index = 2)] + Raw1([::core::primitive::u8; 1usize]), + #[codec(index = 3)] + Raw2([::core::primitive::u8; 2usize]), + #[codec(index = 4)] + Raw3([::core::primitive::u8; 3usize]), + #[codec(index = 5)] + Raw4([::core::primitive::u8; 4usize]), + #[codec(index = 6)] + Raw5([::core::primitive::u8; 5usize]), + #[codec(index = 7)] + Raw6([::core::primitive::u8; 6usize]), + #[codec(index = 8)] + Raw7([::core::primitive::u8; 7usize]), + #[codec(index = 9)] + Raw8([::core::primitive::u8; 8usize]), + #[codec(index = 10)] + Raw9([::core::primitive::u8; 9usize]), + #[codec(index = 11)] + Raw10([::core::primitive::u8; 10usize]), + #[codec(index = 12)] + Raw11([::core::primitive::u8; 11usize]), + #[codec(index = 13)] + Raw12([::core::primitive::u8; 12usize]), + #[codec(index = 14)] + Raw13([::core::primitive::u8; 13usize]), + #[codec(index = 15)] + Raw14([::core::primitive::u8; 14usize]), + #[codec(index = 16)] + Raw15([::core::primitive::u8; 15usize]), + #[codec(index = 17)] + Raw16([::core::primitive::u8; 16usize]), + #[codec(index = 18)] + Raw17([::core::primitive::u8; 17usize]), + #[codec(index = 19)] + Raw18([::core::primitive::u8; 18usize]), + #[codec(index = 20)] + Raw19([::core::primitive::u8; 19usize]), + #[codec(index = 21)] + Raw20([::core::primitive::u8; 20usize]), + #[codec(index = 22)] + Raw21([::core::primitive::u8; 21usize]), + #[codec(index = 23)] + Raw22([::core::primitive::u8; 22usize]), + #[codec(index = 24)] + Raw23([::core::primitive::u8; 23usize]), + #[codec(index = 25)] + Raw24([::core::primitive::u8; 24usize]), + #[codec(index = 26)] + Raw25([::core::primitive::u8; 25usize]), + #[codec(index = 27)] + Raw26([::core::primitive::u8; 26usize]), + #[codec(index = 28)] + Raw27([::core::primitive::u8; 27usize]), + #[codec(index = 29)] + Raw28([::core::primitive::u8; 28usize]), + #[codec(index = 30)] + Raw29([::core::primitive::u8; 29usize]), + #[codec(index = 31)] + Raw30([::core::primitive::u8; 30usize]), + #[codec(index = 32)] + Raw31([::core::primitive::u8; 31usize]), + #[codec(index = 33)] + Raw32([::core::primitive::u8; 32usize]), + #[codec(index = 34)] + BlakeTwo256([::core::primitive::u8; 32usize]), + #[codec(index = 35)] + Sha256([::core::primitive::u8; 32usize]), + #[codec(index = 36)] + Keccak256([::core::primitive::u8; 32usize]), + #[codec(index = 37)] + ShaThree256([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum IdentityField { + #[codec(index = 1)] + Display, + #[codec(index = 2)] + Legal, + #[codec(index = 4)] + Web, + #[codec(index = 8)] + Riot, + #[codec(index = 16)] + Email, + #[codec(index = 32)] + PgpFingerprint, + #[codec(index = 64)] + Image, + #[codec(index = 128)] + Twitter, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IdentityInfo { + pub additional: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + runtime_types::pallet_identity::types::Data, + runtime_types::pallet_identity::types::Data, + )>, + pub display: runtime_types::pallet_identity::types::Data, + pub legal: runtime_types::pallet_identity::types::Data, + pub web: runtime_types::pallet_identity::types::Data, + pub riot: runtime_types::pallet_identity::types::Data, + pub email: runtime_types::pallet_identity::types::Data, + pub pgp_fingerprint: ::core::option::Option<[::core::primitive::u8; 20usize]>, + pub image: runtime_types::pallet_identity::types::Data, + pub twitter: runtime_types::pallet_identity::types::Data, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Judgement<_0> { + #[codec(index = 0)] + Unknown, + #[codec(index = 1)] + FeePaid(_0), + #[codec(index = 2)] + Reasonable, + #[codec(index = 3)] + KnownGood, + #[codec(index = 4)] + OutOfDate, + #[codec(index = 5)] + LowQuality, + #[codec(index = 6)] + Erroneous, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RegistrarInfo<_0, _1> { + pub account: _1, + pub fee: _0, + pub fields: runtime_types::pallet_identity::types::BitFlags< + runtime_types::pallet_identity::types::IdentityField, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Registration<_0> { + pub judgements: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + ::core::primitive::u32, + runtime_types::pallet_identity::types::Judgement<_0>, + )>, + pub deposit: _0, + pub info: runtime_types::pallet_identity::types::IdentityInfo, + } + } + } + pub mod pallet_im_online { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + heartbeat { + heartbeat: + runtime_types::pallet_im_online::Heartbeat<::core::primitive::u32>, + signature: runtime_types::pallet_im_online::sr25519::app_sr25519::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidKey, + #[codec(index = 1)] + DuplicatedHeartbeat, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + HeartbeatReceived { + authority_id: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + }, + #[codec(index = 1)] + AllGood, + #[codec(index = 2)] + SomeOffline { + offline: ::std::vec::Vec<( + ::sp_core::crypto::AccountId32, + runtime_types::pallet_staking::Exposure< + ::sp_core::crypto::AccountId32, + ::core::primitive::u128, + >, + )>, + }, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod app_sr25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BoundedOpaqueNetworkState { + pub peer_id: runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + pub external_addresses: + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Heartbeat<_0> { + pub block_number: _0, + pub network_state: runtime_types::sp_core::offchain::OpaqueNetworkState, + pub session_index: _0, + pub authority_index: _0, + pub validators_len: _0, + } + } + pub mod pallet_indices { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + claim { index: ::core::primitive::u32 }, + #[codec(index = 1)] + transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + }, + #[codec(index = 2)] + free { index: ::core::primitive::u32 }, + #[codec(index = 3)] + force_transfer { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + index: ::core::primitive::u32, + freeze: ::core::primitive::bool, + }, + #[codec(index = 4)] + freeze { index: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotAssigned, + #[codec(index = 1)] + NotOwner, + #[codec(index = 2)] + InUse, + #[codec(index = 3)] + NotTransfer, + #[codec(index = 4)] + Permanent, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + IndexAssigned { + who: ::sp_core::crypto::AccountId32, + index: ::core::primitive::u32, + }, + #[codec(index = 1)] + IndexFreed { index: ::core::primitive::u32 }, + #[codec(index = 2)] + IndexFrozen { + index: ::core::primitive::u32, + who: ::sp_core::crypto::AccountId32, + }, + } + } + } + pub mod pallet_message_queue { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] reap_page { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , } , # [codec (index = 1)] execute_overweight { message_origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page : :: core :: primitive :: u32 , index : :: core :: primitive :: u32 , weight_limit : :: sp_weights :: Weight , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotReapable, + #[codec(index = 1)] + NoPage, + #[codec(index = 2)] + NoMessage, + #[codec(index = 3)] + AlreadyProcessed, + #[codec(index = 4)] + Queued, + #[codec(index = 5)] + InsufficientWeight, + #[codec(index = 6)] + TemporarilyUnprocessable, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + # [codec (index = 0)] ProcessingFailed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , error : runtime_types :: frame_support :: traits :: messages :: ProcessMessageError , } , # [codec (index = 1)] Processed { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , weight_used : :: sp_weights :: Weight , success : :: core :: primitive :: bool , } , # [codec (index = 2)] OverweightEnqueued { id : [:: core :: primitive :: u8 ; 32usize] , origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , page_index : :: core :: primitive :: u32 , message_index : :: core :: primitive :: u32 , } , # [codec (index = 3)] PageReaped { origin : runtime_types :: polkadot_runtime_parachains :: inclusion :: AggregateMessageOrigin , index : :: core :: primitive :: u32 , } , } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BookState<_0> { + pub begin: ::core::primitive::u32, + pub end: ::core::primitive::u32, + pub count: ::core::primitive::u32, + pub ready_neighbours: + ::core::option::Option>, + pub message_count: ::core::primitive::u64, + pub size: ::core::primitive::u64, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Neighbours<_0> { + pub prev: _0, + pub next: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Page<_0> { + pub remaining: _0, + pub remaining_size: _0, + pub first_index: _0, + pub first: _0, + pub last: _0, + pub heap: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + } + } + pub mod pallet_multisig { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_multi_threshold_1 { + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + approve_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + maybe_timepoint: ::core::option::Option< + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + >, + call_hash: [::core::primitive::u8; 32usize], + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 3)] + cancel_as_multi { + threshold: ::core::primitive::u16, + other_signatories: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + call_hash: [::core::primitive::u8; 32usize], + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + MinimumThreshold, + #[codec(index = 1)] + AlreadyApproved, + #[codec(index = 2)] + NoApprovalsNeeded, + #[codec(index = 3)] + TooFewSignatories, + #[codec(index = 4)] + TooManySignatories, + #[codec(index = 5)] + SignatoriesOutOfOrder, + #[codec(index = 6)] + SenderInSignatories, + #[codec(index = 7)] + NotFound, + #[codec(index = 8)] + NotOwner, + #[codec(index = 9)] + NoTimepoint, + #[codec(index = 10)] + WrongTimepoint, + #[codec(index = 11)] + UnexpectedTimepoint, + #[codec(index = 12)] + MaxWeightTooLow, + #[codec(index = 13)] + AlreadyStored, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewMultisig { + approving: ::sp_core::crypto::AccountId32, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 1)] + MultisigApproval { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + MultisigExecuted { + approving: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + MultisigCancelled { + cancelling: ::sp_core::crypto::AccountId32, + timepoint: + runtime_types::pallet_multisig::Timepoint<::core::primitive::u32>, + multisig: ::sp_core::crypto::AccountId32, + call_hash: [::core::primitive::u8; 32usize], + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Multisig<_0, _1, _2> { + pub when: runtime_types::pallet_multisig::Timepoint<_0>, + pub deposit: _1, + pub depositor: _2, + pub approvals: runtime_types::bounded_collections::bounded_vec::BoundedVec<_2>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Timepoint<_0> { + pub height: _0, + pub index: _0, + } + } + pub mod pallet_nomination_pools { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + join { + #[codec(compact)] + amount: ::core::primitive::u128, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 1)] + bond_extra { + extra: runtime_types::pallet_nomination_pools::BondExtra< + ::core::primitive::u128, + >, + }, + #[codec(index = 2)] + claim_payout, + #[codec(index = 3)] + unbond { + member_account: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + #[codec(compact)] + unbonding_points: ::core::primitive::u128, + }, + #[codec(index = 4)] + pool_withdraw_unbonded { + pool_id: ::core::primitive::u32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 5)] + withdraw_unbonded { + member_account: + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 6)] + create { + #[codec(compact)] + amount: ::core::primitive::u128, + root: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + nominator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + bouncer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 7)] + create_with_pool_id { + #[codec(compact)] + amount: ::core::primitive::u128, + root: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + nominator: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + bouncer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 8)] + nominate { + pool_id: ::core::primitive::u32, + validators: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 9)] + set_state { + pool_id: ::core::primitive::u32, + state: runtime_types::pallet_nomination_pools::PoolState, + }, + #[codec(index = 10)] + set_metadata { + pool_id: ::core::primitive::u32, + metadata: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 11)] + set_configs { + min_join_bond: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u128, + >, + min_create_bond: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u128, + >, + max_pools: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + max_members: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + max_members_per_pool: runtime_types::pallet_nomination_pools::ConfigOp< + ::core::primitive::u32, + >, + global_max_commission: runtime_types::pallet_nomination_pools::ConfigOp< + runtime_types::sp_arithmetic::per_things::Perbill, + >, + }, + #[codec(index = 12)] + update_roles { + pool_id: ::core::primitive::u32, + new_root: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + new_nominator: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + new_bouncer: runtime_types::pallet_nomination_pools::ConfigOp< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 13)] + chill { pool_id: ::core::primitive::u32 }, + #[codec(index = 14)] + bond_extra_other { + member: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + extra: runtime_types::pallet_nomination_pools::BondExtra< + ::core::primitive::u128, + >, + }, + #[codec(index = 15)] + set_claim_permission { + permission: runtime_types::pallet_nomination_pools::ClaimPermission, + }, + #[codec(index = 16)] + claim_payout_other { other: ::sp_core::crypto::AccountId32 }, + #[codec(index = 17)] + set_commission { + pool_id: ::core::primitive::u32, + new_commission: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + }, + #[codec(index = 18)] + set_commission_max { + pool_id: ::core::primitive::u32, + max_commission: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 19)] + set_commission_change_rate { + pool_id: ::core::primitive::u32, + change_rate: runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + }, + #[codec(index = 20)] + claim_commission { pool_id: ::core::primitive::u32 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DefensiveError { + #[codec(index = 0)] + NotEnoughSpaceInUnbondPool, + #[codec(index = 1)] + PoolNotFound, + #[codec(index = 2)] + RewardPoolNotFound, + #[codec(index = 3)] + SubPoolsNotFound, + #[codec(index = 4)] + BondedStashKilledPrematurely, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + PoolNotFound, + #[codec(index = 1)] + PoolMemberNotFound, + #[codec(index = 2)] + RewardPoolNotFound, + #[codec(index = 3)] + SubPoolsNotFound, + #[codec(index = 4)] + AccountBelongsToOtherPool, + #[codec(index = 5)] + FullyUnbonding, + #[codec(index = 6)] + MaxUnbondingLimit, + #[codec(index = 7)] + CannotWithdrawAny, + #[codec(index = 8)] + MinimumBondNotMet, + #[codec(index = 9)] + OverflowRisk, + #[codec(index = 10)] + NotDestroying, + #[codec(index = 11)] + NotNominator, + #[codec(index = 12)] + NotKickerOrDestroying, + #[codec(index = 13)] + NotOpen, + #[codec(index = 14)] + MaxPools, + #[codec(index = 15)] + MaxPoolMembers, + #[codec(index = 16)] + CanNotChangeState, + #[codec(index = 17)] + DoesNotHavePermission, + #[codec(index = 18)] + MetadataExceedsMaxLen, + #[codec(index = 19)] + Defensive(runtime_types::pallet_nomination_pools::pallet::DefensiveError), + #[codec(index = 20)] + PartialUnbondNotAllowedPermissionlessly, + #[codec(index = 21)] + MaxCommissionRestricted, + #[codec(index = 22)] + CommissionExceedsMaximum, + #[codec(index = 23)] + CommissionChangeThrottled, + #[codec(index = 24)] + CommissionChangeRateNotAllowed, + #[codec(index = 25)] + NoPendingCommission, + #[codec(index = 26)] + NoCommissionCurrentSet, + #[codec(index = 27)] + PoolIdInUse, + #[codec(index = 28)] + InvalidPoolId, + #[codec(index = 29)] + BondExtraRestricted, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Created { + depositor: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + }, + #[codec(index = 1)] + Bonded { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + bonded: ::core::primitive::u128, + joined: ::core::primitive::bool, + }, + #[codec(index = 2)] + PaidOut { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + payout: ::core::primitive::u128, + }, + #[codec(index = 3)] + Unbonded { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + points: ::core::primitive::u128, + era: ::core::primitive::u32, + }, + #[codec(index = 4)] + Withdrawn { + member: ::sp_core::crypto::AccountId32, + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + points: ::core::primitive::u128, + }, + #[codec(index = 5)] + Destroyed { pool_id: ::core::primitive::u32 }, + #[codec(index = 6)] + StateChanged { + pool_id: ::core::primitive::u32, + new_state: runtime_types::pallet_nomination_pools::PoolState, + }, + #[codec(index = 7)] + MemberRemoved { + pool_id: ::core::primitive::u32, + member: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 8)] + RolesUpdated { + root: ::core::option::Option<::sp_core::crypto::AccountId32>, + bouncer: ::core::option::Option<::sp_core::crypto::AccountId32>, + nominator: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 9)] + PoolSlashed { + pool_id: ::core::primitive::u32, + balance: ::core::primitive::u128, + }, + #[codec(index = 10)] + UnbondingPoolSlashed { + pool_id: ::core::primitive::u32, + era: ::core::primitive::u32, + balance: ::core::primitive::u128, + }, + #[codec(index = 11)] + PoolCommissionUpdated { + pool_id: ::core::primitive::u32, + current: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + }, + #[codec(index = 12)] + PoolMaxCommissionUpdated { + pool_id: ::core::primitive::u32, + max_commission: runtime_types::sp_arithmetic::per_things::Perbill, + }, + #[codec(index = 13)] + PoolCommissionChangeRateUpdated { + pool_id: ::core::primitive::u32, + change_rate: runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + }, + #[codec(index = 14)] + PoolCommissionClaimed { + pool_id: ::core::primitive::u32, + commission: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BondExtra<_0> { + #[codec(index = 0)] + FreeBalance(_0), + #[codec(index = 1)] + Rewards, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BondedPoolInner { + pub commission: runtime_types::pallet_nomination_pools::Commission, + pub member_counter: ::core::primitive::u32, + pub points: ::core::primitive::u128, + pub roles: runtime_types::pallet_nomination_pools::PoolRoles< + ::sp_core::crypto::AccountId32, + >, + pub state: runtime_types::pallet_nomination_pools::PoolState, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ClaimPermission { + #[codec(index = 0)] + Permissioned, + #[codec(index = 1)] + PermissionlessCompound, + #[codec(index = 2)] + PermissionlessWithdraw, + #[codec(index = 3)] + PermissionlessAll, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Commission { + pub current: ::core::option::Option<( + runtime_types::sp_arithmetic::per_things::Perbill, + ::sp_core::crypto::AccountId32, + )>, + pub max: ::core::option::Option, + pub change_rate: ::core::option::Option< + runtime_types::pallet_nomination_pools::CommissionChangeRate< + ::core::primitive::u32, + >, + >, + pub throttle_from: ::core::option::Option<::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CommissionChangeRate<_0> { + pub max_increase: runtime_types::sp_arithmetic::per_things::Perbill, + pub min_delay: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ConfigOp<_0> { + #[codec(index = 0)] + Noop, + #[codec(index = 1)] + Set(_0), + #[codec(index = 2)] + Remove, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PoolMember { + pub pool_id: ::core::primitive::u32, + pub points: ::core::primitive::u128, + pub last_recorded_reward_counter: + runtime_types::sp_arithmetic::fixed_point::FixedU128, + pub unbonding_eras: + runtime_types::bounded_collections::bounded_btree_map::BoundedBTreeMap< + ::core::primitive::u32, + ::core::primitive::u128, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PoolRoles<_0> { + pub depositor: _0, + pub root: ::core::option::Option<_0>, + pub nominator: ::core::option::Option<_0>, + pub bouncer: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PoolState { + #[codec(index = 0)] + Open, + #[codec(index = 1)] + Blocked, + #[codec(index = 2)] + Destroying, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RewardPool { + pub last_recorded_reward_counter: + runtime_types::sp_arithmetic::fixed_point::FixedU128, + pub last_recorded_total_payouts: ::core::primitive::u128, + pub total_rewards_claimed: ::core::primitive::u128, + pub total_commission_pending: ::core::primitive::u128, + pub total_commission_claimed: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SubPools { + pub no_era: runtime_types::pallet_nomination_pools::UnbondPool, + pub with_era: + runtime_types::bounded_collections::bounded_btree_map::BoundedBTreeMap< + ::core::primitive::u32, + runtime_types::pallet_nomination_pools::UnbondPool, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnbondPool { + pub points: ::core::primitive::u128, + pub balance: ::core::primitive::u128, + } + } + pub mod pallet_offences { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Offence { + kind: [::core::primitive::u8; 16usize], + timeslot: ::std::vec::Vec<::core::primitive::u8>, + }, + } + } + } + pub mod pallet_preimage { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + note_preimage { bytes: ::std::vec::Vec<::core::primitive::u8> }, + #[codec(index = 1)] + unnote_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + request_preimage { hash: ::subxt::utils::H256 }, + #[codec(index = 3)] + unrequest_preimage { hash: ::subxt::utils::H256 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooBig, + #[codec(index = 1)] + AlreadyNoted, + #[codec(index = 2)] + NotAuthorized, + #[codec(index = 3)] + NotNoted, + #[codec(index = 4)] + Requested, + #[codec(index = 5)] + NotRequested, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Noted { hash: ::subxt::utils::H256 }, + #[codec(index = 1)] + Requested { hash: ::subxt::utils::H256 }, + #[codec(index = 2)] + Cleared { hash: ::subxt::utils::H256 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RequestStatus<_0, _1> { + #[codec(index = 0)] + Unrequested { deposit: (_0, _1), len: ::core::primitive::u32 }, + #[codec(index = 1)] + Requested { + deposit: ::core::option::Option<(_0, _1)>, + count: ::core::primitive::u32, + len: ::core::option::Option<::core::primitive::u32>, + }, + } + } + pub mod pallet_proxy { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + proxy { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + add_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::westend_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 2)] + remove_proxy { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::westend_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 3)] + remove_proxies, + #[codec(index = 4)] + create_pure { + proxy_type: runtime_types::westend_runtime::ProxyType, + delay: ::core::primitive::u32, + index: ::core::primitive::u16, + }, + #[codec(index = 5)] + kill_pure { + spawner: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + proxy_type: runtime_types::westend_runtime::ProxyType, + index: ::core::primitive::u16, + #[codec(compact)] + height: ::core::primitive::u32, + #[codec(compact)] + ext_index: ::core::primitive::u32, + }, + #[codec(index = 6)] + announce { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 7)] + remove_announcement { + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 8)] + reject_announcement { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 9)] + proxy_announced { + delegate: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + real: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + force_proxy_type: + ::core::option::Option, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooMany, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + NotProxy, + #[codec(index = 3)] + Unproxyable, + #[codec(index = 4)] + Duplicate, + #[codec(index = 5)] + NoPermission, + #[codec(index = 6)] + Unannounced, + #[codec(index = 7)] + NoSelfProxy, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + ProxyExecuted { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + PureCreated { + pure: ::sp_core::crypto::AccountId32, + who: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::westend_runtime::ProxyType, + disambiguation_index: ::core::primitive::u16, + }, + #[codec(index = 2)] + Announced { + real: ::sp_core::crypto::AccountId32, + proxy: ::sp_core::crypto::AccountId32, + call_hash: ::subxt::utils::H256, + }, + #[codec(index = 3)] + ProxyAdded { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::westend_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + #[codec(index = 4)] + ProxyRemoved { + delegator: ::sp_core::crypto::AccountId32, + delegatee: ::sp_core::crypto::AccountId32, + proxy_type: runtime_types::westend_runtime::ProxyType, + delay: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Announcement<_0, _1, _2> { + pub real: _0, + pub call_hash: _1, + pub height: _2, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ProxyDefinition<_0, _1, _2> { + pub delegate: _0, + pub proxy_type: _1, + pub delay: _2, + } + } + pub mod pallet_recovery { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + as_recovered { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + set_recovered { + lost: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + create_recovery { + friends: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + threshold: ::core::primitive::u16, + delay_period: ::core::primitive::u32, + }, + #[codec(index = 3)] + initiate_recovery { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 4)] + vouch_recovery { + lost: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 5)] + claim_recovery { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 6)] + close_recovery { + rescuer: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 7)] + remove_recovery, + #[codec(index = 8)] + cancel_recovered { + account: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotAllowed, + #[codec(index = 1)] + ZeroThreshold, + #[codec(index = 2)] + NotEnoughFriends, + #[codec(index = 3)] + MaxFriends, + #[codec(index = 4)] + NotSorted, + #[codec(index = 5)] + NotRecoverable, + #[codec(index = 6)] + AlreadyRecoverable, + #[codec(index = 7)] + AlreadyStarted, + #[codec(index = 8)] + NotStarted, + #[codec(index = 9)] + NotFriend, + #[codec(index = 10)] + DelayPeriod, + #[codec(index = 11)] + AlreadyVouched, + #[codec(index = 12)] + Threshold, + #[codec(index = 13)] + StillActive, + #[codec(index = 14)] + AlreadyProxy, + #[codec(index = 15)] + BadState, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + RecoveryCreated { account: ::sp_core::crypto::AccountId32 }, + #[codec(index = 1)] + RecoveryInitiated { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 2)] + RecoveryVouched { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + sender: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + RecoveryClosed { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 4)] + AccountRecovered { + lost_account: ::sp_core::crypto::AccountId32, + rescuer_account: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 5)] + RecoveryRemoved { lost_account: ::sp_core::crypto::AccountId32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ActiveRecovery<_0, _1, _2> { + pub created: _0, + pub deposit: _1, + pub friends: _2, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RecoveryConfig<_0, _1, _2> { + pub delay_period: _0, + pub deposit: _1, + pub friends: _2, + pub threshold: ::core::primitive::u16, + } + } + pub mod pallet_scheduler { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + schedule { + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 1)] + cancel { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + schedule_named { + id: [::core::primitive::u8; 32usize], + when: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 3)] + cancel_named { id: [::core::primitive::u8; 32usize] }, + #[codec(index = 4)] + schedule_after { + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + #[codec(index = 5)] + schedule_named_after { + id: [::core::primitive::u8; 32usize], + after: ::core::primitive::u32, + maybe_periodic: ::core::option::Option<( + ::core::primitive::u32, + ::core::primitive::u32, + )>, + priority: ::core::primitive::u8, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FailedToSchedule, + #[codec(index = 1)] + NotFound, + #[codec(index = 2)] + TargetBlockNumberInPast, + #[codec(index = 3)] + RescheduleNoChange, + #[codec(index = 4)] + Named, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Scheduled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 1)] + Canceled { when: ::core::primitive::u32, index: ::core::primitive::u32 }, + #[codec(index = 2)] + Dispatched { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 3)] + CallUnavailable { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 4)] + PeriodicFailed { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + #[codec(index = 5)] + PermanentlyOverweight { + task: (::core::primitive::u32, ::core::primitive::u32), + id: ::core::option::Option<[::core::primitive::u8; 32usize]>, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Scheduled<_0, _1, _2, _3, _4> { + pub maybe_id: ::core::option::Option<_0>, + pub priority: ::core::primitive::u8, + pub call: _1, + pub maybe_periodic: ::core::option::Option<(_2, _2)>, + pub origin: _3, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_4>, + } + } + pub mod pallet_session { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set_keys { + keys: runtime_types::westend_runtime::SessionKeys, + proof: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 1)] + purge_keys, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidProof, + #[codec(index = 1)] + NoAssociatedValidatorId, + #[codec(index = 2)] + DuplicatedKey, + #[codec(index = 3)] + NoKeys, + #[codec(index = 4)] + NoAccount, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewSession { session_index: ::core::primitive::u32 }, + } + } + } + pub mod pallet_staking { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + bond { + #[codec(compact)] + value: ::core::primitive::u128, + payee: runtime_types::pallet_staking::RewardDestination< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 1)] + bond_extra { + #[codec(compact)] + max_additional: ::core::primitive::u128, + }, + #[codec(index = 2)] + unbond { + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 3)] + withdraw_unbonded { num_slashing_spans: ::core::primitive::u32 }, + #[codec(index = 4)] + validate { prefs: runtime_types::pallet_staking::ValidatorPrefs }, + #[codec(index = 5)] + nominate { + targets: ::std::vec::Vec< + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + >, + }, + #[codec(index = 6)] + chill, + #[codec(index = 7)] + set_payee { + payee: runtime_types::pallet_staking::RewardDestination< + ::sp_core::crypto::AccountId32, + >, + }, + #[codec(index = 8)] + set_controller, + #[codec(index = 9)] + set_validator_count { + #[codec(compact)] + new: ::core::primitive::u32, + }, + #[codec(index = 10)] + increase_validator_count { + #[codec(compact)] + additional: ::core::primitive::u32, + }, + #[codec(index = 11)] + scale_validator_count { + factor: runtime_types::sp_arithmetic::per_things::Percent, + }, + #[codec(index = 12)] + force_no_eras, + #[codec(index = 13)] + force_new_era, + #[codec(index = 14)] + set_invulnerables { + invulnerables: ::std::vec::Vec<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 15)] + force_unstake { + stash: ::sp_core::crypto::AccountId32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 16)] + force_new_era_always, + #[codec(index = 17)] + cancel_deferred_slash { + era: ::core::primitive::u32, + slash_indices: ::std::vec::Vec<::core::primitive::u32>, + }, + #[codec(index = 18)] + payout_stakers { + validator_stash: ::sp_core::crypto::AccountId32, + era: ::core::primitive::u32, + }, + #[codec(index = 19)] + rebond { + #[codec(compact)] + value: ::core::primitive::u128, + }, + #[codec(index = 20)] + reap_stash { + stash: ::sp_core::crypto::AccountId32, + num_slashing_spans: ::core::primitive::u32, + }, + #[codec(index = 21)] + kick { + who: ::std::vec::Vec< + ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + >, + }, + #[codec(index = 22)] + set_staking_configs { + min_nominator_bond: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u128, + >, + min_validator_bond: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u128, + >, + max_nominator_count: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u32, + >, + max_validator_count: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + ::core::primitive::u32, + >, + chill_threshold: + runtime_types::pallet_staking::pallet::pallet::ConfigOp< + runtime_types::sp_arithmetic::per_things::Percent, + >, + min_commission: runtime_types::pallet_staking::pallet::pallet::ConfigOp< + runtime_types::sp_arithmetic::per_things::Perbill, + >, + }, + #[codec(index = 23)] + chill_other { controller: ::sp_core::crypto::AccountId32 }, + #[codec(index = 24)] + force_apply_min_commission { + validator_stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 25)] + set_min_commission { + new: runtime_types::sp_arithmetic::per_things::Perbill, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ConfigOp<_0> { + #[codec(index = 0)] + Noop, + #[codec(index = 1)] + Set(_0), + #[codec(index = 2)] + Remove, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotController, + #[codec(index = 1)] + NotStash, + #[codec(index = 2)] + AlreadyBonded, + #[codec(index = 3)] + AlreadyPaired, + #[codec(index = 4)] + EmptyTargets, + #[codec(index = 5)] + DuplicateIndex, + #[codec(index = 6)] + InvalidSlashIndex, + #[codec(index = 7)] + InsufficientBond, + #[codec(index = 8)] + NoMoreChunks, + #[codec(index = 9)] + NoUnlockChunk, + #[codec(index = 10)] + FundedTarget, + #[codec(index = 11)] + InvalidEraToReward, + #[codec(index = 12)] + InvalidNumberOfNominations, + #[codec(index = 13)] + NotSortedAndUnique, + #[codec(index = 14)] + AlreadyClaimed, + #[codec(index = 15)] + IncorrectHistoryDepth, + #[codec(index = 16)] + IncorrectSlashingSpans, + #[codec(index = 17)] + BadState, + #[codec(index = 18)] + TooManyTargets, + #[codec(index = 19)] + BadTarget, + #[codec(index = 20)] + CannotChillOther, + #[codec(index = 21)] + TooManyNominators, + #[codec(index = 22)] + TooManyValidators, + #[codec(index = 23)] + CommissionTooLow, + #[codec(index = 24)] + BoundNotMet, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + EraPaid { + era_index: ::core::primitive::u32, + validator_payout: ::core::primitive::u128, + remainder: ::core::primitive::u128, + }, + #[codec(index = 1)] + Rewarded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Slashed { + staker: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + SlashReported { + validator: ::sp_core::crypto::AccountId32, + fraction: runtime_types::sp_arithmetic::per_things::Perbill, + slash_era: ::core::primitive::u32, + }, + #[codec(index = 4)] + OldSlashingReportDiscarded { session_index: ::core::primitive::u32 }, + #[codec(index = 5)] + StakersElected, + #[codec(index = 6)] + Bonded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 7)] + Unbonded { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 8)] + Withdrawn { + stash: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 9)] + Kicked { + nominator: ::sp_core::crypto::AccountId32, + stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 10)] + StakingElectionFailed, + #[codec(index = 11)] + Chilled { stash: ::sp_core::crypto::AccountId32 }, + #[codec(index = 12)] + PayoutStarted { + era_index: ::core::primitive::u32, + validator_stash: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 13)] + ValidatorPrefsSet { + stash: ::sp_core::crypto::AccountId32, + prefs: runtime_types::pallet_staking::ValidatorPrefs, + }, + #[codec(index = 14)] + ForceEra { mode: runtime_types::pallet_staking::Forcing }, + } + } + } + pub mod slashing { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SlashingSpans { + pub span_index: ::core::primitive::u32, + pub last_start: ::core::primitive::u32, + pub last_nonzero_slash: ::core::primitive::u32, + pub prior: ::std::vec::Vec<::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SpanRecord<_0> { + pub slashed: _0, + pub paid_out: _0, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ActiveEraInfo { + pub index: ::core::primitive::u32, + pub start: ::core::option::Option<::core::primitive::u64>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EraRewardPoints<_0> { + pub total: ::core::primitive::u32, + pub individual: ::subxt::utils::KeyedVec<_0, ::core::primitive::u32>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Exposure<_0, _1> { + #[codec(compact)] + pub total: _1, + #[codec(compact)] + pub own: _1, + pub others: + ::std::vec::Vec>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Forcing { + #[codec(index = 0)] + NotForcing, + #[codec(index = 1)] + ForceNew, + #[codec(index = 2)] + ForceNone, + #[codec(index = 3)] + ForceAlways, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IndividualExposure<_0, _1> { + pub who: _0, + #[codec(compact)] + pub value: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Nominations { + pub targets: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::sp_core::crypto::AccountId32, + >, + pub submitted_in: ::core::primitive::u32, + pub suppressed: ::core::primitive::bool, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RewardDestination<_0> { + #[codec(index = 0)] + Staked, + #[codec(index = 1)] + Stash, + #[codec(index = 2)] + Controller, + #[codec(index = 3)] + Account(_0), + #[codec(index = 4)] + None, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct StakingLedger { + pub stash: ::sp_core::crypto::AccountId32, + #[codec(compact)] + pub total: ::core::primitive::u128, + #[codec(compact)] + pub active: ::core::primitive::u128, + pub unlocking: runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::pallet_staking::UnlockChunk<::core::primitive::u128>, + >, + pub claimed_rewards: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u32, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnappliedSlash<_0, _1> { + pub validator: _0, + pub own: _1, + pub others: ::std::vec::Vec<(_0, _1)>, + pub reporters: ::std::vec::Vec<_0>, + pub payout: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UnlockChunk<_0> { + #[codec(compact)] + pub value: _0, + #[codec(compact)] + pub era: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidatorPrefs { + #[codec(compact)] + pub commission: runtime_types::sp_arithmetic::per_things::Perbill, + pub blocked: ::core::primitive::bool, + } + } + pub mod pallet_sudo { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + sudo { call: ::std::boxed::Box }, + #[codec(index = 1)] + sudo_unchecked_weight { + call: ::std::boxed::Box, + weight: ::sp_weights::Weight, + }, + #[codec(index = 2)] + set_key { + new: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 3)] + sudo_as { + who: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + call: ::std::boxed::Box, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + RequireSudo, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Sudid { + sudo_result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + #[codec(index = 1)] + KeyChanged { + old_sudoer: ::core::option::Option<::sp_core::crypto::AccountId32>, + }, + #[codec(index = 2)] + SudoAsDone { + sudo_result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_timestamp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + set { + #[codec(compact)] + now: ::core::primitive::u64, + }, + } + } + } + pub mod pallet_transaction_payment { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + TransactionFeePaid { + who: ::sp_core::crypto::AccountId32, + actual_fee: ::core::primitive::u128, + tip: ::core::primitive::u128, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ChargeTransactionPayment(#[codec(compact)] pub ::core::primitive::u128); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V1Ancient, + #[codec(index = 1)] + V2, + } + } + pub mod pallet_utility { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + batch { calls: ::std::vec::Vec }, + #[codec(index = 1)] + as_derivative { + index: ::core::primitive::u16, + call: ::std::boxed::Box, + }, + #[codec(index = 2)] + batch_all { + calls: ::std::vec::Vec, + }, + #[codec(index = 3)] + dispatch_as { + as_origin: ::std::boxed::Box, + call: ::std::boxed::Box, + }, + #[codec(index = 4)] + force_batch { + calls: ::std::vec::Vec, + }, + #[codec(index = 5)] + with_weight { + call: ::std::boxed::Box, + weight: ::sp_weights::Weight, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyCalls, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + BatchInterrupted { + index: ::core::primitive::u32, + error: runtime_types::sp_runtime::DispatchError, + }, + #[codec(index = 1)] + BatchCompleted, + #[codec(index = 2)] + BatchCompletedWithErrors, + #[codec(index = 3)] + ItemCompleted, + #[codec(index = 4)] + ItemFailed { error: runtime_types::sp_runtime::DispatchError }, + #[codec(index = 5)] + DispatchedAs { + result: + ::core::result::Result<(), runtime_types::sp_runtime::DispatchError>, + }, + } + } + } + pub mod pallet_vesting { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + vest, + #[codec(index = 1)] + vest_other { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + }, + #[codec(index = 2)] + vested_transfer { + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 3)] + force_vested_transfer { + source: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + target: ::subxt::utils::MultiAddress<::sp_core::crypto::AccountId32, ()>, + schedule: runtime_types::pallet_vesting::vesting_info::VestingInfo< + ::core::primitive::u128, + ::core::primitive::u32, + >, + }, + #[codec(index = 4)] + merge_schedules { + schedule1_index: ::core::primitive::u32, + schedule2_index: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotVesting, + #[codec(index = 1)] + AtMaxVestingSchedules, + #[codec(index = 2)] + AmountLow, + #[codec(index = 3)] + ScheduleIndexOutOfBounds, + #[codec(index = 4)] + InvalidScheduleParams, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + VestingUpdated { + account: ::sp_core::crypto::AccountId32, + unvested: ::core::primitive::u128, + }, + #[codec(index = 1)] + VestingCompleted { account: ::sp_core::crypto::AccountId32 }, + } + } + pub mod vesting_info { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VestingInfo<_0, _1> { + pub locked: _0, + pub per_block: _0, + pub starting_block: _1, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Releases { + #[codec(index = 0)] + V0, + #[codec(index = 1)] + V1, + } + } + pub mod pallet_xcm { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + send { + dest: ::std::boxed::Box, + message: ::std::boxed::Box, + }, + #[codec(index = 1)] + teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 2)] + reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + }, + #[codec(index = 3)] + execute { + message: ::std::boxed::Box, + max_weight: ::sp_weights::Weight, + }, + #[codec(index = 4)] + force_xcm_version { + location: + ::std::boxed::Box, + xcm_version: ::core::primitive::u32, + }, + #[codec(index = 5)] + force_default_xcm_version { + maybe_xcm_version: ::core::option::Option<::core::primitive::u32>, + }, + #[codec(index = 6)] + force_subscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 7)] + force_unsubscribe_version_notify { + location: ::std::boxed::Box, + }, + #[codec(index = 8)] + limited_reserve_transfer_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 9)] + limited_teleport_assets { + dest: ::std::boxed::Box, + beneficiary: ::std::boxed::Box, + assets: ::std::boxed::Box, + fee_asset_item: ::core::primitive::u32, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 10)] + force_suspension { suspended: ::core::primitive::bool }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Unreachable, + #[codec(index = 1)] + SendFailure, + #[codec(index = 2)] + Filtered, + #[codec(index = 3)] + UnweighableMessage, + #[codec(index = 4)] + DestinationNotInvertible, + #[codec(index = 5)] + Empty, + #[codec(index = 6)] + CannotReanchor, + #[codec(index = 7)] + TooManyAssets, + #[codec(index = 8)] + InvalidOrigin, + #[codec(index = 9)] + BadVersion, + #[codec(index = 10)] + BadLocation, + #[codec(index = 11)] + NoSubscription, + #[codec(index = 12)] + AlreadySubscribed, + #[codec(index = 13)] + InvalidAsset, + #[codec(index = 14)] + LowBalance, + #[codec(index = 15)] + TooManyLocks, + #[codec(index = 16)] + AccountNotSovereign, + #[codec(index = 17)] + FeesNotMet, + #[codec(index = 18)] + LockNotFound, + #[codec(index = 19)] + InUse, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Attempted(runtime_types::xcm::v3::traits::Outcome), + #[codec(index = 1)] + Sent( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::Xcm, + ), + #[codec(index = 2)] + UnexpectedResponse( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 3)] + ResponseReady(::core::primitive::u64, runtime_types::xcm::v3::Response), + #[codec(index = 4)] + Notified(::core::primitive::u64, ::core::primitive::u8, ::core::primitive::u8), + #[codec(index = 5)] + NotifyOverweight( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ::sp_weights::Weight, + ::sp_weights::Weight, + ), + #[codec(index = 6)] + NotifyDispatchError( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 7)] + NotifyDecodeFailed( + ::core::primitive::u64, + ::core::primitive::u8, + ::core::primitive::u8, + ), + #[codec(index = 8)] + InvalidResponder( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 9)] + InvalidResponderVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 10)] + ResponseTaken(::core::primitive::u64), + #[codec(index = 11)] + AssetsTrapped( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + #[codec(index = 12)] + VersionChangeNotified( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 13)] + SupportedVersionChanged( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u32, + ), + #[codec(index = 14)] + NotifyTargetSendFail( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::traits::Error, + ), + #[codec(index = 15)] + NotifyTargetMigrationFail( + runtime_types::xcm::VersionedMultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 16)] + InvalidQuerierVersion( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + ), + #[codec(index = 17)] + InvalidQuerier( + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::primitive::u64, + runtime_types::xcm::v3::multilocation::MultiLocation, + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 18)] + VersionNotifyStarted( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 19)] + VersionNotifyRequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 20)] + VersionNotifyUnrequested( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 21)] + FeesPaid( + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::v3::multiasset::MultiAssets, + ), + #[codec(index = 22)] + AssetsClaimed( + ::subxt::utils::H256, + runtime_types::xcm::v3::multilocation::MultiLocation, + runtime_types::xcm::VersionedMultiAssets, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Xcm(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Response(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum QueryStatus<_0> { + #[codec(index = 0)] + Pending { + responder: runtime_types::xcm::VersionedMultiLocation, + maybe_match_querier: + ::core::option::Option, + maybe_notify: + ::core::option::Option<(::core::primitive::u8, ::core::primitive::u8)>, + timeout: _0, + }, + #[codec(index = 1)] + VersionNotifier { + origin: runtime_types::xcm::VersionedMultiLocation, + is_active: ::core::primitive::bool, + }, + #[codec(index = 2)] + Ready { response: runtime_types::xcm::VersionedResponse, at: _0 }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RemoteLockedFungibleRecord<_0> { + pub amount: ::core::primitive::u128, + pub owner: runtime_types::xcm::VersionedMultiLocation, + pub locker: runtime_types::xcm::VersionedMultiLocation, + pub consumers: runtime_types::bounded_collections::bounded_vec::BoundedVec<( + _0, + ::core::primitive::u128, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionMigrationStage { + #[codec(index = 0)] + MigrateSupportedVersion, + #[codec(index = 1)] + MigrateVersionNotifiers, + #[codec(index = 2)] + NotifyCurrentTargets( + ::core::option::Option<::std::vec::Vec<::core::primitive::u8>>, + ), + #[codec(index = 3)] + MigrateAndNotifyOldTargets, + } + } + } + pub mod polkadot_core_primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateHash(pub ::subxt::utils::H256); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundDownwardMessage<_0> { + pub sent_at: _0, + pub msg: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InboundHrmpMessage<_0> { + pub sent_at: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OutboundHrmpMessage<_0> { + pub recipient: _0, + pub data: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod polkadot_parachain { + use super::runtime_types; + pub mod primitives { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HeadData(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannelId { + pub sender: runtime_types::polkadot_parachain::primitives::Id, + pub recipient: runtime_types::polkadot_parachain::primitives::Id, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Id(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCode(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ValidationCodeHash(pub ::subxt::utils::H256); + } + } + pub mod polkadot_primitives { + use super::runtime_types; + pub mod v4 { + use super::runtime_types; + pub mod assignment_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod collator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + pub mod executor_params { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ExecutorParam { + #[codec(index = 1)] + MaxMemoryPages(::core::primitive::u32), + #[codec(index = 2)] + StackLogicalMax(::core::primitive::u32), + #[codec(index = 3)] + StackNativeMax(::core::primitive::u32), + #[codec(index = 4)] + PrecheckingMaxMemory(::core::primitive::u64), + #[codec(index = 5)] + PvfPrepTimeout( + runtime_types::polkadot_primitives::v4::PvfPrepTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 6)] + PvfExecTimeout( + runtime_types::polkadot_primitives::v4::PvfExecTimeoutKind, + ::core::primitive::u64, + ), + #[codec(index = 7)] + WasmExtBulkMemory, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ExecutorParams( + pub ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParam, + >, + ); + } + pub mod signed { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedSigned<_0, _1> { + pub payload: _0, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + pub signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_1>, + } + } + pub mod validator_app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::sr25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfield( + pub ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BackedCandidate<_0> { + pub candidate: + runtime_types::polkadot_primitives::v4::CommittedCandidateReceipt<_0>, + pub validity_votes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::ValidityAttestation, + >, + pub validator_indices: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateCommitments<_0> { + pub upward_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::std::vec::Vec<::core::primitive::u8>, + >, + pub horizontal_messages: + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::polkadot_core_primitives::OutboundHrmpMessage< + runtime_types::polkadot_parachain::primitives::Id, + >, + >, + pub new_validation_code: ::core::option::Option< + runtime_types::polkadot_parachain::primitives::ValidationCode, + >, + pub head_data: runtime_types::polkadot_parachain::primitives::HeadData, + pub processed_downward_messages: _0, + pub hrmp_watermark: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateDescriptor<_0> { + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub relay_parent: _0, + pub collator: runtime_types::polkadot_primitives::v4::collator_app::Public, + pub persisted_validation_data_hash: _0, + pub pov_hash: _0, + pub erasure_root: _0, + pub signature: runtime_types::polkadot_primitives::v4::collator_app::Signature, + pub para_head: _0, + pub validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments_hash: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CommittedCandidateReceipt<_0> { + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub commitments: runtime_types::polkadot_primitives::v4::CandidateCommitments< + ::core::primitive::u32, + >, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct CoreIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum CoreOccupied { + #[codec(index = 0)] + Parathread(runtime_types::polkadot_primitives::v4::ParathreadEntry), + #[codec(index = 1)] + Parachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeState<_0> { + pub validators_for: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub validators_against: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub start: _0, + pub concluded_at: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeStatement { + #[codec(index = 0)] + Valid(runtime_types::polkadot_primitives::v4::ValidDisputeStatementKind), + #[codec(index = 1)] + Invalid(runtime_types::polkadot_primitives::v4::InvalidDisputeStatementKind), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeStatementSet { + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub session: ::core::primitive::u32, + pub statements: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::DisputeStatement, + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Signature, + )>, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct GroupIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct IndexedVec<_0, _1>( + pub ::std::vec::Vec<_1>, + #[codec(skip)] pub ::core::marker::PhantomData<_0>, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct InherentData<_0> { + pub bitfields: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::signed::UncheckedSigned< + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + >, + >, + pub backed_candidates: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::BackedCandidate< + ::subxt::utils::H256, + >, + >, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + pub parent_header: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum InvalidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaim( + pub runtime_types::polkadot_parachain::primitives::Id, + pub runtime_types::polkadot_primitives::v4::collator_app::Public, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadEntry { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadClaim, + pub retries: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckStatement { + pub accept: ::core::primitive::bool, + pub subject: runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + pub session_index: ::core::primitive::u32, + pub validator_index: runtime_types::polkadot_primitives::v4::ValidatorIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfExecTimeoutKind { + #[codec(index = 0)] + Backing, + #[codec(index = 1)] + Approval, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfPrepTimeoutKind { + #[codec(index = 0)] + Precheck, + #[codec(index = 1)] + Lenient, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ScrapedOnChainVotes<_0> { + pub session: ::core::primitive::u32, + pub backing_validators_per_candidate: ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::CandidateReceipt<_0>, + ::std::vec::Vec<( + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::ValidityAttestation, + )>, + )>, + pub disputes: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::DisputeStatementSet, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionInfo { + pub active_validator_indices: + ::std::vec::Vec, + pub random_seed: [::core::primitive::u8; 32usize], + pub dispute_period: ::core::primitive::u32, + pub validators: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::ValidatorIndex, + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub discovery_keys: + ::std::vec::Vec, + pub assignment_keys: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::assignment_app::Public, + >, + pub validator_groups: runtime_types::polkadot_primitives::v4::IndexedVec< + runtime_types::polkadot_primitives::v4::GroupIndex, + ::std::vec::Vec, + >, + pub n_cores: ::core::primitive::u32, + pub zeroth_delay_tranche_width: ::core::primitive::u32, + pub relay_vrf_modulo_samples: ::core::primitive::u32, + pub n_delay_tranches: ::core::primitive::u32, + pub no_show_slots: ::core::primitive::u32, + pub needed_approvals: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeGoAhead { + #[codec(index = 0)] + Abort, + #[codec(index = 1)] + GoAhead, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UpgradeRestriction { + #[codec(index = 0)] + Present, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidDisputeStatementKind { + #[codec(index = 0)] + Explicit, + #[codec(index = 1)] + BackingSeconded(::subxt::utils::H256), + #[codec(index = 2)] + BackingValid(::subxt::utils::H256), + #[codec(index = 3)] + ApprovalChecking, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct ValidatorIndex(pub ::core::primitive::u32); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ValidityAttestation { + #[codec(index = 1)] + Implicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + #[codec(index = 2)] + Explicit(runtime_types::polkadot_primitives::v4::validator_app::Signature), + } + } + pub mod vstaging { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AsyncBackingParams { + pub max_candidate_depth: ::core::primitive::u32, + pub allowed_ancestry_len: ::core::primitive::u32, + } + } + } + pub mod polkadot_runtime_common { + use super::runtime_types; + pub mod assigned_slots { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] assign_perm_parachain_slot { id : runtime_types :: polkadot_parachain :: primitives :: Id , } , # [codec (index = 1)] assign_temp_parachain_slot { id : runtime_types :: polkadot_parachain :: primitives :: Id , lease_period_start : runtime_types :: polkadot_runtime_common :: assigned_slots :: SlotLeasePeriodStart , } , # [codec (index = 2)] unassign_parachain_slot { id : runtime_types :: polkadot_parachain :: primitives :: Id , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaDoesntExist, + #[codec(index = 1)] + NotParathread, + #[codec(index = 2)] + CannotUpgrade, + #[codec(index = 3)] + CannotDowngrade, + #[codec(index = 4)] + SlotAlreadyAssigned, + #[codec(index = 5)] + SlotNotAssigned, + #[codec(index = 6)] + OngoingLeaseExists, + #[codec(index = 7)] + MaxPermanentSlotsExceeded, + #[codec(index = 8)] + MaxTemporarySlotsExceeded, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + PermanentSlotAssigned(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + TemporarySlotAssigned(runtime_types::polkadot_parachain::primitives::Id), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParachainTemporarySlot<_0, _1> { + pub manager: _0, + pub period_begin: _1, + pub period_count: _1, + pub last_lease: ::core::option::Option<_1>, + pub lease_count: _1, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum SlotLeasePeriodStart { + #[codec(index = 0)] + Current, + #[codec(index = 1)] + Next, + } + } + pub mod auctions { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + new_auction { + #[codec(compact)] + duration: ::core::primitive::u32, + #[codec(compact)] + lease_period_index: ::core::primitive::u32, + }, + #[codec(index = 1)] + bid { + #[codec(compact)] + para: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + auction_index: ::core::primitive::u32, + #[codec(compact)] + first_slot: ::core::primitive::u32, + #[codec(compact)] + last_slot: ::core::primitive::u32, + #[codec(compact)] + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + cancel_auction, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + AuctionInProgress, + #[codec(index = 1)] + LeasePeriodInPast, + #[codec(index = 2)] + ParaNotRegistered, + #[codec(index = 3)] + NotCurrentAuction, + #[codec(index = 4)] + NotAuction, + #[codec(index = 5)] + AuctionEnded, + #[codec(index = 6)] + AlreadyLeasedOut, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + AuctionStarted { + auction_index: ::core::primitive::u32, + lease_period: ::core::primitive::u32, + ending: ::core::primitive::u32, + }, + #[codec(index = 1)] + AuctionClosed { auction_index: ::core::primitive::u32 }, + #[codec(index = 2)] + Reserved { + bidder: ::sp_core::crypto::AccountId32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + Unreserved { + bidder: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 4)] + ReserveConfiscated { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 5)] + BidAccepted { + bidder: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + first_slot: ::core::primitive::u32, + last_slot: ::core::primitive::u32, + }, + #[codec(index = 6)] + WinningOffset { + auction_index: ::core::primitive::u32, + block_number: ::core::primitive::u32, + }, + } + } + } + pub mod crowdloan { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + create { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 1)] + contribute { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + value: ::core::primitive::u128, + signature: + ::core::option::Option, + }, + #[codec(index = 2)] + withdraw { + who: ::sp_core::crypto::AccountId32, + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 3)] + refund { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + dissolve { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + edit { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + #[codec(compact)] + cap: ::core::primitive::u128, + #[codec(compact)] + first_period: ::core::primitive::u32, + #[codec(compact)] + last_period: ::core::primitive::u32, + #[codec(compact)] + end: ::core::primitive::u32, + verifier: + ::core::option::Option, + }, + #[codec(index = 6)] + add_memo { + index: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 7)] + poke { index: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + contribute_all { + #[codec(compact)] + index: runtime_types::polkadot_parachain::primitives::Id, + signature: + ::core::option::Option, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + FirstPeriodInPast, + #[codec(index = 1)] + FirstPeriodTooFarInFuture, + #[codec(index = 2)] + LastPeriodBeforeFirstPeriod, + #[codec(index = 3)] + LastPeriodTooFarInFuture, + #[codec(index = 4)] + CannotEndInPast, + #[codec(index = 5)] + EndTooFarInFuture, + #[codec(index = 6)] + Overflow, + #[codec(index = 7)] + ContributionTooSmall, + #[codec(index = 8)] + InvalidParaId, + #[codec(index = 9)] + CapExceeded, + #[codec(index = 10)] + ContributionPeriodOver, + #[codec(index = 11)] + InvalidOrigin, + #[codec(index = 12)] + NotParachain, + #[codec(index = 13)] + LeaseActive, + #[codec(index = 14)] + BidOrLeaseActive, + #[codec(index = 15)] + FundNotEnded, + #[codec(index = 16)] + NoContributions, + #[codec(index = 17)] + NotReadyToDissolve, + #[codec(index = 18)] + InvalidSignature, + #[codec(index = 19)] + MemoTooLarge, + #[codec(index = 20)] + AlreadyInNewRaise, + #[codec(index = 21)] + VrfDelayInProgress, + #[codec(index = 22)] + NoLeasePeriod, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Created { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 1)] + Contributed { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 2)] + Withdrew { + who: ::sp_core::crypto::AccountId32, + fund_index: runtime_types::polkadot_parachain::primitives::Id, + amount: ::core::primitive::u128, + }, + #[codec(index = 3)] + PartiallyRefunded { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + AllRefunded { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + Dissolved { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 6)] + HandleBidResult { + para_id: runtime_types::polkadot_parachain::primitives::Id, + result: ::core::result::Result< + (), + runtime_types::sp_runtime::DispatchError, + >, + }, + #[codec(index = 7)] + Edited { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 8)] + MemoUpdated { + who: ::sp_core::crypto::AccountId32, + para_id: runtime_types::polkadot_parachain::primitives::Id, + memo: ::std::vec::Vec<::core::primitive::u8>, + }, + #[codec(index = 9)] + AddedToNewRaise { + para_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct FundInfo<_0, _1, _2, _3> { + pub depositor: _0, + pub verifier: ::core::option::Option, + pub deposit: _1, + pub raised: _1, + pub end: _2, + pub cap: _1, + pub last_contribution: + runtime_types::polkadot_runtime_common::crowdloan::LastContribution<_2>, + pub first_period: _2, + pub last_period: _2, + pub fund_index: _2, + #[codec(skip)] + pub __subxt_unused_type_params: ::core::marker::PhantomData<_3>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum LastContribution<_0> { + #[codec(index = 0)] + Never, + #[codec(index = 1)] + PreEnding(_0), + #[codec(index = 2)] + Ending(_0), + } + } + pub mod paras_registrar { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + register { + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_register { + who: ::sp_core::crypto::AccountId32, + deposit: ::core::primitive::u128, + id: runtime_types::polkadot_parachain::primitives::Id, + genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 2)] + deregister { id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 3)] + swap { + id: runtime_types::polkadot_parachain::primitives::Id, + other: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + remove_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 5)] + reserve, + #[codec(index = 6)] + add_lock { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 7)] + schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 8)] + set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + AlreadyRegistered, + #[codec(index = 2)] + NotOwner, + #[codec(index = 3)] + CodeTooLarge, + #[codec(index = 4)] + HeadDataTooLarge, + #[codec(index = 5)] + NotParachain, + #[codec(index = 6)] + NotParathread, + #[codec(index = 7)] + CannotDeregister, + #[codec(index = 8)] + CannotDowngrade, + #[codec(index = 9)] + CannotUpgrade, + #[codec(index = 10)] + ParaLocked, + #[codec(index = 11)] + NotReserved, + #[codec(index = 12)] + EmptyCode, + #[codec(index = 13)] + CannotSwap, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + Registered { + para_id: runtime_types::polkadot_parachain::primitives::Id, + manager: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 1)] + Deregistered { para_id: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + Reserved { + para_id: runtime_types::polkadot_parachain::primitives::Id, + who: ::sp_core::crypto::AccountId32, + }, + #[codec(index = 3)] + Swapped { + para_id: runtime_types::polkadot_parachain::primitives::Id, + other_id: runtime_types::polkadot_parachain::primitives::Id, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaInfo<_0, _1> { + pub manager: _0, + pub deposit: _1, + pub locked: ::core::primitive::bool, + } + } + pub mod paras_sudo_wrapper { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + sudo_schedule_para_initialize { + id: runtime_types::polkadot_parachain::primitives::Id, + genesis: + runtime_types::polkadot_runtime_parachains::paras::ParaGenesisArgs, + }, + #[codec(index = 1)] + sudo_schedule_para_cleanup { + id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 2)] + sudo_schedule_parathread_upgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 3)] + sudo_schedule_parachain_downgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 4)] + sudo_queue_downward_xcm { + id: runtime_types::polkadot_parachain::primitives::Id, + xcm: ::std::boxed::Box, + }, + #[codec(index = 5)] + sudo_establish_hrmp_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + recipient: runtime_types::polkadot_parachain::primitives::Id, + max_capacity: ::core::primitive::u32, + max_message_size: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaDoesntExist, + #[codec(index = 1)] + ParaAlreadyExists, + #[codec(index = 2)] + ExceedsMaxMessageSize, + #[codec(index = 3)] + CouldntCleanup, + #[codec(index = 4)] + NotParathread, + #[codec(index = 5)] + NotParachain, + #[codec(index = 6)] + CannotUpgrade, + #[codec(index = 7)] + CannotDowngrade, + } + } + } + pub mod slots { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_lease { + para: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + amount: ::core::primitive::u128, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + }, + #[codec(index = 1)] + clear_all_leases { para: runtime_types::polkadot_parachain::primitives::Id }, + #[codec(index = 2)] + trigger_onboard { para: runtime_types::polkadot_parachain::primitives::Id }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + ParaNotOnboarding, + #[codec(index = 1)] + LeaseError, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + NewLeasePeriod { lease_period: ::core::primitive::u32 }, + #[codec(index = 1)] + Leased { + para_id: runtime_types::polkadot_parachain::primitives::Id, + leaser: ::sp_core::crypto::AccountId32, + period_begin: ::core::primitive::u32, + period_count: ::core::primitive::u32, + extra_reserved: ::core::primitive::u128, + total_amount: ::core::primitive::u128, + }, + } + } + } + } + pub mod polkadot_runtime_parachains { + use super::runtime_types; + pub mod configuration { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + # [codec (index = 0)] set_validation_upgrade_cooldown { new : :: core :: primitive :: u32 , } , # [codec (index = 1)] set_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 2)] set_code_retention_period { new : :: core :: primitive :: u32 , } , # [codec (index = 3)] set_max_code_size { new : :: core :: primitive :: u32 , } , # [codec (index = 4)] set_max_pov_size { new : :: core :: primitive :: u32 , } , # [codec (index = 5)] set_max_head_data_size { new : :: core :: primitive :: u32 , } , # [codec (index = 6)] set_parathread_cores { new : :: core :: primitive :: u32 , } , # [codec (index = 7)] set_parathread_retries { new : :: core :: primitive :: u32 , } , # [codec (index = 8)] set_group_rotation_frequency { new : :: core :: primitive :: u32 , } , # [codec (index = 9)] set_chain_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 10)] set_thread_availability_period { new : :: core :: primitive :: u32 , } , # [codec (index = 11)] set_scheduling_lookahead { new : :: core :: primitive :: u32 , } , # [codec (index = 12)] set_max_validators_per_core { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 13)] set_max_validators { new : :: core :: option :: Option < :: core :: primitive :: u32 > , } , # [codec (index = 14)] set_dispute_period { new : :: core :: primitive :: u32 , } , # [codec (index = 15)] set_dispute_post_conclusion_acceptance_period { new : :: core :: primitive :: u32 , } , # [codec (index = 18)] set_no_show_slots { new : :: core :: primitive :: u32 , } , # [codec (index = 19)] set_n_delay_tranches { new : :: core :: primitive :: u32 , } , # [codec (index = 20)] set_zeroth_delay_tranche_width { new : :: core :: primitive :: u32 , } , # [codec (index = 21)] set_needed_approvals { new : :: core :: primitive :: u32 , } , # [codec (index = 22)] set_relay_vrf_modulo_samples { new : :: core :: primitive :: u32 , } , # [codec (index = 23)] set_max_upward_queue_count { new : :: core :: primitive :: u32 , } , # [codec (index = 24)] set_max_upward_queue_size { new : :: core :: primitive :: u32 , } , # [codec (index = 25)] set_max_downward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 27)] set_max_upward_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 28)] set_max_upward_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 29)] set_hrmp_open_request_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 30)] set_hrmp_sender_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 31)] set_hrmp_recipient_deposit { new : :: core :: primitive :: u128 , } , # [codec (index = 32)] set_hrmp_channel_max_capacity { new : :: core :: primitive :: u32 , } , # [codec (index = 33)] set_hrmp_channel_max_total_size { new : :: core :: primitive :: u32 , } , # [codec (index = 34)] set_hrmp_max_parachain_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 35)] set_hrmp_max_parathread_inbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 36)] set_hrmp_channel_max_message_size { new : :: core :: primitive :: u32 , } , # [codec (index = 37)] set_hrmp_max_parachain_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 38)] set_hrmp_max_parathread_outbound_channels { new : :: core :: primitive :: u32 , } , # [codec (index = 39)] set_hrmp_max_message_num_per_candidate { new : :: core :: primitive :: u32 , } , # [codec (index = 41)] set_pvf_checking_enabled { new : :: core :: primitive :: bool , } , # [codec (index = 42)] set_pvf_voting_ttl { new : :: core :: primitive :: u32 , } , # [codec (index = 43)] set_minimum_validation_upgrade_delay { new : :: core :: primitive :: u32 , } , # [codec (index = 44)] set_bypass_consistency_check { new : :: core :: primitive :: bool , } , # [codec (index = 45)] set_async_backing_params { new : runtime_types :: polkadot_primitives :: vstaging :: AsyncBackingParams , } , # [codec (index = 46)] set_executor_params { new : runtime_types :: polkadot_primitives :: v4 :: executor_params :: ExecutorParams , } , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + InvalidNewValue, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HostConfiguration<_0> { + pub max_code_size: _0, + pub max_head_data_size: _0, + pub max_upward_queue_count: _0, + pub max_upward_queue_size: _0, + pub max_upward_message_size: _0, + pub max_upward_message_num_per_candidate: _0, + pub hrmp_max_message_num_per_candidate: _0, + pub validation_upgrade_cooldown: _0, + pub validation_upgrade_delay: _0, + pub async_backing_params: + runtime_types::polkadot_primitives::vstaging::AsyncBackingParams, + pub max_pov_size: _0, + pub max_downward_message_size: _0, + pub hrmp_max_parachain_outbound_channels: _0, + pub hrmp_max_parathread_outbound_channels: _0, + pub hrmp_sender_deposit: ::core::primitive::u128, + pub hrmp_recipient_deposit: ::core::primitive::u128, + pub hrmp_channel_max_capacity: _0, + pub hrmp_channel_max_total_size: _0, + pub hrmp_max_parachain_inbound_channels: _0, + pub hrmp_max_parathread_inbound_channels: _0, + pub hrmp_channel_max_message_size: _0, + pub executor_params: + runtime_types::polkadot_primitives::v4::executor_params::ExecutorParams, + pub code_retention_period: _0, + pub parathread_cores: _0, + pub parathread_retries: _0, + pub group_rotation_frequency: _0, + pub chain_availability_period: _0, + pub thread_availability_period: _0, + pub scheduling_lookahead: _0, + pub max_validators_per_core: ::core::option::Option<_0>, + pub max_validators: ::core::option::Option<_0>, + pub dispute_period: _0, + pub dispute_post_conclusion_acceptance_period: _0, + pub no_show_slots: _0, + pub n_delay_tranches: _0, + pub zeroth_delay_tranche_width: _0, + pub needed_approvals: _0, + pub relay_vrf_modulo_samples: _0, + pub pvf_checking_enabled: ::core::primitive::bool, + pub pvf_voting_ttl: _0, + pub minimum_validation_upgrade_delay: _0, + } + } + pub mod disputes { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_unfreeze, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + DuplicateDisputeStatementSets, + #[codec(index = 1)] + AncientDisputeStatement, + #[codec(index = 2)] + ValidatorIndexOutOfBounds, + #[codec(index = 3)] + InvalidSignature, + #[codec(index = 4)] + DuplicateStatement, + #[codec(index = 5)] + SingleSidedDispute, + #[codec(index = 6)] + MaliciousBacker, + #[codec(index = 7)] + MissingBackingVotes, + #[codec(index = 8)] + UnconfirmedDispute, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + DisputeInitiated( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeLocation, + ), + #[codec(index = 1)] + DisputeConcluded( + runtime_types::polkadot_core_primitives::CandidateHash, + runtime_types::polkadot_runtime_parachains::disputes::DisputeResult, + ), + #[codec(index = 2)] + Revert(::core::primitive::u32), + } + } + pub mod slashing { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Call { + # [codec (index = 0)] report_dispute_lost_unsigned { dispute_proof : :: std :: boxed :: Box < runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputeProof > , key_owner_proof : :: sp_session :: MembershipProof , } , } + #[derive( + :: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq, + )] + pub enum Error { + #[codec(index = 0)] + InvalidKeyOwnershipProof, + #[codec(index = 1)] + InvalidSessionIndex, + #[codec(index = 2)] + InvalidCandidateHash, + #[codec(index = 3)] + InvalidValidatorIndex, + #[codec(index = 4)] + ValidatorIndexIdMismatch, + #[codec(index = 5)] + DuplicateSlashingReport, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputeProof { pub time_slot : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputesTimeSlot , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , pub validator_index : runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , pub validator_id : runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DisputesTimeSlot { + pub session_index: ::core::primitive::u32, + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PendingSlashes { pub keys : :: subxt :: utils :: KeyedVec < runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public > , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum SlashingOffenceKind { + #[codec(index = 0)] + ForInvalid, + #[codec(index = 1)] + AgainstValid, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeLocation { + #[codec(index = 0)] + Local, + #[codec(index = 1)] + Remote, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DisputeResult { + #[codec(index = 0)] + Valid, + #[codec(index = 1)] + Invalid, + } + } + pub mod hrmp { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + hrmp_init_open_channel { + recipient: runtime_types::polkadot_parachain::primitives::Id, + proposed_max_capacity: ::core::primitive::u32, + proposed_max_message_size: ::core::primitive::u32, + }, + #[codec(index = 1)] + hrmp_accept_open_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 2)] + hrmp_close_channel { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + }, + #[codec(index = 3)] + force_clean_hrmp { + para: runtime_types::polkadot_parachain::primitives::Id, + inbound: ::core::primitive::u32, + outbound: ::core::primitive::u32, + }, + #[codec(index = 4)] + force_process_hrmp_open { channels: ::core::primitive::u32 }, + #[codec(index = 5)] + force_process_hrmp_close { channels: ::core::primitive::u32 }, + #[codec(index = 6)] + hrmp_cancel_open_request { + channel_id: + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + open_requests: ::core::primitive::u32, + }, + #[codec(index = 7)] + force_open_hrmp_channel { + sender: runtime_types::polkadot_parachain::primitives::Id, + recipient: runtime_types::polkadot_parachain::primitives::Id, + max_capacity: ::core::primitive::u32, + max_message_size: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + OpenHrmpChannelToSelf, + #[codec(index = 1)] + OpenHrmpChannelInvalidRecipient, + #[codec(index = 2)] + OpenHrmpChannelZeroCapacity, + #[codec(index = 3)] + OpenHrmpChannelCapacityExceedsLimit, + #[codec(index = 4)] + OpenHrmpChannelZeroMessageSize, + #[codec(index = 5)] + OpenHrmpChannelMessageSizeExceedsLimit, + #[codec(index = 6)] + OpenHrmpChannelAlreadyExists, + #[codec(index = 7)] + OpenHrmpChannelAlreadyRequested, + #[codec(index = 8)] + OpenHrmpChannelLimitExceeded, + #[codec(index = 9)] + AcceptHrmpChannelDoesntExist, + #[codec(index = 10)] + AcceptHrmpChannelAlreadyConfirmed, + #[codec(index = 11)] + AcceptHrmpChannelLimitExceeded, + #[codec(index = 12)] + CloseHrmpChannelUnauthorized, + #[codec(index = 13)] + CloseHrmpChannelDoesntExist, + #[codec(index = 14)] + CloseHrmpChannelAlreadyUnderway, + #[codec(index = 15)] + CancelHrmpOpenChannelUnauthorized, + #[codec(index = 16)] + OpenHrmpChannelDoesntExist, + #[codec(index = 17)] + OpenHrmpChannelAlreadyConfirmed, + #[codec(index = 18)] + WrongWitness, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + OpenChannelRequested( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + #[codec(index = 1)] + OpenChannelCanceled( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 2)] + OpenChannelAccepted( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 3)] + ChannelClosed( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::HrmpChannelId, + ), + #[codec(index = 4)] + HrmpChannelForceOpened( + runtime_types::polkadot_parachain::primitives::Id, + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ::core::primitive::u32, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpChannel { + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + pub max_message_size: ::core::primitive::u32, + pub msg_count: ::core::primitive::u32, + pub total_size: ::core::primitive::u32, + pub mqc_head: ::core::option::Option<::subxt::utils::H256>, + pub sender_deposit: ::core::primitive::u128, + pub recipient_deposit: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct HrmpOpenChannelRequest { + pub confirmed: ::core::primitive::bool, + pub _age: ::core::primitive::u32, + pub sender_deposit: ::core::primitive::u128, + pub max_message_size: ::core::primitive::u32, + pub max_capacity: ::core::primitive::u32, + pub max_total_size: ::core::primitive::u32, + } + } + pub mod inclusion { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + UnsortedOrDuplicateValidatorIndices, + #[codec(index = 1)] + UnsortedOrDuplicateDisputeStatementSet, + #[codec(index = 2)] + UnsortedOrDuplicateBackedCandidates, + #[codec(index = 3)] + UnexpectedRelayParent, + #[codec(index = 4)] + WrongBitfieldSize, + #[codec(index = 5)] + BitfieldAllZeros, + #[codec(index = 6)] + BitfieldDuplicateOrUnordered, + #[codec(index = 7)] + ValidatorIndexOutOfBounds, + #[codec(index = 8)] + InvalidBitfieldSignature, + #[codec(index = 9)] + UnscheduledCandidate, + #[codec(index = 10)] + CandidateScheduledBeforeParaFree, + #[codec(index = 11)] + WrongCollator, + #[codec(index = 12)] + ScheduledOutOfOrder, + #[codec(index = 13)] + HeadDataTooLarge, + #[codec(index = 14)] + PrematureCodeUpgrade, + #[codec(index = 15)] + NewCodeTooLarge, + #[codec(index = 16)] + CandidateNotInParentContext, + #[codec(index = 17)] + InvalidGroupIndex, + #[codec(index = 18)] + InsufficientBacking, + #[codec(index = 19)] + InvalidBacking, + #[codec(index = 20)] + NotCollatorSigned, + #[codec(index = 21)] + ValidationDataHashMismatch, + #[codec(index = 22)] + IncorrectDownwardMessageHandling, + #[codec(index = 23)] + InvalidUpwardMessages, + #[codec(index = 24)] + HrmpWatermarkMishandling, + #[codec(index = 25)] + InvalidOutboundHrmp, + #[codec(index = 26)] + InvalidValidationCodeHash, + #[codec(index = 27)] + ParaHeadMismatch, + #[codec(index = 28)] + BitfieldReferencesFreedCore, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CandidateBacked( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 1)] + CandidateIncluded( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + runtime_types::polkadot_primitives::v4::GroupIndex, + ), + #[codec(index = 2)] + CandidateTimedOut( + runtime_types::polkadot_primitives::v4::CandidateReceipt< + ::subxt::utils::H256, + >, + runtime_types::polkadot_parachain::primitives::HeadData, + runtime_types::polkadot_primitives::v4::CoreIndex, + ), + #[codec(index = 3)] + UpwardMessagesReceived { + from: runtime_types::polkadot_parachain::primitives::Id, + count: ::core::primitive::u32, + }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AggregateMessageOrigin { + #[codec(index = 0)] + Ump(runtime_types::polkadot_runtime_parachains::inclusion::UmpQueueId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct AvailabilityBitfieldRecord<_0> { + pub bitfield: runtime_types::polkadot_primitives::v4::AvailabilityBitfield, + pub submitted_at: _0, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CandidatePendingAvailability<_0, _1> { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub hash: runtime_types::polkadot_core_primitives::CandidateHash, + pub descriptor: runtime_types::polkadot_primitives::v4::CandidateDescriptor<_0>, + pub availability_votes: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub backers: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub relay_parent_number: _1, + pub backed_in_number: _1, + pub backing_group: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum UmpQueueId { + #[codec(index = 0)] + Para(runtime_types::polkadot_parachain::primitives::Id), + } + } + pub mod initializer { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_approve { up_to: ::core::primitive::u32 }, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BufferedSessionChange { + pub validators: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub queued: ::std::vec::Vec< + runtime_types::polkadot_primitives::v4::validator_app::Public, + >, + pub session_index: ::core::primitive::u32, + } + } + pub mod origin { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Origin { + #[codec(index = 0)] + Parachain(runtime_types::polkadot_parachain::primitives::Id), + } + } + } + pub mod paras { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + force_set_current_code { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 1)] + force_set_current_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 2)] + force_schedule_code_upgrade { + para: runtime_types::polkadot_parachain::primitives::Id, + new_code: runtime_types::polkadot_parachain::primitives::ValidationCode, + relay_parent_number: ::core::primitive::u32, + }, + #[codec(index = 3)] + force_note_new_head { + para: runtime_types::polkadot_parachain::primitives::Id, + new_head: runtime_types::polkadot_parachain::primitives::HeadData, + }, + #[codec(index = 4)] + force_queue_action { + para: runtime_types::polkadot_parachain::primitives::Id, + }, + #[codec(index = 5)] + add_trusted_validation_code { + validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + }, + #[codec(index = 6)] + poke_unused_validation_code { + validation_code_hash: + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + }, + #[codec(index = 7)] + include_pvf_check_statement { + stmt: runtime_types::polkadot_primitives::v4::PvfCheckStatement, + signature: + runtime_types::polkadot_primitives::v4::validator_app::Signature, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + NotRegistered, + #[codec(index = 1)] + CannotOnboard, + #[codec(index = 2)] + CannotOffboard, + #[codec(index = 3)] + CannotUpgrade, + #[codec(index = 4)] + CannotDowngrade, + #[codec(index = 5)] + PvfCheckStatementStale, + #[codec(index = 6)] + PvfCheckStatementFuture, + #[codec(index = 7)] + PvfCheckValidatorIndexOutOfBounds, + #[codec(index = 8)] + PvfCheckInvalidSignature, + #[codec(index = 9)] + PvfCheckDoubleVote, + #[codec(index = 10)] + PvfCheckSubjectInvalid, + #[codec(index = 11)] + CannotUpgradeCode, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Event { + #[codec(index = 0)] + CurrentCodeUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + CurrentHeadUpdated(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 2)] + CodeUpgradeScheduled(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 3)] + NewHeadNoted(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 4)] + ActionQueued( + runtime_types::polkadot_parachain::primitives::Id, + ::core::primitive::u32, + ), + #[codec(index = 5)] + PvfCheckStarted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 6)] + PvfCheckAccepted( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + #[codec(index = 7)] + PvfCheckRejected( + runtime_types::polkadot_parachain::primitives::ValidationCodeHash, + runtime_types::polkadot_parachain::primitives::Id, + ), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaGenesisArgs { + pub genesis_head: runtime_types::polkadot_parachain::primitives::HeadData, + pub validation_code: + runtime_types::polkadot_parachain::primitives::ValidationCode, + pub para_kind: ::core::primitive::bool, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ParaLifecycle { + #[codec(index = 0)] + Onboarding, + #[codec(index = 1)] + Parathread, + #[codec(index = 2)] + Parachain, + #[codec(index = 3)] + UpgradingParathread, + #[codec(index = 4)] + DowngradingParachain, + #[codec(index = 5)] + OffboardingParathread, + #[codec(index = 6)] + OffboardingParachain, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParaPastCodeMeta<_0> { + pub upgrade_times: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::ReplacementTimes<_0>, + >, + pub last_pruned: ::core::option::Option<_0>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PvfCheckActiveVoteState<_0> { + pub votes_accept: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub votes_reject: ::subxt::utils::bits::DecodedBits< + ::core::primitive::u8, + ::subxt::utils::bits::Lsb0, + >, + pub age: _0, + pub created_at: _0, + pub causes: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::paras::PvfCheckCause<_0>, + >, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PvfCheckCause<_0> { + #[codec(index = 0)] + Onboarding(runtime_types::polkadot_parachain::primitives::Id), + #[codec(index = 1)] + Upgrade { + id: runtime_types::polkadot_parachain::primitives::Id, + relay_parent_number: _0, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ReplacementTimes<_0> { + pub expected_at: _0, + pub activated_at: _0, + } + } + pub mod paras_inherent { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call { + #[codec(index = 0)] + enter { + data: runtime_types::polkadot_primitives::v4::InherentData< + ::sp_runtime::generic::Header< + ::core::primitive::u32, + ::sp_runtime::traits::BlakeTwo256, + >, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + TooManyInclusionInherents, + #[codec(index = 1)] + InvalidParentHeader, + #[codec(index = 2)] + CandidateConcludedInvalid, + #[codec(index = 3)] + InherentOverweight, + #[codec(index = 4)] + DisputeStatementsUnsortedOrDuplicates, + #[codec(index = 5)] + DisputeInvalid, + } + } + } + pub mod scheduler { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssignmentKind { + #[codec(index = 0)] + Parachain, + #[codec(index = 1)] + Parathread( + runtime_types::polkadot_primitives::v4::collator_app::Public, + ::core::primitive::u32, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct CoreAssignment { + pub core: runtime_types::polkadot_primitives::v4::CoreIndex, + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub kind: runtime_types::polkadot_runtime_parachains::scheduler::AssignmentKind, + pub group_idx: runtime_types::polkadot_primitives::v4::GroupIndex, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ParathreadClaimQueue { + pub queue: ::std::vec::Vec< + runtime_types::polkadot_runtime_parachains::scheduler::QueuedParathread, + >, + pub next_core_offset: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueuedParathread { + pub claim: runtime_types::polkadot_primitives::v4::ParathreadEntry, + pub core_offset: ::core::primitive::u32, + } + } + pub mod shared { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Call {} + } + } + } + pub mod sp_arithmetic { + use super::runtime_types; + pub mod fixed_point { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct FixedU128(pub ::core::primitive::u128); + } + pub mod per_things { + use super::runtime_types; + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct PerU16(pub ::core::primitive::u16); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Perbill(pub ::core::primitive::u32); + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Percent(pub ::core::primitive::u8); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ArithmeticError { + #[codec(index = 0)] + Underflow, + #[codec(index = 1)] + Overflow, + #[codec(index = 2)] + DivisionByZero, + } + } + pub mod sp_authority_discovery { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + } + pub mod sp_consensus_babe { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::sr25519::Public); + } + pub mod digests { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NextConfigDescriptor { + #[codec(index = 1)] + V1 { + c: (::core::primitive::u64, ::core::primitive::u64), + allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum PreDigest { + #[codec(index = 1)] + Primary(runtime_types::sp_consensus_babe::digests::PrimaryPreDigest), + #[codec(index = 2)] + SecondaryPlain( + runtime_types::sp_consensus_babe::digests::SecondaryPlainPreDigest, + ), + #[codec(index = 3)] + SecondaryVRF(runtime_types::sp_consensus_babe::digests::SecondaryVRFPreDigest), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PrimaryPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryPlainPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SecondaryVRFPreDigest { + pub authority_index: ::core::primitive::u32, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub vrf_signature: runtime_types::sp_core::sr25519::vrf::VrfSignature, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AllowedSlots { + #[codec(index = 0)] + PrimarySlots, + #[codec(index = 1)] + PrimaryAndSecondaryPlainSlots, + #[codec(index = 2)] + PrimaryAndSecondaryVRFSlots, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct BabeEpochConfiguration { + pub c: (::core::primitive::u64, ::core::primitive::u64), + pub allowed_slots: runtime_types::sp_consensus_babe::AllowedSlots, + } + } + pub mod sp_consensus_grandpa { + use super::runtime_types; + pub mod app { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub runtime_types::sp_core::ed25519::Public); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub runtime_types::sp_core::ed25519::Signature); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Equivocation<_0, _1> { + #[codec(index = 0)] + Prevote( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Prevote<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + #[codec(index = 1)] + Precommit( + runtime_types::finality_grandpa::Equivocation< + runtime_types::sp_consensus_grandpa::app::Public, + runtime_types::finality_grandpa::Precommit<_0, _1>, + runtime_types::sp_consensus_grandpa::app::Signature, + >, + ), + } + } + pub mod sp_consensus_slots { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct EquivocationProof<_0, _1> { + pub offender: _1, + pub slot: runtime_types::sp_consensus_slots::Slot, + pub first_header: _0, + pub second_header: _0, + } + #[derive( + :: codec :: Decode, + :: codec :: Encode, + :: subxt :: ext :: codec :: CompactAs, + Clone, + Debug, + PartialEq, + )] + pub struct Slot(pub ::core::primitive::u64); + } + pub mod sp_core { + use super::runtime_types; + pub mod crypto { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct KeyTypeId(pub [::core::primitive::u8; 4usize]); + } + pub mod ecdsa { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 33usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 65usize]); + } + pub mod ed25519 { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + pub mod offchain { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueMultiaddr(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaqueNetworkState { + pub peer_id: runtime_types::sp_core::OpaquePeerId, + pub external_addresses: + ::std::vec::Vec, + } + } + pub mod sr25519 { + use super::runtime_types; + pub mod vrf { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct VrfSignature { + pub output: [::core::primitive::u8; 32usize], + pub proof: [::core::primitive::u8; 64usize], + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Public(pub [::core::primitive::u8; 32usize]); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Signature(pub [::core::primitive::u8; 64usize]); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OpaquePeerId(pub ::std::vec::Vec<::core::primitive::u8>); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Void {} + } + pub mod sp_npos_elections { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ElectionScore { + pub minimal_stake: ::core::primitive::u128, + pub sum_stake: ::core::primitive::u128, + pub sum_stake_squared: ::core::primitive::u128, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Support<_0> { + pub total: ::core::primitive::u128, + pub voters: ::std::vec::Vec<(_0, ::core::primitive::u128)>, + } + } + pub mod sp_runtime { + use super::runtime_types; + pub mod generic { + use super::runtime_types; + pub mod digest { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DigestItem { + #[codec(index = 6)] + PreRuntime( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 4)] + Consensus( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 5)] + Seal( + [::core::primitive::u8; 4usize], + ::std::vec::Vec<::core::primitive::u8>, + ), + #[codec(index = 0)] + Other(::std::vec::Vec<::core::primitive::u8>), + #[codec(index = 8)] + RuntimeEnvironmentUpdated, + } + } + pub mod unchecked_extrinsic { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct UncheckedExtrinsic<_0, _1, _2, _3>( + pub ::std::vec::Vec<::core::primitive::u8>, + #[codec(skip)] pub ::core::marker::PhantomData<(_0, _1, _2, _3)>, + ); + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum DispatchError { + #[codec(index = 0)] + Other, + #[codec(index = 1)] + CannotLookup, + #[codec(index = 2)] + BadOrigin, + #[codec(index = 3)] + Module(runtime_types::sp_runtime::ModuleError), + #[codec(index = 4)] + ConsumerRemaining, + #[codec(index = 5)] + NoProviders, + #[codec(index = 6)] + TooManyConsumers, + #[codec(index = 7)] + Token(runtime_types::sp_runtime::TokenError), + #[codec(index = 8)] + Arithmetic(runtime_types::sp_arithmetic::ArithmeticError), + #[codec(index = 9)] + Transactional(runtime_types::sp_runtime::TransactionalError), + #[codec(index = 10)] + Exhausted, + #[codec(index = 11)] + Corruption, + #[codec(index = 12)] + Unavailable, + #[codec(index = 13)] + RootNotAllowed, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct ModuleError { + pub index: ::core::primitive::u8, + pub error: [::core::primitive::u8; 4usize], + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSignature { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Signature), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Signature), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Signature), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiSigner { + #[codec(index = 0)] + Ed25519(runtime_types::sp_core::ed25519::Public), + #[codec(index = 1)] + Sr25519(runtime_types::sp_core::sr25519::Public), + #[codec(index = 2)] + Ecdsa(runtime_types::sp_core::ecdsa::Public), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TokenError { + #[codec(index = 0)] + FundsUnavailable, + #[codec(index = 1)] + OnlyProvider, + #[codec(index = 2)] + BelowMinimum, + #[codec(index = 3)] + CannotCreate, + #[codec(index = 4)] + UnknownAsset, + #[codec(index = 5)] + Frozen, + #[codec(index = 6)] + Unsupported, + #[codec(index = 7)] + CannotCreateHold, + #[codec(index = 8)] + NotExpendable, + #[codec(index = 9)] + Blocked, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum TransactionalError { + #[codec(index = 0)] + LimitReached, + #[codec(index = 1)] + NoLayer, + } + } + pub mod sp_staking { + use super::runtime_types; + pub mod offence { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct OffenceDetails<_0, _1> { + pub offender: _1, + pub reporters: ::std::vec::Vec<_0>, + } + } + } + pub mod sp_version { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeVersion { + pub spec_name: ::std::string::String, + pub impl_name: ::std::string::String, + pub authoring_version: ::core::primitive::u32, + pub spec_version: ::core::primitive::u32, + pub impl_version: ::core::primitive::u32, + pub apis: + ::std::vec::Vec<([::core::primitive::u8; 8usize], ::core::primitive::u32)>, + pub transaction_version: ::core::primitive::u32, + pub state_version: ::core::primitive::u8, + } + } + pub mod sp_weights { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct RuntimeDbWeight { + pub read: ::core::primitive::u64, + pub write: ::core::primitive::u64, + } + } + pub mod westend_runtime { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct NposCompactSolution16 { + pub votes1: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes2: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + ( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ), + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes3: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 2usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes4: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 3usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes5: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 4usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes6: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 5usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes7: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 6usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes8: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 7usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes9: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 8usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes10: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 9usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes11: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 10usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes12: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 11usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes13: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 12usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes14: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 13usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes15: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 14usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + pub votes16: ::std::vec::Vec<( + ::subxt::ext::codec::Compact<::core::primitive::u32>, + [( + ::subxt::ext::codec::Compact<::core::primitive::u16>, + ::subxt::ext::codec::Compact< + runtime_types::sp_arithmetic::per_things::PerU16, + >, + ); 15usize], + ::subxt::ext::codec::Compact<::core::primitive::u16>, + )>, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginCaller { + #[codec(index = 0)] + system( + runtime_types::frame_support::dispatch::RawOrigin< + ::sp_core::crypto::AccountId32, + >, + ), + #[codec(index = 41)] + ParachainsOrigin( + runtime_types::polkadot_runtime_parachains::origin::pallet::Origin, + ), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Origin), + #[codec(index = 3)] + Void(runtime_types::sp_core::Void), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum ProxyType { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + NonTransfer, + #[codec(index = 2)] + Staking, + #[codec(index = 3)] + SudoBalances, + #[codec(index = 4)] + IdentityJudgement, + #[codec(index = 5)] + CancelProxy, + #[codec(index = 6)] + Auction, + #[codec(index = 7)] + NominationPools, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Runtime; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeCall { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Call), + #[codec(index = 1)] + Babe(runtime_types::pallet_babe::pallet::Call), + #[codec(index = 2)] + Timestamp(runtime_types::pallet_timestamp::pallet::Call), + #[codec(index = 3)] + Indices(runtime_types::pallet_indices::pallet::Call), + #[codec(index = 4)] + Balances(runtime_types::pallet_balances::pallet::Call), + #[codec(index = 6)] + Staking(runtime_types::pallet_staking::pallet::pallet::Call), + #[codec(index = 8)] + Session(runtime_types::pallet_session::pallet::Call), + #[codec(index = 10)] + Grandpa(runtime_types::pallet_grandpa::pallet::Call), + #[codec(index = 11)] + ImOnline(runtime_types::pallet_im_online::pallet::Call), + #[codec(index = 16)] + Utility(runtime_types::pallet_utility::pallet::Call), + #[codec(index = 17)] + Identity(runtime_types::pallet_identity::pallet::Call), + #[codec(index = 18)] + Recovery(runtime_types::pallet_recovery::pallet::Call), + #[codec(index = 19)] + Vesting(runtime_types::pallet_vesting::pallet::Call), + #[codec(index = 20)] + Scheduler(runtime_types::pallet_scheduler::pallet::Call), + #[codec(index = 28)] + Preimage(runtime_types::pallet_preimage::pallet::Call), + #[codec(index = 21)] + Sudo(runtime_types::pallet_sudo::pallet::Call), + #[codec(index = 22)] + Proxy(runtime_types::pallet_proxy::pallet::Call), + #[codec(index = 23)] + Multisig(runtime_types::pallet_multisig::pallet::Call), + #[codec(index = 24)] + ElectionProviderMultiPhase( + runtime_types::pallet_election_provider_multi_phase::pallet::Call, + ), + #[codec(index = 25)] + VoterList(runtime_types::pallet_bags_list::pallet::Call), + #[codec(index = 29)] + NominationPools(runtime_types::pallet_nomination_pools::pallet::Call), + #[codec(index = 30)] + FastUnstake(runtime_types::pallet_fast_unstake::pallet::Call), + #[codec(index = 42)] + Configuration( + runtime_types::polkadot_runtime_parachains::configuration::pallet::Call, + ), + #[codec(index = 43)] + ParasShared(runtime_types::polkadot_runtime_parachains::shared::pallet::Call), + #[codec(index = 44)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Call), + #[codec(index = 45)] + ParaInherent( + runtime_types::polkadot_runtime_parachains::paras_inherent::pallet::Call, + ), + #[codec(index = 47)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Call), + #[codec(index = 48)] + Initializer(runtime_types::polkadot_runtime_parachains::initializer::pallet::Call), + #[codec(index = 51)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Call), + #[codec(index = 53)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Call), + #[codec(index = 54)] + ParasSlashing( + runtime_types::polkadot_runtime_parachains::disputes::slashing::pallet::Call, + ), + #[codec(index = 60)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Call), + #[codec(index = 61)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Call), + #[codec(index = 62)] + ParasSudoWrapper( + runtime_types::polkadot_runtime_common::paras_sudo_wrapper::pallet::Call, + ), + #[codec(index = 63)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Call), + #[codec(index = 64)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Call), + #[codec(index = 65)] + AssignedSlots(runtime_types::polkadot_runtime_common::assigned_slots::pallet::Call), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Call), + #[codec(index = 100)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Call), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum RuntimeEvent { + #[codec(index = 0)] + System(runtime_types::frame_system::pallet::Event), + #[codec(index = 3)] + Indices(runtime_types::pallet_indices::pallet::Event), + #[codec(index = 4)] + Balances(runtime_types::pallet_balances::pallet::Event), + #[codec(index = 26)] + TransactionPayment(runtime_types::pallet_transaction_payment::pallet::Event), + #[codec(index = 6)] + Staking(runtime_types::pallet_staking::pallet::pallet::Event), + #[codec(index = 7)] + Offences(runtime_types::pallet_offences::pallet::Event), + #[codec(index = 8)] + Session(runtime_types::pallet_session::pallet::Event), + #[codec(index = 10)] + Grandpa(runtime_types::pallet_grandpa::pallet::Event), + #[codec(index = 11)] + ImOnline(runtime_types::pallet_im_online::pallet::Event), + #[codec(index = 16)] + Utility(runtime_types::pallet_utility::pallet::Event), + #[codec(index = 17)] + Identity(runtime_types::pallet_identity::pallet::Event), + #[codec(index = 18)] + Recovery(runtime_types::pallet_recovery::pallet::Event), + #[codec(index = 19)] + Vesting(runtime_types::pallet_vesting::pallet::Event), + #[codec(index = 20)] + Scheduler(runtime_types::pallet_scheduler::pallet::Event), + #[codec(index = 28)] + Preimage(runtime_types::pallet_preimage::pallet::Event), + #[codec(index = 21)] + Sudo(runtime_types::pallet_sudo::pallet::Event), + #[codec(index = 22)] + Proxy(runtime_types::pallet_proxy::pallet::Event), + #[codec(index = 23)] + Multisig(runtime_types::pallet_multisig::pallet::Event), + #[codec(index = 24)] + ElectionProviderMultiPhase( + runtime_types::pallet_election_provider_multi_phase::pallet::Event, + ), + #[codec(index = 25)] + VoterList(runtime_types::pallet_bags_list::pallet::Event), + #[codec(index = 29)] + NominationPools(runtime_types::pallet_nomination_pools::pallet::Event), + #[codec(index = 30)] + FastUnstake(runtime_types::pallet_fast_unstake::pallet::Event), + #[codec(index = 44)] + ParaInclusion(runtime_types::polkadot_runtime_parachains::inclusion::pallet::Event), + #[codec(index = 47)] + Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Event), + #[codec(index = 51)] + Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Event), + #[codec(index = 53)] + ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Event), + #[codec(index = 60)] + Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Event), + #[codec(index = 61)] + Slots(runtime_types::polkadot_runtime_common::slots::pallet::Event), + #[codec(index = 63)] + Auctions(runtime_types::polkadot_runtime_common::auctions::pallet::Event), + #[codec(index = 64)] + Crowdloan(runtime_types::polkadot_runtime_common::crowdloan::pallet::Event), + #[codec(index = 65)] + AssignedSlots( + runtime_types::polkadot_runtime_common::assigned_slots::pallet::Event, + ), + #[codec(index = 99)] + XcmPallet(runtime_types::pallet_xcm::pallet::Event), + #[codec(index = 100)] + MessageQueue(runtime_types::pallet_message_queue::pallet::Event), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct SessionKeys { + pub grandpa: runtime_types::sp_consensus_grandpa::app::Public, + pub babe: runtime_types::sp_consensus_babe::app::Public, + pub im_online: runtime_types::pallet_im_online::sr25519::app_sr25519::Public, + pub para_validator: runtime_types::polkadot_primitives::v4::validator_app::Public, + pub para_assignment: runtime_types::polkadot_primitives::v4::assignment_app::Public, + pub authority_discovery: runtime_types::sp_authority_discovery::app::Public, + } + } + pub mod xcm { + use super::runtime_types; + pub mod double_encoded { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct DoubleEncoded { + pub encoded: ::std::vec::Vec<::core::primitive::u8>, + } + } + pub mod v2 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: runtime_types::xcm::v2::NetworkId, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: runtime_types::xcm::v2::NetworkId, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: runtime_types::xcm::v2::NetworkId, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v2::BodyId, + part: runtime_types::xcm::v2::BodyPart, + }, + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + #[codec(index = 6)] + Blob(::std::vec::Vec<::core::primitive::u8>), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v2::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v2::multiasset::AssetId, + pub fun: runtime_types::xcm::v2::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v2::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v2::multiasset::AssetId, + fun: runtime_types::xcm::v2::multiasset::WildFungibility, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v2::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + runtime_types::xcm::v2::junction::Junction, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v2::multilocation::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + MultiLocationFull, + #[codec(index = 5)] + MultiLocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + UnhandledXcmVersion, + #[codec(index = 23)] + WeightLimitReached(::core::primitive::u64), + #[codec(index = 24)] + Barrier, + #[codec(index = 25)] + WeightNotComputable, + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v2::Response, + #[codec(compact)] + max_weight: ::core::primitive::u64, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_type: runtime_types::xcm::v2::OriginKind, + #[codec(compact)] + require_weight_at_most: ::core::primitive::u64, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v2::multilocation::Junctions), + #[codec(index = 12)] + ReportError { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + beneficiary: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_assets: ::core::primitive::u32, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + receive: runtime_types::xcm::v2::multiasset::MultiAssets, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + xcm: runtime_types::xcm::v2::Xcm, + }, + #[codec(index = 18)] + QueryHolding { + #[codec(compact)] + query_id: ::core::primitive::u64, + dest: runtime_types::xcm::v2::multilocation::MultiLocation, + assets: runtime_types::xcm::v2::multiasset::MultiAssetFilter, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v2::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v2::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v2::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v2::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v2::multiasset::MultiAssets, + ticket: runtime_types::xcm::v2::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + #[codec(compact)] + max_response_weight: ::core::primitive::u64, + }, + #[codec(index = 27)] + UnsubscribeVersion, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + Any, + #[codec(index = 1)] + Named( + runtime_types::bounded_collections::weak_bounded_vec::WeakBoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum OriginKind { + #[codec(index = 0)] + Native, + #[codec(index = 1)] + SovereignAccount, + #[codec(index = 2)] + Superuser, + #[codec(index = 3)] + Xcm, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v2::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(#[codec(compact)] ::core::primitive::u64), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + pub mod v3 { + use super::runtime_types; + pub mod junction { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyId { + #[codec(index = 0)] + Unit, + #[codec(index = 1)] + Moniker([::core::primitive::u8; 4usize]), + #[codec(index = 2)] + Index(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + Executive, + #[codec(index = 4)] + Technical, + #[codec(index = 5)] + Legislative, + #[codec(index = 6)] + Judicial, + #[codec(index = 7)] + Defense, + #[codec(index = 8)] + Administration, + #[codec(index = 9)] + Treasury, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum BodyPart { + #[codec(index = 0)] + Voice, + #[codec(index = 1)] + Members { + #[codec(compact)] + count: ::core::primitive::u32, + }, + #[codec(index = 2)] + Fraction { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 3)] + AtLeastProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + #[codec(index = 4)] + MoreThanProportion { + #[codec(compact)] + nom: ::core::primitive::u32, + #[codec(compact)] + denom: ::core::primitive::u32, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junction { + #[codec(index = 0)] + Parachain(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 1)] + AccountId32 { + network: + ::core::option::Option, + id: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + AccountIndex64 { + network: + ::core::option::Option, + #[codec(compact)] + index: ::core::primitive::u64, + }, + #[codec(index = 3)] + AccountKey20 { + network: + ::core::option::Option, + key: [::core::primitive::u8; 20usize], + }, + #[codec(index = 4)] + PalletInstance(::core::primitive::u8), + #[codec(index = 5)] + GeneralIndex(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 6)] + GeneralKey { + length: ::core::primitive::u8, + data: [::core::primitive::u8; 32usize], + }, + #[codec(index = 7)] + OnlyChild, + #[codec(index = 8)] + Plurality { + id: runtime_types::xcm::v3::junction::BodyId, + part: runtime_types::xcm::v3::junction::BodyPart, + }, + #[codec(index = 9)] + GlobalConsensus(runtime_types::xcm::v3::junction::NetworkId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum NetworkId { + #[codec(index = 0)] + ByGenesis([::core::primitive::u8; 32usize]), + #[codec(index = 1)] + ByFork { + block_number: ::core::primitive::u64, + block_hash: [::core::primitive::u8; 32usize], + }, + #[codec(index = 2)] + Polkadot, + #[codec(index = 3)] + Kusama, + #[codec(index = 4)] + Westend, + #[codec(index = 5)] + Rococo, + #[codec(index = 6)] + Wococo, + #[codec(index = 7)] + Ethereum { + #[codec(compact)] + chain_id: ::core::primitive::u64, + }, + #[codec(index = 8)] + BitcoinCore, + #[codec(index = 9)] + BitcoinCash, + } + } + pub mod junctions { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Junctions { + #[codec(index = 0)] + Here, + #[codec(index = 1)] + X1(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 2)] + X2( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 3)] + X3( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 4)] + X4( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 5)] + X5( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 6)] + X6( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 7)] + X7( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + #[codec(index = 8)] + X8( + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + runtime_types::xcm::v3::junction::Junction, + ), + } + } + pub mod multiasset { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetId { + #[codec(index = 0)] + Concrete(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 1)] + Abstract([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum AssetInstance { + #[codec(index = 0)] + Undefined, + #[codec(index = 1)] + Index(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 2)] + Array4([::core::primitive::u8; 4usize]), + #[codec(index = 3)] + Array8([::core::primitive::u8; 8usize]), + #[codec(index = 4)] + Array16([::core::primitive::u8; 16usize]), + #[codec(index = 5)] + Array32([::core::primitive::u8; 32usize]), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Fungibility { + #[codec(index = 0)] + Fungible(#[codec(compact)] ::core::primitive::u128), + #[codec(index = 1)] + NonFungible(runtime_types::xcm::v3::multiasset::AssetInstance), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAsset { + pub id: runtime_types::xcm::v3::multiasset::AssetId, + pub fun: runtime_types::xcm::v3::multiasset::Fungibility, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MultiAssetFilter { + #[codec(index = 0)] + Definite(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + Wild(runtime_types::xcm::v3::multiasset::WildMultiAsset), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiAssets( + pub ::std::vec::Vec, + ); + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildFungibility { + #[codec(index = 0)] + Fungible, + #[codec(index = 1)] + NonFungible, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WildMultiAsset { + #[codec(index = 0)] + All, + #[codec(index = 1)] + AllOf { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + }, + #[codec(index = 2)] + AllCounted(#[codec(compact)] ::core::primitive::u32), + #[codec(index = 3)] + AllOfCounted { + id: runtime_types::xcm::v3::multiasset::AssetId, + fun: runtime_types::xcm::v3::multiasset::WildFungibility, + #[codec(compact)] + count: ::core::primitive::u32, + }, + } + } + pub mod multilocation { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct MultiLocation { + pub parents: ::core::primitive::u8, + pub interior: runtime_types::xcm::v3::junctions::Junctions, + } + } + pub mod traits { + use super::runtime_types; + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Error { + #[codec(index = 0)] + Overflow, + #[codec(index = 1)] + Unimplemented, + #[codec(index = 2)] + UntrustedReserveLocation, + #[codec(index = 3)] + UntrustedTeleportLocation, + #[codec(index = 4)] + LocationFull, + #[codec(index = 5)] + LocationNotInvertible, + #[codec(index = 6)] + BadOrigin, + #[codec(index = 7)] + InvalidLocation, + #[codec(index = 8)] + AssetNotFound, + #[codec(index = 9)] + FailedToTransactAsset, + #[codec(index = 10)] + NotWithdrawable, + #[codec(index = 11)] + LocationCannotHold, + #[codec(index = 12)] + ExceedsMaxMessageSize, + #[codec(index = 13)] + DestinationUnsupported, + #[codec(index = 14)] + Transport, + #[codec(index = 15)] + Unroutable, + #[codec(index = 16)] + UnknownClaim, + #[codec(index = 17)] + FailedToDecode, + #[codec(index = 18)] + MaxWeightInvalid, + #[codec(index = 19)] + NotHoldingFees, + #[codec(index = 20)] + TooExpensive, + #[codec(index = 21)] + Trap(::core::primitive::u64), + #[codec(index = 22)] + ExpectationFalse, + #[codec(index = 23)] + PalletNotFound, + #[codec(index = 24)] + NameMismatch, + #[codec(index = 25)] + VersionIncompatible, + #[codec(index = 26)] + HoldingWouldOverflow, + #[codec(index = 27)] + ExportError, + #[codec(index = 28)] + ReanchorFailed, + #[codec(index = 29)] + NoDeal, + #[codec(index = 30)] + FeesNotMet, + #[codec(index = 31)] + LockError, + #[codec(index = 32)] + NoPermission, + #[codec(index = 33)] + Unanchored, + #[codec(index = 34)] + NotDepositable, + #[codec(index = 35)] + UnhandledXcmVersion, + #[codec(index = 36)] + WeightLimitReached(::sp_weights::Weight), + #[codec(index = 37)] + Barrier, + #[codec(index = 38)] + WeightNotComputable, + #[codec(index = 39)] + ExceedsStackLimit, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Outcome { + #[codec(index = 0)] + Complete(::sp_weights::Weight), + #[codec(index = 1)] + Incomplete(::sp_weights::Weight, runtime_types::xcm::v3::traits::Error), + #[codec(index = 2)] + Error(runtime_types::xcm::v3::traits::Error), + } + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Instruction { + #[codec(index = 0)] + WithdrawAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 1)] + ReserveAssetDeposited(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ReceiveTeleportedAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 3)] + QueryResponse { + #[codec(compact)] + query_id: ::core::primitive::u64, + response: runtime_types::xcm::v3::Response, + max_weight: ::sp_weights::Weight, + querier: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + #[codec(index = 4)] + TransferAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 5)] + TransferReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 6)] + Transact { + origin_kind: runtime_types::xcm::v2::OriginKind, + require_weight_at_most: ::sp_weights::Weight, + call: runtime_types::xcm::double_encoded::DoubleEncoded, + }, + #[codec(index = 7)] + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + max_message_size: ::core::primitive::u32, + #[codec(compact)] + max_capacity: ::core::primitive::u32, + }, + #[codec(index = 8)] + HrmpChannelAccepted { + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 9)] + HrmpChannelClosing { + #[codec(compact)] + initiator: ::core::primitive::u32, + #[codec(compact)] + sender: ::core::primitive::u32, + #[codec(compact)] + recipient: ::core::primitive::u32, + }, + #[codec(index = 10)] + ClearOrigin, + #[codec(index = 11)] + DescendOrigin(runtime_types::xcm::v3::junctions::Junctions), + #[codec(index = 12)] + ReportError(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 13)] + DepositAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + beneficiary: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 14)] + DepositReserveAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 15)] + ExchangeAsset { + give: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + want: runtime_types::xcm::v3::multiasset::MultiAssets, + maximal: ::core::primitive::bool, + }, + #[codec(index = 16)] + InitiateReserveWithdraw { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + reserve: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 17)] + InitiateTeleport { + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + dest: runtime_types::xcm::v3::multilocation::MultiLocation, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 18)] + ReportHolding { + response_info: runtime_types::xcm::v3::QueryResponseInfo, + assets: runtime_types::xcm::v3::multiasset::MultiAssetFilter, + }, + #[codec(index = 19)] + BuyExecution { + fees: runtime_types::xcm::v3::multiasset::MultiAsset, + weight_limit: runtime_types::xcm::v3::WeightLimit, + }, + #[codec(index = 20)] + RefundSurplus, + #[codec(index = 21)] + SetErrorHandler(runtime_types::xcm::v3::Xcm), + #[codec(index = 22)] + SetAppendix(runtime_types::xcm::v3::Xcm), + #[codec(index = 23)] + ClearError, + #[codec(index = 24)] + ClaimAsset { + assets: runtime_types::xcm::v3::multiasset::MultiAssets, + ticket: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 25)] + Trap(#[codec(compact)] ::core::primitive::u64), + #[codec(index = 26)] + SubscribeVersion { + #[codec(compact)] + query_id: ::core::primitive::u64, + max_response_weight: ::sp_weights::Weight, + }, + #[codec(index = 27)] + UnsubscribeVersion, + #[codec(index = 28)] + BurnAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 29)] + ExpectAsset(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 30)] + ExpectOrigin( + ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + ), + #[codec(index = 31)] + ExpectError( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 32)] + ExpectTransactStatus(runtime_types::xcm::v3::MaybeErrorCode), + #[codec(index = 33)] + QueryPallet { + module_name: ::std::vec::Vec<::core::primitive::u8>, + response_info: runtime_types::xcm::v3::QueryResponseInfo, + }, + #[codec(index = 34)] + ExpectPallet { + #[codec(compact)] + index: ::core::primitive::u32, + name: ::std::vec::Vec<::core::primitive::u8>, + module_name: ::std::vec::Vec<::core::primitive::u8>, + #[codec(compact)] + crate_major: ::core::primitive::u32, + #[codec(compact)] + min_crate_minor: ::core::primitive::u32, + }, + #[codec(index = 35)] + ReportTransactStatus(runtime_types::xcm::v3::QueryResponseInfo), + #[codec(index = 36)] + ClearTransactStatus, + #[codec(index = 37)] + UniversalOrigin(runtime_types::xcm::v3::junction::Junction), + #[codec(index = 38)] + ExportMessage { + network: runtime_types::xcm::v3::junction::NetworkId, + destination: runtime_types::xcm::v3::junctions::Junctions, + xcm: runtime_types::xcm::v3::Xcm, + }, + #[codec(index = 39)] + LockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + unlocker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 40)] + UnlockAsset { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + target: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 41)] + NoteUnlockable { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + owner: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 42)] + RequestUnlock { + asset: runtime_types::xcm::v3::multiasset::MultiAsset, + locker: runtime_types::xcm::v3::multilocation::MultiLocation, + }, + #[codec(index = 43)] + SetFeesMode { jit_withdraw: ::core::primitive::bool }, + #[codec(index = 44)] + SetTopic([::core::primitive::u8; 32usize]), + #[codec(index = 45)] + ClearTopic, + #[codec(index = 46)] + AliasOrigin(runtime_types::xcm::v3::multilocation::MultiLocation), + #[codec(index = 47)] + UnpaidExecution { + weight_limit: runtime_types::xcm::v3::WeightLimit, + check_origin: ::core::option::Option< + runtime_types::xcm::v3::multilocation::MultiLocation, + >, + }, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum MaybeErrorCode { + #[codec(index = 0)] + Success, + #[codec(index = 1)] + Error( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + #[codec(index = 2)] + TruncatedError( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + ), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct PalletInfo { + #[codec(compact)] + pub index: ::core::primitive::u32, + pub name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + pub module_name: runtime_types::bounded_collections::bounded_vec::BoundedVec< + ::core::primitive::u8, + >, + #[codec(compact)] + pub major: ::core::primitive::u32, + #[codec(compact)] + pub minor: ::core::primitive::u32, + #[codec(compact)] + pub patch: ::core::primitive::u32, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct QueryResponseInfo { + pub destination: runtime_types::xcm::v3::multilocation::MultiLocation, + #[codec(compact)] + pub query_id: ::core::primitive::u64, + pub max_weight: ::sp_weights::Weight, + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum Response { + #[codec(index = 0)] + Null, + #[codec(index = 1)] + Assets(runtime_types::xcm::v3::multiasset::MultiAssets), + #[codec(index = 2)] + ExecutionResult( + ::core::option::Option<( + ::core::primitive::u32, + runtime_types::xcm::v3::traits::Error, + )>, + ), + #[codec(index = 3)] + Version(::core::primitive::u32), + #[codec(index = 4)] + PalletsInfo( + runtime_types::bounded_collections::bounded_vec::BoundedVec< + runtime_types::xcm::v3::PalletInfo, + >, + ), + #[codec(index = 5)] + DispatchResult(runtime_types::xcm::v3::MaybeErrorCode), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum WeightLimit { + #[codec(index = 0)] + Unlimited, + #[codec(index = 1)] + Limited(::sp_weights::Weight), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub struct Xcm(pub ::std::vec::Vec); + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedAssetId { + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::AssetId), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiAssets { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multiasset::MultiAssets), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multiasset::MultiAssets), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedMultiLocation { + #[codec(index = 1)] + V2(runtime_types::xcm::v2::multilocation::MultiLocation), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::multilocation::MultiLocation), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedResponse { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Response), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Response), + } + #[derive(:: codec :: Decode, :: codec :: Encode, Clone, Debug, PartialEq)] + pub enum VersionedXcm { + #[codec(index = 2)] + V2(runtime_types::xcm::v2::Xcm), + #[codec(index = 3)] + V3(runtime_types::xcm::v3::Xcm), + } + } + } +} diff --git a/relays/client-westend/src/lib.rs b/relays/client-westend/src/lib.rs new file mode 100644 index 000000000000..8cacffba9913 --- /dev/null +++ b/relays/client-westend/src/lib.rs @@ -0,0 +1,134 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types used to connect to the Westend chain. + +pub mod codegen_runtime; + +use bp_polkadot_core::SuffixedCommonSignedExtensionExt; +use bp_runtime::ChainId; +use bp_westend::WESTEND_SYNCED_HEADERS_GRANDPA_INFO_METHOD; +use codec::Encode; +use relay_substrate_client::{ + Chain, ChainWithBalances, ChainWithGrandpa, ChainWithTransactions, Error as SubstrateError, + RelayChain, SignParam, UnderlyingChainProvider, UnsignedTransaction, +}; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{generic::SignedPayload, traits::IdentifyAccount, MultiAddress}; +use sp_session::MembershipProof; +use std::time::Duration; + +pub use codegen_runtime::api::runtime_types; + +pub type RuntimeCall = runtime_types::westend_runtime::RuntimeCall; + +pub type GrandpaCall = runtime_types::pallet_grandpa::pallet::Call; + +/// Westend header id. +pub type HeaderId = relay_utils::HeaderId; + +/// Westend header type used in headers sync. +pub type SyncHeader = relay_substrate_client::SyncHeader; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Westend chain definition +#[derive(Debug, Clone, Copy)] +pub struct Westend; + +impl UnderlyingChainProvider for Westend { + type Chain = bp_westend::Westend; +} + +impl Chain for Westend { + const ID: ChainId = bp_runtime::WESTEND_CHAIN_ID; + const NAME: &'static str = "Westend"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = + bp_westend::BEST_FINALIZED_WESTEND_HEADER_METHOD; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_secs(6); + + type SignedBlock = bp_westend::SignedBlock; + type Call = RuntimeCall; +} + +impl ChainWithGrandpa for Westend { + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str = + WESTEND_SYNCED_HEADERS_GRANDPA_INFO_METHOD; + + type KeyOwnerProof = MembershipProof; +} + +impl RelayChain for Westend { + const PARAS_PALLET_NAME: &'static str = bp_westend::PARAS_PALLET_NAME; +} + +impl ChainWithBalances for Westend { + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey { + bp_westend::AccountInfoStorageMapKeyProvider::final_key(account_id) + } +} + +impl ChainWithTransactions for Westend { + type AccountKeyPair = sp_core::sr25519::Pair; + type SignedTransaction = + bp_polkadot_core::UncheckedExtrinsic; + + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result { + let raw_payload = SignedPayload::new( + unsigned.call, + bp_westend::SignedExtension::from_params( + param.spec_version, + param.transaction_version, + unsigned.era, + param.genesis_hash, + unsigned.nonce, + unsigned.tip, + ((), ()), + ), + )?; + + let signature = raw_payload.using_encoded(|payload| param.signer.sign(payload)); + let signer: sp_runtime::MultiSigner = param.signer.public().into(); + let (call, extra, _) = raw_payload.deconstruct(); + + Ok(Self::SignedTransaction::new_signed( + call, + signer.into_account().into(), + signature.into(), + extra, + )) + } + + fn is_signed(tx: &Self::SignedTransaction) -> bool { + tx.signature.is_some() + } + + fn is_signed_by(signer: &Self::AccountKeyPair, tx: &Self::SignedTransaction) -> bool { + tx.signature + .as_ref() + .map(|(address, _, _)| *address == Address::Id(signer.public().into())) + .unwrap_or(false) + } + + fn parse_transaction(tx: Self::SignedTransaction) -> Option> { + let extra = &tx.signature.as_ref()?.2; + Some(UnsignedTransaction::new(tx.function, extra.nonce()).tip(extra.tip())) + } +} diff --git a/relays/equivocation/Cargo.toml b/relays/equivocation/Cargo.toml new file mode 100644 index 000000000000..d14177bacec8 --- /dev/null +++ b/relays/equivocation/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "equivocation-detector" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +description = "Equivocation detector" + +[dependencies] +async-std = { version = "1.6.5", features = ["attributes"] } +async-trait = "0.1" +bp-header-chain = { path = "../../primitives/header-chain" } +finality-relay = { path = "../finality" } +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +futures = "0.3.29" +log = "0.4.20" +num-traits = "0.2" +relay-utils = { path = "../utils" } diff --git a/relays/equivocation/src/block_checker.rs b/relays/equivocation/src/block_checker.rs new file mode 100644 index 000000000000..c8131e5b9796 --- /dev/null +++ b/relays/equivocation/src/block_checker.rs @@ -0,0 +1,471 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + handle_client_error, reporter::EquivocationsReporter, EquivocationDetectionPipeline, + EquivocationReportingContext, HeaderFinalityInfo, SourceClient, TargetClient, +}; + +use bp_header_chain::{FinalityProof, FindEquivocations as FindEquivocationsT}; +use finality_relay::FinalityProofsBuf; +use futures::future::{BoxFuture, FutureExt}; +use num_traits::Saturating; + +/// First step in the block checking state machine. +/// +/// Getting the finality info associated to the source headers synced with the target chain +/// at the specified block. +#[cfg_attr(test, derive(Debug, PartialEq))] +pub struct ReadSyncedHeaders { + pub target_block_num: P::TargetNumber, +} + +impl ReadSyncedHeaders

{ + pub async fn next>( + self, + target_client: &mut TC, + ) -> Result, Self> { + match target_client.synced_headers_finality_info(self.target_block_num).await { + Ok(synced_headers) => + Ok(ReadContext { target_block_num: self.target_block_num, synced_headers }), + Err(e) => { + log::error!( + target: "bridge", + "Could not get {} headers synced to {} at block {}: {e:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + self.target_block_num + ); + + // Reconnect target client in case of a connection error. + handle_client_error(target_client, e).await; + + Err(self) + }, + } + } +} + +/// Second step in the block checking state machine. +/// +/// Reading the equivocation reporting context from the target chain. +#[cfg_attr(test, derive(Debug))] +pub struct ReadContext { + target_block_num: P::TargetNumber, + synced_headers: Vec>, +} + +impl ReadContext

{ + pub async fn next>( + self, + target_client: &mut TC, + ) -> Result>, Self> { + match EquivocationReportingContext::try_read_from_target::( + target_client, + self.target_block_num.saturating_sub(1.into()), + ) + .await + { + Ok(Some(context)) => Ok(Some(FindEquivocations { + target_block_num: self.target_block_num, + synced_headers: self.synced_headers, + context, + })), + Ok(None) => Ok(None), + Err(e) => { + log::error!( + target: "bridge", + "Could not read {} `EquivocationReportingContext` from {} at block {}: {e:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + self.target_block_num.saturating_sub(1.into()), + ); + + // Reconnect target client in case of a connection error. + handle_client_error(target_client, e).await; + + Err(self) + }, + } + } +} + +/// Third step in the block checking state machine. +/// +/// Searching for equivocations in the source headers synced with the target chain. +#[cfg_attr(test, derive(Debug))] +pub struct FindEquivocations { + target_block_num: P::TargetNumber, + synced_headers: Vec>, + context: EquivocationReportingContext

, +} + +impl FindEquivocations

{ + pub fn next( + mut self, + finality_proofs_buf: &mut FinalityProofsBuf

, + ) -> Vec> { + let mut result = vec![]; + for synced_header in self.synced_headers { + match P::EquivocationsFinder::find_equivocations( + &self.context.synced_verification_context, + &synced_header.finality_proof, + finality_proofs_buf.buf().as_slice(), + ) { + Ok(equivocations) => + if !equivocations.is_empty() { + result.push(ReportEquivocations { + source_block_hash: self.context.synced_header_hash, + equivocations, + }) + }, + Err(e) => { + log::error!( + target: "bridge", + "Could not search for equivocations in the finality proof \ + for source header {:?} synced at target block {}: {e:?}", + synced_header.finality_proof.target_header_hash(), + self.target_block_num + ); + }, + }; + + finality_proofs_buf.prune(synced_header.finality_proof.target_header_number(), None); + self.context.update(synced_header); + } + + result + } +} + +/// Fourth step in the block checking state machine. +/// +/// Reporting the detected equivocations (if any). +#[cfg_attr(test, derive(Debug))] +pub struct ReportEquivocations { + source_block_hash: P::Hash, + equivocations: Vec, +} + +impl ReportEquivocations

{ + pub async fn next>( + mut self, + source_client: &mut SC, + reporter: &mut EquivocationsReporter<'_, P, SC>, + ) -> Result<(), Self> { + let mut unprocessed_equivocations = vec![]; + for equivocation in self.equivocations { + match reporter + .submit_report(source_client, self.source_block_hash, equivocation.clone()) + .await + { + Ok(_) => {}, + Err(e) => { + log::error!( + target: "bridge", + "Could not submit equivocation report to {} for {equivocation:?}: {e:?}", + P::SOURCE_NAME, + ); + + // Mark the equivocation as unprocessed + unprocessed_equivocations.push(equivocation); + // Reconnect source client in case of a connection error. + handle_client_error(source_client, e).await; + }, + } + } + + self.equivocations = unprocessed_equivocations; + if !self.equivocations.is_empty() { + return Err(self) + } + + Ok(()) + } +} + +/// Block checking state machine. +#[cfg_attr(test, derive(Debug))] +pub enum BlockChecker { + ReadSyncedHeaders(ReadSyncedHeaders

), + ReadContext(ReadContext

), + ReportEquivocations(Vec>), +} + +impl BlockChecker

{ + pub fn new(target_block_num: P::TargetNumber) -> Self { + Self::ReadSyncedHeaders(ReadSyncedHeaders { target_block_num }) + } + + pub fn run<'a, SC: SourceClient

, TC: TargetClient

>( + self, + source_client: &'a mut SC, + target_client: &'a mut TC, + finality_proofs_buf: &'a mut FinalityProofsBuf

, + reporter: &'a mut EquivocationsReporter, + ) -> BoxFuture<'a, Result<(), Self>> { + async move { + match self { + Self::ReadSyncedHeaders(state) => { + let read_context = + state.next(target_client).await.map_err(Self::ReadSyncedHeaders)?; + Self::ReadContext(read_context) + .run(source_client, target_client, finality_proofs_buf, reporter) + .await + }, + Self::ReadContext(state) => { + let maybe_find_equivocations = + state.next(target_client).await.map_err(Self::ReadContext)?; + let find_equivocations = match maybe_find_equivocations { + Some(find_equivocations) => find_equivocations, + None => return Ok(()), + }; + Self::ReportEquivocations(find_equivocations.next(finality_proofs_buf)) + .run(source_client, target_client, finality_proofs_buf, reporter) + .await + }, + Self::ReportEquivocations(state) => { + let mut failures = vec![]; + for report_equivocations in state { + if let Err(failure) = + report_equivocations.next(source_client, reporter).await + { + failures.push(failure); + } + } + + if !failures.is_empty() { + return Err(Self::ReportEquivocations(failures)) + } + + Ok(()) + }, + } + } + .boxed() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use std::collections::HashMap; + + impl PartialEq for ReadContext { + fn eq(&self, other: &Self) -> bool { + self.target_block_num == other.target_block_num && + self.synced_headers == other.synced_headers + } + } + + impl PartialEq for FindEquivocations { + fn eq(&self, other: &Self) -> bool { + self.target_block_num == other.target_block_num && + self.synced_headers == other.synced_headers && + self.context == other.context + } + } + + impl PartialEq for ReportEquivocations { + fn eq(&self, other: &Self) -> bool { + self.source_block_hash == other.source_block_hash && + self.equivocations == other.equivocations + } + } + + impl PartialEq for BlockChecker { + fn eq(&self, _other: &Self) -> bool { + matches!(self, _other) + } + } + + #[async_std::test] + async fn block_checker_works() { + let mut source_client = TestSourceClient { ..Default::default() }; + let mut target_client = TestTargetClient { + best_synced_header_hash: HashMap::from([(9, Ok(Some(5)))]), + finality_verification_context: HashMap::from([( + 9, + Ok(TestFinalityVerificationContext { check_equivocations: true }), + )]), + synced_headers_finality_info: HashMap::from([( + 10, + Ok(vec![ + new_header_finality_info(6, None), + new_header_finality_info(7, Some(false)), + new_header_finality_info(8, None), + new_header_finality_info(9, Some(true)), + new_header_finality_info(10, None), + new_header_finality_info(11, None), + new_header_finality_info(12, None), + ]), + )]), + ..Default::default() + }; + let mut reporter = + EquivocationsReporter::::new(); + + let block_checker = BlockChecker::new(10); + assert!(block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![ + TestFinalityProof(6, vec!["6-1"]), + TestFinalityProof(7, vec![]), + TestFinalityProof(8, vec!["8-1"]), + TestFinalityProof(9, vec!["9-1"]), + TestFinalityProof(10, vec![]), + TestFinalityProof(11, vec!["11-1", "11-2"]), + TestFinalityProof(12, vec!["12-1"]) + ]), + &mut reporter + ) + .await + .is_ok()); + assert_eq!( + *source_client.reported_equivocations.lock().unwrap(), + HashMap::from([(5, vec!["6-1"]), (9, vec!["11-1", "11-2", "12-1"])]) + ); + } + + #[async_std::test] + async fn block_checker_works_with_empty_context() { + let mut target_client = TestTargetClient { + best_synced_header_hash: HashMap::from([(9, Ok(None))]), + finality_verification_context: HashMap::from([( + 9, + Ok(TestFinalityVerificationContext { check_equivocations: true }), + )]), + synced_headers_finality_info: HashMap::from([( + 10, + Ok(vec![new_header_finality_info(6, None)]), + )]), + ..Default::default() + }; + let mut source_client = TestSourceClient { ..Default::default() }; + let mut reporter = + EquivocationsReporter::::new(); + + let block_checker = BlockChecker::new(10); + assert!(block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![TestFinalityProof(6, vec!["6-1"])]), + &mut reporter + ) + .await + .is_ok()); + assert_eq!(*source_client.reported_equivocations.lock().unwrap(), HashMap::default()); + } + + #[async_std::test] + async fn read_synced_headers_handles_errors() { + let mut target_client = TestTargetClient { + synced_headers_finality_info: HashMap::from([ + (10, Err(TestClientError::NonConnection)), + (11, Err(TestClientError::Connection)), + ]), + ..Default::default() + }; + let mut source_client = TestSourceClient { ..Default::default() }; + let mut reporter = + EquivocationsReporter::::new(); + + // NonConnection error + let block_checker = BlockChecker::new(10); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadSyncedHeaders(ReadSyncedHeaders { target_block_num: 10 })) + ); + assert_eq!(target_client.num_reconnects, 0); + + // Connection error + let block_checker = BlockChecker::new(11); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadSyncedHeaders(ReadSyncedHeaders { target_block_num: 11 })) + ); + assert_eq!(target_client.num_reconnects, 1); + } + + #[async_std::test] + async fn read_context_handles_errors() { + let mut target_client = TestTargetClient { + synced_headers_finality_info: HashMap::from([(10, Ok(vec![])), (11, Ok(vec![]))]), + best_synced_header_hash: HashMap::from([ + (9, Err(TestClientError::NonConnection)), + (10, Err(TestClientError::Connection)), + ]), + ..Default::default() + }; + let mut source_client = TestSourceClient { ..Default::default() }; + let mut reporter = + EquivocationsReporter::::new(); + + // NonConnection error + let block_checker = BlockChecker::new(10); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadContext(ReadContext { + target_block_num: 10, + synced_headers: vec![] + })) + ); + assert_eq!(target_client.num_reconnects, 0); + + // Connection error + let block_checker = BlockChecker::new(11); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadContext(ReadContext { + target_block_num: 11, + synced_headers: vec![] + })) + ); + assert_eq!(target_client.num_reconnects, 1); + } +} diff --git a/relays/equivocation/src/equivocation_loop.rs b/relays/equivocation/src/equivocation_loop.rs new file mode 100644 index 000000000000..dfc4af0d4f62 --- /dev/null +++ b/relays/equivocation/src/equivocation_loop.rs @@ -0,0 +1,308 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + handle_client_error, reporter::EquivocationsReporter, EquivocationDetectionPipeline, + SourceClient, TargetClient, +}; + +use crate::block_checker::BlockChecker; +use finality_relay::{FinalityProofsBuf, FinalityProofsStream}; +use futures::{select_biased, FutureExt}; +use num_traits::Saturating; +use relay_utils::{metrics::MetricsParams, FailedClient}; +use std::{future::Future, time::Duration}; + +/// Equivocations detection loop state. +struct EquivocationDetectionLoop< + P: EquivocationDetectionPipeline, + SC: SourceClient

, + TC: TargetClient

, +> { + source_client: SC, + target_client: TC, + + from_block_num: Option, + until_block_num: Option, + + reporter: EquivocationsReporter<'static, P, SC>, + + finality_proofs_stream: FinalityProofsStream, + finality_proofs_buf: FinalityProofsBuf

, +} + +impl, TC: TargetClient

> + EquivocationDetectionLoop +{ + async fn ensure_finality_proofs_stream(&mut self) { + match self.finality_proofs_stream.ensure_stream(&self.source_client).await { + Ok(_) => {}, + Err(e) => { + log::error!( + target: "bridge", + "Could not connect to the {} `FinalityProofsStream`: {e:?}", + P::SOURCE_NAME, + ); + + // Reconnect to the source client if needed + handle_client_error(&mut self.source_client, e).await; + }, + } + } + + async fn best_finalized_target_block_number(&mut self) -> Option { + match self.target_client.best_finalized_header_number().await { + Ok(block_num) => Some(block_num), + Err(e) => { + log::error!( + target: "bridge", + "Could not read best finalized header number from {}: {e:?}", + P::TARGET_NAME, + ); + + // Reconnect target client and move on + handle_client_error(&mut self.target_client, e).await; + + None + }, + } + } + + async fn do_run(&mut self, tick: Duration, exit_signal: impl Future) { + let exit_signal = exit_signal.fuse(); + futures::pin_mut!(exit_signal); + + loop { + // Make sure that we are connected to the source finality proofs stream. + self.ensure_finality_proofs_stream().await; + // Check the status of the pending equivocation reports + self.reporter.process_pending_reports().await; + + // Update blocks range. + if let Some(block_number) = self.best_finalized_target_block_number().await { + self.from_block_num.get_or_insert(block_number); + self.until_block_num = Some(block_number); + } + let (from, until) = match (self.from_block_num, self.until_block_num) { + (Some(from), Some(until)) => (from, until), + _ => continue, + }; + + // Check the available blocks + let mut current_block_number = from; + while current_block_number <= until { + self.finality_proofs_buf.fill(&mut self.finality_proofs_stream); + let block_checker = BlockChecker::new(current_block_number); + let _ = block_checker + .run( + &mut self.source_client, + &mut self.target_client, + &mut self.finality_proofs_buf, + &mut self.reporter, + ) + .await; + current_block_number = current_block_number.saturating_add(1.into()); + } + self.from_block_num = Some(current_block_number); + + select_biased! { + _ = exit_signal => return, + _ = async_std::task::sleep(tick).fuse() => {}, + } + } + } + + pub async fn run( + source_client: SC, + target_client: TC, + tick: Duration, + exit_signal: impl Future, + ) -> Result<(), FailedClient> { + let mut equivocation_detection_loop = Self { + source_client, + target_client, + from_block_num: None, + until_block_num: None, + reporter: EquivocationsReporter::::new(), + finality_proofs_stream: FinalityProofsStream::new(), + finality_proofs_buf: FinalityProofsBuf::new(vec![]), + }; + + equivocation_detection_loop.do_run(tick, exit_signal).await; + Ok(()) + } +} + +/// Spawn the equivocations detection loop. +pub async fn run( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + tick: Duration, + metrics_params: MetricsParams, + exit_signal: impl Future + 'static + Send, +) -> Result<(), relay_utils::Error> { + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .with_metrics(metrics_params) + .expose() + .await? + .run( + format!("{}_to_{}_EquivocationDetection", P::SOURCE_NAME, P::TARGET_NAME), + move |source_client, target_client, _metrics| { + EquivocationDetectionLoop::run( + source_client, + target_client, + tick, + exit_signal.clone(), + ) + }, + ) + .await +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use futures::{channel::mpsc::UnboundedSender, StreamExt}; + use std::{ + collections::{HashMap, VecDeque}, + sync::{Arc, Mutex}, + }; + + fn best_finalized_header_number( + best_finalized_headers: &Mutex>>, + exit_sender: &UnboundedSender<()>, + ) -> Result { + let mut best_finalized_headers = best_finalized_headers.lock().unwrap(); + let result = best_finalized_headers.pop_front().unwrap(); + if best_finalized_headers.is_empty() { + exit_sender.unbounded_send(()).unwrap(); + } + result + } + + #[async_std::test] + async fn multiple_blocks_are_checked_correctly() { + let best_finalized_headers = Arc::new(Mutex::new(VecDeque::from([Ok(10), Ok(12), Ok(13)]))); + let (exit_sender, exit_receiver) = futures::channel::mpsc::unbounded(); + + let source_client = TestSourceClient { + finality_proofs: Arc::new(Mutex::new(vec![ + TestFinalityProof(2, vec!["2-1"]), + TestFinalityProof(3, vec!["3-1", "3-2"]), + TestFinalityProof(4, vec!["4-1"]), + TestFinalityProof(5, vec!["5-1"]), + TestFinalityProof(6, vec!["6-1", "6-2"]), + TestFinalityProof(7, vec!["7-1", "7-2"]), + ])), + ..Default::default() + }; + let reported_equivocations = source_client.reported_equivocations.clone(); + let target_client = TestTargetClient { + best_finalized_header_number: Arc::new(move || { + best_finalized_header_number(&best_finalized_headers, &exit_sender) + }), + best_synced_header_hash: HashMap::from([ + (9, Ok(Some(1))), + (10, Ok(Some(3))), + (11, Ok(Some(5))), + (12, Ok(Some(6))), + ]), + finality_verification_context: HashMap::from([ + (9, Ok(TestFinalityVerificationContext { check_equivocations: true })), + (10, Ok(TestFinalityVerificationContext { check_equivocations: true })), + (11, Ok(TestFinalityVerificationContext { check_equivocations: false })), + (12, Ok(TestFinalityVerificationContext { check_equivocations: true })), + ]), + synced_headers_finality_info: HashMap::from([ + ( + 10, + Ok(vec![new_header_finality_info(2, None), new_header_finality_info(3, None)]), + ), + ( + 11, + Ok(vec![ + new_header_finality_info(4, None), + new_header_finality_info(5, Some(false)), + ]), + ), + (12, Ok(vec![new_header_finality_info(6, None)])), + (13, Ok(vec![new_header_finality_info(7, None)])), + ]), + ..Default::default() + }; + + assert!(run::( + source_client, + target_client, + Duration::from_secs(0), + MetricsParams { address: None, registry: Default::default() }, + exit_receiver.into_future().map(|(_, _)| ()), + ) + .await + .is_ok()); + assert_eq!( + *reported_equivocations.lock().unwrap(), + HashMap::from([ + (1, vec!["2-1", "3-1", "3-2"]), + (3, vec!["4-1", "5-1"]), + (6, vec!["7-1", "7-2"]) + ]) + ); + } + + #[async_std::test] + async fn blocks_following_error_are_checked_correctly() { + let best_finalized_headers = Mutex::new(VecDeque::from([Ok(10), Ok(11)])); + let (exit_sender, exit_receiver) = futures::channel::mpsc::unbounded(); + + let source_client = TestSourceClient { + finality_proofs: Arc::new(Mutex::new(vec![ + TestFinalityProof(2, vec!["2-1"]), + TestFinalityProof(3, vec!["3-1"]), + ])), + ..Default::default() + }; + let reported_equivocations = source_client.reported_equivocations.clone(); + let target_client = TestTargetClient { + best_finalized_header_number: Arc::new(move || { + best_finalized_header_number(&best_finalized_headers, &exit_sender) + }), + best_synced_header_hash: HashMap::from([(9, Ok(Some(1))), (10, Ok(Some(2)))]), + finality_verification_context: HashMap::from([ + (9, Ok(TestFinalityVerificationContext { check_equivocations: true })), + (10, Ok(TestFinalityVerificationContext { check_equivocations: true })), + ]), + synced_headers_finality_info: HashMap::from([ + (10, Err(TestClientError::NonConnection)), + (11, Ok(vec![new_header_finality_info(3, None)])), + ]), + ..Default::default() + }; + + assert!(run::( + source_client, + target_client, + Duration::from_secs(0), + MetricsParams { address: None, registry: Default::default() }, + exit_receiver.into_future().map(|(_, _)| ()), + ) + .await + .is_ok()); + assert_eq!(*reported_equivocations.lock().unwrap(), HashMap::from([(2, vec!["3-1"]),])); + } +} diff --git a/relays/equivocation/src/lib.rs b/relays/equivocation/src/lib.rs new file mode 100644 index 000000000000..56a71ef3bc63 --- /dev/null +++ b/relays/equivocation/src/lib.rs @@ -0,0 +1,137 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +mod block_checker; +mod equivocation_loop; +mod mock; +mod reporter; + +use async_trait::async_trait; +use bp_header_chain::{FinalityProof, FindEquivocations}; +use finality_relay::{FinalityPipeline, SourceClientBase}; +use relay_utils::{relay_loop::Client as RelayClient, MaybeConnectionError, TransactionTracker}; +use std::{fmt::Debug, time::Duration}; + +pub use equivocation_loop::run; + +#[cfg(not(test))] +const RECONNECT_DELAY: Duration = relay_utils::relay_loop::RECONNECT_DELAY; +#[cfg(test)] +const RECONNECT_DELAY: Duration = mock::TEST_RECONNECT_DELAY; + +pub trait EquivocationDetectionPipeline: FinalityPipeline { + /// Block number of the target chain. + type TargetNumber: relay_utils::BlockNumberBase; + /// The context needed for validating finality proofs. + type FinalityVerificationContext: Debug + Send; + /// The type of the equivocation proof. + type EquivocationProof: Clone + Debug + Send + Sync; + /// The equivocations finder. + type EquivocationsFinder: FindEquivocations< + Self::FinalityProof, + Self::FinalityVerificationContext, + Self::EquivocationProof, + >; +} + +type HeaderFinalityInfo

= bp_header_chain::HeaderFinalityInfo< +

::FinalityProof, +

::FinalityVerificationContext, +>; + +/// Source client used in equivocation detection loop. +#[async_trait] +pub trait SourceClient: SourceClientBase

{ + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker; + + /// Report equivocation. + async fn report_equivocation( + &self, + at: P::Hash, + equivocation: P::EquivocationProof, + ) -> Result; +} + +/// Target client used in equivocation detection loop. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Get the best finalized header number. + async fn best_finalized_header_number(&self) -> Result; + + /// Get the hash of the best source header known by the target at the provided block number. + async fn best_synced_header_hash( + &self, + at: P::TargetNumber, + ) -> Result, Self::Error>; + + /// Get the data stored by the target at the specified block for validating source finality + /// proofs. + async fn finality_verification_context( + &self, + at: P::TargetNumber, + ) -> Result; + + /// Get the finality info associated to the source headers synced with the target chain at the + /// specified block. + async fn synced_headers_finality_info( + &self, + at: P::TargetNumber, + ) -> Result>, Self::Error>; +} + +/// The context needed for finding equivocations inside finality proofs and reporting them. +#[derive(Debug, PartialEq)] +struct EquivocationReportingContext { + pub synced_header_hash: P::Hash, + pub synced_verification_context: P::FinalityVerificationContext, +} + +impl EquivocationReportingContext

{ + /// Try to get the `EquivocationReportingContext` used by the target chain + /// at the provided block. + pub async fn try_read_from_target>( + target_client: &TC, + at: P::TargetNumber, + ) -> Result, TC::Error> { + let maybe_best_synced_header_hash = target_client.best_synced_header_hash(at).await?; + Ok(match maybe_best_synced_header_hash { + Some(best_synced_header_hash) => Some(EquivocationReportingContext { + synced_header_hash: best_synced_header_hash, + synced_verification_context: target_client + .finality_verification_context(at) + .await?, + }), + None => None, + }) + } + + /// Update with the new context introduced by the `HeaderFinalityInfo

` if any. + pub fn update(&mut self, info: HeaderFinalityInfo

) { + if let Some(new_verification_context) = info.new_verification_context { + self.synced_header_hash = info.finality_proof.target_header_hash(); + self.synced_verification_context = new_verification_context; + } + } +} + +async fn handle_client_error(client: &mut C, e: C::Error) { + if e.is_connection_error() { + client.reconnect_until_success(RECONNECT_DELAY).await; + } else { + async_std::task::sleep(RECONNECT_DELAY).await; + } +} diff --git a/relays/equivocation/src/mock.rs b/relays/equivocation/src/mock.rs new file mode 100644 index 000000000000..ced5c6f35806 --- /dev/null +++ b/relays/equivocation/src/mock.rs @@ -0,0 +1,285 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg(test)] + +use crate::{EquivocationDetectionPipeline, HeaderFinalityInfo, SourceClient, TargetClient}; +use async_trait::async_trait; +use bp_header_chain::{FinalityProof, FindEquivocations}; +use finality_relay::{FinalityPipeline, SourceClientBase}; +use futures::{Stream, StreamExt}; +use relay_utils::{ + relay_loop::Client as RelayClient, HeaderId, MaybeConnectionError, TrackedTransactionStatus, + TransactionTracker, +}; +use std::{ + collections::HashMap, + pin::Pin, + sync::{Arc, Mutex}, + time::Duration, +}; + +pub type TestSourceHashAndNumber = u64; +pub type TestTargetNumber = u64; +pub type TestEquivocationProof = &'static str; + +pub const TEST_RECONNECT_DELAY: Duration = Duration::from_secs(0); + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestFinalityProof(pub TestSourceHashAndNumber, pub Vec); + +impl FinalityProof for TestFinalityProof { + fn target_header_hash(&self) -> TestSourceHashAndNumber { + self.0 + } + + fn target_header_number(&self) -> TestSourceHashAndNumber { + self.0 + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct TestEquivocationDetectionPipeline; + +impl FinalityPipeline for TestEquivocationDetectionPipeline { + const SOURCE_NAME: &'static str = "TestSource"; + const TARGET_NAME: &'static str = "TestTarget"; + + type Hash = TestSourceHashAndNumber; + type Number = TestSourceHashAndNumber; + type FinalityProof = TestFinalityProof; +} + +#[derive(Clone, Debug, PartialEq)] +pub struct TestFinalityVerificationContext { + pub check_equivocations: bool, +} + +pub struct TestEquivocationsFinder; + +impl FindEquivocations + for TestEquivocationsFinder +{ + type Error = (); + + fn find_equivocations( + verification_context: &TestFinalityVerificationContext, + synced_proof: &TestFinalityProof, + source_proofs: &[TestFinalityProof], + ) -> Result, Self::Error> { + if verification_context.check_equivocations { + // Get the equivocations from the source proofs, in order to make sure + // that they are correctly provided. + if let Some(proof) = source_proofs.iter().find(|proof| proof.0 == synced_proof.0) { + return Ok(proof.1.clone()) + } + } + + Ok(vec![]) + } +} + +impl EquivocationDetectionPipeline for TestEquivocationDetectionPipeline { + type TargetNumber = TestTargetNumber; + type FinalityVerificationContext = TestFinalityVerificationContext; + type EquivocationProof = TestEquivocationProof; + type EquivocationsFinder = TestEquivocationsFinder; +} + +#[derive(Debug, Clone)] +pub enum TestClientError { + Connection, + NonConnection, +} + +impl MaybeConnectionError for TestClientError { + fn is_connection_error(&self) -> bool { + match self { + TestClientError::Connection => true, + TestClientError::NonConnection => false, + } + } +} + +#[derive(Clone)] +pub struct TestSourceClient { + pub num_reconnects: u32, + pub finality_proofs: Arc>>, + pub reported_equivocations: + Arc>>>, +} + +impl Default for TestSourceClient { + fn default() -> Self { + Self { + num_reconnects: 0, + finality_proofs: Arc::new(Mutex::new(vec![])), + reported_equivocations: Arc::new(Mutex::new(Default::default())), + } + } +} + +#[async_trait] +impl RelayClient for TestSourceClient { + type Error = TestClientError; + + async fn reconnect(&mut self) -> Result<(), Self::Error> { + self.num_reconnects += 1; + + Ok(()) + } +} + +#[async_trait] +impl SourceClientBase for TestSourceClient { + type FinalityProofsStream = Pin + 'static + Send>>; + + async fn finality_proofs(&self) -> Result { + let finality_proofs = std::mem::take(&mut *self.finality_proofs.lock().unwrap()); + Ok(futures::stream::iter(finality_proofs).boxed()) + } +} + +#[derive(Clone, Debug)] +pub struct TestTransactionTracker( + pub TrackedTransactionStatus>, +); + +impl Default for TestTransactionTracker { + fn default() -> TestTransactionTracker { + TestTransactionTracker(TrackedTransactionStatus::Finalized(Default::default())) + } +} + +#[async_trait] +impl TransactionTracker for TestTransactionTracker { + type HeaderId = HeaderId; + + async fn wait( + self, + ) -> TrackedTransactionStatus> { + self.0 + } +} + +#[async_trait] +impl SourceClient for TestSourceClient { + type TransactionTracker = TestTransactionTracker; + + async fn report_equivocation( + &self, + at: TestSourceHashAndNumber, + equivocation: TestEquivocationProof, + ) -> Result { + self.reported_equivocations + .lock() + .unwrap() + .entry(at) + .or_default() + .push(equivocation); + + Ok(TestTransactionTracker::default()) + } +} + +#[derive(Clone)] +pub struct TestTargetClient { + pub num_reconnects: u32, + pub best_finalized_header_number: + Arc Result + Send + Sync>, + pub best_synced_header_hash: + HashMap, TestClientError>>, + pub finality_verification_context: + HashMap>, + pub synced_headers_finality_info: HashMap< + TestTargetNumber, + Result>, TestClientError>, + >, +} + +impl Default for TestTargetClient { + fn default() -> Self { + Self { + num_reconnects: 0, + best_finalized_header_number: Arc::new(|| Ok(0)), + best_synced_header_hash: Default::default(), + finality_verification_context: Default::default(), + synced_headers_finality_info: Default::default(), + } + } +} + +#[async_trait] +impl RelayClient for TestTargetClient { + type Error = TestClientError; + + async fn reconnect(&mut self) -> Result<(), Self::Error> { + self.num_reconnects += 1; + + Ok(()) + } +} + +#[async_trait] +impl TargetClient for TestTargetClient { + async fn best_finalized_header_number(&self) -> Result { + (self.best_finalized_header_number)() + } + + async fn best_synced_header_hash( + &self, + at: TestTargetNumber, + ) -> Result, Self::Error> { + self.best_synced_header_hash + .get(&at) + .unwrap_or(&Err(TestClientError::NonConnection)) + .clone() + } + + async fn finality_verification_context( + &self, + at: TestTargetNumber, + ) -> Result { + self.finality_verification_context + .get(&at) + .unwrap_or(&Err(TestClientError::NonConnection)) + .clone() + } + + async fn synced_headers_finality_info( + &self, + at: TestTargetNumber, + ) -> Result>, Self::Error> { + self.synced_headers_finality_info + .get(&at) + .unwrap_or(&Err(TestClientError::NonConnection)) + .clone() + } +} + +pub fn new_header_finality_info( + source_hdr: TestSourceHashAndNumber, + check_following_equivocations: Option, +) -> HeaderFinalityInfo { + HeaderFinalityInfo:: { + finality_proof: TestFinalityProof(source_hdr, vec![]), + new_verification_context: check_following_equivocations.map( + |check_following_equivocations| TestFinalityVerificationContext { + check_equivocations: check_following_equivocations, + }, + ), + } +} diff --git a/relays/equivocation/src/reporter.rs b/relays/equivocation/src/reporter.rs new file mode 100644 index 000000000000..9c4642383d16 --- /dev/null +++ b/relays/equivocation/src/reporter.rs @@ -0,0 +1,129 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Helper struct used for submitting finality reports and tracking their status. + +use crate::{EquivocationDetectionPipeline, SourceClient}; + +use futures::FutureExt; +use relay_utils::{TrackedTransactionFuture, TrackedTransactionStatus, TransactionTracker}; +use std::{ + future::poll_fn, + task::{Context, Poll}, +}; + +pub struct EquivocationsReporter<'a, P: EquivocationDetectionPipeline, SC: SourceClient

> { + pending_reports: Vec>, +} + +impl<'a, P: EquivocationDetectionPipeline, SC: SourceClient

> EquivocationsReporter<'a, P, SC> { + pub fn new() -> Self { + Self { pending_reports: vec![] } + } + + /// Submit a `report_equivocation()` transaction to the source chain. + /// + /// We store the transaction tracker for future monitoring. + pub async fn submit_report( + &mut self, + source_client: &SC, + at: P::Hash, + equivocation: P::EquivocationProof, + ) -> Result<(), SC::Error> { + let pending_report = source_client.report_equivocation(at, equivocation).await?; + self.pending_reports.push(pending_report.wait()); + + Ok(()) + } + + fn do_process_pending_reports(&mut self, cx: &mut Context<'_>) -> Poll<()> { + self.pending_reports.retain_mut(|pending_report| { + match pending_report.poll_unpin(cx) { + Poll::Ready(tx_status) => { + match tx_status { + TrackedTransactionStatus::Lost => { + log::error!(target: "bridge", "Equivocation report tx was lost"); + }, + TrackedTransactionStatus::Finalized(id) => { + log::error!(target: "bridge", "Equivocation report tx was finalized in source block {id:?}"); + }, + } + + // The future was processed. Drop it. + false + }, + Poll::Pending => { + // The future is still pending. Retain it. + true + }, + } + }); + + Poll::Ready(()) + } + + /// Iterate through all the pending `report_equivocation()` transactions + /// and log the ones that finished. + pub async fn process_pending_reports(&mut self) { + poll_fn(|cx| self.do_process_pending_reports(cx)).await + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use relay_utils::HeaderId; + use std::sync::Mutex; + + #[async_std::test] + async fn process_pending_reports_works() { + let polled_reports = Mutex::new(vec![]); + let finished_reports = Mutex::new(vec![]); + + let mut reporter = + EquivocationsReporter:: { + pending_reports: vec![ + Box::pin(async { + polled_reports.lock().unwrap().push(1); + finished_reports.lock().unwrap().push(1); + TrackedTransactionStatus::Finalized(HeaderId(1, 1)) + }), + Box::pin(async { + polled_reports.lock().unwrap().push(2); + finished_reports.lock().unwrap().push(2); + TrackedTransactionStatus::Finalized(HeaderId(2, 2)) + }), + Box::pin(async { + polled_reports.lock().unwrap().push(3); + std::future::pending::<()>().await; + finished_reports.lock().unwrap().push(3); + TrackedTransactionStatus::Finalized(HeaderId(3, 3)) + }), + Box::pin(async { + polled_reports.lock().unwrap().push(4); + finished_reports.lock().unwrap().push(4); + TrackedTransactionStatus::Finalized(HeaderId(4, 4)) + }), + ], + }; + + reporter.process_pending_reports().await; + assert_eq!(*polled_reports.lock().unwrap(), vec![1, 2, 3, 4]); + assert_eq!(*finished_reports.lock().unwrap(), vec![1, 2, 4]); + assert_eq!(reporter.pending_reports.len(), 1); + } +} diff --git a/relays/finality/Cargo.toml b/relays/finality/Cargo.toml new file mode 100644 index 000000000000..725ac5386b1b --- /dev/null +++ b/relays/finality/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "finality-relay" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +description = "Finality proofs relay" + +[dependencies] +async-std = "1.6.5" +async-trait = "0.1" +backoff = "0.4" +bp-header-chain = { path = "../../primitives/header-chain" } +futures = "0.3.29" +log = "0.4.20" +num-traits = "0.2" +relay-utils = { path = "../utils" } + +[dev-dependencies] +parking_lot = "0.12.1" diff --git a/relays/finality/README.md b/relays/finality/README.md new file mode 100644 index 000000000000..0a8d6a4c8b12 --- /dev/null +++ b/relays/finality/README.md @@ -0,0 +1,58 @@ +# GRANDPA Finality Relay + +The finality relay is able to work with different finality engines. In the modern Substrate world they are GRANDPA +and BEEFY. Let's talk about GRANDPA here, because BEEFY relay and bridge BEEFY pallet are in development. + +In general, the relay works as follows: it connects to the source and target chain. The source chain must have the +[GRANDPA gadget](https://github.com/paritytech/finality-grandpa) running (so it can't be a parachain). The target +chain must have the [bridge GRANDPA pallet](../../modules/grandpa/) deployed at its runtime. The relay subscribes +to the GRANDPA finality notifications at the source chain and when the new justification is received, it is submitted +to the pallet at the target chain. + +Apart from that, the relay is watching for every source header that is missing at target. If it finds the missing +mandatory header (header that is changing the current GRANDPA validators set), it submits the justification for +this header. The case when the source node can't return the mandatory justification is considered a fatal error, +because the pallet can't proceed without it. + +More: [GRANDPA Finality Relay Sequence Diagram](../../docs/grandpa-finality-relay.html). + +## How to Use the Finality Relay + +The most important trait is the [`FinalitySyncPipeline`](./src/lib.rs), which defines the basic primitives of the +source chain (like block hash and number) and the type of finality proof (GRANDPA justification or MMR proof). Once +that is defined, there are two other traits - [`SourceClient`](./src/finality_loop.rs) and +[`TargetClient`](./src/finality_loop.rs). + +The `SourceClient` represents the Substrate node client that connects to the source chain. The client needs to +be able to return the best finalized header number, finalized header and its finality proof and the stream of +finality proofs. + +The `TargetClient` implementation must be able to craft finality delivery transaction and submit it to the target +node. The transaction is then tracked by the relay until it is mined and finalized. + +The main entrypoint for the crate is the [`run` function](./src/finality_loop.rs), which takes source and target +clients and [`FinalitySyncParams`](./src/finality_loop.rs) parameters. The most important parameter is the +`only_mandatory_headers` - it is set to `true`, the relay will only submit mandatory headers. Since transactions +with mandatory headers are fee-free, the cost of running such relay is zero (in terms of fees). + +## Finality Relay Metrics + +Finality relay provides several metrics. Metrics names depend on names of source and target chains. The list below +shows metrics names for Rococo (source chain) to BridgeHubWestend (target chain) finality relay. For other +chains, simply change chain names. So the metrics are: + +- `Rococo_to_BridgeHubWestend_Sync_best_source_block_number` - returns best finalized source chain (Rococo) block number, known + to the relay. If relay is running in [on-demand mode](../bin-substrate/src/cli/relay_headers_and_messages/), the + number may not match (it may be far behind) the actual best finalized number; + +- `Rococo_to_BridgeHubWestend_Sync_best_source_at_target_block_number` - returns best finalized source chain (Rococo) block + number that is known to the bridge GRANDPA pallet at the target chain. + +- `Rococo_to_BridgeHubWestend_Sync_is_source_and_source_at_target_using_different_forks` - if this metrics is set to `1`, then + the best source chain header, known to the target chain doesn't match the same-number-header at the source chain. + It means that the GRANDPA validators set has crafted the duplicate justification and it has been submitted to the + target chain. Normally (if majority of validators are honest and if you're running finality relay without large + breaks) this shall not happen and the metric will have `0` value. + +If relay operates properly, you should see that the `Rococo_to_BridgeHubWestend_Sync_best_source_at_target_block_number` +tries to reach the `Rococo_to_BridgeHubWestend_Sync_best_source_block_number`. And the latter one always increases. diff --git a/relays/finality/src/base.rs b/relays/finality/src/base.rs new file mode 100644 index 000000000000..4253468eaace --- /dev/null +++ b/relays/finality/src/base.rs @@ -0,0 +1,51 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use async_trait::async_trait; +use bp_header_chain::FinalityProof; +use futures::Stream; +use relay_utils::relay_loop::Client as RelayClient; +use std::fmt::Debug; + +/// Base finality pipeline. +pub trait FinalityPipeline: 'static + Clone + Debug + Send + Sync { + /// Name of the finality proofs source. + const SOURCE_NAME: &'static str; + /// Name of the finality proofs target. + const TARGET_NAME: &'static str; + + /// Synced headers are identified by this hash. + type Hash: Eq + Clone + Copy + Send + Sync + Debug; + /// Synced headers are identified by this number. + type Number: relay_utils::BlockNumberBase; + /// Finality proof type. + type FinalityProof: FinalityProof; +} + +/// Source client used in finality related loops. +#[async_trait] +pub trait SourceClientBase: RelayClient { + /// Stream of new finality proofs. The stream is allowed to miss proofs for some + /// headers, even if those headers are mandatory. + type FinalityProofsStream: Stream + Send + Unpin; + + /// Subscribe to new finality proofs. + async fn finality_proofs(&self) -> Result; +} + +/// Target client used in finality related loops. +#[async_trait] +pub trait TargetClientBase: RelayClient {} diff --git a/relays/finality/src/finality_loop.rs b/relays/finality/src/finality_loop.rs new file mode 100644 index 000000000000..e31d8a708122 --- /dev/null +++ b/relays/finality/src/finality_loop.rs @@ -0,0 +1,698 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! The loop basically reads all missing headers and their finality proofs from the source client. +//! The proof for the best possible header is then submitted to the target node. The only exception +//! is the mandatory headers, which we always submit to the target node. For such headers, we +//! assume that the persistent proof either exists, or will eventually become available. + +use crate::{sync_loop_metrics::SyncLoopMetrics, Error, FinalitySyncPipeline, SourceHeader}; + +use crate::{ + base::SourceClientBase, + finality_proofs::{FinalityProofsBuf, FinalityProofsStream}, + headers::{JustifiedHeader, JustifiedHeaderSelector}, +}; +use async_trait::async_trait; +use backoff::{backoff::Backoff, ExponentialBackoff}; +use futures::{future::Fuse, select, Future, FutureExt}; +use num_traits::Saturating; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, retry_backoff, FailedClient, + HeaderId, MaybeConnectionError, TrackedTransactionStatus, TransactionTracker, +}; +use std::{ + fmt::Debug, + time::{Duration, Instant}, +}; + +/// Finality proof synchronization loop parameters. +#[derive(Debug, Clone)] +pub struct FinalitySyncParams { + /// Interval at which we check updates on both clients. Normally should be larger than + /// `min(source_block_time, target_block_time)`. + /// + /// This parameter may be used to limit transactions rate. Increase the value && you'll get + /// infrequent updates => sparse headers => potential slow down of bridge applications, but + /// pallet storage won't be super large. Decrease the value to near `source_block_time` and + /// you'll get transaction for (almost) every block of the source chain => all source headers + /// will be known to the target chain => bridge applications will run faster, but pallet + /// storage may explode (but if pruning is there, then it's fine). + pub tick: Duration, + /// Number of finality proofs to keep in internal buffer between loop iterations. + /// + /// While in "major syncing" state, we still read finality proofs from the stream. They're + /// stored in the internal buffer between loop iterations. When we're close to the tip of the + /// chain, we may meet finality delays if headers are not finalized frequently. So instead of + /// waiting for next finality proof to appear in the stream, we may use existing proof from + /// that buffer. + pub recent_finality_proofs_limit: usize, + /// Timeout before we treat our transactions as lost and restart the whole sync process. + pub stall_timeout: Duration, + /// If true, only mandatory headers are relayed. + pub only_mandatory_headers: bool, +} + +/// Source client used in finality synchronization loop. +#[async_trait] +pub trait SourceClient: SourceClientBase

{ + /// Get best finalized block number. + async fn best_finalized_block_number(&self) -> Result; + + /// Get canonical header and its finality proof by number. + async fn header_and_finality_proof( + &self, + number: P::Number, + ) -> Result<(P::Header, Option), Self::Error>; +} + +/// Target client used in finality synchronization loop. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker; + + /// Get best finalized source block number. + async fn best_finalized_source_block_id( + &self, + ) -> Result, Self::Error>; + + /// Submit header finality proof. + async fn submit_finality_proof( + &self, + header: P::Header, + proof: P::FinalityProof, + ) -> Result; +} + +/// Return prefix that will be used by default to expose Prometheus metrics of the finality proofs +/// sync loop. +pub fn metrics_prefix() -> String { + format!("{}_to_{}_Sync", P::SOURCE_NAME, P::TARGET_NAME) +} + +pub struct SyncInfo { + pub best_number_at_source: P::Number, + pub best_number_at_target: P::Number, + pub is_using_same_fork: bool, +} + +impl SyncInfo

{ + /// Checks if both clients are on the same fork. + async fn is_on_same_fork>( + source_client: &SC, + id_at_target: &HeaderId, + ) -> Result { + let header_at_source = source_client.header_and_finality_proof(id_at_target.0).await?.0; + let header_hash_at_source = header_at_source.hash(); + Ok(if id_at_target.1 == header_hash_at_source { + true + } else { + log::error!( + target: "bridge", + "Source node ({}) and pallet at target node ({}) have different headers at the same height {:?}: \ + at-source {:?} vs at-target {:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + id_at_target.0, + header_hash_at_source, + id_at_target.1, + ); + + false + }) + } + + async fn new, TC: TargetClient

>( + source_client: &SC, + target_client: &TC, + ) -> Result> { + let best_number_at_source = + source_client.best_finalized_block_number().await.map_err(Error::Source)?; + let best_id_at_target = + target_client.best_finalized_source_block_id().await.map_err(Error::Target)?; + let best_number_at_target = best_id_at_target.0; + + let is_using_same_fork = Self::is_on_same_fork(source_client, &best_id_at_target) + .await + .map_err(Error::Source)?; + + Ok(Self { best_number_at_source, best_number_at_target, is_using_same_fork }) + } + + fn update_metrics(&self, metrics_sync: &Option) { + if let Some(metrics_sync) = metrics_sync { + metrics_sync.update_best_block_at_source(self.best_number_at_source); + metrics_sync.update_best_block_at_target(self.best_number_at_target); + metrics_sync.update_using_same_fork(self.is_using_same_fork); + } + } + + pub fn num_headers(&self) -> P::Number { + self.best_number_at_source.saturating_sub(self.best_number_at_target) + } +} + +/// Information about transaction that we have submitted. +#[derive(Debug, Clone)] +pub struct Transaction { + /// Submitted transaction tracker. + tracker: Tracker, + /// The number of the header we have submitted. + header_number: Number, +} + +impl Transaction { + pub async fn submit< + P: FinalitySyncPipeline, + TC: TargetClient, + >( + target_client: &TC, + header: P::Header, + justification: P::FinalityProof, + ) -> Result { + let header_number = header.number(); + log::debug!( + target: "bridge", + "Going to submit finality proof of {} header #{:?} to {}", + P::SOURCE_NAME, + header_number, + P::TARGET_NAME, + ); + + let tracker = target_client.submit_finality_proof(header, justification).await?; + Ok(Transaction { tracker, header_number }) + } + + async fn track< + P: FinalitySyncPipeline, + SC: SourceClient

, + TC: TargetClient

, + >( + self, + target_client: TC, + ) -> Result<(), Error> { + match self.tracker.wait().await { + TrackedTransactionStatus::Finalized(_) => { + // The transaction has been finalized, but it may have been finalized in the + // "failed" state. So let's check if the block number was actually updated. + target_client + .best_finalized_source_block_id() + .await + .map_err(Error::Target) + .and_then(|best_id_at_target| { + if self.header_number > best_id_at_target.0 { + return Err(Error::ProofSubmissionTxFailed { + submitted_number: self.header_number, + best_number_at_target: best_id_at_target.0, + }) + } + Ok(()) + }) + }, + TrackedTransactionStatus::Lost => Err(Error::ProofSubmissionTxLost), + } + } +} + +/// Finality synchronization loop state. +struct FinalityLoop, TC: TargetClient

> { + source_client: SC, + target_client: TC, + + sync_params: FinalitySyncParams, + metrics_sync: Option, + + progress: (Instant, Option), + retry_backoff: ExponentialBackoff, + finality_proofs_stream: FinalityProofsStream, + finality_proofs_buf: FinalityProofsBuf

, + best_submitted_number: Option, +} + +impl, TC: TargetClient

> FinalityLoop { + pub fn new( + source_client: SC, + target_client: TC, + sync_params: FinalitySyncParams, + metrics_sync: Option, + ) -> Self { + Self { + source_client, + target_client, + sync_params, + metrics_sync, + progress: (Instant::now(), None), + retry_backoff: retry_backoff(), + finality_proofs_stream: FinalityProofsStream::new(), + finality_proofs_buf: FinalityProofsBuf::new(vec![]), + best_submitted_number: None, + } + } + + fn update_progress(&mut self, info: &SyncInfo

) { + let (prev_time, prev_best_number_at_target) = self.progress; + let now = Instant::now(); + + let needs_update = now - prev_time > Duration::from_secs(10) || + prev_best_number_at_target + .map(|prev_best_number_at_target| { + info.best_number_at_target.saturating_sub(prev_best_number_at_target) > + 10.into() + }) + .unwrap_or(true); + + if !needs_update { + return + } + + log::info!( + target: "bridge", + "Synced {:?} of {:?} headers", + info.best_number_at_target, + info.best_number_at_source, + ); + + self.progress = (now, Some(info.best_number_at_target)) + } + + pub async fn select_header_to_submit( + &mut self, + info: &SyncInfo

, + ) -> Result>, Error> { + // to see that the loop is progressing + log::trace!( + target: "bridge", + "Considering range of headers ({}; {}]", + info.best_number_at_target, + info.best_number_at_source + ); + + // read missing headers + let selector = JustifiedHeaderSelector::new::(&self.source_client, info).await?; + // if we see that the header schedules GRANDPA change, we need to submit it + if self.sync_params.only_mandatory_headers { + return Ok(selector.select_mandatory()) + } + + // all headers that are missing from the target client are non-mandatory + // => even if we have already selected some header and its persistent finality proof, + // we may try to select better header by reading non-persistent proofs from the stream + self.finality_proofs_buf.fill(&mut self.finality_proofs_stream); + let maybe_justified_header = selector.select(&self.finality_proofs_buf); + + // remove obsolete 'recent' finality proofs + keep its size under certain limit + let oldest_finality_proof_to_keep = maybe_justified_header + .as_ref() + .map(|justified_header| justified_header.number()) + .unwrap_or(info.best_number_at_target); + self.finality_proofs_buf.prune( + oldest_finality_proof_to_keep, + Some(self.sync_params.recent_finality_proofs_limit), + ); + + Ok(maybe_justified_header) + } + + pub async fn run_iteration( + &mut self, + ) -> Result< + Option>, + Error, + > { + // read best source headers ids from source and target nodes + let info = SyncInfo::new(&self.source_client, &self.target_client).await?; + info.update_metrics(&self.metrics_sync); + self.update_progress(&info); + + // if we have already submitted header, then we just need to wait for it + // if we're waiting too much, then we believe our transaction has been lost and restart sync + if Some(info.best_number_at_target) < self.best_submitted_number { + return Ok(None) + } + + // submit new header if we have something new + match self.select_header_to_submit(&info).await? { + Some(header) => { + let transaction = + Transaction::submit(&self.target_client, header.header, header.proof) + .await + .map_err(Error::Target)?; + self.best_submitted_number = Some(transaction.header_number); + Ok(Some(transaction)) + }, + None => Ok(None), + } + } + + async fn ensure_finality_proofs_stream(&mut self) -> Result<(), FailedClient> { + if let Err(e) = self.finality_proofs_stream.ensure_stream(&self.source_client).await { + if e.is_connection_error() { + return Err(FailedClient::Source) + } + } + + Ok(()) + } + + /// Run finality relay loop until connection to one of nodes is lost. + async fn run_until_connection_lost( + &mut self, + exit_signal: impl Future, + ) -> Result<(), FailedClient> { + self.ensure_finality_proofs_stream().await?; + let proof_submission_tx_tracker = Fuse::terminated(); + let exit_signal = exit_signal.fuse(); + futures::pin_mut!(exit_signal, proof_submission_tx_tracker); + + loop { + // run loop iteration + let next_tick = match self.run_iteration().await { + Ok(Some(tx)) => { + proof_submission_tx_tracker + .set(tx.track::(self.target_client.clone()).fuse()); + self.retry_backoff.reset(); + self.sync_params.tick + }, + Ok(None) => { + self.retry_backoff.reset(); + self.sync_params.tick + }, + Err(error) => { + log::error!(target: "bridge", "Finality sync loop iteration has failed with error: {:?}", error); + error.fail_if_connection_error()?; + self.retry_backoff + .next_backoff() + .unwrap_or(relay_utils::relay_loop::RECONNECT_DELAY) + }, + }; + self.ensure_finality_proofs_stream().await?; + + // wait till exit signal, or new source block + select! { + proof_submission_result = proof_submission_tx_tracker => { + if let Err(e) = proof_submission_result { + log::error!( + target: "bridge", + "Finality sync proof submission tx to {} has failed with error: {:?}.", + P::TARGET_NAME, + e, + ); + self.best_submitted_number = None; + e.fail_if_connection_error()?; + } + }, + _ = async_std::task::sleep(next_tick).fuse() => {}, + _ = exit_signal => return Ok(()), + } + } + } + + pub async fn run( + source_client: SC, + target_client: TC, + sync_params: FinalitySyncParams, + metrics_sync: Option, + exit_signal: impl Future, + ) -> Result<(), FailedClient> { + let mut finality_loop = Self::new(source_client, target_client, sync_params, metrics_sync); + finality_loop.run_until_connection_lost(exit_signal).await + } +} + +/// Run finality proofs synchronization loop. +pub async fn run( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + sync_params: FinalitySyncParams, + metrics_params: MetricsParams, + exit_signal: impl Future + 'static + Send, +) -> Result<(), relay_utils::Error> { + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .with_metrics(metrics_params) + .loop_metric(SyncLoopMetrics::new( + Some(&metrics_prefix::

()), + "source", + "source_at_target", + )?)? + .expose() + .await? + .run(metrics_prefix::

(), move |source_client, target_client, metrics| { + FinalityLoop::run( + source_client, + target_client, + sync_params.clone(), + metrics, + exit_signal.clone(), + ) + }) + .await +} + +#[cfg(test)] +mod tests { + use super::*; + + use crate::mock::*; + use futures::{FutureExt, StreamExt}; + use parking_lot::Mutex; + use relay_utils::{FailedClient, HeaderId, TrackedTransactionStatus}; + use std::{collections::HashMap, sync::Arc}; + + fn prepare_test_clients( + exit_sender: futures::channel::mpsc::UnboundedSender<()>, + state_function: impl Fn(&mut ClientsData) -> bool + Send + Sync + 'static, + source_headers: HashMap)>, + ) -> (TestSourceClient, TestTargetClient) { + let internal_state_function: Arc = + Arc::new(move |data| { + if state_function(data) { + exit_sender.unbounded_send(()).unwrap(); + } + }); + let clients_data = Arc::new(Mutex::new(ClientsData { + source_best_block_number: 10, + source_headers, + source_proofs: vec![TestFinalityProof(12), TestFinalityProof(14)], + + target_best_block_id: HeaderId(5, 5), + target_headers: vec![], + target_transaction_tracker: TestTransactionTracker( + TrackedTransactionStatus::Finalized(Default::default()), + ), + })); + ( + TestSourceClient { + on_method_call: internal_state_function.clone(), + data: clients_data.clone(), + }, + TestTargetClient { on_method_call: internal_state_function, data: clients_data }, + ) + } + + fn test_sync_params() -> FinalitySyncParams { + FinalitySyncParams { + tick: Duration::from_secs(0), + recent_finality_proofs_limit: 1024, + stall_timeout: Duration::from_secs(1), + only_mandatory_headers: false, + } + } + + fn run_sync_loop( + state_function: impl Fn(&mut ClientsData) -> bool + Send + Sync + 'static, + ) -> (ClientsData, Result<(), FailedClient>) { + let (exit_sender, exit_receiver) = futures::channel::mpsc::unbounded(); + let (source_client, target_client) = prepare_test_clients( + exit_sender, + state_function, + vec![ + (5, (TestSourceHeader(false, 5, 5), None)), + (6, (TestSourceHeader(false, 6, 6), None)), + (7, (TestSourceHeader(false, 7, 7), Some(TestFinalityProof(7)))), + (8, (TestSourceHeader(true, 8, 8), Some(TestFinalityProof(8)))), + (9, (TestSourceHeader(false, 9, 9), Some(TestFinalityProof(9)))), + (10, (TestSourceHeader(false, 10, 10), None)), + ] + .into_iter() + .collect(), + ); + let sync_params = test_sync_params(); + + let clients_data = source_client.data.clone(); + let result = async_std::task::block_on(FinalityLoop::run( + source_client, + target_client, + sync_params, + None, + exit_receiver.into_future().map(|(_, _)| ()), + )); + + let clients_data = clients_data.lock().clone(); + (clients_data, result) + } + + #[test] + fn finality_sync_loop_works() { + let (client_data, result) = run_sync_loop(|data| { + // header#7 has persistent finality proof, but it isn't mandatory => it isn't submitted, + // because header#8 has persistent finality proof && it is mandatory => it is submitted + // header#9 has persistent finality proof, but it isn't mandatory => it is submitted, + // because there are no more persistent finality proofs + // + // once this ^^^ is done, we generate more blocks && read proof for blocks 12 and 14 + // from the stream + if data.target_best_block_id.0 == 9 { + data.source_best_block_number = 14; + data.source_headers.insert(11, (TestSourceHeader(false, 11, 11), None)); + data.source_headers + .insert(12, (TestSourceHeader(false, 12, 12), Some(TestFinalityProof(12)))); + data.source_headers.insert(13, (TestSourceHeader(false, 13, 13), None)); + data.source_headers + .insert(14, (TestSourceHeader(false, 14, 14), Some(TestFinalityProof(14)))); + } + // once this ^^^ is done, we generate more blocks && read persistent proof for block 16 + if data.target_best_block_id.0 == 14 { + data.source_best_block_number = 17; + data.source_headers.insert(15, (TestSourceHeader(false, 15, 15), None)); + data.source_headers + .insert(16, (TestSourceHeader(false, 16, 16), Some(TestFinalityProof(16)))); + data.source_headers.insert(17, (TestSourceHeader(false, 17, 17), None)); + } + + data.target_best_block_id.0 == 16 + }); + + assert_eq!(result, Ok(())); + assert_eq!( + client_data.target_headers, + vec![ + // before adding 11..14: finality proof for mandatory header#8 + (TestSourceHeader(true, 8, 8), TestFinalityProof(8)), + // before adding 11..14: persistent finality proof for non-mandatory header#9 + (TestSourceHeader(false, 9, 9), TestFinalityProof(9)), + // after adding 11..14: ephemeral finality proof for non-mandatory header#14 + (TestSourceHeader(false, 14, 14), TestFinalityProof(14)), + // after adding 15..17: persistent finality proof for non-mandatory header#16 + (TestSourceHeader(false, 16, 16), TestFinalityProof(16)), + ], + ); + } + + fn run_only_mandatory_headers_mode_test( + only_mandatory_headers: bool, + has_mandatory_headers: bool, + ) -> Option> { + let (exit_sender, _) = futures::channel::mpsc::unbounded(); + let (source_client, target_client) = prepare_test_clients( + exit_sender, + |_| false, + vec![ + (6, (TestSourceHeader(false, 6, 6), Some(TestFinalityProof(6)))), + (7, (TestSourceHeader(false, 7, 7), Some(TestFinalityProof(7)))), + (8, (TestSourceHeader(has_mandatory_headers, 8, 8), Some(TestFinalityProof(8)))), + (9, (TestSourceHeader(false, 9, 9), Some(TestFinalityProof(9)))), + (10, (TestSourceHeader(false, 10, 10), Some(TestFinalityProof(10)))), + ] + .into_iter() + .collect(), + ); + async_std::task::block_on(async { + let mut finality_loop = FinalityLoop::new( + source_client, + target_client, + FinalitySyncParams { + tick: Duration::from_secs(0), + recent_finality_proofs_limit: 0, + stall_timeout: Duration::from_secs(0), + only_mandatory_headers, + }, + None, + ); + let info = SyncInfo { + best_number_at_source: 10, + best_number_at_target: 5, + is_using_same_fork: true, + }; + finality_loop.select_header_to_submit(&info).await.unwrap() + }) + } + + #[test] + fn select_header_to_submit_skips_non_mandatory_headers_when_only_mandatory_headers_are_required( + ) { + assert_eq!(run_only_mandatory_headers_mode_test(true, false), None); + assert_eq!( + run_only_mandatory_headers_mode_test(false, false), + Some(JustifiedHeader { + header: TestSourceHeader(false, 10, 10), + proof: TestFinalityProof(10) + }), + ); + } + + #[test] + fn select_header_to_submit_selects_mandatory_headers_when_only_mandatory_headers_are_required() + { + assert_eq!( + run_only_mandatory_headers_mode_test(true, true), + Some(JustifiedHeader { + header: TestSourceHeader(true, 8, 8), + proof: TestFinalityProof(8) + }), + ); + assert_eq!( + run_only_mandatory_headers_mode_test(false, true), + Some(JustifiedHeader { + header: TestSourceHeader(true, 8, 8), + proof: TestFinalityProof(8) + }), + ); + } + + #[test] + fn different_forks_at_source_and_at_target_are_detected() { + let (exit_sender, _exit_receiver) = futures::channel::mpsc::unbounded(); + let (source_client, target_client) = prepare_test_clients( + exit_sender, + |_| false, + vec![ + (5, (TestSourceHeader(false, 5, 42), None)), + (6, (TestSourceHeader(false, 6, 6), None)), + (7, (TestSourceHeader(false, 7, 7), None)), + (8, (TestSourceHeader(false, 8, 8), None)), + (9, (TestSourceHeader(false, 9, 9), None)), + (10, (TestSourceHeader(false, 10, 10), None)), + ] + .into_iter() + .collect(), + ); + + let metrics_sync = SyncLoopMetrics::new(None, "source", "target").unwrap(); + async_std::task::block_on(async { + let mut finality_loop = FinalityLoop::new( + source_client, + target_client, + test_sync_params(), + Some(metrics_sync.clone()), + ); + finality_loop.run_iteration().await.unwrap() + }); + + assert!(!metrics_sync.is_using_same_fork()); + } +} diff --git a/relays/finality/src/finality_proofs.rs b/relays/finality/src/finality_proofs.rs new file mode 100644 index 000000000000..e78cf8d62790 --- /dev/null +++ b/relays/finality/src/finality_proofs.rs @@ -0,0 +1,222 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{base::SourceClientBase, FinalityPipeline}; + +use bp_header_chain::FinalityProof; +use futures::{FutureExt, Stream, StreamExt}; +use std::pin::Pin; + +/// Source finality proofs stream that may be restarted. +#[derive(Default)] +pub struct FinalityProofsStream> { + /// The underlying stream. + stream: Option>>, +} + +impl> FinalityProofsStream { + pub fn new() -> Self { + Self { stream: None } + } + + pub fn from_stream(stream: SC::FinalityProofsStream) -> Self { + Self { stream: Some(Box::pin(stream)) } + } + + fn next(&mut self) -> Option<::Item> { + let stream = match &mut self.stream { + Some(stream) => stream, + None => return None, + }; + + match stream.next().now_or_never() { + Some(Some(finality_proof)) => Some(finality_proof), + Some(None) => { + self.stream = None; + None + }, + None => None, + } + } + + pub async fn ensure_stream(&mut self, source_client: &SC) -> Result<(), SC::Error> { + if self.stream.is_none() { + log::warn!(target: "bridge", "{} finality proofs stream is being started / restarted", + P::SOURCE_NAME); + + let stream = source_client.finality_proofs().await.map_err(|error| { + log::error!( + target: "bridge", + "Failed to subscribe to {} justifications: {:?}", + P::SOURCE_NAME, + error, + ); + + error + })?; + self.stream = Some(Box::pin(stream)); + } + + Ok(()) + } +} + +/// Source finality proofs buffer. +pub struct FinalityProofsBuf { + /// Proofs buffer. Ordered by target header number. + buf: Vec, +} + +impl FinalityProofsBuf

{ + pub fn new(buf: Vec) -> Self { + Self { buf } + } + + pub fn buf(&self) -> &Vec { + &self.buf + } + + pub fn fill>(&mut self, stream: &mut FinalityProofsStream) { + let mut proofs_count = 0; + let mut first_header_number = None; + let mut last_header_number = None; + while let Some(finality_proof) = stream.next() { + let target_header_number = finality_proof.target_header_number(); + first_header_number.get_or_insert(target_header_number); + last_header_number = Some(target_header_number); + proofs_count += 1; + + self.buf.push(finality_proof); + } + + if proofs_count != 0 { + log::trace!( + target: "bridge", + "Read {} finality proofs from {} finality stream for headers in range [{:?}; {:?}]", + proofs_count, + P::SOURCE_NAME, + first_header_number, + last_header_number, + ); + } + } + + /// Prune all finality proofs that target header numbers older than `first_to_keep`. + pub fn prune(&mut self, first_to_keep: P::Number, maybe_buf_limit: Option) { + let first_to_keep_idx = self + .buf + .binary_search_by_key(&first_to_keep, |hdr| hdr.target_header_number()) + .map(|idx| idx + 1) + .unwrap_or_else(|idx| idx); + let buf_limit_idx = match maybe_buf_limit { + Some(buf_limit) => self.buf.len().saturating_sub(buf_limit), + None => 0, + }; + + self.buf = self.buf.split_off(std::cmp::max(first_to_keep_idx, buf_limit_idx)); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + + #[test] + fn finality_proofs_buf_fill_works() { + // when stream is currently empty, nothing is changed + let mut finality_proofs_buf = + FinalityProofsBuf:: { buf: vec![TestFinalityProof(1)] }; + let mut stream = + FinalityProofsStream::::from_stream( + Box::pin(futures::stream::pending()), + ); + finality_proofs_buf.fill(&mut stream); + assert_eq!(finality_proofs_buf.buf, vec![TestFinalityProof(1)]); + assert!(stream.stream.is_some()); + + // when stream has entry with target, it is added to the recent proofs container + let mut stream = + FinalityProofsStream::::from_stream( + Box::pin( + futures::stream::iter(vec![TestFinalityProof(4)]) + .chain(futures::stream::pending()), + ), + ); + finality_proofs_buf.fill(&mut stream); + assert_eq!(finality_proofs_buf.buf, vec![TestFinalityProof(1), TestFinalityProof(4)]); + assert!(stream.stream.is_some()); + + // when stream has ended, we'll need to restart it + let mut stream = + FinalityProofsStream::::from_stream( + Box::pin(futures::stream::empty()), + ); + finality_proofs_buf.fill(&mut stream); + assert_eq!(finality_proofs_buf.buf, vec![TestFinalityProof(1), TestFinalityProof(4)]); + assert!(stream.stream.is_none()); + } + + #[test] + fn finality_proofs_buf_prune_works() { + let original_finality_proofs_buf: Vec< + ::FinalityProof, + > = vec![ + TestFinalityProof(10), + TestFinalityProof(13), + TestFinalityProof(15), + TestFinalityProof(17), + TestFinalityProof(19), + ] + .into_iter() + .collect(); + + // when there's proof for justified header in the vec + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(10, None); + assert_eq!(&original_finality_proofs_buf[1..], finality_proofs_buf.buf,); + + // when there are no proof for justified header in the vec + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(11, None); + assert_eq!(&original_finality_proofs_buf[1..], finality_proofs_buf.buf,); + + // when there are too many entries after initial prune && they also need to be pruned + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(10, Some(2)); + assert_eq!(&original_finality_proofs_buf[3..], finality_proofs_buf.buf,); + + // when last entry is pruned + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(19, Some(2)); + assert_eq!(&original_finality_proofs_buf[5..], finality_proofs_buf.buf,); + + // when post-last entry is pruned + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(20, Some(2)); + assert_eq!(&original_finality_proofs_buf[5..], finality_proofs_buf.buf,); + } +} diff --git a/relays/finality/src/headers.rs b/relays/finality/src/headers.rs new file mode 100644 index 000000000000..91f7cd0378ec --- /dev/null +++ b/relays/finality/src/headers.rs @@ -0,0 +1,238 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + finality_loop::SyncInfo, finality_proofs::FinalityProofsBuf, Error, FinalitySyncPipeline, + SourceClient, SourceHeader, TargetClient, +}; + +use bp_header_chain::FinalityProof; +use std::cmp::Ordering; + +/// Unjustified headers container. Ordered by header number. +pub type UnjustifiedHeaders = Vec; + +#[derive(Debug)] +#[cfg_attr(test, derive(Clone, PartialEq))] +pub struct JustifiedHeader { + pub header: P::Header, + pub proof: P::FinalityProof, +} + +impl JustifiedHeader

{ + pub fn number(&self) -> P::Number { + self.header.number() + } +} + +/// Finality proof that has been selected by the `read_missing_headers` function. +pub enum JustifiedHeaderSelector { + /// Mandatory header and its proof has been selected. We shall submit proof for this header. + Mandatory(JustifiedHeader

), + /// Regular header and its proof has been selected. We may submit this proof, or proof for + /// some better header. + Regular(UnjustifiedHeaders, JustifiedHeader

), + /// We haven't found any missing header with persistent proof at the target client. + None(UnjustifiedHeaders), +} + +impl JustifiedHeaderSelector

{ + pub(crate) async fn new, TC: TargetClient

>( + source_client: &SC, + info: &SyncInfo

, + ) -> Result> { + let mut unjustified_headers = Vec::new(); + let mut maybe_justified_header = None; + + let mut header_number = info.best_number_at_target + 1.into(); + while header_number <= info.best_number_at_source { + let (header, maybe_proof) = source_client + .header_and_finality_proof(header_number) + .await + .map_err(Error::Source)?; + + match (header.is_mandatory(), maybe_proof) { + (true, Some(proof)) => { + log::trace!(target: "bridge", "Header {:?} is mandatory", header_number); + return Ok(Self::Mandatory(JustifiedHeader { header, proof })) + }, + (true, None) => return Err(Error::MissingMandatoryFinalityProof(header.number())), + (false, Some(proof)) => { + log::trace!(target: "bridge", "Header {:?} has persistent finality proof", header_number); + unjustified_headers.clear(); + maybe_justified_header = Some(JustifiedHeader { header, proof }); + }, + (false, None) => { + unjustified_headers.push(header); + }, + } + + header_number = header_number + 1.into(); + } + + log::trace!( + target: "bridge", + "Read {} {} headers. Selected finality proof for header: {:?}", + info.num_headers(), + P::SOURCE_NAME, + maybe_justified_header.as_ref().map(|justified_header| &justified_header.header), + ); + + Ok(match maybe_justified_header { + Some(justified_header) => Self::Regular(unjustified_headers, justified_header), + None => Self::None(unjustified_headers), + }) + } + + pub fn select_mandatory(self) -> Option> { + match self { + JustifiedHeaderSelector::Mandatory(header) => Some(header), + _ => None, + } + } + + pub fn select(self, buf: &FinalityProofsBuf

) -> Option> { + let (unjustified_headers, maybe_justified_header) = match self { + JustifiedHeaderSelector::Mandatory(justified_header) => return Some(justified_header), + JustifiedHeaderSelector::Regular(unjustified_headers, justified_header) => + (unjustified_headers, Some(justified_header)), + JustifiedHeaderSelector::None(unjustified_headers) => (unjustified_headers, None), + }; + + let mut finality_proofs_iter = buf.buf().iter().rev(); + let mut maybe_finality_proof = finality_proofs_iter.next(); + + let mut unjustified_headers_iter = unjustified_headers.iter().rev(); + let mut maybe_unjustified_header = unjustified_headers_iter.next(); + + while let (Some(finality_proof), Some(unjustified_header)) = + (maybe_finality_proof, maybe_unjustified_header) + { + match finality_proof.target_header_number().cmp(&unjustified_header.number()) { + Ordering::Equal => { + log::trace!( + target: "bridge", + "Managed to improve selected {} finality proof {:?} to {:?}.", + P::SOURCE_NAME, + maybe_justified_header.as_ref().map(|justified_header| justified_header.number()), + finality_proof.target_header_number() + ); + return Some(JustifiedHeader { + header: unjustified_header.clone(), + proof: finality_proof.clone(), + }) + }, + Ordering::Less => maybe_unjustified_header = unjustified_headers_iter.next(), + Ordering::Greater => { + maybe_finality_proof = finality_proofs_iter.next(); + }, + } + } + + log::trace!( + target: "bridge", + "Could not improve selected {} finality proof {:?}.", + P::SOURCE_NAME, + maybe_justified_header.as_ref().map(|justified_header| justified_header.number()) + ); + maybe_justified_header + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + + #[test] + fn select_better_recent_finality_proof_works() { + // if there are no unjustified headers, nothing is changed + let finality_proofs_buf = + FinalityProofsBuf::::new(vec![TestFinalityProof(5)]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular(vec![], justified_header.clone()); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there are no buffered finality proofs, nothing is changed + let finality_proofs_buf = FinalityProofsBuf::::new(vec![]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![TestSourceHeader(false, 5, 5)], + justified_header.clone(), + ); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there's no intersection between recent finality proofs and unjustified headers, + // nothing is changed + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(1), + TestFinalityProof(4), + ]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![TestSourceHeader(false, 9, 9), TestSourceHeader(false, 10, 10)], + justified_header.clone(), + ); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there's intersection between recent finality proofs and unjustified headers, but there + // are no proofs in this intersection, nothing is changed + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(7), + TestFinalityProof(11), + ]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![ + TestSourceHeader(false, 8, 8), + TestSourceHeader(false, 9, 9), + TestSourceHeader(false, 10, 10), + ], + justified_header.clone(), + ); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there's intersection between recent finality proofs and unjustified headers and + // there's a proof in this intersection: + // - this better (last from intersection) proof is selected; + // - 'obsolete' unjustified headers are pruned. + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(7), + TestFinalityProof(9), + ]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![ + TestSourceHeader(false, 8, 8), + TestSourceHeader(false, 9, 9), + TestSourceHeader(false, 10, 10), + ], + justified_header, + ); + assert_eq!( + selector.select(&finality_proofs_buf), + Some(JustifiedHeader { + header: TestSourceHeader(false, 9, 9), + proof: TestFinalityProof(9) + }) + ); + } +} diff --git a/relays/finality/src/lib.rs b/relays/finality/src/lib.rs new file mode 100644 index 000000000000..3579e68e1ef9 --- /dev/null +++ b/relays/finality/src/lib.rs @@ -0,0 +1,91 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! This crate has single entrypoint to run synchronization loop that is built around finality +//! proofs, as opposed to headers synchronization loop, which is built around headers. The headers +//! are still submitted to the target node, but are treated as auxiliary data as we are not trying +//! to submit all source headers to the target node. + +pub use crate::{ + base::{FinalityPipeline, SourceClientBase}, + finality_loop::{metrics_prefix, run, FinalitySyncParams, SourceClient, TargetClient}, + finality_proofs::{FinalityProofsBuf, FinalityProofsStream}, + sync_loop_metrics::SyncLoopMetrics, +}; + +use bp_header_chain::ConsensusLogReader; +use relay_utils::{FailedClient, MaybeConnectionError}; +use std::fmt::Debug; + +mod base; +mod finality_loop; +mod finality_proofs; +mod headers; +mod mock; +mod sync_loop_metrics; + +/// Finality proofs synchronization pipeline. +pub trait FinalitySyncPipeline: FinalityPipeline { + /// A reader that can extract the consensus log from the header digest and interpret it. + type ConsensusLogReader: ConsensusLogReader; + /// Type of header that we're syncing. + type Header: SourceHeader; +} + +/// Header that we're receiving from source node. +pub trait SourceHeader: Clone + Debug + PartialEq + Send + Sync { + /// Returns hash of header. + fn hash(&self) -> Hash; + /// Returns number of header. + fn number(&self) -> Number; + /// Returns true if this header needs to be submitted to target node. + fn is_mandatory(&self) -> bool; +} + +/// Error that may happen inside finality synchronization loop. +#[derive(Debug)] +enum Error { + /// Source client request has failed with given error. + Source(SourceError), + /// Target client request has failed with given error. + Target(TargetError), + /// Finality proof for mandatory header is missing from the source node. + MissingMandatoryFinalityProof(P::Number), + /// `submit_finality_proof` transaction failed + ProofSubmissionTxFailed { + #[allow(dead_code)] + submitted_number: P::Number, + #[allow(dead_code)] + best_number_at_target: P::Number, + }, + /// `submit_finality_proof` transaction lost + ProofSubmissionTxLost, +} + +impl Error +where + P: FinalitySyncPipeline, + SourceError: MaybeConnectionError, + TargetError: MaybeConnectionError, +{ + fn fail_if_connection_error(&self) -> Result<(), FailedClient> { + match *self { + Error::Source(ref error) if error.is_connection_error() => Err(FailedClient::Source), + Error::Target(ref error) if error.is_connection_error() => Err(FailedClient::Target), + _ => Ok(()), + } + } +} diff --git a/relays/finality/src/mock.rs b/relays/finality/src/mock.rs new file mode 100644 index 000000000000..e3ec4e4d0d47 --- /dev/null +++ b/relays/finality/src/mock.rs @@ -0,0 +1,213 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tests for finality synchronization loop. + +#![cfg(test)] + +use crate::{ + base::SourceClientBase, + finality_loop::{SourceClient, TargetClient}, + FinalityPipeline, FinalitySyncPipeline, SourceHeader, +}; + +use async_trait::async_trait; +use bp_header_chain::{FinalityProof, GrandpaConsensusLogReader}; +use futures::{Stream, StreamExt}; +use parking_lot::Mutex; +use relay_utils::{ + relay_loop::Client as RelayClient, HeaderId, MaybeConnectionError, TrackedTransactionStatus, + TransactionTracker, +}; +use std::{collections::HashMap, pin::Pin, sync::Arc}; + +type IsMandatory = bool; +pub type TestNumber = u64; +type TestHash = u64; + +#[derive(Clone, Debug)] +pub struct TestTransactionTracker(pub TrackedTransactionStatus>); + +impl Default for TestTransactionTracker { + fn default() -> TestTransactionTracker { + TestTransactionTracker(TrackedTransactionStatus::Finalized(Default::default())) + } +} + +#[async_trait] +impl TransactionTracker for TestTransactionTracker { + type HeaderId = HeaderId; + + async fn wait(self) -> TrackedTransactionStatus> { + self.0 + } +} + +#[derive(Debug, Clone)] +pub enum TestError { + NonConnection, +} + +impl MaybeConnectionError for TestError { + fn is_connection_error(&self) -> bool { + false + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct TestFinalitySyncPipeline; + +impl FinalityPipeline for TestFinalitySyncPipeline { + const SOURCE_NAME: &'static str = "TestSource"; + const TARGET_NAME: &'static str = "TestTarget"; + + type Hash = TestHash; + type Number = TestNumber; + type FinalityProof = TestFinalityProof; +} + +impl FinalitySyncPipeline for TestFinalitySyncPipeline { + type ConsensusLogReader = GrandpaConsensusLogReader; + type Header = TestSourceHeader; +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestSourceHeader(pub IsMandatory, pub TestNumber, pub TestHash); + +impl SourceHeader> + for TestSourceHeader +{ + fn hash(&self) -> TestHash { + self.2 + } + + fn number(&self) -> TestNumber { + self.1 + } + + fn is_mandatory(&self) -> bool { + self.0 + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestFinalityProof(pub TestNumber); + +impl FinalityProof for TestFinalityProof { + fn target_header_hash(&self) -> TestHash { + Default::default() + } + + fn target_header_number(&self) -> TestNumber { + self.0 + } +} + +#[derive(Debug, Clone, Default)] +pub struct ClientsData { + pub source_best_block_number: TestNumber, + pub source_headers: HashMap)>, + pub source_proofs: Vec, + + pub target_best_block_id: HeaderId, + pub target_headers: Vec<(TestSourceHeader, TestFinalityProof)>, + pub target_transaction_tracker: TestTransactionTracker, +} + +#[derive(Clone)] +pub struct TestSourceClient { + pub on_method_call: Arc, + pub data: Arc>, +} + +#[async_trait] +impl RelayClient for TestSourceClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + unreachable!() + } +} + +#[async_trait] +impl SourceClientBase for TestSourceClient { + type FinalityProofsStream = Pin + 'static + Send>>; + + async fn finality_proofs(&self) -> Result { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + Ok(futures::stream::iter(data.source_proofs.clone()).boxed()) + } +} + +#[async_trait] +impl SourceClient for TestSourceClient { + async fn best_finalized_block_number(&self) -> Result { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + Ok(data.source_best_block_number) + } + + async fn header_and_finality_proof( + &self, + number: TestNumber, + ) -> Result<(TestSourceHeader, Option), TestError> { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + data.source_headers.get(&number).cloned().ok_or(TestError::NonConnection) + } +} + +#[derive(Clone)] +pub struct TestTargetClient { + pub on_method_call: Arc, + pub data: Arc>, +} + +#[async_trait] +impl RelayClient for TestTargetClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + unreachable!() + } +} + +#[async_trait] +impl TargetClient for TestTargetClient { + type TransactionTracker = TestTransactionTracker; + + async fn best_finalized_source_block_id( + &self, + ) -> Result, TestError> { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + Ok(data.target_best_block_id) + } + + async fn submit_finality_proof( + &self, + header: TestSourceHeader, + proof: TestFinalityProof, + ) -> Result { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + data.target_best_block_id = HeaderId(header.number(), header.hash()); + data.target_headers.push((header, proof)); + (self.on_method_call)(&mut data); + Ok(data.target_transaction_tracker.clone()) + } +} diff --git a/relays/finality/src/sync_loop_metrics.rs b/relays/finality/src/sync_loop_metrics.rs new file mode 100644 index 000000000000..4da1df811f6e --- /dev/null +++ b/relays/finality/src/sync_loop_metrics.rs @@ -0,0 +1,95 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Metrics for headers synchronization relay loop. + +use relay_utils::{ + metrics::{metric_name, register, IntGauge, Metric, PrometheusError, Registry}, + UniqueSaturatedInto, +}; + +/// Headers sync metrics. +#[derive(Clone)] +pub struct SyncLoopMetrics { + /// Best syncing header at the source. + best_source_block_number: IntGauge, + /// Best syncing header at the target. + best_target_block_number: IntGauge, + /// Flag that has `0` value when best source headers at the source node and at-target-chain + /// are matching and `1` otherwise. + using_different_forks: IntGauge, +} + +impl SyncLoopMetrics { + /// Create and register headers loop metrics. + pub fn new( + prefix: Option<&str>, + at_source_chain_label: &str, + at_target_chain_label: &str, + ) -> Result { + Ok(SyncLoopMetrics { + best_source_block_number: IntGauge::new( + metric_name(prefix, &format!("best_{at_source_chain_label}_block_number")), + format!("Best block number at the {at_source_chain_label}"), + )?, + best_target_block_number: IntGauge::new( + metric_name(prefix, &format!("best_{at_target_chain_label}_block_number")), + format!("Best block number at the {at_target_chain_label}"), + )?, + using_different_forks: IntGauge::new( + metric_name(prefix, &format!("is_{at_source_chain_label}_and_{at_target_chain_label}_using_different_forks")), + "Whether the best finalized source block at target node is different (value 1) from the \ + corresponding block at the source node", + )?, + }) + } + + /// Returns current value of the using-same-fork flag. + #[cfg(test)] + pub(crate) fn is_using_same_fork(&self) -> bool { + self.using_different_forks.get() == 0 + } + + /// Update best block number at source. + pub fn update_best_block_at_source>( + &self, + source_best_number: Number, + ) { + self.best_source_block_number.set(source_best_number.unique_saturated_into()); + } + + /// Update best block number at target. + pub fn update_best_block_at_target>( + &self, + target_best_number: Number, + ) { + self.best_target_block_number.set(target_best_number.unique_saturated_into()); + } + + /// Update using-same-fork flag. + pub fn update_using_same_fork(&self, using_same_fork: bool) { + self.using_different_forks.set((!using_same_fork).into()) + } +} + +impl Metric for SyncLoopMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.best_source_block_number.clone(), registry)?; + register(self.best_target_block_number.clone(), registry)?; + register(self.using_different_forks.clone(), registry)?; + Ok(()) + } +} diff --git a/relays/lib-substrate-relay/Cargo.toml b/relays/lib-substrate-relay/Cargo.toml new file mode 100644 index 000000000000..5d73119aeb90 --- /dev/null +++ b/relays/lib-substrate-relay/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "substrate-relay-helper" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +anyhow = "1.0" +thiserror = "1.0.51" +async-std = "1.9.0" +async-trait = "0.1" +codec = { package = "parity-scale-codec", version = "3.1.5" } +futures = "0.3.29" +hex = "0.4" +num-traits = "0.2" +log = "0.4.20" + +# Bridge dependencies + +bp-header-chain = { path = "../../primitives/header-chain" } +bp-parachains = { path = "../../primitives/parachains" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-relayers = { path = "../../primitives/relayers" } +bridge-runtime-common = { path = "../../bin/runtime-common" } + +equivocation-detector = { path = "../equivocation" } +finality-grandpa = { version = "0.16.2" } +finality-relay = { path = "../finality" } +parachains-relay = { path = "../parachains" } +relay-utils = { path = "../utils" } +messages-relay = { path = "../messages" } +relay-substrate-client = { path = "../client-substrate" } + +pallet-bridge-grandpa = { path = "../../modules/grandpa" } +pallet-bridge-messages = { path = "../../modules/messages" } +pallet-bridge-parachains = { path = "../../modules/parachains" } + +bp-runtime = { path = "../../primitives/runtime" } +bp-messages = { path = "../../primitives/messages" } + +# Substrate Dependencies + +frame-support = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +frame-system = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +pallet-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } + +[dev-dependencies] +bp-rococo = { path = "../../primitives/chain-rococo" } +pallet-transaction-payment = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +relay-bridge-hub-rococo-client = { path = "../client-bridge-hub-rococo" } +relay-bridge-hub-westend-client = { path = "../client-bridge-hub-westend" } +relay-rococo-client = { path = "../client-rococo" } diff --git a/relays/lib-substrate-relay/src/equivocation/mod.rs b/relays/lib-substrate-relay/src/equivocation/mod.rs new file mode 100644 index 000000000000..f6d58cbaa4ab --- /dev/null +++ b/relays/lib-substrate-relay/src/equivocation/mod.rs @@ -0,0 +1,223 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! equivocation detection pipelines. + +mod source; +mod target; + +use crate::{ + equivocation::{source::SubstrateEquivocationSource, target::SubstrateEquivocationTarget}, + finality_base::{engine::Engine, SubstrateFinalityPipeline, SubstrateFinalityProof}, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_runtime::{AccountIdOf, BlockNumberOf, HashOf}; +use equivocation_detector::EquivocationDetectionPipeline; +use finality_relay::FinalityPipeline; +use pallet_grandpa::{Call as GrandpaCall, Config as GrandpaConfig}; +use relay_substrate_client::{AccountKeyPairOf, CallOf, Chain, ChainWithTransactions, Client}; +use relay_utils::metrics::MetricsParams; +use sp_core::Pair; +use sp_runtime::traits::{Block, Header}; +use std::marker::PhantomData; + +/// Convenience trait that adds bounds to `SubstrateEquivocationDetectionPipeline`. +pub trait BaseSubstrateEquivocationDetectionPipeline: + SubstrateFinalityPipeline +{ + /// Bounded `SubstrateFinalityPipeline::SourceChain`. + type BoundedSourceChain: ChainWithTransactions; + + /// Bounded `AccountIdOf`. + type BoundedSourceChainAccountId: From< as Pair>::Public> + + Send; +} + +impl BaseSubstrateEquivocationDetectionPipeline for T +where + T: SubstrateFinalityPipeline, + T::SourceChain: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, +{ + type BoundedSourceChain = T::SourceChain; + type BoundedSourceChainAccountId = AccountIdOf; +} + +/// Substrate -> Substrate equivocation detection pipeline. +#[async_trait] +pub trait SubstrateEquivocationDetectionPipeline: + BaseSubstrateEquivocationDetectionPipeline +{ + /// How the `report_equivocation` call is built ? + type ReportEquivocationCallBuilder: ReportEquivocationCallBuilder; + + /// Add relay guards if required. + async fn start_relay_guards( + source_client: &Client, + enable_version_guard: bool, + ) -> relay_substrate_client::Result<()> { + if enable_version_guard { + relay_substrate_client::guard::abort_on_spec_version_change( + source_client.clone(), + source_client.simple_runtime_version().await?.spec_version, + ); + } + Ok(()) + } +} + +type FinalityProoffOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::FinalityProof; +type FinalityVerificationContextfOf

= + <

::FinalityEngine as Engine< +

::SourceChain, + >>::FinalityVerificationContext; +/// The type of the equivocation proof used by the `SubstrateEquivocationDetectionPipeline` +pub type EquivocationProofOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::EquivocationProof; +type EquivocationsFinderOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::EquivocationsFinder; +/// The type of the key owner proof used by the `SubstrateEquivocationDetectionPipeline` +pub type KeyOwnerProofOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::KeyOwnerProof; + +/// Adapter that allows a `SubstrateEquivocationDetectionPipeline` to act as an +/// `EquivocationDetectionPipeline`. +#[derive(Clone, Debug)] +pub struct EquivocationDetectionPipelineAdapter { + _phantom: PhantomData

, +} + +impl FinalityPipeline + for EquivocationDetectionPipelineAdapter

+{ + const SOURCE_NAME: &'static str = P::SourceChain::NAME; + const TARGET_NAME: &'static str = P::TargetChain::NAME; + + type Hash = HashOf; + type Number = BlockNumberOf; + type FinalityProof = SubstrateFinalityProof

; +} + +impl EquivocationDetectionPipeline + for EquivocationDetectionPipelineAdapter

+{ + type TargetNumber = BlockNumberOf; + type FinalityVerificationContext = FinalityVerificationContextfOf

; + type EquivocationProof = EquivocationProofOf

; + type EquivocationsFinder = EquivocationsFinderOf

; +} + +/// Different ways of building `report_equivocation` calls. +pub trait ReportEquivocationCallBuilder { + /// Build a `report_equivocation` call to be executed on the source chain. + fn build_report_equivocation_call( + equivocation_proof: EquivocationProofOf

, + key_owner_proof: KeyOwnerProofOf

, + ) -> CallOf; +} + +/// Building the `report_equivocation` call when having direct access to the target chain runtime. +pub struct DirectReportGrandpaEquivocationCallBuilder { + _phantom: PhantomData<(P, R)>, +} + +impl ReportEquivocationCallBuilder

for DirectReportGrandpaEquivocationCallBuilder +where + P: SubstrateEquivocationDetectionPipeline, + P::FinalityEngine: Engine< + P::SourceChain, + EquivocationProof = sp_consensus_grandpa::EquivocationProof< + HashOf, + BlockNumberOf, + >, + >, + R: frame_system::Config> + + GrandpaConfig>, + ::Header: Header>, + CallOf: From>, +{ + fn build_report_equivocation_call( + equivocation_proof: EquivocationProofOf

, + key_owner_proof: KeyOwnerProofOf

, + ) -> CallOf { + GrandpaCall::::report_equivocation { + equivocation_proof: Box::new(equivocation_proof), + key_owner_proof, + } + .into() + } +} + +/// Macro that generates `ReportEquivocationCallBuilder` implementation for the case where +/// we only have access to the mocked version of the source chain runtime. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_report_equivocation_call_builder { + ($pipeline:ident, $mocked_builder:ident, $grandpa:path, $report_equivocation:path) => { + pub struct $mocked_builder; + + impl $crate::equivocation::ReportEquivocationCallBuilder<$pipeline> + for $mocked_builder + { + fn build_report_equivocation_call( + equivocation_proof: $crate::equivocation::EquivocationProofOf<$pipeline>, + key_owner_proof: $crate::equivocation::KeyOwnerProofOf<$pipeline>, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > { + bp_runtime::paste::item! { + $grandpa($report_equivocation { + equivocation_proof: Box::new(equivocation_proof), + key_owner_proof: key_owner_proof + }) + } + } + } + }; +} + +/// Run Substrate-to-Substrate equivocations detection loop. +pub async fn run( + source_client: Client, + target_client: Client, + source_transaction_params: TransactionParams>, + metrics_params: MetricsParams, +) -> anyhow::Result<()> { + log::info!( + target: "bridge", + "Starting {} -> {} equivocations detection loop", + P::SourceChain::NAME, + P::TargetChain::NAME, + ); + + equivocation_detector::run( + SubstrateEquivocationSource::

::new(source_client, source_transaction_params), + SubstrateEquivocationTarget::

::new(target_client), + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + metrics_params, + futures::future::pending(), + ) + .await + .map_err(|e| anyhow::format_err!("{}", e)) +} diff --git a/relays/lib-substrate-relay/src/equivocation/source.rs b/relays/lib-substrate-relay/src/equivocation/source.rs new file mode 100644 index 000000000000..a0c7dcf5cbc3 --- /dev/null +++ b/relays/lib-substrate-relay/src/equivocation/source.rs @@ -0,0 +1,109 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Default generic implementation of equivocation source for basic Substrate client. + +use crate::{ + equivocation::{ + EquivocationDetectionPipelineAdapter, EquivocationProofOf, ReportEquivocationCallBuilder, + SubstrateEquivocationDetectionPipeline, + }, + finality_base::{engine::Engine, finality_proofs, SubstrateFinalityProofsStream}, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_runtime::{HashOf, TransactionEra}; +use equivocation_detector::SourceClient; +use finality_relay::SourceClientBase; +use relay_substrate_client::{ + AccountKeyPairOf, Client, Error, TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; + +/// Substrate node as equivocation source. +pub struct SubstrateEquivocationSource { + client: Client, + transaction_params: TransactionParams>, +} + +impl SubstrateEquivocationSource

{ + /// Create new instance of `SubstrateEquivocationSource`. + pub fn new( + client: Client, + transaction_params: TransactionParams>, + ) -> Self { + Self { client, transaction_params } + } +} + +impl Clone for SubstrateEquivocationSource

{ + fn clone(&self) -> Self { + Self { client: self.client.clone(), transaction_params: self.transaction_params.clone() } + } +} + +#[async_trait] +impl RelayClient for SubstrateEquivocationSource

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl + SourceClientBase> for SubstrateEquivocationSource

+{ + type FinalityProofsStream = SubstrateFinalityProofsStream

; + + async fn finality_proofs(&self) -> Result { + finality_proofs::

(&self.client).await + } +} + +#[async_trait] +impl + SourceClient> for SubstrateEquivocationSource

+{ + type TransactionTracker = TransactionTracker>; + + async fn report_equivocation( + &self, + at: HashOf, + equivocation: EquivocationProofOf

, + ) -> Result { + let key_owner_proof = + P::FinalityEngine::generate_source_key_ownership_proof(&self.client, at, &equivocation) + .await?; + + let mortality = self.transaction_params.mortality; + let call = P::ReportEquivocationCallBuilder::build_report_equivocation_call( + equivocation, + key_owner_proof, + ); + self.client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, mortality))) + }, + ) + .await + } +} diff --git a/relays/lib-substrate-relay/src/equivocation/target.rs b/relays/lib-substrate-relay/src/equivocation/target.rs new file mode 100644 index 000000000000..6eee2ab91d45 --- /dev/null +++ b/relays/lib-substrate-relay/src/equivocation/target.rs @@ -0,0 +1,111 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Default generic implementation of equivocation source for basic Substrate client. + +use crate::{ + equivocation::{ + EquivocationDetectionPipelineAdapter, FinalityProoffOf, FinalityVerificationContextfOf, + SubstrateEquivocationDetectionPipeline, + }, + finality_base::{best_synced_header_id, engine::Engine}, +}; + +use async_trait::async_trait; +use bp_header_chain::HeaderFinalityInfo; +use bp_runtime::{BlockNumberOf, HashOf}; +use equivocation_detector::TargetClient; +use relay_substrate_client::{Client, Error}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_runtime::traits::Header; +use std::marker::PhantomData; + +/// Substrate node as equivocation source. +pub struct SubstrateEquivocationTarget { + client: Client, + + _phantom: PhantomData

, +} + +impl SubstrateEquivocationTarget

{ + /// Create new instance of `SubstrateEquivocationTarget`. + pub fn new(client: Client) -> Self { + Self { client, _phantom: Default::default() } + } +} + +impl Clone for SubstrateEquivocationTarget

{ + fn clone(&self) -> Self { + Self { client: self.client.clone(), _phantom: Default::default() } + } +} + +#[async_trait] +impl RelayClient for SubstrateEquivocationTarget

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl + TargetClient> for SubstrateEquivocationTarget

+{ + async fn best_finalized_header_number( + &self, + ) -> Result, Self::Error> { + self.client.best_finalized_header_number().await + } + + async fn best_synced_header_hash( + &self, + at: BlockNumberOf, + ) -> Result>, Self::Error> { + Ok(best_synced_header_id::( + &self.client, + self.client.header_by_number(at).await?.hash(), + ) + .await? + .map(|id| id.hash())) + } + + async fn finality_verification_context( + &self, + at: BlockNumberOf, + ) -> Result, Self::Error> { + P::FinalityEngine::finality_verification_context( + &self.client, + self.client.header_by_number(at).await?.hash(), + ) + .await + } + + async fn synced_headers_finality_info( + &self, + at: BlockNumberOf, + ) -> Result< + Vec, FinalityVerificationContextfOf

>>, + Self::Error, + > { + P::FinalityEngine::synced_headers_finality_info( + &self.client, + self.client.header_by_number(at).await?.hash(), + ) + .await + } +} diff --git a/relays/lib-substrate-relay/src/error.rs b/relays/lib-substrate-relay/src/error.rs new file mode 100644 index 000000000000..2ebd9130f391 --- /dev/null +++ b/relays/lib-substrate-relay/src/error.rs @@ -0,0 +1,63 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Relay errors. + +use relay_substrate_client as client; +use sp_consensus_grandpa::AuthorityList; +use sp_runtime::traits::MaybeDisplay; +use std::fmt::Debug; +use thiserror::Error; + +/// Relay errors. +#[derive(Error, Debug)] +pub enum Error { + /// Failed to submit signed extrinsic from to the target chain. + #[error("Failed to submit {0} transaction: {1:?}")] + SubmitTransaction(&'static str, client::Error), + /// Failed subscribe to justification stream of the source chain. + #[error("Failed to subscribe to {0} justifications: {1:?}")] + Subscribe(&'static str, client::Error), + /// Failed subscribe to read justification from the source chain (client error). + #[error("Failed to read {0} justification from the stream: {1}")] + ReadJustification(&'static str, client::Error), + /// Failed subscribe to read justification from the source chain (stream ended). + #[error("Failed to read {0} justification from the stream: stream has ended unexpectedly")] + ReadJustificationStreamEnded(&'static str), + /// Failed subscribe to decode justification from the source chain. + #[error("Failed to decode {0} justification: {1:?}")] + DecodeJustification(&'static str, codec::Error), + /// GRANDPA authorities read from the source chain are invalid. + #[error("Read invalid {0} authorities set: {1:?}")] + ReadInvalidAuthorities(&'static str, AuthorityList), + /// Failed to guess initial GRANDPA authorities at the given header of the source chain. + #[error("Failed to guess initial {0} GRANDPA authorities set id: checked all possible ids in range [0; {1}]")] + GuessInitialAuthorities(&'static str, HeaderNumber), + /// Failed to retrieve GRANDPA authorities at the given header from the source chain. + #[error("Failed to retrive {0} GRANDPA authorities set at header {1}: {2:?}")] + RetrieveAuthorities(&'static str, Hash, client::Error), + /// Failed to decode GRANDPA authorities at the given header of the source chain. + #[error("Failed to decode {0} GRANDPA authorities set at header {1}: {2:?}")] + DecodeAuthorities(&'static str, Hash, codec::Error), + /// Failed to retrieve header by the hash from the source chain. + #[error("Failed to retrieve {0} header with hash {1}: {2:?}")] + RetrieveHeader(&'static str, Hash, client::Error), + /// Failed to submit signed extrinsic from to the target chain. + #[error( + "Failed to retrieve `is_initialized` flag of the with-{0} finality pallet at {1}: {2:?}" + )] + IsInitializedRetrieve(&'static str, &'static str, client::Error), +} diff --git a/relays/lib-substrate-relay/src/finality/initialize.rs b/relays/lib-substrate-relay/src/finality/initialize.rs new file mode 100644 index 000000000000..5dde46c39dd6 --- /dev/null +++ b/relays/lib-substrate-relay/src/finality/initialize.rs @@ -0,0 +1,163 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Initialize Substrate -> Substrate finality bridge. +//! +//! Initialization is a transaction that calls `initialize()` function of the +//! finality pallet (GRANDPA/BEEFY/...). This transaction brings initial header +//! and authorities set from source to target chain. The finality sync starts +//! with this header. + +use crate::{error::Error, finality_base::engine::Engine}; +use sp_core::Pair; + +use bp_runtime::HeaderIdOf; +use relay_substrate_client::{ + AccountKeyPairOf, Chain, ChainWithTransactions, Client, Error as SubstrateError, + UnsignedTransaction, +}; +use relay_utils::{TrackedTransactionStatus, TransactionTracker}; +use sp_runtime::traits::Header as HeaderT; + +/// Submit headers-bridge initialization transaction. +pub async fn initialize< + E: Engine, + SourceChain: Chain, + TargetChain: ChainWithTransactions, + F, +>( + source_client: Client, + target_client: Client, + target_signer: AccountKeyPairOf, + prepare_initialize_transaction: F, + dry_run: bool, +) where + F: FnOnce( + TargetChain::Nonce, + E::InitializationData, + ) -> Result, SubstrateError> + + Send + + 'static, + TargetChain::AccountId: From<::Public>, +{ + let result = do_initialize::( + source_client, + target_client, + target_signer, + prepare_initialize_transaction, + dry_run, + ) + .await; + + match result { + Ok(Some(tx_status)) => match tx_status { + TrackedTransactionStatus::Lost => { + log::error!( + target: "bridge", + "Failed to execute {}-headers bridge initialization transaction on {}: {:?}.", + SourceChain::NAME, + TargetChain::NAME, + tx_status + ) + }, + TrackedTransactionStatus::Finalized(_) => { + log::info!( + target: "bridge", + "Successfully executed {}-headers bridge initialization transaction on {}: {:?}.", + SourceChain::NAME, + TargetChain::NAME, + tx_status + ) + }, + }, + Ok(None) => (), + Err(err) => log::error!( + target: "bridge", + "Failed to submit {}-headers bridge initialization transaction to {}: {:?}", + SourceChain::NAME, + TargetChain::NAME, + err, + ), + } +} + +/// Craft and submit initialization transaction, returning any error that may occur. +async fn do_initialize< + E: Engine, + SourceChain: Chain, + TargetChain: ChainWithTransactions, + F, +>( + source_client: Client, + target_client: Client, + target_signer: AccountKeyPairOf, + prepare_initialize_transaction: F, + dry_run: bool, +) -> Result< + Option>>, + Error::Number>, +> +where + F: FnOnce( + TargetChain::Nonce, + E::InitializationData, + ) -> Result, SubstrateError> + + Send + + 'static, + TargetChain::AccountId: From<::Public>, +{ + let is_initialized = E::is_initialized(&target_client) + .await + .map_err(|e| Error::IsInitializedRetrieve(SourceChain::NAME, TargetChain::NAME, e))?; + if is_initialized { + log::info!( + target: "bridge", + "{}-headers bridge at {} is already initialized. Skipping", + SourceChain::NAME, + TargetChain::NAME, + ); + if !dry_run { + return Ok(None) + } + } + + let initialization_data = E::prepare_initialization_data(source_client).await?; + log::info!( + target: "bridge", + "Prepared initialization data for {}-headers bridge at {}: {:?}", + SourceChain::NAME, + TargetChain::NAME, + initialization_data, + ); + + let tx_status = target_client + .submit_and_watch_signed_extrinsic(&target_signer, move |_, transaction_nonce| { + let tx = prepare_initialize_transaction(transaction_nonce, initialization_data); + if dry_run { + Err(SubstrateError::Custom( + "Not submitting extrinsic in `dry-run` mode!".to_string(), + )) + } else { + tx + } + }) + .await + .map_err(|err| Error::SubmitTransaction(TargetChain::NAME, err))? + .wait() + .await; + + Ok(Some(tx_status)) +} diff --git a/relays/lib-substrate-relay/src/finality/mod.rs b/relays/lib-substrate-relay/src/finality/mod.rs new file mode 100644 index 000000000000..b8cf27ea78fd --- /dev/null +++ b/relays/lib-substrate-relay/src/finality/mod.rs @@ -0,0 +1,224 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! finality proofs synchronization pipelines. + +use crate::{ + finality::{source::SubstrateFinalitySource, target::SubstrateFinalityTarget}, + finality_base::{engine::Engine, SubstrateFinalityPipeline, SubstrateFinalityProof}, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_header_chain::justification::GrandpaJustification; +use finality_relay::{FinalityPipeline, FinalitySyncPipeline}; +use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; +use relay_substrate_client::{ + transaction_stall_timeout, AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, + ChainWithTransactions, Client, HashOf, HeaderOf, SyncHeader, +}; +use relay_utils::metrics::MetricsParams; +use sp_core::Pair; +use std::{fmt::Debug, marker::PhantomData}; + +pub mod initialize; +pub mod source; +pub mod target; + +/// Default limit of recent finality proofs. +/// +/// Finality delay of 4096 blocks is unlikely to happen in practice in +/// Substrate+GRANDPA based chains (good to know). +pub(crate) const RECENT_FINALITY_PROOFS_LIMIT: usize = 4096; + +/// Convenience trait that adds bounds to `SubstrateFinalitySyncPipeline`. +pub trait BaseSubstrateFinalitySyncPipeline: + SubstrateFinalityPipeline +{ + /// Bounded `SubstrateFinalityPipeline::TargetChain`. + type BoundedTargetChain: ChainWithTransactions; + + /// Bounded `AccountIdOf`. + type BoundedTargetChainAccountId: From< as Pair>::Public> + + Send; +} + +impl BaseSubstrateFinalitySyncPipeline for T +where + T: SubstrateFinalityPipeline, + T::TargetChain: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, +{ + type BoundedTargetChain = T::TargetChain; + type BoundedTargetChainAccountId = AccountIdOf; +} + +/// Substrate -> Substrate finality proofs synchronization pipeline. +#[async_trait] +pub trait SubstrateFinalitySyncPipeline: BaseSubstrateFinalitySyncPipeline { + /// How submit finality proof call is built? + type SubmitFinalityProofCallBuilder: SubmitFinalityProofCallBuilder; + + /// Add relay guards if required. + async fn start_relay_guards( + target_client: &Client, + enable_version_guard: bool, + ) -> relay_substrate_client::Result<()> { + if enable_version_guard { + relay_substrate_client::guard::abort_on_spec_version_change( + target_client.clone(), + target_client.simple_runtime_version().await?.spec_version, + ); + } + Ok(()) + } +} + +/// Adapter that allows all `SubstrateFinalitySyncPipeline` to act as `FinalitySyncPipeline`. +#[derive(Clone, Debug)] +pub struct FinalitySyncPipelineAdapter { + _phantom: PhantomData

, +} + +impl FinalityPipeline for FinalitySyncPipelineAdapter

{ + const SOURCE_NAME: &'static str = P::SourceChain::NAME; + const TARGET_NAME: &'static str = P::TargetChain::NAME; + + type Hash = HashOf; + type Number = BlockNumberOf; + type FinalityProof = SubstrateFinalityProof

; +} + +impl FinalitySyncPipeline for FinalitySyncPipelineAdapter

{ + type ConsensusLogReader = >::ConsensusLogReader; + type Header = SyncHeader>; +} + +/// Different ways of building `submit_finality_proof` calls. +pub trait SubmitFinalityProofCallBuilder { + /// Given source chain header and its finality proofs, build call of `submit_finality_proof` + /// function of bridge GRANDPA module at the target chain. + fn build_submit_finality_proof_call( + header: SyncHeader>, + proof: SubstrateFinalityProof

, + ) -> CallOf; +} + +/// Building `submit_finality_proof` call when you have direct access to the target +/// chain runtime. +pub struct DirectSubmitGrandpaFinalityProofCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl SubmitFinalityProofCallBuilder

+ for DirectSubmitGrandpaFinalityProofCallBuilder +where + P: SubstrateFinalitySyncPipeline, + R: BridgeGrandpaConfig, + I: 'static, + R::BridgedChain: bp_runtime::Chain

>, + CallOf: From>, + P::FinalityEngine: + Engine>>, +{ + fn build_submit_finality_proof_call( + header: SyncHeader>, + proof: GrandpaJustification>, + ) -> CallOf { + BridgeGrandpaCall::::submit_finality_proof { + finality_target: Box::new(header.into_inner()), + justification: proof, + } + .into() + } +} + +/// Macro that generates `SubmitFinalityProofCallBuilder` implementation for the case when +/// you only have an access to the mocked version of target chain runtime. In this case you +/// should provide "name" of the call variant for the bridge GRANDPA calls and the "name" of +/// the variant for the `submit_finality_proof` call within that first option. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_submit_finality_proof_call_builder { + ($pipeline:ident, $mocked_builder:ident, $bridge_grandpa:path, $submit_finality_proof:path) => { + pub struct $mocked_builder; + + impl $crate::finality::SubmitFinalityProofCallBuilder<$pipeline> + for $mocked_builder + { + fn build_submit_finality_proof_call( + header: relay_substrate_client::SyncHeader< + relay_substrate_client::HeaderOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > + >, + proof: bp_header_chain::justification::GrandpaJustification< + relay_substrate_client::HeaderOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > + >, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::TargetChain + > { + bp_runtime::paste::item! { + $bridge_grandpa($submit_finality_proof { + finality_target: Box::new(header.into_inner()), + justification: proof + }) + } + } + } + }; +} + +/// Run Substrate-to-Substrate finality sync loop. +pub async fn run( + source_client: Client, + target_client: Client, + only_mandatory_headers: bool, + transaction_params: TransactionParams>, + metrics_params: MetricsParams, +) -> anyhow::Result<()> { + log::info!( + target: "bridge", + "Starting {} -> {} finality proof relay", + P::SourceChain::NAME, + P::TargetChain::NAME, + ); + + finality_relay::run( + SubstrateFinalitySource::

::new(source_client, None), + SubstrateFinalityTarget::

::new(target_client, transaction_params.clone()), + finality_relay::FinalitySyncParams { + tick: std::cmp::max( + P::SourceChain::AVERAGE_BLOCK_INTERVAL, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + ), + recent_finality_proofs_limit: RECENT_FINALITY_PROOFS_LIMIT, + stall_timeout: transaction_stall_timeout( + transaction_params.mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + relay_utils::STALL_TIMEOUT, + ), + only_mandatory_headers, + }, + metrics_params, + futures::future::pending(), + ) + .await + .map_err(|e| anyhow::format_err!("{}", e)) +} diff --git a/relays/lib-substrate-relay/src/finality/source.rs b/relays/lib-substrate-relay/src/finality/source.rs new file mode 100644 index 000000000000..c94af6108957 --- /dev/null +++ b/relays/lib-substrate-relay/src/finality/source.rs @@ -0,0 +1,259 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Default generic implementation of finality source for basic Substrate client. + +use crate::{ + finality::{FinalitySyncPipelineAdapter, SubstrateFinalitySyncPipeline}, + finality_base::{ + engine::Engine, finality_proofs, SubstrateFinalityProof, SubstrateFinalityProofsStream, + }, +}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use bp_header_chain::FinalityProof; +use codec::Decode; +use finality_relay::{SourceClient, SourceClientBase}; +use futures::{ + select, + stream::{try_unfold, Stream, StreamExt, TryStreamExt}, +}; +use num_traits::One; +use relay_substrate_client::{BlockNumberOf, BlockWithJustification, Client, Error, HeaderOf}; +use relay_utils::{relay_loop::Client as RelayClient, UniqueSaturatedInto}; + +/// Shared updatable reference to the maximal header number that we want to sync from the source. +pub type RequiredHeaderNumberRef = Arc::BlockNumber>>; + +/// Substrate node as finality source. +pub struct SubstrateFinalitySource { + client: Client, + maximal_header_number: Option>, +} + +impl SubstrateFinalitySource

{ + /// Create new headers source using given client. + pub fn new( + client: Client, + maximal_header_number: Option>, + ) -> Self { + SubstrateFinalitySource { client, maximal_header_number } + } + + /// Returns reference to the underlying RPC client. + pub fn client(&self) -> &Client { + &self.client + } + + /// Returns best finalized block number. + pub async fn on_chain_best_finalized_block_number( + &self, + ) -> Result, Error> { + // we **CAN** continue to relay finality proofs if source node is out of sync, because + // target node may be missing proofs that are already available at the source + self.client.best_finalized_header_number().await + } + + /// Return header and its justification of the given block or its descendant that + /// has a GRANDPA justification. + /// + /// This method is optimized for cases when `block_number` is close to the best finalized + /// chain block. + pub async fn prove_block_finality( + &self, + block_number: BlockNumberOf, + ) -> Result< + (relay_substrate_client::SyncHeader>, SubstrateFinalityProof

), + Error, + > { + // first, subscribe to proofs + let next_persistent_proof = + self.persistent_proofs_stream(block_number + One::one()).await?.fuse(); + let next_ephemeral_proof = self.ephemeral_proofs_stream(block_number).await?.fuse(); + + // in perfect world we'll need to return justfication for the requested `block_number` + let (header, maybe_proof) = self.header_and_finality_proof(block_number).await?; + if let Some(proof) = maybe_proof { + return Ok((header, proof)) + } + + // otherwise we don't care which header to return, so let's select first + futures::pin_mut!(next_persistent_proof, next_ephemeral_proof); + loop { + select! { + maybe_header_and_proof = next_persistent_proof.next() => match maybe_header_and_proof { + Some(header_and_proof) => return header_and_proof, + None => continue, + }, + maybe_header_and_proof = next_ephemeral_proof.next() => match maybe_header_and_proof { + Some(header_and_proof) => return header_and_proof, + None => continue, + }, + complete => return Err(Error::FinalityProofNotFound(block_number.unique_saturated_into())) + } + } + } + + /// Returns stream of headers and their persistent proofs, starting from given block. + async fn persistent_proofs_stream( + &self, + block_number: BlockNumberOf, + ) -> Result< + impl Stream< + Item = Result< + ( + relay_substrate_client::SyncHeader>, + SubstrateFinalityProof

, + ), + Error, + >, + >, + Error, + > { + let client = self.client.clone(); + let best_finalized_block_number = client.best_finalized_header_number().await?; + Ok(try_unfold((client, block_number), move |(client, current_block_number)| async move { + // if we've passed the `best_finalized_block_number`, we no longer need persistent + // justifications + if current_block_number > best_finalized_block_number { + return Ok(None) + } + + let (header, maybe_proof) = + header_and_finality_proof::

(&client, current_block_number).await?; + let next_block_number = current_block_number + One::one(); + let next_state = (client, next_block_number); + + Ok(Some((maybe_proof.map(|proof| (header, proof)), next_state))) + }) + .try_filter_map(|maybe_result| async { Ok(maybe_result) })) + } + + /// Returns stream of headers and their ephemeral proofs, starting from given block. + async fn ephemeral_proofs_stream( + &self, + block_number: BlockNumberOf, + ) -> Result< + impl Stream< + Item = Result< + ( + relay_substrate_client::SyncHeader>, + SubstrateFinalityProof

, + ), + Error, + >, + >, + Error, + > { + let client = self.client.clone(); + Ok(self.finality_proofs().await?.map(Ok).try_filter_map(move |proof| { + let client = client.clone(); + async move { + if proof.target_header_number() < block_number { + return Ok(None) + } + + let header = client.header_by_number(proof.target_header_number()).await?; + Ok(Some((header.into(), proof))) + } + })) + } +} + +impl Clone for SubstrateFinalitySource

{ + fn clone(&self) -> Self { + SubstrateFinalitySource { + client: self.client.clone(), + maximal_header_number: self.maximal_header_number.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateFinalitySource

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl SourceClientBase> + for SubstrateFinalitySource

+{ + type FinalityProofsStream = SubstrateFinalityProofsStream

; + + async fn finality_proofs(&self) -> Result { + finality_proofs::

(&self.client).await + } +} + +#[async_trait] +impl SourceClient> + for SubstrateFinalitySource

+{ + async fn best_finalized_block_number(&self) -> Result, Error> { + let mut finalized_header_number = self.on_chain_best_finalized_block_number().await?; + // never return block number larger than requested. This way we'll never sync headers + // past `maximal_header_number` + if let Some(ref maximal_header_number) = self.maximal_header_number { + let maximal_header_number = *maximal_header_number.lock().await; + if finalized_header_number > maximal_header_number { + finalized_header_number = maximal_header_number; + } + } + Ok(finalized_header_number) + } + + async fn header_and_finality_proof( + &self, + number: BlockNumberOf, + ) -> Result< + ( + relay_substrate_client::SyncHeader>, + Option>, + ), + Error, + > { + header_and_finality_proof::

(&self.client, number).await + } +} + +async fn header_and_finality_proof( + client: &Client, + number: BlockNumberOf, +) -> Result< + ( + relay_substrate_client::SyncHeader>, + Option>, + ), + Error, +> { + let header_hash = client.block_hash_by_number(number).await?; + let signed_block = client.get_block(Some(header_hash)).await?; + + let justification = signed_block + .justification(P::FinalityEngine::ID) + .map(|raw_justification| { + SubstrateFinalityProof::

::decode(&mut raw_justification.as_slice()) + }) + .transpose() + .map_err(Error::ResponseParseFailed)?; + + Ok((signed_block.header().into(), justification)) +} diff --git a/relays/lib-substrate-relay/src/finality/target.rs b/relays/lib-substrate-relay/src/finality/target.rs new file mode 100644 index 000000000000..930f0360311c --- /dev/null +++ b/relays/lib-substrate-relay/src/finality/target.rs @@ -0,0 +1,128 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate client as Substrate finality proof target. + +use crate::{ + finality::{ + FinalitySyncPipelineAdapter, SubmitFinalityProofCallBuilder, SubstrateFinalitySyncPipeline, + }, + finality_base::{best_synced_header_id, engine::Engine, SubstrateFinalityProof}, + TransactionParams, +}; + +use async_trait::async_trait; +use finality_relay::TargetClient; +use relay_substrate_client::{ + AccountKeyPairOf, Client, Error, HeaderIdOf, HeaderOf, SyncHeader, TransactionEra, + TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_runtime::traits::Header; + +/// Substrate client as Substrate finality target. +pub struct SubstrateFinalityTarget { + client: Client, + transaction_params: TransactionParams>, +} + +impl SubstrateFinalityTarget

{ + /// Create new Substrate headers target. + pub fn new( + client: Client, + transaction_params: TransactionParams>, + ) -> Self { + SubstrateFinalityTarget { client, transaction_params } + } + + /// Ensure that the bridge pallet at target chain is active. + pub async fn ensure_pallet_active(&self) -> Result<(), Error> { + let is_halted = P::FinalityEngine::is_halted(&self.client).await?; + if is_halted { + return Err(Error::BridgePalletIsHalted) + } + + let is_initialized = P::FinalityEngine::is_initialized(&self.client).await?; + if !is_initialized { + return Err(Error::BridgePalletIsNotInitialized) + } + + Ok(()) + } +} + +impl Clone for SubstrateFinalityTarget

{ + fn clone(&self) -> Self { + SubstrateFinalityTarget { + client: self.client.clone(), + transaction_params: self.transaction_params.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateFinalityTarget

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl TargetClient> + for SubstrateFinalityTarget

+{ + type TransactionTracker = TransactionTracker>; + + async fn best_finalized_source_block_id(&self) -> Result, Error> { + // we can't continue to relay finality if target node is out of sync, because + // it may have already received (some of) headers that we're going to relay + self.client.ensure_synced().await?; + // we can't relay finality if bridge pallet at target chain is halted + self.ensure_pallet_active().await?; + + Ok(best_synced_header_id::( + &self.client, + self.client.best_header().await?.hash(), + ) + .await? + .ok_or(Error::BridgePalletIsNotInitialized)?) + } + + async fn submit_finality_proof( + &self, + header: SyncHeader>, + mut proof: SubstrateFinalityProof

, + ) -> Result { + // runtime module at target chain may require optimized finality proof + P::FinalityEngine::optimize_proof(&self.client, &header, &mut proof).await?; + + // now we may submit optimized finality proof + let mortality = self.transaction_params.mortality; + let call = + P::SubmitFinalityProofCallBuilder::build_submit_finality_proof_call(header, proof); + self.client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, mortality))) + }, + ) + .await + } +} diff --git a/relays/lib-substrate-relay/src/finality_base/engine.rs b/relays/lib-substrate-relay/src/finality_base/engine.rs new file mode 100644 index 000000000000..831c1e7ad5b5 --- /dev/null +++ b/relays/lib-substrate-relay/src/finality_base/engine.rs @@ -0,0 +1,460 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Support of different finality engines, available in Substrate. + +use crate::error::Error; +use async_trait::async_trait; +use bp_header_chain::{ + justification::{ + verify_and_optimize_justification, GrandpaEquivocationsFinder, GrandpaJustification, + JustificationVerificationContext, + }, + max_expected_submit_finality_proof_arguments_size, AuthoritySet, ConsensusLogReader, + FinalityProof, FindEquivocations, GrandpaConsensusLogReader, HeaderFinalityInfo, + HeaderGrandpaInfo, StoredHeaderGrandpaInfo, +}; +use bp_runtime::{BasicOperatingMode, HeaderIdProvider, OperatingMode}; +use codec::{Decode, Encode}; +use num_traits::{One, Zero}; +use relay_substrate_client::{ + BlockNumberOf, Chain, ChainWithGrandpa, Client, Error as SubstrateError, HashOf, HeaderOf, + Subscription, SubstrateFinalityClient, SubstrateGrandpaFinalityClient, +}; +use sp_consensus_grandpa::{AuthorityList as GrandpaAuthoritiesSet, GRANDPA_ENGINE_ID}; +use sp_core::{storage::StorageKey, Bytes}; +use sp_runtime::{scale_info::TypeInfo, traits::Header, ConsensusEngineId, SaturatedConversion}; +use std::{fmt::Debug, marker::PhantomData}; + +/// Result of checking maximal expected call size. +pub enum MaxExpectedCallSizeCheck { + /// Size is ok and call will be refunded. + Ok, + /// The call size exceeds the maximal expected and relayer will only get partial refund. + Exceeds { + /// Actual call size. + call_size: u32, + /// Maximal expected call size. + max_call_size: u32, + }, +} + +/// Finality engine, used by the Substrate chain. +#[async_trait] +pub trait Engine: Send { + /// Unique consensus engine identifier. + const ID: ConsensusEngineId; + /// A reader that can extract the consensus log from the header digest and interpret it. + type ConsensusLogReader: ConsensusLogReader; + /// Type of Finality RPC client used by this engine. + type FinalityClient: SubstrateFinalityClient; + /// Type of finality proofs, used by consensus engine. + type FinalityProof: FinalityProof, BlockNumberOf> + Decode + Encode; + /// The context needed for verifying finality proofs. + type FinalityVerificationContext: Debug + Send; + /// The type of the equivocation proof used by the consensus engine. + type EquivocationProof: Clone + Debug + Send + Sync; + /// The equivocations finder. + type EquivocationsFinder: FindEquivocations< + Self::FinalityProof, + Self::FinalityVerificationContext, + Self::EquivocationProof, + >; + /// The type of the key owner proof used by the consensus engine. + type KeyOwnerProof: Send; + /// Type of bridge pallet initialization data. + type InitializationData: Debug + Send + Sync + 'static; + /// Type of bridge pallet operating mode. + type OperatingMode: OperatingMode + 'static; + + /// Returns storage at the bridged (target) chain that corresponds to some value that is + /// missing from the storage until bridge pallet is initialized. + /// + /// Note that we don't care about type of the value - just if it present or not. + fn is_initialized_key() -> StorageKey; + + /// Returns `Ok(true)` if finality pallet at the bridged chain has already been initialized. + async fn is_initialized( + target_client: &Client, + ) -> Result { + Ok(target_client + .raw_storage_value(Self::is_initialized_key(), None) + .await? + .is_some()) + } + + /// Returns storage key at the bridged (target) chain that corresponds to the variable + /// that holds the operating mode of the pallet. + fn pallet_operating_mode_key() -> StorageKey; + + /// Returns `Ok(true)` if finality pallet at the bridged chain is halted. + async fn is_halted( + target_client: &Client, + ) -> Result { + Ok(target_client + .storage_value::(Self::pallet_operating_mode_key(), None) + .await? + .map(|operating_mode| operating_mode.is_halted()) + .unwrap_or(false)) + } + + /// A method to subscribe to encoded finality proofs, given source client. + async fn source_finality_proofs( + source_client: &Client, + ) -> Result, SubstrateError> { + source_client.subscribe_finality_justifications::().await + } + + /// Optimize finality proof before sending it to the target node. + async fn optimize_proof( + target_client: &Client, + header: &C::Header, + proof: &mut Self::FinalityProof, + ) -> Result<(), SubstrateError>; + + /// Checks whether the given `header` and its finality `proof` fit the maximal expected + /// call size limit. If result is `MaxExpectedCallSizeCheck::Exceeds { .. }`, this + /// submission won't be fully refunded and relayer will spend its own funds on that. + fn check_max_expected_call_size( + header: &C::Header, + proof: &Self::FinalityProof, + ) -> MaxExpectedCallSizeCheck; + + /// Prepare initialization data for the finality bridge pallet. + async fn prepare_initialization_data( + client: Client, + ) -> Result, BlockNumberOf>>; + + /// Get the context needed for validating a finality proof. + async fn finality_verification_context( + target_client: &Client, + at: HashOf, + ) -> Result; + + /// Returns the finality info associated to the source headers synced with the target + /// at the provided block. + async fn synced_headers_finality_info( + target_client: &Client, + at: TargetChain::Hash, + ) -> Result< + Vec>, + SubstrateError, + >; + + /// Generate key ownership proof for the provided equivocation. + async fn generate_source_key_ownership_proof( + source_client: &Client, + at: C::Hash, + equivocation: &Self::EquivocationProof, + ) -> Result; +} + +/// GRANDPA finality engine. +pub struct Grandpa(PhantomData); + +impl Grandpa { + /// Read header by hash from the source client. + async fn source_header( + source_client: &Client, + header_hash: C::Hash, + ) -> Result, BlockNumberOf>> { + source_client + .header_by_hash(header_hash) + .await + .map_err(|err| Error::RetrieveHeader(C::NAME, header_hash, err)) + } + + /// Read GRANDPA authorities set at given header. + async fn source_authorities_set( + source_client: &Client, + header_hash: C::Hash, + ) -> Result, BlockNumberOf>> { + let raw_authorities_set = source_client + .grandpa_authorities_set(header_hash) + .await + .map_err(|err| Error::RetrieveAuthorities(C::NAME, header_hash, err))?; + GrandpaAuthoritiesSet::decode(&mut &raw_authorities_set[..]) + .map_err(|err| Error::DecodeAuthorities(C::NAME, header_hash, err)) + } +} + +#[async_trait] +impl Engine for Grandpa { + const ID: ConsensusEngineId = GRANDPA_ENGINE_ID; + type ConsensusLogReader = GrandpaConsensusLogReader<::Number>; + type FinalityClient = SubstrateGrandpaFinalityClient; + type FinalityProof = GrandpaJustification>; + type FinalityVerificationContext = JustificationVerificationContext; + type EquivocationProof = sp_consensus_grandpa::EquivocationProof, BlockNumberOf>; + type EquivocationsFinder = GrandpaEquivocationsFinder; + type KeyOwnerProof = C::KeyOwnerProof; + type InitializationData = bp_header_chain::InitializationData; + type OperatingMode = BasicOperatingMode; + + fn is_initialized_key() -> StorageKey { + bp_header_chain::storage_keys::best_finalized_key(C::WITH_CHAIN_GRANDPA_PALLET_NAME) + } + + fn pallet_operating_mode_key() -> StorageKey { + bp_header_chain::storage_keys::pallet_operating_mode_key(C::WITH_CHAIN_GRANDPA_PALLET_NAME) + } + + async fn optimize_proof( + target_client: &Client, + header: &C::Header, + proof: &mut Self::FinalityProof, + ) -> Result<(), SubstrateError> { + let verification_context = Grandpa::::finality_verification_context( + target_client, + target_client.best_header().await?.hash(), + ) + .await?; + // we're risking with race here - we have decided to submit justification some time ago and + // actual authorities set (which we have read now) may have changed, so this + // `optimize_justification` may fail. But if target chain is configured properly, it'll fail + // anyway, after we submit transaction and failing earlier is better. So - it is fine + verify_and_optimize_justification( + (header.hash(), *header.number()), + &verification_context, + proof, + ) + .map_err(|e| { + SubstrateError::Custom(format!( + "Failed to optimize {} GRANDPA jutification for header {:?}: {:?}", + C::NAME, + header.id(), + e, + )) + }) + } + + fn check_max_expected_call_size( + header: &C::Header, + proof: &Self::FinalityProof, + ) -> MaxExpectedCallSizeCheck { + let is_mandatory = Self::ConsensusLogReader::schedules_authorities_change(header.digest()); + let call_size: u32 = + header.encoded_size().saturating_add(proof.encoded_size()).saturated_into(); + let max_call_size = max_expected_submit_finality_proof_arguments_size::( + is_mandatory, + proof.commit.precommits.len().saturated_into(), + ); + if call_size > max_call_size { + MaxExpectedCallSizeCheck::Exceeds { call_size, max_call_size } + } else { + MaxExpectedCallSizeCheck::Ok + } + } + + /// Prepare initialization data for the GRANDPA verifier pallet. + async fn prepare_initialization_data( + source_client: Client, + ) -> Result, BlockNumberOf>> { + // In ideal world we just need to get best finalized header and then to read GRANDPA + // authorities set (`pallet_grandpa::CurrentSetId` + `GrandpaApi::grandpa_authorities()`) at + // this header. + // + // But now there are problems with this approach - `CurrentSetId` may return invalid value. + // So here we're waiting for the next justification, read the authorities set and then try + // to figure out the set id with bruteforce. + let justifications = Self::source_finality_proofs(&source_client) + .await + .map_err(|err| Error::Subscribe(C::NAME, err))?; + // Read next justification - the header that it finalizes will be used as initial header. + let justification = justifications + .next() + .await + .map_err(|e| Error::ReadJustification(C::NAME, e)) + .and_then(|justification| { + justification.ok_or(Error::ReadJustificationStreamEnded(C::NAME)) + })?; + + // Read initial header. + let justification: GrandpaJustification = + Decode::decode(&mut &justification.0[..]) + .map_err(|err| Error::DecodeJustification(C::NAME, err))?; + + let (initial_header_hash, initial_header_number) = + (justification.commit.target_hash, justification.commit.target_number); + + let initial_header = Self::source_header(&source_client, initial_header_hash).await?; + log::trace!(target: "bridge", "Selected {} initial header: {}/{}", + C::NAME, + initial_header_number, + initial_header_hash, + ); + + // Read GRANDPA authorities set at initial header. + let initial_authorities_set = + Self::source_authorities_set(&source_client, initial_header_hash).await?; + log::trace!(target: "bridge", "Selected {} initial authorities set: {:?}", + C::NAME, + initial_authorities_set, + ); + + // If initial header changes the GRANDPA authorities set, then we need previous authorities + // to verify justification. + let mut authorities_for_verification = initial_authorities_set.clone(); + let scheduled_change = GrandpaConsensusLogReader::>::find_scheduled_change( + initial_header.digest(), + ); + assert!( + scheduled_change.as_ref().map(|c| c.delay.is_zero()).unwrap_or(true), + "GRANDPA authorities change at {} scheduled to happen in {:?} blocks. We expect\ + regular change to have zero delay", + initial_header_hash, + scheduled_change.as_ref().map(|c| c.delay), + ); + let schedules_change = scheduled_change.is_some(); + if schedules_change { + authorities_for_verification = + Self::source_authorities_set(&source_client, *initial_header.parent_hash()).await?; + log::trace!( + target: "bridge", + "Selected {} header is scheduling GRANDPA authorities set changes. Using previous set: {:?}", + C::NAME, + authorities_for_verification, + ); + } + + // Now let's try to guess authorities set id by verifying justification. + let mut initial_authorities_set_id = 0; + let mut min_possible_block_number = C::BlockNumber::zero(); + loop { + log::trace!( + target: "bridge", "Trying {} GRANDPA authorities set id: {}", + C::NAME, + initial_authorities_set_id, + ); + + let is_valid_set_id = verify_and_optimize_justification( + (initial_header_hash, initial_header_number), + &AuthoritySet { + authorities: authorities_for_verification.clone(), + set_id: initial_authorities_set_id, + } + .try_into() + .map_err(|_| { + Error::ReadInvalidAuthorities(C::NAME, authorities_for_verification.clone()) + })?, + &mut justification.clone(), + ) + .is_ok(); + + if is_valid_set_id { + break + } + + initial_authorities_set_id += 1; + min_possible_block_number += One::one(); + if min_possible_block_number > initial_header_number { + // there can't be more authorities set changes than headers => if we have reached + // `initial_block_number` and still have not found correct value of + // `initial_authorities_set_id`, then something else is broken => fail + return Err(Error::GuessInitialAuthorities(C::NAME, initial_header_number)) + } + } + + Ok(bp_header_chain::InitializationData { + header: Box::new(initial_header), + authority_list: initial_authorities_set, + set_id: if schedules_change { + initial_authorities_set_id + 1 + } else { + initial_authorities_set_id + }, + operating_mode: BasicOperatingMode::Normal, + }) + } + + async fn finality_verification_context( + target_client: &Client, + at: HashOf, + ) -> Result { + let current_authority_set_key = bp_header_chain::storage_keys::current_authority_set_key( + C::WITH_CHAIN_GRANDPA_PALLET_NAME, + ); + let authority_set: AuthoritySet = target_client + .storage_value(current_authority_set_key, Some(at)) + .await? + .map(Ok) + .unwrap_or(Err(SubstrateError::Custom(format!( + "{} `CurrentAuthoritySet` is missing from the {} storage", + C::NAME, + TargetChain::NAME, + ))))?; + + authority_set.try_into().map_err(|e| { + SubstrateError::Custom(format!( + "{} `CurrentAuthoritySet` from the {} storage is invalid: {e:?}", + C::NAME, + TargetChain::NAME, + )) + }) + } + + async fn synced_headers_finality_info( + target_client: &Client, + at: TargetChain::Hash, + ) -> Result>>, SubstrateError> { + let stored_headers_grandpa_info: Vec>> = target_client + .typed_state_call(C::SYNCED_HEADERS_GRANDPA_INFO_METHOD.to_string(), (), Some(at)) + .await?; + + let mut headers_grandpa_info = vec![]; + for stored_header_grandpa_info in stored_headers_grandpa_info { + headers_grandpa_info.push(stored_header_grandpa_info.try_into().map_err(|e| { + SubstrateError::Custom(format!( + "{} `AuthoritySet` synced to {} is invalid: {e:?} ", + C::NAME, + TargetChain::NAME, + )) + })?); + } + + Ok(headers_grandpa_info) + } + + async fn generate_source_key_ownership_proof( + source_client: &Client, + at: C::Hash, + equivocation: &Self::EquivocationProof, + ) -> Result { + let set_id = equivocation.set_id(); + let offender = equivocation.offender(); + + let opaque_key_owner_proof = source_client + .generate_grandpa_key_ownership_proof(at, set_id, offender.clone()) + .await? + .ok_or(SubstrateError::Custom(format!( + "Couldn't get GRANDPA key ownership proof from {} at block: {at} \ + for offender: {:?}, set_id: {set_id} ", + C::NAME, + offender.clone(), + )))?; + + let key_owner_proof = + opaque_key_owner_proof.decode().ok_or(SubstrateError::Custom(format!( + "Couldn't decode GRANDPA `OpaqueKeyOwnnershipProof` from {} at block: {at} + to `{:?}` for offender: {:?}, set_id: {set_id}, at block: {at}", + C::NAME, + ::type_info().path, + offender.clone(), + )))?; + + Ok(key_owner_proof) + } +} diff --git a/relays/lib-substrate-relay/src/finality_base/mod.rs b/relays/lib-substrate-relay/src/finality_base/mod.rs new file mode 100644 index 000000000000..825960b1b3ef --- /dev/null +++ b/relays/lib-substrate-relay/src/finality_base/mod.rs @@ -0,0 +1,107 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! finality pipelines. + +pub mod engine; + +use crate::finality_base::engine::Engine; + +use async_trait::async_trait; +use bp_runtime::{HashOf, HeaderIdOf}; +use codec::Decode; +use futures::{stream::unfold, Stream, StreamExt}; +use relay_substrate_client::{Chain, Client, Error}; +use std::{fmt::Debug, pin::Pin}; + +/// Substrate -> Substrate finality related pipeline. +#[async_trait] +pub trait SubstrateFinalityPipeline: 'static + Clone + Debug + Send + Sync { + /// Headers of this chain are submitted to the `TargetChain`. + type SourceChain: Chain; + /// Headers of the `SourceChain` are submitted to this chain. + type TargetChain: Chain; + /// Finality engine. + type FinalityEngine: Engine; +} + +/// Substrate finality proof. Specific to the used `FinalityEngine`. +pub type SubstrateFinalityProof

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::FinalityProof; + +/// Substrate finality proofs stream. +pub type SubstrateFinalityProofsStream

= + Pin> + Send>>; + +/// Subscribe to new finality proofs. +pub async fn finality_proofs( + client: &Client, +) -> Result, Error> { + Ok(unfold( + P::FinalityEngine::source_finality_proofs(client).await?, + move |subscription| async move { + loop { + let log_error = |err| { + log::error!( + target: "bridge", + "Failed to read justification target from the {} justifications stream: {:?}", + P::SourceChain::NAME, + err, + ); + }; + + let next_justification = + subscription.next().await.map_err(|err| log_error(err.to_string())).ok()??; + + let decoded_justification = + >::FinalityProof::decode( + &mut &next_justification[..], + ); + + let justification = match decoded_justification { + Ok(j) => j, + Err(err) => { + log_error(format!("decode failed with error {err:?}")); + continue + }, + }; + + return Some((justification, subscription)) + } + }, + ) + .boxed()) +} + +/// Get the id of the best `SourceChain` header known to the `TargetChain` at the provided +/// target block using the exposed runtime API method. +/// +/// The runtime API method should be `FinalityApi::best_finalized()`. +pub async fn best_synced_header_id( + target_client: &Client, + at: HashOf, +) -> Result>, Error> +where + SourceChain: Chain, + TargetChain: Chain, +{ + // now let's read id of best finalized peer header at our best finalized block + target_client + .typed_state_call(SourceChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), (), Some(at)) + .await +} diff --git a/relays/lib-substrate-relay/src/lib.rs b/relays/lib-substrate-relay/src/lib.rs new file mode 100644 index 000000000000..6e6203866513 --- /dev/null +++ b/relays/lib-substrate-relay/src/lib.rs @@ -0,0 +1,128 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! The library of substrate relay. contains some public codes to provide to substrate relay. + +#![warn(missing_docs)] + +use relay_substrate_client::{Chain, ChainWithUtilityPallet, UtilityPallet}; + +use std::marker::PhantomData; + +pub mod equivocation; +pub mod error; +pub mod finality; +pub mod finality_base; +pub mod messages_lane; +pub mod messages_metrics; +pub mod messages_source; +pub mod messages_target; +pub mod on_demand; +pub mod parachains; + +/// Transaction creation parameters. +#[derive(Clone, Debug)] +pub struct TransactionParams { + /// Transactions author. + pub signer: TS, + /// Transactions mortality. + pub mortality: Option, +} + +/// Tagged relay account, which balance may be exposed as metrics by the relay. +#[derive(Clone, Debug)] +pub enum TaggedAccount { + /// Account, used to sign message (also headers and parachains) relay transactions from given + /// bridged chain. + Messages { + /// Account id. + id: AccountId, + /// Name of the bridged chain, which sends us messages or delivery confirmations. + bridged_chain: String, + }, +} + +impl TaggedAccount { + /// Returns reference to the account id. + pub fn id(&self) -> &AccountId { + match *self { + TaggedAccount::Messages { ref id, .. } => id, + } + } + + /// Returns stringified account tag. + pub fn tag(&self) -> String { + match *self { + TaggedAccount::Messages { ref bridged_chain, .. } => { + format!("{bridged_chain}Messages") + }, + } + } +} + +/// Batch call builder. +pub trait BatchCallBuilder: Clone + Send + Sync { + /// Create batch call from given calls vector. + fn build_batch_call(&self, _calls: Vec) -> Call; +} + +/// Batch call builder constructor. +pub trait BatchCallBuilderConstructor: Clone { + /// Call builder, used by this constructor. + type CallBuilder: BatchCallBuilder; + /// Create a new instance of a batch call builder. + fn new_builder() -> Option; +} + +/// Batch call builder based on `pallet-utility`. +#[derive(Clone)] +pub struct UtilityPalletBatchCallBuilder(PhantomData); + +impl BatchCallBuilder for UtilityPalletBatchCallBuilder +where + C: ChainWithUtilityPallet, +{ + fn build_batch_call(&self, calls: Vec) -> C::Call { + C::UtilityPallet::build_batch_call(calls) + } +} + +impl BatchCallBuilderConstructor for UtilityPalletBatchCallBuilder +where + C: ChainWithUtilityPallet, +{ + type CallBuilder = Self; + + fn new_builder() -> Option { + Some(Self(Default::default())) + } +} + +// A `BatchCallBuilderConstructor` that always returns `None`. +impl BatchCallBuilderConstructor for () { + type CallBuilder = (); + fn new_builder() -> Option { + None + } +} + +// Dummy `BatchCallBuilder` implementation that must never be used outside +// of the `impl BatchCallBuilderConstructor for ()` code. +impl BatchCallBuilder for () { + fn build_batch_call(&self, _calls: Vec) -> Call { + unreachable!("never called, because ()::new_builder() returns None; qed") + } +} diff --git a/relays/lib-substrate-relay/src/messages_lane.rs b/relays/lib-substrate-relay/src/messages_lane.rs new file mode 100644 index 000000000000..41f04c8f986e --- /dev/null +++ b/relays/lib-substrate-relay/src/messages_lane.rs @@ -0,0 +1,587 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools for supporting message lanes between two Substrate-based chains. + +use crate::{ + messages_source::{SubstrateMessagesProof, SubstrateMessagesSource}, + messages_target::{SubstrateMessagesDeliveryProof, SubstrateMessagesTarget}, + on_demand::OnDemandRelay, + BatchCallBuilder, BatchCallBuilderConstructor, TransactionParams, +}; + +use async_std::sync::Arc; +use bp_messages::{LaneId, MessageNonce}; +use bp_runtime::{ + AccountIdOf, Chain as _, EncodedOrDecodedCall, HeaderIdOf, TransactionEra, WeightExtraOps, +}; +use bridge_runtime_common::messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, +}; +use codec::Encode; +use frame_support::{dispatch::GetDispatchInfo, weights::Weight}; +use messages_relay::{message_lane::MessageLane, message_lane_loop::BatchTransaction}; +use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; +use relay_substrate_client::{ + transaction_stall_timeout, AccountKeyPairOf, BalanceOf, BlockNumberOf, CallOf, Chain, + ChainWithMessages, ChainWithTransactions, Client, Error as SubstrateError, HashOf, SignParam, + UnsignedTransaction, +}; +use relay_utils::{ + metrics::{GlobalMetrics, MetricsParams, StandaloneMetric}, + STALL_TIMEOUT, +}; +use sp_core::Pair; +use sp_runtime::traits::Zero; +use std::{convert::TryFrom, fmt::Debug, marker::PhantomData}; + +/// Substrate -> Substrate messages synchronization pipeline. +pub trait SubstrateMessageLane: 'static + Clone + Debug + Send + Sync { + /// Messages of this chain are relayed to the `TargetChain`. + type SourceChain: ChainWithMessages + ChainWithTransactions; + /// Messages from the `SourceChain` are dispatched on this chain. + type TargetChain: ChainWithMessages + ChainWithTransactions; + + /// How receive messages proof call is built? + type ReceiveMessagesProofCallBuilder: ReceiveMessagesProofCallBuilder; + /// How receive messages delivery proof call is built? + type ReceiveMessagesDeliveryProofCallBuilder: ReceiveMessagesDeliveryProofCallBuilder; + + /// How batch calls are built at the source chain? + type SourceBatchCallBuilder: BatchCallBuilderConstructor>; + /// How batch calls are built at the target chain? + type TargetBatchCallBuilder: BatchCallBuilderConstructor>; +} + +/// Adapter that allows all `SubstrateMessageLane` to act as `MessageLane`. +#[derive(Clone, Debug)] +pub struct MessageLaneAdapter { + _phantom: PhantomData

, +} + +impl MessageLane for MessageLaneAdapter

{ + const SOURCE_NAME: &'static str = P::SourceChain::NAME; + const TARGET_NAME: &'static str = P::TargetChain::NAME; + + type MessagesProof = SubstrateMessagesProof; + type MessagesReceivingProof = SubstrateMessagesDeliveryProof; + + type SourceChainBalance = BalanceOf; + type SourceHeaderNumber = BlockNumberOf; + type SourceHeaderHash = HashOf; + + type TargetHeaderNumber = BlockNumberOf; + type TargetHeaderHash = HashOf; +} + +/// Substrate <-> Substrate messages relay parameters. +pub struct MessagesRelayParams { + /// Messages source client. + pub source_client: Client, + /// Source transaction params. + pub source_transaction_params: TransactionParams>, + /// Messages target client. + pub target_client: Client, + /// Target transaction params. + pub target_transaction_params: TransactionParams>, + /// Optional on-demand source to target headers relay. + pub source_to_target_headers_relay: + Option>>, + /// Optional on-demand target to source headers relay. + pub target_to_source_headers_relay: + Option>>, + /// Identifier of lane that needs to be served. + pub lane_id: LaneId, + /// Messages relay limits. If not provided, the relay tries to determine it automatically, + /// using `TransactionPayment` pallet runtime API. + pub limits: Option, + /// Metrics parameters. + pub metrics_params: MetricsParams, +} + +/// Delivery transaction limits. +pub struct MessagesRelayLimits { + /// Maximal number of messages in the delivery transaction. + pub max_messages_in_single_batch: MessageNonce, + /// Maximal cumulative weight of messages in the delivery transaction. + pub max_messages_weight_in_single_batch: Weight, +} + +/// Batch transaction that brings headers + and messages delivery/receiving confirmations to the +/// source node. +#[derive(Clone)] +pub struct BatchProofTransaction>> { + builder: B::CallBuilder, + proved_header: HeaderIdOf, + prove_calls: Vec>, + + /// Using `fn() -> B` in order to avoid implementing `Send` for `B`. + _phantom: PhantomData B>, +} + +impl>> std::fmt::Debug + for BatchProofTransaction +{ + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("BatchProofTransaction") + .field("proved_header", &self.proved_header) + .finish() + } +} + +impl>> + BatchProofTransaction +{ + /// Creates a new instance of `BatchProofTransaction`. + pub async fn new( + relay: Arc>, + block_num: BlockNumberOf, + ) -> Result, SubstrateError> { + if let Some(builder) = B::new_builder() { + let (proved_header, prove_calls) = relay.prove_header(block_num).await?; + return Ok(Some(Self { + builder, + proved_header, + prove_calls, + _phantom: Default::default(), + })) + } + + Ok(None) + } + + /// Return a batch call that includes the provided call. + pub fn append_call_and_build(mut self, call: CallOf) -> CallOf { + self.prove_calls.push(call); + self.builder.build_batch_call(self.prove_calls) + } +} + +impl>> + BatchTransaction> for BatchProofTransaction +{ + fn required_header_id(&self) -> HeaderIdOf { + self.proved_header + } +} + +/// Run Substrate-to-Substrate messages sync loop. +pub async fn run(params: MessagesRelayParams

) -> anyhow::Result<()> +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom>, +{ + // 2/3 is reserved for proofs and tx overhead + let max_messages_size_in_single_batch = P::TargetChain::max_extrinsic_size() / 3; + let limits = match params.limits { + Some(limits) => limits, + None => + select_delivery_transaction_limits_rpc::

( + ¶ms, + P::TargetChain::max_extrinsic_weight(), + P::SourceChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + ) + .await?, + }; + let (max_messages_in_single_batch, max_messages_weight_in_single_batch) = + (limits.max_messages_in_single_batch / 2, limits.max_messages_weight_in_single_batch / 2); + + let source_client = params.source_client; + let target_client = params.target_client; + let relayer_id_at_source: AccountIdOf = + params.source_transaction_params.signer.public().into(); + + log::info!( + target: "bridge", + "Starting {} -> {} messages relay.\n\t\ + {} relayer account id: {:?}\n\t\ + Max messages in single transaction: {}\n\t\ + Max messages size in single transaction: {}\n\t\ + Max messages weight in single transaction: {}\n\t\ + Tx mortality: {:?} (~{}m)/{:?} (~{}m)", + P::SourceChain::NAME, + P::TargetChain::NAME, + P::SourceChain::NAME, + relayer_id_at_source, + max_messages_in_single_batch, + max_messages_size_in_single_batch, + max_messages_weight_in_single_batch, + params.source_transaction_params.mortality, + transaction_stall_timeout( + params.source_transaction_params.mortality, + P::SourceChain::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ).as_secs_f64() / 60.0f64, + params.target_transaction_params.mortality, + transaction_stall_timeout( + params.target_transaction_params.mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ).as_secs_f64() / 60.0f64, + ); + + messages_relay::message_lane_loop::run( + messages_relay::message_lane_loop::Params { + lane: params.lane_id, + source_tick: P::SourceChain::AVERAGE_BLOCK_INTERVAL, + target_tick: P::TargetChain::AVERAGE_BLOCK_INTERVAL, + reconnect_delay: relay_utils::relay_loop::RECONNECT_DELAY, + delivery_params: messages_relay::message_lane_loop::MessageDeliveryParams { + max_unrewarded_relayer_entries_at_target: + P::SourceChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + max_unconfirmed_nonces_at_target: + P::SourceChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + max_messages_in_single_batch, + max_messages_weight_in_single_batch, + max_messages_size_in_single_batch, + }, + }, + SubstrateMessagesSource::

::new( + source_client.clone(), + target_client.clone(), + params.lane_id, + params.source_transaction_params, + params.target_to_source_headers_relay, + ), + SubstrateMessagesTarget::

::new( + target_client, + source_client, + params.lane_id, + relayer_id_at_source, + params.target_transaction_params, + params.source_to_target_headers_relay, + ), + { + GlobalMetrics::new()?.register_and_spawn(¶ms.metrics_params.registry)?; + params.metrics_params + }, + futures::future::pending(), + ) + .await + .map_err(Into::into) +} + +/// Different ways of building `receive_messages_proof` calls. +pub trait ReceiveMessagesProofCallBuilder { + /// Given messages proof, build call of `receive_messages_proof` function of bridge + /// messages module at the target chain. + fn build_receive_messages_proof_call( + relayer_id_at_source: AccountIdOf, + proof: SubstrateMessagesProof, + messages_count: u32, + dispatch_weight: Weight, + trace_call: bool, + ) -> CallOf; +} + +/// Building `receive_messages_proof` call when you have direct access to the target +/// chain runtime. +pub struct DirectReceiveMessagesProofCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl ReceiveMessagesProofCallBuilder

for DirectReceiveMessagesProofCallBuilder +where + P: SubstrateMessageLane, + R: BridgeMessagesConfig>, + I: 'static, + R::SourceHeaderChain: bp_messages::target_chain::SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof>, + >, + CallOf: From> + GetDispatchInfo, +{ + fn build_receive_messages_proof_call( + relayer_id_at_source: AccountIdOf, + proof: SubstrateMessagesProof, + messages_count: u32, + dispatch_weight: Weight, + trace_call: bool, + ) -> CallOf { + let call: CallOf = BridgeMessagesCall::::receive_messages_proof { + relayer_id_at_bridged_chain: relayer_id_at_source, + proof: proof.1, + messages_count, + dispatch_weight, + } + .into(); + if trace_call { + // this trace isn't super-accurate, because limits are for transactions and we + // have a call here, but it provides required information + log::trace!( + target: "bridge", + "Prepared {} -> {} messages delivery call. Weight: {}/{}, size: {}/{}", + P::SourceChain::NAME, + P::TargetChain::NAME, + call.get_dispatch_info().weight, + P::TargetChain::max_extrinsic_weight(), + call.encode().len(), + P::TargetChain::max_extrinsic_size(), + ); + } + call + } +} + +/// Macro that generates `ReceiveMessagesProofCallBuilder` implementation for the case when +/// you only have an access to the mocked version of target chain runtime. In this case you +/// should provide "name" of the call variant for the bridge messages calls and the "name" of +/// the variant for the `receive_messages_proof` call within that first option. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_receive_message_proof_call_builder { + ($pipeline:ident, $mocked_builder:ident, $bridge_messages:path, $receive_messages_proof:path) => { + pub struct $mocked_builder; + + impl $crate::messages_lane::ReceiveMessagesProofCallBuilder<$pipeline> + for $mocked_builder + { + fn build_receive_messages_proof_call( + relayer_id_at_source: relay_substrate_client::AccountIdOf< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + >, + proof: $crate::messages_source::SubstrateMessagesProof< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + >, + messages_count: u32, + dispatch_weight: bp_messages::Weight, + _trace_call: bool, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::TargetChain + > { + bp_runtime::paste::item! { + $bridge_messages($receive_messages_proof { + relayer_id_at_bridged_chain: relayer_id_at_source, + proof: proof.1, + messages_count: messages_count, + dispatch_weight: dispatch_weight, + }) + } + } + } + }; +} + +/// Different ways of building `receive_messages_delivery_proof` calls. +pub trait ReceiveMessagesDeliveryProofCallBuilder { + /// Given messages delivery proof, build call of `receive_messages_delivery_proof` function of + /// bridge messages module at the source chain. + fn build_receive_messages_delivery_proof_call( + proof: SubstrateMessagesDeliveryProof, + trace_call: bool, + ) -> CallOf; +} + +/// Building `receive_messages_delivery_proof` call when you have direct access to the source +/// chain runtime. +pub struct DirectReceiveMessagesDeliveryProofCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl ReceiveMessagesDeliveryProofCallBuilder

+ for DirectReceiveMessagesDeliveryProofCallBuilder +where + P: SubstrateMessageLane, + R: BridgeMessagesConfig, + I: 'static, + R::TargetHeaderChain: bp_messages::source_chain::TargetHeaderChain< + R::OutboundPayload, + R::AccountId, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>, + >, + CallOf: From> + GetDispatchInfo, +{ + fn build_receive_messages_delivery_proof_call( + proof: SubstrateMessagesDeliveryProof, + trace_call: bool, + ) -> CallOf { + let call: CallOf = + BridgeMessagesCall::::receive_messages_delivery_proof { + proof: proof.1, + relayers_state: proof.0, + } + .into(); + if trace_call { + // this trace isn't super-accurate, because limits are for transactions and we + // have a call here, but it provides required information + log::trace!( + target: "bridge", + "Prepared {} -> {} delivery confirmation transaction. Weight: {}/{}, size: {}/{}", + P::TargetChain::NAME, + P::SourceChain::NAME, + call.get_dispatch_info().weight, + P::SourceChain::max_extrinsic_weight(), + call.encode().len(), + P::SourceChain::max_extrinsic_size(), + ); + } + call + } +} + +/// Macro that generates `ReceiveMessagesDeliveryProofCallBuilder` implementation for the case when +/// you only have an access to the mocked version of source chain runtime. In this case you +/// should provide "name" of the call variant for the bridge messages calls and the "name" of +/// the variant for the `receive_messages_delivery_proof` call within that first option. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_receive_message_delivery_proof_call_builder { + ($pipeline:ident, $mocked_builder:ident, $bridge_messages:path, $receive_messages_delivery_proof:path) => { + pub struct $mocked_builder; + + impl $crate::messages_lane::ReceiveMessagesDeliveryProofCallBuilder<$pipeline> + for $mocked_builder + { + fn build_receive_messages_delivery_proof_call( + proof: $crate::messages_target::SubstrateMessagesDeliveryProof< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::TargetChain + >, + _trace_call: bool, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + > { + bp_runtime::paste::item! { + $bridge_messages($receive_messages_delivery_proof { + proof: proof.1, + relayers_state: proof.0 + }) + } + } + } + }; +} + +/// Returns maximal number of messages and their maximal cumulative dispatch weight. +async fn select_delivery_transaction_limits_rpc( + params: &MessagesRelayParams

, + max_extrinsic_weight: Weight, + max_unconfirmed_messages_at_inbound_lane: MessageNonce, +) -> anyhow::Result +where + AccountIdOf: From< as Pair>::Public>, +{ + // We may try to guess accurate value, based on maximal number of messages and per-message + // weight overhead, but the relay loop isn't using this info in a super-accurate way anyway. + // So just a rough guess: let's say 1/3 of max tx weight is for tx itself and the rest is + // for messages dispatch. + + // Another thing to keep in mind is that our runtimes (when this code was written) accept + // messages with dispatch weight <= max_extrinsic_weight/2. So we can't reserve less than + // that for dispatch. + + let weight_for_delivery_tx = max_extrinsic_weight / 3; + let weight_for_messages_dispatch = max_extrinsic_weight - weight_for_delivery_tx; + + // weight of empty message delivery with outbound lane state + let delivery_tx_with_zero_messages = dummy_messages_delivery_transaction::

(params, 0)?; + let delivery_tx_with_zero_messages_weight = params + .target_client + .extimate_extrinsic_weight(delivery_tx_with_zero_messages) + .await + .map_err(|e| { + anyhow::format_err!("Failed to estimate delivery extrinsic weight: {:?}", e) + })?; + + // weight of single message delivery with outbound lane state + let delivery_tx_with_one_message = dummy_messages_delivery_transaction::

(params, 1)?; + let delivery_tx_with_one_message_weight = params + .target_client + .extimate_extrinsic_weight(delivery_tx_with_one_message) + .await + .map_err(|e| { + anyhow::format_err!("Failed to estimate delivery extrinsic weight: {:?}", e) + })?; + + // message overhead is roughly `delivery_tx_with_one_message_weight - + // delivery_tx_with_zero_messages_weight` + let delivery_tx_weight_rest = weight_for_delivery_tx - delivery_tx_with_zero_messages_weight; + let delivery_tx_message_overhead = + delivery_tx_with_one_message_weight.saturating_sub(delivery_tx_with_zero_messages_weight); + + let max_number_of_messages = std::cmp::min( + delivery_tx_weight_rest + .min_components_checked_div(delivery_tx_message_overhead) + .unwrap_or(u64::MAX), + max_unconfirmed_messages_at_inbound_lane, + ); + + assert!( + max_number_of_messages > 0, + "Relay should fit at least one message in every delivery transaction", + ); + assert!( + weight_for_messages_dispatch.ref_time() >= max_extrinsic_weight.ref_time() / 2, + "Relay shall be able to deliver messages with dispatch weight = max_extrinsic_weight / 2", + ); + + Ok(MessagesRelayLimits { + max_messages_in_single_batch: max_number_of_messages, + max_messages_weight_in_single_batch: weight_for_messages_dispatch, + }) +} + +/// Returns dummy message delivery transaction with zero messages and `1kb` proof. +fn dummy_messages_delivery_transaction( + params: &MessagesRelayParams

, + messages: u32, +) -> anyhow::Result<::SignedTransaction> +where + AccountIdOf: From< as Pair>::Public>, +{ + // we don't care about any call values here, because all that the estimation RPC does + // is calls `GetDispatchInfo::get_dispatch_info` for the wrapped call. So we only are + // interested in values that affect call weight - e.g. number of messages and the + // storage proof size + + let dummy_messages_delivery_call = + P::ReceiveMessagesProofCallBuilder::build_receive_messages_proof_call( + params.source_transaction_params.signer.public().into(), + ( + Weight::zero(), + FromBridgedChainMessagesProof { + bridged_header_hash: Default::default(), + // we may use per-chain `EXTRA_STORAGE_PROOF_SIZE`, but since we don't need + // exact values, this global estimation is fine + storage_proof: vec![vec![ + 42u8; + pallet_bridge_messages::EXTRA_STORAGE_PROOF_SIZE + as usize + ]], + lane: Default::default(), + nonces_start: 1, + nonces_end: messages as u64, + }, + ), + messages, + Weight::zero(), + false, + ); + P::TargetChain::sign_transaction( + SignParam { + spec_version: 0, + transaction_version: 0, + genesis_hash: Default::default(), + signer: params.target_transaction_params.signer.clone(), + }, + UnsignedTransaction { + call: EncodedOrDecodedCall::Decoded(dummy_messages_delivery_call), + nonce: Zero::zero(), + tip: Zero::zero(), + era: TransactionEra::Immortal, + }, + ) + .map_err(Into::into) +} diff --git a/relays/lib-substrate-relay/src/messages_metrics.rs b/relays/lib-substrate-relay/src/messages_metrics.rs new file mode 100644 index 000000000000..27bf6186c3ba --- /dev/null +++ b/relays/lib-substrate-relay/src/messages_metrics.rs @@ -0,0 +1,190 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools for supporting message lanes between two Substrate-based chains. + +use crate::TaggedAccount; + +use bp_messages::LaneId; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::StorageDoubleMapKeyProvider; +use codec::Decode; +use frame_system::AccountInfo; +use pallet_balances::AccountData; +use relay_substrate_client::{ + metrics::{FloatStorageValue, FloatStorageValueMetric}, + AccountIdOf, BalanceOf, Chain, ChainWithBalances, ChainWithMessages, Client, + Error as SubstrateError, NonceOf, +}; +use relay_utils::metrics::{MetricsParams, StandaloneMetric}; +use sp_core::storage::StorageData; +use sp_runtime::{FixedPointNumber, FixedU128}; +use std::{convert::TryFrom, fmt::Debug, marker::PhantomData}; + +/// Add relay accounts balance metrics. +pub async fn add_relay_balances_metrics( + client: Client, + metrics: &MetricsParams, + relay_accounts: &Vec>>, + lanes: &[LaneId], +) -> anyhow::Result<()> +where + BalanceOf: Into + std::fmt::Debug, +{ + if relay_accounts.is_empty() { + return Ok(()) + } + + // if `tokenDecimals` is missing from system properties, we'll be using + let token_decimals = client + .token_decimals() + .await? + .map(|token_decimals| { + log::info!(target: "bridge", "Read `tokenDecimals` for {}: {}", C::NAME, token_decimals); + token_decimals + }) + .unwrap_or_else(|| { + // turns out it is normal not to have this property - e.g. when polkadot binary is + // started using `polkadot-local` chain. Let's use minimal nominal here + log::info!(target: "bridge", "Using default (zero) `tokenDecimals` value for {}", C::NAME); + 0 + }); + let token_decimals = u32::try_from(token_decimals).map_err(|e| { + anyhow::format_err!( + "Token decimals value ({}) of {} doesn't fit into u32: {:?}", + token_decimals, + C::NAME, + e, + ) + })?; + + for account in relay_accounts { + let relay_account_balance_metric = FloatStorageValueMetric::new( + AccountBalanceFromAccountInfo:: { token_decimals, _phantom: Default::default() }, + client.clone(), + C::account_info_storage_key(account.id()), + format!("at_{}_relay_{}_balance", C::NAME, account.tag()), + format!("Balance of the {} relay account at the {}", account.tag(), C::NAME), + )?; + relay_account_balance_metric.register_and_spawn(&metrics.registry)?; + + if let Some(relayers_pallet_name) = BC::WITH_CHAIN_RELAYERS_PALLET_NAME { + for lane in lanes { + FloatStorageValueMetric::new( + AccountBalance:: { token_decimals, _phantom: Default::default() }, + client.clone(), + bp_relayers::RelayerRewardsKeyProvider::, BalanceOf>::final_key( + relayers_pallet_name, + account.id(), + &RewardsAccountParams::new(*lane, BC::ID, RewardsAccountOwner::ThisChain), + ), + format!("at_{}_relay_{}_reward_for_msgs_from_{}_on_lane_{}", C::NAME, account.tag(), BC::NAME, hex::encode(lane.as_ref())), + format!("Reward of the {} relay account at {} for delivering messages from {} on lane {:?}", account.tag(), C::NAME, BC::NAME, lane), + )?.register_and_spawn(&metrics.registry)?; + + FloatStorageValueMetric::new( + AccountBalance:: { token_decimals, _phantom: Default::default() }, + client.clone(), + bp_relayers::RelayerRewardsKeyProvider::, BalanceOf>::final_key( + relayers_pallet_name, + account.id(), + &RewardsAccountParams::new(*lane, BC::ID, RewardsAccountOwner::BridgedChain), + ), + format!("at_{}_relay_{}_reward_for_msgs_to_{}_on_lane_{}", C::NAME, account.tag(), BC::NAME, hex::encode(lane.as_ref())), + format!("Reward of the {} relay account at {} for delivering messages confirmations from {} on lane {:?}", account.tag(), C::NAME, BC::NAME, lane), + )?.register_and_spawn(&metrics.registry)?; + } + } + } + + Ok(()) +} + +/// Adapter for `FloatStorageValueMetric` to decode account free balance. +#[derive(Clone, Debug)] +struct AccountBalanceFromAccountInfo { + token_decimals: u32, + _phantom: PhantomData, +} + +impl FloatStorageValue for AccountBalanceFromAccountInfo +where + C: Chain, + BalanceOf: Into, +{ + type Value = FixedU128; + + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError> { + maybe_raw_value + .map(|raw_value| { + AccountInfo::, AccountData>>::decode(&mut &raw_value.0[..]) + .map_err(SubstrateError::ResponseParseFailed) + .map(|account_data| { + convert_to_token_balance(account_data.data.free.into(), self.token_decimals) + }) + }) + .transpose() + } +} + +/// Adapter for `FloatStorageValueMetric` to decode account free balance. +#[derive(Clone, Debug)] +struct AccountBalance { + token_decimals: u32, + _phantom: PhantomData, +} + +impl FloatStorageValue for AccountBalance +where + C: Chain, + BalanceOf: Into, +{ + type Value = FixedU128; + + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError> { + maybe_raw_value + .map(|raw_value| { + BalanceOf::::decode(&mut &raw_value.0[..]) + .map_err(SubstrateError::ResponseParseFailed) + .map(|balance| convert_to_token_balance(balance.into(), self.token_decimals)) + }) + .transpose() + } +} + +/// Convert from raw `u128` balance (nominated in smallest chain token units) to the float regular +/// tokens value. +fn convert_to_token_balance(balance: u128, token_decimals: u32) -> FixedU128 { + FixedU128::from_inner(balance.saturating_mul(FixedU128::DIV / 10u128.pow(token_decimals))) +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn token_decimals_used_properly() { + let plancks = 425_000_000_000; + let token_decimals = 10; + let dots = convert_to_token_balance(plancks, token_decimals); + assert_eq!(dots, FixedU128::saturating_from_rational(425, 10)); + } +} diff --git a/relays/lib-substrate-relay/src/messages_source.rs b/relays/lib-substrate-relay/src/messages_source.rs new file mode 100644 index 000000000000..f128546bad3f --- /dev/null +++ b/relays/lib-substrate-relay/src/messages_source.rs @@ -0,0 +1,723 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate client as Substrate messages source. The chain we connect to should have +//! runtime that implements `HeaderApi` to allow bridging with +//! `` chain. + +use crate::{ + finality_base::best_synced_header_id, + messages_lane::{ + BatchProofTransaction, MessageLaneAdapter, ReceiveMessagesDeliveryProofCallBuilder, + SubstrateMessageLane, + }, + on_demand::OnDemandRelay, + TransactionParams, +}; + +use async_std::sync::Arc; +use async_trait::async_trait; +use bp_messages::{ + storage_keys::{operating_mode_key, outbound_lane_data_key}, + InboundMessageDetails, LaneId, MessageNonce, MessagePayload, MessagesOperatingMode, + OutboundLaneData, OutboundMessageDetails, +}; +use bp_runtime::{BasicOperatingMode, HeaderIdProvider}; +use bridge_runtime_common::messages::target::FromBridgedChainMessagesProof; +use codec::Encode; +use frame_support::weights::Weight; +use messages_relay::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{ + ClientState, MessageDetails, MessageDetailsMap, MessageProofParameters, SourceClient, + SourceClientState, + }, +}; +use num_traits::Zero; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, BalanceOf, Chain, ChainWithMessages, Client, + Error as SubstrateError, HashOf, HeaderIdOf, TransactionEra, TransactionTracker, + UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_core::Pair; +use std::ops::RangeInclusive; + +/// Intermediate message proof returned by the source Substrate node. Includes everything +/// required to submit to the target node: cumulative dispatch weight of bundled messages and +/// the proof itself. +pub type SubstrateMessagesProof = (Weight, FromBridgedChainMessagesProof>); +type MessagesToRefine<'a> = Vec<(MessagePayload, &'a mut OutboundMessageDetails)>; + +/// Substrate client as Substrate messages source. +pub struct SubstrateMessagesSource { + source_client: Client, + target_client: Client, + lane_id: LaneId, + transaction_params: TransactionParams>, + target_to_source_headers_relay: Option>>, +} + +impl SubstrateMessagesSource

{ + /// Create new Substrate headers source. + pub fn new( + source_client: Client, + target_client: Client, + lane_id: LaneId, + transaction_params: TransactionParams>, + target_to_source_headers_relay: Option< + Arc>, + >, + ) -> Self { + SubstrateMessagesSource { + source_client, + target_client, + lane_id, + transaction_params, + target_to_source_headers_relay, + } + } + + /// Read outbound lane state from the on-chain storage at given block. + async fn outbound_lane_data( + &self, + id: SourceHeaderIdOf>, + ) -> Result, SubstrateError> { + self.source_client + .storage_value( + outbound_lane_data_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + ), + Some(id.1), + ) + .await + } + + /// Ensure that the messages pallet at source chain is active. + async fn ensure_pallet_active(&self) -> Result<(), SubstrateError> { + ensure_messages_pallet_active::(&self.source_client).await + } +} + +impl Clone for SubstrateMessagesSource

{ + fn clone(&self) -> Self { + Self { + source_client: self.source_client.clone(), + target_client: self.target_client.clone(), + lane_id: self.lane_id, + transaction_params: self.transaction_params.clone(), + target_to_source_headers_relay: self.target_to_source_headers_relay.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateMessagesSource

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + // since the client calls RPC methods on both sides, we need to reconnect both + self.source_client.reconnect().await?; + self.target_client.reconnect().await?; + + // call reconnect on on-demand headers relay, because we may use different chains there + // and the error that has lead to reconnect may have came from those other chains + // (see `require_target_header_on_source`) + // + // this may lead to multiple reconnects to the same node during the same call and it + // needs to be addressed in the future + // TODO: https://github.com/paritytech/parity-bridges-common/issues/1928 + if let Some(ref mut target_to_source_headers_relay) = self.target_to_source_headers_relay { + target_to_source_headers_relay.reconnect().await?; + } + + Ok(()) + } +} + +#[async_trait] +impl SourceClient> for SubstrateMessagesSource

+where + AccountIdOf: From< as Pair>::Public>, +{ + type BatchTransaction = + BatchProofTransaction; + type TransactionTracker = TransactionTracker>; + + async fn state(&self) -> Result>, SubstrateError> { + // we can't continue to deliver confirmations if source node is out of sync, because + // it may have already received confirmations that we're going to deliver + // + // we can't continue to deliver messages if target node is out of sync, because + // it may have already received (some of) messages that we're going to deliver + self.source_client.ensure_synced().await?; + self.target_client.ensure_synced().await?; + // we can't relay confirmations if messages pallet at source chain is halted + self.ensure_pallet_active().await?; + + read_client_state(&self.source_client, Some(&self.target_client)).await + } + + async fn latest_generated_nonce( + &self, + id: SourceHeaderIdOf>, + ) -> Result<(SourceHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is sent + let latest_generated_nonce = self + .outbound_lane_data(id) + .await? + .map(|data| data.latest_generated_nonce) + .unwrap_or(0); + Ok((id, latest_generated_nonce)) + } + + async fn latest_confirmed_received_nonce( + &self, + id: SourceHeaderIdOf>, + ) -> Result<(SourceHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is sent + let latest_received_nonce = self + .outbound_lane_data(id) + .await? + .map(|data| data.latest_received_nonce) + .unwrap_or(0); + Ok((id, latest_received_nonce)) + } + + async fn generated_message_details( + &self, + id: SourceHeaderIdOf>, + nonces: RangeInclusive, + ) -> Result>, SubstrateError> { + let mut out_msgs_details = self + .source_client + .typed_state_call::<_, Vec<_>>( + P::TargetChain::TO_CHAIN_MESSAGE_DETAILS_METHOD.into(), + (self.lane_id, *nonces.start(), *nonces.end()), + Some(id.1), + ) + .await?; + validate_out_msgs_details::(&out_msgs_details, nonces)?; + + // prepare arguments of the inbound message details call (if we need it) + let mut msgs_to_refine = vec![]; + for out_msg_details in out_msgs_details.iter_mut() { + // in our current strategy all messages are supposed to be paid at the target chain + + // for pay-at-target messages we may want to ask target chain for + // refined dispatch weight + let msg_key = bp_messages::storage_keys::message_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + out_msg_details.nonce, + ); + let msg_payload: MessagePayload = + self.source_client.storage_value(msg_key, Some(id.1)).await?.ok_or_else(|| { + SubstrateError::Custom(format!( + "Message to {} {:?}/{} is missing from runtime the storage of {} at {:?}", + P::TargetChain::NAME, + self.lane_id, + out_msg_details.nonce, + P::SourceChain::NAME, + id, + )) + })?; + + msgs_to_refine.push((msg_payload, out_msg_details)); + } + + for mut msgs_to_refine_batch in + split_msgs_to_refine::(self.lane_id, msgs_to_refine)? + { + let in_msgs_details = self + .target_client + .typed_state_call::<_, Vec>( + P::SourceChain::FROM_CHAIN_MESSAGE_DETAILS_METHOD.into(), + (self.lane_id, &msgs_to_refine_batch), + None, + ) + .await?; + if in_msgs_details.len() != msgs_to_refine_batch.len() { + return Err(SubstrateError::Custom(format!( + "Call of {} at {} has returned {} entries instead of expected {}", + P::SourceChain::FROM_CHAIN_MESSAGE_DETAILS_METHOD, + P::TargetChain::NAME, + in_msgs_details.len(), + msgs_to_refine_batch.len(), + ))) + } + for ((_, out_msg_details), in_msg_details) in + msgs_to_refine_batch.iter_mut().zip(in_msgs_details) + { + log::trace!( + target: "bridge", + "Refined weight of {}->{} message {:?}/{}: at-source: {}, at-target: {}", + P::SourceChain::NAME, + P::TargetChain::NAME, + self.lane_id, + out_msg_details.nonce, + out_msg_details.dispatch_weight, + in_msg_details.dispatch_weight, + ); + out_msg_details.dispatch_weight = in_msg_details.dispatch_weight; + } + } + + let mut msgs_details_map = MessageDetailsMap::new(); + for out_msg_details in out_msgs_details { + msgs_details_map.insert( + out_msg_details.nonce, + MessageDetails { + dispatch_weight: out_msg_details.dispatch_weight, + size: out_msg_details.size as _, + reward: Zero::zero(), + }, + ); + } + + Ok(msgs_details_map) + } + + async fn prove_messages( + &self, + id: SourceHeaderIdOf>, + nonces: RangeInclusive, + proof_parameters: MessageProofParameters, + ) -> Result< + ( + SourceHeaderIdOf>, + RangeInclusive, + as MessageLane>::MessagesProof, + ), + SubstrateError, + > { + let mut storage_keys = + Vec::with_capacity(nonces.end().saturating_sub(*nonces.start()) as usize + 1); + let mut message_nonce = *nonces.start(); + while message_nonce <= *nonces.end() { + let message_key = bp_messages::storage_keys::message_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + message_nonce, + ); + storage_keys.push(message_key); + message_nonce += 1; + } + if proof_parameters.outbound_state_proof_required { + storage_keys.push(bp_messages::storage_keys::outbound_lane_data_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + )); + } + + let proof = self + .source_client + .prove_storage(storage_keys, id.1) + .await? + .into_iter_nodes() + .collect(); + let proof = FromBridgedChainMessagesProof { + bridged_header_hash: id.1, + storage_proof: proof, + lane: self.lane_id, + nonces_start: *nonces.start(), + nonces_end: *nonces.end(), + }; + Ok((id, nonces, (proof_parameters.dispatch_weight, proof))) + } + + async fn submit_messages_receiving_proof( + &self, + maybe_batch_tx: Option, + _generated_at_block: TargetHeaderIdOf>, + proof: as MessageLane>::MessagesReceivingProof, + ) -> Result { + let messages_proof_call = + P::ReceiveMessagesDeliveryProofCallBuilder::build_receive_messages_delivery_proof_call( + proof, + maybe_batch_tx.is_none(), + ); + let final_call = match maybe_batch_tx { + Some(batch_tx) => batch_tx.append_call_and_build(messages_proof_call), + None => messages_proof_call, + }; + + let transaction_params = self.transaction_params.clone(); + self.source_client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(final_call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, transaction_params.mortality))) + }, + ) + .await + } + + async fn require_target_header_on_source( + &self, + id: TargetHeaderIdOf>, + ) -> Result, SubstrateError> { + if let Some(ref target_to_source_headers_relay) = self.target_to_source_headers_relay { + if let Some(batch_tx) = + BatchProofTransaction::new(target_to_source_headers_relay.clone(), id.0).await? + { + return Ok(Some(batch_tx)) + } + + target_to_source_headers_relay.require_more_headers(id.0).await; + } + + Ok(None) + } +} + +/// Ensure that the messages pallet at source chain is active. +pub(crate) async fn ensure_messages_pallet_active( + client: &Client, +) -> Result<(), SubstrateError> +where + AtChain: ChainWithMessages, + WithChain: ChainWithMessages, +{ + let operating_mode = client + .storage_value(operating_mode_key(WithChain::WITH_CHAIN_MESSAGES_PALLET_NAME), None) + .await?; + let is_halted = + operating_mode == Some(MessagesOperatingMode::Basic(BasicOperatingMode::Halted)); + if is_halted { + Err(SubstrateError::BridgePalletIsHalted) + } else { + Ok(()) + } +} + +/// Read best blocks from given client. +/// +/// This function assumes that the chain that is followed by the `self_client` has +/// bridge GRANDPA pallet deployed and it provides `best_finalized_header_id_method_name` +/// runtime API to read the best finalized Bridged chain header. +/// +/// If `peer_client` is `None`, the value of `actual_best_finalized_peer_at_best_self` will +/// always match the `best_finalized_peer_at_best_self`. +pub async fn read_client_state( + self_client: &Client, + peer_client: Option<&Client>, +) -> Result, HeaderIdOf>, SubstrateError> +where + SelfChain: Chain, + PeerChain: Chain, +{ + // let's read our state first: we need best finalized header hash on **this** chain + let self_best_finalized_id = self_client.best_finalized_header().await?.id(); + // now let's read our best header on **this** chain + let self_best_id = self_client.best_header().await?.id(); + + // now let's read id of best finalized peer header at our best finalized block + let peer_on_self_best_finalized_id = + best_synced_header_id::(self_client, self_best_id.hash()).await?; + + // read actual header, matching the `peer_on_self_best_finalized_id` from the peer chain + let actual_peer_on_self_best_finalized_id = + match (peer_client, peer_on_self_best_finalized_id.as_ref()) { + (Some(peer_client), Some(peer_on_self_best_finalized_id)) => { + let actual_peer_on_self_best_finalized = + peer_client.header_by_number(peer_on_self_best_finalized_id.number()).await?; + Some(actual_peer_on_self_best_finalized.id()) + }, + _ => peer_on_self_best_finalized_id, + }; + + Ok(ClientState { + best_self: self_best_id, + best_finalized_self: self_best_finalized_id, + best_finalized_peer_at_best_self: peer_on_self_best_finalized_id, + actual_best_finalized_peer_at_best_self: actual_peer_on_self_best_finalized_id, + }) +} + +/// Reads best `PeerChain` header known to the `SelfChain` using provided runtime API method. +/// +/// Method is supposed to be the `FinalityApi::best_finalized()` method. +pub async fn best_finalized_peer_header_at_self( + self_client: &Client, + at_self_hash: HashOf, +) -> Result>, SubstrateError> +where + SelfChain: Chain, + PeerChain: Chain, +{ + // now let's read id of best finalized peer header at our best finalized block + self_client + .typed_state_call::<_, Option<_>>( + PeerChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), + (), + Some(at_self_hash), + ) + .await +} + +fn validate_out_msgs_details( + out_msgs_details: &[OutboundMessageDetails], + nonces: RangeInclusive, +) -> Result<(), SubstrateError> { + let make_missing_nonce_error = |expected_nonce| { + Err(SubstrateError::Custom(format!( + "Missing nonce {expected_nonce} in message_details call result. Expected all nonces from {nonces:?}", + ))) + }; + + if out_msgs_details.len() > nonces.clone().count() { + return Err(SubstrateError::Custom( + "More messages than requested returned by the message_details call.".into(), + )) + } + + // Check if last nonce is missing. The loop below is not checking this. + if out_msgs_details.is_empty() && !nonces.is_empty() { + return make_missing_nonce_error(*nonces.end()) + } + + let mut nonces_iter = nonces.clone().rev().peekable(); + let mut out_msgs_details_iter = out_msgs_details.iter().rev(); + while let Some((out_msg_details, &nonce)) = out_msgs_details_iter.next().zip(nonces_iter.peek()) + { + nonces_iter.next(); + if out_msg_details.nonce != nonce { + // Some nonces are missing from the middle/tail of the range. This is critical error. + return make_missing_nonce_error(nonce) + } + } + + // Check if some nonces from the beginning of the range are missing. This may happen if + // some messages were already pruned from the source node. This is not a critical error + // and will be auto-resolved by messages lane (and target node). + if nonces_iter.peek().is_some() { + log::info!( + target: "bridge", + "Some messages are missing from the {} node: {:?}. Target node may be out of sync?", + C::NAME, + nonces_iter.rev().collect::>(), + ); + } + + Ok(()) +} + +fn split_msgs_to_refine( + lane_id: LaneId, + msgs_to_refine: MessagesToRefine, +) -> Result, SubstrateError> { + let max_batch_size = Target::max_extrinsic_size() as usize; + let mut batches = vec![]; + + let mut current_msgs_batch = msgs_to_refine; + while !current_msgs_batch.is_empty() { + let mut next_msgs_batch = vec![]; + while (lane_id, ¤t_msgs_batch).encoded_size() > max_batch_size { + if current_msgs_batch.len() <= 1 { + return Err(SubstrateError::Custom(format!( + "Call of {} at {} can't be executed even if only one message is supplied. \ + max_extrinsic_size(): {}", + Source::FROM_CHAIN_MESSAGE_DETAILS_METHOD, + Target::NAME, + Target::max_extrinsic_size(), + ))) + } + + if let Some(msg) = current_msgs_batch.pop() { + next_msgs_batch.insert(0, msg); + } + } + + batches.push(current_msgs_batch); + current_msgs_batch = next_msgs_batch; + } + + Ok(batches) +} + +#[cfg(test)] +mod tests { + use super::*; + use bp_runtime::Chain as ChainBase; + use relay_bridge_hub_rococo_client::BridgeHubRococo; + use relay_bridge_hub_westend_client::BridgeHubWestend; + + fn message_details_from_rpc( + nonces: RangeInclusive, + ) -> Vec { + nonces + .into_iter() + .map(|nonce| bp_messages::OutboundMessageDetails { + nonce, + dispatch_weight: Weight::zero(), + size: 0, + }) + .collect() + } + + #[test] + fn validate_out_msgs_details_succeeds_if_no_messages_are_missing() { + assert!(validate_out_msgs_details::( + &message_details_from_rpc(1..=3), + 1..=3, + ) + .is_ok()); + } + + #[test] + fn validate_out_msgs_details_succeeds_if_head_messages_are_missing() { + assert!(validate_out_msgs_details::( + &message_details_from_rpc(2..=3), + 1..=3, + ) + .is_ok()) + } + + #[test] + fn validate_out_msgs_details_fails_if_mid_messages_are_missing() { + let mut message_details_from_rpc = message_details_from_rpc(1..=3); + message_details_from_rpc.remove(1); + assert!(matches!( + validate_out_msgs_details::(&message_details_from_rpc, 1..=3,), + Err(SubstrateError::Custom(_)) + )); + } + + #[test] + fn validate_out_msgs_details_map_fails_if_tail_messages_are_missing() { + assert!(matches!( + validate_out_msgs_details::(&message_details_from_rpc(1..=2), 1..=3,), + Err(SubstrateError::Custom(_)) + )); + } + + #[test] + fn validate_out_msgs_details_fails_if_all_messages_are_missing() { + assert!(matches!( + validate_out_msgs_details::(&[], 1..=3), + Err(SubstrateError::Custom(_)) + )); + } + + #[test] + fn validate_out_msgs_details_fails_if_more_messages_than_nonces() { + assert!(matches!( + validate_out_msgs_details::(&message_details_from_rpc(1..=5), 2..=5,), + Err(SubstrateError::Custom(_)) + )); + } + + fn check_split_msgs_to_refine( + payload_sizes: Vec, + expected_batches: Result, ()>, + ) { + let mut out_msgs_details = vec![]; + for (idx, _) in payload_sizes.iter().enumerate() { + out_msgs_details.push(OutboundMessageDetails { + nonce: idx as MessageNonce, + dispatch_weight: Weight::zero(), + size: 0, + }); + } + + let mut msgs_to_refine = vec![]; + for (&payload_size, out_msg_details) in + payload_sizes.iter().zip(out_msgs_details.iter_mut()) + { + let payload = vec![1u8; payload_size]; + msgs_to_refine.push((payload, out_msg_details)); + } + + let maybe_batches = split_msgs_to_refine::( + Default::default(), + msgs_to_refine, + ); + match expected_batches { + Ok(expected_batches) => { + let batches = maybe_batches.unwrap(); + let mut idx = 0; + assert_eq!(batches.len(), expected_batches.len()); + for (batch, &expected_batch_size) in batches.iter().zip(expected_batches.iter()) { + assert_eq!(batch.len(), expected_batch_size); + for msg_to_refine in batch { + assert_eq!(msg_to_refine.0.len(), payload_sizes[idx]); + idx += 1; + } + } + }, + Err(_) => { + matches!(maybe_batches, Err(SubstrateError::Custom(_))); + }, + } + } + + #[test] + fn test_split_msgs_to_refine() { + let max_extrinsic_size = BridgeHubRococo::max_extrinsic_size() as usize; + + // Check that an error is returned when one of the messages is too big. + check_split_msgs_to_refine(vec![max_extrinsic_size], Err(())); + check_split_msgs_to_refine(vec![50, 100, max_extrinsic_size, 200], Err(())); + + // Otherwise check that the split is valid. + check_split_msgs_to_refine(vec![100, 200, 300, 400], Ok(vec![4])); + check_split_msgs_to_refine( + vec![ + 50, + 100, + max_extrinsic_size - 500, + 500, + 1000, + 1500, + max_extrinsic_size - 3500, + 5000, + 10000, + ], + Ok(vec![3, 4, 2]), + ); + check_split_msgs_to_refine( + vec![ + 50, + 100, + max_extrinsic_size - 150, + 500, + 1000, + 1500, + max_extrinsic_size - 3000, + 5000, + 10000, + ], + Ok(vec![2, 1, 3, 1, 2]), + ); + check_split_msgs_to_refine( + vec![ + 5000, + 10000, + max_extrinsic_size - 3500, + 500, + 1000, + 1500, + max_extrinsic_size - 500, + 50, + 100, + ], + Ok(vec![2, 4, 3]), + ); + } +} diff --git a/relays/lib-substrate-relay/src/messages_target.rs b/relays/lib-substrate-relay/src/messages_target.rs new file mode 100644 index 000000000000..f47b48010ecd --- /dev/null +++ b/relays/lib-substrate-relay/src/messages_target.rs @@ -0,0 +1,300 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate client as Substrate messages target. The chain we connect to should have +//! runtime that implements `HeaderApi` to allow bridging with +//! `` chain. + +use crate::{ + messages_lane::{ + BatchProofTransaction, MessageLaneAdapter, ReceiveMessagesProofCallBuilder, + SubstrateMessageLane, + }, + messages_source::{ensure_messages_pallet_active, read_client_state, SubstrateMessagesProof}, + on_demand::OnDemandRelay, + TransactionParams, +}; + +use async_std::sync::Arc; +use async_trait::async_trait; +use bp_messages::{ + storage_keys::inbound_lane_data_key, InboundLaneData, LaneId, MessageNonce, + UnrewardedRelayersState, +}; +use bridge_runtime_common::messages::source::FromBridgedChainMessagesDeliveryProof; +use messages_relay::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{NoncesSubmitArtifacts, TargetClient, TargetClientState}, +}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, BalanceOf, CallOf, ChainWithMessages, Client, + Error as SubstrateError, HashOf, TransactionEra, TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_core::Pair; +use std::{convert::TryFrom, ops::RangeInclusive}; + +/// Message receiving proof returned by the target Substrate node. +pub type SubstrateMessagesDeliveryProof = + (UnrewardedRelayersState, FromBridgedChainMessagesDeliveryProof>); + +/// Substrate client as Substrate messages target. +pub struct SubstrateMessagesTarget { + target_client: Client, + source_client: Client, + lane_id: LaneId, + relayer_id_at_source: AccountIdOf, + transaction_params: TransactionParams>, + source_to_target_headers_relay: Option>>, +} + +impl SubstrateMessagesTarget

{ + /// Create new Substrate headers target. + pub fn new( + target_client: Client, + source_client: Client, + lane_id: LaneId, + relayer_id_at_source: AccountIdOf, + transaction_params: TransactionParams>, + source_to_target_headers_relay: Option< + Arc>, + >, + ) -> Self { + SubstrateMessagesTarget { + target_client, + source_client, + lane_id, + relayer_id_at_source, + transaction_params, + source_to_target_headers_relay, + } + } + + /// Read inbound lane state from the on-chain storage at given block. + async fn inbound_lane_data( + &self, + id: TargetHeaderIdOf>, + ) -> Result>>, SubstrateError> { + self.target_client + .storage_value( + inbound_lane_data_key( + P::SourceChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + ), + Some(id.1), + ) + .await + } + + /// Ensure that the messages pallet at target chain is active. + async fn ensure_pallet_active(&self) -> Result<(), SubstrateError> { + ensure_messages_pallet_active::(&self.target_client).await + } +} + +impl Clone for SubstrateMessagesTarget

{ + fn clone(&self) -> Self { + Self { + target_client: self.target_client.clone(), + source_client: self.source_client.clone(), + lane_id: self.lane_id, + relayer_id_at_source: self.relayer_id_at_source.clone(), + transaction_params: self.transaction_params.clone(), + source_to_target_headers_relay: self.source_to_target_headers_relay.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateMessagesTarget

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + // since the client calls RPC methods on both sides, we need to reconnect both + self.target_client.reconnect().await?; + self.source_client.reconnect().await?; + + // call reconnect on on-demand headers relay, because we may use different chains there + // and the error that has lead to reconnect may have came from those other chains + // (see `require_source_header_on_target`) + // + // this may lead to multiple reconnects to the same node during the same call and it + // needs to be addressed in the future + // TODO: https://github.com/paritytech/parity-bridges-common/issues/1928 + if let Some(ref mut source_to_target_headers_relay) = self.source_to_target_headers_relay { + source_to_target_headers_relay.reconnect().await?; + } + + Ok(()) + } +} + +#[async_trait] +impl TargetClient> for SubstrateMessagesTarget

+where + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom>, +{ + type BatchTransaction = + BatchProofTransaction; + type TransactionTracker = TransactionTracker>; + + async fn state(&self) -> Result>, SubstrateError> { + // we can't continue to deliver confirmations if source node is out of sync, because + // it may have already received confirmations that we're going to deliver + // + // we can't continue to deliver messages if target node is out of sync, because + // it may have already received (some of) messages that we're going to deliver + self.source_client.ensure_synced().await?; + self.target_client.ensure_synced().await?; + // we can't relay messages if messages pallet at target chain is halted + self.ensure_pallet_active().await?; + + read_client_state(&self.target_client, Some(&self.source_client)).await + } + + async fn latest_received_nonce( + &self, + id: TargetHeaderIdOf>, + ) -> Result<(TargetHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is received + let latest_received_nonce = self + .inbound_lane_data(id) + .await? + .map(|data| data.last_delivered_nonce()) + .unwrap_or(0); + Ok((id, latest_received_nonce)) + } + + async fn latest_confirmed_received_nonce( + &self, + id: TargetHeaderIdOf>, + ) -> Result<(TargetHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is received + let last_confirmed_nonce = self + .inbound_lane_data(id) + .await? + .map(|data| data.last_confirmed_nonce) + .unwrap_or(0); + Ok((id, last_confirmed_nonce)) + } + + async fn unrewarded_relayers_state( + &self, + id: TargetHeaderIdOf>, + ) -> Result<(TargetHeaderIdOf>, UnrewardedRelayersState), SubstrateError> + { + let inbound_lane_data = + self.inbound_lane_data(id).await?.unwrap_or(InboundLaneData::default()); + Ok((id, (&inbound_lane_data).into())) + } + + async fn prove_messages_receiving( + &self, + id: TargetHeaderIdOf>, + ) -> Result< + ( + TargetHeaderIdOf>, + as MessageLane>::MessagesReceivingProof, + ), + SubstrateError, + > { + let (id, relayers_state) = self.unrewarded_relayers_state(id).await?; + let inbound_data_key = bp_messages::storage_keys::inbound_lane_data_key( + P::SourceChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + ); + let proof = self + .target_client + .prove_storage(vec![inbound_data_key], id.1) + .await? + .into_iter_nodes() + .collect(); + let proof = FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: id.1, + storage_proof: proof, + lane: self.lane_id, + }; + Ok((id, (relayers_state, proof))) + } + + async fn submit_messages_proof( + &self, + maybe_batch_tx: Option, + _generated_at_header: SourceHeaderIdOf>, + nonces: RangeInclusive, + proof: as MessageLane>::MessagesProof, + ) -> Result, SubstrateError> { + let messages_proof_call = make_messages_delivery_call::

( + self.relayer_id_at_source.clone(), + proof.1.nonces_start..=proof.1.nonces_end, + proof, + maybe_batch_tx.is_none(), + ); + let final_call = match maybe_batch_tx { + Some(batch_tx) => batch_tx.append_call_and_build(messages_proof_call), + None => messages_proof_call, + }; + + let transaction_params = self.transaction_params.clone(); + let tx_tracker = self + .target_client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(final_call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, transaction_params.mortality))) + }, + ) + .await?; + Ok(NoncesSubmitArtifacts { nonces, tx_tracker }) + } + + async fn require_source_header_on_target( + &self, + id: SourceHeaderIdOf>, + ) -> Result, SubstrateError> { + if let Some(ref source_to_target_headers_relay) = self.source_to_target_headers_relay { + if let Some(batch_tx) = + BatchProofTransaction::new(source_to_target_headers_relay.clone(), id.0).await? + { + return Ok(Some(batch_tx)) + } + + source_to_target_headers_relay.require_more_headers(id.0).await; + } + + Ok(None) + } +} + +/// Make messages delivery call from given proof. +fn make_messages_delivery_call( + relayer_id_at_source: AccountIdOf, + nonces: RangeInclusive, + proof: SubstrateMessagesProof, + trace_call: bool, +) -> CallOf { + let messages_count = nonces.end() - nonces.start() + 1; + let dispatch_weight = proof.0; + P::ReceiveMessagesProofCallBuilder::build_receive_messages_proof_call( + relayer_id_at_source, + proof, + messages_count as _, + dispatch_weight, + trace_call, + ) +} diff --git a/relays/lib-substrate-relay/src/on_demand/headers.rs b/relays/lib-substrate-relay/src/on_demand/headers.rs new file mode 100644 index 000000000000..0090dee3a03c --- /dev/null +++ b/relays/lib-substrate-relay/src/on_demand/headers.rs @@ -0,0 +1,545 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! On-demand Substrate -> Substrate header finality relay. + +use crate::{ + finality::SubmitFinalityProofCallBuilder, finality_base::engine::MaxExpectedCallSizeCheck, +}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use bp_header_chain::ConsensusLogReader; +use bp_runtime::HeaderIdProvider; +use futures::{select, FutureExt}; +use num_traits::{One, Saturating, Zero}; +use sp_runtime::traits::Header; + +use finality_relay::{FinalitySyncParams, TargetClient as FinalityTargetClient}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, Client, Error as SubstrateError, + HeaderIdOf, +}; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, FailedClient, MaybeConnectionError, + STALL_TIMEOUT, +}; + +use crate::{ + finality::{ + source::{RequiredHeaderNumberRef, SubstrateFinalitySource}, + target::SubstrateFinalityTarget, + SubstrateFinalitySyncPipeline, RECENT_FINALITY_PROOFS_LIMIT, + }, + finality_base::engine::Engine, + on_demand::OnDemandRelay, + TransactionParams, +}; + +/// On-demand Substrate <-> Substrate header finality relay. +/// +/// This relay may be requested to sync more headers, whenever some other relay (e.g. messages +/// relay) needs it to continue its regular work. When enough headers are relayed, on-demand stops +/// syncing headers. +#[derive(Clone)] +pub struct OnDemandHeadersRelay { + /// Relay task name. + relay_task_name: String, + /// Shared reference to maximal required finalized header number. + required_header_number: RequiredHeaderNumberRef, + /// Client of the source chain. + source_client: Client, + /// Client of the target chain. + target_client: Client, +} + +impl OnDemandHeadersRelay

{ + /// Create new on-demand headers relay. + /// + /// If `metrics_params` is `Some(_)`, the metrics of the finality relay are registered. + /// Otherwise, all required metrics must be exposed outside of this method. + pub fn new( + source_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + only_mandatory_headers: bool, + metrics_params: Option, + ) -> Self + where + AccountIdOf: + From< as sp_core::Pair>::Public>, + { + let required_header_number = Arc::new(Mutex::new(Zero::zero())); + let this = OnDemandHeadersRelay { + relay_task_name: on_demand_headers_relay_name::(), + required_header_number: required_header_number.clone(), + source_client: source_client.clone(), + target_client: target_client.clone(), + }; + async_std::task::spawn(async move { + background_task::

( + source_client, + target_client, + target_transaction_params, + only_mandatory_headers, + required_header_number, + metrics_params, + ) + .await; + }); + + this + } +} + +#[async_trait] +impl OnDemandRelay + for OnDemandHeadersRelay

+{ + async fn reconnect(&self) -> Result<(), SubstrateError> { + // using clone is fine here (to avoid mut requirement), because clone on Client clones + // internal references + self.source_client.clone().reconnect().await?; + self.target_client.clone().reconnect().await + } + + async fn require_more_headers(&self, required_header: BlockNumberOf) { + let mut required_header_number = self.required_header_number.lock().await; + if required_header > *required_header_number { + log::trace!( + target: "bridge", + "[{}] More {} headers required. Going to sync up to the {}", + self.relay_task_name, + P::SourceChain::NAME, + required_header, + ); + + *required_header_number = required_header; + } + } + + async fn prove_header( + &self, + required_header: BlockNumberOf, + ) -> Result<(HeaderIdOf, Vec>), SubstrateError> { + const MAX_ITERATIONS: u32 = 4; + let mut iterations = 0; + let mut current_required_header = required_header; + loop { + // first find proper header (either `current_required_header`) or its descendant + let finality_source = + SubstrateFinalitySource::

::new(self.source_client.clone(), None); + let (header, mut proof) = + finality_source.prove_block_finality(current_required_header).await?; + let header_id = header.id(); + + // optimize justification before including it into the call + P::FinalityEngine::optimize_proof(&self.target_client, &header, &mut proof).await?; + + // now we have the header and its proof, but we want to minimize our losses, so let's + // check if we'll get the full refund for submitting this header + let check_result = P::FinalityEngine::check_max_expected_call_size(&header, &proof); + if let MaxExpectedCallSizeCheck::Exceeds { call_size, max_call_size } = check_result { + iterations += 1; + current_required_header = header_id.number().saturating_add(One::one()); + if iterations < MAX_ITERATIONS { + log::debug!( + target: "bridge", + "[{}] Requested to prove {} head {:?}. Selected to prove {} head {:?}. But it is too large: {} vs {}. \ + Going to select next header", + self.relay_task_name, + P::SourceChain::NAME, + required_header, + P::SourceChain::NAME, + header_id, + call_size, + max_call_size, + ); + + continue; + } + } + + log::debug!( + target: "bridge", + "[{}] Requested to prove {} head {:?}. Selected to prove {} head {:?} (after {} iterations)", + self.relay_task_name, + P::SourceChain::NAME, + required_header, + P::SourceChain::NAME, + header_id, + iterations, + ); + + // and then craft the submit-proof call + let call = + P::SubmitFinalityProofCallBuilder::build_submit_finality_proof_call(header, proof); + + return Ok((header_id, vec![call])); + } + } +} + +/// Background task that is responsible for starting headers relay. +async fn background_task( + source_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + only_mandatory_headers: bool, + required_header_number: RequiredHeaderNumberRef, + metrics_params: Option, +) where + AccountIdOf: From< as sp_core::Pair>::Public>, +{ + let relay_task_name = on_demand_headers_relay_name::(); + let target_transactions_mortality = target_transaction_params.mortality; + let mut finality_source = SubstrateFinalitySource::

::new( + source_client.clone(), + Some(required_header_number.clone()), + ); + let mut finality_target = + SubstrateFinalityTarget::new(target_client.clone(), target_transaction_params); + let mut latest_non_mandatory_at_source = Zero::zero(); + + let mut restart_relay = true; + let finality_relay_task = futures::future::Fuse::terminated(); + futures::pin_mut!(finality_relay_task); + + loop { + select! { + _ = async_std::task::sleep(P::TargetChain::AVERAGE_BLOCK_INTERVAL).fuse() => {}, + _ = finality_relay_task => { + // this should never happen in practice given the current code + restart_relay = true; + }, + } + + // read best finalized source header number from source + let best_finalized_source_header_at_source = + best_finalized_source_header_at_source(&finality_source, &relay_task_name).await; + if matches!(best_finalized_source_header_at_source, Err(ref e) if e.is_connection_error()) { + relay_utils::relay_loop::reconnect_failed_client( + FailedClient::Source, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut finality_source, + &mut finality_target, + ) + .await; + continue + } + + // read best finalized source header number from target + let best_finalized_source_header_at_target = + best_finalized_source_header_at_target::

(&finality_target, &relay_task_name).await; + if matches!(best_finalized_source_header_at_target, Err(ref e) if e.is_connection_error()) { + relay_utils::relay_loop::reconnect_failed_client( + FailedClient::Target, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut finality_source, + &mut finality_target, + ) + .await; + continue + } + + // submit mandatory header if some headers are missing + let best_finalized_source_header_at_source_fmt = + format!("{best_finalized_source_header_at_source:?}"); + let best_finalized_source_header_at_target_fmt = + format!("{best_finalized_source_header_at_target:?}"); + let required_header_number_value = *required_header_number.lock().await; + let mandatory_scan_range = mandatory_headers_scan_range::( + best_finalized_source_header_at_source.ok(), + best_finalized_source_header_at_target.ok(), + required_header_number_value, + ) + .await; + + log::trace!( + target: "bridge", + "[{}] Mandatory headers scan range: ({:?}, {:?}, {:?}) -> {:?}", + relay_task_name, + required_header_number_value, + best_finalized_source_header_at_source_fmt, + best_finalized_source_header_at_target_fmt, + mandatory_scan_range, + ); + + if let Some(mandatory_scan_range) = mandatory_scan_range { + let relay_mandatory_header_result = relay_mandatory_header_from_range( + &finality_source, + &required_header_number, + best_finalized_source_header_at_target_fmt, + ( + std::cmp::max(mandatory_scan_range.0, latest_non_mandatory_at_source), + mandatory_scan_range.1, + ), + &relay_task_name, + ) + .await; + match relay_mandatory_header_result { + Ok(true) => (), + Ok(false) => { + // there are no (or we don't need to relay them) mandatory headers in the range + // => to avoid scanning the same headers over and over again, remember that + latest_non_mandatory_at_source = mandatory_scan_range.1; + + log::trace!( + target: "bridge", + "[{}] No mandatory {} headers in the range {:?}", + relay_task_name, + P::SourceChain::NAME, + mandatory_scan_range, + ); + }, + Err(e) => { + log::warn!( + target: "bridge", + "[{}] Failed to scan mandatory {} headers range ({:?}): {:?}", + relay_task_name, + P::SourceChain::NAME, + mandatory_scan_range, + e, + ); + + if e.is_connection_error() { + relay_utils::relay_loop::reconnect_failed_client( + FailedClient::Source, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut finality_source, + &mut finality_target, + ) + .await; + continue + } + }, + } + } + + // start/restart relay + if restart_relay { + let stall_timeout = relay_substrate_client::transaction_stall_timeout( + target_transactions_mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ); + + log::info!( + target: "bridge", + "[{}] Starting on-demand headers relay task\n\t\ + Only mandatory headers: {}\n\t\ + Tx mortality: {:?} (~{}m)\n\t\ + Stall timeout: {:?}", + relay_task_name, + only_mandatory_headers, + target_transactions_mortality, + stall_timeout.as_secs_f64() / 60.0f64, + stall_timeout, + ); + + finality_relay_task.set( + finality_relay::run( + finality_source.clone(), + finality_target.clone(), + FinalitySyncParams { + tick: std::cmp::max( + P::SourceChain::AVERAGE_BLOCK_INTERVAL, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + ), + recent_finality_proofs_limit: RECENT_FINALITY_PROOFS_LIMIT, + stall_timeout, + only_mandatory_headers, + }, + metrics_params.clone().unwrap_or_else(MetricsParams::disabled), + futures::future::pending(), + ) + .fuse(), + ); + + restart_relay = false; + } + } +} + +/// Returns `Some()` with inclusive range of headers which must be scanned for mandatory headers +/// and the first of such headers must be submitted to the target node. +async fn mandatory_headers_scan_range( + best_finalized_source_header_at_source: Option, + best_finalized_source_header_at_target: Option, + required_header_number: BlockNumberOf, +) -> Option<(C::BlockNumber, C::BlockNumber)> { + // if we have been unable to read header number from the target, then let's assume + // that it is the same as required header number. Otherwise we risk submitting + // unneeded transactions + let best_finalized_source_header_at_target = + best_finalized_source_header_at_target.unwrap_or(required_header_number); + + // if we have been unable to read header number from the source, then let's assume + // that it is the same as at the target + let best_finalized_source_header_at_source = + best_finalized_source_header_at_source.unwrap_or(best_finalized_source_header_at_target); + + // if relay is already asked to sync more headers than we have at source, don't do anything yet + if required_header_number >= best_finalized_source_header_at_source { + return None + } + + Some(( + best_finalized_source_header_at_target + One::one(), + best_finalized_source_header_at_source, + )) +} + +/// Try to find mandatory header in the inclusive headers range and, if one is found, ask to relay +/// it. +/// +/// Returns `true` if header was found and (asked to be) relayed and `false` otherwise. +async fn relay_mandatory_header_from_range( + finality_source: &SubstrateFinalitySource

, + required_header_number: &RequiredHeaderNumberRef, + best_finalized_source_header_at_target: String, + range: (BlockNumberOf, BlockNumberOf), + relay_task_name: &str, +) -> Result { + // search for mandatory header first + let mandatory_source_header_number = + find_mandatory_header_in_range(finality_source, range).await?; + + // if there are no mandatory headers - we have nothing to do + let mandatory_source_header_number = match mandatory_source_header_number { + Some(mandatory_source_header_number) => mandatory_source_header_number, + None => return Ok(false), + }; + + // `find_mandatory_header` call may take a while => check if `required_header_number` is still + // less than our `mandatory_source_header_number` before logging anything + let mut required_header_number = required_header_number.lock().await; + if *required_header_number >= mandatory_source_header_number { + return Ok(false) + } + + log::trace!( + target: "bridge", + "[{}] Too many {} headers missing at target ({} vs {}). Going to sync up to the mandatory {}", + relay_task_name, + P::SourceChain::NAME, + best_finalized_source_header_at_target, + range.1, + mandatory_source_header_number, + ); + + *required_header_number = mandatory_source_header_number; + Ok(true) +} + +/// Read best finalized source block number from source client. +/// +/// Returns `None` if we have failed to read the number. +async fn best_finalized_source_header_at_source( + finality_source: &SubstrateFinalitySource

, + relay_task_name: &str, +) -> Result, relay_substrate_client::Error> { + finality_source.on_chain_best_finalized_block_number().await.map_err(|error| { + log::error!( + target: "bridge", + "[{}] Failed to read best finalized source header from source: {:?}", + relay_task_name, + error, + ); + + error + }) +} + +/// Read best finalized source block number from target client. +/// +/// Returns `None` if we have failed to read the number. +async fn best_finalized_source_header_at_target( + finality_target: &SubstrateFinalityTarget

, + relay_task_name: &str, +) -> Result, as RelayClient>::Error> +where + AccountIdOf: From< as sp_core::Pair>::Public>, +{ + finality_target + .best_finalized_source_block_id() + .await + .map_err(|error| { + log::error!( + target: "bridge", + "[{}] Failed to read best finalized source header from target: {:?}", + relay_task_name, + error, + ); + + error + }) + .map(|id| id.0) +} + +/// Read first mandatory header in given inclusive range. +/// +/// Returns `Ok(None)` if there were no mandatory headers in the range. +async fn find_mandatory_header_in_range( + finality_source: &SubstrateFinalitySource

, + range: (BlockNumberOf, BlockNumberOf), +) -> Result>, relay_substrate_client::Error> { + let mut current = range.0; + while current <= range.1 { + let header = finality_source.client().header_by_number(current).await?; + if >::ConsensusLogReader::schedules_authorities_change( + header.digest(), + ) { + return Ok(Some(current)) + } + + current += One::one(); + } + + Ok(None) +} + +/// On-demand headers relay task name. +fn on_demand_headers_relay_name() -> String { + format!("{}-to-{}-on-demand-headers", SourceChain::NAME, TargetChain::NAME) +} + +#[cfg(test)] +mod tests { + use super::*; + + type TestChain = relay_rococo_client::Rococo; + + const AT_SOURCE: Option = Some(10); + const AT_TARGET: Option = Some(1); + + #[async_std::test] + async fn mandatory_headers_scan_range_selects_range_if_some_headers_are_missing() { + assert_eq!( + mandatory_headers_scan_range::(AT_SOURCE, AT_TARGET, 0,).await, + Some((AT_TARGET.unwrap() + 1, AT_SOURCE.unwrap())), + ); + } + + #[async_std::test] + async fn mandatory_headers_scan_range_selects_nothing_if_already_queued() { + assert_eq!( + mandatory_headers_scan_range::(AT_SOURCE, AT_TARGET, AT_SOURCE.unwrap(),) + .await, + None, + ); + } +} diff --git a/relays/lib-substrate-relay/src/on_demand/mod.rs b/relays/lib-substrate-relay/src/on_demand/mod.rs new file mode 100644 index 000000000000..00bb33d67409 --- /dev/null +++ b/relays/lib-substrate-relay/src/on_demand/mod.rs @@ -0,0 +1,48 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! on-demand pipelines. + +use async_trait::async_trait; +use relay_substrate_client::{BlockNumberOf, CallOf, Chain, Error as SubstrateError, HeaderIdOf}; + +pub mod headers; +pub mod parachains; + +/// On-demand headers relay that is relaying finalizing headers only when requested. +#[async_trait] +pub trait OnDemandRelay: Send + Sync { + /// Reconnect to source and target nodes. + async fn reconnect(&self) -> Result<(), SubstrateError>; + + /// Ask relay to relay source header with given number to the target chain. + /// + /// Depending on implementation, on-demand relay may also relay `required_header` ancestors + /// (e.g. if they're mandatory), or its descendants. The request is considered complete if + /// the best avbailable header at the target chain has number that is larger than or equal + /// to the `required_header`. + async fn require_more_headers(&self, required_header: BlockNumberOf); + + /// Ask relay to prove source `required_header` to the `TargetChain`. + /// + /// Returns number of header that is proved (it may be the `required_header` or one of its + /// descendants) and calls for delivering the proof. + async fn prove_header( + &self, + required_header: BlockNumberOf, + ) -> Result<(HeaderIdOf, Vec>), SubstrateError>; +} diff --git a/relays/lib-substrate-relay/src/on_demand/parachains.rs b/relays/lib-substrate-relay/src/on_demand/parachains.rs new file mode 100644 index 000000000000..f67c002bba7f --- /dev/null +++ b/relays/lib-substrate-relay/src/on_demand/parachains.rs @@ -0,0 +1,1033 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! On-demand Substrate -> Substrate parachain finality relay. + +use crate::{ + messages_source::best_finalized_peer_header_at_self, + on_demand::OnDemandRelay, + parachains::{ + source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter, + SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, + }, + TransactionParams, +}; + +use async_std::{ + channel::{unbounded, Receiver, Sender}, + sync::{Arc, Mutex}, +}; +use async_trait::async_trait; +use bp_polkadot_core::parachains::{ParaHash, ParaId}; +use bp_runtime::HeaderIdProvider; +use futures::{select, FutureExt}; +use num_traits::Zero; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient}; +use relay_substrate_client::{ + is_ancient_block, AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, Client, + Error as SubstrateError, HashOf, HeaderIdOf, ParachainBase, +}; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, BlockNumberBase, FailedClient, + HeaderId, UniqueSaturatedInto, +}; +use std::fmt::Debug; + +/// On-demand Substrate <-> Substrate parachain finality relay. +/// +/// This relay may be requested to sync more parachain headers, whenever some other relay +/// (e.g. messages relay) needs it to continue its regular work. When enough parachain headers +/// are relayed, on-demand stops syncing headers. +#[derive(Clone)] +pub struct OnDemandParachainsRelay { + /// Relay task name. + relay_task_name: String, + /// Channel used to communicate with background task and ask for relay of parachain heads. + required_header_number_sender: Sender>, + /// Source relay chain client. + source_relay_client: Client, + /// Target chain client. + target_client: Client, + /// On-demand relay chain relay. + on_demand_source_relay_to_target_headers: + Arc>, +} + +impl OnDemandParachainsRelay

{ + /// Create new on-demand parachains relay. + /// + /// Note that the argument is the source relay chain client, not the parachain client. + /// That's because parachain finality is determined by the relay chain and we don't + /// need to connect to the parachain itself here. + pub fn new( + source_relay_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + on_demand_source_relay_to_target_headers: Arc< + dyn OnDemandRelay, + >, + ) -> Self + where + P::SourceParachain: Chain, + P::SourceRelayChain: + Chain, + AccountIdOf: + From< as sp_core::Pair>::Public>, + { + let (required_header_number_sender, required_header_number_receiver) = unbounded(); + let this = OnDemandParachainsRelay { + relay_task_name: on_demand_parachains_relay_name::( + ), + required_header_number_sender, + source_relay_client: source_relay_client.clone(), + target_client: target_client.clone(), + on_demand_source_relay_to_target_headers: on_demand_source_relay_to_target_headers + .clone(), + }; + async_std::task::spawn(async move { + background_task::

( + source_relay_client, + target_client, + target_transaction_params, + on_demand_source_relay_to_target_headers, + required_header_number_receiver, + ) + .await; + }); + + this + } +} + +#[async_trait] +impl OnDemandRelay + for OnDemandParachainsRelay

+where + P::SourceParachain: Chain, +{ + async fn reconnect(&self) -> Result<(), SubstrateError> { + // using clone is fine here (to avoid mut requirement), because clone on Client clones + // internal references + self.source_relay_client.clone().reconnect().await?; + self.target_client.clone().reconnect().await?; + // we'll probably need to reconnect relay chain relayer clients also + self.on_demand_source_relay_to_target_headers.reconnect().await + } + + async fn require_more_headers(&self, required_header: BlockNumberOf) { + if let Err(e) = self.required_header_number_sender.send(required_header).await { + log::trace!( + target: "bridge", + "[{}] Failed to request {} header {:?}: {:?}", + self.relay_task_name, + P::SourceParachain::NAME, + required_header, + e, + ); + } + } + + /// Ask relay to prove source `required_header` to the `TargetChain`. + async fn prove_header( + &self, + required_parachain_header: BlockNumberOf, + ) -> Result<(HeaderIdOf, Vec>), SubstrateError> { + // select headers to prove + let parachains_source = ParachainsSource::

::new( + self.source_relay_client.clone(), + Arc::new(Mutex::new(AvailableHeader::Missing)), + ); + let env = (self, ¶chains_source); + let (need_to_prove_relay_block, selected_relay_block, selected_parachain_block) = + select_headers_to_prove(env, required_parachain_header).await?; + + log::debug!( + target: "bridge", + "[{}] Requested to prove {} head {:?}. Selected to prove {} head {:?} and {} head {:?}", + self.relay_task_name, + P::SourceParachain::NAME, + required_parachain_header, + P::SourceParachain::NAME, + selected_parachain_block, + P::SourceRelayChain::NAME, + if need_to_prove_relay_block { + Some(selected_relay_block) + } else { + None + }, + ); + + // now let's prove relay chain block (if needed) + let mut calls = Vec::new(); + let mut proved_relay_block = selected_relay_block; + if need_to_prove_relay_block { + let (relay_block, relay_prove_call) = self + .on_demand_source_relay_to_target_headers + .prove_header(selected_relay_block.number()) + .await?; + proved_relay_block = relay_block; + calls.extend(relay_prove_call); + } + + // despite what we've selected before (in `select_headers_to_prove` call), if headers relay + // have chose the different header (e.g. because there's no GRANDPA jusstification for it), + // we need to prove parachain head available at this header + let para_id = ParaId(P::SourceParachain::PARACHAIN_ID); + let mut proved_parachain_block = selected_parachain_block; + if proved_relay_block != selected_relay_block { + proved_parachain_block = parachains_source + .on_chain_para_head_id(proved_relay_block) + .await? + // this could happen e.g. if parachain has been offboarded? + .ok_or_else(|| { + SubstrateError::MissingRequiredParachainHead( + para_id, + proved_relay_block.number().unique_saturated_into(), + ) + })?; + + log::debug!( + target: "bridge", + "[{}] Selected to prove {} head {:?} and {} head {:?}. Instead proved {} head {:?} and {} head {:?}", + self.relay_task_name, + P::SourceParachain::NAME, + selected_parachain_block, + P::SourceRelayChain::NAME, + selected_relay_block, + P::SourceParachain::NAME, + proved_parachain_block, + P::SourceRelayChain::NAME, + proved_relay_block, + ); + } + + // and finally - prove parachain head + let (para_proof, para_hash) = + parachains_source.prove_parachain_head(proved_relay_block).await?; + calls.push(P::SubmitParachainHeadsCallBuilder::build_submit_parachain_heads_call( + proved_relay_block, + vec![(para_id, para_hash)], + para_proof, + )); + + Ok((proved_parachain_block, calls)) + } +} + +/// Background task that is responsible for starting parachain headers relay. +async fn background_task( + source_relay_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + on_demand_source_relay_to_target_headers: Arc< + dyn OnDemandRelay, + >, + required_parachain_header_number_receiver: Receiver>, +) where + P::SourceParachain: Chain, + P::SourceRelayChain: + Chain, + AccountIdOf: From< as sp_core::Pair>::Public>, +{ + let relay_task_name = on_demand_parachains_relay_name::(); + let target_transactions_mortality = target_transaction_params.mortality; + + let mut relay_state = RelayState::Idle; + let mut required_parachain_header_number = Zero::zero(); + let required_para_header_ref = Arc::new(Mutex::new(AvailableHeader::Unavailable)); + + let mut restart_relay = true; + let parachains_relay_task = futures::future::Fuse::terminated(); + futures::pin_mut!(parachains_relay_task); + + let mut parachains_source = + ParachainsSource::

::new(source_relay_client.clone(), required_para_header_ref.clone()); + let mut parachains_target = + ParachainsTarget::

::new(target_client.clone(), target_transaction_params.clone()); + + loop { + select! { + new_required_parachain_header_number = required_parachain_header_number_receiver.recv().fuse() => { + let new_required_parachain_header_number = match new_required_parachain_header_number { + Ok(new_required_parachain_header_number) => new_required_parachain_header_number, + Err(e) => { + log::error!( + target: "bridge", + "[{}] Background task has exited with error: {:?}", + relay_task_name, + e, + ); + + return; + }, + }; + + // keep in mind that we are not updating `required_para_header_ref` here, because + // then we'll be submitting all previous headers as well (while required relay headers are + // delivered) and we want to avoid that (to reduce cost) + if new_required_parachain_header_number > required_parachain_header_number { + log::trace!( + target: "bridge", + "[{}] More {} headers required. Going to sync up to the {}", + relay_task_name, + P::SourceParachain::NAME, + new_required_parachain_header_number, + ); + + required_parachain_header_number = new_required_parachain_header_number; + } + }, + _ = async_std::task::sleep(P::TargetChain::AVERAGE_BLOCK_INTERVAL).fuse() => {}, + _ = parachains_relay_task => { + // this should never happen in practice given the current code + restart_relay = true; + }, + } + + // the workflow of the on-demand parachains relay is: + // + // 1) message relay (or any other dependent relay) sees new message at parachain header + // `PH`; + // + // 2) it sees that the target chain does not know `PH`; + // + // 3) it asks on-demand parachains relay to relay `PH` to the target chain; + // + // Phase#1: relaying relay chain header + // + // 4) on-demand parachains relay waits for GRANDPA-finalized block of the source relay chain + // `RH` that is storing `PH` or its descendant. Let it be `PH'`; + // 5) it asks on-demand headers relay to relay `RH` to the target chain; + // 6) it waits until `RH` (or its descendant) is relayed to the target chain; + // + // Phase#2: relaying parachain header + // + // 7) on-demand parachains relay sets `ParachainsSource::maximal_header_number` to the + // `PH'.number()`. + // 8) parachains finality relay sees that the parachain head has been updated and relays + // `PH'` to the target chain. + + // select headers to relay + let relay_data = read_relay_data( + ¶chains_source, + ¶chains_target, + required_parachain_header_number, + ) + .await; + match relay_data { + Ok(relay_data) => { + let prev_relay_state = relay_state; + relay_state = select_headers_to_relay(&relay_data, relay_state); + log::trace!( + target: "bridge", + "[{}] Selected new relay state: {:?} using old state {:?} and data {:?}", + relay_task_name, + relay_state, + prev_relay_state, + relay_data, + ); + }, + Err(failed_client) => { + relay_utils::relay_loop::reconnect_failed_client( + failed_client, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut parachains_source, + &mut parachains_target, + ) + .await; + continue + }, + } + + // we have selected our new 'state' => let's notify our source clients about our new + // requirements + match relay_state { + RelayState::Idle => (), + RelayState::RelayingRelayHeader(required_relay_header) => { + on_demand_source_relay_to_target_headers + .require_more_headers(required_relay_header) + .await; + }, + RelayState::RelayingParaHeader(required_para_header) => { + *required_para_header_ref.lock().await = + AvailableHeader::Available(required_para_header); + }, + } + + // start/restart relay + if restart_relay { + let stall_timeout = relay_substrate_client::transaction_stall_timeout( + target_transactions_mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + relay_utils::STALL_TIMEOUT, + ); + + log::info!( + target: "bridge", + "[{}] Starting on-demand-parachains relay task\n\t\ + Tx mortality: {:?} (~{}m)\n\t\ + Stall timeout: {:?}", + relay_task_name, + target_transactions_mortality, + stall_timeout.as_secs_f64() / 60.0f64, + stall_timeout, + ); + + parachains_relay_task.set( + parachains_relay::parachains_loop::run( + parachains_source.clone(), + parachains_target.clone(), + MetricsParams::disabled(), + futures::future::pending(), + ) + .fuse(), + ); + + restart_relay = false; + } + } +} + +/// On-demand parachains relay task name. +fn on_demand_parachains_relay_name() -> String { + format!("{}-to-{}-on-demand-parachain", SourceChain::NAME, TargetChain::NAME) +} + +/// On-demand relay state. +#[derive(Clone, Copy, Debug, PartialEq)] +enum RelayState { + /// On-demand relay is not doing anything. + Idle, + /// Relaying given relay header to relay given parachain header later. + RelayingRelayHeader(RelayNumber), + /// Relaying given parachain header. + RelayingParaHeader(HeaderId), +} + +/// Data gathered from source and target clients, used by on-demand relay. +#[derive(Debug)] +struct RelayData { + /// Parachain header number that is required at the target chain. + pub required_para_header: ParaNumber, + /// Parachain header number, known to the target chain. + pub para_header_at_target: Option, + /// Parachain header id, known to the source (relay) chain. + pub para_header_at_source: Option>, + /// Parachain header, that is available at the source relay chain at `relay_header_at_target` + /// block. + /// + /// May be `None` if there's no `relay_header_at_target` yet, or if the + /// `relay_header_at_target` is too old and we think its state has been pruned. + pub para_header_at_relay_header_at_target: Option>, + /// Relay header number at the source chain. + pub relay_header_at_source: RelayNumber, + /// Relay header number at the target chain. + pub relay_header_at_target: Option, +} + +/// Read required data from source and target clients. +async fn read_relay_data( + source: &ParachainsSource

, + target: &ParachainsTarget

, + required_header_number: BlockNumberOf, +) -> Result< + RelayData< + HashOf, + BlockNumberOf, + BlockNumberOf, + >, + FailedClient, +> +where + ParachainsTarget

: + TargetClient> + RelayClient, +{ + let map_target_err = |e| { + log::error!( + target: "bridge", + "[{}] Failed to read relay data from {} client: {:?}", + on_demand_parachains_relay_name::(), + P::TargetChain::NAME, + e, + ); + FailedClient::Target + }; + let map_source_err = |e| { + log::error!( + target: "bridge", + "[{}] Failed to read relay data from {} client: {:?}", + on_demand_parachains_relay_name::(), + P::SourceRelayChain::NAME, + e, + ); + FailedClient::Source + }; + + let best_target_block_hash = target.best_block().await.map_err(map_target_err)?.1; + let para_header_at_target = best_finalized_peer_header_at_self::< + P::TargetChain, + P::SourceParachain, + >(target.client(), best_target_block_hash) + .await; + // if there are no parachain heads at the target (`NoParachainHeadAtTarget`), we'll need to + // submit at least one. Otherwise the pallet will be treated as uninitialized and messages + // sync will stall. + let para_header_at_target = match para_header_at_target { + Ok(Some(para_header_at_target)) => Some(para_header_at_target.0), + Ok(None) => None, + Err(e) => return Err(map_target_err(e)), + }; + + let best_finalized_relay_header = + source.client().best_finalized_header().await.map_err(map_source_err)?; + let best_finalized_relay_block_id = best_finalized_relay_header.id(); + let para_header_at_source = source + .on_chain_para_head_id(best_finalized_relay_block_id) + .await + .map_err(map_source_err)?; + + let relay_header_at_source = best_finalized_relay_block_id.0; + let relay_header_at_target = best_finalized_peer_header_at_self::< + P::TargetChain, + P::SourceRelayChain, + >(target.client(), best_target_block_hash) + .await + .map_err(map_target_err)?; + + // if relay header at target is too old then its state may already be discarded at the source + // => just use `None` in this case + // + // the same is for case when there's no relay header at target at all + let available_relay_header_at_target = + relay_header_at_target.filter(|relay_header_at_target| { + !is_ancient_block(relay_header_at_target.number(), relay_header_at_source) + }); + let para_header_at_relay_header_at_target = + if let Some(available_relay_header_at_target) = available_relay_header_at_target { + source + .on_chain_para_head_id(available_relay_header_at_target) + .await + .map_err(map_source_err)? + } else { + None + }; + + Ok(RelayData { + required_para_header: required_header_number, + para_header_at_target, + para_header_at_source, + relay_header_at_source, + relay_header_at_target: relay_header_at_target + .map(|relay_header_at_target| relay_header_at_target.0), + para_header_at_relay_header_at_target, + }) +} + +/// Select relay and parachain headers that need to be relayed. +fn select_headers_to_relay( + data: &RelayData, + state: RelayState, +) -> RelayState +where + ParaHash: Clone, + ParaNumber: Copy + PartialOrd + Zero, + RelayNumber: Copy + Debug + Ord, +{ + // we can't do anything until **relay chain** bridge GRANDPA pallet is not initialized at the + // target chain + let relay_header_at_target = match data.relay_header_at_target { + Some(relay_header_at_target) => relay_header_at_target, + None => return RelayState::Idle, + }; + + // Process the `RelayingRelayHeader` state. + if let &RelayState::RelayingRelayHeader(relay_header_number) = &state { + if relay_header_at_target < relay_header_number { + // The required relay header hasn't yet been relayed. Ask / wait for it. + return state + } + + // We may switch to `RelayingParaHeader` if parachain head is available. + if let Some(para_header_at_relay_header_at_target) = + data.para_header_at_relay_header_at_target.as_ref() + { + return RelayState::RelayingParaHeader(para_header_at_relay_header_at_target.clone()) + } + + // else use the regular process - e.g. we may require to deliver new relay header first + } + + // Process the `RelayingParaHeader` state. + if let RelayState::RelayingParaHeader(para_header_id) = &state { + let para_header_at_target_or_zero = data.para_header_at_target.unwrap_or_else(Zero::zero); + if para_header_at_target_or_zero < para_header_id.0 { + // The required parachain header hasn't yet been relayed. Ask / wait for it. + return state + } + } + + // if we haven't read para head from the source, we can't yet do anything + let para_header_at_source = match data.para_header_at_source { + Some(ref para_header_at_source) => para_header_at_source.clone(), + None => return RelayState::Idle, + }; + + // if we have parachain head at the source, but no parachain heads at the target, we'll need + // to deliver at least one parachain head + let (required_para_header, para_header_at_target) = match data.para_header_at_target { + Some(para_header_at_target) => (data.required_para_header, para_header_at_target), + None => (para_header_at_source.0, Zero::zero()), + }; + + // if we have already satisfied our "customer", do nothing + if required_para_header <= para_header_at_target { + return RelayState::Idle + } + + // if required header is not available even at the source chain, let's wait + if required_para_header > para_header_at_source.0 { + return RelayState::Idle + } + + // we will always try to sync latest parachain/relay header, even if we've been asked for some + // its ancestor + + // we need relay chain header first + if relay_header_at_target < data.relay_header_at_source { + return RelayState::RelayingRelayHeader(data.relay_header_at_source) + } + + // if all relay headers synced, we may start directly with parachain header + RelayState::RelayingParaHeader(para_header_at_source) +} + +/// Environment for the `select_headers_to_prove` call. +#[async_trait] +trait SelectHeadersToProveEnvironment { + /// Returns associated parachain id. + fn parachain_id(&self) -> ParaId; + /// Returns best finalized relay block. + async fn best_finalized_relay_block_at_source( + &self, + ) -> Result, SubstrateError>; + /// Returns best finalized relay block that is known at `P::TargetChain`. + async fn best_finalized_relay_block_at_target( + &self, + ) -> Result, SubstrateError>; + /// Returns best finalized parachain block at given source relay chain block. + async fn best_finalized_para_block_at_source( + &self, + at_relay_block: HeaderId, + ) -> Result>, SubstrateError>; +} + +#[async_trait] +impl<'a, P: SubstrateParachainsPipeline> + SelectHeadersToProveEnvironment< + BlockNumberOf, + HashOf, + BlockNumberOf, + HashOf, + > for (&'a OnDemandParachainsRelay

, &'a ParachainsSource

) +{ + fn parachain_id(&self) -> ParaId { + ParaId(P::SourceParachain::PARACHAIN_ID) + } + + async fn best_finalized_relay_block_at_source( + &self, + ) -> Result, SubstrateError> { + Ok(self.0.source_relay_client.best_finalized_header().await?.id()) + } + + async fn best_finalized_relay_block_at_target( + &self, + ) -> Result, SubstrateError> { + Ok(crate::messages_source::read_client_state::( + &self.0.target_client, + None, + ) + .await? + .best_finalized_peer_at_best_self + .ok_or(SubstrateError::BridgePalletIsNotInitialized)?) + } + + async fn best_finalized_para_block_at_source( + &self, + at_relay_block: HeaderIdOf, + ) -> Result>, SubstrateError> { + self.1.on_chain_para_head_id(at_relay_block).await + } +} + +/// Given request to prove `required_parachain_header`, select actual headers that need to be +/// proved. +async fn select_headers_to_prove( + env: impl SelectHeadersToProveEnvironment, + required_parachain_header: PBN, +) -> Result<(bool, HeaderId, HeaderId), SubstrateError> +where + RBH: Copy, + RBN: BlockNumberBase, + PBH: Copy, + PBN: BlockNumberBase, +{ + // parachains proof also requires relay header proof. Let's first select relay block + // number that we'll be dealing with + let best_finalized_relay_block_at_source = env.best_finalized_relay_block_at_source().await?; + let best_finalized_relay_block_at_target = env.best_finalized_relay_block_at_target().await?; + + // if we can't prove `required_header` even using `best_finalized_relay_block_at_source`, we + // can't do anything here + // (this shall not actually happen, given current code, because we only require finalized + // headers) + let best_possible_parachain_block = env + .best_finalized_para_block_at_source(best_finalized_relay_block_at_source) + .await? + .filter(|best_possible_parachain_block| { + best_possible_parachain_block.number() >= required_parachain_header + }) + .ok_or(SubstrateError::MissingRequiredParachainHead( + env.parachain_id(), + required_parachain_header.unique_saturated_into(), + ))?; + + // we don't require source node to be archive, so we can't craft storage proofs using + // ancient headers. So if the `best_finalized_relay_block_at_target` is too ancient, we + // can't craft storage proofs using it + let may_use_state_at_best_finalized_relay_block_at_target = !is_ancient_block( + best_finalized_relay_block_at_target.number(), + best_finalized_relay_block_at_source.number(), + ); + + // now let's check if `required_header` may be proved using + // `best_finalized_relay_block_at_target` + let selection = if may_use_state_at_best_finalized_relay_block_at_target { + env.best_finalized_para_block_at_source(best_finalized_relay_block_at_target) + .await? + .filter(|best_finalized_para_block_at_target| { + best_finalized_para_block_at_target.number() >= required_parachain_header + }) + .map(|best_finalized_para_block_at_target| { + (false, best_finalized_relay_block_at_target, best_finalized_para_block_at_target) + }) + } else { + None + }; + + Ok(selection.unwrap_or(( + true, + best_finalized_relay_block_at_source, + best_possible_parachain_block, + ))) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn relay_waits_for_relay_header_to_be_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(700), + para_header_at_relay_header_at_target: Some(HeaderId(100, 100)), + }, + RelayState::RelayingRelayHeader(750), + ), + RelayState::RelayingRelayHeader(750), + ); + } + + #[test] + fn relay_starts_relaying_requested_para_header_after_relay_header_is_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(750), + para_header_at_relay_header_at_target: Some(HeaderId(100, 100)), + }, + RelayState::RelayingRelayHeader(750), + ), + RelayState::RelayingParaHeader(HeaderId(100, 100)), + ); + } + + #[test] + fn relay_selects_better_para_header_after_better_relay_header_is_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::RelayingRelayHeader(750), + ), + RelayState::RelayingParaHeader(HeaderId(105, 105)), + ); + } + #[test] + fn relay_waits_for_para_header_to_be_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::RelayingParaHeader(HeaderId(105, 105)), + ), + RelayState::RelayingParaHeader(HeaderId(105, 105)), + ); + } + + #[test] + fn relay_stays_idle_if_required_para_header_is_already_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_waits_for_required_para_header_to_appear_at_source_1() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: None, + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_waits_for_required_para_header_to_appear_at_source_2() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_starts_relaying_relay_header_when_new_para_header_is_requested() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::RelayingRelayHeader(800), + ); + } + + #[test] + fn relay_starts_relaying_para_header_when_new_para_header_is_requested() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(800), + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingParaHeader(HeaderId(125, 125)), + ); + } + + #[test] + fn relay_goes_idle_when_parachain_is_deregistered() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: None, + relay_header_at_source: 800, + relay_header_at_target: Some(800), + para_header_at_relay_header_at_target: None, + }, + RelayState::RelayingRelayHeader(800), + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_starts_relaying_first_parachain_header() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 0, + para_header_at_target: None, + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(800), + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingParaHeader(HeaderId(125, 125)), + ); + } + + #[test] + fn relay_starts_relaying_relay_header_to_relay_first_parachain_header() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 0, + para_header_at_target: None, + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(700), + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingRelayHeader(800), + ); + } + + // tuple is: + // + // - best_finalized_relay_block_at_source + // - best_finalized_relay_block_at_target + // - best_finalized_para_block_at_source at best_finalized_relay_block_at_source + // - best_finalized_para_block_at_source at best_finalized_relay_block_at_target + #[async_trait] + impl SelectHeadersToProveEnvironment for (u32, u32, u32, u32) { + fn parachain_id(&self) -> ParaId { + ParaId(0) + } + + async fn best_finalized_relay_block_at_source( + &self, + ) -> Result, SubstrateError> { + Ok(HeaderId(self.0, self.0)) + } + + async fn best_finalized_relay_block_at_target( + &self, + ) -> Result, SubstrateError> { + Ok(HeaderId(self.1, self.1)) + } + + async fn best_finalized_para_block_at_source( + &self, + at_relay_block: HeaderId, + ) -> Result>, SubstrateError> { + if at_relay_block.0 == self.0 { + Ok(Some(HeaderId(self.2, self.2))) + } else if at_relay_block.0 == self.1 { + Ok(Some(HeaderId(self.3, self.3))) + } else { + Ok(None) + } + } + } + + #[async_std::test] + async fn select_headers_to_prove_returns_err_if_required_para_block_is_missing_at_source() { + assert!(matches!( + select_headers_to_prove((20_u32, 10_u32, 200_u32, 100_u32), 300_u32,).await, + Err(SubstrateError::MissingRequiredParachainHead(ParaId(0), 300_u64)), + )); + } + + #[async_std::test] + async fn select_headers_to_prove_fails_to_use_existing_ancient_relay_block() { + assert_eq!( + select_headers_to_prove((220_u32, 10_u32, 200_u32, 100_u32), 100_u32,) + .await + .map_err(drop), + Ok((true, HeaderId(220, 220), HeaderId(200, 200))), + ); + } + + #[async_std::test] + async fn select_headers_to_prove_is_able_to_use_existing_recent_relay_block() { + assert_eq!( + select_headers_to_prove((40_u32, 10_u32, 200_u32, 100_u32), 100_u32,) + .await + .map_err(drop), + Ok((false, HeaderId(10, 10), HeaderId(100, 100))), + ); + } + + #[async_std::test] + async fn select_headers_to_prove_uses_new_relay_block() { + assert_eq!( + select_headers_to_prove((20_u32, 10_u32, 200_u32, 100_u32), 200_u32,) + .await + .map_err(drop), + Ok((true, HeaderId(20, 20), HeaderId(200, 200))), + ); + } +} diff --git a/relays/lib-substrate-relay/src/parachains/mod.rs b/relays/lib-substrate-relay/src/parachains/mod.rs new file mode 100644 index 000000000000..722f9b61f9f0 --- /dev/null +++ b/relays/lib-substrate-relay/src/parachains/mod.rs @@ -0,0 +1,108 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! parachain finality proofs synchronization pipelines. + +use async_trait::async_trait; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use pallet_bridge_parachains::{ + Call as BridgeParachainsCall, Config as BridgeParachainsConfig, RelayBlockHash, + RelayBlockHasher, RelayBlockNumber, +}; +use parachains_relay::ParachainsPipeline; +use relay_substrate_client::{ + CallOf, Chain, ChainWithTransactions, HeaderIdOf, Parachain, RelayChain, +}; +use std::{fmt::Debug, marker::PhantomData}; + +pub mod source; +pub mod target; + +/// Substrate -> Substrate parachain finality proofs synchronization pipeline. +/// +/// This is currently restricted to the single parachain, because it is how it +/// will be used (at least) initially. +#[async_trait] +pub trait SubstrateParachainsPipeline: 'static + Clone + Debug + Send + Sync { + /// Headers of this parachain are submitted to the `Self::TargetChain`. + type SourceParachain: Parachain; + /// Relay chain that is storing headers of `Self::SourceParachain`. + type SourceRelayChain: RelayChain; + /// Target chain where `Self::SourceParachain` headers are submitted. + type TargetChain: ChainWithTransactions; + + /// How submit parachains heads call is built? + type SubmitParachainHeadsCallBuilder: SubmitParachainHeadsCallBuilder; +} + +/// Adapter that allows all `SubstrateParachainsPipeline` to act as `ParachainsPipeline`. +#[derive(Clone, Debug)] +pub struct ParachainsPipelineAdapter { + _phantom: PhantomData

, +} + +impl ParachainsPipeline for ParachainsPipelineAdapter

{ + type SourceParachain = P::SourceParachain; + type SourceRelayChain = P::SourceRelayChain; + type TargetChain = P::TargetChain; +} + +/// Different ways of building `submit_parachain_heads` calls. +pub trait SubmitParachainHeadsCallBuilder: + 'static + Send + Sync +{ + /// Given parachains and their heads proof, build call of `submit_parachain_heads` + /// function of bridge parachains module at the target chain. + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf; +} + +/// Building `submit_parachain_heads` call when you have direct access to the target +/// chain runtime. +pub struct DirectSubmitParachainHeadsCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl SubmitParachainHeadsCallBuilder

for DirectSubmitParachainHeadsCallBuilder +where + P: SubstrateParachainsPipeline, + P::SourceRelayChain: Chain, + R: BridgeParachainsConfig + Send + Sync, + I: 'static + Send + Sync, + R::BridgedChain: bp_runtime::Chain< + BlockNumber = RelayBlockNumber, + Hash = RelayBlockHash, + Hasher = RelayBlockHasher, + >, + CallOf: From>, +{ + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + BridgeParachainsCall::::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + } + .into() + } +} diff --git a/relays/lib-substrate-relay/src/parachains/source.rs b/relays/lib-substrate-relay/src/parachains/source.rs new file mode 100644 index 000000000000..146c5840cd51 --- /dev/null +++ b/relays/lib-substrate-relay/src/parachains/source.rs @@ -0,0 +1,169 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Parachain heads source. + +use crate::parachains::{ParachainsPipelineAdapter, SubstrateParachainsPipeline}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use bp_parachains::parachain_head_storage_key_at_source; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use bp_runtime::HeaderIdProvider; +use codec::Decode; +use parachains_relay::parachains_loop::{AvailableHeader, SourceClient}; +use relay_substrate_client::{ + is_ancient_block, Chain, Client, Error as SubstrateError, HeaderIdOf, HeaderOf, ParachainBase, + RelayChain, +}; +use relay_utils::relay_loop::Client as RelayClient; + +/// Shared updatable reference to the maximal parachain header id that we want to sync from the +/// source. +pub type RequiredHeaderIdRef = Arc>>>; + +/// Substrate client as parachain heads source. +#[derive(Clone)] +pub struct ParachainsSource { + client: Client, + max_head_id: RequiredHeaderIdRef, +} + +impl ParachainsSource

{ + /// Creates new parachains source client. + pub fn new( + client: Client, + max_head_id: RequiredHeaderIdRef, + ) -> Self { + ParachainsSource { client, max_head_id } + } + + /// Returns reference to the underlying RPC client. + pub fn client(&self) -> &Client { + &self.client + } + + /// Return decoded head of given parachain. + pub async fn on_chain_para_head_id( + &self, + at_block: HeaderIdOf, + ) -> Result>, SubstrateError> { + let para_id = ParaId(P::SourceParachain::PARACHAIN_ID); + let storage_key = + parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, para_id); + let para_head = self.client.raw_storage_value(storage_key, Some(at_block.1)).await?; + let para_head = para_head.map(|h| ParaHead::decode(&mut &h.0[..])).transpose()?; + let para_head = match para_head { + Some(para_head) => para_head, + None => return Ok(None), + }; + let para_head: HeaderOf = Decode::decode(&mut ¶_head.0[..])?; + Ok(Some(para_head.id())) + } +} + +#[async_trait] +impl RelayClient for ParachainsSource

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + self.client.reconnect().await + } +} + +#[async_trait] +impl SourceClient> + for ParachainsSource

+where + P::SourceParachain: Chain, +{ + async fn ensure_synced(&self) -> Result { + match self.client.ensure_synced().await { + Ok(_) => Ok(true), + Err(SubstrateError::ClientNotSynced(_)) => Ok(false), + Err(e) => Err(e), + } + } + + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error> { + // if requested relay header is ancient, then we don't even want to try to read the + // parachain head - we simply return `Unavailable` + let best_block_number = self.client.best_finalized_header_number().await?; + if is_ancient_block(at_block.number(), best_block_number) { + return Ok(AvailableHeader::Unavailable) + } + + // else - try to read head from the source client + let mut para_head_id = AvailableHeader::Missing; + if let Some(on_chain_para_head_id) = self.on_chain_para_head_id(at_block).await? { + // Never return head that is larger than requested. This way we'll never sync + // headers past `max_header_id`. + para_head_id = match *self.max_head_id.lock().await { + AvailableHeader::Unavailable => AvailableHeader::Unavailable, + AvailableHeader::Missing => { + // `max_header_id` is not set. There is no limit. + AvailableHeader::Available(on_chain_para_head_id) + }, + AvailableHeader::Available(max_head_id) => { + // We report at most `max_header_id`. + AvailableHeader::Available(std::cmp::min(on_chain_para_head_id, max_head_id)) + }, + } + } + + Ok(para_head_id) + } + + async fn prove_parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result<(ParaHeadsProof, ParaHash), Self::Error> { + let parachain = ParaId(P::SourceParachain::PARACHAIN_ID); + let storage_key = + parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, parachain); + let parachain_heads_proof = self + .client + .prove_storage(vec![storage_key.clone()], at_block.1) + .await? + .into_iter_nodes() + .collect(); + + // why we're reading parachain head here once again (it has already been read at the + // `parachain_head`)? that's because `parachain_head` sometimes returns obsolete parachain + // head and loop sometimes asks to prove this obsolete head and gets other (actual) head + // instead + // + // => since we want to provide proper hashes in our `submit_parachain_heads` call, we're + // rereading actual value here + let parachain_head = self + .client + .raw_storage_value(storage_key, Some(at_block.1)) + .await? + .map(|h| ParaHead::decode(&mut &h.0[..])) + .transpose()? + .ok_or_else(|| { + SubstrateError::Custom(format!( + "Failed to read expected parachain {parachain:?} head at {at_block:?}" + )) + })?; + let parachain_head_hash = parachain_head.hash(); + + Ok((ParaHeadsProof(parachain_heads_proof), parachain_head_hash)) + } +} diff --git a/relays/lib-substrate-relay/src/parachains/target.rs b/relays/lib-substrate-relay/src/parachains/target.rs new file mode 100644 index 000000000000..6df7bc0a742a --- /dev/null +++ b/relays/lib-substrate-relay/src/parachains/target.rs @@ -0,0 +1,148 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Parachain heads target. + +use crate::{ + parachains::{ + ParachainsPipelineAdapter, SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, + }, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use bp_runtime::HeaderIdProvider; +use codec::Decode; +use parachains_relay::parachains_loop::TargetClient; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, Client, Error as SubstrateError, HeaderIdOf, + ParachainBase, TransactionEra, TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_core::{Bytes, Pair}; + +/// Substrate client as parachain heads source. +pub struct ParachainsTarget { + client: Client, + transaction_params: TransactionParams>, +} + +impl ParachainsTarget

{ + /// Creates new parachains target client. + pub fn new( + client: Client, + transaction_params: TransactionParams>, + ) -> Self { + ParachainsTarget { client, transaction_params } + } + + /// Returns reference to the underlying RPC client. + pub fn client(&self) -> &Client { + &self.client + } +} + +impl Clone for ParachainsTarget

{ + fn clone(&self) -> Self { + ParachainsTarget { + client: self.client.clone(), + transaction_params: self.transaction_params.clone(), + } + } +} + +#[async_trait] +impl RelayClient for ParachainsTarget

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + self.client.reconnect().await + } +} + +#[async_trait] +impl

TargetClient> for ParachainsTarget

+where + P: SubstrateParachainsPipeline, + AccountIdOf: From< as Pair>::Public>, +{ + type TransactionTracker = TransactionTracker>; + + async fn best_block(&self) -> Result, Self::Error> { + let best_header = self.client.best_header().await?; + let best_id = best_header.id(); + + Ok(best_id) + } + + async fn best_finalized_source_relay_chain_block( + &self, + at_block: &HeaderIdOf, + ) -> Result, Self::Error> { + self.client + .typed_state_call::<_, Option>>( + P::SourceRelayChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), + (), + Some(at_block.1), + ) + .await? + .map(Ok) + .unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized)) + } + + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error> { + let encoded_best_finalized_source_para_block = self + .client + .state_call( + P::SourceParachain::BEST_FINALIZED_HEADER_ID_METHOD.into(), + Bytes(Vec::new()), + Some(at_block.1), + ) + .await?; + + Ok(Option::>::decode( + &mut &encoded_best_finalized_source_para_block.0[..], + ) + .map_err(SubstrateError::ResponseParseFailed)?) + } + + async fn submit_parachain_head_proof( + &self, + at_relay_block: HeaderIdOf, + updated_head_hash: ParaHash, + proof: ParaHeadsProof, + ) -> Result { + let transaction_params = self.transaction_params.clone(); + let call = P::SubmitParachainHeadsCallBuilder::build_submit_parachain_heads_call( + at_relay_block, + vec![(ParaId(P::SourceParachain::PARACHAIN_ID), updated_head_hash)], + proof, + ); + self.client + .submit_and_watch_signed_extrinsic( + &transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, transaction_params.mortality))) + }, + ) + .await + } +} diff --git a/relays/messages/Cargo.toml b/relays/messages/Cargo.toml new file mode 100644 index 000000000000..ccaed009a5ab --- /dev/null +++ b/relays/messages/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "messages-relay" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +async-std = { version = "1.6.5", features = ["attributes"] } +async-trait = "0.1" +env_logger = "0.10" +futures = "0.3.29" +hex = "0.4" +log = "0.4.20" +num-traits = "0.2" +parking_lot = "0.12.1" + +# Bridge Dependencies + +bp-messages = { path = "../../primitives/messages" } +finality-relay = { path = "../finality" } +relay-utils = { path = "../utils" } + +sp-arithmetic = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/messages/src/lib.rs b/relays/messages/src/lib.rs new file mode 100644 index 000000000000..9c62cee5ee3d --- /dev/null +++ b/relays/messages/src/lib.rs @@ -0,0 +1,37 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Relaying [`pallet-bridge-messages`](../pallet_bridge_messages/index.html) application specific +//! data. Message lane allows sending arbitrary messages between bridged chains. This +//! module provides entrypoint that starts reading messages from given message lane +//! of source chain and submits proof-of-message-at-source-chain transactions to the +//! target chain. Additionally, proofs-of-messages-delivery are sent back from the +//! target chain to the source chain. + +// required for futures::select! +#![recursion_limit = "1024"] +#![warn(missing_docs)] + +mod metrics; + +pub mod message_lane; +pub mod message_lane_loop; + +mod message_race_delivery; +mod message_race_limits; +mod message_race_loop; +mod message_race_receiving; +mod message_race_strategy; diff --git a/relays/messages/src/message_lane.rs b/relays/messages/src/message_lane.rs new file mode 100644 index 000000000000..5c9728ad93ab --- /dev/null +++ b/relays/messages/src/message_lane.rs @@ -0,0 +1,71 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! One-way message lane types. Within single one-way lane we have three 'races' where we try to: +//! +//! 1) relay new messages from source to target node; +//! 2) relay proof-of-delivery from target to source node. + +use num_traits::{SaturatingAdd, Zero}; +use relay_utils::{BlockNumberBase, HeaderId}; +use sp_arithmetic::traits::AtLeast32BitUnsigned; +use std::{fmt::Debug, ops::Sub}; + +/// One-way message lane. +pub trait MessageLane: 'static + Clone + Send + Sync { + /// Name of the messages source. + const SOURCE_NAME: &'static str; + /// Name of the messages target. + const TARGET_NAME: &'static str; + + /// Messages proof. + type MessagesProof: Clone + Debug + Send + Sync; + /// Messages receiving proof. + type MessagesReceivingProof: Clone + Debug + Send + Sync; + + /// The type of the source chain token balance, that is used to: + /// + /// 1) pay transaction fees; + /// 2) pay message delivery and dispatch fee; + /// 3) pay relayer rewards. + type SourceChainBalance: AtLeast32BitUnsigned + + Clone + + Copy + + Debug + + PartialOrd + + Sub + + SaturatingAdd + + Zero + + Send + + Sync; + /// Number of the source header. + type SourceHeaderNumber: BlockNumberBase; + /// Hash of the source header. + type SourceHeaderHash: Clone + Debug + Default + PartialEq + Send + Sync; + + /// Number of the target header. + type TargetHeaderNumber: BlockNumberBase; + /// Hash of the target header. + type TargetHeaderHash: Clone + Debug + Default + PartialEq + Send + Sync; +} + +/// Source header id within given one-way message lane. +pub type SourceHeaderIdOf

= + HeaderId<

::SourceHeaderHash,

::SourceHeaderNumber>; + +/// Target header id within given one-way message lane. +pub type TargetHeaderIdOf

= + HeaderId<

::TargetHeaderHash,

::TargetHeaderNumber>; diff --git a/relays/messages/src/message_lane_loop.rs b/relays/messages/src/message_lane_loop.rs new file mode 100644 index 000000000000..b681d86d2ae8 --- /dev/null +++ b/relays/messages/src/message_lane_loop.rs @@ -0,0 +1,1277 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Message delivery loop. Designed to work with messages pallet. +//! +//! Single relay instance delivers messages of single lane in single direction. +//! To serve two-way lane, you would need two instances of relay. +//! To serve N two-way lanes, you would need N*2 instances of relay. +//! +//! Please keep in mind that the best header in this file is actually best +//! finalized header. I.e. when talking about headers in lane context, we +//! only care about finalized headers. + +use std::{collections::BTreeMap, fmt::Debug, future::Future, ops::RangeInclusive, time::Duration}; + +use async_trait::async_trait; +use futures::{channel::mpsc::unbounded, future::FutureExt, stream::StreamExt}; + +use bp_messages::{LaneId, MessageNonce, UnrewardedRelayersState, Weight}; +use relay_utils::{ + interval, metrics::MetricsParams, process_future_result, relay_loop::Client as RelayClient, + retry_backoff, FailedClient, TransactionTracker, +}; + +use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_race_delivery::run as run_message_delivery_race, + message_race_receiving::run as run_message_receiving_race, + metrics::MessageLaneLoopMetrics, +}; + +/// Message lane loop configuration params. +#[derive(Debug, Clone)] +pub struct Params { + /// Id of lane this loop is servicing. + pub lane: LaneId, + /// Interval at which we ask target node about its updates. + pub source_tick: Duration, + /// Interval at which we ask target node about its updates. + pub target_tick: Duration, + /// Delay between moments when connection error happens and our reconnect attempt. + pub reconnect_delay: Duration, + /// Message delivery race parameters. + pub delivery_params: MessageDeliveryParams, +} + +/// Message delivery race parameters. +#[derive(Debug, Clone)] +pub struct MessageDeliveryParams { + /// Maximal number of unconfirmed relayer entries at the inbound lane. If there's that number + /// of entries in the `InboundLaneData::relayers` set, all new messages will be rejected until + /// reward payment will be proved (by including outbound lane state to the message delivery + /// transaction). + pub max_unrewarded_relayer_entries_at_target: MessageNonce, + /// Message delivery race will stop delivering messages if there are + /// `max_unconfirmed_nonces_at_target` unconfirmed nonces on the target node. The race would + /// continue once they're confirmed by the receiving race. + pub max_unconfirmed_nonces_at_target: MessageNonce, + /// Maximal number of relayed messages in single delivery transaction. + pub max_messages_in_single_batch: MessageNonce, + /// Maximal cumulative dispatch weight of relayed messages in single delivery transaction. + pub max_messages_weight_in_single_batch: Weight, + /// Maximal cumulative size of relayed messages in single delivery transaction. + pub max_messages_size_in_single_batch: u32, +} + +/// Message details. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct MessageDetails { + /// Message dispatch weight. + pub dispatch_weight: Weight, + /// Message size (number of bytes in encoded payload). + pub size: u32, + /// The relayer reward paid in the source chain tokens. + pub reward: SourceChainBalance, +} + +/// Messages details map. +pub type MessageDetailsMap = + BTreeMap>; + +/// Message delivery race proof parameters. +#[derive(Debug, PartialEq, Eq)] +pub struct MessageProofParameters { + /// Include outbound lane state proof? + pub outbound_state_proof_required: bool, + /// Cumulative dispatch weight of messages that we're building proof for. + pub dispatch_weight: Weight, +} + +/// Artifacts of submitting nonces proof. +pub struct NoncesSubmitArtifacts { + /// Submitted nonces range. + pub nonces: RangeInclusive, + /// Submitted transaction tracker. + pub tx_tracker: T, +} + +/// Batch transaction that already submit some headers and needs to be extended with +/// messages/delivery proof before sending. +pub trait BatchTransaction: Debug + Send + Sync { + /// Header that was required in the original call and which is bundled within this + /// batch transaction. + fn required_header_id(&self) -> HeaderId; +} + +/// Source client trait. +#[async_trait] +pub trait SourceClient: RelayClient { + /// Type of batch transaction that submits finality and message receiving proof. + type BatchTransaction: BatchTransaction> + Clone; + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker>; + + /// Returns state of the client. + async fn state(&self) -> Result, Self::Error>; + + /// Get nonce of instance of latest generated message. + async fn latest_generated_nonce( + &self, + id: SourceHeaderIdOf

, + ) -> Result<(SourceHeaderIdOf

, MessageNonce), Self::Error>; + + /// Get nonce of the latest message, which receiving has been confirmed by the target chain. + async fn latest_confirmed_received_nonce( + &self, + id: SourceHeaderIdOf

, + ) -> Result<(SourceHeaderIdOf

, MessageNonce), Self::Error>; + + /// Returns mapping of message nonces, generated on this client, to their weights. + /// + /// Some messages may be missing from returned map, if corresponding messages were pruned at + /// the source chain. + async fn generated_message_details( + &self, + id: SourceHeaderIdOf

, + nonces: RangeInclusive, + ) -> Result, Self::Error>; + + /// Prove messages in inclusive range [begin; end]. + async fn prove_messages( + &self, + id: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof_parameters: MessageProofParameters, + ) -> Result<(SourceHeaderIdOf

, RangeInclusive, P::MessagesProof), Self::Error>; + + /// Submit messages receiving proof. + async fn submit_messages_receiving_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: TargetHeaderIdOf

, + proof: P::MessagesReceivingProof, + ) -> Result; + + /// We need given finalized target header on source to continue synchronization. + /// + /// We assume that the absence of header `id` has already been checked by caller. + /// + /// The client may return `Some(_)`, which means that nothing has happened yet and + /// the caller must generate and append message receiving proof to the batch transaction + /// to actually send it (along with required header) to the node. + /// + /// If function has returned `None`, it means that the caller now must wait for the + /// appearance of the target header `id` at the source client. + async fn require_target_header_on_source( + &self, + id: TargetHeaderIdOf

, + ) -> Result, Self::Error>; +} + +/// Target client trait. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Type of batch transaction that submits finality and messages proof. + type BatchTransaction: BatchTransaction> + Clone; + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker>; + + /// Returns state of the client. + async fn state(&self) -> Result, Self::Error>; + + /// Get nonce of latest received message. + async fn latest_received_nonce( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, MessageNonce), Self::Error>; + + /// Get nonce of the latest confirmed message. + async fn latest_confirmed_received_nonce( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, MessageNonce), Self::Error>; + + /// Get state of unrewarded relayers set at the inbound lane. + async fn unrewarded_relayers_state( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, UnrewardedRelayersState), Self::Error>; + + /// Prove messages receiving at given block. + async fn prove_messages_receiving( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, P::MessagesReceivingProof), Self::Error>; + + /// Submit messages proof. + async fn submit_messages_proof( + &self, + maybe_batch_tx: Option, + generated_at_header: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof: P::MessagesProof, + ) -> Result, Self::Error>; + + /// We need given finalized source header on target to continue synchronization. + /// + /// The client may return `Some(_)`, which means that nothing has happened yet and + /// the caller must generate and append messages proof to the batch transaction + /// to actually send it (along with required header) to the node. + /// + /// If function has returned `None`, it means that the caller now must wait for the + /// appearance of the source header `id` at the target client. + async fn require_source_header_on_target( + &self, + id: SourceHeaderIdOf

, + ) -> Result, Self::Error>; +} + +/// State of the client. +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct ClientState { + /// The best header id of this chain. + pub best_self: SelfHeaderId, + /// Best finalized header id of this chain. + pub best_finalized_self: SelfHeaderId, + /// Best finalized header id of the peer chain read at the best block of this chain (at + /// `best_finalized_self`). + /// + /// It may be `None` e,g. if peer is a parachain and we haven't yet relayed any parachain + /// heads. + pub best_finalized_peer_at_best_self: Option, + /// Header id of the peer chain with the number, matching the + /// `best_finalized_peer_at_best_self`. + pub actual_best_finalized_peer_at_best_self: Option, +} + +/// State of source client in one-way message lane. +pub type SourceClientState

= ClientState, TargetHeaderIdOf

>; + +/// State of target client in one-way message lane. +pub type TargetClientState

= ClientState, SourceHeaderIdOf

>; + +/// Both clients state. +#[derive(Debug, Default)] +pub struct ClientsState { + /// Source client state. + pub source: Option>, + /// Target client state. + pub target: Option>, +} + +/// Return prefix that will be used by default to expose Prometheus metrics of the finality proofs +/// sync loop. +pub fn metrics_prefix(lane: &LaneId) -> String { + format!("{}_to_{}_MessageLane_{}", P::SOURCE_NAME, P::TARGET_NAME, hex::encode(lane)) +} + +/// Run message lane service loop. +pub async fn run( + params: Params, + source_client: impl SourceClient

, + target_client: impl TargetClient

, + metrics_params: MetricsParams, + exit_signal: impl Future + Send + 'static, +) -> Result<(), relay_utils::Error> { + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .reconnect_delay(params.reconnect_delay) + .with_metrics(metrics_params) + .loop_metric(MessageLaneLoopMetrics::new(Some(&metrics_prefix::

(¶ms.lane)))?)? + .expose() + .await? + .run(metrics_prefix::

(¶ms.lane), move |source_client, target_client, metrics| { + run_until_connection_lost( + params.clone(), + source_client, + target_client, + metrics, + exit_signal.clone(), + ) + }) + .await +} + +/// Run one-way message delivery loop until connection with target or source node is lost, or exit +/// signal is received. +async fn run_until_connection_lost, TC: TargetClient

>( + params: Params, + source_client: SC, + target_client: TC, + metrics_msg: Option, + exit_signal: impl Future, +) -> Result<(), FailedClient> { + let mut source_retry_backoff = retry_backoff(); + let mut source_client_is_online = false; + let mut source_state_required = true; + let source_state = source_client.state().fuse(); + let source_go_offline_future = futures::future::Fuse::terminated(); + let source_tick_stream = interval(params.source_tick).fuse(); + + let mut target_retry_backoff = retry_backoff(); + let mut target_client_is_online = false; + let mut target_state_required = true; + let target_state = target_client.state().fuse(); + let target_go_offline_future = futures::future::Fuse::terminated(); + let target_tick_stream = interval(params.target_tick).fuse(); + + let ( + (delivery_source_state_sender, delivery_source_state_receiver), + (delivery_target_state_sender, delivery_target_state_receiver), + ) = (unbounded(), unbounded()); + let delivery_race_loop = run_message_delivery_race( + source_client.clone(), + delivery_source_state_receiver, + target_client.clone(), + delivery_target_state_receiver, + metrics_msg.clone(), + params.delivery_params, + ) + .fuse(); + + let ( + (receiving_source_state_sender, receiving_source_state_receiver), + (receiving_target_state_sender, receiving_target_state_receiver), + ) = (unbounded(), unbounded()); + let receiving_race_loop = run_message_receiving_race( + source_client.clone(), + receiving_source_state_receiver, + target_client.clone(), + receiving_target_state_receiver, + metrics_msg.clone(), + ) + .fuse(); + + let exit_signal = exit_signal.fuse(); + + futures::pin_mut!( + source_state, + source_go_offline_future, + source_tick_stream, + target_state, + target_go_offline_future, + target_tick_stream, + delivery_race_loop, + receiving_race_loop, + exit_signal + ); + + loop { + futures::select! { + new_source_state = source_state => { + source_state_required = false; + + source_client_is_online = process_future_result( + new_source_state, + &mut source_retry_backoff, + |new_source_state| { + log::debug!( + target: "bridge", + "Received state from {} node: {:?}", + P::SOURCE_NAME, + new_source_state, + ); + let _ = delivery_source_state_sender.unbounded_send(new_source_state.clone()); + let _ = receiving_source_state_sender.unbounded_send(new_source_state.clone()); + + if let Some(metrics_msg) = metrics_msg.as_ref() { + metrics_msg.update_source_state::

(new_source_state); + } + }, + &mut source_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving state from {} node", P::SOURCE_NAME), + ).fail_if_connection_error(FailedClient::Source)?; + }, + _ = source_go_offline_future => { + source_client_is_online = true; + }, + _ = source_tick_stream.next() => { + source_state_required = true; + }, + new_target_state = target_state => { + target_state_required = false; + + target_client_is_online = process_future_result( + new_target_state, + &mut target_retry_backoff, + |new_target_state| { + log::debug!( + target: "bridge", + "Received state from {} node: {:?}", + P::TARGET_NAME, + new_target_state, + ); + let _ = delivery_target_state_sender.unbounded_send(new_target_state.clone()); + let _ = receiving_target_state_sender.unbounded_send(new_target_state.clone()); + + if let Some(metrics_msg) = metrics_msg.as_ref() { + metrics_msg.update_target_state::

(new_target_state); + } + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving state from {} node", P::TARGET_NAME), + ).fail_if_connection_error(FailedClient::Target)?; + }, + _ = target_go_offline_future => { + target_client_is_online = true; + }, + _ = target_tick_stream.next() => { + target_state_required = true; + }, + + delivery_error = delivery_race_loop => { + match delivery_error { + Ok(_) => unreachable!("only ends with error; qed"), + Err(err) => return Err(err), + } + }, + receiving_error = receiving_race_loop => { + match receiving_error { + Ok(_) => unreachable!("only ends with error; qed"), + Err(err) => return Err(err), + } + }, + + () = exit_signal => { + return Ok(()); + } + } + + if source_client_is_online && source_state_required { + log::debug!(target: "bridge", "Asking {} node about its state", P::SOURCE_NAME); + source_state.set(source_client.state().fuse()); + source_client_is_online = false; + } + + if target_client_is_online && target_state_required { + log::debug!(target: "bridge", "Asking {} node about its state", P::TARGET_NAME); + target_state.set(target_client.state().fuse()); + target_client_is_online = false; + } + } +} + +#[cfg(test)] +pub(crate) mod tests { + use std::sync::Arc; + + use futures::stream::StreamExt; + use parking_lot::Mutex; + + use relay_utils::{HeaderId, MaybeConnectionError, TrackedTransactionStatus}; + + use super::*; + + pub fn header_id(number: TestSourceHeaderNumber) -> TestSourceHeaderId { + HeaderId(number, number) + } + + pub type TestSourceChainBalance = u64; + pub type TestSourceHeaderId = HeaderId; + pub type TestTargetHeaderId = HeaderId; + + pub type TestMessagesProof = (RangeInclusive, Option); + pub type TestMessagesReceivingProof = MessageNonce; + + pub type TestSourceHeaderNumber = u64; + pub type TestSourceHeaderHash = u64; + + pub type TestTargetHeaderNumber = u64; + pub type TestTargetHeaderHash = u64; + + #[derive(Debug)] + pub struct TestError; + + impl MaybeConnectionError for TestError { + fn is_connection_error(&self) -> bool { + true + } + } + + #[derive(Clone)] + pub struct TestMessageLane; + + impl MessageLane for TestMessageLane { + const SOURCE_NAME: &'static str = "TestSource"; + const TARGET_NAME: &'static str = "TestTarget"; + + type MessagesProof = TestMessagesProof; + type MessagesReceivingProof = TestMessagesReceivingProof; + + type SourceChainBalance = TestSourceChainBalance; + type SourceHeaderNumber = TestSourceHeaderNumber; + type SourceHeaderHash = TestSourceHeaderHash; + + type TargetHeaderNumber = TestTargetHeaderNumber; + type TargetHeaderHash = TestTargetHeaderHash; + } + + #[derive(Clone, Debug)] + pub struct TestMessagesBatchTransaction { + required_header_id: TestSourceHeaderId, + } + + #[async_trait] + impl BatchTransaction for TestMessagesBatchTransaction { + fn required_header_id(&self) -> TestSourceHeaderId { + self.required_header_id + } + } + + #[derive(Clone, Debug)] + pub struct TestConfirmationBatchTransaction { + required_header_id: TestTargetHeaderId, + } + + #[async_trait] + impl BatchTransaction for TestConfirmationBatchTransaction { + fn required_header_id(&self) -> TestTargetHeaderId { + self.required_header_id + } + } + + #[derive(Clone, Debug)] + pub struct TestTransactionTracker(TrackedTransactionStatus); + + impl Default for TestTransactionTracker { + fn default() -> TestTransactionTracker { + TestTransactionTracker(TrackedTransactionStatus::Finalized(Default::default())) + } + } + + #[async_trait] + impl TransactionTracker for TestTransactionTracker { + type HeaderId = TestTargetHeaderId; + + async fn wait(self) -> TrackedTransactionStatus { + self.0 + } + } + + #[derive(Debug, Clone)] + pub struct TestClientData { + is_source_fails: bool, + is_source_reconnected: bool, + source_state: SourceClientState, + source_latest_generated_nonce: MessageNonce, + source_latest_confirmed_received_nonce: MessageNonce, + source_tracked_transaction_status: TrackedTransactionStatus, + submitted_messages_receiving_proofs: Vec, + is_target_fails: bool, + is_target_reconnected: bool, + target_state: SourceClientState, + target_latest_received_nonce: MessageNonce, + target_latest_confirmed_received_nonce: MessageNonce, + target_tracked_transaction_status: TrackedTransactionStatus, + submitted_messages_proofs: Vec, + target_to_source_batch_transaction: Option, + target_to_source_header_required: Option, + target_to_source_header_requirements: Vec, + source_to_target_batch_transaction: Option, + source_to_target_header_required: Option, + source_to_target_header_requirements: Vec, + } + + impl Default for TestClientData { + fn default() -> TestClientData { + TestClientData { + is_source_fails: false, + is_source_reconnected: false, + source_state: Default::default(), + source_latest_generated_nonce: 0, + source_latest_confirmed_received_nonce: 0, + source_tracked_transaction_status: TrackedTransactionStatus::Finalized(HeaderId( + 0, + Default::default(), + )), + submitted_messages_receiving_proofs: Vec::new(), + is_target_fails: false, + is_target_reconnected: false, + target_state: Default::default(), + target_latest_received_nonce: 0, + target_latest_confirmed_received_nonce: 0, + target_tracked_transaction_status: TrackedTransactionStatus::Finalized(HeaderId( + 0, + Default::default(), + )), + submitted_messages_proofs: Vec::new(), + target_to_source_batch_transaction: None, + target_to_source_header_required: None, + target_to_source_header_requirements: Vec::new(), + source_to_target_batch_transaction: None, + source_to_target_header_required: None, + source_to_target_header_requirements: Vec::new(), + } + } + } + + impl TestClientData { + fn receive_messages( + &mut self, + maybe_batch_tx: Option, + proof: TestMessagesProof, + ) { + self.target_state.best_self = + HeaderId(self.target_state.best_self.0 + 1, self.target_state.best_self.1 + 1); + self.target_state.best_finalized_self = self.target_state.best_self; + self.target_latest_received_nonce = *proof.0.end(); + if let Some(maybe_batch_tx) = maybe_batch_tx { + self.target_state.best_finalized_peer_at_best_self = + Some(maybe_batch_tx.required_header_id()); + } + if let Some(target_latest_confirmed_received_nonce) = proof.1 { + self.target_latest_confirmed_received_nonce = + target_latest_confirmed_received_nonce; + } + self.submitted_messages_proofs.push(proof); + } + + fn receive_messages_delivery_proof( + &mut self, + maybe_batch_tx: Option, + proof: TestMessagesReceivingProof, + ) { + self.source_state.best_self = + HeaderId(self.source_state.best_self.0 + 1, self.source_state.best_self.1 + 1); + self.source_state.best_finalized_self = self.source_state.best_self; + if let Some(maybe_batch_tx) = maybe_batch_tx { + self.source_state.best_finalized_peer_at_best_self = + Some(maybe_batch_tx.required_header_id()); + } + self.submitted_messages_receiving_proofs.push(proof); + self.source_latest_confirmed_received_nonce = proof; + } + } + + #[derive(Clone)] + pub struct TestSourceClient { + data: Arc>, + tick: Arc, + post_tick: Arc, + } + + impl Default for TestSourceClient { + fn default() -> Self { + TestSourceClient { + data: Arc::new(Mutex::new(TestClientData::default())), + tick: Arc::new(|_| {}), + post_tick: Arc::new(|_| {}), + } + } + } + + #[async_trait] + impl RelayClient for TestSourceClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + { + let mut data = self.data.lock(); + (self.tick)(&mut data); + data.is_source_reconnected = true; + (self.post_tick)(&mut data); + } + Ok(()) + } + } + + #[async_trait] + impl SourceClient for TestSourceClient { + type BatchTransaction = TestConfirmationBatchTransaction; + type TransactionTracker = TestTransactionTracker; + + async fn state(&self) -> Result, TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_source_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok(data.source_state.clone()) + } + + async fn latest_generated_nonce( + &self, + id: SourceHeaderIdOf, + ) -> Result<(SourceHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_source_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok((id, data.source_latest_generated_nonce)) + } + + async fn latest_confirmed_received_nonce( + &self, + id: SourceHeaderIdOf, + ) -> Result<(SourceHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + Ok((id, data.source_latest_confirmed_received_nonce)) + } + + async fn generated_message_details( + &self, + _id: SourceHeaderIdOf, + nonces: RangeInclusive, + ) -> Result, TestError> { + Ok(nonces + .map(|nonce| { + ( + nonce, + MessageDetails { + dispatch_weight: Weight::from_parts(1, 0), + size: 1, + reward: 1, + }, + ) + }) + .collect()) + } + + async fn prove_messages( + &self, + id: SourceHeaderIdOf, + nonces: RangeInclusive, + proof_parameters: MessageProofParameters, + ) -> Result< + (SourceHeaderIdOf, RangeInclusive, TestMessagesProof), + TestError, + > { + let mut data = self.data.lock(); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + Ok(( + id, + nonces.clone(), + ( + nonces, + if proof_parameters.outbound_state_proof_required { + Some(data.source_latest_confirmed_received_nonce) + } else { + None + }, + ), + )) + } + + async fn submit_messages_receiving_proof( + &self, + maybe_batch_tx: Option, + _generated_at_block: TargetHeaderIdOf, + proof: TestMessagesReceivingProof, + ) -> Result { + let mut data = self.data.lock(); + (self.tick)(&mut data); + data.receive_messages_delivery_proof(maybe_batch_tx, proof); + (self.post_tick)(&mut data); + Ok(TestTransactionTracker(data.source_tracked_transaction_status)) + } + + async fn require_target_header_on_source( + &self, + id: TargetHeaderIdOf, + ) -> Result, Self::Error> { + let mut data = self.data.lock(); + data.target_to_source_header_required = Some(id); + data.target_to_source_header_requirements.push(id); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + + Ok(data.target_to_source_batch_transaction.take().map(|mut tx| { + tx.required_header_id = id; + tx + })) + } + } + + #[derive(Clone)] + pub struct TestTargetClient { + data: Arc>, + tick: Arc, + post_tick: Arc, + } + + impl Default for TestTargetClient { + fn default() -> Self { + TestTargetClient { + data: Arc::new(Mutex::new(TestClientData::default())), + tick: Arc::new(|_| {}), + post_tick: Arc::new(|_| {}), + } + } + } + + #[async_trait] + impl RelayClient for TestTargetClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + { + let mut data = self.data.lock(); + (self.tick)(&mut data); + data.is_target_reconnected = true; + (self.post_tick)(&mut data); + } + Ok(()) + } + } + + #[async_trait] + impl TargetClient for TestTargetClient { + type BatchTransaction = TestMessagesBatchTransaction; + type TransactionTracker = TestTransactionTracker; + + async fn state(&self) -> Result, TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok(data.target_state.clone()) + } + + async fn latest_received_nonce( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok((id, data.target_latest_received_nonce)) + } + + async fn unrewarded_relayers_state( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, UnrewardedRelayersState), TestError> { + Ok(( + id, + UnrewardedRelayersState { + unrewarded_relayer_entries: 0, + messages_in_oldest_entry: 0, + total_messages: 0, + last_delivered_nonce: 0, + }, + )) + } + + async fn latest_confirmed_received_nonce( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok((id, data.target_latest_confirmed_received_nonce)) + } + + async fn prove_messages_receiving( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, TestMessagesReceivingProof), TestError> { + Ok((id, self.data.lock().target_latest_received_nonce)) + } + + async fn submit_messages_proof( + &self, + maybe_batch_tx: Option, + _generated_at_header: SourceHeaderIdOf, + nonces: RangeInclusive, + proof: TestMessagesProof, + ) -> Result, TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + data.receive_messages(maybe_batch_tx, proof); + (self.post_tick)(&mut data); + Ok(NoncesSubmitArtifacts { + nonces, + tx_tracker: TestTransactionTracker(data.target_tracked_transaction_status), + }) + } + + async fn require_source_header_on_target( + &self, + id: SourceHeaderIdOf, + ) -> Result, Self::Error> { + let mut data = self.data.lock(); + data.source_to_target_header_required = Some(id); + data.source_to_target_header_requirements.push(id); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + + Ok(data.source_to_target_batch_transaction.take().map(|mut tx| { + tx.required_header_id = id; + tx + })) + } + } + + fn run_loop_test( + data: Arc>, + source_tick: Arc, + source_post_tick: Arc, + target_tick: Arc, + target_post_tick: Arc, + exit_signal: impl Future + 'static + Send, + ) -> TestClientData { + async_std::task::block_on(async { + let source_client = TestSourceClient { + data: data.clone(), + tick: source_tick, + post_tick: source_post_tick, + }; + let target_client = TestTargetClient { + data: data.clone(), + tick: target_tick, + post_tick: target_post_tick, + }; + let _ = run( + Params { + lane: LaneId([0, 0, 0, 0]), + source_tick: Duration::from_millis(100), + target_tick: Duration::from_millis(100), + reconnect_delay: Duration::from_millis(0), + delivery_params: MessageDeliveryParams { + max_unrewarded_relayer_entries_at_target: 4, + max_unconfirmed_nonces_at_target: 4, + max_messages_in_single_batch: 4, + max_messages_weight_in_single_batch: Weight::from_parts(4, 0), + max_messages_size_in_single_batch: 4, + }, + }, + source_client, + target_client, + MetricsParams::disabled(), + exit_signal, + ) + .await; + let result = data.lock().clone(); + result + }) + } + + #[test] + fn message_lane_loop_is_able_to_recover_from_connection_errors() { + // with this configuration, source client will return Err, making source client + // reconnect. Then the target client will fail with Err + reconnect. Then we finally + // able to deliver messages. + let (exit_sender, exit_receiver) = unbounded(); + let result = run_loop_test( + Arc::new(Mutex::new(TestClientData { + is_source_fails: true, + source_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 1, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })), + Arc::new(|data: &mut TestClientData| { + if data.is_source_reconnected { + data.is_source_fails = false; + data.is_target_fails = true; + } + }), + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + if data.is_target_reconnected { + data.is_target_fails = false; + } + if data.target_state.best_finalized_peer_at_best_self.unwrap().0 < 10 { + data.target_state.best_finalized_peer_at_best_self = Some(HeaderId( + data.target_state.best_finalized_peer_at_best_self.unwrap().0 + 1, + data.target_state.best_finalized_peer_at_best_self.unwrap().0 + 1, + )); + } + if !data.submitted_messages_proofs.is_empty() { + exit_sender.unbounded_send(()).unwrap(); + } + }), + Arc::new(|_| {}), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + assert_eq!(result.submitted_messages_proofs, vec![(1..=1, None)],); + } + + #[test] + fn message_lane_loop_is_able_to_recover_from_unsuccessful_transaction() { + // with this configuration, both source and target clients will mine their transactions, but + // their corresponding nonce won't be udpated => reconnect will happen + let (exit_sender, exit_receiver) = unbounded(); + let result = run_loop_test( + Arc::new(Mutex::new(TestClientData { + source_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 1, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })), + Arc::new(move |data: &mut TestClientData| { + // blocks are produced on every tick + data.source_state.best_self = + HeaderId(data.source_state.best_self.0 + 1, data.source_state.best_self.1 + 1); + data.source_state.best_finalized_self = data.source_state.best_self; + // syncing target headers -> source chain + if let Some(last_requirement) = data.target_to_source_header_requirements.last() { + if *last_requirement != + data.source_state.best_finalized_peer_at_best_self.unwrap() + { + data.source_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + }), + Arc::new(move |data: &mut TestClientData| { + // if it is the first time we're submitting delivery proof, let's revert changes + // to source status => then the delivery confirmation transaction is "finalized", + // but the state is not altered + if data.submitted_messages_receiving_proofs.len() == 1 { + data.source_latest_confirmed_received_nonce = 0; + } + }), + Arc::new(move |data: &mut TestClientData| { + // blocks are produced on every tick + data.target_state.best_self = + HeaderId(data.target_state.best_self.0 + 1, data.target_state.best_self.1 + 1); + data.target_state.best_finalized_self = data.target_state.best_self; + // syncing source headers -> target chain + if let Some(last_requirement) = data.source_to_target_header_requirements.last() { + if *last_requirement != + data.target_state.best_finalized_peer_at_best_self.unwrap() + { + data.target_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + // if source has received all messages receiving confirmations => stop + if data.source_latest_confirmed_received_nonce == 1 { + exit_sender.unbounded_send(()).unwrap(); + } + }), + Arc::new(move |data: &mut TestClientData| { + // if it is the first time we're submitting messages proof, let's revert changes + // to target status => then the messages delivery transaction is "finalized", but + // the state is not altered + if data.submitted_messages_proofs.len() == 1 { + data.target_latest_received_nonce = 0; + data.target_latest_confirmed_received_nonce = 0; + } + }), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + assert_eq!(result.submitted_messages_proofs.len(), 2); + assert_eq!(result.submitted_messages_receiving_proofs.len(), 2); + } + + #[test] + fn message_lane_loop_works() { + let (exit_sender, exit_receiver) = unbounded(); + let result = run_loop_test( + Arc::new(Mutex::new(TestClientData { + source_state: ClientState { + best_self: HeaderId(10, 10), + best_finalized_self: HeaderId(10, 10), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 10, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })), + Arc::new(|data: &mut TestClientData| { + // blocks are produced on every tick + data.source_state.best_self = + HeaderId(data.source_state.best_self.0 + 1, data.source_state.best_self.1 + 1); + data.source_state.best_finalized_self = data.source_state.best_self; + // headers relay must only be started when we need new target headers at source node + if data.target_to_source_header_required.is_some() { + assert!( + data.source_state.best_finalized_peer_at_best_self.unwrap().0 < + data.target_state.best_self.0 + ); + data.target_to_source_header_required = None; + } + // syncing target headers -> source chain + if let Some(last_requirement) = data.target_to_source_header_requirements.last() { + if *last_requirement != + data.source_state.best_finalized_peer_at_best_self.unwrap() + { + data.source_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + }), + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + // blocks are produced on every tick + data.target_state.best_self = + HeaderId(data.target_state.best_self.0 + 1, data.target_state.best_self.1 + 1); + data.target_state.best_finalized_self = data.target_state.best_self; + // headers relay must only be started when we need new source headers at target node + if data.source_to_target_header_required.is_some() { + assert!( + data.target_state.best_finalized_peer_at_best_self.unwrap().0 < + data.source_state.best_self.0 + ); + data.source_to_target_header_required = None; + } + // syncing source headers -> target chain + if let Some(last_requirement) = data.source_to_target_header_requirements.last() { + if *last_requirement != + data.target_state.best_finalized_peer_at_best_self.unwrap() + { + data.target_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + // if source has received all messages receiving confirmations => stop + if data.source_latest_confirmed_received_nonce == 10 { + exit_sender.unbounded_send(()).unwrap(); + } + }), + Arc::new(|_| {}), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + // there are no strict restrictions on when reward confirmation should come + // (because `max_unconfirmed_nonces_at_target` is `100` in tests and this confirmation + // depends on the state of both clients) + // => we do not check it here + assert_eq!(result.submitted_messages_proofs[0].0, 1..=4); + assert_eq!(result.submitted_messages_proofs[1].0, 5..=8); + assert_eq!(result.submitted_messages_proofs[2].0, 9..=10); + assert!(!result.submitted_messages_receiving_proofs.is_empty()); + + // check that we have at least once required new source->target or target->source headers + assert!(!result.target_to_source_header_requirements.is_empty()); + assert!(!result.source_to_target_header_requirements.is_empty()); + } + + #[test] + fn message_lane_loop_works_with_batch_transactions() { + let (exit_sender, exit_receiver) = unbounded(); + let original_data = Arc::new(Mutex::new(TestClientData { + source_state: ClientState { + best_self: HeaderId(10, 10), + best_finalized_self: HeaderId(10, 10), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 10, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })); + let result = run_loop_test( + original_data, + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + data.source_state.best_self = + HeaderId(data.source_state.best_self.0 + 1, data.source_state.best_self.1 + 1); + data.source_state.best_finalized_self = data.source_state.best_self; + if let Some(target_to_source_header_required) = + data.target_to_source_header_required.take() + { + data.target_to_source_batch_transaction = + Some(TestConfirmationBatchTransaction { + required_header_id: target_to_source_header_required, + }) + } + }), + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + data.target_state.best_self = + HeaderId(data.target_state.best_self.0 + 1, data.target_state.best_self.1 + 1); + data.target_state.best_finalized_self = data.target_state.best_self; + + if let Some(source_to_target_header_required) = + data.source_to_target_header_required.take() + { + data.source_to_target_batch_transaction = Some(TestMessagesBatchTransaction { + required_header_id: source_to_target_header_required, + }) + } + + if data.source_latest_confirmed_received_nonce == 10 { + exit_sender.unbounded_send(()).unwrap(); + } + }), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + // there are no strict restrictions on when reward confirmation should come + // (because `max_unconfirmed_nonces_at_target` is `100` in tests and this confirmation + // depends on the state of both clients) + // => we do not check it here + assert_eq!(result.submitted_messages_proofs[0].0, 1..=4); + assert_eq!(result.submitted_messages_proofs[1].0, 5..=8); + assert_eq!(result.submitted_messages_proofs[2].0, 9..=10); + assert!(!result.submitted_messages_receiving_proofs.is_empty()); + + // check that we have at least once required new source->target or target->source headers + assert!(!result.target_to_source_header_requirements.is_empty()); + assert!(!result.source_to_target_header_requirements.is_empty()); + } +} diff --git a/relays/messages/src/message_race_delivery.rs b/relays/messages/src/message_race_delivery.rs new file mode 100644 index 000000000000..137deb5b74f7 --- /dev/null +++ b/relays/messages/src/message_race_delivery.rs @@ -0,0 +1,1405 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Message delivery race delivers proof-of-messages from "lane.source" to "lane.target". + +use std::{collections::VecDeque, marker::PhantomData, ops::RangeInclusive}; + +use async_trait::async_trait; +use futures::stream::FusedStream; + +use bp_messages::{MessageNonce, UnrewardedRelayersState, Weight}; +use relay_utils::FailedClient; + +use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{ + MessageDeliveryParams, MessageDetailsMap, MessageProofParameters, NoncesSubmitArtifacts, + SourceClient as MessageLaneSourceClient, SourceClientState, + TargetClient as MessageLaneTargetClient, TargetClientState, + }, + message_race_limits::{MessageRaceLimits, RelayMessagesBatchReference}, + message_race_loop::{ + MessageRace, NoncesRange, RaceState, RaceStrategy, SourceClient, SourceClientNonces, + TargetClient, TargetClientNonces, + }, + message_race_strategy::BasicStrategy, + metrics::MessageLaneLoopMetrics, +}; + +/// Run message delivery race. +pub async fn run( + source_client: impl MessageLaneSourceClient

, + source_state_updates: impl FusedStream>, + target_client: impl MessageLaneTargetClient

, + target_state_updates: impl FusedStream>, + metrics_msg: Option, + params: MessageDeliveryParams, +) -> Result<(), FailedClient> { + crate::message_race_loop::run( + MessageDeliveryRaceSource { + client: source_client.clone(), + metrics_msg: metrics_msg.clone(), + _phantom: Default::default(), + }, + source_state_updates, + MessageDeliveryRaceTarget { + client: target_client.clone(), + metrics_msg: metrics_msg.clone(), + _phantom: Default::default(), + }, + target_state_updates, + MessageDeliveryStrategy:: { + lane_source_client: source_client, + lane_target_client: target_client, + max_unrewarded_relayer_entries_at_target: params + .max_unrewarded_relayer_entries_at_target, + max_unconfirmed_nonces_at_target: params.max_unconfirmed_nonces_at_target, + max_messages_in_single_batch: params.max_messages_in_single_batch, + max_messages_weight_in_single_batch: params.max_messages_weight_in_single_batch, + max_messages_size_in_single_batch: params.max_messages_size_in_single_batch, + latest_confirmed_nonces_at_source: VecDeque::new(), + target_nonces: None, + strategy: BasicStrategy::new(), + metrics_msg, + }, + ) + .await +} + +/// Message delivery race. +struct MessageDeliveryRace

(std::marker::PhantomData

); + +impl MessageRace for MessageDeliveryRace

{ + type SourceHeaderId = SourceHeaderIdOf

; + type TargetHeaderId = TargetHeaderIdOf

; + + type MessageNonce = MessageNonce; + type Proof = P::MessagesProof; + + fn source_name() -> String { + format!("{}::MessagesDelivery", P::SOURCE_NAME) + } + + fn target_name() -> String { + format!("{}::MessagesDelivery", P::TARGET_NAME) + } +} + +/// Message delivery race source, which is a source of the lane. +struct MessageDeliveryRaceSource { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl SourceClient> for MessageDeliveryRaceSource +where + P: MessageLane, + C: MessageLaneSourceClient

, +{ + type Error = C::Error; + type NoncesRange = MessageDetailsMap; + type ProofParameters = MessageProofParameters; + + async fn nonces( + &self, + at_block: SourceHeaderIdOf

, + prev_latest_nonce: MessageNonce, + ) -> Result<(SourceHeaderIdOf

, SourceClientNonces), Self::Error> { + let (at_block, latest_generated_nonce) = + self.client.latest_generated_nonce(at_block).await?; + let (at_block, latest_confirmed_nonce) = + self.client.latest_confirmed_received_nonce(at_block).await?; + + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_source_latest_generated_nonce(latest_generated_nonce); + metrics_msg.update_source_latest_confirmed_nonce(latest_confirmed_nonce); + } + + let new_nonces = if latest_generated_nonce > prev_latest_nonce { + self.client + .generated_message_details( + at_block.clone(), + prev_latest_nonce + 1..=latest_generated_nonce, + ) + .await? + } else { + MessageDetailsMap::new() + }; + + Ok(( + at_block, + SourceClientNonces { new_nonces, confirmed_nonce: Some(latest_confirmed_nonce) }, + )) + } + + async fn generate_proof( + &self, + at_block: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof_parameters: Self::ProofParameters, + ) -> Result<(SourceHeaderIdOf

, RangeInclusive, P::MessagesProof), Self::Error> + { + self.client.prove_messages(at_block, nonces, proof_parameters).await + } +} + +/// Message delivery race target, which is a target of the lane. +struct MessageDeliveryRaceTarget { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl TargetClient> for MessageDeliveryRaceTarget +where + P: MessageLane, + C: MessageLaneTargetClient

, +{ + type Error = C::Error; + type TargetNoncesData = DeliveryRaceTargetNoncesData; + type BatchTransaction = C::BatchTransaction; + type TransactionTracker = C::TransactionTracker; + + async fn require_source_header( + &self, + id: SourceHeaderIdOf

, + ) -> Result, Self::Error> { + self.client.require_source_header_on_target(id).await + } + + async fn nonces( + &self, + at_block: TargetHeaderIdOf

, + update_metrics: bool, + ) -> Result<(TargetHeaderIdOf

, TargetClientNonces), Self::Error> + { + let (at_block, latest_received_nonce) = self.client.latest_received_nonce(at_block).await?; + let (at_block, latest_confirmed_nonce) = + self.client.latest_confirmed_received_nonce(at_block).await?; + let (at_block, unrewarded_relayers) = + self.client.unrewarded_relayers_state(at_block).await?; + + if update_metrics { + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_target_latest_received_nonce(latest_received_nonce); + metrics_msg.update_target_latest_confirmed_nonce(latest_confirmed_nonce); + } + } + + Ok(( + at_block, + TargetClientNonces { + latest_nonce: latest_received_nonce, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: latest_confirmed_nonce, + unrewarded_relayers, + }, + }, + )) + } + + async fn submit_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof: P::MessagesProof, + ) -> Result, Self::Error> { + self.client + .submit_messages_proof(maybe_batch_tx, generated_at_block, nonces, proof) + .await + } +} + +/// Additional nonces data from the target client used by message delivery race. +#[derive(Debug, Clone)] +struct DeliveryRaceTargetNoncesData { + /// The latest nonce that we know: (1) has been delivered to us (2) has been confirmed + /// back to the source node (by confirmations race) and (3) relayer has received + /// reward for (and this has been confirmed by the message delivery race). + confirmed_nonce: MessageNonce, + /// State of the unrewarded relayers set at the target node. + unrewarded_relayers: UnrewardedRelayersState, +} + +/// Messages delivery strategy. +struct MessageDeliveryStrategy { + /// The client that is connected to the message lane source node. + lane_source_client: SC, + /// The client that is connected to the message lane target node. + lane_target_client: TC, + /// Maximal unrewarded relayer entries at target client. + max_unrewarded_relayer_entries_at_target: MessageNonce, + /// Maximal unconfirmed nonces at target client. + max_unconfirmed_nonces_at_target: MessageNonce, + /// Maximal number of messages in the single delivery transaction. + max_messages_in_single_batch: MessageNonce, + /// Maximal cumulative messages weight in the single delivery transaction. + max_messages_weight_in_single_batch: Weight, + /// Maximal messages size in the single delivery transaction. + max_messages_size_in_single_batch: u32, + /// Latest confirmed nonces at the source client + the header id where we have first met this + /// nonce. + latest_confirmed_nonces_at_source: VecDeque<(SourceHeaderIdOf

, MessageNonce)>, + /// Target nonces available at the **best** block of the target chain. + target_nonces: Option>, + /// Basic delivery strategy. + strategy: MessageDeliveryStrategyBase

, + /// Message lane metrics. + metrics_msg: Option, +} + +type MessageDeliveryStrategyBase

= BasicStrategy< +

::SourceHeaderNumber, +

::SourceHeaderHash, +

::TargetHeaderNumber, +

::TargetHeaderHash, + MessageDetailsMap<

::SourceChainBalance>, +

::MessagesProof, +>; + +impl std::fmt::Debug for MessageDeliveryStrategy { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("MessageDeliveryStrategy") + .field( + "max_unrewarded_relayer_entries_at_target", + &self.max_unrewarded_relayer_entries_at_target, + ) + .field("max_unconfirmed_nonces_at_target", &self.max_unconfirmed_nonces_at_target) + .field("max_messages_in_single_batch", &self.max_messages_in_single_batch) + .field("max_messages_weight_in_single_batch", &self.max_messages_weight_in_single_batch) + .field("max_messages_size_in_single_batch", &self.max_messages_size_in_single_batch) + .field("latest_confirmed_nonces_at_source", &self.latest_confirmed_nonces_at_source) + .field("target_nonces", &self.target_nonces) + .field("strategy", &self.strategy) + .finish() + } +} + +impl MessageDeliveryStrategy +where + P: MessageLane, + SC: MessageLaneSourceClient

, + TC: MessageLaneTargetClient

, +{ + /// Returns true if some race action can be selected (with `select_race_action`) at given + /// `best_finalized_source_header_id_at_best_target` source header at target. + async fn can_submit_transaction_with< + RS: RaceState, TargetHeaderIdOf

>, + >( + &self, + mut race_state: RS, + maybe_best_finalized_source_header_id_at_best_target: Option>, + ) -> bool { + if let Some(best_finalized_source_header_id_at_best_target) = + maybe_best_finalized_source_header_id_at_best_target + { + race_state.set_best_finalized_source_header_id_at_best_target( + best_finalized_source_header_id_at_best_target, + ); + + return self.select_race_action(race_state).await.is_some() + } + + false + } + + async fn select_race_action, TargetHeaderIdOf

>>( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, MessageProofParameters)> { + // if we have already selected nonces that we want to submit, do nothing + if race_state.nonces_to_submit().is_some() { + return None + } + + // if we already submitted some nonces, do nothing + if race_state.nonces_submitted().is_some() { + return None + } + + let best_target_nonce = self.strategy.best_at_target()?; + let best_finalized_source_header_id_at_best_target = + race_state.best_finalized_source_header_id_at_best_target()?; + let target_nonces = self.target_nonces.as_ref()?; + let latest_confirmed_nonce_at_source = self + .latest_confirmed_nonce_at_source(&best_finalized_source_header_id_at_best_target) + .unwrap_or(target_nonces.nonces_data.confirmed_nonce); + + // There's additional condition in the message delivery race: target would reject messages + // if there are too much unconfirmed messages at the inbound lane. + + // Ok - we may have new nonces to deliver. But target may still reject new messages, because + // we haven't notified it that (some) messages have been confirmed. So we may want to + // include updated `source.latest_confirmed` in the proof. + // + // Important note: we're including outbound state lane proof whenever there are unconfirmed + // nonces on the target chain. Other strategy is to include it only if it's absolutely + // necessary. + let latest_received_nonce_at_target = target_nonces.latest_nonce; + let latest_confirmed_nonce_at_target = target_nonces.nonces_data.confirmed_nonce; + let outbound_state_proof_required = + latest_confirmed_nonce_at_target < latest_confirmed_nonce_at_source; + + // The target node would also reject messages if there are too many entries in the + // "unrewarded relayers" set. If we are unable to prove new rewards to the target node, then + // we should wait for confirmations race. + let unrewarded_limit_reached = + target_nonces.nonces_data.unrewarded_relayers.unrewarded_relayer_entries >= + self.max_unrewarded_relayer_entries_at_target || + target_nonces.nonces_data.unrewarded_relayers.total_messages >= + self.max_unconfirmed_nonces_at_target; + if unrewarded_limit_reached { + // so there are already too many unrewarded relayer entries in the set + // + // => check if we can prove enough rewards. If not, we should wait for more rewards to + // be paid + let number_of_rewards_being_proved = + latest_confirmed_nonce_at_source.saturating_sub(latest_confirmed_nonce_at_target); + let enough_rewards_being_proved = number_of_rewards_being_proved >= + target_nonces.nonces_data.unrewarded_relayers.messages_in_oldest_entry; + if !enough_rewards_being_proved { + return None + } + } + + // If we're here, then the confirmations race did its job && sending side now knows that + // messages have been delivered. Now let's select nonces that we want to deliver. + // + // We may deliver at most: + // + // max_unconfirmed_nonces_at_target - (latest_received_nonce_at_target - + // latest_confirmed_nonce_at_target) + // + // messages in the batch. But since we're including outbound state proof in the batch, then + // it may be increased to: + // + // max_unconfirmed_nonces_at_target - (latest_received_nonce_at_target - + // latest_confirmed_nonce_at_source) + let future_confirmed_nonce_at_target = if outbound_state_proof_required { + latest_confirmed_nonce_at_source + } else { + latest_confirmed_nonce_at_target + }; + let max_nonces = latest_received_nonce_at_target + .checked_sub(future_confirmed_nonce_at_target) + .and_then(|diff| self.max_unconfirmed_nonces_at_target.checked_sub(diff)) + .unwrap_or_default(); + let max_nonces = std::cmp::min(max_nonces, self.max_messages_in_single_batch); + let max_messages_weight_in_single_batch = self.max_messages_weight_in_single_batch; + let max_messages_size_in_single_batch = self.max_messages_size_in_single_batch; + let lane_source_client = self.lane_source_client.clone(); + let lane_target_client = self.lane_target_client.clone(); + + // select nonces from nonces, available for delivery + let selected_nonces = match self.strategy.available_source_queue_indices(race_state) { + Some(available_source_queue_indices) => { + let source_queue = self.strategy.source_queue(); + let reference = RelayMessagesBatchReference { + max_messages_in_this_batch: max_nonces, + max_messages_weight_in_single_batch, + max_messages_size_in_single_batch, + lane_source_client: lane_source_client.clone(), + lane_target_client: lane_target_client.clone(), + best_target_nonce, + nonces_queue: source_queue.clone(), + nonces_queue_range: available_source_queue_indices, + metrics: self.metrics_msg.clone(), + }; + + MessageRaceLimits::decide(reference).await + }, + None => { + // we still may need to submit delivery transaction with zero messages to + // unblock the lane. But it'll only be accepted if the lane is blocked + // (i.e. when `unrewarded_limit_reached` is `true`) + None + }, + }; + + // check if we need unblocking transaction and we may submit it + #[allow(clippy::reversed_empty_ranges)] + let selected_nonces = match selected_nonces { + Some(selected_nonces) => selected_nonces, + None if unrewarded_limit_reached && outbound_state_proof_required => 1..=0, + _ => return None, + }; + + let dispatch_weight = self.dispatch_weight_for_range(&selected_nonces); + Some(( + selected_nonces, + MessageProofParameters { outbound_state_proof_required, dispatch_weight }, + )) + } + + /// Returns lastest confirmed message at source chain, given source block. + fn latest_confirmed_nonce_at_source(&self, at: &SourceHeaderIdOf

) -> Option { + self.latest_confirmed_nonces_at_source + .iter() + .take_while(|(id, _)| id.0 <= at.0) + .last() + .map(|(_, nonce)| *nonce) + } + + /// Returns total weight of all undelivered messages. + fn dispatch_weight_for_range(&self, range: &RangeInclusive) -> Weight { + self.strategy + .source_queue() + .iter() + .flat_map(|(_, subrange)| { + subrange + .iter() + .filter(|(nonce, _)| range.contains(nonce)) + .map(|(_, details)| details.dispatch_weight) + }) + .fold(Weight::zero(), |total, weight| total.saturating_add(weight)) + } +} + +#[async_trait] +impl RaceStrategy, TargetHeaderIdOf

, P::MessagesProof> + for MessageDeliveryStrategy +where + P: MessageLane, + SC: MessageLaneSourceClient

, + TC: MessageLaneTargetClient

, +{ + type SourceNoncesRange = MessageDetailsMap; + type ProofParameters = MessageProofParameters; + type TargetNoncesData = DeliveryRaceTargetNoncesData; + + fn is_empty(&self) -> bool { + self.strategy.is_empty() + } + + async fn required_source_header_at_target< + RS: RaceState, TargetHeaderIdOf

>, + >( + &self, + race_state: RS, + ) -> Option> { + // we have already submitted something - let's wait until it is mined + if race_state.nonces_submitted().is_some() { + return None + } + + // if we can deliver something using current race state, go on + let selected_nonces = self.select_race_action(race_state.clone()).await; + if selected_nonces.is_some() { + return None + } + + // check if we may deliver some messages if we'll relay require source header + // to target first + let maybe_source_header_for_delivery = + self.strategy.source_queue().back().map(|(id, _)| id.clone()); + if self + .can_submit_transaction_with( + race_state.clone(), + maybe_source_header_for_delivery.clone(), + ) + .await + { + return maybe_source_header_for_delivery + } + + // ok, we can't delivery anything even if we relay some source blocks first. But maybe + // the lane is blocked and we need to submit unblock transaction? + let maybe_source_header_for_reward_confirmation = + self.latest_confirmed_nonces_at_source.back().map(|(id, _)| id.clone()); + if self + .can_submit_transaction_with( + race_state.clone(), + maybe_source_header_for_reward_confirmation.clone(), + ) + .await + { + return maybe_source_header_for_reward_confirmation + } + + None + } + + fn best_at_source(&self) -> Option { + self.strategy.best_at_source() + } + + fn best_at_target(&self) -> Option { + self.strategy.best_at_target() + } + + fn source_nonces_updated( + &mut self, + at_block: SourceHeaderIdOf

, + nonces: SourceClientNonces, + ) { + if let Some(confirmed_nonce) = nonces.confirmed_nonce { + let is_confirmed_nonce_updated = self + .latest_confirmed_nonces_at_source + .back() + .map(|(_, prev_nonce)| *prev_nonce != confirmed_nonce) + .unwrap_or(true); + if is_confirmed_nonce_updated { + self.latest_confirmed_nonces_at_source + .push_back((at_block.clone(), confirmed_nonce)); + } + } + self.strategy.source_nonces_updated(at_block, nonces) + } + + fn reset_best_target_nonces(&mut self) { + self.target_nonces = None; + self.strategy.reset_best_target_nonces(); + } + + fn best_target_nonces_updated, TargetHeaderIdOf

>>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ) { + // best target nonces must always be ge than finalized target nonces + let latest_nonce = nonces.latest_nonce; + self.target_nonces = Some(nonces); + + self.strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce, nonces_data: () }, + race_state, + ) + } + + fn finalized_target_nonces_updated, TargetHeaderIdOf

>>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ) { + if let Some(ref best_finalized_source_header_id_at_best_target) = + race_state.best_finalized_source_header_id_at_best_target() + { + let oldest_header_number_to_keep = best_finalized_source_header_id_at_best_target.0; + while self + .latest_confirmed_nonces_at_source + .front() + .map(|(id, _)| id.0 < oldest_header_number_to_keep) + .unwrap_or(false) + { + self.latest_confirmed_nonces_at_source.pop_front(); + } + } + + if let Some(ref mut target_nonces) = self.target_nonces { + target_nonces.latest_nonce = + std::cmp::max(target_nonces.latest_nonce, nonces.latest_nonce); + } + + self.strategy.finalized_target_nonces_updated( + TargetClientNonces { latest_nonce: nonces.latest_nonce, nonces_data: () }, + race_state, + ) + } + + async fn select_nonces_to_deliver, TargetHeaderIdOf

>>( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, Self::ProofParameters)> { + self.select_race_action(race_state).await + } +} + +impl NoncesRange for MessageDetailsMap { + fn begin(&self) -> MessageNonce { + self.keys().next().cloned().unwrap_or_default() + } + + fn end(&self) -> MessageNonce { + self.keys().next_back().cloned().unwrap_or_default() + } + + fn greater_than(mut self, nonce: MessageNonce) -> Option { + let gte = self.split_off(&(nonce + 1)); + if gte.is_empty() { + None + } else { + Some(gte) + } + } +} + +#[cfg(test)] +mod tests { + use crate::{ + message_lane_loop::{ + tests::{ + header_id, TestMessageLane, TestMessagesBatchTransaction, TestMessagesProof, + TestSourceChainBalance, TestSourceClient, TestSourceHeaderId, TestTargetClient, + TestTargetHeaderId, + }, + MessageDetails, + }, + message_race_loop::RaceStateImpl, + }; + + use super::*; + + const DEFAULT_DISPATCH_WEIGHT: Weight = Weight::from_parts(1, 0); + const DEFAULT_SIZE: u32 = 1; + + type TestRaceState = RaceStateImpl< + TestSourceHeaderId, + TestTargetHeaderId, + TestMessagesProof, + TestMessagesBatchTransaction, + >; + type TestStrategy = + MessageDeliveryStrategy; + + fn source_nonces( + new_nonces: RangeInclusive, + confirmed_nonce: MessageNonce, + reward: TestSourceChainBalance, + ) -> SourceClientNonces> { + SourceClientNonces { + new_nonces: new_nonces + .into_iter() + .map(|nonce| { + ( + nonce, + MessageDetails { + dispatch_weight: DEFAULT_DISPATCH_WEIGHT, + size: DEFAULT_SIZE, + reward, + }, + ) + }) + .collect(), + confirmed_nonce: Some(confirmed_nonce), + } + } + + fn prepare_strategy() -> (TestRaceState, TestStrategy) { + let mut race_state = RaceStateImpl { + best_finalized_source_header_id_at_source: Some(header_id(1)), + best_finalized_source_header_id_at_best_target: Some(header_id(1)), + best_target_header_id: Some(header_id(1)), + best_finalized_target_header_id: Some(header_id(1)), + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + }; + + let mut race_strategy = TestStrategy { + max_unrewarded_relayer_entries_at_target: 4, + max_unconfirmed_nonces_at_target: 4, + max_messages_in_single_batch: 4, + max_messages_weight_in_single_batch: Weight::from_parts(4, 0), + max_messages_size_in_single_batch: 4, + latest_confirmed_nonces_at_source: vec![(header_id(1), 19)].into_iter().collect(), + lane_source_client: TestSourceClient::default(), + lane_target_client: TestTargetClient::default(), + metrics_msg: None, + target_nonces: Some(TargetClientNonces { + latest_nonce: 19, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: 0, + messages_in_oldest_entry: 0, + total_messages: 0, + last_delivered_nonce: 0, + }, + }, + }), + strategy: BasicStrategy::new(), + }; + + race_strategy + .strategy + .source_nonces_updated(header_id(1), source_nonces(20..=23, 19, 0)); + + let target_nonces = TargetClientNonces { latest_nonce: 19, nonces_data: () }; + race_strategy + .strategy + .best_target_nonces_updated(target_nonces.clone(), &mut race_state); + race_strategy + .strategy + .finalized_target_nonces_updated(target_nonces, &mut race_state); + + (race_state, race_strategy) + } + + fn proof_parameters(state_required: bool, weight: u32) -> MessageProofParameters { + MessageProofParameters { + outbound_state_proof_required: state_required, + dispatch_weight: Weight::from_parts(weight as u64, 0), + } + } + + #[test] + fn weights_map_works_as_nonces_range() { + fn build_map( + range: RangeInclusive, + ) -> MessageDetailsMap { + range + .map(|idx| { + ( + idx, + MessageDetails { + dispatch_weight: Weight::from_parts(idx, 0), + size: idx as _, + reward: idx as _, + }, + ) + }) + .collect() + } + + let map = build_map(20..=30); + + assert_eq!(map.begin(), 20); + assert_eq!(map.end(), 30); + assert_eq!(map.clone().greater_than(10), Some(build_map(20..=30))); + assert_eq!(map.clone().greater_than(19), Some(build_map(20..=30))); + assert_eq!(map.clone().greater_than(20), Some(build_map(21..=30))); + assert_eq!(map.clone().greater_than(25), Some(build_map(26..=30))); + assert_eq!(map.clone().greater_than(29), Some(build_map(30..=30))); + assert_eq!(map.greater_than(30), None); + } + + #[async_std::test] + async fn message_delivery_strategy_selects_messages_to_deliver() { + let (state, strategy) = prepare_strategy(); + + // both sides are ready to relay new messages + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(false, 4))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_includes_outbound_state_proof_when_new_nonces_are_available() + { + let (state, mut strategy) = prepare_strategy(); + + // if there are new confirmed nonces on source, we want to relay this information + // to target to prune rewards queue + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(true, 4))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_selects_nothing_if_there_are_too_many_unrewarded_relayers() { + let (state, mut strategy) = prepare_strategy(); + + // if there are already `max_unrewarded_relayer_entries_at_target` entries at target, + // we need to wait until rewards will be paid + { + let unrewarded_relayers = + &mut strategy.target_nonces.as_mut().unwrap().nonces_data.unrewarded_relayers; + unrewarded_relayers.unrewarded_relayer_entries = + strategy.max_unrewarded_relayer_entries_at_target; + unrewarded_relayers.messages_in_oldest_entry = 4; + } + assert_eq!(strategy.select_nonces_to_deliver(state).await, None); + } + + #[async_std::test] + async fn message_delivery_strategy_selects_nothing_if_proved_rewards_is_not_enough_to_remove_oldest_unrewarded_entry( + ) { + let (state, mut strategy) = prepare_strategy(); + + // if there are already `max_unrewarded_relayer_entries_at_target` entries at target, + // we need to prove at least `messages_in_oldest_entry` rewards + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + { + let nonces_data = &mut strategy.target_nonces.as_mut().unwrap().nonces_data; + nonces_data.confirmed_nonce = prev_confirmed_nonce_at_source - 1; + let unrewarded_relayers = &mut nonces_data.unrewarded_relayers; + unrewarded_relayers.unrewarded_relayer_entries = + strategy.max_unrewarded_relayer_entries_at_target; + unrewarded_relayers.messages_in_oldest_entry = 4; + } + assert_eq!(strategy.select_nonces_to_deliver(state).await, None); + } + + #[async_std::test] + async fn message_delivery_strategy_includes_outbound_state_proof_if_proved_rewards_is_enough() { + let (state, mut strategy) = prepare_strategy(); + + // if there are already `max_unrewarded_relayer_entries_at_target` entries at target, + // we need to prove at least `messages_in_oldest_entry` rewards + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + { + let nonces_data = &mut strategy.target_nonces.as_mut().unwrap().nonces_data; + nonces_data.confirmed_nonce = prev_confirmed_nonce_at_source - 3; + let unrewarded_relayers = &mut nonces_data.unrewarded_relayers; + unrewarded_relayers.unrewarded_relayer_entries = + strategy.max_unrewarded_relayer_entries_at_target; + unrewarded_relayers.messages_in_oldest_entry = 3; + } + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(true, 4))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_weight() { + let (state, mut strategy) = prepare_strategy(); + + // not all queued messages may fit in the batch, because batch has max weight + strategy.max_messages_weight_in_single_batch = Weight::from_parts(3, 0); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_accepts_single_message_even_if_its_weight_overflows_maximal_weight( + ) { + let (state, mut strategy) = prepare_strategy(); + + // first message doesn't fit in the batch, because it has weight (10) that overflows max + // weight (4) + strategy.strategy.source_queue_mut()[0].1.get_mut(&20).unwrap().dispatch_weight = + Weight::from_parts(10, 0); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=20), proof_parameters(false, 10))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_size() { + let (state, mut strategy) = prepare_strategy(); + + // not all queued messages may fit in the batch, because batch has max weight + strategy.max_messages_size_in_single_batch = 3; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_accepts_single_message_even_if_its_weight_overflows_maximal_size( + ) { + let (state, mut strategy) = prepare_strategy(); + + // first message doesn't fit in the batch, because it has weight (10) that overflows max + // weight (4) + strategy.strategy.source_queue_mut()[0].1.get_mut(&20).unwrap().size = 10; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=20), proof_parameters(false, 1))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_count_when_there_is_upper_limit() { + let (state, mut strategy) = prepare_strategy(); + + // not all queued messages may fit in the batch, because batch has max number of messages + // limit + strategy.max_messages_in_single_batch = 3; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_count_when_there_are_unconfirmed_nonces( + ) { + let (state, mut strategy) = prepare_strategy(); + + // 1 delivery confirmation from target to source is still missing, so we may only + // relay 3 new messages + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.latest_confirmed_nonces_at_source = + vec![(header_id(1), prev_confirmed_nonce_at_source - 1)].into_iter().collect(); + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_waits_for_confirmed_nonce_header_to_appear_on_target() { + // 1 delivery confirmation from target to source is still missing, so we may deliver + // reward confirmation with our message delivery transaction. But the problem is that + // the reward has been paid at header 2 && this header is still unknown to target node. + // + // => so we can't deliver more than 3 messages + let (mut state, mut strategy) = prepare_strategy(); + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.latest_confirmed_nonces_at_source = vec![ + (header_id(1), prev_confirmed_nonce_at_source - 1), + (header_id(2), prev_confirmed_nonce_at_source), + ] + .into_iter() + .collect(); + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + state.best_finalized_source_header_id_at_best_target = Some(header_id(1)); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + + // the same situation, but the header 2 is known to the target node, so we may deliver + // reward confirmation + let (mut state, mut strategy) = prepare_strategy(); + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.latest_confirmed_nonces_at_source = vec![ + (header_id(1), prev_confirmed_nonce_at_source - 1), + (header_id(2), prev_confirmed_nonce_at_source), + ] + .into_iter() + .collect(); + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + state.best_finalized_source_header_id_at_source = Some(header_id(2)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(true, 4))) + ); + } + + #[async_std::test] + async fn source_header_is_required_when_confirmations_are_required() { + // let's prepare situation when: + // - all messages [20; 23] have been generated at source block#1; + let (mut state, mut strategy) = prepare_strategy(); + // + // - messages [20; 23] have been delivered + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(((20..=23), proof_parameters(false, 4))) + ); + strategy.finalized_target_nonces_updated( + TargetClientNonces { + latest_nonce: 23, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 4, + total_messages: 4, + last_delivered_nonce: 23, + }, + }, + }, + &mut state, + ); + // nothing needs to be delivered now and we don't need any new headers + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + + // block#2 is generated + state.best_finalized_source_header_id_at_source = Some(header_id(2)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + state.best_target_header_id = Some(header_id(2)); + state.best_finalized_target_header_id = Some(header_id(2)); + + // now let's generate two more nonces [24; 25] at the source; + strategy.source_nonces_updated(header_id(2), source_nonces(24..=25, 19, 0)); + // + // we don't need to relay more headers to target, because messages [20; 23] have + // not confirmed to source yet + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + + // let's relay source block#3 + state.best_finalized_source_header_id_at_source = Some(header_id(3)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(3)); + state.best_target_header_id = Some(header_id(3)); + state.best_finalized_target_header_id = Some(header_id(3)); + + // and ask strategy again => still nothing to deliver, because parallel confirmations + // race need to be pushed further + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + + // let's relay source block#3 + state.best_finalized_source_header_id_at_source = Some(header_id(4)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(4)); + state.best_target_header_id = Some(header_id(4)); + state.best_finalized_target_header_id = Some(header_id(4)); + + // let's confirm messages [20; 23] + strategy.source_nonces_updated(header_id(4), source_nonces(24..=25, 23, 0)); + + // and ask strategy again => now we have everything required to deliver remaining + // [24; 25] nonces and proof of [20; 23] confirmation + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(((24..=25), proof_parameters(true, 2))), + ); + assert_eq!(strategy.required_source_header_at_target(state).await, None); + } + + #[async_std::test] + async fn relayer_uses_flattened_view_of_the_source_queue_to_select_nonces() { + // Real scenario that has happened on test deployments: + // 1) relayer witnessed M1 at block 1 => it has separate entry in the `source_queue` + // 2) relayer witnessed M2 at block 2 => it has separate entry in the `source_queue` + // 3) if block 2 is known to the target node, then both M1 and M2 are selected for single + // delivery, even though weight(M1+M2) > larger than largest allowed weight + // + // This was happening because selector (`select_nonces_for_delivery_transaction`) has been + // called for every `source_queue` entry separately without preserving any context. + let (mut state, mut strategy) = prepare_strategy(); + let nonces = source_nonces(24..=25, 19, 0); + strategy.strategy.source_nonces_updated(header_id(2), nonces); + strategy.max_unrewarded_relayer_entries_at_target = 100; + strategy.max_unconfirmed_nonces_at_target = 100; + strategy.max_messages_in_single_batch = 5; + strategy.max_messages_weight_in_single_batch = Weight::from_parts(100, 0); + strategy.max_messages_size_in_single_batch = 100; + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=24), proof_parameters(false, 5))) + ); + } + + #[async_std::test] + #[allow(clippy::reversed_empty_ranges)] + async fn no_source_headers_required_at_target_if_lanes_are_empty() { + let (state, _) = prepare_strategy(); + let mut strategy = TestStrategy { + max_unrewarded_relayer_entries_at_target: 4, + max_unconfirmed_nonces_at_target: 4, + max_messages_in_single_batch: 4, + max_messages_weight_in_single_batch: Weight::from_parts(4, 0), + max_messages_size_in_single_batch: 4, + latest_confirmed_nonces_at_source: VecDeque::new(), + lane_source_client: TestSourceClient::default(), + lane_target_client: TestTargetClient::default(), + metrics_msg: None, + target_nonces: None, + strategy: BasicStrategy::new(), + }; + + let source_header_id = header_id(10); + strategy.source_nonces_updated( + source_header_id, + // MessageDeliveryRaceSource::nonces returns Some(0), because that's how it is + // represented in memory (there's no Options in OutboundLaneState) + source_nonces(1u64..=0u64, 0, 0), + ); + + // even though `latest_confirmed_nonces_at_source` is not empty, new headers are not + // requested + assert_eq!( + strategy.latest_confirmed_nonces_at_source, + VecDeque::from([(source_header_id, 0)]) + ); + assert_eq!(strategy.required_source_header_at_target(state).await, None); + } + + #[async_std::test] + async fn previous_nonces_are_selected_if_reorg_happens_at_target_chain() { + // this is the copy of the similar test in the `mesage_race_strategy.rs`, but it also tests + // that the `MessageDeliveryStrategy` acts properly in the similar scenario + + // tune parameters to allow 5 nonces per delivery transaction + let (mut state, mut strategy) = prepare_strategy(); + strategy.max_unrewarded_relayer_entries_at_target = 5; + strategy.max_unconfirmed_nonces_at_target = 5; + strategy.max_messages_in_single_batch = 5; + strategy.max_messages_weight_in_single_batch = Weight::from_parts(5, 0); + strategy.max_messages_size_in_single_batch = 5; + + // in this state we have 4 available nonces for delivery + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(( + 20..=23, + MessageProofParameters { + outbound_state_proof_required: false, + dispatch_weight: Weight::from_parts(4, 0), + } + )), + ); + + // let's say we have submitted 20..=23 + state.nonces_submitted = Some(20..=23); + + // then new nonce 24 appear at the source block 2 + let new_nonce_24 = vec![( + 24, + MessageDetails { dispatch_weight: Weight::from_parts(1, 0), size: 0, reward: 0 }, + )] + .into_iter() + .collect(); + let source_header_2 = header_id(2); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + strategy.source_nonces_updated( + source_header_2, + SourceClientNonces { new_nonces: new_nonce_24, confirmed_nonce: None }, + ); + // and nonce 23 appear at the best block of the target node (best finalized still has 0 + // nonces) + let target_nonces_data = DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState::default(), + }; + let target_header_2 = header_id(2); + state.best_target_header_id = Some(target_header_2); + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 23, nonces_data: target_nonces_data.clone() }, + &mut state, + ); + + // then best target header is retracted + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 19, nonces_data: target_nonces_data.clone() }, + &mut state, + ); + + // ... and some fork with 19 delivered nonces is finalized + let target_header_2_fork = header_id(2_1); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + state.best_finalized_source_header_id_at_best_target = Some(source_header_2); + state.best_target_header_id = Some(target_header_2_fork); + state.best_finalized_target_header_id = Some(target_header_2_fork); + strategy.finalized_target_nonces_updated( + TargetClientNonces { latest_nonce: 19, nonces_data: target_nonces_data.clone() }, + &mut state, + ); + + // now we have to select nonces 20..=23 for delivery again + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(( + 20..=24, + MessageProofParameters { + outbound_state_proof_required: false, + dispatch_weight: Weight::from_parts(5, 0), + } + )), + ); + } + + #[async_std::test] + #[allow(clippy::reversed_empty_ranges)] + async fn delivery_race_is_able_to_unblock_lane() { + // step 1: messages 20..=23 are delivered from source to target at target block 2 + fn at_target_block_2_deliver_messages( + strategy: &mut TestStrategy, + state: &mut TestRaceState, + occupied_relayer_slots: MessageNonce, + occupied_message_slots: MessageNonce, + ) { + let nonces_at_target = TargetClientNonces { + latest_nonce: 23, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: occupied_relayer_slots, + total_messages: occupied_message_slots, + ..Default::default() + }, + }, + }; + + state.best_target_header_id = Some(header_id(2)); + state.best_finalized_target_header_id = Some(header_id(2)); + + strategy.best_target_nonces_updated(nonces_at_target.clone(), state); + strategy.finalized_target_nonces_updated(nonces_at_target, state); + } + + // step 2: delivery of messages 20..=23 is confirmed to the source node at source block 2 + fn at_source_block_2_deliver_confirmations( + strategy: &mut TestStrategy, + state: &mut TestRaceState, + ) { + state.best_finalized_source_header_id_at_source = Some(header_id(2)); + + strategy.source_nonces_updated( + header_id(2), + SourceClientNonces { new_nonces: Default::default(), confirmed_nonce: Some(23) }, + ); + } + + // step 3: finalize source block 2 at target block 3 and select nonces to deliver + async fn at_target_block_3_select_nonces_to_deliver( + strategy: &TestStrategy, + mut state: TestRaceState, + ) -> Option<(RangeInclusive, MessageProofParameters)> { + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + state.best_target_header_id = Some(header_id(3)); + state.best_finalized_target_header_id = Some(header_id(3)); + + strategy.select_nonces_to_deliver(state).await + } + + let max_unrewarded_relayer_entries_at_target = 4; + let max_unconfirmed_nonces_at_target = 4; + let expected_rewards_proof = Some(( + 1..=0, + MessageProofParameters { + outbound_state_proof_required: true, + dispatch_weight: Weight::zero(), + }, + )); + + // when lane is NOT blocked + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target - 1, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + assert_eq!(at_target_block_3_select_nonces_to_deliver(&strategy, state).await, None); + + // when lane is blocked by no-relayer-slots in unrewarded relayers vector + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target, + max_unconfirmed_nonces_at_target - 1, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!( + strategy.required_source_header_at_target(state.clone()).await, + Some(header_id(2)) + ); + assert_eq!( + at_target_block_3_select_nonces_to_deliver(&strategy, state).await, + expected_rewards_proof + ); + + // when lane is blocked by no-message-slots in unrewarded relayers vector + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!( + strategy.required_source_header_at_target(state.clone()).await, + Some(header_id(2)) + ); + assert_eq!( + at_target_block_3_select_nonces_to_deliver(&strategy, state).await, + expected_rewards_proof + ); + + // when lane is blocked by no-message-slots and no-message-slots in unrewarded relayers + // vector + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!( + strategy.required_source_header_at_target(state.clone()).await, + Some(header_id(2)) + ); + assert_eq!( + at_target_block_3_select_nonces_to_deliver(&strategy, state).await, + expected_rewards_proof + ); + + // when we have already selected some nonces to deliver, we don't need to select anything + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + state.nonces_to_submit = Some((header_id(2), 1..=0, (1..=0, None))); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + assert_eq!(at_target_block_3_select_nonces_to_deliver(&strategy, state).await, None); + + // when we have already submitted some nonces, we don't need to select anything + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + state.nonces_submitted = Some(1..=0); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + assert_eq!(at_target_block_3_select_nonces_to_deliver(&strategy, state).await, None); + } + + #[async_std::test] + async fn outbound_state_proof_is_not_required_when_we_have_no_new_confirmations() { + let (mut state, mut strategy) = prepare_strategy(); + + // pretend that we haven't seen any confirmations yet (or they're at the future target chain + // blocks) + strategy.latest_confirmed_nonces_at_source.clear(); + + // emulate delivery of some nonces (20..=23 are generated, but we only deliver 20..=21) + let nonces_at_target = TargetClientNonces { + latest_nonce: 21, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 2, + ..Default::default() + }, + }, + }; + state.best_target_header_id = Some(header_id(2)); + state.best_finalized_target_header_id = Some(header_id(2)); + strategy.best_target_nonces_updated(nonces_at_target.clone(), &mut state); + strategy.finalized_target_nonces_updated(nonces_at_target, &mut state); + + // we won't include outbound lane state proof into 22..=23 delivery transaction + // because it brings no new reward confirmations + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((22..=23), proof_parameters(false, 2))) + ); + } +} diff --git a/relays/messages/src/message_race_limits.rs b/relays/messages/src/message_race_limits.rs new file mode 100644 index 000000000000..873bb6aad042 --- /dev/null +++ b/relays/messages/src/message_race_limits.rs @@ -0,0 +1,206 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! enforcement strategy + +use num_traits::Zero; +use std::ops::RangeInclusive; + +use bp_messages::{MessageNonce, Weight}; + +use crate::{ + message_lane::MessageLane, + message_lane_loop::{ + MessageDetails, MessageDetailsMap, SourceClient as MessageLaneSourceClient, + TargetClient as MessageLaneTargetClient, + }, + message_race_loop::NoncesRange, + message_race_strategy::SourceRangesQueue, + metrics::MessageLaneLoopMetrics, +}; + +/// Reference data for participating in relay +pub struct RelayReference< + P: MessageLane, + SourceClient: MessageLaneSourceClient

, + TargetClient: MessageLaneTargetClient

, +> { + /// The client that is connected to the message lane source node. + pub lane_source_client: SourceClient, + /// The client that is connected to the message lane target node. + pub lane_target_client: TargetClient, + /// Metrics reference. + pub metrics: Option, + /// Messages size summary + pub selected_size: u32, + + /// Hard check begin nonce + pub hard_selected_begin_nonce: MessageNonce, + + /// Index by all ready nonces + pub index: usize, + /// Current nonce + pub nonce: MessageNonce, + /// Current nonce details + pub details: MessageDetails, +} + +/// Relay reference data +pub struct RelayMessagesBatchReference< + P: MessageLane, + SourceClient: MessageLaneSourceClient

, + TargetClient: MessageLaneTargetClient

, +> { + /// Maximal number of relayed messages in single delivery transaction. + pub max_messages_in_this_batch: MessageNonce, + /// Maximal cumulative dispatch weight of relayed messages in single delivery transaction. + pub max_messages_weight_in_single_batch: Weight, + /// Maximal cumulative size of relayed messages in single delivery transaction. + pub max_messages_size_in_single_batch: u32, + /// The client that is connected to the message lane source node. + pub lane_source_client: SourceClient, + /// The client that is connected to the message lane target node. + pub lane_target_client: TargetClient, + /// Metrics reference. + pub metrics: Option, + /// Best available nonce at the **best** target block. We do not want to deliver nonces + /// less than this nonce, even though the block may be retracted. + pub best_target_nonce: MessageNonce, + /// Source queue. + pub nonces_queue: SourceRangesQueue< + P::SourceHeaderHash, + P::SourceHeaderNumber, + MessageDetailsMap, + >, + /// Range of indices within the `nonces_queue` that are available for selection. + pub nonces_queue_range: RangeInclusive, +} + +/// Limits of the message race transactions. +#[derive(Clone)] +pub struct MessageRaceLimits; + +impl MessageRaceLimits { + pub async fn decide< + P: MessageLane, + SourceClient: MessageLaneSourceClient

, + TargetClient: MessageLaneTargetClient

, + >( + reference: RelayMessagesBatchReference, + ) -> Option> { + let mut hard_selected_count = 0; + + let mut selected_weight = Weight::zero(); + let mut selected_count: MessageNonce = 0; + + let hard_selected_begin_nonce = std::cmp::max( + reference.best_target_nonce + 1, + reference.nonces_queue[*reference.nonces_queue_range.start()].1.begin(), + ); + + // relay reference + let mut relay_reference = RelayReference { + lane_source_client: reference.lane_source_client.clone(), + lane_target_client: reference.lane_target_client.clone(), + metrics: reference.metrics.clone(), + + selected_size: 0, + + hard_selected_begin_nonce, + + index: 0, + nonce: 0, + details: MessageDetails { + dispatch_weight: Weight::zero(), + size: 0, + reward: P::SourceChainBalance::zero(), + }, + }; + + let all_ready_nonces = reference + .nonces_queue + .range(reference.nonces_queue_range.clone()) + .flat_map(|(_, ready_nonces)| ready_nonces.iter()) + .filter(|(nonce, _)| **nonce >= hard_selected_begin_nonce) + .enumerate(); + for (index, (nonce, details)) in all_ready_nonces { + relay_reference.index = index; + relay_reference.nonce = *nonce; + relay_reference.details = *details; + + // Since we (hopefully) have some reserves in `max_messages_weight_in_single_batch` + // and `max_messages_size_in_single_batch`, we may still try to submit transaction + // with single message if message overflows these limits. The worst case would be if + // transaction will be rejected by the target runtime, but at least we have tried. + + // limit messages in the batch by weight + let new_selected_weight = match selected_weight.checked_add(&details.dispatch_weight) { + Some(new_selected_weight) + if new_selected_weight + .all_lte(reference.max_messages_weight_in_single_batch) => + new_selected_weight, + new_selected_weight if selected_count == 0 => { + log::warn!( + target: "bridge", + "Going to submit message delivery transaction with declared dispatch \ + weight {:?} that overflows maximal configured weight {}", + new_selected_weight, + reference.max_messages_weight_in_single_batch, + ); + new_selected_weight.unwrap_or(Weight::MAX) + }, + _ => break, + }; + + // limit messages in the batch by size + let new_selected_size = match relay_reference.selected_size.checked_add(details.size) { + Some(new_selected_size) + if new_selected_size <= reference.max_messages_size_in_single_batch => + new_selected_size, + new_selected_size if selected_count == 0 => { + log::warn!( + target: "bridge", + "Going to submit message delivery transaction with message \ + size {:?} that overflows maximal configured size {}", + new_selected_size, + reference.max_messages_size_in_single_batch, + ); + new_selected_size.unwrap_or(u32::MAX) + }, + _ => break, + }; + + // limit number of messages in the batch + let new_selected_count = selected_count + 1; + if new_selected_count > reference.max_messages_in_this_batch { + break + } + relay_reference.selected_size = new_selected_size; + + hard_selected_count = index + 1; + selected_weight = new_selected_weight; + selected_count = new_selected_count; + } + + if hard_selected_count != 0 { + let selected_max_nonce = + hard_selected_begin_nonce + hard_selected_count as MessageNonce - 1; + Some(hard_selected_begin_nonce..=selected_max_nonce) + } else { + None + } + } +} diff --git a/relays/messages/src/message_race_loop.rs b/relays/messages/src/message_race_loop.rs new file mode 100644 index 000000000000..f28be78842fc --- /dev/null +++ b/relays/messages/src/message_race_loop.rs @@ -0,0 +1,835 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Loop that is serving single race within message lane. This could be +//! message delivery race, receiving confirmations race or processing +//! confirmations race. +//! +//! The idea of the race is simple - we have `nonce`-s on source and target +//! nodes. We're trying to prove that the source node has this nonce (and +//! associated data - like messages, lane state, etc) to the target node by +//! generating and submitting proof. + +use crate::message_lane_loop::{BatchTransaction, ClientState, NoncesSubmitArtifacts}; + +use async_trait::async_trait; +use bp_messages::MessageNonce; +use futures::{ + future::{FutureExt, TryFutureExt}, + stream::{FusedStream, StreamExt}, +}; +use relay_utils::{ + process_future_result, retry_backoff, FailedClient, MaybeConnectionError, + TrackedTransactionStatus, TransactionTracker, +}; +use std::{ + fmt::Debug, + ops::RangeInclusive, + time::{Duration, Instant}, +}; + +/// One of races within lane. +pub trait MessageRace { + /// Header id of the race source. + type SourceHeaderId: Debug + Clone + PartialEq + Send + Sync; + /// Header id of the race source. + type TargetHeaderId: Debug + Clone + PartialEq + Send + Sync; + + /// Message nonce used in the race. + type MessageNonce: Debug + Clone; + /// Proof that is generated and delivered in this race. + type Proof: Debug + Clone + Send + Sync; + + /// Name of the race source. + fn source_name() -> String; + /// Name of the race target. + fn target_name() -> String; +} + +/// State of race source client. +type SourceClientState

= + ClientState<

::SourceHeaderId,

::TargetHeaderId>; + +/// State of race target client. +type TargetClientState

= + ClientState<

::TargetHeaderId,

::SourceHeaderId>; + +/// Inclusive nonces range. +pub trait NoncesRange: Debug + Sized { + /// Get begin of the range. + fn begin(&self) -> MessageNonce; + /// Get end of the range. + fn end(&self) -> MessageNonce; + /// Returns new range with current range nonces that are greater than the passed `nonce`. + /// If there are no such nonces, `None` is returned. + fn greater_than(self, nonce: MessageNonce) -> Option; +} + +/// Nonces on the race source client. +#[derive(Debug, Clone)] +pub struct SourceClientNonces { + /// New nonces range known to the client. `New` here means all nonces generated after + /// `prev_latest_nonce` passed to the `SourceClient::nonces` method. + pub new_nonces: NoncesRange, + /// The latest nonce that is confirmed to the bridged client. This nonce only makes + /// sense in some races. In other races it is `None`. + pub confirmed_nonce: Option, +} + +/// Nonces on the race target client. +#[derive(Debug, Clone)] +pub struct TargetClientNonces { + /// The latest nonce that is known to the target client. + pub latest_nonce: MessageNonce, + /// Additional data from target node that may be used by the race. + pub nonces_data: TargetNoncesData, +} + +/// One of message lane clients, which is source client for the race. +#[async_trait] +pub trait SourceClient { + /// Type of error these clients returns. + type Error: std::fmt::Debug + MaybeConnectionError; + /// Type of nonces range returned by the source client. + type NoncesRange: NoncesRange; + /// Additional proof parameters required to generate proof. + type ProofParameters; + + /// Return nonces that are known to the source client. + async fn nonces( + &self, + at_block: P::SourceHeaderId, + prev_latest_nonce: MessageNonce, + ) -> Result<(P::SourceHeaderId, SourceClientNonces), Self::Error>; + /// Generate proof for delivering to the target client. + async fn generate_proof( + &self, + at_block: P::SourceHeaderId, + nonces: RangeInclusive, + proof_parameters: Self::ProofParameters, + ) -> Result<(P::SourceHeaderId, RangeInclusive, P::Proof), Self::Error>; +} + +/// One of message lane clients, which is target client for the race. +#[async_trait] +pub trait TargetClient { + /// Type of error these clients returns. + type Error: std::fmt::Debug + MaybeConnectionError; + /// Type of the additional data from the target client, used by the race. + type TargetNoncesData: std::fmt::Debug; + /// Type of batch transaction that submits finality and proof to the target node. + type BatchTransaction: BatchTransaction + Clone; + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker; + + /// Ask headers relay to relay finalized headers up to (and including) given header + /// from race source to race target. + /// + /// The client may return `Some(_)`, which means that nothing has happened yet and + /// the caller must generate and append proof to the batch transaction + /// to actually send it (along with required header) to the node. + /// + /// If function has returned `None`, it means that the caller now must wait for the + /// appearance of the required header `id` at the target client. + async fn require_source_header( + &self, + id: P::SourceHeaderId, + ) -> Result, Self::Error>; + + /// Return nonces that are known to the target client. + async fn nonces( + &self, + at_block: P::TargetHeaderId, + update_metrics: bool, + ) -> Result<(P::TargetHeaderId, TargetClientNonces), Self::Error>; + /// Submit proof to the target client. + async fn submit_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: P::SourceHeaderId, + nonces: RangeInclusive, + proof: P::Proof, + ) -> Result, Self::Error>; +} + +/// Race strategy. +#[async_trait] +pub trait RaceStrategy: Debug { + /// Type of nonces range expected from the source client. + type SourceNoncesRange: NoncesRange; + /// Additional proof parameters required to generate proof. + type ProofParameters; + /// Additional data expected from the target client. + type TargetNoncesData; + + /// Should return true if nothing has to be synced. + fn is_empty(&self) -> bool; + /// Return id of source header that is required to be on target to continue synchronization. + async fn required_source_header_at_target>( + &self, + race_state: RS, + ) -> Option; + /// Return the best nonce at source node. + /// + /// `Some` is returned only if we are sure that the value is greater or equal + /// than the result of `best_at_target`. + fn best_at_source(&self) -> Option; + /// Return the best nonce at target node. + /// + /// May return `None` if value is yet unknown. + fn best_at_target(&self) -> Option; + + /// Called when nonces are updated at source node of the race. + fn source_nonces_updated( + &mut self, + at_block: SourceHeaderId, + nonces: SourceClientNonces, + ); + /// Called when we want to wait until next `best_target_nonces_updated` before selecting + /// any nonces for delivery. + fn reset_best_target_nonces(&mut self); + /// Called when best nonces are updated at target node of the race. + fn best_target_nonces_updated>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ); + /// Called when finalized nonces are updated at target node of the race. + fn finalized_target_nonces_updated>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ); + /// Should return `Some(nonces)` if we need to deliver proof of `nonces` (and associated + /// data) from source to target node. + /// Additionally, parameters required to generate proof are returned. + async fn select_nonces_to_deliver>( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, Self::ProofParameters)>; +} + +/// State of the race. +pub trait RaceState: Clone + Send + Sync { + /// Set best finalized source header id at the best block on the target + /// client (at the `best_finalized_source_header_id_at_best_target`). + fn set_best_finalized_source_header_id_at_best_target(&mut self, id: SourceHeaderId); + + /// Best finalized source header id at the source client. + fn best_finalized_source_header_id_at_source(&self) -> Option; + /// Best finalized source header id at the best block on the target + /// client (at the `best_finalized_source_header_id_at_best_target`). + fn best_finalized_source_header_id_at_best_target(&self) -> Option; + /// The best header id at the target client. + fn best_target_header_id(&self) -> Option; + /// Best finalized header id at the target client. + fn best_finalized_target_header_id(&self) -> Option; + + /// Returns `true` if we have selected nonces to submit to the target node. + fn nonces_to_submit(&self) -> Option>; + /// Reset our nonces selection. + fn reset_nonces_to_submit(&mut self); + + /// Returns `true` if we have submitted some nonces to the target node and are + /// waiting for them to appear there. + fn nonces_submitted(&self) -> Option>; + /// Reset our nonces submission. + fn reset_nonces_submitted(&mut self); +} + +/// State of the race and prepared batch transaction (if available). +#[derive(Debug, Clone)] +pub(crate) struct RaceStateImpl { + /// Best finalized source header id at the source client. + pub best_finalized_source_header_id_at_source: Option, + /// Best finalized source header id at the best block on the target + /// client (at the `best_finalized_source_header_id_at_best_target`). + pub best_finalized_source_header_id_at_best_target: Option, + /// The best header id at the target client. + pub best_target_header_id: Option, + /// Best finalized header id at the target client. + pub best_finalized_target_header_id: Option, + /// Range of nonces that we have selected to submit. + pub nonces_to_submit: Option<(SourceHeaderId, RangeInclusive, Proof)>, + /// Batch transaction ready to include and deliver selected `nonces_to_submit` from the + /// `state`. + pub nonces_to_submit_batch: Option, + /// Range of nonces that is currently submitted. + pub nonces_submitted: Option>, +} + +impl Default + for RaceStateImpl +{ + fn default() -> Self { + RaceStateImpl { + best_finalized_source_header_id_at_source: None, + best_finalized_source_header_id_at_best_target: None, + best_target_header_id: None, + best_finalized_target_header_id: None, + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + } + } +} + +impl RaceState + for RaceStateImpl +where + SourceHeaderId: Clone + Send + Sync, + TargetHeaderId: Clone + Send + Sync, + Proof: Clone + Send + Sync, + BatchTx: Clone + Send + Sync, +{ + fn set_best_finalized_source_header_id_at_best_target(&mut self, id: SourceHeaderId) { + self.best_finalized_source_header_id_at_best_target = Some(id); + } + + fn best_finalized_source_header_id_at_source(&self) -> Option { + self.best_finalized_source_header_id_at_source.clone() + } + + fn best_finalized_source_header_id_at_best_target(&self) -> Option { + self.best_finalized_source_header_id_at_best_target.clone() + } + + fn best_target_header_id(&self) -> Option { + self.best_target_header_id.clone() + } + + fn best_finalized_target_header_id(&self) -> Option { + self.best_finalized_target_header_id.clone() + } + + fn nonces_to_submit(&self) -> Option> { + self.nonces_to_submit.as_ref().map(|(_, nonces, _)| nonces.clone()) + } + + fn reset_nonces_to_submit(&mut self) { + self.nonces_to_submit = None; + self.nonces_to_submit_batch = None; + } + + fn nonces_submitted(&self) -> Option> { + self.nonces_submitted.clone() + } + + fn reset_nonces_submitted(&mut self) { + self.nonces_submitted = None; + } +} + +/// Run race loop until connection with target or source node is lost. +pub async fn run, TC: TargetClient

>( + race_source: SC, + race_source_updated: impl FusedStream>, + race_target: TC, + race_target_updated: impl FusedStream>, + mut strategy: impl RaceStrategy< + P::SourceHeaderId, + P::TargetHeaderId, + P::Proof, + SourceNoncesRange = SC::NoncesRange, + ProofParameters = SC::ProofParameters, + TargetNoncesData = TC::TargetNoncesData, + >, +) -> Result<(), FailedClient> { + let mut progress_context = Instant::now(); + let mut race_state = RaceStateImpl::default(); + + let mut source_retry_backoff = retry_backoff(); + let mut source_client_is_online = true; + let mut source_nonces_required = false; + let mut source_required_header = None; + let source_nonces = futures::future::Fuse::terminated(); + let source_generate_proof = futures::future::Fuse::terminated(); + let source_go_offline_future = futures::future::Fuse::terminated(); + + let mut target_retry_backoff = retry_backoff(); + let mut target_client_is_online = true; + let mut target_best_nonces_required = false; + let mut target_finalized_nonces_required = false; + let mut target_batch_transaction = None; + let target_require_source_header = futures::future::Fuse::terminated(); + let target_best_nonces = futures::future::Fuse::terminated(); + let target_finalized_nonces = futures::future::Fuse::terminated(); + let target_submit_proof = futures::future::Fuse::terminated(); + let target_tx_tracker = futures::future::Fuse::terminated(); + let target_go_offline_future = futures::future::Fuse::terminated(); + + futures::pin_mut!( + race_source_updated, + source_nonces, + source_generate_proof, + source_go_offline_future, + race_target_updated, + target_require_source_header, + target_best_nonces, + target_finalized_nonces, + target_submit_proof, + target_tx_tracker, + target_go_offline_future, + ); + + loop { + futures::select! { + // when headers ids are updated + source_state = race_source_updated.next() => { + if let Some(source_state) = source_state { + let is_source_state_updated = race_state.best_finalized_source_header_id_at_source.as_ref() + != Some(&source_state.best_finalized_self); + if is_source_state_updated { + source_nonces_required = true; + race_state.best_finalized_source_header_id_at_source + = Some(source_state.best_finalized_self); + } + } + }, + target_state = race_target_updated.next() => { + if let Some(target_state) = target_state { + let is_target_best_state_updated = race_state.best_target_header_id.as_ref() + != Some(&target_state.best_self); + + if is_target_best_state_updated { + target_best_nonces_required = true; + race_state.best_target_header_id = Some(target_state.best_self); + race_state.best_finalized_source_header_id_at_best_target + = target_state.best_finalized_peer_at_best_self; + } + + let is_target_finalized_state_updated = race_state.best_finalized_target_header_id.as_ref() + != Some(&target_state.best_finalized_self); + if is_target_finalized_state_updated { + target_finalized_nonces_required = true; + race_state.best_finalized_target_header_id = Some(target_state.best_finalized_self); + } + } + }, + + // when nonces are updated + nonces = source_nonces => { + source_nonces_required = false; + + source_client_is_online = process_future_result( + nonces, + &mut source_retry_backoff, + |(at_block, nonces)| { + log::debug!( + target: "bridge", + "Received nonces from {}: {:?}", + P::source_name(), + nonces, + ); + + strategy.source_nonces_updated(at_block, nonces); + }, + &mut source_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving nonces from {}", P::source_name()), + ).fail_if_connection_error(FailedClient::Source)?; + + // ask for more headers if we have nonces to deliver and required headers are missing + source_required_header = strategy + .required_source_header_at_target(race_state.clone()) + .await; + }, + nonces = target_best_nonces => { + target_best_nonces_required = false; + + target_client_is_online = process_future_result( + nonces, + &mut target_retry_backoff, + |(_, nonces)| { + log::debug!( + target: "bridge", + "Received best nonces from {}: {:?}", + P::target_name(), + nonces, + ); + + strategy.best_target_nonces_updated(nonces, &mut race_state); + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving best nonces from {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + }, + nonces = target_finalized_nonces => { + target_finalized_nonces_required = false; + + target_client_is_online = process_future_result( + nonces, + &mut target_retry_backoff, + |(_, nonces)| { + log::debug!( + target: "bridge", + "Received finalized nonces from {}: {:?}", + P::target_name(), + nonces, + ); + + strategy.finalized_target_nonces_updated(nonces, &mut race_state); + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving finalized nonces from {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + }, + + // proof generation and submission + maybe_batch_transaction = target_require_source_header => { + source_required_header = None; + + target_client_is_online = process_future_result( + maybe_batch_transaction, + &mut target_retry_backoff, + |maybe_batch_transaction: Option| { + log::debug!( + target: "bridge", + "Target {} client has been asked for more {} headers. Batch tx: {}", + P::target_name(), + P::source_name(), + maybe_batch_transaction + .as_ref() + .map(|bt| format!("yes ({:?})", bt.required_header_id())) + .unwrap_or_else(|| "no".into()), + ); + + target_batch_transaction = maybe_batch_transaction; + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error asking for source headers at {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + }, + proof = source_generate_proof => { + source_client_is_online = process_future_result( + proof, + &mut source_retry_backoff, + |(at_block, nonces_range, proof, batch_transaction)| { + log::debug!( + target: "bridge", + "Received proof for nonces in range {:?} from {}", + nonces_range, + P::source_name(), + ); + + race_state.nonces_to_submit = Some((at_block, nonces_range, proof)); + race_state.nonces_to_submit_batch = batch_transaction; + }, + &mut source_go_offline_future, + async_std::task::sleep, + || format!("Error generating proof at {}", P::source_name()), + ).fail_if_error(FailedClient::Source).map(|_| true)?; + }, + proof_submit_result = target_submit_proof => { + target_client_is_online = process_future_result( + proof_submit_result, + &mut target_retry_backoff, + |artifacts: NoncesSubmitArtifacts| { + log::debug!( + target: "bridge", + "Successfully submitted proof of nonces {:?} to {}", + artifacts.nonces, + P::target_name(), + ); + + race_state.nonces_submitted = Some(artifacts.nonces); + target_tx_tracker.set(artifacts.tx_tracker.wait().fuse()); + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error submitting proof {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + + // in any case - we don't need to retry submitting the same nonces again until + // we read nonces from the target client + race_state.reset_nonces_to_submit(); + // if we have failed to submit transaction AND that is not the connection issue, + // then we need to read best target nonces before selecting nonces again + if !target_client_is_online { + strategy.reset_best_target_nonces(); + } + }, + target_transaction_status = target_tx_tracker => { + match (target_transaction_status, race_state.nonces_submitted.as_ref()) { + (TrackedTransactionStatus::Finalized(at_block), Some(nonces_submitted)) => { + // our transaction has been mined, but was it successful or not? let's check the best + // nonce at the target node. + let _ = race_target.nonces(at_block, false) + .await + .map_err(|e| format!("failed to read nonces from target node: {e:?}")) + .and_then(|(_, nonces_at_target)| { + if nonces_at_target.latest_nonce < *nonces_submitted.end() { + Err(format!( + "best nonce at target after tx is {:?} and we've submitted {:?}", + nonces_at_target.latest_nonce, + nonces_submitted.end(), + )) + } else { + Ok(()) + } + }) + .map_err(|e| { + log::error!( + target: "bridge", + "{} -> {} race transaction failed: {}", + P::source_name(), + P::target_name(), + e, + ); + + race_state.reset_nonces_submitted(); + }); + }, + (TrackedTransactionStatus::Lost, _) => { + log::warn!( + target: "bridge", + "{} -> {} race transaction has been lost. State: {:?}. Strategy: {:?}", + P::source_name(), + P::target_name(), + race_state, + strategy, + ); + + race_state.reset_nonces_submitted(); + }, + _ => (), + } + }, + + // when we're ready to retry request + _ = source_go_offline_future => { + source_client_is_online = true; + }, + _ = target_go_offline_future => { + target_client_is_online = true; + }, + } + + progress_context = print_race_progress::(progress_context, &strategy); + + if source_client_is_online { + source_client_is_online = false; + + // if we've started to submit batch transaction, let's prioritize it + // + // we're using `take` here, because we don't need batch transaction (i.e. some + // underlying finality proof) anymore for our future calls - we were unable to + // use it for our current state, so why would we need to keep an obsolete proof + // for the future? + let target_batch_transaction = target_batch_transaction.take(); + let expected_race_state = + if let Some(ref target_batch_transaction) = target_batch_transaction { + // when selecting nonces for the batch transaction, we assume that the required + // source header is already at the target chain + let required_source_header_at_target = + target_batch_transaction.required_header_id(); + let mut expected_race_state = race_state.clone(); + expected_race_state.best_finalized_source_header_id_at_best_target = + Some(required_source_header_at_target); + expected_race_state + } else { + race_state.clone() + }; + + let nonces_to_deliver = select_nonces_to_deliver(expected_race_state, &strategy).await; + let best_at_source = strategy.best_at_source(); + + if let Some((at_block, nonces_range, proof_parameters)) = nonces_to_deliver { + log::debug!( + target: "bridge", + "Asking {} to prove nonces in range {:?} at block {:?}", + P::source_name(), + nonces_range, + at_block, + ); + + source_generate_proof.set( + race_source + .generate_proof(at_block, nonces_range, proof_parameters) + .and_then(|(at_source_block, nonces, proof)| async { + Ok((at_source_block, nonces, proof, target_batch_transaction)) + }) + .fuse(), + ); + } else if let (true, Some(best_at_source)) = (source_nonces_required, best_at_source) { + log::debug!(target: "bridge", "Asking {} about message nonces", P::source_name()); + let at_block = race_state + .best_finalized_source_header_id_at_source + .as_ref() + .expect( + "source_nonces_required is only true when\ + best_finalized_source_header_id_at_source is Some; qed", + ) + .clone(); + source_nonces.set(race_source.nonces(at_block, best_at_source).fuse()); + } else { + source_client_is_online = true; + } + } + + if target_client_is_online { + target_client_is_online = false; + + if let Some((at_block, nonces_range, proof)) = race_state.nonces_to_submit.as_ref() { + log::debug!( + target: "bridge", + "Going to submit proof of messages in range {:?} to {} node{}", + nonces_range, + P::target_name(), + race_state.nonces_to_submit_batch.as_ref().map(|tx| format!( + ". This transaction is batched with sending the proof for header {:?}.", + tx.required_header_id()) + ).unwrap_or_default(), + ); + + target_submit_proof.set( + race_target + .submit_proof( + race_state.nonces_to_submit_batch.clone(), + at_block.clone(), + nonces_range.clone(), + proof.clone(), + ) + .fuse(), + ); + } else if let Some(source_required_header) = source_required_header.clone() { + log::debug!( + target: "bridge", + "Going to require {} header {:?} at {}", + P::source_name(), + source_required_header, + P::target_name(), + ); + target_require_source_header + .set(race_target.require_source_header(source_required_header).fuse()); + } else if target_best_nonces_required { + log::debug!(target: "bridge", "Asking {} about best message nonces", P::target_name()); + let at_block = race_state + .best_target_header_id + .as_ref() + .expect("target_best_nonces_required is only true when best_target_header_id is Some; qed") + .clone(); + target_best_nonces.set(race_target.nonces(at_block, false).fuse()); + } else if target_finalized_nonces_required { + log::debug!(target: "bridge", "Asking {} about finalized message nonces", P::target_name()); + let at_block = race_state + .best_finalized_target_header_id + .as_ref() + .expect( + "target_finalized_nonces_required is only true when\ + best_finalized_target_header_id is Some; qed", + ) + .clone(); + target_finalized_nonces.set(race_target.nonces(at_block, true).fuse()); + } else { + target_client_is_online = true; + } + } + } +} + +/// Print race progress. +fn print_race_progress(prev_time: Instant, strategy: &S) -> Instant +where + P: MessageRace, + S: RaceStrategy, +{ + let now_time = Instant::now(); + + let need_update = now_time.saturating_duration_since(prev_time) > Duration::from_secs(10); + if !need_update { + return prev_time + } + + let now_best_nonce_at_source = strategy.best_at_source(); + let now_best_nonce_at_target = strategy.best_at_target(); + log::info!( + target: "bridge", + "Synced {:?} of {:?} nonces in {} -> {} race", + now_best_nonce_at_target, + now_best_nonce_at_source, + P::source_name(), + P::target_name(), + ); + now_time +} + +async fn select_nonces_to_deliver( + race_state: impl RaceState, + strategy: &Strategy, +) -> Option<(SourceHeaderId, RangeInclusive, Strategy::ProofParameters)> +where + SourceHeaderId: Clone, + Strategy: RaceStrategy, +{ + let best_finalized_source_header_id_at_best_target = + race_state.best_finalized_source_header_id_at_best_target()?; + strategy + .select_nonces_to_deliver(race_state) + .await + .map(|(nonces_range, proof_parameters)| { + (best_finalized_source_header_id_at_best_target, nonces_range, proof_parameters) + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::message_race_strategy::BasicStrategy; + use relay_utils::HeaderId; + + #[async_std::test] + async fn proof_is_generated_at_best_block_known_to_target_node() { + const GENERATED_AT: u64 = 6; + const BEST_AT_SOURCE: u64 = 10; + const BEST_AT_TARGET: u64 = 8; + + // target node only knows about source' BEST_AT_TARGET block + // source node has BEST_AT_SOURCE > BEST_AT_TARGET block + let mut race_state = RaceStateImpl::<_, _, (), ()> { + best_finalized_source_header_id_at_source: Some(HeaderId( + BEST_AT_SOURCE, + BEST_AT_SOURCE, + )), + best_finalized_source_header_id_at_best_target: Some(HeaderId( + BEST_AT_TARGET, + BEST_AT_TARGET, + )), + best_target_header_id: Some(HeaderId(0, 0)), + best_finalized_target_header_id: Some(HeaderId(0, 0)), + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + }; + + // we have some nonces to deliver and they're generated at GENERATED_AT < BEST_AT_SOURCE + let mut strategy = BasicStrategy::<_, _, _, _, _, ()>::new(); + strategy.source_nonces_updated( + HeaderId(GENERATED_AT, GENERATED_AT), + SourceClientNonces { new_nonces: 0..=10, confirmed_nonce: None }, + ); + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 5u64, nonces_data: () }, + &mut race_state, + ); + + // the proof will be generated on source, but using BEST_AT_TARGET block + assert_eq!( + select_nonces_to_deliver(race_state, &strategy).await, + Some((HeaderId(BEST_AT_TARGET, BEST_AT_TARGET), 6..=10, (),)) + ); + } +} diff --git a/relays/messages/src/message_race_receiving.rs b/relays/messages/src/message_race_receiving.rs new file mode 100644 index 000000000000..e6497a1b79eb --- /dev/null +++ b/relays/messages/src/message_race_receiving.rs @@ -0,0 +1,235 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Message receiving race delivers proof-of-messages-delivery from "lane.target" to "lane.source". + +use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{ + NoncesSubmitArtifacts, SourceClient as MessageLaneSourceClient, SourceClientState, + TargetClient as MessageLaneTargetClient, TargetClientState, + }, + message_race_loop::{ + MessageRace, NoncesRange, SourceClient, SourceClientNonces, TargetClient, + TargetClientNonces, + }, + message_race_strategy::BasicStrategy, + metrics::MessageLaneLoopMetrics, +}; + +use async_trait::async_trait; +use bp_messages::MessageNonce; +use futures::stream::FusedStream; +use relay_utils::FailedClient; +use std::{marker::PhantomData, ops::RangeInclusive}; + +/// Message receiving confirmations delivery strategy. +type ReceivingConfirmationsBasicStrategy

= BasicStrategy< +

::TargetHeaderNumber, +

::TargetHeaderHash, +

::SourceHeaderNumber, +

::SourceHeaderHash, + RangeInclusive, +

::MessagesReceivingProof, +>; + +/// Run receiving confirmations race. +pub async fn run( + source_client: impl MessageLaneSourceClient

, + source_state_updates: impl FusedStream>, + target_client: impl MessageLaneTargetClient

, + target_state_updates: impl FusedStream>, + metrics_msg: Option, +) -> Result<(), FailedClient> { + crate::message_race_loop::run( + ReceivingConfirmationsRaceSource { + client: target_client, + metrics_msg: metrics_msg.clone(), + _phantom: Default::default(), + }, + target_state_updates, + ReceivingConfirmationsRaceTarget { + client: source_client, + metrics_msg, + _phantom: Default::default(), + }, + source_state_updates, + ReceivingConfirmationsBasicStrategy::

::new(), + ) + .await +} + +/// Messages receiving confirmations race. +struct ReceivingConfirmationsRace

(std::marker::PhantomData

); + +impl MessageRace for ReceivingConfirmationsRace

{ + type SourceHeaderId = TargetHeaderIdOf

; + type TargetHeaderId = SourceHeaderIdOf

; + + type MessageNonce = MessageNonce; + type Proof = P::MessagesReceivingProof; + + fn source_name() -> String { + format!("{}::ReceivingConfirmationsDelivery", P::TARGET_NAME) + } + + fn target_name() -> String { + format!("{}::ReceivingConfirmationsDelivery", P::SOURCE_NAME) + } +} + +/// Message receiving confirmations race source, which is a target of the lane. +struct ReceivingConfirmationsRaceSource { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl SourceClient> for ReceivingConfirmationsRaceSource +where + P: MessageLane, + C: MessageLaneTargetClient

, +{ + type Error = C::Error; + type NoncesRange = RangeInclusive; + type ProofParameters = (); + + async fn nonces( + &self, + at_block: TargetHeaderIdOf

, + prev_latest_nonce: MessageNonce, + ) -> Result<(TargetHeaderIdOf

, SourceClientNonces), Self::Error> { + let (at_block, latest_received_nonce) = self.client.latest_received_nonce(at_block).await?; + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_target_latest_received_nonce(latest_received_nonce); + } + Ok(( + at_block, + SourceClientNonces { + new_nonces: prev_latest_nonce + 1..=latest_received_nonce, + confirmed_nonce: None, + }, + )) + } + + #[allow(clippy::unit_arg)] + async fn generate_proof( + &self, + at_block: TargetHeaderIdOf

, + nonces: RangeInclusive, + _proof_parameters: Self::ProofParameters, + ) -> Result< + (TargetHeaderIdOf

, RangeInclusive, P::MessagesReceivingProof), + Self::Error, + > { + self.client + .prove_messages_receiving(at_block) + .await + .map(|(at_block, proof)| (at_block, nonces, proof)) + } +} + +/// Message receiving confirmations race target, which is a source of the lane. +struct ReceivingConfirmationsRaceTarget { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl TargetClient> for ReceivingConfirmationsRaceTarget +where + P: MessageLane, + C: MessageLaneSourceClient

, +{ + type Error = C::Error; + type TargetNoncesData = (); + type BatchTransaction = C::BatchTransaction; + type TransactionTracker = C::TransactionTracker; + + async fn require_source_header( + &self, + id: TargetHeaderIdOf

, + ) -> Result, Self::Error> { + self.client.require_target_header_on_source(id).await + } + + async fn nonces( + &self, + at_block: SourceHeaderIdOf

, + update_metrics: bool, + ) -> Result<(SourceHeaderIdOf

, TargetClientNonces<()>), Self::Error> { + let (at_block, latest_confirmed_nonce) = + self.client.latest_confirmed_received_nonce(at_block).await?; + if update_metrics { + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_source_latest_confirmed_nonce(latest_confirmed_nonce); + } + } + Ok((at_block, TargetClientNonces { latest_nonce: latest_confirmed_nonce, nonces_data: () })) + } + + async fn submit_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: TargetHeaderIdOf

, + nonces: RangeInclusive, + proof: P::MessagesReceivingProof, + ) -> Result, Self::Error> { + let tx_tracker = self + .client + .submit_messages_receiving_proof(maybe_batch_tx, generated_at_block, proof) + .await?; + Ok(NoncesSubmitArtifacts { nonces, tx_tracker }) + } +} + +impl NoncesRange for RangeInclusive { + fn begin(&self) -> MessageNonce { + *RangeInclusive::::start(self) + } + + fn end(&self) -> MessageNonce { + *RangeInclusive::::end(self) + } + + fn greater_than(self, nonce: MessageNonce) -> Option { + let next_nonce = nonce + 1; + let end = *self.end(); + if next_nonce > end { + None + } else { + Some(std::cmp::max(self.begin(), next_nonce)..=end) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn range_inclusive_works_as_nonces_range() { + let range = 20..=30; + + assert_eq!(NoncesRange::begin(&range), 20); + assert_eq!(NoncesRange::end(&range), 30); + assert_eq!(range.clone().greater_than(10), Some(20..=30)); + assert_eq!(range.clone().greater_than(19), Some(20..=30)); + assert_eq!(range.clone().greater_than(20), Some(21..=30)); + assert_eq!(range.clone().greater_than(25), Some(26..=30)); + assert_eq!(range.clone().greater_than(29), Some(30..=30)); + assert_eq!(range.greater_than(30), None); + } +} diff --git a/relays/messages/src/message_race_strategy.rs b/relays/messages/src/message_race_strategy.rs new file mode 100644 index 000000000000..93d178e55b04 --- /dev/null +++ b/relays/messages/src/message_race_strategy.rs @@ -0,0 +1,628 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Basic delivery strategy. The strategy selects nonces if: +//! +//! 1) there are more nonces on the source side than on the target side; +//! 2) new nonces may be proved to target node (i.e. they have appeared at the block, which is known +//! to the target node). + +use crate::message_race_loop::{ + NoncesRange, RaceState, RaceStrategy, SourceClientNonces, TargetClientNonces, +}; + +use async_trait::async_trait; +use bp_messages::MessageNonce; +use relay_utils::HeaderId; +use std::{collections::VecDeque, fmt::Debug, marker::PhantomData, ops::RangeInclusive}; + +/// Queue of nonces known to the source node. +pub type SourceRangesQueue = + VecDeque<(HeaderId, SourceNoncesRange)>; + +/// Nonces delivery strategy. +#[derive(Debug)] +pub struct BasicStrategy< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, +> { + /// All queued nonces. + /// + /// The queue may contain already delivered nonces. We only remove entries from this + /// queue after corresponding nonces are finalized by the target chain. + source_queue: SourceRangesQueue, + /// The best nonce known to target node at its best block. `None` if it has not been received + /// yet. + best_target_nonce: Option, + /// Unused generic types dump. + _phantom: PhantomData<(TargetHeaderNumber, TargetHeaderHash, Proof)>, +} + +impl< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > + BasicStrategy< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > where + SourceHeaderHash: Clone, + SourceHeaderNumber: Clone + Ord, + SourceNoncesRange: NoncesRange, +{ + /// Create new delivery strategy. + pub fn new() -> Self { + BasicStrategy { + source_queue: VecDeque::new(), + best_target_nonce: None, + _phantom: Default::default(), + } + } + + /// Reference to source queue. + pub(crate) fn source_queue( + &self, + ) -> &VecDeque<(HeaderId, SourceNoncesRange)> { + &self.source_queue + } + + /// Mutable reference to source queue to use in tests. + #[cfg(test)] + pub(crate) fn source_queue_mut( + &mut self, + ) -> &mut VecDeque<(HeaderId, SourceNoncesRange)> { + &mut self.source_queue + } + + /// Returns indices of source queue entries, which may be delivered to the target node. + /// + /// The function may skip some nonces from the queue front if nonces from this entry are + /// already available at the **best** target block. After this block is finalized, the entry + /// will be removed from the queue. + /// + /// All entries before and including the range end index, are guaranteed to be witnessed + /// at source blocks that are known to be finalized at the target node. + /// + /// Returns `None` if no entries may be delivered. + pub fn available_source_queue_indices< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &self, + race_state: RS, + ) -> Option> { + // if we do not know best nonce at target node, we can't select anything + let best_target_nonce = self.best_target_nonce?; + + // if we have already selected nonces that we want to submit, do nothing + if race_state.nonces_to_submit().is_some() { + return None + } + + // if we already submitted some nonces, do nothing + if race_state.nonces_submitted().is_some() { + return None + } + + // find first entry that may be delivered to the target node + let begin_index = self + .source_queue + .iter() + .enumerate() + .skip_while(|(_, (_, nonces))| nonces.end() <= best_target_nonce) + .map(|(index, _)| index) + .next()?; + + // 1) we want to deliver all nonces, starting from `target_nonce + 1` + // 2) we can't deliver new nonce until header, that has emitted this nonce, is finalized + // by target client + // 3) selector is used for more complicated logic + // + // => let's first select range of entries inside deque that are already finalized at + // the target client and pass this range to the selector + let best_header_at_target = race_state.best_finalized_source_header_id_at_best_target()?; + let end_index = self + .source_queue + .iter() + .enumerate() + .skip(begin_index) + .take_while(|(_, (queued_at, _))| queued_at.0 <= best_header_at_target.0) + .map(|(index, _)| index) + .last()?; + + Some(begin_index..=end_index) + } + + /// Remove all nonces that are less than or equal to given nonce from the source queue. + fn remove_le_nonces_from_source_queue(&mut self, nonce: MessageNonce) { + while let Some((queued_at, queued_range)) = self.source_queue.pop_front() { + if let Some(range_to_requeue) = queued_range.greater_than(nonce) { + self.source_queue.push_front((queued_at, range_to_requeue)); + break + } + } + } +} + +#[async_trait] +impl< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > + RaceStrategy< + HeaderId, + HeaderId, + Proof, + > + for BasicStrategy< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > where + SourceHeaderHash: Clone + Debug + Send + Sync, + SourceHeaderNumber: Clone + Ord + Debug + Send + Sync, + SourceNoncesRange: NoncesRange + Debug + Send + Sync, + TargetHeaderHash: Debug + Send + Sync, + TargetHeaderNumber: Debug + Send + Sync, + Proof: Debug + Send + Sync, +{ + type SourceNoncesRange = SourceNoncesRange; + type ProofParameters = (); + type TargetNoncesData = (); + + fn is_empty(&self) -> bool { + self.source_queue.is_empty() + } + + async fn required_source_header_at_target< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &self, + race_state: RS, + ) -> Option> { + let current_best = race_state.best_finalized_source_header_id_at_best_target()?; + self.source_queue + .back() + .and_then(|(h, _)| if h.0 > current_best.0 { Some(h.clone()) } else { None }) + } + + fn best_at_source(&self) -> Option { + let best_in_queue = self.source_queue.back().map(|(_, range)| range.end()); + match (best_in_queue, self.best_target_nonce) { + (Some(best_in_queue), Some(best_target_nonce)) if best_in_queue > best_target_nonce => + Some(best_in_queue), + (_, Some(best_target_nonce)) => Some(best_target_nonce), + (_, None) => None, + } + } + + fn best_at_target(&self) -> Option { + self.best_target_nonce + } + + fn source_nonces_updated( + &mut self, + at_block: HeaderId, + nonces: SourceClientNonces, + ) { + let best_in_queue = self + .source_queue + .back() + .map(|(_, range)| range.end()) + .or(self.best_target_nonce) + .unwrap_or_default(); + self.source_queue.extend( + nonces + .new_nonces + .greater_than(best_in_queue) + .into_iter() + .map(move |range| (at_block.clone(), range)), + ) + } + + fn reset_best_target_nonces(&mut self) { + self.best_target_nonce = None; + } + + fn best_target_nonces_updated< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &mut self, + nonces: TargetClientNonces<()>, + race_state: &mut RS, + ) { + let nonce = nonces.latest_nonce; + + // if **some** of nonces that we have selected to submit already present at the + // target chain => select new nonces + let need_to_select_new_nonces = race_state + .nonces_to_submit() + .map(|nonces| nonce >= *nonces.start()) + .unwrap_or(false); + if need_to_select_new_nonces { + log::trace!( + target: "bridge", + "Latest nonce at target is {}. Clearing nonces to submit: {:?}", + nonce, + race_state.nonces_to_submit(), + ); + + race_state.reset_nonces_to_submit(); + } + + // if **some** of nonces that we have submitted already present at the + // target chain => select new nonces + let need_new_nonces_to_submit = race_state + .nonces_submitted() + .map(|nonces| nonce >= *nonces.start()) + .unwrap_or(false); + if need_new_nonces_to_submit { + log::trace!( + target: "bridge", + "Latest nonce at target is {}. Clearing submitted nonces: {:?}", + nonce, + race_state.nonces_submitted(), + ); + + race_state.reset_nonces_submitted(); + } + + self.best_target_nonce = Some(nonce); + } + + fn finalized_target_nonces_updated< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &mut self, + nonces: TargetClientNonces<()>, + _race_state: &mut RS, + ) { + self.remove_le_nonces_from_source_queue(nonces.latest_nonce); + self.best_target_nonce = Some(std::cmp::max( + self.best_target_nonce.unwrap_or(nonces.latest_nonce), + nonces.latest_nonce, + )); + } + + async fn select_nonces_to_deliver< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, Self::ProofParameters)> { + let available_indices = self.available_source_queue_indices(race_state)?; + let range_begin = std::cmp::max( + self.best_target_nonce? + 1, + self.source_queue[*available_indices.start()].1.begin(), + ); + let range_end = self.source_queue[*available_indices.end()].1.end(); + Some((range_begin..=range_end, ())) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::tests::{ + header_id, TestMessageLane, TestMessagesProof, TestSourceHeaderHash, + TestSourceHeaderNumber, + }, + message_race_loop::RaceStateImpl, + }; + + type SourceNoncesRange = RangeInclusive; + + type TestRaceStateImpl = RaceStateImpl< + SourceHeaderIdOf, + TargetHeaderIdOf, + TestMessagesProof, + (), + >; + + type BasicStrategy

= super::BasicStrategy< +

::SourceHeaderNumber, +

::SourceHeaderHash, +

::TargetHeaderNumber, +

::TargetHeaderHash, + SourceNoncesRange, +

::MessagesProof, + >; + + fn source_nonces(new_nonces: SourceNoncesRange) -> SourceClientNonces { + SourceClientNonces { new_nonces, confirmed_nonce: None } + } + + fn target_nonces(latest_nonce: MessageNonce) -> TargetClientNonces<()> { + TargetClientNonces { latest_nonce, nonces_data: () } + } + + #[test] + fn strategy_is_empty_works() { + let mut strategy = BasicStrategy::::new(); + assert!(strategy.is_empty()); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=1)); + assert!(!strategy.is_empty()); + } + + #[test] + fn best_at_source_is_never_lower_than_target_nonce() { + let mut strategy = BasicStrategy::::new(); + assert_eq!(strategy.best_at_source(), None); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + assert_eq!(strategy.best_at_source(), None); + strategy.best_target_nonces_updated(target_nonces(10), &mut TestRaceStateImpl::default()); + assert_eq!(strategy.source_queue, vec![(header_id(1), 1..=5)]); + assert_eq!(strategy.best_at_source(), Some(10)); + } + + #[test] + fn source_nonce_is_never_lower_than_known_target_nonce() { + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(10), &mut TestRaceStateImpl::default()); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + assert_eq!(strategy.source_queue, vec![]); + } + + #[test] + fn source_nonce_is_never_lower_than_latest_known_source_nonce() { + let mut strategy = BasicStrategy::::new(); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + strategy.source_nonces_updated(header_id(2), source_nonces(1..=3)); + strategy.source_nonces_updated(header_id(2), source_nonces(1..=5)); + assert_eq!(strategy.source_queue, vec![(header_id(1), 1..=5)]); + } + + #[test] + fn updated_target_nonce_removes_queued_entries() { + let mut strategy = BasicStrategy::::new(); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + strategy.source_nonces_updated(header_id(2), source_nonces(6..=10)); + strategy.source_nonces_updated(header_id(3), source_nonces(11..=15)); + strategy.source_nonces_updated(header_id(4), source_nonces(16..=20)); + strategy + .finalized_target_nonces_updated(target_nonces(15), &mut TestRaceStateImpl::default()); + assert_eq!(strategy.source_queue, vec![(header_id(4), 16..=20)]); + strategy + .finalized_target_nonces_updated(target_nonces(17), &mut TestRaceStateImpl::default()); + assert_eq!(strategy.source_queue, vec![(header_id(4), 18..=20)]); + } + + #[test] + fn selected_nonces_are_dropped_on_target_nonce_update() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_to_submit = Some((header_id(1), 5..=10, (5..=10, None))); + // we are going to submit 5..=10, so having latest nonce 4 at target is fine + strategy.best_target_nonces_updated(target_nonces(4), &mut state); + assert!(state.nonces_to_submit.is_some()); + // any nonce larger than 4 invalidates the `nonces_to_submit` + for nonce in 5..=11 { + state.nonces_to_submit = Some((header_id(1), 5..=10, (5..=10, None))); + strategy.best_target_nonces_updated(target_nonces(nonce), &mut state); + assert!(state.nonces_to_submit.is_none()); + } + } + + #[test] + fn submitted_nonces_are_dropped_on_target_nonce_update() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_submitted = Some(5..=10); + // we have submitted 5..=10, so having latest nonce 4 at target is fine + strategy.best_target_nonces_updated(target_nonces(4), &mut state); + assert!(state.nonces_submitted.is_some()); + // any nonce larger than 4 invalidates the `nonces_submitted` + for nonce in 5..=11 { + state.nonces_submitted = Some(5..=10); + strategy.best_target_nonces_updated(target_nonces(nonce), &mut state); + assert!(state.nonces_submitted.is_none()); + } + } + + #[async_std::test] + async fn nothing_is_selected_if_something_is_already_selected() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_to_submit = Some((header_id(1), 1..=10, (1..=10, None))); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=10)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + } + + #[async_std::test] + async fn nothing_is_selected_if_something_is_already_submitted() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_submitted = Some(1..=10); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=10)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + } + + #[async_std::test] + async fn select_nonces_to_deliver_works() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=1)); + strategy.source_nonces_updated(header_id(2), source_nonces(2..=2)); + strategy.source_nonces_updated(header_id(3), source_nonces(3..=6)); + strategy.source_nonces_updated(header_id(5), source_nonces(7..=8)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(4)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((1..=6, ()))); + strategy.best_target_nonces_updated(target_nonces(6), &mut state); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(5)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((7..=8, ()))); + strategy.best_target_nonces_updated(target_nonces(8), &mut state); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + } + + #[test] + fn available_source_queue_indices_works() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=3)); + strategy.source_nonces_updated(header_id(2), source_nonces(4..=6)); + strategy.source_nonces_updated(header_id(3), source_nonces(7..=9)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(0)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), None); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(1)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), Some(0..=0)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), Some(0..=1)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(3)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), Some(0..=2)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(4)); + assert_eq!(strategy.available_source_queue_indices(state), Some(0..=2)); + } + + #[test] + fn remove_le_nonces_from_source_queue_works() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=3)); + strategy.source_nonces_updated(header_id(2), source_nonces(4..=6)); + strategy.source_nonces_updated(header_id(3), source_nonces(7..=9)); + + fn source_queue_nonces( + source_queue: &SourceRangesQueue< + TestSourceHeaderHash, + TestSourceHeaderNumber, + SourceNoncesRange, + >, + ) -> Vec { + source_queue.iter().flat_map(|(_, range)| range.clone()).collect() + } + + strategy.remove_le_nonces_from_source_queue(1); + assert_eq!(source_queue_nonces(&strategy.source_queue), vec![2, 3, 4, 5, 6, 7, 8, 9],); + + strategy.remove_le_nonces_from_source_queue(5); + assert_eq!(source_queue_nonces(&strategy.source_queue), vec![6, 7, 8, 9],); + + strategy.remove_le_nonces_from_source_queue(9); + assert_eq!(source_queue_nonces(&strategy.source_queue), Vec::::new(),); + + strategy.remove_le_nonces_from_source_queue(100); + assert_eq!(source_queue_nonces(&strategy.source_queue), Vec::::new(),); + } + + #[async_std::test] + async fn previous_nonces_are_selected_if_reorg_happens_at_target_chain() { + let source_header_1 = header_id(1); + let target_header_1 = header_id(1); + + // we start in perfec sync state - all headers are synced and finalized on both ends + let mut state = TestRaceStateImpl { + best_finalized_source_header_id_at_source: Some(source_header_1), + best_finalized_source_header_id_at_best_target: Some(source_header_1), + best_target_header_id: Some(target_header_1), + best_finalized_target_header_id: Some(target_header_1), + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + }; + + // in this state we have 1 available nonce for delivery + let mut strategy = BasicStrategy:: { + source_queue: vec![(header_id(1), 1..=1)].into_iter().collect(), + best_target_nonce: Some(0), + _phantom: PhantomData, + }; + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((1..=1, ())),); + + // let's say we have submitted 1..=1 + state.nonces_submitted = Some(1..=1); + + // then new nonce 2 appear at the source block 2 + let source_header_2 = header_id(2); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + strategy.source_nonces_updated( + source_header_2, + SourceClientNonces { new_nonces: 2..=2, confirmed_nonce: None }, + ); + // and nonce 1 appear at the best block of the target node (best finalized still has 0 + // nonces) + let target_header_2 = header_id(2); + state.best_target_header_id = Some(target_header_2); + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 1, nonces_data: () }, + &mut state, + ); + + // then best target header is retracted + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 0, nonces_data: () }, + &mut state, + ); + + // ... and some fork with zero delivered nonces is finalized + let target_header_2_fork = header_id(2_1); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + state.best_finalized_source_header_id_at_best_target = Some(source_header_2); + state.best_target_header_id = Some(target_header_2_fork); + state.best_finalized_target_header_id = Some(target_header_2_fork); + strategy.finalized_target_nonces_updated( + TargetClientNonces { latest_nonce: 0, nonces_data: () }, + &mut state, + ); + + // now we have to select nonce 1 for delivery again + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((1..=2, ())),); + } +} diff --git a/relays/messages/src/metrics.rs b/relays/messages/src/metrics.rs new file mode 100644 index 000000000000..69d80d178de8 --- /dev/null +++ b/relays/messages/src/metrics.rs @@ -0,0 +1,148 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Metrics for message lane relay loop. + +use crate::{ + message_lane::MessageLane, + message_lane_loop::{SourceClientState, TargetClientState}, +}; + +use bp_messages::MessageNonce; +use finality_relay::SyncLoopMetrics; +use relay_utils::metrics::{ + metric_name, register, GaugeVec, Metric, Opts, PrometheusError, Registry, U64, +}; + +/// Message lane relay metrics. +/// +/// Cloning only clones references. +#[derive(Clone)] +pub struct MessageLaneLoopMetrics { + /// Best finalized block numbers - "source", "source_at_target", "target_at_source". + source_to_target_finality_metrics: SyncLoopMetrics, + /// Best finalized block numbers - "source", "target", "source_at_target", "target_at_source". + target_to_source_finality_metrics: SyncLoopMetrics, + /// Lane state nonces: "source_latest_generated", "source_latest_confirmed", + /// "target_latest_received", "target_latest_confirmed". + lane_state_nonces: GaugeVec, +} + +impl MessageLaneLoopMetrics { + /// Create and register messages loop metrics. + pub fn new(prefix: Option<&str>) -> Result { + Ok(MessageLaneLoopMetrics { + source_to_target_finality_metrics: SyncLoopMetrics::new( + prefix, + "source", + "source_at_target", + )?, + target_to_source_finality_metrics: SyncLoopMetrics::new( + prefix, + "target", + "target_at_source", + )?, + lane_state_nonces: GaugeVec::new( + Opts::new(metric_name(prefix, "lane_state_nonces"), "Nonces of the lane state"), + &["type"], + )?, + }) + } + + /// Update source client state metrics. + pub fn update_source_state(&self, source_client_state: SourceClientState

) { + self.source_to_target_finality_metrics + .update_best_block_at_source(source_client_state.best_self.0); + if let Some(best_finalized_peer_at_best_self) = + source_client_state.best_finalized_peer_at_best_self + { + self.target_to_source_finality_metrics + .update_best_block_at_target(best_finalized_peer_at_best_self.0); + if let Some(actual_best_finalized_peer_at_best_self) = + source_client_state.actual_best_finalized_peer_at_best_self + { + self.target_to_source_finality_metrics.update_using_same_fork( + best_finalized_peer_at_best_self.1 == actual_best_finalized_peer_at_best_self.1, + ); + } + } + } + + /// Update target client state metrics. + pub fn update_target_state(&self, target_client_state: TargetClientState

) { + self.target_to_source_finality_metrics + .update_best_block_at_source(target_client_state.best_self.0); + if let Some(best_finalized_peer_at_best_self) = + target_client_state.best_finalized_peer_at_best_self + { + self.source_to_target_finality_metrics + .update_best_block_at_target(best_finalized_peer_at_best_self.0); + if let Some(actual_best_finalized_peer_at_best_self) = + target_client_state.actual_best_finalized_peer_at_best_self + { + self.source_to_target_finality_metrics.update_using_same_fork( + best_finalized_peer_at_best_self.1 == actual_best_finalized_peer_at_best_self.1, + ); + } + } + } + + /// Update latest generated nonce at source. + pub fn update_source_latest_generated_nonce( + &self, + source_latest_generated_nonce: MessageNonce, + ) { + self.lane_state_nonces + .with_label_values(&["source_latest_generated"]) + .set(source_latest_generated_nonce); + } + + /// Update the latest confirmed nonce at source. + pub fn update_source_latest_confirmed_nonce( + &self, + source_latest_confirmed_nonce: MessageNonce, + ) { + self.lane_state_nonces + .with_label_values(&["source_latest_confirmed"]) + .set(source_latest_confirmed_nonce); + } + + /// Update the latest received nonce at target. + pub fn update_target_latest_received_nonce(&self, target_latest_generated_nonce: MessageNonce) { + self.lane_state_nonces + .with_label_values(&["target_latest_received"]) + .set(target_latest_generated_nonce); + } + + /// Update the latest confirmed nonce at target. + pub fn update_target_latest_confirmed_nonce( + &self, + target_latest_confirmed_nonce: MessageNonce, + ) { + self.lane_state_nonces + .with_label_values(&["target_latest_confirmed"]) + .set(target_latest_confirmed_nonce); + } +} + +impl Metric for MessageLaneLoopMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + self.source_to_target_finality_metrics.register(registry)?; + self.target_to_source_finality_metrics.register(registry)?; + register(self.lane_state_nonces.clone(), registry)?; + Ok(()) + } +} diff --git a/relays/parachains/Cargo.toml b/relays/parachains/Cargo.toml new file mode 100644 index 000000000000..89aab19b4b55 --- /dev/null +++ b/relays/parachains/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "parachains-relay" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2018" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +async-std = "1.6.5" +async-trait = "0.1.74" +futures = "0.3.29" +log = "0.4.20" +relay-utils = { path = "../utils" } + +# Bridge dependencies + +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +relay-substrate-client = { path = "../client-substrate" } + +[dev-dependencies] +codec = { package = "parity-scale-codec", version = "3.1.5" } +relay-substrate-client = { path = "../client-substrate", features = ["test-helpers"] } +sp-core = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/parachains/README.md b/relays/parachains/README.md new file mode 100644 index 000000000000..bacd28594d80 --- /dev/null +++ b/relays/parachains/README.md @@ -0,0 +1,49 @@ +# Parachains Finality Relay + +The parachains finality relay works with two chains - source relay chain and target chain (which may be standalone +chain, relay chain or a parachain). The source chain must have the +[`paras` pallet](https://github.com/paritytech/polkadot/tree/master/runtime/parachains/src/paras) deployed at its +runtime. The target chain must have the [bridge parachains pallet](../../modules/parachains/) deployed at its runtime. + +The relay is configured to submit heads of one or several parachains. It pokes source chain periodically and compares +parachain heads that are known to the source relay chain to heads at the target chain. If there are new heads, +the relay submits them to the target chain. + +More: [Parachains Finality Relay Sequence Diagram](../../docs/parachains-finality-relay.html). + +## How to Use the Parachains Finality Relay + +There are only two traits that need to be implemented. The [`SourceChain`](./src/parachains_loop.rs) implementation +is supposed to connect to the source chain node. It must be able to read parachain heads from the `Heads` map of +the [`paras` pallet](https://github.com/paritytech/polkadot/tree/master/runtime/parachains/src/paras). +It also must create storage proofs of `Heads` map entries, when required. + +The [`TargetChain`](./src/parachains_loop.rs) implementation connects to the target chain node. It must be able +to return the best known head of given parachain. When required, it must be able to craft and submit parachains +finality delivery transaction to the target node. + +The main entrypoint for the crate is the [`run` function](./src/parachains_loop.rs), which takes source and target +clients and [`ParachainSyncParams`](./src/parachains_loop.rs) parameters. The most imporant parameter is the +`parachains` - it is the set of parachains, which relay tracks and updates. The other important parameter that +may affect the relay operational costs is the `strategy`. If it is set to `Any`, then the finality delivery +transaction is submitted if at least one of tracked parachain heads is updated. The other option is `All`. Then +the relay waits until all tracked parachain heads are updated and submits them all in a single finality delivery +transaction. + +## Parachain Finality Relay Metrics + +Every parachain in Polkadot is identified by the 32-bit number. All metrics, exposed by the parachains finality +relay have the `parachain` label, which is set to the parachain id. And the metrics are prefixed with the prefix, +that depends on the name of the source relay and target chains. The list below shows metrics names for +Rococo (source relay chain) to BridgeHubWestend (target chain) parachains finality relay. For other chains, simply +change chain names. So the metrics are: + +- `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_source` - returns best known parachain block + number, registered in the `paras` pallet at the source relay chain (Rococo in our example); + +- `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_target` - returns best known parachain block + number, registered in the bridge parachains pallet at the target chain (BridgeHubWestend in our example). + +If relay operates properly, you should see that the `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_target` +tries to reach the `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_source`. And the latter one +always increases. diff --git a/relays/parachains/src/lib.rs b/relays/parachains/src/lib.rs new file mode 100644 index 000000000000..81ea983a6f76 --- /dev/null +++ b/relays/parachains/src/lib.rs @@ -0,0 +1,32 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use std::fmt::Debug; + +use relay_substrate_client::{Chain, Parachain}; + +pub mod parachains_loop; +pub mod parachains_loop_metrics; + +/// Finality proofs synchronization pipeline. +pub trait ParachainsPipeline: 'static + Clone + Debug + Send + Sync { + /// Relay chain which is storing parachain heads in its `paras` module. + type SourceRelayChain: Chain; + /// Parachain which headers we are syncing here. + type SourceParachain: Parachain; + /// Target chain (either relay or para) which wants to know about new parachain heads. + type TargetChain: Chain; +} diff --git a/relays/parachains/src/parachains_loop.rs b/relays/parachains/src/parachains_loop.rs new file mode 100644 index 000000000000..9b9038fd9761 --- /dev/null +++ b/relays/parachains/src/parachains_loop.rs @@ -0,0 +1,953 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{parachains_loop_metrics::ParachainsLoopMetrics, ParachainsPipeline}; + +use async_trait::async_trait; +use bp_polkadot_core::{ + parachains::{ParaHash, ParaHeadsProof, ParaId}, + BlockNumber as RelayBlockNumber, +}; +use futures::{ + future::{FutureExt, Shared}, + poll, select_biased, +}; +use relay_substrate_client::{Chain, HeaderIdOf, ParachainBase}; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, FailedClient, + TrackedTransactionStatus, TransactionTracker, +}; +use std::{future::Future, pin::Pin, task::Poll}; + +/// Parachain header availability at a certain chain. +#[derive(Clone, Copy, Debug)] +pub enum AvailableHeader { + /// The client can not report actual parachain head at this moment. + /// + /// It is a "mild" error, which may appear when e.g. on-demand parachains relay is used. + /// This variant must be treated as "we don't want to update parachain head value at the + /// target chain at this moment". + Unavailable, + /// There's no parachain header at the relay chain. + /// + /// Normally it means that the parachain is not registered there. + Missing, + /// Parachain head with given hash is available at the source chain. + Available(T), +} + +impl AvailableHeader { + /// Return available header. + pub fn as_available(&self) -> Option<&T> { + match *self { + AvailableHeader::Available(ref header) => Some(header), + _ => None, + } + } +} + +impl From> for AvailableHeader { + fn from(maybe_header: Option) -> AvailableHeader { + match maybe_header { + Some(header) => AvailableHeader::Available(header), + None => AvailableHeader::Missing, + } + } +} + +/// Source client used in parachain heads synchronization loop. +#[async_trait] +pub trait SourceClient: RelayClient { + /// Returns `Ok(true)` if client is in synced state. + async fn ensure_synced(&self) -> Result; + + /// Get parachain head id at given block. + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error>; + + /// Get parachain head proof at given block. + async fn prove_parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result<(ParaHeadsProof, ParaHash), Self::Error>; +} + +/// Target client used in parachain heads synchronization loop. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker>; + + /// Get best block id. + async fn best_block(&self) -> Result, Self::Error>; + + /// Get best finalized source relay chain block id. + async fn best_finalized_source_relay_chain_block( + &self, + at_block: &HeaderIdOf, + ) -> Result, Self::Error>; + + /// Get parachain head id at given block. + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error>; + + /// Submit parachain heads proof. + async fn submit_parachain_head_proof( + &self, + at_source_block: HeaderIdOf, + para_head_hash: ParaHash, + proof: ParaHeadsProof, + ) -> Result; +} + +/// Return prefix that will be used by default to expose Prometheus metrics of the parachains +/// sync loop. +pub fn metrics_prefix() -> String { + format!( + "{}_to_{}_Parachains_{}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + P::SourceParachain::PARACHAIN_ID + ) +} + +/// Run parachain heads synchronization. +pub async fn run( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + metrics_params: MetricsParams, + exit_signal: impl Future + 'static + Send, +) -> Result<(), relay_utils::Error> +where + P::SourceRelayChain: Chain, +{ + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .with_metrics(metrics_params) + .loop_metric(ParachainsLoopMetrics::new(Some(&metrics_prefix::

()))?)? + .expose() + .await? + .run(metrics_prefix::

(), move |source_client, target_client, metrics| { + run_until_connection_lost(source_client, target_client, metrics, exit_signal.clone()) + }) + .await +} + +/// Run parachain heads synchronization. +async fn run_until_connection_lost( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + metrics: Option, + exit_signal: impl Future + Send, +) -> Result<(), FailedClient> +where + P::SourceRelayChain: Chain, +{ + let exit_signal = exit_signal.fuse(); + let min_block_interval = std::cmp::min( + P::SourceRelayChain::AVERAGE_BLOCK_INTERVAL, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + ); + + let mut submitted_heads_tracker: Option> = None; + + futures::pin_mut!(exit_signal); + + // Note that the internal loop breaks with `FailedClient` error even if error is non-connection. + // It is Ok for now, but it may need to be fixed in the future to use exponential backoff for + // regular errors. + + loop { + // Either wait for new block, or exit signal. + // Please note that we are prioritizing the exit signal since if both events happen at once + // it doesn't make sense to perform one more loop iteration. + select_biased! { + _ = exit_signal => return Ok(()), + _ = async_std::task::sleep(min_block_interval).fuse() => {}, + } + + // if source client is not yet synced, we'll need to sleep. Otherwise we risk submitting too + // much redundant transactions + match source_client.ensure_synced().await { + Ok(true) => (), + Ok(false) => { + log::warn!( + target: "bridge", + "{} client is syncing. Won't do anything until it is synced", + P::SourceRelayChain::NAME, + ); + continue + }, + Err(e) => { + log::warn!( + target: "bridge", + "{} client has failed to return its sync status: {:?}", + P::SourceRelayChain::NAME, + e, + ); + return Err(FailedClient::Source) + }, + } + + // if we have active transaction, we'll need to wait until it is mined or dropped + let best_target_block = target_client.best_block().await.map_err(|e| { + log::warn!(target: "bridge", "Failed to read best {} block: {:?}", P::SourceRelayChain::NAME, e); + FailedClient::Target + })?; + let head_at_target = + read_head_at_target(&target_client, metrics.as_ref(), &best_target_block).await?; + + // check if our transaction has been mined + if let Some(tracker) = submitted_heads_tracker.take() { + match tracker.update(&best_target_block, &head_at_target).await { + SubmittedHeadStatus::Waiting(tracker) => { + // no news about our transaction and we shall keep waiting + submitted_heads_tracker = Some(tracker); + continue + }, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(_)) => { + // all heads have been updated, we don't need this tracker anymore + }, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost) => { + log::warn!( + target: "bridge", + "Parachains synchronization from {} to {} has stalled. Going to restart", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + ); + + return Err(FailedClient::Both) + }, + } + } + + // we have no active transaction and may need to update heads, but do we have something for + // update? + let best_finalized_relay_block = target_client + .best_finalized_source_relay_chain_block(&best_target_block) + .await + .map_err(|e| { + log::warn!( + target: "bridge", + "Failed to read best finalized {} block from {}: {:?}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + e, + ); + FailedClient::Target + })?; + let head_at_source = + read_head_at_source(&source_client, metrics.as_ref(), &best_finalized_relay_block) + .await?; + let is_update_required = is_update_required::

(head_at_source, head_at_target); + + if is_update_required { + let (head_proof, head_hash) = source_client + .prove_parachain_head(best_finalized_relay_block) + .await + .map_err(|e| { + log::warn!( + target: "bridge", + "Failed to prove {} parachain ParaId({}) heads: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + e, + ); + FailedClient::Source + })?; + log::info!( + target: "bridge", + "Submitting {} parachain ParaId({}) head update transaction to {}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + ); + + let transaction_tracker = target_client + .submit_parachain_head_proof(best_finalized_relay_block, head_hash, head_proof) + .await + .map_err(|e| { + log::warn!( + target: "bridge", + "Failed to submit {} parachain ParaId({}) heads proof to {}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + e, + ); + FailedClient::Target + })?; + submitted_heads_tracker = + Some(SubmittedHeadsTracker::

::new(head_at_source, transaction_tracker)); + } + } +} + +/// Returns `true` if we need to submit parachain-head-update transaction. +fn is_update_required( + head_at_source: AvailableHeader>, + head_at_target: Option>, +) -> bool +where + P::SourceRelayChain: Chain, +{ + log::trace!( + target: "bridge", + "Checking if {} parachain ParaId({}) needs update at {}:\n\t\ + At {}: {:?}\n\t\ + At {}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + P::SourceRelayChain::NAME, + head_at_source, + P::TargetChain::NAME, + head_at_target, + ); + + let needs_update = match (head_at_source, head_at_target) { + (AvailableHeader::Unavailable, _) => { + // source client has politely asked us not to update current parachain head + // at the target chain + false + }, + (AvailableHeader::Available(head_at_source), Some(head_at_target)) + if head_at_source.number() > head_at_target.number() => + { + // source client knows head that is better than the head known to the target + // client + true + }, + (AvailableHeader::Available(_), Some(_)) => { + // this is normal case when relay has recently updated heads, when parachain is + // not progressing, or when our source client is still syncing + false + }, + (AvailableHeader::Available(_), None) => { + // parachain is not yet known to the target client. This is true when parachain + // or bridge has been just onboarded/started + true + }, + (AvailableHeader::Missing, Some(_)) => { + // parachain/parathread has been offboarded removed from the system. It needs to + // be propageted to the target client + true + }, + (AvailableHeader::Missing, None) => { + // all's good - parachain is unknown to both clients + false + }, + }; + + if needs_update { + log::trace!( + target: "bridge", + "{} parachain ParaId({}) needs update at {}: {:?} vs {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + head_at_source, + head_at_target, + ); + } + + needs_update +} + +/// Reads parachain head from the source client. +async fn read_head_at_source( + source_client: &impl SourceClient

, + metrics: Option<&ParachainsLoopMetrics>, + at_relay_block: &HeaderIdOf, +) -> Result>, FailedClient> { + let para_head = source_client.parachain_head(*at_relay_block).await; + match para_head { + Ok(AvailableHeader::Available(para_head)) => { + if let Some(metrics) = metrics { + metrics.update_best_parachain_block_at_source( + ParaId(P::SourceParachain::PARACHAIN_ID), + para_head.number(), + ); + } + Ok(AvailableHeader::Available(para_head)) + }, + Ok(r) => Ok(r), + Err(e) => { + log::warn!( + target: "bridge", + "Failed to read head of {} parachain ParaId({:?}): {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + e, + ); + Err(FailedClient::Source) + }, + } +} + +/// Reads parachain head from the target client. +async fn read_head_at_target( + target_client: &impl TargetClient

, + metrics: Option<&ParachainsLoopMetrics>, + at_block: &HeaderIdOf, +) -> Result>, FailedClient> { + let para_head_id = target_client.parachain_head(*at_block).await; + match para_head_id { + Ok(Some(para_head_id)) => { + if let Some(metrics) = metrics { + metrics.update_best_parachain_block_at_target( + ParaId(P::SourceParachain::PARACHAIN_ID), + para_head_id.number(), + ); + } + Ok(Some(para_head_id)) + }, + Ok(None) => Ok(None), + Err(e) => { + log::warn!( + target: "bridge", + "Failed to read head of {} parachain ParaId({}) at {}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + e, + ); + Err(FailedClient::Target) + }, + } +} + +/// Submitted heads status. +enum SubmittedHeadStatus { + /// Heads are not yet updated. + Waiting(SubmittedHeadsTracker

), + /// Heads transaction has either been finalized or lost (i.e. received its "final" status). + Final(TrackedTransactionStatus>), +} + +/// Type of the transaction tracker that the `SubmittedHeadsTracker` is using. +/// +/// It needs to be shared because of `poll` macro and our consuming `update` method. +type SharedTransactionTracker

= Shared< + Pin< + Box< + dyn Future< + Output = TrackedTransactionStatus< + HeaderIdOf<

::TargetChain>, + >, + > + Send, + >, + >, +>; + +/// Submitted parachain heads transaction. +struct SubmittedHeadsTracker { + /// Parachain header id that we have submitted. + submitted_head: AvailableHeader>, + /// Future that waits for submitted transaction finality or loss. + /// + /// It needs to be shared because of `poll` macro and our consuming `update` method. + transaction_tracker: SharedTransactionTracker

, +} + +impl SubmittedHeadsTracker

{ + /// Creates new parachain heads transaction tracker. + pub fn new( + submitted_head: AvailableHeader>, + transaction_tracker: impl TransactionTracker> + 'static, + ) -> Self { + SubmittedHeadsTracker { + submitted_head, + transaction_tracker: transaction_tracker.wait().fuse().boxed().shared(), + } + } + + /// Returns `None` if all submitted parachain heads have been updated. + pub async fn update( + self, + at_target_block: &HeaderIdOf, + head_at_target: &Option>, + ) -> SubmittedHeadStatus

{ + // check if our head has been updated + let is_head_updated = match (self.submitted_head, head_at_target) { + (AvailableHeader::Available(submitted_head), Some(head_at_target)) + if head_at_target.number() >= submitted_head.number() => + true, + (AvailableHeader::Missing, None) => true, + _ => false, + }; + if is_head_updated { + log::trace!( + target: "bridge", + "Head of parachain ParaId({}) has been updated at {}: {:?}", + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + head_at_target, + ); + + return SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(*at_target_block)) + } + + // if underlying transaction tracker has reported that the transaction is lost, we may + // then restart our sync + let transaction_tracker = self.transaction_tracker.clone(); + match poll!(transaction_tracker) { + Poll::Ready(TrackedTransactionStatus::Lost) => + return SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost), + Poll::Ready(TrackedTransactionStatus::Finalized(_)) => { + // so we are here and our transaction is mined+finalized, but some of heads were not + // updated => we're considering our loop as stalled + return SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost) + }, + _ => (), + } + + SubmittedHeadStatus::Waiting(self) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use async_std::sync::{Arc, Mutex}; + use codec::Encode; + use futures::{SinkExt, StreamExt}; + use relay_substrate_client::test_chain::{TestChain, TestParachain}; + use relay_utils::{HeaderId, MaybeConnectionError}; + use sp_core::H256; + + const PARA_10_HASH: ParaHash = H256([10u8; 32]); + const PARA_20_HASH: ParaHash = H256([20u8; 32]); + + #[derive(Clone, Debug)] + enum TestError { + Error, + } + + impl MaybeConnectionError for TestError { + fn is_connection_error(&self) -> bool { + false + } + } + + #[derive(Clone, Debug, PartialEq, Eq)] + struct TestParachainsPipeline; + + impl ParachainsPipeline for TestParachainsPipeline { + type SourceRelayChain = TestChain; + type SourceParachain = TestParachain; + type TargetChain = TestChain; + } + + #[derive(Clone, Debug)] + struct TestClient { + data: Arc>, + } + + #[derive(Clone, Debug)] + struct TestTransactionTracker(Option>>); + + #[async_trait] + impl TransactionTracker for TestTransactionTracker { + type HeaderId = HeaderIdOf; + + async fn wait(self) -> TrackedTransactionStatus> { + match self.0 { + Some(status) => status, + None => futures::future::pending().await, + } + } + } + + #[derive(Clone, Debug)] + struct TestClientData { + source_sync_status: Result, + source_head: Result>, TestError>, + source_proof: Result<(), TestError>, + + target_best_block: Result, TestError>, + target_best_finalized_source_block: Result, TestError>, + target_head: Result>, TestError>, + target_submit_result: Result<(), TestError>, + + exit_signal_sender: Option>>, + } + + impl TestClientData { + pub fn minimal() -> Self { + TestClientData { + source_sync_status: Ok(true), + source_head: Ok(AvailableHeader::Available(HeaderId(0, PARA_20_HASH))), + source_proof: Ok(()), + + target_best_block: Ok(HeaderId(0, Default::default())), + target_best_finalized_source_block: Ok(HeaderId(0, Default::default())), + target_head: Ok(None), + target_submit_result: Ok(()), + + exit_signal_sender: None, + } + } + + pub fn with_exit_signal_sender( + sender: futures::channel::mpsc::UnboundedSender<()>, + ) -> Self { + let mut client = Self::minimal(); + client.exit_signal_sender = Some(Box::new(sender)); + client + } + } + + impl From for TestClient { + fn from(data: TestClientData) -> TestClient { + TestClient { data: Arc::new(Mutex::new(data)) } + } + } + + #[async_trait] + impl RelayClient for TestClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + unimplemented!() + } + } + + #[async_trait] + impl SourceClient for TestClient { + async fn ensure_synced(&self) -> Result { + self.data.lock().await.source_sync_status.clone() + } + + async fn parachain_head( + &self, + _at_block: HeaderIdOf, + ) -> Result>, TestError> { + self.data.lock().await.source_head.clone() + } + + async fn prove_parachain_head( + &self, + _at_block: HeaderIdOf, + ) -> Result<(ParaHeadsProof, ParaHash), TestError> { + let head = *self.data.lock().await.source_head.clone()?.as_available().unwrap(); + let proof = (ParaHeadsProof(vec![head.hash().encode()]), head.hash()); + self.data.lock().await.source_proof.clone().map(|_| proof) + } + } + + #[async_trait] + impl TargetClient for TestClient { + type TransactionTracker = TestTransactionTracker; + + async fn best_block(&self) -> Result, TestError> { + self.data.lock().await.target_best_block.clone() + } + + async fn best_finalized_source_relay_chain_block( + &self, + _at_block: &HeaderIdOf, + ) -> Result, TestError> { + self.data.lock().await.target_best_finalized_source_block.clone() + } + + async fn parachain_head( + &self, + _at_block: HeaderIdOf, + ) -> Result>, TestError> { + self.data.lock().await.target_head.clone() + } + + async fn submit_parachain_head_proof( + &self, + _at_source_block: HeaderIdOf, + _updated_parachain_head: ParaHash, + _proof: ParaHeadsProof, + ) -> Result { + let mut data = self.data.lock().await; + data.target_submit_result.clone()?; + + if let Some(mut exit_signal_sender) = data.exit_signal_sender.take() { + exit_signal_sender.send(()).await.unwrap(); + } + Ok(TestTransactionTracker(Some( + TrackedTransactionStatus::Finalized(Default::default()), + ))) + } + } + + #[test] + fn when_source_client_fails_to_return_sync_state() { + let mut test_source_client = TestClientData::minimal(); + test_source_client.source_sync_status = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(test_source_client), + TestClient::from(TestClientData::minimal()), + None, + futures::future::pending(), + )), + Err(FailedClient::Source), + ); + } + + #[test] + fn when_target_client_fails_to_return_best_block() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_best_block = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn when_target_client_fails_to_read_heads() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_head = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn when_target_client_fails_to_read_best_finalized_source_block() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_best_finalized_source_block = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn when_source_client_fails_to_read_heads() { + let mut test_source_client = TestClientData::minimal(); + test_source_client.source_head = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(test_source_client), + TestClient::from(TestClientData::minimal()), + None, + futures::future::pending(), + )), + Err(FailedClient::Source), + ); + } + + #[test] + fn when_source_client_fails_to_prove_heads() { + let mut test_source_client = TestClientData::minimal(); + test_source_client.source_proof = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(test_source_client), + TestClient::from(TestClientData::minimal()), + None, + futures::future::pending(), + )), + Err(FailedClient::Source), + ); + } + + #[test] + fn when_target_client_rejects_update_transaction() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_submit_result = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn minimal_working_case() { + let (exit_signal_sender, exit_signal) = futures::channel::mpsc::unbounded(); + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(TestClientData::with_exit_signal_sender(exit_signal_sender)), + None, + exit_signal.into_future().map(|(_, _)| ()), + )), + Ok(()), + ); + } + + fn test_tx_tracker() -> SubmittedHeadsTracker { + SubmittedHeadsTracker::new( + AvailableHeader::Available(HeaderId(20, PARA_20_HASH)), + TestTransactionTracker(None), + ) + } + + impl From> for Option<()> { + fn from(status: SubmittedHeadStatus) -> Option<()> { + match status { + SubmittedHeadStatus::Waiting(_) => Some(()), + _ => None, + } + } + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_none_value() { + assert_eq!( + Some(()), + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await + .into(), + ); + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_old_value() { + assert_eq!( + Some(()), + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await + .into(), + ); + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_same_value() { + assert!(matches!( + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(20, PARA_20_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(_)), + )); + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_better_value() { + assert!(matches!( + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(30, PARA_20_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(_)), + )); + } + + #[async_std::test] + async fn tx_tracker_update_when_tx_is_lost() { + let mut tx_tracker = test_tx_tracker(); + tx_tracker.transaction_tracker = + futures::future::ready(TrackedTransactionStatus::Lost).boxed().shared(); + assert!(matches!( + tx_tracker + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost), + )); + } + + #[async_std::test] + async fn tx_tracker_update_when_tx_is_finalized_but_heads_are_not_updated() { + let mut tx_tracker = test_tx_tracker(); + tx_tracker.transaction_tracker = + futures::future::ready(TrackedTransactionStatus::Finalized(Default::default())) + .boxed() + .shared(); + assert!(matches!( + tx_tracker + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost), + )); + } + + #[test] + fn parachain_is_not_updated_if_it_is_unavailable() { + assert!(!is_update_required::(AvailableHeader::Unavailable, None)); + assert!(!is_update_required::( + AvailableHeader::Unavailable, + Some(HeaderId(10, PARA_10_HASH)) + )); + } + + #[test] + fn parachain_is_not_updated_if_it_is_unknown_to_both_clients() { + assert!(!is_update_required::(AvailableHeader::Missing, None),); + } + + #[test] + fn parachain_is_not_updated_if_target_has_better_head() { + assert!(!is_update_required::( + AvailableHeader::Available(HeaderId(10, Default::default())), + Some(HeaderId(20, Default::default())), + ),); + } + + #[test] + fn parachain_is_updated_after_offboarding() { + assert!(is_update_required::( + AvailableHeader::Missing, + Some(HeaderId(20, Default::default())), + ),); + } + + #[test] + fn parachain_is_updated_after_onboarding() { + assert!(is_update_required::( + AvailableHeader::Available(HeaderId(30, Default::default())), + None, + ),); + } + + #[test] + fn parachain_is_updated_if_newer_head_is_known() { + assert!(is_update_required::( + AvailableHeader::Available(HeaderId(40, Default::default())), + Some(HeaderId(30, Default::default())), + ),); + } +} diff --git a/relays/parachains/src/parachains_loop_metrics.rs b/relays/parachains/src/parachains_loop_metrics.rs new file mode 100644 index 000000000000..8138a43b3b3d --- /dev/null +++ b/relays/parachains/src/parachains_loop_metrics.rs @@ -0,0 +1,86 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use bp_polkadot_core::parachains::ParaId; +use relay_utils::{ + metrics::{metric_name, register, Gauge, Metric, PrometheusError, Registry, U64}, + UniqueSaturatedInto, +}; + +/// Parachains sync metrics. +#[derive(Clone)] +pub struct ParachainsLoopMetrics { + /// Best parachains header numbers at the source. + best_source_block_numbers: Gauge, + /// Best parachains header numbers at the target. + best_target_block_numbers: Gauge, +} + +impl ParachainsLoopMetrics { + /// Create and register parachains loop metrics. + pub fn new(prefix: Option<&str>) -> Result { + Ok(ParachainsLoopMetrics { + best_source_block_numbers: Gauge::new( + metric_name(prefix, "best_parachain_block_number_at_source"), + "Best parachain block numbers at the source relay chain".to_string(), + )?, + best_target_block_numbers: Gauge::new( + metric_name(prefix, "best_parachain_block_number_at_target"), + "Best parachain block numbers at the target chain".to_string(), + )?, + }) + } + + /// Update best block number at source. + pub fn update_best_parachain_block_at_source>( + &self, + parachain: ParaId, + block_number: Number, + ) { + let block_number = block_number.unique_saturated_into(); + log::trace!( + target: "bridge-metrics", + "Updated value of metric 'best_parachain_block_number_at_source[{:?}]': {:?}", + parachain, + block_number, + ); + self.best_source_block_numbers.set(block_number); + } + + /// Update best block number at target. + pub fn update_best_parachain_block_at_target>( + &self, + parachain: ParaId, + block_number: Number, + ) { + let block_number = block_number.unique_saturated_into(); + log::trace!( + target: "bridge-metrics", + "Updated value of metric 'best_parachain_block_number_at_target[{:?}]': {:?}", + parachain, + block_number, + ); + self.best_target_block_numbers.set(block_number); + } +} + +impl Metric for ParachainsLoopMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.best_source_block_numbers.clone(), registry)?; + register(self.best_target_block_numbers.clone(), registry)?; + Ok(()) + } +} diff --git a/relays/utils/Cargo.toml b/relays/utils/Cargo.toml new file mode 100644 index 000000000000..049368f72bbc --- /dev/null +++ b/relays/utils/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "relay-utils" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +ansi_term = "0.12" +anyhow = "1.0" +async-std = "1.6.5" +async-trait = "0.1" +backoff = "0.4" +isahc = "1.2" +env_logger = "0.10.1" +futures = "0.3.29" +jsonpath_lib = "0.3" +log = "0.4.20" +num-traits = "0.2" +serde_json = "1.0" +sysinfo = "0.29" +time = { version = "0.3", features = ["formatting", "local-offset", "std"] } +tokio = { version = "1.35", features = ["rt"] } +thiserror = "1.0.51" + +# Bridge dependencies + +bp-runtime = { path = "../../primitives/runtime" } + +# Substrate dependencies + +sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } +substrate-prometheus-endpoint = { git = "https://github.com/paritytech/polkadot-sdk", branch = "master" } diff --git a/relays/utils/src/error.rs b/relays/utils/src/error.rs new file mode 100644 index 000000000000..26f1d0cacefd --- /dev/null +++ b/relays/utils/src/error.rs @@ -0,0 +1,46 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use std::net::AddrParseError; +use thiserror::Error; + +/// Result type used by relay utilities. +pub type Result = std::result::Result; + +/// Relay utilities errors. +#[derive(Error, Debug)] +pub enum Error { + /// Failed to request a float value from HTTP service. + #[error("Failed to fetch token price from remote server: {0}")] + FetchTokenPrice(#[source] anyhow::Error), + /// Failed to parse the response from HTTP service. + #[error("Failed to parse HTTP service response: {0:?}. Response: {1:?}")] + ParseHttp(serde_json::Error, String), + /// Failed to select response value from the Json response. + #[error("Failed to select value from response: {0:?}. Response: {1:?}")] + SelectResponseValue(jsonpath_lib::JsonPathError, String), + /// Failed to parse float value from the selected value. + #[error( + "Failed to parse float value {0:?} from response. It is assumed to be positive and normal" + )] + ParseFloat(f64), + /// Couldn't found value in the JSON response. + #[error("Missing required value from response: {0:?}")] + MissingResponseValue(String), + /// Invalid host address was used for exposing Prometheus metrics. + #[error("Invalid host {0} is used to expose Prometheus metrics: {1}")] + ExposingMetricsInvalidHost(String, AddrParseError), + /// Prometheus error. + #[error("{0}")] + Prometheus(#[from] substrate_prometheus_endpoint::prometheus::Error), +} diff --git a/relays/utils/src/initialize.rs b/relays/utils/src/initialize.rs new file mode 100644 index 000000000000..8224c1803ad2 --- /dev/null +++ b/relays/utils/src/initialize.rs @@ -0,0 +1,136 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Relayer initialization functions. + +use std::{cell::RefCell, fmt::Display, io::Write}; + +async_std::task_local! { + pub(crate) static LOOP_NAME: RefCell = RefCell::new(String::default()); +} + +/// Initialize relay environment. +pub fn initialize_relay() { + initialize_logger(true); +} + +/// Initialize Relay logger instance. +pub fn initialize_logger(with_timestamp: bool) { + let format = time::format_description::parse( + "[year]-[month]-[day] \ + [hour repr:24]:[minute]:[second] [offset_hour sign:mandatory]", + ) + .expect("static format string is valid"); + + let mut builder = env_logger::Builder::new(); + builder.filter_level(log::LevelFilter::Warn); + builder.filter_module("bridge", log::LevelFilter::Info); + builder.parse_default_env(); + if with_timestamp { + builder.format(move |buf, record| { + let timestamp = time::OffsetDateTime::now_local() + .unwrap_or_else(|_| time::OffsetDateTime::now_utc()); + let timestamp = timestamp.format(&format).unwrap_or_else(|_| timestamp.to_string()); + + let log_level = color_level(record.level()); + let log_target = color_target(record.target()); + let timestamp = if cfg!(windows) { + Either::Left(timestamp) + } else { + Either::Right(ansi_term::Colour::Fixed(8).bold().paint(timestamp)) + }; + + writeln!( + buf, + "{}{} {} {} {}", + loop_name_prefix(), + timestamp, + log_level, + log_target, + record.args(), + ) + }); + } else { + builder.format(move |buf, record| { + let log_level = color_level(record.level()); + let log_target = color_target(record.target()); + + writeln!(buf, "{}{log_level} {log_target} {}", loop_name_prefix(), record.args(),) + }); + } + + builder.init(); +} + +/// Initialize relay loop. Must only be called once per every loop task. +pub(crate) fn initialize_loop(loop_name: String) { + LOOP_NAME.with(|g_loop_name| *g_loop_name.borrow_mut() = loop_name); +} + +/// Returns loop name prefix to use in logs. The prefix is initialized with the `initialize_loop` +/// call. +fn loop_name_prefix() -> String { + // try_with to avoid panic outside of async-std task context + LOOP_NAME + .try_with(|loop_name| { + // using borrow is ok here, because loop is only initialized once (=> borrow_mut will + // only be called once) + let loop_name = loop_name.borrow(); + if loop_name.is_empty() { + String::new() + } else { + format!("[{loop_name}] ") + } + }) + .unwrap_or_else(|_| String::new()) +} + +enum Either { + Left(A), + Right(B), +} +impl Display for Either { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Self::Left(a) => write!(fmt, "{a}"), + Self::Right(b) => write!(fmt, "{b}"), + } + } +} + +fn color_target(target: &str) -> impl Display + '_ { + if cfg!(windows) { + Either::Left(target) + } else { + Either::Right(ansi_term::Colour::Fixed(8).paint(target)) + } +} + +fn color_level(level: log::Level) -> impl Display { + if cfg!(windows) { + Either::Left(level) + } else { + let s = level.to_string(); + use ansi_term::Colour as Color; + Either::Right(match level { + log::Level::Error => Color::Fixed(9).bold().paint(s), + log::Level::Warn => Color::Fixed(11).bold().paint(s), + log::Level::Info => Color::Fixed(10).paint(s), + log::Level::Debug => Color::Fixed(14).paint(s), + log::Level::Trace => Color::Fixed(12).paint(s), + }) + } +} diff --git a/relays/utils/src/lib.rs b/relays/utils/src/lib.rs new file mode 100644 index 000000000000..2776620be359 --- /dev/null +++ b/relays/utils/src/lib.rs @@ -0,0 +1,318 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Utilities used by different relays. + +pub use bp_runtime::HeaderId; +pub use error::Error; +pub use relay_loop::{relay_loop, relay_metrics}; +pub use sp_runtime::traits::{UniqueSaturatedFrom, UniqueSaturatedInto}; +use std::fmt::Debug; + +use async_trait::async_trait; +use backoff::{backoff::Backoff, ExponentialBackoff}; +use futures::future::{BoxFuture, FutureExt}; +use std::time::Duration; +use thiserror::Error; + +/// Default relay loop stall timeout. If transactions generated by relay are immortal, then +/// this timeout is used. +/// +/// There are no any strict requirements on block time in Substrate. But we assume here that all +/// Substrate-based chains will be designed to produce relatively fast (compared to the slowest +/// blockchains) blocks. So 1 hour seems to be a good guess for (even congested) chains to mine +/// transaction, or remove it from the pool. +pub const STALL_TIMEOUT: Duration = Duration::from_secs(60 * 60); + +/// Max delay after connection-unrelated error happened before we'll try the +/// same request again. +pub const MAX_BACKOFF_INTERVAL: Duration = Duration::from_secs(60); +/// Delay after connection-related error happened before we'll try +/// reconnection again. +pub const CONNECTION_ERROR_DELAY: Duration = Duration::from_secs(10); + +pub mod error; +pub mod initialize; +pub mod metrics; +pub mod relay_loop; + +/// Block number traits shared by all chains that relay is able to serve. +pub trait BlockNumberBase: + 'static + + From + + UniqueSaturatedInto + + Ord + + Clone + + Copy + + Default + + Send + + Sync + + std::fmt::Debug + + std::fmt::Display + + std::hash::Hash + + std::ops::Add + + std::ops::Sub + + num_traits::CheckedSub + + num_traits::Saturating + + num_traits::Zero + + num_traits::One +{ +} + +impl BlockNumberBase for T where + T: 'static + + From + + UniqueSaturatedInto + + Ord + + Clone + + Copy + + Default + + Send + + Sync + + std::fmt::Debug + + std::fmt::Display + + std::hash::Hash + + std::ops::Add + + std::ops::Sub + + num_traits::CheckedSub + + num_traits::Saturating + + num_traits::Zero + + num_traits::One +{ +} + +/// Macro that returns (client, Err(error)) tuple from function if result is Err(error). +#[macro_export] +macro_rules! bail_on_error { + ($result: expr) => { + match $result { + (client, Ok(result)) => (client, result), + (client, Err(error)) => return (client, Err(error)), + } + }; +} + +/// Macro that returns (client, Err(error)) tuple from function if result is Err(error). +#[macro_export] +macro_rules! bail_on_arg_error { + ($result: expr, $client: ident) => { + match $result { + Ok(result) => result, + Err(error) => return ($client, Err(error)), + } + }; +} + +/// Error type that can signal connection errors. +pub trait MaybeConnectionError { + /// Returns true if error (maybe) represents connection error. + fn is_connection_error(&self) -> bool; +} + +/// Final status of the tracked transaction. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum TrackedTransactionStatus { + /// Transaction has been lost. + Lost, + /// Transaction has been mined and finalized at given block. + Finalized(BlockId), +} + +/// Transaction tracker. +#[async_trait] +pub trait TransactionTracker: Send { + /// Header id, used by the chain. + type HeaderId: Clone + Debug + Send; + + /// Wait until transaction is either finalized or invalidated/lost. + async fn wait(self) -> TrackedTransactionStatus; +} + +/// Future associated with `TransactionTracker`, monitoring the transaction status. +pub type TrackedTransactionFuture<'a, T> = + BoxFuture<'a, TrackedTransactionStatus<::HeaderId>>; + +/// Stringified error that may be either connection-related or not. +#[derive(Error, Debug)] +pub enum StringifiedMaybeConnectionError { + /// The error is connection-related error. + #[error("{0}")] + Connection(String), + /// The error is connection-unrelated error. + #[error("{0}")] + NonConnection(String), +} + +impl StringifiedMaybeConnectionError { + /// Create new stringified connection error. + pub fn new(is_connection_error: bool, error: String) -> Self { + if is_connection_error { + StringifiedMaybeConnectionError::Connection(error) + } else { + StringifiedMaybeConnectionError::NonConnection(error) + } + } +} + +impl MaybeConnectionError for StringifiedMaybeConnectionError { + fn is_connection_error(&self) -> bool { + match *self { + StringifiedMaybeConnectionError::Connection(_) => true, + StringifiedMaybeConnectionError::NonConnection(_) => false, + } + } +} + +/// Exponential backoff for connection-unrelated errors retries. +pub fn retry_backoff() -> ExponentialBackoff { + ExponentialBackoff { + // we do not want relayer to stop + max_elapsed_time: None, + max_interval: MAX_BACKOFF_INTERVAL, + ..Default::default() + } +} + +/// Compact format of IDs vector. +pub fn format_ids(mut ids: impl ExactSizeIterator) -> String { + const NTH_PROOF: &str = "we have checked len; qed"; + match ids.len() { + 0 => "".into(), + 1 => format!("{:?}", ids.next().expect(NTH_PROOF)), + 2 => { + let id0 = ids.next().expect(NTH_PROOF); + let id1 = ids.next().expect(NTH_PROOF); + format!("[{id0:?}, {id1:?}]") + }, + len => { + let id0 = ids.next().expect(NTH_PROOF); + let id_last = ids.last().expect(NTH_PROOF); + format!("{len}:[{id0:?} ... {id_last:?}]") + }, + } +} + +/// Stream that emits item every `timeout_ms` milliseconds. +pub fn interval(timeout: Duration) -> impl futures::Stream { + futures::stream::unfold((), move |_| async move { + async_std::task::sleep(timeout).await; + Some(((), ())) + }) +} + +/// Which client has caused error. +#[derive(Debug, Eq, Clone, Copy, PartialEq)] +pub enum FailedClient { + /// It is the source client who has caused error. + Source, + /// It is the target client who has caused error. + Target, + /// Both clients are failing, or we just encountered some other error that + /// should be treated like that. + Both, +} + +/// Future process result. +#[derive(Debug, Clone, Copy)] +pub enum ProcessFutureResult { + /// Future has been processed successfully. + Success, + /// Future has failed with non-connection error. + Failed, + /// Future has failed with connection error. + ConnectionFailed, +} + +impl ProcessFutureResult { + /// Returns true if result is Success. + pub fn is_ok(self) -> bool { + match self { + ProcessFutureResult::Success => true, + ProcessFutureResult::Failed | ProcessFutureResult::ConnectionFailed => false, + } + } + + /// Returns `Ok(())` if future has succeeded. + /// Returns `Err(failed_client)` otherwise. + pub fn fail_if_error(self, failed_client: FailedClient) -> Result<(), FailedClient> { + if self.is_ok() { + Ok(()) + } else { + Err(failed_client) + } + } + + /// Returns Ok(true) if future has succeeded. + /// Returns Ok(false) if future has failed with non-connection error. + /// Returns Err if future is `ConnectionFailed`. + pub fn fail_if_connection_error( + self, + failed_client: FailedClient, + ) -> Result { + match self { + ProcessFutureResult::Success => Ok(true), + ProcessFutureResult::Failed => Ok(false), + ProcessFutureResult::ConnectionFailed => Err(failed_client), + } + } +} + +/// Process result of the future from a client. +pub fn process_future_result( + result: Result, + retry_backoff: &mut ExponentialBackoff, + on_success: impl FnOnce(TResult), + go_offline_future: &mut std::pin::Pin<&mut futures::future::Fuse>, + go_offline: impl FnOnce(Duration) -> TGoOfflineFuture, + error_pattern: impl FnOnce() -> String, +) -> ProcessFutureResult +where + TError: std::fmt::Debug + MaybeConnectionError, + TGoOfflineFuture: FutureExt, +{ + match result { + Ok(result) => { + on_success(result); + retry_backoff.reset(); + ProcessFutureResult::Success + }, + Err(error) if error.is_connection_error() => { + log::error!( + target: "bridge", + "{}: {:?}. Going to restart", + error_pattern(), + error, + ); + + retry_backoff.reset(); + go_offline_future.set(go_offline(CONNECTION_ERROR_DELAY).fuse()); + ProcessFutureResult::ConnectionFailed + }, + Err(error) => { + let retry_delay = retry_backoff.next_backoff().unwrap_or(CONNECTION_ERROR_DELAY); + log::error!( + target: "bridge", + "{}: {:?}. Retrying in {}", + error_pattern(), + error, + retry_delay.as_secs_f64(), + ); + + go_offline_future.set(go_offline(retry_delay).fuse()); + ProcessFutureResult::Failed + }, + } +} diff --git a/relays/utils/src/metrics.rs b/relays/utils/src/metrics.rs new file mode 100644 index 000000000000..2e6c8236da45 --- /dev/null +++ b/relays/utils/src/metrics.rs @@ -0,0 +1,192 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +pub use float_json_value::FloatJsonValueMetric; +pub use global::GlobalMetrics; +pub use substrate_prometheus_endpoint::{ + prometheus::core::{Atomic, Collector}, + register, Counter, CounterVec, Gauge, GaugeVec, Opts, PrometheusError, Registry, F64, I64, U64, +}; + +use async_std::sync::{Arc, RwLock}; +use async_trait::async_trait; +use std::{fmt::Debug, time::Duration}; + +mod float_json_value; +mod global; + +/// Shared reference to `f64` value that is updated by the metric. +pub type F64SharedRef = Arc>>; +/// Int gauge metric type. +pub type IntGauge = Gauge; + +/// Unparsed address that needs to be used to expose Prometheus metrics. +#[derive(Debug, Clone)] +pub struct MetricsAddress { + /// Serve HTTP requests at given host. + pub host: String, + /// Serve HTTP requests at given port. + pub port: u16, +} + +/// Prometheus endpoint MetricsParams. +#[derive(Debug, Clone)] +pub struct MetricsParams { + /// Interface and TCP port to be used when exposing Prometheus metrics. + pub address: Option, + /// Metrics registry. May be `Some(_)` if several components share the same endpoint. + pub registry: Registry, +} + +/// Metric API. +pub trait Metric: Clone + Send + Sync + 'static { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError>; +} + +/// Standalone metric API. +/// +/// Metrics of this kind know how to update themselves, so we may just spawn and forget the +/// asynchronous self-update task. +#[async_trait] +pub trait StandaloneMetric: Metric { + /// Update metric values. + async fn update(&self); + + /// Metrics update interval. + fn update_interval(&self) -> Duration; + + /// Register and spawn metric. Metric is only spawned if it is registered for the first time. + fn register_and_spawn(self, registry: &Registry) -> Result<(), PrometheusError> { + match self.register(registry) { + Ok(()) => { + self.spawn(); + Ok(()) + }, + Err(PrometheusError::AlreadyReg) => Ok(()), + Err(e) => Err(e), + } + } + + /// Spawn the self update task that will keep update metric value at given intervals. + fn spawn(self) { + async_std::task::spawn(async move { + let update_interval = self.update_interval(); + loop { + self.update().await; + async_std::task::sleep(update_interval).await; + } + }); + } +} + +impl Default for MetricsAddress { + fn default() -> Self { + MetricsAddress { host: "127.0.0.1".into(), port: 9616 } + } +} + +impl MetricsParams { + /// Creates metrics params from metrics address. + pub fn new( + address: Option, + relay_version: String, + relay_commit: String, + ) -> Result { + const BUILD_INFO_METRIC: &str = "substrate_relay_build_info"; + + let registry = Registry::new(); + register( + Gauge::::with_opts( + Opts::new( + BUILD_INFO_METRIC, + "A metric with a constant '1' value labeled by version", + ) + .const_label("version", &relay_version) + .const_label("commit", &relay_commit), + )?, + ®istry, + )? + .set(1); + + log::info!( + target: "bridge", + "Exposed {} metric: version={} commit={}", + BUILD_INFO_METRIC, + relay_version, + relay_commit, + ); + + Ok(MetricsParams { address, registry }) + } + + /// Creates metrics params so that metrics are not exposed. + pub fn disabled() -> Self { + MetricsParams { address: None, registry: Registry::new() } + } + + /// Do not expose metrics. + #[must_use] + pub fn disable(mut self) -> Self { + self.address = None; + self + } +} + +/// Returns metric name optionally prefixed with given prefix. +pub fn metric_name(prefix: Option<&str>, name: &str) -> String { + if let Some(prefix) = prefix { + format!("{prefix}_{name}") + } else { + name.into() + } +} + +/// Set value of gauge metric. +/// +/// If value is `Ok(None)` or `Err(_)`, metric would have default value. +pub fn set_gauge_value, E: Debug>( + gauge: &Gauge, + value: Result, E>, +) { + gauge.set(match value { + Ok(Some(value)) => { + log::trace!( + target: "bridge-metrics", + "Updated value of metric '{:?}': {:?}", + gauge.desc().first().map(|d| &d.fq_name), + value, + ); + value + }, + Ok(None) => { + log::warn!( + target: "bridge-metrics", + "Failed to update metric '{:?}': value is empty", + gauge.desc().first().map(|d| &d.fq_name), + ); + Default::default() + }, + Err(error) => { + log::warn!( + target: "bridge-metrics", + "Failed to update metric '{:?}': {:?}", + gauge.desc().first().map(|d| &d.fq_name), + error, + ); + Default::default() + }, + }) +} diff --git a/relays/utils/src/metrics/float_json_value.rs b/relays/utils/src/metrics/float_json_value.rs new file mode 100644 index 000000000000..17b09e050973 --- /dev/null +++ b/relays/utils/src/metrics/float_json_value.rs @@ -0,0 +1,147 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + error::{self, Error}, + metrics::{ + metric_name, register, F64SharedRef, Gauge, Metric, PrometheusError, Registry, + StandaloneMetric, F64, + }, +}; + +use async_std::sync::{Arc, RwLock}; +use async_trait::async_trait; +use std::time::Duration; + +/// Value update interval. +const UPDATE_INTERVAL: Duration = Duration::from_secs(300); + +/// Metric that represents float value received from HTTP service as float gauge. +/// +/// The float value returned by the service is assumed to be normal (`f64::is_normal` +/// should return `true`) and strictly positive. +#[derive(Debug, Clone)] +pub struct FloatJsonValueMetric { + url: String, + json_path: String, + metric: Gauge, + shared_value_ref: F64SharedRef, +} + +impl FloatJsonValueMetric { + /// Create new metric instance with given name and help. + pub fn new( + url: String, + json_path: String, + name: String, + help: String, + ) -> Result { + let shared_value_ref = Arc::new(RwLock::new(None)); + Ok(FloatJsonValueMetric { + url, + json_path, + metric: Gauge::new(metric_name(None, &name), help)?, + shared_value_ref, + }) + } + + /// Get shared reference to metric value. + pub fn shared_value_ref(&self) -> F64SharedRef { + self.shared_value_ref.clone() + } + + /// Request value from HTTP service. + async fn request_value(&self) -> anyhow::Result { + use isahc::{AsyncReadResponseExt, HttpClient, Request}; + + let request = Request::get(&self.url).header("Accept", "application/json").body(())?; + let raw_response = HttpClient::new()?.send_async(request).await?.text().await?; + Ok(raw_response) + } + + /// Read value from HTTP service. + async fn read_value(&self) -> error::Result { + let raw_response = self.request_value().await.map_err(Error::FetchTokenPrice)?; + parse_service_response(&self.json_path, &raw_response) + } +} + +impl Metric for FloatJsonValueMetric { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.metric.clone(), registry).map(drop) + } +} + +#[async_trait] +impl StandaloneMetric for FloatJsonValueMetric { + fn update_interval(&self) -> Duration { + UPDATE_INTERVAL + } + + async fn update(&self) { + let value = self.read_value().await; + let maybe_ok = value.as_ref().ok().copied(); + crate::metrics::set_gauge_value(&self.metric, value.map(Some)); + *self.shared_value_ref.write().await = maybe_ok; + } +} + +/// Parse HTTP service response. +fn parse_service_response(json_path: &str, response: &str) -> error::Result { + let json = + serde_json::from_str(response).map_err(|err| Error::ParseHttp(err, response.to_owned()))?; + + let mut selector = jsonpath_lib::selector(&json); + let maybe_selected_value = + selector(json_path).map_err(|err| Error::SelectResponseValue(err, response.to_owned()))?; + let selected_value = maybe_selected_value + .first() + .and_then(|v| v.as_f64()) + .ok_or_else(|| Error::MissingResponseValue(response.to_owned()))?; + if !selected_value.is_normal() || selected_value < 0.0 { + return Err(Error::ParseFloat(selected_value)) + } + + Ok(selected_value) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_service_response_works() { + assert_eq!( + parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":433.05}}"#).map_err(drop), + Ok(433.05), + ); + } + + #[test] + fn parse_service_response_rejects_negative_numbers() { + assert!(parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":-433.05}}"#).is_err()); + } + + #[test] + fn parse_service_response_rejects_zero_numbers() { + assert!(parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":0.0}}"#).is_err()); + } + + #[test] + fn parse_service_response_rejects_nan() { + assert!(parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":NaN}}"#).is_err()); + } +} diff --git a/relays/utils/src/metrics/global.rs b/relays/utils/src/metrics/global.rs new file mode 100644 index 000000000000..f7d3e25c9647 --- /dev/null +++ b/relays/utils/src/metrics/global.rs @@ -0,0 +1,118 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Global system-wide Prometheus metrics exposed by relays. + +use crate::metrics::{ + metric_name, register, Gauge, GaugeVec, Metric, Opts, PrometheusError, Registry, + StandaloneMetric, F64, U64, +}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use std::time::Duration; +use sysinfo::{ProcessExt, RefreshKind, System, SystemExt}; + +/// Global metrics update interval. +const UPDATE_INTERVAL: Duration = Duration::from_secs(10); + +/// Global Prometheus metrics. +#[derive(Debug, Clone)] +pub struct GlobalMetrics { + system: Arc>, + system_average_load: GaugeVec, + process_cpu_usage_percentage: Gauge, + process_memory_usage_bytes: Gauge, +} + +impl GlobalMetrics { + /// Create and register global metrics. + pub fn new() -> Result { + Ok(GlobalMetrics { + system: Arc::new(Mutex::new(System::new_with_specifics(RefreshKind::everything()))), + system_average_load: GaugeVec::new( + Opts::new(metric_name(None, "system_average_load"), "System load average"), + &["over"], + )?, + process_cpu_usage_percentage: Gauge::new( + metric_name(None, "process_cpu_usage_percentage"), + "Process CPU usage", + )?, + process_memory_usage_bytes: Gauge::new( + metric_name(None, "process_memory_usage_bytes"), + "Process memory (resident set size) usage", + )?, + }) + } +} + +impl Metric for GlobalMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.system_average_load.clone(), registry)?; + register(self.process_cpu_usage_percentage.clone(), registry)?; + register(self.process_memory_usage_bytes.clone(), registry)?; + Ok(()) + } +} + +#[async_trait] +impl StandaloneMetric for GlobalMetrics { + async fn update(&self) { + // update system-wide metrics + let mut system = self.system.lock().await; + let load = system.load_average(); + self.system_average_load.with_label_values(&["1min"]).set(load.one); + self.system_average_load.with_label_values(&["5min"]).set(load.five); + self.system_average_load.with_label_values(&["15min"]).set(load.fifteen); + + // update process-related metrics + let pid = sysinfo::get_current_pid().expect( + "only fails where pid is unavailable (os=unknown || arch=wasm32);\ + relay is not supposed to run in such MetricsParamss;\ + qed", + ); + let is_process_refreshed = system.refresh_process(pid); + match (is_process_refreshed, system.process(pid)) { + (true, Some(process_info)) => { + let cpu_usage = process_info.cpu_usage() as f64; + let memory_usage = process_info.memory() * 1024; + log::trace!( + target: "bridge-metrics", + "Refreshed process metrics: CPU={}, memory={}", + cpu_usage, + memory_usage, + ); + + self.process_cpu_usage_percentage.set(if cpu_usage.is_finite() { + cpu_usage + } else { + 0f64 + }); + self.process_memory_usage_bytes.set(memory_usage); + }, + _ => { + log::warn!( + target: "bridge-metrics", + "Failed to refresh process information. Metrics may show obsolete values", + ); + }, + } + } + + fn update_interval(&self) -> Duration { + UPDATE_INTERVAL + } +} diff --git a/relays/utils/src/relay_loop.rs b/relays/utils/src/relay_loop.rs new file mode 100644 index 000000000000..7105190a4583 --- /dev/null +++ b/relays/utils/src/relay_loop.rs @@ -0,0 +1,262 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + error::Error, + metrics::{Metric, MetricsAddress, MetricsParams}, + FailedClient, MaybeConnectionError, +}; + +use async_trait::async_trait; +use std::{fmt::Debug, future::Future, net::SocketAddr, time::Duration}; +use substrate_prometheus_endpoint::{init_prometheus, Registry}; + +/// Default pause between reconnect attempts. +pub const RECONNECT_DELAY: Duration = Duration::from_secs(10); + +/// Basic blockchain client from relay perspective. +#[async_trait] +pub trait Client: 'static + Clone + Send + Sync { + /// Type of error these clients returns. + type Error: 'static + Debug + MaybeConnectionError + Send + Sync; + + /// Try to reconnect to source node. + async fn reconnect(&mut self) -> Result<(), Self::Error>; + + /// Try to reconnect to the source node in an infinite loop until it succeeds. + async fn reconnect_until_success(&mut self, delay: Duration) { + loop { + match self.reconnect().await { + Ok(()) => break, + Err(error) => { + log::warn!( + target: "bridge", + "Failed to reconnect to client. Going to retry in {}s: {:?}", + delay.as_secs(), + error, + ); + + async_std::task::sleep(delay).await; + }, + } + } + } +} + +#[async_trait] +impl Client for () { + type Error = crate::StringifiedMaybeConnectionError; + + async fn reconnect(&mut self) -> Result<(), Self::Error> { + Ok(()) + } +} + +/// Returns generic loop that may be customized and started. +pub fn relay_loop(source_client: SC, target_client: TC) -> Loop { + Loop { reconnect_delay: RECONNECT_DELAY, source_client, target_client, loop_metric: None } +} + +/// Returns generic relay loop metrics that may be customized and used in one or several relay +/// loops. +pub fn relay_metrics(params: MetricsParams) -> LoopMetrics<(), (), ()> { + LoopMetrics { + relay_loop: Loop { + reconnect_delay: RECONNECT_DELAY, + source_client: (), + target_client: (), + loop_metric: None, + }, + address: params.address, + registry: params.registry, + loop_metric: None, + } +} + +/// Generic relay loop. +pub struct Loop { + reconnect_delay: Duration, + source_client: SC, + target_client: TC, + loop_metric: Option, +} + +/// Relay loop metrics builder. +pub struct LoopMetrics { + relay_loop: Loop, + address: Option, + registry: Registry, + loop_metric: Option, +} + +impl Loop { + /// Customize delay between reconnect attempts. + #[must_use] + pub fn reconnect_delay(mut self, reconnect_delay: Duration) -> Self { + self.reconnect_delay = reconnect_delay; + self + } + + /// Start building loop metrics using given prefix. + pub fn with_metrics(self, params: MetricsParams) -> LoopMetrics { + LoopMetrics { + relay_loop: Loop { + reconnect_delay: self.reconnect_delay, + source_client: self.source_client, + target_client: self.target_client, + loop_metric: None, + }, + address: params.address, + registry: params.registry, + loop_metric: None, + } + } + + /// Run relay loop. + /// + /// This function represents an outer loop, which in turn calls provided `run_loop` function to + /// do actual job. When `run_loop` returns, this outer loop reconnects to failed client (source, + /// target or both) and calls `run_loop` again. + pub async fn run(mut self, loop_name: String, run_loop: R) -> Result<(), Error> + where + R: 'static + Send + Fn(SC, TC, Option) -> F, + F: 'static + Send + Future>, + SC: 'static + Client, + TC: 'static + Client, + LM: 'static + Send + Clone, + { + let run_loop_task = async move { + crate::initialize::initialize_loop(loop_name); + + loop { + let loop_metric = self.loop_metric.clone(); + let future_result = + run_loop(self.source_client.clone(), self.target_client.clone(), loop_metric); + let result = future_result.await; + + match result { + Ok(()) => break, + Err(failed_client) => { + log::debug!(target: "bridge", "Restarting relay loop"); + + reconnect_failed_client( + failed_client, + self.reconnect_delay, + &mut self.source_client, + &mut self.target_client, + ) + .await + }, + } + } + Ok(()) + }; + + async_std::task::spawn(run_loop_task).await + } +} + +impl LoopMetrics { + /// Add relay loop metrics. + /// + /// Loop metrics will be passed to the loop callback. + pub fn loop_metric( + self, + metric: NewLM, + ) -> Result, Error> { + metric.register(&self.registry)?; + + Ok(LoopMetrics { + relay_loop: self.relay_loop, + address: self.address, + registry: self.registry, + loop_metric: Some(metric), + }) + } + + /// Convert into `MetricsParams` structure so that metrics registry may be extended later. + pub fn into_params(self) -> MetricsParams { + MetricsParams { address: self.address, registry: self.registry } + } + + /// Expose metrics using address passed at creation. + /// + /// If passed `address` is `None`, metrics are not exposed. + pub async fn expose(self) -> Result, Error> { + if let Some(address) = self.address { + let socket_addr = SocketAddr::new( + address + .host + .parse() + .map_err(|err| Error::ExposingMetricsInvalidHost(address.host.clone(), err))?, + address.port, + ); + + let registry = self.registry; + async_std::task::spawn(async move { + let runtime = + match tokio::runtime::Builder::new_current_thread().enable_all().build() { + Ok(runtime) => runtime, + Err(err) => { + log::trace!( + target: "bridge-metrics", + "Failed to create tokio runtime. Prometheus metrics are not available: {:?}", + err, + ); + return + }, + }; + + runtime.block_on(async move { + log::trace!( + target: "bridge-metrics", + "Starting prometheus endpoint at: {:?}", + socket_addr, + ); + let result = init_prometheus(socket_addr, registry).await; + log::trace!( + target: "bridge-metrics", + "Prometheus endpoint has exited with result: {:?}", + result, + ); + }); + }); + } + + Ok(Loop { + reconnect_delay: self.relay_loop.reconnect_delay, + source_client: self.relay_loop.source_client, + target_client: self.relay_loop.target_client, + loop_metric: self.loop_metric, + }) + } +} + +/// Deal with the clients that have returned connection error. +pub async fn reconnect_failed_client( + failed_client: FailedClient, + reconnect_delay: Duration, + source_client: &mut impl Client, + target_client: &mut impl Client, +) { + if failed_client == FailedClient::Source || failed_client == FailedClient::Both { + source_client.reconnect_until_success(reconnect_delay).await; + } + + if failed_client == FailedClient::Target || failed_client == FailedClient::Both { + target_client.reconnect_until_success(reconnect_delay).await; + } +} diff --git a/cumulus/bridges/rustfmt.toml b/rustfmt.toml similarity index 100% rename from cumulus/bridges/rustfmt.toml rename to rustfmt.toml diff --git a/scripts/build-containers.sh b/scripts/build-containers.sh new file mode 100755 index 000000000000..cb87af7743f0 --- /dev/null +++ b/scripts/build-containers.sh @@ -0,0 +1,18 @@ +#!/bin/sh +set -eux + +if [ -z "${LOCAL:-}" ]; then + time docker build . -t local/substrate-relay --build-arg=PROJECT=substrate-relay +else + if [ -z "${SKIP_BUILD:-}" ]; then + time cargo build -p substrate-relay --release + fi + + # (try to) use docker image matching the host os + export UBUNTU_RELEASE=`lsb_release -r -s` + + # following (using DOCKER_BUILDKIT) requires docker 19.03 or above + DOCKER_BUILDKIT=1 time docker build . -f local.Dockerfile -t local/substrate-relay \ + --build-arg=PROJECT=substrate-relay \ + --build-arg=UBUNTU_RELEASE=${UBUNTU_RELEASE} +fi diff --git a/scripts/regenerate_runtimes.sh b/scripts/regenerate_runtimes.sh new file mode 100755 index 000000000000..700f4dc1c86e --- /dev/null +++ b/scripts/regenerate_runtimes.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +cd tools/runtime-codegen +cargo run --bin runtime-codegen -- --from-node-url "wss://rococo-bridge-hub-rpc.polkadot.io:443" > ../../relays/client-bridge-hub-rococo/src/codegen_runtime.rs +cargo run --bin runtime-codegen -- --from-node-url "wss://rococo-rpc.polkadot.io:443" > ../../relays/client-rococo/src/codegen_runtime.rs +cargo run --bin runtime-codegen -- --from-node-url "wss://westend-rpc.polkadot.io:443" > ../../relays/client-westend/src/codegen_runtime.rs +cargo run --bin runtime-codegen -- --from-node-url "wss://kusama-rpc.polkadot.io:443" > ../../relays/client-kusama/src/codegen_runtime.rs +cargo run --bin runtime-codegen -- --from-node-url "wss://rpc.polkadot.io:443" > ../../relays/client-polkadot/src/codegen_runtime.rs + +# Uncomment to update other runtimes + +# For `polkadot-sdk` testnet runtimes: +# TODO: there is a bug, probably needs to update subxt, generates: `::sp_runtime::generic::Header<::core::primitive::u32>` withtout second `Hash` parameter. +# cargo run --bin runtime-codegen -- --from-wasm-file ../../../polkadot-sdk/target/release/wbuild/bridge-hub-rococo-runtime/bridge_hub_rococo_runtime.compact.compressed.wasm > ../../relays/client-bridge-hub-rococo/src/codegen_runtime.rs +# cargo run --bin runtime-codegen -- --from-wasm-file ../../../polkadot-sdk/target/release/wbuild/bridge-hub-westend-runtime/bridge_hub_westend_runtime.compact.compressed.wasm > ../../relays/client-bridge-hub-westend/src/codegen_runtime.rs + +cd - +cargo fmt --all + +# Polkadot Bulletin Chain: +# +# git clone https://github.com/zdave-parity/polkadot-bulletin-chain.git +# cd polkadot-bulletin-chain +# cargo run +# cargo run --bin runtime-codegen -- --from-node-url "ws://127.0.0.1:9944" > ../../relays/client-polkadot-bulletin/src/codegen_runtime.rs \ No newline at end of file diff --git a/cumulus/bridges/scripts/verify-pallets-build.sh b/scripts/verify-pallets-build.sh similarity index 90% rename from cumulus/bridges/scripts/verify-pallets-build.sh rename to scripts/verify-pallets-build.sh index 1ea3dbe86260..b96bbf1833b6 100755 --- a/cumulus/bridges/scripts/verify-pallets-build.sh +++ b/scripts/verify-pallets-build.sh @@ -61,20 +61,12 @@ trap revert_to_clean_state EXIT rm -rf $BRIDGES_FOLDER/.config rm -rf $BRIDGES_FOLDER/.github rm -rf $BRIDGES_FOLDER/.maintain -rm -rf $BRIDGES_FOLDER/bin/millau -rm -rf $BRIDGES_FOLDER/bin/rialto -rm -rf $BRIDGES_FOLDER/bin/rialto-parachain -rm -rf $BRIDGES_FOLDER/bin/.keep rm -rf $BRIDGES_FOLDER/deployments rm -f $BRIDGES_FOLDER/docs/dockerhub-* rm -rf $BRIDGES_FOLDER/fuzz rm -rf $BRIDGES_FOLDER/modules/beefy rm -rf $BRIDGES_FOLDER/modules/shift-session-manager rm -rf $BRIDGES_FOLDER/primitives/beefy -rm -rf $BRIDGES_FOLDER/primitives/chain-millau -rm -rf $BRIDGES_FOLDER/primitives/chain-rialto -rm -rf $BRIDGES_FOLDER/primitives/chain-rialto-parachain -rm -rf $BRIDGES_FOLDER/primitives/chain-westend rm -rf $BRIDGES_FOLDER/relays rm -rf $BRIDGES_FOLDER/scripts/add_license.sh rm -rf $BRIDGES_FOLDER/scripts/build-containers.sh @@ -82,24 +74,31 @@ rm -rf $BRIDGES_FOLDER/scripts/ci-cache.sh rm -rf $BRIDGES_FOLDER/scripts/dump-logs.sh rm -rf $BRIDGES_FOLDER/scripts/license_header rm -rf $BRIDGES_FOLDER/scripts/regenerate_runtimes.sh -rm -rf $BRIDGES_FOLDER/scripts/send-message-from-millau-rialto.sh -rm -rf $BRIDGES_FOLDER/scripts/send-message-from-rialto-millau.sh rm -rf $BRIDGES_FOLDER/scripts/update-weights.sh rm -rf $BRIDGES_FOLDER/scripts/update-weights-setup.sh rm -rf $BRIDGES_FOLDER/scripts/update_substrate.sh rm -rf $BRIDGES_FOLDER/tools rm -f $BRIDGES_FOLDER/.dockerignore +rm -f $BRIDGES_FOLDER/local.Dockerfile.dockerignore rm -f $BRIDGES_FOLDER/deny.toml rm -f $BRIDGES_FOLDER/.gitlab-ci.yml rm -f $BRIDGES_FOLDER/.editorconfig rm -f $BRIDGES_FOLDER/Cargo.toml rm -f $BRIDGES_FOLDER/ci.Dockerfile +rm -f $BRIDGES_FOLDER/local.Dockerfile rm -f $BRIDGES_FOLDER/CODEOWNERS rm -f $BRIDGES_FOLDER/Dockerfile +rm -f $BRIDGES_FOLDER/rustfmt.toml # let's fix Cargo.toml a bit (it'll be helpful if we are in the bridges repo) if [[ ! -f "Cargo.toml" ]]; then cat > Cargo.toml <<-CARGO_TOML + [workspace.package] + authors = ["Parity Technologies "] + edition = "2021" + repository = "https://github.com/paritytech/parity-bridges-common.git" + license = "GPL-3.0-only" + [workspace] resolver = "2" diff --git a/tools/runtime-codegen/Cargo.lock b/tools/runtime-codegen/Cargo.lock new file mode 100644 index 000000000000..696d376836b3 --- /dev/null +++ b/tools/runtime-codegen/Cargo.lock @@ -0,0 +1,5138 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +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 = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli 0.27.3", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli 0.28.0", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "affix" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e7ea84d3fa2009f355f8429a0b418a96849135a4188fadf384f59127d5d4bc" +dependencies = [ + "convert_case", +] + +[[package]] +name = "ahash" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom 0.2.10", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "getrandom 0.2.10", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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", +] + +[[package]] +name = "anstream" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "ark-bls12-377" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bls12-377-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c7021f180a0cbea0380eba97c2af3c57074cdaffe0eef7e840e1c9f2841e55" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-bls12-381" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-bls12-381-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1dc4b3d08f19e8ec06e949712f95b8361e43f1391d94f65e4234df03480631c" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-models-ext", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-bw6-761" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0605daf0cc5aa2034b78d008aaf159f56901d92a52ee4f6ecdfdac4f426700" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-bw6-761-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccee5fba47266f460067588ee1bf070a9c760bf2050c1c509982c5719aadb4f2" +dependencies = [ + "ark-bw6-761", + "ark-ec", + "ark-ff", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ed-on-bls12-377" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b10d901b9ac4b38f9c32beacedfadcdd64e46f8d7f8e88c1ae1060022cf6f6c6" +dependencies = [ + "ark-bls12-377", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ed-on-bls12-377-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524a4fb7540df2e1a8c2e67a83ba1d1e6c3947f4f9342cc2359fc2e789ad731d" +dependencies = [ + "ark-ec", + "ark-ed-on-bls12-377", + "ark-ff", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-ed-on-bls12-381-bandersnatch" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cde0f2aa063a2a5c28d39b47761aa102bda7c13c84fc118a61b87c7b2f785c" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ed-on-bls12-381-bandersnatch-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15185f1acb49a07ff8cbe5f11a1adc5a93b19e211e325d826ae98e98e124346" +dependencies = [ + "ark-ec", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ff", + "ark-models-ext", + "ark-std", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-models-ext" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e9eab5d4b5ff2f228b763d38442adc9b084b0a465409b059fac5c2308835ec2" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-scale" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bd73bb6ddb72630987d37fa963e99196896c0d0ea81b7c894567e74a2f83af" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "ark-secret-scalar" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "ark-transcript", + "digest 0.10.7", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", + "rayon", +] + +[[package]] +name = "ark-transcript" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "digest 0.10.7", + "rand_core 0.6.4", + "sha3", +] + +[[package]] +name = "array-bytes" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b1c5a481ec30a5abd8dfbd94ab5cf1bb4e9a66be7f1b3b322f2f1170c200fd" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line 0.21.0", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object 0.32.1", + "rustc-demangle", +] + +[[package]] +name = "bandersnatch_vrfs" +version = "0.0.3" +source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ff", + "ark-serialize", + "ark-std", + "dleq_vrf", + "fflonk", + "merlin 3.0.0", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "ring 0.1.0", + "sha2 0.10.8", + "sp-ark-bls12-381", + "sp-ark-ed-on-bls12-381-bandersnatch", + "zeroize", +] + +[[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.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bip39" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "rand_core 0.6.4", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "bounded-collections" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca548b6163b872067dc5eb82fd130c56881435e30367d2073594a3d9744120dd" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-targets 0.48.5", +] + +[[package]] +name = "clap" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "common" +version = "0.1.0" +source = "git+https://github.com/w3f/ring-proof#edd1e90b847e560bf60fc2e8712235ccfa11a9a9" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "fflonk", + "merlin 3.0.0", + "rand_chacha 0.3.1", +] + +[[package]] +name = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "constcat" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" + +[[package]] +name = "convert_case" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cpufeatures" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1277fbfa94bc82c8ec4af2ded3e639d49ca5f7f3c7eeab2c66accd135ece4e70" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e8c31ad3b2270e9aeec38723888fe1b0ace3bea2b06b3f749ccf46661d3220" +dependencies = [ + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "cranelift-isle", + "gimli 0.27.3", + "hashbrown 0.13.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ac5ac30d62b2d66f12651f6b606dbdfd9c2cfd0908de6b387560a277c5c9da" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd82b8b376247834b59ed9bdc0ddeb50f517452827d4a11bccf5937b213748b8" + +[[package]] +name = "cranelift-entity" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" +dependencies = [ + "serde", +] + +[[package]] +name = "cranelift-frontend" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a25d9d0a0ae3079c463c34115ec59507b4707175454f0eee0891e83e30e82d" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de6a7d0486e4acbd5f9f87ec49912bf4c8fb6aea00087b989685460d4469ba" + +[[package]] +name = "cranelift-native" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6b03e0e03801c4b3fd8ce0758a94750c07a44e7944cc0ffbf0d3f2e7c79b00" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon", +] + +[[package]] +name = "cranelift-wasm" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff3220489a3d928ad91e59dd7aeaa8b3de18afb554a6211213673a71c90737ac" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[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 0.14.7", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array 0.14.7", + "subtle", +] + +[[package]] +name = "curve25519-dalek" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +dependencies = [ + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + +[[package]] +name = "data-encoding-macro" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "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", +] + +[[package]] +name = "dleq_vrf" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf?rev=cbc342e#cbc342e95d3cbcd3c5ba8d45af7200eb58e63502" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-scale", + "ark-secret-scalar", + "ark-serialize", + "ark-std", + "ark-transcript", + "arrayvec 0.7.4", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dyn-clone" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +dependencies = [ + "curve25519-dalek 4.1.1", + "ed25519", + "serde", + "sha2 0.10.8", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek 3.2.0", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "environmental" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "expander" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" +dependencies = [ + "blake2", + "fs-err", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fflonk" +version = "0.1.0" +source = "git+https://github.com/w3f/fflonk#e141d4b6f42fb481aefe1b479788694945b6940d" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "merlin 3.0.0", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a481586acf778f1b1455424c343f71124b048ffa5f4fc3f8f6ae9dc432dcb3c7" + +[[package]] +name = "file-per-thread-logger" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +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 = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "frame-metadata" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf1549fba25a6fcac22785b61698317d958e96cac72a59102ea45b9ae64692" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "frame-metadata" +version = "16.0.0" +source = "git+https://github.com/paritytech/frame-metadata?branch=main#a07b2451b82809501fd797691046c1164f7e8840" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "fs-err" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-executor" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-macro" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "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.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +dependencies = [ + "fallible-iterator", + "indexmap 1.9.3", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "h2" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 1.9.3", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash-db" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" + +[[package]] +name = "hash256-std-hasher" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.7", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.6", +] + +[[package]] +name = "hashbrown" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" + +[[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.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac 0.8.0", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac 0.11.1", + "digest 0.9.0", +] + +[[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 0.14.7", + "hmac 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[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 = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.2", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix 0.38.21", + "windows-sys 0.48.0", +] + +[[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 = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affdc52f7596ccb2d7645231fc6163bb314630c989b64998f3699a28b4d5d4dc" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b005c793122d03217da09af68ba9383363caa950b90d3436106df8cabce935" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2327ba8df2fdbd5e897e2b5ed25ce7f299d345b9736b6828814c3dbd1fd47b" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f80c17f62c7653ce767e3d7288b793dfec920f97067ceb189ebdd3570f2bc20" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core", + "jsonrpsee-types", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be0be325642e850ed0bdff426674d2e66b2b7117c9be23a7caef68a2902b7d9" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + +[[package]] +name = "linux-raw-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix 0.38.21", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-db" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808b50db46293432a45e63bc15ea51e0ab4c0a1647b8eb114e31a3e698dd6fbe" +dependencies = [ + "hash-db", +] + +[[package]] +name = "merlin" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.5.1", + "zeroize", +] + +[[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 = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +dependencies = [ + "core2", + "unsigned-varint", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.4", + "itoa", +] + +[[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-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.30.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +dependencies = [ + "crc32fast", + "hashbrown 0.13.2", + "indexmap 1.9.3", + "memchr", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "parity-scale-codec" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +dependencies = [ + "arrayvec 0.7.4", + "bitvec", + "byte-slice-cast", + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parity-wasm" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" + +[[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", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[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.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "platforms" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14e6ab3f592e6fb464fc9712d8d6e6912de6473954635fd76a589d832cffcbb0" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[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", +] + +[[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.10", +] + +[[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 = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.10", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "regalloc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80535183cae11b149d618fbd3c37e38d7cda589d82d7769e196ca9a9042d7621" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "ring" +version = "0.1.0" +source = "git+https://github.com/w3f/ring-proof#edd1e90b847e560bf60fc2e8712235ccfa11a9a9" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "blake2", + "common", + "fflonk", + "merlin 3.0.0", +] + +[[package]] +name = "ring" +version = "0.17.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +dependencies = [ + "cc", + "getrandom 0.2.10", + "libc", + "spin", + "untrusted", + "windows-sys 0.48.0", +] + +[[package]] +name = "runtime-codegen" +version = "0.1.0" +dependencies = [ + "clap", + "color-eyre", + "parity-scale-codec", + "proc-macro2", + "quote", + "subxt-codegen", + "wasm-loader", + "wasm-testbed", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.36.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "305efbd14fde4139eb501df5f136994bb520b033fa9fbdce287507dc23b8c7ed" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.1.4", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustix" +version = "0.38.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys 0.4.10", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls" +version = "0.21.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +dependencies = [ + "log", + "ring 0.17.5", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.5", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "sc-allocator" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "log", + "sp-core", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "sc-executor" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "parity-scale-codec", + "parking_lot", + "sc-executor-common", + "sc-executor-wasmtime", + "schnellru", + "sp-api", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-io", + "sp-panic-handler", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "sp-version", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "tracing", +] + +[[package]] +name = "sc-executor-common" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "sc-allocator", + "sp-maybe-compressed-blob 4.1.0-dev (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", + "wasm-instrument", +] + +[[package]] +name = "sc-executor-wasmtime" +version = "0.10.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "anyhow", + "cfg-if", + "libc", + "log", + "parking_lot", + "rustix 0.36.17", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "wasmtime", +] + +[[package]] +name = "scale-info" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "schnellru" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +dependencies = [ + "ahash 0.8.6", + "cfg-if", + "hashbrown 0.13.2", +] + +[[package]] +name = "schnorrkel" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "curve25519-dalek 2.1.3", + "getrandom 0.1.16", + "merlin 2.0.1", + "rand 0.7.3", + "rand_core 0.5.1", + "sha2 0.8.2", + "subtle", + "zeroize", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.5", + "untrusted", +] + +[[package]] +name = "secp256k1" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" +dependencies = [ + "cc", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + +[[package]] +name = "serde" +version = "1.0.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.190" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[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", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallvec" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[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", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + +[[package]] +name = "sp-api" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "scale-info", + "sp-api-proc-macro", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-metadata-ir", + "sp-runtime", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "sp-version", + "thiserror", +] + +[[package]] +name = "sp-api-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "Inflector", + "blake2", + "expander", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "sp-application-crypto" +version = "23.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-arithmetic" +version = "16.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "static_assertions", +] + +[[package]] +name = "sp-ark-bls12-381" +version = "0.4.2" +source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" +dependencies = [ + "ark-bls12-381-ext", + "sp-crypto-ec-utils", +] + +[[package]] +name = "sp-ark-ed-on-bls12-381-bandersnatch" +version = "0.4.2" +source = "git+https://github.com/paritytech/arkworks-substrate#caa2eed74beb885dd07c7db5f916f2281dad818f" +dependencies = [ + "ark-ed-on-bls12-381-bandersnatch-ext", + "sp-crypto-ec-utils", +] + +[[package]] +name = "sp-core" +version = "21.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "array-bytes", + "bandersnatch_vrfs", + "bip39", + "bitflags 1.3.2", + "blake2", + "bounded-collections", + "bs58", + "dyn-clonable", + "ed25519-zebra", + "futures", + "hash-db", + "hash256-std-hasher", + "impl-serde", + "itertools", + "lazy_static", + "libsecp256k1", + "log", + "merlin 2.0.1", + "parity-scale-codec", + "parking_lot", + "paste", + "primitive-types", + "rand 0.8.5", + "regex", + "scale-info", + "schnorrkel", + "secp256k1", + "secrecy", + "serde", + "sp-core-hashing 9.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "ss58-registry", + "substrate-bip39", + "thiserror", + "tracing", + "w3f-bls", + "zeroize", +] + +[[package]] +name = "sp-core-hashing" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee599a8399448e65197f9a6cee338ad192e9023e35e31f22382964c3c174c68" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.8", + "sha3", + "sp-std 8.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing" +version = "9.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.8", + "sha3", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing-proc-macro" +version = "9.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "quote", + "sp-core-hashing 9.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "syn 2.0.38", +] + +[[package]] +name = "sp-crypto-ec-utils" +version = "0.4.1" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "ark-bls12-377", + "ark-bls12-377-ext", + "ark-bls12-381", + "ark-bls12-381-ext", + "ark-bw6-761", + "ark-bw6-761-ext", + "ark-ec", + "ark-ed-on-bls12-377", + "ark-ed-on-bls12-377-ext", + "ark-ed-on-bls12-381-bandersnatch", + "ark-ed-on-bls12-381-bandersnatch-ext", + "ark-scale", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", +] + +[[package]] +name = "sp-debug-derive" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "sp-debug-derive" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "sp-externalities" +version = "0.19.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-externalities" +version = "0.19.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk)", +] + +[[package]] +name = "sp-io" +version = "23.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "bytes", + "ed25519-dalek", + "libsecp256k1", + "log", + "parity-scale-codec", + "rustversion", + "secp256k1", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-keystore", + "sp-runtime-interface 17.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-state-machine", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-tracing 10.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-keystore" +version = "0.27.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "parity-scale-codec", + "parking_lot", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "sp-maybe-compressed-blob" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/substrate/?tag=monthly-2023-08#22f0669efc4a8b785854a335c70b7e4385d0ca53" +dependencies = [ + "thiserror", + "zstd 0.12.4", +] + +[[package]] +name = "sp-maybe-compressed-blob" +version = "4.1.0-dev" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "thiserror", + "zstd 0.12.4", +] + +[[package]] +name = "sp-metadata-ir" +version = "0.1.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "frame-metadata 16.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec", + "scale-info", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-panic-handler" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "backtrace", + "lazy_static", + "regex", +] + +[[package]] +name = "sp-runtime" +version = "24.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "paste", + "rand 0.8.5", + "scale-info", + "serde", + "sp-application-crypto", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-weights", +] + +[[package]] +name = "sp-runtime-interface" +version = "17.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-runtime-interface-proc-macro 11.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-tracing 10.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface" +version = "17.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-runtime-interface-proc-macro 11.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-storage 13.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-tracing 10.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "11.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "Inflector", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "11.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "Inflector", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "sp-state-machine" +version = "0.28.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "parking_lot", + "rand 0.8.5", + "smallvec", + "sp-core", + "sp-externalities 0.19.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-panic-handler", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-trie", + "thiserror", + "tracing", + "trie-db", +] + +[[package]] +name = "sp-std" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53458e3c57df53698b3401ec0934bea8e8cfce034816873c0b0abbd83d7bac0d" + +[[package]] +name = "sp-std" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" + +[[package]] +name = "sp-std" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" + +[[package]] +name = "sp-storage" +version = "13.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "sp-storage" +version = "13.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", +] + +[[package]] +name = "sp-tracing" +version = "10.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "tracing", + "tracing-core", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "sp-tracing" +version = "10.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "tracing", + "tracing-core", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "sp-trie" +version = "22.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "ahash 0.8.6", + "hash-db", + "hashbrown 0.13.2", + "lazy_static", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot", + "rand 0.8.5", + "scale-info", + "schnellru", + "sp-core", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-version" +version = "22.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "parity-wasm", + "scale-info", + "serde", + "sp-core-hashing-proc-macro", + "sp-runtime", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-version-proc-macro", + "thiserror", +] + +[[package]] +name = "sp-version-proc-macro" +version = "8.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "parity-scale-codec", + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "sp-wasm-interface" +version = "14.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "wasmtime", +] + +[[package]] +name = "sp-wasm-interface" +version = "14.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "anyhow", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk)", + "wasmtime", +] + +[[package]] +name = "sp-weights" +version = "20.0.0" +source = "git+https://github.com/paritytech/polkadot-sdk?branch=master#29b4bd423387c0704d467a49f99444beaa2690eb" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic", + "sp-core", + "sp-debug-derive 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "sp-std 8.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ss58-registry" +version = "1.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6915280e2d0db8911e5032a5c275571af6bdded2916abd691a659be25d3439" +dependencies = [ + "Inflector", + "num-format", + "proc-macro2", + "quote", + "serde", + "serde_json", + "unicode-xid", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subrpcer" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92660ce1320c3b4351b025ffc2932c3d410c71625be049922acefe1cae81c2e9" +dependencies = [ + "affix", + "serde", + "serde_json", +] + +[[package]] +name = "substrate-bip39" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e620c7098893ba667438b47169c00aacdd9e7c10e042250ce2b60b087ec97328" +dependencies = [ + "hmac 0.11.0", + "pbkdf2", + "schnorrkel", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "substrate-runtime-proposal-hash" +version = "0.20.0" +source = "git+https://github.com/chevdor/subwasm?branch=master#03dc0352cbdff33f31d77ef84be2fc88593103c5" +dependencies = [ + "blake2", + "frame-metadata 16.0.0 (git+https://github.com/paritytech/frame-metadata?branch=main)", + "hex", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-runtime", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "thiserror", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "subxt-codegen" +version = "0.32.1" +source = "git+https://github.com/paritytech/subxt?branch=master#40aca5ba65f1181e8496eb91615d73c0d3c01502" +dependencies = [ + "frame-metadata 16.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "heck", + "hex", + "jsonrpsee", + "parity-scale-codec", + "proc-macro2", + "quote", + "scale-info", + "subxt-metadata", + "syn 2.0.38", + "thiserror", + "tokio", +] + +[[package]] +name = "subxt-metadata" +version = "0.32.1" +source = "git+https://github.com/paritytech/subxt?branch=master#40aca5ba65f1181e8496eb91615d73c0d3c01502" +dependencies = [ + "frame-metadata 16.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-scale-codec", + "scale-info", + "sp-core-hashing 9.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" + +[[package]] +name = "termcolor" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[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.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2 0.5.5", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "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.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[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.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber 0.3.17", +] + +[[package]] +name = "tracing-log" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "trie-db" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff28e0f815c2fea41ebddf148e008b077d2faddb026c9555b29696114d602642" +dependencies = [ + "hash-db", + "hashbrown 0.13.2", + "log", + "rustc-hex", + "smallvec", +] + +[[package]] +name = "trie-root" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" +dependencies = [ + "hash-db", +] + +[[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.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "rustls-native-certs", + "sha1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "digest 0.10.7", + "rand 0.8.5", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[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-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3" +dependencies = [ + "base64 0.21.5", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-webpki", + "serde", + "serde_json", + "url", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "w3f-bls" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" +dependencies = [ + "ark-bls12-377", + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-serialize-derive", + "arrayref", + "constcat", + "digest 0.10.7", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "sha2 0.10.8", + "sha3", + "thiserror", + "zeroize", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "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.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.38", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" + +[[package]] +name = "wasm-instrument" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1dafb3e60065305741e83db35c6c2584bb3725b692b5b66148a38d72ace6cd" +dependencies = [ + "parity-wasm", +] + +[[package]] +name = "wasm-loader" +version = "0.20.0" +source = "git+https://github.com/chevdor/subwasm?branch=master#03dc0352cbdff33f31d77ef84be2fc88593103c5" +dependencies = [ + "array-bytes", + "log", + "multibase", + "multihash", + "serde", + "serde_json", + "sp-maybe-compressed-blob 4.1.0-dev (git+https://github.com/paritytech/substrate/?tag=monthly-2023-08)", + "subrpcer", + "thiserror", + "tungstenite", + "ureq", + "url", +] + +[[package]] +name = "wasm-testbed" +version = "0.20.0" +source = "git+https://github.com/chevdor/subwasm?branch=master#03dc0352cbdff33f31d77ef84be2fc88593103c5" +dependencies = [ + "frame-metadata 16.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex", + "log", + "parity-scale-codec", + "sc-executor", + "sc-executor-common", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-version", + "sp-wasm-interface 14.0.0 (git+https://github.com/paritytech/polkadot-sdk?branch=master)", + "substrate-runtime-proposal-hash", + "thiserror", + "wasm-loader", +] + +[[package]] +name = "wasmparser" +version = "0.102.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" +dependencies = [ + "indexmap 1.9.3", + "url", +] + +[[package]] +name = "wasmtime" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" +dependencies = [ + "anyhow", + "bincode", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "object 0.30.4", + "once_cell", + "paste", + "psm", + "rayon", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-asm-macros" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-cache" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86437fa68626fe896e5afc69234bb2b5894949083586535f200385adfd71213" +dependencies = [ + "anyhow", + "base64 0.21.5", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix 0.36.17", + "serde", + "sha2 0.10.8", + "toml", + "windows-sys 0.45.0", + "zstd 0.11.2+zstd.1.5.2", +] + +[[package]] +name = "wasmtime-cranelift" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1cefde0cce8cb700b1b21b6298a3837dba46521affd7b8c38a9ee2c869eee04" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli 0.27.3", + "log", + "object 0.30.4", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-cranelift-shared", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-cranelift-shared" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd041e382ef5aea1b9fc78442394f1a4f6d676ce457e7076ca4cb3f397882f8b" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-native", + "gimli 0.27.3", + "object 0.30.4", + "target-lexicon", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli 0.27.3", + "indexmap 1.9.3", + "log", + "object 0.30.4", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" +dependencies = [ + "addr2line 0.19.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli 0.27.3", + "log", + "object 0.30.4", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" +dependencies = [ + "object 0.30.4", + "once_cell", + "rustix 0.36.17", +] + +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "mach", + "memfd", + "memoffset 0.8.0", + "paste", + "rand 0.8.5", + "rustix 0.36.17", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-types" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + +[[package]] +name = "webpki-roots" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" + +[[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-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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[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-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176b6138793677221d420fd2f0aeeced263f197688b36484660da767bca2fa32" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "153d75bb9ec8e11aa8ebbfd2b6f734ea9138a94aa510f0749869fe0a883dce31" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bcfd819c383ddfe0e1da48aebca9cb1b890445c6426325486aaf2651e089c49" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[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 5.0.2+zstd.1.5.2", +] + +[[package]] +name = "zstd" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +dependencies = [ + "zstd-safe 6.0.6", +] + +[[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-safe" +version = "6.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/tools/runtime-codegen/Cargo.toml b/tools/runtime-codegen/Cargo.toml new file mode 100644 index 000000000000..faed2865e8c1 --- /dev/null +++ b/tools/runtime-codegen/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "runtime-codegen" +version = "0.1.0" +description = "Tool for generating bridge runtime code from metadata" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[workspace] + +[dependencies] +clap = { version = "4.4.6", features = ["derive", "cargo"] } +codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +color-eyre = "0.6.1" +proc-macro2 = "1.0.56" +quote = "1.0.28" +subxt-codegen = { git = "https://github.com/paritytech/subxt", branch = "master", default-features = false, features = ["fetch-metadata"] } +wasm-loader = { git = "https://github.com/chevdor/subwasm", branch = "master" } +wasm-testbed = { git = "https://github.com/chevdor/subwasm", branch = "master" } + diff --git a/tools/runtime-codegen/README.md b/tools/runtime-codegen/README.md new file mode 100644 index 000000000000..a5faeb840b81 --- /dev/null +++ b/tools/runtime-codegen/README.md @@ -0,0 +1,11 @@ +This is a tool for generating the bridge runtime code from metadata. + +Example commands: + +``` +cargo run --bin runtime-codegen -- --from-node-url "wss://rococo-bridge-hub-rpc.polkadot.io:443" > /tmp/rococo_codegen.rs +``` + +``` +cargo run --bin runtime-codegen -- --from-wasm-file ~/workplace/bridge-hub-rococo_runtime-v9360.compact.compressed.wasm > /tmp/rococo_bridge_hub_codegen.rs +``` \ No newline at end of file diff --git a/tools/runtime-codegen/src/main.rs b/tools/runtime-codegen/src/main.rs new file mode 100644 index 000000000000..d7a722b09c99 --- /dev/null +++ b/tools/runtime-codegen/src/main.rs @@ -0,0 +1,177 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use clap::Parser as ClapParser; +use codec::{Decode, Encode}; +use color_eyre::eyre; +use std::{env, path::PathBuf}; +use subxt_codegen::{ + fetch_metadata::{fetch_metadata_from_url_blocking, MetadataVersion, Url}, + syn, CodegenBuilder, Metadata, +}; +use wasm_testbed::WasmTestBed; + +/// Command for generating indirect runtimes code. +#[derive(Debug, ClapParser)] +struct Command { + #[clap(name = "from-node-url", long, value_parser)] + node_url: Option, + #[clap(name = "from-wasm-file", long, value_parser)] + wasm_file: Option, +} + +enum RuntimeMetadataSource { + NodeUrl(Url), + WasmFile(wasm_loader::Source), +} + +impl RuntimeMetadataSource { + fn from_command(cmd: Command) -> color_eyre::Result { + match (cmd.node_url, cmd.wasm_file) { + (Some(_), Some(_)) => Err(eyre::eyre!( + "Please specify one of `--from-node-url` or `--from-wasm-file` but not both" + )), + (None, None) => + Err(eyre::eyre!("Please specify one of `--from-node-url` or `--from-wasm-file`")), + (Some(node_url), None) => Ok(Self::NodeUrl(node_url)), + (None, Some(source)) => + Ok(Self::WasmFile(wasm_loader::Source::File(PathBuf::from(source)))), + } + } +} + +struct TypeSubstitute { + subxt_type: syn::Path, + substitute: syn::Path, +} + +impl TypeSubstitute { + fn simple(subxt_type: &str) -> Self { + Self { + subxt_type: syn::parse_str::(subxt_type).unwrap(), + substitute: syn::parse_str::(&format!("::{subxt_type}")).unwrap(), + } + } + + fn custom(subxt_type: &str, substitute: &str) -> Self { + Self { + subxt_type: syn::parse_str::(subxt_type).unwrap(), + substitute: syn::parse_str::(substitute).unwrap(), + } + } +} + +fn print_runtime(runtime_api: proc_macro2::TokenStream) { + println!( + "// Copyright 2019-2023 Parity Technologies (UK) Ltd. + // This file is part of Parity Bridges Common. + + // Parity Bridges Common is free software: you can redistribute it and/or modify + // it under the terms of the GNU General Public License as published by + // the Free Software Foundation, either version 3 of the License, or + // (at your option) any later version. + + // Parity Bridges Common is distributed in the hope that it will be useful, + // but WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + // GNU General Public License for more details. + + // You should have received a copy of the GNU General Public License + // along with Parity Bridges Common. If not, see . + + //! Autogenerated runtime API + //! THIS FILE WAS AUTOGENERATED USING parity-bridges-common::runtime-codegen + //! EXECUTED COMMAND: {} + + {} + ", + env::args().collect::>().join(" "), + runtime_api + ); +} + +fn main() -> color_eyre::Result<()> { + let args: Command = Command::parse(); + let metadata_source = RuntimeMetadataSource::from_command(args)?; + + let mut codegen_builder = CodegenBuilder::new(); + codegen_builder.runtime_types_only(); + codegen_builder.no_docs(); + + // Default module derivatives. + codegen_builder.disable_default_derives(); + codegen_builder.set_additional_global_derives(vec![ + syn::parse_quote!(::codec::Encode), + syn::parse_quote!(::codec::Decode), + syn::parse_quote!(Clone), + syn::parse_quote!(Debug), + syn::parse_quote!(PartialEq), + ]); + + // Type substitutes + let type_substitutes = vec![ + TypeSubstitute::simple("sp_core::crypto::AccountId32"), + TypeSubstitute::custom("sp_weights::weight_v2::Weight", "::sp_weights::Weight"), + TypeSubstitute::custom("sp_runtime::generic::era::Era", "::sp_runtime::generic::Era"), + TypeSubstitute::custom( + "sp_runtime::generic::header::Header", + "::sp_runtime::generic::Header", + ), + TypeSubstitute::simple("sp_runtime::traits::BlakeTwo256"), + TypeSubstitute::simple("sp_session::MembershipProof"), + TypeSubstitute::simple("sp_consensus_grandpa::EquivocationProof"), + TypeSubstitute::simple("bp_header_chain::justification::GrandpaJustification"), + TypeSubstitute::simple("bp_header_chain::InitializationData"), + TypeSubstitute::simple("bp_polkadot_core::parachains::ParaId"), + TypeSubstitute::simple("bp_polkadot_core::parachains::ParaHeadsProof"), + TypeSubstitute::simple( + "bridge_runtime_common::messages::target::FromBridgedChainMessagesProof", + ), + TypeSubstitute::simple( + "bridge_runtime_common::messages::source::FromBridgedChainMessagesDeliveryProof", + ), + TypeSubstitute::simple("bp_messages::UnrewardedRelayersState"), + TypeSubstitute::custom( + "sp_runtime::generic::digest::Digest", + "::sp_runtime::generic::Digest", + ), + ]; + for type_substitute in type_substitutes { + codegen_builder.set_type_substitute(type_substitute.subxt_type, type_substitute.substitute); + } + + // Generate the Runtime API. + let raw_metadata = match metadata_source { + RuntimeMetadataSource::NodeUrl(node_url) => + fetch_metadata_from_url_blocking(node_url, MetadataVersion::Latest) + .map_err(|e| eyre::eyre!("Error fetching metadata from node url: {:?}", e))?, + RuntimeMetadataSource::WasmFile(source) => { + let testbed = WasmTestBed::new(&source) + .map_err(|e| eyre::eyre!("Error creating WasmTestBed: {:?}", e))?; + testbed.runtime_metadata_prefixed().encode() + }, + }; + let metadata = Metadata::decode(&mut &raw_metadata[..]) + .map_err(|e| eyre::eyre!("Error decoding metadata: {:?}", e))?; + + let runtime_api = codegen_builder + .generate(metadata) + .map_err(|e| eyre::eyre!("Error generating runtime api: {:?}", e))?; + + print_runtime(runtime_api); + + Ok(()) +} diff --git a/zombienet/README.md b/zombienet/README.md new file mode 100644 index 000000000000..b601154b624c --- /dev/null +++ b/zombienet/README.md @@ -0,0 +1,31 @@ +# Bridges Tests for Local Rococo <> Westend Bridge + +This folder contains [zombienet](https://github.com/paritytech/zombienet/) based integration tests for both +onchain and offchain bridges code. Due to some +[technical difficulties](https://github.com/paritytech/parity-bridges-common/pull/2649#issue-1965339051), we +are using native zombienet provider, which means that you need to build some binaries locally. + +To start those tests, you need to: + +- download latest [zombienet release](https://github.com/paritytech/zombienet/releases); + +- build Polkadot binary by running `cargo build -p polkadot --release --features fast-runtime` command in the +[`polkadot-sdk`](https://github.com/paritytech/polkadot-sdk) repository clone; + +- build Polkadot Parachain binary by running `cargo build -p polkadot-parachain-bin --release` command in the +[`polkadot-sdk`](https://github.com/paritytech/polkadot-sdk) repository clone; + +- ensure that you have [`node`](https://nodejs.org/en) installed. Additionally, we'll need globally installed +`polkadot/api-cli` package (use `npm install -g @polkadot/api-cli@beta` to install it); + +- build Substrate relay by running `cargo build -p substrate-relay --release` command in the +[`parity-bridges-common`](https://github.com/paritytech/parity-bridges-common) repository clone. + +- copy fresh `substrate-relay` binary, built in previous point, to the `~/local_bridge_testing/bin/substrate-relay`; + +- change the `POLKADOT_SDK_FOLDER` and `ZOMBIENET_BINARY_PATH` (and ensure that the nearby variables +have correct values) in the `./run-tests.sh`. + +After that, you could run tests with the `./run-tests.sh` command. Hopefully, it'll show the +"All tests have completed successfully" message in the end. Otherwise, it'll print paths to zombienet +process logs, which, in turn, may be used to track locations of all spinned relay and parachain nodes. diff --git a/zombienet/helpers/best-finalized-header-at-bridged-chain.js b/zombienet/helpers/best-finalized-header-at-bridged-chain.js new file mode 100644 index 000000000000..f7e1eefc84b3 --- /dev/null +++ b/zombienet/helpers/best-finalized-header-at-bridged-chain.js @@ -0,0 +1,25 @@ +async function run(nodeName, networkInfo, args) { + const {wsUri, userDefinedTypes} = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + // TODO: could be replaced with https://github.com/polkadot-js/api/issues/4930 (depends on metadata v15) later + const bridgedChainName = args[0]; + const expectedBridgedChainHeaderNumber = Number(args[1]); + const runtimeApiMethod = bridgedChainName + "FinalityApi_best_finalized"; + + while (true) { + const encodedBestFinalizedHeaderId = await api.rpc.state.call(runtimeApiMethod, []); + const bestFinalizedHeaderId = api.createType("Option", encodedBestFinalizedHeaderId); + if (bestFinalizedHeaderId.isSome) { + const bestFinalizedHeaderNumber = Number(bestFinalizedHeaderId.unwrap().toHuman()[0]); + if (bestFinalizedHeaderNumber > expectedBridgedChainHeaderNumber) { + return bestFinalizedHeaderNumber; + } + } + + // else sleep and retry + await new Promise((resolve) => setTimeout(resolve, 12000)); + } +} + +module.exports = { run } diff --git a/zombienet/helpers/native-assets-balance-increased.js b/zombienet/helpers/native-assets-balance-increased.js new file mode 100644 index 000000000000..9ee1a769e9f2 --- /dev/null +++ b/zombienet/helpers/native-assets-balance-increased.js @@ -0,0 +1,20 @@ +async function run(nodeName, networkInfo, args) { + const {wsUri, userDefinedTypes} = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + const accountAddress = args[0]; + const initialAccountData = await api.query.system.account(accountAddress); + const initialAccountBalance = initialAccountData.data['free']; + while (true) { + const accountData = await api.query.system.account(accountAddress); + const accountBalance = accountData.data['free']; + if (accountBalance > initialAccountBalance) { + return accountBalance; + } + + // else sleep and retry + await new Promise((resolve) => setTimeout(resolve, 12000)); + } +} + +module.exports = { run } diff --git a/zombienet/helpers/relayer-rewards.js b/zombienet/helpers/relayer-rewards.js new file mode 100644 index 000000000000..a5f567db7977 --- /dev/null +++ b/zombienet/helpers/relayer-rewards.js @@ -0,0 +1,28 @@ +async function run(nodeName, networkInfo, args) { + const {wsUri, userDefinedTypes} = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + // TODO: could be replaced with https://github.com/polkadot-js/api/issues/4930 (depends on metadata v15) later + const relayerAccountAddress = args[0]; + const laneId = args[1]; + const bridgedChainId = args[2]; + const relayerFundOwner = args[3]; + const expectedRelayerReward = BigInt(args[4]); + while (true) { + const relayerReward = await api.query.bridgeRelayers.relayerRewards( + relayerAccountAddress, + { laneId: laneId, bridgedChainId: bridgedChainId, owner: relayerFundOwner } + ); + if (relayerReward.isSome) { + const relayerRewardBalance = relayerReward.unwrap().toBigInt(); + if (relayerRewardBalance > expectedRelayerReward) { + return relayerRewardBalance; + } + } + + // else sleep and retry + await new Promise((resolve) => setTimeout(resolve, 12000)); + } +} + +module.exports = { run } diff --git a/zombienet/helpers/wait-hrmp-channel-opened.js b/zombienet/helpers/wait-hrmp-channel-opened.js new file mode 100644 index 000000000000..e700cab1d748 --- /dev/null +++ b/zombienet/helpers/wait-hrmp-channel-opened.js @@ -0,0 +1,22 @@ +async function run(nodeName, networkInfo, args) { + const {wsUri, userDefinedTypes} = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + const sibling = args[0]; + + while (true) { + const messagingStateAsObj = await api.query.parachainSystem.relevantMessagingState(); + const messagingState = api.createType("Option", messagingStateAsObj); + if (messagingState.isSome) { + const egressChannels = messagingState.unwrap().egressChannels; + if (egressChannels.find(x => x[0] == sibling)) { + return; + } + } + + // else sleep and retry + await new Promise((resolve) => setTimeout(resolve, 12000)); + } +} + +module.exports = { run } diff --git a/zombienet/helpers/wrapped-assets-balance.js b/zombienet/helpers/wrapped-assets-balance.js new file mode 100644 index 000000000000..bb3cea8858a8 --- /dev/null +++ b/zombienet/helpers/wrapped-assets-balance.js @@ -0,0 +1,26 @@ +async function run(nodeName, networkInfo, args) { + const {wsUri, userDefinedTypes} = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + // TODO: could be replaced with https://github.com/polkadot-js/api/issues/4930 (depends on metadata v15) later + const accountAddress = args[0]; + const expectedForeignAssetBalance = BigInt(args[1]); + const bridgedNetworkName = args[2]; + while (true) { + const foreignAssetAccount = await api.query.foreignAssets.account( + { parents: 2, interior: { X1: { GlobalConsensus: bridgedNetworkName } } }, + accountAddress + ); + if (foreignAssetAccount.isSome) { + const foreignAssetAccountBalance = foreignAssetAccount.unwrap().balance.toBigInt(); + if (foreignAssetAccountBalance > expectedForeignAssetBalance) { + return foreignAssetAccountBalance; + } + } + + // else sleep and retry + await new Promise((resolve) => setTimeout(resolve, 12000)); + } +} + +module.exports = { run } diff --git a/zombienet/run-tests.sh b/zombienet/run-tests.sh new file mode 100755 index 000000000000..4f80e06650ee --- /dev/null +++ b/zombienet/run-tests.sh @@ -0,0 +1,107 @@ +#!/bin/bash +#set -eu +shopt -s nullglob + +trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT + +# assuming that we'll be using native provide && all processes will be executing locally +# (we need absolute paths here, because they're used when scripts are called by zombienet from tmp folders) +export POLKADOT_SDK_FOLDER=`realpath $(dirname "$0")/../..` +export BRIDGE_TESTS_FOLDER=$POLKADOT_SDK_FOLDER/bridges/zombienet/tests +export POLKADOT_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot +export POLKADOT_PARACHAIN_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot-parachain +export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=$POLKADOT_PARACHAIN_BINARY_PATH +export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=$POLKADOT_PARACHAIN_BINARY_PATH +export ZOMBIENET_BINARY_PATH=~/local_bridge_testing/bin/zombienet-linux + +# check if `wait` supports -p flag +if [ `printf "$BASH_VERSION\n5.1" | sort -V | head -n 1` = "5.1" ]; then IS_BASH_5_1=1; else IS_BASH_5_1=0; fi + +# bridge configuration +export LANE_ID="00000002" + +# tests configuration +ALL_TESTS_FOLDER=`mktemp -d` + +function start_coproc() { + local command=$1 + local name=$2 + local coproc_log=`mktemp -p $TEST_FOLDER` + coproc COPROC { + $command >$coproc_log 2>&1 + } + TEST_COPROCS[$COPROC_PID, 0]=$name + TEST_COPROCS[$COPROC_PID, 1]=$coproc_log + echo "Spawned $name coprocess. StdOut + StdErr: $coproc_log" + + return $COPROC_PID +} + +# execute every test from tests folder +TEST_INDEX=1 +while true +do + declare -A TEST_COPROCS + TEST_COPROCS_COUNT=0 + TEST_PREFIX=$(printf "%04d" $TEST_INDEX) + + # it'll be used by the `sync-exit.sh` script + export TEST_FOLDER=`mktemp -d -p $ALL_TESTS_FOLDER` + + # check if there are no more tests + zndsl_files=($BRIDGE_TESTS_FOLDER/$TEST_PREFIX-*.zndsl) + if [ ${#zndsl_files[@]} -eq 0 ]; then + break + fi + + # start relay + if [ -f $BRIDGE_TESTS_FOLDER/$TEST_PREFIX-start-relay.sh ]; then + start_coproc "${BRIDGE_TESTS_FOLDER}/${TEST_PREFIX}-start-relay.sh" "relay" + RELAY_COPROC=$COPROC_PID + ((TEST_COPROCS_COUNT++)) + fi + # start tests + for zndsl_file in "${zndsl_files[@]}"; do + start_coproc "$ZOMBIENET_BINARY_PATH --provider native test $zndsl_file" "$zndsl_file" + echo -n "1">>$TEST_FOLDER/exit-sync + ((TEST_COPROCS_COUNT++)) + done + # wait until all tests are completed + relay_exited=0 + for n in `seq 1 $TEST_COPROCS_COUNT`; do + if [ "$IS_BASH_5_1" -eq 1 ]; then + wait -n -p COPROC_PID + exit_code=$? + coproc_name=${TEST_COPROCS[$COPROC_PID, 0]} + coproc_log=${TEST_COPROCS[$COPROC_PID, 1]} + coproc_stdout=$(cat $coproc_log) + relay_exited=$(expr "${coproc_name}" == "relay") + else + wait -n + exit_code=$? + coproc_name="" + coproc_stdout="" + fi + echo "Process $coproc_name has finished with exit code: $exit_code" + + # if exit code is not zero, exit + if [ $exit_code -ne 0 ]; then + echo "=====================================================================" + echo "=== Shutting down. Log of failed process below ===" + echo "=====================================================================" + echo $coproc_stdout + exit 1 + fi + + # if last test has exited, exit relay too + if [ $n -eq $(($TEST_COPROCS_COUNT - 1)) ] && [ $relay_exited -eq 0 ]; then + kill $RELAY_COPROC + break + fi + done + ((TEST_INDEX++)) +done + +echo "=====================================================================" +echo "=== All tests have completed successfully ===" +echo "=====================================================================" diff --git a/zombienet/scripts/invoke-script.sh b/zombienet/scripts/invoke-script.sh new file mode 100755 index 000000000000..6a3754a88240 --- /dev/null +++ b/zombienet/scripts/invoke-script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +pushd $POLKADOT_SDK_FOLDER/cumulus/scripts +./bridges_rococo_westend.sh $1 +popd diff --git a/zombienet/scripts/sync-exit.sh b/zombienet/scripts/sync-exit.sh new file mode 100755 index 000000000000..cc20b098e783 --- /dev/null +++ b/zombienet/scripts/sync-exit.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +# every network adds a char to the file, let's remove ours +truncate -s -1 $TEST_FOLDER/exit-sync + +# when all chars are removed, then our test is done +while true +do + if [ `stat --printf="%s" $TEST_FOLDER/exit-sync` -eq 0 ]; then + exit + fi + sleep 100 +done diff --git a/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl b/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl new file mode 100644 index 000000000000..a61f1e039f45 --- /dev/null +++ b/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl @@ -0,0 +1,34 @@ +Description: User is able to transfer ROC from Rococo Asset Hub to Westend Asset Hub and back +Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml +Creds: config + +# step 1: initialize Westend AH +asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "init-asset-hub-westend-local" within 240 seconds +asset-hub-westend-collator1: js-script ../helpers/wait-hrmp-channel-opened.js with "1002" within 400 seconds + +# step 2: initialize Westend bridge hub +bridge-hub-westend-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-westend-local" within 120 seconds + +# step 3: relay is started elsewhere - let's wait until with-Rococo GRANPDA pallet is initialized at Westend +bridge-hub-westend-collator1: js-script ../helpers/best-finalized-header-at-bridged-chain.js with "Rococo,0" within 400 seconds + +# step 4: send WND to //Alice on Rococo AH +# (that's a required part of a sibling 0001-asset-transfer-works-westend-to-rococo.zndsl test) +asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-westend-local" within 60 seconds + +# step 5: elsewhere Rococo has sent ROC to //Alice - let's wait for it +asset-hub-westend-collator1: js-script ../helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,0,Rococo" within 600 seconds + +# step 6: check that the relayer //Charlie is rewarded by both our AH and target AH +bridge-hub-westend-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x6268726f,BridgedChain,0" within 300 seconds +bridge-hub-westend-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x6268726F,ThisChain,0" within 300 seconds + +# step 7: send wROC back to Alice at Rococo AH +asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-westend-local" within 60 seconds + +# step 8: elsewhere Rococo has sent wWND to //Alice - let's wait for it +# (we wait until //Alice account increases here - there are no other transactionc that may increase it) +asset-hub-westend-collator1: js-script ../helpers/native-assets-balance-increased.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" within 600 seconds + +# wait until other network test has completed OR exit with an error too +asset-hub-westend-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl b/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl new file mode 100644 index 000000000000..2da5b7a772a7 --- /dev/null +++ b/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl @@ -0,0 +1,34 @@ +Description: User is able to transfer WND from Westend Asset Hub to Rococo Asset Hub and back +Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +Creds: config + +# step 1: initialize Rococo AH +asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "init-asset-hub-rococo-local" within 240 seconds +asset-hub-rococo-collator1: js-script ../helpers/wait-hrmp-channel-opened.js with "1013" within 400 seconds + +# step 2: initialize Rococo bridge hub +bridge-hub-rococo-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-rococo-local" within 120 seconds + +# step 3: relay is started elsewhere - let's wait until with-Westend GRANPDA pallet is initialized at Rococo +bridge-hub-rococo-collator1: js-script ../helpers/best-finalized-header-at-bridged-chain.js with "Westend,0" within 400 seconds + +# step 4: send ROC to //Alice on Westend AH +# (that's a required part of a sibling 0001-asset-transfer-works-rococo-to-westend.zndsl test) +asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-rococo-local" within 60 seconds + +# step 5: elsewhere Westend has sent WND to //Alice - let's wait for it +asset-hub-rococo-collator1: js-script ../helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,0,Westend" within 600 seconds + +# step 6: check that the relayer //Charlie is rewarded by both our AH and target AH +bridge-hub-rococo-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x62687764,BridgedChain,0" within 300 seconds +bridge-hub-rococo-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x62687764,ThisChain,0" within 300 seconds + +# step 7: send wWND back to Alice at Westend AH +asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-rococo-local" within 60 seconds + +# step 8: elsewhere Westend has sent wROC to //Alice - let's wait for it +# (we wait until //Alice account increases here - there are no other transactionc that may increase it) +asset-hub-rococo-collator1: js-script ../helpers/native-assets-balance-increased.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" within 600 seconds + +# wait until other network test has completed OR exit with an error too +asset-hub-rococo-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/zombienet/tests/0001-start-relay.sh b/zombienet/tests/0001-start-relay.sh new file mode 100755 index 000000000000..7be2cf4d5938 --- /dev/null +++ b/zombienet/tests/0001-start-relay.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +pushd $POLKADOT_SDK_FOLDER/cumulus/scripts +./bridges_rococo_westend.sh run-relay +popd